Index: /main/tags/2.85/gs2-extensions/audio/trunk/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/audio/trunk/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/audio/trunk/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+source bin/script/test-setup.bash
+source lib/cascade-lib.bash
+
+
+for d in packages ; do
+  echo "Running $d/CASCADE-MAKE.sh $*"
+
+  (cd $d ; ./CASCADE-MAKE.sh $*)
+
+  if [ $? != 0 ] ; then
+    echo "Error encountered running $d/CASCADE-COMPILE.sh"
+    exit 1
+  fi
+done
+
+
Index: /main/tags/2.85/gs2-extensions/audio/trunk/bin/script/test-setup.bash
===================================================================
--- /main/tags/2.85/gs2-extensions/audio/trunk/bin/script/test-setup.bash	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/audio/trunk/bin/script/test-setup.bash	(revision 24799)
@@ -0,0 +1,8 @@
+
+
+if [ "x$GEXTAUDIO" = "x" ] ; then
+  echo "Audio extension environment variable GEXTAUDIO not set."
+  echo "Have you sourced the extension's setup file, e.g. setup.bash?"
+  exit -1
+fi
+
Index: /main/tags/2.85/gs2-extensions/audio/trunk/lib/cascade-lib.bash
===================================================================
--- /main/tags/2.85/gs2-extensions/audio/trunk/lib/cascade-lib.bash	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/audio/trunk/lib/cascade-lib.bash	(revision 24799)
@@ -0,0 +1,181 @@
+
+run_untar()
+{
+  local package=$1
+  local version=$2
+  local ext=$3
+
+  tar_args="";
+
+  if [ $ext = ".tar.gz" ] ; then
+    tar_args="xvzf"
+  elif [ $ext = ".tgz" ] ; then
+    tar_args="xvzf"
+  elif [ $ext = ".tar.bz2" ] ; then
+    tar_args="xvjf"
+  elif [ $ext = ".tar.bz" ] ; then
+    tar_args="xvjf"
+  elif [ $ext = ".tar" ] ; then
+    tar_args="xvf"
+  else 
+    echo "Warning: Unrecognized extension: $ext"
+    echo "Assuming tarred, gzipped file"
+    tar_args="xvjf"
+  fi
+
+
+  echo tar $tar_args $package$version$ext 
+  tar $tar_args $package$version$ext
+
+  if [ $? != 0 ] ; then
+    echo "      Error encountered running *untar* stage of $progname"
+    exit 1
+  fi
+}
+
+opt_run_tarclean()
+{
+  local type=$1
+  local package=$2
+  local version=$3
+
+  if [ $type = "1" ] ; then
+
+    local dir=$package$version
+    if [ -d $dir ] ; then
+      echo /bin/rm -rf $dir
+      /bin/rm -rf $dir
+
+      if [ $? != 0 ] ; then
+        echo "      Error encountered running *tarclean* stage of $progname"
+        exit 1
+      fi
+    else 
+      echo "Unable to find directory $dir"
+    fi
+  fi
+}
+
+opt_run_untar()
+{
+  local force_untar=$1
+  local auto_untar=$2
+  local package=$3
+  local version=$4
+
+  local ext="";
+
+  if [ ! -z "$5" ] ; then
+    ext=$5
+  else 
+    ext=".tar.gz"
+  fi
+
+  if [ $force_untar = "1" ] ; then
+    run_untar $package $version $ext
+  elif [ $auto_config = "1" ] ; then
+    if [ -d $package$version ] ; then
+      echo "Found untarred version of $package$version$ext => no need to untar"
+    else
+      run_untar $package $version $ext
+    fi
+  fi
+}
+
+
+opt_run_configure()
+{
+  local force_config=$1
+  local auto_config=$2
+  local package=$3
+  local version=$4
+  local prefix=$5
+  local opt_args="";
+
+  if [ ! -z "$6" ] ; then
+    opt_args=$6
+  fi
+
+  if [ $force_config = "1" ] ; then
+    ( echo "[pushd $package$version]"
+      cd $package$version ; \
+      echo ./configure --prefix="$prefix" $opt_args ; \
+      ./configure --prefix="$prefix" $opt_args )
+      echo "[popd]"
+    if [ $? != 0 ] ; then
+        echo "      Error encountered running *configure* stage of $progname"
+        exit 1
+    fi
+  else
+    if [ $auto_config = "1" ] ; then
+      echo "Found top-level for ${progname%.*} => no need to run ./configure"
+    fi
+  fi
+}
+
+
+opt_run_make()
+{
+  local type=$1
+  local package=$2
+  local version=$3
+  local opt_target=""
+
+  if [ ! -z "$4" ] ; then
+    opt_target=$4
+  fi
+
+  if [ $type = "1" ] ; then
+    ( cd $package$version ; \
+      make $opt_target)
+
+    if [ $? != 0 ] ; then
+        echo "      Error encountered running *make $target* stage of $progname"
+        exit 1
+    fi
+  fi
+}
+
+
+
+force_untar=0
+auto_untar=0
+
+force_config=0
+auto_config=0
+
+compile=0
+install=0
+clean=0
+distclean=0
+tarclean=0
+
+if [ $# -gt 0 ] ; then
+  for cmd in $* ; do
+    echo $cmd
+    if   [ $cmd = "untar" ] ;     then force_untar=1
+    elif [ $cmd = "configure" ] ; then force_config=1
+    elif [ $cmd = "compile" ]   ; then compile=1
+    elif [ $cmd = "install" ]   ; then install=1  
+    elif [ $cmd = "clean" ]     ; then clean=1  
+    elif [ $cmd = "distclean" ] ; then distclean=1
+    elif [ $cmd = "tarclean" ] ;  then tarclean=1
+    fi
+  done
+else
+  # defaults
+  auto_untar=1
+  auto_config=1
+  compile=1
+  install=1
+  clean=0
+  distclean=0
+  tarclean=0
+fi
+
+if [ $auto_config = "1" ] ; then
+  if [ ! -e $package$version/Makefile ] ; then
+    force_config=1
+  fi
+fi
+
Index: /main/tags/2.85/gs2-extensions/audio/trunk/packages/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/audio/trunk/packages/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/audio/trunk/packages/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+
+for d in LAME LIBMAD SOX ALSA MARSYAS ; do
+  echo "    Running CASCADE-MAKE/$d.sh $*"
+
+  ./CASCADE-MAKE/$d.sh $*
+
+  if [ $? != 0 ] ; then
+    echo "  Error encountered running CASCADE-COMPILE/$d.sh"
+    exit 1
+  fi
+done
Index: /main/tags/2.85/gs2-extensions/audio/trunk/packages/CASCADE-MAKE/ALSA.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/audio/trunk/packages/CASCADE-MAKE/ALSA.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/audio/trunk/packages/CASCADE-MAKE/ALSA.sh	(revision 24799)
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+package=alsa-lib
+version=-1.0.17
+
+progname=$0
+
+source ../bin/script/test-setup.bash
+source ../lib/cascade-lib.bash
+
+prefix=$GEXTAUDIO_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version ".tar.bz2"
+opt_run_configure $force_config $auto_config $package $version "$prefix"
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
+
Index: /main/tags/2.85/gs2-extensions/audio/trunk/packages/CASCADE-MAKE/LAME.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/audio/trunk/packages/CASCADE-MAKE/LAME.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/audio/trunk/packages/CASCADE-MAKE/LAME.sh	(revision 24799)
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+package=lame
+version=-3.97
+
+progname=$0
+
+source ../bin/script/test-setup.bash
+source ../lib/cascade-lib.bash
+
+prefix=$GEXTAUDIO_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version "$prefix"
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
Index: /main/tags/2.85/gs2-extensions/audio/trunk/packages/CASCADE-MAKE/LIBMAD.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/audio/trunk/packages/CASCADE-MAKE/LIBMAD.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/audio/trunk/packages/CASCADE-MAKE/LIBMAD.sh	(revision 24799)
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+package=libmad
+version=-0.15.1b
+
+progname=$0
+
+source ../bin/script/test-setup.bash
+source ../lib/cascade-lib.bash
+
+prefix=$GEXTAUDIO_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version "$prefix"
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
+
+
Index: /main/tags/2.85/gs2-extensions/audio/trunk/packages/CASCADE-MAKE/MARSYAS.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/audio/trunk/packages/CASCADE-MAKE/MARSYAS.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/audio/trunk/packages/CASCADE-MAKE/MARSYAS.sh	(revision 24799)
@@ -0,0 +1,35 @@
+#!/bin/bash
+
+package=marsyas
+version=-0.2.16
+
+progname=$0
+
+source ../bin/script/test-setup.bash
+source ../lib/cascade-lib.bash
+
+prefix=$GEXTAUDIO_INSTALLED
+
+
+opt_run_untar $force_untar $auto_untar $package $version
+
+export CFLAGS="-I$prefix/include"
+
+opt_run_configure $force_config $auto_config $package $version "$prefix" \
+       "--enable-debug \
+        --with-lame --with-mad \
+        CFLAGS=-I$prefix/include \
+        CXXFLAGS=-I$prefix/include \
+        CPPFLAGS=-I$prefix/include \
+        LDFLAGS=-L$prefix/lib"
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/audio/trunk/packages/CASCADE-MAKE/SOX.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/audio/trunk/packages/CASCADE-MAKE/SOX.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/audio/trunk/packages/CASCADE-MAKE/SOX.sh	(revision 24799)
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+package=sox
+version=-14.0.1
+
+progname=$0
+
+source ../bin/script/test-setup.bash
+source ../lib/cascade-lib.bash
+
+prefix=$GEXTAUDIO_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+
+opt_run_configure $force_config $auto_config $package $version "$prefix" \
+        "--with-lame --with-mad \
+        CFLAGS=-I$prefix/include \
+        LDFLAGS=-L$prefix/lib"
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
Index: /main/tags/2.85/gs2-extensions/audio/trunk/perllib/plugins/AudioConverter.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/audio/trunk/perllib/plugins/AudioConverter.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/audio/trunk/perllib/plugins/AudioConverter.pm	(revision 24799)
@@ -0,0 +1,275 @@
+###########################################################################
+#
+# AudioConverter - helper plugin that does audio conversion using sox
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2008 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+package AudioConverter;
+
+use MediaConverter;
+
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+use gsprintf 'gsprintf';
+
+BEGIN {
+    @AudioConverter::ISA = ('MediaConverter');
+}
+
+my $arguments = [
+      { 'name' => "cache_generated_audio",
+	'desc' => "{AudioConverter.cache_generated_audio}",
+	'type' => "flag",
+	'reqd' => "no",
+	'hiddengli' => "yes" # option to delete cache from GLI not yet implemented
+	}
+		 ];
+
+my $options = { 'name' => "AudioConverter",
+		'desc' => "{AudioConverter.desc}",
+		'abstract' => "yes",
+		'inherits' => "yes",
+		'args' => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new MediaConverter($pluginlist, $inputargs, $hashArgOptLists, 1);
+
+
+    return bless $self, $class;
+
+}
+
+# needs to be called after BasePlugin init, so that outhandle is set up.
+sub init {
+    my $self = shift(@_);
+
+    $self->{'tmp_file_paths'} = ();
+
+    # Check that sox is installed and available on the path 
+    my $audio_conversion_available = 1;
+    my $no_audio_conversion_reason = "";
+
+    # Conversion does not work very well on Windows 95/98...
+    # (because of distinction needed between stdout and stderr???)
+
+    if ($ENV{'GSDLOS'} eq "windows" && !Win32::IsWinNT()) {
+	$audio_conversion_available = 0;
+	$no_audio_conversion_reason = "win95notsupported";
+    } else {
+	my $result = `sox -h 2>&1`;
+	if ($? == -1 || $? == 256) {  # Linux and Windows return different values for "program not found"
+	    $audio_conversion_available = 0;
+	    $no_audio_conversion_reason = "soxnotinstalled";
+	}
+    }
+    $self->{'audio_conversion_available'} = $audio_conversion_available;
+    $self->{'no_audio_conversion_reason'} = $no_audio_conversion_reason;
+
+    if ($self->{'audio_conversion_available'} == 0) {
+	my $outhandle = $self->{'outhandle'};
+	&gsprintf($outhandle, "AudioConverter: {AudioConverter.noconversionavailable} ({AudioConverter.".$self->{'no_audio_conversion_reason'}."})\n");
+    }
+}
+	
+
+# convert audio to new type if converttotype is set
+# discover audio metadata
+sub generate_audio {
+    my $self = shift(@_);
+
+    my ($filename_full_path, $filename_no_path, $doc_obj, $section) = @_;
+
+    # check sox status
+    return 0 if $self->{'audio_conversion_available'} == 0;
+    # check the filenames
+    return 0 if ($filename_no_path eq "" || !-f $filename_full_path);
+
+    if ($self->{'cache_generated_audio'}) {
+	$self->init_cache_for_file($filename_full_path);
+    }
+
+    my $verbosity = $self->{'verbosity'};
+    my $outhandle = $self->{'outhandle'};
+
+    
+    my $filehead = $filename_no_path;
+    $filehead =~ s/\.([^\.]*)$//; # filename with no extension
+    my $assocfilemeta = "[assocfilepath]";
+    if ($section ne $doc_obj->get_top_section()) {
+	$assocfilemeta = "[parent(Top):assocfilepath]";
+    }
+
+    # Convert the audio to a new type (if required).
+    my $converttotype = $self->{'converttotype'};
+    my $type = "unknown";
+
+    if ($converttotype ne "" && $filename_full_path !~ m/$converttotype$/) {
+	
+	my ($result,$filename_full_path) 
+	    = $self->convert($filename_full_path, $converttotype, "", "CONVERTTYPE");
+
+	$type = $converttotype;
+	$filename_no_path = "$filehead.$type";
+    }
+
+    # add Audio metadata 
+    $doc_obj->add_metadata($section, "Audio", $filename_no_path);
+
+    # Source and SourceUTF8 - should this be converted filename or original?
+    # here we overwrite the originals with converted ones
+    $self->set_Source_metadata($doc_obj, $filename_no_path);
+
+    # use identify to get info about the (possibly converted) audio
+
+    my ($audio_type, $audio_srate, $audio_quant, $audio_chans, $audio_dur, $audio_samples) 
+	= &identify($filename_full_path, $outhandle, $verbosity);
+
+    if ($audio_type ne " ") {
+	$type = $audio_type;
+    }
+
+    my $file_size = -s $filename_full_path;
+    #overwrite the ones added in BasePlugin
+    $doc_obj->set_metadata_element ($section, "FileFormat", $type);
+    $doc_obj->set_metadata_element ($section, "FileSize",   $file_size);
+
+    $doc_obj->add_metadata ($section, "AudioType",         $audio_type);
+    $doc_obj->add_metadata ($section, "AudioSampleRate",   $audio_srate);
+    $doc_obj->add_metadata ($section, "AudioQuantization", $audio_quant);
+    $doc_obj->add_metadata ($section, "AudioNumChannels",  $audio_chans);
+    $doc_obj->add_metadata ($section, "AudioDuration",     $audio_dur);
+    $doc_obj->add_metadata ($section, "AudioNumSamples",   $audio_samples);
+
+    $doc_obj->add_metadata ($section, "srclink", "<a href=\"_httpprefix_/collect/[collection]/index/assoc/$assocfilemeta/[Audio]\">");
+    $doc_obj->add_metadata ($section, "/srclink", "</a>");
+    $doc_obj->add_metadata ($section, "srcicon", "<img src=\"_httpprefix_/collect/[collection]/index/assoc/$assocfilemeta/_icon${type}_\" width=\"100\">");
+
+    # Add the audio as an associated file
+    $doc_obj->associate_file($filename_full_path, $filename_no_path, "audio/$type", $section);
+
+}
+
+
+
+sub convert {
+    my $self = shift(@_);
+    my $source_file_path = shift(@_);
+    my $target_file_type = shift(@_);
+    my $convert_options  = shift(@_) || "";
+    my $convert_id       = shift(@_) || "";
+
+    my $outhandle = $self->{'outhandle'};
+    my $verbosity = $self->{'verbosity'};
+
+    my $source_file_no_path = &File::Basename::basename($source_file_path);
+
+    # Determine the full name and path of the output file
+    my $target_file_path;
+    if ($self->{'cache_generated_audio'}) {
+	my $cached_audio_dir = $self->{'cached_dir'};
+	my $audio_root = $self->{'cached_file_root'};
+	$audio_root .= "_$convert_id" if ($convert_id ne "");
+	my $audio_file = "$audio_root.$target_file_type";
+	$target_file_path = &util::filename_cat($cached_audio_dir,$audio_file);
+    }
+    else {
+	$target_file_path = &util::get_tmp_filename($target_file_type);
+	push(@{$self->{'tmp_file_paths'}}, $target_file_path);
+    }
+
+    # Generate and run the convert command
+    my $vl = int($verbosity/2);
+
+    my $convert_command = "sox -V$vl --show-progress $convert_options \"$source_file_path\" \"$target_file_path\"";
+
+    my $print_info = { 'message_prefix' => $convert_id,
+		       'message' => "Converting audio $source_file_no_path to: $convert_id $target_file_type" };
+ 
+    my ($regenerated,$result,$had_error) 
+	= $self->autorun_general_cmd($convert_command,$target_file_path,$print_info);
+
+    return ($result,$target_file_path);
+}
+
+
+# Discover the characteristics of an audio file with sox
+# Name 'indentify' relates to original operation written for images using
+# ImageMagick's 'indentify' 
+sub identify { 
+    my ($audio, $outhandle, $verbosity) = @_;
+
+    # Use the 'sox -V3' command to get the file specs
+    my $command = "sox -V3 \"$audio\" 2>&1";
+    print $outhandle "$command\n" if ($verbosity > 2);
+    my $result = '';
+    $result = `$command`;
+    print $outhandle "$result\n" if ($verbosity > 3);
+
+    # Extract useful metadata about audio files
+    ## my $type  = 'unknown';  # ... set this to something related to mime type?
+    ## allow plugin to specify mime-type info?
+
+    my $encod = 'unknown';
+    my $srate = 'unknown';
+    my $qsize = 'unknown';
+    my $chans = 'unknown';
+    my $durat = 'unknown';
+    my $sampl = 'unknown';
+
+    ($encod) = ($result =~ m/Sample Encoding\s*:\s+(.*)$/m);
+    ($srate) = ($result =~ m/Sample Rate\s*:\s+(.*)$/m);
+    ($qsize) = ($result =~ m/Sample Size\s*:\s+(\d+)$/m);
+    ($chans) = ($result =~ m/Channels\s*:\s+(.*)$/m);
+
+    my ($durat_full) = ($result =~ m/Duration\s*:\s+(.*)$/m);
+    ($durat,$sampl) = ($durat_full =~ m/^(.*?)\s+=\s+(\d+)/m);
+
+    print $outhandle "file: $audio:\t $encod, $srate, $qsize, $chans, $durat\n" 
+	if ($verbosity > 2);
+
+    # Return the specs
+    return ($encod, $srate, $qsize, $chans, $durat, $sampl);
+}
+
+### Can this be moved into MediaConverter ???
+
+sub clean_up_temporary_files {
+    my $self = shift(@_);
+
+    foreach my $tmp_file_path (@{$self->{'tmp_file_paths'}}) {
+	if (-e $tmp_file_path) {
+	    &util::rm($tmp_file_path);
+	}
+    }
+   
+}
+
+1;	
Index: /main/tags/2.85/gs2-extensions/audio/trunk/perllib/plugins/AudioPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/audio/trunk/perllib/plugins/AudioPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/audio/trunk/perllib/plugins/AudioPlugin.pm	(revision 24799)
@@ -0,0 +1,162 @@
+###########################################################################
+#
+# AudioPlugin.pm -- Plugin for MP3 files (MPEG audio layer 3).
+#
+# A component of the Greenstone digital library software from the New
+# Zealand Digital Library Project at the University of Waikato, New
+# Zealand.
+#
+# Copyright (C) 2001 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+
+package AudioPlugin;
+
+use BasePlugin;
+use AudioConverter;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+###no strict 'subs';
+
+sub BEGIN {
+    @AudioPlugin::ISA = ('BasePlugin', 'AudioConverter');
+}
+
+my $arguments =
+    [ { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'deft' => &get_default_process_exp(),
+	'reqd' => "no" } ];
+
+my $options = { 'name'     => "AudioPlugin",
+		'desc'     => "{AudioPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    new AudioConverter($pluginlist, $inputargs, $hashArgOptLists);
+    my $self = new BasePlugin($pluginlist, $inputargs, $hashArgOptLists);
+
+    return bless $self, $class;
+}
+
+sub init {
+    my $self = shift (@_);
+    my ($verbosity, $outhandle, $failhandle) = @_;
+
+    $self->SUPER::init(@_);
+    $self->AudioConverter::init();
+}
+
+sub get_default_process_exp 
+{
+    my $self = shift (@_);
+    if (!defined $self->{'stored_process_re'}) {
+
+	my $static_fallback_re = q^(?i)\.(aif?|au|mp3|ogg|snd|wav)$^;
+	
+	if ($self->{'audio_conversion_available'}) {
+	    # Haven't run sox before to see what formats it supports
+	    # => do so now
+	    
+	    my $sox_output = `sox -h`;
+	    my ($output_list) = ($sox_output =~ m/SUPPORTED FILE FORMATS:\s*(.*)$/m);
+	    if (defined $output_list && ($output_list ne "")) {
+		$output_list =~ s/\s+/,/g;
+
+		$self->{'stored_process_re'} = $output_list;
+	    }
+	    else {
+		$self->{'stored_process_re'} = $static_fallback_re;
+	    }
+	}
+	else {
+	    # Audio format conversion isn't supported, but (as for images)
+	    # source format might very well be OK for inclusion in web
+	    # page produced for document 
+	    
+	    $self->{'stored_process_re'} = $static_fallback_re;
+	}
+    }
+
+    print STDERR "*** returning: $self->{'stored_process_re'}\n";
+
+    return $self->{'stored_process_re'};
+	
+}
+
+
+
+# do plugin specific processing of doc_obj
+sub process {
+    my $self = shift (@_);
+    # options??
+    my ($pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+
+
+    my $outhandle = $self->{'outhandle'};
+    my ($filename_full_path, $filename_no_path) = &util::get_full_filenames($base_dir, $file);
+
+    my $top_section = $doc_obj->get_top_section();
+
+    if ($self->{'audio_conversion_available'} == 1) {
+	$self->generate_audio($filename_full_path, $filename_no_path, $doc_obj, $top_section); # should we check the return value?
+    } else {
+	# do some basic stuff
+	# associate the audio, fileformat, mimetype, srclink, srcicon
+	# do this if sox not installed. but also if generate hasn't worked??
+    }
+    #we have no text - adds dummy text and NoText metadata
+    $self->add_dummy_text($doc_obj, $top_section);
+
+
+    # *****
+    # Does the code currently associate the original file with document?
+    # How about it's MIME type.  This might be a bit tricky to work out
+    # for a dynamically generated list
+
+    return 1;
+
+}
+
+
+
+
+
+1;
+
+
+
+
+
+
+
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/audio/trunk/perllib/strings.property
===================================================================
--- /main/tags/2.85/gs2-extensions/audio/trunk/perllib/strings.property	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/audio/trunk/perllib/strings.property	(revision 24799)
@@ -0,0 +1,14 @@
+
+AudioConverter.cache_generated_audio:Cache converted audio so it doesn't need to be repeatedly generated.
+
+AudioConverter.converttotype:Convert main audio to format 's'.
+
+AudioConverter.desc:Helper plugin for audio conversion using SOund eXchanger (SOX)
+
+AudioConverter.soxnotinstalled: SOund eXchanger (SOX) not installed
+
+AudioConverter.noconversionavailable:Audi conversion not available
+
+AudioConverter.win95notsupported: SOund eXchanger (SOX) not supported on Win95/98
+
+AudioPlugin.desc:This plugin processes audio, adding basic metadata
Index: /main/tags/2.85/gs2-extensions/audio/trunk/setup.bash
===================================================================
--- /main/tags/2.85/gs2-extensions/audio/trunk/setup.bash	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/audio/trunk/setup.bash	(revision 24799)
@@ -0,0 +1,28 @@
+
+extdesc="the Audio Analysis Extension"
+
+if [ "x$GEXTAUDIO" = "x" ] ; then
+  export GEXTAUDIO=`pwd`
+  export GEXTAUDIO_INSTALLED=$GEXTAUDIO/installed
+
+  export PATH=$GEXTAUDIO_INSTALLED/bin:$PATH
+
+  if [ "x$LD_LIBRARY_PATH" = "x" ] ; then
+    export LD_LIBRARY_PATH=$GEXTAUDIO_INSTALLED/lib
+  else
+    export LD_LIBRARY_PATH=$GEXTAUDIO_INSTALLED/lib:$LD_LIBRARY_PATH
+  fi
+
+  if [ "x$GSDLEXTS" = "x" ] ; then
+    export GSDLEXTS=audio
+  else 
+    export GSDLEXTS=$GSDLEXTS:audio
+  fi
+
+
+  echo "+Your environment is now setup for $extdesc to Greenstone"
+else
+  echo "+Your environment is already setup for $extdesc to Greenstone"
+fi
+
+
Index: /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+source devel.bash
+
+for d in packages ; do
+    echo "Running $d/CASCADE-MAKE.sh"
+
+    (cd $d ; ./CASCADE-MAKE.sh $*)
+
+    if [ $? != 0 ] ; then
+	echo "Error encountered running $d/CASCADE-MAKE.sh"
+	exit 1
+    fi
+done
+
+if [ $makedist = "1"  ] ; then
+  default_toplevel_make_dist $GSDLOS devel.bash
+fi
Index: /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/devel.bash
===================================================================
--- /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/devel.bash	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/devel.bash	(revision 24799)
@@ -0,0 +1,50 @@
+#!/bin/bash
+
+if [ -d cascade-make ] ; then
+  source cascade-make/lib/cascade-lib.bash GEXTGNOME . $*
+fi
+
+if [ -z $GEXTGNOME ] ; then
+  source setup.bash
+fi
+
+if [ -z $GEXTGNOME_DEVEL ] ; then
+	# Set environment variable so we can tell devel.bash has been sourced
+	export GEXTGNOME_DEVEL=$GEXTGNOME
+	
+	export PATH="$GEXTGNOME_INSTALLED/bin:$PATH"
+	export CFLAGS="-I$GEXTGNOME_INSTALLED/include $CFLAGS"
+	export CPPFLAGS="-I$GEXTGNOME_INSTALLED/include $CPPFLAGS"
+	export CXXFLAGS="-I$GEXTGNOME_INSTALLED/include $CXXFLAGS"
+	export LDFLAGS="-L$GEXTGNOME_INSTALLED/lib $LDFLAGS"
+	export PKG_CONFIG_PATH="$GEXTGNOME_INSTALLED/lib/pkgconfig:$PKG_CONFIG_PATH"
+	
+	echo "+Your environment is now setup to compile with the GNOME Support Library"
+
+	if [ -d "$GEXTGNOME_INSTALLED/lib/pkgconfig" ] ; then
+  	    echo ""
+        echo "+Testing that pkg-config is correctly configured..."
+
+	    pushd $GEXTGNOME_INSTALLED/lib/pkgconfig
+
+  	    if [ ! -e .fixed-prefix.awk ] ; then
+
+		    echo "Configuring ..."
+
+            echo "/^prefix=/ { print \"prefix=$GEXTGNOME_INSTALLED\" ; next }" > .fixed-prefix.awk 
+		    echo "	{ print \$0 }" >> .fixed-prefix.awk
+
+		    for file in *.pc ; do
+		        cat $file | awk -f .fixed-prefix.awk > $file.new && \
+	              /bin/mv $file.new $file
+   		    done
+		    echo "... done"
+        else
+            echo "No configuration needed"
+        fi
+
+	    popd
+    fi
+else
+	echo "+Your environment is already setup to compile with the GNOME Support Library"
+fi
Index: /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+source ../cascade-make/lib/cascade-lib.bash GEXTGNOME .. $*
+
+for d in LIBZ LIBBZ2 EXPAT LIBPNG READLINE XMLPARSER INTLTOOL GETTEXT PKG-CONFIG LIBXML GLIB LIBGSF; do
+    echo "    Running CASCADE-MAKE/$d.sh"
+
+    ./CASCADE-MAKE/$d.sh $*
+
+    if [ $? != 0 ] ; then
+	echo "Error encountered running CASCADE-MAKE/$d.sh"
+	exit 1
+    fi
+done
+
+if [ $install = "1" ] ; then
+  touch "$GEXTGNOME_INSTALLED/lib/pkgconfig/.fixed-prefix.awk"
+fi
+
+if [ $makedist = "1" ] ; then
+  rm -f "$GEXTGNOME_INSTALLED/lib/pkgconfig/.fixed-prefix.awk"
+  lalist=`find $GEXTGNOME_INSTALLED/lib -name "*.la"`
+  if [ -n "$lalist" ] ; then
+    rm -f $lalist
+  fi
+fi
Index: /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE/EXPAT.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE/EXPAT.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE/EXPAT.sh	(revision 24799)
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+package=expat
+version=-2.0.1
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTGNOME ../.. $*
+
+prefix=$GEXTGNOME_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile $package $version
+opt_run_make $install $package $version "install"
+opt_run_make $clean $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
Index: /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE/GETTEXT.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE/GETTEXT.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE/GETTEXT.sh	(revision 24799)
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+package=gettext
+version=-0.18.1.1
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTGNOME ../.. $*
+
+prefix=$GEXTGNOME_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile $package $version
+opt_run_make $install $package $version "install"
+opt_run_make $clean $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
Index: /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE/GLIB.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE/GLIB.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE/GLIB.sh	(revision 24799)
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+package=glib
+version=-2.24.2
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTGNOME ../.. $*
+
+prefix=$GEXTGNOME_INSTALLED
+
+export CFLAGS="$CFLAGS -I$GEXTGNOME_INSTALLED/include"
+export CPPFLAGS="$CPPFLAGS -I$GEXTGNOME_INSTALLED/include"
+export CXXFLAGS="$CXXFLAGS -I$GEXTGNOME_INSTALLED/include"
+export LDFLAGS="$LDFLAGS -L$GEXTGNOME_INSTALLED/lib"
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile $package $version
+opt_run_make $install $package $version "install"
+opt_run_make $clean $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
Index: /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE/INTLTOOL.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE/INTLTOOL.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE/INTLTOOL.sh	(revision 24799)
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+package=intltool
+version=-0.40.6
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTGNOME ../.. $*
+
+prefix=$GEXTGNOME_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+
+PARSERPATH=`find $prefix -name "Parser.pm"`
+PARSERDIR=`dirname $PARSERPATH`
+export PERL5LIB=`dirname $PARSERDIR`
+
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile $package $version
+opt_run_make $install $package $version "install"
+opt_run_make $clean $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
Index: /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE/LIBBZ2.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE/LIBBZ2.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE/LIBBZ2.sh	(revision 24799)
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+package=bzip2
+version=-1.0.6
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTGNOME ../.. $*
+
+prefix=$GEXTGNOME_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+
+if [ $compile = 1 ] ; then
+    (cd $package$version ; make CFLAGS="$CFLAGS -fPIC")
+fi
+
+if [ $install = 1 ] ; then
+    (cd $package$version ; make install PREFIX=$prefix) 
+fi
+
+opt_run_make $clean $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
Index: /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE/LIBGSF.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE/LIBGSF.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE/LIBGSF.sh	(revision 24799)
@@ -0,0 +1,30 @@
+#!/bin/bash
+
+package=libgsf
+version=-1.14.18
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTGNOME ../.. $*
+
+prefix=$GEXTGNOME_INSTALLED
+
+export CFLAGS="$CFLAGS -I$GEXTGNOME_INSTALLED/include"
+export CPPFLAGS="$CPPFLAGS -I$GEXTGNOME_INSTALLED/include"
+export CXXFLAGS="$CXXFLAGS -I$GEXTGNOME_INSTALLED/include"
+export LDFLAGS="$LDFLAGS -L$GEXTGNOME_INSTALLED/lib"
+
+opt_run_untar $force_untar $auto_untar $package $version
+
+PARSERPATH=`find $prefix -name "Parser.pm"`
+PARSERDIR=`dirname $PARSERPATH`
+export PERL5LIB=`dirname $PARSERDIR`
+
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile $package $version
+opt_run_make $install $package $version "install"
+opt_run_make $clean $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
Index: /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE/LIBPNG.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE/LIBPNG.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE/LIBPNG.sh	(revision 24799)
@@ -0,0 +1,31 @@
+#!/bin/bash
+
+package=libpng
+version=-1.5.0
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTGNOME ../.. $*
+
+prefix=$GEXTGNOME_INSTALLED
+
+export CFLAGS="$CFLAGS -I$GEXTGNOME_INSTALLED/include"
+export CPPFLAGS="$CPPFLAGS -I$GEXTGNOME_INSTALLED/include"
+export CXXFLAGS="$CXXFLAGS -I$GEXTGNOME_INSTALLED/include"
+export LDFLAGS="$LDFLAGS -L$GEXTGNOME_INSTALLED/lib"
+
+echo GSDLOS = $GSDLOS
+
+if [ $GSDLOS != "darwin" ] ; then
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile $package $version
+opt_run_make $install $package $version "install"
+opt_run_make $clean $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
+fi
Index: /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE/LIBXML.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE/LIBXML.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE/LIBXML.sh	(revision 24799)
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+package=libxml2
+version=-2.7.7
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTGNOME ../.. $*
+
+prefix=$GEXTGNOME_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile $package $version
+opt_run_make $install $package $version "install"
+opt_run_make $clean $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
Index: /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE/LIBZ.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE/LIBZ.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE/LIBZ.sh	(revision 24799)
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+package=zlib
+version=-1.2.5
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTGNOME ../.. $*
+
+prefix=$GEXTGNOME_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile $package $version
+opt_run_make $install $package $version "install"
+opt_run_make $clean $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
Index: /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE/PKG-CONFIG.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE/PKG-CONFIG.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE/PKG-CONFIG.sh	(revision 24799)
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+package=pkg-config
+version=-0.25
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTGNOME ../.. $*
+
+prefix=$GEXTGNOME_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile $package $version
+opt_run_make $install $package $version "install"
+opt_run_make $clean $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
Index: /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE/READLINE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE/READLINE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE/READLINE.sh	(revision 24799)
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+package=readline
+version=-6.1
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTGNOME ../.. $*
+
+prefix=$GEXTGNOME_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile $package $version
+opt_run_make $install $package $version "install"
+opt_run_make $clean $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
Index: /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE/XMLPARSER.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE/XMLPARSER.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/packages/CASCADE-MAKE/XMLPARSER.sh	(revision 24799)
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+package=XML-Parser
+version=-2.40
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTGNOME ../.. $*
+
+prefix=$GEXTGNOME_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+
+if [ $force_config = 1 ] ; then
+	( cd $package$version ; perl Makefile.PL PREFIX=$prefix EXPATINCPATH=$prefix/include EXPATLIBPATH=$prefix/lib )
+fi
+
+opt_run_make $compile $package $version
+opt_run_make $install $package $version "install"
+opt_run_make $clean $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
Index: /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/setup.bash_old
===================================================================
--- /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/setup.bash_old	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/setup.bash_old	(revision 24799)
@@ -0,0 +1,52 @@
+extdesc="the GNOME support library extension"
+
+full_setup=`pwd`/${BASH_SOURCE}
+fulldir=${full_setup%/*}
+fulldir=${fulldir%/.}
+
+if [ "x$GSDLHOME" = "x" ] ; then
+  if [ -e ../../setup.bash ] ; then
+    export gsopt_noexts=1 && pushd ../.. && source setup.bash && popd 
+    export gsopt_noexts=
+  elif [ -e ../../gs3-setup.sh ] ; then
+    export gsopt_noexts=1 && pushd ../.. && source gs3-setup.sh && popd 
+    export gsopt_noexts=
+  fi
+fi
+
+if [ "x$GEXTGNOME" = "x" ] ; then
+  export GEXTGNOME=$fulldir
+  export GEXTGNOME_INSTALLED=$GEXTGNOME/$GSDLOS
+
+  export PATH=$GEXTGNOME_INSTALLED/bin:$PATH
+
+  if [ "x$LD_LIBRARY_PATH" = "x" ] ; then
+    export LD_LIBRARY_PATH=$GEXTGNOME_INSTALLED/lib
+  else
+    export LD_LIBRARY_PATH=$GEXTGNOME_INSTALLED/lib:$LD_LIBRARY_PATH
+  fi
+  if [ "x$DYLD_LIBRARY_PATH" = "x" ] ; then
+    export DYLD_LIBRARY_PATH=$GEXTGNOME_INSTALLED/lib
+  else
+    export DYLD_LIBRARY_PATH=$GEXTGNOME_INSTALLED/lib:$DYLD_LIBRARY_PATH
+  fi
+
+  if [ -e "devel-srcpack" ] ; then
+    export LD_LIBRARY_PATH=$GEXTGNOME_INSTALLED/devel/lib:$LD_LIBRARY_PATH
+    export DYLD_LIBRARY_PATH=$GEXTGNOME_INSTALLED/devel/lib:$DYLD_LIBRARY_PATH
+  fi
+
+  
+  extdir=${GEXTGNOME##*/}
+
+  if [ "x$GSDLEXTS" = "x" ] ; then
+    export GSDLEXTS=$extdir
+  else 
+    export GSDLEXTS=$GSDLEXTS:$extdir
+  fi
+
+
+  echo "+Your environment is now setup for $extdesc"
+else
+  echo "+Your environment is already setup for $extdesc"
+fi
Index: /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/setup.bat_old
===================================================================
--- /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/setup.bat_old	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/gnome-lib/trunk/src/setup.bat_old	(revision 24799)
@@ -0,0 +1,57 @@
+@echo off
+pushd "%CD%"
+CD /D "%~dp0"
+set GSDLLANG=en
+set extdesc="the GNOME support library"
+
+if "%OS%" == "Windows_NT" goto WinNT
+if "%OS%" == "" goto Win95
+if "%GSDLLANG%" == "en" echo Setup failed - your PATH has not been set
+if "%GSDLLANG%" == "es" echo No se pudo realizar la configuraci¢n - no se ha establecido la RUTA.
+if "%GSDLLANG%" == "fr" echo Echc de l'installation - votre variable PATH n'a pas t ajuste
+if "%GSDLLANG%" == "ru" echo áâ ­®¢ª  ­¥ ã€ « áì -  ­¥ ¡ë« ãáâ ­®¢«¥­
+goto End
+
+:WinNT
+set GEXTGNOME=%CD%
+set GEXTGNOME_INSTALLED=%GEXTGNOME%\windows
+
+set PATH=%GEXTGNOME_INSTALLED%\bin;%PATH%
+set GS_CP_SET=yes
+goto Success
+
+:Win95
+if "%1" == "SetEnv" goto Win95Env
+REM We'll invoke a second copy of the command processor to make
+REM sure there's enough environment space
+COMMAND /E:2048 /K %0 SetEnv
+goto End
+
+:Win95Env
+set GEXTGNOME=%CD%
+set PATH="%GEXTGNOME_INSTALLED%\bin";"%PATH%"
+set GS_CP_SET=yes
+goto Success
+
+:Success
+
+set fulldir=%~dp0
+
+:: strip off everything up to (and including) ext dir
+set extdir=%fulldir:*ext\=%
+
+:: remove trailing slash
+set extdir=%extdir:\=%
+
+
+if "x%GSDLEXTS%" == "x" (
+  set GSDLEXTS=%extdir%
+) else (
+  set GSDLEXTS=%GSDLEXTS%:%extdir%
+)
+
+echo +Your environment is now setup for %extdesc%
+
+:End
+
+popd
Index: /main/tags/2.85/gs2-extensions/gsdl-amp/trunk/src/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/gsdl-amp/trunk/src/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/gsdl-amp/trunk/src/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+source devel.bash
+
+for d in packages ; do
+  echo "Running $d/CASCADE-MAKE.sh"
+
+  (cd $d ; ./CASCADE-MAKE.sh $*)
+
+  if [ $? != 0 ] ; then
+    echo "Error encountered running $d/CASCADE-MAKE.sh"
+    exit 1
+  fi
+done
+
+if [ $makedist = "1" ] ; then
+  default_toplevel_make_dist $GSDLOS
+fi
Index: /main/tags/2.85/gs2-extensions/gsdl-amp/trunk/src/build.xml
===================================================================
--- /main/tags/2.85/gs2-extensions/gsdl-amp/trunk/src/build.xml	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/gsdl-amp/trunk/src/build.xml	(revision 24799)
@@ -0,0 +1,19 @@
+<project name="amp" basedir="." default="install">
+  <property environment="env"/>
+  <property name="installdir" value="${basedir}/installed/linux"/>
+  
+  <target name="install">
+    <exec executable="/bin/bash">
+      <arg value="-c"/>
+      <arg value="source setup.bash ; ./CASCADE-MAKE.sh"/>
+    </exec>
+  </target>
+
+  <target name="uninstall">
+    <exec executable="/bin/bash">
+      <arg value="-c"/>
+      <arg value="./CASCADE-MAKE.sh distclean"/>
+    </exec>
+    <delete dir="${installdir}"/>
+  </target>
+</project>
Index: /main/tags/2.85/gs2-extensions/gsdl-amp/trunk/src/devel.bash
===================================================================
--- /main/tags/2.85/gs2-extensions/gsdl-amp/trunk/src/devel.bash	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/gsdl-amp/trunk/src/devel.bash	(revision 24799)
@@ -0,0 +1,1 @@
+source cascade-make/lib/cascade-lib.bash GEXTAMP . $*
Index: /main/tags/2.85/gs2-extensions/gsdl-amp/trunk/src/packages/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/gsdl-amp/trunk/src/packages/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/gsdl-amp/trunk/src/packages/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,19 @@
+#!/bin/bash
+
+list=
+if [ "x$COMPILE_UP_MYSQL" = "x1" ] ; then
+  list="MYSQL LIBPNG APACHE PHP"
+else  
+  list="LIBPNG APACHE PHP"
+fi
+
+for d in $list ; do
+  echo "    Running CASCADE-MAKE/$d.sh $*"
+
+  ./CASCADE-MAKE/$d.sh $*
+
+  if [ $? != 0 ] ; then
+    echo "  Error encountered running CASCADE-MAKE/$d.sh"
+    exit 1
+  fi
+done
Index: /main/tags/2.85/gs2-extensions/gsdl-amp/trunk/src/packages/CASCADE-MAKE/APACHE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/gsdl-amp/trunk/src/packages/CASCADE-MAKE/APACHE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/gsdl-amp/trunk/src/packages/CASCADE-MAKE/APACHE.sh	(revision 24799)
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+package=httpd
+version=-2.2.15
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTAMP ../.. $*
+
+prefix=$GEXTAMP_INSTALLED
+
+if [ "$COMPILE_UP_APACHE_HTTPD" = "1" ] ; then
+  opt_run_untar $force_untar $auto_untar $package $version
+  opt_run_configure $force_config $auto_config $package $version $prefix --with-layout=Apache --enable-so
+
+  opt_run_make $compile   $package $version
+  opt_run_make $install   $package $version "install"
+  opt_run_make $clean     $package $version "clean"
+  opt_run_make $distclean $package $version "distclean"
+
+  opt_run_tarclean $tarclean $package $version
+else
+  echo "Using Apache HTTPD that is provided externally to the extension at:"
+  echo "  $APACHE_HTTPD_HOME"
+  echo ""
+fi
Index: /main/tags/2.85/gs2-extensions/gsdl-amp/trunk/src/packages/CASCADE-MAKE/LIBPNG.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/gsdl-amp/trunk/src/packages/CASCADE-MAKE/LIBPNG.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/gsdl-amp/trunk/src/packages/CASCADE-MAKE/LIBPNG.sh	(revision 24799)
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+package=libpng
+version=-1.2.29
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTAMP ../.. $*
+
+prefix=$GEXTAMP_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/gsdl-amp/trunk/src/packages/CASCADE-MAKE/MYSQL.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/gsdl-amp/trunk/src/packages/CASCADE-MAKE/MYSQL.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/gsdl-amp/trunk/src/packages/CASCADE-MAKE/MYSQL.sh	(revision 24799)
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+package=mysql
+version=-5.1.47
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTAMP ../.. $*
+
+prefix=$GEXTAMP_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version $prefix --exec-prefix=$prefix
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/gsdl-amp/trunk/src/packages/CASCADE-MAKE/PHP.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/gsdl-amp/trunk/src/packages/CASCADE-MAKE/PHP.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/gsdl-amp/trunk/src/packages/CASCADE-MAKE/PHP.sh	(revision 24799)
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+package=php
+version=-5.3.2
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTAMP ../.. $*
+
+prefix=$GEXTAMP_INSTALLED
+mysqlprefix=
+if [ "x$COMPILE_UP_MYSQL" = "x1" ] ; then
+  mysqlprefix=$GEXTAMP_INSTALLED
+else
+  if [ -n "$GEXTMYSQL_INSTALLED" ] ; then
+    mysqlprefix=$GEXTMYSQL_INSTALLED
+  fi
+fi
+
+opt_run_untar $force_untar $auto_untar $package $version
+
+opt_run_configure $force_config $auto_config $package $version $prefix --with-mysql=$mysqlprefix --with-png-dir=$prefix --with-apxs2=$prefix/bin/apxs --with-gd
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
Index: /main/tags/2.85/gs2-extensions/gsdl-amp/trunk/src/setup.bash
===================================================================
--- /main/tags/2.85/gs2-extensions/gsdl-amp/trunk/src/setup.bash	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/gsdl-amp/trunk/src/setup.bash	(revision 24799)
@@ -0,0 +1,60 @@
+
+extdesc="the Apache-MySql-Php (AMP) Extension"
+
+full_setup=`pwd`/${BASH_SOURCE}
+fulldir=${full_setup%/*}
+fulldir=${fulldir%/.}
+
+if [ "x$GSDLHOME" = "x" ] ; then
+  if [ -e ../../setup.bash ] ; then
+    export gsopt_noexts=1 && pushd ../.. && source setup.bash && popd
+    export gsopt_noexts=
+  fi
+fi
+
+if [ "x$GEXTAMP" = "x" ] ; then
+  export GEXTAMP=$fulldir
+  export GEXTAMP_INSTALLED=$GEXTAMP/$GSDLOS
+
+  export PATH=$GEXTAMP_INSTALLED/bin:$PATH
+
+  if [ "x$LD_LIBRARY_PATH" = "x" ] ; then
+    export LD_LIBRARY_PATH=$GEXTAMP_INSTALLED/lib
+  else
+    export LD_LIBRARY_PATH=$GEXTAMP_INSTALLED/lib:$LD_LIBRARY_PATH
+  fi
+
+  export APACHE_HTTPD_HOME="$GEXTAMP_INSTALLED";
+  export COMPILE_UP_APACHE_HTTPD=1
+
+  if [ -n "$GSDLHOME" ] ; then
+      # see if there is already an apache httpd we can use
+      # override default values if there is
+      if [ -e "$GSDLHOME/apache-httpd/$GSDLOS" ] ; then
+	  export APACHE_HTTPD_HOME="$GSDLHOME/apache-httpd/$GSDLOS";
+	  export COMPILE_UP_APACHE_HTTPD=0
+      fi
+  fi
+  
+  export COMPILE_UP_MYSQL=1
+  if [ -n "$GEXTMYSQL" ] ; then
+    if [ -e "$GEXTMYSQL/$GSDLOS" ] ; then
+      export COMPILE_UP_MYSQL=0     
+      source $GEXTMYSQL/setup.bash
+    fi
+  fi
+
+  extdir=${GEXTAMP##*/}
+
+  if [ "x$GSDLEXTS" = "x" ] ; then
+    export GSDLEXTS=$extdir
+  else 
+    export GSDLEXTS=$GSDLEXTS:$extdir
+  fi
+
+  echo "+Your environment is now setup for $extdesc to Greenstone"
+else
+  echo "+Your environment is already setup for $extdesc to Greenstone"
+fi
+
+
Index: /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/AppDefs.h
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/AppDefs.h	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/AppDefs.h	(revision 24799)
@@ -0,0 +1,29 @@
+
+#define TOP_NAVBAR_HEIGHT 45.0f
+#define BOT_NAVBAR_HEIGHT 40.0f
+
+enum UIButtonBarStyle 
+{
+  barstyleBlue = 0, barstyleBlack = 1, barstyleTransparent=2
+};
+
+
+typedef enum
+{
+  UITransitionNothing = 0,
+  UITransitionBothShiftLeft = 1,
+  UITransitionBothShiftRight = 2,
+  UITransitionBothShiftUp = 3,
+  UITransitionError4 = 4,
+  UITransitionCurrentShiftDown = 5,
+  UITransitionError6 = 6,
+  UITransitionBothShiftDown = 7,
+  UITransitionNextShiftUp = 8,
+  UITransitionNextShiftDown = 9
+} UITransitionStyle;
+
+enum GSButtonBarEnum
+{
+  GSBBBrowse=1, GSBBQuery=2, GSBBPref=3
+};
+
Index: /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/BrowseCascadeView.h
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/BrowseCascadeView.h	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/BrowseCascadeView.h	(revision 24799)
@@ -0,0 +1,22 @@
+
+#import "Foundation/NSTimer.h"
+#import "MenuCascadeView.h"
+
+@interface BrowseCascadeView: MenuCascadeView 
+{}
+
+-(UIView*) directEntry:(int)rowId;
+
+-(void) browseListToMenuItems:(NSMutableArray*)browseList withCollection:(NSString*)collection withGID:(NSString*)gid;
+
+-(void) createChildMenu:(NSString*)collection withTitle:(NSString*)title withGID:(NSString*)gid 
+           withBrowseList:(NSMutableArray*) browseList;
+
+-(void) tableRowSelected:(NSNotification*)notification;
+
+-(void) asynchronousLoad:(NSTimer*)timer;
+
+-(void) navigationBar:(UINavigationBar*)navbar buttonClicked:(int)button;
+
+
+@end
Index: /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/BrowseCascadeView.mm
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/BrowseCascadeView.mm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/BrowseCascadeView.mm	(revision 24799)
@@ -0,0 +1,207 @@
+
+#import <Foundation/Foundation.h>
+
+#import <UIKit/UIKit.h>
+#import <UIKit/UITable.h>
+#import <UIKit/UIProgressIndicator.h>
+
+#import "GreenstoneApplication.h"
+#import "SimpleWebView.h"
+#import "GSResultItem.h"
+
+#import "BrowseCascadeView.h"
+
+// ***** think about coding for orientation of iPod!!!!
+
+@implementation BrowseCascadeView
+
+
+-(UIView*) directEntry:(int)rowId
+{
+  return self;
+}
+
+
+-(void) browseListToMenuItems:(NSMutableArray*)browseList withCollection:(NSString*)collection withGID:(NSString*)gid
+{  
+  GreenstoneAPI* greenstoneAPI = [GreenstoneApplication greenstoneAPI];
+
+  NSEnumerator* browselist_enumerator = [browseList objectEnumerator];
+  NSString* childname;
+  while (childname = [browselist_enumerator nextObject]) {
+    NSString* childGID = [NSString alloc];
+
+    if (gid==nil) {
+      childGID = [childGID initWithString:childname];
+    }
+    else if ([childname hasPrefix:@"."]==NO) {
+      childGID = [childGID initWithString:childname];
+    }
+    else {
+      childGID = [childGID initWithFormat:@"%@%@",gid,childname]; 
+    }
+
+    GreenstoneApplication* toplevelApp = [GreenstoneApplication toplevelApp];
+    NSString* lang = [toplevelApp languagePref];
+    //greenstoneAPI->setLanguage(lang); // *****
+    greenstoneAPI->setLanguage("en"); 
+
+    // look up Title metadata for child's GID, and use that to display on menu
+    NSString* textTitle = nil;
+    if ([childGID hasPrefix:@"CL"]==YES) {
+      textTitle = greenstoneAPI->getMetadataFirst(collection,childGID,@"Title");
+    }
+    else {
+      // Try for dc.Title first as generally better quality than ex.Title
+      textTitle = greenstoneAPI->getMetadataFirst(collection,childGID,@"dc.Title");
+      if (textTitle == nil) {
+	textTitle = greenstoneAPI->getMetadataFirst(collection,childGID,@"Title");
+      }
+    }
+
+    [(BrowseCascadeView*)_childMenu appendMenuItem:self withItem:textTitle withGID:childGID];      
+
+  }
+}
+
+-(void) createChildMenu:(NSString*)collection withTitle:(NSString*)title withGID:(NSString*)gid 
+            withBrowseList:(NSMutableArray*) browseList
+{
+  CGRect rect = [GreenstoneApplication workAreaRect];  
+
+  // The following check isn't strictly necessary, if _childMenu is released and set to nil
+  // when you transition back to the parent
+  if (_childMenu != nil) {
+    // [_childMenu release];  // *****
+  }
+
+  _childMenu = [BrowseCascadeView alloc];
+  _childMenu = [(BrowseCascadeView*)_childMenu initWithFrame:rect withParent:self withCollection:collection withTitle:title withGID:gid]; 
+
+  [self browseListToMenuItems:browseList withCollection:collection withGID:gid];
+}
+
+
+
+-(void) tableRowSelected:(NSNotification*)notification
+{
+  UITable* table = [notification object];
+  int rowId = [table selectedRow];
+
+  UITableCell* cell = [table cellAtRow:rowId column:0];
+  [cell setSelected:FALSE withFade:TRUE];
+
+  GreenstoneAPI* greenstoneAPI = [GreenstoneApplication greenstoneAPI];
+  NSString* childTitle = [[_oidItem objectAtIndex:rowId] title];
+  int transStyle = UITransitionBothShiftLeft;
+
+  GreenstoneApplication* toplevelApp = [GreenstoneApplication toplevelApp];
+  NSString* lang = [toplevelApp languagePref];
+  //greenstoneAPI->setLanguage(lang); // ***** make it a param (with default) to calling fns
+  greenstoneAPI->setLanguage("en");
+
+  // Initialise with child menu
+
+  if (_collection == nil) {
+    // Root node to Browse Greenstone collections
+    NSString* childGID = [[_oidItem  objectAtIndex:rowId] oid]; 
+
+    NSString* chosenCollection = [[NSString alloc] initWithString:childGID];
+
+    NSMutableArray* classifierList = greenstoneAPI->browseToplevelList(chosenCollection);
+    [self createChildMenu:chosenCollection withTitle:childTitle withGID:nil withBrowseList:classifierList];
+    [classifierList release]; 
+
+    [GreenstoneApplication setInCollection:chosenCollection];
+    [GreenstoneApplication transitionView:transStyle fromView:self toView:_childMenu];
+  }
+  else {
+    NSString* childGID = [[_oidItem  objectAtIndex:rowId] oid]; 
+
+    if ([childGID hasPrefix:@"CL"]==YES) {
+      // Note this test is potentially flawed if a document ID starts CL...
+      // Allow this for now, since default is for it to be HASH 
+
+      NSMutableArray* classifierList = greenstoneAPI->browseClassifierList(_collection,childGID);
+
+      NSString* chosenCollection = [[NSString alloc] initWithString:_collection];
+      [self createChildMenu:chosenCollection withTitle:childTitle withGID:childGID withBrowseList:classifierList];
+      [classifierList release]; 
+
+      [GreenstoneApplication transitionView:transStyle fromView:self toView:_childMenu];
+    }
+    else {
+      NSString* childGID = [[_oidItem  objectAtIndex:rowId] oid]; 
+
+      NSString* srcurl = greenstoneAPI->getSrcUrlMetadata(_collection,childGID);
+      NSURL* url = [NSURL alloc];
+
+      if (srcurl == nil) {
+
+	NSTimer *timer = [ NSTimer scheduledTimerWithTimeInterval: 1.0 // used to be 0.3, then 0.5
+			 target: self
+			 selector: @selector(asynchronousLoad:)
+			 userInfo: childGID
+			 repeats: NO ];
+
+	url = [url initWithString:@"file:///var/gsdl/loading.html"]; // **** make it use proper gsdlhome
+
+      }
+      else {
+	NSString* fullurlstr = [[NSString alloc] initWithFormat:@"file://%@",srcurl];
+	url = [url initWithString:fullurlstr];
+
+	NSLog(@"** opening src URL= %@",fullurlstr);
+
+      }
+      [GreenstoneApplication showWebView:transStyle fromView:self withURL:url];
+
+    }
+  }
+}
+
+
+
+
+-(void) asynchronousLoad:(NSTimer*)timer
+{
+  NSString* childGID = [timer userInfo];
+
+  [GreenstoneApplication startWebViewBusy];
+
+  GreenstoneAPI* greenstoneAPI = [GreenstoneApplication greenstoneAPI];
+  GreenstoneApplication* toplevelApp = [GreenstoneApplication toplevelApp];
+  NSString* lang = [toplevelApp languagePref];
+  //greenstoneAPI->setLanguage(lang); // ***** make param
+  greenstoneAPI->setLanguage("en"); 
+
+  NSString* doctext = greenstoneAPI->getResolvedDocument(_collection,childGID);
+
+  [doctext writeToFile:@"/tmp/gsdoc.html" atomically:NO encoding:NSUTF8StringEncoding error:nil];
+  NSURL* url = [[NSURL alloc] initWithString:@"file:///tmp/gsdoc.html"];
+  system("chmod a+rw /tmp/gsdoc.html"); 
+  
+  [GreenstoneApplication loadURL:url];
+  // [GreenstoneApplication showWebView:0 fromView:self withURL:url]; // ****
+
+  [GreenstoneApplication stopWebViewBusy];
+}
+
+
+-(void) navigationBar:(UINavigationBar*)navbar buttonClicked:(int)button 
+{
+  NSLog(@"_gid = %@",_gid);
+
+  switch (button) 
+  {
+    case 1:  // left button (back)
+      // if ([_gid hasPrefix:@"CL"]==YES) { // ****
+      if (_gid == nil) {
+	[GreenstoneApplication setInCollection:nil];
+      }
+      break;
+  }
+
+  [super navigationBar:navbar buttonClicked:button];
+}
+@end
Index: /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/GSResultItem.h
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/GSResultItem.h	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/GSResultItem.h	(revision 24799)
@@ -0,0 +1,24 @@
+
+#import <Foundation/NSString.h>
+
+
+// ***** rename to OIDItem
+// replace all gid with oid ...
+
+@interface GSResultItem: NSObject
+{
+  NSString* _oid;
+  NSString* _title;
+  NSString* _srcurl;
+}
+
+-(id) initWithOID:(NSString*)oid withTitle:(NSString*)title;
+-(id) initWithOID:(NSString*)oid withTitle:(NSString*)title withSrcUrl:(NSString*)srcurl;
+
+-(NSString*) oid;
+-(NSString*) title;
+-(NSString*) srcurl;
+
+-(void) dealloc;
+
+@end
Index: /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/GSResultItem.mm
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/GSResultItem.mm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/GSResultItem.mm	(revision 24799)
@@ -0,0 +1,59 @@
+#import "GSResultItem.h"
+
+@implementation GSResultItem
+
+-(id) initWithOID:(NSString*)oid withTitle:(NSString*)title
+{
+  return [self initWithOID:oid withTitle:title withSrcUrl:nil];
+}
+
+-(id) initWithOID:(NSString*)oid withTitle:(NSString*)title withSrcUrl:(NSString*)srcurl
+{
+  self = [super init];
+
+  _oid = oid;
+  _title = title;
+  _srcurl = srcurl;
+
+  return self;
+}
+
+-(NSString*) oid
+{
+  return _oid;
+}
+
+-(NSString*) title 
+{
+  return _title;
+}
+
+-(NSString*) srcurl
+{
+  return _srcurl;
+}
+
+
+/*
+-(void) printUnused // ******
+{
+  printf("(");
+  [_oid print];
+  printf(",");
+  [_title print];
+  printf(",");
+  [_srcurl print];
+  printf(")");
+}
+*/
+
+-(void) dealloc
+{
+  [_oid release];
+  [_title release];
+  [_srcurl release];
+
+  [super dealloc];
+}
+
+@end
Index: /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/GreenstoneAPI.h
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/GreenstoneAPI.h	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/GreenstoneAPI.h	(revision 24799)
@@ -0,0 +1,64 @@
+#include "fileutil.h"
+#include "nullproto.h"
+#include "collectset.h"
+
+#import <Foundation/NSArray.h>
+#import <UIKit/UIApplication.h>
+
+class GreenstoneAPI
+{
+ public:
+  GreenstoneAPI(UIApplication* toplevelApp);
+  virtual ~GreenstoneAPI();
+
+  bool sanityCheck();
+  NSMutableArray* collectionList();
+  ColInfoResponse_t& collectInfo (const text_t& collection);
+  ColInfoResponse_t& collectInfo (NSString* nscollection);
+
+  void setLanguage(const text_t& lang) { _lang = lang; }
+
+  NSString* collectionmetaValue(ColInfoResponse_t& colinfo, text_t key);
+  NSString* collectionName(ColInfoResponse_t& colinfo);
+
+  NSString* getDocument(NSString* nscollection, NSString* nsgid); // ******
+  NSString* getResolvedDocument(NSString* nscollection, NSString* nsgid);
+
+  NSMutableArray* getMetadata(NSString* nscollection, NSString* nsgid, NSString* nsmetaname);
+  NSString* getMetadataFirst(NSString* nscollection, NSString* nsgid, NSString* nsmetaname);
+  NSString* getMetadataFirst(const text_t& collection, text_t& gid, text_t& metaname);
+
+  NSString* getSrcUrlMetadata(NSString* nscollection, NSString* nsgid);
+
+  NSMutableArray* browseClassifierList(NSString* nscollection, NSString* nsgid);
+  NSMutableArray* browseToplevelList(NSString* nscollection);
+
+  NSMutableArray* query(NSString* nscollection, NSString* nsquery);
+
+
+  
+  void alert(NSString* nslevel, NSString* nsmessage);
+  void alert(char* level, char* message);
+  void alert(text_t level, text_t message);
+
+ protected:
+  text_t resolveUrls(const text_t& unresolved, const text_t& collection, const text_t& archivedir);
+  text_t srclinkToUrl(const text_t& srclink, const text_t& collection, const text_t& archivedir);
+
+  bool recurse_contents(const text_t& collection, ResultDocInfo_t& section,
+			text_tset& metadata, text_t& output_text);
+
+
+  void set_queryfilter_options (const text_t& collection, FilterRequest_t &request, const text_t &querystring);
+  NSMutableArray* filterResponseToTitlesList(const text_t& collection, FilterResponse_t &sections);
+  NSMutableArray* search_single_collection (const text_t& collection, const text_t& query);
+
+ protected:
+  UIApplication* _toplevelApp;
+  text_t _lang;
+
+  collectset*   _cservers;
+  nullproto*    _nproto;
+  text_t        _gsdlhome;
+};
+
Index: /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/GreenstoneAPI.mm
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/GreenstoneAPI.mm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/GreenstoneAPI.mm	(revision 24799)
@@ -0,0 +1,818 @@
+
+#include <unistd.h>
+#include <sys/dir.h>
+
+#include "gsdlsitecfg.h"
+#include "recptprototools.h"
+
+#import <Foundation/NSString.h>
+#import <Foundation/NSArray.h>
+
+#import <UIKit/UIKit.h>
+#import <UIKit/UIAlertSheet.h>
+
+#import "GSResultItem.h"
+#import "GreenstoneAPI.h"
+
+GreenstoneAPI::GreenstoneAPI(UIApplication* toplevelApp) 
+  : _toplevelApp(toplevelApp), _lang("en"),
+    _cservers(nil), _nproto(nil), _gsdlhome()
+{
+  _cservers = new collectset(_gsdlhome); // sets gsdlhome
+
+  // set up the null protocol
+  _nproto = new nullproto();
+  _nproto->set_collectset(_cservers);
+
+  comerror_t comerr;
+  _nproto->init(comerr,cerr);
+  if (comerr!=noError) {
+    text_t error_message = get_comerror_string (comerr);
+    alert("Error",error_message);
+  }
+
+}
+
+
+GreenstoneAPI::~GreenstoneAPI()
+{
+  delete _cservers;
+  delete _nproto;
+
+}
+
+void GreenstoneAPI::alert(NSString* nslevel, NSString* nsmessage)
+{
+  // Allert sheet displayed at centre of screen.
+
+  NSArray *buttons = [NSArray arrayWithObjects:@"OK", nil];
+  UIAlertSheet *alertSheet = [UIAlertSheet alloc];
+  [alertSheet initWithTitle:nslevel buttons:buttons 
+    defaultButtonIndex:1 delegate:_toplevelApp context:nil];
+
+  [alertSheet setBodyText:nsmessage];
+  [alertSheet popupAlertAnimated:YES];
+}
+
+
+void GreenstoneAPI::alert(char* level, char* message)
+{
+  // Alert sheet displayed at centre of screen.
+
+  NSString* nslevel = [[NSString alloc] initWithCString: level];
+  NSString* nsmessage = [[NSString alloc] initWithCString: message];
+
+  alert(nslevel,nsmessage);
+
+  [nslevel release];
+  [nsmessage release];
+}
+
+void GreenstoneAPI::alert(text_t level, text_t message)
+{
+  char* level_cstr = level.getcstr();
+  char* message_cstr = message.getcstr();
+
+  alert(level_cstr,message_cstr);
+
+  delete [] level_cstr;
+  delete [] message_cstr;
+}
+
+bool GreenstoneAPI::sanityCheck()
+{  
+  text_t gsdl_home, unused_collecthome;
+  text_t unused_httpdomain,unused_httpprefix;
+  if (!site_cfg_read(gsdl_home,unused_collecthome,
+		     unused_httpdomain,unused_httpprefix)) {
+    // couldn't find gsdlsite.cfg file    
+
+    char cwd[128];
+    getcwd(cwd,128);
+
+    text_t sitecfg_filename = cwd;
+    sitecfg_filename += "gsdlsite.cfg"; 
+    
+    alert("Error","Unable to find " + sitecfg_filename );
+    return false;
+  }
+
+  text_t collect_dir = filename_cat(gsdl_home,"collect");
+  char* collect_dir_cstr = collect_dir.getcstr();
+
+  DIR* directorypointer = opendir(collect_dir_cstr);	
+  delete [] collect_dir_cstr;
+
+  if(directorypointer == NULL)	//If the directory could not be opened
+    {  
+      text_t mess = "No collections directory.  Please make one at: " + collect_dir;
+      alert("Error",mess);
+      return false;
+    }
+ 
+  return true;
+}
+
+
+NSMutableArray* GreenstoneAPI::collectionList()
+{
+  text_tarray collection_list;
+  comerror_t comerr;
+  
+  _nproto->get_collection_list (collection_list, comerr, cerr);
+
+  if (comerr != noError) {
+    alert("Error",get_comerror_string(comerr));
+    return nil;
+  }
+
+  int num_cols = collection_list.size();
+
+  NSMutableArray* nscollist = [[NSMutableArray alloc] initWithCapacity:num_cols];
+
+  text_tarray::iterator collection_iterator = collection_list.begin();
+  while (collection_iterator != collection_list.end())
+  {
+    text_t& colname = *collection_iterator;
+    char* colname_cstr = colname.getcstr();
+    NSString* nscolname = [[NSString alloc ] initWithCString: colname_cstr];
+    delete [] colname_cstr;
+
+    [nscollist addObject:nscolname];
+
+    collection_iterator++;
+  }
+
+  return nscollist;
+}
+
+ColInfoResponse_t& GreenstoneAPI::collectInfo (const text_t &collection)
+{
+  ColInfoResponse_t& collectinfo = *new ColInfoResponse_t();
+  comerror_t comerr;
+  _nproto->get_collectinfo(collection, collectinfo,comerr, cerr);
+
+  if (comerr != noError) {
+    alert("Error",get_comerror_string(comerr));
+  }
+  
+  return collectinfo;
+}
+
+ColInfoResponse_t& GreenstoneAPI::collectInfo (NSString* nscollection)
+{
+  char const* nscollection_cstr  = [nscollection UTF8String]; 
+
+  ColInfoResponse_t& colinfo = collectInfo(nscollection_cstr);
+
+  // according to documentation, nscollectcion_cstr autorealeased
+  // => don't need to free them
+  return colinfo;
+}
+
+/* ****
+text_t GreenstoneAPI::lookupLanguagePref()
+{
+  NSString* nslang = [(GreenstoneApplication*)_toplevelApp languagePref];
+  char* lang_cstr = [nslang UTF8String];
+  text_t lang = lang_cstr;
+  [nslang release];
+
+  return lang;
+}
+*/
+
+NSString* GreenstoneAPI::collectionmetaValue(ColInfoResponse_t& colinfo,
+					     text_t key)
+{
+  text_t val = colinfo.get_collectionmeta(key,_lang);
+  char* val_cstr = val.getcstr();
+
+  NSString* nsval = [[NSString alloc] initWithCString:val_cstr];
+  delete [] val_cstr;
+
+
+  return nsval;
+}
+
+
+NSString* GreenstoneAPI::collectionName(ColInfoResponse_t& colinfo)
+{
+  return collectionmetaValue(colinfo,"collectionname");
+}
+
+
+NSString* TextTToNSString(text_t& text)
+{
+  // Make this available to other parts of program!!!
+  if (text.empty()) { return nil; }
+
+  char* text_cstr = text.getcstr();
+  NSString* nstext = [[NSString alloc ] initWithCString: text_cstr];
+  delete [] text_cstr;
+
+  return nstext;
+}
+
+bool GreenstoneAPI::recurse_contents(const text_t& collection, ResultDocInfo_t& section,
+				     text_tset& metadata, text_t& output_text)
+{  
+  // Output this section 
+  	
+  // 1. Get the title
+
+  text_t title = section.metadata["Title"].values[0];
+  output_text.append("<h3>"+title+"</h3>");
+
+  // cerr << "**** Title = " << title << endl;
+
+  // 2. Get the text
+  DocumentRequest_t docrequest;
+  DocumentResponse_t docresponse;
+  comerror_t comerr;
+  docrequest.OID = section.OID;
+
+  _nproto->get_document(collection, docrequest, docresponse, comerr, cerr);
+
+  if (comerr != noError) {
+    alert("Error",get_comerror_string(comerr));
+    return false;
+  }
+
+  output_text.append(docresponse.doc);
+	
+  // cerr << "*** appending text " << docresponse.doc << endl;
+
+  int haschildren = section.metadata["haschildren"].values[0].getint();
+  	
+  // recurse through children
+  if (haschildren == 1)
+    {
+      bool getParents = false;
+      FilterResponse_t tmp;
+
+      get_children (section.OID, collection, _lang, metadata, getParents, _nproto, tmp, cerr);
+      ResultDocInfo_tarray::iterator thisdoc = tmp.docInfo.begin();
+      ResultDocInfo_tarray::iterator lastdoc = tmp.docInfo.end();
+      
+      while (thisdoc != lastdoc) 
+	{
+	  bool recurse_ok = recurse_contents(collection,*thisdoc, metadata, output_text);
+	  if (!recurse_ok) {
+	    return false;
+	  }
+	  ++thisdoc;
+	}
+    }
+	
+  return true;
+}
+
+
+NSString* GreenstoneAPI::getResolvedDocument(NSString* nscollection, NSString* nsgid)
+{
+  char const* nscollection_cstr  = [nscollection UTF8String]; 
+  char const* nsgid_cstr         = [nsgid UTF8String]; 
+
+  text_t collection(nscollection_cstr);
+  text_t gid(nsgid_cstr);
+
+  //metadata elements needed by recurse_contents
+  text_tset metadata;
+  metadata.insert ("Title");
+  metadata.insert ("haschildren");
+
+  bool getParents = false;
+
+  FilterResponse_t inforesponse;
+  comerror_t comerr;
+
+  NSString* nsresolvedtext = nil;
+
+  if (get_info(gid, collection, _lang, metadata, getParents, _nproto, inforesponse, cerr))
+    {
+      text_t output_text;
+      text_t make_utf8 = "    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n";
+
+      output_text.append("<html>\n");
+      output_text.append("  <head>\n"+make_utf8+"  </head>\n");
+
+      if (recurse_contents(collection,inforesponse.docInfo[0], metadata, output_text)) {
+
+	// cerr << "**** text = " << output_text << endl;
+
+	  // retrieve [archivedir] for this document id
+	  NSString* nsarchivedir = getMetadataFirst(nscollection,nsgid,@"archivedir");
+	  const char* nsarchivedir_cstr = [nsarchivedir UTF8String]; 
+	  text_t archivedir = nsarchivedir_cstr;
+	  [nsarchivedir release];
+	  
+	  text_t resolved_text = resolveUrls(output_text,collection,archivedir);
+	  
+	  char* resolved_text_cstr = resolved_text.getcstr();
+	  nsresolvedtext = [[NSString alloc] initWithCString:resolved_text_cstr];
+	  
+	  delete [] resolved_text_cstr;
+	  }
+      else {
+	alert("Error","Failed to get info for " + gid);
+      }
+      output_text.append("</html>\n");
+    }
+  else {
+    alert("Error","Failed to get info for " + gid);
+  }
+
+
+  return nsresolvedtext;
+}
+
+
+NSMutableArray* GreenstoneAPI::getMetadata(NSString* nscollection, NSString* nsgid, NSString* nsmetaname)
+{
+  char const* nscollection_cstr  = [nscollection UTF8String]; 
+  char const* nsgid_cstr         = [nsgid UTF8String]; 
+  char const* nsmetaname_cstr    = [nsmetaname UTF8String]; 
+
+  NSMutableArray* nsmdlist = nil;
+
+  text_t collection(nscollection_cstr);
+  text_t gid(nsgid_cstr);
+  text_t metaname(nsmetaname_cstr);
+
+  text_tset metadata;
+  metadata.insert (metaname);
+  bool getParents = false;
+  FilterResponse_t response;
+
+  if (get_info (gid, collection, _lang, metadata, getParents, _nproto, response, cerr)) {
+    int num_browse_by = response.docInfo.size();
+    if (num_browse_by>0) {
+      MetadataInfo_tmap& metadata = response.docInfo[0].metadata;
+      MetadataInfo_t& metaname_info = metadata[nsmetaname_cstr];
+      int num_browse_by = metaname_info.values.size();
+      if (num_browse_by>0) {
+	// protocol will return 1 even if there is no metadata
+	// values will be the empty string
+
+	nsmdlist = [[NSMutableArray alloc] initWithCapacity:num_browse_by];
+	
+	text_tarray& meta_val = metaname_info.values;
+	text_tarray::iterator md_iterator = meta_val.begin();
+	while (md_iterator != meta_val.end()) {
+	  text_t& mdval = *md_iterator;
+
+	  NSString* nsmdval = TextTToNSString(mdval);	  
+	  if (nsmdval != nil) {
+	    [nsmdlist addObject:nsmdval];
+	  }
+
+	  md_iterator++;	      
+	}
+
+	if ([nsmdlist count] == 0) {
+	  // no valid metadata => free list and set to nil
+	  [nsmdlist release];
+	  nsmdlist = nil;
+	}
+      }
+      else {
+	alert("Error","OID" + gid + "does not have metadata for" + metaname);
+      }
+    }
+    else {
+      alert("Error","OID" + gid + "does not have metadata for" + metaname);
+    }
+  }
+  else {
+    alert("Error","Collection has no browsing capabilities" + gid);
+  }
+
+  // according to documentation, nscollectcion_cstr, nsgid_cstr and nsmetaname_cstr autorealeased
+  // => don't need to free them
+
+  return nsmdlist;
+}
+
+
+NSString* GreenstoneAPI::getMetadataFirst(NSString* nscollection, NSString* nsgid, NSString* nsmetaname)
+{
+  NSMutableArray* all_metavalues = getMetadata(nscollection,nsgid,nsmetaname);
+ 
+  NSString* first_metavalue_copy = nil;
+
+  if (all_metavalues != nil) {
+    NSString* first_metavalue = [all_metavalues objectAtIndex:0];
+
+    first_metavalue_copy = [[NSString alloc] initWithString:first_metavalue];
+
+    [all_metavalues release];
+  }
+
+  return first_metavalue_copy;
+}
+
+NSString* GreenstoneAPI::getMetadataFirst(const text_t& collection, text_t& gid, text_t& metaname)
+{
+  char* collection_cstr = collection.getcstr();
+  char* gid_cstr = gid.getcstr();
+  char* metaname_cstr = metaname.getcstr();
+
+  NSString* nscollection = [[NSString alloc] initWithCString:collection_cstr];
+  NSString* nsgid = [[NSString alloc] initWithCString:gid_cstr];
+  NSString* nsmetaname = [[NSString alloc] initWithCString:metaname_cstr];
+
+  NSString* result = getMetadataFirst(nscollection,nsgid,nsmetaname);
+
+  delete [] collection_cstr;
+  delete [] gid_cstr;
+  delete [] metaname_cstr;
+
+  return result;
+
+}
+
+NSMutableArray* GreenstoneAPI::browseClassifierList(NSString* nscollection, NSString* nsgid)
+{
+  // **** upgrade this to use getMetadata, and then split on ';'
+
+  char const* nscollection_cstr  = [nscollection UTF8String]; 
+  char const* nsgid_cstr  = [nsgid UTF8String]; 
+
+  text_t gid = nsgid_cstr;
+
+  NSMutableArray* nscllist = nil;
+
+  text_tset metadata;
+  metadata.insert ("contains");
+  FilterResponse_t response;
+  comerror_t comerr;
+  
+  if (get_info (nsgid_cstr, nscollection_cstr, _lang, metadata, false, _nproto, response, cerr)) {
+    int num_browse_by = response.docInfo.size();
+    if (num_browse_by >0) {
+      MetadataInfo_tmap& metadata = response.docInfo[0].metadata;
+      MetadataInfo_t& contains = metadata["contains"];
+      int num_browse_by = contains.values.size();
+      if (num_browse_by>0) {
+
+	// nscllist = [[NSMutableArray alloc] initWithCapacity:num_browse_by]; ****
+	nscllist = [[NSMutableArray alloc] initWithCapacity:50];
+	
+	text_tarray& contains_val = contains.values;
+	text_tarray::iterator cl_iterator = contains_val.begin();
+	while (cl_iterator != contains_val.end()) {
+	  text_t& clname = *cl_iterator;
+
+	  // split up on ';'
+	  text_tarray split_clname;
+	  splitchar (clname.begin(), clname.end(), ';', split_clname);
+
+	  text_tarray::iterator split_cl_iterator = split_clname.begin();
+	  while (split_cl_iterator != split_clname.end()) {
+	    text_t& cl = *split_cl_iterator;
+	    NSString* nscl = nil;
+	    if (cl[0] == '\"') {
+	      text_t cl_trim = substr(cl.begin()+1,cl.end());
+	      nscl = TextTToNSString(cl_trim);
+	    }
+	    else {
+	      nscl = TextTToNSString(cl);
+	    }
+	    
+	    if (nscl != nil) {
+	      [nscllist addObject:nscl];
+	    }
+	    else {
+	      cerr << "Warning: no semicolon split classifier 'contains' metadata value found for " + gid << endl;
+	    }
+	    
+	    split_cl_iterator++;
+	  }
+	  cl_iterator++;	      
+	}
+
+	if ([nscllist count]==0) {
+	  // No valid metadata found
+	  [nscllist release];
+	  nscllist = nil;
+	}
+      }
+      else {
+	alert("Error","Collection has to browsing capabilities");
+      }
+    }
+    else {
+      alert("Error","Collection has to browsing capabilities");
+    }
+  }
+  else {
+    alert("Error",get_comerror_string(comerr));
+  }
+
+  // according to documentation, nscollectcion_cstr and nsgid_cstr autorealeased
+  // => don't need to free them
+
+  return nscllist;
+}
+
+
+NSMutableArray* GreenstoneAPI::browseToplevelList(NSString* nscollection)
+{
+  return browseClassifierList(nscollection,@"browse");
+}
+
+
+
+
+void GreenstoneAPI::set_queryfilter_options (const text_t& collection,
+					     FilterRequest_t &request, 
+					     const text_t &querystring) 
+{
+  ColInfoResponse_t& collectinfo = collectInfo(collection);
+
+  // request.filterResultOptions and request.fields (if required) should
+  // be set from the calling code
+
+  request.filterName = "QueryFilter";
+
+  OptionValue_t option;
+
+  option.name = "Term";
+  option.value = querystring;
+  request.filterOptions.push_back (option);
+
+  option.name = "QueryType";
+  option.value = "ranked";
+  request.filterOptions.push_back (option);
+
+  option.name = "MatchMode";
+  option.value = "some";
+  request.filterOptions.push_back (option);
+
+  option.name = "Casefold";
+  option.value = "true";
+  request.filterOptions.push_back (option);
+
+  option.name = "Stem";
+  option.value = "true";
+  request.filterOptions.push_back (option);
+
+  option.name = "AccentFold";
+  option.value = "true";
+  request.filterOptions.push_back (option);
+
+  text_t buildtype = collectinfo.buildType;
+
+  if (buildtype == "lucene") {
+    // Should prevent Lucene collection from doing any searching!! // ****
+    alert("Warning","Searching lucene indexed collection on iPod not currently supported");
+  }
+  else if (buildtype == "mgpp") {
+    option.name = "Level";
+    option.value = "Doc";
+    request.filterOptions.push_back (option);
+
+    option.name = "Index";
+    option.value = "idx"; // ****
+    request.filterOptions.push_back (option);
+  }
+  else {
+    cerr << "**** storing index as dte" << endl;
+    option.name = "Index";
+    option.value = "dte"; // ****
+    request.filterOptions.push_back (option);
+  }
+  
+  option.name = "Maxdocs";
+  option.value = "50";
+  request.filterOptions.push_back (option);
+
+  option.name = "StartResults";
+  option.value = "1";
+  request.filterOptions.push_back (option);
+
+  option.name = "EndResults";
+  option.value = "50";
+  request.filterOptions.push_back (option);
+  
+
+}
+
+
+text_t GreenstoneAPI::resolveUrls(const text_t& unresolved, const text_t& collection, const text_t& archivedir)
+{
+  text_t resolved = unresolved;
+
+  text_t httpprefix = _gsdlhome;
+  text_t httpdocimg = httpprefix +"/collect/" + collection + "/index/assoc/" + archivedir;
+
+  resolved.replace("[archivedir]",archivedir);
+  resolved.replace("[assocfilepath]",archivedir);
+  resolved.replace("[collection]",collection);
+  resolved.replace("_httpprefix_",httpprefix);
+  resolved.replace("_httpdocimg_",httpdocimg);
+
+  return resolved;
+}
+
+
+text_t GreenstoneAPI::srclinkToUrl(const text_t& srclink, const text_t& collection, const text_t& archivedir)
+{
+  text_t srcurl;
+
+  if (!srclink.empty()) {
+    // extract URL
+    text_tarray split_srclink;
+    splitchar (srclink.begin(), srclink.end(), '\"', split_srclink);
+    if (split_srclink.size()>=2) {
+      srcurl = resolveUrls(split_srclink[1],collection,archivedir);
+    }
+  }
+
+  return srcurl;
+}
+
+
+NSString* GreenstoneAPI::getSrcUrlMetadata(NSString* nscollection, NSString* nsgid)
+{
+  NSString* nssrclink = getMetadataFirst(nscollection,nsgid,@"srclink");
+  if (nssrclink == nil) {
+    return nil;
+  }
+  NSString* nsarchivedir = getMetadataFirst(nscollection,nsgid,@"archivedir");
+  //NSString* nsassocfilepath = getMetadataFirst(nscollection,nsgid,@"assocfilepath"); // ****** used?
+
+  char const* nscollection_cstr  = [nscollection UTF8String]; 
+  char const* nssrclink_cstr  = [nssrclink UTF8String]; 
+  char const* nsarchivedir_cstr  = [nsarchivedir UTF8String]; 
+
+  text_t collection = nscollection_cstr;
+  text_t srclink = nssrclink_cstr;
+  text_t archivedir = nsarchivedir_cstr;
+
+  text_t srcurl = srclinkToUrl(srclink,collection,archivedir);
+
+  NSString* nsimage = getMetadataFirst(nscollection,nsgid,@"Image"); 
+  char const* image_cstr  = [nsimage UTF8String]; 
+  srcurl.replace("[Image]",image_cstr);
+
+  NSString* nssrcurl = TextTToNSString(srcurl);
+  
+  return nssrcurl;
+}
+
+
+
+
+NSMutableArray* GreenstoneAPI::filterResponseToTitlesList(const text_t& collection, FilterResponse_t& sections)
+{
+  ResultDocInfo_tarray::iterator thissection = sections.docInfo.begin();
+  ResultDocInfo_tarray::iterator endsection = sections.docInfo.end();
+
+  int num_results = sections.docInfo.size();
+  NSMutableArray* nsresultlist = nil;
+
+  if (num_results>0) {
+    nsresultlist = [[NSMutableArray alloc] initWithCapacity:num_results];
+
+    while (thissection != endsection) {
+      
+      ResultDocInfo_t &docinfo = *thissection;
+      text_t& oid = docinfo.OID;
+      text_t title;
+      text_t srcurl;
+
+      MetadataInfo_tmap& metadata = docinfo.metadata;
+      MetadataInfo_t& dctitle_info = metadata["dc.Title"];
+      MetadataInfo_t& title_info = metadata["Title"];
+      if ((dctitle_info.values.size()>0) && (!dctitle_info.values[0].empty())) {
+	title = dctitle_info.values[0];
+      }
+      else if ((title_info.values.size()>0) && (!title_info.values[0].empty())) {
+	title = title_info.values[0];
+      }
+      else {
+	cerr << "Warning: could not find Title metadata for item" << endl;
+      }
+
+      MetadataInfo_t& archivedir_info = metadata["archivedir"];
+      text_t archivedir = archivedir_info.values[0];
+      
+      MetadataInfo_t& srclink_info = metadata["srclink"];
+      if (srclink_info.values.size()>0) {
+	text_t& srclink = srclink_info.values[0];
+
+	srcurl = srclinkToUrl(srclink,collection,archivedir);
+
+	
+	// ** think about embedding in routine?
+	text_t imagemdname = "Image";
+	NSString* nsimage = getMetadataFirst(collection,oid,imagemdname); 
+	//char const* image_cstr  = [nsimage UTF8String]; 
+	//text_t image = image_cstr;
+	//srcurl.replace("[Image]",image);
+	
+
+      }
+     
+      NSString* nstitle = TextTToNSString(title);
+      NSString* nsoid = TextTToNSString(oid);
+      NSString* nssrcurl = TextTToNSString(srcurl); 
+
+      GSResultItem* result_item = [[GSResultItem alloc] initWithOID:nsoid withTitle:nstitle withSrcUrl:nssrcurl];
+      
+      [nsresultlist addObject:result_item];
+
+      ++thissection;
+    }
+  }
+
+  return nsresultlist;
+}
+
+NSMutableArray* GreenstoneAPI::search_single_collection (const text_t& collection, const text_t& query)
+{
+  comerror_t comerr;
+  FilterRequest_t request;
+  FilterResponse_t response;
+
+  NSMutableArray* nsresultlist = nil;
+ 
+  // request.fields = metadata set
+  request.fields.insert ("dc.Title"); 
+  request.fields.insert ("Title"); 
+  request.fields.insert ("srclink"); 
+  request.fields.insert ("archivedir"); 
+   
+  // do the query
+  request.filterResultOptions = FROID | FRmetadata | FRtermFreq;
+  text_t formattedstring = query;
+
+  // note! formattedstring is in unicode! mg and mgpp must convert!
+  set_queryfilter_options (collection, request, formattedstring);
+
+  _nproto->filter (collection, request, response, comerr, cerr);
+
+  if (comerr != noError) {
+    alert("Error",get_comerror_string(comerr));
+    return nil;
+  }
+  else {
+    nsresultlist = filterResponseToTitlesList(collection,response);
+  }
+  
+  return nsresultlist;
+}
+
+
+
+NSMutableArray* GreenstoneAPI::query(NSString* nscollection, NSString* nsquery)
+{
+  char const* nscollection_cstr  = [nscollection UTF8String]; 
+  char const* nsquery_cstr  = [nsquery UTF8String]; 
+
+  text_t collection = nscollection_cstr;
+  text_t query = nsquery_cstr;
+
+  NSMutableArray* nsresultlist = search_single_collection(collection,query);
+
+  return nsresultlist;
+}
+
+NSString* GreenstoneAPI::getDocument(NSString* nscollection, NSString* nsgid)
+{
+  char const* nscollection_cstr  = [nscollection UTF8String]; 
+  char const* nsgid_cstr  = [nsgid UTF8String]; 
+
+  text_t gid = nsgid_cstr;
+  text_t collection = nscollection_cstr;
+
+  DocumentRequest_t docrequest;
+  DocumentResponse_t docresponse;
+  comerror_t comerr;
+
+  // get the text
+  docrequest.OID = gid;
+  _nproto->get_document(collection, docrequest, docresponse, comerr, cerr);
+  
+  if (comerr != noError) {
+    alert("Error",get_comerror_string(comerr));
+    return nil;
+  }
+
+
+  text_t& text = docresponse.doc;
+  char* text_cstr = text.getcstr();
+  NSString* nstext = [[NSString alloc] initWithCString:text_cstr];
+
+  delete [] text_cstr;
+
+  return nstext;
+}
+
+
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/GreenstoneApplication.h
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/GreenstoneApplication.h	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/GreenstoneApplication.h	(revision 24799)
@@ -0,0 +1,53 @@
+#import <UIKit/UIKit.h>
+#import <UIKit/UIApplication.h>
+
+#import "BrowseCascadeView.h"
+#import "QueryCascadeView.h"
+#import "PrefCascadeView.h"
+
+#import "SimpleWebView.h"
+
+#import "GreenstoneAPI.h"
+
+#import "AppDefs.h"
+
+@interface GreenstoneApplication : UIApplication 
+{
+  UIWindow* _window;
+  UIButtonBar* _butbar;
+
+  BrowseCascadeView* _browseCascadeView; 
+  QueryCascadeView*  _queryCascadeView; 
+  PrefCascadeView*   _prefCascadeView; 
+}
+
+
+-(NSString*) languagePref;
+
++(GreenstoneApplication*) toplevelApp;
++(GreenstoneAPI*) greenstoneAPI;
+
++(CGRect)workAreaRect;
+
++(void) setInCollection:(NSString*)collection;
++(int) inCollectionRowId;
+
+
+-(void) applicationDidFinishLaunching: (NSNotification*)aNotification;
+
+-(void) deviceOrientationChanged:(struct __GSEvent *)event;
+
+-(void) buttonBarClicked:(id)sender;
+
++(void) transitionView:(int)eventNum fromView:(UIView*)from toView:(UIView*)to;
+
++(void) startWebViewBusy;
++(void) stopWebViewBusy;
+
++(void) loadURL:(NSURL*)url;
++(void) showWebView:(int)eventNum  fromView:(UIView*)from withURL:(NSURL*)url;
+
+-(void) alertSheet:(UIAlertSheet*)sheet buttonClicked: (int)button;
+
+@end
+
Index: /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/GreenstoneApplication.mm
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/GreenstoneApplication.mm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/GreenstoneApplication.mm	(revision 24799)
@@ -0,0 +1,316 @@
+#import <Foundation/NSDictionary.h>
+
+#import "GreenstoneApplication.h"
+#import "GreenstoneButtonBar.h"
+
+#import "GreenstoneAPI.h"
+
+static GreenstoneApplication* _toplevelApp   = nil;
+static UITransitionView*      _transView     = nil;
+static SimpleWebView*         _webView       = nil;
+static GreenstoneAPI*         _greenstoneAPI = nil;
+
+static NSString* _inCollection = nil;
+static NSMutableDictionary* _collectionToRowId = nil;
+
+@implementation GreenstoneApplication
+
++(GreenstoneApplication*) toplevelApp {
+  return (_toplevelApp);
+}
+
++(GreenstoneAPI*) greenstoneAPI {
+  return (_greenstoneAPI);
+}
+
++(CGRect)workAreaRect
+{
+  CGRect screen_rect = [UIHardware fullScreenApplicationContentRect];
+
+  int wa_x_dim = screen_rect.size.width;
+  int wa_y_dim = screen_rect.size.height - BOT_NAVBAR_HEIGHT;
+
+  CGRect wa_rect = CGRectMake(0.0f,0.0f,wa_x_dim,wa_y_dim);
+
+  return wa_rect;
+}
+
+
++(void) setInCollection:(NSString*)collection
+{
+  NSLog(@"Setting in collection = %@",collection);
+  if (_inCollection != nil) {
+    // [_inCollection release]; // **** memory leak????
+  }
+  _inCollection = nil;
+    
+  if (collection != nil) {
+    _inCollection = [[NSString alloc] initWithString:collection];
+  }
+}
+
++(int) inCollectionRowId
+{
+  if (_inCollection == nil) {
+    return -1;
+  }
+
+  NSNumber* rowid_num = [_collectionToRowId objectForKey:_inCollection];
+  int rowid = [rowid_num intValue];
+
+  return rowid;
+}
+
+-(NSString*) languagePref
+{
+  int rowid = [GreenstoneApplication inCollectionRowId];
+
+  if (rowid>=0) {
+
+    PrefView* prefview = (PrefView*)[_prefCascadeView directEntry:rowid];
+    NSString* lang = [prefview languagePref];
+
+    return lang; // lang is allocated, make sure calling method does release
+  }
+  else {
+    return nil;
+  }
+}
+
+
+
+-(void) applicationDidFinishLaunching:(NSNotification *)aNotification
+{
+    _toplevelApp = self;
+    _greenstoneAPI = new GreenstoneAPI(self);
+
+    _inCollection = nil;
+    _collectionToRowId = nil;
+
+    if (!_greenstoneAPI->sanityCheck()) {
+      return;
+    }
+
+    CGRect screen_rect = [UIHardware fullScreenApplicationContentRect];
+    screen_rect.origin.x = screen_rect.origin.y = 0.0f;
+
+    _window = [[UIWindow alloc] initWithContentRect: screen_rect];
+
+    CGRect workarea_rect = [GreenstoneApplication workAreaRect];
+
+    // Set up top-level browsing and search menu CascadeViews
+    _browseCascadeView = [BrowseCascadeView alloc];
+    _browseCascadeView = [_browseCascadeView initWithFrame:workarea_rect withTitle: @"Browse collection:"];
+
+    _queryCascadeView = [QueryCascadeView alloc];
+    _queryCascadeView = [_queryCascadeView initWithFrame:workarea_rect withTitle: @"Search collection:"];
+
+    _prefCascadeView = [PrefCascadeView alloc];
+    _prefCascadeView = [_prefCascadeView initWithFrame:workarea_rect withTitle: @"Collection preferences:"];
+
+    NSMutableArray* collist = _greenstoneAPI->collectionList();
+
+    int collist_len = [collist count];
+    _collectionToRowId = [[NSMutableDictionary alloc] initWithCapacity:collist_len];
+
+    NSEnumerator* collist_enumerator = [collist objectEnumerator];
+    int i = 0;
+    NSString* colnamedir;
+    while (colnamedir = [collist_enumerator nextObject]) {
+      ColInfoResponse_t& colinfo = _greenstoneAPI->collectInfo(colnamedir);
+      NSString* colname = _greenstoneAPI->collectionName(colinfo);
+
+      [_browseCascadeView appendMenuItem:self withItem:colname withGID:colnamedir];
+      [_queryCascadeView appendMenuItem:self withItem:colname withGID:colnamedir];
+      [_prefCascadeView appendMenuItem:self withItem:colname withGID:colnamedir];
+
+      NSNumber* inum = [[NSNumber alloc] initWithInt: i];
+      [_collectionToRowId setObject:inum forKey:colnamedir];
+      [inum release]; // **** should probably add this in
+
+      i++;
+    }
+    [collist release];
+
+    
+    if (_webView == nil) {
+      // setup Web browser view
+      _webView = [[SimpleWebView alloc] initWithFrame:workarea_rect];
+    }
+
+    if (_transView == nil) {
+      // Set up transition view
+      _transView = [[UITransitionView alloc] initWithFrame: workarea_rect];
+    }
+
+    // Set up button bar
+    int butbar_x_org = 0.0f;
+    int butbar_y_org = workarea_rect.size.height+1;
+    int butbar_x_dim = screen_rect.size.width;
+    int butbar_y_dim = BOT_NAVBAR_HEIGHT;
+
+    CGRect butbarrect = CGRectMake(butbar_x_org,butbar_y_org,butbar_x_dim,butbar_y_dim);
+    _butbar = [[GreenstoneButtonBar alloc] initInView:_window withFrame:butbarrect];
+
+    // Usual standard window stuff
+    [_window orderFront: self];
+    [_window makeKey: self];
+    [_window _setHidden: NO];
+
+    [_window addSubview: _transView ];
+    [_window addSubview: _butbar]; 
+
+    [_transView transition:0 toView:_browseCascadeView];
+}
+
+
+enum compassDirection { itNorth=0, itEast=1, itSouth=2, itWest=3};
+
+static int compass_degrees[4] = { 0, 90, 180, 270 };
+
+static int current_orientation = kOrientationVertical;
+static int current_compass_dir = itNorth;
+static int current_compass_degs = 0;
+
+-(void) deviceOrientationChanged:(struct __GSEvent *)event
+{
+    int new_orientation = [UIHardware deviceOrientation: YES];
+    
+    int new_compass_dir  = -1;
+
+    switch (new_orientation) 
+    {
+      case kOrientationVertical:
+	new_compass_dir = itNorth;
+	break;
+
+      case kOrientationHorizontalLeft:
+	new_compass_dir = itEast;
+	break;
+
+      case kOrientationHorizontalRight:
+	new_compass_dir = itWest;
+	break;
+      case kOrientationVerticalUpsideDown:
+	new_compass_dir = itSouth;
+	break;	
+    }
+
+    if (new_compass_dir>=0) {
+      int new_compass_degs = compass_degrees[new_compass_dir];
+      int degs_delta = current_compass_degs - new_compass_degs;
+
+      if (degs_delta != 0) {
+
+	current_orientation  = new_orientation;
+	current_compass_degs = new_compass_degs;
+	current_compass_dir  = new_compass_dir;
+	
+	[_webView setTransform:CGAffineTransformIdentity];
+	[_webView setRotationBy:new_compass_degs];	
+      }
+    }
+
+    [super deviceOrientationChanged:event];
+}
+
+
+
+-(void) buttonBarClicked:(id)sender 
+{
+    int button = [sender tag];
+    int transStyle = UITransitionNextShiftUp;
+
+    int rowid = [GreenstoneApplication inCollectionRowId];
+
+    switch (button) 
+    {
+      case GSBBBrowse:
+	if (rowid>=0) {
+	  [_transView transition:transStyle toView:[_browseCascadeView directEntry:rowid]];
+	}
+	else {
+	  [_transView transition:transStyle toView:_browseCascadeView];
+	}
+	break;
+
+      case GSBBQuery:
+	if (rowid>=0) {
+	  [_transView transition:transStyle toView:[_queryCascadeView directEntry:rowid]];
+	}
+	else {
+	  [_transView transition:transStyle toView:_queryCascadeView];
+	}
+	break;
+
+      case GSBBPref:
+	if (rowid>=0) {
+	  [_transView transition:transStyle toView:[_prefCascadeView directEntry:rowid]];
+	}
+	else {
+	  [_transView transition:transStyle toView:_prefCascadeView];
+	}
+	break;
+
+      default:
+	NSLog(@"Unrecognised button bar click: %d",button);
+	break;
+    }
+}
+
+
++(void) transitionView:(int)eventNum fromView:(UIView*)from toView:(UIView*)to
+{
+  [_transView transition:eventNum fromView:from toView:to];
+}
+
++(void) startWebViewBusy
+{
+  // cerr << "**** start busy" << endl;
+  // stub for providing "busy" cue (e.g. busy spinner, or HUD)
+}
+
++(void) stopWebViewBusy
+{
+  // cerr << "**** end busy" << endl;
+  // stub for providing "busy" cue (e.g. busy spinner, or HUD)
+}
+
++(void) loadURL:(NSURL*)url
+{
+  [_webView loadURL:url];
+}
+
++(void) showWebView:(int)eventNum  fromView:(UIView*)from withURL:(NSURL*)url
+{
+  [_webView loadURL:url];
+  [_webView setParent:from];
+  [_transView transition:eventNum fromView:from toView:_webView];
+}
+
+
+
+-(void) alertSheet:(UIAlertSheet*)sheet buttonClicked:(int)button
+{	
+    [sheet dismissAnimated:YES];
+    [sheet release];
+}
+
+
+-(void) dealloc
+{
+    [_browseCascadeView release];
+    [_queryCascadeView release];
+    [_prefCascadeView release];
+
+    [_window release];
+    [_butbar release];
+
+    [super dealloc];
+}
+
+
+@end
+
+
+
Index: /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/GreenstoneButtonBar.h
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/GreenstoneButtonBar.h	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/GreenstoneButtonBar.h	(revision 24799)
@@ -0,0 +1,31 @@
+#import <CoreFoundation/CoreFoundation.h>
+#import <UIKit/UIKit.h>
+#import <UIKit/UITransitionView.h>
+#import <UIKit/UITextView.h>
+#import <UIKit/UIButtonBar.h>
+
+#define NUM_GSBAR_BUTTONS 3
+
+extern NSString *kUIButtonBarButtonAction;
+extern NSString *kUIButtonBarButtonInfo;
+extern NSString *kUIButtonBarButtonInfoOffset;
+extern NSString *kUIButtonBarButtonSelectedInfo;
+extern NSString *kUIButtonBarButtonStyle;
+extern NSString *kUIButtonBarButtonTag;
+extern NSString *kUIButtonBarButtonTarget;
+extern NSString *kUIButtonBarButtonTitle;
+extern NSString *kUIButtonBarButtonTitleVerticalHeight;
+extern NSString *kUIButtonBarButtonTitleWidth;
+extern NSString *kUIButtonBarButtonType;
+
+@interface GreenstoneButtonBar : UIButtonBar
+{}
+
+- (UIButtonBar*)initInView:(UIView*)view withFrame:(CGRect)frame;
+
+- (NSArray *)buttonBarItemList;
+
+@end
+
+
+
Index: /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/GreenstoneButtonBar.mm
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/GreenstoneButtonBar.mm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/GreenstoneButtonBar.mm	(revision 24799)
@@ -0,0 +1,73 @@
+#import "GreenstoneButtonBar.h"
+#import "GreenstoneApplication.h"
+
+@implementation GreenstoneButtonBar
+
+- (UIButtonBar*)initInView:(UIView*)view withFrame:(CGRect)frame
+{
+    self = [super initInView: view withFrame: frame
+       withItemList: [self buttonBarItemList]];
+
+    GreenstoneApplication* app = [GreenstoneApplication toplevelApp];
+
+    [self setDelegate: app ];
+    [self setBarStyle: 1 ];
+    [self setButtonBarTrackingMode: 2 ];
+
+    int buttons[NUM_GSBAR_BUTTONS] = { GSBBBrowse, GSBBQuery, GSBBPref };
+
+    [self registerButtonGroup: 0 withButtons: buttons withCount: NUM_GSBAR_BUTTONS ];
+    [self showButtonGroup: 0 withDuration: 0.0 ];
+
+    // *** This and the fact that BookmarkSelected.png seems to be back to front is a bit weird!
+    [self showSelectionForButton: 1 ];
+
+    return self;
+}
+
+- (NSArray *)buttonBarItemList 
+{
+    GreenstoneApplication* app = [GreenstoneApplication toplevelApp];
+
+    NSArray* buts 
+      = [ NSArray arrayWithObjects:
+          [ NSDictionary dictionaryWithObjectsAndKeys:
+            @"buttonBarClicked:", kUIButtonBarButtonAction,
+            @"icons/BookmarkSelected.png", kUIButtonBarButtonInfo,
+            @"icons/Bookmark.png", kUIButtonBarButtonSelectedInfo,
+            [ NSNumber numberWithInt: 1], kUIButtonBarButtonTag,
+              app, kUIButtonBarButtonTarget,
+            @"Browse", kUIButtonBarButtonTitle,
+            @"0", kUIButtonBarButtonType,
+            nil
+          ],
+
+          [ NSDictionary dictionaryWithObjectsAndKeys:
+            @"buttonBarClicked:", kUIButtonBarButtonAction,
+            @"icons/Search.png", kUIButtonBarButtonInfo,
+            @"icons/SearchSelected.png", kUIButtonBarButtonSelectedInfo,
+            [ NSNumber numberWithInt: 2], kUIButtonBarButtonTag,
+              app, kUIButtonBarButtonTarget,
+            @"Search", kUIButtonBarButtonTitle,
+            @"0", kUIButtonBarButtonType,
+            nil
+          ],
+ 
+          [ NSDictionary dictionaryWithObjectsAndKeys:
+            @"buttonBarClicked:", kUIButtonBarButtonAction,
+            @"icons/Preferences.png", kUIButtonBarButtonInfo,
+            @"icons/PreferencesSelected.png", kUIButtonBarButtonSelectedInfo,
+            [ NSNumber numberWithInt: 3], kUIButtonBarButtonTag,
+              app, kUIButtonBarButtonTarget,
+            @"Settings", kUIButtonBarButtonTitle,
+            @"0", kUIButtonBarButtonType,
+            nil
+          ],
+
+          nil
+      ];
+
+    return buts;
+}
+
+@end
Index: /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/Info.plist
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/Info.plist	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/Info.plist	(revision 24799)
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>en</string>
+	<key>CFBundleExecutable</key>
+	<string>Greenstone</string>
+	<key>CFBundleIdentifier</key>
+	<string>org.greenstone.greenstone2</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>0.1</string>
+	<key>CFBundleName</key>
+	<string>Greenstone</string>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.0.0</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>1.0</string>
+</dict>
+</plist>
Index: /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/Makefile
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/Makefile	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/Makefile	(revision 24799)
@@ -0,0 +1,95 @@
+# Makefile for cross-compiling GreenstoneApplication
+# for iPhone touch
+
+#IPOD_IP=10.1.1.3
+#IPOD_IP=10.1.1.4
+IPOD_IP=10.1.1.7
+#IPOD_IP=10.10.1.109
+#IPOD_IP=192.168.18.252
+#IPOD_IP=10.182.218.36
+
+
+
+CC=arm-apple-darwin-gcc 
+CXX=arm-apple-darwin-g++
+
+GSDL_DIR = ../gs2-runtime-svn
+GDBM_DIR = $(GSDL_DIR)/common-src/packages/gdbm
+
+INDEXERS_DIR  = $(GSDL_DIR)/common-src/indexers
+PACKAGES_DIR  = $(GSDL_DIR)/common-src/packages
+COMMONLIB_DIR = $(GSDL_DIR)/common-src/src/lib
+COLSERVR_DIR  = $(GSDL_DIR)/runtime-src/src/colservr
+RECPTION_DIR  = $(GSDL_DIR)/runtime-src/src/recpt
+PROTOCOL_DIR  = $(GSDL_DIR)/runtime-src/src/protocol
+
+ENABLE_ACCENTFOLD = 1
+ifeq ($(ENABLE_ACCENTFOLD), 1)
+ACCENTFOLD_LIBS = $(INDEXERS_DIR)/packages/unac/libunac.a 
+else
+ACCENTFOLD_LIBS = 
+endif
+
+
+CFLAGS = -I$(GDBM_DIR)/include \
+	 -I$(INDEXERS_DIR)/mgpp/text \
+	 -I$(COMMONLIB_DIR) \
+         -I$(PROTOCOL_DIR) -I$(COLSERVR_DIR) -I$(RECPTION_DIR)
+
+CXXFLAGS = $(CFLAGS)
+
+LD=$(CXX)
+LDFLAGS = -framework CoreFoundation \
+          -framework Foundation \
+          -framework UIKit \
+          -framework LayerKit \
+          -framework CoreGraphics \
+          -framework GraphicsServices \
+          -framework CoreSurface \
+
+LDLIBS =  -lobjc \
+	  -L$(GDBM_DIR)/lib -lgdbm \
+	  -L$(INDEXERS_DIR)/mg/src/text -lmgtext \
+	  -L$(INDEXERS_DIR)/mg/lib      -lmglib \
+	  -L$(INDEXERS_DIR)/mgpp/text   -lmgpptext \
+	  -L$(INDEXERS_DIR)/mgpp/lib    -lmgpplib \
+          $(COMMONLIB_DIR)/gsdllib.a \
+          $(PROTOCOL_DIR)/gsdlprotocol.a \
+          $(COLSERVR_DIR)/gsdlcolservr.a \
+          $(RECPTION_DIR)/gsdlrecpt.a \
+	  -liconv \
+	  -L$(PACKAGES_DIR)/expat/lib -lexpat \
+	  $(ACCENTFOLD_LIBS) \
+          -L/usr/local/lib -lgcc_eh
+
+all:	Greenstone
+
+OBJECTS = greenstone.o GreenstoneApplication.o  GreenstoneButtonBar.o \
+        SimpleWebView.o QueryView.o PrefView.o PrefTable.o \
+	PrefCascadeView.o QueryCascadeView.o BrowseCascadeView.o MenuCascadeView.o \
+	GreenstoneAPI.o GSResultItem.o
+
+
+Greenstone: $(OBJECTS)
+	$(LD) $(LDFLAGS) -o $@ $^ $(LDLIBS)
+
+%.o:	%.m
+	$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
+
+%.o:	%.mm
+	$(CXX) -c $(CXXFLAGS) $(CPPFLAGS) $< -o $@
+
+%.o:	%.cc
+	$(CXX) -c $(CXXFLAGS) $(CPPFLAGS) $< -o $@
+
+clean:
+	rm -f *.o Greenstone
+
+
+install:
+	scp Greenstone root@$(IPOD_IP):/Applications/Greenstone.app/.
+
+complete-install:
+	scp *.png Greenstone Info.plist root@$(IPOD_IP):/Applications/Greenstone.app/.
+
+
Index: /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/MenuCascadeView.h
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/MenuCascadeView.h	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/MenuCascadeView.h	(revision 24799)
@@ -0,0 +1,40 @@
+#import <Foundation/NSObject.h>
+#import <Foundation/NSString.h>
+
+#import <UIKit/UIView.h>
+#import <UIKit/UIKit.h>
+
+#define MCInitCapacity 10
+
+@interface MenuCascadeView : UIView
+{
+  UIView* _parent;
+  UITable* _table;
+  UINavigationBar* _navbar;
+  UIView* _childMenu;
+
+  NSString* _gid;    // Greenstone id (used to access database for metadata such as CL1, CL4.1 etc)
+  NSString* _collection;
+
+  NSMutableArray* _tabrow;
+  NSMutableArray* _oidItem;
+
+}
+
+-(id) init;
+-(id) initWithFrame:(CGRect)rect;
+-(id) initWithFrame:(CGRect)rect withTitle:(NSString*)title;
+-(id) initWithFrame:(CGRect)rect withParent:(UIView*)parent 
+         withCollection:(NSString*)collection withTitle:(NSString*)title withGID:(NSString*)gid;
+
+-(void) setTitle: (NSString*)title;
+-(void) appendMenuItem: (NSObject*) app withItem:(NSString*)item_label withGID:(NSString*)childGID;
+
+-(void) navigationBar:(UINavigationBar*)navbar buttonClicked:(int)button;
+
+
+
+-(void) dealloc;
+
+@end
+
Index: /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/MenuCascadeView.mm
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/MenuCascadeView.mm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/MenuCascadeView.mm	(revision 24799)
@@ -0,0 +1,193 @@
+#import <Foundation/Foundation.h>
+
+#import <UIKit/CDStructures.h>
+#import <UIKit/UINavigationBar.h>
+#import <UIKit/UIWindow.h>
+#import <UIKit/UIView-Hierarchy.h>
+#import <UIKit/UIHardware.h>
+#import <UIKit/UITable.h>
+#import <UIKit/UITableCell.h>
+#import <UIKit/UITableColumn.h>
+
+#import "GreenstoneApplication.h"
+#import "GSResultItem.h"
+
+#import "MenuCascadeView.h"
+
+
+// ***** think about coding for orientation of iPod!!!!
+
+@implementation MenuCascadeView
+
+-(id) init 
+{
+  CGRect rect = [GreenstoneApplication workAreaRect];  
+  return [self initWithFrame:rect];	
+}
+
+-(id) initWithFrame:(CGRect)rect 
+{
+  return [self initWithFrame:rect withParent:nil withCollection:nil withTitle:nil withGID:nil];
+}
+
+-(id) initWithFrame:(CGRect)rect withTitle:(NSString*)title
+{
+  return [self initWithFrame:rect withParent:nil withCollection:nil withTitle:title withGID:nil];
+}
+
+-(id) initWithFrame:(CGRect)rect withParent:(UIView*)parent 
+        withCollection:(NSString*)collection withTitle:(NSString*)title withGID:(NSString*)gid
+{
+  self = [super initWithFrame:rect];
+  
+  _parent = parent;
+  _collection = collection;
+  _gid = gid;
+  _childMenu = nil;
+ 
+  _tabrow    = [[NSMutableArray alloc] initWithCapacity:MCInitCapacity];
+  _oidItem   = [[NSMutableArray alloc] initWithCapacity:MCInitCapacity];
+
+  int frame_x_dim = CGRectGetMaxX(rect)+1;
+  int frame_y_dim = CGRectGetMaxY(rect)+1;
+    
+  int tab_x_org = 0.0f;
+  int tab_y_org = TOP_NAVBAR_HEIGHT;
+  int tab_x_dim = frame_x_dim;
+  int tab_y_dim = frame_y_dim -TOP_NAVBAR_HEIGHT;
+
+  CGRect tablerect = CGRectMake(tab_x_org,tab_y_org,tab_x_dim,tab_y_dim);
+
+  _table = [[UITable alloc] initWithFrame:tablerect];
+    
+  UITableColumn *col = [[UITableColumn alloc] initWithTitle: @"MenuCascadeApp"
+		       identifier: @"menucascade" width: frame_x_dim];
+      
+  [_table addTableColumn: col]; 
+  [_table setDataSource: self];
+  [_table setDelegate: self];
+  [_table reloadData];
+  
+  int nav_x_org = 0.0f;
+  int nav_y_org = 0.0f;
+  int nav_x_dim = frame_x_dim;
+  int nav_y_dim = TOP_NAVBAR_HEIGHT;
+
+  CGRect navrect = CGRectMake(nav_x_org,nav_y_org,nav_x_dim,nav_y_dim);
+  _navbar = [[UINavigationBar alloc] initWithFrame: navrect];
+  
+  NSString* back = (parent) ? @"Back" : nil;
+  [_navbar showButtonsWithLeftTitle:back rightTitle:nil leftBack:YES];
+  [_navbar enableAnimation];
+  [_navbar setBarStyle: 0];
+  [_navbar setDelegate: self];
+
+  if (title != nil) {
+    [self setTitle:title];
+  }
+
+  [self addSubview: _navbar]; 
+  [self addSubview: _table]; 	
+
+  return self;
+}
+
+
+-(void) setTitle: (NSString*)title
+{
+  UINavigationItem* navtitle = [UINavigationItem alloc];
+  [_navbar pushNavigationItem: [navtitle initWithTitle: title]];
+}
+
+
+-(void) appendMenuItem: (NSObject*) app withItem:(NSString*)itemLabel withGID:(NSString*)childGID
+{
+  UIImageAndTextTableCell* itcell = [[UIImageAndTextTableCell alloc] init];
+  [itcell setTitle: itemLabel]; 
+    
+  if ([childGID hasPrefix:@"CL"]==YES) {
+    [itcell setShowDisclosure: YES];
+    [itcell setDisclosureStyle: 2];
+  }
+  else if (_parent == nil) {
+    // Root menu => Make disclosures look a bit different
+    [itcell setShowDisclosure: YES];
+    [itcell setDisclosureStyle: 1];
+  }
+
+  [_tabrow addObject:itcell]; 
+  [itcell retain];
+
+  if (itemLabel == nil) {
+    itemLabel = [[NSString alloc] initWithString:@"Unknown Title"];
+  }
+
+  GSResultItem* oidItem = [[GSResultItem alloc] initWithOID:childGID withTitle:itemLabel]; // *****
+  [_oidItem addObject:oidItem];  
+
+  // needed to force table view to update
+  [_table reloadData];
+
+}
+
+// ************
+// * Delegates
+// ************
+
+- (int) numberOfRowsInTable: (UITable *)table
+{
+  return [_tabrow count];
+}
+
+- (UITableCell *) table: (UITable *)table cellForRow: (int)row column: (int)col
+{
+
+
+  return [_tabrow objectAtIndex:row];
+}
+
+- (UITableCell *) table: (UITable *)table cellForRow: (int)row column: (int)col
+				reusing: (BOOL) reusing
+{
+  return [_tabrow objectAtIndex:row];
+}
+
+
+
+-(void) navigationBar:(UINavigationBar*)navbar buttonClicked:(int)button 
+{
+  switch (button) 
+  {
+    case 1:  // left
+      // cerr << "***** Need to set collection to nil if going to top page" << endl; // ****
+      // [GreenstoneApplication setInCollection:_parent._collectcion];
+      [GreenstoneApplication transitionView:UITransitionBothShiftRight 
+         fromView:self toView:_parent];
+
+      if (_childMenu != nil) {
+	[_childMenu release];
+	_childMenu = nil;
+      }
+      break;
+
+    default:
+      NSLog(@"Unrecognised navbar button = %d",button);
+      break;
+  }
+}
+
+
+-(void) dealloc
+{
+  [_childMenu release];
+
+  [_gid release]; // **** is this ever used???
+  [_collection release];
+
+  [_tabrow release];
+  [_oidItem release];
+
+  [ super dealloc ];
+}
+
+@end
Index: /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/NSURLConnection-example.mm
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/NSURLConnection-example.mm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/NSURLConnection-example.mm	(revision 24799)
@@ -0,0 +1,107 @@
+// create the request
+
+NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.apple.com/"]
+
+                        cachePolicy:NSURLRequestUseProtocolCachePolicy
+
+                    timeoutInterval:60.0];
+
+// create the connection with the request
+
+// and start loading the data
+
+NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
+
+if (theConnection) {
+
+    // Create the NSMutableData that will hold
+
+    // the received data
+
+    // receivedData is declared as a method instance elsewhere
+
+    receivedData=[[NSMutableData data] retain];
+
+} else {
+
+    // inform the user that the download could not be made
+
+}
+
+- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
+
+{
+
+    // this method is called when the server has determined that it
+
+    // has enough information to create the NSURLResponse
+
+ 
+
+    // it can be called multiple times, for example in the case of a
+
+    // redirect, so each time we reset the data.
+
+    // receivedData is declared as a method instance elsewhere
+
+    [receivedData setLength:0];
+
+}
+
+- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
+
+{
+
+    // append the new data to the receivedData
+
+    // receivedData is declared as a method instance elsewhere
+
+    [receivedData appendData:data];
+
+}
+
+- (void)connection:(NSURLConnection *)connection
+
+  didFailWithError:(NSError *)error
+
+{
+
+    // release the connection, and the data object
+
+    [connection release];
+
+    // receivedData is declared as a method instance elsewhere
+
+    [receivedData release];
+
+ 
+
+    // inform the user
+
+    NSLog(@"Connection failed! Error - %@ %@",
+
+          [error localizedDescription],
+
+          [[error userInfo] objectForKey:NSErrorFailingURLStringKey]);
+
+}
+
+- (void)connectionDidFinishLoading:(NSURLConnection *)connection
+
+{
+
+    // do something with the data
+
+    // receivedData is declared as a method instance elsewhere
+
+    NSLog(@"Succeeded! Received %d bytes of data",[receivedData length]);
+
+ 
+
+    // release the connection, and the data object
+
+    [connection release];
+
+    [receivedData release];
+
+}
Index: /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/PrefCascadeView.h
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/PrefCascadeView.h	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/PrefCascadeView.h	(revision 24799)
@@ -0,0 +1,23 @@
+
+#import "PrefView.h"
+
+#import "MenuCascadeView.h"
+
+@interface PrefCascadeView: MenuCascadeView
+{
+  NSMutableArray* _prefViews;
+}
+
+-(id) initWithFrame:(CGRect)rect withParent:(UIView*)parent 
+        withCollection:(NSString*)collection withTitle:(NSString*)title withGID:(NSString*)gid;
+
+-(UIView*) directEntry:(int)rowId;
+
+-(void) appendMenuItem: (NSObject*) app withItem:(NSString*)item_label withGID:(NSString*)childGID;
+
+-(void) tableRowSelected:(NSNotification*)notification;
+
+-(void) dealloc;
+
+@end
+
Index: /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/PrefCascadeView.mm
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/PrefCascadeView.mm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/PrefCascadeView.mm	(revision 24799)
@@ -0,0 +1,69 @@
+
+#import "GSResultItem.h"
+#import "GreenstoneApplication.h"
+
+#import "PrefCascadeView.h"
+
+@implementation PrefCascadeView
+
+-(id) initWithFrame:(CGRect)rect withParent:(UIView*)parent 
+        withCollection:(NSString*)collection withTitle:(NSString*)title withGID:(NSString*)gid
+{
+  self = [super initWithFrame:rect withParent:parent withCollection:collection 
+	  withTitle:title withGID:gid];
+
+  _prefViews = [[NSMutableArray alloc] initWithCapacity:MCInitCapacity];
+
+  return self;
+}
+
+-(void) appendMenuItem:(NSObject*)app withItem:(NSString*)item_label withGID:(NSString*)childGID
+{
+  [super appendMenuItem:app withItem:item_label withGID:childGID];
+
+  CGRect workarea_rect = [GreenstoneApplication workAreaRect];
+  PrefView* prefView = [[PrefView alloc] initWithFrame:workarea_rect 
+			withParent:self withCollection:childGID withTitle:item_label];
+
+  [_prefViews addObject:prefView];  
+
+}
+
+-(UIView*) directEntry:(int)rowId
+{
+  return [_prefViews objectAtIndex:rowId];
+}
+
+
+
+//***********
+//* Delegates
+//***********
+-(void) tableRowSelected:(NSNotification*)notification
+{
+  UITable* table = [notification object];
+  int rowId = [table selectedRow];
+
+  GreenstoneAPI* greenstoneAPI = [GreenstoneApplication greenstoneAPI];
+
+  NSString* childTitle = [[_oidItem objectAtIndex:rowId] title];
+  NSString* childGID = [[_oidItem  objectAtIndex:rowId] oid]; 
+
+  NSString* chosenCollection = [[NSString alloc] initWithString:childGID];
+
+  PrefView* prefView = [_prefViews objectAtIndex:rowId];
+  
+  [GreenstoneApplication setInCollection:chosenCollection];
+  [GreenstoneApplication transitionView:UITransitionBothShiftLeft 
+        fromView:self toView:prefView];
+
+}
+
+-(void) dealloc
+{
+  [_prefViews release];
+
+  [super dealloc];
+}
+
+@end
Index: /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/PrefTable.h
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/PrefTable.h	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/PrefTable.h	(revision 24799)
@@ -0,0 +1,41 @@
+#import <UIKit/UIKit.h>
+#import <UIKit/UIPreferencesTable.h>
+#import <UIKit/UIPreferencesTextTableCell.h>
+#import <UIKit/UISwitchControl.h>
+#import <UIKit/UISegmentedControl.h>
+#import <UIKit/UISliderControl.h>
+
+#define NUM_GROUPS 2
+#define CELLS_PER_GROUP 2
+
+@interface PrefTable : UIPreferencesTable
+{
+    UIPreferencesTableCell *cells[NUM_GROUPS][CELLS_PER_GROUP];
+    UIPreferencesTableCell *groupcell[NUM_GROUPS];
+
+    UISegmentedControl *langControl;
+
+    UISwitchControl    *stemmingControl;
+    UISwitchControl    *caseControl;
+}
+
+- (id)initWithFrame:(CGRect)rect;
+- (int)numberOfGroupsInPreferencesTable:(UIPreferencesTable *)aTable;
+- (UIPreferencesTableCell *)preferencesTable:
+    (UIPreferencesTable *)aTable
+    cellForGroup:(int)group;
+- (float)preferencesTable:(UIPreferencesTable *)aTable
+    heightForRow:(int)row
+    inGroup:(int)group
+    withProposedHeight:(float)proposed;
+- (BOOL)preferencesTable:(UIPreferencesTable *)aTable
+    isLabelGroup:(int)group;
+- (UIPreferencesTableCell *)preferencesTable:
+    (UIPreferencesTable *)aTable
+    cellForRow:(int)row
+    inGroup:(int)group;
+
+-(NSString*) languagePref;
+
+@end
+
Index: /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/PrefTable.mm
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/PrefTable.mm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/PrefTable.mm	(revision 24799)
@@ -0,0 +1,166 @@
+#import "PrefTable.h"
+
+@implementation PrefTable
+- (id)initWithFrame:(CGRect)rect {
+    if ((self == [ super initWithFrame: rect ]) != nil) {
+        int i, j;
+
+        for(i=0;i<NUM_GROUPS;i++) {
+            groupcell[i] = NULL;
+            for(j=0;j<CELLS_PER_GROUP;j++)
+                cells[i][j] = NULL;
+        }
+
+        [ self setDataSource: self ];
+        [ self setDelegate: self ];
+    }
+
+    return self;
+}
+
+- (int)numberOfGroupsInPreferencesTable:(UIPreferencesTable *)aTable {
+
+    /* Number of logical groups, including labels */
+    return NUM_GROUPS;
+}
+
+ - (int)preferencesTable:(UIPreferencesTable *)aTable
+    numberOfRowsInGroup:(int)group
+{
+    switch (group) {
+        case 0:
+            return 1;
+            break;
+        case 1:
+            return 2;
+            break;
+    }
+}
+
+- (UIPreferencesTableCell *)preferencesTable:
+    (UIPreferencesTable *)aTable
+    cellForGroup:(int)group
+{
+     if (groupcell[group] != NULL)
+         return groupcell[group];
+
+     groupcell[group] = [ [ UIPreferencesTableCell alloc ] init ];
+     switch (group) {
+         case 0:
+             [ groupcell[group] setTitle: @"Presentation" ];
+             break;
+         case 1:
+             [ groupcell[group] setTitle: @"Search" ];
+             break;
+     }
+     return groupcell[group];
+}
+
+- (float)preferencesTable:(UIPreferencesTable *)aTable
+    heightForRow:(int)row
+    inGroup:(int)group
+    withProposedHeight:(float)proposed
+{
+    /* Return height for group titles */
+    if (row == -1) {
+        if (group < 2)
+            return 40;
+    }
+
+    if (group == 0 && row == 0) {
+      return 55.0;
+    }
+
+
+    return proposed;
+}
+
+- (BOOL)preferencesTable:(UIPreferencesTable *)aTable
+    isLabelGroup:(int)group
+{
+    return NO;
+}
+
+-(UIPreferencesTableCell*) preferencesTable:
+    (UIPreferencesTable *)aTable
+    cellForRow:(int)row
+    inGroup:(int)group
+{
+    UIPreferencesTableCell *cell;
+
+    if (cells[group][row] != NULL)
+        return cells[group][row];
+
+    cell = [ [ UIPreferencesTableCell alloc ] init ];
+    [ cell setEnabled: YES ];
+
+    switch (group) {
+        case (0):
+            switch (row) {
+                case (0):
+                    [ cell setTitle:@"Language" ];
+                    langControl = [ [ UISegmentedControl alloc ]
+                        initWithFrame:CGRectMake(170, 5, 135, 50)
+                    ];
+		    [ langControl insertSegment:0
+                        withTitle:@"English" animated: NO ];
+                    [ langControl insertSegment:1
+                        withTitle:@"French" animated: NO ];
+                    [ langControl selectSegment: 0 ];
+                    [ cell addSubview: langControl ];
+                    break;
+	    }
+	    break;
+        case (1):
+            switch (row) {
+                case (0):
+                    [ cell setTitle:@"Stemming" ];
+                    stemmingControl = [ [ UISwitchControl alloc ]
+                        initWithFrame:CGRectMake(170, 5, 120, 55)
+                    ];
+                    [ stemmingControl setValue: 0.0 ];
+                    [ cell addSubview: stemmingControl ];
+                    break;
+                case (1):
+                    [ cell setTitle:@"Case matching" ];
+                    caseControl = [ [ UISwitchControl alloc ]
+                        initWithFrame:CGRectMake(170, 5, 120, 30)
+                    ];
+                    [ caseControl setValue: 0.0 ];
+                    [ caseControl setAlternateColors: NO ];
+                    [ cell addSubview: caseControl ];
+                    break;
+                case (2):
+                    [ cell setTitle:@"Case matching" ];
+                    caseControl = [ [ UISwitchControl alloc ]
+                        initWithFrame:CGRectMake(170, 5, 120, 30)
+                    ];
+                    [ caseControl setValue: 0.0 ];
+                    [ caseControl setAlternateColors: NO ];
+                    [ cell addSubview: caseControl ];
+                    break;
+            }
+            break;
+	    
+    }
+
+    [ cell setShowSelection: NO ];
+    cells[group][row] = cell;
+    return cell;
+}
+
+-(NSString*) languagePref
+{
+  NSString* lang = [NSString alloc];
+
+  if (langControl.selectedSegment==0) {
+    lang = [lang initWithString:@"en"];
+  }
+  else {
+    lang = [lang initWithString:@"fr"];
+  }
+
+  return lang;
+}
+
+@end
Index: /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/PrefView.h
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/PrefView.h	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/PrefView.h	(revision 24799)
@@ -0,0 +1,24 @@
+#import <UIKit/UIKit.h>
+
+#import "PrefTable.h"
+
+@interface PrefView : UIView
+{
+  UIView* _parent;
+  NSString* _collection;
+
+  UINavigationBar* _navbar;
+  PrefTable* _prefTable;
+
+}
+
+-(id) initWithFrame:(struct CGRect)frame withParent:(UIView*)parent 
+         withCollection:(NSString*)collection withTitle:(NSString*)title;
+
+-(void) setTitle:(NSString*)title;
+
+-(NSString*) languagePref;
+
+-(void) dealloc;
+
+@end
Index: /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/PrefView.mm
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/PrefView.mm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/PrefView.mm	(revision 24799)
@@ -0,0 +1,97 @@
+
+
+#import <Foundation/Foundation.h> // can remove?? *****
+
+#import <UIKit/UIKit.h>
+
+
+#import "GreenstoneApplication.h"
+
+#import "PrefTable.h"
+#import "PrefView.h"
+
+
+
+@implementation PrefView
+
+- (id)initWithFrame:(struct CGRect)frame withParent:(UIView*)parent 
+        withCollection:(NSString*)collection withTitle:(NSString*)title
+{
+  self = [super initWithFrame:frame];
+
+  _parent = parent;
+  _collection = collection;
+
+  // Create the storage array.
+  // _cellResultList = [[NSMutableArray alloc] init]; // ****
+  
+  // Create the navigation bar.
+  _navbar = [[UINavigationBar alloc] initWithFrame: CGRectMake(0, 0, 320, 45)];
+  [_navbar showLeftButton:@"Back" withStyle:2 rightButton:nil withStyle:0]; // 2 = arrow left. // *** do enum for "2"
+  [_navbar setBarStyle: barstyleBlue]; 
+  [_navbar setDelegate:self];
+  [_navbar enableAnimation];
+
+  [self setTitle:title];
+
+
+  CGRect pref_rect = frame;
+  pref_rect.origin.y += 45;
+  pref_rect.size.height -= 45;
+
+  _prefTable = [ [ PrefTable alloc ] initWithFrame: pref_rect ];
+  [_prefTable reloadData];
+
+  // [self setTitle:collection]; // ***** can't seem to be this to work!!!! but does in MenuCascadeView
+
+
+  [self addSubview: _navbar];
+  [self addSubview: _prefTable];
+
+  return self;
+}
+
+
+-(void) setTitle:(NSString*)title
+{
+  UINavigationItem* navtitle = [UINavigationItem alloc];
+  [_navbar pushNavigationItem: [navtitle initWithTitle: title]];
+}
+
+-(NSString*) languagePref
+{
+  return [_prefTable languagePref];
+}
+
+
+//***********
+//* Delegates 
+//***********
+
+- (void)navigationBar:(UINavigationBar*)navbar buttonClicked:(int)button
+{
+  switch (button) 
+  {
+    case 1:  // left
+      [GreenstoneApplication setInCollection:nil];
+      [GreenstoneApplication transitionView:UITransitionBothShiftRight 
+          fromView:self toView:_parent];
+      break;
+
+    default:
+      NSLog(@"Unrecognised navbar button = %d",button);
+      break;
+  }
+
+}
+
+
+-(void) dealloc
+{
+  [_collection release];
+
+  [super dealloc];
+}
+
+@end
+
Index: /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/QueryCascadeView.h
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/QueryCascadeView.h	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/QueryCascadeView.h	(revision 24799)
@@ -0,0 +1,22 @@
+
+#import "MenuCascadeView.h"
+#import "QueryView.h"
+
+@interface QueryCascadeView: MenuCascadeView
+{
+  NSMutableArray* _queryViews;
+}
+
+-(id) initWithFrame:(CGRect)rect withParent:(UIView*)parent 
+        withCollection:(NSString*)collection withTitle:(NSString*)title withGID:(NSString*)gid;
+
+-(UIView*) directEntry:(int)rowId;
+
+-(void) appendMenuItem:(NSObject*)app withItem:(NSString*)item_label withGID:(NSString*)childGID;
+
+-(void) tableRowSelected:(NSNotification*)notification;
+
+-(void) dealloc;
+
+@end
+
Index: /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/QueryCascadeView.mm
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/QueryCascadeView.mm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/QueryCascadeView.mm	(revision 24799)
@@ -0,0 +1,65 @@
+
+#import "GSResultItem.h"
+#import "GreenstoneApplication.h"
+
+#import "QueryCascadeView.h"
+
+
+@implementation QueryCascadeView
+
+
+-(id) initWithFrame:(CGRect)rect withParent:(UIView*)parent 
+        withCollection:(NSString*)collection withTitle:(NSString*)title withGID:(NSString*)gid
+{
+  _queryViews = [[NSMutableArray alloc] initWithCapacity:MCInitCapacity];
+
+  return [super initWithFrame:rect withParent:parent withCollection:collection 
+	 withTitle:title withGID:gid];
+}
+
+-(void) appendMenuItem:(NSObject*)app withItem:(NSString*)item_label withGID:(NSString*)childGID
+{
+  [super appendMenuItem:app withItem:item_label withGID:childGID];
+
+  CGRect workarea_rect = [GreenstoneApplication workAreaRect];
+  QueryView* queryView = [[QueryView alloc] initWithFrame:workarea_rect 
+			withParent:self withCollection:childGID withTitle:item_label];
+
+  [_queryViews addObject:queryView];  
+
+}
+
+-(void) tableRowSelected:(NSNotification*)notification
+{
+  UITable* table = [notification object];
+  int rowId = [table selectedRow];
+
+  GreenstoneAPI* greenstoneAPI = [GreenstoneApplication greenstoneAPI];
+
+  NSString* childTitle = [[_oidItem objectAtIndex:rowId] title];  
+  NSString* childGID = [[_oidItem  objectAtIndex:rowId] oid]; 
+
+  NSString* chosenCollection = [[NSString alloc] initWithString:childGID]; 
+
+  CGRect workarea_rect = [GreenstoneApplication workAreaRect];
+  QueryView* queryView = [_queryViews objectAtIndex:rowId];
+
+  [GreenstoneApplication setInCollection:chosenCollection];
+  [GreenstoneApplication transitionView:UITransitionBothShiftLeft 
+        fromView:self toView:queryView];
+}
+
+-(UIView*) directEntry:(int)rowId
+{
+  return [_queryViews objectAtIndex:rowId];
+}
+
+-(void) dealloc
+{
+  [_queryViews release];
+
+  [super dealloc];
+}
+
+
+@end
Index: /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/QueryView.h
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/QueryView.h	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/QueryView.h	(revision 24799)
@@ -0,0 +1,56 @@
+#import <Foundation/Foundation.h>
+#import <Foundation/NSDictionary.h>
+#import <UIKit/UIKit.h>
+#import <UIKit/UIApplication.h>
+
+// **** can searchtablecell be done away with?
+
+@interface SearchTableCell : UIImageAndTextTableCell
+{
+        UITextLabel* song_name;
+        UITextLabel* artist_name;
+        
+@public
+        char m_Path[256];
+}
+@end
+
+
+@interface QueryView : UIView
+{
+  UIView* _parent;
+  NSString* _collection;
+
+  UIKeyboard* _keyboard;
+  BOOL _keyboardVisible;
+ 
+  UINavigationBar* _navbar;
+  UISearchField* _searchBox;
+       
+  NSMutableArray* _cellResultList;
+  NSMutableArray* _oidItem;
+  
+  UITable* _table;
+
+}
+
+-(id) initWithFrame:(struct CGRect)frame withParent:(UIView*)parent 
+         withCollection:(NSString*)collection withTitle:(NSString*)title;
+
+-(void) setTitle:(NSString*)title;
+
+
+-(void) navigationBar:(UINavigationBar*)navbar buttonClicked:(int)button;
+
+-(void) tableRowSelected:(NSNotification*)notification;
+-(void) asynchronousLoad:(NSTimer*)timer;
+
+-(void)keyboardInput:(id)k shouldInsertText:(id)i isMarkedText:(int)b;
+
+- (void)keyboardReturnPressed;
+- (void)ShowKeyboard;
+- (void)HideKeyboard;
+
+-(void) dealloc;
+
+@end
Index: /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/QueryView.mm
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/QueryView.mm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/QueryView.mm	(revision 24799)
@@ -0,0 +1,380 @@
+#import <CoreFoundation/CoreFoundation.h>
+#import <Foundation/Foundation.h>
+#import <UIKit/CDStructures.h>
+#import <UIKit/UITextLabel.h>
+#import <UIKit/UIDateLabel.h> // For defaultFont.
+#import <UIKit/UITable.h>
+#import <UIKit/UITableCell.h>
+#import <UIKit/UITableColumn.h>
+#import <UIKit/UISearchField.h>
+#import <UIKit/UIFrameAnimation.h>
+#import <UIKit/UITransitionView.h>
+
+#import "GreenstoneApplication.h"
+#import "SimpleWebView.h"
+#import "GSResultItem.h"
+
+#import "QueryView.h"
+
+@implementation SearchTableCell
+
+// ***** is the following needed, or need to be modified? 
+- (void) drawContentInRect: (struct CGRect)rect selected: (BOOL) selected
+{
+  [song_name setHighlighted: selected];
+  [artist_name setHighlighted: selected];
+  [super drawContentInRect: rect selected: selected];
+}
+
+@end
+
+
+@implementation QueryView
+
+- (id)initWithFrame:(struct CGRect)frame withParent:(UIView*)parent 
+       withCollection:(NSString*)collection withTitle:(NSString*)title
+{
+  self = [super initWithFrame:frame];
+
+  _parent = parent;
+  _collection = collection;
+
+  // Create the storage array.
+  _cellResultList = [[NSMutableArray alloc] init];
+  _oidItem = [[NSMutableArray alloc] init];
+
+
+  // Create the navigation bar
+  int nbr1_x_org = 0;
+  int nbr1_y_org = 0;
+  int nbr1_x_dim = 320;
+  int nbr1_y_dim = TOP_NAVBAR_HEIGHT;
+
+  CGRect navbar1_rect = CGRectMake(nbr1_x_org,nbr1_y_org,nbr1_x_dim,nbr1_y_dim);
+
+  UINavigationBar* navbar1 = [[UINavigationBar alloc] initWithFrame:navbar1_rect];
+  [navbar1 showLeftButton:@"Back" withStyle:2 rightButton:nil withStyle:0]; // 2 = arrow left.
+  [navbar1 setBarStyle: barstyleBlue]; 
+  [navbar1 setDelegate:self];
+  [navbar1 enableAnimation];
+  [self addSubview: navbar1];
+
+  _navbar = navbar1;
+  [self setTitle:title];
+  
+  // Not sure if a second nav bar is really the way to get a 
+  // search box with background seamlessly merged with main nav bar
+  // Tried to make 1 navbar high enough for everything, but back 
+  // button was alligned to bottom of bar
+
+  int nbr2_x_org = nbr1_x_org;
+  int nbr2_y_org = nbr1_y_dim;
+  int nbr2_x_dim = nbr1_x_dim;
+  int nbr2_y_dim = [UISearchField defaultHeight];
+
+  CGRect navbar2_rect = CGRectMake(nbr2_x_org,nbr2_y_org,nbr2_x_dim,nbr2_y_dim);
+  UINavigationBar* navbar2 = [[UINavigationBar alloc] initWithFrame:navbar2_rect];
+  [navbar2 showLeftButton:nil withStyle:0 rightButton:nil withStyle:0]; 
+  [navbar2 setBarStyle: barstyleBlue]; 
+  [navbar2 setDelegate:self];
+  [navbar2 enableAnimation];
+
+  [self addSubview: navbar2];
+
+  // Create the search box.
+
+  int sr_x_org = 30;
+  int sr_y_org = 0;
+  int sr_x_dim =  frame.size.width - (2*30);
+  int sr_y_dim = [UISearchField defaultHeight];
+
+  CGRect search_rect = CGRectMake(sr_x_org,sr_y_org,sr_x_dim,sr_y_dim);
+
+  _searchBox = [[UISearchField alloc] initWithFrame:search_rect];
+  [_searchBox setClearButtonStyle:2];
+  [_searchBox setFont:[UITextLabel defaultFont]];
+  [[_searchBox textTraits] setReturnKeyType:6];
+  [[_searchBox textTraits] setEditingDelegate:self];
+  [[_searchBox textTraits] setAutoCapsType: NO];
+  [[_searchBox textTraits] setAutoCorrectionType:1];
+
+  [_searchBox setText:@""];
+  [_searchBox setDisplayEnabled:YES];
+
+  [_searchBox becomeFirstResponder];
+
+  // Create the table.
+  CGRect table_rect = CGRectMake(0, nbr2_y_org+nbr2_y_dim, frame.size.width, 400);
+
+  _table = [[UITable alloc] initWithFrame:table_rect];
+  [self addSubview: _table];
+
+  UITableColumn *col = [[UITableColumn alloc] initWithTitle: @"iMPDclient" identifier: @"column1" width: 320.0f];
+  [_table addTableColumn: col];
+  [_table setDelegate: self];
+  [_table setDataSource: self];
+  [_table setSeparatorStyle:1];
+  [_table setRowHeight:42.0f];
+  
+
+  // Create the keyboard
+  int kb_x_org = 0;
+  int kb_y_org = 410 - [UIKeyboard defaultSize].height;
+  int kb_x_dim = frame.size.width; // ****? what about when landscape
+  int kb_y_dim = [UIKeyboard defaultSize].height;
+  CGRect kb_rect = CGRectMake(kb_x_org,kb_y_org,kb_x_dim,kb_y_dim);
+
+  _keyboard = [[UIKeyboard alloc] initWithFrame:kb_rect];
+
+  [self addSubview: _keyboard];
+  _keyboardVisible = YES;
+  
+  [navbar2 addSubview:_searchBox];
+
+  return self;
+}
+
+-(void) setTitle:(NSString*)title
+{
+  UINavigationItem* navtitle = [UINavigationItem alloc];
+  [_navbar pushNavigationItem: [navtitle initWithTitle:title]];
+}
+
+
+- (void)performQuery:(NSString *)searchtext
+{
+  GreenstoneAPI* greenstoneAPI = [GreenstoneApplication greenstoneAPI];
+  NSMutableArray* resultlist = greenstoneAPI->query(_collection,searchtext);
+
+  [_cellResultList removeAllObjects];
+  [_oidItem removeAllObjects];
+
+  if (resultlist != nil) {
+    NSEnumerator* resultlist_enumerator = [resultlist objectEnumerator];
+    GSResultItem* resultitem;
+    while (resultitem = [resultlist_enumerator nextObject]) {
+
+      SearchTableCell* cell = [[SearchTableCell alloc] init];
+      
+      NSString* resultoid = [resultitem oid];
+
+      NSString* resulttitle = [resultitem title];
+      if (resulttitle == nil) {
+	// doesn't have a valid title 
+	resulttitle = [[NSString alloc] initWithString:@"Unknown Title"];
+      }
+
+      NSString* resulturl = [resultitem srcurl];
+      if (resulturl == nil) { // **** don't need to do this check now
+	// doesn't have a valid srcurl => set as the empty string
+	resulturl = [[NSString alloc] initWithString:@""];
+      }
+
+      [cell setTitle:resulttitle];
+      [_cellResultList addObject:cell];
+      [_oidItem addObject:resultitem];
+
+      [cell release];
+    }
+    [resultlist release];
+  }
+
+  // Update the table contents.
+  [_table reloadData];
+}
+
+
+
+//***********
+//* Delegates 
+//***********
+
+-(void) navigationBar:(UINavigationBar*)navbar buttonClicked:(int)button
+{
+  switch (button) 
+  {
+    case 1:  // left
+      [GreenstoneApplication setInCollection:nil];
+      [GreenstoneApplication transitionView:UITransitionBothShiftRight 
+          fromView:self toView:_parent];
+      break;
+
+    default:
+      NSLog(@"Unrecognised navbar button = %d",button);
+      break;
+  }
+}
+
+
+- (void)tableRowSelected:(NSNotification*)notification
+{
+  UITable* table = [notification object];
+  int rowId = [table selectedRow];
+
+  SearchTableCell* pCell = [table cellAtRow:rowId column:0];
+  [pCell setSelected:FALSE withFade:TRUE];
+
+  GSResultItem* oidItem = [_oidItem objectAtIndex:rowId];
+
+  NSString* oid = [oidItem oid];
+  NSString* srcurl = [oidItem srcurl];
+
+  NSURL *url = [NSURL alloc];
+
+  if (srcurl == nil) {
+
+    NSTimer *timer = [ NSTimer scheduledTimerWithTimeInterval: 0.3
+			 target: self
+			 selector: @selector(asynchronousLoad:)
+			 userInfo: oid
+			 repeats: NO ];
+    url = [url initWithString:@"file:///var/gsdl/loading.html"];
+
+    /* *****
+    GreenstoneAPI* greenstoneAPI = [GreenstoneApplication greenstoneAPI];
+    NSString* doctext = greenstoneAPI->getResolvedDocument(_collection,oid);
+    [doctext writeToFile:@"/tmp/gsdoc.html" atomically:NO encoding:NSUTF8StringEncoding error:nil];
+
+    // make sure file is writable by all 
+    // => allows for switching between running from command line and Springboard
+    system("chmod a+rw /tmp/gsdoc.html"); 
+
+    url = [url initWithString:@"file:///tmp/gsdoc.html"];
+    */
+
+  }
+  else {
+    NSString* fullurlstr = [[NSString alloc] initWithFormat:@"file://%@",srcurl];
+    url = [url initWithString:fullurlstr]; 
+  }
+
+  int transStyle = UITransitionBothShiftLeft;   
+  [GreenstoneApplication showWebView:transStyle fromView:self withURL:url];
+
+}
+
+-(void) asynchronousLoad:(NSTimer*)timer
+{
+  // **** This is identical to one in BrowseCascadeMenu
+  NSString* childGID = [timer userInfo];
+
+  GreenstoneAPI* greenstoneAPI = [GreenstoneApplication greenstoneAPI];
+  NSString* doctext = greenstoneAPI->getResolvedDocument(_collection,childGID);
+
+  [doctext writeToFile:@"/tmp/gsdoc.html" atomically:NO encoding:NSUTF8StringEncoding error:nil];
+  NSURL* url = [[NSURL alloc] initWithString:@"file:///tmp/gsdoc.html"];
+  system("chmod a+rw /tmp/gsdoc.html"); 
+
+  [GreenstoneApplication showWebView:0 fromView:self withURL:url];
+}
+
+
+- (int) numberOfRowsInTable: (UITable *)table
+{
+  return [_cellResultList count];
+}
+
+
+- (UITableCell *) table: (UITable *)table cellForRow: (int)row column: (int)col
+{
+  return [_cellResultList objectAtIndex:row];
+}
+
+- (UITableCell *) table: (UITable *)table cellForRow: (int)row column: (int)col reusing: (BOOL) reusing
+{
+  return [self table: table cellForRow: row column: col];
+}
+
+- (void)keyboardInputChangedSelection:(id)whatisthis
+{
+  // when i tap the search field, hide if keyboard is already there, or show if it isn't
+  if (!_keyboardVisible)
+    [self ShowKeyboard];
+}
+
+-(void)keyboardInput:(id)k shouldInsertText:(id)i isMarkedText:(int)b
+{
+  if ([i characterAtIndex:0] == 0xA) {
+    [self keyboardReturnPressed];
+
+    NSString* query = [_searchBox text];
+    [self performQuery:query];
+  }
+}
+
+- (void)scrollerWillStartDragging:(id)whatisthis
+{
+  // hide keyboard when start scrolling
+  if (_keyboardVisible)
+    [self HideKeyboard];
+}
+
+// --- KEYBOARD METHODS -----------------------------------------------
+
+- (void)keyboardReturnPressed
+{
+  [self HideKeyboard];
+}
+
+- (void)ShowKeyboard
+{
+  _keyboardVisible = YES;
+  
+  CGRect startFrame;
+  CGRect endFrame;
+  NSMutableArray *animations = [[NSMutableArray alloc] init];
+  
+  endFrame = CGRectMake(0.0f, 410 - [UIKeyboard defaultSize].height, 320, [UIKeyboard defaultSize].height);
+  startFrame = endFrame;
+  startFrame.origin.y = 245.0 + 216.;
+  
+  [_keyboard setFrame:startFrame];
+  
+  UIFrameAnimation *keyboardAnimation = [[UIFrameAnimation alloc] initWithTarget:_keyboard];
+  [keyboardAnimation setStartFrame:startFrame];
+  [keyboardAnimation setEndFrame:endFrame];
+  [keyboardAnimation setSignificantRectFields:2];
+  [keyboardAnimation setDelegate:self];
+  [animations addObject:keyboardAnimation];
+  [keyboardAnimation release];
+  
+  [[UIAnimator sharedAnimator] addAnimations:animations withDuration:.5 start:YES];
+}
+
+- (void)HideKeyboard
+{
+  _keyboardVisible = NO;
+  
+  CGRect startFrame;
+  CGRect endFrame;
+  NSMutableArray *animations = [[NSMutableArray alloc] init];
+  
+  startFrame = CGRectMake(0, 410 - [UIKeyboard defaultSize].height, 320, [UIKeyboard defaultSize].height);
+  endFrame = startFrame;
+  endFrame.origin.y = 245.0 + 216.;
+  
+  [_keyboard setFrame:startFrame];
+  
+  UIFrameAnimation *keyboardAnimation = [[UIFrameAnimation alloc] initWithTarget:_keyboard];
+  [keyboardAnimation setStartFrame:startFrame];
+  [keyboardAnimation setEndFrame:endFrame];
+  [keyboardAnimation setSignificantRectFields:2];
+  [keyboardAnimation setDelegate:self];
+  [animations addObject:keyboardAnimation];
+  [keyboardAnimation release];
+  
+  [[UIAnimator sharedAnimator] addAnimations:animations withDuration:.5 start:YES];
+}
+
+
+-(void) dealloc
+{
+  [_oidItem release];
+
+  [_collection release];
+
+  [super dealloc];
+}
+
+@end
+
Index: /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/SimpleWebView.h
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/SimpleWebView.h	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/SimpleWebView.h	(revision 24799)
@@ -0,0 +1,40 @@
+/*
+        By: Sean Heber  <sean@spiffytech.com>, J. Zdziarski
+        iApp-a-Day - November, 2007
+        BSD License
+*/
+#import <UIKit/UIKit.h>
+#import <UIKit/UIScroller.h>
+#import <UIKit/UIWebView.h>
+
+@interface MyWebView : UIWebView
+{
+
+}
+-(void) gestureEnded:(struct __GSEvent *)event;
+-(void) doubleTap:(struct __GSEvent *)event;
+
+@end
+
+@interface SimpleWebView : UIView {
+  UIView* _parent;
+  MyWebView *webView;
+  UIScroller *scroller;
+  NSURLRequest *urlRequest;
+
+  CGSize lastSize, size;
+}
+
+-(id)initWithFrame:(CGRect)frame;
+-(id)initWithFrame:(CGRect)frame withParent:(UIView*)parent;
+
+-(void) setParent:(UIView*)parent;
+
+-(id) loadURL:(NSURL*)url;
+
+
+
+-(void) dealloc;
+@end
+
+
Index: /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/SimpleWebView.mm
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/SimpleWebView.mm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/SimpleWebView.mm	(revision 24799)
@@ -0,0 +1,194 @@
+/* BSD License: Based on SimpleWebView by Sean Heber  <sean@spiffytech.com>, J. Zdziarski  */
+
+#include <sys/select.h>
+
+#import <UIKit/UIView-Geometry.h>
+#import <UIKit/UIView-Rendering.h>
+
+#import "GreenstoneApplication.h"
+#import "SimpleWebView.h"
+
+// ****** change name away from SimpleWebView
+
+
+@implementation MyWebView
+- (void) gestureEnded:(struct __GSEvent *)event
+{
+    [ super gestureEnded: event ];
+    [ _delegate gestureEnded: event ];
+}
+
+- (void) doubleTap:(struct __GSEvent *)event
+{
+    [ super doubleTap: event ];
+    [ _delegate doubleTap: event ];
+}
+
+
+@end
+
+
+@implementation SimpleWebView
+
+-(void)view: (UIView*)v didSetFrame:(CGRect)f
+{
+    if (v == webView) {
+        [ scroller setContentSize: f.size ];
+    }
+}
+
+-(void)view:(id)v didDrawInRect:(CGRect)f duration:(float)d
+{
+    if (v == webView) {
+        size = [ webView bounds ].size;
+        if (size.height != lastSize.height
+        || size.width != lastSize.width)
+        {
+            lastSize = size;
+            [ scroller setContentSize: size ];
+        }
+    }
+}
+
+- (void)gestureEnded:(struct __GSEvent *)event {
+    [ webView redrawScaledDocument ];
+    [ webView setNeedsDisplay ];
+    [ scroller setContentSize: [ webView bounds ].size ];
+}
+
+- (void)doubleTap:(struct __GSEvent *)event {
+    struct timeval tv;
+    tv.tv_sec = 2;
+    tv.tv_usec = 0;
+    select(NULL, NULL, NULL, NULL, &tv);
+    [ webView redrawScaledDocument ];
+    [ webView setNeedsDisplay ];
+    [ scroller setContentSize: [ webView bounds ].size ];
+}
+
+
+-(void)dealloc
+{
+        [ urlRequest release ];
+        [ webView release ];
+        [ scroller release ];
+
+        [ super dealloc ];
+}
+
+-(id)initWithFrame: (CGRect)frame
+{
+  return [self initWithFrame:frame withParent:nil];
+}
+
+
+-(id)initWithFrame: (CGRect)frame withParent:(UIView*)parent
+{
+    [ super initWithFrame: frame ];
+
+    _parent = parent;
+    urlRequest = nil;
+
+    int frame_x_dim = frame.size.width;
+    int frame_y_dim = frame.size.height;
+
+    int nav_x_org = 0.0f;
+    int nav_y_org = 0.0f;
+    int nav_x_dim = frame_x_dim;
+    int nav_y_dim = TOP_NAVBAR_HEIGHT;
+    
+    CGRect navrect = CGRectMake(nav_x_org,nav_y_org,nav_x_dim,nav_y_dim);
+    UINavigationBar* navbar = [[UINavigationBar alloc] initWithFrame: navrect];
+
+    [navbar showButtonsWithLeftTitle:@"Back" rightTitle:nil leftBack:YES];
+    [navbar enableAnimation];
+    [navbar setBarStyle: 2];  // Dark, transparent // ****
+    [navbar setDelegate: self];
+
+    int scroll_x_org = 0.0f;
+    int scroll_y_org = 0.0f;
+    int scroll_x_dim = frame_x_dim;
+    int scroll_y_dim = frame_y_dim;
+
+    CGRect scrollrect = CGRectMake(scroll_x_org,scroll_y_org,scroll_x_dim,scroll_y_dim);
+
+    scroller = [ [ UIScroller alloc ] initWithFrame: scrollrect ];
+    [ scroller setScrollingEnabled: YES ];
+    [ scroller setAdjustForContentSizeChange: YES ];
+    [ scroller setClipsSubviews: NO ];
+    [ scroller setAllowsRubberBanding: YES ];
+    [ scroller setDelegate: self ];
+
+    webView = [ [ MyWebView alloc ] initWithFrame: [ scroller bounds ] ];
+    [ webView setTilingEnabled: YES ];
+    [ webView setTileSize: scrollrect.size ];
+    [ webView setAutoresizes: YES];
+    [ webView setDelegate: self];
+    [ webView setEnabledGestures: 0xFF ];
+    [ webView setSmoothsFonts: YES ];
+
+
+    [ self addSubview: scroller ];
+    [ scroller addSubview: webView ];
+
+    [self addSubview: navbar];
+	
+    return self;
+}
+
+
+-(void) setParent:(UIView*)parent
+{
+  _parent = parent;
+}
+
+
+-(id) loadURL:(NSURL*)url
+{
+    CGPoint zero;
+    zero.x = zero.y = 0;
+    [scroller scrollPointVisibleAtTopLeft: zero];
+
+    if (urlRequest != nil) { // ***** 
+      [urlRequest release];
+      urlRequest = nil;
+    }
+
+    urlRequest = [[NSURLRequest requestWithURL:url] retain];
+    [webView loadRequest:urlRequest];
+}
+
+
+//***********
+//* Delegates
+//***********
+
+
+
+-(void) navigationBar:(UINavigationBar*)navbar buttonClicked:(int)button 
+{
+  switch (button) 
+  {
+    case 1:  // left
+      if (_parent != nil) {
+	// only do transition if there is a parent view to go back to
+	int transStyle = UITransitionBothShiftRight;
+	[GreenstoneApplication transitionView:transStyle fromView:self toView:_parent];
+      }
+
+      // need to think about deallocating self? // *****
+      break;
+
+    default:
+      NSLog(@"Unrecognised button = %d",button);
+      break;
+  }
+}
+
+@end
+
+
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/greenstone.mm
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/greenstone.mm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/greenstone.mm	(revision 24799)
@@ -0,0 +1,12 @@
+
+#import "GreenstoneApplication.h"
+
+int main(int argc, char **argv)
+{
+    NSAutoreleasePool* autoreleasePool = [[NSAutoreleasePool alloc] init];
+    int retVal = UIApplicationMain(argc, argv, [GreenstoneApplication class]);
+
+    [autoreleasePool release];
+    return retVal;
+
+}
Index: /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/loading.html
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/loading.html	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/loading.html	(revision 24799)
@@ -0,0 +1,8 @@
+<html>
+  <head>
+  </head>
+  <body>
+    <p><br><br>
+    <p>Loading ...
+  </body>
+</html>
Index: /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/respring.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/respring.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-1.x/trunk/respring.sh	(revision 24799)
@@ -0,0 +1,3 @@
+ps auxww | grep Spring | grep mobile | awk '{print $1}'}' 2}'
+
+/SpringBoard.app/SpringBoard
Index: /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/AppDefs.h
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/AppDefs.h	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/AppDefs.h	(revision 24799)
@@ -0,0 +1,29 @@
+
+#define TOP_NAVBAR_HEIGHT 45.0f
+#define BOT_NAVBAR_HEIGHT 40.0f
+
+enum UIButtonBarStyle 
+{
+  barstyleBlue = 0, barstyleBlack = 1, barstyleTransparent=2
+};
+
+
+typedef enum
+{
+  UITransitionNothing = 0,
+  UITransitionBothShiftLeft = 1,
+  UITransitionBothShiftRight = 2,
+  UITransitionBothShiftUp = 3,
+  UITransitionError4 = 4,
+  UITransitionCurrentShiftDown = 5,
+  UITransitionError6 = 6,
+  UITransitionBothShiftDown = 7,
+  UITransitionNextShiftUp = 8,
+  UITransitionNextShiftDown = 9
+} UITransitionStyle;
+
+enum GSButtonBarEnum
+{
+  GSBBBrowse=1, GSBBQuery=2, GSBBPref=3
+};
+
Index: /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/BrowseCascadeView.h
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/BrowseCascadeView.h	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/BrowseCascadeView.h	(revision 24799)
@@ -0,0 +1,22 @@
+
+#import "Foundation/NSTimer.h"
+#import "MenuCascadeView.h"
+
+@interface BrowseCascadeView: MenuCascadeView 
+{}
+
+-(UIView*) directEntry:(int)rowId;
+
+-(void) browseListToMenuItems:(NSMutableArray*)browseList withCollection:(NSString*)collection withGID:(NSString*)gid;
+
+-(void) createChildMenu:(NSString*)collection withTitle:(NSString*)title withGID:(NSString*)gid 
+           withBrowseList:(NSMutableArray*) browseList;
+
+-(void) tableRowSelected:(NSNotification*)notification;
+
+-(void) asynchronousLoad:(NSTimer*)timer;
+
+-(void) navigationBar:(UINavigationBar*)navbar buttonClicked:(int)button;
+
+
+@end
Index: /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/BrowseCascadeView.mm
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/BrowseCascadeView.mm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/BrowseCascadeView.mm	(revision 24799)
@@ -0,0 +1,210 @@
+
+#import <Foundation/Foundation.h>
+
+#import <UIKit/CDStructures.h>
+#import <UIKit/UIKit.h>
+#import <UIKit/UITable.h>
+#import <UIKit/UIProgressIndicator.h>
+
+#import "GreenstoneApplication.h"
+#import "GreenstoneAPI.h"
+//#import "SimpleWebView.h"
+#import "GSResultItem.h"
+
+#import "BrowseCascadeView.h"
+
+// ***** think about coding for orientation of iPod!!!!
+
+@implementation BrowseCascadeView
+
+
+-(UIView*) directEntry:(int)rowId
+{
+  return self;
+}
+
+
+-(void) browseListToMenuItems:(NSMutableArray*)browseList withCollection:(NSString*)collection withGID:(NSString*)gid
+{  
+  GreenstoneAPI* greenstoneAPI = [GreenstoneApplication greenstoneAPI];
+
+  NSEnumerator* browselist_enumerator = [browseList objectEnumerator];
+  NSString* childname;
+  while (childname = [browselist_enumerator nextObject]) {
+    NSString* childGID = [NSString alloc];
+
+    if (gid==nil) {
+      childGID = [childGID initWithString:childname];
+    }
+    else if ([childname hasPrefix:@"."]==NO) {
+      childGID = [childGID initWithString:childname];
+    }
+    else {
+      childGID = [childGID initWithFormat:@"%@%@",gid,childname]; 
+    }
+
+    GreenstoneApplication* toplevelApp = [GreenstoneApplication toplevelApp];
+    NSString* lang = [toplevelApp languagePref];
+    //greenstoneAPI->setLanguage(lang); // *****
+    greenstoneAPI->setLanguage("en"); 
+
+    // look up Title metadata for child's GID, and use that to display on menu
+    NSString* textTitle = nil;
+    if ([childGID hasPrefix:@"CL"]==YES) {
+      textTitle = greenstoneAPI->getMetadataFirst(collection,childGID,@"Title");
+    }
+    else {
+      // Try for dc.Title first as generally better quality than ex.Title
+      textTitle = greenstoneAPI->getMetadataFirst(collection,childGID,@"dc.Title");
+      if (textTitle == nil) {
+	textTitle = greenstoneAPI->getMetadataFirst(collection,childGID,@"Title");
+      }
+    }
+
+    [(BrowseCascadeView*)_childMenu appendMenuItem:self withItem:textTitle withGID:childGID];      
+
+  }
+}
+
+-(void) createChildMenu:(NSString*)collection withTitle:(NSString*)title withGID:(NSString*)gid 
+            withBrowseList:(NSMutableArray*) browseList
+{
+  CGRect rect = [GreenstoneApplication workAreaRect];  
+
+  // The following check isn't strictly necessary, if _childMenu is released and set to nil
+  // when you transition back to the parent
+  if (_childMenu != nil) {
+    // [_childMenu release];  // *****
+  }
+
+  _childMenu = [BrowseCascadeView alloc];
+  _childMenu = [(BrowseCascadeView*)_childMenu initWithFrame:rect withParent:self withCollection:collection withTitle:title withGID:gid]; 
+
+  [self browseListToMenuItems:browseList withCollection:collection withGID:gid];
+}
+
+
+
+-(void) tableRowSelected:(NSNotification*)notification
+{
+  UITable* table = [notification object];
+  int rowId = [table selectedRow];
+
+  UITableCell* cell = [table cellAtRow:rowId column:0];
+  [cell setSelected:FALSE withFade:TRUE];
+
+
+  GreenstoneAPI* greenstoneAPI = [GreenstoneApplication greenstoneAPI];
+  NSString* childTitle = [[_oidItem objectAtIndex:rowId] title];
+  int transStyle = UITransitionBothShiftLeft;
+
+  GreenstoneApplication* toplevelApp = [GreenstoneApplication toplevelApp];
+  NSString* lang = [toplevelApp languagePref];
+  //greenstoneAPI->setLanguage(lang); // ***** make it a param (with default) to calling fns
+  greenstoneAPI->setLanguage("en");
+
+  // Initialise with child menu
+
+  if (_collection == nil) {
+    // Root node to Browse Greenstone collections
+    NSString* childGID = [[_oidItem  objectAtIndex:rowId] oid]; 
+
+    NSString* chosenCollection = [[NSString alloc] initWithString:childGID];
+
+    NSMutableArray* classifierList = greenstoneAPI->browseToplevelList(chosenCollection);
+    [self createChildMenu:chosenCollection withTitle:childTitle withGID:nil withBrowseList:classifierList];
+    [classifierList release]; 
+
+    [GreenstoneApplication setInCollection:chosenCollection];
+    [GreenstoneApplication transitionView:transStyle fromView:self toView:_childMenu];
+  }
+  else {
+    NSString* childGID = [[_oidItem  objectAtIndex:rowId] oid]; 
+
+    if ([childGID hasPrefix:@"CL"]==YES) {
+      // Note this test is potentially flawed if a document ID starts CL...
+      // Allow this for now, since default is for it to be HASH 
+
+      NSMutableArray* classifierList = greenstoneAPI->browseClassifierList(_collection,childGID);
+
+      NSString* chosenCollection = [[NSString alloc] initWithString:_collection];
+      [self createChildMenu:chosenCollection withTitle:childTitle withGID:childGID withBrowseList:classifierList];
+      [classifierList release]; 
+
+      [GreenstoneApplication transitionView:transStyle fromView:self toView:_childMenu];
+    }
+    else {
+      NSString* childGID = [[_oidItem  objectAtIndex:rowId] oid]; 
+
+      NSString* srcurl = greenstoneAPI->getSrcUrlMetadata(_collection,childGID);
+      NSURL* url = [NSURL alloc];
+
+      if (srcurl == nil) {
+
+	NSTimer *timer = [ NSTimer scheduledTimerWithTimeInterval: 1.0 // used to be 0.3, then 0.5
+			 target: self
+			 selector: @selector(asynchronousLoad:)
+			 userInfo: childGID
+			 repeats: NO ];
+
+	url = [url initWithString:@"file:///var/code/gs2-runtime-svn/ext/iOS3.x/loading.html"]; // **** make it use proper gsdlhome
+
+      }
+      else {
+	NSString* fullurlstr = [[NSString alloc] initWithFormat:@"file://%@",srcurl];
+
+	url = [url initWithString:fullurlstr];
+	NSLog(@"** opening src URL= %@",fullurlstr);
+
+      }
+      [GreenstoneApplication showWebView:transStyle fromView:self withURL:url];
+
+    }
+  }
+}
+
+
+
+
+-(void) asynchronousLoad:(NSTimer*)timer
+{
+  NSString* childGID = [timer userInfo];
+
+  [GreenstoneApplication startWebViewBusy];
+
+  GreenstoneAPI* greenstoneAPI = [GreenstoneApplication greenstoneAPI];
+  GreenstoneApplication* toplevelApp = [GreenstoneApplication toplevelApp];
+  NSString* lang = [toplevelApp languagePref];
+  //greenstoneAPI->setLanguage(lang); // ***** make param
+  greenstoneAPI->setLanguage("en"); 
+
+  NSString* doctext = greenstoneAPI->getResolvedDocument(_collection,childGID);
+
+  [doctext writeToFile:@"/tmp/gsdoc.html" atomically:NO encoding:NSUTF8StringEncoding error:nil];
+  NSURL* url = [[NSURL alloc] initWithString:@"file:///tmp/gsdoc.html"];
+  system("chmod a+rw /tmp/gsdoc.html"); 
+  
+  [GreenstoneApplication loadURL:url];
+  // [GreenstoneApplication showWebView:0 fromView:self withURL:url]; // ****
+
+  [GreenstoneApplication stopWebViewBusy];
+}
+
+
+-(void) navigationBar:(UINavigationBar*)navbar buttonClicked:(int)button 
+{
+  NSLog(@"_gid = %@",_gid);
+
+  switch (button) 
+  {
+    case 1:  // left button (back)
+      // if ([_gid hasPrefix:@"CL"]==YES) { // ****
+      if (_gid == nil) {
+	[GreenstoneApplication setInCollection:nil];
+      }
+      break;
+  }
+
+  [super navigationBar:navbar buttonClicked:button];
+}
+@end
Index: /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/GSResultItem.h
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/GSResultItem.h	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/GSResultItem.h	(revision 24799)
@@ -0,0 +1,24 @@
+
+#import <Foundation/NSString.h>
+
+
+// ***** rename to OIDItem
+// replace all gid with oid ...
+
+@interface GSResultItem: NSObject
+{
+  NSString* _oid;
+  NSString* _title;
+  NSString* _srcurl;
+}
+
+-(id) initWithOID:(NSString*)oid withTitle:(NSString*)title;
+-(id) initWithOID:(NSString*)oid withTitle:(NSString*)title withSrcUrl:(NSString*)srcurl;
+
+-(NSString*) oid;
+-(NSString*) title;
+-(NSString*) srcurl;
+
+-(void) dealloc;
+
+@end
Index: /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/GSResultItem.mm
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/GSResultItem.mm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/GSResultItem.mm	(revision 24799)
@@ -0,0 +1,59 @@
+#import "GSResultItem.h"
+
+@implementation GSResultItem
+
+-(id) initWithOID:(NSString*)oid withTitle:(NSString*)title
+{
+  return [self initWithOID:oid withTitle:title withSrcUrl:nil];
+}
+
+-(id) initWithOID:(NSString*)oid withTitle:(NSString*)title withSrcUrl:(NSString*)srcurl
+{
+  self = [super init];
+
+  _oid = oid;
+  _title = title;
+  _srcurl = srcurl;
+
+  return self;
+}
+
+-(NSString*) oid
+{
+  return _oid;
+}
+
+-(NSString*) title 
+{
+  return _title;
+}
+
+-(NSString*) srcurl
+{
+  return _srcurl;
+}
+
+
+/*
+-(void) printUnused // ******
+{
+  printf("(");
+  [_oid print];
+  printf(",");
+  [_title print];
+  printf(",");
+  [_srcurl print];
+  printf(")");
+}
+*/
+
+-(void) dealloc
+{
+  [_oid release];
+  [_title release];
+  [_srcurl release];
+
+  [super dealloc];
+}
+
+@end
Index: /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/GreenstoneAPI.h
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/GreenstoneAPI.h	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/GreenstoneAPI.h	(revision 24799)
@@ -0,0 +1,66 @@
+#include "fileutil.h"
+#include "nullproto.h"
+#include "collectset.h"
+
+#import <Foundation/NSArray.h>
+
+#import <UIKit/UIApplication.h>
+
+class GreenstoneAPI
+{
+ public:
+  GreenstoneAPI(UIApplication* toplevelApp);
+  virtual ~GreenstoneAPI();
+
+  bool sanityCheck();
+  NSMutableArray* collectionList();
+  ColInfoResponse_t& collectInfo (const text_t& collection);
+  ColInfoResponse_t& collectInfo (NSString* nscollection);
+
+  void setLanguage(const text_t& lang) { _lang = lang; }
+
+  NSString* collectionmetaValue(ColInfoResponse_t& colinfo, text_t key);
+  NSString* collectionName(ColInfoResponse_t& colinfo);
+
+  NSString* getDocument(NSString* nscollection, NSString* nsgid); // ******
+  NSString* getResolvedDocument(NSString* nscollection, NSString* nsgid);
+
+  NSMutableArray* getMetadata(NSString* nscollection, NSString* nsgid, NSString* nsmetaname);
+  NSString* getMetadataFirst(NSString* nscollection, NSString* nsgid, NSString* nsmetaname);
+  NSString* getMetadataFirst(const text_t& collection, text_t& gid, text_t& metaname);
+
+  NSString* getSrcUrlMetadata(NSString* nscollection, NSString* nsgid);
+
+  NSMutableArray* browseClassifierList(NSString* nscollection, NSString* nsgid);
+  NSMutableArray* browseToplevelList(NSString* nscollection);
+
+  NSMutableArray* query(NSString* nscollection, NSString* nsquery);
+
+
+  
+  void alert(NSString* nslevel, NSString* nsmessage);
+  void alert(char* level, char* message);
+  void alert(text_t level, text_t message);
+
+ protected:
+  text_t resolveUrls(const text_t& unresolved, const text_t& collection, const text_t& archivedir);
+  text_t srclinkToUrl(const text_t& srclink, const text_t& collection, const text_t& archivedir);
+
+  bool recurse_contents(const text_t& collection, ResultDocInfo_t& section,
+			text_tset& metadata, text_t& output_text);
+
+
+  void set_queryfilter_options (const text_t& collection, FilterRequest_t &request, const text_t &querystring);
+  NSMutableArray* filterResponseToTitlesList(const text_t& collection, FilterResponse_t &sections);
+  NSMutableArray* search_single_collection (const text_t& collection, const text_t& query);
+
+ protected:
+  UIApplication* _toplevelApp;
+  text_t _lang;
+
+  collectset*   _cservers;
+  nullproto*    _nproto;
+  text_t        _gsdlhome;
+  text_t        _collecthome;
+};
+
Index: /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/GreenstoneAPI.mm
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/GreenstoneAPI.mm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/GreenstoneAPI.mm	(revision 24799)
@@ -0,0 +1,827 @@
+
+#include <unistd.h>
+#include <sys/dir.h>
+
+#include "gsdlsitecfg.h"
+#include "recptprototools.h"
+
+#import <Foundation/NSString.h>
+#import <Foundation/NSArray.h>
+
+#import <UIKit/UIKit.h>
+
+#import "GSResultItem.h"
+#import "GreenstoneAPI.h"
+
+GreenstoneAPI::GreenstoneAPI(UIApplication* toplevelApp) 
+  : _toplevelApp(toplevelApp), _lang("en"),
+    _cservers(nil), _nproto(nil), _gsdlhome(), _collecthome()
+{
+  _cservers = new collectset(_gsdlhome,_collecthome); // sets gsdlhome and collecthome
+
+  cerr << "gsdlhome = " << _gsdlhome << endl;
+  cerr << "collecthome = " << _collecthome << endl;
+
+  // set up the null protocol
+  _nproto = new nullproto();
+  _nproto->set_collectset(_cservers);
+
+  comerror_t comerr = noError;
+  bool init_status = _nproto->init(comerr,cerr);
+  if (init_status==false) {
+    alert("Null Proto","null proto init returned false");
+  }
+
+  if (comerr!=noError) {
+    text_t error_message = get_comerror_string (comerr);
+    alert("Protocol Init Error",error_message);
+  }
+
+}
+
+
+GreenstoneAPI::~GreenstoneAPI()
+{
+  delete _cservers;
+  delete _nproto;
+
+}
+
+void GreenstoneAPI::alert(NSString* nslevel, NSString* nsmessage)
+{
+  // Alert sheet displayed at centre of screen.
+
+  NSArray *buttons = [NSArray arrayWithObjects:@"OK", nil];
+  UIActionSheet *alertSheet = [UIActionSheet alloc];
+  [alertSheet initWithTitle:nslevel buttons:buttons 
+    defaultButtonIndex:1 delegate:_toplevelApp context:nil];
+
+  [alertSheet setBodyText:nsmessage];
+  [alertSheet popupAlertAnimated:YES];
+}
+
+
+void GreenstoneAPI::alert(char* level, char* message)
+{
+  // Alert sheet displayed at centre of screen.
+
+  NSString* nslevel = [[NSString alloc] initWithCString: level];
+  NSString* nsmessage = [[NSString alloc] initWithCString: message];
+
+  alert(nslevel,nsmessage);
+
+  [nslevel release];
+  [nsmessage release];
+}
+
+void GreenstoneAPI::alert(text_t level, text_t message)
+{
+  char* level_cstr = level.getcstr();
+  char* message_cstr = message.getcstr();
+
+  alert(level_cstr,message_cstr);
+
+  delete [] level_cstr;
+  delete [] message_cstr;
+}
+
+bool GreenstoneAPI::sanityCheck()
+{  
+  text_t gsdl_home, unused_collecthome;
+  text_t unused_httpdomain,unused_httpprefix;
+  if (!site_cfg_read(gsdl_home,unused_collecthome,
+		     unused_httpdomain,unused_httpprefix)) {
+    // couldn't find gsdlsite.cfg file    
+
+    char cwd[128];
+    getcwd(cwd,128);
+
+    text_t sitecfg_filename = cwd;
+    sitecfg_filename += "gsdlsite.cfg"; 
+    
+    alert("Error","Unable to find " + sitecfg_filename );
+    return false;
+  }
+
+  text_t collect_dir = filename_cat(gsdl_home,"collect");
+  char* collect_dir_cstr = collect_dir.getcstr();
+
+  DIR* directorypointer = opendir(collect_dir_cstr);	
+  delete [] collect_dir_cstr;
+
+  if(directorypointer == NULL)	//If the directory could not be opened
+    {  
+      text_t mess = "No collections directory.  Please make one at: " + collect_dir;
+      alert("Error",mess);
+      return false;
+    }
+ 
+  return true;
+}
+
+
+NSMutableArray* GreenstoneAPI::collectionList()
+{
+  text_tarray collection_list;
+  comerror_t comerr;
+  
+  _nproto->get_collection_list (collection_list, comerr, cerr);
+
+  if (comerr != noError) {
+    alert("Error",get_comerror_string(comerr));
+    return nil;
+  }
+
+  int num_cols = collection_list.size();
+
+  NSMutableArray* nscollist = [[NSMutableArray alloc] initWithCapacity:num_cols];
+
+  text_tarray::iterator collection_iterator = collection_list.begin();
+  while (collection_iterator != collection_list.end())
+  {
+    text_t& colname = *collection_iterator;
+    char* colname_cstr = colname.getcstr();
+    NSString* nscolname = [[NSString alloc ] initWithCString: colname_cstr];
+    delete [] colname_cstr;
+
+    [nscollist addObject:nscolname];
+
+    collection_iterator++;
+  }
+
+  return nscollist;
+}
+
+ColInfoResponse_t& GreenstoneAPI::collectInfo (const text_t &collection)
+{
+  ColInfoResponse_t& collectinfo = *new ColInfoResponse_t();
+  comerror_t comerr;
+  _nproto->get_collectinfo(collection, collectinfo,comerr, cerr);
+
+  if (comerr != noError) {
+    alert("Error",get_comerror_string(comerr));
+  }
+
+  return collectinfo;
+}
+
+ColInfoResponse_t& GreenstoneAPI::collectInfo (NSString* nscollection)
+{
+  char const* nscollection_cstr  = [nscollection UTF8String]; 
+
+  ColInfoResponse_t& colinfo = collectInfo(nscollection_cstr);
+
+  // according to documentation, nscollectcion_cstr autorealeased
+  // => don't need to free them
+  return colinfo;
+}
+
+/* ****
+text_t GreenstoneAPI::lookupLanguagePref()
+{
+  NSString* nslang = [(GreenstoneApplication*)_toplevelApp languagePref];
+  char* lang_cstr = [nslang UTF8String];
+  text_t lang = lang_cstr;
+  [nslang release];
+
+  return lang;
+}
+*/
+
+NSString* GreenstoneAPI::collectionmetaValue(ColInfoResponse_t& colinfo,
+					     text_t key)
+{
+  text_t val = colinfo.get_collectionmeta(key,_lang);
+  char* val_cstr = val.getcstr();
+
+  NSString* nsval = [[NSString alloc] initWithCString:val_cstr];
+  delete [] val_cstr;
+
+
+  return nsval;
+}
+
+
+NSString* GreenstoneAPI::collectionName(ColInfoResponse_t& colinfo)
+{
+  return collectionmetaValue(colinfo,"collectionname");
+}
+
+
+NSString* TextTToNSString(text_t& text)
+{
+  // Make this available to other parts of program!!!
+  if (text.empty()) { return nil; }
+
+  char* text_cstr = text.getcstr();
+  NSString* nstext = [[NSString alloc ] initWithCString: text_cstr];
+  delete [] text_cstr;
+
+  return nstext;
+}
+
+bool GreenstoneAPI::recurse_contents(const text_t& collection, ResultDocInfo_t& section,
+				     text_tset& metadata, text_t& output_text)
+{  
+  // Output this section 
+  	
+  // 1. Get the title
+
+  text_t title = section.metadata["Title"].values[0];
+  output_text.append("<h3>"+title+"</h3>");
+
+  // cerr << "**** Title = " << title << endl;
+
+  // 2. Get the text
+  DocumentRequest_t docrequest;
+  DocumentResponse_t docresponse;
+  comerror_t comerr;
+  docrequest.OID = section.OID;
+
+  _nproto->get_document(collection, docrequest, docresponse, comerr, cerr);
+
+  if (comerr != noError) {
+    alert("Error",get_comerror_string(comerr));
+    return false;
+  }
+
+  output_text.append(docresponse.doc);
+	
+  // cerr << "*** appending text " << docresponse.doc << endl;
+
+  int haschildren = section.metadata["haschildren"].values[0].getint();
+  	
+  // recurse through children
+  if (haschildren == 1)
+    {
+      bool getParents = false;
+      FilterResponse_t tmp;
+
+      get_children (section.OID, collection, _lang, metadata, getParents, _nproto, tmp, cerr);
+      ResultDocInfo_tarray::iterator thisdoc = tmp.docInfo.begin();
+      ResultDocInfo_tarray::iterator lastdoc = tmp.docInfo.end();
+      
+      while (thisdoc != lastdoc) 
+	{
+	  bool recurse_ok = recurse_contents(collection,*thisdoc, metadata, output_text);
+	  if (!recurse_ok) {
+	    return false;
+	  }
+	  ++thisdoc;
+	}
+    }
+	
+  return true;
+}
+
+
+NSString* GreenstoneAPI::getResolvedDocument(NSString* nscollection, NSString* nsgid)
+{
+  char const* nscollection_cstr  = [nscollection UTF8String]; 
+  char const* nsgid_cstr         = [nsgid UTF8String]; 
+
+  text_t collection(nscollection_cstr);
+  text_t gid(nsgid_cstr);
+
+  //metadata elements needed by recurse_contents
+  text_tset metadata;
+  metadata.insert ("Title");
+  metadata.insert ("haschildren");
+
+  bool getParents = false;
+
+  FilterResponse_t inforesponse;
+  comerror_t comerr;
+
+  NSString* nsresolvedtext = nil;
+
+  if (get_info(gid, collection, _lang, metadata, getParents, _nproto, inforesponse, cerr))
+    {
+      text_t output_text;
+      text_t make_utf8 = "    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n";
+
+      output_text.append("<html>\n");
+      output_text.append("  <head>\n"+make_utf8+"  </head>\n");
+
+      if (recurse_contents(collection,inforesponse.docInfo[0], metadata, output_text)) {
+
+	// cerr << "**** text = " << output_text << endl;
+
+	  // retrieve [archivedir] for this document id
+	  NSString* nsarchivedir = getMetadataFirst(nscollection,nsgid,@"archivedir");
+	  const char* nsarchivedir_cstr = [nsarchivedir UTF8String]; 
+	  text_t archivedir = nsarchivedir_cstr;
+	  [nsarchivedir release];
+	  
+	  text_t resolved_text = resolveUrls(output_text,collection,archivedir);
+	  
+	  char* resolved_text_cstr = resolved_text.getcstr();
+	  nsresolvedtext = [[NSString alloc] initWithCString:resolved_text_cstr];
+	  
+	  delete [] resolved_text_cstr;
+	  }
+      else {
+	alert("Error","Failed to get info for " + gid);
+      }
+      output_text.append("</html>\n");
+    }
+  else {
+    alert("Error","Failed to get info for " + gid);
+  }
+
+
+  return nsresolvedtext;
+}
+
+
+NSMutableArray* GreenstoneAPI::getMetadata(NSString* nscollection, NSString* nsgid, NSString* nsmetaname)
+{
+  char const* nscollection_cstr  = [nscollection UTF8String]; 
+  char const* nsgid_cstr         = [nsgid UTF8String]; 
+  char const* nsmetaname_cstr    = [nsmetaname UTF8String]; 
+
+  NSMutableArray* nsmdlist = nil;
+
+  text_t collection(nscollection_cstr);
+  text_t gid(nsgid_cstr);
+  text_t metaname(nsmetaname_cstr);
+
+  text_tset metadata;
+  metadata.insert (metaname);
+  bool getParents = false;
+  FilterResponse_t response;
+
+  if (get_info (gid, collection, _lang, metadata, getParents, _nproto, response, cerr)) {
+    int num_browse_by = response.docInfo.size();
+    if (num_browse_by>0) {
+      MetadataInfo_tmap& metadata = response.docInfo[0].metadata;
+      MetadataInfo_t& metaname_info = metadata[nsmetaname_cstr];
+      int num_browse_by = metaname_info.values.size();
+      if (num_browse_by>0) {
+	// protocol will return 1 even if there is no metadata
+	// values will be the empty string
+
+	nsmdlist = [[NSMutableArray alloc] initWithCapacity:num_browse_by];
+	
+	text_tarray& meta_val = metaname_info.values;
+	text_tarray::iterator md_iterator = meta_val.begin();
+	while (md_iterator != meta_val.end()) {
+	  text_t& mdval = *md_iterator;
+
+	  NSString* nsmdval = TextTToNSString(mdval);	  
+	  if (nsmdval != nil) {
+	    [nsmdlist addObject:nsmdval];
+	  }
+
+	  md_iterator++;	      
+	}
+
+	if ([nsmdlist count] == 0) {
+	  // no valid metadata => free list and set to nil
+	  [nsmdlist release];
+	  nsmdlist = nil;
+	}
+      }
+      else {
+	alert("Error","OID" + gid + "does not have metadata for" + metaname);
+      }
+    }
+    else {
+      alert("Error","OID" + gid + "does not have metadata for" + metaname);
+    }
+  }
+  else {
+    alert("Error","Collection has no browsing capabilities" + gid);
+  }
+
+  // according to documentation, nscollectcion_cstr, nsgid_cstr and nsmetaname_cstr autorealeased
+  // => don't need to free them
+
+  return nsmdlist;
+}
+
+
+NSString* GreenstoneAPI::getMetadataFirst(NSString* nscollection, NSString* nsgid, NSString* nsmetaname)
+{
+  NSMutableArray* all_metavalues = getMetadata(nscollection,nsgid,nsmetaname);
+ 
+  NSString* first_metavalue_copy = nil;
+
+  if (all_metavalues != nil) {
+    NSString* first_metavalue = [all_metavalues objectAtIndex:0];
+
+    first_metavalue_copy = [[NSString alloc] initWithString:first_metavalue];
+
+    [all_metavalues release];
+  }
+
+  return first_metavalue_copy;
+}
+
+NSString* GreenstoneAPI::getMetadataFirst(const text_t& collection, text_t& gid, text_t& metaname)
+{
+  char* collection_cstr = collection.getcstr();
+  char* gid_cstr = gid.getcstr();
+  char* metaname_cstr = metaname.getcstr();
+
+  NSString* nscollection = [[NSString alloc] initWithCString:collection_cstr];
+  NSString* nsgid = [[NSString alloc] initWithCString:gid_cstr];
+  NSString* nsmetaname = [[NSString alloc] initWithCString:metaname_cstr];
+
+  NSString* result = getMetadataFirst(nscollection,nsgid,nsmetaname);
+
+  delete [] collection_cstr;
+  delete [] gid_cstr;
+  delete [] metaname_cstr;
+
+  return result;
+
+}
+
+NSMutableArray* GreenstoneAPI::browseClassifierList(NSString* nscollection, NSString* nsgid)
+{
+  // **** upgrade this to use getMetadata, and then split on ';'
+
+  char const* nscollection_cstr  = [nscollection UTF8String]; 
+  char const* nsgid_cstr  = [nsgid UTF8String]; 
+
+  text_t gid = nsgid_cstr;
+
+  NSMutableArray* nscllist = nil;
+
+  text_tset metadata;
+  metadata.insert ("contains");
+  FilterResponse_t response;
+  comerror_t comerr;
+  
+  if (get_info (nsgid_cstr, nscollection_cstr, _lang, metadata, false, _nproto, response, cerr)) {
+    int num_browse_by = response.docInfo.size();
+    if (num_browse_by >0) {
+      MetadataInfo_tmap& metadata = response.docInfo[0].metadata;
+      MetadataInfo_t& contains = metadata["contains"];
+      int num_browse_by = contains.values.size();
+      if (num_browse_by>0) {
+
+	// nscllist = [[NSMutableArray alloc] initWithCapacity:num_browse_by]; ****
+	nscllist = [[NSMutableArray alloc] initWithCapacity:50];
+	
+	text_tarray& contains_val = contains.values;
+	text_tarray::iterator cl_iterator = contains_val.begin();
+	while (cl_iterator != contains_val.end()) {
+	  text_t& clname = *cl_iterator;
+
+	  // split up on ';'
+	  text_tarray split_clname;
+	  splitchar (clname.begin(), clname.end(), ';', split_clname);
+
+	  text_tarray::iterator split_cl_iterator = split_clname.begin();
+	  while (split_cl_iterator != split_clname.end()) {
+	    text_t& cl = *split_cl_iterator;
+	    NSString* nscl = nil;
+	    if (cl[0] == '\"') {
+	      text_t cl_trim = substr(cl.begin()+1,cl.end());
+	      nscl = TextTToNSString(cl_trim);
+	    }
+	    else {
+	      nscl = TextTToNSString(cl);
+	    }
+	    
+	    if (nscl != nil) {
+	      [nscllist addObject:nscl];
+	    }
+	    else {
+	      cerr << "Warning: no semicolon split classifier 'contains' metadata value found for " + gid << endl;
+	    }
+	    
+	    split_cl_iterator++;
+	  }
+	  cl_iterator++;	      
+	}
+
+	if ([nscllist count]==0) {
+	  // No valid metadata found
+	  [nscllist release];
+	  nscllist = nil;
+	}
+      }
+      else {
+	alert("Error","Collection has to browsing capabilities");
+      }
+    }
+    else {
+      alert("Error","Collection has to browsing capabilities");
+    }
+  }
+  else {
+    alert("Error",get_comerror_string(comerr));
+  }
+
+  // according to documentation, nscollectcion_cstr and nsgid_cstr autorealeased
+  // => don't need to free them
+
+  return nscllist;
+}
+
+
+NSMutableArray* GreenstoneAPI::browseToplevelList(NSString* nscollection)
+{
+  return browseClassifierList(nscollection,@"browse");
+}
+
+
+
+
+void GreenstoneAPI::set_queryfilter_options (const text_t& collection,
+					     FilterRequest_t &request, 
+					     const text_t &querystring) 
+{
+  ColInfoResponse_t& collectinfo = collectInfo(collection);
+
+  // request.filterResultOptions and request.fields (if required) should
+  // be set from the calling code
+
+  request.filterName = "QueryFilter";
+
+  OptionValue_t option;
+
+  option.name = "Term";
+  option.value = querystring;
+  request.filterOptions.push_back (option);
+
+  option.name = "QueryType";
+  option.value = "ranked";
+  request.filterOptions.push_back (option);
+
+  option.name = "MatchMode";
+  option.value = "some";
+  request.filterOptions.push_back (option);
+
+  option.name = "Casefold";
+  option.value = "true";
+  request.filterOptions.push_back (option);
+
+  option.name = "Stem";
+  option.value = "true";
+  request.filterOptions.push_back (option);
+
+  option.name = "AccentFold";
+  option.value = "true";
+  request.filterOptions.push_back (option);
+
+  text_t buildtype = collectinfo.buildType;
+
+  if (buildtype == "lucene") {
+    // Should prevent Lucene collection from doing any searching!! // ****
+    alert("Warning","Searching lucene indexed collection on iPod not currently supported");
+  }
+  else if (buildtype == "mgpp") {
+    option.name = "Level";
+    option.value = "Doc";
+    request.filterOptions.push_back (option);
+
+    option.name = "Index";
+    option.value = "idx"; // ****
+    request.filterOptions.push_back (option);
+  }
+  else {
+    cerr << "**** storing index as dte" << endl;
+    option.name = "Index";
+    option.value = "dte"; // ****
+    request.filterOptions.push_back (option);
+  }
+  
+  option.name = "Maxdocs";
+  option.value = "50";
+  request.filterOptions.push_back (option);
+
+  option.name = "StartResults";
+  option.value = "1";
+  request.filterOptions.push_back (option);
+
+  option.name = "EndResults";
+  option.value = "50";
+  request.filterOptions.push_back (option);
+  
+
+}
+
+
+text_t GreenstoneAPI::resolveUrls(const text_t& unresolved, const text_t& collection, const text_t& archivedir)
+{
+  text_t resolved = unresolved;
+
+  // *****
+  text_t httpprefix = _gsdlhome;
+  text_t httpdocimg = httpprefix +"/collect/" + collection + "/index/assoc/" + archivedir;
+
+  resolved.replace("[archivedir]",archivedir);
+  resolved.replace("[assocfilepath]",archivedir);
+  resolved.replace("[collection]",collection);
+  resolved.replace("_httpprefix_",httpprefix);
+  resolved.replace("_httpdocimg_",httpdocimg);
+
+  return resolved;
+}
+
+
+text_t GreenstoneAPI::srclinkToUrl(const text_t& srclink, const text_t& collection, const text_t& archivedir)
+{
+  text_t srcurl;
+
+  if (!srclink.empty()) {
+    // extract URL
+    text_tarray split_srclink;
+    splitchar (srclink.begin(), srclink.end(), '\"', split_srclink);
+    if (split_srclink.size()>=2) {
+      srcurl = resolveUrls(split_srclink[1],collection,archivedir);
+    }
+  }
+
+  return srcurl;
+}
+
+
+NSString* GreenstoneAPI::getSrcUrlMetadata(NSString* nscollection, NSString* nsgid)
+{
+  NSString* nssrclink = getMetadataFirst(nscollection,nsgid,@"srclink");
+  if (nssrclink == nil) {
+    return nil;
+  }
+  NSString* nsarchivedir = getMetadataFirst(nscollection,nsgid,@"archivedir");
+  //NSString* nsassocfilepath = getMetadataFirst(nscollection,nsgid,@"assocfilepath"); // ****** used?
+
+  char const* nscollection_cstr  = [nscollection UTF8String]; 
+  char const* nssrclink_cstr  = [nssrclink UTF8String]; 
+  char const* nsarchivedir_cstr  = [nsarchivedir UTF8String]; 
+
+  text_t collection = nscollection_cstr;
+  text_t srclink = nssrclink_cstr;
+  text_t archivedir = nsarchivedir_cstr;
+
+  text_t srcurl = srclinkToUrl(srclink,collection,archivedir);
+
+  NSString* nsimage = getMetadataFirst(nscollection,nsgid,@"Image"); 
+  if (nsimage != nil) {
+    char const* image_cstr  = [nsimage UTF8String]; 
+    srcurl.replace("[Image]",image_cstr);
+  }
+
+  NSString* nssrcurl = TextTToNSString(srcurl);
+  
+  return nssrcurl;
+}
+
+
+
+
+NSMutableArray* GreenstoneAPI::filterResponseToTitlesList(const text_t& collection, FilterResponse_t& sections)
+{
+  ResultDocInfo_tarray::iterator thissection = sections.docInfo.begin();
+  ResultDocInfo_tarray::iterator endsection = sections.docInfo.end();
+
+  int num_results = sections.docInfo.size();
+  NSMutableArray* nsresultlist = nil;
+
+  if (num_results>0) {
+    nsresultlist = [[NSMutableArray alloc] initWithCapacity:num_results];
+
+    while (thissection != endsection) {
+      
+      ResultDocInfo_t &docinfo = *thissection;
+      text_t& oid = docinfo.OID;
+      text_t title;
+      text_t srcurl;
+
+      MetadataInfo_tmap& metadata = docinfo.metadata;
+      MetadataInfo_t& dctitle_info = metadata["dc.Title"];
+      MetadataInfo_t& title_info = metadata["Title"];
+      if ((dctitle_info.values.size()>0) && (!dctitle_info.values[0].empty())) {
+	title = dctitle_info.values[0];
+      }
+      else if ((title_info.values.size()>0) && (!title_info.values[0].empty())) {
+	title = title_info.values[0];
+      }
+      else {
+	cerr << "Warning: could not find Title metadata for item" << endl;
+      }
+
+      MetadataInfo_t& archivedir_info = metadata["archivedir"];
+      text_t archivedir = archivedir_info.values[0];
+      
+      MetadataInfo_t& srclink_info = metadata["srclink"];
+      if (srclink_info.values.size()>0) {
+	text_t& srclink = srclink_info.values[0];
+
+	srcurl = srclinkToUrl(srclink,collection,archivedir);
+
+	
+	// ** think about embedding in routine?
+	text_t imagemdname = "Image";
+	NSString* nsimage = getMetadataFirst(collection,oid,imagemdname); 
+	//char const* image_cstr  = [nsimage UTF8String]; 
+	//text_t image = image_cstr;
+	//srcurl.replace("[Image]",image);
+	
+
+      }
+     
+      NSString* nstitle = TextTToNSString(title);
+      NSString* nsoid = TextTToNSString(oid);
+      NSString* nssrcurl = TextTToNSString(srcurl); 
+
+      GSResultItem* result_item = [[GSResultItem alloc] initWithOID:nsoid withTitle:nstitle withSrcUrl:nssrcurl];
+      
+      [nsresultlist addObject:result_item];
+
+      ++thissection;
+    }
+  }
+
+  return nsresultlist;
+}
+
+NSMutableArray* GreenstoneAPI::search_single_collection (const text_t& collection, const text_t& query)
+{
+  comerror_t comerr;
+  FilterRequest_t request;
+  FilterResponse_t response;
+
+  NSMutableArray* nsresultlist = nil;
+ 
+  // request.fields = metadata set
+  request.fields.insert ("dc.Title"); 
+  request.fields.insert ("Title"); 
+  request.fields.insert ("srclink"); 
+  request.fields.insert ("archivedir"); 
+   
+  // do the query
+  request.filterResultOptions = FROID | FRmetadata | FRtermFreq;
+  text_t formattedstring = query;
+
+  // note! formattedstring is in unicode! mg and mgpp must convert!
+  set_queryfilter_options (collection, request, formattedstring);
+
+  _nproto->filter (collection, request, response, comerr, cerr);
+
+  if (comerr != noError) {
+    alert("Error",get_comerror_string(comerr));
+    return nil;
+  }
+  else {
+    nsresultlist = filterResponseToTitlesList(collection,response);
+  }
+  
+  return nsresultlist;
+}
+
+
+
+NSMutableArray* GreenstoneAPI::query(NSString* nscollection, NSString* nsquery)
+{
+  char const* nscollection_cstr  = [nscollection UTF8String]; 
+  char const* nsquery_cstr  = [nsquery UTF8String]; 
+
+  text_t collection = nscollection_cstr;
+  text_t query = nsquery_cstr;
+
+  NSMutableArray* nsresultlist = search_single_collection(collection,query);
+
+  return nsresultlist;
+}
+
+NSString* GreenstoneAPI::getDocument(NSString* nscollection, NSString* nsgid)
+{
+  char const* nscollection_cstr  = [nscollection UTF8String]; 
+  char const* nsgid_cstr  = [nsgid UTF8String]; 
+
+  text_t gid = nsgid_cstr;
+  text_t collection = nscollection_cstr;
+
+  DocumentRequest_t docrequest;
+  DocumentResponse_t docresponse;
+  comerror_t comerr;
+
+  // get the text
+  docrequest.OID = gid;
+  _nproto->get_document(collection, docrequest, docresponse, comerr, cerr);
+  
+  if (comerr != noError) {
+    alert("Error",get_comerror_string(comerr));
+    return nil;
+  }
+
+
+  text_t& text = docresponse.doc;
+  char* text_cstr = text.getcstr();
+  NSString* nstext = [[NSString alloc] initWithCString:text_cstr];
+
+  delete [] text_cstr;
+
+  return nstext;
+}
+
+
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/GreenstoneApplication.h
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/GreenstoneApplication.h	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/GreenstoneApplication.h	(revision 24799)
@@ -0,0 +1,56 @@
+#import <UIKit/CDStructures.h>
+#import <UIKit/UIKit.h>
+#import <UIKit/UIApplication.h>
+#import <UIKit/UITable.h>
+
+#import "BrowseCascadeView.h"
+#import "QueryCascadeView.h"
+#import "PrefCascadeView.h"
+
+#import "SimpleWebView.h"
+
+#import "GreenstoneAPI.h"
+#import "GreenstoneButtonBar.h"
+
+#import "AppDefs.h"
+
+@interface GreenstoneApplication : UIApplication 
+{
+  UIWindow* _window;
+  UIButtonBar* _butbar;
+
+  BrowseCascadeView* _browseCascadeView; 
+  QueryCascadeView*  _queryCascadeView; 
+  PrefCascadeView*   _prefCascadeView; 
+}
+
+
+-(NSString*) languagePref;
+
++(GreenstoneApplication*) toplevelApp;
++(GreenstoneAPI*) greenstoneAPI;
+
++(CGRect)workAreaRect;
+
++(void) setInCollection:(NSString*)collection;
++(int) inCollectionRowId;
+
+
+-(void) applicationDidFinishLaunching: (NSNotification*)aNotification;
+
+-(void) deviceOrientationChanged:(struct __GSEvent *)event;
+
+-(void) buttonBarClicked:(id)sender;
+
++(void) transitionView:(int)eventNum fromView:(UIView*)from toView:(UIView*)to;
+
++(void) startWebViewBusy;
++(void) stopWebViewBusy;
+
++(void) loadURL:(NSURL*)url;
++(void) showWebView:(int)eventNum  fromView:(UIView*)from withURL:(NSURL*)url;
+
+-(void) alertSheet:(UIActionSheet*)sheet buttonClicked: (int)button;
+
+@end
+
Index: /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/GreenstoneApplication.mm
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/GreenstoneApplication.mm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/GreenstoneApplication.mm	(revision 24799)
@@ -0,0 +1,323 @@
+#import <Foundation/NSDictionary.h>
+#import <UIKit/CDStructures.h>
+#import <UIKit/UITable.h>
+#import <UIKit/UIHardware.h>
+
+#import "GreenstoneApplication.h"
+#import "GreenstoneButtonBar.h"
+#import "SimpleWebView.h"
+
+#import "GreenstoneAPI.h"
+
+static GreenstoneApplication* _toplevelApp   = nil;
+static UITransitionView*      _transView     = nil;
+static SimpleWebView*         _webView       = nil;
+static GreenstoneAPI*         _greenstoneAPI = nil;
+
+static NSString* _inCollection = nil;
+static NSMutableDictionary* _collectionToRowId = nil;
+
+@implementation GreenstoneApplication
+
++(GreenstoneApplication*) toplevelApp {
+  return (_toplevelApp);
+}
+
++(GreenstoneAPI*) greenstoneAPI {
+  return (_greenstoneAPI);
+}
+
++(CGRect)workAreaRect
+{
+  CGRect screen_rect = [UIHardware fullScreenApplicationContentRect];
+
+  int wa_x_dim = screen_rect.size.width;
+  int wa_y_dim = screen_rect.size.height - BOT_NAVBAR_HEIGHT;
+
+  CGRect wa_rect = CGRectMake(0.0f,0.0f,wa_x_dim,wa_y_dim);
+
+  return wa_rect;
+}
+
+
++(void) setInCollection:(NSString*)collection
+{
+  NSLog(@"Setting in collection = %@",collection);
+  if (_inCollection != nil) {
+    // [_inCollection release]; // **** memory leak????
+  }
+  _inCollection = nil;
+    
+  if (collection != nil) {
+    _inCollection = [[NSString alloc] initWithString:collection];
+  }
+}
+
++(int) inCollectionRowId
+{
+  if (_inCollection == nil) {
+    return -1;
+  }
+
+  NSNumber* rowid_num = [_collectionToRowId objectForKey:_inCollection];
+  int rowid = [rowid_num intValue];
+
+  return rowid;
+}
+
+-(NSString*) languagePref
+{
+  int rowid = [GreenstoneApplication inCollectionRowId];
+
+  if (rowid>=0) {
+
+    PrefView* prefview = (PrefView*)[_prefCascadeView directEntry:rowid];
+    NSString* lang = [prefview languagePref];
+
+    return lang; // lang is allocated, make sure calling method does release
+  }
+  else {
+    return nil;
+  }
+}
+
+
+
+-(void) applicationDidFinishLaunching:(NSNotification *)aNotification
+{
+    _toplevelApp = self;
+    _greenstoneAPI = new GreenstoneAPI(self);
+
+    _inCollection = nil;
+    _collectionToRowId = nil;
+
+    if (!_greenstoneAPI->sanityCheck()) {
+      return;
+    }
+
+    CGRect screen_rect = [UIHardware fullScreenApplicationContentRect];
+    screen_rect.origin.x = screen_rect.origin.y = 0.0f;
+
+    _window = [[UIWindow alloc] initWithContentRect: screen_rect];
+
+    CGRect workarea_rect = [GreenstoneApplication workAreaRect];
+
+    // Set up top-level browsing and search menu CascadeViews
+    _browseCascadeView = [BrowseCascadeView alloc];
+    _browseCascadeView = [_browseCascadeView initWithFrame:workarea_rect withTitle: @"Browse collection:"];
+
+    _queryCascadeView = [QueryCascadeView alloc];
+    _queryCascadeView = [_queryCascadeView initWithFrame:workarea_rect withTitle: @"Search collection:"];
+
+    _prefCascadeView = [PrefCascadeView alloc];
+    _prefCascadeView = [_prefCascadeView initWithFrame:workarea_rect withTitle: @"Collection preferences:"];
+
+    NSMutableArray* collist = _greenstoneAPI->collectionList();
+
+    int collist_len = [collist count];
+    _collectionToRowId = [[NSMutableDictionary alloc] initWithCapacity:collist_len];
+
+
+    NSEnumerator* collist_enumerator = [collist objectEnumerator];
+    int i = 0;
+    NSString* colnamedir;
+    while (colnamedir = [collist_enumerator nextObject]) {
+      ColInfoResponse_t& colinfo = _greenstoneAPI->collectInfo(colnamedir);
+      NSString* colname = _greenstoneAPI->collectionName(colinfo);
+	
+      [_browseCascadeView appendMenuItem:self withItem:colname withGID:colnamedir];
+      [_queryCascadeView appendMenuItem:self withItem:colname withGID:colnamedir];
+
+      [_prefCascadeView appendMenuItem:self withItem:colname withGID:colnamedir];
+
+      NSNumber* inum = [[NSNumber alloc] initWithInt: i];
+      [_collectionToRowId setObject:inum forKey:colnamedir];
+      [inum release]; // **** should probably add this in
+
+      i++;
+    }
+    [collist release];
+
+
+	    
+    if (_webView == nil) {
+      // setup Web browser view
+      _webView = [[SimpleWebView alloc] initWithFrame:workarea_rect];
+    }
+
+
+    if (_transView == nil) {
+      // Set up transition view
+      _transView = [[UITransitionView alloc] initWithFrame: workarea_rect];
+    }
+
+    // Set up button bar
+    int butbar_x_org = 0.0f;
+    int butbar_y_org = workarea_rect.size.height+1;
+    int butbar_x_dim = screen_rect.size.width;
+    int butbar_y_dim = BOT_NAVBAR_HEIGHT;
+
+    CGRect butbarrect = CGRectMake(butbar_x_org,butbar_y_org,butbar_x_dim,butbar_y_dim);
+    _butbar = [[GreenstoneButtonBar alloc] initInView:_window withFrame:butbarrect];
+
+    // Usual standard window stuff
+    [_window makeKeyAndVisible];
+
+    [_window addSubview: _transView ];
+    [_window addSubview: _butbar]; 
+
+    [_transView transition:0 toView:_browseCascadeView];
+}
+
+
+enum compassDirection { itNorth=0, itEast=1, itSouth=2, itWest=3};
+
+static int compass_degrees[4] = { 0, 90, 180, 270 };
+
+static int current_orientation = kOrientationVertical;
+static int current_compass_dir = itNorth;
+static int current_compass_degs = 0;
+
+-(void) deviceOrientationChanged:(struct __GSEvent *)event
+{
+    int new_orientation = [UIHardware deviceOrientation: YES];
+    
+    int new_compass_dir  = -1;
+
+    switch (new_orientation) 
+    {
+      case kOrientationVertical:
+	new_compass_dir = itNorth;
+	break;
+
+      case kOrientationHorizontalLeft:
+	new_compass_dir = itEast;
+	break;
+
+      case kOrientationHorizontalRight:
+	new_compass_dir = itWest;
+	break;
+      case kOrientationVerticalUpsideDown:
+	new_compass_dir = itSouth;
+	break;	
+    }
+
+    if (new_compass_dir>=0) {
+      int new_compass_degs = compass_degrees[new_compass_dir];
+      int degs_delta = current_compass_degs - new_compass_degs;
+
+      if (degs_delta != 0) {
+
+	current_orientation  = new_orientation;
+	current_compass_degs = new_compass_degs;
+	current_compass_dir  = new_compass_dir;
+	
+	[_webView setTransform:CGAffineTransformIdentity];
+	[_webView setRotationBy:new_compass_degs];	
+
+      }
+    }
+
+    [super deviceOrientationChanged:event];
+}
+
+
+
+-(void) buttonBarClicked:(id)sender 
+{
+    int button = [sender tag];
+    int transStyle = UITransitionNextShiftUp;
+
+    int rowid = [GreenstoneApplication inCollectionRowId];
+
+    switch (button) 
+    {
+      case GSBBBrowse:
+	if (rowid>=0) {
+	  [_transView transition:transStyle toView:[_browseCascadeView directEntry:rowid]];
+	}
+	else {
+	  [_transView transition:transStyle toView:_browseCascadeView];
+	}
+	break;
+
+      case GSBBQuery:
+	if (rowid>=0) {
+	  [_transView transition:transStyle toView:[_queryCascadeView directEntry:rowid]];
+	}
+	else {
+	  [_transView transition:transStyle toView:_queryCascadeView];
+	}
+	break;
+
+      case GSBBPref:
+	if (rowid>=0) {
+	  [_transView transition:transStyle toView:[_prefCascadeView directEntry:rowid]];
+	}
+	else {
+	  [_transView transition:transStyle toView:_prefCascadeView];
+	}
+	break;
+
+      default:
+	NSLog(@"Unrecognised button bar click: %d",button);
+	break;
+    }
+}
+
+
++(void) transitionView:(int)eventNum fromView:(UIView*)from toView:(UIView*)to
+{
+  [_transView transition:eventNum fromView:from toView:to];
+}
+
++(void) startWebViewBusy
+{
+  // cerr << "**** start busy" << endl;
+  // stub for providing "busy" cue (e.g. busy spinner, or HUD)
+}
+
++(void) stopWebViewBusy
+{
+  // cerr << "**** end busy" << endl;
+  // stub for providing "busy" cue (e.g. busy spinner, or HUD)
+}
+
++(void) loadURL:(NSURL*)url
+{
+  [_webView loadURL:url];
+}
+
++(void) showWebView:(int)eventNum  fromView:(UIView*)from withURL:(NSURL*)url
+{
+  [_webView loadURL:url];
+  [_webView setParent:from];
+  [_transView transition:eventNum fromView:from toView:_webView];
+}
+
+
+
+-(void) alertSheet:(UIActionSheet*)sheet buttonClicked:(int)button
+{	
+    [sheet dismissAnimated:YES];
+    [sheet release];
+}
+
+
+-(void) dealloc
+{
+    [_browseCascadeView release];
+    [_queryCascadeView release];
+    [_prefCascadeView release];
+
+    [_window release];
+    [_butbar release];
+
+    [super dealloc];
+}
+
+
+@end
+
+
+
Index: /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/GreenstoneButtonBar.h
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/GreenstoneButtonBar.h	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/GreenstoneButtonBar.h	(revision 24799)
@@ -0,0 +1,31 @@
+#import <CoreFoundation/CoreFoundation.h>
+#import <UIKit/UIKit.h>
+#import <UIKit/UITransitionView.h>
+#import <UIKit/UITextView.h>
+#import <UIKit/UIButtonBar.h>
+
+#define NUM_GSBAR_BUTTONS 3
+
+extern NSString *kUIButtonBarButtonAction;
+extern NSString *kUIButtonBarButtonInfo;
+extern NSString *kUIButtonBarButtonInfoOffset;
+extern NSString *kUIButtonBarButtonSelectedInfo;
+extern NSString *kUIButtonBarButtonStyle;
+extern NSString *kUIButtonBarButtonTag;
+extern NSString *kUIButtonBarButtonTarget;
+extern NSString *kUIButtonBarButtonTitle;
+extern NSString *kUIButtonBarButtonTitleVerticalHeight;
+extern NSString *kUIButtonBarButtonTitleWidth;
+extern NSString *kUIButtonBarButtonType;
+
+@interface GreenstoneButtonBar : UIButtonBar
+{}
+
+- (UIButtonBar*)initInView:(UIView*)view withFrame:(CGRect)frame;
+
+- (NSArray *)buttonBarItemList;
+
+@end
+
+
+
Index: /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/GreenstoneButtonBar.mm
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/GreenstoneButtonBar.mm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/GreenstoneButtonBar.mm	(revision 24799)
@@ -0,0 +1,73 @@
+#import "GreenstoneButtonBar.h"
+#import "GreenstoneApplication.h"
+
+@implementation GreenstoneButtonBar
+
+- (UIButtonBar*)initInView:(UIView*)view withFrame:(CGRect)frame
+{
+    self = [super initInView: view withFrame: frame
+       withItemList: [self buttonBarItemList]];
+
+    GreenstoneApplication* app = [GreenstoneApplication toplevelApp];
+
+    [self setDelegate: app ];
+    [self setBarStyle: UIBarStyleBlack ];
+    [self setButtonBarTrackingMode: 2 ];
+
+    int buttons[NUM_GSBAR_BUTTONS] = { GSBBBrowse, GSBBQuery, GSBBPref };
+
+    [self registerButtonGroup: 0 withButtons: buttons withCount: NUM_GSBAR_BUTTONS ];
+    [self showButtonGroup: 0 withDuration: 0.0 ];
+
+    // *** This and the fact that BookmarkSelected.png seems to be back to front is a bit weird!
+    [self showSelectionForButton: 1 ];
+
+    return self;
+}
+
+- (NSArray *)buttonBarItemList 
+{
+    GreenstoneApplication* app = [GreenstoneApplication toplevelApp];
+
+    NSArray* buts 
+      = [ NSArray arrayWithObjects:
+          [ NSDictionary dictionaryWithObjectsAndKeys:
+            @"buttonBarClicked:", kUIButtonBarButtonAction,
+            @"icons/BookmarkSelected.png", kUIButtonBarButtonInfo,
+            @"icons/Bookmark.png", kUIButtonBarButtonSelectedInfo,
+            [ NSNumber numberWithInt: 1], kUIButtonBarButtonTag,
+              app, kUIButtonBarButtonTarget,
+            @"Browse", kUIButtonBarButtonTitle,
+            @"0", kUIButtonBarButtonType,
+            nil
+          ],
+
+          [ NSDictionary dictionaryWithObjectsAndKeys:
+            @"buttonBarClicked:", kUIButtonBarButtonAction,
+            @"icons/Search.png", kUIButtonBarButtonInfo,
+            @"icons/SearchSelected.png", kUIButtonBarButtonSelectedInfo,
+            [ NSNumber numberWithInt: 2], kUIButtonBarButtonTag,
+              app, kUIButtonBarButtonTarget,
+            @"Search", kUIButtonBarButtonTitle,
+            @"0", kUIButtonBarButtonType,
+            nil
+          ],
+ 
+          [ NSDictionary dictionaryWithObjectsAndKeys:
+            @"buttonBarClicked:", kUIButtonBarButtonAction,
+            @"icons/Preferences.png", kUIButtonBarButtonInfo,
+            @"icons/PreferencesSelected.png", kUIButtonBarButtonSelectedInfo,
+            [ NSNumber numberWithInt: 3], kUIButtonBarButtonTag,
+              app, kUIButtonBarButtonTarget,
+            @"Settings", kUIButtonBarButtonTitle,
+            @"0", kUIButtonBarButtonType,
+            nil
+          ],
+
+          nil
+      ];
+
+    return buts;
+}
+
+@end
Index: /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/MenuCascadeView.h
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/MenuCascadeView.h	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/MenuCascadeView.h	(revision 24799)
@@ -0,0 +1,40 @@
+#import <Foundation/NSObject.h>
+#import <Foundation/NSString.h>
+
+#import <UIKit/UIView.h>
+#import <UIKit/UIKit.h>
+
+#define MCInitCapacity 10
+
+@interface MenuCascadeView : UIView
+{
+  UIView* _parent;
+  UITable* _table;
+  UINavigationBar* _navbar;
+  UIView* _childMenu;
+
+  NSString* _gid;    // Greenstone id (used to access database for metadata such as CL1, CL4.1 etc)
+  NSString* _collection;
+
+  NSMutableArray* _tabrow;
+  NSMutableArray* _oidItem;
+
+}
+
+-(id) init;
+-(id) initWithFrame:(CGRect)rect;
+-(id) initWithFrame:(CGRect)rect withTitle:(NSString*)title;
+-(id) initWithFrame:(CGRect)rect withParent:(UIView*)parent 
+         withCollection:(NSString*)collection withTitle:(NSString*)title withGID:(NSString*)gid;
+
+-(void) setTitle: (NSString*)title;
+-(void) appendMenuItem: (NSObject*) app withItem:(NSString*)item_label withGID:(NSString*)childGID;
+
+-(void) navigationBar:(UINavigationBar*)navbar buttonClicked:(int)button;
+
+
+
+-(void) dealloc;
+
+@end
+
Index: /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/MenuCascadeView.mm
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/MenuCascadeView.mm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/MenuCascadeView.mm	(revision 24799)
@@ -0,0 +1,193 @@
+#import <Foundation/Foundation.h>
+
+#import <UIKit/CDStructures.h>
+#import <UIKit/UINavigationBar.h>
+#import <UIKit/UIWindow.h>
+#import <UIKit/UIView-Hierarchy.h>
+#import <UIKit/UIHardware.h>
+#import <UIKit/UITable.h>
+#import <UIKit/UITableCell.h>
+#import <UIKit/UITableColumn.h>
+
+#import "GreenstoneApplication.h"
+#import "GSResultItem.h"
+
+#import "MenuCascadeView.h"
+
+
+// ***** think about coding for orientation of iPod!!!!
+
+@implementation MenuCascadeView
+
+-(id) init 
+{
+  CGRect rect = [GreenstoneApplication workAreaRect];  
+  return [self initWithFrame:rect];	
+}
+
+-(id) initWithFrame:(CGRect)rect 
+{
+  return [self initWithFrame:rect withParent:nil withCollection:nil withTitle:nil withGID:nil];
+}
+
+-(id) initWithFrame:(CGRect)rect withTitle:(NSString*)title
+{
+  return [self initWithFrame:rect withParent:nil withCollection:nil withTitle:title withGID:nil];
+}
+
+-(id) initWithFrame:(CGRect)rect withParent:(UIView*)parent 
+        withCollection:(NSString*)collection withTitle:(NSString*)title withGID:(NSString*)gid
+{
+  self = [super initWithFrame:rect];
+  
+  _parent = parent;
+  _collection = collection;
+  _gid = gid;
+  _childMenu = nil;
+ 
+  _tabrow    = [[NSMutableArray alloc] initWithCapacity:MCInitCapacity];
+  _oidItem   = [[NSMutableArray alloc] initWithCapacity:MCInitCapacity];
+
+  int frame_x_dim = CGRectGetMaxX(rect)+1;
+  int frame_y_dim = CGRectGetMaxY(rect)+1;
+    
+  int tab_x_org = 0.0f;
+  int tab_y_org = TOP_NAVBAR_HEIGHT;
+  int tab_x_dim = frame_x_dim;
+  int tab_y_dim = frame_y_dim -TOP_NAVBAR_HEIGHT;
+
+  CGRect tablerect = CGRectMake(tab_x_org,tab_y_org,tab_x_dim,tab_y_dim);
+
+  _table = [[UITable alloc] initWithFrame:tablerect];
+    
+  UITableColumn *col = [[UITableColumn alloc] initWithTitle: @"MenuCascadeApp"
+		       identifier: @"menucascade" width: frame_x_dim];
+      
+  [_table addTableColumn: col]; 
+  [_table setDataSource: self];
+  [_table setDelegate: self];
+  [_table reloadData];
+  
+  int nav_x_org = 0.0f;
+  int nav_y_org = 0.0f;
+  int nav_x_dim = frame_x_dim;
+  int nav_y_dim = TOP_NAVBAR_HEIGHT;
+
+  CGRect navrect = CGRectMake(nav_x_org,nav_y_org,nav_x_dim,nav_y_dim);
+  _navbar = [[UINavigationBar alloc] initWithFrame: navrect];
+  
+  NSString* back = (parent) ? @"Back" : nil;
+  [_navbar showButtonsWithLeftTitle:back rightTitle:nil leftBack:YES];
+  [_navbar enableAnimation];
+  [_navbar setBarStyle: UIBarStyleDefault];
+  [_navbar setDelegate: self];
+
+  if (title != nil) {
+    [self setTitle:title];
+  }
+
+  [self addSubview: _navbar]; 
+  [self addSubview: _table]; 	
+
+  return self;
+}
+
+
+-(void) setTitle: (NSString*)title
+{
+  UINavigationItem* navtitle = [UINavigationItem alloc];
+  [_navbar pushNavigationItem: [navtitle initWithTitle: title]];
+}
+
+
+-(void) appendMenuItem: (NSObject*) app withItem:(NSString*)itemLabel withGID:(NSString*)childGID
+{
+  UIImageAndTextTableCell* itcell = [[UIImageAndTextTableCell alloc] init];
+  [itcell setTitle: itemLabel]; 
+    
+  if ([childGID hasPrefix:@"CL"]==YES) {
+    [itcell setShowDisclosure: YES];
+    [itcell setDisclosureStyle: 2];
+  }
+  else if (_parent == nil) {
+    // Root menu => Make disclosures look a bit different
+    [itcell setShowDisclosure: YES];
+    [itcell setDisclosureStyle: 1];
+  }
+
+  [_tabrow addObject:itcell]; 
+  [itcell retain];
+
+  if (itemLabel == nil) {
+    itemLabel = [[NSString alloc] initWithString:@"Unknown Title"];
+  }
+
+  GSResultItem* oidItem = [[GSResultItem alloc] initWithOID:childGID withTitle:itemLabel]; // *****
+  [_oidItem addObject:oidItem];  
+
+  // needed to force table view to update
+  [_table reloadData];
+
+}
+
+// ************
+// * Delegates
+// ************
+
+- (int) numberOfRowsInTable: (UITable *)table
+{
+  return [_tabrow count];
+}
+
+- (UITableCell *) table: (UITable *)table cellForRow: (int)row column: (int)col
+{
+
+
+  return [_tabrow objectAtIndex:row];
+}
+
+- (UITableCell *) table: (UITable *)table cellForRow: (int)row column: (int)col
+				reusing: (BOOL) reusing
+{
+  return [_tabrow objectAtIndex:row];
+}
+
+
+
+-(void) navigationBar:(UINavigationBar*)navbar buttonClicked:(int)button 
+{
+  switch (button) 
+  {
+    case 1:  // left
+      // cerr << "***** Need to set collection to nil if going to top page" << endl; // ****
+      // [GreenstoneApplication setInCollection:_parent._collectcion];
+      [GreenstoneApplication transitionView:UITransitionBothShiftRight 
+         fromView:self toView:_parent];
+
+      if (_childMenu != nil) {
+	[_childMenu release];
+	_childMenu = nil;
+      }
+      break;
+
+    default:
+      NSLog(@"Unrecognised navbar button = %d",button);
+      break;
+  }
+}
+
+
+-(void) dealloc
+{
+  [_childMenu release];
+
+  [_gid release]; // **** is this ever used???
+  [_collection release];
+
+  [_tabrow release];
+  [_oidItem release];
+
+  [ super dealloc ];
+}
+
+@end
Index: /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/PrefCascadeView.h
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/PrefCascadeView.h	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/PrefCascadeView.h	(revision 24799)
@@ -0,0 +1,23 @@
+
+#import "PrefView.h"
+
+#import "MenuCascadeView.h"
+
+@interface PrefCascadeView: MenuCascadeView
+{
+  NSMutableArray* _prefViews;
+}
+
+-(id) initWithFrame:(CGRect)rect withParent:(UIView*)parent 
+        withCollection:(NSString*)collection withTitle:(NSString*)title withGID:(NSString*)gid;
+
+-(UIView*) directEntry:(int)rowId;
+
+-(void) appendMenuItem: (NSObject*) app withItem:(NSString*)item_label withGID:(NSString*)childGID;
+
+-(void) tableRowSelected:(NSNotification*)notification;
+
+-(void) dealloc;
+
+@end
+
Index: /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/PrefCascadeView.mm
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/PrefCascadeView.mm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/PrefCascadeView.mm	(revision 24799)
@@ -0,0 +1,69 @@
+
+#import "GSResultItem.h"
+#import "GreenstoneApplication.h"
+
+#import "PrefCascadeView.h"
+
+@implementation PrefCascadeView
+
+-(id) initWithFrame:(CGRect)rect withParent:(UIView*)parent 
+        withCollection:(NSString*)collection withTitle:(NSString*)title withGID:(NSString*)gid
+{
+  self = [super initWithFrame:rect withParent:parent withCollection:collection 
+	  withTitle:title withGID:gid];
+
+  _prefViews = [[NSMutableArray alloc] initWithCapacity:MCInitCapacity];
+
+  return self;
+}
+
+-(void) appendMenuItem:(NSObject*)app withItem:(NSString*)item_label withGID:(NSString*)childGID
+{
+  [super appendMenuItem:app withItem:item_label withGID:childGID];
+
+  CGRect workarea_rect = [GreenstoneApplication workAreaRect];
+  PrefView* prefView = [[PrefView alloc] initWithFrame:workarea_rect 
+			withParent:self withCollection:childGID withTitle:item_label];
+
+  [_prefViews addObject:prefView];  
+
+}
+
+-(UIView*) directEntry:(int)rowId
+{
+  return [_prefViews objectAtIndex:rowId];
+}
+
+
+
+//***********
+//* Delegates
+//***********
+-(void) tableRowSelected:(NSNotification*)notification
+{
+  UITable* table = [notification object];
+  int rowId = [table selectedRow];
+
+  GreenstoneAPI* greenstoneAPI = [GreenstoneApplication greenstoneAPI];
+
+  NSString* childTitle = [[_oidItem objectAtIndex:rowId] title];
+  NSString* childGID = [[_oidItem  objectAtIndex:rowId] oid]; 
+
+  NSString* chosenCollection = [[NSString alloc] initWithString:childGID];
+
+  PrefView* prefView = [_prefViews objectAtIndex:rowId];
+  
+  [GreenstoneApplication setInCollection:chosenCollection];
+  [GreenstoneApplication transitionView:UITransitionBothShiftLeft 
+        fromView:self toView:prefView];
+
+}
+
+-(void) dealloc
+{
+  [_prefViews release];
+
+  [super dealloc];
+}
+
+@end
Index: /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/PrefTable.h
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/PrefTable.h	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/PrefTable.h	(revision 24799)
@@ -0,0 +1,42 @@
+#import <UIKit/CDStructures.h>
+#import <UIKit/UIKit.h>
+#import <UIKit/UIPreferencesTable.h>
+#import <UIKit/UIPreferencesTextTableCell.h>
+#import <UIKit/UISwitchControl.h>
+#import <UIKit/UISegmentedControl.h>
+#import <UIKit/UISliderControl.h>
+
+#define NUM_GROUPS 2
+#define CELLS_PER_GROUP 2
+
+@interface PrefTable : UIPreferencesTable
+{
+    UIPreferencesTableCell *cells[NUM_GROUPS][CELLS_PER_GROUP];
+    UIPreferencesTableCell *groupcell[NUM_GROUPS];
+
+    UISegmentedControl *langControl;
+
+    UISwitchControl    *stemmingControl;
+    UISwitchControl    *caseControl;
+}
+
+- (id)initWithFrame:(CGRect)rect;
+- (int)numberOfGroupsInPreferencesTable:(UIPreferencesTable *)aTable;
+- (UIPreferencesTableCell *)preferencesTable:
+    (UIPreferencesTable *)aTable
+    cellForGroup:(int)group;
+- (float)preferencesTable:(UIPreferencesTable *)aTable
+    heightForRow:(int)row
+    inGroup:(int)group
+    withProposedHeight:(float)proposed;
+- (BOOL)preferencesTable:(UIPreferencesTable *)aTable
+    isLabelGroup:(int)group;
+- (UIPreferencesTableCell *)preferencesTable:
+    (UIPreferencesTable *)aTable
+    cellForRow:(int)row
+    inGroup:(int)group;
+
+-(NSString*) languagePref;
+
+@end
+
Index: /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/PrefTable.mm
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/PrefTable.mm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/PrefTable.mm	(revision 24799)
@@ -0,0 +1,173 @@
+#import "PrefTable.h"
+
+@implementation PrefTable
+
+- (id)initWithFrame:(CGRect)rect {
+    if ((self == [ super initWithFrame: rect ]) != nil) {
+        int i, j;
+
+        for(i=0;i<NUM_GROUPS;i++) {
+            groupcell[i] = NULL;
+            for(j=0;j<CELLS_PER_GROUP;j++)
+                cells[i][j] = NULL;
+        }
+
+        [ self setDataSource: self ];
+        [ self setDelegate: self ];
+    }
+
+    return self;
+}
+
+- (int)numberOfGroupsInPreferencesTable:(UIPreferencesTable *)aTable {
+
+    /* Number of logical groups, including labels */
+    return NUM_GROUPS;
+}
+
+ - (int)preferencesTable:(UIPreferencesTable *)aTable
+    numberOfRowsInGroup:(int)group
+{
+    switch (group) {
+        case 0:
+            return 1;
+            break;
+        case 1:
+            return 2;
+            break;
+    }
+}
+
+- (UIPreferencesTableCell *)preferencesTable:
+    (UIPreferencesTable *)aTable
+    cellForGroup:(int)group
+{
+     if (groupcell[group] != NULL)
+         return groupcell[group];
+
+     groupcell[group] = [ [ UIPreferencesTableCell alloc ] init ];
+     switch (group) {
+         case 0:
+             [ groupcell[group] setTitle: @"Presentation" ];
+             break;
+         case 1:
+             [ groupcell[group] setTitle: @"Search" ];
+             break;
+     }
+     return groupcell[group];
+}
+
+- (float)preferencesTable:(UIPreferencesTable *)aTable
+    heightForRow:(int)row
+    inGroup:(int)group
+    withProposedHeight:(float)proposed
+{
+    /* Return height for group titles */
+    if (row == -1) {
+        if (group < 2)
+            return 40;
+    }
+
+    if (group == 0 && row == 0) {
+      return 55.0;
+    }
+
+
+    return proposed;
+}
+
+- (BOOL)preferencesTable:(UIPreferencesTable *)aTable
+    isLabelGroup:(int)group
+{
+    return NO;
+}
+
+-(UIPreferencesTableCell*) preferencesTable:
+    (UIPreferencesTable *)aTable
+    cellForRow:(int)row
+    inGroup:(int)group
+{
+    UIPreferencesTableCell *cell;
+
+    if (cells[group][row] != NULL)
+        return cells[group][row];
+
+    cell = [ [ UIPreferencesTableCell alloc ] init ];
+    [ cell setEnabled: YES ];
+
+    switch (group) {
+        case (0):
+            switch (row) {
+                case (0):
+                    [ cell setTitle:@"Language" ];
+                    langControl = [ [ UISegmentedControl alloc ]
+                        initWithFrame:CGRectMake(170, 5, 135, 50)
+                    ];
+		    [ langControl insertSegment:0
+                        withTitle:@"English" animated: NO ];
+                    [ langControl insertSegment:1
+                        withTitle:@"French" animated: NO ];
+                    [ langControl selectSegment: 0 ];
+                    [ cell addSubview: langControl ];
+                    break;
+	    }
+	    break;
+        case (1):
+            switch (row) {
+                case (0):
+                    [ cell setTitle:@"Stemming" ];
+                    stemmingControl = [ [ UISwitchControl alloc ]
+                        initWithFrame:CGRectMake(170, 5, 120, 55)
+                    ];
+                    [ stemmingControl setValue: 0.0 ];
+                    [ cell addSubview: stemmingControl ];
+                    break;
+                case (1):
+                    [ cell setTitle:@"Case matching" ];
+                    caseControl = [ [ UISwitchControl alloc ]
+                        initWithFrame:CGRectMake(170, 5, 120, 30)
+                    ];
+                    [ caseControl setValue: 0.0 ];
+                    [ caseControl setAlternateColors: NO ];
+                    [ cell addSubview: caseControl ];
+                    break;
+                case (2):
+                    [ cell setTitle:@"Case matching" ];
+                    caseControl = [ [ UISwitchControl alloc ]
+                        initWithFrame:CGRectMake(170, 5, 120, 30)
+                    ];
+                    [ caseControl setValue: 0.0 ];
+                    [ caseControl setAlternateColors: NO ];
+                    [ cell addSubview: caseControl ];
+                    break;
+            }
+            break;
+	    
+    }
+
+    [ cell setShowSelection: NO ];
+    cells[group][row] = cell;
+    return cell;
+}
+
+-(NSString*) languagePref
+{
+  NSString* lang = [NSString alloc];
+
+    lang = [lang initWithString:@"en"];
+
+  NSLog(@"Not checking value. Defaulting to English");
+
+/*
+  if (langControl.selectedSegment==0) {
+    lang = [lang initWithString:@"en"];
+  }
+  else {
+    lang = [lang initWithString:@"fr"];
+  }
+*/
+
+  return lang;
+}
+
+@end
Index: /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/PrefView.h
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/PrefView.h	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/PrefView.h	(revision 24799)
@@ -0,0 +1,24 @@
+#import <UIKit/UIKit.h>
+
+#import "PrefTable.h"
+
+@interface PrefView : UIView
+{
+  UIView* _parent;
+  NSString* _collection;
+
+  UINavigationBar* _navbar;
+  PrefTable* _prefTable;
+
+}
+
+-(id) initWithFrame:(struct CGRect)frame withParent:(UIView*)parent 
+         withCollection:(NSString*)collection withTitle:(NSString*)title;
+
+-(void) setTitle:(NSString*)title;
+
+-(NSString*) languagePref;
+
+-(void) dealloc;
+
+@end
Index: /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/PrefView.mm
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/PrefView.mm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/PrefView.mm	(revision 24799)
@@ -0,0 +1,107 @@
+
+
+#import <Foundation/Foundation.h> // can remove?? *****
+
+#import <UIKit/CDStructures.h>
+#import <UIKit/UIKit.h>
+
+#import "GreenstoneApplication.h"
+
+#import "PrefTable.h"
+#import "PrefView.h"
+
+
+
+@implementation PrefView
+
+- (id)initWithFrame:(struct CGRect)frame withParent:(UIView*)parent 
+        withCollection:(NSString*)collection withTitle:(NSString*)title
+{
+  self = [super initWithFrame:frame];
+
+  _parent = parent;
+  _collection = collection;
+
+  // Create the storage array.
+  // _cellResultList = [[NSMutableArray alloc] init]; // ****
+
+  int frame_x_dim = CGRectGetMaxX(frame)+1;
+  int frame_y_dim = CGRectGetMaxY(frame)+1;
+  
+  int nav_x_org = 0.0f;
+  int nav_y_org = 0.0f;
+  int nav_x_dim = frame_x_dim;
+  int nav_y_dim = TOP_NAVBAR_HEIGHT;
+  CGRect navrect = CGRectMake(nav_x_org,nav_y_org,nav_x_dim,nav_y_dim);
+
+  // Create the navigation bar.
+  _navbar = [[UINavigationBar alloc] initWithFrame: navrect];
+  //[_navbar showLeftButton:@"Back" withStyle:2 rightButton:nil withStyle:0]; // 2 = arrow left. // *** do enum for "2"
+  [_navbar showButtonsWithLeftTitle:@"Back" rightTitle:nil leftBack:YES];
+  [_navbar enableAnimation];
+  [_navbar setBarStyle: UIBarStyleDefault]; 
+  [_navbar setDelegate:self];
+
+  [self setTitle:title];
+
+
+  CGRect pref_rect = frame;
+  pref_rect.origin.y += 45;
+  pref_rect.size.height -= 45;
+
+  _prefTable = [ [ PrefTable alloc ] initWithFrame: pref_rect ];
+  [_prefTable reloadData];
+
+  // [self setTitle:collection]; // ***** can't seem to be this to work!!!! but does in MenuCascadeView
+
+
+  [self addSubview: _navbar];
+  [self addSubview: _prefTable];
+
+  return self;
+}
+
+
+-(void) setTitle:(NSString*)title
+{
+  UINavigationItem* navtitle = [UINavigationItem alloc];
+  [_navbar pushNavigationItem: [navtitle initWithTitle: title]];
+}
+
+-(NSString*) languagePref
+{
+  return [_prefTable languagePref];
+}
+
+
+//***********
+//* Delegates 
+//***********
+
+- (void)navigationBar:(UINavigationBar*)navbar buttonClicked:(int)button
+{
+  switch (button) 
+  {
+    case 1:  // left
+      [GreenstoneApplication setInCollection:nil];
+      [GreenstoneApplication transitionView:UITransitionBothShiftRight 
+          fromView:self toView:_parent];
+      break;
+
+    default:
+      NSLog(@"Unrecognised navbar button = %d",button);
+      break;
+  }
+
+}
+
+
+-(void) dealloc
+{
+  [_collection release];
+
+  [super dealloc];
+}
+
+@end
+
Index: /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/PrefViewController.h
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/PrefViewController.h	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/PrefViewController.h	(revision 24799)
@@ -0,0 +1,11 @@
+
+#import <UIKit/UIKit.h>
+
+#define PREF_NUM_GROUPS 2
+#define PREF_CELLS_PER_GROUP 2
+
+@interface PrefViewController : UITableViewController <UITextFieldDelegate> {
+	UITextField *activeTextField;
+}
+
+@end
Index: /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/PrefViewController.mm
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/PrefViewController.mm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/PrefViewController.mm	(revision 24799)
@@ -0,0 +1,209 @@
+
+#import "PrefViewController.h"
+
+
+@implementation PrefViewController
+
+- (id) init {
+    self = [ super initWithStyle: UITableViewStyleGrouped ];
+	
+    if (self != nil) {
+        self.title = @"Preferences";
+    }
+    return self;
+}
+
+/*
+// The designated initializer. Override to perform setup that is required before the view is loaded.
+- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
+    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
+        // Custom initialization
+    }
+    return self;
+}
+*/
+
+
+// Implement loadView to create a view hierarchy programmatically, without using a nib.
+- (void)loadView {
+	[super loadView];
+}
+
+/*
+// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
+- (void)viewDidLoad {
+    [super viewDidLoad];
+}
+*/
+
+
+/*
+ // Override to allow orientations other than the default portrait orientation.
+- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
+	// Return YES for supported orientations
+	return (interfaceOrientation == UIInterfaceOrientationPortrait);
+}
+*/
+/*
+- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation duration:(NSTimeInterval)duration {
+	LogMethod();
+	switch (interfaceOrientation) {
+		 case UIInterfaceOrientationPortrait: 
+		 {
+		 }
+		 break;
+		 
+		 case UIInterfaceOrientationLandscapeRight: 
+		 {
+		 }
+		 break;
+		 
+		 case UIInterfaceOrientationLandscapeRight: 
+		 {
+		 }
+		 break;
+	}
+}
+ 
+- (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
+	LogMethod();
+}
+*/
+
+- (void)didReceiveMemoryWarning {
+	// Releases the view if it doesn't have a superview.
+    [super didReceiveMemoryWarning];
+	
+	// Release any cached data, images, etc that aren't in use.
+}
+
+- (void)viewDidUnload {
+	// Release any retained subviews of the main view.
+	// e.g. self.myOutlet = nil;
+	activeTextField = nil;
+}
+
+- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
+
+    /* Number of logical groups, including labels ?!?*/
+    return PREF_NUM_GROUPS;
+}
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
+{
+    switch (section) {
+        case(0):
+            return 1;
+            break;
+        case(1):
+            return 2;
+            break;
+    }
+	
+    return 0;
+}
+
+- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
+{
+    switch (section) {
+        case(0):
+            return @"Presentation";
+            break;
+        case(1):
+            return @"Search";
+            break;
+    }
+    return nil;
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
+{
+    NSString *CellIdentifier = [ NSString stringWithFormat: @"%d:%d", [ indexPath indexAtPosition: 0 ], [ indexPath indexAtPosition:1 ]];
+	
+    UITableViewCell *cell = [ tableView dequeueReusableCellWithIdentifier: CellIdentifier];
+	
+    if (cell == nil) {
+        cell = [ [ [ UITableViewCell alloc ] initWithFrame: CGRectZero reuseIdentifier: CellIdentifier] autorelease ];
+		
+        cell.selectionStyle = UITableViewCellSelectionStyleNone;
+		
+        switch ([ indexPath indexAtPosition: 0]) {
+            case(0):
+                switch([ indexPath indexAtPosition: 1]) {
+                    case(0):
+		      {
+			UISegmentedControl *langControl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects: @"English", @"French", @"German", nil]];
+			langControl.contentMode = UIViewContentModeScaleToFill;
+			langControl.frame =  CGRectMake(145, 5, 150, 35);
+			langControl.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
+			langControl.selectedSegmentIndex = 0;
+			langControl.tag = 3;
+			[langControl addTarget:self action:@selector(segmentAction:) forControlEvents:UIControlEventValueChanged];
+			langControl.segmentedControlStyle = UISegmentedControlStyleBar;
+			
+			[cell addSubview:langControl];
+			cell.textLabel.text = @"Language";
+			[langControl release];
+		      }
+		      break;
+                }
+                break;
+            case(1):
+                switch ([ indexPath indexAtPosition: 1 ]) {
+                    case(0):
+		      {
+			UISwitch *stemmingControl = [ [ UISwitch alloc ] initWithFrame: CGRectMake(200, 10, 60, 30) ];
+			stemmingControl.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
+			stemmingControl.on = YES;
+			stemmingControl.tag = 1;
+			[stemmingControl addTarget:self action:@selector(switchAction:) forControlEvents:UIControlEventValueChanged];
+			[ cell addSubview: stemmingControl ];
+			cell.textLabel.text = @"Stemming";
+			[stemmingControl release];
+		      }
+		      break;
+		    case(1):
+		      {
+			UISwitch *casematchControl = [ [ UISwitch alloc ] initWithFrame: CGRectMake(200, 10, 50, 30) ];
+			casematchControl.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
+			casematchControl.on = NO;
+			casematchControl.tag = 2;
+			[casematchControl addTarget:self action:@selector(switchAction:) forControlEvents:UIControlEventValueChanged];
+			[ cell addSubview: casematchControl ];
+			cell.textLabel.text = @"Case matching";
+			[casematchControl release];
+		      }
+		      break;
+		}
+                break;
+        }
+    }
+	
+    return cell;
+}
+
+#pragma mark ControlEventTarget Actions
+
+
+- (void)segmentAction:(UISegmentedControl*)sender
+{
+	if ([activeTextField canResignFirstResponder])
+		[activeTextField resignFirstResponder];
+	
+	DEBUGLOG(NSLog(@"segmentAction: sender = %d, segment = %d",  [sender tag], [sender selectedSegmentIndex]));
+}
+
+- (void)switchAction:(UISwitch*)sender
+{
+	if ([activeTextField canResignFirstResponder])
+		[activeTextField resignFirstResponder];
+	DEBUGLOG(NSLog(@"switchAction: sender = %d, isOn %d",  [sender tag], [sender isOn]));
+}
+
+
+- (void)dealloc {
+	[activeTextField release];
+    [super dealloc];
+}
+
+@end
Index: /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/QueryCascadeView.h
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/QueryCascadeView.h	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/QueryCascadeView.h	(revision 24799)
@@ -0,0 +1,22 @@
+
+#import "MenuCascadeView.h"
+#import "QueryView.h"
+
+@interface QueryCascadeView: MenuCascadeView
+{
+  NSMutableArray* _queryViews;
+}
+
+-(id) initWithFrame:(CGRect)rect withParent:(UIView*)parent 
+        withCollection:(NSString*)collection withTitle:(NSString*)title withGID:(NSString*)gid;
+
+-(UIView*) directEntry:(int)rowId;
+
+-(void) appendMenuItem:(NSObject*)app withItem:(NSString*)item_label withGID:(NSString*)childGID;
+
+-(void) tableRowSelected:(NSNotification*)notification;
+
+-(void) dealloc;
+
+@end
+
Index: /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/QueryCascadeView.mm
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/QueryCascadeView.mm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/QueryCascadeView.mm	(revision 24799)
@@ -0,0 +1,65 @@
+
+#import "GSResultItem.h"
+#import "GreenstoneApplication.h"
+
+#import "QueryCascadeView.h"
+
+
+@implementation QueryCascadeView
+
+
+-(id) initWithFrame:(CGRect)rect withParent:(UIView*)parent 
+        withCollection:(NSString*)collection withTitle:(NSString*)title withGID:(NSString*)gid
+{
+  _queryViews = [[NSMutableArray alloc] initWithCapacity:MCInitCapacity];
+
+  return [super initWithFrame:rect withParent:parent withCollection:collection 
+	 withTitle:title withGID:gid];
+}
+
+-(void) appendMenuItem:(NSObject*)app withItem:(NSString*)item_label withGID:(NSString*)childGID
+{
+  [super appendMenuItem:app withItem:item_label withGID:childGID];
+
+  CGRect workarea_rect = [GreenstoneApplication workAreaRect];
+  QueryView* queryView = [[QueryView alloc] initWithFrame:workarea_rect 
+			withParent:self withCollection:childGID withTitle:item_label];
+
+  [_queryViews addObject:queryView];  
+
+}
+
+-(void) tableRowSelected:(NSNotification*)notification
+{
+  UITable* table = [notification object];
+  int rowId = [table selectedRow];
+
+  GreenstoneAPI* greenstoneAPI = [GreenstoneApplication greenstoneAPI];
+
+  NSString* childTitle = [[_oidItem objectAtIndex:rowId] title];  
+  NSString* childGID = [[_oidItem  objectAtIndex:rowId] oid]; 
+
+  NSString* chosenCollection = [[NSString alloc] initWithString:childGID]; 
+
+  CGRect workarea_rect = [GreenstoneApplication workAreaRect];
+  QueryView* queryView = [_queryViews objectAtIndex:rowId];
+
+  [GreenstoneApplication setInCollection:chosenCollection];
+  [GreenstoneApplication transitionView:UITransitionBothShiftLeft 
+        fromView:self toView:queryView];
+}
+
+-(UIView*) directEntry:(int)rowId
+{
+  return [_queryViews objectAtIndex:rowId];
+}
+
+-(void) dealloc
+{
+  [_queryViews release];
+
+  [super dealloc];
+}
+
+
+@end
Index: /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/QueryView.h
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/QueryView.h	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/QueryView.h	(revision 24799)
@@ -0,0 +1,62 @@
+#import <Foundation/Foundation.h>
+#import <Foundation/NSDictionary.h>
+
+#import <UIKit/UIKit.h>
+#import <UIKit/UITextLabel.h>
+#import <UIKit/UIKeyboard.h>
+#import <UIKit/UIImageAndTextTableCell.h>
+#import <UIKit/UISearchField.h>
+#import <UIKit/UIApplication.h>
+
+// **** can searchtablecell be done away with?
+
+@interface SearchTableCell : UIImageAndTextTableCell
+{
+        UITextLabel* song_name;
+        UITextLabel* artist_name;
+        
+@public
+        char m_Path[256];
+}
+@end
+
+
+@interface QueryView : UIView
+{
+  UIView* _parent;
+  NSString* _collection;
+
+  UIKeyboard* _keyboard;
+  BOOL _keyboardVisible;
+ 
+  UINavigationBar* _navbar;
+  //UISearchField* _searchBox;
+  UISearchBar* _searchBar;
+       
+  NSMutableArray* _cellResultList;
+  NSMutableArray* _oidItem;
+  
+  UITable* _table;
+
+}
+
+-(id) initWithFrame:(struct CGRect)frame withParent:(UIView*)parent 
+         withCollection:(NSString*)collection withTitle:(NSString*)title;
+
+-(void) setTitle:(NSString*)title;
+
+
+-(void) navigationBar:(UINavigationBar*)navbar buttonClicked:(int)button;
+
+-(void) tableRowSelected:(NSNotification*)notification;
+-(void) asynchronousLoad:(NSTimer*)timer;
+
+-(void)keyboardInput:(id)k shouldInsertText:(id)i isMarkedText:(int)b;
+
+- (void)keyboardReturnPressed;
+- (void)ShowKeyboard;
+- (void)HideKeyboard;
+
+-(void) dealloc;
+
+@end
Index: /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/QueryView.mm
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/QueryView.mm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/QueryView.mm	(revision 24799)
@@ -0,0 +1,404 @@
+#import <CoreFoundation/CoreFoundation.h>
+#import <Foundation/Foundation.h>
+#import <UIKit/CDStructures.h>
+#import <UIKit/UITextLabel.h>
+#import <UIKit/UIDateLabel.h> // For defaultFont.
+#import <UIKit/UITable.h>
+#import <UIKit/UITableCell.h>
+#import <UIKit/UITableColumn.h>
+//#import <UIKit/UISearchField.h>
+#import <UIKit/UISearchBar.h>
+#import <UIKit/UIFrameAnimation.h>
+#import <UIKit/UITransitionView.h>
+#import <UIKit/UIAnimator.h>
+
+#import "GreenstoneApplication.h"
+//#import "SimpleWebView.h"
+#import "GSResultItem.h"
+
+#import "QueryView.h"
+
+@implementation SearchTableCell
+
+// ***** is the following needed, or need to be modified? 
+- (void) drawContentInRect: (struct CGRect)rect selected: (BOOL) selected
+{
+  [song_name setHighlighted: selected];
+  [artist_name setHighlighted: selected];
+  [super drawContentInRect: rect selected: selected];
+}
+
+@end
+
+
+@implementation QueryView
+
+- (id)initWithFrame:(struct CGRect)frame withParent:(UIView*)parent 
+       withCollection:(NSString*)collection withTitle:(NSString*)title
+{
+  self = [super initWithFrame:frame];
+
+  _parent = parent;
+  _collection = collection;
+
+  // Create the storage array.
+  _cellResultList = [[NSMutableArray alloc] init];
+  _oidItem = [[NSMutableArray alloc] init];
+
+
+  // Create the navigation bar
+  int frame_x_dim = CGRectGetMaxX(frame)+1;
+  int frame_y_dim = CGRectGetMaxY(frame)+1;
+  
+  int nbr1_x_org = 0;
+  int nbr1_y_org = 0;
+  int nbr1_x_dim = frame_x_dim;
+  int nbr1_y_dim = TOP_NAVBAR_HEIGHT;
+
+  CGRect navbar1_rect = CGRectMake(nbr1_x_org,nbr1_y_org,nbr1_x_dim,nbr1_y_dim);
+
+  UINavigationBar* navbar1 = [[UINavigationBar alloc] initWithFrame:navbar1_rect];
+  [navbar1 showLeftButton:@"Back" withStyle:1 rightButton:nil withStyle:0]; // 2 = arrow left.
+  [navbar1 setBarStyle: UIBarStyleDefault]; 
+  [self addSubview: navbar1];
+  [navbar1 enableAnimation];
+  [navbar1 setDelegate:self];
+
+  _navbar = navbar1;
+  [self setTitle:title];
+
+
+  // Not sure if a second nav bar is really the way to get a 
+  // search box with background seamlessly merged with main nav bar
+  // Tried to make 1 navbar high enough for everything, but back 
+  // button was alligned to bottom of bar
+
+  int nbr2_x_org = nbr1_x_org;
+  int nbr2_y_org = nbr1_y_dim;
+  int nbr2_x_dim = nbr1_x_dim;
+  int nbr2_y_dim = [UISearchField defaultHeight];
+
+  CGRect navbar2_rect = CGRectMake(nbr2_x_org,nbr2_y_org,nbr2_x_dim,nbr2_y_dim);
+  UINavigationBar* navbar2 = [[UINavigationBar alloc] initWithFrame:navbar2_rect];
+  [navbar2 showLeftButton:nil withStyle:0 rightButton:nil withStyle:0]; 
+  [navbar2 enableAnimation];
+  [navbar2 setBarStyle: UIBarStyleDefault]; 
+  [navbar2 setDelegate:self];
+
+  [self addSubview: navbar2];
+
+
+  // Create the search box.
+
+  int sr_x_org = 30;
+  int sr_y_org = 0;
+  int sr_x_dim =  frame.size.width - (2*30);
+  int sr_y_dim = [UISearchField defaultHeight];
+
+  CGRect search_rect = CGRectMake(sr_x_org,sr_y_org,sr_x_dim,sr_y_dim);
+
+  _searchBar = [[UISearchBar alloc] initWithFrame:search_rect];
+  _searchBar.delegate = self;
+  _searchBar.showsCancelButton = NO;
+
+  //_searchBox = [[UISearchField alloc] initWithFrame:search_rect];
+  //[_searchBox setClearButtonStyle:2];
+  //[_searchBox setFont:[UIFont systemFontOfSize:14.0]];
+
+  ////[[_searchBox textTraits] setReturnKeyType: UIReturnKeySearch];
+  ////[[_searchBox textTraits] setEditingDelegate:self];
+  ////[[_searchBox textTraits] setAutoCapsType: NO];
+  ////[[_searchBox textTraits] setAutoCorrectionType:1];
+
+
+  [_searchBar setText:@""];
+  ////[_searchBox setDisplayEnabled:YES];
+
+  [_searchBar becomeFirstResponder];
+
+
+  // Create the table.
+  int tab_y_org = nbr2_y_org+nbr2_y_dim;
+  CGRect table_rect = CGRectMake(0, tab_y_org, frame.size.width, frame_y_dim - tab_y_org);
+
+  _table = [[UITable alloc] initWithFrame:table_rect];
+  [self addSubview: _table];
+
+  UITableColumn *col = [[UITableColumn alloc] initWithTitle: @"iMPDclient" identifier: @"column1" width: frame_x_dim];
+  [_table addTableColumn: col];
+  [_table setDelegate: self];
+  [_table setDataSource: self];
+  [_table setSeparatorStyle:1];
+  [_table setRowHeight:42.0f];
+  
+
+  // Create the keyboard
+  int kb_x_org = 0;
+  int kb_y_org = 410 - [UIKeyboard defaultSize].height;
+  int kb_x_dim = frame.size.width; // ****? what about when landscape
+  int kb_y_dim = [UIKeyboard defaultSize].height;
+  CGRect kb_rect = CGRectMake(kb_x_org,kb_y_org,kb_x_dim,kb_y_dim);
+
+  //_keyboard = [[UIKeyboard alloc] initWithFrame:kb_rect];
+
+  //[self addSubview: _keyboard];
+  //_keyboardVisible = YES;
+  
+  [navbar2 addSubview:_searchBar];
+
+  return self;
+}
+
+-(void) setTitle:(NSString*)title
+{
+  UINavigationItem* navtitle = [UINavigationItem alloc];
+  [_navbar pushNavigationItem: [navtitle initWithTitle:title]];
+}
+
+
+- (void)performQuery:(NSString *)searchtext
+{
+  GreenstoneAPI* greenstoneAPI = [GreenstoneApplication greenstoneAPI];
+  NSMutableArray* resultlist = greenstoneAPI->query(_collection,searchtext);
+
+  [_cellResultList removeAllObjects];
+  [_oidItem removeAllObjects];
+
+  if (resultlist != nil) {
+    NSEnumerator* resultlist_enumerator = [resultlist objectEnumerator];
+    GSResultItem* resultitem;
+    while (resultitem = [resultlist_enumerator nextObject]) {
+
+      SearchTableCell* cell = [[SearchTableCell alloc] init];
+      
+      NSString* resultoid = [resultitem oid];
+
+      NSString* resulttitle = [resultitem title];
+      if (resulttitle == nil) {
+	// doesn't have a valid title 
+	resulttitle = [[NSString alloc] initWithString:@"Unknown Title"];
+      }
+
+      NSString* resulturl = [resultitem srcurl];
+      if (resulturl == nil) { // **** don't need to do this check now
+	// doesn't have a valid srcurl => set as the empty string
+	resulturl = [[NSString alloc] initWithString:@""];
+      }
+
+      [cell setTitle:resulttitle];
+      [_cellResultList addObject:cell];
+      [_oidItem addObject:resultitem];
+
+      [cell release];
+    }
+    [resultlist release];
+  }
+
+  // Update the table contents.
+  [_table reloadData];
+}
+
+
+
+//***********
+//* Delegates 
+//***********
+
+-(void) navigationBar:(UINavigationBar*)navbar buttonClicked:(int)button
+{
+  switch (button) 
+  {
+    case 1:  // left
+      [GreenstoneApplication setInCollection:nil];
+      [GreenstoneApplication transitionView:UITransitionBothShiftRight 
+          fromView:self toView:_parent];
+      break;
+
+    default:
+      NSLog(@"Unrecognised navbar button = %d",button);
+      break;
+  }
+}
+
+
+- (void)tableRowSelected:(NSNotification*)notification
+{
+  UITable* table = [notification object];
+  int rowId = [table selectedRow];
+
+  SearchTableCell* pCell = [table cellAtRow:rowId column:0];
+  [pCell setSelected:FALSE withFade:TRUE];
+
+  GSResultItem* oidItem = [_oidItem objectAtIndex:rowId];
+
+  NSString* oid = [oidItem oid];
+  NSString* srcurl = [oidItem srcurl];
+
+  NSURL *url = [NSURL alloc];
+
+  if (srcurl == nil) {
+
+    NSTimer *timer = [ NSTimer scheduledTimerWithTimeInterval: 0.3
+			 target: self
+			 selector: @selector(asynchronousLoad:)
+			 userInfo: oid
+			 repeats: NO ];
+    url = [url initWithString:@"file:///var/gs2-runtime-svn/ext/iOS3.x/loading.html"]; // ****
+
+    /* *****
+    GreenstoneAPI* greenstoneAPI = [GreenstoneApplication greenstoneAPI];
+    NSString* doctext = greenstoneAPI->getResolvedDocument(_collection,oid);
+    [doctext writeToFile:@"/tmp/gsdoc.html" atomically:NO encoding:NSUTF8StringEncoding error:nil];
+
+    // make sure file is writable by all 
+    // => allows for switching between running from command line and Springboard
+    system("chmod a+rw /tmp/gsdoc.html"); 
+
+    url = [url initWithString:@"file:///tmp/gsdoc.html"];
+    */
+
+  }
+  else {
+    NSString* fullurlstr = [[NSString alloc] initWithFormat:@"file://%@",srcurl];
+    url = [url initWithString:fullurlstr]; 
+  }
+
+  int transStyle = UITransitionBothShiftLeft;   
+  [GreenstoneApplication showWebView:transStyle fromView:self withURL:url];
+
+}
+
+-(void) asynchronousLoad:(NSTimer*)timer
+{
+  // **** This is identical to one in BrowseCascadeMenu
+  NSString* childGID = [timer userInfo];
+
+  GreenstoneAPI* greenstoneAPI = [GreenstoneApplication greenstoneAPI];
+  NSString* doctext = greenstoneAPI->getResolvedDocument(_collection,childGID);
+
+  [doctext writeToFile:@"/tmp/gsdoc.html" atomically:NO encoding:NSUTF8StringEncoding error:nil];
+  NSURL* url = [[NSURL alloc] initWithString:@"file:///tmp/gsdoc.html"];
+  system("chmod a+rw /tmp/gsdoc.html"); 
+
+  [GreenstoneApplication showWebView:0 fromView:self withURL:url];
+}
+
+
+- (int) numberOfRowsInTable: (UITable *)table
+{
+  return [_cellResultList count];
+}
+
+
+- (UITableCell *) table: (UITable *)table cellForRow: (int)row column: (int)col
+{
+  return [_cellResultList objectAtIndex:row];
+}
+
+- (UITableCell *) table: (UITable *)table cellForRow: (int)row column: (int)col reusing: (BOOL) reusing
+{
+  return [self table: table cellForRow: row column: col];
+}
+
+
+- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
+    NSString* query = [_searchBar text];
+
+    [self performQuery:query];
+}
+
+
+
+- (void)keyboardInputChangedSelection:(id)whatisthis
+{
+  // when i tap the search field, hide if keyboard is already there, or show if it isn't
+  if (!_keyboardVisible)
+    [self ShowKeyboard];
+}
+
+-(void)keyboardInput:(id)k shouldInsertText:(id)i isMarkedText:(int)b
+{
+  if ([i characterAtIndex:0] == 0xA) {
+    [self keyboardReturnPressed];
+
+    NSString* query = [_searchBar text];
+    [self performQuery:query];
+  }
+}
+
+- (void)scrollerWillStartDragging:(id)whatisthis
+{
+  // hide keyboard when start scrolling
+  if (_keyboardVisible)
+    [self HideKeyboard];
+}
+
+// --- KEYBOARD METHODS -----------------------------------------------
+
+- (void)keyboardReturnPressed
+{
+  [self HideKeyboard];
+}
+
+- (void)ShowKeyboard
+{
+  _keyboardVisible = YES;
+  
+  CGRect startFrame;
+  CGRect endFrame;
+  NSMutableArray *animations = [[NSMutableArray alloc] init];
+  
+  endFrame = CGRectMake(0.0f, 410 - [UIKeyboard defaultSize].height, 320, [UIKeyboard defaultSize].height);
+  startFrame = endFrame;
+  startFrame.origin.y = 245.0 + 216.;
+  
+  [_keyboard setFrame:startFrame];
+  
+  UIFrameAnimation *keyboardAnimation = [[UIFrameAnimation alloc] initWithTarget:_keyboard];
+  [keyboardAnimation setStartFrame:startFrame];
+  [keyboardAnimation setEndFrame:endFrame];
+  [keyboardAnimation setSignificantRectFields:2];
+  [keyboardAnimation setDelegate:self];
+  [animations addObject:keyboardAnimation];
+  [keyboardAnimation release];
+  
+  [[UIAnimator sharedAnimator] addAnimations:animations withDuration:.5 start:YES];
+}
+
+- (void)HideKeyboard
+{
+  _keyboardVisible = NO;
+  
+  CGRect startFrame;
+  CGRect endFrame;
+  NSMutableArray *animations = [[NSMutableArray alloc] init];
+  
+  startFrame = CGRectMake(0, 410 - [UIKeyboard defaultSize].height, 320, [UIKeyboard defaultSize].height);
+  endFrame = startFrame;
+  endFrame.origin.y = 245.0 + 216.;
+  
+  [_keyboard setFrame:startFrame];
+  
+  UIFrameAnimation *keyboardAnimation = [[UIFrameAnimation alloc] initWithTarget:_keyboard];
+  [keyboardAnimation setStartFrame:startFrame];
+  [keyboardAnimation setEndFrame:endFrame];
+  [keyboardAnimation setSignificantRectFields:2];
+  [keyboardAnimation setDelegate:self];
+  [animations addObject:keyboardAnimation];
+  [keyboardAnimation release];
+  
+  [[UIAnimator sharedAnimator] addAnimations:animations withDuration:.5 start:YES];
+}
+
+
+-(void) dealloc
+{
+  [_oidItem release];
+
+  [_collection release];
+
+  [super dealloc];
+}
+
+@end
+
Index: /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/SimpleWebView.h
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/SimpleWebView.h	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/SimpleWebView.h	(revision 24799)
@@ -0,0 +1,40 @@
+/*
+        By: Sean Heber  <sean@spiffytech.com>, J. Zdziarski
+        iApp-a-Day - November, 2007
+        BSD License
+*/
+#import <UIKit/UIKit.h>
+#import <UIKit/UIScroller.h>
+#import <UIKit/UIWebView.h>
+
+@interface MyWebView : UIWebView
+{
+
+}
+-(void) gestureEnded:(struct __GSEvent *)event;
+-(void) doubleTap:(struct __GSEvent *)event;
+
+@end
+
+@interface SimpleWebView : UIView {
+  UIView* _parent;
+  MyWebView *webView;
+  UIScroller *scroller;
+  NSURLRequest *urlRequest;
+
+  CGSize lastSize, size;
+}
+
+-(id)initWithFrame:(CGRect)frame;
+-(id)initWithFrame:(CGRect)frame withParent:(UIView*)parent;
+
+-(void) setParent:(UIView*)parent;
+
+-(id) loadURL:(NSURL*)url;
+
+
+
+-(void) dealloc;
+@end
+
+
Index: /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/SimpleWebView.mm
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/SimpleWebView.mm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Classes/SimpleWebView.mm	(revision 24799)
@@ -0,0 +1,195 @@
+/* BSD License: Based on SimpleWebView by Sean Heber  <sean@spiffytech.com>, J. Zdziarski  */
+
+#include <sys/select.h>
+
+#import <UIKit/UIView-Geometry.h>
+#import <UIKit/UIView-Rendering.h>
+
+#import "GreenstoneApplication.h"
+#import "SimpleWebView.h"
+
+// ****** change name away from SimpleWebView
+
+
+@implementation MyWebView
+- (void) gestureEnded:(struct __GSEvent *)event
+{
+    [ super gestureEnded: event ];
+    //[ _delegate gestureEnded: event ]; // *****
+}
+
+- (void) doubleTap:(struct __GSEvent *)event
+{
+    [ super doubleTap: event ];
+    //[ _delegate doubleTap: event ]; // *****
+}
+
+
+@end
+
+
+@implementation SimpleWebView
+
+-(void)view: (UIView*)v didSetFrame:(CGRect)f
+{
+    if (v == webView) {
+        [ scroller setContentSize: f.size ];
+    }
+}
+
+-(void)view:(id)v didDrawInRect:(CGRect)f duration:(float)d
+{
+    if (v == webView) {
+        size = [ webView bounds ].size;
+        if (size.height != lastSize.height
+        || size.width != lastSize.width)
+        {
+            lastSize = size;
+            [ scroller setContentSize: size ];
+        }
+    }
+}
+
+- (void)gestureEnded:(struct __GSEvent *)event {
+    [ webView redrawScaledDocument ];
+    [ webView setNeedsDisplay ];
+    [ scroller setContentSize: [ webView bounds ].size ];
+}
+
+- (void)doubleTap:(struct __GSEvent *)event {
+    struct timeval tv;
+    tv.tv_sec = 2;
+    tv.tv_usec = 0;
+    select(NULL, NULL, NULL, NULL, &tv);
+    [ webView redrawScaledDocument ];
+    [ webView setNeedsDisplay ];
+    [ scroller setContentSize: [ webView bounds ].size ];
+}
+
+
+-(void)dealloc
+{
+        [ urlRequest release ];
+        [ webView release ];
+        [ scroller release ];
+
+        [ super dealloc ];
+}
+
+-(id)initWithFrame: (CGRect)frame
+{
+  return [self initWithFrame:frame withParent:nil];
+}
+
+
+-(id)initWithFrame: (CGRect)frame withParent:(UIView*)parent
+{
+    [ super initWithFrame: frame ];
+
+    _parent = parent;
+    urlRequest = nil;
+
+    int frame_x_dim = frame.size.width;
+    int frame_y_dim = frame.size.height;
+
+    int nav_x_org = 0.0f;
+    int nav_y_org = 0.0f;
+    int nav_x_dim = frame_x_dim;
+    int nav_y_dim = TOP_NAVBAR_HEIGHT;
+    
+    CGRect navrect = CGRectMake(nav_x_org,nav_y_org,nav_x_dim,nav_y_dim);
+    UINavigationBar* navbar = [[UINavigationBar alloc] initWithFrame: navrect];
+
+    [navbar showButtonsWithLeftTitle:@"Back" rightTitle:nil leftBack:YES];
+    [navbar enableAnimation];
+    [navbar setBarStyle: UIBarStyleBlackTranslucent];  // Dark, transparent // ****
+    [navbar setDelegate: self];
+
+    int scroll_x_org = 0.0f;
+    int scroll_y_org = 0.0f;
+    int scroll_x_dim = frame_x_dim;
+    int scroll_y_dim = frame_y_dim;
+
+    CGRect scrollrect = CGRectMake(scroll_x_org,scroll_y_org,scroll_x_dim,scroll_y_dim);
+
+    scroller = [ [ UIScroller alloc ] initWithFrame: scrollrect ];
+    [ scroller setScrollingEnabled: YES ];
+    [ scroller setAdjustForContentSizeChange: YES ];
+    [ scroller setClipsSubviews: NO ];
+    [ scroller setAllowsRubberBanding: YES ];
+    [ scroller setDelegate: self ];
+
+
+    webView = [ [ MyWebView alloc ] initWithFrame: [ scroller bounds ] ];    
+    //[ webView setTilingEnabled: YES ];
+    //[ webView setTileSize: scrollrect.size ];
+    //[ webView setAutoresizes: YES];
+    [ webView setDelegate: self];
+    //[ webView setEnabledGestures: 0xFF ];
+    //[ webView setSmoothsFonts: YES ];
+    
+
+    [ self addSubview: scroller ];
+    [ scroller addSubview: webView ];
+
+    [self addSubview: navbar];
+	
+    return self;
+}
+
+
+-(void) setParent:(UIView*)parent
+{
+  _parent = parent;
+}
+
+
+-(id) loadURL:(NSURL*)url
+{
+    CGPoint zero;
+    zero.x = zero.y = 0;
+    [scroller scrollPointVisibleAtTopLeft: zero];
+
+    if (urlRequest != nil) { // ***** 
+      [urlRequest release];
+      urlRequest = nil;
+    }
+
+    urlRequest = [[NSURLRequest requestWithURL:url] retain];
+    [webView loadRequest:urlRequest];
+}
+
+
+//***********
+//* Delegates
+//***********
+
+
+
+-(void) navigationBar:(UINavigationBar*)navbar buttonClicked:(int)button 
+{
+  switch (button) 
+  {
+    case 1:  // left
+      if (_parent != nil) {
+	// only do transition if there is a parent view to go back to
+	int transStyle = UITransitionBothShiftRight;
+	[GreenstoneApplication transitionView:transStyle fromView:self toView:_parent];
+      }
+
+      // need to think about deallocating self? // *****
+      break;
+
+    default:
+      NSLog(@"Unrecognised button = %d",button);
+      break;
+  }
+}
+
+@end
+
+
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Greenstone2-Info.plist
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Greenstone2-Info.plist	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Greenstone2-Info.plist	(revision 24799)
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>English</string>
+	<key>CFBundleDisplayName</key>
+	<string>${PRODUCT_NAME}</string>
+	<key>CFBundleExecutable</key>
+	<string>${EXECUTABLE_NAME}</string>
+	<key>CFBundleIconFile</key>
+	<string></string>
+	<key>CFBundleIdentifier</key>
+	<string>com.yourcompany.${PRODUCT_NAME:rfc1034identifier}</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>${PRODUCT_NAME}</string>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>1.0</string>
+	<key>LSRequiresIPhoneOS</key>
+	<true/>
+</dict>
+</plist>
Index: /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Greenstone2.xcodeproj/project.pbxproj
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Greenstone2.xcodeproj/project.pbxproj	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Greenstone2.xcodeproj/project.pbxproj	(revision 24799)
@@ -0,0 +1,307 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 45;
+	objects = {
+
+/* Begin PBXBuildFile section */
+		1D3623260D0F684500981E51 /* TabBarSampleAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* TabBarSampleAppDelegate.m */; };
+		1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; };
+		1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; };
+		1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; };
+		28216C970DB411BC00E5133A /* ListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 28216C960DB411BC00E5133A /* ListViewController.m */; };
+		288765080DF74369002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765070DF74369002DB57D /* CoreGraphics.framework */; };
+		433495EA11BBBD4B0002851B /* tab_search.png in Resources */ = {isa = PBXBuildFile; fileRef = 433495E911BBBD4B0002851B /* tab_search.png */; };
+		433495EC11BBBD590002851B /* tab_star.png in Resources */ = {isa = PBXBuildFile; fileRef = 433495EB11BBBD590002851B /* tab_star.png */; };
+		433495EE11BBBD790002851B /* tab_contact.png in Resources */ = {isa = PBXBuildFile; fileRef = 433495ED11BBBD790002851B /* tab_contact.png */; };
+		433495F011BBBE090002851B /* tab_recent.png in Resources */ = {isa = PBXBuildFile; fileRef = 433495EF11BBBE090002851B /* tab_recent.png */; };
+		433495F211BBBE270002851B /* tab_list.png in Resources */ = {isa = PBXBuildFile; fileRef = 433495F111BBBE270002851B /* tab_list.png */; };
+		433495F811BBBFC30002851B /* StarViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 433495F411BBBFC30002851B /* StarViewController.m */; };
+		433495F911BBBFC30002851B /* RecentViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 433495F611BBBFC30002851B /* RecentViewController.m */; };
+		4334964111BBC1A00002851B /* SearchViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4334963F11BBC1A00002851B /* SearchViewController.m */; };
+		4334966B11BBCE4C0002851B /* tab_setting.png in Resources */ = {isa = PBXBuildFile; fileRef = 4334966A11BBCE4C0002851B /* tab_setting.png */; };
+		4334966E11BBCEBE0002851B /* SettingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4334966D11BBCEBE0002851B /* SettingViewController.m */; };
+		433496B111BBD5FB0002851B /* TableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 433496B011BBD5FB0002851B /* TableViewController.m */; };
+		436409CB11BBF06C008B6A4C /* DataManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 436409CA11BBF06C008B6A4C /* DataManager.m */; };
+		43640B3D11BC0DFC008B6A4C /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 43640B3C11BC0DFC008B6A4C /* Icon.png */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+		1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+		1D3623240D0F684500981E51 /* TabBarSampleAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TabBarSampleAppDelegate.h; sourceTree = "<group>"; };
+		1D3623250D0F684500981E51 /* TabBarSampleAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TabBarSampleAppDelegate.m; sourceTree = "<group>"; };
+		1D6058910D05DD3D006BFB54 /* TabBarSample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TabBarSample.app; sourceTree = BUILT_PRODUCTS_DIR; };
+		1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+		28216C950DB411BC00E5133A /* ListViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ListViewController.h; sourceTree = "<group>"; };
+		28216C960DB411BC00E5133A /* ListViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ListViewController.m; sourceTree = "<group>"; };
+		288765070DF74369002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
+		28A0AB4B0D9B1048005BE974 /* TabBarSample_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TabBarSample_Prefix.pch; sourceTree = "<group>"; };
+		29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+		433495E911BBBD4B0002851B /* tab_search.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = tab_search.png; sourceTree = "<group>"; };
+		433495EB11BBBD590002851B /* tab_star.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = tab_star.png; sourceTree = "<group>"; };
+		433495ED11BBBD790002851B /* tab_contact.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = tab_contact.png; sourceTree = "<group>"; };
+		433495EF11BBBE090002851B /* tab_recent.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = tab_recent.png; sourceTree = "<group>"; };
+		433495F111BBBE270002851B /* tab_list.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = tab_list.png; sourceTree = "<group>"; };
+		433495F411BBBFC30002851B /* StarViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StarViewController.m; sourceTree = "<group>"; };
+		433495F511BBBFC30002851B /* StarViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StarViewController.h; sourceTree = "<group>"; };
+		433495F611BBBFC30002851B /* RecentViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RecentViewController.m; sourceTree = "<group>"; };
+		433495F711BBBFC30002851B /* RecentViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RecentViewController.h; sourceTree = "<group>"; };
+		4334963F11BBC1A00002851B /* SearchViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SearchViewController.m; sourceTree = "<group>"; };
+		4334964011BBC1A00002851B /* SearchViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SearchViewController.h; sourceTree = "<group>"; };
+		4334966A11BBCE4C0002851B /* tab_setting.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = tab_setting.png; sourceTree = "<group>"; };
+		4334966C11BBCEBE0002851B /* SettingViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SettingViewController.h; sourceTree = "<group>"; };
+		4334966D11BBCEBE0002851B /* SettingViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SettingViewController.m; sourceTree = "<group>"; };
+		433496AF11BBD5FB0002851B /* TableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TableViewController.h; sourceTree = "<group>"; };
+		433496B011BBD5FB0002851B /* TableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TableViewController.m; sourceTree = "<group>"; };
+		436409C911BBF06C008B6A4C /* DataManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataManager.h; sourceTree = "<group>"; };
+		436409CA11BBF06C008B6A4C /* DataManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DataManager.m; sourceTree = "<group>"; };
+		43640B3C11BC0DFC008B6A4C /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Icon.png; sourceTree = "<group>"; };
+		8D1107310486CEB800E47090 /* TabBarSample-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "TabBarSample-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = SOURCE_ROOT; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		1D60588F0D05DD3D006BFB54 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */,
+				1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */,
+				288765080DF74369002DB57D /* CoreGraphics.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		080E96DDFE201D6D7F000001 /* Classes */ = {
+			isa = PBXGroup;
+			children = (
+				436409C911BBF06C008B6A4C /* DataManager.h */,
+				436409CA11BBF06C008B6A4C /* DataManager.m */,
+				433496AF11BBD5FB0002851B /* TableViewController.h */,
+				433496B011BBD5FB0002851B /* TableViewController.m */,
+				28216C950DB411BC00E5133A /* ListViewController.h */,
+				28216C960DB411BC00E5133A /* ListViewController.m */,
+				433495F511BBBFC30002851B /* StarViewController.h */,
+				433495F411BBBFC30002851B /* StarViewController.m */,
+				433495F711BBBFC30002851B /* RecentViewController.h */,
+				433495F611BBBFC30002851B /* RecentViewController.m */,
+				4334964011BBC1A00002851B /* SearchViewController.h */,
+				4334963F11BBC1A00002851B /* SearchViewController.m */,
+				4334966C11BBCEBE0002851B /* SettingViewController.h */,
+				4334966D11BBCEBE0002851B /* SettingViewController.m */,
+				1D3623240D0F684500981E51 /* TabBarSampleAppDelegate.h */,
+				1D3623250D0F684500981E51 /* TabBarSampleAppDelegate.m */,
+			);
+			path = Classes;
+			sourceTree = "<group>";
+		};
+		19C28FACFE9D520D11CA2CBB /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				1D6058910D05DD3D006BFB54 /* TabBarSample.app */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		29B97314FDCFA39411CA2CEA /* TabBarSample */ = {
+			isa = PBXGroup;
+			children = (
+				080E96DDFE201D6D7F000001 /* Classes */,
+				29B97315FDCFA39411CA2CEA /* Other Sources */,
+				29B97317FDCFA39411CA2CEA /* Resources */,
+				29B97323FDCFA39411CA2CEA /* Frameworks */,
+				19C28FACFE9D520D11CA2CBB /* Products */,
+			);
+			name = TabBarSample;
+			sourceTree = "<group>";
+		};
+		29B97315FDCFA39411CA2CEA /* Other Sources */ = {
+			isa = PBXGroup;
+			children = (
+				28A0AB4B0D9B1048005BE974 /* TabBarSample_Prefix.pch */,
+				29B97316FDCFA39411CA2CEA /* main.m */,
+			);
+			name = "Other Sources";
+			sourceTree = "<group>";
+		};
+		29B97317FDCFA39411CA2CEA /* Resources */ = {
+			isa = PBXGroup;
+			children = (
+				4334966A11BBCE4C0002851B /* tab_setting.png */,
+				433495F111BBBE270002851B /* tab_list.png */,
+				433495EB11BBBD590002851B /* tab_star.png */,
+				433495EF11BBBE090002851B /* tab_recent.png */,
+				433495E911BBBD4B0002851B /* tab_search.png */,
+				433495ED11BBBD790002851B /* tab_contact.png */,
+				43640B3C11BC0DFC008B6A4C /* Icon.png */,
+				8D1107310486CEB800E47090 /* TabBarSample-Info.plist */,
+			);
+			path = Resources;
+			sourceTree = "<group>";
+		};
+		29B97323FDCFA39411CA2CEA /* Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+				1DF5F4DF0D08C38300B7A737 /* UIKit.framework */,
+				1D30AB110D05D00D00671497 /* Foundation.framework */,
+				288765070DF74369002DB57D /* CoreGraphics.framework */,
+			);
+			name = Frameworks;
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+		1D6058900D05DD3D006BFB54 /* TabBarSample */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "TabBarSample" */;
+			buildPhases = (
+				1D60588D0D05DD3D006BFB54 /* Resources */,
+				1D60588E0D05DD3D006BFB54 /* Sources */,
+				1D60588F0D05DD3D006BFB54 /* Frameworks */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = TabBarSample;
+			productName = TabBarSample;
+			productReference = 1D6058910D05DD3D006BFB54 /* TabBarSample.app */;
+			productType = "com.apple.product-type.application";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		29B97313FDCFA39411CA2CEA /* Project object */ = {
+			isa = PBXProject;
+			buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "TabBarSample" */;
+			compatibilityVersion = "Xcode 3.1";
+			hasScannedForEncodings = 1;
+			mainGroup = 29B97314FDCFA39411CA2CEA /* TabBarSample */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				1D6058900D05DD3D006BFB54 /* TabBarSample */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+		1D60588D0D05DD3D006BFB54 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				433495EA11BBBD4B0002851B /* tab_search.png in Resources */,
+				433495EC11BBBD590002851B /* tab_star.png in Resources */,
+				433495EE11BBBD790002851B /* tab_contact.png in Resources */,
+				433495F011BBBE090002851B /* tab_recent.png in Resources */,
+				433495F211BBBE270002851B /* tab_list.png in Resources */,
+				4334966B11BBCE4C0002851B /* tab_setting.png in Resources */,
+				43640B3D11BC0DFC008B6A4C /* Icon.png in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+		1D60588E0D05DD3D006BFB54 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				1D60589B0D05DD56006BFB54 /* main.m in Sources */,
+				1D3623260D0F684500981E51 /* TabBarSampleAppDelegate.m in Sources */,
+				28216C970DB411BC00E5133A /* ListViewController.m in Sources */,
+				433495F811BBBFC30002851B /* StarViewController.m in Sources */,
+				433495F911BBBFC30002851B /* RecentViewController.m in Sources */,
+				4334964111BBC1A00002851B /* SearchViewController.m in Sources */,
+				4334966E11BBCEBE0002851B /* SettingViewController.m in Sources */,
+				433496B111BBD5FB0002851B /* TableViewController.m in Sources */,
+				436409CB11BBF06C008B6A4C /* DataManager.m in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+		1D6058940D05DD3E006BFB54 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				COPY_PHASE_STRIP = NO;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = TabBarSample_Prefix.pch;
+				INFOPLIST_FILE = "TabBarSample-Info.plist";
+				PRODUCT_NAME = TabBarSample;
+			};
+			name = Debug;
+		};
+		1D6058950D05DD3E006BFB54 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				COPY_PHASE_STRIP = YES;
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = TabBarSample_Prefix.pch;
+				INFOPLIST_FILE = "TabBarSample-Info.plist";
+				PRODUCT_NAME = TabBarSample;
+			};
+			name = Release;
+		};
+		C01FCF4F08A954540054247B /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				GCC_C_LANGUAGE_STANDARD = c99;
+				GCC_PREPROCESSOR_DEFINITIONS = DEBUGON;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				PREBINDING = NO;
+				SDKROOT = iphoneos3.0;
+			};
+			name = Debug;
+		};
+		C01FCF5008A954540054247B /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				GCC_C_LANGUAGE_STANDARD = c99;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 3.0;
+				PREBINDING = NO;
+				SDKROOT = iphoneos3.0;
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "TabBarSample" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				1D6058940D05DD3E006BFB54 /* Debug */,
+				1D6058950D05DD3E006BFB54 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		C01FCF4E08A954540054247B /* Build configuration list for PBXProject "TabBarSample" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				C01FCF4F08A954540054247B /* Debug */,
+				C01FCF5008A954540054247B /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = 29B97313FDCFA39411CA2CEA /* Project object */;
+}
Index: /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Greenstone2_Prefix.pch
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Greenstone2_Prefix.pch	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Greenstone2_Prefix.pch	(revision 24799)
@@ -0,0 +1,16 @@
+//
+// Prefix header for all source files of the 'Greenstone2' project
+//
+
+#ifdef __OBJC__
+    #import <Foundation/Foundation.h>
+    #import <UIKit/UIKit.h>
+#endif
+
+#ifdef DEBUGON
+#define DEBUGLOG(x) x
+#define LogMethod()	NSLog(@"%@ %@", self, NSStringFromSelector(_cmd))
+#else
+#define DEBUGLOG(x)
+#define LogMethod()	
+#endif
Index: /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Makefile
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Makefile	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/Makefile	(revision 24799)
@@ -0,0 +1,207 @@
+# Makefile for iPhone Application for iPhone gcc compiler (SDK Headers)
+# (Based on TabBarSample)
+#
+# Modified to work as an extension within:
+#  <greensotne_home>/ext/iOS-3.x directory
+
+PROJECTNAME=Greenstone2
+APPFOLDER=$(PROJECTNAME).app
+MINIMUMVERSION:=3.2
+
+SDK=/var/toolchain/sys32
+
+CC=arm-apple-darwin9-gcc
+CXX=arm-apple-darwin9-g++
+LD=$(CXX)
+
+
+LDFLAGS = -arch arm -lobjc
+LDFLAGS += -framework UIKit 
+LDFLAGS += -framework CoreGraphics
+LDFLAGS += -framework Foundation 
+//LDFLAGS += -framework AVFoundation
+//LDFLAGS += -framework AddressBook
+//LDFLAGS += -framework AddressBookUI
+//LDFLAGS += -framework AudioToolbox
+//LDFLAGS += -framework AudioUnit
+//LDFLAGS += -framework CFNetwork
+//LDFLAGS += -framework CoreAudio
+//LDFLAGS += -framework CoreData
+//LDFLAGS += -framework CoreFoundation 
+LDFLAGS += -framework CoreGraphics
+//LDFLAGS += -framework GraphicsServices
+//LDFLAGS += -framework CoreLocation
+//LDFLAGS += -framework ExternalAccessory
+//LDFLAGS += -framework GameKit
+//LDFLAGS += -framework IOKit
+//LDFLAGS += -framework MapKit
+//LDFLAGS += -framework MediaPlayer
+//LDFLAGS += -framework MessageUI
+//LDFLAGS += -framework MobileCoreServices
+//LDFLAGS += -framework OpenAL
+//LDFLAGS += -framework OpenGLES
+//LDFLAGS += -framework QuartzCore
+//LDFLAGS += -framework Security
+//LDFLAGS += -framework StoreKit
+//LDFLAGS += -framework System
+//LDFLAGS += -framework SystemConfiguration
+//LDFLAGS += -framework CoreSurface
+//LDFLAGS += -framework GraphicsServices
+//LDFLAGS += -framework Celestial
+//LDFLAGS += -framework WebCore
+//LDFLAGS += -framework WebKit
+//LDFLAGS += -framework SpringBoardUI
+//LDFLAGS += -framework TelephonyUI
+//LDFLAGS += -framework JavaScriptCore
+//LDFLAGS += -framework PhotoLibrary
+
+LDFLAGS += -L"$(SDK)/usr/lib"
+LDFLAGS += -F"$(SDK)/System/Library/Frameworks"
+LDFLAGS += -F"$(SDK)/System/Library/PrivateFrameworks"
+LDFLAGS += -bind_at_load
+LDFLAGS += -multiply_defined suppress
+LDFLAGS += -march=armv6
+LDFLAGS += -mcpu=arm1176jzf-s 
+LDFLAGS += -mmacosx-version-min=10.5
+//LDFLAGS += -dynamiclib
+
+BUILDDIR=./build/$(MINIMUMVERSION)
+SRCDIR=./Classes
+RESDIR=./Resources
+
+OBJS=$(patsubst %.m,%.o,$(wildcard $(SRCDIR)/*.m))
+OBJS+=$(patsubst %.c,%.o,$(wildcard $(SRCDIR)/*.c))
+OBJS+=$(patsubst %.mm,%.o,$(wildcard $(SRCDIR)/*.mm))
+OBJS+=$(patsubst %.cpp,%.o,$(wildcard $(SRCDIR)/*.cpp))
+OBJS+=$(patsubst %.mm,%.o,$(wildcard ./*.mm))
+
+PCH=$(wildcard *.pch)
+RESOURCES=$(wildcard ./*.png)
+RESOURCES+=$(wildcard $(RESDIR)/*)
+NIBS=$(patsubst %.xib,%.nib,$(wildcard Xib/*.xib))
+
+CFLAGS += -g -DDEBUG -D_DEBUG
+CFLAGS += -I"$(SDK)/usr/include" 
+CFLAGS += -std=gnu99
+CFLAGS += -Diphoneos_version_min=$(MINIMUMVERSION)
+CFLAGS += -Wno-attributes -Wno-trigraphs -Wreturn-type -Wunused-variable
+CFLAGS += $(addprefix -I,$(SRCDIR))
+
+CXXFLAGS += -g -DDEBUG -D_DEBUG
+CXXFLAGS += -I"$(SDK)/usr/include" 
+CXXFLAGS += -Diphoneos_version_min=$(MINIMUMVERSION)
+CXXFLAGS += -Wno-attributes -Wno-trigraphs -Wreturn-type -Wunused-variable
+CXXFLAGS += $(addprefix -I,$(SRCDIR))
+CXXFLAGS += -I"$(SDK)/usr/include/c++/4.2.1" 
+CXXFLAGS += -I"$(SDK)/usr/include/c++/4.2.1/armv7-apple-darwin9" 
+
+
+#--
+# Now for Greenstone specific flags
+#--
+
+GSDL_DIR = ../..
+GDBM_DIR = $(GSDL_DIR)/common-src/packages/gdbm
+
+INDEXERS_DIR  = $(GSDL_DIR)/common-src/indexers
+PACKAGES_DIR  = $(GSDL_DIR)/common-src/packages
+COMMONLIB_DIR = $(GSDL_DIR)/common-src/src/lib
+COLSERVR_DIR  = $(GSDL_DIR)/runtime-src/src/colservr
+RECPTION_DIR  = $(GSDL_DIR)/runtime-src/src/recpt
+PROTOCOL_DIR  = $(GSDL_DIR)/runtime-src/src/protocol
+
+ENABLE_ACCENTFOLD = 1
+ifeq ($(ENABLE_ACCENTFOLD), 1)
+ACCENTFOLD_LIBS = $(INDEXERS_DIR)/packages/unac/libunac.a 
+else
+ACCENTFOLD_LIBS = 
+endif
+
+
+GSDL_CFLAGS = -I$(GDBM_DIR)/include \
+	 -I$(INDEXERS_DIR)/mgpp/text \
+	 -I$(COMMONLIB_DIR) \
+         -I$(PROTOCOL_DIR) -I$(COLSERVR_DIR) -I$(RECPTION_DIR)
+
+CFLAGS   += $(GSDL_CFLAGS)
+CXXFLAGS += $(GSDL_CFLAGS)
+
+LDFLAGS  +=  -L$(GDBM_DIR)/lib -lgdbm \
+	  -L$(INDEXERS_DIR)/mg/src/text -lmgtext \
+	  -L$(INDEXERS_DIR)/mg/lib      -lmglib \
+	  -L$(INDEXERS_DIR)/mgpp/text   -lmgpptext \
+	  -L$(INDEXERS_DIR)/mgpp/lib    -lmgpplib \
+          $(COMMONLIB_DIR)/gsdllib.a \
+          $(PROTOCOL_DIR)/gsdlprotocol.a \
+          $(COLSERVR_DIR)/gsdlcolservr.a \
+          $(RECPTION_DIR)/gsdlrecpt.a \
+	  $(ACCENTFOLD_LIBS) \
+          $(PACKAGES_DIR)/iconv/lib/libiconv.a \
+	  -L$(PACKAGES_DIR)/expat/lib -lexpat \
+          -L/usr/local/lib -lgcc_eh
+
+# =======
+
+
+
+all:	$(PROJECTNAME)
+
+$(PROJECTNAME):	$(OBJS) Makefile
+	$(LD) -o $@ $(filter %.o,$^) $(LDFLAGS)
+
+#	$(LD) $(LDFLAGS) $(filter %.o,$^) -o $@ 
+
+
+%.o:	%.m %.h $(PCH) $(filter-out $(patsubst %.o,%.h,$(OBJS)), $(wildcard $(SRCDIR)/*.h))
+	$(CC) --include $(PCH) -c $(CFLAGS) $< -o $@
+
+%.o:	%.m
+	$(CC) --include $(PCH) -c $(CFLAGS) $< -o $@
+
+%.o:	%.c %.h $(PCH)
+	$(CC) --include $(PCH) -c $(CFLAGS) $< -o $@
+
+%.o:	%.mm %.h $(PCH) $(filter-out $(patsubst %.o,%.h,$(OBJS)), $(wildcard $(SRCDIR)/*.h))
+	$(CXX) --include $(PCH) -c $(CXXFLAGS) $< -o $@
+
+%.o:	%.mm
+	$(CXX) --include $(PCH) -c $(CXXFLAGS) $< -o $@
+
+%.o:	%.cpp %.h $(PCH)
+	$(CXX) --include $(PCH) -c $(CXXFLAGS) $< -o $@
+
+dist:	$(PROJECTNAME) Makefile $(PROJECTNAME)-Info.plist $(RESOURCES)
+	@rm -rf $(BUILDDIR)
+	@mkdir -p $(BUILDDIR)/$(APPFOLDER)
+ifneq ($(RESOURCES),)
+	@-cp -r $(RESOURCES) $(BUILDDIR)/$(APPFOLDER)
+	@-$(foreach DIR, .svn .DS_Store .git* , find $(BUILDDIR)/$(APPFOLDER) -name '$(DIR)' -prune -exec rm -rfv {} \;;)
+endif
+	@cp $(PROJECTNAME)-Info.plist $(BUILDDIR)/$(APPFOLDER)/Info.plist
+	@./plutil -key CFBundleExecutable -value $(PROJECTNAME) $(BUILDDIR)/$(APPFOLDER)/Info.plist 
+	@./plutil -key CFBundleDisplayName -value $(PROJECTNAME) $(BUILDDIR)/$(APPFOLDER)/Info.plist 
+	@./plutil -key CFBundleName -value $(PROJECTNAME) $(BUILDDIR)/$(APPFOLDER)/Info.plist 
+	@./plutil -key CFBundleIdentifier -value com.yourcompany.iphone.$(PROJECTNAME) $(BUILDDIR)/$(APPFOLDER)/Info.plist
+	@./plutil -UIDeviceFamily -array $(BUILDDIR)/$(APPFOLDER)/Info.plist 
+	@./plutil -UIDeviceFamily -arrayadd -string 1 $(BUILDDIR)/$(APPFOLDER)/Info.plist 
+	@./plutil -UIDeviceFamily -arrayadd -string 2 $(BUILDDIR)/$(APPFOLDER)/Info.plist 
+	@./plutil -key NSMainNibFile -remove $(BUILDDIR)/$(APPFOLDER)/Info.plist 
+	@echo "APPL????" > $(BUILDDIR)/$(APPFOLDER)/PkgInfo
+	ldid -S $(PROJECTNAME)
+	@mv $(PROJECTNAME) $(BUILDDIR)/$(APPFOLDER)/
+
+install: dist
+	./appinstall $(BUILDDIR)/$(APPFOLDER)
+
+distclean:
+	@rm -rf $(BUILDDIR)
+
+clean:
+	@rm -f $(OBJS)
+	@rm -rf $(BUILDDIR)
+	@rm -f $(PROJECTNAME)
+
+.PHONY: all dist install distclean clean
+
+
+
Index: /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/gsdlsite.cfg
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/gsdlsite.cfg	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/gsdlsite.cfg	(revision 24799)
@@ -0,0 +1,59 @@
+# this file should be placed in the same directory as your library
+# executable file. it defines parameters that are particular to a
+# given site, and therefore should be edited to suit your site.
+
+# points to the GSDLHOME directory
+# This must be set, and must point to the top level Greenstone directory
+# (usually gsdl or Greenstone)
+gsdlhome    /var/code/gs2-runtime-svn 
+
+# this is the http address of GSDLHOME
+# if your webserver's DocumentRoot is set to $GSDLHOME
+# then httpprefix can be commented out
+httpprefix  /greenstone
+
+# this is the http address of the Greenstone web directory (which contains
+# images, style etc)
+# if your web directory is a top level folder inside $GSDLHOME, then this
+# can remain commented out, and will default to httpprefix/web
+#httpweb     /greenstone/web
+
+# this should contain the http address of the library.cgi script. This 
+# is not needed if the http server sets the environment variable 
+# SCRIPT_NAME
+# Generally this is not needed with Apache
+#gwcgi       /greenstone/cgi-bin/library.cgi
+
+# maxrequests is the most requests a fastcgi process
+# will serve before it exits. This can be set to a
+# low figure (like 1) while debugging and then set
+# to a high figure (like 10000) when everything is
+# working well.
+# Only applies if you are using fastcgi
+maxrequests 10000
+
+# Remote Greenstone Options (for server side)
+
+# If Perl is not already on your PATH, set the following to the 
+# full path of the perl bin directory (Perl's parent folder) 
+# and it will be prepended to the PATH.
+#perlpath /usr/bin
+
+# Options for FLI
+
+# If using Greenstone's GLIServer to run the Fedora Librarian
+# Interface (FLI), then you need to set fedora version and fedora home
+# variables, either below, or as environment variables. 
+# FEDORA_VERSION is the major version number of Fedora and  
+# FEDORA_HOME is the full path to your Fedora installation.
+# Setting fedorahome and fedoraversion here will over-ride the
+# FEDORA_HOME and FEDORA_VERSION environment variables.
+#fedorahome /full/path/to/fedora
+#fedoraversion 3
+
+# If using Greenstone's GLIServer to run the Fedora Librarian
+# Interface (FLI), then you need to set the full path to Java either as below 
+# or as the JAVA_HOME environment variable.
+# Setting javahome here will over-ride the JAVA_HOME environment variable.
+#javahome /full/path/to/j2sdk1.4-or-higher
+
Index: /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/loading.html
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/loading.html	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/loading.html	(revision 24799)
@@ -0,0 +1,8 @@
+<html>
+  <head>
+  </head>
+  <body>
+    <p><br><br>
+    <p>Loading ...
+  </body>
+</html>
Index: /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/main.mm
===================================================================
--- /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/main.mm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/iOS-3.x/trunk/main.mm	(revision 24799)
@@ -0,0 +1,13 @@
+
+#import "GreenstoneApplication.h"
+
+int main(int argc, char **argv)
+{
+    NSAutoreleasePool* autoreleasePool = [[NSAutoreleasePool alloc] init];
+    int retVal = UIApplicationMain(argc, argv, 
+			  	   @"GreenstoneApplication", @"GreenstoneApplication");
+
+    [autoreleasePool release];
+    return retVal;
+
+}
Index: /main/tags/2.85/gs2-extensions/imagemagick/trunk/src/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/imagemagick/trunk/src/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/imagemagick/trunk/src/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+source devel.bash
+
+for d in packages ; do
+    echo "Running $d/CASCADE-MAKE.sh"
+
+    (cd $d ; ./CASCADE-MAKE.sh $*)
+
+    if [ $? != 0 ] ; then
+	echo "Error encountered running $d/CASCADE-MAKE.sh"
+	exit 1
+    fi
+done
+
+if [ $makedist = "1"  ] ; then
+  default_toplevel_make_dist $GSDLOS
+fi
Index: /main/tags/2.85/gs2-extensions/imagemagick/trunk/src/devel.bash
===================================================================
--- /main/tags/2.85/gs2-extensions/imagemagick/trunk/src/devel.bash	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/imagemagick/trunk/src/devel.bash	(revision 24799)
@@ -0,0 +1,9 @@
+#!/bin/bash
+
+if [ -d cascade-make ] ; then
+  source cascade-make/lib/cascade-lib.bash GEXTIMAGEMAGICK . $*
+fi
+
+if [ -z $GEXTIMAGEMAGICK ] ; then
+  source setup.bash
+fi
Index: /main/tags/2.85/gs2-extensions/imagemagick/trunk/src/packages/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/imagemagick/trunk/src/packages/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/imagemagick/trunk/src/packages/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+source ../cascade-make/lib/cascade-lib.bash GEXTIMAGEMAGICK .. $*
+
+for d in TIFF JPEG LIBPNG JPEG2000 IMAGEMAGICK ; do
+    echo "    Running CASCADE-MAKE/$d.sh"
+
+    ./CASCADE-MAKE/$d.sh $*
+
+    if [ $? != 0 ] ; then
+	echo "Error encountered running CASCADE-MAKE/$d.sh"
+	exit 1
+    fi
+done
Index: /main/tags/2.85/gs2-extensions/imagemagick/trunk/src/packages/CASCADE-MAKE/IMAGEMAGICK.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/imagemagick/trunk/src/packages/CASCADE-MAKE/IMAGEMAGICK.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/imagemagick/trunk/src/packages/CASCADE-MAKE/IMAGEMAGICK.sh	(revision 24799)
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+package=ImageMagick
+version=-6.6.5-5
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTIMAGEMAGICK ../.. $*
+
+prefix=$GEXTIMAGEMAGICK_INSTALLED
+
+export CFLAGS="$CFLAGS -I$GEXTIMAGEMAGICK_INSTALLED/include"
+export CPPFLAGS="$CPPFLAGS -I$GEXTIMAGEMAGICK_INSTALLED/include"
+export CXXFLAGS="$CXXFLAGS -I$GEXTIMAGEMAGICK_INSTALLED/include"
+export LDFLAGS="$LDFLAGS -L$GEXTIMAGEMAGICK_INSTALLED/lib"
+export LD_LIBRARY_PATH="$GEXTIMAGEMAGICK_INSTALLED/lib"
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile $package $version
+opt_run_make $install $package $version "install"
+opt_run_make $clean $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
Index: /main/tags/2.85/gs2-extensions/imagemagick/trunk/src/packages/CASCADE-MAKE/JPEG.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/imagemagick/trunk/src/packages/CASCADE-MAKE/JPEG.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/imagemagick/trunk/src/packages/CASCADE-MAKE/JPEG.sh	(revision 24799)
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+package=jpeg
+version=-8b
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTIMAGEMAGICK ../.. $*
+
+prefix=$GEXTIMAGEMAGICK_INSTALLED
+
+
+export CFLAGS="$CFLAGS -I$GEXTIMAGEMAGICK_INSTALLED/include"
+export CPPFLAGS="$CPPFLAGS -I$GEXTIMAGEMAGICK_INSTALLED/include"
+export CXXFLAGS="$CXXFLAGS -I$GEXTIMAGEMAGICK_INSTALLED/include"
+export LDFLAGS="$LDFLAGS -L$GEXTIMAGEMAGICK_INSTALLED/lib"
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile $package $version
+opt_run_make $install $package $version "install"
+opt_run_make $clean $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
Index: /main/tags/2.85/gs2-extensions/imagemagick/trunk/src/packages/CASCADE-MAKE/JPEG2000.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/imagemagick/trunk/src/packages/CASCADE-MAKE/JPEG2000.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/imagemagick/trunk/src/packages/CASCADE-MAKE/JPEG2000.sh	(revision 24799)
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+package=jasper
+version=-1.900.1
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTIMAGEMAGICK ../.. $*
+
+prefix=$GEXTIMAGEMAGICK_INSTALLED
+
+export CFLAGS="$CFLAGS -I$GEXTIMAGEMAGICK_INSTALLED/include -fPIC"
+export CPPFLAGS="$CPPFLAGS -I$GEXTIMAGEMAGICK_INSTALLED/include -fPIC"
+export CXXFLAGS="$CXXFLAGS -I$GEXTIMAGEMAGICK_INSTALLED/include -fPIC"
+export LDFLAGS="$LDFLAGS -L$GEXTIMAGEMAGICK_INSTALLED/lib"
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile $package $version
+opt_run_make $install $package $version "install"
+opt_run_make $clean $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
Index: /main/tags/2.85/gs2-extensions/imagemagick/trunk/src/packages/CASCADE-MAKE/LIBPNG.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/imagemagick/trunk/src/packages/CASCADE-MAKE/LIBPNG.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/imagemagick/trunk/src/packages/CASCADE-MAKE/LIBPNG.sh	(revision 24799)
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+package=libpng
+version=-1.4.4
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTIMAGEMAGICK ../.. $*
+
+prefix=$GEXTIMAGEMAGICK_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile $package $version
+opt_run_make $install $package $version "install"
+opt_run_make $clean $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
Index: /main/tags/2.85/gs2-extensions/imagemagick/trunk/src/packages/CASCADE-MAKE/TIFF.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/imagemagick/trunk/src/packages/CASCADE-MAKE/TIFF.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/imagemagick/trunk/src/packages/CASCADE-MAKE/TIFF.sh	(revision 24799)
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+package=tiff
+version=-3.9.4
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTIMAGEMAGICK ../.. $*
+
+prefix=$GEXTIMAGEMAGICK_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile $package $version
+opt_run_make $install $package $version "install"
+opt_run_make $clean $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
Index: /main/tags/2.85/gs2-extensions/imagemagick/trunk/src/setup.bash
===================================================================
--- /main/tags/2.85/gs2-extensions/imagemagick/trunk/src/setup.bash	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/imagemagick/trunk/src/setup.bash	(revision 24799)
@@ -0,0 +1,49 @@
+extdesc="the ImageMagick extension"
+
+full_setup=`pwd`/${BASH_SOURCE}
+fulldir=${full_setup%/*}
+fulldir=${fulldir%/.}
+
+if [ "x$GSDLHOME" = "x" ] ; then
+  if [ -e ../../setup.bash ] ; then
+    export gsopt_noexts=1 && pushd ../.. && source setup.bash && popd 
+    export gsopt_noexts=
+  fi
+fi
+
+if [ "x$GEXTIMAGEMAGICK" = "x" ] ; then
+  export GEXTIMAGEMAGICK=$fulldir
+  export GEXTIMAGEMAGICK_INSTALLED=$GEXTIMAGEMAGICK/$GSDLOS
+
+  export PATH=$GEXTIMAGEMAGICK_INSTALLED/bin:$PATH
+
+  if [ "x$LD_LIBRARY_PATH" = "x" ] ; then
+    export LD_LIBRARY_PATH=$GEXTIMAGEMAGICK_INSTALLED/lib
+  else
+    export LD_LIBRARY_PATH=$GEXTIMAGEMAGICK_INSTALLED/lib:$LD_LIBRARY_PATH
+  fi
+  if [ "x$DYLD_LIBRARY_PATH" = "x" ] ; then
+    export DYLD_LIBRARY_PATH=$GEXTIMAGEMAGICK_INSTALLED/lib
+  else
+    export DYLD_LIBRARY_PATH=$GEXTIMAGEMAGICK_INSTALLED/lib:$DYLD_LIBRARY_PATH
+  fi
+
+  if [ -e "devel-srcpack" ] ; then
+    export LD_LIBRARY_PATH=$GEXTIMAGEMAGICK_INSTALLED/devel/lib:$LD_LIBRARY_PATH
+    export DYLD_LIBRARY_PATH=$GEXTIMAGEMAGICK_INSTALLED/devel/lib:$DYLD_LIBRARY_PATH
+  fi
+
+  
+  extdir=${GEXTIMAGEMAGICK##*/}
+
+  if [ "x$GSDLEXTS" = "x" ] ; then
+    export GSDLEXTS=$extdir
+  else 
+    export GSDLEXTS=$GSDLEXTS:$extdir
+  fi
+
+
+  echo "+Your environment is now setup for $extdesc"
+else
+  echo "+Your environment is already setup for $extdesc"
+fi
Index: /main/tags/2.85/gs2-extensions/imagemagick/trunk/src/setup.bat
===================================================================
--- /main/tags/2.85/gs2-extensions/imagemagick/trunk/src/setup.bat	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/imagemagick/trunk/src/setup.bat	(revision 24799)
@@ -0,0 +1,57 @@
+@echo off
+pushd "%CD%"
+CD /D "%~dp0"
+set GSDLLANG=en
+set extdesc="the ImageMagick extension"
+
+if "%OS%" == "Windows_NT" goto WinNT
+if "%OS%" == "" goto Win95
+if "%GSDLLANG%" == "en" echo Setup failed - your PATH has not been set
+if "%GSDLLANG%" == "es" echo No se pudo realizar la configuraci¢n - no se ha establecido la RUTA.
+if "%GSDLLANG%" == "fr" echo Echc de l'installation - votre variable PATH n'a pas t ajuste
+if "%GSDLLANG%" == "ru" echo áâ ­®¢ª  ­¥ ã€ « áì -  ­¥ ¡ë« ãáâ ­®¢«¥­
+goto End
+
+:WinNT
+set GEXTIMAGEMAGICK=%CD%
+set GEXTIMAGEMAGICK_INSTALLED=%GEXTIMAGEMAGICK%\windows
+
+set PATH=%GEXTIMAGEMAGICK_INSTALLED%\bin;%PATH%
+set GS_CP_SET=yes
+goto Success
+
+:Win95
+if "%1" == "SetEnv" goto Win95Env
+REM We'll invoke a second copy of the command processor to make
+REM sure there's enough environment space
+COMMAND /E:2048 /K %0 SetEnv
+goto End
+
+:Win95Env
+set GEXTIMAGEMAGICK=%CD%
+set PATH="%GEXTIMAGEMAGICK_INSTALLED%\bin";"%PATH%"
+set GS_CP_SET=yes
+goto Success
+
+:Success
+
+set fulldir=%~dp0
+
+:: strip off everything up to (and including) ext dir
+set extdir=%fulldir:*ext\=%
+
+:: remove trailing slash
+set extdir=%extdir:\=%
+
+
+if "x%GSDLEXTS%" == "x" (
+  set GSDLEXTS=%extdir%
+) else (
+  set GSDLEXTS=%GSDLEXTS%:%extdir%
+)
+
+echo +Your environment is now setup for %extdesc%
+
+:End
+
+popd
Index: /main/tags/2.85/gs2-extensions/music-ir-src/trunk/CASCADE-MAKE.bat
===================================================================
--- /main/tags/2.85/gs2-extensions/music-ir-src/trunk/CASCADE-MAKE.bat	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-ir-src/trunk/CASCADE-MAKE.bat	(revision 24799)
@@ -0,0 +1,66 @@
+@echo off
+
+pushd "%CD%"
+CD /D "%~dp0"
+
+call cascade-make/lib/cascade-lib.bat
+
+:: Guaranteed that GSDLOS has now been set
+
+
+:: Make sure can find javac
+
+:: Remove any quotes from around JAVA_HOME
+if defined JAVA_HOME set JAVA_HOME=%JAVA_HOME:"=%
+
+
+if "%JAVA_HOME%" == "" (
+  echo Testing for Java compiler ...
+
+  javac -version 2>nul
+  if ERRORLEVEL 1 (
+    echo ... failed to find 'javac'
+    cmd /c exit -4
+    goto:EOF
+  ) else (
+    echo ... found it
+  )
+) else (
+
+  :: Good chance it's in the path already => don't want to see any output
+  javac -version 2>nul
+  if ERRORLEVEL 1 (
+    echo Setting path to include "%JAVA_HOME%\bin"
+    set "PATH=%JAVA_HOME%\bin;%PATH%"
+  )
+)
+
+
+for /D %%d IN ("%GSDLOS%" "lib\java") do (
+  if not exist "%GEXT_MUSICIR_INSTALLED%\%%d" (
+    echo Creating %GEXT_MUSICIR_INSTALLED%\%%d
+    mkdir "%GEXT_MUSICIR_INSTALLED%\%%d"
+  )
+)
+
+set dirlist=build-srcpack
+
+for /D %%d IN (%dirlist%) do (
+  echo Running %%d\CASCADE-MAKE.bat %*
+
+  (cd %%d && call CASCADE-MAKE.bat %* && cd ..)
+  
+  if ERRORLEVEL 1 (
+    echo Error encountered running %%d\CASCADE-MAKE.bat
+    cmd /c exit 1
+    goto:EOF
+  )
+)
+
+
+if  %install% == 1 (
+  type README.txt
+)
+
+
+
Index: /main/tags/2.85/gs2-extensions/music-ir-src/trunk/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/music-ir-src/trunk/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-ir-src/trunk/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,41 @@
+#!/bin/bash
+
+source cascade-make/lib/cascade-lib.bash GEXT_MUSICIR . $*
+
+if [ -z "$JAVA_HOME" ] ; then
+  echo "Testing for Java compiler ..."
+  javac -version
+  if [ $? != "0" ] ; then
+    echo "Failed to find 'javac'"
+    exit -1
+  fi
+fi
+
+if [ ! -e $GEXT_MUSICIR_INSTALLED ] ; then
+  echo "Creating $GEXT_MUSICIR_INSTALLED for installed files"
+  mkdir $GEXT_MUSICIR_INSTALLED
+fi
+
+if [ ! -e "$GEXT_MUSICIR_LIBJAVA" ] ; then
+  echo "Creating $GEXT_MUSICIR_LIBJAVA for Java lib and jar files"
+  mkdir -p "$GEXT_MUSICIR_LIBJAVA" 
+fi
+
+
+dirlist="build-srcpack"
+
+for d in $dirlist ; do
+  echo "Running $d/CASCADE-MAKE.sh $*"
+
+  (cd $d ; ./CASCADE-MAKE.sh $*)
+
+  if [ $? != 0 ] ; then
+    echo "Error encountered running $d/CASCADE-MAKE.sh"
+    exit 1
+  fi
+done
+
+
+if [ $install = "1" ] ; then
+  cat README.txt
+fi
Index: /main/tags/2.85/gs2-extensions/music-ir-src/trunk/README.txt
===================================================================
--- /main/tags/2.85/gs2-extensions/music-ir-src/trunk/README.txt	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-ir-src/trunk/README.txt	(revision 24799)
@@ -0,0 +1,3 @@
+
+Music-IR extension to Greenstone, based on jAudio from McGill University
+
Index: /main/tags/2.85/gs2-extensions/music-ir-src/trunk/bin/script/jaudio
===================================================================
--- /main/tags/2.85/gs2-extensions/music-ir-src/trunk/bin/script/jaudio	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-ir-src/trunk/bin/script/jaudio	(revision 24799)
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+if [ -z "$GEXT_MUSICIR" ] ; then
+  echo "Environment variable GEXT_MUSICIR is not set."
+  echo "Have you sourced setup.bash?"
+  exit -1
+fi
+
+( cd "$GEXT_MUSICIR/lib/java" && \
+  java -jar jaudio.jar  $* )
+
Index: /main/tags/2.85/gs2-extensions/music-ir-src/trunk/bin/script/jaudio.bat
===================================================================
--- /main/tags/2.85/gs2-extensions/music-ir-src/trunk/bin/script/jaudio.bat	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-ir-src/trunk/bin/script/jaudio.bat	(revision 24799)
@@ -0,0 +1,16 @@
+@echo off 
+
+if "%GEXT_MUSICIR%" == "" goto notSetup
+
+pushd  %GEXT_MUSICIR%\lib\java && java -jar jaudio.jar %* && popd
+
+goto done
+
+
+:notSetup
+
+  echo Environment variable GEXT_MUSICIR is not set.
+  echo Have you sourced setup.bash?
+  ERRORLEVEL=-1
+
+:done
Index: /main/tags/2.85/gs2-extensions/music-ir-src/trunk/build-srcpack/CASCADE-MAKE.bat
===================================================================
--- /main/tags/2.85/gs2-extensions/music-ir-src/trunk/build-srcpack/CASCADE-MAKE.bat	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-ir-src/trunk/build-srcpack/CASCADE-MAKE.bat	(revision 24799)
@@ -0,0 +1,14 @@
+@echo off
+
+for /D %%d IN (packages) do (
+  echo   Running %%d\CASCADE-MAKE.bat %*
+
+  (cd %%d && call CASCADE-MAKE.bat %* && cd ..)
+
+  if ERRORLEVEL 1 (
+    echo   Error encountered running %%d\CASCADE-MAKE.bat
+    cmd /c exit 1
+    goto:EOF
+  )
+)
+
Index: /main/tags/2.85/gs2-extensions/music-ir-src/trunk/build-srcpack/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/music-ir-src/trunk/build-srcpack/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-ir-src/trunk/build-srcpack/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+
+for d in packages ; do
+  echo "  Running $d/CASCADE-MAKE.sh $*"
+
+  (cd $d; ./CASCADE-MAKE.sh $*)
+
+  if [ $? != 0 ] ; then
+    echo "  Error encountered running $d/CASCADE-MAKE.sh"
+    exit 1
+  fi
+done
+
Index: /main/tags/2.85/gs2-extensions/music-ir-src/trunk/build-srcpack/packages/CASCADE-MAKE.bat
===================================================================
--- /main/tags/2.85/gs2-extensions/music-ir-src/trunk/build-srcpack/packages/CASCADE-MAKE.bat	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-ir-src/trunk/build-srcpack/packages/CASCADE-MAKE.bat	(revision 24799)
@@ -0,0 +1,15 @@
+@echo off
+
+for /D %%d IN (JAUDIO) do (
+  echo     Running CASCADE-MAKE\%%d.bat %*
+
+  call CASCADE-MAKE\%%d.bat %*
+
+  if ERRORLEVEL 1 (
+    echo     Error encountered running CASCADE-MAKE\%%d.bat
+    cmd /c exit 1
+    goto:EOF
+  )
+)
+
+
Index: /main/tags/2.85/gs2-extensions/music-ir-src/trunk/build-srcpack/packages/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/music-ir-src/trunk/build-srcpack/packages/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-ir-src/trunk/build-srcpack/packages/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+
+for d in JAUDIO ; do
+  echo "    Running CASCADE-MAKE/$d.sh $*"
+
+  ./CASCADE-MAKE/$d.sh $*
+
+  if [ $? != 0 ] ; then
+    echo "  Error encountered running CASCADE-MAKE/$d.sh"
+    exit 1
+  fi
+done
+
+
Index: /main/tags/2.85/gs2-extensions/music-ir-src/trunk/build-srcpack/packages/CASCADE-MAKE/JAUDIO.bat
===================================================================
--- /main/tags/2.85/gs2-extensions/music-ir-src/trunk/build-srcpack/packages/CASCADE-MAKE/JAUDIO.bat	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-ir-src/trunk/build-srcpack/packages/CASCADE-MAKE/JAUDIO.bat	(revision 24799)
@@ -0,0 +1,36 @@
+@echo off
+
+set package=jAudio0.4
+set version=-cvs-06052010
+
+set progname=%0
+
+call ..\..\cascade-make\lib\cascade-lib.bat
+
+
+set prefix=%GEXTVIDEO_INSTALLED%\%GSDLOS%
+
+REM opt_run_untar $force_untar $auto_untar $package $version
+
+if %compile% == 1 (
+  cd %package%%version% 
+  set "classpath=.;jAudioFeatureExtractor;tritonus_remaining-0.3.6.jar;tritonus_share-0.3.6.jar;xerces.jar;jhall.jar;mp3plugin.jar" 
+
+  set auxfiles=jAudioFeatureExtractor\AudioFeatures\*.java
+
+  echo       Compiling Java source files
+  javac -classpath %classpath% %auxfiles%
+  javac -classpath %classpath% jAudioFE.java
+
+  cd ..
+  
+)
+
+
+
+REM opt_run_make $compile   $package "$version"
+REM opt_run_make $install   $package "$version" "install"
+REM opt_run_make $clean     $package "$version" "clean"
+
+REM opt_run_tarclean $tarclean $package $version
+
Index: /main/tags/2.85/gs2-extensions/music-ir-src/trunk/build-srcpack/packages/CASCADE-MAKE/JAUDIO.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/music-ir-src/trunk/build-srcpack/packages/CASCADE-MAKE/JAUDIO.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-ir-src/trunk/build-srcpack/packages/CASCADE-MAKE/JAUDIO.sh	(revision 24799)
@@ -0,0 +1,91 @@
+#!/bin/bash
+
+package=jAudio0.4
+version=-cvs-06052010
+
+progname=$0
+
+source ../../cascade-make/lib/cascade-lib.bash GEXT_MUSICIR ../.. $*
+
+prefix=$GEXT_MUSICIR_INSTALLED
+
+
+opt_run_untar $force_untar $auto_untar $package $version
+if [ -d "$package" ] ; then
+  mv "$package" "$package$version"
+fi
+
+if [ $compile = "1" ] ; then
+  cd $package$version 
+  classpath=".:jAudioFeatureExtractor:tritonus_remaining-0.3.6.jar:tritonus_share-0.3.6.jar:xerces.jar:jhall.jar:mp3plugin.jar" 
+
+  auxfiles="jAudioFeatureExtractor/AudioFeatures/*.java"
+
+  which cygpath 2>&1 > /dev/null
+  if [ $? = "0" ] ; then
+    classpath=`cygpath -pw "$classpath"`
+    auxfiles=`cygpath -w "$auxfiles"`
+  fi
+
+  echo "      Compiling Java source files"
+  javac -classpath "$classpath" $auxfiles
+  javac -classpath "$classpath" jAudioFE.java
+
+  cd ..
+  
+fi
+
+if [ $install = "1" ] ; then
+  cd $package$version 
+
+  /bin/rm -f jaudio.jar
+
+  jarcp=`ls *.jar | tr '\n' ' '`
+
+  echo "Manifest-Version: 1.0" > Manifest.txt && \
+  echo "Main-Class: jAudioFE" >> Manifest.txt && \
+  echo "Class-Path: $jarcp plugin" >> Manifest.txt
+
+  class_files=`find . -name "*.class" -print`
+
+  which cygpath 2>&1 >/dev/null
+  if [ $? = "0" ] ; then
+    class_files=`cygpath -w $class_files`
+  fi
+
+  echo "      Bundling Java classes (and related files) into jaudio.jar"
+
+  jar cfm jaudio.jar Manifest.txt $class_files \
+     jAudioFeatureExtractor org \
+     features \
+     help JavaHelpSearch \
+     Map.jhm Sample.hs SampleIndex.xml SampleTOC.xml \
+  && \
+  /bin/cp *.jar $GEXT_MUSICIR/lib/java/. \
+
+  echo "Configuring features.xml"
+
+  plugin_home="$GEXT_MUSICIR/lib/java"
+  which cygpath 2>&1 >/dev/null
+  if [ $? = "0" ] ; then
+    plugin_home=`cygpath -w "$plugin_home"`
+    plugin_home=`echo "$plugin_home" | sed 's@\\\\@\\\\\\\\@g'`
+  fi
+
+
+  cat ../etc/features.xml.in \
+    | sed -e "s@\*\*pluginhome\*\*@$plugin_home@g" \
+    > $GEXT_MUSICIR/lib/java/features.xml
+
+  if [ ! -d "$GEXT_MUSICIR/lib/java/plugin" ] ; then
+    echo "Creating $GEXT_MUSICIR/lib/java/plugin"
+    mkdir "$GEXT_MUSICIR/lib/java/plugin"
+  fi
+
+  cd ..
+fi
+
+#opt_run_make $clean     $package $version "clean"
+#opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
Index: /main/tags/2.85/gs2-extensions/music-ir-src/trunk/build-srcpack/packages/etc/features.xml.in
===================================================================
--- /main/tags/2.85/gs2-extensions/music-ir-src/trunk/build-srcpack/packages/etc/features.xml.in	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-ir-src/trunk/build-srcpack/packages/etc/features.xml.in	(revision 24799)
@@ -0,0 +1,116 @@
+<?xml version="1.0"?>
+<!DOCTYPE featureList [
+	<!ELEMENT featureList (pluginFolder?,feature+,aggregator*)>
+	<!ELEMENT pluginFolder (#PCDATA)>
+	<!ELEMENT feature (class , on?)>
+	<!ELEMENT class (#PCDATA) >
+	<!ELEMENT on EMPTY>
+	<!ELEMENT aggregator (#PCDATA)>
+]>
+
+<featureList>
+        <pluginFolder>file://**pluginhome**</pluginFolder>
+	<feature>
+		<class>jAudioFeatureExtractor.AudioFeatures.MagnitudeSpectrum</class>
+	</feature>
+	<feature>
+		<class>jAudioFeatureExtractor.AudioFeatures.PowerSpectrum</class>
+	</feature>
+	<feature>
+		<class>jAudioFeatureExtractor.AudioFeatures.FFTBinFrequencies</class>
+	</feature>
+	<feature>
+		<class>jAudioFeatureExtractor.AudioFeatures.SpectralCentroid</class>
+		<on/>
+	</feature>
+	<feature>
+		<class>jAudioFeatureExtractor.AudioFeatures.SpectralRolloffPoint</class>
+		<on/>
+	</feature>
+	<feature>
+		<class>jAudioFeatureExtractor.AudioFeatures.SpectralFlux</class>
+		<on/>
+	</feature>
+	<feature>
+		<class>jAudioFeatureExtractor.AudioFeatures.Compactness</class>
+		<on/>
+	</feature>
+	<feature>
+		<class>jAudioFeatureExtractor.AudioFeatures.SpectralVariability</class>
+		<on/>
+	</feature>
+	<feature>
+		<class>jAudioFeatureExtractor.AudioFeatures.RMS</class>
+		<on/>
+	</feature>
+	<feature>
+		<class>jAudioFeatureExtractor.AudioFeatures.FractionOfLowEnergyWindows</class>
+		<on/>
+	</feature>
+	<feature>
+		<class>jAudioFeatureExtractor.AudioFeatures.ZeroCrossings</class>
+		<on/>
+	</feature>
+	<feature>
+		<class>jAudioFeatureExtractor.AudioFeatures.BeatHistogram</class>
+	</feature>
+	<feature>
+		<class>jAudioFeatureExtractor.AudioFeatures.BeatHistogramLabels</class>
+	</feature>
+	<feature>
+		<class>jAudioFeatureExtractor.AudioFeatures.StrongestBeat</class>
+		<on/>
+	</feature>
+	<feature>
+		<class>jAudioFeatureExtractor.AudioFeatures.BeatSum</class>
+		<on/>
+	</feature>
+	<feature>
+		<class>jAudioFeatureExtractor.AudioFeatures.StrengthOfStrongestBeat</class>
+		<on/>
+	</feature>
+	<feature>
+		<class>jAudioFeatureExtractor.AudioFeatures.StrongestFrequencyViaZeroCrossings</class>
+	</feature>
+	<feature>
+		<class>jAudioFeatureExtractor.AudioFeatures.StrongestFrequencyViaSpectralCentroid</class>
+	</feature>
+	<feature>
+		<class>jAudioFeatureExtractor.AudioFeatures.StrongestFrequencyViaFFTMax</class>
+	</feature>
+	<feature>
+		<class>jAudioFeatureExtractor.AudioFeatures.MFCC</class>
+		<on/>
+	</feature>
+	<feature>
+		<class>jAudioFeatureExtractor.AudioFeatures.LPC</class>
+		<on/>
+	</feature>
+	<feature>
+		<class>jAudioFeatureExtractor.AudioFeatures.Moments</class>
+		<on/>
+	</feature>
+	<feature>
+		<class>jAudioFeatureExtractor.AudioFeatures.PeakFinder</class>
+	</feature>
+	<feature>
+		<class>jAudioFeatureExtractor.AudioFeatures.HarmonicSpectralCentroid</class>
+	</feature>
+	<feature>
+		<class>jAudioFeatureExtractor.AudioFeatures.HarmonicSpectralFlux</class>
+	</feature>
+	<feature>
+		<class>jAudioFeatureExtractor.AudioFeatures.HarmonicSpectralSmoothness</class>
+	</feature>
+	<feature>
+		<class>jAudioFeatureExtractor.AudioFeatures.RelativeDifferenceFunction</class>
+	</feature>
+	<feature>
+	  <class>jAudioFeatureExtractor.AudioFeatures.AreaMoments</class>
+	</feature>
+	<aggregator>jAudioFeatureExtractor.Aggregators.Mean</aggregator>
+	<aggregator>jAudioFeatureExtractor.Aggregators.StandardDeviation</aggregator>
+	<aggregator>jAudioFeatureExtractor.Aggregators.AreaMoments</aggregator>
+	<aggregator>jAudioFeatureExtractor.Aggregators.MFCC</aggregator>
+	<aggregator>jAudioFeatureExtractor.Aggregators.MultipleFeatureHistogram</aggregator>
+</featureList>
Index: /main/tags/2.85/gs2-extensions/music-ir-src/trunk/perllib/plugins/MusicIRPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/music-ir-src/trunk/perllib/plugins/MusicIRPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-ir-src/trunk/perllib/plugins/MusicIRPlugin.pm	(revision 24799)
@@ -0,0 +1,179 @@
+###########################################################################
+#
+# MusicIRPlugin.pm -- for augmenting audio/midi files with Music IR 
+#                     features and tags
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package MusicIRPlugin;
+
+use BasePlugin;
+use jAudioExtractor;
+use jSongMinerExtractor;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+no strict 'subs';
+
+use gsprintf 'gsprintf';
+
+sub BEGIN {
+    @MusicIRPlugin::ISA = ('BasePlugin', 'jAudioExtractor', 'jSongMinerExtractor');
+}
+
+my $arguments =
+    [ 
+      { 'name' => "compute_mir_features",
+	'desc' => "{BasePlugin.compute_mir_features}",
+	'type' => "enum",
+	'list' => [{'name' => "true",  'desc' => "{common.true}"},
+		   {'name' => "false", 'desc' => "{common.false}"}],
+	'deft' => "false",
+	'reqd' => "no" },
+      { 'name' => "retrieve_mir_metadata",
+	'desc' => "{BasePlugin.retrieve_mir_metadata}",
+	'type' => "enum",
+	'list' => [{'name' => "true",  'desc' => "{common.true}"},
+		   {'name' => "false", 'desc' => "{common.false}"}],
+	'deft' => "false",
+	'reqd' => "no" },
+      { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'deft' => &get_default_process_exp(),
+	'reqd' => "no" }
+      ];
+
+my $options = { 'name'     => "MusicIRPlugin",
+		'desc'     => "{MusicIRPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    
+    my $jae_self = new jAudioExtractor($pluginlist, $inputargs, $hashArgOptLists,1);
+    my $jsme_self = new jSongMinerExtractor($pluginlist, $inputargs, $hashArgOptLists,1);
+    my $base_self = new BasePlugin($pluginlist, $inputargs, $hashArgOptLists);
+
+    my $self = BasePlugin::merge_inheritance($jae_self,$jsme_self,$base_self);
+
+    return bless $self, $class;
+}
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+    
+    return q^(?i)(\.mp3|\.wave?|\.aif[fc]?|\.au|\.snd|\.og[ga])$^; 
+}
+
+sub begin {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $processor, $maxdocs) = @_;
+
+    $self->SUPER::begin(@_);
+    $self->jAudioExtractor::begin(@_);
+    $self->jSongMinerExtractor::begin(@_);
+}
+
+
+
+# do plugin specific processing of doc_obj
+sub process {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+
+    my $outhandle = $self->{'outhandle'};
+    my ($filename_full_path, $filename_no_path) = &util::get_full_filenames($base_dir, $file);
+
+    my $top_section = $doc_obj->get_top_section();
+
+    if ($self->{'compute_mir_features'} eq "true")
+    {
+	my $utf8_filename_no_path = $self->filepath_to_utf8($filename_no_path);
+	my $url_encoded_filename = &util::rename_file($utf8_filename_no_path, $self->{'file_rename_method'});
+	
+	my $features_filename = $self->compute_features($filename_full_path);
+	my ($features_ext) = ($features_filename =~ m/\.([^.]+)$/);
+
+	
+	my $mime_type = ($features_ext eq "arff") ? "text/plain" : "text/xml";
+	$doc_obj->associate_file($features_filename, "jaudio.$features_ext", 
+				 $mime_type, $top_section);
+
+    }
+
+    
+    #we have no text - adds dummy text and NoText metadata
+    $self->add_dummy_text($doc_obj, $doc_obj->get_top_section());
+
+    $doc_obj->associate_file($filename_full_path, "audio.mp3", "audio/mpeg", $top_section);
+
+    return 1;
+
+}
+
+sub post_process_doc_obj {
+    my $self = shift (@_);  
+    my ($pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+
+    my $outhandle = $self->{'outhandle'};
+    my ($filename_full_path, $filename_no_path) = &util::get_full_filenames($base_dir, $file);
+
+    if ($self->{'retrieve_mir_metadata'} eq "true") {
+	my $top_section = $doc_obj->get_top_section();
+	my $id3_titles = $doc_obj->get_metadata($top_section,"ex.ID3.Title");
+
+	my $id3_title = shift @$id3_titles || "Unknown";
+
+	my $id3_artists = $doc_obj->get_metadata($top_section,"ex.ID3.Artist");
+	my $id3_artist = shift @$id3_artists || "Unkown";
+
+	my ($metadata_acexml_filename,$metadata_txt_filename) 
+	    = $self->retrieve_metadata($filename_full_path,$id3_title,$id3_artist);
+	
+	if (-e $metadata_txt_filename) {
+	    $self->parse_txt_metadata($doc_obj,$metadata_txt_filename);
+	}
+
+	$doc_obj->associate_file($metadata_acexml_filename, "jsongminer.xml", 
+				 "text/xml", $top_section);
+    }
+
+
+    return 1;
+}
+
+
+1;
+
+
+
Index: /main/tags/2.85/gs2-extensions/music-ir-src/trunk/perllib/plugins/jAudioExtractor.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/music-ir-src/trunk/perllib/plugins/jAudioExtractor.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-ir-src/trunk/perllib/plugins/jAudioExtractor.pm	(revision 24799)
@@ -0,0 +1,257 @@
+###########################################################################
+#
+# jAudioExtractor - helper plugin that computers audio features for 
+#                        music information retrieval use, using jAudio
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2010 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+package jAudioExtractor;
+
+use BaseMediaConverter;
+
+use Cwd;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+
+BEGIN {
+    @jAudioExtractor::ISA = ('BaseMediaConverter');
+}
+
+
+my $arguments = [
+    { 'name' => "window_size",
+      'desc' => "{jAudioExtractor.window_size}",
+      'type' => "int",
+      'range' => "128,",
+      'deft' => '512',
+      'reqd' => "no" },
+    { 'name' => "window_overlap",
+      'desc' => "{jAudioExtractor.window_overlap}",
+      'type' => "string",
+      'range' => "0.0",
+      'deft' => '0.0',
+      'reqd' => "no" },
+    { 'name' => "sample_rate",
+      'desc' => "{jAudioExtractor.sample_rate}",
+      'type' => "enum",
+      'list' => [{'name' => "8 kHz",      'desc' => "{jAudioExtractor.8000Hz}"},
+		 {'name' => "11.025 kHz", 'desc' => "{jAudioExtractor.11025Hz}"},
+		 {'name' => "16 kHz",     'desc' => "{jAudioExtractor.16000Hz}"},
+		 {'name' => "22.05 kHz",  'desc' => "{jAudioExtractor.22050Hz}"},
+		 {'name' => "44.1 kHz",   'desc' => "{jAudioExtractor.44100Hz}"} ],
+      'deft' => '16 kHz',
+      'reqd' => "no" },
+    { 'name' => "extracted_data",
+      'desc' => "{jAudioExtractor.extracted_data}",
+      'type' => "enum",
+      'list' => [{'name' => "Overall and Windowed", 'desc' => "{jAudioExtractor.overall_and_windowed}"},
+		 {'name' => "Windowed only", 'desc' => "{jAudioExtractor.windowed_only}"},
+		 {'name' => "Overall only", 'desc' => "{jAudioExtractor.overall_only}"}],
+      'deft' => 'Overall and Windowed',
+      'reqd' => "no" },
+    { 'name' => "output_type",
+      'desc' => "{jAudioExtractor.output_type}",
+      'type' => "enum",
+      'list' => [{'name' => "ACE XML", 'desc' => "{jAudioExtractor.ace_xml}"},
+		 {'name' => "Weka ARFF", 'desc' => "{jAudioExtractor.weka_arff}"}],
+      'deft' => 'ACE XML',
+      'reqd' => "no" }
+    ];
+
+
+
+my $options = { 'name' => "jAudioExtractor",
+		'desc' => "{jAudioExtractor.desc}",
+		'abstract' => "yes",
+		'inherits' => "yes",
+		'args' => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new BaseMediaConverter($pluginlist, $inputargs, $hashArgOptLists, 1);
+
+    # Set controlling variables
+    my $gsdl_home = $ENV{'GSDLHOME'};
+    my $music_ir_home = $ENV{'GEXT_MUSICIR'};
+
+    $self->{'ace_xml_output_directory'} = &util::filename_cat($gsdl_home,"tmp"); # Set the directory to save the the ACE XML output files in
+    $self->{'jmir_directory'} = &util::filename_cat($music_ir_home,"lib","java"); # Set the directory holding the jMIR .jar files
+
+
+    return bless $self, $class;
+}
+
+
+# Create and save a temporary jAudio batch file referring to a file to extract
+# features from
+sub prepareTempJAudioBatchFile 
+{
+    # ARG Ob1: $new_batch_file_path refers to the path of the temporary batch file to create
+    # ARG Ob2: $model_batch_file_path refers to the path of the model batch file to base the temporary one on
+    # ARG Ob3: $input_music_file_path refers to the file to extract features with
+    # ARG Ob4: $feature_values_file_path refers to the path of the ACE XML Feature Values file that the jMIR component will output to
+    # ARG Ob5: $feature_values_file_path refers to the path of the ACE XML Feature Descriptions file that the jMIR component will output to
+    my ( $self, $new_batch_file_path, $model_batch_file_path, $input_music_file_path, $feature_values_file_path, $feature_descriptions_file_path ) = @_;
+
+    # Retrieve settings for jAudioPlugin and use in batch file that is generated
+    my $sample_rate = $self->{'sample_rate'}; # sample of how to get parameter from Greenstone/GLI
+
+
+    # Read the contents of the model batch file
+    my $batch_file_contents;
+    local $/=undef;
+    open (INPUT, "$model_batch_file_path") or die "Could not read the model jAudio batch file $model_batch_file_path";
+    binmode INPUT;
+    $batch_file_contents = <INPUT>;
+    close INPUT;
+
+    # Set the batch ID tag in the temporary file
+    $batch_file_contents =~ s/<batch ID="SampleJAudioBatch">/<batch ID="$input_music_file_path">/;
+
+    # Set the input file name in the file tag in the temporary file
+    $batch_file_contents =~ s/<file><\/file>/<file>$input_music_file_path<\/file>/;
+
+    # Set the feature vales save path in the temporary file
+    $batch_file_contents =~ s/<destination><\/destination>/<destination>$feature_descriptions_file_path<\/destination>/;
+
+    # Set the feature vales save path in the temporary file
+    $batch_file_contents =~ s/<destination><\/destination>/<destination>$feature_values_file_path<\/destination>/;
+
+    # Save the temporary batch file
+    open (OUTPUT, ">$new_batch_file_path") or die "Could not create the temporary jAudio batch file $new_batch_file_path";
+    print OUTPUT "$batch_file_contents";
+    close OUTPUT;
+    
+    # Done
+    return 0;
+}
+
+
+sub compute_features
+{
+    my $self = shift(@_);
+    my $source_file_path = shift(@_);
+    my $convert_options  = shift(@_) || "";
+
+    my $outhandle = $self->{'outhandle'};
+    my $verbosity = $self->{'verbosity'};
+
+    my $source_file_no_path = &File::Basename::basename($source_file_path);
+
+    $self->init_cache_for_file($source_file_path);
+
+    # Determine the full name and path of the output file
+    my $target_file_path;
+    my $feature_values_file_path;
+    my $feature_descriptions_file_path;
+
+    my $target_file_type;
+    if ($self->{'output_type'} eq "ACE XML") {
+	$target_file_type="xml";
+    }
+    else {
+	# ARFF
+	$target_file_type="arff";
+    }
+
+    if ($self->{'enable_cache'}) {
+	my $cached_dir = $self->{'cached_dir'};
+	my $file_root = $self->{'cached_file_root'};
+
+	my $target_file = "$file_root.$target_file_type";
+
+	$target_file_path = &util::filename_cat($cached_dir,$target_file);
+    }
+    else {
+	$target_file_path = &util::get_tmp_filename($target_file_type);
+    }
+
+    if ($self->{'output_type'} eq "ACE XML") {
+	$feature_values_file_path = $target_file_path;
+	$feature_values_file_path =~ s/\.xml$/_FV.xml/;
+
+	$feature_descriptions_file_path = $target_file_path;
+	$feature_descriptions_file_path =~ s/\.xml$/_FD.xml/;
+
+	# Make target_file_path be the principle file generated by jAudio when using ACE XML
+	$target_file_path = $feature_values_file_path;
+    }
+
+    my $ace_xml_output_directory = $self->{'ace_xml_output_directory'};
+    my $jmir_directory = $self->{'jmir_directory'};
+
+
+    my $store_cwd = cwd();
+
+    if (!-d $jmir_directory) {
+	print STDERR "Error: Unable able to find directory '$jmir_directory'\n";
+	print STDERR "       Cannot run jAudio\n";
+    }
+    elsif (chdir($jmir_directory)) {
+
+	# Run the feature extraction.
+
+	# Specify the name for a temporary jAudio batch file
+	my $template_batch_file_path = &util::filename_cat($jmir_directory,"SampleJAudioBatchFile.xml.in");
+	my $batch_file_path = &util::filename_cat($ace_xml_output_directory,"tempjaudiobatchfile.xml");
+	
+	# Create the batch file
+	$self->prepareTempJAudioBatchFile( $batch_file_path, $template_batch_file_path, 
+					   $source_file_path, $feature_values_file_path, $feature_descriptions_file_path );
+	
+	# Input and Output files to use are stored in the batch_file
+	my $jaudio_cmd = "java -Xmx1024M -jar jAudio.jar $convert_options -b \"$batch_file_path\"";
+		
+	# Test the execution path
+	# print("EXECUTION CMD: $jaudio_cmd\n");
+    
+	my $print_info = { 'message_prefix' => "jAudio",
+			   'message' => "Extracting audio features from $source_file_no_path" };
+	
+	my ($regenerated,$result,$had_error) 
+	    = $self->autorun_general_cmd($jaudio_cmd,$source_file_path,$target_file_path,$print_info);
+	
+	# Delete the jAudio batch file
+	unlink($batch_file_path);
+    }
+    else {
+	print STDERR "Error: failed to change directory to '$jmir_directory'\n";
+	print STDERR "       Cannot run jAudio\n";
+    }
+
+    chdir($store_cwd);
+
+    return ($target_file_path);
+}
+    
+
+
+
+1;	
Index: /main/tags/2.85/gs2-extensions/music-ir-src/trunk/perllib/plugins/jSongMinerExtractor.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/music-ir-src/trunk/perllib/plugins/jSongMinerExtractor.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-ir-src/trunk/perllib/plugins/jSongMinerExtractor.pm	(revision 24799)
@@ -0,0 +1,214 @@
+###########################################################################
+#
+# jSongMinerExtractor - helper plugin that identifies audio through
+#                       external web services based on either an audio
+#                       computed fingerprint or ID3 title and album
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2010 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+package jSongMinerExtractor;
+
+use BaseMediaConverter;
+
+use Cwd;
+use URI::Escape;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+
+BEGIN {
+    @jSongMinerExtractor::ISA = ('BaseMediaConverter');
+}
+
+
+my $arguments = [
+    { 'name' => "track_identification",
+      'desc' => "{jSongMinerExtractor.track_identification}",
+      'type' => "enum",
+      'list' => [{'name' => "Fingerprint then ID3 tags", 'desc' => "{jSongMinerExtractor.fingerprint_first}"},
+		 {'name' => "ID3 tags only", 'desc' => "{jSongMinerExtractor.only_ids}"},
+		 {'name' => "Disabled",     'desc' => "{jSongMinerExtractor.off}"} ],
+      'deft' => 'Fingerprint then ID3 tags',
+      'reqd' => "no" }
+    ];
+
+my $options = { 'name' => "jSongMinerExtractor",
+		'desc' => "{jSongMinerExtractor.desc}",
+		'abstract' => "yes",
+		'inherits' => "yes",
+		'args' => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new BaseMediaConverter($pluginlist, $inputargs, $hashArgOptLists, 1);
+
+    # Set controlling variables
+    my $gsdl_home = $ENV{'GSDLHOME'};
+    my $music_ir_home = $ENV{'GEXT_MUSICIR'};
+
+    $self->{'jmir_directory'} = &util::filename_cat($music_ir_home,"lib","java"); # Set the directory holding the jMIR .jar files
+
+    return bless $self, $class;
+}
+
+sub urlEncode{
+	# ARG 1: $to_encode is the string to URL encode
+	my ($to_encode) = @_;
+	return uri_escape($to_encode);
+}
+
+# URL Decode the given string
+sub urlDecode{
+	# ARG 1: $to_decode is the string to URL decode
+	my ($to_decode) = @_;
+	my $decoded= uri_unescape($to_decode);
+
+	return $decoded;
+}
+
+sub parse_txt_metadata
+{
+    my $self = shift @_;
+    my ($doc_obj,$target_txt_file_path) = @_;
+
+    if (open(MIN,"<$target_txt_file_path")) {
+
+	my ($md_name, $md_value);
+
+	while (defined($md_name=<MIN>) && defined($md_value=<MIN>)) {
+
+	    chomp $md_name;
+	    chomp $md_value;
+
+	    my $top_section=$doc_obj->get_top_section();
+
+	    $md_name =~ s/\+//g;
+	    $md_value =~ s/\+/ /g;
+	    
+	    $md_name = urlDecode($md_name);
+	    $md_value = urlDecode($md_value);
+
+	    # $md_name =~ s/\s+/ /sg;
+	    $md_name =~ s/\(.*?\)$//s; # can stretch over multiple lines
+	    $md_name =~ s/Last\.FM/LastFM/g;
+	    $md_name =~ s/:/^/g;
+	    $md_name =~ s/(API)?\^/./;
+
+	    $doc_obj->add_utf8_metadata($top_section,$md_name,$md_value);
+	}
+
+	close(MIN);
+    }
+    else {
+	print STDERR "Error: Failed to open $target_txt_file_path\n";
+	print STDERR "       !$\n";
+    }
+}
+
+
+sub retrieve_metadata
+{
+    my $self = shift(@_);
+    my ($source_file_path,$id3_title,$id3_artist,$convert_options) = @_;
+
+    $convert_options = "" if (!defined $convert_options);
+
+    my $outhandle = $self->{'outhandle'};
+    my $verbosity = $self->{'verbosity'};
+
+    my $source_file_no_path = &File::Basename::basename($source_file_path);
+
+    $self->init_cache_for_file($source_file_path);
+
+    my $target_txt_file_path;
+    my $target_acexml_file_path;
+
+    if ($self->{'enable_cache'}) {
+	my $cached_dir = $self->{'cached_dir'};
+	my $file_root = $self->{'cached_file_root'};
+
+	my $target_txt_file = "${file_root}_metadata.txt";
+	my $target_acexml_file = "${file_root}.xml";
+
+	$target_txt_file_path = &util::filename_cat($cached_dir,$target_txt_file);
+	$target_acexml_file_path = &util::filename_cat($cached_dir,$target_acexml_file);
+    }
+    else {
+	$target_txt_file_path = &util::get_tmp_filename("_metadata.txt");
+	$target_acexml_file_path = &util::get_tmp_filename(".xml");
+    }
+
+    my $jmir_directory = $self->{'jmir_directory'};
+
+
+    my $store_cwd = cwd();
+
+    if (!-d $jmir_directory) {
+	print STDERR "Error: Unable able to find directory '$jmir_directory'\n";
+	print STDERR "       Cannot run jAudio\n";
+    }
+    elsif (chdir($jmir_directory)) {
+
+
+	my $jsongminer_cmd = "java -Xmx1024M -jar jSongMiner.jar $convert_options";
+	$jsongminer_cmd .= " -title \"$id3_title\"";
+	$jsongminer_cmd .= " -artist \"$id3_artist\"";
+	$jsongminer_cmd .= " -audio \"$source_file_path\"";
+	$jsongminer_cmd .= " -savetxtfile \"$target_txt_file_path\"";
+	$jsongminer_cmd .= " -saveacexmlfile \"$target_acexml_file_path\"";
+	
+	if ($verbosity>2) {
+	    print $outhandle "jSongMinerExtractor: Running ...\n";
+	    print $outhandle "jSongMinerExtractor:   $jsongminer_cmd\n";
+	}
+	
+	my $print_info = { 'message_prefix' => "jSongMiner",
+			   'message' => "jSongMinerExtractor: Retrieving audio metadata for $source_file_no_path" };
+	
+	my ($regenerated,$result,$had_error) 
+	    = $self->autorun_general_cmd($jsongminer_cmd,$source_file_path,$target_txt_file_path,$print_info);
+	
+	if ($verbosity>2) {
+	    print $outhandle "jSongMinerExtractor: ...done\n";
+	}
+    }
+    else {
+	print STDERR "Error: failed to change directory to '$jmir_directory'\n";
+	print STDERR "       Cannot run jAudio\n";
+    }
+
+    chdir($store_cwd);
+
+    return ($target_acexml_file_path,$target_txt_file_path);
+}
+    
+
+
+
+1;	
Index: /main/tags/2.85/gs2-extensions/music-ir-src/trunk/perllib/plugins/jSongMinerMetadata.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/music-ir-src/trunk/perllib/plugins/jSongMinerMetadata.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-ir-src/trunk/perllib/plugins/jSongMinerMetadata.pm	(revision 24799)
@@ -0,0 +1,257 @@
+###########################################################################
+#
+# jAudioExtractor - helper plugin that does office document conversion 
+#                       using jodconverter combined with MIR
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2010 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+package jAudioExtractor;
+
+use BaseMediaConverter;
+
+use Cwd;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+
+BEGIN {
+    @jAudioExtractor::ISA = ('BaseMediaConverter');
+}
+
+
+my $arguments = [
+    { 'name' => "window_size",
+      'desc' => "{jAudioExtractor.window_size}",
+      'type' => "int",
+      'range' => "128,",
+      'deft' => '512',
+      'reqd' => "no" },
+    { 'name' => "window_overlap",
+      'desc' => "{jAudioExtractor.window_overlap}",
+      'type' => "string",
+      'range' => "0.0",
+      'deft' => '0.0',
+      'reqd' => "no" },
+    { 'name' => "sample_rate",
+      'desc' => "{jAudioExtractor.sample_rate}",
+      'type' => "enum",
+      'list' => [{'name' => "8 kHz",      'desc' => "{jAudioExtractor.8000Hz}"},
+		 {'name' => "11.025 kHz", 'desc' => "{jAudioExtractor.11025Hz}"},
+		 {'name' => "16 kHz",     'desc' => "{jAudioExtractor.16000Hz}"},
+		 {'name' => "22.05 kHz",  'desc' => "{jAudioExtractor.22050Hz}"},
+		 {'name' => "44.1 kHz",   'desc' => "{jAudioExtractor.44100Hz}"} ],
+      'deft' => '16 kHz',
+      'reqd' => "no" },
+    { 'name' => "extracted_data",
+      'desc' => "{jAudioExtractor.extracted_data}",
+      'type' => "enum",
+      'list' => [{'name' => "Overall and Windowed", 'desc' => "{jAudioExtractor.overall_and_windowed}"},
+		 {'name' => "Windowed only", 'desc' => "{jAudioExtractor.windowed_only}"},
+		 {'name' => "Overall only", 'desc' => "{jAudioExtractor.overall_only}"}],
+      'deft' => 'Overall and Windowed',
+      'reqd' => "no" },
+    { 'name' => "output_type",
+      'desc' => "{jAudioExtractor.output_type}",
+      'type' => "enum",
+      'list' => [{'name' => "ACE XML", 'desc' => "{jAudioExtractor.ace_xml}"},
+		 {'name' => "Weka ARFF", 'desc' => "{jAudioExtractor.weka_arff}"}],
+      'deft' => 'ACE XML',
+      'reqd' => "no" }
+    ];
+
+
+
+my $options = { 'name' => "jAudioExtractor",
+		'desc' => "{jAudioExtractor.desc}",
+		'abstract' => "yes",
+		'inherits' => "yes",
+		'args' => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new BaseMediaConverter($pluginlist, $inputargs, $hashArgOptLists, 1);
+
+    # Set controlling variables
+    my $gsdl_home = $ENV{'GSDLHOME'};
+    my $music_ir_home = $ENV{'GEXT_MUSICIR'};
+
+    $self->{'ace_xml_output_directory'} = &util::filename_cat($gsdl_home,"tmp"); # Set the directory to save the the ACE XML output files in
+    $self->{'jmir_directory'} = &util::filename_cat($music_ir_home,"lib","java"); # Set the directory holding the jMIR .jar files
+
+
+    return bless $self, $class;
+}
+
+
+# Create and save a temporary jAudio batch file referring to a file to extract
+# features from
+sub prepareTempJAudioBatchFile 
+{
+    # ARG Ob1: $new_batch_file_path refers to the path of the temporary batch file to create
+    # ARG Ob2: $model_batch_file_path refers to the path of the model batch file to base the temporary one on
+    # ARG Ob3: $input_music_file_path refers to the file to extract features with
+    # ARG Ob4: $feature_values_file_path refers to the path of the ACE XML Feature Values file that the jMIR component will output to
+    # ARG Ob5: $feature_values_file_path refers to the path of the ACE XML Feature Descriptions file that the jMIR component will output to
+    my ( $self, $new_batch_file_path, $model_batch_file_path, $input_music_file_path, $feature_values_file_path, $feature_descriptions_file_path ) = @_;
+
+    # Retrieve settings for jAudioPlugin and use in batch file that is generated
+    my $sample_rate = $self->{'sample_rate'}; # sample of how to get parameter from Greenstone/GLI
+
+
+    # Read the contents of the model batch file
+    my $batch_file_contents;
+    local $/=undef;
+    open (INPUT, "$model_batch_file_path") or die "Could not read the model jAudio batch file $model_batch_file_path";
+    binmode INPUT;
+    $batch_file_contents = <INPUT>;
+    close INPUT;
+
+    # Set the batch ID tag in the temporary file
+    $batch_file_contents =~ s/<batch ID="SampleJAudioBatch">/<batch ID="$input_music_file_path">/;
+
+    # Set the input file name in the file tag in the temporary file
+    $batch_file_contents =~ s/<file><\/file>/<file>$input_music_file_path<\/file>/;
+
+    # Set the feature vales save path in the temporary file
+    $batch_file_contents =~ s/<destination><\/destination>/<destination>$feature_descriptions_file_path<\/destination>/;
+
+    # Set the feature vales save path in the temporary file
+    $batch_file_contents =~ s/<destination><\/destination>/<destination>$feature_values_file_path<\/destination>/;
+
+    # Save the temporary batch file
+    open (OUTPUT, ">$new_batch_file_path") or die "Could not create the temporary jAudio batch file $new_batch_file_path";
+    print OUTPUT "$batch_file_contents";
+    close OUTPUT;
+    
+    # Done
+    return 0;
+}
+
+
+sub compute_features
+{
+    my $self = shift(@_);
+    my $source_file_path = shift(@_);
+    my $convert_options  = shift(@_) || "";
+
+    my $outhandle = $self->{'outhandle'};
+    my $verbosity = $self->{'verbosity'};
+
+    my $source_file_no_path = &File::Basename::basename($source_file_path);
+
+    $self->init_cache_for_file($source_file_path);
+
+    # Determine the full name and path of the output file
+    my $target_file_path;
+    my $feature_values_file_path;
+    my $feature_descriptions_file_path;
+
+    my $target_file_type;
+    if ($self->{'output_type'} eq "ACE XML") {
+	$target_file_type="xml";
+    }
+    else {
+	# ARFF
+	$target_file_type="arff";
+    }
+
+    if ($self->{'enable_cache'}) {
+	my $cached_dir = $self->{'cached_dir'};
+	my $file_root = $self->{'cached_file_root'};
+
+	my $target_file = "$file_root.$target_file_type";
+
+	$target_file_path = &util::filename_cat($cached_dir,$target_file);
+    }
+    else {
+	$target_file_path = &util::get_tmp_filename($target_file_type);
+    }
+
+    if ($self->{'output_type'} eq "ACE XML") {
+	$feature_values_file_path = $target_file_path;
+	$feature_values_file_path =~ s/\.xml$/_FV.xml/;
+
+	$feature_descriptions_file_path = $target_file_path;
+	$feature_descriptions_file_path =~ s/\.xml$/_FD.xml/;
+
+	# Make target_file_path be the principle file generated by jAudio when using ACE XML
+	$target_file_path = $feature_values_file_path;
+    }
+
+    my $ace_xml_output_directory = $self->{'ace_xml_output_directory'};
+    my $jmir_directory = $self->{'jmir_directory'};
+
+
+    my $store_cwd = cwd();
+
+    if (!-d $jmir_directory) {
+	print STDERR "Error: Unable able to find directory '$jmir_directory'\n";
+	print STDERR "       Cannot run jAudio\n";
+    }
+    elsif (chdir($jmir_directory)) {
+
+	# Run the feature extraction.
+
+	# Specify the name for a temporary jAudio batch file
+	my $template_batch_file_path = &util::filename_cat($jmir_directory,"SampleJAudioBatchFile.xml.in");
+	my $batch_file_path = &util::filename_cat($ace_xml_output_directory,"tempjaudiobatchfile.xml");
+	
+	# Create the batch file
+	$self->prepareTempJAudioBatchFile( $batch_file_path, $template_batch_file_path, 
+					   $source_file_path, $feature_values_file_path, $feature_descriptions_file_path );
+	
+	# Input and Output files to use are stored in the batch_file
+	my $jaudio_cmd = "java -Xmx1024M -jar jAudio.jar $convert_options -b \"$batch_file_path\"";
+		
+	# Test the execution path
+	# print("EXECUTION CMD: $jaudio_cmd\n");
+    
+	my $print_info = { 'message_prefix' => "jAudio",
+			   'message' => "Extracting audio features from $source_file_no_path" };
+	
+	my ($regenerated,$result,$had_error) 
+	    = $self->autorun_general_cmd($jaudio_cmd,$source_file_path,$target_file_path,$print_info);
+	
+	# Delete the jAudio batch file
+	unlink($batch_file_path);
+    }
+    else {
+	print STDERR "Error: failed to change directory to '$jmir_directory'\n";
+	print STDERR "       Cannot run jAudio\n";
+    }
+
+    chdir($store_cwd);
+
+    return ($target_file_path);
+}
+    
+
+
+
+1;	
Index: /main/tags/2.85/gs2-extensions/music-ir-src/trunk/setup.bash
===================================================================
--- /main/tags/2.85/gs2-extensions/music-ir-src/trunk/setup.bash	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-ir-src/trunk/setup.bash	(revision 24799)
@@ -0,0 +1,40 @@
+
+extdesc="the Digital Music Information Retrieval Extension"
+
+full_setup=`pwd`/${BASH_SOURCE}
+fulldir=${full_setup%/*}
+fulldir=${fulldir%/.}
+
+source cascade-make/lib/cascade-lib.bash
+
+if [ "x$GEXT_MUSICIR" = "x" ] ; then
+  export GEXT_MUSICIR=$fulldir
+  export GEXT_MUSICIR_INSTALLED=$GEXT_MUSICIR/$GSDLOS
+  export GEXT_MUSICIR_LIBJAVA=$GEXT_MUSICIR/lib/java
+
+
+  export PATH=$GEXT_MUSICIR_INSTALLED/bin:$GEXT_MUSICIR/bin/script:$PATH
+
+  if [ "x$LD_LIBRARY_PATH" = "x" ] ; then
+    export LD_LIBRARY_PATH=$GEXT_MUSICIR_INSTALLED/lib
+  else
+    export LD_LIBRARY_PATH=$GEXT_MUSICIR_INSTALLED/lib:$LD_LIBRARY_PATH
+  fi
+  if [ "x$DYLD_LIBRARY_PATH" = "x" ] ; then
+    export DYLD_LIBRARY_PATH=$GEXT_MUSICIR_INSTALLED/lib
+  else
+    export DYLD_LIBRARY_PATH=$GEXT_MUSICIR_INSTALLED/lib:$DYLD_LIBRARY_PATH
+  fi
+
+  extdir=${GEXT_MUSICIR##*/}
+
+  if [ "x$GSDLEXTS" = "x" ] ; then
+    export GSDLEXTS=$extdir
+  else 
+    export GSDLEXTS=$GSDLEXTS:$extdir
+  fi
+
+  echo "+Your environment is now setup for $extdesc"
+else
+  echo "+Your environment is already setup for $extdesc"
+fi
Index: /main/tags/2.85/gs2-extensions/music-ir-src/trunk/setup.bat
===================================================================
--- /main/tags/2.85/gs2-extensions/music-ir-src/trunk/setup.bat	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-ir-src/trunk/setup.bat	(revision 24799)
@@ -0,0 +1,57 @@
+@echo off
+pushd "%CD%"
+CD /D "%~dp0"
+
+set extdesc=the Music IR Extension
+
+if "%OS%" == "Windows_NT" goto WinNT
+if "%OS%" == "" goto Win95
+if "%GSDLLANG%" == "en" echo Setup failed - your PATH has not been set
+if "%GSDLLANG%" == "es" echo No se pudo realizar la configuraci¢n - no se ha establecido la RUTA.
+if "%GSDLLANG%" == "fr" echo Echc de l'installation - votre variable PATH n'a pas t ajuste
+if "%GSDLLANG%" == "ru" echo áâ ­®¢ª  ­¥ ã€ « áì -  ­¥ ¡ë« ãáâ ­®¢«¥­
+goto End
+
+:WinNT
+set GEXT_MUSICIR=%CD%
+set GEXT_MUSICIR_INSTALLED=%GEXT_MUSICIR%\windows
+
+set PATH=%GEXT_MUSICIR_INSTALLED%\bin;%GEXT_MUSICIR%\bin\script;%PATH%
+
+set GS_CP_SET=yes
+goto Success
+
+:Win95
+if "%1" == "SetEnv" goto Win95Env
+REM We'll invoke a second copy of the command processor to make
+REM sure there's enough environment space
+COMMAND /E:2048 /K %0 SetEnv
+goto End
+
+:Win95Env
+set GEXT_MUSICIR=%CD%
+set PATH=%GEXT_MUSICIR_INSTALLED%\bin;%GEXT_MUSICIR%\bin\script;%PATH%
+set GS_CP_SET=yes
+goto Success
+
+:Success
+
+set fulldir=%~dp0
+
+:: strip off everything up to (and including) ext dir
+set extdir=%fulldir:*ext\=%
+
+:: remove trailing slash
+set extdir=%extdir:\=%
+
+if "x%GSDLEXTS%" == "x" (
+  set GSDLEXTS=%extdir%
+) else (
+  set GSDLEXTS=%GSDLEXTS%:%extdir%
+)
+
+echo +Your environment is now setup for %extdesc%
+
+:End
+
+popd
Index: /main/tags/2.85/gs2-extensions/music-stand/trunk/CASCADE-MAKE.bat
===================================================================
--- /main/tags/2.85/gs2-extensions/music-stand/trunk/CASCADE-MAKE.bat	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-stand/trunk/CASCADE-MAKE.bat	(revision 24799)
@@ -0,0 +1,44 @@
+@echo off
+pushd "%CD%"
+CD /D "%~dp0"
+
+call cascade-make/lib/cascade-lib.bat
+
+
+echo "Test for directory in Windows might not be correct syntax!!"
+if not exist "%GEXTVIDEO_INSTALLED%" (
+  echo Creating %GEXTVIDEO_INSTALLED%
+  mkdir "%GEXTVIDEO_INSTALLED%"
+)
+
+set dirlist=runtime-srcpack
+
+
+for /D %%d IN (%dirlist%) do (
+  echo Running %%d\CASCADE-MAKE.bat %*
+
+  (cd %%d && call CASCADE-MAKE.bat %* && cd ..)
+  
+  if not ERRORLEVEL 0 (
+    echo Error encountered running %%d\CASCADE-MAKE.bat
+    goto ErrorExitPos1
+  )
+)
+
+
+if  "%install%" == "1" (
+  type README.txt
+)
+goto End
+
+:ErrorExitNeg1
+set ERRORLEVEL=-1
+goto End
+
+:ErrorExitPos1
+set ERRORLEVEL=1
+goto End
+
+:End
+
+popd
Index: /main/tags/2.85/gs2-extensions/music-stand/trunk/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/music-stand/trunk/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-stand/trunk/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+source cascade-make/lib/cascade-lib.bash
+
+if [ ! -e $GEXTVIDEO_INSTALLED ] ; then
+  echo "Creating $GEXTVIDEO_INSTALLED"
+  mkdir $GEXTVIDEO_INSTALLED
+fi
+
+dirlist="runtime-srcpack"
+
+for d in $dirlist ; do
+  echo "Running $d/CASCADE-MAKE.sh $*"
+
+  (cd $d ; ./CASCADE-MAKE.sh $*)
+
+  if [ $? != 0 ] ; then
+    echo "Error encountered running $d/CASCADE-MAKE.sh"
+    exit 1
+  fi
+done
+
+
+if [ $install = "1" ] ; then
+  cat README.txt
+fi
Index: /main/tags/2.85/gs2-extensions/music-stand/trunk/FIX-LA.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/music-stand/trunk/FIX-LA.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-stand/trunk/FIX-LA.sh	(revision 24799)
@@ -0,0 +1,11 @@
+#/bin/bash
+
+
+pushd linux/lib
+
+for f in *.la ; do
+  echo "Fixing $f"
+  sed -i~ -e "s; /usr/lib/; /usr/local/poky/eabi-glibc/arm/arm-poky-linux-gnueabi/usr/lib/;g" $f
+done
+
+popd
Index: /main/tags/2.85/gs2-extensions/music-stand/trunk/README.txt
===================================================================
--- /main/tags/2.85/gs2-extensions/music-stand/trunk/README.txt	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-stand/trunk/README.txt	(revision 24799)
@@ -0,0 +1,3 @@
+This is the Greenstone extension for the digital music stand project.  At this
+stage, the main application used to display sheet music is a modified version
+of the Evince document viewing application.
Index: /main/tags/2.85/gs2-extensions/music-stand/trunk/runtime-srcpack/CASCADE-MAKE.bat
===================================================================
--- /main/tags/2.85/gs2-extensions/music-stand/trunk/runtime-srcpack/CASCADE-MAKE.bat	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-stand/trunk/runtime-srcpack/CASCADE-MAKE.bat	(revision 24799)
@@ -0,0 +1,19 @@
+@echo off
+
+for /D %%d IN (packages) do (
+  echo   Running %%d\CASCADE-MAKE.bat %*
+
+  (cd %%d && call CASCADE-MAKE.bat %* && cd ..)
+
+  if not ERRORLEVEL 0 (
+    echo   Error encountered running %%d\CASCADE-MAKE.bat
+    goto ErrorExitPos1
+  )
+)
+goto End
+
+:ErrorExitPos1
+set ERRORLEVEL=1
+
+:End
+
Index: /main/tags/2.85/gs2-extensions/music-stand/trunk/runtime-srcpack/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/music-stand/trunk/runtime-srcpack/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-stand/trunk/runtime-srcpack/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+
+for d in packages ; do
+  echo "  Running $d/CASCADE-MAKE.sh $*"
+
+  (cd $d; ./CASCADE-MAKE.sh $*)
+
+  if [ $? != 0 ] ; then
+    echo "  Error encountered running $d/CASCADE-MAKE.sh"
+    exit 1
+  fi
+done
+
Index: /main/tags/2.85/gs2-extensions/music-stand/trunk/runtime-srcpack/packages/CASCADE-MAKE.bat
===================================================================
--- /main/tags/2.85/gs2-extensions/music-stand/trunk/runtime-srcpack/packages/CASCADE-MAKE.bat	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-stand/trunk/runtime-srcpack/packages/CASCADE-MAKE.bat	(revision 24799)
@@ -0,0 +1,20 @@
+@echo off
+
+for /D %%d IN (LIB-POPPLER EVINCE) do (
+  echo     Running CASCADE-MAKE\%%d.bat %*
+
+  call CASCADE-MAKE\%%d.bat %*
+
+  if not ERRORLEVEL 0 (
+    echo   Error encountered running CASCADE-MAKE\%%d.bat
+    goto ErrorExitPos1
+  )
+)
+
+goto End
+
+:ErrorExitPos1
+set ERRORLEVEL=1
+goto End
+
+:End
Index: /main/tags/2.85/gs2-extensions/music-stand/trunk/runtime-srcpack/packages/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/music-stand/trunk/runtime-srcpack/packages/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-stand/trunk/runtime-srcpack/packages/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+
+for d in LIBTOOL \
+         ICON-NAMING-UTILS GNOME-ICON-THEME GNOME-DOC-UTILS \
+         LIB-POPPLER EVINCE ; do
+  echo "    Running CASCADE-MAKE/$d.sh $*"
+
+  ./CASCADE-MAKE/$d.sh $*
+
+  if [ $? != 0 ] ; then
+    echo "  Error encountered running CASCADE-MAKE/$d.sh"
+    exit 1
+  fi
+done
+
+
Index: /main/tags/2.85/gs2-extensions/music-stand/trunk/runtime-srcpack/packages/CASCADE-MAKE/EVINCE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/music-stand/trunk/runtime-srcpack/packages/CASCADE-MAKE/EVINCE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-stand/trunk/runtime-srcpack/packages/CASCADE-MAKE/EVINCE.sh	(revision 24799)
@@ -0,0 +1,57 @@
+	#!/bin/bash
+
+package=evince
+version=-2.24.2-MUSICSTAND
+
+progname=$0
+
+source ../../cascade-make/lib/cascade-lib.bash
+
+prefix=$GEXTMUSICSTAND_INSTALLED
+
+export CFLAGS="-I$prefix/include"
+export LDFLAGS="-L$prefix/lib"
+
+export POPPLER_CFLAGS="-I$prefix/include/poppler/glib"
+export POPPLER_LIBS="-L$prefix/lib -lpoppler-glib -lpoppler"
+
+
+if [ ! -z $CROSSCOMPILE ] ; then
+  export LIBTOOL=arm-poky-linux-gnueabi-libtool
+  export PATH=$PATH:$prefix/devel/bin
+
+#  export LDFLAGS="$LDFLAGS -L/usr/local/poky/eabi-glibc/arm/arm-poky-linux-gnueabi/usr/lib"
+
+fi
+
+
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version "$prefix" \
+    --disable-scrollkeeper --without-keyring
+
+if [ ! -z $CROSSCOMPILE ] ; then
+  if [ $force_config = "1" ] ; then
+    echo "Changing libtool to cross-compiled version"
+    /bin/cp $prefix/bin/arm-poky-linux-gnueabi-libtool $package$version/libtool
+  fi
+fi
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+
+if [ ! -z $CROSSCOMPILE ] ; then
+	if [ $install = "1" ] ; then
+	  pushd $prefix/lib ; 
+	  for f in libevbackend.la; do
+	    sed -i~ -e "s; /usr/lib/; /usr/local/poky/eabi-glibc/arm/arm-poky-linux-gnueabi/usr/lib/;g" $f
+	  done
+	  popd;
+	fi
+fi
+
+
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
Index: /main/tags/2.85/gs2-extensions/music-stand/trunk/runtime-srcpack/packages/CASCADE-MAKE/GNOME-DOC-UTILS.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/music-stand/trunk/runtime-srcpack/packages/CASCADE-MAKE/GNOME-DOC-UTILS.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-stand/trunk/runtime-srcpack/packages/CASCADE-MAKE/GNOME-DOC-UTILS.sh	(revision 24799)
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+package=gnome-doc-utils
+version=-0.18.1
+
+progname=$0
+
+source ../../cascade-make/lib/cascade-lib.bash
+
+prefix=$GEXTMUSICSTAND_INSTALLED
+
+export CFLAGS="-I$prefix/include"
+export LDFLAGS="-L$prefix/lib"
+
+
+opt_run_untar $force_untar $auto_untar $package $version ".tar.bz2"
+
+opt_run_configure $force_config $auto_config $package $version "$prefix" \
+    --disable-scrollkeeper
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
Index: /main/tags/2.85/gs2-extensions/music-stand/trunk/runtime-srcpack/packages/CASCADE-MAKE/GNOME-ICON-THEME.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/music-stand/trunk/runtime-srcpack/packages/CASCADE-MAKE/GNOME-ICON-THEME.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-stand/trunk/runtime-srcpack/packages/CASCADE-MAKE/GNOME-ICON-THEME.sh	(revision 24799)
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+package=gnome-icon-theme
+version=-2.18.0
+
+progname=$0
+
+source ../../cascade-make/lib/cascade-lib.bash
+
+prefix=$GEXTMUSICSTAND_INSTALLED
+
+export CFLAGS="-I$prefix/include"
+export LDFLAGS="-L$prefix/lib"
+
+
+opt_run_untar $force_untar $auto_untar $package $version ".tar.bz2"
+opt_run_configure $force_config $auto_config $package $version "$prefix"
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
Index: /main/tags/2.85/gs2-extensions/music-stand/trunk/runtime-srcpack/packages/CASCADE-MAKE/ICON-NAMING-UTILS.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/music-stand/trunk/runtime-srcpack/packages/CASCADE-MAKE/ICON-NAMING-UTILS.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-stand/trunk/runtime-srcpack/packages/CASCADE-MAKE/ICON-NAMING-UTILS.sh	(revision 24799)
@@ -0,0 +1,30 @@
+#!/bin/bash
+
+package=icon-naming-utils
+version=-0.8.2
+
+progname=$0
+
+source ../../cascade-make/lib/cascade-lib.bash
+
+prefix=$GEXTMUSICSTAND_INSTALLED
+
+export CFLAGS="-I$prefix/include"
+export LDFLAGS="-L$prefix/lib"
+
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version "$prefix"
+
+if [ $force_config = "1" ] ; then
+  echo "If configure fails because it cannot detect XML::Simple"
+  echo "then one solution is do the following sudo command: "
+  echo "sudo perl -MCPAN -e 'install XML::Simple'"
+fi
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
Index: /main/tags/2.85/gs2-extensions/music-stand/trunk/runtime-srcpack/packages/CASCADE-MAKE/LIB-POPPLER.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/music-stand/trunk/runtime-srcpack/packages/CASCADE-MAKE/LIB-POPPLER.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-stand/trunk/runtime-srcpack/packages/CASCADE-MAKE/LIB-POPPLER.sh	(revision 24799)
@@ -0,0 +1,41 @@
+#!/bin/bash
+
+package=poppler
+version=-0.10.7
+
+progname=$0
+
+source ../../cascade-make/lib/cascade-lib.bash
+
+prefix=$GEXTMUSICSTAND_INSTALLED
+
+export CFLAGS="-I$prefix/include"
+export LDFLAGS="-L$prefix/lib"
+
+if [ ! -z $CROSSCOMPILE ] ; then
+  export LIBTOOL=arm-poky-linux-gnueabi-libtool
+  export PATH=$PATH:$prefix/devel/bin
+
+##  export LDFLAGS="$LDFLAGS -L/usr/local/poky/eabi-glibc/arm/arm-poky-linux-gnueabi/usr/lib/"
+fi
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version "$prefix"
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+
+if [ ! -z $CROSSCOMPILE ] ; then
+	if [ $install = "1" ] ; then
+  	pushd $prefix/lib ; 
+	  for f in libpoppler-glib.la libpoppler.la ; do
+	    sed -i~ -e "s; /usr/lib/; /usr/local/poky/eabi-glibc/arm/arm-poky-linux-gnueabi/usr/lib/;g" $f
+	  done
+	  popd;
+	fi
+fi
+
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
Index: /main/tags/2.85/gs2-extensions/music-stand/trunk/runtime-srcpack/packages/CASCADE-MAKE/LIBTOOL.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/music-stand/trunk/runtime-srcpack/packages/CASCADE-MAKE/LIBTOOL.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-stand/trunk/runtime-srcpack/packages/CASCADE-MAKE/LIBTOOL.sh	(revision 24799)
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+package=libtool
+version=-1.5.26
+
+progname=$0
+
+source ../../cascade-make/lib/cascade-lib.bash
+
+prefix=$GEXTMUSICSTAND_INSTALLED
+
+export CFLAGS="-I$prefix/include"
+export LDFLAGS="-L$prefix/lib"
+
+
+opt_run_untar $force_untar $auto_untar $package $version
+
+opt_run_configure $force_config $auto_config $package $version "$prefix" \
+    --host=arm-poky-linux-gnueabi --program-prefix=arm-poky-linux-gnueabi-
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
Index: /main/tags/2.85/gs2-extensions/music-stand/trunk/setup-irex.bash
===================================================================
--- /main/tags/2.85/gs2-extensions/music-stand/trunk/setup-irex.bash	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-stand/trunk/setup-irex.bash	(revision 24799)
@@ -0,0 +1,9 @@
+
+source /usr/local/poky/eabi-glibc/arm/environment-setup 
+
+export CROSSCOMPILE="--host=arm-poky-linux-gnueabi"
+
+source setup.bash
+
+
+
Index: /main/tags/2.85/gs2-extensions/music-stand/trunk/setup.bash
===================================================================
--- /main/tags/2.85/gs2-extensions/music-stand/trunk/setup.bash	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-stand/trunk/setup.bash	(revision 24799)
@@ -0,0 +1,40 @@
+
+extdesc="the Digital Music Stand Extension"
+
+source cascade-make/lib/cascade-lib.bash
+
+if [ "x$GEXTMUSICSTAND" = "x" ] ; then
+  export GEXTMUSICSTAND=`pwd`
+  export GEXTMUSICSTAND_INSTALLED=$GEXTMUSICSTAND/$GSDLOS
+
+  export PATH=$GEXTMUSICSTAND_INSTALLED/bin:$PATH
+
+  if [ "x$LD_LIBRARY_PATH" = "x" ] ; then
+    export LD_LIBRARY_PATH=$GEXTMUSICSTAND_INSTALLED/lib
+  else
+    export LD_LIBRARY_PATH=$GEXTMUSICSTAND_INSTALLED/lib:$LD_LIBRARY_PATH
+  fi
+  if [ "x$DYLD_LIBRARY_PATH" = "x" ] ; then
+    export DYLD_LIBRARY_PATH=$GEXTMUSICSTAND_INSTALLED/lib
+  else
+    export DYLD_LIBRARY_PATH=$GEXTMUSICSTAND_INSTALLED/lib:$DYLD_LIBRARY_PATH
+  fi
+
+  if [ "x$GSDLEXTS" = "x" ] ; then
+    export GSDLEXTS=music-stand
+  else 
+    export GSDLEXTS=$GSDLEXTS:music-stand
+  fi
+
+
+  export PKG_CONFIG_PATH=$GEXTMUSICSTAND_INSTALLED/lib/pkgconfig:$GEXTMUSICSTAND_INSTALLED/share/pkgconfig:$PKG_CONFIG_PATH
+  if [ "x$PYTHONPATH" = "x" ] ; then
+    export PYTHONPATH=$GEXTMUSICSTAND_INSTALLED/lib/python2.5/site-packages/
+  else
+    export PYTHONPATH=$PYTHONPATH:$GEXTMUSICSTAND_INSTALLED/lib/python2.5/site-packages/
+  fi
+
+  echo "+Your environment is now setup for $extdesc"
+else
+  echo "+Your environment is already setup for $extdesc"
+fi
Index: /main/tags/2.85/gs2-extensions/music-stand/trunk/setup.bat
===================================================================
--- /main/tags/2.85/gs2-extensions/music-stand/trunk/setup.bat	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-stand/trunk/setup.bat	(revision 24799)
@@ -0,0 +1,48 @@
+@echo off
+pushd "%CD%"
+CD /D "%~dp0"
+set GSDLLANG=en
+set extdesc="the Digital Music Stand Extension"
+
+if "%OS%" == "Windows_NT" goto WinNT
+if "%OS%" == "" goto Win95
+if "%GSDLLANG%" == "en" echo Setup failed - your PATH has not been set
+if "%GSDLLANG%" == "es" echo No se pudo realizar la configuraci¢n - no se ha establecido la RUTA.
+if "%GSDLLANG%" == "fr" echo Echc de l'installation - votre variable PATH n'a pas t ajuste
+if "%GSDLLANG%" == "ru" echo áâ ­®¢ª  ­¥ ã€ « áì -  ­¥ ¡ë« ãáâ ­®¢«¥­
+goto End
+
+:WinNT
+set GEXTMUSICSTAND=%CD%
+set GEXTMUSICSTAND_INSTALLED=%GEXTMUSICSTAND%\windows
+
+set PATH=%GEXTMUSICSTAND_INSTALLED%\bin;%PATH%
+set GS_CP_SET=yes
+goto Success
+
+:Win95
+if "%1" == "SetEnv" goto Win95Env
+REM We'll invoke a second copy of the command processor to make
+REM sure there's enough environment space
+COMMAND /E:2048 /K %0 SetEnv
+goto End
+
+:Win95Env
+set GEXTMUSICSTAND=%CD%
+set PATH="%GEXTMUSICSTAND_INSTALLED%\bin";"%PATH%"
+set GS_CP_SET=yes
+goto Success
+
+:Success
+
+if "x%GSDLEXTS%" == "x" (
+  set GSDLEXTS=music-stand
+) else (
+  set GSDLEXTS=%GSDLEXTS%:music-stand
+)
+
+echo +Your environment is now setup for %extdesc%
+
+:End
+
+popd
Index: /main/tags/2.85/gs2-extensions/music-stand/trunk/setup.pl
===================================================================
--- /main/tags/2.85/gs2-extensions/music-stand/trunk/setup.pl	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-stand/trunk/setup.pl	(revision 24799)
@@ -0,0 +1,41 @@
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    die "GSDLOS not set\n" unless defined $ENV{'GSDLOS'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib/cpan");
+}
+
+use Cwd;
+require util;    
+
+if (!defined $ENV{'GEXTMUSICSTAND'}) {
+    
+    $ENV{'GEXTMUSICSTAND'} = cwd();
+    
+    $ENV{'GEXTMUSICSTAND_INSTALLED'}
+    = &util::filename_cat($ENV{'GEXTMUSICSTAND'},"installed");
+
+    my $musicstand_bin
+	= &util::filename_cat($ENV{'GEXTMUSICSTAND_INSTALLED'},$ENV{'GSDLOS'},"bin");
+    my $musicstand_lib
+	= &util::filename_cat($ENV{'GEXTMUSICSTAND_INSTALLED'},$ENV{'GSDLOS'},"lib");
+
+    &util::envvar_append("PATH",$musicstand_bin);
+
+    # For Linux (no harm is setting is this for MacOs)
+    &util::envvar_append("LD_LIBRARY_PATH",$musicstand_lib);
+    
+    # For MacOs (no harm is setting is this for Linux etc)
+    &util::envvar_append("DYLD_LIBRARY_PATH",$musicstand_lib);
+
+
+    # GSDLEXTS always uses : as a separator
+    if (defined $ENV{'GSDLEXTS'}) {
+	$ENV{'GSDLEXTS'} .= ":music-stand" ;
+    }
+    else {
+	$ENV{'GSDLEXTS'} .="music-stand";
+    }
+
+}
Index: /main/tags/2.85/gs2-extensions/music-stand/trunk/src/scribble-simple/Makefile
===================================================================
--- /main/tags/2.85/gs2-extensions/music-stand/trunk/src/scribble-simple/Makefile	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-stand/trunk/src/scribble-simple/Makefile	(revision 24799)
@@ -0,0 +1,15 @@
+#CC = gcc
+CC = arm-poky-linux-gnueabi-gcc
+
+CFLAGS = -Wall	-g		 	\
+	-DG_DISABLE_DEPRECATED 	 	\
+	-DGDK_DISABLE_DEPRECATED 	\
+	-DGDK_PIXBUF_DISABLE_DEPRECATED \
+	-DGTK_DISABLE_DEPRECATED
+
+scribble-simple: scribble-simple.c
+	$(CC) scribble-simple.c -o scribble-simple $(CFLAGS) `pkg-config gtk+-2.0 --cflags --libs`
+
+clean:
+	rm -f *.o scribble-simple
+
Index: /main/tags/2.85/gs2-extensions/music-stand/trunk/src/scribble-simple/scribble-simple.c
===================================================================
--- /main/tags/2.85/gs2-extensions/music-stand/trunk/src/scribble-simple/scribble-simple.c	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/music-stand/trunk/src/scribble-simple/scribble-simple.c	(revision 24799)
@@ -0,0 +1,848 @@
+
+/* GTK - The GIMP Toolkit
+ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <gtk/gtk.h>
+#include <gdk/gdkkeysyms.h>
+#include <glib/gstdio.h>
+#include <string.h>
+
+/* Backing pixmap for drawing area */
+static GdkPixmap *pixmap = NULL;
+
+//buffer pixmap which will be drawn into the pixmap drawn on screen
+static GdkPixmap *buffer_pixmap = NULL;
+
+//point data to be added to an appropriate file upon leaving the relevant page [or exiting?]
+static GList *points_list = NULL;
+
+//static char *folder_name = "chopin_prelude_op45-a4";
+static int current_page = 0;
+static int prev_page = 0;
+
+static int vert_page_progress = 0;
+static int hori_page_progress = 0;
+
+//percentage of height at which we change from uncovering vertically to horizontally
+static int change_height_percent=80;
+
+static GdkPixbuf *pp_pbuf_image = NULL;
+static GdkGC* pp_gc = NULL;
+
+static int pp_width = 0;
+static int pp_height = 0;
+
+static int page_width = 0;
+static int page_height = 0;
+
+//for tracking mouse movement
+static int last_x_pos = -1;
+static int last_y_pos = -1;
+
+
+static gboolean in_progress = FALSE;
+
+static gboolean load_show_page(	GtkWidget	*widget,
+				char		*folder_name,
+				int		page_number);
+
+static gboolean load_show_page_immediate(	GtkWidget	*widget,
+					char		*folder_name,
+					int		page_number);
+
+static gboolean read_point_data_from_file (GtkWidget	*widget,
+					   GdkPixmap	*drawing_pixmap,
+						char	*filename);
+
+
+static guint timeout_id = 0;
+
+
+static gboolean update_progress_page(gpointer data)
+{
+  GtkWidget* widget = (GtkWidget*)data;
+
+  g_print("updating page progress = %d\n", vert_page_progress);
+
+  if (vert_page_progress < 100)
+  {
+    if (vert_page_progress < change_height_percent)
+    {
+
+      int prev_height = (int)(pp_height * (vert_page_progress / 100.0));
+      vert_page_progress+=10;
+      int update_height = (int)(pp_height * (vert_page_progress / 100.0));
+  
+//      gdk_draw_pixbuf (pixmap, pp_gc, pp_pbuf_image, 
+//		     0, 0, 0, 0, -1, update_height, GDK_RGB_DITHER_NONE, 0, 0);
+
+      gdk_draw_drawable (pixmap, pp_gc, buffer_pixmap, 
+		     0, 0, 0, 0, -1, update_height);
+  
+      gtk_widget_queue_draw_area (widget,
+		                0, prev_height,
+  		                pp_width, update_height - prev_height);
+      return TRUE;
+    }
+    else
+    {
+      //update horizontally
+      if (hori_page_progress < 100)
+      {
+
+        hori_page_progress+=10;
+
+        int update_height = (int)(pp_height * (vert_page_progress / 100.0));
+        int update_width = (int)(pp_width * (hori_page_progress / 100.0));
+
+//        gdk_draw_pixbuf (pixmap, pp_gc, pp_pbuf_image, 
+//		       0, update_height, 0, update_height, update_width, pp_height - update_height, GDK_RGB_DITHER_NONE, 0, 0);
+
+      gdk_draw_drawable (pixmap, pp_gc, buffer_pixmap, 
+		     0, update_height, 0, update_height, update_width, pp_height - update_height);
+
+        gtk_widget_queue_draw_area (widget,
+		                  0, update_height,
+   		                  update_width, pp_height);
+
+	return TRUE;
+
+      }
+      else
+      {
+        //reset values
+//        vert_page_progress = 0;
+//        hori_page_progress = 0;
+	in_progress = FALSE;
+
+
+
+ 	return FALSE;
+      }
+    }
+  }
+
+  else
+  {
+
+    //reset values
+//    vert_page_progress = 0;
+//    hori_page_progress = 0;
+    in_progress = FALSE;
+    return FALSE;
+  }
+
+}
+
+
+/* Create a new backing pixmap of the appropriate size */
+static gboolean configure_event( GtkWidget         *widget,
+                                 GdkEventConfigure *event,
+				 gpointer	    folder_name )
+{
+
+//  char *filename = "chopin_prelude_op45-a4/chopin_prelude_op45-a4-page00.tif";
+//  char *filename = "page1.tif";
+ 
+  if (pixmap)
+    g_object_unref (pixmap);
+
+  pixmap = gdk_pixmap_new (widget->window,
+			   widget->allocation.width,
+			   widget->allocation.height,
+			   -1);
+
+  buffer_pixmap = gdk_pixmap_new (widget->window,
+			   widget->allocation.width,
+			   widget->allocation.height,
+			   -1);
+
+
+  gdk_draw_rectangle (pixmap,
+		      widget->style->black_gc,
+		      TRUE,
+		      0, 0,
+		      widget->allocation.width,
+		      widget->allocation.height);
+
+
+  pp_gc = gdk_gc_new (pixmap);
+
+  //reset values
+  vert_page_progress = 0;
+  hori_page_progress = 0;
+  in_progress = TRUE;
+  load_show_page_immediate (widget, (char*)folder_name, 0);
+
+  return TRUE;
+}
+
+/* Redraw the screen from the backing pixmap */
+static gboolean expose_event( GtkWidget      *widget,
+                              GdkEventExpose *event )
+{
+  gdk_draw_drawable (widget->window,
+		     widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
+		     pixmap,
+		     event->area.x, event->area.y,
+		     event->area.x, event->area.y,
+		     event->area.width, event->area.height);
+
+  return FALSE;
+}
+
+
+
+
+#define min2(x,y) (x<y)?x:y
+#define max2(x,y) (x>y)?x:y
+//connecting line
+static void draw_connecting_line (GtkWidget	*widget,
+				  GdkPixmap	*drawing_pixmap,
+				  gdouble	last_x,
+				  gdouble	last_y,
+				  gdouble	x,
+				  gdouble	y)
+{ 
+  //we are going to draw a line between two points instead of just drawing the next point
+  gdk_gc_set_line_attributes (	widget->style->black_gc,
+				2, GDK_LINE_SOLID,
+				GDK_CAP_BUTT, GDK_JOIN_ROUND);
+
+  gdk_draw_line ( drawing_pixmap,
+		  widget->style->black_gc,
+		  last_x, last_y,
+		  x, y);
+
+  int x_min = min2(x, last_x);
+  int y_min = min2(y, last_y);
+  int x_max = max2(x, last_x);
+  int y_max = max2(y, last_y);
+	
+  gtk_widget_queue_draw_area (	widget,
+				x_min - 2, y_min - 2,
+				x_max - x_min + 5, y_max - y_min + 5);
+}
+
+/* Draw a rectangle on the screen */
+static void draw_brush( GtkWidget *widget,
+			GdkPixmap *drawing_pixmap,
+                        gdouble    x,
+                        gdouble    y)
+{
+  GdkRectangle update_rect;
+
+  update_rect.x = x - 2;
+  update_rect.y = y - 2;
+  update_rect.width = 4;
+  update_rect.height = 4;
+  gdk_draw_rectangle (drawing_pixmap,
+		      widget->style->black_gc,
+		      TRUE,
+		      update_rect.x, update_rect.y,
+		      update_rect.width, update_rect.height);
+  gtk_widget_queue_draw_area (widget,
+		              update_rect.x, update_rect.y,
+		              update_rect.width, update_rect.height);
+}
+
+
+
+static gboolean file_exists (char *filename)
+{
+  //if NULL is returned then the file probably does not exist; return false
+  if (g_fopen(filename, "r") == NULL) return FALSE;
+  return TRUE;
+}
+
+static gboolean load_show_page(	GtkWidget	*widget,
+				char		*folder_name,
+				int		page_number)
+{
+
+
+      char filename[512];
+      sprintf(filename, "%s/%s-page%02d.tif", folder_name, folder_name, page_number);
+
+
+      g_print("%s\n\n", filename);
+
+
+//      filename = "chopin_prelude_op45-a4/chopin_prelude_op45-a4-page01.tif";
+
+
+  if (!file_exists(filename)) return FALSE;
+
+
+  //get the percentage of page to load/display before swapping from vertical loading to horizontal loading
+  char filename_pagebreak[512];
+  sprintf (filename_pagebreak, "%s.pagebreak", filename);
+  if (file_exists(filename_pagebreak)) {
+    FILE *file = fopen(filename_pagebreak, "r");
+    char line_buf[10]; //shouldn't be longer than 2 characters, really
+    fgets(line_buf, 10, file);
+    change_height_percent = atoi ( line_buf );
+  }
+  else
+  {
+    change_height_percent = 80; //defaults to 80% if there is no pagebreak file
+  }
+  g_print("change_height_percent: %d\n", change_height_percent);
+
+
+
+  // Get the origial image size.
+  gdk_pixbuf_get_file_info(filename, &pp_width, &pp_height);
+  page_width = widget->allocation.width;
+  page_height = widget->allocation.height;
+
+  gdk_drawable_get_size(pixmap, &page_width, &page_height);
+
+//getting the scaled sizes to load the image in at fullscreen
+  int w = pp_width;
+  int h = pp_height;
+  double scale = 1;
+  if (pp_width >= pp_height)
+  {
+    if (pp_width != page_width)
+    {
+      scale = (double)pp_width / (double)page_width;
+    }
+  }
+  else if (pp_height > pp_width)
+  {
+    if (pp_height != page_height)
+    {
+      scale = (double)pp_height / (double)page_height;
+    }
+  }
+  w = (int)((double)pp_width / scale);
+  h = (int)((double)pp_height / scale)- 1;
+  pp_width = w;
+  pp_height = h;
+
+  pp_pbuf_image = gdk_pixbuf_new_from_file_at_size(filename, pp_width, pp_height, 0);
+
+      gdk_draw_pixbuf (buffer_pixmap, pp_gc, pp_pbuf_image, 
+		     0, 0, 0, 0, -1, -1, GDK_RGB_DITHER_NONE, 0, 0);
+
+//drawing the point/scribble data onto the buffer pixmap
+	char point_filename[512];
+	sprintf(point_filename, "%s/%s-page%02d.tif.pointdata", folder_name, folder_name, page_number);
+	read_point_data_from_file(widget, buffer_pixmap, point_filename);
+
+
+
+
+  //pp_gc = gdk_gc_new (pixmap);
+
+
+
+
+  //reset values
+  vert_page_progress = 0;
+  hori_page_progress = 0;
+  timeout_id = g_timeout_add (1000, update_progress_page, widget);
+
+  return TRUE;
+
+}
+
+
+
+static gboolean load_show_page_immediate(  GtkWidget	*widget,
+					   char		*folder_name,
+					   int		page_number)
+{
+
+
+  char filename[512];
+  sprintf(filename, "%s/%s-page%02d.tif", folder_name, folder_name, page_number);
+
+
+  g_print("%s\n\n", filename);
+
+
+//      filename = "chopin_prelude_op45-a4/chopin_prelude_op45-a4-page01.tif";
+
+
+  if (!file_exists(filename)) return FALSE;
+
+
+
+  // Get the origial image size.
+  gdk_pixbuf_get_file_info(filename, &pp_width, &pp_height);
+  page_width = widget->allocation.width;
+  page_height = widget->allocation.height;
+
+  gdk_drawable_get_size(pixmap, &page_width, &page_height);
+
+//getting the scaled sizes to load the image in at fullscreen
+  int w = pp_width;
+  int h = pp_height;
+  double scale = 1;
+  if (pp_width >= pp_height)
+  {
+    if (pp_width != page_width)
+    {
+      scale = (double)pp_width / (double)page_width;
+    }
+  }
+  else if (pp_height > pp_width)
+  {
+    if (pp_height != page_height)
+    {
+      scale = (double)pp_height / (double)page_height;
+    }
+  }
+  w = (int)((double)pp_width / scale);
+  h = (int)((double)pp_height / scale)- 1;
+  pp_width = w;
+  pp_height = h;
+
+  pp_pbuf_image = gdk_pixbuf_new_from_file_at_size(filename, pp_width, pp_height, 0);
+
+  //pp_gc = gdk_gc_new (pixmap);
+
+
+
+  //reset values
+  vert_page_progress = 0;
+  hori_page_progress = 0;
+
+
+
+
+
+      gdk_draw_pixbuf (buffer_pixmap, pp_gc, pp_pbuf_image, 
+		     0, 0, 0, 0, -1, -1, GDK_RGB_DITHER_NONE, 0, 0);
+
+//drawing the point/scribble data onto the buffer pixmap
+	char point_filename[512];
+	sprintf(point_filename, "%s/%s-page%02d.tif.pointdata", folder_name, folder_name, page_number);
+	read_point_data_from_file(widget, buffer_pixmap, point_filename);
+
+
+
+//current
+
+
+      gdk_draw_drawable (pixmap, pp_gc, buffer_pixmap, 
+		     0, 0, 0, 0, -1, -1);
+
+//	gdk_draw_pixbuf (pixmap, pp_gc, pp_pbuf_image, 0, 0, 0, 0, -1, -1, GDK_RGB_DITHER_NONE,  0, 0);
+  
+      gtk_widget_queue_draw_area (widget,
+		                0, 0,
+  		                pp_width, pp_height);
+
+
+
+
+
+//  g_timeout_add (1000, update_progress_page, widget);
+
+  in_progress = FALSE;
+
+  return TRUE;
+
+}
+
+
+
+
+
+static gboolean write_point_data_to_file (  char	*filename)
+{
+  FILE *file;
+  file = fopen(filename, "w+");
+
+  GList *curr = points_list;
+  while (curr != NULL)
+  {
+    g_print("writing: %s\n", (char*)curr->data);
+    fprintf(file, "%s\n", (char*)curr->data);
+    curr = g_list_next(curr);
+  }
+
+  fclose(file);
+
+  return TRUE;
+}
+
+static gboolean read_point_data_from_file (GtkWidget	*widget,
+					   GdkPixmap	*drawing_pixmap,
+						char	*filename)
+{
+  //reset points list
+  points_list = NULL;
+
+  FILE *file;
+  file = fopen(filename, "r+");
+  if (file == NULL)
+  {
+    g_print ("no point file data\n");
+    return FALSE;
+  }
+  int old_x_val, old_y_val, x_val, y_val;
+  gboolean start_line = TRUE;
+//  while (feof(file) == 0)
+  g_print("gonna scan us some file: %s\n", filename);
+
+  while (fscanf(file, "%d %d\n", &x_val, &y_val) != EOF)
+    {
+        //add this data to the list of point data, ...
+      char *data = malloc(16);
+      if (data == NULL)
+      {
+        fprintf(stderr, "error (failed to allocate memory in button_press_event");
+        exit(-1);
+      }
+      sprintf (data, "%d %d", x_val, y_val);
+      points_list = g_list_append(points_list, data);
+
+      g_print("%s\n", data);
+//break;
+//    fscanf(file, "%d %d\n", &x_val, &y_val);
+    if (x_val == -1) //then continue;
+    {
+      start_line = TRUE;
+      continue;
+    }
+    else if (start_line)
+    {
+      draw_brush(widget, drawing_pixmap, x_val, y_val);
+      old_x_val = x_val;
+      old_y_val = y_val;
+    }
+    else
+    {
+      draw_connecting_line (widget, drawing_pixmap, old_x_val, old_y_val, x_val, y_val);
+      old_x_val = x_val;
+      old_y_val = y_val;      
+    }
+    
+    start_line = FALSE;
+  }
+  fclose(file);
+  return TRUE;
+}
+
+
+static gboolean button_release_event( GtkWidget      *widget,
+                                    GdkEventButton   *event)
+{
+  g_print("mouse released\n");
+  last_x_pos = -1;
+  last_y_pos = -1;
+
+  //add this gap to the list of point data, ...
+  points_list = g_list_append(points_list, "-1 -1");
+
+  return TRUE;	
+}
+
+
+static gboolean button_press_event( GtkWidget      *widget,
+                                    GdkEventButton *event,
+				    gpointer	   folder_name)
+{
+
+
+  if (event->button == 1 && pixmap != NULL)
+  {
+    if (!in_progress)
+    {
+      draw_brush (widget, pixmap, event->x, event->y);
+      last_x_pos = event->x;
+      last_y_pos = event->y;
+
+      //add this data to the list of point data, ...
+      char *data = malloc(16);
+      if (data == NULL)
+      {
+	fprintf(stderr, "error (failed to allocate memory in button_press_event");
+	exit(-1);
+      }
+      sprintf (data, "%d %d", (int)event->x, (int)event->y);
+      points_list = g_list_append(points_list, data);
+
+      //g_print("%x\n", folder_name);
+
+      //in_progress = TRUE;
+
+      //current_page += 1;
+      //load_show_page (widget, (char*)folder_name, current_page);
+    }
+    else
+    {
+      g_print("in progress so can't draw\n");
+    }
+  }
+
+  return TRUE;
+}
+
+
+static gboolean key_press_event( GtkWidget      *widget,
+                                 GdkEventKey    *event,
+				 gpointer	data_list)
+{
+
+if (event->type == GDK_KEY_RELEASE) return TRUE;
+
+GtkWidget *drawing_area = (GtkWidget*)g_list_nth_data(data_list, 0);
+char *folder_name = (char*)g_list_nth_data(data_list, 1);
+
+g_print("called keypress event\n");
+  if (!in_progress)
+  {
+  g_print("NOT inprogress\n");
+  //write the point data for this page to a file
+  char filename[512];
+  sprintf(filename, "%s/%s-page%02d.tif.pointdata", folder_name, folder_name, current_page);
+  g_print("writing to file: %s", filename);
+  write_point_data_to_file (filename);
+
+  switch (event->keyval)
+    {
+    case GDK_Right:
+      printf("right!\n");
+      prev_page = current_page;
+      current_page += 1;
+      break;
+    case GDK_Left:
+      printf("left!\n");
+      prev_page = current_page;
+      current_page -= 1;
+      break;
+    default:
+      return TRUE;
+    }
+    in_progress = TRUE;
+    load_show_page (drawing_area, folder_name, current_page);
+  }
+  else //in progress, so speed up that progress: load page immediately
+  {
+  g_print("in progress\n");
+  switch (event->keyval)
+    {
+    case GDK_Right:
+      g_source_remove(timeout_id);
+      if (current_page != prev_page+1)
+      {
+	current_page = prev_page;
+      }
+      load_show_page_immediate(drawing_area, folder_name, current_page);
+//      printf("right!\n");
+//      current_page += 1;
+      break;
+    case GDK_Left:
+      g_source_remove(timeout_id);
+      if (current_page != prev_page-1)
+      {
+	current_page = prev_page;
+      }
+      load_show_page_immediate(drawing_area, folder_name, current_page);
+//      printf("left!\n");
+//      current_page -= 1;
+      break;
+    default:
+      return TRUE;
+    }
+      
+//    load_show_page_immediate(drawing_area, folder_name, current_page);
+  }
+
+  return TRUE;
+}
+
+static gboolean motion_notify_event( GtkWidget *widget,
+                                     GdkEventMotion *event )
+{
+  int x, y;
+  GdkModifierType state;
+
+  if (event->is_hint)
+    gdk_window_get_pointer (event->window, &x, &y, &state);
+  else
+    {
+      x = event->x;
+      y = event->y;
+      state = event->state;
+    }
+
+  if (state & GDK_BUTTON1_MASK && pixmap != NULL)
+  {
+    if (!in_progress)
+    {
+	//if we haven't set x yet, don't do this
+	if (last_x_pos == -1) return TRUE;
+
+	draw_connecting_line (widget, pixmap, last_x_pos, last_y_pos, x, y);
+
+	last_x_pos = x;
+	last_y_pos = y;
+
+
+
+        //add this data to the list of point data, ...
+        char *data = malloc(16);
+        if (data == NULL)
+        {
+  	  fprintf(stderr, "error (failed to allocate memory in button_press_event");
+	  exit(-1);
+        }
+        sprintf (data, "%d %d", (int)event->x, (int)event->y);
+        points_list = g_list_append(points_list, data);
+
+
+//      draw_brush (widget, x, y);
+    }
+
+  }
+
+  return TRUE;
+}
+
+void quit ()
+{
+  exit (0);
+}
+
+int main( int   argc,
+          char *argv[] )
+{
+
+char *folder_name;
+
+  if (argc == 1)
+  {
+    //default
+    folder_name = "chopin_prelude_op45-a4";
+  }
+  else
+  {
+    folder_name = argv[1];
+  }
+
+
+//************************************
+/*
+FILE *writing;
+//int buffer = 256;
+int value = 6;
+char *filename;
+filename = "file.txt";
+writing = fopen(filename, "w+");
+fprintf(writing, "%d\n", value);
+value = 7;
+fprintf(writing, "%d\n", value);
+value = 8;
+fprintf(writing, "%d\n", value);
+fclose(writing);
+
+int blah = 0;
+writing = fopen(filename, "r+");
+fscanf(writing, "%d\n", &blah);
+g_print("%d\n", blah);
+fscanf(writing, "%d\n", &blah);
+g_print("%d\n", blah);
+fscanf(writing, "%d\n", &blah);
+g_print("%d\n", blah);
+fclose(writing);
+*/
+//************************************
+
+
+  GtkWidget *window;
+  GtkWidget *drawing_area;
+  GtkWidget *vbox;
+
+  GtkWidget *button;
+
+  gtk_init (&argc, &argv);
+
+  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+  gtk_widget_set_name (window, "Test Input");
+
+  vbox = gtk_vbox_new (FALSE, 0);
+  gtk_container_add (GTK_CONTAINER (window), vbox);
+  gtk_widget_show (vbox);
+
+  g_signal_connect (window, "destroy",
+                    G_CALLBACK (quit), NULL);
+
+  /* Create the drawing area */
+
+  drawing_area = gtk_drawing_area_new ();
+  gtk_widget_set_size_request (GTK_WIDGET (drawing_area), 200, 200);
+  gtk_box_pack_start (GTK_BOX (vbox), drawing_area, TRUE, TRUE, 0);
+
+  gtk_widget_show (drawing_area);
+
+  /* Signals used to handle backing pixmap */
+
+  g_signal_connect (drawing_area, "expose-event",
+		    G_CALLBACK (expose_event), NULL);
+  g_signal_connect (drawing_area,"configure-event",
+		    G_CALLBACK (configure_event), folder_name);
+
+  /* Event signals */
+
+  g_signal_connect (drawing_area, "motion-notify-event",
+		    G_CALLBACK (motion_notify_event), NULL);
+  g_signal_connect (drawing_area, "button-press-event",
+		    G_CALLBACK (button_press_event), folder_name);
+  g_signal_connect (drawing_area, "button-release-event",
+		    G_CALLBACK (button_release_event), NULL);
+
+  //needs to be passed both the drawing_area, and the folder_name, so create a glist and pass a pointer to that
+  GList *key_press_data = NULL;
+  key_press_data = g_list_append(key_press_data, drawing_area);
+  key_press_data = g_list_append(key_press_data, folder_name);
+
+  g_signal_connect (window, "key-press-event",
+		    G_CALLBACK (key_press_event), key_press_data);
+
+
+  gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK
+			 | GDK_LEAVE_NOTIFY_MASK
+			 | GDK_BUTTON_PRESS_MASK
+			 | GDK_BUTTON_RELEASE_MASK
+			 | GDK_POINTER_MOTION_MASK
+			 | GDK_POINTER_MOTION_HINT_MASK);
+
+  /* .. And a quit button */
+  button = gtk_button_new_with_label ("Quit");
+  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+
+  g_signal_connect_swapped (button, "clicked",
+			    G_CALLBACK (gtk_widget_destroy),
+			    window);
+  gtk_widget_show (button);
+
+  gtk_widget_show (window);
+
+  gtk_main ();
+
+  return 0;
+}
Index: /main/tags/2.85/gs2-extensions/mysql/trunk/src/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/mysql/trunk/src/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/mysql/trunk/src/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+source devel.bash
+
+for d in packages ; do
+  echo "Running $d/CASCADE-MAKE.sh"
+
+  (cd $d ; ./CASCADE-MAKE.sh $*)
+
+  if [ $? != 0 ] ; then
+    echo "Error encountered running $d/CASCADE-MAKE.sh"
+    exit 1
+  fi
+done
+
+if [ $makedist = "1" ] ; then
+  default_toplevel_make_dist $GSDLOS
+fi
Index: /main/tags/2.85/gs2-extensions/mysql/trunk/src/devel.bash
===================================================================
--- /main/tags/2.85/gs2-extensions/mysql/trunk/src/devel.bash	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/mysql/trunk/src/devel.bash	(revision 24799)
@@ -0,0 +1,2 @@
+source cascade-make/lib/cascade-lib.bash GEXTMYSQL . $*
+
Index: /main/tags/2.85/gs2-extensions/mysql/trunk/src/packages/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/mysql/trunk/src/packages/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/mysql/trunk/src/packages/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+
+for d in MYSQL ; do
+  echo "    Running CASCADE-MAKE/$d.sh $*"
+
+  ./CASCADE-MAKE/$d.sh $*
+
+  if [ $? != 0 ] ; then
+    echo "  Error encountered running CASCADE-MAKE/$d.sh"
+    exit 1
+  fi
+done
Index: /main/tags/2.85/gs2-extensions/mysql/trunk/src/packages/CASCADE-MAKE/MYSQL.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/mysql/trunk/src/packages/CASCADE-MAKE/MYSQL.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/mysql/trunk/src/packages/CASCADE-MAKE/MYSQL.sh	(revision 24799)
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+package=mysql
+version=-5.1.47
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTMYSQL ../.. $*
+
+prefix=$GEXTMYSQL_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version $prefix --exec-prefix=$prefix
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/mysql/trunk/src/setup.bash
===================================================================
--- /main/tags/2.85/gs2-extensions/mysql/trunk/src/setup.bash	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/mysql/trunk/src/setup.bash	(revision 24799)
@@ -0,0 +1,43 @@
+extdesc="the MySQL extension"
+
+full_setup=`pwd`/${BASH_SOURCE}
+fulldir=${full_setup%/*}
+fulldir=${fulldir%/.}
+
+if [ "x$GSDLHOME" = "x" ] ; then
+  if [ -e ../../setup.bash ] ; then
+    export gsopt_noexts=1 && pushd ../.. && source setup.bash && popd
+    export gsopt_noexts=
+  fi
+fi
+
+if [ "x$GEXTMYSQL" = "x" ] ; then
+  export GEXTMYSQL=$fulldir
+  export GEXTMYSQL_INSTALLED=$GEXTMYSQL/$GSDLOS
+
+  export PATH=$GEXTMYSQL_INSTALLED/bin:$PATH
+
+  if [ "x$LD_LIBRARY_PATH" = "x" ] ; then
+    export LD_LIBRARY_PATH=$GEXTMYSQL_INSTALLED/lib
+  else
+    export LD_LIBRARY_PATH=$GEXTMYSQL_INSTALLED/lib:$LD_LIBRARY_PATH
+  fi
+  if [ "x$DYLD_LIBRARY_PATH" = "x" ] ; then
+    export DYLD_LIBRARY_PATH=$GEXTMYSQL_INSTALLED/lib
+  else
+    export DYLD_LIBRARY_PATH=$GEXTMYSQL_INSTALLED/lib:$DYLD_LIBRARY_PATH
+  fi
+  
+  extdir=${GEXTMYSQL##*/}
+
+  if [ "x$GSDLEXTS" = "x" ] ; then
+    export GSDLEXTS=$extdir
+  else 
+    export GSDLEXTS=$GSDLEXTS:$extdir
+  fi
+
+
+  echo "+Your environment is now setup for $extdesc"
+else
+  echo "+Your environment is already setup for $extdesc"
+fi
Index: /main/tags/2.85/gs2-extensions/ocr/trunk/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/ocr/trunk/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/ocr/trunk/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+source bin/script/test-setup.bash
+source lib/cascade-lib.bash
+
+if [ ! -d "$GEXTOCR_INSTALLED" ] ; then
+  echo "Making directory \"$GEXTOCR_INSTALLED\""
+  mkdir "$GEXTOCR_INSTALLED"
+fi
+
+for d in packages ; do
+  echo "Running $d/CASCADE-MAKE.sh $*"
+
+  (cd $d ; ./CASCADE-MAKE.sh $*)
+
+  if [ $? != 0 ] ; then
+    echo "Error encountered running $d/CASCADE-COMPILE.sh"
+    exit 1
+  fi
+done
+
+
Index: /main/tags/2.85/gs2-extensions/ocr/trunk/bin/script/test-setup.bash
===================================================================
--- /main/tags/2.85/gs2-extensions/ocr/trunk/bin/script/test-setup.bash	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/ocr/trunk/bin/script/test-setup.bash	(revision 24799)
@@ -0,0 +1,8 @@
+
+
+if [ "x$GEXTOCR" = "x" ] ; then
+  echo "OCR extension environment variable GEXTOCR not set."
+  echo "Have you sourced the extension's setup file, e.g. setup.bash?"
+  exit -1
+fi
+
Index: /main/tags/2.85/gs2-extensions/ocr/trunk/devel.bash
===================================================================
--- /main/tags/2.85/gs2-extensions/ocr/trunk/devel.bash	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/ocr/trunk/devel.bash	(revision 24799)
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+if [ "x$GEXTOCR" = "x" ] ; then
+  source setup.bash
+fi
+
+if [ "x$GEXTOCR_DEVEL" = "x" ] ; then
+
+  # Set environment variable so we can tell devel.bash has been sourced
+  export GEXTOCR_DEVEL=$GEXTOCR
+
+  export PATH=$GEXTOCR/bin/:$GEXTOCR_INSTALLED/devel/bin:$PATH
+
+  export PERL5PATH=$GEXTOCR_INSTALLED/devel/lib/perl5/vendor_perl/5.8.8
+
+  echo "+Your environment is now setup for OCR (Ocropus) development"
+else
+  echo "+Your environment is already setup for OCR (Ocropus) development"
+fi
+
Index: /main/tags/2.85/gs2-extensions/ocr/trunk/lib/cascade-lib.bash
===================================================================
--- /main/tags/2.85/gs2-extensions/ocr/trunk/lib/cascade-lib.bash	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/ocr/trunk/lib/cascade-lib.bash	(revision 24799)
@@ -0,0 +1,181 @@
+
+run_untar()
+{
+  local package=$1
+  local version=$2
+  local ext=$3
+
+  tar_args="";
+
+  if [ $ext = ".tar.gz" ] ; then
+    tar_args="xvzf"
+  elif [ $ext = ".tgz" ] ; then
+    tar_args="xvzf"
+  elif [ $ext = ".tar.bz2" ] ; then
+    tar_args="xvjf"
+  elif [ $ext = ".tar.bz" ] ; then
+    tar_args="xvjf"
+  elif [ $ext = ".tar" ] ; then
+    tar_args="xvf"
+  else 
+    echo "Warning: Unrecognized extension: $ext"
+    echo "Assuming tarred, gzipped file"
+    tar_args="xvjf"
+  fi
+
+
+  echo tar $tar_args $package$version$ext 
+  tar $tar_args $package$version$ext
+
+  if [ $? != 0 ] ; then
+    echo "      Error encountered running *untar* stage of $progname"
+    exit 1
+  fi
+}
+
+opt_run_tarclean()
+{
+  local type=$1
+  local package=$2
+  local version=$3
+
+  if [ $type = "1" ] ; then
+
+    local dir=$package$version
+    if [ -d $dir ] ; then
+      echo /bin/rm -rf $dir
+      /bin/rm -rf $dir
+
+      if [ $? != 0 ] ; then
+        echo "      Error encountered running *tarclean* stage of $progname"
+        exit 1
+      fi
+    else 
+      echo "Unable to find directory $dir"
+    fi
+  fi
+}
+
+opt_run_untar()
+{
+  local force_untar=$1
+  local auto_untar=$2
+  local package=$3
+  local version=$4
+
+  local ext="";
+
+  if [ ! -z "$5" ] ; then
+    ext=$5
+  else 
+    ext=".tar.gz"
+  fi
+
+  if [ $force_untar = "1" ] ; then
+    run_untar $package $version $ext
+  elif [ $auto_config = "1" ] ; then
+    if [ -d $package$version ] ; then
+      echo "Found untarred version of $package$version$ext => no need to untar"
+    else
+      run_untar $package $version $ext
+    fi
+  fi
+}
+
+
+opt_run_configure()
+{
+  local force_config=$1
+  local auto_config=$2
+  local package=$3
+  local version=$4
+  local prefix=$5
+  local opt_args="";
+
+  if [ ! -z "$6" ] ; then
+    opt_args=$6
+  fi
+
+  if [ $force_config = "1" ] ; then
+    ( echo "[pushd $package$version]"
+      cd $package$version ; \
+      echo ./configure --prefix="$prefix" $opt_args ; \
+      ./configure --prefix="$prefix" $opt_args )
+      echo "[popd]"
+    if [ $? != 0 ] ; then
+        echo "      Error encountered running *configure* stage of $progname"
+        exit 1
+    fi
+  else
+    if [ $auto_config = "1" ] ; then
+      echo "Found top-level for ${progname%.*} => no need to run ./configure"
+    fi
+  fi
+}
+
+
+opt_run_make()
+{
+  local type=$1
+  local package=$2
+  local version=$3
+  local opt_target=""
+
+  if [ ! -z "$4" ] ; then
+    opt_target=$4
+  fi
+
+  if [ $type = "1" ] ; then
+    ( cd $package$version ; \
+      make $opt_target)
+
+    if [ $? != 0 ] ; then
+        echo "      Error encountered running *make $target* stage of $progname"
+        exit 1
+    fi
+  fi
+}
+
+
+
+force_untar=0
+auto_untar=0
+
+force_config=0
+auto_config=0
+
+compile=0
+install=0
+clean=0
+distclean=0
+tarclean=0
+
+if [ $# -gt 0 ] ; then
+  for cmd in $* ; do
+    echo $cmd
+    if   [ $cmd = "untar" ] ;     then force_untar=1
+    elif [ $cmd = "configure" ] ; then force_config=1
+    elif [ $cmd = "compile" ]   ; then compile=1
+    elif [ $cmd = "install" ]   ; then install=1  
+    elif [ $cmd = "clean" ]     ; then clean=1  
+    elif [ $cmd = "distclean" ] ; then distclean=1
+    elif [ $cmd = "tarclean" ] ;  then tarclean=1
+    fi
+  done
+else
+  # defaults
+  auto_untar=1
+  auto_config=1
+  compile=1
+  install=1
+  clean=0
+  distclean=0
+  tarclean=0
+fi
+
+if [ $auto_config = "1" ] ; then
+  if [ ! -e $package$version/Makefile ] ; then
+    force_config=1
+  fi
+fi
+
Index: /main/tags/2.85/gs2-extensions/ocr/trunk/packages/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/ocr/trunk/packages/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/ocr/trunk/packages/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+
+for d in devel cmdline ; do
+  echo "  Running $d/CASCADE-MAKE.sh $*"
+
+  (cd $d ; ./CASCADE-MAKE.sh $*)
+
+  if [ $? != 0 ] ; then
+    echo "  Error encountered running $d/CASCADE-COMPILE.sh"
+    exit 1
+  fi
+done
Index: /main/tags/2.85/gs2-extensions/ocr/trunk/packages/cmdline/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/ocr/trunk/packages/cmdline/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/ocr/trunk/packages/cmdline/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+if [ ! -d "$GEXTOCR_INSTALLED/cmdline" ] ; then
+  echo "    Making directory \"$GEXTOCR_INSTALLED/cmdline\""
+  mkdir "$GEXTOCR_INSTALLED/cmdline"
+fi
+
+
+for d in LIBTIFF TESSERACT LIBPNG LIBJPEG OCROPUS ; do
+  echo "    Running CASCADE-MAKE/$d.sh $*"
+
+  ./CASCADE-MAKE/$d.sh $*
+
+  if [ $? != 0 ] ; then
+    echo "    Error encountered running CASCADE-COMPILE/$d.sh"
+    exit 1
+  fi
+done
Index: /main/tags/2.85/gs2-extensions/ocr/trunk/packages/cmdline/CASCADE-MAKE/LIBJPEG.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/ocr/trunk/packages/cmdline/CASCADE-MAKE/LIBJPEG.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/ocr/trunk/packages/cmdline/CASCADE-MAKE/LIBJPEG.sh	(revision 24799)
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+package=jpeg
+version=-6b
+
+progname=$0
+
+source ../../bin/script/test-setup.bash
+source ../../lib/cascade-lib.bash
+
+prefix=$GEXTOCR_INSTALLED/cmdline
+
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version "$prefix" \
+        --enable-static
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install-lib"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
Index: /main/tags/2.85/gs2-extensions/ocr/trunk/packages/cmdline/CASCADE-MAKE/LIBPNG.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/ocr/trunk/packages/cmdline/CASCADE-MAKE/LIBPNG.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/ocr/trunk/packages/cmdline/CASCADE-MAKE/LIBPNG.sh	(revision 24799)
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+package=libpng
+version=-1.2.29
+
+progname=$0
+
+source ../../bin/script/test-setup.bash
+source ../../lib/cascade-lib.bash
+
+prefix=$GEXTOCR_INSTALLED/cmdline
+
+opt_run_untar $force_untar $auto_untar $package $version 
+opt_run_configure $force_config $auto_config $package $version "$prefix"
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
+
Index: /main/tags/2.85/gs2-extensions/ocr/trunk/packages/cmdline/CASCADE-MAKE/LIBTIFF.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/ocr/trunk/packages/cmdline/CASCADE-MAKE/LIBTIFF.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/ocr/trunk/packages/cmdline/CASCADE-MAKE/LIBTIFF.sh	(revision 24799)
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+package=tiff
+version=-3.8.2
+
+progname=$0
+
+source ../../bin/script/test-setup.bash
+source ../../lib/cascade-lib.bash
+
+prefix=$GEXTOCR_INSTALLED/cmdline
+
+opt_run_untar $force_untar $auto_untar $package $version 
+opt_run_configure $force_config $auto_config $package $version "$prefix"
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
+
Index: /main/tags/2.85/gs2-extensions/ocr/trunk/packages/cmdline/CASCADE-MAKE/OCROPUS.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/ocr/trunk/packages/cmdline/CASCADE-MAKE/OCROPUS.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/ocr/trunk/packages/cmdline/CASCADE-MAKE/OCROPUS.sh	(revision 24799)
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+package=ocropus
+version=-0.2
+
+progname=$0
+
+source ../../bin/script/test-setup.bash
+source ../../lib/cascade-lib.bash
+
+prefix=$GEXTOCR_INSTALLED/cmdline
+
+opt_run_untar $force_untar $auto_untar $package $version 
+opt_run_configure $force_config $auto_config $package $version "$prefix" \
+    "--with-tesseract=$prefix \
+     CFLAGS=-I$prefix/include \
+     CXXFLAGS=-I$prefix/include \
+     CPPFLAGS=-I$prefix/include \
+     LDFLAGS=-L$prefix/lib"
+
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
+
Index: /main/tags/2.85/gs2-extensions/ocr/trunk/packages/cmdline/CASCADE-MAKE/TESSERACT.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/ocr/trunk/packages/cmdline/CASCADE-MAKE/TESSERACT.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/ocr/trunk/packages/cmdline/CASCADE-MAKE/TESSERACT.sh	(revision 24799)
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+package=tesseract
+version=-svn
+
+progname=$0
+
+source ../../bin/script/test-setup.bash
+source ../../lib/cascade-lib.bash
+
+prefix=$GEXTOCR_INSTALLED/cmdline
+
+opt_run_untar $force_untar $auto_untar $package $version 
+opt_run_configure $force_config $auto_config $package $version "$prefix" \
+  --with-libtif=$prefix
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
+
Index: /main/tags/2.85/gs2-extensions/ocr/trunk/packages/devel/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/ocr/trunk/packages/devel/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/ocr/trunk/packages/devel/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,19 @@
+#!/bin/bash
+
+
+if [ ! -d "$GEXTOCR_INSTALLED/devel" ] ; then
+  echo "Making directory \"$GEXTOCR_INSTALLED/devel\""
+  mkdir "$GEXTOCR_INSTALLED/devel"
+fi
+
+
+for d in FTJAM ; do
+  echo "    Running CASCADE-MAKE/$d.sh $*"
+
+  ./CASCADE-MAKE/$d.sh $*
+
+  if [ $? != 0 ] ; then
+    echo "  Error encountered running CASCADE-COMPILE/$d.sh"
+    exit 1
+  fi
+done
Index: /main/tags/2.85/gs2-extensions/ocr/trunk/packages/devel/CASCADE-MAKE/FTJAM.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/ocr/trunk/packages/devel/CASCADE-MAKE/FTJAM.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/ocr/trunk/packages/devel/CASCADE-MAKE/FTJAM.sh	(revision 24799)
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+package=ftjam
+version=-2.5.2
+
+progname=$0
+
+source ../../bin/script/test-setup.bash
+source ../../lib/cascade-lib.bash
+
+prefix=$GEXTOCR_INSTALLED/devel
+
+opt_run_untar $force_untar $auto_untar $package $version 
+opt_run_configure $force_config $auto_config $package $version "$prefix"
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
+
Index: /main/tags/2.85/gs2-extensions/ocr/trunk/setup.bash
===================================================================
--- /main/tags/2.85/gs2-extensions/ocr/trunk/setup.bash	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/ocr/trunk/setup.bash	(revision 24799)
@@ -0,0 +1,35 @@
+
+extdesc="the Optical Character Recognition (OCR) Extension"
+
+if [ "x$GEXTOCR" = "x" ] ; then
+  export GEXTOCR=`pwd`
+  export GEXTOCR_INSTALLED=$GEXTOCR/installed
+
+  export PATH=$GEXTOCR_INSTALLED/cmdline/bin:$PATH
+
+  # Needed for running tesseract
+  export TESSDATA_PREFIX=$GEXTOCR_INSTALLED/cmdline/share/
+
+
+  if [ "x$LD_LIBRARY_PATH" = "x" ] ; then
+    export LD_LIBRARY_PATH=$GEXTOCR_INSTALLED/cmdline/lib
+  else
+    export LD_LIBRARY_PATH=$GEXTOCR_INSTALLED/cmdline/lib:$LD_LIBRARY_PATH
+  fi
+
+  if [ "x$GSDLEXTS" = "x" ] ; then
+    export GSDLEXTS=ocr
+  else 
+    export GSDLEXTS=$GSDLEXTS:ocr
+  fi
+
+
+  echo "+Your environment is now setup for $extdesc to Greenstone"
+else
+  echo "+Your environment is already setup for $extdesc to Greenstone"
+fi
+
+
+if [ -e devel.bash ] ; then
+  source devel.bash
+fi
Index: /main/tags/2.85/gs2-extensions/open-office/trunk/src/COMPILE-INSTALL.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/open-office/trunk/src/COMPILE-INSTALL.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/open-office/trunk/src/COMPILE-INSTALL.sh	(revision 24799)
@@ -0,0 +1,40 @@
+#!/bin/bash
+
+source setup.bash
+
+export JOD_CONVERTER=jodconverter-core-3.0-beta-3
+
+if [ "x$GEXT_OPENOFFICE" != "x" ] ; then
+
+  javac -version
+  if [ $? != 0 ] ; then
+    echo "Unable to locate 'javac'"
+    echo "Have you set JAVA_HOME and put JAVA_HOME/bin in your path?"
+    echo "Note, this requires Java 1.5 or greater."
+    exit
+  fi
+
+  echo Compiling Code
+
+  pushd "$GEXT_OPENOFFICE/build-srcpack/packages" 
+
+  ./COMPILE-INSTALL.sh 
+
+  popd
+
+  if [ ! -d lib/java ] ; then
+    echo ""
+    echo "Creating lib/java"
+    mkdir -p lib/java
+  fi
+
+  echo ""
+  echo "Installing jodconverter.jar into lib/java"
+  /bin/cp -r $GEXT_OPENOFFICE/build-srcpack/packages/$JOD_CONVERTER/jodconverter.jar lib/java/.
+  /bin/cp -r $GEXT_OPENOFFICE/build-srcpack/packages/$JOD_CONVERTER/lib lib/java/.
+
+
+else 
+  echo "Error: Environment variable GEXT_OPENOFICE is not set"
+fi
+
Index: /main/tags/2.85/gs2-extensions/open-office/trunk/src/README.txt
===================================================================
--- /main/tags/2.85/gs2-extensions/open-office/trunk/src/README.txt	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/open-office/trunk/src/README.txt	(revision 24799)
@@ -0,0 +1,6 @@
+Use java 1.5 or greater.
+
+Run ./COMPILE-INSTALL.sh
+
+
+
Index: /main/tags/2.85/gs2-extensions/open-office/trunk/src/RUN.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/open-office/trunk/src/RUN.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/open-office/trunk/src/RUN.sh	(revision 24799)
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+which cygpath >/dev/null 2>&1
+
+if [ $? = "0" ] ; then
+  # Running on Cygwin
+  java -jar lib\\java\\jodconverter.jar $*
+else
+  java -jar lib/java/jodconverter.jar $*
+fi
+
+
+
Index: /main/tags/2.85/gs2-extensions/open-office/trunk/src/START-UP.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/open-office/trunk/src/START-UP.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/open-office/trunk/src/START-UP.sh	(revision 24799)
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+which soffice >/dev/null 2>&1 
+if [ $? = 0 ] ; then
+
+  echo "Starting up Open Office Server (headless mode)"
+
+  soffice "-accept=socket,host=localhost,port=8100;urp;StarOffice.ServiceManager" -headless
+
+  echo "Testing to see if soffice is listening on port 8100"
+
+  netstat -an | grep 8100
+else 
+  echo ""
+  echo "Error: Unable to find 'soffice' on PATH environment variable"
+  echo ""
+fi
+
+
+
Index: /main/tags/2.85/gs2-extensions/open-office/trunk/src/bin/script/oo2html
===================================================================
--- /main/tags/2.85/gs2-extensions/open-office/trunk/src/bin/script/oo2html	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/open-office/trunk/src/bin/script/oo2html	(revision 24799)
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+#java -jar $GEXT_OPENOFFICE/lib/java/jodconverter.jar $*
+java -jar $GEXT_OPENOFFICE/lib/java/jodconverter.jar "$1" "$2" 
Index: /main/tags/2.85/gs2-extensions/open-office/trunk/src/bin/script/oo2html.bat
===================================================================
--- /main/tags/2.85/gs2-extensions/open-office/trunk/src/bin/script/oo2html.bat	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/open-office/trunk/src/bin/script/oo2html.bat	(revision 24799)
@@ -0,0 +1,3 @@
+@echo off
+
+java -jar %GEXT_OPENOFFICE%\lib\java\jodconverter.jar %*
Index: /main/tags/2.85/gs2-extensions/open-office/trunk/src/build-srcpack/packages/COMPILE-INSTALL.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/open-office/trunk/src/build-srcpack/packages/COMPILE-INSTALL.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/open-office/trunk/src/build-srcpack/packages/COMPILE-INSTALL.sh	(revision 24799)
@@ -0,0 +1,36 @@
+#!/bin/bash
+
+source ../../cascade-make/lib/cascade-lib.bash GEXT_OPENOFFICE ../../ $*
+
+if [ ! -e "$JOD_CONVERTER" ] ; then
+  echo "Unzipping JodConverter Core"
+  unzip "$JOD_CONVERTER-dist.zip"
+
+  cd "$JOD_CONVERTER" \
+   && jar xvf "$JOD_CONVERTER-sources.jar" \
+   && cd ..
+fi
+
+
+cd "$JOD_CONVERTER"
+
+if [ $GSDLOS = "windows" ] ; then
+  # Running under Cygwin or MinGW/MSys
+  cp=`ls lib/*.jar | tr '\n' ';'`
+else
+  cp=`ls lib/*.jar | tr '\n' ':'`
+fi
+
+cp_with_spaces=`ls lib/*.jar | tr '\n' ' '`
+
+javac -classpath ".:$cp" org/artofsolving/jodconverter/cli/Convert.java \
+  && \
+echo "Manifest-Version: 1.0" > Manifest.txt && \
+echo "Created-By: Greenstone Digital Library Project" >> Manifest.txt && \
+echo "Main-Class: org.artofsolving.jodconverter.cli.Convert" >> Manifest.txt && \
+echo "Class-Path: $cp_with_spaces" >> Manifest.txt \
+ && \
+jar cvfm jodconverter.jar Manifest.txt org conf document-formats.js
+
+cd ..
+
Index: /main/tags/2.85/gs2-extensions/open-office/trunk/src/open-office-setup.pl
===================================================================
--- /main/tags/2.85/gs2-extensions/open-office/trunk/src/open-office-setup.pl	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/open-office/trunk/src/open-office-setup.pl	(revision 24799)
@@ -0,0 +1,56 @@
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    die "GSDLOS not set\n" unless defined $ENV{'GSDLOS'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib/cpan");
+}
+
+use Cwd;
+require util;    
+
+my $env_ext  = "GEXT_OPENOFFICE";
+my $ext_desc = "the Open Office Extension";
+
+if (!defined $ENV{$env_ext}) {
+    
+    my $ext_home = cwd();
+    $ENV{$env_ext} = $ext_home;
+
+    my $ext_bin_script = &util::filename_cat($ENV{$env_ext},"bin","script");    
+    if (-d $ext_bin_script) {
+	&util::envvar_prepend("PATH",$ext_bin_script);
+    }
+
+    if ($ENV{'GSDLOS'} =~ m/windows/i) {
+	$ENV{'GS_CP_SET'} = "yes";
+    }
+
+    my ($ext_dir,$_prefix_dir) = File::Basename::fileparse($ext_home);
+    # GSDLEXTS always uses : as a separator
+    if (defined $ENV{'GSDLEXTS'}) {
+	$ENV{'GSDLEXTS'} .= ":$ext_dir";
+    }
+    else {
+	$ENV{'GSDLEXTS'} = $ext_dir;
+    }
+    
+    print STDERR "+Your environment is now setup for $ext_desc\n";
+}
+else {    
+    print STDERR "+Your environment is already setup for $ext_desc\n";
+}
+
+if (scalar(@ARGV>0)) {
+
+    print STDERR "\n";
+
+    my $cmd = join(" ",map {$_ = "\"$_\""} @ARGV);
+
+    if (system($cmd)!=0) {
+	print STDERR "\nError: Failed to run '$cmd'\n";
+	print STDERR "$!\n";
+    }
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/open-office/trunk/src/perllib/plugins/OpenOfficeConverter.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/open-office/trunk/src/perllib/plugins/OpenOfficeConverter.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/open-office/trunk/src/perllib/plugins/OpenOfficeConverter.pm	(revision 24799)
@@ -0,0 +1,330 @@
+###########################################################################
+#
+# OpenOfficeConverter - helper plugin that does office document conversion 
+#                       using jodconverter combined with OpenOffice
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2010 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+package OpenOfficeConverter;
+
+use ConvertBinaryFile;
+use BaseMediaConverter;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+use gsprintf 'gsprintf';
+
+# these two variables mustn't be initialised here or they will get stuck 
+# at those values.
+our $openoffice_conversion_available; 
+our $no_openoffice_conversion_reason; 
+
+BEGIN {
+    @OpenOfficeConverter::ISA = ('BaseMediaConverter');
+
+    # Check that OpenOffice and jodconverter are installed and available on 
+    # the path 
+    $openoffice_conversion_available = 1;
+    $no_openoffice_conversion_reason = "";
+    
+    if (! defined $ENV{'GEXT_OPENOFFICE'}) {
+	$openoffice_conversion_available = 0;
+	$no_openoffice_conversion_reason = "gextopenofficenotinstalled";
+    }
+    else {
+	my $gextoo_home = $ENV{'GEXT_OPENOFFICE'};
+	my $jodjar = &util::filename_cat($gextoo_home,"lib","java","jodconverter.jar");
+
+	if (!-e $jodjar) {
+	    #print STDERR "Failed to find $jodjar\n";
+	    $openoffice_conversion_available = 0;
+	    $no_openoffice_conversion_reason = "gextjodconverternotinstalled";
+	}
+	else {
+	    # test to see if soffice is in path	    
+	    my $cmd = "soffice -headless 2>&1"; # for linux and mac
+	    my $status = 0;
+
+	    # The port that jodconverter uses to connect to soffice.
+	    # We set this to 8100 (else jodconverter would have used 
+	    # 2002 as the port number, which can clash with some programs
+	    # such as LogMeIn. Users can specify another port by setting
+	    # the environment variable in setup.bat or <ext>-setup.pl.
+	    if(!defined $ENV{'JODCONVERTER_PORT'}) {
+		$ENV{'JODCONVERTER_PORT'} = "8100";
+	    }
+
+	    if ($ENV{'GSDLOS'} =~ m/^windows$/) {		
+		if(!defined $ENV{'SOFFICE_HOST'}) {
+		    $ENV{'SOFFICE_HOST'} = "localhost";
+		}
+		if(!defined $ENV{'SOFFICE_PORT'}) {
+		    $ENV{'SOFFICE_PORT'} = "8200";
+		}
+		# important to have this set when the Greenstone server 
+		# and open office is on a remote windows machine
+		if(!defined $ENV{'SOFFICE_HOME'}) {
+		    $ENV{'SOFFICE_HOME'} = &util::filename_cat($ENV{'ProgramFiles'},"OpenOffice.org 3"); 
+		}
+		my $ooffice_dir_guess =
+		    &util::filename_cat($ENV{'SOFFICE_HOME'},"program");
+		if (-d  $ooffice_dir_guess) {
+		    &util::envvar_append("PATH",$ooffice_dir_guess);
+		}
+
+		# for windows, when working on a remote system, want to be able to start OO if
+		# not already running. We'll use the uno socket method to do so. Else client-gli
+		# tends to hang, waiting for the prompt to return after OO has been started up
+		# (which doesn't happen, so need to Ctrl-C GLI and run it again for it to work).
+		
+		# first need to silently check soffice exists else windows will display a popup
+		$status = system("which soffice >nul 2>&1"); # which.exe should be in bin/windows
+		if ($status == 0) {
+		    $cmd = "start \"soffice process\" soffice \"-accept=socket,host=$ENV{'SOFFICE_HOST'},port=$ENV{'SOFFICE_PORT'};urp;StarOffice.ServiceManager\" -headless 2>&1";
+		    $cmd .= " >nul";
+		    #print STDERR "***** Tried to start-up OpenOffice with:\n$cmd\n";		    
+		}
+		# else cmd is still undefined
+	    }
+	    else {
+		# Windows seems to launch OpenOffice as a service (i.e.
+		# automatically puts it in the background).  
+		# For Unix putting it in the background needs to be done 
+		# explicitly
+
+		$cmd .= " >/dev/null &";
+	    }
+	    
+	    $status = system($cmd) if ($status == 0);
+	    if ($status != 0) {
+		#print STDERR "Failed to run: $cmd\n";
+		#print STDERR "$!\n";
+		$openoffice_conversion_available = 0;
+		$no_openoffice_conversion_reason = "openofficenotinstalled";
+	    } 
+	}
+    }
+}
+
+my $arguments = [
+    { 'name' => "openoffice_port",
+      'desc' => "{OpenOfficeConverter.openoffice_port}",
+      'type' => "int",
+      'deft' => "8100",
+      'range' => "81,",
+      'reqd' => "no" },
+    ];
+
+
+my $options = { 'name' => "OpenOfficeConverter",
+		'desc' => "{OpenOfficeConverter.desc}",
+		'abstract' => "yes",
+		'inherits' => "yes",
+		'args' => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists,$auxilary) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new BaseMediaConverter($pluginlist, $inputargs, 
+				      $hashArgOptLists, $auxilary);
+
+    if ($self->{'info_only'}) {
+	# don't worry about any options etc
+	return bless $self, $class;
+    }
+    if (!$openoffice_conversion_available) {
+	$self->{'no_openoffice_conversion_reason'} = $no_openoffice_conversion_reason;
+
+	my $outhandle = $self->{'outhandle'};
+	&gsprintf($outhandle, "OpenOfficeConverter: {OpenOfficeConverter.noconversionavailable} ({OpenOfficeConverter.$no_openoffice_conversion_reason})\n");
+    }  
+
+    $self->{'openoffice_conversion_available'} = $openoffice_conversion_available;
+    
+    return bless $self, $class;
+
+}
+
+sub init {
+    my $self = shift(@_);
+    my ($verbosity, $outhandle, $failhandle) = @_;
+
+    if ($openoffice_conversion_available) {
+	my $oo_port = $self->{'openoffice_port'};
+
+	my $launch_cmd = "soffice";
+	$launch_cmd .= " \"-accept=socket,host=localhost,port=$oo_port;urp;StarOffice.ServiceManager\"";
+	$launch_cmd .= " -headless";
+	$self->{'openoffice_launch_cmd'} = $launch_cmd;
+    }
+
+    $self->{'ootmp_file_paths'} = ();
+}
+
+sub deinit {
+    my $self = shift(@_);
+
+    $self->clean_up_temporary_files();
+}
+
+
+sub convert {
+    my $self = shift(@_);
+    my $source_file_full_path = shift(@_);
+    my $target_file_type      = shift(@_);
+    my $convert_options       = shift(@_) || "";
+    my $convert_id            = shift(@_) || "";
+    my $cache_mode            = shift(@_) || "";
+
+    return (0,undef,undef) unless $openoffice_conversion_available;
+    # check the filename
+    return (0,undef,undef) if ( !-f $source_file_full_path);
+
+    my $outhandle = $self->{'outhandle'};
+    my $verbosity = $self->{'verbosity'};
+
+    my $source_file_no_path = &File::Basename::basename($source_file_full_path);
+    # Determine the full name and path of the output file
+    my $target_file_path;
+    if ($self->{'enable_cache'}) {
+	$self->init_cache_for_file($source_file_full_path);
+	my $cache_dir = $self->{'cached_dir'};
+	my $file_root = $self->{'cached_file_root'};
+	$file_root .= "_$convert_id" if ($convert_id ne "");
+	my $target_file = "$file_root.$target_file_type";
+	$target_file_path = &util::filename_cat($cache_dir,$target_file);
+    }
+    else {
+	$target_file_path = &util::get_timestamped_tmp_filename_in_collection($source_file_full_path, $target_file_type);
+	push(@{$self->{'ootmp_file_paths'}}, $target_file_path);
+    }
+
+    # Generate and run the convert command
+
+    my $gextoo_home = $ENV{'GEXT_OPENOFFICE'};
+    my $jodjar = &util::filename_cat($gextoo_home,"lib","java","jodconverter.jar");
+
+    # debugging: print out all the env vars, when import's verbosity is high
+    #foreach my $key (sort(keys %ENV)) {
+    #	print $outhandle "$key = $ENV{$key}\n";
+    #}
+
+#    *If* SOFFICE_HOME\program was not added to the PATH, *another* way is to insert: 
+#    -Doffice.home=C:\\PROGRA~1\\OPENOF~1.ORG
+#    into the command to launch jodconverter so that, when using the remote GS server
+#    on Windows, jodconverter can find the openoffice installation: 
+
+    my $office_short_path;
+    if(defined $ENV{'SOFFICE_HOME'}) { # points to libreoffice or openoffice, since soffice launches both
+	if ($ENV{'GSDLOS'} =~ m/^windows$/) {
+	    $office_short_path = Win32::GetShortPathName($ENV{'SOFFICE_HOME'});
+	} else {
+	    $office_short_path = $ENV{'SOFFICE_HOME'};
+	}
+    } 
+    else { # SOFFICE_HOME not user-defined, try defaults
+	if ($ENV{'GSDLOS'} =~ m/^windows$/) {
+	    $office_short_path = "C:\\PROGRA~1\\OPENOF~1.ORG";
+	} else {
+	    if (-d "/usr/lib/libreoffice") { # try libreoffice first
+		$office_short_path = "/usr/lib/libreoffice";
+	    } elsif (-d "/usr/lib/openoffice") { # perhaps it's more likely that openoffice exists (fallback)
+		$office_short_path = "/usr/lib/openoffice";
+	    } else { # set to default linux officeHome which jodconverter tries for
+		$office_short_path = "/opt/openoffice.org3";
+	    }
+	}
+    }
+
+    # jodjar always assumes that soffice (officeHome) is in "C:\Prog Files\OpenOffice org 3"
+    # or "/opt/openoffice.org3" rather than checking for any user-defined SOFFICE_HOME var. 
+    # Therefore, we run jodjar with the -Doffice.home flag explicitly set, instead of without.
+    # my $convert_cmd = "java -jar \"$jodjar\" --port $ENV{'JODCONVERTER_PORT'}";
+    my $convert_cmd = "java -Doffice.home=\"".$office_short_path."\" -jar \"$jodjar\" --port $ENV{'JODCONVERTER_PORT'}";
+    $convert_cmd .= " \"$source_file_full_path\" \"$target_file_path\"";
+
+    if ($verbosity>2) {
+	print $outhandle "Convert command: $convert_cmd\n";
+    }
+
+    my $print_info = { 'message_prefix' => "OpenOffice Conversion",
+		       'message' => "Converting $source_file_no_path to: $target_file_type" };
+    $print_info->{'cache_mode'} = $cache_mode if ($cache_mode ne "");
+
+    my ($regenerated,$result,$had_error) 
+	= $self->autorun_general_cmd($convert_cmd,$source_file_full_path, $target_file_path,$print_info);
+    if ($had_error) {
+	return (0, $result,$target_file_path);
+    }
+    return (1, $result,$target_file_path);
+}
+
+
+sub convert_without_result {
+    my $self = shift(@_);
+
+    my $source_file_path = shift(@_);
+    my $target_file_type = shift(@_);
+    my $convert_options  = shift(@_) || "";
+    my $convert_id       = shift(@_) || "";
+
+    return $self->convert($source_file_path,$target_file_type,
+			  $convert_options,$convert_id,"without_result");
+}
+
+
+sub tmp_area_convert_fileXX {
+    my $self = shift (@_);
+    my ($output_ext, $input_filename, $textref) = @_;
+    
+    my $outhandle = $self->{'outhandle'};
+    my $convert_to = $self->{'convert_to'};
+    my $failhandle = $self->{'failhandle'};
+    my $convert_to_ext = $self->{'convert_to_ext'};
+    
+    # derive tmp filename from input filename
+    my ($tailname, $dirname, $suffix)
+	= &File::Basename::fileparse($input_filename, "\\.[^\\.]+\$");
+}
+
+
+sub clean_up_temporary_files {
+    my $self = shift(@_);
+
+    foreach my $ootmp_file_path (@{$self->{'ootmp_file_paths'}}) {
+	if (-e $ootmp_file_path) {
+	    &util::rm($ootmp_file_path);
+	}
+    }
+
+    $self->{'ootmp_file_paths'} = ();
+}
+
+
+
+1;	
Index: /main/tags/2.85/gs2-extensions/open-office/trunk/src/perllib/plugins/OpenOfficePlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/open-office/trunk/src/perllib/plugins/OpenOfficePlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/open-office/trunk/src/perllib/plugins/OpenOfficePlugin.pm	(revision 24799)
@@ -0,0 +1,248 @@
+###########################################################################
+#
+# OpenOfficePlugin.pm -- for processing standalone images
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package OpenOfficePlugin;
+
+use ConvertBinaryFile;
+use OpenOfficeConverter;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+no strict 'subs';
+
+use gsprintf 'gsprintf';
+
+sub BEGIN {
+    @OpenOfficePlugin::ISA = ('ConvertBinaryFile', 'OpenOfficeConverter');
+}
+
+my $word_pe = "doc|dot|docx|odt|wpd";
+my $rtf_pe = "rtf";
+my $ppt_pe = "ppt|pptx|odp";
+my $xls_pe = "xls|xlsx|ods";
+
+my $arguments =
+    [ { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'deft' => &get_default_process_exp(),
+	'reqd' => "no" },
+      ];
+
+# This is not quite fully functional, eg doesn't do proper PowerPoint processing. So I have made it hidden in gli for now.
+my $options = { 'name'     => "OpenOfficePlugin",
+		'desc'     => "{OpenOfficePlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'hiddengli' => "yes",
+		'args'     => $arguments };
+
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    
+    my $ooc_self = new OpenOfficeConverter($pluginlist, $inputargs, $hashArgOptLists);
+    my $cbf_self = new ConvertBinaryFile($pluginlist, $inputargs, $hashArgOptLists);
+
+    my $self = BasePlugin::merge_inheritance($ooc_self, $cbf_self);
+
+    if ($self->{'info_only'}) {
+	# don't worry about any options etc
+	return bless $self, $class;
+    }
+    if ($OpenOfficeConverter::openoffice_conversion_available) {
+	$self->{'openoffice_ext_working'} = 1;
+    }
+    else {
+	$self->{'openoffice_ext_working'} = 0;
+    }
+    $self->{'convert_to'} = "structuredhtml";
+
+    $self = bless $self, $class;
+
+    # set convert_to_plugin and convert_to_ext
+    $self->set_standard_convert_settings();
+
+    # set up appropriate secondary plugin options here!!! 
+    my $secondary_plugin_name = $self->{'convert_to_plugin'};
+    my $secondary_plugin_options = $self->{'secondary_plugin_options'};
+
+    if (!defined $secondary_plugin_options->{$secondary_plugin_name}) {
+	$secondary_plugin_options->{$secondary_plugin_name} = [];
+    }
+    my $specific_options = $secondary_plugin_options->{$secondary_plugin_name};
+
+    $self->load_secondary_plugins($class,$secondary_plugin_options,$hashArgOptLists);
+
+    return $self;
+}
+
+sub init {
+    my $self = shift (@_);
+    my ($verbosity, $outhandle, $failhandle) = @_;
+
+    $self->SUPER::init(@_);
+    $self->OpenOfficeConverter::init();
+}
+
+sub begin {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $processor, $maxdocs) = @_;
+
+    $self->SUPER::begin(@_);
+    $self->OpenOfficeConverter::begin(@_);
+}
+
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+    return "(?i)\.($word_pe|$ppt_pe|$rtf_pe|$xls_pe)\$";
+}
+
+
+sub read_into_doc_obj {
+    my $self = shift (@_);  
+    my ($pluginfo, $base_dir, $file, $block_hash, $metadata, $processor, $maxdocs, $total_count, $gli) = @_;
+    
+    if (!$self->{'openoffice_ext_working'}) {
+	# use BasePlugin version to set up the doc obj, then we will do a little bit more in process
+	return $self->BasePlugin::read_into_doc_obj(@_);
+    }
+    # use convertbinaryfile version, will call tmp_area_convert_file and use 
+    # secondary plugins
+    return $self->ConvertBinaryFile::read_into_doc_obj(@_);
+
+}
+
+# override this to use our own convert method
+sub tmp_area_convert_file {
+    my $self = shift (@_);
+    my ($output_ext, $input_filename, $textref) = @_;
+
+    my ($result, $result_str, $new_filename) = $self->OpenOfficeConverter::convert($input_filename, $output_ext);
+    if ($result != 0) {
+	return $new_filename;
+    }
+    my $outhandle=$self->{'outhandle'};
+    print $outhandle "Open Office Conversion error\n";
+    print $outhandle $result_str;
+    return "";
+}
+
+# first return value is used in _iconxx_ to give a srcicon, 
+# second return value is used for FileFormat metadata
+sub get_file_type_from_extension {
+    my $self = shift (@_);
+    my ($file) = @_;
+
+    #check against the various bit of process_exp
+    if ($file =~ /$word_pe/) {
+	return ("doc", "Word");
+    }
+    if ($file =~ /$ppt_pe/) {
+	return ("ppt", "PPT");
+    }
+    if ($file =~ /$xls_pe/) {
+	return ("xls", "Excel");
+    }
+    if ($file =~ /$rtf_pe/) {
+	return ("rtf", "RTF");
+    }
+    
+    return ("unknown", "Unknown");
+}
+
+
+sub process {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+
+    my $cursection = $doc_obj->get_top_section();
+    
+    # store original file as associated file
+    my $filename = &util::filename_cat($base_dir, $file);
+    my $assocfilename = $doc_obj->get_assocfile_from_sourcefile();
+    $doc_obj->associate_file($filename, $assocfilename, undef, $cursection);
+
+    my ($ext, $format) = $self->get_file_type_from_extension($file);
+    # overwrite the one set by secondary plugin
+    $doc_obj->set_utf8_metadata_element($cursection, "FileFormat", $format);
+
+    $doc_obj->add_utf8_metadata ($cursection, "srclink_file", "[SourceFile]");
+    $doc_obj->add_utf8_metadata ($cursection, "srcicon",  "_icon".$ext."_"); 	
+    # if oo conversion not available, we have no text, so add some
+    if (!$self->{'openoffice_ext_working'}) {
+	if ($gli) {
+	    &gsprintf(STDERR, "<Warning p='openOfficePlugin' r='{OpenOfficeConverter.noconversionavailable}: {OpenOfficeConverter.".$self->{'no_openoffice_conversion_reason'}."}'>");
+	}
+	print STDERR "OpenOfficePlugin: no conversion available, just adding $file as is\n";
+	#we have no text - adds dummy text and NoText metadata
+	$self->add_dummy_text($doc_obj, $doc_obj->get_top_section());
+	
+    }
+}
+
+sub process_old {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+    # old from here
+   # need to check that not empty
+    my $doc_ext = $self->{'filename_extension'};
+    my $file_type = "unknown";
+    $file_type = $self->{'file_type'} if defined $self->{'file_type'};
+    
+    # associate original file with doc object
+    my $cursection = $doc_obj->get_top_section();
+    my $filename = &util::filename_cat($base_dir, $file);
+    my $assocfilename = "doc.$doc_ext";
+    if ($self->{'keep_original_filename'} == 1) {
+	# this should be the same filename that was used for the Source and SourceFile metadata, 
+	# as we will use [SourceFile] in the srclink
+	$assocfilename = $doc_obj->get_assocfile_from_sourcefile();
+    }
+    $doc_obj->associate_file($filename, $assocfilename, undef, $cursection);
+
+    # We use set instead of add here because we only want one value
+    $doc_obj->set_utf8_metadata_element($cursection, "FileFormat", $file_type);
+    my $srclink_filename = "doc.$doc_ext";
+    #my $doclink = "<a href=\"_httpprefix_/collect/[collection]/index/assoc/[assocfilepath]/doc.$doc_ext\">";
+    if ($self->{'keep_original_filename'} == 1) {
+	$srclink_filename = "[SourceFile]";
+	#$doclink = "<a href=\"_httpprefix_/collect/[collection]/index/assoc/[assocfilepath]/[SourceFile]\">";
+    }
+    #$doc_obj->add_utf8_metadata ($cursection, "srclink",  $doclink); 
+    $doc_obj->add_utf8_metadata ($cursection, "srcicon",  "_icon".$doc_ext."_"); 
+    #$doc_obj->add_utf8_metadata ($cursection, "/srclink", "</a>"); 
+    $doc_obj->add_utf8_metadata ($cursection, "srclink_file", $srclink_filename);
+    return 1;
+
+}
Index: /main/tags/2.85/gs2-extensions/open-office/trunk/src/perllib/strings.properties
===================================================================
--- /main/tags/2.85/gs2-extensions/open-office/trunk/src/perllib/strings.properties	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/open-office/trunk/src/perllib/strings.properties	(revision 24799)
@@ -0,0 +1,20 @@
+#
+# Resource bundle description
+#
+
+Language.code:en
+Language.name:English
+
+OutputEncoding.unix:iso_8859_1
+OutputEncoding.windows:iso_8859_1
+
+OpenOfficeConverter.desc:Converter plugin that runs Open Office to convert various source documents to HTML.
+OpenOfficeConverter.noconversionavailable:OpenOffice Conversion is not available: 
+
+OpenOfficeConverter.gextopenofficenotinstalled:Greenstone's Open Office extension not installed.
+OpenOfficeConverter.gextjodconverternotinstalled:Jod Converter (part of Greenstone's Open Office extension) not installed.
+OpenOfficeConverter.openofficenotinstalled:Open Office not installed.
+OpenOfficeConverter.openoffice_port:Port number for...
+OpenOfficeConverter.openoffice_conversion:Use Open Office to convert the documents.
+
+OpenOfficePlugin.desc:Top level plugin that uses Open Office to convert various types of documents.
Index: /main/tags/2.85/gs2-extensions/open-office/trunk/src/setup.bash
===================================================================
--- /main/tags/2.85/gs2-extensions/open-office/trunk/src/setup.bash	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/open-office/trunk/src/setup.bash	(revision 24799)
@@ -0,0 +1,25 @@
+
+extdesc="the Open Office Extension"
+
+full_setup=`pwd`/${BASH_SOURCE}
+fulldir=${full_setup%/*}
+fulldir=${fulldir%/.}
+
+if [ "x$GEXT_OPENOFFICE" = "x" ] ; then
+  export GEXT_OPENOFFICE=`pwd`
+
+  export PATH=$GEXT_OPENOFFICE/bin/script:$PATH
+
+  extdir=${GEXT_OPENOFFICE##*/}
+
+  if [ "x$GSDLEXTS" = "x" ] ; then
+    export GSDLEXTS=$extdir
+  else 
+    export GSDLEXTS=$GSDLEXTS:$extdir
+  fi
+
+
+  echo "+Your environment is now setup for $extdesc"
+else
+  echo "+Your environment is already setup for $extdesc"
+fi
Index: /main/tags/2.85/gs2-extensions/open-office/trunk/src/setup.bat
===================================================================
--- /main/tags/2.85/gs2-extensions/open-office/trunk/src/setup.bat	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/open-office/trunk/src/setup.bat	(revision 24799)
@@ -0,0 +1,72 @@
+@echo off
+pushd "%CD%"
+CD /D "%~dp0"
+
+:: Edit and uncomment the following environment variables if you want to customise the 
+:: location of your OpenOffice installation or what host or port it should be run with.
+:: You can also set the port that jodconverter uses to connect to OpenOffice.
+:: If this is (also) a remote Greenstone server, you will (also) want to edit the file
+:: gsdlsite.cfg in your Greenstone installation's cgi-bin folder.
+
+:: set SOFFICE_HOME=C:\Program Files\OpenOffice.org 3\program
+:: set SOFFICE_HOST=localhost
+:: set SOFFICE_PORT=8200
+:: set JODCONVERTER_PORT=8100
+
+
+set extdesc=the OpenOffice Extension
+
+if "%OS%" == "Windows_NT" goto WinNT
+if "%OS%" == "" goto Win95
+if "%GSDLLANG%" == "en" echo Setup failed - your PATH has not been set
+if "%GSDLLANG%" == "es" echo No se pudo realizar la configuraci¢n - no se ha establecido la RUTA.
+if "%GSDLLANG%" == "fr" echo Echc de l'installation - votre variable PATH n'a pas t ajuste
+if "%GSDLLANG%" == "ru" echo áâ ­®¢ª  ­¥ ã€ « áì -  ­¥ ¡ë« ãáâ ­®¢«¥­
+goto End
+
+:WinNT
+set GEXT_OPENOFFICE=%CD%
+set PATH=%GEXT_OPENOFFICE%\bin\script;%PATH%
+set GS_CP_SET=yes
+goto Success
+
+:Win95
+if "%1" == "SetEnv" goto Win95Env
+REM We'll invoke a second copy of the command processor to make
+REM sure there's enough environment space
+COMMAND /E:2048 /K %0 SetEnv
+goto End
+
+:Win95Env
+set GEXT_OPENOFFICE=%CD%
+set PATH="%GEXT_OPENOFFICE%\bin\script";"%PATH%"
+set GS_CP_SET=yes
+goto Success
+
+:Success
+
+set fulldir=%~dp0
+
+:: strip off everything up to (and including) ext dir
+set extdir=%fulldir:*ext\=%
+
+:: remove trailing slash
+set extdir=%extdir:\=%
+
+setlocal enabledelayedexpansion
+if "x%GSDLEXTS%" == "x" (
+  set GSDLEXTS=!extdir!
+) else (
+  set GSDLEXTS=!GSDLEXTS!:!extdir!
+)
+endlocal & set GSDLEXTS=%GSDLEXTS%
+
+echo +Your environment is now setup for %extdesc%
+
+:: Back to delayed expansion to avoid problems with environment
+:: variables with brackets in them, such as "Program Files (x86)"
+
+
+:End
+
+popd
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/.svnignore
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/.svnignore	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/.svnignore	(revision 24799)
@@ -0,0 +1,3 @@
+darwin
+linux
+windows
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+source devel.bash
+
+for d in packages src ; do
+  echo "Running $d/CASCADE-MAKE.sh"
+
+  (cd $d ; ./CASCADE-MAKE.sh $*)
+
+  if [ $? != 0 ] ; then
+    echo "Error encountered running $d/CASCADE-MAKE.sh"
+    exit 1
+  fi
+done
+
+if [ $makedist = "1" ] ; then
+  default_toplevel_make_dist $GSDLOS
+fi
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/README.txt
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/README.txt	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/README.txt	(revision 24799)
@@ -0,0 +1,72 @@
+===== Overview =====
+
+Building tools (matching the import and buildcol phases of Greenstone) that make use of the OpenMPI library to provide flexible parallel processing capabilities to Greenstone.
+
+==== Import ====
+
+Currently the import tool is quite basic and essentially splits the collection up into fixed sized batches, processing each with a separate processor.
+
+==== Buildcol ====
+
+Meanwhile the buildcol tool is slightly more complex, as it lets Greenstone Perl code create a XML 'recipe' describing the collection build process and any precedence requirements, and then obeys this recipe farming out parallizable parts of the collection build to separate processes as possible.
+
+===== Requirements =====
+
+Requires the GS2-Extension "tdb-edit" to be installed, compiled and enabled, in order to allow multiple parallel readers/writers to access key datastore/base files (such as the archive-inf databases).
+
+==== Supported InfoDBs ====
+
+The "tdb-edit" extension was create specifically for parallel building, so is 100% percent compatible. Included in this extension are versions of the GDBM tools txt2db and db2txt (named txt2dbl and db2txtl respectively) that use simple file locking to allow (albeit not as efficiently) parallel readers/writers. SQLite is currently not supported (see below). No other infodb types currently supported.
+
+=== GDBM ===
+
+*NEW* GDBM support is now available through the 'gdbmserver' database driver. This makes use of a GDBMCLI called via daemonized server (so the Greenstone processes become clients in a client/server model). This not only allows GDBM databases in parallel building, but will also improve serial building as it reduces the number of GDBM database open/closes from 1-2 per document in the build process to 1-2 per build process (obviously the gain won't be huge with 10 documents, especially with the extra cost of starting and waiting, and stopping and waiting the GDBMServers, but on one million documents that difference is significant).
+
+The GDBMServer class requires to non-standard CPAN packages, namely IPC::Run and Proc::Daemon. I've included the source for these in the packages folder, but for now compiling them is a manual process (go to packages, extract, go to folder, run "perl Makefile.pl PREFIX=$GEXTPARALLELBUILDING", make, then make install).
+
+There are logs dropped in the logs directory, but good luck with making heads or tails of them in a parallel building context (even with write buffering/synchronization the server communications are going to be all jumbled up).
+
+=== SQLite ===
+
+The SQLite (3.6.23.1) included in circa 2.84 Greenstone, while allowing multiple readers and one active writer with using the CLI, does not support parallel writers. Any attempt to use the CLI to write to a database table already opened exclusive by another writer results in a "Error: database is locked" being thrown in the sqlite library and the write being ignored.
+
+I can see two possible ways to work around this. The first, and I guess preferred, is to move away from using the CLI and instead use native Perl DBI/DBD. By doing so we can listen for, and react appropriately to, SQLITE_BUSY errors (by waiting then retrying). We could even, conceivably, implement some locking schema similar to HS's changes to GDBM. There may even be versions of the SQLite DBD (OpenPGK?) that allow you to specify that writes *must* succeed and to try infinitely until they do.
+
+As an alternative, I tried to upgrade to the latest version of SQLite (3.7.8) which includes a new feature called Write Ahead Logging. Presumably this feature allows multiple writers on a single database - so sounded perfect for our purpose. However, in practice, there still appears to be locking issues - with the occasional import/build throwing one or more of these errors:
+
+* Error: database is locked
+* Use of uninitialized value $filenames[0] in join or string at /research/jmt12/gsdl-64-svn/ext/parallel-building/perllib/util.pm line 860.
+* Unexpected EOF in "bitio_m_stdio.cpp" on line 22[1316641505][Worker2] complete
+
+All subsequent builds (presumably on a now corrupt archives directory) without a successful import produce garbage. I include the SQLite source in the packages folder for anyone who wants to try and figure out why.
+
+Meanwhile I've added a sanity test to buildcol.pl that explicitly ignores -parallel if infodb type is sqlite (and prints out a warning about doing so).
+
+===== bin/script and perllib =====
+
+In order to try and make this compatible with the latest advances in the main trunk (so not the 64bit version I've been testing on), I've implemented the parallel building using a SVN head version of import.pl, buildcol.pl and perllib. I'll try to keep a list of the files I've changed here to aid in merging this code back into Greenstone:
+
+* bin/script/buildcol.pl: extended with a -parallel argument and the code to use it (basically, call builder methods to construct a 'recipe' of how the build should proceed, and then call mpibuilder with the recipe to do that actual build!)
+
+* perllib/IncrementalBuildTools.pm: made modifying the INC conditional on the paths not already existing in INC - otherwise all our clever INC building to support extensions is clobbered. Similar change for modifying the PATH.
+* perllib/basebuilder.pm: adding indexlevel variable to build_indexes() function (although it doesn't do anything in base) and also added dummy prepare_build_recipe() function that just complaining that inheriting class should implement.
+* perllib/classify.pm: modified classifier loader to use @INC rather than hardcoded locations - so extensions are properly supported (two places).
+* perllib/colcfg.pm: added indexname and indexlevel CLI configuration options
+* perllib/dbutil.pm: removed, as I want the one in TDB-Edit extension (with it's dynamic database driver loading) to apply.
+* perllib/doc.pm: commented out hardcoded(?) part to a particular 64bit version of perl... is this from my earlier checkins?
+* perllib/lucenebuilder.pm: added indexlevel parameter and code to ensure that, if specified, only that level is built (with appropriate testing for the non-lucene-supported 'paragraph' level). Added prepare_build_recipe() function that knows all phases in lucene builds can be run in parallel, with build_indexes being separable by level.
+* perllib/mgbuilder.pm: the most 'complex' recipe generator, mg creates the compress_text item, then adds all the build_index items as dependents. InfoDB can happen in parallel with compress_text however.
+* perllib/mgppbuilder.pm: the simpliest recipe, mgpp can run all three of its phases in parallel.
+* perllib/parse2.pm: see IncrementalBuildTools
+* perllib/parse3.pm: see IncrementalBuildTools
+* perllib/plugin.pm: see IncrementalBuildTools
+* perllib/util.pm: made it only complain about periods (.) in the Identifier once - rather than once per document (which is a PITA when building one million documents).
+
+* perllib/dbutil/gdbm.pm: changed to call lock enabled versions of txt2db and db2txt.
+* perllib/dbutil/sqlite.pm: added WAL Pragma (for all the good it did). Also needed to redirect output (like for db_fast) as the WAL reports each type of action ("add","update", and "delete") that it has queued - very quickly becoming annoying.
+
+* perllib/plugins/DirectoryPlugin.pm: making the "Global file scan..." comment obey verbosity.
+* perllib/plugins/MARCPlugin.pm: see IncrementalBuildTools (in this case the path to cpan)
+* perllib/plugins/MetadataXMLPlugin.pm: see IncrementalBuildTools (in this case the path to cpan)
+* perllib/plugins/OAIMetadataXMLPlugin.pm: see IncrementalBuildTools (in this case the path to cpan)
+* perllib/plugins/ReadXMLPlugin.pm: see IncrementalBuildTools (in this case the path to cpan)
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/bin/script/GDBMServer.pl
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/bin/script/GDBMServer.pl	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/bin/script/GDBMServer.pl	(revision 24799)
@@ -0,0 +1,477 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+# Configuration
+my $thread_count = 10;
+
+# Setup Environment
+BEGIN
+{
+  die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+  die "GSDLOS not set\n" unless defined $ENV{'GSDLOS'};
+
+  unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+  unshift (@INC, "$ENV{'GSDLHOME'}/perllib/cpan");
+  unshift (@INC, "$ENV{'GSDLHOME'}/perllib/cpan/XML/XPath");
+  unshift (@INC, "$ENV{'GSDLHOME'}/perllib/plugins");
+  unshift (@INC, "$ENV{'GSDLHOME'}/perllib/classify");
+
+  if (defined $ENV{'GSDLEXTS'})
+  {
+    my @extensions = split(/:/,$ENV{'GSDLEXTS'});
+    foreach my $e (@extensions)
+    {
+      my $ext_prefix = "$ENV{'GSDLHOME'}/ext/$e";
+      unshift (@INC, "$ext_prefix/perllib");
+      unshift (@INC, "$ext_prefix/perllib/cpan");
+      unshift (@INC, "$ext_prefix/perllib/plugins");
+      unshift (@INC, "$ext_prefix/perllib/classify");
+    }
+  }
+  if (defined $ENV{'GSDL3EXTS'})
+  {
+    my @extensions = split(/:/,$ENV{'GSDL3EXTS'});
+    foreach my $e (@extensions)
+    {
+      my $ext_prefix = "$ENV{'GSDL3SRCHOME'}/ext/$e";
+      unshift (@INC, "$ext_prefix/perllib");
+      unshift (@INC, "$ext_prefix/perllib/cpan");
+      unshift (@INC, "$ext_prefix/perllib/plugins");
+      unshift (@INC, "$ext_prefix/perllib/classify");
+    }
+  }
+
+  # Manually installed CPAN package in GEXT*INSTALL
+  unshift (@INC, $ENV{'GEXTPARALLELBUILDING_INSTALLED'} . "/share/perl5");
+}
+
+use Cwd;
+# Locking is required (otherwise other threads might glom onto the lock file
+# before we've written our port number to it).
+use Fcntl qw(:flock);
+# advanced child process control
+use IPC::Run qw(harness start pump finish);
+# the GDBMCLI tool accepts commands on STDIN and write results on STDOUT
+# so we'll need a double ended pipe
+# @note couldn't get this to reliably work when passing between threads
+#use IPC::Open2;
+# we need to run as a daemon
+use Proc::Daemon;
+# and the whole thing will need to accept requests from multiple threads, and
+# so will need threads in and of itself
+use threads;
+use threads::shared;
+
+# Greenstone utility functions (filename_cat)
+use util;
+# A simple server that listens on a socket and 'forks' off child threads to
+# handle each incoming request
+use SocketsSwimmingThreadPoolServer;
+
+# Globally available
+my $parent_pid = 0;
+my $infodb_file_path = '';
+my $remove_old = '';
+my $gdbm;
+my $gdbm_reader;
+my $gdbm_writer;
+my $debug = 1;
+my $server;
+# - shared and, more importantly, lockable
+my %listeners :shared;
+my $accessing_gdbm :shared;
+my $should_stop :shared;
+my $debug_log :shared;
+
+print "===== GDBM Server =====\n";
+print "Provides a persistent connection to one or more GDBM databases via a\n";
+print "pool of threads listening on a specific socket.\n";
+
+MAIN:
+{
+  $accessing_gdbm = 0;
+  $should_stop = 0;
+  $debug_log = 0;
+
+  # Check arguments
+  if (!defined $ARGV[0] || !defined $ARGV[1])
+  {
+    print "Error! Missing parent process id or path to database\n\n";
+    print "Usage: GDBMServer.pl <pid name> <path to database> [-removeold] [-nodaemon] [-debug]\n\n";
+    exit(0);
+  }
+  $parent_pid = $ARGV[0];
+  $infodb_file_path = $ARGV[1];
+  my $no_daemon = 0;
+  my $i = 2;
+  while (defined $ARGV[$i])
+  {
+    if ($ARGV[$i] eq "-nodaemon")
+    {
+      $no_daemon = 1;
+    }
+    if ($ARGV[$i] eq "-removeold")
+    {
+      $remove_old = '-removeold ';
+    }
+    if ($ARGV[$i] eq "-debug")
+    {
+      $debug = 1;
+    }
+    $i++;
+  }
+
+  if ($debug)
+  {
+    print " - parent pid: " . $parent_pid . "\n";
+    print " - infodb: " . $infodb_file_path . "\n";
+    print " - no daemon? " . $no_daemon . "\n";
+    print " - remove old? " . $remove_old . "\n";
+    print " - debug? yes\n";
+    print "\n";
+  }
+
+  # Information about any running GDBMServer is stored in a lockfile in
+  # Greenstone's tmp directory (and based on the database opened)
+  my $tmp_dir = &util::filename_cat($ENV{'GSDLHOME'}, "tmp");
+  my ($infodb_file, $extension) = $infodb_file_path =~ /([^\\\/]+)\.(db|gdb)$/i;
+  my $server_lockfile_path = &util::filename_cat($tmp_dir, 'gdbmserver-' . $infodb_file . '.lock');
+
+  # If already running, then exit
+  print " * Testing for other GDBMServers already running... ";
+  if (-e $server_lockfile_path)
+  {
+    print "Error! GDBMServer already running!\n";
+    print "Lockfile found at: " . $server_lockfile_path . "\n";
+    exit(0);
+  }
+  print "All clear!\n";
+
+  # Ensure we can see gdbmcli on the path
+  print " * Testing for GDBMCLI... ";
+  my $result = `gdbmcli 2>&1`;
+  if ($result !~ /GDBM Command Line Interface/)
+  {
+    print "Error! GDBMCLI not available - check path.\n";
+    exit(0);
+  }
+  print "Found!\n";
+
+  # @note Easiest way to figure out the open file descriptors is to close them.
+  #       You start by figure out what the maximum number of file handles is
+  #       for your system. You then iterate through trying to close them using
+  #       the POSIX close function - which returns true iif the file descriptor
+  #       existed and was successfully closed. You can then keep track of the
+  #       highest file descriptor number successfully closed. Do this before and
+  #       after your desired function call (like start() below) and the
+  #       difference in hc_fd gives your new file descriptors in use! [jmt12]
+  #my $openmax = POSIX::sysconf( &POSIX::_SC_OPEN_MAX );
+  #$openmax = ( ! defined( $openmax ) || $openmax < 0 ) ? ( shift || 64 ) : $openmax;
+  #my $hc_fd = 2;
+  #foreach ( 3 .. $openmax )
+  #{
+  #  $hc_fd = $_ if POSIX::close( $_ );
+  #}
+  #print "[debug] After start fd count = " . $hc_fd . "\n";
+  #exit(0);
+
+  # @note As mentioned above, I couldn't get the file handles produced by open2
+  #       realiably shared between handles (even using the tricks mentioned on
+  #       the perlmonks site - http://perlmonks.org/?node_id=395513). Typically
+  #       they'd work the first time they were used (read or write) but
+  #       subsequent actions would block indefinitely. Moreover, I couldn't get
+  #       open2 to work as advertised and accept arguments (despite several
+  #       hours of dicking around) - and the work-around to make the dbpath the
+  #       first lot of IO works, but then definately causes the next action to
+  #       block forever. [jmt12]
+#  #my @cmd = ('gdbmcli',$infodb_file_path); # doesn't work - runs gdbmcli twice?
+#  my @cmd = ('gdbmcli');
+#  $gdbm_reader = IO::Handle->new();
+#  $gdbm_writer = IO::Handle->new();
+#  print " * Opening GDBM database\n";
+#  $gdbm_pid = open2($gdbm_reader, $gdbm_writer, 'gdbmcli');
+#  if (!$gdbm_writer)
+#  {
+#    die("Error! Failed to open GDBMCLI for writing\n");
+#  }
+#  if (!$gdbm_reader)
+#  {
+#    die("Error! Failed to open GDBMCLI for reading\n");
+#  }
+#  # For ungodly reasons open2 doesn't work as advertised - it doesn't pass any
+#  # arguments - so instead the first command to the GDBMCLI is the path to the
+#  # GDBM database to load.
+#  print $gdbm_writer $infodb_file_path . "\n" or die("Error! Failed to actually write something to GDBMCLI\n");
+#  my $load_result;
+#  if ($load_result = <$gdbm_reader>)
+#  {
+#    print $load_result;
+#  }
+#  else
+#  {
+#    die("Error! Failed to actually read something from GDBMCLI\n");
+#  }
+
+  # Open the database connection
+  my @cmd = ('gdbmcli',$infodb_file_path);
+  $gdbm_writer = '';
+  $gdbm_reader = '';
+  # @note start opens a total of four file descriptors to the 'cmd', but
+  #       we never get to know their names (maybe $gdbm->{'WIN'} etc but
+  #       I'm note sure) so instead we just have to hope that the number
+  #       of file descriptors already open doesn't change, in which case
+  #       these are fd 3, 4, 5, and 6.
+  $gdbm = start \@cmd, \$gdbm_writer, \$gdbm_reader;
+  # - start opens four handles!
+
+  # Daemonize
+  my $pid = 0;
+  if (!$no_daemon)
+  {
+    # Determine the anonymous array of file descriptors *not* to close
+    my $dont_close_fd = [];
+    # Building upon the "POSIX::Close()" test above, we need to explicitly
+    # determine the new file descriptors opened by the start command.
+    my $openmax = POSIX::sysconf( &POSIX::_SC_OPEN_MAX );
+    $openmax = ( ! defined( $openmax ) || $openmax < 0 ) ? ( shift || 64 ) : $openmax;
+    # - then figure out the file descriptors currently open. We do this
+    #   by attempting to 'copy' each file descriptor.
+    for (my $fd = 3; $fd <= $openmax; $fd++)
+    {
+      #rint "Checking file descriptor: $fd -> ";
+      my $tmpfh;
+      if (open $tmpfh, ">&$fd")
+      {
+        #rint "writable!\n";
+        push(@{$dont_close_fd}, $fd);
+        close($tmpfh);
+      }
+      elsif (open $tmpfh, "<&$fd")
+      {
+        #rint "readable!\n";
+        push(@{$dont_close_fd}, $fd);
+        close($tmpfh);
+      }
+      #else
+      #{
+      #  print "not open\n";
+      #}
+    }
+    print " * When forking don't close these filehandles: [" . join(",", @{$dont_close_fd}) . "]\n";
+
+    print " * Spawning Daemon...\n" unless (!$debug);
+    my $daemon_out_path = &util::filename_cat($ENV{'GEXTPARALLELBUILDING'},'logs', 'gdbmserver-' . $infodb_file . '.out');
+    my $daemon_err_path = &util::filename_cat($ENV{'GEXTPARALLELBUILDING'},'logs', 'gdbmserver-' . $infodb_file . '.err');
+    $pid = Proc::Daemon::Init( { work_dir => getcwd(),
+                                 child_STDOUT => $daemon_out_path,
+                                 child_STDERR => $daemon_err_path,
+  # @note as mentioned above, start creates four file descriptors that we need
+  #       to keep open even through the separation of the daemon process.
+                                 dont_close_fd => $dont_close_fd,
+                               } );
+  }
+
+  # Parent process has pid > 0
+  if ($pid == 0)
+  {
+
+    # Perform initializes here
+    # - database connection is now handled as a special command, as there may
+    #   be multiple databases handled by this server
+    # - localhost is good enough for now
+    my $host = 'localhost';
+    # - determine a suitable port (checking that they aren't already in use)
+    # @note this isn't at all portable, but then neither is the daemon the
+    #       way I've written it.
+    my $port = 8190;
+    my $result = `netstat -tnl | grep :$port`;
+    while ($result =~ /LISTEN/)
+    {
+      $port++;
+      $result = `netstat -tnl | grep :$port`;
+    }
+    # - create server object
+    print " * Creating pool of " . $thread_count . " threads listening on socket: " . $host . ":" . $port . "\n";
+    $server = SocketsSwimmingThreadPoolServer->new(host=>$host,
+                                                   port=>$port,
+                                                   processor_cb => \&process);
+
+    # - write our port number into the lockfile so that other threads can figure
+    #   out where we are
+    print " * Writing port number to lock file: " . $server_lockfile_path . "\n";
+    open(SLFH, ">", $server_lockfile_path) or die("Error! Failed to open file for writing: " . $server_lockfile_path . "\nReason: " . $! . "\n");
+    flock(SLFH, LOCK_EX) or die("Error! Cannot lock file for writing: " . $server_lockfile_path . "\nReason: " . $! . "\n");
+    print SLFH $host . ':' . $port;
+    flock(SLFH, LOCK_UN);
+    close(SLFH);
+
+    # Perform main loop
+    # - loop is actually in Server code. start() only returns once server's stop
+    #   command has been called
+    print " * Listening:\n";
+    $server->start;
+    print " * Stopping...\n";
+
+    # Perform deinitializes here
+    # - remove server lockfile
+    print " * Removing lock file...\n";
+    unlink($server_lockfile_path);
+    # - now close database handles (forcing flush)
+    print " * Closing GDBMCLI\n";
+    finish($gdbm);
+    print "Done!\n";
+  }
+  else
+  {
+    print " * Waiting for GDBMServer lockfile to be created";
+    while (!-e $server_lockfile_path)
+    {
+      print '.';
+      sleep(1);
+    }
+    print "\n * GDBMServer lockfile created.\n";
+    open(SLFH, "<", $server_lockfile_path) or die("Error! Failed to open file for reading: " . $server_lockfile_path . "\nReason: " . $! . "\n");
+    flock(SLFH, LOCK_SH) or die("Error! Cannot lock file for reading: " . $server_lockfile_path . "\nReason: " . $! . "\n");
+    my $line = <SLFH>;
+    if ($line =~ /(^.+):(\d+)$/)
+    {
+      print " => Server now listening on " . $1 . ":" . $2 . "\n";
+    }
+    else
+    {
+      die ("Error! Failed to retrieve host and port information from lockfile!");
+    }
+    flock(SLFH, LOCK_UN);
+    close(SLFH);
+  }
+
+  print "===== Complete! =====\n";
+}
+exit(0);
+
+# /** @function process
+#  *  A horribly named function that is called back to process each of the
+#  *  requests to alter the GDBM database. It expects either a typical GDBM
+#  *  text blob, or one of a limited number of special commands (which start
+#  *  with the sentinel character "!"). Note that synchronization over the
+#  *  open GDBM handle is used to ensure only one edit occurs at a time.
+#  */
+sub process
+{
+  my $data = shift @_;
+  my $ip = shift @_;
+  my $tid = shift @_;
+  my $value = "#ERROR#";
+  # Synchronized debug log writing
+  if ($debug)
+  {
+    lock($debug_log);
+    $|++;
+    print "[" . time() . "|" . $tid . "|RECV] " . $data . "\n";
+    $|--;
+  }
+  # process special commands first
+  if ($data =~ /^!(.*):(.*)$/)
+  {
+    my $command = $1;
+    my $argument = $2;
+    # addlistener(<pid>)
+    if ($command eq "addlistener")
+    {
+      lock(%listeners);
+      $listeners{$argument} = 1;
+      my $listener_count = scalar(keys(%listeners));
+      $value = "[SUCCESS] added listener [" . $listener_count . " listeners]";
+      # unlock(%listeners)
+    }
+    # removelistener(<pid>)
+    elsif ($command eq "removelistener")
+    {
+      lock(%listeners);
+      if (defined $listeners{$argument})
+      {
+        delete $listeners{$argument};
+      }
+      my $listener_count = scalar(keys(%listeners));
+      lock($should_stop);
+      if ($should_stop == 1 && $listener_count == 0)
+      {
+        # server isn't shared, but the stop data member is!
+        $server->stop;
+        $value = "[SUCCESS] removed last listener, stopping";
+      }
+      else
+      {
+        $value = "[SUCCESS] removed listener [" . $listener_count . " listeners]";
+      }
+      # unlock($should_stop)
+      # unlock(%listeners)
+    }
+    # we may be asked to stop the server, but only by the process that created
+    # us. If there are no listeners registered, we stop straight away,
+    # otherwise we set a flag so that as soon as there are no listeners we
+    # stop.
+    elsif ($command eq "stop")
+    {
+      if ($argument ne $parent_pid && $argument ne "*")
+      {
+        $value = "[IGNORED] can only be stopped by parent process";
+      }
+      else
+      {
+        my $listener_count = 0;
+        {
+          lock(%listeners);
+          $listener_count = scalar(keys(%listeners));
+          # unlock(%listeners)
+        }
+        if ($listener_count == 0)
+        {
+          # server isn't shared, but the stop data member is!
+          $server->stop;
+          $value = "[SUCCESS] stopping";
+        }
+        else
+        {
+          lock($should_stop);
+          $should_stop = 1;
+          $value = "[PENDING] will stop when no more listeners";
+          # unlock($should_stop)
+        }
+      }
+    }
+  }
+  # Everything thing else should be a GDBMCLI command
+  else
+  {
+    lock($accessing_gdbm);
+    # lets check that we can still access the GDBM bidirectional pump
+    if (!pumpable $gdbm)
+    {
+      die("Error! Somehow the underlying GDBM bidirectional pipe has gone away!");
+    }
+    # - write the command to GDBM
+    $gdbm_writer = $data . "\n";
+    $gdbm_reader = '';
+    #rint "[debug] sending command to gdbmcli\n";
+    pump($gdbm) while length($gdbm_writer);
+    #rint "[debug] reading output from gdbmcli\n";
+    pump($gdbm) until $gdbm_reader =~ /-{70}/;
+    $value = $gdbm_reader;
+    # trim value
+    chomp($value);
+    #rint "[debug] result: " . $value . "\n";
+    #unlock($accessing_gdbm);
+  }
+  # Synchronized debug log writing
+  if ($debug)
+  {
+    lock($debug_log);
+    $|++;
+    print "[" . time() . "|" . $tid . "|SEND] " . $value . "\n\n";
+    $|--;
+  }
+  return $value;
+}
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/bin/script/batch-testing.pl
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/bin/script/batch-testing.pl	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/bin/script/batch-testing.pl	(revision 24799)
@@ -0,0 +1,263 @@
+#!/usr/bin/perl
+
+use strict;
+
+use POSIX qw(strftime);
+
+BEGIN
+{
+  die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+}
+
+print STDOUT "===== Batch Testing =====\n";
+print STDOUT "Runs a multitude of tests against a 'lorem' collection and making\n";
+print STDOUT "use of parallel importing.\n\n";
+
+# 0. Configuration
+#my $infodb_type = 'GDBM';
+#my $infodb_type = 'GDBMServer';
+#my $infodb_type = 'SQLite';
+my $infodb_type = 'TDB';
+my @sizes = (100);
+#my @sizes = (100, 500, 1000, 5000, 10000, 50000, 100000, 500000, 1000000);
+my @threads = (1);
+my @batchsize = (100);
+my $test_iterations = 1;
+#my $test_iterations = 9;
+
+# 1. Initialization
+my $machine_name = `hostname -s`;
+chomp($machine_name);
+$machine_name = ucfirst($machine_name);
+my $os_name = `lsb_release -i`;
+$os_name =~ s/^Distributor ID:\s+(.*)\r?\n$/$1/i;
+my $fs_name = `df -T $ENV{'GSDLHOME'}`;
+$fs_name =~ s/^.*(ext2|ext3|ext4|xfs|zfs).*$/$1/is;
+$fs_name = uc($fs_name);
+my $sizes_str = 'd' . $sizes[0];
+if (scalar(@sizes) > 1)
+{
+  $sizes_str .= '-' . $sizes[(scalar(@sizes) - 1)];
+}
+my $threads_str = 't' . $threads[0];
+if (scalar(@threads) > 1)
+{
+  $threads_str .= '-' . $threads[(scalar(@threads) - 1)];
+}
+my $batch_str = 'b' . $batchsize[0];
+if (scalar(@batchsize) > 1)
+{
+  $batch_str .= '-' . $batchsize[(scalar(@batchsize) - 1)];
+}
+my $db_name = $machine_name . '_' . $os_name . '_' . $fs_name . '_' . $infodb_type . '_' . $sizes_str . '_' . $threads_str . '_' . $batch_str . '_i' . $test_iterations . '.db';
+my $db_path = $ENV{'GSDLHOME'} . '/collect/' . $db_name;
+
+# 2. If we haven't already, initialize the database by creating the tables and
+#    populating the pending tests queue
+my $init_database = 0;
+
+if (!-f $db_path)
+{
+  $init_database = 1;
+}
+elsif('0' eq getValueSQL($db_path, 'SELECT COUNT(*) FROM tests'))
+{
+  $init_database = 1;
+}
+
+if ($init_database > 0)
+{
+  print STDOUT " * Creating database tables\n";
+  # create tests table
+  execSQL($db_path, 'CREATE TABLE IF NOT EXISTS tests (walltime INTEGER DEFAULT 0, collection TEXT, type TEXT, testrun INTEGER, realtime REAL DEFAULT 0, systime REAL DEFAULT 0, usertime REAL DEFAULT 0, PRIMARY KEY (collection, type, testrun))');
+  execSQL($db_path, 'CREATE TABLE IF NOT EXISTS testoutput (walltime INTEGER DEFAULT 0, collection TEXT, type TEXT, testrun INTEGER,  output TEXT, PRIMARY KEY (collection, type, testrun))');
+
+  # populate with anticpated tests
+  print STDOUT " * Populating tests table\n";
+  foreach my $size (@sizes)
+  {
+    my $collection = lc($infodb_type) . sprintf("%07d", $size);
+    print STDOUT ' - generating tests for collection=' . $collection . "\n";
+    my $a_test_iterations = $test_iterations;
+    for (my $test_run = 1; $test_run <= $a_test_iterations; $test_run++)
+    {
+       my $sql = "INSERT INTO tests (collection, type, testrun) VALUES ('" . $collection . "','rm'," . $test_run . ")";
+       print STDERR ' - sql: ' . $sql . "\n";
+       execSQL($db_path, $sql);
+       $sql = "INSERT INTO tests (collection, type, testrun) VALUES ('" . $collection . "','import'," . $test_run . ")";
+       print STDERR ' - sql: ' . $sql . "\n";
+       execSQL($db_path, $sql);
+       $sql = "INSERT INTO testoutput (collection, type, testrun) VALUES ('" . $collection . "','rm'," . $test_run . ")";
+       print STDERR ' - sql: ' . $sql . "\n";
+       execSQL($db_path, $sql);
+       $sql = "INSERT INTO testoutput (collection, type, testrun) VALUES ('" . $collection . "','import'," . $test_run . ")";
+       print STDERR ' - sql: ' . $sql . "\n";
+       execSQL($db_path, $sql);
+    }
+  }
+}
+
+# 3. While there are still pending tests in the queue
+my $total_count = getValueSQL($db_path, 'SELECT COUNT(*) FROM tests');
+my $test_count = getValueSQL($db_path, 'SELECT COUNT(*) FROM tests WHERE realtime=0');
+my $exit_file_path = $ENV{'GSDLHOME'} . '/collect/exit.now';
+while ($test_count ne "0" && !-f $exit_file_path)
+{
+  my $x = $total_count - $test_count;
+  my $now_string = strftime "%a %b %e %H:%M:%S %Y", localtime;
+  print STDERR ' * [' . $now_string . '] Progress: ' . sprintf("%.0f",(($x/$total_count)*100)) . '% complete! [' . $test_count . " tests remaining]\n";
+  my $cmd;
+  my $result;
+  my $rtime; my $utime; my $stime;
+  # 4. Pick a random test (thread count and epoch) and run and time it
+  my ($counter, $collection, $test_run) = getRecordSQL($db_path, 'SELECT _rowid_, collection, testrun FROM tests WHERE realtime=0 ORDER BY RANDOM() LIMIT 1');
+  print STDOUT '   - running test import for collection=' . $collection . ', and test_run=' . $test_run . "\n";
+
+  # Command one: run rm_archives.pl and record information in database
+  $cmd = 'time -p rm_archives.pl ' . $collection . ' 2>&1';
+  print STDOUT '   - command: ' . $cmd . "\n";
+  $result = `$cmd`;
+  $rtime = 0;
+  if ($result =~ /real\s+(\d+\.\d+)/)
+  {
+    $rtime = $1;
+  }
+  $utime = 0;
+  if ($result =~ /user\s+(\d+\.\d+)/)
+  {
+    $utime = $1;
+  }
+  $stime = 0;
+  if ($result =~ /sys\s+(\d+\.\d+)/)
+  {
+    $stime = $1;
+  }
+  $result =~ s/'//g;
+  my $walltime = time();
+  execSQL($db_path, 'UPDATE tests SET walltime=' . $walltime . ', realtime=' . $rtime . ', usertime=' . $utime . ', systime=' . $stime . ' WHERE collection=\'' . $collection . '\' AND type=\'rm\' AND testrun=' . $test_run);
+  execSQL($db_path, 'UPDATE testoutput SET walltime=' . $walltime . ', output=\'' . $result . '\' WHERE collection=\'' . $collection . '\' AND type=\'rm\' AND testrun=' . $test_run);
+
+  # Have a sleep to try and prevent any headaches caused by 'rm' influencing
+  # later processes
+  #sleep(5);
+
+  # Command two: use sudoedit and other black magic to clear out the memory-
+  # based disk cache (which is done by writing the number 3 to a certain
+  # system file)
+  print STDOUT "   - Synching file system... ";
+  `sync`;
+  print STDOUT "Done!\n";
+  print STDOUT "   - Dropping memory disk cache... ";
+  # - save our current default editor
+  my $current_editor = $ENV{'EDITOR'};
+  # - replace default editor with a script that simply clobbers the contents
+  #   of any file it's handed with the number "3"
+  $ENV{'EDITOR'} = 'reset_memcache_editor.sh';
+  # - we now call sudoedit on the system file. How sudoedit works is that it
+  #   starts by making a temp copy of the system file with appropriate
+  #   permissions allowing the user to edit. It then passes the path to the
+  #   temp file to the default editor - typically this would be an interactive
+  #   editor like 'vi'. However, we've just replaced the editor with a custom
+  #   script that just writes '3' as the content of the tmp file. Finally, when
+  #   the editor exits, sudoedit copies the tmp file over the top of the system
+  #   file, restoring appropriate root-level permissions
+  `sudoedit /proc/sys/vm/drop_caches`;
+  # - restore the default editor, just in case something in Greenstone
+  #   depends on this being a reasonably value
+  $ENV{'EDITOR'} = $current_editor;
+  print STDOUT "Done!\n";
+
+  # Command three: run import.pl and record information in database
+  $cmd = 'time -p import.pl -removeold -verbosity 0 ' . $collection . ' 2>&1';
+  print STDOUT '   - command: ' . $cmd . "\n";
+  $result = `$cmd`;
+  $rtime = 0;
+  if ($result =~ /real\s+(\d+\.\d+)/)
+  {
+    $rtime = $1;
+  }
+  $utime = 0;
+  if ($result =~ /user\s+(\d+\.\d+)/)
+  {
+    $utime = $1;
+  }
+  $stime = 0;
+  if ($result =~ /sys\s+(\d+\.\d+)/)
+  {
+    $stime = $1;
+  }
+  $result =~ s/'//g;
+  $walltime = time();
+  execSQL($db_path, 'UPDATE tests SET walltime=' . $walltime . ', realtime=' . $rtime . ', usertime=' . $utime . ', systime=' . $stime . ' WHERE collection=\'' . $collection . '\' AND type=\'import\' AND testrun=' . $test_run);
+  execSQL($db_path, 'UPDATE testoutput SET walltime=' . $walltime . ', output=\'' . $result . '\' WHERE collection=\'' . $collection . '\' AND type=\'import\' AND testrun=' . $test_run);
+
+  # Repeat until we have exhausted pending tests
+  $test_count = getValueSQL($db_path, 'SELECT COUNT(*) FROM tests WHERE realtime=0');
+}
+
+# Remove any exit file
+if (-f $exit_file_path)
+{
+  print STDOUT "   - Removing exit file... ";
+  unlink($exit_file_path);
+  print STDOUT "Done!\n";
+}
+
+
+print STDOUT "Complete!\n\n";
+
+exit;
+
+sub execSQL
+{
+  my ($db_path, $sql) = @_;
+  # call getValueSQL but don't care about result
+  getValueSQL($db_path, $sql);
+}
+# /** execSQL() **/
+
+sub getRecordSQL
+{
+  my ($db_path, $sql) = @_;
+  if ($sql !~ /LIMIT 1/i)
+  {
+    $sql .= ' LIMIT 1';
+  }
+  my $value = getValueSQL($db_path, $sql);
+  return split(/\|/,$value);
+}
+# /** getRecordSQL() **/
+
+sub getValueSQL
+{
+  my ($db_path, $sql) = @_;
+  my $result = `sqlite3 "$db_path" "$sql" 2>&1`;
+  if ($result =~ /Error:/)
+  {
+    die($result);
+  }
+  # trim
+  $result =~ s/^\s*|\s*$//g;
+  return $result;
+}
+# /** getValueSQL() **/
+
+sub printUsage
+{
+  my ($msg) = @_;
+  # flush STDOUT
+  select((select(STDOUT), $|=1)[0]);
+  print STDOUT '';
+  select((select(STDOUT), $|=0)[0]);
+  # output any error message
+  if (defined $msg)
+  {
+    print STDERR 'Error! ' . $msg . "\n";
+  }
+  # and finally the usage
+  print STDERR "Usage: mpitesting.pl <path to database> <number docs> <worker threads>\n";
+  print STDERR "\n";
+  exit;
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/bin/script/buildcol.pl
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/bin/script/buildcol.pl	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/bin/script/buildcol.pl	(revision 24799)
@@ -0,0 +1,803 @@
+#!/usr/bin/perl -w
+
+###########################################################################
+#
+# buildcol.pl --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+
+# This program will build a particular collection.
+
+package buildcol;
+
+BEGIN
+{
+  die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+  die "GSDLOS not set\n" unless defined $ENV{'GSDLOS'};
+
+  unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+  unshift (@INC, "$ENV{'GSDLHOME'}/perllib/cpan");
+  unshift (@INC, "$ENV{'GSDLHOME'}/perllib/cpan/XML/XPath");
+  unshift (@INC, "$ENV{'GSDLHOME'}/perllib/plugins");
+  unshift (@INC, "$ENV{'GSDLHOME'}/perllib/classify");
+
+  if (defined $ENV{'GSDLEXTS'})
+  {
+    my @extensions = split(/:/,$ENV{'GSDLEXTS'});
+    foreach my $e (@extensions)
+    {
+      my $ext_prefix = "$ENV{'GSDLHOME'}/ext/$e";
+      unshift (@INC, "$ext_prefix/perllib");
+      unshift (@INC, "$ext_prefix/perllib/cpan");
+      unshift (@INC, "$ext_prefix/perllib/plugins");
+      unshift (@INC, "$ext_prefix/perllib/classify");
+    }
+  }
+  if (defined $ENV{'GSDL3EXTS'})
+  {
+    my @extensions = split(/:/,$ENV{'GSDL3EXTS'});
+    foreach my $e (@extensions)
+    {
+      my $ext_prefix = "$ENV{'GSDL3SRCHOME'}/ext/$e";
+      unshift (@INC, "$ext_prefix/perllib");
+      unshift (@INC, "$ext_prefix/perllib/cpan");
+      unshift (@INC, "$ext_prefix/perllib/plugins");
+      unshift (@INC, "$ext_prefix/perllib/classify");
+    }
+  }
+}
+
+use colcfg;
+use dbutil;
+use util;
+use scriptutil;
+use FileHandle;
+use gsprintf;
+use printusage;
+use parse2;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and vice versa
+no strict 'subs'; # allow barewords (eg STDERR) as function arguments
+
+
+my $mode_list =
+    [ { 'name' => "all",
+        'desc' => "{buildcol.mode.all}" },
+      { 'name' => "compress_text",
+        'desc' => "{buildcol.mode.compress_text}" },
+      { 'name' => "build_index",
+        'desc' => "{buildcol.mode.build_index}" },
+      { 'name' => "infodb",
+        'desc' => "{buildcol.mode.infodb}" } ];
+
+my $sec_index_list = 
+    [ {'name' => "never",
+       'desc' => "{buildcol.sections_index_document_metadata.never}" },
+      {'name' => "always",
+       'desc' => "{buildcol.sections_index_document_metadata.always}" },
+      {'name' => "unless_section_metadata_exists",
+       'desc' => "{buildcol.sections_index_document_metadata.unless_section_metadata_exists}" }
+      ];
+
+my $arguments =
+    [ { 'name' => "remove_empty_classifications",
+	'desc' => "{buildcol.remove_empty_classifications}",
+	'type' => "flag",
+	'reqd' => "no",
+	'modegli' => "2" },
+      { 'name' => "archivedir",
+	'desc' => "{buildcol.archivedir}",
+	'type' => "string",
+	'reqd' => "no",
+        'hiddengli' => "yes" },
+      { 'name' => "builddir",
+	'desc' => "{buildcol.builddir}",
+	'type' => "string",
+	'reqd' => "no",
+        'hiddengli' => "yes" },
+#     { 'name' => "cachedir",
+#	'desc' => "{buildcol.cachedir}",
+#	'type' => "string",
+#	'reqd' => "no" },
+      { 'name' => "collectdir",
+	'desc' => "{buildcol.collectdir}",
+	'type' => "string",
+	# parsearg left "" as default
+	#'deft' => &util::filename_cat ($ENV{'GSDLHOME'}, "collect"),
+	'reqd' => "no",
+        'hiddengli' => "yes" },
+      { 'name' => "site",
+	'desc' => "{buildcol.site}",
+	'type' => "string",
+	'deft' => "",
+	'reqd' => "no",
+        'hiddengli' => "yes" },
+      { 'name' => "debug",
+	'desc' => "{buildcol.debug}",
+	'type' => "flag",
+	'reqd' => "no",
+        'hiddengli' => "yes" },
+      { 'name' => "faillog",
+	'desc' => "{buildcol.faillog}",
+	'type' => "string",
+	# parsearg left "" as default
+	#'deft' => &util::filename_cat("<collectdir>", "colname", "etc", "fail.log"),
+	'reqd' => "no",
+	'modegli' => "3" },
+      # Parallel Build Customization
+      # - this option was called 'index' but that doesn't get thru parsing [jmt12]
+      { 'name' => "indexname",
+	'desc' => "{buildcol.index}",
+	'type' => "string",
+	'reqd' => "no",
+	'modegli' => "3" },
+      # Parallel Build Customization
+      # - a new option to separate building of index levels [jmt12]
+      { 'name' => "indexlevel",
+	'desc' => "{buildcol.indexlevel}",
+	'type' => "string",
+	'reqd' => "no",
+	'modegli' => "3" },
+      { 'name' => "incremental",
+	'desc' => "{buildcol.incremental}",
+	'type' => "flag",
+	'hiddengli' => "yes" },
+      { 'name' => "keepold",
+	'desc' => "{buildcol.keepold}",
+	'type' => "flag",
+	'reqd' => "no",
+        #'modegli' => "3",
+	'hiddengli' => "yes" },
+      { 'name' => "removeold",
+	'desc' => "{buildcol.removeold}",
+	'type' => "flag",
+	'reqd' => "no",
+	#'modegli' => "3",
+	'hiddengli' => "yes"  },
+      { 'name' => "language",
+	'desc' => "{scripts.language}",
+	'type' => "string",
+	'reqd' => "no",
+	'modegli' => "3" },
+      { 'name' => "maxdocs",
+	'desc' => "{buildcol.maxdocs}",
+	'type' => "int",
+	'reqd' => "no",
+        'hiddengli' => "yes" },
+      { 'name' => "maxnumeric",
+	'desc' => "{buildcol.maxnumeric}",
+	'type' => "int",
+	'reqd' => "no",
+	'deft' => "4",
+	'range' => "4,512",
+	'modegli' => "3" },
+      { 'name' => "mode",
+	'desc' => "{buildcol.mode}",
+	'type' => "enum",
+	'list' => $mode_list,
+	# parsearg left "" as default
+#	'deft' => "all",
+	'reqd' => "no",
+	'modegli' => "3" },
+      { 'name' => "no_strip_html",
+	'desc' => "{buildcol.no_strip_html}",
+	'type' => "flag",
+	'reqd' => "no",
+	'modegli' => "3" },
+      { 'name' => "no_text",
+	'desc' => "{buildcol.no_text}",
+	'type' => "flag",
+	'reqd' => "no",
+	'modegli' => "2" },
+      { 'name' => "sections_index_document_metadata",
+	'desc' => "{buildcol.sections_index_document_metadata}",
+	'type' => "enum",
+	'list' => $sec_index_list,
+	'reqd' => "no",
+	'modegli' => "2" },
+      { 'name' => "out",
+	'desc' => "{buildcol.out}",
+	'type' => "string",
+	'deft' => "STDERR",
+	'reqd' => "no",
+        'hiddengli' => "yes" },
+      { 'name' => "verbosity",
+	'desc' => "{buildcol.verbosity}",
+	'type' => "int",
+	# parsearg left "" as default
+	#'deft' => "2",
+	'reqd' => "no",
+	'modegli' => "3" },
+      { 'name' => "gli",
+	'desc' => "",
+	'type' => "flag",
+	'reqd' => "no",
+	'hiddengli' => "yes" },
+      { 'name' => "xml",
+	'desc' => "{scripts.xml}",
+	'type' => "flag",
+	'reqd' => "no",
+	'hiddengli' => "yes" },
+      { 'name' => "parallel",
+	'desc' => "{scripts.parallel}",
+	'type' => "flag",
+	'reqd' => "no",
+	'hiddengli' => "yes" },
+      ];
+
+my $options = { 'name' => "buildcol.pl",
+		'desc' => "{buildcol.desc}",
+		'args' => $arguments };
+
+
+# globals
+my $collection;
+my $configfilename;
+my $out;
+
+# used to signify "gs2"(default) or "gs3"
+my $gs_mode = "gs2";
+
+## @method gsprintf()
+#  Print a string to the screen after looking it up from a locale dependant
+#  strings file. This function is losely based on the idea of resource
+#  bundles as used in Java.
+#
+#  @param  $error The STDERR stream.
+#  @param  $text The string containing GS keys that should be replaced with
+#                their locale dependant equivilents.
+#  @param  $out The output stream.
+#  @return The locale-based string to output.
+#
+sub gsprintf()
+{
+    return &gsprintf::gsprintf(@_);
+}
+## gsprintf() ##
+
+&main();
+
+## @method main()
+#
+#  [Parses up and validates the arguments to the build process before creating
+#  the appropriate build process to do the actual work - John]
+#
+#  @note Added true incremental support - John Thompson, DL Consulting Ltd.
+#  @note There were several bugs regarding using directories other than 
+#        "import" or "archives" during import and build quashed. - John 
+#        Thompson, DL Consulting Ltd.
+#
+#  @param  $incremental If true indicates this build should not regenerate all
+#                       the index and metadata files, and should instead just
+#                       append the information found in the archives directory
+#                       to the existing files. If this requires some complex
+#                       work so as to correctly insert into a classifier so be
+#                       it. Of course none of this is done here - instead the
+#                       incremental argument is passed to the document
+#                       processor.
+#
+sub main
+{
+  # command line args
+  # - new argument to allow control of index level [jmt12]
+  my ($verbosity, $archivedir, $cachedir, $builddir, $site, $maxdocs, 
+      $debug, $mode, $indexname, $removeold, $keepold, 
+      $incremental, $incremental_mode,
+      $remove_empty_classifications,
+      $collectdir, $build, $type, $textindex,
+      $no_strip_html, $no_text, $faillog, $gli, $index, $language,
+      $sections_index_document_metadata, $maxnumeric, $indexlevel,
+      $parallel);
+
+    my $xml = 0;
+    my $hashParsingResult = {};
+    # general options available to all plugins
+    my $intArgLeftinAfterParsing = parse2::parse(\@ARGV,$arguments,$hashParsingResult,"allow_extra_options");
+
+    # If parse returns -1 then something has gone wrong
+    if ($intArgLeftinAfterParsing == -1)
+    {
+	&PrintUsage::print_txt_usage($options, "{buildcol.params}");
+	die "\n";
+    }
+    
+    foreach my $strVariable (keys %$hashParsingResult)
+    {
+	eval "\$$strVariable = \$hashParsingResult->{\"\$strVariable\"}";
+    }
+
+    # If $language has been specified, load the appropriate resource bundle
+    # (Otherwise, the default resource bundle will be loaded automatically)
+    if ($language && $language =~ /\S/) {
+	&gsprintf::load_language_specific_resource_bundle($language);
+    }
+
+    if ($xml) {
+        &PrintUsage::print_xml_usage($options);
+	print "\n";
+	return;
+    }
+
+    if ($gli) { # the gli wants strings to be in UTF-8
+	&gsprintf::output_strings_in_UTF8; 
+    }
+
+    # now check that we had exactly one leftover arg, which should be 
+    # the collection name. We don't want to do this earlier, cos 
+    # -xml arg doesn't need a collection name
+    # Or if the user specified -h, then we output the usage also
+    if ($intArgLeftinAfterParsing != 1 || (@ARGV && $ARGV[0] =~ /^\-+h/))
+    {
+	&PrintUsage::print_txt_usage($options, "{buildcol.params}");
+	die "\n";
+    }
+    
+    $textindex = "";
+    my $close_out = 0;
+    if ($out !~ /^(STDERR|STDOUT)$/i) {
+	open (OUT, ">$out") ||
+	    (&gsprintf(STDERR, "{common.cannot_open_output_file}\n", $out) && die);
+	$out = "buildcol::OUT";
+	$close_out = 1;
+    }
+    $out->autoflush(1);
+
+    # get and check the collection
+    if (($collection = &colcfg::use_collection($site, @ARGV, $collectdir)) eq "") {
+	&PrintUsage::print_txt_usage($options, "{buildcol.params}");
+	die "\n";
+    }
+
+    if ($faillog eq "") {
+	$faillog = &util::filename_cat($ENV{'GSDLCOLLECTDIR'}, "etc", "fail.log");
+    }
+    # note that we're appending to the faillog here (import.pl clears it each time)
+    # this could potentially create a situation where the faillog keeps being added 
+    # to over multiple builds (if the import process is being skipped)
+    open (FAILLOG, ">>$faillog") ||
+	(&gsprintf(STDERR, "{common.cannot_open_fail_log}\n", $faillog) && die);
+    $faillog = 'buildcol::FAILLOG';
+    $faillog->autoflush(1);
+
+    # Don't know why this didn't already happen, but now collection specific
+    # classify and plugins directory also added to include path
+    unshift (@INC, "$ENV{'GSDLCOLLECTDIR'}/perllib"); # [jmt12]
+    unshift (@INC, "$ENV{'GSDLCOLLECTDIR'}/perllib/classify"); # [jmt12]
+    unshift (@INC, "$ENV{'GSDLCOLLECTDIR'}/perllib/plugins"); # [jmt12]
+
+    # Read in the collection configuration file.
+    my ($collectcfg, $buildtype, $orthogonalbuildtypes); 
+    ($configfilename, $gs_mode) = &colcfg::get_collect_cfg_name($out);
+    $collectcfg = &colcfg::read_collection_cfg ($configfilename, $gs_mode);
+    
+    # If the infodbtype value wasn't defined in the collect.cfg file, use the default
+    if (!defined($collectcfg->{'infodbtype'}))
+    {
+      $collectcfg->{'infodbtype'} = &dbutil::get_default_infodb_type();
+    }
+    # sanity check - you currently can't have SQLite as the infodb while
+    # asking for a parallel build
+    elsif ($collectcfg->{'infodbtype'} eq 'sqlite' && $parallel)
+    {
+      print STDERR "WARNING: Parallel builds not current supported by SQLite - reverting to serial build\n";
+      $parallel = 0;
+    }
+
+    if ($verbosity !~ /\d+/) {
+	if (defined $collectcfg->{'verbosity'} && $collectcfg->{'verbosity'} =~ /\d+/) {
+	    $verbosity = $collectcfg->{'verbosity'};
+	} else {
+	    $verbosity = 2; # the default
+	}
+    }
+    # we use searchtype for determining buildtype, but for old versions, use buildtype
+    if (defined $collectcfg->{'buildtype'}) {
+	$buildtype = $collectcfg->{'buildtype'};
+    } elsif (defined $collectcfg->{'searchtypes'} || defined $collectcfg->{'searchtype'}) {
+	$buildtype = "mgpp";
+    } else {
+	$buildtype = "mg"; #mg is the default
+    }
+
+    if (defined $collectcfg->{'orthogonalbuildtypes'}) {
+	$orthogonalbuildtypes = $collectcfg->{'orthogonalbuildtypes'};
+    }
+
+    if (defined $collectcfg->{'archivedir'} && $archivedir eq "") {
+	$archivedir = $collectcfg->{'archivedir'};
+    }
+    if (defined $collectcfg->{'cachedir'} && $cachedir eq "") {
+	$cachedir = $collectcfg->{'cachedir'};
+    }
+    if (defined $collectcfg->{'builddir'} && $builddir eq "") {
+	$builddir = $collectcfg->{'builddir'};
+    }
+    if ($maxdocs !~ /\-?\d+/) {
+	if (defined $collectcfg->{'maxdocs'} && $collectcfg->{'maxdocs'} =~ /\-?\d+/) {
+	    $maxdocs = $collectcfg->{'maxdocs'};
+	} else {
+	    $maxdocs = -1; # the default
+	}
+    }
+    if (defined $collectcfg->{'maxnumeric'} && $collectcfg->{'maxnumeric'} =~ /\d+/) {
+	$maxnumeric = $collectcfg->{'maxnumeric'};
+    } 
+    
+    if ($maxnumeric < 4 || $maxnumeric > 512) {
+	$maxnumeric = 4;
+    }
+    
+    if (defined $collectcfg->{'debug'} && $collectcfg->{'debug'} =~ /^true$/i) {
+	$debug = 1;
+    }
+    if ($mode !~ /^(all|compress_text|build_index|infodb)$/) {
+	if (defined $collectcfg->{'mode'} && $collectcfg->{'mode'} =~ /^(all|compress_text|build_index|infodb)$/) {
+	    $mode = $collectcfg->{'mode'};
+	} else {
+	    $mode = "all"; # the default
+	}
+    }
+    # - 'index' doesn't make it through parsing so I renamed this option
+    # 'indexname' [jmt12]
+    if (defined $collectcfg->{'indexname'} && $indexname eq "")
+    {
+      $indexname = $collectcfg->{'indexname'};
+    }
+    # - we may also define the index level to build now
+    if (defined $collectcfg->{'indexlevel'} && $indexlevel eq "")
+    {
+      $indexlevel = $collectcfg->{'indexlevel'};
+    }
+    if (defined $collectcfg->{'no_text'} && $no_text == 0) {
+	if ($collectcfg->{'no_text'} =~ /^true$/i) {
+	    $no_text = 1;
+	}
+    }
+    if (defined $collectcfg->{'no_strip_html'} && $no_strip_html == 0) {
+	if ($collectcfg->{'no_strip_html'} =~ /^true$/i) {
+	    $no_strip_html = 1;
+	}
+    }
+    if (defined $collectcfg->{'remove_empty_classifications'} && $remove_empty_classifications == 0) {
+	if ($collectcfg->{'remove_empty_classifications'} =~ /^true$/i) {
+	    $remove_empty_classifications = 1;
+	}
+    }
+    
+    if ($buildtype eq "mgpp" && defined $collectcfg->{'textcompress'}) {
+	$textindex = $collectcfg->{'textcompress'};
+    }
+    if (defined $collectcfg->{'gli'} && $collectcfg->{'gli'} =~ /^true$/i) {
+	$gli = 1;
+    }
+
+    if ($sections_index_document_metadata !~ /\S/ && defined $collectcfg->{'sections_index_document_metadata'}) {
+	$sections_index_document_metadata = $collectcfg->{'sections_index_document_metadata'};
+    }
+    
+    if ($sections_index_document_metadata !~ /^(never|always|unless_section_metadata_exists)$/) {
+	$sections_index_document_metadata = "never";
+    }
+    
+    ($removeold, $keepold, $incremental, $incremental_mode) 
+	= &scriptutil::check_removeold_and_keepold($removeold, $keepold, 
+						   $incremental, "building", 
+						   $collectcfg);
+ 
+    $gli = 0 unless defined $gli;
+    
+    # New argument to track whether build is incremental
+    $incremental = 0 unless defined $incremental;
+
+    print STDERR "<Build>\n" if $gli;
+
+    #set the text index
+    if (($buildtype eq "mgpp") || ($buildtype eq "lucene")) {
+	if ($textindex eq "") {
+	    $textindex = "text";
+	}
+    }
+    else {
+	$textindex = "section:text";
+    }
+
+    # fill in the default archives and building directories if none
+    # were supplied, turn all \ into / and remove trailing /
+
+    my ($realarchivedir, $realbuilddir);
+    # Modified so that the archivedir, if provided as an argument, is made
+    # absolute if it isn't already
+    if ($archivedir eq "")
+      {
+        $archivedir = &util::filename_cat ($ENV{'GSDLCOLLECTDIR'}, "archives");
+      }
+    else
+      {
+        $archivedir = &util::make_absolute($ENV{'GSDLCOLLECTDIR'}, $archivedir);
+      }
+    # End Mod
+    $archivedir =~ s/[\\\/]+/\//g;
+    $archivedir =~ s/\/$//;
+
+    if ($builddir eq "") {
+	$builddir = &util::filename_cat ($ENV{'GSDLCOLLECTDIR'}, "building");
+	if ($incremental) {
+	    &gsprintf($out, "{buildcol.incremental_default_builddir}\n");
+	}
+    }
+    $builddir =~ s/[\\\/]+/\//g;
+    $builddir =~ s/\/$//;
+
+    # update the archive cache if needed
+    if ($cachedir) {
+	&gsprintf($out, "{buildcol.updating_archive_cache}\n")
+	    if ($verbosity >= 1);
+
+	$cachedir =~ s/[\\\/]+$//;
+	$cachedir .= "/collect/$collection" unless 
+	    $cachedir =~ /collect\/$collection/;
+
+	$realarchivedir = "$cachedir/archives";
+	$realbuilddir = "$cachedir/building";
+	&util::mk_all_dir ($realarchivedir);
+	&util::mk_all_dir ($realbuilddir);
+	&util::cachedir ($archivedir, $realarchivedir, $verbosity);
+
+    } else {
+	$realarchivedir = $archivedir;
+	$realbuilddir = $builddir;
+    }
+
+    # build it in realbuilddir
+    &util::mk_all_dir ($realbuilddir);
+
+    my ($buildertype, $builderdir,  $builder);
+    # if a builder class has been created for this collection, use it
+    # otherwise, use the mg or mgpp builder
+    if (-e "$ENV{'GSDLCOLLECTDIR'}/custom/${collection}/perllib/custombuilder.pm") {
+	$builderdir = "$ENV{'GSDLCOLLECTDIR'}/custom/${collection}/perllib";
+	$buildertype = "custombuilder";
+    } elsif (-e "$ENV{'GSDLCOLLECTDIR'}/perllib/custombuilder.pm") {
+	$builderdir = "$ENV{'GSDLCOLLECTDIR'}/perllib";
+	$buildertype = "custombuilder";
+    } elsif (-e "$ENV{'GSDLCOLLECTDIR'}/perllib/${collection}builder.pm") {
+	$builderdir = "$ENV{'GSDLCOLLECTDIR'}/perllib";
+	$buildertype = "${collection}builder";
+    } else {	
+
+	$builderdir = undef;
+	if ($buildtype ne "") {
+	    # caters for extension-based build types, such as 'solr'
+	    $buildertype = $buildtype."builder";
+	}
+	else {
+	    # Default to mgpp
+	    $buildertype = "mgppbuilder";
+	}
+    }
+    # check for extension specific builders 
+    # (that will then be run after main builder.pm
+
+    my @builderdir_list = ($builderdir);
+    my @buildertype_list = ($buildertype);
+    
+    if (defined $orthogonalbuildtypes) {
+	foreach my $obt (@$orthogonalbuildtypes) {
+
+	    push(@builderdir_list,undef); # rely on @INC to find it
+	    push(@buildertype_list,$obt."Builder");
+	}
+    }
+
+    # Set up array of the main builder.pm, followed by any ones
+    # from the extension folders
+    
+    my $num_builders = scalar(@buildertype_list);
+    my @builders = ();
+
+    for (my $i=0; $i<$num_builders; $i++) {
+	my $this_builder;
+	my $this_buildertype = $buildertype_list[$i];
+	my $this_builderdir  = $builderdir_list[$i];
+
+	if ((defined $this_builderdir) && ($this_builderdir ne "")) {
+	    require "$this_builderdir/$this_buildertype.pm";
+	}
+	else {
+	    require "$this_buildertype.pm";
+	}
+
+	eval("\$this_builder = new $this_buildertype(\$site, \$collection, " .
+	     "\$realarchivedir, \$realbuilddir, \$verbosity, " .
+	     "\$maxdocs, \$debug, \$keepold, \$incremental, \$incremental_mode, " .
+	     "\$remove_empty_classifications, " .
+	     "\$out, \$no_text, \$faillog, \$gli)");
+	die "$@" if $@;
+
+	push(@builders,$this_builder);
+    }
+    
+    # Init phase for builders
+    for (my $i=0; $i<$num_builders; $i++) {
+	my $this_buildertype = $buildertype_list[$i];
+	my $this_builderdir  = $builderdir_list[$i];
+	my $this_builder     = $builders[$i];
+
+	$this_builder->init();
+	$this_builder->set_maxnumeric($maxnumeric);
+    
+	if (($this_buildertype eq "mgppbuilder") && $no_strip_html) {
+	    $this_builder->set_strip_html(0);
+	}
+	if ($sections_index_document_metadata ne "never") {
+	    $this_builder->set_sections_index_document_metadata($sections_index_document_metadata);
+	}
+    }
+        
+    # Run the requested passes
+
+  # Parallel Building Support
+  # - if parallel building is requested then we subvert the normal 'all' mode
+  #   process, insert attempting to create an XML 'recipe' for building this
+  #   collection. We then pass this recipe to an Open MPI augmented compiled
+  #   executable (which will in turn make multiple calls back to buildcol.pl
+  #   according to the instructions in the recipe)!
+  if ($parallel)
+  {
+    print $out "*** parallel building\n";
+    # Some infodb modes (namely GDBMServer at the moment) need to open the
+    # connection to the database in such a way that it persists over the
+    # child threads. We do this by adding a dummy call to build the file path
+    # to archiveinf-doc as it is the database in question. The '1' at the end
+    # means launch the server... it will then persist until this block passes
+    # out of scope (presumably after all the child mpi processes are done)
+    my $arcinfo_doc_filename = &dbutil::get_infodb_file_path($collectcfg->{'infodbtype'}, "archiveinf-doc", $archivedir, 1);
+
+    # we initially create the recipe as a datastructure to make it easier for
+    # each builder to determine what has already been defined
+    # - each step of the recipe will have a command as a string and a (possibly
+    #   empty) array of steps that depend on this step (possibly recursive)
+    print $out "Generating build 'recipe'\n";
+    my $recipe = [];
+    # pass to each builder to have it populated with appropriate commands
+    map { local $_=$_; $_->prepare_build_recipe($collection, $recipe); } @builders;
+    # now write the recipe to an XML file, resolving any path macros
+    my $max_parallel_tasks = scalar(@{$recipe});
+    my $xml_lines = ();
+    push(@{$xml_lines},'<?xml version="1.0" standalone="no" ?>');
+    push(@{$xml_lines},'<Recipe>');
+    foreach my $item (@{$recipe})
+    {
+      my $max_parallel_child_tasks = &print_recipe($xml_lines, $item);
+      if ($max_parallel_child_tasks > $max_parallel_tasks)
+      {
+        $max_parallel_tasks = $max_parallel_child_tasks;
+      }
+    }
+    push(@{$xml_lines}, '</Recipe>');
+    my $recipe_path = &util::get_tmp_filename('.xml');
+    open(XMLOUT, ">:utf8", $recipe_path) or die("Error! Failed to open recipe file for writing: " . $recipe_path . "\nReason: " . $!);
+    print XMLOUT join("\n", @{$xml_lines});
+    close(XMLOUT);
+    # determine the 'optimal' number of threads (based on number of processor
+    # cores and number of indexes)
+    my $number_of_threads = $max_parallel_tasks + 1; # any more is waste
+    my $number_of_cores = `grep "processor" /proc/cpuinfo | wc -l`;
+    $number_of_cores =~ s/\r?\n//g;
+    print $out "Calculating optimal threads => Max parallel tasks: $max_parallel_tasks, Number of cores: $number_of_cores\n";
+    if ($number_of_cores =~ /^\d+$/ && $max_parallel_tasks > $number_of_cores)
+    {
+      # optimal threads for processor bound load (even though it's probably
+      # IO load that has us bound)
+      $number_of_threads = $number_of_cores + 1;
+    }
+    print $out "Optimal threads: " . $number_of_threads . "\n";
+    # call mpibuildcol executable using mpirun and passing path to recipe
+    #rint "The path *in* Perl: " . $ENV{'PATH'} . "\n";
+    my $mpirun_cmd = 'mpirun -n ' . $number_of_threads . ' mpibuildcol "' . $recipe_path . '"';
+    #$mpirun_cmd = 'echo $PATH; echo $PERLLIB;';
+    print $out "Running command: " . $mpirun_cmd . "\n";
+    print `$mpirun_cmd`;
+    # clean up recipe
+    #unlink($recipe_path);
+  }
+  # Normal mode - run compress text, followed by index building, followed by
+  # infodb
+  elsif ($mode =~ /^all$/i) {
+
+	# 'map' modifies the elements of the original array, so calling
+	# methods -- as done below -- will cause (by default) @builders
+	# to be changed to whatever these functions return (which is *not*
+	# what we want -- we want to leave the values unchanged) 
+	# => Use 'local' (dynamic scoping) to give each 'map' call its
+	#    own local copy This could also be done with: 
+	#      (my $new =$_)->method(); $new 
+	#    but is a bit more cumbersome to write
+	
+	map { local $_=$_; $_->compress_text($textindex); } @builders;
+        # - note we pass the required indexname and indexlevel (if specified)
+        #   to the processor
+	map { local $_=$_; $_->build_indexes($indexname, $indexlevel); } @builders;
+	map { local $_=$_; $_->make_infodatabase(); }  @builders;
+	map { local $_=$_; $_->collect_specific(); } @builders;
+    } elsif ($mode =~ /^compress_text$/i) {
+	map { local $_=$_; $_->compress_text($textindex); } @builders;
+    } elsif ($mode =~ /^build_index$/i) {
+	map { local $_=$_; $_->build_indexes($indexname, $indexlevel); } @builders;
+    } elsif ($mode =~ /^infodb$/i) {
+	map { local $_=$_; $_->make_infodatabase(); } @builders;
+    } else {
+	(&gsprintf(STDERR, "{buildcol.unknown_mode}\n", $mode) && die);
+    }
+
+    if (!$debug && !$parallel) {
+	map {local $_=$_; $_->make_auxiliary_files(); } @builders;
+    }
+    map {local $_=$_; $_->deinit(); } @builders;
+    
+    if (($realbuilddir ne $builddir) && !$debug) {
+	&gsprintf($out, "{buildcol.copying_back_cached_build}\n")
+	    if ($verbosity >= 1);
+	&util::rm_r ($builddir);
+	&util::cp_r ($realbuilddir, $builddir);
+    }
+
+    close OUT if $close_out;
+    close FAILLOG;
+
+    print STDERR "</Build>\n" if $gli;
+}
+
+sub print_recipe
+{
+  my ($xml_lines, $item) = @_;
+  my $max_parallel_tasks = 0;
+
+  # start building up the command in our xml buffer
+  push(@{$xml_lines}, '<Task>');
+  my $command = $item->{'command'};
+  $command =~ s/&/&amp;/g;
+  $command =~ s/</&lt;/g;
+  $command =~ s/>/&gt;/g;
+  push(@{$xml_lines}, '<Command>' . $command . '</Command>');
+
+  # - print children before closing task
+  if (defined $item->{'children'})
+  {
+    $max_parallel_tasks = scalar(@{$item->{'children'}});
+
+    foreach my $child_item (@{$item->{'children'}})
+    {
+      my $max_parallel_child_tasks = &print_recipe($xml_lines, $child_item);
+      if ($max_parallel_child_tasks > $max_parallel_tasks)
+      {
+        $max_parallel_tasks = $max_parallel_child_tasks;
+      }
+    }
+  }
+  # - now we can close the task having printed nested children
+  push(@{$xml_lines},'</Task>');
+  # done
+  return $max_parallel_tasks;
+}
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/bin/script/client.pl
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/bin/script/client.pl	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/bin/script/client.pl	(revision 24799)
@@ -0,0 +1,57 @@
+#!/usr/bin/perl
+
+# Setup Environment
+BEGIN
+{
+  die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+  die "GSDLOS not set\n" unless defined $ENV{'GSDLOS'};
+
+  unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+  unshift (@INC, "$ENV{'GSDLHOME'}/perllib/cpan");
+  unshift (@INC, "$ENV{'GSDLHOME'}/perllib/cpan/XML/XPath");
+  unshift (@INC, "$ENV{'GSDLHOME'}/perllib/plugins");
+  unshift (@INC, "$ENV{'GSDLHOME'}/perllib/classify");
+
+  if (defined $ENV{'GSDLEXTS'})
+  {
+    my @extensions = split(/:/,$ENV{'GSDLEXTS'});
+    foreach my $e (@extensions)
+    {
+      my $ext_prefix = "$ENV{'GSDLHOME'}/ext/$e";
+      unshift (@INC, "$ext_prefix/perllib");
+      unshift (@INC, "$ext_prefix/perllib/cpan");
+      unshift (@INC, "$ext_prefix/perllib/plugins");
+      unshift (@INC, "$ext_prefix/perllib/classify");
+    }
+  }
+  if (defined $ENV{'GSDL3EXTS'})
+  {
+    my @extensions = split(/:/,$ENV{'GSDL3EXTS'});
+    foreach my $e (@extensions)
+    {
+      my $ext_prefix = "$ENV{'GSDL3SRCHOME'}/ext/$e";
+      unshift (@INC, "$ext_prefix/perllib");
+      unshift (@INC, "$ext_prefix/perllib/cpan");
+      unshift (@INC, "$ext_prefix/perllib/plugins");
+      unshift (@INC, "$ext_prefix/perllib/classify");
+    }
+  }
+
+  # Manually installed CPAN package in GEXT*INSTALL
+  unshift (@INC, $ENV{'GEXTPARALLELBUILDING_INSTALLED'} . "/share/perl5");
+}
+
+use strict;
+use warnings;
+
+use SocketsSwimmingThreadPoolClient;
+my $port= shift;
+my $message= shift;
+die "Usage: perl client.pl <port> <string>\n" unless defined($message) && defined($port);
+my $c= SocketsSwimmingThreadPoolClient->new(host=>'localhost',
+                                            port=>$port
+                                           );
+print "Contacting server on localhost:$port\n";
+print "Sent: |$message|\n";
+print "Recv: |" . $c->query($message) . "|\n\n";
+exit;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/bin/script/gdbm-diff.pl
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/bin/script/gdbm-diff.pl	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/bin/script/gdbm-diff.pl	(revision 24799)
@@ -0,0 +1,151 @@
+#!/usr/bin/perl
+
+print "\n";
+print "==================== GDBM Diff ====================\n";
+print "Diff two GDBM files to determine if their key value\n";
+print "pairs differ in any way. Ignores ordering of pairs.\n";
+print "---------------------------------------------------\n";
+print "\n";
+
+# 0. Initialize and check arguments
+# - we'll store all the key value pairs here
+my $data = {};
+my $differences = {};
+# - read in GDBM file paths from the arguments
+if (!defined $ARGV[0] || !-f $ARGV[0])
+{
+  &printUsage('First GDBM file not specified or isn\'t a file');
+}
+my $gdbm_one_path = $ARGV[0];
+if (!defined $ARGV[1] || !-f $ARGV[1])
+{
+  &printUsage('Second GDBM file not specified or isn\'t a file');
+}
+my $gdbm_two_path = $ARGV[1];
+print "GDBM 1: " . $gdbm_one_path . "\n";
+print "GDBM 2: " . $gdbm_two_path . "\n";
+# - also check that GSDLHOME is set and that db2txt is available
+if (!defined $ENV{GSDLHOME})
+{
+  &printUsage('GSDLHOME not set. Please source Greenstone\'s setup.bash first.');
+}
+print "Found Greenstone enviroment\n";
+my $test_result = `db2txt 2>&1`;
+if ($test_result !~ /usage\:\s+db2txt\s+database\-name/i)
+{
+  &printUsage('The program db2txt could not be found. Ensure Greenstone environment is set up properly and that bin/<os>/db2txt exists and it executable.');
+}
+print "Found application db2txt\n"; 
+print "\n";
+
+# 1. Transform the first GDBM file into TXT and then parse in key-value pairs
+#    into a hashmap
+print " * Read in first GDBM file: " . $gdbm_one_path . "\n";
+my $cmd = 'db2txt ' . $gdbm_one_path . ' 2>&1';
+my $txt = `$cmd`;
+# - parse out each key-value pair and store
+while ($txt =~ s/\[([^\]]+)\]\n(.*?)\n\-+\n//s)
+{
+  my $a_key = $1;
+  my $a_value = $2;
+  print " - storing key '" . $a_key . "'\n";
+  print " - value '" . $a_value . "'\n";
+  $data->{$a_key} = $a_value;
+}
+print "   - read " . scalar(keys(%{$data})) . " pairs\n";
+if ($txt =~ /\w/)
+{
+  print "   - left over txt: |" . $txt . "|\n";
+}
+print "\n";
+
+# 2. Now we parse the second GDBM file in a similar fashion, except now we
+#    compare any keys found to ones in the existing data structure. In the
+#    case that the key doesn't exist, then we've found a record in B that
+#    is not in A. In the case it does exist we compare the files to see
+#    if they are the same.
+print " * Read in second GDBM file: " . $gdbm_two_path . "\n";
+my $difference_count = 0;
+$cmd = 'db2txt ' . $gdbm_two_path . ' 2>&1';
+$txt = `$cmd`;
+my $b_pair_count = 0;
+while ($txt =~ s/\[([^\]]+)\]\n(.*?)\n\-+\n//s)
+{
+  my $b_key = $1;
+  my $b_value = $2;
+  print STDERR " - testing key: '" . $b_key . "'\n";
+  print STDERR " - value '" . b_value . "'\n";
+  if (!defined $data->{$b_key})
+  {
+    print STDERR " - couldn't find in A\n";
+    $differences->{$b_key} = 2;
+  }
+  elsif ($data->{$b_key} ne $b_value)
+  {
+    print STDERR " - different value for A\n";
+    $differences->{$b_key} = 3; 
+  }
+  # - no difference. Remove from data structure as we've dealt with this entry
+  else
+  {
+    print STDERR " - the same!\n";
+    delete($data->{$b_key});
+  }
+  $b_pair_count++;
+}
+print "   - read " . $b_pair_count . " pairs\n";
+if ($txt =~ /\w/)
+{
+  print "   - left over txt: |" . $txt . "|\n";
+}
+# - now we tackle the final case, that of records left over (hence were found
+#   in A but not in B).
+foreach my $a_key (keys %{$data})
+{
+  $differences->{$a_key} = 1;
+}
+print "\n";
+
+print "Result: ";
+my $difference_count = scalar keys %{$differences}; 
+if ($difference_count)
+{
+  print "Found " . $difference_count . " differences.\n\n";
+  foreach my $d_key (sort keys %{$differences})
+  {
+    my $d_value = $differences->{$d_key};
+    if ($d_value == 1)
+    {
+      print "   ! only in gdbm one: " . $d_key . "\n";
+    }
+    elsif ($d_value == 2)
+    {
+      print "   ! only in gdbm two: " . $d_key . "\n";
+    }
+    else
+    {
+      print "   ! values for key differ: " . $d_key . "\n";
+    }
+  }
+}
+else
+{
+  print "Files match!\n";
+}
+print "\n";
+
+print "==================== Complete! ====================\n\n";
+
+exit;
+
+sub printUsage
+{
+  my ($msg) = @_;
+  if (defined $msg)
+  {
+    print "Fatal Error! " . $msg . "\n";
+  }
+  print "Usage: gdbm-diff.pl <gdbm db path> <gdbm db path>\n\n";
+  exit;
+}
+# /** printUsage() **/
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/bin/script/manifestinator.pl
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/bin/script/manifestinator.pl	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/bin/script/manifestinator.pl	(revision 24799)
@@ -0,0 +1,36 @@
+#!/usr/bin/perl
+
+use strict;
+
+if (!defined $ARGV[0] || !-d $ARGV[0])
+{
+  print "usage: manifestinator.pl <import directory>\n";
+  exit(0);
+}
+
+my $dir = $ARGV[0];
+if (!opendir(DH, $dir))
+{
+  die ("Failed to open import directory for reading!\n");
+}
+my @files = readdir(DH);
+closedir(DH);
+
+open(XMLOUT, '>:utf8', 'manifest.xml');
+print XMLOUT "<Manifest>\n";
+print XMLOUT "  <Index>\n";
+
+foreach my $file (sort @files)
+{
+  if ($file =~ /^\./)
+  {
+    next;
+  }
+  print XMLOUT "    <Filename>" . $file . "</Filename>\n";
+}
+
+print XMLOUT "  </Index>\n";
+print XMLOUT "</Manifest>\n";
+
+close(XMLOUT);
+exit;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/bin/script/parallel_import.pl
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/bin/script/parallel_import.pl	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/bin/script/parallel_import.pl	(revision 24799)
@@ -0,0 +1,295 @@
+#!/usr/bin/perl -w
+
+###########################################################################
+#
+# import.pl --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+
+# This program will import a number of files into a particular collection
+
+package parallel_import;
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    die "GSDLOS not set\n" unless defined $ENV{'GSDLOS'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib/cpan");
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib/plugins");
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib/plugouts");
+
+    if (defined $ENV{'GSDLEXTS'}) {
+	my @extensions = split(/:/,$ENV{'GSDLEXTS'});
+	foreach my $e (@extensions) {
+	    my $ext_prefix = "$ENV{'GSDLHOME'}/ext/$e";
+
+	    unshift (@INC, "$ext_prefix/perllib");
+	    unshift (@INC, "$ext_prefix/perllib/cpan");
+	    unshift (@INC, "$ext_prefix/perllib/plugins");
+	    unshift (@INC, "$ext_prefix/perllib/plugouts");
+	}
+    }
+    if (defined $ENV{'GSDL3EXTS'}) {
+	my @extensions = split(/:/,$ENV{'GSDL3EXTS'});
+	foreach my $e (@extensions) {
+	    my $ext_prefix = "$ENV{'GSDL3SRCHOME'}/ext/$e";
+
+	    unshift (@INC, "$ext_prefix/perllib");
+	    unshift (@INC, "$ext_prefix/perllib/cpan");
+	    unshift (@INC, "$ext_prefix/perllib/plugins");
+	    unshift (@INC, "$ext_prefix/perllib/plugouts");
+	}
+    }
+}
+
+use strict;
+
+use inexport;
+
+my $oidtype_list = 
+    [ { 'name' => "hash",
+        'desc' => "{import.OIDtype.hash}" },
+      { 'name' => "assigned",
+        'desc' => "{import.OIDtype.assigned}" },
+      { 'name' => "incremental",
+        'desc' => "{import.OIDtype.incremental}" },
+      { 'name' => "dirname",
+        'desc' => "{import.OIDtype.dirname}" } ];
+
+
+# used to control output file format
+my $saveas_list = 
+    [ { 'name' => "GreenstoneXML",
+        'desc' => "{export.saveas.GreenstoneXML}"},
+      { 'name' => "GreenstoneMETS",
+        'desc' => "{export.saveas.GreenstoneMETS}"},
+      ];
+
+
+# Possible attributes for each argument
+# name: The name of the argument
+# desc: A description (or more likely a reference to a description) for this argument
+# type: The type of control used to represent the argument. Options include: string, int, flag, regexp, metadata, language, enum etc
+# reqd: Is this argument required?
+# hiddengli: Is this argument hidden in GLI?
+# modegli: The lowest detail mode this argument is visible at in GLI
+
+my $saveas_argument
+    = { 'name' => "saveas",
+	'desc' => "{import.saveas}",
+	'type' => "enum",
+	'list' => $saveas_list,
+	'deft' => "GreenstoneXML",
+	'reqd' => "no",
+	'modegli' => "3" };
+
+
+my $arguments = 
+    [ 
+      $saveas_argument,
+      { 'name' => "archivedir",
+	'desc' => "{import.archivedir}",
+	'type' => "string",
+	'reqd' => "no",
+        'hiddengli' => "yes" },
+      { 'name' => "importdir",
+	'desc' => "{import.importdir}",
+	'type' => "string",
+	'reqd' => "no",
+        'hiddengli' => "yes" },
+      { 'name' => "collectdir",
+	'desc' => "{import.collectdir}",
+	'type' => "string",
+	# parsearg left "" as default
+	#'deft' => &util::filename_cat ($ENV{'GSDLHOME'}, "collect"),
+	'deft' => "",
+	'reqd' => "no",
+        'hiddengli' => "yes" },
+      { 'name' => "site",
+	'desc' => "{import.site}",
+	'type' => "string",
+	'deft' => "",
+	'reqd' => "no",
+        'hiddengli' => "yes" },
+      { 'name' => "manifest",
+	'desc' => "{import.manifest}",
+	'type' => "string",
+	'deft' => "",
+	'reqd' => "no",
+        'hiddengli' => "yes" },
+      { 'name' => "debug",
+	'desc' => "{import.debug}",
+	'type' => "flag",
+	'reqd' => "no",
+        'hiddengli' => "yes" },
+      { 'name' => "faillog",
+	'desc' => "{import.faillog}",
+	'type' => "string",
+	# parsearg left "" as default
+	#'deft' => &util::filename_cat("&lt;collectdir&gt;", "colname", "etc", "fail.log"),
+	'deft' => "",
+	'reqd' => "no",
+        'modegli' => "3" },
+      { 'name' => "incremental",
+	'desc' => "{import.incremental}",
+	'type' => "flag",
+	'hiddengli' => "yes" },
+      { 'name' => "keepold",
+	'desc' => "{import.keepold}",
+	'type' => "flag",
+	'reqd' => "no",
+	'hiddengli' => "yes" },
+      { 'name' => "removeold",
+	'desc' => "{import.removeold}",
+	'type' => "flag",
+	'reqd' => "no",
+	'hiddengli' => "yes" },
+      { 'name' => "language",
+	'desc' => "{scripts.language}",
+	'type' => "string",
+	'reqd' => "no",
+	'hiddengli' => "yes" },
+      { 'name' => "maxdocs",
+	'desc' => "{import.maxdocs}",
+	'type' => "int",
+	'reqd' => "no",
+	# parsearg left "" as default
+	#'deft' => "-1",
+	'range' => "1,",
+	'modegli' => "1" },
+      # don't set the default to hash - want to allow this to come from
+      # entry in collect.cfg but want to override it here 
+      { 'name' => "OIDtype",
+	'desc' => "{import.OIDtype}",
+	'type' => "enum",
+	'list' => $oidtype_list,
+	# parsearg left "" as default
+	#'deft' => "hash",
+	'reqd' => "no",
+	'modegli' => "2" },
+      { 'name' => "OIDmetadata",
+	'desc' => "{import.OIDmetadata}",
+	'type' => "string",
+	 #'type' => "metadata", #doesn't work properly in GLI
+	# parsearg left "" as default
+	#'deft' => "dc.Identifier",
+	'reqd' => "no",
+	'modegli' => "2" },
+      { 'name' => "out",
+	'desc' => "{import.out}",
+	'type' => "string",
+	'deft' => "STDERR",
+	'reqd' => "no",
+        'hiddengli' => "yes" },
+      { 'name' => "sortmeta",
+	'desc' => "{import.sortmeta}",
+	'type' => "string",
+	#'type' => "metadata", #doesn't work properly in GLI
+	'reqd' => "no",
+	'modegli' => "2" },
+      { 'name' => "removeprefix",
+	'desc' => "{BasClas.removeprefix}",
+	'type' => "regexp",
+	'deft' => "",
+	'reqd' => "no", 
+	'modegli' => "3" },
+      { 'name' => "removesuffix",
+	'desc' => "{BasClas.removesuffix}",
+	'type' => "regexp",
+	'deft' => "",
+	'reqd' => "no",
+	'modegli' => "3" }, 
+      { 'name' => "groupsize",
+	'desc' => "{import.groupsize}",
+	'type' => "int",
+	'deft' => "1",
+	'reqd' => "no",
+	'modegli' => "2" },
+      { 'name' => "gzip",
+	'desc' => "{import.gzip}",
+	'type' => "flag",
+	'reqd' => "no",
+	'modegli' => "3" },
+      { 'name' => "statsfile",
+	'desc' => "{import.statsfile}",
+	'type' => "string",
+	'deft' => "STDERR",
+	'reqd' => "no",
+        'hiddengli' => "yes" },
+      { 'name' => "verbosity",
+	'desc' => "{import.verbosity}",
+	'type' => "int",
+	'range' => "0,",
+	# parsearg left "" as default
+	#'deft' => "2",
+	'reqd' => "no",
+	'modegli' => "3" },
+      { 'name' => "gli",
+	'desc' => "{scripts.gli}",
+	'type' => "flag",
+	'reqd' => "no",
+	'hiddengli' => "yes" },
+      { 'name' => "xml",
+	'desc' => "{scripts.xml}",
+	'type' => "flag",
+	'reqd' => "no",
+	'hiddengli' => "yes" },
+# jobs and epoch added for parallel processing
+# [hs, 1 july 2010]
+      { 'name' => "epoch",
+	'desc' => "{import.epoch}",
+	'type' => "int",
+	'range' => "1,",
+	'deft' => "1",
+	'reqd' => "no",
+	'hiddengli' => "yes" },
+      { 'name' => "jobs",
+	'desc' => "{import.jobs}",
+	'type' => "int",
+	'range' => "1,",
+	'deft' => "1",
+	'reqd' => "no",
+	'hiddengli' => "yes" }];
+
+my $options = { 'name' => "import.pl",
+		'desc' => "{import.desc}",
+		'args' => $arguments };
+
+
+
+
+
+sub main 
+{
+    my $inexport = new inexport("import",\@ARGV,$options);   
+
+    my $collection = $inexport->get_collection();
+    my ($config_filename,$collect_cfg) = $inexport->read_collection_cfg($collection,$options);    
+    $inexport->set_collection_options($collect_cfg);
+    
+    my $pluginfo = $inexport->process_files($config_filename,$collect_cfg);
+
+    $inexport->generate_statistics($pluginfo);
+}
+
+&main();
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/bin/script/reset_memcache_editor.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/bin/script/reset_memcache_editor.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/bin/script/reset_memcache_editor.sh	(revision 24799)
@@ -0,0 +1,16 @@
+#!/bin/sh
+# A swift hack. Sudoedit will call whatever your default editor is,  passing
+# in the name of the tmp file that it has copied to the system file to (and
+# thus created a file that you have write permissions for). Once the 'editor'
+# finishes, sudo copies the tmp file over the top of the system file and
+# restores priviledges. Instead of opening an editor, we can simply clobber
+# the contents of the file with "3" to reset the memory based disk cache. The
+# only other magic needed is to override the default editor to point at this
+# script just before calling the sudoedit command - and thus we can have a non-
+# interactive way to drop memcache.
+#
+# @author John Thompson [jmt12]
+# @author Zach Cutlip [http://shadow-file.blogspot.com/2009/01/how-to-sudoedit-non-interactively.html]
+ECHO=/bin/echo
+$ECHO 3 > "$1";
+exit;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/bin/script/spawn_collections.pl
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/bin/script/spawn_collections.pl	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/bin/script/spawn_collections.pl	(revision 24799)
@@ -0,0 +1,26 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+print "\n===== Spawn Test Collections =====\n\n";
+
+my $base_path = '/research/jmt12/gsdl-64-svn/collect';
+my @collections = ('gdbm','sqlite','tdb');
+my @sizes = (100,500,1000,5000,10000,50000,100000,500000,1000000);
+
+foreach my $collection (@collections)
+{
+    foreach my $size (@sizes)
+    {
+	next if ($collection eq 'tdb' && $size == 5000);
+	my $size_str = sprintf("%07d", $size);
+	my $collection_name = $collection . $size_str;
+	my $collection_path = $base_path . '/' . $collection_name;
+	print " - Creating collection: " . $collection_name . "\n";
+	`mkdir $collection_path`;
+	`ln -s $base_path/$collection/etc $collection_path/etc`;
+	`ln -s $base_path/lorem$size_str/import $collection_path/import`;
+    }
+}
+print "\n===== Complete! =====\n\n";
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/build.xml
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/build.xml	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/build.xml	(revision 24799)
@@ -0,0 +1,19 @@
+<project name="parallel-building" basedir="." default="install">
+  <property environment="env"/>
+  <property name="installdir" value="${basedir}/installed/linux"/>
+  
+  <target name="install">
+    <exec executable="/bin/bash">
+      <arg value="-c"/>
+      <arg value="source setup.bash ; ./CASCADE-MAKE.sh"/>
+    </exec>
+  </target>
+
+  <target name="uninstall">
+    <exec executable="/bin/bash">
+      <arg value="-c"/>
+      <arg value="./CASCADE-MAKE.sh distclean"/>
+    </exec>
+    <delete dir="${installdir}"/>
+  </target>
+</project>
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/devel.bash
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/devel.bash	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/devel.bash	(revision 24799)
@@ -0,0 +1,1 @@
+source cascade-make/lib/cascade-lib.bash GEXTPARALLELBUILDING . $*
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/logs/.svnignore
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/logs/.svnignore	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/logs/.svnignore	(revision 24799)
@@ -0,0 +1,2 @@
+*.err
+*.out
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/packages/.svnignore
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/packages/.svnignore	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/packages/.svnignore	(revision 24799)
@@ -0,0 +1,5 @@
+IPC-Run-0.90
+Proc-Daemon-0.14
+openmpi-1.4.3
+sqlite-3.7.8
+tinyxml-gs-2.6.2
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/packages/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/packages/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/packages/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+list="OPENMPI TINYXML IPCRUN PROCDAEMON"
+
+for d in $list ; do
+  echo "    Running CASCADE-MAKE/$d.sh $*"
+
+  ./CASCADE-MAKE/$d.sh $*
+
+  if [ $? != 0 ] ; then
+    echo "  Error encountered running CASCADE-MAKE/$d.sh"
+    exit 1
+  fi
+done
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/packages/CASCADE-MAKE/IPCRUN.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/packages/CASCADE-MAKE/IPCRUN.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/packages/CASCADE-MAKE/IPCRUN.sh	(revision 24799)
@@ -0,0 +1,27 @@
+#!/bin/bash
+
+package=IPC-Run
+version=-0.90
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTPARALLELBUILDING ../.. $*
+
+prefix=$GEXTPARALLELBUILDING_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_perl_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
+
+
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/packages/CASCADE-MAKE/OPENMPI.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/packages/CASCADE-MAKE/OPENMPI.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/packages/CASCADE-MAKE/OPENMPI.sh	(revision 24799)
@@ -0,0 +1,31 @@
+#!/bin/bash
+
+package=openmpi
+version=-1.4.3
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTPARALLELBUILDING ../.. $*
+
+prefix=$GEXTPARALLELBUILDING_INSTALLED
+
+if [[ ! -e "$GEXTPARALLELBUILDING_INSTALLED/lib/libmpi.so.0.0.2" || ! -e "$GEXTPARALLELBUILDING_INSTALLED/bin/opal_wrapper" || ! -e "$GEXTPARALLELBUILDING_INSTALLED/bin/orterun" ]]
+  then
+    opt_run_untar $force_untar $auto_untar $package $version
+    opt_run_configure $force_config $auto_config $package $version $prefix
+
+    opt_run_make $compile   $package $version
+    opt_run_make $install   $package $version "install"
+    opt_run_make $clean     $package $version "clean"
+    opt_run_make $distclean $package $version "distclean"
+
+    opt_run_tarclean $tarclean $package $version
+  else
+    echo "Open MPI library and binaries already compiled => no need to recompile"
+fi
+
+
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/packages/CASCADE-MAKE/PROCDAEMON.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/packages/CASCADE-MAKE/PROCDAEMON.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/packages/CASCADE-MAKE/PROCDAEMON.sh	(revision 24799)
@@ -0,0 +1,27 @@
+#!/bin/bash
+
+package=Proc-Daemon
+version=-0.14
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTPARALLELBUILDING ../.. $*
+
+prefix=$GEXTPARALLELBUILDING_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_perl_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
+
+
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/packages/CASCADE-MAKE/SQLITE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/packages/CASCADE-MAKE/SQLITE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/packages/CASCADE-MAKE/SQLITE.sh	(revision 24799)
@@ -0,0 +1,31 @@
+#!/bin/bash
+
+package=sqlite
+version=-3.7.8
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTPARALLELBUILDING ../.. $*
+
+prefix=$GEXTPARALLELBUILDING_INSTALLED
+
+if [ ! -e "$GEXTPARALLELBUILDING_INSTALLED/bin/sqlite3" ]
+  then
+    opt_run_untar $force_untar $auto_untar $package $version
+    opt_run_configure $force_config $auto_config $package $version $prefix
+
+    opt_run_make $compile   $package $version
+    opt_run_make $install   $package $version "install"
+    opt_run_make $clean     $package $version "clean"
+    opt_run_make $distclean $package $version "distclean"
+
+    opt_run_tarclean $tarclean $package $version
+  else
+    echo "SQLite$version already compiled => no need to recompile"
+fi
+
+
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/packages/CASCADE-MAKE/TINYXML.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/packages/CASCADE-MAKE/TINYXML.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/packages/CASCADE-MAKE/TINYXML.sh	(revision 24799)
@@ -0,0 +1,31 @@
+#!/bin/bash
+
+package=tinyxml-gs
+version=-2.6.2
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTPARALLELBUILDING ../.. $*
+
+prefix=$GEXTPARALLELBUILDING_INSTALLED
+
+if [ ! -e "$GEXTPARALLELBUILDING_INSTALLED/lib/libtinyxml.a" ]
+  then
+    opt_run_untar $force_untar $auto_untar $package $version
+    opt_run_configure $force_config $auto_config $package $version $prefix
+
+    opt_run_make $compile   $package $version
+    opt_run_make $install   $package $version "install"
+    opt_run_make $clean     $package $version "clean"
+    opt_run_make $distclean $package $version "distclean"
+
+    opt_run_tarclean $tarclean $package $version
+  else
+    echo "TinyXML library already compiled => no need to recompile"
+fi
+
+
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/ClassifyTreeModel.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/ClassifyTreeModel.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/ClassifyTreeModel.pm	(revision 24799)
@@ -0,0 +1,292 @@
+###########################################################################
+#
+# ClassifyTreeModel.pm --
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2006-2010  DL Consulting Ltd
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+
+package ClassifyTreeModel;
+
+use ClassifyTreeNode;
+use strict;
+
+
+# /** Constructor
+#  *
+#  *  @param  $class       The name of the class to bless as a string
+#  *  @param  $collection  The name of the collection whose info database we
+#  *                       will be accessing as a string
+#  *  @param  $root        The oid of the root node of the classifier as a
+#  *                       string
+#  *  @return A reference to the ClassifyTreeModel object
+#  *
+#  *  @author John Thompson, DL Consulting Ltd.
+#  */
+sub new()
+  {
+    my ($class, $collection, $infodbtype, $root) = @_;
+    my $debug = 0;
+    print STDERR "ClassifyTreeModel.new(\"$collection\", $infodbtype, \"$root\")\n" unless !$debug;
+    # Store the variables
+    my $self = {};
+    $self->{'collection'} = $collection;
+    $self->{'infodbtype'} = $infodbtype;
+    $self->{'debug'} = $debug;
+    $self->{'root'} = $root;
+    # Bless me father for I have sinned
+    bless $self, $class;
+    return $self;
+  }
+# /** new() **/
+
+# /** Given a path and a document id, add this document to the classifier tree
+#  *  creating any necessary tree nodes first.
+#  *
+#  *  @param  $value The path to store this document in
+#  *  @param  $oid Unique identifier of a document
+#  *
+#  *  @author John Thompson, DL Consulting Ltd.
+#  */
+sub addDocument()
+  {
+    my ($self, $value, $oid) = @_;
+    print STDERR "ClassifyTreeModel.addDocument(\"$value\", \"$oid\")\n" unless !$self->{'debug'};
+    # Generate a treepath object from the metadata value, remembering to prefix
+    # with the root nodes path
+    my $root_node_obj = $self->getRootNode();
+    my $path_obj = $root_node_obj->getPath();
+    $path_obj->addPathComponent($value);
+    # Ensure that this classifier node, and if necessary its ancestor nodes,
+    # exist in our tree.
+    my $node_obj = $self->getNodeByPath($path_obj);
+    if (!$node_obj)
+      {
+        # The node doesn't exist, so we need to add it
+        $node_obj = $self->addNode($path_obj);
+      }
+    # Add the document to the node.
+    $node_obj->addDocument($oid);
+    # Done.
+  }
+# /** addDocument() **/
+
+# /** Add a node into the tree first ensuring all its parent nodes are inserted
+#  *  to.
+#  *
+#  *  @param  $path_obj The path to insert the new node at
+#  *
+#  *  @author John Thompson, DL Consulting Ltd.
+#  */
+sub addNode()
+  {
+    my ($self, $path_obj) = @_;
+    print STDERR "ClassifyTreeModel.addNode(\"" . $path_obj->toString() . "\")\n" unless !$self->{'debug'};
+    # Ensure the parent exists, assuming we aren't at the root
+    my $parent_path_obj = $path_obj->getParentPath();
+    #rint STDERR "* parent path: " . $parent_path_obj->toString() . "\n";
+    my $parent_node_obj = $self->getNodeByPath($parent_path_obj);
+    #rint STDERR "* does parent node already exist? " . $parent_node_obj . "\n";
+    #rint STDERR "* are we at the root node yet? " . $parent_path_obj->isRootPath() . "\n";
+    if (!$parent_node_obj && !$parent_path_obj->isRootPath())
+      {
+        #rint STDERR "* recursive call!\n";
+        $parent_node_obj = $self->addNode($parent_path_obj);
+      }
+    # Insert this node into it's parent.
+    return $parent_node_obj->insertNode($path_obj);
+  }
+# /** addNode() **/
+
+# /** Retrieve the name of the collection this model is drawing from.
+#  *
+#  *  @return The collection name as a string
+#  *
+#  *  @author John Thompson, DL Consulting Ltd.
+#  */
+sub getCollection()
+  {
+    my ($self) = @_;
+    print STDERR "ClassifyTreeModel.getCollection()\n" unless !$self->{'debug'};
+    return $self->{'collection'};
+  }
+# /** getCollection() **/
+
+sub getInfoDBType()
+{
+  my $self = shift(@_);
+  return $self->{'infodbtype'};
+}
+
+# /** Retrieve a node from this tree based upon its CLID (OID).
+#  *  @param  $clid  The CLID as a string
+#  *  @return The indicated ClassifyTreeNode or null
+sub getNodeByCLID()
+  {
+    my ($self, $clid) = @_;
+    print STDERR "ClassifyTreeModel.getNodeByCLID(\"$clid\")\n" unless !$self->{'debug'};
+    my $result = 0;
+    # Test if this clid is even in our tree
+    if($clid !~ /^$self->{'root'}/)
+      {
+        print STDERR "Requested node $clid, which isn't part of " . $self->{'root'} . "\n";
+        return 0;
+      }
+    # Unfortunately I have to check that there is text to retrieve before I
+    # create a new node.
+
+    my $index_text_directory_path = &util::filename_cat($ENV{'GSDLHOME'}, "collect", $self->getCollection(), "index", "text");
+    my $infodb_file_path = &dbutil::get_infodb_file_path($self->{'infodbtype'}, $self->getCollection(), $index_text_directory_path);
+    if (&dbutil::read_infodb_rawentry($self->{'infodbtype'}, $infodb_file_path, $clid) =~ /\w+/)
+      {
+        # Since the CLID can directly reference the correct entry in the info database we
+        # just create the node and return it
+        $result = new ClassifyTreeNode($self, $clid);
+      }
+    return $result;
+  }
+
+# /** Retrieve a node from this tree based upon a path
+#  *
+#  *  @param  $path  The path to the node as a ClassifyTreePath
+#  *  @return The indicated ClassifyTreeNode or null
+#  *
+#  *  @author John Thompson, DL Consulting Ltd.
+#  */
+sub getNodeByPath()
+  {
+    my ($self, $path_obj) = @_;
+    print STDERR "ClassifyTreeModel.getNodeByPath(\"" . $path_obj->toString() . "\")\n" unless !$self->{'debug'};
+    # Starting at the ROOT of the tree, and with the first path component,
+    # recursively descend through the tree looking for the node - we can assume
+    # that we've found the root node (otherwise we won't be in a tree)
+    my $cur_node_obj = $self->getRootNode();
+    my $cur_path_obj = $cur_node_obj->getPath();
+    my $depth = 1;
+    # Continue till we either find the node we want, or run out a nodes
+    while(!$cur_node_obj->getPath()->equals($path_obj))
+      {
+        # Append the path component at this depth to the current path we
+        # are searching for
+        $cur_path_obj->addPathComponent($path_obj->getPathComponent($depth));
+        $depth++;
+        #rint STDERR "Searching " . $cur_node_obj->getPath()->toString() . "'s children for: " . $cur_path_obj->toString() . "\n";
+        # Search through the current nodes children, looking for one that
+        # matches the current path
+        my $found = 0;
+        foreach my $child_node_obj ($cur_node_obj->getChildren())
+          {
+            #rint STDERR "* testing " . $child_node_obj->getPath()->toString() . "\n";
+            if($child_node_obj->getPath()->equals($cur_path_obj))
+              {
+                $cur_node_obj = $child_node_obj;
+                $found = 1;
+                last;
+              }
+          }
+        # Couldn't find any node with this path
+        if(!$found)
+          {
+            #rint STDERR "* no such node exists!\n";
+            return 0;
+          }
+      }
+    return $cur_node_obj;
+  }
+# /** getChild() **/
+
+# /** Retrieve the parent node of the given node.
+#  *
+#  *  @param  $child_node The node whose parent we want to retrieve
+#  *  @return The parent node, or 0 if this is the root
+#  *
+#  *  @author John Thompson, DL Consulting Ltd.
+#  */
+sub getParentNode()
+  {
+    my ($self, $child_node) = @_;
+    print STDERR "ClassifyTreeModel.getParentNode()\n" unless !$self->{'debug'};
+    return $child_node->getParentNode();
+  }
+# /** getParentNode() **/
+
+sub getRootNode()
+{
+  my ($self) = @_;
+  print STDERR "ClassifyTreeModel.getRootNode()\n" unless !$self->{'debug'};
+  return new ClassifyTreeNode($self, $self->{'root'});
+}
+
+# /** Remove the given document from the classifier tree, and then remove any
+#  *  empty nodes if required.
+#  *
+#  *  @param  $value The value which contains the path of the node to remove
+#  *                 the document from
+#  *  @param  $oid The unique identifier of the document to remove
+#  *  @param  $remove_empty Sets whether empty nodes are removed
+#  *
+#  *  @author John Thompson, DL Consulting Ltd.
+#  */
+sub removeDocument()
+  {
+    my ($self, $path, $oid, $remove_empty) = @_;
+    print STDERR "ClassifyTreeModel.removeDocument(\"$path\",\"$oid\",$remove_empty)\n" unless !$self->{'debug'};
+    # Append to root path
+    my $root_node_obj = $self->getRootNode();
+    my $path_obj = $root_node_obj->getPath();
+    $path_obj->addPathComponent($path);
+    # Retrieve the node in question
+    my $node_obj = $self->getNodeByPath($path_obj);
+    # Check we retrieved a node
+    if ($node_obj)
+      {
+        # Remove the document
+        $node_obj->removeDocument($oid);
+        # If we have been asked to remove empty nodes, do so now.
+        if ($remove_empty)
+          {
+            my $cur_node_obj = $node_obj;
+            my $empty_node_obj = 0;
+            while ($cur_node_obj->getNumLeafDocs() == 0)
+              {
+                $empty_node_obj = $cur_node_obj;
+                $cur_node_obj = $cur_node_obj->getParentNode();
+              }
+            if ($empty_node_obj)
+              {
+                # Try to retrieve the parent of this node
+                my $parent_node_obj = $empty_node_obj->getParentNode();
+                # As long as we have a parent (i.e. we aren't the root node) go
+                # ahead and delete this subtree starting at empty node
+                if ($parent_node_obj)
+                  {
+                    $parent_node_obj->removeNode($empty_node_obj);
+                  }
+              }
+          }
+      }
+    # If the node doesn't exist in this tree, then we can't very well remove
+    # anything from it!
+  }
+# /** removeDocument() **/
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/ClassifyTreeNode.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/ClassifyTreeNode.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/ClassifyTreeNode.pm	(revision 24799)
@@ -0,0 +1,743 @@
+###########################################################################
+#
+# ClassifyTreeNode.pm --
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2006-2010  DL Consulting Ltd
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+
+package ClassifyTreeNode;
+
+use ClassifyTreeNode;
+use ClassifyTreePath;
+use strict;
+
+
+# /** Constructor
+#  *
+#  *
+#  *  @author John Thompson, DL Consulting Ltd.
+#  */
+sub new()
+  {
+    my ($class, $model, $clid, $force_new) = @_;
+    my $debug = 0;
+    $force_new = 0 unless defined($force_new);
+    print STDERR "ClassifyTreeNode.new(model, \"$clid\", $force_new)\n" unless !$debug;
+    $force_new = 0 unless defined($force_new);
+    # Test the parameters
+    die("Can't create a tree node that doesn't belong to a tree model!") unless $model;
+    die("Can't create a tree node that doesn't have a unique id (OID)!") unless $clid;
+    # Store the variables
+    my $self = {};
+    $self->{'debug'} = $debug;
+    $self->{'model'} = $model;
+    $self->{'clid'} = $clid;
+
+    my $collection = $model->getCollection();
+    $self->{'infodbtype'} = $model->getInfoDBType();
+
+    my $index_text_directory_path = &util::filename_cat($ENV{'GSDLHOME'}, "collect", $collection, "index", "text");
+    $self->{'infodb_file_path'} = &dbutil::get_infodb_file_path($self->{'infodbtype'}, $collection, $index_text_directory_path);
+
+    # Check if this node already exists in the database, and if not insert it
+    # now
+    my $text = &dbutil::read_infodb_rawentry($self->{'infodbtype'}, $self->{'infodb_file_path'}, $clid);
+    if($text !~ /\w+/ && $force_new)
+      {
+	my $infodb_file_handle = &dbutil::open_infodb_write_handle($self->{'infodbtype'}, $self->{'infodb_file_path'}, "append");
+	&dbutil::write_infodb_entry($self->{'infodbtype'}, $infodb_file_handle, $clid, &dbutil::convert_infodb_string_to_hash("<doctype>classify\n<hastxt>0\n<childtype>VList\n<Title>\n<numleafdocs>0\n<contains>\n"));
+	&dbutil::close_infodb_write_handle($self->{'infodbtype'}, $infodb_file_handle);
+      }
+    # Bless me father for I have sinned
+    bless $self, $class;
+    return $self;
+  }
+# /** new() **/
+
+# /** Add a document to this tree node.
+#  *
+#  *  @param  $oid The unique identifier of the document to add
+#  *
+#  *  @author John Thompson, DL Consulting Ltd
+#  */
+sub addDocument()
+  {
+    my ($self, $oid) = @_;
+    print STDERR "ClassifyTreeNode.addDocument(\"$oid\")\n" unless !$self->{'debug'};
+    # Get the current contains list
+    my $contains = $self->getContains();
+    # See whether this document already exists in the contains
+    if ($contains !~ /(^$oid$|^$oid;$|;$oid;|;$oid$)/)
+      {
+        # If not, append to the contains list
+        if ($contains ne "")
+          {
+            $contains .= ";$oid";
+          }
+        else
+          {
+            $contains = $oid;
+          }
+        # Store the changed contains
+        $self->setContains($contains);
+        # We now have to update the numleafdocs count for this node and its
+        # ancestor nodes
+        my $cur_node_obj = $self;
+        while ($cur_node_obj)
+          {
+            my $numleafdocs = $cur_node_obj->getNumLeafDocs();
+            if ($numleafdocs =~ /^\d+$/)
+              {
+                $numleafdocs ++;
+              }
+            else
+              {
+                $numleafdocs = 1;
+              }
+            $cur_node_obj->setNumLeafDocs($numleafdocs);
+            $cur_node_obj = $cur_node_obj->getParentNode();
+          }
+      }
+    else
+      {
+        print STDERR "Document already exists!\n" unless !$self->{'debug'};
+      }
+  }
+# /** addDocument() **/
+
+# /** Changes the CLID of a particular node. Note that this is significantly
+#  *  tricky step, as we have to remove the old node from the database, and
+#  *  then readd with the corrected CLID.
+#  *
+#  *  @param  $clid The new CLID as an integer
+#  *
+#  *  @author John Thompson, DL Consulting Ltd.
+#  */
+sub changeCLID()
+  {
+    my($self, $new_clid) = @_;
+    print STDERR "ClassifyTreeNode.changeCLID(\"$new_clid\")\n" unless !$self->{'debug'};
+    # Store the current clid for later use
+    my $old_clid = $self->{'clid'};
+    # And record the children now, as they'll change after we shift the parent
+    # CLID
+    my @child_nodes = $self->getChildren();
+
+    # Retrieve the current document
+    my $text = $self->toString();
+
+    my $collection = $self->{'model'}->getCollection();
+
+    # Create a new document with the correct CLID
+    my $infodb_file_handle = &dbutil::open_infodb_write_handle($self->{'infodbtype'}, $self->{'infodb_file_path'}, "append");
+    &dbutil::write_infodb_entry($self->{'infodbtype'}, $infodb_file_handle, $new_clid, &dbutil::convert_infodb_string_to_hash($text));
+    # Remove the old document
+    &dbutil::delete_infodb_entry($self->{'infodbtype'}, $infodb_file_handle, $self->{'clid'});
+    &dbutil::close_infodb_write_handle($self->{'infodbtype'}, $infodb_file_handle);
+
+    # Finally, change the clid stored in this document
+    $self->{'clid'} = $new_clid;
+
+    # Now go through this nodes children, and shift them too
+    foreach my $child_node (@child_nodes)
+      {
+        # We determine the new clid by retrieving the childs current clid,
+        # and then replacing any occurance to the parents old clid with the
+        # parents new clid
+        my $old_child_clid = $child_node->getCLID();
+        #rint STDERR "* considering: " . $old_child_clid . "\n";
+        if($old_child_clid =~ /^CL/)
+          {
+            my $new_child_clid = $new_clid . substr($old_child_clid, length($old_clid));
+            #rint STDERR "* shifting child $old_child_clid to $new_child_clid\n";
+            $child_node->changeCLID($new_child_clid);
+          }
+      }
+  }
+# /** changeCLID() **/
+
+
+# /** Retrieve the unique id for this classifier.
+#  *
+#  *  @return The CLID as a string
+#  *
+#  *  @author John Thompson, DL Consulting Ltd.
+#  */
+sub getCLID()
+  {
+    my ($self) = @_;
+    print STDERR "ClassifyTreeNode.getCLID()\n" unless !$self->{'debug'};
+    return $self->{'clid'};
+  }
+
+# /** Return the child objects of this node an as array.
+#  *
+#  *  @return An array of node objects
+#  *
+#  *  @author John Thompson, DL Consulting Ltd.
+#  */
+sub getChildren()
+  {
+    my ($self) = @_;
+    print STDERR "ClassifyTreeNode.getChildren()\n" unless !$self->{'debug'};
+    my $text = $self->toString();
+    my @children = ();
+    # Retrieve the contains metadata item
+    if($text =~ /<contains>(.*?)\r?\n/)
+      {
+        #rint STDERR "* children formed from contains: $1\n";
+        my $contains_raw = $1;
+        my @contains = split(/;/, $contains_raw);
+        foreach my $child_clid (@contains)
+          {
+            # Replace the " with the parent clid
+            $child_clid =~ s/\"/$self->{'clid'}/;
+            # Create the node obj
+            my $child_node_obj = new ClassifyTreeNode($self->{'model'}, $child_clid);
+            # And insert into ever growing array of child nodes
+            push(@children, $child_node_obj);
+          }
+      }
+    return @children;
+  }
+# /** getChildren() **/
+
+# /** Retrieve the contains metadata which is used to determine this nodes
+#  *  children.
+#  *
+#  *  @return The contains metadata as a string
+#  *
+#  *  @author John Thompson, DL Consulting Ltd.
+#  */
+sub getContains()
+  {
+    my ($self) = @_;
+    print STDERR "ClassifyTreeNode.getContains()\n" unless !$self->{'debug'};
+    my $result = 0;
+    my $text = $self->toString();
+    if($text =~ /<contains>(.*?)\r?\n/)
+      {
+        $result = $1;
+        # Replace " with this nodes CLID
+        $result =~ s/\"/$self->{'clid'}/g;
+      }
+    return $result;
+  }
+# /** getContains() **/
+
+# /** Retrieve this nodes next sibling.
+#  *
+#  *  @return The next sibling node object or 0 if no such node
+#  *
+#  *  @author John Thompson, DL Consulting Ltd.
+#  */
+sub getNextSibling()
+  {
+    my ($self) = @_;
+    print STDERR "ClassifyTreeNode.getNextSibling()\n" unless !$self->{'debug'};
+    my $sibling_node = 0;
+    # The next sibling would be the node identified by the CLID with its
+    # suffix number one greater than this nodes CLID.
+    my @clid_parts = split(/\./, $self->{'clid'});
+    my $suffix = pop(@clid_parts);
+    $suffix++;
+    push(@clid_parts, $suffix);
+    my $next_clid = join(".", @clid_parts);
+
+    my $collection = $self->{'model'}->getCollection();
+
+    # Now determine if this node exists.
+    if (&dbutil::read_infodb_rawentry($self->{'infodbtype'}, $self->{'infodb_file_path'}, $next_clid) =~ /\w+/)
+      {
+        # And if so, create it.
+        $sibling_node = new ClassifyTreeNode($self->{'model'}, $next_clid);
+      }
+    # Done
+    return $sibling_node;
+  }
+# /** getNextSibling() **/
+
+# /** Retrieve the numleafdocs metadata which if affected by any changes to
+#  *  child nodes.
+#  *
+#  *  @return The numleafdocs as an integer
+#  *
+#  *  @author John Thompson, DL Consulting Ltd.
+#  */
+sub getNumLeafDocs()
+  {
+    my ($self) = @_;
+    print STDERR "ClassifyTreeNode.getNumLeafDocs()\n" unless !$self->{'debug'};
+    my $result = 0;
+    my $text = $self->toString();
+    if($text =~ /<numleafdocs>(\d*?)\r?\n/)
+      {
+        $result = $1;
+      }
+    return $result;
+  }
+# /** getNumLeafDocs() **/
+
+# /** Retrieve the parent node of the given node.
+#  *
+#  *  @param  $child_node The node whose parent we want to retrieve
+#  *  @return The parent node, or 0 if this is the root
+#  *
+#  *  @author John Thompson, DL Consulting Ltd.
+#  */
+sub getParentNode()
+  {
+    my ($self) = @_;
+    print STDERR "ClassifyTreeNode.getParentNode()\n" unless !$self->{'debug'};
+    my $parent_node = 0;
+    my $child_clid = $self->getCLID();
+    my @clid_parts = split(/\./, $child_clid);
+    if(scalar(@clid_parts) > 1)
+      {
+        pop(@clid_parts);
+        my $parent_clid = join(".", @clid_parts);
+        $parent_node = $self->{'model'}->getNodeByCLID($parent_clid);
+      }
+    # Otherwise we are already at the root node
+    return $parent_node;
+  }
+# /** getParentNode() **/
+
+# /** Retrieve the path to this node.
+#  *
+#  *  @return The path obj which represents the path to this node or 0 if no
+#  *          path information exists
+#  *
+#  *  @author John Thompson, DL Consulting Ltd.
+#  */
+sub getPath()
+  {
+    my ($self) = @_;
+    print STDERR "ClassifyTreeNode.getPath()\n" unless !$self->{'debug'};
+    my $result = 0;
+    my $text = $self->toString();
+    if($text =~ /<Title>(.*?)\r?\n/ )
+      {
+        my $this_component = $1;
+        # If this node has a parent, then retrieve its path
+        my $parent_node = $self->getParentNode();
+        if ($parent_node)
+          {
+            # Get the path...
+            $result = $parent_node->getPath();
+            # ... and add our component
+            $result->addPathComponent($this_component);
+          }
+        else
+          {
+            $result = new ClassifyTreePath($this_component);
+          }
+      }
+    return $result;
+  }
+# /** getPath() **/
+
+# /** Retrieve the title of this node. This returns essentially the same
+#  *  information as getPath, but without the encapsulating object.
+#  *
+#  *  @return The title as a string
+#  *
+#  *  @author John Thompson, DL Consulting Ltd.
+#  */
+sub getTitle()
+  {
+    my ($self) = @_;
+    print STDERR "ClassifyTreeNode.getTitle()\n" unless !$self->{'debug'};
+    my $result = 0;
+    my $text = $self->toString();
+    if($text =~ /<Title>(.*?)\r?\n/)
+      {
+        $result = $1;
+      }
+    return $result;
+  }
+# /** getTitle() **/
+
+# /** Using the given value locate the correct position to insert a new node,
+#  *  create it, and then establish it in the database.
+#  *
+#  *  @param  $path The path used to determine where to insert node as a string
+#  *  @return The newly inserted node object
+#  *
+#  *  @author John Thompson, DL Consulting Ltd.
+#  */
+sub insertNode()
+  {
+    my ($self, $path) = @_;
+    print STDERR "ClassifyTreeNode.insertNode(\"$path\")\n" unless !$self->{'debug'};
+    my $child_clid = "";
+    my $child_node = 0;
+    my $new_contains = "";
+    # Get the children of this node
+    my @children = $self->getChildren();
+    # If there are no current children, then this will be the first
+    if (scalar(@children) == 0)
+      {
+        #rint STDERR "ClassifyTreeNode.insertNode: first child!\n";
+        $child_clid = $self->{'clid'} . ".1"; # First child
+        # Contains needs to have this new clid added
+        $new_contains = $child_clid;
+      }
+    # Otherwise search through the current children, looking at their values
+    # to locate where to insert this node.
+    else
+      {
+        #rint STDERR "ClassifyTreeNode.insertNode: searching for position...\n";
+        my $found = 0;
+        my $offset = 1;
+        foreach my $sibling_node (@children)
+          {
+            my $sibling_path = $sibling_node->getPath();
+            # If we are still searching for the insertion point
+            if(!$found)
+              {
+                if($sibling_path->toString() eq $path->toString())
+                  {
+                    # What?!? This node already exists! why are we adding it again!
+                    print STDERR "ClassifyTreeNode.insertNode: what?!? node already exists... how did we get here?\n";
+                    return $sibling_node;
+                  }
+                elsif($sibling_path->toString() gt $path->toString())
+                  {
+                    # Found our location!
+                    $found = 1;
+                    $child_clid = $self->{'clid'} . "." . $offset;
+                    # You may notice we haven't added this node to contains.
+                    # This is because the parent node already contains this
+                    # clid - instead we need to record the new highest clid
+                    # created when we move the sibling nodes for here onwards
+                    # up one space.
+                    #rint STDERR "ClassifyTreeNode.insertNode: found our location: $child_clid \n";
+                    last;
+                  }
+              }
+            $offset++;
+          }
+        # If we haven't found the node, we insert at the end.
+        if(!$found)
+          {
+            #rint STDERR "ClassifyTreeNode.insertNode not found... insert at end \n";
+            $child_clid = $self->{'clid'} . "." . $offset;
+            # Contains needs to have this new clid added
+            $new_contains = $child_clid;
+          }
+        # If we did find the node, we now have to go through the sibling nodes
+        # shifting them up one CLID to ensure there's space.
+        else
+          {
+            # We need another copy of children, but this time with the last 
+            # children first!
+            @children = reverse $self->getChildren();
+            my $offset2 = scalar(@children) + 1;
+            foreach my $sibling_node (@children)
+              {
+                $sibling_node->changeCLID($self->{'clid'} . "." . $offset2);
+                # If this if the highest sibling node we are going to rename,
+                # then use it to set the contains metadata.
+                if($new_contains !~ /\w+/)
+                  {
+                    $new_contains = $self->{'clid'} . "." . $offset2;
+                  }
+                # Once we've processed the node exactly in the space the new
+                # node will occupy, we're done.
+                $offset2--;
+                if($offset2 == $offset)
+                  {
+                    last;
+                  }
+              }
+          }
+      }
+    $child_node = new ClassifyTreeNode($self->{'model'}, $child_clid, 1);
+    # Set the value, as this is the only piece of metadata we know and care
+    # about at this stage
+    $child_node->setTitle($path->getLastPathComponent());
+    # Update the contains metadata for this node
+    my $contains = $self->getContains();
+    if($contains =~ /\w/)
+      {
+        $contains .= ";" . $new_contains;
+      }
+    else
+      {
+        $contains = $new_contains;
+      }
+    $self->setContains($contains);
+    # And return the node
+    return $child_node;
+  }
+# /** insertNode() **/
+
+# /** Remove all the children of this node and return the number of document
+#  *  references (leaf nodes) removed by this process.
+#  *
+#  *  @return The count of document references removed as an integer
+#  *
+#  *  @author John Thompson, DL Consulting Ltd
+#  */
+sub removeAllNodes()
+  {
+    my ($self) = @_;
+    print STDERR "ClassifyTreeNode.removeAllNodes()\n" unless !$self->{'debug'};
+    my $num_leaf_docs = 0;
+    # Recursively remove this nodes children
+    my @children = $self->getChildren();
+    foreach my $child_node (@children)
+      {
+        $child_node->removeAllNodes();
+      }
+    # Retrieve the document count (leaf docs)
+    my $text = $self->toString();
+    if ($text =~ /<numleafdocs>(\d+)/)
+      {
+        $num_leaf_docs += $1;
+      }
+    # Now remove the node from the database
+    my $infodb_file_handle = &dbutil::open_infodb_write_handle($self->{'infodbtype'}, $self->{'infodb_file_path'}, "append");
+    &dbutil::delete_infodb_entry($self->{'infodbtype'}, $infodb_file_handle, $self->{'clid'});
+    &dbutil::close_infodb_write_handle($self->{'infodbtype'}, $infodb_file_handle);
+
+    # Return the leaf count (so we can adjust the numleafdocs at the root node
+    # of this deletion.
+    return $num_leaf_docs;
+  }
+# /** removeAllNodes() **/
+
+# /** Remove the given document this node, and then update the numleafdocs
+#  *  metadata for all the ancestor nodes.
+#  *
+#  *  @param  $oid The unique identifier of a greenstone document
+#  *
+#  *  @author John Thompson, DL Consulting Ltd.
+#  */
+sub removeDocument()
+  {
+    my ($self, $oid) = @_;
+    print STDERR "ClassifyTreeNode::removeDocument(\"$oid\")\n" unless !$self->{'debug'};
+    # Retrieve the contains metadata
+    my $contains = $self->getContains();
+    # Remove this oid
+    my @contains_parts = split(/;/, $contains);
+    my @new_contains_parts = ();
+    foreach my $oid_or_clid (@contains_parts)
+      {
+        if ($oid ne $oid_or_clid && $oid_or_clid =~ /[\w\d]+/)
+          {
+            push(@new_contains_parts, $oid_or_clid);
+          }
+      }
+    $contains = join(";", @new_contains_parts);
+    $self->setContains($contains);
+    # We now have to update the numleafdocs count for this node and its
+    # ancestor nodes
+    my $cur_node_obj = $self;
+    while ($cur_node_obj)
+      {
+        my $numleafdocs = $cur_node_obj->getNumLeafDocs();
+        if ($numleafdocs =~ /^\d+$/)
+          {
+            $numleafdocs--;
+          }
+        else
+          {
+            $numleafdocs = 0;
+          }
+        $cur_node_obj->setNumLeafDocs($numleafdocs);
+        $cur_node_obj = $cur_node_obj->getParentNode();
+      }
+    # Done
+  }
+# /** removeDocument() **/
+
+# /** Remove the node denoted by the path.
+#  *
+#  *  @param  $child_node The node to be removed
+#  *
+#  *  @author John Thompson, DL Consulting Ltd
+#  */
+sub removeNode()
+  {
+    my ($self, $child_node) = @_;
+    # Not as easy as it first sounds as we have to do a recursive remove,
+    # keeping track of any documents removed so we can update document count.
+    # We then remove this node, adjusting the sibling's clid's as necessary
+    # before altering the contains.
+    print STDERR "ClassifyTreeNode::removeNode(child_node)\n" unless !$self->{'debug'};
+    my $remove_clid = $child_node->getCLID();
+    my $sibling_node = $child_node->getNextSibling();
+    # Recursively remove this nodes and its children, taking note of decrease
+    # in document count.
+    my $removed_numleafdocs = $child_node->removeAllNodes();
+    # Determine if removing this node requires other nodes to be moved, and if
+    # so, do so. We do this in a repeating loop until there are no further
+    # siblings, overwriting the $remove_clid variable with the clid of the node
+    # just changed (you'll see why in a moment).
+    while ($sibling_node != 0)
+      {
+        my $current_node = $sibling_node;
+        # Get this nodes sibling
+        $sibling_node = $current_node->getNextSibling();
+        # Record the CLID to change to
+        my $new_clid = $remove_clid;
+        # Record the old clid
+        $remove_clid = $current_node->getCLID();
+        # Modify the clid of the current node
+        $current_node->changeCLID($new_clid);
+        # Continue until there are no further sibling nodes
+      }
+    # By now the $remove_clid will contain the CLID that has to be removed from
+    # the contains metadata for this node
+    my $contains = $self->getContains();
+    my @contains_parts = split(/;/, $contains);
+    my @new_contains_parts = ();
+    foreach my $oid_or_clid (@contains_parts)
+      {
+        if ($remove_clid ne $oid_or_clid && $oid_or_clid =~ /[\w\d]+/)
+          {
+            push(@new_contains_parts, $oid_or_clid);
+          }
+      }
+    $contains = join(";", @new_contains_parts);
+    $self->setContains($contains);
+    # We also alter the numleafdocs metadata to reflect the removal of these
+    # nodes.
+    my $numleafdocs = $self->getNumLeafDocs();
+    if ($numleafdocs =~ /^\d+$/)
+      {
+        $numleafdocs -= $removed_numleafdocs;
+      }
+    else
+      {
+        $numleafdocs = 0;
+      }
+    $self->setNumLeafDocs($numleafdocs);
+    # Done
+  }
+# /** removeNode() **/
+
+# /** Set the contains metadata in the database.
+#  *
+#  *  @param  $contains The new contains string
+#  *
+#  *  @author John Thompson, DL Consulting Ltd.
+#  */
+sub setContains()
+  {
+    my ($self, $contains) = @_;
+    print STDERR "ClassifyTreeNode::setContains(\"$contains\")\n" unless !$self->{'debug'};
+    # Replace any occurance of this nodes CLID with "
+    $contains =~ s/$self->{'clid'}/\"/g;
+
+    my $collection = $self->{'model'}->getCollection();
+    my $clid = $self->{'clid'};
+
+    # Load the text of this node
+    my $text = &dbutil::read_infodb_rawentry($self->{'infodbtype'}, $self->{'infodb_file_path'}, $clid);
+
+    # Replace the contains
+    #rint STDERR "Before: $text\n";
+    $text =~ s/<contains>.*?\n+/<contains>$contains\n/;
+    #rint STDERR "After:  $text\n";
+    # Store the changed text
+    my $infodb_file_handle = &dbutil::open_infodb_write_handle($self->{'infodbtype'}, $self->{'infodb_file_path'}, "append");
+    &dbutil::write_infodb_entry($self->{'infodbtype'}, $infodb_file_handle, $clid, &dbutil::convert_infodb_string_to_hash($text));
+    &dbutil::close_infodb_write_handle($self->{'infodbtype'}, $infodb_file_handle);
+  }
+# /** setContains() **/
+
+# /** Set the numleafdocs metadata in the database.
+#  *
+#  *  @param  $numleafdocs The new count of leaf documents
+#  *
+#  *  @author John Thompson, DL Consulting Ltd.
+#  */
+sub setNumLeafDocs()
+  {
+    my ($self, $numleafdocs) = @_;
+    print STDERR "ClassifyTreeNode::setNumLeafDocs(numleafdocs)\n" unless !$self->{'debug'};
+
+    my $collection = $self->{'model'}->getCollection();
+    my $clid = $self->{'clid'};
+
+    # Load the text of this node
+    my $text = &dbutil::read_infodb_rawentry($self->{'infodbtype'}, $self->{'infodb_file_path'}, $clid);
+    # Replace the numleafdocs
+    $text =~ s/<numleafdocs>\d*?\n+/<numleafdocs>$numleafdocs\n/;
+    # Store the changed text
+    my $infodb_file_handle = &dbutil::open_infodb_write_handle($self->{'infodbtype'}, $self->{'infodb_file_path'}, "append");
+    &dbutil::write_infodb_entry($self->{'infodbtype'}, $infodb_file_handle, $clid, &dbutil::convert_infodb_string_to_hash($text));
+    &dbutil::close_infodb_write_handle($self->{'infodbtype'}, $infodb_file_handle);
+  }
+# /** setNumLeafDocs() **/
+
+# /** Set the title metadata in the database.
+#  *  Note: Previously this was value and we extracted the title, but the new
+#  *        autohierarchies don't set values.
+#  *
+#  *  @param  $title The new title string
+#  *
+#  *  @author John Thompson, DL Consulting Ltd.
+#  */
+sub setTitle()
+  {
+    my ($self, $title) = @_;
+    print STDERR "ClassifyTreeNode::setTitle(\"$title\")\n" unless !$self->{'debug'};
+
+    my $collection = $self->{'model'}->getCollection();
+    my $clid = $self->{'clid'};
+
+    # Load the text of this node
+    my $text = &dbutil::read_infodb_rawentry($self->{'infodbtype'}, $self->{'infodb_file_path'}, $clid);
+    # Replace the title
+    $text =~ s/<Title>.*?\n+/<Title>$title\n/;
+    # Store the changed text
+    my $infodb_file_handle = &dbutil::open_infodb_write_handle($self->{'infodbtype'}, $self->{'infodb_file_path'}, "append");
+    &dbutil::write_infodb_entry($self->{'infodbtype'}, $infodb_file_handle, $clid, &dbutil::convert_infodb_string_to_hash($text));
+    &dbutil::close_infodb_write_handle($self->{'infodbtype'}, $infodb_file_handle);
+  }
+# /** setValue() **/
+
+# /** Represent this node as a string.
+#  *
+#  * @return The string representation of this node
+#  *
+#  * @author John Thompson, DL Consulting Ltd.
+#  */
+sub toString()
+  {
+    my ($self) = @_;
+    print STDERR "ClassifyTreeNode::toString()\n" unless !$self->{'debug'};
+    my $collection = $self->{'model'}->getCollection();
+    my $clid = $self->{'clid'};
+
+    my $text = &dbutil::read_infodb_rawentry($self->{'infodbtype'}, $self->{'infodb_file_path'}, $clid);
+    return $text;
+  }
+# /** toString() **/
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/ClassifyTreePath.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/ClassifyTreePath.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/ClassifyTreePath.pm	(revision 24799)
@@ -0,0 +1,195 @@
+###########################################################################
+#
+# ClassifyTreePath.pm --
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2006-2010  DL Consulting Ltd
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+
+package ClassifyTreePath;
+
+use strict;
+
+
+# /** Construct a new tree path object based on the given value path.
+#  *
+#  *  @param  $class  The name of the class to bless as a string
+#  *  @param  $path   The path as a pip delimited string
+#  *  @return A reference to the ClassifyTreePath object
+#  *
+#  *  @author John Thompson, DL Consulting Ltd.
+#  */
+sub new()
+  {
+    my ($class, $path) = @_;
+    my $debug = 0;
+    print STDERR "ClassifyTreePath.new(\"$path\")\n" unless !$debug;
+    # Store the variables
+    my $self = {};
+    $self->{'debug'} = $debug;
+    $self->{'path'} = $path;
+    # Bless me father for I have sinned
+    bless $self, $class;
+    return $self;
+  }
+# /** new() **/
+
+# /** Adds a new path component on to the end of the current path.
+#  *
+#  *  @param  $component The new component to add as a string
+#  *
+#  *  @author John Thompson, DL Consulting Ltd.
+#  */
+sub addPathComponent()
+  {
+    my ($self, $component) = @_;
+    print STDERR "ClassifyTreePath.addPathComponent(\"$component\")\n" unless !$self->{'debug'};
+    if($self->{'path'} =~ /\w+/)
+      {
+        $self->{'path'} .= "|" . $component;
+      }
+    else
+      {
+        $self->{'path'} = $component;
+      }
+  }
+# /** addPathComponent() **/
+
+# /** Compare this path against another for equality.
+#  *
+#  *  @param  $other_path_obj The path object to compare to
+#  *  @return 1 if the paths match, 0 otherwise
+#  *
+#  *  @author John Thompson, DL Consulting Ltd.
+#  */
+sub equals()
+  {
+    my ($self, $other_path_obj) = @_;
+    print STDERR "ClassifyTreePath.equals()\n" unless !$self->{'debug'};
+    return $self->{'path'} eq $other_path_obj->toString();
+  }
+# /** equals() **/
+
+# /** Extracts the first path component from the path.
+#  *
+#  * @return The first path component as a string
+#  *
+#  * @author John Thompson, DL Consulting Ltd.
+#  */
+sub getFirstPathComponent()
+  {
+    my ($self) = @_;
+    print STDERR "ClassifyTreePath.getFirstPathComponent()\n" unless !$self->{'debug'};
+    my @path = split(/\|/, $self->{'path'});
+    return $path[0];
+  }
+# /** getFirstPathComponent() **/
+
+# /** Extracts the last path component from the path.
+#  *
+#  * @return The last path component as a string
+#  *
+#  * @author John Thompson, DL Consulting Ltd.
+#  */
+sub getLastPathComponent()
+  {
+    my ($self) = @_;
+    print STDERR "ClassifyTreePath.getLastPathComponent()\n" unless !$self->{'debug'};
+    my @path = split(/\|/, $self->{'path'});
+    return @path[scalar(@path) - 1];
+  }
+# /** getLastPathComponent() **/
+
+# /** Return a path object which is the parent path of this one.
+#  *
+#  * @return The parent path object
+#  *
+#  * @author John Thompson, DL Consulting Ltd.
+#  */
+sub getParentPath()
+  {
+    my ($self) = @_;
+    print STDERR "ClassifyTreePath.getParentPath()\n" unless !$self->{'debug'};
+    my $result = 0;
+    my @path = split(/\|/, $self->{'path'});
+    if (scalar(@path) > 0)
+      {
+        pop(@path);
+        $result = new ClassifyTreePath(join("|", @path));
+      }
+    return $result;
+  }
+# /** getParentPath() **/
+
+# /** Retrieves the path component located at the indicated index.
+#  *
+#  *  @param  $index  The index of the component as an integer
+#  *  @return The component as a string, or 0 if index out of range
+#  *
+#  *  @author John Thompson, DL Consulting Ltd.
+#  */
+sub getPathComponent()
+  {
+    my ($self, $index) = @_;
+    print STDERR "ClassifyTreePath.getPathComponent($index)\n" unless !$self->{'debug'};
+    my $result = 0;
+    my @path = split(/\|/, $self->{'path'});
+    # Check index is in range
+    if(0 <= $index && $index < scalar(@path))
+      {
+        $result = $path[$index];
+      }
+    return $result;
+  }
+# /** getPathComponent() **/
+
+# /** Determine is this path is the root node one - which it must be if it has
+#  *  one or fewer path components.
+#  *
+#  *  @return true if this is the root path, false otherwise
+#  *
+#  *  @author John Thompson, DL Consulting Ltd.
+#  */
+sub isRootPath()
+  {
+    my ($self, $index) = @_;
+    print STDERR "ClassifyTreePath.isRootPath()\n" unless !$self->{'debug'};
+    my @path = split(/\|/, $self->{'path'});
+    return (scalar(@path) <= 1);
+  }
+# /** isRootPath() **/
+
+# /** Represent this path as a string.
+#  *
+#  * @return The string representation of this path
+#  *
+#  * @author John Thompson, DL Consulting Ltd.
+#  */
+sub toString()
+  {
+    my ($self) = @_;
+    print STDERR "ClassifyTreePath.toString()\n" unless !$self->{'debug'};
+    return $self->{'path'};
+  }
+# /** toString() **/
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/DateExtract.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/DateExtract.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/DateExtract.pm	(revision 24799)
@@ -0,0 +1,278 @@
+package DateExtract;
+
+##use BasPlug; ## no, DON'T use BasPlug, BasPlug uses us....
+use sorttools;
+use strict;
+use util;
+
+#75% of the instances of the word century use full name ordinals
+my %ordinals = ("first" => 1, "second" => 2, "third" => 3, "fourth" => 4,
+             "fifth" => 5, "sixth" => 6, "seventh" => 7, "eighth" => 8,
+             "ninth" => 9, "tenth" => 10, "eleventh" => 11, "twelfth" => 12,
+             "thirteenth" => 13, "fourteenth" => 14, "fifteenth" => 15,
+             "sixteenth" => 16, "seventeenth" => 17, "eighteenth" => 18,
+             "nineteenth" => 19, "twentieth" => 20);
+
+
+             
+
+#definitions for a date grammar.
+my $fulOrd = join('|',(keys %ordinals));
+
+my @months = ("january","february","march","april","may","june","july",
+              "august","september","october","november","december");
+
+my $shortmth = "";
+foreach my $m (@months) { $shortmth .= (substr($m,0,3)."\\.?|"); }
+chop($shortmth);
+
+my $longmth = join('|',@months);
+
+
+my $Qualifier = "(B(\\.)?C(\\.)?(E(\\.)?)?)|(A(\\.)?D(\\.)?)|(C(\\.)E(\\.)?)";
+my $Century = "Cent(\\.|ur(y|ies))";
+my $Ord = "st|nd|rd|th";
+my $seasonref = "(spring|fall|autumn|winter|summer)";
+my $sep = " ?- ?";
+my $tri_digit = "(in|since|(the year)|($seasonref of)) \\d{3}\\D( ($Qualifier))?";
+my $centurydate = "(((\\d{1,2})($Ord))|($fulOrd)) ($Century)( ($Qualifier))?";
+my $qualified = "(($Qualifier) ?(\\d{1,4}))|((\\d{1,4}) ?($Qualifier))";
+my $millenium = "[1-9]\\d{3}";
+my $range = "(($millenium)($sep)($millenium))|(($millenium)($sep)(\\d{1,2}))|(($qualified)($sep)($qualified))|(($Qualifier) ?(\\d{1,3})($sep)(\\d{1,3}))|((\\d{1,3})($sep)(\\d{1,3}) ?($Qualifier))";
+
+my $pgnum = "(p(p|g)?\\.? ?\\d+((-|,)(\\d+))?)|(page \\d+)|(pages \\d+((-|,)(\\d+))?)";
+my $lgnum = "\\d{1,3},(\\d{3})+";
+my $colon = ":\\d+";
+my $money = "\$(\\d{1,3}(((,\\d{3})+)|\\d+))";  $money = "\\" . $money; 
+my $microfilm = " reel([^\\.\\)])*(\\.|\\))";
+my $lastaltered = "last (edited|updated)";
+my $references = "reference(s?)(:?)\\n";
+my $cited = "work(s?) cited";
+my $biblio = "bibliography(:?)( ?)\\n";
+
+my $direction = "(N(\\.|o\\.|th\\.|orth))|(S(\\.|th\\.|outh))|(E(\\.|ast))|(W(\\.|est))";
+my $street_id = "(st\\.)|(street[^A-Za-z])|(ave\\.)|(avenue[^A-Za-z])|(boulevard[^A-Za-z])|(blvd\\.)|(rd\\.)|(road[^A-Za-z])";
+my $streetname = "(\\d{1,2}(<SUP>)?($Ord)(</SUP>)?)|([A-Za-z]+( [A-Za-z]+)?)|([A-Za-z]+-[A-Za-z]+($Ord))";
+my $address = "\\d{1,4} (($direction) )?($streetname) ($street_id)";
+
+my $bracket = "\\($millenium\\)";
+my $ref_end = ", ?$millenium\\)";
+my $colonsp = ": $millenium";
+my $reprint = "[Rr]eprint of \\d{4} edition";
+my $comma = ", $millenium\\.";
+my $fullstop = "\\. $millenium\\.";
+my $semi = "; $millenium\\.";
+
+my $lookalikes = "($pgnum)|($lgnum)|($colon)|($money)|($microfilm)|($address)";
+my $spurious = "($lastaltered)";
+my $bibheader = "($references)|($cited)|($biblio)";
+
+
+sub get_date_metadata {
+    #get the text of the document, the "document object" concerned,
+    #and the current section within the document
+    my ($text, $doc, $cursection, $keep_bib, $max_year, $max_century) = @_;
+    
+    #format a prechristian maximum century value to be negative so that it can
+    #be used in numeric comparison
+    if($max_century =~ /B/)
+    {
+        $max_century = $`;
+        $max_century =~ /\d+/;
+        $max_century = $&;
+        $max_century *=-1
+    }
+   
+    my $extr = &remove_excess($text);    
+    #print "EXTRACTION TEXT:\n $extr";
+    $extr = &remove_tags($extr);
+    if(!$keep_bib){
+        $extr = &remove_biblio($extr);
+    }
+  
+
+    my @datelist = ();
+    while($extr =~ m!($range)|($millenium)|($qualified)|($centurydate)|($tri_digit)!i)
+    { 
+        $extr = $';
+        my $fulldate = $&;
+        if ($fulldate =~ /$centurydate/i)
+        {
+            if($max_century!=-1)
+            {
+
+                my $date = $fulldate; if($date =~ /\d+/) {$date = $&;} 
+                else 
+                {
+                    $date=$fulldate; $date =~ m! ($Century)!i; $date = $`;
+                    $date =~ tr/A-Z/a-z/;
+                    $date = $ordinals{$date};
+                }
+                if($max_century >= $date){
+                    $date = ($date-1)*100 +1;
+                    #if it BC, make it negative
+                    $date = &convert_bc($fulldate,$date);
+                    my $end = $date + 99; 
+                    my @century = ($date..$end);
+                    @datelist = (@datelist,@century);
+                }
+            }
+        }
+        
+        elsif($fulldate =~ /$range/)
+        {
+            $fulldate =~ /$sep/;
+            my @addlist = ();
+            #print "Range: $fulldate\n";
+            my $fullfirst = $`; 
+            my $fullsecond = $'; 
+            $fullfirst =~ /\d+/;
+	    my $first = $&; 
+            $fullsecond =~ /\d+/;
+	    my $second = $&;
+            my $len1 = length($first);
+            my $len2 = length($second);
+            $second = (substr($first,0,($len1-$len2))).$second;
+            $first = &convert_bc($fullfirst,$first);
+            $second = &convert_bc($fullsecond,$second);
+            @addlist = ($first..$second);
+            @datelist = (@datelist,@addlist);
+            
+        }
+        else {
+            
+            my $date = $fulldate; $date =~ /\d+/; $date = $&;  
+            $date = &convert_bc($fulldate,$date);
+            #add the date metadata
+            push(@datelist,$date);
+            #print "datelist @datelist\n"
+        }
+        
+    }
+    
+    if(@datelist){
+        @datelist = sort { $a <=> $b } @datelist;
+        @datelist = &post_process($max_year, @datelist);
+        foreach my $date (@datelist)
+        {
+            if($date>0){
+                $doc->add_metadata($cursection,"Coverage",$date);}
+            else{
+                $doc->add_metadata($cursection,"Coverage","bc".(-1*$date));}
+                
+        }
+    }
+}
+sub convert_bc {
+    my ($full,$num) = @_;
+    if ($full =~ /B/) { $num *= -1; }
+    $num;
+}
+
+sub post_process {
+    my ($max_year, @list) = @_;
+    my @cleanlist = ();
+    my $prev = 0;
+    foreach my $e (@list) {
+        if ($e!=$prev && $e <= $max_year) {
+            push(@cleanlist, $e);
+        }
+        $prev = $e;
+    }
+    @cleanlist;
+}
+
+
+#removes all html tags from that data, as they will not contain dates which
+#are part of the content of the document, and therefore interesting, but do
+#contain date lookalikes
+sub remove_tags {
+    my ($tmp) = @_;
+   
+    my $parsed = "";
+    #while there is still text to be parsed and tags are still found
+    while($tmp=~ m!<([^>])*(>|$)! && $tmp ne "")
+    {
+        $parsed .= $`;#keep all that is not in a tag
+        $tmp = $';    #restart the search after then end of the tag
+    }
+    $parsed .= $tmp; #add anything after the last match
+    $parsed;
+}
+
+
+sub remove_excess {
+    my ($tmp) = @_;
+    my $parsed = "";
+   
+
+    if(($tmp =~ m!($spurious)|($lookalikes)!i) == 0 )
+    { 
+        $parsed = $tmp;
+    }
+    else { 
+        while ($tmp =~ m!($spurious)|($lookalikes)!i 
+               && $tmp ne "")
+        {
+            $parsed .= $`;
+            my $storage = $&;
+            $tmp = $';
+            #match the pattern which indicates most recent alteration 
+            if ($storage =~ m!$lastaltered!i)
+            {
+                #match a four digit year or up until the first / 
+                #(as in last edited 3/97). 
+                $tmp =~ m!($millenium)|(\/)!;
+                $tmp = $';
+            }
+                
+        }
+        
+        $parsed .= $tmp;
+           
+    }
+    #print "Parsed:\n $parsed\n\n";
+    $parsed;
+    
+}
+
+sub remove_biblio{
+    my ($tmp) = @_;
+    my $parsed = "";
+    
+    if($tmp =~ m!$bibheader!i)
+    {
+        $tmp=$`;
+    }
+    
+    $tmp =~ s/( |\t)+/ /g;
+    if(($tmp =~ m!($ref_end)|($bracket)|($colonsp)|($reprint)|($comma)|($fullstop)|($semi)|($seasonref) ($millenium)!i) == 0)
+    {
+        $parsed = $tmp;
+    }
+    else{
+
+        #print "removing bib\n";
+        while ($tmp =~ m!($ref_end)|($bracket)|($colonsp)|($reprint)|($comma)|($fullstop)|($semi)|(($seasonref) ($millenium))|($bibheader)!i && $tmp ne "")
+        {
+            
+            $parsed .= $`;
+            $tmp = $';
+            if($&=~m!($comma)|($fullstop)!)
+            {
+                
+                my $date = $&;
+                if($parsed =~ m!((\d)($Ord)$)|(($shortmth)$)|(($longmth)$)!i)
+                {
+                    $parsed .= $date;
+                }
+            }  
+            
+        }
+                   $parsed .= $tmp;
+    }
+    $parsed;
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/GDBMClient.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/GDBMClient.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/GDBMClient.pm	(revision 24799)
@@ -0,0 +1,86 @@
+#!/usr/bin/perl
+
+# @note Each client represents one database on the server. Whlie the server may
+#       be managing multiple databases, this client references a specific one
+#       using it's index number whenever GDBM queries are sent. Special
+#       commands, however, do not need a database index to work.
+
+package GDBMClient;
+
+# We're going to have to delve into locking (a little) to prevent multiple
+# threads trying to launch the server at once
+use Fcntl qw(:flock);
+
+# A simple multithreaded, socketed, server.
+use SocketsSwimmingThreadPoolClient;
+
+my $debug = 0;
+
+sub new
+{
+  my ($class, $server_lockfile_path) = @_;
+  my $self = {};
+
+  # - Now we wait until we can get a shared lock (after the exclusive
+  #   lock above releases) and then read in the port number that connections
+  #   to the server should be made on.
+  print " * Reading information from lockfile: " . $server_lockfile_path . "\n" if ($debug);
+  open(SLFH, "<" , $server_lockfile_path) or die("Error! Failed to open file for reading: " . $server_lockfile_path . "\nReason: " . $! . "\n");
+  flock(SLFH, LOCK_SH) or die("Error! Cannot lock file for reading: " . $server_lockfile_path . "\nReason: " . $! . "\n");
+  # read communications port
+  my $raw_information = <SLFH>;
+  if ($raw_information =~ /(.+):(\d+)/)
+  {
+    my $host = $1;
+    my $port = $2;
+    # We now create a client that can connect to the specified port
+    print " * Creating Client and connecting to " . $host . ":" . $port . "...\n" if ($debug);
+    $self->{'gdbm_client_handle'} = SocketsSwimmingThreadPoolClient->new(host=>$host,port=>$port);
+  }
+  else
+  {
+    die("Error! Failed to determine host and port number from lockfile: " . $raw_information);
+  }
+  # Done
+  flock(SLFH, LOCK_UN);
+  close(SLFH);
+
+  return bless $self, $class;
+}
+
+# @note command calls don't need a database to work
+sub addListener
+{
+  my ($self, $suffix) = @_;
+  print " * add listener: " . $$ . $suffix . "\n" if ($debug);
+  my $command = '!addlistener:' . $$;
+  if (defined $suffix)
+  {
+    $command .= $suffix;
+  }
+  $self->{'gdbm_client_handle'}->query($command);
+  return 1;
+}
+
+# @note command calls don't need a database to work
+sub removeListener
+{
+  my ($self, $suffix) = @_;
+  print " * remove listener: " . $$ . $suffix . "\n" if ($debug);
+  my $command = '!removelistener:' . $$;
+  if (defined $suffix)
+  {
+    $command .= $suffix;
+  }
+  $self->{'gdbm_client_handle'}->query($command);
+  return 1;
+}
+
+sub query
+{
+  my ($self, $query) = @_;
+  print " * sending query [" . length($query) . " characters]\n" if ($debug);
+  return $self->{'gdbm_client_handle'}->query($query);
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/IncrementalBuildUtils.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/IncrementalBuildUtils.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/IncrementalBuildUtils.pm	(revision 24799)
@@ -0,0 +1,528 @@
+###########################################################################
+#
+# IncrementalBuildUtils.pm -- API to assist incremental building
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2006 DL Consulting Ltd and New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# /** Initial versions of these functions by John Thompson, revisions by
+#  *  and turning it into a package by John Rowe. Used heavily by
+#  *  basebuilder::remove_document() and getdocument.pl
+#  *
+#  *  @version 1.0 Initial version by John Thompson
+#  *  @version 1.1 Addition of get_document and change of get_document_as_xml
+#  *               by John Rowe
+#  *  @version 2.0 Package version including seperation from calling code and
+#  *               modularisation by John Rowe
+#  *
+#  *  @author John Thompson, DL Consulting Ltd.
+#  *  @author John Rowe, DL Consulting Ltd.
+#  */
+###########################################################################
+package IncrementalBuildUtils;
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    die "GSDLOS not set\n" unless defined $ENV{'GSDLOS'};
+
+    my $current_library_paths = join(":",@INC);
+    my $gsdl_perllib_path = $ENV{'GSDLHOME'} . '/perllib';
+    if ($current_library_paths !~ /$gsdl_perllib_path/)
+    {
+      print "IncrementalBuildUtils setting up environment!\n";
+      unshift (@INC, $gsdl_perllib_path); # [jmt12]
+      unshift (@INC, "$ENV{'GSDLHOME'}/perllib/cpan"); # [jmt12]
+      unshift (@INC, "$ENV{'GSDLHOME'}/perllib/plugins"); # [jmt12]
+      unshift (@INC, "$ENV{'GSDLHOME'}/perllib/classify"); # [jmt12]
+    }
+}
+
+use doc;
+use cfgread;
+use colcfg;
+use strict;
+use util;
+
+use ClassifyTreeModel;
+use IncrementalDocument;
+
+# Change debugging to 1 if you want verbose debugging output
+my $debug = 1;
+
+# Ensure the collection specific binaries are on the search path
+my $path_separator = ":";
+if($ENV{'GSDLOS'} =~ /win/) {
+  $path_separator = ";";
+}
+my $os_binary_path = &util::filename_cat($ENV{'GSDLHOME'}, "bin", $ENV{'GSDLOS'});
+if ($ENV{'PATH'} !~ /$os_binary_path/)
+{
+  $ENV{'PATH'} = $os_binary_path . $path_separator . $ENV{'PATH'};
+}
+my $script_path = &util::filename_cat($ENV{'GSDLHOME'}, "bin", "script");
+if ($ENV{'PATH'} !~ /$script_path/)
+{
+  $ENV{'PATH'} = $script_path . $path_separator . $ENV{'PATH'};
+}
+
+# /**
+#  */
+sub addDocument()
+  {
+    my ($collection, $infodbtype, $doc_obj, $section, $updateindex) = @_;
+
+    $updateindex = 0 unless defined($updateindex);
+
+    print STDERR "IncrementalBuildUtils::addDocument('$collection',$infodbtype,$doc_obj,'$section')\n" unless !$debug;
+    # Gonna need to know in several places whether this is the top section
+    # of the document or not
+    my $is_top = ($section eq $doc_obj->get_top_section());
+
+    # Retrieve all of the metadata from this document object only - not any
+    # child documents
+    my $metadata = $doc_obj->get_all_metadata($section);
+    # Check and add the docnum first
+    my $found_docnum = 0;
+    foreach my $pair (@$metadata)
+      {
+        my ($key, $value) = (@$pair);
+        if ($key eq "docnum")
+          {
+            &setDocumentMetadata($collection, $infodbtype, $doc_obj->get_OID() . "$section", $key, "", $value, $updateindex);
+            $found_docnum = 1;
+          }
+      }
+
+    if (!$found_docnum)
+      {
+        die("Fatal Error! Tried to add document without providing docnum");
+      }
+
+    # Add it piece by piece - this depends on the loading of a blank document
+    # working the way it should.
+    foreach my $pair (@$metadata)
+      {
+        my ($key, $value) = (@$pair);
+        if ($key ne "Identifier" && $key ne "docnum" && $key !~ /^gsdl/ && defined $value && $value ne "")
+          {
+            # escape problematic stuff
+            $value =~ s/\\/\\\\/g;
+            $value =~ s/\n/\\n/g;
+            $value =~ s/\r/\\r/g;
+            if ($value =~ /-{70,}/)
+              {
+                # if value contains 70 or more hyphens in a row we need
+                # to escape them to prevent txt2db from treating them
+                # as a separator
+                $value =~ s/-/&\#045;/gi;
+              }
+            # Go ahead and set the metadata
+            &setDocumentMetadata($collection, $infodbtype, $doc_obj->get_OID() . "$section", $key, "", $value, $updateindex);
+          }
+      }
+    # We now have to load the browselist node too. We create a ClassifyTreeNode
+    # based on a dummy model.
+    # Note: only if section is the top section
+    if ($is_top)
+      {
+        my $dummy_model = new ClassifyTreeModel($collection, $infodbtype, "");
+        my $browselist_node = new ClassifyTreeNode($dummy_model, "browselist");
+        # Add the document
+        $browselist_node->addDocument($doc_obj->get_OID());
+      }
+    # We now recursively move through the document objects child sections,
+    # adding them too. As we do this we build up a contains list for this
+    # document.
+    my $section_ptr = $doc_obj->_lookup_section($section);
+    my @contains = ();
+    if (defined $section_ptr)
+      {
+        foreach my $subsection (@{$section_ptr->{'subsection_order'}}) {
+          &addDocument($collection, $infodbtype, $doc_obj, "$section.$subsection");
+          push(@contains, "\".$subsection");
+        }
+      }
+    # Done - clean up
+  }
+# /** addDocument() **/
+
+# /** Sets the metadata attached to a given document. This will update, at most,
+#  *  three different locations:
+#  *  1. The Lucene index must be updated. This will involve removing any
+#  *     existing value and, if required, adding a new value in its place.
+#  *  2. The info database must be updated. Again any existing value will be
+#  *     removed and, if required, a new value added.
+#  *  3. Finally a check against the collect.cfg will be done to determine if
+#  *     the changed metadata would have an effect on a classifier and, if so
+#  *     the classifier tree will be updated to remove, add or replace any
+#  *     tree nodes or node 'contains lists' as necessary.
+#  *
+#  *  Pseudo Code:
+#  *  ------------
+#  *  To add metadata to the document NT1
+#  *  A. Establish connection to Lucene
+#  *  B. Create a IncrementalDocument object for 'NT1' loading the information
+#  *     from the info database
+#  *  C. Check to see if this metadata is used to build a classifier(s) and if
+#  *     so create the appropriate ClassifyTreeModel(s)
+#  *  D. If removing or replacing metadata:
+#  *     i/   Call ??? to remove key-value from Lucene index
+#  *     ii/  Use removeMetadata() to clear value in IncrementalDocument
+#  *     iii/ Call removeDocument() in ClassifyTreeModel(s) as necessary
+#  *  E. If adding or replacing metadata:
+#  *     i/   Call ??? to add key-value from Lucene index
+#  *     ii/ Use addMetadata() to add value in IncrementalDocument
+#  *     iii/ Call addDocument() in ClassifyTreeModel(s) as necessary
+#  *  F. Complete Lucene transaction
+#  *  G. Save IncrementalDocument to info database
+#  *  Note: ClassifyTreeModel automatically updates the info database as necessary.
+#  *
+#  *  @param  $collection  The name of the collection to update as a string
+#  *  @param  $oid         The unique identifier of a Greenstone document as a
+#  *                       string
+#  *  @param  $key         The key of the metadata being added as a string
+#  *  @param  $old_value   The value of the metadata being removed/replaced
+#  *                       or an empty string if adding metadata
+#  *  @param  $new_value   The value of the metadata being added/replacing
+#  *                       or an empty string if removing metadata
+#  *  @param  $updateindex 1 to get the index updated. This is used to prevent
+#  *                       the indexes being changed when doing an incremental
+#  *                       addition of a new document.
+#  *
+#  *  @author John Thompson, DL Consulting Ltd.
+#  */
+sub setDocumentMetadata()
+  {
+    my ($collection, $infodbtype, $oid, $key, $old_value, $new_value, $updateindex) = @_;
+    print STDERR "IncrementalBuildUtils::setDocumentMetadata('$collection',$infodbtype,'$oid','$key','$old_value','$new_value',$updateindex)\n" unless !$debug;
+    # A. Establish connection to Lucene
+    #    This isn't required at the moment, but might be later if we implement
+    #    Lucene daemon.
+    # B. Create a IncrementalDocument object for 'NT1' loading the information
+    #    from the info database
+    print STDERR "* creating incremental document for $oid\n" unless !$debug;
+    my $doc_obj = new IncrementalDocument($collection, $infodbtype, $oid);
+    $doc_obj->loadDocument();
+    # C. Check to see if this metadata is used to build a classifier(s) and if
+    #    so create the appropriate ClassifyTreeModel(s)
+    print STDERR "* load collection configuration\n" unless !$debug;
+    my $config_obj = &getConfigObj($collection);
+    my $clidx = 1;
+    my @classifier_tree_models = ();
+    foreach my $classifier (@{$config_obj->{'classify'}})
+      {
+        my $index = 0;
+        my $option_count = scalar(@{$classifier});
+        for ($index = 0; $index < $option_count; $index++)
+          {
+            if ($index + 1 < $option_count && @{$classifier}[$index] eq "-metadata" && @{$classifier}[$index + 1] eq $key)
+              {
+                # Create a tree model for this classifier
+                print STDERR "* creating a tree model for classifier: CL$clidx\n" unless !$debug;
+                my $tree_model_obj = new ClassifyTreeModel($collection, $infodbtype, "CL" . $clidx);
+                # And store it for later
+                push(@classifier_tree_models, $tree_model_obj);
+              }
+          }
+        $clidx++;
+      }
+    # D. If removing or replacing metadata:
+    if (defined($old_value) && $old_value =~ /[\w\d]+/)
+      {
+        print STDERR "* removing '$key'='$old_value' from info database for document $oid\n" unless !$debug;
+        # i/   Call ??? to remove key-value from Lucene index
+        #      Moved elsewhere
+        # ii/  Use removeMetadata() to clear value in IncrementalDocument
+        $doc_obj->removeMetadata($key, $old_value);
+        # iii/ Call removeDocument() in ClassifyTreeModel(s) as necessary
+        foreach my $classifier_tree_model (@classifier_tree_models)
+          {
+            print STDERR "* removing '$old_value' from classifier tree\n" unless !$debug;
+            $classifier_tree_model->removeDocument($old_value, $oid, 1);
+          }
+      }
+    # E. If adding or replacing metadata:
+    if (defined($new_value) && $new_value =~ /[\w\d]+/)
+      {
+        print STDERR "* adding '$key'='$new_value' to info database for document $oid\n" unless !$debug;
+        # i/   Call ??? to add key-value from Lucene index
+        #      Moved elsewhere
+        # ii/ Use addMetadata() to add value in IncrementalDocument
+        $doc_obj->addMetadata($key, $new_value);
+        # iii/ Call addDocument() in ClassifyTreeModel(s) as necessary
+        foreach my $classifier_tree_model (@classifier_tree_models)
+          {
+            print STDERR "* adding '$new_value' to classifier tree\n" unless !$debug;
+            $classifier_tree_model->addDocument($new_value, $oid);
+          }
+      }
+    # F. Complete Lucene transaction
+    if(defined($updateindex) && $updateindex)
+      {
+        print STDERR "* updating Lucene indexes\n" unless !$debug;
+        &callGS2LuceneEditor($collection, $doc_obj->getDocNum, $key, $old_value, $new_value);
+      }
+    # G. Save IncrementalDocument to info database
+    $doc_obj->saveDocument();
+    $doc_obj = 0;
+  }
+# /** setDocumentMetadata() **/
+
+# /**
+#  *
+#  */
+sub callGS2LuceneDelete()
+  {
+    my ($collection, $docnum) = @_;
+
+    # Some path information that is the same for all indexes
+    my $classpath = &util::filename_cat($ENV{'GSDLHOME'},"bin","java","LuceneWrap.jar");
+    my $java_lucene = "org.nzdl.gsdl.LuceneWrap.GS2LuceneDelete";
+    my $indexpath = &util::filename_cat($ENV{'GSDLHOME'},"collect",$collection,"index");
+    # Determine what indexes need to be changed by opening the collections
+    # index path and searching for directories named *idx
+    # If the directory doesn't exist, then there is no built index, and nothing
+    # for us to do.
+    if(opendir(INDEXDIR, $indexpath))
+      {
+        my @index_files = readdir(INDEXDIR);
+        closedir(INDEXDIR);
+        # For each index that matches or pattern, we call the java application
+        # to change the index (as necessary - not every index will include the
+        # document we have been asked to modify)
+        foreach my $actual_index_dir (@index_files)
+          {
+            next unless $actual_index_dir =~ /idx$/;
+            # Determine the path to the index to modify
+            my $full_index_dir = &util::filename_cat($indexpath, $actual_index_dir);
+            # Call java to remove the document
+            my $cmd = "java -classpath \"$classpath\" $java_lucene --index $full_index_dir --nodeid $docnum";
+            print STDERR "CMD: " . $cmd . "\n" unless !$debug;
+            # Run command
+            my $result = `$cmd 2>&1`;
+            print STDERR $result unless !$debug;
+          }
+      }
+    # Done
+  }
+# /** callGS2LuceneDelete() **/
+
+# /**
+#  */
+sub callGS2LuceneEditor()
+  {
+    my ($collection, $docnum, $key, $old_value, $new_value) = @_;
+
+    # Some path information that is the same for all indexes
+    my $classpath = &util::filename_cat($ENV{'GSDLHOME'},"collect",$collection,"java","classes");
+    my $jarpath = &util::filename_cat($ENV{'GSDLHOME'},"bin","java","LuceneWrap.jar");
+    my $java_lucene = "org.nzdl.gsdl.LuceneWrap.GS2LuceneEditor";
+    my $indexpath = &util::filename_cat($ENV{'GSDLHOME'},"collect",$collection,"index");
+    # And some commands that don't change
+    my $java_args = "";
+    # Append the node id
+    $java_args .= "--nodeid $docnum ";
+    # We have to convert the given metadata key into its two letter field code.
+    # We do this by looking in the build.cfg file.
+    my $field = &getFieldFromBuildCFG($indexpath, $key);
+    # The metadata field to change
+    $java_args .= "--field $field ";
+    # And the old and new values as necessary
+    if(defined($old_value) && $old_value =~ /[\w\d]+/)
+      {
+        $java_args .= "--oldvalue \"$old_value\" ";
+      }
+    if(defined($new_value) && $new_value =~ /[\w\d]+/)
+      {
+        $java_args .= "--newvalue \"$new_value\" ";
+      }
+    # Determine what indexes need to be changed by opening the collections
+    # index path and searching for directories named *idx
+    # If the directory doesn't exist, then there is no built index, and nothing
+    # for us to do.
+    # We also check if the field is something other than "". It is entirely
+    # possible that we have been asked to update a metadata field that isn't
+    # part of any index, so this is where we break out of editing the index if
+    # we have
+    if($field =~ /^\w\w$/ && opendir(INDEXDIR, $indexpath))
+      {
+        my @index_files = readdir(INDEXDIR);
+        closedir(INDEXDIR);
+        # For each index that matches or pattern, we call the java application
+        # to change the index (as necessary - not every index will include the
+        # document we have been asked to modify)
+        foreach my $actual_index_dir (@index_files)
+          {
+            next unless $actual_index_dir =~ /idx$/;
+            # Determine the path to the index to modify
+            my $full_index_dir = &util::filename_cat($indexpath, $actual_index_dir);
+            # And prepend to the command java arguments
+            my $cur_java_args = "--index $full_index_dir " . $java_args;
+            print STDERR "CMD: java -classpath \"$classpath:$jarpath\" $java_lucene $cur_java_args 2>&1\n" unless !$debug;
+            # Run command
+            my $result = `java -classpath \"$classpath:$jarpath\" $java_lucene $cur_java_args 2>&1`;
+            print STDERR $result unless !$debug;
+          }
+      }
+    # Done
+  }
+# /** callGS2LuceneEditor() **/
+
+## Remove a document from the info database and Index.
+#
+#  @param  collection  The collection to alter
+#  @param  oid         The unique identifier of the document to be removed
+##
+sub deleteDocument()
+  {
+    my ($collection, $infodbtype, $oid) = @_;
+    # Load the incremental document to go with this oid, as we need some
+    # information from it.
+    my $doc_obj = new IncrementalDocument($collection, $infodbtype, $oid);
+    $doc_obj->loadDocument();
+    # Check if this object even exists by retrieving the docnum.
+    my $doc_num = $doc_obj->getDocNum();
+    print STDERR "Removing document docnum: $doc_num\n" unless !$debug;
+    if ($doc_num > -1)
+      {
+        # Now write a blank string to this oid in the info database
+	my $index_text_directory_path = &util::filename_cat($ENV{'GSDLHOME'}, "collect", $collection, "index", "text");
+	my $infodb_file_path = &dbutil::get_infodb_file_path($infodbtype, $collection, $index_text_directory_path);
+	my $infodb_file_handle = &dbutil::open_infodb_write_handle($infodbtype, $infodb_file_path, "append");
+	&dbutil::write_infodb_entry($infodbtype, $infodb_file_handle, $oid, &dbutil::convert_infodb_string_to_hash(""));
+        # Remove reverse lookup
+	&dbutil::write_infodb_entry($infodbtype, $infodb_file_handle, $doc_num, &dbutil::convert_infodb_string_to_hash(""));
+	&dbutil::close_infodb_write_handle($infodbtype, $infodb_file_handle);
+
+        # And remove from the database
+        &callGS2LuceneDelete($collection, $doc_num);
+
+        # Regenerate the classifier trees.
+        print STDERR "* load collection configuration\n";# unless !$debug;
+        my $config_obj = &getConfigObj($collection);
+        my $clidx = 1;
+        my %classifier_tree_models = ();
+        foreach my $classifier (@{$config_obj->{'classify'}})
+          {
+            my $index = 0;
+            my $option_count = scalar(@{$classifier});
+            for ($index = 0; $index < $option_count; $index++)
+              {
+                if ($index + 1 < $option_count && @{$classifier}[$index] eq "-metadata")
+                  {
+                    my $key = @{$classifier}[$index + 1];
+                    # Create a tree model for this classifier
+                    print STDERR "* creating a tree model for classifier: CL" . $clidx . " [" . $key . "]\n";# unless !$debug;
+                    my $tree_model_obj = new ClassifyTreeModel($collection, $infodbtype, "CL" . $clidx);
+                    # And store it against its key for later
+                    $classifier_tree_models{$key} = $tree_model_obj;
+                  }
+              }
+            $clidx++;
+          }
+        
+        # For each piece of metadata assigned to this document, if there is a 
+        # matching classifier tree, remove the path from the tree.
+        print STDERR "* searching for classifier paths to be removed\n";
+        
+        my $metadata = $doc_obj->getAllMetadata();
+        foreach my $pair (@$metadata)
+          {
+            my ($key, $value) = @$pair;
+            print STDERR "* testing " . $key . "=>" . $value . "\n";
+            if (defined($classifier_tree_models{$key}))
+              {
+                my $model = $classifier_tree_models{$key};
+                print STDERR "* removing '" . $value . "' from classifier " . $model->getRootNode()->getCLID() . "\n";
+                $model->removeDocument($value, $oid, 1);
+              }
+          }
+
+        # We also have to remove from browselist - the reverse process of
+        # adding to browselist shown above.
+        my $dummy_model = new ClassifyTreeModel($collection, $infodbtype, "");
+        my $browselist_node = new ClassifyTreeNode($dummy_model, "browselist");
+        # Add the document
+        $browselist_node->removeDocument($oid);
+        # Clean up
+      }
+    # else, no document, no need to delete.
+  }
+## deleteDocument() ##
+
+# /**
+#  */
+sub getFieldFromBuildCFG()
+  {
+    my ($indexpath, $key) = @_;
+    my $field = "";
+    my $build_cfg = &util::filename_cat($indexpath, "build.cfg");
+    # If there isn't a build.cfg then the index hasn't been built and there is
+    # nothing to do
+    if(open(BUILDCFG, $build_cfg))
+      {
+        # For each line of the build configuration
+        my $line;
+        while($line = <BUILDCFG>)
+          {
+            # Only interested in the indexfieldmap line
+            if($line =~ /^indexfieldmap\s+/)
+              {
+                # Extract the field information by looking up the key pair
+                if($line =~ /\s$key->(\w\w)/)
+                  {
+                    $field = $1;
+                  }
+              }
+          }
+        # Done with file
+        close(BUILDCFG);
+      }
+    # Return whatever we found
+    return $field;
+  }
+# /** getFieldFromBuildCFG() **/
+
+
+
+
+
+# /** Retrieve an object (associative array) containing information about the
+#  *  collection configuration.
+#  *  @param  $collection The shortname of the collection as a string
+#  *  @return An associative array containing information from the collect.cfg
+#  *  @author John Thompson, DL Consulting Ltd.
+#  */
+sub getConfigObj()
+  {
+    my ($collection) = @_;
+
+    #rint STDERR "getConfigObj()\n" unless !$debug;
+
+    my $colcfgname = &util::filename_cat($ENV{'GSDLHOME'}, "collect", $collection, "etc", "collect.cfg");
+    if (!-e $colcfgname)
+      {
+        die "IncrementalBuildUtils - couldn't find collect.cfg for collection $collection\n";
+      }
+    return &colcfg::read_collect_cfg ($colcfgname);
+  }
+# /** getConfigObj() **/
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/IncrementalDocument.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/IncrementalDocument.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/IncrementalDocument.pm	(revision 24799)
@@ -0,0 +1,252 @@
+###########################################################################
+#
+# IncrementalDocument.pm -- An object to encapsulate the Greenstone 
+#                           document retrieved from the info database.
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2006 DL Consulting Ltd and New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+package IncrementalDocument;
+
+use strict;
+
+
+# /**
+#  */
+sub new()
+  {
+    my ($class, $collection, $infodbtype, $oid) = @_;
+
+    #rint STDERR "IncrementalDocument::new($collection, $infodbtype, $oid)\n";
+
+    # Test the parameters
+    die ("Error! Can't create a document that doesn't belong to a collection!") unless $collection;
+    die ("Error! Can't create a document that doesn't have a unique id (OID)!") unless $oid;
+
+    # Store the variables
+    my $self = {};
+
+    # The collection this document object has been loaded from.
+    $self->{'collection'} = $collection;
+
+    # The infodbtype for the collection
+    $self->{'infodbtype'} = $infodbtype;
+
+    # An associative array of information retrieved from the info database
+    # which maps a key string to a nested associative array listing values.
+    $self->{'data'} = {};
+
+    # The unique identifier of the document loaded
+    $self->{'oid'} = $oid;
+
+    # Stores the order in which metadata keys where discovered/added.
+    $self->{'order'} = {};
+
+    bless $self, $class;
+    return $self;
+  }
+# /** new() **/
+
+# /**
+#  */
+sub addMetadata()
+  {
+    my ($self, $key, $value, $internal) = @_;
+
+    # Validate the arguments
+    die ("Error! Can't add a metadata value to a document without a valid key!") unless $key =~ /[\w]+/;
+    die ("Error! Can't add a metadata key to a document without a valid value!") unless $value =~ /[\w\d]+/;
+
+    # Is this a new key that we haven't encountered before? If so ensure an
+    # array exists for its values, and record the order in which we encountered
+    # this key.
+    if (!defined($self->{'data'}->{$key}))
+      {
+        # Determine how many data keys we're already storing, so we can add the next
+        # one at the appropriate index
+        my $index = scalar(keys %{$self->{'order'}});
+        $self->{'order'}->{$index} = $key;
+        $self->{'data'}->{$key} = {};
+      }
+
+    # Set the value of the associative path to 1.
+    $self->{'data'}->{$key}->{$value} = 1;
+  }
+# /** addMetadata() **/
+
+# /** Retrieve all the metadata of this document as an array of pairs.
+#  *
+#  */
+sub getAllMetadata()
+{
+    my ($self) = @_;
+    my @all_metadata;
+
+    print STDERR "IncrementalDocument.getAllMetadata()\n";
+
+    my $key_count = scalar(keys %{$self->{'order'}});
+    for (my $i = 0; $i < $key_count; $i++)
+      {
+        my $key = $self->{'order'}->{$i};
+        # Check if this key has been set
+        if ($self->{'data'}->{$key})
+          {
+            # Note: there may be zero values left
+            foreach my $value (sort keys %{$self->{'data'}->{$key}})
+              {
+                if ($self->{'data'}->{$key}->{$value})
+                  {
+                    print STDERR "* Storing $key => $value\n";
+                    push(@all_metadata, [$key, $value]);
+                  }
+              }
+          }
+      }
+    print STDERR "Complete!\n";
+    return \@all_metadata;
+  }
+# /** getAllMetadata() **/
+
+# /**
+#  */
+sub getDocNum()
+  {
+    my ($self) = @_;
+    my $docnum = -1;
+    # Check the docnum path exists in the associated data
+    if(defined($self->{'data'}->{'docnum'}))
+      {
+        # Get the list of keys from that associative path
+        my @values = keys (%{$self->{'data'}->{'docnum'}});
+        # And since we know there will only ever be one value for docnum
+        $docnum = $values[0];
+      }
+    return $docnum;
+  }
+# /** getDocNum() **/
+
+# /**
+#  */
+sub loadDocument()
+  {
+    my ($self) = @_;
+    #rint STDERR "IncrementalDocument::loadDocument()\n";
+    # Load the raw text for the document object from the info database
+    my $collection = $self->{'collection'};
+    my $index_text_directory_path = &util::filename_cat($ENV{'GSDLHOME'}, "collect", $collection, "index", "text");
+    my $infodb_file_path = &dbutil::get_infodb_file_path($self->{'infodbtype'}, $collection, $index_text_directory_path);
+    my $text = &dbutil::read_infodb_rawentry($self->{'infodbtype'}, $infodb_file_path, $self->{'oid'});
+    # For each line in the raw text, extract the key (enclosed in angle
+    # brackets) and the value
+    $text =~ s/<([\w\d\.]+)>(.+?)\r?\n/&addMetadata($self, $1, $2, 1)/egs;
+    # Done
+  }
+# /** loadDocument() **/
+
+# /** Locates and removes the given key/value mappings from this document
+#  *  object.
+#  *
+#  *  @param  $self A reference to this IncrementalDocument object
+#  *  @param  $key The metadata key as a string
+#  *  @param  $value The obsolete metadata value as a string
+#  *
+#  *  @author John Thompson, DL Consulting Ltd.
+#  */
+sub removeMetadata()
+  {
+    my ($self, $key, $value) = @_;
+    # Ensure the value doesn't exist by simply setting to 0 the correct
+    # associative path
+    $self->{'data'}->{$key}->{$value} = 0;
+  }
+# /*** removeMetadat() **/
+
+# /**
+#  */
+sub saveDocument()
+  {
+    my ($self) = @_;
+    # Get a textual version of this object
+    my $text = $self->toString();
+
+    # Now store the object in the info database
+    my $collection = $self->{'collection'};
+
+    my $index_text_directory_path = &util::filename_cat($ENV{'GSDLHOME'}, "collect", $collection, "index", "text");
+    my $infodb_file_path = &dbutil::get_infodb_file_path($self->{'infodbtype'}, $collection, $index_text_directory_path);
+    my $infodb_file_handle = &dbutil::open_infodb_write_handle($self->{'infodbtype'}, $infodb_file_path, "append");
+    &dbutil::write_infodb_entry($self->{'infodbtype'}, $infodb_file_handle, $self->{'oid'}, &dbutil::convert_infodb_string_to_hash($text));
+    &dbutil::close_infodb_write_handle($self->{'infodbtype'}, $infodb_file_handle);
+
+    # There is a little bit of extra complexity when saving an incremental
+    # document in that we should ensure that a reverse lookup-from DocNum or
+    # nodeID to Greenstone document hash-exists in the database.
+    my $doc_num = $self->getDocNum();
+    if($doc_num >= 0)
+      {
+	my $text = &dbutil::read_infodb_rawentry($self->{'infodbtype'}, $infodb_file_path, $doc_num);
+
+        # If there is no reverse lookup, then add one now
+        if($text !~ /<section>/)
+          {
+	    $infodb_file_handle = &dbutil::open_infodb_write_handle($self->{'infodbtype'}, $infodb_file_path, "append");
+	    &dbutil::write_infodb_entry($self->{'infodbtype'}, $infodb_file_handle, $doc_num, &dbutil::convert_infodb_string_to_hash("<section>" . $self->{'oid'}));
+	    &dbutil::close_infodb_write_handle($self->{'infodbtype'}, $infodb_file_handle);
+          }
+      }
+    # Done
+    #rint STDERR "Stored document:\n[" . $self->{'oid'} . "]\n$text\n";
+  }
+# /** saveDocument() **/
+
+# /** Produces a textual representation of this object.
+#  *
+#  *  @return A string which describes this incremental document object
+#  *
+#  *  @author John Thompson, DL Consulting Ltd.
+#  */
+sub toString()
+  {
+    my ($self) = @_;
+    my $text = "";
+
+    my $key_count = scalar(keys %{$self->{'order'}});
+    for (my $i = 0; $i < $key_count; $i++)
+      {
+        my $key = $self->{'order'}->{$i};
+        # Check if this key has been set
+        if ($self->{'data'}->{$key})
+          {
+            # Note: there may be zero values left
+            foreach my $value (sort keys %{$self->{'data'}->{$key}})
+              {
+                if ($self->{'data'}->{$key}->{$value})
+                  {
+                    $text .= "<$key>$value\n";
+                  }
+              }
+          }
+      }
+    return $text;
+  }
+# /** toString() **/
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/Kea.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/Kea.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/Kea.pm	(revision 24799)
@@ -0,0 +1,115 @@
+package Kea;
+
+use strict;
+
+# This function is called by BasPlug.pm when a flag in a collection
+# configuration document specifies that keyphrase metadata must be gathered for
+# that collection.
+# It is passed as arguments, the documents text and possibly some options for
+# how the keyphrase data is to be collected if the keyphrase option flag was
+# set in the collection configuration file.  This module then writes the
+# documents text to a file in a temporary directory because the stand-alone program Kea which will be
+# called to do the actual extraction of the keyphrases expects a directory with one or more files as argument.
+# Once Kea has been called upon, the file containing the keyphrase data
+# gathered by Kea should be stored in gsdl/tmp and this file is read, the data
+# we are interested in is extracted and passed back to BasPlug.pm in an
+# appropriate format.
+
+sub get_Kea_directory
+{
+    my $kea_version = shift(@_);
+    return &util::filename_cat($ENV{'GSDLHOME'}, "packages", "kea", "kea-$kea_version");
+}
+
+# returns a string containing comma-separated keyphrases
+sub extract_KeyPhrases
+{
+    my $kea_version = shift(@_);
+    my $doc = shift(@_);  # Document's text  
+    my $args = shift(@_);  # Options
+
+    # Set default models
+    my $kea_home = &get_Kea_directory($kea_version);
+    my $default_model_path = &util::filename_cat($kea_home, "CSTR-20");
+    if ($kea_version eq "4.0") {
+	# Use a different default model for Kea 4.0
+	$default_model_path = &util::filename_cat($kea_home, "FAO-20docs");
+    }
+
+    # Parse the Kea options
+    my $options_string;
+    my @args_list = split(/\s+/, $args) if (defined($args));
+    if (@args_list) {
+	my $model_specified = 0;
+	foreach my $arg (@args_list) {
+	    if (length($arg) == 1) {
+		$options_string .= " -$arg";
+	    }
+	    else {
+		my $option = substr($arg, 0, 1);
+		my $value = substr($arg, 1);
+		if ($option eq "m") {
+		    my $model_path = &util::filename_cat($kea_home, $value);
+		    if (-e $model_path) {
+			$options_string .= " -m $model_path";
+		    }
+		    else {
+			print STDERR "Warning: Couldn't find model $model_path; using the default model instead.\n";
+			$options_string .= " -m $default_model_path";
+		    }
+		    $model_specified = 1;
+		}
+		else {
+		    $options_string .= " -$option $value";
+		}
+	    }
+	}
+
+	# If none of the option specifies the model, use the default one
+	if ($model_specified != 1) {
+	    $options_string .= " -m $default_model_path";
+	}
+    }
+    else {
+	# If no options were specified, use the default model
+	$options_string = "-m $default_model_path";
+    }
+
+    # Remove all HTML tags from the original text
+    $doc =~ s/<P[^>]*>/\n/sgi;
+    $doc =~ s/<H[^>]*>/\n/sgi;
+    $doc =~ s/<[^>]*>//sgi;
+    $doc =~ tr/\n/\n/s;
+
+    # Write text to a temporary file doc.txt
+    my $tmp_directory_path = &util::filename_cat($ENV{'GSDLHOME'}, "tmp");
+    my $doc_txt_file_path = &util::filename_cat($tmp_directory_path, "doc.txt");
+    open(DOC_TXT, ">$doc_txt_file_path") or die "Error: Could not write $doc_txt_file_path in Kea.pm.\n";  
+    print DOC_TXT $doc;
+    close(DOC_TXT);
+
+    # Run Kea with the specified options
+    system("java -classpath \"$kea_home\" KEAKeyphraseExtractor -l $tmp_directory_path $options_string");
+
+    # Read the resulting doc.key file which contains the keyphrases
+    my $doc_key_file_path = &util::filename_cat($tmp_directory_path, "doc.key");
+    if (!open(IN, "<$doc_key_file_path")) {
+	# The doc.key file does not exist (either an option was wrongly specified, or no keyphrases were found)
+	return "";
+    }
+
+    my @keyphrase_list = ();
+    while (<IN>) {
+	chomp;
+	push(@keyphrase_list, $_);
+    }
+    close(IN);
+
+    # Delete doc.key so that in future it will not be opened and read (otherwise KEA sees it as more keyphrases!)
+    unlink($doc_key_file_path);
+
+    my $keyphrases = join(", ", @keyphrase_list);
+    return $keyphrases;
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/ParallelInexport.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/ParallelInexport.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/ParallelInexport.pm	(revision 24799)
@@ -0,0 +1,66 @@
+###########################################################################
+#
+# ParallelInexport.pm -- useful class to support parallel_import.pl
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package ParallelInexport;
+
+use strict;
+
+
+# index the files in parallel using MPI farmer to farm off multiple processes
+# [hs, 1 july 2010]
+sub farm_out_processes
+{
+   my ($jobs, $epoch, $importdir, $block_hash, $collection, $site) = @_;
+
+   my $tmp_dir_path = &util::filename_cat($ENV{'GSDLCOLLECTDIR'}, 'tmp');
+   if (!-d $tmp_dir_path)
+   {
+       mkdir($tmp_dir_path, 0777);
+   }
+
+   my $tmp_filelist = &util::filename_cat($tmp_dir_path, "filelist.txt");
+
+   # create the list of files to import
+   open (my $filelist, ">$tmp_filelist");
+   foreach my $filename (sort keys %{$block_hash->{'all_files'}})
+   {
+       my $full_filename = &util::filename_cat($importdir,$filename);
+       if ((! exists $block_hash->{'file_blocks'}->{$full_filename}) 
+	   && ($filename !~ m/metadata\.xml$/))
+       {
+	   print $filelist "$filename\n";
+       }
+   }
+   close ($filelist); 
+
+   # invoke the farmer to start processing the files
+   $site = "" if (!defined $site);
+   my $gsdlhome = $ENV{'GSDLHOME'};
+   my $farmer_exe = 'mpiimport'; # will be on PATH
+   my $mpi_cmd = "mpirun -np $jobs $farmer_exe $tmp_filelist $epoch $gsdlhome $collection $site";
+   system ($mpi_cmd);
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/README.txt
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/README.txt	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/README.txt	(revision 24799)
@@ -0,0 +1,1 @@
+This directory started life as a complete copy of the perllib directory from a SVN head checkout circa 19 September 2011 (International Talk Like A Pirate Day! Yarr).
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/SocketsSwimmingThreadPoolClient.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/SocketsSwimmingThreadPoolClient.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/SocketsSwimmingThreadPoolClient.pm	(revision 24799)
@@ -0,0 +1,45 @@
+# @author Donnie Cameron (macnod)
+# @url    https://github.com/macnod/DcServer
+# @readme http://donnieknows.com/blog/perl-sockets-swimming-thread-pool
+
+package SocketsSwimmingThreadPoolClient;
+
+use IO::Socket;
+use Carp;
+use strict;
+use warnings;
+
+sub new
+{
+  # Params: host, port
+  my ($proto, %param)= @_;
+  my $class= ref($proto) || $proto;
+  bless +{%param} => $class;
+}
+
+sub stop_server
+{
+  shift->query('$self->stop')
+}
+
+sub query
+{
+  my ($self, $query)= @_;
+  my $socket= new IO::Socket::INET(PeerAddr => $self->{host} || 'localhost',
+                                   PeerPort => $self->{port} || 8191,
+                                   Proto => 'tcp');
+  croak "$!. Is the server running?\n" unless $socket;
+  binmode($socket, ":utf8");
+  print $socket $query . "\n.\n";
+  my $buffer = '';
+  my $reply = '';
+  while($buffer = <$socket>)
+  {
+    $reply.= $buffer;
+    last if $reply =~ s/\n\.\n$//;
+  }
+  $socket->shutdown(2);
+  return $reply;
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/SocketsSwimmingThreadPoolServer.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/SocketsSwimmingThreadPoolServer.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/SocketsSwimmingThreadPoolServer.pm	(revision 24799)
@@ -0,0 +1,134 @@
+# @author Donnie Cameron (macnod)
+# @url    https://github.com/macnod/DcServer
+# @readme http://donnieknows.com/blog/perl-sockets-swimming-thread-pool
+
+package SocketsSwimmingThreadPoolServer;
+
+use lib '.';
+use threads;
+use threads::shared;
+use Thread::Queue;
+use IO::Socket;
+use Time::HiRes qw/sleep/;
+use strict;
+use warnings;
+
+my $stop :shared;
+my $accept_queue = Thread::Queue->new;
+my $closed_queue = Thread::Queue->new;
+
+sub new {
+  # Params: host, port, thread_count, eom_marker, main_yield, main_cb,
+  # done_cb, processor_cb
+  my ($proto, %param)= @_;
+  my $class= ref($proto) || $proto;
+  bless +{
+    socket_defaults => +{
+      LocalHost => $param{host} || 'localhost',
+      LocalPort => $param{port} || 8191},
+    thread_count => $param{thread_count} || 10,
+    main_yield => $param{main_yield} || 5,
+    main_cb => $param{main_cb} || sub {},
+    done_cb => $param{done_cb} || sub {},
+    processor_cb => $param{processor_cb} || \&processor,
+    eom_marker => $param{eom_marker} || "\\n\\.\\n",
+    thread_pool => undef
+  } => $class;
+}
+
+# This callback (for processor_cb) simply explains no other processor function
+# defined.
+sub processor
+{
+  my ($data, $ip, $tid, $fnstop)= @_;
+  return "[tid=$tid; ip=$ip] No function implemented";
+}
+
+sub start
+{
+  my $self= shift;
+
+  # Start a thread to dispatch incoming requests
+  threads->create(sub {$self->accept_requests})->detach;
+
+  # Start the thread pool to handle dispatched requests
+  for (1 .. $self->{thread_count})
+  {
+    threads->create(sub {$self->request_handler})->detach;
+  }
+
+  # Start a loop for performing tasks in the background, while
+  # handling requests
+  $self->main_loop;
+
+  $self->{done_cb}->();
+}
+
+sub stop
+{
+  my $self= shift;
+  $stop= 1;
+}
+
+sub main_loop {
+  my $self= shift;
+  my $counter= 1;
+  until($stop) {
+    $self->{main_cb}->($counter++, sub {$self->stop});
+    sleep $self->{main_yield};
+  }
+}
+
+sub accept_requests {
+  my $self= shift;
+  my ($csocket, $n, %socket);
+  my $lsocket= new IO::Socket::INET(
+    %{$self->{socket_defaults}},
+    Proto => 'tcp',
+    Listen => 1,
+    Reuse => 1);
+  die "Can't create listerner socket. Server can't start. $!." unless $lsocket;
+  until($stop) {
+    $csocket= $lsocket->accept;
+    $n= fileno $csocket;
+    $socket{$n}= $csocket;
+    $accept_queue->enqueue($n . ' ' . inet_ntoa($csocket->peeraddr));
+    while($n= $closed_queue->dequeue_nb) {
+      $socket{$n}->shutdown(2);
+      delete $socket{$n}}}
+  $lsocket->shutdown(2);
+}
+
+sub request_handler
+{
+  my $self= shift;
+  my ($n, $ip, $data);
+  my ($receive_time, $process_time, $send_time);
+  until($stop)
+  {
+    ($n, $ip)= split / /, $accept_queue->dequeue;
+    next unless $n;
+    open my $socket, '+<&=' . $n or die $!;
+    if(defined($data = $self->receive_client_request($socket)))
+    {
+      my $result = $self->{processor_cb}->($data, $ip, threads->tid, sub {$self->stop});
+      print $socket $result, "\n.\n";
+    }
+    close $socket;
+    $closed_queue->enqueue($n);
+  }
+}
+
+sub receive_client_request
+{
+  my ($self, $socket)= @_;
+  my ($eom, $buffer, $data)= $self->{eom_marker};
+  while($buffer= <$socket>)
+  {
+    $data.= $buffer;
+    last if $data =~ s/$eom$//;
+  }
+  return $data;
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/Unicode/Collate/UnicodeLicenseAgreement.txt
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/Unicode/Collate/UnicodeLicenseAgreement.txt	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/Unicode/Collate/UnicodeLicenseAgreement.txt	(revision 24799)
@@ -0,0 +1,17 @@
+UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE
+
+    Unicode Data Files include all data files under the directories http://www.unicode.org/Public/, http://www.unicode.org/reports/, and http://www.unicode.org/cldr/data/ . Unicode Software includes any source code published in the Unicode Standard or under the directories http://www.unicode.org/Public/, http://www.unicode.org/reports/, and http://www.unicode.org/cldr/data/.
+
+    NOTICE TO USER: Carefully read the following legal agreement. BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S DATA FILES ("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"), YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE.
+
+    COPYRIGHT AND PERMISSION NOTICE
+
+    Copyright © 1991-2010 Unicode, Inc. All rights reserved. Distributed under the Terms of Use in http://www.unicode.org/copyright.html.
+
+    Permission is hereby granted, free of charge, to any person obtaining a copy of the Unicode data files and any associated documentation (the "Data Files") or Unicode software and any associated documentation (the "Software") to deal in the Data Files or Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, and/or sell copies of the Data Files or Software, and to permit persons to whom the Data Files or Software are furnished to do so, provided that (a) the above copyright notice(s) and this permission notice appear with all copies of the Data Files or Software, (b) both the above copyright notice(s) and this permission notice appear in associated documentation, and (c) there is clear notice in each modified Data File or in the Software as well as in the documentation associated with the Data File(s) or Software that the data or software has been modified.
+
+    THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA FILES OR SOFTWARE.
+
+    Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in these Data Files or Software without prior written authorization of the copyright holder.
+
+    Unicode and the Unicode logo are trademarks of Unicode, Inc., and may be registered in some jurisdictions. All other trademarks and registered trademarks mentioned herein are the property of their respective owners.
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/Unicode/Collate/allkeys.txt
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/Unicode/Collate/allkeys.txt	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/Unicode/Collate/allkeys.txt	(revision 24799)
@@ -0,0 +1,22542 @@
+# unidata-5.2.0.txt
+# Date: 2009-09-22, 16:23:42 PDT [KW]
+#
+# This file defines the Default Unicode Collation Element Table
+#   (DUCET) for the Unicode Collation Algorithm
+#
+# Copyright (c) 2001-2009 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# See UTS #10, Unicode Collation Algorithm, for more information.
+#
+# Diagnostic weight ranges
+# Primary weight range:   0200..3ACA (14539)
+# Secondary weight range: 0020..0192 (371)
+# Variant secondaries:    0159..015E (6)
+# Digit secondaries:      015F..0192 (52)
+# Tertiary weight range:  0002..001F (30)
+#
+@version 5.2.0
+
+0000  ; [.0000.0000.0000.0000] # [0000] NULL (in 6429)
+0001  ; [.0000.0000.0000.0000] # [0001] START OF HEADING (in 6429)
+0002  ; [.0000.0000.0000.0000] # [0002] START OF TEXT (in 6429)
+0003  ; [.0000.0000.0000.0000] # [0003] END OF TEXT (in 6429)
+0004  ; [.0000.0000.0000.0000] # [0004] END OF TRANSMISSION (in 6429)
+0005  ; [.0000.0000.0000.0000] # [0005] ENQUIRY (in 6429)
+0006  ; [.0000.0000.0000.0000] # [0006] ACKNOWLEDGE (in 6429)
+0007  ; [.0000.0000.0000.0000] # [0007] BELL (in 6429)
+0008  ; [.0000.0000.0000.0000] # [0008] BACKSPACE (in 6429)
+000E  ; [.0000.0000.0000.0000] # [000E] SHIFT OUT (in 6429)
+000F  ; [.0000.0000.0000.0000] # [000F] SHIFT IN (in 6429)
+0010  ; [.0000.0000.0000.0000] # [0010] DATA LINK ESCAPE (in 6429)
+0011  ; [.0000.0000.0000.0000] # [0011] DEVICE CONTROL ONE (in 6429)
+0012  ; [.0000.0000.0000.0000] # [0012] DEVICE CONTROL TWO (in 6429)
+0013  ; [.0000.0000.0000.0000] # [0013] DEVICE CONTROL THREE (in 6429)
+0014  ; [.0000.0000.0000.0000] # [0014] DEVICE CONTROL FOUR (in 6429)
+0015  ; [.0000.0000.0000.0000] # [0015] NEGATIVE ACKNOWLEDGE (in 6429)
+0016  ; [.0000.0000.0000.0000] # [0016] SYNCHRONOUS IDLE (in 6429)
+0017  ; [.0000.0000.0000.0000] # [0017] END OF TRANSMISSION BLOCK (in 6429)
+0018  ; [.0000.0000.0000.0000] # [0018] CANCEL (in 6429)
+0019  ; [.0000.0000.0000.0000] # [0019] END OF MEDIUM (in 6429)
+001A  ; [.0000.0000.0000.0000] # [001A] SUBSTITUTE (in 6429)
+001B  ; [.0000.0000.0000.0000] # [001B] ESCAPE (in 6429)
+001C  ; [.0000.0000.0000.0000] # [001C] FILE SEPARATOR (in 6429)
+001D  ; [.0000.0000.0000.0000] # [001D] GROUP SEPARATOR (in 6429)
+001E  ; [.0000.0000.0000.0000] # [001E] RECORD SEPARATOR (in 6429)
+001F  ; [.0000.0000.0000.0000] # [001F] UNIT SEPARATOR (in 6429)
+007F  ; [.0000.0000.0000.0000] # [007F] DELETE (in 6429)
+0080  ; [.0000.0000.0000.0000] # [0080] <control>
+0081  ; [.0000.0000.0000.0000] # [0081] <control>
+0082  ; [.0000.0000.0000.0000] # [0082] BREAK PERMITTED HERE (in 6429)
+0083  ; [.0000.0000.0000.0000] # [0083] NO BREAK HERE (in 6429)
+0084  ; [.0000.0000.0000.0000] # [0084] <control>
+0086  ; [.0000.0000.0000.0000] # [0086] START OF SELECTED AREA (in 6429)
+0087  ; [.0000.0000.0000.0000] # [0087] END OF SELECTED AREA (in 6429)
+0088  ; [.0000.0000.0000.0000] # [0088] CHARACTER TABULATION SET (in 6429)
+0089  ; [.0000.0000.0000.0000] # [0089] CHARACTER TABULATION WITH JUSTIFICATION (in 6429)
+008A  ; [.0000.0000.0000.0000] # [008A] LINE TABULATION SET (in 6429)
+008B  ; [.0000.0000.0000.0000] # [008B] PARTIAL LINE FORWARD (in 6429)
+008C  ; [.0000.0000.0000.0000] # [008C] PARTIAL LINE BACKWARD (in 6429)
+008D  ; [.0000.0000.0000.0000] # [008D] PARTIAL LINE FEED (in 6429)
+008E  ; [.0000.0000.0000.0000] # [008E] SINGLE SHIFT TWO (in 6429)
+008F  ; [.0000.0000.0000.0000] # [008F] SINGLE SHIFT THREE (in 6429)
+0090  ; [.0000.0000.0000.0000] # [0090] DEVICE CONTROL STRING (in 6429)
+0091  ; [.0000.0000.0000.0000] # [0091] PRIVATE USE ONE (in 6429)
+0092  ; [.0000.0000.0000.0000] # [0092] PRIVATE USE TWO (in 6429)
+0093  ; [.0000.0000.0000.0000] # [0093] SET TRANSMIT STATE (in 6429)
+0094  ; [.0000.0000.0000.0000] # [0094] CANCEL CHARACTER (in 6429)
+0095  ; [.0000.0000.0000.0000] # [0095] MESSAGE WAITING (in 6429)
+0096  ; [.0000.0000.0000.0000] # [0096] START OF GUARDED AREA (in 6429)
+0097  ; [.0000.0000.0000.0000] # [0097] END OF GUARDED AREA (in 6429)
+0098  ; [.0000.0000.0000.0000] # [0098] START OF STRING (in 6429)
+0099  ; [.0000.0000.0000.0000] # [0099] <control>
+009A  ; [.0000.0000.0000.0000] # [009A] SINGLE CHARACTER INTRODUCER (in 6429)
+009B  ; [.0000.0000.0000.0000] # [009B] CONTROL SEQUENCE INTRODUCER (in 6429)
+009C  ; [.0000.0000.0000.0000] # [009C] STRING TERMINATOR (in 6429)
+009D  ; [.0000.0000.0000.0000] # [009D] OPERATING SYSTEM COMMAND (in 6429)
+009E  ; [.0000.0000.0000.0000] # [009E] PRIVACY MESSAGE (in 6429)
+009F  ; [.0000.0000.0000.0000] # [009F] APPLICATION PROGRAM COMMAND (in 6429)
+070F  ; [.0000.0000.0000.0000] # [070F] SYRIAC ABBREVIATION MARK
+180B  ; [.0000.0000.0000.0000] # [180B] MONGOLIAN FREE VARIATION SELECTOR ONE
+180C  ; [.0000.0000.0000.0000] # [180C] MONGOLIAN FREE VARIATION SELECTOR TWO
+180D  ; [.0000.0000.0000.0000] # [180D] MONGOLIAN FREE VARIATION SELECTOR THREE
+200B  ; [.0000.0000.0000.0000] # [200B] ZERO WIDTH SPACE
+200C  ; [.0000.0000.0000.0000] # [200C] ZERO WIDTH NON-JOINER
+200D  ; [.0000.0000.0000.0000] # [200D] ZERO WIDTH JOINER
+200E  ; [.0000.0000.0000.0000] # [200E] LEFT-TO-RIGHT MARK
+200F  ; [.0000.0000.0000.0000] # [200F] RIGHT-TO-LEFT MARK
+202A  ; [.0000.0000.0000.0000] # [202A] LEFT-TO-RIGHT EMBEDDING
+202B  ; [.0000.0000.0000.0000] # [202B] RIGHT-TO-LEFT EMBEDDING
+202C  ; [.0000.0000.0000.0000] # [202C] POP DIRECTIONAL FORMATTING
+202D  ; [.0000.0000.0000.0000] # [202D] LEFT-TO-RIGHT OVERRIDE
+202E  ; [.0000.0000.0000.0000] # [202E] RIGHT-TO-LEFT OVERRIDE
+2060  ; [.0000.0000.0000.0000] # [2060] WORD JOINER
+206A  ; [.0000.0000.0000.0000] # [206A] INHIBIT SYMMETRIC SWAPPING
+206B  ; [.0000.0000.0000.0000] # [206B] ACTIVATE SYMMETRIC SWAPPING
+206C  ; [.0000.0000.0000.0000] # [206C] INHIBIT ARABIC FORM SHAPING
+206D  ; [.0000.0000.0000.0000] # [206D] ACTIVATE ARABIC FORM SHAPING
+206E  ; [.0000.0000.0000.0000] # [206E] NATIONAL DIGIT SHAPES
+206F  ; [.0000.0000.0000.0000] # [206F] NOMINAL DIGIT SHAPES
+FE00  ; [.0000.0000.0000.0000] # [FE00] VARIATION SELECTOR-1
+FE01  ; [.0000.0000.0000.0000] # [FE01] VARIATION SELECTOR-2
+FE02  ; [.0000.0000.0000.0000] # [FE02] VARIATION SELECTOR-3
+FE03  ; [.0000.0000.0000.0000] # [FE03] VARIATION SELECTOR-4
+FE04  ; [.0000.0000.0000.0000] # [FE04] VARIATION SELECTOR-5
+FE05  ; [.0000.0000.0000.0000] # [FE05] VARIATION SELECTOR-6
+FE06  ; [.0000.0000.0000.0000] # [FE06] VARIATION SELECTOR-7
+FE07  ; [.0000.0000.0000.0000] # [FE07] VARIATION SELECTOR-8
+FE08  ; [.0000.0000.0000.0000] # [FE08] VARIATION SELECTOR-9
+FE09  ; [.0000.0000.0000.0000] # [FE09] VARIATION SELECTOR-10
+FE0A  ; [.0000.0000.0000.0000] # [FE0A] VARIATION SELECTOR-11
+FE0B  ; [.0000.0000.0000.0000] # [FE0B] VARIATION SELECTOR-12
+FE0C  ; [.0000.0000.0000.0000] # [FE0C] VARIATION SELECTOR-13
+FE0D  ; [.0000.0000.0000.0000] # [FE0D] VARIATION SELECTOR-14
+FE0E  ; [.0000.0000.0000.0000] # [FE0E] VARIATION SELECTOR-15
+FE0F  ; [.0000.0000.0000.0000] # [FE0F] VARIATION SELECTOR-16
+FEFF  ; [.0000.0000.0000.0000] # [FEFF] ZERO WIDTH NO-BREAK SPACE
+FFF9  ; [.0000.0000.0000.0000] # [FFF9] INTERLINEAR ANNOTATION ANCHOR
+FFFA  ; [.0000.0000.0000.0000] # [FFFA] INTERLINEAR ANNOTATION SEPARATOR
+FFFB  ; [.0000.0000.0000.0000] # [FFFB] INTERLINEAR ANNOTATION TERMINATOR
+1D173 ; [.0000.0000.0000.0000] # [1D173] MUSICAL SYMBOL BEGIN BEAM
+1D174 ; [.0000.0000.0000.0000] # [1D174] MUSICAL SYMBOL END BEAM
+1D175 ; [.0000.0000.0000.0000] # [1D175] MUSICAL SYMBOL BEGIN TIE
+1D176 ; [.0000.0000.0000.0000] # [1D176] MUSICAL SYMBOL END TIE
+1D177 ; [.0000.0000.0000.0000] # [1D177] MUSICAL SYMBOL BEGIN SLUR
+1D178 ; [.0000.0000.0000.0000] # [1D178] MUSICAL SYMBOL END SLUR
+1D179 ; [.0000.0000.0000.0000] # [1D179] MUSICAL SYMBOL BEGIN PHRASE
+1D17A ; [.0000.0000.0000.0000] # [1D17A] MUSICAL SYMBOL END PHRASE
+E0001 ; [.0000.0000.0000.0000] # [E0001] LANGUAGE TAG
+E0020 ; [.0000.0000.0000.0000] # [E0020] TAG SPACE
+E0021 ; [.0000.0000.0000.0000] # [E0021] TAG EXCLAMATION MARK
+E0022 ; [.0000.0000.0000.0000] # [E0022] TAG QUOTATION MARK
+E0023 ; [.0000.0000.0000.0000] # [E0023] TAG NUMBER SIGN
+E0024 ; [.0000.0000.0000.0000] # [E0024] TAG DOLLAR SIGN
+E0025 ; [.0000.0000.0000.0000] # [E0025] TAG PERCENT SIGN
+E0026 ; [.0000.0000.0000.0000] # [E0026] TAG AMPERSAND
+E0027 ; [.0000.0000.0000.0000] # [E0027] TAG APOSTROPHE
+E0028 ; [.0000.0000.0000.0000] # [E0028] TAG LEFT PARENTHESIS
+E0029 ; [.0000.0000.0000.0000] # [E0029] TAG RIGHT PARENTHESIS
+E002A ; [.0000.0000.0000.0000] # [E002A] TAG ASTERISK
+E002B ; [.0000.0000.0000.0000] # [E002B] TAG PLUS SIGN
+E002C ; [.0000.0000.0000.0000] # [E002C] TAG COMMA
+E002D ; [.0000.0000.0000.0000] # [E002D] TAG HYPHEN-MINUS
+E002E ; [.0000.0000.0000.0000] # [E002E] TAG FULL STOP
+E002F ; [.0000.0000.0000.0000] # [E002F] TAG SOLIDUS
+E0030 ; [.0000.0000.0000.0000] # [E0030] TAG DIGIT ZERO
+E0031 ; [.0000.0000.0000.0000] # [E0031] TAG DIGIT ONE
+E0032 ; [.0000.0000.0000.0000] # [E0032] TAG DIGIT TWO
+E0033 ; [.0000.0000.0000.0000] # [E0033] TAG DIGIT THREE
+E0034 ; [.0000.0000.0000.0000] # [E0034] TAG DIGIT FOUR
+E0035 ; [.0000.0000.0000.0000] # [E0035] TAG DIGIT FIVE
+E0036 ; [.0000.0000.0000.0000] # [E0036] TAG DIGIT SIX
+E0037 ; [.0000.0000.0000.0000] # [E0037] TAG DIGIT SEVEN
+E0038 ; [.0000.0000.0000.0000] # [E0038] TAG DIGIT EIGHT
+E0039 ; [.0000.0000.0000.0000] # [E0039] TAG DIGIT NINE
+E003A ; [.0000.0000.0000.0000] # [E003A] TAG COLON
+E003B ; [.0000.0000.0000.0000] # [E003B] TAG SEMICOLON
+E003C ; [.0000.0000.0000.0000] # [E003C] TAG LESS-THAN SIGN
+E003D ; [.0000.0000.0000.0000] # [E003D] TAG EQUALS SIGN
+E003E ; [.0000.0000.0000.0000] # [E003E] TAG GREATER-THAN SIGN
+E003F ; [.0000.0000.0000.0000] # [E003F] TAG QUESTION MARK
+E0040 ; [.0000.0000.0000.0000] # [E0040] TAG COMMERCIAL AT
+E0041 ; [.0000.0000.0000.0000] # [E0041] TAG LATIN CAPITAL LETTER A
+E0042 ; [.0000.0000.0000.0000] # [E0042] TAG LATIN CAPITAL LETTER B
+E0043 ; [.0000.0000.0000.0000] # [E0043] TAG LATIN CAPITAL LETTER C
+E0044 ; [.0000.0000.0000.0000] # [E0044] TAG LATIN CAPITAL LETTER D
+E0045 ; [.0000.0000.0000.0000] # [E0045] TAG LATIN CAPITAL LETTER E
+E0046 ; [.0000.0000.0000.0000] # [E0046] TAG LATIN CAPITAL LETTER F
+E0047 ; [.0000.0000.0000.0000] # [E0047] TAG LATIN CAPITAL LETTER G
+E0048 ; [.0000.0000.0000.0000] # [E0048] TAG LATIN CAPITAL LETTER H
+E0049 ; [.0000.0000.0000.0000] # [E0049] TAG LATIN CAPITAL LETTER I
+E004A ; [.0000.0000.0000.0000] # [E004A] TAG LATIN CAPITAL LETTER J
+E004B ; [.0000.0000.0000.0000] # [E004B] TAG LATIN CAPITAL LETTER K
+E004C ; [.0000.0000.0000.0000] # [E004C] TAG LATIN CAPITAL LETTER L
+E004D ; [.0000.0000.0000.0000] # [E004D] TAG LATIN CAPITAL LETTER M
+E004E ; [.0000.0000.0000.0000] # [E004E] TAG LATIN CAPITAL LETTER N
+E004F ; [.0000.0000.0000.0000] # [E004F] TAG LATIN CAPITAL LETTER O
+E0050 ; [.0000.0000.0000.0000] # [E0050] TAG LATIN CAPITAL LETTER P
+E0051 ; [.0000.0000.0000.0000] # [E0051] TAG LATIN CAPITAL LETTER Q
+E0052 ; [.0000.0000.0000.0000] # [E0052] TAG LATIN CAPITAL LETTER R
+E0053 ; [.0000.0000.0000.0000] # [E0053] TAG LATIN CAPITAL LETTER S
+E0054 ; [.0000.0000.0000.0000] # [E0054] TAG LATIN CAPITAL LETTER T
+E0055 ; [.0000.0000.0000.0000] # [E0055] TAG LATIN CAPITAL LETTER U
+E0056 ; [.0000.0000.0000.0000] # [E0056] TAG LATIN CAPITAL LETTER V
+E0057 ; [.0000.0000.0000.0000] # [E0057] TAG LATIN CAPITAL LETTER W
+E0058 ; [.0000.0000.0000.0000] # [E0058] TAG LATIN CAPITAL LETTER X
+E0059 ; [.0000.0000.0000.0000] # [E0059] TAG LATIN CAPITAL LETTER Y
+E005A ; [.0000.0000.0000.0000] # [E005A] TAG LATIN CAPITAL LETTER Z
+E005B ; [.0000.0000.0000.0000] # [E005B] TAG LEFT SQUARE BRACKET
+E005C ; [.0000.0000.0000.0000] # [E005C] TAG REVERSE SOLIDUS
+E005D ; [.0000.0000.0000.0000] # [E005D] TAG RIGHT SQUARE BRACKET
+E005E ; [.0000.0000.0000.0000] # [E005E] TAG CIRCUMFLEX ACCENT
+E005F ; [.0000.0000.0000.0000] # [E005F] TAG LOW LINE
+E0060 ; [.0000.0000.0000.0000] # [E0060] TAG GRAVE ACCENT
+E0061 ; [.0000.0000.0000.0000] # [E0061] TAG LATIN SMALL LETTER A
+E0062 ; [.0000.0000.0000.0000] # [E0062] TAG LATIN SMALL LETTER B
+E0063 ; [.0000.0000.0000.0000] # [E0063] TAG LATIN SMALL LETTER C
+E0064 ; [.0000.0000.0000.0000] # [E0064] TAG LATIN SMALL LETTER D
+E0065 ; [.0000.0000.0000.0000] # [E0065] TAG LATIN SMALL LETTER E
+E0066 ; [.0000.0000.0000.0000] # [E0066] TAG LATIN SMALL LETTER F
+E0067 ; [.0000.0000.0000.0000] # [E0067] TAG LATIN SMALL LETTER G
+E0068 ; [.0000.0000.0000.0000] # [E0068] TAG LATIN SMALL LETTER H
+E0069 ; [.0000.0000.0000.0000] # [E0069] TAG LATIN SMALL LETTER I
+E006A ; [.0000.0000.0000.0000] # [E006A] TAG LATIN SMALL LETTER J
+E006B ; [.0000.0000.0000.0000] # [E006B] TAG LATIN SMALL LETTER K
+E006C ; [.0000.0000.0000.0000] # [E006C] TAG LATIN SMALL LETTER L
+E006D ; [.0000.0000.0000.0000] # [E006D] TAG LATIN SMALL LETTER M
+E006E ; [.0000.0000.0000.0000] # [E006E] TAG LATIN SMALL LETTER N
+E006F ; [.0000.0000.0000.0000] # [E006F] TAG LATIN SMALL LETTER O
+E0070 ; [.0000.0000.0000.0000] # [E0070] TAG LATIN SMALL LETTER P
+E0071 ; [.0000.0000.0000.0000] # [E0071] TAG LATIN SMALL LETTER Q
+E0072 ; [.0000.0000.0000.0000] # [E0072] TAG LATIN SMALL LETTER R
+E0073 ; [.0000.0000.0000.0000] # [E0073] TAG LATIN SMALL LETTER S
+E0074 ; [.0000.0000.0000.0000] # [E0074] TAG LATIN SMALL LETTER T
+E0075 ; [.0000.0000.0000.0000] # [E0075] TAG LATIN SMALL LETTER U
+E0076 ; [.0000.0000.0000.0000] # [E0076] TAG LATIN SMALL LETTER V
+E0077 ; [.0000.0000.0000.0000] # [E0077] TAG LATIN SMALL LETTER W
+E0078 ; [.0000.0000.0000.0000] # [E0078] TAG LATIN SMALL LETTER X
+E0079 ; [.0000.0000.0000.0000] # [E0079] TAG LATIN SMALL LETTER Y
+E007A ; [.0000.0000.0000.0000] # [E007A] TAG LATIN SMALL LETTER Z
+E007B ; [.0000.0000.0000.0000] # [E007B] TAG LEFT CURLY BRACKET
+E007C ; [.0000.0000.0000.0000] # [E007C] TAG VERTICAL LINE
+E007D ; [.0000.0000.0000.0000] # [E007D] TAG RIGHT CURLY BRACKET
+E007E ; [.0000.0000.0000.0000] # [E007E] TAG TILDE
+E007F ; [.0000.0000.0000.0000] # [E007F] CANCEL TAG
+E0100 ; [.0000.0000.0000.0000] # [E0100] VARIATION SELECTOR-17
+E0101 ; [.0000.0000.0000.0000] # [E0101] VARIATION SELECTOR-18
+E0102 ; [.0000.0000.0000.0000] # [E0102] VARIATION SELECTOR-19
+E0103 ; [.0000.0000.0000.0000] # [E0103] VARIATION SELECTOR-20
+E0104 ; [.0000.0000.0000.0000] # [E0104] VARIATION SELECTOR-21
+E0105 ; [.0000.0000.0000.0000] # [E0105] VARIATION SELECTOR-22
+E0106 ; [.0000.0000.0000.0000] # [E0106] VARIATION SELECTOR-23
+E0107 ; [.0000.0000.0000.0000] # [E0107] VARIATION SELECTOR-24
+E0108 ; [.0000.0000.0000.0000] # [E0108] VARIATION SELECTOR-25
+E0109 ; [.0000.0000.0000.0000] # [E0109] VARIATION SELECTOR-26
+E010A ; [.0000.0000.0000.0000] # [E010A] VARIATION SELECTOR-27
+E010B ; [.0000.0000.0000.0000] # [E010B] VARIATION SELECTOR-28
+E010C ; [.0000.0000.0000.0000] # [E010C] VARIATION SELECTOR-29
+E010D ; [.0000.0000.0000.0000] # [E010D] VARIATION SELECTOR-30
+E010E ; [.0000.0000.0000.0000] # [E010E] VARIATION SELECTOR-31
+E010F ; [.0000.0000.0000.0000] # [E010F] VARIATION SELECTOR-32
+E0110 ; [.0000.0000.0000.0000] # [E0110] VARIATION SELECTOR-33
+E0111 ; [.0000.0000.0000.0000] # [E0111] VARIATION SELECTOR-34
+E0112 ; [.0000.0000.0000.0000] # [E0112] VARIATION SELECTOR-35
+E0113 ; [.0000.0000.0000.0000] # [E0113] VARIATION SELECTOR-36
+E0114 ; [.0000.0000.0000.0000] # [E0114] VARIATION SELECTOR-37
+E0115 ; [.0000.0000.0000.0000] # [E0115] VARIATION SELECTOR-38
+E0116 ; [.0000.0000.0000.0000] # [E0116] VARIATION SELECTOR-39
+E0117 ; [.0000.0000.0000.0000] # [E0117] VARIATION SELECTOR-40
+E0118 ; [.0000.0000.0000.0000] # [E0118] VARIATION SELECTOR-41
+E0119 ; [.0000.0000.0000.0000] # [E0119] VARIATION SELECTOR-42
+E011A ; [.0000.0000.0000.0000] # [E011A] VARIATION SELECTOR-43
+E011B ; [.0000.0000.0000.0000] # [E011B] VARIATION SELECTOR-44
+E011C ; [.0000.0000.0000.0000] # [E011C] VARIATION SELECTOR-45
+E011D ; [.0000.0000.0000.0000] # [E011D] VARIATION SELECTOR-46
+E011E ; [.0000.0000.0000.0000] # [E011E] VARIATION SELECTOR-47
+E011F ; [.0000.0000.0000.0000] # [E011F] VARIATION SELECTOR-48
+E0120 ; [.0000.0000.0000.0000] # [E0120] VARIATION SELECTOR-49
+E0121 ; [.0000.0000.0000.0000] # [E0121] VARIATION SELECTOR-50
+E0122 ; [.0000.0000.0000.0000] # [E0122] VARIATION SELECTOR-51
+E0123 ; [.0000.0000.0000.0000] # [E0123] VARIATION SELECTOR-52
+E0124 ; [.0000.0000.0000.0000] # [E0124] VARIATION SELECTOR-53
+E0125 ; [.0000.0000.0000.0000] # [E0125] VARIATION SELECTOR-54
+E0126 ; [.0000.0000.0000.0000] # [E0126] VARIATION SELECTOR-55
+E0127 ; [.0000.0000.0000.0000] # [E0127] VARIATION SELECTOR-56
+E0128 ; [.0000.0000.0000.0000] # [E0128] VARIATION SELECTOR-57
+E0129 ; [.0000.0000.0000.0000] # [E0129] VARIATION SELECTOR-58
+E012A ; [.0000.0000.0000.0000] # [E012A] VARIATION SELECTOR-59
+E012B ; [.0000.0000.0000.0000] # [E012B] VARIATION SELECTOR-60
+E012C ; [.0000.0000.0000.0000] # [E012C] VARIATION SELECTOR-61
+E012D ; [.0000.0000.0000.0000] # [E012D] VARIATION SELECTOR-62
+E012E ; [.0000.0000.0000.0000] # [E012E] VARIATION SELECTOR-63
+E012F ; [.0000.0000.0000.0000] # [E012F] VARIATION SELECTOR-64
+E0130 ; [.0000.0000.0000.0000] # [E0130] VARIATION SELECTOR-65
+E0131 ; [.0000.0000.0000.0000] # [E0131] VARIATION SELECTOR-66
+E0132 ; [.0000.0000.0000.0000] # [E0132] VARIATION SELECTOR-67
+E0133 ; [.0000.0000.0000.0000] # [E0133] VARIATION SELECTOR-68
+E0134 ; [.0000.0000.0000.0000] # [E0134] VARIATION SELECTOR-69
+E0135 ; [.0000.0000.0000.0000] # [E0135] VARIATION SELECTOR-70
+E0136 ; [.0000.0000.0000.0000] # [E0136] VARIATION SELECTOR-71
+E0137 ; [.0000.0000.0000.0000] # [E0137] VARIATION SELECTOR-72
+E0138 ; [.0000.0000.0000.0000] # [E0138] VARIATION SELECTOR-73
+E0139 ; [.0000.0000.0000.0000] # [E0139] VARIATION SELECTOR-74
+E013A ; [.0000.0000.0000.0000] # [E013A] VARIATION SELECTOR-75
+E013B ; [.0000.0000.0000.0000] # [E013B] VARIATION SELECTOR-76
+E013C ; [.0000.0000.0000.0000] # [E013C] VARIATION SELECTOR-77
+E013D ; [.0000.0000.0000.0000] # [E013D] VARIATION SELECTOR-78
+E013E ; [.0000.0000.0000.0000] # [E013E] VARIATION SELECTOR-79
+E013F ; [.0000.0000.0000.0000] # [E013F] VARIATION SELECTOR-80
+E0140 ; [.0000.0000.0000.0000] # [E0140] VARIATION SELECTOR-81
+E0141 ; [.0000.0000.0000.0000] # [E0141] VARIATION SELECTOR-82
+E0142 ; [.0000.0000.0000.0000] # [E0142] VARIATION SELECTOR-83
+E0143 ; [.0000.0000.0000.0000] # [E0143] VARIATION SELECTOR-84
+E0144 ; [.0000.0000.0000.0000] # [E0144] VARIATION SELECTOR-85
+E0145 ; [.0000.0000.0000.0000] # [E0145] VARIATION SELECTOR-86
+E0146 ; [.0000.0000.0000.0000] # [E0146] VARIATION SELECTOR-87
+E0147 ; [.0000.0000.0000.0000] # [E0147] VARIATION SELECTOR-88
+E0148 ; [.0000.0000.0000.0000] # [E0148] VARIATION SELECTOR-89
+E0149 ; [.0000.0000.0000.0000] # [E0149] VARIATION SELECTOR-90
+E014A ; [.0000.0000.0000.0000] # [E014A] VARIATION SELECTOR-91
+E014B ; [.0000.0000.0000.0000] # [E014B] VARIATION SELECTOR-92
+E014C ; [.0000.0000.0000.0000] # [E014C] VARIATION SELECTOR-93
+E014D ; [.0000.0000.0000.0000] # [E014D] VARIATION SELECTOR-94
+E014E ; [.0000.0000.0000.0000] # [E014E] VARIATION SELECTOR-95
+E014F ; [.0000.0000.0000.0000] # [E014F] VARIATION SELECTOR-96
+E0150 ; [.0000.0000.0000.0000] # [E0150] VARIATION SELECTOR-97
+E0151 ; [.0000.0000.0000.0000] # [E0151] VARIATION SELECTOR-98
+E0152 ; [.0000.0000.0000.0000] # [E0152] VARIATION SELECTOR-99
+E0153 ; [.0000.0000.0000.0000] # [E0153] VARIATION SELECTOR-100
+E0154 ; [.0000.0000.0000.0000] # [E0154] VARIATION SELECTOR-101
+E0155 ; [.0000.0000.0000.0000] # [E0155] VARIATION SELECTOR-102
+E0156 ; [.0000.0000.0000.0000] # [E0156] VARIATION SELECTOR-103
+E0157 ; [.0000.0000.0000.0000] # [E0157] VARIATION SELECTOR-104
+E0158 ; [.0000.0000.0000.0000] # [E0158] VARIATION SELECTOR-105
+E0159 ; [.0000.0000.0000.0000] # [E0159] VARIATION SELECTOR-106
+E015A ; [.0000.0000.0000.0000] # [E015A] VARIATION SELECTOR-107
+E015B ; [.0000.0000.0000.0000] # [E015B] VARIATION SELECTOR-108
+E015C ; [.0000.0000.0000.0000] # [E015C] VARIATION SELECTOR-109
+E015D ; [.0000.0000.0000.0000] # [E015D] VARIATION SELECTOR-110
+E015E ; [.0000.0000.0000.0000] # [E015E] VARIATION SELECTOR-111
+E015F ; [.0000.0000.0000.0000] # [E015F] VARIATION SELECTOR-112
+E0160 ; [.0000.0000.0000.0000] # [E0160] VARIATION SELECTOR-113
+E0161 ; [.0000.0000.0000.0000] # [E0161] VARIATION SELECTOR-114
+E0162 ; [.0000.0000.0000.0000] # [E0162] VARIATION SELECTOR-115
+E0163 ; [.0000.0000.0000.0000] # [E0163] VARIATION SELECTOR-116
+E0164 ; [.0000.0000.0000.0000] # [E0164] VARIATION SELECTOR-117
+E0165 ; [.0000.0000.0000.0000] # [E0165] VARIATION SELECTOR-118
+E0166 ; [.0000.0000.0000.0000] # [E0166] VARIATION SELECTOR-119
+E0167 ; [.0000.0000.0000.0000] # [E0167] VARIATION SELECTOR-120
+E0168 ; [.0000.0000.0000.0000] # [E0168] VARIATION SELECTOR-121
+E0169 ; [.0000.0000.0000.0000] # [E0169] VARIATION SELECTOR-122
+E016A ; [.0000.0000.0000.0000] # [E016A] VARIATION SELECTOR-123
+E016B ; [.0000.0000.0000.0000] # [E016B] VARIATION SELECTOR-124
+E016C ; [.0000.0000.0000.0000] # [E016C] VARIATION SELECTOR-125
+E016D ; [.0000.0000.0000.0000] # [E016D] VARIATION SELECTOR-126
+E016E ; [.0000.0000.0000.0000] # [E016E] VARIATION SELECTOR-127
+E016F ; [.0000.0000.0000.0000] # [E016F] VARIATION SELECTOR-128
+E0170 ; [.0000.0000.0000.0000] # [E0170] VARIATION SELECTOR-129
+E0171 ; [.0000.0000.0000.0000] # [E0171] VARIATION SELECTOR-130
+E0172 ; [.0000.0000.0000.0000] # [E0172] VARIATION SELECTOR-131
+E0173 ; [.0000.0000.0000.0000] # [E0173] VARIATION SELECTOR-132
+E0174 ; [.0000.0000.0000.0000] # [E0174] VARIATION SELECTOR-133
+E0175 ; [.0000.0000.0000.0000] # [E0175] VARIATION SELECTOR-134
+E0176 ; [.0000.0000.0000.0000] # [E0176] VARIATION SELECTOR-135
+E0177 ; [.0000.0000.0000.0000] # [E0177] VARIATION SELECTOR-136
+E0178 ; [.0000.0000.0000.0000] # [E0178] VARIATION SELECTOR-137
+E0179 ; [.0000.0000.0000.0000] # [E0179] VARIATION SELECTOR-138
+E017A ; [.0000.0000.0000.0000] # [E017A] VARIATION SELECTOR-139
+E017B ; [.0000.0000.0000.0000] # [E017B] VARIATION SELECTOR-140
+E017C ; [.0000.0000.0000.0000] # [E017C] VARIATION SELECTOR-141
+E017D ; [.0000.0000.0000.0000] # [E017D] VARIATION SELECTOR-142
+E017E ; [.0000.0000.0000.0000] # [E017E] VARIATION SELECTOR-143
+E017F ; [.0000.0000.0000.0000] # [E017F] VARIATION SELECTOR-144
+E0180 ; [.0000.0000.0000.0000] # [E0180] VARIATION SELECTOR-145
+E0181 ; [.0000.0000.0000.0000] # [E0181] VARIATION SELECTOR-146
+E0182 ; [.0000.0000.0000.0000] # [E0182] VARIATION SELECTOR-147
+E0183 ; [.0000.0000.0000.0000] # [E0183] VARIATION SELECTOR-148
+E0184 ; [.0000.0000.0000.0000] # [E0184] VARIATION SELECTOR-149
+E0185 ; [.0000.0000.0000.0000] # [E0185] VARIATION SELECTOR-150
+E0186 ; [.0000.0000.0000.0000] # [E0186] VARIATION SELECTOR-151
+E0187 ; [.0000.0000.0000.0000] # [E0187] VARIATION SELECTOR-152
+E0188 ; [.0000.0000.0000.0000] # [E0188] VARIATION SELECTOR-153
+E0189 ; [.0000.0000.0000.0000] # [E0189] VARIATION SELECTOR-154
+E018A ; [.0000.0000.0000.0000] # [E018A] VARIATION SELECTOR-155
+E018B ; [.0000.0000.0000.0000] # [E018B] VARIATION SELECTOR-156
+E018C ; [.0000.0000.0000.0000] # [E018C] VARIATION SELECTOR-157
+E018D ; [.0000.0000.0000.0000] # [E018D] VARIATION SELECTOR-158
+E018E ; [.0000.0000.0000.0000] # [E018E] VARIATION SELECTOR-159
+E018F ; [.0000.0000.0000.0000] # [E018F] VARIATION SELECTOR-160
+E0190 ; [.0000.0000.0000.0000] # [E0190] VARIATION SELECTOR-161
+E0191 ; [.0000.0000.0000.0000] # [E0191] VARIATION SELECTOR-162
+E0192 ; [.0000.0000.0000.0000] # [E0192] VARIATION SELECTOR-163
+E0193 ; [.0000.0000.0000.0000] # [E0193] VARIATION SELECTOR-164
+E0194 ; [.0000.0000.0000.0000] # [E0194] VARIATION SELECTOR-165
+E0195 ; [.0000.0000.0000.0000] # [E0195] VARIATION SELECTOR-166
+E0196 ; [.0000.0000.0000.0000] # [E0196] VARIATION SELECTOR-167
+E0197 ; [.0000.0000.0000.0000] # [E0197] VARIATION SELECTOR-168
+E0198 ; [.0000.0000.0000.0000] # [E0198] VARIATION SELECTOR-169
+E0199 ; [.0000.0000.0000.0000] # [E0199] VARIATION SELECTOR-170
+E019A ; [.0000.0000.0000.0000] # [E019A] VARIATION SELECTOR-171
+E019B ; [.0000.0000.0000.0000] # [E019B] VARIATION SELECTOR-172
+E019C ; [.0000.0000.0000.0000] # [E019C] VARIATION SELECTOR-173
+E019D ; [.0000.0000.0000.0000] # [E019D] VARIATION SELECTOR-174
+E019E ; [.0000.0000.0000.0000] # [E019E] VARIATION SELECTOR-175
+E019F ; [.0000.0000.0000.0000] # [E019F] VARIATION SELECTOR-176
+E01A0 ; [.0000.0000.0000.0000] # [E01A0] VARIATION SELECTOR-177
+E01A1 ; [.0000.0000.0000.0000] # [E01A1] VARIATION SELECTOR-178
+E01A2 ; [.0000.0000.0000.0000] # [E01A2] VARIATION SELECTOR-179
+E01A3 ; [.0000.0000.0000.0000] # [E01A3] VARIATION SELECTOR-180
+E01A4 ; [.0000.0000.0000.0000] # [E01A4] VARIATION SELECTOR-181
+E01A5 ; [.0000.0000.0000.0000] # [E01A5] VARIATION SELECTOR-182
+E01A6 ; [.0000.0000.0000.0000] # [E01A6] VARIATION SELECTOR-183
+E01A7 ; [.0000.0000.0000.0000] # [E01A7] VARIATION SELECTOR-184
+E01A8 ; [.0000.0000.0000.0000] # [E01A8] VARIATION SELECTOR-185
+E01A9 ; [.0000.0000.0000.0000] # [E01A9] VARIATION SELECTOR-186
+E01AA ; [.0000.0000.0000.0000] # [E01AA] VARIATION SELECTOR-187
+E01AB ; [.0000.0000.0000.0000] # [E01AB] VARIATION SELECTOR-188
+E01AC ; [.0000.0000.0000.0000] # [E01AC] VARIATION SELECTOR-189
+E01AD ; [.0000.0000.0000.0000] # [E01AD] VARIATION SELECTOR-190
+E01AE ; [.0000.0000.0000.0000] # [E01AE] VARIATION SELECTOR-191
+E01AF ; [.0000.0000.0000.0000] # [E01AF] VARIATION SELECTOR-192
+E01B0 ; [.0000.0000.0000.0000] # [E01B0] VARIATION SELECTOR-193
+E01B1 ; [.0000.0000.0000.0000] # [E01B1] VARIATION SELECTOR-194
+E01B2 ; [.0000.0000.0000.0000] # [E01B2] VARIATION SELECTOR-195
+E01B3 ; [.0000.0000.0000.0000] # [E01B3] VARIATION SELECTOR-196
+E01B4 ; [.0000.0000.0000.0000] # [E01B4] VARIATION SELECTOR-197
+E01B5 ; [.0000.0000.0000.0000] # [E01B5] VARIATION SELECTOR-198
+E01B6 ; [.0000.0000.0000.0000] # [E01B6] VARIATION SELECTOR-199
+E01B7 ; [.0000.0000.0000.0000] # [E01B7] VARIATION SELECTOR-200
+E01B8 ; [.0000.0000.0000.0000] # [E01B8] VARIATION SELECTOR-201
+E01B9 ; [.0000.0000.0000.0000] # [E01B9] VARIATION SELECTOR-202
+E01BA ; [.0000.0000.0000.0000] # [E01BA] VARIATION SELECTOR-203
+E01BB ; [.0000.0000.0000.0000] # [E01BB] VARIATION SELECTOR-204
+E01BC ; [.0000.0000.0000.0000] # [E01BC] VARIATION SELECTOR-205
+E01BD ; [.0000.0000.0000.0000] # [E01BD] VARIATION SELECTOR-206
+E01BE ; [.0000.0000.0000.0000] # [E01BE] VARIATION SELECTOR-207
+E01BF ; [.0000.0000.0000.0000] # [E01BF] VARIATION SELECTOR-208
+E01C0 ; [.0000.0000.0000.0000] # [E01C0] VARIATION SELECTOR-209
+E01C1 ; [.0000.0000.0000.0000] # [E01C1] VARIATION SELECTOR-210
+E01C2 ; [.0000.0000.0000.0000] # [E01C2] VARIATION SELECTOR-211
+E01C3 ; [.0000.0000.0000.0000] # [E01C3] VARIATION SELECTOR-212
+E01C4 ; [.0000.0000.0000.0000] # [E01C4] VARIATION SELECTOR-213
+E01C5 ; [.0000.0000.0000.0000] # [E01C5] VARIATION SELECTOR-214
+E01C6 ; [.0000.0000.0000.0000] # [E01C6] VARIATION SELECTOR-215
+E01C7 ; [.0000.0000.0000.0000] # [E01C7] VARIATION SELECTOR-216
+E01C8 ; [.0000.0000.0000.0000] # [E01C8] VARIATION SELECTOR-217
+E01C9 ; [.0000.0000.0000.0000] # [E01C9] VARIATION SELECTOR-218
+E01CA ; [.0000.0000.0000.0000] # [E01CA] VARIATION SELECTOR-219
+E01CB ; [.0000.0000.0000.0000] # [E01CB] VARIATION SELECTOR-220
+E01CC ; [.0000.0000.0000.0000] # [E01CC] VARIATION SELECTOR-221
+E01CD ; [.0000.0000.0000.0000] # [E01CD] VARIATION SELECTOR-222
+E01CE ; [.0000.0000.0000.0000] # [E01CE] VARIATION SELECTOR-223
+E01CF ; [.0000.0000.0000.0000] # [E01CF] VARIATION SELECTOR-224
+E01D0 ; [.0000.0000.0000.0000] # [E01D0] VARIATION SELECTOR-225
+E01D1 ; [.0000.0000.0000.0000] # [E01D1] VARIATION SELECTOR-226
+E01D2 ; [.0000.0000.0000.0000] # [E01D2] VARIATION SELECTOR-227
+E01D3 ; [.0000.0000.0000.0000] # [E01D3] VARIATION SELECTOR-228
+E01D4 ; [.0000.0000.0000.0000] # [E01D4] VARIATION SELECTOR-229
+E01D5 ; [.0000.0000.0000.0000] # [E01D5] VARIATION SELECTOR-230
+E01D6 ; [.0000.0000.0000.0000] # [E01D6] VARIATION SELECTOR-231
+E01D7 ; [.0000.0000.0000.0000] # [E01D7] VARIATION SELECTOR-232
+E01D8 ; [.0000.0000.0000.0000] # [E01D8] VARIATION SELECTOR-233
+E01D9 ; [.0000.0000.0000.0000] # [E01D9] VARIATION SELECTOR-234
+E01DA ; [.0000.0000.0000.0000] # [E01DA] VARIATION SELECTOR-235
+E01DB ; [.0000.0000.0000.0000] # [E01DB] VARIATION SELECTOR-236
+E01DC ; [.0000.0000.0000.0000] # [E01DC] VARIATION SELECTOR-237
+E01DD ; [.0000.0000.0000.0000] # [E01DD] VARIATION SELECTOR-238
+E01DE ; [.0000.0000.0000.0000] # [E01DE] VARIATION SELECTOR-239
+E01DF ; [.0000.0000.0000.0000] # [E01DF] VARIATION SELECTOR-240
+E01E0 ; [.0000.0000.0000.0000] # [E01E0] VARIATION SELECTOR-241
+E01E1 ; [.0000.0000.0000.0000] # [E01E1] VARIATION SELECTOR-242
+E01E2 ; [.0000.0000.0000.0000] # [E01E2] VARIATION SELECTOR-243
+E01E3 ; [.0000.0000.0000.0000] # [E01E3] VARIATION SELECTOR-244
+E01E4 ; [.0000.0000.0000.0000] # [E01E4] VARIATION SELECTOR-245
+E01E5 ; [.0000.0000.0000.0000] # [E01E5] VARIATION SELECTOR-246
+E01E6 ; [.0000.0000.0000.0000] # [E01E6] VARIATION SELECTOR-247
+E01E7 ; [.0000.0000.0000.0000] # [E01E7] VARIATION SELECTOR-248
+E01E8 ; [.0000.0000.0000.0000] # [E01E8] VARIATION SELECTOR-249
+E01E9 ; [.0000.0000.0000.0000] # [E01E9] VARIATION SELECTOR-250
+E01EA ; [.0000.0000.0000.0000] # [E01EA] VARIATION SELECTOR-251
+E01EB ; [.0000.0000.0000.0000] # [E01EB] VARIATION SELECTOR-252
+E01EC ; [.0000.0000.0000.0000] # [E01EC] VARIATION SELECTOR-253
+E01ED ; [.0000.0000.0000.0000] # [E01ED] VARIATION SELECTOR-254
+E01EE ; [.0000.0000.0000.0000] # [E01EE] VARIATION SELECTOR-255
+E01EF ; [.0000.0000.0000.0000] # [E01EF] VARIATION SELECTOR-256
+0009  ; [*0201.0020.0002.0009] # HORIZONTAL TABULATION (in 6429)
+000A  ; [*0202.0020.0002.000A] # LINE FEED (in 6429)
+000B  ; [*0203.0020.0002.000B] # VERTICAL TABULATION (in 6429)
+000C  ; [*0204.0020.0002.000C] # FORM FEED (in 6429)
+000D  ; [*0205.0020.0002.000D] # CARRIAGE RETURN (in 6429)
+0020  ; [*020A.0020.0002.0020] # SPACE
+0021  ; [*026E.0020.0002.0021] # EXCLAMATION MARK
+0022  ; [*02F5.0020.0002.0022] # QUOTATION MARK
+0023  ; [*0362.0020.0002.0023] # NUMBER SIGN
+0025  ; [*0363.0020.0002.0025] # PERCENT SIGN
+0026  ; [*035F.0020.0002.0026] # AMPERSAND
+0027  ; [*02EE.0020.0002.0027] # APOSTROPHE
+0028  ; [*02FF.0020.0002.0028] # LEFT PARENTHESIS
+0029  ; [*0300.0020.0002.0029] # RIGHT PARENTHESIS
+002A  ; [*0357.0020.0002.002A] # ASTERISK
+002B  ; [*0550.0020.0002.002B] # PLUS SIGN
+002C  ; [*0234.0020.0002.002C] # COMMA
+002D  ; [*0223.0020.0002.002D] # HYPHEN-MINUS
+002E  ; [*0281.0020.0002.002E] # FULL STOP
+002F  ; [*035C.0020.0002.002F] # SOLIDUS
+003A  ; [*0247.0020.0002.003A] # COLON
+003B  ; [*0243.0020.0002.003B] # SEMICOLON
+003C  ; [*0554.0020.0002.003C] # LESS-THAN SIGN
+003D  ; [*0555.0020.0002.003D] # EQUALS SIGN
+003E  ; [*0556.0020.0002.003E] # GREATER-THAN SIGN
+003F  ; [*0273.0020.0002.003F] # QUESTION MARK
+0040  ; [*0356.0020.0002.0040] # COMMERCIAL AT
+005B  ; [*0301.0020.0002.005B] # LEFT SQUARE BRACKET
+005C  ; [*035E.0020.0002.005C] # REVERSE SOLIDUS
+005D  ; [*0302.0020.0002.005D] # RIGHT SQUARE BRACKET
+005E  ; [*0211.0020.0002.005E] # CIRCUMFLEX ACCENT
+005F  ; [*021D.0020.0002.005F] # LOW LINE
+0060  ; [*020E.0020.0002.0060] # GRAVE ACCENT
+007B  ; [*0303.0020.0002.007B] # LEFT CURLY BRACKET
+007C  ; [*0558.0020.0002.007C] # VERTICAL LINE
+007D  ; [*0304.0020.0002.007D] # RIGHT CURLY BRACKET
+007E  ; [*055B.0020.0002.007E] # TILDE
+0085  ; [*0206.0020.0002.0085] # NEXT LINE (in 6429)
+00A0  ; [*020A.0020.001B.00A0] # NO-BREAK SPACE; QQK
+00A1  ; [*026F.0020.0002.00A1] # INVERTED EXCLAMATION MARK
+00A6  ; [*0559.0020.0002.00A6] # BROKEN BAR
+00A7  ; [*0351.0020.0002.00A7] # SECTION SIGN
+00A8  ; [*0216.0020.0002.00A8] # DIAERESIS
+00A9  ; [*0354.0020.0002.00A9] # COPYRIGHT SIGN
+00AB  ; [*02FD.0020.0002.00AB] # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+00AC  ; [*0557.0020.0002.00AC] # NOT SIGN
+00AD  ; [*0222.0020.0002.00AD] # SOFT HYPHEN
+00AE  ; [*0355.0020.0002.00AE] # REGISTERED SIGN
+00AF  ; [*0212.0020.0002.00AF] # MACRON
+00B0  ; [*044B.0020.0002.00B0] # DEGREE SIGN
+00B1  ; [*0551.0020.0002.00B1] # PLUS-MINUS SIGN
+00B4  ; [*020F.0020.0002.00B4] # ACUTE ACCENT
+00B6  ; [*0352.0020.0002.00B6] # PILCROW SIGN
+00B7  ; [*0292.0020.0002.00B7] # MIDDLE DOT
+00B8  ; [*021B.0020.0002.00B8] # CEDILLA
+00BB  ; [*02FE.0020.0002.00BB] # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+00BF  ; [*0274.0020.0002.00BF] # INVERTED QUESTION MARK
+00D7  ; [*0553.0020.0002.00D7] # MULTIPLICATION SIGN
+00F7  ; [*0552.0020.0002.00F7] # DIVISION SIGN
+02B9  ; [*03E9.0020.0002.02B9] # MODIFIER LETTER PRIME
+02BA  ; [*03EB.0020.0002.02BA] # MODIFIER LETTER DOUBLE PRIME
+02C2  ; [*03EC.0020.0002.02C2] # MODIFIER LETTER LEFT ARROWHEAD
+02C3  ; [*03ED.0020.0002.02C3] # MODIFIER LETTER RIGHT ARROWHEAD
+02C4  ; [*03EE.0020.0002.02C4] # MODIFIER LETTER UP ARROWHEAD
+02C5  ; [*03EF.0020.0002.02C5] # MODIFIER LETTER DOWN ARROWHEAD
+02C6  ; [*03F0.0020.0002.02C6] # MODIFIER LETTER CIRCUMFLEX ACCENT
+02C7  ; [*03F1.0020.0002.02C7] # CARON
+02C8  ; [*03F2.0020.0002.02C8] # MODIFIER LETTER VERTICAL LINE
+02C9  ; [*03F3.0020.0002.02C9] # MODIFIER LETTER MACRON
+02CA  ; [*03F4.0020.0002.02CA] # MODIFIER LETTER ACUTE ACCENT
+02CB  ; [*03F5.0020.0002.02CB] # MODIFIER LETTER GRAVE ACCENT
+02CC  ; [*03F6.0020.0002.02CC] # MODIFIER LETTER LOW VERTICAL LINE
+02CD  ; [*03F7.0020.0002.02CD] # MODIFIER LETTER LOW MACRON
+02CE  ; [*03F8.0020.0002.02CE] # MODIFIER LETTER LOW GRAVE ACCENT
+02CF  ; [*03F9.0020.0002.02CF] # MODIFIER LETTER LOW ACUTE ACCENT
+02D2  ; [*03FA.0020.0002.02D2] # MODIFIER LETTER CENTRED RIGHT HALF RING
+02D3  ; [*03FB.0020.0002.02D3] # MODIFIER LETTER CENTRED LEFT HALF RING
+02D4  ; [*03FC.0020.0002.02D4] # MODIFIER LETTER UP TACK
+02D5  ; [*03FD.0020.0002.02D5] # MODIFIER LETTER DOWN TACK
+02D6  ; [*03FE.0020.0002.02D6] # MODIFIER LETTER PLUS SIGN
+02D7  ; [*03FF.0020.0002.02D7] # MODIFIER LETTER MINUS SIGN
+02D8  ; [*0214.0020.0002.02D8] # BREVE
+02D9  ; [*0215.0020.0002.02D9] # DOT ABOVE
+02DA  ; [*0217.0020.0002.02DA] # RING ABOVE
+02DB  ; [*021C.0020.0002.02DB] # OGONEK
+02DC  ; [*0210.0020.0002.02DC] # SMALL TILDE
+02DD  ; [*0218.0020.0002.02DD] # DOUBLE ACUTE ACCENT
+02DE  ; [*0400.0020.0002.02DE] # MODIFIER LETTER RHOTIC HOOK
+02DF  ; [*0401.0020.0002.02DF] # MODIFIER LETTER CROSS ACCENT
+02E5  ; [*0402.0020.0002.02E5] # MODIFIER LETTER EXTRA-HIGH TONE BAR
+02E6  ; [*0403.0020.0002.02E6] # MODIFIER LETTER HIGH TONE BAR
+02E7  ; [*0404.0020.0002.02E7] # MODIFIER LETTER MID TONE BAR
+02E8  ; [*0405.0020.0002.02E8] # MODIFIER LETTER LOW TONE BAR
+02E9  ; [*0406.0020.0002.02E9] # MODIFIER LETTER EXTRA-LOW TONE BAR
+02EA  ; [*0407.0020.0002.02EA] # MODIFIER LETTER YIN DEPARTING TONE MARK
+02EB  ; [*0408.0020.0002.02EB] # MODIFIER LETTER YANG DEPARTING TONE MARK
+02EC  ; [*0409.0020.0002.02EC] # MODIFIER LETTER VOICING
+02ED  ; [*040A.0020.0002.02ED] # MODIFIER LETTER UNASPIRATED
+02EF  ; [*040B.0020.0002.02EF] # MODIFIER LETTER LOW DOWN ARROWHEAD
+02F0  ; [*040C.0020.0002.02F0] # MODIFIER LETTER LOW UP ARROWHEAD
+02F1  ; [*040D.0020.0002.02F1] # MODIFIER LETTER LOW LEFT ARROWHEAD
+02F2  ; [*040E.0020.0002.02F2] # MODIFIER LETTER LOW RIGHT ARROWHEAD
+02F3  ; [*040F.0020.0002.02F3] # MODIFIER LETTER LOW RING
+02F4  ; [*0410.0020.0002.02F4] # MODIFIER LETTER MIDDLE GRAVE ACCENT
+02F5  ; [*0411.0020.0002.02F5] # MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT
+02F6  ; [*0412.0020.0002.02F6] # MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT
+02F7  ; [*0413.0020.0002.02F7] # MODIFIER LETTER LOW TILDE
+02F8  ; [*0414.0020.0002.02F8] # MODIFIER LETTER RAISED COLON
+02F9  ; [*0415.0020.0002.02F9] # MODIFIER LETTER BEGIN HIGH TONE
+02FA  ; [*0416.0020.0002.02FA] # MODIFIER LETTER END HIGH TONE
+02FB  ; [*0417.0020.0002.02FB] # MODIFIER LETTER BEGIN LOW TONE
+02FC  ; [*0418.0020.0002.02FC] # MODIFIER LETTER END LOW TONE
+02FD  ; [*0419.0020.0002.02FD] # MODIFIER LETTER SHELF
+02FE  ; [*041A.0020.0002.02FE] # MODIFIER LETTER OPEN SHELF
+02FF  ; [*041B.0020.0002.02FF] # MODIFIER LETTER LOW LEFT ARROW
+034F  ; [.0000.0000.0000.034F] # COMBINING GRAPHEME JOINER
+0374  ; [*03E9.0020.0002.0374] # GREEK NUMERAL SIGN; QQC
+0375  ; [*03EA.0020.0002.0375] # GREEK LOWER NUMERAL SIGN
+037E  ; [*0243.0020.0002.037E] # GREEK QUESTION MARK; QQC
+0384  ; [*020F.0020.0002.0384] # GREEK TONOS; QQC
+0385  ; [*0216.0020.0002.00A8][.0000.0032.0002.0301] # GREEK DIALYTIKA TONOS; QQCM
+0387  ; [*0292.0020.0002.0387] # GREEK ANO TELEIA; QQC
+03F6  ; [*054B.0020.0002.03F6] # GREEK REVERSED LUNATE EPSILON SYMBOL
+0482  ; [*044C.0020.0002.0482] # CYRILLIC THOUSANDS SIGN
+0488  ; [.0000.0000.0000.0488] # COMBINING CYRILLIC HUNDRED THOUSANDS SIGN
+0489  ; [.0000.0000.0000.0489] # COMBINING CYRILLIC MILLIONS SIGN
+055A  ; [*0392.0020.0002.055A] # ARMENIAN APOSTROPHE
+055B  ; [*0393.0020.0002.055B] # ARMENIAN EMPHASIS MARK
+055C  ; [*0270.0020.0002.055C] # ARMENIAN EXCLAMATION MARK
+055D  ; [*0235.0020.0002.055D] # ARMENIAN COMMA
+055E  ; [*0276.0020.0002.055E] # ARMENIAN QUESTION MARK
+055F  ; [*0394.0020.0002.055F] # ARMENIAN ABBREVIATION MARK
+0589  ; [*0248.0020.0002.0589] # ARMENIAN FULL STOP
+058A  ; [*0224.0020.0002.058A] # ARMENIAN HYPHEN
+0591  ; [.0000.0000.0000.0591] # HEBREW ACCENT ETNAHTA
+0592  ; [.0000.0000.0000.0592] # HEBREW ACCENT SEGOL
+0593  ; [.0000.0000.0000.0593] # HEBREW ACCENT SHALSHELET
+0594  ; [.0000.0000.0000.0594] # HEBREW ACCENT ZAQEF QATAN
+0595  ; [.0000.0000.0000.0595] # HEBREW ACCENT ZAQEF GADOL
+0596  ; [.0000.0000.0000.0596] # HEBREW ACCENT TIPEHA
+0597  ; [.0000.0000.0000.0597] # HEBREW ACCENT REVIA
+0598  ; [.0000.0000.0000.0598] # HEBREW ACCENT ZARQA
+0599  ; [.0000.0000.0000.0599] # HEBREW ACCENT PASHTA
+059A  ; [.0000.0000.0000.059A] # HEBREW ACCENT YETIV
+059B  ; [.0000.0000.0000.059B] # HEBREW ACCENT TEVIR
+059C  ; [.0000.0000.0000.059C] # HEBREW ACCENT GERESH
+059D  ; [.0000.0000.0000.059D] # HEBREW ACCENT GERESH MUQDAM
+059E  ; [.0000.0000.0000.059E] # HEBREW ACCENT GERSHAYIM
+059F  ; [.0000.0000.0000.059F] # HEBREW ACCENT QARNEY PARA
+05A0  ; [.0000.0000.0000.05A0] # HEBREW ACCENT TELISHA GEDOLA
+05A1  ; [.0000.0000.0000.05A1] # HEBREW ACCENT PAZER
+05A2  ; [.0000.0000.0000.05A2] # HEBREW ACCENT ATNAH HAFUKH
+05A3  ; [.0000.0000.0000.05A3] # HEBREW ACCENT MUNAH
+05A4  ; [.0000.0000.0000.05A4] # HEBREW ACCENT MAHAPAKH
+05A5  ; [.0000.0000.0000.05A5] # HEBREW ACCENT MERKHA
+05A6  ; [.0000.0000.0000.05A6] # HEBREW ACCENT MERKHA KEFULA
+05A7  ; [.0000.0000.0000.05A7] # HEBREW ACCENT DARGA
+05A8  ; [.0000.0000.0000.05A8] # HEBREW ACCENT QADMA
+05A9  ; [.0000.0000.0000.05A9] # HEBREW ACCENT TELISHA QETANA
+05AA  ; [.0000.0000.0000.05AA] # HEBREW ACCENT YERAH BEN YOMO
+05AB  ; [.0000.0000.0000.05AB] # HEBREW ACCENT OLE
+05AC  ; [.0000.0000.0000.05AC] # HEBREW ACCENT ILUY
+05AD  ; [.0000.0000.0000.05AD] # HEBREW ACCENT DEHI
+05AE  ; [.0000.0000.0000.05AE] # HEBREW ACCENT ZINOR
+05AF  ; [.0000.0000.0000.05AF] # HEBREW MARK MASORA CIRCLE
+05BD  ; [.0000.0000.0000.05BD] # HEBREW POINT METEG
+05BE  ; [*0395.0020.0002.05BE] # HEBREW PUNCTUATION MAQAF
+05C0  ; [*0396.0020.0002.05C0] # HEBREW PUNCTUATION PASEQ
+05C3  ; [*0397.0020.0002.05C3] # HEBREW PUNCTUATION SOF PASUQ
+05C4  ; [.0000.0000.0000.05C4] # HEBREW MARK UPPER DOT
+05C5  ; [.0000.0000.0000.05C5] # HEBREW MARK LOWER DOT
+05C6  ; [*0398.0020.0002.05C6] # HEBREW PUNCTUATION NUN HAFUKHA
+05F3  ; [*0399.0020.0002.05F3] # HEBREW PUNCTUATION GERESH
+05F4  ; [*039A.0020.0002.05F4] # HEBREW PUNCTUATION GERSHAYIM
+0600  ; [.0000.0000.0000.0600] # ARABIC NUMBER SIGN
+0601  ; [.0000.0000.0000.0601] # ARABIC SIGN SANAH
+0602  ; [.0000.0000.0000.0602] # ARABIC FOOTNOTE MARKER
+0603  ; [.0000.0000.0000.0603] # ARABIC SIGN SAFHA
+0606  ; [*0566.0020.0002.0606] # ARABIC-INDIC CUBE ROOT
+0607  ; [*0568.0020.0002.0607] # ARABIC-INDIC FOURTH ROOT
+0608  ; [*044D.0020.0002.0608] # ARABIC RAY
+0609  ; [*0366.0020.0002.0609] # ARABIC-INDIC PER MILLE SIGN
+060A  ; [*0368.0020.0002.060A] # ARABIC-INDIC PER TEN THOUSAND SIGN
+060C  ; [*0236.0020.0002.060C] # ARABIC COMMA
+060D  ; [*0237.0020.0002.060D] # ARABIC DATE SEPARATOR
+060E  ; [*044E.0020.0002.060E] # ARABIC POETIC VERSE SIGN
+060F  ; [*044F.0020.0002.060F] # ARABIC SIGN MISRA
+0610  ; [.0000.0000.0000.0610] # ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM
+0611  ; [.0000.0000.0000.0611] # ARABIC SIGN ALAYHE ASSALLAM
+0612  ; [.0000.0000.0000.0612] # ARABIC SIGN RAHMATULLAH ALAYHE
+0613  ; [.0000.0000.0000.0613] # ARABIC SIGN RADI ALLAHOU ANHU
+0614  ; [.0000.0000.0000.0614] # ARABIC SIGN TAKHALLUS
+0615  ; [.0000.0000.0000.0615] # ARABIC SMALL HIGH TAH 
+0616  ; [.0000.0000.0000.0616] # ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH
+0617  ; [.0000.0000.0000.0617] # ARABIC SMALL HIGH ZAIN
+0618  ; [.0000.0000.0000.0618] # ARABIC SMALL FATHA
+0619  ; [.0000.0000.0000.0619] # ARABIC SMALL DAMMA
+061A  ; [.0000.0000.0000.061A] # ARABIC SMALL KASRA
+061B  ; [*0244.0020.0002.061B] # ARABIC SEMICOLON
+061E  ; [*0249.0020.0002.061E] # ARABIC TRIPLE DOT PUNCTUATION MARK
+061F  ; [*0277.0020.0002.061F] # ARABIC QUESTION MARK
+0640  ; [*020C.0020.0002.0640] # ARABIC TATWEEL
+066A  ; [*0364.0020.0002.066A] # ARABIC PERCENT SIGN
+066B  ; [*0238.0020.0002.066B] # ARABIC DECIMAL SEPARATOR
+066C  ; [*0239.0020.0002.066C] # ARABIC THOUSANDS SEPARATOR
+066D  ; [*035A.0020.0002.066D] # ARABIC FIVE POINTED STAR
+06D4  ; [*0283.0020.0002.06D4] # ARABIC FULL STOP
+06D6  ; [.0000.0000.0000.06D6] # ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA
+06D7  ; [.0000.0000.0000.06D7] # ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA
+06D8  ; [.0000.0000.0000.06D8] # ARABIC SMALL HIGH MEEM INITIAL FORM
+06D9  ; [.0000.0000.0000.06D9] # ARABIC SMALL HIGH LAM ALEF
+06DA  ; [.0000.0000.0000.06DA] # ARABIC SMALL HIGH JEEM
+06DB  ; [.0000.0000.0000.06DB] # ARABIC SMALL HIGH THREE DOTS
+06DC  ; [.0000.0000.0000.06DC] # ARABIC SMALL HIGH SEEN
+06DD  ; [.0000.0000.0000.06DD] # ARABIC END OF AYAH
+06DE  ; [.0000.0000.0000.06DE] # ARABIC START OF RUB EL HIZB
+06DF  ; [.0000.0000.0000.06DF] # ARABIC SMALL HIGH ROUNDED ZERO
+06E0  ; [.0000.0000.0000.06E0] # ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO
+06E1  ; [.0000.0000.0000.06E1] # ARABIC SMALL HIGH DOTLESS HEAD OF KHAH
+06E2  ; [.0000.0000.0000.06E2] # ARABIC SMALL HIGH MEEM ISOLATED FORM
+06E3  ; [.0000.0000.0000.06E3] # ARABIC SMALL LOW SEEN
+06E4  ; [.0000.0000.0000.06E4] # ARABIC SMALL HIGH MADDA
+06E7  ; [.0000.0000.0000.06E7] # ARABIC SMALL HIGH YEH
+06E8  ; [.0000.0000.0000.06E8] # ARABIC SMALL HIGH NOON
+06E9  ; [*0450.0020.0002.06E9] # ARABIC PLACE OF SAJDAH
+06EA  ; [.0000.0000.0000.06EA] # ARABIC EMPTY CENTRE LOW STOP
+06EB  ; [.0000.0000.0000.06EB] # ARABIC EMPTY CENTRE HIGH STOP
+06EC  ; [.0000.0000.0000.06EC] # ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE
+06ED  ; [.0000.0000.0000.06ED] # ARABIC SMALL LOW MEEM
+0700  ; [*02B5.0020.0002.0700] # SYRIAC END OF PARAGRAPH
+0701  ; [*0284.0020.0002.0701] # SYRIAC SUPRALINEAR FULL STOP
+0702  ; [*0285.0020.0002.0702] # SYRIAC SUBLINEAR FULL STOP
+0703  ; [*024A.0020.0002.0703] # SYRIAC SUPRALINEAR COLON
+0704  ; [*024B.0020.0002.0704] # SYRIAC SUBLINEAR COLON
+0705  ; [*024C.0020.0002.0705] # SYRIAC HORIZONTAL COLON
+0706  ; [*024D.0020.0002.0706] # SYRIAC COLON SKEWED LEFT
+0707  ; [*024E.0020.0002.0707] # SYRIAC COLON SKEWED RIGHT
+0708  ; [*024F.0020.0002.0708] # SYRIAC SUPRALINEAR COLON SKEWED LEFT
+0709  ; [*0278.0020.0002.0709] # SYRIAC SUBLINEAR COLON SKEWED RIGHT
+070A  ; [*039B.0020.0002.070A] # SYRIAC CONTRACTION
+070B  ; [*039C.0020.0002.070B] # SYRIAC HARKLEAN OBELUS
+070C  ; [*039D.0020.0002.070C] # SYRIAC HARKLEAN METOBELUS
+070D  ; [*039E.0020.0002.070D] # SYRIAC HARKLEAN ASTERISCUS
+0740  ; [.0000.0000.0000.0740] # SYRIAC FEMININE DOT
+0743  ; [.0000.0000.0000.0743] # SYRIAC TWO VERTICAL DOTS ABOVE
+0744  ; [.0000.0000.0000.0744] # SYRIAC TWO VERTICAL DOTS BELOW
+0747  ; [.0000.0000.0000.0747] # SYRIAC OBLIQUE LINE ABOVE
+0748  ; [.0000.0000.0000.0748] # SYRIAC OBLIQUE LINE BELOW
+0749  ; [.0000.0000.0000.0749] # SYRIAC MUSIC
+074A  ; [.0000.0000.0000.074A] # SYRIAC BARREKH
+07F6  ; [*0452.0020.0002.07F6] # NKO SYMBOL OO DENNEN
+07F7  ; [*02B6.0020.0002.07F7] # NKO SYMBOL GBAKURUNEN
+07F8  ; [*023A.0020.0002.07F8] # NKO COMMA
+07F9  ; [*0271.0020.0002.07F9] # NKO EXCLAMATION MARK
+07FA  ; [*020D.0020.0002.07FA] # NKO LAJANYALAN
+0830  ; [*0250.0020.0002.0830] # SAMARITAN PUNCTUATION NEQUDAA
+0831  ; [*0251.0020.0002.0831] # SAMARITAN PUNCTUATION AFSAAQ
+0832  ; [*0252.0020.0002.0832] # SAMARITAN PUNCTUATION ANGED
+0833  ; [*0253.0020.0002.0833] # SAMARITAN PUNCTUATION BAU
+0834  ; [*0254.0020.0002.0834] # SAMARITAN PUNCTUATION ATMAAU
+0835  ; [*0255.0020.0002.0835] # SAMARITAN PUNCTUATION SHIYYAALAA
+0836  ; [*0256.0020.0002.0836] # SAMARITAN ABBREVIATION MARK
+0837  ; [*0257.0020.0002.0837] # SAMARITAN PUNCTUATION MELODIC QITSA
+0838  ; [*0258.0020.0002.0838] # SAMARITAN PUNCTUATION ZIQAA
+0839  ; [*0259.0020.0002.0839] # SAMARITAN PUNCTUATION QITSA
+083A  ; [*025A.0020.0002.083A] # SAMARITAN PUNCTUATION ZAEF
+083B  ; [*025B.0020.0002.083B] # SAMARITAN PUNCTUATION TURU
+083C  ; [*025C.0020.0002.083C] # SAMARITAN PUNCTUATION ARKAANU
+083D  ; [*025D.0020.0002.083D] # SAMARITAN PUNCTUATION SOF MASHFAAT
+083E  ; [*025E.0020.0002.083E] # SAMARITAN PUNCTUATION ANNAAU
+0951  ; [.0000.0000.0000.0951] # DEVANAGARI STRESS SIGN UDATTA
+0952  ; [.0000.0000.0000.0952] # DEVANAGARI STRESS SIGN ANUDATTA
+0964  ; [*0294.0020.0002.0964] # DEVANAGARI DANDA
+0965  ; [*0295.0020.0002.0965] # DEVANAGARI DOUBLE DANDA
+0970  ; [*03A1.0020.0002.0970] # DEVANAGARI ABBREVIATION SIGN
+09F4  ; [*1110.0020.0002.09F4] # BENGALI CURRENCY NUMERATOR ONE
+09F5  ; [*1111.0020.0002.09F5] # BENGALI CURRENCY NUMERATOR TWO
+09F6  ; [*1112.0020.0002.09F6] # BENGALI CURRENCY NUMERATOR THREE
+09F7  ; [*1113.0020.0002.09F7] # BENGALI CURRENCY NUMERATOR FOUR
+09F8  ; [*1114.0020.0002.09F8] # BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR
+09F9  ; [*1115.0020.0002.09F9] # BENGALI CURRENCY DENOMINATOR SIXTEEN
+09FA  ; [*0453.0020.0002.09FA] # BENGALI ISSHAR
+0B70  ; [*0454.0020.0002.0B70] # ORIYA ISSHAR
+0BF0  ; [*111C.0020.0002.0BF0] # TAMIL NUMBER TEN
+0BF1  ; [*111D.0020.0002.0BF1] # TAMIL NUMBER ONE HUNDRED
+0BF2  ; [*111E.0020.0002.0BF2] # TAMIL NUMBER ONE THOUSAND
+0BF3  ; [*0455.0020.0002.0BF3] # TAMIL DAY SIGN
+0BF4  ; [*0456.0020.0002.0BF4] # TAMIL MONTH SIGN
+0BF5  ; [*0457.0020.0002.0BF5] # TAMIL YEAR SIGN
+0BF6  ; [*0458.0020.0002.0BF6] # TAMIL DEBIT SIGN
+0BF7  ; [*0459.0020.0002.0BF7] # TAMIL CREDIT SIGN
+0BF8  ; [*045A.0020.0002.0BF8] # TAMIL AS ABOVE SIGN
+0BFA  ; [*045B.0020.0002.0BFA] # TAMIL NUMBER SIGN
+0C7F  ; [*045C.0020.0002.0C7F] # TELUGU SIGN TUUMU
+0CF1  ; [*045D.0020.0002.0CF1] # KANNADA SIGN JIHVAMULIYA
+0CF2  ; [*045E.0020.0002.0CF2] # KANNADA SIGN UPADHMANIYA
+0D70  ; [*111F.0020.0002.0D70] # MALAYALAM NUMBER TEN
+0D71  ; [*1120.0020.0002.0D71] # MALAYALAM NUMBER ONE HUNDRED
+0D72  ; [*1121.0020.0002.0D72] # MALAYALAM NUMBER ONE THOUSAND
+0D73  ; [*1122.0020.0002.0D73] # MALAYALAM FRACTION ONE QUARTER
+0D74  ; [*1123.0020.0002.0D74] # MALAYALAM FRACTION ONE HALF
+0D75  ; [*1124.0020.0002.0D75] # MALAYALAM FRACTION THREE QUARTERS
+0D79  ; [*045F.0020.0002.0D79] # MALAYALAM DATE MARK
+0DF4  ; [*03A5.0020.0002.0DF4] # SINHALA PUNCTUATION KUNDDALIYA
+0E4F  ; [*0467.0020.0002.0E4F] # THAI CHARACTER FONGMAN
+0E5A  ; [*03A6.0020.0002.0E5A] # THAI CHARACTER ANGKHANKHU
+0E5B  ; [*03A7.0020.0002.0E5B] # THAI CHARACTER KHOMUT
+0F01  ; [*0468.0020.0002.0F01] # TIBETAN MARK GTER YIG MGO TRUNCATED A
+0F02  ; [*0469.0020.0002.0F02] # TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA
+0F03  ; [*046A.0020.0002.0F03] # TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA
+0F04  ; [*03AA.0020.0002.0F04] # TIBETAN MARK INITIAL YIG MGO MDUN MA
+0F05  ; [*03AB.0020.0002.0F05] # TIBETAN MARK CLOSING YIG MGO SGAB MA
+0F06  ; [*03AC.0020.0002.0F06] # TIBETAN MARK CARET YIG MGO PHUR SHAD MA
+0F07  ; [*03AD.0020.0002.0F07] # TIBETAN MARK YIG MGO TSHEG SHAD MA
+0F08  ; [*03AE.0020.0002.0F08] # TIBETAN MARK SBRUL SHAD
+0F09  ; [*03AF.0020.0002.0F09] # TIBETAN MARK BSKUR YIG MGO
+0F0A  ; [*03B0.0020.0002.0F0A] # TIBETAN MARK BKA- SHOG YIG MGO
+0F0B  ; [*03B3.0020.0002.0F0B] # TIBETAN MARK INTERSYLLABIC TSHEG
+0F0C  ; [*03B3.0020.001B.0F0C] # TIBETAN MARK DELIMITER TSHEG BSTAR; QQK
+0F0D  ; [*03B4.0020.0002.0F0D] # TIBETAN MARK SHAD
+0F0E  ; [*03B5.0020.0002.0F0E] # TIBETAN MARK NYIS SHAD
+0F0F  ; [*03B6.0020.0002.0F0F] # TIBETAN MARK TSHEG SHAD
+0F10  ; [*03B7.0020.0002.0F10] # TIBETAN MARK NYIS TSHEG SHAD
+0F11  ; [*03B8.0020.0002.0F11] # TIBETAN MARK RIN CHEN SPUNGS SHAD
+0F12  ; [*03B9.0020.0002.0F12] # TIBETAN MARK RGYA GRAM SHAD
+0F13  ; [*046B.0020.0002.0F13] # TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN
+0F14  ; [*0266.0020.0002.0F14] # TIBETAN MARK GTER TSHEG
+0F15  ; [*046C.0020.0002.0F15] # TIBETAN LOGOTYPE SIGN CHAD RTAGS
+0F16  ; [*046D.0020.0002.0F16] # TIBETAN LOGOTYPE SIGN LHAG RTAGS
+0F17  ; [*046E.0020.0002.0F17] # TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS
+0F18  ; [.0000.0000.0000.0F18] # TIBETAN ASTROLOGICAL SIGN -KHYUD PA
+0F19  ; [.0000.0000.0000.0F19] # TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
+0F1A  ; [*046F.0020.0002.0F1A] # TIBETAN SIGN RDEL DKAR GCIG
+0F1B  ; [*0470.0020.0002.0F1B] # TIBETAN SIGN RDEL DKAR GNYIS
+0F1C  ; [*0471.0020.0002.0F1C] # TIBETAN SIGN RDEL DKAR GSUM
+0F1D  ; [*0472.0020.0002.0F1D] # TIBETAN SIGN RDEL NAG GCIG
+0F1E  ; [*0473.0020.0002.0F1E] # TIBETAN SIGN RDEL NAG GNYIS
+0F1F  ; [*0474.0020.0002.0F1F] # TIBETAN SIGN RDEL DKAR RDEL NAG
+0F34  ; [*0475.0020.0002.0F34] # TIBETAN MARK BSDUS RTAGS
+0F35  ; [.0000.0000.0000.0F35] # TIBETAN MARK NGAS BZUNG NYI ZLA
+0F36  ; [*0476.0020.0002.0F36] # TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN
+0F37  ; [.0000.0000.0000.0F37] # TIBETAN MARK NGAS BZUNG SGOR RTAGS
+0F38  ; [*0477.0020.0002.0F38] # TIBETAN MARK CHE MGO
+0F3A  ; [*0305.0020.0002.0F3A] # TIBETAN MARK GUG RTAGS GYON
+0F3B  ; [*0306.0020.0002.0F3B] # TIBETAN MARK GUG RTAGS GYAS
+0F3C  ; [*0307.0020.0002.0F3C] # TIBETAN MARK ANG KHANG GYON
+0F3D  ; [*0308.0020.0002.0F3D] # TIBETAN MARK ANG KHANG GYAS
+0F3E  ; [*0478.0020.0002.0F3E] # TIBETAN SIGN YAR TSHES
+0F3F  ; [*0479.0020.0002.0F3F] # TIBETAN SIGN MAR TSHES
+0F82  ; [.0000.0000.0000.0F82] # TIBETAN SIGN NYI ZLA NAA DA
+0F83  ; [.0000.0000.0000.0F83] # TIBETAN SIGN SNA LDAN
+0F85  ; [*03BA.0020.0002.0F85] # TIBETAN MARK PALUTA
+0F86  ; [.0000.0000.0000.0F86] # TIBETAN SIGN LCI RTAGS
+0F87  ; [.0000.0000.0000.0F87] # TIBETAN SIGN YANG RTAGS
+0FBE  ; [*047A.0020.0002.0FBE] # TIBETAN KU RU KHA
+0FBF  ; [*047B.0020.0002.0FBF] # TIBETAN KU RU KHA BZHI MIG CAN
+0FC0  ; [*047C.0020.0002.0FC0] # TIBETAN CANTILLATION SIGN HEAVY BEAT
+0FC1  ; [*047D.0020.0002.0FC1] # TIBETAN CANTILLATION SIGN LIGHT BEAT
+0FC2  ; [*047E.0020.0002.0FC2] # TIBETAN CANTILLATION SIGN CANG TE-U
+0FC3  ; [*047F.0020.0002.0FC3] # TIBETAN CANTILLATION SIGN SBUB -CHAL
+0FC4  ; [*0480.0020.0002.0FC4] # TIBETAN SYMBOL DRIL BU
+0FC5  ; [*0481.0020.0002.0FC5] # TIBETAN SYMBOL RDO RJE
+0FC6  ; [.0000.0000.0000.0FC6] # TIBETAN SYMBOL PADMA GDAN
+0FC7  ; [*0482.0020.0002.0FC7] # TIBETAN SYMBOL RDO RJE RGYA GRAM
+0FC8  ; [*0483.0020.0002.0FC8] # TIBETAN SYMBOL PHUR PA
+0FC9  ; [*0484.0020.0002.0FC9] # TIBETAN SYMBOL NOR BU
+0FCA  ; [*0485.0020.0002.0FCA] # TIBETAN SYMBOL NOR BU NYIS -KHYIL
+0FCB  ; [*0486.0020.0002.0FCB] # TIBETAN SYMBOL NOR BU GSUM -KHYIL
+0FCC  ; [*0487.0020.0002.0FCC] # TIBETAN SYMBOL NOR BU BZHI -KHYIL
+0FCE  ; [*0488.0020.0002.0FCE] # TIBETAN SIGN RDEL NAG RDEL DKAR
+0FCF  ; [*0489.0020.0002.0FCF] # TIBETAN SIGN RDEL NAG GSUM
+0FD0  ; [*03B1.0020.0002.0FD0] # TIBETAN MARK BSKA- SHOG GI MGO RGYAN
+0FD1  ; [*03B2.0020.0002.0FD1] # TIBETAN MARK MNYAM YIG GI MGO RGYAN
+0FD2  ; [*03BB.0020.0002.0FD2] # TIBETAN MARK NYIS TSHEG
+0FD3  ; [*03BC.0020.0002.0FD3] # TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA
+0FD4  ; [*03BD.0020.0002.0FD4] # TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA
+0FD5  ; [*048A.0020.0002.0FD5] # RIGHT-FACING SVASTI SIGN
+0FD6  ; [*048B.0020.0002.0FD6] # LEFT-FACING SVASTI SIGN
+0FD7  ; [*048C.0020.0002.0FD7] # RIGHT-FACING SVASTI SIGN WITH DOTS
+0FD8  ; [*048D.0020.0002.0FD8] # LEFT-FACING SVASTI SIGN WITH DOTS
+104A  ; [*029F.0020.0002.104A] # MYANMAR SIGN LITTLE SECTION
+104B  ; [*02A0.0020.0002.104B] # MYANMAR SIGN SECTION
+104C  ; [*03C2.0020.0002.104C] # MYANMAR SYMBOL LOCATIVE
+104D  ; [*03C3.0020.0002.104D] # MYANMAR SYMBOL COMPLETED
+104E  ; [*03C4.0020.0002.104E] # MYANMAR SYMBOL AFOREMENTIONED
+104F  ; [*03C5.0020.0002.104F] # MYANMAR SYMBOL GENITIVE
+109E  ; [*03C6.0020.0002.109E] # MYANMAR SYMBOL SHAN ONE
+109F  ; [*03C7.0020.0002.109F] # MYANMAR SYMBOL SHAN EXCLAMATION
+10FB  ; [*02B7.0020.0002.10FB] # GEORGIAN PARAGRAPH SEPARATOR
+1360  ; [*02B8.0020.0002.1360] # ETHIOPIC SECTION MARK
+1361  ; [*025F.0020.0002.1361] # ETHIOPIC WORDSPACE
+1362  ; [*0286.0020.0002.1362] # ETHIOPIC FULL STOP
+1363  ; [*0260.0020.0002.1363] # ETHIOPIC COMMA
+1364  ; [*0261.0020.0002.1364] # ETHIOPIC SEMICOLON
+1365  ; [*0262.0020.0002.1365] # ETHIOPIC COLON
+1366  ; [*0263.0020.0002.1366] # ETHIOPIC PREFACE COLON
+1367  ; [*0279.0020.0002.1367] # ETHIOPIC QUESTION MARK
+1368  ; [*02B9.0020.0002.1368] # ETHIOPIC PARAGRAPH SEPARATOR
+1372  ; [*1125.0020.0002.1372] # ETHIOPIC NUMBER TEN
+1373  ; [*1126.0020.0002.1373] # ETHIOPIC NUMBER TWENTY
+1374  ; [*1127.0020.0002.1374] # ETHIOPIC NUMBER THIRTY
+1375  ; [*1128.0020.0002.1375] # ETHIOPIC NUMBER FORTY
+1376  ; [*1129.0020.0002.1376] # ETHIOPIC NUMBER FIFTY
+1377  ; [*112A.0020.0002.1377] # ETHIOPIC NUMBER SIXTY
+1378  ; [*112B.0020.0002.1378] # ETHIOPIC NUMBER SEVENTY
+1379  ; [*112C.0020.0002.1379] # ETHIOPIC NUMBER EIGHTY
+137A  ; [*112D.0020.0002.137A] # ETHIOPIC NUMBER NINETY
+137B  ; [*112E.0020.0002.137B] # ETHIOPIC NUMBER HUNDRED
+137C  ; [*112F.0020.0002.137C] # ETHIOPIC NUMBER TEN THOUSAND
+1390  ; [*041C.0020.0002.1390] # ETHIOPIC TONAL MARK YIZET
+1391  ; [*041D.0020.0002.1391] # ETHIOPIC TONAL MARK DERET
+1392  ; [*041E.0020.0002.1392] # ETHIOPIC TONAL MARK RIKRIK
+1393  ; [*041F.0020.0002.1393] # ETHIOPIC TONAL MARK SHORT RIKRIK
+1394  ; [*0420.0020.0002.1394] # ETHIOPIC TONAL MARK DIFAT
+1395  ; [*0421.0020.0002.1395] # ETHIOPIC TONAL MARK KENAT
+1396  ; [*0422.0020.0002.1396] # ETHIOPIC TONAL MARK CHIRET
+1397  ; [*0423.0020.0002.1397] # ETHIOPIC TONAL MARK HIDET
+1398  ; [*0424.0020.0002.1398] # ETHIOPIC TONAL MARK DERET-HIDET
+1399  ; [*0425.0020.0002.1399] # ETHIOPIC TONAL MARK KURT
+1400  ; [*0225.0020.0002.1400] # CANADIAN SYLLABICS HYPHEN
+166D  ; [*03D8.0020.0002.166D] # CANADIAN SYLLABICS CHI SIGN
+166E  ; [*0289.0020.0002.166E] # CANADIAN SYLLABICS FULL STOP
+1680  ; [*020B.0020.0002.1680] # OGHAM SPACE MARK
+169B  ; [*0309.0020.0002.169B] # OGHAM FEATHER MARK
+169C  ; [*030A.0020.0002.169C] # OGHAM REVERSED FEATHER MARK
+16EB  ; [*026A.0020.0002.16EB] # RUNIC SINGLE PUNCTUATION
+16EC  ; [*026B.0020.0002.16EC] # RUNIC MULTIPLE PUNCTUATION
+16ED  ; [*026C.0020.0002.16ED] # RUNIC CROSS PUNCTUATION
+1735  ; [*029C.0020.0002.1735] # PHILIPPINE SINGLE PUNCTUATION
+1736  ; [*029D.0020.0002.1736] # PHILIPPINE DOUBLE PUNCTUATION
+17D3  ; [.0000.0000.0000.17D3] # KHMER SIGN BATHAMASAT
+17D4  ; [*02A1.0020.0002.17D4] # KHMER SIGN KHAN
+17D5  ; [*02A2.0020.0002.17D5] # KHMER SIGN BARIYOOSAN
+17D6  ; [*0267.0020.0002.17D6] # KHMER SIGN CAMNUC PII KUUH
+17D7  ; [*03CB.0020.0002.17D7] # KHMER SIGN LEK TOO
+17D8  ; [*03CC.0020.0002.17D8] # KHMER SIGN BEYYAL
+17D9  ; [*03CD.0020.0002.17D9] # KHMER SIGN PHNAEK MUAN
+17DA  ; [*03CE.0020.0002.17DA] # KHMER SIGN KOOMUUT
+1800  ; [*039F.0020.0002.1800] # MONGOLIAN BIRGA
+1801  ; [*0282.0020.0002.1801] # MONGOLIAN ELLIPSIS
+1802  ; [*023B.0020.0002.1802] # MONGOLIAN COMMA
+1803  ; [*0287.0020.0002.1803] # MONGOLIAN FULL STOP
+1804  ; [*0264.0020.0002.1804] # MONGOLIAN COLON
+1805  ; [*0265.0020.0002.1805] # MONGOLIAN FOUR DOTS
+1806  ; [*0227.0020.0002.1806] # MONGOLIAN TODO SOFT HYPHEN
+1807  ; [*0228.0020.0002.1807] # MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER
+1808  ; [*023C.0020.0002.1808] # MONGOLIAN MANCHU COMMA
+1809  ; [*0288.0020.0002.1809] # MONGOLIAN MANCHU FULL STOP
+180A  ; [*03A0.0020.0002.180A] # MONGOLIAN NIRUGU
+180E  ; [*0207.0020.0002.180E] # MONGOLIAN VOWEL SEPARATOR
+1940  ; [*03C1.0020.0002.1940] # LIMBU SIGN LOO
+1944  ; [*0272.0020.0002.1944] # LIMBU EXCLAMATION MARK
+1945  ; [*027A.0020.0002.1945] # LIMBU QUESTION MARK
+19E0  ; [*048E.0020.0002.19E0] # KHMER SYMBOL PATHAMASAT
+19E1  ; [*048F.0020.0002.19E1] # KHMER SYMBOL MUOY KOET
+19E2  ; [*0490.0020.0002.19E2] # KHMER SYMBOL PII KOET
+19E3  ; [*0491.0020.0002.19E3] # KHMER SYMBOL BEI KOET
+19E4  ; [*0492.0020.0002.19E4] # KHMER SYMBOL BUON KOET
+19E5  ; [*0493.0020.0002.19E5] # KHMER SYMBOL PRAM KOET
+19E6  ; [*0494.0020.0002.19E6] # KHMER SYMBOL PRAM-MUOY KOET
+19E7  ; [*0495.0020.0002.19E7] # KHMER SYMBOL PRAM-PII KOET
+19E8  ; [*0496.0020.0002.19E8] # KHMER SYMBOL PRAM-BEI KOET
+19E9  ; [*0497.0020.0002.19E9] # KHMER SYMBOL PRAM-BUON KOET
+19EA  ; [*0498.0020.0002.19EA] # KHMER SYMBOL DAP KOET
+19EB  ; [*0499.0020.0002.19EB] # KHMER SYMBOL DAP-MUOY KOET
+19EC  ; [*049A.0020.0002.19EC] # KHMER SYMBOL DAP-PII KOET
+19ED  ; [*049B.0020.0002.19ED] # KHMER SYMBOL DAP-BEI KOET
+19EE  ; [*049C.0020.0002.19EE] # KHMER SYMBOL DAP-BUON KOET
+19EF  ; [*049D.0020.0002.19EF] # KHMER SYMBOL DAP-PRAM KOET
+19F0  ; [*049E.0020.0002.19F0] # KHMER SYMBOL TUTEYASAT
+19F1  ; [*049F.0020.0002.19F1] # KHMER SYMBOL MUOY ROC
+19F2  ; [*04A0.0020.0002.19F2] # KHMER SYMBOL PII ROC
+19F3  ; [*04A1.0020.0002.19F3] # KHMER SYMBOL BEI ROC
+19F4  ; [*04A2.0020.0002.19F4] # KHMER SYMBOL BUON ROC
+19F5  ; [*04A3.0020.0002.19F5] # KHMER SYMBOL PRAM ROC
+19F6  ; [*04A4.0020.0002.19F6] # KHMER SYMBOL PRAM-MUOY ROC
+19F7  ; [*04A5.0020.0002.19F7] # KHMER SYMBOL PRAM-PII ROC
+19F8  ; [*04A6.0020.0002.19F8] # KHMER SYMBOL PRAM-BEI ROC
+19F9  ; [*04A7.0020.0002.19F9] # KHMER SYMBOL PRAM-BUON ROC
+19FA  ; [*04A8.0020.0002.19FA] # KHMER SYMBOL DAP ROC
+19FB  ; [*04A9.0020.0002.19FB] # KHMER SYMBOL DAP-MUOY ROC
+19FC  ; [*04AA.0020.0002.19FC] # KHMER SYMBOL DAP-PII ROC
+19FD  ; [*04AB.0020.0002.19FD] # KHMER SYMBOL DAP-BEI ROC
+19FE  ; [*04AC.0020.0002.19FE] # KHMER SYMBOL DAP-BUON ROC
+19FF  ; [*04AD.0020.0002.19FF] # KHMER SYMBOL DAP-PRAM ROC
+1A1E  ; [*02BA.0020.0002.1A1E] # BUGINESE PALLAWA
+1A1F  ; [*02BB.0020.0002.1A1F] # BUGINESE END OF SECTION
+1A7F  ; [.0000.0000.0000.1A7F] # TAI THAM COMBINING CRYPTOGRAMMIC DOT
+1AA0  ; [*03CF.0020.0002.1AA0] # TAI THAM SIGN WIANG
+1AA1  ; [*03D0.0020.0002.1AA1] # TAI THAM SIGN WIANGWAAK
+1AA2  ; [*03D1.0020.0002.1AA2] # TAI THAM SIGN SAWAN
+1AA3  ; [*03D2.0020.0002.1AA3] # TAI THAM SIGN KEOW
+1AA4  ; [*03D3.0020.0002.1AA4] # TAI THAM SIGN HOY
+1AA5  ; [*03D4.0020.0002.1AA5] # TAI THAM SIGN DOKMAI
+1AA6  ; [*03D5.0020.0002.1AA6] # TAI THAM SIGN REVERSED ROTATED RANA
+1AA8  ; [*02A3.0020.0002.1AA8] # TAI THAM SIGN KAAN
+1AA9  ; [*02A4.0020.0002.1AA9] # TAI THAM SIGN KAANKUU
+1AAA  ; [*02A5.0020.0002.1AAA] # TAI THAM SIGN SATKAAN
+1AAB  ; [*02A6.0020.0002.1AAB] # TAI THAM SIGN SATKAANKUU
+1AAC  ; [*03D6.0020.0002.1AAC] # TAI THAM SIGN HANG
+1AAD  ; [*03D7.0020.0002.1AAD] # TAI THAM SIGN CAANG
+1B5A  ; [*02BC.0020.0002.1B5A] # BALINESE PANTI
+1B5B  ; [*02BD.0020.0002.1B5B] # BALINESE PAMADA
+1B5C  ; [*028A.0020.0002.1B5C] # BALINESE WINDU
+1B5D  ; [*0268.0020.0002.1B5D] # BALINESE CARIK PAMUNGKAH
+1B5E  ; [*02A7.0020.0002.1B5E] # BALINESE CARIK SIKI
+1B5F  ; [*02A8.0020.0002.1B5F] # BALINESE CARIK PAREREN
+1B60  ; [*0226.0020.0002.1B60] # BALINESE PAMENENG
+1B61  ; [*04AE.0020.0002.1B61] # BALINESE MUSICAL SYMBOL DONG
+1B62  ; [*04AF.0020.0002.1B62] # BALINESE MUSICAL SYMBOL DENG
+1B63  ; [*04B0.0020.0002.1B63] # BALINESE MUSICAL SYMBOL DUNG
+1B64  ; [*04B1.0020.0002.1B64] # BALINESE MUSICAL SYMBOL DANG
+1B65  ; [*04B2.0020.0002.1B65] # BALINESE MUSICAL SYMBOL DANG SURANG
+1B66  ; [*04B3.0020.0002.1B66] # BALINESE MUSICAL SYMBOL DING
+1B67  ; [*04B4.0020.0002.1B67] # BALINESE MUSICAL SYMBOL DAENG
+1B68  ; [*04B5.0020.0002.1B68] # BALINESE MUSICAL SYMBOL DEUNG
+1B69  ; [*04B6.0020.0002.1B69] # BALINESE MUSICAL SYMBOL DAING
+1B6A  ; [*04B7.0020.0002.1B6A] # BALINESE MUSICAL SYMBOL DANG GEDE
+1B6B  ; [.0000.0000.0000.1B6B] # BALINESE MUSICAL SYMBOL COMBINING TEGEH
+1B6C  ; [.0000.0000.0000.1B6C] # BALINESE MUSICAL SYMBOL COMBINING ENDEP
+1B6D  ; [.0000.0000.0000.1B6D] # BALINESE MUSICAL SYMBOL COMBINING KEMPUL
+1B6E  ; [.0000.0000.0000.1B6E] # BALINESE MUSICAL SYMBOL COMBINING KEMPLI
+1B6F  ; [.0000.0000.0000.1B6F] # BALINESE MUSICAL SYMBOL COMBINING JEGOGAN
+1B70  ; [.0000.0000.0000.1B70] # BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN
+1B71  ; [.0000.0000.0000.1B71] # BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN
+1B72  ; [.0000.0000.0000.1B72] # BALINESE MUSICAL SYMBOL COMBINING BENDE
+1B73  ; [.0000.0000.0000.1B73] # BALINESE MUSICAL SYMBOL COMBINING GONG
+1B74  ; [*04B8.0020.0002.1B74] # BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG
+1B75  ; [*04B9.0020.0002.1B75] # BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG
+1B76  ; [*04BA.0020.0002.1B76] # BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK
+1B77  ; [*04BB.0020.0002.1B77] # BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK
+1B78  ; [*04BC.0020.0002.1B78] # BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG
+1B79  ; [*04BD.0020.0002.1B79] # BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG
+1B7A  ; [*04BE.0020.0002.1B7A] # BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK
+1B7B  ; [*04BF.0020.0002.1B7B] # BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK
+1B7C  ; [*04C0.0020.0002.1B7C] # BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING
+1C3B  ; [*0298.0020.0002.1C3B] # LEPCHA PUNCTUATION TA-ROL
+1C3C  ; [*0299.0020.0002.1C3C] # LEPCHA PUNCTUATION NYET THYOOM TA-ROL
+1C3D  ; [*03BE.0020.0002.1C3D] # LEPCHA PUNCTUATION CER-WA
+1C3E  ; [*03BF.0020.0002.1C3E] # LEPCHA PUNCTUATION TSHOOK CER-WA
+1C3F  ; [*03C0.0020.0002.1C3F] # LEPCHA PUNCTUATION TSHOOK
+1C7E  ; [*02B3.0020.0002.1C7E] # OL CHIKI PUNCTUATION MUCAAD
+1C7F  ; [*02B4.0020.0002.1C7F] # OL CHIKI PUNCTUATION DOUBLE MUCAAD
+1CD0  ; [.0000.0000.0000.1CD0] # VEDIC TONE KARSHANA
+1CD1  ; [.0000.0000.0000.1CD1] # VEDIC TONE SHARA
+1CD2  ; [.0000.0000.0000.1CD2] # VEDIC TONE PRENKHA
+1CD3  ; [.0000.0000.0000.1CD3] # VEDIC SIGN NIHSHVASA
+1CD4  ; [.0000.0000.0000.1CD4] # VEDIC SIGN YAJURVEDIC MIDLINE SVARITA
+1CD5  ; [.0000.0000.0000.1CD5] # VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA
+1CD6  ; [.0000.0000.0000.1CD6] # VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA
+1CD7  ; [.0000.0000.0000.1CD7] # VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA
+1CD8  ; [.0000.0000.0000.1CD8] # VEDIC TONE CANDRA BELOW
+1CD9  ; [.0000.0000.0000.1CD9] # VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER
+1CDA  ; [.0000.0000.0000.1CDA] # VEDIC TONE DOUBLE SVARITA
+1CDB  ; [.0000.0000.0000.1CDB] # VEDIC TONE TRIPLE SVARITA
+1CDC  ; [.0000.0000.0000.1CDC] # VEDIC TONE KATHAKA ANUDATTA
+1CDD  ; [.0000.0000.0000.1CDD] # VEDIC TONE DOT BELOW
+1CDE  ; [.0000.0000.0000.1CDE] # VEDIC TONE TWO DOTS BELOW
+1CDF  ; [.0000.0000.0000.1CDF] # VEDIC TONE THREE DOTS BELOW
+1CE0  ; [.0000.0000.0000.1CE0] # VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA
+1CE1  ; [.0000.0000.0000.1CE1] # VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA
+1CE2  ; [.0000.0000.0000.1CE2] # VEDIC SIGN VISARGA SVARITA
+1CE3  ; [.0000.0000.0000.1CE3] # VEDIC SIGN VISARGA UDATTA
+1CE4  ; [.0000.0000.0000.1CE4] # VEDIC SIGN REVERSED VISARGA UDATTA
+1CE5  ; [.0000.0000.0000.1CE5] # VEDIC SIGN VISARGA ANUDATTA
+1CE6  ; [.0000.0000.0000.1CE6] # VEDIC SIGN REVERSED VISARGA ANUDATTA
+1CE7  ; [.0000.0000.0000.1CE7] # VEDIC SIGN VISARGA UDATTA WITH TAIL
+1CE8  ; [.0000.0000.0000.1CE8] # VEDIC SIGN VISARGA ANUDATTA WITH TAIL
+1FBD  ; [*0219.0020.0002.1FBD] # GREEK KORONIS; QQC
+1FBF  ; [*0219.0020.0002.1FBF] # GREEK PSILI
+1FC0  ; [*021F.0020.0002.1FC0] # GREEK PERISPOMENI
+1FC1  ; [*0216.0020.0002.00A8][.0000.0045.0002.0342] # GREEK DIALYTIKA AND PERISPOMENI; QQCM
+1FCD  ; [*0219.0020.0002.1FBF][.0000.0035.0002.0300] # GREEK PSILI AND VARIA; QQCM
+1FCE  ; [*0219.0020.0002.1FBF][.0000.0032.0002.0301] # GREEK PSILI AND OXIA; QQCM
+1FCF  ; [*0219.0020.0002.1FBF][.0000.0045.0002.0342] # GREEK PSILI AND PERISPOMENI; QQCM
+1FDD  ; [*021A.0020.0002.1FFE][.0000.0035.0002.0300] # GREEK DASIA AND VARIA; QQCM
+1FDE  ; [*021A.0020.0002.1FFE][.0000.0032.0002.0301] # GREEK DASIA AND OXIA; QQCM
+1FDF  ; [*021A.0020.0002.1FFE][.0000.0045.0002.0342] # GREEK DASIA AND PERISPOMENI; QQCM
+1FED  ; [*0216.0020.0002.00A8][.0000.0035.0002.0300] # GREEK DIALYTIKA AND VARIA; QQCM
+1FEE  ; [*0216.0020.0002.00A8][.0000.0032.0002.0301] # GREEK DIALYTIKA AND OXIA; QQCM
+1FEF  ; [*020E.0020.0002.1FEF] # GREEK VARIA; QQC
+1FFD  ; [*020F.0020.0002.1FFD] # GREEK OXIA; QQC
+1FFE  ; [*021A.0020.0002.1FFE] # GREEK DASIA
+2000  ; [*020A.0020.0004.2000] # EN QUAD; QQK
+2001  ; [*020A.0020.0004.2001] # EM QUAD; QQK
+2002  ; [*020A.0020.0004.2002] # EN SPACE; QQK
+2003  ; [*020A.0020.0004.2003] # EM SPACE; QQK
+2004  ; [*020A.0020.0004.2004] # THREE-PER-EM SPACE; QQK
+2005  ; [*020A.0020.0004.2005] # FOUR-PER-EM SPACE; QQK
+2006  ; [*020A.0020.0004.2006] # SIX-PER-EM SPACE; QQK
+2007  ; [*020A.0020.001B.2007] # FIGURE SPACE; QQK
+2008  ; [*020A.0020.0004.2008] # PUNCTUATION SPACE; QQK
+2009  ; [*020A.0020.0004.2009] # THIN SPACE; QQK
+200A  ; [*020A.0020.0004.200A] # HAIR SPACE; QQK
+2010  ; [*0229.0020.0002.2010] # HYPHEN
+2011  ; [*0229.0020.001B.2011] # NON-BREAKING HYPHEN; QQK
+2012  ; [*022A.0020.0002.2012] # FIGURE DASH
+2013  ; [*022B.0020.0002.2013] # EN DASH
+2014  ; [*022C.0020.0002.2014] # EM DASH
+2015  ; [*022D.0020.0002.2015] # HORIZONTAL BAR
+2016  ; [*055A.0020.0002.2016] # DOUBLE VERTICAL LINE
+2017  ; [*021E.0020.0002.2017] # DOUBLE LOW LINE
+2018  ; [*02EF.0020.0002.2018] # LEFT SINGLE QUOTATION MARK
+2019  ; [*02F0.0020.0002.2019] # RIGHT SINGLE QUOTATION MARK
+201A  ; [*02F1.0020.0002.201A] # SINGLE LOW-9 QUOTATION MARK
+201B  ; [*02F2.0020.0002.201B] # SINGLE HIGH-REVERSED-9 QUOTATION MARK
+201C  ; [*02F6.0020.0002.201C] # LEFT DOUBLE QUOTATION MARK
+201D  ; [*02F7.0020.0002.201D] # RIGHT DOUBLE QUOTATION MARK
+201E  ; [*02F8.0020.0002.201E] # DOUBLE LOW-9 QUOTATION MARK
+201F  ; [*02F9.0020.0002.201F] # DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+2020  ; [*036A.0020.0002.2020] # DAGGER
+2021  ; [*036B.0020.0002.2021] # DOUBLE DAGGER
+2022  ; [*036C.0020.0002.2022] # BULLET
+2023  ; [*036D.0020.0002.2023] # TRIANGULAR BULLET
+2024  ; [*0281.0020.0004.2024] # ONE DOT LEADER; QQK
+2025  ; [*0281.0020.0004.2025][*0281.0020.0004.2025] # TWO DOT LEADER; QQKN
+2026  ; [*0281.0020.0004.2026][*0281.0020.0004.2026][*0281.0020.001F.2026] # HORIZONTAL ELLIPSIS; QQKN
+2027  ; [*036E.0020.0002.2027] # HYPHENATION POINT
+2028  ; [*0208.0020.0002.2028] # LINE SEPARATOR
+2029  ; [*0209.0020.0002.2029] # PARAGRAPH SEPARATOR
+202F  ; [*020A.0020.001B.202F] # NARROW NO-BREAK SPACE; QQK
+2030  ; [*0365.0020.0002.2030] # PER MILLE SIGN
+2031  ; [*0367.0020.0002.2031] # PER TEN THOUSAND SIGN
+2032  ; [*0372.0020.0002.2032] # PRIME
+2033  ; [*0372.0020.0004.2033][*0372.0020.0004.2033] # DOUBLE PRIME; QQKN
+2034  ; [*0372.0020.0004.2034][*0372.0020.0004.2034][*0372.0020.001F.2034] # TRIPLE PRIME; QQKN
+2035  ; [*0373.0020.0002.2035] # REVERSED PRIME
+2036  ; [*0373.0020.0004.2036][*0373.0020.0004.2036] # REVERSED DOUBLE PRIME; QQKN
+2037  ; [*0373.0020.0004.2037][*0373.0020.0004.2037][*0373.0020.001F.2037] # REVERSED TRIPLE PRIME; QQKN
+2038  ; [*0376.0020.0002.2038] # CARET
+2039  ; [*02F3.0020.0002.2039] # SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+203A  ; [*02F4.0020.0002.203A] # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+203B  ; [*0377.0020.0002.203B] # REFERENCE MARK
+203C  ; [*026E.0020.0004.203C][*026E.0020.0004.203C] # DOUBLE EXCLAMATION MARK; QQKN
+203D  ; [*027F.0020.0002.203D] # INTERROBANG
+203E  ; [*0213.0020.0002.203E] # OVERLINE
+203F  ; [*0378.0020.0002.203F] # UNDERTIE
+2040  ; [*037A.0020.0002.2040] # CHARACTER TIE
+2041  ; [*037C.0020.0002.2041] # CARET INSERTION POINT
+2042  ; [*037D.0020.0002.2042] # ASTERISM
+2043  ; [*036F.0020.0002.2043] # HYPHEN BULLET
+2044  ; [*035D.0020.0002.2044] # FRACTION SLASH
+2045  ; [*030B.0020.0002.2045] # LEFT SQUARE BRACKET WITH QUILL
+2046  ; [*030C.0020.0002.2046] # RIGHT SQUARE BRACKET WITH QUILL
+2047  ; [*0273.0020.0004.2047][*0273.0020.0004.2047] # DOUBLE QUESTION MARK; QQKN
+2048  ; [*0273.0020.0004.2048][*026E.0020.0004.2048] # QUESTION EXCLAMATION MARK; QQKN
+2049  ; [*026E.0020.0004.2049][*0273.0020.0004.2049] # EXCLAMATION QUESTION MARK; QQKN
+204A  ; [*0361.0020.0002.204A] # TIRONIAN SIGN ET
+204B  ; [*0353.0020.0002.204B] # REVERSED PILCROW SIGN
+204C  ; [*0370.0020.0002.204C] # BLACK LEFTWARDS BULLET
+204D  ; [*0371.0020.0002.204D] # BLACK RIGHTWARDS BULLET
+204E  ; [*0358.0020.0002.204E] # LOW ASTERISK
+204F  ; [*0245.0020.0002.204F] # REVERSED SEMICOLON
+2050  ; [*037B.0020.0002.2050] # CLOSE UP
+2051  ; [*0359.0020.0002.2051] # TWO ASTERISKS ALIGNED VERTICALLY
+2052  ; [*0369.0020.0002.2052] # COMMERCIAL MINUS SIGN
+2053  ; [*022E.0020.0002.2053] # SWUNG DASH
+2054  ; [*0379.0020.0002.2054] # INVERTED UNDERTIE
+2055  ; [*02D3.0020.0002.2055] # FLOWER PUNCTUATION MARK
+2056  ; [*02D4.0020.0002.2056] # THREE DOT PUNCTUATION
+2057  ; [*0372.0020.0004.2057][*0372.0020.0004.2057][*0372.0020.001F.2057][*0372.0020.001F.2057] # QUADRUPLE PRIME; QQKN
+2058  ; [*02D5.0020.0002.2058] # FOUR DOT PUNCTUATION
+2059  ; [*02D6.0020.0002.2059] # FIVE DOT PUNCTUATION
+205A  ; [*02D7.0020.0002.205A] # TWO DOT PUNCTUATION
+205B  ; [*02D8.0020.0002.205B] # FOUR DOT MARK
+205C  ; [*02D9.0020.0002.205C] # DOTTED CROSS
+205D  ; [*02DA.0020.0002.205D] # TRICOLON
+205E  ; [*02DB.0020.0002.205E] # VERTICAL FOUR DOTS
+205F  ; [*020A.0020.0004.205F] # MEDIUM MATHEMATICAL SPACE; QQK
+2061  ; [.0000.0000.0000.2061] # FUNCTION APPLICATION
+2062  ; [.0000.0000.0000.2062] # INVISIBLE TIMES
+2063  ; [.0000.0000.0000.2063] # INVISIBLE SEPARATOR
+2064  ; [.0000.0000.0000.2064] # INVISIBLE PLUS
+207A  ; [*0550.0020.0014.207A] # SUPERSCRIPT PLUS SIGN; QQK
+207B  ; [*055C.0020.0014.207B] # SUPERSCRIPT MINUS; QQK
+207C  ; [*0555.0020.0014.207C] # SUPERSCRIPT EQUALS SIGN; QQK
+207D  ; [*02FF.0020.0014.207D] # SUPERSCRIPT LEFT PARENTHESIS; QQK
+207E  ; [*0300.0020.0014.207E] # SUPERSCRIPT RIGHT PARENTHESIS; QQK
+208A  ; [*0550.0020.0015.208A] # SUBSCRIPT PLUS SIGN; QQK
+208B  ; [*055C.0020.0015.208B] # SUBSCRIPT MINUS; QQK
+208C  ; [*0555.0020.0015.208C] # SUBSCRIPT EQUALS SIGN; QQK
+208D  ; [*02FF.0020.0015.208D] # SUBSCRIPT LEFT PARENTHESIS; QQK
+208E  ; [*0300.0020.0015.208E] # SUBSCRIPT RIGHT PARENTHESIS; QQK
+2104  ; [*04C1.0020.0002.2104] # CENTRE LINE SYMBOL
+2108  ; [*04C2.0020.0002.2108] # SCRUPLE
+2114  ; [*04C3.0020.0002.2114] # L B BAR SYMBOL
+2117  ; [*04C4.0020.0002.2117] # SOUND RECORDING COPYRIGHT
+2118  ; [*04C5.0020.0002.2118] # SCRIPT CAPITAL P
+211E  ; [*04C6.0020.0002.211E] # PRESCRIPTION TAKE
+211F  ; [*04C7.0020.0002.211F] # RESPONSE
+2123  ; [*04C8.0020.0002.2123] # VERSICLE
+2125  ; [*04C9.0020.0002.2125] # OUNCE SIGN
+2127  ; [*04CA.0020.0002.2127] # INVERTED OHM SIGN
+2129  ; [*04CB.0020.0002.2129] # TURNED GREEK SMALL LETTER IOTA
+212E  ; [*04CC.0020.0002.212E] # ESTIMATED SYMBOL
+213A  ; [*04CD.0020.0002.213A] # ROTATED CAPITAL Q
+2140  ; [*054F.0020.0005.2140] # DOUBLE-STRUCK N-ARY SUMMATION; QQK
+2141  ; [*04CE.0020.0002.2141] # TURNED SANS-SERIF CAPITAL G
+2142  ; [*04CF.0020.0002.2142] # TURNED SANS-SERIF CAPITAL L
+2143  ; [*04D0.0020.0002.2143] # REVERSED SANS-SERIF CAPITAL L
+2144  ; [*04D1.0020.0002.2144] # TURNED SANS-SERIF CAPITAL Y
+214A  ; [*04D2.0020.0002.214A] # PROPERTY LINE
+214B  ; [*0360.0020.0002.214B] # TURNED AMPERSAND
+214C  ; [*04D3.0020.0002.214C] # PER SIGN
+214D  ; [*04D4.0020.0002.214D] # AKTIESELSKAB
+214F  ; [*04D5.0020.0002.214F] # SYMBOL FOR SAMARITAN SOURCE
+2180  ; [*1130.0020.0002.2180] # ROMAN NUMERAL ONE THOUSAND C D
+2181  ; [*1131.0020.0002.2181] # ROMAN NUMERAL FIVE THOUSAND
+2182  ; [*1132.0020.0002.2182] # ROMAN NUMERAL TEN THOUSAND
+2186  ; [*1133.0020.0002.2186] # ROMAN NUMERAL FIFTY EARLY FORM
+2187  ; [*1134.0020.0002.2187] # ROMAN NUMERAL FIFTY THOUSAND
+2188  ; [*1135.0020.0002.2188] # ROMAN NUMERAL ONE HUNDRED THOUSAND
+2190  ; [*04D6.0020.0002.2190] # LEFTWARDS ARROW
+2191  ; [*04D8.0020.0002.2191] # UPWARDS ARROW
+2192  ; [*04D7.0020.0002.2192] # RIGHTWARDS ARROW
+2193  ; [*04D9.0020.0002.2193] # DOWNWARDS ARROW
+2194  ; [*04DA.0020.0002.2194] # LEFT RIGHT ARROW
+2195  ; [*04DB.0020.0002.2195] # UP DOWN ARROW
+2196  ; [*04DC.0020.0002.2196] # NORTH WEST ARROW
+2197  ; [*04DD.0020.0002.2197] # NORTH EAST ARROW
+2198  ; [*04DE.0020.0002.2198] # SOUTH EAST ARROW
+2199  ; [*04DF.0020.0002.2199] # SOUTH WEST ARROW
+219A  ; [*04D6.0020.0002.2190][.0000.0054.0002.0338] # LEFTWARDS ARROW WITH STROKE; QQCM
+219B  ; [*04D7.0020.0002.2192][.0000.0054.0002.0338] # RIGHTWARDS ARROW WITH STROKE; QQCM
+219C  ; [*04E0.0020.0002.219C] # LEFTWARDS WAVE ARROW
+219D  ; [*04E1.0020.0002.219D] # RIGHTWARDS WAVE ARROW
+219E  ; [*04E2.0020.0002.219E] # LEFTWARDS TWO HEADED ARROW
+219F  ; [*04E3.0020.0002.219F] # UPWARDS TWO HEADED ARROW
+21A0  ; [*04E4.0020.0002.21A0] # RIGHTWARDS TWO HEADED ARROW
+21A1  ; [*04E5.0020.0002.21A1] # DOWNWARDS TWO HEADED ARROW
+21A2  ; [*04E6.0020.0002.21A2] # LEFTWARDS ARROW WITH TAIL
+21A3  ; [*04E7.0020.0002.21A3] # RIGHTWARDS ARROW WITH TAIL
+21A4  ; [*04E8.0020.0002.21A4] # LEFTWARDS ARROW FROM BAR
+21A5  ; [*04E9.0020.0002.21A5] # UPWARDS ARROW FROM BAR
+21A6  ; [*04EA.0020.0002.21A6] # RIGHTWARDS ARROW FROM BAR
+21A7  ; [*04EB.0020.0002.21A7] # DOWNWARDS ARROW FROM BAR
+21A8  ; [*04EC.0020.0002.21A8] # UP DOWN ARROW WITH BASE
+21A9  ; [*04ED.0020.0002.21A9] # LEFTWARDS ARROW WITH HOOK
+21AA  ; [*04EE.0020.0002.21AA] # RIGHTWARDS ARROW WITH HOOK
+21AB  ; [*04EF.0020.0002.21AB] # LEFTWARDS ARROW WITH LOOP
+21AC  ; [*04F0.0020.0002.21AC] # RIGHTWARDS ARROW WITH LOOP
+21AD  ; [*04F1.0020.0002.21AD] # LEFT RIGHT WAVE ARROW
+21AE  ; [*04DA.0020.0002.2194][.0000.0054.0002.0338] # LEFT RIGHT ARROW WITH STROKE; QQCM
+21AF  ; [*04F2.0020.0002.21AF] # DOWNWARDS ZIGZAG ARROW
+21B0  ; [*04F3.0020.0002.21B0] # UPWARDS ARROW WITH TIP LEFTWARDS
+21B1  ; [*04F4.0020.0002.21B1] # UPWARDS ARROW WITH TIP RIGHTWARDS
+21B2  ; [*04F5.0020.0002.21B2] # DOWNWARDS ARROW WITH TIP LEFTWARDS
+21B3  ; [*04F6.0020.0002.21B3] # DOWNWARDS ARROW WITH TIP RIGHTWARDS
+21B4  ; [*04F7.0020.0002.21B4] # RIGHTWARDS ARROW WITH CORNER DOWNWARDS
+21B5  ; [*04F8.0020.0002.21B5] # DOWNWARDS ARROW WITH CORNER LEFTWARDS
+21B6  ; [*04F9.0020.0002.21B6] # ANTICLOCKWISE TOP SEMICIRCLE ARROW
+21B7  ; [*04FA.0020.0002.21B7] # CLOCKWISE TOP SEMICIRCLE ARROW
+21B8  ; [*04FB.0020.0002.21B8] # NORTH WEST ARROW TO LONG BAR
+21B9  ; [*04FC.0020.0002.21B9] # LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR
+21BA  ; [*04FD.0020.0002.21BA] # ANTICLOCKWISE OPEN CIRCLE ARROW
+21BB  ; [*04FE.0020.0002.21BB] # CLOCKWISE OPEN CIRCLE ARROW
+21BC  ; [*04FF.0020.0002.21BC] # LEFTWARDS HARPOON WITH BARB UPWARDS
+21BD  ; [*0500.0020.0002.21BD] # LEFTWARDS HARPOON WITH BARB DOWNWARDS
+21BE  ; [*0501.0020.0002.21BE] # UPWARDS HARPOON WITH BARB RIGHTWARDS
+21BF  ; [*0502.0020.0002.21BF] # UPWARDS HARPOON WITH BARB LEFTWARDS
+21C0  ; [*0503.0020.0002.21C0] # RIGHTWARDS HARPOON WITH BARB UPWARDS
+21C1  ; [*0504.0020.0002.21C1] # RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+21C2  ; [*0505.0020.0002.21C2] # DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+21C3  ; [*0506.0020.0002.21C3] # DOWNWARDS HARPOON WITH BARB LEFTWARDS
+21C4  ; [*0507.0020.0002.21C4] # RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+21C5  ; [*0508.0020.0002.21C5] # UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
+21C6  ; [*0509.0020.0002.21C6] # LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+21C7  ; [*050A.0020.0002.21C7] # LEFTWARDS PAIRED ARROWS
+21C8  ; [*050B.0020.0002.21C8] # UPWARDS PAIRED ARROWS
+21C9  ; [*050C.0020.0002.21C9] # RIGHTWARDS PAIRED ARROWS
+21CA  ; [*050D.0020.0002.21CA] # DOWNWARDS PAIRED ARROWS
+21CB  ; [*050E.0020.0002.21CB] # LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+21CC  ; [*050F.0020.0002.21CC] # RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+21CD  ; [*0510.0020.0002.21D0][.0000.0054.0002.0338] # LEFTWARDS DOUBLE ARROW WITH STROKE; QQCM
+21CE  ; [*0514.0020.0002.21D4][.0000.0054.0002.0338] # LEFT RIGHT DOUBLE ARROW WITH STROKE; QQCM
+21CF  ; [*0512.0020.0002.21D2][.0000.0054.0002.0338] # RIGHTWARDS DOUBLE ARROW WITH STROKE; QQCM
+21D0  ; [*0510.0020.0002.21D0] # LEFTWARDS DOUBLE ARROW
+21D1  ; [*0511.0020.0002.21D1] # UPWARDS DOUBLE ARROW
+21D2  ; [*0512.0020.0002.21D2] # RIGHTWARDS DOUBLE ARROW
+21D3  ; [*0513.0020.0002.21D3] # DOWNWARDS DOUBLE ARROW
+21D4  ; [*0514.0020.0002.21D4] # LEFT RIGHT DOUBLE ARROW
+21D5  ; [*0515.0020.0002.21D5] # UP DOWN DOUBLE ARROW
+21D6  ; [*0516.0020.0002.21D6] # NORTH WEST DOUBLE ARROW
+21D7  ; [*0517.0020.0002.21D7] # NORTH EAST DOUBLE ARROW
+21D8  ; [*0518.0020.0002.21D8] # SOUTH EAST DOUBLE ARROW
+21D9  ; [*0519.0020.0002.21D9] # SOUTH WEST DOUBLE ARROW
+21DA  ; [*051A.0020.0002.21DA] # LEFTWARDS TRIPLE ARROW
+21DB  ; [*051B.0020.0002.21DB] # RIGHTWARDS TRIPLE ARROW
+21DC  ; [*051C.0020.0002.21DC] # LEFTWARDS SQUIGGLE ARROW
+21DD  ; [*051D.0020.0002.21DD] # RIGHTWARDS SQUIGGLE ARROW
+21DE  ; [*051E.0020.0002.21DE] # UPWARDS ARROW WITH DOUBLE STROKE
+21DF  ; [*051F.0020.0002.21DF] # DOWNWARDS ARROW WITH DOUBLE STROKE
+21E0  ; [*0520.0020.0002.21E0] # LEFTWARDS DASHED ARROW
+21E1  ; [*0521.0020.0002.21E1] # UPWARDS DASHED ARROW
+21E2  ; [*0522.0020.0002.21E2] # RIGHTWARDS DASHED ARROW
+21E3  ; [*0523.0020.0002.21E3] # DOWNWARDS DASHED ARROW
+21E4  ; [*0524.0020.0002.21E4] # LEFTWARDS ARROW TO BAR
+21E5  ; [*0525.0020.0002.21E5] # RIGHTWARDS ARROW TO BAR
+21E6  ; [*0526.0020.0002.21E6] # LEFTWARDS WHITE ARROW
+21E7  ; [*0527.0020.0002.21E7] # UPWARDS WHITE ARROW
+21E8  ; [*0528.0020.0002.21E8] # RIGHTWARDS WHITE ARROW
+21E9  ; [*0529.0020.0002.21E9] # DOWNWARDS WHITE ARROW
+21EA  ; [*052A.0020.0002.21EA] # UPWARDS WHITE ARROW FROM BAR
+21EB  ; [*052B.0020.0002.21EB] # UPWARDS WHITE ARROW ON PEDESTAL
+21EC  ; [*052C.0020.0002.21EC] # UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR
+21ED  ; [*052D.0020.0002.21ED] # UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR
+21EE  ; [*052E.0020.0002.21EE] # UPWARDS WHITE DOUBLE ARROW
+21EF  ; [*052F.0020.0002.21EF] # UPWARDS WHITE DOUBLE ARROW ON PEDESTAL
+21F0  ; [*0530.0020.0002.21F0] # RIGHTWARDS WHITE ARROW FROM WALL
+21F1  ; [*0531.0020.0002.21F1] # NORTH WEST ARROW TO CORNER
+21F2  ; [*0532.0020.0002.21F2] # SOUTH EAST ARROW TO CORNER
+21F3  ; [*0533.0020.0002.21F3] # UP DOWN WHITE ARROW
+21F4  ; [*0534.0020.0002.21F4] # RIGHT ARROW WITH SMALL CIRCLE
+21F5  ; [*0535.0020.0002.21F5] # DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW
+21F6  ; [*0536.0020.0002.21F6] # THREE RIGHTWARDS ARROWS
+21F7  ; [*0537.0020.0002.21F7] # LEFTWARDS ARROW WITH VERTICAL STROKE
+21F8  ; [*0538.0020.0002.21F8] # RIGHTWARDS ARROW WITH VERTICAL STROKE
+21F9  ; [*0539.0020.0002.21F9] # LEFT RIGHT ARROW WITH VERTICAL STROKE
+21FA  ; [*053A.0020.0002.21FA] # LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE
+21FB  ; [*053B.0020.0002.21FB] # RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE
+21FC  ; [*053C.0020.0002.21FC] # LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE
+21FD  ; [*053D.0020.0002.21FD] # LEFTWARDS OPEN-HEADED ARROW
+21FE  ; [*053E.0020.0002.21FE] # RIGHTWARDS OPEN-HEADED ARROW
+21FF  ; [*053F.0020.0002.21FF] # LEFT RIGHT OPEN-HEADED ARROW
+2200  ; [*0540.0020.0002.2200] # FOR ALL
+2201  ; [*0541.0020.0002.2201] # COMPLEMENT
+2202  ; [*0542.0020.0002.2202] # PARTIAL DIFFERENTIAL
+2203  ; [*0543.0020.0002.2203] # THERE EXISTS
+2204  ; [*0543.0020.0002.2203][.0000.0054.0002.0338] # THERE DOES NOT EXIST; QQCM
+2205  ; [*0544.0020.0002.2205] # EMPTY SET
+2206  ; [*0545.0020.0002.2206] # INCREMENT
+2207  ; [*0546.0020.0002.2207] # NABLA
+2208  ; [*0547.0020.0002.2208] # ELEMENT OF
+2209  ; [*0547.0020.0002.2208][.0000.0054.0002.0338] # NOT AN ELEMENT OF; QQCM
+220A  ; [*0548.0020.0002.220A] # SMALL ELEMENT OF
+220B  ; [*0549.0020.0002.220B] # CONTAINS AS MEMBER
+220C  ; [*0549.0020.0002.220B][.0000.0054.0002.0338] # DOES NOT CONTAIN AS MEMBER; QQCM
+220D  ; [*054A.0020.0002.220D] # SMALL CONTAINS AS MEMBER
+220E  ; [*054C.0020.0002.220E] # END OF PROOF
+220F  ; [*054D.0020.0002.220F] # N-ARY PRODUCT
+2210  ; [*054E.0020.0002.2210] # N-ARY COPRODUCT
+2211  ; [*054F.0020.0002.2211] # N-ARY SUMMATION
+2212  ; [*055C.0020.0002.2212] # MINUS SIGN
+2213  ; [*055D.0020.0002.2213] # MINUS-OR-PLUS SIGN
+2214  ; [*055E.0020.0002.2214] # DOT PLUS
+2215  ; [*055F.0020.0002.2215] # DIVISION SLASH
+2216  ; [*0560.0020.0002.2216] # SET MINUS
+2217  ; [*0561.0020.0002.2217] # ASTERISK OPERATOR
+2218  ; [*0562.0020.0002.2218] # RING OPERATOR
+2219  ; [*0563.0020.0002.2219] # BULLET OPERATOR
+221A  ; [*0564.0020.0002.221A] # SQUARE ROOT
+221B  ; [*0565.0020.0002.221B] # CUBE ROOT
+221C  ; [*0567.0020.0002.221C] # FOURTH ROOT
+221D  ; [*0569.0020.0002.221D] # PROPORTIONAL TO
+221E  ; [*056A.0020.0002.221E] # INFINITY
+221F  ; [*056B.0020.0002.221F] # RIGHT ANGLE
+2220  ; [*056C.0020.0002.2220] # ANGLE
+2221  ; [*056D.0020.0002.2221] # MEASURED ANGLE
+2222  ; [*056E.0020.0002.2222] # SPHERICAL ANGLE
+2223  ; [*056F.0020.0002.2223] # DIVIDES
+2224  ; [*056F.0020.0002.2223][.0000.0054.0002.0338] # DOES NOT DIVIDE; QQCM
+2225  ; [*0570.0020.0002.2225] # PARALLEL TO
+2226  ; [*0570.0020.0002.2225][.0000.0054.0002.0338] # NOT PARALLEL TO; QQCM
+2227  ; [*0571.0020.0002.2227] # LOGICAL AND
+2228  ; [*0572.0020.0002.2228] # LOGICAL OR
+2229  ; [*0573.0020.0002.2229] # INTERSECTION
+222A  ; [*0574.0020.0002.222A] # UNION
+222B  ; [*0575.0020.0002.222B] # INTEGRAL
+222C  ; [*0575.0020.0004.222C][*0575.0020.0004.222C] # DOUBLE INTEGRAL; QQKN
+222D  ; [*0575.0020.0004.222D][*0575.0020.0004.222D][*0575.0020.001F.222D] # TRIPLE INTEGRAL; QQKN
+222E  ; [*0576.0020.0002.222E] # CONTOUR INTEGRAL
+222F  ; [*0576.0020.0004.222F][*0576.0020.0004.222F] # SURFACE INTEGRAL; QQKN
+2230  ; [*0576.0020.0004.2230][*0576.0020.0004.2230][*0576.0020.001F.2230] # VOLUME INTEGRAL; QQKN
+2231  ; [*0577.0020.0002.2231] # CLOCKWISE INTEGRAL
+2232  ; [*0578.0020.0002.2232] # CLOCKWISE CONTOUR INTEGRAL
+2233  ; [*0579.0020.0002.2233] # ANTICLOCKWISE CONTOUR INTEGRAL
+2234  ; [*057A.0020.0002.2234] # THEREFORE
+2235  ; [*057B.0020.0002.2235] # BECAUSE
+2236  ; [*057C.0020.0002.2236] # RATIO
+2237  ; [*057D.0020.0002.2237] # PROPORTION
+2238  ; [*057E.0020.0002.2238] # DOT MINUS
+2239  ; [*057F.0020.0002.2239] # EXCESS
+223A  ; [*0580.0020.0002.223A] # GEOMETRIC PROPORTION
+223B  ; [*0581.0020.0002.223B] # HOMOTHETIC
+223C  ; [*0582.0020.0002.223C] # TILDE OPERATOR
+223D  ; [*0583.0020.0002.223D] # REVERSED TILDE
+223E  ; [*0584.0020.0002.223E] # INVERTED LAZY S
+223F  ; [*0585.0020.0002.223F] # SINE WAVE
+2240  ; [*0586.0020.0002.2240] # WREATH PRODUCT
+2241  ; [*0582.0020.0002.223C][.0000.0054.0002.0338] # NOT TILDE; QQCM
+2242  ; [*0587.0020.0002.2242] # MINUS TILDE
+2243  ; [*0588.0020.0002.2243] # ASYMPTOTICALLY EQUAL TO
+2244  ; [*0588.0020.0002.2243][.0000.0054.0002.0338] # NOT ASYMPTOTICALLY EQUAL TO; QQCM
+2245  ; [*0589.0020.0002.2245] # APPROXIMATELY EQUAL TO
+2246  ; [*058A.0020.0002.2246] # APPROXIMATELY BUT NOT ACTUALLY EQUAL TO
+2247  ; [*0589.0020.0002.2245][.0000.0054.0002.0338] # NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO; QQCM
+2248  ; [*058B.0020.0002.2248] # ALMOST EQUAL TO
+2249  ; [*058B.0020.0002.2248][.0000.0054.0002.0338] # NOT ALMOST EQUAL TO; QQCM
+224A  ; [*058C.0020.0002.224A] # ALMOST EQUAL OR EQUAL TO
+224B  ; [*058D.0020.0002.224B] # TRIPLE TILDE
+224C  ; [*058E.0020.0002.224C] # ALL EQUAL TO
+224D  ; [*058F.0020.0002.224D] # EQUIVALENT TO
+224E  ; [*0590.0020.0002.224E] # GEOMETRICALLY EQUIVALENT TO
+224F  ; [*0591.0020.0002.224F] # DIFFERENCE BETWEEN
+2250  ; [*0592.0020.0002.2250] # APPROACHES THE LIMIT
+2251  ; [*0593.0020.0002.2251] # GEOMETRICALLY EQUAL TO
+2252  ; [*0594.0020.0002.2252] # APPROXIMATELY EQUAL TO OR THE IMAGE OF
+2253  ; [*0595.0020.0002.2253] # IMAGE OF OR APPROXIMATELY EQUAL TO
+2254  ; [*0596.0020.0002.2254] # COLON EQUALS
+2255  ; [*0597.0020.0002.2255] # EQUALS COLON
+2256  ; [*0598.0020.0002.2256] # RING IN EQUAL TO
+2257  ; [*0599.0020.0002.2257] # RING EQUAL TO
+2258  ; [*059A.0020.0002.2258] # CORRESPONDS TO
+2259  ; [*059B.0020.0002.2259] # ESTIMATES
+225A  ; [*059C.0020.0002.225A] # EQUIANGULAR TO
+225B  ; [*059D.0020.0002.225B] # STAR EQUALS
+225C  ; [*059E.0020.0002.225C] # DELTA EQUAL TO
+225D  ; [*059F.0020.0002.225D] # EQUAL TO BY DEFINITION
+225E  ; [*05A0.0020.0002.225E] # MEASURED BY
+225F  ; [*05A1.0020.0002.225F] # QUESTIONED EQUAL TO
+2260  ; [*0555.0020.0002.003D][.0000.0054.0002.0338] # NOT EQUAL TO; QQCM
+2261  ; [*05A2.0020.0002.2261] # IDENTICAL TO
+2262  ; [*05A2.0020.0002.2261][.0000.0054.0002.0338] # NOT IDENTICAL TO; QQCM
+2263  ; [*05A3.0020.0002.2263] # STRICTLY EQUIVALENT TO
+2264  ; [*05A4.0020.0002.2264] # LESS-THAN OR EQUAL TO
+2265  ; [*05A5.0020.0002.2265] # GREATER-THAN OR EQUAL TO
+2266  ; [*05A6.0020.0002.2266] # LESS-THAN OVER EQUAL TO
+2267  ; [*05A7.0020.0002.2267] # GREATER-THAN OVER EQUAL TO
+2268  ; [*05A8.0020.0002.2268] # LESS-THAN BUT NOT EQUAL TO
+2269  ; [*05A9.0020.0002.2269] # GREATER-THAN BUT NOT EQUAL TO
+226A  ; [*05AA.0020.0002.226A] # MUCH LESS-THAN
+226B  ; [*05AB.0020.0002.226B] # MUCH GREATER-THAN
+226C  ; [*05AC.0020.0002.226C] # BETWEEN
+226D  ; [*058F.0020.0002.224D][.0000.0054.0002.0338] # NOT EQUIVALENT TO; QQCM
+226E  ; [*0554.0020.0002.003C][.0000.0054.0002.0338] # NOT LESS-THAN; QQCM
+226F  ; [*0556.0020.0002.003E][.0000.0054.0002.0338] # NOT GREATER-THAN; QQCM
+2270  ; [*05A4.0020.0002.2264][.0000.0054.0002.0338] # NEITHER LESS-THAN NOR EQUAL TO; QQCM
+2271  ; [*05A5.0020.0002.2265][.0000.0054.0002.0338] # NEITHER GREATER-THAN NOR EQUAL TO; QQCM
+2272  ; [*05AD.0020.0002.2272] # LESS-THAN OR EQUIVALENT TO
+2273  ; [*05AE.0020.0002.2273] # GREATER-THAN OR EQUIVALENT TO
+2274  ; [*05AD.0020.0002.2272][.0000.0054.0002.0338] # NEITHER LESS-THAN NOR EQUIVALENT TO; QQCM
+2275  ; [*05AE.0020.0002.2273][.0000.0054.0002.0338] # NEITHER GREATER-THAN NOR EQUIVALENT TO; QQCM
+2276  ; [*05AF.0020.0002.2276] # LESS-THAN OR GREATER-THAN
+2277  ; [*05B0.0020.0002.2277] # GREATER-THAN OR LESS-THAN
+2278  ; [*05AF.0020.0002.2276][.0000.0054.0002.0338] # NEITHER LESS-THAN NOR GREATER-THAN; QQCM
+2279  ; [*05B0.0020.0002.2277][.0000.0054.0002.0338] # NEITHER GREATER-THAN NOR LESS-THAN; QQCM
+227A  ; [*05B1.0020.0002.227A] # PRECEDES
+227B  ; [*05B2.0020.0002.227B] # SUCCEEDS
+227C  ; [*05B3.0020.0002.227C] # PRECEDES OR EQUAL TO
+227D  ; [*05B4.0020.0002.227D] # SUCCEEDS OR EQUAL TO
+227E  ; [*05B5.0020.0002.227E] # PRECEDES OR EQUIVALENT TO
+227F  ; [*05B6.0020.0002.227F] # SUCCEEDS OR EQUIVALENT TO
+2280  ; [*05B1.0020.0002.227A][.0000.0054.0002.0338] # DOES NOT PRECEDE; QQCM
+2281  ; [*05B2.0020.0002.227B][.0000.0054.0002.0338] # DOES NOT SUCCEED; QQCM
+2282  ; [*05B7.0020.0002.2282] # SUBSET OF
+2283  ; [*05B8.0020.0002.2283] # SUPERSET OF
+2284  ; [*05B7.0020.0002.2282][.0000.0054.0002.0338] # NOT A SUBSET OF; QQCM
+2285  ; [*05B8.0020.0002.2283][.0000.0054.0002.0338] # NOT A SUPERSET OF; QQCM
+2286  ; [*05B9.0020.0002.2286] # SUBSET OF OR EQUAL TO
+2287  ; [*05BA.0020.0002.2287] # SUPERSET OF OR EQUAL TO
+2288  ; [*05B9.0020.0002.2286][.0000.0054.0002.0338] # NEITHER A SUBSET OF NOR EQUAL TO; QQCM
+2289  ; [*05BA.0020.0002.2287][.0000.0054.0002.0338] # NEITHER A SUPERSET OF NOR EQUAL TO; QQCM
+228A  ; [*05BB.0020.0002.228A] # SUBSET OF WITH NOT EQUAL TO
+228B  ; [*05BC.0020.0002.228B] # SUPERSET OF WITH NOT EQUAL TO
+228C  ; [*05BD.0020.0002.228C] # MULTISET
+228D  ; [*05BE.0020.0002.228D] # MULTISET MULTIPLICATION
+228E  ; [*05BF.0020.0002.228E] # MULTISET UNION
+228F  ; [*05C0.0020.0002.228F] # SQUARE IMAGE OF
+2290  ; [*05C1.0020.0002.2290] # SQUARE ORIGINAL OF
+2291  ; [*05C2.0020.0002.2291] # SQUARE IMAGE OF OR EQUAL TO
+2292  ; [*05C3.0020.0002.2292] # SQUARE ORIGINAL OF OR EQUAL TO
+2293  ; [*05C4.0020.0002.2293] # SQUARE CAP
+2294  ; [*05C5.0020.0002.2294] # SQUARE CUP
+2295  ; [*05C6.0020.0002.2295] # CIRCLED PLUS
+2296  ; [*05C7.0020.0002.2296] # CIRCLED MINUS
+2297  ; [*05C8.0020.0002.2297] # CIRCLED TIMES
+2298  ; [*05C9.0020.0002.2298] # CIRCLED DIVISION SLASH
+2299  ; [*05CA.0020.0002.2299] # CIRCLED DOT OPERATOR
+229A  ; [*05CB.0020.0002.229A] # CIRCLED RING OPERATOR
+229B  ; [*05CC.0020.0002.229B] # CIRCLED ASTERISK OPERATOR
+229C  ; [*05CD.0020.0002.229C] # CIRCLED EQUALS
+229D  ; [*05CE.0020.0002.229D] # CIRCLED DASH
+229E  ; [*05CF.0020.0002.229E] # SQUARED PLUS
+229F  ; [*05D0.0020.0002.229F] # SQUARED MINUS
+22A0  ; [*05D1.0020.0002.22A0] # SQUARED TIMES
+22A1  ; [*05D2.0020.0002.22A1] # SQUARED DOT OPERATOR
+22A2  ; [*05D3.0020.0002.22A2] # RIGHT TACK
+22A3  ; [*05D4.0020.0002.22A3] # LEFT TACK
+22A4  ; [*05D5.0020.0002.22A4] # DOWN TACK
+22A5  ; [*05D6.0020.0002.22A5] # UP TACK
+22A6  ; [*05D7.0020.0002.22A6] # ASSERTION
+22A7  ; [*05D8.0020.0002.22A7] # MODELS
+22A8  ; [*05D9.0020.0002.22A8] # TRUE
+22A9  ; [*05DA.0020.0002.22A9] # FORCES
+22AA  ; [*05DB.0020.0002.22AA] # TRIPLE VERTICAL BAR RIGHT TURNSTILE
+22AB  ; [*05DC.0020.0002.22AB] # DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+22AC  ; [*05D3.0020.0002.22A2][.0000.0054.0002.0338] # DOES NOT PROVE; QQCM
+22AD  ; [*05D9.0020.0002.22A8][.0000.0054.0002.0338] # NOT TRUE; QQCM
+22AE  ; [*05DA.0020.0002.22A9][.0000.0054.0002.0338] # DOES NOT FORCE; QQCM
+22AF  ; [*05DC.0020.0002.22AB][.0000.0054.0002.0338] # NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE; QQCM
+22B0  ; [*05DD.0020.0002.22B0] # PRECEDES UNDER RELATION
+22B1  ; [*05DE.0020.0002.22B1] # SUCCEEDS UNDER RELATION
+22B2  ; [*05DF.0020.0002.22B2] # NORMAL SUBGROUP OF
+22B3  ; [*05E0.0020.0002.22B3] # CONTAINS AS NORMAL SUBGROUP
+22B4  ; [*05E1.0020.0002.22B4] # NORMAL SUBGROUP OF OR EQUAL TO
+22B5  ; [*05E2.0020.0002.22B5] # CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+22B6  ; [*05E3.0020.0002.22B6] # ORIGINAL OF
+22B7  ; [*05E4.0020.0002.22B7] # IMAGE OF
+22B8  ; [*05E5.0020.0002.22B8] # MULTIMAP
+22B9  ; [*05E6.0020.0002.22B9] # HERMITIAN CONJUGATE MATRIX
+22BA  ; [*05E7.0020.0002.22BA] # INTERCALATE
+22BB  ; [*05E8.0020.0002.22BB] # XOR
+22BC  ; [*05E9.0020.0002.22BC] # NAND
+22BD  ; [*05EA.0020.0002.22BD] # NOR
+22BE  ; [*05EB.0020.0002.22BE] # RIGHT ANGLE WITH ARC
+22BF  ; [*05EC.0020.0002.22BF] # RIGHT TRIANGLE
+22C0  ; [*05ED.0020.0002.22C0] # N-ARY LOGICAL AND
+22C1  ; [*05EE.0020.0002.22C1] # N-ARY LOGICAL OR
+22C2  ; [*05EF.0020.0002.22C2] # N-ARY INTERSECTION
+22C3  ; [*05F0.0020.0002.22C3] # N-ARY UNION
+22C4  ; [*05F1.0020.0002.22C4] # DIAMOND OPERATOR
+22C5  ; [*05F2.0020.0002.22C5] # DOT OPERATOR
+22C6  ; [*05F3.0020.0002.22C6] # STAR OPERATOR
+22C7  ; [*05F4.0020.0002.22C7] # DIVISION TIMES
+22C8  ; [*05F5.0020.0002.22C8] # BOWTIE
+22C9  ; [*05F6.0020.0002.22C9] # LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CA  ; [*05F7.0020.0002.22CA] # RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CB  ; [*05F8.0020.0002.22CB] # LEFT SEMIDIRECT PRODUCT
+22CC  ; [*05F9.0020.0002.22CC] # RIGHT SEMIDIRECT PRODUCT
+22CD  ; [*05FA.0020.0002.22CD] # REVERSED TILDE EQUALS
+22CE  ; [*05FB.0020.0002.22CE] # CURLY LOGICAL OR
+22CF  ; [*05FC.0020.0002.22CF] # CURLY LOGICAL AND
+22D0  ; [*05FD.0020.0002.22D0] # DOUBLE SUBSET
+22D1  ; [*05FE.0020.0002.22D1] # DOUBLE SUPERSET
+22D2  ; [*05FF.0020.0002.22D2] # DOUBLE INTERSECTION
+22D3  ; [*0600.0020.0002.22D3] # DOUBLE UNION
+22D4  ; [*0601.0020.0002.22D4] # PITCHFORK
+22D5  ; [*0602.0020.0002.22D5] # EQUAL AND PARALLEL TO
+22D6  ; [*0603.0020.0002.22D6] # LESS-THAN WITH DOT
+22D7  ; [*0604.0020.0002.22D7] # GREATER-THAN WITH DOT
+22D8  ; [*0605.0020.0002.22D8] # VERY MUCH LESS-THAN
+22D9  ; [*0606.0020.0002.22D9] # VERY MUCH GREATER-THAN
+22DA  ; [*0607.0020.0002.22DA] # LESS-THAN EQUAL TO OR GREATER-THAN
+22DB  ; [*0608.0020.0002.22DB] # GREATER-THAN EQUAL TO OR LESS-THAN
+22DC  ; [*0609.0020.0002.22DC] # EQUAL TO OR LESS-THAN
+22DD  ; [*060A.0020.0002.22DD] # EQUAL TO OR GREATER-THAN
+22DE  ; [*060B.0020.0002.22DE] # EQUAL TO OR PRECEDES
+22DF  ; [*060C.0020.0002.22DF] # EQUAL TO OR SUCCEEDS
+22E0  ; [*05B3.0020.0002.227C][.0000.0054.0002.0338] # DOES NOT PRECEDE OR EQUAL; QQCM
+22E1  ; [*05B4.0020.0002.227D][.0000.0054.0002.0338] # DOES NOT SUCCEED OR EQUAL; QQCM
+22E2  ; [*05C2.0020.0002.2291][.0000.0054.0002.0338] # NOT SQUARE IMAGE OF OR EQUAL TO; QQCM
+22E3  ; [*05C3.0020.0002.2292][.0000.0054.0002.0338] # NOT SQUARE ORIGINAL OF OR EQUAL TO; QQCM
+22E4  ; [*060D.0020.0002.22E4] # SQUARE IMAGE OF OR NOT EQUAL TO
+22E5  ; [*060E.0020.0002.22E5] # SQUARE ORIGINAL OF OR NOT EQUAL TO
+22E6  ; [*060F.0020.0002.22E6] # LESS-THAN BUT NOT EQUIVALENT TO
+22E7  ; [*0610.0020.0002.22E7] # GREATER-THAN BUT NOT EQUIVALENT TO
+22E8  ; [*0611.0020.0002.22E8] # PRECEDES BUT NOT EQUIVALENT TO
+22E9  ; [*0612.0020.0002.22E9] # SUCCEEDS BUT NOT EQUIVALENT TO
+22EA  ; [*05DF.0020.0002.22B2][.0000.0054.0002.0338] # NOT NORMAL SUBGROUP OF; QQCM
+22EB  ; [*05E0.0020.0002.22B3][.0000.0054.0002.0338] # DOES NOT CONTAIN AS NORMAL SUBGROUP; QQCM
+22EC  ; [*05E1.0020.0002.22B4][.0000.0054.0002.0338] # NOT NORMAL SUBGROUP OF OR EQUAL TO; QQCM
+22ED  ; [*05E2.0020.0002.22B5][.0000.0054.0002.0338] # DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL; QQCM
+22EE  ; [*0613.0020.0002.22EE] # VERTICAL ELLIPSIS
+22EF  ; [*0614.0020.0002.22EF] # MIDLINE HORIZONTAL ELLIPSIS
+22F0  ; [*0615.0020.0002.22F0] # UP RIGHT DIAGONAL ELLIPSIS
+22F1  ; [*0616.0020.0002.22F1] # DOWN RIGHT DIAGONAL ELLIPSIS
+22F2  ; [*0617.0020.0002.22F2] # ELEMENT OF WITH LONG HORIZONTAL STROKE
+22F3  ; [*0618.0020.0002.22F3] # ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22F4  ; [*0619.0020.0002.22F4] # SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22F5  ; [*061A.0020.0002.22F5] # ELEMENT OF WITH DOT ABOVE
+22F6  ; [*061B.0020.0002.22F6] # ELEMENT OF WITH OVERBAR
+22F7  ; [*061C.0020.0002.22F7] # SMALL ELEMENT OF WITH OVERBAR
+22F8  ; [*061D.0020.0002.22F8] # ELEMENT OF WITH UNDERBAR
+22F9  ; [*061E.0020.0002.22F9] # ELEMENT OF WITH TWO HORIZONTAL STROKES
+22FA  ; [*061F.0020.0002.22FA] # CONTAINS WITH LONG HORIZONTAL STROKE
+22FB  ; [*0620.0020.0002.22FB] # CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22FC  ; [*0621.0020.0002.22FC] # SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22FD  ; [*0622.0020.0002.22FD] # CONTAINS WITH OVERBAR
+22FE  ; [*0623.0020.0002.22FE] # SMALL CONTAINS WITH OVERBAR
+22FF  ; [*0624.0020.0002.22FF] # Z NOTATION BAG MEMBERSHIP
+2300  ; [*0625.0020.0002.2300] # DIAMETER SIGN
+2301  ; [*0626.0020.0002.2301] # ELECTRIC ARROW
+2302  ; [*0627.0020.0002.2302] # HOUSE
+2303  ; [*0628.0020.0002.2303] # UP ARROWHEAD
+2304  ; [*0629.0020.0002.2304] # DOWN ARROWHEAD
+2305  ; [*062A.0020.0002.2305] # PROJECTIVE
+2306  ; [*062B.0020.0002.2306] # PERSPECTIVE
+2307  ; [*062C.0020.0002.2307] # WAVY LINE
+2308  ; [*062D.0020.0002.2308] # LEFT CEILING
+2309  ; [*062E.0020.0002.2309] # RIGHT CEILING
+230A  ; [*062F.0020.0002.230A] # LEFT FLOOR
+230B  ; [*0630.0020.0002.230B] # RIGHT FLOOR
+230C  ; [*0631.0020.0002.230C] # BOTTOM RIGHT CROP
+230D  ; [*0632.0020.0002.230D] # BOTTOM LEFT CROP
+230E  ; [*0633.0020.0002.230E] # TOP RIGHT CROP
+230F  ; [*0634.0020.0002.230F] # TOP LEFT CROP
+2310  ; [*0635.0020.0002.2310] # REVERSED NOT SIGN
+2311  ; [*0636.0020.0002.2311] # SQUARE LOZENGE
+2312  ; [*0637.0020.0002.2312] # ARC
+2313  ; [*0638.0020.0002.2313] # SEGMENT
+2314  ; [*0639.0020.0002.2314] # SECTOR
+2315  ; [*063A.0020.0002.2315] # TELEPHONE RECORDER
+2316  ; [*063B.0020.0002.2316] # POSITION INDICATOR
+2317  ; [*063C.0020.0002.2317] # VIEWDATA SQUARE
+2318  ; [*063D.0020.0002.2318] # PLACE OF INTEREST SIGN
+2319  ; [*063E.0020.0002.2319] # TURNED NOT SIGN
+231A  ; [*063F.0020.0002.231A] # WATCH
+231B  ; [*0640.0020.0002.231B] # HOURGLASS
+231C  ; [*0641.0020.0002.231C] # TOP LEFT CORNER
+231D  ; [*0642.0020.0002.231D] # TOP RIGHT CORNER
+231E  ; [*0643.0020.0002.231E] # BOTTOM LEFT CORNER
+231F  ; [*0644.0020.0002.231F] # BOTTOM RIGHT CORNER
+2320  ; [*0645.0020.0002.2320] # TOP HALF INTEGRAL
+2321  ; [*0646.0020.0002.2321] # BOTTOM HALF INTEGRAL
+2322  ; [*0647.0020.0002.2322] # FROWN
+2323  ; [*0648.0020.0002.2323] # SMILE
+2324  ; [*0649.0020.0002.2324] # UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS
+2325  ; [*064A.0020.0002.2325] # OPTION KEY
+2326  ; [*064B.0020.0002.2326] # ERASE TO THE RIGHT
+2327  ; [*064C.0020.0002.2327] # X IN A RECTANGLE BOX
+2328  ; [*064D.0020.0002.2328] # KEYBOARD
+2329  ; [*033D.0020.0002.2329] # LEFT-POINTING ANGLE BRACKET; QQC
+232A  ; [*033E.0020.0002.232A] # RIGHT-POINTING ANGLE BRACKET; QQC
+232B  ; [*064E.0020.0002.232B] # ERASE TO THE LEFT
+232C  ; [*064F.0020.0002.232C] # BENZENE RING
+232D  ; [*0650.0020.0002.232D] # CYLINDRICITY
+232E  ; [*0651.0020.0002.232E] # ALL AROUND-PROFILE
+232F  ; [*0652.0020.0002.232F] # SYMMETRY
+2330  ; [*0653.0020.0002.2330] # TOTAL RUNOUT
+2331  ; [*0654.0020.0002.2331] # DIMENSION ORIGIN
+2332  ; [*0655.0020.0002.2332] # CONICAL TAPER
+2333  ; [*0656.0020.0002.2333] # SLOPE
+2334  ; [*0657.0020.0002.2334] # COUNTERBORE
+2335  ; [*0658.0020.0002.2335] # COUNTERSINK
+2336  ; [*0659.0020.0002.2336] # APL FUNCTIONAL SYMBOL I-BEAM
+2337  ; [*065A.0020.0002.2337] # APL FUNCTIONAL SYMBOL SQUISH QUAD
+2338  ; [*065B.0020.0002.2338] # APL FUNCTIONAL SYMBOL QUAD EQUAL
+2339  ; [*065C.0020.0002.2339] # APL FUNCTIONAL SYMBOL QUAD DIVIDE
+233A  ; [*065D.0020.0002.233A] # APL FUNCTIONAL SYMBOL QUAD DIAMOND
+233B  ; [*065E.0020.0002.233B] # APL FUNCTIONAL SYMBOL QUAD JOT
+233C  ; [*065F.0020.0002.233C] # APL FUNCTIONAL SYMBOL QUAD CIRCLE
+233D  ; [*0660.0020.0002.233D] # APL FUNCTIONAL SYMBOL CIRCLE STILE
+233E  ; [*0661.0020.0002.233E] # APL FUNCTIONAL SYMBOL CIRCLE JOT
+233F  ; [*0662.0020.0002.233F] # APL FUNCTIONAL SYMBOL SLASH BAR
+2340  ; [*0663.0020.0002.2340] # APL FUNCTIONAL SYMBOL BACKSLASH BAR
+2341  ; [*0664.0020.0002.2341] # APL FUNCTIONAL SYMBOL QUAD SLASH
+2342  ; [*0665.0020.0002.2342] # APL FUNCTIONAL SYMBOL QUAD BACKSLASH
+2343  ; [*0666.0020.0002.2343] # APL FUNCTIONAL SYMBOL QUAD LESS-THAN
+2344  ; [*0667.0020.0002.2344] # APL FUNCTIONAL SYMBOL QUAD GREATER-THAN
+2345  ; [*0668.0020.0002.2345] # APL FUNCTIONAL SYMBOL LEFTWARDS VANE
+2346  ; [*0669.0020.0002.2346] # APL FUNCTIONAL SYMBOL RIGHTWARDS VANE
+2347  ; [*066A.0020.0002.2347] # APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW
+2348  ; [*066B.0020.0002.2348] # APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW
+2349  ; [*066C.0020.0002.2349] # APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH
+234A  ; [*066D.0020.0002.234A] # APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR
+234B  ; [*066E.0020.0002.234B] # APL FUNCTIONAL SYMBOL DELTA STILE
+234C  ; [*066F.0020.0002.234C] # APL FUNCTIONAL SYMBOL QUAD DOWN CARET
+234D  ; [*0670.0020.0002.234D] # APL FUNCTIONAL SYMBOL QUAD DELTA
+234E  ; [*0671.0020.0002.234E] # APL FUNCTIONAL SYMBOL DOWN TACK JOT
+234F  ; [*0672.0020.0002.234F] # APL FUNCTIONAL SYMBOL UPWARDS VANE
+2350  ; [*0673.0020.0002.2350] # APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW
+2351  ; [*0674.0020.0002.2351] # APL FUNCTIONAL SYMBOL UP TACK OVERBAR
+2352  ; [*0675.0020.0002.2352] # APL FUNCTIONAL SYMBOL DEL STILE
+2353  ; [*0676.0020.0002.2353] # APL FUNCTIONAL SYMBOL QUAD UP CARET
+2354  ; [*0677.0020.0002.2354] # APL FUNCTIONAL SYMBOL QUAD DEL
+2355  ; [*0678.0020.0002.2355] # APL FUNCTIONAL SYMBOL UP TACK JOT
+2356  ; [*0679.0020.0002.2356] # APL FUNCTIONAL SYMBOL DOWNWARDS VANE
+2357  ; [*067A.0020.0002.2357] # APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW
+2358  ; [*067B.0020.0002.2358] # APL FUNCTIONAL SYMBOL QUOTE UNDERBAR
+2359  ; [*067C.0020.0002.2359] # APL FUNCTIONAL SYMBOL DELTA UNDERBAR
+235A  ; [*067D.0020.0002.235A] # APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR
+235B  ; [*067E.0020.0002.235B] # APL FUNCTIONAL SYMBOL JOT UNDERBAR
+235C  ; [*067F.0020.0002.235C] # APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR
+235D  ; [*0680.0020.0002.235D] # APL FUNCTIONAL SYMBOL UP SHOE JOT
+235E  ; [*0681.0020.0002.235E] # APL FUNCTIONAL SYMBOL QUOTE QUAD
+235F  ; [*0682.0020.0002.235F] # APL FUNCTIONAL SYMBOL CIRCLE STAR
+2360  ; [*0683.0020.0002.2360] # APL FUNCTIONAL SYMBOL QUAD COLON
+2361  ; [*0684.0020.0002.2361] # APL FUNCTIONAL SYMBOL UP TACK DIAERESIS
+2362  ; [*0685.0020.0002.2362] # APL FUNCTIONAL SYMBOL DEL DIAERESIS
+2363  ; [*0686.0020.0002.2363] # APL FUNCTIONAL SYMBOL STAR DIAERESIS
+2364  ; [*0687.0020.0002.2364] # APL FUNCTIONAL SYMBOL JOT DIAERESIS
+2365  ; [*0688.0020.0002.2365] # APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS
+2366  ; [*0689.0020.0002.2366] # APL FUNCTIONAL SYMBOL DOWN SHOE STILE
+2367  ; [*068A.0020.0002.2367] # APL FUNCTIONAL SYMBOL LEFT SHOE STILE
+2368  ; [*068B.0020.0002.2368] # APL FUNCTIONAL SYMBOL TILDE DIAERESIS
+2369  ; [*068C.0020.0002.2369] # APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS
+236A  ; [*068D.0020.0002.236A] # APL FUNCTIONAL SYMBOL COMMA BAR
+236B  ; [*068E.0020.0002.236B] # APL FUNCTIONAL SYMBOL DEL TILDE
+236C  ; [*068F.0020.0002.236C] # APL FUNCTIONAL SYMBOL ZILDE
+236D  ; [*0690.0020.0002.236D] # APL FUNCTIONAL SYMBOL STILE TILDE
+236E  ; [*0691.0020.0002.236E] # APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR
+236F  ; [*0692.0020.0002.236F] # APL FUNCTIONAL SYMBOL QUAD NOT EQUAL
+2370  ; [*0693.0020.0002.2370] # APL FUNCTIONAL SYMBOL QUAD QUESTION
+2371  ; [*0694.0020.0002.2371] # APL FUNCTIONAL SYMBOL DOWN CARET TILDE
+2372  ; [*0695.0020.0002.2372] # APL FUNCTIONAL SYMBOL UP CARET TILDE
+2373  ; [*0696.0020.0002.2373] # APL FUNCTIONAL SYMBOL IOTA
+2374  ; [*0697.0020.0002.2374] # APL FUNCTIONAL SYMBOL RHO
+2375  ; [*0698.0020.0002.2375] # APL FUNCTIONAL SYMBOL OMEGA
+2376  ; [*0699.0020.0002.2376] # APL FUNCTIONAL SYMBOL ALPHA UNDERBAR
+2377  ; [*069A.0020.0002.2377] # APL FUNCTIONAL SYMBOL EPSILON UNDERBAR
+2378  ; [*069B.0020.0002.2378] # APL FUNCTIONAL SYMBOL IOTA UNDERBAR
+2379  ; [*069C.0020.0002.2379] # APL FUNCTIONAL SYMBOL OMEGA UNDERBAR
+237A  ; [*069D.0020.0002.237A] # APL FUNCTIONAL SYMBOL ALPHA
+237B  ; [*069E.0020.0002.237B] # NOT CHECK MARK
+237C  ; [*069F.0020.0002.237C] # RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW
+237D  ; [*06A0.0020.0002.237D] # SHOULDERED OPEN BOX
+237E  ; [*06A1.0020.0002.237E] # BELL SYMBOL
+237F  ; [*06A2.0020.0002.237F] # VERTICAL LINE WITH MIDDLE DOT
+2380  ; [*06A3.0020.0002.2380] # INSERTION SYMBOL
+2381  ; [*06A4.0020.0002.2381] # CONTINUOUS UNDERLINE SYMBOL
+2382  ; [*06A5.0020.0002.2382] # DISCONTINUOUS UNDERLINE SYMBOL
+2383  ; [*06A6.0020.0002.2383] # EMPHASIS SYMBOL
+2384  ; [*06A7.0020.0002.2384] # COMPOSITION SYMBOL
+2385  ; [*06A8.0020.0002.2385] # WHITE SQUARE WITH CENTRE VERTICAL LINE
+2386  ; [*06A9.0020.0002.2386] # ENTER SYMBOL
+2387  ; [*06AA.0020.0002.2387] # ALTERNATIVE KEY SYMBOL
+2388  ; [*06AB.0020.0002.2388] # HELM SYMBOL
+2389  ; [*06AC.0020.0002.2389] # CIRCLED HORIZONTAL BAR WITH NOTCH
+238A  ; [*06AD.0020.0002.238A] # CIRCLED TRIANGLE DOWN
+238B  ; [*06AE.0020.0002.238B] # BROKEN CIRCLE WITH NORTHWEST ARROW
+238C  ; [*06AF.0020.0002.238C] # UNDO SYMBOL
+238D  ; [*06B0.0020.0002.238D] # MONOSTABLE SYMBOL
+238E  ; [*06B1.0020.0002.238E] # HYSTERESIS SYMBOL
+238F  ; [*06B2.0020.0002.238F] # OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL
+2390  ; [*06B3.0020.0002.2390] # OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL
+2391  ; [*06B4.0020.0002.2391] # PASSIVE-PULL-DOWN-OUTPUT SYMBOL
+2392  ; [*06B5.0020.0002.2392] # PASSIVE-PULL-UP-OUTPUT SYMBOL
+2393  ; [*06B6.0020.0002.2393] # DIRECT CURRENT SYMBOL FORM TWO
+2394  ; [*06B7.0020.0002.2394] # SOFTWARE-FUNCTION SYMBOL
+2395  ; [*06B8.0020.0002.2395] # APL FUNCTIONAL SYMBOL QUAD
+2396  ; [*06B9.0020.0002.2396] # DECIMAL SEPARATOR KEY SYMBOL
+2397  ; [*06BA.0020.0002.2397] # PREVIOUS PAGE
+2398  ; [*06BB.0020.0002.2398] # NEXT PAGE
+2399  ; [*06BC.0020.0002.2399] # PRINT SCREEN SYMBOL
+239A  ; [*06BD.0020.0002.239A] # CLEAR SCREEN SYMBOL
+239B  ; [*06BE.0020.0002.239B] # LEFT PARENTHESIS UPPER HOOK
+239C  ; [*06BF.0020.0002.239C] # LEFT PARENTHESIS EXTENSION
+239D  ; [*06C0.0020.0002.239D] # LEFT PARENTHESIS LOWER HOOK
+239E  ; [*06C1.0020.0002.239E] # RIGHT PARENTHESIS UPPER HOOK
+239F  ; [*06C2.0020.0002.239F] # RIGHT PARENTHESIS EXTENSION
+23A0  ; [*06C3.0020.0002.23A0] # RIGHT PARENTHESIS LOWER HOOK
+23A1  ; [*06C4.0020.0002.23A1] # LEFT SQUARE BRACKET UPPER CORNER
+23A2  ; [*06C5.0020.0002.23A2] # LEFT SQUARE BRACKET EXTENSION
+23A3  ; [*06C6.0020.0002.23A3] # LEFT SQUARE BRACKET LOWER CORNER
+23A4  ; [*06C7.0020.0002.23A4] # RIGHT SQUARE BRACKET UPPER CORNER
+23A5  ; [*06C8.0020.0002.23A5] # RIGHT SQUARE BRACKET EXTENSION
+23A6  ; [*06C9.0020.0002.23A6] # RIGHT SQUARE BRACKET LOWER CORNER
+23A7  ; [*06CA.0020.0002.23A7] # LEFT CURLY BRACKET UPPER HOOK
+23A8  ; [*06CB.0020.0002.23A8] # LEFT CURLY BRACKET MIDDLE PIECE
+23A9  ; [*06CC.0020.0002.23A9] # LEFT CURLY BRACKET LOWER HOOK
+23AA  ; [*06CD.0020.0002.23AA] # CURLY BRACKET EXTENSION
+23AB  ; [*06CE.0020.0002.23AB] # RIGHT CURLY BRACKET UPPER HOOK
+23AC  ; [*06CF.0020.0002.23AC] # RIGHT CURLY BRACKET MIDDLE PIECE
+23AD  ; [*06D0.0020.0002.23AD] # RIGHT CURLY BRACKET LOWER HOOK
+23AE  ; [*06D1.0020.0002.23AE] # INTEGRAL EXTENSION
+23AF  ; [*06D2.0020.0002.23AF] # HORIZONTAL LINE EXTENSION
+23B0  ; [*06D3.0020.0002.23B0] # UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION
+23B1  ; [*06D4.0020.0002.23B1] # UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION
+23B2  ; [*06D5.0020.0002.23B2] # SUMMATION TOP
+23B3  ; [*06D6.0020.0002.23B3] # SUMMATION BOTTOM
+23B4  ; [*06D7.0020.0002.23B4] # TOP SQUARE BRACKET
+23B5  ; [*06D8.0020.0002.23B5] # BOTTOM SQUARE BRACKET
+23B6  ; [*06D9.0020.0002.23B6] # BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET
+23B7  ; [*06DA.0020.0002.23B7] # RADICAL SYMBOL BOTTOM
+23B8  ; [*06DB.0020.0002.23B8] # LEFT VERTICAL BOX LINE
+23B9  ; [*06DC.0020.0002.23B9] # RIGHT VERTICAL BOX LINE
+23BA  ; [*06DD.0020.0002.23BA] # HORIZONTAL SCAN LINE-1
+23BB  ; [*06DE.0020.0002.23BB] # HORIZONTAL SCAN LINE-3
+23BC  ; [*06DF.0020.0002.23BC] # HORIZONTAL SCAN LINE-7
+23BD  ; [*06E0.0020.0002.23BD] # HORIZONTAL SCAN LINE-9
+23BE  ; [*06E1.0020.0002.23BE] # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT
+23BF  ; [*06E2.0020.0002.23BF] # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT
+23C0  ; [*06E3.0020.0002.23C0] # DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE
+23C1  ; [*06E4.0020.0002.23C1] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE
+23C2  ; [*06E5.0020.0002.23C2] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE
+23C3  ; [*06E6.0020.0002.23C3] # DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE
+23C4  ; [*06E7.0020.0002.23C4] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE
+23C5  ; [*06E8.0020.0002.23C5] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE
+23C6  ; [*06E9.0020.0002.23C6] # DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE
+23C7  ; [*06EA.0020.0002.23C7] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE
+23C8  ; [*06EB.0020.0002.23C8] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE
+23C9  ; [*06EC.0020.0002.23C9] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL
+23CA  ; [*06ED.0020.0002.23CA] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL
+23CB  ; [*06EE.0020.0002.23CB] # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT
+23CC  ; [*06EF.0020.0002.23CC] # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT
+23CD  ; [*06F0.0020.0002.23CD] # SQUARE FOOT
+23CE  ; [*06F1.0020.0002.23CE] # RETURN SYMBOL
+23CF  ; [*06F2.0020.0002.23CF] # EJECT SYMBOL
+23D0  ; [*06F3.0020.0002.23D0] # VERTICAL LINE EXTENSION
+23D1  ; [*06F4.0020.0002.23D1] # METRICAL BREVE
+23D2  ; [*06F5.0020.0002.23D2] # METRICAL LONG OVER SHORT
+23D3  ; [*06F6.0020.0002.23D3] # METRICAL SHORT OVER LONG
+23D4  ; [*06F7.0020.0002.23D4] # METRICAL LONG OVER TWO SHORTS
+23D5  ; [*06F8.0020.0002.23D5] # METRICAL TWO SHORTS OVER LONG
+23D6  ; [*06F9.0020.0002.23D6] # METRICAL TWO SHORTS JOINED
+23D7  ; [*06FA.0020.0002.23D7] # METRICAL TRISEME
+23D8  ; [*06FB.0020.0002.23D8] # METRICAL TETRASEME
+23D9  ; [*06FC.0020.0002.23D9] # METRICAL PENTASEME
+23DA  ; [*06FD.0020.0002.23DA] # EARTH GROUND
+23DB  ; [*06FE.0020.0002.23DB] # FUSE
+23DC  ; [*06FF.0020.0002.23DC] # TOP PARENTHESIS
+23DD  ; [*0700.0020.0002.23DD] # BOTTOM PARENTHESIS
+23DE  ; [*0701.0020.0002.23DE] # TOP CURLY BRACKET
+23DF  ; [*0702.0020.0002.23DF] # BOTTOM CURLY BRACKET
+23E0  ; [*0703.0020.0002.23E0] # TOP TORTOISE SHELL BRACKET
+23E1  ; [*0704.0020.0002.23E1] # BOTTOM TORTOISE SHELL BRACKET
+23E2  ; [*0705.0020.0002.23E2] # WHITE TRAPEZIUM
+23E3  ; [*0706.0020.0002.23E3] # BENZENE RING WITH CIRCLE
+23E4  ; [*0707.0020.0002.23E4] # STRAIGHTNESS
+23E5  ; [*0708.0020.0002.23E5] # FLATNESS
+23E6  ; [*0709.0020.0002.23E6] # AC CURRENT
+23E7  ; [*070A.0020.0002.23E7] # ELECTRICAL INTERSECTION
+23E8  ; [*070B.0020.0002.23E8] # DECIMAL EXPONENT SYMBOL
+2400  ; [*070C.0020.0002.2400] # SYMBOL FOR NULL
+2401  ; [*070D.0020.0002.2401] # SYMBOL FOR START OF HEADING
+2402  ; [*070E.0020.0002.2402] # SYMBOL FOR START OF TEXT
+2403  ; [*070F.0020.0002.2403] # SYMBOL FOR END OF TEXT
+2404  ; [*0710.0020.0002.2404] # SYMBOL FOR END OF TRANSMISSION
+2405  ; [*0711.0020.0002.2405] # SYMBOL FOR ENQUIRY
+2406  ; [*0712.0020.0002.2406] # SYMBOL FOR ACKNOWLEDGE
+2407  ; [*0713.0020.0002.2407] # SYMBOL FOR BELL
+2408  ; [*0714.0020.0002.2408] # SYMBOL FOR BACKSPACE
+2409  ; [*0715.0020.0002.2409] # SYMBOL FOR HORIZONTAL TABULATION
+240A  ; [*0716.0020.0002.240A] # SYMBOL FOR LINE FEED
+240B  ; [*0717.0020.0002.240B] # SYMBOL FOR VERTICAL TABULATION
+240C  ; [*0718.0020.0002.240C] # SYMBOL FOR FORM FEED
+240D  ; [*0719.0020.0002.240D] # SYMBOL FOR CARRIAGE RETURN
+240E  ; [*071A.0020.0002.240E] # SYMBOL FOR SHIFT OUT
+240F  ; [*071B.0020.0002.240F] # SYMBOL FOR SHIFT IN
+2410  ; [*071C.0020.0002.2410] # SYMBOL FOR DATA LINK ESCAPE
+2411  ; [*071D.0020.0002.2411] # SYMBOL FOR DEVICE CONTROL ONE
+2412  ; [*071E.0020.0002.2412] # SYMBOL FOR DEVICE CONTROL TWO
+2413  ; [*071F.0020.0002.2413] # SYMBOL FOR DEVICE CONTROL THREE
+2414  ; [*0720.0020.0002.2414] # SYMBOL FOR DEVICE CONTROL FOUR
+2415  ; [*0721.0020.0002.2415] # SYMBOL FOR NEGATIVE ACKNOWLEDGE
+2416  ; [*0722.0020.0002.2416] # SYMBOL FOR SYNCHRONOUS IDLE
+2417  ; [*0723.0020.0002.2417] # SYMBOL FOR END OF TRANSMISSION BLOCK
+2418  ; [*0724.0020.0002.2418] # SYMBOL FOR CANCEL
+2419  ; [*0725.0020.0002.2419] # SYMBOL FOR END OF MEDIUM
+241A  ; [*0726.0020.0002.241A] # SYMBOL FOR SUBSTITUTE
+241B  ; [*0727.0020.0002.241B] # SYMBOL FOR ESCAPE
+241C  ; [*0728.0020.0002.241C] # SYMBOL FOR FILE SEPARATOR
+241D  ; [*0729.0020.0002.241D] # SYMBOL FOR GROUP SEPARATOR
+241E  ; [*072A.0020.0002.241E] # SYMBOL FOR RECORD SEPARATOR
+241F  ; [*072B.0020.0002.241F] # SYMBOL FOR UNIT SEPARATOR
+2420  ; [*072C.0020.0002.2420] # SYMBOL FOR SPACE
+2421  ; [*072D.0020.0002.2421] # SYMBOL FOR DELETE
+2422  ; [*072E.0020.0002.2422] # BLANK SYMBOL
+2423  ; [*072F.0020.0002.2423] # OPEN BOX
+2424  ; [*0730.0020.0002.2424] # SYMBOL FOR NEWLINE
+2425  ; [*0731.0020.0002.2425] # SYMBOL FOR DELETE FORM TWO
+2426  ; [*0732.0020.0002.2426] # SYMBOL FOR SUBSTITUTE FORM TWO
+2440  ; [*0733.0020.0002.2440] # OCR HOOK
+2441  ; [*0734.0020.0002.2441] # OCR CHAIR
+2442  ; [*0735.0020.0002.2442] # OCR FORK
+2443  ; [*0736.0020.0002.2443] # OCR INVERTED FORK
+2444  ; [*0737.0020.0002.2444] # OCR BELT BUCKLE
+2445  ; [*0738.0020.0002.2445] # OCR BOW TIE
+2446  ; [*0739.0020.0002.2446] # OCR BRANCH BANK IDENTIFICATION
+2447  ; [*073A.0020.0002.2447] # OCR AMOUNT OF CHECK
+2448  ; [*073B.0020.0002.2448] # OCR DASH
+2449  ; [*073C.0020.0002.2449] # OCR CUSTOMER ACCOUNT NUMBER
+244A  ; [*073D.0020.0002.244A] # OCR DOUBLE BACKSLASH
+2500  ; [*073E.0020.0002.2500] # BOX DRAWINGS LIGHT HORIZONTAL
+2501  ; [*073F.0020.0002.2501] # BOX DRAWINGS HEAVY HORIZONTAL
+2502  ; [*0740.0020.0002.2502] # BOX DRAWINGS LIGHT VERTICAL
+2503  ; [*0741.0020.0002.2503] # BOX DRAWINGS HEAVY VERTICAL
+2504  ; [*0742.0020.0002.2504] # BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL
+2505  ; [*0743.0020.0002.2505] # BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
+2506  ; [*0744.0020.0002.2506] # BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
+2507  ; [*0745.0020.0002.2507] # BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL
+2508  ; [*0746.0020.0002.2508] # BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL
+2509  ; [*0747.0020.0002.2509] # BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL
+250A  ; [*0748.0020.0002.250A] # BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL
+250B  ; [*0749.0020.0002.250B] # BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL
+250C  ; [*074A.0020.0002.250C] # BOX DRAWINGS LIGHT DOWN AND RIGHT
+250D  ; [*074B.0020.0002.250D] # BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
+250E  ; [*074C.0020.0002.250E] # BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
+250F  ; [*074D.0020.0002.250F] # BOX DRAWINGS HEAVY DOWN AND RIGHT
+2510  ; [*074E.0020.0002.2510] # BOX DRAWINGS LIGHT DOWN AND LEFT
+2511  ; [*074F.0020.0002.2511] # BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
+2512  ; [*0750.0020.0002.2512] # BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
+2513  ; [*0751.0020.0002.2513] # BOX DRAWINGS HEAVY DOWN AND LEFT
+2514  ; [*0752.0020.0002.2514] # BOX DRAWINGS LIGHT UP AND RIGHT
+2515  ; [*0753.0020.0002.2515] # BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
+2516  ; [*0754.0020.0002.2516] # BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
+2517  ; [*0755.0020.0002.2517] # BOX DRAWINGS HEAVY UP AND RIGHT
+2518  ; [*0756.0020.0002.2518] # BOX DRAWINGS LIGHT UP AND LEFT
+2519  ; [*0757.0020.0002.2519] # BOX DRAWINGS UP LIGHT AND LEFT HEAVY
+251A  ; [*0758.0020.0002.251A] # BOX DRAWINGS UP HEAVY AND LEFT LIGHT
+251B  ; [*0759.0020.0002.251B] # BOX DRAWINGS HEAVY UP AND LEFT
+251C  ; [*075A.0020.0002.251C] # BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+251D  ; [*075B.0020.0002.251D] # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+251E  ; [*075C.0020.0002.251E] # BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT
+251F  ; [*075D.0020.0002.251F] # BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT
+2520  ; [*075E.0020.0002.2520] # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+2521  ; [*075F.0020.0002.2521] # BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY
+2522  ; [*0760.0020.0002.2522] # BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY
+2523  ; [*0761.0020.0002.2523] # BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+2524  ; [*0762.0020.0002.2524] # BOX DRAWINGS LIGHT VERTICAL AND LEFT
+2525  ; [*0763.0020.0002.2525] # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+2526  ; [*0764.0020.0002.2526] # BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT
+2527  ; [*0765.0020.0002.2527] # BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT
+2528  ; [*0766.0020.0002.2528] # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+2529  ; [*0767.0020.0002.2529] # BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY
+252A  ; [*0768.0020.0002.252A] # BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY
+252B  ; [*0769.0020.0002.252B] # BOX DRAWINGS HEAVY VERTICAL AND LEFT
+252C  ; [*076A.0020.0002.252C] # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+252D  ; [*076B.0020.0002.252D] # BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT
+252E  ; [*076C.0020.0002.252E] # BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT
+252F  ; [*076D.0020.0002.252F] # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+2530  ; [*076E.0020.0002.2530] # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+2531  ; [*076F.0020.0002.2531] # BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY
+2532  ; [*0770.0020.0002.2532] # BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY
+2533  ; [*0771.0020.0002.2533] # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+2534  ; [*0772.0020.0002.2534] # BOX DRAWINGS LIGHT UP AND HORIZONTAL
+2535  ; [*0773.0020.0002.2535] # BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT
+2536  ; [*0774.0020.0002.2536] # BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT
+2537  ; [*0775.0020.0002.2537] # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+2538  ; [*0776.0020.0002.2538] # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+2539  ; [*0777.0020.0002.2539] # BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY
+253A  ; [*0778.0020.0002.253A] # BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY
+253B  ; [*0779.0020.0002.253B] # BOX DRAWINGS HEAVY UP AND HORIZONTAL
+253C  ; [*077A.0020.0002.253C] # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+253D  ; [*077B.0020.0002.253D] # BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT
+253E  ; [*077C.0020.0002.253E] # BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT
+253F  ; [*077D.0020.0002.253F] # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+2540  ; [*077E.0020.0002.2540] # BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT
+2541  ; [*077F.0020.0002.2541] # BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT
+2542  ; [*0780.0020.0002.2542] # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+2543  ; [*0781.0020.0002.2543] # BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT
+2544  ; [*0782.0020.0002.2544] # BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT
+2545  ; [*0783.0020.0002.2545] # BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT
+2546  ; [*0784.0020.0002.2546] # BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT
+2547  ; [*0785.0020.0002.2547] # BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY
+2548  ; [*0786.0020.0002.2548] # BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY
+2549  ; [*0787.0020.0002.2549] # BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY
+254A  ; [*0788.0020.0002.254A] # BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY
+254B  ; [*0789.0020.0002.254B] # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+254C  ; [*078A.0020.0002.254C] # BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL
+254D  ; [*078B.0020.0002.254D] # BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL
+254E  ; [*078C.0020.0002.254E] # BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL
+254F  ; [*078D.0020.0002.254F] # BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL
+2550  ; [*078E.0020.0002.2550] # BOX DRAWINGS DOUBLE HORIZONTAL
+2551  ; [*078F.0020.0002.2551] # BOX DRAWINGS DOUBLE VERTICAL
+2552  ; [*0790.0020.0002.2552] # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+2553  ; [*0791.0020.0002.2553] # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+2554  ; [*0792.0020.0002.2554] # BOX DRAWINGS DOUBLE DOWN AND RIGHT
+2555  ; [*0793.0020.0002.2555] # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+2556  ; [*0794.0020.0002.2556] # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+2557  ; [*0795.0020.0002.2557] # BOX DRAWINGS DOUBLE DOWN AND LEFT
+2558  ; [*0796.0020.0002.2558] # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+2559  ; [*0797.0020.0002.2559] # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+255A  ; [*0798.0020.0002.255A] # BOX DRAWINGS DOUBLE UP AND RIGHT
+255B  ; [*0799.0020.0002.255B] # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+255C  ; [*079A.0020.0002.255C] # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+255D  ; [*079B.0020.0002.255D] # BOX DRAWINGS DOUBLE UP AND LEFT
+255E  ; [*079C.0020.0002.255E] # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+255F  ; [*079D.0020.0002.255F] # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+2560  ; [*079E.0020.0002.2560] # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+2561  ; [*079F.0020.0002.2561] # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+2562  ; [*07A0.0020.0002.2562] # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+2563  ; [*07A1.0020.0002.2563] # BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+2564  ; [*07A2.0020.0002.2564] # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+2565  ; [*07A3.0020.0002.2565] # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+2566  ; [*07A4.0020.0002.2566] # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+2567  ; [*07A5.0020.0002.2567] # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+2568  ; [*07A6.0020.0002.2568] # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+2569  ; [*07A7.0020.0002.2569] # BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+256A  ; [*07A8.0020.0002.256A] # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+256B  ; [*07A9.0020.0002.256B] # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+256C  ; [*07AA.0020.0002.256C] # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+256D  ; [*07AB.0020.0002.256D] # BOX DRAWINGS LIGHT ARC DOWN AND RIGHT
+256E  ; [*07AC.0020.0002.256E] # BOX DRAWINGS LIGHT ARC DOWN AND LEFT
+256F  ; [*07AD.0020.0002.256F] # BOX DRAWINGS LIGHT ARC UP AND LEFT
+2570  ; [*07AE.0020.0002.2570] # BOX DRAWINGS LIGHT ARC UP AND RIGHT
+2571  ; [*07AF.0020.0002.2571] # BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
+2572  ; [*07B0.0020.0002.2572] # BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
+2573  ; [*07B1.0020.0002.2573] # BOX DRAWINGS LIGHT DIAGONAL CROSS
+2574  ; [*07B2.0020.0002.2574] # BOX DRAWINGS LIGHT LEFT
+2575  ; [*07B3.0020.0002.2575] # BOX DRAWINGS LIGHT UP
+2576  ; [*07B4.0020.0002.2576] # BOX DRAWINGS LIGHT RIGHT
+2577  ; [*07B5.0020.0002.2577] # BOX DRAWINGS LIGHT DOWN
+2578  ; [*07B6.0020.0002.2578] # BOX DRAWINGS HEAVY LEFT
+2579  ; [*07B7.0020.0002.2579] # BOX DRAWINGS HEAVY UP
+257A  ; [*07B8.0020.0002.257A] # BOX DRAWINGS HEAVY RIGHT
+257B  ; [*07B9.0020.0002.257B] # BOX DRAWINGS HEAVY DOWN
+257C  ; [*07BA.0020.0002.257C] # BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT
+257D  ; [*07BB.0020.0002.257D] # BOX DRAWINGS LIGHT UP AND HEAVY DOWN
+257E  ; [*07BC.0020.0002.257E] # BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT
+257F  ; [*07BD.0020.0002.257F] # BOX DRAWINGS HEAVY UP AND LIGHT DOWN
+2580  ; [*07BE.0020.0002.2580] # UPPER HALF BLOCK
+2581  ; [*07BF.0020.0002.2581] # LOWER ONE EIGHTH BLOCK
+2582  ; [*07C0.0020.0002.2582] # LOWER ONE QUARTER BLOCK
+2583  ; [*07C1.0020.0002.2583] # LOWER THREE EIGHTHS BLOCK
+2584  ; [*07C2.0020.0002.2584] # LOWER HALF BLOCK
+2585  ; [*07C3.0020.0002.2585] # LOWER FIVE EIGHTHS BLOCK
+2586  ; [*07C4.0020.0002.2586] # LOWER THREE QUARTERS BLOCK
+2587  ; [*07C5.0020.0002.2587] # LOWER SEVEN EIGHTHS BLOCK
+2588  ; [*07C6.0020.0002.2588] # FULL BLOCK
+2589  ; [*07C7.0020.0002.2589] # LEFT SEVEN EIGHTHS BLOCK
+258A  ; [*07C8.0020.0002.258A] # LEFT THREE QUARTERS BLOCK
+258B  ; [*07C9.0020.0002.258B] # LEFT FIVE EIGHTHS BLOCK
+258C  ; [*07CA.0020.0002.258C] # LEFT HALF BLOCK
+258D  ; [*07CB.0020.0002.258D] # LEFT THREE EIGHTHS BLOCK
+258E  ; [*07CC.0020.0002.258E] # LEFT ONE QUARTER BLOCK
+258F  ; [*07CD.0020.0002.258F] # LEFT ONE EIGHTH BLOCK
+2590  ; [*07CE.0020.0002.2590] # RIGHT HALF BLOCK
+2591  ; [*07CF.0020.0002.2591] # LIGHT SHADE
+2592  ; [*07D0.0020.0002.2592] # MEDIUM SHADE
+2593  ; [*07D1.0020.0002.2593] # DARK SHADE
+2594  ; [*07D2.0020.0002.2594] # UPPER ONE EIGHTH BLOCK
+2595  ; [*07D3.0020.0002.2595] # RIGHT ONE EIGHTH BLOCK
+2596  ; [*07D4.0020.0002.2596] # QUADRANT LOWER LEFT
+2597  ; [*07D5.0020.0002.2597] # QUADRANT LOWER RIGHT
+2598  ; [*07D6.0020.0002.2598] # QUADRANT UPPER LEFT
+2599  ; [*07D7.0020.0002.2599] # QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT
+259A  ; [*07D8.0020.0002.259A] # QUADRANT UPPER LEFT AND LOWER RIGHT
+259B  ; [*07D9.0020.0002.259B] # QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT
+259C  ; [*07DA.0020.0002.259C] # QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT
+259D  ; [*07DB.0020.0002.259D] # QUADRANT UPPER RIGHT
+259E  ; [*07DC.0020.0002.259E] # QUADRANT UPPER RIGHT AND LOWER LEFT
+259F  ; [*07DD.0020.0002.259F] # QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT
+25A0  ; [*07DE.0020.0002.25A0] # BLACK SQUARE
+25A1  ; [*07DF.0020.0002.25A1] # WHITE SQUARE
+25A2  ; [*07E0.0020.0002.25A2] # WHITE SQUARE WITH ROUNDED CORNERS
+25A3  ; [*07E1.0020.0002.25A3] # WHITE SQUARE CONTAINING BLACK SMALL SQUARE
+25A4  ; [*07E2.0020.0002.25A4] # SQUARE WITH HORIZONTAL FILL
+25A5  ; [*07E3.0020.0002.25A5] # SQUARE WITH VERTICAL FILL
+25A6  ; [*07E4.0020.0002.25A6] # SQUARE WITH ORTHOGONAL CROSSHATCH FILL
+25A7  ; [*07E5.0020.0002.25A7] # SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL
+25A8  ; [*07E6.0020.0002.25A8] # SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL
+25A9  ; [*07E7.0020.0002.25A9] # SQUARE WITH DIAGONAL CROSSHATCH FILL
+25AA  ; [*07E8.0020.0002.25AA] # BLACK SMALL SQUARE
+25AB  ; [*07E9.0020.0002.25AB] # WHITE SMALL SQUARE
+25AC  ; [*07EA.0020.0002.25AC] # BLACK RECTANGLE
+25AD  ; [*07EB.0020.0002.25AD] # WHITE RECTANGLE
+25AE  ; [*07EC.0020.0002.25AE] # BLACK VERTICAL RECTANGLE
+25AF  ; [*07ED.0020.0002.25AF] # WHITE VERTICAL RECTANGLE
+25B0  ; [*07EE.0020.0002.25B0] # BLACK PARALLELOGRAM
+25B1  ; [*07EF.0020.0002.25B1] # WHITE PARALLELOGRAM
+25B2  ; [*07F0.0020.0002.25B2] # BLACK UP-POINTING TRIANGLE
+25B3  ; [*07F1.0020.0002.25B3] # WHITE UP-POINTING TRIANGLE
+25B4  ; [*07F2.0020.0002.25B4] # BLACK UP-POINTING SMALL TRIANGLE
+25B5  ; [*07F3.0020.0002.25B5] # WHITE UP-POINTING SMALL TRIANGLE
+25B6  ; [*07F4.0020.0002.25B6] # BLACK RIGHT-POINTING TRIANGLE
+25B7  ; [*07F5.0020.0002.25B7] # WHITE RIGHT-POINTING TRIANGLE
+25B8  ; [*07F6.0020.0002.25B8] # BLACK RIGHT-POINTING SMALL TRIANGLE
+25B9  ; [*07F7.0020.0002.25B9] # WHITE RIGHT-POINTING SMALL TRIANGLE
+25BA  ; [*07F8.0020.0002.25BA] # BLACK RIGHT-POINTING POINTER
+25BB  ; [*07F9.0020.0002.25BB] # WHITE RIGHT-POINTING POINTER
+25BC  ; [*07FA.0020.0002.25BC] # BLACK DOWN-POINTING TRIANGLE
+25BD  ; [*07FB.0020.0002.25BD] # WHITE DOWN-POINTING TRIANGLE
+25BE  ; [*07FC.0020.0002.25BE] # BLACK DOWN-POINTING SMALL TRIANGLE
+25BF  ; [*07FD.0020.0002.25BF] # WHITE DOWN-POINTING SMALL TRIANGLE
+25C0  ; [*07FE.0020.0002.25C0] # BLACK LEFT-POINTING TRIANGLE
+25C1  ; [*07FF.0020.0002.25C1] # WHITE LEFT-POINTING TRIANGLE
+25C2  ; [*0800.0020.0002.25C2] # BLACK LEFT-POINTING SMALL TRIANGLE
+25C3  ; [*0801.0020.0002.25C3] # WHITE LEFT-POINTING SMALL TRIANGLE
+25C4  ; [*0802.0020.0002.25C4] # BLACK LEFT-POINTING POINTER
+25C5  ; [*0803.0020.0002.25C5] # WHITE LEFT-POINTING POINTER
+25C6  ; [*0804.0020.0002.25C6] # BLACK DIAMOND
+25C7  ; [*0805.0020.0002.25C7] # WHITE DIAMOND
+25C8  ; [*0806.0020.0002.25C8] # WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND
+25C9  ; [*0807.0020.0002.25C9] # FISHEYE
+25CA  ; [*0808.0020.0002.25CA] # LOZENGE
+25CB  ; [*0809.0020.0002.25CB] # WHITE CIRCLE
+25CC  ; [*080A.0020.0002.25CC] # DOTTED CIRCLE
+25CD  ; [*080B.0020.0002.25CD] # CIRCLE WITH VERTICAL FILL
+25CE  ; [*080C.0020.0002.25CE] # BULLSEYE
+25CF  ; [*080D.0020.0002.25CF] # BLACK CIRCLE
+25D0  ; [*080E.0020.0002.25D0] # CIRCLE WITH LEFT HALF BLACK
+25D1  ; [*080F.0020.0002.25D1] # CIRCLE WITH RIGHT HALF BLACK
+25D2  ; [*0810.0020.0002.25D2] # CIRCLE WITH LOWER HALF BLACK
+25D3  ; [*0811.0020.0002.25D3] # CIRCLE WITH UPPER HALF BLACK
+25D4  ; [*0812.0020.0002.25D4] # CIRCLE WITH UPPER RIGHT QUADRANT BLACK
+25D5  ; [*0813.0020.0002.25D5] # CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK
+25D6  ; [*0814.0020.0002.25D6] # LEFT HALF BLACK CIRCLE
+25D7  ; [*0815.0020.0002.25D7] # RIGHT HALF BLACK CIRCLE
+25D8  ; [*0816.0020.0002.25D8] # INVERSE BULLET
+25D9  ; [*0817.0020.0002.25D9] # INVERSE WHITE CIRCLE
+25DA  ; [*0818.0020.0002.25DA] # UPPER HALF INVERSE WHITE CIRCLE
+25DB  ; [*0819.0020.0002.25DB] # LOWER HALF INVERSE WHITE CIRCLE
+25DC  ; [*081A.0020.0002.25DC] # UPPER LEFT QUADRANT CIRCULAR ARC
+25DD  ; [*081B.0020.0002.25DD] # UPPER RIGHT QUADRANT CIRCULAR ARC
+25DE  ; [*081C.0020.0002.25DE] # LOWER RIGHT QUADRANT CIRCULAR ARC
+25DF  ; [*081D.0020.0002.25DF] # LOWER LEFT QUADRANT CIRCULAR ARC
+25E0  ; [*081E.0020.0002.25E0] # UPPER HALF CIRCLE
+25E1  ; [*081F.0020.0002.25E1] # LOWER HALF CIRCLE
+25E2  ; [*0820.0020.0002.25E2] # BLACK LOWER RIGHT TRIANGLE
+25E3  ; [*0821.0020.0002.25E3] # BLACK LOWER LEFT TRIANGLE
+25E4  ; [*0822.0020.0002.25E4] # BLACK UPPER LEFT TRIANGLE
+25E5  ; [*0823.0020.0002.25E5] # BLACK UPPER RIGHT TRIANGLE
+25E6  ; [*0824.0020.0002.25E6] # WHITE BULLET
+25E7  ; [*0825.0020.0002.25E7] # SQUARE WITH LEFT HALF BLACK
+25E8  ; [*0826.0020.0002.25E8] # SQUARE WITH RIGHT HALF BLACK
+25E9  ; [*0827.0020.0002.25E9] # SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK
+25EA  ; [*0828.0020.0002.25EA] # SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK
+25EB  ; [*0829.0020.0002.25EB] # WHITE SQUARE WITH VERTICAL BISECTING LINE
+25EC  ; [*082A.0020.0002.25EC] # WHITE UP-POINTING TRIANGLE WITH DOT
+25ED  ; [*082B.0020.0002.25ED] # UP-POINTING TRIANGLE WITH LEFT HALF BLACK
+25EE  ; [*082C.0020.0002.25EE] # UP-POINTING TRIANGLE WITH RIGHT HALF BLACK
+25EF  ; [*082D.0020.0002.25EF] # LARGE CIRCLE
+25F0  ; [*082E.0020.0002.25F0] # WHITE SQUARE WITH UPPER LEFT QUADRANT
+25F1  ; [*082F.0020.0002.25F1] # WHITE SQUARE WITH LOWER LEFT QUADRANT
+25F2  ; [*0830.0020.0002.25F2] # WHITE SQUARE WITH LOWER RIGHT QUADRANT
+25F3  ; [*0831.0020.0002.25F3] # WHITE SQUARE WITH UPPER RIGHT QUADRANT
+25F4  ; [*0832.0020.0002.25F4] # WHITE CIRCLE WITH UPPER LEFT QUADRANT
+25F5  ; [*0833.0020.0002.25F5] # WHITE CIRCLE WITH LOWER LEFT QUADRANT
+25F6  ; [*0834.0020.0002.25F6] # WHITE CIRCLE WITH LOWER RIGHT QUADRANT
+25F7  ; [*0835.0020.0002.25F7] # WHITE CIRCLE WITH UPPER RIGHT QUADRANT
+25F8  ; [*0836.0020.0002.25F8] # UPPER LEFT TRIANGLE
+25F9  ; [*0837.0020.0002.25F9] # UPPER RIGHT TRIANGLE
+25FA  ; [*0838.0020.0002.25FA] # LOWER LEFT TRIANGLE
+25FB  ; [*0839.0020.0002.25FB] # WHITE MEDIUM SQUARE
+25FC  ; [*083A.0020.0002.25FC] # BLACK MEDIUM SQUARE
+25FD  ; [*083B.0020.0002.25FD] # WHITE MEDIUM SMALL SQUARE
+25FE  ; [*083C.0020.0002.25FE] # BLACK MEDIUM SMALL SQUARE
+25FF  ; [*083D.0020.0002.25FF] # LOWER RIGHT TRIANGLE
+2600  ; [*083E.0020.0002.2600] # BLACK SUN WITH RAYS
+2601  ; [*083F.0020.0002.2601] # CLOUD
+2602  ; [*0840.0020.0002.2602] # UMBRELLA
+2603  ; [*0841.0020.0002.2603] # SNOWMAN
+2604  ; [*0842.0020.0002.2604] # COMET
+2605  ; [*0843.0020.0002.2605] # BLACK STAR
+2606  ; [*0844.0020.0002.2606] # WHITE STAR
+2607  ; [*0845.0020.0002.2607] # LIGHTNING
+2608  ; [*0846.0020.0002.2608] # THUNDERSTORM
+2609  ; [*0847.0020.0002.2609] # SUN
+260A  ; [*0848.0020.0002.260A] # ASCENDING NODE
+260B  ; [*0849.0020.0002.260B] # DESCENDING NODE
+260C  ; [*084A.0020.0002.260C] # CONJUNCTION
+260D  ; [*084B.0020.0002.260D] # OPPOSITION
+260E  ; [*084C.0020.0002.260E] # BLACK TELEPHONE
+260F  ; [*084D.0020.0002.260F] # WHITE TELEPHONE
+2610  ; [*084E.0020.0002.2610] # BALLOT BOX
+2611  ; [*084F.0020.0002.2611] # BALLOT BOX WITH CHECK
+2612  ; [*0850.0020.0002.2612] # BALLOT BOX WITH X
+2613  ; [*0851.0020.0002.2613] # SALTIRE
+2614  ; [*0852.0020.0002.2614] # UMBRELLA WITH RAIN DROPS
+2615  ; [*0853.0020.0002.2615] # HOT BEVERAGE
+2616  ; [*0854.0020.0002.2616] # WHITE SHOGI PIECE
+2617  ; [*0855.0020.0002.2617] # BLACK SHOGI PIECE
+2618  ; [*0856.0020.0002.2618] # SHAMROCK
+2619  ; [*0857.0020.0002.2619] # REVERSED ROTATED FLORAL HEART BULLET
+261A  ; [*0858.0020.0002.261A] # BLACK LEFT POINTING INDEX
+261B  ; [*0859.0020.0002.261B] # BLACK RIGHT POINTING INDEX
+261C  ; [*085A.0020.0002.261C] # WHITE LEFT POINTING INDEX
+261D  ; [*085B.0020.0002.261D] # WHITE UP POINTING INDEX
+261E  ; [*085C.0020.0002.261E] # WHITE RIGHT POINTING INDEX
+261F  ; [*085D.0020.0002.261F] # WHITE DOWN POINTING INDEX
+2620  ; [*085E.0020.0002.2620] # SKULL AND CROSSBONES
+2621  ; [*085F.0020.0002.2621] # CAUTION SIGN
+2622  ; [*0860.0020.0002.2622] # RADIOACTIVE SIGN
+2623  ; [*0861.0020.0002.2623] # BIOHAZARD SIGN
+2624  ; [*0862.0020.0002.2624] # CADUCEUS
+2625  ; [*0863.0020.0002.2625] # ANKH
+2626  ; [*0864.0020.0002.2626] # ORTHODOX CROSS
+2627  ; [*0865.0020.0002.2627] # CHI RHO
+2628  ; [*0866.0020.0002.2628] # CROSS OF LORRAINE
+2629  ; [*0867.0020.0002.2629] # CROSS OF JERUSALEM
+262A  ; [*0868.0020.0002.262A] # STAR AND CRESCENT
+262B  ; [*0869.0020.0002.262B] # FARSI SYMBOL
+262C  ; [*086A.0020.0002.262C] # ADI SHAKTI
+262D  ; [*086B.0020.0002.262D] # HAMMER AND SICKLE
+262E  ; [*086C.0020.0002.262E] # PEACE SYMBOL
+262F  ; [*086D.0020.0002.262F] # YIN YANG
+2630  ; [*0D36.0020.0002.2630] # TRIGRAM FOR HEAVEN
+2631  ; [*0D37.0020.0002.2631] # TRIGRAM FOR LAKE
+2632  ; [*0D38.0020.0002.2632] # TRIGRAM FOR FIRE
+2633  ; [*0D39.0020.0002.2633] # TRIGRAM FOR THUNDER
+2634  ; [*0D3A.0020.0002.2634] # TRIGRAM FOR WIND
+2635  ; [*0D3B.0020.0002.2635] # TRIGRAM FOR WATER
+2636  ; [*0D3C.0020.0002.2636] # TRIGRAM FOR MOUNTAIN
+2637  ; [*0D3D.0020.0002.2637] # TRIGRAM FOR EARTH
+2638  ; [*086E.0020.0002.2638] # WHEEL OF DHARMA
+2639  ; [*086F.0020.0002.2639] # WHITE FROWNING FACE
+263A  ; [*0870.0020.0002.263A] # WHITE SMILING FACE
+263B  ; [*0871.0020.0002.263B] # BLACK SMILING FACE
+263C  ; [*0872.0020.0002.263C] # WHITE SUN WITH RAYS
+263D  ; [*0873.0020.0002.263D] # FIRST QUARTER MOON
+263E  ; [*0874.0020.0002.263E] # LAST QUARTER MOON
+263F  ; [*0875.0020.0002.263F] # MERCURY
+2640  ; [*0876.0020.0002.2640] # FEMALE SIGN
+2641  ; [*0877.0020.0002.2641] # EARTH
+2642  ; [*0878.0020.0002.2642] # MALE SIGN
+2643  ; [*0879.0020.0002.2643] # JUPITER
+2644  ; [*087A.0020.0002.2644] # SATURN
+2645  ; [*087B.0020.0002.2645] # URANUS
+2646  ; [*087C.0020.0002.2646] # NEPTUNE
+2647  ; [*087D.0020.0002.2647] # PLUTO
+2648  ; [*087E.0020.0002.2648] # ARIES
+2649  ; [*087F.0020.0002.2649] # TAURUS
+264A  ; [*0880.0020.0002.264A] # GEMINI
+264B  ; [*0881.0020.0002.264B] # CANCER
+264C  ; [*0882.0020.0002.264C] # LEO
+264D  ; [*0883.0020.0002.264D] # VIRGO
+264E  ; [*0884.0020.0002.264E] # LIBRA
+264F  ; [*0885.0020.0002.264F] # SCORPIUS
+2650  ; [*0886.0020.0002.2650] # SAGITTARIUS
+2651  ; [*0887.0020.0002.2651] # CAPRICORN
+2652  ; [*0888.0020.0002.2652] # AQUARIUS
+2653  ; [*0889.0020.0002.2653] # PISCES
+2654  ; [*088A.0020.0002.2654] # WHITE CHESS KING
+2655  ; [*088B.0020.0002.2655] # WHITE CHESS QUEEN
+2656  ; [*088C.0020.0002.2656] # WHITE CHESS ROOK
+2657  ; [*088D.0020.0002.2657] # WHITE CHESS BISHOP
+2658  ; [*088E.0020.0002.2658] # WHITE CHESS KNIGHT
+2659  ; [*088F.0020.0002.2659] # WHITE CHESS PAWN
+265A  ; [*0890.0020.0002.265A] # BLACK CHESS KING
+265B  ; [*0891.0020.0002.265B] # BLACK CHESS QUEEN
+265C  ; [*0892.0020.0002.265C] # BLACK CHESS ROOK
+265D  ; [*0893.0020.0002.265D] # BLACK CHESS BISHOP
+265E  ; [*0894.0020.0002.265E] # BLACK CHESS KNIGHT
+265F  ; [*0895.0020.0002.265F] # BLACK CHESS PAWN
+2660  ; [*0896.0020.0002.2660] # BLACK SPADE SUIT
+2661  ; [*0897.0020.0002.2661] # WHITE HEART SUIT
+2662  ; [*0898.0020.0002.2662] # WHITE DIAMOND SUIT
+2663  ; [*0899.0020.0002.2663] # BLACK CLUB SUIT
+2664  ; [*089A.0020.0002.2664] # WHITE SPADE SUIT
+2665  ; [*089B.0020.0002.2665] # BLACK HEART SUIT
+2666  ; [*089C.0020.0002.2666] # BLACK DIAMOND SUIT
+2667  ; [*089D.0020.0002.2667] # WHITE CLUB SUIT
+2668  ; [*089E.0020.0002.2668] # HOT SPRINGS
+2669  ; [*089F.0020.0002.2669] # QUARTER NOTE
+266A  ; [*08A0.0020.0002.266A] # EIGHTH NOTE
+266B  ; [*08A1.0020.0002.266B] # BEAMED EIGHTH NOTES
+266C  ; [*08A2.0020.0002.266C] # BEAMED SIXTEENTH NOTES
+266D  ; [*0F7C.0020.0002.266D] # MUSIC FLAT SIGN
+266E  ; [*0F7D.0020.0002.266E] # MUSIC NATURAL SIGN
+266F  ; [*0F7E.0020.0002.266F] # MUSIC SHARP SIGN
+2670  ; [*08A3.0020.0002.2670] # WEST SYRIAC CROSS
+2671  ; [*08A4.0020.0002.2671] # EAST SYRIAC CROSS
+2672  ; [*08A5.0020.0002.2672] # UNIVERSAL RECYCLING SYMBOL
+2673  ; [*08A6.0020.0002.2673] # RECYCLING SYMBOL FOR TYPE-1 PLASTICS
+2674  ; [*08A7.0020.0002.2674] # RECYCLING SYMBOL FOR TYPE-2 PLASTICS
+2675  ; [*08A8.0020.0002.2675] # RECYCLING SYMBOL FOR TYPE-3 PLASTICS
+2676  ; [*08A9.0020.0002.2676] # RECYCLING SYMBOL FOR TYPE-4 PLASTICS
+2677  ; [*08AA.0020.0002.2677] # RECYCLING SYMBOL FOR TYPE-5 PLASTICS
+2678  ; [*08AB.0020.0002.2678] # RECYCLING SYMBOL FOR TYPE-6 PLASTICS
+2679  ; [*08AC.0020.0002.2679] # RECYCLING SYMBOL FOR TYPE-7 PLASTICS
+267A  ; [*08AD.0020.0002.267A] # RECYCLING SYMBOL FOR GENERIC MATERIALS
+267B  ; [*08AE.0020.0002.267B] # BLACK UNIVERSAL RECYCLING SYMBOL
+267C  ; [*08AF.0020.0002.267C] # RECYCLED PAPER SYMBOL
+267D  ; [*08B0.0020.0002.267D] # PARTIALLY-RECYCLED PAPER SYMBOL
+267E  ; [*08B1.0020.0002.267E] # PERMANENT PAPER SIGN
+267F  ; [*08B2.0020.0002.267F] # WHEELCHAIR SYMBOL
+2680  ; [*08B3.0020.0002.2680] # DIE FACE-1
+2681  ; [*08B4.0020.0002.2681] # DIE FACE-2
+2682  ; [*08B5.0020.0002.2682] # DIE FACE-3
+2683  ; [*08B6.0020.0002.2683] # DIE FACE-4
+2684  ; [*08B7.0020.0002.2684] # DIE FACE-5
+2685  ; [*08B8.0020.0002.2685] # DIE FACE-6
+2686  ; [*08B9.0020.0002.2686] # WHITE CIRCLE WITH DOT RIGHT
+2687  ; [*08BA.0020.0002.2687] # WHITE CIRCLE WITH TWO DOTS
+2688  ; [*08BB.0020.0002.2688] # BLACK CIRCLE WITH WHITE DOT RIGHT
+2689  ; [*08BC.0020.0002.2689] # BLACK CIRCLE WITH TWO WHITE DOTS
+268A  ; [*0D30.0020.0002.268A] # MONOGRAM FOR YANG
+268B  ; [*0D31.0020.0002.268B] # MONOGRAM FOR YIN
+268C  ; [*0D32.0020.0002.268C] # DIGRAM FOR GREATER YANG
+268D  ; [*0D33.0020.0002.268D] # DIGRAM FOR LESSER YIN
+268E  ; [*0D34.0020.0002.268E] # DIGRAM FOR LESSER YANG
+268F  ; [*0D35.0020.0002.268F] # DIGRAM FOR GREATER YIN
+2690  ; [*08BD.0020.0002.2690] # WHITE FLAG
+2691  ; [*08BE.0020.0002.2691] # BLACK FLAG
+2692  ; [*08BF.0020.0002.2692] # HAMMER AND PICK
+2693  ; [*08C0.0020.0002.2693] # ANCHOR
+2694  ; [*08C1.0020.0002.2694] # CROSSED SWORDS
+2695  ; [*08C2.0020.0002.2695] # STAFF OF AESCULAPIUS
+2696  ; [*08C3.0020.0002.2696] # SCALES
+2697  ; [*08C4.0020.0002.2697] # ALEMBIC
+2698  ; [*08C5.0020.0002.2698] # FLOWER
+2699  ; [*08C6.0020.0002.2699] # GEAR
+269A  ; [*08C7.0020.0002.269A] # STAFF OF HERMES
+269B  ; [*08C8.0020.0002.269B] # ATOM SYMBOL
+269C  ; [*08C9.0020.0002.269C] # FLEUR-DE-LIS
+269D  ; [*08CA.0020.0002.269D] # OUTLINED WHITE STAR
+269E  ; [*08CB.0020.0002.269E] # THREE LINES CONVERGING RIGHT
+269F  ; [*08CC.0020.0002.269F] # THREE LINES CONVERGING LEFT
+26A0  ; [*08CD.0020.0002.26A0] # WARNING SIGN
+26A1  ; [*08CE.0020.0002.26A1] # HIGH VOLTAGE SIGN
+26A2  ; [*08CF.0020.0002.26A2] # DOUBLED FEMALE SIGN
+26A3  ; [*08D0.0020.0002.26A3] # DOUBLED MALE SIGN
+26A4  ; [*08D1.0020.0002.26A4] # INTERLOCKED FEMALE AND MALE SIGN
+26A5  ; [*08D2.0020.0002.26A5] # MALE AND FEMALE SIGN
+26A6  ; [*08D3.0020.0002.26A6] # MALE WITH STROKE SIGN
+26A7  ; [*08D4.0020.0002.26A7] # MALE WITH STROKE AND MALE AND FEMALE SIGN
+26A8  ; [*08D5.0020.0002.26A8] # VERTICAL MALE WITH STROKE SIGN
+26A9  ; [*08D6.0020.0002.26A9] # HORIZONTAL MALE WITH STROKE SIGN
+26AA  ; [*08D7.0020.0002.26AA] # MEDIUM WHITE CIRCLE
+26AB  ; [*08D8.0020.0002.26AB] # MEDIUM BLACK CIRCLE
+26AC  ; [*08D9.0020.0002.26AC] # MEDIUM SMALL WHITE CIRCLE
+26AD  ; [*08DA.0020.0002.26AD] # MARRIAGE SYMBOL
+26AE  ; [*08DB.0020.0002.26AE] # DIVORCE SYMBOL
+26AF  ; [*08DC.0020.0002.26AF] # UNMARRIED PARTNERSHIP SYMBOL
+26B0  ; [*08DD.0020.0002.26B0] # COFFIN
+26B1  ; [*08DE.0020.0002.26B1] # FUNERAL URN
+26B2  ; [*08DF.0020.0002.26B2] # NEUTER
+26B3  ; [*08E0.0020.0002.26B3] # CERES
+26B4  ; [*08E1.0020.0002.26B4] # PALLAS
+26B5  ; [*08E2.0020.0002.26B5] # JUNO
+26B6  ; [*08E3.0020.0002.26B6] # VESTA
+26B7  ; [*08E4.0020.0002.26B7] # CHIRON
+26B8  ; [*08E5.0020.0002.26B8] # BLACK MOON LILITH
+26B9  ; [*08E6.0020.0002.26B9] # SEXTILE
+26BA  ; [*08E7.0020.0002.26BA] # SEMISEXTILE
+26BB  ; [*08E8.0020.0002.26BB] # QUINCUNX
+26BC  ; [*08E9.0020.0002.26BC] # SESQUIQUADRATE
+26BD  ; [*08EA.0020.0002.26BD] # SOCCER BALL
+26BE  ; [*08EB.0020.0002.26BE] # BASEBALL
+26BF  ; [*08EC.0020.0002.26BF] # SQUARED KEY
+26C0  ; [*08ED.0020.0002.26C0] # WHITE DRAUGHTS MAN
+26C1  ; [*08EE.0020.0002.26C1] # WHITE DRAUGHTS KING
+26C2  ; [*08EF.0020.0002.26C2] # BLACK DRAUGHTS MAN
+26C3  ; [*08F0.0020.0002.26C3] # BLACK DRAUGHTS KING
+26C4  ; [*08F1.0020.0002.26C4] # SNOWMAN WITHOUT SNOW
+26C5  ; [*08F2.0020.0002.26C5] # SUN BEHIND CLOUD
+26C6  ; [*08F3.0020.0002.26C6] # RAIN
+26C7  ; [*08F4.0020.0002.26C7] # BLACK SNOWMAN
+26C8  ; [*08F5.0020.0002.26C8] # THUNDER CLOUD AND RAIN
+26C9  ; [*08F6.0020.0002.26C9] # TURNED WHITE SHOGI PIECE
+26CA  ; [*08F7.0020.0002.26CA] # TURNED BLACK SHOGI PIECE
+26CB  ; [*08F8.0020.0002.26CB] # WHITE DIAMOND IN SQUARE
+26CC  ; [*08F9.0020.0002.26CC] # CROSSING LANES
+26CD  ; [*08FA.0020.0002.26CD] # DISABLED CAR
+26CF  ; [*08FB.0020.0002.26CF] # PICK
+26D0  ; [*08FC.0020.0002.26D0] # CAR SLIDING
+26D1  ; [*08FD.0020.0002.26D1] # HELMET WITH WHITE CROSS
+26D2  ; [*08FE.0020.0002.26D2] # CIRCLED CROSSING LANES
+26D3  ; [*08FF.0020.0002.26D3] # CHAINS
+26D4  ; [*0900.0020.0002.26D4] # NO ENTRY
+26D5  ; [*0901.0020.0002.26D5] # ALTERNATE ONE-WAY LEFT WAY TRAFFIC
+26D6  ; [*0902.0020.0002.26D6] # BLACK TWO-WAY LEFT WAY TRAFFIC
+26D7  ; [*0903.0020.0002.26D7] # WHITE TWO-WAY LEFT WAY TRAFFIC
+26D8  ; [*0904.0020.0002.26D8] # BLACK LEFT LANE MERGE
+26D9  ; [*0905.0020.0002.26D9] # WHITE LEFT LANE MERGE
+26DA  ; [*0906.0020.0002.26DA] # DRIVE SLOW SIGN
+26DB  ; [*0907.0020.0002.26DB] # HEAVY WHITE DOWN-POINTING TRIANGLE
+26DC  ; [*0908.0020.0002.26DC] # LEFT CLOSED ENTRY
+26DD  ; [*0909.0020.0002.26DD] # SQUARED SALTIRE
+26DE  ; [*090A.0020.0002.26DE] # FALLING DIAGONAL IN WHITE CIRCLE IN BLACK SQUARE
+26DF  ; [*090B.0020.0002.26DF] # BLACK TRUCK
+26E0  ; [*090C.0020.0002.26E0] # RESTRICTED LEFT ENTRY-1
+26E1  ; [*090D.0020.0002.26E1] # RESTRICTED LEFT ENTRY-2
+26E3  ; [*090E.0020.0002.26E3] # HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE
+26E8  ; [*090F.0020.0002.26E8] # BLACK CROSS ON SHIELD
+26E9  ; [*0910.0020.0002.26E9] # SHINTO SHRINE
+26EA  ; [*0911.0020.0002.26EA] # CHURCH
+26EB  ; [*0912.0020.0002.26EB] # CASTLE
+26EC  ; [*0913.0020.0002.26EC] # HISTORIC SITE
+26ED  ; [*0914.0020.0002.26ED] # GEAR WITHOUT HUB
+26EE  ; [*0915.0020.0002.26EE] # GEAR WITH HANDLES
+26EF  ; [*0916.0020.0002.26EF] # MAP SYMBOL FOR LIGHTHOUSE
+26F0  ; [*0917.0020.0002.26F0] # MOUNTAIN
+26F1  ; [*0918.0020.0002.26F1] # UMBRELLA ON GROUND
+26F2  ; [*0919.0020.0002.26F2] # FOUNTAIN
+26F3  ; [*091A.0020.0002.26F3] # FLAG IN HOLE
+26F4  ; [*091B.0020.0002.26F4] # FERRY
+26F5  ; [*091C.0020.0002.26F5] # SAILBOAT
+26F6  ; [*091D.0020.0002.26F6] # SQUARE FOUR CORNERS
+26F7  ; [*091E.0020.0002.26F7] # SKIER
+26F8  ; [*091F.0020.0002.26F8] # ICE SKATE
+26F9  ; [*0920.0020.0002.26F9] # PERSON WITH BALL
+26FA  ; [*0921.0020.0002.26FA] # TENT
+26FB  ; [*0922.0020.0002.26FB] # JAPANESE BANK SYMBOL
+26FC  ; [*0923.0020.0002.26FC] # HEADSTONE GRAVEYARD SYMBOL
+26FD  ; [*0924.0020.0002.26FD] # FUEL PUMP
+26FE  ; [*0925.0020.0002.26FE] # CUP ON BLACK SQUARE
+26FF  ; [*0926.0020.0002.26FF] # WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE
+2701  ; [*0927.0020.0002.2701] # UPPER BLADE SCISSORS
+2702  ; [*0928.0020.0002.2702] # BLACK SCISSORS
+2703  ; [*0929.0020.0002.2703] # LOWER BLADE SCISSORS
+2704  ; [*092A.0020.0002.2704] # WHITE SCISSORS
+2706  ; [*092B.0020.0002.2706] # TELEPHONE LOCATION SIGN
+2707  ; [*092C.0020.0002.2707] # TAPE DRIVE
+2708  ; [*092D.0020.0002.2708] # AIRPLANE
+2709  ; [*092E.0020.0002.2709] # ENVELOPE
+270C  ; [*092F.0020.0002.270C] # VICTORY HAND
+270D  ; [*0930.0020.0002.270D] # WRITING HAND
+270E  ; [*0931.0020.0002.270E] # LOWER RIGHT PENCIL
+270F  ; [*0932.0020.0002.270F] # PENCIL
+2710  ; [*0933.0020.0002.2710] # UPPER RIGHT PENCIL
+2711  ; [*0934.0020.0002.2711] # WHITE NIB
+2712  ; [*0935.0020.0002.2712] # BLACK NIB
+2713  ; [*0936.0020.0002.2713] # CHECK MARK
+2714  ; [*0937.0020.0002.2714] # HEAVY CHECK MARK
+2715  ; [*0938.0020.0002.2715] # MULTIPLICATION X
+2716  ; [*0939.0020.0002.2716] # HEAVY MULTIPLICATION X
+2717  ; [*093A.0020.0002.2717] # BALLOT X
+2718  ; [*093B.0020.0002.2718] # HEAVY BALLOT X
+2719  ; [*093C.0020.0002.2719] # OUTLINED GREEK CROSS
+271A  ; [*093D.0020.0002.271A] # HEAVY GREEK CROSS
+271B  ; [*093E.0020.0002.271B] # OPEN CENTRE CROSS
+271C  ; [*093F.0020.0002.271C] # HEAVY OPEN CENTRE CROSS
+271D  ; [*0940.0020.0002.271D] # LATIN CROSS
+271E  ; [*0941.0020.0002.271E] # SHADOWED WHITE LATIN CROSS
+271F  ; [*0942.0020.0002.271F] # OUTLINED LATIN CROSS
+2720  ; [*0943.0020.0002.2720] # MALTESE CROSS
+2721  ; [*0944.0020.0002.2721] # STAR OF DAVID
+2722  ; [*0945.0020.0002.2722] # FOUR TEARDROP-SPOKED ASTERISK
+2723  ; [*0946.0020.0002.2723] # FOUR BALLOON-SPOKED ASTERISK
+2724  ; [*0947.0020.0002.2724] # HEAVY FOUR BALLOON-SPOKED ASTERISK
+2725  ; [*0948.0020.0002.2725] # FOUR CLUB-SPOKED ASTERISK
+2726  ; [*0949.0020.0002.2726] # BLACK FOUR POINTED STAR
+2727  ; [*094A.0020.0002.2727] # WHITE FOUR POINTED STAR
+2729  ; [*094B.0020.0002.2729] # STRESS OUTLINED WHITE STAR
+272A  ; [*094C.0020.0002.272A] # CIRCLED WHITE STAR
+272B  ; [*094D.0020.0002.272B] # OPEN CENTRE BLACK STAR
+272C  ; [*094E.0020.0002.272C] # BLACK CENTRE WHITE STAR
+272D  ; [*094F.0020.0002.272D] # OUTLINED BLACK STAR
+272E  ; [*0950.0020.0002.272E] # HEAVY OUTLINED BLACK STAR
+272F  ; [*0951.0020.0002.272F] # PINWHEEL STAR
+2730  ; [*0952.0020.0002.2730] # SHADOWED WHITE STAR
+2731  ; [*0953.0020.0002.2731] # HEAVY ASTERISK
+2732  ; [*0954.0020.0002.2732] # OPEN CENTRE ASTERISK
+2733  ; [*0955.0020.0002.2733] # EIGHT SPOKED ASTERISK
+2734  ; [*0956.0020.0002.2734] # EIGHT POINTED BLACK STAR
+2735  ; [*0957.0020.0002.2735] # EIGHT POINTED PINWHEEL STAR
+2736  ; [*0958.0020.0002.2736] # SIX POINTED BLACK STAR
+2737  ; [*0959.0020.0002.2737] # EIGHT POINTED RECTILINEAR BLACK STAR
+2738  ; [*095A.0020.0002.2738] # HEAVY EIGHT POINTED RECTILINEAR BLACK STAR
+2739  ; [*095B.0020.0002.2739] # TWELVE POINTED BLACK STAR
+273A  ; [*095C.0020.0002.273A] # SIXTEEN POINTED ASTERISK
+273B  ; [*095D.0020.0002.273B] # TEARDROP-SPOKED ASTERISK
+273C  ; [*095E.0020.0002.273C] # OPEN CENTRE TEARDROP-SPOKED ASTERISK
+273D  ; [*095F.0020.0002.273D] # HEAVY TEARDROP-SPOKED ASTERISK
+273E  ; [*0960.0020.0002.273E] # SIX PETALLED BLACK AND WHITE FLORETTE
+273F  ; [*0961.0020.0002.273F] # BLACK FLORETTE
+2740  ; [*0962.0020.0002.2740] # WHITE FLORETTE
+2741  ; [*0963.0020.0002.2741] # EIGHT PETALLED OUTLINED BLACK FLORETTE
+2742  ; [*0964.0020.0002.2742] # CIRCLED OPEN CENTRE EIGHT POINTED STAR
+2743  ; [*0965.0020.0002.2743] # HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK
+2744  ; [*0966.0020.0002.2744] # SNOWFLAKE
+2745  ; [*0967.0020.0002.2745] # TIGHT TRIFOLIATE SNOWFLAKE
+2746  ; [*0968.0020.0002.2746] # HEAVY CHEVRON SNOWFLAKE
+2747  ; [*0969.0020.0002.2747] # SPARKLE
+2748  ; [*096A.0020.0002.2748] # HEAVY SPARKLE
+2749  ; [*096B.0020.0002.2749] # BALLOON-SPOKED ASTERISK
+274A  ; [*096C.0020.0002.274A] # EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274B  ; [*096D.0020.0002.274B] # HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274D  ; [*096E.0020.0002.274D] # SHADOWED WHITE CIRCLE
+274F  ; [*096F.0020.0002.274F] # LOWER RIGHT DROP-SHADOWED WHITE SQUARE
+2750  ; [*0970.0020.0002.2750] # UPPER RIGHT DROP-SHADOWED WHITE SQUARE
+2751  ; [*0971.0020.0002.2751] # LOWER RIGHT SHADOWED WHITE SQUARE
+2752  ; [*0972.0020.0002.2752] # UPPER RIGHT SHADOWED WHITE SQUARE
+2756  ; [*0973.0020.0002.2756] # BLACK DIAMOND MINUS WHITE X
+2757  ; [*0974.0020.0002.2757] # HEAVY EXCLAMATION MARK SYMBOL
+2758  ; [*0975.0020.0002.2758] # LIGHT VERTICAL BAR
+2759  ; [*0976.0020.0002.2759] # MEDIUM VERTICAL BAR
+275A  ; [*0977.0020.0002.275A] # HEAVY VERTICAL BAR
+275B  ; [*0978.0020.0002.275B] # HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT
+275C  ; [*0979.0020.0002.275C] # HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT
+275D  ; [*097A.0020.0002.275D] # HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT
+275E  ; [*097B.0020.0002.275E] # HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT
+2761  ; [*097C.0020.0002.2761] # CURVED STEM PARAGRAPH SIGN ORNAMENT
+2762  ; [*097D.0020.0002.2762] # HEAVY EXCLAMATION MARK ORNAMENT
+2763  ; [*097E.0020.0002.2763] # HEAVY HEART EXCLAMATION MARK ORNAMENT
+2764  ; [*097F.0020.0002.2764] # HEAVY BLACK HEART
+2765  ; [*0980.0020.0002.2765] # ROTATED HEAVY BLACK HEART BULLET
+2766  ; [*0981.0020.0002.2766] # FLORAL HEART
+2767  ; [*0982.0020.0002.2767] # ROTATED FLORAL HEART BULLET
+2768  ; [*0983.0020.0002.2768] # MEDIUM LEFT PARENTHESIS ORNAMENT
+2769  ; [*0984.0020.0002.2769] # MEDIUM RIGHT PARENTHESIS ORNAMENT
+276A  ; [*0985.0020.0002.276A] # MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
+276B  ; [*0986.0020.0002.276B] # MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
+276C  ; [*0987.0020.0002.276C] # MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
+276D  ; [*0988.0020.0002.276D] # MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
+276E  ; [*0989.0020.0002.276E] # HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
+276F  ; [*098A.0020.0002.276F] # HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
+2770  ; [*098B.0020.0002.2770] # HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
+2771  ; [*098C.0020.0002.2771] # HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
+2772  ; [*098D.0020.0002.2772] # LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT
+2773  ; [*098E.0020.0002.2773] # LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT
+2774  ; [*098F.0020.0002.2774] # MEDIUM LEFT CURLY BRACKET ORNAMENT
+2775  ; [*0990.0020.0002.2775] # MEDIUM RIGHT CURLY BRACKET ORNAMENT
+2794  ; [*0991.0020.0002.2794] # HEAVY WIDE-HEADED RIGHTWARDS ARROW
+2798  ; [*0992.0020.0002.2798] # HEAVY SOUTH EAST ARROW
+2799  ; [*0993.0020.0002.2799] # HEAVY RIGHTWARDS ARROW
+279A  ; [*0994.0020.0002.279A] # HEAVY NORTH EAST ARROW
+279B  ; [*0995.0020.0002.279B] # DRAFTING POINT RIGHTWARDS ARROW
+279C  ; [*0996.0020.0002.279C] # HEAVY ROUND-TIPPED RIGHTWARDS ARROW
+279D  ; [*0997.0020.0002.279D] # TRIANGLE-HEADED RIGHTWARDS ARROW
+279E  ; [*0998.0020.0002.279E] # HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW
+279F  ; [*0999.0020.0002.279F] # DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
+27A0  ; [*099A.0020.0002.27A0] # HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW
+27A1  ; [*099B.0020.0002.27A1] # BLACK RIGHTWARDS ARROW
+27A2  ; [*099C.0020.0002.27A2] # THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD
+27A3  ; [*099D.0020.0002.27A3] # THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD
+27A4  ; [*099E.0020.0002.27A4] # BLACK RIGHTWARDS ARROWHEAD
+27A5  ; [*099F.0020.0002.27A5] # HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW
+27A6  ; [*09A0.0020.0002.27A6] # HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW
+27A7  ; [*09A1.0020.0002.27A7] # SQUAT BLACK RIGHTWARDS ARROW
+27A8  ; [*09A2.0020.0002.27A8] # HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW
+27A9  ; [*09A3.0020.0002.27A9] # RIGHT-SHADED WHITE RIGHTWARDS ARROW
+27AA  ; [*09A4.0020.0002.27AA] # LEFT-SHADED WHITE RIGHTWARDS ARROW
+27AB  ; [*09A5.0020.0002.27AB] # BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW
+27AC  ; [*09A6.0020.0002.27AC] # FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW
+27AD  ; [*09A7.0020.0002.27AD] # HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27AE  ; [*09A8.0020.0002.27AE] # HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27AF  ; [*09A9.0020.0002.27AF] # NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B1  ; [*09AA.0020.0002.27B1] # NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B2  ; [*09AB.0020.0002.27B2] # CIRCLED HEAVY WHITE RIGHTWARDS ARROW
+27B3  ; [*09AC.0020.0002.27B3] # WHITE-FEATHERED RIGHTWARDS ARROW
+27B4  ; [*09AD.0020.0002.27B4] # BLACK-FEATHERED SOUTH EAST ARROW
+27B5  ; [*09AE.0020.0002.27B5] # BLACK-FEATHERED RIGHTWARDS ARROW
+27B6  ; [*09AF.0020.0002.27B6] # BLACK-FEATHERED NORTH EAST ARROW
+27B7  ; [*09B0.0020.0002.27B7] # HEAVY BLACK-FEATHERED SOUTH EAST ARROW
+27B8  ; [*09B1.0020.0002.27B8] # HEAVY BLACK-FEATHERED RIGHTWARDS ARROW
+27B9  ; [*09B2.0020.0002.27B9] # HEAVY BLACK-FEATHERED NORTH EAST ARROW
+27BA  ; [*09B3.0020.0002.27BA] # TEARDROP-BARBED RIGHTWARDS ARROW
+27BB  ; [*09B4.0020.0002.27BB] # HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW
+27BC  ; [*09B5.0020.0002.27BC] # WEDGE-TAILED RIGHTWARDS ARROW
+27BD  ; [*09B6.0020.0002.27BD] # HEAVY WEDGE-TAILED RIGHTWARDS ARROW
+27BE  ; [*09B7.0020.0002.27BE] # OPEN-OUTLINED RIGHTWARDS ARROW
+27C0  ; [*09B8.0020.0002.27C0] # THREE DIMENSIONAL ANGLE
+27C1  ; [*09B9.0020.0002.27C1] # WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE
+27C2  ; [*09BA.0020.0002.27C2] # PERPENDICULAR
+27C3  ; [*09BB.0020.0002.27C3] # OPEN SUBSET
+27C4  ; [*09BC.0020.0002.27C4] # OPEN SUPERSET
+27C5  ; [*09BD.0020.0002.27C5] # LEFT S-SHAPED BAG DELIMITER
+27C6  ; [*09BE.0020.0002.27C6] # RIGHT S-SHAPED BAG DELIMITER
+27C7  ; [*09BF.0020.0002.27C7] # OR WITH DOT INSIDE
+27C8  ; [*09C0.0020.0002.27C8] # REVERSE SOLIDUS PRECEDING SUBSET
+27C9  ; [*09C1.0020.0002.27C9] # SUPERSET PRECEDING SOLIDUS
+27CA  ; [*09C2.0020.0002.27CA] # VERTICAL BAR WITH HORIZONTAL STROKE
+27CC  ; [*09C3.0020.0002.27CC] # LONG DIVISION
+27D0  ; [*09C4.0020.0002.27D0] # WHITE DIAMOND WITH CENTRED DOT
+27D1  ; [*09C5.0020.0002.27D1] # AND WITH DOT
+27D2  ; [*09C6.0020.0002.27D2] # ELEMENT OF OPENING UPWARDS
+27D3  ; [*09C7.0020.0002.27D3] # LOWER RIGHT CORNER WITH DOT
+27D4  ; [*09C8.0020.0002.27D4] # UPPER LEFT CORNER WITH DOT
+27D5  ; [*09C9.0020.0002.27D5] # LEFT OUTER JOIN
+27D6  ; [*09CA.0020.0002.27D6] # RIGHT OUTER JOIN
+27D7  ; [*09CB.0020.0002.27D7] # FULL OUTER JOIN
+27D8  ; [*09CC.0020.0002.27D8] # LARGE UP TACK
+27D9  ; [*09CD.0020.0002.27D9] # LARGE DOWN TACK
+27DA  ; [*09CE.0020.0002.27DA] # LEFT AND RIGHT DOUBLE TURNSTILE
+27DB  ; [*09CF.0020.0002.27DB] # LEFT AND RIGHT TACK
+27DC  ; [*09D0.0020.0002.27DC] # LEFT MULTIMAP
+27DD  ; [*09D1.0020.0002.27DD] # LONG RIGHT TACK
+27DE  ; [*09D2.0020.0002.27DE] # LONG LEFT TACK
+27DF  ; [*09D3.0020.0002.27DF] # UP TACK WITH CIRCLE ABOVE
+27E0  ; [*09D4.0020.0002.27E0] # LOZENGE DIVIDED BY HORIZONTAL RULE
+27E1  ; [*09D5.0020.0002.27E1] # WHITE CONCAVE-SIDED DIAMOND
+27E2  ; [*09D6.0020.0002.27E2] # WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK
+27E3  ; [*09D7.0020.0002.27E3] # WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK
+27E4  ; [*09D8.0020.0002.27E4] # WHITE SQUARE WITH LEFTWARDS TICK
+27E5  ; [*09D9.0020.0002.27E5] # WHITE SQUARE WITH RIGHTWARDS TICK
+27E6  ; [*09DA.0020.0002.27E6] # MATHEMATICAL LEFT WHITE SQUARE BRACKET
+27E7  ; [*09DB.0020.0002.27E7] # MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+27E8  ; [*09DC.0020.0002.27E8] # MATHEMATICAL LEFT ANGLE BRACKET
+27E9  ; [*09DD.0020.0002.27E9] # MATHEMATICAL RIGHT ANGLE BRACKET
+27EA  ; [*09DE.0020.0002.27EA] # MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
+27EB  ; [*09DF.0020.0002.27EB] # MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
+27EC  ; [*0325.0020.0002.27EC] # MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET
+27ED  ; [*0326.0020.0002.27ED] # MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET
+27EE  ; [*0327.0020.0002.27EE] # MATHEMATICAL LEFT FLATTENED PARENTHESIS
+27EF  ; [*0328.0020.0002.27EF] # MATHEMATICAL RIGHT FLATTENED PARENTHESIS
+27F0  ; [*09E0.0020.0002.27F0] # UPWARDS QUADRUPLE ARROW
+27F1  ; [*09E1.0020.0002.27F1] # DOWNWARDS QUADRUPLE ARROW
+27F2  ; [*09E2.0020.0002.27F2] # ANTICLOCKWISE GAPPED CIRCLE ARROW
+27F3  ; [*09E3.0020.0002.27F3] # CLOCKWISE GAPPED CIRCLE ARROW
+27F4  ; [*09E4.0020.0002.27F4] # RIGHT ARROW WITH CIRCLED PLUS
+27F5  ; [*09E5.0020.0002.27F5] # LONG LEFTWARDS ARROW
+27F6  ; [*09E6.0020.0002.27F6] # LONG RIGHTWARDS ARROW
+27F7  ; [*09E7.0020.0002.27F7] # LONG LEFT RIGHT ARROW
+27F8  ; [*09E8.0020.0002.27F8] # LONG LEFTWARDS DOUBLE ARROW
+27F9  ; [*09E9.0020.0002.27F9] # LONG RIGHTWARDS DOUBLE ARROW
+27FA  ; [*09EA.0020.0002.27FA] # LONG LEFT RIGHT DOUBLE ARROW
+27FB  ; [*09EB.0020.0002.27FB] # LONG LEFTWARDS ARROW FROM BAR
+27FC  ; [*09EC.0020.0002.27FC] # LONG RIGHTWARDS ARROW FROM BAR
+27FD  ; [*09ED.0020.0002.27FD] # LONG LEFTWARDS DOUBLE ARROW FROM BAR
+27FE  ; [*09EE.0020.0002.27FE] # LONG RIGHTWARDS DOUBLE ARROW FROM BAR
+27FF  ; [*09EF.0020.0002.27FF] # LONG RIGHTWARDS SQUIGGLE ARROW
+2800  ; [*0C30.0020.0002.2800] # BRAILLE PATTERN BLANK
+2801  ; [*0C31.0020.0002.2801] # BRAILLE PATTERN DOTS-1
+2802  ; [*0C32.0020.0002.2802] # BRAILLE PATTERN DOTS-2
+2803  ; [*0C33.0020.0002.2803] # BRAILLE PATTERN DOTS-12
+2804  ; [*0C34.0020.0002.2804] # BRAILLE PATTERN DOTS-3
+2805  ; [*0C35.0020.0002.2805] # BRAILLE PATTERN DOTS-13
+2806  ; [*0C36.0020.0002.2806] # BRAILLE PATTERN DOTS-23
+2807  ; [*0C37.0020.0002.2807] # BRAILLE PATTERN DOTS-123
+2808  ; [*0C38.0020.0002.2808] # BRAILLE PATTERN DOTS-4
+2809  ; [*0C39.0020.0002.2809] # BRAILLE PATTERN DOTS-14
+280A  ; [*0C3A.0020.0002.280A] # BRAILLE PATTERN DOTS-24
+280B  ; [*0C3B.0020.0002.280B] # BRAILLE PATTERN DOTS-124
+280C  ; [*0C3C.0020.0002.280C] # BRAILLE PATTERN DOTS-34
+280D  ; [*0C3D.0020.0002.280D] # BRAILLE PATTERN DOTS-134
+280E  ; [*0C3E.0020.0002.280E] # BRAILLE PATTERN DOTS-234
+280F  ; [*0C3F.0020.0002.280F] # BRAILLE PATTERN DOTS-1234
+2810  ; [*0C40.0020.0002.2810] # BRAILLE PATTERN DOTS-5
+2811  ; [*0C41.0020.0002.2811] # BRAILLE PATTERN DOTS-15
+2812  ; [*0C42.0020.0002.2812] # BRAILLE PATTERN DOTS-25
+2813  ; [*0C43.0020.0002.2813] # BRAILLE PATTERN DOTS-125
+2814  ; [*0C44.0020.0002.2814] # BRAILLE PATTERN DOTS-35
+2815  ; [*0C45.0020.0002.2815] # BRAILLE PATTERN DOTS-135
+2816  ; [*0C46.0020.0002.2816] # BRAILLE PATTERN DOTS-235
+2817  ; [*0C47.0020.0002.2817] # BRAILLE PATTERN DOTS-1235
+2818  ; [*0C48.0020.0002.2818] # BRAILLE PATTERN DOTS-45
+2819  ; [*0C49.0020.0002.2819] # BRAILLE PATTERN DOTS-145
+281A  ; [*0C4A.0020.0002.281A] # BRAILLE PATTERN DOTS-245
+281B  ; [*0C4B.0020.0002.281B] # BRAILLE PATTERN DOTS-1245
+281C  ; [*0C4C.0020.0002.281C] # BRAILLE PATTERN DOTS-345
+281D  ; [*0C4D.0020.0002.281D] # BRAILLE PATTERN DOTS-1345
+281E  ; [*0C4E.0020.0002.281E] # BRAILLE PATTERN DOTS-2345
+281F  ; [*0C4F.0020.0002.281F] # BRAILLE PATTERN DOTS-12345
+2820  ; [*0C50.0020.0002.2820] # BRAILLE PATTERN DOTS-6
+2821  ; [*0C51.0020.0002.2821] # BRAILLE PATTERN DOTS-16
+2822  ; [*0C52.0020.0002.2822] # BRAILLE PATTERN DOTS-26
+2823  ; [*0C53.0020.0002.2823] # BRAILLE PATTERN DOTS-126
+2824  ; [*0C54.0020.0002.2824] # BRAILLE PATTERN DOTS-36
+2825  ; [*0C55.0020.0002.2825] # BRAILLE PATTERN DOTS-136
+2826  ; [*0C56.0020.0002.2826] # BRAILLE PATTERN DOTS-236
+2827  ; [*0C57.0020.0002.2827] # BRAILLE PATTERN DOTS-1236
+2828  ; [*0C58.0020.0002.2828] # BRAILLE PATTERN DOTS-46
+2829  ; [*0C59.0020.0002.2829] # BRAILLE PATTERN DOTS-146
+282A  ; [*0C5A.0020.0002.282A] # BRAILLE PATTERN DOTS-246
+282B  ; [*0C5B.0020.0002.282B] # BRAILLE PATTERN DOTS-1246
+282C  ; [*0C5C.0020.0002.282C] # BRAILLE PATTERN DOTS-346
+282D  ; [*0C5D.0020.0002.282D] # BRAILLE PATTERN DOTS-1346
+282E  ; [*0C5E.0020.0002.282E] # BRAILLE PATTERN DOTS-2346
+282F  ; [*0C5F.0020.0002.282F] # BRAILLE PATTERN DOTS-12346
+2830  ; [*0C60.0020.0002.2830] # BRAILLE PATTERN DOTS-56
+2831  ; [*0C61.0020.0002.2831] # BRAILLE PATTERN DOTS-156
+2832  ; [*0C62.0020.0002.2832] # BRAILLE PATTERN DOTS-256
+2833  ; [*0C63.0020.0002.2833] # BRAILLE PATTERN DOTS-1256
+2834  ; [*0C64.0020.0002.2834] # BRAILLE PATTERN DOTS-356
+2835  ; [*0C65.0020.0002.2835] # BRAILLE PATTERN DOTS-1356
+2836  ; [*0C66.0020.0002.2836] # BRAILLE PATTERN DOTS-2356
+2837  ; [*0C67.0020.0002.2837] # BRAILLE PATTERN DOTS-12356
+2838  ; [*0C68.0020.0002.2838] # BRAILLE PATTERN DOTS-456
+2839  ; [*0C69.0020.0002.2839] # BRAILLE PATTERN DOTS-1456
+283A  ; [*0C6A.0020.0002.283A] # BRAILLE PATTERN DOTS-2456
+283B  ; [*0C6B.0020.0002.283B] # BRAILLE PATTERN DOTS-12456
+283C  ; [*0C6C.0020.0002.283C] # BRAILLE PATTERN DOTS-3456
+283D  ; [*0C6D.0020.0002.283D] # BRAILLE PATTERN DOTS-13456
+283E  ; [*0C6E.0020.0002.283E] # BRAILLE PATTERN DOTS-23456
+283F  ; [*0C6F.0020.0002.283F] # BRAILLE PATTERN DOTS-123456
+2840  ; [*0C70.0020.0002.2840] # BRAILLE PATTERN DOTS-7
+2841  ; [*0C71.0020.0002.2841] # BRAILLE PATTERN DOTS-17
+2842  ; [*0C72.0020.0002.2842] # BRAILLE PATTERN DOTS-27
+2843  ; [*0C73.0020.0002.2843] # BRAILLE PATTERN DOTS-127
+2844  ; [*0C74.0020.0002.2844] # BRAILLE PATTERN DOTS-37
+2845  ; [*0C75.0020.0002.2845] # BRAILLE PATTERN DOTS-137
+2846  ; [*0C76.0020.0002.2846] # BRAILLE PATTERN DOTS-237
+2847  ; [*0C77.0020.0002.2847] # BRAILLE PATTERN DOTS-1237
+2848  ; [*0C78.0020.0002.2848] # BRAILLE PATTERN DOTS-47
+2849  ; [*0C79.0020.0002.2849] # BRAILLE PATTERN DOTS-147
+284A  ; [*0C7A.0020.0002.284A] # BRAILLE PATTERN DOTS-247
+284B  ; [*0C7B.0020.0002.284B] # BRAILLE PATTERN DOTS-1247
+284C  ; [*0C7C.0020.0002.284C] # BRAILLE PATTERN DOTS-347
+284D  ; [*0C7D.0020.0002.284D] # BRAILLE PATTERN DOTS-1347
+284E  ; [*0C7E.0020.0002.284E] # BRAILLE PATTERN DOTS-2347
+284F  ; [*0C7F.0020.0002.284F] # BRAILLE PATTERN DOTS-12347
+2850  ; [*0C80.0020.0002.2850] # BRAILLE PATTERN DOTS-57
+2851  ; [*0C81.0020.0002.2851] # BRAILLE PATTERN DOTS-157
+2852  ; [*0C82.0020.0002.2852] # BRAILLE PATTERN DOTS-257
+2853  ; [*0C83.0020.0002.2853] # BRAILLE PATTERN DOTS-1257
+2854  ; [*0C84.0020.0002.2854] # BRAILLE PATTERN DOTS-357
+2855  ; [*0C85.0020.0002.2855] # BRAILLE PATTERN DOTS-1357
+2856  ; [*0C86.0020.0002.2856] # BRAILLE PATTERN DOTS-2357
+2857  ; [*0C87.0020.0002.2857] # BRAILLE PATTERN DOTS-12357
+2858  ; [*0C88.0020.0002.2858] # BRAILLE PATTERN DOTS-457
+2859  ; [*0C89.0020.0002.2859] # BRAILLE PATTERN DOTS-1457
+285A  ; [*0C8A.0020.0002.285A] # BRAILLE PATTERN DOTS-2457
+285B  ; [*0C8B.0020.0002.285B] # BRAILLE PATTERN DOTS-12457
+285C  ; [*0C8C.0020.0002.285C] # BRAILLE PATTERN DOTS-3457
+285D  ; [*0C8D.0020.0002.285D] # BRAILLE PATTERN DOTS-13457
+285E  ; [*0C8E.0020.0002.285E] # BRAILLE PATTERN DOTS-23457
+285F  ; [*0C8F.0020.0002.285F] # BRAILLE PATTERN DOTS-123457
+2860  ; [*0C90.0020.0002.2860] # BRAILLE PATTERN DOTS-67
+2861  ; [*0C91.0020.0002.2861] # BRAILLE PATTERN DOTS-167
+2862  ; [*0C92.0020.0002.2862] # BRAILLE PATTERN DOTS-267
+2863  ; [*0C93.0020.0002.2863] # BRAILLE PATTERN DOTS-1267
+2864  ; [*0C94.0020.0002.2864] # BRAILLE PATTERN DOTS-367
+2865  ; [*0C95.0020.0002.2865] # BRAILLE PATTERN DOTS-1367
+2866  ; [*0C96.0020.0002.2866] # BRAILLE PATTERN DOTS-2367
+2867  ; [*0C97.0020.0002.2867] # BRAILLE PATTERN DOTS-12367
+2868  ; [*0C98.0020.0002.2868] # BRAILLE PATTERN DOTS-467
+2869  ; [*0C99.0020.0002.2869] # BRAILLE PATTERN DOTS-1467
+286A  ; [*0C9A.0020.0002.286A] # BRAILLE PATTERN DOTS-2467
+286B  ; [*0C9B.0020.0002.286B] # BRAILLE PATTERN DOTS-12467
+286C  ; [*0C9C.0020.0002.286C] # BRAILLE PATTERN DOTS-3467
+286D  ; [*0C9D.0020.0002.286D] # BRAILLE PATTERN DOTS-13467
+286E  ; [*0C9E.0020.0002.286E] # BRAILLE PATTERN DOTS-23467
+286F  ; [*0C9F.0020.0002.286F] # BRAILLE PATTERN DOTS-123467
+2870  ; [*0CA0.0020.0002.2870] # BRAILLE PATTERN DOTS-567
+2871  ; [*0CA1.0020.0002.2871] # BRAILLE PATTERN DOTS-1567
+2872  ; [*0CA2.0020.0002.2872] # BRAILLE PATTERN DOTS-2567
+2873  ; [*0CA3.0020.0002.2873] # BRAILLE PATTERN DOTS-12567
+2874  ; [*0CA4.0020.0002.2874] # BRAILLE PATTERN DOTS-3567
+2875  ; [*0CA5.0020.0002.2875] # BRAILLE PATTERN DOTS-13567
+2876  ; [*0CA6.0020.0002.2876] # BRAILLE PATTERN DOTS-23567
+2877  ; [*0CA7.0020.0002.2877] # BRAILLE PATTERN DOTS-123567
+2878  ; [*0CA8.0020.0002.2878] # BRAILLE PATTERN DOTS-4567
+2879  ; [*0CA9.0020.0002.2879] # BRAILLE PATTERN DOTS-14567
+287A  ; [*0CAA.0020.0002.287A] # BRAILLE PATTERN DOTS-24567
+287B  ; [*0CAB.0020.0002.287B] # BRAILLE PATTERN DOTS-124567
+287C  ; [*0CAC.0020.0002.287C] # BRAILLE PATTERN DOTS-34567
+287D  ; [*0CAD.0020.0002.287D] # BRAILLE PATTERN DOTS-134567
+287E  ; [*0CAE.0020.0002.287E] # BRAILLE PATTERN DOTS-234567
+287F  ; [*0CAF.0020.0002.287F] # BRAILLE PATTERN DOTS-1234567
+2880  ; [*0CB0.0020.0002.2880] # BRAILLE PATTERN DOTS-8
+2881  ; [*0CB1.0020.0002.2881] # BRAILLE PATTERN DOTS-18
+2882  ; [*0CB2.0020.0002.2882] # BRAILLE PATTERN DOTS-28
+2883  ; [*0CB3.0020.0002.2883] # BRAILLE PATTERN DOTS-128
+2884  ; [*0CB4.0020.0002.2884] # BRAILLE PATTERN DOTS-38
+2885  ; [*0CB5.0020.0002.2885] # BRAILLE PATTERN DOTS-138
+2886  ; [*0CB6.0020.0002.2886] # BRAILLE PATTERN DOTS-238
+2887  ; [*0CB7.0020.0002.2887] # BRAILLE PATTERN DOTS-1238
+2888  ; [*0CB8.0020.0002.2888] # BRAILLE PATTERN DOTS-48
+2889  ; [*0CB9.0020.0002.2889] # BRAILLE PATTERN DOTS-148
+288A  ; [*0CBA.0020.0002.288A] # BRAILLE PATTERN DOTS-248
+288B  ; [*0CBB.0020.0002.288B] # BRAILLE PATTERN DOTS-1248
+288C  ; [*0CBC.0020.0002.288C] # BRAILLE PATTERN DOTS-348
+288D  ; [*0CBD.0020.0002.288D] # BRAILLE PATTERN DOTS-1348
+288E  ; [*0CBE.0020.0002.288E] # BRAILLE PATTERN DOTS-2348
+288F  ; [*0CBF.0020.0002.288F] # BRAILLE PATTERN DOTS-12348
+2890  ; [*0CC0.0020.0002.2890] # BRAILLE PATTERN DOTS-58
+2891  ; [*0CC1.0020.0002.2891] # BRAILLE PATTERN DOTS-158
+2892  ; [*0CC2.0020.0002.2892] # BRAILLE PATTERN DOTS-258
+2893  ; [*0CC3.0020.0002.2893] # BRAILLE PATTERN DOTS-1258
+2894  ; [*0CC4.0020.0002.2894] # BRAILLE PATTERN DOTS-358
+2895  ; [*0CC5.0020.0002.2895] # BRAILLE PATTERN DOTS-1358
+2896  ; [*0CC6.0020.0002.2896] # BRAILLE PATTERN DOTS-2358
+2897  ; [*0CC7.0020.0002.2897] # BRAILLE PATTERN DOTS-12358
+2898  ; [*0CC8.0020.0002.2898] # BRAILLE PATTERN DOTS-458
+2899  ; [*0CC9.0020.0002.2899] # BRAILLE PATTERN DOTS-1458
+289A  ; [*0CCA.0020.0002.289A] # BRAILLE PATTERN DOTS-2458
+289B  ; [*0CCB.0020.0002.289B] # BRAILLE PATTERN DOTS-12458
+289C  ; [*0CCC.0020.0002.289C] # BRAILLE PATTERN DOTS-3458
+289D  ; [*0CCD.0020.0002.289D] # BRAILLE PATTERN DOTS-13458
+289E  ; [*0CCE.0020.0002.289E] # BRAILLE PATTERN DOTS-23458
+289F  ; [*0CCF.0020.0002.289F] # BRAILLE PATTERN DOTS-123458
+28A0  ; [*0CD0.0020.0002.28A0] # BRAILLE PATTERN DOTS-68
+28A1  ; [*0CD1.0020.0002.28A1] # BRAILLE PATTERN DOTS-168
+28A2  ; [*0CD2.0020.0002.28A2] # BRAILLE PATTERN DOTS-268
+28A3  ; [*0CD3.0020.0002.28A3] # BRAILLE PATTERN DOTS-1268
+28A4  ; [*0CD4.0020.0002.28A4] # BRAILLE PATTERN DOTS-368
+28A5  ; [*0CD5.0020.0002.28A5] # BRAILLE PATTERN DOTS-1368
+28A6  ; [*0CD6.0020.0002.28A6] # BRAILLE PATTERN DOTS-2368
+28A7  ; [*0CD7.0020.0002.28A7] # BRAILLE PATTERN DOTS-12368
+28A8  ; [*0CD8.0020.0002.28A8] # BRAILLE PATTERN DOTS-468
+28A9  ; [*0CD9.0020.0002.28A9] # BRAILLE PATTERN DOTS-1468
+28AA  ; [*0CDA.0020.0002.28AA] # BRAILLE PATTERN DOTS-2468
+28AB  ; [*0CDB.0020.0002.28AB] # BRAILLE PATTERN DOTS-12468
+28AC  ; [*0CDC.0020.0002.28AC] # BRAILLE PATTERN DOTS-3468
+28AD  ; [*0CDD.0020.0002.28AD] # BRAILLE PATTERN DOTS-13468
+28AE  ; [*0CDE.0020.0002.28AE] # BRAILLE PATTERN DOTS-23468
+28AF  ; [*0CDF.0020.0002.28AF] # BRAILLE PATTERN DOTS-123468
+28B0  ; [*0CE0.0020.0002.28B0] # BRAILLE PATTERN DOTS-568
+28B1  ; [*0CE1.0020.0002.28B1] # BRAILLE PATTERN DOTS-1568
+28B2  ; [*0CE2.0020.0002.28B2] # BRAILLE PATTERN DOTS-2568
+28B3  ; [*0CE3.0020.0002.28B3] # BRAILLE PATTERN DOTS-12568
+28B4  ; [*0CE4.0020.0002.28B4] # BRAILLE PATTERN DOTS-3568
+28B5  ; [*0CE5.0020.0002.28B5] # BRAILLE PATTERN DOTS-13568
+28B6  ; [*0CE6.0020.0002.28B6] # BRAILLE PATTERN DOTS-23568
+28B7  ; [*0CE7.0020.0002.28B7] # BRAILLE PATTERN DOTS-123568
+28B8  ; [*0CE8.0020.0002.28B8] # BRAILLE PATTERN DOTS-4568
+28B9  ; [*0CE9.0020.0002.28B9] # BRAILLE PATTERN DOTS-14568
+28BA  ; [*0CEA.0020.0002.28BA] # BRAILLE PATTERN DOTS-24568
+28BB  ; [*0CEB.0020.0002.28BB] # BRAILLE PATTERN DOTS-124568
+28BC  ; [*0CEC.0020.0002.28BC] # BRAILLE PATTERN DOTS-34568
+28BD  ; [*0CED.0020.0002.28BD] # BRAILLE PATTERN DOTS-134568
+28BE  ; [*0CEE.0020.0002.28BE] # BRAILLE PATTERN DOTS-234568
+28BF  ; [*0CEF.0020.0002.28BF] # BRAILLE PATTERN DOTS-1234568
+28C0  ; [*0CF0.0020.0002.28C0] # BRAILLE PATTERN DOTS-78
+28C1  ; [*0CF1.0020.0002.28C1] # BRAILLE PATTERN DOTS-178
+28C2  ; [*0CF2.0020.0002.28C2] # BRAILLE PATTERN DOTS-278
+28C3  ; [*0CF3.0020.0002.28C3] # BRAILLE PATTERN DOTS-1278
+28C4  ; [*0CF4.0020.0002.28C4] # BRAILLE PATTERN DOTS-378
+28C5  ; [*0CF5.0020.0002.28C5] # BRAILLE PATTERN DOTS-1378
+28C6  ; [*0CF6.0020.0002.28C6] # BRAILLE PATTERN DOTS-2378
+28C7  ; [*0CF7.0020.0002.28C7] # BRAILLE PATTERN DOTS-12378
+28C8  ; [*0CF8.0020.0002.28C8] # BRAILLE PATTERN DOTS-478
+28C9  ; [*0CF9.0020.0002.28C9] # BRAILLE PATTERN DOTS-1478
+28CA  ; [*0CFA.0020.0002.28CA] # BRAILLE PATTERN DOTS-2478
+28CB  ; [*0CFB.0020.0002.28CB] # BRAILLE PATTERN DOTS-12478
+28CC  ; [*0CFC.0020.0002.28CC] # BRAILLE PATTERN DOTS-3478
+28CD  ; [*0CFD.0020.0002.28CD] # BRAILLE PATTERN DOTS-13478
+28CE  ; [*0CFE.0020.0002.28CE] # BRAILLE PATTERN DOTS-23478
+28CF  ; [*0CFF.0020.0002.28CF] # BRAILLE PATTERN DOTS-123478
+28D0  ; [*0D00.0020.0002.28D0] # BRAILLE PATTERN DOTS-578
+28D1  ; [*0D01.0020.0002.28D1] # BRAILLE PATTERN DOTS-1578
+28D2  ; [*0D02.0020.0002.28D2] # BRAILLE PATTERN DOTS-2578
+28D3  ; [*0D03.0020.0002.28D3] # BRAILLE PATTERN DOTS-12578
+28D4  ; [*0D04.0020.0002.28D4] # BRAILLE PATTERN DOTS-3578
+28D5  ; [*0D05.0020.0002.28D5] # BRAILLE PATTERN DOTS-13578
+28D6  ; [*0D06.0020.0002.28D6] # BRAILLE PATTERN DOTS-23578
+28D7  ; [*0D07.0020.0002.28D7] # BRAILLE PATTERN DOTS-123578
+28D8  ; [*0D08.0020.0002.28D8] # BRAILLE PATTERN DOTS-4578
+28D9  ; [*0D09.0020.0002.28D9] # BRAILLE PATTERN DOTS-14578
+28DA  ; [*0D0A.0020.0002.28DA] # BRAILLE PATTERN DOTS-24578
+28DB  ; [*0D0B.0020.0002.28DB] # BRAILLE PATTERN DOTS-124578
+28DC  ; [*0D0C.0020.0002.28DC] # BRAILLE PATTERN DOTS-34578
+28DD  ; [*0D0D.0020.0002.28DD] # BRAILLE PATTERN DOTS-134578
+28DE  ; [*0D0E.0020.0002.28DE] # BRAILLE PATTERN DOTS-234578
+28DF  ; [*0D0F.0020.0002.28DF] # BRAILLE PATTERN DOTS-1234578
+28E0  ; [*0D10.0020.0002.28E0] # BRAILLE PATTERN DOTS-678
+28E1  ; [*0D11.0020.0002.28E1] # BRAILLE PATTERN DOTS-1678
+28E2  ; [*0D12.0020.0002.28E2] # BRAILLE PATTERN DOTS-2678
+28E3  ; [*0D13.0020.0002.28E3] # BRAILLE PATTERN DOTS-12678
+28E4  ; [*0D14.0020.0002.28E4] # BRAILLE PATTERN DOTS-3678
+28E5  ; [*0D15.0020.0002.28E5] # BRAILLE PATTERN DOTS-13678
+28E6  ; [*0D16.0020.0002.28E6] # BRAILLE PATTERN DOTS-23678
+28E7  ; [*0D17.0020.0002.28E7] # BRAILLE PATTERN DOTS-123678
+28E8  ; [*0D18.0020.0002.28E8] # BRAILLE PATTERN DOTS-4678
+28E9  ; [*0D19.0020.0002.28E9] # BRAILLE PATTERN DOTS-14678
+28EA  ; [*0D1A.0020.0002.28EA] # BRAILLE PATTERN DOTS-24678
+28EB  ; [*0D1B.0020.0002.28EB] # BRAILLE PATTERN DOTS-124678
+28EC  ; [*0D1C.0020.0002.28EC] # BRAILLE PATTERN DOTS-34678
+28ED  ; [*0D1D.0020.0002.28ED] # BRAILLE PATTERN DOTS-134678
+28EE  ; [*0D1E.0020.0002.28EE] # BRAILLE PATTERN DOTS-234678
+28EF  ; [*0D1F.0020.0002.28EF] # BRAILLE PATTERN DOTS-1234678
+28F0  ; [*0D20.0020.0002.28F0] # BRAILLE PATTERN DOTS-5678
+28F1  ; [*0D21.0020.0002.28F1] # BRAILLE PATTERN DOTS-15678
+28F2  ; [*0D22.0020.0002.28F2] # BRAILLE PATTERN DOTS-25678
+28F3  ; [*0D23.0020.0002.28F3] # BRAILLE PATTERN DOTS-125678
+28F4  ; [*0D24.0020.0002.28F4] # BRAILLE PATTERN DOTS-35678
+28F5  ; [*0D25.0020.0002.28F5] # BRAILLE PATTERN DOTS-135678
+28F6  ; [*0D26.0020.0002.28F6] # BRAILLE PATTERN DOTS-235678
+28F7  ; [*0D27.0020.0002.28F7] # BRAILLE PATTERN DOTS-1235678
+28F8  ; [*0D28.0020.0002.28F8] # BRAILLE PATTERN DOTS-45678
+28F9  ; [*0D29.0020.0002.28F9] # BRAILLE PATTERN DOTS-145678
+28FA  ; [*0D2A.0020.0002.28FA] # BRAILLE PATTERN DOTS-245678
+28FB  ; [*0D2B.0020.0002.28FB] # BRAILLE PATTERN DOTS-1245678
+28FC  ; [*0D2C.0020.0002.28FC] # BRAILLE PATTERN DOTS-345678
+28FD  ; [*0D2D.0020.0002.28FD] # BRAILLE PATTERN DOTS-1345678
+28FE  ; [*0D2E.0020.0002.28FE] # BRAILLE PATTERN DOTS-2345678
+28FF  ; [*0D2F.0020.0002.28FF] # BRAILLE PATTERN DOTS-12345678
+2900  ; [*09F0.0020.0002.2900] # RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE
+2901  ; [*09F1.0020.0002.2901] # RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE
+2902  ; [*09F2.0020.0002.2902] # LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE
+2903  ; [*09F3.0020.0002.2903] # RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE
+2904  ; [*09F4.0020.0002.2904] # LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE
+2905  ; [*09F5.0020.0002.2905] # RIGHTWARDS TWO-HEADED ARROW FROM BAR
+2906  ; [*09F6.0020.0002.2906] # LEFTWARDS DOUBLE ARROW FROM BAR
+2907  ; [*09F7.0020.0002.2907] # RIGHTWARDS DOUBLE ARROW FROM BAR
+2908  ; [*09F8.0020.0002.2908] # DOWNWARDS ARROW WITH HORIZONTAL STROKE
+2909  ; [*09F9.0020.0002.2909] # UPWARDS ARROW WITH HORIZONTAL STROKE
+290A  ; [*09FA.0020.0002.290A] # UPWARDS TRIPLE ARROW
+290B  ; [*09FB.0020.0002.290B] # DOWNWARDS TRIPLE ARROW
+290C  ; [*09FC.0020.0002.290C] # LEFTWARDS DOUBLE DASH ARROW
+290D  ; [*09FD.0020.0002.290D] # RIGHTWARDS DOUBLE DASH ARROW
+290E  ; [*09FE.0020.0002.290E] # LEFTWARDS TRIPLE DASH ARROW
+290F  ; [*09FF.0020.0002.290F] # RIGHTWARDS TRIPLE DASH ARROW
+2910  ; [*0A00.0020.0002.2910] # RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW
+2911  ; [*0A01.0020.0002.2911] # RIGHTWARDS ARROW WITH DOTTED STEM
+2912  ; [*0A02.0020.0002.2912] # UPWARDS ARROW TO BAR
+2913  ; [*0A03.0020.0002.2913] # DOWNWARDS ARROW TO BAR
+2914  ; [*0A04.0020.0002.2914] # RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE
+2915  ; [*0A05.0020.0002.2915] # RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
+2916  ; [*0A06.0020.0002.2916] # RIGHTWARDS TWO-HEADED ARROW WITH TAIL
+2917  ; [*0A07.0020.0002.2917] # RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE
+2918  ; [*0A08.0020.0002.2918] # RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
+2919  ; [*0A09.0020.0002.2919] # LEFTWARDS ARROW-TAIL
+291A  ; [*0A0A.0020.0002.291A] # RIGHTWARDS ARROW-TAIL
+291B  ; [*0A0B.0020.0002.291B] # LEFTWARDS DOUBLE ARROW-TAIL
+291C  ; [*0A0C.0020.0002.291C] # RIGHTWARDS DOUBLE ARROW-TAIL
+291D  ; [*0A0D.0020.0002.291D] # LEFTWARDS ARROW TO BLACK DIAMOND
+291E  ; [*0A0E.0020.0002.291E] # RIGHTWARDS ARROW TO BLACK DIAMOND
+291F  ; [*0A0F.0020.0002.291F] # LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND
+2920  ; [*0A10.0020.0002.2920] # RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND
+2921  ; [*0A11.0020.0002.2921] # NORTH WEST AND SOUTH EAST ARROW
+2922  ; [*0A12.0020.0002.2922] # NORTH EAST AND SOUTH WEST ARROW
+2923  ; [*0A13.0020.0002.2923] # NORTH WEST ARROW WITH HOOK
+2924  ; [*0A14.0020.0002.2924] # NORTH EAST ARROW WITH HOOK
+2925  ; [*0A15.0020.0002.2925] # SOUTH EAST ARROW WITH HOOK
+2926  ; [*0A16.0020.0002.2926] # SOUTH WEST ARROW WITH HOOK
+2927  ; [*0A17.0020.0002.2927] # NORTH WEST ARROW AND NORTH EAST ARROW
+2928  ; [*0A18.0020.0002.2928] # NORTH EAST ARROW AND SOUTH EAST ARROW
+2929  ; [*0A19.0020.0002.2929] # SOUTH EAST ARROW AND SOUTH WEST ARROW
+292A  ; [*0A1A.0020.0002.292A] # SOUTH WEST ARROW AND NORTH WEST ARROW
+292B  ; [*0A1B.0020.0002.292B] # RISING DIAGONAL CROSSING FALLING DIAGONAL
+292C  ; [*0A1C.0020.0002.292C] # FALLING DIAGONAL CROSSING RISING DIAGONAL
+292D  ; [*0A1D.0020.0002.292D] # SOUTH EAST ARROW CROSSING NORTH EAST ARROW
+292E  ; [*0A1E.0020.0002.292E] # NORTH EAST ARROW CROSSING SOUTH EAST ARROW
+292F  ; [*0A1F.0020.0002.292F] # FALLING DIAGONAL CROSSING NORTH EAST ARROW
+2930  ; [*0A20.0020.0002.2930] # RISING DIAGONAL CROSSING SOUTH EAST ARROW
+2931  ; [*0A21.0020.0002.2931] # NORTH EAST ARROW CROSSING NORTH WEST ARROW
+2932  ; [*0A22.0020.0002.2932] # NORTH WEST ARROW CROSSING NORTH EAST ARROW
+2933  ; [*0A23.0020.0002.2933] # WAVE ARROW POINTING DIRECTLY RIGHT
+2934  ; [*0A24.0020.0002.2934] # ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS
+2935  ; [*0A25.0020.0002.2935] # ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS
+2936  ; [*0A26.0020.0002.2936] # ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS
+2937  ; [*0A27.0020.0002.2937] # ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS
+2938  ; [*0A28.0020.0002.2938] # RIGHT-SIDE ARC CLOCKWISE ARROW
+2939  ; [*0A29.0020.0002.2939] # LEFT-SIDE ARC ANTICLOCKWISE ARROW
+293A  ; [*0A2A.0020.0002.293A] # TOP ARC ANTICLOCKWISE ARROW
+293B  ; [*0A2B.0020.0002.293B] # BOTTOM ARC ANTICLOCKWISE ARROW
+293C  ; [*0A2C.0020.0002.293C] # TOP ARC CLOCKWISE ARROW WITH MINUS
+293D  ; [*0A2D.0020.0002.293D] # TOP ARC ANTICLOCKWISE ARROW WITH PLUS
+293E  ; [*0A2E.0020.0002.293E] # LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW
+293F  ; [*0A2F.0020.0002.293F] # LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW
+2940  ; [*0A30.0020.0002.2940] # ANTICLOCKWISE CLOSED CIRCLE ARROW
+2941  ; [*0A31.0020.0002.2941] # CLOCKWISE CLOSED CIRCLE ARROW
+2942  ; [*0A32.0020.0002.2942] # RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW
+2943  ; [*0A33.0020.0002.2943] # LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW
+2944  ; [*0A34.0020.0002.2944] # SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW
+2945  ; [*0A35.0020.0002.2945] # RIGHTWARDS ARROW WITH PLUS BELOW
+2946  ; [*0A36.0020.0002.2946] # LEFTWARDS ARROW WITH PLUS BELOW
+2947  ; [*0A37.0020.0002.2947] # RIGHTWARDS ARROW THROUGH X
+2948  ; [*0A38.0020.0002.2948] # LEFT RIGHT ARROW THROUGH SMALL CIRCLE
+2949  ; [*0A39.0020.0002.2949] # UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE
+294A  ; [*0A3A.0020.0002.294A] # LEFT BARB UP RIGHT BARB DOWN HARPOON
+294B  ; [*0A3B.0020.0002.294B] # LEFT BARB DOWN RIGHT BARB UP HARPOON
+294C  ; [*0A3C.0020.0002.294C] # UP BARB RIGHT DOWN BARB LEFT HARPOON
+294D  ; [*0A3D.0020.0002.294D] # UP BARB LEFT DOWN BARB RIGHT HARPOON
+294E  ; [*0A3E.0020.0002.294E] # LEFT BARB UP RIGHT BARB UP HARPOON
+294F  ; [*0A3F.0020.0002.294F] # UP BARB RIGHT DOWN BARB RIGHT HARPOON
+2950  ; [*0A40.0020.0002.2950] # LEFT BARB DOWN RIGHT BARB DOWN HARPOON
+2951  ; [*0A41.0020.0002.2951] # UP BARB LEFT DOWN BARB LEFT HARPOON
+2952  ; [*0A42.0020.0002.2952] # LEFTWARDS HARPOON WITH BARB UP TO BAR
+2953  ; [*0A43.0020.0002.2953] # RIGHTWARDS HARPOON WITH BARB UP TO BAR
+2954  ; [*0A44.0020.0002.2954] # UPWARDS HARPOON WITH BARB RIGHT TO BAR
+2955  ; [*0A45.0020.0002.2955] # DOWNWARDS HARPOON WITH BARB RIGHT TO BAR
+2956  ; [*0A46.0020.0002.2956] # LEFTWARDS HARPOON WITH BARB DOWN TO BAR
+2957  ; [*0A47.0020.0002.2957] # RIGHTWARDS HARPOON WITH BARB DOWN TO BAR
+2958  ; [*0A48.0020.0002.2958] # UPWARDS HARPOON WITH BARB LEFT TO BAR
+2959  ; [*0A49.0020.0002.2959] # DOWNWARDS HARPOON WITH BARB LEFT TO BAR
+295A  ; [*0A4A.0020.0002.295A] # LEFTWARDS HARPOON WITH BARB UP FROM BAR
+295B  ; [*0A4B.0020.0002.295B] # RIGHTWARDS HARPOON WITH BARB UP FROM BAR
+295C  ; [*0A4C.0020.0002.295C] # UPWARDS HARPOON WITH BARB RIGHT FROM BAR
+295D  ; [*0A4D.0020.0002.295D] # DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR
+295E  ; [*0A4E.0020.0002.295E] # LEFTWARDS HARPOON WITH BARB DOWN FROM BAR
+295F  ; [*0A4F.0020.0002.295F] # RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR
+2960  ; [*0A50.0020.0002.2960] # UPWARDS HARPOON WITH BARB LEFT FROM BAR
+2961  ; [*0A51.0020.0002.2961] # DOWNWARDS HARPOON WITH BARB LEFT FROM BAR
+2962  ; [*0A52.0020.0002.2962] # LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+2963  ; [*0A53.0020.0002.2963] # UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+2964  ; [*0A54.0020.0002.2964] # RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+2965  ; [*0A55.0020.0002.2965] # DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+2966  ; [*0A56.0020.0002.2966] # LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP
+2967  ; [*0A57.0020.0002.2967] # LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
+2968  ; [*0A58.0020.0002.2968] # RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP
+2969  ; [*0A59.0020.0002.2969] # RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN
+296A  ; [*0A5A.0020.0002.296A] # LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+296B  ; [*0A5B.0020.0002.296B] # LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+296C  ; [*0A5C.0020.0002.296C] # RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
+296D  ; [*0A5D.0020.0002.296D] # RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
+296E  ; [*0A5E.0020.0002.296E] # UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
+296F  ; [*0A5F.0020.0002.296F] # DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
+2970  ; [*0A60.0020.0002.2970] # RIGHT DOUBLE ARROW WITH ROUNDED HEAD
+2971  ; [*0A61.0020.0002.2971] # EQUALS SIGN ABOVE RIGHTWARDS ARROW
+2972  ; [*0A62.0020.0002.2972] # TILDE OPERATOR ABOVE RIGHTWARDS ARROW
+2973  ; [*0A63.0020.0002.2973] # LEFTWARDS ARROW ABOVE TILDE OPERATOR
+2974  ; [*0A64.0020.0002.2974] # RIGHTWARDS ARROW ABOVE TILDE OPERATOR
+2975  ; [*0A65.0020.0002.2975] # RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO
+2976  ; [*0A66.0020.0002.2976] # LESS-THAN ABOVE LEFTWARDS ARROW
+2977  ; [*0A67.0020.0002.2977] # LEFTWARDS ARROW THROUGH LESS-THAN
+2978  ; [*0A68.0020.0002.2978] # GREATER-THAN ABOVE RIGHTWARDS ARROW
+2979  ; [*0A69.0020.0002.2979] # SUBSET ABOVE RIGHTWARDS ARROW
+297A  ; [*0A6A.0020.0002.297A] # LEFTWARDS ARROW THROUGH SUBSET
+297B  ; [*0A6B.0020.0002.297B] # SUPERSET ABOVE LEFTWARDS ARROW
+297C  ; [*0A6C.0020.0002.297C] # LEFT FISH TAIL
+297D  ; [*0A6D.0020.0002.297D] # RIGHT FISH TAIL
+297E  ; [*0A6E.0020.0002.297E] # UP FISH TAIL
+297F  ; [*0A6F.0020.0002.297F] # DOWN FISH TAIL
+2980  ; [*0A70.0020.0002.2980] # TRIPLE VERTICAL BAR DELIMITER
+2981  ; [*0A71.0020.0002.2981] # Z NOTATION SPOT
+2982  ; [*0A72.0020.0002.2982] # Z NOTATION TYPE COLON
+2983  ; [*030F.0020.0002.2983] # LEFT WHITE CURLY BRACKET
+2984  ; [*0310.0020.0002.2984] # RIGHT WHITE CURLY BRACKET
+2985  ; [*0311.0020.0002.2985] # LEFT WHITE PARENTHESIS
+2986  ; [*0312.0020.0002.2986] # RIGHT WHITE PARENTHESIS
+2987  ; [*0313.0020.0002.2987] # Z NOTATION LEFT IMAGE BRACKET
+2988  ; [*0314.0020.0002.2988] # Z NOTATION RIGHT IMAGE BRACKET
+2989  ; [*0315.0020.0002.2989] # Z NOTATION LEFT BINDING BRACKET
+298A  ; [*0316.0020.0002.298A] # Z NOTATION RIGHT BINDING BRACKET
+298B  ; [*0317.0020.0002.298B] # LEFT SQUARE BRACKET WITH UNDERBAR
+298C  ; [*0318.0020.0002.298C] # RIGHT SQUARE BRACKET WITH UNDERBAR
+298D  ; [*0319.0020.0002.298D] # LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+298E  ; [*031A.0020.0002.298E] # RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+298F  ; [*031B.0020.0002.298F] # LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+2990  ; [*031C.0020.0002.2990] # RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+2991  ; [*031D.0020.0002.2991] # LEFT ANGLE BRACKET WITH DOT
+2992  ; [*031E.0020.0002.2992] # RIGHT ANGLE BRACKET WITH DOT
+2993  ; [*031F.0020.0002.2993] # LEFT ARC LESS-THAN BRACKET
+2994  ; [*0320.0020.0002.2994] # RIGHT ARC GREATER-THAN BRACKET
+2995  ; [*0321.0020.0002.2995] # DOUBLE LEFT ARC GREATER-THAN BRACKET
+2996  ; [*0322.0020.0002.2996] # DOUBLE RIGHT ARC LESS-THAN BRACKET
+2997  ; [*0323.0020.0002.2997] # LEFT BLACK TORTOISE SHELL BRACKET
+2998  ; [*0324.0020.0002.2998] # RIGHT BLACK TORTOISE SHELL BRACKET
+2999  ; [*0A73.0020.0002.2999] # DOTTED FENCE
+299A  ; [*0A74.0020.0002.299A] # VERTICAL ZIGZAG LINE
+299B  ; [*0A75.0020.0002.299B] # MEASURED ANGLE OPENING LEFT
+299C  ; [*0A76.0020.0002.299C] # RIGHT ANGLE VARIANT WITH SQUARE
+299D  ; [*0A77.0020.0002.299D] # MEASURED RIGHT ANGLE WITH DOT
+299E  ; [*0A78.0020.0002.299E] # ANGLE WITH S INSIDE
+299F  ; [*0A79.0020.0002.299F] # ACUTE ANGLE
+29A0  ; [*0A7A.0020.0002.29A0] # SPHERICAL ANGLE OPENING LEFT
+29A1  ; [*0A7B.0020.0002.29A1] # SPHERICAL ANGLE OPENING UP
+29A2  ; [*0A7C.0020.0002.29A2] # TURNED ANGLE
+29A3  ; [*0A7D.0020.0002.29A3] # REVERSED ANGLE
+29A4  ; [*0A7E.0020.0002.29A4] # ANGLE WITH UNDERBAR
+29A5  ; [*0A7F.0020.0002.29A5] # REVERSED ANGLE WITH UNDERBAR
+29A6  ; [*0A80.0020.0002.29A6] # OBLIQUE ANGLE OPENING UP
+29A7  ; [*0A81.0020.0002.29A7] # OBLIQUE ANGLE OPENING DOWN
+29A8  ; [*0A82.0020.0002.29A8] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT
+29A9  ; [*0A83.0020.0002.29A9] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT
+29AA  ; [*0A84.0020.0002.29AA] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT
+29AB  ; [*0A85.0020.0002.29AB] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT
+29AC  ; [*0A86.0020.0002.29AC] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP
+29AD  ; [*0A87.0020.0002.29AD] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP
+29AE  ; [*0A88.0020.0002.29AE] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN
+29AF  ; [*0A89.0020.0002.29AF] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN
+29B0  ; [*0A8A.0020.0002.29B0] # REVERSED EMPTY SET
+29B1  ; [*0A8B.0020.0002.29B1] # EMPTY SET WITH OVERBAR
+29B2  ; [*0A8C.0020.0002.29B2] # EMPTY SET WITH SMALL CIRCLE ABOVE
+29B3  ; [*0A8D.0020.0002.29B3] # EMPTY SET WITH RIGHT ARROW ABOVE
+29B4  ; [*0A8E.0020.0002.29B4] # EMPTY SET WITH LEFT ARROW ABOVE
+29B5  ; [*0A8F.0020.0002.29B5] # CIRCLE WITH HORIZONTAL BAR
+29B6  ; [*0A90.0020.0002.29B6] # CIRCLED VERTICAL BAR
+29B7  ; [*0A91.0020.0002.29B7] # CIRCLED PARALLEL
+29B8  ; [*0A92.0020.0002.29B8] # CIRCLED REVERSE SOLIDUS
+29B9  ; [*0A93.0020.0002.29B9] # CIRCLED PERPENDICULAR
+29BA  ; [*0A94.0020.0002.29BA] # CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR
+29BB  ; [*0A95.0020.0002.29BB] # CIRCLE WITH SUPERIMPOSED X
+29BC  ; [*0A96.0020.0002.29BC] # CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN
+29BD  ; [*0A97.0020.0002.29BD] # UP ARROW THROUGH CIRCLE
+29BE  ; [*0A98.0020.0002.29BE] # CIRCLED WHITE BULLET
+29BF  ; [*0A99.0020.0002.29BF] # CIRCLED BULLET
+29C0  ; [*0A9A.0020.0002.29C0] # CIRCLED LESS-THAN
+29C1  ; [*0A9B.0020.0002.29C1] # CIRCLED GREATER-THAN
+29C2  ; [*0A9C.0020.0002.29C2] # CIRCLE WITH SMALL CIRCLE TO THE RIGHT
+29C3  ; [*0A9D.0020.0002.29C3] # CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT
+29C4  ; [*0A9E.0020.0002.29C4] # SQUARED RISING DIAGONAL SLASH
+29C5  ; [*0A9F.0020.0002.29C5] # SQUARED FALLING DIAGONAL SLASH
+29C6  ; [*0AA0.0020.0002.29C6] # SQUARED ASTERISK
+29C7  ; [*0AA1.0020.0002.29C7] # SQUARED SMALL CIRCLE
+29C8  ; [*0AA2.0020.0002.29C8] # SQUARED SQUARE
+29C9  ; [*0AA3.0020.0002.29C9] # TWO JOINED SQUARES
+29CA  ; [*0AA4.0020.0002.29CA] # TRIANGLE WITH DOT ABOVE
+29CB  ; [*0AA5.0020.0002.29CB] # TRIANGLE WITH UNDERBAR
+29CC  ; [*0AA6.0020.0002.29CC] # S IN TRIANGLE
+29CD  ; [*0AA7.0020.0002.29CD] # TRIANGLE WITH SERIFS AT BOTTOM
+29CE  ; [*0AA8.0020.0002.29CE] # RIGHT TRIANGLE ABOVE LEFT TRIANGLE
+29CF  ; [*0AA9.0020.0002.29CF] # LEFT TRIANGLE BESIDE VERTICAL BAR
+29D0  ; [*0AAA.0020.0002.29D0] # VERTICAL BAR BESIDE RIGHT TRIANGLE
+29D1  ; [*0AAB.0020.0002.29D1] # BOWTIE WITH LEFT HALF BLACK
+29D2  ; [*0AAC.0020.0002.29D2] # BOWTIE WITH RIGHT HALF BLACK
+29D3  ; [*0AAD.0020.0002.29D3] # BLACK BOWTIE
+29D4  ; [*0AAE.0020.0002.29D4] # TIMES WITH LEFT HALF BLACK
+29D5  ; [*0AAF.0020.0002.29D5] # TIMES WITH RIGHT HALF BLACK
+29D6  ; [*0AB0.0020.0002.29D6] # WHITE HOURGLASS
+29D7  ; [*0AB1.0020.0002.29D7] # BLACK HOURGLASS
+29D8  ; [*0AB2.0020.0002.29D8] # LEFT WIGGLY FENCE
+29D9  ; [*0AB3.0020.0002.29D9] # RIGHT WIGGLY FENCE
+29DA  ; [*0AB4.0020.0002.29DA] # LEFT DOUBLE WIGGLY FENCE
+29DB  ; [*0AB5.0020.0002.29DB] # RIGHT DOUBLE WIGGLY FENCE
+29DC  ; [*0AB6.0020.0002.29DC] # INCOMPLETE INFINITY
+29DD  ; [*0AB7.0020.0002.29DD] # TIE OVER INFINITY
+29DE  ; [*0AB8.0020.0002.29DE] # INFINITY NEGATED WITH VERTICAL BAR
+29DF  ; [*0AB9.0020.0002.29DF] # DOUBLE-ENDED MULTIMAP
+29E0  ; [*0ABA.0020.0002.29E0] # SQUARE WITH CONTOURED OUTLINE
+29E1  ; [*0ABB.0020.0002.29E1] # INCREASES AS
+29E2  ; [*0ABC.0020.0002.29E2] # SHUFFLE PRODUCT
+29E3  ; [*0ABD.0020.0002.29E3] # EQUALS SIGN AND SLANTED PARALLEL
+29E4  ; [*0ABE.0020.0002.29E4] # EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE
+29E5  ; [*0ABF.0020.0002.29E5] # IDENTICAL TO AND SLANTED PARALLEL
+29E6  ; [*0AC0.0020.0002.29E6] # GLEICH STARK
+29E7  ; [*0AC1.0020.0002.29E7] # THERMODYNAMIC
+29E8  ; [*0AC2.0020.0002.29E8] # DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK
+29E9  ; [*0AC3.0020.0002.29E9] # DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK
+29EA  ; [*0AC4.0020.0002.29EA] # BLACK DIAMOND WITH DOWN ARROW
+29EB  ; [*0AC5.0020.0002.29EB] # BLACK LOZENGE
+29EC  ; [*0AC6.0020.0002.29EC] # WHITE CIRCLE WITH DOWN ARROW
+29ED  ; [*0AC7.0020.0002.29ED] # BLACK CIRCLE WITH DOWN ARROW
+29EE  ; [*0AC8.0020.0002.29EE] # ERROR-BARRED WHITE SQUARE
+29EF  ; [*0AC9.0020.0002.29EF] # ERROR-BARRED BLACK SQUARE
+29F0  ; [*0ACA.0020.0002.29F0] # ERROR-BARRED WHITE DIAMOND
+29F1  ; [*0ACB.0020.0002.29F1] # ERROR-BARRED BLACK DIAMOND
+29F2  ; [*0ACC.0020.0002.29F2] # ERROR-BARRED WHITE CIRCLE
+29F3  ; [*0ACD.0020.0002.29F3] # ERROR-BARRED BLACK CIRCLE
+29F4  ; [*0ACE.0020.0002.29F4] # RULE-DELAYED
+29F5  ; [*0ACF.0020.0002.29F5] # REVERSE SOLIDUS OPERATOR
+29F6  ; [*0AD0.0020.0002.29F6] # SOLIDUS WITH OVERBAR
+29F7  ; [*0AD1.0020.0002.29F7] # REVERSE SOLIDUS WITH HORIZONTAL STROKE
+29F8  ; [*0AD2.0020.0002.29F8] # BIG SOLIDUS
+29F9  ; [*0AD3.0020.0002.29F9] # BIG REVERSE SOLIDUS
+29FA  ; [*0AD4.0020.0002.29FA] # DOUBLE PLUS
+29FB  ; [*0AD5.0020.0002.29FB] # TRIPLE PLUS
+29FC  ; [*030D.0020.0002.29FC] # LEFT-POINTING CURVED ANGLE BRACKET
+29FD  ; [*030E.0020.0002.29FD] # RIGHT-POINTING CURVED ANGLE BRACKET
+29FE  ; [*0AD6.0020.0002.29FE] # TINY
+29FF  ; [*0AD7.0020.0002.29FF] # MINY
+2A00  ; [*0AD8.0020.0002.2A00] # N-ARY CIRCLED DOT OPERATOR
+2A01  ; [*0AD9.0020.0002.2A01] # N-ARY CIRCLED PLUS OPERATOR
+2A02  ; [*0ADA.0020.0002.2A02] # N-ARY CIRCLED TIMES OPERATOR
+2A03  ; [*0ADB.0020.0002.2A03] # N-ARY UNION OPERATOR WITH DOT
+2A04  ; [*0ADC.0020.0002.2A04] # N-ARY UNION OPERATOR WITH PLUS
+2A05  ; [*0ADD.0020.0002.2A05] # N-ARY SQUARE INTERSECTION OPERATOR
+2A06  ; [*0ADE.0020.0002.2A06] # N-ARY SQUARE UNION OPERATOR
+2A07  ; [*0ADF.0020.0002.2A07] # TWO LOGICAL AND OPERATOR
+2A08  ; [*0AE0.0020.0002.2A08] # TWO LOGICAL OR OPERATOR
+2A09  ; [*0AE1.0020.0002.2A09] # N-ARY TIMES OPERATOR
+2A0A  ; [*0AE2.0020.0002.2A0A] # MODULO TWO SUM
+2A0B  ; [*0AE3.0020.0002.2A0B] # SUMMATION WITH INTEGRAL
+2A0C  ; [*0575.0020.0004.2A0C][*0575.0020.0004.2A0C][*0575.0020.001F.2A0C][*0575.0020.001F.2A0C] # QUADRUPLE INTEGRAL OPERATOR; QQKN
+2A0D  ; [*0AE4.0020.0002.2A0D] # FINITE PART INTEGRAL
+2A0E  ; [*0AE5.0020.0002.2A0E] # INTEGRAL WITH DOUBLE STROKE
+2A0F  ; [*0AE6.0020.0002.2A0F] # INTEGRAL AVERAGE WITH SLASH
+2A10  ; [*0AE7.0020.0002.2A10] # CIRCULATION FUNCTION
+2A11  ; [*0AE8.0020.0002.2A11] # ANTICLOCKWISE INTEGRATION
+2A12  ; [*0AE9.0020.0002.2A12] # LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE
+2A13  ; [*0AEA.0020.0002.2A13] # LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE
+2A14  ; [*0AEB.0020.0002.2A14] # LINE INTEGRATION NOT INCLUDING THE POLE
+2A15  ; [*0AEC.0020.0002.2A15] # INTEGRAL AROUND A POINT OPERATOR
+2A16  ; [*0AED.0020.0002.2A16] # QUATERNION INTEGRAL OPERATOR
+2A17  ; [*0AEE.0020.0002.2A17] # INTEGRAL WITH LEFTWARDS ARROW WITH HOOK
+2A18  ; [*0AEF.0020.0002.2A18] # INTEGRAL WITH TIMES SIGN
+2A19  ; [*0AF0.0020.0002.2A19] # INTEGRAL WITH INTERSECTION
+2A1A  ; [*0AF1.0020.0002.2A1A] # INTEGRAL WITH UNION
+2A1B  ; [*0AF2.0020.0002.2A1B] # INTEGRAL WITH OVERBAR
+2A1C  ; [*0AF3.0020.0002.2A1C] # INTEGRAL WITH UNDERBAR
+2A1D  ; [*0AF4.0020.0002.2A1D] # JOIN
+2A1E  ; [*0AF5.0020.0002.2A1E] # LARGE LEFT TRIANGLE OPERATOR
+2A1F  ; [*0AF6.0020.0002.2A1F] # Z NOTATION SCHEMA COMPOSITION
+2A20  ; [*0AF7.0020.0002.2A20] # Z NOTATION SCHEMA PIPING
+2A21  ; [*0AF8.0020.0002.2A21] # Z NOTATION SCHEMA PROJECTION
+2A22  ; [*0AF9.0020.0002.2A22] # PLUS SIGN WITH SMALL CIRCLE ABOVE
+2A23  ; [*0AFA.0020.0002.2A23] # PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE
+2A24  ; [*0AFB.0020.0002.2A24] # PLUS SIGN WITH TILDE ABOVE
+2A25  ; [*0AFC.0020.0002.2A25] # PLUS SIGN WITH DOT BELOW
+2A26  ; [*0AFD.0020.0002.2A26] # PLUS SIGN WITH TILDE BELOW
+2A27  ; [*0AFE.0020.0002.2A27] # PLUS SIGN WITH SUBSCRIPT TWO
+2A28  ; [*0AFF.0020.0002.2A28] # PLUS SIGN WITH BLACK TRIANGLE
+2A29  ; [*0B00.0020.0002.2A29] # MINUS SIGN WITH COMMA ABOVE
+2A2A  ; [*0B01.0020.0002.2A2A] # MINUS SIGN WITH DOT BELOW
+2A2B  ; [*0B02.0020.0002.2A2B] # MINUS SIGN WITH FALLING DOTS
+2A2C  ; [*0B03.0020.0002.2A2C] # MINUS SIGN WITH RISING DOTS
+2A2D  ; [*0B04.0020.0002.2A2D] # PLUS SIGN IN LEFT HALF CIRCLE
+2A2E  ; [*0B05.0020.0002.2A2E] # PLUS SIGN IN RIGHT HALF CIRCLE
+2A2F  ; [*0B06.0020.0002.2A2F] # VECTOR OR CROSS PRODUCT
+2A30  ; [*0B07.0020.0002.2A30] # MULTIPLICATION SIGN WITH DOT ABOVE
+2A31  ; [*0B08.0020.0002.2A31] # MULTIPLICATION SIGN WITH UNDERBAR
+2A32  ; [*0B09.0020.0002.2A32] # SEMIDIRECT PRODUCT WITH BOTTOM CLOSED
+2A33  ; [*0B0A.0020.0002.2A33] # SMASH PRODUCT
+2A34  ; [*0B0B.0020.0002.2A34] # MULTIPLICATION SIGN IN LEFT HALF CIRCLE
+2A35  ; [*0B0C.0020.0002.2A35] # MULTIPLICATION SIGN IN RIGHT HALF CIRCLE
+2A36  ; [*0B0D.0020.0002.2A36] # CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT
+2A37  ; [*0B0E.0020.0002.2A37] # MULTIPLICATION SIGN IN DOUBLE CIRCLE
+2A38  ; [*0B0F.0020.0002.2A38] # CIRCLED DIVISION SIGN
+2A39  ; [*0B10.0020.0002.2A39] # PLUS SIGN IN TRIANGLE
+2A3A  ; [*0B11.0020.0002.2A3A] # MINUS SIGN IN TRIANGLE
+2A3B  ; [*0B12.0020.0002.2A3B] # MULTIPLICATION SIGN IN TRIANGLE
+2A3C  ; [*0B13.0020.0002.2A3C] # INTERIOR PRODUCT
+2A3D  ; [*0B14.0020.0002.2A3D] # RIGHTHAND INTERIOR PRODUCT
+2A3E  ; [*0B15.0020.0002.2A3E] # Z NOTATION RELATIONAL COMPOSITION
+2A3F  ; [*0B16.0020.0002.2A3F] # AMALGAMATION OR COPRODUCT
+2A40  ; [*0B17.0020.0002.2A40] # INTERSECTION WITH DOT
+2A41  ; [*0B18.0020.0002.2A41] # UNION WITH MINUS SIGN
+2A42  ; [*0B19.0020.0002.2A42] # UNION WITH OVERBAR
+2A43  ; [*0B1A.0020.0002.2A43] # INTERSECTION WITH OVERBAR
+2A44  ; [*0B1B.0020.0002.2A44] # INTERSECTION WITH LOGICAL AND
+2A45  ; [*0B1C.0020.0002.2A45] # UNION WITH LOGICAL OR
+2A46  ; [*0B1D.0020.0002.2A46] # UNION ABOVE INTERSECTION
+2A47  ; [*0B1E.0020.0002.2A47] # INTERSECTION ABOVE UNION
+2A48  ; [*0B1F.0020.0002.2A48] # UNION ABOVE BAR ABOVE INTERSECTION
+2A49  ; [*0B20.0020.0002.2A49] # INTERSECTION ABOVE BAR ABOVE UNION
+2A4A  ; [*0B21.0020.0002.2A4A] # UNION BESIDE AND JOINED WITH UNION
+2A4B  ; [*0B22.0020.0002.2A4B] # INTERSECTION BESIDE AND JOINED WITH INTERSECTION
+2A4C  ; [*0B23.0020.0002.2A4C] # CLOSED UNION WITH SERIFS
+2A4D  ; [*0B24.0020.0002.2A4D] # CLOSED INTERSECTION WITH SERIFS
+2A4E  ; [*0B25.0020.0002.2A4E] # DOUBLE SQUARE INTERSECTION
+2A4F  ; [*0B26.0020.0002.2A4F] # DOUBLE SQUARE UNION
+2A50  ; [*0B27.0020.0002.2A50] # CLOSED UNION WITH SERIFS AND SMASH PRODUCT
+2A51  ; [*0B28.0020.0002.2A51] # LOGICAL AND WITH DOT ABOVE
+2A52  ; [*0B29.0020.0002.2A52] # LOGICAL OR WITH DOT ABOVE
+2A53  ; [*0B2A.0020.0002.2A53] # DOUBLE LOGICAL AND
+2A54  ; [*0B2B.0020.0002.2A54] # DOUBLE LOGICAL OR
+2A55  ; [*0B2C.0020.0002.2A55] # TWO INTERSECTING LOGICAL AND
+2A56  ; [*0B2D.0020.0002.2A56] # TWO INTERSECTING LOGICAL OR
+2A57  ; [*0B2E.0020.0002.2A57] # SLOPING LARGE OR
+2A58  ; [*0B2F.0020.0002.2A58] # SLOPING LARGE AND
+2A59  ; [*0B30.0020.0002.2A59] # LOGICAL OR OVERLAPPING LOGICAL AND
+2A5A  ; [*0B31.0020.0002.2A5A] # LOGICAL AND WITH MIDDLE STEM
+2A5B  ; [*0B32.0020.0002.2A5B] # LOGICAL OR WITH MIDDLE STEM
+2A5C  ; [*0B33.0020.0002.2A5C] # LOGICAL AND WITH HORIZONTAL DASH
+2A5D  ; [*0B34.0020.0002.2A5D] # LOGICAL OR WITH HORIZONTAL DASH
+2A5E  ; [*0B35.0020.0002.2A5E] # LOGICAL AND WITH DOUBLE OVERBAR
+2A5F  ; [*0B36.0020.0002.2A5F] # LOGICAL AND WITH UNDERBAR
+2A60  ; [*0B37.0020.0002.2A60] # LOGICAL AND WITH DOUBLE UNDERBAR
+2A61  ; [*0B38.0020.0002.2A61] # SMALL VEE WITH UNDERBAR
+2A62  ; [*0B39.0020.0002.2A62] # LOGICAL OR WITH DOUBLE OVERBAR
+2A63  ; [*0B3A.0020.0002.2A63] # LOGICAL OR WITH DOUBLE UNDERBAR
+2A64  ; [*0B3B.0020.0002.2A64] # Z NOTATION DOMAIN ANTIRESTRICTION
+2A65  ; [*0B3C.0020.0002.2A65] # Z NOTATION RANGE ANTIRESTRICTION
+2A66  ; [*0B3D.0020.0002.2A66] # EQUALS SIGN WITH DOT BELOW
+2A67  ; [*0B3E.0020.0002.2A67] # IDENTICAL WITH DOT ABOVE
+2A68  ; [*0B3F.0020.0002.2A68] # TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE
+2A69  ; [*0B40.0020.0002.2A69] # TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE
+2A6A  ; [*0B41.0020.0002.2A6A] # TILDE OPERATOR WITH DOT ABOVE
+2A6B  ; [*0B42.0020.0002.2A6B] # TILDE OPERATOR WITH RISING DOTS
+2A6C  ; [*0B43.0020.0002.2A6C] # SIMILAR MINUS SIMILAR
+2A6D  ; [*0B44.0020.0002.2A6D] # CONGRUENT WITH DOT ABOVE
+2A6E  ; [*0B45.0020.0002.2A6E] # EQUALS WITH ASTERISK
+2A6F  ; [*0B46.0020.0002.2A6F] # ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT
+2A70  ; [*0B47.0020.0002.2A70] # APPROXIMATELY EQUAL OR EQUAL TO
+2A71  ; [*0B48.0020.0002.2A71] # EQUALS SIGN ABOVE PLUS SIGN
+2A72  ; [*0B49.0020.0002.2A72] # PLUS SIGN ABOVE EQUALS SIGN
+2A73  ; [*0B4A.0020.0002.2A73] # EQUALS SIGN ABOVE TILDE OPERATOR
+2A74  ; [*0247.0020.0004.2A74][*0247.0020.0004.2A74][*0555.0020.001F.2A74] # DOUBLE COLON EQUAL; QQKN
+2A75  ; [*0555.0020.0004.2A75][*0555.0020.0004.2A75] # TWO CONSECUTIVE EQUALS SIGNS; QQKN
+2A76  ; [*0555.0020.0004.2A76][*0555.0020.0004.2A76][*0555.0020.001F.2A76] # THREE CONSECUTIVE EQUALS SIGNS; QQKN
+2A77  ; [*0B4B.0020.0002.2A77] # EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW
+2A78  ; [*0B4C.0020.0002.2A78] # EQUIVALENT WITH FOUR DOTS ABOVE
+2A79  ; [*0B4D.0020.0002.2A79] # LESS-THAN WITH CIRCLE INSIDE
+2A7A  ; [*0B4E.0020.0002.2A7A] # GREATER-THAN WITH CIRCLE INSIDE
+2A7B  ; [*0B4F.0020.0002.2A7B] # LESS-THAN WITH QUESTION MARK ABOVE
+2A7C  ; [*0B50.0020.0002.2A7C] # GREATER-THAN WITH QUESTION MARK ABOVE
+2A7D  ; [*0B51.0020.0002.2A7D] # LESS-THAN OR SLANTED EQUAL TO
+2A7E  ; [*0B52.0020.0002.2A7E] # GREATER-THAN OR SLANTED EQUAL TO
+2A7F  ; [*0B53.0020.0002.2A7F] # LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+2A80  ; [*0B54.0020.0002.2A80] # GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+2A81  ; [*0B55.0020.0002.2A81] # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+2A82  ; [*0B56.0020.0002.2A82] # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+2A83  ; [*0B57.0020.0002.2A83] # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT
+2A84  ; [*0B58.0020.0002.2A84] # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT
+2A85  ; [*0B59.0020.0002.2A85] # LESS-THAN OR APPROXIMATE
+2A86  ; [*0B5A.0020.0002.2A86] # GREATER-THAN OR APPROXIMATE
+2A87  ; [*0B5B.0020.0002.2A87] # LESS-THAN AND SINGLE-LINE NOT EQUAL TO
+2A88  ; [*0B5C.0020.0002.2A88] # GREATER-THAN AND SINGLE-LINE NOT EQUAL TO
+2A89  ; [*0B5D.0020.0002.2A89] # LESS-THAN AND NOT APPROXIMATE
+2A8A  ; [*0B5E.0020.0002.2A8A] # GREATER-THAN AND NOT APPROXIMATE
+2A8B  ; [*0B5F.0020.0002.2A8B] # LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
+2A8C  ; [*0B60.0020.0002.2A8C] # GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
+2A8D  ; [*0B61.0020.0002.2A8D] # LESS-THAN ABOVE SIMILAR OR EQUAL
+2A8E  ; [*0B62.0020.0002.2A8E] # GREATER-THAN ABOVE SIMILAR OR EQUAL
+2A8F  ; [*0B63.0020.0002.2A8F] # LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN
+2A90  ; [*0B64.0020.0002.2A90] # GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN
+2A91  ; [*0B65.0020.0002.2A91] # LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL
+2A92  ; [*0B66.0020.0002.2A92] # GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL
+2A93  ; [*0B67.0020.0002.2A93] # LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL
+2A94  ; [*0B68.0020.0002.2A94] # GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL
+2A95  ; [*0B69.0020.0002.2A95] # SLANTED EQUAL TO OR LESS-THAN
+2A96  ; [*0B6A.0020.0002.2A96] # SLANTED EQUAL TO OR GREATER-THAN
+2A97  ; [*0B6B.0020.0002.2A97] # SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE
+2A98  ; [*0B6C.0020.0002.2A98] # SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE
+2A99  ; [*0B6D.0020.0002.2A99] # DOUBLE-LINE EQUAL TO OR LESS-THAN
+2A9A  ; [*0B6E.0020.0002.2A9A] # DOUBLE-LINE EQUAL TO OR GREATER-THAN
+2A9B  ; [*0B6F.0020.0002.2A9B] # DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN
+2A9C  ; [*0B70.0020.0002.2A9C] # DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN
+2A9D  ; [*0B71.0020.0002.2A9D] # SIMILAR OR LESS-THAN
+2A9E  ; [*0B72.0020.0002.2A9E] # SIMILAR OR GREATER-THAN
+2A9F  ; [*0B73.0020.0002.2A9F] # SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN
+2AA0  ; [*0B74.0020.0002.2AA0] # SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN
+2AA1  ; [*0B75.0020.0002.2AA1] # DOUBLE NESTED LESS-THAN
+2AA2  ; [*0B76.0020.0002.2AA2] # DOUBLE NESTED GREATER-THAN
+2AA3  ; [*0B77.0020.0002.2AA3] # DOUBLE NESTED LESS-THAN WITH UNDERBAR
+2AA4  ; [*0B78.0020.0002.2AA4] # GREATER-THAN OVERLAPPING LESS-THAN
+2AA5  ; [*0B79.0020.0002.2AA5] # GREATER-THAN BESIDE LESS-THAN
+2AA6  ; [*0B7A.0020.0002.2AA6] # LESS-THAN CLOSED BY CURVE
+2AA7  ; [*0B7B.0020.0002.2AA7] # GREATER-THAN CLOSED BY CURVE
+2AA8  ; [*0B7C.0020.0002.2AA8] # LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+2AA9  ; [*0B7D.0020.0002.2AA9] # GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+2AAA  ; [*0B7E.0020.0002.2AAA] # SMALLER THAN
+2AAB  ; [*0B7F.0020.0002.2AAB] # LARGER THAN
+2AAC  ; [*0B80.0020.0002.2AAC] # SMALLER THAN OR EQUAL TO
+2AAD  ; [*0B81.0020.0002.2AAD] # LARGER THAN OR EQUAL TO
+2AAE  ; [*0B82.0020.0002.2AAE] # EQUALS SIGN WITH BUMPY ABOVE
+2AAF  ; [*0B83.0020.0002.2AAF] # PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+2AB0  ; [*0B84.0020.0002.2AB0] # SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+2AB1  ; [*0B85.0020.0002.2AB1] # PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO
+2AB2  ; [*0B86.0020.0002.2AB2] # SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO
+2AB3  ; [*0B87.0020.0002.2AB3] # PRECEDES ABOVE EQUALS SIGN
+2AB4  ; [*0B88.0020.0002.2AB4] # SUCCEEDS ABOVE EQUALS SIGN
+2AB5  ; [*0B89.0020.0002.2AB5] # PRECEDES ABOVE NOT EQUAL TO
+2AB6  ; [*0B8A.0020.0002.2AB6] # SUCCEEDS ABOVE NOT EQUAL TO
+2AB7  ; [*0B8B.0020.0002.2AB7] # PRECEDES ABOVE ALMOST EQUAL TO
+2AB8  ; [*0B8C.0020.0002.2AB8] # SUCCEEDS ABOVE ALMOST EQUAL TO
+2AB9  ; [*0B8D.0020.0002.2AB9] # PRECEDES ABOVE NOT ALMOST EQUAL TO
+2ABA  ; [*0B8E.0020.0002.2ABA] # SUCCEEDS ABOVE NOT ALMOST EQUAL TO
+2ABB  ; [*0B8F.0020.0002.2ABB] # DOUBLE PRECEDES
+2ABC  ; [*0B90.0020.0002.2ABC] # DOUBLE SUCCEEDS
+2ABD  ; [*0B91.0020.0002.2ABD] # SUBSET WITH DOT
+2ABE  ; [*0B92.0020.0002.2ABE] # SUPERSET WITH DOT
+2ABF  ; [*0B93.0020.0002.2ABF] # SUBSET WITH PLUS SIGN BELOW
+2AC0  ; [*0B94.0020.0002.2AC0] # SUPERSET WITH PLUS SIGN BELOW
+2AC1  ; [*0B95.0020.0002.2AC1] # SUBSET WITH MULTIPLICATION SIGN BELOW
+2AC2  ; [*0B96.0020.0002.2AC2] # SUPERSET WITH MULTIPLICATION SIGN BELOW
+2AC3  ; [*0B97.0020.0002.2AC3] # SUBSET OF OR EQUAL TO WITH DOT ABOVE
+2AC4  ; [*0B98.0020.0002.2AC4] # SUPERSET OF OR EQUAL TO WITH DOT ABOVE
+2AC5  ; [*0B99.0020.0002.2AC5] # SUBSET OF ABOVE EQUALS SIGN
+2AC6  ; [*0B9A.0020.0002.2AC6] # SUPERSET OF ABOVE EQUALS SIGN
+2AC7  ; [*0B9B.0020.0002.2AC7] # SUBSET OF ABOVE TILDE OPERATOR
+2AC8  ; [*0B9C.0020.0002.2AC8] # SUPERSET OF ABOVE TILDE OPERATOR
+2AC9  ; [*0B9D.0020.0002.2AC9] # SUBSET OF ABOVE ALMOST EQUAL TO
+2ACA  ; [*0B9E.0020.0002.2ACA] # SUPERSET OF ABOVE ALMOST EQUAL TO
+2ACB  ; [*0B9F.0020.0002.2ACB] # SUBSET OF ABOVE NOT EQUAL TO
+2ACC  ; [*0BA0.0020.0002.2ACC] # SUPERSET OF ABOVE NOT EQUAL TO
+2ACD  ; [*0BA1.0020.0002.2ACD] # SQUARE LEFT OPEN BOX OPERATOR
+2ACE  ; [*0BA2.0020.0002.2ACE] # SQUARE RIGHT OPEN BOX OPERATOR
+2ACF  ; [*0BA3.0020.0002.2ACF] # CLOSED SUBSET
+2AD0  ; [*0BA4.0020.0002.2AD0] # CLOSED SUPERSET
+2AD1  ; [*0BA5.0020.0002.2AD1] # CLOSED SUBSET OR EQUAL TO
+2AD2  ; [*0BA6.0020.0002.2AD2] # CLOSED SUPERSET OR EQUAL TO
+2AD3  ; [*0BA7.0020.0002.2AD3] # SUBSET ABOVE SUPERSET
+2AD4  ; [*0BA8.0020.0002.2AD4] # SUPERSET ABOVE SUBSET
+2AD5  ; [*0BA9.0020.0002.2AD5] # SUBSET ABOVE SUBSET
+2AD6  ; [*0BAA.0020.0002.2AD6] # SUPERSET ABOVE SUPERSET
+2AD7  ; [*0BAB.0020.0002.2AD7] # SUPERSET BESIDE SUBSET
+2AD8  ; [*0BAC.0020.0002.2AD8] # SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET
+2AD9  ; [*0BAD.0020.0002.2AD9] # ELEMENT OF OPENING DOWNWARDS
+2ADA  ; [*0BAE.0020.0002.2ADA] # PITCHFORK WITH TEE TOP
+2ADB  ; [*0BAF.0020.0002.2ADB] # TRANSVERSAL INTERSECTION
+2ADC  ; [*0BB0.0020.0002.2ADD][.0000.0054.0002.0338] # FORKING; QQCM
+2ADD  ; [*0BB0.0020.0002.2ADD] # NONFORKING
+2ADE  ; [*0BB1.0020.0002.2ADE] # SHORT LEFT TACK
+2ADF  ; [*0BB2.0020.0002.2ADF] # SHORT DOWN TACK
+2AE0  ; [*0BB3.0020.0002.2AE0] # SHORT UP TACK
+2AE1  ; [*0BB4.0020.0002.2AE1] # PERPENDICULAR WITH S
+2AE2  ; [*0BB5.0020.0002.2AE2] # VERTICAL BAR TRIPLE RIGHT TURNSTILE
+2AE3  ; [*0BB6.0020.0002.2AE3] # DOUBLE VERTICAL BAR LEFT TURNSTILE
+2AE4  ; [*0BB7.0020.0002.2AE4] # VERTICAL BAR DOUBLE LEFT TURNSTILE
+2AE5  ; [*0BB8.0020.0002.2AE5] # DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE
+2AE6  ; [*0BB9.0020.0002.2AE6] # LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL
+2AE7  ; [*0BBA.0020.0002.2AE7] # SHORT DOWN TACK WITH OVERBAR
+2AE8  ; [*0BBB.0020.0002.2AE8] # SHORT UP TACK WITH UNDERBAR
+2AE9  ; [*0BBC.0020.0002.2AE9] # SHORT UP TACK ABOVE SHORT DOWN TACK
+2AEA  ; [*0BBD.0020.0002.2AEA] # DOUBLE DOWN TACK
+2AEB  ; [*0BBE.0020.0002.2AEB] # DOUBLE UP TACK
+2AEC  ; [*0BBF.0020.0002.2AEC] # DOUBLE STROKE NOT SIGN
+2AED  ; [*0BC0.0020.0002.2AED] # REVERSED DOUBLE STROKE NOT SIGN
+2AEE  ; [*0BC1.0020.0002.2AEE] # DOES NOT DIVIDE WITH REVERSED NEGATION SLASH
+2AEF  ; [*0BC2.0020.0002.2AEF] # VERTICAL LINE WITH CIRCLE ABOVE
+2AF0  ; [*0BC3.0020.0002.2AF0] # VERTICAL LINE WITH CIRCLE BELOW
+2AF1  ; [*0BC4.0020.0002.2AF1] # DOWN TACK WITH CIRCLE BELOW
+2AF2  ; [*0BC5.0020.0002.2AF2] # PARALLEL WITH HORIZONTAL STROKE
+2AF3  ; [*0BC6.0020.0002.2AF3] # PARALLEL WITH TILDE OPERATOR
+2AF4  ; [*0BC7.0020.0002.2AF4] # TRIPLE VERTICAL BAR BINARY RELATION
+2AF5  ; [*0BC8.0020.0002.2AF5] # TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE
+2AF6  ; [*0BC9.0020.0002.2AF6] # TRIPLE COLON OPERATOR
+2AF7  ; [*0BCA.0020.0002.2AF7] # TRIPLE NESTED LESS-THAN
+2AF8  ; [*0BCB.0020.0002.2AF8] # TRIPLE NESTED GREATER-THAN
+2AF9  ; [*0BCC.0020.0002.2AF9] # DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO
+2AFA  ; [*0BCD.0020.0002.2AFA] # DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO
+2AFB  ; [*0BCE.0020.0002.2AFB] # TRIPLE SOLIDUS BINARY RELATION
+2AFC  ; [*0BCF.0020.0002.2AFC] # LARGE TRIPLE VERTICAL BAR OPERATOR
+2AFD  ; [*0BD0.0020.0002.2AFD] # DOUBLE SOLIDUS OPERATOR
+2AFE  ; [*0BD1.0020.0002.2AFE] # WHITE VERTICAL BAR
+2AFF  ; [*0BD2.0020.0002.2AFF] # N-ARY WHITE VERTICAL BAR
+2B00  ; [*0BD3.0020.0002.2B00] # NORTH EAST WHITE ARROW
+2B01  ; [*0BD4.0020.0002.2B01] # NORTH WEST WHITE ARROW
+2B02  ; [*0BD5.0020.0002.2B02] # SOUTH EAST WHITE ARROW
+2B03  ; [*0BD6.0020.0002.2B03] # SOUTH WEST WHITE ARROW
+2B04  ; [*0BD7.0020.0002.2B04] # LEFT RIGHT WHITE ARROW
+2B05  ; [*0BD8.0020.0002.2B05] # LEFTWARDS BLACK ARROW
+2B06  ; [*0BD9.0020.0002.2B06] # UPWARDS BLACK ARROW
+2B07  ; [*0BDA.0020.0002.2B07] # DOWNWARDS BLACK ARROW
+2B08  ; [*0BDB.0020.0002.2B08] # NORTH EAST BLACK ARROW
+2B09  ; [*0BDC.0020.0002.2B09] # NORTH WEST BLACK ARROW
+2B0A  ; [*0BDD.0020.0002.2B0A] # SOUTH EAST BLACK ARROW
+2B0B  ; [*0BDE.0020.0002.2B0B] # SOUTH WEST BLACK ARROW
+2B0C  ; [*0BDF.0020.0002.2B0C] # LEFT RIGHT BLACK ARROW
+2B0D  ; [*0BE0.0020.0002.2B0D] # UP DOWN BLACK ARROW
+2B0E  ; [*0BE1.0020.0002.2B0E] # RIGHTWARDS ARROW WITH TIP DOWNWARDS
+2B0F  ; [*0BE2.0020.0002.2B0F] # RIGHTWARDS ARROW WITH TIP UPWARDS
+2B10  ; [*0BE3.0020.0002.2B10] # LEFTWARDS ARROW WITH TIP DOWNWARDS
+2B11  ; [*0BE4.0020.0002.2B11] # LEFTWARDS ARROW WITH TIP UPWARDS
+2B12  ; [*0BE5.0020.0002.2B12] # SQUARE WITH TOP HALF BLACK
+2B13  ; [*0BE6.0020.0002.2B13] # SQUARE WITH BOTTOM HALF BLACK
+2B14  ; [*0BE7.0020.0002.2B14] # SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK
+2B15  ; [*0BE8.0020.0002.2B15] # SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK
+2B16  ; [*0BE9.0020.0002.2B16] # DIAMOND WITH LEFT HALF BLACK
+2B17  ; [*0BEA.0020.0002.2B17] # DIAMOND WITH RIGHT HALF BLACK
+2B18  ; [*0BEB.0020.0002.2B18] # DIAMOND WITH TOP HALF BLACK
+2B19  ; [*0BEC.0020.0002.2B19] # DIAMOND WITH BOTTOM HALF BLACK
+2B1A  ; [*0BED.0020.0002.2B1A] # DOTTED SQUARE
+2B1B  ; [*0BEE.0020.0002.2B1B] # BLACK LARGE SQUARE
+2B1C  ; [*0BEF.0020.0002.2B1C] # WHITE LARGE SQUARE
+2B1D  ; [*0BF0.0020.0002.2B1D] # BLACK VERY SMALL SQUARE
+2B1E  ; [*0BF1.0020.0002.2B1E] # WHITE VERY SMALL SQUARE
+2B1F  ; [*0BF2.0020.0002.2B1F] # BLACK PENTAGON
+2B20  ; [*0BF3.0020.0002.2B20] # WHITE PENTAGON
+2B21  ; [*0BF4.0020.0002.2B21] # WHITE HEXAGON
+2B22  ; [*0BF5.0020.0002.2B22] # BLACK HEXAGON
+2B23  ; [*0BF6.0020.0002.2B23] # HORIZONTAL BLACK HEXAGON
+2B24  ; [*0BF7.0020.0002.2B24] # BLACK LARGE CIRCLE
+2B25  ; [*0BF8.0020.0002.2B25] # BLACK MEDIUM DIAMOND
+2B26  ; [*0BF9.0020.0002.2B26] # WHITE MEDIUM DIAMOND
+2B27  ; [*0BFA.0020.0002.2B27] # BLACK MEDIUM LOZENGE
+2B28  ; [*0BFB.0020.0002.2B28] # WHITE MEDIUM LOZENGE
+2B29  ; [*0BFC.0020.0002.2B29] # BLACK SMALL DIAMOND
+2B2A  ; [*0BFD.0020.0002.2B2A] # BLACK SMALL LOZENGE
+2B2B  ; [*0BFE.0020.0002.2B2B] # WHITE SMALL LOZENGE
+2B2C  ; [*0BFF.0020.0002.2B2C] # BLACK HORIZONTAL ELLIPSE
+2B2D  ; [*0C00.0020.0002.2B2D] # WHITE HORIZONTAL ELLIPSE
+2B2E  ; [*0C01.0020.0002.2B2E] # BLACK VERTICAL ELLIPSE
+2B2F  ; [*0C02.0020.0002.2B2F] # WHITE VERTICAL ELLIPSE
+2B30  ; [*0C03.0020.0002.2B30] # LEFT ARROW WITH SMALL CIRCLE
+2B31  ; [*0C04.0020.0002.2B31] # THREE LEFTWARDS ARROWS
+2B32  ; [*0C05.0020.0002.2B32] # LEFT ARROW WITH CIRCLED PLUS
+2B33  ; [*0C06.0020.0002.2B33] # LONG LEFTWARDS SQUIGGLE ARROW
+2B34  ; [*0C07.0020.0002.2B34] # LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE
+2B35  ; [*0C08.0020.0002.2B35] # LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE
+2B36  ; [*0C09.0020.0002.2B36] # LEFTWARDS TWO-HEADED ARROW FROM BAR
+2B37  ; [*0C0A.0020.0002.2B37] # LEFTWARDS TWO-HEADED TRIPLE DASH ARROW
+2B38  ; [*0C0B.0020.0002.2B38] # LEFTWARDS ARROW WITH DOTTED STEM
+2B39  ; [*0C0C.0020.0002.2B39] # LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE
+2B3A  ; [*0C0D.0020.0002.2B3A] # LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
+2B3B  ; [*0C0E.0020.0002.2B3B] # LEFTWARDS TWO-HEADED ARROW WITH TAIL
+2B3C  ; [*0C0F.0020.0002.2B3C] # LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE
+2B3D  ; [*0C10.0020.0002.2B3D] # LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
+2B3E  ; [*0C11.0020.0002.2B3E] # LEFTWARDS ARROW THROUGH X
+2B3F  ; [*0C12.0020.0002.2B3F] # WAVE ARROW POINTING DIRECTLY LEFT
+2B40  ; [*0C13.0020.0002.2B40] # EQUALS SIGN ABOVE LEFTWARDS ARROW
+2B41  ; [*0C14.0020.0002.2B41] # REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW
+2B42  ; [*0C15.0020.0002.2B42] # LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO
+2B43  ; [*0C16.0020.0002.2B43] # RIGHTWARDS ARROW THROUGH GREATER-THAN
+2B44  ; [*0C17.0020.0002.2B44] # RIGHTWARDS ARROW THROUGH SUPERSET
+2B45  ; [*0C18.0020.0002.2B45] # LEFTWARDS QUADRUPLE ARROW
+2B46  ; [*0C19.0020.0002.2B46] # RIGHTWARDS QUADRUPLE ARROW
+2B47  ; [*0C1A.0020.0002.2B47] # REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW
+2B48  ; [*0C1B.0020.0002.2B48] # RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO
+2B49  ; [*0C1C.0020.0002.2B49] # TILDE OPERATOR ABOVE LEFTWARDS ARROW
+2B4A  ; [*0C1D.0020.0002.2B4A] # LEFTWARDS ARROW ABOVE ALMOST EQUAL TO
+2B4B  ; [*0C1E.0020.0002.2B4B] # LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR
+2B4C  ; [*0C1F.0020.0002.2B4C] # RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR
+2B50  ; [*0C20.0020.0002.2B50] # WHITE MEDIUM STAR
+2B51  ; [*0C21.0020.0002.2B51] # BLACK SMALL STAR
+2B52  ; [*0C22.0020.0002.2B52] # WHITE SMALL STAR
+2B53  ; [*0C23.0020.0002.2B53] # BLACK RIGHT-POINTING PENTAGON
+2B54  ; [*0C24.0020.0002.2B54] # WHITE RIGHT-POINTING PENTAGON
+2B55  ; [*0C25.0020.0002.2B55] # HEAVY LARGE CIRCLE
+2B56  ; [*0C26.0020.0002.2B56] # HEAVY OVAL WITH OVAL INSIDE
+2B57  ; [*0C27.0020.0002.2B57] # HEAVY CIRCLE WITH CIRCLE INSIDE
+2B58  ; [*0C28.0020.0002.2B58] # HEAVY CIRCLE
+2B59  ; [*0C29.0020.0002.2B59] # HEAVY CIRCLED SALTIRE
+2CE5  ; [*0C2A.0020.0002.2CE5] # COPTIC SYMBOL MI RO
+2CE6  ; [*0C2B.0020.0002.2CE6] # COPTIC SYMBOL PI RO
+2CE7  ; [*0C2C.0020.0002.2CE7] # COPTIC SYMBOL STAUROS
+2CE8  ; [*0C2D.0020.0002.2CE8] # COPTIC SYMBOL TAU RO
+2CE9  ; [*0C2E.0020.0002.2CE9] # COPTIC SYMBOL KHI RO
+2CEA  ; [*0C2F.0020.0002.2CEA] # COPTIC SYMBOL SHIMA SIMA
+2CF9  ; [*028B.0020.0002.2CF9] # COPTIC OLD NUBIAN FULL STOP
+2CFA  ; [*027B.0020.0002.2CFA] # COPTIC OLD NUBIAN DIRECT QUESTION MARK
+2CFB  ; [*027C.0020.0002.2CFB] # COPTIC OLD NUBIAN INDIRECT QUESTION MARK
+2CFC  ; [*02E0.0020.0002.2CFC] # COPTIC OLD NUBIAN VERSE DIVIDER
+2CFD  ; [*114C.0020.0002.2CFD] # COPTIC FRACTION ONE HALF
+2CFE  ; [*028C.0020.0002.2CFE] # COPTIC FULL STOP
+2CFF  ; [*02E1.0020.0002.2CFF] # COPTIC MORPHOLOGICAL DIVIDER
+2E00  ; [*037E.0020.0002.2E00] # RIGHT ANGLE SUBSTITUTION MARKER
+2E01  ; [*037F.0020.0002.2E01] # RIGHT ANGLE DOTTED SUBSTITUTION MARKER
+2E02  ; [*0329.0020.0002.2E02] # LEFT SUBSTITUTION BRACKET
+2E03  ; [*032A.0020.0002.2E03] # RIGHT SUBSTITUTION BRACKET
+2E04  ; [*032B.0020.0002.2E04] # LEFT DOTTED SUBSTITUTION BRACKET
+2E05  ; [*032C.0020.0002.2E05] # RIGHT DOTTED SUBSTITUTION BRACKET
+2E06  ; [*0380.0020.0002.2E06] # RAISED INTERPOLATION MARKER
+2E07  ; [*0381.0020.0002.2E07] # RAISED DOTTED INTERPOLATION MARKER
+2E08  ; [*0382.0020.0002.2E08] # DOTTED TRANSPOSITION MARKER
+2E09  ; [*032D.0020.0002.2E09] # LEFT TRANSPOSITION BRACKET
+2E0A  ; [*032E.0020.0002.2E0A] # RIGHT TRANSPOSITION BRACKET
+2E0B  ; [*0383.0020.0002.2E0B] # RAISED SQUARE
+2E0C  ; [*032F.0020.0002.2E0C] # LEFT RAISED OMISSION BRACKET
+2E0D  ; [*0330.0020.0002.2E0D] # RIGHT RAISED OMISSION BRACKET
+2E0E  ; [*0384.0020.0002.2E0E] # EDITORIAL CORONIS
+2E0F  ; [*0385.0020.0002.2E0F] # PARAGRAPHOS
+2E10  ; [*0386.0020.0002.2E10] # FORKED PARAGRAPHOS
+2E11  ; [*0387.0020.0002.2E11] # REVERSED FORKED PARAGRAPHOS
+2E12  ; [*0388.0020.0002.2E12] # HYPODIASTOLE
+2E13  ; [*0389.0020.0002.2E13] # DOTTED OBELOS
+2E14  ; [*038A.0020.0002.2E14] # DOWNWARDS ANCORA
+2E15  ; [*038B.0020.0002.2E15] # UPWARDS ANCORA
+2E16  ; [*038C.0020.0002.2E16] # DOTTED RIGHT-POINTING ANGLE
+2E17  ; [*022F.0020.0002.2E17] # DOUBLE OBLIQUE HYPHEN
+2E18  ; [*0280.0020.0002.2E18] # INVERTED INTERROBANG
+2E19  ; [*02E2.0020.0002.2E19] # PALM BRANCH
+2E1A  ; [*038D.0020.0002.2E1A] # HYPHEN WITH DIAERESIS
+2E1B  ; [*038E.0020.0002.2E1B] # TILDE WITH RING ABOVE
+2E1C  ; [*0331.0020.0002.2E1C] # LEFT LOW PARAPHRASE BRACKET
+2E1D  ; [*0332.0020.0002.2E1D] # RIGHT LOW PARAPHRASE BRACKET
+2E1E  ; [*038F.0020.0002.2E1E] # TILDE WITH DOT ABOVE
+2E1F  ; [*0390.0020.0002.2E1F] # TILDE WITH DOT BELOW
+2E20  ; [*0333.0020.0002.2E20] # LEFT VERTICAL BAR WITH QUILL
+2E21  ; [*0334.0020.0002.2E21] # RIGHT VERTICAL BAR WITH QUILL
+2E22  ; [*0335.0020.0002.2E22] # TOP LEFT HALF BRACKET
+2E23  ; [*0336.0020.0002.2E23] # TOP RIGHT HALF BRACKET
+2E24  ; [*0337.0020.0002.2E24] # BOTTOM LEFT HALF BRACKET
+2E25  ; [*0338.0020.0002.2E25] # BOTTOM RIGHT HALF BRACKET
+2E26  ; [*0339.0020.0002.2E26] # LEFT SIDEWAYS U BRACKET
+2E27  ; [*033A.0020.0002.2E27] # RIGHT SIDEWAYS U BRACKET
+2E28  ; [*033B.0020.0002.2E28] # LEFT DOUBLE PARENTHESIS
+2E29  ; [*033C.0020.0002.2E29] # RIGHT DOUBLE PARENTHESIS
+2E2A  ; [*02DC.0020.0002.2E2A] # TWO DOTS OVER ONE DOT PUNCTUATION
+2E2B  ; [*02DD.0020.0002.2E2B] # ONE DOT OVER TWO DOTS PUNCTUATION
+2E2C  ; [*02DE.0020.0002.2E2C] # SQUARED FOUR DOT PUNCTUATION
+2E2D  ; [*02DF.0020.0002.2E2D] # FIVE DOT MARK
+2E2E  ; [*0275.0020.0002.2E2E] # REVERSED QUESTION MARK
+2E30  ; [*028D.0020.0002.2E30] # RING POINT
+2E31  ; [*0293.0020.0002.2E31] # WORD SEPARATOR MIDDLE DOT
+2FF0  ; [*10D4.0020.0002.2FF0] # IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT
+2FF1  ; [*10D5.0020.0002.2FF1] # IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW
+2FF2  ; [*10D6.0020.0002.2FF2] # IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT
+2FF3  ; [*10D7.0020.0002.2FF3] # IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW
+2FF4  ; [*10D8.0020.0002.2FF4] # IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND
+2FF5  ; [*10D9.0020.0002.2FF5] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE
+2FF6  ; [*10DA.0020.0002.2FF6] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW
+2FF7  ; [*10DB.0020.0002.2FF7] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT
+2FF8  ; [*10DC.0020.0002.2FF8] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT
+2FF9  ; [*10DD.0020.0002.2FF9] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT
+2FFA  ; [*10DE.0020.0002.2FFA] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT
+2FFB  ; [*10DF.0020.0002.2FFB] # IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
+3000  ; [*020A.0020.0003.3000] # IDEOGRAPHIC SPACE; QQK
+3001  ; [*0240.0020.0002.3001] # IDEOGRAPHIC COMMA
+3002  ; [*0291.0020.0002.3002] # IDEOGRAPHIC FULL STOP
+3003  ; [*0374.0020.0002.3003] # DITTO MARK
+3004  ; [*1104.0020.0002.3004] # JAPANESE INDUSTRIAL STANDARD SYMBOL
+3008  ; [*033D.0020.0002.3008] # LEFT ANGLE BRACKET
+3009  ; [*033E.0020.0002.3009] # RIGHT ANGLE BRACKET
+300A  ; [*033F.0020.0002.300A] # LEFT DOUBLE ANGLE BRACKET
+300B  ; [*0340.0020.0002.300B] # RIGHT DOUBLE ANGLE BRACKET
+300C  ; [*0341.0020.0002.300C] # LEFT CORNER BRACKET
+300D  ; [*0342.0020.0002.300D] # RIGHT CORNER BRACKET
+300E  ; [*0343.0020.0002.300E] # LEFT WHITE CORNER BRACKET
+300F  ; [*0344.0020.0002.300F] # RIGHT WHITE CORNER BRACKET
+3010  ; [*0345.0020.0002.3010] # LEFT BLACK LENTICULAR BRACKET
+3011  ; [*0346.0020.0002.3011] # RIGHT BLACK LENTICULAR BRACKET
+3012  ; [*1105.0020.0002.3012] # POSTAL MARK
+3013  ; [*1106.0020.0002.3013] # GETA MARK
+3014  ; [*0347.0020.0002.3014] # LEFT TORTOISE SHELL BRACKET
+3015  ; [*0348.0020.0002.3015] # RIGHT TORTOISE SHELL BRACKET
+3016  ; [*0349.0020.0002.3016] # LEFT WHITE LENTICULAR BRACKET
+3017  ; [*034A.0020.0002.3017] # RIGHT WHITE LENTICULAR BRACKET
+3018  ; [*034B.0020.0002.3018] # LEFT WHITE TORTOISE SHELL BRACKET
+3019  ; [*034C.0020.0002.3019] # RIGHT WHITE TORTOISE SHELL BRACKET
+301A  ; [*034D.0020.0002.301A] # LEFT WHITE SQUARE BRACKET
+301B  ; [*034E.0020.0002.301B] # RIGHT WHITE SQUARE BRACKET
+301C  ; [*0230.0020.0002.301C] # WAVE DASH
+301D  ; [*02FA.0020.0002.301D] # REVERSED DOUBLE PRIME QUOTATION MARK
+301E  ; [*02FB.0020.0002.301E] # DOUBLE PRIME QUOTATION MARK
+301F  ; [*02FC.0020.0002.301F] # LOW DOUBLE PRIME QUOTATION MARK
+3020  ; [*1107.0020.0002.3020] # POSTAL MARK FACE
+3030  ; [*0231.0020.0002.3030] # WAVY DASH
+3036  ; [*1105.0020.0004.3036] # CIRCLED POSTAL MARK; QQK
+3037  ; [*1108.0020.0002.3037] # IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL
+303D  ; [*0375.0020.0002.303D] # PART ALTERNATION MARK
+303E  ; [*1109.0020.0002.303E] # IDEOGRAPHIC VARIATION INDICATOR
+303F  ; [*110A.0020.0002.303F] # IDEOGRAPHIC HALF FILL SPACE
+309B  ; [*0220.0020.0002.309B] # KATAKANA-HIRAGANA VOICED SOUND MARK
+309C  ; [*0221.0020.0002.309C] # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+30A0  ; [*0232.0020.0002.30A0] # KATAKANA-HIRAGANA DOUBLE HYPHEN
+30FB  ; [*0233.0020.0002.30FB] # KATAKANA MIDDLE DOT
+3190  ; [*110B.0020.0002.3190] # IDEOGRAPHIC ANNOTATION LINKING MARK
+3191  ; [*110C.0020.0002.3191] # IDEOGRAPHIC ANNOTATION REVERSE MARK
+31C0  ; [*10E0.0020.0002.31C0] # CJK STROKE T
+31C1  ; [*10E1.0020.0002.31C1] # CJK STROKE WG
+31C2  ; [*10E2.0020.0002.31C2] # CJK STROKE XG
+31C3  ; [*10E3.0020.0002.31C3] # CJK STROKE BXG
+31C4  ; [*10E4.0020.0002.31C4] # CJK STROKE SW
+31C5  ; [*10E5.0020.0002.31C5] # CJK STROKE HZZ
+31C6  ; [*10E6.0020.0002.31C6] # CJK STROKE HZG
+31C7  ; [*10E7.0020.0002.31C7] # CJK STROKE HP
+31C8  ; [*10E8.0020.0002.31C8] # CJK STROKE HZWG
+31C9  ; [*10E9.0020.0002.31C9] # CJK STROKE SZWG
+31CA  ; [*10EA.0020.0002.31CA] # CJK STROKE HZT
+31CB  ; [*10EB.0020.0002.31CB] # CJK STROKE HZZP
+31CC  ; [*10EC.0020.0002.31CC] # CJK STROKE HPWG
+31CD  ; [*10ED.0020.0002.31CD] # CJK STROKE HZW
+31CE  ; [*10EE.0020.0002.31CE] # CJK STROKE HZZZ
+31CF  ; [*10EF.0020.0002.31CF] # CJK STROKE N
+31D0  ; [*10F0.0020.0002.31D0] # CJK STROKE H
+31D1  ; [*10F1.0020.0002.31D1] # CJK STROKE S
+31D2  ; [*10F2.0020.0002.31D2] # CJK STROKE P
+31D3  ; [*10F3.0020.0002.31D3] # CJK STROKE SP
+31D4  ; [*10F4.0020.0002.31D4] # CJK STROKE D
+31D5  ; [*10F5.0020.0002.31D5] # CJK STROKE HZ
+31D6  ; [*10F6.0020.0002.31D6] # CJK STROKE HG
+31D7  ; [*10F7.0020.0002.31D7] # CJK STROKE SZ
+31D8  ; [*10F8.0020.0002.31D8] # CJK STROKE SWZ
+31D9  ; [*10F9.0020.0002.31D9] # CJK STROKE ST
+31DA  ; [*10FA.0020.0002.31DA] # CJK STROKE SG
+31DB  ; [*10FB.0020.0002.31DB] # CJK STROKE PD
+31DC  ; [*10FC.0020.0002.31DC] # CJK STROKE PZ
+31DD  ; [*10FD.0020.0002.31DD] # CJK STROKE TN
+31DE  ; [*10FE.0020.0002.31DE] # CJK STROKE SZZ
+31DF  ; [*10FF.0020.0002.31DF] # CJK STROKE SWG
+31E0  ; [*1100.0020.0002.31E0] # CJK STROKE HXWG
+31E1  ; [*1101.0020.0002.31E1] # CJK STROKE HZZZG
+31E2  ; [*1102.0020.0002.31E2] # CJK STROKE PG
+31E3  ; [*1103.0020.0002.31E3] # CJK STROKE Q
+327F  ; [*110D.0020.0002.327F] # KOREAN STANDARD SYMBOL
+4DC0  ; [*0D3E.0020.0002.4DC0] # HEXAGRAM FOR THE CREATIVE HEAVEN
+4DC1  ; [*0D3F.0020.0002.4DC1] # HEXAGRAM FOR THE RECEPTIVE EARTH
+4DC2  ; [*0D40.0020.0002.4DC2] # HEXAGRAM FOR DIFFICULTY AT THE BEGINNING
+4DC3  ; [*0D41.0020.0002.4DC3] # HEXAGRAM FOR YOUTHFUL FOLLY
+4DC4  ; [*0D42.0020.0002.4DC4] # HEXAGRAM FOR WAITING
+4DC5  ; [*0D43.0020.0002.4DC5] # HEXAGRAM FOR CONFLICT
+4DC6  ; [*0D44.0020.0002.4DC6] # HEXAGRAM FOR THE ARMY
+4DC7  ; [*0D45.0020.0002.4DC7] # HEXAGRAM FOR HOLDING TOGETHER
+4DC8  ; [*0D46.0020.0002.4DC8] # HEXAGRAM FOR SMALL TAMING
+4DC9  ; [*0D47.0020.0002.4DC9] # HEXAGRAM FOR TREADING
+4DCA  ; [*0D48.0020.0002.4DCA] # HEXAGRAM FOR PEACE
+4DCB  ; [*0D49.0020.0002.4DCB] # HEXAGRAM FOR STANDSTILL
+4DCC  ; [*0D4A.0020.0002.4DCC] # HEXAGRAM FOR FELLOWSHIP
+4DCD  ; [*0D4B.0020.0002.4DCD] # HEXAGRAM FOR GREAT POSSESSION
+4DCE  ; [*0D4C.0020.0002.4DCE] # HEXAGRAM FOR MODESTY
+4DCF  ; [*0D4D.0020.0002.4DCF] # HEXAGRAM FOR ENTHUSIASM
+4DD0  ; [*0D4E.0020.0002.4DD0] # HEXAGRAM FOR FOLLOWING
+4DD1  ; [*0D4F.0020.0002.4DD1] # HEXAGRAM FOR WORK ON THE DECAYED
+4DD2  ; [*0D50.0020.0002.4DD2] # HEXAGRAM FOR APPROACH
+4DD3  ; [*0D51.0020.0002.4DD3] # HEXAGRAM FOR CONTEMPLATION
+4DD4  ; [*0D52.0020.0002.4DD4] # HEXAGRAM FOR BITING THROUGH
+4DD5  ; [*0D53.0020.0002.4DD5] # HEXAGRAM FOR GRACE
+4DD6  ; [*0D54.0020.0002.4DD6] # HEXAGRAM FOR SPLITTING APART
+4DD7  ; [*0D55.0020.0002.4DD7] # HEXAGRAM FOR RETURN
+4DD8  ; [*0D56.0020.0002.4DD8] # HEXAGRAM FOR INNOCENCE
+4DD9  ; [*0D57.0020.0002.4DD9] # HEXAGRAM FOR GREAT TAMING
+4DDA  ; [*0D58.0020.0002.4DDA] # HEXAGRAM FOR MOUTH CORNERS
+4DDB  ; [*0D59.0020.0002.4DDB] # HEXAGRAM FOR GREAT PREPONDERANCE
+4DDC  ; [*0D5A.0020.0002.4DDC] # HEXAGRAM FOR THE ABYSMAL WATER
+4DDD  ; [*0D5B.0020.0002.4DDD] # HEXAGRAM FOR THE CLINGING FIRE
+4DDE  ; [*0D5C.0020.0002.4DDE] # HEXAGRAM FOR INFLUENCE
+4DDF  ; [*0D5D.0020.0002.4DDF] # HEXAGRAM FOR DURATION
+4DE0  ; [*0D5E.0020.0002.4DE0] # HEXAGRAM FOR RETREAT
+4DE1  ; [*0D5F.0020.0002.4DE1] # HEXAGRAM FOR GREAT POWER
+4DE2  ; [*0D60.0020.0002.4DE2] # HEXAGRAM FOR PROGRESS
+4DE3  ; [*0D61.0020.0002.4DE3] # HEXAGRAM FOR DARKENING OF THE LIGHT
+4DE4  ; [*0D62.0020.0002.4DE4] # HEXAGRAM FOR THE FAMILY
+4DE5  ; [*0D63.0020.0002.4DE5] # HEXAGRAM FOR OPPOSITION
+4DE6  ; [*0D64.0020.0002.4DE6] # HEXAGRAM FOR OBSTRUCTION
+4DE7  ; [*0D65.0020.0002.4DE7] # HEXAGRAM FOR DELIVERANCE
+4DE8  ; [*0D66.0020.0002.4DE8] # HEXAGRAM FOR DECREASE
+4DE9  ; [*0D67.0020.0002.4DE9] # HEXAGRAM FOR INCREASE
+4DEA  ; [*0D68.0020.0002.4DEA] # HEXAGRAM FOR BREAKTHROUGH
+4DEB  ; [*0D69.0020.0002.4DEB] # HEXAGRAM FOR COMING TO MEET
+4DEC  ; [*0D6A.0020.0002.4DEC] # HEXAGRAM FOR GATHERING TOGETHER
+4DED  ; [*0D6B.0020.0002.4DED] # HEXAGRAM FOR PUSHING UPWARD
+4DEE  ; [*0D6C.0020.0002.4DEE] # HEXAGRAM FOR OPPRESSION
+4DEF  ; [*0D6D.0020.0002.4DEF] # HEXAGRAM FOR THE WELL
+4DF0  ; [*0D6E.0020.0002.4DF0] # HEXAGRAM FOR REVOLUTION
+4DF1  ; [*0D6F.0020.0002.4DF1] # HEXAGRAM FOR THE CAULDRON
+4DF2  ; [*0D70.0020.0002.4DF2] # HEXAGRAM FOR THE AROUSING THUNDER
+4DF3  ; [*0D71.0020.0002.4DF3] # HEXAGRAM FOR THE KEEPING STILL MOUNTAIN
+4DF4  ; [*0D72.0020.0002.4DF4] # HEXAGRAM FOR DEVELOPMENT
+4DF5  ; [*0D73.0020.0002.4DF5] # HEXAGRAM FOR THE MARRYING MAIDEN
+4DF6  ; [*0D74.0020.0002.4DF6] # HEXAGRAM FOR ABUNDANCE
+4DF7  ; [*0D75.0020.0002.4DF7] # HEXAGRAM FOR THE WANDERER
+4DF8  ; [*0D76.0020.0002.4DF8] # HEXAGRAM FOR THE GENTLE WIND
+4DF9  ; [*0D77.0020.0002.4DF9] # HEXAGRAM FOR THE JOYOUS LAKE
+4DFA  ; [*0D78.0020.0002.4DFA] # HEXAGRAM FOR DISPERSION
+4DFB  ; [*0D79.0020.0002.4DFB] # HEXAGRAM FOR LIMITATION
+4DFC  ; [*0D7A.0020.0002.4DFC] # HEXAGRAM FOR INNER TRUTH
+4DFD  ; [*0D7B.0020.0002.4DFD] # HEXAGRAM FOR SMALL PREPONDERANCE
+4DFE  ; [*0D7C.0020.0002.4DFE] # HEXAGRAM FOR AFTER COMPLETION
+4DFF  ; [*0D7D.0020.0002.4DFF] # HEXAGRAM FOR BEFORE COMPLETION
+A490  ; [*0DD5.0020.0002.A490] # YI RADICAL QOT
+A491  ; [*0DD6.0020.0002.A491] # YI RADICAL LI
+A492  ; [*0DD7.0020.0002.A492] # YI RADICAL KIT
+A493  ; [*0DD8.0020.0002.A493] # YI RADICAL NYIP
+A494  ; [*0DD9.0020.0002.A494] # YI RADICAL CYP
+A495  ; [*0DDA.0020.0002.A495] # YI RADICAL SSI
+A496  ; [*0DDB.0020.0002.A496] # YI RADICAL GGOP
+A497  ; [*0DDC.0020.0002.A497] # YI RADICAL GEP
+A498  ; [*0DDD.0020.0002.A498] # YI RADICAL MI
+A499  ; [*0DDE.0020.0002.A499] # YI RADICAL HXIT
+A49A  ; [*0DDF.0020.0002.A49A] # YI RADICAL LYR
+A49B  ; [*0DE0.0020.0002.A49B] # YI RADICAL BBUT
+A49C  ; [*0DE1.0020.0002.A49C] # YI RADICAL MOP
+A49D  ; [*0DE2.0020.0002.A49D] # YI RADICAL YO
+A49E  ; [*0DE3.0020.0002.A49E] # YI RADICAL PUT
+A49F  ; [*0DE4.0020.0002.A49F] # YI RADICAL HXUO
+A4A0  ; [*0DE5.0020.0002.A4A0] # YI RADICAL TAT
+A4A1  ; [*0DE6.0020.0002.A4A1] # YI RADICAL GA
+A4A2  ; [*0DE7.0020.0002.A4A2] # YI RADICAL ZUP
+A4A3  ; [*0DE8.0020.0002.A4A3] # YI RADICAL CYT
+A4A4  ; [*0DE9.0020.0002.A4A4] # YI RADICAL DDUR
+A4A5  ; [*0DEA.0020.0002.A4A5] # YI RADICAL BUR
+A4A6  ; [*0DEB.0020.0002.A4A6] # YI RADICAL GGUO
+A4A7  ; [*0DEC.0020.0002.A4A7] # YI RADICAL NYOP
+A4A8  ; [*0DED.0020.0002.A4A8] # YI RADICAL TU
+A4A9  ; [*0DEE.0020.0002.A4A9] # YI RADICAL OP
+A4AA  ; [*0DEF.0020.0002.A4AA] # YI RADICAL JJUT
+A4AB  ; [*0DF0.0020.0002.A4AB] # YI RADICAL ZOT
+A4AC  ; [*0DF1.0020.0002.A4AC] # YI RADICAL PYT
+A4AD  ; [*0DF2.0020.0002.A4AD] # YI RADICAL HMO
+A4AE  ; [*0DF3.0020.0002.A4AE] # YI RADICAL YIT
+A4AF  ; [*0DF4.0020.0002.A4AF] # YI RADICAL VUR
+A4B0  ; [*0DF5.0020.0002.A4B0] # YI RADICAL SHY
+A4B1  ; [*0DF6.0020.0002.A4B1] # YI RADICAL VEP
+A4B2  ; [*0DF7.0020.0002.A4B2] # YI RADICAL ZA
+A4B3  ; [*0DF8.0020.0002.A4B3] # YI RADICAL JO
+A4B4  ; [*0DF9.0020.0002.A4B4] # YI RADICAL NZUP
+A4B5  ; [*0DFA.0020.0002.A4B5] # YI RADICAL JJY
+A4B6  ; [*0DFB.0020.0002.A4B6] # YI RADICAL GOT
+A4B7  ; [*0DFC.0020.0002.A4B7] # YI RADICAL JJIE
+A4B8  ; [*0DFD.0020.0002.A4B8] # YI RADICAL WO
+A4B9  ; [*0DFE.0020.0002.A4B9] # YI RADICAL DU
+A4BA  ; [*0DFF.0020.0002.A4BA] # YI RADICAL SHUR
+A4BB  ; [*0E00.0020.0002.A4BB] # YI RADICAL LIE
+A4BC  ; [*0E01.0020.0002.A4BC] # YI RADICAL CY
+A4BD  ; [*0E02.0020.0002.A4BD] # YI RADICAL CUOP
+A4BE  ; [*0E03.0020.0002.A4BE] # YI RADICAL CIP
+A4BF  ; [*0E04.0020.0002.A4BF] # YI RADICAL HXOP
+A4C0  ; [*0E05.0020.0002.A4C0] # YI RADICAL SHAT
+A4C1  ; [*0E06.0020.0002.A4C1] # YI RADICAL ZUR
+A4C2  ; [*0E07.0020.0002.A4C2] # YI RADICAL SHOP
+A4C3  ; [*0E08.0020.0002.A4C3] # YI RADICAL CHE
+A4C4  ; [*0E09.0020.0002.A4C4] # YI RADICAL ZZIET
+A4C5  ; [*0E0A.0020.0002.A4C5] # YI RADICAL NBIE
+A4C6  ; [*0E0B.0020.0002.A4C6] # YI RADICAL KE
+A4FE  ; [*023D.0020.0002.A4FE] # LISU PUNCTUATION COMMA
+A4FF  ; [*028E.0020.0002.A4FF] # LISU PUNCTUATION FULL STOP
+A60D  ; [*023E.0020.0002.A60D] # VAI COMMA
+A60E  ; [*028F.0020.0002.A60E] # VAI FULL STOP
+A60F  ; [*027D.0020.0002.A60F] # VAI QUESTION MARK
+A670  ; [.0000.0000.0000.A670] # COMBINING CYRILLIC TEN MILLIONS SIGN
+A671  ; [.0000.0000.0000.A671] # COMBINING CYRILLIC HUNDRED MILLIONS SIGN
+A672  ; [.0000.0000.0000.A672] # COMBINING CYRILLIC THOUSAND MILLIONS SIGN
+A673  ; [*035B.0020.0002.A673] # SLAVONIC ASTERISK
+A67E  ; [*0391.0020.0002.A67E] # CYRILLIC KAVYKA
+A6F2  ; [*02C8.0020.0002.A6F2] # BAMUM NJAEMLI
+A6F3  ; [*0290.0020.0002.A6F3] # BAMUM FULL STOP
+A6F4  ; [*026D.0020.0002.A6F4] # BAMUM COLON
+A6F5  ; [*023F.0020.0002.A6F5] # BAMUM COMMA
+A6F6  ; [*0246.0020.0002.A6F6] # BAMUM SEMICOLON
+A6F7  ; [*027E.0020.0002.A6F7] # BAMUM QUESTION MARK
+A700  ; [*0426.0020.0002.A700] # MODIFIER LETTER CHINESE TONE YIN PING
+A701  ; [*0427.0020.0002.A701] # MODIFIER LETTER CHINESE TONE YANG PING
+A702  ; [*0428.0020.0002.A702] # MODIFIER LETTER CHINESE TONE YIN SHANG
+A703  ; [*0429.0020.0002.A703] # MODIFIER LETTER CHINESE TONE YANG SHANG
+A704  ; [*042A.0020.0002.A704] # MODIFIER LETTER CHINESE TONE YIN QU
+A705  ; [*042B.0020.0002.A705] # MODIFIER LETTER CHINESE TONE YANG QU
+A706  ; [*042C.0020.0002.A706] # MODIFIER LETTER CHINESE TONE YIN RU
+A707  ; [*042D.0020.0002.A707] # MODIFIER LETTER CHINESE TONE YANG RU
+A708  ; [*042E.0020.0002.A708] # MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR
+A709  ; [*042F.0020.0002.A709] # MODIFIER LETTER HIGH DOTTED TONE BAR
+A70A  ; [*0430.0020.0002.A70A] # MODIFIER LETTER MID DOTTED TONE BAR
+A70B  ; [*0431.0020.0002.A70B] # MODIFIER LETTER LOW DOTTED TONE BAR
+A70C  ; [*0432.0020.0002.A70C] # MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR
+A70D  ; [*0433.0020.0002.A70D] # MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR
+A70E  ; [*0434.0020.0002.A70E] # MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR
+A70F  ; [*0435.0020.0002.A70F] # MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR
+A710  ; [*0436.0020.0002.A710] # MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR
+A711  ; [*0437.0020.0002.A711] # MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR
+A712  ; [*0438.0020.0002.A712] # MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR
+A713  ; [*0439.0020.0002.A713] # MODIFIER LETTER HIGH LEFT-STEM TONE BAR
+A714  ; [*043A.0020.0002.A714] # MODIFIER LETTER MID LEFT-STEM TONE BAR
+A715  ; [*043B.0020.0002.A715] # MODIFIER LETTER LOW LEFT-STEM TONE BAR
+A716  ; [*043C.0020.0002.A716] # MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR
+A717  ; [*043D.0020.0002.A717] # MODIFIER LETTER DOT VERTICAL BAR
+A718  ; [*043E.0020.0002.A718] # MODIFIER LETTER DOT SLASH
+A719  ; [*043F.0020.0002.A719] # MODIFIER LETTER DOT HORIZONTAL BAR
+A71A  ; [*0440.0020.0002.A71A] # MODIFIER LETTER LOWER RIGHT CORNER ANGLE
+A71B  ; [*0441.0020.0002.A71B] # MODIFIER LETTER RAISED UP ARROW
+A71C  ; [*0442.0020.0002.A71C] # MODIFIER LETTER RAISED DOWN ARROW
+A71D  ; [*0443.0020.0002.A71D] # MODIFIER LETTER RAISED EXCLAMATION MARK
+A71E  ; [*0444.0020.0002.A71E] # MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK
+A71F  ; [*0445.0020.0002.A71F] # MODIFIER LETTER LOW INVERTED EXCLAMATION MARK
+A720  ; [*0446.0020.0002.A720] # MODIFIER LETTER STRESS AND HIGH TONE
+A721  ; [*0447.0020.0002.A721] # MODIFIER LETTER STRESS AND LOW TONE
+A788  ; [*0448.0020.0002.A788] # MODIFIER LETTER LOW CIRCUMFLEX ACCENT
+A789  ; [*0449.0020.0002.A789] # MODIFIER LETTER COLON
+A78A  ; [*044A.0020.0002.A78A] # MODIFIER LETTER SHORT EQUALS SIGN
+A828  ; [*0460.0020.0002.A828] # SYLOTI NAGRI POETRY MARK-1
+A829  ; [*0461.0020.0002.A829] # SYLOTI NAGRI POETRY MARK-2
+A82A  ; [*0462.0020.0002.A82A] # SYLOTI NAGRI POETRY MARK-3
+A82B  ; [*0463.0020.0002.A82B] # SYLOTI NAGRI POETRY MARK-4
+A830  ; [*1116.0020.0002.A830] # NORTH INDIC FRACTION ONE QUARTER
+A831  ; [*1117.0020.0002.A831] # NORTH INDIC FRACTION ONE HALF
+A832  ; [*1118.0020.0002.A832] # NORTH INDIC FRACTION THREE QUARTERS
+A833  ; [*1119.0020.0002.A833] # NORTH INDIC FRACTION ONE SIXTEENTH
+A834  ; [*111A.0020.0002.A834] # NORTH INDIC FRACTION ONE EIGHTH
+A835  ; [*111B.0020.0002.A835] # NORTH INDIC FRACTION THREE SIXTEENTHS
+A836  ; [*0464.0020.0002.A836] # NORTH INDIC QUARTER MARK
+A837  ; [*0465.0020.0002.A837] # NORTH INDIC PLACEHOLDER MARK
+A839  ; [*0466.0020.0002.A839] # NORTH INDIC QUANTITY MARK
+A874  ; [*03D9.0020.0002.A874] # PHAGS-PA SINGLE HEAD MARK
+A875  ; [*03DA.0020.0002.A875] # PHAGS-PA DOUBLE HEAD MARK
+A876  ; [*029A.0020.0002.A876] # PHAGS-PA MARK SHAD
+A877  ; [*029B.0020.0002.A877] # PHAGS-PA MARK DOUBLE SHAD
+A8CE  ; [*0296.0020.0002.A8CE] # SAURASHTRA DANDA
+A8CF  ; [*0297.0020.0002.A8CF] # SAURASHTRA DOUBLE DANDA
+A8E0  ; [.0000.0000.0000.A8E0] # COMBINING DEVANAGARI DIGIT ZERO
+A8E1  ; [.0000.0000.0000.A8E1] # COMBINING DEVANAGARI DIGIT ONE
+A8E2  ; [.0000.0000.0000.A8E2] # COMBINING DEVANAGARI DIGIT TWO
+A8E3  ; [.0000.0000.0000.A8E3] # COMBINING DEVANAGARI DIGIT THREE
+A8E4  ; [.0000.0000.0000.A8E4] # COMBINING DEVANAGARI DIGIT FOUR
+A8E5  ; [.0000.0000.0000.A8E5] # COMBINING DEVANAGARI DIGIT FIVE
+A8E6  ; [.0000.0000.0000.A8E6] # COMBINING DEVANAGARI DIGIT SIX
+A8E7  ; [.0000.0000.0000.A8E7] # COMBINING DEVANAGARI DIGIT SEVEN
+A8E8  ; [.0000.0000.0000.A8E8] # COMBINING DEVANAGARI DIGIT EIGHT
+A8E9  ; [.0000.0000.0000.A8E9] # COMBINING DEVANAGARI DIGIT NINE
+A8EA  ; [.0000.0000.0000.A8EA] # COMBINING DEVANAGARI LETTER A
+A8EB  ; [.0000.0000.0000.A8EB] # COMBINING DEVANAGARI LETTER U
+A8EC  ; [.0000.0000.0000.A8EC] # COMBINING DEVANAGARI LETTER KA
+A8ED  ; [.0000.0000.0000.A8ED] # COMBINING DEVANAGARI LETTER NA
+A8EE  ; [.0000.0000.0000.A8EE] # COMBINING DEVANAGARI LETTER PA
+A8EF  ; [.0000.0000.0000.A8EF] # COMBINING DEVANAGARI LETTER RA
+A8F0  ; [.0000.0000.0000.A8F0] # COMBINING DEVANAGARI LETTER VI
+A8F1  ; [.0000.0000.0000.A8F1] # COMBINING DEVANAGARI SIGN AVAGRAHA
+A8F8  ; [*03A2.0020.0002.A8F8] # DEVANAGARI SIGN PUSHPIKA
+A8F9  ; [*03A3.0020.0002.A8F9] # DEVANAGARI GAP FILLER
+A8FA  ; [*03A4.0020.0002.A8FA] # DEVANAGARI CARET
+A92E  ; [*03DB.0020.0002.A92E] # KAYAH LI SIGN CWI
+A92F  ; [*029E.0020.0002.A92F] # KAYAH LI SIGN SHYA
+A95F  ; [*02C9.0020.0002.A95F] # REJANG SECTION MARK
+A9C1  ; [*02BE.0020.0002.A9C1] # JAVANESE LEFT RERENGGAN
+A9C2  ; [*02BF.0020.0002.A9C2] # JAVANESE RIGHT RERENGGAN
+A9C3  ; [*02C0.0020.0002.A9C3] # JAVANESE PADA ANDAP
+A9C4  ; [*02C1.0020.0002.A9C4] # JAVANESE PADA MADYA
+A9C5  ; [*02C2.0020.0002.A9C5] # JAVANESE PADA LUHUR
+A9C6  ; [*02C3.0020.0002.A9C6] # JAVANESE PADA WINDU
+A9C7  ; [*0269.0020.0002.A9C7] # JAVANESE PADA PANGKAT
+A9C8  ; [*02A9.0020.0002.A9C8] # JAVANESE PADA LINGSA
+A9C9  ; [*02AA.0020.0002.A9C9] # JAVANESE PADA LUNGSI
+A9CA  ; [*02C4.0020.0002.A9CA] # JAVANESE PADA ADEG
+A9CB  ; [*02C5.0020.0002.A9CB] # JAVANESE PADA ADEG ADEG
+A9CC  ; [*02C6.0020.0002.A9CC] # JAVANESE PADA PISELEH
+A9CD  ; [*02C7.0020.0002.A9CD] # JAVANESE TURNED PADA PISELEH
+A9DE  ; [*03DC.0020.0002.A9DE] # JAVANESE PADA TIRTA TUMETES
+A9DF  ; [*03DD.0020.0002.A9DF] # JAVANESE PADA ISEN-ISEN
+AA5C  ; [*03DE.0020.0002.AA5C] # CHAM PUNCTUATION SPIRAL
+AA5D  ; [*02AB.0020.0002.AA5D] # CHAM PUNCTUATION DANDA
+AA5E  ; [*02AC.0020.0002.AA5E] # CHAM PUNCTUATION DOUBLE DANDA
+AA5F  ; [*02AD.0020.0002.AA5F] # CHAM PUNCTUATION TRIPLE DANDA
+AA77  ; [*03C8.0020.0002.AA77] # MYANMAR SYMBOL AITON EXCLAMATION
+AA78  ; [*03C9.0020.0002.AA78] # MYANMAR SYMBOL AITON ONE
+AA79  ; [*03CA.0020.0002.AA79] # MYANMAR SYMBOL AITON TWO
+AADE  ; [*03A8.0020.0002.AADE] # TAI VIET SYMBOL HO HOI
+AADF  ; [*03A9.0020.0002.AADF] # TAI VIET SYMBOL KOI KOI
+ABEB  ; [*02AE.0020.0002.ABEB] # MEETEI MAYEK CHEIKHEI
+FB29  ; [*0550.0020.0005.FB29] # HEBREW LETTER ALTERNATIVE PLUS SIGN; QQK
+FD3E  ; [*034F.0020.0002.FD3E] # ORNATE LEFT PARENTHESIS
+FD3F  ; [*0350.0020.0002.FD3F] # ORNATE RIGHT PARENTHESIS
+FDFD  ; [*0451.0020.0002.FDFD] # ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM
+FE10  ; [*0234.0020.0016.FE10] # PRESENTATION FORM FOR VERTICAL COMMA; QQK
+FE11  ; [*0240.0020.0016.FE11] # PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA; QQK
+FE12  ; [*0291.0020.0016.FE12] # PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP; QQK
+FE13  ; [*0247.0020.0016.FE13] # PRESENTATION FORM FOR VERTICAL COLON; QQK
+FE14  ; [*0243.0020.0016.FE14] # PRESENTATION FORM FOR VERTICAL SEMICOLON; QQK
+FE15  ; [*026E.0020.0016.FE15] # PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK; QQK
+FE16  ; [*0273.0020.0016.FE16] # PRESENTATION FORM FOR VERTICAL QUESTION MARK; QQK
+FE17  ; [*0349.0020.0016.FE17] # PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET; QQK
+FE18  ; [*034A.0020.0016.FE18] # PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET; QQK
+FE19  ; [*0281.0020.0016.FE19][*0281.0020.0016.FE19][*0281.0020.001F.FE19] # PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS; QQKN
+FE21  ; [.0000.0000.0000.FE21] # COMBINING LIGATURE RIGHT HALF
+FE23  ; [.0000.0000.0000.FE23] # COMBINING DOUBLE TILDE RIGHT HALF
+FE24  ; [.0000.0000.0000.FE24] # COMBINING MACRON LEFT HALF
+FE25  ; [.0000.0000.0000.FE25] # COMBINING MACRON RIGHT HALF
+FE26  ; [.0000.0000.0000.FE26] # COMBINING CONJOINING MACRON
+FE30  ; [*0281.0020.0016.FE30][*0281.0020.0016.FE30] # PRESENTATION FORM FOR VERTICAL TWO DOT LEADER; QQKN
+FE31  ; [*022C.0020.0016.FE31] # PRESENTATION FORM FOR VERTICAL EM DASH; QQK
+FE32  ; [*022B.0020.0016.FE32] # PRESENTATION FORM FOR VERTICAL EN DASH; QQK
+FE33  ; [*021D.0020.0016.FE33] # PRESENTATION FORM FOR VERTICAL LOW LINE; QQK
+FE34  ; [*021D.0020.0016.FE34] # PRESENTATION FORM FOR VERTICAL WAVY LOW LINE; QQK
+FE35  ; [*02FF.0020.0016.FE35] # PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS; QQK
+FE36  ; [*0300.0020.0016.FE36] # PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS; QQK
+FE37  ; [*0303.0020.0016.FE37] # PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET; QQK
+FE38  ; [*0304.0020.0016.FE38] # PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET; QQK
+FE39  ; [*0347.0020.0016.FE39] # PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET; QQK
+FE3A  ; [*0348.0020.0016.FE3A] # PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET; QQK
+FE3B  ; [*0345.0020.0016.FE3B] # PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET; QQK
+FE3C  ; [*0346.0020.0016.FE3C] # PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET; QQK
+FE3D  ; [*033F.0020.0016.FE3D] # PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET; QQK
+FE3E  ; [*0340.0020.0016.FE3E] # PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET; QQK
+FE3F  ; [*033D.0020.0016.FE3F] # PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET; QQK
+FE40  ; [*033E.0020.0016.FE40] # PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET; QQK
+FE41  ; [*0341.0020.0016.FE41] # PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET; QQK
+FE42  ; [*0342.0020.0016.FE42] # PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET; QQK
+FE43  ; [*0343.0020.0016.FE43] # PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET; QQK
+FE44  ; [*0344.0020.0016.FE44] # PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET; QQK
+FE45  ; [*0241.0020.0002.FE45] # SESAME DOT
+FE46  ; [*0242.0020.0002.FE46] # WHITE SESAME DOT
+FE47  ; [*0301.0020.0016.FE47] # PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET; QQK
+FE48  ; [*0302.0020.0016.FE48] # PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET; QQK
+FE49  ; [*0213.0020.0004.FE49] # DASHED OVERLINE; QQK
+FE4A  ; [*0213.0020.0004.FE4A] # CENTRELINE OVERLINE; QQK
+FE4B  ; [*0213.0020.0004.FE4B] # WAVY OVERLINE; QQK
+FE4C  ; [*0213.0020.0004.FE4C] # DOUBLE WAVY OVERLINE; QQK
+FE4D  ; [*021D.0020.0004.FE4D] # DASHED LOW LINE; QQK
+FE4E  ; [*021D.0020.0004.FE4E] # CENTRELINE LOW LINE; QQK
+FE4F  ; [*021D.0020.0004.FE4F] # WAVY LOW LINE; QQK
+FE50  ; [*0234.0020.000F.FE50] # SMALL COMMA; QQK
+FE51  ; [*0240.0020.000F.FE51] # SMALL IDEOGRAPHIC COMMA; QQK
+FE52  ; [*0281.0020.000F.FE52] # SMALL FULL STOP; QQK
+FE54  ; [*0243.0020.000F.FE54] # SMALL SEMICOLON; QQK
+FE55  ; [*0247.0020.000F.FE55] # SMALL COLON; QQK
+FE56  ; [*0273.0020.000F.FE56] # SMALL QUESTION MARK; QQK
+FE57  ; [*026E.0020.000F.FE57] # SMALL EXCLAMATION MARK; QQK
+FE58  ; [*022C.0020.000F.FE58] # SMALL EM DASH; QQK
+FE59  ; [*02FF.0020.000F.FE59] # SMALL LEFT PARENTHESIS; QQK
+FE5A  ; [*0300.0020.000F.FE5A] # SMALL RIGHT PARENTHESIS; QQK
+FE5B  ; [*0303.0020.000F.FE5B] # SMALL LEFT CURLY BRACKET; QQK
+FE5C  ; [*0304.0020.000F.FE5C] # SMALL RIGHT CURLY BRACKET; QQK
+FE5D  ; [*0347.0020.000F.FE5D] # SMALL LEFT TORTOISE SHELL BRACKET; QQK
+FE5E  ; [*0348.0020.000F.FE5E] # SMALL RIGHT TORTOISE SHELL BRACKET; QQK
+FE5F  ; [*0362.0020.000F.FE5F] # SMALL NUMBER SIGN; QQK
+FE60  ; [*035F.0020.000F.FE60] # SMALL AMPERSAND; QQK
+FE61  ; [*0357.0020.000F.FE61] # SMALL ASTERISK; QQK
+FE62  ; [*0550.0020.000F.FE62] # SMALL PLUS SIGN; QQK
+FE63  ; [*0223.0020.000F.FE63] # SMALL HYPHEN-MINUS; QQK
+FE64  ; [*0554.0020.000F.FE64] # SMALL LESS-THAN SIGN; QQK
+FE65  ; [*0556.0020.000F.FE65] # SMALL GREATER-THAN SIGN; QQK
+FE66  ; [*0555.0020.000F.FE66] # SMALL EQUALS SIGN; QQK
+FE68  ; [*035E.0020.000F.FE68] # SMALL REVERSE SOLIDUS; QQK
+FE6A  ; [*0363.0020.000F.FE6A] # SMALL PERCENT SIGN; QQK
+FE6B  ; [*0356.0020.000F.FE6B] # SMALL COMMERCIAL AT; QQK
+FE73  ; [.0000.0000.0000.FE73] # ARABIC TAIL FRAGMENT
+FF01  ; [*026E.0020.0003.FF01] # FULLWIDTH EXCLAMATION MARK; QQK
+FF02  ; [*02F5.0020.0003.FF02] # FULLWIDTH QUOTATION MARK; QQK
+FF03  ; [*0362.0020.0003.FF03] # FULLWIDTH NUMBER SIGN; QQK
+FF05  ; [*0363.0020.0003.FF05] # FULLWIDTH PERCENT SIGN; QQK
+FF06  ; [*035F.0020.0003.FF06] # FULLWIDTH AMPERSAND; QQK
+FF07  ; [*02EE.0020.0003.FF07] # FULLWIDTH APOSTROPHE; QQK
+FF08  ; [*02FF.0020.0003.FF08] # FULLWIDTH LEFT PARENTHESIS; QQK
+FF09  ; [*0300.0020.0003.FF09] # FULLWIDTH RIGHT PARENTHESIS; QQK
+FF0A  ; [*0357.0020.0003.FF0A] # FULLWIDTH ASTERISK; QQK
+FF0B  ; [*0550.0020.0003.FF0B] # FULLWIDTH PLUS SIGN; QQK
+FF0C  ; [*0234.0020.0003.FF0C] # FULLWIDTH COMMA; QQK
+FF0D  ; [*0223.0020.0003.FF0D] # FULLWIDTH HYPHEN-MINUS; QQK
+FF0E  ; [*0281.0020.0003.FF0E] # FULLWIDTH FULL STOP; QQK
+FF0F  ; [*035C.0020.0003.FF0F] # FULLWIDTH SOLIDUS; QQK
+FF1A  ; [*0247.0020.0003.FF1A] # FULLWIDTH COLON; QQK
+FF1B  ; [*0243.0020.0003.FF1B] # FULLWIDTH SEMICOLON; QQK
+FF1C  ; [*0554.0020.0003.FF1C] # FULLWIDTH LESS-THAN SIGN; QQK
+FF1D  ; [*0555.0020.0003.FF1D] # FULLWIDTH EQUALS SIGN; QQK
+FF1E  ; [*0556.0020.0003.FF1E] # FULLWIDTH GREATER-THAN SIGN; QQK
+FF1F  ; [*0273.0020.0003.FF1F] # FULLWIDTH QUESTION MARK; QQK
+FF20  ; [*0356.0020.0003.FF20] # FULLWIDTH COMMERCIAL AT; QQK
+FF3B  ; [*0301.0020.0003.FF3B] # FULLWIDTH LEFT SQUARE BRACKET; QQK
+FF3C  ; [*035E.0020.0003.FF3C] # FULLWIDTH REVERSE SOLIDUS; QQK
+FF3D  ; [*0302.0020.0003.FF3D] # FULLWIDTH RIGHT SQUARE BRACKET; QQK
+FF3E  ; [*0211.0020.0003.FF3E] # FULLWIDTH CIRCUMFLEX ACCENT; QQK
+FF3F  ; [*021D.0020.0003.FF3F] # FULLWIDTH LOW LINE; QQK
+FF40  ; [*020E.0020.0003.FF40] # FULLWIDTH GRAVE ACCENT; QQK
+FF5B  ; [*0303.0020.0003.FF5B] # FULLWIDTH LEFT CURLY BRACKET; QQK
+FF5C  ; [*0558.0020.0003.FF5C] # FULLWIDTH VERTICAL LINE; QQK
+FF5D  ; [*0304.0020.0003.FF5D] # FULLWIDTH RIGHT CURLY BRACKET; QQK
+FF5E  ; [*055B.0020.0003.FF5E] # FULLWIDTH TILDE; QQK
+FF5F  ; [*0311.0020.0003.FF5F] # FULLWIDTH LEFT WHITE PARENTHESIS; QQK
+FF60  ; [*0312.0020.0003.FF60] # FULLWIDTH RIGHT WHITE PARENTHESIS; QQK
+FF61  ; [*0291.0020.0012.FF61] # HALFWIDTH IDEOGRAPHIC FULL STOP; QQK
+FF62  ; [*0341.0020.0012.FF62] # HALFWIDTH LEFT CORNER BRACKET; QQK
+FF63  ; [*0342.0020.0012.FF63] # HALFWIDTH RIGHT CORNER BRACKET; QQK
+FF64  ; [*0240.0020.0012.FF64] # HALFWIDTH IDEOGRAPHIC COMMA; QQK
+FF65  ; [*0233.0020.0012.FF65] # HALFWIDTH KATAKANA MIDDLE DOT; QQK
+FFE2  ; [*0557.0020.0003.FFE2] # FULLWIDTH NOT SIGN; QQK
+FFE3  ; [*0212.0020.0003.FFE3] # FULLWIDTH MACRON; QQK
+FFE4  ; [*0559.0020.0003.FFE4] # FULLWIDTH BROKEN BAR; QQK
+FFE8  ; [*0740.0020.0012.FFE8] # HALFWIDTH FORMS LIGHT VERTICAL; QQK
+FFE9  ; [*04D6.0020.0012.FFE9] # HALFWIDTH LEFTWARDS ARROW; QQK
+FFEA  ; [*04D8.0020.0012.FFEA] # HALFWIDTH UPWARDS ARROW; QQK
+FFEB  ; [*04D7.0020.0012.FFEB] # HALFWIDTH RIGHTWARDS ARROW; QQK
+FFEC  ; [*04D9.0020.0012.FFEC] # HALFWIDTH DOWNWARDS ARROW; QQK
+FFED  ; [*07DE.0020.0012.FFED] # HALFWIDTH BLACK SQUARE; QQK
+FFEE  ; [*0809.0020.0012.FFEE] # HALFWIDTH WHITE CIRCLE; QQK
+FFFC  ; [*110E.0020.0002.FFFC] # OBJECT REPLACEMENT CHARACTER
+FFFD  ; [*110F.0020.0002.FFFD] # REPLACEMENT CHARACTER
+10100 ; [*02E4.0020.0002.10100] # AEGEAN WORD SEPARATOR LINE
+10101 ; [*02E5.0020.0002.10101] # AEGEAN WORD SEPARATOR DOT
+10102 ; [*02E6.0020.0002.10102] # AEGEAN CHECK MARK
+10110 ; [*114F.0020.0002.10110] # AEGEAN NUMBER TEN
+10111 ; [*1150.0020.0002.10111] # AEGEAN NUMBER TWENTY
+10112 ; [*1151.0020.0002.10112] # AEGEAN NUMBER THIRTY
+10113 ; [*1152.0020.0002.10113] # AEGEAN NUMBER FORTY
+10114 ; [*1153.0020.0002.10114] # AEGEAN NUMBER FIFTY
+10115 ; [*1154.0020.0002.10115] # AEGEAN NUMBER SIXTY
+10116 ; [*1155.0020.0002.10116] # AEGEAN NUMBER SEVENTY
+10117 ; [*1156.0020.0002.10117] # AEGEAN NUMBER EIGHTY
+10118 ; [*1157.0020.0002.10118] # AEGEAN NUMBER NINETY
+10119 ; [*1158.0020.0002.10119] # AEGEAN NUMBER ONE HUNDRED
+1011A ; [*1159.0020.0002.1011A] # AEGEAN NUMBER TWO HUNDRED
+1011B ; [*115A.0020.0002.1011B] # AEGEAN NUMBER THREE HUNDRED
+1011C ; [*115B.0020.0002.1011C] # AEGEAN NUMBER FOUR HUNDRED
+1011D ; [*115C.0020.0002.1011D] # AEGEAN NUMBER FIVE HUNDRED
+1011E ; [*115D.0020.0002.1011E] # AEGEAN NUMBER SIX HUNDRED
+1011F ; [*115E.0020.0002.1011F] # AEGEAN NUMBER SEVEN HUNDRED
+10120 ; [*115F.0020.0002.10120] # AEGEAN NUMBER EIGHT HUNDRED
+10121 ; [*1160.0020.0002.10121] # AEGEAN NUMBER NINE HUNDRED
+10122 ; [*1161.0020.0002.10122] # AEGEAN NUMBER ONE THOUSAND
+10123 ; [*1162.0020.0002.10123] # AEGEAN NUMBER TWO THOUSAND
+10124 ; [*1163.0020.0002.10124] # AEGEAN NUMBER THREE THOUSAND
+10125 ; [*1164.0020.0002.10125] # AEGEAN NUMBER FOUR THOUSAND
+10126 ; [*1165.0020.0002.10126] # AEGEAN NUMBER FIVE THOUSAND
+10127 ; [*1166.0020.0002.10127] # AEGEAN NUMBER SIX THOUSAND
+10128 ; [*1167.0020.0002.10128] # AEGEAN NUMBER SEVEN THOUSAND
+10129 ; [*1168.0020.0002.10129] # AEGEAN NUMBER EIGHT THOUSAND
+1012A ; [*1169.0020.0002.1012A] # AEGEAN NUMBER NINE THOUSAND
+1012B ; [*116A.0020.0002.1012B] # AEGEAN NUMBER TEN THOUSAND
+1012C ; [*116B.0020.0002.1012C] # AEGEAN NUMBER TWENTY THOUSAND
+1012D ; [*116C.0020.0002.1012D] # AEGEAN NUMBER THIRTY THOUSAND
+1012E ; [*116D.0020.0002.1012E] # AEGEAN NUMBER FORTY THOUSAND
+1012F ; [*116E.0020.0002.1012F] # AEGEAN NUMBER FIFTY THOUSAND
+10130 ; [*116F.0020.0002.10130] # AEGEAN NUMBER SIXTY THOUSAND
+10131 ; [*1170.0020.0002.10131] # AEGEAN NUMBER SEVENTY THOUSAND
+10132 ; [*1171.0020.0002.10132] # AEGEAN NUMBER EIGHTY THOUSAND
+10133 ; [*1172.0020.0002.10133] # AEGEAN NUMBER NINETY THOUSAND
+10137 ; [*0E0C.0020.0002.10137] # AEGEAN WEIGHT BASE UNIT
+10138 ; [*0E0D.0020.0002.10138] # AEGEAN WEIGHT FIRST SUBUNIT
+10139 ; [*0E0E.0020.0002.10139] # AEGEAN WEIGHT SECOND SUBUNIT
+1013A ; [*0E0F.0020.0002.1013A] # AEGEAN WEIGHT THIRD SUBUNIT
+1013B ; [*0E10.0020.0002.1013B] # AEGEAN WEIGHT FOURTH SUBUNIT
+1013C ; [*0E11.0020.0002.1013C] # AEGEAN DRY MEASURE FIRST SUBUNIT
+1013D ; [*0E12.0020.0002.1013D] # AEGEAN LIQUID MEASURE FIRST SUBUNIT
+1013E ; [*0E13.0020.0002.1013E] # AEGEAN MEASURE SECOND SUBUNIT
+1013F ; [*0E14.0020.0002.1013F] # AEGEAN MEASURE THIRD SUBUNIT
+10140 ; [*1173.0020.0002.10140] # GREEK ACROPHONIC ATTIC ONE QUARTER
+10141 ; [*1174.0020.0002.10141] # GREEK ACROPHONIC ATTIC ONE HALF
+10144 ; [*1175.0020.0002.10144] # GREEK ACROPHONIC ATTIC FIFTY
+10145 ; [*1176.0020.0002.10145] # GREEK ACROPHONIC ATTIC FIVE HUNDRED
+10146 ; [*1177.0020.0002.10146] # GREEK ACROPHONIC ATTIC FIVE THOUSAND
+10147 ; [*1178.0020.0002.10147] # GREEK ACROPHONIC ATTIC FIFTY THOUSAND
+10149 ; [*1179.0020.0002.10149] # GREEK ACROPHONIC ATTIC TEN TALENTS
+1014A ; [*117A.0020.0002.1014A] # GREEK ACROPHONIC ATTIC FIFTY TALENTS
+1014B ; [*117B.0020.0002.1014B] # GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS
+1014C ; [*117C.0020.0002.1014C] # GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS
+1014D ; [*117D.0020.0002.1014D] # GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS
+1014E ; [*117E.0020.0002.1014E] # GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS
+10150 ; [*117F.0020.0002.10150] # GREEK ACROPHONIC ATTIC TEN STATERS
+10151 ; [*1180.0020.0002.10151] # GREEK ACROPHONIC ATTIC FIFTY STATERS
+10152 ; [*1181.0020.0002.10152] # GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS
+10153 ; [*1182.0020.0002.10153] # GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS
+10154 ; [*1183.0020.0002.10154] # GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS
+10155 ; [*1184.0020.0002.10155] # GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS
+10156 ; [*1185.0020.0002.10156] # GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS
+10157 ; [*1186.0020.0002.10157] # GREEK ACROPHONIC ATTIC TEN MNAS
+10160 ; [*1187.0020.0002.10160] # GREEK ACROPHONIC TROEZENIAN TEN
+10161 ; [*1188.0020.0002.10161] # GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM
+10162 ; [*1189.0020.0002.10162] # GREEK ACROPHONIC HERMIONIAN TEN
+10163 ; [*118A.0020.0002.10163] # GREEK ACROPHONIC MESSENIAN TEN
+10164 ; [*118B.0020.0002.10164] # GREEK ACROPHONIC THESPIAN TEN
+10165 ; [*118C.0020.0002.10165] # GREEK ACROPHONIC THESPIAN THIRTY
+10166 ; [*118D.0020.0002.10166] # GREEK ACROPHONIC TROEZENIAN FIFTY
+10167 ; [*118E.0020.0002.10167] # GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM
+10168 ; [*118F.0020.0002.10168] # GREEK ACROPHONIC HERMIONIAN FIFTY
+10169 ; [*1190.0020.0002.10169] # GREEK ACROPHONIC THESPIAN FIFTY
+1016A ; [*1191.0020.0002.1016A] # GREEK ACROPHONIC THESPIAN ONE HUNDRED
+1016B ; [*1192.0020.0002.1016B] # GREEK ACROPHONIC THESPIAN THREE HUNDRED
+1016C ; [*1193.0020.0002.1016C] # GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED
+1016D ; [*1194.0020.0002.1016D] # GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED
+1016E ; [*1195.0020.0002.1016E] # GREEK ACROPHONIC THESPIAN FIVE HUNDRED
+1016F ; [*1196.0020.0002.1016F] # GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED
+10170 ; [*1197.0020.0002.10170] # GREEK ACROPHONIC NAXIAN FIVE HUNDRED
+10171 ; [*1198.0020.0002.10171] # GREEK ACROPHONIC THESPIAN ONE THOUSAND
+10172 ; [*1199.0020.0002.10172] # GREEK ACROPHONIC THESPIAN FIVE THOUSAND
+10174 ; [*119A.0020.0002.10174] # GREEK ACROPHONIC STRATIAN FIFTY MNAS
+10175 ; [*119B.0020.0002.10175] # GREEK ONE HALF SIGN
+10176 ; [*119C.0020.0002.10176] # GREEK ONE HALF SIGN ALTERNATE FORM
+10177 ; [*119D.0020.0002.10177] # GREEK TWO THIRDS SIGN
+10178 ; [*119E.0020.0002.10178] # GREEK THREE QUARTERS SIGN
+10179 ; [*0E15.0020.0002.10179] # GREEK YEAR SIGN
+1017A ; [*0E16.0020.0002.1017A] # GREEK TALENT SIGN
+1017B ; [*0E17.0020.0002.1017B] # GREEK DRACHMA SIGN
+1017C ; [*0E18.0020.0002.1017C] # GREEK OBOL SIGN
+1017D ; [*0E19.0020.0002.1017D] # GREEK TWO OBOLS SIGN
+1017E ; [*0E1A.0020.0002.1017E] # GREEK THREE OBOLS SIGN
+1017F ; [*0E1B.0020.0002.1017F] # GREEK FOUR OBOLS SIGN
+10180 ; [*0E1C.0020.0002.10180] # GREEK FIVE OBOLS SIGN
+10181 ; [*0E1D.0020.0002.10181] # GREEK METRETES SIGN
+10182 ; [*0E1E.0020.0002.10182] # GREEK KYATHOS BASE SIGN
+10183 ; [*0E1F.0020.0002.10183] # GREEK LITRA SIGN
+10184 ; [*0E20.0020.0002.10184] # GREEK OUNKIA SIGN
+10185 ; [*0E21.0020.0002.10185] # GREEK XESTES SIGN
+10186 ; [*0E22.0020.0002.10186] # GREEK ARTABE SIGN
+10187 ; [*0E23.0020.0002.10187] # GREEK AROURA SIGN
+10188 ; [*0E24.0020.0002.10188] # GREEK GRAMMA SIGN
+10189 ; [*0E25.0020.0002.10189] # GREEK TRYBLION BASE SIGN
+10190 ; [*0E26.0020.0002.10190] # ROMAN SEXTANS SIGN
+10191 ; [*0E27.0020.0002.10191] # ROMAN UNCIA SIGN
+10192 ; [*0E28.0020.0002.10192] # ROMAN SEMUNCIA SIGN
+10193 ; [*0E29.0020.0002.10193] # ROMAN SEXTULA SIGN
+10194 ; [*0E2A.0020.0002.10194] # ROMAN DIMIDIA SEXTULA SIGN
+10195 ; [*0E2B.0020.0002.10195] # ROMAN SILIQUA SIGN
+10196 ; [*0E2C.0020.0002.10196] # ROMAN DENARIUS SIGN
+10197 ; [*0E2D.0020.0002.10197] # ROMAN QUINARIUS SIGN
+10198 ; [*0E2E.0020.0002.10198] # ROMAN SESTERTIUS SIGN
+10199 ; [*0E2F.0020.0002.10199] # ROMAN DUPONDIUS SIGN
+1019A ; [*0E30.0020.0002.1019A] # ROMAN AS SIGN
+1019B ; [*0E31.0020.0002.1019B] # ROMAN CENTURIAL SIGN
+101D0 ; [*0E32.0020.0002.101D0] # PHAISTOS DISC SIGN PEDESTRIAN
+101D1 ; [*0E33.0020.0002.101D1] # PHAISTOS DISC SIGN PLUMED HEAD
+101D2 ; [*0E34.0020.0002.101D2] # PHAISTOS DISC SIGN TATTOOED HEAD
+101D3 ; [*0E35.0020.0002.101D3] # PHAISTOS DISC SIGN CAPTIVE
+101D4 ; [*0E36.0020.0002.101D4] # PHAISTOS DISC SIGN CHILD
+101D5 ; [*0E37.0020.0002.101D5] # PHAISTOS DISC SIGN WOMAN
+101D6 ; [*0E38.0020.0002.101D6] # PHAISTOS DISC SIGN HELMET
+101D7 ; [*0E39.0020.0002.101D7] # PHAISTOS DISC SIGN GAUNTLET
+101D8 ; [*0E3A.0020.0002.101D8] # PHAISTOS DISC SIGN TIARA
+101D9 ; [*0E3B.0020.0002.101D9] # PHAISTOS DISC SIGN ARROW
+101DA ; [*0E3C.0020.0002.101DA] # PHAISTOS DISC SIGN BOW
+101DB ; [*0E3D.0020.0002.101DB] # PHAISTOS DISC SIGN SHIELD
+101DC ; [*0E3E.0020.0002.101DC] # PHAISTOS DISC SIGN CLUB
+101DD ; [*0E3F.0020.0002.101DD] # PHAISTOS DISC SIGN MANACLES
+101DE ; [*0E40.0020.0002.101DE] # PHAISTOS DISC SIGN MATTOCK
+101DF ; [*0E41.0020.0002.101DF] # PHAISTOS DISC SIGN SAW
+101E0 ; [*0E42.0020.0002.101E0] # PHAISTOS DISC SIGN LID
+101E1 ; [*0E43.0020.0002.101E1] # PHAISTOS DISC SIGN BOOMERANG
+101E2 ; [*0E44.0020.0002.101E2] # PHAISTOS DISC SIGN CARPENTRY PLANE
+101E3 ; [*0E45.0020.0002.101E3] # PHAISTOS DISC SIGN DOLIUM
+101E4 ; [*0E46.0020.0002.101E4] # PHAISTOS DISC SIGN COMB
+101E5 ; [*0E47.0020.0002.101E5] # PHAISTOS DISC SIGN SLING
+101E6 ; [*0E48.0020.0002.101E6] # PHAISTOS DISC SIGN COLUMN
+101E7 ; [*0E49.0020.0002.101E7] # PHAISTOS DISC SIGN BEEHIVE
+101E8 ; [*0E4A.0020.0002.101E8] # PHAISTOS DISC SIGN SHIP
+101E9 ; [*0E4B.0020.0002.101E9] # PHAISTOS DISC SIGN HORN
+101EA ; [*0E4C.0020.0002.101EA] # PHAISTOS DISC SIGN HIDE
+101EB ; [*0E4D.0020.0002.101EB] # PHAISTOS DISC SIGN BULLS LEG
+101EC ; [*0E4E.0020.0002.101EC] # PHAISTOS DISC SIGN CAT
+101ED ; [*0E4F.0020.0002.101ED] # PHAISTOS DISC SIGN RAM
+101EE ; [*0E50.0020.0002.101EE] # PHAISTOS DISC SIGN EAGLE
+101EF ; [*0E51.0020.0002.101EF] # PHAISTOS DISC SIGN DOVE
+101F0 ; [*0E52.0020.0002.101F0] # PHAISTOS DISC SIGN TUNNY
+101F1 ; [*0E53.0020.0002.101F1] # PHAISTOS DISC SIGN BEE
+101F2 ; [*0E54.0020.0002.101F2] # PHAISTOS DISC SIGN PLANE TREE
+101F3 ; [*0E55.0020.0002.101F3] # PHAISTOS DISC SIGN VINE
+101F4 ; [*0E56.0020.0002.101F4] # PHAISTOS DISC SIGN PAPYRUS
+101F5 ; [*0E57.0020.0002.101F5] # PHAISTOS DISC SIGN ROSETTE
+101F6 ; [*0E58.0020.0002.101F6] # PHAISTOS DISC SIGN LILY
+101F7 ; [*0E59.0020.0002.101F7] # PHAISTOS DISC SIGN OX BACK
+101F8 ; [*0E5A.0020.0002.101F8] # PHAISTOS DISC SIGN FLUTE
+101F9 ; [*0E5B.0020.0002.101F9] # PHAISTOS DISC SIGN GRATER
+101FA ; [*0E5C.0020.0002.101FA] # PHAISTOS DISC SIGN STRAINER
+101FB ; [*0E5D.0020.0002.101FB] # PHAISTOS DISC SIGN SMALL AXE
+101FC ; [*0E5E.0020.0002.101FC] # PHAISTOS DISC SIGN WAVY BAND
+10322 ; [*114D.0020.0002.10322] # OLD ITALIC NUMERAL TEN
+10323 ; [*114E.0020.0002.10323] # OLD ITALIC NUMERAL FIFTY
+1039F ; [*02E7.0020.0002.1039F] # UGARITIC WORD DIVIDER
+103D0 ; [*02E8.0020.0002.103D0] # OLD PERSIAN WORD DIVIDER
+103D3 ; [*119F.0020.0002.103D3] # OLD PERSIAN NUMBER TEN
+103D4 ; [*11A0.0020.0002.103D4] # OLD PERSIAN NUMBER TWENTY
+103D5 ; [*11A1.0020.0002.103D5] # OLD PERSIAN NUMBER HUNDRED
+10857 ; [*02CA.0020.0002.10857] # IMPERIAL ARAMAIC SECTION SIGN
+1085B ; [*11A7.0020.0002.1085B] # IMPERIAL ARAMAIC NUMBER TEN
+1085C ; [*11A8.0020.0002.1085C] # IMPERIAL ARAMAIC NUMBER TWENTY
+1085D ; [*11A9.0020.0002.1085D] # IMPERIAL ARAMAIC NUMBER ONE HUNDRED
+1085E ; [*11AA.0020.0002.1085E] # IMPERIAL ARAMAIC NUMBER ONE THOUSAND
+1085F ; [*11AB.0020.0002.1085F] # IMPERIAL ARAMAIC NUMBER TEN THOUSAND
+10917 ; [*11A4.0020.0002.10917] # PHOENICIAN NUMBER TEN
+10918 ; [*11A5.0020.0002.10918] # PHOENICIAN NUMBER TWENTY
+10919 ; [*11A6.0020.0002.10919] # PHOENICIAN NUMBER ONE HUNDRED
+1091F ; [*02E9.0020.0002.1091F] # PHOENICIAN WORD SEPARATOR
+1093F ; [*02E3.0020.0002.1093F] # LYDIAN TRIANGULAR MARK
+10A44 ; [*11B4.0020.0002.10A44] # KHAROSHTHI NUMBER TEN
+10A45 ; [*11B5.0020.0002.10A45] # KHAROSHTHI NUMBER TWENTY
+10A46 ; [*11B6.0020.0002.10A46] # KHAROSHTHI NUMBER ONE HUNDRED
+10A47 ; [*11B7.0020.0002.10A47] # KHAROSHTHI NUMBER ONE THOUSAND
+10A50 ; [*03DF.0020.0002.10A50] # KHAROSHTHI PUNCTUATION DOT
+10A51 ; [*03E0.0020.0002.10A51] # KHAROSHTHI PUNCTUATION SMALL CIRCLE
+10A52 ; [*03E1.0020.0002.10A52] # KHAROSHTHI PUNCTUATION CIRCLE
+10A53 ; [*03E2.0020.0002.10A53] # KHAROSHTHI PUNCTUATION CRESCENT BAR
+10A54 ; [*03E3.0020.0002.10A54] # KHAROSHTHI PUNCTUATION MANGALAM
+10A55 ; [*03E4.0020.0002.10A55] # KHAROSHTHI PUNCTUATION LOTUS
+10A56 ; [*02AF.0020.0002.10A56] # KHAROSHTHI PUNCTUATION DANDA
+10A57 ; [*02B0.0020.0002.10A57] # KHAROSHTHI PUNCTUATION DOUBLE DANDA
+10A58 ; [*03E5.0020.0002.10A58] # KHAROSHTHI PUNCTUATION LINES
+10A7E ; [*11A2.0020.0002.10A7E] # OLD SOUTH ARABIAN NUMBER FIFTY
+10A7F ; [*11A3.0020.0002.10A7F] # OLD SOUTH ARABIAN NUMERIC INDICATOR
+10B39 ; [*03E6.0020.0002.10B39] # AVESTAN ABBREVIATION MARK
+10B3A ; [*02CB.0020.0002.10B3A] # TINY TWO DOTS OVER ONE DOT PUNCTUATION
+10B3B ; [*02CC.0020.0002.10B3B] # SMALL TWO DOTS OVER ONE DOT PUNCTUATION
+10B3C ; [*02CD.0020.0002.10B3C] # LARGE TWO DOTS OVER ONE DOT PUNCTUATION
+10B3D ; [*02CE.0020.0002.10B3D] # LARGE ONE DOT OVER TWO DOTS PUNCTUATION
+10B3E ; [*02CF.0020.0002.10B3E] # LARGE TWO RINGS OVER ONE RING PUNCTUATION
+10B3F ; [*02D0.0020.0002.10B3F] # LARGE ONE RING OVER TWO RINGS PUNCTUATION
+10B5C ; [*11AC.0020.0002.10B5C] # INSCRIPTIONAL PARTHIAN NUMBER TEN
+10B5D ; [*11AD.0020.0002.10B5D] # INSCRIPTIONAL PARTHIAN NUMBER TWENTY
+10B5E ; [*11AE.0020.0002.10B5E] # INSCRIPTIONAL PARTHIAN NUMBER ONE HUNDRED
+10B5F ; [*11AF.0020.0002.10B5F] # INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND
+10B7C ; [*11B0.0020.0002.10B7C] # INSCRIPTIONAL PAHLAVI NUMBER TEN
+10B7D ; [*11B1.0020.0002.10B7D] # INSCRIPTIONAL PAHLAVI NUMBER TWENTY
+10B7E ; [*11B2.0020.0002.10B7E] # INSCRIPTIONAL PAHLAVI NUMBER ONE HUNDRED
+10B7F ; [*11B3.0020.0002.10B7F] # INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND
+10E69 ; [*1136.0020.0002.10E69] # RUMI NUMBER TEN
+10E6A ; [*1137.0020.0002.10E6A] # RUMI NUMBER TWENTY
+10E6B ; [*1138.0020.0002.10E6B] # RUMI NUMBER THIRTY
+10E6C ; [*1139.0020.0002.10E6C] # RUMI NUMBER FORTY
+10E6D ; [*113A.0020.0002.10E6D] # RUMI NUMBER FIFTY
+10E6E ; [*113B.0020.0002.10E6E] # RUMI NUMBER SIXTY
+10E6F ; [*113C.0020.0002.10E6F] # RUMI NUMBER SEVENTY
+10E70 ; [*113D.0020.0002.10E70] # RUMI NUMBER EIGHTY
+10E71 ; [*113E.0020.0002.10E71] # RUMI NUMBER NINETY
+10E72 ; [*113F.0020.0002.10E72] # RUMI NUMBER ONE HUNDRED
+10E73 ; [*1140.0020.0002.10E73] # RUMI NUMBER TWO HUNDRED
+10E74 ; [*1141.0020.0002.10E74] # RUMI NUMBER THREE HUNDRED
+10E75 ; [*1142.0020.0002.10E75] # RUMI NUMBER FOUR HUNDRED
+10E76 ; [*1143.0020.0002.10E76] # RUMI NUMBER FIVE HUNDRED
+10E77 ; [*1144.0020.0002.10E77] # RUMI NUMBER SIX HUNDRED
+10E78 ; [*1145.0020.0002.10E78] # RUMI NUMBER SEVEN HUNDRED
+10E79 ; [*1146.0020.0002.10E79] # RUMI NUMBER EIGHT HUNDRED
+10E7A ; [*1147.0020.0002.10E7A] # RUMI NUMBER NINE HUNDRED
+10E7B ; [*1148.0020.0002.10E7B] # RUMI FRACTION ONE HALF
+10E7C ; [*1149.0020.0002.10E7C] # RUMI FRACTION ONE QUARTER
+10E7D ; [*114A.0020.0002.10E7D] # RUMI FRACTION ONE THIRD
+10E7E ; [*114B.0020.0002.10E7E] # RUMI FRACTION TWO THIRDS
+110BB ; [*03E7.0020.0002.110BB] # KAITHI ABBREVIATION SIGN
+110BC ; [*03E8.0020.0002.110BC] # KAITHI ENUMERATION SIGN
+110BD ; [.0000.0000.0000.110BD] # KAITHI NUMBER SIGN
+110BE ; [*02D1.0020.0002.110BE] # KAITHI SECTION MARK
+110BF ; [*02D2.0020.0002.110BF] # KAITHI DOUBLE SECTION MARK
+110C0 ; [*02B1.0020.0002.110C0] # KAITHI DANDA
+110C1 ; [*02B2.0020.0002.110C1] # KAITHI DOUBLE DANDA
+12432 ; [*11B8.0020.0002.12432] # CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH
+12433 ; [*11B9.0020.0002.12433] # CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN
+12456 ; [*11BA.0020.0002.12456] # CUNEIFORM NUMERIC SIGN NIGIDAMIN
+12457 ; [*11BB.0020.0002.12457] # CUNEIFORM NUMERIC SIGN NIGIDAESH
+1245A ; [*11BC.0020.0002.1245A] # CUNEIFORM NUMERIC SIGN ONE THIRD DISH
+1245B ; [*11BD.0020.0002.1245B] # CUNEIFORM NUMERIC SIGN TWO THIRDS DISH
+1245C ; [*11BE.0020.0002.1245C] # CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH
+1245D ; [*11BF.0020.0002.1245D] # CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A
+1245E ; [*11C0.0020.0002.1245E] # CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A
+1245F ; [*11C1.0020.0002.1245F] # CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH
+12460 ; [*11C2.0020.0002.12460] # CUNEIFORM NUMERIC SIGN ONE QUARTER ASH
+12461 ; [*11C3.0020.0002.12461] # CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH
+12462 ; [*11C4.0020.0002.12462] # CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER
+12470 ; [*02EA.0020.0002.12470] # CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER
+12471 ; [*02EB.0020.0002.12471] # CUNEIFORM PUNCTUATION SIGN VERTICAL COLON
+12472 ; [*02EC.0020.0002.12472] # CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON
+12473 ; [*02ED.0020.0002.12473] # CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON
+1D000 ; [*0E5F.0020.0002.1D000] # BYZANTINE MUSICAL SYMBOL PSILI
+1D001 ; [*0E60.0020.0002.1D001] # BYZANTINE MUSICAL SYMBOL DASEIA
+1D002 ; [*0E61.0020.0002.1D002] # BYZANTINE MUSICAL SYMBOL PERISPOMENI
+1D003 ; [*0E62.0020.0002.1D003] # BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON
+1D004 ; [*0E63.0020.0002.1D004] # BYZANTINE MUSICAL SYMBOL OXEIA DIPLI
+1D005 ; [*0E64.0020.0002.1D005] # BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON
+1D006 ; [*0E65.0020.0002.1D006] # BYZANTINE MUSICAL SYMBOL VAREIA DIPLI
+1D007 ; [*0E66.0020.0002.1D007] # BYZANTINE MUSICAL SYMBOL KATHISTI
+1D008 ; [*0E67.0020.0002.1D008] # BYZANTINE MUSICAL SYMBOL SYRMATIKI
+1D009 ; [*0E68.0020.0002.1D009] # BYZANTINE MUSICAL SYMBOL PARAKLITIKI
+1D00A ; [*0E69.0020.0002.1D00A] # BYZANTINE MUSICAL SYMBOL YPOKRISIS
+1D00B ; [*0E6A.0020.0002.1D00B] # BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI
+1D00C ; [*0E6B.0020.0002.1D00C] # BYZANTINE MUSICAL SYMBOL KREMASTI
+1D00D ; [*0E6C.0020.0002.1D00D] # BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON
+1D00E ; [*0E6D.0020.0002.1D00E] # BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON
+1D00F ; [*0E6E.0020.0002.1D00F] # BYZANTINE MUSICAL SYMBOL TELEIA
+1D010 ; [*0E6F.0020.0002.1D010] # BYZANTINE MUSICAL SYMBOL KENTIMATA
+1D011 ; [*0E70.0020.0002.1D011] # BYZANTINE MUSICAL SYMBOL APOSTROFOS
+1D012 ; [*0E71.0020.0002.1D012] # BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI
+1D013 ; [*0E72.0020.0002.1D013] # BYZANTINE MUSICAL SYMBOL SYNEVMA
+1D014 ; [*0E73.0020.0002.1D014] # BYZANTINE MUSICAL SYMBOL THITA
+1D015 ; [*0E74.0020.0002.1D015] # BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION
+1D016 ; [*0E75.0020.0002.1D016] # BYZANTINE MUSICAL SYMBOL GORGON ARCHAION
+1D017 ; [*0E76.0020.0002.1D017] # BYZANTINE MUSICAL SYMBOL PSILON
+1D018 ; [*0E77.0020.0002.1D018] # BYZANTINE MUSICAL SYMBOL CHAMILON
+1D019 ; [*0E78.0020.0002.1D019] # BYZANTINE MUSICAL SYMBOL VATHY
+1D01A ; [*0E79.0020.0002.1D01A] # BYZANTINE MUSICAL SYMBOL ISON ARCHAION
+1D01B ; [*0E7A.0020.0002.1D01B] # BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION
+1D01C ; [*0E7B.0020.0002.1D01C] # BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION
+1D01D ; [*0E7C.0020.0002.1D01D] # BYZANTINE MUSICAL SYMBOL SAXIMATA
+1D01E ; [*0E7D.0020.0002.1D01E] # BYZANTINE MUSICAL SYMBOL PARICHON
+1D01F ; [*0E7E.0020.0002.1D01F] # BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA
+1D020 ; [*0E7F.0020.0002.1D020] # BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION
+1D021 ; [*0E80.0020.0002.1D021] # BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION
+1D022 ; [*0E81.0020.0002.1D022] # BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION
+1D023 ; [*0E82.0020.0002.1D023] # BYZANTINE MUSICAL SYMBOL APOTHEMA
+1D024 ; [*0E83.0020.0002.1D024] # BYZANTINE MUSICAL SYMBOL KLASMA
+1D025 ; [*0E84.0020.0002.1D025] # BYZANTINE MUSICAL SYMBOL REVMA
+1D026 ; [*0E85.0020.0002.1D026] # BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION
+1D027 ; [*0E86.0020.0002.1D027] # BYZANTINE MUSICAL SYMBOL TINAGMA
+1D028 ; [*0E87.0020.0002.1D028] # BYZANTINE MUSICAL SYMBOL ANATRICHISMA
+1D029 ; [*0E88.0020.0002.1D029] # BYZANTINE MUSICAL SYMBOL SEISMA
+1D02A ; [*0E89.0020.0002.1D02A] # BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION
+1D02B ; [*0E8A.0020.0002.1D02B] # BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU
+1D02C ; [*0E8B.0020.0002.1D02C] # BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION
+1D02D ; [*0E8C.0020.0002.1D02D] # BYZANTINE MUSICAL SYMBOL THEMA
+1D02E ; [*0E8D.0020.0002.1D02E] # BYZANTINE MUSICAL SYMBOL LEMOI
+1D02F ; [*0E8E.0020.0002.1D02F] # BYZANTINE MUSICAL SYMBOL DYO
+1D030 ; [*0E8F.0020.0002.1D030] # BYZANTINE MUSICAL SYMBOL TRIA
+1D031 ; [*0E90.0020.0002.1D031] # BYZANTINE MUSICAL SYMBOL TESSERA
+1D032 ; [*0E91.0020.0002.1D032] # BYZANTINE MUSICAL SYMBOL KRATIMATA
+1D033 ; [*0E92.0020.0002.1D033] # BYZANTINE MUSICAL SYMBOL APESO EXO NEO
+1D034 ; [*0E93.0020.0002.1D034] # BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION
+1D035 ; [*0E94.0020.0002.1D035] # BYZANTINE MUSICAL SYMBOL IMIFTHORA
+1D036 ; [*0E95.0020.0002.1D036] # BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION
+1D037 ; [*0E96.0020.0002.1D037] # BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON
+1D038 ; [*0E97.0020.0002.1D038] # BYZANTINE MUSICAL SYMBOL PELASTON
+1D039 ; [*0E98.0020.0002.1D039] # BYZANTINE MUSICAL SYMBOL PSIFISTON
+1D03A ; [*0E99.0020.0002.1D03A] # BYZANTINE MUSICAL SYMBOL KONTEVMA
+1D03B ; [*0E9A.0020.0002.1D03B] # BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION
+1D03C ; [*0E9B.0020.0002.1D03C] # BYZANTINE MUSICAL SYMBOL RAPISMA
+1D03D ; [*0E9C.0020.0002.1D03D] # BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION
+1D03E ; [*0E9D.0020.0002.1D03E] # BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION
+1D03F ; [*0E9E.0020.0002.1D03F] # BYZANTINE MUSICAL SYMBOL ICHADIN
+1D040 ; [*0E9F.0020.0002.1D040] # BYZANTINE MUSICAL SYMBOL NANA
+1D041 ; [*0EA0.0020.0002.1D041] # BYZANTINE MUSICAL SYMBOL PETASMA
+1D042 ; [*0EA1.0020.0002.1D042] # BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO
+1D043 ; [*0EA2.0020.0002.1D043] # BYZANTINE MUSICAL SYMBOL TROMIKON ALLO
+1D044 ; [*0EA3.0020.0002.1D044] # BYZANTINE MUSICAL SYMBOL STRAGGISMATA
+1D045 ; [*0EA4.0020.0002.1D045] # BYZANTINE MUSICAL SYMBOL GRONTHISMATA
+1D046 ; [*0EA5.0020.0002.1D046] # BYZANTINE MUSICAL SYMBOL ISON NEO
+1D047 ; [*0EA6.0020.0002.1D047] # BYZANTINE MUSICAL SYMBOL OLIGON NEO
+1D048 ; [*0EA7.0020.0002.1D048] # BYZANTINE MUSICAL SYMBOL OXEIA NEO
+1D049 ; [*0EA8.0020.0002.1D049] # BYZANTINE MUSICAL SYMBOL PETASTI
+1D04A ; [*0EA9.0020.0002.1D04A] # BYZANTINE MUSICAL SYMBOL KOUFISMA
+1D04B ; [*0EAA.0020.0002.1D04B] # BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA
+1D04C ; [*0EAB.0020.0002.1D04C] # BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA
+1D04D ; [*0EAC.0020.0002.1D04D] # BYZANTINE MUSICAL SYMBOL PELASTON NEO
+1D04E ; [*0EAD.0020.0002.1D04E] # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO
+1D04F ; [*0EAE.0020.0002.1D04F] # BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO
+1D050 ; [*0EAF.0020.0002.1D050] # BYZANTINE MUSICAL SYMBOL YPSILI
+1D051 ; [*0EB0.0020.0002.1D051] # BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO
+1D052 ; [*0EB1.0020.0002.1D052] # BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO
+1D053 ; [*0EB2.0020.0002.1D053] # BYZANTINE MUSICAL SYMBOL YPORROI
+1D054 ; [*0EB3.0020.0002.1D054] # BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON
+1D055 ; [*0EB4.0020.0002.1D055] # BYZANTINE MUSICAL SYMBOL ELAFRON
+1D056 ; [*0EB5.0020.0002.1D056] # BYZANTINE MUSICAL SYMBOL CHAMILI
+1D057 ; [*0EB6.0020.0002.1D057] # BYZANTINE MUSICAL SYMBOL MIKRON ISON
+1D058 ; [*0EB7.0020.0002.1D058] # BYZANTINE MUSICAL SYMBOL VAREIA NEO
+1D059 ; [*0EB8.0020.0002.1D059] # BYZANTINE MUSICAL SYMBOL PIASMA NEO
+1D05A ; [*0EB9.0020.0002.1D05A] # BYZANTINE MUSICAL SYMBOL PSIFISTON NEO
+1D05B ; [*0EBA.0020.0002.1D05B] # BYZANTINE MUSICAL SYMBOL OMALON
+1D05C ; [*0EBB.0020.0002.1D05C] # BYZANTINE MUSICAL SYMBOL ANTIKENOMA
+1D05D ; [*0EBC.0020.0002.1D05D] # BYZANTINE MUSICAL SYMBOL LYGISMA
+1D05E ; [*0EBD.0020.0002.1D05E] # BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO
+1D05F ; [*0EBE.0020.0002.1D05F] # BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO
+1D060 ; [*0EBF.0020.0002.1D060] # BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA
+1D061 ; [*0EC0.0020.0002.1D061] # BYZANTINE MUSICAL SYMBOL KYLISMA
+1D062 ; [*0EC1.0020.0002.1D062] # BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA
+1D063 ; [*0EC2.0020.0002.1D063] # BYZANTINE MUSICAL SYMBOL TROMIKON NEO
+1D064 ; [*0EC3.0020.0002.1D064] # BYZANTINE MUSICAL SYMBOL EKSTREPTON
+1D065 ; [*0EC4.0020.0002.1D065] # BYZANTINE MUSICAL SYMBOL SYNAGMA NEO
+1D066 ; [*0EC5.0020.0002.1D066] # BYZANTINE MUSICAL SYMBOL SYRMA
+1D067 ; [*0EC6.0020.0002.1D067] # BYZANTINE MUSICAL SYMBOL CHOREVMA NEO
+1D068 ; [*0EC7.0020.0002.1D068] # BYZANTINE MUSICAL SYMBOL EPEGERMA
+1D069 ; [*0EC8.0020.0002.1D069] # BYZANTINE MUSICAL SYMBOL SEISMA NEO
+1D06A ; [*0EC9.0020.0002.1D06A] # BYZANTINE MUSICAL SYMBOL XIRON KLASMA
+1D06B ; [*0ECA.0020.0002.1D06B] # BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON
+1D06C ; [*0ECB.0020.0002.1D06C] # BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA
+1D06D ; [*0ECC.0020.0002.1D06D] # BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA
+1D06E ; [*0ECD.0020.0002.1D06E] # BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA
+1D06F ; [*0ECE.0020.0002.1D06F] # BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA
+1D070 ; [*0ECF.0020.0002.1D070] # BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA
+1D071 ; [*0ED0.0020.0002.1D071] # BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA
+1D072 ; [*0ED1.0020.0002.1D072] # BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON
+1D073 ; [*0ED2.0020.0002.1D073] # BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON
+1D074 ; [*0ED3.0020.0002.1D074] # BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON
+1D075 ; [*0ED4.0020.0002.1D075] # BYZANTINE MUSICAL SYMBOL OYRANISMA NEO
+1D076 ; [*0ED5.0020.0002.1D076] # BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO
+1D077 ; [*0ED6.0020.0002.1D077] # BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO
+1D078 ; [*0ED7.0020.0002.1D078] # BYZANTINE MUSICAL SYMBOL THEMA APLOUN
+1D079 ; [*0ED8.0020.0002.1D079] # BYZANTINE MUSICAL SYMBOL THES KAI APOTHES
+1D07A ; [*0ED9.0020.0002.1D07A] # BYZANTINE MUSICAL SYMBOL KATAVASMA
+1D07B ; [*0EDA.0020.0002.1D07B] # BYZANTINE MUSICAL SYMBOL ENDOFONON
+1D07C ; [*0EDB.0020.0002.1D07C] # BYZANTINE MUSICAL SYMBOL YFEN KATO
+1D07D ; [*0EDC.0020.0002.1D07D] # BYZANTINE MUSICAL SYMBOL YFEN ANO
+1D07E ; [*0EDD.0020.0002.1D07E] # BYZANTINE MUSICAL SYMBOL STAVROS
+1D07F ; [*0EDE.0020.0002.1D07F] # BYZANTINE MUSICAL SYMBOL KLASMA ANO
+1D080 ; [*0EDF.0020.0002.1D080] # BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION
+1D081 ; [*0EE0.0020.0002.1D081] # BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION
+1D082 ; [*0EE1.0020.0002.1D082] # BYZANTINE MUSICAL SYMBOL KRATIMA ALLO
+1D083 ; [*0EE2.0020.0002.1D083] # BYZANTINE MUSICAL SYMBOL KRATIMA NEO
+1D084 ; [*0EE3.0020.0002.1D084] # BYZANTINE MUSICAL SYMBOL APODERMA NEO
+1D085 ; [*0EE4.0020.0002.1D085] # BYZANTINE MUSICAL SYMBOL APLI
+1D086 ; [*0EE5.0020.0002.1D086] # BYZANTINE MUSICAL SYMBOL DIPLI
+1D087 ; [*0EE6.0020.0002.1D087] # BYZANTINE MUSICAL SYMBOL TRIPLI
+1D088 ; [*0EE7.0020.0002.1D088] # BYZANTINE MUSICAL SYMBOL TETRAPLI
+1D089 ; [*0EE8.0020.0002.1D089] # BYZANTINE MUSICAL SYMBOL KORONIS
+1D08A ; [*0EE9.0020.0002.1D08A] # BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU
+1D08B ; [*0EEA.0020.0002.1D08B] # BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON
+1D08C ; [*0EEB.0020.0002.1D08C] # BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON
+1D08D ; [*0EEC.0020.0002.1D08D] # BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON
+1D08E ; [*0EED.0020.0002.1D08E] # BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU
+1D08F ; [*0EEE.0020.0002.1D08F] # BYZANTINE MUSICAL SYMBOL GORGON NEO ANO
+1D090 ; [*0EEF.0020.0002.1D090] # BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA
+1D091 ; [*0EF0.0020.0002.1D091] # BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA
+1D092 ; [*0EF1.0020.0002.1D092] # BYZANTINE MUSICAL SYMBOL DIGORGON
+1D093 ; [*0EF2.0020.0002.1D093] # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO
+1D094 ; [*0EF3.0020.0002.1D094] # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO
+1D095 ; [*0EF4.0020.0002.1D095] # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA
+1D096 ; [*0EF5.0020.0002.1D096] # BYZANTINE MUSICAL SYMBOL TRIGORGON
+1D097 ; [*0EF6.0020.0002.1D097] # BYZANTINE MUSICAL SYMBOL ARGON
+1D098 ; [*0EF7.0020.0002.1D098] # BYZANTINE MUSICAL SYMBOL IMIDIARGON
+1D099 ; [*0EF8.0020.0002.1D099] # BYZANTINE MUSICAL SYMBOL DIARGON
+1D09A ; [*0EF9.0020.0002.1D09A] # BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI
+1D09B ; [*0EFA.0020.0002.1D09B] # BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI
+1D09C ; [*0EFB.0020.0002.1D09C] # BYZANTINE MUSICAL SYMBOL AGOGI ARGI
+1D09D ; [*0EFC.0020.0002.1D09D] # BYZANTINE MUSICAL SYMBOL AGOGI METRIA
+1D09E ; [*0EFD.0020.0002.1D09E] # BYZANTINE MUSICAL SYMBOL AGOGI MESI
+1D09F ; [*0EFE.0020.0002.1D09F] # BYZANTINE MUSICAL SYMBOL AGOGI GORGI
+1D0A0 ; [*0EFF.0020.0002.1D0A0] # BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI
+1D0A1 ; [*0F00.0020.0002.1D0A1] # BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI
+1D0A2 ; [*0F01.0020.0002.1D0A2] # BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS
+1D0A3 ; [*0F02.0020.0002.1D0A3] # BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS
+1D0A4 ; [*0F03.0020.0002.1D0A4] # BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS
+1D0A5 ; [*0F04.0020.0002.1D0A5] # BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS
+1D0A6 ; [*0F05.0020.0002.1D0A6] # BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS
+1D0A7 ; [*0F06.0020.0002.1D0A7] # BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS
+1D0A8 ; [*0F07.0020.0002.1D0A8] # BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS
+1D0A9 ; [*0F08.0020.0002.1D0A9] # BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS
+1D0AA ; [*0F09.0020.0002.1D0AA] # BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS
+1D0AB ; [*0F0A.0020.0002.1D0AB] # BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS
+1D0AC ; [*0F0B.0020.0002.1D0AC] # BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS
+1D0AD ; [*0F0C.0020.0002.1D0AD] # BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS
+1D0AE ; [*0F0D.0020.0002.1D0AE] # BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS
+1D0AF ; [*0F0E.0020.0002.1D0AF] # BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS
+1D0B0 ; [*0F0F.0020.0002.1D0B0] # BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS
+1D0B1 ; [*0F10.0020.0002.1D0B1] # BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS
+1D0B2 ; [*0F11.0020.0002.1D0B2] # BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS
+1D0B3 ; [*0F12.0020.0002.1D0B3] # BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS
+1D0B4 ; [*0F13.0020.0002.1D0B4] # BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN
+1D0B5 ; [*0F14.0020.0002.1D0B5] # BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN
+1D0B6 ; [*0F15.0020.0002.1D0B6] # BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU
+1D0B7 ; [*0F16.0020.0002.1D0B7] # BYZANTINE MUSICAL SYMBOL IMIFONON
+1D0B8 ; [*0F17.0020.0002.1D0B8] # BYZANTINE MUSICAL SYMBOL IMIFTHORON
+1D0B9 ; [*0F18.0020.0002.1D0B9] # BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU
+1D0BA ; [*0F19.0020.0002.1D0BA] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA
+1D0BB ; [*0F1A.0020.0002.1D0BB] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA
+1D0BC ; [*0F1B.0020.0002.1D0BC] # BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS
+1D0BD ; [*0F1C.0020.0002.1D0BD] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI
+1D0BE ; [*0F1D.0020.0002.1D0BE] # BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI
+1D0BF ; [*0F1E.0020.0002.1D0BF] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE
+1D0C0 ; [*0F1F.0020.0002.1D0C0] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO
+1D0C1 ; [*0F20.0020.0002.1D0C1] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO
+1D0C2 ; [*0F21.0020.0002.1D0C2] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO
+1D0C3 ; [*0F22.0020.0002.1D0C3] # BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS
+1D0C4 ; [*0F23.0020.0002.1D0C4] # BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS
+1D0C5 ; [*0F24.0020.0002.1D0C5] # BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS
+1D0C6 ; [*0F25.0020.0002.1D0C6] # BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI
+1D0C7 ; [*0F26.0020.0002.1D0C7] # BYZANTINE MUSICAL SYMBOL FTHORA NENANO
+1D0C8 ; [*0F27.0020.0002.1D0C8] # BYZANTINE MUSICAL SYMBOL CHROA ZYGOS
+1D0C9 ; [*0F28.0020.0002.1D0C9] # BYZANTINE MUSICAL SYMBOL CHROA KLITON
+1D0CA ; [*0F29.0020.0002.1D0CA] # BYZANTINE MUSICAL SYMBOL CHROA SPATHI
+1D0CB ; [*0F2A.0020.0002.1D0CB] # BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION
+1D0CC ; [*0F2B.0020.0002.1D0CC] # BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA
+1D0CD ; [*0F2C.0020.0002.1D0CD] # BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION
+1D0CE ; [*0F2D.0020.0002.1D0CE] # BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION
+1D0CF ; [*0F2E.0020.0002.1D0CF] # BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION
+1D0D0 ; [*0F2F.0020.0002.1D0D0] # BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA
+1D0D1 ; [*0F30.0020.0002.1D0D1] # BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA
+1D0D2 ; [*0F31.0020.0002.1D0D2] # BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA
+1D0D3 ; [*0F32.0020.0002.1D0D3] # BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA
+1D0D4 ; [*0F33.0020.0002.1D0D4] # BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA
+1D0D5 ; [*0F34.0020.0002.1D0D5] # BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA
+1D0D6 ; [*0F35.0020.0002.1D0D6] # BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA
+1D0D7 ; [*0F36.0020.0002.1D0D7] # BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA
+1D0D8 ; [*0F37.0020.0002.1D0D8] # BYZANTINE MUSICAL SYMBOL GENIKI DIESIS
+1D0D9 ; [*0F38.0020.0002.1D0D9] # BYZANTINE MUSICAL SYMBOL GENIKI YFESIS
+1D0DA ; [*0F39.0020.0002.1D0DA] # BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI
+1D0DB ; [*0F3A.0020.0002.1D0DB] # BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI
+1D0DC ; [*0F3B.0020.0002.1D0DC] # BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI
+1D0DD ; [*0F3C.0020.0002.1D0DD] # BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS
+1D0DE ; [*0F3D.0020.0002.1D0DE] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS
+1D0DF ; [*0F3E.0020.0002.1D0DF] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU
+1D0E0 ; [*0F3F.0020.0002.1D0E0] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU
+1D0E1 ; [*0F40.0020.0002.1D0E1] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU
+1D0E2 ; [*0F41.0020.0002.1D0E2] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS
+1D0E3 ; [*0F42.0020.0002.1D0E3] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU
+1D0E4 ; [*0F43.0020.0002.1D0E4] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU
+1D0E5 ; [*0F44.0020.0002.1D0E5] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU
+1D0E6 ; [*0F45.0020.0002.1D0E6] # BYZANTINE MUSICAL SYMBOL DIGRAMMA GG
+1D0E7 ; [*0F46.0020.0002.1D0E7] # BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU
+1D0E8 ; [*0F47.0020.0002.1D0E8] # BYZANTINE MUSICAL SYMBOL STIGMA
+1D0E9 ; [*0F48.0020.0002.1D0E9] # BYZANTINE MUSICAL SYMBOL ARKTIKO PA
+1D0EA ; [*0F49.0020.0002.1D0EA] # BYZANTINE MUSICAL SYMBOL ARKTIKO VOU
+1D0EB ; [*0F4A.0020.0002.1D0EB] # BYZANTINE MUSICAL SYMBOL ARKTIKO GA
+1D0EC ; [*0F4B.0020.0002.1D0EC] # BYZANTINE MUSICAL SYMBOL ARKTIKO DI
+1D0ED ; [*0F4C.0020.0002.1D0ED] # BYZANTINE MUSICAL SYMBOL ARKTIKO KE
+1D0EE ; [*0F4D.0020.0002.1D0EE] # BYZANTINE MUSICAL SYMBOL ARKTIKO ZO
+1D0EF ; [*0F4E.0020.0002.1D0EF] # BYZANTINE MUSICAL SYMBOL ARKTIKO NI
+1D0F0 ; [*0F4F.0020.0002.1D0F0] # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO
+1D0F1 ; [*0F50.0020.0002.1D0F1] # BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO
+1D0F2 ; [*0F51.0020.0002.1D0F2] # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO
+1D0F3 ; [*0F52.0020.0002.1D0F3] # BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO
+1D0F4 ; [*0F53.0020.0002.1D0F4] # BYZANTINE MUSICAL SYMBOL KLASMA KATO
+1D0F5 ; [*0F54.0020.0002.1D0F5] # BYZANTINE MUSICAL SYMBOL GORGON NEO KATO
+1D100 ; [*0F55.0020.0002.1D100] # MUSICAL SYMBOL SINGLE BARLINE
+1D101 ; [*0F56.0020.0002.1D101] # MUSICAL SYMBOL DOUBLE BARLINE
+1D102 ; [*0F57.0020.0002.1D102] # MUSICAL SYMBOL FINAL BARLINE
+1D103 ; [*0F58.0020.0002.1D103] # MUSICAL SYMBOL REVERSE FINAL BARLINE
+1D104 ; [*0F59.0020.0002.1D104] # MUSICAL SYMBOL DASHED BARLINE
+1D105 ; [*0F5A.0020.0002.1D105] # MUSICAL SYMBOL SHORT BARLINE
+1D106 ; [*0F5B.0020.0002.1D106] # MUSICAL SYMBOL LEFT REPEAT SIGN
+1D107 ; [*0F5C.0020.0002.1D107] # MUSICAL SYMBOL RIGHT REPEAT SIGN
+1D108 ; [*0F5D.0020.0002.1D108] # MUSICAL SYMBOL REPEAT DOTS
+1D109 ; [*0F5E.0020.0002.1D109] # MUSICAL SYMBOL DAL SEGNO
+1D10A ; [*0F5F.0020.0002.1D10A] # MUSICAL SYMBOL DA CAPO
+1D10B ; [*0F60.0020.0002.1D10B] # MUSICAL SYMBOL SEGNO
+1D10C ; [*0F61.0020.0002.1D10C] # MUSICAL SYMBOL CODA
+1D10D ; [*0F62.0020.0002.1D10D] # MUSICAL SYMBOL REPEATED FIGURE-1
+1D10E ; [*0F63.0020.0002.1D10E] # MUSICAL SYMBOL REPEATED FIGURE-2
+1D10F ; [*0F64.0020.0002.1D10F] # MUSICAL SYMBOL REPEATED FIGURE-3
+1D110 ; [*0F65.0020.0002.1D110] # MUSICAL SYMBOL FERMATA
+1D111 ; [*0F66.0020.0002.1D111] # MUSICAL SYMBOL FERMATA BELOW
+1D112 ; [*0F67.0020.0002.1D112] # MUSICAL SYMBOL BREATH MARK
+1D113 ; [*0F68.0020.0002.1D113] # MUSICAL SYMBOL CAESURA
+1D114 ; [*0F69.0020.0002.1D114] # MUSICAL SYMBOL BRACE
+1D115 ; [*0F6A.0020.0002.1D115] # MUSICAL SYMBOL BRACKET
+1D116 ; [*0F6B.0020.0002.1D116] # MUSICAL SYMBOL ONE-LINE STAFF
+1D117 ; [*0F6C.0020.0002.1D117] # MUSICAL SYMBOL TWO-LINE STAFF
+1D118 ; [*0F6D.0020.0002.1D118] # MUSICAL SYMBOL THREE-LINE STAFF
+1D119 ; [*0F6E.0020.0002.1D119] # MUSICAL SYMBOL FOUR-LINE STAFF
+1D11A ; [*0F6F.0020.0002.1D11A] # MUSICAL SYMBOL FIVE-LINE STAFF
+1D11B ; [*0F70.0020.0002.1D11B] # MUSICAL SYMBOL SIX-LINE STAFF
+1D11C ; [*0F71.0020.0002.1D11C] # MUSICAL SYMBOL SIX-STRING FRETBOARD
+1D11D ; [*0F72.0020.0002.1D11D] # MUSICAL SYMBOL FOUR-STRING FRETBOARD
+1D11E ; [*0F73.0020.0002.1D11E] # MUSICAL SYMBOL G CLEF
+1D11F ; [*0F74.0020.0002.1D11F] # MUSICAL SYMBOL G CLEF OTTAVA ALTA
+1D120 ; [*0F75.0020.0002.1D120] # MUSICAL SYMBOL G CLEF OTTAVA BASSA
+1D121 ; [*0F76.0020.0002.1D121] # MUSICAL SYMBOL C CLEF
+1D122 ; [*0F77.0020.0002.1D122] # MUSICAL SYMBOL F CLEF
+1D123 ; [*0F78.0020.0002.1D123] # MUSICAL SYMBOL F CLEF OTTAVA ALTA
+1D124 ; [*0F79.0020.0002.1D124] # MUSICAL SYMBOL F CLEF OTTAVA BASSA
+1D125 ; [*0F7A.0020.0002.1D125] # MUSICAL SYMBOL DRUM CLEF-1
+1D126 ; [*0F7B.0020.0002.1D126] # MUSICAL SYMBOL DRUM CLEF-2
+1D129 ; [*0F8F.0020.0002.1D129] # MUSICAL SYMBOL MULTIPLE MEASURE REST
+1D12A ; [*0F7F.0020.0002.1D12A] # MUSICAL SYMBOL DOUBLE SHARP
+1D12B ; [*0F80.0020.0002.1D12B] # MUSICAL SYMBOL DOUBLE FLAT
+1D12C ; [*0F81.0020.0002.1D12C] # MUSICAL SYMBOL FLAT UP
+1D12D ; [*0F82.0020.0002.1D12D] # MUSICAL SYMBOL FLAT DOWN
+1D12E ; [*0F83.0020.0002.1D12E] # MUSICAL SYMBOL NATURAL UP
+1D12F ; [*0F84.0020.0002.1D12F] # MUSICAL SYMBOL NATURAL DOWN
+1D130 ; [*0F85.0020.0002.1D130] # MUSICAL SYMBOL SHARP UP
+1D131 ; [*0F86.0020.0002.1D131] # MUSICAL SYMBOL SHARP DOWN
+1D132 ; [*0F87.0020.0002.1D132] # MUSICAL SYMBOL QUARTER TONE SHARP
+1D133 ; [*0F88.0020.0002.1D133] # MUSICAL SYMBOL QUARTER TONE FLAT
+1D134 ; [*0F89.0020.0002.1D134] # MUSICAL SYMBOL COMMON TIME
+1D135 ; [*0F8A.0020.0002.1D135] # MUSICAL SYMBOL CUT TIME
+1D136 ; [*0F8B.0020.0002.1D136] # MUSICAL SYMBOL OTTAVA ALTA
+1D137 ; [*0F8C.0020.0002.1D137] # MUSICAL SYMBOL OTTAVA BASSA
+1D138 ; [*0F8D.0020.0002.1D138] # MUSICAL SYMBOL QUINDICESIMA ALTA
+1D139 ; [*0F8E.0020.0002.1D139] # MUSICAL SYMBOL QUINDICESIMA BASSA
+1D13A ; [*0F90.0020.0002.1D13A] # MUSICAL SYMBOL MULTI REST
+1D13B ; [*0F91.0020.0002.1D13B] # MUSICAL SYMBOL WHOLE REST
+1D13C ; [*0F92.0020.0002.1D13C] # MUSICAL SYMBOL HALF REST
+1D13D ; [*0F93.0020.0002.1D13D] # MUSICAL SYMBOL QUARTER REST
+1D13E ; [*0F94.0020.0002.1D13E] # MUSICAL SYMBOL EIGHTH REST
+1D13F ; [*0F95.0020.0002.1D13F] # MUSICAL SYMBOL SIXTEENTH REST
+1D140 ; [*0F96.0020.0002.1D140] # MUSICAL SYMBOL THIRTY-SECOND REST
+1D141 ; [*0F97.0020.0002.1D141] # MUSICAL SYMBOL SIXTY-FOURTH REST
+1D142 ; [*0F98.0020.0002.1D142] # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST
+1D143 ; [*0F99.0020.0002.1D143] # MUSICAL SYMBOL X NOTEHEAD
+1D144 ; [*0F9A.0020.0002.1D144] # MUSICAL SYMBOL PLUS NOTEHEAD
+1D145 ; [*0F9B.0020.0002.1D145] # MUSICAL SYMBOL CIRCLE X NOTEHEAD
+1D146 ; [*0F9C.0020.0002.1D146] # MUSICAL SYMBOL SQUARE NOTEHEAD WHITE
+1D147 ; [*0F9D.0020.0002.1D147] # MUSICAL SYMBOL SQUARE NOTEHEAD BLACK
+1D148 ; [*0F9E.0020.0002.1D148] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE
+1D149 ; [*0F9F.0020.0002.1D149] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK
+1D14A ; [*0FA0.0020.0002.1D14A] # MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE
+1D14B ; [*0FA1.0020.0002.1D14B] # MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK
+1D14C ; [*0FA2.0020.0002.1D14C] # MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE
+1D14D ; [*0FA3.0020.0002.1D14D] # MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK
+1D14E ; [*0FA4.0020.0002.1D14E] # MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE
+1D14F ; [*0FA5.0020.0002.1D14F] # MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK
+1D150 ; [*0FA6.0020.0002.1D150] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE
+1D151 ; [*0FA7.0020.0002.1D151] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK
+1D152 ; [*0FA8.0020.0002.1D152] # MUSICAL SYMBOL MOON NOTEHEAD WHITE
+1D153 ; [*0FA9.0020.0002.1D153] # MUSICAL SYMBOL MOON NOTEHEAD BLACK
+1D154 ; [*0FAA.0020.0002.1D154] # MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE
+1D155 ; [*0FAB.0020.0002.1D155] # MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK
+1D156 ; [*0FAC.0020.0002.1D156] # MUSICAL SYMBOL PARENTHESIS NOTEHEAD
+1D157 ; [*0FAD.0020.0002.1D157] # MUSICAL SYMBOL VOID NOTEHEAD
+1D158 ; [*0FAE.0020.0002.1D158] # MUSICAL SYMBOL NOTEHEAD BLACK
+1D159 ; [*0FAF.0020.0002.1D159] # MUSICAL SYMBOL NULL NOTEHEAD
+1D15A ; [*0FB0.0020.0002.1D15A] # MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE
+1D15B ; [*0FB1.0020.0002.1D15B] # MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK
+1D15C ; [*0FB2.0020.0002.1D15C] # MUSICAL SYMBOL BREVE
+1D15D ; [*0FB3.0020.0002.1D15D] # MUSICAL SYMBOL WHOLE NOTE
+1D15E ; [*0FAD.0020.0002.1D157][.0000.0000.0000.1D165] # MUSICAL SYMBOL HALF NOTE; QQCN
+1D15F ; [*0FAE.0020.0002.1D158][.0000.0000.0000.1D165] # MUSICAL SYMBOL QUARTER NOTE; QQCN
+1D160 ; [*0FAE.0020.0002.1D158][.0000.0000.0000.1D165][.0000.0000.0000.1D16E] # MUSICAL SYMBOL EIGHTH NOTE; QQCN
+1D161 ; [*0FAE.0020.0002.1D158][.0000.0000.0000.1D165][.0000.0000.0000.1D16F] # MUSICAL SYMBOL SIXTEENTH NOTE; QQCN
+1D162 ; [*0FAE.0020.0002.1D158][.0000.0000.0000.1D165][.0000.0000.0000.1D170] # MUSICAL SYMBOL THIRTY-SECOND NOTE; QQCN
+1D163 ; [*0FAE.0020.0002.1D158][.0000.0000.0000.1D165][.0000.0000.0000.1D171] # MUSICAL SYMBOL SIXTY-FOURTH NOTE; QQCN
+1D164 ; [*0FAE.0020.0002.1D158][.0000.0000.0000.1D165][.0000.0000.0000.1D172] # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE; QQCN
+1D165 ; [.0000.0000.0000.1D165] # MUSICAL SYMBOL COMBINING STEM
+1D166 ; [.0000.0000.0000.1D166] # MUSICAL SYMBOL COMBINING SPRECHGESANG STEM
+1D167 ; [.0000.0000.0000.1D167] # MUSICAL SYMBOL COMBINING TREMOLO-1
+1D168 ; [.0000.0000.0000.1D168] # MUSICAL SYMBOL COMBINING TREMOLO-2
+1D169 ; [.0000.0000.0000.1D169] # MUSICAL SYMBOL COMBINING TREMOLO-3
+1D16A ; [*0FB4.0020.0002.1D16A] # MUSICAL SYMBOL FINGERED TREMOLO-1
+1D16B ; [*0FB5.0020.0002.1D16B] # MUSICAL SYMBOL FINGERED TREMOLO-2
+1D16C ; [*0FB6.0020.0002.1D16C] # MUSICAL SYMBOL FINGERED TREMOLO-3
+1D16D ; [.0000.0000.0000.1D16D] # MUSICAL SYMBOL COMBINING AUGMENTATION DOT
+1D16E ; [.0000.0000.0000.1D16E] # MUSICAL SYMBOL COMBINING FLAG-1
+1D16F ; [.0000.0000.0000.1D16F] # MUSICAL SYMBOL COMBINING FLAG-2
+1D170 ; [.0000.0000.0000.1D170] # MUSICAL SYMBOL COMBINING FLAG-3
+1D171 ; [.0000.0000.0000.1D171] # MUSICAL SYMBOL COMBINING FLAG-4
+1D172 ; [.0000.0000.0000.1D172] # MUSICAL SYMBOL COMBINING FLAG-5
+1D17B ; [.0000.0000.0000.1D17B] # MUSICAL SYMBOL COMBINING ACCENT
+1D17C ; [.0000.0000.0000.1D17C] # MUSICAL SYMBOL COMBINING STACCATO
+1D17D ; [.0000.0000.0000.1D17D] # MUSICAL SYMBOL COMBINING TENUTO
+1D17E ; [.0000.0000.0000.1D17E] # MUSICAL SYMBOL COMBINING STACCATISSIMO
+1D17F ; [.0000.0000.0000.1D17F] # MUSICAL SYMBOL COMBINING MARCATO
+1D180 ; [.0000.0000.0000.1D180] # MUSICAL SYMBOL COMBINING MARCATO-STACCATO
+1D181 ; [.0000.0000.0000.1D181] # MUSICAL SYMBOL COMBINING ACCENT-STACCATO
+1D182 ; [.0000.0000.0000.1D182] # MUSICAL SYMBOL COMBINING LOURE
+1D183 ; [*0FB7.0020.0002.1D183] # MUSICAL SYMBOL ARPEGGIATO UP
+1D184 ; [*0FB8.0020.0002.1D184] # MUSICAL SYMBOL ARPEGGIATO DOWN
+1D185 ; [.0000.0000.0000.1D185] # MUSICAL SYMBOL COMBINING DOIT
+1D186 ; [.0000.0000.0000.1D186] # MUSICAL SYMBOL COMBINING RIP
+1D187 ; [.0000.0000.0000.1D187] # MUSICAL SYMBOL COMBINING FLIP
+1D188 ; [.0000.0000.0000.1D188] # MUSICAL SYMBOL COMBINING SMEAR
+1D189 ; [.0000.0000.0000.1D189] # MUSICAL SYMBOL COMBINING BEND
+1D18A ; [.0000.0000.0000.1D18A] # MUSICAL SYMBOL COMBINING DOUBLE TONGUE
+1D18B ; [.0000.0000.0000.1D18B] # MUSICAL SYMBOL COMBINING TRIPLE TONGUE
+1D18C ; [*0FB9.0020.0002.1D18C] # MUSICAL SYMBOL RINFORZANDO
+1D18D ; [*0FBA.0020.0002.1D18D] # MUSICAL SYMBOL SUBITO
+1D18E ; [*0FBB.0020.0002.1D18E] # MUSICAL SYMBOL Z
+1D18F ; [*0FBC.0020.0002.1D18F] # MUSICAL SYMBOL PIANO
+1D190 ; [*0FBD.0020.0002.1D190] # MUSICAL SYMBOL MEZZO
+1D191 ; [*0FBE.0020.0002.1D191] # MUSICAL SYMBOL FORTE
+1D192 ; [*0FBF.0020.0002.1D192] # MUSICAL SYMBOL CRESCENDO
+1D193 ; [*0FC0.0020.0002.1D193] # MUSICAL SYMBOL DECRESCENDO
+1D194 ; [*0FC1.0020.0002.1D194] # MUSICAL SYMBOL GRACE NOTE SLASH
+1D195 ; [*0FC2.0020.0002.1D195] # MUSICAL SYMBOL GRACE NOTE NO SLASH
+1D196 ; [*0FC3.0020.0002.1D196] # MUSICAL SYMBOL TR
+1D197 ; [*0FC4.0020.0002.1D197] # MUSICAL SYMBOL TURN
+1D198 ; [*0FC5.0020.0002.1D198] # MUSICAL SYMBOL INVERTED TURN
+1D199 ; [*0FC6.0020.0002.1D199] # MUSICAL SYMBOL TURN SLASH
+1D19A ; [*0FC7.0020.0002.1D19A] # MUSICAL SYMBOL TURN UP
+1D19B ; [*0FC8.0020.0002.1D19B] # MUSICAL SYMBOL ORNAMENT STROKE-1
+1D19C ; [*0FC9.0020.0002.1D19C] # MUSICAL SYMBOL ORNAMENT STROKE-2
+1D19D ; [*0FCA.0020.0002.1D19D] # MUSICAL SYMBOL ORNAMENT STROKE-3
+1D19E ; [*0FCB.0020.0002.1D19E] # MUSICAL SYMBOL ORNAMENT STROKE-4
+1D19F ; [*0FCC.0020.0002.1D19F] # MUSICAL SYMBOL ORNAMENT STROKE-5
+1D1A0 ; [*0FCD.0020.0002.1D1A0] # MUSICAL SYMBOL ORNAMENT STROKE-6
+1D1A1 ; [*0FCE.0020.0002.1D1A1] # MUSICAL SYMBOL ORNAMENT STROKE-7
+1D1A2 ; [*0FCF.0020.0002.1D1A2] # MUSICAL SYMBOL ORNAMENT STROKE-8
+1D1A3 ; [*0FD0.0020.0002.1D1A3] # MUSICAL SYMBOL ORNAMENT STROKE-9
+1D1A4 ; [*0FD1.0020.0002.1D1A4] # MUSICAL SYMBOL ORNAMENT STROKE-10
+1D1A5 ; [*0FD2.0020.0002.1D1A5] # MUSICAL SYMBOL ORNAMENT STROKE-11
+1D1A6 ; [*0FD3.0020.0002.1D1A6] # MUSICAL SYMBOL HAUPTSTIMME
+1D1A7 ; [*0FD4.0020.0002.1D1A7] # MUSICAL SYMBOL NEBENSTIMME
+1D1A8 ; [*0FD5.0020.0002.1D1A8] # MUSICAL SYMBOL END OF STIMME
+1D1A9 ; [*0FD6.0020.0002.1D1A9] # MUSICAL SYMBOL DEGREE SLASH
+1D1AA ; [.0000.0000.0000.1D1AA] # MUSICAL SYMBOL COMBINING DOWN BOW
+1D1AB ; [.0000.0000.0000.1D1AB] # MUSICAL SYMBOL COMBINING UP BOW
+1D1AC ; [.0000.0000.0000.1D1AC] # MUSICAL SYMBOL COMBINING HARMONIC
+1D1AD ; [.0000.0000.0000.1D1AD] # MUSICAL SYMBOL COMBINING SNAP PIZZICATO
+1D1AE ; [*0FD7.0020.0002.1D1AE] # MUSICAL SYMBOL PEDAL MARK
+1D1AF ; [*0FD8.0020.0002.1D1AF] # MUSICAL SYMBOL PEDAL UP MARK
+1D1B0 ; [*0FD9.0020.0002.1D1B0] # MUSICAL SYMBOL HALF PEDAL MARK
+1D1B1 ; [*0FDA.0020.0002.1D1B1] # MUSICAL SYMBOL GLISSANDO UP
+1D1B2 ; [*0FDB.0020.0002.1D1B2] # MUSICAL SYMBOL GLISSANDO DOWN
+1D1B3 ; [*0FDC.0020.0002.1D1B3] # MUSICAL SYMBOL WITH FINGERNAILS
+1D1B4 ; [*0FDD.0020.0002.1D1B4] # MUSICAL SYMBOL DAMP
+1D1B5 ; [*0FDE.0020.0002.1D1B5] # MUSICAL SYMBOL DAMP ALL
+1D1B6 ; [*0FDF.0020.0002.1D1B6] # MUSICAL SYMBOL MAXIMA
+1D1B7 ; [*0FE0.0020.0002.1D1B7] # MUSICAL SYMBOL LONGA
+1D1B8 ; [*0FE1.0020.0002.1D1B8] # MUSICAL SYMBOL BREVIS
+1D1B9 ; [*0FE2.0020.0002.1D1B9] # MUSICAL SYMBOL SEMIBREVIS WHITE
+1D1BA ; [*0FE3.0020.0002.1D1BA] # MUSICAL SYMBOL SEMIBREVIS BLACK
+1D1BB ; [*0FE2.0020.0002.1D1B9][.0000.0000.0000.1D165] # MUSICAL SYMBOL MINIMA; QQCN
+1D1BC ; [*0FE3.0020.0002.1D1BA][.0000.0000.0000.1D165] # MUSICAL SYMBOL MINIMA BLACK; QQCN
+1D1BD ; [*0FE2.0020.0002.1D1B9][.0000.0000.0000.1D165][.0000.0000.0000.1D16E] # MUSICAL SYMBOL SEMIMINIMA WHITE; QQCN
+1D1BE ; [*0FE3.0020.0002.1D1BA][.0000.0000.0000.1D165][.0000.0000.0000.1D16E] # MUSICAL SYMBOL SEMIMINIMA BLACK; QQCN
+1D1BF ; [*0FE2.0020.0002.1D1B9][.0000.0000.0000.1D165][.0000.0000.0000.1D16F] # MUSICAL SYMBOL FUSA WHITE; QQCN
+1D1C0 ; [*0FE3.0020.0002.1D1BA][.0000.0000.0000.1D165][.0000.0000.0000.1D16F] # MUSICAL SYMBOL FUSA BLACK; QQCN
+1D1C1 ; [*0FE4.0020.0002.1D1C1] # MUSICAL SYMBOL LONGA PERFECTA REST
+1D1C2 ; [*0FE5.0020.0002.1D1C2] # MUSICAL SYMBOL LONGA IMPERFECTA REST
+1D1C3 ; [*0FE6.0020.0002.1D1C3] # MUSICAL SYMBOL BREVIS REST
+1D1C4 ; [*0FE7.0020.0002.1D1C4] # MUSICAL SYMBOL SEMIBREVIS REST
+1D1C5 ; [*0FE8.0020.0002.1D1C5] # MUSICAL SYMBOL MINIMA REST
+1D1C6 ; [*0FE9.0020.0002.1D1C6] # MUSICAL SYMBOL SEMIMINIMA REST
+1D1C7 ; [*0FEA.0020.0002.1D1C7] # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA
+1D1C8 ; [*0FEB.0020.0002.1D1C8] # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA
+1D1C9 ; [*0FEC.0020.0002.1D1C9] # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1
+1D1CA ; [*0FED.0020.0002.1D1CA] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA
+1D1CB ; [*0FEE.0020.0002.1D1CB] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA
+1D1CC ; [*0FEF.0020.0002.1D1CC] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1
+1D1CD ; [*0FF0.0020.0002.1D1CD] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2
+1D1CE ; [*0FF1.0020.0002.1D1CE] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3
+1D1CF ; [*0FF2.0020.0002.1D1CF] # MUSICAL SYMBOL CROIX
+1D1D0 ; [*0FF3.0020.0002.1D1D0] # MUSICAL SYMBOL GREGORIAN C CLEF
+1D1D1 ; [*0FF4.0020.0002.1D1D1] # MUSICAL SYMBOL GREGORIAN F CLEF
+1D1D2 ; [*0FF5.0020.0002.1D1D2] # MUSICAL SYMBOL SQUARE B
+1D1D3 ; [*0FF6.0020.0002.1D1D3] # MUSICAL SYMBOL VIRGA
+1D1D4 ; [*0FF7.0020.0002.1D1D4] # MUSICAL SYMBOL PODATUS
+1D1D5 ; [*0FF8.0020.0002.1D1D5] # MUSICAL SYMBOL CLIVIS
+1D1D6 ; [*0FF9.0020.0002.1D1D6] # MUSICAL SYMBOL SCANDICUS
+1D1D7 ; [*0FFA.0020.0002.1D1D7] # MUSICAL SYMBOL CLIMACUS
+1D1D8 ; [*0FFB.0020.0002.1D1D8] # MUSICAL SYMBOL TORCULUS
+1D1D9 ; [*0FFC.0020.0002.1D1D9] # MUSICAL SYMBOL PORRECTUS
+1D1DA ; [*0FFD.0020.0002.1D1DA] # MUSICAL SYMBOL PORRECTUS FLEXUS
+1D1DB ; [*0FFE.0020.0002.1D1DB] # MUSICAL SYMBOL SCANDICUS FLEXUS
+1D1DC ; [*0FFF.0020.0002.1D1DC] # MUSICAL SYMBOL TORCULUS RESUPINUS
+1D1DD ; [*1000.0020.0002.1D1DD] # MUSICAL SYMBOL PES SUBPUNCTIS
+1D200 ; [*1001.0020.0002.1D200] # GREEK VOCAL NOTATION SYMBOL-1
+1D201 ; [*1002.0020.0002.1D201] # GREEK VOCAL NOTATION SYMBOL-2
+1D202 ; [*1003.0020.0002.1D202] # GREEK VOCAL NOTATION SYMBOL-3
+1D203 ; [*1004.0020.0002.1D203] # GREEK VOCAL NOTATION SYMBOL-4
+1D204 ; [*1005.0020.0002.1D204] # GREEK VOCAL NOTATION SYMBOL-5
+1D205 ; [*1006.0020.0002.1D205] # GREEK VOCAL NOTATION SYMBOL-6
+1D206 ; [*1007.0020.0002.1D206] # GREEK VOCAL NOTATION SYMBOL-7
+1D207 ; [*1008.0020.0002.1D207] # GREEK VOCAL NOTATION SYMBOL-8
+1D208 ; [*1009.0020.0002.1D208] # GREEK VOCAL NOTATION SYMBOL-9
+1D209 ; [*100A.0020.0002.1D209] # GREEK VOCAL NOTATION SYMBOL-10
+1D20A ; [*100B.0020.0002.1D20A] # GREEK VOCAL NOTATION SYMBOL-11
+1D20B ; [*100C.0020.0002.1D20B] # GREEK VOCAL NOTATION SYMBOL-12
+1D20C ; [*100D.0020.0002.1D20C] # GREEK VOCAL NOTATION SYMBOL-13
+1D20D ; [*100E.0020.0002.1D20D] # GREEK VOCAL NOTATION SYMBOL-14
+1D20E ; [*100F.0020.0002.1D20E] # GREEK VOCAL NOTATION SYMBOL-15
+1D20F ; [*1010.0020.0002.1D20F] # GREEK VOCAL NOTATION SYMBOL-16
+1D210 ; [*1011.0020.0002.1D210] # GREEK VOCAL NOTATION SYMBOL-17
+1D211 ; [*1012.0020.0002.1D211] # GREEK VOCAL NOTATION SYMBOL-18
+1D212 ; [*1013.0020.0002.1D212] # GREEK VOCAL NOTATION SYMBOL-19
+1D213 ; [*1014.0020.0002.1D213] # GREEK VOCAL NOTATION SYMBOL-20
+1D214 ; [*1015.0020.0002.1D214] # GREEK VOCAL NOTATION SYMBOL-21
+1D215 ; [*1016.0020.0002.1D215] # GREEK VOCAL NOTATION SYMBOL-22
+1D216 ; [*1017.0020.0002.1D216] # GREEK VOCAL NOTATION SYMBOL-23
+1D217 ; [*1018.0020.0002.1D217] # GREEK VOCAL NOTATION SYMBOL-24
+1D218 ; [*1019.0020.0002.1D218] # GREEK VOCAL NOTATION SYMBOL-50
+1D219 ; [*101A.0020.0002.1D219] # GREEK VOCAL NOTATION SYMBOL-51
+1D21A ; [*101B.0020.0002.1D21A] # GREEK VOCAL NOTATION SYMBOL-52
+1D21B ; [*101C.0020.0002.1D21B] # GREEK VOCAL NOTATION SYMBOL-53
+1D21C ; [*101D.0020.0002.1D21C] # GREEK VOCAL NOTATION SYMBOL-54
+1D21D ; [*101E.0020.0002.1D21D] # GREEK INSTRUMENTAL NOTATION SYMBOL-1
+1D21E ; [*101F.0020.0002.1D21E] # GREEK INSTRUMENTAL NOTATION SYMBOL-2
+1D21F ; [*1020.0020.0002.1D21F] # GREEK INSTRUMENTAL NOTATION SYMBOL-4
+1D220 ; [*1021.0020.0002.1D220] # GREEK INSTRUMENTAL NOTATION SYMBOL-5
+1D221 ; [*1022.0020.0002.1D221] # GREEK INSTRUMENTAL NOTATION SYMBOL-7
+1D222 ; [*1023.0020.0002.1D222] # GREEK INSTRUMENTAL NOTATION SYMBOL-8
+1D223 ; [*1024.0020.0002.1D223] # GREEK INSTRUMENTAL NOTATION SYMBOL-11
+1D224 ; [*1025.0020.0002.1D224] # GREEK INSTRUMENTAL NOTATION SYMBOL-12
+1D225 ; [*1026.0020.0002.1D225] # GREEK INSTRUMENTAL NOTATION SYMBOL-13
+1D226 ; [*1027.0020.0002.1D226] # GREEK INSTRUMENTAL NOTATION SYMBOL-14
+1D227 ; [*1028.0020.0002.1D227] # GREEK INSTRUMENTAL NOTATION SYMBOL-17
+1D228 ; [*1029.0020.0002.1D228] # GREEK INSTRUMENTAL NOTATION SYMBOL-18
+1D229 ; [*102A.0020.0002.1D229] # GREEK INSTRUMENTAL NOTATION SYMBOL-19
+1D22A ; [*102B.0020.0002.1D22A] # GREEK INSTRUMENTAL NOTATION SYMBOL-23
+1D22B ; [*102C.0020.0002.1D22B] # GREEK INSTRUMENTAL NOTATION SYMBOL-24
+1D22C ; [*102D.0020.0002.1D22C] # GREEK INSTRUMENTAL NOTATION SYMBOL-25
+1D22D ; [*102E.0020.0002.1D22D] # GREEK INSTRUMENTAL NOTATION SYMBOL-26
+1D22E ; [*102F.0020.0002.1D22E] # GREEK INSTRUMENTAL NOTATION SYMBOL-27
+1D22F ; [*1030.0020.0002.1D22F] # GREEK INSTRUMENTAL NOTATION SYMBOL-29
+1D230 ; [*1031.0020.0002.1D230] # GREEK INSTRUMENTAL NOTATION SYMBOL-30
+1D231 ; [*1032.0020.0002.1D231] # GREEK INSTRUMENTAL NOTATION SYMBOL-32
+1D232 ; [*1033.0020.0002.1D232] # GREEK INSTRUMENTAL NOTATION SYMBOL-36
+1D233 ; [*1034.0020.0002.1D233] # GREEK INSTRUMENTAL NOTATION SYMBOL-37
+1D234 ; [*1035.0020.0002.1D234] # GREEK INSTRUMENTAL NOTATION SYMBOL-38
+1D235 ; [*1036.0020.0002.1D235] # GREEK INSTRUMENTAL NOTATION SYMBOL-39
+1D236 ; [*1037.0020.0002.1D236] # GREEK INSTRUMENTAL NOTATION SYMBOL-40
+1D237 ; [*1038.0020.0002.1D237] # GREEK INSTRUMENTAL NOTATION SYMBOL-42
+1D238 ; [*1039.0020.0002.1D238] # GREEK INSTRUMENTAL NOTATION SYMBOL-43
+1D239 ; [*103A.0020.0002.1D239] # GREEK INSTRUMENTAL NOTATION SYMBOL-45
+1D23A ; [*103B.0020.0002.1D23A] # GREEK INSTRUMENTAL NOTATION SYMBOL-47
+1D23B ; [*103C.0020.0002.1D23B] # GREEK INSTRUMENTAL NOTATION SYMBOL-48
+1D23C ; [*103D.0020.0002.1D23C] # GREEK INSTRUMENTAL NOTATION SYMBOL-49
+1D23D ; [*103E.0020.0002.1D23D] # GREEK INSTRUMENTAL NOTATION SYMBOL-50
+1D23E ; [*103F.0020.0002.1D23E] # GREEK INSTRUMENTAL NOTATION SYMBOL-51
+1D23F ; [*1040.0020.0002.1D23F] # GREEK INSTRUMENTAL NOTATION SYMBOL-52
+1D240 ; [*1041.0020.0002.1D240] # GREEK INSTRUMENTAL NOTATION SYMBOL-53
+1D241 ; [*1042.0020.0002.1D241] # GREEK INSTRUMENTAL NOTATION SYMBOL-54
+1D242 ; [.0000.0000.0000.1D242] # COMBINING GREEK MUSICAL TRISEME
+1D243 ; [.0000.0000.0000.1D243] # COMBINING GREEK MUSICAL TETRASEME
+1D244 ; [.0000.0000.0000.1D244] # COMBINING GREEK MUSICAL PENTASEME
+1D245 ; [*1043.0020.0002.1D245] # GREEK MUSICAL LEIMMA
+1D300 ; [*0D7E.0020.0002.1D300] # MONOGRAM FOR EARTH
+1D301 ; [*0D7F.0020.0002.1D301] # DIGRAM FOR HEAVENLY EARTH
+1D302 ; [*0D80.0020.0002.1D302] # DIGRAM FOR HUMAN EARTH
+1D303 ; [*0D81.0020.0002.1D303] # DIGRAM FOR EARTHLY HEAVEN
+1D304 ; [*0D82.0020.0002.1D304] # DIGRAM FOR EARTHLY HUMAN
+1D305 ; [*0D83.0020.0002.1D305] # DIGRAM FOR EARTH
+1D306 ; [*0D84.0020.0002.1D306] # TETRAGRAM FOR CENTRE
+1D307 ; [*0D85.0020.0002.1D307] # TETRAGRAM FOR FULL CIRCLE
+1D308 ; [*0D86.0020.0002.1D308] # TETRAGRAM FOR MIRED
+1D309 ; [*0D87.0020.0002.1D309] # TETRAGRAM FOR BARRIER
+1D30A ; [*0D88.0020.0002.1D30A] # TETRAGRAM FOR KEEPING SMALL
+1D30B ; [*0D89.0020.0002.1D30B] # TETRAGRAM FOR CONTRARIETY
+1D30C ; [*0D8A.0020.0002.1D30C] # TETRAGRAM FOR ASCENT
+1D30D ; [*0D8B.0020.0002.1D30D] # TETRAGRAM FOR OPPOSITION
+1D30E ; [*0D8C.0020.0002.1D30E] # TETRAGRAM FOR BRANCHING OUT
+1D30F ; [*0D8D.0020.0002.1D30F] # TETRAGRAM FOR DEFECTIVENESS OR DISTORTION
+1D310 ; [*0D8E.0020.0002.1D310] # TETRAGRAM FOR DIVERGENCE
+1D311 ; [*0D8F.0020.0002.1D311] # TETRAGRAM FOR YOUTHFULNESS
+1D312 ; [*0D90.0020.0002.1D312] # TETRAGRAM FOR INCREASE
+1D313 ; [*0D91.0020.0002.1D313] # TETRAGRAM FOR PENETRATION
+1D314 ; [*0D92.0020.0002.1D314] # TETRAGRAM FOR REACH
+1D315 ; [*0D93.0020.0002.1D315] # TETRAGRAM FOR CONTACT
+1D316 ; [*0D94.0020.0002.1D316] # TETRAGRAM FOR HOLDING BACK
+1D317 ; [*0D95.0020.0002.1D317] # TETRAGRAM FOR WAITING
+1D318 ; [*0D96.0020.0002.1D318] # TETRAGRAM FOR FOLLOWING
+1D319 ; [*0D97.0020.0002.1D319] # TETRAGRAM FOR ADVANCE
+1D31A ; [*0D98.0020.0002.1D31A] # TETRAGRAM FOR RELEASE
+1D31B ; [*0D99.0020.0002.1D31B] # TETRAGRAM FOR RESISTANCE
+1D31C ; [*0D9A.0020.0002.1D31C] # TETRAGRAM FOR EASE
+1D31D ; [*0D9B.0020.0002.1D31D] # TETRAGRAM FOR JOY
+1D31E ; [*0D9C.0020.0002.1D31E] # TETRAGRAM FOR CONTENTION
+1D31F ; [*0D9D.0020.0002.1D31F] # TETRAGRAM FOR ENDEAVOUR
+1D320 ; [*0D9E.0020.0002.1D320] # TETRAGRAM FOR DUTIES
+1D321 ; [*0D9F.0020.0002.1D321] # TETRAGRAM FOR CHANGE
+1D322 ; [*0DA0.0020.0002.1D322] # TETRAGRAM FOR DECISIVENESS
+1D323 ; [*0DA1.0020.0002.1D323] # TETRAGRAM FOR BOLD RESOLUTION
+1D324 ; [*0DA2.0020.0002.1D324] # TETRAGRAM FOR PACKING
+1D325 ; [*0DA3.0020.0002.1D325] # TETRAGRAM FOR LEGION
+1D326 ; [*0DA4.0020.0002.1D326] # TETRAGRAM FOR CLOSENESS
+1D327 ; [*0DA5.0020.0002.1D327] # TETRAGRAM FOR KINSHIP
+1D328 ; [*0DA6.0020.0002.1D328] # TETRAGRAM FOR GATHERING
+1D329 ; [*0DA7.0020.0002.1D329] # TETRAGRAM FOR STRENGTH
+1D32A ; [*0DA8.0020.0002.1D32A] # TETRAGRAM FOR PURITY
+1D32B ; [*0DA9.0020.0002.1D32B] # TETRAGRAM FOR FULLNESS
+1D32C ; [*0DAA.0020.0002.1D32C] # TETRAGRAM FOR RESIDENCE
+1D32D ; [*0DAB.0020.0002.1D32D] # TETRAGRAM FOR LAW OR MODEL
+1D32E ; [*0DAC.0020.0002.1D32E] # TETRAGRAM FOR RESPONSE
+1D32F ; [*0DAD.0020.0002.1D32F] # TETRAGRAM FOR GOING TO MEET
+1D330 ; [*0DAE.0020.0002.1D330] # TETRAGRAM FOR ENCOUNTERS
+1D331 ; [*0DAF.0020.0002.1D331] # TETRAGRAM FOR STOVE
+1D332 ; [*0DB0.0020.0002.1D332] # TETRAGRAM FOR GREATNESS
+1D333 ; [*0DB1.0020.0002.1D333] # TETRAGRAM FOR ENLARGEMENT
+1D334 ; [*0DB2.0020.0002.1D334] # TETRAGRAM FOR PATTERN
+1D335 ; [*0DB3.0020.0002.1D335] # TETRAGRAM FOR RITUAL
+1D336 ; [*0DB4.0020.0002.1D336] # TETRAGRAM FOR FLIGHT
+1D337 ; [*0DB5.0020.0002.1D337] # TETRAGRAM FOR VASTNESS OR WASTING
+1D338 ; [*0DB6.0020.0002.1D338] # TETRAGRAM FOR CONSTANCY
+1D339 ; [*0DB7.0020.0002.1D339] # TETRAGRAM FOR MEASURE
+1D33A ; [*0DB8.0020.0002.1D33A] # TETRAGRAM FOR ETERNITY
+1D33B ; [*0DB9.0020.0002.1D33B] # TETRAGRAM FOR UNITY
+1D33C ; [*0DBA.0020.0002.1D33C] # TETRAGRAM FOR DIMINISHMENT
+1D33D ; [*0DBB.0020.0002.1D33D] # TETRAGRAM FOR CLOSED MOUTH
+1D33E ; [*0DBC.0020.0002.1D33E] # TETRAGRAM FOR GUARDEDNESS
+1D33F ; [*0DBD.0020.0002.1D33F] # TETRAGRAM FOR GATHERING IN
+1D340 ; [*0DBE.0020.0002.1D340] # TETRAGRAM FOR MASSING
+1D341 ; [*0DBF.0020.0002.1D341] # TETRAGRAM FOR ACCUMULATION
+1D342 ; [*0DC0.0020.0002.1D342] # TETRAGRAM FOR EMBELLISHMENT
+1D343 ; [*0DC1.0020.0002.1D343] # TETRAGRAM FOR DOUBT
+1D344 ; [*0DC2.0020.0002.1D344] # TETRAGRAM FOR WATCH
+1D345 ; [*0DC3.0020.0002.1D345] # TETRAGRAM FOR SINKING
+1D346 ; [*0DC4.0020.0002.1D346] # TETRAGRAM FOR INNER
+1D347 ; [*0DC5.0020.0002.1D347] # TETRAGRAM FOR DEPARTURE
+1D348 ; [*0DC6.0020.0002.1D348] # TETRAGRAM FOR DARKENING
+1D349 ; [*0DC7.0020.0002.1D349] # TETRAGRAM FOR DIMMING
+1D34A ; [*0DC8.0020.0002.1D34A] # TETRAGRAM FOR EXHAUSTION
+1D34B ; [*0DC9.0020.0002.1D34B] # TETRAGRAM FOR SEVERANCE
+1D34C ; [*0DCA.0020.0002.1D34C] # TETRAGRAM FOR STOPPAGE
+1D34D ; [*0DCB.0020.0002.1D34D] # TETRAGRAM FOR HARDNESS
+1D34E ; [*0DCC.0020.0002.1D34E] # TETRAGRAM FOR COMPLETION
+1D34F ; [*0DCD.0020.0002.1D34F] # TETRAGRAM FOR CLOSURE
+1D350 ; [*0DCE.0020.0002.1D350] # TETRAGRAM FOR FAILURE
+1D351 ; [*0DCF.0020.0002.1D351] # TETRAGRAM FOR AGGRAVATION
+1D352 ; [*0DD0.0020.0002.1D352] # TETRAGRAM FOR COMPLIANCE
+1D353 ; [*0DD1.0020.0002.1D353] # TETRAGRAM FOR ON THE VERGE
+1D354 ; [*0DD2.0020.0002.1D354] # TETRAGRAM FOR DIFFICULTIES
+1D355 ; [*0DD3.0020.0002.1D355] # TETRAGRAM FOR LABOURING
+1D356 ; [*0DD4.0020.0002.1D356] # TETRAGRAM FOR FOSTERING
+1D369 ; [*11C5.0020.0002.1D369] # COUNTING ROD TENS DIGIT ONE
+1D36A ; [*11C6.0020.0002.1D36A] # COUNTING ROD TENS DIGIT TWO
+1D36B ; [*11C7.0020.0002.1D36B] # COUNTING ROD TENS DIGIT THREE
+1D36C ; [*11C8.0020.0002.1D36C] # COUNTING ROD TENS DIGIT FOUR
+1D36D ; [*11C9.0020.0002.1D36D] # COUNTING ROD TENS DIGIT FIVE
+1D36E ; [*11CA.0020.0002.1D36E] # COUNTING ROD TENS DIGIT SIX
+1D36F ; [*11CB.0020.0002.1D36F] # COUNTING ROD TENS DIGIT SEVEN
+1D370 ; [*11CC.0020.0002.1D370] # COUNTING ROD TENS DIGIT EIGHT
+1D371 ; [*11CD.0020.0002.1D371] # COUNTING ROD TENS DIGIT NINE
+1D6C1 ; [*0546.0020.0005.1D6C1] # MATHEMATICAL BOLD NABLA; QQK
+1D6DB ; [*0542.0020.0005.1D6DB] # MATHEMATICAL BOLD PARTIAL DIFFERENTIAL; QQK
+1D6FB ; [*0546.0020.0005.1D6FB] # MATHEMATICAL ITALIC NABLA; QQK
+1D715 ; [*0542.0020.0005.1D715] # MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL; QQK
+1D735 ; [*0546.0020.0005.1D735] # MATHEMATICAL BOLD ITALIC NABLA; QQK
+1D74F ; [*0542.0020.0005.1D74F] # MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL; QQK
+1D76F ; [*0546.0020.0005.1D76F] # MATHEMATICAL SANS-SERIF BOLD NABLA; QQK
+1D789 ; [*0542.0020.0005.1D789] # MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL; QQK
+1D7A9 ; [*0546.0020.0005.1D7A9] # MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA; QQK
+1D7C3 ; [*0542.0020.0005.1D7C3] # MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL; QQK
+1F000 ; [*1044.0020.0002.1F000] # MAHJONG TILE EAST WIND
+1F001 ; [*1045.0020.0002.1F001] # MAHJONG TILE SOUTH WIND
+1F002 ; [*1046.0020.0002.1F002] # MAHJONG TILE WEST WIND
+1F003 ; [*1047.0020.0002.1F003] # MAHJONG TILE NORTH WIND
+1F004 ; [*1048.0020.0002.1F004] # MAHJONG TILE RED DRAGON
+1F005 ; [*1049.0020.0002.1F005] # MAHJONG TILE GREEN DRAGON
+1F006 ; [*104A.0020.0002.1F006] # MAHJONG TILE WHITE DRAGON
+1F007 ; [*104B.0020.0002.1F007] # MAHJONG TILE ONE OF CHARACTERS
+1F008 ; [*104C.0020.0002.1F008] # MAHJONG TILE TWO OF CHARACTERS
+1F009 ; [*104D.0020.0002.1F009] # MAHJONG TILE THREE OF CHARACTERS
+1F00A ; [*104E.0020.0002.1F00A] # MAHJONG TILE FOUR OF CHARACTERS
+1F00B ; [*104F.0020.0002.1F00B] # MAHJONG TILE FIVE OF CHARACTERS
+1F00C ; [*1050.0020.0002.1F00C] # MAHJONG TILE SIX OF CHARACTERS
+1F00D ; [*1051.0020.0002.1F00D] # MAHJONG TILE SEVEN OF CHARACTERS
+1F00E ; [*1052.0020.0002.1F00E] # MAHJONG TILE EIGHT OF CHARACTERS
+1F00F ; [*1053.0020.0002.1F00F] # MAHJONG TILE NINE OF CHARACTERS
+1F010 ; [*1054.0020.0002.1F010] # MAHJONG TILE ONE OF BAMBOOS
+1F011 ; [*1055.0020.0002.1F011] # MAHJONG TILE TWO OF BAMBOOS
+1F012 ; [*1056.0020.0002.1F012] # MAHJONG TILE THREE OF BAMBOOS
+1F013 ; [*1057.0020.0002.1F013] # MAHJONG TILE FOUR OF BAMBOOS
+1F014 ; [*1058.0020.0002.1F014] # MAHJONG TILE FIVE OF BAMBOOS
+1F015 ; [*1059.0020.0002.1F015] # MAHJONG TILE SIX OF BAMBOOS
+1F016 ; [*105A.0020.0002.1F016] # MAHJONG TILE SEVEN OF BAMBOOS
+1F017 ; [*105B.0020.0002.1F017] # MAHJONG TILE EIGHT OF BAMBOOS
+1F018 ; [*105C.0020.0002.1F018] # MAHJONG TILE NINE OF BAMBOOS
+1F019 ; [*105D.0020.0002.1F019] # MAHJONG TILE ONE OF CIRCLES
+1F01A ; [*105E.0020.0002.1F01A] # MAHJONG TILE TWO OF CIRCLES
+1F01B ; [*105F.0020.0002.1F01B] # MAHJONG TILE THREE OF CIRCLES
+1F01C ; [*1060.0020.0002.1F01C] # MAHJONG TILE FOUR OF CIRCLES
+1F01D ; [*1061.0020.0002.1F01D] # MAHJONG TILE FIVE OF CIRCLES
+1F01E ; [*1062.0020.0002.1F01E] # MAHJONG TILE SIX OF CIRCLES
+1F01F ; [*1063.0020.0002.1F01F] # MAHJONG TILE SEVEN OF CIRCLES
+1F020 ; [*1064.0020.0002.1F020] # MAHJONG TILE EIGHT OF CIRCLES
+1F021 ; [*1065.0020.0002.1F021] # MAHJONG TILE NINE OF CIRCLES
+1F022 ; [*1066.0020.0002.1F022] # MAHJONG TILE PLUM
+1F023 ; [*1067.0020.0002.1F023] # MAHJONG TILE ORCHID
+1F024 ; [*1068.0020.0002.1F024] # MAHJONG TILE BAMBOO
+1F025 ; [*1069.0020.0002.1F025] # MAHJONG TILE CHRYSANTHEMUM
+1F026 ; [*106A.0020.0002.1F026] # MAHJONG TILE SPRING
+1F027 ; [*106B.0020.0002.1F027] # MAHJONG TILE SUMMER
+1F028 ; [*106C.0020.0002.1F028] # MAHJONG TILE AUTUMN
+1F029 ; [*106D.0020.0002.1F029] # MAHJONG TILE WINTER
+1F02A ; [*106E.0020.0002.1F02A] # MAHJONG TILE JOKER
+1F02B ; [*106F.0020.0002.1F02B] # MAHJONG TILE BACK
+1F030 ; [*1070.0020.0002.1F030] # DOMINO TILE HORIZONTAL BACK
+1F031 ; [*1071.0020.0002.1F031] # DOMINO TILE HORIZONTAL-00-00
+1F032 ; [*1072.0020.0002.1F032] # DOMINO TILE HORIZONTAL-00-01
+1F033 ; [*1073.0020.0002.1F033] # DOMINO TILE HORIZONTAL-00-02
+1F034 ; [*1074.0020.0002.1F034] # DOMINO TILE HORIZONTAL-00-03
+1F035 ; [*1075.0020.0002.1F035] # DOMINO TILE HORIZONTAL-00-04
+1F036 ; [*1076.0020.0002.1F036] # DOMINO TILE HORIZONTAL-00-05
+1F037 ; [*1077.0020.0002.1F037] # DOMINO TILE HORIZONTAL-00-06
+1F038 ; [*1078.0020.0002.1F038] # DOMINO TILE HORIZONTAL-01-00
+1F039 ; [*1079.0020.0002.1F039] # DOMINO TILE HORIZONTAL-01-01
+1F03A ; [*107A.0020.0002.1F03A] # DOMINO TILE HORIZONTAL-01-02
+1F03B ; [*107B.0020.0002.1F03B] # DOMINO TILE HORIZONTAL-01-03
+1F03C ; [*107C.0020.0002.1F03C] # DOMINO TILE HORIZONTAL-01-04
+1F03D ; [*107D.0020.0002.1F03D] # DOMINO TILE HORIZONTAL-01-05
+1F03E ; [*107E.0020.0002.1F03E] # DOMINO TILE HORIZONTAL-01-06
+1F03F ; [*107F.0020.0002.1F03F] # DOMINO TILE HORIZONTAL-02-00
+1F040 ; [*1080.0020.0002.1F040] # DOMINO TILE HORIZONTAL-02-01
+1F041 ; [*1081.0020.0002.1F041] # DOMINO TILE HORIZONTAL-02-02
+1F042 ; [*1082.0020.0002.1F042] # DOMINO TILE HORIZONTAL-02-03
+1F043 ; [*1083.0020.0002.1F043] # DOMINO TILE HORIZONTAL-02-04
+1F044 ; [*1084.0020.0002.1F044] # DOMINO TILE HORIZONTAL-02-05
+1F045 ; [*1085.0020.0002.1F045] # DOMINO TILE HORIZONTAL-02-06
+1F046 ; [*1086.0020.0002.1F046] # DOMINO TILE HORIZONTAL-03-00
+1F047 ; [*1087.0020.0002.1F047] # DOMINO TILE HORIZONTAL-03-01
+1F048 ; [*1088.0020.0002.1F048] # DOMINO TILE HORIZONTAL-03-02
+1F049 ; [*1089.0020.0002.1F049] # DOMINO TILE HORIZONTAL-03-03
+1F04A ; [*108A.0020.0002.1F04A] # DOMINO TILE HORIZONTAL-03-04
+1F04B ; [*108B.0020.0002.1F04B] # DOMINO TILE HORIZONTAL-03-05
+1F04C ; [*108C.0020.0002.1F04C] # DOMINO TILE HORIZONTAL-03-06
+1F04D ; [*108D.0020.0002.1F04D] # DOMINO TILE HORIZONTAL-04-00
+1F04E ; [*108E.0020.0002.1F04E] # DOMINO TILE HORIZONTAL-04-01
+1F04F ; [*108F.0020.0002.1F04F] # DOMINO TILE HORIZONTAL-04-02
+1F050 ; [*1090.0020.0002.1F050] # DOMINO TILE HORIZONTAL-04-03
+1F051 ; [*1091.0020.0002.1F051] # DOMINO TILE HORIZONTAL-04-04
+1F052 ; [*1092.0020.0002.1F052] # DOMINO TILE HORIZONTAL-04-05
+1F053 ; [*1093.0020.0002.1F053] # DOMINO TILE HORIZONTAL-04-06
+1F054 ; [*1094.0020.0002.1F054] # DOMINO TILE HORIZONTAL-05-00
+1F055 ; [*1095.0020.0002.1F055] # DOMINO TILE HORIZONTAL-05-01
+1F056 ; [*1096.0020.0002.1F056] # DOMINO TILE HORIZONTAL-05-02
+1F057 ; [*1097.0020.0002.1F057] # DOMINO TILE HORIZONTAL-05-03
+1F058 ; [*1098.0020.0002.1F058] # DOMINO TILE HORIZONTAL-05-04
+1F059 ; [*1099.0020.0002.1F059] # DOMINO TILE HORIZONTAL-05-05
+1F05A ; [*109A.0020.0002.1F05A] # DOMINO TILE HORIZONTAL-05-06
+1F05B ; [*109B.0020.0002.1F05B] # DOMINO TILE HORIZONTAL-06-00
+1F05C ; [*109C.0020.0002.1F05C] # DOMINO TILE HORIZONTAL-06-01
+1F05D ; [*109D.0020.0002.1F05D] # DOMINO TILE HORIZONTAL-06-02
+1F05E ; [*109E.0020.0002.1F05E] # DOMINO TILE HORIZONTAL-06-03
+1F05F ; [*109F.0020.0002.1F05F] # DOMINO TILE HORIZONTAL-06-04
+1F060 ; [*10A0.0020.0002.1F060] # DOMINO TILE HORIZONTAL-06-05
+1F061 ; [*10A1.0020.0002.1F061] # DOMINO TILE HORIZONTAL-06-06
+1F062 ; [*10A2.0020.0002.1F062] # DOMINO TILE VERTICAL BACK
+1F063 ; [*10A3.0020.0002.1F063] # DOMINO TILE VERTICAL-00-00
+1F064 ; [*10A4.0020.0002.1F064] # DOMINO TILE VERTICAL-00-01
+1F065 ; [*10A5.0020.0002.1F065] # DOMINO TILE VERTICAL-00-02
+1F066 ; [*10A6.0020.0002.1F066] # DOMINO TILE VERTICAL-00-03
+1F067 ; [*10A7.0020.0002.1F067] # DOMINO TILE VERTICAL-00-04
+1F068 ; [*10A8.0020.0002.1F068] # DOMINO TILE VERTICAL-00-05
+1F069 ; [*10A9.0020.0002.1F069] # DOMINO TILE VERTICAL-00-06
+1F06A ; [*10AA.0020.0002.1F06A] # DOMINO TILE VERTICAL-01-00
+1F06B ; [*10AB.0020.0002.1F06B] # DOMINO TILE VERTICAL-01-01
+1F06C ; [*10AC.0020.0002.1F06C] # DOMINO TILE VERTICAL-01-02
+1F06D ; [*10AD.0020.0002.1F06D] # DOMINO TILE VERTICAL-01-03
+1F06E ; [*10AE.0020.0002.1F06E] # DOMINO TILE VERTICAL-01-04
+1F06F ; [*10AF.0020.0002.1F06F] # DOMINO TILE VERTICAL-01-05
+1F070 ; [*10B0.0020.0002.1F070] # DOMINO TILE VERTICAL-01-06
+1F071 ; [*10B1.0020.0002.1F071] # DOMINO TILE VERTICAL-02-00
+1F072 ; [*10B2.0020.0002.1F072] # DOMINO TILE VERTICAL-02-01
+1F073 ; [*10B3.0020.0002.1F073] # DOMINO TILE VERTICAL-02-02
+1F074 ; [*10B4.0020.0002.1F074] # DOMINO TILE VERTICAL-02-03
+1F075 ; [*10B5.0020.0002.1F075] # DOMINO TILE VERTICAL-02-04
+1F076 ; [*10B6.0020.0002.1F076] # DOMINO TILE VERTICAL-02-05
+1F077 ; [*10B7.0020.0002.1F077] # DOMINO TILE VERTICAL-02-06
+1F078 ; [*10B8.0020.0002.1F078] # DOMINO TILE VERTICAL-03-00
+1F079 ; [*10B9.0020.0002.1F079] # DOMINO TILE VERTICAL-03-01
+1F07A ; [*10BA.0020.0002.1F07A] # DOMINO TILE VERTICAL-03-02
+1F07B ; [*10BB.0020.0002.1F07B] # DOMINO TILE VERTICAL-03-03
+1F07C ; [*10BC.0020.0002.1F07C] # DOMINO TILE VERTICAL-03-04
+1F07D ; [*10BD.0020.0002.1F07D] # DOMINO TILE VERTICAL-03-05
+1F07E ; [*10BE.0020.0002.1F07E] # DOMINO TILE VERTICAL-03-06
+1F07F ; [*10BF.0020.0002.1F07F] # DOMINO TILE VERTICAL-04-00
+1F080 ; [*10C0.0020.0002.1F080] # DOMINO TILE VERTICAL-04-01
+1F081 ; [*10C1.0020.0002.1F081] # DOMINO TILE VERTICAL-04-02
+1F082 ; [*10C2.0020.0002.1F082] # DOMINO TILE VERTICAL-04-03
+1F083 ; [*10C3.0020.0002.1F083] # DOMINO TILE VERTICAL-04-04
+1F084 ; [*10C4.0020.0002.1F084] # DOMINO TILE VERTICAL-04-05
+1F085 ; [*10C5.0020.0002.1F085] # DOMINO TILE VERTICAL-04-06
+1F086 ; [*10C6.0020.0002.1F086] # DOMINO TILE VERTICAL-05-00
+1F087 ; [*10C7.0020.0002.1F087] # DOMINO TILE VERTICAL-05-01
+1F088 ; [*10C8.0020.0002.1F088] # DOMINO TILE VERTICAL-05-02
+1F089 ; [*10C9.0020.0002.1F089] # DOMINO TILE VERTICAL-05-03
+1F08A ; [*10CA.0020.0002.1F08A] # DOMINO TILE VERTICAL-05-04
+1F08B ; [*10CB.0020.0002.1F08B] # DOMINO TILE VERTICAL-05-05
+1F08C ; [*10CC.0020.0002.1F08C] # DOMINO TILE VERTICAL-05-06
+1F08D ; [*10CD.0020.0002.1F08D] # DOMINO TILE VERTICAL-06-00
+1F08E ; [*10CE.0020.0002.1F08E] # DOMINO TILE VERTICAL-06-01
+1F08F ; [*10CF.0020.0002.1F08F] # DOMINO TILE VERTICAL-06-02
+1F090 ; [*10D0.0020.0002.1F090] # DOMINO TILE VERTICAL-06-03
+1F091 ; [*10D1.0020.0002.1F091] # DOMINO TILE VERTICAL-06-04
+1F092 ; [*10D2.0020.0002.1F092] # DOMINO TILE VERTICAL-06-05
+1F093 ; [*10D3.0020.0002.1F093] # DOMINO TILE VERTICAL-06-06
+0332  ; [.0000.0021.0002.0332] # COMBINING LOW LINE
+0313  ; [.0000.0022.0002.0313] # COMBINING COMMA ABOVE
+0343  ; [.0000.0022.0002.0343] # COMBINING GREEK KORONIS; QQC
+0486  ; [.0000.0022.0002.0486] # COMBINING CYRILLIC PSILI PNEUMATA; QQC
+2CF1  ; [.0000.0022.0002.2CF1] # COPTIC COMBINING SPIRITUS LENIS; QQC
+0314  ; [.0000.002A.0002.0314] # COMBINING REVERSED COMMA ABOVE
+0485  ; [.0000.002A.0002.0485] # COMBINING CYRILLIC DASIA PNEUMATA; QQC
+2CF0  ; [.0000.002A.0002.2CF0] # COPTIC COMBINING SPIRITUS ASPER; QQC
+0301  ; [.0000.0032.0002.0301] # COMBINING ACUTE ACCENT
+0341  ; [.0000.0032.0002.0341] # COMBINING ACUTE TONE MARK; QQC
+0954  ; [.0000.0032.0002.0954] # DEVANAGARI ACUTE ACCENT; QQC
+0300  ; [.0000.0035.0002.0300] # COMBINING GRAVE ACCENT
+0340  ; [.0000.0035.0002.0340] # COMBINING GRAVE TONE MARK; QQC
+0953  ; [.0000.0035.0002.0953] # DEVANAGARI GRAVE ACCENT; QQC
+0306  ; [.0000.0037.0002.0306] # COMBINING BREVE
+0302  ; [.0000.003C.0002.0302] # COMBINING CIRCUMFLEX ACCENT
+030C  ; [.0000.0041.0002.030C] # COMBINING CARON
+030A  ; [.0000.0043.0002.030A] # COMBINING RING ABOVE
+0342  ; [.0000.0045.0002.0342] # COMBINING GREEK PERISPOMENI
+0308  ; [.0000.0047.0002.0308] # COMBINING DIAERESIS
+0344  ; [.0000.0047.0002.0308][.0000.0032.0002.0301] # COMBINING GREEK DIALYTIKA TONOS; QQCM
+030B  ; [.0000.004D.0002.030B] # COMBINING DOUBLE ACUTE ACCENT
+0303  ; [.0000.004E.0002.0303] # COMBINING TILDE
+0307  ; [.0000.0052.0002.0307] # COMBINING DOT ABOVE
+0338  ; [.0000.0054.0002.0338] # COMBINING LONG SOLIDUS OVERLAY
+0327  ; [.0000.0056.0002.0327] # COMBINING CEDILLA
+0328  ; [.0000.0059.0002.0328] # COMBINING OGONEK
+0304  ; [.0000.005B.0002.0304] # COMBINING MACRON
+030D  ; [.0000.005F.0002.030D] # COMBINING VERTICAL LINE ABOVE; QQC
+030E  ; [.0000.005F.0002.030E] # COMBINING DOUBLE VERTICAL LINE ABOVE; QQC
+0312  ; [.0000.005F.0002.0312] # COMBINING TURNED COMMA ABOVE; QQC
+0315  ; [.0000.005F.0002.0315] # COMBINING COMMA ABOVE RIGHT; QQC
+031A  ; [.0000.005F.0002.031A] # COMBINING LEFT ANGLE ABOVE; QQC
+033D  ; [.0000.005F.0002.033D] # COMBINING X ABOVE; QQC
+033E  ; [.0000.005F.0002.033E] # COMBINING VERTICAL TILDE; QQC
+033F  ; [.0000.005F.0002.033F] # COMBINING DOUBLE OVERLINE; QQC
+0346  ; [.0000.005F.0002.0346] # COMBINING BRIDGE ABOVE; QQC
+034A  ; [.0000.005F.0002.034A] # COMBINING NOT TILDE ABOVE; QQC
+034B  ; [.0000.005F.0002.034B] # COMBINING HOMOTHETIC ABOVE; QQC
+034C  ; [.0000.005F.0002.034C] # COMBINING ALMOST EQUAL TO ABOVE; QQC
+0350  ; [.0000.005F.0002.0350] # COMBINING RIGHT ARROWHEAD ABOVE; QQC
+0351  ; [.0000.005F.0002.0351] # COMBINING LEFT HALF RING ABOVE; QQC
+0352  ; [.0000.005F.0002.0352] # COMBINING FERMATA; QQC
+0357  ; [.0000.005F.0002.0357] # COMBINING RIGHT HALF RING ABOVE; QQC
+035B  ; [.0000.005F.0002.035B] # COMBINING ZIGZAG ABOVE; QQC
+035D  ; [.0000.005F.0002.035D] # COMBINING DOUBLE BREVE; QQC
+035E  ; [.0000.005F.0002.035E] # COMBINING DOUBLE MACRON; QQC
+0484  ; [.0000.005F.0002.0484] # COMBINING CYRILLIC PALATALIZATION; QQC
+0487  ; [.0000.005F.0002.0487] # COMBINING CYRILLIC POKRYTIE; QQC
+0741  ; [.0000.005F.0002.0741] # SYRIAC QUSHSHAYA; QQC
+0745  ; [.0000.005F.0002.0745] # SYRIAC THREE DOTS ABOVE; QQC
+17CB  ; [.0000.005F.0002.17CB] # KHMER SIGN BANTOC; QQC
+17CC  ; [.0000.005F.0002.17CC] # KHMER SIGN ROBAT; QQC
+17CD  ; [.0000.005F.0002.17CD] # KHMER SIGN TOANDAKHIAT; QQC
+17CE  ; [.0000.005F.0002.17CE] # KHMER SIGN KAKABAT; QQC
+17CF  ; [.0000.005F.0002.17CF] # KHMER SIGN AHSDA; QQC
+17D0  ; [.0000.005F.0002.17D0] # KHMER SIGN SAMYOK SANNYA; QQC
+17D1  ; [.0000.005F.0002.17D1] # KHMER SIGN VIRIAM; QQC
+17DD  ; [.0000.005F.0002.17DD] # KHMER SIGN ATTHACAN; QQC
+1DC0  ; [.0000.005F.0002.1DC0] # COMBINING DOTTED GRAVE ACCENT; QQC
+1DC1  ; [.0000.005F.0002.1DC1] # COMBINING DOTTED ACUTE ACCENT; QQC
+1DC3  ; [.0000.005F.0002.1DC3] # COMBINING SUSPENSION MARK; QQC
+1DC4  ; [.0000.005F.0002.1DC4] # COMBINING MACRON-ACUTE; QQC
+1DC5  ; [.0000.005F.0002.1DC5] # COMBINING GRAVE-MACRON; QQC
+1DC6  ; [.0000.005F.0002.1DC6] # COMBINING MACRON-GRAVE; QQC
+1DC7  ; [.0000.005F.0002.1DC7] # COMBINING ACUTE-MACRON; QQC
+1DC8  ; [.0000.005F.0002.1DC8] # COMBINING GRAVE-ACUTE-GRAVE; QQC
+1DC9  ; [.0000.005F.0002.1DC9] # COMBINING ACUTE-GRAVE-ACUTE; QQC
+1DCB  ; [.0000.005F.0002.1DCB] # COMBINING BREVE-MACRON; QQC
+1DCC  ; [.0000.005F.0002.1DCC] # COMBINING MACRON-BREVE; QQC
+1DCD  ; [.0000.005F.0002.1DCD] # COMBINING DOUBLE CIRCUMFLEX ABOVE; QQC
+1DCE  ; [.0000.005F.0002.1DCE] # COMBINING OGONEK ABOVE; QQC
+1DD1  ; [.0000.005F.0002.1DD1] # COMBINING UR ABOVE; QQC
+1DFE  ; [.0000.005F.0002.1DFE] # COMBINING LEFT ARROWHEAD ABOVE; QQC
+20F0  ; [.0000.005F.0002.20F0] # COMBINING ASTERISK ABOVE; QQC
+2CEF  ; [.0000.005F.0002.2CEF] # COPTIC COMBINING NI ABOVE; QQC
+A67C  ; [.0000.005F.0002.A67C] # COMBINING CYRILLIC KAVYKA; QQC
+A67D  ; [.0000.005F.0002.A67D] # COMBINING CYRILLIC PAYEROK; QQC
+0316  ; [.0000.0060.0002.0316] # COMBINING GRAVE ACCENT BELOW; QQC
+0317  ; [.0000.0060.0002.0317] # COMBINING ACUTE ACCENT BELOW; QQC
+0318  ; [.0000.0060.0002.0318] # COMBINING LEFT TACK BELOW; QQC
+0319  ; [.0000.0060.0002.0319] # COMBINING RIGHT TACK BELOW; QQC
+031C  ; [.0000.0060.0002.031C] # COMBINING LEFT HALF RING BELOW; QQC
+031D  ; [.0000.0060.0002.031D] # COMBINING UP TACK BELOW; QQC
+031E  ; [.0000.0060.0002.031E] # COMBINING DOWN TACK BELOW; QQC
+031F  ; [.0000.0060.0002.031F] # COMBINING PLUS SIGN BELOW; QQC
+0320  ; [.0000.0060.0002.0320] # COMBINING MINUS SIGN BELOW; QQC
+0329  ; [.0000.0060.0002.0329] # COMBINING VERTICAL LINE BELOW; QQC
+032A  ; [.0000.0060.0002.032A] # COMBINING BRIDGE BELOW; QQC
+032B  ; [.0000.0060.0002.032B] # COMBINING INVERTED DOUBLE ARCH BELOW; QQC
+032C  ; [.0000.0060.0002.032C] # COMBINING CARON BELOW; QQC
+032F  ; [.0000.0060.0002.032F] # COMBINING INVERTED BREVE BELOW; QQC
+0333  ; [.0000.0060.0002.0333] # COMBINING DOUBLE LOW LINE; QQC
+033A  ; [.0000.0060.0002.033A] # COMBINING INVERTED BRIDGE BELOW; QQC
+033B  ; [.0000.0060.0002.033B] # COMBINING SQUARE BELOW; QQC
+033C  ; [.0000.0060.0002.033C] # COMBINING SEAGULL BELOW; QQC
+0347  ; [.0000.0060.0002.0347] # COMBINING EQUALS SIGN BELOW; QQC
+0348  ; [.0000.0060.0002.0348] # COMBINING DOUBLE VERTICAL LINE BELOW; QQC
+0349  ; [.0000.0060.0002.0349] # COMBINING LEFT ANGLE BELOW; QQC
+034D  ; [.0000.0060.0002.034D] # COMBINING LEFT RIGHT ARROW BELOW; QQC
+034E  ; [.0000.0060.0002.034E] # COMBINING UPWARDS ARROW BELOW; QQC
+0353  ; [.0000.0060.0002.0353] # COMBINING X BELOW; QQC
+0354  ; [.0000.0060.0002.0354] # COMBINING LEFT ARROWHEAD BELOW; QQC
+0355  ; [.0000.0060.0002.0355] # COMBINING RIGHT ARROWHEAD BELOW; QQC
+0356  ; [.0000.0060.0002.0356] # COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW; QQC
+0359  ; [.0000.0060.0002.0359] # COMBINING ASTERISK BELOW; QQC
+035A  ; [.0000.0060.0002.035A] # COMBINING DOUBLE RING BELOW; QQC
+035C  ; [.0000.0060.0002.035C] # COMBINING DOUBLE BREVE BELOW; QQC
+035F  ; [.0000.0060.0002.035F] # COMBINING DOUBLE MACRON BELOW; QQC
+0362  ; [.0000.0060.0002.0362] # COMBINING DOUBLE RIGHTWARDS ARROW BELOW; QQC
+0742  ; [.0000.0060.0002.0742] # SYRIAC RUKKAKHA; QQC
+0746  ; [.0000.0060.0002.0746] # SYRIAC THREE DOTS BELOW; QQC
+1DC2  ; [.0000.0060.0002.1DC2] # COMBINING SNAKE BELOW; QQC
+1DCF  ; [.0000.0060.0002.1DCF] # COMBINING ZIGZAG BELOW; QQC
+1DD0  ; [.0000.0060.0002.1DD0] # COMBINING IS BELOW; QQC
+1DFD  ; [.0000.0060.0002.1DFD] # COMBINING ALMOST EQUAL TO BELOW; QQC
+1DFF  ; [.0000.0060.0002.1DFF] # COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW; QQC
+20EC  ; [.0000.0060.0002.20EC] # COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS; QQC
+20ED  ; [.0000.0060.0002.20ED] # COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS; QQC
+20EE  ; [.0000.0060.0002.20EE] # COMBINING LEFT ARROW BELOW; QQC
+20EF  ; [.0000.0060.0002.20EF] # COMBINING RIGHT ARROW BELOW; QQC
+10A0D ; [.0000.0060.0002.10A0D] # KHAROSHTHI SIGN DOUBLE RING BELOW; QQC
+0336  ; [.0000.0061.0002.0336] # COMBINING LONG STROKE OVERLAY; QQC
+0337  ; [.0000.0061.0002.0337] # COMBINING SHORT SOLIDUS OVERLAY; QQC
+20D8  ; [.0000.0061.0002.20D8] # COMBINING RING OVERLAY; QQC
+20D9  ; [.0000.0061.0002.20D9] # COMBINING CLOCKWISE RING OVERLAY; QQC
+20DA  ; [.0000.0061.0002.20DA] # COMBINING ANTICLOCKWISE RING OVERLAY; QQC
+20E5  ; [.0000.0061.0002.20E5] # COMBINING REVERSE SOLIDUS OVERLAY; QQC
+20EA  ; [.0000.0061.0002.20EA] # COMBINING LEFTWARDS ARROW OVERLAY; QQC
+20EB  ; [.0000.0061.0002.20EB] # COMBINING LONG DOUBLE SOLIDUS OVERLAY; QQC
+20DD  ; [.0000.0062.0002.20DD] # COMBINING ENCLOSING CIRCLE; QQC
+20DE  ; [.0000.0062.0002.20DE] # COMBINING ENCLOSING SQUARE; QQC
+20DF  ; [.0000.0062.0002.20DF] # COMBINING ENCLOSING DIAMOND; QQC
+20E0  ; [.0000.0062.0002.20E0] # COMBINING ENCLOSING CIRCLE BACKSLASH; QQC
+20E2  ; [.0000.0062.0002.20E2] # COMBINING ENCLOSING SCREEN; QQC
+20E3  ; [.0000.0062.0002.20E3] # COMBINING ENCLOSING KEYCAP; QQC
+20E4  ; [.0000.0062.0002.20E4] # COMBINING ENCLOSING UPWARD POINTING TRIANGLE; QQC
+0305  ; [.0000.0063.0002.0305] # COMBINING OVERLINE
+0309  ; [.0000.0064.0002.0309] # COMBINING HOOK ABOVE
+030F  ; [.0000.0065.0002.030F] # COMBINING DOUBLE GRAVE ACCENT
+0310  ; [.0000.0066.0002.0310] # COMBINING CANDRABINDU
+0311  ; [.0000.0067.0002.0311] # COMBINING INVERTED BREVE
+031B  ; [.0000.0068.0002.031B] # COMBINING HORN
+0321  ; [.0000.006E.0002.0321] # COMBINING PALATALIZED HOOK BELOW
+0322  ; [.0000.006F.0002.0322] # COMBINING RETROFLEX HOOK BELOW
+0323  ; [.0000.0070.0002.0323] # COMBINING DOT BELOW
+0324  ; [.0000.0075.0002.0324] # COMBINING DIAERESIS BELOW
+0325  ; [.0000.0076.0002.0325] # COMBINING RING BELOW
+0326  ; [.0000.0077.0002.0326] # COMBINING COMMA BELOW
+032D  ; [.0000.0078.0002.032D] # COMBINING CIRCUMFLEX ACCENT BELOW
+032E  ; [.0000.0079.0002.032E] # COMBINING BREVE BELOW
+0330  ; [.0000.007A.0002.0330] # COMBINING TILDE BELOW
+0331  ; [.0000.007B.0002.0331] # COMBINING MACRON BELOW
+0334  ; [.0000.007C.0002.0334] # COMBINING TILDE OVERLAY
+0335  ; [.0000.007D.0002.0335] # COMBINING SHORT STROKE OVERLAY
+0339  ; [.0000.007E.0002.0339] # COMBINING RIGHT HALF RING BELOW
+0345  ; [.0000.007F.0002.0345] # COMBINING GREEK YPOGEGRAMMENI
+0358  ; [.0000.0080.0002.0358] # COMBINING DOT ABOVE RIGHT
+0360  ; [.0000.0081.0002.0360] # COMBINING DOUBLE TILDE
+FE22  ; [.0000.0081.0002.FE22] # COMBINING DOUBLE TILDE LEFT HALF; QQC
+0361  ; [.0000.0082.0002.0361] # COMBINING DOUBLE INVERTED BREVE
+FE20  ; [.0000.0082.0002.FE20] # COMBINING LIGATURE LEFT HALF; QQC
+0483  ; [.0000.0083.0002.0483] # COMBINING CYRILLIC TITLO
+A66F  ; [.0000.0084.0002.A66F] # COMBINING CYRILLIC VZMET
+05B0  ; [.0000.0085.0002.05B0] # HEBREW POINT SHEVA
+05B1  ; [.0000.0086.0002.05B1] # HEBREW POINT HATAF SEGOL
+05B2  ; [.0000.0087.0002.05B2] # HEBREW POINT HATAF PATAH
+05B3  ; [.0000.0088.0002.05B3] # HEBREW POINT HATAF QAMATS
+05B4  ; [.0000.0089.0002.05B4] # HEBREW POINT HIRIQ
+05B5  ; [.0000.008A.0002.05B5] # HEBREW POINT TSERE
+05B6  ; [.0000.008B.0002.05B6] # HEBREW POINT SEGOL
+05B7  ; [.0000.008C.0002.05B7] # HEBREW POINT PATAH
+05B8  ; [.0000.008D.0002.05B8] # HEBREW POINT QAMATS
+05C7  ; [.0000.008D.0002.05C7] # HEBREW POINT QAMATS QATAN; QQC
+05B9  ; [.0000.008E.0002.05B9] # HEBREW POINT HOLAM
+05BA  ; [.0000.008E.0002.05BA] # HEBREW POINT HOLAM HASER FOR VAV; QQC
+05BB  ; [.0000.008F.0002.05BB] # HEBREW POINT QUBUTS
+05C2  ; [.0000.0090.0002.05C2] # HEBREW POINT SIN DOT
+05C1  ; [.0000.0091.0002.05C1] # HEBREW POINT SHIN DOT
+05BC  ; [.0000.0092.0002.05BC] # HEBREW POINT DAGESH OR MAPIQ
+05BF  ; [.0000.0095.0002.05BF] # HEBREW POINT RAFE
+FB1E  ; [.0000.0096.0002.FB1E] # HEBREW POINT JUDEO-SPANISH VARIKA
+081C  ; [.0000.0097.0002.081C] # SAMARITAN VOWEL SIGN LONG E; QQC
+081D  ; [.0000.0097.0002.081D] # SAMARITAN VOWEL SIGN E
+081E  ; [.0000.0098.0002.081E] # SAMARITAN VOWEL SIGN OVERLONG AA; QQC
+081F  ; [.0000.0098.0002.081F] # SAMARITAN VOWEL SIGN LONG AA; QQC
+0820  ; [.0000.0098.0002.0820] # SAMARITAN VOWEL SIGN AA
+0821  ; [.0000.0099.0002.0821] # SAMARITAN VOWEL SIGN OVERLONG A; QQC
+0822  ; [.0000.0099.0002.0822] # SAMARITAN VOWEL SIGN LONG A; QQC
+0823  ; [.0000.0099.0002.0823] # SAMARITAN VOWEL SIGN A
+0824  ; [.0000.009A.0002.0824] # SAMARITAN MODIFIER LETTER SHORT A; QQC
+0825  ; [.0000.009A.0002.0825] # SAMARITAN VOWEL SIGN SHORT A
+0826  ; [.0000.009B.0002.0826] # SAMARITAN VOWEL SIGN LONG U; QQC
+0827  ; [.0000.009B.0002.0827] # SAMARITAN VOWEL SIGN U
+0828  ; [.0000.009C.0002.0828] # SAMARITAN MODIFIER LETTER I; QQC
+0829  ; [.0000.009C.0002.0829] # SAMARITAN VOWEL SIGN LONG I; QQC
+082A  ; [.0000.009C.0002.082A] # SAMARITAN VOWEL SIGN I
+082B  ; [.0000.009D.0002.082B] # SAMARITAN VOWEL SIGN O
+082C  ; [.0000.009E.0002.082C] # SAMARITAN VOWEL SIGN SUKUN
+0818  ; [.0000.009F.0002.0818] # SAMARITAN MARK DAGESH
+0819  ; [.0000.00A0.0002.0819] # SAMARITAN MARK OCCLUSION
+082D  ; [.0000.00A1.0002.082D] # SAMARITAN MARK NEQUDAA
+064B  ; [.0000.00A2.0002.064B] # ARABIC FATHATAN
+FE71  ; [.0000.00A2.0018.FE71] # ARABIC TATWEEL WITH FATHATAN ABOVE; QQK
+FE70  ; [.0000.00A2.001A.FE70] # ARABIC FATHATAN ISOLATED FORM; QQK
+064C  ; [.0000.00A3.0002.064C] # ARABIC DAMMATAN
+FE72  ; [.0000.00A3.001A.FE72] # ARABIC DAMMATAN ISOLATED FORM; QQK
+FC5E  ; [.0000.00A3.001A.FC5E][.0000.00AD.001A.FC5E] # ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM; QQKA
+064D  ; [.0000.00A5.0002.064D] # ARABIC KASRATAN
+FE74  ; [.0000.00A5.001A.FE74] # ARABIC KASRATAN ISOLATED FORM; QQK
+FC5F  ; [.0000.00A5.001A.FC5F][.0000.00AD.001A.FC5F] # ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM; QQKA
+064E  ; [.0000.00A7.0002.064E] # ARABIC FATHA
+FE77  ; [.0000.00A7.0018.FE77] # ARABIC FATHA MEDIAL FORM; QQK
+FE76  ; [.0000.00A7.001A.FE76] # ARABIC FATHA ISOLATED FORM; QQK
+FCF2  ; [.0000.00A7.0018.FCF2][.0000.00AD.0018.FCF2] # ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM; QQKA
+FC60  ; [.0000.00A7.001A.FC60][.0000.00AD.001A.FC60] # ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM; QQKA
+064F  ; [.0000.00A9.0002.064F] # ARABIC DAMMA
+FE79  ; [.0000.00A9.0018.FE79] # ARABIC DAMMA MEDIAL FORM; QQK
+FE78  ; [.0000.00A9.001A.FE78] # ARABIC DAMMA ISOLATED FORM; QQK
+FCF3  ; [.0000.00A9.0018.FCF3][.0000.00AD.0018.FCF3] # ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM; QQKA
+FC61  ; [.0000.00A9.001A.FC61][.0000.00AD.001A.FC61] # ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM; QQKA
+0650  ; [.0000.00AB.0002.0650] # ARABIC KASRA
+FE7B  ; [.0000.00AB.0018.FE7B] # ARABIC KASRA MEDIAL FORM; QQK
+FE7A  ; [.0000.00AB.001A.FE7A] # ARABIC KASRA ISOLATED FORM; QQK
+FCF4  ; [.0000.00AB.0018.FCF4][.0000.00AD.0018.FCF4] # ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM; QQKA
+FC62  ; [.0000.00AB.001A.FC62][.0000.00AD.001A.FC62] # ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM; QQKA
+0651  ; [.0000.00AD.0002.0651] # ARABIC SHADDA
+FE7D  ; [.0000.00AD.0018.FE7D] # ARABIC SHADDA MEDIAL FORM; QQK
+FE7C  ; [.0000.00AD.001A.FE7C] # ARABIC SHADDA ISOLATED FORM; QQK
+FC63  ; [.0000.00AD.001A.FC63][.0000.00BC.001A.FC63] # ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM; QQKN
+0652  ; [.0000.00AF.0002.0652] # ARABIC SUKUN
+FE7F  ; [.0000.00AF.0018.FE7F] # ARABIC SUKUN MEDIAL FORM; QQK
+FE7E  ; [.0000.00AF.001A.FE7E] # ARABIC SUKUN ISOLATED FORM; QQK
+0653  ; [.0000.00B0.0002.0653] # ARABIC MADDAH ABOVE
+0654  ; [.0000.00B1.0002.0654] # ARABIC HAMZA ABOVE
+0655  ; [.0000.00B2.0002.0655] # ARABIC HAMZA BELOW
+0656  ; [.0000.00B3.0002.0656] # ARABIC SUBSCRIPT ALEF
+0657  ; [.0000.00B4.0002.0657] # ARABIC INVERTED DAMMA
+0658  ; [.0000.00B5.0002.0658] # ARABIC MARK NOON GHUNNA
+0659  ; [.0000.00B6.0002.0659] # ARABIC ZWARAKAY
+065A  ; [.0000.00B7.0002.065A] # ARABIC VOWEL SIGN SMALL V ABOVE
+065B  ; [.0000.00B8.0002.065B] # ARABIC VOWEL SIGN INVERTED SMALL V ABOVE
+065C  ; [.0000.00B9.0002.065C] # ARABIC VOWEL SIGN DOT BELOW
+065D  ; [.0000.00BA.0002.065D] # ARABIC REVERSED DAMMA
+065E  ; [.0000.00BB.0002.065E] # ARABIC FATHA WITH TWO DOTS
+0670  ; [.0000.00BC.0002.0670] # ARABIC LETTER SUPERSCRIPT ALEF
+0711  ; [.0000.00BD.0002.0711] # SYRIAC LETTER SUPERSCRIPT ALAPH
+0730  ; [.0000.00BE.0002.0730] # SYRIAC PTHAHA ABOVE
+0731  ; [.0000.00BF.0002.0731] # SYRIAC PTHAHA BELOW
+0732  ; [.0000.00C0.0002.0732] # SYRIAC PTHAHA DOTTED
+0733  ; [.0000.00C1.0002.0733] # SYRIAC ZQAPHA ABOVE
+0734  ; [.0000.00C2.0002.0734] # SYRIAC ZQAPHA BELOW
+0735  ; [.0000.00C3.0002.0735] # SYRIAC ZQAPHA DOTTED
+0736  ; [.0000.00C4.0002.0736] # SYRIAC RBASA ABOVE
+0737  ; [.0000.00C5.0002.0737] # SYRIAC RBASA BELOW
+0738  ; [.0000.00C6.0002.0738] # SYRIAC DOTTED ZLAMA HORIZONTAL
+0739  ; [.0000.00C7.0002.0739] # SYRIAC DOTTED ZLAMA ANGULAR
+073A  ; [.0000.00C8.0002.073A] # SYRIAC HBASA ABOVE
+073B  ; [.0000.00C9.0002.073B] # SYRIAC HBASA BELOW
+073C  ; [.0000.00CA.0002.073C] # SYRIAC HBASA-ESASA DOTTED
+073D  ; [.0000.00CB.0002.073D] # SYRIAC ESASA ABOVE
+073E  ; [.0000.00CC.0002.073E] # SYRIAC ESASA BELOW
+073F  ; [.0000.00CD.0002.073F] # SYRIAC RWAHA
+07EB  ; [.0000.00CE.0002.07EB] # NKO COMBINING SHORT HIGH TONE
+07EC  ; [.0000.00CF.0002.07EC] # NKO COMBINING SHORT LOW TONE
+07ED  ; [.0000.00D0.0002.07ED] # NKO COMBINING SHORT RISING TONE
+07EE  ; [.0000.00D1.0002.07EE] # NKO COMBINING LONG DESCENDING TONE
+07EF  ; [.0000.00D2.0002.07EF] # NKO COMBINING LONG HIGH TONE
+07F0  ; [.0000.00D3.0002.07F0] # NKO COMBINING LONG LOW TONE
+07F1  ; [.0000.00D4.0002.07F1] # NKO COMBINING LONG RISING TONE
+07F2  ; [.0000.00D5.0002.07F2] # NKO COMBINING NASALIZATION MARK
+07F3  ; [.0000.00D6.0002.07F3] # NKO COMBINING DOUBLE DOT ABOVE
+135F  ; [.0000.00D7.0002.135F] # ETHIOPIC COMBINING GEMINATION MARK
+A6F0  ; [.0000.00D8.0002.A6F0] # BAMUM COMBINING MARK KOQNDON
+A6F1  ; [.0000.00D9.0002.A6F1] # BAMUM COMBINING MARK TUKWENTIS
+093C  ; [.0000.00DA.0002.093C] # DEVANAGARI SIGN NUKTA
+0900  ; [.0000.00DB.0002.0900] # DEVANAGARI SIGN INVERTED CANDRABINDU; QQC
+0901  ; [.0000.00DB.0002.0901] # DEVANAGARI SIGN CANDRABINDU
+0902  ; [.0000.00DC.0002.0902] # DEVANAGARI SIGN ANUSVARA
+1CED  ; [.0000.00DC.0002.1CED] # VEDIC SIGN TIRYAK; QQC
+0903  ; [.0000.00DD.0002.0903] # DEVANAGARI SIGN VISARGA
+1CF2  ; [.0000.00DD.0002.1CF2] # VEDIC SIGN ARDHAVISARGA; QQC
+09BC  ; [.0000.00DE.0002.09BC] # BENGALI SIGN NUKTA
+0981  ; [.0000.00DF.0002.0981] # BENGALI SIGN CANDRABINDU
+0982  ; [.0000.00E0.0002.0982] # BENGALI SIGN ANUSVARA
+0983  ; [.0000.00E1.0002.0983] # BENGALI SIGN VISARGA
+0A3C  ; [.0000.00E2.0002.0A3C] # GURMUKHI SIGN NUKTA
+0A01  ; [.0000.00E3.0002.0A01] # GURMUKHI SIGN ADAK BINDI
+0A02  ; [.0000.00E4.0002.0A02] # GURMUKHI SIGN BINDI
+0A03  ; [.0000.00E5.0002.0A03] # GURMUKHI SIGN VISARGA
+0A70  ; [.0000.00E6.0002.0A70] # GURMUKHI TIPPI
+0A71  ; [.0000.00E7.0002.0A71] # GURMUKHI ADDAK
+0ABC  ; [.0000.00E8.0002.0ABC] # GUJARATI SIGN NUKTA
+0A81  ; [.0000.00E9.0002.0A81] # GUJARATI SIGN CANDRABINDU
+0A82  ; [.0000.00EA.0002.0A82] # GUJARATI SIGN ANUSVARA
+0A83  ; [.0000.00EB.0002.0A83] # GUJARATI SIGN VISARGA
+0B3C  ; [.0000.00EC.0002.0B3C] # ORIYA SIGN NUKTA
+0B01  ; [.0000.00ED.0002.0B01] # ORIYA SIGN CANDRABINDU
+0B02  ; [.0000.00EE.0002.0B02] # ORIYA SIGN ANUSVARA
+0B03  ; [.0000.00EF.0002.0B03] # ORIYA SIGN VISARGA
+0B82  ; [.0000.00F0.0002.0B82] # TAMIL SIGN ANUSVARA
+0C01  ; [.0000.00F1.0002.0C01] # TELUGU SIGN CANDRABINDU
+0C02  ; [.0000.00F2.0002.0C02] # TELUGU SIGN ANUSVARA
+0C03  ; [.0000.00F3.0002.0C03] # TELUGU SIGN VISARGA
+0CBC  ; [.0000.00F4.0002.0CBC] # KANNADA SIGN NUKTA
+0C82  ; [.0000.00F5.0002.0C82] # KANNADA SIGN ANUSVARA
+0C83  ; [.0000.00F6.0002.0C83] # KANNADA SIGN VISARGA
+0D02  ; [.0000.00F7.0002.0D02] # MALAYALAM SIGN ANUSVARA
+0D03  ; [.0000.00F8.0002.0D03] # MALAYALAM SIGN VISARGA
+0D82  ; [.0000.00F9.0002.0D82] # SINHALA SIGN ANUSVARAYA
+0D83  ; [.0000.00FA.0002.0D83] # SINHALA SIGN VISARGAYA
+1B34  ; [.0000.00FB.0002.1B34] # BALINESE SIGN REREKAN
+1B00  ; [.0000.00FC.0002.1B00] # BALINESE SIGN ULU RICEM
+1B01  ; [.0000.00FD.0002.1B01] # BALINESE SIGN ULU CANDRA
+1B02  ; [.0000.00FE.0002.1B02] # BALINESE SIGN CECEK
+1B03  ; [.0000.00FF.0002.1B03] # BALINESE SIGN SURANG
+1B04  ; [.0000.0100.0002.1B04] # BALINESE SIGN BISAH
+A9B3  ; [.0000.0101.0002.A9B3] # JAVANESE SIGN CECAK TELU
+A980  ; [.0000.0102.0002.A980] # JAVANESE SIGN PANYANGGA
+A981  ; [.0000.0103.0002.A981] # JAVANESE SIGN CECAK
+A982  ; [.0000.0104.0002.A982] # JAVANESE SIGN LAYAR
+A983  ; [.0000.0105.0002.A983] # JAVANESE SIGN WIGNYAN
+1B80  ; [.0000.0106.0002.1B80] # SUNDANESE SIGN PANYECEK
+1B81  ; [.0000.0107.0002.1B81] # SUNDANESE SIGN PANGLAYAR
+1B82  ; [.0000.0108.0002.1B82] # SUNDANESE SIGN PANGWISAD
+ABEC  ; [.0000.0109.0002.ABEC] # MEETEI MAYEK LUM IYEK
+A80B  ; [.0000.010A.0002.A80B] # SYLOTI NAGRI SIGN ANUSVARA
+A880  ; [.0000.010B.0002.A880] # SAURASHTRA SIGN ANUSVARA
+A881  ; [.0000.010C.0002.A881] # SAURASHTRA SIGN VISARGA
+10A0E ; [.0000.010D.0002.10A0E] # KHAROSHTHI SIGN ANUSVARA
+10A0F ; [.0000.010E.0002.10A0F] # KHAROSHTHI SIGN VISARGA
+10A38 ; [.0000.010F.0002.10A38] # KHAROSHTHI SIGN BAR ABOVE
+10A39 ; [.0000.0110.0002.10A39] # KHAROSHTHI SIGN CAUDA
+10A3A ; [.0000.0111.0002.10A3A] # KHAROSHTHI SIGN DOT BELOW
+110BA ; [.0000.0112.0002.110BA] # KAITHI SIGN NUKTA
+11080 ; [.0000.0113.0002.11080] # KAITHI SIGN CANDRABINDU
+11081 ; [.0000.0114.0002.11081] # KAITHI SIGN ANUSVARA
+11082 ; [.0000.0115.0002.11082] # KAITHI SIGN VISARGA
+0E4E  ; [.0000.0116.0002.0E4E] # THAI CHARACTER YAMAKKAN
+0E47  ; [.0000.0117.0002.0E47] # THAI CHARACTER MAITAIKHU
+0E48  ; [.0000.0118.0002.0E48] # THAI CHARACTER MAI EK
+0E49  ; [.0000.0119.0002.0E49] # THAI CHARACTER MAI THO
+0E4A  ; [.0000.011A.0002.0E4A] # THAI CHARACTER MAI TRI
+0E4B  ; [.0000.011B.0002.0E4B] # THAI CHARACTER MAI CHATTAWA
+0E4C  ; [.0000.011C.0002.0E4C] # THAI CHARACTER THANTHAKHAT
+0E4D  ; [.0000.011D.0002.0E4D] # THAI CHARACTER NIKHAHIT
+0EC8  ; [.0000.011E.0002.0EC8] # LAO TONE MAI EK
+0EC9  ; [.0000.011F.0002.0EC9] # LAO TONE MAI THO
+0ECA  ; [.0000.0120.0002.0ECA] # LAO TONE MAI TI
+0ECB  ; [.0000.0121.0002.0ECB] # LAO TONE MAI CATAWA
+0ECC  ; [.0000.0122.0002.0ECC] # LAO CANCELLATION MARK
+0ECD  ; [.0000.0123.0002.0ECD] # LAO NIGGAHITA
+AABF  ; [.0000.0124.0002.AABF] # TAI VIET TONE MAI EK
+AAC1  ; [.0000.0125.0002.AAC1] # TAI VIET TONE MAI THO
+0F39  ; [.0000.0126.0002.0F39] # TIBETAN MARK TSA -PHRU
+0F7E  ; [.0000.0127.0002.0F7E] # TIBETAN SIGN RJES SU NGA RO
+0F7F  ; [.0000.0128.0002.0F7F] # TIBETAN SIGN RNAM BCAD
+1C37  ; [.0000.0129.0002.1C37] # LEPCHA SIGN NUKTA
+A92B  ; [.0000.012A.0002.A92B] # KAYAH LI TONE PLOPHU
+A92C  ; [.0000.012B.0002.A92C] # KAYAH LI TONE CALYA
+A92D  ; [.0000.012C.0002.A92D] # KAYAH LI TONE CALYA PLOPHU
+1036  ; [.0000.012D.0002.1036] # MYANMAR SIGN ANUSVARA
+1037  ; [.0000.012E.0002.1037] # MYANMAR SIGN DOT BELOW
+1038  ; [.0000.012F.0002.1038] # MYANMAR SIGN VISARGA
+108D  ; [.0000.0130.0002.108D] # MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE
+17C6  ; [.0000.0131.0002.17C6] # KHMER SIGN NIKAHIT
+17C7  ; [.0000.0132.0002.17C7] # KHMER SIGN REAHMUK
+17C8  ; [.0000.0133.0002.17C8] # KHMER SIGN YUUKALEAPINTU
+17C9  ; [.0000.0134.0002.17C9] # KHMER SIGN MUUSIKATOAN
+17CA  ; [.0000.0135.0002.17CA] # KHMER SIGN TRIISAP
+1A74  ; [.0000.0136.0002.1A74] # TAI THAM SIGN MAI KANG
+1A75  ; [.0000.0137.0002.1A75] # TAI THAM SIGN TONE-1
+1A76  ; [.0000.0138.0002.1A76] # TAI THAM SIGN TONE-2
+1A77  ; [.0000.0139.0002.1A77] # TAI THAM SIGN KHUEN TONE-3
+1A78  ; [.0000.013A.0002.1A78] # TAI THAM SIGN KHUEN TONE-4
+1A79  ; [.0000.013B.0002.1A79] # TAI THAM SIGN KHUEN TONE-5
+1A7A  ; [.0000.013C.0002.1A7A] # TAI THAM SIGN RA HAAM
+1A7B  ; [.0000.013D.0002.1A7B] # TAI THAM SIGN MAI SAM
+1A7C  ; [.0000.013E.0002.1A7C] # TAI THAM SIGN KHUEN-LUE KARAN
+1939  ; [.0000.013F.0002.1939] # LIMBU SIGN MUKPHRENG
+193A  ; [.0000.0140.0002.193A] # LIMBU SIGN KEMPHRENG
+193B  ; [.0000.0141.0002.193B] # LIMBU SIGN SA-I
+302A  ; [.0000.0142.0002.302A] # IDEOGRAPHIC LEVEL TONE MARK
+302B  ; [.0000.0143.0002.302B] # IDEOGRAPHIC RISING TONE MARK
+302C  ; [.0000.0144.0002.302C] # IDEOGRAPHIC DEPARTING TONE MARK
+302D  ; [.0000.0145.0002.302D] # IDEOGRAPHIC ENTERING TONE MARK
+302E  ; [.0000.0146.0002.302E] # HANGUL SINGLE DOT TONE MARK
+302F  ; [.0000.0147.0002.302F] # HANGUL DOUBLE DOT TONE MARK
+3099  ; [.0000.0148.0002.3099] # COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+FF9E  ; [.0000.0148.0012.FF9E] # HALFWIDTH KATAKANA VOICED SOUND MARK; QQK
+309A  ; [.0000.0149.0002.309A] # COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+FF9F  ; [.0000.0149.0012.FF9F] # HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK; QQK
+20D0  ; [.0000.014A.0002.20D0] # COMBINING LEFT HARPOON ABOVE
+20D1  ; [.0000.014B.0002.20D1] # COMBINING RIGHT HARPOON ABOVE
+20D2  ; [.0000.014C.0002.20D2] # COMBINING LONG VERTICAL LINE OVERLAY
+20D3  ; [.0000.014C.0002.20D3] # COMBINING SHORT VERTICAL LINE OVERLAY; QQC
+20D4  ; [.0000.014D.0002.20D4] # COMBINING ANTICLOCKWISE ARROW ABOVE
+20D5  ; [.0000.014E.0002.20D5] # COMBINING CLOCKWISE ARROW ABOVE
+20D6  ; [.0000.014F.0002.20D6] # COMBINING LEFT ARROW ABOVE
+20D7  ; [.0000.0150.0002.20D7] # COMBINING RIGHT ARROW ABOVE
+20DB  ; [.0000.0151.0002.20DB] # COMBINING THREE DOTS ABOVE
+20DC  ; [.0000.0152.0002.20DC] # COMBINING FOUR DOTS ABOVE
+20E1  ; [.0000.0153.0002.20E1] # COMBINING LEFT RIGHT ARROW ABOVE
+20E6  ; [.0000.0154.0002.20E6] # COMBINING DOUBLE VERTICAL STROKE OVERLAY
+20E7  ; [.0000.0155.0002.20E7] # COMBINING ANNUITY SYMBOL
+20E8  ; [.0000.0156.0002.20E8] # COMBINING TRIPLE UNDERDOT
+20E9  ; [.0000.0157.0002.20E9] # COMBINING WIDE BRIDGE ABOVE
+101FD ; [.0000.0158.0002.101FD] # PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE
+02D0  ; [.11CE.0020.0002.02D0] # MODIFIER LETTER TRIANGULAR COLON
+02D1  ; [.11CF.0020.0002.02D1] # MODIFIER LETTER HALF TRIANGULAR COLON
+0971  ; [.11D0.0020.0002.0971] # DEVANAGARI SIGN HIGH SPACING DOT
+0E46  ; [.11D1.0020.0002.0E46] # THAI CHARACTER MAIYAMOK
+0EC6  ; [.11D2.0020.0002.0EC6] # LAO KO LA
+1AA7  ; [.11D3.0020.0002.1AA7] # TAI THAM SIGN MAI YAMOK
+A9CF  ; [.11D4.0020.0002.A9CF] # JAVANESE PANGRANGKEP
+AA70  ; [.11D5.0020.0002.AA70] # MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION
+AADD  ; [.11D6.0020.0002.AADD] # TAI VIET SYMBOL SAM
+3005  ; [.11D7.0020.0002.3005] # IDEOGRAPHIC ITERATION MARK
+303B  ; [.11D8.0020.0002.303B] # VERTICAL IDEOGRAPHIC ITERATION MARK
+3031  ; [.11D9.0020.0002.3031] # VERTICAL KANA REPEAT MARK
+3032  ; [.11D9.0020.0002.3031][.0000.0148.0002.3099] # VERTICAL KANA REPEAT WITH VOICED SOUND MARK; QQCM
+3033  ; [.11DA.0020.0002.3033] # VERTICAL KANA REPEAT MARK UPPER HALF
+3034  ; [.11DA.0020.0002.3033][.0000.0148.0002.3099] # VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF; QQCM
+3035  ; [.11DB.0020.0002.3035] # VERTICAL KANA REPEAT MARK LOWER HALF
+309D  ; [.11DC.0020.0002.309D] # HIRAGANA ITERATION MARK
+309E  ; [.11DC.0020.0002.309D][.0000.0148.0002.3099] # HIRAGANA VOICED ITERATION MARK; QQCM
+30FC  ; [.11DD.0020.0002.30FC] # KATAKANA-HIRAGANA PROLONGED SOUND MARK
+FF70  ; [.11DD.0020.0012.FF70] # HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK; QQK
+30FD  ; [.11DE.0020.0002.30FD] # KATAKANA ITERATION MARK
+30FE  ; [.11DE.0020.0002.30FD][.0000.0148.0002.3099] # KATAKANA VOICED ITERATION MARK; QQCM
+00A4  ; [.11DF.0020.0002.00A4] # CURRENCY SIGN
+00A2  ; [.11E0.0020.0002.00A2] # CENT SIGN
+FFE0  ; [.11E0.0020.0003.FFE0] # FULLWIDTH CENT SIGN; QQK
+0024  ; [.11E1.0020.0002.0024] # DOLLAR SIGN
+FF04  ; [.11E1.0020.0003.FF04] # FULLWIDTH DOLLAR SIGN; QQK
+FE69  ; [.11E1.0020.000F.FE69] # SMALL DOLLAR SIGN; QQK
+00A3  ; [.11E2.0020.0002.00A3] # POUND SIGN
+FFE1  ; [.11E2.0020.0003.FFE1] # FULLWIDTH POUND SIGN; QQK
+00A5  ; [.11E3.0020.0002.00A5] # YEN SIGN
+FFE5  ; [.11E3.0020.0003.FFE5] # FULLWIDTH YEN SIGN; QQK
+060B  ; [.11E4.0020.0002.060B] # AFGHANI SIGN
+09F2  ; [.11E5.0020.0002.09F2] # BENGALI RUPEE MARK
+09F3  ; [.11E6.0020.0002.09F3] # BENGALI RUPEE SIGN
+09FB  ; [.11E7.0020.0002.09FB] # BENGALI GANDA MARK
+0AF1  ; [.11E8.0020.0002.0AF1] # GUJARATI RUPEE SIGN
+A838  ; [.11E9.0020.0002.A838] # NORTH INDIC RUPEE MARK
+0BF9  ; [.11EA.0020.0002.0BF9] # TAMIL RUPEE SIGN
+0E3F  ; [.11EB.0020.0002.0E3F] # THAI CURRENCY SYMBOL BAHT
+17DB  ; [.11EC.0020.0002.17DB] # KHMER CURRENCY SYMBOL RIEL
+20A0  ; [.11ED.0020.0002.20A0] # EURO-CURRENCY SIGN
+20A1  ; [.11EE.0020.0002.20A1] # COLON SIGN
+20A2  ; [.11EF.0020.0002.20A2] # CRUZEIRO SIGN
+20A3  ; [.11F0.0020.0002.20A3] # FRENCH FRANC SIGN
+20A4  ; [.11F1.0020.0002.20A4] # LIRA SIGN
+20A5  ; [.11F2.0020.0002.20A5] # MILL SIGN
+20A6  ; [.11F3.0020.0002.20A6] # NAIRA SIGN
+20A7  ; [.11F4.0020.0002.20A7] # PESETA SIGN
+20A9  ; [.11F5.0020.0002.20A9] # WON SIGN
+FFE6  ; [.11F5.0020.0003.FFE6] # FULLWIDTH WON SIGN; QQK
+20AA  ; [.11F6.0020.0002.20AA] # NEW SHEQEL SIGN
+20AB  ; [.11F7.0020.0002.20AB] # DONG SIGN
+20AC  ; [.11F8.0020.0002.20AC] # EURO SIGN
+20AD  ; [.11F9.0020.0002.20AD] # KIP SIGN
+20AE  ; [.11FA.0020.0002.20AE] # TUGRIK SIGN
+20AF  ; [.11FB.0020.0002.20AF] # DRACHMA SIGN
+20B0  ; [.11FC.0020.0002.20B0] # GERMAN PENNY SIGN
+20B1  ; [.11FD.0020.0002.20B1] # PESO SIGN
+20B2  ; [.11FE.0020.0002.20B2] # GUARANI SIGN
+20B3  ; [.11FF.0020.0002.20B3] # AUSTRAL SIGN
+20B4  ; [.1200.0020.0002.20B4] # HRYVNIA SIGN
+20B5  ; [.1201.0020.0002.20B5] # CEDI SIGN
+20B6  ; [.1202.0020.0002.20B6] # LIVRE TOURNOIS SIGN
+20B7  ; [.1203.0020.0002.20B7] # SPESMILO SIGN
+20B8  ; [.1204.0020.0002.20B8] # TENGE SIGN
+0030  ; [.1205.0020.0002.0030] # DIGIT ZERO
+FF10  ; [.1205.0020.0003.FF10] # FULLWIDTH DIGIT ZERO; QQK
+1F100 ; [.1205.0020.0004.1F100][*0281.0020.0004.1F100] # DIGIT ZERO FULL STOP; QQKN
+1F101 ; [.1205.0020.0004.1F101][*0234.0020.0004.1F101] # DIGIT ZERO COMMA; QQKN
+1D7CE ; [.1205.0020.0005.1D7CE] # MATHEMATICAL BOLD DIGIT ZERO; QQK
+1D7D8 ; [.1205.0020.0005.1D7D8] # MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO; QQK
+1D7E2 ; [.1205.0020.0005.1D7E2] # MATHEMATICAL SANS-SERIF DIGIT ZERO; QQK
+1D7EC ; [.1205.0020.0005.1D7EC] # MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO; QQK
+1D7F6 ; [.1205.0020.0005.1D7F6] # MATHEMATICAL MONOSPACE DIGIT ZERO; QQK
+24EA  ; [.1205.0020.0006.24EA] # CIRCLED DIGIT ZERO; QQK
+24FF  ; [.1205.0020.0006.24FF] # NEGATIVE CIRCLED DIGIT ZERO; QQK
+2070  ; [.1205.0020.0014.2070] # SUPERSCRIPT ZERO; QQK
+2080  ; [.1205.0020.0015.2080] # SUBSCRIPT ZERO; QQK
+0660  ; [.1205.0020.0002.0660][.0000.015F.0002.0660] # ARABIC-INDIC DIGIT ZERO
+06F0  ; [.1205.0020.0002.06F0][.0000.0160.0002.06F0] # EXTENDED ARABIC-INDIC DIGIT ZERO
+07C0  ; [.1205.0020.0002.07C0][.0000.0162.0002.07C0] # NKO DIGIT ZERO
+104A0 ; [.1205.0020.0002.104A0][.0000.0164.0002.104A0] # OSMANYA DIGIT ZERO
+0966  ; [.1205.0020.0002.0966][.0000.0165.0002.0966] # DEVANAGARI DIGIT ZERO
+09E6  ; [.1205.0020.0002.09E6][.0000.0166.0002.09E6] # BENGALI DIGIT ZERO
+0A66  ; [.1205.0020.0002.0A66][.0000.0167.0002.0A66] # GURMUKHI DIGIT ZERO
+0AE6  ; [.1205.0020.0002.0AE6][.0000.0168.0002.0AE6] # GUJARATI DIGIT ZERO
+0B66  ; [.1205.0020.0002.0B66][.0000.0169.0002.0B66] # ORIYA DIGIT ZERO
+0BE6  ; [.1205.0020.0002.0BE6][.0000.016A.0002.0BE6] # TAMIL DIGIT ZERO
+0C66  ; [.1205.0020.0002.0C66][.0000.016B.0002.0C66] # TELUGU DIGIT ZERO
+0C78  ; [.1205.0020.0002.0C78][.0000.016B.0002.0C78] # TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR
+0CE6  ; [.1205.0020.0002.0CE6][.0000.016C.0002.0CE6] # KANNADA DIGIT ZERO
+0D66  ; [.1205.0020.0002.0D66][.0000.016D.0002.0D66] # MALAYALAM DIGIT ZERO
+ABF0  ; [.1205.0020.0002.ABF0][.0000.016E.0002.ABF0] # MEETEI MAYEK DIGIT ZERO
+A8D0  ; [.1205.0020.0002.A8D0][.0000.016F.0002.A8D0] # SAURASHTRA DIGIT ZERO
+1946  ; [.1205.0020.0002.1946][.0000.0170.0002.1946] # LIMBU DIGIT ZERO
+19D0  ; [.1205.0020.0002.19D0][.0000.0171.0002.19D0] # NEW TAI LUE DIGIT ZERO
+1A80  ; [.1205.0020.0002.1A80][.0000.0173.0002.1A80] # TAI THAM HORA DIGIT ZERO
+1A90  ; [.1205.0020.0002.1A90][.0000.0174.0002.1A90] # TAI THAM THAM DIGIT ZERO
+0E50  ; [.1205.0020.0002.0E50][.0000.0175.0002.0E50] # THAI DIGIT ZERO
+0ED0  ; [.1205.0020.0002.0ED0][.0000.0176.0002.0ED0] # LAO DIGIT ZERO
+0F20  ; [.1205.0020.0002.0F20][.0000.0177.0002.0F20] # TIBETAN DIGIT ZERO
+0F33  ; [.1205.0020.0004.0F33][.0000.0177.0004.0F33] # TIBETAN DIGIT HALF ZERO; QQK
+1C40  ; [.1205.0020.0002.1C40][.0000.0178.0002.1C40] # LEPCHA DIGIT ZERO
+A900  ; [.1205.0020.0002.A900][.0000.0179.0002.A900] # KAYAH LI DIGIT ZERO
+1040  ; [.1205.0020.0002.1040][.0000.017A.0002.1040] # MYANMAR DIGIT ZERO
+1090  ; [.1205.0020.0002.1090][.0000.017B.0002.1090] # MYANMAR SHAN DIGIT ZERO
+17E0  ; [.1205.0020.0002.17E0][.0000.017C.0002.17E0] # KHMER DIGIT ZERO
+17F0  ; [.1205.0020.0002.17F0][.0000.017D.0002.17F0] # KHMER SYMBOL LEK ATTAK SON
+AA50  ; [.1205.0020.0002.AA50][.0000.017E.0002.AA50] # CHAM DIGIT ZERO
+1B50  ; [.1205.0020.0002.1B50][.0000.017F.0002.1B50] # BALINESE DIGIT ZERO
+A9D0  ; [.1205.0020.0002.A9D0][.0000.0180.0002.A9D0] # JAVANESE DIGIT ZERO
+1BB0  ; [.1205.0020.0002.1BB0][.0000.0181.0002.1BB0] # SUNDANESE DIGIT ZERO
+1810  ; [.1205.0020.0002.1810][.0000.0182.0002.1810] # MONGOLIAN DIGIT ZERO
+1C50  ; [.1205.0020.0002.1C50][.0000.0183.0002.1C50] # OL CHIKI DIGIT ZERO
+A620  ; [.1205.0020.0002.A620][.0000.0184.0002.A620] # VAI DIGIT ZERO
+3007  ; [.1205.0020.0002.3007][.0000.0185.0002.3007] # IDEOGRAPHIC NUMBER ZERO
+1018A ; [.1205.0020.0002.1018A][.0000.0187.0002.1018A] # GREEK ZERO SIGN
+2189  ; [.1205.0020.001E.2189][*035D.0020.001E.2189][.1208.0020.001F.2189] # VULGAR FRACTION ZERO THIRDS; QQKN
+3358  ; [.1205.0020.0004.3358][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO; QQKN
+0031  ; [.1206.0020.0002.0031] # DIGIT ONE
+FF11  ; [.1206.0020.0003.FF11] # FULLWIDTH DIGIT ONE; QQK
+2474  ; [*02FF.0020.0004.2474][.1206.0020.0004.2474][*0300.0020.001F.2474] # PARENTHESIZED DIGIT ONE; QQKN
+2488  ; [.1206.0020.0004.2488][*0281.0020.0004.2488] # DIGIT ONE FULL STOP; QQKN
+1F102 ; [.1206.0020.0004.1F102][*0234.0020.0004.1F102] # DIGIT ONE COMMA; QQKN
+1D7CF ; [.1206.0020.0005.1D7CF] # MATHEMATICAL BOLD DIGIT ONE; QQK
+1D7D9 ; [.1206.0020.0005.1D7D9] # MATHEMATICAL DOUBLE-STRUCK DIGIT ONE; QQK
+1D7E3 ; [.1206.0020.0005.1D7E3] # MATHEMATICAL SANS-SERIF DIGIT ONE; QQK
+1D7ED ; [.1206.0020.0005.1D7ED] # MATHEMATICAL SANS-SERIF BOLD DIGIT ONE; QQK
+1D7F7 ; [.1206.0020.0005.1D7F7] # MATHEMATICAL MONOSPACE DIGIT ONE; QQK
+2460  ; [.1206.0020.0006.2460] # CIRCLED DIGIT ONE; QQK
+24F5  ; [.1206.0020.0006.24F5] # DOUBLE CIRCLED DIGIT ONE; QQK
+2776  ; [.1206.0020.0006.2776] # DINGBAT NEGATIVE CIRCLED DIGIT ONE; QQK
+2780  ; [.1206.0020.0006.2780] # DINGBAT CIRCLED SANS-SERIF DIGIT ONE; QQK
+278A  ; [.1206.0020.0006.278A] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE; QQK
+00B9  ; [.1206.0020.0014.00B9] # SUPERSCRIPT ONE; QQK
+2081  ; [.1206.0020.0015.2081] # SUBSCRIPT ONE; QQK
+215F  ; [.1206.0020.001E.215F][*035D.0020.001E.215F] # FRACTION NUMERATOR ONE; QQKN
+0661  ; [.1206.0020.0002.0661][.0000.015F.0002.0661] # ARABIC-INDIC DIGIT ONE
+06F1  ; [.1206.0020.0002.06F1][.0000.0160.0002.06F1] # EXTENDED ARABIC-INDIC DIGIT ONE
+10E60 ; [.1206.0020.0002.10E60][.0000.0161.0002.10E60] # RUMI DIGIT ONE
+07C1  ; [.1206.0020.0002.07C1][.0000.0162.0002.07C1] # NKO DIGIT ONE
+1369  ; [.1206.0020.0002.1369][.0000.0163.0002.1369] # ETHIOPIC DIGIT ONE
+104A1 ; [.1206.0020.0002.104A1][.0000.0164.0002.104A1] # OSMANYA DIGIT ONE
+0967  ; [.1206.0020.0002.0967][.0000.0165.0002.0967] # DEVANAGARI DIGIT ONE
+09E7  ; [.1206.0020.0002.09E7][.0000.0166.0002.09E7] # BENGALI DIGIT ONE
+0A67  ; [.1206.0020.0002.0A67][.0000.0167.0002.0A67] # GURMUKHI DIGIT ONE
+0AE7  ; [.1206.0020.0002.0AE7][.0000.0168.0002.0AE7] # GUJARATI DIGIT ONE
+0B67  ; [.1206.0020.0002.0B67][.0000.0169.0002.0B67] # ORIYA DIGIT ONE
+0BE7  ; [.1206.0020.0002.0BE7][.0000.016A.0002.0BE7] # TAMIL DIGIT ONE
+0C67  ; [.1206.0020.0002.0C67][.0000.016B.0002.0C67] # TELUGU DIGIT ONE
+0C79  ; [.1206.0020.0002.0C79][.0000.016B.0002.0C79] # TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR
+0C7C  ; [.1206.0020.0002.0C7C][.0000.016B.0002.0C7C] # TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR
+0CE7  ; [.1206.0020.0002.0CE7][.0000.016C.0002.0CE7] # KANNADA DIGIT ONE
+0D67  ; [.1206.0020.0002.0D67][.0000.016D.0002.0D67] # MALAYALAM DIGIT ONE
+ABF1  ; [.1206.0020.0002.ABF1][.0000.016E.0002.ABF1] # MEETEI MAYEK DIGIT ONE
+A8D1  ; [.1206.0020.0002.A8D1][.0000.016F.0002.A8D1] # SAURASHTRA DIGIT ONE
+1947  ; [.1206.0020.0002.1947][.0000.0170.0002.1947] # LIMBU DIGIT ONE
+19D1  ; [.1206.0020.0002.19D1][.0000.0171.0002.19D1] # NEW TAI LUE DIGIT ONE
+19DA  ; [.1206.0020.0002.19DA][.0000.0172.0002.19DA] # NEW TAI LUE THAM DIGIT ONE
+1A81  ; [.1206.0020.0002.1A81][.0000.0173.0002.1A81] # TAI THAM HORA DIGIT ONE
+1A91  ; [.1206.0020.0002.1A91][.0000.0174.0002.1A91] # TAI THAM THAM DIGIT ONE
+0E51  ; [.1206.0020.0002.0E51][.0000.0175.0002.0E51] # THAI DIGIT ONE
+0ED1  ; [.1206.0020.0002.0ED1][.0000.0176.0002.0ED1] # LAO DIGIT ONE
+0F21  ; [.1206.0020.0002.0F21][.0000.0177.0002.0F21] # TIBETAN DIGIT ONE
+0F2A  ; [.1206.0020.0004.0F2A][.0000.0177.0004.0F2A] # TIBETAN DIGIT HALF ONE; QQK
+1C41  ; [.1206.0020.0002.1C41][.0000.0178.0002.1C41] # LEPCHA DIGIT ONE
+A901  ; [.1206.0020.0002.A901][.0000.0179.0002.A901] # KAYAH LI DIGIT ONE
+1041  ; [.1206.0020.0002.1041][.0000.017A.0002.1041] # MYANMAR DIGIT ONE
+1091  ; [.1206.0020.0002.1091][.0000.017B.0002.1091] # MYANMAR SHAN DIGIT ONE
+17E1  ; [.1206.0020.0002.17E1][.0000.017C.0002.17E1] # KHMER DIGIT ONE
+17F1  ; [.1206.0020.0002.17F1][.0000.017D.0002.17F1] # KHMER SYMBOL LEK ATTAK MUOY
+AA51  ; [.1206.0020.0002.AA51][.0000.017E.0002.AA51] # CHAM DIGIT ONE
+1B51  ; [.1206.0020.0002.1B51][.0000.017F.0002.1B51] # BALINESE DIGIT ONE
+A9D1  ; [.1206.0020.0002.A9D1][.0000.0180.0002.A9D1] # JAVANESE DIGIT ONE
+1BB1  ; [.1206.0020.0002.1BB1][.0000.0181.0002.1BB1] # SUNDANESE DIGIT ONE
+1811  ; [.1206.0020.0002.1811][.0000.0182.0002.1811] # MONGOLIAN DIGIT ONE
+1C51  ; [.1206.0020.0002.1C51][.0000.0183.0002.1C51] # OL CHIKI DIGIT ONE
+A621  ; [.1206.0020.0002.A621][.0000.0184.0002.A621] # VAI DIGIT ONE
+3021  ; [.1206.0020.0002.3021][.0000.0185.0002.3021] # HANGZHOU NUMERAL ONE
+10107 ; [.1206.0020.0002.10107][.0000.0186.0002.10107] # AEGEAN NUMBER ONE
+10142 ; [.1206.0020.0002.10142][.0000.0187.0002.10142] # GREEK ACROPHONIC ATTIC ONE DRACHMA
+10158 ; [.1206.0020.0002.10158][.0000.0187.0002.10158] # GREEK ACROPHONIC HERAEUM ONE PLETHRON
+10159 ; [.1206.0020.0002.10159][.0000.0187.0002.10159] # GREEK ACROPHONIC THESPIAN ONE
+1015A ; [.1206.0020.0002.1015A][.0000.0187.0002.1015A] # GREEK ACROPHONIC HERMIONIAN ONE
+10320 ; [.1206.0020.0002.10320][.0000.0189.0002.10320] # OLD ITALIC NUMERAL ONE
+103D1 ; [.1206.0020.0002.103D1][.0000.018A.0002.103D1] # OLD PERSIAN NUMBER ONE
+12415 ; [.1206.0020.0002.12415][.0000.018B.0002.12415] # CUNEIFORM NUMERIC SIGN ONE GESH2
+1241E ; [.1206.0020.0002.1241E][.0000.018B.0002.1241E] # CUNEIFORM NUMERIC SIGN ONE GESHU
+1242C ; [.1206.0020.0002.1242C][.0000.018B.0002.1242C] # CUNEIFORM NUMERIC SIGN ONE SHARU
+12434 ; [.1206.0020.0002.12434][.0000.018B.0002.12434] # CUNEIFORM NUMERIC SIGN ONE BURU
+1244F ; [.1206.0020.0002.1244F][.0000.018B.0002.1244F] # CUNEIFORM NUMERIC SIGN ONE BAN2
+12458 ; [.1206.0020.0002.12458][.0000.018B.0002.12458] # CUNEIFORM NUMERIC SIGN ONE ESHE3
+10A7D ; [.1206.0020.0002.10A7D][.0000.018C.0002.10A7D] # OLD SOUTH ARABIAN NUMBER ONE
+10916 ; [.1206.0020.0002.10916][.0000.018D.0002.10916] # PHOENICIAN NUMBER ONE
+10858 ; [.1206.0020.0002.10858][.0000.018E.0002.10858] # IMPERIAL ARAMAIC NUMBER ONE
+10B58 ; [.1206.0020.0002.10B58][.0000.018F.0002.10B58] # INSCRIPTIONAL PARTHIAN NUMBER ONE
+10B78 ; [.1206.0020.0002.10B78][.0000.0190.0002.10B78] # INSCRIPTIONAL PAHLAVI NUMBER ONE
+10A40 ; [.1206.0020.0002.10A40][.0000.0191.0002.10A40] # KHAROSHTHI DIGIT ONE
+1D360 ; [.1206.0020.0002.1D360][.0000.0192.0002.1D360] # COUNTING ROD UNIT DIGIT ONE
+2491  ; [.1206.0020.0004.2491][.1205.0020.0004.2491][*0281.0020.001F.2491] # NUMBER TEN FULL STOP; QQKN
+247D  ; [*02FF.0020.0004.247D][.1206.0020.0004.247D][.1205.0020.001F.247D][*0300.0020.001F.247D] # PARENTHESIZED NUMBER TEN; QQKN
+2469  ; [.1206.0020.0006.2469][.1205.0020.0006.2469] # CIRCLED NUMBER TEN; QQKN
+24FE  ; [.1206.0020.0006.24FE][.1205.0020.0006.24FE] # DOUBLE CIRCLED NUMBER TEN; QQKN
+277F  ; [.1206.0020.0006.277F][.1205.0020.0006.277F] # DINGBAT NEGATIVE CIRCLED NUMBER TEN; QQKN
+2789  ; [.1206.0020.0006.2789][.1205.0020.0006.2789] # DINGBAT CIRCLED SANS-SERIF NUMBER TEN; QQKN
+2793  ; [.1206.0020.0006.2793][.1205.0020.0006.2793] # DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN; QQKN
+3248  ; [.1206.0020.0006.3248][.1205.0020.0006.3248] # CIRCLED NUMBER TEN ON BLACK SQUARE; QQKN
+33E9  ; [.1206.0020.0004.33E9][.1205.0020.0004.33E9][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN; QQKN
+32C9  ; [.1206.0020.0004.32C9][.1205.0020.0004.32C9][.FB40.0020.001F.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER; QQKN
+3362  ; [.1206.0020.0004.3362][.1205.0020.0004.3362][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN; QQKN
+2492  ; [.1206.0020.0004.2492][.1206.0020.0004.2492][*0281.0020.001F.2492] # NUMBER ELEVEN FULL STOP; QQKN
+247E  ; [*02FF.0020.0004.247E][.1206.0020.0004.247E][.1206.0020.001F.247E][*0300.0020.001F.247E] # PARENTHESIZED NUMBER ELEVEN; QQKN
+246A  ; [.1206.0020.0006.246A][.1206.0020.0006.246A] # CIRCLED NUMBER ELEVEN; QQKN
+24EB  ; [.1206.0020.0006.24EB][.1206.0020.0006.24EB] # NEGATIVE CIRCLED NUMBER ELEVEN; QQKN
+2152  ; [.1206.0020.001E.2152][*035D.0020.001E.2152][.1206.0020.001F.2152][.1205.0020.001F.2152] # VULGAR FRACTION ONE TENTH; QQKN
+33EA  ; [.1206.0020.0004.33EA][.1206.0020.0004.33EA][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN; QQKN
+32CA  ; [.1206.0020.0004.32CA][.1206.0020.0004.32CA][.FB40.0020.001F.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER; QQKN
+3363  ; [.1206.0020.0004.3363][.1206.0020.0004.3363][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN; QQKN
+2493  ; [.1206.0020.0004.2493][.1207.0020.0004.2493][*0281.0020.001F.2493] # NUMBER TWELVE FULL STOP; QQKN
+247F  ; [*02FF.0020.0004.247F][.1206.0020.0004.247F][.1207.0020.001F.247F][*0300.0020.001F.247F] # PARENTHESIZED NUMBER TWELVE; QQKN
+246B  ; [.1206.0020.0006.246B][.1207.0020.0006.246B] # CIRCLED NUMBER TWELVE; QQKN
+24EC  ; [.1206.0020.0006.24EC][.1207.0020.0006.24EC] # NEGATIVE CIRCLED NUMBER TWELVE; QQKN
+00BD  ; [.1206.0020.001E.00BD][*035D.0020.001E.00BD][.1207.0020.001F.00BD] # VULGAR FRACTION ONE HALF; QQKN
+33EB  ; [.1206.0020.0004.33EB][.1207.0020.0004.33EB][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE; QQKN
+32CB  ; [.1206.0020.0004.32CB][.1207.0020.0004.32CB][.FB40.0020.001F.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER; QQKN
+3364  ; [.1206.0020.0004.3364][.1207.0020.0004.3364][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE; QQKN
+2494  ; [.1206.0020.0004.2494][.1208.0020.0004.2494][*0281.0020.001F.2494] # NUMBER THIRTEEN FULL STOP; QQKN
+2480  ; [*02FF.0020.0004.2480][.1206.0020.0004.2480][.1208.0020.001F.2480][*0300.0020.001F.2480] # PARENTHESIZED NUMBER THIRTEEN; QQKN
+246C  ; [.1206.0020.0006.246C][.1208.0020.0006.246C] # CIRCLED NUMBER THIRTEEN; QQKN
+24ED  ; [.1206.0020.0006.24ED][.1208.0020.0006.24ED] # NEGATIVE CIRCLED NUMBER THIRTEEN; QQKN
+2153  ; [.1206.0020.001E.2153][*035D.0020.001E.2153][.1208.0020.001F.2153] # VULGAR FRACTION ONE THIRD; QQKN
+33EC  ; [.1206.0020.0004.33EC][.1208.0020.0004.33EC][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN; QQKN
+3365  ; [.1206.0020.0004.3365][.1208.0020.0004.3365][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN; QQKN
+2495  ; [.1206.0020.0004.2495][.1209.0020.0004.2495][*0281.0020.001F.2495] # NUMBER FOURTEEN FULL STOP; QQKN
+2481  ; [*02FF.0020.0004.2481][.1206.0020.0004.2481][.1209.0020.001F.2481][*0300.0020.001F.2481] # PARENTHESIZED NUMBER FOURTEEN; QQKN
+246D  ; [.1206.0020.0006.246D][.1209.0020.0006.246D] # CIRCLED NUMBER FOURTEEN; QQKN
+24EE  ; [.1206.0020.0006.24EE][.1209.0020.0006.24EE] # NEGATIVE CIRCLED NUMBER FOURTEEN; QQKN
+00BC  ; [.1206.0020.001E.00BC][*035D.0020.001E.00BC][.1209.0020.001F.00BC] # VULGAR FRACTION ONE QUARTER; QQKN
+33ED  ; [.1206.0020.0004.33ED][.1209.0020.0004.33ED][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN; QQKN
+3366  ; [.1206.0020.0004.3366][.1209.0020.0004.3366][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN; QQKN
+2496  ; [.1206.0020.0004.2496][.120A.0020.0004.2496][*0281.0020.001F.2496] # NUMBER FIFTEEN FULL STOP; QQKN
+2482  ; [*02FF.0020.0004.2482][.1206.0020.0004.2482][.120A.0020.001F.2482][*0300.0020.001F.2482] # PARENTHESIZED NUMBER FIFTEEN; QQKN
+246E  ; [.1206.0020.0006.246E][.120A.0020.0006.246E] # CIRCLED NUMBER FIFTEEN; QQKN
+24EF  ; [.1206.0020.0006.24EF][.120A.0020.0006.24EF] # NEGATIVE CIRCLED NUMBER FIFTEEN; QQKN
+2155  ; [.1206.0020.001E.2155][*035D.0020.001E.2155][.120A.0020.001F.2155] # VULGAR FRACTION ONE FIFTH; QQKN
+33EE  ; [.1206.0020.0004.33EE][.120A.0020.0004.33EE][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN; QQKN
+3367  ; [.1206.0020.0004.3367][.120A.0020.0004.3367][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN; QQKN
+2497  ; [.1206.0020.0004.2497][.120B.0020.0004.2497][*0281.0020.001F.2497] # NUMBER SIXTEEN FULL STOP; QQKN
+2483  ; [*02FF.0020.0004.2483][.1206.0020.0004.2483][.120B.0020.001F.2483][*0300.0020.001F.2483] # PARENTHESIZED NUMBER SIXTEEN; QQKN
+246F  ; [.1206.0020.0006.246F][.120B.0020.0006.246F] # CIRCLED NUMBER SIXTEEN; QQKN
+24F0  ; [.1206.0020.0006.24F0][.120B.0020.0006.24F0] # NEGATIVE CIRCLED NUMBER SIXTEEN; QQKN
+2159  ; [.1206.0020.001E.2159][*035D.0020.001E.2159][.120B.0020.001F.2159] # VULGAR FRACTION ONE SIXTH; QQKN
+33EF  ; [.1206.0020.0004.33EF][.120B.0020.0004.33EF][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN; QQKN
+3368  ; [.1206.0020.0004.3368][.120B.0020.0004.3368][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN; QQKN
+2498  ; [.1206.0020.0004.2498][.120C.0020.0004.2498][*0281.0020.001F.2498] # NUMBER SEVENTEEN FULL STOP; QQKN
+2484  ; [*02FF.0020.0004.2484][.1206.0020.0004.2484][.120C.0020.001F.2484][*0300.0020.001F.2484] # PARENTHESIZED NUMBER SEVENTEEN; QQKN
+2470  ; [.1206.0020.0006.2470][.120C.0020.0006.2470] # CIRCLED NUMBER SEVENTEEN; QQKN
+24F1  ; [.1206.0020.0006.24F1][.120C.0020.0006.24F1] # NEGATIVE CIRCLED NUMBER SEVENTEEN; QQKN
+2150  ; [.1206.0020.001E.2150][*035D.0020.001E.2150][.120C.0020.001F.2150] # VULGAR FRACTION ONE SEVENTH; QQKN
+33F0  ; [.1206.0020.0004.33F0][.120C.0020.0004.33F0][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN; QQKN
+3369  ; [.1206.0020.0004.3369][.120C.0020.0004.3369][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN; QQKN
+2499  ; [.1206.0020.0004.2499][.120D.0020.0004.2499][*0281.0020.001F.2499] # NUMBER EIGHTEEN FULL STOP; QQKN
+2485  ; [*02FF.0020.0004.2485][.1206.0020.0004.2485][.120D.0020.001F.2485][*0300.0020.001F.2485] # PARENTHESIZED NUMBER EIGHTEEN; QQKN
+2471  ; [.1206.0020.0006.2471][.120D.0020.0006.2471] # CIRCLED NUMBER EIGHTEEN; QQKN
+24F2  ; [.1206.0020.0006.24F2][.120D.0020.0006.24F2] # NEGATIVE CIRCLED NUMBER EIGHTEEN; QQKN
+215B  ; [.1206.0020.001E.215B][*035D.0020.001E.215B][.120D.0020.001F.215B] # VULGAR FRACTION ONE EIGHTH; QQKN
+33F1  ; [.1206.0020.0004.33F1][.120D.0020.0004.33F1][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN; QQKN
+336A  ; [.1206.0020.0004.336A][.120D.0020.0004.336A][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN; QQKN
+249A  ; [.1206.0020.0004.249A][.120E.0020.0004.249A][*0281.0020.001F.249A] # NUMBER NINETEEN FULL STOP; QQKN
+2486  ; [*02FF.0020.0004.2486][.1206.0020.0004.2486][.120E.0020.001F.2486][*0300.0020.001F.2486] # PARENTHESIZED NUMBER NINETEEN; QQKN
+2472  ; [.1206.0020.0006.2472][.120E.0020.0006.2472] # CIRCLED NUMBER NINETEEN; QQKN
+24F3  ; [.1206.0020.0006.24F3][.120E.0020.0006.24F3] # NEGATIVE CIRCLED NUMBER NINETEEN; QQKN
+2151  ; [.1206.0020.001E.2151][*035D.0020.001E.2151][.120E.0020.001F.2151] # VULGAR FRACTION ONE NINTH; QQKN
+33F2  ; [.1206.0020.0004.33F2][.120E.0020.0004.33F2][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN; QQKN
+336B  ; [.1206.0020.0004.336B][.120E.0020.0004.336B][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN; QQKN
+33E0  ; [.1206.0020.0004.33E0][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE; QQKN
+32C0  ; [.1206.0020.0004.32C0][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY; QQKN
+3359  ; [.1206.0020.0004.3359][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE; QQKN
+0032  ; [.1207.0020.0002.0032] # DIGIT TWO
+FF12  ; [.1207.0020.0003.FF12] # FULLWIDTH DIGIT TWO; QQK
+2475  ; [*02FF.0020.0004.2475][.1207.0020.0004.2475][*0300.0020.001F.2475] # PARENTHESIZED DIGIT TWO; QQKN
+2489  ; [.1207.0020.0004.2489][*0281.0020.0004.2489] # DIGIT TWO FULL STOP; QQKN
+1F103 ; [.1207.0020.0004.1F103][*0234.0020.0004.1F103] # DIGIT TWO COMMA; QQKN
+1D7D0 ; [.1207.0020.0005.1D7D0] # MATHEMATICAL BOLD DIGIT TWO; QQK
+1D7DA ; [.1207.0020.0005.1D7DA] # MATHEMATICAL DOUBLE-STRUCK DIGIT TWO; QQK
+1D7E4 ; [.1207.0020.0005.1D7E4] # MATHEMATICAL SANS-SERIF DIGIT TWO; QQK
+1D7EE ; [.1207.0020.0005.1D7EE] # MATHEMATICAL SANS-SERIF BOLD DIGIT TWO; QQK
+1D7F8 ; [.1207.0020.0005.1D7F8] # MATHEMATICAL MONOSPACE DIGIT TWO; QQK
+2461  ; [.1207.0020.0006.2461] # CIRCLED DIGIT TWO; QQK
+24F6  ; [.1207.0020.0006.24F6] # DOUBLE CIRCLED DIGIT TWO; QQK
+2777  ; [.1207.0020.0006.2777] # DINGBAT NEGATIVE CIRCLED DIGIT TWO; QQK
+2781  ; [.1207.0020.0006.2781] # DINGBAT CIRCLED SANS-SERIF DIGIT TWO; QQK
+278B  ; [.1207.0020.0006.278B] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO; QQK
+00B2  ; [.1207.0020.0014.00B2] # SUPERSCRIPT TWO; QQK
+2082  ; [.1207.0020.0015.2082] # SUBSCRIPT TWO; QQK
+0662  ; [.1207.0020.0002.0662][.0000.015F.0002.0662] # ARABIC-INDIC DIGIT TWO
+06F2  ; [.1207.0020.0002.06F2][.0000.0160.0002.06F2] # EXTENDED ARABIC-INDIC DIGIT TWO
+10E61 ; [.1207.0020.0002.10E61][.0000.0161.0002.10E61] # RUMI DIGIT TWO
+07C2  ; [.1207.0020.0002.07C2][.0000.0162.0002.07C2] # NKO DIGIT TWO
+136A  ; [.1207.0020.0002.136A][.0000.0163.0002.136A] # ETHIOPIC DIGIT TWO
+104A2 ; [.1207.0020.0002.104A2][.0000.0164.0002.104A2] # OSMANYA DIGIT TWO
+0968  ; [.1207.0020.0002.0968][.0000.0165.0002.0968] # DEVANAGARI DIGIT TWO
+09E8  ; [.1207.0020.0002.09E8][.0000.0166.0002.09E8] # BENGALI DIGIT TWO
+0A68  ; [.1207.0020.0002.0A68][.0000.0167.0002.0A68] # GURMUKHI DIGIT TWO
+0AE8  ; [.1207.0020.0002.0AE8][.0000.0168.0002.0AE8] # GUJARATI DIGIT TWO
+0B68  ; [.1207.0020.0002.0B68][.0000.0169.0002.0B68] # ORIYA DIGIT TWO
+0BE8  ; [.1207.0020.0002.0BE8][.0000.016A.0002.0BE8] # TAMIL DIGIT TWO
+0C68  ; [.1207.0020.0002.0C68][.0000.016B.0002.0C68] # TELUGU DIGIT TWO
+0C7A  ; [.1207.0020.0002.0C7A][.0000.016B.0002.0C7A] # TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR
+0C7D  ; [.1207.0020.0002.0C7D][.0000.016B.0002.0C7D] # TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR
+0CE8  ; [.1207.0020.0002.0CE8][.0000.016C.0002.0CE8] # KANNADA DIGIT TWO
+0D68  ; [.1207.0020.0002.0D68][.0000.016D.0002.0D68] # MALAYALAM DIGIT TWO
+ABF2  ; [.1207.0020.0002.ABF2][.0000.016E.0002.ABF2] # MEETEI MAYEK DIGIT TWO
+A8D2  ; [.1207.0020.0002.A8D2][.0000.016F.0002.A8D2] # SAURASHTRA DIGIT TWO
+1948  ; [.1207.0020.0002.1948][.0000.0170.0002.1948] # LIMBU DIGIT TWO
+19D2  ; [.1207.0020.0002.19D2][.0000.0171.0002.19D2] # NEW TAI LUE DIGIT TWO
+1A82  ; [.1207.0020.0002.1A82][.0000.0173.0002.1A82] # TAI THAM HORA DIGIT TWO
+1A92  ; [.1207.0020.0002.1A92][.0000.0174.0002.1A92] # TAI THAM THAM DIGIT TWO
+0E52  ; [.1207.0020.0002.0E52][.0000.0175.0002.0E52] # THAI DIGIT TWO
+0ED2  ; [.1207.0020.0002.0ED2][.0000.0176.0002.0ED2] # LAO DIGIT TWO
+0F22  ; [.1207.0020.0002.0F22][.0000.0177.0002.0F22] # TIBETAN DIGIT TWO
+0F2B  ; [.1207.0020.0004.0F2B][.0000.0177.0004.0F2B] # TIBETAN DIGIT HALF TWO; QQK
+1C42  ; [.1207.0020.0002.1C42][.0000.0178.0002.1C42] # LEPCHA DIGIT TWO
+A902  ; [.1207.0020.0002.A902][.0000.0179.0002.A902] # KAYAH LI DIGIT TWO
+1042  ; [.1207.0020.0002.1042][.0000.017A.0002.1042] # MYANMAR DIGIT TWO
+1092  ; [.1207.0020.0002.1092][.0000.017B.0002.1092] # MYANMAR SHAN DIGIT TWO
+17E2  ; [.1207.0020.0002.17E2][.0000.017C.0002.17E2] # KHMER DIGIT TWO
+17F2  ; [.1207.0020.0002.17F2][.0000.017D.0002.17F2] # KHMER SYMBOL LEK ATTAK PII
+AA52  ; [.1207.0020.0002.AA52][.0000.017E.0002.AA52] # CHAM DIGIT TWO
+1B52  ; [.1207.0020.0002.1B52][.0000.017F.0002.1B52] # BALINESE DIGIT TWO
+A9D2  ; [.1207.0020.0002.A9D2][.0000.0180.0002.A9D2] # JAVANESE DIGIT TWO
+1BB2  ; [.1207.0020.0002.1BB2][.0000.0181.0002.1BB2] # SUNDANESE DIGIT TWO
+1812  ; [.1207.0020.0002.1812][.0000.0182.0002.1812] # MONGOLIAN DIGIT TWO
+1C52  ; [.1207.0020.0002.1C52][.0000.0183.0002.1C52] # OL CHIKI DIGIT TWO
+A622  ; [.1207.0020.0002.A622][.0000.0184.0002.A622] # VAI DIGIT TWO
+3022  ; [.1207.0020.0002.3022][.0000.0185.0002.3022] # HANGZHOU NUMERAL TWO
+10108 ; [.1207.0020.0002.10108][.0000.0186.0002.10108] # AEGEAN NUMBER TWO
+1015B ; [.1207.0020.0002.1015B][.0000.0187.0002.1015B] # GREEK ACROPHONIC EPIDAUREAN TWO
+1015C ; [.1207.0020.0002.1015C][.0000.0187.0002.1015C] # GREEK ACROPHONIC THESPIAN TWO
+1015D ; [.1207.0020.0002.1015D][.0000.0187.0002.1015D] # GREEK ACROPHONIC CYRENAIC TWO DRACHMAS
+1015E ; [.1207.0020.0002.1015E][.0000.0187.0002.1015E] # GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS
+103D2 ; [.1207.0020.0002.103D2][.0000.018A.0002.103D2] # OLD PERSIAN NUMBER TWO
+12400 ; [.1207.0020.0002.12400][.0000.018B.0002.12400] # CUNEIFORM NUMERIC SIGN TWO ASH
+12416 ; [.1207.0020.0002.12416][.0000.018B.0002.12416] # CUNEIFORM NUMERIC SIGN TWO GESH2
+1241F ; [.1207.0020.0002.1241F][.0000.018B.0002.1241F] # CUNEIFORM NUMERIC SIGN TWO GESHU
+12423 ; [.1207.0020.0002.12423][.0000.018B.0002.12423] # CUNEIFORM NUMERIC SIGN TWO SHAR2
+1242D ; [.1207.0020.0002.1242D][.0000.018B.0002.1242D] # CUNEIFORM NUMERIC SIGN TWO SHARU
+12435 ; [.1207.0020.0002.12435][.0000.018B.0002.12435] # CUNEIFORM NUMERIC SIGN TWO BURU
+1244A ; [.1207.0020.0002.1244A][.0000.018B.0002.1244A] # CUNEIFORM NUMERIC SIGN TWO ASH TENU
+12450 ; [.1207.0020.0002.12450][.0000.018B.0002.12450] # CUNEIFORM NUMERIC SIGN TWO BAN2
+12459 ; [.1207.0020.0002.12459][.0000.018B.0002.12459] # CUNEIFORM NUMERIC SIGN TWO ESHE3
+1091A ; [.1207.0020.0002.1091A][.0000.018D.0002.1091A] # PHOENICIAN NUMBER TWO
+10859 ; [.1207.0020.0002.10859][.0000.018E.0002.10859] # IMPERIAL ARAMAIC NUMBER TWO
+10B59 ; [.1207.0020.0002.10B59][.0000.018F.0002.10B59] # INSCRIPTIONAL PARTHIAN NUMBER TWO
+10B79 ; [.1207.0020.0002.10B79][.0000.0190.0002.10B79] # INSCRIPTIONAL PAHLAVI NUMBER TWO
+10A41 ; [.1207.0020.0002.10A41][.0000.0191.0002.10A41] # KHAROSHTHI DIGIT TWO
+1D361 ; [.1207.0020.0002.1D361][.0000.0192.0002.1D361] # COUNTING ROD UNIT DIGIT TWO
+249B  ; [.1207.0020.0004.249B][.1205.0020.0004.249B][*0281.0020.001F.249B] # NUMBER TWENTY FULL STOP; QQKN
+2487  ; [*02FF.0020.0004.2487][.1207.0020.0004.2487][.1205.0020.001F.2487][*0300.0020.001F.2487] # PARENTHESIZED NUMBER TWENTY; QQKN
+2473  ; [.1207.0020.0006.2473][.1205.0020.0006.2473] # CIRCLED NUMBER TWENTY; QQKN
+24F4  ; [.1207.0020.0006.24F4][.1205.0020.0006.24F4] # NEGATIVE CIRCLED NUMBER TWENTY; QQKN
+3249  ; [.1207.0020.0006.3249][.1205.0020.0006.3249] # CIRCLED NUMBER TWENTY ON BLACK SQUARE; QQKN
+33F3  ; [.1207.0020.0004.33F3][.1205.0020.0004.33F3][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY; QQKN
+336C  ; [.1207.0020.0004.336C][.1205.0020.0004.336C][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY; QQKN
+3251  ; [.1207.0020.0006.3251][.1206.0020.0006.3251] # CIRCLED NUMBER TWENTY ONE; QQKN
+33F4  ; [.1207.0020.0004.33F4][.1206.0020.0004.33F4][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE; QQKN
+336D  ; [.1207.0020.0004.336D][.1206.0020.0004.336D][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE; QQKN
+3252  ; [.1207.0020.0006.3252][.1207.0020.0006.3252] # CIRCLED NUMBER TWENTY TWO; QQKN
+33F5  ; [.1207.0020.0004.33F5][.1207.0020.0004.33F5][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO; QQKN
+336E  ; [.1207.0020.0004.336E][.1207.0020.0004.336E][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO; QQKN
+3253  ; [.1207.0020.0006.3253][.1208.0020.0006.3253] # CIRCLED NUMBER TWENTY THREE; QQKN
+2154  ; [.1207.0020.001E.2154][*035D.0020.001E.2154][.1208.0020.001F.2154] # VULGAR FRACTION TWO THIRDS; QQKN
+33F6  ; [.1207.0020.0004.33F6][.1208.0020.0004.33F6][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE; QQKN
+336F  ; [.1207.0020.0004.336F][.1208.0020.0004.336F][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE; QQKN
+3254  ; [.1207.0020.0006.3254][.1209.0020.0006.3254] # CIRCLED NUMBER TWENTY FOUR; QQKN
+33F7  ; [.1207.0020.0004.33F7][.1209.0020.0004.33F7][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR; QQKN
+3370  ; [.1207.0020.0004.3370][.1209.0020.0004.3370][.FB40.0020.001F.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR; QQKN
+3255  ; [.1207.0020.0006.3255][.120A.0020.0006.3255] # CIRCLED NUMBER TWENTY FIVE; QQKN
+2156  ; [.1207.0020.001E.2156][*035D.0020.001E.2156][.120A.0020.001F.2156] # VULGAR FRACTION TWO FIFTHS; QQKN
+33F8  ; [.1207.0020.0004.33F8][.120A.0020.0004.33F8][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE; QQKN
+3256  ; [.1207.0020.0006.3256][.120B.0020.0006.3256] # CIRCLED NUMBER TWENTY SIX; QQKN
+33F9  ; [.1207.0020.0004.33F9][.120B.0020.0004.33F9][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX; QQKN
+3257  ; [.1207.0020.0006.3257][.120C.0020.0006.3257] # CIRCLED NUMBER TWENTY SEVEN; QQKN
+33FA  ; [.1207.0020.0004.33FA][.120C.0020.0004.33FA][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN; QQKN
+3258  ; [.1207.0020.0006.3258][.120D.0020.0006.3258] # CIRCLED NUMBER TWENTY EIGHT; QQKN
+33FB  ; [.1207.0020.0004.33FB][.120D.0020.0004.33FB][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT; QQKN
+3259  ; [.1207.0020.0006.3259][.120E.0020.0006.3259] # CIRCLED NUMBER TWENTY NINE; QQKN
+33FC  ; [.1207.0020.0004.33FC][.120E.0020.0004.33FC][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE; QQKN
+33E1  ; [.1207.0020.0004.33E1][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO; QQKN
+32C1  ; [.1207.0020.0004.32C1][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY; QQKN
+335A  ; [.1207.0020.0004.335A][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO; QQKN
+0033  ; [.1208.0020.0002.0033] # DIGIT THREE
+FF13  ; [.1208.0020.0003.FF13] # FULLWIDTH DIGIT THREE; QQK
+2476  ; [*02FF.0020.0004.2476][.1208.0020.0004.2476][*0300.0020.001F.2476] # PARENTHESIZED DIGIT THREE; QQKN
+248A  ; [.1208.0020.0004.248A][*0281.0020.0004.248A] # DIGIT THREE FULL STOP; QQKN
+1F104 ; [.1208.0020.0004.1F104][*0234.0020.0004.1F104] # DIGIT THREE COMMA; QQKN
+1D7D1 ; [.1208.0020.0005.1D7D1] # MATHEMATICAL BOLD DIGIT THREE; QQK
+1D7DB ; [.1208.0020.0005.1D7DB] # MATHEMATICAL DOUBLE-STRUCK DIGIT THREE; QQK
+1D7E5 ; [.1208.0020.0005.1D7E5] # MATHEMATICAL SANS-SERIF DIGIT THREE; QQK
+1D7EF ; [.1208.0020.0005.1D7EF] # MATHEMATICAL SANS-SERIF BOLD DIGIT THREE; QQK
+1D7F9 ; [.1208.0020.0005.1D7F9] # MATHEMATICAL MONOSPACE DIGIT THREE; QQK
+2462  ; [.1208.0020.0006.2462] # CIRCLED DIGIT THREE; QQK
+24F7  ; [.1208.0020.0006.24F7] # DOUBLE CIRCLED DIGIT THREE; QQK
+2778  ; [.1208.0020.0006.2778] # DINGBAT NEGATIVE CIRCLED DIGIT THREE; QQK
+2782  ; [.1208.0020.0006.2782] # DINGBAT CIRCLED SANS-SERIF DIGIT THREE; QQK
+278C  ; [.1208.0020.0006.278C] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE; QQK
+00B3  ; [.1208.0020.0014.00B3] # SUPERSCRIPT THREE; QQK
+2083  ; [.1208.0020.0015.2083] # SUBSCRIPT THREE; QQK
+0663  ; [.1208.0020.0002.0663][.0000.015F.0002.0663] # ARABIC-INDIC DIGIT THREE
+06F3  ; [.1208.0020.0002.06F3][.0000.0160.0002.06F3] # EXTENDED ARABIC-INDIC DIGIT THREE
+10E62 ; [.1208.0020.0002.10E62][.0000.0161.0002.10E62] # RUMI DIGIT THREE
+07C3  ; [.1208.0020.0002.07C3][.0000.0162.0002.07C3] # NKO DIGIT THREE
+136B  ; [.1208.0020.0002.136B][.0000.0163.0002.136B] # ETHIOPIC DIGIT THREE
+104A3 ; [.1208.0020.0002.104A3][.0000.0164.0002.104A3] # OSMANYA DIGIT THREE
+0969  ; [.1208.0020.0002.0969][.0000.0165.0002.0969] # DEVANAGARI DIGIT THREE
+09E9  ; [.1208.0020.0002.09E9][.0000.0166.0002.09E9] # BENGALI DIGIT THREE
+0A69  ; [.1208.0020.0002.0A69][.0000.0167.0002.0A69] # GURMUKHI DIGIT THREE
+0AE9  ; [.1208.0020.0002.0AE9][.0000.0168.0002.0AE9] # GUJARATI DIGIT THREE
+0B69  ; [.1208.0020.0002.0B69][.0000.0169.0002.0B69] # ORIYA DIGIT THREE
+0BE9  ; [.1208.0020.0002.0BE9][.0000.016A.0002.0BE9] # TAMIL DIGIT THREE
+0C69  ; [.1208.0020.0002.0C69][.0000.016B.0002.0C69] # TELUGU DIGIT THREE
+0C7B  ; [.1208.0020.0002.0C7B][.0000.016B.0002.0C7B] # TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR
+0C7E  ; [.1208.0020.0002.0C7E][.0000.016B.0002.0C7E] # TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR
+0CE9  ; [.1208.0020.0002.0CE9][.0000.016C.0002.0CE9] # KANNADA DIGIT THREE
+0D69  ; [.1208.0020.0002.0D69][.0000.016D.0002.0D69] # MALAYALAM DIGIT THREE
+ABF3  ; [.1208.0020.0002.ABF3][.0000.016E.0002.ABF3] # MEETEI MAYEK DIGIT THREE
+A8D3  ; [.1208.0020.0002.A8D3][.0000.016F.0002.A8D3] # SAURASHTRA DIGIT THREE
+1949  ; [.1208.0020.0002.1949][.0000.0170.0002.1949] # LIMBU DIGIT THREE
+19D3  ; [.1208.0020.0002.19D3][.0000.0171.0002.19D3] # NEW TAI LUE DIGIT THREE
+1A83  ; [.1208.0020.0002.1A83][.0000.0173.0002.1A83] # TAI THAM HORA DIGIT THREE
+1A93  ; [.1208.0020.0002.1A93][.0000.0174.0002.1A93] # TAI THAM THAM DIGIT THREE
+0E53  ; [.1208.0020.0002.0E53][.0000.0175.0002.0E53] # THAI DIGIT THREE
+0ED3  ; [.1208.0020.0002.0ED3][.0000.0176.0002.0ED3] # LAO DIGIT THREE
+0F23  ; [.1208.0020.0002.0F23][.0000.0177.0002.0F23] # TIBETAN DIGIT THREE
+0F2C  ; [.1208.0020.0004.0F2C][.0000.0177.0004.0F2C] # TIBETAN DIGIT HALF THREE; QQK
+1C43  ; [.1208.0020.0002.1C43][.0000.0178.0002.1C43] # LEPCHA DIGIT THREE
+A903  ; [.1208.0020.0002.A903][.0000.0179.0002.A903] # KAYAH LI DIGIT THREE
+1043  ; [.1208.0020.0002.1043][.0000.017A.0002.1043] # MYANMAR DIGIT THREE
+1093  ; [.1208.0020.0002.1093][.0000.017B.0002.1093] # MYANMAR SHAN DIGIT THREE
+17E3  ; [.1208.0020.0002.17E3][.0000.017C.0002.17E3] # KHMER DIGIT THREE
+17F3  ; [.1208.0020.0002.17F3][.0000.017D.0002.17F3] # KHMER SYMBOL LEK ATTAK BEI
+AA53  ; [.1208.0020.0002.AA53][.0000.017E.0002.AA53] # CHAM DIGIT THREE
+1B53  ; [.1208.0020.0002.1B53][.0000.017F.0002.1B53] # BALINESE DIGIT THREE
+A9D3  ; [.1208.0020.0002.A9D3][.0000.0180.0002.A9D3] # JAVANESE DIGIT THREE
+1BB3  ; [.1208.0020.0002.1BB3][.0000.0181.0002.1BB3] # SUNDANESE DIGIT THREE
+1813  ; [.1208.0020.0002.1813][.0000.0182.0002.1813] # MONGOLIAN DIGIT THREE
+1C53  ; [.1208.0020.0002.1C53][.0000.0183.0002.1C53] # OL CHIKI DIGIT THREE
+A623  ; [.1208.0020.0002.A623][.0000.0184.0002.A623] # VAI DIGIT THREE
+3023  ; [.1208.0020.0002.3023][.0000.0185.0002.3023] # HANGZHOU NUMERAL THREE
+10109 ; [.1208.0020.0002.10109][.0000.0186.0002.10109] # AEGEAN NUMBER THREE
+12401 ; [.1208.0020.0002.12401][.0000.018B.0002.12401] # CUNEIFORM NUMERIC SIGN THREE ASH
+12408 ; [.1208.0020.0002.12408][.0000.018B.0002.12408] # CUNEIFORM NUMERIC SIGN THREE DISH
+12417 ; [.1208.0020.0002.12417][.0000.018B.0002.12417] # CUNEIFORM NUMERIC SIGN THREE GESH2
+12420 ; [.1208.0020.0002.12420][.0000.018B.0002.12420] # CUNEIFORM NUMERIC SIGN THREE GESHU
+12424 ; [.1208.0020.0002.12424][.0000.018B.0002.12424] # CUNEIFORM NUMERIC SIGN THREE SHAR2
+12425 ; [.1208.0020.0002.12425][.0000.018B.0002.12425] # CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM
+1242E ; [.1208.0020.0002.1242E][.0000.018B.0002.1242E] # CUNEIFORM NUMERIC SIGN THREE SHARU
+1242F ; [.1208.0020.0002.1242F][.0000.018B.0002.1242F] # CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM
+12436 ; [.1208.0020.0002.12436][.0000.018B.0002.12436] # CUNEIFORM NUMERIC SIGN THREE BURU
+12437 ; [.1208.0020.0002.12437][.0000.018B.0002.12437] # CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM
+1243A ; [.1208.0020.0002.1243A][.0000.018B.0002.1243A] # CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16
+1243B ; [.1208.0020.0002.1243B][.0000.018B.0002.1243B] # CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21
+1244B ; [.1208.0020.0002.1244B][.0000.018B.0002.1244B] # CUNEIFORM NUMERIC SIGN THREE ASH TENU
+12451 ; [.1208.0020.0002.12451][.0000.018B.0002.12451] # CUNEIFORM NUMERIC SIGN THREE BAN2
+1091B ; [.1208.0020.0002.1091B][.0000.018D.0002.1091B] # PHOENICIAN NUMBER THREE
+1085A ; [.1208.0020.0002.1085A][.0000.018E.0002.1085A] # IMPERIAL ARAMAIC NUMBER THREE
+10B5A ; [.1208.0020.0002.10B5A][.0000.018F.0002.10B5A] # INSCRIPTIONAL PARTHIAN NUMBER THREE
+10B7A ; [.1208.0020.0002.10B7A][.0000.0190.0002.10B7A] # INSCRIPTIONAL PAHLAVI NUMBER THREE
+10A42 ; [.1208.0020.0002.10A42][.0000.0191.0002.10A42] # KHAROSHTHI DIGIT THREE
+1D362 ; [.1208.0020.0002.1D362][.0000.0192.0002.1D362] # COUNTING ROD UNIT DIGIT THREE
+324A  ; [.1208.0020.0006.324A][.1205.0020.0006.324A] # CIRCLED NUMBER THIRTY ON BLACK SQUARE; QQKN
+325A  ; [.1208.0020.0006.325A][.1205.0020.0006.325A] # CIRCLED NUMBER THIRTY; QQKN
+33FD  ; [.1208.0020.0004.33FD][.1205.0020.0004.33FD][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY; QQKN
+325B  ; [.1208.0020.0006.325B][.1206.0020.0006.325B] # CIRCLED NUMBER THIRTY ONE; QQKN
+33FE  ; [.1208.0020.0004.33FE][.1206.0020.0004.33FE][.FB40.0020.001F.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE; QQKN
+325C  ; [.1208.0020.0006.325C][.1207.0020.0006.325C] # CIRCLED NUMBER THIRTY TWO; QQKN
+325D  ; [.1208.0020.0006.325D][.1208.0020.0006.325D] # CIRCLED NUMBER THIRTY THREE; QQKN
+325E  ; [.1208.0020.0006.325E][.1209.0020.0006.325E] # CIRCLED NUMBER THIRTY FOUR; QQKN
+00BE  ; [.1208.0020.001E.00BE][*035D.0020.001E.00BE][.1209.0020.001F.00BE] # VULGAR FRACTION THREE QUARTERS; QQKN
+325F  ; [.1208.0020.0006.325F][.120A.0020.0006.325F] # CIRCLED NUMBER THIRTY FIVE; QQKN
+2157  ; [.1208.0020.001E.2157][*035D.0020.001E.2157][.120A.0020.001F.2157] # VULGAR FRACTION THREE FIFTHS; QQKN
+32B1  ; [.1208.0020.0006.32B1][.120B.0020.0006.32B1] # CIRCLED NUMBER THIRTY SIX; QQKN
+32B2  ; [.1208.0020.0006.32B2][.120C.0020.0006.32B2] # CIRCLED NUMBER THIRTY SEVEN; QQKN
+32B3  ; [.1208.0020.0006.32B3][.120D.0020.0006.32B3] # CIRCLED NUMBER THIRTY EIGHT; QQKN
+215C  ; [.1208.0020.001E.215C][*035D.0020.001E.215C][.120D.0020.001F.215C] # VULGAR FRACTION THREE EIGHTHS; QQKN
+32B4  ; [.1208.0020.0006.32B4][.120E.0020.0006.32B4] # CIRCLED NUMBER THIRTY NINE; QQKN
+33E2  ; [.1208.0020.0004.33E2][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE; QQKN
+32C2  ; [.1208.0020.0004.32C2][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH; QQKN
+335B  ; [.1208.0020.0004.335B][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE; QQKN
+0034  ; [.1209.0020.0002.0034] # DIGIT FOUR
+FF14  ; [.1209.0020.0003.FF14] # FULLWIDTH DIGIT FOUR; QQK
+2477  ; [*02FF.0020.0004.2477][.1209.0020.0004.2477][*0300.0020.001F.2477] # PARENTHESIZED DIGIT FOUR; QQKN
+248B  ; [.1209.0020.0004.248B][*0281.0020.0004.248B] # DIGIT FOUR FULL STOP; QQKN
+1F105 ; [.1209.0020.0004.1F105][*0234.0020.0004.1F105] # DIGIT FOUR COMMA; QQKN
+1D7D2 ; [.1209.0020.0005.1D7D2] # MATHEMATICAL BOLD DIGIT FOUR; QQK
+1D7DC ; [.1209.0020.0005.1D7DC] # MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR; QQK
+1D7E6 ; [.1209.0020.0005.1D7E6] # MATHEMATICAL SANS-SERIF DIGIT FOUR; QQK
+1D7F0 ; [.1209.0020.0005.1D7F0] # MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR; QQK
+1D7FA ; [.1209.0020.0005.1D7FA] # MATHEMATICAL MONOSPACE DIGIT FOUR; QQK
+2463  ; [.1209.0020.0006.2463] # CIRCLED DIGIT FOUR; QQK
+24F8  ; [.1209.0020.0006.24F8] # DOUBLE CIRCLED DIGIT FOUR; QQK
+2779  ; [.1209.0020.0006.2779] # DINGBAT NEGATIVE CIRCLED DIGIT FOUR; QQK
+2783  ; [.1209.0020.0006.2783] # DINGBAT CIRCLED SANS-SERIF DIGIT FOUR; QQK
+278D  ; [.1209.0020.0006.278D] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR; QQK
+2074  ; [.1209.0020.0014.2074] # SUPERSCRIPT FOUR; QQK
+2084  ; [.1209.0020.0015.2084] # SUBSCRIPT FOUR; QQK
+0664  ; [.1209.0020.0002.0664][.0000.015F.0002.0664] # ARABIC-INDIC DIGIT FOUR
+06F4  ; [.1209.0020.0002.06F4][.0000.0160.0002.06F4] # EXTENDED ARABIC-INDIC DIGIT FOUR
+10E63 ; [.1209.0020.0002.10E63][.0000.0161.0002.10E63] # RUMI DIGIT FOUR
+07C4  ; [.1209.0020.0002.07C4][.0000.0162.0002.07C4] # NKO DIGIT FOUR
+136C  ; [.1209.0020.0002.136C][.0000.0163.0002.136C] # ETHIOPIC DIGIT FOUR
+104A4 ; [.1209.0020.0002.104A4][.0000.0164.0002.104A4] # OSMANYA DIGIT FOUR
+096A  ; [.1209.0020.0002.096A][.0000.0165.0002.096A] # DEVANAGARI DIGIT FOUR
+09EA  ; [.1209.0020.0002.09EA][.0000.0166.0002.09EA] # BENGALI DIGIT FOUR
+0A6A  ; [.1209.0020.0002.0A6A][.0000.0167.0002.0A6A] # GURMUKHI DIGIT FOUR
+0AEA  ; [.1209.0020.0002.0AEA][.0000.0168.0002.0AEA] # GUJARATI DIGIT FOUR
+0B6A  ; [.1209.0020.0002.0B6A][.0000.0169.0002.0B6A] # ORIYA DIGIT FOUR
+0BEA  ; [.1209.0020.0002.0BEA][.0000.016A.0002.0BEA] # TAMIL DIGIT FOUR
+0C6A  ; [.1209.0020.0002.0C6A][.0000.016B.0002.0C6A] # TELUGU DIGIT FOUR
+0CEA  ; [.1209.0020.0002.0CEA][.0000.016C.0002.0CEA] # KANNADA DIGIT FOUR
+0D6A  ; [.1209.0020.0002.0D6A][.0000.016D.0002.0D6A] # MALAYALAM DIGIT FOUR
+ABF4  ; [.1209.0020.0002.ABF4][.0000.016E.0002.ABF4] # MEETEI MAYEK DIGIT FOUR
+A8D4  ; [.1209.0020.0002.A8D4][.0000.016F.0002.A8D4] # SAURASHTRA DIGIT FOUR
+194A  ; [.1209.0020.0002.194A][.0000.0170.0002.194A] # LIMBU DIGIT FOUR
+19D4  ; [.1209.0020.0002.19D4][.0000.0171.0002.19D4] # NEW TAI LUE DIGIT FOUR
+1A84  ; [.1209.0020.0002.1A84][.0000.0173.0002.1A84] # TAI THAM HORA DIGIT FOUR
+1A94  ; [.1209.0020.0002.1A94][.0000.0174.0002.1A94] # TAI THAM THAM DIGIT FOUR
+0E54  ; [.1209.0020.0002.0E54][.0000.0175.0002.0E54] # THAI DIGIT FOUR
+0ED4  ; [.1209.0020.0002.0ED4][.0000.0176.0002.0ED4] # LAO DIGIT FOUR
+0F24  ; [.1209.0020.0002.0F24][.0000.0177.0002.0F24] # TIBETAN DIGIT FOUR
+0F2D  ; [.1209.0020.0004.0F2D][.0000.0177.0004.0F2D] # TIBETAN DIGIT HALF FOUR; QQK
+1C44  ; [.1209.0020.0002.1C44][.0000.0178.0002.1C44] # LEPCHA DIGIT FOUR
+A904  ; [.1209.0020.0002.A904][.0000.0179.0002.A904] # KAYAH LI DIGIT FOUR
+1044  ; [.1209.0020.0002.1044][.0000.017A.0002.1044] # MYANMAR DIGIT FOUR
+1094  ; [.1209.0020.0002.1094][.0000.017B.0002.1094] # MYANMAR SHAN DIGIT FOUR
+17E4  ; [.1209.0020.0002.17E4][.0000.017C.0002.17E4] # KHMER DIGIT FOUR
+17F4  ; [.1209.0020.0002.17F4][.0000.017D.0002.17F4] # KHMER SYMBOL LEK ATTAK BUON
+AA54  ; [.1209.0020.0002.AA54][.0000.017E.0002.AA54] # CHAM DIGIT FOUR
+1B54  ; [.1209.0020.0002.1B54][.0000.017F.0002.1B54] # BALINESE DIGIT FOUR
+A9D4  ; [.1209.0020.0002.A9D4][.0000.0180.0002.A9D4] # JAVANESE DIGIT FOUR
+1BB4  ; [.1209.0020.0002.1BB4][.0000.0181.0002.1BB4] # SUNDANESE DIGIT FOUR
+1814  ; [.1209.0020.0002.1814][.0000.0182.0002.1814] # MONGOLIAN DIGIT FOUR
+1C54  ; [.1209.0020.0002.1C54][.0000.0183.0002.1C54] # OL CHIKI DIGIT FOUR
+A624  ; [.1209.0020.0002.A624][.0000.0184.0002.A624] # VAI DIGIT FOUR
+3024  ; [.1209.0020.0002.3024][.0000.0185.0002.3024] # HANGZHOU NUMERAL FOUR
+1010A ; [.1209.0020.0002.1010A][.0000.0186.0002.1010A] # AEGEAN NUMBER FOUR
+12402 ; [.1209.0020.0002.12402][.0000.018B.0002.12402] # CUNEIFORM NUMERIC SIGN FOUR ASH
+12409 ; [.1209.0020.0002.12409][.0000.018B.0002.12409] # CUNEIFORM NUMERIC SIGN FOUR DISH
+1240F ; [.1209.0020.0002.1240F][.0000.018B.0002.1240F] # CUNEIFORM NUMERIC SIGN FOUR U
+12418 ; [.1209.0020.0002.12418][.0000.018B.0002.12418] # CUNEIFORM NUMERIC SIGN FOUR GESH2
+12421 ; [.1209.0020.0002.12421][.0000.018B.0002.12421] # CUNEIFORM NUMERIC SIGN FOUR GESHU
+12426 ; [.1209.0020.0002.12426][.0000.018B.0002.12426] # CUNEIFORM NUMERIC SIGN FOUR SHAR2
+12430 ; [.1209.0020.0002.12430][.0000.018B.0002.12430] # CUNEIFORM NUMERIC SIGN FOUR SHARU
+12438 ; [.1209.0020.0002.12438][.0000.018B.0002.12438] # CUNEIFORM NUMERIC SIGN FOUR BURU
+1243C ; [.1209.0020.0002.1243C][.0000.018B.0002.1243C] # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU
+1243D ; [.1209.0020.0002.1243D][.0000.018B.0002.1243D] # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4
+1243E ; [.1209.0020.0002.1243E][.0000.018B.0002.1243E] # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A
+1243F ; [.1209.0020.0002.1243F][.0000.018B.0002.1243F] # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B
+1244C ; [.1209.0020.0002.1244C][.0000.018B.0002.1244C] # CUNEIFORM NUMERIC SIGN FOUR ASH TENU
+12452 ; [.1209.0020.0002.12452][.0000.018B.0002.12452] # CUNEIFORM NUMERIC SIGN FOUR BAN2
+12453 ; [.1209.0020.0002.12453][.0000.018B.0002.12453] # CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM
+10B5B ; [.1209.0020.0002.10B5B][.0000.018F.0002.10B5B] # INSCRIPTIONAL PARTHIAN NUMBER FOUR
+10B7B ; [.1209.0020.0002.10B7B][.0000.0190.0002.10B7B] # INSCRIPTIONAL PAHLAVI NUMBER FOUR
+10A43 ; [.1209.0020.0002.10A43][.0000.0191.0002.10A43] # KHAROSHTHI DIGIT FOUR
+1D363 ; [.1209.0020.0002.1D363][.0000.0192.0002.1D363] # COUNTING ROD UNIT DIGIT FOUR
+324B  ; [.1209.0020.0006.324B][.1205.0020.0006.324B] # CIRCLED NUMBER FORTY ON BLACK SQUARE; QQKN
+32B5  ; [.1209.0020.0006.32B5][.1205.0020.0006.32B5] # CIRCLED NUMBER FORTY; QQKN
+32B6  ; [.1209.0020.0006.32B6][.1206.0020.0006.32B6] # CIRCLED NUMBER FORTY ONE; QQKN
+32B7  ; [.1209.0020.0006.32B7][.1207.0020.0006.32B7] # CIRCLED NUMBER FORTY TWO; QQKN
+32B8  ; [.1209.0020.0006.32B8][.1208.0020.0006.32B8] # CIRCLED NUMBER FORTY THREE; QQKN
+32B9  ; [.1209.0020.0006.32B9][.1209.0020.0006.32B9] # CIRCLED NUMBER FORTY FOUR; QQKN
+32BA  ; [.1209.0020.0006.32BA][.120A.0020.0006.32BA] # CIRCLED NUMBER FORTY FIVE; QQKN
+2158  ; [.1209.0020.001E.2158][*035D.0020.001E.2158][.120A.0020.001F.2158] # VULGAR FRACTION FOUR FIFTHS; QQKN
+32BB  ; [.1209.0020.0006.32BB][.120B.0020.0006.32BB] # CIRCLED NUMBER FORTY SIX; QQKN
+32BC  ; [.1209.0020.0006.32BC][.120C.0020.0006.32BC] # CIRCLED NUMBER FORTY SEVEN; QQKN
+32BD  ; [.1209.0020.0006.32BD][.120D.0020.0006.32BD] # CIRCLED NUMBER FORTY EIGHT; QQKN
+32BE  ; [.1209.0020.0006.32BE][.120E.0020.0006.32BE] # CIRCLED NUMBER FORTY NINE; QQKN
+33E3  ; [.1209.0020.0004.33E3][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR; QQKN
+32C3  ; [.1209.0020.0004.32C3][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL; QQKN
+335C  ; [.1209.0020.0004.335C][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR; QQKN
+0035  ; [.120A.0020.0002.0035] # DIGIT FIVE
+FF15  ; [.120A.0020.0003.FF15] # FULLWIDTH DIGIT FIVE; QQK
+2478  ; [*02FF.0020.0004.2478][.120A.0020.0004.2478][*0300.0020.001F.2478] # PARENTHESIZED DIGIT FIVE; QQKN
+248C  ; [.120A.0020.0004.248C][*0281.0020.0004.248C] # DIGIT FIVE FULL STOP; QQKN
+1F106 ; [.120A.0020.0004.1F106][*0234.0020.0004.1F106] # DIGIT FIVE COMMA; QQKN
+1D7D3 ; [.120A.0020.0005.1D7D3] # MATHEMATICAL BOLD DIGIT FIVE; QQK
+1D7DD ; [.120A.0020.0005.1D7DD] # MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE; QQK
+1D7E7 ; [.120A.0020.0005.1D7E7] # MATHEMATICAL SANS-SERIF DIGIT FIVE; QQK
+1D7F1 ; [.120A.0020.0005.1D7F1] # MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE; QQK
+1D7FB ; [.120A.0020.0005.1D7FB] # MATHEMATICAL MONOSPACE DIGIT FIVE; QQK
+2464  ; [.120A.0020.0006.2464] # CIRCLED DIGIT FIVE; QQK
+24F9  ; [.120A.0020.0006.24F9] # DOUBLE CIRCLED DIGIT FIVE; QQK
+277A  ; [.120A.0020.0006.277A] # DINGBAT NEGATIVE CIRCLED DIGIT FIVE; QQK
+2784  ; [.120A.0020.0006.2784] # DINGBAT CIRCLED SANS-SERIF DIGIT FIVE; QQK
+278E  ; [.120A.0020.0006.278E] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE; QQK
+2075  ; [.120A.0020.0014.2075] # SUPERSCRIPT FIVE; QQK
+2085  ; [.120A.0020.0015.2085] # SUBSCRIPT FIVE; QQK
+0665  ; [.120A.0020.0002.0665][.0000.015F.0002.0665] # ARABIC-INDIC DIGIT FIVE
+06F5  ; [.120A.0020.0002.06F5][.0000.0160.0002.06F5] # EXTENDED ARABIC-INDIC DIGIT FIVE
+10E64 ; [.120A.0020.0002.10E64][.0000.0161.0002.10E64] # RUMI DIGIT FIVE
+07C5  ; [.120A.0020.0002.07C5][.0000.0162.0002.07C5] # NKO DIGIT FIVE
+136D  ; [.120A.0020.0002.136D][.0000.0163.0002.136D] # ETHIOPIC DIGIT FIVE
+104A5 ; [.120A.0020.0002.104A5][.0000.0164.0002.104A5] # OSMANYA DIGIT FIVE
+096B  ; [.120A.0020.0002.096B][.0000.0165.0002.096B] # DEVANAGARI DIGIT FIVE
+09EB  ; [.120A.0020.0002.09EB][.0000.0166.0002.09EB] # BENGALI DIGIT FIVE
+0A6B  ; [.120A.0020.0002.0A6B][.0000.0167.0002.0A6B] # GURMUKHI DIGIT FIVE
+0AEB  ; [.120A.0020.0002.0AEB][.0000.0168.0002.0AEB] # GUJARATI DIGIT FIVE
+0B6B  ; [.120A.0020.0002.0B6B][.0000.0169.0002.0B6B] # ORIYA DIGIT FIVE
+0BEB  ; [.120A.0020.0002.0BEB][.0000.016A.0002.0BEB] # TAMIL DIGIT FIVE
+0C6B  ; [.120A.0020.0002.0C6B][.0000.016B.0002.0C6B] # TELUGU DIGIT FIVE
+0CEB  ; [.120A.0020.0002.0CEB][.0000.016C.0002.0CEB] # KANNADA DIGIT FIVE
+0D6B  ; [.120A.0020.0002.0D6B][.0000.016D.0002.0D6B] # MALAYALAM DIGIT FIVE
+ABF5  ; [.120A.0020.0002.ABF5][.0000.016E.0002.ABF5] # MEETEI MAYEK DIGIT FIVE
+A8D5  ; [.120A.0020.0002.A8D5][.0000.016F.0002.A8D5] # SAURASHTRA DIGIT FIVE
+194B  ; [.120A.0020.0002.194B][.0000.0170.0002.194B] # LIMBU DIGIT FIVE
+19D5  ; [.120A.0020.0002.19D5][.0000.0171.0002.19D5] # NEW TAI LUE DIGIT FIVE
+1A85  ; [.120A.0020.0002.1A85][.0000.0173.0002.1A85] # TAI THAM HORA DIGIT FIVE
+1A95  ; [.120A.0020.0002.1A95][.0000.0174.0002.1A95] # TAI THAM THAM DIGIT FIVE
+0E55  ; [.120A.0020.0002.0E55][.0000.0175.0002.0E55] # THAI DIGIT FIVE
+0ED5  ; [.120A.0020.0002.0ED5][.0000.0176.0002.0ED5] # LAO DIGIT FIVE
+0F25  ; [.120A.0020.0002.0F25][.0000.0177.0002.0F25] # TIBETAN DIGIT FIVE
+0F2E  ; [.120A.0020.0004.0F2E][.0000.0177.0004.0F2E] # TIBETAN DIGIT HALF FIVE; QQK
+1C45  ; [.120A.0020.0002.1C45][.0000.0178.0002.1C45] # LEPCHA DIGIT FIVE
+A905  ; [.120A.0020.0002.A905][.0000.0179.0002.A905] # KAYAH LI DIGIT FIVE
+1045  ; [.120A.0020.0002.1045][.0000.017A.0002.1045] # MYANMAR DIGIT FIVE
+1095  ; [.120A.0020.0002.1095][.0000.017B.0002.1095] # MYANMAR SHAN DIGIT FIVE
+17E5  ; [.120A.0020.0002.17E5][.0000.017C.0002.17E5] # KHMER DIGIT FIVE
+17F5  ; [.120A.0020.0002.17F5][.0000.017D.0002.17F5] # KHMER SYMBOL LEK ATTAK PRAM
+AA55  ; [.120A.0020.0002.AA55][.0000.017E.0002.AA55] # CHAM DIGIT FIVE
+1B55  ; [.120A.0020.0002.1B55][.0000.017F.0002.1B55] # BALINESE DIGIT FIVE
+A9D5  ; [.120A.0020.0002.A9D5][.0000.0180.0002.A9D5] # JAVANESE DIGIT FIVE
+1BB5  ; [.120A.0020.0002.1BB5][.0000.0181.0002.1BB5] # SUNDANESE DIGIT FIVE
+1815  ; [.120A.0020.0002.1815][.0000.0182.0002.1815] # MONGOLIAN DIGIT FIVE
+1C55  ; [.120A.0020.0002.1C55][.0000.0183.0002.1C55] # OL CHIKI DIGIT FIVE
+A625  ; [.120A.0020.0002.A625][.0000.0184.0002.A625] # VAI DIGIT FIVE
+3025  ; [.120A.0020.0002.3025][.0000.0185.0002.3025] # HANGZHOU NUMERAL FIVE
+1010B ; [.120A.0020.0002.1010B][.0000.0186.0002.1010B] # AEGEAN NUMBER FIVE
+10143 ; [.120A.0020.0002.10143][.0000.0187.0002.10143] # GREEK ACROPHONIC ATTIC FIVE
+10148 ; [.120A.0020.0002.10148][.0000.0187.0002.10148] # GREEK ACROPHONIC ATTIC FIVE TALENTS
+1014F ; [.120A.0020.0002.1014F][.0000.0187.0002.1014F] # GREEK ACROPHONIC ATTIC FIVE STATERS
+1015F ; [.120A.0020.0002.1015F][.0000.0187.0002.1015F] # GREEK ACROPHONIC TROEZENIAN FIVE
+10173 ; [.120A.0020.0002.10173][.0000.0187.0002.10173] # GREEK ACROPHONIC DELPHIC FIVE MNAS
+10321 ; [.120A.0020.0002.10321][.0000.0189.0002.10321] # OLD ITALIC NUMERAL FIVE
+12403 ; [.120A.0020.0002.12403][.0000.018B.0002.12403] # CUNEIFORM NUMERIC SIGN FIVE ASH
+1240A ; [.120A.0020.0002.1240A][.0000.018B.0002.1240A] # CUNEIFORM NUMERIC SIGN FIVE DISH
+12410 ; [.120A.0020.0002.12410][.0000.018B.0002.12410] # CUNEIFORM NUMERIC SIGN FIVE U
+12419 ; [.120A.0020.0002.12419][.0000.018B.0002.12419] # CUNEIFORM NUMERIC SIGN FIVE GESH2
+12422 ; [.120A.0020.0002.12422][.0000.018B.0002.12422] # CUNEIFORM NUMERIC SIGN FIVE GESHU
+12427 ; [.120A.0020.0002.12427][.0000.018B.0002.12427] # CUNEIFORM NUMERIC SIGN FIVE SHAR2
+12431 ; [.120A.0020.0002.12431][.0000.018B.0002.12431] # CUNEIFORM NUMERIC SIGN FIVE SHARU
+12439 ; [.120A.0020.0002.12439][.0000.018B.0002.12439] # CUNEIFORM NUMERIC SIGN FIVE BURU
+1244D ; [.120A.0020.0002.1244D][.0000.018B.0002.1244D] # CUNEIFORM NUMERIC SIGN FIVE ASH TENU
+12454 ; [.120A.0020.0002.12454][.0000.018B.0002.12454] # CUNEIFORM NUMERIC SIGN FIVE BAN2
+12455 ; [.120A.0020.0002.12455][.0000.018B.0002.12455] # CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM
+1D364 ; [.120A.0020.0002.1D364][.0000.0192.0002.1D364] # COUNTING ROD UNIT DIGIT FIVE
+324C  ; [.120A.0020.0006.324C][.1205.0020.0006.324C] # CIRCLED NUMBER FIFTY ON BLACK SQUARE; QQKN
+32BF  ; [.120A.0020.0006.32BF][.1205.0020.0006.32BF] # CIRCLED NUMBER FIFTY; QQKN
+215A  ; [.120A.0020.001E.215A][*035D.0020.001E.215A][.120B.0020.001F.215A] # VULGAR FRACTION FIVE SIXTHS; QQKN
+215D  ; [.120A.0020.001E.215D][*035D.0020.001E.215D][.120D.0020.001F.215D] # VULGAR FRACTION FIVE EIGHTHS; QQKN
+33E4  ; [.120A.0020.0004.33E4][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE; QQKN
+32C4  ; [.120A.0020.0004.32C4][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY; QQKN
+335D  ; [.120A.0020.0004.335D][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE; QQKN
+0036  ; [.120B.0020.0002.0036] # DIGIT SIX
+FF16  ; [.120B.0020.0003.FF16] # FULLWIDTH DIGIT SIX; QQK
+2479  ; [*02FF.0020.0004.2479][.120B.0020.0004.2479][*0300.0020.001F.2479] # PARENTHESIZED DIGIT SIX; QQKN
+248D  ; [.120B.0020.0004.248D][*0281.0020.0004.248D] # DIGIT SIX FULL STOP; QQKN
+1F107 ; [.120B.0020.0004.1F107][*0234.0020.0004.1F107] # DIGIT SIX COMMA; QQKN
+1D7D4 ; [.120B.0020.0005.1D7D4] # MATHEMATICAL BOLD DIGIT SIX; QQK
+1D7DE ; [.120B.0020.0005.1D7DE] # MATHEMATICAL DOUBLE-STRUCK DIGIT SIX; QQK
+1D7E8 ; [.120B.0020.0005.1D7E8] # MATHEMATICAL SANS-SERIF DIGIT SIX; QQK
+1D7F2 ; [.120B.0020.0005.1D7F2] # MATHEMATICAL SANS-SERIF BOLD DIGIT SIX; QQK
+1D7FC ; [.120B.0020.0005.1D7FC] # MATHEMATICAL MONOSPACE DIGIT SIX; QQK
+2465  ; [.120B.0020.0006.2465] # CIRCLED DIGIT SIX; QQK
+24FA  ; [.120B.0020.0006.24FA] # DOUBLE CIRCLED DIGIT SIX; QQK
+277B  ; [.120B.0020.0006.277B] # DINGBAT NEGATIVE CIRCLED DIGIT SIX; QQK
+2785  ; [.120B.0020.0006.2785] # DINGBAT CIRCLED SANS-SERIF DIGIT SIX; QQK
+278F  ; [.120B.0020.0006.278F] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX; QQK
+2076  ; [.120B.0020.0014.2076] # SUPERSCRIPT SIX; QQK
+2086  ; [.120B.0020.0015.2086] # SUBSCRIPT SIX; QQK
+0666  ; [.120B.0020.0002.0666][.0000.015F.0002.0666] # ARABIC-INDIC DIGIT SIX
+06F6  ; [.120B.0020.0002.06F6][.0000.0160.0002.06F6] # EXTENDED ARABIC-INDIC DIGIT SIX
+10E65 ; [.120B.0020.0002.10E65][.0000.0161.0002.10E65] # RUMI DIGIT SIX
+07C6  ; [.120B.0020.0002.07C6][.0000.0162.0002.07C6] # NKO DIGIT SIX
+136E  ; [.120B.0020.0002.136E][.0000.0163.0002.136E] # ETHIOPIC DIGIT SIX
+104A6 ; [.120B.0020.0002.104A6][.0000.0164.0002.104A6] # OSMANYA DIGIT SIX
+096C  ; [.120B.0020.0002.096C][.0000.0165.0002.096C] # DEVANAGARI DIGIT SIX
+09EC  ; [.120B.0020.0002.09EC][.0000.0166.0002.09EC] # BENGALI DIGIT SIX
+0A6C  ; [.120B.0020.0002.0A6C][.0000.0167.0002.0A6C] # GURMUKHI DIGIT SIX
+0AEC  ; [.120B.0020.0002.0AEC][.0000.0168.0002.0AEC] # GUJARATI DIGIT SIX
+0B6C  ; [.120B.0020.0002.0B6C][.0000.0169.0002.0B6C] # ORIYA DIGIT SIX
+0BEC  ; [.120B.0020.0002.0BEC][.0000.016A.0002.0BEC] # TAMIL DIGIT SIX
+0C6C  ; [.120B.0020.0002.0C6C][.0000.016B.0002.0C6C] # TELUGU DIGIT SIX
+0CEC  ; [.120B.0020.0002.0CEC][.0000.016C.0002.0CEC] # KANNADA DIGIT SIX
+0D6C  ; [.120B.0020.0002.0D6C][.0000.016D.0002.0D6C] # MALAYALAM DIGIT SIX
+ABF6  ; [.120B.0020.0002.ABF6][.0000.016E.0002.ABF6] # MEETEI MAYEK DIGIT SIX
+A8D6  ; [.120B.0020.0002.A8D6][.0000.016F.0002.A8D6] # SAURASHTRA DIGIT SIX
+194C  ; [.120B.0020.0002.194C][.0000.0170.0002.194C] # LIMBU DIGIT SIX
+19D6  ; [.120B.0020.0002.19D6][.0000.0171.0002.19D6] # NEW TAI LUE DIGIT SIX
+1A86  ; [.120B.0020.0002.1A86][.0000.0173.0002.1A86] # TAI THAM HORA DIGIT SIX
+1A96  ; [.120B.0020.0002.1A96][.0000.0174.0002.1A96] # TAI THAM THAM DIGIT SIX
+0E56  ; [.120B.0020.0002.0E56][.0000.0175.0002.0E56] # THAI DIGIT SIX
+0ED6  ; [.120B.0020.0002.0ED6][.0000.0176.0002.0ED6] # LAO DIGIT SIX
+0F26  ; [.120B.0020.0002.0F26][.0000.0177.0002.0F26] # TIBETAN DIGIT SIX
+0F2F  ; [.120B.0020.0004.0F2F][.0000.0177.0004.0F2F] # TIBETAN DIGIT HALF SIX; QQK
+1C46  ; [.120B.0020.0002.1C46][.0000.0178.0002.1C46] # LEPCHA DIGIT SIX
+A906  ; [.120B.0020.0002.A906][.0000.0179.0002.A906] # KAYAH LI DIGIT SIX
+1046  ; [.120B.0020.0002.1046][.0000.017A.0002.1046] # MYANMAR DIGIT SIX
+1096  ; [.120B.0020.0002.1096][.0000.017B.0002.1096] # MYANMAR SHAN DIGIT SIX
+17E6  ; [.120B.0020.0002.17E6][.0000.017C.0002.17E6] # KHMER DIGIT SIX
+17F6  ; [.120B.0020.0002.17F6][.0000.017D.0002.17F6] # KHMER SYMBOL LEK ATTAK PRAM-MUOY
+AA56  ; [.120B.0020.0002.AA56][.0000.017E.0002.AA56] # CHAM DIGIT SIX
+1B56  ; [.120B.0020.0002.1B56][.0000.017F.0002.1B56] # BALINESE DIGIT SIX
+A9D6  ; [.120B.0020.0002.A9D6][.0000.0180.0002.A9D6] # JAVANESE DIGIT SIX
+1BB6  ; [.120B.0020.0002.1BB6][.0000.0181.0002.1BB6] # SUNDANESE DIGIT SIX
+1816  ; [.120B.0020.0002.1816][.0000.0182.0002.1816] # MONGOLIAN DIGIT SIX
+1C56  ; [.120B.0020.0002.1C56][.0000.0183.0002.1C56] # OL CHIKI DIGIT SIX
+A626  ; [.120B.0020.0002.A626][.0000.0184.0002.A626] # VAI DIGIT SIX
+3026  ; [.120B.0020.0002.3026][.0000.0185.0002.3026] # HANGZHOU NUMERAL SIX
+1010C ; [.120B.0020.0002.1010C][.0000.0186.0002.1010C] # AEGEAN NUMBER SIX
+2185  ; [.120B.0020.0002.2185][.0000.0188.0002.2185] # ROMAN NUMERAL SIX LATE FORM
+12404 ; [.120B.0020.0002.12404][.0000.018B.0002.12404] # CUNEIFORM NUMERIC SIGN SIX ASH
+1240B ; [.120B.0020.0002.1240B][.0000.018B.0002.1240B] # CUNEIFORM NUMERIC SIGN SIX DISH
+12411 ; [.120B.0020.0002.12411][.0000.018B.0002.12411] # CUNEIFORM NUMERIC SIGN SIX U
+1241A ; [.120B.0020.0002.1241A][.0000.018B.0002.1241A] # CUNEIFORM NUMERIC SIGN SIX GESH2
+12428 ; [.120B.0020.0002.12428][.0000.018B.0002.12428] # CUNEIFORM NUMERIC SIGN SIX SHAR2
+12440 ; [.120B.0020.0002.12440][.0000.018B.0002.12440] # CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9
+1244E ; [.120B.0020.0002.1244E][.0000.018B.0002.1244E] # CUNEIFORM NUMERIC SIGN SIX ASH TENU
+1D365 ; [.120B.0020.0002.1D365][.0000.0192.0002.1D365] # COUNTING ROD UNIT DIGIT SIX
+324D  ; [.120B.0020.0006.324D][.1205.0020.0006.324D] # CIRCLED NUMBER SIXTY ON BLACK SQUARE; QQKN
+33E5  ; [.120B.0020.0004.33E5][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX; QQKN
+32C5  ; [.120B.0020.0004.32C5][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE; QQKN
+335E  ; [.120B.0020.0004.335E][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX; QQKN
+0037  ; [.120C.0020.0002.0037] # DIGIT SEVEN
+FF17  ; [.120C.0020.0003.FF17] # FULLWIDTH DIGIT SEVEN; QQK
+247A  ; [*02FF.0020.0004.247A][.120C.0020.0004.247A][*0300.0020.001F.247A] # PARENTHESIZED DIGIT SEVEN; QQKN
+248E  ; [.120C.0020.0004.248E][*0281.0020.0004.248E] # DIGIT SEVEN FULL STOP; QQKN
+1F108 ; [.120C.0020.0004.1F108][*0234.0020.0004.1F108] # DIGIT SEVEN COMMA; QQKN
+1D7D5 ; [.120C.0020.0005.1D7D5] # MATHEMATICAL BOLD DIGIT SEVEN; QQK
+1D7DF ; [.120C.0020.0005.1D7DF] # MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN; QQK
+1D7E9 ; [.120C.0020.0005.1D7E9] # MATHEMATICAL SANS-SERIF DIGIT SEVEN; QQK
+1D7F3 ; [.120C.0020.0005.1D7F3] # MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN; QQK
+1D7FD ; [.120C.0020.0005.1D7FD] # MATHEMATICAL MONOSPACE DIGIT SEVEN; QQK
+2466  ; [.120C.0020.0006.2466] # CIRCLED DIGIT SEVEN; QQK
+24FB  ; [.120C.0020.0006.24FB] # DOUBLE CIRCLED DIGIT SEVEN; QQK
+277C  ; [.120C.0020.0006.277C] # DINGBAT NEGATIVE CIRCLED DIGIT SEVEN; QQK
+2786  ; [.120C.0020.0006.2786] # DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN; QQK
+2790  ; [.120C.0020.0006.2790] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN; QQK
+2077  ; [.120C.0020.0014.2077] # SUPERSCRIPT SEVEN; QQK
+2087  ; [.120C.0020.0015.2087] # SUBSCRIPT SEVEN; QQK
+0667  ; [.120C.0020.0002.0667][.0000.015F.0002.0667] # ARABIC-INDIC DIGIT SEVEN
+06F7  ; [.120C.0020.0002.06F7][.0000.0160.0002.06F7] # EXTENDED ARABIC-INDIC DIGIT SEVEN
+10E66 ; [.120C.0020.0002.10E66][.0000.0161.0002.10E66] # RUMI DIGIT SEVEN
+07C7  ; [.120C.0020.0002.07C7][.0000.0162.0002.07C7] # NKO DIGIT SEVEN
+136F  ; [.120C.0020.0002.136F][.0000.0163.0002.136F] # ETHIOPIC DIGIT SEVEN
+104A7 ; [.120C.0020.0002.104A7][.0000.0164.0002.104A7] # OSMANYA DIGIT SEVEN
+096D  ; [.120C.0020.0002.096D][.0000.0165.0002.096D] # DEVANAGARI DIGIT SEVEN
+09ED  ; [.120C.0020.0002.09ED][.0000.0166.0002.09ED] # BENGALI DIGIT SEVEN
+0A6D  ; [.120C.0020.0002.0A6D][.0000.0167.0002.0A6D] # GURMUKHI DIGIT SEVEN
+0AED  ; [.120C.0020.0002.0AED][.0000.0168.0002.0AED] # GUJARATI DIGIT SEVEN
+0B6D  ; [.120C.0020.0002.0B6D][.0000.0169.0002.0B6D] # ORIYA DIGIT SEVEN
+0BED  ; [.120C.0020.0002.0BED][.0000.016A.0002.0BED] # TAMIL DIGIT SEVEN
+0C6D  ; [.120C.0020.0002.0C6D][.0000.016B.0002.0C6D] # TELUGU DIGIT SEVEN
+0CED  ; [.120C.0020.0002.0CED][.0000.016C.0002.0CED] # KANNADA DIGIT SEVEN
+0D6D  ; [.120C.0020.0002.0D6D][.0000.016D.0002.0D6D] # MALAYALAM DIGIT SEVEN
+ABF7  ; [.120C.0020.0002.ABF7][.0000.016E.0002.ABF7] # MEETEI MAYEK DIGIT SEVEN
+A8D7  ; [.120C.0020.0002.A8D7][.0000.016F.0002.A8D7] # SAURASHTRA DIGIT SEVEN
+194D  ; [.120C.0020.0002.194D][.0000.0170.0002.194D] # LIMBU DIGIT SEVEN
+19D7  ; [.120C.0020.0002.19D7][.0000.0171.0002.19D7] # NEW TAI LUE DIGIT SEVEN
+1A87  ; [.120C.0020.0002.1A87][.0000.0173.0002.1A87] # TAI THAM HORA DIGIT SEVEN
+1A97  ; [.120C.0020.0002.1A97][.0000.0174.0002.1A97] # TAI THAM THAM DIGIT SEVEN
+0E57  ; [.120C.0020.0002.0E57][.0000.0175.0002.0E57] # THAI DIGIT SEVEN
+0ED7  ; [.120C.0020.0002.0ED7][.0000.0176.0002.0ED7] # LAO DIGIT SEVEN
+0F27  ; [.120C.0020.0002.0F27][.0000.0177.0002.0F27] # TIBETAN DIGIT SEVEN
+0F30  ; [.120C.0020.0004.0F30][.0000.0177.0004.0F30] # TIBETAN DIGIT HALF SEVEN; QQK
+1C47  ; [.120C.0020.0002.1C47][.0000.0178.0002.1C47] # LEPCHA DIGIT SEVEN
+A907  ; [.120C.0020.0002.A907][.0000.0179.0002.A907] # KAYAH LI DIGIT SEVEN
+1047  ; [.120C.0020.0002.1047][.0000.017A.0002.1047] # MYANMAR DIGIT SEVEN
+1097  ; [.120C.0020.0002.1097][.0000.017B.0002.1097] # MYANMAR SHAN DIGIT SEVEN
+17E7  ; [.120C.0020.0002.17E7][.0000.017C.0002.17E7] # KHMER DIGIT SEVEN
+17F7  ; [.120C.0020.0002.17F7][.0000.017D.0002.17F7] # KHMER SYMBOL LEK ATTAK PRAM-PII
+AA57  ; [.120C.0020.0002.AA57][.0000.017E.0002.AA57] # CHAM DIGIT SEVEN
+1B57  ; [.120C.0020.0002.1B57][.0000.017F.0002.1B57] # BALINESE DIGIT SEVEN
+A9D7  ; [.120C.0020.0002.A9D7][.0000.0180.0002.A9D7] # JAVANESE DIGIT SEVEN
+1BB7  ; [.120C.0020.0002.1BB7][.0000.0181.0002.1BB7] # SUNDANESE DIGIT SEVEN
+1817  ; [.120C.0020.0002.1817][.0000.0182.0002.1817] # MONGOLIAN DIGIT SEVEN
+1C57  ; [.120C.0020.0002.1C57][.0000.0183.0002.1C57] # OL CHIKI DIGIT SEVEN
+A627  ; [.120C.0020.0002.A627][.0000.0184.0002.A627] # VAI DIGIT SEVEN
+3027  ; [.120C.0020.0002.3027][.0000.0185.0002.3027] # HANGZHOU NUMERAL SEVEN
+1010D ; [.120C.0020.0002.1010D][.0000.0186.0002.1010D] # AEGEAN NUMBER SEVEN
+12405 ; [.120C.0020.0002.12405][.0000.018B.0002.12405] # CUNEIFORM NUMERIC SIGN SEVEN ASH
+1240C ; [.120C.0020.0002.1240C][.0000.018B.0002.1240C] # CUNEIFORM NUMERIC SIGN SEVEN DISH
+12412 ; [.120C.0020.0002.12412][.0000.018B.0002.12412] # CUNEIFORM NUMERIC SIGN SEVEN U
+1241B ; [.120C.0020.0002.1241B][.0000.018B.0002.1241B] # CUNEIFORM NUMERIC SIGN SEVEN GESH2
+12429 ; [.120C.0020.0002.12429][.0000.018B.0002.12429] # CUNEIFORM NUMERIC SIGN SEVEN SHAR2
+12441 ; [.120C.0020.0002.12441][.0000.018B.0002.12441] # CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3
+12442 ; [.120C.0020.0002.12442][.0000.018B.0002.12442] # CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A
+12443 ; [.120C.0020.0002.12443][.0000.018B.0002.12443] # CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B
+1D366 ; [.120C.0020.0002.1D366][.0000.0192.0002.1D366] # COUNTING ROD UNIT DIGIT SEVEN
+324E  ; [.120C.0020.0006.324E][.1205.0020.0006.324E] # CIRCLED NUMBER SEVENTY ON BLACK SQUARE; QQKN
+215E  ; [.120C.0020.001E.215E][*035D.0020.001E.215E][.120D.0020.001F.215E] # VULGAR FRACTION SEVEN EIGHTHS; QQKN
+33E6  ; [.120C.0020.0004.33E6][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN; QQKN
+32C6  ; [.120C.0020.0004.32C6][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY; QQKN
+335F  ; [.120C.0020.0004.335F][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN; QQKN
+0038  ; [.120D.0020.0002.0038] # DIGIT EIGHT
+FF18  ; [.120D.0020.0003.FF18] # FULLWIDTH DIGIT EIGHT; QQK
+247B  ; [*02FF.0020.0004.247B][.120D.0020.0004.247B][*0300.0020.001F.247B] # PARENTHESIZED DIGIT EIGHT; QQKN
+248F  ; [.120D.0020.0004.248F][*0281.0020.0004.248F] # DIGIT EIGHT FULL STOP; QQKN
+1F109 ; [.120D.0020.0004.1F109][*0234.0020.0004.1F109] # DIGIT EIGHT COMMA; QQKN
+1D7D6 ; [.120D.0020.0005.1D7D6] # MATHEMATICAL BOLD DIGIT EIGHT; QQK
+1D7E0 ; [.120D.0020.0005.1D7E0] # MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT; QQK
+1D7EA ; [.120D.0020.0005.1D7EA] # MATHEMATICAL SANS-SERIF DIGIT EIGHT; QQK
+1D7F4 ; [.120D.0020.0005.1D7F4] # MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT; QQK
+1D7FE ; [.120D.0020.0005.1D7FE] # MATHEMATICAL MONOSPACE DIGIT EIGHT; QQK
+2467  ; [.120D.0020.0006.2467] # CIRCLED DIGIT EIGHT; QQK
+24FC  ; [.120D.0020.0006.24FC] # DOUBLE CIRCLED DIGIT EIGHT; QQK
+277D  ; [.120D.0020.0006.277D] # DINGBAT NEGATIVE CIRCLED DIGIT EIGHT; QQK
+2787  ; [.120D.0020.0006.2787] # DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT; QQK
+2791  ; [.120D.0020.0006.2791] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT; QQK
+2078  ; [.120D.0020.0014.2078] # SUPERSCRIPT EIGHT; QQK
+2088  ; [.120D.0020.0015.2088] # SUBSCRIPT EIGHT; QQK
+0668  ; [.120D.0020.0002.0668][.0000.015F.0002.0668] # ARABIC-INDIC DIGIT EIGHT
+06F8  ; [.120D.0020.0002.06F8][.0000.0160.0002.06F8] # EXTENDED ARABIC-INDIC DIGIT EIGHT
+10E67 ; [.120D.0020.0002.10E67][.0000.0161.0002.10E67] # RUMI DIGIT EIGHT
+07C8  ; [.120D.0020.0002.07C8][.0000.0162.0002.07C8] # NKO DIGIT EIGHT
+1370  ; [.120D.0020.0002.1370][.0000.0163.0002.1370] # ETHIOPIC DIGIT EIGHT
+104A8 ; [.120D.0020.0002.104A8][.0000.0164.0002.104A8] # OSMANYA DIGIT EIGHT
+096E  ; [.120D.0020.0002.096E][.0000.0165.0002.096E] # DEVANAGARI DIGIT EIGHT
+09EE  ; [.120D.0020.0002.09EE][.0000.0166.0002.09EE] # BENGALI DIGIT EIGHT
+0A6E  ; [.120D.0020.0002.0A6E][.0000.0167.0002.0A6E] # GURMUKHI DIGIT EIGHT
+0AEE  ; [.120D.0020.0002.0AEE][.0000.0168.0002.0AEE] # GUJARATI DIGIT EIGHT
+0B6E  ; [.120D.0020.0002.0B6E][.0000.0169.0002.0B6E] # ORIYA DIGIT EIGHT
+0BEE  ; [.120D.0020.0002.0BEE][.0000.016A.0002.0BEE] # TAMIL DIGIT EIGHT
+0C6E  ; [.120D.0020.0002.0C6E][.0000.016B.0002.0C6E] # TELUGU DIGIT EIGHT
+0CEE  ; [.120D.0020.0002.0CEE][.0000.016C.0002.0CEE] # KANNADA DIGIT EIGHT
+0D6E  ; [.120D.0020.0002.0D6E][.0000.016D.0002.0D6E] # MALAYALAM DIGIT EIGHT
+ABF8  ; [.120D.0020.0002.ABF8][.0000.016E.0002.ABF8] # MEETEI MAYEK DIGIT EIGHT
+A8D8  ; [.120D.0020.0002.A8D8][.0000.016F.0002.A8D8] # SAURASHTRA DIGIT EIGHT
+194E  ; [.120D.0020.0002.194E][.0000.0170.0002.194E] # LIMBU DIGIT EIGHT
+19D8  ; [.120D.0020.0002.19D8][.0000.0171.0002.19D8] # NEW TAI LUE DIGIT EIGHT
+1A88  ; [.120D.0020.0002.1A88][.0000.0173.0002.1A88] # TAI THAM HORA DIGIT EIGHT
+1A98  ; [.120D.0020.0002.1A98][.0000.0174.0002.1A98] # TAI THAM THAM DIGIT EIGHT
+0E58  ; [.120D.0020.0002.0E58][.0000.0175.0002.0E58] # THAI DIGIT EIGHT
+0ED8  ; [.120D.0020.0002.0ED8][.0000.0176.0002.0ED8] # LAO DIGIT EIGHT
+0F28  ; [.120D.0020.0002.0F28][.0000.0177.0002.0F28] # TIBETAN DIGIT EIGHT
+0F31  ; [.120D.0020.0004.0F31][.0000.0177.0004.0F31] # TIBETAN DIGIT HALF EIGHT; QQK
+1C48  ; [.120D.0020.0002.1C48][.0000.0178.0002.1C48] # LEPCHA DIGIT EIGHT
+A908  ; [.120D.0020.0002.A908][.0000.0179.0002.A908] # KAYAH LI DIGIT EIGHT
+1048  ; [.120D.0020.0002.1048][.0000.017A.0002.1048] # MYANMAR DIGIT EIGHT
+1098  ; [.120D.0020.0002.1098][.0000.017B.0002.1098] # MYANMAR SHAN DIGIT EIGHT
+17E8  ; [.120D.0020.0002.17E8][.0000.017C.0002.17E8] # KHMER DIGIT EIGHT
+17F8  ; [.120D.0020.0002.17F8][.0000.017D.0002.17F8] # KHMER SYMBOL LEK ATTAK PRAM-BEI
+AA58  ; [.120D.0020.0002.AA58][.0000.017E.0002.AA58] # CHAM DIGIT EIGHT
+1B58  ; [.120D.0020.0002.1B58][.0000.017F.0002.1B58] # BALINESE DIGIT EIGHT
+A9D8  ; [.120D.0020.0002.A9D8][.0000.0180.0002.A9D8] # JAVANESE DIGIT EIGHT
+1BB8  ; [.120D.0020.0002.1BB8][.0000.0181.0002.1BB8] # SUNDANESE DIGIT EIGHT
+1818  ; [.120D.0020.0002.1818][.0000.0182.0002.1818] # MONGOLIAN DIGIT EIGHT
+1C58  ; [.120D.0020.0002.1C58][.0000.0183.0002.1C58] # OL CHIKI DIGIT EIGHT
+A628  ; [.120D.0020.0002.A628][.0000.0184.0002.A628] # VAI DIGIT EIGHT
+3028  ; [.120D.0020.0002.3028][.0000.0185.0002.3028] # HANGZHOU NUMERAL EIGHT
+1010E ; [.120D.0020.0002.1010E][.0000.0186.0002.1010E] # AEGEAN NUMBER EIGHT
+12406 ; [.120D.0020.0002.12406][.0000.018B.0002.12406] # CUNEIFORM NUMERIC SIGN EIGHT ASH
+1240D ; [.120D.0020.0002.1240D][.0000.018B.0002.1240D] # CUNEIFORM NUMERIC SIGN EIGHT DISH
+12413 ; [.120D.0020.0002.12413][.0000.018B.0002.12413] # CUNEIFORM NUMERIC SIGN EIGHT U
+1241C ; [.120D.0020.0002.1241C][.0000.018B.0002.1241C] # CUNEIFORM NUMERIC SIGN EIGHT GESH2
+1242A ; [.120D.0020.0002.1242A][.0000.018B.0002.1242A] # CUNEIFORM NUMERIC SIGN EIGHT SHAR2
+12444 ; [.120D.0020.0002.12444][.0000.018B.0002.12444] # CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU
+12445 ; [.120D.0020.0002.12445][.0000.018B.0002.12445] # CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3
+1D367 ; [.120D.0020.0002.1D367][.0000.0192.0002.1D367] # COUNTING ROD UNIT DIGIT EIGHT
+324F  ; [.120D.0020.0006.324F][.1205.0020.0006.324F] # CIRCLED NUMBER EIGHTY ON BLACK SQUARE; QQKN
+33E7  ; [.120D.0020.0004.33E7][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT; QQKN
+32C7  ; [.120D.0020.0004.32C7][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST; QQKN
+3360  ; [.120D.0020.0004.3360][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT; QQKN
+0039  ; [.120E.0020.0002.0039] # DIGIT NINE
+FF19  ; [.120E.0020.0003.FF19] # FULLWIDTH DIGIT NINE; QQK
+247C  ; [*02FF.0020.0004.247C][.120E.0020.0004.247C][*0300.0020.001F.247C] # PARENTHESIZED DIGIT NINE; QQKN
+2490  ; [.120E.0020.0004.2490][*0281.0020.0004.2490] # DIGIT NINE FULL STOP; QQKN
+1F10A ; [.120E.0020.0004.1F10A][*0234.0020.0004.1F10A] # DIGIT NINE COMMA; QQKN
+1D7D7 ; [.120E.0020.0005.1D7D7] # MATHEMATICAL BOLD DIGIT NINE; QQK
+1D7E1 ; [.120E.0020.0005.1D7E1] # MATHEMATICAL DOUBLE-STRUCK DIGIT NINE; QQK
+1D7EB ; [.120E.0020.0005.1D7EB] # MATHEMATICAL SANS-SERIF DIGIT NINE; QQK
+1D7F5 ; [.120E.0020.0005.1D7F5] # MATHEMATICAL SANS-SERIF BOLD DIGIT NINE; QQK
+1D7FF ; [.120E.0020.0005.1D7FF] # MATHEMATICAL MONOSPACE DIGIT NINE; QQK
+2468  ; [.120E.0020.0006.2468] # CIRCLED DIGIT NINE; QQK
+24FD  ; [.120E.0020.0006.24FD] # DOUBLE CIRCLED DIGIT NINE; QQK
+277E  ; [.120E.0020.0006.277E] # DINGBAT NEGATIVE CIRCLED DIGIT NINE; QQK
+2788  ; [.120E.0020.0006.2788] # DINGBAT CIRCLED SANS-SERIF DIGIT NINE; QQK
+2792  ; [.120E.0020.0006.2792] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE; QQK
+2079  ; [.120E.0020.0014.2079] # SUPERSCRIPT NINE; QQK
+2089  ; [.120E.0020.0015.2089] # SUBSCRIPT NINE; QQK
+0669  ; [.120E.0020.0002.0669][.0000.015F.0002.0669] # ARABIC-INDIC DIGIT NINE
+06F9  ; [.120E.0020.0002.06F9][.0000.0160.0002.06F9] # EXTENDED ARABIC-INDIC DIGIT NINE
+10E68 ; [.120E.0020.0002.10E68][.0000.0161.0002.10E68] # RUMI DIGIT NINE
+07C9  ; [.120E.0020.0002.07C9][.0000.0162.0002.07C9] # NKO DIGIT NINE
+1371  ; [.120E.0020.0002.1371][.0000.0163.0002.1371] # ETHIOPIC DIGIT NINE
+104A9 ; [.120E.0020.0002.104A9][.0000.0164.0002.104A9] # OSMANYA DIGIT NINE
+096F  ; [.120E.0020.0002.096F][.0000.0165.0002.096F] # DEVANAGARI DIGIT NINE
+09EF  ; [.120E.0020.0002.09EF][.0000.0166.0002.09EF] # BENGALI DIGIT NINE
+0A6F  ; [.120E.0020.0002.0A6F][.0000.0167.0002.0A6F] # GURMUKHI DIGIT NINE
+0AEF  ; [.120E.0020.0002.0AEF][.0000.0168.0002.0AEF] # GUJARATI DIGIT NINE
+0B6F  ; [.120E.0020.0002.0B6F][.0000.0169.0002.0B6F] # ORIYA DIGIT NINE
+0BEF  ; [.120E.0020.0002.0BEF][.0000.016A.0002.0BEF] # TAMIL DIGIT NINE
+0C6F  ; [.120E.0020.0002.0C6F][.0000.016B.0002.0C6F] # TELUGU DIGIT NINE
+0CEF  ; [.120E.0020.0002.0CEF][.0000.016C.0002.0CEF] # KANNADA DIGIT NINE
+0D6F  ; [.120E.0020.0002.0D6F][.0000.016D.0002.0D6F] # MALAYALAM DIGIT NINE
+ABF9  ; [.120E.0020.0002.ABF9][.0000.016E.0002.ABF9] # MEETEI MAYEK DIGIT NINE
+A8D9  ; [.120E.0020.0002.A8D9][.0000.016F.0002.A8D9] # SAURASHTRA DIGIT NINE
+194F  ; [.120E.0020.0002.194F][.0000.0170.0002.194F] # LIMBU DIGIT NINE
+19D9  ; [.120E.0020.0002.19D9][.0000.0171.0002.19D9] # NEW TAI LUE DIGIT NINE
+1A89  ; [.120E.0020.0002.1A89][.0000.0173.0002.1A89] # TAI THAM HORA DIGIT NINE
+1A99  ; [.120E.0020.0002.1A99][.0000.0174.0002.1A99] # TAI THAM THAM DIGIT NINE
+0E59  ; [.120E.0020.0002.0E59][.0000.0175.0002.0E59] # THAI DIGIT NINE
+0ED9  ; [.120E.0020.0002.0ED9][.0000.0176.0002.0ED9] # LAO DIGIT NINE
+0F29  ; [.120E.0020.0002.0F29][.0000.0177.0002.0F29] # TIBETAN DIGIT NINE
+0F32  ; [.120E.0020.0004.0F32][.0000.0177.0004.0F32] # TIBETAN DIGIT HALF NINE; QQK
+1C49  ; [.120E.0020.0002.1C49][.0000.0178.0002.1C49] # LEPCHA DIGIT NINE
+A909  ; [.120E.0020.0002.A909][.0000.0179.0002.A909] # KAYAH LI DIGIT NINE
+1049  ; [.120E.0020.0002.1049][.0000.017A.0002.1049] # MYANMAR DIGIT NINE
+1099  ; [.120E.0020.0002.1099][.0000.017B.0002.1099] # MYANMAR SHAN DIGIT NINE
+17E9  ; [.120E.0020.0002.17E9][.0000.017C.0002.17E9] # KHMER DIGIT NINE
+17F9  ; [.120E.0020.0002.17F9][.0000.017D.0002.17F9] # KHMER SYMBOL LEK ATTAK PRAM-BUON
+AA59  ; [.120E.0020.0002.AA59][.0000.017E.0002.AA59] # CHAM DIGIT NINE
+1B59  ; [.120E.0020.0002.1B59][.0000.017F.0002.1B59] # BALINESE DIGIT NINE
+A9D9  ; [.120E.0020.0002.A9D9][.0000.0180.0002.A9D9] # JAVANESE DIGIT NINE
+1BB9  ; [.120E.0020.0002.1BB9][.0000.0181.0002.1BB9] # SUNDANESE DIGIT NINE
+1819  ; [.120E.0020.0002.1819][.0000.0182.0002.1819] # MONGOLIAN DIGIT NINE
+1C59  ; [.120E.0020.0002.1C59][.0000.0183.0002.1C59] # OL CHIKI DIGIT NINE
+A629  ; [.120E.0020.0002.A629][.0000.0184.0002.A629] # VAI DIGIT NINE
+3029  ; [.120E.0020.0002.3029][.0000.0185.0002.3029] # HANGZHOU NUMERAL NINE
+1010F ; [.120E.0020.0002.1010F][.0000.0186.0002.1010F] # AEGEAN NUMBER NINE
+12407 ; [.120E.0020.0002.12407][.0000.018B.0002.12407] # CUNEIFORM NUMERIC SIGN NINE ASH
+1240E ; [.120E.0020.0002.1240E][.0000.018B.0002.1240E] # CUNEIFORM NUMERIC SIGN NINE DISH
+12414 ; [.120E.0020.0002.12414][.0000.018B.0002.12414] # CUNEIFORM NUMERIC SIGN NINE U
+1241D ; [.120E.0020.0002.1241D][.0000.018B.0002.1241D] # CUNEIFORM NUMERIC SIGN NINE GESH2
+1242B ; [.120E.0020.0002.1242B][.0000.018B.0002.1242B] # CUNEIFORM NUMERIC SIGN NINE SHAR2
+12446 ; [.120E.0020.0002.12446][.0000.018B.0002.12446] # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU
+12447 ; [.120E.0020.0002.12447][.0000.018B.0002.12447] # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3
+12448 ; [.120E.0020.0002.12448][.0000.018B.0002.12448] # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4
+12449 ; [.120E.0020.0002.12449][.0000.018B.0002.12449] # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A
+1D368 ; [.120E.0020.0002.1D368][.0000.0192.0002.1D368] # COUNTING ROD UNIT DIGIT NINE
+33E8  ; [.120E.0020.0004.33E8][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE; QQKN
+32C8  ; [.120E.0020.0004.32C8][.FB40.0020.0004.6708][.E708.0000.0000.6708] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER; QQKN
+3361  ; [.120E.0020.0004.3361][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE; QQKN
+0061  ; [.120F.0020.0002.0061] # LATIN SMALL LETTER A
+FF41  ; [.120F.0020.0003.FF41] # FULLWIDTH LATIN SMALL LETTER A; QQK
+0363  ; [.120F.0020.0004.0363] # COMBINING LATIN SMALL LETTER A; QQK
+249C  ; [*02FF.0020.0004.249C][.120F.0020.0004.249C][*0300.0020.001F.249C] # PARENTHESIZED LATIN SMALL LETTER A; QQKN
+1D41A ; [.120F.0020.0005.1D41A] # MATHEMATICAL BOLD SMALL A; QQK
+1D44E ; [.120F.0020.0005.1D44E] # MATHEMATICAL ITALIC SMALL A; QQK
+1D482 ; [.120F.0020.0005.1D482] # MATHEMATICAL BOLD ITALIC SMALL A; QQK
+1D4B6 ; [.120F.0020.0005.1D4B6] # MATHEMATICAL SCRIPT SMALL A; QQK
+1D4EA ; [.120F.0020.0005.1D4EA] # MATHEMATICAL BOLD SCRIPT SMALL A; QQK
+1D51E ; [.120F.0020.0005.1D51E] # MATHEMATICAL FRAKTUR SMALL A; QQK
+1D552 ; [.120F.0020.0005.1D552] # MATHEMATICAL DOUBLE-STRUCK SMALL A; QQK
+1D586 ; [.120F.0020.0005.1D586] # MATHEMATICAL BOLD FRAKTUR SMALL A; QQK
+1D5BA ; [.120F.0020.0005.1D5BA] # MATHEMATICAL SANS-SERIF SMALL A; QQK
+1D5EE ; [.120F.0020.0005.1D5EE] # MATHEMATICAL SANS-SERIF BOLD SMALL A; QQK
+1D622 ; [.120F.0020.0005.1D622] # MATHEMATICAL SANS-SERIF ITALIC SMALL A; QQK
+1D656 ; [.120F.0020.0005.1D656] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A; QQK
+1D68A ; [.120F.0020.0005.1D68A] # MATHEMATICAL MONOSPACE SMALL A; QQK
+24D0  ; [.120F.0020.0006.24D0] # CIRCLED LATIN SMALL LETTER A; QQK
+0041  ; [.120F.0020.0008.0041] # LATIN CAPITAL LETTER A
+FF21  ; [.120F.0020.0009.FF21] # FULLWIDTH LATIN CAPITAL LETTER A; QQK
+1F110 ; [*02FF.0020.0004.1F110][.120F.0020.000A.1F110][*0300.0020.001F.1F110] # PARENTHESIZED LATIN CAPITAL LETTER A; QQKN
+1D400 ; [.120F.0020.000B.1D400] # MATHEMATICAL BOLD CAPITAL A; QQK
+1D434 ; [.120F.0020.000B.1D434] # MATHEMATICAL ITALIC CAPITAL A; QQK
+1D468 ; [.120F.0020.000B.1D468] # MATHEMATICAL BOLD ITALIC CAPITAL A; QQK
+1D49C ; [.120F.0020.000B.1D49C] # MATHEMATICAL SCRIPT CAPITAL A; QQK
+1D4D0 ; [.120F.0020.000B.1D4D0] # MATHEMATICAL BOLD SCRIPT CAPITAL A; QQK
+1D504 ; [.120F.0020.000B.1D504] # MATHEMATICAL FRAKTUR CAPITAL A; QQK
+1D538 ; [.120F.0020.000B.1D538] # MATHEMATICAL DOUBLE-STRUCK CAPITAL A; QQK
+1D56C ; [.120F.0020.000B.1D56C] # MATHEMATICAL BOLD FRAKTUR CAPITAL A; QQK
+1D5A0 ; [.120F.0020.000B.1D5A0] # MATHEMATICAL SANS-SERIF CAPITAL A; QQK
+1D5D4 ; [.120F.0020.000B.1D5D4] # MATHEMATICAL SANS-SERIF BOLD CAPITAL A; QQK
+1D608 ; [.120F.0020.000B.1D608] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL A; QQK
+1D63C ; [.120F.0020.000B.1D63C] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A; QQK
+1D670 ; [.120F.0020.000B.1D670] # MATHEMATICAL MONOSPACE CAPITAL A; QQK
+24B6  ; [.120F.0020.000C.24B6] # CIRCLED LATIN CAPITAL LETTER A; QQK
+00AA  ; [.120F.0020.0014.00AA] # FEMININE ORDINAL INDICATOR; QQK
+1D43  ; [.120F.0020.0014.1D43] # MODIFIER LETTER SMALL A; QQK
+2090  ; [.120F.0020.0015.2090] # LATIN SUBSCRIPT SMALL LETTER A; QQK
+1D2C  ; [.120F.0020.001D.1D2C] # MODIFIER LETTER CAPITAL A; QQK
+00E1  ; [.120F.0020.0002.0061][.0000.0032.0002.0301] # LATIN SMALL LETTER A WITH ACUTE; QQCM
+00C1  ; [.120F.0020.0008.0041][.0000.0032.0002.0301] # LATIN CAPITAL LETTER A WITH ACUTE; QQCM
+00E0  ; [.120F.0020.0002.0061][.0000.0035.0002.0300] # LATIN SMALL LETTER A WITH GRAVE; QQCM
+00C0  ; [.120F.0020.0008.0041][.0000.0035.0002.0300] # LATIN CAPITAL LETTER A WITH GRAVE; QQCM
+0103  ; [.120F.0020.0002.0061][.0000.0037.0002.0306] # LATIN SMALL LETTER A WITH BREVE; QQCM
+0102  ; [.120F.0020.0008.0041][.0000.0037.0002.0306] # LATIN CAPITAL LETTER A WITH BREVE; QQCM
+1EAF  ; [.120F.0020.0002.0061][.0000.0037.0002.0306][.0000.0032.0002.0301] # LATIN SMALL LETTER A WITH BREVE AND ACUTE; QQCM
+1EAE  ; [.120F.0020.0008.0041][.0000.0037.0002.0306][.0000.0032.0002.0301] # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE; QQCM
+1EB1  ; [.120F.0020.0002.0061][.0000.0037.0002.0306][.0000.0035.0002.0300] # LATIN SMALL LETTER A WITH BREVE AND GRAVE; QQCM
+1EB0  ; [.120F.0020.0008.0041][.0000.0037.0002.0306][.0000.0035.0002.0300] # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE; QQCM
+1EB5  ; [.120F.0020.0002.0061][.0000.0037.0002.0306][.0000.004E.0002.0303] # LATIN SMALL LETTER A WITH BREVE AND TILDE; QQCM
+1EB4  ; [.120F.0020.0008.0041][.0000.0037.0002.0306][.0000.004E.0002.0303] # LATIN CAPITAL LETTER A WITH BREVE AND TILDE; QQCM
+1EB3  ; [.120F.0020.0002.0061][.0000.0037.0002.0306][.0000.0064.0002.0309] # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE; QQCM
+1EB2  ; [.120F.0020.0008.0041][.0000.0037.0002.0306][.0000.0064.0002.0309] # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE; QQCM
+00E2  ; [.120F.0020.0002.0061][.0000.003C.0002.0302] # LATIN SMALL LETTER A WITH CIRCUMFLEX; QQCM
+00C2  ; [.120F.0020.0008.0041][.0000.003C.0002.0302] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX; QQCM
+1EA5  ; [.120F.0020.0002.0061][.0000.003C.0002.0302][.0000.0032.0002.0301] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE; QQCM
+1EA4  ; [.120F.0020.0008.0041][.0000.003C.0002.0302][.0000.0032.0002.0301] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE; QQCM
+1EA7  ; [.120F.0020.0002.0061][.0000.003C.0002.0302][.0000.0035.0002.0300] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE; QQCM
+1EA6  ; [.120F.0020.0008.0041][.0000.003C.0002.0302][.0000.0035.0002.0300] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE; QQCM
+1EAB  ; [.120F.0020.0002.0061][.0000.003C.0002.0302][.0000.004E.0002.0303] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE; QQCM
+1EAA  ; [.120F.0020.0008.0041][.0000.003C.0002.0302][.0000.004E.0002.0303] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE; QQCM
+1EA9  ; [.120F.0020.0002.0061][.0000.003C.0002.0302][.0000.0064.0002.0309] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE; QQCM
+1EA8  ; [.120F.0020.0008.0041][.0000.003C.0002.0302][.0000.0064.0002.0309] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE; QQCM
+01CE  ; [.120F.0020.0002.0061][.0000.0041.0002.030C] # LATIN SMALL LETTER A WITH CARON; QQCM
+01CD  ; [.120F.0020.0008.0041][.0000.0041.0002.030C] # LATIN CAPITAL LETTER A WITH CARON; QQCM
+00E5  ; [.120F.0020.0002.0061][.0000.0043.0002.030A] # LATIN SMALL LETTER A WITH RING ABOVE; QQCM
+00C5  ; [.120F.0020.0008.0041][.0000.0043.0002.030A] # LATIN CAPITAL LETTER A WITH RING ABOVE; QQCM
+212B  ; [.120F.0020.0008.0041][.0000.0043.0002.030A] # ANGSTROM SIGN; QQCM
+01FB  ; [.120F.0020.0002.0061][.0000.0043.0002.030A][.0000.0032.0002.0301] # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE; QQCM
+01FA  ; [.120F.0020.0008.0041][.0000.0043.0002.030A][.0000.0032.0002.0301] # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE; QQCM
+00E4  ; [.120F.0020.0002.0061][.0000.0047.0002.0308] # LATIN SMALL LETTER A WITH DIAERESIS; QQCM
+00C4  ; [.120F.0020.0008.0041][.0000.0047.0002.0308] # LATIN CAPITAL LETTER A WITH DIAERESIS; QQCM
+01DF  ; [.120F.0020.0002.0061][.0000.0047.0002.0308][.0000.005B.0002.0304] # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON; QQCM
+01DE  ; [.120F.0020.0008.0041][.0000.0047.0002.0308][.0000.005B.0002.0304] # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON; QQCM
+00E3  ; [.120F.0020.0002.0061][.0000.004E.0002.0303] # LATIN SMALL LETTER A WITH TILDE; QQCM
+00C3  ; [.120F.0020.0008.0041][.0000.004E.0002.0303] # LATIN CAPITAL LETTER A WITH TILDE; QQCM
+0227  ; [.120F.0020.0002.0061][.0000.0052.0002.0307] # LATIN SMALL LETTER A WITH DOT ABOVE; QQCM
+0226  ; [.120F.0020.0008.0041][.0000.0052.0002.0307] # LATIN CAPITAL LETTER A WITH DOT ABOVE; QQCM
+01E1  ; [.120F.0020.0002.0061][.0000.0052.0002.0307][.0000.005B.0002.0304] # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON; QQCM
+01E0  ; [.120F.0020.0008.0041][.0000.0052.0002.0307][.0000.005B.0002.0304] # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON; QQCM
+0105  ; [.120F.0020.0002.0061][.0000.0059.0002.0328] # LATIN SMALL LETTER A WITH OGONEK; QQCM
+0104  ; [.120F.0020.0008.0041][.0000.0059.0002.0328] # LATIN CAPITAL LETTER A WITH OGONEK; QQCM
+0101  ; [.120F.0020.0002.0061][.0000.005B.0002.0304] # LATIN SMALL LETTER A WITH MACRON; QQCM
+0100  ; [.120F.0020.0008.0041][.0000.005B.0002.0304] # LATIN CAPITAL LETTER A WITH MACRON; QQCM
+1EA3  ; [.120F.0020.0002.0061][.0000.0064.0002.0309] # LATIN SMALL LETTER A WITH HOOK ABOVE; QQCM
+1EA2  ; [.120F.0020.0008.0041][.0000.0064.0002.0309] # LATIN CAPITAL LETTER A WITH HOOK ABOVE; QQCM
+0201  ; [.120F.0020.0002.0061][.0000.0065.0002.030F] # LATIN SMALL LETTER A WITH DOUBLE GRAVE; QQCM
+0200  ; [.120F.0020.0008.0041][.0000.0065.0002.030F] # LATIN CAPITAL LETTER A WITH DOUBLE GRAVE; QQCM
+0203  ; [.120F.0020.0002.0061][.0000.0067.0002.0311] # LATIN SMALL LETTER A WITH INVERTED BREVE; QQCM
+0202  ; [.120F.0020.0008.0041][.0000.0067.0002.0311] # LATIN CAPITAL LETTER A WITH INVERTED BREVE; QQCM
+1EA1  ; [.120F.0020.0002.0061][.0000.0070.0002.0323] # LATIN SMALL LETTER A WITH DOT BELOW; QQCM
+1EA0  ; [.120F.0020.0008.0041][.0000.0070.0002.0323] # LATIN CAPITAL LETTER A WITH DOT BELOW; QQCM
+1EB7  ; [.120F.0020.0002.0061][.0000.0070.0002.0323][.0000.0037.0002.0306] # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW; QQCM
+1EB6  ; [.120F.0020.0008.0041][.0000.0070.0002.0323][.0000.0037.0002.0306] # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW; QQCM
+1EAD  ; [.120F.0020.0002.0061][.0000.0070.0002.0323][.0000.003C.0002.0302] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW; QQCM
+1EAC  ; [.120F.0020.0008.0041][.0000.0070.0002.0323][.0000.003C.0002.0302] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW; QQCM
+1E01  ; [.120F.0020.0002.0061][.0000.0076.0002.0325] # LATIN SMALL LETTER A WITH RING BELOW; QQCM
+1E00  ; [.120F.0020.0008.0041][.0000.0076.0002.0325] # LATIN CAPITAL LETTER A WITH RING BELOW; QQCM
+1DD3  ; [.120F.0020.0004.1DD3][.0000.0159.0004.1DD3] # COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE; QQKN
+A733  ; [.120F.0020.0004.A733][.120F.0020.0004.A733] # LATIN SMALL LETTER AA; QQKN
+A732  ; [.120F.0020.000A.A732][.120F.0020.000A.A732] # LATIN CAPITAL LETTER AA; QQKN
+2100  ; [.120F.0020.0004.2100][*035C.0020.0004.2100][.123D.0020.001F.2100] # ACCOUNT OF; QQKN
+00E6  ; [.120F.0020.0004.00E6][.0000.0159.0004.00E6][.126B.0020.001F.00E6] # LATIN SMALL LETTER AE; QQKN
+1DD4  ; [.120F.0020.0004.1DD4][.0000.0159.0004.1DD4][.126B.0020.001F.1DD4] # COMBINING LATIN SMALL LETTER AE; QQKN
+00C6  ; [.120F.0020.000A.00C6][.0000.0159.0004.00C6][.126B.0020.001F.00C6] # LATIN CAPITAL LETTER AE; QQKN
+1D2D  ; [.120F.0020.0014.1D2D][.0000.0159.0014.1D2D][.126B.0020.001F.1D2D] # MODIFIER LETTER CAPITAL AE; QQKN
+01FD  ; [.120F.0020.0004.01FD][.0000.0159.0004.01FD][.126B.0020.001F.01FD][.0000.0032.0002.01FD] # LATIN SMALL LETTER AE WITH ACUTE; QQKN
+01FC  ; [.120F.0020.000A.01FC][.0000.0159.0004.01FC][.126B.0020.001F.01FC][.0000.0032.0002.01FC] # LATIN CAPITAL LETTER AE WITH ACUTE; QQKN
+01E3  ; [.120F.0020.0004.01E3][.0000.0159.0004.01E3][.126B.0020.001F.01E3][.0000.005B.0002.01E3] # LATIN SMALL LETTER AE WITH MACRON; QQKN
+01E2  ; [.120F.0020.000A.01E2][.0000.0159.0004.01E2][.126B.0020.001F.01E2][.0000.005B.0002.01E2] # LATIN CAPITAL LETTER AE WITH MACRON; QQKN
+33C2  ; [.120F.0020.001C.33C2][*0281.0020.001C.33C2][.135F.0020.001F.33C2][*0281.0020.001F.33C2] # SQUARE AM; QQKN
+33DF  ; [.120F.0020.001D.33DF][*055F.0020.001C.33DF][.135F.0020.001F.33DF] # SQUARE A OVER M; QQKN
+1DD5  ; [.120F.0020.0004.1DD5][.138E.0020.0004.1DD5] # COMBINING LATIN SMALL LETTER AO; QQKN
+A735  ; [.120F.0020.0004.A735][.138E.0020.0004.A735] # LATIN SMALL LETTER AO; QQKN
+A734  ; [.120F.0020.000A.A734][.138E.0020.000A.A734] # LATIN CAPITAL LETTER AO; QQKN
+2101  ; [.120F.0020.0004.2101][*035C.0020.0004.2101][.1410.0020.001F.2101] # ADDRESSED TO THE SUBJECT; QQKN
+A737  ; [.120F.0020.0004.A737][.1453.0020.0004.A737] # LATIN SMALL LETTER AU; QQKN
+A736  ; [.120F.0020.000A.A736][.1453.0020.000A.A736] # LATIN CAPITAL LETTER AU; QQKN
+3373  ; [.120F.0020.001D.3373][.1453.0020.001D.3373] # SQUARE AU; QQKN
+1DD6  ; [.120F.0020.0004.1DD6][.147B.0020.0004.1DD6] # COMBINING LATIN SMALL LETTER AV; QQKN
+A739  ; [.120F.0020.0004.A739][.147B.0020.0004.A739] # LATIN SMALL LETTER AV; QQKN
+A738  ; [.120F.0020.000A.A738][.147B.0020.000A.A738] # LATIN CAPITAL LETTER AV; QQKN
+A73B  ; [.120F.0020.0004.A73B][.0000.0159.0004.A73B][.147B.0020.001F.A73B] # LATIN SMALL LETTER AV WITH HORIZONTAL BAR; QQKN
+A73A  ; [.120F.0020.000A.A73A][.0000.0159.0004.A73A][.147B.0020.001F.A73A] # LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR; QQKN
+A73D  ; [.120F.0020.0004.A73D][.149C.0020.0004.A73D] # LATIN SMALL LETTER AY; QQKN
+A73C  ; [.120F.0020.000A.A73C][.149C.0020.000A.A73C] # LATIN CAPITAL LETTER AY; QQKN
+1E9A  ; [.120F.0020.0004.1E9A][.150D.0020.0004.1E9A] # LATIN SMALL LETTER A WITH RIGHT HALF RING; QQKN
+1D00  ; [.1213.0020.0002.1D00] # LATIN LETTER SMALL CAPITAL A
+2C65  ; [.1214.0020.0002.2C65] # LATIN SMALL LETTER A WITH STROKE
+023A  ; [.1214.0020.0008.023A] # LATIN CAPITAL LETTER A WITH STROKE
+1D8F  ; [.1215.0020.0002.1D8F] # LATIN SMALL LETTER A WITH RETROFLEX HOOK
+1D01  ; [.1216.0020.0002.1D01] # LATIN LETTER SMALL CAPITAL AE
+1D02  ; [.1217.0020.0002.1D02] # LATIN SMALL LETTER TURNED AE
+1D46  ; [.1217.0020.0014.1D46] # MODIFIER LETTER SMALL TURNED AE; QQK
+0250  ; [.1218.0020.0002.0250] # LATIN SMALL LETTER TURNED A
+2C6F  ; [.1218.0020.0008.2C6F] # LATIN CAPITAL LETTER TURNED A
+1D44  ; [.1218.0020.0014.1D44] # MODIFIER LETTER SMALL TURNED A; QQK
+0251  ; [.121C.0020.0002.0251] # LATIN SMALL LETTER ALPHA
+2C6D  ; [.121C.0020.0008.2C6D] # LATIN CAPITAL LETTER ALPHA
+1D45  ; [.121C.0020.0014.1D45] # MODIFIER LETTER SMALL ALPHA; QQK
+1D90  ; [.1220.0020.0002.1D90] # LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK
+0252  ; [.1221.0020.0002.0252] # LATIN SMALL LETTER TURNED ALPHA
+2C70  ; [.1221.0020.0008.2C70] # LATIN CAPITAL LETTER TURNED ALPHA
+1D9B  ; [.1221.0020.0014.1D9B] # MODIFIER LETTER SMALL TURNED ALPHA; QQK
+0062  ; [.1225.0020.0002.0062] # LATIN SMALL LETTER B
+FF42  ; [.1225.0020.0003.FF42] # FULLWIDTH LATIN SMALL LETTER B; QQK
+249D  ; [*02FF.0020.0004.249D][.1225.0020.0004.249D][*0300.0020.001F.249D] # PARENTHESIZED LATIN SMALL LETTER B; QQKN
+1D41B ; [.1225.0020.0005.1D41B] # MATHEMATICAL BOLD SMALL B; QQK
+1D44F ; [.1225.0020.0005.1D44F] # MATHEMATICAL ITALIC SMALL B; QQK
+1D483 ; [.1225.0020.0005.1D483] # MATHEMATICAL BOLD ITALIC SMALL B; QQK
+1D4B7 ; [.1225.0020.0005.1D4B7] # MATHEMATICAL SCRIPT SMALL B; QQK
+1D4EB ; [.1225.0020.0005.1D4EB] # MATHEMATICAL BOLD SCRIPT SMALL B; QQK
+1D51F ; [.1225.0020.0005.1D51F] # MATHEMATICAL FRAKTUR SMALL B; QQK
+1D553 ; [.1225.0020.0005.1D553] # MATHEMATICAL DOUBLE-STRUCK SMALL B; QQK
+1D587 ; [.1225.0020.0005.1D587] # MATHEMATICAL BOLD FRAKTUR SMALL B; QQK
+1D5BB ; [.1225.0020.0005.1D5BB] # MATHEMATICAL SANS-SERIF SMALL B; QQK
+1D5EF ; [.1225.0020.0005.1D5EF] # MATHEMATICAL SANS-SERIF BOLD SMALL B; QQK
+1D623 ; [.1225.0020.0005.1D623] # MATHEMATICAL SANS-SERIF ITALIC SMALL B; QQK
+1D657 ; [.1225.0020.0005.1D657] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B; QQK
+1D68B ; [.1225.0020.0005.1D68B] # MATHEMATICAL MONOSPACE SMALL B; QQK
+24D1  ; [.1225.0020.0006.24D1] # CIRCLED LATIN SMALL LETTER B; QQK
+0042  ; [.1225.0020.0008.0042] # LATIN CAPITAL LETTER B
+FF22  ; [.1225.0020.0009.FF22] # FULLWIDTH LATIN CAPITAL LETTER B; QQK
+1F111 ; [*02FF.0020.0004.1F111][.1225.0020.000A.1F111][*0300.0020.001F.1F111] # PARENTHESIZED LATIN CAPITAL LETTER B; QQKN
+212C  ; [.1225.0020.000B.212C] # SCRIPT CAPITAL B; QQK
+1D401 ; [.1225.0020.000B.1D401] # MATHEMATICAL BOLD CAPITAL B; QQK
+1D435 ; [.1225.0020.000B.1D435] # MATHEMATICAL ITALIC CAPITAL B; QQK
+1D469 ; [.1225.0020.000B.1D469] # MATHEMATICAL BOLD ITALIC CAPITAL B; QQK
+1D4D1 ; [.1225.0020.000B.1D4D1] # MATHEMATICAL BOLD SCRIPT CAPITAL B; QQK
+1D505 ; [.1225.0020.000B.1D505] # MATHEMATICAL FRAKTUR CAPITAL B; QQK
+1D539 ; [.1225.0020.000B.1D539] # MATHEMATICAL DOUBLE-STRUCK CAPITAL B; QQK
+1D56D ; [.1225.0020.000B.1D56D] # MATHEMATICAL BOLD FRAKTUR CAPITAL B; QQK
+1D5A1 ; [.1225.0020.000B.1D5A1] # MATHEMATICAL SANS-SERIF CAPITAL B; QQK
+1D5D5 ; [.1225.0020.000B.1D5D5] # MATHEMATICAL SANS-SERIF BOLD CAPITAL B; QQK
+1D609 ; [.1225.0020.000B.1D609] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL B; QQK
+1D63D ; [.1225.0020.000B.1D63D] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B; QQK
+1D671 ; [.1225.0020.000B.1D671] # MATHEMATICAL MONOSPACE CAPITAL B; QQK
+24B7  ; [.1225.0020.000C.24B7] # CIRCLED LATIN CAPITAL LETTER B; QQK
+1D47  ; [.1225.0020.0014.1D47] # MODIFIER LETTER SMALL B; QQK
+1D2E  ; [.1225.0020.001D.1D2E] # MODIFIER LETTER CAPITAL B; QQK
+1F131 ; [.1225.0020.001D.1F131] # SQUARED LATIN CAPITAL LETTER B; QQK
+1E03  ; [.1225.0020.0002.0062][.0000.0052.0002.0307] # LATIN SMALL LETTER B WITH DOT ABOVE; QQCM
+1E02  ; [.1225.0020.0008.0042][.0000.0052.0002.0307] # LATIN CAPITAL LETTER B WITH DOT ABOVE; QQCM
+1E05  ; [.1225.0020.0002.0062][.0000.0070.0002.0323] # LATIN SMALL LETTER B WITH DOT BELOW; QQCM
+1E04  ; [.1225.0020.0008.0042][.0000.0070.0002.0323] # LATIN CAPITAL LETTER B WITH DOT BELOW; QQCM
+1E07  ; [.1225.0020.0002.0062][.0000.007B.0002.0331] # LATIN SMALL LETTER B WITH LINE BELOW; QQCM
+1E06  ; [.1225.0020.0008.0042][.0000.007B.0002.0331] # LATIN CAPITAL LETTER B WITH LINE BELOW; QQCM
+3374  ; [.1225.0020.001C.3374][.120F.0020.001C.3374][.13DA.0020.001F.3374] # SQUARE BAR; QQKN
+33C3  ; [.1225.0020.001D.33C3][.13C8.0020.001C.33C3] # SQUARE BQ; QQKN
+0299  ; [.1229.0020.0002.0299] # LATIN LETTER SMALL CAPITAL B
+0180  ; [.122D.0020.0002.0180] # LATIN SMALL LETTER B WITH STROKE
+0243  ; [.122D.0020.0008.0243] # LATIN CAPITAL LETTER B WITH STROKE
+1D2F  ; [.1231.0020.0002.1D2F] # MODIFIER LETTER CAPITAL BARRED B
+1D03  ; [.1232.0020.0002.1D03] # LATIN LETTER SMALL CAPITAL BARRED B
+1D6C  ; [.1233.0020.0002.1D6C] # LATIN SMALL LETTER B WITH MIDDLE TILDE
+1D80  ; [.1234.0020.0002.1D80] # LATIN SMALL LETTER B WITH PALATAL HOOK
+0253  ; [.1235.0020.0002.0253] # LATIN SMALL LETTER B WITH HOOK
+0181  ; [.1235.0020.0008.0181] # LATIN CAPITAL LETTER B WITH HOOK
+0183  ; [.1239.0020.0002.0183] # LATIN SMALL LETTER B WITH TOPBAR
+0182  ; [.1239.0020.0008.0182] # LATIN CAPITAL LETTER B WITH TOPBAR
+0063  ; [.123D.0020.0002.0063] # LATIN SMALL LETTER C
+FF43  ; [.123D.0020.0003.FF43] # FULLWIDTH LATIN SMALL LETTER C; QQK
+0368  ; [.123D.0020.0004.0368] # COMBINING LATIN SMALL LETTER C; QQK
+217D  ; [.123D.0020.0004.217D] # SMALL ROMAN NUMERAL ONE HUNDRED; QQK
+249E  ; [*02FF.0020.0004.249E][.123D.0020.0004.249E][*0300.0020.001F.249E] # PARENTHESIZED LATIN SMALL LETTER C; QQKN
+1D41C ; [.123D.0020.0005.1D41C] # MATHEMATICAL BOLD SMALL C; QQK
+1D450 ; [.123D.0020.0005.1D450] # MATHEMATICAL ITALIC SMALL C; QQK
+1D484 ; [.123D.0020.0005.1D484] # MATHEMATICAL BOLD ITALIC SMALL C; QQK
+1D4B8 ; [.123D.0020.0005.1D4B8] # MATHEMATICAL SCRIPT SMALL C; QQK
+1D4EC ; [.123D.0020.0005.1D4EC] # MATHEMATICAL BOLD SCRIPT SMALL C; QQK
+1D520 ; [.123D.0020.0005.1D520] # MATHEMATICAL FRAKTUR SMALL C; QQK
+1D554 ; [.123D.0020.0005.1D554] # MATHEMATICAL DOUBLE-STRUCK SMALL C; QQK
+1D588 ; [.123D.0020.0005.1D588] # MATHEMATICAL BOLD FRAKTUR SMALL C; QQK
+1D5BC ; [.123D.0020.0005.1D5BC] # MATHEMATICAL SANS-SERIF SMALL C; QQK
+1D5F0 ; [.123D.0020.0005.1D5F0] # MATHEMATICAL SANS-SERIF BOLD SMALL C; QQK
+1D624 ; [.123D.0020.0005.1D624] # MATHEMATICAL SANS-SERIF ITALIC SMALL C; QQK
+1D658 ; [.123D.0020.0005.1D658] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C; QQK
+1D68C ; [.123D.0020.0005.1D68C] # MATHEMATICAL MONOSPACE SMALL C; QQK
+24D2  ; [.123D.0020.0006.24D2] # CIRCLED LATIN SMALL LETTER C; QQK
+0043  ; [.123D.0020.0008.0043] # LATIN CAPITAL LETTER C
+FF23  ; [.123D.0020.0009.FF23] # FULLWIDTH LATIN CAPITAL LETTER C; QQK
+2103  ; [*044B.0020.0004.2103][.123D.0020.000A.2103] # DEGREE CELSIUS; QQKN
+216D  ; [.123D.0020.000A.216D] # ROMAN NUMERAL ONE HUNDRED; QQK
+1F112 ; [*02FF.0020.0004.1F112][.123D.0020.000A.1F112][*0300.0020.001F.1F112] # PARENTHESIZED LATIN CAPITAL LETTER C; QQKN
+2102  ; [.123D.0020.000B.2102] # DOUBLE-STRUCK CAPITAL C; QQK
+212D  ; [.123D.0020.000B.212D] # BLACK-LETTER CAPITAL C; QQK
+1D402 ; [.123D.0020.000B.1D402] # MATHEMATICAL BOLD CAPITAL C; QQK
+1D436 ; [.123D.0020.000B.1D436] # MATHEMATICAL ITALIC CAPITAL C; QQK
+1D46A ; [.123D.0020.000B.1D46A] # MATHEMATICAL BOLD ITALIC CAPITAL C; QQK
+1D49E ; [.123D.0020.000B.1D49E] # MATHEMATICAL SCRIPT CAPITAL C; QQK
+1D4D2 ; [.123D.0020.000B.1D4D2] # MATHEMATICAL BOLD SCRIPT CAPITAL C; QQK
+1D56E ; [.123D.0020.000B.1D56E] # MATHEMATICAL BOLD FRAKTUR CAPITAL C; QQK
+1D5A2 ; [.123D.0020.000B.1D5A2] # MATHEMATICAL SANS-SERIF CAPITAL C; QQK
+1D5D6 ; [.123D.0020.000B.1D5D6] # MATHEMATICAL SANS-SERIF BOLD CAPITAL C; QQK
+1D60A ; [.123D.0020.000B.1D60A] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL C; QQK
+1D63E ; [.123D.0020.000B.1D63E] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C; QQK
+1D672 ; [.123D.0020.000B.1D672] # MATHEMATICAL MONOSPACE CAPITAL C; QQK
+24B8  ; [.123D.0020.000C.24B8] # CIRCLED LATIN CAPITAL LETTER C; QQK
+1F12B ; [.123D.0020.000C.1F12B] # CIRCLED ITALIC LATIN CAPITAL LETTER C; QQK
+1D9C  ; [.123D.0020.0014.1D9C] # MODIFIER LETTER SMALL C; QQK
+0107  ; [.123D.0020.0002.0063][.0000.0032.0002.0301] # LATIN SMALL LETTER C WITH ACUTE; QQCM
+0106  ; [.123D.0020.0008.0043][.0000.0032.0002.0301] # LATIN CAPITAL LETTER C WITH ACUTE; QQCM
+0109  ; [.123D.0020.0002.0063][.0000.003C.0002.0302] # LATIN SMALL LETTER C WITH CIRCUMFLEX; QQCM
+0108  ; [.123D.0020.0008.0043][.0000.003C.0002.0302] # LATIN CAPITAL LETTER C WITH CIRCUMFLEX; QQCM
+010D  ; [.123D.0020.0002.0063][.0000.0041.0002.030C] # LATIN SMALL LETTER C WITH CARON; QQCM
+010C  ; [.123D.0020.0008.0043][.0000.0041.0002.030C] # LATIN CAPITAL LETTER C WITH CARON; QQCM
+010B  ; [.123D.0020.0002.0063][.0000.0052.0002.0307] # LATIN SMALL LETTER C WITH DOT ABOVE; QQCM
+010A  ; [.123D.0020.0008.0043][.0000.0052.0002.0307] # LATIN CAPITAL LETTER C WITH DOT ABOVE; QQCM
+00E7  ; [.123D.0020.0002.0063][.0000.0056.0002.0327] # LATIN SMALL LETTER C WITH CEDILLA; QQCM
+1DD7  ; [.123D.0020.0004.1DD7][.0000.0056.0004.1DD7] # COMBINING LATIN SMALL LETTER C CEDILLA; QQKN
+00C7  ; [.123D.0020.0008.0043][.0000.0056.0002.0327] # LATIN CAPITAL LETTER C WITH CEDILLA; QQCM
+1E09  ; [.123D.0020.0002.0063][.0000.0056.0002.0327][.0000.0032.0002.0301] # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE; QQCM
+1E08  ; [.123D.0020.0008.0043][.0000.0056.0002.0327][.0000.0032.0002.0301] # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE; QQCM
+3388  ; [.123D.0020.001C.3388][.120F.0020.001C.3388][.1330.0020.001F.3388] # SQUARE CAL; QQKN
+33C4  ; [.123D.0020.001C.33C4][.123D.0020.001C.33C4] # SQUARE CC; QQKN
+1F12D ; [.123D.0020.000C.1F12D][.1250.0020.000C.1F12D] # CIRCLED CD; QQKN
+33C5  ; [.123D.0020.001C.33C5][.1250.0020.001C.33C5] # SQUARE CD; QQKN
+33C6  ; [.123D.0020.001D.33C6][*055F.0020.001C.33C6][.131E.0020.001F.33C6][.12B0.0020.001F.33C6] # SQUARE C OVER KG; QQKN
+339D  ; [.123D.0020.001C.339D][.135F.0020.001C.339D] # SQUARE CM; QQKN
+33A0  ; [.123D.0020.001C.33A0][.135F.0020.001C.33A0][.1207.0020.001F.33A0] # SQUARE CM SQUARED; QQKN
+33A4  ; [.123D.0020.001C.33A4][.135F.0020.001C.33A4][.1208.0020.001F.33A4] # SQUARE CM CUBED; QQKN
+2105  ; [.123D.0020.0004.2105][*035C.0020.0004.2105][.138E.0020.001F.2105] # CARE OF; QQKN
+33C7  ; [.123D.0020.001D.33C7][.138E.0020.001C.33C7][*0281.0020.001F.33C7] # SQUARE CO; QQKN
+2106  ; [.123D.0020.0004.2106][*035C.0020.0004.2106][.1453.0020.001F.2106] # CADA UNA; QQKN
+1D04  ; [.1241.0020.0002.1D04] # LATIN LETTER SMALL CAPITAL C
+023C  ; [.1242.0020.0002.023C] # LATIN SMALL LETTER C WITH STROKE
+023B  ; [.1242.0020.0008.023B] # LATIN CAPITAL LETTER C WITH STROKE
+0188  ; [.1246.0020.0002.0188] # LATIN SMALL LETTER C WITH HOOK
+0187  ; [.1246.0020.0008.0187] # LATIN CAPITAL LETTER C WITH HOOK
+0255  ; [.124A.0020.0002.0255] # LATIN SMALL LETTER C WITH CURL
+1D9D  ; [.124A.0020.0014.1D9D] # MODIFIER LETTER SMALL C WITH CURL; QQK
+2184  ; [.124E.0020.0002.2184] # LATIN SMALL LETTER REVERSED C
+2183  ; [.124E.0020.0008.2183] # ROMAN NUMERAL REVERSED ONE HUNDRED
+A73F  ; [.124F.0020.0002.A73F] # LATIN SMALL LETTER REVERSED C WITH DOT
+A73E  ; [.124F.0020.0008.A73E] # LATIN CAPITAL LETTER REVERSED C WITH DOT
+0064  ; [.1250.0020.0002.0064] # LATIN SMALL LETTER D
+FF44  ; [.1250.0020.0003.FF44] # FULLWIDTH LATIN SMALL LETTER D; QQK
+0369  ; [.1250.0020.0004.0369] # COMBINING LATIN SMALL LETTER D; QQK
+217E  ; [.1250.0020.0004.217E] # SMALL ROMAN NUMERAL FIVE HUNDRED; QQK
+249F  ; [*02FF.0020.0004.249F][.1250.0020.0004.249F][*0300.0020.001F.249F] # PARENTHESIZED LATIN SMALL LETTER D; QQKN
+2146  ; [.1250.0020.0005.2146] # DOUBLE-STRUCK ITALIC SMALL D; QQK
+1D41D ; [.1250.0020.0005.1D41D] # MATHEMATICAL BOLD SMALL D; QQK
+1D451 ; [.1250.0020.0005.1D451] # MATHEMATICAL ITALIC SMALL D; QQK
+1D485 ; [.1250.0020.0005.1D485] # MATHEMATICAL BOLD ITALIC SMALL D; QQK
+1D4B9 ; [.1250.0020.0005.1D4B9] # MATHEMATICAL SCRIPT SMALL D; QQK
+1D4ED ; [.1250.0020.0005.1D4ED] # MATHEMATICAL BOLD SCRIPT SMALL D; QQK
+1D521 ; [.1250.0020.0005.1D521] # MATHEMATICAL FRAKTUR SMALL D; QQK
+1D555 ; [.1250.0020.0005.1D555] # MATHEMATICAL DOUBLE-STRUCK SMALL D; QQK
+1D589 ; [.1250.0020.0005.1D589] # MATHEMATICAL BOLD FRAKTUR SMALL D; QQK
+1D5BD ; [.1250.0020.0005.1D5BD] # MATHEMATICAL SANS-SERIF SMALL D; QQK
+1D5F1 ; [.1250.0020.0005.1D5F1] # MATHEMATICAL SANS-SERIF BOLD SMALL D; QQK
+1D625 ; [.1250.0020.0005.1D625] # MATHEMATICAL SANS-SERIF ITALIC SMALL D; QQK
+1D659 ; [.1250.0020.0005.1D659] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D; QQK
+1D68D ; [.1250.0020.0005.1D68D] # MATHEMATICAL MONOSPACE SMALL D; QQK
+24D3  ; [.1250.0020.0006.24D3] # CIRCLED LATIN SMALL LETTER D; QQK
+0044  ; [.1250.0020.0008.0044] # LATIN CAPITAL LETTER D
+FF24  ; [.1250.0020.0009.FF24] # FULLWIDTH LATIN CAPITAL LETTER D; QQK
+216E  ; [.1250.0020.000A.216E] # ROMAN NUMERAL FIVE HUNDRED; QQK
+1F113 ; [*02FF.0020.0004.1F113][.1250.0020.000A.1F113][*0300.0020.001F.1F113] # PARENTHESIZED LATIN CAPITAL LETTER D; QQKN
+2145  ; [.1250.0020.000B.2145] # DOUBLE-STRUCK ITALIC CAPITAL D; QQK
+1D403 ; [.1250.0020.000B.1D403] # MATHEMATICAL BOLD CAPITAL D; QQK
+1D437 ; [.1250.0020.000B.1D437] # MATHEMATICAL ITALIC CAPITAL D; QQK
+1D46B ; [.1250.0020.000B.1D46B] # MATHEMATICAL BOLD ITALIC CAPITAL D; QQK
+1D49F ; [.1250.0020.000B.1D49F] # MATHEMATICAL SCRIPT CAPITAL D; QQK
+1D4D3 ; [.1250.0020.000B.1D4D3] # MATHEMATICAL BOLD SCRIPT CAPITAL D; QQK
+1D507 ; [.1250.0020.000B.1D507] # MATHEMATICAL FRAKTUR CAPITAL D; QQK
+1D53B ; [.1250.0020.000B.1D53B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL D; QQK
+1D56F ; [.1250.0020.000B.1D56F] # MATHEMATICAL BOLD FRAKTUR CAPITAL D; QQK
+1D5A3 ; [.1250.0020.000B.1D5A3] # MATHEMATICAL SANS-SERIF CAPITAL D; QQK
+1D5D7 ; [.1250.0020.000B.1D5D7] # MATHEMATICAL SANS-SERIF BOLD CAPITAL D; QQK
+1D60B ; [.1250.0020.000B.1D60B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL D; QQK
+1D63F ; [.1250.0020.000B.1D63F] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D; QQK
+1D673 ; [.1250.0020.000B.1D673] # MATHEMATICAL MONOSPACE CAPITAL D; QQK
+24B9  ; [.1250.0020.000C.24B9] # CIRCLED LATIN CAPITAL LETTER D; QQK
+1D48  ; [.1250.0020.0014.1D48] # MODIFIER LETTER SMALL D; QQK
+1D30  ; [.1250.0020.001D.1D30] # MODIFIER LETTER CAPITAL D; QQK
+010F  ; [.1250.0020.0002.0064][.0000.0041.0002.030C] # LATIN SMALL LETTER D WITH CARON; QQCM
+010E  ; [.1250.0020.0008.0044][.0000.0041.0002.030C] # LATIN CAPITAL LETTER D WITH CARON; QQCM
+1E0B  ; [.1250.0020.0002.0064][.0000.0052.0002.0307] # LATIN SMALL LETTER D WITH DOT ABOVE; QQCM
+1E0A  ; [.1250.0020.0008.0044][.0000.0052.0002.0307] # LATIN CAPITAL LETTER D WITH DOT ABOVE; QQCM
+1E11  ; [.1250.0020.0002.0064][.0000.0056.0002.0327] # LATIN SMALL LETTER D WITH CEDILLA; QQCM
+1E10  ; [.1250.0020.0008.0044][.0000.0056.0002.0327] # LATIN CAPITAL LETTER D WITH CEDILLA; QQCM
+1E0D  ; [.1250.0020.0002.0064][.0000.0070.0002.0323] # LATIN SMALL LETTER D WITH DOT BELOW; QQCM
+1E0C  ; [.1250.0020.0008.0044][.0000.0070.0002.0323] # LATIN CAPITAL LETTER D WITH DOT BELOW; QQCM
+1E13  ; [.1250.0020.0002.0064][.0000.0078.0002.032D] # LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW; QQCM
+1E12  ; [.1250.0020.0008.0044][.0000.0078.0002.032D] # LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW; QQCM
+1E0F  ; [.1250.0020.0002.0064][.0000.007B.0002.0331] # LATIN SMALL LETTER D WITH LINE BELOW; QQCM
+1E0E  ; [.1250.0020.0008.0044][.0000.007B.0002.0331] # LATIN CAPITAL LETTER D WITH LINE BELOW; QQCM
+0111  ; [.1250.0020.0002.0064][.0000.007D.0002.0335] # LATIN SMALL LETTER D WITH STROKE; QQCM
+0110  ; [.1250.0020.0008.0044][.0000.007D.0002.0335] # LATIN CAPITAL LETTER D WITH STROKE; QQCM
+00F0  ; [.1250.0020.0004.00F0][.0000.0159.0004.00F0] # LATIN SMALL LETTER ETH; QQKN
+1DD9  ; [.1250.0020.0004.1DD9][.0000.0159.0004.1DD9] # COMBINING LATIN SMALL LETTER ETH; QQKN
+00D0  ; [.1250.0020.000A.00D0][.0000.0159.0004.00D0] # LATIN CAPITAL LETTER ETH; QQKN
+1D9E  ; [.1250.0020.0014.1D9E][.0000.0159.0014.1D9E] # MODIFIER LETTER SMALL ETH; QQKN
+1DD8  ; [.1250.0020.0004.1DD8][.0000.015A.0004.1DD8] # COMBINING LATIN SMALL LETTER INSULAR D; QQKN
+A77A  ; [.1250.0020.0004.A77A][.0000.015A.0004.A77A] # LATIN SMALL LETTER INSULAR D; QQKN
+A779  ; [.1250.0020.000A.A779][.0000.015A.0004.A779] # LATIN CAPITAL LETTER INSULAR D; QQKN
+3372  ; [.1250.0020.001C.3372][.120F.0020.001C.3372] # SQUARE DA; QQKN
+0238  ; [.1250.0020.0004.0238][.1225.0020.0004.0238] # LATIN SMALL LETTER DB DIGRAPH; QQKN
+33C8  ; [.1250.0020.001C.33C8][.1225.0020.001D.33C8] # SQUARE DB; QQKN
+1F190 ; [.1250.0020.001D.1F190][.1305.0020.001D.1F190] # SQUARE DJ; QQKN
+3397  ; [.1250.0020.001C.3397][.1330.0020.001C.3397] # SQUARE DL; QQKN
+3377  ; [.1250.0020.001C.3377][.135F.0020.001C.3377] # SQUARE DM; QQKN
+3378  ; [.1250.0020.001C.3378][.135F.0020.001C.3378][.1207.0020.001F.3378] # SQUARE DM SQUARED; QQKN
+3379  ; [.1250.0020.001C.3379][.135F.0020.001C.3379][.1208.0020.001F.3379] # SQUARE DM CUBED; QQKN
+01F3  ; [.1250.0020.0004.01F3][.14AD.0020.0004.01F3] # LATIN SMALL LETTER DZ; QQKN
+02A3  ; [.1250.0020.0004.02A3][.14AD.0020.0004.02A3] # LATIN SMALL LETTER DZ DIGRAPH; QQKN
+01F2  ; [.1250.0020.000A.01F2][.14AD.0020.0004.01F2] # LATIN CAPITAL LETTER D WITH SMALL LETTER Z; QQKN
+01F1  ; [.1250.0020.000A.01F1][.14AD.0020.000A.01F1] # LATIN CAPITAL LETTER DZ; QQKN
+01C6  ; [.1250.0020.0004.01C6][.14AD.0020.0004.01C6][.0000.0041.001F.01C6] # LATIN SMALL LETTER DZ WITH CARON; QQKN
+01C5  ; [.1250.0020.000A.01C5][.14AD.0020.0004.01C5][.0000.0041.001F.01C5] # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON; QQKN
+01C4  ; [.1250.0020.000A.01C4][.14AD.0020.000A.01C4][.0000.0041.001F.01C4] # LATIN CAPITAL LETTER DZ WITH CARON; QQKN
+02A5  ; [.1250.0020.0004.02A5][.14C0.0020.0004.02A5] # LATIN SMALL LETTER DZ DIGRAPH WITH CURL; QQKN
+02A4  ; [.1250.0020.0004.02A4][.14CA.0020.0004.02A4] # LATIN SMALL LETTER DEZH DIGRAPH; QQKN
+1D05  ; [.1254.0020.0002.1D05] # LATIN LETTER SMALL CAPITAL D
+1D06  ; [.1255.0020.0002.1D06] # LATIN LETTER SMALL CAPITAL ETH
+1D6D  ; [.1256.0020.0002.1D6D] # LATIN SMALL LETTER D WITH MIDDLE TILDE
+1D81  ; [.1257.0020.0002.1D81] # LATIN SMALL LETTER D WITH PALATAL HOOK
+0256  ; [.1258.0020.0002.0256] # LATIN SMALL LETTER D WITH TAIL
+0189  ; [.1258.0020.0008.0189] # LATIN CAPITAL LETTER AFRICAN D
+0257  ; [.125C.0020.0002.0257] # LATIN SMALL LETTER D WITH HOOK
+018A  ; [.125C.0020.0008.018A] # LATIN CAPITAL LETTER D WITH HOOK
+1D91  ; [.1260.0020.0002.1D91] # LATIN SMALL LETTER D WITH HOOK AND TAIL
+018C  ; [.1261.0020.0002.018C] # LATIN SMALL LETTER D WITH TOPBAR
+018B  ; [.1261.0020.0008.018B] # LATIN CAPITAL LETTER D WITH TOPBAR
+0221  ; [.1265.0020.0002.0221] # LATIN SMALL LETTER D WITH CURL
+A771  ; [.1269.0020.0002.A771] # LATIN SMALL LETTER DUM
+1E9F  ; [.126A.0020.0002.1E9F] # LATIN SMALL LETTER DELTA
+0065  ; [.126B.0020.0002.0065] # LATIN SMALL LETTER E
+FF45  ; [.126B.0020.0003.FF45] # FULLWIDTH LATIN SMALL LETTER E; QQK
+0364  ; [.126B.0020.0004.0364] # COMBINING LATIN SMALL LETTER E; QQK
+24A0  ; [*02FF.0020.0004.24A0][.126B.0020.0004.24A0][*0300.0020.001F.24A0] # PARENTHESIZED LATIN SMALL LETTER E; QQKN
+212F  ; [.126B.0020.0005.212F] # SCRIPT SMALL E; QQK
+2147  ; [.126B.0020.0005.2147] # DOUBLE-STRUCK ITALIC SMALL E; QQK
+1D41E ; [.126B.0020.0005.1D41E] # MATHEMATICAL BOLD SMALL E; QQK
+1D452 ; [.126B.0020.0005.1D452] # MATHEMATICAL ITALIC SMALL E; QQK
+1D486 ; [.126B.0020.0005.1D486] # MATHEMATICAL BOLD ITALIC SMALL E; QQK
+1D4EE ; [.126B.0020.0005.1D4EE] # MATHEMATICAL BOLD SCRIPT SMALL E; QQK
+1D522 ; [.126B.0020.0005.1D522] # MATHEMATICAL FRAKTUR SMALL E; QQK
+1D556 ; [.126B.0020.0005.1D556] # MATHEMATICAL DOUBLE-STRUCK SMALL E; QQK
+1D58A ; [.126B.0020.0005.1D58A] # MATHEMATICAL BOLD FRAKTUR SMALL E; QQK
+1D5BE ; [.126B.0020.0005.1D5BE] # MATHEMATICAL SANS-SERIF SMALL E; QQK
+1D5F2 ; [.126B.0020.0005.1D5F2] # MATHEMATICAL SANS-SERIF BOLD SMALL E; QQK
+1D626 ; [.126B.0020.0005.1D626] # MATHEMATICAL SANS-SERIF ITALIC SMALL E; QQK
+1D65A ; [.126B.0020.0005.1D65A] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E; QQK
+1D68E ; [.126B.0020.0005.1D68E] # MATHEMATICAL MONOSPACE SMALL E; QQK
+24D4  ; [.126B.0020.0006.24D4] # CIRCLED LATIN SMALL LETTER E; QQK
+0045  ; [.126B.0020.0008.0045] # LATIN CAPITAL LETTER E
+FF25  ; [.126B.0020.0009.FF25] # FULLWIDTH LATIN CAPITAL LETTER E; QQK
+1F114 ; [*02FF.0020.0004.1F114][.126B.0020.000A.1F114][*0300.0020.001F.1F114] # PARENTHESIZED LATIN CAPITAL LETTER E; QQKN
+2130  ; [.126B.0020.000B.2130] # SCRIPT CAPITAL E; QQK
+1D404 ; [.126B.0020.000B.1D404] # MATHEMATICAL BOLD CAPITAL E; QQK
+1D438 ; [.126B.0020.000B.1D438] # MATHEMATICAL ITALIC CAPITAL E; QQK
+1D46C ; [.126B.0020.000B.1D46C] # MATHEMATICAL BOLD ITALIC CAPITAL E; QQK
+1D4D4 ; [.126B.0020.000B.1D4D4] # MATHEMATICAL BOLD SCRIPT CAPITAL E; QQK
+1D508 ; [.126B.0020.000B.1D508] # MATHEMATICAL FRAKTUR CAPITAL E; QQK
+1D53C ; [.126B.0020.000B.1D53C] # MATHEMATICAL DOUBLE-STRUCK CAPITAL E; QQK
+1D570 ; [.126B.0020.000B.1D570] # MATHEMATICAL BOLD FRAKTUR CAPITAL E; QQK
+1D5A4 ; [.126B.0020.000B.1D5A4] # MATHEMATICAL SANS-SERIF CAPITAL E; QQK
+1D5D8 ; [.126B.0020.000B.1D5D8] # MATHEMATICAL SANS-SERIF BOLD CAPITAL E; QQK
+1D60C ; [.126B.0020.000B.1D60C] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL E; QQK
+1D640 ; [.126B.0020.000B.1D640] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E; QQK
+1D674 ; [.126B.0020.000B.1D674] # MATHEMATICAL MONOSPACE CAPITAL E; QQK
+24BA  ; [.126B.0020.000C.24BA] # CIRCLED LATIN CAPITAL LETTER E; QQK
+1D49  ; [.126B.0020.0014.1D49] # MODIFIER LETTER SMALL E; QQK
+2091  ; [.126B.0020.0015.2091] # LATIN SUBSCRIPT SMALL LETTER E; QQK
+1D31  ; [.126B.0020.001D.1D31] # MODIFIER LETTER CAPITAL E; QQK
+00E9  ; [.126B.0020.0002.0065][.0000.0032.0002.0301] # LATIN SMALL LETTER E WITH ACUTE; QQCM
+00C9  ; [.126B.0020.0008.0045][.0000.0032.0002.0301] # LATIN CAPITAL LETTER E WITH ACUTE; QQCM
+00E8  ; [.126B.0020.0002.0065][.0000.0035.0002.0300] # LATIN SMALL LETTER E WITH GRAVE; QQCM
+00C8  ; [.126B.0020.0008.0045][.0000.0035.0002.0300] # LATIN CAPITAL LETTER E WITH GRAVE; QQCM
+0115  ; [.126B.0020.0002.0065][.0000.0037.0002.0306] # LATIN SMALL LETTER E WITH BREVE; QQCM
+0114  ; [.126B.0020.0008.0045][.0000.0037.0002.0306] # LATIN CAPITAL LETTER E WITH BREVE; QQCM
+00EA  ; [.126B.0020.0002.0065][.0000.003C.0002.0302] # LATIN SMALL LETTER E WITH CIRCUMFLEX; QQCM
+00CA  ; [.126B.0020.0008.0045][.0000.003C.0002.0302] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX; QQCM
+1EBF  ; [.126B.0020.0002.0065][.0000.003C.0002.0302][.0000.0032.0002.0301] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE; QQCM
+1EBE  ; [.126B.0020.0008.0045][.0000.003C.0002.0302][.0000.0032.0002.0301] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE; QQCM
+1EC1  ; [.126B.0020.0002.0065][.0000.003C.0002.0302][.0000.0035.0002.0300] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE; QQCM
+1EC0  ; [.126B.0020.0008.0045][.0000.003C.0002.0302][.0000.0035.0002.0300] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE; QQCM
+1EC5  ; [.126B.0020.0002.0065][.0000.003C.0002.0302][.0000.004E.0002.0303] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE; QQCM
+1EC4  ; [.126B.0020.0008.0045][.0000.003C.0002.0302][.0000.004E.0002.0303] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE; QQCM
+1EC3  ; [.126B.0020.0002.0065][.0000.003C.0002.0302][.0000.0064.0002.0309] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE; QQCM
+1EC2  ; [.126B.0020.0008.0045][.0000.003C.0002.0302][.0000.0064.0002.0309] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE; QQCM
+011B  ; [.126B.0020.0002.0065][.0000.0041.0002.030C] # LATIN SMALL LETTER E WITH CARON; QQCM
+011A  ; [.126B.0020.0008.0045][.0000.0041.0002.030C] # LATIN CAPITAL LETTER E WITH CARON; QQCM
+00EB  ; [.126B.0020.0002.0065][.0000.0047.0002.0308] # LATIN SMALL LETTER E WITH DIAERESIS; QQCM
+00CB  ; [.126B.0020.0008.0045][.0000.0047.0002.0308] # LATIN CAPITAL LETTER E WITH DIAERESIS; QQCM
+1EBD  ; [.126B.0020.0002.0065][.0000.004E.0002.0303] # LATIN SMALL LETTER E WITH TILDE; QQCM
+1EBC  ; [.126B.0020.0008.0045][.0000.004E.0002.0303] # LATIN CAPITAL LETTER E WITH TILDE; QQCM
+0117  ; [.126B.0020.0002.0065][.0000.0052.0002.0307] # LATIN SMALL LETTER E WITH DOT ABOVE; QQCM
+0116  ; [.126B.0020.0008.0045][.0000.0052.0002.0307] # LATIN CAPITAL LETTER E WITH DOT ABOVE; QQCM
+0229  ; [.126B.0020.0002.0065][.0000.0056.0002.0327] # LATIN SMALL LETTER E WITH CEDILLA; QQCM
+0228  ; [.126B.0020.0008.0045][.0000.0056.0002.0327] # LATIN CAPITAL LETTER E WITH CEDILLA; QQCM
+1E1D  ; [.126B.0020.0002.0065][.0000.0056.0002.0327][.0000.0037.0002.0306] # LATIN SMALL LETTER E WITH CEDILLA AND BREVE; QQCM
+1E1C  ; [.126B.0020.0008.0045][.0000.0056.0002.0327][.0000.0037.0002.0306] # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE; QQCM
+0119  ; [.126B.0020.0002.0065][.0000.0059.0002.0328] # LATIN SMALL LETTER E WITH OGONEK; QQCM
+0118  ; [.126B.0020.0008.0045][.0000.0059.0002.0328] # LATIN CAPITAL LETTER E WITH OGONEK; QQCM
+0113  ; [.126B.0020.0002.0065][.0000.005B.0002.0304] # LATIN SMALL LETTER E WITH MACRON; QQCM
+0112  ; [.126B.0020.0008.0045][.0000.005B.0002.0304] # LATIN CAPITAL LETTER E WITH MACRON; QQCM
+1E17  ; [.126B.0020.0002.0065][.0000.005B.0002.0304][.0000.0032.0002.0301] # LATIN SMALL LETTER E WITH MACRON AND ACUTE; QQCM
+1E16  ; [.126B.0020.0008.0045][.0000.005B.0002.0304][.0000.0032.0002.0301] # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE; QQCM
+1E15  ; [.126B.0020.0002.0065][.0000.005B.0002.0304][.0000.0035.0002.0300] # LATIN SMALL LETTER E WITH MACRON AND GRAVE; QQCM
+1E14  ; [.126B.0020.0008.0045][.0000.005B.0002.0304][.0000.0035.0002.0300] # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE; QQCM
+1EBB  ; [.126B.0020.0002.0065][.0000.0064.0002.0309] # LATIN SMALL LETTER E WITH HOOK ABOVE; QQCM
+1EBA  ; [.126B.0020.0008.0045][.0000.0064.0002.0309] # LATIN CAPITAL LETTER E WITH HOOK ABOVE; QQCM
+0205  ; [.126B.0020.0002.0065][.0000.0065.0002.030F] # LATIN SMALL LETTER E WITH DOUBLE GRAVE; QQCM
+0204  ; [.126B.0020.0008.0045][.0000.0065.0002.030F] # LATIN CAPITAL LETTER E WITH DOUBLE GRAVE; QQCM
+0207  ; [.126B.0020.0002.0065][.0000.0067.0002.0311] # LATIN SMALL LETTER E WITH INVERTED BREVE; QQCM
+0206  ; [.126B.0020.0008.0045][.0000.0067.0002.0311] # LATIN CAPITAL LETTER E WITH INVERTED BREVE; QQCM
+1EB9  ; [.126B.0020.0002.0065][.0000.0070.0002.0323] # LATIN SMALL LETTER E WITH DOT BELOW; QQCM
+1EB8  ; [.126B.0020.0008.0045][.0000.0070.0002.0323] # LATIN CAPITAL LETTER E WITH DOT BELOW; QQCM
+1EC7  ; [.126B.0020.0002.0065][.0000.0070.0002.0323][.0000.003C.0002.0302] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW; QQCM
+1EC6  ; [.126B.0020.0008.0045][.0000.0070.0002.0323][.0000.003C.0002.0302] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW; QQCM
+1E19  ; [.126B.0020.0002.0065][.0000.0078.0002.032D] # LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW; QQCM
+1E18  ; [.126B.0020.0008.0045][.0000.0078.0002.032D] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW; QQCM
+1E1B  ; [.126B.0020.0002.0065][.0000.007A.0002.0330] # LATIN SMALL LETTER E WITH TILDE BELOW; QQCM
+1E1A  ; [.126B.0020.0008.0045][.0000.007A.0002.0330] # LATIN CAPITAL LETTER E WITH TILDE BELOW; QQCM
+32CD  ; [.126B.0020.001C.32CD][.13DA.0020.001C.32CD][.12B0.0020.001F.32CD] # SQUARE ERG; QQKN
+32CE  ; [.126B.0020.001C.32CE][.147B.0020.001D.32CE] # SQUARE EV; QQKN
+1D07  ; [.126F.0020.0002.1D07] # LATIN LETTER SMALL CAPITAL E
+0247  ; [.1270.0020.0002.0247] # LATIN SMALL LETTER E WITH STROKE
+0246  ; [.1270.0020.0008.0246] # LATIN CAPITAL LETTER E WITH STROKE
+1D92  ; [.1274.0020.0002.1D92] # LATIN SMALL LETTER E WITH RETROFLEX HOOK
+2C78  ; [.1275.0020.0002.2C78] # LATIN SMALL LETTER E WITH NOTCH
+01DD  ; [.1276.0020.0002.01DD] # LATIN SMALL LETTER TURNED E
+018E  ; [.1276.0020.0008.018E] # LATIN CAPITAL LETTER REVERSED E
+1D32  ; [.1276.0020.001D.1D32] # MODIFIER LETTER CAPITAL REVERSED E; QQK
+2C7B  ; [.127A.0020.0002.2C7B] # LATIN LETTER SMALL CAPITAL TURNED E
+0259  ; [.127B.0020.0002.0259] # LATIN SMALL LETTER SCHWA
+018F  ; [.127B.0020.0008.018F] # LATIN CAPITAL LETTER SCHWA
+1D4A  ; [.127B.0020.0014.1D4A] # MODIFIER LETTER SMALL SCHWA; QQK
+2094  ; [.127B.0020.0015.2094] # LATIN SUBSCRIPT SMALL LETTER SCHWA; QQK
+1D95  ; [.127F.0020.0002.1D95] # LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK
+025B  ; [.1280.0020.0002.025B] # LATIN SMALL LETTER OPEN E
+0190  ; [.1280.0020.0008.0190] # LATIN CAPITAL LETTER OPEN E
+2107  ; [.1280.0020.000A.2107] # EULER CONSTANT; QQK
+1D4B  ; [.1280.0020.0014.1D4B] # MODIFIER LETTER SMALL OPEN E; QQK
+1D93  ; [.1284.0020.0002.1D93] # LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK
+0258  ; [.1285.0020.0002.0258] # LATIN SMALL LETTER REVERSED E
+025A  ; [.1289.0020.0002.025A] # LATIN SMALL LETTER SCHWA WITH HOOK
+025C  ; [.128D.0020.0002.025C] # LATIN SMALL LETTER REVERSED OPEN E
+1D9F  ; [.128D.0020.0014.1D9F] # MODIFIER LETTER SMALL REVERSED OPEN E; QQK
+1D94  ; [.1291.0020.0002.1D94] # LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK
+1D08  ; [.1292.0020.0002.1D08] # LATIN SMALL LETTER TURNED OPEN E
+1D4C  ; [.1292.0020.0014.1D4C] # MODIFIER LETTER SMALL TURNED OPEN E; QQK
+025D  ; [.1293.0020.0002.025D] # LATIN SMALL LETTER REVERSED OPEN E WITH HOOK
+025E  ; [.1297.0020.0002.025E] # LATIN SMALL LETTER CLOSED REVERSED OPEN E
+029A  ; [.129B.0020.0002.029A] # LATIN SMALL LETTER CLOSED OPEN E
+0264  ; [.129F.0020.0002.0264] # LATIN SMALL LETTER RAMS HORN
+0066  ; [.12A3.0020.0002.0066] # LATIN SMALL LETTER F
+FF46  ; [.12A3.0020.0003.FF46] # FULLWIDTH LATIN SMALL LETTER F; QQK
+24A1  ; [*02FF.0020.0004.24A1][.12A3.0020.0004.24A1][*0300.0020.001F.24A1] # PARENTHESIZED LATIN SMALL LETTER F; QQKN
+1D41F ; [.12A3.0020.0005.1D41F] # MATHEMATICAL BOLD SMALL F; QQK
+1D453 ; [.12A3.0020.0005.1D453] # MATHEMATICAL ITALIC SMALL F; QQK
+1D487 ; [.12A3.0020.0005.1D487] # MATHEMATICAL BOLD ITALIC SMALL F; QQK
+1D4BB ; [.12A3.0020.0005.1D4BB] # MATHEMATICAL SCRIPT SMALL F; QQK
+1D4EF ; [.12A3.0020.0005.1D4EF] # MATHEMATICAL BOLD SCRIPT SMALL F; QQK
+1D523 ; [.12A3.0020.0005.1D523] # MATHEMATICAL FRAKTUR SMALL F; QQK
+1D557 ; [.12A3.0020.0005.1D557] # MATHEMATICAL DOUBLE-STRUCK SMALL F; QQK
+1D58B ; [.12A3.0020.0005.1D58B] # MATHEMATICAL BOLD FRAKTUR SMALL F; QQK
+1D5BF ; [.12A3.0020.0005.1D5BF] # MATHEMATICAL SANS-SERIF SMALL F; QQK
+1D5F3 ; [.12A3.0020.0005.1D5F3] # MATHEMATICAL SANS-SERIF BOLD SMALL F; QQK
+1D627 ; [.12A3.0020.0005.1D627] # MATHEMATICAL SANS-SERIF ITALIC SMALL F; QQK
+1D65B ; [.12A3.0020.0005.1D65B] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F; QQK
+1D68F ; [.12A3.0020.0005.1D68F] # MATHEMATICAL MONOSPACE SMALL F; QQK
+24D5  ; [.12A3.0020.0006.24D5] # CIRCLED LATIN SMALL LETTER F; QQK
+0046  ; [.12A3.0020.0008.0046] # LATIN CAPITAL LETTER F
+FF26  ; [.12A3.0020.0009.FF26] # FULLWIDTH LATIN CAPITAL LETTER F; QQK
+2109  ; [*044B.0020.0004.2109][.12A3.0020.000A.2109] # DEGREE FAHRENHEIT; QQKN
+1F115 ; [*02FF.0020.0004.1F115][.12A3.0020.000A.1F115][*0300.0020.001F.1F115] # PARENTHESIZED LATIN CAPITAL LETTER F; QQKN
+2131  ; [.12A3.0020.000B.2131] # SCRIPT CAPITAL F; QQK
+1D405 ; [.12A3.0020.000B.1D405] # MATHEMATICAL BOLD CAPITAL F; QQK
+1D439 ; [.12A3.0020.000B.1D439] # MATHEMATICAL ITALIC CAPITAL F; QQK
+1D46D ; [.12A3.0020.000B.1D46D] # MATHEMATICAL BOLD ITALIC CAPITAL F; QQK
+1D4D5 ; [.12A3.0020.000B.1D4D5] # MATHEMATICAL BOLD SCRIPT CAPITAL F; QQK
+1D509 ; [.12A3.0020.000B.1D509] # MATHEMATICAL FRAKTUR CAPITAL F; QQK
+1D53D ; [.12A3.0020.000B.1D53D] # MATHEMATICAL DOUBLE-STRUCK CAPITAL F; QQK
+1D571 ; [.12A3.0020.000B.1D571] # MATHEMATICAL BOLD FRAKTUR CAPITAL F; QQK
+1D5A5 ; [.12A3.0020.000B.1D5A5] # MATHEMATICAL SANS-SERIF CAPITAL F; QQK
+1D5D9 ; [.12A3.0020.000B.1D5D9] # MATHEMATICAL SANS-SERIF BOLD CAPITAL F; QQK
+1D60D ; [.12A3.0020.000B.1D60D] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL F; QQK
+1D641 ; [.12A3.0020.000B.1D641] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F; QQK
+1D675 ; [.12A3.0020.000B.1D675] # MATHEMATICAL MONOSPACE CAPITAL F; QQK
+24BB  ; [.12A3.0020.000C.24BB] # CIRCLED LATIN CAPITAL LETTER F; QQK
+1DA0  ; [.12A3.0020.0014.1DA0] # MODIFIER LETTER SMALL F; QQK
+1E1F  ; [.12A3.0020.0002.0066][.0000.0052.0002.0307] # LATIN SMALL LETTER F WITH DOT ABOVE; QQCM
+1E1E  ; [.12A3.0020.0008.0046][.0000.0052.0002.0307] # LATIN CAPITAL LETTER F WITH DOT ABOVE; QQCM
+A77C  ; [.12A3.0020.0004.A77C][.0000.015A.0004.A77C] # LATIN SMALL LETTER INSULAR F; QQKN
+A77B  ; [.12A3.0020.000A.A77B][.0000.015A.0004.A77B] # LATIN CAPITAL LETTER INSULAR F; QQKN
+213B  ; [.12A3.0020.000A.213B][.120F.0020.000A.213B][.1497.0020.001F.213B] # FACSIMILE SIGN; QQKN
+FB00  ; [.12A3.0020.0004.FB00][.12A3.0020.0004.FB00] # LATIN SMALL LIGATURE FF; QQKN
+FB03  ; [.12A3.0020.0004.FB03][.12A3.0020.0004.FB03][.12EC.0020.001F.FB03] # LATIN SMALL LIGATURE FFI; QQKN
+FB04  ; [.12A3.0020.0004.FB04][.12A3.0020.0004.FB04][.1330.0020.001F.FB04] # LATIN SMALL LIGATURE FFL; QQKN
+FB01  ; [.12A3.0020.0004.FB01][.12EC.0020.0004.FB01] # LATIN SMALL LIGATURE FI; QQKN
+FB02  ; [.12A3.0020.0004.FB02][.1330.0020.0004.FB02] # LATIN SMALL LIGATURE FL; QQKN
+3399  ; [.12A3.0020.001C.3399][.135F.0020.001C.3399] # SQUARE FM; QQKN
+02A9  ; [.12A3.0020.0004.02A9][.138A.0020.0004.02A9] # LATIN SMALL LETTER FENG DIGRAPH; QQKN
+A730  ; [.12A7.0020.0002.A730] # LATIN LETTER SMALL CAPITAL F
+1D6E  ; [.12A8.0020.0002.1D6E] # LATIN SMALL LETTER F WITH MIDDLE TILDE
+1D82  ; [.12A9.0020.0002.1D82] # LATIN SMALL LETTER F WITH PALATAL HOOK
+0192  ; [.12AA.0020.0002.0192] # LATIN SMALL LETTER F WITH HOOK
+0191  ; [.12AA.0020.0008.0191] # LATIN CAPITAL LETTER F WITH HOOK
+214E  ; [.12AE.0020.0002.214E] # TURNED SMALL F
+2132  ; [.12AE.0020.0008.2132] # TURNED CAPITAL F
+A7FB  ; [.12AF.0020.0002.A7FB] # LATIN EPIGRAPHIC LETTER REVERSED F
+0067  ; [.12B0.0020.0002.0067] # LATIN SMALL LETTER G
+FF47  ; [.12B0.0020.0003.FF47] # FULLWIDTH LATIN SMALL LETTER G; QQK
+1DDA  ; [.12B0.0020.0004.1DDA] # COMBINING LATIN SMALL LETTER G; QQK
+24A2  ; [*02FF.0020.0004.24A2][.12B0.0020.0004.24A2][*0300.0020.001F.24A2] # PARENTHESIZED LATIN SMALL LETTER G; QQKN
+210A  ; [.12B0.0020.0005.210A] # SCRIPT SMALL G; QQK
+1D420 ; [.12B0.0020.0005.1D420] # MATHEMATICAL BOLD SMALL G; QQK
+1D454 ; [.12B0.0020.0005.1D454] # MATHEMATICAL ITALIC SMALL G; QQK
+1D488 ; [.12B0.0020.0005.1D488] # MATHEMATICAL BOLD ITALIC SMALL G; QQK
+1D4F0 ; [.12B0.0020.0005.1D4F0] # MATHEMATICAL BOLD SCRIPT SMALL G; QQK
+1D524 ; [.12B0.0020.0005.1D524] # MATHEMATICAL FRAKTUR SMALL G; QQK
+1D558 ; [.12B0.0020.0005.1D558] # MATHEMATICAL DOUBLE-STRUCK SMALL G; QQK
+1D58C ; [.12B0.0020.0005.1D58C] # MATHEMATICAL BOLD FRAKTUR SMALL G; QQK
+1D5C0 ; [.12B0.0020.0005.1D5C0] # MATHEMATICAL SANS-SERIF SMALL G; QQK
+1D5F4 ; [.12B0.0020.0005.1D5F4] # MATHEMATICAL SANS-SERIF BOLD SMALL G; QQK
+1D628 ; [.12B0.0020.0005.1D628] # MATHEMATICAL SANS-SERIF ITALIC SMALL G; QQK
+1D65C ; [.12B0.0020.0005.1D65C] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G; QQK
+1D690 ; [.12B0.0020.0005.1D690] # MATHEMATICAL MONOSPACE SMALL G; QQK
+24D6  ; [.12B0.0020.0006.24D6] # CIRCLED LATIN SMALL LETTER G; QQK
+0047  ; [.12B0.0020.0008.0047] # LATIN CAPITAL LETTER G
+FF27  ; [.12B0.0020.0009.FF27] # FULLWIDTH LATIN CAPITAL LETTER G; QQK
+1F116 ; [*02FF.0020.0004.1F116][.12B0.0020.000A.1F116][*0300.0020.001F.1F116] # PARENTHESIZED LATIN CAPITAL LETTER G; QQKN
+1D406 ; [.12B0.0020.000B.1D406] # MATHEMATICAL BOLD CAPITAL G; QQK
+1D43A ; [.12B0.0020.000B.1D43A] # MATHEMATICAL ITALIC CAPITAL G; QQK
+1D46E ; [.12B0.0020.000B.1D46E] # MATHEMATICAL BOLD ITALIC CAPITAL G; QQK
+1D4A2 ; [.12B0.0020.000B.1D4A2] # MATHEMATICAL SCRIPT CAPITAL G; QQK
+1D4D6 ; [.12B0.0020.000B.1D4D6] # MATHEMATICAL BOLD SCRIPT CAPITAL G; QQK
+1D50A ; [.12B0.0020.000B.1D50A] # MATHEMATICAL FRAKTUR CAPITAL G; QQK
+1D53E ; [.12B0.0020.000B.1D53E] # MATHEMATICAL DOUBLE-STRUCK CAPITAL G; QQK
+1D572 ; [.12B0.0020.000B.1D572] # MATHEMATICAL BOLD FRAKTUR CAPITAL G; QQK
+1D5A6 ; [.12B0.0020.000B.1D5A6] # MATHEMATICAL SANS-SERIF CAPITAL G; QQK
+1D5DA ; [.12B0.0020.000B.1D5DA] # MATHEMATICAL SANS-SERIF BOLD CAPITAL G; QQK
+1D60E ; [.12B0.0020.000B.1D60E] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL G; QQK
+1D642 ; [.12B0.0020.000B.1D642] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G; QQK
+1D676 ; [.12B0.0020.000B.1D676] # MATHEMATICAL MONOSPACE CAPITAL G; QQK
+24BC  ; [.12B0.0020.000C.24BC] # CIRCLED LATIN CAPITAL LETTER G; QQK
+1D4D  ; [.12B0.0020.0014.1D4D] # MODIFIER LETTER SMALL G; QQK
+1D33  ; [.12B0.0020.001D.1D33] # MODIFIER LETTER CAPITAL G; QQK
+01F5  ; [.12B0.0020.0002.0067][.0000.0032.0002.0301] # LATIN SMALL LETTER G WITH ACUTE; QQCM
+01F4  ; [.12B0.0020.0008.0047][.0000.0032.0002.0301] # LATIN CAPITAL LETTER G WITH ACUTE; QQCM
+011F  ; [.12B0.0020.0002.0067][.0000.0037.0002.0306] # LATIN SMALL LETTER G WITH BREVE; QQCM
+011E  ; [.12B0.0020.0008.0047][.0000.0037.0002.0306] # LATIN CAPITAL LETTER G WITH BREVE; QQCM
+011D  ; [.12B0.0020.0002.0067][.0000.003C.0002.0302] # LATIN SMALL LETTER G WITH CIRCUMFLEX; QQCM
+011C  ; [.12B0.0020.0008.0047][.0000.003C.0002.0302] # LATIN CAPITAL LETTER G WITH CIRCUMFLEX; QQCM
+01E7  ; [.12B0.0020.0002.0067][.0000.0041.0002.030C] # LATIN SMALL LETTER G WITH CARON; QQCM
+01E6  ; [.12B0.0020.0008.0047][.0000.0041.0002.030C] # LATIN CAPITAL LETTER G WITH CARON; QQCM
+0121  ; [.12B0.0020.0002.0067][.0000.0052.0002.0307] # LATIN SMALL LETTER G WITH DOT ABOVE; QQCM
+0120  ; [.12B0.0020.0008.0047][.0000.0052.0002.0307] # LATIN CAPITAL LETTER G WITH DOT ABOVE; QQCM
+0123  ; [.12B0.0020.0002.0067][.0000.0056.0002.0327] # LATIN SMALL LETTER G WITH CEDILLA; QQCM
+0122  ; [.12B0.0020.0008.0047][.0000.0056.0002.0327] # LATIN CAPITAL LETTER G WITH CEDILLA; QQCM
+1E21  ; [.12B0.0020.0002.0067][.0000.005B.0002.0304] # LATIN SMALL LETTER G WITH MACRON; QQCM
+1E20  ; [.12B0.0020.0008.0047][.0000.005B.0002.0304] # LATIN CAPITAL LETTER G WITH MACRON; QQCM
+1D79  ; [.12B0.0020.0004.1D79][.0000.015A.0004.1D79] # LATIN SMALL LETTER INSULAR G; QQKN
+A77D  ; [.12B0.0020.000A.A77D][.0000.015A.0004.A77D] # LATIN CAPITAL LETTER INSULAR G; QQKN
+33FF  ; [.12B0.0020.001C.33FF][.120F.0020.001C.33FF][.1330.0020.001F.33FF] # SQUARE GAL; QQKN
+3387  ; [.12B0.0020.001D.3387][.1225.0020.001D.3387] # SQUARE GB; QQKN
+3393  ; [.12B0.0020.001D.3393][.12D3.0020.001D.3393][.14AD.0020.001F.3393] # SQUARE GHZ; QQKN
+33AC  ; [.12B0.0020.001D.33AC][.13B3.0020.001D.33AC][.120F.0020.001F.33AC] # SQUARE GPA; QQKN
+33C9  ; [.12B0.0020.001D.33C9][.149C.0020.001C.33C9] # SQUARE GY; QQKN
+0261  ; [.12B4.0020.0002.0261] # LATIN SMALL LETTER SCRIPT G
+1DA2  ; [.12B4.0020.0014.1DA2] # MODIFIER LETTER SMALL SCRIPT G; QQK
+0262  ; [.12B8.0020.0002.0262] # LATIN LETTER SMALL CAPITAL G
+1DDB  ; [.12B8.0020.0004.1DDB] # COMBINING LATIN LETTER SMALL CAPITAL G; QQK
+01E5  ; [.12BC.0020.0002.01E5] # LATIN SMALL LETTER G WITH STROKE
+01E4  ; [.12BC.0020.0008.01E4] # LATIN CAPITAL LETTER G WITH STROKE
+1D83  ; [.12C0.0020.0002.1D83] # LATIN SMALL LETTER G WITH PALATAL HOOK
+0260  ; [.12C1.0020.0002.0260] # LATIN SMALL LETTER G WITH HOOK
+0193  ; [.12C1.0020.0008.0193] # LATIN CAPITAL LETTER G WITH HOOK
+029B  ; [.12C5.0020.0002.029B] # LATIN LETTER SMALL CAPITAL G WITH HOOK
+1D77  ; [.12C9.0020.0002.1D77] # LATIN SMALL LETTER TURNED G
+A77F  ; [.12CA.0020.0002.A77F] # LATIN SMALL LETTER TURNED INSULAR G
+A77E  ; [.12CA.0020.0008.A77E] # LATIN CAPITAL LETTER TURNED INSULAR G
+0263  ; [.12CB.0020.0002.0263] # LATIN SMALL LETTER GAMMA
+0194  ; [.12CB.0020.0008.0194] # LATIN CAPITAL LETTER GAMMA
+02E0  ; [.12CB.0020.0014.02E0] # MODIFIER LETTER SMALL GAMMA; QQK
+01A3  ; [.12CF.0020.0002.01A3] # LATIN SMALL LETTER OI
+01A2  ; [.12CF.0020.0008.01A2] # LATIN CAPITAL LETTER OI
+0068  ; [.12D3.0020.0002.0068] # LATIN SMALL LETTER H
+FF48  ; [.12D3.0020.0003.FF48] # FULLWIDTH LATIN SMALL LETTER H; QQK
+036A  ; [.12D3.0020.0004.036A] # COMBINING LATIN SMALL LETTER H; QQK
+24A3  ; [*02FF.0020.0004.24A3][.12D3.0020.0004.24A3][*0300.0020.001F.24A3] # PARENTHESIZED LATIN SMALL LETTER H; QQKN
+210E  ; [.12D3.0020.0005.210E] # PLANCK CONSTANT; QQK
+1D421 ; [.12D3.0020.0005.1D421] # MATHEMATICAL BOLD SMALL H; QQK
+1D489 ; [.12D3.0020.0005.1D489] # MATHEMATICAL BOLD ITALIC SMALL H; QQK
+1D4BD ; [.12D3.0020.0005.1D4BD] # MATHEMATICAL SCRIPT SMALL H; QQK
+1D4F1 ; [.12D3.0020.0005.1D4F1] # MATHEMATICAL BOLD SCRIPT SMALL H; QQK
+1D525 ; [.12D3.0020.0005.1D525] # MATHEMATICAL FRAKTUR SMALL H; QQK
+1D559 ; [.12D3.0020.0005.1D559] # MATHEMATICAL DOUBLE-STRUCK SMALL H; QQK
+1D58D ; [.12D3.0020.0005.1D58D] # MATHEMATICAL BOLD FRAKTUR SMALL H; QQK
+1D5C1 ; [.12D3.0020.0005.1D5C1] # MATHEMATICAL SANS-SERIF SMALL H; QQK
+1D5F5 ; [.12D3.0020.0005.1D5F5] # MATHEMATICAL SANS-SERIF BOLD SMALL H; QQK
+1D629 ; [.12D3.0020.0005.1D629] # MATHEMATICAL SANS-SERIF ITALIC SMALL H; QQK
+1D65D ; [.12D3.0020.0005.1D65D] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H; QQK
+1D691 ; [.12D3.0020.0005.1D691] # MATHEMATICAL MONOSPACE SMALL H; QQK
+24D7  ; [.12D3.0020.0006.24D7] # CIRCLED LATIN SMALL LETTER H; QQK
+0048  ; [.12D3.0020.0008.0048] # LATIN CAPITAL LETTER H
+FF28  ; [.12D3.0020.0009.FF28] # FULLWIDTH LATIN CAPITAL LETTER H; QQK
+1F117 ; [*02FF.0020.0004.1F117][.12D3.0020.000A.1F117][*0300.0020.001F.1F117] # PARENTHESIZED LATIN CAPITAL LETTER H; QQKN
+210B  ; [.12D3.0020.000B.210B] # SCRIPT CAPITAL H; QQK
+210C  ; [.12D3.0020.000B.210C] # BLACK-LETTER CAPITAL H; QQK
+210D  ; [.12D3.0020.000B.210D] # DOUBLE-STRUCK CAPITAL H; QQK
+1D407 ; [.12D3.0020.000B.1D407] # MATHEMATICAL BOLD CAPITAL H; QQK
+1D43B ; [.12D3.0020.000B.1D43B] # MATHEMATICAL ITALIC CAPITAL H; QQK
+1D46F ; [.12D3.0020.000B.1D46F] # MATHEMATICAL BOLD ITALIC CAPITAL H; QQK
+1D4D7 ; [.12D3.0020.000B.1D4D7] # MATHEMATICAL BOLD SCRIPT CAPITAL H; QQK
+1D573 ; [.12D3.0020.000B.1D573] # MATHEMATICAL BOLD FRAKTUR CAPITAL H; QQK
+1D5A7 ; [.12D3.0020.000B.1D5A7] # MATHEMATICAL SANS-SERIF CAPITAL H; QQK
+1D5DB ; [.12D3.0020.000B.1D5DB] # MATHEMATICAL SANS-SERIF BOLD CAPITAL H; QQK
+1D60F ; [.12D3.0020.000B.1D60F] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL H; QQK
+1D643 ; [.12D3.0020.000B.1D643] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H; QQK
+1D677 ; [.12D3.0020.000B.1D677] # MATHEMATICAL MONOSPACE CAPITAL H; QQK
+24BD  ; [.12D3.0020.000C.24BD] # CIRCLED LATIN CAPITAL LETTER H; QQK
+1F157 ; [.12D3.0020.000C.1F157] # NEGATIVE CIRCLED LATIN CAPITAL LETTER H; QQK
+02B0  ; [.12D3.0020.0014.02B0] # MODIFIER LETTER SMALL H; QQK
+1D34  ; [.12D3.0020.001D.1D34] # MODIFIER LETTER CAPITAL H; QQK
+0125  ; [.12D3.0020.0002.0068][.0000.003C.0002.0302] # LATIN SMALL LETTER H WITH CIRCUMFLEX; QQCM
+0124  ; [.12D3.0020.0008.0048][.0000.003C.0002.0302] # LATIN CAPITAL LETTER H WITH CIRCUMFLEX; QQCM
+021F  ; [.12D3.0020.0002.0068][.0000.0041.0002.030C] # LATIN SMALL LETTER H WITH CARON; QQCM
+021E  ; [.12D3.0020.0008.0048][.0000.0041.0002.030C] # LATIN CAPITAL LETTER H WITH CARON; QQCM
+1E27  ; [.12D3.0020.0002.0068][.0000.0047.0002.0308] # LATIN SMALL LETTER H WITH DIAERESIS; QQCM
+1E26  ; [.12D3.0020.0008.0048][.0000.0047.0002.0308] # LATIN CAPITAL LETTER H WITH DIAERESIS; QQCM
+1E23  ; [.12D3.0020.0002.0068][.0000.0052.0002.0307] # LATIN SMALL LETTER H WITH DOT ABOVE; QQCM
+1E22  ; [.12D3.0020.0008.0048][.0000.0052.0002.0307] # LATIN CAPITAL LETTER H WITH DOT ABOVE; QQCM
+1E29  ; [.12D3.0020.0002.0068][.0000.0056.0002.0327] # LATIN SMALL LETTER H WITH CEDILLA; QQCM
+1E28  ; [.12D3.0020.0008.0048][.0000.0056.0002.0327] # LATIN CAPITAL LETTER H WITH CEDILLA; QQCM
+1E25  ; [.12D3.0020.0002.0068][.0000.0070.0002.0323] # LATIN SMALL LETTER H WITH DOT BELOW; QQCM
+1E24  ; [.12D3.0020.0008.0048][.0000.0070.0002.0323] # LATIN CAPITAL LETTER H WITH DOT BELOW; QQCM
+1E2B  ; [.12D3.0020.0002.0068][.0000.0079.0002.032E] # LATIN SMALL LETTER H WITH BREVE BELOW; QQCM
+1E2A  ; [.12D3.0020.0008.0048][.0000.0079.0002.032E] # LATIN CAPITAL LETTER H WITH BREVE BELOW; QQCM
+1E96  ; [.12D3.0020.0002.0068][.0000.007B.0002.0331] # LATIN SMALL LETTER H WITH LINE BELOW; QQCM
+0127  ; [.12D3.0020.0002.0068][.0000.007D.0002.0335] # LATIN SMALL LETTER H WITH STROKE; QQCM
+210F  ; [.12D3.0020.0002.210F][.0000.007D.0002.210F] # PLANCK CONSTANT OVER TWO PI; QQKN
+0126  ; [.12D3.0020.0008.0048][.0000.007D.0002.0335] # LATIN CAPITAL LETTER H WITH STROKE; QQCM
+33CA  ; [.12D3.0020.001C.33CA][.120F.0020.001C.33CA] # SQUARE HA; QQKN
+32CC  ; [.12D3.0020.001D.32CC][.12B0.0020.001C.32CC] # SQUARE HG; QQKN
+33CB  ; [.12D3.0020.001D.33CB][.13B3.0020.001D.33CB] # SQUARE HP; QQKN
+3371  ; [.12D3.0020.001C.3371][.13B3.0020.001D.3371][.120F.0020.001F.3371] # SQUARE HPA; QQKN
+1F14A ; [.12D3.0020.001D.1F14A][.147B.0020.001D.1F14A] # SQUARED HV; QQKN
+3390  ; [.12D3.0020.001D.3390][.14AD.0020.001C.3390] # SQUARE HZ; QQKN
+029C  ; [.12D7.0020.0002.029C] # LATIN LETTER SMALL CAPITAL H
+0195  ; [.12DB.0020.0002.0195] # LATIN SMALL LETTER HV
+01F6  ; [.12DB.0020.0008.01F6] # LATIN CAPITAL LETTER HWAIR
+0266  ; [.12DF.0020.0002.0266] # LATIN SMALL LETTER H WITH HOOK
+02B1  ; [.12DF.0020.0014.02B1] # MODIFIER LETTER SMALL H WITH HOOK; QQK
+2C68  ; [.12E3.0020.0002.2C68] # LATIN SMALL LETTER H WITH DESCENDER
+2C67  ; [.12E3.0020.0008.2C67] # LATIN CAPITAL LETTER H WITH DESCENDER
+2C76  ; [.12E4.0020.0002.2C76] # LATIN SMALL LETTER HALF H
+2C75  ; [.12E4.0020.0008.2C75] # LATIN CAPITAL LETTER HALF H
+A727  ; [.12E5.0020.0002.A727] # LATIN SMALL LETTER HENG
+A726  ; [.12E5.0020.0008.A726] # LATIN CAPITAL LETTER HENG
+0267  ; [.12E6.0020.0002.0267] # LATIN SMALL LETTER HENG WITH HOOK
+02BB  ; [.12EA.0020.0002.02BB] # MODIFIER LETTER TURNED COMMA
+02BD  ; [.12EB.0020.0002.02BD] # MODIFIER LETTER REVERSED COMMA
+0069  ; [.12EC.0020.0002.0069] # LATIN SMALL LETTER I
+FF49  ; [.12EC.0020.0003.FF49] # FULLWIDTH LATIN SMALL LETTER I; QQK
+0365  ; [.12EC.0020.0004.0365] # COMBINING LATIN SMALL LETTER I; QQK
+2170  ; [.12EC.0020.0004.2170] # SMALL ROMAN NUMERAL ONE; QQK
+24A4  ; [*02FF.0020.0004.24A4][.12EC.0020.0004.24A4][*0300.0020.001F.24A4] # PARENTHESIZED LATIN SMALL LETTER I; QQKN
+2139  ; [.12EC.0020.0005.2139] # INFORMATION SOURCE; QQK
+2148  ; [.12EC.0020.0005.2148] # DOUBLE-STRUCK ITALIC SMALL I; QQK
+1D422 ; [.12EC.0020.0005.1D422] # MATHEMATICAL BOLD SMALL I; QQK
+1D456 ; [.12EC.0020.0005.1D456] # MATHEMATICAL ITALIC SMALL I; QQK
+1D48A ; [.12EC.0020.0005.1D48A] # MATHEMATICAL BOLD ITALIC SMALL I; QQK
+1D4BE ; [.12EC.0020.0005.1D4BE] # MATHEMATICAL SCRIPT SMALL I; QQK
+1D4F2 ; [.12EC.0020.0005.1D4F2] # MATHEMATICAL BOLD SCRIPT SMALL I; QQK
+1D526 ; [.12EC.0020.0005.1D526] # MATHEMATICAL FRAKTUR SMALL I; QQK
+1D55A ; [.12EC.0020.0005.1D55A] # MATHEMATICAL DOUBLE-STRUCK SMALL I; QQK
+1D58E ; [.12EC.0020.0005.1D58E] # MATHEMATICAL BOLD FRAKTUR SMALL I; QQK
+1D5C2 ; [.12EC.0020.0005.1D5C2] # MATHEMATICAL SANS-SERIF SMALL I; QQK
+1D5F6 ; [.12EC.0020.0005.1D5F6] # MATHEMATICAL SANS-SERIF BOLD SMALL I; QQK
+1D62A ; [.12EC.0020.0005.1D62A] # MATHEMATICAL SANS-SERIF ITALIC SMALL I; QQK
+1D65E ; [.12EC.0020.0005.1D65E] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I; QQK
+1D692 ; [.12EC.0020.0005.1D692] # MATHEMATICAL MONOSPACE SMALL I; QQK
+24D8  ; [.12EC.0020.0006.24D8] # CIRCLED LATIN SMALL LETTER I; QQK
+0049  ; [.12EC.0020.0008.0049] # LATIN CAPITAL LETTER I
+FF29  ; [.12EC.0020.0009.FF29] # FULLWIDTH LATIN CAPITAL LETTER I; QQK
+2160  ; [.12EC.0020.000A.2160] # ROMAN NUMERAL ONE; QQK
+1F118 ; [*02FF.0020.0004.1F118][.12EC.0020.000A.1F118][*0300.0020.001F.1F118] # PARENTHESIZED LATIN CAPITAL LETTER I; QQKN
+2110  ; [.12EC.0020.000B.2110] # SCRIPT CAPITAL I; QQK
+2111  ; [.12EC.0020.000B.2111] # BLACK-LETTER CAPITAL I; QQK
+1D408 ; [.12EC.0020.000B.1D408] # MATHEMATICAL BOLD CAPITAL I; QQK
+1D43C ; [.12EC.0020.000B.1D43C] # MATHEMATICAL ITALIC CAPITAL I; QQK
+1D470 ; [.12EC.0020.000B.1D470] # MATHEMATICAL BOLD ITALIC CAPITAL I; QQK
+1D4D8 ; [.12EC.0020.000B.1D4D8] # MATHEMATICAL BOLD SCRIPT CAPITAL I; QQK
+1D540 ; [.12EC.0020.000B.1D540] # MATHEMATICAL DOUBLE-STRUCK CAPITAL I; QQK
+1D574 ; [.12EC.0020.000B.1D574] # MATHEMATICAL BOLD FRAKTUR CAPITAL I; QQK
+1D5A8 ; [.12EC.0020.000B.1D5A8] # MATHEMATICAL SANS-SERIF CAPITAL I; QQK
+1D5DC ; [.12EC.0020.000B.1D5DC] # MATHEMATICAL SANS-SERIF BOLD CAPITAL I; QQK
+1D610 ; [.12EC.0020.000B.1D610] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL I; QQK
+1D644 ; [.12EC.0020.000B.1D644] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I; QQK
+1D678 ; [.12EC.0020.000B.1D678] # MATHEMATICAL MONOSPACE CAPITAL I; QQK
+24BE  ; [.12EC.0020.000C.24BE] # CIRCLED LATIN CAPITAL LETTER I; QQK
+2071  ; [.12EC.0020.0014.2071] # SUPERSCRIPT LATIN SMALL LETTER I; QQK
+1D62  ; [.12EC.0020.0015.1D62] # LATIN SUBSCRIPT SMALL LETTER I; QQK
+1D35  ; [.12EC.0020.001D.1D35] # MODIFIER LETTER CAPITAL I; QQK
+00ED  ; [.12EC.0020.0002.0069][.0000.0032.0002.0301] # LATIN SMALL LETTER I WITH ACUTE; QQCM
+00CD  ; [.12EC.0020.0008.0049][.0000.0032.0002.0301] # LATIN CAPITAL LETTER I WITH ACUTE; QQCM
+00EC  ; [.12EC.0020.0002.0069][.0000.0035.0002.0300] # LATIN SMALL LETTER I WITH GRAVE; QQCM
+00CC  ; [.12EC.0020.0008.0049][.0000.0035.0002.0300] # LATIN CAPITAL LETTER I WITH GRAVE; QQCM
+012D  ; [.12EC.0020.0002.0069][.0000.0037.0002.0306] # LATIN SMALL LETTER I WITH BREVE; QQCM
+012C  ; [.12EC.0020.0008.0049][.0000.0037.0002.0306] # LATIN CAPITAL LETTER I WITH BREVE; QQCM
+00EE  ; [.12EC.0020.0002.0069][.0000.003C.0002.0302] # LATIN SMALL LETTER I WITH CIRCUMFLEX; QQCM
+00CE  ; [.12EC.0020.0008.0049][.0000.003C.0002.0302] # LATIN CAPITAL LETTER I WITH CIRCUMFLEX; QQCM
+01D0  ; [.12EC.0020.0002.0069][.0000.0041.0002.030C] # LATIN SMALL LETTER I WITH CARON; QQCM
+01CF  ; [.12EC.0020.0008.0049][.0000.0041.0002.030C] # LATIN CAPITAL LETTER I WITH CARON; QQCM
+00EF  ; [.12EC.0020.0002.0069][.0000.0047.0002.0308] # LATIN SMALL LETTER I WITH DIAERESIS; QQCM
+00CF  ; [.12EC.0020.0008.0049][.0000.0047.0002.0308] # LATIN CAPITAL LETTER I WITH DIAERESIS; QQCM
+1E2F  ; [.12EC.0020.0002.0069][.0000.0047.0002.0308][.0000.0032.0002.0301] # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE; QQCM
+1E2E  ; [.12EC.0020.0008.0049][.0000.0047.0002.0308][.0000.0032.0002.0301] # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE; QQCM
+0129  ; [.12EC.0020.0002.0069][.0000.004E.0002.0303] # LATIN SMALL LETTER I WITH TILDE; QQCM
+0128  ; [.12EC.0020.0008.0049][.0000.004E.0002.0303] # LATIN CAPITAL LETTER I WITH TILDE; QQCM
+0130  ; [.12EC.0020.0008.0049][.0000.0052.0002.0307] # LATIN CAPITAL LETTER I WITH DOT ABOVE; QQCM
+012F  ; [.12EC.0020.0002.0069][.0000.0059.0002.0328] # LATIN SMALL LETTER I WITH OGONEK; QQCM
+012E  ; [.12EC.0020.0008.0049][.0000.0059.0002.0328] # LATIN CAPITAL LETTER I WITH OGONEK; QQCM
+012B  ; [.12EC.0020.0002.0069][.0000.005B.0002.0304] # LATIN SMALL LETTER I WITH MACRON; QQCM
+012A  ; [.12EC.0020.0008.0049][.0000.005B.0002.0304] # LATIN CAPITAL LETTER I WITH MACRON; QQCM
+1EC9  ; [.12EC.0020.0002.0069][.0000.0064.0002.0309] # LATIN SMALL LETTER I WITH HOOK ABOVE; QQCM
+1EC8  ; [.12EC.0020.0008.0049][.0000.0064.0002.0309] # LATIN CAPITAL LETTER I WITH HOOK ABOVE; QQCM
+0209  ; [.12EC.0020.0002.0069][.0000.0065.0002.030F] # LATIN SMALL LETTER I WITH DOUBLE GRAVE; QQCM
+0208  ; [.12EC.0020.0008.0049][.0000.0065.0002.030F] # LATIN CAPITAL LETTER I WITH DOUBLE GRAVE; QQCM
+020B  ; [.12EC.0020.0002.0069][.0000.0067.0002.0311] # LATIN SMALL LETTER I WITH INVERTED BREVE; QQCM
+020A  ; [.12EC.0020.0008.0049][.0000.0067.0002.0311] # LATIN CAPITAL LETTER I WITH INVERTED BREVE; QQCM
+1ECB  ; [.12EC.0020.0002.0069][.0000.0070.0002.0323] # LATIN SMALL LETTER I WITH DOT BELOW; QQCM
+1ECA  ; [.12EC.0020.0008.0049][.0000.0070.0002.0323] # LATIN CAPITAL LETTER I WITH DOT BELOW; QQCM
+1E2D  ; [.12EC.0020.0002.0069][.0000.007A.0002.0330] # LATIN SMALL LETTER I WITH TILDE BELOW; QQCM
+1E2C  ; [.12EC.0020.0008.0049][.0000.007A.0002.0330] # LATIN CAPITAL LETTER I WITH TILDE BELOW; QQCM
+1F18B ; [.12EC.0020.001D.1F18B][.123D.0020.001D.1F18B] # NEGATIVE SQUARED IC; QQKN
+2171  ; [.12EC.0020.0004.2171][.12EC.0020.0004.2171] # SMALL ROMAN NUMERAL TWO; QQKN
+2161  ; [.12EC.0020.000A.2161][.12EC.0020.000A.2161] # ROMAN NUMERAL TWO; QQKN
+2172  ; [.12EC.0020.0004.2172][.12EC.0020.0004.2172][.12EC.0020.001F.2172] # SMALL ROMAN NUMERAL THREE; QQKN
+2162  ; [.12EC.0020.000A.2162][.12EC.0020.000A.2162][.12EC.0020.001F.2162] # ROMAN NUMERAL THREE; QQKN
+0133  ; [.12EC.0020.0004.0133][.1305.0020.0004.0133] # LATIN SMALL LIGATURE IJ; QQKN
+0132  ; [.12EC.0020.000A.0132][.1305.0020.000A.0132] # LATIN CAPITAL LIGATURE IJ; QQKN
+33CC  ; [.12EC.0020.001C.33CC][.136D.0020.001C.33CC] # SQUARE IN; QQKN
+337A  ; [.12EC.0020.001D.337A][.1453.0020.001D.337A] # SQUARE IU; QQKN
+2173  ; [.12EC.0020.0004.2173][.147B.0020.0004.2173] # SMALL ROMAN NUMERAL FOUR; QQKN
+2163  ; [.12EC.0020.000A.2163][.147B.0020.000A.2163] # ROMAN NUMERAL FOUR; QQKN
+2178  ; [.12EC.0020.0004.2178][.1497.0020.0004.2178] # SMALL ROMAN NUMERAL NINE; QQKN
+2168  ; [.12EC.0020.000A.2168][.1497.0020.000A.2168] # ROMAN NUMERAL NINE; QQKN
+0131  ; [.12F0.0020.0002.0131] # LATIN SMALL LETTER DOTLESS I
+1D6A4 ; [.12F0.0020.0005.1D6A4] # MATHEMATICAL ITALIC SMALL DOTLESS I; QQK
+026A  ; [.12F4.0020.0002.026A] # LATIN LETTER SMALL CAPITAL I
+1DA6  ; [.12F4.0020.0014.1DA6] # MODIFIER LETTER SMALL CAPITAL I; QQK
+A7FE  ; [.12F8.0020.0002.A7FE] # LATIN EPIGRAPHIC LETTER I LONGA
+1D09  ; [.12F9.0020.0002.1D09] # LATIN SMALL LETTER TURNED I
+1D4E  ; [.12F9.0020.0014.1D4E] # MODIFIER LETTER SMALL TURNED I; QQK
+0268  ; [.12FA.0020.0002.0268] # LATIN SMALL LETTER I WITH STROKE
+0197  ; [.12FA.0020.0008.0197] # LATIN CAPITAL LETTER I WITH STROKE
+1DA4  ; [.12FA.0020.0014.1DA4] # MODIFIER LETTER SMALL I WITH STROKE; QQK
+1D7B  ; [.12FE.0020.0002.1D7B] # LATIN SMALL CAPITAL LETTER I WITH STROKE
+1DA7  ; [.12FE.0020.0014.1DA7] # MODIFIER LETTER SMALL CAPITAL I WITH STROKE; QQK
+1D96  ; [.12FF.0020.0002.1D96] # LATIN SMALL LETTER I WITH RETROFLEX HOOK
+0269  ; [.1300.0020.0002.0269] # LATIN SMALL LETTER IOTA
+0196  ; [.1300.0020.0008.0196] # LATIN CAPITAL LETTER IOTA
+1DA5  ; [.1300.0020.0014.1DA5] # MODIFIER LETTER SMALL IOTA; QQK
+1D7C  ; [.1304.0020.0002.1D7C] # LATIN SMALL LETTER IOTA WITH STROKE
+006A  ; [.1305.0020.0002.006A] # LATIN SMALL LETTER J
+FF4A  ; [.1305.0020.0003.FF4A] # FULLWIDTH LATIN SMALL LETTER J; QQK
+24A5  ; [*02FF.0020.0004.24A5][.1305.0020.0004.24A5][*0300.0020.001F.24A5] # PARENTHESIZED LATIN SMALL LETTER J; QQKN
+2149  ; [.1305.0020.0005.2149] # DOUBLE-STRUCK ITALIC SMALL J; QQK
+1D423 ; [.1305.0020.0005.1D423] # MATHEMATICAL BOLD SMALL J; QQK
+1D457 ; [.1305.0020.0005.1D457] # MATHEMATICAL ITALIC SMALL J; QQK
+1D48B ; [.1305.0020.0005.1D48B] # MATHEMATICAL BOLD ITALIC SMALL J; QQK
+1D4BF ; [.1305.0020.0005.1D4BF] # MATHEMATICAL SCRIPT SMALL J; QQK
+1D4F3 ; [.1305.0020.0005.1D4F3] # MATHEMATICAL BOLD SCRIPT SMALL J; QQK
+1D527 ; [.1305.0020.0005.1D527] # MATHEMATICAL FRAKTUR SMALL J; QQK
+1D55B ; [.1305.0020.0005.1D55B] # MATHEMATICAL DOUBLE-STRUCK SMALL J; QQK
+1D58F ; [.1305.0020.0005.1D58F] # MATHEMATICAL BOLD FRAKTUR SMALL J; QQK
+1D5C3 ; [.1305.0020.0005.1D5C3] # MATHEMATICAL SANS-SERIF SMALL J; QQK
+1D5F7 ; [.1305.0020.0005.1D5F7] # MATHEMATICAL SANS-SERIF BOLD SMALL J; QQK
+1D62B ; [.1305.0020.0005.1D62B] # MATHEMATICAL SANS-SERIF ITALIC SMALL J; QQK
+1D65F ; [.1305.0020.0005.1D65F] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J; QQK
+1D693 ; [.1305.0020.0005.1D693] # MATHEMATICAL MONOSPACE SMALL J; QQK
+24D9  ; [.1305.0020.0006.24D9] # CIRCLED LATIN SMALL LETTER J; QQK
+004A  ; [.1305.0020.0008.004A] # LATIN CAPITAL LETTER J
+FF2A  ; [.1305.0020.0009.FF2A] # FULLWIDTH LATIN CAPITAL LETTER J; QQK
+1F119 ; [*02FF.0020.0004.1F119][.1305.0020.000A.1F119][*0300.0020.001F.1F119] # PARENTHESIZED LATIN CAPITAL LETTER J; QQKN
+1D409 ; [.1305.0020.000B.1D409] # MATHEMATICAL BOLD CAPITAL J; QQK
+1D43D ; [.1305.0020.000B.1D43D] # MATHEMATICAL ITALIC CAPITAL J; QQK
+1D471 ; [.1305.0020.000B.1D471] # MATHEMATICAL BOLD ITALIC CAPITAL J; QQK
+1D4A5 ; [.1305.0020.000B.1D4A5] # MATHEMATICAL SCRIPT CAPITAL J; QQK
+1D4D9 ; [.1305.0020.000B.1D4D9] # MATHEMATICAL BOLD SCRIPT CAPITAL J; QQK
+1D50D ; [.1305.0020.000B.1D50D] # MATHEMATICAL FRAKTUR CAPITAL J; QQK
+1D541 ; [.1305.0020.000B.1D541] # MATHEMATICAL DOUBLE-STRUCK CAPITAL J; QQK
+1D575 ; [.1305.0020.000B.1D575] # MATHEMATICAL BOLD FRAKTUR CAPITAL J; QQK
+1D5A9 ; [.1305.0020.000B.1D5A9] # MATHEMATICAL SANS-SERIF CAPITAL J; QQK
+1D5DD ; [.1305.0020.000B.1D5DD] # MATHEMATICAL SANS-SERIF BOLD CAPITAL J; QQK
+1D611 ; [.1305.0020.000B.1D611] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL J; QQK
+1D645 ; [.1305.0020.000B.1D645] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J; QQK
+1D679 ; [.1305.0020.000B.1D679] # MATHEMATICAL MONOSPACE CAPITAL J; QQK
+24BF  ; [.1305.0020.000C.24BF] # CIRCLED LATIN CAPITAL LETTER J; QQK
+02B2  ; [.1305.0020.0014.02B2] # MODIFIER LETTER SMALL J; QQK
+2C7C  ; [.1305.0020.0015.2C7C] # LATIN SUBSCRIPT SMALL LETTER J; QQK
+1D36  ; [.1305.0020.001D.1D36] # MODIFIER LETTER CAPITAL J; QQK
+1F179 ; [.1305.0020.001D.1F179] # NEGATIVE SQUARED LATIN CAPITAL LETTER J; QQK
+0135  ; [.1305.0020.0002.006A][.0000.003C.0002.0302] # LATIN SMALL LETTER J WITH CIRCUMFLEX; QQCM
+0134  ; [.1305.0020.0008.004A][.0000.003C.0002.0302] # LATIN CAPITAL LETTER J WITH CIRCUMFLEX; QQCM
+01F0  ; [.1305.0020.0002.006A][.0000.0041.0002.030C] # LATIN SMALL LETTER J WITH CARON; QQCM
+0237  ; [.1309.0020.0002.0237] # LATIN SMALL LETTER DOTLESS J
+1D6A5 ; [.1309.0020.0005.1D6A5] # MATHEMATICAL ITALIC SMALL DOTLESS J; QQK
+1D0A  ; [.130D.0020.0002.1D0A] # LATIN LETTER SMALL CAPITAL J
+0249  ; [.130E.0020.0002.0249] # LATIN SMALL LETTER J WITH STROKE
+0248  ; [.130E.0020.0008.0248] # LATIN CAPITAL LETTER J WITH STROKE
+029D  ; [.1312.0020.0002.029D] # LATIN SMALL LETTER J WITH CROSSED-TAIL
+1DA8  ; [.1312.0020.0014.1DA8] # MODIFIER LETTER SMALL J WITH CROSSED-TAIL; QQK
+025F  ; [.1316.0020.0002.025F] # LATIN SMALL LETTER DOTLESS J WITH STROKE
+1DA1  ; [.1316.0020.0014.1DA1] # MODIFIER LETTER SMALL DOTLESS J WITH STROKE; QQK
+0284  ; [.131A.0020.0002.0284] # LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK
+006B  ; [.131E.0020.0002.006B] # LATIN SMALL LETTER K
+FF4B  ; [.131E.0020.0003.FF4B] # FULLWIDTH LATIN SMALL LETTER K; QQK
+1DDC  ; [.131E.0020.0004.1DDC] # COMBINING LATIN SMALL LETTER K; QQK
+24A6  ; [*02FF.0020.0004.24A6][.131E.0020.0004.24A6][*0300.0020.001F.24A6] # PARENTHESIZED LATIN SMALL LETTER K; QQKN
+1D424 ; [.131E.0020.0005.1D424] # MATHEMATICAL BOLD SMALL K; QQK
+1D458 ; [.131E.0020.0005.1D458] # MATHEMATICAL ITALIC SMALL K; QQK
+1D48C ; [.131E.0020.0005.1D48C] # MATHEMATICAL BOLD ITALIC SMALL K; QQK
+1D4C0 ; [.131E.0020.0005.1D4C0] # MATHEMATICAL SCRIPT SMALL K; QQK
+1D4F4 ; [.131E.0020.0005.1D4F4] # MATHEMATICAL BOLD SCRIPT SMALL K; QQK
+1D528 ; [.131E.0020.0005.1D528] # MATHEMATICAL FRAKTUR SMALL K; QQK
+1D55C ; [.131E.0020.0005.1D55C] # MATHEMATICAL DOUBLE-STRUCK SMALL K; QQK
+1D590 ; [.131E.0020.0005.1D590] # MATHEMATICAL BOLD FRAKTUR SMALL K; QQK
+1D5C4 ; [.131E.0020.0005.1D5C4] # MATHEMATICAL SANS-SERIF SMALL K; QQK
+1D5F8 ; [.131E.0020.0005.1D5F8] # MATHEMATICAL SANS-SERIF BOLD SMALL K; QQK
+1D62C ; [.131E.0020.0005.1D62C] # MATHEMATICAL SANS-SERIF ITALIC SMALL K; QQK
+1D660 ; [.131E.0020.0005.1D660] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K; QQK
+1D694 ; [.131E.0020.0005.1D694] # MATHEMATICAL MONOSPACE SMALL K; QQK
+24DA  ; [.131E.0020.0006.24DA] # CIRCLED LATIN SMALL LETTER K; QQK
+004B  ; [.131E.0020.0008.004B] # LATIN CAPITAL LETTER K
+212A  ; [.131E.0020.0008.212A] # KELVIN SIGN; QQC
+FF2B  ; [.131E.0020.0009.FF2B] # FULLWIDTH LATIN CAPITAL LETTER K; QQK
+1F11A ; [*02FF.0020.0004.1F11A][.131E.0020.000A.1F11A][*0300.0020.001F.1F11A] # PARENTHESIZED LATIN CAPITAL LETTER K; QQKN
+1D40A ; [.131E.0020.000B.1D40A] # MATHEMATICAL BOLD CAPITAL K; QQK
+1D43E ; [.131E.0020.000B.1D43E] # MATHEMATICAL ITALIC CAPITAL K; QQK
+1D472 ; [.131E.0020.000B.1D472] # MATHEMATICAL BOLD ITALIC CAPITAL K; QQK
+1D4A6 ; [.131E.0020.000B.1D4A6] # MATHEMATICAL SCRIPT CAPITAL K; QQK
+1D4DA ; [.131E.0020.000B.1D4DA] # MATHEMATICAL BOLD SCRIPT CAPITAL K; QQK
+1D50E ; [.131E.0020.000B.1D50E] # MATHEMATICAL FRAKTUR CAPITAL K; QQK
+1D542 ; [.131E.0020.000B.1D542] # MATHEMATICAL DOUBLE-STRUCK CAPITAL K; QQK
+1D576 ; [.131E.0020.000B.1D576] # MATHEMATICAL BOLD FRAKTUR CAPITAL K; QQK
+1D5AA ; [.131E.0020.000B.1D5AA] # MATHEMATICAL SANS-SERIF CAPITAL K; QQK
+1D5DE ; [.131E.0020.000B.1D5DE] # MATHEMATICAL SANS-SERIF BOLD CAPITAL K; QQK
+1D612 ; [.131E.0020.000B.1D612] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL K; QQK
+1D646 ; [.131E.0020.000B.1D646] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K; QQK
+1D67A ; [.131E.0020.000B.1D67A] # MATHEMATICAL MONOSPACE CAPITAL K; QQK
+24C0  ; [.131E.0020.000C.24C0] # CIRCLED LATIN CAPITAL LETTER K; QQK
+1D4F  ; [.131E.0020.0014.1D4F] # MODIFIER LETTER SMALL K; QQK
+1D37  ; [.131E.0020.001D.1D37] # MODIFIER LETTER CAPITAL K; QQK
+1E31  ; [.131E.0020.0002.006B][.0000.0032.0002.0301] # LATIN SMALL LETTER K WITH ACUTE; QQCM
+1E30  ; [.131E.0020.0008.004B][.0000.0032.0002.0301] # LATIN CAPITAL LETTER K WITH ACUTE; QQCM
+01E9  ; [.131E.0020.0002.006B][.0000.0041.0002.030C] # LATIN SMALL LETTER K WITH CARON; QQCM
+01E8  ; [.131E.0020.0008.004B][.0000.0041.0002.030C] # LATIN CAPITAL LETTER K WITH CARON; QQCM
+0137  ; [.131E.0020.0002.006B][.0000.0056.0002.0327] # LATIN SMALL LETTER K WITH CEDILLA; QQCM
+0136  ; [.131E.0020.0008.004B][.0000.0056.0002.0327] # LATIN CAPITAL LETTER K WITH CEDILLA; QQCM
+1E33  ; [.131E.0020.0002.006B][.0000.0070.0002.0323] # LATIN SMALL LETTER K WITH DOT BELOW; QQCM
+1E32  ; [.131E.0020.0008.004B][.0000.0070.0002.0323] # LATIN CAPITAL LETTER K WITH DOT BELOW; QQCM
+1E35  ; [.131E.0020.0002.006B][.0000.007B.0002.0331] # LATIN SMALL LETTER K WITH LINE BELOW; QQCM
+1E34  ; [.131E.0020.0008.004B][.0000.007B.0002.0331] # LATIN CAPITAL LETTER K WITH LINE BELOW; QQCM
+3384  ; [.131E.0020.001C.3384][.120F.0020.001D.3384] # SQUARE KA; QQKN
+3385  ; [.131E.0020.001D.3385][.1225.0020.001D.3385] # SQUARE KB; QQKN
+3389  ; [.131E.0020.001C.3389][.123D.0020.001C.3389][.120F.0020.001F.3389][.1330.0020.001F.3389] # SQUARE KCAL; QQKN
+338F  ; [.131E.0020.001C.338F][.12B0.0020.001C.338F] # SQUARE KG; QQKN
+3391  ; [.131E.0020.001C.3391][.12D3.0020.001D.3391][.14AD.0020.001F.3391] # SQUARE KHZ; QQKN
+33CD  ; [.131E.0020.001D.33CD][.131E.0020.001D.33CD] # SQUARE KK; QQKN
+3398  ; [.131E.0020.001C.3398][.1330.0020.001C.3398] # SQUARE KL; QQKN
+339E  ; [.131E.0020.001C.339E][.135F.0020.001C.339E] # SQUARE KM; QQKN
+33CE  ; [.131E.0020.001D.33CE][.135F.0020.001D.33CE] # SQUARE KM CAPITAL; QQKN
+33A2  ; [.131E.0020.001C.33A2][.135F.0020.001C.33A2][.1207.0020.001F.33A2] # SQUARE KM SQUARED; QQKN
+33A6  ; [.131E.0020.001C.33A6][.135F.0020.001C.33A6][.1208.0020.001F.33A6] # SQUARE KM CUBED; QQKN
+33AA  ; [.131E.0020.001C.33AA][.13B3.0020.001D.33AA][.120F.0020.001F.33AA] # SQUARE KPA; QQKN
+33CF  ; [.131E.0020.001C.33CF][.1433.0020.001C.33CF] # SQUARE KT; QQKN
+33B8  ; [.131E.0020.001C.33B8][.147B.0020.001D.33B8] # SQUARE KV; QQKN
+33BE  ; [.131E.0020.001C.33BE][.148D.0020.001D.33BE] # SQUARE KW; QQKN
+33C0  ; [.131E.0020.001C.33C0][.156D.0020.001D.33C0] # SQUARE K OHM; QQKN
+1D0B  ; [.1322.0020.0002.1D0B] # LATIN LETTER SMALL CAPITAL K
+1D84  ; [.1323.0020.0002.1D84] # LATIN SMALL LETTER K WITH PALATAL HOOK
+0199  ; [.1324.0020.0002.0199] # LATIN SMALL LETTER K WITH HOOK
+0198  ; [.1324.0020.0008.0198] # LATIN CAPITAL LETTER K WITH HOOK
+2C6A  ; [.1328.0020.0002.2C6A] # LATIN SMALL LETTER K WITH DESCENDER
+2C69  ; [.1328.0020.0008.2C69] # LATIN CAPITAL LETTER K WITH DESCENDER
+A741  ; [.1329.0020.0002.A741] # LATIN SMALL LETTER K WITH STROKE
+A740  ; [.1329.0020.0008.A740] # LATIN CAPITAL LETTER K WITH STROKE
+A743  ; [.132A.0020.0002.A743] # LATIN SMALL LETTER K WITH DIAGONAL STROKE
+A742  ; [.132A.0020.0008.A742] # LATIN CAPITAL LETTER K WITH DIAGONAL STROKE
+A745  ; [.132B.0020.0002.A745] # LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE
+A744  ; [.132B.0020.0008.A744] # LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE
+029E  ; [.132C.0020.0002.029E] # LATIN SMALL LETTER TURNED K
+006C  ; [.1330.0020.0002.006C] # LATIN SMALL LETTER L
+FF4C  ; [.1330.0020.0003.FF4C] # FULLWIDTH LATIN SMALL LETTER L; QQK
+1DDD  ; [.1330.0020.0004.1DDD] # COMBINING LATIN SMALL LETTER L; QQK
+217C  ; [.1330.0020.0004.217C] # SMALL ROMAN NUMERAL FIFTY; QQK
+24A7  ; [*02FF.0020.0004.24A7][.1330.0020.0004.24A7][*0300.0020.001F.24A7] # PARENTHESIZED LATIN SMALL LETTER L; QQKN
+2113  ; [.1330.0020.0005.2113] # SCRIPT SMALL L; QQK
+1D425 ; [.1330.0020.0005.1D425] # MATHEMATICAL BOLD SMALL L; QQK
+1D459 ; [.1330.0020.0005.1D459] # MATHEMATICAL ITALIC SMALL L; QQK
+1D48D ; [.1330.0020.0005.1D48D] # MATHEMATICAL BOLD ITALIC SMALL L; QQK
+1D4C1 ; [.1330.0020.0005.1D4C1] # MATHEMATICAL SCRIPT SMALL L; QQK
+1D4F5 ; [.1330.0020.0005.1D4F5] # MATHEMATICAL BOLD SCRIPT SMALL L; QQK
+1D529 ; [.1330.0020.0005.1D529] # MATHEMATICAL FRAKTUR SMALL L; QQK
+1D55D ; [.1330.0020.0005.1D55D] # MATHEMATICAL DOUBLE-STRUCK SMALL L; QQK
+1D591 ; [.1330.0020.0005.1D591] # MATHEMATICAL BOLD FRAKTUR SMALL L; QQK
+1D5C5 ; [.1330.0020.0005.1D5C5] # MATHEMATICAL SANS-SERIF SMALL L; QQK
+1D5F9 ; [.1330.0020.0005.1D5F9] # MATHEMATICAL SANS-SERIF BOLD SMALL L; QQK
+1D62D ; [.1330.0020.0005.1D62D] # MATHEMATICAL SANS-SERIF ITALIC SMALL L; QQK
+1D661 ; [.1330.0020.0005.1D661] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L; QQK
+1D695 ; [.1330.0020.0005.1D695] # MATHEMATICAL MONOSPACE SMALL L; QQK
+24DB  ; [.1330.0020.0006.24DB] # CIRCLED LATIN SMALL LETTER L; QQK
+004C  ; [.1330.0020.0008.004C] # LATIN CAPITAL LETTER L
+FF2C  ; [.1330.0020.0009.FF2C] # FULLWIDTH LATIN CAPITAL LETTER L; QQK
+216C  ; [.1330.0020.000A.216C] # ROMAN NUMERAL FIFTY; QQK
+1F11B ; [*02FF.0020.0004.1F11B][.1330.0020.000A.1F11B][*0300.0020.001F.1F11B] # PARENTHESIZED LATIN CAPITAL LETTER L; QQKN
+2112  ; [.1330.0020.000B.2112] # SCRIPT CAPITAL L; QQK
+1D40B ; [.1330.0020.000B.1D40B] # MATHEMATICAL BOLD CAPITAL L; QQK
+1D43F ; [.1330.0020.000B.1D43F] # MATHEMATICAL ITALIC CAPITAL L; QQK
+1D473 ; [.1330.0020.000B.1D473] # MATHEMATICAL BOLD ITALIC CAPITAL L; QQK
+1D4DB ; [.1330.0020.000B.1D4DB] # MATHEMATICAL BOLD SCRIPT CAPITAL L; QQK
+1D50F ; [.1330.0020.000B.1D50F] # MATHEMATICAL FRAKTUR CAPITAL L; QQK
+1D543 ; [.1330.0020.000B.1D543] # MATHEMATICAL DOUBLE-STRUCK CAPITAL L; QQK
+1D577 ; [.1330.0020.000B.1D577] # MATHEMATICAL BOLD FRAKTUR CAPITAL L; QQK
+1D5AB ; [.1330.0020.000B.1D5AB] # MATHEMATICAL SANS-SERIF CAPITAL L; QQK
+1D5DF ; [.1330.0020.000B.1D5DF] # MATHEMATICAL SANS-SERIF BOLD CAPITAL L; QQK
+1D613 ; [.1330.0020.000B.1D613] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL L; QQK
+1D647 ; [.1330.0020.000B.1D647] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L; QQK
+1D67B ; [.1330.0020.000B.1D67B] # MATHEMATICAL MONOSPACE CAPITAL L; QQK
+24C1  ; [.1330.0020.000C.24C1] # CIRCLED LATIN CAPITAL LETTER L; QQK
+02E1  ; [.1330.0020.0014.02E1] # MODIFIER LETTER SMALL L; QQK
+1D38  ; [.1330.0020.001D.1D38] # MODIFIER LETTER CAPITAL L; QQK
+1F17B ; [.1330.0020.001D.1F17B] # NEGATIVE SQUARED LATIN CAPITAL LETTER L; QQK
+013A  ; [.1330.0020.0002.006C][.0000.0032.0002.0301] # LATIN SMALL LETTER L WITH ACUTE; QQCM
+0139  ; [.1330.0020.0008.004C][.0000.0032.0002.0301] # LATIN CAPITAL LETTER L WITH ACUTE; QQCM
+013E  ; [.1330.0020.0002.006C][.0000.0041.0002.030C] # LATIN SMALL LETTER L WITH CARON; QQCM
+013D  ; [.1330.0020.0008.004C][.0000.0041.0002.030C] # LATIN CAPITAL LETTER L WITH CARON; QQCM
+013C  ; [.1330.0020.0002.006C][.0000.0056.0002.0327] # LATIN SMALL LETTER L WITH CEDILLA; QQCM
+013B  ; [.1330.0020.0008.004C][.0000.0056.0002.0327] # LATIN CAPITAL LETTER L WITH CEDILLA; QQCM
+1E37  ; [.1330.0020.0002.006C][.0000.0070.0002.0323] # LATIN SMALL LETTER L WITH DOT BELOW; QQCM
+1E36  ; [.1330.0020.0008.004C][.0000.0070.0002.0323] # LATIN CAPITAL LETTER L WITH DOT BELOW; QQCM
+1E39  ; [.1330.0020.0002.006C][.0000.0070.0002.0323][.0000.005B.0002.0304] # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON; QQCM
+1E38  ; [.1330.0020.0008.004C][.0000.0070.0002.0323][.0000.005B.0002.0304] # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON; QQCM
+1E3D  ; [.1330.0020.0002.006C][.0000.0078.0002.032D] # LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW; QQCM
+1E3C  ; [.1330.0020.0008.004C][.0000.0078.0002.032D] # LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW; QQCM
+1E3B  ; [.1330.0020.0002.006C][.0000.007B.0002.0331] # LATIN SMALL LETTER L WITH LINE BELOW; QQCM
+1E3A  ; [.1330.0020.0008.004C][.0000.007B.0002.0331] # LATIN CAPITAL LETTER L WITH LINE BELOW; QQCM
+0142  ; [.1330.0020.0002.006C][.0000.007D.0002.0335] # LATIN SMALL LETTER L WITH STROKE; QQCM
+0141  ; [.1330.0020.0008.004C][.0000.007D.0002.0335] # LATIN CAPITAL LETTER L WITH STROKE; QQCM
+0140  ; [.1330.0020.0002.0140][.0000.0159.0002.0140] # LATIN SMALL LETTER L WITH MIDDLE DOT; QQKL
+006C 00B7 ; [.1330.0020.0002.0140][.0000.0159.0002.0140] # LATIN SMALL LETTER L WITH MIDDLE DOT
+006C 0387 ; [.1330.0020.0002.0140][.0000.0159.0002.0140] # LATIN SMALL LETTER L WITH MIDDLE DOT
+013F  ; [.1330.0020.0008.013F][.0000.0159.0002.013F] # LATIN CAPITAL LETTER L WITH MIDDLE DOT; QQKL
+004C 00B7 ; [.1330.0020.0008.013F][.0000.0159.0002.013F] # LATIN CAPITAL LETTER L WITH MIDDLE DOT
+004C 0387 ; [.1330.0020.0008.013F][.0000.0159.0002.013F] # LATIN CAPITAL LETTER L WITH MIDDLE DOT
+01C9  ; [.1330.0020.0004.01C9][.1305.0020.0004.01C9] # LATIN SMALL LETTER LJ; QQKN
+01C8  ; [.1330.0020.000A.01C8][.1305.0020.0004.01C8] # LATIN CAPITAL LETTER L WITH SMALL LETTER J; QQKN
+01C7  ; [.1330.0020.000A.01C7][.1305.0020.000A.01C7] # LATIN CAPITAL LETTER LJ; QQKN
+1EFB  ; [.1330.0020.0004.1EFB][.1330.0020.0004.1EFB] # LATIN SMALL LETTER MIDDLE-WELSH LL; QQKN
+1EFA  ; [.1330.0020.000A.1EFA][.1330.0020.000A.1EFA] # LATIN CAPITAL LETTER MIDDLE-WELSH LL; QQKN
+33D0  ; [.1330.0020.001C.33D0][.135F.0020.001C.33D0] # SQUARE LM; QQKN
+33D1  ; [.1330.0020.001C.33D1][.136D.0020.001C.33D1] # SQUARE LN; QQKN
+33D2  ; [.1330.0020.001C.33D2][.138E.0020.001C.33D2][.12B0.0020.001F.33D2] # SQUARE LOG; QQKN
+02AA  ; [.1330.0020.0004.02AA][.1410.0020.0004.02AA] # LATIN SMALL LETTER LS DIGRAPH; QQKN
+32CF  ; [.1330.0020.001D.32CF][.1433.0020.001D.32CF][.1250.0020.001F.32CF] # LIMITED LIABILITY SIGN; QQKN
+33D3  ; [.1330.0020.001C.33D3][.1497.0020.001C.33D3] # SQUARE LX; QQKN
+02AB  ; [.1330.0020.0004.02AB][.14AD.0020.0004.02AB] # LATIN SMALL LETTER LZ DIGRAPH; QQKN
+029F  ; [.1334.0020.0002.029F] # LATIN LETTER SMALL CAPITAL L
+1DDE  ; [.1334.0020.0004.1DDE] # COMBINING LATIN LETTER SMALL CAPITAL L; QQK
+1DAB  ; [.1334.0020.0014.1DAB] # MODIFIER LETTER SMALL CAPITAL L; QQK
+A747  ; [.1338.0020.0002.A747] # LATIN SMALL LETTER BROKEN L
+A746  ; [.1338.0020.0008.A746] # LATIN CAPITAL LETTER BROKEN L
+1D0C  ; [.1339.0020.0002.1D0C] # LATIN LETTER SMALL CAPITAL L WITH STROKE
+A749  ; [.133A.0020.0002.A749] # LATIN SMALL LETTER L WITH HIGH STROKE
+A748  ; [.133A.0020.0008.A748] # LATIN CAPITAL LETTER L WITH HIGH STROKE
+019A  ; [.133B.0020.0002.019A] # LATIN SMALL LETTER L WITH BAR
+023D  ; [.133B.0020.0008.023D] # LATIN CAPITAL LETTER L WITH BAR
+2C61  ; [.133F.0020.0002.2C61] # LATIN SMALL LETTER L WITH DOUBLE BAR
+2C60  ; [.133F.0020.0008.2C60] # LATIN CAPITAL LETTER L WITH DOUBLE BAR
+026B  ; [.1340.0020.0002.026B] # LATIN SMALL LETTER L WITH MIDDLE TILDE
+2C62  ; [.1340.0020.0008.2C62] # LATIN CAPITAL LETTER L WITH MIDDLE TILDE
+026C  ; [.1344.0020.0002.026C] # LATIN SMALL LETTER L WITH BELT
+1D85  ; [.1348.0020.0002.1D85] # LATIN SMALL LETTER L WITH PALATAL HOOK
+1DAA  ; [.1348.0020.0014.1DAA] # MODIFIER LETTER SMALL L WITH PALATAL HOOK; QQK
+026D  ; [.1349.0020.0002.026D] # LATIN SMALL LETTER L WITH RETROFLEX HOOK
+1DA9  ; [.1349.0020.0014.1DA9] # MODIFIER LETTER SMALL L WITH RETROFLEX HOOK; QQK
+0234  ; [.134D.0020.0002.0234] # LATIN SMALL LETTER L WITH CURL
+A772  ; [.1351.0020.0002.A772] # LATIN SMALL LETTER LUM
+026E  ; [.1352.0020.0002.026E] # LATIN SMALL LETTER LEZH
+A781  ; [.1356.0020.0002.A781] # LATIN SMALL LETTER TURNED L
+A780  ; [.1356.0020.0008.A780] # LATIN CAPITAL LETTER TURNED L
+019B  ; [.1357.0020.0002.019B] # LATIN SMALL LETTER LAMBDA WITH STROKE
+028E  ; [.135B.0020.0002.028E] # LATIN SMALL LETTER TURNED Y
+006D  ; [.135F.0020.0002.006D] # LATIN SMALL LETTER M
+FF4D  ; [.135F.0020.0003.FF4D] # FULLWIDTH LATIN SMALL LETTER M; QQK
+036B  ; [.135F.0020.0004.036B] # COMBINING LATIN SMALL LETTER M; QQK
+217F  ; [.135F.0020.0004.217F] # SMALL ROMAN NUMERAL ONE THOUSAND; QQK
+24A8  ; [*02FF.0020.0004.24A8][.135F.0020.0004.24A8][*0300.0020.001F.24A8] # PARENTHESIZED LATIN SMALL LETTER M; QQKN
+1D426 ; [.135F.0020.0005.1D426] # MATHEMATICAL BOLD SMALL M; QQK
+1D45A ; [.135F.0020.0005.1D45A] # MATHEMATICAL ITALIC SMALL M; QQK
+1D48E ; [.135F.0020.0005.1D48E] # MATHEMATICAL BOLD ITALIC SMALL M; QQK
+1D4C2 ; [.135F.0020.0005.1D4C2] # MATHEMATICAL SCRIPT SMALL M; QQK
+1D4F6 ; [.135F.0020.0005.1D4F6] # MATHEMATICAL BOLD SCRIPT SMALL M; QQK
+1D52A ; [.135F.0020.0005.1D52A] # MATHEMATICAL FRAKTUR SMALL M; QQK
+1D55E ; [.135F.0020.0005.1D55E] # MATHEMATICAL DOUBLE-STRUCK SMALL M; QQK
+1D592 ; [.135F.0020.0005.1D592] # MATHEMATICAL BOLD FRAKTUR SMALL M; QQK
+1D5C6 ; [.135F.0020.0005.1D5C6] # MATHEMATICAL SANS-SERIF SMALL M; QQK
+1D5FA ; [.135F.0020.0005.1D5FA] # MATHEMATICAL SANS-SERIF BOLD SMALL M; QQK
+1D62E ; [.135F.0020.0005.1D62E] # MATHEMATICAL SANS-SERIF ITALIC SMALL M; QQK
+1D662 ; [.135F.0020.0005.1D662] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M; QQK
+1D696 ; [.135F.0020.0005.1D696] # MATHEMATICAL MONOSPACE SMALL M; QQK
+24DC  ; [.135F.0020.0006.24DC] # CIRCLED LATIN SMALL LETTER M; QQK
+004D  ; [.135F.0020.0008.004D] # LATIN CAPITAL LETTER M
+FF2D  ; [.135F.0020.0009.FF2D] # FULLWIDTH LATIN CAPITAL LETTER M; QQK
+216F  ; [.135F.0020.000A.216F] # ROMAN NUMERAL ONE THOUSAND; QQK
+1F11C ; [*02FF.0020.0004.1F11C][.135F.0020.000A.1F11C][*0300.0020.001F.1F11C] # PARENTHESIZED LATIN CAPITAL LETTER M; QQKN
+2133  ; [.135F.0020.000B.2133] # SCRIPT CAPITAL M; QQK
+1D40C ; [.135F.0020.000B.1D40C] # MATHEMATICAL BOLD CAPITAL M; QQK
+1D440 ; [.135F.0020.000B.1D440] # MATHEMATICAL ITALIC CAPITAL M; QQK
+1D474 ; [.135F.0020.000B.1D474] # MATHEMATICAL BOLD ITALIC CAPITAL M; QQK
+1D4DC ; [.135F.0020.000B.1D4DC] # MATHEMATICAL BOLD SCRIPT CAPITAL M; QQK
+1D510 ; [.135F.0020.000B.1D510] # MATHEMATICAL FRAKTUR CAPITAL M; QQK
+1D544 ; [.135F.0020.000B.1D544] # MATHEMATICAL DOUBLE-STRUCK CAPITAL M; QQK
+1D578 ; [.135F.0020.000B.1D578] # MATHEMATICAL BOLD FRAKTUR CAPITAL M; QQK
+1D5AC ; [.135F.0020.000B.1D5AC] # MATHEMATICAL SANS-SERIF CAPITAL M; QQK
+1D5E0 ; [.135F.0020.000B.1D5E0] # MATHEMATICAL SANS-SERIF BOLD CAPITAL M; QQK
+1D614 ; [.135F.0020.000B.1D614] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL M; QQK
+1D648 ; [.135F.0020.000B.1D648] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M; QQK
+1D67C ; [.135F.0020.000B.1D67C] # MATHEMATICAL MONOSPACE CAPITAL M; QQK
+24C2  ; [.135F.0020.000C.24C2] # CIRCLED LATIN CAPITAL LETTER M; QQK
+1D50  ; [.135F.0020.0014.1D50] # MODIFIER LETTER SMALL M; QQK
+1D39  ; [.135F.0020.001D.1D39] # MODIFIER LETTER CAPITAL M; QQK
+1F17C ; [.135F.0020.001D.1F17C] # NEGATIVE SQUARED LATIN CAPITAL LETTER M; QQK
+1E3F  ; [.135F.0020.0002.006D][.0000.0032.0002.0301] # LATIN SMALL LETTER M WITH ACUTE; QQCM
+1E3E  ; [.135F.0020.0008.004D][.0000.0032.0002.0301] # LATIN CAPITAL LETTER M WITH ACUTE; QQCM
+1E41  ; [.135F.0020.0002.006D][.0000.0052.0002.0307] # LATIN SMALL LETTER M WITH DOT ABOVE; QQCM
+1E40  ; [.135F.0020.0008.004D][.0000.0052.0002.0307] # LATIN CAPITAL LETTER M WITH DOT ABOVE; QQCM
+1E43  ; [.135F.0020.0002.006D][.0000.0070.0002.0323] # LATIN SMALL LETTER M WITH DOT BELOW; QQCM
+1E42  ; [.135F.0020.0008.004D][.0000.0070.0002.0323] # LATIN CAPITAL LETTER M WITH DOT BELOW; QQCM
+33A1  ; [.135F.0020.001C.33A1][.1207.0020.001C.33A1] # SQUARE M SQUARED; QQKN
+33A5  ; [.135F.0020.001C.33A5][.1208.0020.001C.33A5] # SQUARE M CUBED; QQKN
+3383  ; [.135F.0020.001C.3383][.120F.0020.001D.3383] # SQUARE MA; QQKN
+33D4  ; [.135F.0020.001C.33D4][.1225.0020.001C.33D4] # SQUARE MB SMALL; QQKN
+3386  ; [.135F.0020.001D.3386][.1225.0020.001D.3386] # SQUARE MB; QQKN
+338E  ; [.135F.0020.001C.338E][.12B0.0020.001C.338E] # SQUARE MG; QQKN
+3392  ; [.135F.0020.001D.3392][.12D3.0020.001D.3392][.14AD.0020.001F.3392] # SQUARE MHZ; QQKN
+33D5  ; [.135F.0020.001C.33D5][.12EC.0020.001C.33D5][.1330.0020.001F.33D5] # SQUARE MIL; QQKN
+3396  ; [.135F.0020.001C.3396][.1330.0020.001C.3396] # SQUARE ML; QQKN
+339C  ; [.135F.0020.001C.339C][.135F.0020.001C.339C] # SQUARE MM; QQKN
+339F  ; [.135F.0020.001C.339F][.135F.0020.001C.339F][.1207.0020.001F.339F] # SQUARE MM SQUARED; QQKN
+33A3  ; [.135F.0020.001C.33A3][.135F.0020.001C.33A3][.1208.0020.001F.33A3] # SQUARE MM CUBED; QQKN
+33D6  ; [.135F.0020.001C.33D6][.138E.0020.001C.33D6][.1330.0020.001F.33D6] # SQUARE MOL; QQKN
+33AB  ; [.135F.0020.001D.33AB][.13B3.0020.001D.33AB][.120F.0020.001F.33AB] # SQUARE MPA; QQKN
+33B3  ; [.135F.0020.001C.33B3][.1410.0020.001C.33B3] # SQUARE MS; QQKN
+33A7  ; [.135F.0020.001C.33A7][*055F.0020.001C.33A7][.1410.0020.001F.33A7] # SQUARE M OVER S; QQKN
+33A8  ; [.135F.0020.001C.33A8][*055F.0020.001C.33A8][.1410.0020.001F.33A8][.1207.0020.001F.33A8] # SQUARE M OVER S SQUARED; QQKN
+33B7  ; [.135F.0020.001C.33B7][.147B.0020.001D.33B7] # SQUARE MV; QQKN
+33B9  ; [.135F.0020.001D.33B9][.147B.0020.001D.33B9] # SQUARE MV MEGA; QQKN
+1F14B ; [.135F.0020.001D.1F14B][.147B.0020.001D.1F14B] # SQUARED MV; QQKN
+33BD  ; [.135F.0020.001C.33BD][.148D.0020.001D.33BD] # SQUARE MW; QQKN
+33BF  ; [.135F.0020.001D.33BF][.148D.0020.001D.33BF] # SQUARE MW MEGA; QQKN
+33C1  ; [.135F.0020.001D.33C1][.156D.0020.001D.33C1] # SQUARE M OHM; QQKN
+1D0D  ; [.1363.0020.0002.1D0D] # LATIN LETTER SMALL CAPITAL M
+1DDF  ; [.1363.0020.0004.1DDF] # COMBINING LATIN LETTER SMALL CAPITAL M; QQK
+1D6F  ; [.1364.0020.0002.1D6F] # LATIN SMALL LETTER M WITH MIDDLE TILDE
+1D86  ; [.1365.0020.0002.1D86] # LATIN SMALL LETTER M WITH PALATAL HOOK
+0271  ; [.1366.0020.0002.0271] # LATIN SMALL LETTER M WITH HOOK
+2C6E  ; [.1366.0020.0008.2C6E] # LATIN CAPITAL LETTER M WITH HOOK
+1DAC  ; [.1366.0020.0014.1DAC] # MODIFIER LETTER SMALL M WITH HOOK; QQK
+A7FD  ; [.136A.0020.0002.A7FD] # LATIN EPIGRAPHIC LETTER INVERTED M
+A7FF  ; [.136B.0020.0002.A7FF] # LATIN EPIGRAPHIC LETTER ARCHAIC M
+A773  ; [.136C.0020.0002.A773] # LATIN SMALL LETTER MUM
+006E  ; [.136D.0020.0002.006E] # LATIN SMALL LETTER N
+FF4E  ; [.136D.0020.0003.FF4E] # FULLWIDTH LATIN SMALL LETTER N; QQK
+1DE0  ; [.136D.0020.0004.1DE0] # COMBINING LATIN SMALL LETTER N; QQK
+24A9  ; [*02FF.0020.0004.24A9][.136D.0020.0004.24A9][*0300.0020.001F.24A9] # PARENTHESIZED LATIN SMALL LETTER N; QQKN
+1D427 ; [.136D.0020.0005.1D427] # MATHEMATICAL BOLD SMALL N; QQK
+1D45B ; [.136D.0020.0005.1D45B] # MATHEMATICAL ITALIC SMALL N; QQK
+1D48F ; [.136D.0020.0005.1D48F] # MATHEMATICAL BOLD ITALIC SMALL N; QQK
+1D4C3 ; [.136D.0020.0005.1D4C3] # MATHEMATICAL SCRIPT SMALL N; QQK
+1D4F7 ; [.136D.0020.0005.1D4F7] # MATHEMATICAL BOLD SCRIPT SMALL N; QQK
+1D52B ; [.136D.0020.0005.1D52B] # MATHEMATICAL FRAKTUR SMALL N; QQK
+1D55F ; [.136D.0020.0005.1D55F] # MATHEMATICAL DOUBLE-STRUCK SMALL N; QQK
+1D593 ; [.136D.0020.0005.1D593] # MATHEMATICAL BOLD FRAKTUR SMALL N; QQK
+1D5C7 ; [.136D.0020.0005.1D5C7] # MATHEMATICAL SANS-SERIF SMALL N; QQK
+1D5FB ; [.136D.0020.0005.1D5FB] # MATHEMATICAL SANS-SERIF BOLD SMALL N; QQK
+1D62F ; [.136D.0020.0005.1D62F] # MATHEMATICAL SANS-SERIF ITALIC SMALL N; QQK
+1D663 ; [.136D.0020.0005.1D663] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N; QQK
+1D697 ; [.136D.0020.0005.1D697] # MATHEMATICAL MONOSPACE SMALL N; QQK
+24DD  ; [.136D.0020.0006.24DD] # CIRCLED LATIN SMALL LETTER N; QQK
+004E  ; [.136D.0020.0008.004E] # LATIN CAPITAL LETTER N
+FF2E  ; [.136D.0020.0009.FF2E] # FULLWIDTH LATIN CAPITAL LETTER N; QQK
+1F11D ; [*02FF.0020.0004.1F11D][.136D.0020.000A.1F11D][*0300.0020.001F.1F11D] # PARENTHESIZED LATIN CAPITAL LETTER N; QQKN
+2115  ; [.136D.0020.000B.2115] # DOUBLE-STRUCK CAPITAL N; QQK
+1D40D ; [.136D.0020.000B.1D40D] # MATHEMATICAL BOLD CAPITAL N; QQK
+1D441 ; [.136D.0020.000B.1D441] # MATHEMATICAL ITALIC CAPITAL N; QQK
+1D475 ; [.136D.0020.000B.1D475] # MATHEMATICAL BOLD ITALIC CAPITAL N; QQK
+1D4A9 ; [.136D.0020.000B.1D4A9] # MATHEMATICAL SCRIPT CAPITAL N; QQK
+1D4DD ; [.136D.0020.000B.1D4DD] # MATHEMATICAL BOLD SCRIPT CAPITAL N; QQK
+1D511 ; [.136D.0020.000B.1D511] # MATHEMATICAL FRAKTUR CAPITAL N; QQK
+1D579 ; [.136D.0020.000B.1D579] # MATHEMATICAL BOLD FRAKTUR CAPITAL N; QQK
+1D5AD ; [.136D.0020.000B.1D5AD] # MATHEMATICAL SANS-SERIF CAPITAL N; QQK
+1D5E1 ; [.136D.0020.000B.1D5E1] # MATHEMATICAL SANS-SERIF BOLD CAPITAL N; QQK
+1D615 ; [.136D.0020.000B.1D615] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL N; QQK
+1D649 ; [.136D.0020.000B.1D649] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N; QQK
+1D67D ; [.136D.0020.000B.1D67D] # MATHEMATICAL MONOSPACE CAPITAL N; QQK
+24C3  ; [.136D.0020.000C.24C3] # CIRCLED LATIN CAPITAL LETTER N; QQK
+207F  ; [.136D.0020.0014.207F] # SUPERSCRIPT LATIN SMALL LETTER N; QQK
+1D3A  ; [.136D.0020.001D.1D3A] # MODIFIER LETTER CAPITAL N; QQK
+1F13D ; [.136D.0020.001D.1F13D] # SQUARED LATIN CAPITAL LETTER N; QQK
+0144  ; [.136D.0020.0002.006E][.0000.0032.0002.0301] # LATIN SMALL LETTER N WITH ACUTE; QQCM
+0143  ; [.136D.0020.0008.004E][.0000.0032.0002.0301] # LATIN CAPITAL LETTER N WITH ACUTE; QQCM
+01F9  ; [.136D.0020.0002.006E][.0000.0035.0002.0300] # LATIN SMALL LETTER N WITH GRAVE; QQCM
+01F8  ; [.136D.0020.0008.004E][.0000.0035.0002.0300] # LATIN CAPITAL LETTER N WITH GRAVE; QQCM
+0148  ; [.136D.0020.0002.006E][.0000.0041.0002.030C] # LATIN SMALL LETTER N WITH CARON; QQCM
+0147  ; [.136D.0020.0008.004E][.0000.0041.0002.030C] # LATIN CAPITAL LETTER N WITH CARON; QQCM
+00F1  ; [.136D.0020.0002.006E][.0000.004E.0002.0303] # LATIN SMALL LETTER N WITH TILDE; QQCM
+00D1  ; [.136D.0020.0008.004E][.0000.004E.0002.0303] # LATIN CAPITAL LETTER N WITH TILDE; QQCM
+1E45  ; [.136D.0020.0002.006E][.0000.0052.0002.0307] # LATIN SMALL LETTER N WITH DOT ABOVE; QQCM
+1E44  ; [.136D.0020.0008.004E][.0000.0052.0002.0307] # LATIN CAPITAL LETTER N WITH DOT ABOVE; QQCM
+0146  ; [.136D.0020.0002.006E][.0000.0056.0002.0327] # LATIN SMALL LETTER N WITH CEDILLA; QQCM
+0145  ; [.136D.0020.0008.004E][.0000.0056.0002.0327] # LATIN CAPITAL LETTER N WITH CEDILLA; QQCM
+1E47  ; [.136D.0020.0002.006E][.0000.0070.0002.0323] # LATIN SMALL LETTER N WITH DOT BELOW; QQCM
+1E46  ; [.136D.0020.0008.004E][.0000.0070.0002.0323] # LATIN CAPITAL LETTER N WITH DOT BELOW; QQCM
+1E4B  ; [.136D.0020.0002.006E][.0000.0078.0002.032D] # LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW; QQCM
+1E4A  ; [.136D.0020.0008.004E][.0000.0078.0002.032D] # LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW; QQCM
+1E49  ; [.136D.0020.0002.006E][.0000.007B.0002.0331] # LATIN SMALL LETTER N WITH LINE BELOW; QQCM
+1E48  ; [.136D.0020.0008.004E][.0000.007B.0002.0331] # LATIN CAPITAL LETTER N WITH LINE BELOW; QQCM
+3381  ; [.136D.0020.001C.3381][.120F.0020.001D.3381] # SQUARE NA; QQKN
+338B  ; [.136D.0020.001C.338B][.12A3.0020.001D.338B] # SQUARE NF; QQKN
+01CC  ; [.136D.0020.0004.01CC][.1305.0020.0004.01CC] # LATIN SMALL LETTER NJ; QQKN
+01CB  ; [.136D.0020.000A.01CB][.1305.0020.0004.01CB] # LATIN CAPITAL LETTER N WITH SMALL LETTER J; QQKN
+01CA  ; [.136D.0020.000A.01CA][.1305.0020.000A.01CA] # LATIN CAPITAL LETTER NJ; QQKN
+339A  ; [.136D.0020.001C.339A][.135F.0020.001C.339A] # SQUARE NM; QQKN
+2116  ; [.136D.0020.000A.2116][.138E.0020.0004.2116] # NUMERO SIGN; QQKN
+33B1  ; [.136D.0020.001C.33B1][.1410.0020.001C.33B1] # SQUARE NS; QQKN
+33B5  ; [.136D.0020.001C.33B5][.147B.0020.001D.33B5] # SQUARE NV; QQKN
+33BB  ; [.136D.0020.001C.33BB][.148D.0020.001D.33BB] # SQUARE NW; QQKN
+0274  ; [.1371.0020.0002.0274] # LATIN LETTER SMALL CAPITAL N
+1DE1  ; [.1371.0020.0004.1DE1] # COMBINING LATIN LETTER SMALL CAPITAL N; QQK
+1DB0  ; [.1371.0020.0014.1DB0] # MODIFIER LETTER SMALL CAPITAL N; QQK
+1D3B  ; [.1375.0020.0002.1D3B] # MODIFIER LETTER CAPITAL REVERSED N
+1D0E  ; [.1376.0020.0002.1D0E] # LATIN LETTER SMALL CAPITAL REVERSED N
+1D70  ; [.1377.0020.0002.1D70] # LATIN SMALL LETTER N WITH MIDDLE TILDE
+0272  ; [.1378.0020.0002.0272] # LATIN SMALL LETTER N WITH LEFT HOOK
+019D  ; [.1378.0020.0008.019D] # LATIN CAPITAL LETTER N WITH LEFT HOOK
+1DAE  ; [.1378.0020.0014.1DAE] # MODIFIER LETTER SMALL N WITH LEFT HOOK; QQK
+019E  ; [.137C.0020.0002.019E] # LATIN SMALL LETTER N WITH LONG RIGHT LEG
+0220  ; [.137C.0020.0008.0220] # LATIN CAPITAL LETTER N WITH LONG RIGHT LEG
+1D87  ; [.1380.0020.0002.1D87] # LATIN SMALL LETTER N WITH PALATAL HOOK
+0273  ; [.1381.0020.0002.0273] # LATIN SMALL LETTER N WITH RETROFLEX HOOK
+1DAF  ; [.1381.0020.0014.1DAF] # MODIFIER LETTER SMALL N WITH RETROFLEX HOOK; QQK
+0235  ; [.1385.0020.0002.0235] # LATIN SMALL LETTER N WITH CURL
+A774  ; [.1389.0020.0002.A774] # LATIN SMALL LETTER NUM
+014B  ; [.138A.0020.0002.014B] # LATIN SMALL LETTER ENG
+014A  ; [.138A.0020.0008.014A] # LATIN CAPITAL LETTER ENG
+1D51  ; [.138A.0020.0014.1D51] # MODIFIER LETTER SMALL ENG; QQK
+006F  ; [.138E.0020.0002.006F] # LATIN SMALL LETTER O
+FF4F  ; [.138E.0020.0003.FF4F] # FULLWIDTH LATIN SMALL LETTER O; QQK
+0366  ; [.138E.0020.0004.0366] # COMBINING LATIN SMALL LETTER O; QQK
+24AA  ; [*02FF.0020.0004.24AA][.138E.0020.0004.24AA][*0300.0020.001F.24AA] # PARENTHESIZED LATIN SMALL LETTER O; QQKN
+2134  ; [.138E.0020.0005.2134] # SCRIPT SMALL O; QQK
+1D428 ; [.138E.0020.0005.1D428] # MATHEMATICAL BOLD SMALL O; QQK
+1D45C ; [.138E.0020.0005.1D45C] # MATHEMATICAL ITALIC SMALL O; QQK
+1D490 ; [.138E.0020.0005.1D490] # MATHEMATICAL BOLD ITALIC SMALL O; QQK
+1D4F8 ; [.138E.0020.0005.1D4F8] # MATHEMATICAL BOLD SCRIPT SMALL O; QQK
+1D52C ; [.138E.0020.0005.1D52C] # MATHEMATICAL FRAKTUR SMALL O; QQK
+1D560 ; [.138E.0020.0005.1D560] # MATHEMATICAL DOUBLE-STRUCK SMALL O; QQK
+1D594 ; [.138E.0020.0005.1D594] # MATHEMATICAL BOLD FRAKTUR SMALL O; QQK
+1D5C8 ; [.138E.0020.0005.1D5C8] # MATHEMATICAL SANS-SERIF SMALL O; QQK
+1D5FC ; [.138E.0020.0005.1D5FC] # MATHEMATICAL SANS-SERIF BOLD SMALL O; QQK
+1D630 ; [.138E.0020.0005.1D630] # MATHEMATICAL SANS-SERIF ITALIC SMALL O; QQK
+1D664 ; [.138E.0020.0005.1D664] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O; QQK
+1D698 ; [.138E.0020.0005.1D698] # MATHEMATICAL MONOSPACE SMALL O; QQK
+24DE  ; [.138E.0020.0006.24DE] # CIRCLED LATIN SMALL LETTER O; QQK
+004F  ; [.138E.0020.0008.004F] # LATIN CAPITAL LETTER O
+FF2F  ; [.138E.0020.0009.FF2F] # FULLWIDTH LATIN CAPITAL LETTER O; QQK
+1F11E ; [*02FF.0020.0004.1F11E][.138E.0020.000A.1F11E][*0300.0020.001F.1F11E] # PARENTHESIZED LATIN CAPITAL LETTER O; QQKN
+1D40E ; [.138E.0020.000B.1D40E] # MATHEMATICAL BOLD CAPITAL O; QQK
+1D442 ; [.138E.0020.000B.1D442] # MATHEMATICAL ITALIC CAPITAL O; QQK
+1D476 ; [.138E.0020.000B.1D476] # MATHEMATICAL BOLD ITALIC CAPITAL O; QQK
+1D4AA ; [.138E.0020.000B.1D4AA] # MATHEMATICAL SCRIPT CAPITAL O; QQK
+1D4DE ; [.138E.0020.000B.1D4DE] # MATHEMATICAL BOLD SCRIPT CAPITAL O; QQK
+1D512 ; [.138E.0020.000B.1D512] # MATHEMATICAL FRAKTUR CAPITAL O; QQK
+1D546 ; [.138E.0020.000B.1D546] # MATHEMATICAL DOUBLE-STRUCK CAPITAL O; QQK
+1D57A ; [.138E.0020.000B.1D57A] # MATHEMATICAL BOLD FRAKTUR CAPITAL O; QQK
+1D5AE ; [.138E.0020.000B.1D5AE] # MATHEMATICAL SANS-SERIF CAPITAL O; QQK
+1D5E2 ; [.138E.0020.000B.1D5E2] # MATHEMATICAL SANS-SERIF BOLD CAPITAL O; QQK
+1D616 ; [.138E.0020.000B.1D616] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL O; QQK
+1D64A ; [.138E.0020.000B.1D64A] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O; QQK
+1D67E ; [.138E.0020.000B.1D67E] # MATHEMATICAL MONOSPACE CAPITAL O; QQK
+24C4  ; [.138E.0020.000C.24C4] # CIRCLED LATIN CAPITAL LETTER O; QQK
+00BA  ; [.138E.0020.0014.00BA] # MASCULINE ORDINAL INDICATOR; QQK
+1D52  ; [.138E.0020.0014.1D52] # MODIFIER LETTER SMALL O; QQK
+2092  ; [.138E.0020.0015.2092] # LATIN SUBSCRIPT SMALL LETTER O; QQK
+1D3C  ; [.138E.0020.001D.1D3C] # MODIFIER LETTER CAPITAL O; QQK
+00F3  ; [.138E.0020.0002.006F][.0000.0032.0002.0301] # LATIN SMALL LETTER O WITH ACUTE; QQCM
+00D3  ; [.138E.0020.0008.004F][.0000.0032.0002.0301] # LATIN CAPITAL LETTER O WITH ACUTE; QQCM
+00F2  ; [.138E.0020.0002.006F][.0000.0035.0002.0300] # LATIN SMALL LETTER O WITH GRAVE; QQCM
+00D2  ; [.138E.0020.0008.004F][.0000.0035.0002.0300] # LATIN CAPITAL LETTER O WITH GRAVE; QQCM
+014F  ; [.138E.0020.0002.006F][.0000.0037.0002.0306] # LATIN SMALL LETTER O WITH BREVE; QQCM
+014E  ; [.138E.0020.0008.004F][.0000.0037.0002.0306] # LATIN CAPITAL LETTER O WITH BREVE; QQCM
+00F4  ; [.138E.0020.0002.006F][.0000.003C.0002.0302] # LATIN SMALL LETTER O WITH CIRCUMFLEX; QQCM
+00D4  ; [.138E.0020.0008.004F][.0000.003C.0002.0302] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX; QQCM
+1ED1  ; [.138E.0020.0002.006F][.0000.003C.0002.0302][.0000.0032.0002.0301] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE; QQCM
+1ED0  ; [.138E.0020.0008.004F][.0000.003C.0002.0302][.0000.0032.0002.0301] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE; QQCM
+1ED3  ; [.138E.0020.0002.006F][.0000.003C.0002.0302][.0000.0035.0002.0300] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE; QQCM
+1ED2  ; [.138E.0020.0008.004F][.0000.003C.0002.0302][.0000.0035.0002.0300] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE; QQCM
+1ED7  ; [.138E.0020.0002.006F][.0000.003C.0002.0302][.0000.004E.0002.0303] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE; QQCM
+1ED6  ; [.138E.0020.0008.004F][.0000.003C.0002.0302][.0000.004E.0002.0303] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE; QQCM
+1ED5  ; [.138E.0020.0002.006F][.0000.003C.0002.0302][.0000.0064.0002.0309] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE; QQCM
+1ED4  ; [.138E.0020.0008.004F][.0000.003C.0002.0302][.0000.0064.0002.0309] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE; QQCM
+01D2  ; [.138E.0020.0002.006F][.0000.0041.0002.030C] # LATIN SMALL LETTER O WITH CARON; QQCM
+01D1  ; [.138E.0020.0008.004F][.0000.0041.0002.030C] # LATIN CAPITAL LETTER O WITH CARON; QQCM
+00F6  ; [.138E.0020.0002.006F][.0000.0047.0002.0308] # LATIN SMALL LETTER O WITH DIAERESIS; QQCM
+00D6  ; [.138E.0020.0008.004F][.0000.0047.0002.0308] # LATIN CAPITAL LETTER O WITH DIAERESIS; QQCM
+022B  ; [.138E.0020.0002.006F][.0000.0047.0002.0308][.0000.005B.0002.0304] # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON; QQCM
+022A  ; [.138E.0020.0008.004F][.0000.0047.0002.0308][.0000.005B.0002.0304] # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON; QQCM
+0151  ; [.138E.0020.0002.006F][.0000.004D.0002.030B] # LATIN SMALL LETTER O WITH DOUBLE ACUTE; QQCM
+0150  ; [.138E.0020.0008.004F][.0000.004D.0002.030B] # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE; QQCM
+00F5  ; [.138E.0020.0002.006F][.0000.004E.0002.0303] # LATIN SMALL LETTER O WITH TILDE; QQCM
+00D5  ; [.138E.0020.0008.004F][.0000.004E.0002.0303] # LATIN CAPITAL LETTER O WITH TILDE; QQCM
+1E4D  ; [.138E.0020.0002.006F][.0000.004E.0002.0303][.0000.0032.0002.0301] # LATIN SMALL LETTER O WITH TILDE AND ACUTE; QQCM
+1E4C  ; [.138E.0020.0008.004F][.0000.004E.0002.0303][.0000.0032.0002.0301] # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE; QQCM
+1E4F  ; [.138E.0020.0002.006F][.0000.004E.0002.0303][.0000.0047.0002.0308] # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS; QQCM
+1E4E  ; [.138E.0020.0008.004F][.0000.004E.0002.0303][.0000.0047.0002.0308] # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS; QQCM
+022D  ; [.138E.0020.0002.006F][.0000.004E.0002.0303][.0000.005B.0002.0304] # LATIN SMALL LETTER O WITH TILDE AND MACRON; QQCM
+022C  ; [.138E.0020.0008.004F][.0000.004E.0002.0303][.0000.005B.0002.0304] # LATIN CAPITAL LETTER O WITH TILDE AND MACRON; QQCM
+022F  ; [.138E.0020.0002.006F][.0000.0052.0002.0307] # LATIN SMALL LETTER O WITH DOT ABOVE; QQCM
+022E  ; [.138E.0020.0008.004F][.0000.0052.0002.0307] # LATIN CAPITAL LETTER O WITH DOT ABOVE; QQCM
+0231  ; [.138E.0020.0002.006F][.0000.0052.0002.0307][.0000.005B.0002.0304] # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON; QQCM
+0230  ; [.138E.0020.0008.004F][.0000.0052.0002.0307][.0000.005B.0002.0304] # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON; QQCM
+00F8  ; [.138E.0020.0002.006F][.0000.0054.0002.0338] # LATIN SMALL LETTER O WITH STROKE; QQCM
+00D8  ; [.138E.0020.0008.004F][.0000.0054.0002.0338] # LATIN CAPITAL LETTER O WITH STROKE; QQCM
+01FF  ; [.138E.0020.0002.006F][.0000.0054.0002.0338][.0000.0032.0002.0301] # LATIN SMALL LETTER O WITH STROKE AND ACUTE; QQCM
+01FE  ; [.138E.0020.0008.004F][.0000.0054.0002.0338][.0000.0032.0002.0301] # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE; QQCM
+01EB  ; [.138E.0020.0002.006F][.0000.0059.0002.0328] # LATIN SMALL LETTER O WITH OGONEK; QQCM
+01EA  ; [.138E.0020.0008.004F][.0000.0059.0002.0328] # LATIN CAPITAL LETTER O WITH OGONEK; QQCM
+01ED  ; [.138E.0020.0002.006F][.0000.0059.0002.0328][.0000.005B.0002.0304] # LATIN SMALL LETTER O WITH OGONEK AND MACRON; QQCM
+01EC  ; [.138E.0020.0008.004F][.0000.0059.0002.0328][.0000.005B.0002.0304] # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON; QQCM
+014D  ; [.138E.0020.0002.006F][.0000.005B.0002.0304] # LATIN SMALL LETTER O WITH MACRON; QQCM
+014C  ; [.138E.0020.0008.004F][.0000.005B.0002.0304] # LATIN CAPITAL LETTER O WITH MACRON; QQCM
+1E53  ; [.138E.0020.0002.006F][.0000.005B.0002.0304][.0000.0032.0002.0301] # LATIN SMALL LETTER O WITH MACRON AND ACUTE; QQCM
+1E52  ; [.138E.0020.0008.004F][.0000.005B.0002.0304][.0000.0032.0002.0301] # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE; QQCM
+1E51  ; [.138E.0020.0002.006F][.0000.005B.0002.0304][.0000.0035.0002.0300] # LATIN SMALL LETTER O WITH MACRON AND GRAVE; QQCM
+1E50  ; [.138E.0020.0008.004F][.0000.005B.0002.0304][.0000.0035.0002.0300] # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE; QQCM
+1ECF  ; [.138E.0020.0002.006F][.0000.0064.0002.0309] # LATIN SMALL LETTER O WITH HOOK ABOVE; QQCM
+1ECE  ; [.138E.0020.0008.004F][.0000.0064.0002.0309] # LATIN CAPITAL LETTER O WITH HOOK ABOVE; QQCM
+020D  ; [.138E.0020.0002.006F][.0000.0065.0002.030F] # LATIN SMALL LETTER O WITH DOUBLE GRAVE; QQCM
+020C  ; [.138E.0020.0008.004F][.0000.0065.0002.030F] # LATIN CAPITAL LETTER O WITH DOUBLE GRAVE; QQCM
+020F  ; [.138E.0020.0002.006F][.0000.0067.0002.0311] # LATIN SMALL LETTER O WITH INVERTED BREVE; QQCM
+020E  ; [.138E.0020.0008.004F][.0000.0067.0002.0311] # LATIN CAPITAL LETTER O WITH INVERTED BREVE; QQCM
+01A1  ; [.138E.0020.0002.006F][.0000.0068.0002.031B] # LATIN SMALL LETTER O WITH HORN; QQCM
+01A0  ; [.138E.0020.0008.004F][.0000.0068.0002.031B] # LATIN CAPITAL LETTER O WITH HORN; QQCM
+1EDB  ; [.138E.0020.0002.006F][.0000.0068.0002.031B][.0000.0032.0002.0301] # LATIN SMALL LETTER O WITH HORN AND ACUTE; QQCM
+1EDA  ; [.138E.0020.0008.004F][.0000.0068.0002.031B][.0000.0032.0002.0301] # LATIN CAPITAL LETTER O WITH HORN AND ACUTE; QQCM
+1EDD  ; [.138E.0020.0002.006F][.0000.0068.0002.031B][.0000.0035.0002.0300] # LATIN SMALL LETTER O WITH HORN AND GRAVE; QQCM
+1EDC  ; [.138E.0020.0008.004F][.0000.0068.0002.031B][.0000.0035.0002.0300] # LATIN CAPITAL LETTER O WITH HORN AND GRAVE; QQCM
+1EE1  ; [.138E.0020.0002.006F][.0000.0068.0002.031B][.0000.004E.0002.0303] # LATIN SMALL LETTER O WITH HORN AND TILDE; QQCM
+1EE0  ; [.138E.0020.0008.004F][.0000.0068.0002.031B][.0000.004E.0002.0303] # LATIN CAPITAL LETTER O WITH HORN AND TILDE; QQCM
+1EDF  ; [.138E.0020.0002.006F][.0000.0068.0002.031B][.0000.0064.0002.0309] # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE; QQCM
+1EDE  ; [.138E.0020.0008.004F][.0000.0068.0002.031B][.0000.0064.0002.0309] # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE; QQCM
+1EE3  ; [.138E.0020.0002.006F][.0000.0068.0002.031B][.0000.0070.0002.0323] # LATIN SMALL LETTER O WITH HORN AND DOT BELOW; QQCM
+1EE2  ; [.138E.0020.0008.004F][.0000.0068.0002.031B][.0000.0070.0002.0323] # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW; QQCM
+1ECD  ; [.138E.0020.0002.006F][.0000.0070.0002.0323] # LATIN SMALL LETTER O WITH DOT BELOW; QQCM
+1ECC  ; [.138E.0020.0008.004F][.0000.0070.0002.0323] # LATIN CAPITAL LETTER O WITH DOT BELOW; QQCM
+1ED9  ; [.138E.0020.0002.006F][.0000.0070.0002.0323][.0000.003C.0002.0302] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW; QQCM
+1ED8  ; [.138E.0020.0008.004F][.0000.0070.0002.0323][.0000.003C.0002.0302] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW; QQCM
+0153  ; [.138E.0020.0004.0153][.0000.0159.0004.0153][.126B.0020.001F.0153] # LATIN SMALL LIGATURE OE; QQKN
+0152  ; [.138E.0020.000A.0152][.0000.0159.0004.0152][.126B.0020.001F.0152] # LATIN CAPITAL LIGATURE OE; QQKN
+A74F  ; [.138E.0020.0004.A74F][.138E.0020.0004.A74F] # LATIN SMALL LETTER OO; QQKN
+A74E  ; [.138E.0020.000A.A74E][.138E.0020.000A.A74E] # LATIN CAPITAL LETTER OO; QQKN
+3375  ; [.138E.0020.001C.3375][.147B.0020.001D.3375] # SQUARE OV; QQKN
+1D0F  ; [.1392.0020.0002.1D0F] # LATIN LETTER SMALL CAPITAL O
+1D11  ; [.1393.0020.0002.1D11] # LATIN SMALL LETTER SIDEWAYS O
+0276  ; [.1394.0020.0002.0276] # LATIN LETTER SMALL CAPITAL OE
+1D14  ; [.1398.0020.0002.1D14] # LATIN SMALL LETTER TURNED OE
+1D13  ; [.1399.0020.0002.1D13] # LATIN SMALL LETTER SIDEWAYS O WITH STROKE
+0254  ; [.139A.0020.0002.0254] # LATIN SMALL LETTER OPEN O
+0186  ; [.139A.0020.0008.0186] # LATIN CAPITAL LETTER OPEN O
+1D53  ; [.139A.0020.0014.1D53] # MODIFIER LETTER SMALL OPEN O; QQK
+1D10  ; [.139E.0020.0002.1D10] # LATIN LETTER SMALL CAPITAL OPEN O
+1D12  ; [.139F.0020.0002.1D12] # LATIN SMALL LETTER SIDEWAYS OPEN O
+1D97  ; [.13A0.0020.0002.1D97] # LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK
+A74D  ; [.13A1.0020.0002.A74D] # LATIN SMALL LETTER O WITH LOOP
+A74C  ; [.13A1.0020.0008.A74C] # LATIN CAPITAL LETTER O WITH LOOP
+1D16  ; [.13A2.0020.0002.1D16] # LATIN SMALL LETTER TOP HALF O
+1D54  ; [.13A2.0020.0014.1D54] # MODIFIER LETTER SMALL TOP HALF O; QQK
+1D17  ; [.13A3.0020.0002.1D17] # LATIN SMALL LETTER BOTTOM HALF O
+1D55  ; [.13A3.0020.0014.1D55] # MODIFIER LETTER SMALL BOTTOM HALF O; QQK
+2C7A  ; [.13A4.0020.0002.2C7A] # LATIN SMALL LETTER O WITH LOW RING INSIDE
+0275  ; [.13A5.0020.0002.0275] # LATIN SMALL LETTER BARRED O
+019F  ; [.13A5.0020.0008.019F] # LATIN CAPITAL LETTER O WITH MIDDLE TILDE
+1DB1  ; [.13A5.0020.0014.1DB1] # MODIFIER LETTER SMALL BARRED O; QQK
+A74B  ; [.13A9.0020.0002.A74B] # LATIN SMALL LETTER O WITH LONG STROKE OVERLAY
+A74A  ; [.13A9.0020.0008.A74A] # LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY
+0277  ; [.13AA.0020.0002.0277] # LATIN SMALL LETTER CLOSED OMEGA
+0223  ; [.13AE.0020.0002.0223] # LATIN SMALL LETTER OU
+0222  ; [.13AE.0020.0008.0222] # LATIN CAPITAL LETTER OU
+1D3D  ; [.13AE.0020.001D.1D3D] # MODIFIER LETTER CAPITAL OU; QQK
+1D15  ; [.13B2.0020.0002.1D15] # LATIN LETTER SMALL CAPITAL OU
+0070  ; [.13B3.0020.0002.0070] # LATIN SMALL LETTER P
+FF50  ; [.13B3.0020.0003.FF50] # FULLWIDTH LATIN SMALL LETTER P; QQK
+24AB  ; [*02FF.0020.0004.24AB][.13B3.0020.0004.24AB][*0300.0020.001F.24AB] # PARENTHESIZED LATIN SMALL LETTER P; QQKN
+1D429 ; [.13B3.0020.0005.1D429] # MATHEMATICAL BOLD SMALL P; QQK
+1D45D ; [.13B3.0020.0005.1D45D] # MATHEMATICAL ITALIC SMALL P; QQK
+1D491 ; [.13B3.0020.0005.1D491] # MATHEMATICAL BOLD ITALIC SMALL P; QQK
+1D4C5 ; [.13B3.0020.0005.1D4C5] # MATHEMATICAL SCRIPT SMALL P; QQK
+1D4F9 ; [.13B3.0020.0005.1D4F9] # MATHEMATICAL BOLD SCRIPT SMALL P; QQK
+1D52D ; [.13B3.0020.0005.1D52D] # MATHEMATICAL FRAKTUR SMALL P; QQK
+1D561 ; [.13B3.0020.0005.1D561] # MATHEMATICAL DOUBLE-STRUCK SMALL P; QQK
+1D595 ; [.13B3.0020.0005.1D595] # MATHEMATICAL BOLD FRAKTUR SMALL P; QQK
+1D5C9 ; [.13B3.0020.0005.1D5C9] # MATHEMATICAL SANS-SERIF SMALL P; QQK
+1D5FD ; [.13B3.0020.0005.1D5FD] # MATHEMATICAL SANS-SERIF BOLD SMALL P; QQK
+1D631 ; [.13B3.0020.0005.1D631] # MATHEMATICAL SANS-SERIF ITALIC SMALL P; QQK
+1D665 ; [.13B3.0020.0005.1D665] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P; QQK
+1D699 ; [.13B3.0020.0005.1D699] # MATHEMATICAL MONOSPACE SMALL P; QQK
+24DF  ; [.13B3.0020.0006.24DF] # CIRCLED LATIN SMALL LETTER P; QQK
+0050  ; [.13B3.0020.0008.0050] # LATIN CAPITAL LETTER P
+FF30  ; [.13B3.0020.0009.FF30] # FULLWIDTH LATIN CAPITAL LETTER P; QQK
+1F11F ; [*02FF.0020.0004.1F11F][.13B3.0020.000A.1F11F][*0300.0020.001F.1F11F] # PARENTHESIZED LATIN CAPITAL LETTER P; QQKN
+2119  ; [.13B3.0020.000B.2119] # DOUBLE-STRUCK CAPITAL P; QQK
+1D40F ; [.13B3.0020.000B.1D40F] # MATHEMATICAL BOLD CAPITAL P; QQK
+1D443 ; [.13B3.0020.000B.1D443] # MATHEMATICAL ITALIC CAPITAL P; QQK
+1D477 ; [.13B3.0020.000B.1D477] # MATHEMATICAL BOLD ITALIC CAPITAL P; QQK
+1D4AB ; [.13B3.0020.000B.1D4AB] # MATHEMATICAL SCRIPT CAPITAL P; QQK
+1D4DF ; [.13B3.0020.000B.1D4DF] # MATHEMATICAL BOLD SCRIPT CAPITAL P; QQK
+1D513 ; [.13B3.0020.000B.1D513] # MATHEMATICAL FRAKTUR CAPITAL P; QQK
+1D57B ; [.13B3.0020.000B.1D57B] # MATHEMATICAL BOLD FRAKTUR CAPITAL P; QQK
+1D5AF ; [.13B3.0020.000B.1D5AF] # MATHEMATICAL SANS-SERIF CAPITAL P; QQK
+1D5E3 ; [.13B3.0020.000B.1D5E3] # MATHEMATICAL SANS-SERIF BOLD CAPITAL P; QQK
+1D617 ; [.13B3.0020.000B.1D617] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL P; QQK
+1D64B ; [.13B3.0020.000B.1D64B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P; QQK
+1D67F ; [.13B3.0020.000B.1D67F] # MATHEMATICAL MONOSPACE CAPITAL P; QQK
+24C5  ; [.13B3.0020.000C.24C5] # CIRCLED LATIN CAPITAL LETTER P; QQK
+1F15F ; [.13B3.0020.000C.1F15F] # NEGATIVE CIRCLED LATIN CAPITAL LETTER P; QQK
+1D56  ; [.13B3.0020.0014.1D56] # MODIFIER LETTER SMALL P; QQK
+1D3E  ; [.13B3.0020.001D.1D3E] # MODIFIER LETTER CAPITAL P; QQK
+1F13F ; [.13B3.0020.001D.1F13F] # SQUARED LATIN CAPITAL LETTER P; QQK
+1F17F ; [.13B3.0020.001D.1F17F] # NEGATIVE SQUARED LATIN CAPITAL LETTER P; QQK
+1F18A ; [.13B3.0020.001D.1F18A] # CROSSED NEGATIVE SQUARED LATIN CAPITAL LETTER P; QQK
+1E55  ; [.13B3.0020.0002.0070][.0000.0032.0002.0301] # LATIN SMALL LETTER P WITH ACUTE; QQCM
+1E54  ; [.13B3.0020.0008.0050][.0000.0032.0002.0301] # LATIN CAPITAL LETTER P WITH ACUTE; QQCM
+1E57  ; [.13B3.0020.0002.0070][.0000.0052.0002.0307] # LATIN SMALL LETTER P WITH DOT ABOVE; QQCM
+1E56  ; [.13B3.0020.0008.0050][.0000.0052.0002.0307] # LATIN CAPITAL LETTER P WITH DOT ABOVE; QQCM
+3380  ; [.13B3.0020.001C.3380][.120F.0020.001D.3380] # SQUARE PA AMPS; QQKN
+33A9  ; [.13B3.0020.001D.33A9][.120F.0020.001C.33A9] # SQUARE PA; QQKN
+1F18C ; [.13B3.0020.001D.1F18C][.120F.0020.001D.1F18C] # NEGATIVE SQUARED PA; QQKN
+3376  ; [.13B3.0020.001C.3376][.123D.0020.001C.3376] # SQUARE PC; QQKN
+338A  ; [.13B3.0020.001C.338A][.12A3.0020.001D.338A] # SQUARE PF; QQKN
+33D7  ; [.13B3.0020.001D.33D7][.12D3.0020.001D.33D7] # SQUARE PH; QQKN
+33D8  ; [.13B3.0020.001C.33D8][*0281.0020.001C.33D8][.135F.0020.001F.33D8][*0281.0020.001F.33D8] # SQUARE PM; QQKN
+33D9  ; [.13B3.0020.001D.33D9][.13B3.0020.001D.33D9][.135F.0020.001F.33D9] # SQUARE PPM; QQKN
+1F14E ; [.13B3.0020.001D.1F14E][.13B3.0020.001D.1F14E][.147B.0020.001F.1F14E] # SQUARED PPV; QQKN
+33DA  ; [.13B3.0020.001D.33DA][.13DA.0020.001D.33DA] # SQUARE PR; QQKN
+33B0  ; [.13B3.0020.001C.33B0][.1410.0020.001C.33B0] # SQUARE PS; QQKN
+3250  ; [.13B3.0020.001D.3250][.1433.0020.001D.3250][.126B.0020.001F.3250] # PARTNERSHIP SIGN; QQKN
+33B4  ; [.13B3.0020.001C.33B4][.147B.0020.001D.33B4] # SQUARE PV; QQKN
+33BA  ; [.13B3.0020.001C.33BA][.148D.0020.001D.33BA] # SQUARE PW; QQKN
+1D18  ; [.13B7.0020.0002.1D18] # LATIN LETTER SMALL CAPITAL P
+1D7D  ; [.13B8.0020.0002.1D7D] # LATIN SMALL LETTER P WITH STROKE
+2C63  ; [.13B8.0020.0008.2C63] # LATIN CAPITAL LETTER P WITH STROKE
+A751  ; [.13B9.0020.0002.A751] # LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER
+A750  ; [.13B9.0020.0008.A750] # LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER
+1D71  ; [.13BA.0020.0002.1D71] # LATIN SMALL LETTER P WITH MIDDLE TILDE
+1D88  ; [.13BB.0020.0002.1D88] # LATIN SMALL LETTER P WITH PALATAL HOOK
+01A5  ; [.13BC.0020.0002.01A5] # LATIN SMALL LETTER P WITH HOOK
+01A4  ; [.13BC.0020.0008.01A4] # LATIN CAPITAL LETTER P WITH HOOK
+A753  ; [.13C0.0020.0002.A753] # LATIN SMALL LETTER P WITH FLOURISH
+A752  ; [.13C0.0020.0008.A752] # LATIN CAPITAL LETTER P WITH FLOURISH
+A755  ; [.13C1.0020.0002.A755] # LATIN SMALL LETTER P WITH SQUIRREL TAIL
+A754  ; [.13C1.0020.0008.A754] # LATIN CAPITAL LETTER P WITH SQUIRREL TAIL
+A7FC  ; [.13C2.0020.0002.A7FC] # LATIN EPIGRAPHIC LETTER REVERSED P
+0278  ; [.13C3.0020.0002.0278] # LATIN SMALL LETTER PHI
+1DB2  ; [.13C3.0020.0014.1DB2] # MODIFIER LETTER SMALL PHI; QQK
+2C77  ; [.13C7.0020.0002.2C77] # LATIN SMALL LETTER TAILLESS PHI
+0071  ; [.13C8.0020.0002.0071] # LATIN SMALL LETTER Q
+FF51  ; [.13C8.0020.0003.FF51] # FULLWIDTH LATIN SMALL LETTER Q; QQK
+24AC  ; [*02FF.0020.0004.24AC][.13C8.0020.0004.24AC][*0300.0020.001F.24AC] # PARENTHESIZED LATIN SMALL LETTER Q; QQKN
+1D42A ; [.13C8.0020.0005.1D42A] # MATHEMATICAL BOLD SMALL Q; QQK
+1D45E ; [.13C8.0020.0005.1D45E] # MATHEMATICAL ITALIC SMALL Q; QQK
+1D492 ; [.13C8.0020.0005.1D492] # MATHEMATICAL BOLD ITALIC SMALL Q; QQK
+1D4C6 ; [.13C8.0020.0005.1D4C6] # MATHEMATICAL SCRIPT SMALL Q; QQK
+1D4FA ; [.13C8.0020.0005.1D4FA] # MATHEMATICAL BOLD SCRIPT SMALL Q; QQK
+1D52E ; [.13C8.0020.0005.1D52E] # MATHEMATICAL FRAKTUR SMALL Q; QQK
+1D562 ; [.13C8.0020.0005.1D562] # MATHEMATICAL DOUBLE-STRUCK SMALL Q; QQK
+1D596 ; [.13C8.0020.0005.1D596] # MATHEMATICAL BOLD FRAKTUR SMALL Q; QQK
+1D5CA ; [.13C8.0020.0005.1D5CA] # MATHEMATICAL SANS-SERIF SMALL Q; QQK
+1D5FE ; [.13C8.0020.0005.1D5FE] # MATHEMATICAL SANS-SERIF BOLD SMALL Q; QQK
+1D632 ; [.13C8.0020.0005.1D632] # MATHEMATICAL SANS-SERIF ITALIC SMALL Q; QQK
+1D666 ; [.13C8.0020.0005.1D666] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q; QQK
+1D69A ; [.13C8.0020.0005.1D69A] # MATHEMATICAL MONOSPACE SMALL Q; QQK
+24E0  ; [.13C8.0020.0006.24E0] # CIRCLED LATIN SMALL LETTER Q; QQK
+0051  ; [.13C8.0020.0008.0051] # LATIN CAPITAL LETTER Q
+FF31  ; [.13C8.0020.0009.FF31] # FULLWIDTH LATIN CAPITAL LETTER Q; QQK
+1F120 ; [*02FF.0020.0004.1F120][.13C8.0020.000A.1F120][*0300.0020.001F.1F120] # PARENTHESIZED LATIN CAPITAL LETTER Q; QQKN
+211A  ; [.13C8.0020.000B.211A] # DOUBLE-STRUCK CAPITAL Q; QQK
+1D410 ; [.13C8.0020.000B.1D410] # MATHEMATICAL BOLD CAPITAL Q; QQK
+1D444 ; [.13C8.0020.000B.1D444] # MATHEMATICAL ITALIC CAPITAL Q; QQK
+1D478 ; [.13C8.0020.000B.1D478] # MATHEMATICAL BOLD ITALIC CAPITAL Q; QQK
+1D4AC ; [.13C8.0020.000B.1D4AC] # MATHEMATICAL SCRIPT CAPITAL Q; QQK
+1D4E0 ; [.13C8.0020.000B.1D4E0] # MATHEMATICAL BOLD SCRIPT CAPITAL Q; QQK
+1D514 ; [.13C8.0020.000B.1D514] # MATHEMATICAL FRAKTUR CAPITAL Q; QQK
+1D57C ; [.13C8.0020.000B.1D57C] # MATHEMATICAL BOLD FRAKTUR CAPITAL Q; QQK
+1D5B0 ; [.13C8.0020.000B.1D5B0] # MATHEMATICAL SANS-SERIF CAPITAL Q; QQK
+1D5E4 ; [.13C8.0020.000B.1D5E4] # MATHEMATICAL SANS-SERIF BOLD CAPITAL Q; QQK
+1D618 ; [.13C8.0020.000B.1D618] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q; QQK
+1D64C ; [.13C8.0020.000B.1D64C] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q; QQK
+1D680 ; [.13C8.0020.000B.1D680] # MATHEMATICAL MONOSPACE CAPITAL Q; QQK
+24C6  ; [.13C8.0020.000C.24C6] # CIRCLED LATIN CAPITAL LETTER Q; QQK
+0239  ; [.13C8.0020.0004.0239][.13B3.0020.0004.0239] # LATIN SMALL LETTER QP DIGRAPH; QQKN
+A757  ; [.13CC.0020.0002.A757] # LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER
+A756  ; [.13CC.0020.0008.A756] # LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER
+A759  ; [.13CD.0020.0002.A759] # LATIN SMALL LETTER Q WITH DIAGONAL STROKE
+A758  ; [.13CD.0020.0008.A758] # LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE
+02A0  ; [.13CE.0020.0002.02A0] # LATIN SMALL LETTER Q WITH HOOK
+024B  ; [.13D2.0020.0002.024B] # LATIN SMALL LETTER Q WITH HOOK TAIL
+024A  ; [.13D2.0020.0008.024A] # LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL
+0138  ; [.13D6.0020.0002.0138] # LATIN SMALL LETTER KRA
+0072  ; [.13DA.0020.0002.0072] # LATIN SMALL LETTER R
+FF52  ; [.13DA.0020.0003.FF52] # FULLWIDTH LATIN SMALL LETTER R; QQK
+036C  ; [.13DA.0020.0004.036C] # COMBINING LATIN SMALL LETTER R; QQK
+1DCA  ; [.13DA.0020.0004.1DCA] # COMBINING LATIN SMALL LETTER R BELOW; QQK
+24AD  ; [*02FF.0020.0004.24AD][.13DA.0020.0004.24AD][*0300.0020.001F.24AD] # PARENTHESIZED LATIN SMALL LETTER R; QQKN
+1D42B ; [.13DA.0020.0005.1D42B] # MATHEMATICAL BOLD SMALL R; QQK
+1D45F ; [.13DA.0020.0005.1D45F] # MATHEMATICAL ITALIC SMALL R; QQK
+1D493 ; [.13DA.0020.0005.1D493] # MATHEMATICAL BOLD ITALIC SMALL R; QQK
+1D4C7 ; [.13DA.0020.0005.1D4C7] # MATHEMATICAL SCRIPT SMALL R; QQK
+1D4FB ; [.13DA.0020.0005.1D4FB] # MATHEMATICAL BOLD SCRIPT SMALL R; QQK
+1D52F ; [.13DA.0020.0005.1D52F] # MATHEMATICAL FRAKTUR SMALL R; QQK
+1D563 ; [.13DA.0020.0005.1D563] # MATHEMATICAL DOUBLE-STRUCK SMALL R; QQK
+1D597 ; [.13DA.0020.0005.1D597] # MATHEMATICAL BOLD FRAKTUR SMALL R; QQK
+1D5CB ; [.13DA.0020.0005.1D5CB] # MATHEMATICAL SANS-SERIF SMALL R; QQK
+1D5FF ; [.13DA.0020.0005.1D5FF] # MATHEMATICAL SANS-SERIF BOLD SMALL R; QQK
+1D633 ; [.13DA.0020.0005.1D633] # MATHEMATICAL SANS-SERIF ITALIC SMALL R; QQK
+1D667 ; [.13DA.0020.0005.1D667] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R; QQK
+1D69B ; [.13DA.0020.0005.1D69B] # MATHEMATICAL MONOSPACE SMALL R; QQK
+24E1  ; [.13DA.0020.0006.24E1] # CIRCLED LATIN SMALL LETTER R; QQK
+0052  ; [.13DA.0020.0008.0052] # LATIN CAPITAL LETTER R
+FF32  ; [.13DA.0020.0009.FF32] # FULLWIDTH LATIN CAPITAL LETTER R; QQK
+1F121 ; [*02FF.0020.0004.1F121][.13DA.0020.000A.1F121][*0300.0020.001F.1F121] # PARENTHESIZED LATIN CAPITAL LETTER R; QQKN
+211B  ; [.13DA.0020.000B.211B] # SCRIPT CAPITAL R; QQK
+211C  ; [.13DA.0020.000B.211C] # BLACK-LETTER CAPITAL R; QQK
+211D  ; [.13DA.0020.000B.211D] # DOUBLE-STRUCK CAPITAL R; QQK
+1D411 ; [.13DA.0020.000B.1D411] # MATHEMATICAL BOLD CAPITAL R; QQK
+1D445 ; [.13DA.0020.000B.1D445] # MATHEMATICAL ITALIC CAPITAL R; QQK
+1D479 ; [.13DA.0020.000B.1D479] # MATHEMATICAL BOLD ITALIC CAPITAL R; QQK
+1D4E1 ; [.13DA.0020.000B.1D4E1] # MATHEMATICAL BOLD SCRIPT CAPITAL R; QQK
+1D57D ; [.13DA.0020.000B.1D57D] # MATHEMATICAL BOLD FRAKTUR CAPITAL R; QQK
+1D5B1 ; [.13DA.0020.000B.1D5B1] # MATHEMATICAL SANS-SERIF CAPITAL R; QQK
+1D5E5 ; [.13DA.0020.000B.1D5E5] # MATHEMATICAL SANS-SERIF BOLD CAPITAL R; QQK
+1D619 ; [.13DA.0020.000B.1D619] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL R; QQK
+1D64D ; [.13DA.0020.000B.1D64D] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R; QQK
+1D681 ; [.13DA.0020.000B.1D681] # MATHEMATICAL MONOSPACE CAPITAL R; QQK
+24C7  ; [.13DA.0020.000C.24C7] # CIRCLED LATIN CAPITAL LETTER R; QQK
+1F12C ; [.13DA.0020.000C.1F12C] # CIRCLED ITALIC LATIN CAPITAL LETTER R; QQK
+02B3  ; [.13DA.0020.0014.02B3] # MODIFIER LETTER SMALL R; QQK
+1D63  ; [.13DA.0020.0015.1D63] # LATIN SUBSCRIPT SMALL LETTER R; QQK
+1D3F  ; [.13DA.0020.001D.1D3F] # MODIFIER LETTER CAPITAL R; QQK
+0155  ; [.13DA.0020.0002.0072][.0000.0032.0002.0301] # LATIN SMALL LETTER R WITH ACUTE; QQCM
+0154  ; [.13DA.0020.0008.0052][.0000.0032.0002.0301] # LATIN CAPITAL LETTER R WITH ACUTE; QQCM
+0159  ; [.13DA.0020.0002.0072][.0000.0041.0002.030C] # LATIN SMALL LETTER R WITH CARON; QQCM
+0158  ; [.13DA.0020.0008.0052][.0000.0041.0002.030C] # LATIN CAPITAL LETTER R WITH CARON; QQCM
+1E59  ; [.13DA.0020.0002.0072][.0000.0052.0002.0307] # LATIN SMALL LETTER R WITH DOT ABOVE; QQCM
+1E58  ; [.13DA.0020.0008.0052][.0000.0052.0002.0307] # LATIN CAPITAL LETTER R WITH DOT ABOVE; QQCM
+0157  ; [.13DA.0020.0002.0072][.0000.0056.0002.0327] # LATIN SMALL LETTER R WITH CEDILLA; QQCM
+0156  ; [.13DA.0020.0008.0052][.0000.0056.0002.0327] # LATIN CAPITAL LETTER R WITH CEDILLA; QQCM
+0211  ; [.13DA.0020.0002.0072][.0000.0065.0002.030F] # LATIN SMALL LETTER R WITH DOUBLE GRAVE; QQCM
+0210  ; [.13DA.0020.0008.0052][.0000.0065.0002.030F] # LATIN CAPITAL LETTER R WITH DOUBLE GRAVE; QQCM
+0213  ; [.13DA.0020.0002.0072][.0000.0067.0002.0311] # LATIN SMALL LETTER R WITH INVERTED BREVE; QQCM
+0212  ; [.13DA.0020.0008.0052][.0000.0067.0002.0311] # LATIN CAPITAL LETTER R WITH INVERTED BREVE; QQCM
+1E5B  ; [.13DA.0020.0002.0072][.0000.0070.0002.0323] # LATIN SMALL LETTER R WITH DOT BELOW; QQCM
+1E5A  ; [.13DA.0020.0008.0052][.0000.0070.0002.0323] # LATIN CAPITAL LETTER R WITH DOT BELOW; QQCM
+1E5D  ; [.13DA.0020.0002.0072][.0000.0070.0002.0323][.0000.005B.0002.0304] # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON; QQCM
+1E5C  ; [.13DA.0020.0008.0052][.0000.0070.0002.0323][.0000.005B.0002.0304] # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON; QQCM
+1E5F  ; [.13DA.0020.0002.0072][.0000.007B.0002.0331] # LATIN SMALL LETTER R WITH LINE BELOW; QQCM
+1E5E  ; [.13DA.0020.0008.0052][.0000.007B.0002.0331] # LATIN CAPITAL LETTER R WITH LINE BELOW; QQCM
+A783  ; [.13DA.0020.0004.A783][.0000.015A.0004.A783] # LATIN SMALL LETTER INSULAR R; QQKN
+A782  ; [.13DA.0020.000A.A782][.0000.015A.0004.A782] # LATIN CAPITAL LETTER INSULAR R; QQKN
+33AD  ; [.13DA.0020.001C.33AD][.120F.0020.001C.33AD][.1250.0020.001F.33AD] # SQUARE RAD; QQKN
+33AE  ; [.13DA.0020.001C.33AE][.120F.0020.001C.33AE][.1250.0020.001F.33AE][*055F.0020.001F.33AE][.1410.0020.001F.33AE] # SQUARE RAD OVER S; QQKN
+33AF  ; [.13DA.0020.001C.33AF][.120F.0020.001C.33AF][.1250.0020.001F.33AF][*055F.0020.001F.33AF][.1410.0020.001F.33AF][.1207.0020.001F.33AF] # SQUARE RAD OVER S SQUARED; QQKN
+20A8  ; [.13DA.0020.000A.20A8][.1410.0020.0004.20A8] # RUPEE SIGN; QQKN
+0280  ; [.13DE.0020.0002.0280] # LATIN LETTER SMALL CAPITAL R
+1DE2  ; [.13DE.0020.0004.1DE2] # COMBINING LATIN LETTER SMALL CAPITAL R; QQK
+01A6  ; [.13DE.0020.0008.01A6] # LATIN LETTER YR
+A75B  ; [.13E2.0020.0002.A75B] # LATIN SMALL LETTER R ROTUNDA
+1DE3  ; [.13E2.0020.0004.1DE3] # COMBINING LATIN SMALL LETTER R ROTUNDA; QQK
+A75A  ; [.13E2.0020.0008.A75A] # LATIN CAPITAL LETTER R ROTUNDA
+1D19  ; [.13E3.0020.0002.1D19] # LATIN LETTER SMALL CAPITAL REVERSED R
+024D  ; [.13E4.0020.0002.024D] # LATIN SMALL LETTER R WITH STROKE
+024C  ; [.13E4.0020.0008.024C] # LATIN CAPITAL LETTER R WITH STROKE
+1D72  ; [.13E8.0020.0002.1D72] # LATIN SMALL LETTER R WITH MIDDLE TILDE
+0279  ; [.13E9.0020.0002.0279] # LATIN SMALL LETTER TURNED R
+02B4  ; [.13E9.0020.0014.02B4] # MODIFIER LETTER SMALL TURNED R; QQK
+1D1A  ; [.13ED.0020.0002.1D1A] # LATIN LETTER SMALL CAPITAL TURNED R
+027A  ; [.13EE.0020.0002.027A] # LATIN SMALL LETTER TURNED R WITH LONG LEG
+1D89  ; [.13F2.0020.0002.1D89] # LATIN SMALL LETTER R WITH PALATAL HOOK
+027B  ; [.13F3.0020.0002.027B] # LATIN SMALL LETTER TURNED R WITH HOOK
+02B5  ; [.13F3.0020.0014.02B5] # MODIFIER LETTER SMALL TURNED R WITH HOOK; QQK
+2C79  ; [.13F7.0020.0002.2C79] # LATIN SMALL LETTER TURNED R WITH TAIL
+027C  ; [.13F8.0020.0002.027C] # LATIN SMALL LETTER R WITH LONG LEG
+027D  ; [.13FC.0020.0002.027D] # LATIN SMALL LETTER R WITH TAIL
+2C64  ; [.13FC.0020.0008.2C64] # LATIN CAPITAL LETTER R WITH TAIL
+027E  ; [.1400.0020.0002.027E] # LATIN SMALL LETTER R WITH FISHHOOK
+1D73  ; [.1404.0020.0002.1D73] # LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE
+027F  ; [.1405.0020.0002.027F] # LATIN SMALL LETTER REVERSED R WITH FISHHOOK
+0281  ; [.1409.0020.0002.0281] # LATIN LETTER SMALL CAPITAL INVERTED R
+02B6  ; [.1409.0020.0014.02B6] # MODIFIER LETTER SMALL CAPITAL INVERTED R; QQK
+A775  ; [.140D.0020.0002.A775] # LATIN SMALL LETTER RUM
+A776  ; [.140E.0020.0002.A776] # LATIN LETTER SMALL CAPITAL RUM
+A75D  ; [.140F.0020.0002.A75D] # LATIN SMALL LETTER RUM ROTUNDA
+A75C  ; [.140F.0020.0008.A75C] # LATIN CAPITAL LETTER RUM ROTUNDA
+0073  ; [.1410.0020.0002.0073] # LATIN SMALL LETTER S
+FF53  ; [.1410.0020.0003.FF53] # FULLWIDTH LATIN SMALL LETTER S; QQK
+1DE4  ; [.1410.0020.0004.1DE4] # COMBINING LATIN SMALL LETTER S; QQK
+24AE  ; [*02FF.0020.0004.24AE][.1410.0020.0004.24AE][*0300.0020.001F.24AE] # PARENTHESIZED LATIN SMALL LETTER S; QQKN
+1D42C ; [.1410.0020.0005.1D42C] # MATHEMATICAL BOLD SMALL S; QQK
+1D460 ; [.1410.0020.0005.1D460] # MATHEMATICAL ITALIC SMALL S; QQK
+1D494 ; [.1410.0020.0005.1D494] # MATHEMATICAL BOLD ITALIC SMALL S; QQK
+1D4C8 ; [.1410.0020.0005.1D4C8] # MATHEMATICAL SCRIPT SMALL S; QQK
+1D4FC ; [.1410.0020.0005.1D4FC] # MATHEMATICAL BOLD SCRIPT SMALL S; QQK
+1D530 ; [.1410.0020.0005.1D530] # MATHEMATICAL FRAKTUR SMALL S; QQK
+1D564 ; [.1410.0020.0005.1D564] # MATHEMATICAL DOUBLE-STRUCK SMALL S; QQK
+1D598 ; [.1410.0020.0005.1D598] # MATHEMATICAL BOLD FRAKTUR SMALL S; QQK
+1D5CC ; [.1410.0020.0005.1D5CC] # MATHEMATICAL SANS-SERIF SMALL S; QQK
+1D600 ; [.1410.0020.0005.1D600] # MATHEMATICAL SANS-SERIF BOLD SMALL S; QQK
+1D634 ; [.1410.0020.0005.1D634] # MATHEMATICAL SANS-SERIF ITALIC SMALL S; QQK
+1D668 ; [.1410.0020.0005.1D668] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S; QQK
+1D69C ; [.1410.0020.0005.1D69C] # MATHEMATICAL MONOSPACE SMALL S; QQK
+24E2  ; [.1410.0020.0006.24E2] # CIRCLED LATIN SMALL LETTER S; QQK
+0053  ; [.1410.0020.0008.0053] # LATIN CAPITAL LETTER S
+FF33  ; [.1410.0020.0009.FF33] # FULLWIDTH LATIN CAPITAL LETTER S; QQK
+1F122 ; [*02FF.0020.0004.1F122][.1410.0020.000A.1F122][*0300.0020.001F.1F122] # PARENTHESIZED LATIN CAPITAL LETTER S; QQKN
+1F12A ; [*0347.0020.0004.1F12A][.1410.0020.000A.1F12A][*0348.0020.001F.1F12A] # TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S; QQKN
+1D412 ; [.1410.0020.000B.1D412] # MATHEMATICAL BOLD CAPITAL S; QQK
+1D446 ; [.1410.0020.000B.1D446] # MATHEMATICAL ITALIC CAPITAL S; QQK
+1D47A ; [.1410.0020.000B.1D47A] # MATHEMATICAL BOLD ITALIC CAPITAL S; QQK
+1D4AE ; [.1410.0020.000B.1D4AE] # MATHEMATICAL SCRIPT CAPITAL S; QQK
+1D4E2 ; [.1410.0020.000B.1D4E2] # MATHEMATICAL BOLD SCRIPT CAPITAL S; QQK
+1D516 ; [.1410.0020.000B.1D516] # MATHEMATICAL FRAKTUR CAPITAL S; QQK
+1D54A ; [.1410.0020.000B.1D54A] # MATHEMATICAL DOUBLE-STRUCK CAPITAL S; QQK
+1D57E ; [.1410.0020.000B.1D57E] # MATHEMATICAL BOLD FRAKTUR CAPITAL S; QQK
+1D5B2 ; [.1410.0020.000B.1D5B2] # MATHEMATICAL SANS-SERIF CAPITAL S; QQK
+1D5E6 ; [.1410.0020.000B.1D5E6] # MATHEMATICAL SANS-SERIF BOLD CAPITAL S; QQK
+1D61A ; [.1410.0020.000B.1D61A] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL S; QQK
+1D64E ; [.1410.0020.000B.1D64E] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S; QQK
+1D682 ; [.1410.0020.000B.1D682] # MATHEMATICAL MONOSPACE CAPITAL S; QQK
+24C8  ; [.1410.0020.000C.24C8] # CIRCLED LATIN CAPITAL LETTER S; QQK
+02E2  ; [.1410.0020.0014.02E2] # MODIFIER LETTER SMALL S; QQK
+1F142 ; [.1410.0020.001D.1F142] # SQUARED LATIN CAPITAL LETTER S; QQK
+015B  ; [.1410.0020.0002.0073][.0000.0032.0002.0301] # LATIN SMALL LETTER S WITH ACUTE; QQCM
+015A  ; [.1410.0020.0008.0053][.0000.0032.0002.0301] # LATIN CAPITAL LETTER S WITH ACUTE; QQCM
+1E65  ; [.1410.0020.0002.0073][.0000.0032.0002.0301][.0000.0052.0002.0307] # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE; QQCM
+1E64  ; [.1410.0020.0008.0053][.0000.0032.0002.0301][.0000.0052.0002.0307] # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE; QQCM
+015D  ; [.1410.0020.0002.0073][.0000.003C.0002.0302] # LATIN SMALL LETTER S WITH CIRCUMFLEX; QQCM
+015C  ; [.1410.0020.0008.0053][.0000.003C.0002.0302] # LATIN CAPITAL LETTER S WITH CIRCUMFLEX; QQCM
+0161  ; [.1410.0020.0002.0073][.0000.0041.0002.030C] # LATIN SMALL LETTER S WITH CARON; QQCM
+0160  ; [.1410.0020.0008.0053][.0000.0041.0002.030C] # LATIN CAPITAL LETTER S WITH CARON; QQCM
+1E67  ; [.1410.0020.0002.0073][.0000.0041.0002.030C][.0000.0052.0002.0307] # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE; QQCM
+1E66  ; [.1410.0020.0008.0053][.0000.0041.0002.030C][.0000.0052.0002.0307] # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE; QQCM
+1E61  ; [.1410.0020.0002.0073][.0000.0052.0002.0307] # LATIN SMALL LETTER S WITH DOT ABOVE; QQCM
+1E60  ; [.1410.0020.0008.0053][.0000.0052.0002.0307] # LATIN CAPITAL LETTER S WITH DOT ABOVE; QQCM
+015F  ; [.1410.0020.0002.0073][.0000.0056.0002.0327] # LATIN SMALL LETTER S WITH CEDILLA; QQCM
+015E  ; [.1410.0020.0008.0053][.0000.0056.0002.0327] # LATIN CAPITAL LETTER S WITH CEDILLA; QQCM
+1E63  ; [.1410.0020.0002.0073][.0000.0070.0002.0323] # LATIN SMALL LETTER S WITH DOT BELOW; QQCM
+1E62  ; [.1410.0020.0008.0053][.0000.0070.0002.0323] # LATIN CAPITAL LETTER S WITH DOT BELOW; QQCM
+1E69  ; [.1410.0020.0002.0073][.0000.0070.0002.0323][.0000.0052.0002.0307] # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE; QQCM
+1E68  ; [.1410.0020.0008.0053][.0000.0070.0002.0323][.0000.0052.0002.0307] # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE; QQCM
+0219  ; [.1410.0020.0002.0073][.0000.0077.0002.0326] # LATIN SMALL LETTER S WITH COMMA BELOW; QQCM
+0218  ; [.1410.0020.0008.0053][.0000.0077.0002.0326] # LATIN CAPITAL LETTER S WITH COMMA BELOW; QQCM
+017F  ; [.1410.0020.0004.017F][.0000.015A.0004.017F] # LATIN SMALL LETTER LONG S; QQKN
+1DE5  ; [.1410.0020.0004.1DE5][.0000.015A.0004.1DE5] # COMBINING LATIN SMALL LETTER LONG S; QQKN
+A785  ; [.1410.0020.0004.A785][.0000.015A.0004.A785] # LATIN SMALL LETTER INSULAR S; QQKN
+A784  ; [.1410.0020.000A.A784][.0000.015A.0004.A784] # LATIN CAPITAL LETTER INSULAR S; QQKN
+1E9B  ; [.1410.0020.0004.1E9B][.0000.015A.0004.1E9B][.0000.0052.0002.1E9B] # LATIN SMALL LETTER LONG S WITH DOT ABOVE; QQKN
+1F18D ; [.1410.0020.001D.1F18D][.120F.0020.001D.1F18D] # NEGATIVE SQUARED SA; QQKN
+1F14C ; [.1410.0020.001D.1F14C][.1250.0020.001D.1F14C] # SQUARED SD; QQKN
+2120  ; [.1410.0020.0014.2120][.135F.0020.0014.2120] # SERVICE MARK; QQKN
+33DB  ; [.1410.0020.001C.33DB][.13DA.0020.001C.33DB] # SQUARE SR; QQKN
+1F14D ; [.1410.0020.001D.1F14D][.1410.0020.001D.1F14D] # SQUARED SS; QQKN
+00DF  ; [.1410.0020.0004.00DF][.0000.0159.0004.00DF][.1410.0020.001F.00DF] # LATIN SMALL LETTER SHARP S; QQKN
+1E9E  ; [.1410.0020.000A.1E9E][.0000.0159.0004.1E9E][.1410.0020.001F.1E9E] # LATIN CAPITAL LETTER SHARP S; QQKN
+FB06  ; [.1410.0020.0004.FB06][.1433.0020.0004.FB06] # LATIN SMALL LIGATURE ST; QQKN
+FB05  ; [.1410.0020.0004.FB05][.0000.015A.0004.FB05][.1433.0020.001F.FB05] # LATIN SMALL LIGATURE LONG S T; QQKN
+33DC  ; [.1410.0020.001D.33DC][.147B.0020.001C.33DC] # SQUARE SV; QQKN
+A731  ; [.1414.0020.0002.A731] # LATIN LETTER SMALL CAPITAL S
+1D74  ; [.1415.0020.0002.1D74] # LATIN SMALL LETTER S WITH MIDDLE TILDE
+1D8A  ; [.1416.0020.0002.1D8A] # LATIN SMALL LETTER S WITH PALATAL HOOK
+0282  ; [.1417.0020.0002.0282] # LATIN SMALL LETTER S WITH HOOK
+1DB3  ; [.1417.0020.0014.1DB3] # MODIFIER LETTER SMALL S WITH HOOK; QQK
+023F  ; [.141B.0020.0002.023F] # LATIN SMALL LETTER S WITH SWASH TAIL
+2C7E  ; [.141B.0020.0008.2C7E] # LATIN CAPITAL LETTER S WITH SWASH TAIL
+1E9C  ; [.141F.0020.0002.1E9C] # LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE
+1E9D  ; [.1420.0020.0002.1E9D] # LATIN SMALL LETTER LONG S WITH HIGH STROKE
+0283  ; [.1421.0020.0002.0283] # LATIN SMALL LETTER ESH
+01A9  ; [.1421.0020.0008.01A9] # LATIN CAPITAL LETTER ESH
+1DB4  ; [.1421.0020.0014.1DB4] # MODIFIER LETTER SMALL ESH; QQK
+1D8B  ; [.1425.0020.0002.1D8B] # LATIN SMALL LETTER ESH WITH PALATAL HOOK
+01AA  ; [.1426.0020.0002.01AA] # LATIN LETTER REVERSED ESH LOOP
+0285  ; [.142A.0020.0002.0285] # LATIN SMALL LETTER SQUAT REVERSED ESH
+1D98  ; [.142E.0020.0002.1D98] # LATIN SMALL LETTER ESH WITH RETROFLEX HOOK
+0286  ; [.142F.0020.0002.0286] # LATIN SMALL LETTER ESH WITH CURL
+0074  ; [.1433.0020.0002.0074] # LATIN SMALL LETTER T
+FF54  ; [.1433.0020.0003.FF54] # FULLWIDTH LATIN SMALL LETTER T; QQK
+036D  ; [.1433.0020.0004.036D] # COMBINING LATIN SMALL LETTER T; QQK
+24AF  ; [*02FF.0020.0004.24AF][.1433.0020.0004.24AF][*0300.0020.001F.24AF] # PARENTHESIZED LATIN SMALL LETTER T; QQKN
+1D42D ; [.1433.0020.0005.1D42D] # MATHEMATICAL BOLD SMALL T; QQK
+1D461 ; [.1433.0020.0005.1D461] # MATHEMATICAL ITALIC SMALL T; QQK
+1D495 ; [.1433.0020.0005.1D495] # MATHEMATICAL BOLD ITALIC SMALL T; QQK
+1D4C9 ; [.1433.0020.0005.1D4C9] # MATHEMATICAL SCRIPT SMALL T; QQK
+1D4FD ; [.1433.0020.0005.1D4FD] # MATHEMATICAL BOLD SCRIPT SMALL T; QQK
+1D531 ; [.1433.0020.0005.1D531] # MATHEMATICAL FRAKTUR SMALL T; QQK
+1D565 ; [.1433.0020.0005.1D565] # MATHEMATICAL DOUBLE-STRUCK SMALL T; QQK
+1D599 ; [.1433.0020.0005.1D599] # MATHEMATICAL BOLD FRAKTUR SMALL T; QQK
+1D5CD ; [.1433.0020.0005.1D5CD] # MATHEMATICAL SANS-SERIF SMALL T; QQK
+1D601 ; [.1433.0020.0005.1D601] # MATHEMATICAL SANS-SERIF BOLD SMALL T; QQK
+1D635 ; [.1433.0020.0005.1D635] # MATHEMATICAL SANS-SERIF ITALIC SMALL T; QQK
+1D669 ; [.1433.0020.0005.1D669] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T; QQK
+1D69D ; [.1433.0020.0005.1D69D] # MATHEMATICAL MONOSPACE SMALL T; QQK
+24E3  ; [.1433.0020.0006.24E3] # CIRCLED LATIN SMALL LETTER T; QQK
+0054  ; [.1433.0020.0008.0054] # LATIN CAPITAL LETTER T
+FF34  ; [.1433.0020.0009.FF34] # FULLWIDTH LATIN CAPITAL LETTER T; QQK
+1F123 ; [*02FF.0020.0004.1F123][.1433.0020.000A.1F123][*0300.0020.001F.1F123] # PARENTHESIZED LATIN CAPITAL LETTER T; QQKN
+1D413 ; [.1433.0020.000B.1D413] # MATHEMATICAL BOLD CAPITAL T; QQK
+1D447 ; [.1433.0020.000B.1D447] # MATHEMATICAL ITALIC CAPITAL T; QQK
+1D47B ; [.1433.0020.000B.1D47B] # MATHEMATICAL BOLD ITALIC CAPITAL T; QQK
+1D4AF ; [.1433.0020.000B.1D4AF] # MATHEMATICAL SCRIPT CAPITAL T; QQK
+1D4E3 ; [.1433.0020.000B.1D4E3] # MATHEMATICAL BOLD SCRIPT CAPITAL T; QQK
+1D517 ; [.1433.0020.000B.1D517] # MATHEMATICAL FRAKTUR CAPITAL T; QQK
+1D54B ; [.1433.0020.000B.1D54B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL T; QQK
+1D57F ; [.1433.0020.000B.1D57F] # MATHEMATICAL BOLD FRAKTUR CAPITAL T; QQK
+1D5B3 ; [.1433.0020.000B.1D5B3] # MATHEMATICAL SANS-SERIF CAPITAL T; QQK
+1D5E7 ; [.1433.0020.000B.1D5E7] # MATHEMATICAL SANS-SERIF BOLD CAPITAL T; QQK
+1D61B ; [.1433.0020.000B.1D61B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL T; QQK
+1D64F ; [.1433.0020.000B.1D64F] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T; QQK
+1D683 ; [.1433.0020.000B.1D683] # MATHEMATICAL MONOSPACE CAPITAL T; QQK
+24C9  ; [.1433.0020.000C.24C9] # CIRCLED LATIN CAPITAL LETTER T; QQK
+1D57  ; [.1433.0020.0014.1D57] # MODIFIER LETTER SMALL T; QQK
+1D40  ; [.1433.0020.001D.1D40] # MODIFIER LETTER CAPITAL T; QQK
+0165  ; [.1433.0020.0002.0074][.0000.0041.0002.030C] # LATIN SMALL LETTER T WITH CARON; QQCM
+0164  ; [.1433.0020.0008.0054][.0000.0041.0002.030C] # LATIN CAPITAL LETTER T WITH CARON; QQCM
+1E97  ; [.1433.0020.0002.0074][.0000.0047.0002.0308] # LATIN SMALL LETTER T WITH DIAERESIS; QQCM
+1E6B  ; [.1433.0020.0002.0074][.0000.0052.0002.0307] # LATIN SMALL LETTER T WITH DOT ABOVE; QQCM
+1E6A  ; [.1433.0020.0008.0054][.0000.0052.0002.0307] # LATIN CAPITAL LETTER T WITH DOT ABOVE; QQCM
+0163  ; [.1433.0020.0002.0074][.0000.0056.0002.0327] # LATIN SMALL LETTER T WITH CEDILLA; QQCM
+0162  ; [.1433.0020.0008.0054][.0000.0056.0002.0327] # LATIN CAPITAL LETTER T WITH CEDILLA; QQCM
+1E6D  ; [.1433.0020.0002.0074][.0000.0070.0002.0323] # LATIN SMALL LETTER T WITH DOT BELOW; QQCM
+1E6C  ; [.1433.0020.0008.0054][.0000.0070.0002.0323] # LATIN CAPITAL LETTER T WITH DOT BELOW; QQCM
+021B  ; [.1433.0020.0002.0074][.0000.0077.0002.0326] # LATIN SMALL LETTER T WITH COMMA BELOW; QQCM
+021A  ; [.1433.0020.0008.0054][.0000.0077.0002.0326] # LATIN CAPITAL LETTER T WITH COMMA BELOW; QQCM
+1E71  ; [.1433.0020.0002.0074][.0000.0078.0002.032D] # LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW; QQCM
+1E70  ; [.1433.0020.0008.0054][.0000.0078.0002.032D] # LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW; QQCM
+1E6F  ; [.1433.0020.0002.0074][.0000.007B.0002.0331] # LATIN SMALL LETTER T WITH LINE BELOW; QQCM
+1E6E  ; [.1433.0020.0008.0054][.0000.007B.0002.0331] # LATIN CAPITAL LETTER T WITH LINE BELOW; QQCM
+A787  ; [.1433.0020.0004.A787][.0000.015A.0004.A787] # LATIN SMALL LETTER INSULAR T; QQKN
+A786  ; [.1433.0020.000A.A786][.0000.015A.0004.A786] # LATIN CAPITAL LETTER INSULAR T; QQKN
+02A8  ; [.1433.0020.0004.02A8][.124A.0020.0004.02A8] # LATIN SMALL LETTER TC DIGRAPH WITH CURL; QQKN
+2121  ; [.1433.0020.000A.2121][.126B.0020.000A.2121][.1330.0020.001F.2121] # TELEPHONE SIGN; QQKN
+1D7A  ; [.1433.0020.0004.1D7A][.0000.0159.0004.1D7A][.12D3.0020.001F.1D7A] # LATIN SMALL LETTER TH WITH STRIKETHROUGH; QQKN
+3394  ; [.1433.0020.001D.3394][.12D3.0020.001D.3394][.14AD.0020.001F.3394] # SQUARE THZ; QQKN
+2122  ; [.1433.0020.0014.2122][.135F.0020.0014.2122] # TRADE MARK SIGN; QQKN
+01BE  ; [.1433.0020.0004.01BE][.1410.0020.0004.01BE] # LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE; QQKN
+02A6  ; [.1433.0020.0004.02A6][.1410.0020.0004.02A6] # LATIN SMALL LETTER TS DIGRAPH; QQKN
+02A7  ; [.1433.0020.0004.02A7][.1421.0020.0004.02A7] # LATIN SMALL LETTER TESH DIGRAPH; QQKN
+A729  ; [.1433.0020.0004.A729][.14AD.0020.0004.A729] # LATIN SMALL LETTER TZ; QQKN
+A728  ; [.1433.0020.000A.A728][.14AD.0020.0004.A728] # LATIN CAPITAL LETTER TZ; QQKN
+1D1B  ; [.1437.0020.0002.1D1B] # LATIN LETTER SMALL CAPITAL T
+0167  ; [.1438.0020.0002.0167] # LATIN SMALL LETTER T WITH STROKE
+0166  ; [.1438.0020.0008.0166] # LATIN CAPITAL LETTER T WITH STROKE
+2C66  ; [.143C.0020.0002.2C66] # LATIN SMALL LETTER T WITH DIAGONAL STROKE
+023E  ; [.143C.0020.0008.023E] # LATIN CAPITAL LETTER T WITH DIAGONAL STROKE
+1D75  ; [.143D.0020.0002.1D75] # LATIN SMALL LETTER T WITH MIDDLE TILDE
+01AB  ; [.143E.0020.0002.01AB] # LATIN SMALL LETTER T WITH PALATAL HOOK
+1DB5  ; [.143E.0020.0014.1DB5] # MODIFIER LETTER SMALL T WITH PALATAL HOOK; QQK
+01AD  ; [.1442.0020.0002.01AD] # LATIN SMALL LETTER T WITH HOOK
+01AC  ; [.1442.0020.0008.01AC] # LATIN CAPITAL LETTER T WITH HOOK
+0288  ; [.1446.0020.0002.0288] # LATIN SMALL LETTER T WITH RETROFLEX HOOK
+01AE  ; [.1446.0020.0008.01AE] # LATIN CAPITAL LETTER T WITH RETROFLEX HOOK
+0236  ; [.144A.0020.0002.0236] # LATIN SMALL LETTER T WITH CURL
+A777  ; [.144E.0020.0002.A777] # LATIN SMALL LETTER TUM
+0287  ; [.144F.0020.0002.0287] # LATIN SMALL LETTER TURNED T
+0075  ; [.1453.0020.0002.0075] # LATIN SMALL LETTER U
+FF55  ; [.1453.0020.0003.FF55] # FULLWIDTH LATIN SMALL LETTER U; QQK
+0367  ; [.1453.0020.0004.0367] # COMBINING LATIN SMALL LETTER U; QQK
+24B0  ; [*02FF.0020.0004.24B0][.1453.0020.0004.24B0][*0300.0020.001F.24B0] # PARENTHESIZED LATIN SMALL LETTER U; QQKN
+1D42E ; [.1453.0020.0005.1D42E] # MATHEMATICAL BOLD SMALL U; QQK
+1D462 ; [.1453.0020.0005.1D462] # MATHEMATICAL ITALIC SMALL U; QQK
+1D496 ; [.1453.0020.0005.1D496] # MATHEMATICAL BOLD ITALIC SMALL U; QQK
+1D4CA ; [.1453.0020.0005.1D4CA] # MATHEMATICAL SCRIPT SMALL U; QQK
+1D4FE ; [.1453.0020.0005.1D4FE] # MATHEMATICAL BOLD SCRIPT SMALL U; QQK
+1D532 ; [.1453.0020.0005.1D532] # MATHEMATICAL FRAKTUR SMALL U; QQK
+1D566 ; [.1453.0020.0005.1D566] # MATHEMATICAL DOUBLE-STRUCK SMALL U; QQK
+1D59A ; [.1453.0020.0005.1D59A] # MATHEMATICAL BOLD FRAKTUR SMALL U; QQK
+1D5CE ; [.1453.0020.0005.1D5CE] # MATHEMATICAL SANS-SERIF SMALL U; QQK
+1D602 ; [.1453.0020.0005.1D602] # MATHEMATICAL SANS-SERIF BOLD SMALL U; QQK
+1D636 ; [.1453.0020.0005.1D636] # MATHEMATICAL SANS-SERIF ITALIC SMALL U; QQK
+1D66A ; [.1453.0020.0005.1D66A] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U; QQK
+1D69E ; [.1453.0020.0005.1D69E] # MATHEMATICAL MONOSPACE SMALL U; QQK
+24E4  ; [.1453.0020.0006.24E4] # CIRCLED LATIN SMALL LETTER U; QQK
+0055  ; [.1453.0020.0008.0055] # LATIN CAPITAL LETTER U
+FF35  ; [.1453.0020.0009.FF35] # FULLWIDTH LATIN CAPITAL LETTER U; QQK
+1F124 ; [*02FF.0020.0004.1F124][.1453.0020.000A.1F124][*0300.0020.001F.1F124] # PARENTHESIZED LATIN CAPITAL LETTER U; QQKN
+1D414 ; [.1453.0020.000B.1D414] # MATHEMATICAL BOLD CAPITAL U; QQK
+1D448 ; [.1453.0020.000B.1D448] # MATHEMATICAL ITALIC CAPITAL U; QQK
+1D47C ; [.1453.0020.000B.1D47C] # MATHEMATICAL BOLD ITALIC CAPITAL U; QQK
+1D4B0 ; [.1453.0020.000B.1D4B0] # MATHEMATICAL SCRIPT CAPITAL U; QQK
+1D4E4 ; [.1453.0020.000B.1D4E4] # MATHEMATICAL BOLD SCRIPT CAPITAL U; QQK
+1D518 ; [.1453.0020.000B.1D518] # MATHEMATICAL FRAKTUR CAPITAL U; QQK
+1D54C ; [.1453.0020.000B.1D54C] # MATHEMATICAL DOUBLE-STRUCK CAPITAL U; QQK
+1D580 ; [.1453.0020.000B.1D580] # MATHEMATICAL BOLD FRAKTUR CAPITAL U; QQK
+1D5B4 ; [.1453.0020.000B.1D5B4] # MATHEMATICAL SANS-SERIF CAPITAL U; QQK
+1D5E8 ; [.1453.0020.000B.1D5E8] # MATHEMATICAL SANS-SERIF BOLD CAPITAL U; QQK
+1D61C ; [.1453.0020.000B.1D61C] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL U; QQK
+1D650 ; [.1453.0020.000B.1D650] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U; QQK
+1D684 ; [.1453.0020.000B.1D684] # MATHEMATICAL MONOSPACE CAPITAL U; QQK
+24CA  ; [.1453.0020.000C.24CA] # CIRCLED LATIN CAPITAL LETTER U; QQK
+1D58  ; [.1453.0020.0014.1D58] # MODIFIER LETTER SMALL U; QQK
+1D64  ; [.1453.0020.0015.1D64] # LATIN SUBSCRIPT SMALL LETTER U; QQK
+1D41  ; [.1453.0020.001D.1D41] # MODIFIER LETTER CAPITAL U; QQK
+00FA  ; [.1453.0020.0002.0075][.0000.0032.0002.0301] # LATIN SMALL LETTER U WITH ACUTE; QQCM
+00DA  ; [.1453.0020.0008.0055][.0000.0032.0002.0301] # LATIN CAPITAL LETTER U WITH ACUTE; QQCM
+00F9  ; [.1453.0020.0002.0075][.0000.0035.0002.0300] # LATIN SMALL LETTER U WITH GRAVE; QQCM
+00D9  ; [.1453.0020.0008.0055][.0000.0035.0002.0300] # LATIN CAPITAL LETTER U WITH GRAVE; QQCM
+016D  ; [.1453.0020.0002.0075][.0000.0037.0002.0306] # LATIN SMALL LETTER U WITH BREVE; QQCM
+016C  ; [.1453.0020.0008.0055][.0000.0037.0002.0306] # LATIN CAPITAL LETTER U WITH BREVE; QQCM
+00FB  ; [.1453.0020.0002.0075][.0000.003C.0002.0302] # LATIN SMALL LETTER U WITH CIRCUMFLEX; QQCM
+00DB  ; [.1453.0020.0008.0055][.0000.003C.0002.0302] # LATIN CAPITAL LETTER U WITH CIRCUMFLEX; QQCM
+01D4  ; [.1453.0020.0002.0075][.0000.0041.0002.030C] # LATIN SMALL LETTER U WITH CARON; QQCM
+01D3  ; [.1453.0020.0008.0055][.0000.0041.0002.030C] # LATIN CAPITAL LETTER U WITH CARON; QQCM
+016F  ; [.1453.0020.0002.0075][.0000.0043.0002.030A] # LATIN SMALL LETTER U WITH RING ABOVE; QQCM
+016E  ; [.1453.0020.0008.0055][.0000.0043.0002.030A] # LATIN CAPITAL LETTER U WITH RING ABOVE; QQCM
+00FC  ; [.1453.0020.0002.0075][.0000.0047.0002.0308] # LATIN SMALL LETTER U WITH DIAERESIS; QQCM
+00DC  ; [.1453.0020.0008.0055][.0000.0047.0002.0308] # LATIN CAPITAL LETTER U WITH DIAERESIS; QQCM
+01D8  ; [.1453.0020.0002.0075][.0000.0047.0002.0308][.0000.0032.0002.0301] # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE; QQCM
+01D7  ; [.1453.0020.0008.0055][.0000.0047.0002.0308][.0000.0032.0002.0301] # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE; QQCM
+01DC  ; [.1453.0020.0002.0075][.0000.0047.0002.0308][.0000.0035.0002.0300] # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE; QQCM
+01DB  ; [.1453.0020.0008.0055][.0000.0047.0002.0308][.0000.0035.0002.0300] # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE; QQCM
+01DA  ; [.1453.0020.0002.0075][.0000.0047.0002.0308][.0000.0041.0002.030C] # LATIN SMALL LETTER U WITH DIAERESIS AND CARON; QQCM
+01D9  ; [.1453.0020.0008.0055][.0000.0047.0002.0308][.0000.0041.0002.030C] # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON; QQCM
+01D6  ; [.1453.0020.0002.0075][.0000.0047.0002.0308][.0000.005B.0002.0304] # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON; QQCM
+01D5  ; [.1453.0020.0008.0055][.0000.0047.0002.0308][.0000.005B.0002.0304] # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON; QQCM
+0171  ; [.1453.0020.0002.0075][.0000.004D.0002.030B] # LATIN SMALL LETTER U WITH DOUBLE ACUTE; QQCM
+0170  ; [.1453.0020.0008.0055][.0000.004D.0002.030B] # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE; QQCM
+0169  ; [.1453.0020.0002.0075][.0000.004E.0002.0303] # LATIN SMALL LETTER U WITH TILDE; QQCM
+0168  ; [.1453.0020.0008.0055][.0000.004E.0002.0303] # LATIN CAPITAL LETTER U WITH TILDE; QQCM
+1E79  ; [.1453.0020.0002.0075][.0000.004E.0002.0303][.0000.0032.0002.0301] # LATIN SMALL LETTER U WITH TILDE AND ACUTE; QQCM
+1E78  ; [.1453.0020.0008.0055][.0000.004E.0002.0303][.0000.0032.0002.0301] # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE; QQCM
+0173  ; [.1453.0020.0002.0075][.0000.0059.0002.0328] # LATIN SMALL LETTER U WITH OGONEK; QQCM
+0172  ; [.1453.0020.0008.0055][.0000.0059.0002.0328] # LATIN CAPITAL LETTER U WITH OGONEK; QQCM
+016B  ; [.1453.0020.0002.0075][.0000.005B.0002.0304] # LATIN SMALL LETTER U WITH MACRON; QQCM
+016A  ; [.1453.0020.0008.0055][.0000.005B.0002.0304] # LATIN CAPITAL LETTER U WITH MACRON; QQCM
+1E7B  ; [.1453.0020.0002.0075][.0000.005B.0002.0304][.0000.0047.0002.0308] # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS; QQCM
+1E7A  ; [.1453.0020.0008.0055][.0000.005B.0002.0304][.0000.0047.0002.0308] # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS; QQCM
+1EE7  ; [.1453.0020.0002.0075][.0000.0064.0002.0309] # LATIN SMALL LETTER U WITH HOOK ABOVE; QQCM
+1EE6  ; [.1453.0020.0008.0055][.0000.0064.0002.0309] # LATIN CAPITAL LETTER U WITH HOOK ABOVE; QQCM
+0215  ; [.1453.0020.0002.0075][.0000.0065.0002.030F] # LATIN SMALL LETTER U WITH DOUBLE GRAVE; QQCM
+0214  ; [.1453.0020.0008.0055][.0000.0065.0002.030F] # LATIN CAPITAL LETTER U WITH DOUBLE GRAVE; QQCM
+0217  ; [.1453.0020.0002.0075][.0000.0067.0002.0311] # LATIN SMALL LETTER U WITH INVERTED BREVE; QQCM
+0216  ; [.1453.0020.0008.0055][.0000.0067.0002.0311] # LATIN CAPITAL LETTER U WITH INVERTED BREVE; QQCM
+01B0  ; [.1453.0020.0002.0075][.0000.0068.0002.031B] # LATIN SMALL LETTER U WITH HORN; QQCM
+01AF  ; [.1453.0020.0008.0055][.0000.0068.0002.031B] # LATIN CAPITAL LETTER U WITH HORN; QQCM
+1EE9  ; [.1453.0020.0002.0075][.0000.0068.0002.031B][.0000.0032.0002.0301] # LATIN SMALL LETTER U WITH HORN AND ACUTE; QQCM
+1EE8  ; [.1453.0020.0008.0055][.0000.0068.0002.031B][.0000.0032.0002.0301] # LATIN CAPITAL LETTER U WITH HORN AND ACUTE; QQCM
+1EEB  ; [.1453.0020.0002.0075][.0000.0068.0002.031B][.0000.0035.0002.0300] # LATIN SMALL LETTER U WITH HORN AND GRAVE; QQCM
+1EEA  ; [.1453.0020.0008.0055][.0000.0068.0002.031B][.0000.0035.0002.0300] # LATIN CAPITAL LETTER U WITH HORN AND GRAVE; QQCM
+1EEF  ; [.1453.0020.0002.0075][.0000.0068.0002.031B][.0000.004E.0002.0303] # LATIN SMALL LETTER U WITH HORN AND TILDE; QQCM
+1EEE  ; [.1453.0020.0008.0055][.0000.0068.0002.031B][.0000.004E.0002.0303] # LATIN CAPITAL LETTER U WITH HORN AND TILDE; QQCM
+1EED  ; [.1453.0020.0002.0075][.0000.0068.0002.031B][.0000.0064.0002.0309] # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE; QQCM
+1EEC  ; [.1453.0020.0008.0055][.0000.0068.0002.031B][.0000.0064.0002.0309] # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE; QQCM
+1EF1  ; [.1453.0020.0002.0075][.0000.0068.0002.031B][.0000.0070.0002.0323] # LATIN SMALL LETTER U WITH HORN AND DOT BELOW; QQCM
+1EF0  ; [.1453.0020.0008.0055][.0000.0068.0002.031B][.0000.0070.0002.0323] # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW; QQCM
+1EE5  ; [.1453.0020.0002.0075][.0000.0070.0002.0323] # LATIN SMALL LETTER U WITH DOT BELOW; QQCM
+1EE4  ; [.1453.0020.0008.0055][.0000.0070.0002.0323] # LATIN CAPITAL LETTER U WITH DOT BELOW; QQCM
+1E73  ; [.1453.0020.0002.0075][.0000.0075.0002.0324] # LATIN SMALL LETTER U WITH DIAERESIS BELOW; QQCM
+1E72  ; [.1453.0020.0008.0055][.0000.0075.0002.0324] # LATIN CAPITAL LETTER U WITH DIAERESIS BELOW; QQCM
+1E77  ; [.1453.0020.0002.0075][.0000.0078.0002.032D] # LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW; QQCM
+1E76  ; [.1453.0020.0008.0055][.0000.0078.0002.032D] # LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW; QQCM
+1E75  ; [.1453.0020.0002.0075][.0000.007A.0002.0330] # LATIN SMALL LETTER U WITH TILDE BELOW; QQCM
+1E74  ; [.1453.0020.0008.0055][.0000.007A.0002.0330] # LATIN CAPITAL LETTER U WITH TILDE BELOW; QQCM
+1D1C  ; [.1457.0020.0002.1D1C] # LATIN LETTER SMALL CAPITAL U
+1DB8  ; [.1457.0020.0014.1DB8] # MODIFIER LETTER SMALL CAPITAL U; QQK
+1D1D  ; [.1458.0020.0002.1D1D] # LATIN SMALL LETTER SIDEWAYS U
+1D59  ; [.1458.0020.0014.1D59] # MODIFIER LETTER SMALL SIDEWAYS U; QQK
+1D1E  ; [.1459.0020.0002.1D1E] # LATIN SMALL LETTER SIDEWAYS DIAERESIZED U
+1D6B  ; [.145A.0020.0002.1D6B] # LATIN SMALL LETTER UE
+0289  ; [.145B.0020.0002.0289] # LATIN SMALL LETTER U BAR
+0244  ; [.145B.0020.0008.0244] # LATIN CAPITAL LETTER U BAR
+1DB6  ; [.145B.0020.0014.1DB6] # MODIFIER LETTER SMALL U BAR; QQK
+1D7E  ; [.145F.0020.0002.1D7E] # LATIN SMALL CAPITAL LETTER U WITH STROKE
+1D99  ; [.1460.0020.0002.1D99] # LATIN SMALL LETTER U WITH RETROFLEX HOOK
+0265  ; [.1461.0020.0002.0265] # LATIN SMALL LETTER TURNED H
+1DA3  ; [.1461.0020.0014.1DA3] # MODIFIER LETTER SMALL TURNED H; QQK
+02AE  ; [.1465.0020.0002.02AE] # LATIN SMALL LETTER TURNED H WITH FISHHOOK 
+02AF  ; [.1469.0020.0002.02AF] # LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL
+026F  ; [.146D.0020.0002.026F] # LATIN SMALL LETTER TURNED M
+019C  ; [.146D.0020.0008.019C] # LATIN CAPITAL LETTER TURNED M
+1D5A  ; [.146D.0020.0014.1D5A] # MODIFIER LETTER SMALL TURNED M; QQK
+1D1F  ; [.1471.0020.0002.1D1F] # LATIN SMALL LETTER SIDEWAYS TURNED M
+0270  ; [.1472.0020.0002.0270] # LATIN SMALL LETTER TURNED M WITH LONG LEG
+1DAD  ; [.1472.0020.0014.1DAD] # MODIFIER LETTER SMALL TURNED M WITH LONG LEG; QQK
+028A  ; [.1476.0020.0002.028A] # LATIN SMALL LETTER UPSILON
+01B1  ; [.1476.0020.0008.01B1] # LATIN CAPITAL LETTER UPSILON
+1DB7  ; [.1476.0020.0014.1DB7] # MODIFIER LETTER SMALL UPSILON; QQK
+1D7F  ; [.147A.0020.0002.1D7F] # LATIN SMALL LETTER UPSILON WITH STROKE
+0076  ; [.147B.0020.0002.0076] # LATIN SMALL LETTER V
+FF56  ; [.147B.0020.0003.FF56] # FULLWIDTH LATIN SMALL LETTER V; QQK
+036E  ; [.147B.0020.0004.036E] # COMBINING LATIN SMALL LETTER V; QQK
+2174  ; [.147B.0020.0004.2174] # SMALL ROMAN NUMERAL FIVE; QQK
+24B1  ; [*02FF.0020.0004.24B1][.147B.0020.0004.24B1][*0300.0020.001F.24B1] # PARENTHESIZED LATIN SMALL LETTER V; QQKN
+1D42F ; [.147B.0020.0005.1D42F] # MATHEMATICAL BOLD SMALL V; QQK
+1D463 ; [.147B.0020.0005.1D463] # MATHEMATICAL ITALIC SMALL V; QQK
+1D497 ; [.147B.0020.0005.1D497] # MATHEMATICAL BOLD ITALIC SMALL V; QQK
+1D4CB ; [.147B.0020.0005.1D4CB] # MATHEMATICAL SCRIPT SMALL V; QQK
+1D4FF ; [.147B.0020.0005.1D4FF] # MATHEMATICAL BOLD SCRIPT SMALL V; QQK
+1D533 ; [.147B.0020.0005.1D533] # MATHEMATICAL FRAKTUR SMALL V; QQK
+1D567 ; [.147B.0020.0005.1D567] # MATHEMATICAL DOUBLE-STRUCK SMALL V; QQK
+1D59B ; [.147B.0020.0005.1D59B] # MATHEMATICAL BOLD FRAKTUR SMALL V; QQK
+1D5CF ; [.147B.0020.0005.1D5CF] # MATHEMATICAL SANS-SERIF SMALL V; QQK
+1D603 ; [.147B.0020.0005.1D603] # MATHEMATICAL SANS-SERIF BOLD SMALL V; QQK
+1D637 ; [.147B.0020.0005.1D637] # MATHEMATICAL SANS-SERIF ITALIC SMALL V; QQK
+1D66B ; [.147B.0020.0005.1D66B] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V; QQK
+1D69F ; [.147B.0020.0005.1D69F] # MATHEMATICAL MONOSPACE SMALL V; QQK
+24E5  ; [.147B.0020.0006.24E5] # CIRCLED LATIN SMALL LETTER V; QQK
+0056  ; [.147B.0020.0008.0056] # LATIN CAPITAL LETTER V
+FF36  ; [.147B.0020.0009.FF36] # FULLWIDTH LATIN CAPITAL LETTER V; QQK
+2164  ; [.147B.0020.000A.2164] # ROMAN NUMERAL FIVE; QQK
+1F125 ; [*02FF.0020.0004.1F125][.147B.0020.000A.1F125][*0300.0020.001F.1F125] # PARENTHESIZED LATIN CAPITAL LETTER V; QQKN
+1D415 ; [.147B.0020.000B.1D415] # MATHEMATICAL BOLD CAPITAL V; QQK
+1D449 ; [.147B.0020.000B.1D449] # MATHEMATICAL ITALIC CAPITAL V; QQK
+1D47D ; [.147B.0020.000B.1D47D] # MATHEMATICAL BOLD ITALIC CAPITAL V; QQK
+1D4B1 ; [.147B.0020.000B.1D4B1] # MATHEMATICAL SCRIPT CAPITAL V; QQK
+1D4E5 ; [.147B.0020.000B.1D4E5] # MATHEMATICAL BOLD SCRIPT CAPITAL V; QQK
+1D519 ; [.147B.0020.000B.1D519] # MATHEMATICAL FRAKTUR CAPITAL V; QQK
+1D54D ; [.147B.0020.000B.1D54D] # MATHEMATICAL DOUBLE-STRUCK CAPITAL V; QQK
+1D581 ; [.147B.0020.000B.1D581] # MATHEMATICAL BOLD FRAKTUR CAPITAL V; QQK
+1D5B5 ; [.147B.0020.000B.1D5B5] # MATHEMATICAL SANS-SERIF CAPITAL V; QQK
+1D5E9 ; [.147B.0020.000B.1D5E9] # MATHEMATICAL SANS-SERIF BOLD CAPITAL V; QQK
+1D61D ; [.147B.0020.000B.1D61D] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL V; QQK
+1D651 ; [.147B.0020.000B.1D651] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V; QQK
+1D685 ; [.147B.0020.000B.1D685] # MATHEMATICAL MONOSPACE CAPITAL V; QQK
+24CB  ; [.147B.0020.000C.24CB] # CIRCLED LATIN CAPITAL LETTER V; QQK
+1D5B  ; [.147B.0020.0014.1D5B] # MODIFIER LETTER SMALL V; QQK
+1D65  ; [.147B.0020.0015.1D65] # LATIN SUBSCRIPT SMALL LETTER V; QQK
+2C7D  ; [.147B.0020.001D.2C7D] # MODIFIER LETTER CAPITAL V; QQK
+1E7D  ; [.147B.0020.0002.0076][.0000.004E.0002.0303] # LATIN SMALL LETTER V WITH TILDE; QQCM
+1E7C  ; [.147B.0020.0008.0056][.0000.004E.0002.0303] # LATIN CAPITAL LETTER V WITH TILDE; QQCM
+1E7F  ; [.147B.0020.0002.0076][.0000.0070.0002.0323] # LATIN SMALL LETTER V WITH DOT BELOW; QQCM
+1E7E  ; [.147B.0020.0008.0056][.0000.0070.0002.0323] # LATIN CAPITAL LETTER V WITH DOT BELOW; QQCM
+2175  ; [.147B.0020.0004.2175][.12EC.0020.0004.2175] # SMALL ROMAN NUMERAL SIX; QQKN
+2165  ; [.147B.0020.000A.2165][.12EC.0020.000A.2165] # ROMAN NUMERAL SIX; QQKN
+2176  ; [.147B.0020.0004.2176][.12EC.0020.0004.2176][.12EC.0020.001F.2176] # SMALL ROMAN NUMERAL SEVEN; QQKN
+2166  ; [.147B.0020.000A.2166][.12EC.0020.000A.2166][.12EC.0020.001F.2166] # ROMAN NUMERAL SEVEN; QQKN
+2177  ; [.147B.0020.0004.2177][.12EC.0020.0004.2177][.12EC.0020.001F.2177][.12EC.0020.001F.2177] # SMALL ROMAN NUMERAL EIGHT; QQKN
+2167  ; [.147B.0020.000A.2167][.12EC.0020.000A.2167][.12EC.0020.001F.2167][.12EC.0020.001F.2167] # ROMAN NUMERAL EIGHT; QQKN
+33DE  ; [.147B.0020.001D.33DE][*055F.0020.001C.33DE][.135F.0020.001F.33DE] # SQUARE V OVER M; QQKN
+A761  ; [.147B.0020.0004.A761][.149C.0020.0004.A761] # LATIN SMALL LETTER VY; QQKN
+A760  ; [.147B.0020.000A.A760][.149C.0020.000A.A760] # LATIN CAPITAL LETTER VY; QQKN
+1D20  ; [.147F.0020.0002.1D20] # LATIN LETTER SMALL CAPITAL V
+A75F  ; [.1480.0020.0002.A75F] # LATIN SMALL LETTER V WITH DIAGONAL STROKE
+A75E  ; [.1480.0020.0008.A75E] # LATIN CAPITAL LETTER V WITH DIAGONAL STROKE
+1D8C  ; [.1481.0020.0002.1D8C] # LATIN SMALL LETTER V WITH PALATAL HOOK
+028B  ; [.1482.0020.0002.028B] # LATIN SMALL LETTER V WITH HOOK
+01B2  ; [.1482.0020.0008.01B2] # LATIN CAPITAL LETTER V WITH HOOK
+1DB9  ; [.1482.0020.0014.1DB9] # MODIFIER LETTER SMALL V WITH HOOK; QQK
+2C71  ; [.1486.0020.0002.2C71] # LATIN SMALL LETTER V WITH RIGHT HOOK
+2C74  ; [.1487.0020.0002.2C74] # LATIN SMALL LETTER V WITH CURL
+1EFD  ; [.1488.0020.0002.1EFD] # LATIN SMALL LETTER MIDDLE-WELSH V
+1EFC  ; [.1488.0020.0008.1EFC] # LATIN CAPITAL LETTER MIDDLE-WELSH V
+028C  ; [.1489.0020.0002.028C] # LATIN SMALL LETTER TURNED V
+0245  ; [.1489.0020.0008.0245] # LATIN CAPITAL LETTER TURNED V
+1DBA  ; [.1489.0020.0014.1DBA] # MODIFIER LETTER SMALL TURNED V; QQK
+0077  ; [.148D.0020.0002.0077] # LATIN SMALL LETTER W
+FF57  ; [.148D.0020.0003.FF57] # FULLWIDTH LATIN SMALL LETTER W; QQK
+24B2  ; [*02FF.0020.0004.24B2][.148D.0020.0004.24B2][*0300.0020.001F.24B2] # PARENTHESIZED LATIN SMALL LETTER W; QQKN
+1D430 ; [.148D.0020.0005.1D430] # MATHEMATICAL BOLD SMALL W; QQK
+1D464 ; [.148D.0020.0005.1D464] # MATHEMATICAL ITALIC SMALL W; QQK
+1D498 ; [.148D.0020.0005.1D498] # MATHEMATICAL BOLD ITALIC SMALL W; QQK
+1D4CC ; [.148D.0020.0005.1D4CC] # MATHEMATICAL SCRIPT SMALL W; QQK
+1D500 ; [.148D.0020.0005.1D500] # MATHEMATICAL BOLD SCRIPT SMALL W; QQK
+1D534 ; [.148D.0020.0005.1D534] # MATHEMATICAL FRAKTUR SMALL W; QQK
+1D568 ; [.148D.0020.0005.1D568] # MATHEMATICAL DOUBLE-STRUCK SMALL W; QQK
+1D59C ; [.148D.0020.0005.1D59C] # MATHEMATICAL BOLD FRAKTUR SMALL W; QQK
+1D5D0 ; [.148D.0020.0005.1D5D0] # MATHEMATICAL SANS-SERIF SMALL W; QQK
+1D604 ; [.148D.0020.0005.1D604] # MATHEMATICAL SANS-SERIF BOLD SMALL W; QQK
+1D638 ; [.148D.0020.0005.1D638] # MATHEMATICAL SANS-SERIF ITALIC SMALL W; QQK
+1D66C ; [.148D.0020.0005.1D66C] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W; QQK
+1D6A0 ; [.148D.0020.0005.1D6A0] # MATHEMATICAL MONOSPACE SMALL W; QQK
+24E6  ; [.148D.0020.0006.24E6] # CIRCLED LATIN SMALL LETTER W; QQK
+0057  ; [.148D.0020.0008.0057] # LATIN CAPITAL LETTER W
+FF37  ; [.148D.0020.0009.FF37] # FULLWIDTH LATIN CAPITAL LETTER W; QQK
+1F126 ; [*02FF.0020.0004.1F126][.148D.0020.000A.1F126][*0300.0020.001F.1F126] # PARENTHESIZED LATIN CAPITAL LETTER W; QQKN
+1D416 ; [.148D.0020.000B.1D416] # MATHEMATICAL BOLD CAPITAL W; QQK
+1D44A ; [.148D.0020.000B.1D44A] # MATHEMATICAL ITALIC CAPITAL W; QQK
+1D47E ; [.148D.0020.000B.1D47E] # MATHEMATICAL BOLD ITALIC CAPITAL W; QQK
+1D4B2 ; [.148D.0020.000B.1D4B2] # MATHEMATICAL SCRIPT CAPITAL W; QQK
+1D4E6 ; [.148D.0020.000B.1D4E6] # MATHEMATICAL BOLD SCRIPT CAPITAL W; QQK
+1D51A ; [.148D.0020.000B.1D51A] # MATHEMATICAL FRAKTUR CAPITAL W; QQK
+1D54E ; [.148D.0020.000B.1D54E] # MATHEMATICAL DOUBLE-STRUCK CAPITAL W; QQK
+1D582 ; [.148D.0020.000B.1D582] # MATHEMATICAL BOLD FRAKTUR CAPITAL W; QQK
+1D5B6 ; [.148D.0020.000B.1D5B6] # MATHEMATICAL SANS-SERIF CAPITAL W; QQK
+1D5EA ; [.148D.0020.000B.1D5EA] # MATHEMATICAL SANS-SERIF BOLD CAPITAL W; QQK
+1D61E ; [.148D.0020.000B.1D61E] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL W; QQK
+1D652 ; [.148D.0020.000B.1D652] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W; QQK
+1D686 ; [.148D.0020.000B.1D686] # MATHEMATICAL MONOSPACE CAPITAL W; QQK
+24CC  ; [.148D.0020.000C.24CC] # CIRCLED LATIN CAPITAL LETTER W; QQK
+02B7  ; [.148D.0020.0014.02B7] # MODIFIER LETTER SMALL W; QQK
+1D42  ; [.148D.0020.001D.1D42] # MODIFIER LETTER CAPITAL W; QQK
+1F146 ; [.148D.0020.001D.1F146] # SQUARED LATIN CAPITAL LETTER W; QQK
+1E83  ; [.148D.0020.0002.0077][.0000.0032.0002.0301] # LATIN SMALL LETTER W WITH ACUTE; QQCM
+1E82  ; [.148D.0020.0008.0057][.0000.0032.0002.0301] # LATIN CAPITAL LETTER W WITH ACUTE; QQCM
+1E81  ; [.148D.0020.0002.0077][.0000.0035.0002.0300] # LATIN SMALL LETTER W WITH GRAVE; QQCM
+1E80  ; [.148D.0020.0008.0057][.0000.0035.0002.0300] # LATIN CAPITAL LETTER W WITH GRAVE; QQCM
+0175  ; [.148D.0020.0002.0077][.0000.003C.0002.0302] # LATIN SMALL LETTER W WITH CIRCUMFLEX; QQCM
+0174  ; [.148D.0020.0008.0057][.0000.003C.0002.0302] # LATIN CAPITAL LETTER W WITH CIRCUMFLEX; QQCM
+1E98  ; [.148D.0020.0002.0077][.0000.0043.0002.030A] # LATIN SMALL LETTER W WITH RING ABOVE; QQCM
+1E85  ; [.148D.0020.0002.0077][.0000.0047.0002.0308] # LATIN SMALL LETTER W WITH DIAERESIS; QQCM
+1E84  ; [.148D.0020.0008.0057][.0000.0047.0002.0308] # LATIN CAPITAL LETTER W WITH DIAERESIS; QQCM
+1E87  ; [.148D.0020.0002.0077][.0000.0052.0002.0307] # LATIN SMALL LETTER W WITH DOT ABOVE; QQCM
+1E86  ; [.148D.0020.0008.0057][.0000.0052.0002.0307] # LATIN CAPITAL LETTER W WITH DOT ABOVE; QQCM
+1E89  ; [.148D.0020.0002.0077][.0000.0070.0002.0323] # LATIN SMALL LETTER W WITH DOT BELOW; QQCM
+1E88  ; [.148D.0020.0008.0057][.0000.0070.0002.0323] # LATIN CAPITAL LETTER W WITH DOT BELOW; QQCM
+33DD  ; [.148D.0020.001D.33DD][.1225.0020.001C.33DD] # SQUARE WB; QQKN
+1F12E ; [.148D.0020.000C.1F12E][.14AD.0020.000C.1F12E] # CIRCLED WZ; QQKN
+1D21  ; [.1491.0020.0002.1D21] # LATIN LETTER SMALL CAPITAL W
+2C73  ; [.1492.0020.0002.2C73] # LATIN SMALL LETTER W WITH HOOK
+2C72  ; [.1492.0020.0008.2C72] # LATIN CAPITAL LETTER W WITH HOOK
+028D  ; [.1493.0020.0002.028D] # LATIN SMALL LETTER TURNED W
+0078  ; [.1497.0020.0002.0078] # LATIN SMALL LETTER X
+FF58  ; [.1497.0020.0003.FF58] # FULLWIDTH LATIN SMALL LETTER X; QQK
+036F  ; [.1497.0020.0004.036F] # COMBINING LATIN SMALL LETTER X; QQK
+2179  ; [.1497.0020.0004.2179] # SMALL ROMAN NUMERAL TEN; QQK
+24B3  ; [*02FF.0020.0004.24B3][.1497.0020.0004.24B3][*0300.0020.001F.24B3] # PARENTHESIZED LATIN SMALL LETTER X; QQKN
+1D431 ; [.1497.0020.0005.1D431] # MATHEMATICAL BOLD SMALL X; QQK
+1D465 ; [.1497.0020.0005.1D465] # MATHEMATICAL ITALIC SMALL X; QQK
+1D499 ; [.1497.0020.0005.1D499] # MATHEMATICAL BOLD ITALIC SMALL X; QQK
+1D4CD ; [.1497.0020.0005.1D4CD] # MATHEMATICAL SCRIPT SMALL X; QQK
+1D501 ; [.1497.0020.0005.1D501] # MATHEMATICAL BOLD SCRIPT SMALL X; QQK
+1D535 ; [.1497.0020.0005.1D535] # MATHEMATICAL FRAKTUR SMALL X; QQK
+1D569 ; [.1497.0020.0005.1D569] # MATHEMATICAL DOUBLE-STRUCK SMALL X; QQK
+1D59D ; [.1497.0020.0005.1D59D] # MATHEMATICAL BOLD FRAKTUR SMALL X; QQK
+1D5D1 ; [.1497.0020.0005.1D5D1] # MATHEMATICAL SANS-SERIF SMALL X; QQK
+1D605 ; [.1497.0020.0005.1D605] # MATHEMATICAL SANS-SERIF BOLD SMALL X; QQK
+1D639 ; [.1497.0020.0005.1D639] # MATHEMATICAL SANS-SERIF ITALIC SMALL X; QQK
+1D66D ; [.1497.0020.0005.1D66D] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X; QQK
+1D6A1 ; [.1497.0020.0005.1D6A1] # MATHEMATICAL MONOSPACE SMALL X; QQK
+24E7  ; [.1497.0020.0006.24E7] # CIRCLED LATIN SMALL LETTER X; QQK
+0058  ; [.1497.0020.0008.0058] # LATIN CAPITAL LETTER X
+FF38  ; [.1497.0020.0009.FF38] # FULLWIDTH LATIN CAPITAL LETTER X; QQK
+2169  ; [.1497.0020.000A.2169] # ROMAN NUMERAL TEN; QQK
+1F127 ; [*02FF.0020.0004.1F127][.1497.0020.000A.1F127][*0300.0020.001F.1F127] # PARENTHESIZED LATIN CAPITAL LETTER X; QQKN
+1D417 ; [.1497.0020.000B.1D417] # MATHEMATICAL BOLD CAPITAL X; QQK
+1D44B ; [.1497.0020.000B.1D44B] # MATHEMATICAL ITALIC CAPITAL X; QQK
+1D47F ; [.1497.0020.000B.1D47F] # MATHEMATICAL BOLD ITALIC CAPITAL X; QQK
+1D4B3 ; [.1497.0020.000B.1D4B3] # MATHEMATICAL SCRIPT CAPITAL X; QQK
+1D4E7 ; [.1497.0020.000B.1D4E7] # MATHEMATICAL BOLD SCRIPT CAPITAL X; QQK
+1D51B ; [.1497.0020.000B.1D51B] # MATHEMATICAL FRAKTUR CAPITAL X; QQK
+1D54F ; [.1497.0020.000B.1D54F] # MATHEMATICAL DOUBLE-STRUCK CAPITAL X; QQK
+1D583 ; [.1497.0020.000B.1D583] # MATHEMATICAL BOLD FRAKTUR CAPITAL X; QQK
+1D5B7 ; [.1497.0020.000B.1D5B7] # MATHEMATICAL SANS-SERIF CAPITAL X; QQK
+1D5EB ; [.1497.0020.000B.1D5EB] # MATHEMATICAL SANS-SERIF BOLD CAPITAL X; QQK
+1D61F ; [.1497.0020.000B.1D61F] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL X; QQK
+1D653 ; [.1497.0020.000B.1D653] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X; QQK
+1D687 ; [.1497.0020.000B.1D687] # MATHEMATICAL MONOSPACE CAPITAL X; QQK
+24CD  ; [.1497.0020.000C.24CD] # CIRCLED LATIN CAPITAL LETTER X; QQK
+02E3  ; [.1497.0020.0014.02E3] # MODIFIER LETTER SMALL X; QQK
+2093  ; [.1497.0020.0015.2093] # LATIN SUBSCRIPT SMALL LETTER X; QQK
+1E8D  ; [.1497.0020.0002.0078][.0000.0047.0002.0308] # LATIN SMALL LETTER X WITH DIAERESIS; QQCM
+1E8C  ; [.1497.0020.0008.0058][.0000.0047.0002.0308] # LATIN CAPITAL LETTER X WITH DIAERESIS; QQCM
+1E8B  ; [.1497.0020.0002.0078][.0000.0052.0002.0307] # LATIN SMALL LETTER X WITH DOT ABOVE; QQCM
+1E8A  ; [.1497.0020.0008.0058][.0000.0052.0002.0307] # LATIN CAPITAL LETTER X WITH DOT ABOVE; QQCM
+217A  ; [.1497.0020.0004.217A][.12EC.0020.0004.217A] # SMALL ROMAN NUMERAL ELEVEN; QQKN
+216A  ; [.1497.0020.000A.216A][.12EC.0020.000A.216A] # ROMAN NUMERAL ELEVEN; QQKN
+217B  ; [.1497.0020.0004.217B][.12EC.0020.0004.217B][.12EC.0020.001F.217B] # SMALL ROMAN NUMERAL TWELVE; QQKN
+216B  ; [.1497.0020.000A.216B][.12EC.0020.000A.216B][.12EC.0020.001F.216B] # ROMAN NUMERAL TWELVE; QQKN
+1D8D  ; [.149B.0020.0002.1D8D] # LATIN SMALL LETTER X WITH PALATAL HOOK
+0079  ; [.149C.0020.0002.0079] # LATIN SMALL LETTER Y
+FF59  ; [.149C.0020.0003.FF59] # FULLWIDTH LATIN SMALL LETTER Y; QQK
+24B4  ; [*02FF.0020.0004.24B4][.149C.0020.0004.24B4][*0300.0020.001F.24B4] # PARENTHESIZED LATIN SMALL LETTER Y; QQKN
+1D432 ; [.149C.0020.0005.1D432] # MATHEMATICAL BOLD SMALL Y; QQK
+1D466 ; [.149C.0020.0005.1D466] # MATHEMATICAL ITALIC SMALL Y; QQK
+1D49A ; [.149C.0020.0005.1D49A] # MATHEMATICAL BOLD ITALIC SMALL Y; QQK
+1D4CE ; [.149C.0020.0005.1D4CE] # MATHEMATICAL SCRIPT SMALL Y; QQK
+1D502 ; [.149C.0020.0005.1D502] # MATHEMATICAL BOLD SCRIPT SMALL Y; QQK
+1D536 ; [.149C.0020.0005.1D536] # MATHEMATICAL FRAKTUR SMALL Y; QQK
+1D56A ; [.149C.0020.0005.1D56A] # MATHEMATICAL DOUBLE-STRUCK SMALL Y; QQK
+1D59E ; [.149C.0020.0005.1D59E] # MATHEMATICAL BOLD FRAKTUR SMALL Y; QQK
+1D5D2 ; [.149C.0020.0005.1D5D2] # MATHEMATICAL SANS-SERIF SMALL Y; QQK
+1D606 ; [.149C.0020.0005.1D606] # MATHEMATICAL SANS-SERIF BOLD SMALL Y; QQK
+1D63A ; [.149C.0020.0005.1D63A] # MATHEMATICAL SANS-SERIF ITALIC SMALL Y; QQK
+1D66E ; [.149C.0020.0005.1D66E] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y; QQK
+1D6A2 ; [.149C.0020.0005.1D6A2] # MATHEMATICAL MONOSPACE SMALL Y; QQK
+24E8  ; [.149C.0020.0006.24E8] # CIRCLED LATIN SMALL LETTER Y; QQK
+0059  ; [.149C.0020.0008.0059] # LATIN CAPITAL LETTER Y
+FF39  ; [.149C.0020.0009.FF39] # FULLWIDTH LATIN CAPITAL LETTER Y; QQK
+1F128 ; [*02FF.0020.0004.1F128][.149C.0020.000A.1F128][*0300.0020.001F.1F128] # PARENTHESIZED LATIN CAPITAL LETTER Y; QQKN
+1D418 ; [.149C.0020.000B.1D418] # MATHEMATICAL BOLD CAPITAL Y; QQK
+1D44C ; [.149C.0020.000B.1D44C] # MATHEMATICAL ITALIC CAPITAL Y; QQK
+1D480 ; [.149C.0020.000B.1D480] # MATHEMATICAL BOLD ITALIC CAPITAL Y; QQK
+1D4B4 ; [.149C.0020.000B.1D4B4] # MATHEMATICAL SCRIPT CAPITAL Y; QQK
+1D4E8 ; [.149C.0020.000B.1D4E8] # MATHEMATICAL BOLD SCRIPT CAPITAL Y; QQK
+1D51C ; [.149C.0020.000B.1D51C] # MATHEMATICAL FRAKTUR CAPITAL Y; QQK
+1D550 ; [.149C.0020.000B.1D550] # MATHEMATICAL DOUBLE-STRUCK CAPITAL Y; QQK
+1D584 ; [.149C.0020.000B.1D584] # MATHEMATICAL BOLD FRAKTUR CAPITAL Y; QQK
+1D5B8 ; [.149C.0020.000B.1D5B8] # MATHEMATICAL SANS-SERIF CAPITAL Y; QQK
+1D5EC ; [.149C.0020.000B.1D5EC] # MATHEMATICAL SANS-SERIF BOLD CAPITAL Y; QQK
+1D620 ; [.149C.0020.000B.1D620] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y; QQK
+1D654 ; [.149C.0020.000B.1D654] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y; QQK
+1D688 ; [.149C.0020.000B.1D688] # MATHEMATICAL MONOSPACE CAPITAL Y; QQK
+24CE  ; [.149C.0020.000C.24CE] # CIRCLED LATIN CAPITAL LETTER Y; QQK
+02B8  ; [.149C.0020.0014.02B8] # MODIFIER LETTER SMALL Y; QQK
+00FD  ; [.149C.0020.0002.0079][.0000.0032.0002.0301] # LATIN SMALL LETTER Y WITH ACUTE; QQCM
+00DD  ; [.149C.0020.0008.0059][.0000.0032.0002.0301] # LATIN CAPITAL LETTER Y WITH ACUTE; QQCM
+1EF3  ; [.149C.0020.0002.0079][.0000.0035.0002.0300] # LATIN SMALL LETTER Y WITH GRAVE; QQCM
+1EF2  ; [.149C.0020.0008.0059][.0000.0035.0002.0300] # LATIN CAPITAL LETTER Y WITH GRAVE; QQCM
+0177  ; [.149C.0020.0002.0079][.0000.003C.0002.0302] # LATIN SMALL LETTER Y WITH CIRCUMFLEX; QQCM
+0176  ; [.149C.0020.0008.0059][.0000.003C.0002.0302] # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX; QQCM
+1E99  ; [.149C.0020.0002.0079][.0000.0043.0002.030A] # LATIN SMALL LETTER Y WITH RING ABOVE; QQCM
+00FF  ; [.149C.0020.0002.0079][.0000.0047.0002.0308] # LATIN SMALL LETTER Y WITH DIAERESIS; QQCM
+0178  ; [.149C.0020.0008.0059][.0000.0047.0002.0308] # LATIN CAPITAL LETTER Y WITH DIAERESIS; QQCM
+1EF9  ; [.149C.0020.0002.0079][.0000.004E.0002.0303] # LATIN SMALL LETTER Y WITH TILDE; QQCM
+1EF8  ; [.149C.0020.0008.0059][.0000.004E.0002.0303] # LATIN CAPITAL LETTER Y WITH TILDE; QQCM
+1E8F  ; [.149C.0020.0002.0079][.0000.0052.0002.0307] # LATIN SMALL LETTER Y WITH DOT ABOVE; QQCM
+1E8E  ; [.149C.0020.0008.0059][.0000.0052.0002.0307] # LATIN CAPITAL LETTER Y WITH DOT ABOVE; QQCM
+0233  ; [.149C.0020.0002.0079][.0000.005B.0002.0304] # LATIN SMALL LETTER Y WITH MACRON; QQCM
+0232  ; [.149C.0020.0008.0059][.0000.005B.0002.0304] # LATIN CAPITAL LETTER Y WITH MACRON; QQCM
+1EF7  ; [.149C.0020.0002.0079][.0000.0064.0002.0309] # LATIN SMALL LETTER Y WITH HOOK ABOVE; QQCM
+1EF6  ; [.149C.0020.0008.0059][.0000.0064.0002.0309] # LATIN CAPITAL LETTER Y WITH HOOK ABOVE; QQCM
+1EF5  ; [.149C.0020.0002.0079][.0000.0070.0002.0323] # LATIN SMALL LETTER Y WITH DOT BELOW; QQCM
+1EF4  ; [.149C.0020.0008.0059][.0000.0070.0002.0323] # LATIN CAPITAL LETTER Y WITH DOT BELOW; QQCM
+028F  ; [.14A0.0020.0002.028F] # LATIN LETTER SMALL CAPITAL Y
+024F  ; [.14A4.0020.0002.024F] # LATIN SMALL LETTER Y WITH STROKE
+024E  ; [.14A4.0020.0008.024E] # LATIN CAPITAL LETTER Y WITH STROKE
+01B4  ; [.14A8.0020.0002.01B4] # LATIN SMALL LETTER Y WITH HOOK
+01B3  ; [.14A8.0020.0008.01B3] # LATIN CAPITAL LETTER Y WITH HOOK
+1EFF  ; [.14AC.0020.0002.1EFF] # LATIN SMALL LETTER Y WITH LOOP
+1EFE  ; [.14AC.0020.0008.1EFE] # LATIN CAPITAL LETTER Y WITH LOOP
+007A  ; [.14AD.0020.0002.007A] # LATIN SMALL LETTER Z
+FF5A  ; [.14AD.0020.0003.FF5A] # FULLWIDTH LATIN SMALL LETTER Z; QQK
+1DE6  ; [.14AD.0020.0004.1DE6] # COMBINING LATIN SMALL LETTER Z; QQK
+24B5  ; [*02FF.0020.0004.24B5][.14AD.0020.0004.24B5][*0300.0020.001F.24B5] # PARENTHESIZED LATIN SMALL LETTER Z; QQKN
+1D433 ; [.14AD.0020.0005.1D433] # MATHEMATICAL BOLD SMALL Z; QQK
+1D467 ; [.14AD.0020.0005.1D467] # MATHEMATICAL ITALIC SMALL Z; QQK
+1D49B ; [.14AD.0020.0005.1D49B] # MATHEMATICAL BOLD ITALIC SMALL Z; QQK
+1D4CF ; [.14AD.0020.0005.1D4CF] # MATHEMATICAL SCRIPT SMALL Z; QQK
+1D503 ; [.14AD.0020.0005.1D503] # MATHEMATICAL BOLD SCRIPT SMALL Z; QQK
+1D537 ; [.14AD.0020.0005.1D537] # MATHEMATICAL FRAKTUR SMALL Z; QQK
+1D56B ; [.14AD.0020.0005.1D56B] # MATHEMATICAL DOUBLE-STRUCK SMALL Z; QQK
+1D59F ; [.14AD.0020.0005.1D59F] # MATHEMATICAL BOLD FRAKTUR SMALL Z; QQK
+1D5D3 ; [.14AD.0020.0005.1D5D3] # MATHEMATICAL SANS-SERIF SMALL Z; QQK
+1D607 ; [.14AD.0020.0005.1D607] # MATHEMATICAL SANS-SERIF BOLD SMALL Z; QQK
+1D63B ; [.14AD.0020.0005.1D63B] # MATHEMATICAL SANS-SERIF ITALIC SMALL Z; QQK
+1D66F ; [.14AD.0020.0005.1D66F] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z; QQK
+1D6A3 ; [.14AD.0020.0005.1D6A3] # MATHEMATICAL MONOSPACE SMALL Z; QQK
+24E9  ; [.14AD.0020.0006.24E9] # CIRCLED LATIN SMALL LETTER Z; QQK
+005A  ; [.14AD.0020.0008.005A] # LATIN CAPITAL LETTER Z
+FF3A  ; [.14AD.0020.0009.FF3A] # FULLWIDTH LATIN CAPITAL LETTER Z; QQK
+1F129 ; [*02FF.0020.0004.1F129][.14AD.0020.000A.1F129][*0300.0020.001F.1F129] # PARENTHESIZED LATIN CAPITAL LETTER Z; QQKN
+2124  ; [.14AD.0020.000B.2124] # DOUBLE-STRUCK CAPITAL Z; QQK
+2128  ; [.14AD.0020.000B.2128] # BLACK-LETTER CAPITAL Z; QQK
+1D419 ; [.14AD.0020.000B.1D419] # MATHEMATICAL BOLD CAPITAL Z; QQK
+1D44D ; [.14AD.0020.000B.1D44D] # MATHEMATICAL ITALIC CAPITAL Z; QQK
+1D481 ; [.14AD.0020.000B.1D481] # MATHEMATICAL BOLD ITALIC CAPITAL Z; QQK
+1D4B5 ; [.14AD.0020.000B.1D4B5] # MATHEMATICAL SCRIPT CAPITAL Z; QQK
+1D4E9 ; [.14AD.0020.000B.1D4E9] # MATHEMATICAL BOLD SCRIPT CAPITAL Z; QQK
+1D585 ; [.14AD.0020.000B.1D585] # MATHEMATICAL BOLD FRAKTUR CAPITAL Z; QQK
+1D5B9 ; [.14AD.0020.000B.1D5B9] # MATHEMATICAL SANS-SERIF CAPITAL Z; QQK
+1D5ED ; [.14AD.0020.000B.1D5ED] # MATHEMATICAL SANS-SERIF BOLD CAPITAL Z; QQK
+1D621 ; [.14AD.0020.000B.1D621] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z; QQK
+1D655 ; [.14AD.0020.000B.1D655] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z; QQK
+1D689 ; [.14AD.0020.000B.1D689] # MATHEMATICAL MONOSPACE CAPITAL Z; QQK
+24CF  ; [.14AD.0020.000C.24CF] # CIRCLED LATIN CAPITAL LETTER Z; QQK
+1DBB  ; [.14AD.0020.0014.1DBB] # MODIFIER LETTER SMALL Z; QQK
+017A  ; [.14AD.0020.0002.007A][.0000.0032.0002.0301] # LATIN SMALL LETTER Z WITH ACUTE; QQCM
+0179  ; [.14AD.0020.0008.005A][.0000.0032.0002.0301] # LATIN CAPITAL LETTER Z WITH ACUTE; QQCM
+1E91  ; [.14AD.0020.0002.007A][.0000.003C.0002.0302] # LATIN SMALL LETTER Z WITH CIRCUMFLEX; QQCM
+1E90  ; [.14AD.0020.0008.005A][.0000.003C.0002.0302] # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX; QQCM
+017E  ; [.14AD.0020.0002.007A][.0000.0041.0002.030C] # LATIN SMALL LETTER Z WITH CARON; QQCM
+017D  ; [.14AD.0020.0008.005A][.0000.0041.0002.030C] # LATIN CAPITAL LETTER Z WITH CARON; QQCM
+017C  ; [.14AD.0020.0002.007A][.0000.0052.0002.0307] # LATIN SMALL LETTER Z WITH DOT ABOVE; QQCM
+017B  ; [.14AD.0020.0008.005A][.0000.0052.0002.0307] # LATIN CAPITAL LETTER Z WITH DOT ABOVE; QQCM
+1E93  ; [.14AD.0020.0002.007A][.0000.0070.0002.0323] # LATIN SMALL LETTER Z WITH DOT BELOW; QQCM
+1E92  ; [.14AD.0020.0008.005A][.0000.0070.0002.0323] # LATIN CAPITAL LETTER Z WITH DOT BELOW; QQCM
+1E95  ; [.14AD.0020.0002.007A][.0000.007B.0002.0331] # LATIN SMALL LETTER Z WITH LINE BELOW; QQCM
+1E94  ; [.14AD.0020.0008.005A][.0000.007B.0002.0331] # LATIN CAPITAL LETTER Z WITH LINE BELOW; QQCM
+018D  ; [.14AD.0020.0004.018D][.148D.0020.0004.018D] # LATIN SMALL LETTER TURNED DELTA; QQKN
+1D22  ; [.14B1.0020.0002.1D22] # LATIN LETTER SMALL CAPITAL Z
+01B6  ; [.14B2.0020.0002.01B6] # LATIN SMALL LETTER Z WITH STROKE
+01B5  ; [.14B2.0020.0008.01B5] # LATIN CAPITAL LETTER Z WITH STROKE
+1D76  ; [.14B6.0020.0002.1D76] # LATIN SMALL LETTER Z WITH MIDDLE TILDE
+1D8E  ; [.14B7.0020.0002.1D8E] # LATIN SMALL LETTER Z WITH PALATAL HOOK
+0225  ; [.14B8.0020.0002.0225] # LATIN SMALL LETTER Z WITH HOOK
+0224  ; [.14B8.0020.0008.0224] # LATIN CAPITAL LETTER Z WITH HOOK
+0290  ; [.14BC.0020.0002.0290] # LATIN SMALL LETTER Z WITH RETROFLEX HOOK
+1DBC  ; [.14BC.0020.0014.1DBC] # MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK; QQK
+0291  ; [.14C0.0020.0002.0291] # LATIN SMALL LETTER Z WITH CURL
+1DBD  ; [.14C0.0020.0014.1DBD] # MODIFIER LETTER SMALL Z WITH CURL; QQK
+0240  ; [.14C4.0020.0002.0240] # LATIN SMALL LETTER Z WITH SWASH TAIL
+2C7F  ; [.14C4.0020.0008.2C7F] # LATIN CAPITAL LETTER Z WITH SWASH TAIL
+2C6C  ; [.14C8.0020.0002.2C6C] # LATIN SMALL LETTER Z WITH DESCENDER
+2C6B  ; [.14C8.0020.0008.2C6B] # LATIN CAPITAL LETTER Z WITH DESCENDER
+A763  ; [.14C9.0020.0002.A763] # LATIN SMALL LETTER VISIGOTHIC Z
+A762  ; [.14C9.0020.0008.A762] # LATIN CAPITAL LETTER VISIGOTHIC Z
+0292  ; [.14CA.0020.0002.0292] # LATIN SMALL LETTER EZH
+01B7  ; [.14CA.0020.0008.01B7] # LATIN CAPITAL LETTER EZH
+1DBE  ; [.14CA.0020.0014.1DBE] # MODIFIER LETTER SMALL EZH; QQK
+01EF  ; [.14CA.0020.0002.0292][.0000.0041.0002.030C] # LATIN SMALL LETTER EZH WITH CARON; QQCM
+01EE  ; [.14CA.0020.0008.01B7][.0000.0041.0002.030C] # LATIN CAPITAL LETTER EZH WITH CARON; QQCM
+1D23  ; [.14CE.0020.0002.1D23] # LATIN LETTER SMALL CAPITAL EZH
+01B9  ; [.14CF.0020.0002.01B9] # LATIN SMALL LETTER EZH REVERSED
+01B8  ; [.14CF.0020.0008.01B8] # LATIN CAPITAL LETTER EZH REVERSED
+1D9A  ; [.14D3.0020.0002.1D9A] # LATIN SMALL LETTER EZH WITH RETROFLEX HOOK
+01BA  ; [.14D4.0020.0002.01BA] # LATIN SMALL LETTER EZH WITH TAIL
+0293  ; [.14D8.0020.0002.0293] # LATIN SMALL LETTER EZH WITH CURL
+021D  ; [.14DC.0020.0002.021D] # LATIN SMALL LETTER YOGH
+021C  ; [.14DC.0020.0008.021C] # LATIN CAPITAL LETTER YOGH
+00FE  ; [.14E0.0020.0002.00FE] # LATIN SMALL LETTER THORN
+00DE  ; [.14E0.0020.0008.00DE] # LATIN CAPITAL LETTER THORN
+A765  ; [.14E4.0020.0002.A765] # LATIN SMALL LETTER THORN WITH STROKE
+A764  ; [.14E4.0020.0008.A764] # LATIN CAPITAL LETTER THORN WITH STROKE
+A767  ; [.14E5.0020.0002.A767] # LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER
+A766  ; [.14E5.0020.0008.A766] # LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER
+01BF  ; [.14E6.0020.0002.01BF] # LATIN LETTER WYNN
+01F7  ; [.14E6.0020.0008.01F7] # LATIN CAPITAL LETTER WYNN
+A769  ; [.14EA.0020.0002.A769] # LATIN SMALL LETTER VEND
+A768  ; [.14EA.0020.0008.A768] # LATIN CAPITAL LETTER VEND
+A76B  ; [.14EB.0020.0002.A76B] # LATIN SMALL LETTER ET
+A76A  ; [.14EB.0020.0008.A76A] # LATIN CAPITAL LETTER ET
+A76D  ; [.14EC.0020.0002.A76D] # LATIN SMALL LETTER IS
+A76C  ; [.14EC.0020.0008.A76C] # LATIN CAPITAL LETTER IS
+A76F  ; [.14ED.0020.0002.A76F] # LATIN SMALL LETTER CON
+1DD2  ; [.14ED.0020.0004.1DD2] # COMBINING US ABOVE; QQK
+A76E  ; [.14ED.0020.0008.A76E] # LATIN CAPITAL LETTER CON
+A770  ; [.14ED.0020.0014.A770] # MODIFIER LETTER US; QQK
+A778  ; [.14EE.0020.0002.A778] # LATIN SMALL LETTER UM
+01BB  ; [.14EF.0020.0002.01BB] # LATIN LETTER TWO WITH STROKE
+A72B  ; [.14F3.0020.0002.A72B] # LATIN SMALL LETTER TRESILLO
+A72A  ; [.14F3.0020.0008.A72A] # LATIN CAPITAL LETTER TRESILLO
+A72D  ; [.14F4.0020.0002.A72D] # LATIN SMALL LETTER CUATRILLO
+A72C  ; [.14F4.0020.0008.A72C] # LATIN CAPITAL LETTER CUATRILLO
+A72F  ; [.14F5.0020.0002.A72F] # LATIN SMALL LETTER CUATRILLO WITH COMMA
+A72E  ; [.14F5.0020.0008.A72E] # LATIN CAPITAL LETTER CUATRILLO WITH COMMA
+01A8  ; [.14F6.0020.0002.01A8] # LATIN SMALL LETTER TONE TWO
+01A7  ; [.14F6.0020.0008.01A7] # LATIN CAPITAL LETTER TONE TWO
+01BD  ; [.14FA.0020.0002.01BD] # LATIN SMALL LETTER TONE FIVE
+01BC  ; [.14FA.0020.0008.01BC] # LATIN CAPITAL LETTER TONE FIVE
+0185  ; [.14FE.0020.0002.0185] # LATIN SMALL LETTER TONE SIX
+0184  ; [.14FE.0020.0008.0184] # LATIN CAPITAL LETTER TONE SIX
+0294  ; [.1502.0020.0002.0294] # LATIN LETTER GLOTTAL STOP
+0242  ; [.1506.0020.0002.0242] # LATIN SMALL LETTER GLOTTAL STOP
+0241  ; [.1506.0020.0008.0241] # LATIN CAPITAL LETTER GLOTTAL STOP
+02C0  ; [.150A.0020.0002.02C0] # MODIFIER LETTER GLOTTAL STOP
+02BC  ; [.150B.0020.0002.02BC] # MODIFIER LETTER APOSTROPHE
+0149  ; [.150B.0020.0004.0149][.136D.0020.0004.0149] # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE; QQKN
+02EE  ; [.150C.0020.0002.02EE] # MODIFIER LETTER DOUBLE APOSTROPHE
+02BE  ; [.150D.0020.0002.02BE] # MODIFIER LETTER RIGHT HALF RING
+A723  ; [.150E.0020.0002.A723] # LATIN SMALL LETTER EGYPTOLOGICAL ALEF
+A722  ; [.150E.0020.0008.A722] # LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF
+A78C  ; [.150F.0020.0002.A78C] # LATIN SMALL LETTER SALTILLO
+A78B  ; [.150F.0020.0008.A78B] # LATIN CAPITAL LETTER SALTILLO
+0295  ; [.1510.0020.0002.0295] # LATIN LETTER PHARYNGEAL VOICED FRICATIVE
+02E4  ; [.1510.0020.0014.02E4] # MODIFIER LETTER SMALL REVERSED GLOTTAL STOP; QQK
+02BF  ; [.1514.0020.0002.02BF] # MODIFIER LETTER LEFT HALF RING
+02C1  ; [.1515.0020.0002.02C1] # MODIFIER LETTER REVERSED GLOTTAL STOP
+1D24  ; [.1516.0020.0002.1D24] # LATIN LETTER VOICED LARYNGEAL SPIRANT
+1D25  ; [.1517.0020.0002.1D25] # LATIN LETTER AIN
+1D5C  ; [.1517.0020.0014.1D5C] # MODIFIER LETTER SMALL AIN; QQK
+A725  ; [.1518.0020.0002.A725] # LATIN SMALL LETTER EGYPTOLOGICAL AIN
+A724  ; [.1518.0020.0008.A724] # LATIN CAPITAL LETTER EGYPTOLOGICAL AIN
+02A1  ; [.1519.0020.0002.02A1] # LATIN LETTER GLOTTAL STOP WITH STROKE
+02A2  ; [.151D.0020.0002.02A2] # LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE
+0296  ; [.1521.0020.0002.0296] # LATIN LETTER INVERTED GLOTTAL STOP
+01C0  ; [.1525.0020.0002.01C0] # LATIN LETTER DENTAL CLICK
+01C1  ; [.1529.0020.0002.01C1] # LATIN LETTER LATERAL CLICK
+01C2  ; [.152D.0020.0002.01C2] # LATIN LETTER ALVEOLAR CLICK
+01C3  ; [.1531.0020.0002.01C3] # LATIN LETTER RETROFLEX CLICK
+0297  ; [.1535.0020.0002.0297] # LATIN LETTER STRETCHED C
+0298  ; [.1539.0020.0002.0298] # LATIN LETTER BILABIAL CLICK
+02AC  ; [.153D.0020.0002.02AC] # LATIN LETTER BILABIAL PERCUSSIVE
+02AD  ; [.1541.0020.0002.02AD] # LATIN LETTER BIDENTAL PERCUSSIVE
+03B1  ; [.1545.0020.0002.03B1] # GREEK SMALL LETTER ALPHA
+1D6C2 ; [.1545.0020.0005.1D6C2] # MATHEMATICAL BOLD SMALL ALPHA; QQK
+1D6FC ; [.1545.0020.0005.1D6FC] # MATHEMATICAL ITALIC SMALL ALPHA; QQK
+1D736 ; [.1545.0020.0005.1D736] # MATHEMATICAL BOLD ITALIC SMALL ALPHA; QQK
+1D770 ; [.1545.0020.0005.1D770] # MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA; QQK
+1D7AA ; [.1545.0020.0005.1D7AA] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA; QQK
+0391  ; [.1545.0020.0008.0391] # GREEK CAPITAL LETTER ALPHA
+1D6A8 ; [.1545.0020.000B.1D6A8] # MATHEMATICAL BOLD CAPITAL ALPHA; QQK
+1D6E2 ; [.1545.0020.000B.1D6E2] # MATHEMATICAL ITALIC CAPITAL ALPHA; QQK
+1D71C ; [.1545.0020.000B.1D71C] # MATHEMATICAL BOLD ITALIC CAPITAL ALPHA; QQK
+1D756 ; [.1545.0020.000B.1D756] # MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA; QQK
+1D790 ; [.1545.0020.000B.1D790] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA; QQK
+1F00  ; [.1545.0020.0002.03B1][.0000.0022.0002.0313] # GREEK SMALL LETTER ALPHA WITH PSILI; QQCM
+1F08  ; [.1545.0020.0008.0391][.0000.0022.0002.0313] # GREEK CAPITAL LETTER ALPHA WITH PSILI; QQCM
+1F04  ; [.1545.0020.0002.03B1][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA; QQCM
+1F0C  ; [.1545.0020.0008.0391][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA; QQCM
+1F84  ; [.1545.0020.0002.03B1][.0000.0022.0002.0313][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI; QQCM
+1F8C  ; [.1545.0020.0008.0391][.0000.0022.0002.0313][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI; QQCM
+1F02  ; [.1545.0020.0002.03B1][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA; QQCM
+1F0A  ; [.1545.0020.0008.0391][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA; QQCM
+1F82  ; [.1545.0020.0002.03B1][.0000.0022.0002.0313][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI; QQCM
+1F8A  ; [.1545.0020.0008.0391][.0000.0022.0002.0313][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI; QQCM
+1F06  ; [.1545.0020.0002.03B1][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI; QQCM
+1F0E  ; [.1545.0020.0008.0391][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI; QQCM
+1F86  ; [.1545.0020.0002.03B1][.0000.0022.0002.0313][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI; QQCM
+1F8E  ; [.1545.0020.0008.0391][.0000.0022.0002.0313][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI; QQCM
+1F80  ; [.1545.0020.0002.03B1][.0000.0022.0002.0313][.0000.007F.0002.0345] # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI; QQCM
+1F88  ; [.1545.0020.0008.0391][.0000.0022.0002.0313][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI; QQCM
+1F01  ; [.1545.0020.0002.03B1][.0000.002A.0002.0314] # GREEK SMALL LETTER ALPHA WITH DASIA; QQCM
+1F09  ; [.1545.0020.0008.0391][.0000.002A.0002.0314] # GREEK CAPITAL LETTER ALPHA WITH DASIA; QQCM
+1F05  ; [.1545.0020.0002.03B1][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA; QQCM
+1F0D  ; [.1545.0020.0008.0391][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA; QQCM
+1F85  ; [.1545.0020.0002.03B1][.0000.002A.0002.0314][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI; QQCM
+1F8D  ; [.1545.0020.0008.0391][.0000.002A.0002.0314][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI; QQCM
+1F03  ; [.1545.0020.0002.03B1][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA; QQCM
+1F0B  ; [.1545.0020.0008.0391][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA; QQCM
+1F83  ; [.1545.0020.0002.03B1][.0000.002A.0002.0314][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI; QQCM
+1F8B  ; [.1545.0020.0008.0391][.0000.002A.0002.0314][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI; QQCM
+1F07  ; [.1545.0020.0002.03B1][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI; QQCM
+1F0F  ; [.1545.0020.0008.0391][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI; QQCM
+1F87  ; [.1545.0020.0002.03B1][.0000.002A.0002.0314][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI; QQCM
+1F8F  ; [.1545.0020.0008.0391][.0000.002A.0002.0314][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI; QQCM
+1F81  ; [.1545.0020.0002.03B1][.0000.002A.0002.0314][.0000.007F.0002.0345] # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI; QQCM
+1F89  ; [.1545.0020.0008.0391][.0000.002A.0002.0314][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI; QQCM
+03AC  ; [.1545.0020.0002.03B1][.0000.0032.0002.0301] # GREEK SMALL LETTER ALPHA WITH TONOS; QQCM
+1F71  ; [.1545.0020.0002.03B1][.0000.0032.0002.0301] # GREEK SMALL LETTER ALPHA WITH OXIA; QQCM
+0386  ; [.1545.0020.0008.0391][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ALPHA WITH TONOS; QQCM
+1FBB  ; [.1545.0020.0008.0391][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ALPHA WITH OXIA; QQCM
+1FB4  ; [.1545.0020.0002.03B1][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI; QQCM
+1F70  ; [.1545.0020.0002.03B1][.0000.0035.0002.0300] # GREEK SMALL LETTER ALPHA WITH VARIA; QQCM
+1FBA  ; [.1545.0020.0008.0391][.0000.0035.0002.0300] # GREEK CAPITAL LETTER ALPHA WITH VARIA; QQCM
+1FB2  ; [.1545.0020.0002.03B1][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI; QQCM
+1FB0  ; [.1545.0020.0002.03B1][.0000.0037.0002.0306] # GREEK SMALL LETTER ALPHA WITH VRACHY; QQCM
+1FB8  ; [.1545.0020.0008.0391][.0000.0037.0002.0306] # GREEK CAPITAL LETTER ALPHA WITH VRACHY; QQCM
+1FB6  ; [.1545.0020.0002.03B1][.0000.0045.0002.0342] # GREEK SMALL LETTER ALPHA WITH PERISPOMENI; QQCM
+1FB7  ; [.1545.0020.0002.03B1][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI; QQCM
+1FB1  ; [.1545.0020.0002.03B1][.0000.005B.0002.0304] # GREEK SMALL LETTER ALPHA WITH MACRON; QQCM
+1FB9  ; [.1545.0020.0008.0391][.0000.005B.0002.0304] # GREEK CAPITAL LETTER ALPHA WITH MACRON; QQCM
+1FB3  ; [.1545.0020.0002.03B1][.0000.007F.0002.0345] # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI; QQCM
+1FBC  ; [.1545.0020.0008.0391][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI; QQCM
+03B2  ; [.1546.0020.0002.03B2] # GREEK SMALL LETTER BETA
+03D0  ; [.1546.0020.0004.03D0] # GREEK BETA SYMBOL; QQK
+1D6C3 ; [.1546.0020.0005.1D6C3] # MATHEMATICAL BOLD SMALL BETA; QQK
+1D6FD ; [.1546.0020.0005.1D6FD] # MATHEMATICAL ITALIC SMALL BETA; QQK
+1D737 ; [.1546.0020.0005.1D737] # MATHEMATICAL BOLD ITALIC SMALL BETA; QQK
+1D771 ; [.1546.0020.0005.1D771] # MATHEMATICAL SANS-SERIF BOLD SMALL BETA; QQK
+1D7AB ; [.1546.0020.0005.1D7AB] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA; QQK
+0392  ; [.1546.0020.0008.0392] # GREEK CAPITAL LETTER BETA
+1D6A9 ; [.1546.0020.000B.1D6A9] # MATHEMATICAL BOLD CAPITAL BETA; QQK
+1D6E3 ; [.1546.0020.000B.1D6E3] # MATHEMATICAL ITALIC CAPITAL BETA; QQK
+1D71D ; [.1546.0020.000B.1D71D] # MATHEMATICAL BOLD ITALIC CAPITAL BETA; QQK
+1D757 ; [.1546.0020.000B.1D757] # MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA; QQK
+1D791 ; [.1546.0020.000B.1D791] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA; QQK
+1D5D  ; [.1546.0020.0014.1D5D] # MODIFIER LETTER SMALL BETA; QQK
+1D66  ; [.1546.0020.0015.1D66] # GREEK SUBSCRIPT SMALL LETTER BETA; QQK
+03B3  ; [.1547.0020.0002.03B3] # GREEK SMALL LETTER GAMMA
+213D  ; [.1547.0020.0005.213D] # DOUBLE-STRUCK SMALL GAMMA; QQK
+1D6C4 ; [.1547.0020.0005.1D6C4] # MATHEMATICAL BOLD SMALL GAMMA; QQK
+1D6FE ; [.1547.0020.0005.1D6FE] # MATHEMATICAL ITALIC SMALL GAMMA; QQK
+1D738 ; [.1547.0020.0005.1D738] # MATHEMATICAL BOLD ITALIC SMALL GAMMA; QQK
+1D772 ; [.1547.0020.0005.1D772] # MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA; QQK
+1D7AC ; [.1547.0020.0005.1D7AC] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA; QQK
+0393  ; [.1547.0020.0008.0393] # GREEK CAPITAL LETTER GAMMA
+213E  ; [.1547.0020.000B.213E] # DOUBLE-STRUCK CAPITAL GAMMA; QQK
+1D6AA ; [.1547.0020.000B.1D6AA] # MATHEMATICAL BOLD CAPITAL GAMMA; QQK
+1D6E4 ; [.1547.0020.000B.1D6E4] # MATHEMATICAL ITALIC CAPITAL GAMMA; QQK
+1D71E ; [.1547.0020.000B.1D71E] # MATHEMATICAL BOLD ITALIC CAPITAL GAMMA; QQK
+1D758 ; [.1547.0020.000B.1D758] # MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA; QQK
+1D792 ; [.1547.0020.000B.1D792] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA; QQK
+1D5E  ; [.1547.0020.0014.1D5E] # MODIFIER LETTER SMALL GREEK GAMMA; QQK
+1D67  ; [.1547.0020.0015.1D67] # GREEK SUBSCRIPT SMALL LETTER GAMMA; QQK
+1D26  ; [.1548.0020.0002.1D26] # GREEK LETTER SMALL CAPITAL GAMMA
+03B4  ; [.1549.0020.0002.03B4] # GREEK SMALL LETTER DELTA
+1D6C5 ; [.1549.0020.0005.1D6C5] # MATHEMATICAL BOLD SMALL DELTA; QQK
+1D6FF ; [.1549.0020.0005.1D6FF] # MATHEMATICAL ITALIC SMALL DELTA; QQK
+1D739 ; [.1549.0020.0005.1D739] # MATHEMATICAL BOLD ITALIC SMALL DELTA; QQK
+1D773 ; [.1549.0020.0005.1D773] # MATHEMATICAL SANS-SERIF BOLD SMALL DELTA; QQK
+1D7AD ; [.1549.0020.0005.1D7AD] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA; QQK
+0394  ; [.1549.0020.0008.0394] # GREEK CAPITAL LETTER DELTA
+1D6AB ; [.1549.0020.000B.1D6AB] # MATHEMATICAL BOLD CAPITAL DELTA; QQK
+1D6E5 ; [.1549.0020.000B.1D6E5] # MATHEMATICAL ITALIC CAPITAL DELTA; QQK
+1D71F ; [.1549.0020.000B.1D71F] # MATHEMATICAL BOLD ITALIC CAPITAL DELTA; QQK
+1D759 ; [.1549.0020.000B.1D759] # MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA; QQK
+1D793 ; [.1549.0020.000B.1D793] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA; QQK
+1D5F  ; [.1549.0020.0014.1D5F] # MODIFIER LETTER SMALL DELTA; QQK
+03B5  ; [.154A.0020.0002.03B5] # GREEK SMALL LETTER EPSILON
+03F5  ; [.154A.0020.0004.03F5] # GREEK LUNATE EPSILON SYMBOL; QQK
+1D6C6 ; [.154A.0020.0005.1D6C6] # MATHEMATICAL BOLD SMALL EPSILON; QQK
+1D6DC ; [.154A.0020.0005.1D6DC] # MATHEMATICAL BOLD EPSILON SYMBOL; QQK
+1D700 ; [.154A.0020.0005.1D700] # MATHEMATICAL ITALIC SMALL EPSILON; QQK
+1D716 ; [.154A.0020.0005.1D716] # MATHEMATICAL ITALIC EPSILON SYMBOL; QQK
+1D73A ; [.154A.0020.0005.1D73A] # MATHEMATICAL BOLD ITALIC SMALL EPSILON; QQK
+1D750 ; [.154A.0020.0005.1D750] # MATHEMATICAL BOLD ITALIC EPSILON SYMBOL; QQK
+1D774 ; [.154A.0020.0005.1D774] # MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON; QQK
+1D78A ; [.154A.0020.0005.1D78A] # MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL; QQK
+1D7AE ; [.154A.0020.0005.1D7AE] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON; QQK
+1D7C4 ; [.154A.0020.0005.1D7C4] # MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL; QQK
+0395  ; [.154A.0020.0008.0395] # GREEK CAPITAL LETTER EPSILON
+1D6AC ; [.154A.0020.000B.1D6AC] # MATHEMATICAL BOLD CAPITAL EPSILON; QQK
+1D6E6 ; [.154A.0020.000B.1D6E6] # MATHEMATICAL ITALIC CAPITAL EPSILON; QQK
+1D720 ; [.154A.0020.000B.1D720] # MATHEMATICAL BOLD ITALIC CAPITAL EPSILON; QQK
+1D75A ; [.154A.0020.000B.1D75A] # MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON; QQK
+1D794 ; [.154A.0020.000B.1D794] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON; QQK
+1F10  ; [.154A.0020.0002.03B5][.0000.0022.0002.0313] # GREEK SMALL LETTER EPSILON WITH PSILI; QQCM
+1F18  ; [.154A.0020.0008.0395][.0000.0022.0002.0313] # GREEK CAPITAL LETTER EPSILON WITH PSILI; QQCM
+1F14  ; [.154A.0020.0002.03B5][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA; QQCM
+1F1C  ; [.154A.0020.0008.0395][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA; QQCM
+1F12  ; [.154A.0020.0002.03B5][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA; QQCM
+1F1A  ; [.154A.0020.0008.0395][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA; QQCM
+1F11  ; [.154A.0020.0002.03B5][.0000.002A.0002.0314] # GREEK SMALL LETTER EPSILON WITH DASIA; QQCM
+1F19  ; [.154A.0020.0008.0395][.0000.002A.0002.0314] # GREEK CAPITAL LETTER EPSILON WITH DASIA; QQCM
+1F15  ; [.154A.0020.0002.03B5][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA; QQCM
+1F1D  ; [.154A.0020.0008.0395][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA; QQCM
+1F13  ; [.154A.0020.0002.03B5][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA; QQCM
+1F1B  ; [.154A.0020.0008.0395][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA; QQCM
+03AD  ; [.154A.0020.0002.03B5][.0000.0032.0002.0301] # GREEK SMALL LETTER EPSILON WITH TONOS; QQCM
+1F73  ; [.154A.0020.0002.03B5][.0000.0032.0002.0301] # GREEK SMALL LETTER EPSILON WITH OXIA; QQCM
+0388  ; [.154A.0020.0008.0395][.0000.0032.0002.0301] # GREEK CAPITAL LETTER EPSILON WITH TONOS; QQCM
+1FC9  ; [.154A.0020.0008.0395][.0000.0032.0002.0301] # GREEK CAPITAL LETTER EPSILON WITH OXIA; QQCM
+1F72  ; [.154A.0020.0002.03B5][.0000.0035.0002.0300] # GREEK SMALL LETTER EPSILON WITH VARIA; QQCM
+1FC8  ; [.154A.0020.0008.0395][.0000.0035.0002.0300] # GREEK CAPITAL LETTER EPSILON WITH VARIA; QQCM
+03DD  ; [.154B.0020.0002.03DD] # GREEK SMALL LETTER DIGAMMA
+1D7CB ; [.154B.0020.0005.1D7CB] # MATHEMATICAL BOLD SMALL DIGAMMA; QQK
+03DC  ; [.154B.0020.0008.03DC] # GREEK LETTER DIGAMMA
+1D7CA ; [.154B.0020.000B.1D7CA] # MATHEMATICAL BOLD CAPITAL DIGAMMA; QQK
+0377  ; [.154C.0020.0002.0377] # GREEK SMALL LETTER PAMPHYLIAN DIGAMMA
+0376  ; [.154C.0020.0008.0376] # GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA
+03DB  ; [.154D.0020.0002.03DB] # GREEK SMALL LETTER STIGMA
+03DA  ; [.154D.0020.0008.03DA] # GREEK LETTER STIGMA
+03B6  ; [.154E.0020.0002.03B6] # GREEK SMALL LETTER ZETA
+1D6C7 ; [.154E.0020.0005.1D6C7] # MATHEMATICAL BOLD SMALL ZETA; QQK
+1D701 ; [.154E.0020.0005.1D701] # MATHEMATICAL ITALIC SMALL ZETA; QQK
+1D73B ; [.154E.0020.0005.1D73B] # MATHEMATICAL BOLD ITALIC SMALL ZETA; QQK
+1D775 ; [.154E.0020.0005.1D775] # MATHEMATICAL SANS-SERIF BOLD SMALL ZETA; QQK
+1D7AF ; [.154E.0020.0005.1D7AF] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA; QQK
+0396  ; [.154E.0020.0008.0396] # GREEK CAPITAL LETTER ZETA
+1D6AD ; [.154E.0020.000B.1D6AD] # MATHEMATICAL BOLD CAPITAL ZETA; QQK
+1D6E7 ; [.154E.0020.000B.1D6E7] # MATHEMATICAL ITALIC CAPITAL ZETA; QQK
+1D721 ; [.154E.0020.000B.1D721] # MATHEMATICAL BOLD ITALIC CAPITAL ZETA; QQK
+1D75B ; [.154E.0020.000B.1D75B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA; QQK
+1D795 ; [.154E.0020.000B.1D795] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA; QQK
+0371  ; [.154F.0020.0002.0371] # GREEK SMALL LETTER HETA
+0370  ; [.154F.0020.0008.0370] # GREEK CAPITAL LETTER HETA
+03B7  ; [.1550.0020.0002.03B7] # GREEK SMALL LETTER ETA
+1D6C8 ; [.1550.0020.0005.1D6C8] # MATHEMATICAL BOLD SMALL ETA; QQK
+1D702 ; [.1550.0020.0005.1D702] # MATHEMATICAL ITALIC SMALL ETA; QQK
+1D73C ; [.1550.0020.0005.1D73C] # MATHEMATICAL BOLD ITALIC SMALL ETA; QQK
+1D776 ; [.1550.0020.0005.1D776] # MATHEMATICAL SANS-SERIF BOLD SMALL ETA; QQK
+1D7B0 ; [.1550.0020.0005.1D7B0] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA; QQK
+0397  ; [.1550.0020.0008.0397] # GREEK CAPITAL LETTER ETA
+1D6AE ; [.1550.0020.000B.1D6AE] # MATHEMATICAL BOLD CAPITAL ETA; QQK
+1D6E8 ; [.1550.0020.000B.1D6E8] # MATHEMATICAL ITALIC CAPITAL ETA; QQK
+1D722 ; [.1550.0020.000B.1D722] # MATHEMATICAL BOLD ITALIC CAPITAL ETA; QQK
+1D75C ; [.1550.0020.000B.1D75C] # MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA; QQK
+1D796 ; [.1550.0020.000B.1D796] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA; QQK
+1F20  ; [.1550.0020.0002.03B7][.0000.0022.0002.0313] # GREEK SMALL LETTER ETA WITH PSILI; QQCM
+1F28  ; [.1550.0020.0008.0397][.0000.0022.0002.0313] # GREEK CAPITAL LETTER ETA WITH PSILI; QQCM
+1F24  ; [.1550.0020.0002.03B7][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK SMALL LETTER ETA WITH PSILI AND OXIA; QQCM
+1F2C  ; [.1550.0020.0008.0397][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA; QQCM
+1F94  ; [.1550.0020.0002.03B7][.0000.0022.0002.0313][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI; QQCM
+1F9C  ; [.1550.0020.0008.0397][.0000.0022.0002.0313][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI; QQCM
+1F22  ; [.1550.0020.0002.03B7][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK SMALL LETTER ETA WITH PSILI AND VARIA; QQCM
+1F2A  ; [.1550.0020.0008.0397][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA; QQCM
+1F92  ; [.1550.0020.0002.03B7][.0000.0022.0002.0313][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI; QQCM
+1F9A  ; [.1550.0020.0008.0397][.0000.0022.0002.0313][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI; QQCM
+1F26  ; [.1550.0020.0002.03B7][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI; QQCM
+1F2E  ; [.1550.0020.0008.0397][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI; QQCM
+1F96  ; [.1550.0020.0002.03B7][.0000.0022.0002.0313][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI; QQCM
+1F9E  ; [.1550.0020.0008.0397][.0000.0022.0002.0313][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI; QQCM
+1F90  ; [.1550.0020.0002.03B7][.0000.0022.0002.0313][.0000.007F.0002.0345] # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI; QQCM
+1F98  ; [.1550.0020.0008.0397][.0000.0022.0002.0313][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI; QQCM
+1F21  ; [.1550.0020.0002.03B7][.0000.002A.0002.0314] # GREEK SMALL LETTER ETA WITH DASIA; QQCM
+1F29  ; [.1550.0020.0008.0397][.0000.002A.0002.0314] # GREEK CAPITAL LETTER ETA WITH DASIA; QQCM
+1F25  ; [.1550.0020.0002.03B7][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK SMALL LETTER ETA WITH DASIA AND OXIA; QQCM
+1F2D  ; [.1550.0020.0008.0397][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA; QQCM
+1F95  ; [.1550.0020.0002.03B7][.0000.002A.0002.0314][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI; QQCM
+1F9D  ; [.1550.0020.0008.0397][.0000.002A.0002.0314][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI; QQCM
+1F23  ; [.1550.0020.0002.03B7][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK SMALL LETTER ETA WITH DASIA AND VARIA; QQCM
+1F2B  ; [.1550.0020.0008.0397][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA; QQCM
+1F93  ; [.1550.0020.0002.03B7][.0000.002A.0002.0314][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI; QQCM
+1F9B  ; [.1550.0020.0008.0397][.0000.002A.0002.0314][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI; QQCM
+1F27  ; [.1550.0020.0002.03B7][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI; QQCM
+1F2F  ; [.1550.0020.0008.0397][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI; QQCM
+1F97  ; [.1550.0020.0002.03B7][.0000.002A.0002.0314][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI; QQCM
+1F9F  ; [.1550.0020.0008.0397][.0000.002A.0002.0314][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI; QQCM
+1F91  ; [.1550.0020.0002.03B7][.0000.002A.0002.0314][.0000.007F.0002.0345] # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI; QQCM
+1F99  ; [.1550.0020.0008.0397][.0000.002A.0002.0314][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI; QQCM
+03AE  ; [.1550.0020.0002.03B7][.0000.0032.0002.0301] # GREEK SMALL LETTER ETA WITH TONOS; QQCM
+1F75  ; [.1550.0020.0002.03B7][.0000.0032.0002.0301] # GREEK SMALL LETTER ETA WITH OXIA; QQCM
+0389  ; [.1550.0020.0008.0397][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ETA WITH TONOS; QQCM
+1FCB  ; [.1550.0020.0008.0397][.0000.0032.0002.0301] # GREEK CAPITAL LETTER ETA WITH OXIA; QQCM
+1FC4  ; [.1550.0020.0002.03B7][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI; QQCM
+1F74  ; [.1550.0020.0002.03B7][.0000.0035.0002.0300] # GREEK SMALL LETTER ETA WITH VARIA; QQCM
+1FCA  ; [.1550.0020.0008.0397][.0000.0035.0002.0300] # GREEK CAPITAL LETTER ETA WITH VARIA; QQCM
+1FC2  ; [.1550.0020.0002.03B7][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI; QQCM
+1FC6  ; [.1550.0020.0002.03B7][.0000.0045.0002.0342] # GREEK SMALL LETTER ETA WITH PERISPOMENI; QQCM
+1FC7  ; [.1550.0020.0002.03B7][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI; QQCM
+1FC3  ; [.1550.0020.0002.03B7][.0000.007F.0002.0345] # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI; QQCM
+1FCC  ; [.1550.0020.0008.0397][.0000.007F.0002.0345] # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI; QQCM
+03B8  ; [.1551.0020.0002.03B8] # GREEK SMALL LETTER THETA
+03D1  ; [.1551.0020.0004.03D1] # GREEK THETA SYMBOL; QQK
+1D6C9 ; [.1551.0020.0005.1D6C9] # MATHEMATICAL BOLD SMALL THETA; QQK
+1D6DD ; [.1551.0020.0005.1D6DD] # MATHEMATICAL BOLD THETA SYMBOL; QQK
+1D703 ; [.1551.0020.0005.1D703] # MATHEMATICAL ITALIC SMALL THETA; QQK
+1D717 ; [.1551.0020.0005.1D717] # MATHEMATICAL ITALIC THETA SYMBOL; QQK
+1D73D ; [.1551.0020.0005.1D73D] # MATHEMATICAL BOLD ITALIC SMALL THETA; QQK
+1D751 ; [.1551.0020.0005.1D751] # MATHEMATICAL BOLD ITALIC THETA SYMBOL; QQK
+1D777 ; [.1551.0020.0005.1D777] # MATHEMATICAL SANS-SERIF BOLD SMALL THETA; QQK
+1D78B ; [.1551.0020.0005.1D78B] # MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL; QQK
+1D7B1 ; [.1551.0020.0005.1D7B1] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA; QQK
+1D7C5 ; [.1551.0020.0005.1D7C5] # MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL; QQK
+0398  ; [.1551.0020.0008.0398] # GREEK CAPITAL LETTER THETA
+03F4  ; [.1551.0020.000A.03F4] # GREEK CAPITAL THETA SYMBOL; QQK
+1D6AF ; [.1551.0020.000B.1D6AF] # MATHEMATICAL BOLD CAPITAL THETA; QQK
+1D6B9 ; [.1551.0020.000B.1D6B9] # MATHEMATICAL BOLD CAPITAL THETA SYMBOL; QQK
+1D6E9 ; [.1551.0020.000B.1D6E9] # MATHEMATICAL ITALIC CAPITAL THETA; QQK
+1D6F3 ; [.1551.0020.000B.1D6F3] # MATHEMATICAL ITALIC CAPITAL THETA SYMBOL; QQK
+1D723 ; [.1551.0020.000B.1D723] # MATHEMATICAL BOLD ITALIC CAPITAL THETA; QQK
+1D72D ; [.1551.0020.000B.1D72D] # MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL; QQK
+1D75D ; [.1551.0020.000B.1D75D] # MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA; QQK
+1D767 ; [.1551.0020.000B.1D767] # MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL; QQK
+1D797 ; [.1551.0020.000B.1D797] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA; QQK
+1D7A1 ; [.1551.0020.000B.1D7A1] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL; QQK
+1DBF  ; [.1551.0020.0014.1DBF] # MODIFIER LETTER SMALL THETA; QQK
+03B9  ; [.1552.0020.0002.03B9] # GREEK SMALL LETTER IOTA
+1FBE  ; [.1552.0020.0002.1FBE] # GREEK PROSGEGRAMMENI; QQC
+037A  ; [.1552.0020.0004.037A] # GREEK YPOGEGRAMMENI; QQK
+1D6CA ; [.1552.0020.0005.1D6CA] # MATHEMATICAL BOLD SMALL IOTA; QQK
+1D704 ; [.1552.0020.0005.1D704] # MATHEMATICAL ITALIC SMALL IOTA; QQK
+1D73E ; [.1552.0020.0005.1D73E] # MATHEMATICAL BOLD ITALIC SMALL IOTA; QQK
+1D778 ; [.1552.0020.0005.1D778] # MATHEMATICAL SANS-SERIF BOLD SMALL IOTA; QQK
+1D7B2 ; [.1552.0020.0005.1D7B2] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA; QQK
+0399  ; [.1552.0020.0008.0399] # GREEK CAPITAL LETTER IOTA
+1D6B0 ; [.1552.0020.000B.1D6B0] # MATHEMATICAL BOLD CAPITAL IOTA; QQK
+1D6EA ; [.1552.0020.000B.1D6EA] # MATHEMATICAL ITALIC CAPITAL IOTA; QQK
+1D724 ; [.1552.0020.000B.1D724] # MATHEMATICAL BOLD ITALIC CAPITAL IOTA; QQK
+1D75E ; [.1552.0020.000B.1D75E] # MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA; QQK
+1D798 ; [.1552.0020.000B.1D798] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA; QQK
+1F30  ; [.1552.0020.0002.03B9][.0000.0022.0002.0313] # GREEK SMALL LETTER IOTA WITH PSILI; QQCM
+1F38  ; [.1552.0020.0008.0399][.0000.0022.0002.0313] # GREEK CAPITAL LETTER IOTA WITH PSILI; QQCM
+1F34  ; [.1552.0020.0002.03B9][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA; QQCM
+1F3C  ; [.1552.0020.0008.0399][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA; QQCM
+1F32  ; [.1552.0020.0002.03B9][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK SMALL LETTER IOTA WITH PSILI AND VARIA; QQCM
+1F3A  ; [.1552.0020.0008.0399][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA; QQCM
+1F36  ; [.1552.0020.0002.03B9][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI; QQCM
+1F3E  ; [.1552.0020.0008.0399][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI; QQCM
+1F31  ; [.1552.0020.0002.03B9][.0000.002A.0002.0314] # GREEK SMALL LETTER IOTA WITH DASIA; QQCM
+1F39  ; [.1552.0020.0008.0399][.0000.002A.0002.0314] # GREEK CAPITAL LETTER IOTA WITH DASIA; QQCM
+1F35  ; [.1552.0020.0002.03B9][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA; QQCM
+1F3D  ; [.1552.0020.0008.0399][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA; QQCM
+1F33  ; [.1552.0020.0002.03B9][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK SMALL LETTER IOTA WITH DASIA AND VARIA; QQCM
+1F3B  ; [.1552.0020.0008.0399][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA; QQCM
+1F37  ; [.1552.0020.0002.03B9][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI; QQCM
+1F3F  ; [.1552.0020.0008.0399][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI; QQCM
+03AF  ; [.1552.0020.0002.03B9][.0000.0032.0002.0301] # GREEK SMALL LETTER IOTA WITH TONOS; QQCM
+1F77  ; [.1552.0020.0002.03B9][.0000.0032.0002.0301] # GREEK SMALL LETTER IOTA WITH OXIA; QQCM
+038A  ; [.1552.0020.0008.0399][.0000.0032.0002.0301] # GREEK CAPITAL LETTER IOTA WITH TONOS; QQCM
+1FDB  ; [.1552.0020.0008.0399][.0000.0032.0002.0301] # GREEK CAPITAL LETTER IOTA WITH OXIA; QQCM
+1F76  ; [.1552.0020.0002.03B9][.0000.0035.0002.0300] # GREEK SMALL LETTER IOTA WITH VARIA; QQCM
+1FDA  ; [.1552.0020.0008.0399][.0000.0035.0002.0300] # GREEK CAPITAL LETTER IOTA WITH VARIA; QQCM
+1FD0  ; [.1552.0020.0002.03B9][.0000.0037.0002.0306] # GREEK SMALL LETTER IOTA WITH VRACHY; QQCM
+1FD8  ; [.1552.0020.0008.0399][.0000.0037.0002.0306] # GREEK CAPITAL LETTER IOTA WITH VRACHY; QQCM
+1FD6  ; [.1552.0020.0002.03B9][.0000.0045.0002.0342] # GREEK SMALL LETTER IOTA WITH PERISPOMENI; QQCM
+03CA  ; [.1552.0020.0002.03B9][.0000.0047.0002.0308] # GREEK SMALL LETTER IOTA WITH DIALYTIKA; QQCM
+03AA  ; [.1552.0020.0008.0399][.0000.0047.0002.0308] # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA; QQCM
+0390  ; [.1552.0020.0002.03B9][.0000.0047.0002.0308][.0000.0032.0002.0301] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS; QQCM
+1FD3  ; [.1552.0020.0002.03B9][.0000.0047.0002.0308][.0000.0032.0002.0301] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA; QQCM
+1FD2  ; [.1552.0020.0002.03B9][.0000.0047.0002.0308][.0000.0035.0002.0300] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA; QQCM
+1FD7  ; [.1552.0020.0002.03B9][.0000.0047.0002.0308][.0000.0045.0002.0342] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI; QQCM
+1FD1  ; [.1552.0020.0002.03B9][.0000.005B.0002.0304] # GREEK SMALL LETTER IOTA WITH MACRON; QQCM
+1FD9  ; [.1552.0020.0008.0399][.0000.005B.0002.0304] # GREEK CAPITAL LETTER IOTA WITH MACRON; QQCM
+03F3  ; [.1553.0020.0002.03F3] # GREEK LETTER YOT
+03BA  ; [.1554.0020.0002.03BA] # GREEK SMALL LETTER KAPPA
+03F0  ; [.1554.0020.0004.03F0] # GREEK KAPPA SYMBOL; QQK
+1D6CB ; [.1554.0020.0005.1D6CB] # MATHEMATICAL BOLD SMALL KAPPA; QQK
+1D6DE ; [.1554.0020.0005.1D6DE] # MATHEMATICAL BOLD KAPPA SYMBOL; QQK
+1D705 ; [.1554.0020.0005.1D705] # MATHEMATICAL ITALIC SMALL KAPPA; QQK
+1D718 ; [.1554.0020.0005.1D718] # MATHEMATICAL ITALIC KAPPA SYMBOL; QQK
+1D73F ; [.1554.0020.0005.1D73F] # MATHEMATICAL BOLD ITALIC SMALL KAPPA; QQK
+1D752 ; [.1554.0020.0005.1D752] # MATHEMATICAL BOLD ITALIC KAPPA SYMBOL; QQK
+1D779 ; [.1554.0020.0005.1D779] # MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA; QQK
+1D78C ; [.1554.0020.0005.1D78C] # MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL; QQK
+1D7B3 ; [.1554.0020.0005.1D7B3] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA; QQK
+1D7C6 ; [.1554.0020.0005.1D7C6] # MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL; QQK
+039A  ; [.1554.0020.0008.039A] # GREEK CAPITAL LETTER KAPPA
+1D6B1 ; [.1554.0020.000B.1D6B1] # MATHEMATICAL BOLD CAPITAL KAPPA; QQK
+1D6EB ; [.1554.0020.000B.1D6EB] # MATHEMATICAL ITALIC CAPITAL KAPPA; QQK
+1D725 ; [.1554.0020.000B.1D725] # MATHEMATICAL BOLD ITALIC CAPITAL KAPPA; QQK
+1D75F ; [.1554.0020.000B.1D75F] # MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA; QQK
+1D799 ; [.1554.0020.000B.1D799] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA; QQK
+03D7  ; [.1554.0020.0004.03D7][.1545.0020.0004.03D7][.1552.0020.001F.03D7] # GREEK KAI SYMBOL; QQKN
+03CF  ; [.1554.0020.000A.03CF][.1545.0020.0004.03CF][.1552.0020.001F.03CF] # GREEK CAPITAL KAI SYMBOL; QQKN
+03BB  ; [.1555.0020.0002.03BB] # GREEK SMALL LETTER LAMDA
+1D6CC ; [.1555.0020.0005.1D6CC] # MATHEMATICAL BOLD SMALL LAMDA; QQK
+1D706 ; [.1555.0020.0005.1D706] # MATHEMATICAL ITALIC SMALL LAMDA; QQK
+1D740 ; [.1555.0020.0005.1D740] # MATHEMATICAL BOLD ITALIC SMALL LAMDA; QQK
+1D77A ; [.1555.0020.0005.1D77A] # MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA; QQK
+1D7B4 ; [.1555.0020.0005.1D7B4] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA; QQK
+039B  ; [.1555.0020.0008.039B] # GREEK CAPITAL LETTER LAMDA
+1D6B2 ; [.1555.0020.000B.1D6B2] # MATHEMATICAL BOLD CAPITAL LAMDA; QQK
+1D6EC ; [.1555.0020.000B.1D6EC] # MATHEMATICAL ITALIC CAPITAL LAMDA; QQK
+1D726 ; [.1555.0020.000B.1D726] # MATHEMATICAL BOLD ITALIC CAPITAL LAMDA; QQK
+1D760 ; [.1555.0020.000B.1D760] # MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA; QQK
+1D79A ; [.1555.0020.000B.1D79A] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA; QQK
+1D27  ; [.1556.0020.0002.1D27] # GREEK LETTER SMALL CAPITAL LAMDA
+03BC  ; [.1557.0020.0002.03BC] # GREEK SMALL LETTER MU
+00B5  ; [.1557.0020.0004.00B5] # MICRO SIGN; QQK
+1D6CD ; [.1557.0020.0005.1D6CD] # MATHEMATICAL BOLD SMALL MU; QQK
+1D707 ; [.1557.0020.0005.1D707] # MATHEMATICAL ITALIC SMALL MU; QQK
+1D741 ; [.1557.0020.0005.1D741] # MATHEMATICAL BOLD ITALIC SMALL MU; QQK
+1D77B ; [.1557.0020.0005.1D77B] # MATHEMATICAL SANS-SERIF BOLD SMALL MU; QQK
+1D7B5 ; [.1557.0020.0005.1D7B5] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU; QQK
+039C  ; [.1557.0020.0008.039C] # GREEK CAPITAL LETTER MU
+1D6B3 ; [.1557.0020.000B.1D6B3] # MATHEMATICAL BOLD CAPITAL MU; QQK
+1D6ED ; [.1557.0020.000B.1D6ED] # MATHEMATICAL ITALIC CAPITAL MU; QQK
+1D727 ; [.1557.0020.000B.1D727] # MATHEMATICAL BOLD ITALIC CAPITAL MU; QQK
+1D761 ; [.1557.0020.000B.1D761] # MATHEMATICAL SANS-SERIF BOLD CAPITAL MU; QQK
+1D79B ; [.1557.0020.000B.1D79B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU; QQK
+3382  ; [.1557.0020.001C.3382][.120F.0020.001D.3382] # SQUARE MU A; QQKN
+338C  ; [.1557.0020.001C.338C][.12A3.0020.001D.338C] # SQUARE MU F; QQKN
+338D  ; [.1557.0020.001C.338D][.12B0.0020.001C.338D] # SQUARE MU G; QQKN
+3395  ; [.1557.0020.001C.3395][.1330.0020.001C.3395] # SQUARE MU L; QQKN
+339B  ; [.1557.0020.001C.339B][.135F.0020.001C.339B] # SQUARE MU M; QQKN
+33B2  ; [.1557.0020.001C.33B2][.1410.0020.001C.33B2] # SQUARE MU S; QQKN
+33B6  ; [.1557.0020.001C.33B6][.147B.0020.001D.33B6] # SQUARE MU V; QQKN
+33BC  ; [.1557.0020.001C.33BC][.148D.0020.001D.33BC] # SQUARE MU W; QQKN
+03BD  ; [.1558.0020.0002.03BD] # GREEK SMALL LETTER NU
+1D6CE ; [.1558.0020.0005.1D6CE] # MATHEMATICAL BOLD SMALL NU; QQK
+1D708 ; [.1558.0020.0005.1D708] # MATHEMATICAL ITALIC SMALL NU; QQK
+1D742 ; [.1558.0020.0005.1D742] # MATHEMATICAL BOLD ITALIC SMALL NU; QQK
+1D77C ; [.1558.0020.0005.1D77C] # MATHEMATICAL SANS-SERIF BOLD SMALL NU; QQK
+1D7B6 ; [.1558.0020.0005.1D7B6] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU; QQK
+039D  ; [.1558.0020.0008.039D] # GREEK CAPITAL LETTER NU
+1D6B4 ; [.1558.0020.000B.1D6B4] # MATHEMATICAL BOLD CAPITAL NU; QQK
+1D6EE ; [.1558.0020.000B.1D6EE] # MATHEMATICAL ITALIC CAPITAL NU; QQK
+1D728 ; [.1558.0020.000B.1D728] # MATHEMATICAL BOLD ITALIC CAPITAL NU; QQK
+1D762 ; [.1558.0020.000B.1D762] # MATHEMATICAL SANS-SERIF BOLD CAPITAL NU; QQK
+1D79C ; [.1558.0020.000B.1D79C] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU; QQK
+03BE  ; [.1559.0020.0002.03BE] # GREEK SMALL LETTER XI
+1D6CF ; [.1559.0020.0005.1D6CF] # MATHEMATICAL BOLD SMALL XI; QQK
+1D709 ; [.1559.0020.0005.1D709] # MATHEMATICAL ITALIC SMALL XI; QQK
+1D743 ; [.1559.0020.0005.1D743] # MATHEMATICAL BOLD ITALIC SMALL XI; QQK
+1D77D ; [.1559.0020.0005.1D77D] # MATHEMATICAL SANS-SERIF BOLD SMALL XI; QQK
+1D7B7 ; [.1559.0020.0005.1D7B7] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI; QQK
+039E  ; [.1559.0020.0008.039E] # GREEK CAPITAL LETTER XI
+1D6B5 ; [.1559.0020.000B.1D6B5] # MATHEMATICAL BOLD CAPITAL XI; QQK
+1D6EF ; [.1559.0020.000B.1D6EF] # MATHEMATICAL ITALIC CAPITAL XI; QQK
+1D729 ; [.1559.0020.000B.1D729] # MATHEMATICAL BOLD ITALIC CAPITAL XI; QQK
+1D763 ; [.1559.0020.000B.1D763] # MATHEMATICAL SANS-SERIF BOLD CAPITAL XI; QQK
+1D79D ; [.1559.0020.000B.1D79D] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI; QQK
+03BF  ; [.155A.0020.0002.03BF] # GREEK SMALL LETTER OMICRON
+1D6D0 ; [.155A.0020.0005.1D6D0] # MATHEMATICAL BOLD SMALL OMICRON; QQK
+1D70A ; [.155A.0020.0005.1D70A] # MATHEMATICAL ITALIC SMALL OMICRON; QQK
+1D744 ; [.155A.0020.0005.1D744] # MATHEMATICAL BOLD ITALIC SMALL OMICRON; QQK
+1D77E ; [.155A.0020.0005.1D77E] # MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON; QQK
+1D7B8 ; [.155A.0020.0005.1D7B8] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON; QQK
+039F  ; [.155A.0020.0008.039F] # GREEK CAPITAL LETTER OMICRON
+1D6B6 ; [.155A.0020.000B.1D6B6] # MATHEMATICAL BOLD CAPITAL OMICRON; QQK
+1D6F0 ; [.155A.0020.000B.1D6F0] # MATHEMATICAL ITALIC CAPITAL OMICRON; QQK
+1D72A ; [.155A.0020.000B.1D72A] # MATHEMATICAL BOLD ITALIC CAPITAL OMICRON; QQK
+1D764 ; [.155A.0020.000B.1D764] # MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON; QQK
+1D79E ; [.155A.0020.000B.1D79E] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON; QQK
+1F40  ; [.155A.0020.0002.03BF][.0000.0022.0002.0313] # GREEK SMALL LETTER OMICRON WITH PSILI; QQCM
+1F48  ; [.155A.0020.0008.039F][.0000.0022.0002.0313] # GREEK CAPITAL LETTER OMICRON WITH PSILI; QQCM
+1F44  ; [.155A.0020.0002.03BF][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA; QQCM
+1F4C  ; [.155A.0020.0008.039F][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA; QQCM
+1F42  ; [.155A.0020.0002.03BF][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA; QQCM
+1F4A  ; [.155A.0020.0008.039F][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA; QQCM
+1F41  ; [.155A.0020.0002.03BF][.0000.002A.0002.0314] # GREEK SMALL LETTER OMICRON WITH DASIA; QQCM
+1F49  ; [.155A.0020.0008.039F][.0000.002A.0002.0314] # GREEK CAPITAL LETTER OMICRON WITH DASIA; QQCM
+1F45  ; [.155A.0020.0002.03BF][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA; QQCM
+1F4D  ; [.155A.0020.0008.039F][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA; QQCM
+1F43  ; [.155A.0020.0002.03BF][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA; QQCM
+1F4B  ; [.155A.0020.0008.039F][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA; QQCM
+03CC  ; [.155A.0020.0002.03BF][.0000.0032.0002.0301] # GREEK SMALL LETTER OMICRON WITH TONOS; QQCM
+1F79  ; [.155A.0020.0002.03BF][.0000.0032.0002.0301] # GREEK SMALL LETTER OMICRON WITH OXIA; QQCM
+038C  ; [.155A.0020.0008.039F][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMICRON WITH TONOS; QQCM
+1FF9  ; [.155A.0020.0008.039F][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMICRON WITH OXIA; QQCM
+1F78  ; [.155A.0020.0002.03BF][.0000.0035.0002.0300] # GREEK SMALL LETTER OMICRON WITH VARIA; QQCM
+1FF8  ; [.155A.0020.0008.039F][.0000.0035.0002.0300] # GREEK CAPITAL LETTER OMICRON WITH VARIA; QQCM
+03C0  ; [.155B.0020.0002.03C0] # GREEK SMALL LETTER PI
+03D6  ; [.155B.0020.0004.03D6] # GREEK PI SYMBOL; QQK
+213C  ; [.155B.0020.0005.213C] # DOUBLE-STRUCK SMALL PI; QQK
+1D6D1 ; [.155B.0020.0005.1D6D1] # MATHEMATICAL BOLD SMALL PI; QQK
+1D6E1 ; [.155B.0020.0005.1D6E1] # MATHEMATICAL BOLD PI SYMBOL; QQK
+1D70B ; [.155B.0020.0005.1D70B] # MATHEMATICAL ITALIC SMALL PI; QQK
+1D71B ; [.155B.0020.0005.1D71B] # MATHEMATICAL ITALIC PI SYMBOL; QQK
+1D745 ; [.155B.0020.0005.1D745] # MATHEMATICAL BOLD ITALIC SMALL PI; QQK
+1D755 ; [.155B.0020.0005.1D755] # MATHEMATICAL BOLD ITALIC PI SYMBOL; QQK
+1D77F ; [.155B.0020.0005.1D77F] # MATHEMATICAL SANS-SERIF BOLD SMALL PI; QQK
+1D78F ; [.155B.0020.0005.1D78F] # MATHEMATICAL SANS-SERIF BOLD PI SYMBOL; QQK
+1D7B9 ; [.155B.0020.0005.1D7B9] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI; QQK
+1D7C9 ; [.155B.0020.0005.1D7C9] # MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL; QQK
+03A0  ; [.155B.0020.0008.03A0] # GREEK CAPITAL LETTER PI
+213F  ; [.155B.0020.000B.213F] # DOUBLE-STRUCK CAPITAL PI; QQK
+1D6B7 ; [.155B.0020.000B.1D6B7] # MATHEMATICAL BOLD CAPITAL PI; QQK
+1D6F1 ; [.155B.0020.000B.1D6F1] # MATHEMATICAL ITALIC CAPITAL PI; QQK
+1D72B ; [.155B.0020.000B.1D72B] # MATHEMATICAL BOLD ITALIC CAPITAL PI; QQK
+1D765 ; [.155B.0020.000B.1D765] # MATHEMATICAL SANS-SERIF BOLD CAPITAL PI; QQK
+1D79F ; [.155B.0020.000B.1D79F] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI; QQK
+1D28  ; [.155C.0020.0002.1D28] # GREEK LETTER SMALL CAPITAL PI
+03FB  ; [.155D.0020.0002.03FB] # GREEK SMALL LETTER SAN
+03FA  ; [.155D.0020.0008.03FA] # GREEK CAPITAL LETTER SAN
+03DF  ; [.155E.0020.0002.03DF] # GREEK SMALL LETTER KOPPA
+03DE  ; [.155E.0020.0008.03DE] # GREEK LETTER KOPPA
+03D9  ; [.155F.0020.0002.03D9] # GREEK SMALL LETTER ARCHAIC KOPPA
+03D8  ; [.155F.0020.0008.03D8] # GREEK LETTER ARCHAIC KOPPA
+03C1  ; [.1560.0020.0002.03C1] # GREEK SMALL LETTER RHO
+03F1  ; [.1560.0020.0004.03F1] # GREEK RHO SYMBOL; QQK
+1D6D2 ; [.1560.0020.0005.1D6D2] # MATHEMATICAL BOLD SMALL RHO; QQK
+1D6E0 ; [.1560.0020.0005.1D6E0] # MATHEMATICAL BOLD RHO SYMBOL; QQK
+1D70C ; [.1560.0020.0005.1D70C] # MATHEMATICAL ITALIC SMALL RHO; QQK
+1D71A ; [.1560.0020.0005.1D71A] # MATHEMATICAL ITALIC RHO SYMBOL; QQK
+1D746 ; [.1560.0020.0005.1D746] # MATHEMATICAL BOLD ITALIC SMALL RHO; QQK
+1D754 ; [.1560.0020.0005.1D754] # MATHEMATICAL BOLD ITALIC RHO SYMBOL; QQK
+1D780 ; [.1560.0020.0005.1D780] # MATHEMATICAL SANS-SERIF BOLD SMALL RHO; QQK
+1D78E ; [.1560.0020.0005.1D78E] # MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL; QQK
+1D7BA ; [.1560.0020.0005.1D7BA] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO; QQK
+1D7C8 ; [.1560.0020.0005.1D7C8] # MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL; QQK
+03A1  ; [.1560.0020.0008.03A1] # GREEK CAPITAL LETTER RHO
+1D6B8 ; [.1560.0020.000B.1D6B8] # MATHEMATICAL BOLD CAPITAL RHO; QQK
+1D6F2 ; [.1560.0020.000B.1D6F2] # MATHEMATICAL ITALIC CAPITAL RHO; QQK
+1D72C ; [.1560.0020.000B.1D72C] # MATHEMATICAL BOLD ITALIC CAPITAL RHO; QQK
+1D766 ; [.1560.0020.000B.1D766] # MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO; QQK
+1D7A0 ; [.1560.0020.000B.1D7A0] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO; QQK
+1D68  ; [.1560.0020.0015.1D68] # GREEK SUBSCRIPT SMALL LETTER RHO; QQK
+1FE4  ; [.1560.0020.0002.03C1][.0000.0022.0002.0313] # GREEK SMALL LETTER RHO WITH PSILI; QQCM
+1FE5  ; [.1560.0020.0002.03C1][.0000.002A.0002.0314] # GREEK SMALL LETTER RHO WITH DASIA; QQCM
+1FEC  ; [.1560.0020.0008.03A1][.0000.002A.0002.0314] # GREEK CAPITAL LETTER RHO WITH DASIA; QQCM
+1D29  ; [.1561.0020.0002.1D29] # GREEK LETTER SMALL CAPITAL RHO
+03FC  ; [.1562.0020.0002.03FC] # GREEK RHO WITH STROKE SYMBOL
+03C3  ; [.1563.0020.0002.03C3] # GREEK SMALL LETTER SIGMA
+03F2  ; [.1563.0020.0004.03F2] # GREEK LUNATE SIGMA SYMBOL; QQK
+1D6D3 ; [.1563.0020.0005.1D6D3] # MATHEMATICAL BOLD SMALL FINAL SIGMA; QQK
+1D6D4 ; [.1563.0020.0005.1D6D4] # MATHEMATICAL BOLD SMALL SIGMA; QQK
+1D70D ; [.1563.0020.0005.1D70D] # MATHEMATICAL ITALIC SMALL FINAL SIGMA; QQK
+1D70E ; [.1563.0020.0005.1D70E] # MATHEMATICAL ITALIC SMALL SIGMA; QQK
+1D747 ; [.1563.0020.0005.1D747] # MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA; QQK
+1D748 ; [.1563.0020.0005.1D748] # MATHEMATICAL BOLD ITALIC SMALL SIGMA; QQK
+1D781 ; [.1563.0020.0005.1D781] # MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA; QQK
+1D782 ; [.1563.0020.0005.1D782] # MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA; QQK
+1D7BB ; [.1563.0020.0005.1D7BB] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA; QQK
+1D7BC ; [.1563.0020.0005.1D7BC] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA; QQK
+03A3  ; [.1563.0020.0008.03A3] # GREEK CAPITAL LETTER SIGMA
+03F9  ; [.1563.0020.000A.03F9] # GREEK CAPITAL LUNATE SIGMA SYMBOL; QQK
+1D6BA ; [.1563.0020.000B.1D6BA] # MATHEMATICAL BOLD CAPITAL SIGMA; QQK
+1D6F4 ; [.1563.0020.000B.1D6F4] # MATHEMATICAL ITALIC CAPITAL SIGMA; QQK
+1D72E ; [.1563.0020.000B.1D72E] # MATHEMATICAL BOLD ITALIC CAPITAL SIGMA; QQK
+1D768 ; [.1563.0020.000B.1D768] # MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA; QQK
+1D7A2 ; [.1563.0020.000B.1D7A2] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA; QQK
+03C2  ; [.1563.0020.0019.03C2] # GREEK SMALL LETTER FINAL SIGMA; QQK
+037C  ; [.1564.0020.0002.037C] # GREEK SMALL DOTTED LUNATE SIGMA SYMBOL
+03FE  ; [.1564.0020.0008.03FE] # GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL
+037B  ; [.1565.0020.0002.037B] # GREEK SMALL REVERSED LUNATE SIGMA SYMBOL
+03FD  ; [.1565.0020.0008.03FD] # GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL
+037D  ; [.1566.0020.0002.037D] # GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL
+03FF  ; [.1566.0020.0008.03FF] # GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL
+03C4  ; [.1567.0020.0002.03C4] # GREEK SMALL LETTER TAU
+1D6D5 ; [.1567.0020.0005.1D6D5] # MATHEMATICAL BOLD SMALL TAU; QQK
+1D70F ; [.1567.0020.0005.1D70F] # MATHEMATICAL ITALIC SMALL TAU; QQK
+1D749 ; [.1567.0020.0005.1D749] # MATHEMATICAL BOLD ITALIC SMALL TAU; QQK
+1D783 ; [.1567.0020.0005.1D783] # MATHEMATICAL SANS-SERIF BOLD SMALL TAU; QQK
+1D7BD ; [.1567.0020.0005.1D7BD] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU; QQK
+03A4  ; [.1567.0020.0008.03A4] # GREEK CAPITAL LETTER TAU
+1D6BB ; [.1567.0020.000B.1D6BB] # MATHEMATICAL BOLD CAPITAL TAU; QQK
+1D6F5 ; [.1567.0020.000B.1D6F5] # MATHEMATICAL ITALIC CAPITAL TAU; QQK
+1D72F ; [.1567.0020.000B.1D72F] # MATHEMATICAL BOLD ITALIC CAPITAL TAU; QQK
+1D769 ; [.1567.0020.000B.1D769] # MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU; QQK
+1D7A3 ; [.1567.0020.000B.1D7A3] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU; QQK
+03C5  ; [.1568.0020.0002.03C5] # GREEK SMALL LETTER UPSILON
+1D6D6 ; [.1568.0020.0005.1D6D6] # MATHEMATICAL BOLD SMALL UPSILON; QQK
+1D710 ; [.1568.0020.0005.1D710] # MATHEMATICAL ITALIC SMALL UPSILON; QQK
+1D74A ; [.1568.0020.0005.1D74A] # MATHEMATICAL BOLD ITALIC SMALL UPSILON; QQK
+1D784 ; [.1568.0020.0005.1D784] # MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON; QQK
+1D7BE ; [.1568.0020.0005.1D7BE] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON; QQK
+03A5  ; [.1568.0020.0008.03A5] # GREEK CAPITAL LETTER UPSILON
+03D2  ; [.1568.0020.000A.03D2] # GREEK UPSILON WITH HOOK SYMBOL; QQK
+1D6BC ; [.1568.0020.000B.1D6BC] # MATHEMATICAL BOLD CAPITAL UPSILON; QQK
+1D6F6 ; [.1568.0020.000B.1D6F6] # MATHEMATICAL ITALIC CAPITAL UPSILON; QQK
+1D730 ; [.1568.0020.000B.1D730] # MATHEMATICAL BOLD ITALIC CAPITAL UPSILON; QQK
+1D76A ; [.1568.0020.000B.1D76A] # MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON; QQK
+1D7A4 ; [.1568.0020.000B.1D7A4] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON; QQK
+1F50  ; [.1568.0020.0002.03C5][.0000.0022.0002.0313] # GREEK SMALL LETTER UPSILON WITH PSILI; QQCM
+1F54  ; [.1568.0020.0002.03C5][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA; QQCM
+1F52  ; [.1568.0020.0002.03C5][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA; QQCM
+1F56  ; [.1568.0020.0002.03C5][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI; QQCM
+1F51  ; [.1568.0020.0002.03C5][.0000.002A.0002.0314] # GREEK SMALL LETTER UPSILON WITH DASIA; QQCM
+1F59  ; [.1568.0020.0008.03A5][.0000.002A.0002.0314] # GREEK CAPITAL LETTER UPSILON WITH DASIA; QQCM
+1F55  ; [.1568.0020.0002.03C5][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA; QQCM
+1F5D  ; [.1568.0020.0008.03A5][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA; QQCM
+1F53  ; [.1568.0020.0002.03C5][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA; QQCM
+1F5B  ; [.1568.0020.0008.03A5][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA; QQCM
+1F57  ; [.1568.0020.0002.03C5][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI; QQCM
+1F5F  ; [.1568.0020.0008.03A5][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI; QQCM
+03CD  ; [.1568.0020.0002.03C5][.0000.0032.0002.0301] # GREEK SMALL LETTER UPSILON WITH TONOS; QQCM
+1F7B  ; [.1568.0020.0002.03C5][.0000.0032.0002.0301] # GREEK SMALL LETTER UPSILON WITH OXIA; QQCM
+038E  ; [.1568.0020.0008.03A5][.0000.0032.0002.0301] # GREEK CAPITAL LETTER UPSILON WITH TONOS; QQCM
+1FEB  ; [.1568.0020.0008.03A5][.0000.0032.0002.0301] # GREEK CAPITAL LETTER UPSILON WITH OXIA; QQCM
+03D3  ; [.1568.0020.000A.03D3][.0000.0032.0002.03D3] # GREEK UPSILON WITH ACUTE AND HOOK SYMBOL; QQKN
+1F7A  ; [.1568.0020.0002.03C5][.0000.0035.0002.0300] # GREEK SMALL LETTER UPSILON WITH VARIA; QQCM
+1FEA  ; [.1568.0020.0008.03A5][.0000.0035.0002.0300] # GREEK CAPITAL LETTER UPSILON WITH VARIA; QQCM
+1FE0  ; [.1568.0020.0002.03C5][.0000.0037.0002.0306] # GREEK SMALL LETTER UPSILON WITH VRACHY; QQCM
+1FE8  ; [.1568.0020.0008.03A5][.0000.0037.0002.0306] # GREEK CAPITAL LETTER UPSILON WITH VRACHY; QQCM
+1FE6  ; [.1568.0020.0002.03C5][.0000.0045.0002.0342] # GREEK SMALL LETTER UPSILON WITH PERISPOMENI; QQCM
+03CB  ; [.1568.0020.0002.03C5][.0000.0047.0002.0308] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA; QQCM
+03AB  ; [.1568.0020.0008.03A5][.0000.0047.0002.0308] # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA; QQCM
+03D4  ; [.1568.0020.000A.03D4][.0000.0047.0002.03D4] # GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL; QQKN
+03B0  ; [.1568.0020.0002.03C5][.0000.0047.0002.0308][.0000.0032.0002.0301] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS; QQCM
+1FE3  ; [.1568.0020.0002.03C5][.0000.0047.0002.0308][.0000.0032.0002.0301] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA; QQCM
+1FE2  ; [.1568.0020.0002.03C5][.0000.0047.0002.0308][.0000.0035.0002.0300] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA; QQCM
+1FE7  ; [.1568.0020.0002.03C5][.0000.0047.0002.0308][.0000.0045.0002.0342] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI; QQCM
+1FE1  ; [.1568.0020.0002.03C5][.0000.005B.0002.0304] # GREEK SMALL LETTER UPSILON WITH MACRON; QQCM
+1FE9  ; [.1568.0020.0008.03A5][.0000.005B.0002.0304] # GREEK CAPITAL LETTER UPSILON WITH MACRON; QQCM
+03C6  ; [.1569.0020.0002.03C6] # GREEK SMALL LETTER PHI
+03D5  ; [.1569.0020.0004.03D5] # GREEK PHI SYMBOL; QQK
+1D6D7 ; [.1569.0020.0005.1D6D7] # MATHEMATICAL BOLD SMALL PHI; QQK
+1D6DF ; [.1569.0020.0005.1D6DF] # MATHEMATICAL BOLD PHI SYMBOL; QQK
+1D711 ; [.1569.0020.0005.1D711] # MATHEMATICAL ITALIC SMALL PHI; QQK
+1D719 ; [.1569.0020.0005.1D719] # MATHEMATICAL ITALIC PHI SYMBOL; QQK
+1D74B ; [.1569.0020.0005.1D74B] # MATHEMATICAL BOLD ITALIC SMALL PHI; QQK
+1D753 ; [.1569.0020.0005.1D753] # MATHEMATICAL BOLD ITALIC PHI SYMBOL; QQK
+1D785 ; [.1569.0020.0005.1D785] # MATHEMATICAL SANS-SERIF BOLD SMALL PHI; QQK
+1D78D ; [.1569.0020.0005.1D78D] # MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL; QQK
+1D7BF ; [.1569.0020.0005.1D7BF] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI; QQK
+1D7C7 ; [.1569.0020.0005.1D7C7] # MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL; QQK
+03A6  ; [.1569.0020.0008.03A6] # GREEK CAPITAL LETTER PHI
+1D6BD ; [.1569.0020.000B.1D6BD] # MATHEMATICAL BOLD CAPITAL PHI; QQK
+1D6F7 ; [.1569.0020.000B.1D6F7] # MATHEMATICAL ITALIC CAPITAL PHI; QQK
+1D731 ; [.1569.0020.000B.1D731] # MATHEMATICAL BOLD ITALIC CAPITAL PHI; QQK
+1D76B ; [.1569.0020.000B.1D76B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI; QQK
+1D7A5 ; [.1569.0020.000B.1D7A5] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI; QQK
+1D60  ; [.1569.0020.0014.1D60] # MODIFIER LETTER SMALL GREEK PHI; QQK
+1D69  ; [.1569.0020.0015.1D69] # GREEK SUBSCRIPT SMALL LETTER PHI; QQK
+03C7  ; [.156A.0020.0002.03C7] # GREEK SMALL LETTER CHI
+1D6D8 ; [.156A.0020.0005.1D6D8] # MATHEMATICAL BOLD SMALL CHI; QQK
+1D712 ; [.156A.0020.0005.1D712] # MATHEMATICAL ITALIC SMALL CHI; QQK
+1D74C ; [.156A.0020.0005.1D74C] # MATHEMATICAL BOLD ITALIC SMALL CHI; QQK
+1D786 ; [.156A.0020.0005.1D786] # MATHEMATICAL SANS-SERIF BOLD SMALL CHI; QQK
+1D7C0 ; [.156A.0020.0005.1D7C0] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI; QQK
+03A7  ; [.156A.0020.0008.03A7] # GREEK CAPITAL LETTER CHI
+1D6BE ; [.156A.0020.000B.1D6BE] # MATHEMATICAL BOLD CAPITAL CHI; QQK
+1D6F8 ; [.156A.0020.000B.1D6F8] # MATHEMATICAL ITALIC CAPITAL CHI; QQK
+1D732 ; [.156A.0020.000B.1D732] # MATHEMATICAL BOLD ITALIC CAPITAL CHI; QQK
+1D76C ; [.156A.0020.000B.1D76C] # MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI; QQK
+1D7A6 ; [.156A.0020.000B.1D7A6] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI; QQK
+1D61  ; [.156A.0020.0014.1D61] # MODIFIER LETTER SMALL CHI; QQK
+1D6A  ; [.156A.0020.0015.1D6A] # GREEK SUBSCRIPT SMALL LETTER CHI; QQK
+03C8  ; [.156B.0020.0002.03C8] # GREEK SMALL LETTER PSI
+1D6D9 ; [.156B.0020.0005.1D6D9] # MATHEMATICAL BOLD SMALL PSI; QQK
+1D713 ; [.156B.0020.0005.1D713] # MATHEMATICAL ITALIC SMALL PSI; QQK
+1D74D ; [.156B.0020.0005.1D74D] # MATHEMATICAL BOLD ITALIC SMALL PSI; QQK
+1D787 ; [.156B.0020.0005.1D787] # MATHEMATICAL SANS-SERIF BOLD SMALL PSI; QQK
+1D7C1 ; [.156B.0020.0005.1D7C1] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI; QQK
+03A8  ; [.156B.0020.0008.03A8] # GREEK CAPITAL LETTER PSI
+1D6BF ; [.156B.0020.000B.1D6BF] # MATHEMATICAL BOLD CAPITAL PSI; QQK
+1D6F9 ; [.156B.0020.000B.1D6F9] # MATHEMATICAL ITALIC CAPITAL PSI; QQK
+1D733 ; [.156B.0020.000B.1D733] # MATHEMATICAL BOLD ITALIC CAPITAL PSI; QQK
+1D76D ; [.156B.0020.000B.1D76D] # MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI; QQK
+1D7A7 ; [.156B.0020.000B.1D7A7] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI; QQK
+1D2A  ; [.156C.0020.0002.1D2A] # GREEK LETTER SMALL CAPITAL PSI
+03C9  ; [.156D.0020.0002.03C9] # GREEK SMALL LETTER OMEGA
+1D6DA ; [.156D.0020.0005.1D6DA] # MATHEMATICAL BOLD SMALL OMEGA; QQK
+1D714 ; [.156D.0020.0005.1D714] # MATHEMATICAL ITALIC SMALL OMEGA; QQK
+1D74E ; [.156D.0020.0005.1D74E] # MATHEMATICAL BOLD ITALIC SMALL OMEGA; QQK
+1D788 ; [.156D.0020.0005.1D788] # MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA; QQK
+1D7C2 ; [.156D.0020.0005.1D7C2] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA; QQK
+03A9  ; [.156D.0020.0008.03A9] # GREEK CAPITAL LETTER OMEGA
+2126  ; [.156D.0020.0008.2126] # OHM SIGN; QQC
+1D6C0 ; [.156D.0020.000B.1D6C0] # MATHEMATICAL BOLD CAPITAL OMEGA; QQK
+1D6FA ; [.156D.0020.000B.1D6FA] # MATHEMATICAL ITALIC CAPITAL OMEGA; QQK
+1D734 ; [.156D.0020.000B.1D734] # MATHEMATICAL BOLD ITALIC CAPITAL OMEGA; QQK
+1D76E ; [.156D.0020.000B.1D76E] # MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA; QQK
+1D7A8 ; [.156D.0020.000B.1D7A8] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA; QQK
+1F60  ; [.156D.0020.0002.03C9][.0000.0022.0002.0313] # GREEK SMALL LETTER OMEGA WITH PSILI; QQCM
+1F68  ; [.156D.0020.0008.03A9][.0000.0022.0002.0313] # GREEK CAPITAL LETTER OMEGA WITH PSILI; QQCM
+1F64  ; [.156D.0020.0002.03C9][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA; QQCM
+1F6C  ; [.156D.0020.0008.03A9][.0000.0022.0002.0313][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA; QQCM
+1FA4  ; [.156D.0020.0002.03C9][.0000.0022.0002.0313][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI; QQCM
+1FAC  ; [.156D.0020.0008.03A9][.0000.0022.0002.0313][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI; QQCM
+1F62  ; [.156D.0020.0002.03C9][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA; QQCM
+1F6A  ; [.156D.0020.0008.03A9][.0000.0022.0002.0313][.0000.0035.0002.0300] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA; QQCM
+1FA2  ; [.156D.0020.0002.03C9][.0000.0022.0002.0313][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI; QQCM
+1FAA  ; [.156D.0020.0008.03A9][.0000.0022.0002.0313][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI; QQCM
+1F66  ; [.156D.0020.0002.03C9][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI; QQCM
+1F6E  ; [.156D.0020.0008.03A9][.0000.0022.0002.0313][.0000.0045.0002.0342] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI; QQCM
+1FA6  ; [.156D.0020.0002.03C9][.0000.0022.0002.0313][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI; QQCM
+1FAE  ; [.156D.0020.0008.03A9][.0000.0022.0002.0313][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI; QQCM
+1FA0  ; [.156D.0020.0002.03C9][.0000.0022.0002.0313][.0000.007F.0002.0345] # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI; QQCM
+1FA8  ; [.156D.0020.0008.03A9][.0000.0022.0002.0313][.0000.007F.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI; QQCM
+1F61  ; [.156D.0020.0002.03C9][.0000.002A.0002.0314] # GREEK SMALL LETTER OMEGA WITH DASIA; QQCM
+1F69  ; [.156D.0020.0008.03A9][.0000.002A.0002.0314] # GREEK CAPITAL LETTER OMEGA WITH DASIA; QQCM
+1F65  ; [.156D.0020.0002.03C9][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA; QQCM
+1F6D  ; [.156D.0020.0008.03A9][.0000.002A.0002.0314][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA; QQCM
+1FA5  ; [.156D.0020.0002.03C9][.0000.002A.0002.0314][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI; QQCM
+1FAD  ; [.156D.0020.0008.03A9][.0000.002A.0002.0314][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI; QQCM
+1F63  ; [.156D.0020.0002.03C9][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA; QQCM
+1F6B  ; [.156D.0020.0008.03A9][.0000.002A.0002.0314][.0000.0035.0002.0300] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA; QQCM
+1FA3  ; [.156D.0020.0002.03C9][.0000.002A.0002.0314][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI; QQCM
+1FAB  ; [.156D.0020.0008.03A9][.0000.002A.0002.0314][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI; QQCM
+1F67  ; [.156D.0020.0002.03C9][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI; QQCM
+1F6F  ; [.156D.0020.0008.03A9][.0000.002A.0002.0314][.0000.0045.0002.0342] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI; QQCM
+1FA7  ; [.156D.0020.0002.03C9][.0000.002A.0002.0314][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI; QQCM
+1FAF  ; [.156D.0020.0008.03A9][.0000.002A.0002.0314][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI; QQCM
+1FA1  ; [.156D.0020.0002.03C9][.0000.002A.0002.0314][.0000.007F.0002.0345] # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI; QQCM
+1FA9  ; [.156D.0020.0008.03A9][.0000.002A.0002.0314][.0000.007F.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI; QQCM
+03CE  ; [.156D.0020.0002.03C9][.0000.0032.0002.0301] # GREEK SMALL LETTER OMEGA WITH TONOS; QQCM
+1F7D  ; [.156D.0020.0002.03C9][.0000.0032.0002.0301] # GREEK SMALL LETTER OMEGA WITH OXIA; QQCM
+038F  ; [.156D.0020.0008.03A9][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMEGA WITH TONOS; QQCM
+1FFB  ; [.156D.0020.0008.03A9][.0000.0032.0002.0301] # GREEK CAPITAL LETTER OMEGA WITH OXIA; QQCM
+1FF4  ; [.156D.0020.0002.03C9][.0000.0032.0002.0301][.0000.007F.0002.0345] # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI; QQCM
+1F7C  ; [.156D.0020.0002.03C9][.0000.0035.0002.0300] # GREEK SMALL LETTER OMEGA WITH VARIA; QQCM
+1FFA  ; [.156D.0020.0008.03A9][.0000.0035.0002.0300] # GREEK CAPITAL LETTER OMEGA WITH VARIA; QQCM
+1FF2  ; [.156D.0020.0002.03C9][.0000.0035.0002.0300][.0000.007F.0002.0345] # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI; QQCM
+1FF6  ; [.156D.0020.0002.03C9][.0000.0045.0002.0342] # GREEK SMALL LETTER OMEGA WITH PERISPOMENI; QQCM
+1FF7  ; [.156D.0020.0002.03C9][.0000.0045.0002.0342][.0000.007F.0002.0345] # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI; QQCM
+1FF3  ; [.156D.0020.0002.03C9][.0000.007F.0002.0345] # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI; QQCM
+1FFC  ; [.156D.0020.0008.03A9][.0000.007F.0002.0345] # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI; QQCM
+03E1  ; [.156E.0020.0002.03E1] # GREEK SMALL LETTER SAMPI
+03E0  ; [.156E.0020.0008.03E0] # GREEK LETTER SAMPI
+0373  ; [.156F.0020.0002.0373] # GREEK SMALL LETTER ARCHAIC SAMPI
+0372  ; [.156F.0020.0008.0372] # GREEK CAPITAL LETTER ARCHAIC SAMPI
+03F8  ; [.1570.0020.0002.03F8] # GREEK SMALL LETTER SHO
+03F7  ; [.1570.0020.0008.03F7] # GREEK CAPITAL LETTER SHO
+2C81  ; [.1571.0020.0002.2C81] # COPTIC SMALL LETTER ALFA
+2C80  ; [.1571.0020.0008.2C80] # COPTIC CAPITAL LETTER ALFA
+2C83  ; [.1572.0020.0002.2C83] # COPTIC SMALL LETTER VIDA
+2C82  ; [.1572.0020.0008.2C82] # COPTIC CAPITAL LETTER VIDA
+2C85  ; [.1573.0020.0002.2C85] # COPTIC SMALL LETTER GAMMA
+2C84  ; [.1573.0020.0008.2C84] # COPTIC CAPITAL LETTER GAMMA
+2C87  ; [.1574.0020.0002.2C87] # COPTIC SMALL LETTER DALDA
+2C86  ; [.1574.0020.0008.2C86] # COPTIC CAPITAL LETTER DALDA
+2C89  ; [.1575.0020.0002.2C89] # COPTIC SMALL LETTER EIE
+2C88  ; [.1575.0020.0008.2C88] # COPTIC CAPITAL LETTER EIE
+2CB7  ; [.1576.0020.0002.2CB7] # COPTIC SMALL LETTER CRYPTOGRAMMIC EIE
+2CB6  ; [.1576.0020.0008.2CB6] # COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE
+2C8B  ; [.1577.0020.0002.2C8B] # COPTIC SMALL LETTER SOU
+2C8A  ; [.1577.0020.0008.2C8A] # COPTIC CAPITAL LETTER SOU
+2C8D  ; [.1578.0020.0002.2C8D] # COPTIC SMALL LETTER ZATA
+2C8C  ; [.1578.0020.0008.2C8C] # COPTIC CAPITAL LETTER ZATA
+2C8F  ; [.1579.0020.0002.2C8F] # COPTIC SMALL LETTER HATE
+2C8E  ; [.1579.0020.0008.2C8E] # COPTIC CAPITAL LETTER HATE
+2C91  ; [.157A.0020.0002.2C91] # COPTIC SMALL LETTER THETHE
+2C90  ; [.157A.0020.0008.2C90] # COPTIC CAPITAL LETTER THETHE
+2C93  ; [.157B.0020.0002.2C93] # COPTIC SMALL LETTER IAUDA
+2C92  ; [.157B.0020.0008.2C92] # COPTIC CAPITAL LETTER IAUDA
+2C95  ; [.157C.0020.0002.2C95] # COPTIC SMALL LETTER KAPA
+2C94  ; [.157C.0020.0008.2C94] # COPTIC CAPITAL LETTER KAPA
+2CE4  ; [.157C.0020.0004.2CE4][.1571.0020.0004.2CE4][.157B.0020.001F.2CE4] # COPTIC SYMBOL KAI; QQKN
+2CB9  ; [.157D.0020.0002.2CB9] # COPTIC SMALL LETTER DIALECT-P KAPA
+2CB8  ; [.157D.0020.0008.2CB8] # COPTIC CAPITAL LETTER DIALECT-P KAPA
+2C97  ; [.157E.0020.0002.2C97] # COPTIC SMALL LETTER LAULA
+2C96  ; [.157E.0020.0008.2C96] # COPTIC CAPITAL LETTER LAULA
+2C99  ; [.157F.0020.0002.2C99] # COPTIC SMALL LETTER MI
+2C98  ; [.157F.0020.0008.2C98] # COPTIC CAPITAL LETTER MI
+2C9B  ; [.1580.0020.0002.2C9B] # COPTIC SMALL LETTER NI
+2C9A  ; [.1580.0020.0008.2C9A] # COPTIC CAPITAL LETTER NI
+2CBB  ; [.1581.0020.0002.2CBB] # COPTIC SMALL LETTER DIALECT-P NI
+2CBA  ; [.1581.0020.0008.2CBA] # COPTIC CAPITAL LETTER DIALECT-P NI
+2CBD  ; [.1582.0020.0002.2CBD] # COPTIC SMALL LETTER CRYPTOGRAMMIC NI
+2CBC  ; [.1582.0020.0008.2CBC] # COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI
+2C9D  ; [.1583.0020.0002.2C9D] # COPTIC SMALL LETTER KSI
+2C9C  ; [.1583.0020.0008.2C9C] # COPTIC CAPITAL LETTER KSI
+2C9F  ; [.1584.0020.0002.2C9F] # COPTIC SMALL LETTER O
+2C9E  ; [.1584.0020.0008.2C9E] # COPTIC CAPITAL LETTER O
+2CA1  ; [.1585.0020.0002.2CA1] # COPTIC SMALL LETTER PI
+2CA0  ; [.1585.0020.0008.2CA0] # COPTIC CAPITAL LETTER PI
+2CA3  ; [.1586.0020.0002.2CA3] # COPTIC SMALL LETTER RO
+2CA2  ; [.1586.0020.0008.2CA2] # COPTIC CAPITAL LETTER RO
+2CA5  ; [.1587.0020.0002.2CA5] # COPTIC SMALL LETTER SIMA
+2CA4  ; [.1587.0020.0008.2CA4] # COPTIC CAPITAL LETTER SIMA
+2CA7  ; [.1588.0020.0002.2CA7] # COPTIC SMALL LETTER TAU
+2CA6  ; [.1588.0020.0008.2CA6] # COPTIC CAPITAL LETTER TAU
+2CA9  ; [.1589.0020.0002.2CA9] # COPTIC SMALL LETTER UA
+2CA8  ; [.1589.0020.0008.2CA8] # COPTIC CAPITAL LETTER UA
+2CAB  ; [.158A.0020.0002.2CAB] # COPTIC SMALL LETTER FI
+2CAA  ; [.158A.0020.0008.2CAA] # COPTIC CAPITAL LETTER FI
+2CAD  ; [.158B.0020.0002.2CAD] # COPTIC SMALL LETTER KHI
+2CAC  ; [.158B.0020.0008.2CAC] # COPTIC CAPITAL LETTER KHI
+2CAF  ; [.158C.0020.0002.2CAF] # COPTIC SMALL LETTER PSI
+2CAE  ; [.158C.0020.0008.2CAE] # COPTIC CAPITAL LETTER PSI
+2CB1  ; [.158D.0020.0002.2CB1] # COPTIC SMALL LETTER OOU
+2CB0  ; [.158D.0020.0008.2CB0] # COPTIC CAPITAL LETTER OOU
+2CBF  ; [.158E.0020.0002.2CBF] # COPTIC SMALL LETTER OLD COPTIC OOU
+2CBE  ; [.158E.0020.0008.2CBE] # COPTIC CAPITAL LETTER OLD COPTIC OOU
+2CC1  ; [.158F.0020.0002.2CC1] # COPTIC SMALL LETTER SAMPI
+2CC0  ; [.158F.0020.0008.2CC0] # COPTIC CAPITAL LETTER SAMPI
+03E3  ; [.1590.0020.0002.03E3] # COPTIC SMALL LETTER SHEI
+03E2  ; [.1590.0020.0008.03E2] # COPTIC CAPITAL LETTER SHEI
+2CEC  ; [.1591.0020.0002.2CEC] # COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI
+2CEB  ; [.1591.0020.0008.2CEB] # COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI
+2CC3  ; [.1592.0020.0002.2CC3] # COPTIC SMALL LETTER CROSSED SHEI
+2CC2  ; [.1592.0020.0008.2CC2] # COPTIC CAPITAL LETTER CROSSED SHEI
+2CC5  ; [.1593.0020.0002.2CC5] # COPTIC SMALL LETTER OLD COPTIC SHEI
+2CC4  ; [.1593.0020.0008.2CC4] # COPTIC CAPITAL LETTER OLD COPTIC SHEI
+2CC7  ; [.1594.0020.0002.2CC7] # COPTIC SMALL LETTER OLD COPTIC ESH
+2CC6  ; [.1594.0020.0008.2CC6] # COPTIC CAPITAL LETTER OLD COPTIC ESH
+03E5  ; [.1595.0020.0002.03E5] # COPTIC SMALL LETTER FEI
+03E4  ; [.1595.0020.0008.03E4] # COPTIC CAPITAL LETTER FEI
+03E7  ; [.1596.0020.0002.03E7] # COPTIC SMALL LETTER KHEI
+03E6  ; [.1596.0020.0008.03E6] # COPTIC CAPITAL LETTER KHEI
+2CC9  ; [.1597.0020.0002.2CC9] # COPTIC SMALL LETTER AKHMIMIC KHEI
+2CC8  ; [.1597.0020.0008.2CC8] # COPTIC CAPITAL LETTER AKHMIMIC KHEI
+03E9  ; [.1598.0020.0002.03E9] # COPTIC SMALL LETTER HORI
+03E8  ; [.1598.0020.0008.03E8] # COPTIC CAPITAL LETTER HORI
+2CCB  ; [.1599.0020.0002.2CCB] # COPTIC SMALL LETTER DIALECT-P HORI
+2CCA  ; [.1599.0020.0008.2CCA] # COPTIC CAPITAL LETTER DIALECT-P HORI
+2CCD  ; [.159A.0020.0002.2CCD] # COPTIC SMALL LETTER OLD COPTIC HORI
+2CCC  ; [.159A.0020.0008.2CCC] # COPTIC CAPITAL LETTER OLD COPTIC HORI
+2CCF  ; [.159B.0020.0002.2CCF] # COPTIC SMALL LETTER OLD COPTIC HA
+2CCE  ; [.159B.0020.0008.2CCE] # COPTIC CAPITAL LETTER OLD COPTIC HA
+2CD1  ; [.159C.0020.0002.2CD1] # COPTIC SMALL LETTER L-SHAPED HA
+2CD0  ; [.159C.0020.0008.2CD0] # COPTIC CAPITAL LETTER L-SHAPED HA
+2CD3  ; [.159D.0020.0002.2CD3] # COPTIC SMALL LETTER OLD COPTIC HEI
+2CD2  ; [.159D.0020.0008.2CD2] # COPTIC CAPITAL LETTER OLD COPTIC HEI
+2CD5  ; [.159E.0020.0002.2CD5] # COPTIC SMALL LETTER OLD COPTIC HAT
+2CD4  ; [.159E.0020.0008.2CD4] # COPTIC CAPITAL LETTER OLD COPTIC HAT
+03EB  ; [.159F.0020.0002.03EB] # COPTIC SMALL LETTER GANGIA
+03EA  ; [.159F.0020.0008.03EA] # COPTIC CAPITAL LETTER GANGIA
+2CEE  ; [.15A0.0020.0002.2CEE] # COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA
+2CED  ; [.15A0.0020.0008.2CED] # COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA
+2CD7  ; [.15A1.0020.0002.2CD7] # COPTIC SMALL LETTER OLD COPTIC GANGIA
+2CD6  ; [.15A1.0020.0008.2CD6] # COPTIC CAPITAL LETTER OLD COPTIC GANGIA
+03ED  ; [.15A2.0020.0002.03ED] # COPTIC SMALL LETTER SHIMA
+03EC  ; [.15A2.0020.0008.03EC] # COPTIC CAPITAL LETTER SHIMA
+2CD9  ; [.15A3.0020.0002.2CD9] # COPTIC SMALL LETTER OLD COPTIC DJA
+2CD8  ; [.15A3.0020.0008.2CD8] # COPTIC CAPITAL LETTER OLD COPTIC DJA
+2CDB  ; [.15A4.0020.0002.2CDB] # COPTIC SMALL LETTER OLD COPTIC SHIMA
+2CDA  ; [.15A4.0020.0008.2CDA] # COPTIC CAPITAL LETTER OLD COPTIC SHIMA
+2CDD  ; [.15A5.0020.0002.2CDD] # COPTIC SMALL LETTER OLD NUBIAN SHIMA
+2CDC  ; [.15A5.0020.0008.2CDC] # COPTIC CAPITAL LETTER OLD NUBIAN SHIMA
+03EF  ; [.15A6.0020.0002.03EF] # COPTIC SMALL LETTER DEI
+03EE  ; [.15A6.0020.0008.03EE] # COPTIC CAPITAL LETTER DEI
+2CB3  ; [.15A7.0020.0002.2CB3] # COPTIC SMALL LETTER DIALECT-P ALEF
+2CB2  ; [.15A7.0020.0008.2CB2] # COPTIC CAPITAL LETTER DIALECT-P ALEF
+2CB5  ; [.15A8.0020.0002.2CB5] # COPTIC SMALL LETTER OLD COPTIC AIN
+2CB4  ; [.15A8.0020.0008.2CB4] # COPTIC CAPITAL LETTER OLD COPTIC AIN
+2CDF  ; [.15A9.0020.0002.2CDF] # COPTIC SMALL LETTER OLD NUBIAN NGI
+2CDE  ; [.15A9.0020.0008.2CDE] # COPTIC CAPITAL LETTER OLD NUBIAN NGI
+2CE1  ; [.15AA.0020.0002.2CE1] # COPTIC SMALL LETTER OLD NUBIAN NYI
+2CE0  ; [.15AA.0020.0008.2CE0] # COPTIC CAPITAL LETTER OLD NUBIAN NYI
+2CE3  ; [.15AB.0020.0002.2CE3] # COPTIC SMALL LETTER OLD NUBIAN WAU
+2CE2  ; [.15AB.0020.0008.2CE2] # COPTIC CAPITAL LETTER OLD NUBIAN WAU
+0430  ; [.15AC.0020.0002.0430] # CYRILLIC SMALL LETTER A
+2DF6  ; [.15AC.0020.0004.2DF6] # COMBINING CYRILLIC LETTER A; QQK
+0410  ; [.15AC.0020.0008.0410] # CYRILLIC CAPITAL LETTER A
+04D1  ; [.15B0.0020.0002.04D1] # CYRILLIC SMALL LETTER A WITH BREVE
+0430 0306 ; [.15B0.0020.0002.04D1] # CYRILLIC SMALL LETTER A WITH BREVE
+04D0  ; [.15B0.0020.0008.04D0] # CYRILLIC CAPITAL LETTER A WITH BREVE
+0410 0306 ; [.15B0.0020.0008.04D0] # CYRILLIC CAPITAL LETTER A WITH BREVE
+04D3  ; [.15B4.0020.0002.04D3] # CYRILLIC SMALL LETTER A WITH DIAERESIS
+0430 0308 ; [.15B4.0020.0002.04D3] # CYRILLIC SMALL LETTER A WITH DIAERESIS
+04D2  ; [.15B4.0020.0008.04D2] # CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+0410 0308 ; [.15B4.0020.0008.04D2] # CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+04D9  ; [.15B8.0020.0002.04D9] # CYRILLIC SMALL LETTER SCHWA
+04D8  ; [.15B8.0020.0008.04D8] # CYRILLIC CAPITAL LETTER SCHWA
+04DB  ; [.15BC.0020.0002.04DB] # CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS
+04D9 0308 ; [.15BC.0020.0002.04DB] # CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS
+04DA  ; [.15BC.0020.0008.04DA] # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
+04D8 0308 ; [.15BC.0020.0008.04DA] # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
+04D5  ; [.15C0.0020.0002.04D5] # CYRILLIC SMALL LIGATURE A IE
+04D4  ; [.15C0.0020.0008.04D4] # CYRILLIC CAPITAL LIGATURE A IE
+0431  ; [.15C4.0020.0002.0431] # CYRILLIC SMALL LETTER BE
+2DE0  ; [.15C4.0020.0004.2DE0] # COMBINING CYRILLIC LETTER BE; QQK
+0411  ; [.15C4.0020.0008.0411] # CYRILLIC CAPITAL LETTER BE
+0432  ; [.15C8.0020.0002.0432] # CYRILLIC SMALL LETTER VE
+2DE1  ; [.15C8.0020.0004.2DE1] # COMBINING CYRILLIC LETTER VE; QQK
+0412  ; [.15C8.0020.0008.0412] # CYRILLIC CAPITAL LETTER VE
+0433  ; [.15CC.0020.0002.0433] # CYRILLIC SMALL LETTER GHE
+2DE2  ; [.15CC.0020.0004.2DE2] # COMBINING CYRILLIC LETTER GHE; QQK
+0413  ; [.15CC.0020.0008.0413] # CYRILLIC CAPITAL LETTER GHE
+0491  ; [.15CC.0020.0004.0491][.0000.015A.0004.0491] # CYRILLIC SMALL LETTER GHE WITH UPTURN; QQKN
+0490  ; [.15CC.0020.000A.0490][.0000.015A.0004.0490] # CYRILLIC CAPITAL LETTER GHE WITH UPTURN; QQKN
+0493  ; [.15D0.0020.0002.0493] # CYRILLIC SMALL LETTER GHE WITH STROKE
+0492  ; [.15D0.0020.0008.0492] # CYRILLIC CAPITAL LETTER GHE WITH STROKE
+04FB  ; [.15D4.0020.0002.04FB] # CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK
+04FA  ; [.15D4.0020.0008.04FA] # CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK
+0495  ; [.15D8.0020.0002.0495] # CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK
+0494  ; [.15D8.0020.0008.0494] # CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK
+04F7  ; [.15DC.0020.0002.04F7] # CYRILLIC SMALL LETTER GHE WITH DESCENDER
+04F6  ; [.15DC.0020.0008.04F6] # CYRILLIC CAPITAL LETTER GHE WITH DESCENDER
+0434  ; [.15E0.0020.0002.0434] # CYRILLIC SMALL LETTER DE
+2DE3  ; [.15E0.0020.0004.2DE3] # COMBINING CYRILLIC LETTER DE; QQK
+0414  ; [.15E0.0020.0008.0414] # CYRILLIC CAPITAL LETTER DE
+0501  ; [.15E4.0020.0002.0501] # CYRILLIC SMALL LETTER KOMI DE
+0500  ; [.15E4.0020.0008.0500] # CYRILLIC CAPITAL LETTER KOMI DE
+A681  ; [.15E5.0020.0002.A681] # CYRILLIC SMALL LETTER DWE
+A680  ; [.15E5.0020.0008.A680] # CYRILLIC CAPITAL LETTER DWE
+0452  ; [.15E6.0020.0002.0452] # CYRILLIC SMALL LETTER DJE
+0402  ; [.15E6.0020.0008.0402] # CYRILLIC CAPITAL LETTER DJE
+A663  ; [.15EA.0020.0002.A663] # CYRILLIC SMALL LETTER SOFT DE
+A662  ; [.15EA.0020.0008.A662] # CYRILLIC CAPITAL LETTER SOFT DE
+0503  ; [.15EB.0020.0002.0503] # CYRILLIC SMALL LETTER KOMI DJE
+0502  ; [.15EB.0020.0008.0502] # CYRILLIC CAPITAL LETTER KOMI DJE
+0453  ; [.15EC.0020.0002.0453] # CYRILLIC SMALL LETTER GJE
+0433 0301 ; [.15EC.0020.0002.0453] # CYRILLIC SMALL LETTER GJE
+0433 0341 ; [.15EC.0020.0002.0453] # CYRILLIC SMALL LETTER GJE
+0403  ; [.15EC.0020.0008.0403] # CYRILLIC CAPITAL LETTER GJE
+0413 0301 ; [.15EC.0020.0008.0403] # CYRILLIC CAPITAL LETTER GJE
+0413 0341 ; [.15EC.0020.0008.0403] # CYRILLIC CAPITAL LETTER GJE
+0499  ; [.15F0.0020.0002.0499] # CYRILLIC SMALL LETTER ZE WITH DESCENDER
+0498  ; [.15F0.0020.0008.0498] # CYRILLIC CAPITAL LETTER ZE WITH DESCENDER
+0435  ; [.15F4.0020.0002.0435] # CYRILLIC SMALL LETTER IE
+2DF7  ; [.15F4.0020.0004.2DF7] # COMBINING CYRILLIC LETTER IE; QQK
+0415  ; [.15F4.0020.0008.0415] # CYRILLIC CAPITAL LETTER IE
+0450  ; [.15F4.0020.0002.0435][.0000.0035.0002.0300] # CYRILLIC SMALL LETTER IE WITH GRAVE; QQCM
+0400  ; [.15F4.0020.0008.0415][.0000.0035.0002.0300] # CYRILLIC CAPITAL LETTER IE WITH GRAVE; QQCM
+0451  ; [.15F4.0020.0002.0435][.0000.0047.0002.0308] # CYRILLIC SMALL LETTER IO; QQCM
+0401  ; [.15F4.0020.0008.0415][.0000.0047.0002.0308] # CYRILLIC CAPITAL LETTER IO; QQCM
+04D7  ; [.15F8.0020.0002.04D7] # CYRILLIC SMALL LETTER IE WITH BREVE
+0435 0306 ; [.15F8.0020.0002.04D7] # CYRILLIC SMALL LETTER IE WITH BREVE
+04D6  ; [.15F8.0020.0008.04D6] # CYRILLIC CAPITAL LETTER IE WITH BREVE
+0415 0306 ; [.15F8.0020.0008.04D6] # CYRILLIC CAPITAL LETTER IE WITH BREVE
+0454  ; [.15FC.0020.0002.0454] # CYRILLIC SMALL LETTER UKRAINIAN IE
+0404  ; [.15FC.0020.0008.0404] # CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0436  ; [.1600.0020.0002.0436] # CYRILLIC SMALL LETTER ZHE
+2DE4  ; [.1600.0020.0004.2DE4] # COMBINING CYRILLIC LETTER ZHE; QQK
+0416  ; [.1600.0020.0008.0416] # CYRILLIC CAPITAL LETTER ZHE
+04C2  ; [.1600.0020.0002.0436][.0000.0037.0002.0306] # CYRILLIC SMALL LETTER ZHE WITH BREVE; QQCM
+04C1  ; [.1600.0020.0008.0416][.0000.0037.0002.0306] # CYRILLIC CAPITAL LETTER ZHE WITH BREVE; QQCM
+A685  ; [.1604.0020.0002.A685] # CYRILLIC SMALL LETTER ZHWE
+A684  ; [.1604.0020.0008.A684] # CYRILLIC CAPITAL LETTER ZHWE
+04DD  ; [.1605.0020.0002.04DD] # CYRILLIC SMALL LETTER ZHE WITH DIAERESIS
+0436 0308 ; [.1605.0020.0002.04DD] # CYRILLIC SMALL LETTER ZHE WITH DIAERESIS
+04DC  ; [.1605.0020.0008.04DC] # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
+0416 0308 ; [.1605.0020.0008.04DC] # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
+0497  ; [.1609.0020.0002.0497] # CYRILLIC SMALL LETTER ZHE WITH DESCENDER
+0496  ; [.1609.0020.0008.0496] # CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER
+0437  ; [.160D.0020.0002.0437] # CYRILLIC SMALL LETTER ZE
+2DE5  ; [.160D.0020.0004.2DE5] # COMBINING CYRILLIC LETTER ZE; QQK
+0417  ; [.160D.0020.0008.0417] # CYRILLIC CAPITAL LETTER ZE
+A641  ; [.1611.0020.0002.A641] # CYRILLIC SMALL LETTER ZEMLYA
+A640  ; [.1611.0020.0008.A640] # CYRILLIC CAPITAL LETTER ZEMLYA
+0505  ; [.1612.0020.0002.0505] # CYRILLIC SMALL LETTER KOMI ZJE
+0504  ; [.1612.0020.0008.0504] # CYRILLIC CAPITAL LETTER KOMI ZJE
+0511  ; [.1613.0020.0002.0511] # CYRILLIC SMALL LETTER REVERSED ZE
+0510  ; [.1613.0020.0008.0510] # CYRILLIC CAPITAL LETTER REVERSED ZE
+04DF  ; [.1614.0020.0002.04DF] # CYRILLIC SMALL LETTER ZE WITH DIAERESIS
+0437 0308 ; [.1614.0020.0002.04DF] # CYRILLIC SMALL LETTER ZE WITH DIAERESIS
+04DE  ; [.1614.0020.0008.04DE] # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
+0417 0308 ; [.1614.0020.0008.04DE] # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
+A643  ; [.1618.0020.0002.A643] # CYRILLIC SMALL LETTER DZELO
+A642  ; [.1618.0020.0008.A642] # CYRILLIC CAPITAL LETTER DZELO
+0455  ; [.1619.0020.0002.0455] # CYRILLIC SMALL LETTER DZE
+0405  ; [.1619.0020.0008.0405] # CYRILLIC CAPITAL LETTER DZE
+A645  ; [.161D.0020.0002.A645] # CYRILLIC SMALL LETTER REVERSED DZE
+A644  ; [.161D.0020.0008.A644] # CYRILLIC CAPITAL LETTER REVERSED DZE
+04E1  ; [.161E.0020.0002.04E1] # CYRILLIC SMALL LETTER ABKHASIAN DZE
+04E0  ; [.161E.0020.0008.04E0] # CYRILLIC CAPITAL LETTER ABKHASIAN DZE
+A689  ; [.1622.0020.0002.A689] # CYRILLIC SMALL LETTER DZZE
+A688  ; [.1622.0020.0008.A688] # CYRILLIC CAPITAL LETTER DZZE
+0507  ; [.1623.0020.0002.0507] # CYRILLIC SMALL LETTER KOMI DZJE
+0506  ; [.1623.0020.0008.0506] # CYRILLIC CAPITAL LETTER KOMI DZJE
+A683  ; [.1624.0020.0002.A683] # CYRILLIC SMALL LETTER DZWE
+A682  ; [.1624.0020.0008.A682] # CYRILLIC CAPITAL LETTER DZWE
+0438  ; [.1625.0020.0002.0438] # CYRILLIC SMALL LETTER I
+0418  ; [.1625.0020.0008.0418] # CYRILLIC CAPITAL LETTER I
+045D  ; [.1625.0020.0002.0438][.0000.0035.0002.0300] # CYRILLIC SMALL LETTER I WITH GRAVE; QQCM
+040D  ; [.1625.0020.0008.0418][.0000.0035.0002.0300] # CYRILLIC CAPITAL LETTER I WITH GRAVE; QQCM
+04E3  ; [.1625.0020.0002.0438][.0000.005B.0002.0304] # CYRILLIC SMALL LETTER I WITH MACRON; QQCM
+04E2  ; [.1625.0020.0008.0418][.0000.005B.0002.0304] # CYRILLIC CAPITAL LETTER I WITH MACRON; QQCM
+048B  ; [.1629.0020.0002.048B] # CYRILLIC SMALL LETTER SHORT I WITH TAIL
+048A  ; [.1629.0020.0008.048A] # CYRILLIC CAPITAL LETTER SHORT I WITH TAIL
+04E5  ; [.162D.0020.0002.04E5] # CYRILLIC SMALL LETTER I WITH DIAERESIS
+0438 0308 ; [.162D.0020.0002.04E5] # CYRILLIC SMALL LETTER I WITH DIAERESIS
+04E4  ; [.162D.0020.0008.04E4] # CYRILLIC CAPITAL LETTER I WITH DIAERESIS
+0418 0308 ; [.162D.0020.0008.04E4] # CYRILLIC CAPITAL LETTER I WITH DIAERESIS
+0456  ; [.1631.0020.0002.0456] # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+0406  ; [.1631.0020.0008.0406] # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+A647  ; [.1635.0020.0002.A647] # CYRILLIC SMALL LETTER IOTA
+A646  ; [.1635.0020.0008.A646] # CYRILLIC CAPITAL LETTER IOTA
+0457  ; [.1636.0020.0002.0457] # CYRILLIC SMALL LETTER YI
+0456 0308 ; [.1636.0020.0002.0457] # CYRILLIC SMALL LETTER YI
+0407  ; [.1636.0020.0008.0407] # CYRILLIC CAPITAL LETTER YI
+0406 0308 ; [.1636.0020.0008.0407] # CYRILLIC CAPITAL LETTER YI
+0439  ; [.163A.0020.0002.0439] # CYRILLIC SMALL LETTER SHORT I
+0438 0306 ; [.163A.0020.0002.0439] # CYRILLIC SMALL LETTER SHORT I
+0419  ; [.163A.0020.0008.0419] # CYRILLIC CAPITAL LETTER SHORT I
+0418 0306 ; [.163A.0020.0008.0419] # CYRILLIC CAPITAL LETTER SHORT I
+0458  ; [.163E.0020.0002.0458] # CYRILLIC SMALL LETTER JE
+0408  ; [.163E.0020.0008.0408] # CYRILLIC CAPITAL LETTER JE
+A649  ; [.1642.0020.0002.A649] # CYRILLIC SMALL LETTER DJERV
+2DF8  ; [.1642.0020.0004.2DF8] # COMBINING CYRILLIC LETTER DJERV; QQK
+A648  ; [.1642.0020.0008.A648] # CYRILLIC CAPITAL LETTER DJERV
+043A  ; [.1643.0020.0002.043A] # CYRILLIC SMALL LETTER KA
+2DE6  ; [.1643.0020.0004.2DE6] # COMBINING CYRILLIC LETTER KA; QQK
+041A  ; [.1643.0020.0008.041A] # CYRILLIC CAPITAL LETTER KA
+049B  ; [.1647.0020.0002.049B] # CYRILLIC SMALL LETTER KA WITH DESCENDER
+049A  ; [.1647.0020.0008.049A] # CYRILLIC CAPITAL LETTER KA WITH DESCENDER
+04C4  ; [.164B.0020.0002.04C4] # CYRILLIC SMALL LETTER KA WITH HOOK
+04C3  ; [.164B.0020.0008.04C3] # CYRILLIC CAPITAL LETTER KA WITH HOOK
+04A1  ; [.164F.0020.0002.04A1] # CYRILLIC SMALL LETTER BASHKIR KA
+04A0  ; [.164F.0020.0008.04A0] # CYRILLIC CAPITAL LETTER BASHKIR KA
+049F  ; [.1653.0020.0002.049F] # CYRILLIC SMALL LETTER KA WITH STROKE
+049E  ; [.1653.0020.0008.049E] # CYRILLIC CAPITAL LETTER KA WITH STROKE
+049D  ; [.1657.0020.0002.049D] # CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE
+049C  ; [.1657.0020.0008.049C] # CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE
+051F  ; [.165B.0020.0002.051F] # CYRILLIC SMALL LETTER ALEUT KA
+051E  ; [.165B.0020.0008.051E] # CYRILLIC CAPITAL LETTER ALEUT KA
+051B  ; [.165C.0020.0002.051B] # CYRILLIC SMALL LETTER QA
+051A  ; [.165C.0020.0008.051A] # CYRILLIC CAPITAL LETTER QA
+043B  ; [.165D.0020.0002.043B] # CYRILLIC SMALL LETTER EL
+2DE7  ; [.165D.0020.0004.2DE7] # COMBINING CYRILLIC LETTER EL; QQK
+041B  ; [.165D.0020.0008.041B] # CYRILLIC CAPITAL LETTER EL
+1D2B  ; [.1661.0020.0002.1D2B] # CYRILLIC LETTER SMALL CAPITAL EL
+04C6  ; [.1662.0020.0002.04C6] # CYRILLIC SMALL LETTER EL WITH TAIL
+04C5  ; [.1662.0020.0008.04C5] # CYRILLIC CAPITAL LETTER EL WITH TAIL
+0513  ; [.1666.0020.0002.0513] # CYRILLIC SMALL LETTER EL WITH HOOK
+0512  ; [.1666.0020.0008.0512] # CYRILLIC CAPITAL LETTER EL WITH HOOK
+0521  ; [.1667.0020.0002.0521] # CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK
+0520  ; [.1667.0020.0008.0520] # CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK
+0459  ; [.1668.0020.0002.0459] # CYRILLIC SMALL LETTER LJE
+0409  ; [.1668.0020.0008.0409] # CYRILLIC CAPITAL LETTER LJE
+A665  ; [.166C.0020.0002.A665] # CYRILLIC SMALL LETTER SOFT EL
+A664  ; [.166C.0020.0008.A664] # CYRILLIC CAPITAL LETTER SOFT EL
+0509  ; [.166D.0020.0002.0509] # CYRILLIC SMALL LETTER KOMI LJE
+0508  ; [.166D.0020.0008.0508] # CYRILLIC CAPITAL LETTER KOMI LJE
+0515  ; [.166E.0020.0002.0515] # CYRILLIC SMALL LETTER LHA
+0514  ; [.166E.0020.0008.0514] # CYRILLIC CAPITAL LETTER LHA
+043C  ; [.166F.0020.0002.043C] # CYRILLIC SMALL LETTER EM
+2DE8  ; [.166F.0020.0004.2DE8] # COMBINING CYRILLIC LETTER EM; QQK
+041C  ; [.166F.0020.0008.041C] # CYRILLIC CAPITAL LETTER EM
+04CE  ; [.1673.0020.0002.04CE] # CYRILLIC SMALL LETTER EM WITH TAIL
+04CD  ; [.1673.0020.0008.04CD] # CYRILLIC CAPITAL LETTER EM WITH TAIL
+A667  ; [.1677.0020.0002.A667] # CYRILLIC SMALL LETTER SOFT EM
+A666  ; [.1677.0020.0008.A666] # CYRILLIC CAPITAL LETTER SOFT EM
+043D  ; [.1678.0020.0002.043D] # CYRILLIC SMALL LETTER EN
+2DE9  ; [.1678.0020.0004.2DE9] # COMBINING CYRILLIC LETTER EN; QQK
+041D  ; [.1678.0020.0008.041D] # CYRILLIC CAPITAL LETTER EN
+1D78  ; [.1678.0020.0014.1D78] # MODIFIER LETTER CYRILLIC EN; QQK
+04CA  ; [.167C.0020.0002.04CA] # CYRILLIC SMALL LETTER EN WITH TAIL
+04C9  ; [.167C.0020.0008.04C9] # CYRILLIC CAPITAL LETTER EN WITH TAIL
+04A3  ; [.1680.0020.0002.04A3] # CYRILLIC SMALL LETTER EN WITH DESCENDER
+04A2  ; [.1680.0020.0008.04A2] # CYRILLIC CAPITAL LETTER EN WITH DESCENDER
+04C8  ; [.1684.0020.0002.04C8] # CYRILLIC SMALL LETTER EN WITH HOOK
+04C7  ; [.1684.0020.0008.04C7] # CYRILLIC CAPITAL LETTER EN WITH HOOK
+0523  ; [.1688.0020.0002.0523] # CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK
+0522  ; [.1688.0020.0008.0522] # CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK
+04A5  ; [.1689.0020.0002.04A5] # CYRILLIC SMALL LIGATURE EN GHE
+04A4  ; [.1689.0020.0008.04A4] # CYRILLIC CAPITAL LIGATURE EN GHE
+045A  ; [.168D.0020.0002.045A] # CYRILLIC SMALL LETTER NJE
+040A  ; [.168D.0020.0008.040A] # CYRILLIC CAPITAL LETTER NJE
+050B  ; [.1691.0020.0002.050B] # CYRILLIC SMALL LETTER KOMI NJE
+050A  ; [.1691.0020.0008.050A] # CYRILLIC CAPITAL LETTER KOMI NJE
+043E  ; [.1692.0020.0002.043E] # CYRILLIC SMALL LETTER O
+2DEA  ; [.1692.0020.0004.2DEA] # COMBINING CYRILLIC LETTER O; QQK
+A669  ; [.1692.0020.0004.A669] # CYRILLIC SMALL LETTER MONOCULAR O; QQK
+A66B  ; [.1692.0020.0004.A66B] # CYRILLIC SMALL LETTER BINOCULAR O; QQK
+A66D  ; [.1692.0020.0004.A66D] # CYRILLIC SMALL LETTER DOUBLE MONOCULAR O; QQK
+A66E  ; [.1692.0020.0004.A66E] # CYRILLIC LETTER MULTIOCULAR O; QQK
+041E  ; [.1692.0020.0008.041E] # CYRILLIC CAPITAL LETTER O
+A668  ; [.1692.0020.000A.A668] # CYRILLIC CAPITAL LETTER MONOCULAR O; QQK
+A66A  ; [.1692.0020.000A.A66A] # CYRILLIC CAPITAL LETTER BINOCULAR O; QQK
+A66C  ; [.1692.0020.000A.A66C] # CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O; QQK
+04E7  ; [.1696.0020.0002.04E7] # CYRILLIC SMALL LETTER O WITH DIAERESIS
+043E 0308 ; [.1696.0020.0002.04E7] # CYRILLIC SMALL LETTER O WITH DIAERESIS
+04E6  ; [.1696.0020.0008.04E6] # CYRILLIC CAPITAL LETTER O WITH DIAERESIS
+041E 0308 ; [.1696.0020.0008.04E6] # CYRILLIC CAPITAL LETTER O WITH DIAERESIS
+04E9  ; [.169A.0020.0002.04E9] # CYRILLIC SMALL LETTER BARRED O
+04E8  ; [.169A.0020.0008.04E8] # CYRILLIC CAPITAL LETTER BARRED O
+04EB  ; [.169E.0020.0002.04EB] # CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS
+04E9 0308 ; [.169E.0020.0002.04EB] # CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS
+04EA  ; [.169E.0020.0008.04EA] # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
+04E8 0308 ; [.169E.0020.0008.04EA] # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
+043F  ; [.16A2.0020.0002.043F] # CYRILLIC SMALL LETTER PE
+2DEB  ; [.16A2.0020.0004.2DEB] # COMBINING CYRILLIC LETTER PE; QQK
+041F  ; [.16A2.0020.0008.041F] # CYRILLIC CAPITAL LETTER PE
+0525  ; [.16A6.0020.0002.0525] # CYRILLIC SMALL LETTER PE WITH DESCENDER
+0524  ; [.16A6.0020.0008.0524] # CYRILLIC CAPITAL LETTER PE WITH DESCENDER
+04A7  ; [.16A7.0020.0002.04A7] # CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK
+04A6  ; [.16A7.0020.0008.04A6] # CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK
+0481  ; [.16AB.0020.0002.0481] # CYRILLIC SMALL LETTER KOPPA
+0480  ; [.16AB.0020.0008.0480] # CYRILLIC CAPITAL LETTER KOPPA
+0440  ; [.16AF.0020.0002.0440] # CYRILLIC SMALL LETTER ER
+2DEC  ; [.16AF.0020.0004.2DEC] # COMBINING CYRILLIC LETTER ER; QQK
+0420  ; [.16AF.0020.0008.0420] # CYRILLIC CAPITAL LETTER ER
+048F  ; [.16B3.0020.0002.048F] # CYRILLIC SMALL LETTER ER WITH TICK
+048E  ; [.16B3.0020.0008.048E] # CYRILLIC CAPITAL LETTER ER WITH TICK
+0517  ; [.16B7.0020.0002.0517] # CYRILLIC SMALL LETTER RHA
+0516  ; [.16B7.0020.0008.0516] # CYRILLIC CAPITAL LETTER RHA
+0441  ; [.16B8.0020.0002.0441] # CYRILLIC SMALL LETTER ES
+2DED  ; [.16B8.0020.0004.2DED] # COMBINING CYRILLIC LETTER ES; QQK
+0421  ; [.16B8.0020.0008.0421] # CYRILLIC CAPITAL LETTER ES
+2DF5  ; [.16B8.0020.0004.2DF5][.16C1.0020.0004.2DF5] # COMBINING CYRILLIC LETTER ES-TE; QQKN
+050D  ; [.16BC.0020.0002.050D] # CYRILLIC SMALL LETTER KOMI SJE
+050C  ; [.16BC.0020.0008.050C] # CYRILLIC CAPITAL LETTER KOMI SJE
+04AB  ; [.16BD.0020.0002.04AB] # CYRILLIC SMALL LETTER ES WITH DESCENDER
+04AA  ; [.16BD.0020.0008.04AA] # CYRILLIC CAPITAL LETTER ES WITH DESCENDER
+0442  ; [.16C1.0020.0002.0442] # CYRILLIC SMALL LETTER TE
+2DEE  ; [.16C1.0020.0004.2DEE] # COMBINING CYRILLIC LETTER TE; QQK
+0422  ; [.16C1.0020.0008.0422] # CYRILLIC CAPITAL LETTER TE
+A68D  ; [.16C5.0020.0002.A68D] # CYRILLIC SMALL LETTER TWE
+A68C  ; [.16C5.0020.0008.A68C] # CYRILLIC CAPITAL LETTER TWE
+050F  ; [.16C6.0020.0002.050F] # CYRILLIC SMALL LETTER KOMI TJE
+050E  ; [.16C6.0020.0008.050E] # CYRILLIC CAPITAL LETTER KOMI TJE
+04AD  ; [.16C7.0020.0002.04AD] # CYRILLIC SMALL LETTER TE WITH DESCENDER
+04AC  ; [.16C7.0020.0008.04AC] # CYRILLIC CAPITAL LETTER TE WITH DESCENDER
+A68B  ; [.16CB.0020.0002.A68B] # CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK
+A68A  ; [.16CB.0020.0008.A68A] # CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK
+045B  ; [.16CC.0020.0002.045B] # CYRILLIC SMALL LETTER TSHE
+040B  ; [.16CC.0020.0008.040B] # CYRILLIC CAPITAL LETTER TSHE
+045C  ; [.16D0.0020.0002.045C] # CYRILLIC SMALL LETTER KJE
+043A 0301 ; [.16D0.0020.0002.045C] # CYRILLIC SMALL LETTER KJE
+043A 0341 ; [.16D0.0020.0002.045C] # CYRILLIC SMALL LETTER KJE
+040C  ; [.16D0.0020.0008.040C] # CYRILLIC CAPITAL LETTER KJE
+041A 0301 ; [.16D0.0020.0008.040C] # CYRILLIC CAPITAL LETTER KJE
+041A 0341 ; [.16D0.0020.0008.040C] # CYRILLIC CAPITAL LETTER KJE
+0443  ; [.16D4.0020.0002.0443] # CYRILLIC SMALL LETTER U
+0423  ; [.16D4.0020.0008.0423] # CYRILLIC CAPITAL LETTER U
+04EF  ; [.16D4.0020.0002.0443][.0000.005B.0002.0304] # CYRILLIC SMALL LETTER U WITH MACRON; QQCM
+04EE  ; [.16D4.0020.0008.0423][.0000.005B.0002.0304] # CYRILLIC CAPITAL LETTER U WITH MACRON; QQCM
+045E  ; [.16D8.0020.0002.045E] # CYRILLIC SMALL LETTER SHORT U
+0443 0306 ; [.16D8.0020.0002.045E] # CYRILLIC SMALL LETTER SHORT U
+040E  ; [.16D8.0020.0008.040E] # CYRILLIC CAPITAL LETTER SHORT U
+0423 0306 ; [.16D8.0020.0008.040E] # CYRILLIC CAPITAL LETTER SHORT U
+04F1  ; [.16DC.0020.0002.04F1] # CYRILLIC SMALL LETTER U WITH DIAERESIS
+0443 0308 ; [.16DC.0020.0002.04F1] # CYRILLIC SMALL LETTER U WITH DIAERESIS
+04F0  ; [.16DC.0020.0008.04F0] # CYRILLIC CAPITAL LETTER U WITH DIAERESIS
+0423 0308 ; [.16DC.0020.0008.04F0] # CYRILLIC CAPITAL LETTER U WITH DIAERESIS
+04F3  ; [.16E0.0020.0002.04F3] # CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE
+0443 030B ; [.16E0.0020.0002.04F3] # CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE
+04F2  ; [.16E0.0020.0008.04F2] # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
+0423 030B ; [.16E0.0020.0008.04F2] # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
+04AF  ; [.16E4.0020.0002.04AF] # CYRILLIC SMALL LETTER STRAIGHT U
+04AE  ; [.16E4.0020.0008.04AE] # CYRILLIC CAPITAL LETTER STRAIGHT U
+04B1  ; [.16E8.0020.0002.04B1] # CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
+04B0  ; [.16E8.0020.0008.04B0] # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
+A64B  ; [.16EC.0020.0002.A64B] # CYRILLIC SMALL LETTER MONOGRAPH UK
+2DF9  ; [.16EC.0020.0004.2DF9] # COMBINING CYRILLIC LETTER MONOGRAPH UK; QQK
+A64A  ; [.16EC.0020.0008.A64A] # CYRILLIC CAPITAL LETTER MONOGRAPH UK
+0479  ; [.16ED.0020.0002.0479] # CYRILLIC SMALL LETTER UK
+0478  ; [.16ED.0020.0008.0478] # CYRILLIC CAPITAL LETTER UK
+0444  ; [.16F1.0020.0002.0444] # CYRILLIC SMALL LETTER EF
+0424  ; [.16F1.0020.0008.0424] # CYRILLIC CAPITAL LETTER EF
+0445  ; [.16F5.0020.0002.0445] # CYRILLIC SMALL LETTER HA
+2DEF  ; [.16F5.0020.0004.2DEF] # COMBINING CYRILLIC LETTER HA; QQK
+0425  ; [.16F5.0020.0008.0425] # CYRILLIC CAPITAL LETTER HA
+04FD  ; [.16F9.0020.0002.04FD] # CYRILLIC SMALL LETTER HA WITH HOOK
+04FC  ; [.16F9.0020.0008.04FC] # CYRILLIC CAPITAL LETTER HA WITH HOOK
+04FF  ; [.16FD.0020.0002.04FF] # CYRILLIC SMALL LETTER HA WITH STROKE
+04FE  ; [.16FD.0020.0008.04FE] # CYRILLIC CAPITAL LETTER HA WITH STROKE
+04B3  ; [.1701.0020.0002.04B3] # CYRILLIC SMALL LETTER HA WITH DESCENDER
+04B2  ; [.1701.0020.0008.04B2] # CYRILLIC CAPITAL LETTER HA WITH DESCENDER
+04BB  ; [.1705.0020.0002.04BB] # CYRILLIC SMALL LETTER SHHA
+04BA  ; [.1705.0020.0008.04BA] # CYRILLIC CAPITAL LETTER SHHA
+A695  ; [.1709.0020.0002.A695] # CYRILLIC SMALL LETTER HWE
+A694  ; [.1709.0020.0008.A694] # CYRILLIC CAPITAL LETTER HWE
+0461  ; [.170A.0020.0002.0461] # CYRILLIC SMALL LETTER OMEGA
+0460  ; [.170A.0020.0008.0460] # CYRILLIC CAPITAL LETTER OMEGA
+047F  ; [.170E.0020.0002.047F] # CYRILLIC SMALL LETTER OT
+047E  ; [.170E.0020.0008.047E] # CYRILLIC CAPITAL LETTER OT
+A64D  ; [.1712.0020.0002.A64D] # CYRILLIC SMALL LETTER BROAD OMEGA
+A64C  ; [.1712.0020.0008.A64C] # CYRILLIC CAPITAL LETTER BROAD OMEGA
+047D  ; [.1713.0020.0002.047D] # CYRILLIC SMALL LETTER OMEGA WITH TITLO
+047C  ; [.1713.0020.0008.047C] # CYRILLIC CAPITAL LETTER OMEGA WITH TITLO
+047B  ; [.1717.0020.0002.047B] # CYRILLIC SMALL LETTER ROUND OMEGA
+047A  ; [.1717.0020.0008.047A] # CYRILLIC CAPITAL LETTER ROUND OMEGA
+0446  ; [.171B.0020.0002.0446] # CYRILLIC SMALL LETTER TSE
+2DF0  ; [.171B.0020.0004.2DF0] # COMBINING CYRILLIC LETTER TSE; QQK
+0426  ; [.171B.0020.0008.0426] # CYRILLIC CAPITAL LETTER TSE
+A68F  ; [.171F.0020.0002.A68F] # CYRILLIC SMALL LETTER TSWE
+A68E  ; [.171F.0020.0008.A68E] # CYRILLIC CAPITAL LETTER TSWE
+04B5  ; [.1720.0020.0002.04B5] # CYRILLIC SMALL LIGATURE TE TSE
+04B4  ; [.1720.0020.0008.04B4] # CYRILLIC CAPITAL LIGATURE TE TSE
+A691  ; [.1724.0020.0002.A691] # CYRILLIC SMALL LETTER TSSE
+A690  ; [.1724.0020.0008.A690] # CYRILLIC CAPITAL LETTER TSSE
+0447  ; [.1725.0020.0002.0447] # CYRILLIC SMALL LETTER CHE
+2DF1  ; [.1725.0020.0004.2DF1] # COMBINING CYRILLIC LETTER CHE; QQK
+0427  ; [.1725.0020.0008.0427] # CYRILLIC CAPITAL LETTER CHE
+A693  ; [.1729.0020.0002.A693] # CYRILLIC SMALL LETTER TCHE
+A692  ; [.1729.0020.0008.A692] # CYRILLIC CAPITAL LETTER TCHE
+04F5  ; [.172A.0020.0002.04F5] # CYRILLIC SMALL LETTER CHE WITH DIAERESIS
+0447 0308 ; [.172A.0020.0002.04F5] # CYRILLIC SMALL LETTER CHE WITH DIAERESIS
+04F4  ; [.172A.0020.0008.04F4] # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
+0427 0308 ; [.172A.0020.0008.04F4] # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
+04B7  ; [.172E.0020.0002.04B7] # CYRILLIC SMALL LETTER CHE WITH DESCENDER
+04B6  ; [.172E.0020.0008.04B6] # CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
+04CC  ; [.1732.0020.0002.04CC] # CYRILLIC SMALL LETTER KHAKASSIAN CHE
+04CB  ; [.1732.0020.0008.04CB] # CYRILLIC CAPITAL LETTER KHAKASSIAN CHE
+04B9  ; [.1736.0020.0002.04B9] # CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE
+04B8  ; [.1736.0020.0008.04B8] # CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE
+A687  ; [.173A.0020.0002.A687] # CYRILLIC SMALL LETTER CCHE
+A686  ; [.173A.0020.0008.A686] # CYRILLIC CAPITAL LETTER CCHE
+04BD  ; [.173B.0020.0002.04BD] # CYRILLIC SMALL LETTER ABKHASIAN CHE
+04BC  ; [.173B.0020.0008.04BC] # CYRILLIC CAPITAL LETTER ABKHASIAN CHE
+04BF  ; [.173F.0020.0002.04BF] # CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER
+04BE  ; [.173F.0020.0008.04BE] # CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER
+045F  ; [.1743.0020.0002.045F] # CYRILLIC SMALL LETTER DZHE
+040F  ; [.1743.0020.0008.040F] # CYRILLIC CAPITAL LETTER DZHE
+0448  ; [.1747.0020.0002.0448] # CYRILLIC SMALL LETTER SHA
+2DF2  ; [.1747.0020.0004.2DF2] # COMBINING CYRILLIC LETTER SHA; QQK
+0428  ; [.1747.0020.0008.0428] # CYRILLIC CAPITAL LETTER SHA
+A697  ; [.174B.0020.0002.A697] # CYRILLIC SMALL LETTER SHWE
+A696  ; [.174B.0020.0008.A696] # CYRILLIC CAPITAL LETTER SHWE
+0449  ; [.174C.0020.0002.0449] # CYRILLIC SMALL LETTER SHCHA
+2DF3  ; [.174C.0020.0004.2DF3] # COMBINING CYRILLIC LETTER SHCHA; QQK
+0429  ; [.174C.0020.0008.0429] # CYRILLIC CAPITAL LETTER SHCHA
+A64F  ; [.1750.0020.0002.A64F] # CYRILLIC SMALL LETTER NEUTRAL YER
+A64E  ; [.1750.0020.0008.A64E] # CYRILLIC CAPITAL LETTER NEUTRAL YER
+2E2F  ; [.1751.0020.0002.2E2F] # VERTICAL TILDE
+A67F  ; [.1752.0020.0002.A67F] # CYRILLIC PAYEROK
+044A  ; [.1753.0020.0002.044A] # CYRILLIC SMALL LETTER HARD SIGN
+042A  ; [.1753.0020.0008.042A] # CYRILLIC CAPITAL LETTER HARD SIGN
+A651  ; [.1757.0020.0002.A651] # CYRILLIC SMALL LETTER YERU WITH BACK YER
+A650  ; [.1757.0020.0008.A650] # CYRILLIC CAPITAL LETTER YERU WITH BACK YER
+044B  ; [.1758.0020.0002.044B] # CYRILLIC SMALL LETTER YERU
+042B  ; [.1758.0020.0008.042B] # CYRILLIC CAPITAL LETTER YERU
+04F9  ; [.175C.0020.0002.04F9] # CYRILLIC SMALL LETTER YERU WITH DIAERESIS
+044B 0308 ; [.175C.0020.0002.04F9] # CYRILLIC SMALL LETTER YERU WITH DIAERESIS
+04F8  ; [.175C.0020.0008.04F8] # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
+042B 0308 ; [.175C.0020.0008.04F8] # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
+044C  ; [.1760.0020.0002.044C] # CYRILLIC SMALL LETTER SOFT SIGN
+042C  ; [.1760.0020.0008.042C] # CYRILLIC CAPITAL LETTER SOFT SIGN
+048D  ; [.1764.0020.0002.048D] # CYRILLIC SMALL LETTER SEMISOFT SIGN
+048C  ; [.1764.0020.0008.048C] # CYRILLIC CAPITAL LETTER SEMISOFT SIGN
+0463  ; [.1768.0020.0002.0463] # CYRILLIC SMALL LETTER YAT
+2DFA  ; [.1768.0020.0004.2DFA] # COMBINING CYRILLIC LETTER YAT; QQK
+0462  ; [.1768.0020.0008.0462] # CYRILLIC CAPITAL LETTER YAT
+A653  ; [.176C.0020.0002.A653] # CYRILLIC SMALL LETTER IOTIFIED YAT
+A652  ; [.176C.0020.0008.A652] # CYRILLIC CAPITAL LETTER IOTIFIED YAT
+044D  ; [.176D.0020.0002.044D] # CYRILLIC SMALL LETTER E
+042D  ; [.176D.0020.0008.042D] # CYRILLIC CAPITAL LETTER E
+04ED  ; [.1771.0020.0002.04ED] # CYRILLIC SMALL LETTER E WITH DIAERESIS
+044D 0308 ; [.1771.0020.0002.04ED] # CYRILLIC SMALL LETTER E WITH DIAERESIS
+04EC  ; [.1771.0020.0008.04EC] # CYRILLIC CAPITAL LETTER E WITH DIAERESIS
+042D 0308 ; [.1771.0020.0008.04EC] # CYRILLIC CAPITAL LETTER E WITH DIAERESIS
+044E  ; [.1775.0020.0002.044E] # CYRILLIC SMALL LETTER YU
+2DFB  ; [.1775.0020.0004.2DFB] # COMBINING CYRILLIC LETTER YU; QQK
+042E  ; [.1775.0020.0008.042E] # CYRILLIC CAPITAL LETTER YU
+A655  ; [.1779.0020.0002.A655] # CYRILLIC SMALL LETTER REVERSED YU
+A654  ; [.1779.0020.0008.A654] # CYRILLIC CAPITAL LETTER REVERSED YU
+A657  ; [.177A.0020.0002.A657] # CYRILLIC SMALL LETTER IOTIFIED A
+2DFC  ; [.177A.0020.0004.2DFC] # COMBINING CYRILLIC LETTER IOTIFIED A; QQK
+A656  ; [.177A.0020.0008.A656] # CYRILLIC CAPITAL LETTER IOTIFIED A
+044F  ; [.177B.0020.0002.044F] # CYRILLIC SMALL LETTER YA
+042F  ; [.177B.0020.0008.042F] # CYRILLIC CAPITAL LETTER YA
+0519  ; [.177F.0020.0002.0519] # CYRILLIC SMALL LETTER YAE
+0518  ; [.177F.0020.0008.0518] # CYRILLIC CAPITAL LETTER YAE
+0465  ; [.1780.0020.0002.0465] # CYRILLIC SMALL LETTER IOTIFIED E
+0464  ; [.1780.0020.0008.0464] # CYRILLIC CAPITAL LETTER IOTIFIED E
+0467  ; [.1784.0020.0002.0467] # CYRILLIC SMALL LETTER LITTLE YUS
+2DFD  ; [.1784.0020.0004.2DFD] # COMBINING CYRILLIC LETTER LITTLE YUS; QQK
+0466  ; [.1784.0020.0008.0466] # CYRILLIC CAPITAL LETTER LITTLE YUS
+A659  ; [.1788.0020.0002.A659] # CYRILLIC SMALL LETTER CLOSED LITTLE YUS
+A658  ; [.1788.0020.0008.A658] # CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS
+046B  ; [.1789.0020.0002.046B] # CYRILLIC SMALL LETTER BIG YUS
+2DFE  ; [.1789.0020.0004.2DFE] # COMBINING CYRILLIC LETTER BIG YUS; QQK
+046A  ; [.1789.0020.0008.046A] # CYRILLIC CAPITAL LETTER BIG YUS
+A65B  ; [.178D.0020.0002.A65B] # CYRILLIC SMALL LETTER BLENDED YUS
+A65A  ; [.178D.0020.0008.A65A] # CYRILLIC CAPITAL LETTER BLENDED YUS
+0469  ; [.178E.0020.0002.0469] # CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS
+0468  ; [.178E.0020.0008.0468] # CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS
+A65D  ; [.1792.0020.0002.A65D] # CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS
+A65C  ; [.1792.0020.0008.A65C] # CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS
+046D  ; [.1793.0020.0002.046D] # CYRILLIC SMALL LETTER IOTIFIED BIG YUS
+2DFF  ; [.1793.0020.0004.2DFF] # COMBINING CYRILLIC LETTER IOTIFIED BIG YUS; QQK
+046C  ; [.1793.0020.0008.046C] # CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS
+046F  ; [.1797.0020.0002.046F] # CYRILLIC SMALL LETTER KSI
+046E  ; [.1797.0020.0008.046E] # CYRILLIC CAPITAL LETTER KSI
+0471  ; [.179B.0020.0002.0471] # CYRILLIC SMALL LETTER PSI
+0470  ; [.179B.0020.0008.0470] # CYRILLIC CAPITAL LETTER PSI
+0473  ; [.179F.0020.0002.0473] # CYRILLIC SMALL LETTER FITA
+2DF4  ; [.179F.0020.0004.2DF4] # COMBINING CYRILLIC LETTER FITA; QQK
+0472  ; [.179F.0020.0008.0472] # CYRILLIC CAPITAL LETTER FITA
+0475  ; [.17A3.0020.0002.0475] # CYRILLIC SMALL LETTER IZHITSA
+0474  ; [.17A3.0020.0008.0474] # CYRILLIC CAPITAL LETTER IZHITSA
+0477  ; [.17A7.0020.0002.0477] # CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0475 030F ; [.17A7.0020.0002.0477] # CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0476  ; [.17A7.0020.0008.0476] # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0474 030F ; [.17A7.0020.0008.0476] # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+A65F  ; [.17AB.0020.0002.A65F] # CYRILLIC SMALL LETTER YN
+A65E  ; [.17AB.0020.0008.A65E] # CYRILLIC CAPITAL LETTER YN
+04A9  ; [.17AC.0020.0002.04A9] # CYRILLIC SMALL LETTER ABKHASIAN HA
+04A8  ; [.17AC.0020.0008.04A8] # CYRILLIC CAPITAL LETTER ABKHASIAN HA
+051D  ; [.17B0.0020.0002.051D] # CYRILLIC SMALL LETTER WE
+051C  ; [.17B0.0020.0008.051C] # CYRILLIC CAPITAL LETTER WE
+04CF  ; [.17B1.0020.0002.04CF] # CYRILLIC SMALL LETTER PALOCHKA
+04C0  ; [.17B1.0020.0008.04C0] # CYRILLIC LETTER PALOCHKA
+2C30  ; [.17B5.0020.0002.2C30] # GLAGOLITIC SMALL LETTER AZU
+2C00  ; [.17B5.0020.0008.2C00] # GLAGOLITIC CAPITAL LETTER AZU
+2C31  ; [.17B6.0020.0002.2C31] # GLAGOLITIC SMALL LETTER BUKY
+2C01  ; [.17B6.0020.0008.2C01] # GLAGOLITIC CAPITAL LETTER BUKY
+2C32  ; [.17B7.0020.0002.2C32] # GLAGOLITIC SMALL LETTER VEDE
+2C02  ; [.17B7.0020.0008.2C02] # GLAGOLITIC CAPITAL LETTER VEDE
+2C33  ; [.17B8.0020.0002.2C33] # GLAGOLITIC SMALL LETTER GLAGOLI
+2C03  ; [.17B8.0020.0008.2C03] # GLAGOLITIC CAPITAL LETTER GLAGOLI
+2C34  ; [.17B9.0020.0002.2C34] # GLAGOLITIC SMALL LETTER DOBRO
+2C04  ; [.17B9.0020.0008.2C04] # GLAGOLITIC CAPITAL LETTER DOBRO
+2C35  ; [.17BA.0020.0002.2C35] # GLAGOLITIC SMALL LETTER YESTU
+2C05  ; [.17BA.0020.0008.2C05] # GLAGOLITIC CAPITAL LETTER YESTU
+2C36  ; [.17BB.0020.0002.2C36] # GLAGOLITIC SMALL LETTER ZHIVETE
+2C06  ; [.17BB.0020.0008.2C06] # GLAGOLITIC CAPITAL LETTER ZHIVETE
+2C37  ; [.17BC.0020.0002.2C37] # GLAGOLITIC SMALL LETTER DZELO
+2C07  ; [.17BC.0020.0008.2C07] # GLAGOLITIC CAPITAL LETTER DZELO
+2C38  ; [.17BD.0020.0002.2C38] # GLAGOLITIC SMALL LETTER ZEMLJA
+2C08  ; [.17BD.0020.0008.2C08] # GLAGOLITIC CAPITAL LETTER ZEMLJA
+2C39  ; [.17BE.0020.0002.2C39] # GLAGOLITIC SMALL LETTER IZHE
+2C09  ; [.17BE.0020.0008.2C09] # GLAGOLITIC CAPITAL LETTER IZHE
+2C3A  ; [.17BF.0020.0002.2C3A] # GLAGOLITIC SMALL LETTER INITIAL IZHE
+2C0A  ; [.17BF.0020.0008.2C0A] # GLAGOLITIC CAPITAL LETTER INITIAL IZHE
+2C3B  ; [.17C0.0020.0002.2C3B] # GLAGOLITIC SMALL LETTER I
+2C0B  ; [.17C0.0020.0008.2C0B] # GLAGOLITIC CAPITAL LETTER I
+2C3C  ; [.17C1.0020.0002.2C3C] # GLAGOLITIC SMALL LETTER DJERVI
+2C0C  ; [.17C1.0020.0008.2C0C] # GLAGOLITIC CAPITAL LETTER DJERVI
+2C3D  ; [.17C2.0020.0002.2C3D] # GLAGOLITIC SMALL LETTER KAKO
+2C0D  ; [.17C2.0020.0008.2C0D] # GLAGOLITIC CAPITAL LETTER KAKO
+2C3E  ; [.17C3.0020.0002.2C3E] # GLAGOLITIC SMALL LETTER LJUDIJE
+2C0E  ; [.17C3.0020.0008.2C0E] # GLAGOLITIC CAPITAL LETTER LJUDIJE
+2C3F  ; [.17C4.0020.0002.2C3F] # GLAGOLITIC SMALL LETTER MYSLITE
+2C0F  ; [.17C4.0020.0008.2C0F] # GLAGOLITIC CAPITAL LETTER MYSLITE
+2C40  ; [.17C5.0020.0002.2C40] # GLAGOLITIC SMALL LETTER NASHI
+2C10  ; [.17C5.0020.0008.2C10] # GLAGOLITIC CAPITAL LETTER NASHI
+2C41  ; [.17C6.0020.0002.2C41] # GLAGOLITIC SMALL LETTER ONU
+2C11  ; [.17C6.0020.0008.2C11] # GLAGOLITIC CAPITAL LETTER ONU
+2C42  ; [.17C7.0020.0002.2C42] # GLAGOLITIC SMALL LETTER POKOJI
+2C12  ; [.17C7.0020.0008.2C12] # GLAGOLITIC CAPITAL LETTER POKOJI
+2C43  ; [.17C8.0020.0002.2C43] # GLAGOLITIC SMALL LETTER RITSI
+2C13  ; [.17C8.0020.0008.2C13] # GLAGOLITIC CAPITAL LETTER RITSI
+2C44  ; [.17C9.0020.0002.2C44] # GLAGOLITIC SMALL LETTER SLOVO
+2C14  ; [.17C9.0020.0008.2C14] # GLAGOLITIC CAPITAL LETTER SLOVO
+2C45  ; [.17CA.0020.0002.2C45] # GLAGOLITIC SMALL LETTER TVRIDO
+2C15  ; [.17CA.0020.0008.2C15] # GLAGOLITIC CAPITAL LETTER TVRIDO
+2C46  ; [.17CB.0020.0002.2C46] # GLAGOLITIC SMALL LETTER UKU
+2C16  ; [.17CB.0020.0008.2C16] # GLAGOLITIC CAPITAL LETTER UKU
+2C47  ; [.17CC.0020.0002.2C47] # GLAGOLITIC SMALL LETTER FRITU
+2C17  ; [.17CC.0020.0008.2C17] # GLAGOLITIC CAPITAL LETTER FRITU
+2C48  ; [.17CD.0020.0002.2C48] # GLAGOLITIC SMALL LETTER HERU
+2C18  ; [.17CD.0020.0008.2C18] # GLAGOLITIC CAPITAL LETTER HERU
+2C49  ; [.17CE.0020.0002.2C49] # GLAGOLITIC SMALL LETTER OTU
+2C19  ; [.17CE.0020.0008.2C19] # GLAGOLITIC CAPITAL LETTER OTU
+2C4A  ; [.17CF.0020.0002.2C4A] # GLAGOLITIC SMALL LETTER PE
+2C1A  ; [.17CF.0020.0008.2C1A] # GLAGOLITIC CAPITAL LETTER PE
+2C4B  ; [.17D0.0020.0002.2C4B] # GLAGOLITIC SMALL LETTER SHTA
+2C1B  ; [.17D0.0020.0008.2C1B] # GLAGOLITIC CAPITAL LETTER SHTA
+2C4C  ; [.17D1.0020.0002.2C4C] # GLAGOLITIC SMALL LETTER TSI
+2C1C  ; [.17D1.0020.0008.2C1C] # GLAGOLITIC CAPITAL LETTER TSI
+2C4D  ; [.17D2.0020.0002.2C4D] # GLAGOLITIC SMALL LETTER CHRIVI
+2C1D  ; [.17D2.0020.0008.2C1D] # GLAGOLITIC CAPITAL LETTER CHRIVI
+2C4E  ; [.17D3.0020.0002.2C4E] # GLAGOLITIC SMALL LETTER SHA
+2C1E  ; [.17D3.0020.0008.2C1E] # GLAGOLITIC CAPITAL LETTER SHA
+2C4F  ; [.17D4.0020.0002.2C4F] # GLAGOLITIC SMALL LETTER YERU
+2C1F  ; [.17D4.0020.0008.2C1F] # GLAGOLITIC CAPITAL LETTER YERU
+2C50  ; [.17D5.0020.0002.2C50] # GLAGOLITIC SMALL LETTER YERI
+2C20  ; [.17D5.0020.0008.2C20] # GLAGOLITIC CAPITAL LETTER YERI
+2C51  ; [.17D6.0020.0002.2C51] # GLAGOLITIC SMALL LETTER YATI
+2C21  ; [.17D6.0020.0008.2C21] # GLAGOLITIC CAPITAL LETTER YATI
+2C52  ; [.17D7.0020.0002.2C52] # GLAGOLITIC SMALL LETTER SPIDERY HA
+2C22  ; [.17D7.0020.0008.2C22] # GLAGOLITIC CAPITAL LETTER SPIDERY HA
+2C53  ; [.17D8.0020.0002.2C53] # GLAGOLITIC SMALL LETTER YU
+2C23  ; [.17D8.0020.0008.2C23] # GLAGOLITIC CAPITAL LETTER YU
+2C54  ; [.17D9.0020.0002.2C54] # GLAGOLITIC SMALL LETTER SMALL YUS
+2C24  ; [.17D9.0020.0008.2C24] # GLAGOLITIC CAPITAL LETTER SMALL YUS
+2C55  ; [.17DA.0020.0002.2C55] # GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL
+2C25  ; [.17DA.0020.0008.2C25] # GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL
+2C56  ; [.17DB.0020.0002.2C56] # GLAGOLITIC SMALL LETTER YO
+2C26  ; [.17DB.0020.0008.2C26] # GLAGOLITIC CAPITAL LETTER YO
+2C57  ; [.17DC.0020.0002.2C57] # GLAGOLITIC SMALL LETTER IOTATED SMALL YUS
+2C27  ; [.17DC.0020.0008.2C27] # GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS
+2C58  ; [.17DD.0020.0002.2C58] # GLAGOLITIC SMALL LETTER BIG YUS
+2C28  ; [.17DD.0020.0008.2C28] # GLAGOLITIC CAPITAL LETTER BIG YUS
+2C59  ; [.17DE.0020.0002.2C59] # GLAGOLITIC SMALL LETTER IOTATED BIG YUS
+2C29  ; [.17DE.0020.0008.2C29] # GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS
+2C5A  ; [.17DF.0020.0002.2C5A] # GLAGOLITIC SMALL LETTER FITA
+2C2A  ; [.17DF.0020.0008.2C2A] # GLAGOLITIC CAPITAL LETTER FITA
+2C5B  ; [.17E0.0020.0002.2C5B] # GLAGOLITIC SMALL LETTER IZHITSA
+2C2B  ; [.17E0.0020.0008.2C2B] # GLAGOLITIC CAPITAL LETTER IZHITSA
+2C5C  ; [.17E1.0020.0002.2C5C] # GLAGOLITIC SMALL LETTER SHTAPIC
+2C2C  ; [.17E1.0020.0008.2C2C] # GLAGOLITIC CAPITAL LETTER SHTAPIC
+2C5D  ; [.17E2.0020.0002.2C5D] # GLAGOLITIC SMALL LETTER TROKUTASTI A
+2C2D  ; [.17E2.0020.0008.2C2D] # GLAGOLITIC CAPITAL LETTER TROKUTASTI A
+2C5E  ; [.17E3.0020.0002.2C5E] # GLAGOLITIC SMALL LETTER LATINATE MYSLITE
+2C2E  ; [.17E3.0020.0008.2C2E] # GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
+10D0  ; [.17E4.0020.0002.10D0] # GEORGIAN LETTER AN
+2D00  ; [.17E5.0020.0002.2D00] # GEORGIAN SMALL LETTER AN
+10A0  ; [.17E5.0020.0008.10A0] # GEORGIAN CAPITAL LETTER AN
+10D1  ; [.17E6.0020.0002.10D1] # GEORGIAN LETTER BAN
+2D01  ; [.17E7.0020.0002.2D01] # GEORGIAN SMALL LETTER BAN
+10A1  ; [.17E7.0020.0008.10A1] # GEORGIAN CAPITAL LETTER BAN
+10D2  ; [.17E8.0020.0002.10D2] # GEORGIAN LETTER GAN
+2D02  ; [.17E9.0020.0002.2D02] # GEORGIAN SMALL LETTER GAN
+10A2  ; [.17E9.0020.0008.10A2] # GEORGIAN CAPITAL LETTER GAN
+10D3  ; [.17EA.0020.0002.10D3] # GEORGIAN LETTER DON
+2D03  ; [.17EB.0020.0002.2D03] # GEORGIAN SMALL LETTER DON
+10A3  ; [.17EB.0020.0008.10A3] # GEORGIAN CAPITAL LETTER DON
+10D4  ; [.17EC.0020.0002.10D4] # GEORGIAN LETTER EN
+2D04  ; [.17ED.0020.0002.2D04] # GEORGIAN SMALL LETTER EN
+10A4  ; [.17ED.0020.0008.10A4] # GEORGIAN CAPITAL LETTER EN
+10D5  ; [.17EE.0020.0002.10D5] # GEORGIAN LETTER VIN
+2D05  ; [.17EF.0020.0002.2D05] # GEORGIAN SMALL LETTER VIN
+10A5  ; [.17EF.0020.0008.10A5] # GEORGIAN CAPITAL LETTER VIN
+10D6  ; [.17F0.0020.0002.10D6] # GEORGIAN LETTER ZEN
+2D06  ; [.17F1.0020.0002.2D06] # GEORGIAN SMALL LETTER ZEN
+10A6  ; [.17F1.0020.0008.10A6] # GEORGIAN CAPITAL LETTER ZEN
+10F1  ; [.17F2.0020.0002.10F1] # GEORGIAN LETTER HE
+2D21  ; [.17F3.0020.0002.2D21] # GEORGIAN SMALL LETTER HE
+10C1  ; [.17F3.0020.0008.10C1] # GEORGIAN CAPITAL LETTER HE
+10D7  ; [.17F4.0020.0002.10D7] # GEORGIAN LETTER TAN
+2D07  ; [.17F5.0020.0002.2D07] # GEORGIAN SMALL LETTER TAN
+10A7  ; [.17F5.0020.0008.10A7] # GEORGIAN CAPITAL LETTER TAN
+10D8  ; [.17F6.0020.0002.10D8] # GEORGIAN LETTER IN
+2D08  ; [.17F7.0020.0002.2D08] # GEORGIAN SMALL LETTER IN
+10A8  ; [.17F7.0020.0008.10A8] # GEORGIAN CAPITAL LETTER IN
+10D9  ; [.17F8.0020.0002.10D9] # GEORGIAN LETTER KAN
+2D09  ; [.17F9.0020.0002.2D09] # GEORGIAN SMALL LETTER KAN
+10A9  ; [.17F9.0020.0008.10A9] # GEORGIAN CAPITAL LETTER KAN
+10DA  ; [.17FA.0020.0002.10DA] # GEORGIAN LETTER LAS
+2D0A  ; [.17FB.0020.0002.2D0A] # GEORGIAN SMALL LETTER LAS
+10AA  ; [.17FB.0020.0008.10AA] # GEORGIAN CAPITAL LETTER LAS
+10DB  ; [.17FC.0020.0002.10DB] # GEORGIAN LETTER MAN
+2D0B  ; [.17FD.0020.0002.2D0B] # GEORGIAN SMALL LETTER MAN
+10AB  ; [.17FD.0020.0008.10AB] # GEORGIAN CAPITAL LETTER MAN
+10DC  ; [.17FE.0020.0002.10DC] # GEORGIAN LETTER NAR
+10FC  ; [.17FE.0020.0014.10FC] # MODIFIER LETTER GEORGIAN NAR; QQK
+2D0C  ; [.17FF.0020.0002.2D0C] # GEORGIAN SMALL LETTER NAR
+10AC  ; [.17FF.0020.0008.10AC] # GEORGIAN CAPITAL LETTER NAR
+10F2  ; [.1800.0020.0002.10F2] # GEORGIAN LETTER HIE
+2D22  ; [.1801.0020.0002.2D22] # GEORGIAN SMALL LETTER HIE
+10C2  ; [.1801.0020.0008.10C2] # GEORGIAN CAPITAL LETTER HIE
+10DD  ; [.1802.0020.0002.10DD] # GEORGIAN LETTER ON
+2D0D  ; [.1803.0020.0002.2D0D] # GEORGIAN SMALL LETTER ON
+10AD  ; [.1803.0020.0008.10AD] # GEORGIAN CAPITAL LETTER ON
+10DE  ; [.1804.0020.0002.10DE] # GEORGIAN LETTER PAR
+2D0E  ; [.1805.0020.0002.2D0E] # GEORGIAN SMALL LETTER PAR
+10AE  ; [.1805.0020.0008.10AE] # GEORGIAN CAPITAL LETTER PAR
+10DF  ; [.1806.0020.0002.10DF] # GEORGIAN LETTER ZHAR
+2D0F  ; [.1807.0020.0002.2D0F] # GEORGIAN SMALL LETTER ZHAR
+10AF  ; [.1807.0020.0008.10AF] # GEORGIAN CAPITAL LETTER ZHAR
+10E0  ; [.1808.0020.0002.10E0] # GEORGIAN LETTER RAE
+2D10  ; [.1809.0020.0002.2D10] # GEORGIAN SMALL LETTER RAE
+10B0  ; [.1809.0020.0008.10B0] # GEORGIAN CAPITAL LETTER RAE
+10E1  ; [.180A.0020.0002.10E1] # GEORGIAN LETTER SAN
+2D11  ; [.180B.0020.0002.2D11] # GEORGIAN SMALL LETTER SAN
+10B1  ; [.180B.0020.0008.10B1] # GEORGIAN CAPITAL LETTER SAN
+10E2  ; [.180C.0020.0002.10E2] # GEORGIAN LETTER TAR
+2D12  ; [.180D.0020.0002.2D12] # GEORGIAN SMALL LETTER TAR
+10B2  ; [.180D.0020.0008.10B2] # GEORGIAN CAPITAL LETTER TAR
+10F3  ; [.180E.0020.0002.10F3] # GEORGIAN LETTER WE
+2D23  ; [.180F.0020.0002.2D23] # GEORGIAN SMALL LETTER WE
+10C3  ; [.180F.0020.0008.10C3] # GEORGIAN CAPITAL LETTER WE
+10E3  ; [.1810.0020.0002.10E3] # GEORGIAN LETTER UN
+2D13  ; [.1811.0020.0002.2D13] # GEORGIAN SMALL LETTER UN
+10B3  ; [.1811.0020.0008.10B3] # GEORGIAN CAPITAL LETTER UN
+10E4  ; [.1812.0020.0002.10E4] # GEORGIAN LETTER PHAR
+2D14  ; [.1813.0020.0002.2D14] # GEORGIAN SMALL LETTER PHAR
+10B4  ; [.1813.0020.0008.10B4] # GEORGIAN CAPITAL LETTER PHAR
+10E5  ; [.1814.0020.0002.10E5] # GEORGIAN LETTER KHAR
+2D15  ; [.1815.0020.0002.2D15] # GEORGIAN SMALL LETTER KHAR
+10B5  ; [.1815.0020.0008.10B5] # GEORGIAN CAPITAL LETTER KHAR
+10E6  ; [.1816.0020.0002.10E6] # GEORGIAN LETTER GHAN
+2D16  ; [.1817.0020.0002.2D16] # GEORGIAN SMALL LETTER GHAN
+10B6  ; [.1817.0020.0008.10B6] # GEORGIAN CAPITAL LETTER GHAN
+10E7  ; [.1818.0020.0002.10E7] # GEORGIAN LETTER QAR
+2D17  ; [.1819.0020.0002.2D17] # GEORGIAN SMALL LETTER QAR
+10B7  ; [.1819.0020.0008.10B7] # GEORGIAN CAPITAL LETTER QAR
+10E8  ; [.181A.0020.0002.10E8] # GEORGIAN LETTER SHIN
+2D18  ; [.181B.0020.0002.2D18] # GEORGIAN SMALL LETTER SHIN
+10B8  ; [.181B.0020.0008.10B8] # GEORGIAN CAPITAL LETTER SHIN
+10E9  ; [.181C.0020.0002.10E9] # GEORGIAN LETTER CHIN
+2D19  ; [.181D.0020.0002.2D19] # GEORGIAN SMALL LETTER CHIN
+10B9  ; [.181D.0020.0008.10B9] # GEORGIAN CAPITAL LETTER CHIN
+10EA  ; [.181E.0020.0002.10EA] # GEORGIAN LETTER CAN
+2D1A  ; [.181F.0020.0002.2D1A] # GEORGIAN SMALL LETTER CAN
+10BA  ; [.181F.0020.0008.10BA] # GEORGIAN CAPITAL LETTER CAN
+10EB  ; [.1820.0020.0002.10EB] # GEORGIAN LETTER JIL
+2D1B  ; [.1821.0020.0002.2D1B] # GEORGIAN SMALL LETTER JIL
+10BB  ; [.1821.0020.0008.10BB] # GEORGIAN CAPITAL LETTER JIL
+10EC  ; [.1822.0020.0002.10EC] # GEORGIAN LETTER CIL
+2D1C  ; [.1823.0020.0002.2D1C] # GEORGIAN SMALL LETTER CIL
+10BC  ; [.1823.0020.0008.10BC] # GEORGIAN CAPITAL LETTER CIL
+10ED  ; [.1824.0020.0002.10ED] # GEORGIAN LETTER CHAR
+2D1D  ; [.1825.0020.0002.2D1D] # GEORGIAN SMALL LETTER CHAR
+10BD  ; [.1825.0020.0008.10BD] # GEORGIAN CAPITAL LETTER CHAR
+10EE  ; [.1826.0020.0002.10EE] # GEORGIAN LETTER XAN
+2D1E  ; [.1827.0020.0002.2D1E] # GEORGIAN SMALL LETTER XAN
+10BE  ; [.1827.0020.0008.10BE] # GEORGIAN CAPITAL LETTER XAN
+10F4  ; [.1828.0020.0002.10F4] # GEORGIAN LETTER HAR
+2D24  ; [.1829.0020.0002.2D24] # GEORGIAN SMALL LETTER HAR
+10C4  ; [.1829.0020.0008.10C4] # GEORGIAN CAPITAL LETTER HAR
+10EF  ; [.182A.0020.0002.10EF] # GEORGIAN LETTER JHAN
+2D1F  ; [.182B.0020.0002.2D1F] # GEORGIAN SMALL LETTER JHAN
+10BF  ; [.182B.0020.0008.10BF] # GEORGIAN CAPITAL LETTER JHAN
+10F0  ; [.182C.0020.0002.10F0] # GEORGIAN LETTER HAE
+2D20  ; [.182D.0020.0002.2D20] # GEORGIAN SMALL LETTER HAE
+10C0  ; [.182D.0020.0008.10C0] # GEORGIAN CAPITAL LETTER HAE
+10F5  ; [.182E.0020.0002.10F5] # GEORGIAN LETTER HOE
+2D25  ; [.182F.0020.0002.2D25] # GEORGIAN SMALL LETTER HOE
+10C5  ; [.182F.0020.0008.10C5] # GEORGIAN CAPITAL LETTER HOE
+10F6  ; [.1830.0020.0002.10F6] # GEORGIAN LETTER FI
+10F7  ; [.1831.0020.0002.10F7] # GEORGIAN LETTER YN
+10F8  ; [.1832.0020.0002.10F8] # GEORGIAN LETTER ELIFI
+10F9  ; [.1833.0020.0002.10F9] # GEORGIAN LETTER TURNED GAN
+10FA  ; [.1834.0020.0002.10FA] # GEORGIAN LETTER AIN
+0561  ; [.1835.0020.0002.0561] # ARMENIAN SMALL LETTER AYB
+0531  ; [.1835.0020.0008.0531] # ARMENIAN CAPITAL LETTER AYB
+0562  ; [.1836.0020.0002.0562] # ARMENIAN SMALL LETTER BEN
+0532  ; [.1836.0020.0008.0532] # ARMENIAN CAPITAL LETTER BEN
+0563  ; [.1837.0020.0002.0563] # ARMENIAN SMALL LETTER GIM
+0533  ; [.1837.0020.0008.0533] # ARMENIAN CAPITAL LETTER GIM
+0564  ; [.1838.0020.0002.0564] # ARMENIAN SMALL LETTER DA
+0534  ; [.1838.0020.0008.0534] # ARMENIAN CAPITAL LETTER DA
+0565  ; [.1839.0020.0002.0565] # ARMENIAN SMALL LETTER ECH
+0535  ; [.1839.0020.0008.0535] # ARMENIAN CAPITAL LETTER ECH
+0587  ; [.1839.0020.0004.0587][.1856.0020.0004.0587] # ARMENIAN SMALL LIGATURE ECH YIWN; QQKN
+0566  ; [.183A.0020.0002.0566] # ARMENIAN SMALL LETTER ZA
+0536  ; [.183A.0020.0008.0536] # ARMENIAN CAPITAL LETTER ZA
+0567  ; [.183B.0020.0002.0567] # ARMENIAN SMALL LETTER EH
+0537  ; [.183B.0020.0008.0537] # ARMENIAN CAPITAL LETTER EH
+0568  ; [.183C.0020.0002.0568] # ARMENIAN SMALL LETTER ET
+0538  ; [.183C.0020.0008.0538] # ARMENIAN CAPITAL LETTER ET
+0569  ; [.183D.0020.0002.0569] # ARMENIAN SMALL LETTER TO
+0539  ; [.183D.0020.0008.0539] # ARMENIAN CAPITAL LETTER TO
+056A  ; [.183E.0020.0002.056A] # ARMENIAN SMALL LETTER ZHE
+053A  ; [.183E.0020.0008.053A] # ARMENIAN CAPITAL LETTER ZHE
+056B  ; [.183F.0020.0002.056B] # ARMENIAN SMALL LETTER INI
+053B  ; [.183F.0020.0008.053B] # ARMENIAN CAPITAL LETTER INI
+056C  ; [.1840.0020.0002.056C] # ARMENIAN SMALL LETTER LIWN
+053C  ; [.1840.0020.0008.053C] # ARMENIAN CAPITAL LETTER LIWN
+056D  ; [.1841.0020.0002.056D] # ARMENIAN SMALL LETTER XEH
+053D  ; [.1841.0020.0008.053D] # ARMENIAN CAPITAL LETTER XEH
+056E  ; [.1842.0020.0002.056E] # ARMENIAN SMALL LETTER CA
+053E  ; [.1842.0020.0008.053E] # ARMENIAN CAPITAL LETTER CA
+056F  ; [.1843.0020.0002.056F] # ARMENIAN SMALL LETTER KEN
+053F  ; [.1843.0020.0008.053F] # ARMENIAN CAPITAL LETTER KEN
+0570  ; [.1844.0020.0002.0570] # ARMENIAN SMALL LETTER HO
+0540  ; [.1844.0020.0008.0540] # ARMENIAN CAPITAL LETTER HO
+0571  ; [.1845.0020.0002.0571] # ARMENIAN SMALL LETTER JA
+0541  ; [.1845.0020.0008.0541] # ARMENIAN CAPITAL LETTER JA
+0572  ; [.1846.0020.0002.0572] # ARMENIAN SMALL LETTER GHAD
+0542  ; [.1846.0020.0008.0542] # ARMENIAN CAPITAL LETTER GHAD
+0573  ; [.1847.0020.0002.0573] # ARMENIAN SMALL LETTER CHEH
+0543  ; [.1847.0020.0008.0543] # ARMENIAN CAPITAL LETTER CHEH
+0574  ; [.1848.0020.0002.0574] # ARMENIAN SMALL LETTER MEN
+0544  ; [.1848.0020.0008.0544] # ARMENIAN CAPITAL LETTER MEN
+FB14  ; [.1848.0020.0004.FB14][.1839.0020.0004.FB14] # ARMENIAN SMALL LIGATURE MEN ECH; QQKN
+FB15  ; [.1848.0020.0004.FB15][.183F.0020.0004.FB15] # ARMENIAN SMALL LIGATURE MEN INI; QQKN
+FB17  ; [.1848.0020.0004.FB17][.1841.0020.0004.FB17] # ARMENIAN SMALL LIGATURE MEN XEH; QQKN
+FB13  ; [.1848.0020.0004.FB13][.184A.0020.0004.FB13] # ARMENIAN SMALL LIGATURE MEN NOW; QQKN
+0575  ; [.1849.0020.0002.0575] # ARMENIAN SMALL LETTER YI
+0545  ; [.1849.0020.0008.0545] # ARMENIAN CAPITAL LETTER YI
+0576  ; [.184A.0020.0002.0576] # ARMENIAN SMALL LETTER NOW
+0546  ; [.184A.0020.0008.0546] # ARMENIAN CAPITAL LETTER NOW
+0577  ; [.184B.0020.0002.0577] # ARMENIAN SMALL LETTER SHA
+0547  ; [.184B.0020.0008.0547] # ARMENIAN CAPITAL LETTER SHA
+0578  ; [.184C.0020.0002.0578] # ARMENIAN SMALL LETTER VO
+0548  ; [.184C.0020.0008.0548] # ARMENIAN CAPITAL LETTER VO
+0579  ; [.184D.0020.0002.0579] # ARMENIAN SMALL LETTER CHA
+0549  ; [.184D.0020.0008.0549] # ARMENIAN CAPITAL LETTER CHA
+057A  ; [.184E.0020.0002.057A] # ARMENIAN SMALL LETTER PEH
+054A  ; [.184E.0020.0008.054A] # ARMENIAN CAPITAL LETTER PEH
+057B  ; [.184F.0020.0002.057B] # ARMENIAN SMALL LETTER JHEH
+054B  ; [.184F.0020.0008.054B] # ARMENIAN CAPITAL LETTER JHEH
+057C  ; [.1850.0020.0002.057C] # ARMENIAN SMALL LETTER RA
+054C  ; [.1850.0020.0008.054C] # ARMENIAN CAPITAL LETTER RA
+057D  ; [.1851.0020.0002.057D] # ARMENIAN SMALL LETTER SEH
+054D  ; [.1851.0020.0008.054D] # ARMENIAN CAPITAL LETTER SEH
+057E  ; [.1852.0020.0002.057E] # ARMENIAN SMALL LETTER VEW
+054E  ; [.1852.0020.0008.054E] # ARMENIAN CAPITAL LETTER VEW
+FB16  ; [.1852.0020.0004.FB16][.184A.0020.0004.FB16] # ARMENIAN SMALL LIGATURE VEW NOW; QQKN
+057F  ; [.1853.0020.0002.057F] # ARMENIAN SMALL LETTER TIWN
+054F  ; [.1853.0020.0008.054F] # ARMENIAN CAPITAL LETTER TIWN
+0580  ; [.1854.0020.0002.0580] # ARMENIAN SMALL LETTER REH
+0550  ; [.1854.0020.0008.0550] # ARMENIAN CAPITAL LETTER REH
+0581  ; [.1855.0020.0002.0581] # ARMENIAN SMALL LETTER CO
+0551  ; [.1855.0020.0008.0551] # ARMENIAN CAPITAL LETTER CO
+0582  ; [.1856.0020.0002.0582] # ARMENIAN SMALL LETTER YIWN
+0552  ; [.1856.0020.0008.0552] # ARMENIAN CAPITAL LETTER YIWN
+0583  ; [.1857.0020.0002.0583] # ARMENIAN SMALL LETTER PIWR
+0553  ; [.1857.0020.0008.0553] # ARMENIAN CAPITAL LETTER PIWR
+0584  ; [.1858.0020.0002.0584] # ARMENIAN SMALL LETTER KEH
+0554  ; [.1858.0020.0008.0554] # ARMENIAN CAPITAL LETTER KEH
+0585  ; [.1859.0020.0002.0585] # ARMENIAN SMALL LETTER OH
+0555  ; [.1859.0020.0008.0555] # ARMENIAN CAPITAL LETTER OH
+0586  ; [.185A.0020.0002.0586] # ARMENIAN SMALL LETTER FEH
+0556  ; [.185A.0020.0008.0556] # ARMENIAN CAPITAL LETTER FEH
+0559  ; [.185B.0020.0002.0559] # ARMENIAN MODIFIER LETTER LEFT HALF RING
+05D0  ; [.185C.0020.0002.05D0] # HEBREW LETTER ALEF
+2135  ; [.185C.0020.0004.2135] # ALEF SYMBOL; QQK
+FB21  ; [.185C.0020.0005.FB21] # HEBREW LETTER WIDE ALEF; QQK
+FB2E  ; [.185C.0020.0002.05D0][.0000.008C.0002.05B7] # HEBREW LETTER ALEF WITH PATAH; QQCM
+FB2F  ; [.185C.0020.0002.05D0][.0000.008D.0002.05B8] # HEBREW LETTER ALEF WITH QAMATS; QQCM
+FB30  ; [.185C.0020.0002.05D0][.0000.0092.0002.05BC] # HEBREW LETTER ALEF WITH MAPIQ; QQCM
+FB4F  ; [.185C.0020.0004.FB4F][.1867.0020.0004.FB4F] # HEBREW LIGATURE ALEF LAMED; QQKN
+05D1  ; [.185D.0020.0002.05D1] # HEBREW LETTER BET
+2136  ; [.185D.0020.0004.2136] # BET SYMBOL; QQK
+FB31  ; [.185D.0020.0002.05D1][.0000.0092.0002.05BC] # HEBREW LETTER BET WITH DAGESH; QQCM
+FB4C  ; [.185D.0020.0002.05D1][.0000.0095.0002.05BF] # HEBREW LETTER BET WITH RAFE; QQCM
+05D2  ; [.185E.0020.0002.05D2] # HEBREW LETTER GIMEL
+2137  ; [.185E.0020.0004.2137] # GIMEL SYMBOL; QQK
+FB32  ; [.185E.0020.0002.05D2][.0000.0092.0002.05BC] # HEBREW LETTER GIMEL WITH DAGESH; QQCM
+05D3  ; [.185F.0020.0002.05D3] # HEBREW LETTER DALET
+2138  ; [.185F.0020.0004.2138] # DALET SYMBOL; QQK
+FB22  ; [.185F.0020.0005.FB22] # HEBREW LETTER WIDE DALET; QQK
+FB33  ; [.185F.0020.0002.05D3][.0000.0092.0002.05BC] # HEBREW LETTER DALET WITH DAGESH; QQCM
+05D4  ; [.1860.0020.0002.05D4] # HEBREW LETTER HE
+FB23  ; [.1860.0020.0005.FB23] # HEBREW LETTER WIDE HE; QQK
+FB34  ; [.1860.0020.0002.05D4][.0000.0092.0002.05BC] # HEBREW LETTER HE WITH MAPIQ; QQCM
+05D5  ; [.1861.0020.0002.05D5] # HEBREW LETTER VAV
+FB4B  ; [.1861.0020.0002.05D5][.0000.008E.0002.05B9] # HEBREW LETTER VAV WITH HOLAM; QQCM
+FB35  ; [.1861.0020.0002.05D5][.0000.0092.0002.05BC] # HEBREW LETTER VAV WITH DAGESH; QQCM
+05F0  ; [.1861.0020.0004.05F0][.1861.0020.0004.05F0] # HEBREW LIGATURE YIDDISH DOUBLE VAV; QQKN
+05F1  ; [.1861.0020.0004.05F1][.1865.0020.0004.05F1] # HEBREW LIGATURE YIDDISH VAV YOD; QQKN
+05D6  ; [.1862.0020.0002.05D6] # HEBREW LETTER ZAYIN
+FB36  ; [.1862.0020.0002.05D6][.0000.0092.0002.05BC] # HEBREW LETTER ZAYIN WITH DAGESH; QQCM
+05D7  ; [.1863.0020.0002.05D7] # HEBREW LETTER HET
+05D8  ; [.1864.0020.0002.05D8] # HEBREW LETTER TET
+FB38  ; [.1864.0020.0002.05D8][.0000.0092.0002.05BC] # HEBREW LETTER TET WITH DAGESH; QQCM
+05D9  ; [.1865.0020.0002.05D9] # HEBREW LETTER YOD
+FB1D  ; [.1865.0020.0002.05D9][.0000.0089.0002.05B4] # HEBREW LETTER YOD WITH HIRIQ; QQCM
+FB39  ; [.1865.0020.0002.05D9][.0000.0092.0002.05BC] # HEBREW LETTER YOD WITH DAGESH; QQCM
+05F2  ; [.1865.0020.0004.05F2][.1865.0020.0004.05F2] # HEBREW LIGATURE YIDDISH DOUBLE YOD; QQKN
+FB1F  ; [.1865.0020.0004.FB1F][.1865.0020.0004.FB1F][.0000.008C.0002.FB1F] # HEBREW LIGATURE YIDDISH YOD YOD PATAH; QQKN
+05DB  ; [.1866.0020.0002.05DB] # HEBREW LETTER KAF
+FB24  ; [.1866.0020.0005.FB24] # HEBREW LETTER WIDE KAF; QQK
+05DA  ; [.1866.0020.0019.05DA] # HEBREW LETTER FINAL KAF; QQK
+FB3B  ; [.1866.0020.0002.05DB][.0000.0092.0002.05BC] # HEBREW LETTER KAF WITH DAGESH; QQCM
+FB3A  ; [.1866.0020.0019.FB3A][.0000.0092.0002.FB3A] # HEBREW LETTER FINAL KAF WITH DAGESH; QQKN
+FB4D  ; [.1866.0020.0002.05DB][.0000.0095.0002.05BF] # HEBREW LETTER KAF WITH RAFE; QQCM
+05DC  ; [.1867.0020.0002.05DC] # HEBREW LETTER LAMED
+FB25  ; [.1867.0020.0005.FB25] # HEBREW LETTER WIDE LAMED; QQK
+FB3C  ; [.1867.0020.0002.05DC][.0000.0092.0002.05BC] # HEBREW LETTER LAMED WITH DAGESH; QQCM
+05DE  ; [.1868.0020.0002.05DE] # HEBREW LETTER MEM
+FB26  ; [.1868.0020.0005.FB26] # HEBREW LETTER WIDE FINAL MEM; QQK
+05DD  ; [.1868.0020.0019.05DD] # HEBREW LETTER FINAL MEM; QQK
+FB3E  ; [.1868.0020.0002.05DE][.0000.0092.0002.05BC] # HEBREW LETTER MEM WITH DAGESH; QQCM
+05E0  ; [.1869.0020.0002.05E0] # HEBREW LETTER NUN
+05DF  ; [.1869.0020.0019.05DF] # HEBREW LETTER FINAL NUN; QQK
+FB40  ; [.1869.0020.0002.05E0][.0000.0092.0002.05BC] # HEBREW LETTER NUN WITH DAGESH; QQCM
+05E1  ; [.186A.0020.0002.05E1] # HEBREW LETTER SAMEKH
+FB41  ; [.186A.0020.0002.05E1][.0000.0092.0002.05BC] # HEBREW LETTER SAMEKH WITH DAGESH; QQCM
+05E2  ; [.186B.0020.0002.05E2] # HEBREW LETTER AYIN
+FB20  ; [.186B.0020.0005.FB20] # HEBREW LETTER ALTERNATIVE AYIN; QQK
+05E4  ; [.186C.0020.0002.05E4] # HEBREW LETTER PE
+05E3  ; [.186C.0020.0019.05E3] # HEBREW LETTER FINAL PE; QQK
+FB44  ; [.186C.0020.0002.05E4][.0000.0092.0002.05BC] # HEBREW LETTER PE WITH DAGESH; QQCM
+FB43  ; [.186C.0020.0019.FB43][.0000.0092.0002.FB43] # HEBREW LETTER FINAL PE WITH DAGESH; QQKN
+FB4E  ; [.186C.0020.0002.05E4][.0000.0095.0002.05BF] # HEBREW LETTER PE WITH RAFE; QQCM
+05E6  ; [.186D.0020.0002.05E6] # HEBREW LETTER TSADI
+05E5  ; [.186D.0020.0019.05E5] # HEBREW LETTER FINAL TSADI; QQK
+FB46  ; [.186D.0020.0002.05E6][.0000.0092.0002.05BC] # HEBREW LETTER TSADI WITH DAGESH; QQCM
+05E7  ; [.186E.0020.0002.05E7] # HEBREW LETTER QOF
+FB47  ; [.186E.0020.0002.05E7][.0000.0092.0002.05BC] # HEBREW LETTER QOF WITH DAGESH; QQCM
+05E8  ; [.186F.0020.0002.05E8] # HEBREW LETTER RESH
+FB27  ; [.186F.0020.0005.FB27] # HEBREW LETTER WIDE RESH; QQK
+FB48  ; [.186F.0020.0002.05E8][.0000.0092.0002.05BC] # HEBREW LETTER RESH WITH DAGESH; QQCM
+05E9  ; [.1870.0020.0002.05E9] # HEBREW LETTER SHIN
+FB2B  ; [.1870.0020.0002.05E9][.0000.0090.0002.05C2] # HEBREW LETTER SHIN WITH SIN DOT; QQCM
+FB2A  ; [.1870.0020.0002.05E9][.0000.0091.0002.05C1] # HEBREW LETTER SHIN WITH SHIN DOT; QQCM
+FB49  ; [.1870.0020.0002.05E9][.0000.0092.0002.05BC] # HEBREW LETTER SHIN WITH DAGESH; QQCM
+FB2D  ; [.1870.0020.0002.05E9][.0000.0092.0002.05BC][.0000.0090.0002.05C2] # HEBREW LETTER SHIN WITH DAGESH AND SIN DOT; QQCM
+FB2C  ; [.1870.0020.0002.05E9][.0000.0092.0002.05BC][.0000.0091.0002.05C1] # HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT; QQCM
+05EA  ; [.1871.0020.0002.05EA] # HEBREW LETTER TAV
+FB28  ; [.1871.0020.0005.FB28] # HEBREW LETTER WIDE TAV; QQK
+FB4A  ; [.1871.0020.0002.05EA][.0000.0092.0002.05BC] # HEBREW LETTER TAV WITH DAGESH; QQCM
+10900 ; [.1872.0020.0002.10900] # PHOENICIAN LETTER ALF
+10901 ; [.1873.0020.0002.10901] # PHOENICIAN LETTER BET
+10902 ; [.1874.0020.0002.10902] # PHOENICIAN LETTER GAML
+10903 ; [.1875.0020.0002.10903] # PHOENICIAN LETTER DELT
+10904 ; [.1876.0020.0002.10904] # PHOENICIAN LETTER HE
+10905 ; [.1877.0020.0002.10905] # PHOENICIAN LETTER WAU
+10906 ; [.1878.0020.0002.10906] # PHOENICIAN LETTER ZAI
+10907 ; [.1879.0020.0002.10907] # PHOENICIAN LETTER HET
+10908 ; [.187A.0020.0002.10908] # PHOENICIAN LETTER TET
+10909 ; [.187B.0020.0002.10909] # PHOENICIAN LETTER YOD
+1090A ; [.187C.0020.0002.1090A] # PHOENICIAN LETTER KAF
+1090B ; [.187D.0020.0002.1090B] # PHOENICIAN LETTER LAMD
+1090C ; [.187E.0020.0002.1090C] # PHOENICIAN LETTER MEM
+1090D ; [.187F.0020.0002.1090D] # PHOENICIAN LETTER NUN
+1090E ; [.1880.0020.0002.1090E] # PHOENICIAN LETTER SEMK
+1090F ; [.1881.0020.0002.1090F] # PHOENICIAN LETTER AIN
+10910 ; [.1882.0020.0002.10910] # PHOENICIAN LETTER PE
+10911 ; [.1883.0020.0002.10911] # PHOENICIAN LETTER SADE
+10912 ; [.1884.0020.0002.10912] # PHOENICIAN LETTER QOF
+10913 ; [.1885.0020.0002.10913] # PHOENICIAN LETTER ROSH
+10914 ; [.1886.0020.0002.10914] # PHOENICIAN LETTER SHIN
+10915 ; [.1887.0020.0002.10915] # PHOENICIAN LETTER TAU
+0800  ; [.1888.0020.0002.0800] # SAMARITAN LETTER ALAF
+0801  ; [.1889.0020.0002.0801] # SAMARITAN LETTER BIT
+0802  ; [.188A.0020.0002.0802] # SAMARITAN LETTER GAMAN
+0803  ; [.188B.0020.0002.0803] # SAMARITAN LETTER DALAT
+0804  ; [.188C.0020.0002.0804] # SAMARITAN LETTER IY
+0805  ; [.188D.0020.0002.0805] # SAMARITAN LETTER BAA
+0806  ; [.188E.0020.0002.0806] # SAMARITAN LETTER ZEN
+0807  ; [.188F.0020.0002.0807] # SAMARITAN LETTER IT
+0808  ; [.1890.0020.0002.0808] # SAMARITAN LETTER TIT
+0809  ; [.1891.0020.0002.0809] # SAMARITAN LETTER YUT
+080A  ; [.1892.0020.0002.080A] # SAMARITAN LETTER KAAF
+080B  ; [.1893.0020.0002.080B] # SAMARITAN LETTER LABAT
+080C  ; [.1894.0020.0002.080C] # SAMARITAN LETTER MIM
+080D  ; [.1895.0020.0002.080D] # SAMARITAN LETTER NUN
+080E  ; [.1896.0020.0002.080E] # SAMARITAN LETTER SINGAAT
+080F  ; [.1897.0020.0002.080F] # SAMARITAN LETTER IN
+0810  ; [.1898.0020.0002.0810] # SAMARITAN LETTER FI
+0811  ; [.1899.0020.0002.0811] # SAMARITAN LETTER TSAADIY
+0812  ; [.189A.0020.0002.0812] # SAMARITAN LETTER QUF
+0813  ; [.189B.0020.0002.0813] # SAMARITAN LETTER RISH
+0814  ; [.189C.0020.0002.0814] # SAMARITAN LETTER SHAN
+0815  ; [.189D.0020.0002.0815] # SAMARITAN LETTER TAAF
+0816  ; [.189E.0020.0002.0816] # SAMARITAN MARK IN
+0817  ; [.189F.0020.0002.0817] # SAMARITAN MARK IN-ALAF
+081A  ; [.18A0.0020.0002.081A] # SAMARITAN MODIFIER LETTER EPENTHETIC YUT
+081B  ; [.18A1.0020.0002.081B] # SAMARITAN MARK EPENTHETIC YUT
+0621  ; [.18A2.0020.0002.0621] # ARABIC LETTER HAMZA
+0674  ; [.18A2.0020.0004.0674] # ARABIC LETTER HIGH HAMZA; QQK
+FE80  ; [.18A2.0020.001A.FE80] # ARABIC LETTER HAMZA ISOLATED FORM; QQK
+06FD  ; [.18A2.0020.0004.06FD][.0000.015A.0004.06FD] # ARABIC SIGN SINDHI AMPERSAND; QQKN
+0622  ; [.18A3.0020.0002.0622] # ARABIC LETTER ALEF WITH MADDA ABOVE
+0627 0653 ; [.18A3.0020.0002.0622] # ARABIC LETTER ALEF WITH MADDA ABOVE
+FE82  ; [.18A3.0020.0019.FE82] # ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM; QQK
+FE81  ; [.18A3.0020.001A.FE81] # ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM; QQK
+0623  ; [.18A4.0020.0002.0623] # ARABIC LETTER ALEF WITH HAMZA ABOVE
+0627 0654 ; [.18A4.0020.0002.0623] # ARABIC LETTER ALEF WITH HAMZA ABOVE
+FE84  ; [.18A4.0020.0019.FE84] # ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM; QQK
+FE83  ; [.18A4.0020.001A.FE83] # ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM; QQK
+0672  ; [.18A5.0020.0002.0672] # ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE
+0671  ; [.18A6.0020.0002.0671] # ARABIC LETTER ALEF WASLA
+FB51  ; [.18A6.0020.0019.FB51] # ARABIC LETTER ALEF WASLA FINAL FORM; QQK
+FB50  ; [.18A6.0020.001A.FB50] # ARABIC LETTER ALEF WASLA ISOLATED FORM; QQK
+0624  ; [.18A7.0020.0002.0624] # ARABIC LETTER WAW WITH HAMZA ABOVE
+0648 0654 ; [.18A7.0020.0002.0624] # ARABIC LETTER WAW WITH HAMZA ABOVE
+FE86  ; [.18A7.0020.0019.FE86] # ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM; QQK
+FE85  ; [.18A7.0020.001A.FE85] # ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM; QQK
+0625  ; [.18A8.0020.0002.0625] # ARABIC LETTER ALEF WITH HAMZA BELOW
+0627 0655 ; [.18A8.0020.0002.0625] # ARABIC LETTER ALEF WITH HAMZA BELOW
+FE88  ; [.18A8.0020.0019.FE88] # ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM; QQK
+FE87  ; [.18A8.0020.001A.FE87] # ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM; QQK
+0673  ; [.18A9.0020.0002.0673] # ARABIC LETTER ALEF WITH WAVY HAMZA BELOW
+0773  ; [.18AA.0020.0002.0773] # ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE
+0774  ; [.18AB.0020.0002.0774] # ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE
+0626  ; [.18AC.0020.0002.0626] # ARABIC LETTER YEH WITH HAMZA ABOVE
+064A 0654 ; [.18AC.0020.0002.0626] # ARABIC LETTER YEH WITH HAMZA ABOVE
+FE8B  ; [.18AC.0020.0017.FE8B] # ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM; QQK
+FE8C  ; [.18AC.0020.0018.FE8C] # ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM; QQK
+FE8A  ; [.18AC.0020.0019.FE8A] # ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM; QQK
+FE89  ; [.18AC.0020.001A.FE89] # ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM; QQK
+FBEB  ; [.18AC.0020.0019.FBEB][.18AD.0020.0019.FBEB] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM; QQKN
+FBEA  ; [.18AC.0020.001A.FBEA][.18AD.0020.001A.FBEA] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM; QQKN
+FC97  ; [.18AC.0020.0017.FC97][.18C2.0020.0017.FC97] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM; QQKN
+FC00  ; [.18AC.0020.001A.FC00][.18C2.0020.001A.FC00] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM; QQKN
+FC98  ; [.18AC.0020.0017.FC98][.18C8.0020.0017.FC98] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM; QQKN
+FC01  ; [.18AC.0020.001A.FC01][.18C8.0020.001A.FC01] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM; QQKN
+FC99  ; [.18AC.0020.0017.FC99][.18C9.0020.0017.FC99] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM; QQKN
+FC64  ; [.18AC.0020.0019.FC64][.18E1.0020.0019.FC64] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM; QQKN
+FC65  ; [.18AC.0020.0019.FC65][.18E2.0020.0019.FC65] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM; QQKN
+FC9A  ; [.18AC.0020.0017.FC9A][.1931.0020.0017.FC9A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM; QQKN
+FCDF  ; [.18AC.0020.0018.FCDF][.1931.0020.0018.FCDF] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM; QQKN
+FC66  ; [.18AC.0020.0019.FC66][.1931.0020.0019.FC66] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM; QQKN
+FC02  ; [.18AC.0020.001A.FC02][.1931.0020.001A.FC02] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM; QQKN
+FC67  ; [.18AC.0020.0019.FC67][.1934.0020.0019.FC67] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM; QQKN
+FC9B  ; [.18AC.0020.0017.FC9B][.193D.0020.0017.FC9B] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM; QQKN
+FCE0  ; [.18AC.0020.0018.FCE0][.193D.0020.0018.FCE0] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM; QQKN
+FBED  ; [.18AC.0020.0019.FBED][.1942.0020.0019.FBED] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM; QQKN
+FBEC  ; [.18AC.0020.001A.FBEC][.1942.0020.001A.FBEC] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM; QQKN
+FBEF  ; [.18AC.0020.0019.FBEF][.1943.0020.0019.FBEF] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM; QQKN
+FBEE  ; [.18AC.0020.001A.FBEE][.1943.0020.001A.FBEE] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM; QQKN
+FBF3  ; [.18AC.0020.0019.FBF3][.1946.0020.0019.FBF3] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM; QQKN
+FBF2  ; [.18AC.0020.001A.FBF2][.1946.0020.001A.FBF2] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM; QQKN
+FBF1  ; [.18AC.0020.0019.FBF1][.1947.0020.0019.FBF1] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM; QQKN
+FBF0  ; [.18AC.0020.001A.FBF0][.1947.0020.001A.FBF0] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM; QQKN
+FBF5  ; [.18AC.0020.0019.FBF5][.1948.0020.0019.FBF5] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM; QQKN
+FBF4  ; [.18AC.0020.001A.FBF4][.1948.0020.001A.FBF4] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM; QQKN
+FBFB  ; [.18AC.0020.0017.FBFB][.194F.0020.0017.FBFB] # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM; QQKN
+FBFA  ; [.18AC.0020.0019.FBFA][.194F.0020.0019.FBFA] # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM; QQKN
+FC68  ; [.18AC.0020.0019.FC68][.194F.0020.0019.FC68] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM; QQKN
+FBF9  ; [.18AC.0020.001A.FBF9][.194F.0020.001A.FBF9] # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC03  ; [.18AC.0020.001A.FC03][.194F.0020.001A.FC03] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC69  ; [.18AC.0020.0019.FC69][.1950.0020.0019.FC69] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM; QQKN
+FC04  ; [.18AC.0020.001A.FC04][.1950.0020.001A.FC04] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM; QQKN
+FBF8  ; [.18AC.0020.0017.FBF8][.1954.0020.0017.FBF8] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM; QQKN
+FBF7  ; [.18AC.0020.0019.FBF7][.1954.0020.0019.FBF7] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM; QQKN
+FBF6  ; [.18AC.0020.001A.FBF6][.1954.0020.001A.FBF6] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM; QQKN
+0627  ; [.18AD.0020.0002.0627] # ARABIC LETTER ALEF
+FE8E  ; [.18AD.0020.0019.FE8E] # ARABIC LETTER ALEF FINAL FORM; QQK
+FE8D  ; [.18AD.0020.001A.FE8D] # ARABIC LETTER ALEF ISOLATED FORM; QQK
+FD3C  ; [.18AD.0020.0019.FD3C][.0000.00A2.0019.FD3C] # ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM; QQKN
+FD3D  ; [.18AD.0020.001A.FD3D][.0000.00A2.001A.FD3D] # ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM; QQKN
+0675  ; [.18AD.0020.0004.0675][.18A2.0020.0004.0675] # ARABIC LETTER HIGH HAMZA ALEF; QQKN
+FDF3  ; [.18AD.0020.001A.FDF3][.1918.0020.001A.FDF3][.18AF.0020.001F.FDF3][.18E1.0020.001F.FDF3] # ARABIC LIGATURE AKBAR ISOLATED FORM; QQKN
+FDF2  ; [.18AD.0020.001A.FDF2][.192B.0020.001A.FDF2][.192B.0020.001F.FDF2][.193D.0020.001F.FDF2] # ARABIC LIGATURE ALLAH ISOLATED FORM; QQKN
+066E  ; [.18AE.0020.0002.066E] # ARABIC LETTER DOTLESS BEH
+0628  ; [.18AF.0020.0002.0628] # ARABIC LETTER BEH
+FE91  ; [.18AF.0020.0017.FE91] # ARABIC LETTER BEH INITIAL FORM; QQK
+FE92  ; [.18AF.0020.0018.FE92] # ARABIC LETTER BEH MEDIAL FORM; QQK
+FE90  ; [.18AF.0020.0019.FE90] # ARABIC LETTER BEH FINAL FORM; QQK
+FE8F  ; [.18AF.0020.001A.FE8F] # ARABIC LETTER BEH ISOLATED FORM; QQK
+FC9C  ; [.18AF.0020.0017.FC9C][.18C2.0020.0017.FC9C] # ARABIC LIGATURE BEH WITH JEEM INITIAL FORM; QQKN
+FC05  ; [.18AF.0020.001A.FC05][.18C2.0020.001A.FC05] # ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM; QQKN
+FC9D  ; [.18AF.0020.0017.FC9D][.18C8.0020.0017.FC9D] # ARABIC LIGATURE BEH WITH HAH INITIAL FORM; QQKN
+FC06  ; [.18AF.0020.001A.FC06][.18C8.0020.001A.FC06] # ARABIC LIGATURE BEH WITH HAH ISOLATED FORM; QQKN
+FDC2  ; [.18AF.0020.0019.FDC2][.18C8.0020.0019.FDC2][.1950.0020.001F.FDC2] # ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM; QQKN
+FC9E  ; [.18AF.0020.0017.FC9E][.18C9.0020.0017.FC9E] # ARABIC LIGATURE BEH WITH KHAH INITIAL FORM; QQKN
+FC07  ; [.18AF.0020.001A.FC07][.18C9.0020.001A.FC07] # ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM; QQKN
+FD9E  ; [.18AF.0020.0019.FD9E][.18C9.0020.0019.FD9E][.1950.0020.001F.FD9E] # ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM; QQKN
+FC6A  ; [.18AF.0020.0019.FC6A][.18E1.0020.0019.FC6A] # ARABIC LIGATURE BEH WITH REH FINAL FORM; QQKN
+FC6B  ; [.18AF.0020.0019.FC6B][.18E2.0020.0019.FC6B] # ARABIC LIGATURE BEH WITH ZAIN FINAL FORM; QQKN
+FC9F  ; [.18AF.0020.0017.FC9F][.1931.0020.0017.FC9F] # ARABIC LIGATURE BEH WITH MEEM INITIAL FORM; QQKN
+FCE1  ; [.18AF.0020.0018.FCE1][.1931.0020.0018.FCE1] # ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM; QQKN
+FC6C  ; [.18AF.0020.0019.FC6C][.1931.0020.0019.FC6C] # ARABIC LIGATURE BEH WITH MEEM FINAL FORM; QQKN
+FC08  ; [.18AF.0020.001A.FC08][.1931.0020.001A.FC08] # ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM; QQKN
+FC6D  ; [.18AF.0020.0019.FC6D][.1934.0020.0019.FC6D] # ARABIC LIGATURE BEH WITH NOON FINAL FORM; QQKN
+FCA0  ; [.18AF.0020.0017.FCA0][.193D.0020.0017.FCA0] # ARABIC LIGATURE BEH WITH HEH INITIAL FORM; QQKN
+FCE2  ; [.18AF.0020.0018.FCE2][.193D.0020.0018.FCE2] # ARABIC LIGATURE BEH WITH HEH MEDIAL FORM; QQKN
+FC6E  ; [.18AF.0020.0019.FC6E][.194F.0020.0019.FC6E] # ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM; QQKN
+FC09  ; [.18AF.0020.001A.FC09][.194F.0020.001A.FC09] # ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC6F  ; [.18AF.0020.0019.FC6F][.1950.0020.0019.FC6F] # ARABIC LIGATURE BEH WITH YEH FINAL FORM; QQKN
+FC0A  ; [.18AF.0020.001A.FC0A][.1950.0020.001A.FC0A] # ARABIC LIGATURE BEH WITH YEH ISOLATED FORM; QQKN
+067B  ; [.18B0.0020.0002.067B] # ARABIC LETTER BEEH
+FB54  ; [.18B0.0020.0017.FB54] # ARABIC LETTER BEEH INITIAL FORM; QQK
+FB55  ; [.18B0.0020.0018.FB55] # ARABIC LETTER BEEH MEDIAL FORM; QQK
+FB53  ; [.18B0.0020.0019.FB53] # ARABIC LETTER BEEH FINAL FORM; QQK
+FB52  ; [.18B0.0020.001A.FB52] # ARABIC LETTER BEEH ISOLATED FORM; QQK
+067E  ; [.18B1.0020.0002.067E] # ARABIC LETTER PEH
+FB58  ; [.18B1.0020.0017.FB58] # ARABIC LETTER PEH INITIAL FORM; QQK
+FB59  ; [.18B1.0020.0018.FB59] # ARABIC LETTER PEH MEDIAL FORM; QQK
+FB57  ; [.18B1.0020.0019.FB57] # ARABIC LETTER PEH FINAL FORM; QQK
+FB56  ; [.18B1.0020.001A.FB56] # ARABIC LETTER PEH ISOLATED FORM; QQK
+0680  ; [.18B2.0020.0002.0680] # ARABIC LETTER BEHEH
+FB5C  ; [.18B2.0020.0017.FB5C] # ARABIC LETTER BEHEH INITIAL FORM; QQK
+FB5D  ; [.18B2.0020.0018.FB5D] # ARABIC LETTER BEHEH MEDIAL FORM; QQK
+FB5B  ; [.18B2.0020.0019.FB5B] # ARABIC LETTER BEHEH FINAL FORM; QQK
+FB5A  ; [.18B2.0020.001A.FB5A] # ARABIC LETTER BEHEH ISOLATED FORM; QQK
+0750  ; [.18B3.0020.0002.0750] # ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW
+0751  ; [.18B4.0020.0002.0751] # ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE
+0752  ; [.18B5.0020.0002.0752] # ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW
+0753  ; [.18B6.0020.0002.0753] # ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE
+0754  ; [.18B7.0020.0002.0754] # ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE
+0755  ; [.18B8.0020.0002.0755] # ARABIC LETTER BEH WITH INVERTED SMALL V BELOW
+0756  ; [.18B9.0020.0002.0756] # ARABIC LETTER BEH WITH SMALL V
+0629  ; [.18BA.0020.0002.0629] # ARABIC LETTER TEH MARBUTA
+FE94  ; [.18BA.0020.0019.FE94] # ARABIC LETTER TEH MARBUTA FINAL FORM; QQK
+FE93  ; [.18BA.0020.001A.FE93] # ARABIC LETTER TEH MARBUTA ISOLATED FORM; QQK
+062A  ; [.18BB.0020.0002.062A] # ARABIC LETTER TEH
+FE97  ; [.18BB.0020.0017.FE97] # ARABIC LETTER TEH INITIAL FORM; QQK
+FE98  ; [.18BB.0020.0018.FE98] # ARABIC LETTER TEH MEDIAL FORM; QQK
+FE96  ; [.18BB.0020.0019.FE96] # ARABIC LETTER TEH FINAL FORM; QQK
+FE95  ; [.18BB.0020.001A.FE95] # ARABIC LETTER TEH ISOLATED FORM; QQK
+FCA1  ; [.18BB.0020.0017.FCA1][.18C2.0020.0017.FCA1] # ARABIC LIGATURE TEH WITH JEEM INITIAL FORM; QQKN
+FC0B  ; [.18BB.0020.001A.FC0B][.18C2.0020.001A.FC0B] # ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM; QQKN
+FD50  ; [.18BB.0020.0017.FD50][.18C2.0020.0017.FD50][.1931.0020.001F.FD50] # ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM; QQKN
+FDA0  ; [.18BB.0020.0019.FDA0][.18C2.0020.0019.FDA0][.194F.0020.001F.FDA0] # ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FD9F  ; [.18BB.0020.0019.FD9F][.18C2.0020.0019.FD9F][.1950.0020.001F.FD9F] # ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM; QQKN
+FCA2  ; [.18BB.0020.0017.FCA2][.18C8.0020.0017.FCA2] # ARABIC LIGATURE TEH WITH HAH INITIAL FORM; QQKN
+FC0C  ; [.18BB.0020.001A.FC0C][.18C8.0020.001A.FC0C] # ARABIC LIGATURE TEH WITH HAH ISOLATED FORM; QQKN
+FD52  ; [.18BB.0020.0017.FD52][.18C8.0020.0017.FD52][.18C2.0020.001F.FD52] # ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM; QQKN
+FD51  ; [.18BB.0020.0019.FD51][.18C8.0020.0019.FD51][.18C2.0020.001F.FD51] # ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM; QQKN
+FD53  ; [.18BB.0020.0017.FD53][.18C8.0020.0017.FD53][.1931.0020.001F.FD53] # ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM; QQKN
+FCA3  ; [.18BB.0020.0017.FCA3][.18C9.0020.0017.FCA3] # ARABIC LIGATURE TEH WITH KHAH INITIAL FORM; QQKN
+FC0D  ; [.18BB.0020.001A.FC0D][.18C9.0020.001A.FC0D] # ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM; QQKN
+FD54  ; [.18BB.0020.0017.FD54][.18C9.0020.0017.FD54][.1931.0020.001F.FD54] # ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM; QQKN
+FDA2  ; [.18BB.0020.0019.FDA2][.18C9.0020.0019.FDA2][.194F.0020.001F.FDA2] # ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM; QQKN
+FDA1  ; [.18BB.0020.0019.FDA1][.18C9.0020.0019.FDA1][.1950.0020.001F.FDA1] # ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM; QQKN
+FC70  ; [.18BB.0020.0019.FC70][.18E1.0020.0019.FC70] # ARABIC LIGATURE TEH WITH REH FINAL FORM; QQKN
+FC71  ; [.18BB.0020.0019.FC71][.18E2.0020.0019.FC71] # ARABIC LIGATURE TEH WITH ZAIN FINAL FORM; QQKN
+FCA4  ; [.18BB.0020.0017.FCA4][.1931.0020.0017.FCA4] # ARABIC LIGATURE TEH WITH MEEM INITIAL FORM; QQKN
+FCE3  ; [.18BB.0020.0018.FCE3][.1931.0020.0018.FCE3] # ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM; QQKN
+FC72  ; [.18BB.0020.0019.FC72][.1931.0020.0019.FC72] # ARABIC LIGATURE TEH WITH MEEM FINAL FORM; QQKN
+FC0E  ; [.18BB.0020.001A.FC0E][.1931.0020.001A.FC0E] # ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM; QQKN
+FD55  ; [.18BB.0020.0017.FD55][.1931.0020.0017.FD55][.18C2.0020.001F.FD55] # ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM; QQKN
+FD56  ; [.18BB.0020.0017.FD56][.1931.0020.0017.FD56][.18C8.0020.001F.FD56] # ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM; QQKN
+FD57  ; [.18BB.0020.0017.FD57][.1931.0020.0017.FD57][.18C9.0020.001F.FD57] # ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM; QQKN
+FDA4  ; [.18BB.0020.0019.FDA4][.1931.0020.0019.FDA4][.194F.0020.001F.FDA4] # ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FDA3  ; [.18BB.0020.0019.FDA3][.1931.0020.0019.FDA3][.1950.0020.001F.FDA3] # ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM; QQKN
+FC73  ; [.18BB.0020.0019.FC73][.1934.0020.0019.FC73] # ARABIC LIGATURE TEH WITH NOON FINAL FORM; QQKN
+FCA5  ; [.18BB.0020.0017.FCA5][.193D.0020.0017.FCA5] # ARABIC LIGATURE TEH WITH HEH INITIAL FORM; QQKN
+FCE4  ; [.18BB.0020.0018.FCE4][.193D.0020.0018.FCE4] # ARABIC LIGATURE TEH WITH HEH MEDIAL FORM; QQKN
+FC74  ; [.18BB.0020.0019.FC74][.194F.0020.0019.FC74] # ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM; QQKN
+FC0F  ; [.18BB.0020.001A.FC0F][.194F.0020.001A.FC0F] # ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC75  ; [.18BB.0020.0019.FC75][.1950.0020.0019.FC75] # ARABIC LIGATURE TEH WITH YEH FINAL FORM; QQKN
+FC10  ; [.18BB.0020.001A.FC10][.1950.0020.001A.FC10] # ARABIC LIGATURE TEH WITH YEH ISOLATED FORM; QQKN
+062B  ; [.18BC.0020.0002.062B] # ARABIC LETTER THEH
+FE9B  ; [.18BC.0020.0017.FE9B] # ARABIC LETTER THEH INITIAL FORM; QQK
+FE9C  ; [.18BC.0020.0018.FE9C] # ARABIC LETTER THEH MEDIAL FORM; QQK
+FE9A  ; [.18BC.0020.0019.FE9A] # ARABIC LETTER THEH FINAL FORM; QQK
+FE99  ; [.18BC.0020.001A.FE99] # ARABIC LETTER THEH ISOLATED FORM; QQK
+FC11  ; [.18BC.0020.001A.FC11][.18C2.0020.001A.FC11] # ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM; QQKN
+FC76  ; [.18BC.0020.0019.FC76][.18E1.0020.0019.FC76] # ARABIC LIGATURE THEH WITH REH FINAL FORM; QQKN
+FC77  ; [.18BC.0020.0019.FC77][.18E2.0020.0019.FC77] # ARABIC LIGATURE THEH WITH ZAIN FINAL FORM; QQKN
+FCA6  ; [.18BC.0020.0017.FCA6][.1931.0020.0017.FCA6] # ARABIC LIGATURE THEH WITH MEEM INITIAL FORM; QQKN
+FCE5  ; [.18BC.0020.0018.FCE5][.1931.0020.0018.FCE5] # ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM; QQKN
+FC78  ; [.18BC.0020.0019.FC78][.1931.0020.0019.FC78] # ARABIC LIGATURE THEH WITH MEEM FINAL FORM; QQKN
+FC12  ; [.18BC.0020.001A.FC12][.1931.0020.001A.FC12] # ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM; QQKN
+FC79  ; [.18BC.0020.0019.FC79][.1934.0020.0019.FC79] # ARABIC LIGATURE THEH WITH NOON FINAL FORM; QQKN
+FCE6  ; [.18BC.0020.0018.FCE6][.193D.0020.0018.FCE6] # ARABIC LIGATURE THEH WITH HEH MEDIAL FORM; QQKN
+FC7A  ; [.18BC.0020.0019.FC7A][.194F.0020.0019.FC7A] # ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM; QQKN
+FC13  ; [.18BC.0020.001A.FC13][.194F.0020.001A.FC13] # ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC7B  ; [.18BC.0020.0019.FC7B][.1950.0020.0019.FC7B] # ARABIC LIGATURE THEH WITH YEH FINAL FORM; QQKN
+FC14  ; [.18BC.0020.001A.FC14][.1950.0020.001A.FC14] # ARABIC LIGATURE THEH WITH YEH ISOLATED FORM; QQKN
+0679  ; [.18BD.0020.0002.0679] # ARABIC LETTER TTEH
+FB68  ; [.18BD.0020.0017.FB68] # ARABIC LETTER TTEH INITIAL FORM; QQK
+FB69  ; [.18BD.0020.0018.FB69] # ARABIC LETTER TTEH MEDIAL FORM; QQK
+FB67  ; [.18BD.0020.0019.FB67] # ARABIC LETTER TTEH FINAL FORM; QQK
+FB66  ; [.18BD.0020.001A.FB66] # ARABIC LETTER TTEH ISOLATED FORM; QQK
+067A  ; [.18BE.0020.0002.067A] # ARABIC LETTER TTEHEH
+FB60  ; [.18BE.0020.0017.FB60] # ARABIC LETTER TTEHEH INITIAL FORM; QQK
+FB61  ; [.18BE.0020.0018.FB61] # ARABIC LETTER TTEHEH MEDIAL FORM; QQK
+FB5F  ; [.18BE.0020.0019.FB5F] # ARABIC LETTER TTEHEH FINAL FORM; QQK
+FB5E  ; [.18BE.0020.001A.FB5E] # ARABIC LETTER TTEHEH ISOLATED FORM; QQK
+067C  ; [.18BF.0020.0002.067C] # ARABIC LETTER TEH WITH RING
+067D  ; [.18C0.0020.0002.067D] # ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS
+067F  ; [.18C1.0020.0002.067F] # ARABIC LETTER TEHEH
+FB64  ; [.18C1.0020.0017.FB64] # ARABIC LETTER TEHEH INITIAL FORM; QQK
+FB65  ; [.18C1.0020.0018.FB65] # ARABIC LETTER TEHEH MEDIAL FORM; QQK
+FB63  ; [.18C1.0020.0019.FB63] # ARABIC LETTER TEHEH FINAL FORM; QQK
+FB62  ; [.18C1.0020.001A.FB62] # ARABIC LETTER TEHEH ISOLATED FORM; QQK
+062C  ; [.18C2.0020.0002.062C] # ARABIC LETTER JEEM
+FE9F  ; [.18C2.0020.0017.FE9F] # ARABIC LETTER JEEM INITIAL FORM; QQK
+FEA0  ; [.18C2.0020.0018.FEA0] # ARABIC LETTER JEEM MEDIAL FORM; QQK
+FE9E  ; [.18C2.0020.0019.FE9E] # ARABIC LETTER JEEM FINAL FORM; QQK
+FE9D  ; [.18C2.0020.001A.FE9D] # ARABIC LETTER JEEM ISOLATED FORM; QQK
+FCA7  ; [.18C2.0020.0017.FCA7][.18C8.0020.0017.FCA7] # ARABIC LIGATURE JEEM WITH HAH INITIAL FORM; QQKN
+FC15  ; [.18C2.0020.001A.FC15][.18C8.0020.001A.FC15] # ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM; QQKN
+FDA6  ; [.18C2.0020.0019.FDA6][.18C8.0020.0019.FDA6][.194F.0020.001F.FDA6] # ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM; QQKN
+FDBE  ; [.18C2.0020.0019.FDBE][.18C8.0020.0019.FDBE][.1950.0020.001F.FDBE] # ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM; QQKN
+FDFB  ; [.18C2.0020.001A.FDFB][.192B.0020.001A.FDFB][*020A.0020.001F.FDFB][.18C2.0020.001F.FDFB][.192B.0020.001F.FDFB][.18AD.0020.001F.FDFB][.192B.0020.001F.FDFB][.193D.0020.001F.FDFB] # ARABIC LIGATURE JALLAJALALOUHOU; QQKN
+FCA8  ; [.18C2.0020.0017.FCA8][.1931.0020.0017.FCA8] # ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM; QQKN
+FC16  ; [.18C2.0020.001A.FC16][.1931.0020.001A.FC16] # ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM; QQKN
+FD59  ; [.18C2.0020.0017.FD59][.1931.0020.0017.FD59][.18C8.0020.001F.FD59] # ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM; QQKN
+FD58  ; [.18C2.0020.0019.FD58][.1931.0020.0019.FD58][.18C8.0020.001F.FD58] # ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM; QQKN
+FDA7  ; [.18C2.0020.0019.FDA7][.1931.0020.0019.FDA7][.194F.0020.001F.FDA7] # ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FDA5  ; [.18C2.0020.0019.FDA5][.1931.0020.0019.FDA5][.1950.0020.001F.FDA5] # ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM; QQKN
+FD1D  ; [.18C2.0020.0019.FD1D][.194F.0020.0019.FD1D] # ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FD01  ; [.18C2.0020.001A.FD01][.194F.0020.001A.FD01] # ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD1E  ; [.18C2.0020.0019.FD1E][.1950.0020.0019.FD1E] # ARABIC LIGATURE JEEM WITH YEH FINAL FORM; QQKN
+FD02  ; [.18C2.0020.001A.FD02][.1950.0020.001A.FD02] # ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM; QQKN
+0683  ; [.18C3.0020.0002.0683] # ARABIC LETTER NYEH
+FB78  ; [.18C3.0020.0017.FB78] # ARABIC LETTER NYEH INITIAL FORM; QQK
+FB79  ; [.18C3.0020.0018.FB79] # ARABIC LETTER NYEH MEDIAL FORM; QQK
+FB77  ; [.18C3.0020.0019.FB77] # ARABIC LETTER NYEH FINAL FORM; QQK
+FB76  ; [.18C3.0020.001A.FB76] # ARABIC LETTER NYEH ISOLATED FORM; QQK
+0684  ; [.18C4.0020.0002.0684] # ARABIC LETTER DYEH
+FB74  ; [.18C4.0020.0017.FB74] # ARABIC LETTER DYEH INITIAL FORM; QQK
+FB75  ; [.18C4.0020.0018.FB75] # ARABIC LETTER DYEH MEDIAL FORM; QQK
+FB73  ; [.18C4.0020.0019.FB73] # ARABIC LETTER DYEH FINAL FORM; QQK
+FB72  ; [.18C4.0020.001A.FB72] # ARABIC LETTER DYEH ISOLATED FORM; QQK
+0686  ; [.18C5.0020.0002.0686] # ARABIC LETTER TCHEH
+FB7C  ; [.18C5.0020.0017.FB7C] # ARABIC LETTER TCHEH INITIAL FORM; QQK
+FB7D  ; [.18C5.0020.0018.FB7D] # ARABIC LETTER TCHEH MEDIAL FORM; QQK
+FB7B  ; [.18C5.0020.0019.FB7B] # ARABIC LETTER TCHEH FINAL FORM; QQK
+FB7A  ; [.18C5.0020.001A.FB7A] # ARABIC LETTER TCHEH ISOLATED FORM; QQK
+06BF  ; [.18C6.0020.0002.06BF] # ARABIC LETTER TCHEH WITH DOT ABOVE
+0687  ; [.18C7.0020.0002.0687] # ARABIC LETTER TCHEHEH
+FB80  ; [.18C7.0020.0017.FB80] # ARABIC LETTER TCHEHEH INITIAL FORM; QQK
+FB81  ; [.18C7.0020.0018.FB81] # ARABIC LETTER TCHEHEH MEDIAL FORM; QQK
+FB7F  ; [.18C7.0020.0019.FB7F] # ARABIC LETTER TCHEHEH FINAL FORM; QQK
+FB7E  ; [.18C7.0020.001A.FB7E] # ARABIC LETTER TCHEHEH ISOLATED FORM; QQK
+062D  ; [.18C8.0020.0002.062D] # ARABIC LETTER HAH
+FEA3  ; [.18C8.0020.0017.FEA3] # ARABIC LETTER HAH INITIAL FORM; QQK
+FEA4  ; [.18C8.0020.0018.FEA4] # ARABIC LETTER HAH MEDIAL FORM; QQK
+FEA2  ; [.18C8.0020.0019.FEA2] # ARABIC LETTER HAH FINAL FORM; QQK
+FEA1  ; [.18C8.0020.001A.FEA1] # ARABIC LETTER HAH ISOLATED FORM; QQK
+FCA9  ; [.18C8.0020.0017.FCA9][.18C2.0020.0017.FCA9] # ARABIC LIGATURE HAH WITH JEEM INITIAL FORM; QQKN
+FC17  ; [.18C8.0020.001A.FC17][.18C2.0020.001A.FC17] # ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM; QQKN
+FDBF  ; [.18C8.0020.0019.FDBF][.18C2.0020.0019.FDBF][.1950.0020.001F.FDBF] # ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM; QQKN
+FCAA  ; [.18C8.0020.0017.FCAA][.1931.0020.0017.FCAA] # ARABIC LIGATURE HAH WITH MEEM INITIAL FORM; QQKN
+FC18  ; [.18C8.0020.001A.FC18][.1931.0020.001A.FC18] # ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM; QQKN
+FD5B  ; [.18C8.0020.0019.FD5B][.1931.0020.0019.FD5B][.194F.0020.001F.FD5B] # ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FD5A  ; [.18C8.0020.0019.FD5A][.1931.0020.0019.FD5A][.1950.0020.001F.FD5A] # ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM; QQKN
+FD1B  ; [.18C8.0020.0019.FD1B][.194F.0020.0019.FD1B] # ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM; QQKN
+FCFF  ; [.18C8.0020.001A.FCFF][.194F.0020.001A.FCFF] # ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD1C  ; [.18C8.0020.0019.FD1C][.1950.0020.0019.FD1C] # ARABIC LIGATURE HAH WITH YEH FINAL FORM; QQKN
+FD00  ; [.18C8.0020.001A.FD00][.1950.0020.001A.FD00] # ARABIC LIGATURE HAH WITH YEH ISOLATED FORM; QQKN
+062E  ; [.18C9.0020.0002.062E] # ARABIC LETTER KHAH
+FEA7  ; [.18C9.0020.0017.FEA7] # ARABIC LETTER KHAH INITIAL FORM; QQK
+FEA8  ; [.18C9.0020.0018.FEA8] # ARABIC LETTER KHAH MEDIAL FORM; QQK
+FEA6  ; [.18C9.0020.0019.FEA6] # ARABIC LETTER KHAH FINAL FORM; QQK
+FEA5  ; [.18C9.0020.001A.FEA5] # ARABIC LETTER KHAH ISOLATED FORM; QQK
+FCAB  ; [.18C9.0020.0017.FCAB][.18C2.0020.0017.FCAB] # ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM; QQKN
+FC19  ; [.18C9.0020.001A.FC19][.18C2.0020.001A.FC19] # ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM; QQKN
+FC1A  ; [.18C9.0020.001A.FC1A][.18C8.0020.001A.FC1A] # ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM; QQKN
+FCAC  ; [.18C9.0020.0017.FCAC][.1931.0020.0017.FCAC] # ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM; QQKN
+FC1B  ; [.18C9.0020.001A.FC1B][.1931.0020.001A.FC1B] # ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM; QQKN
+FD1F  ; [.18C9.0020.0019.FD1F][.194F.0020.0019.FD1F] # ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM; QQKN
+FD03  ; [.18C9.0020.001A.FD03][.194F.0020.001A.FD03] # ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD20  ; [.18C9.0020.0019.FD20][.1950.0020.0019.FD20] # ARABIC LIGATURE KHAH WITH YEH FINAL FORM; QQKN
+FD04  ; [.18C9.0020.001A.FD04][.1950.0020.001A.FD04] # ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM; QQKN
+0681  ; [.18CA.0020.0002.0681] # ARABIC LETTER HAH WITH HAMZA ABOVE
+0682  ; [.18CB.0020.0002.0682] # ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE
+0685  ; [.18CC.0020.0002.0685] # ARABIC LETTER HAH WITH THREE DOTS ABOVE
+0757  ; [.18CD.0020.0002.0757] # ARABIC LETTER HAH WITH TWO DOTS ABOVE
+0758  ; [.18CE.0020.0002.0758] # ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW
+076E  ; [.18CF.0020.0002.076E] # ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW
+076F  ; [.18D0.0020.0002.076F] # ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS
+0772  ; [.18D1.0020.0002.0772] # ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE
+077C  ; [.18D2.0020.0002.077C] # ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW
+062F  ; [.18D3.0020.0002.062F] # ARABIC LETTER DAL
+FEAA  ; [.18D3.0020.0019.FEAA] # ARABIC LETTER DAL FINAL FORM; QQK
+FEA9  ; [.18D3.0020.001A.FEA9] # ARABIC LETTER DAL ISOLATED FORM; QQK
+0630  ; [.18D4.0020.0002.0630] # ARABIC LETTER THAL
+FEAC  ; [.18D4.0020.0019.FEAC] # ARABIC LETTER THAL FINAL FORM; QQK
+FEAB  ; [.18D4.0020.001A.FEAB] # ARABIC LETTER THAL ISOLATED FORM; QQK
+FC5B  ; [.18D4.0020.001A.FC5B][.0000.00BC.001A.FC5B] # ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM; QQKN
+0688  ; [.18D5.0020.0002.0688] # ARABIC LETTER DDAL
+FB89  ; [.18D5.0020.0019.FB89] # ARABIC LETTER DDAL FINAL FORM; QQK
+FB88  ; [.18D5.0020.001A.FB88] # ARABIC LETTER DDAL ISOLATED FORM; QQK
+0689  ; [.18D6.0020.0002.0689] # ARABIC LETTER DAL WITH RING
+068A  ; [.18D7.0020.0002.068A] # ARABIC LETTER DAL WITH DOT BELOW
+068B  ; [.18D8.0020.0002.068B] # ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH
+068C  ; [.18D9.0020.0002.068C] # ARABIC LETTER DAHAL
+FB85  ; [.18D9.0020.0019.FB85] # ARABIC LETTER DAHAL FINAL FORM; QQK
+FB84  ; [.18D9.0020.001A.FB84] # ARABIC LETTER DAHAL ISOLATED FORM; QQK
+068D  ; [.18DA.0020.0002.068D] # ARABIC LETTER DDAHAL
+FB83  ; [.18DA.0020.0019.FB83] # ARABIC LETTER DDAHAL FINAL FORM; QQK
+FB82  ; [.18DA.0020.001A.FB82] # ARABIC LETTER DDAHAL ISOLATED FORM; QQK
+068E  ; [.18DB.0020.0002.068E] # ARABIC LETTER DUL
+FB87  ; [.18DB.0020.0019.FB87] # ARABIC LETTER DUL FINAL FORM; QQK
+FB86  ; [.18DB.0020.001A.FB86] # ARABIC LETTER DUL ISOLATED FORM; QQK
+068F  ; [.18DC.0020.0002.068F] # ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS
+0690  ; [.18DD.0020.0002.0690] # ARABIC LETTER DAL WITH FOUR DOTS ABOVE
+06EE  ; [.18DE.0020.0002.06EE] # ARABIC LETTER DAL WITH INVERTED V
+0759  ; [.18DF.0020.0002.0759] # ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH
+075A  ; [.18E0.0020.0002.075A] # ARABIC LETTER DAL WITH INVERTED SMALL V BELOW
+0631  ; [.18E1.0020.0002.0631] # ARABIC LETTER REH
+FEAE  ; [.18E1.0020.0019.FEAE] # ARABIC LETTER REH FINAL FORM; QQK
+FEAD  ; [.18E1.0020.001A.FEAD] # ARABIC LETTER REH ISOLATED FORM; QQK
+FC5C  ; [.18E1.0020.001A.FC5C][.0000.00BC.001A.FC5C] # ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM; QQKN
+FDF6  ; [.18E1.0020.001A.FDF6][.18F1.0020.001A.FDF6][.1943.0020.001F.FDF6][.192B.0020.001F.FDF6] # ARABIC LIGATURE RASOUL ISOLATED FORM; QQKN
+FDFC  ; [.18E1.0020.001A.FDFC][.1951.0020.001A.FDFC][.18AD.0020.001F.FDFC][.192B.0020.001F.FDFC] # RIAL SIGN; QQKN
+0632  ; [.18E2.0020.0002.0632] # ARABIC LETTER ZAIN
+FEB0  ; [.18E2.0020.0019.FEB0] # ARABIC LETTER ZAIN FINAL FORM; QQK
+FEAF  ; [.18E2.0020.001A.FEAF] # ARABIC LETTER ZAIN ISOLATED FORM; QQK
+0691  ; [.18E3.0020.0002.0691] # ARABIC LETTER RREH
+FB8D  ; [.18E3.0020.0019.FB8D] # ARABIC LETTER RREH FINAL FORM; QQK
+FB8C  ; [.18E3.0020.001A.FB8C] # ARABIC LETTER RREH ISOLATED FORM; QQK
+0692  ; [.18E4.0020.0002.0692] # ARABIC LETTER REH WITH SMALL V
+0693  ; [.18E5.0020.0002.0693] # ARABIC LETTER REH WITH RING
+0694  ; [.18E6.0020.0002.0694] # ARABIC LETTER REH WITH DOT BELOW
+0695  ; [.18E7.0020.0002.0695] # ARABIC LETTER REH WITH SMALL V BELOW
+0696  ; [.18E8.0020.0002.0696] # ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE
+0697  ; [.18E9.0020.0002.0697] # ARABIC LETTER REH WITH TWO DOTS ABOVE
+0698  ; [.18EA.0020.0002.0698] # ARABIC LETTER JEH
+FB8B  ; [.18EA.0020.0019.FB8B] # ARABIC LETTER JEH FINAL FORM; QQK
+FB8A  ; [.18EA.0020.001A.FB8A] # ARABIC LETTER JEH ISOLATED FORM; QQK
+0699  ; [.18EB.0020.0002.0699] # ARABIC LETTER REH WITH FOUR DOTS ABOVE
+06EF  ; [.18EC.0020.0002.06EF] # ARABIC LETTER REH WITH INVERTED V
+075B  ; [.18ED.0020.0002.075B] # ARABIC LETTER REH WITH STROKE
+076B  ; [.18EE.0020.0002.076B] # ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE
+076C  ; [.18EF.0020.0002.076C] # ARABIC LETTER REH WITH HAMZA ABOVE
+0771  ; [.18F0.0020.0002.0771] # ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS
+0633  ; [.18F1.0020.0002.0633] # ARABIC LETTER SEEN
+FEB3  ; [.18F1.0020.0017.FEB3] # ARABIC LETTER SEEN INITIAL FORM; QQK
+FEB4  ; [.18F1.0020.0018.FEB4] # ARABIC LETTER SEEN MEDIAL FORM; QQK
+FEB2  ; [.18F1.0020.0019.FEB2] # ARABIC LETTER SEEN FINAL FORM; QQK
+FEB1  ; [.18F1.0020.001A.FEB1] # ARABIC LETTER SEEN ISOLATED FORM; QQK
+FCAD  ; [.18F1.0020.0017.FCAD][.18C2.0020.0017.FCAD] # ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM; QQKN
+FD34  ; [.18F1.0020.0018.FD34][.18C2.0020.0018.FD34] # ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM; QQKN
+FC1C  ; [.18F1.0020.001A.FC1C][.18C2.0020.001A.FC1C] # ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM; QQKN
+FD5D  ; [.18F1.0020.0017.FD5D][.18C2.0020.0017.FD5D][.18C8.0020.001F.FD5D] # ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM; QQKN
+FD5E  ; [.18F1.0020.0019.FD5E][.18C2.0020.0019.FD5E][.194F.0020.001F.FD5E] # ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FCAE  ; [.18F1.0020.0017.FCAE][.18C8.0020.0017.FCAE] # ARABIC LIGATURE SEEN WITH HAH INITIAL FORM; QQKN
+FD35  ; [.18F1.0020.0018.FD35][.18C8.0020.0018.FD35] # ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM; QQKN
+FC1D  ; [.18F1.0020.001A.FC1D][.18C8.0020.001A.FC1D] # ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM; QQKN
+FD5C  ; [.18F1.0020.0017.FD5C][.18C8.0020.0017.FD5C][.18C2.0020.001F.FD5C] # ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM; QQKN
+FCAF  ; [.18F1.0020.0017.FCAF][.18C9.0020.0017.FCAF] # ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM; QQKN
+FD36  ; [.18F1.0020.0018.FD36][.18C9.0020.0018.FD36] # ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM; QQKN
+FC1E  ; [.18F1.0020.001A.FC1E][.18C9.0020.001A.FC1E] # ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM; QQKN
+FDA8  ; [.18F1.0020.0019.FDA8][.18C9.0020.0019.FDA8][.194F.0020.001F.FDA8] # ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM; QQKN
+FDC6  ; [.18F1.0020.0019.FDC6][.18C9.0020.0019.FDC6][.1950.0020.001F.FDC6] # ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM; QQKN
+FD2A  ; [.18F1.0020.0019.FD2A][.18E1.0020.0019.FD2A] # ARABIC LIGATURE SEEN WITH REH FINAL FORM; QQKN
+FD0E  ; [.18F1.0020.001A.FD0E][.18E1.0020.001A.FD0E] # ARABIC LIGATURE SEEN WITH REH ISOLATED FORM; QQKN
+FCB0  ; [.18F1.0020.0017.FCB0][.1931.0020.0017.FCB0] # ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM; QQKN
+FCE7  ; [.18F1.0020.0018.FCE7][.1931.0020.0018.FCE7] # ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM; QQKN
+FC1F  ; [.18F1.0020.001A.FC1F][.1931.0020.001A.FC1F] # ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM; QQKN
+FD61  ; [.18F1.0020.0017.FD61][.1931.0020.0017.FD61][.18C2.0020.001F.FD61] # ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM; QQKN
+FD60  ; [.18F1.0020.0017.FD60][.1931.0020.0017.FD60][.18C8.0020.001F.FD60] # ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM; QQKN
+FD5F  ; [.18F1.0020.0019.FD5F][.1931.0020.0019.FD5F][.18C8.0020.001F.FD5F] # ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM; QQKN
+FD63  ; [.18F1.0020.0017.FD63][.1931.0020.0017.FD63][.1931.0020.001F.FD63] # ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM; QQKN
+FD62  ; [.18F1.0020.0019.FD62][.1931.0020.0019.FD62][.1931.0020.001F.FD62] # ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM; QQKN
+FD31  ; [.18F1.0020.0017.FD31][.193D.0020.0017.FD31] # ARABIC LIGATURE SEEN WITH HEH INITIAL FORM; QQKN
+FCE8  ; [.18F1.0020.0018.FCE8][.193D.0020.0018.FCE8] # ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM; QQKN
+FD17  ; [.18F1.0020.0019.FD17][.194F.0020.0019.FD17] # ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM; QQKN
+FCFB  ; [.18F1.0020.001A.FCFB][.194F.0020.001A.FCFB] # ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD18  ; [.18F1.0020.0019.FD18][.1950.0020.0019.FD18] # ARABIC LIGATURE SEEN WITH YEH FINAL FORM; QQKN
+FCFC  ; [.18F1.0020.001A.FCFC][.1950.0020.001A.FCFC] # ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM; QQKN
+0634  ; [.18F2.0020.0002.0634] # ARABIC LETTER SHEEN
+FEB7  ; [.18F2.0020.0017.FEB7] # ARABIC LETTER SHEEN INITIAL FORM; QQK
+FEB8  ; [.18F2.0020.0018.FEB8] # ARABIC LETTER SHEEN MEDIAL FORM; QQK
+FEB6  ; [.18F2.0020.0019.FEB6] # ARABIC LETTER SHEEN FINAL FORM; QQK
+FEB5  ; [.18F2.0020.001A.FEB5] # ARABIC LETTER SHEEN ISOLATED FORM; QQK
+FD2D  ; [.18F2.0020.0017.FD2D][.18C2.0020.0017.FD2D] # ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM; QQKN
+FD37  ; [.18F2.0020.0018.FD37][.18C2.0020.0018.FD37] # ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM; QQKN
+FD25  ; [.18F2.0020.0019.FD25][.18C2.0020.0019.FD25] # ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM; QQKN
+FD09  ; [.18F2.0020.001A.FD09][.18C2.0020.001A.FD09] # ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM; QQKN
+FD69  ; [.18F2.0020.0019.FD69][.18C2.0020.0019.FD69][.1950.0020.001F.FD69] # ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM; QQKN
+FD2E  ; [.18F2.0020.0017.FD2E][.18C8.0020.0017.FD2E] # ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM; QQKN
+FD38  ; [.18F2.0020.0018.FD38][.18C8.0020.0018.FD38] # ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM; QQKN
+FD26  ; [.18F2.0020.0019.FD26][.18C8.0020.0019.FD26] # ARABIC LIGATURE SHEEN WITH HAH FINAL FORM; QQKN
+FD0A  ; [.18F2.0020.001A.FD0A][.18C8.0020.001A.FD0A] # ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM; QQKN
+FD68  ; [.18F2.0020.0017.FD68][.18C8.0020.0017.FD68][.1931.0020.001F.FD68] # ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM; QQKN
+FD67  ; [.18F2.0020.0019.FD67][.18C8.0020.0019.FD67][.1931.0020.001F.FD67] # ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM; QQKN
+FDAA  ; [.18F2.0020.0019.FDAA][.18C8.0020.0019.FDAA][.1950.0020.001F.FDAA] # ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM; QQKN
+FD2F  ; [.18F2.0020.0017.FD2F][.18C9.0020.0017.FD2F] # ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM; QQKN
+FD39  ; [.18F2.0020.0018.FD39][.18C9.0020.0018.FD39] # ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM; QQKN
+FD27  ; [.18F2.0020.0019.FD27][.18C9.0020.0019.FD27] # ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM; QQKN
+FD0B  ; [.18F2.0020.001A.FD0B][.18C9.0020.001A.FD0B] # ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM; QQKN
+FD29  ; [.18F2.0020.0019.FD29][.18E1.0020.0019.FD29] # ARABIC LIGATURE SHEEN WITH REH FINAL FORM; QQKN
+FD0D  ; [.18F2.0020.001A.FD0D][.18E1.0020.001A.FD0D] # ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM; QQKN
+FD30  ; [.18F2.0020.0017.FD30][.1931.0020.0017.FD30] # ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM; QQKN
+FCE9  ; [.18F2.0020.0018.FCE9][.1931.0020.0018.FCE9] # ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM; QQKN
+FD28  ; [.18F2.0020.0019.FD28][.1931.0020.0019.FD28] # ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM; QQKN
+FD0C  ; [.18F2.0020.001A.FD0C][.1931.0020.001A.FD0C] # ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM; QQKN
+FD6B  ; [.18F2.0020.0017.FD6B][.1931.0020.0017.FD6B][.18C9.0020.001F.FD6B] # ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM; QQKN
+FD6A  ; [.18F2.0020.0019.FD6A][.1931.0020.0019.FD6A][.18C9.0020.001F.FD6A] # ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM; QQKN
+FD6D  ; [.18F2.0020.0017.FD6D][.1931.0020.0017.FD6D][.1931.0020.001F.FD6D] # ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM; QQKN
+FD6C  ; [.18F2.0020.0019.FD6C][.1931.0020.0019.FD6C][.1931.0020.001F.FD6C] # ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM; QQKN
+FD32  ; [.18F2.0020.0017.FD32][.193D.0020.0017.FD32] # ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM; QQKN
+FCEA  ; [.18F2.0020.0018.FCEA][.193D.0020.0018.FCEA] # ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM; QQKN
+FD19  ; [.18F2.0020.0019.FD19][.194F.0020.0019.FD19] # ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM; QQKN
+FCFD  ; [.18F2.0020.001A.FCFD][.194F.0020.001A.FCFD] # ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD1A  ; [.18F2.0020.0019.FD1A][.1950.0020.0019.FD1A] # ARABIC LIGATURE SHEEN WITH YEH FINAL FORM; QQKN
+FCFE  ; [.18F2.0020.001A.FCFE][.1950.0020.001A.FCFE] # ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM; QQKN
+069A  ; [.18F3.0020.0002.069A] # ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE
+069B  ; [.18F4.0020.0002.069B] # ARABIC LETTER SEEN WITH THREE DOTS BELOW
+069C  ; [.18F5.0020.0002.069C] # ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE
+06FA  ; [.18F6.0020.0002.06FA] # ARABIC LETTER SHEEN WITH DOT BELOW
+075C  ; [.18F7.0020.0002.075C] # ARABIC LETTER SEEN WITH FOUR DOTS ABOVE
+076D  ; [.18F8.0020.0002.076D] # ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE
+0770  ; [.18F9.0020.0002.0770] # ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS
+077D  ; [.18FA.0020.0002.077D] # ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE
+077E  ; [.18FB.0020.0002.077E] # ARABIC LETTER SEEN WITH INVERTED V
+0635  ; [.18FC.0020.0002.0635] # ARABIC LETTER SAD
+FEBB  ; [.18FC.0020.0017.FEBB] # ARABIC LETTER SAD INITIAL FORM; QQK
+FEBC  ; [.18FC.0020.0018.FEBC] # ARABIC LETTER SAD MEDIAL FORM; QQK
+FEBA  ; [.18FC.0020.0019.FEBA] # ARABIC LETTER SAD FINAL FORM; QQK
+FEB9  ; [.18FC.0020.001A.FEB9] # ARABIC LETTER SAD ISOLATED FORM; QQK
+FCB1  ; [.18FC.0020.0017.FCB1][.18C8.0020.0017.FCB1] # ARABIC LIGATURE SAD WITH HAH INITIAL FORM; QQKN
+FC20  ; [.18FC.0020.001A.FC20][.18C8.0020.001A.FC20] # ARABIC LIGATURE SAD WITH HAH ISOLATED FORM; QQKN
+FD65  ; [.18FC.0020.0017.FD65][.18C8.0020.0017.FD65][.18C8.0020.001F.FD65] # ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM; QQKN
+FD64  ; [.18FC.0020.0019.FD64][.18C8.0020.0019.FD64][.18C8.0020.001F.FD64] # ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM; QQKN
+FDA9  ; [.18FC.0020.0019.FDA9][.18C8.0020.0019.FDA9][.1950.0020.001F.FDA9] # ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM; QQKN
+FCB2  ; [.18FC.0020.0017.FCB2][.18C9.0020.0017.FCB2] # ARABIC LIGATURE SAD WITH KHAH INITIAL FORM; QQKN
+FD2B  ; [.18FC.0020.0019.FD2B][.18E1.0020.0019.FD2B] # ARABIC LIGATURE SAD WITH REH FINAL FORM; QQKN
+FD0F  ; [.18FC.0020.001A.FD0F][.18E1.0020.001A.FD0F] # ARABIC LIGATURE SAD WITH REH ISOLATED FORM; QQKN
+FDF5  ; [.18FC.0020.001A.FDF5][.192B.0020.001A.FDF5][.1904.0020.001F.FDF5][.1931.0020.001F.FDF5] # ARABIC LIGATURE SALAM ISOLATED FORM; QQKN
+FDF9  ; [.18FC.0020.001A.FDF9][.192B.0020.001A.FDF9][.194F.0020.001F.FDF9] # ARABIC LIGATURE SALLA ISOLATED FORM; QQKN
+FDFA  ; [.18FC.0020.001A.FDFA][.192B.0020.001A.FDFA][.194F.0020.001F.FDFA][*020A.0020.001F.FDFA][.18AD.0020.001F.FDFA][.192B.0020.001F.FDFA][.192B.0020.001F.FDFA][.193D.0020.001F.FDFA][*020A.0020.001F.FDFA][.1904.0020.001F.FDFA][.192B.0020.001F.FDFA][.1950.0020.001F.FDFA][.193D.0020.001F.FDFA][*020A.0020.001F.FDFA][.1943.0020.001F.FDFA][.18F1.0020.001F.FDFA][.192B.0020.001F.FDFA][.1931.0020.001F.FDFA] # ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM; QQKN
+FDF0  ; [.18FC.0020.001A.FDF0][.192B.0020.001A.FDF0][.195C.0020.001F.FDF0] # ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM; QQKN
+FCB3  ; [.18FC.0020.0017.FCB3][.1931.0020.0017.FCB3] # ARABIC LIGATURE SAD WITH MEEM INITIAL FORM; QQKN
+FC21  ; [.18FC.0020.001A.FC21][.1931.0020.001A.FC21] # ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM; QQKN
+FDC5  ; [.18FC.0020.0017.FDC5][.1931.0020.0017.FDC5][.1931.0020.001F.FDC5] # ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM; QQKN
+FD66  ; [.18FC.0020.0019.FD66][.1931.0020.0019.FD66][.1931.0020.001F.FD66] # ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM; QQKN
+FD21  ; [.18FC.0020.0019.FD21][.194F.0020.0019.FD21] # ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM; QQKN
+FD05  ; [.18FC.0020.001A.FD05][.194F.0020.001A.FD05] # ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD22  ; [.18FC.0020.0019.FD22][.1950.0020.0019.FD22] # ARABIC LIGATURE SAD WITH YEH FINAL FORM; QQKN
+FD06  ; [.18FC.0020.001A.FD06][.1950.0020.001A.FD06] # ARABIC LIGATURE SAD WITH YEH ISOLATED FORM; QQKN
+0636  ; [.18FD.0020.0002.0636] # ARABIC LETTER DAD
+FEBF  ; [.18FD.0020.0017.FEBF] # ARABIC LETTER DAD INITIAL FORM; QQK
+FEC0  ; [.18FD.0020.0018.FEC0] # ARABIC LETTER DAD MEDIAL FORM; QQK
+FEBE  ; [.18FD.0020.0019.FEBE] # ARABIC LETTER DAD FINAL FORM; QQK
+FEBD  ; [.18FD.0020.001A.FEBD] # ARABIC LETTER DAD ISOLATED FORM; QQK
+FCB4  ; [.18FD.0020.0017.FCB4][.18C2.0020.0017.FCB4] # ARABIC LIGATURE DAD WITH JEEM INITIAL FORM; QQKN
+FC22  ; [.18FD.0020.001A.FC22][.18C2.0020.001A.FC22] # ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM; QQKN
+FCB5  ; [.18FD.0020.0017.FCB5][.18C8.0020.0017.FCB5] # ARABIC LIGATURE DAD WITH HAH INITIAL FORM; QQKN
+FC23  ; [.18FD.0020.001A.FC23][.18C8.0020.001A.FC23] # ARABIC LIGATURE DAD WITH HAH ISOLATED FORM; QQKN
+FD6E  ; [.18FD.0020.0019.FD6E][.18C8.0020.0019.FD6E][.194F.0020.001F.FD6E] # ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM; QQKN
+FDAB  ; [.18FD.0020.0019.FDAB][.18C8.0020.0019.FDAB][.1950.0020.001F.FDAB] # ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM; QQKN
+FCB6  ; [.18FD.0020.0017.FCB6][.18C9.0020.0017.FCB6] # ARABIC LIGATURE DAD WITH KHAH INITIAL FORM; QQKN
+FC24  ; [.18FD.0020.001A.FC24][.18C9.0020.001A.FC24] # ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM; QQKN
+FD70  ; [.18FD.0020.0017.FD70][.18C9.0020.0017.FD70][.1931.0020.001F.FD70] # ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM; QQKN
+FD6F  ; [.18FD.0020.0019.FD6F][.18C9.0020.0019.FD6F][.1931.0020.001F.FD6F] # ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM; QQKN
+FD2C  ; [.18FD.0020.0019.FD2C][.18E1.0020.0019.FD2C] # ARABIC LIGATURE DAD WITH REH FINAL FORM; QQKN
+FD10  ; [.18FD.0020.001A.FD10][.18E1.0020.001A.FD10] # ARABIC LIGATURE DAD WITH REH ISOLATED FORM; QQKN
+FCB7  ; [.18FD.0020.0017.FCB7][.1931.0020.0017.FCB7] # ARABIC LIGATURE DAD WITH MEEM INITIAL FORM; QQKN
+FC25  ; [.18FD.0020.001A.FC25][.1931.0020.001A.FC25] # ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM; QQKN
+FD23  ; [.18FD.0020.0019.FD23][.194F.0020.0019.FD23] # ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM; QQKN
+FD07  ; [.18FD.0020.001A.FD07][.194F.0020.001A.FD07] # ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD24  ; [.18FD.0020.0019.FD24][.1950.0020.0019.FD24] # ARABIC LIGATURE DAD WITH YEH FINAL FORM; QQKN
+FD08  ; [.18FD.0020.001A.FD08][.1950.0020.001A.FD08] # ARABIC LIGATURE DAD WITH YEH ISOLATED FORM; QQKN
+069D  ; [.18FE.0020.0002.069D] # ARABIC LETTER SAD WITH TWO DOTS BELOW
+069E  ; [.18FF.0020.0002.069E] # ARABIC LETTER SAD WITH THREE DOTS ABOVE
+06FB  ; [.1900.0020.0002.06FB] # ARABIC LETTER DAD WITH DOT BELOW
+0637  ; [.1901.0020.0002.0637] # ARABIC LETTER TAH
+FEC3  ; [.1901.0020.0017.FEC3] # ARABIC LETTER TAH INITIAL FORM; QQK
+FEC4  ; [.1901.0020.0018.FEC4] # ARABIC LETTER TAH MEDIAL FORM; QQK
+FEC2  ; [.1901.0020.0019.FEC2] # ARABIC LETTER TAH FINAL FORM; QQK
+FEC1  ; [.1901.0020.001A.FEC1] # ARABIC LETTER TAH ISOLATED FORM; QQK
+FCB8  ; [.1901.0020.0017.FCB8][.18C8.0020.0017.FCB8] # ARABIC LIGATURE TAH WITH HAH INITIAL FORM; QQKN
+FC26  ; [.1901.0020.001A.FC26][.18C8.0020.001A.FC26] # ARABIC LIGATURE TAH WITH HAH ISOLATED FORM; QQKN
+FD33  ; [.1901.0020.0017.FD33][.1931.0020.0017.FD33] # ARABIC LIGATURE TAH WITH MEEM INITIAL FORM; QQKN
+FD3A  ; [.1901.0020.0018.FD3A][.1931.0020.0018.FD3A] # ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM; QQKN
+FC27  ; [.1901.0020.001A.FC27][.1931.0020.001A.FC27] # ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM; QQKN
+FD72  ; [.1901.0020.0017.FD72][.1931.0020.0017.FD72][.18C8.0020.001F.FD72] # ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM; QQKN
+FD71  ; [.1901.0020.0019.FD71][.1931.0020.0019.FD71][.18C8.0020.001F.FD71] # ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM; QQKN
+FD73  ; [.1901.0020.0017.FD73][.1931.0020.0017.FD73][.1931.0020.001F.FD73] # ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM; QQKN
+FD74  ; [.1901.0020.0019.FD74][.1931.0020.0019.FD74][.1950.0020.001F.FD74] # ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM; QQKN
+FD11  ; [.1901.0020.0019.FD11][.194F.0020.0019.FD11] # ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM; QQKN
+FCF5  ; [.1901.0020.001A.FCF5][.194F.0020.001A.FCF5] # ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD12  ; [.1901.0020.0019.FD12][.1950.0020.0019.FD12] # ARABIC LIGATURE TAH WITH YEH FINAL FORM; QQKN
+FCF6  ; [.1901.0020.001A.FCF6][.1950.0020.001A.FCF6] # ARABIC LIGATURE TAH WITH YEH ISOLATED FORM; QQKN
+0638  ; [.1902.0020.0002.0638] # ARABIC LETTER ZAH
+FEC7  ; [.1902.0020.0017.FEC7] # ARABIC LETTER ZAH INITIAL FORM; QQK
+FEC8  ; [.1902.0020.0018.FEC8] # ARABIC LETTER ZAH MEDIAL FORM; QQK
+FEC6  ; [.1902.0020.0019.FEC6] # ARABIC LETTER ZAH FINAL FORM; QQK
+FEC5  ; [.1902.0020.001A.FEC5] # ARABIC LETTER ZAH ISOLATED FORM; QQK
+FCB9  ; [.1902.0020.0017.FCB9][.1931.0020.0017.FCB9] # ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM; QQKN
+FD3B  ; [.1902.0020.0018.FD3B][.1931.0020.0018.FD3B] # ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM; QQKN
+FC28  ; [.1902.0020.001A.FC28][.1931.0020.001A.FC28] # ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM; QQKN
+069F  ; [.1903.0020.0002.069F] # ARABIC LETTER TAH WITH THREE DOTS ABOVE
+0639  ; [.1904.0020.0002.0639] # ARABIC LETTER AIN
+FECB  ; [.1904.0020.0017.FECB] # ARABIC LETTER AIN INITIAL FORM; QQK
+FECC  ; [.1904.0020.0018.FECC] # ARABIC LETTER AIN MEDIAL FORM; QQK
+FECA  ; [.1904.0020.0019.FECA] # ARABIC LETTER AIN FINAL FORM; QQK
+FEC9  ; [.1904.0020.001A.FEC9] # ARABIC LETTER AIN ISOLATED FORM; QQK
+FCBA  ; [.1904.0020.0017.FCBA][.18C2.0020.0017.FCBA] # ARABIC LIGATURE AIN WITH JEEM INITIAL FORM; QQKN
+FC29  ; [.1904.0020.001A.FC29][.18C2.0020.001A.FC29] # ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM; QQKN
+FDC4  ; [.1904.0020.0017.FDC4][.18C2.0020.0017.FDC4][.1931.0020.001F.FDC4] # ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM; QQKN
+FD75  ; [.1904.0020.0019.FD75][.18C2.0020.0019.FD75][.1931.0020.001F.FD75] # ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM; QQKN
+FDF7  ; [.1904.0020.001A.FDF7][.192B.0020.001A.FDF7][.1950.0020.001F.FDF7][.193D.0020.001F.FDF7] # ARABIC LIGATURE ALAYHE ISOLATED FORM; QQKN
+FCBB  ; [.1904.0020.0017.FCBB][.1931.0020.0017.FCBB] # ARABIC LIGATURE AIN WITH MEEM INITIAL FORM; QQKN
+FC2A  ; [.1904.0020.001A.FC2A][.1931.0020.001A.FC2A] # ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM; QQKN
+FD77  ; [.1904.0020.0017.FD77][.1931.0020.0017.FD77][.1931.0020.001F.FD77] # ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM; QQKN
+FD76  ; [.1904.0020.0019.FD76][.1931.0020.0019.FD76][.1931.0020.001F.FD76] # ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM; QQKN
+FD78  ; [.1904.0020.0019.FD78][.1931.0020.0019.FD78][.194F.0020.001F.FD78] # ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FDB6  ; [.1904.0020.0019.FDB6][.1931.0020.0019.FDB6][.1950.0020.001F.FDB6] # ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM; QQKN
+FD13  ; [.1904.0020.0019.FD13][.194F.0020.0019.FD13] # ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM; QQKN
+FCF7  ; [.1904.0020.001A.FCF7][.194F.0020.001A.FCF7] # ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD14  ; [.1904.0020.0019.FD14][.1950.0020.0019.FD14] # ARABIC LIGATURE AIN WITH YEH FINAL FORM; QQKN
+FCF8  ; [.1904.0020.001A.FCF8][.1950.0020.001A.FCF8] # ARABIC LIGATURE AIN WITH YEH ISOLATED FORM; QQKN
+063A  ; [.1905.0020.0002.063A] # ARABIC LETTER GHAIN
+FECF  ; [.1905.0020.0017.FECF] # ARABIC LETTER GHAIN INITIAL FORM; QQK
+FED0  ; [.1905.0020.0018.FED0] # ARABIC LETTER GHAIN MEDIAL FORM; QQK
+FECE  ; [.1905.0020.0019.FECE] # ARABIC LETTER GHAIN FINAL FORM; QQK
+FECD  ; [.1905.0020.001A.FECD] # ARABIC LETTER GHAIN ISOLATED FORM; QQK
+FCBC  ; [.1905.0020.0017.FCBC][.18C2.0020.0017.FCBC] # ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM; QQKN
+FC2B  ; [.1905.0020.001A.FC2B][.18C2.0020.001A.FC2B] # ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM; QQKN
+FCBD  ; [.1905.0020.0017.FCBD][.1931.0020.0017.FCBD] # ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM; QQKN
+FC2C  ; [.1905.0020.001A.FC2C][.1931.0020.001A.FC2C] # ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM; QQKN
+FD79  ; [.1905.0020.0019.FD79][.1931.0020.0019.FD79][.1931.0020.001F.FD79] # ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM; QQKN
+FD7B  ; [.1905.0020.0019.FD7B][.1931.0020.0019.FD7B][.194F.0020.001F.FD7B] # ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FD7A  ; [.1905.0020.0019.FD7A][.1931.0020.0019.FD7A][.1950.0020.001F.FD7A] # ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM; QQKN
+FD15  ; [.1905.0020.0019.FD15][.194F.0020.0019.FD15] # ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM; QQKN
+FCF9  ; [.1905.0020.001A.FCF9][.194F.0020.001A.FCF9] # ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FD16  ; [.1905.0020.0019.FD16][.1950.0020.0019.FD16] # ARABIC LIGATURE GHAIN WITH YEH FINAL FORM; QQKN
+FCFA  ; [.1905.0020.001A.FCFA][.1950.0020.001A.FCFA] # ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM; QQKN
+06A0  ; [.1906.0020.0002.06A0] # ARABIC LETTER AIN WITH THREE DOTS ABOVE
+06FC  ; [.1907.0020.0002.06FC] # ARABIC LETTER GHAIN WITH DOT BELOW
+075D  ; [.1908.0020.0002.075D] # ARABIC LETTER AIN WITH TWO DOTS ABOVE
+075E  ; [.1909.0020.0002.075E] # ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE
+075F  ; [.190A.0020.0002.075F] # ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE
+0641  ; [.190B.0020.0002.0641] # ARABIC LETTER FEH
+FED3  ; [.190B.0020.0017.FED3] # ARABIC LETTER FEH INITIAL FORM; QQK
+FED4  ; [.190B.0020.0018.FED4] # ARABIC LETTER FEH MEDIAL FORM; QQK
+FED2  ; [.190B.0020.0019.FED2] # ARABIC LETTER FEH FINAL FORM; QQK
+FED1  ; [.190B.0020.001A.FED1] # ARABIC LETTER FEH ISOLATED FORM; QQK
+FCBE  ; [.190B.0020.0017.FCBE][.18C2.0020.0017.FCBE] # ARABIC LIGATURE FEH WITH JEEM INITIAL FORM; QQKN
+FC2D  ; [.190B.0020.001A.FC2D][.18C2.0020.001A.FC2D] # ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM; QQKN
+FCBF  ; [.190B.0020.0017.FCBF][.18C8.0020.0017.FCBF] # ARABIC LIGATURE FEH WITH HAH INITIAL FORM; QQKN
+FC2E  ; [.190B.0020.001A.FC2E][.18C8.0020.001A.FC2E] # ARABIC LIGATURE FEH WITH HAH ISOLATED FORM; QQKN
+FCC0  ; [.190B.0020.0017.FCC0][.18C9.0020.0017.FCC0] # ARABIC LIGATURE FEH WITH KHAH INITIAL FORM; QQKN
+FC2F  ; [.190B.0020.001A.FC2F][.18C9.0020.001A.FC2F] # ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM; QQKN
+FD7D  ; [.190B.0020.0017.FD7D][.18C9.0020.0017.FD7D][.1931.0020.001F.FD7D] # ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM; QQKN
+FD7C  ; [.190B.0020.0019.FD7C][.18C9.0020.0019.FD7C][.1931.0020.001F.FD7C] # ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM; QQKN
+FCC1  ; [.190B.0020.0017.FCC1][.1931.0020.0017.FCC1] # ARABIC LIGATURE FEH WITH MEEM INITIAL FORM; QQKN
+FC30  ; [.190B.0020.001A.FC30][.1931.0020.001A.FC30] # ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM; QQKN
+FDC1  ; [.190B.0020.0019.FDC1][.1931.0020.0019.FDC1][.1950.0020.001F.FDC1] # ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM; QQKN
+FC7C  ; [.190B.0020.0019.FC7C][.194F.0020.0019.FC7C] # ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM; QQKN
+FC31  ; [.190B.0020.001A.FC31][.194F.0020.001A.FC31] # ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC7D  ; [.190B.0020.0019.FC7D][.1950.0020.0019.FC7D] # ARABIC LIGATURE FEH WITH YEH FINAL FORM; QQKN
+FC32  ; [.190B.0020.001A.FC32][.1950.0020.001A.FC32] # ARABIC LIGATURE FEH WITH YEH ISOLATED FORM; QQKN
+06A1  ; [.190C.0020.0002.06A1] # ARABIC LETTER DOTLESS FEH
+06A2  ; [.190D.0020.0002.06A2] # ARABIC LETTER FEH WITH DOT MOVED BELOW
+06A3  ; [.190E.0020.0002.06A3] # ARABIC LETTER FEH WITH DOT BELOW
+06A4  ; [.190F.0020.0002.06A4] # ARABIC LETTER VEH
+FB6C  ; [.190F.0020.0017.FB6C] # ARABIC LETTER VEH INITIAL FORM; QQK
+FB6D  ; [.190F.0020.0018.FB6D] # ARABIC LETTER VEH MEDIAL FORM; QQK
+FB6B  ; [.190F.0020.0019.FB6B] # ARABIC LETTER VEH FINAL FORM; QQK
+FB6A  ; [.190F.0020.001A.FB6A] # ARABIC LETTER VEH ISOLATED FORM; QQK
+06A5  ; [.1910.0020.0002.06A5] # ARABIC LETTER FEH WITH THREE DOTS BELOW
+06A6  ; [.1911.0020.0002.06A6] # ARABIC LETTER PEHEH
+FB70  ; [.1911.0020.0017.FB70] # ARABIC LETTER PEHEH INITIAL FORM; QQK
+FB71  ; [.1911.0020.0018.FB71] # ARABIC LETTER PEHEH MEDIAL FORM; QQK
+FB6F  ; [.1911.0020.0019.FB6F] # ARABIC LETTER PEHEH FINAL FORM; QQK
+FB6E  ; [.1911.0020.001A.FB6E] # ARABIC LETTER PEHEH ISOLATED FORM; QQK
+0760  ; [.1912.0020.0002.0760] # ARABIC LETTER FEH WITH TWO DOTS BELOW
+0761  ; [.1913.0020.0002.0761] # ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW
+066F  ; [.1914.0020.0002.066F] # ARABIC LETTER DOTLESS QAF
+0642  ; [.1915.0020.0002.0642] # ARABIC LETTER QAF
+FED7  ; [.1915.0020.0017.FED7] # ARABIC LETTER QAF INITIAL FORM; QQK
+FED8  ; [.1915.0020.0018.FED8] # ARABIC LETTER QAF MEDIAL FORM; QQK
+FED6  ; [.1915.0020.0019.FED6] # ARABIC LETTER QAF FINAL FORM; QQK
+FED5  ; [.1915.0020.001A.FED5] # ARABIC LETTER QAF ISOLATED FORM; QQK
+FCC2  ; [.1915.0020.0017.FCC2][.18C8.0020.0017.FCC2] # ARABIC LIGATURE QAF WITH HAH INITIAL FORM; QQKN
+FC33  ; [.1915.0020.001A.FC33][.18C8.0020.001A.FC33] # ARABIC LIGATURE QAF WITH HAH ISOLATED FORM; QQKN
+FDF1  ; [.1915.0020.001A.FDF1][.192B.0020.001A.FDF1][.195C.0020.001F.FDF1] # ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM; QQKN
+FCC3  ; [.1915.0020.0017.FCC3][.1931.0020.0017.FCC3] # ARABIC LIGATURE QAF WITH MEEM INITIAL FORM; QQKN
+FC34  ; [.1915.0020.001A.FC34][.1931.0020.001A.FC34] # ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM; QQKN
+FDB4  ; [.1915.0020.0017.FDB4][.1931.0020.0017.FDB4][.18C8.0020.001F.FDB4] # ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM; QQKN
+FD7E  ; [.1915.0020.0019.FD7E][.1931.0020.0019.FD7E][.18C8.0020.001F.FD7E] # ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM; QQKN
+FD7F  ; [.1915.0020.0019.FD7F][.1931.0020.0019.FD7F][.1931.0020.001F.FD7F] # ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM; QQKN
+FDB2  ; [.1915.0020.0019.FDB2][.1931.0020.0019.FDB2][.1950.0020.001F.FDB2] # ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM; QQKN
+FC7E  ; [.1915.0020.0019.FC7E][.194F.0020.0019.FC7E] # ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM; QQKN
+FC35  ; [.1915.0020.001A.FC35][.194F.0020.001A.FC35] # ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC7F  ; [.1915.0020.0019.FC7F][.1950.0020.0019.FC7F] # ARABIC LIGATURE QAF WITH YEH FINAL FORM; QQKN
+FC36  ; [.1915.0020.001A.FC36][.1950.0020.001A.FC36] # ARABIC LIGATURE QAF WITH YEH ISOLATED FORM; QQKN
+06A7  ; [.1916.0020.0002.06A7] # ARABIC LETTER QAF WITH DOT ABOVE
+06A8  ; [.1917.0020.0002.06A8] # ARABIC LETTER QAF WITH THREE DOTS ABOVE
+0643  ; [.1918.0020.0002.0643] # ARABIC LETTER KAF
+FEDB  ; [.1918.0020.0017.FEDB] # ARABIC LETTER KAF INITIAL FORM; QQK
+FEDC  ; [.1918.0020.0018.FEDC] # ARABIC LETTER KAF MEDIAL FORM; QQK
+FEDA  ; [.1918.0020.0019.FEDA] # ARABIC LETTER KAF FINAL FORM; QQK
+FED9  ; [.1918.0020.001A.FED9] # ARABIC LETTER KAF ISOLATED FORM; QQK
+FC80  ; [.1918.0020.0019.FC80][.18AD.0020.0019.FC80] # ARABIC LIGATURE KAF WITH ALEF FINAL FORM; QQKN
+FC37  ; [.1918.0020.001A.FC37][.18AD.0020.001A.FC37] # ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM; QQKN
+FCC4  ; [.1918.0020.0017.FCC4][.18C2.0020.0017.FCC4] # ARABIC LIGATURE KAF WITH JEEM INITIAL FORM; QQKN
+FC38  ; [.1918.0020.001A.FC38][.18C2.0020.001A.FC38] # ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM; QQKN
+FCC5  ; [.1918.0020.0017.FCC5][.18C8.0020.0017.FCC5] # ARABIC LIGATURE KAF WITH HAH INITIAL FORM; QQKN
+FC39  ; [.1918.0020.001A.FC39][.18C8.0020.001A.FC39] # ARABIC LIGATURE KAF WITH HAH ISOLATED FORM; QQKN
+FCC6  ; [.1918.0020.0017.FCC6][.18C9.0020.0017.FCC6] # ARABIC LIGATURE KAF WITH KHAH INITIAL FORM; QQKN
+FC3A  ; [.1918.0020.001A.FC3A][.18C9.0020.001A.FC3A] # ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM; QQKN
+FCC7  ; [.1918.0020.0017.FCC7][.192B.0020.0017.FCC7] # ARABIC LIGATURE KAF WITH LAM INITIAL FORM; QQKN
+FCEB  ; [.1918.0020.0018.FCEB][.192B.0020.0018.FCEB] # ARABIC LIGATURE KAF WITH LAM MEDIAL FORM; QQKN
+FC81  ; [.1918.0020.0019.FC81][.192B.0020.0019.FC81] # ARABIC LIGATURE KAF WITH LAM FINAL FORM; QQKN
+FC3B  ; [.1918.0020.001A.FC3B][.192B.0020.001A.FC3B] # ARABIC LIGATURE KAF WITH LAM ISOLATED FORM; QQKN
+FCC8  ; [.1918.0020.0017.FCC8][.1931.0020.0017.FCC8] # ARABIC LIGATURE KAF WITH MEEM INITIAL FORM; QQKN
+FCEC  ; [.1918.0020.0018.FCEC][.1931.0020.0018.FCEC] # ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM; QQKN
+FC82  ; [.1918.0020.0019.FC82][.1931.0020.0019.FC82] # ARABIC LIGATURE KAF WITH MEEM FINAL FORM; QQKN
+FC3C  ; [.1918.0020.001A.FC3C][.1931.0020.001A.FC3C] # ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM; QQKN
+FDC3  ; [.1918.0020.0017.FDC3][.1931.0020.0017.FDC3][.1931.0020.001F.FDC3] # ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM; QQKN
+FDBB  ; [.1918.0020.0019.FDBB][.1931.0020.0019.FDBB][.1931.0020.001F.FDBB] # ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM; QQKN
+FDB7  ; [.1918.0020.0019.FDB7][.1931.0020.0019.FDB7][.1950.0020.001F.FDB7] # ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM; QQKN
+FC83  ; [.1918.0020.0019.FC83][.194F.0020.0019.FC83] # ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM; QQKN
+FC3D  ; [.1918.0020.001A.FC3D][.194F.0020.001A.FC3D] # ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC84  ; [.1918.0020.0019.FC84][.1950.0020.0019.FC84] # ARABIC LIGATURE KAF WITH YEH FINAL FORM; QQKN
+FC3E  ; [.1918.0020.001A.FC3E][.1950.0020.001A.FC3E] # ARABIC LIGATURE KAF WITH YEH ISOLATED FORM; QQKN
+06A9  ; [.1919.0020.0002.06A9] # ARABIC LETTER KEHEH
+FB90  ; [.1919.0020.0017.FB90] # ARABIC LETTER KEHEH INITIAL FORM; QQK
+FB91  ; [.1919.0020.0018.FB91] # ARABIC LETTER KEHEH MEDIAL FORM; QQK
+FB8F  ; [.1919.0020.0019.FB8F] # ARABIC LETTER KEHEH FINAL FORM; QQK
+FB8E  ; [.1919.0020.001A.FB8E] # ARABIC LETTER KEHEH ISOLATED FORM; QQK
+06AA  ; [.191A.0020.0002.06AA] # ARABIC LETTER SWASH KAF
+06AB  ; [.191B.0020.0002.06AB] # ARABIC LETTER KAF WITH RING
+06AC  ; [.191C.0020.0002.06AC] # ARABIC LETTER KAF WITH DOT ABOVE
+077F  ; [.191D.0020.0002.077F] # ARABIC LETTER KAF WITH TWO DOTS ABOVE
+06AD  ; [.191E.0020.0002.06AD] # ARABIC LETTER NG
+FBD5  ; [.191E.0020.0017.FBD5] # ARABIC LETTER NG INITIAL FORM; QQK
+FBD6  ; [.191E.0020.0018.FBD6] # ARABIC LETTER NG MEDIAL FORM; QQK
+FBD4  ; [.191E.0020.0019.FBD4] # ARABIC LETTER NG FINAL FORM; QQK
+FBD3  ; [.191E.0020.001A.FBD3] # ARABIC LETTER NG ISOLATED FORM; QQK
+06AE  ; [.191F.0020.0002.06AE] # ARABIC LETTER KAF WITH THREE DOTS BELOW
+06AF  ; [.1920.0020.0002.06AF] # ARABIC LETTER GAF
+FB94  ; [.1920.0020.0017.FB94] # ARABIC LETTER GAF INITIAL FORM; QQK
+FB95  ; [.1920.0020.0018.FB95] # ARABIC LETTER GAF MEDIAL FORM; QQK
+FB93  ; [.1920.0020.0019.FB93] # ARABIC LETTER GAF FINAL FORM; QQK
+FB92  ; [.1920.0020.001A.FB92] # ARABIC LETTER GAF ISOLATED FORM; QQK
+06B0  ; [.1921.0020.0002.06B0] # ARABIC LETTER GAF WITH RING
+06B1  ; [.1922.0020.0002.06B1] # ARABIC LETTER NGOEH
+FB9C  ; [.1922.0020.0017.FB9C] # ARABIC LETTER NGOEH INITIAL FORM; QQK
+FB9D  ; [.1922.0020.0018.FB9D] # ARABIC LETTER NGOEH MEDIAL FORM; QQK
+FB9B  ; [.1922.0020.0019.FB9B] # ARABIC LETTER NGOEH FINAL FORM; QQK
+FB9A  ; [.1922.0020.001A.FB9A] # ARABIC LETTER NGOEH ISOLATED FORM; QQK
+06B2  ; [.1923.0020.0002.06B2] # ARABIC LETTER GAF WITH TWO DOTS BELOW
+06B3  ; [.1924.0020.0002.06B3] # ARABIC LETTER GUEH
+FB98  ; [.1924.0020.0017.FB98] # ARABIC LETTER GUEH INITIAL FORM; QQK
+FB99  ; [.1924.0020.0018.FB99] # ARABIC LETTER GUEH MEDIAL FORM; QQK
+FB97  ; [.1924.0020.0019.FB97] # ARABIC LETTER GUEH FINAL FORM; QQK
+FB96  ; [.1924.0020.001A.FB96] # ARABIC LETTER GUEH ISOLATED FORM; QQK
+06B4  ; [.1925.0020.0002.06B4] # ARABIC LETTER GAF WITH THREE DOTS ABOVE
+0762  ; [.1926.0020.0002.0762] # ARABIC LETTER KEHEH WITH DOT ABOVE
+063B  ; [.1927.0020.0002.063B] # ARABIC LETTER KEHEH WITH TWO DOTS ABOVE
+063C  ; [.1928.0020.0002.063C] # ARABIC LETTER KEHEH WITH THREE DOTS BELOW
+0763  ; [.1929.0020.0002.0763] # ARABIC LETTER KEHEH WITH THREE DOTS ABOVE
+0764  ; [.192A.0020.0002.0764] # ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW
+0644  ; [.192B.0020.0002.0644] # ARABIC LETTER LAM
+FEDF  ; [.192B.0020.0017.FEDF] # ARABIC LETTER LAM INITIAL FORM; QQK
+FEE0  ; [.192B.0020.0018.FEE0] # ARABIC LETTER LAM MEDIAL FORM; QQK
+FEDE  ; [.192B.0020.0019.FEDE] # ARABIC LETTER LAM FINAL FORM; QQK
+FEDD  ; [.192B.0020.001A.FEDD] # ARABIC LETTER LAM ISOLATED FORM; QQK
+FEF6  ; [.192B.0020.0019.FEF6][.18A3.0020.0019.FEF6] # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM; QQKN
+FEF5  ; [.192B.0020.001A.FEF5][.18A3.0020.001A.FEF5] # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM; QQKN
+FEF8  ; [.192B.0020.0019.FEF8][.18A4.0020.0019.FEF8] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM; QQKN
+FEF7  ; [.192B.0020.001A.FEF7][.18A4.0020.001A.FEF7] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM; QQKN
+FEFA  ; [.192B.0020.0019.FEFA][.18A8.0020.0019.FEFA] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM; QQKN
+FEF9  ; [.192B.0020.001A.FEF9][.18A8.0020.001A.FEF9] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM; QQKN
+FEFC  ; [.192B.0020.0019.FEFC][.18AD.0020.0019.FEFC] # ARABIC LIGATURE LAM WITH ALEF FINAL FORM; QQKN
+FEFB  ; [.192B.0020.001A.FEFB][.18AD.0020.001A.FEFB] # ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM; QQKN
+FCC9  ; [.192B.0020.0017.FCC9][.18C2.0020.0017.FCC9] # ARABIC LIGATURE LAM WITH JEEM INITIAL FORM; QQKN
+FC3F  ; [.192B.0020.001A.FC3F][.18C2.0020.001A.FC3F] # ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM; QQKN
+FD83  ; [.192B.0020.0017.FD83][.18C2.0020.0017.FD83][.18C2.0020.001F.FD83] # ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM; QQKN
+FD84  ; [.192B.0020.0019.FD84][.18C2.0020.0019.FD84][.18C2.0020.001F.FD84] # ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM; QQKN
+FDBA  ; [.192B.0020.0017.FDBA][.18C2.0020.0017.FDBA][.1931.0020.001F.FDBA] # ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM; QQKN
+FDBC  ; [.192B.0020.0019.FDBC][.18C2.0020.0019.FDBC][.1931.0020.001F.FDBC] # ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM; QQKN
+FDAC  ; [.192B.0020.0019.FDAC][.18C2.0020.0019.FDAC][.1950.0020.001F.FDAC] # ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM; QQKN
+FCCA  ; [.192B.0020.0017.FCCA][.18C8.0020.0017.FCCA] # ARABIC LIGATURE LAM WITH HAH INITIAL FORM; QQKN
+FC40  ; [.192B.0020.001A.FC40][.18C8.0020.001A.FC40] # ARABIC LIGATURE LAM WITH HAH ISOLATED FORM; QQKN
+FDB5  ; [.192B.0020.0017.FDB5][.18C8.0020.0017.FDB5][.1931.0020.001F.FDB5] # ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM; QQKN
+FD80  ; [.192B.0020.0019.FD80][.18C8.0020.0019.FD80][.1931.0020.001F.FD80] # ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM; QQKN
+FD82  ; [.192B.0020.0019.FD82][.18C8.0020.0019.FD82][.194F.0020.001F.FD82] # ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM; QQKN
+FD81  ; [.192B.0020.0019.FD81][.18C8.0020.0019.FD81][.1950.0020.001F.FD81] # ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM; QQKN
+FCCB  ; [.192B.0020.0017.FCCB][.18C9.0020.0017.FCCB] # ARABIC LIGATURE LAM WITH KHAH INITIAL FORM; QQKN
+FC41  ; [.192B.0020.001A.FC41][.18C9.0020.001A.FC41] # ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM; QQKN
+FD86  ; [.192B.0020.0017.FD86][.18C9.0020.0017.FD86][.1931.0020.001F.FD86] # ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM; QQKN
+FD85  ; [.192B.0020.0019.FD85][.18C9.0020.0019.FD85][.1931.0020.001F.FD85] # ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM; QQKN
+FCCC  ; [.192B.0020.0017.FCCC][.1931.0020.0017.FCCC] # ARABIC LIGATURE LAM WITH MEEM INITIAL FORM; QQKN
+FCED  ; [.192B.0020.0018.FCED][.1931.0020.0018.FCED] # ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM; QQKN
+FC85  ; [.192B.0020.0019.FC85][.1931.0020.0019.FC85] # ARABIC LIGATURE LAM WITH MEEM FINAL FORM; QQKN
+FC42  ; [.192B.0020.001A.FC42][.1931.0020.001A.FC42] # ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM; QQKN
+FD88  ; [.192B.0020.0017.FD88][.1931.0020.0017.FD88][.18C8.0020.001F.FD88] # ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM; QQKN
+FD87  ; [.192B.0020.0019.FD87][.1931.0020.0019.FD87][.18C8.0020.001F.FD87] # ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM; QQKN
+FDAD  ; [.192B.0020.0019.FDAD][.1931.0020.0019.FDAD][.1950.0020.001F.FDAD] # ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM; QQKN
+FCCD  ; [.192B.0020.0017.FCCD][.193D.0020.0017.FCCD] # ARABIC LIGATURE LAM WITH HEH INITIAL FORM; QQKN
+FC86  ; [.192B.0020.0019.FC86][.194F.0020.0019.FC86] # ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM; QQKN
+FC43  ; [.192B.0020.001A.FC43][.194F.0020.001A.FC43] # ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC87  ; [.192B.0020.0019.FC87][.1950.0020.0019.FC87] # ARABIC LIGATURE LAM WITH YEH FINAL FORM; QQKN
+FC44  ; [.192B.0020.001A.FC44][.1950.0020.001A.FC44] # ARABIC LIGATURE LAM WITH YEH ISOLATED FORM; QQKN
+06B5  ; [.192C.0020.0002.06B5] # ARABIC LETTER LAM WITH SMALL V
+06B6  ; [.192D.0020.0002.06B6] # ARABIC LETTER LAM WITH DOT ABOVE
+06B7  ; [.192E.0020.0002.06B7] # ARABIC LETTER LAM WITH THREE DOTS ABOVE
+06B8  ; [.192F.0020.0002.06B8] # ARABIC LETTER LAM WITH THREE DOTS BELOW
+076A  ; [.1930.0020.0002.076A] # ARABIC LETTER LAM WITH BAR
+0645  ; [.1931.0020.0002.0645] # ARABIC LETTER MEEM
+FEE3  ; [.1931.0020.0017.FEE3] # ARABIC LETTER MEEM INITIAL FORM; QQK
+FEE4  ; [.1931.0020.0018.FEE4] # ARABIC LETTER MEEM MEDIAL FORM; QQK
+FEE2  ; [.1931.0020.0019.FEE2] # ARABIC LETTER MEEM FINAL FORM; QQK
+FEE1  ; [.1931.0020.001A.FEE1] # ARABIC LETTER MEEM ISOLATED FORM; QQK
+06FE  ; [.1931.0020.0004.06FE][.0000.015A.0004.06FE] # ARABIC SIGN SINDHI POSTPOSITION MEN; QQKN
+FC88  ; [.1931.0020.0019.FC88][.18AD.0020.0019.FC88] # ARABIC LIGATURE MEEM WITH ALEF FINAL FORM; QQKN
+FCCE  ; [.1931.0020.0017.FCCE][.18C2.0020.0017.FCCE] # ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM; QQKN
+FC45  ; [.1931.0020.001A.FC45][.18C2.0020.001A.FC45] # ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM; QQKN
+FD8C  ; [.1931.0020.0017.FD8C][.18C2.0020.0017.FD8C][.18C8.0020.001F.FD8C] # ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM; QQKN
+FD92  ; [.1931.0020.0017.FD92][.18C2.0020.0017.FD92][.18C9.0020.001F.FD92] # ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM; QQKN
+FD8D  ; [.1931.0020.0017.FD8D][.18C2.0020.0017.FD8D][.1931.0020.001F.FD8D] # ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM; QQKN
+FDC0  ; [.1931.0020.0019.FDC0][.18C2.0020.0019.FDC0][.1950.0020.001F.FDC0] # ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM; QQKN
+FCCF  ; [.1931.0020.0017.FCCF][.18C8.0020.0017.FCCF] # ARABIC LIGATURE MEEM WITH HAH INITIAL FORM; QQKN
+FC46  ; [.1931.0020.001A.FC46][.18C8.0020.001A.FC46] # ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM; QQKN
+FD89  ; [.1931.0020.0017.FD89][.18C8.0020.0017.FD89][.18C2.0020.001F.FD89] # ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM; QQKN
+FD8A  ; [.1931.0020.0017.FD8A][.18C8.0020.0017.FD8A][.1931.0020.001F.FD8A] # ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM; QQKN
+FDF4  ; [.1931.0020.001A.FDF4][.18C8.0020.001A.FDF4][.1931.0020.001F.FDF4][.18D3.0020.001F.FDF4] # ARABIC LIGATURE MOHAMMAD ISOLATED FORM; QQKN
+FD8B  ; [.1931.0020.0019.FD8B][.18C8.0020.0019.FD8B][.1950.0020.001F.FD8B] # ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM; QQKN
+FCD0  ; [.1931.0020.0017.FCD0][.18C9.0020.0017.FCD0] # ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM; QQKN
+FC47  ; [.1931.0020.001A.FC47][.18C9.0020.001A.FC47] # ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM; QQKN
+FD8E  ; [.1931.0020.0017.FD8E][.18C9.0020.0017.FD8E][.18C2.0020.001F.FD8E] # ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM; QQKN
+FD8F  ; [.1931.0020.0017.FD8F][.18C9.0020.0017.FD8F][.1931.0020.001F.FD8F] # ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM; QQKN
+FDB9  ; [.1931.0020.0019.FDB9][.18C9.0020.0019.FDB9][.1950.0020.001F.FDB9] # ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM; QQKN
+FCD1  ; [.1931.0020.0017.FCD1][.1931.0020.0017.FCD1] # ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM; QQKN
+FC89  ; [.1931.0020.0019.FC89][.1931.0020.0019.FC89] # ARABIC LIGATURE MEEM WITH MEEM FINAL FORM; QQKN
+FC48  ; [.1931.0020.001A.FC48][.1931.0020.001A.FC48] # ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM; QQKN
+FDB1  ; [.1931.0020.0019.FDB1][.1931.0020.0019.FDB1][.1950.0020.001F.FDB1] # ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM; QQKN
+FC49  ; [.1931.0020.001A.FC49][.194F.0020.001A.FC49] # ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC4A  ; [.1931.0020.001A.FC4A][.1950.0020.001A.FC4A] # ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM; QQKN
+0765  ; [.1932.0020.0002.0765] # ARABIC LETTER MEEM WITH DOT ABOVE
+0766  ; [.1933.0020.0002.0766] # ARABIC LETTER MEEM WITH DOT BELOW
+0646  ; [.1934.0020.0002.0646] # ARABIC LETTER NOON
+FEE7  ; [.1934.0020.0017.FEE7] # ARABIC LETTER NOON INITIAL FORM; QQK
+FEE8  ; [.1934.0020.0018.FEE8] # ARABIC LETTER NOON MEDIAL FORM; QQK
+FEE6  ; [.1934.0020.0019.FEE6] # ARABIC LETTER NOON FINAL FORM; QQK
+FEE5  ; [.1934.0020.001A.FEE5] # ARABIC LETTER NOON ISOLATED FORM; QQK
+FCD2  ; [.1934.0020.0017.FCD2][.18C2.0020.0017.FCD2] # ARABIC LIGATURE NOON WITH JEEM INITIAL FORM; QQKN
+FC4B  ; [.1934.0020.001A.FC4B][.18C2.0020.001A.FC4B] # ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM; QQKN
+FDB8  ; [.1934.0020.0017.FDB8][.18C2.0020.0017.FDB8][.18C8.0020.001F.FDB8] # ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM; QQKN
+FDBD  ; [.1934.0020.0019.FDBD][.18C2.0020.0019.FDBD][.18C8.0020.001F.FDBD] # ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM; QQKN
+FD98  ; [.1934.0020.0017.FD98][.18C2.0020.0017.FD98][.1931.0020.001F.FD98] # ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM; QQKN
+FD97  ; [.1934.0020.0019.FD97][.18C2.0020.0019.FD97][.1931.0020.001F.FD97] # ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM; QQKN
+FD99  ; [.1934.0020.0019.FD99][.18C2.0020.0019.FD99][.194F.0020.001F.FD99] # ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FDC7  ; [.1934.0020.0019.FDC7][.18C2.0020.0019.FDC7][.1950.0020.001F.FDC7] # ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM; QQKN
+FCD3  ; [.1934.0020.0017.FCD3][.18C8.0020.0017.FCD3] # ARABIC LIGATURE NOON WITH HAH INITIAL FORM; QQKN
+FC4C  ; [.1934.0020.001A.FC4C][.18C8.0020.001A.FC4C] # ARABIC LIGATURE NOON WITH HAH ISOLATED FORM; QQKN
+FD95  ; [.1934.0020.0017.FD95][.18C8.0020.0017.FD95][.1931.0020.001F.FD95] # ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM; QQKN
+FD96  ; [.1934.0020.0019.FD96][.18C8.0020.0019.FD96][.194F.0020.001F.FD96] # ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM; QQKN
+FDB3  ; [.1934.0020.0019.FDB3][.18C8.0020.0019.FDB3][.1950.0020.001F.FDB3] # ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM; QQKN
+FCD4  ; [.1934.0020.0017.FCD4][.18C9.0020.0017.FCD4] # ARABIC LIGATURE NOON WITH KHAH INITIAL FORM; QQKN
+FC4D  ; [.1934.0020.001A.FC4D][.18C9.0020.001A.FC4D] # ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM; QQKN
+FC8A  ; [.1934.0020.0019.FC8A][.18E1.0020.0019.FC8A] # ARABIC LIGATURE NOON WITH REH FINAL FORM; QQKN
+FC8B  ; [.1934.0020.0019.FC8B][.18E2.0020.0019.FC8B] # ARABIC LIGATURE NOON WITH ZAIN FINAL FORM; QQKN
+FCD5  ; [.1934.0020.0017.FCD5][.1931.0020.0017.FCD5] # ARABIC LIGATURE NOON WITH MEEM INITIAL FORM; QQKN
+FCEE  ; [.1934.0020.0018.FCEE][.1931.0020.0018.FCEE] # ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM; QQKN
+FC8C  ; [.1934.0020.0019.FC8C][.1931.0020.0019.FC8C] # ARABIC LIGATURE NOON WITH MEEM FINAL FORM; QQKN
+FC4E  ; [.1934.0020.001A.FC4E][.1931.0020.001A.FC4E] # ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM; QQKN
+FD9B  ; [.1934.0020.0019.FD9B][.1931.0020.0019.FD9B][.194F.0020.001F.FD9B] # ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM; QQKN
+FD9A  ; [.1934.0020.0019.FD9A][.1931.0020.0019.FD9A][.1950.0020.001F.FD9A] # ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM; QQKN
+FC8D  ; [.1934.0020.0019.FC8D][.1934.0020.0019.FC8D] # ARABIC LIGATURE NOON WITH NOON FINAL FORM; QQKN
+FCD6  ; [.1934.0020.0017.FCD6][.193D.0020.0017.FCD6] # ARABIC LIGATURE NOON WITH HEH INITIAL FORM; QQKN
+FCEF  ; [.1934.0020.0018.FCEF][.193D.0020.0018.FCEF] # ARABIC LIGATURE NOON WITH HEH MEDIAL FORM; QQKN
+FC8E  ; [.1934.0020.0019.FC8E][.194F.0020.0019.FC8E] # ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM; QQKN
+FC4F  ; [.1934.0020.001A.FC4F][.194F.0020.001A.FC4F] # ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC8F  ; [.1934.0020.0019.FC8F][.1950.0020.0019.FC8F] # ARABIC LIGATURE NOON WITH YEH FINAL FORM; QQKN
+FC50  ; [.1934.0020.001A.FC50][.1950.0020.001A.FC50] # ARABIC LIGATURE NOON WITH YEH ISOLATED FORM; QQKN
+06BA  ; [.1935.0020.0002.06BA] # ARABIC LETTER NOON GHUNNA
+FB9F  ; [.1935.0020.0019.FB9F] # ARABIC LETTER NOON GHUNNA FINAL FORM; QQK
+FB9E  ; [.1935.0020.001A.FB9E] # ARABIC LETTER NOON GHUNNA ISOLATED FORM; QQK
+06BB  ; [.1936.0020.0002.06BB] # ARABIC LETTER RNOON
+FBA2  ; [.1936.0020.0017.FBA2] # ARABIC LETTER RNOON INITIAL FORM; QQK
+FBA3  ; [.1936.0020.0018.FBA3] # ARABIC LETTER RNOON MEDIAL FORM; QQK
+FBA1  ; [.1936.0020.0019.FBA1] # ARABIC LETTER RNOON FINAL FORM; QQK
+FBA0  ; [.1936.0020.001A.FBA0] # ARABIC LETTER RNOON ISOLATED FORM; QQK
+06BC  ; [.1937.0020.0002.06BC] # ARABIC LETTER NOON WITH RING
+06BD  ; [.1938.0020.0002.06BD] # ARABIC LETTER NOON WITH THREE DOTS ABOVE
+06B9  ; [.1939.0020.0002.06B9] # ARABIC LETTER NOON WITH DOT BELOW
+0767  ; [.193A.0020.0002.0767] # ARABIC LETTER NOON WITH TWO DOTS BELOW
+0768  ; [.193B.0020.0002.0768] # ARABIC LETTER NOON WITH SMALL TAH
+0769  ; [.193C.0020.0002.0769] # ARABIC LETTER NOON WITH SMALL V
+0647  ; [.193D.0020.0002.0647] # ARABIC LETTER HEH
+FEEB  ; [.193D.0020.0017.FEEB] # ARABIC LETTER HEH INITIAL FORM; QQK
+FEEC  ; [.193D.0020.0018.FEEC] # ARABIC LETTER HEH MEDIAL FORM; QQK
+FEEA  ; [.193D.0020.0019.FEEA] # ARABIC LETTER HEH FINAL FORM; QQK
+FEE9  ; [.193D.0020.001A.FEE9] # ARABIC LETTER HEH ISOLATED FORM; QQK
+FCD9  ; [.193D.0020.0017.FCD9][.0000.00BC.0017.FCD9] # ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM; QQKN
+FCD7  ; [.193D.0020.0017.FCD7][.18C2.0020.0017.FCD7] # ARABIC LIGATURE HEH WITH JEEM INITIAL FORM; QQKN
+FC51  ; [.193D.0020.001A.FC51][.18C2.0020.001A.FC51] # ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM; QQKN
+FCD8  ; [.193D.0020.0017.FCD8][.1931.0020.0017.FCD8] # ARABIC LIGATURE HEH WITH MEEM INITIAL FORM; QQKN
+FC52  ; [.193D.0020.001A.FC52][.1931.0020.001A.FC52] # ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM; QQKN
+FD93  ; [.193D.0020.0017.FD93][.1931.0020.0017.FD93][.18C2.0020.001F.FD93] # ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM; QQKN
+FD94  ; [.193D.0020.0017.FD94][.1931.0020.0017.FD94][.1931.0020.001F.FD94] # ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM; QQKN
+FC53  ; [.193D.0020.001A.FC53][.194F.0020.001A.FC53] # ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC54  ; [.193D.0020.001A.FC54][.1950.0020.001A.FC54] # ARABIC LIGATURE HEH WITH YEH ISOLATED FORM; QQKN
+06BE  ; [.193E.0020.0002.06BE] # ARABIC LETTER HEH DOACHASHMEE
+FBAC  ; [.193E.0020.0017.FBAC] # ARABIC LETTER HEH DOACHASHMEE INITIAL FORM; QQK
+FBAD  ; [.193E.0020.0018.FBAD] # ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM; QQK
+FBAB  ; [.193E.0020.0019.FBAB] # ARABIC LETTER HEH DOACHASHMEE FINAL FORM; QQK
+FBAA  ; [.193E.0020.001A.FBAA] # ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM; QQK
+06C1  ; [.193F.0020.0002.06C1] # ARABIC LETTER HEH GOAL
+FBA8  ; [.193F.0020.0017.FBA8] # ARABIC LETTER HEH GOAL INITIAL FORM; QQK
+FBA9  ; [.193F.0020.0018.FBA9] # ARABIC LETTER HEH GOAL MEDIAL FORM; QQK
+FBA7  ; [.193F.0020.0019.FBA7] # ARABIC LETTER HEH GOAL FINAL FORM; QQK
+FBA6  ; [.193F.0020.001A.FBA6] # ARABIC LETTER HEH GOAL ISOLATED FORM; QQK
+06C2  ; [.193F.0020.0002.06C1][.0000.00B1.0002.0654] # ARABIC LETTER HEH GOAL WITH HAMZA ABOVE; QQCM
+06C3  ; [.1940.0020.0002.06C3] # ARABIC LETTER TEH MARBUTA GOAL
+06FF  ; [.1941.0020.0002.06FF] # ARABIC LETTER HEH WITH INVERTED V
+06D5  ; [.1942.0020.0002.06D5] # ARABIC LETTER AE
+06C0  ; [.1942.0020.0002.06D5][.0000.00B1.0002.0654] # ARABIC LETTER HEH WITH YEH ABOVE; QQCM
+FBA5  ; [.1942.0020.0019.FBA5][.0000.00B1.0019.FBA5] # ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM; QQKN
+FBA4  ; [.1942.0020.001A.FBA4][.0000.00B1.001A.FBA4] # ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM; QQKN
+0648  ; [.1943.0020.0002.0648] # ARABIC LETTER WAW
+06E5  ; [.1943.0020.0004.06E5] # ARABIC SMALL WAW; QQK
+FEEE  ; [.1943.0020.0019.FEEE] # ARABIC LETTER WAW FINAL FORM; QQK
+FEED  ; [.1943.0020.001A.FEED] # ARABIC LETTER WAW ISOLATED FORM; QQK
+0676  ; [.1943.0020.0004.0676][.18A2.0020.0004.0676] # ARABIC LETTER HIGH HAMZA WAW; QQKN
+FDF8  ; [.1943.0020.001A.FDF8][.18F1.0020.001A.FDF8][.192B.0020.001F.FDF8][.1931.0020.001F.FDF8] # ARABIC LIGATURE WASALLAM ISOLATED FORM; QQKN
+06C4  ; [.1944.0020.0002.06C4] # ARABIC LETTER WAW WITH RING
+06C5  ; [.1945.0020.0002.06C5] # ARABIC LETTER KIRGHIZ OE
+FBE1  ; [.1945.0020.0019.FBE1] # ARABIC LETTER KIRGHIZ OE FINAL FORM; QQK
+FBE0  ; [.1945.0020.001A.FBE0] # ARABIC LETTER KIRGHIZ OE ISOLATED FORM; QQK
+06C6  ; [.1946.0020.0002.06C6] # ARABIC LETTER OE
+FBDA  ; [.1946.0020.0019.FBDA] # ARABIC LETTER OE FINAL FORM; QQK
+FBD9  ; [.1946.0020.001A.FBD9] # ARABIC LETTER OE ISOLATED FORM; QQK
+06C7  ; [.1947.0020.0002.06C7] # ARABIC LETTER U
+FBD8  ; [.1947.0020.0019.FBD8] # ARABIC LETTER U FINAL FORM; QQK
+FBD7  ; [.1947.0020.001A.FBD7] # ARABIC LETTER U ISOLATED FORM; QQK
+0677  ; [.1947.0020.0004.0677][.18A2.0020.0004.0677] # ARABIC LETTER U WITH HAMZA ABOVE; QQKN
+FBDD  ; [.1947.0020.001A.FBDD][.18A2.0020.001A.FBDD] # ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM; QQKN
+06C8  ; [.1948.0020.0002.06C8] # ARABIC LETTER YU
+FBDC  ; [.1948.0020.0019.FBDC] # ARABIC LETTER YU FINAL FORM; QQK
+FBDB  ; [.1948.0020.001A.FBDB] # ARABIC LETTER YU ISOLATED FORM; QQK
+06C9  ; [.1949.0020.0002.06C9] # ARABIC LETTER KIRGHIZ YU
+FBE3  ; [.1949.0020.0019.FBE3] # ARABIC LETTER KIRGHIZ YU FINAL FORM; QQK
+FBE2  ; [.1949.0020.001A.FBE2] # ARABIC LETTER KIRGHIZ YU ISOLATED FORM; QQK
+06CA  ; [.194A.0020.0002.06CA] # ARABIC LETTER WAW WITH TWO DOTS ABOVE
+06CB  ; [.194B.0020.0002.06CB] # ARABIC LETTER VE
+FBDF  ; [.194B.0020.0019.FBDF] # ARABIC LETTER VE FINAL FORM; QQK
+FBDE  ; [.194B.0020.001A.FBDE] # ARABIC LETTER VE ISOLATED FORM; QQK
+06CF  ; [.194C.0020.0002.06CF] # ARABIC LETTER WAW WITH DOT ABOVE
+0778  ; [.194D.0020.0002.0778] # ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE
+0779  ; [.194E.0020.0002.0779] # ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE
+0649  ; [.194F.0020.0002.0649] # ARABIC LETTER ALEF MAKSURA
+FBE8  ; [.194F.0020.0017.FBE8] # ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM; QQK
+FBE9  ; [.194F.0020.0018.FBE9] # ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM; QQK
+FEF0  ; [.194F.0020.0019.FEF0] # ARABIC LETTER ALEF MAKSURA FINAL FORM; QQK
+FEEF  ; [.194F.0020.001A.FEEF] # ARABIC LETTER ALEF MAKSURA ISOLATED FORM; QQK
+FC90  ; [.194F.0020.0019.FC90][.0000.00BC.0019.FC90] # ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM; QQKN
+FC5D  ; [.194F.0020.001A.FC5D][.0000.00BC.001A.FC5D] # ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM; QQKN
+064A  ; [.1950.0020.0002.064A] # ARABIC LETTER YEH
+06E6  ; [.1950.0020.0004.06E6] # ARABIC SMALL YEH; QQK
+FEF3  ; [.1950.0020.0017.FEF3] # ARABIC LETTER YEH INITIAL FORM; QQK
+FEF4  ; [.1950.0020.0018.FEF4] # ARABIC LETTER YEH MEDIAL FORM; QQK
+FEF2  ; [.1950.0020.0019.FEF2] # ARABIC LETTER YEH FINAL FORM; QQK
+FEF1  ; [.1950.0020.001A.FEF1] # ARABIC LETTER YEH ISOLATED FORM; QQK
+0678  ; [.1950.0020.0004.0678][.18A2.0020.0004.0678] # ARABIC LETTER HIGH HAMZA YEH; QQKN
+FCDA  ; [.1950.0020.0017.FCDA][.18C2.0020.0017.FCDA] # ARABIC LIGATURE YEH WITH JEEM INITIAL FORM; QQKN
+FC55  ; [.1950.0020.001A.FC55][.18C2.0020.001A.FC55] # ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM; QQKN
+FDAF  ; [.1950.0020.0019.FDAF][.18C2.0020.0019.FDAF][.1950.0020.001F.FDAF] # ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM; QQKN
+FCDB  ; [.1950.0020.0017.FCDB][.18C8.0020.0017.FCDB] # ARABIC LIGATURE YEH WITH HAH INITIAL FORM; QQKN
+FC56  ; [.1950.0020.001A.FC56][.18C8.0020.001A.FC56] # ARABIC LIGATURE YEH WITH HAH ISOLATED FORM; QQKN
+FDAE  ; [.1950.0020.0019.FDAE][.18C8.0020.0019.FDAE][.1950.0020.001F.FDAE] # ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM; QQKN
+FCDC  ; [.1950.0020.0017.FCDC][.18C9.0020.0017.FCDC] # ARABIC LIGATURE YEH WITH KHAH INITIAL FORM; QQKN
+FC57  ; [.1950.0020.001A.FC57][.18C9.0020.001A.FC57] # ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM; QQKN
+FC91  ; [.1950.0020.0019.FC91][.18E1.0020.0019.FC91] # ARABIC LIGATURE YEH WITH REH FINAL FORM; QQKN
+FC92  ; [.1950.0020.0019.FC92][.18E2.0020.0019.FC92] # ARABIC LIGATURE YEH WITH ZAIN FINAL FORM; QQKN
+FCDD  ; [.1950.0020.0017.FCDD][.1931.0020.0017.FCDD] # ARABIC LIGATURE YEH WITH MEEM INITIAL FORM; QQKN
+FCF0  ; [.1950.0020.0018.FCF0][.1931.0020.0018.FCF0] # ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM; QQKN
+FC93  ; [.1950.0020.0019.FC93][.1931.0020.0019.FC93] # ARABIC LIGATURE YEH WITH MEEM FINAL FORM; QQKN
+FC58  ; [.1950.0020.001A.FC58][.1931.0020.001A.FC58] # ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM; QQKN
+FD9D  ; [.1950.0020.0017.FD9D][.1931.0020.0017.FD9D][.1931.0020.001F.FD9D] # ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM; QQKN
+FD9C  ; [.1950.0020.0019.FD9C][.1931.0020.0019.FD9C][.1931.0020.001F.FD9C] # ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM; QQKN
+FDB0  ; [.1950.0020.0019.FDB0][.1931.0020.0019.FDB0][.1950.0020.001F.FDB0] # ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM; QQKN
+FC94  ; [.1950.0020.0019.FC94][.1934.0020.0019.FC94] # ARABIC LIGATURE YEH WITH NOON FINAL FORM; QQKN
+FCDE  ; [.1950.0020.0017.FCDE][.193D.0020.0017.FCDE] # ARABIC LIGATURE YEH WITH HEH INITIAL FORM; QQKN
+FCF1  ; [.1950.0020.0018.FCF1][.193D.0020.0018.FCF1] # ARABIC LIGATURE YEH WITH HEH MEDIAL FORM; QQKN
+FC95  ; [.1950.0020.0019.FC95][.194F.0020.0019.FC95] # ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM; QQKN
+FC59  ; [.1950.0020.001A.FC59][.194F.0020.001A.FC59] # ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM; QQKN
+FC96  ; [.1950.0020.0019.FC96][.1950.0020.0019.FC96] # ARABIC LIGATURE YEH WITH YEH FINAL FORM; QQKN
+FC5A  ; [.1950.0020.001A.FC5A][.1950.0020.001A.FC5A] # ARABIC LIGATURE YEH WITH YEH ISOLATED FORM; QQKN
+06CC  ; [.1951.0020.0002.06CC] # ARABIC LETTER FARSI YEH
+FBFE  ; [.1951.0020.0017.FBFE] # ARABIC LETTER FARSI YEH INITIAL FORM; QQK
+FBFF  ; [.1951.0020.0018.FBFF] # ARABIC LETTER FARSI YEH MEDIAL FORM; QQK
+FBFD  ; [.1951.0020.0019.FBFD] # ARABIC LETTER FARSI YEH FINAL FORM; QQK
+FBFC  ; [.1951.0020.001A.FBFC] # ARABIC LETTER FARSI YEH ISOLATED FORM; QQK
+06CD  ; [.1952.0020.0002.06CD] # ARABIC LETTER YEH WITH TAIL
+06CE  ; [.1953.0020.0002.06CE] # ARABIC LETTER YEH WITH SMALL V
+06D0  ; [.1954.0020.0002.06D0] # ARABIC LETTER E
+FBE6  ; [.1954.0020.0017.FBE6] # ARABIC LETTER E INITIAL FORM; QQK
+FBE7  ; [.1954.0020.0018.FBE7] # ARABIC LETTER E MEDIAL FORM; QQK
+FBE5  ; [.1954.0020.0019.FBE5] # ARABIC LETTER E FINAL FORM; QQK
+FBE4  ; [.1954.0020.001A.FBE4] # ARABIC LETTER E ISOLATED FORM; QQK
+06D1  ; [.1955.0020.0002.06D1] # ARABIC LETTER YEH WITH THREE DOTS BELOW
+063D  ; [.1956.0020.0002.063D] # ARABIC LETTER FARSI YEH WITH INVERTED V
+063E  ; [.1957.0020.0002.063E] # ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE
+063F  ; [.1958.0020.0002.063F] # ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE
+0775  ; [.1959.0020.0002.0775] # ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE
+0776  ; [.195A.0020.0002.0776] # ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE
+0777  ; [.195B.0020.0002.0777] # ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW
+06D2  ; [.195C.0020.0002.06D2] # ARABIC LETTER YEH BARREE
+FBAF  ; [.195C.0020.0019.FBAF] # ARABIC LETTER YEH BARREE FINAL FORM; QQK
+FBAE  ; [.195C.0020.001A.FBAE] # ARABIC LETTER YEH BARREE ISOLATED FORM; QQK
+06D3  ; [.195C.0020.0002.06D2][.0000.00B1.0002.0654] # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE; QQCM
+FBB1  ; [.195C.0020.0019.FBB1][.0000.00B1.0019.FBB1] # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM; QQKN
+FBB0  ; [.195C.0020.001A.FBB0][.0000.00B1.001A.FBB0] # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM; QQKN
+077A  ; [.195D.0020.0002.077A] # ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE
+077B  ; [.195E.0020.0002.077B] # ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE
+0710  ; [.195F.0020.0002.0710] # SYRIAC LETTER ALAPH
+0712  ; [.1960.0020.0002.0712] # SYRIAC LETTER BETH
+072D  ; [.1960.0020.0004.072D][.0000.015C.0004.072D] # SYRIAC LETTER PERSIAN BHETH; QQKN
+0713  ; [.1961.0020.0002.0713] # SYRIAC LETTER GAMAL
+0714  ; [.1961.0020.0004.0714][.0000.015A.0004.0714] # SYRIAC LETTER GAMAL GARSHUNI; QQKN
+072E  ; [.1961.0020.0004.072E][.0000.015C.0004.072E] # SYRIAC LETTER PERSIAN GHAMAL; QQKN
+0716  ; [.1962.0020.0002.0716] # SYRIAC LETTER DOTLESS DALATH RISH
+0715  ; [.1963.0020.0002.0715] # SYRIAC LETTER DALATH
+072F  ; [.1963.0020.0004.072F][.0000.015C.0004.072F] # SYRIAC LETTER PERSIAN DHALATH; QQKN
+0717  ; [.1964.0020.0002.0717] # SYRIAC LETTER HE
+0718  ; [.1965.0020.0002.0718] # SYRIAC LETTER WAW
+0719  ; [.1966.0020.0002.0719] # SYRIAC LETTER ZAIN
+074D  ; [.1967.0020.0002.074D] # SYRIAC LETTER SOGDIAN ZHAIN
+071A  ; [.1968.0020.0002.071A] # SYRIAC LETTER HETH
+071B  ; [.1969.0020.0002.071B] # SYRIAC LETTER TETH
+071C  ; [.1969.0020.0004.071C][.0000.015A.0004.071C] # SYRIAC LETTER TETH GARSHUNI; QQKN
+071D  ; [.196A.0020.0002.071D] # SYRIAC LETTER YUDH
+071E  ; [.196B.0020.0002.071E] # SYRIAC LETTER YUDH HE
+071F  ; [.196C.0020.0002.071F] # SYRIAC LETTER KAPH
+074E  ; [.196D.0020.0002.074E] # SYRIAC LETTER SOGDIAN KHAPH
+0720  ; [.196E.0020.0002.0720] # SYRIAC LETTER LAMADH
+0721  ; [.196F.0020.0002.0721] # SYRIAC LETTER MIM
+0722  ; [.1970.0020.0002.0722] # SYRIAC LETTER NUN
+0723  ; [.1971.0020.0002.0723] # SYRIAC LETTER SEMKATH
+0724  ; [.1971.0020.0019.0724] # SYRIAC LETTER FINAL SEMKATH; QQK
+0725  ; [.1972.0020.0002.0725] # SYRIAC LETTER E
+0726  ; [.1973.0020.0002.0726] # SYRIAC LETTER PE
+0727  ; [.1973.0020.0004.0727][.0000.015A.0004.0727] # SYRIAC LETTER REVERSED PE; QQKN
+074F  ; [.1974.0020.0002.074F] # SYRIAC LETTER SOGDIAN FE
+0728  ; [.1975.0020.0002.0728] # SYRIAC LETTER SADHE
+0729  ; [.1976.0020.0002.0729] # SYRIAC LETTER QAPH
+072A  ; [.1977.0020.0002.072A] # SYRIAC LETTER RISH
+072B  ; [.1978.0020.0002.072B] # SYRIAC LETTER SHIN
+072C  ; [.1979.0020.0002.072C] # SYRIAC LETTER TAW
+0780  ; [.197A.0020.0002.0780] # THAANA LETTER HAA
+0799  ; [.197B.0020.0002.0799] # THAANA LETTER HHAA
+079A  ; [.197C.0020.0002.079A] # THAANA LETTER KHAA
+0781  ; [.197D.0020.0002.0781] # THAANA LETTER SHAVIYANI
+0782  ; [.197E.0020.0002.0782] # THAANA LETTER NOONU
+0783  ; [.197F.0020.0002.0783] # THAANA LETTER RAA
+079C  ; [.1980.0020.0002.079C] # THAANA LETTER ZAA
+0784  ; [.1981.0020.0002.0784] # THAANA LETTER BAA
+0785  ; [.1982.0020.0002.0785] # THAANA LETTER LHAVIYANI
+0786  ; [.1983.0020.0002.0786] # THAANA LETTER KAAFU
+0787  ; [.1984.0020.0002.0787] # THAANA LETTER ALIFU
+07A2  ; [.1985.0020.0002.07A2] # THAANA LETTER AINU
+07A3  ; [.1986.0020.0002.07A3] # THAANA LETTER GHAINU
+0788  ; [.1987.0020.0002.0788] # THAANA LETTER VAAVU
+07A5  ; [.1988.0020.0002.07A5] # THAANA LETTER WAAVU
+0789  ; [.1989.0020.0002.0789] # THAANA LETTER MEEMU
+078A  ; [.198A.0020.0002.078A] # THAANA LETTER FAAFU
+078B  ; [.198B.0020.0002.078B] # THAANA LETTER DHAALU
+079B  ; [.198C.0020.0002.079B] # THAANA LETTER THAALU
+078C  ; [.198D.0020.0002.078C] # THAANA LETTER THAA
+0798  ; [.198E.0020.0002.0798] # THAANA LETTER TTAA
+07A0  ; [.198F.0020.0002.07A0] # THAANA LETTER TO
+07A1  ; [.1990.0020.0002.07A1] # THAANA LETTER ZO
+078D  ; [.1991.0020.0002.078D] # THAANA LETTER LAAMU
+078E  ; [.1992.0020.0002.078E] # THAANA LETTER GAAFU
+07A4  ; [.1993.0020.0002.07A4] # THAANA LETTER QAAFU
+078F  ; [.1994.0020.0002.078F] # THAANA LETTER GNAVIYANI
+0790  ; [.1995.0020.0002.0790] # THAANA LETTER SEENU
+079D  ; [.1996.0020.0002.079D] # THAANA LETTER SHEENU
+079E  ; [.1997.0020.0002.079E] # THAANA LETTER SAADHU
+079F  ; [.1998.0020.0002.079F] # THAANA LETTER DAADHU
+0791  ; [.1999.0020.0002.0791] # THAANA LETTER DAVIYANI
+0792  ; [.199A.0020.0002.0792] # THAANA LETTER ZAVIYANI
+0793  ; [.199B.0020.0002.0793] # THAANA LETTER TAVIYANI
+0794  ; [.199C.0020.0002.0794] # THAANA LETTER YAA
+0795  ; [.199D.0020.0002.0795] # THAANA LETTER PAVIYANI
+0796  ; [.199E.0020.0002.0796] # THAANA LETTER JAVIYANI
+0797  ; [.199F.0020.0002.0797] # THAANA LETTER CHAVIYANI
+07B1  ; [.19A0.0020.0002.07B1] # THAANA LETTER NAA
+07A6  ; [.19A1.0020.0002.07A6] # THAANA ABAFILI
+07A7  ; [.19A2.0020.0002.07A7] # THAANA AABAAFILI
+07A8  ; [.19A3.0020.0002.07A8] # THAANA IBIFILI
+07A9  ; [.19A4.0020.0002.07A9] # THAANA EEBEEFILI
+07AA  ; [.19A5.0020.0002.07AA] # THAANA UBUFILI
+07AB  ; [.19A6.0020.0002.07AB] # THAANA OOBOOFILI
+07AC  ; [.19A7.0020.0002.07AC] # THAANA EBEFILI
+07AD  ; [.19A8.0020.0002.07AD] # THAANA EYBEYFILI
+07AE  ; [.19A9.0020.0002.07AE] # THAANA OBOFILI
+07AF  ; [.19AA.0020.0002.07AF] # THAANA OABOAFILI
+07B0  ; [.19AB.0020.0002.07B0] # THAANA SUKUN
+07CA  ; [.19AC.0020.0002.07CA] # NKO LETTER A
+07CB  ; [.19AD.0020.0002.07CB] # NKO LETTER EE
+07CC  ; [.19AE.0020.0002.07CC] # NKO LETTER I
+07CD  ; [.19AF.0020.0002.07CD] # NKO LETTER E
+07CE  ; [.19B0.0020.0002.07CE] # NKO LETTER U
+07CF  ; [.19B1.0020.0002.07CF] # NKO LETTER OO
+07D0  ; [.19B2.0020.0002.07D0] # NKO LETTER O
+07D1  ; [.19B3.0020.0002.07D1] # NKO LETTER DAGBASINNA
+07D2  ; [.19B4.0020.0002.07D2] # NKO LETTER N
+07D3  ; [.19B5.0020.0002.07D3] # NKO LETTER BA
+07D4  ; [.19B6.0020.0002.07D4] # NKO LETTER PA
+07D5  ; [.19B7.0020.0002.07D5] # NKO LETTER TA
+07D6  ; [.19B8.0020.0002.07D6] # NKO LETTER JA
+07E8  ; [.19B8.0020.0004.07E8][.0000.0159.0004.07E8] # NKO LETTER JONA JA; QQKN
+07D7  ; [.19B9.0020.0002.07D7] # NKO LETTER CHA
+07E9  ; [.19B9.0020.0004.07E9][.0000.0159.0004.07E9] # NKO LETTER JONA CHA; QQKN
+07D8  ; [.19BA.0020.0002.07D8] # NKO LETTER DA
+07D9  ; [.19BB.0020.0002.07D9] # NKO LETTER RA
+07EA  ; [.19BB.0020.0004.07EA][.0000.0159.0004.07EA] # NKO LETTER JONA RA; QQKN
+07DA  ; [.19BC.0020.0002.07DA] # NKO LETTER RRA
+07DB  ; [.19BD.0020.0002.07DB] # NKO LETTER SA
+07DC  ; [.19BE.0020.0002.07DC] # NKO LETTER GBA
+07DD  ; [.19BF.0020.0002.07DD] # NKO LETTER FA
+07DE  ; [.19C0.0020.0002.07DE] # NKO LETTER KA
+07DF  ; [.19C1.0020.0002.07DF] # NKO LETTER LA
+07E0  ; [.19C2.0020.0002.07E0] # NKO LETTER NA WOLOSO
+07E1  ; [.19C3.0020.0002.07E1] # NKO LETTER MA
+07E2  ; [.19C4.0020.0002.07E2] # NKO LETTER NYA
+07E3  ; [.19C5.0020.0002.07E3] # NKO LETTER NA
+07E4  ; [.19C6.0020.0002.07E4] # NKO LETTER HA
+07E5  ; [.19C7.0020.0002.07E5] # NKO LETTER WA
+07E6  ; [.19C8.0020.0002.07E6] # NKO LETTER YA
+07E7  ; [.19C9.0020.0002.07E7] # NKO LETTER NYA WOLOSO
+07F4  ; [.19CA.0020.0002.07F4] # NKO HIGH TONE APOSTROPHE
+07F5  ; [.19CB.0020.0002.07F5] # NKO LOW TONE APOSTROPHE
+2D30  ; [.19CC.0020.0002.2D30] # TIFINAGH LETTER YA
+2D31  ; [.19CD.0020.0002.2D31] # TIFINAGH LETTER YAB
+2D32  ; [.19CE.0020.0002.2D32] # TIFINAGH LETTER YABH
+2D33  ; [.19CF.0020.0002.2D33] # TIFINAGH LETTER YAG
+2D34  ; [.19D0.0020.0002.2D34] # TIFINAGH LETTER YAGHH
+2D35  ; [.19D1.0020.0002.2D35] # TIFINAGH LETTER BERBER ACADEMY YAJ
+2D36  ; [.19D2.0020.0002.2D36] # TIFINAGH LETTER YAJ
+2D37  ; [.19D3.0020.0002.2D37] # TIFINAGH LETTER YAD
+2D38  ; [.19D4.0020.0002.2D38] # TIFINAGH LETTER YADH
+2D39  ; [.19D5.0020.0002.2D39] # TIFINAGH LETTER YADD
+2D3A  ; [.19D6.0020.0002.2D3A] # TIFINAGH LETTER YADDH
+2D3B  ; [.19D7.0020.0002.2D3B] # TIFINAGH LETTER YEY
+2D3C  ; [.19D8.0020.0002.2D3C] # TIFINAGH LETTER YAF
+2D3D  ; [.19D9.0020.0002.2D3D] # TIFINAGH LETTER YAK
+2D3E  ; [.19DA.0020.0002.2D3E] # TIFINAGH LETTER TUAREG YAK
+2D3F  ; [.19DB.0020.0002.2D3F] # TIFINAGH LETTER YAKHH
+2D40  ; [.19DC.0020.0002.2D40] # TIFINAGH LETTER YAH
+2D41  ; [.19DD.0020.0002.2D41] # TIFINAGH LETTER BERBER ACADEMY YAH
+2D42  ; [.19DE.0020.0002.2D42] # TIFINAGH LETTER TUAREG YAH
+2D43  ; [.19DF.0020.0002.2D43] # TIFINAGH LETTER YAHH
+2D44  ; [.19E0.0020.0002.2D44] # TIFINAGH LETTER YAA
+2D45  ; [.19E1.0020.0002.2D45] # TIFINAGH LETTER YAKH
+2D46  ; [.19E2.0020.0002.2D46] # TIFINAGH LETTER TUAREG YAKH
+2D47  ; [.19E3.0020.0002.2D47] # TIFINAGH LETTER YAQ
+2D48  ; [.19E4.0020.0002.2D48] # TIFINAGH LETTER TUAREG YAQ
+2D49  ; [.19E5.0020.0002.2D49] # TIFINAGH LETTER YI
+2D4A  ; [.19E6.0020.0002.2D4A] # TIFINAGH LETTER YAZH
+2D4B  ; [.19E7.0020.0002.2D4B] # TIFINAGH LETTER AHAGGAR YAZH
+2D4C  ; [.19E8.0020.0002.2D4C] # TIFINAGH LETTER TUAREG YAZH
+2D4D  ; [.19E9.0020.0002.2D4D] # TIFINAGH LETTER YAL
+2D4E  ; [.19EA.0020.0002.2D4E] # TIFINAGH LETTER YAM
+2D4F  ; [.19EB.0020.0002.2D4F] # TIFINAGH LETTER YAN
+2D50  ; [.19EC.0020.0002.2D50] # TIFINAGH LETTER TUAREG YAGN
+2D51  ; [.19ED.0020.0002.2D51] # TIFINAGH LETTER TUAREG YANG
+2D52  ; [.19EE.0020.0002.2D52] # TIFINAGH LETTER YAP
+2D53  ; [.19EF.0020.0002.2D53] # TIFINAGH LETTER YU
+2D54  ; [.19F0.0020.0002.2D54] # TIFINAGH LETTER YAR
+2D55  ; [.19F1.0020.0002.2D55] # TIFINAGH LETTER YARR
+2D56  ; [.19F2.0020.0002.2D56] # TIFINAGH LETTER YAGH
+2D57  ; [.19F3.0020.0002.2D57] # TIFINAGH LETTER TUAREG YAGH
+2D58  ; [.19F4.0020.0002.2D58] # TIFINAGH LETTER AYER YAGH
+2D59  ; [.19F5.0020.0002.2D59] # TIFINAGH LETTER YAS
+2D5A  ; [.19F6.0020.0002.2D5A] # TIFINAGH LETTER YASS
+2D5B  ; [.19F7.0020.0002.2D5B] # TIFINAGH LETTER YASH
+2D5C  ; [.19F8.0020.0002.2D5C] # TIFINAGH LETTER YAT
+2D5D  ; [.19F9.0020.0002.2D5D] # TIFINAGH LETTER YATH
+2D5E  ; [.19FA.0020.0002.2D5E] # TIFINAGH LETTER YACH
+2D5F  ; [.19FB.0020.0002.2D5F] # TIFINAGH LETTER YATT
+2D60  ; [.19FC.0020.0002.2D60] # TIFINAGH LETTER YAV
+2D61  ; [.19FD.0020.0002.2D61] # TIFINAGH LETTER YAW
+2D62  ; [.19FE.0020.0002.2D62] # TIFINAGH LETTER YAY
+2D63  ; [.19FF.0020.0002.2D63] # TIFINAGH LETTER YAZ
+2D64  ; [.1A00.0020.0002.2D64] # TIFINAGH LETTER TAWELLEMET YAZ
+2D65  ; [.1A01.0020.0002.2D65] # TIFINAGH LETTER YAZZ
+2D6F  ; [.1A02.0020.0002.2D6F] # TIFINAGH MODIFIER LETTER LABIALIZATION MARK
+1200  ; [.1A03.0020.0002.1200] # ETHIOPIC SYLLABLE HA
+1201  ; [.1A04.0020.0002.1201] # ETHIOPIC SYLLABLE HU
+1202  ; [.1A05.0020.0002.1202] # ETHIOPIC SYLLABLE HI
+1203  ; [.1A06.0020.0002.1203] # ETHIOPIC SYLLABLE HAA
+1204  ; [.1A07.0020.0002.1204] # ETHIOPIC SYLLABLE HEE
+1205  ; [.1A08.0020.0002.1205] # ETHIOPIC SYLLABLE HE
+1206  ; [.1A09.0020.0002.1206] # ETHIOPIC SYLLABLE HO
+1207  ; [.1A0A.0020.0002.1207] # ETHIOPIC SYLLABLE HOA
+1208  ; [.1A0B.0020.0002.1208] # ETHIOPIC SYLLABLE LA
+1209  ; [.1A0C.0020.0002.1209] # ETHIOPIC SYLLABLE LU
+120A  ; [.1A0D.0020.0002.120A] # ETHIOPIC SYLLABLE LI
+120B  ; [.1A0E.0020.0002.120B] # ETHIOPIC SYLLABLE LAA
+120C  ; [.1A0F.0020.0002.120C] # ETHIOPIC SYLLABLE LEE
+120D  ; [.1A10.0020.0002.120D] # ETHIOPIC SYLLABLE LE
+120E  ; [.1A11.0020.0002.120E] # ETHIOPIC SYLLABLE LO
+120F  ; [.1A12.0020.0002.120F] # ETHIOPIC SYLLABLE LWA
+2D80  ; [.1A13.0020.0002.2D80] # ETHIOPIC SYLLABLE LOA
+1210  ; [.1A14.0020.0002.1210] # ETHIOPIC SYLLABLE HHA
+1211  ; [.1A15.0020.0002.1211] # ETHIOPIC SYLLABLE HHU
+1212  ; [.1A16.0020.0002.1212] # ETHIOPIC SYLLABLE HHI
+1213  ; [.1A17.0020.0002.1213] # ETHIOPIC SYLLABLE HHAA
+1214  ; [.1A18.0020.0002.1214] # ETHIOPIC SYLLABLE HHEE
+1215  ; [.1A19.0020.0002.1215] # ETHIOPIC SYLLABLE HHE
+1216  ; [.1A1A.0020.0002.1216] # ETHIOPIC SYLLABLE HHO
+1217  ; [.1A1B.0020.0002.1217] # ETHIOPIC SYLLABLE HHWA
+1218  ; [.1A1C.0020.0002.1218] # ETHIOPIC SYLLABLE MA
+1219  ; [.1A1D.0020.0002.1219] # ETHIOPIC SYLLABLE MU
+121A  ; [.1A1E.0020.0002.121A] # ETHIOPIC SYLLABLE MI
+121B  ; [.1A1F.0020.0002.121B] # ETHIOPIC SYLLABLE MAA
+121C  ; [.1A20.0020.0002.121C] # ETHIOPIC SYLLABLE MEE
+121D  ; [.1A21.0020.0002.121D] # ETHIOPIC SYLLABLE ME
+121E  ; [.1A22.0020.0002.121E] # ETHIOPIC SYLLABLE MO
+121F  ; [.1A23.0020.0002.121F] # ETHIOPIC SYLLABLE MWA
+1380  ; [.1A24.0020.0002.1380] # ETHIOPIC SYLLABLE SEBATBEIT MWA
+1381  ; [.1A25.0020.0002.1381] # ETHIOPIC SYLLABLE MWI
+1382  ; [.1A26.0020.0002.1382] # ETHIOPIC SYLLABLE MWEE
+1383  ; [.1A27.0020.0002.1383] # ETHIOPIC SYLLABLE MWE
+2D81  ; [.1A28.0020.0002.2D81] # ETHIOPIC SYLLABLE MOA
+1220  ; [.1A29.0020.0002.1220] # ETHIOPIC SYLLABLE SZA
+1221  ; [.1A2A.0020.0002.1221] # ETHIOPIC SYLLABLE SZU
+1222  ; [.1A2B.0020.0002.1222] # ETHIOPIC SYLLABLE SZI
+1223  ; [.1A2C.0020.0002.1223] # ETHIOPIC SYLLABLE SZAA
+1224  ; [.1A2D.0020.0002.1224] # ETHIOPIC SYLLABLE SZEE
+1225  ; [.1A2E.0020.0002.1225] # ETHIOPIC SYLLABLE SZE
+1226  ; [.1A2F.0020.0002.1226] # ETHIOPIC SYLLABLE SZO
+1227  ; [.1A30.0020.0002.1227] # ETHIOPIC SYLLABLE SZWA
+1228  ; [.1A31.0020.0002.1228] # ETHIOPIC SYLLABLE RA
+1229  ; [.1A32.0020.0002.1229] # ETHIOPIC SYLLABLE RU
+122A  ; [.1A33.0020.0002.122A] # ETHIOPIC SYLLABLE RI
+122B  ; [.1A34.0020.0002.122B] # ETHIOPIC SYLLABLE RAA
+122C  ; [.1A35.0020.0002.122C] # ETHIOPIC SYLLABLE REE
+122D  ; [.1A36.0020.0002.122D] # ETHIOPIC SYLLABLE RE
+122E  ; [.1A37.0020.0002.122E] # ETHIOPIC SYLLABLE RO
+122F  ; [.1A38.0020.0002.122F] # ETHIOPIC SYLLABLE RWA
+2D82  ; [.1A39.0020.0002.2D82] # ETHIOPIC SYLLABLE ROA
+1230  ; [.1A3A.0020.0002.1230] # ETHIOPIC SYLLABLE SA
+1231  ; [.1A3B.0020.0002.1231] # ETHIOPIC SYLLABLE SU
+1232  ; [.1A3C.0020.0002.1232] # ETHIOPIC SYLLABLE SI
+1233  ; [.1A3D.0020.0002.1233] # ETHIOPIC SYLLABLE SAA
+1234  ; [.1A3E.0020.0002.1234] # ETHIOPIC SYLLABLE SEE
+1235  ; [.1A3F.0020.0002.1235] # ETHIOPIC SYLLABLE SE
+1236  ; [.1A40.0020.0002.1236] # ETHIOPIC SYLLABLE SO
+1237  ; [.1A41.0020.0002.1237] # ETHIOPIC SYLLABLE SWA
+2D83  ; [.1A42.0020.0002.2D83] # ETHIOPIC SYLLABLE SOA
+1238  ; [.1A43.0020.0002.1238] # ETHIOPIC SYLLABLE SHA
+1239  ; [.1A44.0020.0002.1239] # ETHIOPIC SYLLABLE SHU
+123A  ; [.1A45.0020.0002.123A] # ETHIOPIC SYLLABLE SHI
+123B  ; [.1A46.0020.0002.123B] # ETHIOPIC SYLLABLE SHAA
+123C  ; [.1A47.0020.0002.123C] # ETHIOPIC SYLLABLE SHEE
+123D  ; [.1A48.0020.0002.123D] # ETHIOPIC SYLLABLE SHE
+123E  ; [.1A49.0020.0002.123E] # ETHIOPIC SYLLABLE SHO
+123F  ; [.1A4A.0020.0002.123F] # ETHIOPIC SYLLABLE SHWA
+2D84  ; [.1A4B.0020.0002.2D84] # ETHIOPIC SYLLABLE SHOA
+1240  ; [.1A4C.0020.0002.1240] # ETHIOPIC SYLLABLE QA
+1241  ; [.1A4D.0020.0002.1241] # ETHIOPIC SYLLABLE QU
+1242  ; [.1A4E.0020.0002.1242] # ETHIOPIC SYLLABLE QI
+1243  ; [.1A4F.0020.0002.1243] # ETHIOPIC SYLLABLE QAA
+1244  ; [.1A50.0020.0002.1244] # ETHIOPIC SYLLABLE QEE
+1245  ; [.1A51.0020.0002.1245] # ETHIOPIC SYLLABLE QE
+1246  ; [.1A52.0020.0002.1246] # ETHIOPIC SYLLABLE QO
+1247  ; [.1A53.0020.0002.1247] # ETHIOPIC SYLLABLE QOA
+1248  ; [.1A54.0020.0002.1248] # ETHIOPIC SYLLABLE QWA
+124A  ; [.1A55.0020.0002.124A] # ETHIOPIC SYLLABLE QWI
+124B  ; [.1A56.0020.0002.124B] # ETHIOPIC SYLLABLE QWAA
+124C  ; [.1A57.0020.0002.124C] # ETHIOPIC SYLLABLE QWEE
+124D  ; [.1A58.0020.0002.124D] # ETHIOPIC SYLLABLE QWE
+1250  ; [.1A59.0020.0002.1250] # ETHIOPIC SYLLABLE QHA
+1251  ; [.1A5A.0020.0002.1251] # ETHIOPIC SYLLABLE QHU
+1252  ; [.1A5B.0020.0002.1252] # ETHIOPIC SYLLABLE QHI
+1253  ; [.1A5C.0020.0002.1253] # ETHIOPIC SYLLABLE QHAA
+1254  ; [.1A5D.0020.0002.1254] # ETHIOPIC SYLLABLE QHEE
+1255  ; [.1A5E.0020.0002.1255] # ETHIOPIC SYLLABLE QHE
+1256  ; [.1A5F.0020.0002.1256] # ETHIOPIC SYLLABLE QHO
+1258  ; [.1A60.0020.0002.1258] # ETHIOPIC SYLLABLE QHWA
+125A  ; [.1A61.0020.0002.125A] # ETHIOPIC SYLLABLE QHWI
+125B  ; [.1A62.0020.0002.125B] # ETHIOPIC SYLLABLE QHWAA
+125C  ; [.1A63.0020.0002.125C] # ETHIOPIC SYLLABLE QHWEE
+125D  ; [.1A64.0020.0002.125D] # ETHIOPIC SYLLABLE QHWE
+1260  ; [.1A65.0020.0002.1260] # ETHIOPIC SYLLABLE BA
+1261  ; [.1A66.0020.0002.1261] # ETHIOPIC SYLLABLE BU
+1262  ; [.1A67.0020.0002.1262] # ETHIOPIC SYLLABLE BI
+1263  ; [.1A68.0020.0002.1263] # ETHIOPIC SYLLABLE BAA
+1264  ; [.1A69.0020.0002.1264] # ETHIOPIC SYLLABLE BEE
+1265  ; [.1A6A.0020.0002.1265] # ETHIOPIC SYLLABLE BE
+1266  ; [.1A6B.0020.0002.1266] # ETHIOPIC SYLLABLE BO
+1267  ; [.1A6C.0020.0002.1267] # ETHIOPIC SYLLABLE BWA
+1384  ; [.1A6D.0020.0002.1384] # ETHIOPIC SYLLABLE SEBATBEIT BWA
+1385  ; [.1A6E.0020.0002.1385] # ETHIOPIC SYLLABLE BWI
+1386  ; [.1A6F.0020.0002.1386] # ETHIOPIC SYLLABLE BWEE
+1387  ; [.1A70.0020.0002.1387] # ETHIOPIC SYLLABLE BWE
+2D85  ; [.1A71.0020.0002.2D85] # ETHIOPIC SYLLABLE BOA
+1268  ; [.1A72.0020.0002.1268] # ETHIOPIC SYLLABLE VA
+1269  ; [.1A73.0020.0002.1269] # ETHIOPIC SYLLABLE VU
+126A  ; [.1A74.0020.0002.126A] # ETHIOPIC SYLLABLE VI
+126B  ; [.1A75.0020.0002.126B] # ETHIOPIC SYLLABLE VAA
+126C  ; [.1A76.0020.0002.126C] # ETHIOPIC SYLLABLE VEE
+126D  ; [.1A77.0020.0002.126D] # ETHIOPIC SYLLABLE VE
+126E  ; [.1A78.0020.0002.126E] # ETHIOPIC SYLLABLE VO
+126F  ; [.1A79.0020.0002.126F] # ETHIOPIC SYLLABLE VWA
+1270  ; [.1A7A.0020.0002.1270] # ETHIOPIC SYLLABLE TA
+1271  ; [.1A7B.0020.0002.1271] # ETHIOPIC SYLLABLE TU
+1272  ; [.1A7C.0020.0002.1272] # ETHIOPIC SYLLABLE TI
+1273  ; [.1A7D.0020.0002.1273] # ETHIOPIC SYLLABLE TAA
+1274  ; [.1A7E.0020.0002.1274] # ETHIOPIC SYLLABLE TEE
+1275  ; [.1A7F.0020.0002.1275] # ETHIOPIC SYLLABLE TE
+1276  ; [.1A80.0020.0002.1276] # ETHIOPIC SYLLABLE TO
+1277  ; [.1A81.0020.0002.1277] # ETHIOPIC SYLLABLE TWA
+2D86  ; [.1A82.0020.0002.2D86] # ETHIOPIC SYLLABLE TOA
+1278  ; [.1A83.0020.0002.1278] # ETHIOPIC SYLLABLE CA
+1279  ; [.1A84.0020.0002.1279] # ETHIOPIC SYLLABLE CU
+127A  ; [.1A85.0020.0002.127A] # ETHIOPIC SYLLABLE CI
+127B  ; [.1A86.0020.0002.127B] # ETHIOPIC SYLLABLE CAA
+127C  ; [.1A87.0020.0002.127C] # ETHIOPIC SYLLABLE CEE
+127D  ; [.1A88.0020.0002.127D] # ETHIOPIC SYLLABLE CE
+127E  ; [.1A89.0020.0002.127E] # ETHIOPIC SYLLABLE CO
+127F  ; [.1A8A.0020.0002.127F] # ETHIOPIC SYLLABLE CWA
+2D87  ; [.1A8B.0020.0002.2D87] # ETHIOPIC SYLLABLE COA
+1280  ; [.1A8C.0020.0002.1280] # ETHIOPIC SYLLABLE XA
+1281  ; [.1A8D.0020.0002.1281] # ETHIOPIC SYLLABLE XU
+1282  ; [.1A8E.0020.0002.1282] # ETHIOPIC SYLLABLE XI
+1283  ; [.1A8F.0020.0002.1283] # ETHIOPIC SYLLABLE XAA
+1284  ; [.1A90.0020.0002.1284] # ETHIOPIC SYLLABLE XEE
+1285  ; [.1A91.0020.0002.1285] # ETHIOPIC SYLLABLE XE
+1286  ; [.1A92.0020.0002.1286] # ETHIOPIC SYLLABLE XO
+1287  ; [.1A93.0020.0002.1287] # ETHIOPIC SYLLABLE XOA
+1288  ; [.1A94.0020.0002.1288] # ETHIOPIC SYLLABLE XWA
+128A  ; [.1A95.0020.0002.128A] # ETHIOPIC SYLLABLE XWI
+128B  ; [.1A96.0020.0002.128B] # ETHIOPIC SYLLABLE XWAA
+128C  ; [.1A97.0020.0002.128C] # ETHIOPIC SYLLABLE XWEE
+128D  ; [.1A98.0020.0002.128D] # ETHIOPIC SYLLABLE XWE
+1290  ; [.1A99.0020.0002.1290] # ETHIOPIC SYLLABLE NA
+1291  ; [.1A9A.0020.0002.1291] # ETHIOPIC SYLLABLE NU
+1292  ; [.1A9B.0020.0002.1292] # ETHIOPIC SYLLABLE NI
+1293  ; [.1A9C.0020.0002.1293] # ETHIOPIC SYLLABLE NAA
+1294  ; [.1A9D.0020.0002.1294] # ETHIOPIC SYLLABLE NEE
+1295  ; [.1A9E.0020.0002.1295] # ETHIOPIC SYLLABLE NE
+1296  ; [.1A9F.0020.0002.1296] # ETHIOPIC SYLLABLE NO
+1297  ; [.1AA0.0020.0002.1297] # ETHIOPIC SYLLABLE NWA
+2D88  ; [.1AA1.0020.0002.2D88] # ETHIOPIC SYLLABLE NOA
+1298  ; [.1AA2.0020.0002.1298] # ETHIOPIC SYLLABLE NYA
+1299  ; [.1AA3.0020.0002.1299] # ETHIOPIC SYLLABLE NYU
+129A  ; [.1AA4.0020.0002.129A] # ETHIOPIC SYLLABLE NYI
+129B  ; [.1AA5.0020.0002.129B] # ETHIOPIC SYLLABLE NYAA
+129C  ; [.1AA6.0020.0002.129C] # ETHIOPIC SYLLABLE NYEE
+129D  ; [.1AA7.0020.0002.129D] # ETHIOPIC SYLLABLE NYE
+129E  ; [.1AA8.0020.0002.129E] # ETHIOPIC SYLLABLE NYO
+129F  ; [.1AA9.0020.0002.129F] # ETHIOPIC SYLLABLE NYWA
+2D89  ; [.1AAA.0020.0002.2D89] # ETHIOPIC SYLLABLE NYOA
+12A0  ; [.1AAB.0020.0002.12A0] # ETHIOPIC SYLLABLE GLOTTAL A
+12A1  ; [.1AAC.0020.0002.12A1] # ETHIOPIC SYLLABLE GLOTTAL U
+12A2  ; [.1AAD.0020.0002.12A2] # ETHIOPIC SYLLABLE GLOTTAL I
+12A3  ; [.1AAE.0020.0002.12A3] # ETHIOPIC SYLLABLE GLOTTAL AA
+12A4  ; [.1AAF.0020.0002.12A4] # ETHIOPIC SYLLABLE GLOTTAL EE
+12A5  ; [.1AB0.0020.0002.12A5] # ETHIOPIC SYLLABLE GLOTTAL E
+12A6  ; [.1AB1.0020.0002.12A6] # ETHIOPIC SYLLABLE GLOTTAL O
+12A7  ; [.1AB2.0020.0002.12A7] # ETHIOPIC SYLLABLE GLOTTAL WA
+2D8A  ; [.1AB3.0020.0002.2D8A] # ETHIOPIC SYLLABLE GLOTTAL OA
+12A8  ; [.1AB4.0020.0002.12A8] # ETHIOPIC SYLLABLE KA
+12A9  ; [.1AB5.0020.0002.12A9] # ETHIOPIC SYLLABLE KU
+12AA  ; [.1AB6.0020.0002.12AA] # ETHIOPIC SYLLABLE KI
+12AB  ; [.1AB7.0020.0002.12AB] # ETHIOPIC SYLLABLE KAA
+12AC  ; [.1AB8.0020.0002.12AC] # ETHIOPIC SYLLABLE KEE
+12AD  ; [.1AB9.0020.0002.12AD] # ETHIOPIC SYLLABLE KE
+12AE  ; [.1ABA.0020.0002.12AE] # ETHIOPIC SYLLABLE KO
+12AF  ; [.1ABB.0020.0002.12AF] # ETHIOPIC SYLLABLE KOA
+12B0  ; [.1ABC.0020.0002.12B0] # ETHIOPIC SYLLABLE KWA
+12B2  ; [.1ABD.0020.0002.12B2] # ETHIOPIC SYLLABLE KWI
+12B3  ; [.1ABE.0020.0002.12B3] # ETHIOPIC SYLLABLE KWAA
+12B4  ; [.1ABF.0020.0002.12B4] # ETHIOPIC SYLLABLE KWEE
+12B5  ; [.1AC0.0020.0002.12B5] # ETHIOPIC SYLLABLE KWE
+12B8  ; [.1AC1.0020.0002.12B8] # ETHIOPIC SYLLABLE KXA
+12B9  ; [.1AC2.0020.0002.12B9] # ETHIOPIC SYLLABLE KXU
+12BA  ; [.1AC3.0020.0002.12BA] # ETHIOPIC SYLLABLE KXI
+12BB  ; [.1AC4.0020.0002.12BB] # ETHIOPIC SYLLABLE KXAA
+12BC  ; [.1AC5.0020.0002.12BC] # ETHIOPIC SYLLABLE KXEE
+12BD  ; [.1AC6.0020.0002.12BD] # ETHIOPIC SYLLABLE KXE
+12BE  ; [.1AC7.0020.0002.12BE] # ETHIOPIC SYLLABLE KXO
+12C0  ; [.1AC8.0020.0002.12C0] # ETHIOPIC SYLLABLE KXWA
+12C2  ; [.1AC9.0020.0002.12C2] # ETHIOPIC SYLLABLE KXWI
+12C3  ; [.1ACA.0020.0002.12C3] # ETHIOPIC SYLLABLE KXWAA
+12C4  ; [.1ACB.0020.0002.12C4] # ETHIOPIC SYLLABLE KXWEE
+12C5  ; [.1ACC.0020.0002.12C5] # ETHIOPIC SYLLABLE KXWE
+12C8  ; [.1ACD.0020.0002.12C8] # ETHIOPIC SYLLABLE WA
+12C9  ; [.1ACE.0020.0002.12C9] # ETHIOPIC SYLLABLE WU
+12CA  ; [.1ACF.0020.0002.12CA] # ETHIOPIC SYLLABLE WI
+12CB  ; [.1AD0.0020.0002.12CB] # ETHIOPIC SYLLABLE WAA
+12CC  ; [.1AD1.0020.0002.12CC] # ETHIOPIC SYLLABLE WEE
+12CD  ; [.1AD2.0020.0002.12CD] # ETHIOPIC SYLLABLE WE
+12CE  ; [.1AD3.0020.0002.12CE] # ETHIOPIC SYLLABLE WO
+12CF  ; [.1AD4.0020.0002.12CF] # ETHIOPIC SYLLABLE WOA
+12D0  ; [.1AD5.0020.0002.12D0] # ETHIOPIC SYLLABLE PHARYNGEAL A
+12D1  ; [.1AD6.0020.0002.12D1] # ETHIOPIC SYLLABLE PHARYNGEAL U
+12D2  ; [.1AD7.0020.0002.12D2] # ETHIOPIC SYLLABLE PHARYNGEAL I
+12D3  ; [.1AD8.0020.0002.12D3] # ETHIOPIC SYLLABLE PHARYNGEAL AA
+12D4  ; [.1AD9.0020.0002.12D4] # ETHIOPIC SYLLABLE PHARYNGEAL EE
+12D5  ; [.1ADA.0020.0002.12D5] # ETHIOPIC SYLLABLE PHARYNGEAL E
+12D6  ; [.1ADB.0020.0002.12D6] # ETHIOPIC SYLLABLE PHARYNGEAL O
+12D8  ; [.1ADC.0020.0002.12D8] # ETHIOPIC SYLLABLE ZA
+12D9  ; [.1ADD.0020.0002.12D9] # ETHIOPIC SYLLABLE ZU
+12DA  ; [.1ADE.0020.0002.12DA] # ETHIOPIC SYLLABLE ZI
+12DB  ; [.1ADF.0020.0002.12DB] # ETHIOPIC SYLLABLE ZAA
+12DC  ; [.1AE0.0020.0002.12DC] # ETHIOPIC SYLLABLE ZEE
+12DD  ; [.1AE1.0020.0002.12DD] # ETHIOPIC SYLLABLE ZE
+12DE  ; [.1AE2.0020.0002.12DE] # ETHIOPIC SYLLABLE ZO
+12DF  ; [.1AE3.0020.0002.12DF] # ETHIOPIC SYLLABLE ZWA
+2D8B  ; [.1AE4.0020.0002.2D8B] # ETHIOPIC SYLLABLE ZOA
+12E0  ; [.1AE5.0020.0002.12E0] # ETHIOPIC SYLLABLE ZHA
+12E1  ; [.1AE6.0020.0002.12E1] # ETHIOPIC SYLLABLE ZHU
+12E2  ; [.1AE7.0020.0002.12E2] # ETHIOPIC SYLLABLE ZHI
+12E3  ; [.1AE8.0020.0002.12E3] # ETHIOPIC SYLLABLE ZHAA
+12E4  ; [.1AE9.0020.0002.12E4] # ETHIOPIC SYLLABLE ZHEE
+12E5  ; [.1AEA.0020.0002.12E5] # ETHIOPIC SYLLABLE ZHE
+12E6  ; [.1AEB.0020.0002.12E6] # ETHIOPIC SYLLABLE ZHO
+12E7  ; [.1AEC.0020.0002.12E7] # ETHIOPIC SYLLABLE ZHWA
+12E8  ; [.1AED.0020.0002.12E8] # ETHIOPIC SYLLABLE YA
+12E9  ; [.1AEE.0020.0002.12E9] # ETHIOPIC SYLLABLE YU
+12EA  ; [.1AEF.0020.0002.12EA] # ETHIOPIC SYLLABLE YI
+12EB  ; [.1AF0.0020.0002.12EB] # ETHIOPIC SYLLABLE YAA
+12EC  ; [.1AF1.0020.0002.12EC] # ETHIOPIC SYLLABLE YEE
+12ED  ; [.1AF2.0020.0002.12ED] # ETHIOPIC SYLLABLE YE
+12EE  ; [.1AF3.0020.0002.12EE] # ETHIOPIC SYLLABLE YO
+12EF  ; [.1AF4.0020.0002.12EF] # ETHIOPIC SYLLABLE YOA
+12F0  ; [.1AF5.0020.0002.12F0] # ETHIOPIC SYLLABLE DA
+12F1  ; [.1AF6.0020.0002.12F1] # ETHIOPIC SYLLABLE DU
+12F2  ; [.1AF7.0020.0002.12F2] # ETHIOPIC SYLLABLE DI
+12F3  ; [.1AF8.0020.0002.12F3] # ETHIOPIC SYLLABLE DAA
+12F4  ; [.1AF9.0020.0002.12F4] # ETHIOPIC SYLLABLE DEE
+12F5  ; [.1AFA.0020.0002.12F5] # ETHIOPIC SYLLABLE DE
+12F6  ; [.1AFB.0020.0002.12F6] # ETHIOPIC SYLLABLE DO
+12F7  ; [.1AFC.0020.0002.12F7] # ETHIOPIC SYLLABLE DWA
+2D8C  ; [.1AFD.0020.0002.2D8C] # ETHIOPIC SYLLABLE DOA
+12F8  ; [.1AFE.0020.0002.12F8] # ETHIOPIC SYLLABLE DDA
+12F9  ; [.1AFF.0020.0002.12F9] # ETHIOPIC SYLLABLE DDU
+12FA  ; [.1B00.0020.0002.12FA] # ETHIOPIC SYLLABLE DDI
+12FB  ; [.1B01.0020.0002.12FB] # ETHIOPIC SYLLABLE DDAA
+12FC  ; [.1B02.0020.0002.12FC] # ETHIOPIC SYLLABLE DDEE
+12FD  ; [.1B03.0020.0002.12FD] # ETHIOPIC SYLLABLE DDE
+12FE  ; [.1B04.0020.0002.12FE] # ETHIOPIC SYLLABLE DDO
+12FF  ; [.1B05.0020.0002.12FF] # ETHIOPIC SYLLABLE DDWA
+2D8D  ; [.1B06.0020.0002.2D8D] # ETHIOPIC SYLLABLE DDOA
+1300  ; [.1B07.0020.0002.1300] # ETHIOPIC SYLLABLE JA
+1301  ; [.1B08.0020.0002.1301] # ETHIOPIC SYLLABLE JU
+1302  ; [.1B09.0020.0002.1302] # ETHIOPIC SYLLABLE JI
+1303  ; [.1B0A.0020.0002.1303] # ETHIOPIC SYLLABLE JAA
+1304  ; [.1B0B.0020.0002.1304] # ETHIOPIC SYLLABLE JEE
+1305  ; [.1B0C.0020.0002.1305] # ETHIOPIC SYLLABLE JE
+1306  ; [.1B0D.0020.0002.1306] # ETHIOPIC SYLLABLE JO
+1307  ; [.1B0E.0020.0002.1307] # ETHIOPIC SYLLABLE JWA
+2D8E  ; [.1B0F.0020.0002.2D8E] # ETHIOPIC SYLLABLE JOA
+1308  ; [.1B10.0020.0002.1308] # ETHIOPIC SYLLABLE GA
+1309  ; [.1B11.0020.0002.1309] # ETHIOPIC SYLLABLE GU
+130A  ; [.1B12.0020.0002.130A] # ETHIOPIC SYLLABLE GI
+130B  ; [.1B13.0020.0002.130B] # ETHIOPIC SYLLABLE GAA
+130C  ; [.1B14.0020.0002.130C] # ETHIOPIC SYLLABLE GEE
+130D  ; [.1B15.0020.0002.130D] # ETHIOPIC SYLLABLE GE
+130E  ; [.1B16.0020.0002.130E] # ETHIOPIC SYLLABLE GO
+130F  ; [.1B17.0020.0002.130F] # ETHIOPIC SYLLABLE GOA
+1310  ; [.1B18.0020.0002.1310] # ETHIOPIC SYLLABLE GWA
+1312  ; [.1B19.0020.0002.1312] # ETHIOPIC SYLLABLE GWI
+1313  ; [.1B1A.0020.0002.1313] # ETHIOPIC SYLLABLE GWAA
+1314  ; [.1B1B.0020.0002.1314] # ETHIOPIC SYLLABLE GWEE
+1315  ; [.1B1C.0020.0002.1315] # ETHIOPIC SYLLABLE GWE
+1318  ; [.1B1D.0020.0002.1318] # ETHIOPIC SYLLABLE GGA
+1319  ; [.1B1E.0020.0002.1319] # ETHIOPIC SYLLABLE GGU
+131A  ; [.1B1F.0020.0002.131A] # ETHIOPIC SYLLABLE GGI
+131B  ; [.1B20.0020.0002.131B] # ETHIOPIC SYLLABLE GGAA
+131C  ; [.1B21.0020.0002.131C] # ETHIOPIC SYLLABLE GGEE
+131D  ; [.1B22.0020.0002.131D] # ETHIOPIC SYLLABLE GGE
+131E  ; [.1B23.0020.0002.131E] # ETHIOPIC SYLLABLE GGO
+131F  ; [.1B24.0020.0002.131F] # ETHIOPIC SYLLABLE GGWAA
+2D93  ; [.1B25.0020.0002.2D93] # ETHIOPIC SYLLABLE GGWA
+2D94  ; [.1B26.0020.0002.2D94] # ETHIOPIC SYLLABLE GGWI
+2D95  ; [.1B27.0020.0002.2D95] # ETHIOPIC SYLLABLE GGWEE
+2D96  ; [.1B28.0020.0002.2D96] # ETHIOPIC SYLLABLE GGWE
+1320  ; [.1B29.0020.0002.1320] # ETHIOPIC SYLLABLE THA
+1321  ; [.1B2A.0020.0002.1321] # ETHIOPIC SYLLABLE THU
+1322  ; [.1B2B.0020.0002.1322] # ETHIOPIC SYLLABLE THI
+1323  ; [.1B2C.0020.0002.1323] # ETHIOPIC SYLLABLE THAA
+1324  ; [.1B2D.0020.0002.1324] # ETHIOPIC SYLLABLE THEE
+1325  ; [.1B2E.0020.0002.1325] # ETHIOPIC SYLLABLE THE
+1326  ; [.1B2F.0020.0002.1326] # ETHIOPIC SYLLABLE THO
+1327  ; [.1B30.0020.0002.1327] # ETHIOPIC SYLLABLE THWA
+2D8F  ; [.1B31.0020.0002.2D8F] # ETHIOPIC SYLLABLE THOA
+1328  ; [.1B32.0020.0002.1328] # ETHIOPIC SYLLABLE CHA
+1329  ; [.1B33.0020.0002.1329] # ETHIOPIC SYLLABLE CHU
+132A  ; [.1B34.0020.0002.132A] # ETHIOPIC SYLLABLE CHI
+132B  ; [.1B35.0020.0002.132B] # ETHIOPIC SYLLABLE CHAA
+132C  ; [.1B36.0020.0002.132C] # ETHIOPIC SYLLABLE CHEE
+132D  ; [.1B37.0020.0002.132D] # ETHIOPIC SYLLABLE CHE
+132E  ; [.1B38.0020.0002.132E] # ETHIOPIC SYLLABLE CHO
+132F  ; [.1B39.0020.0002.132F] # ETHIOPIC SYLLABLE CHWA
+2D90  ; [.1B3A.0020.0002.2D90] # ETHIOPIC SYLLABLE CHOA
+1330  ; [.1B3B.0020.0002.1330] # ETHIOPIC SYLLABLE PHA
+1331  ; [.1B3C.0020.0002.1331] # ETHIOPIC SYLLABLE PHU
+1332  ; [.1B3D.0020.0002.1332] # ETHIOPIC SYLLABLE PHI
+1333  ; [.1B3E.0020.0002.1333] # ETHIOPIC SYLLABLE PHAA
+1334  ; [.1B3F.0020.0002.1334] # ETHIOPIC SYLLABLE PHEE
+1335  ; [.1B40.0020.0002.1335] # ETHIOPIC SYLLABLE PHE
+1336  ; [.1B41.0020.0002.1336] # ETHIOPIC SYLLABLE PHO
+1337  ; [.1B42.0020.0002.1337] # ETHIOPIC SYLLABLE PHWA
+2D91  ; [.1B43.0020.0002.2D91] # ETHIOPIC SYLLABLE PHOA
+1338  ; [.1B44.0020.0002.1338] # ETHIOPIC SYLLABLE TSA
+1339  ; [.1B45.0020.0002.1339] # ETHIOPIC SYLLABLE TSU
+133A  ; [.1B46.0020.0002.133A] # ETHIOPIC SYLLABLE TSI
+133B  ; [.1B47.0020.0002.133B] # ETHIOPIC SYLLABLE TSAA
+133C  ; [.1B48.0020.0002.133C] # ETHIOPIC SYLLABLE TSEE
+133D  ; [.1B49.0020.0002.133D] # ETHIOPIC SYLLABLE TSE
+133E  ; [.1B4A.0020.0002.133E] # ETHIOPIC SYLLABLE TSO
+133F  ; [.1B4B.0020.0002.133F] # ETHIOPIC SYLLABLE TSWA
+1340  ; [.1B4C.0020.0002.1340] # ETHIOPIC SYLLABLE TZA
+1341  ; [.1B4D.0020.0002.1341] # ETHIOPIC SYLLABLE TZU
+1342  ; [.1B4E.0020.0002.1342] # ETHIOPIC SYLLABLE TZI
+1343  ; [.1B4F.0020.0002.1343] # ETHIOPIC SYLLABLE TZAA
+1344  ; [.1B50.0020.0002.1344] # ETHIOPIC SYLLABLE TZEE
+1345  ; [.1B51.0020.0002.1345] # ETHIOPIC SYLLABLE TZE
+1346  ; [.1B52.0020.0002.1346] # ETHIOPIC SYLLABLE TZO
+1347  ; [.1B53.0020.0002.1347] # ETHIOPIC SYLLABLE TZOA
+1348  ; [.1B54.0020.0002.1348] # ETHIOPIC SYLLABLE FA
+1349  ; [.1B55.0020.0002.1349] # ETHIOPIC SYLLABLE FU
+134A  ; [.1B56.0020.0002.134A] # ETHIOPIC SYLLABLE FI
+134B  ; [.1B57.0020.0002.134B] # ETHIOPIC SYLLABLE FAA
+134C  ; [.1B58.0020.0002.134C] # ETHIOPIC SYLLABLE FEE
+134D  ; [.1B59.0020.0002.134D] # ETHIOPIC SYLLABLE FE
+134E  ; [.1B5A.0020.0002.134E] # ETHIOPIC SYLLABLE FO
+134F  ; [.1B5B.0020.0002.134F] # ETHIOPIC SYLLABLE FWA
+1388  ; [.1B5C.0020.0002.1388] # ETHIOPIC SYLLABLE SEBATBEIT FWA
+1389  ; [.1B5D.0020.0002.1389] # ETHIOPIC SYLLABLE FWI
+138A  ; [.1B5E.0020.0002.138A] # ETHIOPIC SYLLABLE FWEE
+138B  ; [.1B5F.0020.0002.138B] # ETHIOPIC SYLLABLE FWE
+1350  ; [.1B60.0020.0002.1350] # ETHIOPIC SYLLABLE PA
+1351  ; [.1B61.0020.0002.1351] # ETHIOPIC SYLLABLE PU
+1352  ; [.1B62.0020.0002.1352] # ETHIOPIC SYLLABLE PI
+1353  ; [.1B63.0020.0002.1353] # ETHIOPIC SYLLABLE PAA
+1354  ; [.1B64.0020.0002.1354] # ETHIOPIC SYLLABLE PEE
+1355  ; [.1B65.0020.0002.1355] # ETHIOPIC SYLLABLE PE
+1356  ; [.1B66.0020.0002.1356] # ETHIOPIC SYLLABLE PO
+1357  ; [.1B67.0020.0002.1357] # ETHIOPIC SYLLABLE PWA
+138C  ; [.1B68.0020.0002.138C] # ETHIOPIC SYLLABLE SEBATBEIT PWA
+138D  ; [.1B69.0020.0002.138D] # ETHIOPIC SYLLABLE PWI
+138E  ; [.1B6A.0020.0002.138E] # ETHIOPIC SYLLABLE PWEE
+138F  ; [.1B6B.0020.0002.138F] # ETHIOPIC SYLLABLE PWE
+2D92  ; [.1B6C.0020.0002.2D92] # ETHIOPIC SYLLABLE POA
+1358  ; [.1B6D.0020.0002.1358] # ETHIOPIC SYLLABLE RYA
+1359  ; [.1B6E.0020.0002.1359] # ETHIOPIC SYLLABLE MYA
+135A  ; [.1B6F.0020.0002.135A] # ETHIOPIC SYLLABLE FYA
+2DA0  ; [.1B70.0020.0002.2DA0] # ETHIOPIC SYLLABLE SSA
+2DA1  ; [.1B71.0020.0002.2DA1] # ETHIOPIC SYLLABLE SSU
+2DA2  ; [.1B72.0020.0002.2DA2] # ETHIOPIC SYLLABLE SSI
+2DA3  ; [.1B73.0020.0002.2DA3] # ETHIOPIC SYLLABLE SSAA
+2DA4  ; [.1B74.0020.0002.2DA4] # ETHIOPIC SYLLABLE SSEE
+2DA5  ; [.1B75.0020.0002.2DA5] # ETHIOPIC SYLLABLE SSE
+2DA6  ; [.1B76.0020.0002.2DA6] # ETHIOPIC SYLLABLE SSO
+2DA8  ; [.1B77.0020.0002.2DA8] # ETHIOPIC SYLLABLE CCA
+2DA9  ; [.1B78.0020.0002.2DA9] # ETHIOPIC SYLLABLE CCU
+2DAA  ; [.1B79.0020.0002.2DAA] # ETHIOPIC SYLLABLE CCI
+2DAB  ; [.1B7A.0020.0002.2DAB] # ETHIOPIC SYLLABLE CCAA
+2DAC  ; [.1B7B.0020.0002.2DAC] # ETHIOPIC SYLLABLE CCEE
+2DAD  ; [.1B7C.0020.0002.2DAD] # ETHIOPIC SYLLABLE CCE
+2DAE  ; [.1B7D.0020.0002.2DAE] # ETHIOPIC SYLLABLE CCO
+2DB0  ; [.1B7E.0020.0002.2DB0] # ETHIOPIC SYLLABLE ZZA
+2DB1  ; [.1B7F.0020.0002.2DB1] # ETHIOPIC SYLLABLE ZZU
+2DB2  ; [.1B80.0020.0002.2DB2] # ETHIOPIC SYLLABLE ZZI
+2DB3  ; [.1B81.0020.0002.2DB3] # ETHIOPIC SYLLABLE ZZAA
+2DB4  ; [.1B82.0020.0002.2DB4] # ETHIOPIC SYLLABLE ZZEE
+2DB5  ; [.1B83.0020.0002.2DB5] # ETHIOPIC SYLLABLE ZZE
+2DB6  ; [.1B84.0020.0002.2DB6] # ETHIOPIC SYLLABLE ZZO
+2DB8  ; [.1B85.0020.0002.2DB8] # ETHIOPIC SYLLABLE CCHA
+2DB9  ; [.1B86.0020.0002.2DB9] # ETHIOPIC SYLLABLE CCHU
+2DBA  ; [.1B87.0020.0002.2DBA] # ETHIOPIC SYLLABLE CCHI
+2DBB  ; [.1B88.0020.0002.2DBB] # ETHIOPIC SYLLABLE CCHAA
+2DBC  ; [.1B89.0020.0002.2DBC] # ETHIOPIC SYLLABLE CCHEE
+2DBD  ; [.1B8A.0020.0002.2DBD] # ETHIOPIC SYLLABLE CCHE
+2DBE  ; [.1B8B.0020.0002.2DBE] # ETHIOPIC SYLLABLE CCHO
+2DC0  ; [.1B8C.0020.0002.2DC0] # ETHIOPIC SYLLABLE QYA
+2DC1  ; [.1B8D.0020.0002.2DC1] # ETHIOPIC SYLLABLE QYU
+2DC2  ; [.1B8E.0020.0002.2DC2] # ETHIOPIC SYLLABLE QYI
+2DC3  ; [.1B8F.0020.0002.2DC3] # ETHIOPIC SYLLABLE QYAA
+2DC4  ; [.1B90.0020.0002.2DC4] # ETHIOPIC SYLLABLE QYEE
+2DC5  ; [.1B91.0020.0002.2DC5] # ETHIOPIC SYLLABLE QYE
+2DC6  ; [.1B92.0020.0002.2DC6] # ETHIOPIC SYLLABLE QYO
+2DC8  ; [.1B93.0020.0002.2DC8] # ETHIOPIC SYLLABLE KYA
+2DC9  ; [.1B94.0020.0002.2DC9] # ETHIOPIC SYLLABLE KYU
+2DCA  ; [.1B95.0020.0002.2DCA] # ETHIOPIC SYLLABLE KYI
+2DCB  ; [.1B96.0020.0002.2DCB] # ETHIOPIC SYLLABLE KYAA
+2DCC  ; [.1B97.0020.0002.2DCC] # ETHIOPIC SYLLABLE KYEE
+2DCD  ; [.1B98.0020.0002.2DCD] # ETHIOPIC SYLLABLE KYE
+2DCE  ; [.1B99.0020.0002.2DCE] # ETHIOPIC SYLLABLE KYO
+2DD0  ; [.1B9A.0020.0002.2DD0] # ETHIOPIC SYLLABLE XYA
+2DD1  ; [.1B9B.0020.0002.2DD1] # ETHIOPIC SYLLABLE XYU
+2DD2  ; [.1B9C.0020.0002.2DD2] # ETHIOPIC SYLLABLE XYI
+2DD3  ; [.1B9D.0020.0002.2DD3] # ETHIOPIC SYLLABLE XYAA
+2DD4  ; [.1B9E.0020.0002.2DD4] # ETHIOPIC SYLLABLE XYEE
+2DD5  ; [.1B9F.0020.0002.2DD5] # ETHIOPIC SYLLABLE XYE
+2DD6  ; [.1BA0.0020.0002.2DD6] # ETHIOPIC SYLLABLE XYO
+2DD8  ; [.1BA1.0020.0002.2DD8] # ETHIOPIC SYLLABLE GYA
+2DD9  ; [.1BA2.0020.0002.2DD9] # ETHIOPIC SYLLABLE GYU
+2DDA  ; [.1BA3.0020.0002.2DDA] # ETHIOPIC SYLLABLE GYI
+2DDB  ; [.1BA4.0020.0002.2DDB] # ETHIOPIC SYLLABLE GYAA
+2DDC  ; [.1BA5.0020.0002.2DDC] # ETHIOPIC SYLLABLE GYEE
+2DDD  ; [.1BA6.0020.0002.2DDD] # ETHIOPIC SYLLABLE GYE
+2DDE  ; [.1BA7.0020.0002.2DDE] # ETHIOPIC SYLLABLE GYO
+0950  ; [.1BA8.0020.0002.0950] # DEVANAGARI OM
+0972  ; [.1BA9.0020.0002.0972] # DEVANAGARI LETTER CANDRA A
+0904  ; [.1BAA.0020.0002.0904] # DEVANAGARI LETTER SHORT A
+0905  ; [.1BAB.0020.0002.0905] # DEVANAGARI LETTER A
+0906  ; [.1BAC.0020.0002.0906] # DEVANAGARI LETTER AA
+0907  ; [.1BAD.0020.0002.0907] # DEVANAGARI LETTER I
+0908  ; [.1BAE.0020.0002.0908] # DEVANAGARI LETTER II
+0909  ; [.1BAF.0020.0002.0909] # DEVANAGARI LETTER U
+090A  ; [.1BB0.0020.0002.090A] # DEVANAGARI LETTER UU
+090B  ; [.1BB1.0020.0002.090B] # DEVANAGARI LETTER VOCALIC R
+0960  ; [.1BB2.0020.0002.0960] # DEVANAGARI LETTER VOCALIC RR
+090C  ; [.1BB3.0020.0002.090C] # DEVANAGARI LETTER VOCALIC L
+0961  ; [.1BB4.0020.0002.0961] # DEVANAGARI LETTER VOCALIC LL
+090D  ; [.1BB5.0020.0002.090D] # DEVANAGARI LETTER CANDRA E
+090E  ; [.1BB6.0020.0002.090E] # DEVANAGARI LETTER SHORT E
+090F  ; [.1BB7.0020.0002.090F] # DEVANAGARI LETTER E
+0910  ; [.1BB8.0020.0002.0910] # DEVANAGARI LETTER AI
+0911  ; [.1BB9.0020.0002.0911] # DEVANAGARI LETTER CANDRA O
+0912  ; [.1BBA.0020.0002.0912] # DEVANAGARI LETTER SHORT O
+0913  ; [.1BBB.0020.0002.0913] # DEVANAGARI LETTER O
+0914  ; [.1BBC.0020.0002.0914] # DEVANAGARI LETTER AU
+0915  ; [.1BBD.0020.0002.0915] # DEVANAGARI LETTER KA
+0958  ; [.1BBD.0020.0002.0915][.0000.00DA.0002.093C] # DEVANAGARI LETTER QA; QQCM
+0916  ; [.1BBE.0020.0002.0916] # DEVANAGARI LETTER KHA
+0959  ; [.1BBE.0020.0002.0916][.0000.00DA.0002.093C] # DEVANAGARI LETTER KHHA; QQCM
+0917  ; [.1BBF.0020.0002.0917] # DEVANAGARI LETTER GA
+095A  ; [.1BBF.0020.0002.0917][.0000.00DA.0002.093C] # DEVANAGARI LETTER GHHA; QQCM
+097B  ; [.1BC0.0020.0002.097B] # DEVANAGARI LETTER GGA
+0918  ; [.1BC1.0020.0002.0918] # DEVANAGARI LETTER GHA
+0919  ; [.1BC2.0020.0002.0919] # DEVANAGARI LETTER NGA
+091A  ; [.1BC3.0020.0002.091A] # DEVANAGARI LETTER CA
+091B  ; [.1BC4.0020.0002.091B] # DEVANAGARI LETTER CHA
+091C  ; [.1BC5.0020.0002.091C] # DEVANAGARI LETTER JA
+095B  ; [.1BC5.0020.0002.091C][.0000.00DA.0002.093C] # DEVANAGARI LETTER ZA; QQCM
+0979  ; [.1BC6.0020.0002.0979] # DEVANAGARI LETTER ZHA
+097C  ; [.1BC7.0020.0002.097C] # DEVANAGARI LETTER JJA
+091D  ; [.1BC8.0020.0002.091D] # DEVANAGARI LETTER JHA
+091E  ; [.1BC9.0020.0002.091E] # DEVANAGARI LETTER NYA
+091F  ; [.1BCA.0020.0002.091F] # DEVANAGARI LETTER TTA
+0920  ; [.1BCB.0020.0002.0920] # DEVANAGARI LETTER TTHA
+0921  ; [.1BCC.0020.0002.0921] # DEVANAGARI LETTER DDA
+095C  ; [.1BCC.0020.0002.0921][.0000.00DA.0002.093C] # DEVANAGARI LETTER DDDHA; QQCM
+097E  ; [.1BCD.0020.0002.097E] # DEVANAGARI LETTER DDDA
+0922  ; [.1BCE.0020.0002.0922] # DEVANAGARI LETTER DDHA
+095D  ; [.1BCE.0020.0002.0922][.0000.00DA.0002.093C] # DEVANAGARI LETTER RHA; QQCM
+0923  ; [.1BCF.0020.0002.0923] # DEVANAGARI LETTER NNA
+0924  ; [.1BD0.0020.0002.0924] # DEVANAGARI LETTER TA
+0925  ; [.1BD1.0020.0002.0925] # DEVANAGARI LETTER THA
+0926  ; [.1BD2.0020.0002.0926] # DEVANAGARI LETTER DA
+0927  ; [.1BD3.0020.0002.0927] # DEVANAGARI LETTER DHA
+0928  ; [.1BD4.0020.0002.0928] # DEVANAGARI LETTER NA
+0929  ; [.1BD4.0020.0002.0928][.0000.00DA.0002.093C] # DEVANAGARI LETTER NNNA; QQCM
+092A  ; [.1BD5.0020.0002.092A] # DEVANAGARI LETTER PA
+092B  ; [.1BD6.0020.0002.092B] # DEVANAGARI LETTER PHA
+095E  ; [.1BD6.0020.0002.092B][.0000.00DA.0002.093C] # DEVANAGARI LETTER FA; QQCM
+092C  ; [.1BD7.0020.0002.092C] # DEVANAGARI LETTER BA
+097F  ; [.1BD8.0020.0002.097F] # DEVANAGARI LETTER BBA
+092D  ; [.1BD9.0020.0002.092D] # DEVANAGARI LETTER BHA
+092E  ; [.1BDA.0020.0002.092E] # DEVANAGARI LETTER MA
+092F  ; [.1BDB.0020.0002.092F] # DEVANAGARI LETTER YA
+095F  ; [.1BDB.0020.0002.092F][.0000.00DA.0002.093C] # DEVANAGARI LETTER YYA; QQCM
+097A  ; [.1BDC.0020.0002.097A] # DEVANAGARI LETTER HEAVY YA
+0930  ; [.1BDD.0020.0002.0930] # DEVANAGARI LETTER RA
+0931  ; [.1BDD.0020.0002.0930][.0000.00DA.0002.093C] # DEVANAGARI LETTER RRA; QQCM
+0932  ; [.1BDE.0020.0002.0932] # DEVANAGARI LETTER LA
+0933  ; [.1BDF.0020.0002.0933] # DEVANAGARI LETTER LLA
+0934  ; [.1BDF.0020.0002.0933][.0000.00DA.0002.093C] # DEVANAGARI LETTER LLLA; QQCM
+0935  ; [.1BE0.0020.0002.0935] # DEVANAGARI LETTER VA
+0936  ; [.1BE1.0020.0002.0936] # DEVANAGARI LETTER SHA
+0937  ; [.1BE2.0020.0002.0937] # DEVANAGARI LETTER SSA
+0938  ; [.1BE3.0020.0002.0938] # DEVANAGARI LETTER SA
+0939  ; [.1BE4.0020.0002.0939] # DEVANAGARI LETTER HA
+093D  ; [.1BE5.0020.0002.093D] # DEVANAGARI SIGN AVAGRAHA
+097D  ; [.1BE6.0020.0002.097D] # DEVANAGARI LETTER GLOTTAL STOP
+1CE9  ; [.1BE7.0020.0002.1CE9] # VEDIC SIGN ANUSVARA ANTARGOMUKHA
+1CEA  ; [.1BE7.0020.0004.1CEA] # VEDIC SIGN ANUSVARA BAHIRGOMUKHA; QQK
+1CEB  ; [.1BE7.0020.0004.1CEB] # VEDIC SIGN ANUSVARA VAMAGOMUKHA; QQK
+1CEC  ; [.1BE7.0020.0004.1CEC] # VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL; QQK
+1CEE  ; [.1BE7.0020.0004.1CEE] # VEDIC SIGN HEXIFORM LONG ANUSVARA; QQK
+1CEF  ; [.1BE7.0020.0004.1CEF] # VEDIC SIGN LONG ANUSVARA; QQK
+1CF0  ; [.1BE7.0020.0004.1CF0] # VEDIC SIGN RTHANG LONG ANUSVARA; QQK
+1CF1  ; [.1BE7.0020.0004.1CF1] # VEDIC SIGN ANUSVARA UBHAYATO MUKHA; QQK
+A8F2  ; [.1BE8.0020.0002.A8F2] # DEVANAGARI SIGN SPACING CANDRABINDU
+A8F3  ; [.1BE8.0020.0004.A8F3] # DEVANAGARI SIGN CANDRABINDU VIRAMA; QQK
+A8F4  ; [.1BE8.0020.0004.A8F4] # DEVANAGARI SIGN DOUBLE CANDRABINDU VIRAMA; QQK
+A8F5  ; [.1BE8.0020.0004.A8F5] # DEVANAGARI SIGN CANDRABINDU TWO; QQK
+A8F6  ; [.1BE8.0020.0004.A8F6] # DEVANAGARI SIGN CANDRABINDU THREE; QQK
+A8F7  ; [.1BE8.0020.0004.A8F7] # DEVANAGARI SIGN CANDRABINDU AVAGRAHA; QQK
+A8FB  ; [.1BE9.0020.0002.A8FB] # DEVANAGARI HEADSTROKE
+093E  ; [.1BEA.0020.0002.093E] # DEVANAGARI VOWEL SIGN AA
+093F  ; [.1BEB.0020.0002.093F] # DEVANAGARI VOWEL SIGN I
+0940  ; [.1BEC.0020.0002.0940] # DEVANAGARI VOWEL SIGN II
+0941  ; [.1BED.0020.0002.0941] # DEVANAGARI VOWEL SIGN U
+0942  ; [.1BEE.0020.0002.0942] # DEVANAGARI VOWEL SIGN UU
+0943  ; [.1BEF.0020.0002.0943] # DEVANAGARI VOWEL SIGN VOCALIC R
+0944  ; [.1BF0.0020.0002.0944] # DEVANAGARI VOWEL SIGN VOCALIC RR
+0962  ; [.1BF1.0020.0002.0962] # DEVANAGARI VOWEL SIGN VOCALIC L
+0963  ; [.1BF2.0020.0002.0963] # DEVANAGARI VOWEL SIGN VOCALIC LL
+0945  ; [.1BF3.0020.0002.0945] # DEVANAGARI VOWEL SIGN CANDRA E
+0955  ; [.1BF4.0020.0002.0955] # DEVANAGARI VOWEL SIGN CANDRA LONG E
+0946  ; [.1BF5.0020.0002.0946] # DEVANAGARI VOWEL SIGN SHORT E
+0947  ; [.1BF6.0020.0002.0947] # DEVANAGARI VOWEL SIGN E
+094E  ; [.1BF7.0020.0002.094E] # DEVANAGARI VOWEL SIGN PRISHTHAMATRA E
+0948  ; [.1BF8.0020.0002.0948] # DEVANAGARI VOWEL SIGN AI
+0949  ; [.1BF9.0020.0002.0949] # DEVANAGARI VOWEL SIGN CANDRA O
+094A  ; [.1BFA.0020.0002.094A] # DEVANAGARI VOWEL SIGN SHORT O
+094B  ; [.1BFB.0020.0002.094B] # DEVANAGARI VOWEL SIGN O
+094C  ; [.1BFC.0020.0002.094C] # DEVANAGARI VOWEL SIGN AU
+094D  ; [.1BFD.0020.0002.094D] # DEVANAGARI SIGN VIRAMA
+0985  ; [.1BFE.0020.0002.0985] # BENGALI LETTER A
+0986  ; [.1BFF.0020.0002.0986] # BENGALI LETTER AA
+0987  ; [.1C00.0020.0002.0987] # BENGALI LETTER I
+0988  ; [.1C01.0020.0002.0988] # BENGALI LETTER II
+0989  ; [.1C02.0020.0002.0989] # BENGALI LETTER U
+098A  ; [.1C03.0020.0002.098A] # BENGALI LETTER UU
+098B  ; [.1C04.0020.0002.098B] # BENGALI LETTER VOCALIC R
+09E0  ; [.1C05.0020.0002.09E0] # BENGALI LETTER VOCALIC RR
+098C  ; [.1C06.0020.0002.098C] # BENGALI LETTER VOCALIC L
+09E1  ; [.1C07.0020.0002.09E1] # BENGALI LETTER VOCALIC LL
+098F  ; [.1C08.0020.0002.098F] # BENGALI LETTER E
+0990  ; [.1C09.0020.0002.0990] # BENGALI LETTER AI
+0993  ; [.1C0A.0020.0002.0993] # BENGALI LETTER O
+0994  ; [.1C0B.0020.0002.0994] # BENGALI LETTER AU
+0995  ; [.1C0C.0020.0002.0995] # BENGALI LETTER KA
+0996  ; [.1C0D.0020.0002.0996] # BENGALI LETTER KHA
+0997  ; [.1C0E.0020.0002.0997] # BENGALI LETTER GA
+0998  ; [.1C0F.0020.0002.0998] # BENGALI LETTER GHA
+0999  ; [.1C10.0020.0002.0999] # BENGALI LETTER NGA
+099A  ; [.1C11.0020.0002.099A] # BENGALI LETTER CA
+099B  ; [.1C12.0020.0002.099B] # BENGALI LETTER CHA
+099C  ; [.1C13.0020.0002.099C] # BENGALI LETTER JA
+099D  ; [.1C14.0020.0002.099D] # BENGALI LETTER JHA
+099E  ; [.1C15.0020.0002.099E] # BENGALI LETTER NYA
+099F  ; [.1C16.0020.0002.099F] # BENGALI LETTER TTA
+09A0  ; [.1C17.0020.0002.09A0] # BENGALI LETTER TTHA
+09A1  ; [.1C18.0020.0002.09A1] # BENGALI LETTER DDA
+09DC  ; [.1C18.0020.0002.09A1][.0000.00DE.0002.09BC] # BENGALI LETTER RRA; QQCM
+09A2  ; [.1C19.0020.0002.09A2] # BENGALI LETTER DDHA
+09DD  ; [.1C19.0020.0002.09A2][.0000.00DE.0002.09BC] # BENGALI LETTER RHA; QQCM
+09A3  ; [.1C1A.0020.0002.09A3] # BENGALI LETTER NNA
+09A4  ; [.1C1B.0020.0002.09A4] # BENGALI LETTER TA
+09CE  ; [.1C1B.0020.0004.09CE][.1C3C.0020.0004.09CE] # BENGALI LETTER KHANDA TA; QQKN
+09A5  ; [.1C1C.0020.0002.09A5] # BENGALI LETTER THA
+09A6  ; [.1C1D.0020.0002.09A6] # BENGALI LETTER DA
+09A7  ; [.1C1E.0020.0002.09A7] # BENGALI LETTER DHA
+09A8  ; [.1C1F.0020.0002.09A8] # BENGALI LETTER NA
+09AA  ; [.1C20.0020.0002.09AA] # BENGALI LETTER PA
+09AB  ; [.1C21.0020.0002.09AB] # BENGALI LETTER PHA
+09AC  ; [.1C22.0020.0002.09AC] # BENGALI LETTER BA
+09AD  ; [.1C23.0020.0002.09AD] # BENGALI LETTER BHA
+09AE  ; [.1C24.0020.0002.09AE] # BENGALI LETTER MA
+09AF  ; [.1C25.0020.0002.09AF] # BENGALI LETTER YA
+09DF  ; [.1C25.0020.0002.09AF][.0000.00DE.0002.09BC] # BENGALI LETTER YYA; QQCM
+09B0  ; [.1C26.0020.0002.09B0] # BENGALI LETTER RA
+09F0  ; [.1C27.0020.0002.09F0] # BENGALI LETTER RA WITH MIDDLE DIAGONAL
+09B2  ; [.1C28.0020.0002.09B2] # BENGALI LETTER LA
+09F1  ; [.1C29.0020.0002.09F1] # BENGALI LETTER RA WITH LOWER DIAGONAL
+09B6  ; [.1C2A.0020.0002.09B6] # BENGALI LETTER SHA
+09B7  ; [.1C2B.0020.0002.09B7] # BENGALI LETTER SSA
+09B8  ; [.1C2C.0020.0002.09B8] # BENGALI LETTER SA
+09B9  ; [.1C2D.0020.0002.09B9] # BENGALI LETTER HA
+09BD  ; [.1C2E.0020.0002.09BD] # BENGALI SIGN AVAGRAHA
+09BE  ; [.1C2F.0020.0002.09BE] # BENGALI VOWEL SIGN AA
+09BF  ; [.1C30.0020.0002.09BF] # BENGALI VOWEL SIGN I
+09C0  ; [.1C31.0020.0002.09C0] # BENGALI VOWEL SIGN II
+09C1  ; [.1C32.0020.0002.09C1] # BENGALI VOWEL SIGN U
+09C2  ; [.1C33.0020.0002.09C2] # BENGALI VOWEL SIGN UU
+09C3  ; [.1C34.0020.0002.09C3] # BENGALI VOWEL SIGN VOCALIC R
+09C4  ; [.1C35.0020.0002.09C4] # BENGALI VOWEL SIGN VOCALIC RR
+09E2  ; [.1C36.0020.0002.09E2] # BENGALI VOWEL SIGN VOCALIC L
+09E3  ; [.1C37.0020.0002.09E3] # BENGALI VOWEL SIGN VOCALIC LL
+09C7  ; [.1C38.0020.0002.09C7] # BENGALI VOWEL SIGN E
+09C8  ; [.1C39.0020.0002.09C8] # BENGALI VOWEL SIGN AI
+09CB  ; [.1C3A.0020.0002.09CB] # BENGALI VOWEL SIGN O
+09C7 09BE ; [.1C3A.0020.0002.09CB] # BENGALI VOWEL SIGN O
+09CC  ; [.1C3B.0020.0002.09CC] # BENGALI VOWEL SIGN AU
+09C7 09D7 ; [.1C3B.0020.0002.09CC] # BENGALI VOWEL SIGN AU
+09CD  ; [.1C3C.0020.0002.09CD] # BENGALI SIGN VIRAMA
+09D7  ; [.1C3D.0020.0002.09D7] # BENGALI AU LENGTH MARK
+0A74  ; [.1C3E.0020.0002.0A74] # GURMUKHI EK ONKAR
+0A73  ; [.1C3F.0020.0002.0A73] # GURMUKHI URA
+0A09  ; [.1C40.0020.0002.0A09] # GURMUKHI LETTER U
+0A0A  ; [.1C41.0020.0002.0A0A] # GURMUKHI LETTER UU
+0A13  ; [.1C42.0020.0002.0A13] # GURMUKHI LETTER OO
+0A05  ; [.1C43.0020.0002.0A05] # GURMUKHI LETTER A
+0A06  ; [.1C44.0020.0002.0A06] # GURMUKHI LETTER AA
+0A10  ; [.1C45.0020.0002.0A10] # GURMUKHI LETTER AI
+0A14  ; [.1C46.0020.0002.0A14] # GURMUKHI LETTER AU
+0A72  ; [.1C47.0020.0002.0A72] # GURMUKHI IRI
+0A07  ; [.1C48.0020.0002.0A07] # GURMUKHI LETTER I
+0A08  ; [.1C49.0020.0002.0A08] # GURMUKHI LETTER II
+0A0F  ; [.1C4A.0020.0002.0A0F] # GURMUKHI LETTER EE
+0A38  ; [.1C4B.0020.0002.0A38] # GURMUKHI LETTER SA
+0A36  ; [.1C4B.0020.0002.0A38][.0000.00E2.0002.0A3C] # GURMUKHI LETTER SHA; QQCM
+0A39  ; [.1C4C.0020.0002.0A39] # GURMUKHI LETTER HA
+0A51  ; [.1C4D.0020.0002.0A51] # GURMUKHI SIGN UDAAT
+0A15  ; [.1C4E.0020.0002.0A15] # GURMUKHI LETTER KA
+0A16  ; [.1C4F.0020.0002.0A16] # GURMUKHI LETTER KHA
+0A59  ; [.1C4F.0020.0002.0A16][.0000.00E2.0002.0A3C] # GURMUKHI LETTER KHHA; QQCM
+0A17  ; [.1C50.0020.0002.0A17] # GURMUKHI LETTER GA
+0A5A  ; [.1C50.0020.0002.0A17][.0000.00E2.0002.0A3C] # GURMUKHI LETTER GHHA; QQCM
+0A18  ; [.1C51.0020.0002.0A18] # GURMUKHI LETTER GHA
+0A19  ; [.1C52.0020.0002.0A19] # GURMUKHI LETTER NGA
+0A1A  ; [.1C53.0020.0002.0A1A] # GURMUKHI LETTER CA
+0A1B  ; [.1C54.0020.0002.0A1B] # GURMUKHI LETTER CHA
+0A1C  ; [.1C55.0020.0002.0A1C] # GURMUKHI LETTER JA
+0A5B  ; [.1C55.0020.0002.0A1C][.0000.00E2.0002.0A3C] # GURMUKHI LETTER ZA; QQCM
+0A1D  ; [.1C56.0020.0002.0A1D] # GURMUKHI LETTER JHA
+0A1E  ; [.1C57.0020.0002.0A1E] # GURMUKHI LETTER NYA
+0A1F  ; [.1C58.0020.0002.0A1F] # GURMUKHI LETTER TTA
+0A20  ; [.1C59.0020.0002.0A20] # GURMUKHI LETTER TTHA
+0A21  ; [.1C5A.0020.0002.0A21] # GURMUKHI LETTER DDA
+0A22  ; [.1C5B.0020.0002.0A22] # GURMUKHI LETTER DDHA
+0A23  ; [.1C5C.0020.0002.0A23] # GURMUKHI LETTER NNA
+0A24  ; [.1C5D.0020.0002.0A24] # GURMUKHI LETTER TA
+0A25  ; [.1C5E.0020.0002.0A25] # GURMUKHI LETTER THA
+0A26  ; [.1C5F.0020.0002.0A26] # GURMUKHI LETTER DA
+0A27  ; [.1C60.0020.0002.0A27] # GURMUKHI LETTER DHA
+0A28  ; [.1C61.0020.0002.0A28] # GURMUKHI LETTER NA
+0A2A  ; [.1C62.0020.0002.0A2A] # GURMUKHI LETTER PA
+0A2B  ; [.1C63.0020.0002.0A2B] # GURMUKHI LETTER PHA
+0A5E  ; [.1C63.0020.0002.0A2B][.0000.00E2.0002.0A3C] # GURMUKHI LETTER FA; QQCM
+0A2C  ; [.1C64.0020.0002.0A2C] # GURMUKHI LETTER BA
+0A2D  ; [.1C65.0020.0002.0A2D] # GURMUKHI LETTER BHA
+0A2E  ; [.1C66.0020.0002.0A2E] # GURMUKHI LETTER MA
+0A2F  ; [.1C67.0020.0002.0A2F] # GURMUKHI LETTER YA
+0A75  ; [.1C68.0020.0002.0A75] # GURMUKHI SIGN YAKASH
+0A30  ; [.1C69.0020.0002.0A30] # GURMUKHI LETTER RA
+0A32  ; [.1C6A.0020.0002.0A32] # GURMUKHI LETTER LA
+0A33  ; [.1C6A.0020.0002.0A32][.0000.00E2.0002.0A3C] # GURMUKHI LETTER LLA; QQCM
+0A35  ; [.1C6B.0020.0002.0A35] # GURMUKHI LETTER VA
+0A5C  ; [.1C6C.0020.0002.0A5C] # GURMUKHI LETTER RRA
+0A3E  ; [.1C6D.0020.0002.0A3E] # GURMUKHI VOWEL SIGN AA
+0A3F  ; [.1C6E.0020.0002.0A3F] # GURMUKHI VOWEL SIGN I
+0A40  ; [.1C6F.0020.0002.0A40] # GURMUKHI VOWEL SIGN II
+0A41  ; [.1C70.0020.0002.0A41] # GURMUKHI VOWEL SIGN U
+0A42  ; [.1C71.0020.0002.0A42] # GURMUKHI VOWEL SIGN UU
+0A47  ; [.1C72.0020.0002.0A47] # GURMUKHI VOWEL SIGN EE
+0A48  ; [.1C73.0020.0002.0A48] # GURMUKHI VOWEL SIGN AI
+0A4B  ; [.1C74.0020.0002.0A4B] # GURMUKHI VOWEL SIGN OO
+0A4C  ; [.1C75.0020.0002.0A4C] # GURMUKHI VOWEL SIGN AU
+0A4D  ; [.1C76.0020.0002.0A4D] # GURMUKHI SIGN VIRAMA
+0AD0  ; [.1C77.0020.0002.0AD0] # GUJARATI OM
+0A85  ; [.1C78.0020.0002.0A85] # GUJARATI LETTER A
+0A86  ; [.1C79.0020.0002.0A86] # GUJARATI LETTER AA
+0A87  ; [.1C7A.0020.0002.0A87] # GUJARATI LETTER I
+0A88  ; [.1C7B.0020.0002.0A88] # GUJARATI LETTER II
+0A89  ; [.1C7C.0020.0002.0A89] # GUJARATI LETTER U
+0A8A  ; [.1C7D.0020.0002.0A8A] # GUJARATI LETTER UU
+0A8B  ; [.1C7E.0020.0002.0A8B] # GUJARATI LETTER VOCALIC R
+0AE0  ; [.1C7F.0020.0002.0AE0] # GUJARATI LETTER VOCALIC RR
+0A8C  ; [.1C80.0020.0002.0A8C] # GUJARATI LETTER VOCALIC L
+0AE1  ; [.1C81.0020.0002.0AE1] # GUJARATI LETTER VOCALIC LL
+0A8D  ; [.1C82.0020.0002.0A8D] # GUJARATI VOWEL CANDRA E
+0A8F  ; [.1C83.0020.0002.0A8F] # GUJARATI LETTER E
+0A90  ; [.1C84.0020.0002.0A90] # GUJARATI LETTER AI
+0A91  ; [.1C85.0020.0002.0A91] # GUJARATI VOWEL CANDRA O
+0A93  ; [.1C86.0020.0002.0A93] # GUJARATI LETTER O
+0A94  ; [.1C87.0020.0002.0A94] # GUJARATI LETTER AU
+0A95  ; [.1C88.0020.0002.0A95] # GUJARATI LETTER KA
+0A96  ; [.1C89.0020.0002.0A96] # GUJARATI LETTER KHA
+0A97  ; [.1C8A.0020.0002.0A97] # GUJARATI LETTER GA
+0A98  ; [.1C8B.0020.0002.0A98] # GUJARATI LETTER GHA
+0A99  ; [.1C8C.0020.0002.0A99] # GUJARATI LETTER NGA
+0A9A  ; [.1C8D.0020.0002.0A9A] # GUJARATI LETTER CA
+0A9B  ; [.1C8E.0020.0002.0A9B] # GUJARATI LETTER CHA
+0A9C  ; [.1C8F.0020.0002.0A9C] # GUJARATI LETTER JA
+0A9D  ; [.1C90.0020.0002.0A9D] # GUJARATI LETTER JHA
+0A9E  ; [.1C91.0020.0002.0A9E] # GUJARATI LETTER NYA
+0A9F  ; [.1C92.0020.0002.0A9F] # GUJARATI LETTER TTA
+0AA0  ; [.1C93.0020.0002.0AA0] # GUJARATI LETTER TTHA
+0AA1  ; [.1C94.0020.0002.0AA1] # GUJARATI LETTER DDA
+0AA2  ; [.1C95.0020.0002.0AA2] # GUJARATI LETTER DDHA
+0AA3  ; [.1C96.0020.0002.0AA3] # GUJARATI LETTER NNA
+0AA4  ; [.1C97.0020.0002.0AA4] # GUJARATI LETTER TA
+0AA5  ; [.1C98.0020.0002.0AA5] # GUJARATI LETTER THA
+0AA6  ; [.1C99.0020.0002.0AA6] # GUJARATI LETTER DA
+0AA7  ; [.1C9A.0020.0002.0AA7] # GUJARATI LETTER DHA
+0AA8  ; [.1C9B.0020.0002.0AA8] # GUJARATI LETTER NA
+0AAA  ; [.1C9C.0020.0002.0AAA] # GUJARATI LETTER PA
+0AAB  ; [.1C9D.0020.0002.0AAB] # GUJARATI LETTER PHA
+0AAC  ; [.1C9E.0020.0002.0AAC] # GUJARATI LETTER BA
+0AAD  ; [.1C9F.0020.0002.0AAD] # GUJARATI LETTER BHA
+0AAE  ; [.1CA0.0020.0002.0AAE] # GUJARATI LETTER MA
+0AAF  ; [.1CA1.0020.0002.0AAF] # GUJARATI LETTER YA
+0AB0  ; [.1CA2.0020.0002.0AB0] # GUJARATI LETTER RA
+0AB2  ; [.1CA3.0020.0002.0AB2] # GUJARATI LETTER LA
+0AB5  ; [.1CA4.0020.0002.0AB5] # GUJARATI LETTER VA
+0AB6  ; [.1CA5.0020.0002.0AB6] # GUJARATI LETTER SHA
+0AB7  ; [.1CA6.0020.0002.0AB7] # GUJARATI LETTER SSA
+0AB8  ; [.1CA7.0020.0002.0AB8] # GUJARATI LETTER SA
+0AB9  ; [.1CA8.0020.0002.0AB9] # GUJARATI LETTER HA
+0AB3  ; [.1CA9.0020.0002.0AB3] # GUJARATI LETTER LLA
+0ABD  ; [.1CAA.0020.0002.0ABD] # GUJARATI SIGN AVAGRAHA
+0ABE  ; [.1CAB.0020.0002.0ABE] # GUJARATI VOWEL SIGN AA
+0ABF  ; [.1CAC.0020.0002.0ABF] # GUJARATI VOWEL SIGN I
+0AC0  ; [.1CAD.0020.0002.0AC0] # GUJARATI VOWEL SIGN II
+0AC1  ; [.1CAE.0020.0002.0AC1] # GUJARATI VOWEL SIGN U
+0AC2  ; [.1CAF.0020.0002.0AC2] # GUJARATI VOWEL SIGN UU
+0AC3  ; [.1CB0.0020.0002.0AC3] # GUJARATI VOWEL SIGN VOCALIC R
+0AC4  ; [.1CB1.0020.0002.0AC4] # GUJARATI VOWEL SIGN VOCALIC RR
+0AE2  ; [.1CB2.0020.0002.0AE2] # GUJARATI VOWEL SIGN VOCALIC L
+0AE3  ; [.1CB3.0020.0002.0AE3] # GUJARATI VOWEL SIGN VOCALIC LL
+0AC5  ; [.1CB4.0020.0002.0AC5] # GUJARATI VOWEL SIGN CANDRA E
+0AC7  ; [.1CB5.0020.0002.0AC7] # GUJARATI VOWEL SIGN E
+0AC8  ; [.1CB6.0020.0002.0AC8] # GUJARATI VOWEL SIGN AI
+0AC9  ; [.1CB7.0020.0002.0AC9] # GUJARATI VOWEL SIGN CANDRA O
+0ACB  ; [.1CB8.0020.0002.0ACB] # GUJARATI VOWEL SIGN O
+0ACC  ; [.1CB9.0020.0002.0ACC] # GUJARATI VOWEL SIGN AU
+0ACD  ; [.1CBA.0020.0002.0ACD] # GUJARATI SIGN VIRAMA
+0B05  ; [.1CBB.0020.0002.0B05] # ORIYA LETTER A
+0B06  ; [.1CBC.0020.0002.0B06] # ORIYA LETTER AA
+0B07  ; [.1CBD.0020.0002.0B07] # ORIYA LETTER I
+0B08  ; [.1CBE.0020.0002.0B08] # ORIYA LETTER II
+0B09  ; [.1CBF.0020.0002.0B09] # ORIYA LETTER U
+0B0A  ; [.1CC0.0020.0002.0B0A] # ORIYA LETTER UU
+0B0B  ; [.1CC1.0020.0002.0B0B] # ORIYA LETTER VOCALIC R
+0B60  ; [.1CC2.0020.0002.0B60] # ORIYA LETTER VOCALIC RR
+0B0C  ; [.1CC3.0020.0002.0B0C] # ORIYA LETTER VOCALIC L
+0B61  ; [.1CC4.0020.0002.0B61] # ORIYA LETTER VOCALIC LL
+0B0F  ; [.1CC5.0020.0002.0B0F] # ORIYA LETTER E
+0B10  ; [.1CC6.0020.0002.0B10] # ORIYA LETTER AI
+0B13  ; [.1CC7.0020.0002.0B13] # ORIYA LETTER O
+0B14  ; [.1CC8.0020.0002.0B14] # ORIYA LETTER AU
+0B15  ; [.1CC9.0020.0002.0B15] # ORIYA LETTER KA
+0B16  ; [.1CCA.0020.0002.0B16] # ORIYA LETTER KHA
+0B17  ; [.1CCB.0020.0002.0B17] # ORIYA LETTER GA
+0B18  ; [.1CCC.0020.0002.0B18] # ORIYA LETTER GHA
+0B19  ; [.1CCD.0020.0002.0B19] # ORIYA LETTER NGA
+0B1A  ; [.1CCE.0020.0002.0B1A] # ORIYA LETTER CA
+0B1B  ; [.1CCF.0020.0002.0B1B] # ORIYA LETTER CHA
+0B1C  ; [.1CD0.0020.0002.0B1C] # ORIYA LETTER JA
+0B1D  ; [.1CD1.0020.0002.0B1D] # ORIYA LETTER JHA
+0B1E  ; [.1CD2.0020.0002.0B1E] # ORIYA LETTER NYA
+0B1F  ; [.1CD3.0020.0002.0B1F] # ORIYA LETTER TTA
+0B20  ; [.1CD4.0020.0002.0B20] # ORIYA LETTER TTHA
+0B21  ; [.1CD5.0020.0002.0B21] # ORIYA LETTER DDA
+0B5C  ; [.1CD5.0020.0002.0B21][.0000.00EC.0002.0B3C] # ORIYA LETTER RRA; QQCM
+0B22  ; [.1CD6.0020.0002.0B22] # ORIYA LETTER DDHA
+0B5D  ; [.1CD6.0020.0002.0B22][.0000.00EC.0002.0B3C] # ORIYA LETTER RHA; QQCM
+0B23  ; [.1CD7.0020.0002.0B23] # ORIYA LETTER NNA
+0B24  ; [.1CD8.0020.0002.0B24] # ORIYA LETTER TA
+0B25  ; [.1CD9.0020.0002.0B25] # ORIYA LETTER THA
+0B26  ; [.1CDA.0020.0002.0B26] # ORIYA LETTER DA
+0B27  ; [.1CDB.0020.0002.0B27] # ORIYA LETTER DHA
+0B28  ; [.1CDC.0020.0002.0B28] # ORIYA LETTER NA
+0B2A  ; [.1CDD.0020.0002.0B2A] # ORIYA LETTER PA
+0B2B  ; [.1CDE.0020.0002.0B2B] # ORIYA LETTER PHA
+0B2C  ; [.1CDF.0020.0002.0B2C] # ORIYA LETTER BA
+0B2D  ; [.1CE0.0020.0002.0B2D] # ORIYA LETTER BHA
+0B2E  ; [.1CE1.0020.0002.0B2E] # ORIYA LETTER MA
+0B2F  ; [.1CE2.0020.0002.0B2F] # ORIYA LETTER YA
+0B5F  ; [.1CE3.0020.0002.0B5F] # ORIYA LETTER YYA
+0B30  ; [.1CE4.0020.0002.0B30] # ORIYA LETTER RA
+0B32  ; [.1CE5.0020.0002.0B32] # ORIYA LETTER LA
+0B33  ; [.1CE6.0020.0002.0B33] # ORIYA LETTER LLA
+0B35  ; [.1CE7.0020.0002.0B35] # ORIYA LETTER VA
+0B71  ; [.1CE8.0020.0002.0B71] # ORIYA LETTER WA
+0B36  ; [.1CE9.0020.0002.0B36] # ORIYA LETTER SHA
+0B37  ; [.1CEA.0020.0002.0B37] # ORIYA LETTER SSA
+0B38  ; [.1CEB.0020.0002.0B38] # ORIYA LETTER SA
+0B39  ; [.1CEC.0020.0002.0B39] # ORIYA LETTER HA
+0B3D  ; [.1CED.0020.0002.0B3D] # ORIYA SIGN AVAGRAHA
+0B3E  ; [.1CEE.0020.0002.0B3E] # ORIYA VOWEL SIGN AA
+0B3F  ; [.1CEF.0020.0002.0B3F] # ORIYA VOWEL SIGN I
+0B40  ; [.1CF0.0020.0002.0B40] # ORIYA VOWEL SIGN II
+0B41  ; [.1CF1.0020.0002.0B41] # ORIYA VOWEL SIGN U
+0B42  ; [.1CF2.0020.0002.0B42] # ORIYA VOWEL SIGN UU
+0B43  ; [.1CF3.0020.0002.0B43] # ORIYA VOWEL SIGN VOCALIC R
+0B44  ; [.1CF4.0020.0002.0B44] # ORIYA VOWEL SIGN VOCALIC RR
+0B62  ; [.1CF5.0020.0002.0B62] # ORIYA VOWEL SIGN VOCALIC L
+0B63  ; [.1CF6.0020.0002.0B63] # ORIYA VOWEL SIGN VOCALIC LL
+0B47  ; [.1CF7.0020.0002.0B47] # ORIYA VOWEL SIGN E
+0B48  ; [.1CF8.0020.0002.0B48] # ORIYA VOWEL SIGN AI
+0B47 0B56 ; [.1CF8.0020.0002.0B48] # ORIYA VOWEL SIGN AI
+0B4B  ; [.1CF9.0020.0002.0B4B] # ORIYA VOWEL SIGN O
+0B47 0B3E ; [.1CF9.0020.0002.0B4B] # ORIYA VOWEL SIGN O
+0B4C  ; [.1CFA.0020.0002.0B4C] # ORIYA VOWEL SIGN AU
+0B47 0B57 ; [.1CFA.0020.0002.0B4C] # ORIYA VOWEL SIGN AU
+0B4D  ; [.1CFB.0020.0002.0B4D] # ORIYA SIGN VIRAMA
+0B56  ; [.1CFC.0020.0002.0B56] # ORIYA AI LENGTH MARK
+0B57  ; [.1CFD.0020.0002.0B57] # ORIYA AU LENGTH MARK
+0BD0  ; [.1CFE.0020.0002.0BD0] # TAMIL OM
+0B85  ; [.1CFF.0020.0002.0B85] # TAMIL LETTER A
+0B86  ; [.1D00.0020.0002.0B86] # TAMIL LETTER AA
+0B87  ; [.1D01.0020.0002.0B87] # TAMIL LETTER I
+0B88  ; [.1D02.0020.0002.0B88] # TAMIL LETTER II
+0B89  ; [.1D03.0020.0002.0B89] # TAMIL LETTER U
+0B8A  ; [.1D04.0020.0002.0B8A] # TAMIL LETTER UU
+0B8E  ; [.1D05.0020.0002.0B8E] # TAMIL LETTER E
+0B8F  ; [.1D06.0020.0002.0B8F] # TAMIL LETTER EE
+0B90  ; [.1D07.0020.0002.0B90] # TAMIL LETTER AI
+0B92  ; [.1D08.0020.0002.0B92] # TAMIL LETTER O
+0B93  ; [.1D09.0020.0002.0B93] # TAMIL LETTER OO
+0B94  ; [.1D0A.0020.0002.0B94] # TAMIL LETTER AU
+0B92 0BD7 ; [.1D0A.0020.0002.0B94] # TAMIL LETTER AU
+0B83  ; [.1D0B.0020.0002.0B83] # TAMIL SIGN VISARGA
+0B95  ; [.1D0C.0020.0002.0B95] # TAMIL LETTER KA
+0B99  ; [.1D0D.0020.0002.0B99] # TAMIL LETTER NGA
+0B9A  ; [.1D0E.0020.0002.0B9A] # TAMIL LETTER CA
+0B9E  ; [.1D0F.0020.0002.0B9E] # TAMIL LETTER NYA
+0B9F  ; [.1D10.0020.0002.0B9F] # TAMIL LETTER TTA
+0BA3  ; [.1D11.0020.0002.0BA3] # TAMIL LETTER NNA
+0BA4  ; [.1D12.0020.0002.0BA4] # TAMIL LETTER TA
+0BA8  ; [.1D13.0020.0002.0BA8] # TAMIL LETTER NA
+0BAA  ; [.1D14.0020.0002.0BAA] # TAMIL LETTER PA
+0BAE  ; [.1D15.0020.0002.0BAE] # TAMIL LETTER MA
+0BAF  ; [.1D16.0020.0002.0BAF] # TAMIL LETTER YA
+0BB0  ; [.1D17.0020.0002.0BB0] # TAMIL LETTER RA
+0BB2  ; [.1D18.0020.0002.0BB2] # TAMIL LETTER LA
+0BB5  ; [.1D19.0020.0002.0BB5] # TAMIL LETTER VA
+0BB4  ; [.1D1A.0020.0002.0BB4] # TAMIL LETTER LLLA
+0BB3  ; [.1D1B.0020.0002.0BB3] # TAMIL LETTER LLA
+0BB1  ; [.1D1C.0020.0002.0BB1] # TAMIL LETTER RRA
+0BA9  ; [.1D1D.0020.0002.0BA9] # TAMIL LETTER NNNA
+0B9C  ; [.1D1E.0020.0002.0B9C] # TAMIL LETTER JA
+0BB6  ; [.1D1F.0020.0002.0BB6] # TAMIL LETTER SHA
+0BB7  ; [.1D20.0020.0002.0BB7] # TAMIL LETTER SSA
+0BB8  ; [.1D21.0020.0002.0BB8] # TAMIL LETTER SA
+0BB9  ; [.1D22.0020.0002.0BB9] # TAMIL LETTER HA
+0BBE  ; [.1D23.0020.0002.0BBE] # TAMIL VOWEL SIGN AA
+0BBF  ; [.1D24.0020.0002.0BBF] # TAMIL VOWEL SIGN I
+0BC0  ; [.1D25.0020.0002.0BC0] # TAMIL VOWEL SIGN II
+0BC1  ; [.1D26.0020.0002.0BC1] # TAMIL VOWEL SIGN U
+0BC2  ; [.1D27.0020.0002.0BC2] # TAMIL VOWEL SIGN UU
+0BC6  ; [.1D28.0020.0002.0BC6] # TAMIL VOWEL SIGN E
+0BC7  ; [.1D29.0020.0002.0BC7] # TAMIL VOWEL SIGN EE
+0BC8  ; [.1D2A.0020.0002.0BC8] # TAMIL VOWEL SIGN AI
+0BCA  ; [.1D2B.0020.0002.0BCA] # TAMIL VOWEL SIGN O
+0BC6 0BBE ; [.1D2B.0020.0002.0BCA] # TAMIL VOWEL SIGN O
+0BCB  ; [.1D2C.0020.0002.0BCB] # TAMIL VOWEL SIGN OO
+0BC7 0BBE ; [.1D2C.0020.0002.0BCB] # TAMIL VOWEL SIGN OO
+0BCC  ; [.1D2D.0020.0002.0BCC] # TAMIL VOWEL SIGN AU
+0BC6 0BD7 ; [.1D2D.0020.0002.0BCC] # TAMIL VOWEL SIGN AU
+0BCD  ; [.1D2E.0020.0002.0BCD] # TAMIL SIGN VIRAMA
+0BD7  ; [.1D2F.0020.0002.0BD7] # TAMIL AU LENGTH MARK
+0C05  ; [.1D30.0020.0002.0C05] # TELUGU LETTER A
+0C06  ; [.1D31.0020.0002.0C06] # TELUGU LETTER AA
+0C07  ; [.1D32.0020.0002.0C07] # TELUGU LETTER I
+0C08  ; [.1D33.0020.0002.0C08] # TELUGU LETTER II
+0C09  ; [.1D34.0020.0002.0C09] # TELUGU LETTER U
+0C0A  ; [.1D35.0020.0002.0C0A] # TELUGU LETTER UU
+0C0B  ; [.1D36.0020.0002.0C0B] # TELUGU LETTER VOCALIC R
+0C60  ; [.1D37.0020.0002.0C60] # TELUGU LETTER VOCALIC RR
+0C0C  ; [.1D38.0020.0002.0C0C] # TELUGU LETTER VOCALIC L
+0C61  ; [.1D39.0020.0002.0C61] # TELUGU LETTER VOCALIC LL
+0C0E  ; [.1D3A.0020.0002.0C0E] # TELUGU LETTER E
+0C0F  ; [.1D3B.0020.0002.0C0F] # TELUGU LETTER EE
+0C10  ; [.1D3C.0020.0002.0C10] # TELUGU LETTER AI
+0C12  ; [.1D3D.0020.0002.0C12] # TELUGU LETTER O
+0C13  ; [.1D3E.0020.0002.0C13] # TELUGU LETTER OO
+0C14  ; [.1D3F.0020.0002.0C14] # TELUGU LETTER AU
+0C15  ; [.1D40.0020.0002.0C15] # TELUGU LETTER KA
+0C16  ; [.1D41.0020.0002.0C16] # TELUGU LETTER KHA
+0C17  ; [.1D42.0020.0002.0C17] # TELUGU LETTER GA
+0C18  ; [.1D43.0020.0002.0C18] # TELUGU LETTER GHA
+0C19  ; [.1D44.0020.0002.0C19] # TELUGU LETTER NGA
+0C1A  ; [.1D45.0020.0002.0C1A] # TELUGU LETTER CA
+0C58  ; [.1D46.0020.0002.0C58] # TELUGU LETTER TSA
+0C1B  ; [.1D47.0020.0002.0C1B] # TELUGU LETTER CHA
+0C1C  ; [.1D48.0020.0002.0C1C] # TELUGU LETTER JA
+0C59  ; [.1D49.0020.0002.0C59] # TELUGU LETTER DZA
+0C1D  ; [.1D4A.0020.0002.0C1D] # TELUGU LETTER JHA
+0C1E  ; [.1D4B.0020.0002.0C1E] # TELUGU LETTER NYA
+0C1F  ; [.1D4C.0020.0002.0C1F] # TELUGU LETTER TTA
+0C20  ; [.1D4D.0020.0002.0C20] # TELUGU LETTER TTHA
+0C21  ; [.1D4E.0020.0002.0C21] # TELUGU LETTER DDA
+0C22  ; [.1D4F.0020.0002.0C22] # TELUGU LETTER DDHA
+0C23  ; [.1D50.0020.0002.0C23] # TELUGU LETTER NNA
+0C24  ; [.1D51.0020.0002.0C24] # TELUGU LETTER TA
+0C25  ; [.1D52.0020.0002.0C25] # TELUGU LETTER THA
+0C26  ; [.1D53.0020.0002.0C26] # TELUGU LETTER DA
+0C27  ; [.1D54.0020.0002.0C27] # TELUGU LETTER DHA
+0C28  ; [.1D55.0020.0002.0C28] # TELUGU LETTER NA
+0C2A  ; [.1D56.0020.0002.0C2A] # TELUGU LETTER PA
+0C2B  ; [.1D57.0020.0002.0C2B] # TELUGU LETTER PHA
+0C2C  ; [.1D58.0020.0002.0C2C] # TELUGU LETTER BA
+0C2D  ; [.1D59.0020.0002.0C2D] # TELUGU LETTER BHA
+0C2E  ; [.1D5A.0020.0002.0C2E] # TELUGU LETTER MA
+0C2F  ; [.1D5B.0020.0002.0C2F] # TELUGU LETTER YA
+0C30  ; [.1D5C.0020.0002.0C30] # TELUGU LETTER RA
+0C31  ; [.1D5D.0020.0002.0C31] # TELUGU LETTER RRA
+0C32  ; [.1D5E.0020.0002.0C32] # TELUGU LETTER LA
+0C35  ; [.1D5F.0020.0002.0C35] # TELUGU LETTER VA
+0C36  ; [.1D60.0020.0002.0C36] # TELUGU LETTER SHA
+0C37  ; [.1D61.0020.0002.0C37] # TELUGU LETTER SSA
+0C38  ; [.1D62.0020.0002.0C38] # TELUGU LETTER SA
+0C39  ; [.1D63.0020.0002.0C39] # TELUGU LETTER HA
+0C33  ; [.1D64.0020.0002.0C33] # TELUGU LETTER LLA
+0C3D  ; [.1D65.0020.0002.0C3D] # TELUGU SIGN AVAGRAHA
+0C3E  ; [.1D66.0020.0002.0C3E] # TELUGU VOWEL SIGN AA
+0C3F  ; [.1D67.0020.0002.0C3F] # TELUGU VOWEL SIGN I
+0C40  ; [.1D68.0020.0002.0C40] # TELUGU VOWEL SIGN II
+0C41  ; [.1D69.0020.0002.0C41] # TELUGU VOWEL SIGN U
+0C42  ; [.1D6A.0020.0002.0C42] # TELUGU VOWEL SIGN UU
+0C43  ; [.1D6B.0020.0002.0C43] # TELUGU VOWEL SIGN VOCALIC R
+0C44  ; [.1D6C.0020.0002.0C44] # TELUGU VOWEL SIGN VOCALIC RR
+0C62  ; [.1D6D.0020.0002.0C62] # TELUGU VOWEL SIGN VOCALIC L
+0C63  ; [.1D6E.0020.0002.0C63] # TELUGU VOWEL SIGN VOCALIC LL
+0C46  ; [.1D6F.0020.0002.0C46] # TELUGU VOWEL SIGN E
+0C47  ; [.1D70.0020.0002.0C47] # TELUGU VOWEL SIGN EE
+0C48  ; [.1D71.0020.0002.0C48] # TELUGU VOWEL SIGN AI
+0C46 0C56 ; [.1D71.0020.0002.0C48] # TELUGU VOWEL SIGN AI
+0C4A  ; [.1D72.0020.0002.0C4A] # TELUGU VOWEL SIGN O
+0C4B  ; [.1D73.0020.0002.0C4B] # TELUGU VOWEL SIGN OO
+0C4C  ; [.1D74.0020.0002.0C4C] # TELUGU VOWEL SIGN AU
+0C4D  ; [.1D75.0020.0002.0C4D] # TELUGU SIGN VIRAMA
+0C55  ; [.1D76.0020.0002.0C55] # TELUGU LENGTH MARK
+0C56  ; [.1D77.0020.0002.0C56] # TELUGU AI LENGTH MARK
+0C85  ; [.1D78.0020.0002.0C85] # KANNADA LETTER A
+0C86  ; [.1D79.0020.0002.0C86] # KANNADA LETTER AA
+0C87  ; [.1D7A.0020.0002.0C87] # KANNADA LETTER I
+0C88  ; [.1D7B.0020.0002.0C88] # KANNADA LETTER II
+0C89  ; [.1D7C.0020.0002.0C89] # KANNADA LETTER U
+0C8A  ; [.1D7D.0020.0002.0C8A] # KANNADA LETTER UU
+0C8B  ; [.1D7E.0020.0002.0C8B] # KANNADA LETTER VOCALIC R
+0CE0  ; [.1D7F.0020.0002.0CE0] # KANNADA LETTER VOCALIC RR
+0C8C  ; [.1D80.0020.0002.0C8C] # KANNADA LETTER VOCALIC L
+0CE1  ; [.1D81.0020.0002.0CE1] # KANNADA LETTER VOCALIC LL
+0C8E  ; [.1D82.0020.0002.0C8E] # KANNADA LETTER E
+0C8F  ; [.1D83.0020.0002.0C8F] # KANNADA LETTER EE
+0C90  ; [.1D84.0020.0002.0C90] # KANNADA LETTER AI
+0C92  ; [.1D85.0020.0002.0C92] # KANNADA LETTER O
+0C93  ; [.1D86.0020.0002.0C93] # KANNADA LETTER OO
+0C94  ; [.1D87.0020.0002.0C94] # KANNADA LETTER AU
+0C95  ; [.1D88.0020.0002.0C95] # KANNADA LETTER KA
+0C96  ; [.1D89.0020.0002.0C96] # KANNADA LETTER KHA
+0C97  ; [.1D8A.0020.0002.0C97] # KANNADA LETTER GA
+0C98  ; [.1D8B.0020.0002.0C98] # KANNADA LETTER GHA
+0C99  ; [.1D8C.0020.0002.0C99] # KANNADA LETTER NGA
+0C9A  ; [.1D8D.0020.0002.0C9A] # KANNADA LETTER CA
+0C9B  ; [.1D8E.0020.0002.0C9B] # KANNADA LETTER CHA
+0C9C  ; [.1D8F.0020.0002.0C9C] # KANNADA LETTER JA
+0C9D  ; [.1D90.0020.0002.0C9D] # KANNADA LETTER JHA
+0C9E  ; [.1D91.0020.0002.0C9E] # KANNADA LETTER NYA
+0C9F  ; [.1D92.0020.0002.0C9F] # KANNADA LETTER TTA
+0CA0  ; [.1D93.0020.0002.0CA0] # KANNADA LETTER TTHA
+0CA1  ; [.1D94.0020.0002.0CA1] # KANNADA LETTER DDA
+0CA2  ; [.1D95.0020.0002.0CA2] # KANNADA LETTER DDHA
+0CA3  ; [.1D96.0020.0002.0CA3] # KANNADA LETTER NNA
+0CA4  ; [.1D97.0020.0002.0CA4] # KANNADA LETTER TA
+0CA5  ; [.1D98.0020.0002.0CA5] # KANNADA LETTER THA
+0CA6  ; [.1D99.0020.0002.0CA6] # KANNADA LETTER DA
+0CA7  ; [.1D9A.0020.0002.0CA7] # KANNADA LETTER DHA
+0CA8  ; [.1D9B.0020.0002.0CA8] # KANNADA LETTER NA
+0CAA  ; [.1D9C.0020.0002.0CAA] # KANNADA LETTER PA
+0CAB  ; [.1D9D.0020.0002.0CAB] # KANNADA LETTER PHA
+0CAC  ; [.1D9E.0020.0002.0CAC] # KANNADA LETTER BA
+0CAD  ; [.1D9F.0020.0002.0CAD] # KANNADA LETTER BHA
+0CAE  ; [.1DA0.0020.0002.0CAE] # KANNADA LETTER MA
+0CAF  ; [.1DA1.0020.0002.0CAF] # KANNADA LETTER YA
+0CB0  ; [.1DA2.0020.0002.0CB0] # KANNADA LETTER RA
+0CB1  ; [.1DA3.0020.0002.0CB1] # KANNADA LETTER RRA
+0CB2  ; [.1DA4.0020.0002.0CB2] # KANNADA LETTER LA
+0CB5  ; [.1DA5.0020.0002.0CB5] # KANNADA LETTER VA
+0CB6  ; [.1DA6.0020.0002.0CB6] # KANNADA LETTER SHA
+0CB7  ; [.1DA7.0020.0002.0CB7] # KANNADA LETTER SSA
+0CB8  ; [.1DA8.0020.0002.0CB8] # KANNADA LETTER SA
+0CB9  ; [.1DA9.0020.0002.0CB9] # KANNADA LETTER HA
+0CB3  ; [.1DAA.0020.0002.0CB3] # KANNADA LETTER LLA
+0CDE  ; [.1DAB.0020.0002.0CDE] # KANNADA LETTER FA
+0CBD  ; [.1DAC.0020.0002.0CBD] # KANNADA SIGN AVAGRAHA
+0CBE  ; [.1DAD.0020.0002.0CBE] # KANNADA VOWEL SIGN AA
+0CBF  ; [.1DAE.0020.0002.0CBF] # KANNADA VOWEL SIGN I
+0CC0  ; [.1DAF.0020.0002.0CC0] # KANNADA VOWEL SIGN II
+0CBF 0CD5 ; [.1DAF.0020.0002.0CC0] # KANNADA VOWEL SIGN II
+0CC1  ; [.1DB0.0020.0002.0CC1] # KANNADA VOWEL SIGN U
+0CC2  ; [.1DB1.0020.0002.0CC2] # KANNADA VOWEL SIGN UU
+0CC3  ; [.1DB2.0020.0002.0CC3] # KANNADA VOWEL SIGN VOCALIC R
+0CC4  ; [.1DB3.0020.0002.0CC4] # KANNADA VOWEL SIGN VOCALIC RR
+0CE2  ; [.1DB4.0020.0002.0CE2] # KANNADA VOWEL SIGN VOCALIC L
+0CE3  ; [.1DB5.0020.0002.0CE3] # KANNADA VOWEL SIGN VOCALIC LL
+0CC6  ; [.1DB6.0020.0002.0CC6] # KANNADA VOWEL SIGN E
+0CC7  ; [.1DB7.0020.0002.0CC7] # KANNADA VOWEL SIGN EE
+0CC6 0CD5 ; [.1DB7.0020.0002.0CC7] # KANNADA VOWEL SIGN EE
+0CC8  ; [.1DB8.0020.0002.0CC8] # KANNADA VOWEL SIGN AI
+0CC6 0CD6 ; [.1DB8.0020.0002.0CC8] # KANNADA VOWEL SIGN AI
+0CCA  ; [.1DB9.0020.0002.0CCA] # KANNADA VOWEL SIGN O
+0CC6 0CC2 ; [.1DB9.0020.0002.0CCA] # KANNADA VOWEL SIGN O
+0CCB  ; [.1DBA.0020.0002.0CCB] # KANNADA VOWEL SIGN OO
+0CC6 0CC2 0CD5 ; [.1DBA.0020.0002.0CCB] # KANNADA VOWEL SIGN OO
+0CCA 0CD5 ; [.1DBA.0020.0002.0CCB] # KANNADA VOWEL SIGN OO
+0CCC  ; [.1DBB.0020.0002.0CCC] # KANNADA VOWEL SIGN AU
+0CCD  ; [.1DBC.0020.0002.0CCD] # KANNADA SIGN VIRAMA
+0CD5  ; [.1DBD.0020.0002.0CD5] # KANNADA LENGTH MARK
+0CD6  ; [.1DBE.0020.0002.0CD6] # KANNADA AI LENGTH MARK
+0D05  ; [.1DBF.0020.0002.0D05] # MALAYALAM LETTER A
+0D06  ; [.1DC0.0020.0002.0D06] # MALAYALAM LETTER AA
+0D07  ; [.1DC1.0020.0002.0D07] # MALAYALAM LETTER I
+0D08  ; [.1DC2.0020.0002.0D08] # MALAYALAM LETTER II
+0D09  ; [.1DC3.0020.0002.0D09] # MALAYALAM LETTER U
+0D0A  ; [.1DC4.0020.0002.0D0A] # MALAYALAM LETTER UU
+0D0B  ; [.1DC5.0020.0002.0D0B] # MALAYALAM LETTER VOCALIC R
+0D60  ; [.1DC6.0020.0002.0D60] # MALAYALAM LETTER VOCALIC RR
+0D0C  ; [.1DC7.0020.0002.0D0C] # MALAYALAM LETTER VOCALIC L
+0D61  ; [.1DC8.0020.0002.0D61] # MALAYALAM LETTER VOCALIC LL
+0D0E  ; [.1DC9.0020.0002.0D0E] # MALAYALAM LETTER E
+0D0F  ; [.1DCA.0020.0002.0D0F] # MALAYALAM LETTER EE
+0D10  ; [.1DCB.0020.0002.0D10] # MALAYALAM LETTER AI
+0D12  ; [.1DCC.0020.0002.0D12] # MALAYALAM LETTER O
+0D13  ; [.1DCD.0020.0002.0D13] # MALAYALAM LETTER OO
+0D14  ; [.1DCE.0020.0002.0D14] # MALAYALAM LETTER AU
+0D15  ; [.1DCF.0020.0002.0D15] # MALAYALAM LETTER KA
+0D7F  ; [.1DCF.0020.0004.0D7F][.1E04.0020.0004.0D7F] # MALAYALAM LETTER CHILLU K; QQKN
+0D16  ; [.1DD0.0020.0002.0D16] # MALAYALAM LETTER KHA
+0D17  ; [.1DD1.0020.0002.0D17] # MALAYALAM LETTER GA
+0D18  ; [.1DD2.0020.0002.0D18] # MALAYALAM LETTER GHA
+0D19  ; [.1DD3.0020.0002.0D19] # MALAYALAM LETTER NGA
+0D1A  ; [.1DD4.0020.0002.0D1A] # MALAYALAM LETTER CA
+0D1B  ; [.1DD5.0020.0002.0D1B] # MALAYALAM LETTER CHA
+0D1C  ; [.1DD6.0020.0002.0D1C] # MALAYALAM LETTER JA
+0D1D  ; [.1DD7.0020.0002.0D1D] # MALAYALAM LETTER JHA
+0D1E  ; [.1DD8.0020.0002.0D1E] # MALAYALAM LETTER NYA
+0D1F  ; [.1DD9.0020.0002.0D1F] # MALAYALAM LETTER TTA
+0D20  ; [.1DDA.0020.0002.0D20] # MALAYALAM LETTER TTHA
+0D21  ; [.1DDB.0020.0002.0D21] # MALAYALAM LETTER DDA
+0D22  ; [.1DDC.0020.0002.0D22] # MALAYALAM LETTER DDHA
+0D23  ; [.1DDD.0020.0002.0D23] # MALAYALAM LETTER NNA
+0D7A  ; [.1DDD.0020.0004.0D7A][.1E04.0020.0004.0D7A] # MALAYALAM LETTER CHILLU NN; QQKN
+0D24  ; [.1DDE.0020.0002.0D24] # MALAYALAM LETTER TA
+0D25  ; [.1DDF.0020.0002.0D25] # MALAYALAM LETTER THA
+0D26  ; [.1DE0.0020.0002.0D26] # MALAYALAM LETTER DA
+0D27  ; [.1DE1.0020.0002.0D27] # MALAYALAM LETTER DHA
+0D28  ; [.1DE2.0020.0002.0D28] # MALAYALAM LETTER NA
+0D7B  ; [.1DE2.0020.0004.0D7B][.1E04.0020.0004.0D7B] # MALAYALAM LETTER CHILLU N; QQKN
+0D2A  ; [.1DE3.0020.0002.0D2A] # MALAYALAM LETTER PA
+0D2B  ; [.1DE4.0020.0002.0D2B] # MALAYALAM LETTER PHA
+0D2C  ; [.1DE5.0020.0002.0D2C] # MALAYALAM LETTER BA
+0D2D  ; [.1DE6.0020.0002.0D2D] # MALAYALAM LETTER BHA
+0D2E  ; [.1DE7.0020.0002.0D2E] # MALAYALAM LETTER MA
+0D2F  ; [.1DE8.0020.0002.0D2F] # MALAYALAM LETTER YA
+0D30  ; [.1DE9.0020.0002.0D30] # MALAYALAM LETTER RA
+0D7C  ; [.1DE9.0020.0004.0D7C][.1E04.0020.0004.0D7C] # MALAYALAM LETTER CHILLU RR; QQKN
+0D32  ; [.1DEA.0020.0002.0D32] # MALAYALAM LETTER LA
+0D7D  ; [.1DEA.0020.0004.0D7D][.1E04.0020.0004.0D7D] # MALAYALAM LETTER CHILLU L; QQKN
+0D35  ; [.1DEB.0020.0002.0D35] # MALAYALAM LETTER VA
+0D36  ; [.1DEC.0020.0002.0D36] # MALAYALAM LETTER SHA
+0D37  ; [.1DED.0020.0002.0D37] # MALAYALAM LETTER SSA
+0D38  ; [.1DEE.0020.0002.0D38] # MALAYALAM LETTER SA
+0D39  ; [.1DEF.0020.0002.0D39] # MALAYALAM LETTER HA
+0D33  ; [.1DF0.0020.0002.0D33] # MALAYALAM LETTER LLA
+0D7E  ; [.1DF0.0020.0004.0D7E][.1E04.0020.0004.0D7E] # MALAYALAM LETTER CHILLU LL; QQKN
+0D34  ; [.1DF1.0020.0002.0D34] # MALAYALAM LETTER LLLA
+0D31  ; [.1DF2.0020.0002.0D31] # MALAYALAM LETTER RRA
+0D3D  ; [.1DF3.0020.0002.0D3D] # MALAYALAM SIGN AVAGRAHA
+0D3E  ; [.1DF4.0020.0002.0D3E] # MALAYALAM VOWEL SIGN AA
+0D3F  ; [.1DF5.0020.0002.0D3F] # MALAYALAM VOWEL SIGN I
+0D40  ; [.1DF6.0020.0002.0D40] # MALAYALAM VOWEL SIGN II
+0D41  ; [.1DF7.0020.0002.0D41] # MALAYALAM VOWEL SIGN U
+0D42  ; [.1DF8.0020.0002.0D42] # MALAYALAM VOWEL SIGN UU
+0D43  ; [.1DF9.0020.0002.0D43] # MALAYALAM VOWEL SIGN VOCALIC R
+0D44  ; [.1DFA.0020.0002.0D44] # MALAYALAM VOWEL SIGN VOCALIC RR
+0D62  ; [.1DFB.0020.0002.0D62] # MALAYALAM VOWEL SIGN VOCALIC L
+0D63  ; [.1DFC.0020.0002.0D63] # MALAYALAM VOWEL SIGN VOCALIC LL
+0D46  ; [.1DFD.0020.0002.0D46] # MALAYALAM VOWEL SIGN E
+0D47  ; [.1DFE.0020.0002.0D47] # MALAYALAM VOWEL SIGN EE
+0D48  ; [.1DFF.0020.0002.0D48] # MALAYALAM VOWEL SIGN AI
+0D4A  ; [.1E00.0020.0002.0D4A] # MALAYALAM VOWEL SIGN O
+0D46 0D3E ; [.1E00.0020.0002.0D4A] # MALAYALAM VOWEL SIGN O
+0D4B  ; [.1E01.0020.0002.0D4B] # MALAYALAM VOWEL SIGN OO
+0D47 0D3E ; [.1E01.0020.0002.0D4B] # MALAYALAM VOWEL SIGN OO
+0D4C  ; [.1E02.0020.0002.0D4C] # MALAYALAM VOWEL SIGN AU
+0D46 0D57 ; [.1E02.0020.0002.0D4C] # MALAYALAM VOWEL SIGN AU
+0D57  ; [.1E03.0020.0002.0D57] # MALAYALAM AU LENGTH MARK
+0D4D  ; [.1E04.0020.0002.0D4D] # MALAYALAM SIGN VIRAMA
+0D85  ; [.1E05.0020.0002.0D85] # SINHALA LETTER AYANNA
+0D86  ; [.1E06.0020.0002.0D86] # SINHALA LETTER AAYANNA
+0D87  ; [.1E07.0020.0002.0D87] # SINHALA LETTER AEYANNA
+0D88  ; [.1E08.0020.0002.0D88] # SINHALA LETTER AEEYANNA
+0D89  ; [.1E09.0020.0002.0D89] # SINHALA LETTER IYANNA
+0D8A  ; [.1E0A.0020.0002.0D8A] # SINHALA LETTER IIYANNA
+0D8B  ; [.1E0B.0020.0002.0D8B] # SINHALA LETTER UYANNA
+0D8C  ; [.1E0C.0020.0002.0D8C] # SINHALA LETTER UUYANNA
+0D8D  ; [.1E0D.0020.0002.0D8D] # SINHALA LETTER IRUYANNA
+0D8E  ; [.1E0E.0020.0002.0D8E] # SINHALA LETTER IRUUYANNA
+0D8F  ; [.1E0F.0020.0002.0D8F] # SINHALA LETTER ILUYANNA
+0D90  ; [.1E10.0020.0002.0D90] # SINHALA LETTER ILUUYANNA
+0D91  ; [.1E11.0020.0002.0D91] # SINHALA LETTER EYANNA
+0D92  ; [.1E12.0020.0002.0D92] # SINHALA LETTER EEYANNA
+0D93  ; [.1E13.0020.0002.0D93] # SINHALA LETTER AIYANNA
+0D94  ; [.1E14.0020.0002.0D94] # SINHALA LETTER OYANNA
+0D95  ; [.1E15.0020.0002.0D95] # SINHALA LETTER OOYANNA
+0D96  ; [.1E16.0020.0002.0D96] # SINHALA LETTER AUYANNA
+0D9A  ; [.1E17.0020.0002.0D9A] # SINHALA LETTER ALPAPRAANA KAYANNA
+0D9B  ; [.1E18.0020.0002.0D9B] # SINHALA LETTER MAHAAPRAANA KAYANNA
+0D9C  ; [.1E19.0020.0002.0D9C] # SINHALA LETTER ALPAPRAANA GAYANNA
+0D9D  ; [.1E1A.0020.0002.0D9D] # SINHALA LETTER MAHAAPRAANA GAYANNA
+0D9E  ; [.1E1B.0020.0002.0D9E] # SINHALA LETTER KANTAJA NAASIKYAYA
+0D9F  ; [.1E1C.0020.0002.0D9F] # SINHALA LETTER SANYAKA GAYANNA
+0DA0  ; [.1E1D.0020.0002.0DA0] # SINHALA LETTER ALPAPRAANA CAYANNA
+0DA1  ; [.1E1E.0020.0002.0DA1] # SINHALA LETTER MAHAAPRAANA CAYANNA
+0DA2  ; [.1E1F.0020.0002.0DA2] # SINHALA LETTER ALPAPRAANA JAYANNA
+0DA3  ; [.1E20.0020.0002.0DA3] # SINHALA LETTER MAHAAPRAANA JAYANNA
+0DA4  ; [.1E21.0020.0002.0DA4] # SINHALA LETTER TAALUJA NAASIKYAYA
+0DA5  ; [.1E22.0020.0002.0DA5] # SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA
+0DA6  ; [.1E23.0020.0002.0DA6] # SINHALA LETTER SANYAKA JAYANNA
+0DA7  ; [.1E24.0020.0002.0DA7] # SINHALA LETTER ALPAPRAANA TTAYANNA
+0DA8  ; [.1E25.0020.0002.0DA8] # SINHALA LETTER MAHAAPRAANA TTAYANNA
+0DA9  ; [.1E26.0020.0002.0DA9] # SINHALA LETTER ALPAPRAANA DDAYANNA
+0DAA  ; [.1E27.0020.0002.0DAA] # SINHALA LETTER MAHAAPRAANA DDAYANNA
+0DAB  ; [.1E28.0020.0002.0DAB] # SINHALA LETTER MUURDHAJA NAYANNA
+0DAC  ; [.1E29.0020.0002.0DAC] # SINHALA LETTER SANYAKA DDAYANNA
+0DAD  ; [.1E2A.0020.0002.0DAD] # SINHALA LETTER ALPAPRAANA TAYANNA
+0DAE  ; [.1E2B.0020.0002.0DAE] # SINHALA LETTER MAHAAPRAANA TAYANNA
+0DAF  ; [.1E2C.0020.0002.0DAF] # SINHALA LETTER ALPAPRAANA DAYANNA
+0DB0  ; [.1E2D.0020.0002.0DB0] # SINHALA LETTER MAHAAPRAANA DAYANNA
+0DB1  ; [.1E2E.0020.0002.0DB1] # SINHALA LETTER DANTAJA NAYANNA
+0DB3  ; [.1E2F.0020.0002.0DB3] # SINHALA LETTER SANYAKA DAYANNA
+0DB4  ; [.1E30.0020.0002.0DB4] # SINHALA LETTER ALPAPRAANA PAYANNA
+0DB5  ; [.1E31.0020.0002.0DB5] # SINHALA LETTER MAHAAPRAANA PAYANNA
+0DB6  ; [.1E32.0020.0002.0DB6] # SINHALA LETTER ALPAPRAANA BAYANNA
+0DB7  ; [.1E33.0020.0002.0DB7] # SINHALA LETTER MAHAAPRAANA BAYANNA
+0DB8  ; [.1E34.0020.0002.0DB8] # SINHALA LETTER MAYANNA
+0DB9  ; [.1E35.0020.0002.0DB9] # SINHALA LETTER AMBA BAYANNA
+0DBA  ; [.1E36.0020.0002.0DBA] # SINHALA LETTER YAYANNA
+0DBB  ; [.1E37.0020.0002.0DBB] # SINHALA LETTER RAYANNA
+0DBD  ; [.1E38.0020.0002.0DBD] # SINHALA LETTER DANTAJA LAYANNA
+0DC0  ; [.1E39.0020.0002.0DC0] # SINHALA LETTER VAYANNA
+0DC1  ; [.1E3A.0020.0002.0DC1] # SINHALA LETTER TAALUJA SAYANNA
+0DC2  ; [.1E3B.0020.0002.0DC2] # SINHALA LETTER MUURDHAJA SAYANNA
+0DC3  ; [.1E3C.0020.0002.0DC3] # SINHALA LETTER DANTAJA SAYANNA
+0DC4  ; [.1E3D.0020.0002.0DC4] # SINHALA LETTER HAYANNA
+0DC5  ; [.1E3E.0020.0002.0DC5] # SINHALA LETTER MUURDHAJA LAYANNA
+0DC6  ; [.1E3F.0020.0002.0DC6] # SINHALA LETTER FAYANNA
+0DCF  ; [.1E40.0020.0002.0DCF] # SINHALA VOWEL SIGN AELA-PILLA
+0DD0  ; [.1E41.0020.0002.0DD0] # SINHALA VOWEL SIGN KETTI AEDA-PILLA
+0DD1  ; [.1E42.0020.0002.0DD1] # SINHALA VOWEL SIGN DIGA AEDA-PILLA
+0DD2  ; [.1E43.0020.0002.0DD2] # SINHALA VOWEL SIGN KETTI IS-PILLA
+0DD3  ; [.1E44.0020.0002.0DD3] # SINHALA VOWEL SIGN DIGA IS-PILLA
+0DD4  ; [.1E45.0020.0002.0DD4] # SINHALA VOWEL SIGN KETTI PAA-PILLA
+0DD6  ; [.1E46.0020.0002.0DD6] # SINHALA VOWEL SIGN DIGA PAA-PILLA
+0DD8  ; [.1E47.0020.0002.0DD8] # SINHALA VOWEL SIGN GAETTA-PILLA
+0DF2  ; [.1E48.0020.0002.0DF2] # SINHALA VOWEL SIGN DIGA GAETTA-PILLA
+0DDF  ; [.1E49.0020.0002.0DDF] # SINHALA VOWEL SIGN GAYANUKITTA
+0DF3  ; [.1E4A.0020.0002.0DF3] # SINHALA VOWEL SIGN DIGA GAYANUKITTA
+0DD9  ; [.1E4B.0020.0002.0DD9] # SINHALA VOWEL SIGN KOMBUVA
+0DDA  ; [.1E4C.0020.0002.0DDA] # SINHALA VOWEL SIGN DIGA KOMBUVA
+0DD9 0DCA ; [.1E4C.0020.0002.0DDA] # SINHALA VOWEL SIGN DIGA KOMBUVA
+0DDB  ; [.1E4D.0020.0002.0DDB] # SINHALA VOWEL SIGN KOMBU DEKA
+0DDC  ; [.1E4E.0020.0002.0DDC] # SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA
+0DD9 0DCF ; [.1E4E.0020.0002.0DDC] # SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA
+0DDD  ; [.1E4F.0020.0002.0DDD] # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA
+0DD9 0DCF 0DCA ; [.1E4F.0020.0002.0DDD] # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA
+0DDC 0DCA ; [.1E4F.0020.0002.0DDD] # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA
+0DDE  ; [.1E50.0020.0002.0DDE] # SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA
+0DD9 0DDF ; [.1E50.0020.0002.0DDE] # SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA
+0DCA  ; [.1E51.0020.0002.0DCA] # SINHALA SIGN AL-LAKUNA
+ABC0  ; [.1E52.0020.0002.ABC0] # MEETEI MAYEK LETTER KOK
+ABC1  ; [.1E53.0020.0002.ABC1] # MEETEI MAYEK LETTER SAM
+ABC2  ; [.1E54.0020.0002.ABC2] # MEETEI MAYEK LETTER LAI
+ABC3  ; [.1E55.0020.0002.ABC3] # MEETEI MAYEK LETTER MIT
+ABC4  ; [.1E56.0020.0002.ABC4] # MEETEI MAYEK LETTER PA
+ABC5  ; [.1E57.0020.0002.ABC5] # MEETEI MAYEK LETTER NA
+ABC6  ; [.1E58.0020.0002.ABC6] # MEETEI MAYEK LETTER CHIL
+ABC7  ; [.1E59.0020.0002.ABC7] # MEETEI MAYEK LETTER TIL
+ABC8  ; [.1E5A.0020.0002.ABC8] # MEETEI MAYEK LETTER KHOU
+ABC9  ; [.1E5B.0020.0002.ABC9] # MEETEI MAYEK LETTER NGOU
+ABCA  ; [.1E5C.0020.0002.ABCA] # MEETEI MAYEK LETTER THOU
+ABCB  ; [.1E5D.0020.0002.ABCB] # MEETEI MAYEK LETTER WAI
+ABCC  ; [.1E5E.0020.0002.ABCC] # MEETEI MAYEK LETTER YANG
+ABCD  ; [.1E5F.0020.0002.ABCD] # MEETEI MAYEK LETTER HUK
+ABCE  ; [.1E60.0020.0002.ABCE] # MEETEI MAYEK LETTER UN
+ABCF  ; [.1E61.0020.0002.ABCF] # MEETEI MAYEK LETTER I
+ABD0  ; [.1E62.0020.0002.ABD0] # MEETEI MAYEK LETTER PHAM
+ABD1  ; [.1E63.0020.0002.ABD1] # MEETEI MAYEK LETTER ATIYA
+ABD2  ; [.1E64.0020.0002.ABD2] # MEETEI MAYEK LETTER GOK
+ABD3  ; [.1E65.0020.0002.ABD3] # MEETEI MAYEK LETTER JHAM
+ABD4  ; [.1E66.0020.0002.ABD4] # MEETEI MAYEK LETTER RAI
+ABD5  ; [.1E67.0020.0002.ABD5] # MEETEI MAYEK LETTER BA
+ABD6  ; [.1E68.0020.0002.ABD6] # MEETEI MAYEK LETTER JIL
+ABD7  ; [.1E69.0020.0002.ABD7] # MEETEI MAYEK LETTER DIL
+ABD8  ; [.1E6A.0020.0002.ABD8] # MEETEI MAYEK LETTER GHOU
+ABD9  ; [.1E6B.0020.0002.ABD9] # MEETEI MAYEK LETTER DHOU
+ABDA  ; [.1E6C.0020.0002.ABDA] # MEETEI MAYEK LETTER BHAM
+ABE3  ; [.1E6D.0020.0002.ABE3] # MEETEI MAYEK VOWEL SIGN ONAP
+ABE4  ; [.1E6E.0020.0002.ABE4] # MEETEI MAYEK VOWEL SIGN INAP
+ABE5  ; [.1E6F.0020.0002.ABE5] # MEETEI MAYEK VOWEL SIGN ANAP
+ABE6  ; [.1E70.0020.0002.ABE6] # MEETEI MAYEK VOWEL SIGN YENAP
+ABE7  ; [.1E71.0020.0002.ABE7] # MEETEI MAYEK VOWEL SIGN SOUNAP
+ABE8  ; [.1E72.0020.0002.ABE8] # MEETEI MAYEK VOWEL SIGN UNAP
+ABE9  ; [.1E73.0020.0002.ABE9] # MEETEI MAYEK VOWEL SIGN CHEINAP
+ABEA  ; [.1E74.0020.0002.ABEA] # MEETEI MAYEK VOWEL SIGN NUNG
+ABDB  ; [.1E75.0020.0002.ABDB] # MEETEI MAYEK LETTER KOK LONSUM
+ABDC  ; [.1E76.0020.0002.ABDC] # MEETEI MAYEK LETTER LAI LONSUM
+ABDD  ; [.1E77.0020.0002.ABDD] # MEETEI MAYEK LETTER MIT LONSUM
+ABDE  ; [.1E78.0020.0002.ABDE] # MEETEI MAYEK LETTER PA LONSUM
+ABDF  ; [.1E79.0020.0002.ABDF] # MEETEI MAYEK LETTER NA LONSUM
+ABE0  ; [.1E7A.0020.0002.ABE0] # MEETEI MAYEK LETTER TIL LONSUM
+ABE1  ; [.1E7B.0020.0002.ABE1] # MEETEI MAYEK LETTER NGOU LONSUM
+ABE2  ; [.1E7C.0020.0002.ABE2] # MEETEI MAYEK LETTER I LONSUM
+ABED  ; [.1E7D.0020.0002.ABED] # MEETEI MAYEK APUN IYEK
+A800  ; [.1E7E.0020.0002.A800] # SYLOTI NAGRI LETTER A
+A801  ; [.1E7F.0020.0002.A801] # SYLOTI NAGRI LETTER I
+A802  ; [.1E80.0020.0002.A802] # SYLOTI NAGRI SIGN DVISVARA
+A803  ; [.1E81.0020.0002.A803] # SYLOTI NAGRI LETTER U
+A804  ; [.1E82.0020.0002.A804] # SYLOTI NAGRI LETTER E
+A805  ; [.1E83.0020.0002.A805] # SYLOTI NAGRI LETTER O
+A806  ; [.1E84.0020.0002.A806] # SYLOTI NAGRI SIGN HASANTA
+A807  ; [.1E85.0020.0002.A807] # SYLOTI NAGRI LETTER KO
+A808  ; [.1E86.0020.0002.A808] # SYLOTI NAGRI LETTER KHO
+A809  ; [.1E87.0020.0002.A809] # SYLOTI NAGRI LETTER GO
+A80A  ; [.1E88.0020.0002.A80A] # SYLOTI NAGRI LETTER GHO
+A80C  ; [.1E89.0020.0002.A80C] # SYLOTI NAGRI LETTER CO
+A80D  ; [.1E8A.0020.0002.A80D] # SYLOTI NAGRI LETTER CHO
+A80E  ; [.1E8B.0020.0002.A80E] # SYLOTI NAGRI LETTER JO
+A80F  ; [.1E8C.0020.0002.A80F] # SYLOTI NAGRI LETTER JHO
+A810  ; [.1E8D.0020.0002.A810] # SYLOTI NAGRI LETTER TTO
+A811  ; [.1E8E.0020.0002.A811] # SYLOTI NAGRI LETTER TTHO
+A812  ; [.1E8F.0020.0002.A812] # SYLOTI NAGRI LETTER DDO
+A813  ; [.1E90.0020.0002.A813] # SYLOTI NAGRI LETTER DDHO
+A814  ; [.1E91.0020.0002.A814] # SYLOTI NAGRI LETTER TO
+A815  ; [.1E92.0020.0002.A815] # SYLOTI NAGRI LETTER THO
+A816  ; [.1E93.0020.0002.A816] # SYLOTI NAGRI LETTER DO
+A817  ; [.1E94.0020.0002.A817] # SYLOTI NAGRI LETTER DHO
+A818  ; [.1E95.0020.0002.A818] # SYLOTI NAGRI LETTER NO
+A819  ; [.1E96.0020.0002.A819] # SYLOTI NAGRI LETTER PO
+A81A  ; [.1E97.0020.0002.A81A] # SYLOTI NAGRI LETTER PHO
+A81B  ; [.1E98.0020.0002.A81B] # SYLOTI NAGRI LETTER BO
+A81C  ; [.1E99.0020.0002.A81C] # SYLOTI NAGRI LETTER BHO
+A81D  ; [.1E9A.0020.0002.A81D] # SYLOTI NAGRI LETTER MO
+A81E  ; [.1E9B.0020.0002.A81E] # SYLOTI NAGRI LETTER RO
+A81F  ; [.1E9C.0020.0002.A81F] # SYLOTI NAGRI LETTER LO
+A820  ; [.1E9D.0020.0002.A820] # SYLOTI NAGRI LETTER RRO
+A821  ; [.1E9E.0020.0002.A821] # SYLOTI NAGRI LETTER SO
+A822  ; [.1E9F.0020.0002.A822] # SYLOTI NAGRI LETTER HO
+A823  ; [.1EA0.0020.0002.A823] # SYLOTI NAGRI VOWEL SIGN A
+A824  ; [.1EA1.0020.0002.A824] # SYLOTI NAGRI VOWEL SIGN I
+A825  ; [.1EA2.0020.0002.A825] # SYLOTI NAGRI VOWEL SIGN U
+A826  ; [.1EA3.0020.0002.A826] # SYLOTI NAGRI VOWEL SIGN E
+A827  ; [.1EA4.0020.0002.A827] # SYLOTI NAGRI VOWEL SIGN OO
+A882  ; [.1EA5.0020.0002.A882] # SAURASHTRA LETTER A
+A883  ; [.1EA6.0020.0002.A883] # SAURASHTRA LETTER AA
+A884  ; [.1EA7.0020.0002.A884] # SAURASHTRA LETTER I
+A885  ; [.1EA8.0020.0002.A885] # SAURASHTRA LETTER II
+A886  ; [.1EA9.0020.0002.A886] # SAURASHTRA LETTER U
+A887  ; [.1EAA.0020.0002.A887] # SAURASHTRA LETTER UU
+A888  ; [.1EAB.0020.0002.A888] # SAURASHTRA LETTER VOCALIC R
+A889  ; [.1EAC.0020.0002.A889] # SAURASHTRA LETTER VOCALIC RR
+A88A  ; [.1EAD.0020.0002.A88A] # SAURASHTRA LETTER VOCALIC L
+A88B  ; [.1EAE.0020.0002.A88B] # SAURASHTRA LETTER VOCALIC LL
+A88C  ; [.1EAF.0020.0002.A88C] # SAURASHTRA LETTER E
+A88D  ; [.1EB0.0020.0002.A88D] # SAURASHTRA LETTER EE
+A88E  ; [.1EB1.0020.0002.A88E] # SAURASHTRA LETTER AI
+A88F  ; [.1EB2.0020.0002.A88F] # SAURASHTRA LETTER O
+A890  ; [.1EB3.0020.0002.A890] # SAURASHTRA LETTER OO
+A891  ; [.1EB4.0020.0002.A891] # SAURASHTRA LETTER AU
+A892  ; [.1EB5.0020.0002.A892] # SAURASHTRA LETTER KA
+A893  ; [.1EB6.0020.0002.A893] # SAURASHTRA LETTER KHA
+A894  ; [.1EB7.0020.0002.A894] # SAURASHTRA LETTER GA
+A895  ; [.1EB8.0020.0002.A895] # SAURASHTRA LETTER GHA
+A896  ; [.1EB9.0020.0002.A896] # SAURASHTRA LETTER NGA
+A897  ; [.1EBA.0020.0002.A897] # SAURASHTRA LETTER CA
+A898  ; [.1EBB.0020.0002.A898] # SAURASHTRA LETTER CHA
+A899  ; [.1EBC.0020.0002.A899] # SAURASHTRA LETTER JA
+A89A  ; [.1EBD.0020.0002.A89A] # SAURASHTRA LETTER JHA
+A89B  ; [.1EBE.0020.0002.A89B] # SAURASHTRA LETTER NYA
+A89C  ; [.1EBF.0020.0002.A89C] # SAURASHTRA LETTER TTA
+A89D  ; [.1EC0.0020.0002.A89D] # SAURASHTRA LETTER TTHA
+A89E  ; [.1EC1.0020.0002.A89E] # SAURASHTRA LETTER DDA
+A89F  ; [.1EC2.0020.0002.A89F] # SAURASHTRA LETTER DDHA
+A8A0  ; [.1EC3.0020.0002.A8A0] # SAURASHTRA LETTER NNA
+A8A1  ; [.1EC4.0020.0002.A8A1] # SAURASHTRA LETTER TA
+A8A2  ; [.1EC5.0020.0002.A8A2] # SAURASHTRA LETTER THA
+A8A3  ; [.1EC6.0020.0002.A8A3] # SAURASHTRA LETTER DA
+A8A4  ; [.1EC7.0020.0002.A8A4] # SAURASHTRA LETTER DHA
+A8A5  ; [.1EC8.0020.0002.A8A5] # SAURASHTRA LETTER NA
+A8A6  ; [.1EC9.0020.0002.A8A6] # SAURASHTRA LETTER PA
+A8A7  ; [.1ECA.0020.0002.A8A7] # SAURASHTRA LETTER PHA
+A8A8  ; [.1ECB.0020.0002.A8A8] # SAURASHTRA LETTER BA
+A8A9  ; [.1ECC.0020.0002.A8A9] # SAURASHTRA LETTER BHA
+A8AA  ; [.1ECD.0020.0002.A8AA] # SAURASHTRA LETTER MA
+A8AB  ; [.1ECE.0020.0002.A8AB] # SAURASHTRA LETTER YA
+A8AC  ; [.1ECF.0020.0002.A8AC] # SAURASHTRA LETTER RA
+A8AD  ; [.1ED0.0020.0002.A8AD] # SAURASHTRA LETTER LA
+A8AE  ; [.1ED1.0020.0002.A8AE] # SAURASHTRA LETTER VA
+A8AF  ; [.1ED2.0020.0002.A8AF] # SAURASHTRA LETTER SHA
+A8B0  ; [.1ED3.0020.0002.A8B0] # SAURASHTRA LETTER SSA
+A8B1  ; [.1ED4.0020.0002.A8B1] # SAURASHTRA LETTER SA
+A8B2  ; [.1ED5.0020.0002.A8B2] # SAURASHTRA LETTER HA
+A8B3  ; [.1ED6.0020.0002.A8B3] # SAURASHTRA LETTER LLA
+A8B4  ; [.1ED7.0020.0002.A8B4] # SAURASHTRA CONSONANT SIGN HAARU
+A8B5  ; [.1ED8.0020.0002.A8B5] # SAURASHTRA VOWEL SIGN AA
+A8B6  ; [.1ED9.0020.0002.A8B6] # SAURASHTRA VOWEL SIGN I
+A8B7  ; [.1EDA.0020.0002.A8B7] # SAURASHTRA VOWEL SIGN II
+A8B8  ; [.1EDB.0020.0002.A8B8] # SAURASHTRA VOWEL SIGN U
+A8B9  ; [.1EDC.0020.0002.A8B9] # SAURASHTRA VOWEL SIGN UU
+A8BA  ; [.1EDD.0020.0002.A8BA] # SAURASHTRA VOWEL SIGN VOCALIC R
+A8BB  ; [.1EDE.0020.0002.A8BB] # SAURASHTRA VOWEL SIGN VOCALIC RR
+A8BC  ; [.1EDF.0020.0002.A8BC] # SAURASHTRA VOWEL SIGN VOCALIC L
+A8BD  ; [.1EE0.0020.0002.A8BD] # SAURASHTRA VOWEL SIGN VOCALIC LL
+A8BE  ; [.1EE1.0020.0002.A8BE] # SAURASHTRA VOWEL SIGN E
+A8BF  ; [.1EE2.0020.0002.A8BF] # SAURASHTRA VOWEL SIGN EE
+A8C0  ; [.1EE3.0020.0002.A8C0] # SAURASHTRA VOWEL SIGN AI
+A8C1  ; [.1EE4.0020.0002.A8C1] # SAURASHTRA VOWEL SIGN O
+A8C2  ; [.1EE5.0020.0002.A8C2] # SAURASHTRA VOWEL SIGN OO
+A8C3  ; [.1EE6.0020.0002.A8C3] # SAURASHTRA VOWEL SIGN AU
+A8C4  ; [.1EE7.0020.0002.A8C4] # SAURASHTRA SIGN VIRAMA
+11083 ; [.1EE8.0020.0002.11083] # KAITHI LETTER A
+11084 ; [.1EE9.0020.0002.11084] # KAITHI LETTER AA
+11085 ; [.1EEA.0020.0002.11085] # KAITHI LETTER I
+11086 ; [.1EEB.0020.0002.11086] # KAITHI LETTER II
+11087 ; [.1EEC.0020.0002.11087] # KAITHI LETTER U
+11088 ; [.1EED.0020.0002.11088] # KAITHI LETTER UU
+11089 ; [.1EEE.0020.0002.11089] # KAITHI LETTER E
+1108A ; [.1EEF.0020.0002.1108A] # KAITHI LETTER AI
+1108B ; [.1EF0.0020.0002.1108B] # KAITHI LETTER O
+1108C ; [.1EF1.0020.0002.1108C] # KAITHI LETTER AU
+1108D ; [.1EF2.0020.0002.1108D] # KAITHI LETTER KA
+1108E ; [.1EF3.0020.0002.1108E] # KAITHI LETTER KHA
+1108F ; [.1EF4.0020.0002.1108F] # KAITHI LETTER GA
+11090 ; [.1EF5.0020.0002.11090] # KAITHI LETTER GHA
+11091 ; [.1EF6.0020.0002.11091] # KAITHI LETTER NGA
+11092 ; [.1EF7.0020.0002.11092] # KAITHI LETTER CA
+11093 ; [.1EF8.0020.0002.11093] # KAITHI LETTER CHA
+11094 ; [.1EF9.0020.0002.11094] # KAITHI LETTER JA
+11095 ; [.1EFA.0020.0002.11095] # KAITHI LETTER JHA
+11096 ; [.1EFB.0020.0002.11096] # KAITHI LETTER NYA
+11097 ; [.1EFC.0020.0002.11097] # KAITHI LETTER TTA
+11098 ; [.1EFD.0020.0002.11098] # KAITHI LETTER TTHA
+11099 ; [.1EFE.0020.0002.11099] # KAITHI LETTER DDA
+1109A ; [.1EFE.0020.0002.11099][.0000.0112.0002.110BA] # KAITHI LETTER DDDHA; QQCM
+1109B ; [.1EFF.0020.0002.1109B] # KAITHI LETTER DDHA
+1109C ; [.1EFF.0020.0002.1109B][.0000.0112.0002.110BA] # KAITHI LETTER RHA; QQCM
+1109D ; [.1F00.0020.0002.1109D] # KAITHI LETTER NNA
+1109E ; [.1F01.0020.0002.1109E] # KAITHI LETTER TA
+1109F ; [.1F02.0020.0002.1109F] # KAITHI LETTER THA
+110A0 ; [.1F03.0020.0002.110A0] # KAITHI LETTER DA
+110A1 ; [.1F04.0020.0002.110A1] # KAITHI LETTER DHA
+110A2 ; [.1F05.0020.0002.110A2] # KAITHI LETTER NA
+110A3 ; [.1F06.0020.0002.110A3] # KAITHI LETTER PA
+110A4 ; [.1F07.0020.0002.110A4] # KAITHI LETTER PHA
+110A5 ; [.1F08.0020.0002.110A5] # KAITHI LETTER BA
+110AB ; [.1F08.0020.0002.110A5][.0000.0112.0002.110BA] # KAITHI LETTER VA; QQCM
+110A6 ; [.1F09.0020.0002.110A6] # KAITHI LETTER BHA
+110A7 ; [.1F0A.0020.0002.110A7] # KAITHI LETTER MA
+110A8 ; [.1F0B.0020.0002.110A8] # KAITHI LETTER YA
+110A9 ; [.1F0C.0020.0002.110A9] # KAITHI LETTER RA
+110AA ; [.1F0D.0020.0002.110AA] # KAITHI LETTER LA
+110AC ; [.1F0E.0020.0002.110AC] # KAITHI LETTER SHA
+110AD ; [.1F0F.0020.0002.110AD] # KAITHI LETTER SSA
+110AE ; [.1F10.0020.0002.110AE] # KAITHI LETTER SA
+110AF ; [.1F11.0020.0002.110AF] # KAITHI LETTER HA
+110B0 ; [.1F12.0020.0002.110B0] # KAITHI VOWEL SIGN AA
+110B1 ; [.1F13.0020.0002.110B1] # KAITHI VOWEL SIGN I
+110B2 ; [.1F14.0020.0002.110B2] # KAITHI VOWEL SIGN II
+110B3 ; [.1F15.0020.0002.110B3] # KAITHI VOWEL SIGN U
+110B4 ; [.1F16.0020.0002.110B4] # KAITHI VOWEL SIGN UU
+110B5 ; [.1F17.0020.0002.110B5] # KAITHI VOWEL SIGN E
+110B6 ; [.1F18.0020.0002.110B6] # KAITHI VOWEL SIGN AI
+110B7 ; [.1F19.0020.0002.110B7] # KAITHI VOWEL SIGN O
+110B8 ; [.1F1A.0020.0002.110B8] # KAITHI VOWEL SIGN AU
+110B9 ; [.1F1B.0020.0002.110B9] # KAITHI SIGN VIRAMA
+1B83  ; [.1F1C.0020.0002.1B83] # SUNDANESE LETTER A
+1B84  ; [.1F1D.0020.0002.1B84] # SUNDANESE LETTER I
+1B85  ; [.1F1E.0020.0002.1B85] # SUNDANESE LETTER U
+1B86  ; [.1F1F.0020.0002.1B86] # SUNDANESE LETTER AE
+1B87  ; [.1F20.0020.0002.1B87] # SUNDANESE LETTER O
+1B88  ; [.1F21.0020.0002.1B88] # SUNDANESE LETTER E
+1B89  ; [.1F22.0020.0002.1B89] # SUNDANESE LETTER EU
+1B8A  ; [.1F23.0020.0002.1B8A] # SUNDANESE LETTER KA
+1BAE  ; [.1F24.0020.0002.1BAE] # SUNDANESE LETTER KHA
+1B8B  ; [.1F25.0020.0002.1B8B] # SUNDANESE LETTER QA
+1B8C  ; [.1F26.0020.0002.1B8C] # SUNDANESE LETTER GA
+1B8D  ; [.1F27.0020.0002.1B8D] # SUNDANESE LETTER NGA
+1B8E  ; [.1F28.0020.0002.1B8E] # SUNDANESE LETTER CA
+1B8F  ; [.1F29.0020.0002.1B8F] # SUNDANESE LETTER JA
+1B90  ; [.1F2A.0020.0002.1B90] # SUNDANESE LETTER ZA
+1B91  ; [.1F2B.0020.0002.1B91] # SUNDANESE LETTER NYA
+1B92  ; [.1F2C.0020.0002.1B92] # SUNDANESE LETTER TA
+1B93  ; [.1F2D.0020.0002.1B93] # SUNDANESE LETTER DA
+1B94  ; [.1F2E.0020.0002.1B94] # SUNDANESE LETTER NA
+1B95  ; [.1F2F.0020.0002.1B95] # SUNDANESE LETTER PA
+1B96  ; [.1F30.0020.0002.1B96] # SUNDANESE LETTER FA
+1B97  ; [.1F31.0020.0002.1B97] # SUNDANESE LETTER VA
+1B98  ; [.1F32.0020.0002.1B98] # SUNDANESE LETTER BA
+1B99  ; [.1F33.0020.0002.1B99] # SUNDANESE LETTER MA
+1B9A  ; [.1F34.0020.0002.1B9A] # SUNDANESE LETTER YA
+1BA1  ; [.1F35.0020.0002.1BA1] # SUNDANESE CONSONANT SIGN PAMINGKAL
+1B9B  ; [.1F36.0020.0002.1B9B] # SUNDANESE LETTER RA
+1BA2  ; [.1F37.0020.0002.1BA2] # SUNDANESE CONSONANT SIGN PANYAKRA
+1B9C  ; [.1F38.0020.0002.1B9C] # SUNDANESE LETTER LA
+1BA3  ; [.1F39.0020.0002.1BA3] # SUNDANESE CONSONANT SIGN PANYIKU
+1B9D  ; [.1F3A.0020.0002.1B9D] # SUNDANESE LETTER WA
+1B9E  ; [.1F3B.0020.0002.1B9E] # SUNDANESE LETTER SA
+1B9F  ; [.1F3C.0020.0002.1B9F] # SUNDANESE LETTER XA
+1BAF  ; [.1F3D.0020.0002.1BAF] # SUNDANESE LETTER SYA
+1BA0  ; [.1F3E.0020.0002.1BA0] # SUNDANESE LETTER HA
+1BA4  ; [.1F3F.0020.0002.1BA4] # SUNDANESE VOWEL SIGN PANGHULU
+1BA5  ; [.1F40.0020.0002.1BA5] # SUNDANESE VOWEL SIGN PANYUKU
+1BA6  ; [.1F41.0020.0002.1BA6] # SUNDANESE VOWEL SIGN PANAELAENG
+1BA7  ; [.1F42.0020.0002.1BA7] # SUNDANESE VOWEL SIGN PANOLONG
+1BA8  ; [.1F43.0020.0002.1BA8] # SUNDANESE VOWEL SIGN PAMEPET
+1BA9  ; [.1F44.0020.0002.1BA9] # SUNDANESE VOWEL SIGN PANEULEUNG
+1BAA  ; [.1F45.0020.0002.1BAA] # SUNDANESE SIGN PAMAAEH
+10A00 ; [.1F46.0020.0002.10A00] # KHAROSHTHI LETTER A
+10A01 ; [.1F47.0020.0002.10A01] # KHAROSHTHI VOWEL SIGN I
+10A02 ; [.1F48.0020.0002.10A02] # KHAROSHTHI VOWEL SIGN U
+10A03 ; [.1F49.0020.0002.10A03] # KHAROSHTHI VOWEL SIGN VOCALIC R
+10A05 ; [.1F4A.0020.0002.10A05] # KHAROSHTHI VOWEL SIGN E
+10A06 ; [.1F4B.0020.0002.10A06] # KHAROSHTHI VOWEL SIGN O
+10A0C ; [.1F4C.0020.0002.10A0C] # KHAROSHTHI VOWEL LENGTH MARK
+10A10 ; [.1F4D.0020.0002.10A10] # KHAROSHTHI LETTER KA
+10A11 ; [.1F4E.0020.0002.10A11] # KHAROSHTHI LETTER KHA
+10A12 ; [.1F4F.0020.0002.10A12] # KHAROSHTHI LETTER GA
+10A13 ; [.1F50.0020.0002.10A13] # KHAROSHTHI LETTER GHA
+10A15 ; [.1F51.0020.0002.10A15] # KHAROSHTHI LETTER CA
+10A16 ; [.1F52.0020.0002.10A16] # KHAROSHTHI LETTER CHA
+10A17 ; [.1F53.0020.0002.10A17] # KHAROSHTHI LETTER JA
+10A19 ; [.1F54.0020.0002.10A19] # KHAROSHTHI LETTER NYA
+10A1A ; [.1F55.0020.0002.10A1A] # KHAROSHTHI LETTER TTA
+10A1B ; [.1F56.0020.0002.10A1B] # KHAROSHTHI LETTER TTHA
+10A1C ; [.1F57.0020.0002.10A1C] # KHAROSHTHI LETTER DDA
+10A1D ; [.1F58.0020.0002.10A1D] # KHAROSHTHI LETTER DDHA
+10A1E ; [.1F59.0020.0002.10A1E] # KHAROSHTHI LETTER NNA
+10A1F ; [.1F5A.0020.0002.10A1F] # KHAROSHTHI LETTER TA
+10A20 ; [.1F5B.0020.0002.10A20] # KHAROSHTHI LETTER THA
+10A21 ; [.1F5C.0020.0002.10A21] # KHAROSHTHI LETTER DA
+10A22 ; [.1F5D.0020.0002.10A22] # KHAROSHTHI LETTER DHA
+10A23 ; [.1F5E.0020.0002.10A23] # KHAROSHTHI LETTER NA
+10A24 ; [.1F5F.0020.0002.10A24] # KHAROSHTHI LETTER PA
+10A25 ; [.1F60.0020.0002.10A25] # KHAROSHTHI LETTER PHA
+10A26 ; [.1F61.0020.0002.10A26] # KHAROSHTHI LETTER BA
+10A27 ; [.1F62.0020.0002.10A27] # KHAROSHTHI LETTER BHA
+10A28 ; [.1F63.0020.0002.10A28] # KHAROSHTHI LETTER MA
+10A29 ; [.1F64.0020.0002.10A29] # KHAROSHTHI LETTER YA
+10A2A ; [.1F65.0020.0002.10A2A] # KHAROSHTHI LETTER RA
+10A2B ; [.1F66.0020.0002.10A2B] # KHAROSHTHI LETTER LA
+10A2C ; [.1F67.0020.0002.10A2C] # KHAROSHTHI LETTER VA
+10A2D ; [.1F68.0020.0002.10A2D] # KHAROSHTHI LETTER SHA
+10A2E ; [.1F69.0020.0002.10A2E] # KHAROSHTHI LETTER SSA
+10A2F ; [.1F6A.0020.0002.10A2F] # KHAROSHTHI LETTER SA
+10A30 ; [.1F6B.0020.0002.10A30] # KHAROSHTHI LETTER ZA
+10A31 ; [.1F6C.0020.0002.10A31] # KHAROSHTHI LETTER HA
+10A32 ; [.1F6D.0020.0002.10A32] # KHAROSHTHI LETTER KKA
+10A33 ; [.1F6E.0020.0002.10A33] # KHAROSHTHI LETTER TTTHA
+10A3F ; [.1F6F.0020.0002.10A3F] # KHAROSHTHI VIRAMA
+0E01  ; [.1F70.0020.0002.0E01] # THAI CHARACTER KO KAI
+0E40 0E01 ; [.1F70.0020.0002.0E01][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER KO KAI>
+0E41 0E01 ; [.1F70.0020.0002.0E01][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER KO KAI>
+0E42 0E01 ; [.1F70.0020.0002.0E01][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER KO KAI>
+0E43 0E01 ; [.1F70.0020.0002.0E01][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KO KAI>
+0E44 0E01 ; [.1F70.0020.0002.0E01][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KO KAI>
+0E02  ; [.1F71.0020.0002.0E02] # THAI CHARACTER KHO KHAI
+0E40 0E02 ; [.1F71.0020.0002.0E02][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER KHO KHAI>
+0E41 0E02 ; [.1F71.0020.0002.0E02][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO KHAI>
+0E42 0E02 ; [.1F71.0020.0002.0E02][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER KHO KHAI>
+0E43 0E02 ; [.1F71.0020.0002.0E02][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO KHAI>
+0E44 0E02 ; [.1F71.0020.0002.0E02][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO KHAI>
+0E03  ; [.1F72.0020.0002.0E03] # THAI CHARACTER KHO KHUAT
+0E40 0E03 ; [.1F72.0020.0002.0E03][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER KHO KHUAT>
+0E41 0E03 ; [.1F72.0020.0002.0E03][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO KHUAT>
+0E42 0E03 ; [.1F72.0020.0002.0E03][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER KHO KHUAT>
+0E43 0E03 ; [.1F72.0020.0002.0E03][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO KHUAT>
+0E44 0E03 ; [.1F72.0020.0002.0E03][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO KHUAT>
+0E04  ; [.1F73.0020.0002.0E04] # THAI CHARACTER KHO KHWAI
+0E40 0E04 ; [.1F73.0020.0002.0E04][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER KHO KHWAI>
+0E41 0E04 ; [.1F73.0020.0002.0E04][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO KHWAI>
+0E42 0E04 ; [.1F73.0020.0002.0E04][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER KHO KHWAI>
+0E43 0E04 ; [.1F73.0020.0002.0E04][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO KHWAI>
+0E44 0E04 ; [.1F73.0020.0002.0E04][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO KHWAI>
+0E05  ; [.1F74.0020.0002.0E05] # THAI CHARACTER KHO KHON
+0E40 0E05 ; [.1F74.0020.0002.0E05][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER KHO KHON>
+0E41 0E05 ; [.1F74.0020.0002.0E05][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO KHON>
+0E42 0E05 ; [.1F74.0020.0002.0E05][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER KHO KHON>
+0E43 0E05 ; [.1F74.0020.0002.0E05][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO KHON>
+0E44 0E05 ; [.1F74.0020.0002.0E05][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO KHON>
+0E06  ; [.1F75.0020.0002.0E06] # THAI CHARACTER KHO RAKHANG
+0E40 0E06 ; [.1F75.0020.0002.0E06][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER KHO RAKHANG>
+0E41 0E06 ; [.1F75.0020.0002.0E06][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO RAKHANG>
+0E42 0E06 ; [.1F75.0020.0002.0E06][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER KHO RAKHANG>
+0E43 0E06 ; [.1F75.0020.0002.0E06][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO RAKHANG>
+0E44 0E06 ; [.1F75.0020.0002.0E06][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO RAKHANG>
+0E07  ; [.1F76.0020.0002.0E07] # THAI CHARACTER NGO NGU
+0E40 0E07 ; [.1F76.0020.0002.0E07][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER NGO NGU>
+0E41 0E07 ; [.1F76.0020.0002.0E07][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER NGO NGU>
+0E42 0E07 ; [.1F76.0020.0002.0E07][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER NGO NGU>
+0E43 0E07 ; [.1F76.0020.0002.0E07][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER NGO NGU>
+0E44 0E07 ; [.1F76.0020.0002.0E07][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER NGO NGU>
+0E08  ; [.1F77.0020.0002.0E08] # THAI CHARACTER CHO CHAN
+0E40 0E08 ; [.1F77.0020.0002.0E08][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER CHO CHAN>
+0E41 0E08 ; [.1F77.0020.0002.0E08][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER CHO CHAN>
+0E42 0E08 ; [.1F77.0020.0002.0E08][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER CHO CHAN>
+0E43 0E08 ; [.1F77.0020.0002.0E08][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER CHO CHAN>
+0E44 0E08 ; [.1F77.0020.0002.0E08][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER CHO CHAN>
+0E09  ; [.1F78.0020.0002.0E09] # THAI CHARACTER CHO CHING
+0E40 0E09 ; [.1F78.0020.0002.0E09][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER CHO CHING>
+0E41 0E09 ; [.1F78.0020.0002.0E09][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER CHO CHING>
+0E42 0E09 ; [.1F78.0020.0002.0E09][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER CHO CHING>
+0E43 0E09 ; [.1F78.0020.0002.0E09][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER CHO CHING>
+0E44 0E09 ; [.1F78.0020.0002.0E09][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER CHO CHING>
+0E0A  ; [.1F79.0020.0002.0E0A] # THAI CHARACTER CHO CHANG
+0E40 0E0A ; [.1F79.0020.0002.0E0A][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER CHO CHANG>
+0E41 0E0A ; [.1F79.0020.0002.0E0A][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER CHO CHANG>
+0E42 0E0A ; [.1F79.0020.0002.0E0A][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER CHO CHANG>
+0E43 0E0A ; [.1F79.0020.0002.0E0A][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER CHO CHANG>
+0E44 0E0A ; [.1F79.0020.0002.0E0A][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER CHO CHANG>
+0E0B  ; [.1F7A.0020.0002.0E0B] # THAI CHARACTER SO SO
+0E40 0E0B ; [.1F7A.0020.0002.0E0B][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER SO SO>
+0E41 0E0B ; [.1F7A.0020.0002.0E0B][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER SO SO>
+0E42 0E0B ; [.1F7A.0020.0002.0E0B][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER SO SO>
+0E43 0E0B ; [.1F7A.0020.0002.0E0B][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER SO SO>
+0E44 0E0B ; [.1F7A.0020.0002.0E0B][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER SO SO>
+0E0C  ; [.1F7B.0020.0002.0E0C] # THAI CHARACTER CHO CHOE
+0E40 0E0C ; [.1F7B.0020.0002.0E0C][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER CHO CHOE>
+0E41 0E0C ; [.1F7B.0020.0002.0E0C][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER CHO CHOE>
+0E42 0E0C ; [.1F7B.0020.0002.0E0C][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER CHO CHOE>
+0E43 0E0C ; [.1F7B.0020.0002.0E0C][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER CHO CHOE>
+0E44 0E0C ; [.1F7B.0020.0002.0E0C][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER CHO CHOE>
+0E0D  ; [.1F7C.0020.0002.0E0D] # THAI CHARACTER YO YING
+0E40 0E0D ; [.1F7C.0020.0002.0E0D][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER YO YING>
+0E41 0E0D ; [.1F7C.0020.0002.0E0D][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER YO YING>
+0E42 0E0D ; [.1F7C.0020.0002.0E0D][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER YO YING>
+0E43 0E0D ; [.1F7C.0020.0002.0E0D][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER YO YING>
+0E44 0E0D ; [.1F7C.0020.0002.0E0D][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER YO YING>
+0E0E  ; [.1F7D.0020.0002.0E0E] # THAI CHARACTER DO CHADA
+0E40 0E0E ; [.1F7D.0020.0002.0E0E][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER DO CHADA>
+0E41 0E0E ; [.1F7D.0020.0002.0E0E][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER DO CHADA>
+0E42 0E0E ; [.1F7D.0020.0002.0E0E][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER DO CHADA>
+0E43 0E0E ; [.1F7D.0020.0002.0E0E][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER DO CHADA>
+0E44 0E0E ; [.1F7D.0020.0002.0E0E][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER DO CHADA>
+0E0F  ; [.1F7E.0020.0002.0E0F] # THAI CHARACTER TO PATAK
+0E40 0E0F ; [.1F7E.0020.0002.0E0F][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER TO PATAK>
+0E41 0E0F ; [.1F7E.0020.0002.0E0F][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER TO PATAK>
+0E42 0E0F ; [.1F7E.0020.0002.0E0F][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER TO PATAK>
+0E43 0E0F ; [.1F7E.0020.0002.0E0F][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER TO PATAK>
+0E44 0E0F ; [.1F7E.0020.0002.0E0F][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER TO PATAK>
+0E10  ; [.1F7F.0020.0002.0E10] # THAI CHARACTER THO THAN
+0E40 0E10 ; [.1F7F.0020.0002.0E10][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER THO THAN>
+0E41 0E10 ; [.1F7F.0020.0002.0E10][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER THO THAN>
+0E42 0E10 ; [.1F7F.0020.0002.0E10][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER THO THAN>
+0E43 0E10 ; [.1F7F.0020.0002.0E10][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO THAN>
+0E44 0E10 ; [.1F7F.0020.0002.0E10][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO THAN>
+0E11  ; [.1F80.0020.0002.0E11] # THAI CHARACTER THO NANGMONTHO
+0E40 0E11 ; [.1F80.0020.0002.0E11][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER THO NANGMONTHO>
+0E41 0E11 ; [.1F80.0020.0002.0E11][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER THO NANGMONTHO>
+0E42 0E11 ; [.1F80.0020.0002.0E11][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER THO NANGMONTHO>
+0E43 0E11 ; [.1F80.0020.0002.0E11][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO NANGMONTHO>
+0E44 0E11 ; [.1F80.0020.0002.0E11][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO NANGMONTHO>
+0E12  ; [.1F81.0020.0002.0E12] # THAI CHARACTER THO PHUTHAO
+0E40 0E12 ; [.1F81.0020.0002.0E12][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER THO PHUTHAO>
+0E41 0E12 ; [.1F81.0020.0002.0E12][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER THO PHUTHAO>
+0E42 0E12 ; [.1F81.0020.0002.0E12][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER THO PHUTHAO>
+0E43 0E12 ; [.1F81.0020.0002.0E12][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO PHUTHAO>
+0E44 0E12 ; [.1F81.0020.0002.0E12][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO PHUTHAO>
+0E13  ; [.1F82.0020.0002.0E13] # THAI CHARACTER NO NEN
+0E40 0E13 ; [.1F82.0020.0002.0E13][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER NO NEN>
+0E41 0E13 ; [.1F82.0020.0002.0E13][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER NO NEN>
+0E42 0E13 ; [.1F82.0020.0002.0E13][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER NO NEN>
+0E43 0E13 ; [.1F82.0020.0002.0E13][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER NO NEN>
+0E44 0E13 ; [.1F82.0020.0002.0E13][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER NO NEN>
+0E14  ; [.1F83.0020.0002.0E14] # THAI CHARACTER DO DEK
+0E40 0E14 ; [.1F83.0020.0002.0E14][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER DO DEK>
+0E41 0E14 ; [.1F83.0020.0002.0E14][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER DO DEK>
+0E42 0E14 ; [.1F83.0020.0002.0E14][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER DO DEK>
+0E43 0E14 ; [.1F83.0020.0002.0E14][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER DO DEK>
+0E44 0E14 ; [.1F83.0020.0002.0E14][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER DO DEK>
+0E15  ; [.1F84.0020.0002.0E15] # THAI CHARACTER TO TAO
+0E40 0E15 ; [.1F84.0020.0002.0E15][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER TO TAO>
+0E41 0E15 ; [.1F84.0020.0002.0E15][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER TO TAO>
+0E42 0E15 ; [.1F84.0020.0002.0E15][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER TO TAO>
+0E43 0E15 ; [.1F84.0020.0002.0E15][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER TO TAO>
+0E44 0E15 ; [.1F84.0020.0002.0E15][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER TO TAO>
+0E16  ; [.1F85.0020.0002.0E16] # THAI CHARACTER THO THUNG
+0E40 0E16 ; [.1F85.0020.0002.0E16][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER THO THUNG>
+0E41 0E16 ; [.1F85.0020.0002.0E16][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER THO THUNG>
+0E42 0E16 ; [.1F85.0020.0002.0E16][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER THO THUNG>
+0E43 0E16 ; [.1F85.0020.0002.0E16][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO THUNG>
+0E44 0E16 ; [.1F85.0020.0002.0E16][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO THUNG>
+0E17  ; [.1F86.0020.0002.0E17] # THAI CHARACTER THO THAHAN
+0E40 0E17 ; [.1F86.0020.0002.0E17][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER THO THAHAN>
+0E41 0E17 ; [.1F86.0020.0002.0E17][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER THO THAHAN>
+0E42 0E17 ; [.1F86.0020.0002.0E17][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER THO THAHAN>
+0E43 0E17 ; [.1F86.0020.0002.0E17][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO THAHAN>
+0E44 0E17 ; [.1F86.0020.0002.0E17][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO THAHAN>
+0E18  ; [.1F87.0020.0002.0E18] # THAI CHARACTER THO THONG
+0E40 0E18 ; [.1F87.0020.0002.0E18][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER THO THONG>
+0E41 0E18 ; [.1F87.0020.0002.0E18][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER THO THONG>
+0E42 0E18 ; [.1F87.0020.0002.0E18][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER THO THONG>
+0E43 0E18 ; [.1F87.0020.0002.0E18][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO THONG>
+0E44 0E18 ; [.1F87.0020.0002.0E18][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO THONG>
+0E19  ; [.1F88.0020.0002.0E19] # THAI CHARACTER NO NU
+0E40 0E19 ; [.1F88.0020.0002.0E19][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER NO NU>
+0E41 0E19 ; [.1F88.0020.0002.0E19][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER NO NU>
+0E42 0E19 ; [.1F88.0020.0002.0E19][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER NO NU>
+0E43 0E19 ; [.1F88.0020.0002.0E19][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER NO NU>
+0E44 0E19 ; [.1F88.0020.0002.0E19][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER NO NU>
+0E1A  ; [.1F89.0020.0002.0E1A] # THAI CHARACTER BO BAIMAI
+0E40 0E1A ; [.1F89.0020.0002.0E1A][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER BO BAIMAI>
+0E41 0E1A ; [.1F89.0020.0002.0E1A][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER BO BAIMAI>
+0E42 0E1A ; [.1F89.0020.0002.0E1A][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER BO BAIMAI>
+0E43 0E1A ; [.1F89.0020.0002.0E1A][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER BO BAIMAI>
+0E44 0E1A ; [.1F89.0020.0002.0E1A][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER BO BAIMAI>
+0E1B  ; [.1F8A.0020.0002.0E1B] # THAI CHARACTER PO PLA
+0E40 0E1B ; [.1F8A.0020.0002.0E1B][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER PO PLA>
+0E41 0E1B ; [.1F8A.0020.0002.0E1B][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER PO PLA>
+0E42 0E1B ; [.1F8A.0020.0002.0E1B][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER PO PLA>
+0E43 0E1B ; [.1F8A.0020.0002.0E1B][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER PO PLA>
+0E44 0E1B ; [.1F8A.0020.0002.0E1B][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER PO PLA>
+0E1C  ; [.1F8B.0020.0002.0E1C] # THAI CHARACTER PHO PHUNG
+0E40 0E1C ; [.1F8B.0020.0002.0E1C][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER PHO PHUNG>
+0E41 0E1C ; [.1F8B.0020.0002.0E1C][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER PHO PHUNG>
+0E42 0E1C ; [.1F8B.0020.0002.0E1C][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER PHO PHUNG>
+0E43 0E1C ; [.1F8B.0020.0002.0E1C][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER PHO PHUNG>
+0E44 0E1C ; [.1F8B.0020.0002.0E1C][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER PHO PHUNG>
+0E1D  ; [.1F8C.0020.0002.0E1D] # THAI CHARACTER FO FA
+0E40 0E1D ; [.1F8C.0020.0002.0E1D][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER FO FA>
+0E41 0E1D ; [.1F8C.0020.0002.0E1D][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER FO FA>
+0E42 0E1D ; [.1F8C.0020.0002.0E1D][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER FO FA>
+0E43 0E1D ; [.1F8C.0020.0002.0E1D][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER FO FA>
+0E44 0E1D ; [.1F8C.0020.0002.0E1D][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER FO FA>
+0E1E  ; [.1F8D.0020.0002.0E1E] # THAI CHARACTER PHO PHAN
+0E40 0E1E ; [.1F8D.0020.0002.0E1E][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER PHO PHAN>
+0E41 0E1E ; [.1F8D.0020.0002.0E1E][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER PHO PHAN>
+0E42 0E1E ; [.1F8D.0020.0002.0E1E][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER PHO PHAN>
+0E43 0E1E ; [.1F8D.0020.0002.0E1E][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER PHO PHAN>
+0E44 0E1E ; [.1F8D.0020.0002.0E1E][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER PHO PHAN>
+0E1F  ; [.1F8E.0020.0002.0E1F] # THAI CHARACTER FO FAN
+0E40 0E1F ; [.1F8E.0020.0002.0E1F][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER FO FAN>
+0E41 0E1F ; [.1F8E.0020.0002.0E1F][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER FO FAN>
+0E42 0E1F ; [.1F8E.0020.0002.0E1F][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER FO FAN>
+0E43 0E1F ; [.1F8E.0020.0002.0E1F][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER FO FAN>
+0E44 0E1F ; [.1F8E.0020.0002.0E1F][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER FO FAN>
+0E20  ; [.1F8F.0020.0002.0E20] # THAI CHARACTER PHO SAMPHAO
+0E40 0E20 ; [.1F8F.0020.0002.0E20][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER PHO SAMPHAO>
+0E41 0E20 ; [.1F8F.0020.0002.0E20][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER PHO SAMPHAO>
+0E42 0E20 ; [.1F8F.0020.0002.0E20][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER PHO SAMPHAO>
+0E43 0E20 ; [.1F8F.0020.0002.0E20][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER PHO SAMPHAO>
+0E44 0E20 ; [.1F8F.0020.0002.0E20][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER PHO SAMPHAO>
+0E21  ; [.1F90.0020.0002.0E21] # THAI CHARACTER MO MA
+0E40 0E21 ; [.1F90.0020.0002.0E21][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER MO MA>
+0E41 0E21 ; [.1F90.0020.0002.0E21][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER MO MA>
+0E42 0E21 ; [.1F90.0020.0002.0E21][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER MO MA>
+0E43 0E21 ; [.1F90.0020.0002.0E21][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER MO MA>
+0E44 0E21 ; [.1F90.0020.0002.0E21][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER MO MA>
+0E22  ; [.1F91.0020.0002.0E22] # THAI CHARACTER YO YAK
+0E40 0E22 ; [.1F91.0020.0002.0E22][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER YO YAK>
+0E41 0E22 ; [.1F91.0020.0002.0E22][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER YO YAK>
+0E42 0E22 ; [.1F91.0020.0002.0E22][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER YO YAK>
+0E43 0E22 ; [.1F91.0020.0002.0E22][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER YO YAK>
+0E44 0E22 ; [.1F91.0020.0002.0E22][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER YO YAK>
+0E23  ; [.1F92.0020.0002.0E23] # THAI CHARACTER RO RUA
+0E40 0E23 ; [.1F92.0020.0002.0E23][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER RO RUA>
+0E41 0E23 ; [.1F92.0020.0002.0E23][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER RO RUA>
+0E42 0E23 ; [.1F92.0020.0002.0E23][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER RO RUA>
+0E43 0E23 ; [.1F92.0020.0002.0E23][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER RO RUA>
+0E44 0E23 ; [.1F92.0020.0002.0E23][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER RO RUA>
+0E24  ; [.1F93.0020.0002.0E24] # THAI CHARACTER RU
+0E40 0E24 ; [.1F93.0020.0002.0E24][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER RU>
+0E41 0E24 ; [.1F93.0020.0002.0E24][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER RU>
+0E42 0E24 ; [.1F93.0020.0002.0E24][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER RU>
+0E43 0E24 ; [.1F93.0020.0002.0E24][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER RU>
+0E44 0E24 ; [.1F93.0020.0002.0E24][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER RU>
+0E25  ; [.1F94.0020.0002.0E25] # THAI CHARACTER LO LING
+0E40 0E25 ; [.1F94.0020.0002.0E25][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER LO LING>
+0E41 0E25 ; [.1F94.0020.0002.0E25][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER LO LING>
+0E42 0E25 ; [.1F94.0020.0002.0E25][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER LO LING>
+0E43 0E25 ; [.1F94.0020.0002.0E25][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER LO LING>
+0E44 0E25 ; [.1F94.0020.0002.0E25][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER LO LING>
+0E26  ; [.1F95.0020.0002.0E26] # THAI CHARACTER LU
+0E40 0E26 ; [.1F95.0020.0002.0E26][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER LU>
+0E41 0E26 ; [.1F95.0020.0002.0E26][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER LU>
+0E42 0E26 ; [.1F95.0020.0002.0E26][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER LU>
+0E43 0E26 ; [.1F95.0020.0002.0E26][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER LU>
+0E44 0E26 ; [.1F95.0020.0002.0E26][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER LU>
+0E27  ; [.1F96.0020.0002.0E27] # THAI CHARACTER WO WAEN
+0E40 0E27 ; [.1F96.0020.0002.0E27][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER WO WAEN>
+0E41 0E27 ; [.1F96.0020.0002.0E27][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER WO WAEN>
+0E42 0E27 ; [.1F96.0020.0002.0E27][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER WO WAEN>
+0E43 0E27 ; [.1F96.0020.0002.0E27][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER WO WAEN>
+0E44 0E27 ; [.1F96.0020.0002.0E27][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER WO WAEN>
+0E28  ; [.1F97.0020.0002.0E28] # THAI CHARACTER SO SALA
+0E40 0E28 ; [.1F97.0020.0002.0E28][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER SO SALA>
+0E41 0E28 ; [.1F97.0020.0002.0E28][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER SO SALA>
+0E42 0E28 ; [.1F97.0020.0002.0E28][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER SO SALA>
+0E43 0E28 ; [.1F97.0020.0002.0E28][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER SO SALA>
+0E44 0E28 ; [.1F97.0020.0002.0E28][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER SO SALA>
+0E29  ; [.1F98.0020.0002.0E29] # THAI CHARACTER SO RUSI
+0E40 0E29 ; [.1F98.0020.0002.0E29][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER SO RUSI>
+0E41 0E29 ; [.1F98.0020.0002.0E29][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER SO RUSI>
+0E42 0E29 ; [.1F98.0020.0002.0E29][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER SO RUSI>
+0E43 0E29 ; [.1F98.0020.0002.0E29][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER SO RUSI>
+0E44 0E29 ; [.1F98.0020.0002.0E29][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER SO RUSI>
+0E2A  ; [.1F99.0020.0002.0E2A] # THAI CHARACTER SO SUA
+0E40 0E2A ; [.1F99.0020.0002.0E2A][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER SO SUA>
+0E41 0E2A ; [.1F99.0020.0002.0E2A][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER SO SUA>
+0E42 0E2A ; [.1F99.0020.0002.0E2A][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER SO SUA>
+0E43 0E2A ; [.1F99.0020.0002.0E2A][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER SO SUA>
+0E44 0E2A ; [.1F99.0020.0002.0E2A][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER SO SUA>
+0E2B  ; [.1F9A.0020.0002.0E2B] # THAI CHARACTER HO HIP
+0E40 0E2B ; [.1F9A.0020.0002.0E2B][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER HO HIP>
+0E41 0E2B ; [.1F9A.0020.0002.0E2B][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER HO HIP>
+0E42 0E2B ; [.1F9A.0020.0002.0E2B][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER HO HIP>
+0E43 0E2B ; [.1F9A.0020.0002.0E2B][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER HO HIP>
+0E44 0E2B ; [.1F9A.0020.0002.0E2B][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER HO HIP>
+0E2C  ; [.1F9B.0020.0002.0E2C] # THAI CHARACTER LO CHULA
+0E40 0E2C ; [.1F9B.0020.0002.0E2C][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER LO CHULA>
+0E41 0E2C ; [.1F9B.0020.0002.0E2C][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER LO CHULA>
+0E42 0E2C ; [.1F9B.0020.0002.0E2C][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER LO CHULA>
+0E43 0E2C ; [.1F9B.0020.0002.0E2C][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER LO CHULA>
+0E44 0E2C ; [.1F9B.0020.0002.0E2C][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER LO CHULA>
+0E2D  ; [.1F9C.0020.0002.0E2D] # THAI CHARACTER O ANG
+0E40 0E2D ; [.1F9C.0020.0002.0E2D][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER O ANG>
+0E41 0E2D ; [.1F9C.0020.0002.0E2D][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER O ANG>
+0E42 0E2D ; [.1F9C.0020.0002.0E2D][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER O ANG>
+0E43 0E2D ; [.1F9C.0020.0002.0E2D][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER O ANG>
+0E44 0E2D ; [.1F9C.0020.0002.0E2D][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER O ANG>
+0E2E  ; [.1F9D.0020.0002.0E2E] # THAI CHARACTER HO NOKHUK
+0E40 0E2E ; [.1F9D.0020.0002.0E2E][.1FAA.0020.001F.0E40] # <THAI CHARACTER SARA E, THAI CHARACTER HO NOKHUK>
+0E41 0E2E ; [.1F9D.0020.0002.0E2E][.1FAB.0020.001F.0E41] # <THAI CHARACTER SARA AE, THAI CHARACTER HO NOKHUK>
+0E42 0E2E ; [.1F9D.0020.0002.0E2E][.1FAC.0020.001F.0E42] # <THAI CHARACTER SARA O, THAI CHARACTER HO NOKHUK>
+0E43 0E2E ; [.1F9D.0020.0002.0E2E][.1FAD.0020.001F.0E43] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER HO NOKHUK>
+0E44 0E2E ; [.1F9D.0020.0002.0E2E][.1FAE.0020.001F.0E44] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER HO NOKHUK>
+0E2F  ; [.1F9E.0020.0002.0E2F] # THAI CHARACTER PAIYANNOI
+0E30  ; [.1F9F.0020.0002.0E30] # THAI CHARACTER SARA A
+0E31  ; [.1FA0.0020.0002.0E31] # THAI CHARACTER MAI HAN-AKAT
+0E32  ; [.1FA1.0020.0002.0E32] # THAI CHARACTER SARA AA
+0E33  ; [.1FA2.0020.0002.0E33] # THAI CHARACTER SARA AM
+0E4D 0E32 ; [.1FA2.0020.0002.0E33] # THAI CHARACTER SARA AM
+0E34  ; [.1FA3.0020.0002.0E34] # THAI CHARACTER SARA I
+0E35  ; [.1FA4.0020.0002.0E35] # THAI CHARACTER SARA II
+0E36  ; [.1FA5.0020.0002.0E36] # THAI CHARACTER SARA UE
+0E37  ; [.1FA6.0020.0002.0E37] # THAI CHARACTER SARA UEE
+0E38  ; [.1FA7.0020.0002.0E38] # THAI CHARACTER SARA U
+0E39  ; [.1FA8.0020.0002.0E39] # THAI CHARACTER SARA UU
+0E3A  ; [.1FA9.0020.0002.0E3A] # THAI CHARACTER PHINTHU
+0E40  ; [.1FAA.0020.0002.0E40] # THAI CHARACTER SARA E
+0E41  ; [.1FAB.0020.0002.0E41] # THAI CHARACTER SARA AE
+0E42  ; [.1FAC.0020.0002.0E42] # THAI CHARACTER SARA O
+0E43  ; [.1FAD.0020.0002.0E43] # THAI CHARACTER SARA AI MAIMUAN
+0E44  ; [.1FAE.0020.0002.0E44] # THAI CHARACTER SARA AI MAIMALAI
+0E45  ; [.1FAF.0020.0002.0E45] # THAI CHARACTER LAKKHANGYAO
+0E81  ; [.1FB0.0020.0002.0E81] # LAO LETTER KO
+0EC0 0E81 ; [.1FB0.0020.0002.0E81][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER KO>
+0EC1 0E81 ; [.1FB0.0020.0002.0E81][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER KO>
+0EC2 0E81 ; [.1FB0.0020.0002.0E81][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER KO>
+0EC3 0E81 ; [.1FB0.0020.0002.0E81][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER KO>
+0EC4 0E81 ; [.1FB0.0020.0002.0E81][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER KO>
+0E82  ; [.1FB1.0020.0002.0E82] # LAO LETTER KHO SUNG
+0EC0 0E82 ; [.1FB1.0020.0002.0E82][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER KHO SUNG>
+0EC1 0E82 ; [.1FB1.0020.0002.0E82][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER KHO SUNG>
+0EC2 0E82 ; [.1FB1.0020.0002.0E82][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER KHO SUNG>
+0EC3 0E82 ; [.1FB1.0020.0002.0E82][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER KHO SUNG>
+0EC4 0E82 ; [.1FB1.0020.0002.0E82][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER KHO SUNG>
+0E84  ; [.1FB2.0020.0002.0E84] # LAO LETTER KHO TAM
+0EC0 0E84 ; [.1FB2.0020.0002.0E84][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER KHO TAM>
+0EC1 0E84 ; [.1FB2.0020.0002.0E84][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER KHO TAM>
+0EC2 0E84 ; [.1FB2.0020.0002.0E84][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER KHO TAM>
+0EC3 0E84 ; [.1FB2.0020.0002.0E84][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER KHO TAM>
+0EC4 0E84 ; [.1FB2.0020.0002.0E84][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER KHO TAM>
+0E87  ; [.1FB3.0020.0002.0E87] # LAO LETTER NGO
+0EC0 0E87 ; [.1FB3.0020.0002.0E87][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER NGO>
+0EC1 0E87 ; [.1FB3.0020.0002.0E87][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER NGO>
+0EC2 0E87 ; [.1FB3.0020.0002.0E87][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER NGO>
+0EC3 0E87 ; [.1FB3.0020.0002.0E87][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER NGO>
+0EC4 0E87 ; [.1FB3.0020.0002.0E87][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER NGO>
+0E88  ; [.1FB4.0020.0002.0E88] # LAO LETTER CO
+0EC0 0E88 ; [.1FB4.0020.0002.0E88][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER CO>
+0EC1 0E88 ; [.1FB4.0020.0002.0E88][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER CO>
+0EC2 0E88 ; [.1FB4.0020.0002.0E88][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER CO>
+0EC3 0E88 ; [.1FB4.0020.0002.0E88][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER CO>
+0EC4 0E88 ; [.1FB4.0020.0002.0E88][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER CO>
+0EAA  ; [.1FB5.0020.0002.0EAA] # LAO LETTER SO SUNG
+0EC0 0EAA ; [.1FB5.0020.0002.0EAA][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER SO SUNG>
+0EC1 0EAA ; [.1FB5.0020.0002.0EAA][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER SO SUNG>
+0EC2 0EAA ; [.1FB5.0020.0002.0EAA][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER SO SUNG>
+0EC3 0EAA ; [.1FB5.0020.0002.0EAA][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER SO SUNG>
+0EC4 0EAA ; [.1FB5.0020.0002.0EAA][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER SO SUNG>
+0E8A  ; [.1FB6.0020.0002.0E8A] # LAO LETTER SO TAM
+0EC0 0E8A ; [.1FB6.0020.0002.0E8A][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER SO TAM>
+0EC1 0E8A ; [.1FB6.0020.0002.0E8A][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER SO TAM>
+0EC2 0E8A ; [.1FB6.0020.0002.0E8A][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER SO TAM>
+0EC3 0E8A ; [.1FB6.0020.0002.0E8A][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER SO TAM>
+0EC4 0E8A ; [.1FB6.0020.0002.0E8A][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER SO TAM>
+0E8D  ; [.1FB7.0020.0002.0E8D] # LAO LETTER NYO
+0EC0 0E8D ; [.1FB7.0020.0002.0E8D][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER NYO>
+0EC1 0E8D ; [.1FB7.0020.0002.0E8D][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER NYO>
+0EC2 0E8D ; [.1FB7.0020.0002.0E8D][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER NYO>
+0EC3 0E8D ; [.1FB7.0020.0002.0E8D][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER NYO>
+0EC4 0E8D ; [.1FB7.0020.0002.0E8D][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER NYO>
+0E94  ; [.1FB8.0020.0002.0E94] # LAO LETTER DO
+0EC0 0E94 ; [.1FB8.0020.0002.0E94][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER DO>
+0EC1 0E94 ; [.1FB8.0020.0002.0E94][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER DO>
+0EC2 0E94 ; [.1FB8.0020.0002.0E94][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER DO>
+0EC3 0E94 ; [.1FB8.0020.0002.0E94][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER DO>
+0EC4 0E94 ; [.1FB8.0020.0002.0E94][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER DO>
+0E95  ; [.1FB9.0020.0002.0E95] # LAO LETTER TO
+0EC0 0E95 ; [.1FB9.0020.0002.0E95][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER TO>
+0EC1 0E95 ; [.1FB9.0020.0002.0E95][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER TO>
+0EC2 0E95 ; [.1FB9.0020.0002.0E95][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER TO>
+0EC3 0E95 ; [.1FB9.0020.0002.0E95][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER TO>
+0EC4 0E95 ; [.1FB9.0020.0002.0E95][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER TO>
+0E96  ; [.1FBA.0020.0002.0E96] # LAO LETTER THO SUNG
+0EC0 0E96 ; [.1FBA.0020.0002.0E96][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER THO SUNG>
+0EC1 0E96 ; [.1FBA.0020.0002.0E96][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER THO SUNG>
+0EC2 0E96 ; [.1FBA.0020.0002.0E96][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER THO SUNG>
+0EC3 0E96 ; [.1FBA.0020.0002.0E96][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER THO SUNG>
+0EC4 0E96 ; [.1FBA.0020.0002.0E96][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER THO SUNG>
+0E97  ; [.1FBB.0020.0002.0E97] # LAO LETTER THO TAM
+0EC0 0E97 ; [.1FBB.0020.0002.0E97][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER THO TAM>
+0EC1 0E97 ; [.1FBB.0020.0002.0E97][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER THO TAM>
+0EC2 0E97 ; [.1FBB.0020.0002.0E97][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER THO TAM>
+0EC3 0E97 ; [.1FBB.0020.0002.0E97][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER THO TAM>
+0EC4 0E97 ; [.1FBB.0020.0002.0E97][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER THO TAM>
+0E99  ; [.1FBC.0020.0002.0E99] # LAO LETTER NO
+0EC0 0E99 ; [.1FBC.0020.0002.0E99][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER NO>
+0EC1 0E99 ; [.1FBC.0020.0002.0E99][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER NO>
+0EC2 0E99 ; [.1FBC.0020.0002.0E99][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER NO>
+0EC3 0E99 ; [.1FBC.0020.0002.0E99][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER NO>
+0EC4 0E99 ; [.1FBC.0020.0002.0E99][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER NO>
+0E9A  ; [.1FBD.0020.0002.0E9A] # LAO LETTER BO
+0EC0 0E9A ; [.1FBD.0020.0002.0E9A][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER BO>
+0EC1 0E9A ; [.1FBD.0020.0002.0E9A][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER BO>
+0EC2 0E9A ; [.1FBD.0020.0002.0E9A][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER BO>
+0EC3 0E9A ; [.1FBD.0020.0002.0E9A][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER BO>
+0EC4 0E9A ; [.1FBD.0020.0002.0E9A][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER BO>
+0E9B  ; [.1FBE.0020.0002.0E9B] # LAO LETTER PO
+0EC0 0E9B ; [.1FBE.0020.0002.0E9B][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER PO>
+0EC1 0E9B ; [.1FBE.0020.0002.0E9B][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER PO>
+0EC2 0E9B ; [.1FBE.0020.0002.0E9B][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER PO>
+0EC3 0E9B ; [.1FBE.0020.0002.0E9B][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER PO>
+0EC4 0E9B ; [.1FBE.0020.0002.0E9B][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER PO>
+0E9C  ; [.1FBF.0020.0002.0E9C] # LAO LETTER PHO SUNG
+0EC0 0E9C ; [.1FBF.0020.0002.0E9C][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER PHO SUNG>
+0EC1 0E9C ; [.1FBF.0020.0002.0E9C][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER PHO SUNG>
+0EC2 0E9C ; [.1FBF.0020.0002.0E9C][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER PHO SUNG>
+0EC3 0E9C ; [.1FBF.0020.0002.0E9C][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER PHO SUNG>
+0EC4 0E9C ; [.1FBF.0020.0002.0E9C][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER PHO SUNG>
+0E9D  ; [.1FC0.0020.0002.0E9D] # LAO LETTER FO TAM
+0EC0 0E9D ; [.1FC0.0020.0002.0E9D][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER FO TAM>
+0EC1 0E9D ; [.1FC0.0020.0002.0E9D][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER FO TAM>
+0EC2 0E9D ; [.1FC0.0020.0002.0E9D][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER FO TAM>
+0EC3 0E9D ; [.1FC0.0020.0002.0E9D][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER FO TAM>
+0EC4 0E9D ; [.1FC0.0020.0002.0E9D][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER FO TAM>
+0E9E  ; [.1FC1.0020.0002.0E9E] # LAO LETTER PHO TAM
+0EC0 0E9E ; [.1FC1.0020.0002.0E9E][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER PHO TAM>
+0EC1 0E9E ; [.1FC1.0020.0002.0E9E][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER PHO TAM>
+0EC2 0E9E ; [.1FC1.0020.0002.0E9E][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER PHO TAM>
+0EC3 0E9E ; [.1FC1.0020.0002.0E9E][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER PHO TAM>
+0EC4 0E9E ; [.1FC1.0020.0002.0E9E][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER PHO TAM>
+0E9F  ; [.1FC2.0020.0002.0E9F] # LAO LETTER FO SUNG
+0EC0 0E9F ; [.1FC2.0020.0002.0E9F][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER FO SUNG>
+0EC1 0E9F ; [.1FC2.0020.0002.0E9F][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER FO SUNG>
+0EC2 0E9F ; [.1FC2.0020.0002.0E9F][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER FO SUNG>
+0EC3 0E9F ; [.1FC2.0020.0002.0E9F][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER FO SUNG>
+0EC4 0E9F ; [.1FC2.0020.0002.0E9F][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER FO SUNG>
+0EA1  ; [.1FC3.0020.0002.0EA1] # LAO LETTER MO
+0EC0 0EA1 ; [.1FC3.0020.0002.0EA1][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER MO>
+0EC1 0EA1 ; [.1FC3.0020.0002.0EA1][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER MO>
+0EC2 0EA1 ; [.1FC3.0020.0002.0EA1][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER MO>
+0EC3 0EA1 ; [.1FC3.0020.0002.0EA1][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER MO>
+0EC4 0EA1 ; [.1FC3.0020.0002.0EA1][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER MO>
+0EA2  ; [.1FC4.0020.0002.0EA2] # LAO LETTER YO
+0EC0 0EA2 ; [.1FC4.0020.0002.0EA2][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER YO>
+0EC1 0EA2 ; [.1FC4.0020.0002.0EA2][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER YO>
+0EC2 0EA2 ; [.1FC4.0020.0002.0EA2][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER YO>
+0EC3 0EA2 ; [.1FC4.0020.0002.0EA2][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER YO>
+0EC4 0EA2 ; [.1FC4.0020.0002.0EA2][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER YO>
+0EA3  ; [.1FC5.0020.0002.0EA3] # LAO LETTER LO LING
+0EC0 0EA3 ; [.1FC5.0020.0002.0EA3][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER LO LING>
+0EC1 0EA3 ; [.1FC5.0020.0002.0EA3][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER LO LING>
+0EC2 0EA3 ; [.1FC5.0020.0002.0EA3][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER LO LING>
+0EC3 0EA3 ; [.1FC5.0020.0002.0EA3][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER LO LING>
+0EC4 0EA3 ; [.1FC5.0020.0002.0EA3][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER LO LING>
+0EA5  ; [.1FC6.0020.0002.0EA5] # LAO LETTER LO LOOT
+0EC0 0EA5 ; [.1FC6.0020.0002.0EA5][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER LO LOOT>
+0EC1 0EA5 ; [.1FC6.0020.0002.0EA5][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER LO LOOT>
+0EC2 0EA5 ; [.1FC6.0020.0002.0EA5][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER LO LOOT>
+0EC3 0EA5 ; [.1FC6.0020.0002.0EA5][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER LO LOOT>
+0EC4 0EA5 ; [.1FC6.0020.0002.0EA5][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER LO LOOT>
+0EA7  ; [.1FC7.0020.0002.0EA7] # LAO LETTER WO
+0EC0 0EA7 ; [.1FC7.0020.0002.0EA7][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER WO>
+0EC1 0EA7 ; [.1FC7.0020.0002.0EA7][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER WO>
+0EC2 0EA7 ; [.1FC7.0020.0002.0EA7][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER WO>
+0EC3 0EA7 ; [.1FC7.0020.0002.0EA7][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER WO>
+0EC4 0EA7 ; [.1FC7.0020.0002.0EA7][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER WO>
+0EAB  ; [.1FC8.0020.0002.0EAB] # LAO LETTER HO SUNG
+0EDC  ; [.1FC8.0020.0004.0EDC][.1FBC.0020.0004.0EDC] # LAO HO NO; QQKN
+0EC0 0EDC ; [.1FC8.0020.0004.0EDC][.1FBC.0020.0004.0EDC][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO HO NO>
+0EC1 0EDC ; [.1FC8.0020.0004.0EDC][.1FBC.0020.0004.0EDC][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO HO NO>
+0EC2 0EDC ; [.1FC8.0020.0004.0EDC][.1FBC.0020.0004.0EDC][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO HO NO>
+0EC3 0EDC ; [.1FC8.0020.0004.0EDC][.1FBC.0020.0004.0EDC][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO HO NO>
+0EC4 0EDC ; [.1FC8.0020.0004.0EDC][.1FBC.0020.0004.0EDC][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO HO NO>
+0EDD  ; [.1FC8.0020.0004.0EDD][.1FC3.0020.0004.0EDD] # LAO HO MO; QQKN
+0EC0 0EDD ; [.1FC8.0020.0004.0EDD][.1FC3.0020.0004.0EDD][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO HO MO>
+0EC1 0EDD ; [.1FC8.0020.0004.0EDD][.1FC3.0020.0004.0EDD][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO HO MO>
+0EC2 0EDD ; [.1FC8.0020.0004.0EDD][.1FC3.0020.0004.0EDD][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO HO MO>
+0EC3 0EDD ; [.1FC8.0020.0004.0EDD][.1FC3.0020.0004.0EDD][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO HO MO>
+0EC4 0EDD ; [.1FC8.0020.0004.0EDD][.1FC3.0020.0004.0EDD][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO HO MO>
+0EC0 0EAB ; [.1FC8.0020.0002.0EAB][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER HO SUNG>
+0EC1 0EAB ; [.1FC8.0020.0002.0EAB][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER HO SUNG>
+0EC2 0EAB ; [.1FC8.0020.0002.0EAB][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER HO SUNG>
+0EC3 0EAB ; [.1FC8.0020.0002.0EAB][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER HO SUNG>
+0EC4 0EAB ; [.1FC8.0020.0002.0EAB][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER HO SUNG>
+0EAD  ; [.1FC9.0020.0002.0EAD] # LAO LETTER O
+0EC0 0EAD ; [.1FC9.0020.0002.0EAD][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER O>
+0EC1 0EAD ; [.1FC9.0020.0002.0EAD][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER O>
+0EC2 0EAD ; [.1FC9.0020.0002.0EAD][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER O>
+0EC3 0EAD ; [.1FC9.0020.0002.0EAD][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER O>
+0EC4 0EAD ; [.1FC9.0020.0002.0EAD][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER O>
+0EAE  ; [.1FCA.0020.0002.0EAE] # LAO LETTER HO TAM
+0EC0 0EAE ; [.1FCA.0020.0002.0EAE][.1FD9.0020.001F.0EC0] # <LAO VOWEL SIGN E, LAO LETTER HO TAM>
+0EC1 0EAE ; [.1FCA.0020.0002.0EAE][.1FDA.0020.001F.0EC1] # <LAO VOWEL SIGN EI, LAO LETTER HO TAM>
+0EC2 0EAE ; [.1FCA.0020.0002.0EAE][.1FDB.0020.001F.0EC2] # <LAO VOWEL SIGN O, LAO LETTER HO TAM>
+0EC3 0EAE ; [.1FCA.0020.0002.0EAE][.1FDC.0020.001F.0EC3] # <LAO VOWEL SIGN AY, LAO LETTER HO TAM>
+0EC4 0EAE ; [.1FCA.0020.0002.0EAE][.1FDD.0020.001F.0EC4] # <LAO VOWEL SIGN AI, LAO LETTER HO TAM>
+0EAF  ; [.1FCB.0020.0002.0EAF] # LAO ELLIPSIS
+0EB0  ; [.1FCC.0020.0002.0EB0] # LAO VOWEL SIGN A
+0EB1  ; [.1FCD.0020.0002.0EB1] # LAO VOWEL SIGN MAI KAN
+0EB2  ; [.1FCE.0020.0002.0EB2] # LAO VOWEL SIGN AA
+0EB3  ; [.1FCF.0020.0002.0EB3] # LAO VOWEL SIGN AM
+0ECD 0EB2 ; [.1FCF.0020.0002.0EB3] # LAO VOWEL SIGN AM
+0EB4  ; [.1FD0.0020.0002.0EB4] # LAO VOWEL SIGN I
+0EB5  ; [.1FD1.0020.0002.0EB5] # LAO VOWEL SIGN II
+0EB6  ; [.1FD2.0020.0002.0EB6] # LAO VOWEL SIGN Y
+0EB7  ; [.1FD3.0020.0002.0EB7] # LAO VOWEL SIGN YY
+0EB8  ; [.1FD4.0020.0002.0EB8] # LAO VOWEL SIGN U
+0EB9  ; [.1FD5.0020.0002.0EB9] # LAO VOWEL SIGN UU
+0EBB  ; [.1FD6.0020.0002.0EBB] # LAO VOWEL SIGN MAI KON
+0EBC  ; [.1FD7.0020.0002.0EBC] # LAO SEMIVOWEL SIGN LO
+0EBD  ; [.1FD8.0020.0002.0EBD] # LAO SEMIVOWEL SIGN NYO
+0EC0  ; [.1FD9.0020.0002.0EC0] # LAO VOWEL SIGN E
+0EC1  ; [.1FDA.0020.0002.0EC1] # LAO VOWEL SIGN EI
+0EC2  ; [.1FDB.0020.0002.0EC2] # LAO VOWEL SIGN O
+0EC3  ; [.1FDC.0020.0002.0EC3] # LAO VOWEL SIGN AY
+0EC4  ; [.1FDD.0020.0002.0EC4] # LAO VOWEL SIGN AI
+AA80  ; [.1FDE.0020.0002.AA80] # TAI VIET LETTER LOW KO
+AAB5 AA80 ; [.1FDE.0020.0002.AA80][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW KO>
+AAB6 AA80 ; [.1FDE.0020.0002.AA80][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW KO>
+AAB9 AA80 ; [.1FDE.0020.0002.AA80][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW KO>
+AABB AA80 ; [.1FDE.0020.0002.AA80][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW KO>
+AABC AA80 ; [.1FDE.0020.0002.AA80][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW KO>
+AA81  ; [.1FDF.0020.0002.AA81] # TAI VIET LETTER HIGH KO
+AAB5 AA81 ; [.1FDF.0020.0002.AA81][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH KO>
+AAB6 AA81 ; [.1FDF.0020.0002.AA81][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH KO>
+AAB9 AA81 ; [.1FDF.0020.0002.AA81][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH KO>
+AABB AA81 ; [.1FDF.0020.0002.AA81][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH KO>
+AABC AA81 ; [.1FDF.0020.0002.AA81][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH KO>
+AA82  ; [.1FE0.0020.0002.AA82] # TAI VIET LETTER LOW KHO
+AAB5 AA82 ; [.1FE0.0020.0002.AA82][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW KHO>
+AAB6 AA82 ; [.1FE0.0020.0002.AA82][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW KHO>
+AAB9 AA82 ; [.1FE0.0020.0002.AA82][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW KHO>
+AABB AA82 ; [.1FE0.0020.0002.AA82][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW KHO>
+AABC AA82 ; [.1FE0.0020.0002.AA82][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW KHO>
+AA83  ; [.1FE1.0020.0002.AA83] # TAI VIET LETTER HIGH KHO
+AAB5 AA83 ; [.1FE1.0020.0002.AA83][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH KHO>
+AAB6 AA83 ; [.1FE1.0020.0002.AA83][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH KHO>
+AAB9 AA83 ; [.1FE1.0020.0002.AA83][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH KHO>
+AABB AA83 ; [.1FE1.0020.0002.AA83][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH KHO>
+AABC AA83 ; [.1FE1.0020.0002.AA83][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH KHO>
+AA84  ; [.1FE2.0020.0002.AA84] # TAI VIET LETTER LOW KHHO
+AAB5 AA84 ; [.1FE2.0020.0002.AA84][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW KHHO>
+AAB6 AA84 ; [.1FE2.0020.0002.AA84][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW KHHO>
+AAB9 AA84 ; [.1FE2.0020.0002.AA84][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW KHHO>
+AABB AA84 ; [.1FE2.0020.0002.AA84][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW KHHO>
+AABC AA84 ; [.1FE2.0020.0002.AA84][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW KHHO>
+AA85  ; [.1FE3.0020.0002.AA85] # TAI VIET LETTER HIGH KHHO
+AAB5 AA85 ; [.1FE3.0020.0002.AA85][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH KHHO>
+AAB6 AA85 ; [.1FE3.0020.0002.AA85][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH KHHO>
+AAB9 AA85 ; [.1FE3.0020.0002.AA85][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH KHHO>
+AABB AA85 ; [.1FE3.0020.0002.AA85][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH KHHO>
+AABC AA85 ; [.1FE3.0020.0002.AA85][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH KHHO>
+AA86  ; [.1FE4.0020.0002.AA86] # TAI VIET LETTER LOW GO
+AAB5 AA86 ; [.1FE4.0020.0002.AA86][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW GO>
+AAB6 AA86 ; [.1FE4.0020.0002.AA86][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW GO>
+AAB9 AA86 ; [.1FE4.0020.0002.AA86][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW GO>
+AABB AA86 ; [.1FE4.0020.0002.AA86][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW GO>
+AABC AA86 ; [.1FE4.0020.0002.AA86][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW GO>
+AA87  ; [.1FE5.0020.0002.AA87] # TAI VIET LETTER HIGH GO
+AAB5 AA87 ; [.1FE5.0020.0002.AA87][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH GO>
+AAB6 AA87 ; [.1FE5.0020.0002.AA87][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH GO>
+AAB9 AA87 ; [.1FE5.0020.0002.AA87][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH GO>
+AABB AA87 ; [.1FE5.0020.0002.AA87][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH GO>
+AABC AA87 ; [.1FE5.0020.0002.AA87][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH GO>
+AA88  ; [.1FE6.0020.0002.AA88] # TAI VIET LETTER LOW NGO
+AAB5 AA88 ; [.1FE6.0020.0002.AA88][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW NGO>
+AAB6 AA88 ; [.1FE6.0020.0002.AA88][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW NGO>
+AAB9 AA88 ; [.1FE6.0020.0002.AA88][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW NGO>
+AABB AA88 ; [.1FE6.0020.0002.AA88][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW NGO>
+AABC AA88 ; [.1FE6.0020.0002.AA88][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW NGO>
+AA89  ; [.1FE7.0020.0002.AA89] # TAI VIET LETTER HIGH NGO
+AAB5 AA89 ; [.1FE7.0020.0002.AA89][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH NGO>
+AAB6 AA89 ; [.1FE7.0020.0002.AA89][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH NGO>
+AAB9 AA89 ; [.1FE7.0020.0002.AA89][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH NGO>
+AABB AA89 ; [.1FE7.0020.0002.AA89][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH NGO>
+AABC AA89 ; [.1FE7.0020.0002.AA89][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH NGO>
+AA8A  ; [.1FE8.0020.0002.AA8A] # TAI VIET LETTER LOW CO
+AAB5 AA8A ; [.1FE8.0020.0002.AA8A][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW CO>
+AAB6 AA8A ; [.1FE8.0020.0002.AA8A][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW CO>
+AAB9 AA8A ; [.1FE8.0020.0002.AA8A][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW CO>
+AABB AA8A ; [.1FE8.0020.0002.AA8A][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW CO>
+AABC AA8A ; [.1FE8.0020.0002.AA8A][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW CO>
+AA8B  ; [.1FE9.0020.0002.AA8B] # TAI VIET LETTER HIGH CO
+AAB5 AA8B ; [.1FE9.0020.0002.AA8B][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH CO>
+AAB6 AA8B ; [.1FE9.0020.0002.AA8B][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH CO>
+AAB9 AA8B ; [.1FE9.0020.0002.AA8B][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH CO>
+AABB AA8B ; [.1FE9.0020.0002.AA8B][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH CO>
+AABC AA8B ; [.1FE9.0020.0002.AA8B][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH CO>
+AA8C  ; [.1FEA.0020.0002.AA8C] # TAI VIET LETTER LOW CHO
+AAB5 AA8C ; [.1FEA.0020.0002.AA8C][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW CHO>
+AAB6 AA8C ; [.1FEA.0020.0002.AA8C][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW CHO>
+AAB9 AA8C ; [.1FEA.0020.0002.AA8C][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW CHO>
+AABB AA8C ; [.1FEA.0020.0002.AA8C][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW CHO>
+AABC AA8C ; [.1FEA.0020.0002.AA8C][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW CHO>
+AA8D  ; [.1FEB.0020.0002.AA8D] # TAI VIET LETTER HIGH CHO
+AAB5 AA8D ; [.1FEB.0020.0002.AA8D][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH CHO>
+AAB6 AA8D ; [.1FEB.0020.0002.AA8D][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH CHO>
+AAB9 AA8D ; [.1FEB.0020.0002.AA8D][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH CHO>
+AABB AA8D ; [.1FEB.0020.0002.AA8D][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH CHO>
+AABC AA8D ; [.1FEB.0020.0002.AA8D][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH CHO>
+AA8E  ; [.1FEC.0020.0002.AA8E] # TAI VIET LETTER LOW SO
+AAB5 AA8E ; [.1FEC.0020.0002.AA8E][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW SO>
+AAB6 AA8E ; [.1FEC.0020.0002.AA8E][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW SO>
+AAB9 AA8E ; [.1FEC.0020.0002.AA8E][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW SO>
+AABB AA8E ; [.1FEC.0020.0002.AA8E][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW SO>
+AABC AA8E ; [.1FEC.0020.0002.AA8E][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW SO>
+AA8F  ; [.1FED.0020.0002.AA8F] # TAI VIET LETTER HIGH SO
+AAB5 AA8F ; [.1FED.0020.0002.AA8F][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH SO>
+AAB6 AA8F ; [.1FED.0020.0002.AA8F][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH SO>
+AAB9 AA8F ; [.1FED.0020.0002.AA8F][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH SO>
+AABB AA8F ; [.1FED.0020.0002.AA8F][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH SO>
+AABC AA8F ; [.1FED.0020.0002.AA8F][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH SO>
+AA90  ; [.1FEE.0020.0002.AA90] # TAI VIET LETTER LOW NYO
+AAB5 AA90 ; [.1FEE.0020.0002.AA90][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW NYO>
+AAB6 AA90 ; [.1FEE.0020.0002.AA90][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW NYO>
+AAB9 AA90 ; [.1FEE.0020.0002.AA90][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW NYO>
+AABB AA90 ; [.1FEE.0020.0002.AA90][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW NYO>
+AABC AA90 ; [.1FEE.0020.0002.AA90][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW NYO>
+AA91  ; [.1FEF.0020.0002.AA91] # TAI VIET LETTER HIGH NYO
+AAB5 AA91 ; [.1FEF.0020.0002.AA91][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH NYO>
+AAB6 AA91 ; [.1FEF.0020.0002.AA91][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH NYO>
+AAB9 AA91 ; [.1FEF.0020.0002.AA91][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH NYO>
+AABB AA91 ; [.1FEF.0020.0002.AA91][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH NYO>
+AABC AA91 ; [.1FEF.0020.0002.AA91][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH NYO>
+AA92  ; [.1FF0.0020.0002.AA92] # TAI VIET LETTER LOW DO
+AAB5 AA92 ; [.1FF0.0020.0002.AA92][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW DO>
+AAB6 AA92 ; [.1FF0.0020.0002.AA92][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW DO>
+AAB9 AA92 ; [.1FF0.0020.0002.AA92][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW DO>
+AABB AA92 ; [.1FF0.0020.0002.AA92][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW DO>
+AABC AA92 ; [.1FF0.0020.0002.AA92][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW DO>
+AA93  ; [.1FF1.0020.0002.AA93] # TAI VIET LETTER HIGH DO
+AAB5 AA93 ; [.1FF1.0020.0002.AA93][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH DO>
+AAB6 AA93 ; [.1FF1.0020.0002.AA93][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH DO>
+AAB9 AA93 ; [.1FF1.0020.0002.AA93][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH DO>
+AABB AA93 ; [.1FF1.0020.0002.AA93][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH DO>
+AABC AA93 ; [.1FF1.0020.0002.AA93][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH DO>
+AA94  ; [.1FF2.0020.0002.AA94] # TAI VIET LETTER LOW TO
+AAB5 AA94 ; [.1FF2.0020.0002.AA94][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW TO>
+AAB6 AA94 ; [.1FF2.0020.0002.AA94][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW TO>
+AAB9 AA94 ; [.1FF2.0020.0002.AA94][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW TO>
+AABB AA94 ; [.1FF2.0020.0002.AA94][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW TO>
+AABC AA94 ; [.1FF2.0020.0002.AA94][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW TO>
+AA95  ; [.1FF3.0020.0002.AA95] # TAI VIET LETTER HIGH TO
+AAB5 AA95 ; [.1FF3.0020.0002.AA95][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH TO>
+AAB6 AA95 ; [.1FF3.0020.0002.AA95][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH TO>
+AAB9 AA95 ; [.1FF3.0020.0002.AA95][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH TO>
+AABB AA95 ; [.1FF3.0020.0002.AA95][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH TO>
+AABC AA95 ; [.1FF3.0020.0002.AA95][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH TO>
+AA96  ; [.1FF4.0020.0002.AA96] # TAI VIET LETTER LOW THO
+AAB5 AA96 ; [.1FF4.0020.0002.AA96][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW THO>
+AAB6 AA96 ; [.1FF4.0020.0002.AA96][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW THO>
+AAB9 AA96 ; [.1FF4.0020.0002.AA96][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW THO>
+AABB AA96 ; [.1FF4.0020.0002.AA96][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW THO>
+AABC AA96 ; [.1FF4.0020.0002.AA96][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW THO>
+AA97  ; [.1FF5.0020.0002.AA97] # TAI VIET LETTER HIGH THO
+AAB5 AA97 ; [.1FF5.0020.0002.AA97][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH THO>
+AAB6 AA97 ; [.1FF5.0020.0002.AA97][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH THO>
+AAB9 AA97 ; [.1FF5.0020.0002.AA97][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH THO>
+AABB AA97 ; [.1FF5.0020.0002.AA97][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH THO>
+AABC AA97 ; [.1FF5.0020.0002.AA97][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH THO>
+AA98  ; [.1FF6.0020.0002.AA98] # TAI VIET LETTER LOW NO
+AAB5 AA98 ; [.1FF6.0020.0002.AA98][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW NO>
+AAB6 AA98 ; [.1FF6.0020.0002.AA98][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW NO>
+AAB9 AA98 ; [.1FF6.0020.0002.AA98][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW NO>
+AABB AA98 ; [.1FF6.0020.0002.AA98][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW NO>
+AABC AA98 ; [.1FF6.0020.0002.AA98][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW NO>
+AA99  ; [.1FF7.0020.0002.AA99] # TAI VIET LETTER HIGH NO
+AAB5 AA99 ; [.1FF7.0020.0002.AA99][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH NO>
+AAB6 AA99 ; [.1FF7.0020.0002.AA99][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH NO>
+AAB9 AA99 ; [.1FF7.0020.0002.AA99][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH NO>
+AABB AA99 ; [.1FF7.0020.0002.AA99][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH NO>
+AABC AA99 ; [.1FF7.0020.0002.AA99][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH NO>
+AA9A  ; [.1FF8.0020.0002.AA9A] # TAI VIET LETTER LOW BO
+AAB5 AA9A ; [.1FF8.0020.0002.AA9A][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW BO>
+AAB6 AA9A ; [.1FF8.0020.0002.AA9A][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW BO>
+AAB9 AA9A ; [.1FF8.0020.0002.AA9A][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW BO>
+AABB AA9A ; [.1FF8.0020.0002.AA9A][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW BO>
+AABC AA9A ; [.1FF8.0020.0002.AA9A][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW BO>
+AA9B  ; [.1FF9.0020.0002.AA9B] # TAI VIET LETTER HIGH BO
+AAB5 AA9B ; [.1FF9.0020.0002.AA9B][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH BO>
+AAB6 AA9B ; [.1FF9.0020.0002.AA9B][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH BO>
+AAB9 AA9B ; [.1FF9.0020.0002.AA9B][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH BO>
+AABB AA9B ; [.1FF9.0020.0002.AA9B][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH BO>
+AABC AA9B ; [.1FF9.0020.0002.AA9B][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH BO>
+AA9C  ; [.1FFA.0020.0002.AA9C] # TAI VIET LETTER LOW PO
+AAB5 AA9C ; [.1FFA.0020.0002.AA9C][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW PO>
+AAB6 AA9C ; [.1FFA.0020.0002.AA9C][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW PO>
+AAB9 AA9C ; [.1FFA.0020.0002.AA9C][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW PO>
+AABB AA9C ; [.1FFA.0020.0002.AA9C][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW PO>
+AABC AA9C ; [.1FFA.0020.0002.AA9C][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW PO>
+AA9D  ; [.1FFB.0020.0002.AA9D] # TAI VIET LETTER HIGH PO
+AAB5 AA9D ; [.1FFB.0020.0002.AA9D][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH PO>
+AAB6 AA9D ; [.1FFB.0020.0002.AA9D][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH PO>
+AAB9 AA9D ; [.1FFB.0020.0002.AA9D][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH PO>
+AABB AA9D ; [.1FFB.0020.0002.AA9D][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH PO>
+AABC AA9D ; [.1FFB.0020.0002.AA9D][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH PO>
+AA9E  ; [.1FFC.0020.0002.AA9E] # TAI VIET LETTER LOW PHO
+AAB5 AA9E ; [.1FFC.0020.0002.AA9E][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW PHO>
+AAB6 AA9E ; [.1FFC.0020.0002.AA9E][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW PHO>
+AAB9 AA9E ; [.1FFC.0020.0002.AA9E][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW PHO>
+AABB AA9E ; [.1FFC.0020.0002.AA9E][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW PHO>
+AABC AA9E ; [.1FFC.0020.0002.AA9E][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW PHO>
+AA9F  ; [.1FFD.0020.0002.AA9F] # TAI VIET LETTER HIGH PHO
+AAB5 AA9F ; [.1FFD.0020.0002.AA9F][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH PHO>
+AAB6 AA9F ; [.1FFD.0020.0002.AA9F][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH PHO>
+AAB9 AA9F ; [.1FFD.0020.0002.AA9F][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH PHO>
+AABB AA9F ; [.1FFD.0020.0002.AA9F][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH PHO>
+AABC AA9F ; [.1FFD.0020.0002.AA9F][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH PHO>
+AAA0  ; [.1FFE.0020.0002.AAA0] # TAI VIET LETTER LOW FO
+AAB5 AAA0 ; [.1FFE.0020.0002.AAA0][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW FO>
+AAB6 AAA0 ; [.1FFE.0020.0002.AAA0][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW FO>
+AAB9 AAA0 ; [.1FFE.0020.0002.AAA0][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW FO>
+AABB AAA0 ; [.1FFE.0020.0002.AAA0][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW FO>
+AABC AAA0 ; [.1FFE.0020.0002.AAA0][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW FO>
+AAA1  ; [.1FFF.0020.0002.AAA1] # TAI VIET LETTER HIGH FO
+AAB5 AAA1 ; [.1FFF.0020.0002.AAA1][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH FO>
+AAB6 AAA1 ; [.1FFF.0020.0002.AAA1][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH FO>
+AAB9 AAA1 ; [.1FFF.0020.0002.AAA1][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH FO>
+AABB AAA1 ; [.1FFF.0020.0002.AAA1][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH FO>
+AABC AAA1 ; [.1FFF.0020.0002.AAA1][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH FO>
+AAA2  ; [.2000.0020.0002.AAA2] # TAI VIET LETTER LOW MO
+AAB5 AAA2 ; [.2000.0020.0002.AAA2][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW MO>
+AAB6 AAA2 ; [.2000.0020.0002.AAA2][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW MO>
+AAB9 AAA2 ; [.2000.0020.0002.AAA2][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW MO>
+AABB AAA2 ; [.2000.0020.0002.AAA2][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW MO>
+AABC AAA2 ; [.2000.0020.0002.AAA2][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW MO>
+AAA3  ; [.2001.0020.0002.AAA3] # TAI VIET LETTER HIGH MO
+AAB5 AAA3 ; [.2001.0020.0002.AAA3][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH MO>
+AAB6 AAA3 ; [.2001.0020.0002.AAA3][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH MO>
+AAB9 AAA3 ; [.2001.0020.0002.AAA3][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH MO>
+AABB AAA3 ; [.2001.0020.0002.AAA3][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH MO>
+AABC AAA3 ; [.2001.0020.0002.AAA3][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH MO>
+AAA4  ; [.2002.0020.0002.AAA4] # TAI VIET LETTER LOW YO
+AAB5 AAA4 ; [.2002.0020.0002.AAA4][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW YO>
+AAB6 AAA4 ; [.2002.0020.0002.AAA4][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW YO>
+AAB9 AAA4 ; [.2002.0020.0002.AAA4][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW YO>
+AABB AAA4 ; [.2002.0020.0002.AAA4][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW YO>
+AABC AAA4 ; [.2002.0020.0002.AAA4][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW YO>
+AAA5  ; [.2003.0020.0002.AAA5] # TAI VIET LETTER HIGH YO
+AAB5 AAA5 ; [.2003.0020.0002.AAA5][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH YO>
+AAB6 AAA5 ; [.2003.0020.0002.AAA5][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH YO>
+AAB9 AAA5 ; [.2003.0020.0002.AAA5][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH YO>
+AABB AAA5 ; [.2003.0020.0002.AAA5][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH YO>
+AABC AAA5 ; [.2003.0020.0002.AAA5][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH YO>
+AAA6  ; [.2004.0020.0002.AAA6] # TAI VIET LETTER LOW RO
+AAB5 AAA6 ; [.2004.0020.0002.AAA6][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW RO>
+AAB6 AAA6 ; [.2004.0020.0002.AAA6][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW RO>
+AAB9 AAA6 ; [.2004.0020.0002.AAA6][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW RO>
+AABB AAA6 ; [.2004.0020.0002.AAA6][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW RO>
+AABC AAA6 ; [.2004.0020.0002.AAA6][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW RO>
+AAA7  ; [.2005.0020.0002.AAA7] # TAI VIET LETTER HIGH RO
+AAB5 AAA7 ; [.2005.0020.0002.AAA7][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH RO>
+AAB6 AAA7 ; [.2005.0020.0002.AAA7][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH RO>
+AAB9 AAA7 ; [.2005.0020.0002.AAA7][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH RO>
+AABB AAA7 ; [.2005.0020.0002.AAA7][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH RO>
+AABC AAA7 ; [.2005.0020.0002.AAA7][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH RO>
+AAA8  ; [.2006.0020.0002.AAA8] # TAI VIET LETTER LOW LO
+AAB5 AAA8 ; [.2006.0020.0002.AAA8][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW LO>
+AAB6 AAA8 ; [.2006.0020.0002.AAA8][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW LO>
+AAB9 AAA8 ; [.2006.0020.0002.AAA8][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW LO>
+AABB AAA8 ; [.2006.0020.0002.AAA8][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW LO>
+AABC AAA8 ; [.2006.0020.0002.AAA8][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW LO>
+AAA9  ; [.2007.0020.0002.AAA9] # TAI VIET LETTER HIGH LO
+AAB5 AAA9 ; [.2007.0020.0002.AAA9][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH LO>
+AAB6 AAA9 ; [.2007.0020.0002.AAA9][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH LO>
+AAB9 AAA9 ; [.2007.0020.0002.AAA9][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH LO>
+AABB AAA9 ; [.2007.0020.0002.AAA9][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH LO>
+AABC AAA9 ; [.2007.0020.0002.AAA9][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH LO>
+AAAA  ; [.2008.0020.0002.AAAA] # TAI VIET LETTER LOW VO
+AAB5 AAAA ; [.2008.0020.0002.AAAA][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW VO>
+AAB6 AAAA ; [.2008.0020.0002.AAAA][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW VO>
+AAB9 AAAA ; [.2008.0020.0002.AAAA][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW VO>
+AABB AAAA ; [.2008.0020.0002.AAAA][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW VO>
+AABC AAAA ; [.2008.0020.0002.AAAA][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW VO>
+AAAB  ; [.2009.0020.0002.AAAB] # TAI VIET LETTER HIGH VO
+AAB5 AAAB ; [.2009.0020.0002.AAAB][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH VO>
+AAB6 AAAB ; [.2009.0020.0002.AAAB][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH VO>
+AAB9 AAAB ; [.2009.0020.0002.AAAB][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH VO>
+AABB AAAB ; [.2009.0020.0002.AAAB][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH VO>
+AABC AAAB ; [.2009.0020.0002.AAAB][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH VO>
+AAAC  ; [.200A.0020.0002.AAAC] # TAI VIET LETTER LOW HO
+AAB5 AAAC ; [.200A.0020.0002.AAAC][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW HO>
+AAB6 AAAC ; [.200A.0020.0002.AAAC][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW HO>
+AAB9 AAAC ; [.200A.0020.0002.AAAC][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW HO>
+AABB AAAC ; [.200A.0020.0002.AAAC][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW HO>
+AABC AAAC ; [.200A.0020.0002.AAAC][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW HO>
+AAAD  ; [.200B.0020.0002.AAAD] # TAI VIET LETTER HIGH HO
+AAB5 AAAD ; [.200B.0020.0002.AAAD][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH HO>
+AAB6 AAAD ; [.200B.0020.0002.AAAD][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH HO>
+AAB9 AAAD ; [.200B.0020.0002.AAAD][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH HO>
+AABB AAAD ; [.200B.0020.0002.AAAD][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH HO>
+AABC AAAD ; [.200B.0020.0002.AAAD][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH HO>
+AAAE  ; [.200C.0020.0002.AAAE] # TAI VIET LETTER LOW O
+AAB5 AAAE ; [.200C.0020.0002.AAAE][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER LOW O>
+AAB6 AAAE ; [.200C.0020.0002.AAAE][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER LOW O>
+AAB9 AAAE ; [.200C.0020.0002.AAAE][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW O>
+AABB AAAE ; [.200C.0020.0002.AAAE][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW O>
+AABC AAAE ; [.200C.0020.0002.AAAE][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW O>
+AAAF  ; [.200D.0020.0002.AAAF] # TAI VIET LETTER HIGH O
+AAB5 AAAF ; [.200D.0020.0002.AAAF][.2013.0020.001F.AAB5] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH O>
+AAB6 AAAF ; [.200D.0020.0002.AAAF][.2014.0020.001F.AAB6] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH O>
+AAB9 AAAF ; [.200D.0020.0002.AAAF][.2017.0020.001F.AAB9] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH O>
+AABB AAAF ; [.200D.0020.0002.AAAF][.2019.0020.001F.AABB] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH O>
+AABC AAAF ; [.200D.0020.0002.AAAF][.201A.0020.001F.AABC] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH O>
+AAB0  ; [.200E.0020.0002.AAB0] # TAI VIET MAI KANG
+AAB1  ; [.200F.0020.0002.AAB1] # TAI VIET VOWEL AA
+AAB2  ; [.2010.0020.0002.AAB2] # TAI VIET VOWEL I
+AAB3  ; [.2011.0020.0002.AAB3] # TAI VIET VOWEL UE
+AAB4  ; [.2012.0020.0002.AAB4] # TAI VIET VOWEL U
+AAB5  ; [.2013.0020.0002.AAB5] # TAI VIET VOWEL E
+AAB6  ; [.2014.0020.0002.AAB6] # TAI VIET VOWEL O
+AAB7  ; [.2015.0020.0002.AAB7] # TAI VIET MAY KHIT
+AAB8  ; [.2016.0020.0002.AAB8] # TAI VIET VOWEL IA
+AAB9  ; [.2017.0020.0002.AAB9] # TAI VIET VOWEL UEA
+AABA  ; [.2018.0020.0002.AABA] # TAI VIET VOWEL UA
+AABB  ; [.2019.0020.0002.AABB] # TAI VIET VOWEL AUE
+AABC  ; [.201A.0020.0002.AABC] # TAI VIET VOWEL AY
+AABD  ; [.201B.0020.0002.AABD] # TAI VIET VOWEL AN
+AABE  ; [.201C.0020.0002.AABE] # TAI VIET VOWEL AM
+AAC0  ; [.201D.0020.0002.AAC0] # TAI VIET TONE MAI NUENG
+AAC2  ; [.201E.0020.0002.AAC2] # TAI VIET TONE MAI SONG
+AADB  ; [.201F.0020.0002.AADB] # TAI VIET SYMBOL KON
+AADC  ; [.2020.0020.0002.AADC] # TAI VIET SYMBOL NUENG
+0F40  ; [.2021.0020.0002.0F40] # TIBETAN LETTER KA
+0F69  ; [.2021.0020.0002.0F40][.2062.0020.0002.0FB5] # TIBETAN LETTER KSSA; QQCN
+0F90  ; [.2022.0020.0002.0F90] # TIBETAN SUBJOINED LETTER KA
+0FB9  ; [.2022.0020.0002.0F90][.2062.0020.0002.0FB5] # TIBETAN SUBJOINED LETTER KSSA; QQCN
+0F6B  ; [.2023.0020.0002.0F6B] # TIBETAN LETTER KKA
+0F41  ; [.2024.0020.0002.0F41] # TIBETAN LETTER KHA
+0F91  ; [.2025.0020.0002.0F91] # TIBETAN SUBJOINED LETTER KHA
+0F42  ; [.2026.0020.0002.0F42] # TIBETAN LETTER GA
+0F43  ; [.2026.0020.0002.0F42][.2066.0020.0002.0FB7] # TIBETAN LETTER GHA; QQCN
+0F92  ; [.2027.0020.0002.0F92] # TIBETAN SUBJOINED LETTER GA
+0F93  ; [.2027.0020.0002.0F92][.2066.0020.0002.0FB7] # TIBETAN SUBJOINED LETTER GHA; QQCN
+0F44  ; [.2028.0020.0002.0F44] # TIBETAN LETTER NGA
+0F94  ; [.2029.0020.0002.0F94] # TIBETAN SUBJOINED LETTER NGA
+0F45  ; [.202A.0020.0002.0F45] # TIBETAN LETTER CA
+0F95  ; [.202B.0020.0002.0F95] # TIBETAN SUBJOINED LETTER CA
+0F46  ; [.202C.0020.0002.0F46] # TIBETAN LETTER CHA
+0F96  ; [.202D.0020.0002.0F96] # TIBETAN SUBJOINED LETTER CHA
+0F47  ; [.202E.0020.0002.0F47] # TIBETAN LETTER JA
+0F97  ; [.202F.0020.0002.0F97] # TIBETAN SUBJOINED LETTER JA
+0F49  ; [.2030.0020.0002.0F49] # TIBETAN LETTER NYA
+0F99  ; [.2031.0020.0002.0F99] # TIBETAN SUBJOINED LETTER NYA
+0F4A  ; [.2032.0020.0002.0F4A] # TIBETAN LETTER TTA
+0F9A  ; [.2033.0020.0002.0F9A] # TIBETAN SUBJOINED LETTER TTA
+0F4B  ; [.2034.0020.0002.0F4B] # TIBETAN LETTER TTHA
+0F9B  ; [.2035.0020.0002.0F9B] # TIBETAN SUBJOINED LETTER TTHA
+0F4C  ; [.2036.0020.0002.0F4C] # TIBETAN LETTER DDA
+0F4D  ; [.2036.0020.0002.0F4C][.2066.0020.0002.0FB7] # TIBETAN LETTER DDHA; QQCN
+0F9C  ; [.2037.0020.0002.0F9C] # TIBETAN SUBJOINED LETTER DDA
+0F9D  ; [.2037.0020.0002.0F9C][.2066.0020.0002.0FB7] # TIBETAN SUBJOINED LETTER DDHA; QQCN
+0F4E  ; [.2038.0020.0002.0F4E] # TIBETAN LETTER NNA
+0F9E  ; [.2039.0020.0002.0F9E] # TIBETAN SUBJOINED LETTER NNA
+0F4F  ; [.203A.0020.0002.0F4F] # TIBETAN LETTER TA
+0F9F  ; [.203B.0020.0002.0F9F] # TIBETAN SUBJOINED LETTER TA
+0F50  ; [.203C.0020.0002.0F50] # TIBETAN LETTER THA
+0FA0  ; [.203D.0020.0002.0FA0] # TIBETAN SUBJOINED LETTER THA
+0F51  ; [.203E.0020.0002.0F51] # TIBETAN LETTER DA
+0F52  ; [.203E.0020.0002.0F51][.2066.0020.0002.0FB7] # TIBETAN LETTER DHA; QQCN
+0FA1  ; [.203F.0020.0002.0FA1] # TIBETAN SUBJOINED LETTER DA
+0FA2  ; [.203F.0020.0002.0FA1][.2066.0020.0002.0FB7] # TIBETAN SUBJOINED LETTER DHA; QQCN
+0F53  ; [.2040.0020.0002.0F53] # TIBETAN LETTER NA
+0FA3  ; [.2041.0020.0002.0FA3] # TIBETAN SUBJOINED LETTER NA
+0F54  ; [.2042.0020.0002.0F54] # TIBETAN LETTER PA
+0FA4  ; [.2043.0020.0002.0FA4] # TIBETAN SUBJOINED LETTER PA
+0F55  ; [.2044.0020.0002.0F55] # TIBETAN LETTER PHA
+0FA5  ; [.2045.0020.0002.0FA5] # TIBETAN SUBJOINED LETTER PHA
+0F56  ; [.2046.0020.0002.0F56] # TIBETAN LETTER BA
+0F57  ; [.2046.0020.0002.0F56][.2066.0020.0002.0FB7] # TIBETAN LETTER BHA; QQCN
+0FA6  ; [.2047.0020.0002.0FA6] # TIBETAN SUBJOINED LETTER BA
+0FA7  ; [.2047.0020.0002.0FA6][.2066.0020.0002.0FB7] # TIBETAN SUBJOINED LETTER BHA; QQCN
+0F58  ; [.2048.0020.0002.0F58] # TIBETAN LETTER MA
+0FA8  ; [.2049.0020.0002.0FA8] # TIBETAN SUBJOINED LETTER MA
+0F59  ; [.204A.0020.0002.0F59] # TIBETAN LETTER TSA
+0FA9  ; [.204B.0020.0002.0FA9] # TIBETAN SUBJOINED LETTER TSA
+0F5A  ; [.204C.0020.0002.0F5A] # TIBETAN LETTER TSHA
+0FAA  ; [.204D.0020.0002.0FAA] # TIBETAN SUBJOINED LETTER TSHA
+0F5B  ; [.204E.0020.0002.0F5B] # TIBETAN LETTER DZA
+0F5C  ; [.204E.0020.0002.0F5B][.2066.0020.0002.0FB7] # TIBETAN LETTER DZHA; QQCN
+0FAB  ; [.204F.0020.0002.0FAB] # TIBETAN SUBJOINED LETTER DZA
+0FAC  ; [.204F.0020.0002.0FAB][.2066.0020.0002.0FB7] # TIBETAN SUBJOINED LETTER DZHA; QQCN
+0F5D  ; [.2050.0020.0002.0F5D] # TIBETAN LETTER WA
+0FAD  ; [.2051.0020.0002.0FAD] # TIBETAN SUBJOINED LETTER WA
+0FBA  ; [.2051.0020.0004.0FBA][.0000.015A.0004.0FBA] # TIBETAN SUBJOINED LETTER FIXED-FORM WA; QQKN
+0F5E  ; [.2052.0020.0002.0F5E] # TIBETAN LETTER ZHA
+0FAE  ; [.2053.0020.0002.0FAE] # TIBETAN SUBJOINED LETTER ZHA
+0F5F  ; [.2054.0020.0002.0F5F] # TIBETAN LETTER ZA
+0FAF  ; [.2055.0020.0002.0FAF] # TIBETAN SUBJOINED LETTER ZA
+0F60  ; [.2056.0020.0002.0F60] # TIBETAN LETTER -A
+0FB0  ; [.2057.0020.0002.0FB0] # TIBETAN SUBJOINED LETTER -A
+0F61  ; [.2058.0020.0002.0F61] # TIBETAN LETTER YA
+0FB1  ; [.2059.0020.0002.0FB1] # TIBETAN SUBJOINED LETTER YA
+0FBB  ; [.2059.0020.0004.0FBB][.0000.015A.0004.0FBB] # TIBETAN SUBJOINED LETTER FIXED-FORM YA; QQKN
+0F62  ; [.205A.0020.0002.0F62] # TIBETAN LETTER RA
+0F6A  ; [.205A.0020.0004.0F6A][.0000.015A.0004.0F6A] # TIBETAN LETTER FIXED-FORM RA; QQKN
+0FB2  ; [.205B.0020.0002.0FB2] # TIBETAN SUBJOINED LETTER RA
+0FBC  ; [.205B.0020.0004.0FBC][.0000.015A.0004.0FBC] # TIBETAN SUBJOINED LETTER FIXED-FORM RA; QQKN
+0F6C  ; [.205C.0020.0002.0F6C] # TIBETAN LETTER RRA
+0F63  ; [.205D.0020.0002.0F63] # TIBETAN LETTER LA
+0FB3  ; [.205E.0020.0002.0FB3] # TIBETAN SUBJOINED LETTER LA
+0F64  ; [.205F.0020.0002.0F64] # TIBETAN LETTER SHA
+0FB4  ; [.2060.0020.0002.0FB4] # TIBETAN SUBJOINED LETTER SHA
+0F65  ; [.2061.0020.0002.0F65] # TIBETAN LETTER SSA
+0FB5  ; [.2062.0020.0002.0FB5] # TIBETAN SUBJOINED LETTER SSA
+0F66  ; [.2063.0020.0002.0F66] # TIBETAN LETTER SA
+0FB6  ; [.2064.0020.0002.0FB6] # TIBETAN SUBJOINED LETTER SA
+0F67  ; [.2065.0020.0002.0F67] # TIBETAN LETTER HA
+0FB7  ; [.2066.0020.0002.0FB7] # TIBETAN SUBJOINED LETTER HA
+0F68  ; [.2067.0020.0002.0F68] # TIBETAN LETTER A
+0F00  ; [.2067.0020.0004.0F00][.207A.0020.0004.0F00][.0000.0127.001F.0F00] # TIBETAN SYLLABLE OM; QQKN
+0FB8  ; [.2068.0020.0002.0FB8] # TIBETAN SUBJOINED LETTER A
+0F88  ; [.2069.0020.0002.0F88] # TIBETAN SIGN LCE TSA CAN
+0F89  ; [.206A.0020.0002.0F89] # TIBETAN SIGN MCHU CAN
+0F8A  ; [.206B.0020.0002.0F8A] # TIBETAN SIGN GRU CAN RGYINGS
+0F8B  ; [.206C.0020.0002.0F8B] # TIBETAN SIGN GRU MED RGYINGS
+0F71  ; [.206D.0020.0002.0F71] # TIBETAN VOWEL SIGN AA
+0F72  ; [.206E.0020.0002.0F72] # TIBETAN VOWEL SIGN I
+0F73  ; [.206F.0020.0002.0F73] # TIBETAN VOWEL SIGN II
+0F71 0F72 ; [.206F.0020.0002.0F73] # TIBETAN VOWEL SIGN II
+0F80  ; [.2070.0020.0002.0F80] # TIBETAN VOWEL SIGN REVERSED I
+0F81  ; [.2071.0020.0002.0F81] # TIBETAN VOWEL SIGN REVERSED II
+0F71 0F80 ; [.2071.0020.0002.0F81] # TIBETAN VOWEL SIGN REVERSED II
+0F74  ; [.2072.0020.0002.0F74] # TIBETAN VOWEL SIGN U
+0F75  ; [.2073.0020.0002.0F75] # TIBETAN VOWEL SIGN UU
+0F71 0F74 ; [.2073.0020.0002.0F75] # TIBETAN VOWEL SIGN UU
+0F76  ; [.2074.0020.0002.0F76] # TIBETAN VOWEL SIGN VOCALIC R
+0FB2 0F80 ; [.2074.0020.0002.0F76] # TIBETAN VOWEL SIGN VOCALIC R
+0F77  ; [.2075.0020.0002.0F77] # TIBETAN VOWEL SIGN VOCALIC RR
+0FB2 0F71 0F80 ; [.2075.0020.0002.0F77] # TIBETAN VOWEL SIGN VOCALIC RR
+0FB2 0F81 ; [.2075.0020.0002.0F77] # TIBETAN VOWEL SIGN VOCALIC RR
+0F78  ; [.2076.0020.0002.0F78] # TIBETAN VOWEL SIGN VOCALIC L
+0FB3 0F80 ; [.2076.0020.0002.0F78] # TIBETAN VOWEL SIGN VOCALIC L
+0F79  ; [.2077.0020.0002.0F79] # TIBETAN VOWEL SIGN VOCALIC LL
+0FB3 0F71 0F80 ; [.2077.0020.0002.0F79] # TIBETAN VOWEL SIGN VOCALIC LL
+0FB3 0F81 ; [.2077.0020.0002.0F79] # TIBETAN VOWEL SIGN VOCALIC LL
+0F7A  ; [.2078.0020.0002.0F7A] # TIBETAN VOWEL SIGN E
+0F7B  ; [.2079.0020.0002.0F7B] # TIBETAN VOWEL SIGN EE
+0F7C  ; [.207A.0020.0002.0F7C] # TIBETAN VOWEL SIGN O
+0F7D  ; [.207B.0020.0002.0F7D] # TIBETAN VOWEL SIGN OO
+0F84  ; [.207C.0020.0002.0F84] # TIBETAN MARK HALANTA
+1C00  ; [.207D.0020.0002.1C00] # LEPCHA LETTER KA
+1C01  ; [.207E.0020.0002.1C01] # LEPCHA LETTER KLA
+1C02  ; [.207F.0020.0002.1C02] # LEPCHA LETTER KHA
+1C03  ; [.2080.0020.0002.1C03] # LEPCHA LETTER GA
+1C04  ; [.2081.0020.0002.1C04] # LEPCHA LETTER GLA
+1C05  ; [.2082.0020.0002.1C05] # LEPCHA LETTER NGA
+1C06  ; [.2083.0020.0002.1C06] # LEPCHA LETTER CA
+1C07  ; [.2084.0020.0002.1C07] # LEPCHA LETTER CHA
+1C08  ; [.2085.0020.0002.1C08] # LEPCHA LETTER JA
+1C09  ; [.2086.0020.0002.1C09] # LEPCHA LETTER NYA
+1C4D  ; [.2087.0020.0002.1C4D] # LEPCHA LETTER TTA
+1C4E  ; [.2088.0020.0002.1C4E] # LEPCHA LETTER TTHA
+1C4F  ; [.2089.0020.0002.1C4F] # LEPCHA LETTER DDA
+1C0A  ; [.208A.0020.0002.1C0A] # LEPCHA LETTER TA
+1C0B  ; [.208B.0020.0002.1C0B] # LEPCHA LETTER THA
+1C0C  ; [.208C.0020.0002.1C0C] # LEPCHA LETTER DA
+1C0D  ; [.208D.0020.0002.1C0D] # LEPCHA LETTER NA
+1C0E  ; [.208E.0020.0002.1C0E] # LEPCHA LETTER PA
+1C0F  ; [.208F.0020.0002.1C0F] # LEPCHA LETTER PLA
+1C10  ; [.2090.0020.0002.1C10] # LEPCHA LETTER PHA
+1C11  ; [.2091.0020.0002.1C11] # LEPCHA LETTER FA
+1C12  ; [.2092.0020.0002.1C12] # LEPCHA LETTER FLA
+1C13  ; [.2093.0020.0002.1C13] # LEPCHA LETTER BA
+1C14  ; [.2094.0020.0002.1C14] # LEPCHA LETTER BLA
+1C15  ; [.2095.0020.0002.1C15] # LEPCHA LETTER MA
+1C16  ; [.2096.0020.0002.1C16] # LEPCHA LETTER MLA
+1C17  ; [.2097.0020.0002.1C17] # LEPCHA LETTER TSA
+1C18  ; [.2098.0020.0002.1C18] # LEPCHA LETTER TSHA
+1C19  ; [.2099.0020.0002.1C19] # LEPCHA LETTER DZA
+1C1A  ; [.209A.0020.0002.1C1A] # LEPCHA LETTER YA
+1C24  ; [.209B.0020.0002.1C24] # LEPCHA SUBJOINED LETTER YA
+1C1B  ; [.209C.0020.0002.1C1B] # LEPCHA LETTER RA
+1C25  ; [.209D.0020.0002.1C25] # LEPCHA SUBJOINED LETTER RA
+1C1C  ; [.209E.0020.0002.1C1C] # LEPCHA LETTER LA
+1C1D  ; [.209F.0020.0002.1C1D] # LEPCHA LETTER HA
+1C1E  ; [.20A0.0020.0002.1C1E] # LEPCHA LETTER HLA
+1C1F  ; [.20A1.0020.0002.1C1F] # LEPCHA LETTER VA
+1C20  ; [.20A2.0020.0002.1C20] # LEPCHA LETTER SA
+1C21  ; [.20A3.0020.0002.1C21] # LEPCHA LETTER SHA
+1C22  ; [.20A4.0020.0002.1C22] # LEPCHA LETTER WA
+1C23  ; [.20A5.0020.0002.1C23] # LEPCHA LETTER A
+1C36  ; [.20A6.0020.0002.1C36] # LEPCHA SIGN RAN
+1C26  ; [.20A7.0020.0002.1C26] # LEPCHA VOWEL SIGN AA
+1C27  ; [.20A8.0020.0002.1C27] # LEPCHA VOWEL SIGN I
+1C28  ; [.20A9.0020.0002.1C28] # LEPCHA VOWEL SIGN O
+1C29  ; [.20AA.0020.0002.1C29] # LEPCHA VOWEL SIGN OO
+1C2A  ; [.20AB.0020.0002.1C2A] # LEPCHA VOWEL SIGN U
+1C2B  ; [.20AC.0020.0002.1C2B] # LEPCHA VOWEL SIGN UU
+1C2C  ; [.20AD.0020.0002.1C2C] # LEPCHA VOWEL SIGN E
+1C2D  ; [.20AE.0020.0002.1C2D] # LEPCHA CONSONANT SIGN K
+1C2E  ; [.20AF.0020.0002.1C2E] # LEPCHA CONSONANT SIGN M
+1C2F  ; [.20B0.0020.0002.1C2F] # LEPCHA CONSONANT SIGN L
+1C30  ; [.20B1.0020.0002.1C30] # LEPCHA CONSONANT SIGN N
+1C31  ; [.20B2.0020.0002.1C31] # LEPCHA CONSONANT SIGN P
+1C32  ; [.20B3.0020.0002.1C32] # LEPCHA CONSONANT SIGN R
+1C33  ; [.20B4.0020.0002.1C33] # LEPCHA CONSONANT SIGN T
+1C34  ; [.20B5.0020.0002.1C34] # LEPCHA CONSONANT SIGN NYIN-DO
+1C35  ; [.20B6.0020.0002.1C35] # LEPCHA CONSONANT SIGN KANG
+A840  ; [.20B7.0020.0002.A840] # PHAGS-PA LETTER KA
+A841  ; [.20B8.0020.0002.A841] # PHAGS-PA LETTER KHA
+A842  ; [.20B9.0020.0002.A842] # PHAGS-PA LETTER GA
+A843  ; [.20BA.0020.0002.A843] # PHAGS-PA LETTER NGA
+A844  ; [.20BB.0020.0002.A844] # PHAGS-PA LETTER CA
+A845  ; [.20BC.0020.0002.A845] # PHAGS-PA LETTER CHA
+A846  ; [.20BD.0020.0002.A846] # PHAGS-PA LETTER JA
+A847  ; [.20BE.0020.0002.A847] # PHAGS-PA LETTER NYA
+A869  ; [.20BF.0020.0002.A869] # PHAGS-PA LETTER TTA
+A86A  ; [.20C0.0020.0002.A86A] # PHAGS-PA LETTER TTHA
+A86B  ; [.20C1.0020.0002.A86B] # PHAGS-PA LETTER DDA
+A86C  ; [.20C2.0020.0002.A86C] # PHAGS-PA LETTER NNA
+A848  ; [.20C3.0020.0002.A848] # PHAGS-PA LETTER TA
+A849  ; [.20C4.0020.0002.A849] # PHAGS-PA LETTER THA
+A84A  ; [.20C5.0020.0002.A84A] # PHAGS-PA LETTER DA
+A84B  ; [.20C6.0020.0002.A84B] # PHAGS-PA LETTER NA
+A84C  ; [.20C7.0020.0002.A84C] # PHAGS-PA LETTER PA
+A84D  ; [.20C8.0020.0002.A84D] # PHAGS-PA LETTER PHA
+A84E  ; [.20C9.0020.0002.A84E] # PHAGS-PA LETTER BA
+A84F  ; [.20CA.0020.0002.A84F] # PHAGS-PA LETTER MA
+A850  ; [.20CB.0020.0002.A850] # PHAGS-PA LETTER TSA
+A851  ; [.20CC.0020.0002.A851] # PHAGS-PA LETTER TSHA
+A852  ; [.20CD.0020.0002.A852] # PHAGS-PA LETTER DZA
+A853  ; [.20CE.0020.0002.A853] # PHAGS-PA LETTER WA
+A867  ; [.20CF.0020.0002.A867] # PHAGS-PA SUBJOINED LETTER WA
+A854  ; [.20D0.0020.0002.A854] # PHAGS-PA LETTER ZHA
+A855  ; [.20D1.0020.0002.A855] # PHAGS-PA LETTER ZA
+A856  ; [.20D2.0020.0002.A856] # PHAGS-PA LETTER SMALL A
+A857  ; [.20D3.0020.0002.A857] # PHAGS-PA LETTER YA
+A868  ; [.20D4.0020.0002.A868] # PHAGS-PA SUBJOINED LETTER YA
+A86D  ; [.20D5.0020.0002.A86D] # PHAGS-PA LETTER ALTERNATE YA
+A858  ; [.20D6.0020.0002.A858] # PHAGS-PA LETTER RA
+A871  ; [.20D7.0020.0002.A871] # PHAGS-PA SUBJOINED LETTER RA
+A872  ; [.20D8.0020.0002.A872] # PHAGS-PA SUPERFIXED LETTER RA
+A859  ; [.20D9.0020.0002.A859] # PHAGS-PA LETTER LA
+A85A  ; [.20DA.0020.0002.A85A] # PHAGS-PA LETTER SHA
+A86E  ; [.20DB.0020.0002.A86E] # PHAGS-PA LETTER VOICELESS SHA
+A85B  ; [.20DC.0020.0002.A85B] # PHAGS-PA LETTER SA
+A85C  ; [.20DD.0020.0002.A85C] # PHAGS-PA LETTER HA
+A86F  ; [.20DE.0020.0002.A86F] # PHAGS-PA LETTER VOICED HA
+A870  ; [.20DF.0020.0002.A870] # PHAGS-PA LETTER ASPIRATED FA
+A85D  ; [.20E0.0020.0002.A85D] # PHAGS-PA LETTER A
+A862  ; [.20E1.0020.0002.A862] # PHAGS-PA LETTER QA
+A863  ; [.20E2.0020.0002.A863] # PHAGS-PA LETTER XA
+A864  ; [.20E3.0020.0002.A864] # PHAGS-PA LETTER FA
+A865  ; [.20E4.0020.0002.A865] # PHAGS-PA LETTER GGA
+A85E  ; [.20E5.0020.0002.A85E] # PHAGS-PA LETTER I
+A85F  ; [.20E6.0020.0002.A85F] # PHAGS-PA LETTER U
+A860  ; [.20E7.0020.0002.A860] # PHAGS-PA LETTER E
+A861  ; [.20E8.0020.0002.A861] # PHAGS-PA LETTER O
+A866  ; [.20E9.0020.0002.A866] # PHAGS-PA LETTER EE
+A873  ; [.20EA.0020.0002.A873] # PHAGS-PA LETTER CANDRABINDU
+1900  ; [.20EB.0020.0002.1900] # LIMBU VOWEL-CARRIER LETTER
+1901  ; [.20EC.0020.0002.1901] # LIMBU LETTER KA
+1902  ; [.20ED.0020.0002.1902] # LIMBU LETTER KHA
+1903  ; [.20EE.0020.0002.1903] # LIMBU LETTER GA
+1904  ; [.20EF.0020.0002.1904] # LIMBU LETTER GHA
+1905  ; [.20F0.0020.0002.1905] # LIMBU LETTER NGA
+1906  ; [.20F1.0020.0002.1906] # LIMBU LETTER CA
+1907  ; [.20F2.0020.0002.1907] # LIMBU LETTER CHA
+1908  ; [.20F3.0020.0002.1908] # LIMBU LETTER JA
+1909  ; [.20F4.0020.0002.1909] # LIMBU LETTER JHA
+190A  ; [.20F5.0020.0002.190A] # LIMBU LETTER YAN
+190B  ; [.20F6.0020.0002.190B] # LIMBU LETTER TA
+190C  ; [.20F7.0020.0002.190C] # LIMBU LETTER THA
+190D  ; [.20F8.0020.0002.190D] # LIMBU LETTER DA
+190E  ; [.20F9.0020.0002.190E] # LIMBU LETTER DHA
+190F  ; [.20FA.0020.0002.190F] # LIMBU LETTER NA
+1910  ; [.20FB.0020.0002.1910] # LIMBU LETTER PA
+1911  ; [.20FC.0020.0002.1911] # LIMBU LETTER PHA
+1912  ; [.20FD.0020.0002.1912] # LIMBU LETTER BA
+1913  ; [.20FE.0020.0002.1913] # LIMBU LETTER BHA
+1914  ; [.20FF.0020.0002.1914] # LIMBU LETTER MA
+1915  ; [.2100.0020.0002.1915] # LIMBU LETTER YA
+1916  ; [.2101.0020.0002.1916] # LIMBU LETTER RA
+1917  ; [.2102.0020.0002.1917] # LIMBU LETTER LA
+1918  ; [.2103.0020.0002.1918] # LIMBU LETTER WA
+1919  ; [.2104.0020.0002.1919] # LIMBU LETTER SHA
+191A  ; [.2105.0020.0002.191A] # LIMBU LETTER SSA
+191B  ; [.2106.0020.0002.191B] # LIMBU LETTER SA
+191C  ; [.2107.0020.0002.191C] # LIMBU LETTER HA
+1920  ; [.2108.0020.0002.1920] # LIMBU VOWEL SIGN A
+1921  ; [.2109.0020.0002.1921] # LIMBU VOWEL SIGN I
+1922  ; [.210A.0020.0002.1922] # LIMBU VOWEL SIGN U
+1923  ; [.210B.0020.0002.1923] # LIMBU VOWEL SIGN EE
+1924  ; [.210C.0020.0002.1924] # LIMBU VOWEL SIGN AI
+1925  ; [.210D.0020.0002.1925] # LIMBU VOWEL SIGN OO
+1926  ; [.210E.0020.0002.1926] # LIMBU VOWEL SIGN AU
+1927  ; [.210F.0020.0002.1927] # LIMBU VOWEL SIGN E
+1928  ; [.2110.0020.0002.1928] # LIMBU VOWEL SIGN O
+1929  ; [.2111.0020.0002.1929] # LIMBU SUBJOINED LETTER YA
+192A  ; [.2112.0020.0002.192A] # LIMBU SUBJOINED LETTER RA
+192B  ; [.2113.0020.0002.192B] # LIMBU SUBJOINED LETTER WA
+1930  ; [.2114.0020.0002.1930] # LIMBU SMALL LETTER KA
+1931  ; [.2115.0020.0002.1931] # LIMBU SMALL LETTER NGA
+1932  ; [.2116.0020.0002.1932] # LIMBU SMALL LETTER ANUSVARA
+1933  ; [.2117.0020.0002.1933] # LIMBU SMALL LETTER TA
+1934  ; [.2118.0020.0002.1934] # LIMBU SMALL LETTER NA
+1935  ; [.2119.0020.0002.1935] # LIMBU SMALL LETTER PA
+1936  ; [.211A.0020.0002.1936] # LIMBU SMALL LETTER MA
+1937  ; [.211B.0020.0002.1937] # LIMBU SMALL LETTER RA
+1938  ; [.211C.0020.0002.1938] # LIMBU SMALL LETTER LA
+1700  ; [.211D.0020.0002.1700] # TAGALOG LETTER A
+1701  ; [.211E.0020.0002.1701] # TAGALOG LETTER I
+1702  ; [.211F.0020.0002.1702] # TAGALOG LETTER U
+1703  ; [.2120.0020.0002.1703] # TAGALOG LETTER KA
+1704  ; [.2121.0020.0002.1704] # TAGALOG LETTER GA
+1705  ; [.2122.0020.0002.1705] # TAGALOG LETTER NGA
+1706  ; [.2123.0020.0002.1706] # TAGALOG LETTER TA
+1707  ; [.2124.0020.0002.1707] # TAGALOG LETTER DA
+1708  ; [.2125.0020.0002.1708] # TAGALOG LETTER NA
+1709  ; [.2126.0020.0002.1709] # TAGALOG LETTER PA
+170A  ; [.2127.0020.0002.170A] # TAGALOG LETTER BA
+170B  ; [.2128.0020.0002.170B] # TAGALOG LETTER MA
+170C  ; [.2129.0020.0002.170C] # TAGALOG LETTER YA
+170E  ; [.212A.0020.0002.170E] # TAGALOG LETTER LA
+170F  ; [.212B.0020.0002.170F] # TAGALOG LETTER WA
+1710  ; [.212C.0020.0002.1710] # TAGALOG LETTER SA
+1711  ; [.212D.0020.0002.1711] # TAGALOG LETTER HA
+1712  ; [.212E.0020.0002.1712] # TAGALOG VOWEL SIGN I
+1713  ; [.212F.0020.0002.1713] # TAGALOG VOWEL SIGN U
+1714  ; [.2130.0020.0002.1714] # TAGALOG SIGN VIRAMA
+1720  ; [.2131.0020.0002.1720] # HANUNOO LETTER A
+1721  ; [.2132.0020.0002.1721] # HANUNOO LETTER I
+1722  ; [.2133.0020.0002.1722] # HANUNOO LETTER U
+1723  ; [.2134.0020.0002.1723] # HANUNOO LETTER KA
+1724  ; [.2135.0020.0002.1724] # HANUNOO LETTER GA
+1725  ; [.2136.0020.0002.1725] # HANUNOO LETTER NGA
+1726  ; [.2137.0020.0002.1726] # HANUNOO LETTER TA
+1727  ; [.2138.0020.0002.1727] # HANUNOO LETTER DA
+1728  ; [.2139.0020.0002.1728] # HANUNOO LETTER NA
+1729  ; [.213A.0020.0002.1729] # HANUNOO LETTER PA
+172A  ; [.213B.0020.0002.172A] # HANUNOO LETTER BA
+172B  ; [.213C.0020.0002.172B] # HANUNOO LETTER MA
+172C  ; [.213D.0020.0002.172C] # HANUNOO LETTER YA
+172D  ; [.213E.0020.0002.172D] # HANUNOO LETTER RA
+172E  ; [.213F.0020.0002.172E] # HANUNOO LETTER LA
+172F  ; [.2140.0020.0002.172F] # HANUNOO LETTER WA
+1730  ; [.2141.0020.0002.1730] # HANUNOO LETTER SA
+1731  ; [.2142.0020.0002.1731] # HANUNOO LETTER HA
+1732  ; [.2143.0020.0002.1732] # HANUNOO VOWEL SIGN I
+1733  ; [.2144.0020.0002.1733] # HANUNOO VOWEL SIGN U
+1734  ; [.2145.0020.0002.1734] # HANUNOO SIGN PAMUDPOD
+1740  ; [.2146.0020.0002.1740] # BUHID LETTER A
+1741  ; [.2147.0020.0002.1741] # BUHID LETTER I
+1742  ; [.2148.0020.0002.1742] # BUHID LETTER U
+1743  ; [.2149.0020.0002.1743] # BUHID LETTER KA
+1744  ; [.214A.0020.0002.1744] # BUHID LETTER GA
+1745  ; [.214B.0020.0002.1745] # BUHID LETTER NGA
+1746  ; [.214C.0020.0002.1746] # BUHID LETTER TA
+1747  ; [.214D.0020.0002.1747] # BUHID LETTER DA
+1748  ; [.214E.0020.0002.1748] # BUHID LETTER NA
+1749  ; [.214F.0020.0002.1749] # BUHID LETTER PA
+174A  ; [.2150.0020.0002.174A] # BUHID LETTER BA
+174B  ; [.2151.0020.0002.174B] # BUHID LETTER MA
+174C  ; [.2152.0020.0002.174C] # BUHID LETTER YA
+174D  ; [.2153.0020.0002.174D] # BUHID LETTER RA
+174E  ; [.2154.0020.0002.174E] # BUHID LETTER LA
+174F  ; [.2155.0020.0002.174F] # BUHID LETTER WA
+1750  ; [.2156.0020.0002.1750] # BUHID LETTER SA
+1751  ; [.2157.0020.0002.1751] # BUHID LETTER HA
+1752  ; [.2158.0020.0002.1752] # BUHID VOWEL SIGN I
+1753  ; [.2159.0020.0002.1753] # BUHID VOWEL SIGN U
+1760  ; [.215A.0020.0002.1760] # TAGBANWA LETTER A
+1761  ; [.215B.0020.0002.1761] # TAGBANWA LETTER I
+1762  ; [.215C.0020.0002.1762] # TAGBANWA LETTER U
+1763  ; [.215D.0020.0002.1763] # TAGBANWA LETTER KA
+1764  ; [.215E.0020.0002.1764] # TAGBANWA LETTER GA
+1765  ; [.215F.0020.0002.1765] # TAGBANWA LETTER NGA
+1766  ; [.2160.0020.0002.1766] # TAGBANWA LETTER TA
+1767  ; [.2161.0020.0002.1767] # TAGBANWA LETTER DA
+1768  ; [.2162.0020.0002.1768] # TAGBANWA LETTER NA
+1769  ; [.2163.0020.0002.1769] # TAGBANWA LETTER PA
+176A  ; [.2164.0020.0002.176A] # TAGBANWA LETTER BA
+176B  ; [.2165.0020.0002.176B] # TAGBANWA LETTER MA
+176C  ; [.2166.0020.0002.176C] # TAGBANWA LETTER YA
+176E  ; [.2167.0020.0002.176E] # TAGBANWA LETTER LA
+176F  ; [.2168.0020.0002.176F] # TAGBANWA LETTER WA
+1770  ; [.2169.0020.0002.1770] # TAGBANWA LETTER SA
+1772  ; [.216A.0020.0002.1772] # TAGBANWA VOWEL SIGN I
+1773  ; [.216B.0020.0002.1773] # TAGBANWA VOWEL SIGN U
+1A00  ; [.216C.0020.0002.1A00] # BUGINESE LETTER KA
+1A01  ; [.216D.0020.0002.1A01] # BUGINESE LETTER GA
+1A02  ; [.216E.0020.0002.1A02] # BUGINESE LETTER NGA
+1A03  ; [.216F.0020.0002.1A03] # BUGINESE LETTER NGKA
+1A04  ; [.2170.0020.0002.1A04] # BUGINESE LETTER PA
+1A05  ; [.2171.0020.0002.1A05] # BUGINESE LETTER BA
+1A06  ; [.2172.0020.0002.1A06] # BUGINESE LETTER MA
+1A07  ; [.2173.0020.0002.1A07] # BUGINESE LETTER MPA
+1A08  ; [.2174.0020.0002.1A08] # BUGINESE LETTER TA
+1A09  ; [.2175.0020.0002.1A09] # BUGINESE LETTER DA
+1A0A  ; [.2176.0020.0002.1A0A] # BUGINESE LETTER NA
+1A0B  ; [.2177.0020.0002.1A0B] # BUGINESE LETTER NRA
+1A0C  ; [.2178.0020.0002.1A0C] # BUGINESE LETTER CA
+1A0D  ; [.2179.0020.0002.1A0D] # BUGINESE LETTER JA
+1A0E  ; [.217A.0020.0002.1A0E] # BUGINESE LETTER NYA
+1A0F  ; [.217B.0020.0002.1A0F] # BUGINESE LETTER NYCA
+1A10  ; [.217C.0020.0002.1A10] # BUGINESE LETTER YA
+1A11  ; [.217D.0020.0002.1A11] # BUGINESE LETTER RA
+1A12  ; [.217E.0020.0002.1A12] # BUGINESE LETTER LA
+1A13  ; [.217F.0020.0002.1A13] # BUGINESE LETTER VA
+1A14  ; [.2180.0020.0002.1A14] # BUGINESE LETTER SA
+1A15  ; [.2181.0020.0002.1A15] # BUGINESE LETTER A
+1A16  ; [.2182.0020.0002.1A16] # BUGINESE LETTER HA
+1A17  ; [.2183.0020.0002.1A17] # BUGINESE VOWEL SIGN I
+1A18  ; [.2184.0020.0002.1A18] # BUGINESE VOWEL SIGN U
+1A19  ; [.2185.0020.0002.1A19] # BUGINESE VOWEL SIGN E
+1A1A  ; [.2186.0020.0002.1A1A] # BUGINESE VOWEL SIGN O
+1A1B  ; [.2187.0020.0002.1A1B] # BUGINESE VOWEL SIGN AE
+A930  ; [.2188.0020.0002.A930] # REJANG LETTER KA
+A931  ; [.2189.0020.0002.A931] # REJANG LETTER GA
+A932  ; [.218A.0020.0002.A932] # REJANG LETTER NGA
+A933  ; [.218B.0020.0002.A933] # REJANG LETTER TA
+A934  ; [.218C.0020.0002.A934] # REJANG LETTER DA
+A935  ; [.218D.0020.0002.A935] # REJANG LETTER NA
+A936  ; [.218E.0020.0002.A936] # REJANG LETTER PA
+A937  ; [.218F.0020.0002.A937] # REJANG LETTER BA
+A938  ; [.2190.0020.0002.A938] # REJANG LETTER MA
+A939  ; [.2191.0020.0002.A939] # REJANG LETTER CA
+A93A  ; [.2192.0020.0002.A93A] # REJANG LETTER JA
+A93B  ; [.2193.0020.0002.A93B] # REJANG LETTER NYA
+A93C  ; [.2194.0020.0002.A93C] # REJANG LETTER SA
+A93D  ; [.2195.0020.0002.A93D] # REJANG LETTER RA
+A93E  ; [.2196.0020.0002.A93E] # REJANG LETTER LA
+A93F  ; [.2197.0020.0002.A93F] # REJANG LETTER YA
+A940  ; [.2198.0020.0002.A940] # REJANG LETTER WA
+A941  ; [.2199.0020.0002.A941] # REJANG LETTER HA
+A942  ; [.219A.0020.0002.A942] # REJANG LETTER MBA
+A943  ; [.219B.0020.0002.A943] # REJANG LETTER NGGA
+A944  ; [.219C.0020.0002.A944] # REJANG LETTER NDA
+A945  ; [.219D.0020.0002.A945] # REJANG LETTER NYJA
+A946  ; [.219E.0020.0002.A946] # REJANG LETTER A
+A947  ; [.219F.0020.0002.A947] # REJANG VOWEL SIGN I
+A948  ; [.21A0.0020.0002.A948] # REJANG VOWEL SIGN U
+A949  ; [.21A1.0020.0002.A949] # REJANG VOWEL SIGN E
+A94A  ; [.21A2.0020.0002.A94A] # REJANG VOWEL SIGN AI
+A94B  ; [.21A3.0020.0002.A94B] # REJANG VOWEL SIGN O
+A94C  ; [.21A4.0020.0002.A94C] # REJANG VOWEL SIGN AU
+A94D  ; [.21A5.0020.0002.A94D] # REJANG VOWEL SIGN EU
+A94E  ; [.21A6.0020.0002.A94E] # REJANG VOWEL SIGN EA
+A94F  ; [.21A7.0020.0002.A94F] # REJANG CONSONANT SIGN NG
+A950  ; [.21A8.0020.0002.A950] # REJANG CONSONANT SIGN N
+A951  ; [.21A9.0020.0002.A951] # REJANG CONSONANT SIGN R
+A952  ; [.21AA.0020.0002.A952] # REJANG CONSONANT SIGN H
+A953  ; [.21AB.0020.0002.A953] # REJANG VIRAMA
+A90A  ; [.21AC.0020.0002.A90A] # KAYAH LI LETTER KA
+A90B  ; [.21AD.0020.0002.A90B] # KAYAH LI LETTER KHA
+A90C  ; [.21AE.0020.0002.A90C] # KAYAH LI LETTER GA
+A90D  ; [.21AF.0020.0002.A90D] # KAYAH LI LETTER NGA
+A90E  ; [.21B0.0020.0002.A90E] # KAYAH LI LETTER SA
+A90F  ; [.21B1.0020.0002.A90F] # KAYAH LI LETTER SHA
+A910  ; [.21B2.0020.0002.A910] # KAYAH LI LETTER ZA
+A911  ; [.21B3.0020.0002.A911] # KAYAH LI LETTER NYA
+A912  ; [.21B4.0020.0002.A912] # KAYAH LI LETTER TA
+A913  ; [.21B5.0020.0002.A913] # KAYAH LI LETTER HTA
+A914  ; [.21B6.0020.0002.A914] # KAYAH LI LETTER NA
+A915  ; [.21B7.0020.0002.A915] # KAYAH LI LETTER PA
+A916  ; [.21B8.0020.0002.A916] # KAYAH LI LETTER PHA
+A917  ; [.21B9.0020.0002.A917] # KAYAH LI LETTER MA
+A918  ; [.21BA.0020.0002.A918] # KAYAH LI LETTER DA
+A919  ; [.21BB.0020.0002.A919] # KAYAH LI LETTER BA
+A91A  ; [.21BC.0020.0002.A91A] # KAYAH LI LETTER RA
+A91B  ; [.21BD.0020.0002.A91B] # KAYAH LI LETTER YA
+A91C  ; [.21BE.0020.0002.A91C] # KAYAH LI LETTER LA
+A91D  ; [.21BF.0020.0002.A91D] # KAYAH LI LETTER WA
+A91E  ; [.21C0.0020.0002.A91E] # KAYAH LI LETTER THA
+A91F  ; [.21C1.0020.0002.A91F] # KAYAH LI LETTER HA
+A920  ; [.21C2.0020.0002.A920] # KAYAH LI LETTER VA
+A921  ; [.21C3.0020.0002.A921] # KAYAH LI LETTER CA
+A922  ; [.21C4.0020.0002.A922] # KAYAH LI LETTER A
+A923  ; [.21C5.0020.0002.A923] # KAYAH LI LETTER OE
+A924  ; [.21C6.0020.0002.A924] # KAYAH LI LETTER I
+A925  ; [.21C7.0020.0002.A925] # KAYAH LI LETTER OO
+A926  ; [.21C8.0020.0002.A926] # KAYAH LI VOWEL UE
+A927  ; [.21C9.0020.0002.A927] # KAYAH LI VOWEL E
+A928  ; [.21CA.0020.0002.A928] # KAYAH LI VOWEL U
+A929  ; [.21CB.0020.0002.A929] # KAYAH LI VOWEL EE
+A92A  ; [.21CC.0020.0002.A92A] # KAYAH LI VOWEL O
+1000  ; [.21CD.0020.0002.1000] # MYANMAR LETTER KA
+1075  ; [.21CE.0020.0002.1075] # MYANMAR LETTER SHAN KA
+1001  ; [.21CF.0020.0002.1001] # MYANMAR LETTER KHA
+1076  ; [.21D0.0020.0002.1076] # MYANMAR LETTER SHAN KHA
+1002  ; [.21D1.0020.0002.1002] # MYANMAR LETTER GA
+1077  ; [.21D2.0020.0002.1077] # MYANMAR LETTER SHAN GA
+AA60  ; [.21D3.0020.0002.AA60] # MYANMAR LETTER KHAMTI GA
+1003  ; [.21D4.0020.0002.1003] # MYANMAR LETTER GHA
+1004  ; [.21D5.0020.0002.1004] # MYANMAR LETTER NGA
+105A  ; [.21D6.0020.0002.105A] # MYANMAR LETTER MON NGA
+1005  ; [.21D7.0020.0002.1005] # MYANMAR LETTER CA
+1078  ; [.21D8.0020.0002.1078] # MYANMAR LETTER SHAN CA
+AA61  ; [.21D9.0020.0002.AA61] # MYANMAR LETTER KHAMTI CA
+1006  ; [.21DA.0020.0002.1006] # MYANMAR LETTER CHA
+AA62  ; [.21DB.0020.0002.AA62] # MYANMAR LETTER KHAMTI CHA
+1007  ; [.21DC.0020.0002.1007] # MYANMAR LETTER JA
+AA63  ; [.21DD.0020.0002.AA63] # MYANMAR LETTER KHAMTI JA
+1079  ; [.21DE.0020.0002.1079] # MYANMAR LETTER SHAN ZA
+AA72  ; [.21DF.0020.0002.AA72] # MYANMAR LETTER KHAMTI ZA
+1008  ; [.21E0.0020.0002.1008] # MYANMAR LETTER JHA
+105B  ; [.21E1.0020.0002.105B] # MYANMAR LETTER MON JHA
+AA64  ; [.21E2.0020.0002.AA64] # MYANMAR LETTER KHAMTI JHA
+1061  ; [.21E3.0020.0002.1061] # MYANMAR LETTER SGAW KAREN SHA
+1009  ; [.21E4.0020.0002.1009] # MYANMAR LETTER NYA
+107A  ; [.21E5.0020.0002.107A] # MYANMAR LETTER SHAN NYA
+AA65  ; [.21E6.0020.0002.AA65] # MYANMAR LETTER KHAMTI NYA
+100A  ; [.21E7.0020.0002.100A] # MYANMAR LETTER NNYA
+100B  ; [.21E8.0020.0002.100B] # MYANMAR LETTER TTA
+AA66  ; [.21E9.0020.0002.AA66] # MYANMAR LETTER KHAMTI TTA
+100C  ; [.21EA.0020.0002.100C] # MYANMAR LETTER TTHA
+AA67  ; [.21EB.0020.0002.AA67] # MYANMAR LETTER KHAMTI TTHA
+100D  ; [.21EC.0020.0002.100D] # MYANMAR LETTER DDA
+AA68  ; [.21ED.0020.0002.AA68] # MYANMAR LETTER KHAMTI DDA
+100E  ; [.21EE.0020.0002.100E] # MYANMAR LETTER DDHA
+AA69  ; [.21EF.0020.0002.AA69] # MYANMAR LETTER KHAMTI DDHA
+100F  ; [.21F0.0020.0002.100F] # MYANMAR LETTER NNA
+106E  ; [.21F1.0020.0002.106E] # MYANMAR LETTER EASTERN PWO KAREN NNA
+1010  ; [.21F2.0020.0002.1010] # MYANMAR LETTER TA
+1011  ; [.21F3.0020.0002.1011] # MYANMAR LETTER THA
+1012  ; [.21F4.0020.0002.1012] # MYANMAR LETTER DA
+107B  ; [.21F5.0020.0002.107B] # MYANMAR LETTER SHAN DA
+1013  ; [.21F6.0020.0002.1013] # MYANMAR LETTER DHA
+AA6A  ; [.21F7.0020.0002.AA6A] # MYANMAR LETTER KHAMTI DHA
+1014  ; [.21F8.0020.0002.1014] # MYANMAR LETTER NA
+107C  ; [.21F9.0020.0002.107C] # MYANMAR LETTER SHAN NA
+AA6B  ; [.21FA.0020.0002.AA6B] # MYANMAR LETTER KHAMTI NA
+105E  ; [.21FB.0020.0002.105E] # MYANMAR CONSONANT SIGN MON MEDIAL NA
+1015  ; [.21FC.0020.0002.1015] # MYANMAR LETTER PA
+1016  ; [.21FD.0020.0002.1016] # MYANMAR LETTER PHA
+107D  ; [.21FE.0020.0002.107D] # MYANMAR LETTER SHAN PHA
+107E  ; [.21FF.0020.0002.107E] # MYANMAR LETTER SHAN FA
+AA6F  ; [.2200.0020.0002.AA6F] # MYANMAR LETTER KHAMTI FA
+108E  ; [.2201.0020.0002.108E] # MYANMAR LETTER RUMAI PALAUNG FA
+1017  ; [.2202.0020.0002.1017] # MYANMAR LETTER BA
+107F  ; [.2203.0020.0002.107F] # MYANMAR LETTER SHAN BA
+1018  ; [.2204.0020.0002.1018] # MYANMAR LETTER BHA
+1019  ; [.2205.0020.0002.1019] # MYANMAR LETTER MA
+105F  ; [.2206.0020.0002.105F] # MYANMAR CONSONANT SIGN MON MEDIAL MA
+101A  ; [.2207.0020.0002.101A] # MYANMAR LETTER YA
+103B  ; [.2208.0020.0002.103B] # MYANMAR CONSONANT SIGN MEDIAL YA
+101B  ; [.2209.0020.0002.101B] # MYANMAR LETTER RA
+AA73  ; [.220A.0020.0002.AA73] # MYANMAR LETTER KHAMTI RA
+AA7A  ; [.220B.0020.0002.AA7A] # MYANMAR LETTER AITON RA
+103C  ; [.220C.0020.0002.103C] # MYANMAR CONSONANT SIGN MEDIAL RA
+101C  ; [.220D.0020.0002.101C] # MYANMAR LETTER LA
+1060  ; [.220E.0020.0002.1060] # MYANMAR CONSONANT SIGN MON MEDIAL LA
+101D  ; [.220F.0020.0002.101D] # MYANMAR LETTER WA
+103D  ; [.2210.0020.0002.103D] # MYANMAR CONSONANT SIGN MEDIAL WA
+1082  ; [.2211.0020.0002.1082] # MYANMAR CONSONANT SIGN SHAN MEDIAL WA
+1080  ; [.2212.0020.0002.1080] # MYANMAR LETTER SHAN THA
+1050  ; [.2213.0020.0002.1050] # MYANMAR LETTER SHA
+1051  ; [.2214.0020.0002.1051] # MYANMAR LETTER SSA
+1065  ; [.2215.0020.0002.1065] # MYANMAR LETTER WESTERN PWO KAREN THA
+101E  ; [.2216.0020.0002.101E] # MYANMAR LETTER SA
+103F  ; [.2216.0020.0004.103F][.224D.0020.0004.103F][.2216.0020.001F.103F] # MYANMAR LETTER GREAT SA; QQKN
+AA6C  ; [.2217.0020.0002.AA6C] # MYANMAR LETTER KHAMTI SA
+101F  ; [.2218.0020.0002.101F] # MYANMAR LETTER HA
+1081  ; [.2219.0020.0002.1081] # MYANMAR LETTER SHAN HA
+AA6D  ; [.221A.0020.0002.AA6D] # MYANMAR LETTER KHAMTI HA
+103E  ; [.221B.0020.0002.103E] # MYANMAR CONSONANT SIGN MEDIAL HA
+AA6E  ; [.221C.0020.0002.AA6E] # MYANMAR LETTER KHAMTI HHA
+AA71  ; [.221D.0020.0002.AA71] # MYANMAR LETTER KHAMTI XA
+1020  ; [.221E.0020.0002.1020] # MYANMAR LETTER LLA
+105C  ; [.221F.0020.0002.105C] # MYANMAR LETTER MON BBA
+105D  ; [.2220.0020.0002.105D] # MYANMAR LETTER MON BBE
+106F  ; [.2221.0020.0002.106F] # MYANMAR LETTER EASTERN PWO KAREN YWA
+1070  ; [.2222.0020.0002.1070] # MYANMAR LETTER EASTERN PWO KAREN GHWA
+1066  ; [.2223.0020.0002.1066] # MYANMAR LETTER WESTERN PWO KAREN PWA
+1021  ; [.2224.0020.0002.1021] # MYANMAR LETTER A
+1022  ; [.2225.0020.0002.1022] # MYANMAR LETTER SHAN A
+1023  ; [.2226.0020.0002.1023] # MYANMAR LETTER I
+1024  ; [.2227.0020.0002.1024] # MYANMAR LETTER II
+1025  ; [.2228.0020.0002.1025] # MYANMAR LETTER U
+1026  ; [.2229.0020.0002.1026] # MYANMAR LETTER UU
+1025 102E ; [.2229.0020.0002.1026] # MYANMAR LETTER UU
+1052  ; [.222A.0020.0002.1052] # MYANMAR LETTER VOCALIC R
+1053  ; [.222B.0020.0002.1053] # MYANMAR LETTER VOCALIC RR
+1054  ; [.222C.0020.0002.1054] # MYANMAR LETTER VOCALIC L
+1055  ; [.222D.0020.0002.1055] # MYANMAR LETTER VOCALIC LL
+1027  ; [.222E.0020.0002.1027] # MYANMAR LETTER E
+1028  ; [.222F.0020.0002.1028] # MYANMAR LETTER MON E
+1029  ; [.2230.0020.0002.1029] # MYANMAR LETTER O
+102A  ; [.2231.0020.0002.102A] # MYANMAR LETTER AU
+102C  ; [.2232.0020.0002.102C] # MYANMAR VOWEL SIGN AA
+102B  ; [.2232.0020.0004.102B] # MYANMAR VOWEL SIGN TALL AA; QQK
+1083  ; [.2233.0020.0002.1083] # MYANMAR VOWEL SIGN SHAN AA
+1072  ; [.2234.0020.0002.1072] # MYANMAR VOWEL SIGN KAYAH OE
+109C  ; [.2235.0020.0002.109C] # MYANMAR VOWEL SIGN AITON A
+102D  ; [.2236.0020.0002.102D] # MYANMAR VOWEL SIGN I
+1071  ; [.2237.0020.0002.1071] # MYANMAR VOWEL SIGN GEBA KAREN I
+102E  ; [.2238.0020.0002.102E] # MYANMAR VOWEL SIGN II
+1033  ; [.2239.0020.0002.1033] # MYANMAR VOWEL SIGN MON II
+102F  ; [.223A.0020.0002.102F] # MYANMAR VOWEL SIGN U
+1073  ; [.223B.0020.0002.1073] # MYANMAR VOWEL SIGN KAYAH U
+1074  ; [.223C.0020.0002.1074] # MYANMAR VOWEL SIGN KAYAH EE
+1030  ; [.223D.0020.0002.1030] # MYANMAR VOWEL SIGN UU
+1056  ; [.223E.0020.0002.1056] # MYANMAR VOWEL SIGN VOCALIC R
+1057  ; [.223F.0020.0002.1057] # MYANMAR VOWEL SIGN VOCALIC RR
+1058  ; [.2240.0020.0002.1058] # MYANMAR VOWEL SIGN VOCALIC L
+1059  ; [.2241.0020.0002.1059] # MYANMAR VOWEL SIGN VOCALIC LL
+1031  ; [.2242.0020.0002.1031] # MYANMAR VOWEL SIGN E
+1084  ; [.2243.0020.0002.1084] # MYANMAR VOWEL SIGN SHAN E
+1035  ; [.2244.0020.0002.1035] # MYANMAR VOWEL SIGN E ABOVE
+1085  ; [.2245.0020.0002.1085] # MYANMAR VOWEL SIGN SHAN E ABOVE
+1032  ; [.2246.0020.0002.1032] # MYANMAR VOWEL SIGN AI
+109D  ; [.2247.0020.0002.109D] # MYANMAR VOWEL SIGN AITON AI
+1034  ; [.2248.0020.0002.1034] # MYANMAR VOWEL SIGN MON O
+1062  ; [.2249.0020.0002.1062] # MYANMAR VOWEL SIGN SGAW KAREN EU
+1067  ; [.224A.0020.0002.1067] # MYANMAR VOWEL SIGN WESTERN PWO KAREN EU
+1068  ; [.224B.0020.0002.1068] # MYANMAR VOWEL SIGN WESTERN PWO KAREN UE
+1086  ; [.224C.0020.0002.1086] # MYANMAR VOWEL SIGN SHAN FINAL Y
+1039  ; [.224D.0020.0002.1039] # MYANMAR SIGN VIRAMA
+103A  ; [.224E.0020.0002.103A] # MYANMAR SIGN ASAT
+1063  ; [.224F.0020.0002.1063] # MYANMAR TONE MARK SGAW KAREN HATHI
+1064  ; [.2250.0020.0002.1064] # MYANMAR TONE MARK SGAW KAREN KE PHO
+1069  ; [.2251.0020.0002.1069] # MYANMAR SIGN WESTERN PWO KAREN TONE-1
+106A  ; [.2252.0020.0002.106A] # MYANMAR SIGN WESTERN PWO KAREN TONE-2
+106B  ; [.2253.0020.0002.106B] # MYANMAR SIGN WESTERN PWO KAREN TONE-3
+106C  ; [.2254.0020.0002.106C] # MYANMAR SIGN WESTERN PWO KAREN TONE-4
+106D  ; [.2255.0020.0002.106D] # MYANMAR SIGN WESTERN PWO KAREN TONE-5
+1087  ; [.2256.0020.0002.1087] # MYANMAR SIGN SHAN TONE-2
+108B  ; [.2257.0020.0002.108B] # MYANMAR SIGN SHAN COUNCIL TONE-2
+1088  ; [.2258.0020.0002.1088] # MYANMAR SIGN SHAN TONE-3
+108C  ; [.2259.0020.0002.108C] # MYANMAR SIGN SHAN COUNCIL TONE-3
+1089  ; [.225A.0020.0002.1089] # MYANMAR SIGN SHAN TONE-5
+108A  ; [.225B.0020.0002.108A] # MYANMAR SIGN SHAN TONE-6
+108F  ; [.225C.0020.0002.108F] # MYANMAR SIGN RUMAI PALAUNG TONE-5
+109A  ; [.225D.0020.0002.109A] # MYANMAR SIGN KHAMTI TONE-1
+109B  ; [.225E.0020.0002.109B] # MYANMAR SIGN KHAMTI TONE-3
+AA7B  ; [.225F.0020.0002.AA7B] # MYANMAR SIGN PAO KAREN TONE
+AA74  ; [.2260.0020.0002.AA74] # MYANMAR LOGOGRAM KHAMTI OAY
+AA75  ; [.2261.0020.0002.AA75] # MYANMAR LOGOGRAM KHAMTI QN
+AA76  ; [.2262.0020.0002.AA76] # MYANMAR LOGOGRAM KHAMTI HM
+1780  ; [.2263.0020.0002.1780] # KHMER LETTER KA
+1781  ; [.2264.0020.0002.1781] # KHMER LETTER KHA
+1782  ; [.2265.0020.0002.1782] # KHMER LETTER KO
+1783  ; [.2266.0020.0002.1783] # KHMER LETTER KHO
+1784  ; [.2267.0020.0002.1784] # KHMER LETTER NGO
+1785  ; [.2268.0020.0002.1785] # KHMER LETTER CA
+1786  ; [.2269.0020.0002.1786] # KHMER LETTER CHA
+1787  ; [.226A.0020.0002.1787] # KHMER LETTER CO
+1788  ; [.226B.0020.0002.1788] # KHMER LETTER CHO
+1789  ; [.226C.0020.0002.1789] # KHMER LETTER NYO
+178A  ; [.226D.0020.0002.178A] # KHMER LETTER DA
+178B  ; [.226E.0020.0002.178B] # KHMER LETTER TTHA
+178C  ; [.226F.0020.0002.178C] # KHMER LETTER DO
+178D  ; [.2270.0020.0002.178D] # KHMER LETTER TTHO
+178E  ; [.2271.0020.0002.178E] # KHMER LETTER NNO
+178F  ; [.2272.0020.0002.178F] # KHMER LETTER TA
+1790  ; [.2273.0020.0002.1790] # KHMER LETTER THA
+1791  ; [.2274.0020.0002.1791] # KHMER LETTER TO
+1792  ; [.2275.0020.0002.1792] # KHMER LETTER THO
+1793  ; [.2276.0020.0002.1793] # KHMER LETTER NO
+1794  ; [.2277.0020.0002.1794] # KHMER LETTER BA
+1795  ; [.2278.0020.0002.1795] # KHMER LETTER PHA
+1796  ; [.2279.0020.0002.1796] # KHMER LETTER PO
+1797  ; [.227A.0020.0002.1797] # KHMER LETTER PHO
+1798  ; [.227B.0020.0002.1798] # KHMER LETTER MO
+1799  ; [.227C.0020.0002.1799] # KHMER LETTER YO
+179A  ; [.227D.0020.0002.179A] # KHMER LETTER RO
+179B  ; [.227E.0020.0002.179B] # KHMER LETTER LO
+179C  ; [.227F.0020.0002.179C] # KHMER LETTER VO
+179D  ; [.2280.0020.0002.179D] # KHMER LETTER SHA
+179E  ; [.2281.0020.0002.179E] # KHMER LETTER SSO
+179F  ; [.2282.0020.0002.179F] # KHMER LETTER SA
+17A0  ; [.2283.0020.0002.17A0] # KHMER LETTER HA
+17A1  ; [.2284.0020.0002.17A1] # KHMER LETTER LA
+17A2  ; [.2285.0020.0002.17A2] # KHMER LETTER QA
+17DC  ; [.2286.0020.0002.17DC] # KHMER SIGN AVAKRAHASANYA
+17A3  ; [.2287.0020.0002.17A3] # KHMER INDEPENDENT VOWEL QAQ
+17A4  ; [.2288.0020.0002.17A4] # KHMER INDEPENDENT VOWEL QAA
+17A5  ; [.2289.0020.0002.17A5] # KHMER INDEPENDENT VOWEL QI
+17A6  ; [.228A.0020.0002.17A6] # KHMER INDEPENDENT VOWEL QII
+17A7  ; [.228B.0020.0002.17A7] # KHMER INDEPENDENT VOWEL QU
+17A8  ; [.228C.0020.0002.17A8] # KHMER INDEPENDENT VOWEL QUK
+17A9  ; [.228D.0020.0002.17A9] # KHMER INDEPENDENT VOWEL QUU
+17AA  ; [.228E.0020.0002.17AA] # KHMER INDEPENDENT VOWEL QUUV
+17AB  ; [.228F.0020.0002.17AB] # KHMER INDEPENDENT VOWEL RY
+17AC  ; [.2290.0020.0002.17AC] # KHMER INDEPENDENT VOWEL RYY
+17AD  ; [.2291.0020.0002.17AD] # KHMER INDEPENDENT VOWEL LY
+17AE  ; [.2292.0020.0002.17AE] # KHMER INDEPENDENT VOWEL LYY
+17AF  ; [.2293.0020.0002.17AF] # KHMER INDEPENDENT VOWEL QE
+17B0  ; [.2294.0020.0002.17B0] # KHMER INDEPENDENT VOWEL QAI
+17B1  ; [.2295.0020.0002.17B1] # KHMER INDEPENDENT VOWEL QOO TYPE ONE
+17B2  ; [.2296.0020.0002.17B2] # KHMER INDEPENDENT VOWEL QOO TYPE TWO
+17B3  ; [.2297.0020.0002.17B3] # KHMER INDEPENDENT VOWEL QAU
+17B4  ; [.2298.0020.0002.17B4] # KHMER VOWEL INHERENT AQ
+17B5  ; [.2299.0020.0002.17B5] # KHMER VOWEL INHERENT AA
+17B6  ; [.229A.0020.0002.17B6] # KHMER VOWEL SIGN AA
+17B7  ; [.229B.0020.0002.17B7] # KHMER VOWEL SIGN I
+17B8  ; [.229C.0020.0002.17B8] # KHMER VOWEL SIGN II
+17B9  ; [.229D.0020.0002.17B9] # KHMER VOWEL SIGN Y
+17BA  ; [.229E.0020.0002.17BA] # KHMER VOWEL SIGN YY
+17BB  ; [.229F.0020.0002.17BB] # KHMER VOWEL SIGN U
+17BC  ; [.22A0.0020.0002.17BC] # KHMER VOWEL SIGN UU
+17BD  ; [.22A1.0020.0002.17BD] # KHMER VOWEL SIGN UA
+17BE  ; [.22A2.0020.0002.17BE] # KHMER VOWEL SIGN OE
+17BF  ; [.22A3.0020.0002.17BF] # KHMER VOWEL SIGN YA
+17C0  ; [.22A4.0020.0002.17C0] # KHMER VOWEL SIGN IE
+17C1  ; [.22A5.0020.0002.17C1] # KHMER VOWEL SIGN E
+17C2  ; [.22A6.0020.0002.17C2] # KHMER VOWEL SIGN AE
+17C3  ; [.22A7.0020.0002.17C3] # KHMER VOWEL SIGN AI
+17C4  ; [.22A8.0020.0002.17C4] # KHMER VOWEL SIGN OO
+17C5  ; [.22A9.0020.0002.17C5] # KHMER VOWEL SIGN AU
+17D2  ; [.22AA.0020.0002.17D2] # KHMER SIGN COENG
+1950  ; [.22AB.0020.0002.1950] # TAI LE LETTER KA
+1951  ; [.22AC.0020.0002.1951] # TAI LE LETTER XA
+1952  ; [.22AD.0020.0002.1952] # TAI LE LETTER NGA
+1953  ; [.22AE.0020.0002.1953] # TAI LE LETTER TSA
+1954  ; [.22AF.0020.0002.1954] # TAI LE LETTER SA
+1955  ; [.22B0.0020.0002.1955] # TAI LE LETTER YA
+1956  ; [.22B1.0020.0002.1956] # TAI LE LETTER TA
+1957  ; [.22B2.0020.0002.1957] # TAI LE LETTER THA
+1958  ; [.22B3.0020.0002.1958] # TAI LE LETTER LA
+1959  ; [.22B4.0020.0002.1959] # TAI LE LETTER PA
+195A  ; [.22B5.0020.0002.195A] # TAI LE LETTER PHA
+195B  ; [.22B6.0020.0002.195B] # TAI LE LETTER MA
+195C  ; [.22B7.0020.0002.195C] # TAI LE LETTER FA
+195D  ; [.22B8.0020.0002.195D] # TAI LE LETTER VA
+195E  ; [.22B9.0020.0002.195E] # TAI LE LETTER HA
+195F  ; [.22BA.0020.0002.195F] # TAI LE LETTER QA
+1960  ; [.22BB.0020.0002.1960] # TAI LE LETTER KHA
+1961  ; [.22BC.0020.0002.1961] # TAI LE LETTER TSHA
+1962  ; [.22BD.0020.0002.1962] # TAI LE LETTER NA
+1963  ; [.22BE.0020.0002.1963] # TAI LE LETTER A
+1964  ; [.22BF.0020.0002.1964] # TAI LE LETTER I
+1965  ; [.22C0.0020.0002.1965] # TAI LE LETTER EE
+1966  ; [.22C1.0020.0002.1966] # TAI LE LETTER EH
+1967  ; [.22C2.0020.0002.1967] # TAI LE LETTER U
+1968  ; [.22C3.0020.0002.1968] # TAI LE LETTER OO
+1969  ; [.22C4.0020.0002.1969] # TAI LE LETTER O
+196A  ; [.22C5.0020.0002.196A] # TAI LE LETTER UE
+196B  ; [.22C6.0020.0002.196B] # TAI LE LETTER E
+196C  ; [.22C7.0020.0002.196C] # TAI LE LETTER AUE
+196D  ; [.22C8.0020.0002.196D] # TAI LE LETTER AI
+1970  ; [.22C9.0020.0002.1970] # TAI LE LETTER TONE-2
+1971  ; [.22CA.0020.0002.1971] # TAI LE LETTER TONE-3
+1972  ; [.22CB.0020.0002.1972] # TAI LE LETTER TONE-4
+1973  ; [.22CC.0020.0002.1973] # TAI LE LETTER TONE-5
+1974  ; [.22CD.0020.0002.1974] # TAI LE LETTER TONE-6
+1980  ; [.22CE.0020.0002.1980] # NEW TAI LUE LETTER HIGH QA
+1981  ; [.22CF.0020.0002.1981] # NEW TAI LUE LETTER LOW QA
+1982  ; [.22D0.0020.0002.1982] # NEW TAI LUE LETTER HIGH KA
+1983  ; [.22D1.0020.0002.1983] # NEW TAI LUE LETTER HIGH XA
+1984  ; [.22D2.0020.0002.1984] # NEW TAI LUE LETTER HIGH NGA
+1985  ; [.22D3.0020.0002.1985] # NEW TAI LUE LETTER LOW KA
+1986  ; [.22D4.0020.0002.1986] # NEW TAI LUE LETTER LOW XA
+1987  ; [.22D5.0020.0002.1987] # NEW TAI LUE LETTER LOW NGA
+1988  ; [.22D6.0020.0002.1988] # NEW TAI LUE LETTER HIGH TSA
+1989  ; [.22D7.0020.0002.1989] # NEW TAI LUE LETTER HIGH SA
+198A  ; [.22D8.0020.0002.198A] # NEW TAI LUE LETTER HIGH YA
+198B  ; [.22D9.0020.0002.198B] # NEW TAI LUE LETTER LOW TSA
+198C  ; [.22DA.0020.0002.198C] # NEW TAI LUE LETTER LOW SA
+198D  ; [.22DB.0020.0002.198D] # NEW TAI LUE LETTER LOW YA
+198E  ; [.22DC.0020.0002.198E] # NEW TAI LUE LETTER HIGH TA
+198F  ; [.22DD.0020.0002.198F] # NEW TAI LUE LETTER HIGH THA
+1990  ; [.22DE.0020.0002.1990] # NEW TAI LUE LETTER HIGH NA
+1991  ; [.22DF.0020.0002.1991] # NEW TAI LUE LETTER LOW TA
+1992  ; [.22E0.0020.0002.1992] # NEW TAI LUE LETTER LOW THA
+1993  ; [.22E1.0020.0002.1993] # NEW TAI LUE LETTER LOW NA
+1994  ; [.22E2.0020.0002.1994] # NEW TAI LUE LETTER HIGH PA
+1995  ; [.22E3.0020.0002.1995] # NEW TAI LUE LETTER HIGH PHA
+1996  ; [.22E4.0020.0002.1996] # NEW TAI LUE LETTER HIGH MA
+1997  ; [.22E5.0020.0002.1997] # NEW TAI LUE LETTER LOW PA
+1998  ; [.22E6.0020.0002.1998] # NEW TAI LUE LETTER LOW PHA
+1999  ; [.22E7.0020.0002.1999] # NEW TAI LUE LETTER LOW MA
+199A  ; [.22E8.0020.0002.199A] # NEW TAI LUE LETTER HIGH FA
+199B  ; [.22E9.0020.0002.199B] # NEW TAI LUE LETTER HIGH VA
+199C  ; [.22EA.0020.0002.199C] # NEW TAI LUE LETTER HIGH LA
+19DE  ; [.22EA.0020.0004.19DE][.2300.0020.0004.19DE] # NEW TAI LUE SIGN LAE; QQKN
+19DF  ; [.22EA.0020.0004.19DF][.2300.0020.0004.19DF][.230B.0020.001F.19DF] # NEW TAI LUE SIGN LAEV; QQKN
+199D  ; [.22EB.0020.0002.199D] # NEW TAI LUE LETTER LOW FA
+199E  ; [.22EC.0020.0002.199E] # NEW TAI LUE LETTER LOW VA
+199F  ; [.22ED.0020.0002.199F] # NEW TAI LUE LETTER LOW LA
+19A0  ; [.22EE.0020.0002.19A0] # NEW TAI LUE LETTER HIGH HA
+19A1  ; [.22EF.0020.0002.19A1] # NEW TAI LUE LETTER HIGH DA
+19A2  ; [.22F0.0020.0002.19A2] # NEW TAI LUE LETTER HIGH BA
+19A3  ; [.22F1.0020.0002.19A3] # NEW TAI LUE LETTER LOW HA
+19A4  ; [.22F2.0020.0002.19A4] # NEW TAI LUE LETTER LOW DA
+19A5  ; [.22F3.0020.0002.19A5] # NEW TAI LUE LETTER LOW BA
+19A6  ; [.22F4.0020.0002.19A6] # NEW TAI LUE LETTER HIGH KVA
+19A7  ; [.22F5.0020.0002.19A7] # NEW TAI LUE LETTER HIGH XVA
+19A8  ; [.22F6.0020.0002.19A8] # NEW TAI LUE LETTER LOW KVA
+19A9  ; [.22F7.0020.0002.19A9] # NEW TAI LUE LETTER LOW XVA
+19AA  ; [.22F8.0020.0002.19AA] # NEW TAI LUE LETTER HIGH SUA
+19AB  ; [.22F9.0020.0002.19AB] # NEW TAI LUE LETTER LOW SUA
+19B0  ; [.22FA.0020.0002.19B0] # NEW TAI LUE VOWEL SIGN VOWEL SHORTENER
+19B1  ; [.22FB.0020.0002.19B1] # NEW TAI LUE VOWEL SIGN AA
+19B2  ; [.22FC.0020.0002.19B2] # NEW TAI LUE VOWEL SIGN II
+19B3  ; [.22FD.0020.0002.19B3] # NEW TAI LUE VOWEL SIGN U
+19B4  ; [.22FE.0020.0002.19B4] # NEW TAI LUE VOWEL SIGN UU
+19B5  ; [.22FF.0020.0002.19B5] # NEW TAI LUE VOWEL SIGN E
+19B6  ; [.2300.0020.0002.19B6] # NEW TAI LUE VOWEL SIGN AE
+19B7  ; [.2301.0020.0002.19B7] # NEW TAI LUE VOWEL SIGN O
+19B8  ; [.2302.0020.0002.19B8] # NEW TAI LUE VOWEL SIGN OA
+19B9  ; [.2303.0020.0002.19B9] # NEW TAI LUE VOWEL SIGN UE
+19BA  ; [.2304.0020.0002.19BA] # NEW TAI LUE VOWEL SIGN AY
+19BB  ; [.2305.0020.0002.19BB] # NEW TAI LUE VOWEL SIGN AAY
+19BC  ; [.2306.0020.0002.19BC] # NEW TAI LUE VOWEL SIGN UY
+19BD  ; [.2307.0020.0002.19BD] # NEW TAI LUE VOWEL SIGN OY
+19BE  ; [.2308.0020.0002.19BE] # NEW TAI LUE VOWEL SIGN OAY
+19BF  ; [.2309.0020.0002.19BF] # NEW TAI LUE VOWEL SIGN UEY
+19C0  ; [.230A.0020.0002.19C0] # NEW TAI LUE VOWEL SIGN IY
+19C1  ; [.230B.0020.0002.19C1] # NEW TAI LUE LETTER FINAL V
+19C2  ; [.230C.0020.0002.19C2] # NEW TAI LUE LETTER FINAL NG
+19C3  ; [.230D.0020.0002.19C3] # NEW TAI LUE LETTER FINAL N
+19C4  ; [.230E.0020.0002.19C4] # NEW TAI LUE LETTER FINAL M
+19C5  ; [.230F.0020.0002.19C5] # NEW TAI LUE LETTER FINAL K
+19C6  ; [.2310.0020.0002.19C6] # NEW TAI LUE LETTER FINAL D
+19C7  ; [.2311.0020.0002.19C7] # NEW TAI LUE LETTER FINAL B
+19C8  ; [.2312.0020.0002.19C8] # NEW TAI LUE TONE MARK-1
+19C9  ; [.2313.0020.0002.19C9] # NEW TAI LUE TONE MARK-2
+1A20  ; [.2314.0020.0002.1A20] # TAI THAM LETTER HIGH KA
+1A21  ; [.2315.0020.0002.1A21] # TAI THAM LETTER HIGH KHA
+1A22  ; [.2316.0020.0002.1A22] # TAI THAM LETTER HIGH KXA
+1A23  ; [.2317.0020.0002.1A23] # TAI THAM LETTER LOW KA
+1A24  ; [.2318.0020.0002.1A24] # TAI THAM LETTER LOW KXA
+1A25  ; [.2319.0020.0002.1A25] # TAI THAM LETTER LOW KHA
+1A26  ; [.231A.0020.0002.1A26] # TAI THAM LETTER NGA
+1A58  ; [.231A.0020.0004.1A58] # TAI THAM SIGN MAI KANG LAI; QQK
+1A59  ; [.231A.0020.0004.1A59] # TAI THAM CONSONANT SIGN FINAL NGA; QQK
+1A27  ; [.231B.0020.0002.1A27] # TAI THAM LETTER HIGH CA
+1A28  ; [.231C.0020.0002.1A28] # TAI THAM LETTER HIGH CHA
+1A29  ; [.231D.0020.0002.1A29] # TAI THAM LETTER LOW CA
+1A2A  ; [.231E.0020.0002.1A2A] # TAI THAM LETTER LOW SA
+1A2B  ; [.231F.0020.0002.1A2B] # TAI THAM LETTER LOW CHA
+1A2C  ; [.2320.0020.0002.1A2C] # TAI THAM LETTER NYA
+1A2D  ; [.2321.0020.0002.1A2D] # TAI THAM LETTER RATA
+1A2E  ; [.2322.0020.0002.1A2E] # TAI THAM LETTER HIGH RATHA
+1A2F  ; [.2323.0020.0002.1A2F] # TAI THAM LETTER DA
+1A30  ; [.2324.0020.0002.1A30] # TAI THAM LETTER LOW RATHA
+1A31  ; [.2325.0020.0002.1A31] # TAI THAM LETTER RANA
+1A32  ; [.2326.0020.0002.1A32] # TAI THAM LETTER HIGH TA
+1A33  ; [.2327.0020.0002.1A33] # TAI THAM LETTER HIGH THA
+1A34  ; [.2328.0020.0002.1A34] # TAI THAM LETTER LOW TA
+1A35  ; [.2329.0020.0002.1A35] # TAI THAM LETTER LOW THA
+1A36  ; [.232A.0020.0002.1A36] # TAI THAM LETTER NA
+1A37  ; [.232B.0020.0002.1A37] # TAI THAM LETTER BA
+1A38  ; [.232C.0020.0002.1A38] # TAI THAM LETTER HIGH PA
+1A39  ; [.232D.0020.0002.1A39] # TAI THAM LETTER HIGH PHA
+1A3A  ; [.232E.0020.0002.1A3A] # TAI THAM LETTER HIGH FA
+1A3B  ; [.232F.0020.0002.1A3B] # TAI THAM LETTER LOW PA
+1A5A  ; [.232F.0020.0004.1A5A] # TAI THAM CONSONANT SIGN LOW PA; QQK
+1A5B  ; [.232F.0020.0004.1A5B] # TAI THAM CONSONANT SIGN HIGH RATHA OR LOW PA; QQK
+1A3C  ; [.2330.0020.0002.1A3C] # TAI THAM LETTER LOW FA
+1A3D  ; [.2331.0020.0002.1A3D] # TAI THAM LETTER LOW PHA
+1A3E  ; [.2332.0020.0002.1A3E] # TAI THAM LETTER MA
+1A3F  ; [.2333.0020.0002.1A3F] # TAI THAM LETTER LOW YA
+1A40  ; [.2334.0020.0002.1A40] # TAI THAM LETTER HIGH YA
+1A41  ; [.2335.0020.0002.1A41] # TAI THAM LETTER RA
+1A42  ; [.2336.0020.0002.1A42] # TAI THAM LETTER RUE
+1A43  ; [.2337.0020.0002.1A43] # TAI THAM LETTER LA
+1A44  ; [.2338.0020.0002.1A44] # TAI THAM LETTER LUE
+1A45  ; [.2339.0020.0002.1A45] # TAI THAM LETTER WA
+1A46  ; [.233A.0020.0002.1A46] # TAI THAM LETTER HIGH SHA
+1A54  ; [.233A.0020.0004.1A54][.2360.0020.0004.1A54][.233A.0020.001F.1A54] # TAI THAM LETTER GREAT SA; QQKN
+1A47  ; [.233B.0020.0002.1A47] # TAI THAM LETTER HIGH SSA
+1A48  ; [.233C.0020.0002.1A48] # TAI THAM LETTER HIGH SA
+1A49  ; [.233D.0020.0002.1A49] # TAI THAM LETTER HIGH HA
+1A4A  ; [.233E.0020.0002.1A4A] # TAI THAM LETTER LLA
+1A4B  ; [.233F.0020.0002.1A4B] # TAI THAM LETTER A
+1A4C  ; [.2340.0020.0002.1A4C] # TAI THAM LETTER LOW HA
+1A53  ; [.2341.0020.0002.1A53] # TAI THAM LETTER LAE
+1A6B  ; [.2342.0020.0002.1A6B] # TAI THAM VOWEL SIGN O
+1A55  ; [.2343.0020.0002.1A55] # TAI THAM CONSONANT SIGN MEDIAL RA
+1A56  ; [.2344.0020.0002.1A56] # TAI THAM CONSONANT SIGN MEDIAL LA
+1A57  ; [.2345.0020.0002.1A57] # TAI THAM CONSONANT SIGN LA TANG LAI
+1A5C  ; [.2346.0020.0002.1A5C] # TAI THAM CONSONANT SIGN MA
+1A5D  ; [.2347.0020.0002.1A5D] # TAI THAM CONSONANT SIGN BA
+1A5E  ; [.2348.0020.0002.1A5E] # TAI THAM CONSONANT SIGN SA
+1A4D  ; [.2349.0020.0002.1A4D] # TAI THAM LETTER I
+1A4E  ; [.234A.0020.0002.1A4E] # TAI THAM LETTER II
+1A4F  ; [.234B.0020.0002.1A4F] # TAI THAM LETTER U
+1A50  ; [.234C.0020.0002.1A50] # TAI THAM LETTER UU
+1A51  ; [.234D.0020.0002.1A51] # TAI THAM LETTER EE
+1A52  ; [.234E.0020.0002.1A52] # TAI THAM LETTER OO
+1A61  ; [.234F.0020.0002.1A61] # TAI THAM VOWEL SIGN A
+1A6C  ; [.2350.0020.0002.1A6C] # TAI THAM VOWEL SIGN OA BELOW
+1A62  ; [.2351.0020.0002.1A62] # TAI THAM VOWEL SIGN MAI SAT
+1A63  ; [.2352.0020.0002.1A63] # TAI THAM VOWEL SIGN AA
+1A64  ; [.2352.0020.0004.1A64] # TAI THAM VOWEL SIGN TALL AA; QQK
+1A65  ; [.2353.0020.0002.1A65] # TAI THAM VOWEL SIGN I
+1A66  ; [.2354.0020.0002.1A66] # TAI THAM VOWEL SIGN II
+1A67  ; [.2355.0020.0002.1A67] # TAI THAM VOWEL SIGN UE
+1A68  ; [.2356.0020.0002.1A68] # TAI THAM VOWEL SIGN UUE
+1A69  ; [.2357.0020.0002.1A69] # TAI THAM VOWEL SIGN U
+1A6A  ; [.2358.0020.0002.1A6A] # TAI THAM VOWEL SIGN UU
+1A6E  ; [.2359.0020.0002.1A6E] # TAI THAM VOWEL SIGN E
+1A6F  ; [.235A.0020.0002.1A6F] # TAI THAM VOWEL SIGN AE
+1A73  ; [.235B.0020.0002.1A73] # TAI THAM VOWEL SIGN OA ABOVE
+1A70  ; [.235C.0020.0002.1A70] # TAI THAM VOWEL SIGN OO
+1A71  ; [.235D.0020.0002.1A71] # TAI THAM VOWEL SIGN AI
+1A72  ; [.235E.0020.0002.1A72] # TAI THAM VOWEL SIGN THAM AI
+1A6D  ; [.235F.0020.0002.1A6D] # TAI THAM VOWEL SIGN OY
+1A60  ; [.2360.0020.0002.1A60] # TAI THAM SIGN SAKOT
+AA00  ; [.2361.0020.0002.AA00] # CHAM LETTER A
+AA01  ; [.2362.0020.0002.AA01] # CHAM LETTER I
+AA02  ; [.2363.0020.0002.AA02] # CHAM LETTER U
+AA03  ; [.2364.0020.0002.AA03] # CHAM LETTER E
+AA04  ; [.2365.0020.0002.AA04] # CHAM LETTER AI
+AA05  ; [.2366.0020.0002.AA05] # CHAM LETTER O
+AA06  ; [.2367.0020.0002.AA06] # CHAM LETTER KA
+AA07  ; [.2368.0020.0002.AA07] # CHAM LETTER KHA
+AA08  ; [.2369.0020.0002.AA08] # CHAM LETTER GA
+AA09  ; [.236A.0020.0002.AA09] # CHAM LETTER GHA
+AA0A  ; [.236B.0020.0002.AA0A] # CHAM LETTER NGUE
+AA0B  ; [.236C.0020.0002.AA0B] # CHAM LETTER NGA
+AA0C  ; [.236D.0020.0002.AA0C] # CHAM LETTER CHA
+AA0D  ; [.236E.0020.0002.AA0D] # CHAM LETTER CHHA
+AA0E  ; [.236F.0020.0002.AA0E] # CHAM LETTER JA
+AA0F  ; [.2370.0020.0002.AA0F] # CHAM LETTER JHA
+AA10  ; [.2371.0020.0002.AA10] # CHAM LETTER NHUE
+AA11  ; [.2372.0020.0002.AA11] # CHAM LETTER NHA
+AA12  ; [.2373.0020.0002.AA12] # CHAM LETTER NHJA
+AA13  ; [.2374.0020.0002.AA13] # CHAM LETTER TA
+AA14  ; [.2375.0020.0002.AA14] # CHAM LETTER THA
+AA15  ; [.2376.0020.0002.AA15] # CHAM LETTER DA
+AA16  ; [.2377.0020.0002.AA16] # CHAM LETTER DHA
+AA17  ; [.2378.0020.0002.AA17] # CHAM LETTER NUE
+AA18  ; [.2379.0020.0002.AA18] # CHAM LETTER NA
+AA19  ; [.237A.0020.0002.AA19] # CHAM LETTER DDA
+AA1A  ; [.237B.0020.0002.AA1A] # CHAM LETTER PA
+AA1B  ; [.237C.0020.0002.AA1B] # CHAM LETTER PPA
+AA1C  ; [.237D.0020.0002.AA1C] # CHAM LETTER PHA
+AA1D  ; [.237E.0020.0002.AA1D] # CHAM LETTER BA
+AA1E  ; [.237F.0020.0002.AA1E] # CHAM LETTER BHA
+AA1F  ; [.2380.0020.0002.AA1F] # CHAM LETTER MUE
+AA20  ; [.2381.0020.0002.AA20] # CHAM LETTER MA
+AA21  ; [.2382.0020.0002.AA21] # CHAM LETTER BBA
+AA22  ; [.2383.0020.0002.AA22] # CHAM LETTER YA
+AA23  ; [.2384.0020.0002.AA23] # CHAM LETTER RA
+AA24  ; [.2385.0020.0002.AA24] # CHAM LETTER LA
+AA25  ; [.2386.0020.0002.AA25] # CHAM LETTER VA
+AA26  ; [.2387.0020.0002.AA26] # CHAM LETTER SSA
+AA27  ; [.2388.0020.0002.AA27] # CHAM LETTER SA
+AA28  ; [.2389.0020.0002.AA28] # CHAM LETTER HA
+AA33  ; [.238A.0020.0002.AA33] # CHAM CONSONANT SIGN YA
+AA34  ; [.238B.0020.0002.AA34] # CHAM CONSONANT SIGN RA
+AA35  ; [.238C.0020.0002.AA35] # CHAM CONSONANT SIGN LA
+AA36  ; [.238D.0020.0002.AA36] # CHAM CONSONANT SIGN WA
+AA29  ; [.238E.0020.0002.AA29] # CHAM VOWEL SIGN AA
+AA2A  ; [.238F.0020.0002.AA2A] # CHAM VOWEL SIGN I
+AA2B  ; [.2390.0020.0002.AA2B] # CHAM VOWEL SIGN II
+AA2C  ; [.2391.0020.0002.AA2C] # CHAM VOWEL SIGN EI
+AA2D  ; [.2392.0020.0002.AA2D] # CHAM VOWEL SIGN U
+AA2E  ; [.2393.0020.0002.AA2E] # CHAM VOWEL SIGN OE
+AA2F  ; [.2394.0020.0002.AA2F] # CHAM VOWEL SIGN O
+AA30  ; [.2395.0020.0002.AA30] # CHAM VOWEL SIGN AI
+AA31  ; [.2396.0020.0002.AA31] # CHAM VOWEL SIGN AU
+AA32  ; [.2397.0020.0002.AA32] # CHAM VOWEL SIGN UE
+AA40  ; [.2398.0020.0002.AA40] # CHAM LETTER FINAL K
+AA41  ; [.2399.0020.0002.AA41] # CHAM LETTER FINAL G
+AA42  ; [.239A.0020.0002.AA42] # CHAM LETTER FINAL NG
+AA43  ; [.239B.0020.0002.AA43] # CHAM CONSONANT SIGN FINAL NG
+AA44  ; [.239C.0020.0002.AA44] # CHAM LETTER FINAL CH
+AA45  ; [.239D.0020.0002.AA45] # CHAM LETTER FINAL T
+AA46  ; [.239E.0020.0002.AA46] # CHAM LETTER FINAL N
+AA47  ; [.239F.0020.0002.AA47] # CHAM LETTER FINAL P
+AA48  ; [.23A0.0020.0002.AA48] # CHAM LETTER FINAL Y
+AA49  ; [.23A1.0020.0002.AA49] # CHAM LETTER FINAL R
+AA4A  ; [.23A2.0020.0002.AA4A] # CHAM LETTER FINAL L
+AA4B  ; [.23A3.0020.0002.AA4B] # CHAM LETTER FINAL SS
+AA4C  ; [.23A4.0020.0002.AA4C] # CHAM CONSONANT SIGN FINAL M
+AA4D  ; [.23A5.0020.0002.AA4D] # CHAM CONSONANT SIGN FINAL H
+1B05  ; [.23A6.0020.0002.1B05] # BALINESE LETTER AKARA
+1B06  ; [.23A7.0020.0002.1B06] # BALINESE LETTER AKARA TEDUNG
+1B05 1B35 ; [.23A7.0020.0002.1B06] # BALINESE LETTER AKARA TEDUNG
+1B07  ; [.23A8.0020.0002.1B07] # BALINESE LETTER IKARA
+1B08  ; [.23A9.0020.0002.1B08] # BALINESE LETTER IKARA TEDUNG
+1B07 1B35 ; [.23A9.0020.0002.1B08] # BALINESE LETTER IKARA TEDUNG
+1B09  ; [.23AA.0020.0002.1B09] # BALINESE LETTER UKARA
+1B0A  ; [.23AB.0020.0002.1B0A] # BALINESE LETTER UKARA TEDUNG
+1B09 1B35 ; [.23AB.0020.0002.1B0A] # BALINESE LETTER UKARA TEDUNG
+1B0B  ; [.23AC.0020.0002.1B0B] # BALINESE LETTER RA REPA
+1B0C  ; [.23AD.0020.0002.1B0C] # BALINESE LETTER RA REPA TEDUNG
+1B0B 1B35 ; [.23AD.0020.0002.1B0C] # BALINESE LETTER RA REPA TEDUNG
+1B0D  ; [.23AE.0020.0002.1B0D] # BALINESE LETTER LA LENGA
+1B0E  ; [.23AF.0020.0002.1B0E] # BALINESE LETTER LA LENGA TEDUNG
+1B0D 1B35 ; [.23AF.0020.0002.1B0E] # BALINESE LETTER LA LENGA TEDUNG
+1B0F  ; [.23B0.0020.0002.1B0F] # BALINESE LETTER EKARA
+1B10  ; [.23B1.0020.0002.1B10] # BALINESE LETTER AIKARA
+1B11  ; [.23B2.0020.0002.1B11] # BALINESE LETTER OKARA
+1B12  ; [.23B3.0020.0002.1B12] # BALINESE LETTER OKARA TEDUNG
+1B11 1B35 ; [.23B3.0020.0002.1B12] # BALINESE LETTER OKARA TEDUNG
+1B13  ; [.23B4.0020.0002.1B13] # BALINESE LETTER KA
+1B45  ; [.23B5.0020.0002.1B45] # BALINESE LETTER KAF SASAK
+1B46  ; [.23B6.0020.0002.1B46] # BALINESE LETTER KHOT SASAK
+1B14  ; [.23B7.0020.0002.1B14] # BALINESE LETTER KA MAHAPRANA
+1B15  ; [.23B8.0020.0002.1B15] # BALINESE LETTER GA
+1B16  ; [.23B9.0020.0002.1B16] # BALINESE LETTER GA GORA
+1B17  ; [.23BA.0020.0002.1B17] # BALINESE LETTER NGA
+1B18  ; [.23BB.0020.0002.1B18] # BALINESE LETTER CA
+1B19  ; [.23BC.0020.0002.1B19] # BALINESE LETTER CA LACA
+1B1A  ; [.23BD.0020.0002.1B1A] # BALINESE LETTER JA
+1B1B  ; [.23BE.0020.0002.1B1B] # BALINESE LETTER JA JERA
+1B1C  ; [.23BF.0020.0002.1B1C] # BALINESE LETTER NYA
+1B1D  ; [.23C0.0020.0002.1B1D] # BALINESE LETTER TA LATIK
+1B1E  ; [.23C1.0020.0002.1B1E] # BALINESE LETTER TA MURDA MAHAPRANA
+1B1F  ; [.23C2.0020.0002.1B1F] # BALINESE LETTER DA MURDA ALPAPRANA
+1B20  ; [.23C3.0020.0002.1B20] # BALINESE LETTER DA MURDA MAHAPRANA
+1B21  ; [.23C4.0020.0002.1B21] # BALINESE LETTER NA RAMBAT
+1B22  ; [.23C5.0020.0002.1B22] # BALINESE LETTER TA
+1B47  ; [.23C6.0020.0002.1B47] # BALINESE LETTER TZIR SASAK
+1B23  ; [.23C7.0020.0002.1B23] # BALINESE LETTER TA TAWA
+1B24  ; [.23C8.0020.0002.1B24] # BALINESE LETTER DA
+1B25  ; [.23C9.0020.0002.1B25] # BALINESE LETTER DA MADU
+1B26  ; [.23CA.0020.0002.1B26] # BALINESE LETTER NA
+1B27  ; [.23CB.0020.0002.1B27] # BALINESE LETTER PA
+1B48  ; [.23CC.0020.0002.1B48] # BALINESE LETTER EF SASAK
+1B28  ; [.23CD.0020.0002.1B28] # BALINESE LETTER PA KAPAL
+1B29  ; [.23CE.0020.0002.1B29] # BALINESE LETTER BA
+1B2A  ; [.23CF.0020.0002.1B2A] # BALINESE LETTER BA KEMBANG
+1B2B  ; [.23D0.0020.0002.1B2B] # BALINESE LETTER MA
+1B2C  ; [.23D1.0020.0002.1B2C] # BALINESE LETTER YA
+1B2D  ; [.23D2.0020.0002.1B2D] # BALINESE LETTER RA
+1B2E  ; [.23D3.0020.0002.1B2E] # BALINESE LETTER LA
+1B2F  ; [.23D4.0020.0002.1B2F] # BALINESE LETTER WA
+1B49  ; [.23D5.0020.0002.1B49] # BALINESE LETTER VE SASAK
+1B30  ; [.23D6.0020.0002.1B30] # BALINESE LETTER SA SAGA
+1B31  ; [.23D7.0020.0002.1B31] # BALINESE LETTER SA SAPA
+1B32  ; [.23D8.0020.0002.1B32] # BALINESE LETTER SA
+1B4A  ; [.23D9.0020.0002.1B4A] # BALINESE LETTER ZAL SASAK
+1B4B  ; [.23DA.0020.0002.1B4B] # BALINESE LETTER ASYURA SASAK
+1B33  ; [.23DB.0020.0002.1B33] # BALINESE LETTER HA
+1B35  ; [.23DC.0020.0002.1B35] # BALINESE VOWEL SIGN TEDUNG
+1B36  ; [.23DD.0020.0002.1B36] # BALINESE VOWEL SIGN ULU
+1B37  ; [.23DE.0020.0002.1B37] # BALINESE VOWEL SIGN ULU SARI
+1B38  ; [.23DF.0020.0002.1B38] # BALINESE VOWEL SIGN SUKU
+1B39  ; [.23E0.0020.0002.1B39] # BALINESE VOWEL SIGN SUKU ILUT
+1B3A  ; [.23E1.0020.0002.1B3A] # BALINESE VOWEL SIGN RA REPA
+1B3B  ; [.23E2.0020.0002.1B3B] # BALINESE VOWEL SIGN RA REPA TEDUNG
+1B3A 1B35 ; [.23E2.0020.0002.1B3B] # BALINESE VOWEL SIGN RA REPA TEDUNG
+1B3C  ; [.23E3.0020.0002.1B3C] # BALINESE VOWEL SIGN LA LENGA
+1B3D  ; [.23E4.0020.0002.1B3D] # BALINESE VOWEL SIGN LA LENGA TEDUNG
+1B3C 1B35 ; [.23E4.0020.0002.1B3D] # BALINESE VOWEL SIGN LA LENGA TEDUNG
+1B3E  ; [.23E5.0020.0002.1B3E] # BALINESE VOWEL SIGN TALING
+1B3F  ; [.23E6.0020.0002.1B3F] # BALINESE VOWEL SIGN TALING REPA
+1B40  ; [.23E7.0020.0002.1B40] # BALINESE VOWEL SIGN TALING TEDUNG
+1B3E 1B35 ; [.23E7.0020.0002.1B40] # BALINESE VOWEL SIGN TALING TEDUNG
+1B41  ; [.23E8.0020.0002.1B41] # BALINESE VOWEL SIGN TALING REPA TEDUNG
+1B3F 1B35 ; [.23E8.0020.0002.1B41] # BALINESE VOWEL SIGN TALING REPA TEDUNG
+1B42  ; [.23E9.0020.0002.1B42] # BALINESE VOWEL SIGN PEPET
+1B43  ; [.23EA.0020.0002.1B43] # BALINESE VOWEL SIGN PEPET TEDUNG
+1B42 1B35 ; [.23EA.0020.0002.1B43] # BALINESE VOWEL SIGN PEPET TEDUNG
+1B44  ; [.23EB.0020.0002.1B44] # BALINESE ADEG ADEG
+A984  ; [.23EC.0020.0002.A984] # JAVANESE LETTER A
+A985  ; [.23ED.0020.0002.A985] # JAVANESE LETTER I KAWI
+A986  ; [.23EE.0020.0002.A986] # JAVANESE LETTER I
+A987  ; [.23EF.0020.0002.A987] # JAVANESE LETTER II
+A988  ; [.23F0.0020.0002.A988] # JAVANESE LETTER U
+A989  ; [.23F1.0020.0002.A989] # JAVANESE LETTER PA CEREK
+A98A  ; [.23F2.0020.0002.A98A] # JAVANESE LETTER NGA LELET
+A98B  ; [.23F3.0020.0002.A98B] # JAVANESE LETTER NGA LELET RASWADI
+A98C  ; [.23F4.0020.0002.A98C] # JAVANESE LETTER E
+A98D  ; [.23F5.0020.0002.A98D] # JAVANESE LETTER AI
+A98E  ; [.23F6.0020.0002.A98E] # JAVANESE LETTER O
+A98F  ; [.23F7.0020.0002.A98F] # JAVANESE LETTER KA
+A990  ; [.23F8.0020.0002.A990] # JAVANESE LETTER KA SASAK
+A991  ; [.23F9.0020.0002.A991] # JAVANESE LETTER KA MURDA
+A992  ; [.23FA.0020.0002.A992] # JAVANESE LETTER GA
+A993  ; [.23FB.0020.0002.A993] # JAVANESE LETTER GA MURDA
+A994  ; [.23FC.0020.0002.A994] # JAVANESE LETTER NGA
+A995  ; [.23FD.0020.0002.A995] # JAVANESE LETTER CA
+A996  ; [.23FE.0020.0002.A996] # JAVANESE LETTER CA MURDA
+A997  ; [.23FF.0020.0002.A997] # JAVANESE LETTER JA
+A998  ; [.2400.0020.0002.A998] # JAVANESE LETTER NYA MURDA
+A999  ; [.2401.0020.0002.A999] # JAVANESE LETTER JA MAHAPRANA
+A99A  ; [.2402.0020.0002.A99A] # JAVANESE LETTER NYA
+A99B  ; [.2403.0020.0002.A99B] # JAVANESE LETTER TTA
+A99C  ; [.2404.0020.0002.A99C] # JAVANESE LETTER TTA MAHAPRANA
+A99D  ; [.2405.0020.0002.A99D] # JAVANESE LETTER DDA
+A99E  ; [.2406.0020.0002.A99E] # JAVANESE LETTER DDA MAHAPRANA
+A99F  ; [.2407.0020.0002.A99F] # JAVANESE LETTER NA MURDA
+A9A0  ; [.2408.0020.0002.A9A0] # JAVANESE LETTER TA
+A9A1  ; [.2409.0020.0002.A9A1] # JAVANESE LETTER TA MURDA
+A9A2  ; [.240A.0020.0002.A9A2] # JAVANESE LETTER DA
+A9A3  ; [.240B.0020.0002.A9A3] # JAVANESE LETTER DA MAHAPRANA
+A9A4  ; [.240C.0020.0002.A9A4] # JAVANESE LETTER NA
+A9A5  ; [.240D.0020.0002.A9A5] # JAVANESE LETTER PA
+A9A6  ; [.240E.0020.0002.A9A6] # JAVANESE LETTER PA MURDA
+A9A7  ; [.240F.0020.0002.A9A7] # JAVANESE LETTER BA
+A9A8  ; [.2410.0020.0002.A9A8] # JAVANESE LETTER BA MURDA
+A9A9  ; [.2411.0020.0002.A9A9] # JAVANESE LETTER MA
+A9AA  ; [.2412.0020.0002.A9AA] # JAVANESE LETTER YA
+A9BE  ; [.2413.0020.0002.A9BE] # JAVANESE CONSONANT SIGN PENGKAL
+A9AB  ; [.2414.0020.0002.A9AB] # JAVANESE LETTER RA
+A9AC  ; [.2414.0020.0004.A9AC] # JAVANESE LETTER RA AGUNG; QQK
+A9BF  ; [.2415.0020.0002.A9BF] # JAVANESE CONSONANT SIGN CAKRA
+A9AD  ; [.2416.0020.0002.A9AD] # JAVANESE LETTER LA
+A9AE  ; [.2417.0020.0002.A9AE] # JAVANESE LETTER WA
+A9AF  ; [.2418.0020.0002.A9AF] # JAVANESE LETTER SA MURDA
+A9B0  ; [.2419.0020.0002.A9B0] # JAVANESE LETTER SA MAHAPRANA
+A9B1  ; [.241A.0020.0002.A9B1] # JAVANESE LETTER SA
+A9B2  ; [.241B.0020.0002.A9B2] # JAVANESE LETTER HA
+A9B4  ; [.241C.0020.0002.A9B4] # JAVANESE VOWEL SIGN TARUNG
+A9BC  ; [.241D.0020.0002.A9BC] # JAVANESE VOWEL SIGN PEPET
+A9B6  ; [.241E.0020.0002.A9B6] # JAVANESE VOWEL SIGN WULU
+A9B7  ; [.241F.0020.0002.A9B7] # JAVANESE VOWEL SIGN WULU MELIK
+A9B8  ; [.2420.0020.0002.A9B8] # JAVANESE VOWEL SIGN SUKU
+A9B9  ; [.2421.0020.0002.A9B9] # JAVANESE VOWEL SIGN SUKU MENDUT
+A9BD  ; [.2422.0020.0002.A9BD] # JAVANESE CONSONANT SIGN KERET
+A9BA  ; [.2423.0020.0002.A9BA] # JAVANESE VOWEL SIGN TALING
+A9BB  ; [.2424.0020.0002.A9BB] # JAVANESE VOWEL SIGN DIRGA MURE
+A9B5  ; [.2425.0020.0002.A9B5] # JAVANESE VOWEL SIGN TOLONG
+A9C0  ; [.2426.0020.0002.A9C0] # JAVANESE PANGKON
+1880  ; [.2427.0020.0002.1880] # MONGOLIAN LETTER ALI GALI ANUSVARA ONE
+1881  ; [.2428.0020.0002.1881] # MONGOLIAN LETTER ALI GALI VISARGA ONE
+1882  ; [.2429.0020.0002.1882] # MONGOLIAN LETTER ALI GALI DAMARU
+1883  ; [.242A.0020.0002.1883] # MONGOLIAN LETTER ALI GALI UBADAMA
+1884  ; [.242B.0020.0002.1884] # MONGOLIAN LETTER ALI GALI INVERTED UBADAMA
+1885  ; [.242C.0020.0002.1885] # MONGOLIAN LETTER ALI GALI BALUDA
+1886  ; [.242D.0020.0002.1886] # MONGOLIAN LETTER ALI GALI THREE BALUDA
+1843  ; [.242E.0020.0002.1843] # MONGOLIAN LETTER TODO LONG VOWEL SIGN
+1820  ; [.242F.0020.0002.1820] # MONGOLIAN LETTER A
+1887  ; [.2430.0020.0002.1887] # MONGOLIAN LETTER ALI GALI A
+1821  ; [.2431.0020.0002.1821] # MONGOLIAN LETTER E
+1844  ; [.2432.0020.0002.1844] # MONGOLIAN LETTER TODO E
+185D  ; [.2433.0020.0002.185D] # MONGOLIAN LETTER SIBE E
+1822  ; [.2434.0020.0002.1822] # MONGOLIAN LETTER I
+1845  ; [.2435.0020.0002.1845] # MONGOLIAN LETTER TODO I
+185E  ; [.2436.0020.0002.185E] # MONGOLIAN LETTER SIBE I
+1873  ; [.2437.0020.0002.1873] # MONGOLIAN LETTER MANCHU I
+1888  ; [.2438.0020.0002.1888] # MONGOLIAN LETTER ALI GALI I
+185F  ; [.2439.0020.0002.185F] # MONGOLIAN LETTER SIBE IY
+1823  ; [.243A.0020.0002.1823] # MONGOLIAN LETTER O
+1846  ; [.243B.0020.0002.1846] # MONGOLIAN LETTER TODO O
+1824  ; [.243C.0020.0002.1824] # MONGOLIAN LETTER U
+1847  ; [.243D.0020.0002.1847] # MONGOLIAN LETTER TODO U
+1861  ; [.243E.0020.0002.1861] # MONGOLIAN LETTER SIBE U
+1825  ; [.243F.0020.0002.1825] # MONGOLIAN LETTER OE
+1848  ; [.2440.0020.0002.1848] # MONGOLIAN LETTER TODO OE
+1826  ; [.2441.0020.0002.1826] # MONGOLIAN LETTER UE
+1849  ; [.2442.0020.0002.1849] # MONGOLIAN LETTER TODO UE
+1860  ; [.2443.0020.0002.1860] # MONGOLIAN LETTER SIBE UE
+1827  ; [.2444.0020.0002.1827] # MONGOLIAN LETTER EE
+1828  ; [.2445.0020.0002.1828] # MONGOLIAN LETTER NA
+1829  ; [.2446.0020.0002.1829] # MONGOLIAN LETTER ANG
+184A  ; [.2447.0020.0002.184A] # MONGOLIAN LETTER TODO ANG
+1862  ; [.2448.0020.0002.1862] # MONGOLIAN LETTER SIBE ANG
+188A  ; [.2449.0020.0002.188A] # MONGOLIAN LETTER ALI GALI NGA
+189B  ; [.244A.0020.0002.189B] # MONGOLIAN LETTER MANCHU ALI GALI NGA
+182A  ; [.244B.0020.0002.182A] # MONGOLIAN LETTER BA
+184B  ; [.244C.0020.0002.184B] # MONGOLIAN LETTER TODO BA
+182B  ; [.244D.0020.0002.182B] # MONGOLIAN LETTER PA
+184C  ; [.244E.0020.0002.184C] # MONGOLIAN LETTER TODO PA
+1866  ; [.244F.0020.0002.1866] # MONGOLIAN LETTER SIBE PA
+182C  ; [.2450.0020.0002.182C] # MONGOLIAN LETTER QA
+184D  ; [.2451.0020.0002.184D] # MONGOLIAN LETTER TODO QA
+182D  ; [.2452.0020.0002.182D] # MONGOLIAN LETTER GA
+184E  ; [.2453.0020.0002.184E] # MONGOLIAN LETTER TODO GA
+1864  ; [.2454.0020.0002.1864] # MONGOLIAN LETTER SIBE GA
+189A  ; [.2455.0020.0002.189A] # MONGOLIAN LETTER MANCHU ALI GALI GHA
+1865  ; [.2456.0020.0002.1865] # MONGOLIAN LETTER SIBE HA
+182E  ; [.2457.0020.0002.182E] # MONGOLIAN LETTER MA
+184F  ; [.2458.0020.0002.184F] # MONGOLIAN LETTER TODO MA
+182F  ; [.2459.0020.0002.182F] # MONGOLIAN LETTER LA
+1830  ; [.245A.0020.0002.1830] # MONGOLIAN LETTER SA
+1831  ; [.245B.0020.0002.1831] # MONGOLIAN LETTER SHA
+1867  ; [.245C.0020.0002.1867] # MONGOLIAN LETTER SIBE SHA
+189C  ; [.245D.0020.0002.189C] # MONGOLIAN LETTER MANCHU ALI GALI CA
+189D  ; [.245E.0020.0002.189D] # MONGOLIAN LETTER MANCHU ALI GALI JHA
+18A2  ; [.245F.0020.0002.18A2] # MONGOLIAN LETTER MANCHU ALI GALI SSA
+18A4  ; [.2460.0020.0002.18A4] # MONGOLIAN LETTER MANCHU ALI GALI ZHA
+18A5  ; [.2461.0020.0002.18A5] # MONGOLIAN LETTER MANCHU ALI GALI ZA
+1832  ; [.2462.0020.0002.1832] # MONGOLIAN LETTER TA
+1850  ; [.2463.0020.0002.1850] # MONGOLIAN LETTER TODO TA
+1868  ; [.2464.0020.0002.1868] # MONGOLIAN LETTER SIBE TA
+1833  ; [.2465.0020.0002.1833] # MONGOLIAN LETTER DA
+1851  ; [.2466.0020.0002.1851] # MONGOLIAN LETTER TODO DA
+1869  ; [.2467.0020.0002.1869] # MONGOLIAN LETTER SIBE DA
+1834  ; [.2468.0020.0002.1834] # MONGOLIAN LETTER CHA
+1852  ; [.2469.0020.0002.1852] # MONGOLIAN LETTER TODO CHA
+1871  ; [.246A.0020.0002.1871] # MONGOLIAN LETTER SIBE CHA
+185C  ; [.246B.0020.0002.185C] # MONGOLIAN LETTER TODO DZA
+188B  ; [.246C.0020.0002.188B] # MONGOLIAN LETTER ALI GALI CA
+1835  ; [.246D.0020.0002.1835] # MONGOLIAN LETTER JA
+1853  ; [.246E.0020.0002.1853] # MONGOLIAN LETTER TODO JA
+186A  ; [.246F.0020.0002.186A] # MONGOLIAN LETTER SIBE JA
+1877  ; [.2470.0020.0002.1877] # MONGOLIAN LETTER MANCHU ZHA
+1836  ; [.2471.0020.0002.1836] # MONGOLIAN LETTER YA
+1855  ; [.2472.0020.0002.1855] # MONGOLIAN LETTER TODO YA
+1872  ; [.2473.0020.0002.1872] # MONGOLIAN LETTER SIBE ZHA
+1837  ; [.2474.0020.0002.1837] # MONGOLIAN LETTER RA
+1875  ; [.2475.0020.0002.1875] # MONGOLIAN LETTER MANCHU RA
+1838  ; [.2476.0020.0002.1838] # MONGOLIAN LETTER WA
+1856  ; [.2477.0020.0002.1856] # MONGOLIAN LETTER TODO WA
+1839  ; [.2478.0020.0002.1839] # MONGOLIAN LETTER FA
+186B  ; [.2479.0020.0002.186B] # MONGOLIAN LETTER SIBE FA
+1876  ; [.247A.0020.0002.1876] # MONGOLIAN LETTER MANCHU FA
+183A  ; [.247B.0020.0002.183A] # MONGOLIAN LETTER KA
+1857  ; [.247C.0020.0002.1857] # MONGOLIAN LETTER TODO KA
+1863  ; [.247D.0020.0002.1863] # MONGOLIAN LETTER SIBE KA
+1874  ; [.247E.0020.0002.1874] # MONGOLIAN LETTER MANCHU KA
+1889  ; [.247F.0020.0002.1889] # MONGOLIAN LETTER ALI GALI KA
+183B  ; [.2480.0020.0002.183B] # MONGOLIAN LETTER KHA
+183C  ; [.2481.0020.0002.183C] # MONGOLIAN LETTER TSA
+1854  ; [.2482.0020.0002.1854] # MONGOLIAN LETTER TODO TSA
+186E  ; [.2483.0020.0002.186E] # MONGOLIAN LETTER SIBE TSA
+183D  ; [.2484.0020.0002.183D] # MONGOLIAN LETTER ZA
+186F  ; [.2485.0020.0002.186F] # MONGOLIAN LETTER SIBE ZA
+1858  ; [.2486.0020.0002.1858] # MONGOLIAN LETTER TODO GAA
+186C  ; [.2487.0020.0002.186C] # MONGOLIAN LETTER SIBE GAA
+183E  ; [.2488.0020.0002.183E] # MONGOLIAN LETTER HAA
+1859  ; [.2489.0020.0002.1859] # MONGOLIAN LETTER TODO HAA
+186D  ; [.248A.0020.0002.186D] # MONGOLIAN LETTER SIBE HAA
+183F  ; [.248B.0020.0002.183F] # MONGOLIAN LETTER ZRA
+1840  ; [.248C.0020.0002.1840] # MONGOLIAN LETTER LHA
+1841  ; [.248D.0020.0002.1841] # MONGOLIAN LETTER ZHI
+1842  ; [.248E.0020.0002.1842] # MONGOLIAN LETTER CHI
+185A  ; [.248F.0020.0002.185A] # MONGOLIAN LETTER TODO JIA
+185B  ; [.2490.0020.0002.185B] # MONGOLIAN LETTER TODO NIA
+1870  ; [.2491.0020.0002.1870] # MONGOLIAN LETTER SIBE RAA
+188C  ; [.2492.0020.0002.188C] # MONGOLIAN LETTER ALI GALI TTA
+189E  ; [.2493.0020.0002.189E] # MONGOLIAN LETTER MANCHU ALI GALI TTA
+188D  ; [.2494.0020.0002.188D] # MONGOLIAN LETTER ALI GALI TTHA
+188E  ; [.2495.0020.0002.188E] # MONGOLIAN LETTER ALI GALI DDA
+189F  ; [.2496.0020.0002.189F] # MONGOLIAN LETTER MANCHU ALI GALI DDHA
+188F  ; [.2497.0020.0002.188F] # MONGOLIAN LETTER ALI GALI NNA
+1890  ; [.2498.0020.0002.1890] # MONGOLIAN LETTER ALI GALI TA
+1898  ; [.2499.0020.0002.1898] # MONGOLIAN LETTER TODO ALI GALI TA
+18A0  ; [.249A.0020.0002.18A0] # MONGOLIAN LETTER MANCHU ALI GALI TA
+1891  ; [.249B.0020.0002.1891] # MONGOLIAN LETTER ALI GALI DA
+18A1  ; [.249C.0020.0002.18A1] # MONGOLIAN LETTER MANCHU ALI GALI DHA
+1892  ; [.249D.0020.0002.1892] # MONGOLIAN LETTER ALI GALI PA
+1893  ; [.249E.0020.0002.1893] # MONGOLIAN LETTER ALI GALI PHA
+18A8  ; [.249F.0020.0002.18A8] # MONGOLIAN LETTER MANCHU ALI GALI BHA
+1894  ; [.24A0.0020.0002.1894] # MONGOLIAN LETTER ALI GALI SSA
+18A3  ; [.24A1.0020.0002.18A3] # MONGOLIAN LETTER MANCHU ALI GALI CYA
+1895  ; [.24A2.0020.0002.1895] # MONGOLIAN LETTER ALI GALI ZHA
+1899  ; [.24A3.0020.0002.1899] # MONGOLIAN LETTER TODO ALI GALI ZHA
+1896  ; [.24A4.0020.0002.1896] # MONGOLIAN LETTER ALI GALI ZA
+1897  ; [.24A5.0020.0002.1897] # MONGOLIAN LETTER ALI GALI AH
+18A6  ; [.24A6.0020.0002.18A6] # MONGOLIAN LETTER ALI GALI HALF U
+18A7  ; [.24A7.0020.0002.18A7] # MONGOLIAN LETTER ALI GALI HALF YA
+18AA  ; [.24A8.0020.0002.18AA] # MONGOLIAN LETTER MANCHU ALI GALI LHA
+18A9  ; [.24A9.0020.0002.18A9] # MONGOLIAN LETTER ALI GALI DAGALGA
+1C5A  ; [.24AA.0020.0002.1C5A] # OL CHIKI LETTER LA
+1C5B  ; [.24AB.0020.0002.1C5B] # OL CHIKI LETTER AT
+1C5C  ; [.24AC.0020.0002.1C5C] # OL CHIKI LETTER AG
+1C5D  ; [.24AD.0020.0002.1C5D] # OL CHIKI LETTER ANG
+1C5E  ; [.24AE.0020.0002.1C5E] # OL CHIKI LETTER AL
+1C5F  ; [.24AF.0020.0002.1C5F] # OL CHIKI LETTER LAA
+1C60  ; [.24B0.0020.0002.1C60] # OL CHIKI LETTER AAK
+1C61  ; [.24B1.0020.0002.1C61] # OL CHIKI LETTER AAJ
+1C62  ; [.24B2.0020.0002.1C62] # OL CHIKI LETTER AAM
+1C63  ; [.24B3.0020.0002.1C63] # OL CHIKI LETTER AAW
+1C64  ; [.24B4.0020.0002.1C64] # OL CHIKI LETTER LI
+1C65  ; [.24B5.0020.0002.1C65] # OL CHIKI LETTER IS
+1C66  ; [.24B6.0020.0002.1C66] # OL CHIKI LETTER IH
+1C67  ; [.24B7.0020.0002.1C67] # OL CHIKI LETTER INY
+1C68  ; [.24B8.0020.0002.1C68] # OL CHIKI LETTER IR
+1C69  ; [.24B9.0020.0002.1C69] # OL CHIKI LETTER LU
+1C6A  ; [.24BA.0020.0002.1C6A] # OL CHIKI LETTER UC
+1C6B  ; [.24BB.0020.0002.1C6B] # OL CHIKI LETTER UD
+1C6C  ; [.24BC.0020.0002.1C6C] # OL CHIKI LETTER UNN
+1C6D  ; [.24BD.0020.0002.1C6D] # OL CHIKI LETTER UY
+1C6E  ; [.24BE.0020.0002.1C6E] # OL CHIKI LETTER LE
+1C6F  ; [.24BF.0020.0002.1C6F] # OL CHIKI LETTER EP
+1C70  ; [.24C0.0020.0002.1C70] # OL CHIKI LETTER EDD
+1C71  ; [.24C1.0020.0002.1C71] # OL CHIKI LETTER EN
+1C72  ; [.24C2.0020.0002.1C72] # OL CHIKI LETTER ERR
+1C73  ; [.24C3.0020.0002.1C73] # OL CHIKI LETTER LO
+1C74  ; [.24C4.0020.0002.1C74] # OL CHIKI LETTER OTT
+1C75  ; [.24C5.0020.0002.1C75] # OL CHIKI LETTER OB
+1C76  ; [.24C6.0020.0002.1C76] # OL CHIKI LETTER OV
+1C77  ; [.24C7.0020.0002.1C77] # OL CHIKI LETTER OH
+1C78  ; [.24C8.0020.0002.1C78] # OL CHIKI MU TTUDDAG
+1C79  ; [.24C9.0020.0002.1C79] # OL CHIKI GAAHLAA TTUDDAAG
+1C7A  ; [.24CA.0020.0002.1C7A] # OL CHIKI MU-GAAHLAA TTUDDAAG
+1C7B  ; [.24CB.0020.0002.1C7B] # OL CHIKI RELAA
+1C7C  ; [.24CC.0020.0002.1C7C] # OL CHIKI PHAARKAA
+1C7D  ; [.24CD.0020.0002.1C7D] # OL CHIKI AHAD
+13A0  ; [.24CE.0020.0002.13A0] # CHEROKEE LETTER A
+13A1  ; [.24CF.0020.0002.13A1] # CHEROKEE LETTER E
+13A2  ; [.24D0.0020.0002.13A2] # CHEROKEE LETTER I
+13A3  ; [.24D1.0020.0002.13A3] # CHEROKEE LETTER O
+13A4  ; [.24D2.0020.0002.13A4] # CHEROKEE LETTER U
+13A5  ; [.24D3.0020.0002.13A5] # CHEROKEE LETTER V
+13A6  ; [.24D4.0020.0002.13A6] # CHEROKEE LETTER GA
+13A7  ; [.24D5.0020.0002.13A7] # CHEROKEE LETTER KA
+13A8  ; [.24D6.0020.0002.13A8] # CHEROKEE LETTER GE
+13A9  ; [.24D7.0020.0002.13A9] # CHEROKEE LETTER GI
+13AA  ; [.24D8.0020.0002.13AA] # CHEROKEE LETTER GO
+13AB  ; [.24D9.0020.0002.13AB] # CHEROKEE LETTER GU
+13AC  ; [.24DA.0020.0002.13AC] # CHEROKEE LETTER GV
+13AD  ; [.24DB.0020.0002.13AD] # CHEROKEE LETTER HA
+13AE  ; [.24DC.0020.0002.13AE] # CHEROKEE LETTER HE
+13AF  ; [.24DD.0020.0002.13AF] # CHEROKEE LETTER HI
+13B0  ; [.24DE.0020.0002.13B0] # CHEROKEE LETTER HO
+13B1  ; [.24DF.0020.0002.13B1] # CHEROKEE LETTER HU
+13B2  ; [.24E0.0020.0002.13B2] # CHEROKEE LETTER HV
+13B3  ; [.24E1.0020.0002.13B3] # CHEROKEE LETTER LA
+13B4  ; [.24E2.0020.0002.13B4] # CHEROKEE LETTER LE
+13B5  ; [.24E3.0020.0002.13B5] # CHEROKEE LETTER LI
+13B6  ; [.24E4.0020.0002.13B6] # CHEROKEE LETTER LO
+13B7  ; [.24E5.0020.0002.13B7] # CHEROKEE LETTER LU
+13B8  ; [.24E6.0020.0002.13B8] # CHEROKEE LETTER LV
+13B9  ; [.24E7.0020.0002.13B9] # CHEROKEE LETTER MA
+13BA  ; [.24E8.0020.0002.13BA] # CHEROKEE LETTER ME
+13BB  ; [.24E9.0020.0002.13BB] # CHEROKEE LETTER MI
+13BC  ; [.24EA.0020.0002.13BC] # CHEROKEE LETTER MO
+13BD  ; [.24EB.0020.0002.13BD] # CHEROKEE LETTER MU
+13BE  ; [.24EC.0020.0002.13BE] # CHEROKEE LETTER NA
+13BF  ; [.24ED.0020.0002.13BF] # CHEROKEE LETTER HNA
+13C0  ; [.24EE.0020.0002.13C0] # CHEROKEE LETTER NAH
+13C1  ; [.24EF.0020.0002.13C1] # CHEROKEE LETTER NE
+13C2  ; [.24F0.0020.0002.13C2] # CHEROKEE LETTER NI
+13C3  ; [.24F1.0020.0002.13C3] # CHEROKEE LETTER NO
+13C4  ; [.24F2.0020.0002.13C4] # CHEROKEE LETTER NU
+13C5  ; [.24F3.0020.0002.13C5] # CHEROKEE LETTER NV
+13C6  ; [.24F4.0020.0002.13C6] # CHEROKEE LETTER QUA
+13C7  ; [.24F5.0020.0002.13C7] # CHEROKEE LETTER QUE
+13C8  ; [.24F6.0020.0002.13C8] # CHEROKEE LETTER QUI
+13C9  ; [.24F7.0020.0002.13C9] # CHEROKEE LETTER QUO
+13CA  ; [.24F8.0020.0002.13CA] # CHEROKEE LETTER QUU
+13CB  ; [.24F9.0020.0002.13CB] # CHEROKEE LETTER QUV
+13CC  ; [.24FA.0020.0002.13CC] # CHEROKEE LETTER SA
+13CD  ; [.24FB.0020.0002.13CD] # CHEROKEE LETTER S
+13CE  ; [.24FC.0020.0002.13CE] # CHEROKEE LETTER SE
+13CF  ; [.24FD.0020.0002.13CF] # CHEROKEE LETTER SI
+13D0  ; [.24FE.0020.0002.13D0] # CHEROKEE LETTER SO
+13D1  ; [.24FF.0020.0002.13D1] # CHEROKEE LETTER SU
+13D2  ; [.2500.0020.0002.13D2] # CHEROKEE LETTER SV
+13D3  ; [.2501.0020.0002.13D3] # CHEROKEE LETTER DA
+13D4  ; [.2502.0020.0002.13D4] # CHEROKEE LETTER TA
+13D5  ; [.2503.0020.0002.13D5] # CHEROKEE LETTER DE
+13D6  ; [.2504.0020.0002.13D6] # CHEROKEE LETTER TE
+13D7  ; [.2505.0020.0002.13D7] # CHEROKEE LETTER DI
+13D8  ; [.2506.0020.0002.13D8] # CHEROKEE LETTER TI
+13D9  ; [.2507.0020.0002.13D9] # CHEROKEE LETTER DO
+13DA  ; [.2508.0020.0002.13DA] # CHEROKEE LETTER DU
+13DB  ; [.2509.0020.0002.13DB] # CHEROKEE LETTER DV
+13DC  ; [.250A.0020.0002.13DC] # CHEROKEE LETTER DLA
+13DD  ; [.250B.0020.0002.13DD] # CHEROKEE LETTER TLA
+13DE  ; [.250C.0020.0002.13DE] # CHEROKEE LETTER TLE
+13DF  ; [.250D.0020.0002.13DF] # CHEROKEE LETTER TLI
+13E0  ; [.250E.0020.0002.13E0] # CHEROKEE LETTER TLO
+13E1  ; [.250F.0020.0002.13E1] # CHEROKEE LETTER TLU
+13E2  ; [.2510.0020.0002.13E2] # CHEROKEE LETTER TLV
+13E3  ; [.2511.0020.0002.13E3] # CHEROKEE LETTER TSA
+13E4  ; [.2512.0020.0002.13E4] # CHEROKEE LETTER TSE
+13E5  ; [.2513.0020.0002.13E5] # CHEROKEE LETTER TSI
+13E6  ; [.2514.0020.0002.13E6] # CHEROKEE LETTER TSO
+13E7  ; [.2515.0020.0002.13E7] # CHEROKEE LETTER TSU
+13E8  ; [.2516.0020.0002.13E8] # CHEROKEE LETTER TSV
+13E9  ; [.2517.0020.0002.13E9] # CHEROKEE LETTER WA
+13EA  ; [.2518.0020.0002.13EA] # CHEROKEE LETTER WE
+13EB  ; [.2519.0020.0002.13EB] # CHEROKEE LETTER WI
+13EC  ; [.251A.0020.0002.13EC] # CHEROKEE LETTER WO
+13ED  ; [.251B.0020.0002.13ED] # CHEROKEE LETTER WU
+13EE  ; [.251C.0020.0002.13EE] # CHEROKEE LETTER WV
+13EF  ; [.251D.0020.0002.13EF] # CHEROKEE LETTER YA
+13F0  ; [.251E.0020.0002.13F0] # CHEROKEE LETTER YE
+13F1  ; [.251F.0020.0002.13F1] # CHEROKEE LETTER YI
+13F2  ; [.2520.0020.0002.13F2] # CHEROKEE LETTER YO
+13F3  ; [.2521.0020.0002.13F3] # CHEROKEE LETTER YU
+13F4  ; [.2522.0020.0002.13F4] # CHEROKEE LETTER YV
+1401  ; [.2523.0020.0002.1401] # CANADIAN SYLLABICS E
+1402  ; [.2524.0020.0002.1402] # CANADIAN SYLLABICS AAI
+1403  ; [.2525.0020.0002.1403] # CANADIAN SYLLABICS I
+1404  ; [.2526.0020.0002.1404] # CANADIAN SYLLABICS II
+1405  ; [.2527.0020.0002.1405] # CANADIAN SYLLABICS O
+1406  ; [.2528.0020.0002.1406] # CANADIAN SYLLABICS OO
+1407  ; [.2529.0020.0002.1407] # CANADIAN SYLLABICS Y-CREE OO
+1408  ; [.252A.0020.0002.1408] # CANADIAN SYLLABICS CARRIER EE
+1409  ; [.252B.0020.0002.1409] # CANADIAN SYLLABICS CARRIER I
+140A  ; [.252C.0020.0002.140A] # CANADIAN SYLLABICS A
+140B  ; [.252D.0020.0002.140B] # CANADIAN SYLLABICS AA
+140C  ; [.252E.0020.0002.140C] # CANADIAN SYLLABICS WE
+140D  ; [.252F.0020.0002.140D] # CANADIAN SYLLABICS WEST-CREE WE
+140E  ; [.2530.0020.0002.140E] # CANADIAN SYLLABICS WI
+140F  ; [.2531.0020.0002.140F] # CANADIAN SYLLABICS WEST-CREE WI
+1410  ; [.2532.0020.0002.1410] # CANADIAN SYLLABICS WII
+1411  ; [.2533.0020.0002.1411] # CANADIAN SYLLABICS WEST-CREE WII
+1412  ; [.2534.0020.0002.1412] # CANADIAN SYLLABICS WO
+1413  ; [.2535.0020.0002.1413] # CANADIAN SYLLABICS WEST-CREE WO
+1414  ; [.2536.0020.0002.1414] # CANADIAN SYLLABICS WOO
+1415  ; [.2537.0020.0002.1415] # CANADIAN SYLLABICS WEST-CREE WOO
+1416  ; [.2538.0020.0002.1416] # CANADIAN SYLLABICS NASKAPI WOO
+1417  ; [.2539.0020.0002.1417] # CANADIAN SYLLABICS WA
+1418  ; [.253A.0020.0002.1418] # CANADIAN SYLLABICS WEST-CREE WA
+1419  ; [.253B.0020.0002.1419] # CANADIAN SYLLABICS WAA
+141A  ; [.253C.0020.0002.141A] # CANADIAN SYLLABICS WEST-CREE WAA
+141B  ; [.253D.0020.0002.141B] # CANADIAN SYLLABICS NASKAPI WAA
+141C  ; [.253E.0020.0002.141C] # CANADIAN SYLLABICS AI
+141D  ; [.253F.0020.0002.141D] # CANADIAN SYLLABICS Y-CREE W
+141E  ; [.2540.0020.0002.141E] # CANADIAN SYLLABICS GLOTTAL STOP
+141F  ; [.2541.0020.0002.141F] # CANADIAN SYLLABICS FINAL ACUTE
+1420  ; [.2542.0020.0002.1420] # CANADIAN SYLLABICS FINAL GRAVE
+1421  ; [.2543.0020.0002.1421] # CANADIAN SYLLABICS FINAL BOTTOM HALF RING
+1422  ; [.2544.0020.0002.1422] # CANADIAN SYLLABICS FINAL TOP HALF RING
+1423  ; [.2545.0020.0002.1423] # CANADIAN SYLLABICS FINAL RIGHT HALF RING
+1424  ; [.2546.0020.0002.1424] # CANADIAN SYLLABICS FINAL RING
+1425  ; [.2547.0020.0002.1425] # CANADIAN SYLLABICS FINAL DOUBLE ACUTE
+1426  ; [.2548.0020.0002.1426] # CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES
+1427  ; [.2549.0020.0002.1427] # CANADIAN SYLLABICS FINAL MIDDLE DOT
+1428  ; [.254A.0020.0002.1428] # CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE
+1429  ; [.254B.0020.0002.1429] # CANADIAN SYLLABICS FINAL PLUS
+142A  ; [.254C.0020.0002.142A] # CANADIAN SYLLABICS FINAL DOWN TACK
+142B  ; [.254D.0020.0002.142B] # CANADIAN SYLLABICS EN
+142C  ; [.254E.0020.0002.142C] # CANADIAN SYLLABICS IN
+142D  ; [.254F.0020.0002.142D] # CANADIAN SYLLABICS ON
+142E  ; [.2550.0020.0002.142E] # CANADIAN SYLLABICS AN
+142F  ; [.2551.0020.0002.142F] # CANADIAN SYLLABICS PE
+1430  ; [.2552.0020.0002.1430] # CANADIAN SYLLABICS PAAI
+1431  ; [.2553.0020.0002.1431] # CANADIAN SYLLABICS PI
+1432  ; [.2554.0020.0002.1432] # CANADIAN SYLLABICS PII
+1433  ; [.2555.0020.0002.1433] # CANADIAN SYLLABICS PO
+1434  ; [.2556.0020.0002.1434] # CANADIAN SYLLABICS POO
+1435  ; [.2557.0020.0002.1435] # CANADIAN SYLLABICS Y-CREE POO
+1436  ; [.2558.0020.0002.1436] # CANADIAN SYLLABICS CARRIER HEE
+1437  ; [.2559.0020.0002.1437] # CANADIAN SYLLABICS CARRIER HI
+1438  ; [.255A.0020.0002.1438] # CANADIAN SYLLABICS PA
+1439  ; [.255B.0020.0002.1439] # CANADIAN SYLLABICS PAA
+143A  ; [.255C.0020.0002.143A] # CANADIAN SYLLABICS PWE
+143B  ; [.255D.0020.0002.143B] # CANADIAN SYLLABICS WEST-CREE PWE
+143C  ; [.255E.0020.0002.143C] # CANADIAN SYLLABICS PWI
+143D  ; [.255F.0020.0002.143D] # CANADIAN SYLLABICS WEST-CREE PWI
+143E  ; [.2560.0020.0002.143E] # CANADIAN SYLLABICS PWII
+143F  ; [.2561.0020.0002.143F] # CANADIAN SYLLABICS WEST-CREE PWII
+1440  ; [.2562.0020.0002.1440] # CANADIAN SYLLABICS PWO
+1441  ; [.2563.0020.0002.1441] # CANADIAN SYLLABICS WEST-CREE PWO
+1442  ; [.2564.0020.0002.1442] # CANADIAN SYLLABICS PWOO
+1443  ; [.2565.0020.0002.1443] # CANADIAN SYLLABICS WEST-CREE PWOO
+1444  ; [.2566.0020.0002.1444] # CANADIAN SYLLABICS PWA
+1445  ; [.2567.0020.0002.1445] # CANADIAN SYLLABICS WEST-CREE PWA
+1446  ; [.2568.0020.0002.1446] # CANADIAN SYLLABICS PWAA
+1447  ; [.2569.0020.0002.1447] # CANADIAN SYLLABICS WEST-CREE PWAA
+1448  ; [.256A.0020.0002.1448] # CANADIAN SYLLABICS Y-CREE PWAA
+1449  ; [.256B.0020.0002.1449] # CANADIAN SYLLABICS P
+144A  ; [.256C.0020.0002.144A] # CANADIAN SYLLABICS WEST-CREE P
+144B  ; [.256D.0020.0002.144B] # CANADIAN SYLLABICS CARRIER H
+144C  ; [.256E.0020.0002.144C] # CANADIAN SYLLABICS TE
+144D  ; [.256F.0020.0002.144D] # CANADIAN SYLLABICS TAAI
+144E  ; [.2570.0020.0002.144E] # CANADIAN SYLLABICS TI
+144F  ; [.2571.0020.0002.144F] # CANADIAN SYLLABICS TII
+1450  ; [.2572.0020.0002.1450] # CANADIAN SYLLABICS TO
+1451  ; [.2573.0020.0002.1451] # CANADIAN SYLLABICS TOO
+1452  ; [.2574.0020.0002.1452] # CANADIAN SYLLABICS Y-CREE TOO
+1453  ; [.2575.0020.0002.1453] # CANADIAN SYLLABICS CARRIER DEE
+1454  ; [.2576.0020.0002.1454] # CANADIAN SYLLABICS CARRIER DI
+1455  ; [.2577.0020.0002.1455] # CANADIAN SYLLABICS TA
+1456  ; [.2578.0020.0002.1456] # CANADIAN SYLLABICS TAA
+1457  ; [.2579.0020.0002.1457] # CANADIAN SYLLABICS TWE
+1458  ; [.257A.0020.0002.1458] # CANADIAN SYLLABICS WEST-CREE TWE
+1459  ; [.257B.0020.0002.1459] # CANADIAN SYLLABICS TWI
+145A  ; [.257C.0020.0002.145A] # CANADIAN SYLLABICS WEST-CREE TWI
+145B  ; [.257D.0020.0002.145B] # CANADIAN SYLLABICS TWII
+145C  ; [.257E.0020.0002.145C] # CANADIAN SYLLABICS WEST-CREE TWII
+145D  ; [.257F.0020.0002.145D] # CANADIAN SYLLABICS TWO
+145E  ; [.2580.0020.0002.145E] # CANADIAN SYLLABICS WEST-CREE TWO
+145F  ; [.2581.0020.0002.145F] # CANADIAN SYLLABICS TWOO
+1460  ; [.2582.0020.0002.1460] # CANADIAN SYLLABICS WEST-CREE TWOO
+1461  ; [.2583.0020.0002.1461] # CANADIAN SYLLABICS TWA
+1462  ; [.2584.0020.0002.1462] # CANADIAN SYLLABICS WEST-CREE TWA
+1463  ; [.2585.0020.0002.1463] # CANADIAN SYLLABICS TWAA
+1464  ; [.2586.0020.0002.1464] # CANADIAN SYLLABICS WEST-CREE TWAA
+1465  ; [.2587.0020.0002.1465] # CANADIAN SYLLABICS NASKAPI TWAA
+1466  ; [.2588.0020.0002.1466] # CANADIAN SYLLABICS T
+1467  ; [.2589.0020.0002.1467] # CANADIAN SYLLABICS TTE
+1468  ; [.258A.0020.0002.1468] # CANADIAN SYLLABICS TTI
+1469  ; [.258B.0020.0002.1469] # CANADIAN SYLLABICS TTO
+146A  ; [.258C.0020.0002.146A] # CANADIAN SYLLABICS TTA
+146B  ; [.258D.0020.0002.146B] # CANADIAN SYLLABICS KE
+146C  ; [.258E.0020.0002.146C] # CANADIAN SYLLABICS KAAI
+146D  ; [.258F.0020.0002.146D] # CANADIAN SYLLABICS KI
+146E  ; [.2590.0020.0002.146E] # CANADIAN SYLLABICS KII
+146F  ; [.2591.0020.0002.146F] # CANADIAN SYLLABICS KO
+1470  ; [.2592.0020.0002.1470] # CANADIAN SYLLABICS KOO
+1471  ; [.2593.0020.0002.1471] # CANADIAN SYLLABICS Y-CREE KOO
+1472  ; [.2594.0020.0002.1472] # CANADIAN SYLLABICS KA
+1473  ; [.2595.0020.0002.1473] # CANADIAN SYLLABICS KAA
+1474  ; [.2596.0020.0002.1474] # CANADIAN SYLLABICS KWE
+1475  ; [.2597.0020.0002.1475] # CANADIAN SYLLABICS WEST-CREE KWE
+1476  ; [.2598.0020.0002.1476] # CANADIAN SYLLABICS KWI
+1477  ; [.2599.0020.0002.1477] # CANADIAN SYLLABICS WEST-CREE KWI
+1478  ; [.259A.0020.0002.1478] # CANADIAN SYLLABICS KWII
+1479  ; [.259B.0020.0002.1479] # CANADIAN SYLLABICS WEST-CREE KWII
+147A  ; [.259C.0020.0002.147A] # CANADIAN SYLLABICS KWO
+147B  ; [.259D.0020.0002.147B] # CANADIAN SYLLABICS WEST-CREE KWO
+147C  ; [.259E.0020.0002.147C] # CANADIAN SYLLABICS KWOO
+147D  ; [.259F.0020.0002.147D] # CANADIAN SYLLABICS WEST-CREE KWOO
+147E  ; [.25A0.0020.0002.147E] # CANADIAN SYLLABICS KWA
+147F  ; [.25A1.0020.0002.147F] # CANADIAN SYLLABICS WEST-CREE KWA
+1480  ; [.25A2.0020.0002.1480] # CANADIAN SYLLABICS KWAA
+1481  ; [.25A3.0020.0002.1481] # CANADIAN SYLLABICS WEST-CREE KWAA
+1482  ; [.25A4.0020.0002.1482] # CANADIAN SYLLABICS NASKAPI KWAA
+1483  ; [.25A5.0020.0002.1483] # CANADIAN SYLLABICS K
+1484  ; [.25A6.0020.0002.1484] # CANADIAN SYLLABICS KW
+1485  ; [.25A7.0020.0002.1485] # CANADIAN SYLLABICS SOUTH-SLAVEY KEH
+1486  ; [.25A8.0020.0002.1486] # CANADIAN SYLLABICS SOUTH-SLAVEY KIH
+1487  ; [.25A9.0020.0002.1487] # CANADIAN SYLLABICS SOUTH-SLAVEY KOH
+1488  ; [.25AA.0020.0002.1488] # CANADIAN SYLLABICS SOUTH-SLAVEY KAH
+1489  ; [.25AB.0020.0002.1489] # CANADIAN SYLLABICS CE
+148A  ; [.25AC.0020.0002.148A] # CANADIAN SYLLABICS CAAI
+148B  ; [.25AD.0020.0002.148B] # CANADIAN SYLLABICS CI
+148C  ; [.25AE.0020.0002.148C] # CANADIAN SYLLABICS CII
+148D  ; [.25AF.0020.0002.148D] # CANADIAN SYLLABICS CO
+148E  ; [.25B0.0020.0002.148E] # CANADIAN SYLLABICS COO
+148F  ; [.25B1.0020.0002.148F] # CANADIAN SYLLABICS Y-CREE COO
+1490  ; [.25B2.0020.0002.1490] # CANADIAN SYLLABICS CA
+1491  ; [.25B3.0020.0002.1491] # CANADIAN SYLLABICS CAA
+1492  ; [.25B4.0020.0002.1492] # CANADIAN SYLLABICS CWE
+1493  ; [.25B5.0020.0002.1493] # CANADIAN SYLLABICS WEST-CREE CWE
+1494  ; [.25B6.0020.0002.1494] # CANADIAN SYLLABICS CWI
+1495  ; [.25B7.0020.0002.1495] # CANADIAN SYLLABICS WEST-CREE CWI
+1496  ; [.25B8.0020.0002.1496] # CANADIAN SYLLABICS CWII
+1497  ; [.25B9.0020.0002.1497] # CANADIAN SYLLABICS WEST-CREE CWII
+1498  ; [.25BA.0020.0002.1498] # CANADIAN SYLLABICS CWO
+1499  ; [.25BB.0020.0002.1499] # CANADIAN SYLLABICS WEST-CREE CWO
+149A  ; [.25BC.0020.0002.149A] # CANADIAN SYLLABICS CWOO
+149B  ; [.25BD.0020.0002.149B] # CANADIAN SYLLABICS WEST-CREE CWOO
+149C  ; [.25BE.0020.0002.149C] # CANADIAN SYLLABICS CWA
+149D  ; [.25BF.0020.0002.149D] # CANADIAN SYLLABICS WEST-CREE CWA
+149E  ; [.25C0.0020.0002.149E] # CANADIAN SYLLABICS CWAA
+149F  ; [.25C1.0020.0002.149F] # CANADIAN SYLLABICS WEST-CREE CWAA
+14A0  ; [.25C2.0020.0002.14A0] # CANADIAN SYLLABICS NASKAPI CWAA
+14A1  ; [.25C3.0020.0002.14A1] # CANADIAN SYLLABICS C
+14A2  ; [.25C4.0020.0002.14A2] # CANADIAN SYLLABICS SAYISI TH
+14A3  ; [.25C5.0020.0002.14A3] # CANADIAN SYLLABICS ME
+14A4  ; [.25C6.0020.0002.14A4] # CANADIAN SYLLABICS MAAI
+14A5  ; [.25C7.0020.0002.14A5] # CANADIAN SYLLABICS MI
+14A6  ; [.25C8.0020.0002.14A6] # CANADIAN SYLLABICS MII
+14A7  ; [.25C9.0020.0002.14A7] # CANADIAN SYLLABICS MO
+14A8  ; [.25CA.0020.0002.14A8] # CANADIAN SYLLABICS MOO
+14A9  ; [.25CB.0020.0002.14A9] # CANADIAN SYLLABICS Y-CREE MOO
+14AA  ; [.25CC.0020.0002.14AA] # CANADIAN SYLLABICS MA
+14AB  ; [.25CD.0020.0002.14AB] # CANADIAN SYLLABICS MAA
+14AC  ; [.25CE.0020.0002.14AC] # CANADIAN SYLLABICS MWE
+14AD  ; [.25CF.0020.0002.14AD] # CANADIAN SYLLABICS WEST-CREE MWE
+14AE  ; [.25D0.0020.0002.14AE] # CANADIAN SYLLABICS MWI
+14AF  ; [.25D1.0020.0002.14AF] # CANADIAN SYLLABICS WEST-CREE MWI
+14B0  ; [.25D2.0020.0002.14B0] # CANADIAN SYLLABICS MWII
+14B1  ; [.25D3.0020.0002.14B1] # CANADIAN SYLLABICS WEST-CREE MWII
+14B2  ; [.25D4.0020.0002.14B2] # CANADIAN SYLLABICS MWO
+14B3  ; [.25D5.0020.0002.14B3] # CANADIAN SYLLABICS WEST-CREE MWO
+14B4  ; [.25D6.0020.0002.14B4] # CANADIAN SYLLABICS MWOO
+14B5  ; [.25D7.0020.0002.14B5] # CANADIAN SYLLABICS WEST-CREE MWOO
+14B6  ; [.25D8.0020.0002.14B6] # CANADIAN SYLLABICS MWA
+14B7  ; [.25D9.0020.0002.14B7] # CANADIAN SYLLABICS WEST-CREE MWA
+14B8  ; [.25DA.0020.0002.14B8] # CANADIAN SYLLABICS MWAA
+14B9  ; [.25DB.0020.0002.14B9] # CANADIAN SYLLABICS WEST-CREE MWAA
+14BA  ; [.25DC.0020.0002.14BA] # CANADIAN SYLLABICS NASKAPI MWAA
+14BB  ; [.25DD.0020.0002.14BB] # CANADIAN SYLLABICS M
+14BC  ; [.25DE.0020.0002.14BC] # CANADIAN SYLLABICS WEST-CREE M
+14BD  ; [.25DF.0020.0002.14BD] # CANADIAN SYLLABICS MH
+14BE  ; [.25E0.0020.0002.14BE] # CANADIAN SYLLABICS ATHAPASCAN M
+14BF  ; [.25E1.0020.0002.14BF] # CANADIAN SYLLABICS SAYISI M
+14C0  ; [.25E2.0020.0002.14C0] # CANADIAN SYLLABICS NE
+14C1  ; [.25E3.0020.0002.14C1] # CANADIAN SYLLABICS NAAI
+14C2  ; [.25E4.0020.0002.14C2] # CANADIAN SYLLABICS NI
+14C3  ; [.25E5.0020.0002.14C3] # CANADIAN SYLLABICS NII
+14C4  ; [.25E6.0020.0002.14C4] # CANADIAN SYLLABICS NO
+14C5  ; [.25E7.0020.0002.14C5] # CANADIAN SYLLABICS NOO
+14C6  ; [.25E8.0020.0002.14C6] # CANADIAN SYLLABICS Y-CREE NOO
+14C7  ; [.25E9.0020.0002.14C7] # CANADIAN SYLLABICS NA
+14C8  ; [.25EA.0020.0002.14C8] # CANADIAN SYLLABICS NAA
+14C9  ; [.25EB.0020.0002.14C9] # CANADIAN SYLLABICS NWE
+14CA  ; [.25EC.0020.0002.14CA] # CANADIAN SYLLABICS WEST-CREE NWE
+14CB  ; [.25ED.0020.0002.14CB] # CANADIAN SYLLABICS NWA
+14CC  ; [.25EE.0020.0002.14CC] # CANADIAN SYLLABICS WEST-CREE NWA
+14CD  ; [.25EF.0020.0002.14CD] # CANADIAN SYLLABICS NWAA
+14CE  ; [.25F0.0020.0002.14CE] # CANADIAN SYLLABICS WEST-CREE NWAA
+14CF  ; [.25F1.0020.0002.14CF] # CANADIAN SYLLABICS NASKAPI NWAA
+14D0  ; [.25F2.0020.0002.14D0] # CANADIAN SYLLABICS N
+14D1  ; [.25F3.0020.0002.14D1] # CANADIAN SYLLABICS CARRIER NG
+14D2  ; [.25F4.0020.0002.14D2] # CANADIAN SYLLABICS NH
+14D3  ; [.25F5.0020.0002.14D3] # CANADIAN SYLLABICS LE
+14D4  ; [.25F6.0020.0002.14D4] # CANADIAN SYLLABICS LAAI
+14D5  ; [.25F7.0020.0002.14D5] # CANADIAN SYLLABICS LI
+14D6  ; [.25F8.0020.0002.14D6] # CANADIAN SYLLABICS LII
+14D7  ; [.25F9.0020.0002.14D7] # CANADIAN SYLLABICS LO
+14D8  ; [.25FA.0020.0002.14D8] # CANADIAN SYLLABICS LOO
+14D9  ; [.25FB.0020.0002.14D9] # CANADIAN SYLLABICS Y-CREE LOO
+14DA  ; [.25FC.0020.0002.14DA] # CANADIAN SYLLABICS LA
+14DB  ; [.25FD.0020.0002.14DB] # CANADIAN SYLLABICS LAA
+14DC  ; [.25FE.0020.0002.14DC] # CANADIAN SYLLABICS LWE
+14DD  ; [.25FF.0020.0002.14DD] # CANADIAN SYLLABICS WEST-CREE LWE
+14DE  ; [.2600.0020.0002.14DE] # CANADIAN SYLLABICS LWI
+14DF  ; [.2601.0020.0002.14DF] # CANADIAN SYLLABICS WEST-CREE LWI
+14E0  ; [.2602.0020.0002.14E0] # CANADIAN SYLLABICS LWII
+14E1  ; [.2603.0020.0002.14E1] # CANADIAN SYLLABICS WEST-CREE LWII
+14E2  ; [.2604.0020.0002.14E2] # CANADIAN SYLLABICS LWO
+14E3  ; [.2605.0020.0002.14E3] # CANADIAN SYLLABICS WEST-CREE LWO
+14E4  ; [.2606.0020.0002.14E4] # CANADIAN SYLLABICS LWOO
+14E5  ; [.2607.0020.0002.14E5] # CANADIAN SYLLABICS WEST-CREE LWOO
+14E6  ; [.2608.0020.0002.14E6] # CANADIAN SYLLABICS LWA
+14E7  ; [.2609.0020.0002.14E7] # CANADIAN SYLLABICS WEST-CREE LWA
+14E8  ; [.260A.0020.0002.14E8] # CANADIAN SYLLABICS LWAA
+14E9  ; [.260B.0020.0002.14E9] # CANADIAN SYLLABICS WEST-CREE LWAA
+14EA  ; [.260C.0020.0002.14EA] # CANADIAN SYLLABICS L
+14EB  ; [.260D.0020.0002.14EB] # CANADIAN SYLLABICS WEST-CREE L
+14EC  ; [.260E.0020.0002.14EC] # CANADIAN SYLLABICS MEDIAL L
+14ED  ; [.260F.0020.0002.14ED] # CANADIAN SYLLABICS SE
+14EE  ; [.2610.0020.0002.14EE] # CANADIAN SYLLABICS SAAI
+14EF  ; [.2611.0020.0002.14EF] # CANADIAN SYLLABICS SI
+14F0  ; [.2612.0020.0002.14F0] # CANADIAN SYLLABICS SII
+14F1  ; [.2613.0020.0002.14F1] # CANADIAN SYLLABICS SO
+14F2  ; [.2614.0020.0002.14F2] # CANADIAN SYLLABICS SOO
+14F3  ; [.2615.0020.0002.14F3] # CANADIAN SYLLABICS Y-CREE SOO
+14F4  ; [.2616.0020.0002.14F4] # CANADIAN SYLLABICS SA
+14F5  ; [.2617.0020.0002.14F5] # CANADIAN SYLLABICS SAA
+14F6  ; [.2618.0020.0002.14F6] # CANADIAN SYLLABICS SWE
+14F7  ; [.2619.0020.0002.14F7] # CANADIAN SYLLABICS WEST-CREE SWE
+14F8  ; [.261A.0020.0002.14F8] # CANADIAN SYLLABICS SWI
+14F9  ; [.261B.0020.0002.14F9] # CANADIAN SYLLABICS WEST-CREE SWI
+14FA  ; [.261C.0020.0002.14FA] # CANADIAN SYLLABICS SWII
+14FB  ; [.261D.0020.0002.14FB] # CANADIAN SYLLABICS WEST-CREE SWII
+14FC  ; [.261E.0020.0002.14FC] # CANADIAN SYLLABICS SWO
+14FD  ; [.261F.0020.0002.14FD] # CANADIAN SYLLABICS WEST-CREE SWO
+14FE  ; [.2620.0020.0002.14FE] # CANADIAN SYLLABICS SWOO
+14FF  ; [.2621.0020.0002.14FF] # CANADIAN SYLLABICS WEST-CREE SWOO
+1500  ; [.2622.0020.0002.1500] # CANADIAN SYLLABICS SWA
+1501  ; [.2623.0020.0002.1501] # CANADIAN SYLLABICS WEST-CREE SWA
+1502  ; [.2624.0020.0002.1502] # CANADIAN SYLLABICS SWAA
+1503  ; [.2625.0020.0002.1503] # CANADIAN SYLLABICS WEST-CREE SWAA
+1504  ; [.2626.0020.0002.1504] # CANADIAN SYLLABICS NASKAPI SWAA
+1505  ; [.2627.0020.0002.1505] # CANADIAN SYLLABICS S
+1506  ; [.2628.0020.0002.1506] # CANADIAN SYLLABICS ATHAPASCAN S
+1507  ; [.2629.0020.0002.1507] # CANADIAN SYLLABICS SW
+1508  ; [.262A.0020.0002.1508] # CANADIAN SYLLABICS BLACKFOOT S
+1509  ; [.262B.0020.0002.1509] # CANADIAN SYLLABICS MOOSE-CREE SK
+150A  ; [.262C.0020.0002.150A] # CANADIAN SYLLABICS NASKAPI SKW
+150B  ; [.262D.0020.0002.150B] # CANADIAN SYLLABICS NASKAPI S-W
+150C  ; [.262E.0020.0002.150C] # CANADIAN SYLLABICS NASKAPI SPWA
+150D  ; [.262F.0020.0002.150D] # CANADIAN SYLLABICS NASKAPI STWA
+150E  ; [.2630.0020.0002.150E] # CANADIAN SYLLABICS NASKAPI SKWA
+150F  ; [.2631.0020.0002.150F] # CANADIAN SYLLABICS NASKAPI SCWA
+1510  ; [.2632.0020.0002.1510] # CANADIAN SYLLABICS SHE
+1511  ; [.2633.0020.0002.1511] # CANADIAN SYLLABICS SHI
+1512  ; [.2634.0020.0002.1512] # CANADIAN SYLLABICS SHII
+1513  ; [.2635.0020.0002.1513] # CANADIAN SYLLABICS SHO
+1514  ; [.2636.0020.0002.1514] # CANADIAN SYLLABICS SHOO
+1515  ; [.2637.0020.0002.1515] # CANADIAN SYLLABICS SHA
+1516  ; [.2638.0020.0002.1516] # CANADIAN SYLLABICS SHAA
+1517  ; [.2639.0020.0002.1517] # CANADIAN SYLLABICS SHWE
+1518  ; [.263A.0020.0002.1518] # CANADIAN SYLLABICS WEST-CREE SHWE
+1519  ; [.263B.0020.0002.1519] # CANADIAN SYLLABICS SHWI
+151A  ; [.263C.0020.0002.151A] # CANADIAN SYLLABICS WEST-CREE SHWI
+151B  ; [.263D.0020.0002.151B] # CANADIAN SYLLABICS SHWII
+151C  ; [.263E.0020.0002.151C] # CANADIAN SYLLABICS WEST-CREE SHWII
+151D  ; [.263F.0020.0002.151D] # CANADIAN SYLLABICS SHWO
+151E  ; [.2640.0020.0002.151E] # CANADIAN SYLLABICS WEST-CREE SHWO
+151F  ; [.2641.0020.0002.151F] # CANADIAN SYLLABICS SHWOO
+1520  ; [.2642.0020.0002.1520] # CANADIAN SYLLABICS WEST-CREE SHWOO
+1521  ; [.2643.0020.0002.1521] # CANADIAN SYLLABICS SHWA
+1522  ; [.2644.0020.0002.1522] # CANADIAN SYLLABICS WEST-CREE SHWA
+1523  ; [.2645.0020.0002.1523] # CANADIAN SYLLABICS SHWAA
+1524  ; [.2646.0020.0002.1524] # CANADIAN SYLLABICS WEST-CREE SHWAA
+1525  ; [.2647.0020.0002.1525] # CANADIAN SYLLABICS SH
+1526  ; [.2648.0020.0002.1526] # CANADIAN SYLLABICS YE
+1527  ; [.2649.0020.0002.1527] # CANADIAN SYLLABICS YAAI
+1528  ; [.264A.0020.0002.1528] # CANADIAN SYLLABICS YI
+1529  ; [.264B.0020.0002.1529] # CANADIAN SYLLABICS YII
+152A  ; [.264C.0020.0002.152A] # CANADIAN SYLLABICS YO
+152B  ; [.264D.0020.0002.152B] # CANADIAN SYLLABICS YOO
+152C  ; [.264E.0020.0002.152C] # CANADIAN SYLLABICS Y-CREE YOO
+152D  ; [.264F.0020.0002.152D] # CANADIAN SYLLABICS YA
+152E  ; [.2650.0020.0002.152E] # CANADIAN SYLLABICS YAA
+152F  ; [.2651.0020.0002.152F] # CANADIAN SYLLABICS YWE
+1530  ; [.2652.0020.0002.1530] # CANADIAN SYLLABICS WEST-CREE YWE
+1531  ; [.2653.0020.0002.1531] # CANADIAN SYLLABICS YWI
+1532  ; [.2654.0020.0002.1532] # CANADIAN SYLLABICS WEST-CREE YWI
+1533  ; [.2655.0020.0002.1533] # CANADIAN SYLLABICS YWII
+1534  ; [.2656.0020.0002.1534] # CANADIAN SYLLABICS WEST-CREE YWII
+1535  ; [.2657.0020.0002.1535] # CANADIAN SYLLABICS YWO
+1536  ; [.2658.0020.0002.1536] # CANADIAN SYLLABICS WEST-CREE YWO
+1537  ; [.2659.0020.0002.1537] # CANADIAN SYLLABICS YWOO
+1538  ; [.265A.0020.0002.1538] # CANADIAN SYLLABICS WEST-CREE YWOO
+1539  ; [.265B.0020.0002.1539] # CANADIAN SYLLABICS YWA
+153A  ; [.265C.0020.0002.153A] # CANADIAN SYLLABICS WEST-CREE YWA
+153B  ; [.265D.0020.0002.153B] # CANADIAN SYLLABICS YWAA
+153C  ; [.265E.0020.0002.153C] # CANADIAN SYLLABICS WEST-CREE YWAA
+153D  ; [.265F.0020.0002.153D] # CANADIAN SYLLABICS NASKAPI YWAA
+153E  ; [.2660.0020.0002.153E] # CANADIAN SYLLABICS Y
+153F  ; [.2661.0020.0002.153F] # CANADIAN SYLLABICS BIBLE-CREE Y
+1540  ; [.2662.0020.0002.1540] # CANADIAN SYLLABICS WEST-CREE Y
+1541  ; [.2663.0020.0002.1541] # CANADIAN SYLLABICS SAYISI YI
+1542  ; [.2664.0020.0002.1542] # CANADIAN SYLLABICS RE
+1543  ; [.2665.0020.0002.1543] # CANADIAN SYLLABICS R-CREE RE
+1544  ; [.2666.0020.0002.1544] # CANADIAN SYLLABICS WEST-CREE LE
+1545  ; [.2667.0020.0002.1545] # CANADIAN SYLLABICS RAAI
+1546  ; [.2668.0020.0002.1546] # CANADIAN SYLLABICS RI
+1547  ; [.2669.0020.0002.1547] # CANADIAN SYLLABICS RII
+1548  ; [.266A.0020.0002.1548] # CANADIAN SYLLABICS RO
+1549  ; [.266B.0020.0002.1549] # CANADIAN SYLLABICS ROO
+154A  ; [.266C.0020.0002.154A] # CANADIAN SYLLABICS WEST-CREE LO
+154B  ; [.266D.0020.0002.154B] # CANADIAN SYLLABICS RA
+154C  ; [.266E.0020.0002.154C] # CANADIAN SYLLABICS RAA
+154D  ; [.266F.0020.0002.154D] # CANADIAN SYLLABICS WEST-CREE LA
+154E  ; [.2670.0020.0002.154E] # CANADIAN SYLLABICS RWAA
+154F  ; [.2671.0020.0002.154F] # CANADIAN SYLLABICS WEST-CREE RWAA
+1550  ; [.2672.0020.0002.1550] # CANADIAN SYLLABICS R
+1551  ; [.2673.0020.0002.1551] # CANADIAN SYLLABICS WEST-CREE R
+1552  ; [.2674.0020.0002.1552] # CANADIAN SYLLABICS MEDIAL R
+1553  ; [.2675.0020.0002.1553] # CANADIAN SYLLABICS FE
+1554  ; [.2676.0020.0002.1554] # CANADIAN SYLLABICS FAAI
+1555  ; [.2677.0020.0002.1555] # CANADIAN SYLLABICS FI
+1556  ; [.2678.0020.0002.1556] # CANADIAN SYLLABICS FII
+1557  ; [.2679.0020.0002.1557] # CANADIAN SYLLABICS FO
+1558  ; [.267A.0020.0002.1558] # CANADIAN SYLLABICS FOO
+1559  ; [.267B.0020.0002.1559] # CANADIAN SYLLABICS FA
+155A  ; [.267C.0020.0002.155A] # CANADIAN SYLLABICS FAA
+155B  ; [.267D.0020.0002.155B] # CANADIAN SYLLABICS FWAA
+155C  ; [.267E.0020.0002.155C] # CANADIAN SYLLABICS WEST-CREE FWAA
+155D  ; [.267F.0020.0002.155D] # CANADIAN SYLLABICS F
+155E  ; [.2680.0020.0002.155E] # CANADIAN SYLLABICS THE
+155F  ; [.2681.0020.0002.155F] # CANADIAN SYLLABICS N-CREE THE
+1560  ; [.2682.0020.0002.1560] # CANADIAN SYLLABICS THI
+1561  ; [.2683.0020.0002.1561] # CANADIAN SYLLABICS N-CREE THI
+1562  ; [.2684.0020.0002.1562] # CANADIAN SYLLABICS THII
+1563  ; [.2685.0020.0002.1563] # CANADIAN SYLLABICS N-CREE THII
+1564  ; [.2686.0020.0002.1564] # CANADIAN SYLLABICS THO
+1565  ; [.2687.0020.0002.1565] # CANADIAN SYLLABICS THOO
+1566  ; [.2688.0020.0002.1566] # CANADIAN SYLLABICS THA
+1567  ; [.2689.0020.0002.1567] # CANADIAN SYLLABICS THAA
+1568  ; [.268A.0020.0002.1568] # CANADIAN SYLLABICS THWAA
+1569  ; [.268B.0020.0002.1569] # CANADIAN SYLLABICS WEST-CREE THWAA
+156A  ; [.268C.0020.0002.156A] # CANADIAN SYLLABICS TH
+156B  ; [.268D.0020.0002.156B] # CANADIAN SYLLABICS TTHE
+156C  ; [.268E.0020.0002.156C] # CANADIAN SYLLABICS TTHI
+156D  ; [.268F.0020.0002.156D] # CANADIAN SYLLABICS TTHO
+156E  ; [.2690.0020.0002.156E] # CANADIAN SYLLABICS TTHA
+156F  ; [.2691.0020.0002.156F] # CANADIAN SYLLABICS TTH
+1570  ; [.2692.0020.0002.1570] # CANADIAN SYLLABICS TYE
+1571  ; [.2693.0020.0002.1571] # CANADIAN SYLLABICS TYI
+1572  ; [.2694.0020.0002.1572] # CANADIAN SYLLABICS TYO
+1573  ; [.2695.0020.0002.1573] # CANADIAN SYLLABICS TYA
+1574  ; [.2696.0020.0002.1574] # CANADIAN SYLLABICS NUNAVIK HE
+1575  ; [.2697.0020.0002.1575] # CANADIAN SYLLABICS NUNAVIK HI
+1576  ; [.2698.0020.0002.1576] # CANADIAN SYLLABICS NUNAVIK HII
+1577  ; [.2699.0020.0002.1577] # CANADIAN SYLLABICS NUNAVIK HO
+1578  ; [.269A.0020.0002.1578] # CANADIAN SYLLABICS NUNAVIK HOO
+1579  ; [.269B.0020.0002.1579] # CANADIAN SYLLABICS NUNAVIK HA
+157A  ; [.269C.0020.0002.157A] # CANADIAN SYLLABICS NUNAVIK HAA
+157B  ; [.269D.0020.0002.157B] # CANADIAN SYLLABICS NUNAVIK H
+157D  ; [.269E.0020.0002.157D] # CANADIAN SYLLABICS HK
+166F  ; [.269F.0020.0002.166F] # CANADIAN SYLLABICS QAI
+157E  ; [.26A0.0020.0002.157E] # CANADIAN SYLLABICS QAAI
+157F  ; [.26A1.0020.0002.157F] # CANADIAN SYLLABICS QI
+1580  ; [.26A2.0020.0002.1580] # CANADIAN SYLLABICS QII
+1581  ; [.26A3.0020.0002.1581] # CANADIAN SYLLABICS QO
+1582  ; [.26A4.0020.0002.1582] # CANADIAN SYLLABICS QOO
+1583  ; [.26A5.0020.0002.1583] # CANADIAN SYLLABICS QA
+1584  ; [.26A6.0020.0002.1584] # CANADIAN SYLLABICS QAA
+1585  ; [.26A7.0020.0002.1585] # CANADIAN SYLLABICS Q
+1586  ; [.26A8.0020.0002.1586] # CANADIAN SYLLABICS TLHE
+1587  ; [.26A9.0020.0002.1587] # CANADIAN SYLLABICS TLHI
+1588  ; [.26AA.0020.0002.1588] # CANADIAN SYLLABICS TLHO
+1589  ; [.26AB.0020.0002.1589] # CANADIAN SYLLABICS TLHA
+158A  ; [.26AC.0020.0002.158A] # CANADIAN SYLLABICS WEST-CREE RE
+158B  ; [.26AD.0020.0002.158B] # CANADIAN SYLLABICS WEST-CREE RI
+158C  ; [.26AE.0020.0002.158C] # CANADIAN SYLLABICS WEST-CREE RO
+158D  ; [.26AF.0020.0002.158D] # CANADIAN SYLLABICS WEST-CREE RA
+1670  ; [.26B0.0020.0002.1670] # CANADIAN SYLLABICS NGAI
+158E  ; [.26B1.0020.0002.158E] # CANADIAN SYLLABICS NGAAI
+158F  ; [.26B2.0020.0002.158F] # CANADIAN SYLLABICS NGI
+1590  ; [.26B3.0020.0002.1590] # CANADIAN SYLLABICS NGII
+1591  ; [.26B4.0020.0002.1591] # CANADIAN SYLLABICS NGO
+1592  ; [.26B5.0020.0002.1592] # CANADIAN SYLLABICS NGOO
+1593  ; [.26B6.0020.0002.1593] # CANADIAN SYLLABICS NGA
+1594  ; [.26B7.0020.0002.1594] # CANADIAN SYLLABICS NGAA
+1595  ; [.26B8.0020.0002.1595] # CANADIAN SYLLABICS NG
+1671  ; [.26B9.0020.0002.1671] # CANADIAN SYLLABICS NNGI
+1672  ; [.26BA.0020.0002.1672] # CANADIAN SYLLABICS NNGII
+1673  ; [.26BB.0020.0002.1673] # CANADIAN SYLLABICS NNGO
+1674  ; [.26BC.0020.0002.1674] # CANADIAN SYLLABICS NNGOO
+1675  ; [.26BD.0020.0002.1675] # CANADIAN SYLLABICS NNGA
+1676  ; [.26BE.0020.0002.1676] # CANADIAN SYLLABICS NNGAA
+1596  ; [.26BF.0020.0002.1596] # CANADIAN SYLLABICS NNG
+1597  ; [.26C0.0020.0002.1597] # CANADIAN SYLLABICS SAYISI SHE
+1598  ; [.26C1.0020.0002.1598] # CANADIAN SYLLABICS SAYISI SHI
+1599  ; [.26C2.0020.0002.1599] # CANADIAN SYLLABICS SAYISI SHO
+159A  ; [.26C3.0020.0002.159A] # CANADIAN SYLLABICS SAYISI SHA
+159B  ; [.26C4.0020.0002.159B] # CANADIAN SYLLABICS WOODS-CREE THE
+159C  ; [.26C5.0020.0002.159C] # CANADIAN SYLLABICS WOODS-CREE THI
+159D  ; [.26C6.0020.0002.159D] # CANADIAN SYLLABICS WOODS-CREE THO
+159E  ; [.26C7.0020.0002.159E] # CANADIAN SYLLABICS WOODS-CREE THA
+159F  ; [.26C8.0020.0002.159F] # CANADIAN SYLLABICS WOODS-CREE TH
+15A0  ; [.26C9.0020.0002.15A0] # CANADIAN SYLLABICS LHI
+15A1  ; [.26CA.0020.0002.15A1] # CANADIAN SYLLABICS LHII
+15A2  ; [.26CB.0020.0002.15A2] # CANADIAN SYLLABICS LHO
+15A3  ; [.26CC.0020.0002.15A3] # CANADIAN SYLLABICS LHOO
+15A4  ; [.26CD.0020.0002.15A4] # CANADIAN SYLLABICS LHA
+15A5  ; [.26CE.0020.0002.15A5] # CANADIAN SYLLABICS LHAA
+15A6  ; [.26CF.0020.0002.15A6] # CANADIAN SYLLABICS LH
+157C  ; [.26D0.0020.0002.157C] # CANADIAN SYLLABICS NUNAVUT H
+15A7  ; [.26D1.0020.0002.15A7] # CANADIAN SYLLABICS TH-CREE THE
+15A8  ; [.26D2.0020.0002.15A8] # CANADIAN SYLLABICS TH-CREE THI
+15A9  ; [.26D3.0020.0002.15A9] # CANADIAN SYLLABICS TH-CREE THII
+15AA  ; [.26D4.0020.0002.15AA] # CANADIAN SYLLABICS TH-CREE THO
+15AB  ; [.26D5.0020.0002.15AB] # CANADIAN SYLLABICS TH-CREE THOO
+15AC  ; [.26D6.0020.0002.15AC] # CANADIAN SYLLABICS TH-CREE THA
+15AD  ; [.26D7.0020.0002.15AD] # CANADIAN SYLLABICS TH-CREE THAA
+15AE  ; [.26D8.0020.0002.15AE] # CANADIAN SYLLABICS TH-CREE TH
+15AF  ; [.26D9.0020.0002.15AF] # CANADIAN SYLLABICS AIVILIK B
+15B0  ; [.26DA.0020.0002.15B0] # CANADIAN SYLLABICS BLACKFOOT E
+15B1  ; [.26DB.0020.0002.15B1] # CANADIAN SYLLABICS BLACKFOOT I
+15B2  ; [.26DC.0020.0002.15B2] # CANADIAN SYLLABICS BLACKFOOT O
+15B3  ; [.26DD.0020.0002.15B3] # CANADIAN SYLLABICS BLACKFOOT A
+15B4  ; [.26DE.0020.0002.15B4] # CANADIAN SYLLABICS BLACKFOOT WE
+15B5  ; [.26DF.0020.0002.15B5] # CANADIAN SYLLABICS BLACKFOOT WI
+15B6  ; [.26E0.0020.0002.15B6] # CANADIAN SYLLABICS BLACKFOOT WO
+15B7  ; [.26E1.0020.0002.15B7] # CANADIAN SYLLABICS BLACKFOOT WA
+15B8  ; [.26E2.0020.0002.15B8] # CANADIAN SYLLABICS BLACKFOOT NE
+15B9  ; [.26E3.0020.0002.15B9] # CANADIAN SYLLABICS BLACKFOOT NI
+15BA  ; [.26E4.0020.0002.15BA] # CANADIAN SYLLABICS BLACKFOOT NO
+15BB  ; [.26E5.0020.0002.15BB] # CANADIAN SYLLABICS BLACKFOOT NA
+15BC  ; [.26E6.0020.0002.15BC] # CANADIAN SYLLABICS BLACKFOOT KE
+15BD  ; [.26E7.0020.0002.15BD] # CANADIAN SYLLABICS BLACKFOOT KI
+15BE  ; [.26E8.0020.0002.15BE] # CANADIAN SYLLABICS BLACKFOOT KO
+15BF  ; [.26E9.0020.0002.15BF] # CANADIAN SYLLABICS BLACKFOOT KA
+15C0  ; [.26EA.0020.0002.15C0] # CANADIAN SYLLABICS SAYISI HE
+15C1  ; [.26EB.0020.0002.15C1] # CANADIAN SYLLABICS SAYISI HI
+15C2  ; [.26EC.0020.0002.15C2] # CANADIAN SYLLABICS SAYISI HO
+15C3  ; [.26ED.0020.0002.15C3] # CANADIAN SYLLABICS SAYISI HA
+15C4  ; [.26EE.0020.0002.15C4] # CANADIAN SYLLABICS CARRIER GHU
+15C5  ; [.26EF.0020.0002.15C5] # CANADIAN SYLLABICS CARRIER GHO
+15C6  ; [.26F0.0020.0002.15C6] # CANADIAN SYLLABICS CARRIER GHE
+15C7  ; [.26F1.0020.0002.15C7] # CANADIAN SYLLABICS CARRIER GHEE
+15C8  ; [.26F2.0020.0002.15C8] # CANADIAN SYLLABICS CARRIER GHI
+15C9  ; [.26F3.0020.0002.15C9] # CANADIAN SYLLABICS CARRIER GHA
+15CA  ; [.26F4.0020.0002.15CA] # CANADIAN SYLLABICS CARRIER RU
+15CB  ; [.26F5.0020.0002.15CB] # CANADIAN SYLLABICS CARRIER RO
+15CC  ; [.26F6.0020.0002.15CC] # CANADIAN SYLLABICS CARRIER RE
+15CD  ; [.26F7.0020.0002.15CD] # CANADIAN SYLLABICS CARRIER REE
+15CE  ; [.26F8.0020.0002.15CE] # CANADIAN SYLLABICS CARRIER RI
+15CF  ; [.26F9.0020.0002.15CF] # CANADIAN SYLLABICS CARRIER RA
+15D0  ; [.26FA.0020.0002.15D0] # CANADIAN SYLLABICS CARRIER WU
+15D1  ; [.26FB.0020.0002.15D1] # CANADIAN SYLLABICS CARRIER WO
+15D2  ; [.26FC.0020.0002.15D2] # CANADIAN SYLLABICS CARRIER WE
+15D3  ; [.26FD.0020.0002.15D3] # CANADIAN SYLLABICS CARRIER WEE
+15D4  ; [.26FE.0020.0002.15D4] # CANADIAN SYLLABICS CARRIER WI
+15D5  ; [.26FF.0020.0002.15D5] # CANADIAN SYLLABICS CARRIER WA
+15D6  ; [.2700.0020.0002.15D6] # CANADIAN SYLLABICS CARRIER HWU
+15D7  ; [.2701.0020.0002.15D7] # CANADIAN SYLLABICS CARRIER HWO
+15D8  ; [.2702.0020.0002.15D8] # CANADIAN SYLLABICS CARRIER HWE
+15D9  ; [.2703.0020.0002.15D9] # CANADIAN SYLLABICS CARRIER HWEE
+15DA  ; [.2704.0020.0002.15DA] # CANADIAN SYLLABICS CARRIER HWI
+15DB  ; [.2705.0020.0002.15DB] # CANADIAN SYLLABICS CARRIER HWA
+15DC  ; [.2706.0020.0002.15DC] # CANADIAN SYLLABICS CARRIER THU
+15DD  ; [.2707.0020.0002.15DD] # CANADIAN SYLLABICS CARRIER THO
+15DE  ; [.2708.0020.0002.15DE] # CANADIAN SYLLABICS CARRIER THE
+15DF  ; [.2709.0020.0002.15DF] # CANADIAN SYLLABICS CARRIER THEE
+15E0  ; [.270A.0020.0002.15E0] # CANADIAN SYLLABICS CARRIER THI
+15E1  ; [.270B.0020.0002.15E1] # CANADIAN SYLLABICS CARRIER THA
+15E2  ; [.270C.0020.0002.15E2] # CANADIAN SYLLABICS CARRIER TTU
+15E3  ; [.270D.0020.0002.15E3] # CANADIAN SYLLABICS CARRIER TTO
+15E4  ; [.270E.0020.0002.15E4] # CANADIAN SYLLABICS CARRIER TTE
+15E5  ; [.270F.0020.0002.15E5] # CANADIAN SYLLABICS CARRIER TTEE
+15E6  ; [.2710.0020.0002.15E6] # CANADIAN SYLLABICS CARRIER TTI
+15E7  ; [.2711.0020.0002.15E7] # CANADIAN SYLLABICS CARRIER TTA
+15E8  ; [.2712.0020.0002.15E8] # CANADIAN SYLLABICS CARRIER PU
+15E9  ; [.2713.0020.0002.15E9] # CANADIAN SYLLABICS CARRIER PO
+15EA  ; [.2714.0020.0002.15EA] # CANADIAN SYLLABICS CARRIER PE
+15EB  ; [.2715.0020.0002.15EB] # CANADIAN SYLLABICS CARRIER PEE
+15EC  ; [.2716.0020.0002.15EC] # CANADIAN SYLLABICS CARRIER PI
+15ED  ; [.2717.0020.0002.15ED] # CANADIAN SYLLABICS CARRIER PA
+15EE  ; [.2718.0020.0002.15EE] # CANADIAN SYLLABICS CARRIER P
+15EF  ; [.2719.0020.0002.15EF] # CANADIAN SYLLABICS CARRIER GU
+15F0  ; [.271A.0020.0002.15F0] # CANADIAN SYLLABICS CARRIER GO
+15F1  ; [.271B.0020.0002.15F1] # CANADIAN SYLLABICS CARRIER GE
+15F2  ; [.271C.0020.0002.15F2] # CANADIAN SYLLABICS CARRIER GEE
+15F3  ; [.271D.0020.0002.15F3] # CANADIAN SYLLABICS CARRIER GI
+15F4  ; [.271E.0020.0002.15F4] # CANADIAN SYLLABICS CARRIER GA
+15F5  ; [.271F.0020.0002.15F5] # CANADIAN SYLLABICS CARRIER KHU
+15F6  ; [.2720.0020.0002.15F6] # CANADIAN SYLLABICS CARRIER KHO
+15F7  ; [.2721.0020.0002.15F7] # CANADIAN SYLLABICS CARRIER KHE
+15F8  ; [.2722.0020.0002.15F8] # CANADIAN SYLLABICS CARRIER KHEE
+15F9  ; [.2723.0020.0002.15F9] # CANADIAN SYLLABICS CARRIER KHI
+15FA  ; [.2724.0020.0002.15FA] # CANADIAN SYLLABICS CARRIER KHA
+15FB  ; [.2725.0020.0002.15FB] # CANADIAN SYLLABICS CARRIER KKU
+15FC  ; [.2726.0020.0002.15FC] # CANADIAN SYLLABICS CARRIER KKO
+15FD  ; [.2727.0020.0002.15FD] # CANADIAN SYLLABICS CARRIER KKE
+15FE  ; [.2728.0020.0002.15FE] # CANADIAN SYLLABICS CARRIER KKEE
+15FF  ; [.2729.0020.0002.15FF] # CANADIAN SYLLABICS CARRIER KKI
+1600  ; [.272A.0020.0002.1600] # CANADIAN SYLLABICS CARRIER KKA
+1601  ; [.272B.0020.0002.1601] # CANADIAN SYLLABICS CARRIER KK
+1602  ; [.272C.0020.0002.1602] # CANADIAN SYLLABICS CARRIER NU
+1603  ; [.272D.0020.0002.1603] # CANADIAN SYLLABICS CARRIER NO
+1604  ; [.272E.0020.0002.1604] # CANADIAN SYLLABICS CARRIER NE
+1605  ; [.272F.0020.0002.1605] # CANADIAN SYLLABICS CARRIER NEE
+1606  ; [.2730.0020.0002.1606] # CANADIAN SYLLABICS CARRIER NI
+1607  ; [.2731.0020.0002.1607] # CANADIAN SYLLABICS CARRIER NA
+1608  ; [.2732.0020.0002.1608] # CANADIAN SYLLABICS CARRIER MU
+1609  ; [.2733.0020.0002.1609] # CANADIAN SYLLABICS CARRIER MO
+160A  ; [.2734.0020.0002.160A] # CANADIAN SYLLABICS CARRIER ME
+160B  ; [.2735.0020.0002.160B] # CANADIAN SYLLABICS CARRIER MEE
+160C  ; [.2736.0020.0002.160C] # CANADIAN SYLLABICS CARRIER MI
+160D  ; [.2737.0020.0002.160D] # CANADIAN SYLLABICS CARRIER MA
+160E  ; [.2738.0020.0002.160E] # CANADIAN SYLLABICS CARRIER YU
+160F  ; [.2739.0020.0002.160F] # CANADIAN SYLLABICS CARRIER YO
+1610  ; [.273A.0020.0002.1610] # CANADIAN SYLLABICS CARRIER YE
+1611  ; [.273B.0020.0002.1611] # CANADIAN SYLLABICS CARRIER YEE
+1612  ; [.273C.0020.0002.1612] # CANADIAN SYLLABICS CARRIER YI
+1613  ; [.273D.0020.0002.1613] # CANADIAN SYLLABICS CARRIER YA
+1614  ; [.273E.0020.0002.1614] # CANADIAN SYLLABICS CARRIER JU
+1615  ; [.273F.0020.0002.1615] # CANADIAN SYLLABICS SAYISI JU
+1616  ; [.2740.0020.0002.1616] # CANADIAN SYLLABICS CARRIER JO
+1617  ; [.2741.0020.0002.1617] # CANADIAN SYLLABICS CARRIER JE
+1618  ; [.2742.0020.0002.1618] # CANADIAN SYLLABICS CARRIER JEE
+1619  ; [.2743.0020.0002.1619] # CANADIAN SYLLABICS CARRIER JI
+161A  ; [.2744.0020.0002.161A] # CANADIAN SYLLABICS SAYISI JI
+161B  ; [.2745.0020.0002.161B] # CANADIAN SYLLABICS CARRIER JA
+161C  ; [.2746.0020.0002.161C] # CANADIAN SYLLABICS CARRIER JJU
+161D  ; [.2747.0020.0002.161D] # CANADIAN SYLLABICS CARRIER JJO
+161E  ; [.2748.0020.0002.161E] # CANADIAN SYLLABICS CARRIER JJE
+161F  ; [.2749.0020.0002.161F] # CANADIAN SYLLABICS CARRIER JJEE
+1620  ; [.274A.0020.0002.1620] # CANADIAN SYLLABICS CARRIER JJI
+1621  ; [.274B.0020.0002.1621] # CANADIAN SYLLABICS CARRIER JJA
+1622  ; [.274C.0020.0002.1622] # CANADIAN SYLLABICS CARRIER LU
+1623  ; [.274D.0020.0002.1623] # CANADIAN SYLLABICS CARRIER LO
+1624  ; [.274E.0020.0002.1624] # CANADIAN SYLLABICS CARRIER LE
+1625  ; [.274F.0020.0002.1625] # CANADIAN SYLLABICS CARRIER LEE
+1626  ; [.2750.0020.0002.1626] # CANADIAN SYLLABICS CARRIER LI
+1627  ; [.2751.0020.0002.1627] # CANADIAN SYLLABICS CARRIER LA
+1628  ; [.2752.0020.0002.1628] # CANADIAN SYLLABICS CARRIER DLU
+1629  ; [.2753.0020.0002.1629] # CANADIAN SYLLABICS CARRIER DLO
+162A  ; [.2754.0020.0002.162A] # CANADIAN SYLLABICS CARRIER DLE
+162B  ; [.2755.0020.0002.162B] # CANADIAN SYLLABICS CARRIER DLEE
+162C  ; [.2756.0020.0002.162C] # CANADIAN SYLLABICS CARRIER DLI
+162D  ; [.2757.0020.0002.162D] # CANADIAN SYLLABICS CARRIER DLA
+162E  ; [.2758.0020.0002.162E] # CANADIAN SYLLABICS CARRIER LHU
+162F  ; [.2759.0020.0002.162F] # CANADIAN SYLLABICS CARRIER LHO
+1630  ; [.275A.0020.0002.1630] # CANADIAN SYLLABICS CARRIER LHE
+1631  ; [.275B.0020.0002.1631] # CANADIAN SYLLABICS CARRIER LHEE
+1632  ; [.275C.0020.0002.1632] # CANADIAN SYLLABICS CARRIER LHI
+1633  ; [.275D.0020.0002.1633] # CANADIAN SYLLABICS CARRIER LHA
+1634  ; [.275E.0020.0002.1634] # CANADIAN SYLLABICS CARRIER TLHU
+1635  ; [.275F.0020.0002.1635] # CANADIAN SYLLABICS CARRIER TLHO
+1636  ; [.2760.0020.0002.1636] # CANADIAN SYLLABICS CARRIER TLHE
+1637  ; [.2761.0020.0002.1637] # CANADIAN SYLLABICS CARRIER TLHEE
+1638  ; [.2762.0020.0002.1638] # CANADIAN SYLLABICS CARRIER TLHI
+1639  ; [.2763.0020.0002.1639] # CANADIAN SYLLABICS CARRIER TLHA
+163A  ; [.2764.0020.0002.163A] # CANADIAN SYLLABICS CARRIER TLU
+163B  ; [.2765.0020.0002.163B] # CANADIAN SYLLABICS CARRIER TLO
+163C  ; [.2766.0020.0002.163C] # CANADIAN SYLLABICS CARRIER TLE
+163D  ; [.2767.0020.0002.163D] # CANADIAN SYLLABICS CARRIER TLEE
+163E  ; [.2768.0020.0002.163E] # CANADIAN SYLLABICS CARRIER TLI
+163F  ; [.2769.0020.0002.163F] # CANADIAN SYLLABICS CARRIER TLA
+1640  ; [.276A.0020.0002.1640] # CANADIAN SYLLABICS CARRIER ZU
+1641  ; [.276B.0020.0002.1641] # CANADIAN SYLLABICS CARRIER ZO
+1642  ; [.276C.0020.0002.1642] # CANADIAN SYLLABICS CARRIER ZE
+1643  ; [.276D.0020.0002.1643] # CANADIAN SYLLABICS CARRIER ZEE
+1644  ; [.276E.0020.0002.1644] # CANADIAN SYLLABICS CARRIER ZI
+1645  ; [.276F.0020.0002.1645] # CANADIAN SYLLABICS CARRIER ZA
+1646  ; [.2770.0020.0002.1646] # CANADIAN SYLLABICS CARRIER Z
+1647  ; [.2771.0020.0002.1647] # CANADIAN SYLLABICS CARRIER INITIAL Z
+1648  ; [.2772.0020.0002.1648] # CANADIAN SYLLABICS CARRIER DZU
+1649  ; [.2773.0020.0002.1649] # CANADIAN SYLLABICS CARRIER DZO
+164A  ; [.2774.0020.0002.164A] # CANADIAN SYLLABICS CARRIER DZE
+164B  ; [.2775.0020.0002.164B] # CANADIAN SYLLABICS CARRIER DZEE
+164C  ; [.2776.0020.0002.164C] # CANADIAN SYLLABICS CARRIER DZI
+164D  ; [.2777.0020.0002.164D] # CANADIAN SYLLABICS CARRIER DZA
+164E  ; [.2778.0020.0002.164E] # CANADIAN SYLLABICS CARRIER SU
+164F  ; [.2779.0020.0002.164F] # CANADIAN SYLLABICS CARRIER SO
+1650  ; [.277A.0020.0002.1650] # CANADIAN SYLLABICS CARRIER SE
+1651  ; [.277B.0020.0002.1651] # CANADIAN SYLLABICS CARRIER SEE
+1652  ; [.277C.0020.0002.1652] # CANADIAN SYLLABICS CARRIER SI
+1653  ; [.277D.0020.0002.1653] # CANADIAN SYLLABICS CARRIER SA
+1654  ; [.277E.0020.0002.1654] # CANADIAN SYLLABICS CARRIER SHU
+1655  ; [.277F.0020.0002.1655] # CANADIAN SYLLABICS CARRIER SHO
+1656  ; [.2780.0020.0002.1656] # CANADIAN SYLLABICS CARRIER SHE
+1657  ; [.2781.0020.0002.1657] # CANADIAN SYLLABICS CARRIER SHEE
+1658  ; [.2782.0020.0002.1658] # CANADIAN SYLLABICS CARRIER SHI
+1659  ; [.2783.0020.0002.1659] # CANADIAN SYLLABICS CARRIER SHA
+165A  ; [.2784.0020.0002.165A] # CANADIAN SYLLABICS CARRIER SH
+165B  ; [.2785.0020.0002.165B] # CANADIAN SYLLABICS CARRIER TSU
+165C  ; [.2786.0020.0002.165C] # CANADIAN SYLLABICS CARRIER TSO
+165D  ; [.2787.0020.0002.165D] # CANADIAN SYLLABICS CARRIER TSE
+165E  ; [.2788.0020.0002.165E] # CANADIAN SYLLABICS CARRIER TSEE
+165F  ; [.2789.0020.0002.165F] # CANADIAN SYLLABICS CARRIER TSI
+1660  ; [.278A.0020.0002.1660] # CANADIAN SYLLABICS CARRIER TSA
+1661  ; [.278B.0020.0002.1661] # CANADIAN SYLLABICS CARRIER CHU
+1662  ; [.278C.0020.0002.1662] # CANADIAN SYLLABICS CARRIER CHO
+1663  ; [.278D.0020.0002.1663] # CANADIAN SYLLABICS CARRIER CHE
+1664  ; [.278E.0020.0002.1664] # CANADIAN SYLLABICS CARRIER CHEE
+1665  ; [.278F.0020.0002.1665] # CANADIAN SYLLABICS CARRIER CHI
+1666  ; [.2790.0020.0002.1666] # CANADIAN SYLLABICS CARRIER CHA
+1667  ; [.2791.0020.0002.1667] # CANADIAN SYLLABICS CARRIER TTSU
+1668  ; [.2792.0020.0002.1668] # CANADIAN SYLLABICS CARRIER TTSO
+1669  ; [.2793.0020.0002.1669] # CANADIAN SYLLABICS CARRIER TTSE
+166A  ; [.2794.0020.0002.166A] # CANADIAN SYLLABICS CARRIER TTSEE
+166B  ; [.2795.0020.0002.166B] # CANADIAN SYLLABICS CARRIER TTSI
+166C  ; [.2796.0020.0002.166C] # CANADIAN SYLLABICS CARRIER TTSA
+1677  ; [.2797.0020.0002.1677] # CANADIAN SYLLABICS WOODS-CREE THWEE
+1678  ; [.2798.0020.0002.1678] # CANADIAN SYLLABICS WOODS-CREE THWI
+1679  ; [.2799.0020.0002.1679] # CANADIAN SYLLABICS WOODS-CREE THWII
+167A  ; [.279A.0020.0002.167A] # CANADIAN SYLLABICS WOODS-CREE THWO
+167B  ; [.279B.0020.0002.167B] # CANADIAN SYLLABICS WOODS-CREE THWOO
+167C  ; [.279C.0020.0002.167C] # CANADIAN SYLLABICS WOODS-CREE THWA
+167D  ; [.279D.0020.0002.167D] # CANADIAN SYLLABICS WOODS-CREE THWAA
+167E  ; [.279E.0020.0002.167E] # CANADIAN SYLLABICS WOODS-CREE FINAL TH
+167F  ; [.279F.0020.0002.167F] # CANADIAN SYLLABICS BLACKFOOT W
+18B0  ; [.27A0.0020.0002.18B0] # CANADIAN SYLLABICS OY
+18B1  ; [.27A1.0020.0002.18B1] # CANADIAN SYLLABICS AY
+18B2  ; [.27A2.0020.0002.18B2] # CANADIAN SYLLABICS AAY
+18B3  ; [.27A3.0020.0002.18B3] # CANADIAN SYLLABICS WAY
+18B4  ; [.27A4.0020.0002.18B4] # CANADIAN SYLLABICS POY
+18B5  ; [.27A5.0020.0002.18B5] # CANADIAN SYLLABICS PAY
+18B6  ; [.27A6.0020.0002.18B6] # CANADIAN SYLLABICS PWOY
+18B7  ; [.27A7.0020.0002.18B7] # CANADIAN SYLLABICS TAY
+18B8  ; [.27A8.0020.0002.18B8] # CANADIAN SYLLABICS KAY
+18B9  ; [.27A9.0020.0002.18B9] # CANADIAN SYLLABICS KWAY
+18BA  ; [.27AA.0020.0002.18BA] # CANADIAN SYLLABICS MAY
+18BB  ; [.27AB.0020.0002.18BB] # CANADIAN SYLLABICS NOY
+18BC  ; [.27AC.0020.0002.18BC] # CANADIAN SYLLABICS NAY
+18BD  ; [.27AD.0020.0002.18BD] # CANADIAN SYLLABICS LAY
+18BE  ; [.27AE.0020.0002.18BE] # CANADIAN SYLLABICS SOY
+18BF  ; [.27AF.0020.0002.18BF] # CANADIAN SYLLABICS SAY
+18C0  ; [.27B0.0020.0002.18C0] # CANADIAN SYLLABICS SHOY
+18C1  ; [.27B1.0020.0002.18C1] # CANADIAN SYLLABICS SHAY
+18C2  ; [.27B2.0020.0002.18C2] # CANADIAN SYLLABICS SHWOY
+18C3  ; [.27B3.0020.0002.18C3] # CANADIAN SYLLABICS YOY
+18C4  ; [.27B4.0020.0002.18C4] # CANADIAN SYLLABICS YAY
+18C5  ; [.27B5.0020.0002.18C5] # CANADIAN SYLLABICS RAY
+18C6  ; [.27B6.0020.0002.18C6] # CANADIAN SYLLABICS NWI
+18C7  ; [.27B7.0020.0002.18C7] # CANADIAN SYLLABICS OJIBWAY NWI
+18C8  ; [.27B8.0020.0002.18C8] # CANADIAN SYLLABICS NWII
+18C9  ; [.27B9.0020.0002.18C9] # CANADIAN SYLLABICS OJIBWAY NWII
+18CA  ; [.27BA.0020.0002.18CA] # CANADIAN SYLLABICS NWO
+18CB  ; [.27BB.0020.0002.18CB] # CANADIAN SYLLABICS OJIBWAY NWO
+18CC  ; [.27BC.0020.0002.18CC] # CANADIAN SYLLABICS NWOO
+18CD  ; [.27BD.0020.0002.18CD] # CANADIAN SYLLABICS OJIBWAY NWOO
+18CE  ; [.27BE.0020.0002.18CE] # CANADIAN SYLLABICS RWEE
+18CF  ; [.27BF.0020.0002.18CF] # CANADIAN SYLLABICS RWI
+18D0  ; [.27C0.0020.0002.18D0] # CANADIAN SYLLABICS RWII
+18D1  ; [.27C1.0020.0002.18D1] # CANADIAN SYLLABICS RWO
+18D2  ; [.27C2.0020.0002.18D2] # CANADIAN SYLLABICS RWOO
+18D3  ; [.27C3.0020.0002.18D3] # CANADIAN SYLLABICS RWA
+18D4  ; [.27C4.0020.0002.18D4] # CANADIAN SYLLABICS OJIBWAY P
+18D5  ; [.27C5.0020.0002.18D5] # CANADIAN SYLLABICS OJIBWAY T
+18D6  ; [.27C6.0020.0002.18D6] # CANADIAN SYLLABICS OJIBWAY K
+18D7  ; [.27C7.0020.0002.18D7] # CANADIAN SYLLABICS OJIBWAY C
+18D8  ; [.27C8.0020.0002.18D8] # CANADIAN SYLLABICS OJIBWAY M
+18D9  ; [.27C9.0020.0002.18D9] # CANADIAN SYLLABICS OJIBWAY N
+18DA  ; [.27CA.0020.0002.18DA] # CANADIAN SYLLABICS OJIBWAY S
+18DB  ; [.27CB.0020.0002.18DB] # CANADIAN SYLLABICS OJIBWAY SH
+18DC  ; [.27CC.0020.0002.18DC] # CANADIAN SYLLABICS EASTERN W
+18DD  ; [.27CD.0020.0002.18DD] # CANADIAN SYLLABICS WESTERN W
+18DE  ; [.27CE.0020.0002.18DE] # CANADIAN SYLLABICS FINAL SMALL RING
+18DF  ; [.27CF.0020.0002.18DF] # CANADIAN SYLLABICS FINAL RAISED DOT
+18E0  ; [.27D0.0020.0002.18E0] # CANADIAN SYLLABICS R-CREE RWE
+18E1  ; [.27D1.0020.0002.18E1] # CANADIAN SYLLABICS WEST-CREE LOO
+18E2  ; [.27D2.0020.0002.18E2] # CANADIAN SYLLABICS WEST-CREE LAA
+18E3  ; [.27D3.0020.0002.18E3] # CANADIAN SYLLABICS THWE
+18E4  ; [.27D4.0020.0002.18E4] # CANADIAN SYLLABICS THWA
+18E5  ; [.27D5.0020.0002.18E5] # CANADIAN SYLLABICS TTHWE
+18E6  ; [.27D6.0020.0002.18E6] # CANADIAN SYLLABICS TTHOO
+18E7  ; [.27D7.0020.0002.18E7] # CANADIAN SYLLABICS TTHAA
+18E8  ; [.27D8.0020.0002.18E8] # CANADIAN SYLLABICS TLHWE
+18E9  ; [.27D9.0020.0002.18E9] # CANADIAN SYLLABICS TLHOO
+18EA  ; [.27DA.0020.0002.18EA] # CANADIAN SYLLABICS SAYISI SHWE
+18EB  ; [.27DB.0020.0002.18EB] # CANADIAN SYLLABICS SAYISI SHOO
+18EC  ; [.27DC.0020.0002.18EC] # CANADIAN SYLLABICS SAYISI HOO
+18ED  ; [.27DD.0020.0002.18ED] # CANADIAN SYLLABICS CARRIER GWU
+18EE  ; [.27DE.0020.0002.18EE] # CANADIAN SYLLABICS CARRIER DENE GEE
+18EF  ; [.27DF.0020.0002.18EF] # CANADIAN SYLLABICS CARRIER GAA
+18F0  ; [.27E0.0020.0002.18F0] # CANADIAN SYLLABICS CARRIER GWA
+18F1  ; [.27E1.0020.0002.18F1] # CANADIAN SYLLABICS SAYISI JUU
+18F2  ; [.27E2.0020.0002.18F2] # CANADIAN SYLLABICS CARRIER JWA
+18F3  ; [.27E3.0020.0002.18F3] # CANADIAN SYLLABICS BEAVER DENE L
+18F4  ; [.27E4.0020.0002.18F4] # CANADIAN SYLLABICS BEAVER DENE R
+18F5  ; [.27E5.0020.0002.18F5] # CANADIAN SYLLABICS CARRIER DENTAL S
+1681  ; [.27E6.0020.0002.1681] # OGHAM LETTER BEITH
+1682  ; [.27E7.0020.0002.1682] # OGHAM LETTER LUIS
+1683  ; [.27E8.0020.0002.1683] # OGHAM LETTER FEARN
+1684  ; [.27E9.0020.0002.1684] # OGHAM LETTER SAIL
+1685  ; [.27EA.0020.0002.1685] # OGHAM LETTER NION
+1686  ; [.27EB.0020.0002.1686] # OGHAM LETTER UATH
+1687  ; [.27EC.0020.0002.1687] # OGHAM LETTER DAIR
+1688  ; [.27ED.0020.0002.1688] # OGHAM LETTER TINNE
+1689  ; [.27EE.0020.0002.1689] # OGHAM LETTER COLL
+168A  ; [.27EF.0020.0002.168A] # OGHAM LETTER CEIRT
+168B  ; [.27F0.0020.0002.168B] # OGHAM LETTER MUIN
+168C  ; [.27F1.0020.0002.168C] # OGHAM LETTER GORT
+168D  ; [.27F2.0020.0002.168D] # OGHAM LETTER NGEADAL
+168E  ; [.27F3.0020.0002.168E] # OGHAM LETTER STRAIF
+168F  ; [.27F4.0020.0002.168F] # OGHAM LETTER RUIS
+1690  ; [.27F5.0020.0002.1690] # OGHAM LETTER AILM
+1691  ; [.27F6.0020.0002.1691] # OGHAM LETTER ONN
+1692  ; [.27F7.0020.0002.1692] # OGHAM LETTER UR
+1693  ; [.27F8.0020.0002.1693] # OGHAM LETTER EADHADH
+1694  ; [.27F9.0020.0002.1694] # OGHAM LETTER IODHADH
+1695  ; [.27FA.0020.0002.1695] # OGHAM LETTER EABHADH
+1696  ; [.27FB.0020.0002.1696] # OGHAM LETTER OR
+1697  ; [.27FC.0020.0002.1697] # OGHAM LETTER UILLEANN
+1698  ; [.27FD.0020.0002.1698] # OGHAM LETTER IFIN
+1699  ; [.27FE.0020.0002.1699] # OGHAM LETTER EAMHANCHOLL
+169A  ; [.27FF.0020.0002.169A] # OGHAM LETTER PEITH
+16A0  ; [.2800.0020.0002.16A0] # RUNIC LETTER FEHU FEOH FE F
+16A1  ; [.2800.0020.0004.16A1][.0000.0159.0004.16A1] # RUNIC LETTER V; QQKN
+16A2  ; [.2801.0020.0002.16A2] # RUNIC LETTER URUZ UR U
+16A4  ; [.2801.0020.0004.16A4][.0000.0159.0004.16A4] # RUNIC LETTER Y; QQKN
+16A5  ; [.2801.0020.0004.16A5][.0000.015A.0004.16A5] # RUNIC LETTER W; QQKN
+16A6  ; [.2802.0020.0002.16A6] # RUNIC LETTER THURISAZ THURS THORN
+16A7  ; [.2802.0020.0004.16A7][.0000.0159.0004.16A7] # RUNIC LETTER ETH; QQKN
+16F0  ; [.2802.0020.0004.16F0][.2802.0020.0004.16F0] # RUNIC BELGTHOR SYMBOL; QQKN
+16A8  ; [.2803.0020.0002.16A8] # RUNIC LETTER ANSUZ A
+16A9  ; [.2803.0020.0004.16A9][.0000.0159.0004.16A9] # RUNIC LETTER OS O; QQKN
+16AC  ; [.2803.0020.0004.16AC][.0000.015A.0004.16AC] # RUNIC LETTER LONG-BRANCH-OSS O; QQKN
+16AD  ; [.2803.0020.0004.16AD][.0000.015C.0004.16AD] # RUNIC LETTER SHORT-TWIG-OSS O; QQKN
+16AE  ; [.2803.0020.0004.16AE][.0000.015D.0004.16AE] # RUNIC LETTER O; QQKN
+16AF  ; [.2804.0020.0002.16AF] # RUNIC LETTER OE
+16B0  ; [.2805.0020.0002.16B0] # RUNIC LETTER ON
+16B1  ; [.2806.0020.0002.16B1] # RUNIC LETTER RAIDO RAD REID R
+16B2  ; [.2807.0020.0002.16B2] # RUNIC LETTER KAUNA
+16B3  ; [.2807.0020.0004.16B3][.0000.0159.0004.16B3] # RUNIC LETTER CEN; QQKN
+16B4  ; [.2807.0020.0004.16B4][.0000.015A.0004.16B4] # RUNIC LETTER KAUN K; QQKN
+16B5  ; [.2807.0020.0004.16B5][.0000.015C.0004.16B5] # RUNIC LETTER G; QQKN
+16B6  ; [.2807.0020.0004.16B6][.0000.015D.0004.16B6] # RUNIC LETTER ENG; QQKN
+16B7  ; [.2808.0020.0002.16B7] # RUNIC LETTER GEBO GYFU G
+16B9  ; [.2809.0020.0002.16B9] # RUNIC LETTER WUNJO WYNN W
+16E9  ; [.2809.0020.0004.16E9][.0000.0159.0004.16E9] # RUNIC LETTER Q; QQKN
+16BA  ; [.280A.0020.0002.16BA] # RUNIC LETTER HAGLAZ H
+16BB  ; [.280A.0020.0004.16BB][.0000.0159.0004.16BB] # RUNIC LETTER HAEGL H; QQKN
+16BC  ; [.280A.0020.0004.16BC][.0000.015A.0004.16BC] # RUNIC LETTER LONG-BRANCH-HAGALL H; QQKN
+16BD  ; [.280A.0020.0004.16BD][.0000.015C.0004.16BD] # RUNIC LETTER SHORT-TWIG-HAGALL H; QQKN
+16BE  ; [.280B.0020.0002.16BE] # RUNIC LETTER NAUDIZ NYD NAUD N
+16BF  ; [.280B.0020.0004.16BF][.0000.0159.0004.16BF] # RUNIC LETTER SHORT-TWIG-NAUD N; QQKN
+16C0  ; [.280B.0020.0004.16C0][.0000.015A.0004.16C0] # RUNIC LETTER DOTTED-N; QQKN
+16C1  ; [.280C.0020.0002.16C1] # RUNIC LETTER ISAZ IS ISS I
+16C2  ; [.280C.0020.0004.16C2][.0000.0159.0004.16C2] # RUNIC LETTER E; QQKN
+16C3  ; [.280D.0020.0002.16C3] # RUNIC LETTER JERAN J
+16C4  ; [.280D.0020.0004.16C4][.0000.0159.0004.16C4] # RUNIC LETTER GER; QQKN
+16C5  ; [.280E.0020.0002.16C5] # RUNIC LETTER LONG-BRANCH-AR AE
+16C6  ; [.280E.0020.0004.16C6][.0000.0159.0004.16C6] # RUNIC LETTER SHORT-TWIG-AR A; QQKN
+16EE  ; [.280E.0020.0004.16EE][.2817.0020.0004.16EE] # RUNIC ARLAUG SYMBOL; QQKN
+16C7  ; [.280F.0020.0002.16C7] # RUNIC LETTER IWAZ EOH
+16C8  ; [.2810.0020.0002.16C8] # RUNIC LETTER PERTHO PEORTH P
+16D5  ; [.2810.0020.0004.16D5][.0000.0159.0004.16D5] # RUNIC LETTER OPEN-P; QQKN
+16C9  ; [.2811.0020.0002.16C9] # RUNIC LETTER ALGIZ EOLHX
+16CA  ; [.2812.0020.0002.16CA] # RUNIC LETTER SOWILO S
+16CB  ; [.2812.0020.0004.16CB][.0000.0159.0004.16CB] # RUNIC LETTER SIGEL LONG-BRANCH-SOL S; QQKN
+16EA  ; [.2812.0020.0004.16EA][.0000.015A.0004.16EA] # RUNIC LETTER X; QQKN
+16CC  ; [.2812.0020.0004.16CC][.0000.015C.0004.16CC] # RUNIC LETTER SHORT-TWIG-SOL S; QQKN
+16CD  ; [.2812.0020.0004.16CD][.0000.015D.0004.16CD] # RUNIC LETTER C; QQKN
+16CE  ; [.2812.0020.0004.16CE][.0000.015E.0004.16CE] # RUNIC LETTER Z; QQKN
+16CF  ; [.2813.0020.0002.16CF] # RUNIC LETTER TIWAZ TIR TYR T
+16D0  ; [.2813.0020.0004.16D0][.0000.0159.0004.16D0] # RUNIC LETTER SHORT-TWIG-TYR T; QQKN
+16D1  ; [.2813.0020.0004.16D1][.0000.015A.0004.16D1] # RUNIC LETTER D; QQKN
+16D2  ; [.2814.0020.0002.16D2] # RUNIC LETTER BERKANAN BEORC BJARKAN B
+16D3  ; [.2814.0020.0004.16D3][.0000.0159.0004.16D3] # RUNIC LETTER SHORT-TWIG-BJARKAN B; QQKN
+16D4  ; [.2814.0020.0004.16D4][.0000.015A.0004.16D4] # RUNIC LETTER DOTTED-P; QQKN
+16D6  ; [.2815.0020.0002.16D6] # RUNIC LETTER EHWAZ EH E
+16D7  ; [.2816.0020.0002.16D7] # RUNIC LETTER MANNAZ MAN M
+16D8  ; [.2816.0020.0004.16D8][.0000.0159.0004.16D8] # RUNIC LETTER LONG-BRANCH-MADR M; QQKN
+16D9  ; [.2816.0020.0004.16D9][.0000.015A.0004.16D9] # RUNIC LETTER SHORT-TWIG-MADR M; QQKN
+16EF  ; [.2816.0020.0004.16EF][.0000.0159.0004.16EF][.2816.0020.001F.16EF][.0000.0159.001F.16EF] # RUNIC TVIMADUR SYMBOL; QQKN
+16DA  ; [.2817.0020.0002.16DA] # RUNIC LETTER LAUKAZ LAGU LOGR L
+16DB  ; [.2817.0020.0004.16DB][.0000.0159.0004.16DB] # RUNIC LETTER DOTTED-L; QQKN
+16DC  ; [.2818.0020.0002.16DC] # RUNIC LETTER INGWAZ
+16DD  ; [.2818.0020.0004.16DD][.0000.0159.0004.16DD] # RUNIC LETTER ING; QQKN
+16DE  ; [.2819.0020.0002.16DE] # RUNIC LETTER DAGAZ DAEG D
+16DF  ; [.281A.0020.0002.16DF] # RUNIC LETTER OTHALAN ETHEL O
+16AA  ; [.281B.0020.0002.16AA] # RUNIC LETTER AC A
+16AB  ; [.281C.0020.0002.16AB] # RUNIC LETTER AESC
+16A3  ; [.281D.0020.0002.16A3] # RUNIC LETTER YR
+16E0  ; [.281E.0020.0002.16E0] # RUNIC LETTER EAR
+16E3  ; [.281F.0020.0002.16E3] # RUNIC LETTER CALC
+16B8  ; [.2820.0020.0002.16B8] # RUNIC LETTER GAR
+16E4  ; [.2821.0020.0002.16E4] # RUNIC LETTER CEALC
+16E1  ; [.2822.0020.0002.16E1] # RUNIC LETTER IOR
+16E2  ; [.2823.0020.0002.16E2] # RUNIC LETTER CWEORTH
+16E5  ; [.2824.0020.0002.16E5] # RUNIC LETTER STAN
+16E6  ; [.2825.0020.0002.16E6] # RUNIC LETTER LONG-BRANCH-YR
+16E7  ; [.2825.0020.0004.16E7][.0000.0159.0004.16E7] # RUNIC LETTER SHORT-TWIG-YR; QQKN
+16E8  ; [.2825.0020.0004.16E8][.0000.015A.0004.16E8] # RUNIC LETTER ICELANDIC-YR; QQKN
+10C00 ; [.2826.0020.0002.10C00] # OLD TURKIC LETTER ORKHON A
+10C01 ; [.2826.0020.0004.10C01][.0000.0159.0004.10C01] # OLD TURKIC LETTER YENISEI A; QQKN
+10C02 ; [.2827.0020.0002.10C02] # OLD TURKIC LETTER YENISEI AE
+10C03 ; [.2828.0020.0002.10C03] # OLD TURKIC LETTER ORKHON I
+10C04 ; [.2828.0020.0004.10C04][.0000.0159.0004.10C04] # OLD TURKIC LETTER YENISEI I; QQKN
+10C05 ; [.2829.0020.0002.10C05] # OLD TURKIC LETTER YENISEI E
+10C06 ; [.282A.0020.0002.10C06] # OLD TURKIC LETTER ORKHON O
+10C07 ; [.282B.0020.0002.10C07] # OLD TURKIC LETTER ORKHON OE
+10C08 ; [.282B.0020.0004.10C08][.0000.0159.0004.10C08] # OLD TURKIC LETTER YENISEI OE; QQKN
+10C09 ; [.282C.0020.0002.10C09] # OLD TURKIC LETTER ORKHON AB
+10C0A ; [.282C.0020.0004.10C0A][.0000.0159.0004.10C0A] # OLD TURKIC LETTER YENISEI AB; QQKN
+10C0B ; [.282D.0020.0002.10C0B] # OLD TURKIC LETTER ORKHON AEB
+10C0C ; [.282D.0020.0004.10C0C][.0000.0159.0004.10C0C] # OLD TURKIC LETTER YENISEI AEB; QQKN
+10C0D ; [.282E.0020.0002.10C0D] # OLD TURKIC LETTER ORKHON AG
+10C0E ; [.282E.0020.0004.10C0E][.0000.0159.0004.10C0E] # OLD TURKIC LETTER YENISEI AG; QQKN
+10C0F ; [.282F.0020.0002.10C0F] # OLD TURKIC LETTER ORKHON AEG
+10C10 ; [.282F.0020.0004.10C10][.0000.0159.0004.10C10] # OLD TURKIC LETTER YENISEI AEG; QQKN
+10C11 ; [.2830.0020.0002.10C11] # OLD TURKIC LETTER ORKHON AD
+10C12 ; [.2830.0020.0004.10C12][.0000.0159.0004.10C12] # OLD TURKIC LETTER YENISEI AD; QQKN
+10C13 ; [.2831.0020.0002.10C13] # OLD TURKIC LETTER ORKHON AED
+10C14 ; [.2832.0020.0002.10C14] # OLD TURKIC LETTER ORKHON EZ
+10C15 ; [.2832.0020.0004.10C15][.0000.0159.0004.10C15] # OLD TURKIC LETTER YENISEI EZ; QQKN
+10C16 ; [.2833.0020.0002.10C16] # OLD TURKIC LETTER ORKHON AY
+10C17 ; [.2833.0020.0004.10C17][.0000.0159.0004.10C17] # OLD TURKIC LETTER YENISEI AY; QQKN
+10C18 ; [.2834.0020.0002.10C18] # OLD TURKIC LETTER ORKHON AEY
+10C19 ; [.2834.0020.0004.10C19][.0000.0159.0004.10C19] # OLD TURKIC LETTER YENISEI AEY; QQKN
+10C1A ; [.2835.0020.0002.10C1A] # OLD TURKIC LETTER ORKHON AEK
+10C1B ; [.2835.0020.0004.10C1B][.0000.0159.0004.10C1B] # OLD TURKIC LETTER YENISEI AEK; QQKN
+10C1C ; [.2836.0020.0002.10C1C] # OLD TURKIC LETTER ORKHON OEK
+10C1D ; [.2836.0020.0004.10C1D][.0000.0159.0004.10C1D] # OLD TURKIC LETTER YENISEI OEK; QQKN
+10C1E ; [.2837.0020.0002.10C1E] # OLD TURKIC LETTER ORKHON AL
+10C1F ; [.2837.0020.0004.10C1F][.0000.0159.0004.10C1F] # OLD TURKIC LETTER YENISEI AL; QQKN
+10C20 ; [.2838.0020.0002.10C20] # OLD TURKIC LETTER ORKHON AEL
+10C21 ; [.2839.0020.0002.10C21] # OLD TURKIC LETTER ORKHON ELT
+10C22 ; [.283A.0020.0002.10C22] # OLD TURKIC LETTER ORKHON EM
+10C23 ; [.283B.0020.0002.10C23] # OLD TURKIC LETTER ORKHON AN
+10C24 ; [.283C.0020.0002.10C24] # OLD TURKIC LETTER ORKHON AEN
+10C25 ; [.283C.0020.0004.10C25][.0000.0159.0004.10C25] # OLD TURKIC LETTER YENISEI AEN; QQKN
+10C26 ; [.283D.0020.0002.10C26] # OLD TURKIC LETTER ORKHON ENT
+10C27 ; [.283D.0020.0004.10C27][.0000.0159.0004.10C27] # OLD TURKIC LETTER YENISEI ENT; QQKN
+10C28 ; [.283E.0020.0002.10C28] # OLD TURKIC LETTER ORKHON ENC
+10C29 ; [.283E.0020.0004.10C29][.0000.0159.0004.10C29] # OLD TURKIC LETTER YENISEI ENC; QQKN
+10C2A ; [.283F.0020.0002.10C2A] # OLD TURKIC LETTER ORKHON ENY
+10C2B ; [.283F.0020.0004.10C2B][.0000.0159.0004.10C2B] # OLD TURKIC LETTER YENISEI ENY; QQKN
+10C2C ; [.2840.0020.0002.10C2C] # OLD TURKIC LETTER YENISEI ANG
+10C2D ; [.2841.0020.0002.10C2D] # OLD TURKIC LETTER ORKHON ENG
+10C2E ; [.2841.0020.0004.10C2E][.0000.0159.0004.10C2E] # OLD TURKIC LETTER YENISEI AENG; QQKN
+10C2F ; [.2842.0020.0002.10C2F] # OLD TURKIC LETTER ORKHON EP
+10C30 ; [.2843.0020.0002.10C30] # OLD TURKIC LETTER ORKHON OP
+10C31 ; [.2844.0020.0002.10C31] # OLD TURKIC LETTER ORKHON IC
+10C32 ; [.2845.0020.0002.10C32] # OLD TURKIC LETTER ORKHON EC
+10C33 ; [.2845.0020.0004.10C33][.0000.0159.0004.10C33] # OLD TURKIC LETTER YENISEI EC; QQKN
+10C34 ; [.2846.0020.0002.10C34] # OLD TURKIC LETTER ORKHON AQ
+10C35 ; [.2846.0020.0004.10C35][.0000.0159.0004.10C35] # OLD TURKIC LETTER YENISEI AQ; QQKN
+10C36 ; [.2847.0020.0002.10C36] # OLD TURKIC LETTER ORKHON IQ
+10C37 ; [.2847.0020.0004.10C37][.0000.0159.0004.10C37] # OLD TURKIC LETTER YENISEI IQ; QQKN
+10C38 ; [.2848.0020.0002.10C38] # OLD TURKIC LETTER ORKHON OQ
+10C39 ; [.2848.0020.0004.10C39][.0000.0159.0004.10C39] # OLD TURKIC LETTER YENISEI OQ; QQKN
+10C3A ; [.2849.0020.0002.10C3A] # OLD TURKIC LETTER ORKHON AR
+10C3B ; [.2849.0020.0004.10C3B][.0000.0159.0004.10C3B] # OLD TURKIC LETTER YENISEI AR; QQKN
+10C3C ; [.284A.0020.0002.10C3C] # OLD TURKIC LETTER ORKHON AER
+10C3D ; [.284B.0020.0002.10C3D] # OLD TURKIC LETTER ORKHON AS
+10C3E ; [.284C.0020.0002.10C3E] # OLD TURKIC LETTER ORKHON AES
+10C3F ; [.284D.0020.0002.10C3F] # OLD TURKIC LETTER ORKHON ASH
+10C40 ; [.284D.0020.0004.10C40][.0000.0159.0004.10C40] # OLD TURKIC LETTER YENISEI ASH; QQKN
+10C41 ; [.284E.0020.0002.10C41] # OLD TURKIC LETTER ORKHON ESH
+10C42 ; [.284E.0020.0004.10C42][.0000.0159.0004.10C42] # OLD TURKIC LETTER YENISEI ESH; QQKN
+10C43 ; [.284F.0020.0002.10C43] # OLD TURKIC LETTER ORKHON AT
+10C44 ; [.284F.0020.0004.10C44][.0000.0159.0004.10C44] # OLD TURKIC LETTER YENISEI AT; QQKN
+10C45 ; [.2850.0020.0002.10C45] # OLD TURKIC LETTER ORKHON AET
+10C46 ; [.2850.0020.0004.10C46][.0000.0159.0004.10C46] # OLD TURKIC LETTER YENISEI AET; QQKN
+10C47 ; [.2851.0020.0002.10C47] # OLD TURKIC LETTER ORKHON OT
+10C48 ; [.2852.0020.0002.10C48] # OLD TURKIC LETTER ORKHON BASH
+A500  ; [.2853.0020.0002.A500] # VAI SYLLABLE EE
+A501  ; [.2854.0020.0002.A501] # VAI SYLLABLE EEN
+A502  ; [.2855.0020.0002.A502] # VAI SYLLABLE HEE
+A503  ; [.2856.0020.0002.A503] # VAI SYLLABLE WEE
+A504  ; [.2857.0020.0002.A504] # VAI SYLLABLE WEEN
+A505  ; [.2858.0020.0002.A505] # VAI SYLLABLE PEE
+A506  ; [.2859.0020.0002.A506] # VAI SYLLABLE BHEE
+A507  ; [.285A.0020.0002.A507] # VAI SYLLABLE BEE
+A508  ; [.285B.0020.0002.A508] # VAI SYLLABLE MBEE
+A509  ; [.285C.0020.0002.A509] # VAI SYLLABLE KPEE
+A50A  ; [.285D.0020.0002.A50A] # VAI SYLLABLE MGBEE
+A50B  ; [.285E.0020.0002.A50B] # VAI SYLLABLE GBEE
+A50C  ; [.285F.0020.0002.A50C] # VAI SYLLABLE FEE
+A613  ; [.285F.0020.0004.A613][.295E.0020.0004.A613] # VAI SYMBOL FEENG; QQKN
+A50D  ; [.2860.0020.0002.A50D] # VAI SYLLABLE VEE
+A50E  ; [.2861.0020.0002.A50E] # VAI SYLLABLE TEE
+A50F  ; [.2862.0020.0002.A50F] # VAI SYLLABLE THEE
+A510  ; [.2863.0020.0002.A510] # VAI SYLLABLE DHEE
+A511  ; [.2864.0020.0002.A511] # VAI SYLLABLE DHHEE
+A512  ; [.2865.0020.0002.A512] # VAI SYLLABLE LEE
+A513  ; [.2866.0020.0002.A513] # VAI SYLLABLE REE
+A514  ; [.2867.0020.0002.A514] # VAI SYLLABLE DEE
+A515  ; [.2868.0020.0002.A515] # VAI SYLLABLE NDEE
+A516  ; [.2869.0020.0002.A516] # VAI SYLLABLE SEE
+A517  ; [.286A.0020.0002.A517] # VAI SYLLABLE SHEE
+A518  ; [.286B.0020.0002.A518] # VAI SYLLABLE ZEE
+A519  ; [.286C.0020.0002.A519] # VAI SYLLABLE ZHEE
+A51A  ; [.286D.0020.0002.A51A] # VAI SYLLABLE CEE
+A51B  ; [.286E.0020.0002.A51B] # VAI SYLLABLE JEE
+A51C  ; [.286F.0020.0002.A51C] # VAI SYLLABLE NJEE
+A51D  ; [.2870.0020.0002.A51D] # VAI SYLLABLE YEE
+A51E  ; [.2871.0020.0002.A51E] # VAI SYLLABLE KEE
+A614  ; [.2871.0020.0004.A614][.295E.0020.0004.A614] # VAI SYMBOL KEENG; QQKN
+A51F  ; [.2872.0020.0002.A51F] # VAI SYLLABLE NGGEE
+A520  ; [.2873.0020.0002.A520] # VAI SYLLABLE GEE
+A521  ; [.2874.0020.0002.A521] # VAI SYLLABLE MEE
+A522  ; [.2875.0020.0002.A522] # VAI SYLLABLE NEE
+A523  ; [.2876.0020.0002.A523] # VAI SYLLABLE NYEE
+A524  ; [.2877.0020.0002.A524] # VAI SYLLABLE I
+A525  ; [.2878.0020.0002.A525] # VAI SYLLABLE IN
+A526  ; [.2879.0020.0002.A526] # VAI SYLLABLE HI
+A527  ; [.287A.0020.0002.A527] # VAI SYLLABLE HIN
+A528  ; [.287B.0020.0002.A528] # VAI SYLLABLE WI
+A529  ; [.287C.0020.0002.A529] # VAI SYLLABLE WIN
+A52A  ; [.287D.0020.0002.A52A] # VAI SYLLABLE PI
+A52B  ; [.287E.0020.0002.A52B] # VAI SYLLABLE BHI
+A52C  ; [.287F.0020.0002.A52C] # VAI SYLLABLE BI
+A52D  ; [.2880.0020.0002.A52D] # VAI SYLLABLE MBI
+A52E  ; [.2881.0020.0002.A52E] # VAI SYLLABLE KPI
+A52F  ; [.2882.0020.0002.A52F] # VAI SYLLABLE MGBI
+A530  ; [.2883.0020.0002.A530] # VAI SYLLABLE GBI
+A531  ; [.2884.0020.0002.A531] # VAI SYLLABLE FI
+A532  ; [.2885.0020.0002.A532] # VAI SYLLABLE VI
+A533  ; [.2886.0020.0002.A533] # VAI SYLLABLE TI
+A615  ; [.2886.0020.0004.A615][.295E.0020.0004.A615] # VAI SYMBOL TING; QQKN
+A534  ; [.2887.0020.0002.A534] # VAI SYLLABLE THI
+A535  ; [.2888.0020.0002.A535] # VAI SYLLABLE DHI
+A536  ; [.2889.0020.0002.A536] # VAI SYLLABLE DHHI
+A537  ; [.288A.0020.0002.A537] # VAI SYLLABLE LI
+A538  ; [.288B.0020.0002.A538] # VAI SYLLABLE RI
+A539  ; [.288C.0020.0002.A539] # VAI SYLLABLE DI
+A53A  ; [.288D.0020.0002.A53A] # VAI SYLLABLE NDI
+A53B  ; [.288E.0020.0002.A53B] # VAI SYLLABLE SI
+A53C  ; [.288F.0020.0002.A53C] # VAI SYLLABLE SHI
+A53D  ; [.2890.0020.0002.A53D] # VAI SYLLABLE ZI
+A53E  ; [.2891.0020.0002.A53E] # VAI SYLLABLE ZHI
+A53F  ; [.2892.0020.0002.A53F] # VAI SYLLABLE CI
+A540  ; [.2893.0020.0002.A540] # VAI SYLLABLE JI
+A541  ; [.2894.0020.0002.A541] # VAI SYLLABLE NJI
+A542  ; [.2895.0020.0002.A542] # VAI SYLLABLE YI
+A543  ; [.2896.0020.0002.A543] # VAI SYLLABLE KI
+A544  ; [.2897.0020.0002.A544] # VAI SYLLABLE NGGI
+A545  ; [.2898.0020.0002.A545] # VAI SYLLABLE GI
+A546  ; [.2899.0020.0002.A546] # VAI SYLLABLE MI
+A547  ; [.289A.0020.0002.A547] # VAI SYLLABLE NI
+A616  ; [.289A.0020.0004.A616][.295F.0020.0004.A616] # VAI SYMBOL NII; QQKN
+A548  ; [.289B.0020.0002.A548] # VAI SYLLABLE NYI
+A549  ; [.289C.0020.0002.A549] # VAI SYLLABLE A
+A54A  ; [.289D.0020.0002.A54A] # VAI SYLLABLE AN
+A54B  ; [.289E.0020.0002.A54B] # VAI SYLLABLE NGAN
+A54C  ; [.289F.0020.0002.A54C] # VAI SYLLABLE HA
+A54D  ; [.28A0.0020.0002.A54D] # VAI SYLLABLE HAN
+A54E  ; [.28A1.0020.0002.A54E] # VAI SYLLABLE WA
+A54F  ; [.28A2.0020.0002.A54F] # VAI SYLLABLE WAN
+A550  ; [.28A3.0020.0002.A550] # VAI SYLLABLE PA
+A551  ; [.28A4.0020.0002.A551] # VAI SYLLABLE BHA
+A552  ; [.28A5.0020.0002.A552] # VAI SYLLABLE BA
+A617  ; [.28A5.0020.0004.A617][.295E.0020.0004.A617] # VAI SYMBOL BANG; QQKN
+A553  ; [.28A6.0020.0002.A553] # VAI SYLLABLE MBA
+A554  ; [.28A7.0020.0002.A554] # VAI SYLLABLE KPA
+A555  ; [.28A8.0020.0002.A555] # VAI SYLLABLE KPAN
+A556  ; [.28A9.0020.0002.A556] # VAI SYLLABLE MGBA
+A557  ; [.28AA.0020.0002.A557] # VAI SYLLABLE GBA
+A558  ; [.28AB.0020.0002.A558] # VAI SYLLABLE FA
+A610  ; [.28AB.0020.0004.A610] # VAI SYLLABLE NDOLE FA; QQK
+A618  ; [.28AB.0020.0004.A618][.295F.0020.0004.A618] # VAI SYMBOL FAA; QQKN
+A559  ; [.28AC.0020.0002.A559] # VAI SYLLABLE VA
+A55A  ; [.28AD.0020.0002.A55A] # VAI SYLLABLE TA
+A619  ; [.28AD.0020.0004.A619][.295F.0020.0004.A619] # VAI SYMBOL TAA; QQKN
+A55B  ; [.28AE.0020.0002.A55B] # VAI SYLLABLE THA
+A55C  ; [.28AF.0020.0002.A55C] # VAI SYLLABLE DHA
+A55D  ; [.28B0.0020.0002.A55D] # VAI SYLLABLE DHHA
+A55E  ; [.28B1.0020.0002.A55E] # VAI SYLLABLE LA
+A55F  ; [.28B2.0020.0002.A55F] # VAI SYLLABLE RA
+A560  ; [.28B3.0020.0002.A560] # VAI SYLLABLE DA
+A61A  ; [.28B3.0020.0004.A61A][.295E.0020.0004.A61A] # VAI SYMBOL DANG; QQKN
+A561  ; [.28B4.0020.0002.A561] # VAI SYLLABLE NDA
+A562  ; [.28B5.0020.0002.A562] # VAI SYLLABLE SA
+A563  ; [.28B6.0020.0002.A563] # VAI SYLLABLE SHA
+A564  ; [.28B7.0020.0002.A564] # VAI SYLLABLE ZA
+A565  ; [.28B8.0020.0002.A565] # VAI SYLLABLE ZHA
+A566  ; [.28B9.0020.0002.A566] # VAI SYLLABLE CA
+A567  ; [.28BA.0020.0002.A567] # VAI SYLLABLE JA
+A568  ; [.28BB.0020.0002.A568] # VAI SYLLABLE NJA
+A569  ; [.28BC.0020.0002.A569] # VAI SYLLABLE YA
+A56A  ; [.28BD.0020.0002.A56A] # VAI SYLLABLE KA
+A611  ; [.28BD.0020.0004.A611] # VAI SYLLABLE NDOLE KA; QQK
+A56B  ; [.28BE.0020.0002.A56B] # VAI SYLLABLE KAN
+A56C  ; [.28BF.0020.0002.A56C] # VAI SYLLABLE NGGA
+A56D  ; [.28C0.0020.0002.A56D] # VAI SYLLABLE GA
+A56E  ; [.28C1.0020.0002.A56E] # VAI SYLLABLE MA
+A62A  ; [.28C1.0020.0004.A62A] # VAI SYLLABLE NDOLE MA; QQK
+A56F  ; [.28C2.0020.0002.A56F] # VAI SYLLABLE NA
+A570  ; [.28C3.0020.0002.A570] # VAI SYLLABLE NYA
+A571  ; [.28C4.0020.0002.A571] # VAI SYLLABLE OO
+A572  ; [.28C5.0020.0002.A572] # VAI SYLLABLE OON
+A573  ; [.28C6.0020.0002.A573] # VAI SYLLABLE HOO
+A574  ; [.28C7.0020.0002.A574] # VAI SYLLABLE WOO
+A575  ; [.28C8.0020.0002.A575] # VAI SYLLABLE WOON
+A576  ; [.28C9.0020.0002.A576] # VAI SYLLABLE POO
+A577  ; [.28CA.0020.0002.A577] # VAI SYLLABLE BHOO
+A578  ; [.28CB.0020.0002.A578] # VAI SYLLABLE BOO
+A579  ; [.28CC.0020.0002.A579] # VAI SYLLABLE MBOO
+A57A  ; [.28CD.0020.0002.A57A] # VAI SYLLABLE KPOO
+A57B  ; [.28CE.0020.0002.A57B] # VAI SYLLABLE MGBOO
+A57C  ; [.28CF.0020.0002.A57C] # VAI SYLLABLE GBOO
+A57D  ; [.28D0.0020.0002.A57D] # VAI SYLLABLE FOO
+A57E  ; [.28D1.0020.0002.A57E] # VAI SYLLABLE VOO
+A57F  ; [.28D2.0020.0002.A57F] # VAI SYLLABLE TOO
+A580  ; [.28D3.0020.0002.A580] # VAI SYLLABLE THOO
+A581  ; [.28D4.0020.0002.A581] # VAI SYLLABLE DHOO
+A582  ; [.28D5.0020.0002.A582] # VAI SYLLABLE DHHOO
+A583  ; [.28D6.0020.0002.A583] # VAI SYLLABLE LOO
+A584  ; [.28D7.0020.0002.A584] # VAI SYLLABLE ROO
+A585  ; [.28D8.0020.0002.A585] # VAI SYLLABLE DOO
+A61B  ; [.28D8.0020.0004.A61B][.295E.0020.0004.A61B] # VAI SYMBOL DOONG; QQKN
+A586  ; [.28D9.0020.0002.A586] # VAI SYLLABLE NDOO
+A587  ; [.28DA.0020.0002.A587] # VAI SYLLABLE SOO
+A612  ; [.28DA.0020.0004.A612] # VAI SYLLABLE NDOLE SOO; QQK
+A588  ; [.28DB.0020.0002.A588] # VAI SYLLABLE SHOO
+A589  ; [.28DC.0020.0002.A589] # VAI SYLLABLE ZOO
+A58A  ; [.28DD.0020.0002.A58A] # VAI SYLLABLE ZHOO
+A58B  ; [.28DE.0020.0002.A58B] # VAI SYLLABLE COO
+A58C  ; [.28DF.0020.0002.A58C] # VAI SYLLABLE JOO
+A58D  ; [.28E0.0020.0002.A58D] # VAI SYLLABLE NJOO
+A58E  ; [.28E1.0020.0002.A58E] # VAI SYLLABLE YOO
+A58F  ; [.28E2.0020.0002.A58F] # VAI SYLLABLE KOO
+A590  ; [.28E3.0020.0002.A590] # VAI SYLLABLE NGGOO
+A591  ; [.28E4.0020.0002.A591] # VAI SYLLABLE GOO
+A592  ; [.28E5.0020.0002.A592] # VAI SYLLABLE MOO
+A593  ; [.28E6.0020.0002.A593] # VAI SYLLABLE NOO
+A594  ; [.28E7.0020.0002.A594] # VAI SYLLABLE NYOO
+A595  ; [.28E8.0020.0002.A595] # VAI SYLLABLE U
+A596  ; [.28E9.0020.0002.A596] # VAI SYLLABLE UN
+A597  ; [.28EA.0020.0002.A597] # VAI SYLLABLE HU
+A598  ; [.28EB.0020.0002.A598] # VAI SYLLABLE HUN
+A599  ; [.28EC.0020.0002.A599] # VAI SYLLABLE WU
+A59A  ; [.28ED.0020.0002.A59A] # VAI SYLLABLE WUN
+A59B  ; [.28EE.0020.0002.A59B] # VAI SYLLABLE PU
+A59C  ; [.28EF.0020.0002.A59C] # VAI SYLLABLE BHU
+A59D  ; [.28F0.0020.0002.A59D] # VAI SYLLABLE BU
+A59E  ; [.28F1.0020.0002.A59E] # VAI SYLLABLE MBU
+A59F  ; [.28F2.0020.0002.A59F] # VAI SYLLABLE KPU
+A5A0  ; [.28F3.0020.0002.A5A0] # VAI SYLLABLE MGBU
+A5A1  ; [.28F4.0020.0002.A5A1] # VAI SYLLABLE GBU
+A5A2  ; [.28F5.0020.0002.A5A2] # VAI SYLLABLE FU
+A5A3  ; [.28F6.0020.0002.A5A3] # VAI SYLLABLE VU
+A5A4  ; [.28F7.0020.0002.A5A4] # VAI SYLLABLE TU
+A5A5  ; [.28F8.0020.0002.A5A5] # VAI SYLLABLE THU
+A5A6  ; [.28F9.0020.0002.A5A6] # VAI SYLLABLE DHU
+A5A7  ; [.28FA.0020.0002.A5A7] # VAI SYLLABLE DHHU
+A5A8  ; [.28FB.0020.0002.A5A8] # VAI SYLLABLE LU
+A5A9  ; [.28FC.0020.0002.A5A9] # VAI SYLLABLE RU
+A5AA  ; [.28FD.0020.0002.A5AA] # VAI SYLLABLE DU
+A5AB  ; [.28FE.0020.0002.A5AB] # VAI SYLLABLE NDU
+A5AC  ; [.28FF.0020.0002.A5AC] # VAI SYLLABLE SU
+A5AD  ; [.2900.0020.0002.A5AD] # VAI SYLLABLE SHU
+A5AE  ; [.2901.0020.0002.A5AE] # VAI SYLLABLE ZU
+A5AF  ; [.2902.0020.0002.A5AF] # VAI SYLLABLE ZHU
+A5B0  ; [.2903.0020.0002.A5B0] # VAI SYLLABLE CU
+A5B1  ; [.2904.0020.0002.A5B1] # VAI SYLLABLE JU
+A5B2  ; [.2905.0020.0002.A5B2] # VAI SYLLABLE NJU
+A5B3  ; [.2906.0020.0002.A5B3] # VAI SYLLABLE YU
+A5B4  ; [.2907.0020.0002.A5B4] # VAI SYLLABLE KU
+A61C  ; [.2907.0020.0004.A61C][.295E.0020.0004.A61C] # VAI SYMBOL KUNG; QQKN
+A5B5  ; [.2908.0020.0002.A5B5] # VAI SYLLABLE NGGU
+A5B6  ; [.2909.0020.0002.A5B6] # VAI SYLLABLE GU
+A5B7  ; [.290A.0020.0002.A5B7] # VAI SYLLABLE MU
+A5B8  ; [.290B.0020.0002.A5B8] # VAI SYLLABLE NU
+A5B9  ; [.290C.0020.0002.A5B9] # VAI SYLLABLE NYU
+A5BA  ; [.290D.0020.0002.A5BA] # VAI SYLLABLE O
+A5BB  ; [.290E.0020.0002.A5BB] # VAI SYLLABLE ON
+A5BC  ; [.290F.0020.0002.A5BC] # VAI SYLLABLE NGON
+A5BD  ; [.2910.0020.0002.A5BD] # VAI SYLLABLE HO
+A5BE  ; [.2911.0020.0002.A5BE] # VAI SYLLABLE HON
+A5BF  ; [.2912.0020.0002.A5BF] # VAI SYLLABLE WO
+A5C0  ; [.2913.0020.0002.A5C0] # VAI SYLLABLE WON
+A5C1  ; [.2914.0020.0002.A5C1] # VAI SYLLABLE PO
+A5C2  ; [.2915.0020.0002.A5C2] # VAI SYLLABLE BHO
+A5C3  ; [.2916.0020.0002.A5C3] # VAI SYLLABLE BO
+A5C4  ; [.2917.0020.0002.A5C4] # VAI SYLLABLE MBO
+A5C5  ; [.2918.0020.0002.A5C5] # VAI SYLLABLE KPO
+A5C6  ; [.2919.0020.0002.A5C6] # VAI SYLLABLE MGBO
+A5C7  ; [.291A.0020.0002.A5C7] # VAI SYLLABLE GBO
+A5C8  ; [.291B.0020.0002.A5C8] # VAI SYLLABLE GBON
+A5C9  ; [.291C.0020.0002.A5C9] # VAI SYLLABLE FO
+A5CA  ; [.291D.0020.0002.A5CA] # VAI SYLLABLE VO
+A5CB  ; [.291E.0020.0002.A5CB] # VAI SYLLABLE TO
+A61D  ; [.291E.0020.0004.A61D][.295E.0020.0004.A61D] # VAI SYMBOL TONG; QQKN
+A5CC  ; [.291F.0020.0002.A5CC] # VAI SYLLABLE THO
+A5CD  ; [.2920.0020.0002.A5CD] # VAI SYLLABLE DHO
+A5CE  ; [.2921.0020.0002.A5CE] # VAI SYLLABLE DHHO
+A5CF  ; [.2922.0020.0002.A5CF] # VAI SYLLABLE LO
+A5D0  ; [.2923.0020.0002.A5D0] # VAI SYLLABLE RO
+A5D1  ; [.2924.0020.0002.A5D1] # VAI SYLLABLE DO
+A62B  ; [.2924.0020.0004.A62B] # VAI SYLLABLE NDOLE DO; QQK
+A61E  ; [.2924.0020.0004.A61E][.295F.0020.0004.A61E] # VAI SYMBOL DO-O; QQKN
+A5D2  ; [.2925.0020.0002.A5D2] # VAI SYLLABLE NDO
+A5D3  ; [.2926.0020.0002.A5D3] # VAI SYLLABLE SO
+A5D4  ; [.2927.0020.0002.A5D4] # VAI SYLLABLE SHO
+A5D5  ; [.2928.0020.0002.A5D5] # VAI SYLLABLE ZO
+A5D6  ; [.2929.0020.0002.A5D6] # VAI SYLLABLE ZHO
+A5D7  ; [.292A.0020.0002.A5D7] # VAI SYLLABLE CO
+A5D8  ; [.292B.0020.0002.A5D8] # VAI SYLLABLE JO
+A61F  ; [.292B.0020.0004.A61F][.295E.0020.0004.A61F] # VAI SYMBOL JONG; QQKN
+A5D9  ; [.292C.0020.0002.A5D9] # VAI SYLLABLE NJO
+A5DA  ; [.292D.0020.0002.A5DA] # VAI SYLLABLE YO
+A5DB  ; [.292E.0020.0002.A5DB] # VAI SYLLABLE KO
+A5DC  ; [.292F.0020.0002.A5DC] # VAI SYLLABLE NGGO
+A5DD  ; [.2930.0020.0002.A5DD] # VAI SYLLABLE GO
+A5DE  ; [.2931.0020.0002.A5DE] # VAI SYLLABLE MO
+A5DF  ; [.2932.0020.0002.A5DF] # VAI SYLLABLE NO
+A5E0  ; [.2933.0020.0002.A5E0] # VAI SYLLABLE NYO
+A5E1  ; [.2934.0020.0002.A5E1] # VAI SYLLABLE E
+A5E2  ; [.2935.0020.0002.A5E2] # VAI SYLLABLE EN
+A5E3  ; [.2936.0020.0002.A5E3] # VAI SYLLABLE NGEN
+A5E4  ; [.2937.0020.0002.A5E4] # VAI SYLLABLE HE
+A5E5  ; [.2938.0020.0002.A5E5] # VAI SYLLABLE HEN
+A5E6  ; [.2939.0020.0002.A5E6] # VAI SYLLABLE WE
+A5E7  ; [.293A.0020.0002.A5E7] # VAI SYLLABLE WEN
+A5E8  ; [.293B.0020.0002.A5E8] # VAI SYLLABLE PE
+A5E9  ; [.293C.0020.0002.A5E9] # VAI SYLLABLE BHE
+A5EA  ; [.293D.0020.0002.A5EA] # VAI SYLLABLE BE
+A5EB  ; [.293E.0020.0002.A5EB] # VAI SYLLABLE MBE
+A5EC  ; [.293F.0020.0002.A5EC] # VAI SYLLABLE KPE
+A5ED  ; [.2940.0020.0002.A5ED] # VAI SYLLABLE KPEN
+A5EE  ; [.2941.0020.0002.A5EE] # VAI SYLLABLE MGBE
+A5EF  ; [.2942.0020.0002.A5EF] # VAI SYLLABLE GBE
+A5F0  ; [.2943.0020.0002.A5F0] # VAI SYLLABLE GBEN
+A5F1  ; [.2944.0020.0002.A5F1] # VAI SYLLABLE FE
+A5F2  ; [.2945.0020.0002.A5F2] # VAI SYLLABLE VE
+A5F3  ; [.2946.0020.0002.A5F3] # VAI SYLLABLE TE
+A5F4  ; [.2947.0020.0002.A5F4] # VAI SYLLABLE THE
+A5F5  ; [.2948.0020.0002.A5F5] # VAI SYLLABLE DHE
+A5F6  ; [.2949.0020.0002.A5F6] # VAI SYLLABLE DHHE
+A5F7  ; [.294A.0020.0002.A5F7] # VAI SYLLABLE LE
+A5F8  ; [.294B.0020.0002.A5F8] # VAI SYLLABLE RE
+A5F9  ; [.294C.0020.0002.A5F9] # VAI SYLLABLE DE
+A5FA  ; [.294D.0020.0002.A5FA] # VAI SYLLABLE NDE
+A5FB  ; [.294E.0020.0002.A5FB] # VAI SYLLABLE SE
+A5FC  ; [.294F.0020.0002.A5FC] # VAI SYLLABLE SHE
+A5FD  ; [.2950.0020.0002.A5FD] # VAI SYLLABLE ZE
+A5FE  ; [.2951.0020.0002.A5FE] # VAI SYLLABLE ZHE
+A5FF  ; [.2952.0020.0002.A5FF] # VAI SYLLABLE CE
+A600  ; [.2953.0020.0002.A600] # VAI SYLLABLE JE
+A601  ; [.2954.0020.0002.A601] # VAI SYLLABLE NJE
+A602  ; [.2955.0020.0002.A602] # VAI SYLLABLE YE
+A603  ; [.2956.0020.0002.A603] # VAI SYLLABLE KE
+A604  ; [.2957.0020.0002.A604] # VAI SYLLABLE NGGE
+A605  ; [.2958.0020.0002.A605] # VAI SYLLABLE NGGEN
+A606  ; [.2959.0020.0002.A606] # VAI SYLLABLE GE
+A607  ; [.295A.0020.0002.A607] # VAI SYLLABLE GEN
+A608  ; [.295B.0020.0002.A608] # VAI SYLLABLE ME
+A609  ; [.295C.0020.0002.A609] # VAI SYLLABLE NE
+A60A  ; [.295D.0020.0002.A60A] # VAI SYLLABLE NYE
+A60B  ; [.295E.0020.0002.A60B] # VAI SYLLABLE NG
+A60C  ; [.295F.0020.0002.A60C] # VAI SYLLABLE LENGTHENER
+A6A0  ; [.2960.0020.0002.A6A0] # BAMUM LETTER A
+A6A1  ; [.2961.0020.0002.A6A1] # BAMUM LETTER KA
+A6A2  ; [.2962.0020.0002.A6A2] # BAMUM LETTER U
+A6A3  ; [.2963.0020.0002.A6A3] # BAMUM LETTER KU
+A6A4  ; [.2964.0020.0002.A6A4] # BAMUM LETTER EE
+A6A5  ; [.2965.0020.0002.A6A5] # BAMUM LETTER REE
+A6A6  ; [.2966.0020.0002.A6A6] # BAMUM LETTER TAE
+A6A7  ; [.2967.0020.0002.A6A7] # BAMUM LETTER O
+A6A8  ; [.2968.0020.0002.A6A8] # BAMUM LETTER NYI
+A6A9  ; [.2969.0020.0002.A6A9] # BAMUM LETTER I
+A6AA  ; [.296A.0020.0002.A6AA] # BAMUM LETTER LA
+A6AB  ; [.296B.0020.0002.A6AB] # BAMUM LETTER PA
+A6AC  ; [.296C.0020.0002.A6AC] # BAMUM LETTER RII
+A6AD  ; [.296D.0020.0002.A6AD] # BAMUM LETTER RIEE
+A6AE  ; [.296E.0020.0002.A6AE] # BAMUM LETTER LEEEE
+A6AF  ; [.296F.0020.0002.A6AF] # BAMUM LETTER MEEEE
+A6B0  ; [.2970.0020.0002.A6B0] # BAMUM LETTER TAA
+A6B1  ; [.2971.0020.0002.A6B1] # BAMUM LETTER NDAA
+A6B2  ; [.2972.0020.0002.A6B2] # BAMUM LETTER NJAEM
+A6B3  ; [.2973.0020.0002.A6B3] # BAMUM LETTER M
+A6B4  ; [.2974.0020.0002.A6B4] # BAMUM LETTER SUU
+A6B5  ; [.2975.0020.0002.A6B5] # BAMUM LETTER MU
+A6B6  ; [.2976.0020.0002.A6B6] # BAMUM LETTER SHII
+A6B7  ; [.2977.0020.0002.A6B7] # BAMUM LETTER SI
+A6B8  ; [.2978.0020.0002.A6B8] # BAMUM LETTER SHEUX
+A6B9  ; [.2979.0020.0002.A6B9] # BAMUM LETTER SEUX
+A6BA  ; [.297A.0020.0002.A6BA] # BAMUM LETTER KYEE
+A6BB  ; [.297B.0020.0002.A6BB] # BAMUM LETTER KET
+A6BC  ; [.297C.0020.0002.A6BC] # BAMUM LETTER NUAE
+A6BD  ; [.297D.0020.0002.A6BD] # BAMUM LETTER NU
+A6BE  ; [.297E.0020.0002.A6BE] # BAMUM LETTER NJUAE
+A6BF  ; [.297F.0020.0002.A6BF] # BAMUM LETTER YOQ
+A6C0  ; [.2980.0020.0002.A6C0] # BAMUM LETTER SHU
+A6C1  ; [.2981.0020.0002.A6C1] # BAMUM LETTER YUQ
+A6C2  ; [.2982.0020.0002.A6C2] # BAMUM LETTER YA
+A6C3  ; [.2983.0020.0002.A6C3] # BAMUM LETTER NSHA
+A6C4  ; [.2984.0020.0002.A6C4] # BAMUM LETTER KEUX
+A6C5  ; [.2985.0020.0002.A6C5] # BAMUM LETTER PEUX
+A6C6  ; [.2986.0020.0002.A6C6] # BAMUM LETTER NJEE
+A6C7  ; [.2987.0020.0002.A6C7] # BAMUM LETTER NTEE
+A6C8  ; [.2988.0020.0002.A6C8] # BAMUM LETTER PUE
+A6C9  ; [.2989.0020.0002.A6C9] # BAMUM LETTER WUE
+A6CA  ; [.298A.0020.0002.A6CA] # BAMUM LETTER PEE
+A6CB  ; [.298B.0020.0002.A6CB] # BAMUM LETTER FEE
+A6CC  ; [.298C.0020.0002.A6CC] # BAMUM LETTER RU
+A6CD  ; [.298D.0020.0002.A6CD] # BAMUM LETTER LU
+A6CE  ; [.298E.0020.0002.A6CE] # BAMUM LETTER MI
+A6CF  ; [.298F.0020.0002.A6CF] # BAMUM LETTER NI
+A6D0  ; [.2990.0020.0002.A6D0] # BAMUM LETTER REUX
+A6D1  ; [.2991.0020.0002.A6D1] # BAMUM LETTER RAE
+A6D2  ; [.2992.0020.0002.A6D2] # BAMUM LETTER KEN
+A6D3  ; [.2993.0020.0002.A6D3] # BAMUM LETTER NGKWAEN
+A6D4  ; [.2994.0020.0002.A6D4] # BAMUM LETTER NGGA
+A6D5  ; [.2995.0020.0002.A6D5] # BAMUM LETTER NGA
+A6D6  ; [.2996.0020.0002.A6D6] # BAMUM LETTER SHO
+A6D7  ; [.2997.0020.0002.A6D7] # BAMUM LETTER PUAE
+A6D8  ; [.2998.0020.0002.A6D8] # BAMUM LETTER FU
+A6D9  ; [.2999.0020.0002.A6D9] # BAMUM LETTER FOM
+A6DA  ; [.299A.0020.0002.A6DA] # BAMUM LETTER WA
+A6DB  ; [.299B.0020.0002.A6DB] # BAMUM LETTER NA
+A6DC  ; [.299C.0020.0002.A6DC] # BAMUM LETTER LI
+A6DD  ; [.299D.0020.0002.A6DD] # BAMUM LETTER PI
+A6DE  ; [.299E.0020.0002.A6DE] # BAMUM LETTER LOQ
+A6DF  ; [.299F.0020.0002.A6DF] # BAMUM LETTER KO
+A6E0  ; [.29A0.0020.0002.A6E0] # BAMUM LETTER MBEN
+A6E1  ; [.29A1.0020.0002.A6E1] # BAMUM LETTER REN
+A6E2  ; [.29A2.0020.0002.A6E2] # BAMUM LETTER MEN
+A6E3  ; [.29A3.0020.0002.A6E3] # BAMUM LETTER MA
+A6E4  ; [.29A4.0020.0002.A6E4] # BAMUM LETTER TI
+A6E5  ; [.29A5.0020.0002.A6E5] # BAMUM LETTER KI
+A6E6  ; [.29A6.0020.0002.A6E6] # BAMUM LETTER MO
+A6E7  ; [.29A7.0020.0002.A6E7] # BAMUM LETTER MBAA
+A6E8  ; [.29A8.0020.0002.A6E8] # BAMUM LETTER TET
+A6E9  ; [.29A9.0020.0002.A6E9] # BAMUM LETTER KPA
+A6EA  ; [.29AA.0020.0002.A6EA] # BAMUM LETTER TEN
+A6EB  ; [.29AB.0020.0002.A6EB] # BAMUM LETTER NTUU
+A6EC  ; [.29AC.0020.0002.A6EC] # BAMUM LETTER SAMBA
+A6ED  ; [.29AD.0020.0002.A6ED] # BAMUM LETTER FAAMAE
+A6EE  ; [.29AE.0020.0002.A6EE] # BAMUM LETTER KOVUU
+A6EF  ; [.29AF.0020.0002.A6EF] # BAMUM LETTER KOGHOM
+1100  ; [.29B0.0020.0002.1100] # HANGUL CHOSEONG KIYEOK
+3131  ; [.29B0.0020.0004.3131] # HANGUL LETTER KIYEOK; QQK
+3200  ; [*02FF.0020.0004.3200][.29B0.0020.0004.3200][*0300.0020.001F.3200] # PARENTHESIZED HANGUL KIYEOK; QQKN
+3260  ; [.29B0.0020.0006.3260] # CIRCLED HANGUL KIYEOK; QQK
+FFA1  ; [.29B0.0020.0012.FFA1] # HALFWIDTH HANGUL LETTER KIYEOK; QQK
+320E  ; [*02FF.0020.0004.320E][.29B0.0020.0004.320E][.2A2E.0020.001F.320E][*0300.0020.001F.320E] # PARENTHESIZED HANGUL KIYEOK A; QQKN
+326E  ; [.29B0.0020.0006.326E][.2A2E.0020.0006.326E] # CIRCLED HANGUL KIYEOK A; QQKN
+1101  ; [.29B1.0020.0002.1101] # HANGUL CHOSEONG SSANGKIYEOK
+3132  ; [.29B1.0020.0004.3132] # HANGUL LETTER SSANGKIYEOK; QQK
+FFA2  ; [.29B1.0020.0012.FFA2] # HALFWIDTH HANGUL LETTER SSANGKIYEOK; QQK
+1102  ; [.29B2.0020.0002.1102] # HANGUL CHOSEONG NIEUN
+3134  ; [.29B2.0020.0004.3134] # HANGUL LETTER NIEUN; QQK
+3201  ; [*02FF.0020.0004.3201][.29B2.0020.0004.3201][*0300.0020.001F.3201] # PARENTHESIZED HANGUL NIEUN; QQKN
+3261  ; [.29B2.0020.0006.3261] # CIRCLED HANGUL NIEUN; QQK
+FFA4  ; [.29B2.0020.0012.FFA4] # HALFWIDTH HANGUL LETTER NIEUN; QQK
+320F  ; [*02FF.0020.0004.320F][.29B2.0020.0004.320F][.2A2E.0020.001F.320F][*0300.0020.001F.320F] # PARENTHESIZED HANGUL NIEUN A; QQKN
+326F  ; [.29B2.0020.0006.326F][.2A2E.0020.0006.326F] # CIRCLED HANGUL NIEUN A; QQKN
+1103  ; [.29B3.0020.0002.1103] # HANGUL CHOSEONG TIKEUT
+3137  ; [.29B3.0020.0004.3137] # HANGUL LETTER TIKEUT; QQK
+3202  ; [*02FF.0020.0004.3202][.29B3.0020.0004.3202][*0300.0020.001F.3202] # PARENTHESIZED HANGUL TIKEUT; QQKN
+3262  ; [.29B3.0020.0006.3262] # CIRCLED HANGUL TIKEUT; QQK
+FFA7  ; [.29B3.0020.0012.FFA7] # HALFWIDTH HANGUL LETTER TIKEUT; QQK
+3210  ; [*02FF.0020.0004.3210][.29B3.0020.0004.3210][.2A2E.0020.001F.3210][*0300.0020.001F.3210] # PARENTHESIZED HANGUL TIKEUT A; QQKN
+3270  ; [.29B3.0020.0006.3270][.2A2E.0020.0006.3270] # CIRCLED HANGUL TIKEUT A; QQKN
+1104  ; [.29B4.0020.0002.1104] # HANGUL CHOSEONG SSANGTIKEUT
+3138  ; [.29B4.0020.0004.3138] # HANGUL LETTER SSANGTIKEUT; QQK
+FFA8  ; [.29B4.0020.0012.FFA8] # HALFWIDTH HANGUL LETTER SSANGTIKEUT; QQK
+1105  ; [.29B5.0020.0002.1105] # HANGUL CHOSEONG RIEUL
+3139  ; [.29B5.0020.0004.3139] # HANGUL LETTER RIEUL; QQK
+3203  ; [*02FF.0020.0004.3203][.29B5.0020.0004.3203][*0300.0020.001F.3203] # PARENTHESIZED HANGUL RIEUL; QQKN
+3263  ; [.29B5.0020.0006.3263] # CIRCLED HANGUL RIEUL; QQK
+FFA9  ; [.29B5.0020.0012.FFA9] # HALFWIDTH HANGUL LETTER RIEUL; QQK
+3211  ; [*02FF.0020.0004.3211][.29B5.0020.0004.3211][.2A2E.0020.001F.3211][*0300.0020.001F.3211] # PARENTHESIZED HANGUL RIEUL A; QQKN
+3271  ; [.29B5.0020.0006.3271][.2A2E.0020.0006.3271] # CIRCLED HANGUL RIEUL A; QQKN
+1106  ; [.29B6.0020.0002.1106] # HANGUL CHOSEONG MIEUM
+3141  ; [.29B6.0020.0004.3141] # HANGUL LETTER MIEUM; QQK
+3204  ; [*02FF.0020.0004.3204][.29B6.0020.0004.3204][*0300.0020.001F.3204] # PARENTHESIZED HANGUL MIEUM; QQKN
+3264  ; [.29B6.0020.0006.3264] # CIRCLED HANGUL MIEUM; QQK
+FFB1  ; [.29B6.0020.0012.FFB1] # HALFWIDTH HANGUL LETTER MIEUM; QQK
+3212  ; [*02FF.0020.0004.3212][.29B6.0020.0004.3212][.2A2E.0020.001F.3212][*0300.0020.001F.3212] # PARENTHESIZED HANGUL MIEUM A; QQKN
+3272  ; [.29B6.0020.0006.3272][.2A2E.0020.0006.3272] # CIRCLED HANGUL MIEUM A; QQKN
+1107  ; [.29B7.0020.0002.1107] # HANGUL CHOSEONG PIEUP
+3142  ; [.29B7.0020.0004.3142] # HANGUL LETTER PIEUP; QQK
+3205  ; [*02FF.0020.0004.3205][.29B7.0020.0004.3205][*0300.0020.001F.3205] # PARENTHESIZED HANGUL PIEUP; QQKN
+3265  ; [.29B7.0020.0006.3265] # CIRCLED HANGUL PIEUP; QQK
+FFB2  ; [.29B7.0020.0012.FFB2] # HALFWIDTH HANGUL LETTER PIEUP; QQK
+3213  ; [*02FF.0020.0004.3213][.29B7.0020.0004.3213][.2A2E.0020.001F.3213][*0300.0020.001F.3213] # PARENTHESIZED HANGUL PIEUP A; QQKN
+3273  ; [.29B7.0020.0006.3273][.2A2E.0020.0006.3273] # CIRCLED HANGUL PIEUP A; QQKN
+1108  ; [.29B8.0020.0002.1108] # HANGUL CHOSEONG SSANGPIEUP
+3143  ; [.29B8.0020.0004.3143] # HANGUL LETTER SSANGPIEUP; QQK
+FFB3  ; [.29B8.0020.0012.FFB3] # HALFWIDTH HANGUL LETTER SSANGPIEUP; QQK
+1109  ; [.29B9.0020.0002.1109] # HANGUL CHOSEONG SIOS
+3145  ; [.29B9.0020.0004.3145] # HANGUL LETTER SIOS; QQK
+3206  ; [*02FF.0020.0004.3206][.29B9.0020.0004.3206][*0300.0020.001F.3206] # PARENTHESIZED HANGUL SIOS; QQKN
+3266  ; [.29B9.0020.0006.3266] # CIRCLED HANGUL SIOS; QQK
+FFB5  ; [.29B9.0020.0012.FFB5] # HALFWIDTH HANGUL LETTER SIOS; QQK
+3214  ; [*02FF.0020.0004.3214][.29B9.0020.0004.3214][.2A2E.0020.001F.3214][*0300.0020.001F.3214] # PARENTHESIZED HANGUL SIOS A; QQKN
+3274  ; [.29B9.0020.0006.3274][.2A2E.0020.0006.3274] # CIRCLED HANGUL SIOS A; QQKN
+110A  ; [.29BA.0020.0002.110A] # HANGUL CHOSEONG SSANGSIOS
+3146  ; [.29BA.0020.0004.3146] # HANGUL LETTER SSANGSIOS; QQK
+FFB6  ; [.29BA.0020.0012.FFB6] # HALFWIDTH HANGUL LETTER SSANGSIOS; QQK
+110B  ; [.29BB.0020.0002.110B] # HANGUL CHOSEONG IEUNG
+3147  ; [.29BB.0020.0004.3147] # HANGUL LETTER IEUNG; QQK
+3207  ; [*02FF.0020.0004.3207][.29BB.0020.0004.3207][*0300.0020.001F.3207] # PARENTHESIZED HANGUL IEUNG; QQKN
+3267  ; [.29BB.0020.0006.3267] # CIRCLED HANGUL IEUNG; QQK
+FFB7  ; [.29BB.0020.0012.FFB7] # HALFWIDTH HANGUL LETTER IEUNG; QQK
+3215  ; [*02FF.0020.0004.3215][.29BB.0020.0004.3215][.2A2E.0020.001F.3215][*0300.0020.001F.3215] # PARENTHESIZED HANGUL IEUNG A; QQKN
+3275  ; [.29BB.0020.0006.3275][.2A2E.0020.0006.3275] # CIRCLED HANGUL IEUNG A; QQKN
+321D  ; [*02FF.0020.0004.321D][.29BB.0020.0004.321D][.2A36.0020.001F.321D][.29BC.0020.001F.321D][.2A32.0020.001F.321D][.2A8F.0020.001F.321D][*0300.0020.001F.321D] # PARENTHESIZED KOREAN CHARACTER OJEON; QQKN
+321E  ; [*02FF.0020.0004.321E][.29BB.0020.0004.321E][.2A36.0020.001F.321E][.29C2.0020.001F.321E][.2A3B.0020.001F.321E][*0300.0020.001F.321E] # PARENTHESIZED KOREAN CHARACTER O HU; QQKN
+327E  ; [.29BB.0020.0006.327E][.2A3B.0020.0006.327E] # CIRCLED HANGUL IEUNG U; QQKN
+110C  ; [.29BC.0020.0002.110C] # HANGUL CHOSEONG CIEUC
+3148  ; [.29BC.0020.0004.3148] # HANGUL LETTER CIEUC; QQK
+3208  ; [*02FF.0020.0004.3208][.29BC.0020.0004.3208][*0300.0020.001F.3208] # PARENTHESIZED HANGUL CIEUC; QQKN
+3268  ; [.29BC.0020.0006.3268] # CIRCLED HANGUL CIEUC; QQK
+FFB8  ; [.29BC.0020.0012.FFB8] # HALFWIDTH HANGUL LETTER CIEUC; QQK
+3216  ; [*02FF.0020.0004.3216][.29BC.0020.0004.3216][.2A2E.0020.001F.3216][*0300.0020.001F.3216] # PARENTHESIZED HANGUL CIEUC A; QQKN
+3276  ; [.29BC.0020.0006.3276][.2A2E.0020.0006.3276] # CIRCLED HANGUL CIEUC A; QQKN
+321C  ; [*02FF.0020.0004.321C][.29BC.0020.0004.321C][.2A3B.0020.001F.321C][*0300.0020.001F.321C] # PARENTHESIZED HANGUL CIEUC U; QQKN
+327D  ; [.29BC.0020.0006.327D][.2A3B.0020.0006.327D][.29BB.0020.001F.327D][.2A41.0020.001F.327D] # CIRCLED KOREAN CHARACTER JUEUI; QQKN
+110D  ; [.29BD.0020.0002.110D] # HANGUL CHOSEONG SSANGCIEUC
+3149  ; [.29BD.0020.0004.3149] # HANGUL LETTER SSANGCIEUC; QQK
+FFB9  ; [.29BD.0020.0012.FFB9] # HALFWIDTH HANGUL LETTER SSANGCIEUC; QQK
+110E  ; [.29BE.0020.0002.110E] # HANGUL CHOSEONG CHIEUCH
+314A  ; [.29BE.0020.0004.314A] # HANGUL LETTER CHIEUCH; QQK
+3209  ; [*02FF.0020.0004.3209][.29BE.0020.0004.3209][*0300.0020.001F.3209] # PARENTHESIZED HANGUL CHIEUCH; QQKN
+3269  ; [.29BE.0020.0006.3269] # CIRCLED HANGUL CHIEUCH; QQK
+FFBA  ; [.29BE.0020.0012.FFBA] # HALFWIDTH HANGUL LETTER CHIEUCH; QQK
+3217  ; [*02FF.0020.0004.3217][.29BE.0020.0004.3217][.2A2E.0020.001F.3217][*0300.0020.001F.3217] # PARENTHESIZED HANGUL CHIEUCH A; QQKN
+3277  ; [.29BE.0020.0006.3277][.2A2E.0020.0006.3277] # CIRCLED HANGUL CHIEUCH A; QQKN
+327C  ; [.29BE.0020.0006.327C][.2A2E.0020.0006.327C][.2A9B.0020.001F.327C][.29B0.0020.001F.327C][.2A36.0020.001F.327C] # CIRCLED KOREAN CHARACTER CHAMKO; QQKN
+110F  ; [.29BF.0020.0002.110F] # HANGUL CHOSEONG KHIEUKH
+314B  ; [.29BF.0020.0004.314B] # HANGUL LETTER KHIEUKH; QQK
+320A  ; [*02FF.0020.0004.320A][.29BF.0020.0004.320A][*0300.0020.001F.320A] # PARENTHESIZED HANGUL KHIEUKH; QQKN
+326A  ; [.29BF.0020.0006.326A] # CIRCLED HANGUL KHIEUKH; QQK
+FFBB  ; [.29BF.0020.0012.FFBB] # HALFWIDTH HANGUL LETTER KHIEUKH; QQK
+3218  ; [*02FF.0020.0004.3218][.29BF.0020.0004.3218][.2A2E.0020.001F.3218][*0300.0020.001F.3218] # PARENTHESIZED HANGUL KHIEUKH A; QQKN
+3278  ; [.29BF.0020.0006.3278][.2A2E.0020.0006.3278] # CIRCLED HANGUL KHIEUKH A; QQKN
+1110  ; [.29C0.0020.0002.1110] # HANGUL CHOSEONG THIEUTH
+314C  ; [.29C0.0020.0004.314C] # HANGUL LETTER THIEUTH; QQK
+320B  ; [*02FF.0020.0004.320B][.29C0.0020.0004.320B][*0300.0020.001F.320B] # PARENTHESIZED HANGUL THIEUTH; QQKN
+326B  ; [.29C0.0020.0006.326B] # CIRCLED HANGUL THIEUTH; QQK
+FFBC  ; [.29C0.0020.0012.FFBC] # HALFWIDTH HANGUL LETTER THIEUTH; QQK
+3219  ; [*02FF.0020.0004.3219][.29C0.0020.0004.3219][.2A2E.0020.001F.3219][*0300.0020.001F.3219] # PARENTHESIZED HANGUL THIEUTH A; QQKN
+3279  ; [.29C0.0020.0006.3279][.2A2E.0020.0006.3279] # CIRCLED HANGUL THIEUTH A; QQKN
+1111  ; [.29C1.0020.0002.1111] # HANGUL CHOSEONG PHIEUPH
+314D  ; [.29C1.0020.0004.314D] # HANGUL LETTER PHIEUPH; QQK
+320C  ; [*02FF.0020.0004.320C][.29C1.0020.0004.320C][*0300.0020.001F.320C] # PARENTHESIZED HANGUL PHIEUPH; QQKN
+326C  ; [.29C1.0020.0006.326C] # CIRCLED HANGUL PHIEUPH; QQK
+FFBD  ; [.29C1.0020.0012.FFBD] # HALFWIDTH HANGUL LETTER PHIEUPH; QQK
+321A  ; [*02FF.0020.0004.321A][.29C1.0020.0004.321A][.2A2E.0020.001F.321A][*0300.0020.001F.321A] # PARENTHESIZED HANGUL PHIEUPH A; QQKN
+327A  ; [.29C1.0020.0006.327A][.2A2E.0020.0006.327A] # CIRCLED HANGUL PHIEUPH A; QQKN
+1112  ; [.29C2.0020.0002.1112] # HANGUL CHOSEONG HIEUH
+314E  ; [.29C2.0020.0004.314E] # HANGUL LETTER HIEUH; QQK
+320D  ; [*02FF.0020.0004.320D][.29C2.0020.0004.320D][*0300.0020.001F.320D] # PARENTHESIZED HANGUL HIEUH; QQKN
+326D  ; [.29C2.0020.0006.326D] # CIRCLED HANGUL HIEUH; QQK
+FFBE  ; [.29C2.0020.0012.FFBE] # HALFWIDTH HANGUL LETTER HIEUH; QQK
+321B  ; [*02FF.0020.0004.321B][.29C2.0020.0004.321B][.2A2E.0020.001F.321B][*0300.0020.001F.321B] # PARENTHESIZED HANGUL HIEUH A; QQKN
+327B  ; [.29C2.0020.0006.327B][.2A2E.0020.0006.327B] # CIRCLED HANGUL HIEUH A; QQKN
+1113  ; [.29C3.0020.0002.1113] # HANGUL CHOSEONG NIEUN-KIYEOK
+1114  ; [.29C4.0020.0002.1114] # HANGUL CHOSEONG SSANGNIEUN
+3165  ; [.29C4.0020.0004.3165] # HANGUL LETTER SSANGNIEUN; QQK
+1115  ; [.29C5.0020.0002.1115] # HANGUL CHOSEONG NIEUN-TIKEUT
+3166  ; [.29C5.0020.0004.3166] # HANGUL LETTER NIEUN-TIKEUT; QQK
+1116  ; [.29C6.0020.0002.1116] # HANGUL CHOSEONG NIEUN-PIEUP
+1117  ; [.29C7.0020.0002.1117] # HANGUL CHOSEONG TIKEUT-KIYEOK
+1118  ; [.29C8.0020.0002.1118] # HANGUL CHOSEONG RIEUL-NIEUN
+1119  ; [.29C9.0020.0002.1119] # HANGUL CHOSEONG SSANGRIEUL
+111A  ; [.29CA.0020.0002.111A] # HANGUL CHOSEONG RIEUL-HIEUH
+3140  ; [.29CA.0020.0004.3140] # HANGUL LETTER RIEUL-HIEUH; QQK
+FFB0  ; [.29CA.0020.0012.FFB0] # HALFWIDTH HANGUL LETTER RIEUL-HIEUH; QQK
+111B  ; [.29CB.0020.0002.111B] # HANGUL CHOSEONG KAPYEOUNRIEUL
+111C  ; [.29CC.0020.0002.111C] # HANGUL CHOSEONG MIEUM-PIEUP
+316E  ; [.29CC.0020.0004.316E] # HANGUL LETTER MIEUM-PIEUP; QQK
+111D  ; [.29CD.0020.0002.111D] # HANGUL CHOSEONG KAPYEOUNMIEUM
+3171  ; [.29CD.0020.0004.3171] # HANGUL LETTER KAPYEOUNMIEUM; QQK
+111E  ; [.29CE.0020.0002.111E] # HANGUL CHOSEONG PIEUP-KIYEOK
+3172  ; [.29CE.0020.0004.3172] # HANGUL LETTER PIEUP-KIYEOK; QQK
+111F  ; [.29CF.0020.0002.111F] # HANGUL CHOSEONG PIEUP-NIEUN
+1120  ; [.29D0.0020.0002.1120] # HANGUL CHOSEONG PIEUP-TIKEUT
+3173  ; [.29D0.0020.0004.3173] # HANGUL LETTER PIEUP-TIKEUT; QQK
+1121  ; [.29D1.0020.0002.1121] # HANGUL CHOSEONG PIEUP-SIOS
+3144  ; [.29D1.0020.0004.3144] # HANGUL LETTER PIEUP-SIOS; QQK
+FFB4  ; [.29D1.0020.0012.FFB4] # HALFWIDTH HANGUL LETTER PIEUP-SIOS; QQK
+1122  ; [.29D2.0020.0002.1122] # HANGUL CHOSEONG PIEUP-SIOS-KIYEOK
+3174  ; [.29D2.0020.0004.3174] # HANGUL LETTER PIEUP-SIOS-KIYEOK; QQK
+1123  ; [.29D3.0020.0002.1123] # HANGUL CHOSEONG PIEUP-SIOS-TIKEUT
+3175  ; [.29D3.0020.0004.3175] # HANGUL LETTER PIEUP-SIOS-TIKEUT; QQK
+1124  ; [.29D4.0020.0002.1124] # HANGUL CHOSEONG PIEUP-SIOS-PIEUP
+1125  ; [.29D5.0020.0002.1125] # HANGUL CHOSEONG PIEUP-SSANGSIOS
+1126  ; [.29D6.0020.0002.1126] # HANGUL CHOSEONG PIEUP-SIOS-CIEUC
+1127  ; [.29D7.0020.0002.1127] # HANGUL CHOSEONG PIEUP-CIEUC
+3176  ; [.29D7.0020.0004.3176] # HANGUL LETTER PIEUP-CIEUC; QQK
+1128  ; [.29D8.0020.0002.1128] # HANGUL CHOSEONG PIEUP-CHIEUCH
+1129  ; [.29D9.0020.0002.1129] # HANGUL CHOSEONG PIEUP-THIEUTH
+3177  ; [.29D9.0020.0004.3177] # HANGUL LETTER PIEUP-THIEUTH; QQK
+112A  ; [.29DA.0020.0002.112A] # HANGUL CHOSEONG PIEUP-PHIEUPH
+112B  ; [.29DB.0020.0002.112B] # HANGUL CHOSEONG KAPYEOUNPIEUP
+3178  ; [.29DB.0020.0004.3178] # HANGUL LETTER KAPYEOUNPIEUP; QQK
+112C  ; [.29DC.0020.0002.112C] # HANGUL CHOSEONG KAPYEOUNSSANGPIEUP
+3179  ; [.29DC.0020.0004.3179] # HANGUL LETTER KAPYEOUNSSANGPIEUP; QQK
+112D  ; [.29DD.0020.0002.112D] # HANGUL CHOSEONG SIOS-KIYEOK
+317A  ; [.29DD.0020.0004.317A] # HANGUL LETTER SIOS-KIYEOK; QQK
+112E  ; [.29DE.0020.0002.112E] # HANGUL CHOSEONG SIOS-NIEUN
+317B  ; [.29DE.0020.0004.317B] # HANGUL LETTER SIOS-NIEUN; QQK
+112F  ; [.29DF.0020.0002.112F] # HANGUL CHOSEONG SIOS-TIKEUT
+317C  ; [.29DF.0020.0004.317C] # HANGUL LETTER SIOS-TIKEUT; QQK
+1130  ; [.29E0.0020.0002.1130] # HANGUL CHOSEONG SIOS-RIEUL
+1131  ; [.29E1.0020.0002.1131] # HANGUL CHOSEONG SIOS-MIEUM
+1132  ; [.29E2.0020.0002.1132] # HANGUL CHOSEONG SIOS-PIEUP
+317D  ; [.29E2.0020.0004.317D] # HANGUL LETTER SIOS-PIEUP; QQK
+1133  ; [.29E3.0020.0002.1133] # HANGUL CHOSEONG SIOS-PIEUP-KIYEOK
+1134  ; [.29E4.0020.0002.1134] # HANGUL CHOSEONG SIOS-SSANGSIOS
+1135  ; [.29E5.0020.0002.1135] # HANGUL CHOSEONG SIOS-IEUNG
+1136  ; [.29E6.0020.0002.1136] # HANGUL CHOSEONG SIOS-CIEUC
+317E  ; [.29E6.0020.0004.317E] # HANGUL LETTER SIOS-CIEUC; QQK
+1137  ; [.29E7.0020.0002.1137] # HANGUL CHOSEONG SIOS-CHIEUCH
+1138  ; [.29E8.0020.0002.1138] # HANGUL CHOSEONG SIOS-KHIEUKH
+1139  ; [.29E9.0020.0002.1139] # HANGUL CHOSEONG SIOS-THIEUTH
+113A  ; [.29EA.0020.0002.113A] # HANGUL CHOSEONG SIOS-PHIEUPH
+113B  ; [.29EB.0020.0002.113B] # HANGUL CHOSEONG SIOS-HIEUH
+113C  ; [.29EC.0020.0002.113C] # HANGUL CHOSEONG CHITUEUMSIOS
+113D  ; [.29ED.0020.0002.113D] # HANGUL CHOSEONG CHITUEUMSSANGSIOS
+113E  ; [.29EE.0020.0002.113E] # HANGUL CHOSEONG CEONGCHIEUMSIOS
+113F  ; [.29EF.0020.0002.113F] # HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS
+1140  ; [.29F0.0020.0002.1140] # HANGUL CHOSEONG PANSIOS
+317F  ; [.29F0.0020.0004.317F] # HANGUL LETTER PANSIOS; QQK
+1141  ; [.29F1.0020.0002.1141] # HANGUL CHOSEONG IEUNG-KIYEOK
+1142  ; [.29F2.0020.0002.1142] # HANGUL CHOSEONG IEUNG-TIKEUT
+1143  ; [.29F3.0020.0002.1143] # HANGUL CHOSEONG IEUNG-MIEUM
+1144  ; [.29F4.0020.0002.1144] # HANGUL CHOSEONG IEUNG-PIEUP
+1145  ; [.29F5.0020.0002.1145] # HANGUL CHOSEONG IEUNG-SIOS
+1146  ; [.29F6.0020.0002.1146] # HANGUL CHOSEONG IEUNG-PANSIOS
+1147  ; [.29F7.0020.0002.1147] # HANGUL CHOSEONG SSANGIEUNG
+3180  ; [.29F7.0020.0004.3180] # HANGUL LETTER SSANGIEUNG; QQK
+1148  ; [.29F8.0020.0002.1148] # HANGUL CHOSEONG IEUNG-CIEUC
+1149  ; [.29F9.0020.0002.1149] # HANGUL CHOSEONG IEUNG-CHIEUCH
+114A  ; [.29FA.0020.0002.114A] # HANGUL CHOSEONG IEUNG-THIEUTH
+114B  ; [.29FB.0020.0002.114B] # HANGUL CHOSEONG IEUNG-PHIEUPH
+114C  ; [.29FC.0020.0002.114C] # HANGUL CHOSEONG YESIEUNG
+3181  ; [.29FC.0020.0004.3181] # HANGUL LETTER YESIEUNG; QQK
+114D  ; [.29FD.0020.0002.114D] # HANGUL CHOSEONG CIEUC-IEUNG
+114E  ; [.29FE.0020.0002.114E] # HANGUL CHOSEONG CHITUEUMCIEUC
+114F  ; [.29FF.0020.0002.114F] # HANGUL CHOSEONG CHITUEUMSSANGCIEUC
+1150  ; [.2A00.0020.0002.1150] # HANGUL CHOSEONG CEONGCHIEUMCIEUC
+1151  ; [.2A01.0020.0002.1151] # HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC
+1152  ; [.2A02.0020.0002.1152] # HANGUL CHOSEONG CHIEUCH-KHIEUKH
+1153  ; [.2A03.0020.0002.1153] # HANGUL CHOSEONG CHIEUCH-HIEUH
+1154  ; [.2A04.0020.0002.1154] # HANGUL CHOSEONG CHITUEUMCHIEUCH
+1155  ; [.2A05.0020.0002.1155] # HANGUL CHOSEONG CEONGCHIEUMCHIEUCH
+1156  ; [.2A06.0020.0002.1156] # HANGUL CHOSEONG PHIEUPH-PIEUP
+1157  ; [.2A07.0020.0002.1157] # HANGUL CHOSEONG KAPYEOUNPHIEUPH
+3184  ; [.2A07.0020.0004.3184] # HANGUL LETTER KAPYEOUNPHIEUPH; QQK
+1158  ; [.2A08.0020.0002.1158] # HANGUL CHOSEONG SSANGHIEUH
+3185  ; [.2A08.0020.0004.3185] # HANGUL LETTER SSANGHIEUH; QQK
+1159  ; [.2A09.0020.0002.1159] # HANGUL CHOSEONG YEORINHIEUH
+3186  ; [.2A09.0020.0004.3186] # HANGUL LETTER YEORINHIEUH; QQK
+115A  ; [.2A0A.0020.0002.115A] # HANGUL CHOSEONG KIYEOK-TIKEUT
+115B  ; [.2A0B.0020.0002.115B] # HANGUL CHOSEONG NIEUN-SIOS
+115C  ; [.2A0C.0020.0002.115C] # HANGUL CHOSEONG NIEUN-CIEUC
+115D  ; [.2A0D.0020.0002.115D] # HANGUL CHOSEONG NIEUN-HIEUH
+115E  ; [.2A0E.0020.0002.115E] # HANGUL CHOSEONG TIKEUT-RIEUL
+A960  ; [.2A0F.0020.0002.A960] # HANGUL CHOSEONG TIKEUT-MIEUM
+A961  ; [.2A10.0020.0002.A961] # HANGUL CHOSEONG TIKEUT-PIEUP
+A962  ; [.2A11.0020.0002.A962] # HANGUL CHOSEONG TIKEUT-SIOS
+A963  ; [.2A12.0020.0002.A963] # HANGUL CHOSEONG TIKEUT-CIEUC
+A964  ; [.2A13.0020.0002.A964] # HANGUL CHOSEONG RIEUL-KIYEOK
+A965  ; [.2A14.0020.0002.A965] # HANGUL CHOSEONG RIEUL-SSANGKIYEOK
+A966  ; [.2A15.0020.0002.A966] # HANGUL CHOSEONG RIEUL-TIKEUT
+A967  ; [.2A16.0020.0002.A967] # HANGUL CHOSEONG RIEUL-SSANGTIKEUT
+A968  ; [.2A17.0020.0002.A968] # HANGUL CHOSEONG RIEUL-MIEUM
+A969  ; [.2A18.0020.0002.A969] # HANGUL CHOSEONG RIEUL-PIEUP
+A96A  ; [.2A19.0020.0002.A96A] # HANGUL CHOSEONG RIEUL-SSANGPIEUP
+A96B  ; [.2A1A.0020.0002.A96B] # HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP
+A96C  ; [.2A1B.0020.0002.A96C] # HANGUL CHOSEONG RIEUL-SIOS
+A96D  ; [.2A1C.0020.0002.A96D] # HANGUL CHOSEONG RIEUL-CIEUC
+A96E  ; [.2A1D.0020.0002.A96E] # HANGUL CHOSEONG RIEUL-KHIEUKH
+A96F  ; [.2A1E.0020.0002.A96F] # HANGUL CHOSEONG MIEUM-KIYEOK
+A970  ; [.2A1F.0020.0002.A970] # HANGUL CHOSEONG MIEUM-TIKEUT
+A971  ; [.2A20.0020.0002.A971] # HANGUL CHOSEONG MIEUM-SIOS
+A972  ; [.2A21.0020.0002.A972] # HANGUL CHOSEONG PIEUP-SIOS-THIEUTH
+A973  ; [.2A22.0020.0002.A973] # HANGUL CHOSEONG PIEUP-KHIEUKH
+A974  ; [.2A23.0020.0002.A974] # HANGUL CHOSEONG PIEUP-HIEUH
+A975  ; [.2A24.0020.0002.A975] # HANGUL CHOSEONG SSANGSIOS-PIEUP
+A976  ; [.2A25.0020.0002.A976] # HANGUL CHOSEONG IEUNG-RIEUL
+A977  ; [.2A26.0020.0002.A977] # HANGUL CHOSEONG IEUNG-HIEUH
+A978  ; [.2A27.0020.0002.A978] # HANGUL CHOSEONG SSANGCIEUC-HIEUH
+A979  ; [.2A28.0020.0002.A979] # HANGUL CHOSEONG SSANGTHIEUTH
+A97A  ; [.2A29.0020.0002.A97A] # HANGUL CHOSEONG PHIEUPH-HIEUH
+A97B  ; [.2A2A.0020.0002.A97B] # HANGUL CHOSEONG HIEUH-SIOS
+A97C  ; [.2A2B.0020.0002.A97C] # HANGUL CHOSEONG SSANGYEORINHIEUH
+115F  ; [.2A2C.0020.0002.115F] # HANGUL CHOSEONG FILLER
+1160  ; [.2A2D.0020.0002.1160] # HANGUL JUNGSEONG FILLER
+3164  ; [.2A2D.0020.0004.3164] # HANGUL FILLER; QQK
+FFA0  ; [.2A2D.0020.0012.FFA0] # HALFWIDTH HANGUL FILLER; QQK
+1161  ; [.2A2E.0020.0002.1161] # HANGUL JUNGSEONG A
+314F  ; [.2A2E.0020.0004.314F] # HANGUL LETTER A; QQK
+FFC2  ; [.2A2E.0020.0012.FFC2] # HALFWIDTH HANGUL LETTER A; QQK
+1162  ; [.2A2F.0020.0002.1162] # HANGUL JUNGSEONG AE
+3150  ; [.2A2F.0020.0004.3150] # HANGUL LETTER AE; QQK
+FFC3  ; [.2A2F.0020.0012.FFC3] # HALFWIDTH HANGUL LETTER AE; QQK
+1163  ; [.2A30.0020.0002.1163] # HANGUL JUNGSEONG YA
+3151  ; [.2A30.0020.0004.3151] # HANGUL LETTER YA; QQK
+FFC4  ; [.2A30.0020.0012.FFC4] # HALFWIDTH HANGUL LETTER YA; QQK
+1164  ; [.2A31.0020.0002.1164] # HANGUL JUNGSEONG YAE
+3152  ; [.2A31.0020.0004.3152] # HANGUL LETTER YAE; QQK
+FFC5  ; [.2A31.0020.0012.FFC5] # HALFWIDTH HANGUL LETTER YAE; QQK
+1165  ; [.2A32.0020.0002.1165] # HANGUL JUNGSEONG EO
+3153  ; [.2A32.0020.0004.3153] # HANGUL LETTER EO; QQK
+FFC6  ; [.2A32.0020.0012.FFC6] # HALFWIDTH HANGUL LETTER EO; QQK
+1166  ; [.2A33.0020.0002.1166] # HANGUL JUNGSEONG E
+3154  ; [.2A33.0020.0004.3154] # HANGUL LETTER E; QQK
+FFC7  ; [.2A33.0020.0012.FFC7] # HALFWIDTH HANGUL LETTER E; QQK
+1167  ; [.2A34.0020.0002.1167] # HANGUL JUNGSEONG YEO
+3155  ; [.2A34.0020.0004.3155] # HANGUL LETTER YEO; QQK
+FFCA  ; [.2A34.0020.0012.FFCA] # HALFWIDTH HANGUL LETTER YEO; QQK
+1168  ; [.2A35.0020.0002.1168] # HANGUL JUNGSEONG YE
+3156  ; [.2A35.0020.0004.3156] # HANGUL LETTER YE; QQK
+FFCB  ; [.2A35.0020.0012.FFCB] # HALFWIDTH HANGUL LETTER YE; QQK
+1169  ; [.2A36.0020.0002.1169] # HANGUL JUNGSEONG O
+3157  ; [.2A36.0020.0004.3157] # HANGUL LETTER O; QQK
+FFCC  ; [.2A36.0020.0012.FFCC] # HALFWIDTH HANGUL LETTER O; QQK
+116A  ; [.2A37.0020.0002.116A] # HANGUL JUNGSEONG WA
+3158  ; [.2A37.0020.0004.3158] # HANGUL LETTER WA; QQK
+FFCD  ; [.2A37.0020.0012.FFCD] # HALFWIDTH HANGUL LETTER WA; QQK
+116B  ; [.2A38.0020.0002.116B] # HANGUL JUNGSEONG WAE
+3159  ; [.2A38.0020.0004.3159] # HANGUL LETTER WAE; QQK
+FFCE  ; [.2A38.0020.0012.FFCE] # HALFWIDTH HANGUL LETTER WAE; QQK
+116C  ; [.2A39.0020.0002.116C] # HANGUL JUNGSEONG OE
+315A  ; [.2A39.0020.0004.315A] # HANGUL LETTER OE; QQK
+FFCF  ; [.2A39.0020.0012.FFCF] # HALFWIDTH HANGUL LETTER OE; QQK
+116D  ; [.2A3A.0020.0002.116D] # HANGUL JUNGSEONG YO
+315B  ; [.2A3A.0020.0004.315B] # HANGUL LETTER YO; QQK
+FFD2  ; [.2A3A.0020.0012.FFD2] # HALFWIDTH HANGUL LETTER YO; QQK
+116E  ; [.2A3B.0020.0002.116E] # HANGUL JUNGSEONG U
+315C  ; [.2A3B.0020.0004.315C] # HANGUL LETTER U; QQK
+FFD3  ; [.2A3B.0020.0012.FFD3] # HALFWIDTH HANGUL LETTER U; QQK
+116F  ; [.2A3C.0020.0002.116F] # HANGUL JUNGSEONG WEO
+315D  ; [.2A3C.0020.0004.315D] # HANGUL LETTER WEO; QQK
+FFD4  ; [.2A3C.0020.0012.FFD4] # HALFWIDTH HANGUL LETTER WEO; QQK
+1170  ; [.2A3D.0020.0002.1170] # HANGUL JUNGSEONG WE
+315E  ; [.2A3D.0020.0004.315E] # HANGUL LETTER WE; QQK
+FFD5  ; [.2A3D.0020.0012.FFD5] # HALFWIDTH HANGUL LETTER WE; QQK
+1171  ; [.2A3E.0020.0002.1171] # HANGUL JUNGSEONG WI
+315F  ; [.2A3E.0020.0004.315F] # HANGUL LETTER WI; QQK
+FFD6  ; [.2A3E.0020.0012.FFD6] # HALFWIDTH HANGUL LETTER WI; QQK
+1172  ; [.2A3F.0020.0002.1172] # HANGUL JUNGSEONG YU
+3160  ; [.2A3F.0020.0004.3160] # HANGUL LETTER YU; QQK
+FFD7  ; [.2A3F.0020.0012.FFD7] # HALFWIDTH HANGUL LETTER YU; QQK
+1173  ; [.2A40.0020.0002.1173] # HANGUL JUNGSEONG EU
+3161  ; [.2A40.0020.0004.3161] # HANGUL LETTER EU; QQK
+FFDA  ; [.2A40.0020.0012.FFDA] # HALFWIDTH HANGUL LETTER EU; QQK
+1174  ; [.2A41.0020.0002.1174] # HANGUL JUNGSEONG YI
+3162  ; [.2A41.0020.0004.3162] # HANGUL LETTER YI; QQK
+FFDB  ; [.2A41.0020.0012.FFDB] # HALFWIDTH HANGUL LETTER YI; QQK
+1175  ; [.2A42.0020.0002.1175] # HANGUL JUNGSEONG I
+3163  ; [.2A42.0020.0004.3163] # HANGUL LETTER I; QQK
+FFDC  ; [.2A42.0020.0012.FFDC] # HALFWIDTH HANGUL LETTER I; QQK
+1176  ; [.2A43.0020.0002.1176] # HANGUL JUNGSEONG A-O
+1177  ; [.2A44.0020.0002.1177] # HANGUL JUNGSEONG A-U
+1178  ; [.2A45.0020.0002.1178] # HANGUL JUNGSEONG YA-O
+1179  ; [.2A46.0020.0002.1179] # HANGUL JUNGSEONG YA-YO
+117A  ; [.2A47.0020.0002.117A] # HANGUL JUNGSEONG EO-O
+117B  ; [.2A48.0020.0002.117B] # HANGUL JUNGSEONG EO-U
+117C  ; [.2A49.0020.0002.117C] # HANGUL JUNGSEONG EO-EU
+117D  ; [.2A4A.0020.0002.117D] # HANGUL JUNGSEONG YEO-O
+117E  ; [.2A4B.0020.0002.117E] # HANGUL JUNGSEONG YEO-U
+117F  ; [.2A4C.0020.0002.117F] # HANGUL JUNGSEONG O-EO
+1180  ; [.2A4D.0020.0002.1180] # HANGUL JUNGSEONG O-E
+1181  ; [.2A4E.0020.0002.1181] # HANGUL JUNGSEONG O-YE
+1182  ; [.2A4F.0020.0002.1182] # HANGUL JUNGSEONG O-O
+1183  ; [.2A50.0020.0002.1183] # HANGUL JUNGSEONG O-U
+1184  ; [.2A51.0020.0002.1184] # HANGUL JUNGSEONG YO-YA
+3187  ; [.2A51.0020.0004.3187] # HANGUL LETTER YO-YA; QQK
+1185  ; [.2A52.0020.0002.1185] # HANGUL JUNGSEONG YO-YAE
+3188  ; [.2A52.0020.0004.3188] # HANGUL LETTER YO-YAE; QQK
+1186  ; [.2A53.0020.0002.1186] # HANGUL JUNGSEONG YO-YEO
+1187  ; [.2A54.0020.0002.1187] # HANGUL JUNGSEONG YO-O
+1188  ; [.2A55.0020.0002.1188] # HANGUL JUNGSEONG YO-I
+3189  ; [.2A55.0020.0004.3189] # HANGUL LETTER YO-I; QQK
+1189  ; [.2A56.0020.0002.1189] # HANGUL JUNGSEONG U-A
+118A  ; [.2A57.0020.0002.118A] # HANGUL JUNGSEONG U-AE
+118B  ; [.2A58.0020.0002.118B] # HANGUL JUNGSEONG U-EO-EU
+118C  ; [.2A59.0020.0002.118C] # HANGUL JUNGSEONG U-YE
+118D  ; [.2A5A.0020.0002.118D] # HANGUL JUNGSEONG U-U
+118E  ; [.2A5B.0020.0002.118E] # HANGUL JUNGSEONG YU-A
+118F  ; [.2A5C.0020.0002.118F] # HANGUL JUNGSEONG YU-EO
+1190  ; [.2A5D.0020.0002.1190] # HANGUL JUNGSEONG YU-E
+1191  ; [.2A5E.0020.0002.1191] # HANGUL JUNGSEONG YU-YEO
+318A  ; [.2A5E.0020.0004.318A] # HANGUL LETTER YU-YEO; QQK
+1192  ; [.2A5F.0020.0002.1192] # HANGUL JUNGSEONG YU-YE
+318B  ; [.2A5F.0020.0004.318B] # HANGUL LETTER YU-YE; QQK
+1193  ; [.2A60.0020.0002.1193] # HANGUL JUNGSEONG YU-U
+1194  ; [.2A61.0020.0002.1194] # HANGUL JUNGSEONG YU-I
+318C  ; [.2A61.0020.0004.318C] # HANGUL LETTER YU-I; QQK
+1195  ; [.2A62.0020.0002.1195] # HANGUL JUNGSEONG EU-U
+1196  ; [.2A63.0020.0002.1196] # HANGUL JUNGSEONG EU-EU
+1197  ; [.2A64.0020.0002.1197] # HANGUL JUNGSEONG YI-U
+1198  ; [.2A65.0020.0002.1198] # HANGUL JUNGSEONG I-A
+1199  ; [.2A66.0020.0002.1199] # HANGUL JUNGSEONG I-YA
+119A  ; [.2A67.0020.0002.119A] # HANGUL JUNGSEONG I-O
+119B  ; [.2A68.0020.0002.119B] # HANGUL JUNGSEONG I-U
+119C  ; [.2A69.0020.0002.119C] # HANGUL JUNGSEONG I-EU
+119D  ; [.2A6A.0020.0002.119D] # HANGUL JUNGSEONG I-ARAEA
+119E  ; [.2A6B.0020.0002.119E] # HANGUL JUNGSEONG ARAEA
+318D  ; [.2A6B.0020.0004.318D] # HANGUL LETTER ARAEA; QQK
+119F  ; [.2A6C.0020.0002.119F] # HANGUL JUNGSEONG ARAEA-EO
+11A0  ; [.2A6D.0020.0002.11A0] # HANGUL JUNGSEONG ARAEA-U
+11A1  ; [.2A6E.0020.0002.11A1] # HANGUL JUNGSEONG ARAEA-I
+318E  ; [.2A6E.0020.0004.318E] # HANGUL LETTER ARAEAE; QQK
+11A2  ; [.2A6F.0020.0002.11A2] # HANGUL JUNGSEONG SSANGARAEA
+11A3  ; [.2A70.0020.0002.11A3] # HANGUL JUNGSEONG A-EU
+11A4  ; [.2A71.0020.0002.11A4] # HANGUL JUNGSEONG YA-U
+11A5  ; [.2A72.0020.0002.11A5] # HANGUL JUNGSEONG YEO-YA
+11A6  ; [.2A73.0020.0002.11A6] # HANGUL JUNGSEONG O-YA
+11A7  ; [.2A74.0020.0002.11A7] # HANGUL JUNGSEONG O-YAE
+D7B0  ; [.2A75.0020.0002.D7B0] # HANGUL JUNGSEONG O-YEO
+D7B1  ; [.2A76.0020.0002.D7B1] # HANGUL JUNGSEONG O-O-I
+D7B2  ; [.2A77.0020.0002.D7B2] # HANGUL JUNGSEONG YO-A
+D7B3  ; [.2A78.0020.0002.D7B3] # HANGUL JUNGSEONG YO-AE
+D7B4  ; [.2A79.0020.0002.D7B4] # HANGUL JUNGSEONG YO-EO
+D7B5  ; [.2A7A.0020.0002.D7B5] # HANGUL JUNGSEONG U-YEO
+D7B6  ; [.2A7B.0020.0002.D7B6] # HANGUL JUNGSEONG U-I-I
+D7B7  ; [.2A7C.0020.0002.D7B7] # HANGUL JUNGSEONG YU-AE
+D7B8  ; [.2A7D.0020.0002.D7B8] # HANGUL JUNGSEONG YU-O
+D7B9  ; [.2A7E.0020.0002.D7B9] # HANGUL JUNGSEONG EU-A
+D7BA  ; [.2A7F.0020.0002.D7BA] # HANGUL JUNGSEONG EU-EO
+D7BB  ; [.2A80.0020.0002.D7BB] # HANGUL JUNGSEONG EU-E
+D7BC  ; [.2A81.0020.0002.D7BC] # HANGUL JUNGSEONG EU-O
+D7BD  ; [.2A82.0020.0002.D7BD] # HANGUL JUNGSEONG I-YA-O
+D7BE  ; [.2A83.0020.0002.D7BE] # HANGUL JUNGSEONG I-YAE
+D7BF  ; [.2A84.0020.0002.D7BF] # HANGUL JUNGSEONG I-YEO
+D7C0  ; [.2A85.0020.0002.D7C0] # HANGUL JUNGSEONG I-YE
+D7C1  ; [.2A86.0020.0002.D7C1] # HANGUL JUNGSEONG I-O-I
+D7C2  ; [.2A87.0020.0002.D7C2] # HANGUL JUNGSEONG I-YO
+D7C3  ; [.2A88.0020.0002.D7C3] # HANGUL JUNGSEONG I-YU
+D7C4  ; [.2A89.0020.0002.D7C4] # HANGUL JUNGSEONG I-I
+D7C5  ; [.2A8A.0020.0002.D7C5] # HANGUL JUNGSEONG ARAEA-A
+D7C6  ; [.2A8B.0020.0002.D7C6] # HANGUL JUNGSEONG ARAEA-E
+11A8  ; [.2A8C.0020.0002.11A8] # HANGUL JONGSEONG KIYEOK
+11A9  ; [.2A8D.0020.0002.11A9] # HANGUL JONGSEONG SSANGKIYEOK
+11AA  ; [.2A8E.0020.0002.11AA] # HANGUL JONGSEONG KIYEOK-SIOS
+3133  ; [.2A8E.0020.0004.3133] # HANGUL LETTER KIYEOK-SIOS; QQK
+FFA3  ; [.2A8E.0020.0012.FFA3] # HALFWIDTH HANGUL LETTER KIYEOK-SIOS; QQK
+11AB  ; [.2A8F.0020.0002.11AB] # HANGUL JONGSEONG NIEUN
+11AC  ; [.2A90.0020.0002.11AC] # HANGUL JONGSEONG NIEUN-CIEUC
+3135  ; [.2A90.0020.0004.3135] # HANGUL LETTER NIEUN-CIEUC; QQK
+FFA5  ; [.2A90.0020.0012.FFA5] # HALFWIDTH HANGUL LETTER NIEUN-CIEUC; QQK
+11AD  ; [.2A91.0020.0002.11AD] # HANGUL JONGSEONG NIEUN-HIEUH
+3136  ; [.2A91.0020.0004.3136] # HANGUL LETTER NIEUN-HIEUH; QQK
+FFA6  ; [.2A91.0020.0012.FFA6] # HALFWIDTH HANGUL LETTER NIEUN-HIEUH; QQK
+11AE  ; [.2A92.0020.0002.11AE] # HANGUL JONGSEONG TIKEUT
+11AF  ; [.2A93.0020.0002.11AF] # HANGUL JONGSEONG RIEUL
+11B0  ; [.2A94.0020.0002.11B0] # HANGUL JONGSEONG RIEUL-KIYEOK
+313A  ; [.2A94.0020.0004.313A] # HANGUL LETTER RIEUL-KIYEOK; QQK
+FFAA  ; [.2A94.0020.0012.FFAA] # HALFWIDTH HANGUL LETTER RIEUL-KIYEOK; QQK
+11B1  ; [.2A95.0020.0002.11B1] # HANGUL JONGSEONG RIEUL-MIEUM
+313B  ; [.2A95.0020.0004.313B] # HANGUL LETTER RIEUL-MIEUM; QQK
+FFAB  ; [.2A95.0020.0012.FFAB] # HALFWIDTH HANGUL LETTER RIEUL-MIEUM; QQK
+11B2  ; [.2A96.0020.0002.11B2] # HANGUL JONGSEONG RIEUL-PIEUP
+313C  ; [.2A96.0020.0004.313C] # HANGUL LETTER RIEUL-PIEUP; QQK
+FFAC  ; [.2A96.0020.0012.FFAC] # HALFWIDTH HANGUL LETTER RIEUL-PIEUP; QQK
+11B3  ; [.2A97.0020.0002.11B3] # HANGUL JONGSEONG RIEUL-SIOS
+313D  ; [.2A97.0020.0004.313D] # HANGUL LETTER RIEUL-SIOS; QQK
+FFAD  ; [.2A97.0020.0012.FFAD] # HALFWIDTH HANGUL LETTER RIEUL-SIOS; QQK
+11B4  ; [.2A98.0020.0002.11B4] # HANGUL JONGSEONG RIEUL-THIEUTH
+313E  ; [.2A98.0020.0004.313E] # HANGUL LETTER RIEUL-THIEUTH; QQK
+FFAE  ; [.2A98.0020.0012.FFAE] # HALFWIDTH HANGUL LETTER RIEUL-THIEUTH; QQK
+11B5  ; [.2A99.0020.0002.11B5] # HANGUL JONGSEONG RIEUL-PHIEUPH
+313F  ; [.2A99.0020.0004.313F] # HANGUL LETTER RIEUL-PHIEUPH; QQK
+FFAF  ; [.2A99.0020.0012.FFAF] # HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH; QQK
+11B6  ; [.2A9A.0020.0002.11B6] # HANGUL JONGSEONG RIEUL-HIEUH
+11B7  ; [.2A9B.0020.0002.11B7] # HANGUL JONGSEONG MIEUM
+11B8  ; [.2A9C.0020.0002.11B8] # HANGUL JONGSEONG PIEUP
+11B9  ; [.2A9D.0020.0002.11B9] # HANGUL JONGSEONG PIEUP-SIOS
+11BA  ; [.2A9E.0020.0002.11BA] # HANGUL JONGSEONG SIOS
+11BB  ; [.2A9F.0020.0002.11BB] # HANGUL JONGSEONG SSANGSIOS
+11BC  ; [.2AA0.0020.0002.11BC] # HANGUL JONGSEONG IEUNG
+11BD  ; [.2AA1.0020.0002.11BD] # HANGUL JONGSEONG CIEUC
+11BE  ; [.2AA2.0020.0002.11BE] # HANGUL JONGSEONG CHIEUCH
+11BF  ; [.2AA3.0020.0002.11BF] # HANGUL JONGSEONG KHIEUKH
+11C0  ; [.2AA4.0020.0002.11C0] # HANGUL JONGSEONG THIEUTH
+11C1  ; [.2AA5.0020.0002.11C1] # HANGUL JONGSEONG PHIEUPH
+11C2  ; [.2AA6.0020.0002.11C2] # HANGUL JONGSEONG HIEUH
+11C3  ; [.2AA7.0020.0002.11C3] # HANGUL JONGSEONG KIYEOK-RIEUL
+11C4  ; [.2AA8.0020.0002.11C4] # HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK
+11C5  ; [.2AA9.0020.0002.11C5] # HANGUL JONGSEONG NIEUN-KIYEOK
+11C6  ; [.2AAA.0020.0002.11C6] # HANGUL JONGSEONG NIEUN-TIKEUT
+11C7  ; [.2AAB.0020.0002.11C7] # HANGUL JONGSEONG NIEUN-SIOS
+3167  ; [.2AAB.0020.0004.3167] # HANGUL LETTER NIEUN-SIOS; QQK
+11C8  ; [.2AAC.0020.0002.11C8] # HANGUL JONGSEONG NIEUN-PANSIOS
+3168  ; [.2AAC.0020.0004.3168] # HANGUL LETTER NIEUN-PANSIOS; QQK
+11C9  ; [.2AAD.0020.0002.11C9] # HANGUL JONGSEONG NIEUN-THIEUTH
+11CA  ; [.2AAE.0020.0002.11CA] # HANGUL JONGSEONG TIKEUT-KIYEOK
+11CB  ; [.2AAF.0020.0002.11CB] # HANGUL JONGSEONG TIKEUT-RIEUL
+11CC  ; [.2AB0.0020.0002.11CC] # HANGUL JONGSEONG RIEUL-KIYEOK-SIOS
+3169  ; [.2AB0.0020.0004.3169] # HANGUL LETTER RIEUL-KIYEOK-SIOS; QQK
+11CD  ; [.2AB1.0020.0002.11CD] # HANGUL JONGSEONG RIEUL-NIEUN
+11CE  ; [.2AB2.0020.0002.11CE] # HANGUL JONGSEONG RIEUL-TIKEUT
+316A  ; [.2AB2.0020.0004.316A] # HANGUL LETTER RIEUL-TIKEUT; QQK
+11CF  ; [.2AB3.0020.0002.11CF] # HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH
+11D0  ; [.2AB4.0020.0002.11D0] # HANGUL JONGSEONG SSANGRIEUL
+11D1  ; [.2AB5.0020.0002.11D1] # HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK
+11D2  ; [.2AB6.0020.0002.11D2] # HANGUL JONGSEONG RIEUL-MIEUM-SIOS
+11D3  ; [.2AB7.0020.0002.11D3] # HANGUL JONGSEONG RIEUL-PIEUP-SIOS
+316B  ; [.2AB7.0020.0004.316B] # HANGUL LETTER RIEUL-PIEUP-SIOS; QQK
+11D4  ; [.2AB8.0020.0002.11D4] # HANGUL JONGSEONG RIEUL-PIEUP-HIEUH
+11D5  ; [.2AB9.0020.0002.11D5] # HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP
+11D6  ; [.2ABA.0020.0002.11D6] # HANGUL JONGSEONG RIEUL-SSANGSIOS
+11D7  ; [.2ABB.0020.0002.11D7] # HANGUL JONGSEONG RIEUL-PANSIOS
+316C  ; [.2ABB.0020.0004.316C] # HANGUL LETTER RIEUL-PANSIOS; QQK
+11D8  ; [.2ABC.0020.0002.11D8] # HANGUL JONGSEONG RIEUL-KHIEUKH
+11D9  ; [.2ABD.0020.0002.11D9] # HANGUL JONGSEONG RIEUL-YEORINHIEUH
+316D  ; [.2ABD.0020.0004.316D] # HANGUL LETTER RIEUL-YEORINHIEUH; QQK
+11DA  ; [.2ABE.0020.0002.11DA] # HANGUL JONGSEONG MIEUM-KIYEOK
+11DB  ; [.2ABF.0020.0002.11DB] # HANGUL JONGSEONG MIEUM-RIEUL
+11DC  ; [.2AC0.0020.0002.11DC] # HANGUL JONGSEONG MIEUM-PIEUP
+11DD  ; [.2AC1.0020.0002.11DD] # HANGUL JONGSEONG MIEUM-SIOS
+316F  ; [.2AC1.0020.0004.316F] # HANGUL LETTER MIEUM-SIOS; QQK
+11DE  ; [.2AC2.0020.0002.11DE] # HANGUL JONGSEONG MIEUM-SSANGSIOS
+11DF  ; [.2AC3.0020.0002.11DF] # HANGUL JONGSEONG MIEUM-PANSIOS
+3170  ; [.2AC3.0020.0004.3170] # HANGUL LETTER MIEUM-PANSIOS; QQK
+11E0  ; [.2AC4.0020.0002.11E0] # HANGUL JONGSEONG MIEUM-CHIEUCH
+11E1  ; [.2AC5.0020.0002.11E1] # HANGUL JONGSEONG MIEUM-HIEUH
+11E2  ; [.2AC6.0020.0002.11E2] # HANGUL JONGSEONG KAPYEOUNMIEUM
+11E3  ; [.2AC7.0020.0002.11E3] # HANGUL JONGSEONG PIEUP-RIEUL
+11E4  ; [.2AC8.0020.0002.11E4] # HANGUL JONGSEONG PIEUP-PHIEUPH
+11E5  ; [.2AC9.0020.0002.11E5] # HANGUL JONGSEONG PIEUP-HIEUH
+11E6  ; [.2ACA.0020.0002.11E6] # HANGUL JONGSEONG KAPYEOUNPIEUP
+11E7  ; [.2ACB.0020.0002.11E7] # HANGUL JONGSEONG SIOS-KIYEOK
+11E8  ; [.2ACC.0020.0002.11E8] # HANGUL JONGSEONG SIOS-TIKEUT
+11E9  ; [.2ACD.0020.0002.11E9] # HANGUL JONGSEONG SIOS-RIEUL
+11EA  ; [.2ACE.0020.0002.11EA] # HANGUL JONGSEONG SIOS-PIEUP
+11EB  ; [.2ACF.0020.0002.11EB] # HANGUL JONGSEONG PANSIOS
+11EC  ; [.2AD0.0020.0002.11EC] # HANGUL JONGSEONG IEUNG-KIYEOK
+11ED  ; [.2AD1.0020.0002.11ED] # HANGUL JONGSEONG IEUNG-SSANGKIYEOK
+11EE  ; [.2AD2.0020.0002.11EE] # HANGUL JONGSEONG SSANGIEUNG
+11EF  ; [.2AD3.0020.0002.11EF] # HANGUL JONGSEONG IEUNG-KHIEUKH
+11F0  ; [.2AD4.0020.0002.11F0] # HANGUL JONGSEONG YESIEUNG
+11F1  ; [.2AD5.0020.0002.11F1] # HANGUL JONGSEONG YESIEUNG-SIOS
+3182  ; [.2AD5.0020.0004.3182] # HANGUL LETTER YESIEUNG-SIOS; QQK
+11F2  ; [.2AD6.0020.0002.11F2] # HANGUL JONGSEONG YESIEUNG-PANSIOS
+3183  ; [.2AD6.0020.0004.3183] # HANGUL LETTER YESIEUNG-PANSIOS; QQK
+11F3  ; [.2AD7.0020.0002.11F3] # HANGUL JONGSEONG PHIEUPH-PIEUP
+11F4  ; [.2AD8.0020.0002.11F4] # HANGUL JONGSEONG KAPYEOUNPHIEUPH
+11F5  ; [.2AD9.0020.0002.11F5] # HANGUL JONGSEONG HIEUH-NIEUN
+11F6  ; [.2ADA.0020.0002.11F6] # HANGUL JONGSEONG HIEUH-RIEUL
+11F7  ; [.2ADB.0020.0002.11F7] # HANGUL JONGSEONG HIEUH-MIEUM
+11F8  ; [.2ADC.0020.0002.11F8] # HANGUL JONGSEONG HIEUH-PIEUP
+11F9  ; [.2ADD.0020.0002.11F9] # HANGUL JONGSEONG YEORINHIEUH
+11FA  ; [.2ADE.0020.0002.11FA] # HANGUL JONGSEONG KIYEOK-NIEUN
+11FB  ; [.2ADF.0020.0002.11FB] # HANGUL JONGSEONG KIYEOK-PIEUP
+11FC  ; [.2AE0.0020.0002.11FC] # HANGUL JONGSEONG KIYEOK-CHIEUCH
+11FD  ; [.2AE1.0020.0002.11FD] # HANGUL JONGSEONG KIYEOK-KHIEUKH
+11FE  ; [.2AE2.0020.0002.11FE] # HANGUL JONGSEONG KIYEOK-HIEUH
+11FF  ; [.2AE3.0020.0002.11FF] # HANGUL JONGSEONG SSANGNIEUN
+D7CB  ; [.2AE4.0020.0002.D7CB] # HANGUL JONGSEONG NIEUN-RIEUL
+D7CC  ; [.2AE5.0020.0002.D7CC] # HANGUL JONGSEONG NIEUN-CHIEUCH
+D7CD  ; [.2AE6.0020.0002.D7CD] # HANGUL JONGSEONG SSANGTIKEUT
+D7CE  ; [.2AE7.0020.0002.D7CE] # HANGUL JONGSEONG SSANGTIKEUT-PIEUP
+D7CF  ; [.2AE8.0020.0002.D7CF] # HANGUL JONGSEONG TIKEUT-PIEUP
+D7D0  ; [.2AE9.0020.0002.D7D0] # HANGUL JONGSEONG TIKEUT-SIOS
+D7D1  ; [.2AEA.0020.0002.D7D1] # HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK
+D7D2  ; [.2AEB.0020.0002.D7D2] # HANGUL JONGSEONG TIKEUT-CIEUC
+D7D3  ; [.2AEC.0020.0002.D7D3] # HANGUL JONGSEONG TIKEUT-CHIEUCH
+D7D4  ; [.2AED.0020.0002.D7D4] # HANGUL JONGSEONG TIKEUT-THIEUTH
+D7D5  ; [.2AEE.0020.0002.D7D5] # HANGUL JONGSEONG RIEUL-SSANGKIYEOK
+D7D6  ; [.2AEF.0020.0002.D7D6] # HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH
+D7D7  ; [.2AF0.0020.0002.D7D7] # HANGUL JONGSEONG SSANGRIEUL-KHIEUKH
+D7D8  ; [.2AF1.0020.0002.D7D8] # HANGUL JONGSEONG RIEUL-MIEUM-HIEUH
+D7D9  ; [.2AF2.0020.0002.D7D9] # HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT
+D7DA  ; [.2AF3.0020.0002.D7DA] # HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH
+D7DB  ; [.2AF4.0020.0002.D7DB] # HANGUL JONGSEONG RIEUL-YESIEUNG
+D7DC  ; [.2AF5.0020.0002.D7DC] # HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH
+D7DD  ; [.2AF6.0020.0002.D7DD] # HANGUL JONGSEONG KAPYEOUNRIEUL
+D7DE  ; [.2AF7.0020.0002.D7DE] # HANGUL JONGSEONG MIEUM-NIEUN
+D7DF  ; [.2AF8.0020.0002.D7DF] # HANGUL JONGSEONG MIEUM-SSANGNIEUN
+D7E0  ; [.2AF9.0020.0002.D7E0] # HANGUL JONGSEONG SSANGMIEUM
+D7E1  ; [.2AFA.0020.0002.D7E1] # HANGUL JONGSEONG MIEUM-PIEUP-SIOS
+D7E2  ; [.2AFB.0020.0002.D7E2] # HANGUL JONGSEONG MIEUM-CIEUC
+D7E3  ; [.2AFC.0020.0002.D7E3] # HANGUL JONGSEONG PIEUP-TIKEUT
+D7E4  ; [.2AFD.0020.0002.D7E4] # HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH
+D7E5  ; [.2AFE.0020.0002.D7E5] # HANGUL JONGSEONG PIEUP-MIEUM
+D7E6  ; [.2AFF.0020.0002.D7E6] # HANGUL JONGSEONG SSANGPIEUP
+D7E7  ; [.2B00.0020.0002.D7E7] # HANGUL JONGSEONG PIEUP-SIOS-TIKEUT
+D7E8  ; [.2B01.0020.0002.D7E8] # HANGUL JONGSEONG PIEUP-CIEUC
+D7E9  ; [.2B02.0020.0002.D7E9] # HANGUL JONGSEONG PIEUP-CHIEUCH
+D7EA  ; [.2B03.0020.0002.D7EA] # HANGUL JONGSEONG SIOS-MIEUM
+D7EB  ; [.2B04.0020.0002.D7EB] # HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP
+D7EC  ; [.2B05.0020.0002.D7EC] # HANGUL JONGSEONG SSANGSIOS-KIYEOK
+D7ED  ; [.2B06.0020.0002.D7ED] # HANGUL JONGSEONG SSANGSIOS-TIKEUT
+D7EE  ; [.2B07.0020.0002.D7EE] # HANGUL JONGSEONG SIOS-PANSIOS
+D7EF  ; [.2B08.0020.0002.D7EF] # HANGUL JONGSEONG SIOS-CIEUC
+D7F0  ; [.2B09.0020.0002.D7F0] # HANGUL JONGSEONG SIOS-CHIEUCH
+D7F1  ; [.2B0A.0020.0002.D7F1] # HANGUL JONGSEONG SIOS-THIEUTH
+D7F2  ; [.2B0B.0020.0002.D7F2] # HANGUL JONGSEONG SIOS-HIEUH
+D7F3  ; [.2B0C.0020.0002.D7F3] # HANGUL JONGSEONG PANSIOS-PIEUP
+D7F4  ; [.2B0D.0020.0002.D7F4] # HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP
+D7F5  ; [.2B0E.0020.0002.D7F5] # HANGUL JONGSEONG YESIEUNG-MIEUM
+D7F6  ; [.2B0F.0020.0002.D7F6] # HANGUL JONGSEONG YESIEUNG-HIEUH
+D7F7  ; [.2B10.0020.0002.D7F7] # HANGUL JONGSEONG CIEUC-PIEUP
+D7F8  ; [.2B11.0020.0002.D7F8] # HANGUL JONGSEONG CIEUC-SSANGPIEUP
+D7F9  ; [.2B12.0020.0002.D7F9] # HANGUL JONGSEONG SSANGCIEUC
+D7FA  ; [.2B13.0020.0002.D7FA] # HANGUL JONGSEONG PHIEUPH-SIOS
+D7FB  ; [.2B14.0020.0002.D7FB] # HANGUL JONGSEONG PHIEUPH-THIEUTH
+3041  ; [.2B15.0020.000D.3041] # HIRAGANA LETTER SMALL A
+3042  ; [.2B15.0020.000E.3042] # HIRAGANA LETTER A
+30A1  ; [.2B15.0020.000F.30A1] # KATAKANA LETTER SMALL A
+FF67  ; [.2B15.0020.0010.FF67] # HALFWIDTH KATAKANA LETTER SMALL A; QQK
+30A2  ; [.2B15.0020.0011.30A2] # KATAKANA LETTER A
+FF71  ; [.2B15.0020.0012.FF71] # HALFWIDTH KATAKANA LETTER A; QQK
+32D0  ; [.2B15.0020.0013.32D0] # CIRCLED KATAKANA A; QQK
+3303  ; [.2B15.0020.001C.3303][.11DD.0020.001C.3303][.2B3D.0020.001F.3303] # SQUARE AARU; QQKN
+3300  ; [.2B15.0020.001C.3300][.2B2E.0020.001C.3300][.0000.0149.001F.3300][.11DD.0020.001F.3300][.2B28.0020.001F.3300] # SQUARE APAATO; QQKN
+3301  ; [.2B15.0020.001C.3301][.2B3D.0020.001C.3301][.2B30.0020.001F.3301][.2B15.0020.001F.3301] # SQUARE ARUHUA; QQKN
+3302  ; [.2B15.0020.001C.3302][.2B44.0020.001C.3302][.2B31.0020.001F.3302][.0000.0149.001F.3302][.2B15.0020.001F.3302] # SQUARE ANPEA; QQKN
+3043  ; [.2B16.0020.000D.3043] # HIRAGANA LETTER SMALL I
+3044  ; [.2B16.0020.000E.3044] # HIRAGANA LETTER I
+30A3  ; [.2B16.0020.000F.30A3] # KATAKANA LETTER SMALL I
+FF68  ; [.2B16.0020.0010.FF68] # HALFWIDTH KATAKANA LETTER SMALL I; QQK
+30A4  ; [.2B16.0020.0011.30A4] # KATAKANA LETTER I
+FF72  ; [.2B16.0020.0012.FF72] # HALFWIDTH KATAKANA LETTER I; QQK
+32D1  ; [.2B16.0020.0013.32D1] # CIRCLED KATAKANA I; QQK
+3304  ; [.2B16.0020.001C.3304][.2B2A.0020.001C.3304][.2B44.0020.001F.3304][.2B1C.0020.001F.3304][.0000.0148.001F.3304] # SQUARE ININGU; QQKN
+3305  ; [.2B16.0020.001C.3305][.2B44.0020.001C.3305][.2B25.0020.001F.3305] # SQUARE INTI; QQKN
+3045  ; [.2B17.0020.000D.3045] # HIRAGANA LETTER SMALL U
+3046  ; [.2B17.0020.000E.3046] # HIRAGANA LETTER U
+30A5  ; [.2B17.0020.000F.30A5] # KATAKANA LETTER SMALL U
+FF69  ; [.2B17.0020.0010.FF69] # HALFWIDTH KATAKANA LETTER SMALL U; QQK
+30A6  ; [.2B17.0020.0011.30A6] # KATAKANA LETTER U
+FF73  ; [.2B17.0020.0012.FF73] # HALFWIDTH KATAKANA LETTER U; QQK
+32D2  ; [.2B17.0020.0013.32D2] # CIRCLED KATAKANA U; QQK
+3094  ; [.2B17.0020.000E.3046][.0000.0148.0002.3099] # HIRAGANA LETTER VU; QQCM
+30F4  ; [.2B17.0020.0011.30A6][.0000.0148.0002.3099] # KATAKANA LETTER VU; QQCM
+3306  ; [.2B17.0020.001C.3306][.2B19.0020.001C.3306][.2B44.0020.001F.3306] # SQUARE UON; QQKN
+3047  ; [.2B18.0020.000D.3047] # HIRAGANA LETTER SMALL E
+3048  ; [.2B18.0020.000E.3048] # HIRAGANA LETTER E
+30A7  ; [.2B18.0020.000F.30A7] # KATAKANA LETTER SMALL E
+FF6A  ; [.2B18.0020.0010.FF6A] # HALFWIDTH KATAKANA LETTER SMALL E; QQK
+30A8  ; [.2B18.0020.0011.30A8] # KATAKANA LETTER E
+FF74  ; [.2B18.0020.0012.FF74] # HALFWIDTH KATAKANA LETTER E; QQK
+32D3  ; [.2B18.0020.0013.32D3] # CIRCLED KATAKANA E; QQK
+3308  ; [.2B18.0020.001C.3308][.11DD.0020.001C.3308][.2B1A.0020.001F.3308][.11DD.0020.001F.3308] # SQUARE EEKAA; QQKN
+3307  ; [.2B18.0020.001C.3307][.2B21.0020.001C.3307][.2B1C.0020.001F.3307][.11DD.0020.001F.3307][.2B28.0020.001F.3307][.0000.0148.001F.3307] # SQUARE ESUKUUDO; QQKN
+3049  ; [.2B19.0020.000D.3049] # HIRAGANA LETTER SMALL O
+304A  ; [.2B19.0020.000E.304A] # HIRAGANA LETTER O
+30A9  ; [.2B19.0020.000F.30A9] # KATAKANA LETTER SMALL O
+FF6B  ; [.2B19.0020.0010.FF6B] # HALFWIDTH KATAKANA LETTER SMALL O; QQK
+30AA  ; [.2B19.0020.0011.30AA] # KATAKANA LETTER O
+FF75  ; [.2B19.0020.0012.FF75] # HALFWIDTH KATAKANA LETTER O; QQK
+32D4  ; [.2B19.0020.0013.32D4] # CIRCLED KATAKANA O; QQK
+330A  ; [.2B19.0020.001C.330A][.11DD.0020.001C.330A][.2B35.0020.001F.330A] # SQUARE OOMU; QQKN
+3309  ; [.2B19.0020.001C.3309][.2B44.0020.001C.3309][.2B21.0020.001F.3309] # SQUARE ONSU; QQKN
+3095  ; [.2B1A.0020.000D.3095] # HIRAGANA LETTER SMALL KA
+304B  ; [.2B1A.0020.000E.304B] # HIRAGANA LETTER KA
+30F5  ; [.2B1A.0020.000F.30F5] # KATAKANA LETTER SMALL KA
+30AB  ; [.2B1A.0020.0011.30AB] # KATAKANA LETTER KA
+FF76  ; [.2B1A.0020.0012.FF76] # HALFWIDTH KATAKANA LETTER KA; QQK
+32D5  ; [.2B1A.0020.0013.32D5] # CIRCLED KATAKANA KA; QQK
+304C  ; [.2B1A.0020.000E.304B][.0000.0148.0002.3099] # HIRAGANA LETTER GA; QQCM
+30AC  ; [.2B1A.0020.0011.30AB][.0000.0148.0002.3099] # KATAKANA LETTER GA; QQCM
+330B  ; [.2B1A.0020.001C.330B][.2B16.0020.001C.330B][.2B3C.0020.001F.330B] # SQUARE KAIRI; QQKN
+330C  ; [.2B1A.0020.001C.330C][.2B3B.0020.001C.330C][.2B26.0020.001F.330C][.2B28.0020.001F.330C] # SQUARE KARATTO; QQKN
+330D  ; [.2B1A.0020.001C.330D][.2B3F.0020.001C.330D][.2B3C.0020.001F.330D][.11DD.0020.001F.330D] # SQUARE KARORII; QQKN
+330E  ; [.2B1A.0020.001C.330E][.0000.0148.001C.330E][.2B3F.0020.001F.330E][.2B44.0020.001F.330E] # SQUARE GARON; QQKN
+330F  ; [.2B1A.0020.001C.330F][.0000.0148.001C.330F][.2B44.0020.001F.330F][.2B33.0020.001F.330F] # SQUARE GANMA; QQKN
+304D  ; [.2B1B.0020.000E.304D] # HIRAGANA LETTER KI
+30AD  ; [.2B1B.0020.0011.30AD] # KATAKANA LETTER KI
+FF77  ; [.2B1B.0020.0012.FF77] # HALFWIDTH KATAKANA LETTER KI; QQK
+32D6  ; [.2B1B.0020.0013.32D6] # CIRCLED KATAKANA KI; QQK
+304E  ; [.2B1B.0020.000E.304D][.0000.0148.0002.3099] # HIRAGANA LETTER GI; QQCM
+30AE  ; [.2B1B.0020.0011.30AD][.0000.0148.0002.3099] # KATAKANA LETTER GI; QQCM
+3310  ; [.2B1B.0020.001C.3310][.0000.0148.001C.3310][.2B1A.0020.001F.3310][.0000.0148.001F.3310] # SQUARE GIGA; QQKN
+3311  ; [.2B1B.0020.001C.3311][.0000.0148.001C.3311][.2B2A.0020.001F.3311][.11DD.0020.001F.3311] # SQUARE GINII; QQKN
+3312  ; [.2B1B.0020.001C.3312][.2B39.0020.001C.3312][.2B3C.0020.001F.3312][.11DD.0020.001F.3312] # SQUARE KYURII; QQKN
+3313  ; [.2B1B.0020.001C.3313][.0000.0148.001C.3313][.2B3D.0020.001F.3313][.2B24.0020.001F.3313][.0000.0148.001F.3313][.11DD.0020.001F.3313] # SQUARE GIRUDAA; QQKN
+3314  ; [.2B1B.0020.001C.3314][.2B3F.0020.001C.3314] # SQUARE KIRO; QQKN
+3315  ; [.2B1B.0020.001C.3315][.2B3F.0020.001C.3315][.2B1C.0020.001F.3315][.0000.0148.001F.3315][.2B3B.0020.001F.3315][.2B35.0020.001F.3315] # SQUARE KIROGURAMU; QQKN
+3316  ; [.2B1B.0020.001C.3316][.2B3F.0020.001C.3316][.2B36.0020.001F.3316][.11DD.0020.001F.3316][.2B28.0020.001F.3316][.2B3D.0020.001F.3316] # SQUARE KIROMEETORU; QQKN
+3317  ; [.2B1B.0020.001C.3317][.2B3F.0020.001C.3317][.2B40.0020.001F.3317][.2B26.0020.001F.3317][.2B28.0020.001F.3317] # SQUARE KIROWATTO; QQKN
+304F  ; [.2B1C.0020.000E.304F] # HIRAGANA LETTER KU
+31F0  ; [.2B1C.0020.000F.31F0] # KATAKANA LETTER SMALL KU
+30AF  ; [.2B1C.0020.0011.30AF] # KATAKANA LETTER KU
+FF78  ; [.2B1C.0020.0012.FF78] # HALFWIDTH KATAKANA LETTER KU; QQK
+32D7  ; [.2B1C.0020.0013.32D7] # CIRCLED KATAKANA KU; QQK
+3050  ; [.2B1C.0020.000E.304F][.0000.0148.0002.3099] # HIRAGANA LETTER GU; QQCM
+30B0  ; [.2B1C.0020.0011.30AF][.0000.0148.0002.3099] # KATAKANA LETTER GU; QQCM
+3318  ; [.2B1C.0020.001C.3318][.0000.0148.001C.3318][.2B3B.0020.001F.3318][.2B35.0020.001F.3318] # SQUARE GURAMU; QQKN
+3319  ; [.2B1C.0020.001C.3319][.0000.0148.001C.3319][.2B3B.0020.001F.3319][.2B35.0020.001F.3319][.2B28.0020.001F.3319][.2B44.0020.001F.3319] # SQUARE GURAMUTON; QQKN
+331A  ; [.2B1C.0020.001C.331A][.2B3D.0020.001C.331A][.2B22.0020.001F.331A][.0000.0148.001F.331A][.2B16.0020.001F.331A][.2B3F.0020.001F.331A] # SQUARE KURUZEIRO; QQKN
+331B  ; [.2B1C.0020.001C.331B][.2B3F.0020.001C.331B][.11DD.0020.001F.331B][.2B2C.0020.001F.331B] # SQUARE KUROONE; QQKN
+3096  ; [.2B1D.0020.000D.3096] # HIRAGANA LETTER SMALL KE
+3051  ; [.2B1D.0020.000E.3051] # HIRAGANA LETTER KE
+30F6  ; [.2B1D.0020.000F.30F6] # KATAKANA LETTER SMALL KE
+30B1  ; [.2B1D.0020.0011.30B1] # KATAKANA LETTER KE
+FF79  ; [.2B1D.0020.0012.FF79] # HALFWIDTH KATAKANA LETTER KE; QQK
+32D8  ; [.2B1D.0020.0013.32D8] # CIRCLED KATAKANA KE; QQK
+3052  ; [.2B1D.0020.000E.3051][.0000.0148.0002.3099] # HIRAGANA LETTER GE; QQCM
+30B2  ; [.2B1D.0020.0011.30B1][.0000.0148.0002.3099] # KATAKANA LETTER GE; QQCM
+331C  ; [.2B1D.0020.001C.331C][.11DD.0020.001C.331C][.2B21.0020.001F.331C] # SQUARE KEESU; QQKN
+3053  ; [.2B1E.0020.000E.3053] # HIRAGANA LETTER KO
+30B3  ; [.2B1E.0020.0011.30B3] # KATAKANA LETTER KO
+FF7A  ; [.2B1E.0020.0012.FF7A] # HALFWIDTH KATAKANA LETTER KO; QQK
+32D9  ; [.2B1E.0020.0013.32D9] # CIRCLED KATAKANA KO; QQK
+3054  ; [.2B1E.0020.000E.3053][.0000.0148.0002.3099] # HIRAGANA LETTER GO; QQCM
+30B4  ; [.2B1E.0020.0011.30B3][.0000.0148.0002.3099] # KATAKANA LETTER GO; QQCM
+331E  ; [.2B1E.0020.001C.331E][.11DD.0020.001C.331E][.2B32.0020.001F.331E][.0000.0149.001F.331E] # SQUARE KOOPO; QQKN
+30FF  ; [.2B1E.0020.0016.30FF][.2B28.0020.0016.30FF] # KATAKANA DIGRAPH KOTO; QQKN
+331D  ; [.2B1E.0020.001C.331D][.2B3D.0020.001C.331D][.2B29.0020.001F.331D] # SQUARE KORUNA; QQKN
+3055  ; [.2B1F.0020.000E.3055] # HIRAGANA LETTER SA
+30B5  ; [.2B1F.0020.0011.30B5] # KATAKANA LETTER SA
+FF7B  ; [.2B1F.0020.0012.FF7B] # HALFWIDTH KATAKANA LETTER SA; QQK
+32DA  ; [.2B1F.0020.0013.32DA] # CIRCLED KATAKANA SA; QQK
+3056  ; [.2B1F.0020.000E.3055][.0000.0148.0002.3099] # HIRAGANA LETTER ZA; QQCM
+30B6  ; [.2B1F.0020.0011.30B5][.0000.0148.0002.3099] # KATAKANA LETTER ZA; QQCM
+331F  ; [.2B1F.0020.001C.331F][.2B16.0020.001C.331F][.2B1C.0020.001F.331F][.2B3D.0020.001F.331F] # SQUARE SAIKURU; QQKN
+3320  ; [.2B1F.0020.001C.3320][.2B44.0020.001C.3320][.2B25.0020.001F.3320][.11DD.0020.001F.3320][.2B35.0020.001F.3320] # SQUARE SANTIIMU; QQKN
+3057  ; [.2B20.0020.000E.3057] # HIRAGANA LETTER SI
+31F1  ; [.2B20.0020.000F.31F1] # KATAKANA LETTER SMALL SI
+30B7  ; [.2B20.0020.0011.30B7] # KATAKANA LETTER SI
+FF7C  ; [.2B20.0020.0012.FF7C] # HALFWIDTH KATAKANA LETTER SI; QQK
+32DB  ; [.2B20.0020.0013.32DB] # CIRCLED KATAKANA SI; QQK
+3058  ; [.2B20.0020.000E.3057][.0000.0148.0002.3099] # HIRAGANA LETTER ZI; QQCM
+30B8  ; [.2B20.0020.0011.30B7][.0000.0148.0002.3099] # KATAKANA LETTER ZI; QQCM
+3006  ; [.2B20.0020.0004.3006][.2B36.0020.0004.3006] # IDEOGRAPHIC CLOSING MARK; QQKN
+3321  ; [.2B20.0020.001C.3321][.2B3C.0020.001C.3321][.2B44.0020.001F.3321][.2B1C.0020.001F.3321][.0000.0148.001F.3321] # SQUARE SIRINGU; QQKN
+3059  ; [.2B21.0020.000E.3059] # HIRAGANA LETTER SU
+31F2  ; [.2B21.0020.000F.31F2] # KATAKANA LETTER SMALL SU
+30B9  ; [.2B21.0020.0011.30B9] # KATAKANA LETTER SU
+FF7D  ; [.2B21.0020.0012.FF7D] # HALFWIDTH KATAKANA LETTER SU; QQK
+32DC  ; [.2B21.0020.0013.32DC] # CIRCLED KATAKANA SU; QQK
+305A  ; [.2B21.0020.000E.3059][.0000.0148.0002.3099] # HIRAGANA LETTER ZU; QQCM
+30BA  ; [.2B21.0020.0011.30B9][.0000.0148.0002.3099] # KATAKANA LETTER ZU; QQCM
+305B  ; [.2B22.0020.000E.305B] # HIRAGANA LETTER SE
+30BB  ; [.2B22.0020.0011.30BB] # KATAKANA LETTER SE
+FF7E  ; [.2B22.0020.0012.FF7E] # HALFWIDTH KATAKANA LETTER SE; QQK
+32DD  ; [.2B22.0020.0013.32DD] # CIRCLED KATAKANA SE; QQK
+305C  ; [.2B22.0020.000E.305B][.0000.0148.0002.3099] # HIRAGANA LETTER ZE; QQCM
+30BC  ; [.2B22.0020.0011.30BB][.0000.0148.0002.3099] # KATAKANA LETTER ZE; QQCM
+3322  ; [.2B22.0020.001C.3322][.2B44.0020.001C.3322][.2B25.0020.001F.3322] # SQUARE SENTI; QQKN
+3323  ; [.2B22.0020.001C.3323][.2B44.0020.001C.3323][.2B28.0020.001F.3323] # SQUARE SENTO; QQKN
+305D  ; [.2B23.0020.000E.305D] # HIRAGANA LETTER SO
+30BD  ; [.2B23.0020.0011.30BD] # KATAKANA LETTER SO
+FF7F  ; [.2B23.0020.0012.FF7F] # HALFWIDTH KATAKANA LETTER SO; QQK
+32DE  ; [.2B23.0020.0013.32DE] # CIRCLED KATAKANA SO; QQK
+305E  ; [.2B23.0020.000E.305D][.0000.0148.0002.3099] # HIRAGANA LETTER ZO; QQCM
+30BE  ; [.2B23.0020.0011.30BD][.0000.0148.0002.3099] # KATAKANA LETTER ZO; QQCM
+305F  ; [.2B24.0020.000E.305F] # HIRAGANA LETTER TA
+30BF  ; [.2B24.0020.0011.30BF] # KATAKANA LETTER TA
+FF80  ; [.2B24.0020.0012.FF80] # HALFWIDTH KATAKANA LETTER TA; QQK
+32DF  ; [.2B24.0020.0013.32DF] # CIRCLED KATAKANA TA; QQK
+3060  ; [.2B24.0020.000E.305F][.0000.0148.0002.3099] # HIRAGANA LETTER DA; QQCM
+30C0  ; [.2B24.0020.0011.30BF][.0000.0148.0002.3099] # KATAKANA LETTER DA; QQCM
+3324  ; [.2B24.0020.001C.3324][.0000.0148.001C.3324][.11DD.0020.001F.3324][.2B21.0020.001F.3324] # SQUARE DAASU; QQKN
+3061  ; [.2B25.0020.000E.3061] # HIRAGANA LETTER TI
+30C1  ; [.2B25.0020.0011.30C1] # KATAKANA LETTER TI
+FF81  ; [.2B25.0020.0012.FF81] # HALFWIDTH KATAKANA LETTER TI; QQK
+32E0  ; [.2B25.0020.0013.32E0] # CIRCLED KATAKANA TI; QQK
+3062  ; [.2B25.0020.000E.3061][.0000.0148.0002.3099] # HIRAGANA LETTER DI; QQCM
+30C2  ; [.2B25.0020.0011.30C1][.0000.0148.0002.3099] # KATAKANA LETTER DI; QQCM
+3063  ; [.2B26.0020.000D.3063] # HIRAGANA LETTER SMALL TU
+3064  ; [.2B26.0020.000E.3064] # HIRAGANA LETTER TU
+30C3  ; [.2B26.0020.000F.30C3] # KATAKANA LETTER SMALL TU
+FF6F  ; [.2B26.0020.0010.FF6F] # HALFWIDTH KATAKANA LETTER SMALL TU; QQK
+30C4  ; [.2B26.0020.0011.30C4] # KATAKANA LETTER TU
+FF82  ; [.2B26.0020.0012.FF82] # HALFWIDTH KATAKANA LETTER TU; QQK
+32E1  ; [.2B26.0020.0013.32E1] # CIRCLED KATAKANA TU; QQK
+3065  ; [.2B26.0020.000E.3064][.0000.0148.0002.3099] # HIRAGANA LETTER DU; QQCM
+30C5  ; [.2B26.0020.0011.30C4][.0000.0148.0002.3099] # KATAKANA LETTER DU; QQCM
+3066  ; [.2B27.0020.000E.3066] # HIRAGANA LETTER TE
+30C6  ; [.2B27.0020.0011.30C6] # KATAKANA LETTER TE
+FF83  ; [.2B27.0020.0012.FF83] # HALFWIDTH KATAKANA LETTER TE; QQK
+32E2  ; [.2B27.0020.0013.32E2] # CIRCLED KATAKANA TE; QQK
+3067  ; [.2B27.0020.000E.3066][.0000.0148.0002.3099] # HIRAGANA LETTER DE; QQCM
+30C7  ; [.2B27.0020.0011.30C6][.0000.0148.0002.3099] # KATAKANA LETTER DE; QQCM
+1F213 ; [.2B27.0020.001C.1F213][.0000.0148.001C.1F213] # SQUARED KATAKANA DE; QQKN
+3325  ; [.2B27.0020.001C.3325][.0000.0148.001C.3325][.2B20.0020.001F.3325] # SQUARE DESI; QQKN
+3068  ; [.2B28.0020.000E.3068] # HIRAGANA LETTER TO
+31F3  ; [.2B28.0020.000F.31F3] # KATAKANA LETTER SMALL TO
+30C8  ; [.2B28.0020.0011.30C8] # KATAKANA LETTER TO
+FF84  ; [.2B28.0020.0012.FF84] # HALFWIDTH KATAKANA LETTER TO; QQK
+32E3  ; [.2B28.0020.0013.32E3] # CIRCLED KATAKANA TO; QQK
+3069  ; [.2B28.0020.000E.3068][.0000.0148.0002.3099] # HIRAGANA LETTER DO; QQCM
+30C9  ; [.2B28.0020.0011.30C8][.0000.0148.0002.3099] # KATAKANA LETTER DO; QQCM
+3326  ; [.2B28.0020.001C.3326][.0000.0148.001C.3326][.2B3D.0020.001F.3326] # SQUARE DORU; QQKN
+3327  ; [.2B28.0020.001C.3327][.2B44.0020.001C.3327] # SQUARE TON; QQKN
+306A  ; [.2B29.0020.000E.306A] # HIRAGANA LETTER NA
+30CA  ; [.2B29.0020.0011.30CA] # KATAKANA LETTER NA
+FF85  ; [.2B29.0020.0012.FF85] # HALFWIDTH KATAKANA LETTER NA; QQK
+32E4  ; [.2B29.0020.0013.32E4] # CIRCLED KATAKANA NA; QQK
+3328  ; [.2B29.0020.001C.3328][.2B2D.0020.001C.3328] # SQUARE NANO; QQKN
+306B  ; [.2B2A.0020.000E.306B] # HIRAGANA LETTER NI
+30CB  ; [.2B2A.0020.0011.30CB] # KATAKANA LETTER NI
+FF86  ; [.2B2A.0020.0012.FF86] # HALFWIDTH KATAKANA LETTER NI; QQK
+32E5  ; [.2B2A.0020.0013.32E5] # CIRCLED KATAKANA NI; QQK
+306C  ; [.2B2B.0020.000E.306C] # HIRAGANA LETTER NU
+31F4  ; [.2B2B.0020.000F.31F4] # KATAKANA LETTER SMALL NU
+30CC  ; [.2B2B.0020.0011.30CC] # KATAKANA LETTER NU
+FF87  ; [.2B2B.0020.0012.FF87] # HALFWIDTH KATAKANA LETTER NU; QQK
+32E6  ; [.2B2B.0020.0013.32E6] # CIRCLED KATAKANA NU; QQK
+306D  ; [.2B2C.0020.000E.306D] # HIRAGANA LETTER NE
+30CD  ; [.2B2C.0020.0011.30CD] # KATAKANA LETTER NE
+FF88  ; [.2B2C.0020.0012.FF88] # HALFWIDTH KATAKANA LETTER NE; QQK
+32E7  ; [.2B2C.0020.0013.32E7] # CIRCLED KATAKANA NE; QQK
+306E  ; [.2B2D.0020.000E.306E] # HIRAGANA LETTER NO
+30CE  ; [.2B2D.0020.0011.30CE] # KATAKANA LETTER NO
+FF89  ; [.2B2D.0020.0012.FF89] # HALFWIDTH KATAKANA LETTER NO; QQK
+32E8  ; [.2B2D.0020.0013.32E8] # CIRCLED KATAKANA NO; QQK
+3329  ; [.2B2D.0020.001C.3329][.2B26.0020.001C.3329][.2B28.0020.001F.3329] # SQUARE NOTTO; QQKN
+306F  ; [.2B2E.0020.000E.306F] # HIRAGANA LETTER HA
+31F5  ; [.2B2E.0020.000F.31F5] # KATAKANA LETTER SMALL HA
+30CF  ; [.2B2E.0020.0011.30CF] # KATAKANA LETTER HA
+FF8A  ; [.2B2E.0020.0012.FF8A] # HALFWIDTH KATAKANA LETTER HA; QQK
+32E9  ; [.2B2E.0020.0013.32E9] # CIRCLED KATAKANA HA; QQK
+3070  ; [.2B2E.0020.000E.306F][.0000.0148.0002.3099] # HIRAGANA LETTER BA; QQCM
+30D0  ; [.2B2E.0020.0011.30CF][.0000.0148.0002.3099] # KATAKANA LETTER BA; QQCM
+3071  ; [.2B2E.0020.000E.306F][.0000.0149.0002.309A] # HIRAGANA LETTER PA; QQCM
+30D1  ; [.2B2E.0020.0011.30CF][.0000.0149.0002.309A] # KATAKANA LETTER PA; QQCM
+332B  ; [.2B2E.0020.001C.332B][.0000.0149.001C.332B][.11DD.0020.001F.332B][.2B22.0020.001F.332B][.2B44.0020.001F.332B][.2B28.0020.001F.332B] # SQUARE PAASENTO; QQKN
+332C  ; [.2B2E.0020.001C.332C][.0000.0149.001C.332C][.11DD.0020.001F.332C][.2B26.0020.001F.332C] # SQUARE PAATU; QQKN
+332D  ; [.2B2E.0020.001C.332D][.0000.0148.001C.332D][.11DD.0020.001F.332D][.2B3E.0020.001F.332D][.2B3D.0020.001F.332D] # SQUARE BAARERU; QQKN
+332A  ; [.2B2E.0020.001C.332A][.2B16.0020.001C.332A][.2B26.0020.001F.332A] # SQUARE HAITU; QQKN
+3072  ; [.2B2F.0020.000E.3072] # HIRAGANA LETTER HI
+31F6  ; [.2B2F.0020.000F.31F6] # KATAKANA LETTER SMALL HI
+30D2  ; [.2B2F.0020.0011.30D2] # KATAKANA LETTER HI
+FF8B  ; [.2B2F.0020.0012.FF8B] # HALFWIDTH KATAKANA LETTER HI; QQK
+32EA  ; [.2B2F.0020.0013.32EA] # CIRCLED KATAKANA HI; QQK
+3073  ; [.2B2F.0020.000E.3072][.0000.0148.0002.3099] # HIRAGANA LETTER BI; QQCM
+30D3  ; [.2B2F.0020.0011.30D2][.0000.0148.0002.3099] # KATAKANA LETTER BI; QQCM
+3074  ; [.2B2F.0020.000E.3072][.0000.0149.0002.309A] # HIRAGANA LETTER PI; QQCM
+30D4  ; [.2B2F.0020.0011.30D2][.0000.0149.0002.309A] # KATAKANA LETTER PI; QQCM
+332E  ; [.2B2F.0020.001C.332E][.0000.0149.001C.332E][.2B15.0020.001F.332E][.2B21.0020.001F.332E][.2B28.0020.001F.332E][.2B3D.0020.001F.332E] # SQUARE PIASUTORU; QQKN
+332F  ; [.2B2F.0020.001C.332F][.0000.0149.001C.332F][.2B1C.0020.001F.332F][.2B3D.0020.001F.332F] # SQUARE PIKURU; QQKN
+3330  ; [.2B2F.0020.001C.3330][.0000.0149.001C.3330][.2B1E.0020.001F.3330] # SQUARE PIKO; QQKN
+3331  ; [.2B2F.0020.001C.3331][.0000.0148.001C.3331][.2B3D.0020.001F.3331] # SQUARE BIRU; QQKN
+3075  ; [.2B30.0020.000E.3075] # HIRAGANA LETTER HU
+31F7  ; [.2B30.0020.000F.31F7] # KATAKANA LETTER SMALL HU
+30D5  ; [.2B30.0020.0011.30D5] # KATAKANA LETTER HU
+FF8C  ; [.2B30.0020.0012.FF8C] # HALFWIDTH KATAKANA LETTER HU; QQK
+32EB  ; [.2B30.0020.0013.32EB] # CIRCLED KATAKANA HU; QQK
+3076  ; [.2B30.0020.000E.3075][.0000.0148.0002.3099] # HIRAGANA LETTER BU; QQCM
+30D6  ; [.2B30.0020.0011.30D5][.0000.0148.0002.3099] # KATAKANA LETTER BU; QQCM
+3077  ; [.2B30.0020.000E.3075][.0000.0149.0002.309A] # HIRAGANA LETTER PU; QQCM
+30D7  ; [.2B30.0020.0011.30D5][.0000.0149.0002.309A] # KATAKANA LETTER PU; QQCM
+3332  ; [.2B30.0020.001C.3332][.2B15.0020.001C.3332][.2B3B.0020.001F.3332][.2B26.0020.001F.3332][.2B28.0020.001F.3332][.0000.0148.001F.3332] # SQUARE HUARADDO; QQKN
+3333  ; [.2B30.0020.001C.3333][.2B16.0020.001C.3333][.11DD.0020.001F.3333][.2B28.0020.001F.3333] # SQUARE HUIITO; QQKN
+3334  ; [.2B30.0020.001C.3334][.0000.0148.001C.3334][.2B26.0020.001F.3334][.2B20.0020.001F.3334][.2B18.0020.001F.3334][.2B3D.0020.001F.3334] # SQUARE BUSSYERU; QQKN
+3335  ; [.2B30.0020.001C.3335][.2B3B.0020.001C.3335][.2B44.0020.001F.3335] # SQUARE HURAN; QQKN
+3078  ; [.2B31.0020.000E.3078] # HIRAGANA LETTER HE
+31F8  ; [.2B31.0020.000F.31F8] # KATAKANA LETTER SMALL HE
+30D8  ; [.2B31.0020.0011.30D8] # KATAKANA LETTER HE
+FF8D  ; [.2B31.0020.0012.FF8D] # HALFWIDTH KATAKANA LETTER HE; QQK
+32EC  ; [.2B31.0020.0013.32EC] # CIRCLED KATAKANA HE; QQK
+3079  ; [.2B31.0020.000E.3078][.0000.0148.0002.3099] # HIRAGANA LETTER BE; QQCM
+30D9  ; [.2B31.0020.0011.30D8][.0000.0148.0002.3099] # KATAKANA LETTER BE; QQCM
+307A  ; [.2B31.0020.000E.3078][.0000.0149.0002.309A] # HIRAGANA LETTER PE; QQCM
+30DA  ; [.2B31.0020.0011.30D8][.0000.0149.0002.309A] # KATAKANA LETTER PE; QQCM
+333B  ; [.2B31.0020.001C.333B][.0000.0149.001C.333B][.11DD.0020.001F.333B][.2B20.0020.001F.333B][.0000.0148.001F.333B] # SQUARE PEEZI; QQKN
+333C  ; [.2B31.0020.001C.333C][.0000.0148.001C.333C][.11DD.0020.001F.333C][.2B24.0020.001F.333C] # SQUARE BEETA; QQKN
+3336  ; [.2B31.0020.001C.3336][.2B1C.0020.001C.3336][.2B24.0020.001F.3336][.11DD.0020.001F.3336][.2B3D.0020.001F.3336] # SQUARE HEKUTAARU; QQKN
+3337  ; [.2B31.0020.001C.3337][.0000.0149.001C.3337][.2B23.0020.001F.3337] # SQUARE PESO; QQKN
+3338  ; [.2B31.0020.001C.3338][.0000.0149.001C.3338][.2B2A.0020.001F.3338][.2B2F.0020.001F.3338] # SQUARE PENIHI; QQKN
+3339  ; [.2B31.0020.001C.3339][.2B3D.0020.001C.3339][.2B26.0020.001F.3339] # SQUARE HERUTU; QQKN
+333A  ; [.2B31.0020.001C.333A][.0000.0149.001C.333A][.2B44.0020.001F.333A][.2B21.0020.001F.333A] # SQUARE PENSU; QQKN
+307B  ; [.2B32.0020.000E.307B] # HIRAGANA LETTER HO
+31F9  ; [.2B32.0020.000F.31F9] # KATAKANA LETTER SMALL HO
+30DB  ; [.2B32.0020.0011.30DB] # KATAKANA LETTER HO
+FF8E  ; [.2B32.0020.0012.FF8E] # HALFWIDTH KATAKANA LETTER HO; QQK
+32ED  ; [.2B32.0020.0013.32ED] # CIRCLED KATAKANA HO; QQK
+307C  ; [.2B32.0020.000E.307B][.0000.0148.0002.3099] # HIRAGANA LETTER BO; QQCM
+30DC  ; [.2B32.0020.0011.30DB][.0000.0148.0002.3099] # KATAKANA LETTER BO; QQCM
+307D  ; [.2B32.0020.000E.307B][.0000.0149.0002.309A] # HIRAGANA LETTER PO; QQCM
+30DD  ; [.2B32.0020.0011.30DB][.0000.0149.0002.309A] # KATAKANA LETTER PO; QQCM
+3341  ; [.2B32.0020.001C.3341][.11DD.0020.001C.3341][.2B3D.0020.001F.3341] # SQUARE HOORU; QQKN
+3342  ; [.2B32.0020.001C.3342][.11DD.0020.001C.3342][.2B44.0020.001F.3342] # SQUARE HOON; QQKN
+333D  ; [.2B32.0020.001C.333D][.0000.0149.001C.333D][.2B16.0020.001F.333D][.2B44.0020.001F.333D][.2B28.0020.001F.333D] # SQUARE POINTO; QQKN
+1F200 ; [.2B32.0020.001C.1F200][.2B1A.0020.001C.1F200] # SQUARE HIRAGANA HOKA; QQKN
+333E  ; [.2B32.0020.001C.333E][.0000.0148.001C.333E][.2B3D.0020.001F.333E][.2B28.0020.001F.333E] # SQUARE BORUTO; QQKN
+333F  ; [.2B32.0020.001C.333F][.2B44.0020.001C.333F] # SQUARE HON; QQKN
+3340  ; [.2B32.0020.001C.3340][.0000.0149.001C.3340][.2B44.0020.001F.3340][.2B28.0020.001F.3340][.0000.0148.001F.3340] # SQUARE PONDO; QQKN
+307E  ; [.2B33.0020.000E.307E] # HIRAGANA LETTER MA
+30DE  ; [.2B33.0020.0011.30DE] # KATAKANA LETTER MA
+FF8F  ; [.2B33.0020.0012.FF8F] # HALFWIDTH KATAKANA LETTER MA; QQK
+32EE  ; [.2B33.0020.0013.32EE] # CIRCLED KATAKANA MA; QQK
+3343  ; [.2B33.0020.001C.3343][.2B16.0020.001C.3343][.2B1C.0020.001F.3343][.2B3F.0020.001F.3343] # SQUARE MAIKURO; QQKN
+3344  ; [.2B33.0020.001C.3344][.2B16.0020.001C.3344][.2B3D.0020.001F.3344] # SQUARE MAIRU; QQKN
+303C  ; [.2B33.0020.0004.303C][.2B21.0020.0004.303C] # MASU MARK; QQKN
+3345  ; [.2B33.0020.001C.3345][.2B26.0020.001C.3345][.2B2E.0020.001F.3345] # SQUARE MAHHA; QQKN
+3346  ; [.2B33.0020.001C.3346][.2B3D.0020.001C.3346][.2B1C.0020.001F.3346] # SQUARE MARUKU; QQKN
+3347  ; [.2B33.0020.001C.3347][.2B44.0020.001C.3347][.2B20.0020.001F.3347][.2B3A.0020.001F.3347][.2B44.0020.001F.3347] # SQUARE MANSYON; QQKN
+307F  ; [.2B34.0020.000E.307F] # HIRAGANA LETTER MI
+30DF  ; [.2B34.0020.0011.30DF] # KATAKANA LETTER MI
+FF90  ; [.2B34.0020.0012.FF90] # HALFWIDTH KATAKANA LETTER MI; QQK
+32EF  ; [.2B34.0020.0013.32EF] # CIRCLED KATAKANA MI; QQK
+3348  ; [.2B34.0020.001C.3348][.2B1C.0020.001C.3348][.2B3F.0020.001F.3348][.2B44.0020.001F.3348] # SQUARE MIKURON; QQKN
+3349  ; [.2B34.0020.001C.3349][.2B3C.0020.001C.3349] # SQUARE MIRI; QQKN
+334A  ; [.2B34.0020.001C.334A][.2B3C.0020.001C.334A][.2B2E.0020.001F.334A][.0000.0148.001F.334A][.11DD.0020.001F.334A][.2B3D.0020.001F.334A] # SQUARE MIRIBAARU; QQKN
+3080  ; [.2B35.0020.000E.3080] # HIRAGANA LETTER MU
+31FA  ; [.2B35.0020.000F.31FA] # KATAKANA LETTER SMALL MU
+30E0  ; [.2B35.0020.0011.30E0] # KATAKANA LETTER MU
+FF91  ; [.2B35.0020.0012.FF91] # HALFWIDTH KATAKANA LETTER MU; QQK
+32F0  ; [.2B35.0020.0013.32F0] # CIRCLED KATAKANA MU; QQK
+3081  ; [.2B36.0020.000E.3081] # HIRAGANA LETTER ME
+30E1  ; [.2B36.0020.0011.30E1] # KATAKANA LETTER ME
+FF92  ; [.2B36.0020.0012.FF92] # HALFWIDTH KATAKANA LETTER ME; QQK
+32F1  ; [.2B36.0020.0013.32F1] # CIRCLED KATAKANA ME; QQK
+334D  ; [.2B36.0020.001C.334D][.11DD.0020.001C.334D][.2B28.0020.001F.334D][.2B3D.0020.001F.334D] # SQUARE MEETORU; QQKN
+334B  ; [.2B36.0020.001C.334B][.2B1A.0020.001C.334B][.0000.0148.001F.334B] # SQUARE MEGA; QQKN
+334C  ; [.2B36.0020.001C.334C][.2B1A.0020.001C.334C][.0000.0148.001F.334C][.2B28.0020.001F.334C][.2B44.0020.001F.334C] # SQUARE MEGATON; QQKN
+3082  ; [.2B37.0020.000E.3082] # HIRAGANA LETTER MO
+30E2  ; [.2B37.0020.0011.30E2] # KATAKANA LETTER MO
+FF93  ; [.2B37.0020.0012.FF93] # HALFWIDTH KATAKANA LETTER MO; QQK
+32F2  ; [.2B37.0020.0013.32F2] # CIRCLED KATAKANA MO; QQK
+3083  ; [.2B38.0020.000D.3083] # HIRAGANA LETTER SMALL YA
+3084  ; [.2B38.0020.000E.3084] # HIRAGANA LETTER YA
+30E3  ; [.2B38.0020.000F.30E3] # KATAKANA LETTER SMALL YA
+FF6C  ; [.2B38.0020.0010.FF6C] # HALFWIDTH KATAKANA LETTER SMALL YA; QQK
+30E4  ; [.2B38.0020.0011.30E4] # KATAKANA LETTER YA
+FF94  ; [.2B38.0020.0012.FF94] # HALFWIDTH KATAKANA LETTER YA; QQK
+32F3  ; [.2B38.0020.0013.32F3] # CIRCLED KATAKANA YA; QQK
+334E  ; [.2B38.0020.001C.334E][.11DD.0020.001C.334E][.2B28.0020.001F.334E][.0000.0148.001F.334E] # SQUARE YAADO; QQKN
+334F  ; [.2B38.0020.001C.334F][.11DD.0020.001C.334F][.2B3D.0020.001F.334F] # SQUARE YAARU; QQKN
+3085  ; [.2B39.0020.000D.3085] # HIRAGANA LETTER SMALL YU
+3086  ; [.2B39.0020.000E.3086] # HIRAGANA LETTER YU
+30E5  ; [.2B39.0020.000F.30E5] # KATAKANA LETTER SMALL YU
+FF6D  ; [.2B39.0020.0010.FF6D] # HALFWIDTH KATAKANA LETTER SMALL YU; QQK
+30E6  ; [.2B39.0020.0011.30E6] # KATAKANA LETTER YU
+FF95  ; [.2B39.0020.0012.FF95] # HALFWIDTH KATAKANA LETTER YU; QQK
+32F4  ; [.2B39.0020.0013.32F4] # CIRCLED KATAKANA YU; QQK
+3350  ; [.2B39.0020.001C.3350][.2B15.0020.001C.3350][.2B44.0020.001F.3350] # SQUARE YUAN; QQKN
+3087  ; [.2B3A.0020.000D.3087] # HIRAGANA LETTER SMALL YO
+3088  ; [.2B3A.0020.000E.3088] # HIRAGANA LETTER YO
+30E7  ; [.2B3A.0020.000F.30E7] # KATAKANA LETTER SMALL YO
+FF6E  ; [.2B3A.0020.0010.FF6E] # HALFWIDTH KATAKANA LETTER SMALL YO; QQK
+30E8  ; [.2B3A.0020.0011.30E8] # KATAKANA LETTER YO
+FF96  ; [.2B3A.0020.0012.FF96] # HALFWIDTH KATAKANA LETTER YO; QQK
+32F5  ; [.2B3A.0020.0013.32F5] # CIRCLED KATAKANA YO; QQK
+309F  ; [.2B3A.0020.0016.309F][.2B3C.0020.0016.309F] # HIRAGANA DIGRAPH YORI; QQKN
+3089  ; [.2B3B.0020.000E.3089] # HIRAGANA LETTER RA
+31FB  ; [.2B3B.0020.000F.31FB] # KATAKANA LETTER SMALL RA
+30E9  ; [.2B3B.0020.0011.30E9] # KATAKANA LETTER RA
+FF97  ; [.2B3B.0020.0012.FF97] # HALFWIDTH KATAKANA LETTER RA; QQK
+32F6  ; [.2B3B.0020.0013.32F6] # CIRCLED KATAKANA RA; QQK
+308A  ; [.2B3C.0020.000E.308A] # HIRAGANA LETTER RI
+31FC  ; [.2B3C.0020.000F.31FC] # KATAKANA LETTER SMALL RI
+30EA  ; [.2B3C.0020.0011.30EA] # KATAKANA LETTER RI
+FF98  ; [.2B3C.0020.0012.FF98] # HALFWIDTH KATAKANA LETTER RI; QQK
+32F7  ; [.2B3C.0020.0013.32F7] # CIRCLED KATAKANA RI; QQK
+3351  ; [.2B3C.0020.001C.3351][.2B26.0020.001C.3351][.2B28.0020.001F.3351][.2B3D.0020.001F.3351] # SQUARE RITTORU; QQKN
+3352  ; [.2B3C.0020.001C.3352][.2B3B.0020.001C.3352] # SQUARE RIRA; QQKN
+308B  ; [.2B3D.0020.000E.308B] # HIRAGANA LETTER RU
+31FD  ; [.2B3D.0020.000F.31FD] # KATAKANA LETTER SMALL RU
+30EB  ; [.2B3D.0020.0011.30EB] # KATAKANA LETTER RU
+FF99  ; [.2B3D.0020.0012.FF99] # HALFWIDTH KATAKANA LETTER RU; QQK
+32F8  ; [.2B3D.0020.0013.32F8] # CIRCLED KATAKANA RU; QQK
+3354  ; [.2B3D.0020.001C.3354][.11DD.0020.001C.3354][.2B30.0020.001F.3354][.0000.0148.001F.3354][.2B3D.0020.001F.3354] # SQUARE RUUBURU; QQKN
+3353  ; [.2B3D.0020.001C.3353][.2B2F.0020.001C.3353][.0000.0149.001F.3353][.11DD.0020.001F.3353] # SQUARE RUPII; QQKN
+308C  ; [.2B3E.0020.000E.308C] # HIRAGANA LETTER RE
+31FE  ; [.2B3E.0020.000F.31FE] # KATAKANA LETTER SMALL RE
+30EC  ; [.2B3E.0020.0011.30EC] # KATAKANA LETTER RE
+FF9A  ; [.2B3E.0020.0012.FF9A] # HALFWIDTH KATAKANA LETTER RE; QQK
+32F9  ; [.2B3E.0020.0013.32F9] # CIRCLED KATAKANA RE; QQK
+3355  ; [.2B3E.0020.001C.3355][.2B35.0020.001C.3355] # SQUARE REMU; QQKN
+3356  ; [.2B3E.0020.001C.3356][.2B44.0020.001C.3356][.2B28.0020.001F.3356][.2B1D.0020.001F.3356][.0000.0148.001F.3356][.2B44.0020.001F.3356] # SQUARE RENTOGEN; QQKN
+308D  ; [.2B3F.0020.000E.308D] # HIRAGANA LETTER RO
+31FF  ; [.2B3F.0020.000F.31FF] # KATAKANA LETTER SMALL RO
+30ED  ; [.2B3F.0020.0011.30ED] # KATAKANA LETTER RO
+FF9B  ; [.2B3F.0020.0012.FF9B] # HALFWIDTH KATAKANA LETTER RO; QQK
+32FA  ; [.2B3F.0020.0013.32FA] # CIRCLED KATAKANA RO; QQK
+308E  ; [.2B40.0020.000D.308E] # HIRAGANA LETTER SMALL WA
+308F  ; [.2B40.0020.000E.308F] # HIRAGANA LETTER WA
+30EE  ; [.2B40.0020.000F.30EE] # KATAKANA LETTER SMALL WA
+30EF  ; [.2B40.0020.0011.30EF] # KATAKANA LETTER WA
+FF9C  ; [.2B40.0020.0012.FF9C] # HALFWIDTH KATAKANA LETTER WA; QQK
+32FB  ; [.2B40.0020.0013.32FB] # CIRCLED KATAKANA WA; QQK
+30F7  ; [.2B40.0020.0011.30EF][.0000.0148.0002.3099] # KATAKANA LETTER VA; QQCM
+3357  ; [.2B40.0020.001C.3357][.2B26.0020.001C.3357][.2B28.0020.001F.3357] # SQUARE WATTO; QQKN
+3090  ; [.2B41.0020.000E.3090] # HIRAGANA LETTER WI
+30F0  ; [.2B41.0020.0011.30F0] # KATAKANA LETTER WI
+32FC  ; [.2B41.0020.0013.32FC] # CIRCLED KATAKANA WI; QQK
+30F8  ; [.2B41.0020.0011.30F0][.0000.0148.0002.3099] # KATAKANA LETTER VI; QQCM
+3091  ; [.2B42.0020.000E.3091] # HIRAGANA LETTER WE
+30F1  ; [.2B42.0020.0011.30F1] # KATAKANA LETTER WE
+32FD  ; [.2B42.0020.0013.32FD] # CIRCLED KATAKANA WE; QQK
+30F9  ; [.2B42.0020.0011.30F1][.0000.0148.0002.3099] # KATAKANA LETTER VE; QQCM
+3092  ; [.2B43.0020.000E.3092] # HIRAGANA LETTER WO
+30F2  ; [.2B43.0020.0011.30F2] # KATAKANA LETTER WO
+FF66  ; [.2B43.0020.0012.FF66] # HALFWIDTH KATAKANA LETTER WO; QQK
+32FE  ; [.2B43.0020.0013.32FE] # CIRCLED KATAKANA WO; QQK
+30FA  ; [.2B43.0020.0011.30F2][.0000.0148.0002.3099] # KATAKANA LETTER VO; QQCM
+3093  ; [.2B44.0020.000E.3093] # HIRAGANA LETTER N
+30F3  ; [.2B44.0020.0011.30F3] # KATAKANA LETTER N
+FF9D  ; [.2B44.0020.0012.FF9D] # HALFWIDTH KATAKANA LETTER N; QQK
+3105  ; [.2B45.0020.0002.3105] # BOPOMOFO LETTER B
+31A0  ; [.2B45.0020.0004.31A0][.0000.015A.0004.31A0] # BOPOMOFO LETTER BU; QQKN
+3106  ; [.2B46.0020.0002.3106] # BOPOMOFO LETTER P
+31B4  ; [.2B46.0020.0019.31B4] # BOPOMOFO FINAL LETTER P; QQK
+3107  ; [.2B47.0020.0002.3107] # BOPOMOFO LETTER M
+3108  ; [.2B48.0020.0002.3108] # BOPOMOFO LETTER F
+312A  ; [.2B49.0020.0002.312A] # BOPOMOFO LETTER V
+3109  ; [.2B4A.0020.0002.3109] # BOPOMOFO LETTER D
+310A  ; [.2B4B.0020.0002.310A] # BOPOMOFO LETTER T
+31B5  ; [.2B4B.0020.0019.31B5] # BOPOMOFO FINAL LETTER T; QQK
+310B  ; [.2B4C.0020.0002.310B] # BOPOMOFO LETTER N
+310C  ; [.2B4D.0020.0002.310C] # BOPOMOFO LETTER L
+310D  ; [.2B4E.0020.0002.310D] # BOPOMOFO LETTER G
+31A3  ; [.2B4E.0020.0004.31A3][.0000.015A.0004.31A3] # BOPOMOFO LETTER GU; QQKN
+310E  ; [.2B4F.0020.0002.310E] # BOPOMOFO LETTER K
+31B6  ; [.2B4F.0020.0019.31B6] # BOPOMOFO FINAL LETTER K; QQK
+312B  ; [.2B50.0020.0002.312B] # BOPOMOFO LETTER NG
+31AD  ; [.2B51.0020.0002.31AD] # BOPOMOFO LETTER NGG
+310F  ; [.2B52.0020.0002.310F] # BOPOMOFO LETTER H
+31B7  ; [.2B52.0020.0019.31B7] # BOPOMOFO FINAL LETTER H; QQK
+3110  ; [.2B53.0020.0002.3110] # BOPOMOFO LETTER J
+31A2  ; [.2B53.0020.0004.31A2][.0000.015A.0004.31A2] # BOPOMOFO LETTER JI; QQKN
+3111  ; [.2B54.0020.0002.3111] # BOPOMOFO LETTER Q
+3112  ; [.2B55.0020.0002.3112] # BOPOMOFO LETTER X
+312C  ; [.2B56.0020.0002.312C] # BOPOMOFO LETTER GN
+3113  ; [.2B57.0020.0002.3113] # BOPOMOFO LETTER ZH
+3114  ; [.2B58.0020.0002.3114] # BOPOMOFO LETTER CH
+3115  ; [.2B59.0020.0002.3115] # BOPOMOFO LETTER SH
+3116  ; [.2B5A.0020.0002.3116] # BOPOMOFO LETTER R
+3117  ; [.2B5B.0020.0002.3117] # BOPOMOFO LETTER Z
+31A1  ; [.2B5B.0020.0004.31A1][.0000.015A.0004.31A1] # BOPOMOFO LETTER ZI; QQKN
+3118  ; [.2B5C.0020.0002.3118] # BOPOMOFO LETTER C
+3119  ; [.2B5D.0020.0002.3119] # BOPOMOFO LETTER S
+311A  ; [.2B5E.0020.0002.311A] # BOPOMOFO LETTER A
+31A9  ; [.2B5E.0020.0004.31A9][.0000.015A.0004.31A9] # BOPOMOFO LETTER ANN; QQKN
+311B  ; [.2B5F.0020.0002.311B] # BOPOMOFO LETTER O
+31A7  ; [.2B5F.0020.0004.31A7][.0000.015A.0004.31A7] # BOPOMOFO LETTER ONN; QQKN
+31A6  ; [.2B60.0020.0002.31A6] # BOPOMOFO LETTER OO
+311C  ; [.2B61.0020.0002.311C] # BOPOMOFO LETTER E
+311D  ; [.2B62.0020.0002.311D] # BOPOMOFO LETTER EH
+31A4  ; [.2B63.0020.0002.31A4] # BOPOMOFO LETTER EE
+31A5  ; [.2B63.0020.0004.31A5][.0000.015A.0004.31A5] # BOPOMOFO LETTER ENN; QQKN
+311E  ; [.2B64.0020.0002.311E] # BOPOMOFO LETTER AI
+31AE  ; [.2B64.0020.0004.31AE][.0000.015A.0004.31AE] # BOPOMOFO LETTER AINN; QQKN
+311F  ; [.2B65.0020.0002.311F] # BOPOMOFO LETTER EI
+3120  ; [.2B66.0020.0002.3120] # BOPOMOFO LETTER AU
+31AF  ; [.2B66.0020.0004.31AF][.0000.015A.0004.31AF] # BOPOMOFO LETTER AUNN; QQKN
+3121  ; [.2B67.0020.0002.3121] # BOPOMOFO LETTER OU
+3122  ; [.2B68.0020.0002.3122] # BOPOMOFO LETTER AN
+3123  ; [.2B69.0020.0002.3123] # BOPOMOFO LETTER EN
+3124  ; [.2B6A.0020.0002.3124] # BOPOMOFO LETTER ANG
+31B2  ; [.2B6B.0020.0002.31B2] # BOPOMOFO LETTER ONG
+3125  ; [.2B6C.0020.0002.3125] # BOPOMOFO LETTER ENG
+31B0  ; [.2B6D.0020.0002.31B0] # BOPOMOFO LETTER AM
+31B1  ; [.2B6E.0020.0002.31B1] # BOPOMOFO LETTER OM
+31AC  ; [.2B6F.0020.0002.31AC] # BOPOMOFO LETTER IM
+3126  ; [.2B70.0020.0002.3126] # BOPOMOFO LETTER ER
+3127  ; [.2B71.0020.0002.3127] # BOPOMOFO LETTER I
+31AA  ; [.2B71.0020.0004.31AA][.0000.015A.0004.31AA] # BOPOMOFO LETTER INN; QQKN
+31B3  ; [.2B71.0020.0016.31B3][.0000.015A.0016.31B3] # BOPOMOFO LETTER INNN; QQKN
+3128  ; [.2B72.0020.0002.3128] # BOPOMOFO LETTER U
+31AB  ; [.2B72.0020.0004.31AB][.0000.015A.0004.31AB] # BOPOMOFO LETTER UNN; QQKN
+31A8  ; [.2B72.0020.0004.31A8][.0000.015C.0004.31A8] # BOPOMOFO LETTER IR; QQKN
+3129  ; [.2B73.0020.0002.3129] # BOPOMOFO LETTER IU
+312D  ; [.2B74.0020.0002.312D] # BOPOMOFO LETTER IH
+A000  ; [.2B75.0020.0002.A000] # YI SYLLABLE IT
+A001  ; [.2B76.0020.0002.A001] # YI SYLLABLE IX
+A002  ; [.2B77.0020.0002.A002] # YI SYLLABLE I
+A003  ; [.2B78.0020.0002.A003] # YI SYLLABLE IP
+A004  ; [.2B79.0020.0002.A004] # YI SYLLABLE IET
+A005  ; [.2B7A.0020.0002.A005] # YI SYLLABLE IEX
+A006  ; [.2B7B.0020.0002.A006] # YI SYLLABLE IE
+A007  ; [.2B7C.0020.0002.A007] # YI SYLLABLE IEP
+A008  ; [.2B7D.0020.0002.A008] # YI SYLLABLE AT
+A009  ; [.2B7E.0020.0002.A009] # YI SYLLABLE AX
+A00A  ; [.2B7F.0020.0002.A00A] # YI SYLLABLE A
+A00B  ; [.2B80.0020.0002.A00B] # YI SYLLABLE AP
+A00C  ; [.2B81.0020.0002.A00C] # YI SYLLABLE UOX
+A00D  ; [.2B82.0020.0002.A00D] # YI SYLLABLE UO
+A00E  ; [.2B83.0020.0002.A00E] # YI SYLLABLE UOP
+A00F  ; [.2B84.0020.0002.A00F] # YI SYLLABLE OT
+A010  ; [.2B85.0020.0002.A010] # YI SYLLABLE OX
+A011  ; [.2B86.0020.0002.A011] # YI SYLLABLE O
+A012  ; [.2B87.0020.0002.A012] # YI SYLLABLE OP
+A013  ; [.2B88.0020.0002.A013] # YI SYLLABLE EX
+A014  ; [.2B89.0020.0002.A014] # YI SYLLABLE E
+A015  ; [.2B8A.0020.0002.A015] # YI SYLLABLE WU
+A016  ; [.2B8B.0020.0002.A016] # YI SYLLABLE BIT
+A017  ; [.2B8C.0020.0002.A017] # YI SYLLABLE BIX
+A018  ; [.2B8D.0020.0002.A018] # YI SYLLABLE BI
+A019  ; [.2B8E.0020.0002.A019] # YI SYLLABLE BIP
+A01A  ; [.2B8F.0020.0002.A01A] # YI SYLLABLE BIET
+A01B  ; [.2B90.0020.0002.A01B] # YI SYLLABLE BIEX
+A01C  ; [.2B91.0020.0002.A01C] # YI SYLLABLE BIE
+A01D  ; [.2B92.0020.0002.A01D] # YI SYLLABLE BIEP
+A01E  ; [.2B93.0020.0002.A01E] # YI SYLLABLE BAT
+A01F  ; [.2B94.0020.0002.A01F] # YI SYLLABLE BAX
+A020  ; [.2B95.0020.0002.A020] # YI SYLLABLE BA
+A021  ; [.2B96.0020.0002.A021] # YI SYLLABLE BAP
+A022  ; [.2B97.0020.0002.A022] # YI SYLLABLE BUOX
+A023  ; [.2B98.0020.0002.A023] # YI SYLLABLE BUO
+A024  ; [.2B99.0020.0002.A024] # YI SYLLABLE BUOP
+A025  ; [.2B9A.0020.0002.A025] # YI SYLLABLE BOT
+A026  ; [.2B9B.0020.0002.A026] # YI SYLLABLE BOX
+A027  ; [.2B9C.0020.0002.A027] # YI SYLLABLE BO
+A028  ; [.2B9D.0020.0002.A028] # YI SYLLABLE BOP
+A029  ; [.2B9E.0020.0002.A029] # YI SYLLABLE BEX
+A02A  ; [.2B9F.0020.0002.A02A] # YI SYLLABLE BE
+A02B  ; [.2BA0.0020.0002.A02B] # YI SYLLABLE BEP
+A02C  ; [.2BA1.0020.0002.A02C] # YI SYLLABLE BUT
+A02D  ; [.2BA2.0020.0002.A02D] # YI SYLLABLE BUX
+A02E  ; [.2BA3.0020.0002.A02E] # YI SYLLABLE BU
+A02F  ; [.2BA4.0020.0002.A02F] # YI SYLLABLE BUP
+A030  ; [.2BA5.0020.0002.A030] # YI SYLLABLE BURX
+A031  ; [.2BA6.0020.0002.A031] # YI SYLLABLE BUR
+A032  ; [.2BA7.0020.0002.A032] # YI SYLLABLE BYT
+A033  ; [.2BA8.0020.0002.A033] # YI SYLLABLE BYX
+A034  ; [.2BA9.0020.0002.A034] # YI SYLLABLE BY
+A035  ; [.2BAA.0020.0002.A035] # YI SYLLABLE BYP
+A036  ; [.2BAB.0020.0002.A036] # YI SYLLABLE BYRX
+A037  ; [.2BAC.0020.0002.A037] # YI SYLLABLE BYR
+A038  ; [.2BAD.0020.0002.A038] # YI SYLLABLE PIT
+A039  ; [.2BAE.0020.0002.A039] # YI SYLLABLE PIX
+A03A  ; [.2BAF.0020.0002.A03A] # YI SYLLABLE PI
+A03B  ; [.2BB0.0020.0002.A03B] # YI SYLLABLE PIP
+A03C  ; [.2BB1.0020.0002.A03C] # YI SYLLABLE PIEX
+A03D  ; [.2BB2.0020.0002.A03D] # YI SYLLABLE PIE
+A03E  ; [.2BB3.0020.0002.A03E] # YI SYLLABLE PIEP
+A03F  ; [.2BB4.0020.0002.A03F] # YI SYLLABLE PAT
+A040  ; [.2BB5.0020.0002.A040] # YI SYLLABLE PAX
+A041  ; [.2BB6.0020.0002.A041] # YI SYLLABLE PA
+A042  ; [.2BB7.0020.0002.A042] # YI SYLLABLE PAP
+A043  ; [.2BB8.0020.0002.A043] # YI SYLLABLE PUOX
+A044  ; [.2BB9.0020.0002.A044] # YI SYLLABLE PUO
+A045  ; [.2BBA.0020.0002.A045] # YI SYLLABLE PUOP
+A046  ; [.2BBB.0020.0002.A046] # YI SYLLABLE POT
+A047  ; [.2BBC.0020.0002.A047] # YI SYLLABLE POX
+A048  ; [.2BBD.0020.0002.A048] # YI SYLLABLE PO
+A049  ; [.2BBE.0020.0002.A049] # YI SYLLABLE POP
+A04A  ; [.2BBF.0020.0002.A04A] # YI SYLLABLE PUT
+A04B  ; [.2BC0.0020.0002.A04B] # YI SYLLABLE PUX
+A04C  ; [.2BC1.0020.0002.A04C] # YI SYLLABLE PU
+A04D  ; [.2BC2.0020.0002.A04D] # YI SYLLABLE PUP
+A04E  ; [.2BC3.0020.0002.A04E] # YI SYLLABLE PURX
+A04F  ; [.2BC4.0020.0002.A04F] # YI SYLLABLE PUR
+A050  ; [.2BC5.0020.0002.A050] # YI SYLLABLE PYT
+A051  ; [.2BC6.0020.0002.A051] # YI SYLLABLE PYX
+A052  ; [.2BC7.0020.0002.A052] # YI SYLLABLE PY
+A053  ; [.2BC8.0020.0002.A053] # YI SYLLABLE PYP
+A054  ; [.2BC9.0020.0002.A054] # YI SYLLABLE PYRX
+A055  ; [.2BCA.0020.0002.A055] # YI SYLLABLE PYR
+A056  ; [.2BCB.0020.0002.A056] # YI SYLLABLE BBIT
+A057  ; [.2BCC.0020.0002.A057] # YI SYLLABLE BBIX
+A058  ; [.2BCD.0020.0002.A058] # YI SYLLABLE BBI
+A059  ; [.2BCE.0020.0002.A059] # YI SYLLABLE BBIP
+A05A  ; [.2BCF.0020.0002.A05A] # YI SYLLABLE BBIET
+A05B  ; [.2BD0.0020.0002.A05B] # YI SYLLABLE BBIEX
+A05C  ; [.2BD1.0020.0002.A05C] # YI SYLLABLE BBIE
+A05D  ; [.2BD2.0020.0002.A05D] # YI SYLLABLE BBIEP
+A05E  ; [.2BD3.0020.0002.A05E] # YI SYLLABLE BBAT
+A05F  ; [.2BD4.0020.0002.A05F] # YI SYLLABLE BBAX
+A060  ; [.2BD5.0020.0002.A060] # YI SYLLABLE BBA
+A061  ; [.2BD6.0020.0002.A061] # YI SYLLABLE BBAP
+A062  ; [.2BD7.0020.0002.A062] # YI SYLLABLE BBUOX
+A063  ; [.2BD8.0020.0002.A063] # YI SYLLABLE BBUO
+A064  ; [.2BD9.0020.0002.A064] # YI SYLLABLE BBUOP
+A065  ; [.2BDA.0020.0002.A065] # YI SYLLABLE BBOT
+A066  ; [.2BDB.0020.0002.A066] # YI SYLLABLE BBOX
+A067  ; [.2BDC.0020.0002.A067] # YI SYLLABLE BBO
+A068  ; [.2BDD.0020.0002.A068] # YI SYLLABLE BBOP
+A069  ; [.2BDE.0020.0002.A069] # YI SYLLABLE BBEX
+A06A  ; [.2BDF.0020.0002.A06A] # YI SYLLABLE BBE
+A06B  ; [.2BE0.0020.0002.A06B] # YI SYLLABLE BBEP
+A06C  ; [.2BE1.0020.0002.A06C] # YI SYLLABLE BBUT
+A06D  ; [.2BE2.0020.0002.A06D] # YI SYLLABLE BBUX
+A06E  ; [.2BE3.0020.0002.A06E] # YI SYLLABLE BBU
+A06F  ; [.2BE4.0020.0002.A06F] # YI SYLLABLE BBUP
+A070  ; [.2BE5.0020.0002.A070] # YI SYLLABLE BBURX
+A071  ; [.2BE6.0020.0002.A071] # YI SYLLABLE BBUR
+A072  ; [.2BE7.0020.0002.A072] # YI SYLLABLE BBYT
+A073  ; [.2BE8.0020.0002.A073] # YI SYLLABLE BBYX
+A074  ; [.2BE9.0020.0002.A074] # YI SYLLABLE BBY
+A075  ; [.2BEA.0020.0002.A075] # YI SYLLABLE BBYP
+A076  ; [.2BEB.0020.0002.A076] # YI SYLLABLE NBIT
+A077  ; [.2BEC.0020.0002.A077] # YI SYLLABLE NBIX
+A078  ; [.2BED.0020.0002.A078] # YI SYLLABLE NBI
+A079  ; [.2BEE.0020.0002.A079] # YI SYLLABLE NBIP
+A07A  ; [.2BEF.0020.0002.A07A] # YI SYLLABLE NBIEX
+A07B  ; [.2BF0.0020.0002.A07B] # YI SYLLABLE NBIE
+A07C  ; [.2BF1.0020.0002.A07C] # YI SYLLABLE NBIEP
+A07D  ; [.2BF2.0020.0002.A07D] # YI SYLLABLE NBAT
+A07E  ; [.2BF3.0020.0002.A07E] # YI SYLLABLE NBAX
+A07F  ; [.2BF4.0020.0002.A07F] # YI SYLLABLE NBA
+A080  ; [.2BF5.0020.0002.A080] # YI SYLLABLE NBAP
+A081  ; [.2BF6.0020.0002.A081] # YI SYLLABLE NBOT
+A082  ; [.2BF7.0020.0002.A082] # YI SYLLABLE NBOX
+A083  ; [.2BF8.0020.0002.A083] # YI SYLLABLE NBO
+A084  ; [.2BF9.0020.0002.A084] # YI SYLLABLE NBOP
+A085  ; [.2BFA.0020.0002.A085] # YI SYLLABLE NBUT
+A086  ; [.2BFB.0020.0002.A086] # YI SYLLABLE NBUX
+A087  ; [.2BFC.0020.0002.A087] # YI SYLLABLE NBU
+A088  ; [.2BFD.0020.0002.A088] # YI SYLLABLE NBUP
+A089  ; [.2BFE.0020.0002.A089] # YI SYLLABLE NBURX
+A08A  ; [.2BFF.0020.0002.A08A] # YI SYLLABLE NBUR
+A08B  ; [.2C00.0020.0002.A08B] # YI SYLLABLE NBYT
+A08C  ; [.2C01.0020.0002.A08C] # YI SYLLABLE NBYX
+A08D  ; [.2C02.0020.0002.A08D] # YI SYLLABLE NBY
+A08E  ; [.2C03.0020.0002.A08E] # YI SYLLABLE NBYP
+A08F  ; [.2C04.0020.0002.A08F] # YI SYLLABLE NBYRX
+A090  ; [.2C05.0020.0002.A090] # YI SYLLABLE NBYR
+A091  ; [.2C06.0020.0002.A091] # YI SYLLABLE HMIT
+A092  ; [.2C07.0020.0002.A092] # YI SYLLABLE HMIX
+A093  ; [.2C08.0020.0002.A093] # YI SYLLABLE HMI
+A094  ; [.2C09.0020.0002.A094] # YI SYLLABLE HMIP
+A095  ; [.2C0A.0020.0002.A095] # YI SYLLABLE HMIEX
+A096  ; [.2C0B.0020.0002.A096] # YI SYLLABLE HMIE
+A097  ; [.2C0C.0020.0002.A097] # YI SYLLABLE HMIEP
+A098  ; [.2C0D.0020.0002.A098] # YI SYLLABLE HMAT
+A099  ; [.2C0E.0020.0002.A099] # YI SYLLABLE HMAX
+A09A  ; [.2C0F.0020.0002.A09A] # YI SYLLABLE HMA
+A09B  ; [.2C10.0020.0002.A09B] # YI SYLLABLE HMAP
+A09C  ; [.2C11.0020.0002.A09C] # YI SYLLABLE HMUOX
+A09D  ; [.2C12.0020.0002.A09D] # YI SYLLABLE HMUO
+A09E  ; [.2C13.0020.0002.A09E] # YI SYLLABLE HMUOP
+A09F  ; [.2C14.0020.0002.A09F] # YI SYLLABLE HMOT
+A0A0  ; [.2C15.0020.0002.A0A0] # YI SYLLABLE HMOX
+A0A1  ; [.2C16.0020.0002.A0A1] # YI SYLLABLE HMO
+A0A2  ; [.2C17.0020.0002.A0A2] # YI SYLLABLE HMOP
+A0A3  ; [.2C18.0020.0002.A0A3] # YI SYLLABLE HMUT
+A0A4  ; [.2C19.0020.0002.A0A4] # YI SYLLABLE HMUX
+A0A5  ; [.2C1A.0020.0002.A0A5] # YI SYLLABLE HMU
+A0A6  ; [.2C1B.0020.0002.A0A6] # YI SYLLABLE HMUP
+A0A7  ; [.2C1C.0020.0002.A0A7] # YI SYLLABLE HMURX
+A0A8  ; [.2C1D.0020.0002.A0A8] # YI SYLLABLE HMUR
+A0A9  ; [.2C1E.0020.0002.A0A9] # YI SYLLABLE HMYX
+A0AA  ; [.2C1F.0020.0002.A0AA] # YI SYLLABLE HMY
+A0AB  ; [.2C20.0020.0002.A0AB] # YI SYLLABLE HMYP
+A0AC  ; [.2C21.0020.0002.A0AC] # YI SYLLABLE HMYRX
+A0AD  ; [.2C22.0020.0002.A0AD] # YI SYLLABLE HMYR
+A0AE  ; [.2C23.0020.0002.A0AE] # YI SYLLABLE MIT
+A0AF  ; [.2C24.0020.0002.A0AF] # YI SYLLABLE MIX
+A0B0  ; [.2C25.0020.0002.A0B0] # YI SYLLABLE MI
+A0B1  ; [.2C26.0020.0002.A0B1] # YI SYLLABLE MIP
+A0B2  ; [.2C27.0020.0002.A0B2] # YI SYLLABLE MIEX
+A0B3  ; [.2C28.0020.0002.A0B3] # YI SYLLABLE MIE
+A0B4  ; [.2C29.0020.0002.A0B4] # YI SYLLABLE MIEP
+A0B5  ; [.2C2A.0020.0002.A0B5] # YI SYLLABLE MAT
+A0B6  ; [.2C2B.0020.0002.A0B6] # YI SYLLABLE MAX
+A0B7  ; [.2C2C.0020.0002.A0B7] # YI SYLLABLE MA
+A0B8  ; [.2C2D.0020.0002.A0B8] # YI SYLLABLE MAP
+A0B9  ; [.2C2E.0020.0002.A0B9] # YI SYLLABLE MUOT
+A0BA  ; [.2C2F.0020.0002.A0BA] # YI SYLLABLE MUOX
+A0BB  ; [.2C30.0020.0002.A0BB] # YI SYLLABLE MUO
+A0BC  ; [.2C31.0020.0002.A0BC] # YI SYLLABLE MUOP
+A0BD  ; [.2C32.0020.0002.A0BD] # YI SYLLABLE MOT
+A0BE  ; [.2C33.0020.0002.A0BE] # YI SYLLABLE MOX
+A0BF  ; [.2C34.0020.0002.A0BF] # YI SYLLABLE MO
+A0C0  ; [.2C35.0020.0002.A0C0] # YI SYLLABLE MOP
+A0C1  ; [.2C36.0020.0002.A0C1] # YI SYLLABLE MEX
+A0C2  ; [.2C37.0020.0002.A0C2] # YI SYLLABLE ME
+A0C3  ; [.2C38.0020.0002.A0C3] # YI SYLLABLE MUT
+A0C4  ; [.2C39.0020.0002.A0C4] # YI SYLLABLE MUX
+A0C5  ; [.2C3A.0020.0002.A0C5] # YI SYLLABLE MU
+A0C6  ; [.2C3B.0020.0002.A0C6] # YI SYLLABLE MUP
+A0C7  ; [.2C3C.0020.0002.A0C7] # YI SYLLABLE MURX
+A0C8  ; [.2C3D.0020.0002.A0C8] # YI SYLLABLE MUR
+A0C9  ; [.2C3E.0020.0002.A0C9] # YI SYLLABLE MYT
+A0CA  ; [.2C3F.0020.0002.A0CA] # YI SYLLABLE MYX
+A0CB  ; [.2C40.0020.0002.A0CB] # YI SYLLABLE MY
+A0CC  ; [.2C41.0020.0002.A0CC] # YI SYLLABLE MYP
+A0CD  ; [.2C42.0020.0002.A0CD] # YI SYLLABLE FIT
+A0CE  ; [.2C43.0020.0002.A0CE] # YI SYLLABLE FIX
+A0CF  ; [.2C44.0020.0002.A0CF] # YI SYLLABLE FI
+A0D0  ; [.2C45.0020.0002.A0D0] # YI SYLLABLE FIP
+A0D1  ; [.2C46.0020.0002.A0D1] # YI SYLLABLE FAT
+A0D2  ; [.2C47.0020.0002.A0D2] # YI SYLLABLE FAX
+A0D3  ; [.2C48.0020.0002.A0D3] # YI SYLLABLE FA
+A0D4  ; [.2C49.0020.0002.A0D4] # YI SYLLABLE FAP
+A0D5  ; [.2C4A.0020.0002.A0D5] # YI SYLLABLE FOX
+A0D6  ; [.2C4B.0020.0002.A0D6] # YI SYLLABLE FO
+A0D7  ; [.2C4C.0020.0002.A0D7] # YI SYLLABLE FOP
+A0D8  ; [.2C4D.0020.0002.A0D8] # YI SYLLABLE FUT
+A0D9  ; [.2C4E.0020.0002.A0D9] # YI SYLLABLE FUX
+A0DA  ; [.2C4F.0020.0002.A0DA] # YI SYLLABLE FU
+A0DB  ; [.2C50.0020.0002.A0DB] # YI SYLLABLE FUP
+A0DC  ; [.2C51.0020.0002.A0DC] # YI SYLLABLE FURX
+A0DD  ; [.2C52.0020.0002.A0DD] # YI SYLLABLE FUR
+A0DE  ; [.2C53.0020.0002.A0DE] # YI SYLLABLE FYT
+A0DF  ; [.2C54.0020.0002.A0DF] # YI SYLLABLE FYX
+A0E0  ; [.2C55.0020.0002.A0E0] # YI SYLLABLE FY
+A0E1  ; [.2C56.0020.0002.A0E1] # YI SYLLABLE FYP
+A0E2  ; [.2C57.0020.0002.A0E2] # YI SYLLABLE VIT
+A0E3  ; [.2C58.0020.0002.A0E3] # YI SYLLABLE VIX
+A0E4  ; [.2C59.0020.0002.A0E4] # YI SYLLABLE VI
+A0E5  ; [.2C5A.0020.0002.A0E5] # YI SYLLABLE VIP
+A0E6  ; [.2C5B.0020.0002.A0E6] # YI SYLLABLE VIET
+A0E7  ; [.2C5C.0020.0002.A0E7] # YI SYLLABLE VIEX
+A0E8  ; [.2C5D.0020.0002.A0E8] # YI SYLLABLE VIE
+A0E9  ; [.2C5E.0020.0002.A0E9] # YI SYLLABLE VIEP
+A0EA  ; [.2C5F.0020.0002.A0EA] # YI SYLLABLE VAT
+A0EB  ; [.2C60.0020.0002.A0EB] # YI SYLLABLE VAX
+A0EC  ; [.2C61.0020.0002.A0EC] # YI SYLLABLE VA
+A0ED  ; [.2C62.0020.0002.A0ED] # YI SYLLABLE VAP
+A0EE  ; [.2C63.0020.0002.A0EE] # YI SYLLABLE VOT
+A0EF  ; [.2C64.0020.0002.A0EF] # YI SYLLABLE VOX
+A0F0  ; [.2C65.0020.0002.A0F0] # YI SYLLABLE VO
+A0F1  ; [.2C66.0020.0002.A0F1] # YI SYLLABLE VOP
+A0F2  ; [.2C67.0020.0002.A0F2] # YI SYLLABLE VEX
+A0F3  ; [.2C68.0020.0002.A0F3] # YI SYLLABLE VEP
+A0F4  ; [.2C69.0020.0002.A0F4] # YI SYLLABLE VUT
+A0F5  ; [.2C6A.0020.0002.A0F5] # YI SYLLABLE VUX
+A0F6  ; [.2C6B.0020.0002.A0F6] # YI SYLLABLE VU
+A0F7  ; [.2C6C.0020.0002.A0F7] # YI SYLLABLE VUP
+A0F8  ; [.2C6D.0020.0002.A0F8] # YI SYLLABLE VURX
+A0F9  ; [.2C6E.0020.0002.A0F9] # YI SYLLABLE VUR
+A0FA  ; [.2C6F.0020.0002.A0FA] # YI SYLLABLE VYT
+A0FB  ; [.2C70.0020.0002.A0FB] # YI SYLLABLE VYX
+A0FC  ; [.2C71.0020.0002.A0FC] # YI SYLLABLE VY
+A0FD  ; [.2C72.0020.0002.A0FD] # YI SYLLABLE VYP
+A0FE  ; [.2C73.0020.0002.A0FE] # YI SYLLABLE VYRX
+A0FF  ; [.2C74.0020.0002.A0FF] # YI SYLLABLE VYR
+A100  ; [.2C75.0020.0002.A100] # YI SYLLABLE DIT
+A101  ; [.2C76.0020.0002.A101] # YI SYLLABLE DIX
+A102  ; [.2C77.0020.0002.A102] # YI SYLLABLE DI
+A103  ; [.2C78.0020.0002.A103] # YI SYLLABLE DIP
+A104  ; [.2C79.0020.0002.A104] # YI SYLLABLE DIEX
+A105  ; [.2C7A.0020.0002.A105] # YI SYLLABLE DIE
+A106  ; [.2C7B.0020.0002.A106] # YI SYLLABLE DIEP
+A107  ; [.2C7C.0020.0002.A107] # YI SYLLABLE DAT
+A108  ; [.2C7D.0020.0002.A108] # YI SYLLABLE DAX
+A109  ; [.2C7E.0020.0002.A109] # YI SYLLABLE DA
+A10A  ; [.2C7F.0020.0002.A10A] # YI SYLLABLE DAP
+A10B  ; [.2C80.0020.0002.A10B] # YI SYLLABLE DUOX
+A10C  ; [.2C81.0020.0002.A10C] # YI SYLLABLE DUO
+A10D  ; [.2C82.0020.0002.A10D] # YI SYLLABLE DOT
+A10E  ; [.2C83.0020.0002.A10E] # YI SYLLABLE DOX
+A10F  ; [.2C84.0020.0002.A10F] # YI SYLLABLE DO
+A110  ; [.2C85.0020.0002.A110] # YI SYLLABLE DOP
+A111  ; [.2C86.0020.0002.A111] # YI SYLLABLE DEX
+A112  ; [.2C87.0020.0002.A112] # YI SYLLABLE DE
+A113  ; [.2C88.0020.0002.A113] # YI SYLLABLE DEP
+A114  ; [.2C89.0020.0002.A114] # YI SYLLABLE DUT
+A115  ; [.2C8A.0020.0002.A115] # YI SYLLABLE DUX
+A116  ; [.2C8B.0020.0002.A116] # YI SYLLABLE DU
+A117  ; [.2C8C.0020.0002.A117] # YI SYLLABLE DUP
+A118  ; [.2C8D.0020.0002.A118] # YI SYLLABLE DURX
+A119  ; [.2C8E.0020.0002.A119] # YI SYLLABLE DUR
+A11A  ; [.2C8F.0020.0002.A11A] # YI SYLLABLE TIT
+A11B  ; [.2C90.0020.0002.A11B] # YI SYLLABLE TIX
+A11C  ; [.2C91.0020.0002.A11C] # YI SYLLABLE TI
+A11D  ; [.2C92.0020.0002.A11D] # YI SYLLABLE TIP
+A11E  ; [.2C93.0020.0002.A11E] # YI SYLLABLE TIEX
+A11F  ; [.2C94.0020.0002.A11F] # YI SYLLABLE TIE
+A120  ; [.2C95.0020.0002.A120] # YI SYLLABLE TIEP
+A121  ; [.2C96.0020.0002.A121] # YI SYLLABLE TAT
+A122  ; [.2C97.0020.0002.A122] # YI SYLLABLE TAX
+A123  ; [.2C98.0020.0002.A123] # YI SYLLABLE TA
+A124  ; [.2C99.0020.0002.A124] # YI SYLLABLE TAP
+A125  ; [.2C9A.0020.0002.A125] # YI SYLLABLE TUOT
+A126  ; [.2C9B.0020.0002.A126] # YI SYLLABLE TUOX
+A127  ; [.2C9C.0020.0002.A127] # YI SYLLABLE TUO
+A128  ; [.2C9D.0020.0002.A128] # YI SYLLABLE TUOP
+A129  ; [.2C9E.0020.0002.A129] # YI SYLLABLE TOT
+A12A  ; [.2C9F.0020.0002.A12A] # YI SYLLABLE TOX
+A12B  ; [.2CA0.0020.0002.A12B] # YI SYLLABLE TO
+A12C  ; [.2CA1.0020.0002.A12C] # YI SYLLABLE TOP
+A12D  ; [.2CA2.0020.0002.A12D] # YI SYLLABLE TEX
+A12E  ; [.2CA3.0020.0002.A12E] # YI SYLLABLE TE
+A12F  ; [.2CA4.0020.0002.A12F] # YI SYLLABLE TEP
+A130  ; [.2CA5.0020.0002.A130] # YI SYLLABLE TUT
+A131  ; [.2CA6.0020.0002.A131] # YI SYLLABLE TUX
+A132  ; [.2CA7.0020.0002.A132] # YI SYLLABLE TU
+A133  ; [.2CA8.0020.0002.A133] # YI SYLLABLE TUP
+A134  ; [.2CA9.0020.0002.A134] # YI SYLLABLE TURX
+A135  ; [.2CAA.0020.0002.A135] # YI SYLLABLE TUR
+A136  ; [.2CAB.0020.0002.A136] # YI SYLLABLE DDIT
+A137  ; [.2CAC.0020.0002.A137] # YI SYLLABLE DDIX
+A138  ; [.2CAD.0020.0002.A138] # YI SYLLABLE DDI
+A139  ; [.2CAE.0020.0002.A139] # YI SYLLABLE DDIP
+A13A  ; [.2CAF.0020.0002.A13A] # YI SYLLABLE DDIEX
+A13B  ; [.2CB0.0020.0002.A13B] # YI SYLLABLE DDIE
+A13C  ; [.2CB1.0020.0002.A13C] # YI SYLLABLE DDIEP
+A13D  ; [.2CB2.0020.0002.A13D] # YI SYLLABLE DDAT
+A13E  ; [.2CB3.0020.0002.A13E] # YI SYLLABLE DDAX
+A13F  ; [.2CB4.0020.0002.A13F] # YI SYLLABLE DDA
+A140  ; [.2CB5.0020.0002.A140] # YI SYLLABLE DDAP
+A141  ; [.2CB6.0020.0002.A141] # YI SYLLABLE DDUOX
+A142  ; [.2CB7.0020.0002.A142] # YI SYLLABLE DDUO
+A143  ; [.2CB8.0020.0002.A143] # YI SYLLABLE DDUOP
+A144  ; [.2CB9.0020.0002.A144] # YI SYLLABLE DDOT
+A145  ; [.2CBA.0020.0002.A145] # YI SYLLABLE DDOX
+A146  ; [.2CBB.0020.0002.A146] # YI SYLLABLE DDO
+A147  ; [.2CBC.0020.0002.A147] # YI SYLLABLE DDOP
+A148  ; [.2CBD.0020.0002.A148] # YI SYLLABLE DDEX
+A149  ; [.2CBE.0020.0002.A149] # YI SYLLABLE DDE
+A14A  ; [.2CBF.0020.0002.A14A] # YI SYLLABLE DDEP
+A14B  ; [.2CC0.0020.0002.A14B] # YI SYLLABLE DDUT
+A14C  ; [.2CC1.0020.0002.A14C] # YI SYLLABLE DDUX
+A14D  ; [.2CC2.0020.0002.A14D] # YI SYLLABLE DDU
+A14E  ; [.2CC3.0020.0002.A14E] # YI SYLLABLE DDUP
+A14F  ; [.2CC4.0020.0002.A14F] # YI SYLLABLE DDURX
+A150  ; [.2CC5.0020.0002.A150] # YI SYLLABLE DDUR
+A151  ; [.2CC6.0020.0002.A151] # YI SYLLABLE NDIT
+A152  ; [.2CC7.0020.0002.A152] # YI SYLLABLE NDIX
+A153  ; [.2CC8.0020.0002.A153] # YI SYLLABLE NDI
+A154  ; [.2CC9.0020.0002.A154] # YI SYLLABLE NDIP
+A155  ; [.2CCA.0020.0002.A155] # YI SYLLABLE NDIEX
+A156  ; [.2CCB.0020.0002.A156] # YI SYLLABLE NDIE
+A157  ; [.2CCC.0020.0002.A157] # YI SYLLABLE NDAT
+A158  ; [.2CCD.0020.0002.A158] # YI SYLLABLE NDAX
+A159  ; [.2CCE.0020.0002.A159] # YI SYLLABLE NDA
+A15A  ; [.2CCF.0020.0002.A15A] # YI SYLLABLE NDAP
+A15B  ; [.2CD0.0020.0002.A15B] # YI SYLLABLE NDOT
+A15C  ; [.2CD1.0020.0002.A15C] # YI SYLLABLE NDOX
+A15D  ; [.2CD2.0020.0002.A15D] # YI SYLLABLE NDO
+A15E  ; [.2CD3.0020.0002.A15E] # YI SYLLABLE NDOP
+A15F  ; [.2CD4.0020.0002.A15F] # YI SYLLABLE NDEX
+A160  ; [.2CD5.0020.0002.A160] # YI SYLLABLE NDE
+A161  ; [.2CD6.0020.0002.A161] # YI SYLLABLE NDEP
+A162  ; [.2CD7.0020.0002.A162] # YI SYLLABLE NDUT
+A163  ; [.2CD8.0020.0002.A163] # YI SYLLABLE NDUX
+A164  ; [.2CD9.0020.0002.A164] # YI SYLLABLE NDU
+A165  ; [.2CDA.0020.0002.A165] # YI SYLLABLE NDUP
+A166  ; [.2CDB.0020.0002.A166] # YI SYLLABLE NDURX
+A167  ; [.2CDC.0020.0002.A167] # YI SYLLABLE NDUR
+A168  ; [.2CDD.0020.0002.A168] # YI SYLLABLE HNIT
+A169  ; [.2CDE.0020.0002.A169] # YI SYLLABLE HNIX
+A16A  ; [.2CDF.0020.0002.A16A] # YI SYLLABLE HNI
+A16B  ; [.2CE0.0020.0002.A16B] # YI SYLLABLE HNIP
+A16C  ; [.2CE1.0020.0002.A16C] # YI SYLLABLE HNIET
+A16D  ; [.2CE2.0020.0002.A16D] # YI SYLLABLE HNIEX
+A16E  ; [.2CE3.0020.0002.A16E] # YI SYLLABLE HNIE
+A16F  ; [.2CE4.0020.0002.A16F] # YI SYLLABLE HNIEP
+A170  ; [.2CE5.0020.0002.A170] # YI SYLLABLE HNAT
+A171  ; [.2CE6.0020.0002.A171] # YI SYLLABLE HNAX
+A172  ; [.2CE7.0020.0002.A172] # YI SYLLABLE HNA
+A173  ; [.2CE8.0020.0002.A173] # YI SYLLABLE HNAP
+A174  ; [.2CE9.0020.0002.A174] # YI SYLLABLE HNUOX
+A175  ; [.2CEA.0020.0002.A175] # YI SYLLABLE HNUO
+A176  ; [.2CEB.0020.0002.A176] # YI SYLLABLE HNOT
+A177  ; [.2CEC.0020.0002.A177] # YI SYLLABLE HNOX
+A178  ; [.2CED.0020.0002.A178] # YI SYLLABLE HNOP
+A179  ; [.2CEE.0020.0002.A179] # YI SYLLABLE HNEX
+A17A  ; [.2CEF.0020.0002.A17A] # YI SYLLABLE HNE
+A17B  ; [.2CF0.0020.0002.A17B] # YI SYLLABLE HNEP
+A17C  ; [.2CF1.0020.0002.A17C] # YI SYLLABLE HNUT
+A17D  ; [.2CF2.0020.0002.A17D] # YI SYLLABLE NIT
+A17E  ; [.2CF3.0020.0002.A17E] # YI SYLLABLE NIX
+A17F  ; [.2CF4.0020.0002.A17F] # YI SYLLABLE NI
+A180  ; [.2CF5.0020.0002.A180] # YI SYLLABLE NIP
+A181  ; [.2CF6.0020.0002.A181] # YI SYLLABLE NIEX
+A182  ; [.2CF7.0020.0002.A182] # YI SYLLABLE NIE
+A183  ; [.2CF8.0020.0002.A183] # YI SYLLABLE NIEP
+A184  ; [.2CF9.0020.0002.A184] # YI SYLLABLE NAX
+A185  ; [.2CFA.0020.0002.A185] # YI SYLLABLE NA
+A186  ; [.2CFB.0020.0002.A186] # YI SYLLABLE NAP
+A187  ; [.2CFC.0020.0002.A187] # YI SYLLABLE NUOX
+A188  ; [.2CFD.0020.0002.A188] # YI SYLLABLE NUO
+A189  ; [.2CFE.0020.0002.A189] # YI SYLLABLE NUOP
+A18A  ; [.2CFF.0020.0002.A18A] # YI SYLLABLE NOT
+A18B  ; [.2D00.0020.0002.A18B] # YI SYLLABLE NOX
+A18C  ; [.2D01.0020.0002.A18C] # YI SYLLABLE NO
+A18D  ; [.2D02.0020.0002.A18D] # YI SYLLABLE NOP
+A18E  ; [.2D03.0020.0002.A18E] # YI SYLLABLE NEX
+A18F  ; [.2D04.0020.0002.A18F] # YI SYLLABLE NE
+A190  ; [.2D05.0020.0002.A190] # YI SYLLABLE NEP
+A191  ; [.2D06.0020.0002.A191] # YI SYLLABLE NUT
+A192  ; [.2D07.0020.0002.A192] # YI SYLLABLE NUX
+A193  ; [.2D08.0020.0002.A193] # YI SYLLABLE NU
+A194  ; [.2D09.0020.0002.A194] # YI SYLLABLE NUP
+A195  ; [.2D0A.0020.0002.A195] # YI SYLLABLE NURX
+A196  ; [.2D0B.0020.0002.A196] # YI SYLLABLE NUR
+A197  ; [.2D0C.0020.0002.A197] # YI SYLLABLE HLIT
+A198  ; [.2D0D.0020.0002.A198] # YI SYLLABLE HLIX
+A199  ; [.2D0E.0020.0002.A199] # YI SYLLABLE HLI
+A19A  ; [.2D0F.0020.0002.A19A] # YI SYLLABLE HLIP
+A19B  ; [.2D10.0020.0002.A19B] # YI SYLLABLE HLIEX
+A19C  ; [.2D11.0020.0002.A19C] # YI SYLLABLE HLIE
+A19D  ; [.2D12.0020.0002.A19D] # YI SYLLABLE HLIEP
+A19E  ; [.2D13.0020.0002.A19E] # YI SYLLABLE HLAT
+A19F  ; [.2D14.0020.0002.A19F] # YI SYLLABLE HLAX
+A1A0  ; [.2D15.0020.0002.A1A0] # YI SYLLABLE HLA
+A1A1  ; [.2D16.0020.0002.A1A1] # YI SYLLABLE HLAP
+A1A2  ; [.2D17.0020.0002.A1A2] # YI SYLLABLE HLUOX
+A1A3  ; [.2D18.0020.0002.A1A3] # YI SYLLABLE HLUO
+A1A4  ; [.2D19.0020.0002.A1A4] # YI SYLLABLE HLUOP
+A1A5  ; [.2D1A.0020.0002.A1A5] # YI SYLLABLE HLOX
+A1A6  ; [.2D1B.0020.0002.A1A6] # YI SYLLABLE HLO
+A1A7  ; [.2D1C.0020.0002.A1A7] # YI SYLLABLE HLOP
+A1A8  ; [.2D1D.0020.0002.A1A8] # YI SYLLABLE HLEX
+A1A9  ; [.2D1E.0020.0002.A1A9] # YI SYLLABLE HLE
+A1AA  ; [.2D1F.0020.0002.A1AA] # YI SYLLABLE HLEP
+A1AB  ; [.2D20.0020.0002.A1AB] # YI SYLLABLE HLUT
+A1AC  ; [.2D21.0020.0002.A1AC] # YI SYLLABLE HLUX
+A1AD  ; [.2D22.0020.0002.A1AD] # YI SYLLABLE HLU
+A1AE  ; [.2D23.0020.0002.A1AE] # YI SYLLABLE HLUP
+A1AF  ; [.2D24.0020.0002.A1AF] # YI SYLLABLE HLURX
+A1B0  ; [.2D25.0020.0002.A1B0] # YI SYLLABLE HLUR
+A1B1  ; [.2D26.0020.0002.A1B1] # YI SYLLABLE HLYT
+A1B2  ; [.2D27.0020.0002.A1B2] # YI SYLLABLE HLYX
+A1B3  ; [.2D28.0020.0002.A1B3] # YI SYLLABLE HLY
+A1B4  ; [.2D29.0020.0002.A1B4] # YI SYLLABLE HLYP
+A1B5  ; [.2D2A.0020.0002.A1B5] # YI SYLLABLE HLYRX
+A1B6  ; [.2D2B.0020.0002.A1B6] # YI SYLLABLE HLYR
+A1B7  ; [.2D2C.0020.0002.A1B7] # YI SYLLABLE LIT
+A1B8  ; [.2D2D.0020.0002.A1B8] # YI SYLLABLE LIX
+A1B9  ; [.2D2E.0020.0002.A1B9] # YI SYLLABLE LI
+A1BA  ; [.2D2F.0020.0002.A1BA] # YI SYLLABLE LIP
+A1BB  ; [.2D30.0020.0002.A1BB] # YI SYLLABLE LIET
+A1BC  ; [.2D31.0020.0002.A1BC] # YI SYLLABLE LIEX
+A1BD  ; [.2D32.0020.0002.A1BD] # YI SYLLABLE LIE
+A1BE  ; [.2D33.0020.0002.A1BE] # YI SYLLABLE LIEP
+A1BF  ; [.2D34.0020.0002.A1BF] # YI SYLLABLE LAT
+A1C0  ; [.2D35.0020.0002.A1C0] # YI SYLLABLE LAX
+A1C1  ; [.2D36.0020.0002.A1C1] # YI SYLLABLE LA
+A1C2  ; [.2D37.0020.0002.A1C2] # YI SYLLABLE LAP
+A1C3  ; [.2D38.0020.0002.A1C3] # YI SYLLABLE LUOT
+A1C4  ; [.2D39.0020.0002.A1C4] # YI SYLLABLE LUOX
+A1C5  ; [.2D3A.0020.0002.A1C5] # YI SYLLABLE LUO
+A1C6  ; [.2D3B.0020.0002.A1C6] # YI SYLLABLE LUOP
+A1C7  ; [.2D3C.0020.0002.A1C7] # YI SYLLABLE LOT
+A1C8  ; [.2D3D.0020.0002.A1C8] # YI SYLLABLE LOX
+A1C9  ; [.2D3E.0020.0002.A1C9] # YI SYLLABLE LO
+A1CA  ; [.2D3F.0020.0002.A1CA] # YI SYLLABLE LOP
+A1CB  ; [.2D40.0020.0002.A1CB] # YI SYLLABLE LEX
+A1CC  ; [.2D41.0020.0002.A1CC] # YI SYLLABLE LE
+A1CD  ; [.2D42.0020.0002.A1CD] # YI SYLLABLE LEP
+A1CE  ; [.2D43.0020.0002.A1CE] # YI SYLLABLE LUT
+A1CF  ; [.2D44.0020.0002.A1CF] # YI SYLLABLE LUX
+A1D0  ; [.2D45.0020.0002.A1D0] # YI SYLLABLE LU
+A1D1  ; [.2D46.0020.0002.A1D1] # YI SYLLABLE LUP
+A1D2  ; [.2D47.0020.0002.A1D2] # YI SYLLABLE LURX
+A1D3  ; [.2D48.0020.0002.A1D3] # YI SYLLABLE LUR
+A1D4  ; [.2D49.0020.0002.A1D4] # YI SYLLABLE LYT
+A1D5  ; [.2D4A.0020.0002.A1D5] # YI SYLLABLE LYX
+A1D6  ; [.2D4B.0020.0002.A1D6] # YI SYLLABLE LY
+A1D7  ; [.2D4C.0020.0002.A1D7] # YI SYLLABLE LYP
+A1D8  ; [.2D4D.0020.0002.A1D8] # YI SYLLABLE LYRX
+A1D9  ; [.2D4E.0020.0002.A1D9] # YI SYLLABLE LYR
+A1DA  ; [.2D4F.0020.0002.A1DA] # YI SYLLABLE GIT
+A1DB  ; [.2D50.0020.0002.A1DB] # YI SYLLABLE GIX
+A1DC  ; [.2D51.0020.0002.A1DC] # YI SYLLABLE GI
+A1DD  ; [.2D52.0020.0002.A1DD] # YI SYLLABLE GIP
+A1DE  ; [.2D53.0020.0002.A1DE] # YI SYLLABLE GIET
+A1DF  ; [.2D54.0020.0002.A1DF] # YI SYLLABLE GIEX
+A1E0  ; [.2D55.0020.0002.A1E0] # YI SYLLABLE GIE
+A1E1  ; [.2D56.0020.0002.A1E1] # YI SYLLABLE GIEP
+A1E2  ; [.2D57.0020.0002.A1E2] # YI SYLLABLE GAT
+A1E3  ; [.2D58.0020.0002.A1E3] # YI SYLLABLE GAX
+A1E4  ; [.2D59.0020.0002.A1E4] # YI SYLLABLE GA
+A1E5  ; [.2D5A.0020.0002.A1E5] # YI SYLLABLE GAP
+A1E6  ; [.2D5B.0020.0002.A1E6] # YI SYLLABLE GUOT
+A1E7  ; [.2D5C.0020.0002.A1E7] # YI SYLLABLE GUOX
+A1E8  ; [.2D5D.0020.0002.A1E8] # YI SYLLABLE GUO
+A1E9  ; [.2D5E.0020.0002.A1E9] # YI SYLLABLE GUOP
+A1EA  ; [.2D5F.0020.0002.A1EA] # YI SYLLABLE GOT
+A1EB  ; [.2D60.0020.0002.A1EB] # YI SYLLABLE GOX
+A1EC  ; [.2D61.0020.0002.A1EC] # YI SYLLABLE GO
+A1ED  ; [.2D62.0020.0002.A1ED] # YI SYLLABLE GOP
+A1EE  ; [.2D63.0020.0002.A1EE] # YI SYLLABLE GET
+A1EF  ; [.2D64.0020.0002.A1EF] # YI SYLLABLE GEX
+A1F0  ; [.2D65.0020.0002.A1F0] # YI SYLLABLE GE
+A1F1  ; [.2D66.0020.0002.A1F1] # YI SYLLABLE GEP
+A1F2  ; [.2D67.0020.0002.A1F2] # YI SYLLABLE GUT
+A1F3  ; [.2D68.0020.0002.A1F3] # YI SYLLABLE GUX
+A1F4  ; [.2D69.0020.0002.A1F4] # YI SYLLABLE GU
+A1F5  ; [.2D6A.0020.0002.A1F5] # YI SYLLABLE GUP
+A1F6  ; [.2D6B.0020.0002.A1F6] # YI SYLLABLE GURX
+A1F7  ; [.2D6C.0020.0002.A1F7] # YI SYLLABLE GUR
+A1F8  ; [.2D6D.0020.0002.A1F8] # YI SYLLABLE KIT
+A1F9  ; [.2D6E.0020.0002.A1F9] # YI SYLLABLE KIX
+A1FA  ; [.2D6F.0020.0002.A1FA] # YI SYLLABLE KI
+A1FB  ; [.2D70.0020.0002.A1FB] # YI SYLLABLE KIP
+A1FC  ; [.2D71.0020.0002.A1FC] # YI SYLLABLE KIEX
+A1FD  ; [.2D72.0020.0002.A1FD] # YI SYLLABLE KIE
+A1FE  ; [.2D73.0020.0002.A1FE] # YI SYLLABLE KIEP
+A1FF  ; [.2D74.0020.0002.A1FF] # YI SYLLABLE KAT
+A200  ; [.2D75.0020.0002.A200] # YI SYLLABLE KAX
+A201  ; [.2D76.0020.0002.A201] # YI SYLLABLE KA
+A202  ; [.2D77.0020.0002.A202] # YI SYLLABLE KAP
+A203  ; [.2D78.0020.0002.A203] # YI SYLLABLE KUOX
+A204  ; [.2D79.0020.0002.A204] # YI SYLLABLE KUO
+A205  ; [.2D7A.0020.0002.A205] # YI SYLLABLE KUOP
+A206  ; [.2D7B.0020.0002.A206] # YI SYLLABLE KOT
+A207  ; [.2D7C.0020.0002.A207] # YI SYLLABLE KOX
+A208  ; [.2D7D.0020.0002.A208] # YI SYLLABLE KO
+A209  ; [.2D7E.0020.0002.A209] # YI SYLLABLE KOP
+A20A  ; [.2D7F.0020.0002.A20A] # YI SYLLABLE KET
+A20B  ; [.2D80.0020.0002.A20B] # YI SYLLABLE KEX
+A20C  ; [.2D81.0020.0002.A20C] # YI SYLLABLE KE
+A20D  ; [.2D82.0020.0002.A20D] # YI SYLLABLE KEP
+A20E  ; [.2D83.0020.0002.A20E] # YI SYLLABLE KUT
+A20F  ; [.2D84.0020.0002.A20F] # YI SYLLABLE KUX
+A210  ; [.2D85.0020.0002.A210] # YI SYLLABLE KU
+A211  ; [.2D86.0020.0002.A211] # YI SYLLABLE KUP
+A212  ; [.2D87.0020.0002.A212] # YI SYLLABLE KURX
+A213  ; [.2D88.0020.0002.A213] # YI SYLLABLE KUR
+A214  ; [.2D89.0020.0002.A214] # YI SYLLABLE GGIT
+A215  ; [.2D8A.0020.0002.A215] # YI SYLLABLE GGIX
+A216  ; [.2D8B.0020.0002.A216] # YI SYLLABLE GGI
+A217  ; [.2D8C.0020.0002.A217] # YI SYLLABLE GGIEX
+A218  ; [.2D8D.0020.0002.A218] # YI SYLLABLE GGIE
+A219  ; [.2D8E.0020.0002.A219] # YI SYLLABLE GGIEP
+A21A  ; [.2D8F.0020.0002.A21A] # YI SYLLABLE GGAT
+A21B  ; [.2D90.0020.0002.A21B] # YI SYLLABLE GGAX
+A21C  ; [.2D91.0020.0002.A21C] # YI SYLLABLE GGA
+A21D  ; [.2D92.0020.0002.A21D] # YI SYLLABLE GGAP
+A21E  ; [.2D93.0020.0002.A21E] # YI SYLLABLE GGUOT
+A21F  ; [.2D94.0020.0002.A21F] # YI SYLLABLE GGUOX
+A220  ; [.2D95.0020.0002.A220] # YI SYLLABLE GGUO
+A221  ; [.2D96.0020.0002.A221] # YI SYLLABLE GGUOP
+A222  ; [.2D97.0020.0002.A222] # YI SYLLABLE GGOT
+A223  ; [.2D98.0020.0002.A223] # YI SYLLABLE GGOX
+A224  ; [.2D99.0020.0002.A224] # YI SYLLABLE GGO
+A225  ; [.2D9A.0020.0002.A225] # YI SYLLABLE GGOP
+A226  ; [.2D9B.0020.0002.A226] # YI SYLLABLE GGET
+A227  ; [.2D9C.0020.0002.A227] # YI SYLLABLE GGEX
+A228  ; [.2D9D.0020.0002.A228] # YI SYLLABLE GGE
+A229  ; [.2D9E.0020.0002.A229] # YI SYLLABLE GGEP
+A22A  ; [.2D9F.0020.0002.A22A] # YI SYLLABLE GGUT
+A22B  ; [.2DA0.0020.0002.A22B] # YI SYLLABLE GGUX
+A22C  ; [.2DA1.0020.0002.A22C] # YI SYLLABLE GGU
+A22D  ; [.2DA2.0020.0002.A22D] # YI SYLLABLE GGUP
+A22E  ; [.2DA3.0020.0002.A22E] # YI SYLLABLE GGURX
+A22F  ; [.2DA4.0020.0002.A22F] # YI SYLLABLE GGUR
+A230  ; [.2DA5.0020.0002.A230] # YI SYLLABLE MGIEX
+A231  ; [.2DA6.0020.0002.A231] # YI SYLLABLE MGIE
+A232  ; [.2DA7.0020.0002.A232] # YI SYLLABLE MGAT
+A233  ; [.2DA8.0020.0002.A233] # YI SYLLABLE MGAX
+A234  ; [.2DA9.0020.0002.A234] # YI SYLLABLE MGA
+A235  ; [.2DAA.0020.0002.A235] # YI SYLLABLE MGAP
+A236  ; [.2DAB.0020.0002.A236] # YI SYLLABLE MGUOX
+A237  ; [.2DAC.0020.0002.A237] # YI SYLLABLE MGUO
+A238  ; [.2DAD.0020.0002.A238] # YI SYLLABLE MGUOP
+A239  ; [.2DAE.0020.0002.A239] # YI SYLLABLE MGOT
+A23A  ; [.2DAF.0020.0002.A23A] # YI SYLLABLE MGOX
+A23B  ; [.2DB0.0020.0002.A23B] # YI SYLLABLE MGO
+A23C  ; [.2DB1.0020.0002.A23C] # YI SYLLABLE MGOP
+A23D  ; [.2DB2.0020.0002.A23D] # YI SYLLABLE MGEX
+A23E  ; [.2DB3.0020.0002.A23E] # YI SYLLABLE MGE
+A23F  ; [.2DB4.0020.0002.A23F] # YI SYLLABLE MGEP
+A240  ; [.2DB5.0020.0002.A240] # YI SYLLABLE MGUT
+A241  ; [.2DB6.0020.0002.A241] # YI SYLLABLE MGUX
+A242  ; [.2DB7.0020.0002.A242] # YI SYLLABLE MGU
+A243  ; [.2DB8.0020.0002.A243] # YI SYLLABLE MGUP
+A244  ; [.2DB9.0020.0002.A244] # YI SYLLABLE MGURX
+A245  ; [.2DBA.0020.0002.A245] # YI SYLLABLE MGUR
+A246  ; [.2DBB.0020.0002.A246] # YI SYLLABLE HXIT
+A247  ; [.2DBC.0020.0002.A247] # YI SYLLABLE HXIX
+A248  ; [.2DBD.0020.0002.A248] # YI SYLLABLE HXI
+A249  ; [.2DBE.0020.0002.A249] # YI SYLLABLE HXIP
+A24A  ; [.2DBF.0020.0002.A24A] # YI SYLLABLE HXIET
+A24B  ; [.2DC0.0020.0002.A24B] # YI SYLLABLE HXIEX
+A24C  ; [.2DC1.0020.0002.A24C] # YI SYLLABLE HXIE
+A24D  ; [.2DC2.0020.0002.A24D] # YI SYLLABLE HXIEP
+A24E  ; [.2DC3.0020.0002.A24E] # YI SYLLABLE HXAT
+A24F  ; [.2DC4.0020.0002.A24F] # YI SYLLABLE HXAX
+A250  ; [.2DC5.0020.0002.A250] # YI SYLLABLE HXA
+A251  ; [.2DC6.0020.0002.A251] # YI SYLLABLE HXAP
+A252  ; [.2DC7.0020.0002.A252] # YI SYLLABLE HXUOT
+A253  ; [.2DC8.0020.0002.A253] # YI SYLLABLE HXUOX
+A254  ; [.2DC9.0020.0002.A254] # YI SYLLABLE HXUO
+A255  ; [.2DCA.0020.0002.A255] # YI SYLLABLE HXUOP
+A256  ; [.2DCB.0020.0002.A256] # YI SYLLABLE HXOT
+A257  ; [.2DCC.0020.0002.A257] # YI SYLLABLE HXOX
+A258  ; [.2DCD.0020.0002.A258] # YI SYLLABLE HXO
+A259  ; [.2DCE.0020.0002.A259] # YI SYLLABLE HXOP
+A25A  ; [.2DCF.0020.0002.A25A] # YI SYLLABLE HXEX
+A25B  ; [.2DD0.0020.0002.A25B] # YI SYLLABLE HXE
+A25C  ; [.2DD1.0020.0002.A25C] # YI SYLLABLE HXEP
+A25D  ; [.2DD2.0020.0002.A25D] # YI SYLLABLE NGIEX
+A25E  ; [.2DD3.0020.0002.A25E] # YI SYLLABLE NGIE
+A25F  ; [.2DD4.0020.0002.A25F] # YI SYLLABLE NGIEP
+A260  ; [.2DD5.0020.0002.A260] # YI SYLLABLE NGAT
+A261  ; [.2DD6.0020.0002.A261] # YI SYLLABLE NGAX
+A262  ; [.2DD7.0020.0002.A262] # YI SYLLABLE NGA
+A263  ; [.2DD8.0020.0002.A263] # YI SYLLABLE NGAP
+A264  ; [.2DD9.0020.0002.A264] # YI SYLLABLE NGUOT
+A265  ; [.2DDA.0020.0002.A265] # YI SYLLABLE NGUOX
+A266  ; [.2DDB.0020.0002.A266] # YI SYLLABLE NGUO
+A267  ; [.2DDC.0020.0002.A267] # YI SYLLABLE NGOT
+A268  ; [.2DDD.0020.0002.A268] # YI SYLLABLE NGOX
+A269  ; [.2DDE.0020.0002.A269] # YI SYLLABLE NGO
+A26A  ; [.2DDF.0020.0002.A26A] # YI SYLLABLE NGOP
+A26B  ; [.2DE0.0020.0002.A26B] # YI SYLLABLE NGEX
+A26C  ; [.2DE1.0020.0002.A26C] # YI SYLLABLE NGE
+A26D  ; [.2DE2.0020.0002.A26D] # YI SYLLABLE NGEP
+A26E  ; [.2DE3.0020.0002.A26E] # YI SYLLABLE HIT
+A26F  ; [.2DE4.0020.0002.A26F] # YI SYLLABLE HIEX
+A270  ; [.2DE5.0020.0002.A270] # YI SYLLABLE HIE
+A271  ; [.2DE6.0020.0002.A271] # YI SYLLABLE HAT
+A272  ; [.2DE7.0020.0002.A272] # YI SYLLABLE HAX
+A273  ; [.2DE8.0020.0002.A273] # YI SYLLABLE HA
+A274  ; [.2DE9.0020.0002.A274] # YI SYLLABLE HAP
+A275  ; [.2DEA.0020.0002.A275] # YI SYLLABLE HUOT
+A276  ; [.2DEB.0020.0002.A276] # YI SYLLABLE HUOX
+A277  ; [.2DEC.0020.0002.A277] # YI SYLLABLE HUO
+A278  ; [.2DED.0020.0002.A278] # YI SYLLABLE HUOP
+A279  ; [.2DEE.0020.0002.A279] # YI SYLLABLE HOT
+A27A  ; [.2DEF.0020.0002.A27A] # YI SYLLABLE HOX
+A27B  ; [.2DF0.0020.0002.A27B] # YI SYLLABLE HO
+A27C  ; [.2DF1.0020.0002.A27C] # YI SYLLABLE HOP
+A27D  ; [.2DF2.0020.0002.A27D] # YI SYLLABLE HEX
+A27E  ; [.2DF3.0020.0002.A27E] # YI SYLLABLE HE
+A27F  ; [.2DF4.0020.0002.A27F] # YI SYLLABLE HEP
+A280  ; [.2DF5.0020.0002.A280] # YI SYLLABLE WAT
+A281  ; [.2DF6.0020.0002.A281] # YI SYLLABLE WAX
+A282  ; [.2DF7.0020.0002.A282] # YI SYLLABLE WA
+A283  ; [.2DF8.0020.0002.A283] # YI SYLLABLE WAP
+A284  ; [.2DF9.0020.0002.A284] # YI SYLLABLE WUOX
+A285  ; [.2DFA.0020.0002.A285] # YI SYLLABLE WUO
+A286  ; [.2DFB.0020.0002.A286] # YI SYLLABLE WUOP
+A287  ; [.2DFC.0020.0002.A287] # YI SYLLABLE WOX
+A288  ; [.2DFD.0020.0002.A288] # YI SYLLABLE WO
+A289  ; [.2DFE.0020.0002.A289] # YI SYLLABLE WOP
+A28A  ; [.2DFF.0020.0002.A28A] # YI SYLLABLE WEX
+A28B  ; [.2E00.0020.0002.A28B] # YI SYLLABLE WE
+A28C  ; [.2E01.0020.0002.A28C] # YI SYLLABLE WEP
+A28D  ; [.2E02.0020.0002.A28D] # YI SYLLABLE ZIT
+A28E  ; [.2E03.0020.0002.A28E] # YI SYLLABLE ZIX
+A28F  ; [.2E04.0020.0002.A28F] # YI SYLLABLE ZI
+A290  ; [.2E05.0020.0002.A290] # YI SYLLABLE ZIP
+A291  ; [.2E06.0020.0002.A291] # YI SYLLABLE ZIEX
+A292  ; [.2E07.0020.0002.A292] # YI SYLLABLE ZIE
+A293  ; [.2E08.0020.0002.A293] # YI SYLLABLE ZIEP
+A294  ; [.2E09.0020.0002.A294] # YI SYLLABLE ZAT
+A295  ; [.2E0A.0020.0002.A295] # YI SYLLABLE ZAX
+A296  ; [.2E0B.0020.0002.A296] # YI SYLLABLE ZA
+A297  ; [.2E0C.0020.0002.A297] # YI SYLLABLE ZAP
+A298  ; [.2E0D.0020.0002.A298] # YI SYLLABLE ZUOX
+A299  ; [.2E0E.0020.0002.A299] # YI SYLLABLE ZUO
+A29A  ; [.2E0F.0020.0002.A29A] # YI SYLLABLE ZUOP
+A29B  ; [.2E10.0020.0002.A29B] # YI SYLLABLE ZOT
+A29C  ; [.2E11.0020.0002.A29C] # YI SYLLABLE ZOX
+A29D  ; [.2E12.0020.0002.A29D] # YI SYLLABLE ZO
+A29E  ; [.2E13.0020.0002.A29E] # YI SYLLABLE ZOP
+A29F  ; [.2E14.0020.0002.A29F] # YI SYLLABLE ZEX
+A2A0  ; [.2E15.0020.0002.A2A0] # YI SYLLABLE ZE
+A2A1  ; [.2E16.0020.0002.A2A1] # YI SYLLABLE ZEP
+A2A2  ; [.2E17.0020.0002.A2A2] # YI SYLLABLE ZUT
+A2A3  ; [.2E18.0020.0002.A2A3] # YI SYLLABLE ZUX
+A2A4  ; [.2E19.0020.0002.A2A4] # YI SYLLABLE ZU
+A2A5  ; [.2E1A.0020.0002.A2A5] # YI SYLLABLE ZUP
+A2A6  ; [.2E1B.0020.0002.A2A6] # YI SYLLABLE ZURX
+A2A7  ; [.2E1C.0020.0002.A2A7] # YI SYLLABLE ZUR
+A2A8  ; [.2E1D.0020.0002.A2A8] # YI SYLLABLE ZYT
+A2A9  ; [.2E1E.0020.0002.A2A9] # YI SYLLABLE ZYX
+A2AA  ; [.2E1F.0020.0002.A2AA] # YI SYLLABLE ZY
+A2AB  ; [.2E20.0020.0002.A2AB] # YI SYLLABLE ZYP
+A2AC  ; [.2E21.0020.0002.A2AC] # YI SYLLABLE ZYRX
+A2AD  ; [.2E22.0020.0002.A2AD] # YI SYLLABLE ZYR
+A2AE  ; [.2E23.0020.0002.A2AE] # YI SYLLABLE CIT
+A2AF  ; [.2E24.0020.0002.A2AF] # YI SYLLABLE CIX
+A2B0  ; [.2E25.0020.0002.A2B0] # YI SYLLABLE CI
+A2B1  ; [.2E26.0020.0002.A2B1] # YI SYLLABLE CIP
+A2B2  ; [.2E27.0020.0002.A2B2] # YI SYLLABLE CIET
+A2B3  ; [.2E28.0020.0002.A2B3] # YI SYLLABLE CIEX
+A2B4  ; [.2E29.0020.0002.A2B4] # YI SYLLABLE CIE
+A2B5  ; [.2E2A.0020.0002.A2B5] # YI SYLLABLE CIEP
+A2B6  ; [.2E2B.0020.0002.A2B6] # YI SYLLABLE CAT
+A2B7  ; [.2E2C.0020.0002.A2B7] # YI SYLLABLE CAX
+A2B8  ; [.2E2D.0020.0002.A2B8] # YI SYLLABLE CA
+A2B9  ; [.2E2E.0020.0002.A2B9] # YI SYLLABLE CAP
+A2BA  ; [.2E2F.0020.0002.A2BA] # YI SYLLABLE CUOX
+A2BB  ; [.2E30.0020.0002.A2BB] # YI SYLLABLE CUO
+A2BC  ; [.2E31.0020.0002.A2BC] # YI SYLLABLE CUOP
+A2BD  ; [.2E32.0020.0002.A2BD] # YI SYLLABLE COT
+A2BE  ; [.2E33.0020.0002.A2BE] # YI SYLLABLE COX
+A2BF  ; [.2E34.0020.0002.A2BF] # YI SYLLABLE CO
+A2C0  ; [.2E35.0020.0002.A2C0] # YI SYLLABLE COP
+A2C1  ; [.2E36.0020.0002.A2C1] # YI SYLLABLE CEX
+A2C2  ; [.2E37.0020.0002.A2C2] # YI SYLLABLE CE
+A2C3  ; [.2E38.0020.0002.A2C3] # YI SYLLABLE CEP
+A2C4  ; [.2E39.0020.0002.A2C4] # YI SYLLABLE CUT
+A2C5  ; [.2E3A.0020.0002.A2C5] # YI SYLLABLE CUX
+A2C6  ; [.2E3B.0020.0002.A2C6] # YI SYLLABLE CU
+A2C7  ; [.2E3C.0020.0002.A2C7] # YI SYLLABLE CUP
+A2C8  ; [.2E3D.0020.0002.A2C8] # YI SYLLABLE CURX
+A2C9  ; [.2E3E.0020.0002.A2C9] # YI SYLLABLE CUR
+A2CA  ; [.2E3F.0020.0002.A2CA] # YI SYLLABLE CYT
+A2CB  ; [.2E40.0020.0002.A2CB] # YI SYLLABLE CYX
+A2CC  ; [.2E41.0020.0002.A2CC] # YI SYLLABLE CY
+A2CD  ; [.2E42.0020.0002.A2CD] # YI SYLLABLE CYP
+A2CE  ; [.2E43.0020.0002.A2CE] # YI SYLLABLE CYRX
+A2CF  ; [.2E44.0020.0002.A2CF] # YI SYLLABLE CYR
+A2D0  ; [.2E45.0020.0002.A2D0] # YI SYLLABLE ZZIT
+A2D1  ; [.2E46.0020.0002.A2D1] # YI SYLLABLE ZZIX
+A2D2  ; [.2E47.0020.0002.A2D2] # YI SYLLABLE ZZI
+A2D3  ; [.2E48.0020.0002.A2D3] # YI SYLLABLE ZZIP
+A2D4  ; [.2E49.0020.0002.A2D4] # YI SYLLABLE ZZIET
+A2D5  ; [.2E4A.0020.0002.A2D5] # YI SYLLABLE ZZIEX
+A2D6  ; [.2E4B.0020.0002.A2D6] # YI SYLLABLE ZZIE
+A2D7  ; [.2E4C.0020.0002.A2D7] # YI SYLLABLE ZZIEP
+A2D8  ; [.2E4D.0020.0002.A2D8] # YI SYLLABLE ZZAT
+A2D9  ; [.2E4E.0020.0002.A2D9] # YI SYLLABLE ZZAX
+A2DA  ; [.2E4F.0020.0002.A2DA] # YI SYLLABLE ZZA
+A2DB  ; [.2E50.0020.0002.A2DB] # YI SYLLABLE ZZAP
+A2DC  ; [.2E51.0020.0002.A2DC] # YI SYLLABLE ZZOX
+A2DD  ; [.2E52.0020.0002.A2DD] # YI SYLLABLE ZZO
+A2DE  ; [.2E53.0020.0002.A2DE] # YI SYLLABLE ZZOP
+A2DF  ; [.2E54.0020.0002.A2DF] # YI SYLLABLE ZZEX
+A2E0  ; [.2E55.0020.0002.A2E0] # YI SYLLABLE ZZE
+A2E1  ; [.2E56.0020.0002.A2E1] # YI SYLLABLE ZZEP
+A2E2  ; [.2E57.0020.0002.A2E2] # YI SYLLABLE ZZUX
+A2E3  ; [.2E58.0020.0002.A2E3] # YI SYLLABLE ZZU
+A2E4  ; [.2E59.0020.0002.A2E4] # YI SYLLABLE ZZUP
+A2E5  ; [.2E5A.0020.0002.A2E5] # YI SYLLABLE ZZURX
+A2E6  ; [.2E5B.0020.0002.A2E6] # YI SYLLABLE ZZUR
+A2E7  ; [.2E5C.0020.0002.A2E7] # YI SYLLABLE ZZYT
+A2E8  ; [.2E5D.0020.0002.A2E8] # YI SYLLABLE ZZYX
+A2E9  ; [.2E5E.0020.0002.A2E9] # YI SYLLABLE ZZY
+A2EA  ; [.2E5F.0020.0002.A2EA] # YI SYLLABLE ZZYP
+A2EB  ; [.2E60.0020.0002.A2EB] # YI SYLLABLE ZZYRX
+A2EC  ; [.2E61.0020.0002.A2EC] # YI SYLLABLE ZZYR
+A2ED  ; [.2E62.0020.0002.A2ED] # YI SYLLABLE NZIT
+A2EE  ; [.2E63.0020.0002.A2EE] # YI SYLLABLE NZIX
+A2EF  ; [.2E64.0020.0002.A2EF] # YI SYLLABLE NZI
+A2F0  ; [.2E65.0020.0002.A2F0] # YI SYLLABLE NZIP
+A2F1  ; [.2E66.0020.0002.A2F1] # YI SYLLABLE NZIEX
+A2F2  ; [.2E67.0020.0002.A2F2] # YI SYLLABLE NZIE
+A2F3  ; [.2E68.0020.0002.A2F3] # YI SYLLABLE NZIEP
+A2F4  ; [.2E69.0020.0002.A2F4] # YI SYLLABLE NZAT
+A2F5  ; [.2E6A.0020.0002.A2F5] # YI SYLLABLE NZAX
+A2F6  ; [.2E6B.0020.0002.A2F6] # YI SYLLABLE NZA
+A2F7  ; [.2E6C.0020.0002.A2F7] # YI SYLLABLE NZAP
+A2F8  ; [.2E6D.0020.0002.A2F8] # YI SYLLABLE NZUOX
+A2F9  ; [.2E6E.0020.0002.A2F9] # YI SYLLABLE NZUO
+A2FA  ; [.2E6F.0020.0002.A2FA] # YI SYLLABLE NZOX
+A2FB  ; [.2E70.0020.0002.A2FB] # YI SYLLABLE NZOP
+A2FC  ; [.2E71.0020.0002.A2FC] # YI SYLLABLE NZEX
+A2FD  ; [.2E72.0020.0002.A2FD] # YI SYLLABLE NZE
+A2FE  ; [.2E73.0020.0002.A2FE] # YI SYLLABLE NZUX
+A2FF  ; [.2E74.0020.0002.A2FF] # YI SYLLABLE NZU
+A300  ; [.2E75.0020.0002.A300] # YI SYLLABLE NZUP
+A301  ; [.2E76.0020.0002.A301] # YI SYLLABLE NZURX
+A302  ; [.2E77.0020.0002.A302] # YI SYLLABLE NZUR
+A303  ; [.2E78.0020.0002.A303] # YI SYLLABLE NZYT
+A304  ; [.2E79.0020.0002.A304] # YI SYLLABLE NZYX
+A305  ; [.2E7A.0020.0002.A305] # YI SYLLABLE NZY
+A306  ; [.2E7B.0020.0002.A306] # YI SYLLABLE NZYP
+A307  ; [.2E7C.0020.0002.A307] # YI SYLLABLE NZYRX
+A308  ; [.2E7D.0020.0002.A308] # YI SYLLABLE NZYR
+A309  ; [.2E7E.0020.0002.A309] # YI SYLLABLE SIT
+A30A  ; [.2E7F.0020.0002.A30A] # YI SYLLABLE SIX
+A30B  ; [.2E80.0020.0002.A30B] # YI SYLLABLE SI
+A30C  ; [.2E81.0020.0002.A30C] # YI SYLLABLE SIP
+A30D  ; [.2E82.0020.0002.A30D] # YI SYLLABLE SIEX
+A30E  ; [.2E83.0020.0002.A30E] # YI SYLLABLE SIE
+A30F  ; [.2E84.0020.0002.A30F] # YI SYLLABLE SIEP
+A310  ; [.2E85.0020.0002.A310] # YI SYLLABLE SAT
+A311  ; [.2E86.0020.0002.A311] # YI SYLLABLE SAX
+A312  ; [.2E87.0020.0002.A312] # YI SYLLABLE SA
+A313  ; [.2E88.0020.0002.A313] # YI SYLLABLE SAP
+A314  ; [.2E89.0020.0002.A314] # YI SYLLABLE SUOX
+A315  ; [.2E8A.0020.0002.A315] # YI SYLLABLE SUO
+A316  ; [.2E8B.0020.0002.A316] # YI SYLLABLE SUOP
+A317  ; [.2E8C.0020.0002.A317] # YI SYLLABLE SOT
+A318  ; [.2E8D.0020.0002.A318] # YI SYLLABLE SOX
+A319  ; [.2E8E.0020.0002.A319] # YI SYLLABLE SO
+A31A  ; [.2E8F.0020.0002.A31A] # YI SYLLABLE SOP
+A31B  ; [.2E90.0020.0002.A31B] # YI SYLLABLE SEX
+A31C  ; [.2E91.0020.0002.A31C] # YI SYLLABLE SE
+A31D  ; [.2E92.0020.0002.A31D] # YI SYLLABLE SEP
+A31E  ; [.2E93.0020.0002.A31E] # YI SYLLABLE SUT
+A31F  ; [.2E94.0020.0002.A31F] # YI SYLLABLE SUX
+A320  ; [.2E95.0020.0002.A320] # YI SYLLABLE SU
+A321  ; [.2E96.0020.0002.A321] # YI SYLLABLE SUP
+A322  ; [.2E97.0020.0002.A322] # YI SYLLABLE SURX
+A323  ; [.2E98.0020.0002.A323] # YI SYLLABLE SUR
+A324  ; [.2E99.0020.0002.A324] # YI SYLLABLE SYT
+A325  ; [.2E9A.0020.0002.A325] # YI SYLLABLE SYX
+A326  ; [.2E9B.0020.0002.A326] # YI SYLLABLE SY
+A327  ; [.2E9C.0020.0002.A327] # YI SYLLABLE SYP
+A328  ; [.2E9D.0020.0002.A328] # YI SYLLABLE SYRX
+A329  ; [.2E9E.0020.0002.A329] # YI SYLLABLE SYR
+A32A  ; [.2E9F.0020.0002.A32A] # YI SYLLABLE SSIT
+A32B  ; [.2EA0.0020.0002.A32B] # YI SYLLABLE SSIX
+A32C  ; [.2EA1.0020.0002.A32C] # YI SYLLABLE SSI
+A32D  ; [.2EA2.0020.0002.A32D] # YI SYLLABLE SSIP
+A32E  ; [.2EA3.0020.0002.A32E] # YI SYLLABLE SSIEX
+A32F  ; [.2EA4.0020.0002.A32F] # YI SYLLABLE SSIE
+A330  ; [.2EA5.0020.0002.A330] # YI SYLLABLE SSIEP
+A331  ; [.2EA6.0020.0002.A331] # YI SYLLABLE SSAT
+A332  ; [.2EA7.0020.0002.A332] # YI SYLLABLE SSAX
+A333  ; [.2EA8.0020.0002.A333] # YI SYLLABLE SSA
+A334  ; [.2EA9.0020.0002.A334] # YI SYLLABLE SSAP
+A335  ; [.2EAA.0020.0002.A335] # YI SYLLABLE SSOT
+A336  ; [.2EAB.0020.0002.A336] # YI SYLLABLE SSOX
+A337  ; [.2EAC.0020.0002.A337] # YI SYLLABLE SSO
+A338  ; [.2EAD.0020.0002.A338] # YI SYLLABLE SSOP
+A339  ; [.2EAE.0020.0002.A339] # YI SYLLABLE SSEX
+A33A  ; [.2EAF.0020.0002.A33A] # YI SYLLABLE SSE
+A33B  ; [.2EB0.0020.0002.A33B] # YI SYLLABLE SSEP
+A33C  ; [.2EB1.0020.0002.A33C] # YI SYLLABLE SSUT
+A33D  ; [.2EB2.0020.0002.A33D] # YI SYLLABLE SSUX
+A33E  ; [.2EB3.0020.0002.A33E] # YI SYLLABLE SSU
+A33F  ; [.2EB4.0020.0002.A33F] # YI SYLLABLE SSUP
+A340  ; [.2EB5.0020.0002.A340] # YI SYLLABLE SSYT
+A341  ; [.2EB6.0020.0002.A341] # YI SYLLABLE SSYX
+A342  ; [.2EB7.0020.0002.A342] # YI SYLLABLE SSY
+A343  ; [.2EB8.0020.0002.A343] # YI SYLLABLE SSYP
+A344  ; [.2EB9.0020.0002.A344] # YI SYLLABLE SSYRX
+A345  ; [.2EBA.0020.0002.A345] # YI SYLLABLE SSYR
+A346  ; [.2EBB.0020.0002.A346] # YI SYLLABLE ZHAT
+A347  ; [.2EBC.0020.0002.A347] # YI SYLLABLE ZHAX
+A348  ; [.2EBD.0020.0002.A348] # YI SYLLABLE ZHA
+A349  ; [.2EBE.0020.0002.A349] # YI SYLLABLE ZHAP
+A34A  ; [.2EBF.0020.0002.A34A] # YI SYLLABLE ZHUOX
+A34B  ; [.2EC0.0020.0002.A34B] # YI SYLLABLE ZHUO
+A34C  ; [.2EC1.0020.0002.A34C] # YI SYLLABLE ZHUOP
+A34D  ; [.2EC2.0020.0002.A34D] # YI SYLLABLE ZHOT
+A34E  ; [.2EC3.0020.0002.A34E] # YI SYLLABLE ZHOX
+A34F  ; [.2EC4.0020.0002.A34F] # YI SYLLABLE ZHO
+A350  ; [.2EC5.0020.0002.A350] # YI SYLLABLE ZHOP
+A351  ; [.2EC6.0020.0002.A351] # YI SYLLABLE ZHET
+A352  ; [.2EC7.0020.0002.A352] # YI SYLLABLE ZHEX
+A353  ; [.2EC8.0020.0002.A353] # YI SYLLABLE ZHE
+A354  ; [.2EC9.0020.0002.A354] # YI SYLLABLE ZHEP
+A355  ; [.2ECA.0020.0002.A355] # YI SYLLABLE ZHUT
+A356  ; [.2ECB.0020.0002.A356] # YI SYLLABLE ZHUX
+A357  ; [.2ECC.0020.0002.A357] # YI SYLLABLE ZHU
+A358  ; [.2ECD.0020.0002.A358] # YI SYLLABLE ZHUP
+A359  ; [.2ECE.0020.0002.A359] # YI SYLLABLE ZHURX
+A35A  ; [.2ECF.0020.0002.A35A] # YI SYLLABLE ZHUR
+A35B  ; [.2ED0.0020.0002.A35B] # YI SYLLABLE ZHYT
+A35C  ; [.2ED1.0020.0002.A35C] # YI SYLLABLE ZHYX
+A35D  ; [.2ED2.0020.0002.A35D] # YI SYLLABLE ZHY
+A35E  ; [.2ED3.0020.0002.A35E] # YI SYLLABLE ZHYP
+A35F  ; [.2ED4.0020.0002.A35F] # YI SYLLABLE ZHYRX
+A360  ; [.2ED5.0020.0002.A360] # YI SYLLABLE ZHYR
+A361  ; [.2ED6.0020.0002.A361] # YI SYLLABLE CHAT
+A362  ; [.2ED7.0020.0002.A362] # YI SYLLABLE CHAX
+A363  ; [.2ED8.0020.0002.A363] # YI SYLLABLE CHA
+A364  ; [.2ED9.0020.0002.A364] # YI SYLLABLE CHAP
+A365  ; [.2EDA.0020.0002.A365] # YI SYLLABLE CHUOT
+A366  ; [.2EDB.0020.0002.A366] # YI SYLLABLE CHUOX
+A367  ; [.2EDC.0020.0002.A367] # YI SYLLABLE CHUO
+A368  ; [.2EDD.0020.0002.A368] # YI SYLLABLE CHUOP
+A369  ; [.2EDE.0020.0002.A369] # YI SYLLABLE CHOT
+A36A  ; [.2EDF.0020.0002.A36A] # YI SYLLABLE CHOX
+A36B  ; [.2EE0.0020.0002.A36B] # YI SYLLABLE CHO
+A36C  ; [.2EE1.0020.0002.A36C] # YI SYLLABLE CHOP
+A36D  ; [.2EE2.0020.0002.A36D] # YI SYLLABLE CHET
+A36E  ; [.2EE3.0020.0002.A36E] # YI SYLLABLE CHEX
+A36F  ; [.2EE4.0020.0002.A36F] # YI SYLLABLE CHE
+A370  ; [.2EE5.0020.0002.A370] # YI SYLLABLE CHEP
+A371  ; [.2EE6.0020.0002.A371] # YI SYLLABLE CHUX
+A372  ; [.2EE7.0020.0002.A372] # YI SYLLABLE CHU
+A373  ; [.2EE8.0020.0002.A373] # YI SYLLABLE CHUP
+A374  ; [.2EE9.0020.0002.A374] # YI SYLLABLE CHURX
+A375  ; [.2EEA.0020.0002.A375] # YI SYLLABLE CHUR
+A376  ; [.2EEB.0020.0002.A376] # YI SYLLABLE CHYT
+A377  ; [.2EEC.0020.0002.A377] # YI SYLLABLE CHYX
+A378  ; [.2EED.0020.0002.A378] # YI SYLLABLE CHY
+A379  ; [.2EEE.0020.0002.A379] # YI SYLLABLE CHYP
+A37A  ; [.2EEF.0020.0002.A37A] # YI SYLLABLE CHYRX
+A37B  ; [.2EF0.0020.0002.A37B] # YI SYLLABLE CHYR
+A37C  ; [.2EF1.0020.0002.A37C] # YI SYLLABLE RRAX
+A37D  ; [.2EF2.0020.0002.A37D] # YI SYLLABLE RRA
+A37E  ; [.2EF3.0020.0002.A37E] # YI SYLLABLE RRUOX
+A37F  ; [.2EF4.0020.0002.A37F] # YI SYLLABLE RRUO
+A380  ; [.2EF5.0020.0002.A380] # YI SYLLABLE RROT
+A381  ; [.2EF6.0020.0002.A381] # YI SYLLABLE RROX
+A382  ; [.2EF7.0020.0002.A382] # YI SYLLABLE RRO
+A383  ; [.2EF8.0020.0002.A383] # YI SYLLABLE RROP
+A384  ; [.2EF9.0020.0002.A384] # YI SYLLABLE RRET
+A385  ; [.2EFA.0020.0002.A385] # YI SYLLABLE RREX
+A386  ; [.2EFB.0020.0002.A386] # YI SYLLABLE RRE
+A387  ; [.2EFC.0020.0002.A387] # YI SYLLABLE RREP
+A388  ; [.2EFD.0020.0002.A388] # YI SYLLABLE RRUT
+A389  ; [.2EFE.0020.0002.A389] # YI SYLLABLE RRUX
+A38A  ; [.2EFF.0020.0002.A38A] # YI SYLLABLE RRU
+A38B  ; [.2F00.0020.0002.A38B] # YI SYLLABLE RRUP
+A38C  ; [.2F01.0020.0002.A38C] # YI SYLLABLE RRURX
+A38D  ; [.2F02.0020.0002.A38D] # YI SYLLABLE RRUR
+A38E  ; [.2F03.0020.0002.A38E] # YI SYLLABLE RRYT
+A38F  ; [.2F04.0020.0002.A38F] # YI SYLLABLE RRYX
+A390  ; [.2F05.0020.0002.A390] # YI SYLLABLE RRY
+A391  ; [.2F06.0020.0002.A391] # YI SYLLABLE RRYP
+A392  ; [.2F07.0020.0002.A392] # YI SYLLABLE RRYRX
+A393  ; [.2F08.0020.0002.A393] # YI SYLLABLE RRYR
+A394  ; [.2F09.0020.0002.A394] # YI SYLLABLE NRAT
+A395  ; [.2F0A.0020.0002.A395] # YI SYLLABLE NRAX
+A396  ; [.2F0B.0020.0002.A396] # YI SYLLABLE NRA
+A397  ; [.2F0C.0020.0002.A397] # YI SYLLABLE NRAP
+A398  ; [.2F0D.0020.0002.A398] # YI SYLLABLE NROX
+A399  ; [.2F0E.0020.0002.A399] # YI SYLLABLE NRO
+A39A  ; [.2F0F.0020.0002.A39A] # YI SYLLABLE NROP
+A39B  ; [.2F10.0020.0002.A39B] # YI SYLLABLE NRET
+A39C  ; [.2F11.0020.0002.A39C] # YI SYLLABLE NREX
+A39D  ; [.2F12.0020.0002.A39D] # YI SYLLABLE NRE
+A39E  ; [.2F13.0020.0002.A39E] # YI SYLLABLE NREP
+A39F  ; [.2F14.0020.0002.A39F] # YI SYLLABLE NRUT
+A3A0  ; [.2F15.0020.0002.A3A0] # YI SYLLABLE NRUX
+A3A1  ; [.2F16.0020.0002.A3A1] # YI SYLLABLE NRU
+A3A2  ; [.2F17.0020.0002.A3A2] # YI SYLLABLE NRUP
+A3A3  ; [.2F18.0020.0002.A3A3] # YI SYLLABLE NRURX
+A3A4  ; [.2F19.0020.0002.A3A4] # YI SYLLABLE NRUR
+A3A5  ; [.2F1A.0020.0002.A3A5] # YI SYLLABLE NRYT
+A3A6  ; [.2F1B.0020.0002.A3A6] # YI SYLLABLE NRYX
+A3A7  ; [.2F1C.0020.0002.A3A7] # YI SYLLABLE NRY
+A3A8  ; [.2F1D.0020.0002.A3A8] # YI SYLLABLE NRYP
+A3A9  ; [.2F1E.0020.0002.A3A9] # YI SYLLABLE NRYRX
+A3AA  ; [.2F1F.0020.0002.A3AA] # YI SYLLABLE NRYR
+A3AB  ; [.2F20.0020.0002.A3AB] # YI SYLLABLE SHAT
+A3AC  ; [.2F21.0020.0002.A3AC] # YI SYLLABLE SHAX
+A3AD  ; [.2F22.0020.0002.A3AD] # YI SYLLABLE SHA
+A3AE  ; [.2F23.0020.0002.A3AE] # YI SYLLABLE SHAP
+A3AF  ; [.2F24.0020.0002.A3AF] # YI SYLLABLE SHUOX
+A3B0  ; [.2F25.0020.0002.A3B0] # YI SYLLABLE SHUO
+A3B1  ; [.2F26.0020.0002.A3B1] # YI SYLLABLE SHUOP
+A3B2  ; [.2F27.0020.0002.A3B2] # YI SYLLABLE SHOT
+A3B3  ; [.2F28.0020.0002.A3B3] # YI SYLLABLE SHOX
+A3B4  ; [.2F29.0020.0002.A3B4] # YI SYLLABLE SHO
+A3B5  ; [.2F2A.0020.0002.A3B5] # YI SYLLABLE SHOP
+A3B6  ; [.2F2B.0020.0002.A3B6] # YI SYLLABLE SHET
+A3B7  ; [.2F2C.0020.0002.A3B7] # YI SYLLABLE SHEX
+A3B8  ; [.2F2D.0020.0002.A3B8] # YI SYLLABLE SHE
+A3B9  ; [.2F2E.0020.0002.A3B9] # YI SYLLABLE SHEP
+A3BA  ; [.2F2F.0020.0002.A3BA] # YI SYLLABLE SHUT
+A3BB  ; [.2F30.0020.0002.A3BB] # YI SYLLABLE SHUX
+A3BC  ; [.2F31.0020.0002.A3BC] # YI SYLLABLE SHU
+A3BD  ; [.2F32.0020.0002.A3BD] # YI SYLLABLE SHUP
+A3BE  ; [.2F33.0020.0002.A3BE] # YI SYLLABLE SHURX
+A3BF  ; [.2F34.0020.0002.A3BF] # YI SYLLABLE SHUR
+A3C0  ; [.2F35.0020.0002.A3C0] # YI SYLLABLE SHYT
+A3C1  ; [.2F36.0020.0002.A3C1] # YI SYLLABLE SHYX
+A3C2  ; [.2F37.0020.0002.A3C2] # YI SYLLABLE SHY
+A3C3  ; [.2F38.0020.0002.A3C3] # YI SYLLABLE SHYP
+A3C4  ; [.2F39.0020.0002.A3C4] # YI SYLLABLE SHYRX
+A3C5  ; [.2F3A.0020.0002.A3C5] # YI SYLLABLE SHYR
+A3C6  ; [.2F3B.0020.0002.A3C6] # YI SYLLABLE RAT
+A3C7  ; [.2F3C.0020.0002.A3C7] # YI SYLLABLE RAX
+A3C8  ; [.2F3D.0020.0002.A3C8] # YI SYLLABLE RA
+A3C9  ; [.2F3E.0020.0002.A3C9] # YI SYLLABLE RAP
+A3CA  ; [.2F3F.0020.0002.A3CA] # YI SYLLABLE RUOX
+A3CB  ; [.2F40.0020.0002.A3CB] # YI SYLLABLE RUO
+A3CC  ; [.2F41.0020.0002.A3CC] # YI SYLLABLE RUOP
+A3CD  ; [.2F42.0020.0002.A3CD] # YI SYLLABLE ROT
+A3CE  ; [.2F43.0020.0002.A3CE] # YI SYLLABLE ROX
+A3CF  ; [.2F44.0020.0002.A3CF] # YI SYLLABLE RO
+A3D0  ; [.2F45.0020.0002.A3D0] # YI SYLLABLE ROP
+A3D1  ; [.2F46.0020.0002.A3D1] # YI SYLLABLE REX
+A3D2  ; [.2F47.0020.0002.A3D2] # YI SYLLABLE RE
+A3D3  ; [.2F48.0020.0002.A3D3] # YI SYLLABLE REP
+A3D4  ; [.2F49.0020.0002.A3D4] # YI SYLLABLE RUT
+A3D5  ; [.2F4A.0020.0002.A3D5] # YI SYLLABLE RUX
+A3D6  ; [.2F4B.0020.0002.A3D6] # YI SYLLABLE RU
+A3D7  ; [.2F4C.0020.0002.A3D7] # YI SYLLABLE RUP
+A3D8  ; [.2F4D.0020.0002.A3D8] # YI SYLLABLE RURX
+A3D9  ; [.2F4E.0020.0002.A3D9] # YI SYLLABLE RUR
+A3DA  ; [.2F4F.0020.0002.A3DA] # YI SYLLABLE RYT
+A3DB  ; [.2F50.0020.0002.A3DB] # YI SYLLABLE RYX
+A3DC  ; [.2F51.0020.0002.A3DC] # YI SYLLABLE RY
+A3DD  ; [.2F52.0020.0002.A3DD] # YI SYLLABLE RYP
+A3DE  ; [.2F53.0020.0002.A3DE] # YI SYLLABLE RYRX
+A3DF  ; [.2F54.0020.0002.A3DF] # YI SYLLABLE RYR
+A3E0  ; [.2F55.0020.0002.A3E0] # YI SYLLABLE JIT
+A3E1  ; [.2F56.0020.0002.A3E1] # YI SYLLABLE JIX
+A3E2  ; [.2F57.0020.0002.A3E2] # YI SYLLABLE JI
+A3E3  ; [.2F58.0020.0002.A3E3] # YI SYLLABLE JIP
+A3E4  ; [.2F59.0020.0002.A3E4] # YI SYLLABLE JIET
+A3E5  ; [.2F5A.0020.0002.A3E5] # YI SYLLABLE JIEX
+A3E6  ; [.2F5B.0020.0002.A3E6] # YI SYLLABLE JIE
+A3E7  ; [.2F5C.0020.0002.A3E7] # YI SYLLABLE JIEP
+A3E8  ; [.2F5D.0020.0002.A3E8] # YI SYLLABLE JUOT
+A3E9  ; [.2F5E.0020.0002.A3E9] # YI SYLLABLE JUOX
+A3EA  ; [.2F5F.0020.0002.A3EA] # YI SYLLABLE JUO
+A3EB  ; [.2F60.0020.0002.A3EB] # YI SYLLABLE JUOP
+A3EC  ; [.2F61.0020.0002.A3EC] # YI SYLLABLE JOT
+A3ED  ; [.2F62.0020.0002.A3ED] # YI SYLLABLE JOX
+A3EE  ; [.2F63.0020.0002.A3EE] # YI SYLLABLE JO
+A3EF  ; [.2F64.0020.0002.A3EF] # YI SYLLABLE JOP
+A3F0  ; [.2F65.0020.0002.A3F0] # YI SYLLABLE JUT
+A3F1  ; [.2F66.0020.0002.A3F1] # YI SYLLABLE JUX
+A3F2  ; [.2F67.0020.0002.A3F2] # YI SYLLABLE JU
+A3F3  ; [.2F68.0020.0002.A3F3] # YI SYLLABLE JUP
+A3F4  ; [.2F69.0020.0002.A3F4] # YI SYLLABLE JURX
+A3F5  ; [.2F6A.0020.0002.A3F5] # YI SYLLABLE JUR
+A3F6  ; [.2F6B.0020.0002.A3F6] # YI SYLLABLE JYT
+A3F7  ; [.2F6C.0020.0002.A3F7] # YI SYLLABLE JYX
+A3F8  ; [.2F6D.0020.0002.A3F8] # YI SYLLABLE JY
+A3F9  ; [.2F6E.0020.0002.A3F9] # YI SYLLABLE JYP
+A3FA  ; [.2F6F.0020.0002.A3FA] # YI SYLLABLE JYRX
+A3FB  ; [.2F70.0020.0002.A3FB] # YI SYLLABLE JYR
+A3FC  ; [.2F71.0020.0002.A3FC] # YI SYLLABLE QIT
+A3FD  ; [.2F72.0020.0002.A3FD] # YI SYLLABLE QIX
+A3FE  ; [.2F73.0020.0002.A3FE] # YI SYLLABLE QI
+A3FF  ; [.2F74.0020.0002.A3FF] # YI SYLLABLE QIP
+A400  ; [.2F75.0020.0002.A400] # YI SYLLABLE QIET
+A401  ; [.2F76.0020.0002.A401] # YI SYLLABLE QIEX
+A402  ; [.2F77.0020.0002.A402] # YI SYLLABLE QIE
+A403  ; [.2F78.0020.0002.A403] # YI SYLLABLE QIEP
+A404  ; [.2F79.0020.0002.A404] # YI SYLLABLE QUOT
+A405  ; [.2F7A.0020.0002.A405] # YI SYLLABLE QUOX
+A406  ; [.2F7B.0020.0002.A406] # YI SYLLABLE QUO
+A407  ; [.2F7C.0020.0002.A407] # YI SYLLABLE QUOP
+A408  ; [.2F7D.0020.0002.A408] # YI SYLLABLE QOT
+A409  ; [.2F7E.0020.0002.A409] # YI SYLLABLE QOX
+A40A  ; [.2F7F.0020.0002.A40A] # YI SYLLABLE QO
+A40B  ; [.2F80.0020.0002.A40B] # YI SYLLABLE QOP
+A40C  ; [.2F81.0020.0002.A40C] # YI SYLLABLE QUT
+A40D  ; [.2F82.0020.0002.A40D] # YI SYLLABLE QUX
+A40E  ; [.2F83.0020.0002.A40E] # YI SYLLABLE QU
+A40F  ; [.2F84.0020.0002.A40F] # YI SYLLABLE QUP
+A410  ; [.2F85.0020.0002.A410] # YI SYLLABLE QURX
+A411  ; [.2F86.0020.0002.A411] # YI SYLLABLE QUR
+A412  ; [.2F87.0020.0002.A412] # YI SYLLABLE QYT
+A413  ; [.2F88.0020.0002.A413] # YI SYLLABLE QYX
+A414  ; [.2F89.0020.0002.A414] # YI SYLLABLE QY
+A415  ; [.2F8A.0020.0002.A415] # YI SYLLABLE QYP
+A416  ; [.2F8B.0020.0002.A416] # YI SYLLABLE QYRX
+A417  ; [.2F8C.0020.0002.A417] # YI SYLLABLE QYR
+A418  ; [.2F8D.0020.0002.A418] # YI SYLLABLE JJIT
+A419  ; [.2F8E.0020.0002.A419] # YI SYLLABLE JJIX
+A41A  ; [.2F8F.0020.0002.A41A] # YI SYLLABLE JJI
+A41B  ; [.2F90.0020.0002.A41B] # YI SYLLABLE JJIP
+A41C  ; [.2F91.0020.0002.A41C] # YI SYLLABLE JJIET
+A41D  ; [.2F92.0020.0002.A41D] # YI SYLLABLE JJIEX
+A41E  ; [.2F93.0020.0002.A41E] # YI SYLLABLE JJIE
+A41F  ; [.2F94.0020.0002.A41F] # YI SYLLABLE JJIEP
+A420  ; [.2F95.0020.0002.A420] # YI SYLLABLE JJUOX
+A421  ; [.2F96.0020.0002.A421] # YI SYLLABLE JJUO
+A422  ; [.2F97.0020.0002.A422] # YI SYLLABLE JJUOP
+A423  ; [.2F98.0020.0002.A423] # YI SYLLABLE JJOT
+A424  ; [.2F99.0020.0002.A424] # YI SYLLABLE JJOX
+A425  ; [.2F9A.0020.0002.A425] # YI SYLLABLE JJO
+A426  ; [.2F9B.0020.0002.A426] # YI SYLLABLE JJOP
+A427  ; [.2F9C.0020.0002.A427] # YI SYLLABLE JJUT
+A428  ; [.2F9D.0020.0002.A428] # YI SYLLABLE JJUX
+A429  ; [.2F9E.0020.0002.A429] # YI SYLLABLE JJU
+A42A  ; [.2F9F.0020.0002.A42A] # YI SYLLABLE JJUP
+A42B  ; [.2FA0.0020.0002.A42B] # YI SYLLABLE JJURX
+A42C  ; [.2FA1.0020.0002.A42C] # YI SYLLABLE JJUR
+A42D  ; [.2FA2.0020.0002.A42D] # YI SYLLABLE JJYT
+A42E  ; [.2FA3.0020.0002.A42E] # YI SYLLABLE JJYX
+A42F  ; [.2FA4.0020.0002.A42F] # YI SYLLABLE JJY
+A430  ; [.2FA5.0020.0002.A430] # YI SYLLABLE JJYP
+A431  ; [.2FA6.0020.0002.A431] # YI SYLLABLE NJIT
+A432  ; [.2FA7.0020.0002.A432] # YI SYLLABLE NJIX
+A433  ; [.2FA8.0020.0002.A433] # YI SYLLABLE NJI
+A434  ; [.2FA9.0020.0002.A434] # YI SYLLABLE NJIP
+A435  ; [.2FAA.0020.0002.A435] # YI SYLLABLE NJIET
+A436  ; [.2FAB.0020.0002.A436] # YI SYLLABLE NJIEX
+A437  ; [.2FAC.0020.0002.A437] # YI SYLLABLE NJIE
+A438  ; [.2FAD.0020.0002.A438] # YI SYLLABLE NJIEP
+A439  ; [.2FAE.0020.0002.A439] # YI SYLLABLE NJUOX
+A43A  ; [.2FAF.0020.0002.A43A] # YI SYLLABLE NJUO
+A43B  ; [.2FB0.0020.0002.A43B] # YI SYLLABLE NJOT
+A43C  ; [.2FB1.0020.0002.A43C] # YI SYLLABLE NJOX
+A43D  ; [.2FB2.0020.0002.A43D] # YI SYLLABLE NJO
+A43E  ; [.2FB3.0020.0002.A43E] # YI SYLLABLE NJOP
+A43F  ; [.2FB4.0020.0002.A43F] # YI SYLLABLE NJUX
+A440  ; [.2FB5.0020.0002.A440] # YI SYLLABLE NJU
+A441  ; [.2FB6.0020.0002.A441] # YI SYLLABLE NJUP
+A442  ; [.2FB7.0020.0002.A442] # YI SYLLABLE NJURX
+A443  ; [.2FB8.0020.0002.A443] # YI SYLLABLE NJUR
+A444  ; [.2FB9.0020.0002.A444] # YI SYLLABLE NJYT
+A445  ; [.2FBA.0020.0002.A445] # YI SYLLABLE NJYX
+A446  ; [.2FBB.0020.0002.A446] # YI SYLLABLE NJY
+A447  ; [.2FBC.0020.0002.A447] # YI SYLLABLE NJYP
+A448  ; [.2FBD.0020.0002.A448] # YI SYLLABLE NJYRX
+A449  ; [.2FBE.0020.0002.A449] # YI SYLLABLE NJYR
+A44A  ; [.2FBF.0020.0002.A44A] # YI SYLLABLE NYIT
+A44B  ; [.2FC0.0020.0002.A44B] # YI SYLLABLE NYIX
+A44C  ; [.2FC1.0020.0002.A44C] # YI SYLLABLE NYI
+A44D  ; [.2FC2.0020.0002.A44D] # YI SYLLABLE NYIP
+A44E  ; [.2FC3.0020.0002.A44E] # YI SYLLABLE NYIET
+A44F  ; [.2FC4.0020.0002.A44F] # YI SYLLABLE NYIEX
+A450  ; [.2FC5.0020.0002.A450] # YI SYLLABLE NYIE
+A451  ; [.2FC6.0020.0002.A451] # YI SYLLABLE NYIEP
+A452  ; [.2FC7.0020.0002.A452] # YI SYLLABLE NYUOX
+A453  ; [.2FC8.0020.0002.A453] # YI SYLLABLE NYUO
+A454  ; [.2FC9.0020.0002.A454] # YI SYLLABLE NYUOP
+A455  ; [.2FCA.0020.0002.A455] # YI SYLLABLE NYOT
+A456  ; [.2FCB.0020.0002.A456] # YI SYLLABLE NYOX
+A457  ; [.2FCC.0020.0002.A457] # YI SYLLABLE NYO
+A458  ; [.2FCD.0020.0002.A458] # YI SYLLABLE NYOP
+A459  ; [.2FCE.0020.0002.A459] # YI SYLLABLE NYUT
+A45A  ; [.2FCF.0020.0002.A45A] # YI SYLLABLE NYUX
+A45B  ; [.2FD0.0020.0002.A45B] # YI SYLLABLE NYU
+A45C  ; [.2FD1.0020.0002.A45C] # YI SYLLABLE NYUP
+A45D  ; [.2FD2.0020.0002.A45D] # YI SYLLABLE XIT
+A45E  ; [.2FD3.0020.0002.A45E] # YI SYLLABLE XIX
+A45F  ; [.2FD4.0020.0002.A45F] # YI SYLLABLE XI
+A460  ; [.2FD5.0020.0002.A460] # YI SYLLABLE XIP
+A461  ; [.2FD6.0020.0002.A461] # YI SYLLABLE XIET
+A462  ; [.2FD7.0020.0002.A462] # YI SYLLABLE XIEX
+A463  ; [.2FD8.0020.0002.A463] # YI SYLLABLE XIE
+A464  ; [.2FD9.0020.0002.A464] # YI SYLLABLE XIEP
+A465  ; [.2FDA.0020.0002.A465] # YI SYLLABLE XUOX
+A466  ; [.2FDB.0020.0002.A466] # YI SYLLABLE XUO
+A467  ; [.2FDC.0020.0002.A467] # YI SYLLABLE XOT
+A468  ; [.2FDD.0020.0002.A468] # YI SYLLABLE XOX
+A469  ; [.2FDE.0020.0002.A469] # YI SYLLABLE XO
+A46A  ; [.2FDF.0020.0002.A46A] # YI SYLLABLE XOP
+A46B  ; [.2FE0.0020.0002.A46B] # YI SYLLABLE XYT
+A46C  ; [.2FE1.0020.0002.A46C] # YI SYLLABLE XYX
+A46D  ; [.2FE2.0020.0002.A46D] # YI SYLLABLE XY
+A46E  ; [.2FE3.0020.0002.A46E] # YI SYLLABLE XYP
+A46F  ; [.2FE4.0020.0002.A46F] # YI SYLLABLE XYRX
+A470  ; [.2FE5.0020.0002.A470] # YI SYLLABLE XYR
+A471  ; [.2FE6.0020.0002.A471] # YI SYLLABLE YIT
+A472  ; [.2FE7.0020.0002.A472] # YI SYLLABLE YIX
+A473  ; [.2FE8.0020.0002.A473] # YI SYLLABLE YI
+A474  ; [.2FE9.0020.0002.A474] # YI SYLLABLE YIP
+A475  ; [.2FEA.0020.0002.A475] # YI SYLLABLE YIET
+A476  ; [.2FEB.0020.0002.A476] # YI SYLLABLE YIEX
+A477  ; [.2FEC.0020.0002.A477] # YI SYLLABLE YIE
+A478  ; [.2FED.0020.0002.A478] # YI SYLLABLE YIEP
+A479  ; [.2FEE.0020.0002.A479] # YI SYLLABLE YUOT
+A47A  ; [.2FEF.0020.0002.A47A] # YI SYLLABLE YUOX
+A47B  ; [.2FF0.0020.0002.A47B] # YI SYLLABLE YUO
+A47C  ; [.2FF1.0020.0002.A47C] # YI SYLLABLE YUOP
+A47D  ; [.2FF2.0020.0002.A47D] # YI SYLLABLE YOT
+A47E  ; [.2FF3.0020.0002.A47E] # YI SYLLABLE YOX
+A47F  ; [.2FF4.0020.0002.A47F] # YI SYLLABLE YO
+A480  ; [.2FF5.0020.0002.A480] # YI SYLLABLE YOP
+A481  ; [.2FF6.0020.0002.A481] # YI SYLLABLE YUT
+A482  ; [.2FF7.0020.0002.A482] # YI SYLLABLE YUX
+A483  ; [.2FF8.0020.0002.A483] # YI SYLLABLE YU
+A484  ; [.2FF9.0020.0002.A484] # YI SYLLABLE YUP
+A485  ; [.2FFA.0020.0002.A485] # YI SYLLABLE YURX
+A486  ; [.2FFB.0020.0002.A486] # YI SYLLABLE YUR
+A487  ; [.2FFC.0020.0002.A487] # YI SYLLABLE YYT
+A488  ; [.2FFD.0020.0002.A488] # YI SYLLABLE YYX
+A489  ; [.2FFE.0020.0002.A489] # YI SYLLABLE YY
+A48A  ; [.2FFF.0020.0002.A48A] # YI SYLLABLE YYP
+A48B  ; [.3000.0020.0002.A48B] # YI SYLLABLE YYRX
+A48C  ; [.3001.0020.0002.A48C] # YI SYLLABLE YYR
+A4F8  ; [.3002.0020.0002.A4F8] # LISU LETTER TONE MYA TI
+A4F9  ; [.3003.0020.0002.A4F9] # LISU LETTER TONE NA PO
+A4FA  ; [.3004.0020.0002.A4FA] # LISU LETTER TONE MYA CYA
+A4FB  ; [.3005.0020.0002.A4FB] # LISU LETTER TONE MYA BO
+A4FD  ; [.3006.0020.0002.A4FD] # LISU LETTER TONE MYA JEU
+A4FC  ; [.3007.0020.0002.A4FC] # LISU LETTER TONE MYA NA
+A4D0  ; [.3008.0020.0002.A4D0] # LISU LETTER BA
+A4D1  ; [.3009.0020.0002.A4D1] # LISU LETTER PA
+A4D2  ; [.300A.0020.0002.A4D2] # LISU LETTER PHA
+A4D3  ; [.300B.0020.0002.A4D3] # LISU LETTER DA
+A4D4  ; [.300C.0020.0002.A4D4] # LISU LETTER TA
+A4D5  ; [.300D.0020.0002.A4D5] # LISU LETTER THA
+A4D6  ; [.300E.0020.0002.A4D6] # LISU LETTER GA
+A4D7  ; [.300F.0020.0002.A4D7] # LISU LETTER KA
+A4D8  ; [.3010.0020.0002.A4D8] # LISU LETTER KHA
+A4D9  ; [.3011.0020.0002.A4D9] # LISU LETTER JA
+A4DA  ; [.3012.0020.0002.A4DA] # LISU LETTER CA
+A4DB  ; [.3013.0020.0002.A4DB] # LISU LETTER CHA
+A4DC  ; [.3014.0020.0002.A4DC] # LISU LETTER DZA
+A4DD  ; [.3015.0020.0002.A4DD] # LISU LETTER TSA
+A4DE  ; [.3016.0020.0002.A4DE] # LISU LETTER TSHA
+A4DF  ; [.3017.0020.0002.A4DF] # LISU LETTER MA
+A4E0  ; [.3018.0020.0002.A4E0] # LISU LETTER NA
+A4E1  ; [.3019.0020.0002.A4E1] # LISU LETTER LA
+A4E2  ; [.301A.0020.0002.A4E2] # LISU LETTER SA
+A4E3  ; [.301B.0020.0002.A4E3] # LISU LETTER ZHA
+A4E4  ; [.301C.0020.0002.A4E4] # LISU LETTER ZA
+A4E5  ; [.301D.0020.0002.A4E5] # LISU LETTER NGA
+A4E6  ; [.301E.0020.0002.A4E6] # LISU LETTER HA
+A4E7  ; [.301F.0020.0002.A4E7] # LISU LETTER XA
+A4E8  ; [.3020.0020.0002.A4E8] # LISU LETTER HHA
+A4E9  ; [.3021.0020.0002.A4E9] # LISU LETTER FA
+A4EB  ; [.3022.0020.0002.A4EB] # LISU LETTER SHA
+A4ED  ; [.3023.0020.0002.A4ED] # LISU LETTER GHA
+A4EA  ; [.3024.0020.0002.A4EA] # LISU LETTER WA
+A4EC  ; [.3025.0020.0002.A4EC] # LISU LETTER YA
+A4EE  ; [.3026.0020.0002.A4EE] # LISU LETTER A
+A4EF  ; [.3027.0020.0002.A4EF] # LISU LETTER AE
+A4F0  ; [.3028.0020.0002.A4F0] # LISU LETTER E
+A4F1  ; [.3029.0020.0002.A4F1] # LISU LETTER EU
+A4F2  ; [.302A.0020.0002.A4F2] # LISU LETTER I
+A4F3  ; [.302B.0020.0002.A4F3] # LISU LETTER O
+A4F4  ; [.302C.0020.0002.A4F4] # LISU LETTER U
+A4F5  ; [.302D.0020.0002.A4F5] # LISU LETTER UE
+A4F6  ; [.302E.0020.0002.A4F6] # LISU LETTER UH
+A4F7  ; [.302F.0020.0002.A4F7] # LISU LETTER OE
+10280 ; [.3030.0020.0002.10280] # LYCIAN LETTER A
+10281 ; [.3031.0020.0002.10281] # LYCIAN LETTER E
+10282 ; [.3032.0020.0002.10282] # LYCIAN LETTER B
+10283 ; [.3033.0020.0002.10283] # LYCIAN LETTER BH
+10284 ; [.3034.0020.0002.10284] # LYCIAN LETTER G
+10285 ; [.3035.0020.0002.10285] # LYCIAN LETTER D
+10286 ; [.3036.0020.0002.10286] # LYCIAN LETTER I
+10287 ; [.3037.0020.0002.10287] # LYCIAN LETTER W
+10288 ; [.3038.0020.0002.10288] # LYCIAN LETTER Z
+10289 ; [.3039.0020.0002.10289] # LYCIAN LETTER TH
+1028A ; [.303A.0020.0002.1028A] # LYCIAN LETTER J
+1028B ; [.303B.0020.0002.1028B] # LYCIAN LETTER K
+1028C ; [.303C.0020.0002.1028C] # LYCIAN LETTER Q
+1028D ; [.303D.0020.0002.1028D] # LYCIAN LETTER L
+1028E ; [.303E.0020.0002.1028E] # LYCIAN LETTER M
+1028F ; [.303F.0020.0002.1028F] # LYCIAN LETTER N
+10290 ; [.3040.0020.0002.10290] # LYCIAN LETTER MM
+10291 ; [.3041.0020.0002.10291] # LYCIAN LETTER NN
+10292 ; [.3042.0020.0002.10292] # LYCIAN LETTER U
+10293 ; [.3043.0020.0002.10293] # LYCIAN LETTER P
+10294 ; [.3044.0020.0002.10294] # LYCIAN LETTER KK
+10295 ; [.3045.0020.0002.10295] # LYCIAN LETTER R
+10296 ; [.3046.0020.0002.10296] # LYCIAN LETTER S
+10297 ; [.3047.0020.0002.10297] # LYCIAN LETTER T
+10298 ; [.3048.0020.0002.10298] # LYCIAN LETTER TT
+10299 ; [.3049.0020.0002.10299] # LYCIAN LETTER AN
+1029A ; [.304A.0020.0002.1029A] # LYCIAN LETTER EN
+1029B ; [.304B.0020.0002.1029B] # LYCIAN LETTER H
+1029C ; [.304C.0020.0002.1029C] # LYCIAN LETTER X
+102A0 ; [.304D.0020.0002.102A0] # CARIAN LETTER A
+102A1 ; [.304E.0020.0002.102A1] # CARIAN LETTER P2
+102A2 ; [.304F.0020.0002.102A2] # CARIAN LETTER D
+102A3 ; [.3050.0020.0002.102A3] # CARIAN LETTER L
+102A4 ; [.3051.0020.0002.102A4] # CARIAN LETTER UUU
+102A5 ; [.3052.0020.0002.102A5] # CARIAN LETTER R
+102A6 ; [.3053.0020.0002.102A6] # CARIAN LETTER LD
+102A7 ; [.3054.0020.0002.102A7] # CARIAN LETTER A2
+102A8 ; [.3055.0020.0002.102A8] # CARIAN LETTER Q
+102A9 ; [.3056.0020.0002.102A9] # CARIAN LETTER B
+102AA ; [.3057.0020.0002.102AA] # CARIAN LETTER M
+102AB ; [.3058.0020.0002.102AB] # CARIAN LETTER O
+102AC ; [.3059.0020.0002.102AC] # CARIAN LETTER D2
+102AD ; [.305A.0020.0002.102AD] # CARIAN LETTER T
+102AE ; [.305B.0020.0002.102AE] # CARIAN LETTER SH
+102AF ; [.305C.0020.0002.102AF] # CARIAN LETTER SH2
+102B0 ; [.305D.0020.0002.102B0] # CARIAN LETTER S
+102B1 ; [.305E.0020.0002.102B1] # CARIAN LETTER C-18
+102B2 ; [.305F.0020.0002.102B2] # CARIAN LETTER U
+102B3 ; [.3060.0020.0002.102B3] # CARIAN LETTER NN
+102B4 ; [.3061.0020.0002.102B4] # CARIAN LETTER X
+102B5 ; [.3062.0020.0002.102B5] # CARIAN LETTER N
+102B6 ; [.3063.0020.0002.102B6] # CARIAN LETTER TT2
+102B7 ; [.3064.0020.0002.102B7] # CARIAN LETTER P
+102B8 ; [.3065.0020.0002.102B8] # CARIAN LETTER SS
+102B9 ; [.3066.0020.0002.102B9] # CARIAN LETTER I
+102BA ; [.3067.0020.0002.102BA] # CARIAN LETTER E
+102BB ; [.3068.0020.0002.102BB] # CARIAN LETTER UUUU
+102BC ; [.3069.0020.0002.102BC] # CARIAN LETTER K
+102BD ; [.306A.0020.0002.102BD] # CARIAN LETTER K2
+102BE ; [.306B.0020.0002.102BE] # CARIAN LETTER ND
+102BF ; [.306C.0020.0002.102BF] # CARIAN LETTER UU
+102C0 ; [.306D.0020.0002.102C0] # CARIAN LETTER G
+102C1 ; [.306E.0020.0002.102C1] # CARIAN LETTER G2
+102C2 ; [.306F.0020.0002.102C2] # CARIAN LETTER ST
+102C3 ; [.3070.0020.0002.102C3] # CARIAN LETTER ST2
+102C4 ; [.3071.0020.0002.102C4] # CARIAN LETTER NG
+102C5 ; [.3072.0020.0002.102C5] # CARIAN LETTER II
+102C6 ; [.3073.0020.0002.102C6] # CARIAN LETTER C-39
+102C7 ; [.3074.0020.0002.102C7] # CARIAN LETTER TT
+102C8 ; [.3075.0020.0002.102C8] # CARIAN LETTER UUU2
+102C9 ; [.3076.0020.0002.102C9] # CARIAN LETTER RR
+102CA ; [.3077.0020.0002.102CA] # CARIAN LETTER MB
+102CB ; [.3078.0020.0002.102CB] # CARIAN LETTER MB2
+102CC ; [.3079.0020.0002.102CC] # CARIAN LETTER MB3
+102CD ; [.307A.0020.0002.102CD] # CARIAN LETTER MB4
+102CE ; [.307B.0020.0002.102CE] # CARIAN LETTER LD2
+102CF ; [.307C.0020.0002.102CF] # CARIAN LETTER E2
+102D0 ; [.307D.0020.0002.102D0] # CARIAN LETTER UUU3
+10920 ; [.307E.0020.0002.10920] # LYDIAN LETTER A
+10921 ; [.307F.0020.0002.10921] # LYDIAN LETTER B
+10922 ; [.3080.0020.0002.10922] # LYDIAN LETTER G
+10923 ; [.3081.0020.0002.10923] # LYDIAN LETTER D
+10924 ; [.3082.0020.0002.10924] # LYDIAN LETTER E
+10925 ; [.3083.0020.0002.10925] # LYDIAN LETTER V
+10926 ; [.3084.0020.0002.10926] # LYDIAN LETTER I
+10927 ; [.3085.0020.0002.10927] # LYDIAN LETTER Y
+10928 ; [.3086.0020.0002.10928] # LYDIAN LETTER K
+10929 ; [.3087.0020.0002.10929] # LYDIAN LETTER L
+1092A ; [.3088.0020.0002.1092A] # LYDIAN LETTER M
+1092B ; [.3089.0020.0002.1092B] # LYDIAN LETTER N
+1092C ; [.308A.0020.0002.1092C] # LYDIAN LETTER O
+1092D ; [.308B.0020.0002.1092D] # LYDIAN LETTER R
+1092E ; [.308C.0020.0002.1092E] # LYDIAN LETTER SS
+1092F ; [.308D.0020.0002.1092F] # LYDIAN LETTER T
+10930 ; [.308E.0020.0002.10930] # LYDIAN LETTER U
+10931 ; [.308F.0020.0002.10931] # LYDIAN LETTER F
+10932 ; [.3090.0020.0002.10932] # LYDIAN LETTER Q
+10933 ; [.3091.0020.0002.10933] # LYDIAN LETTER S
+10934 ; [.3092.0020.0002.10934] # LYDIAN LETTER TT
+10935 ; [.3093.0020.0002.10935] # LYDIAN LETTER AN
+10936 ; [.3094.0020.0002.10936] # LYDIAN LETTER EN
+10937 ; [.3095.0020.0002.10937] # LYDIAN LETTER LY
+10938 ; [.3096.0020.0002.10938] # LYDIAN LETTER NN
+10939 ; [.3097.0020.0002.10939] # LYDIAN LETTER C
+10300 ; [.3098.0020.0002.10300] # OLD ITALIC LETTER A
+10301 ; [.3099.0020.0002.10301] # OLD ITALIC LETTER BE
+10302 ; [.309A.0020.0002.10302] # OLD ITALIC LETTER KE
+10303 ; [.309B.0020.0002.10303] # OLD ITALIC LETTER DE
+10304 ; [.309C.0020.0002.10304] # OLD ITALIC LETTER E
+10305 ; [.309D.0020.0002.10305] # OLD ITALIC LETTER VE
+10306 ; [.309E.0020.0002.10306] # OLD ITALIC LETTER ZE
+10307 ; [.309F.0020.0002.10307] # OLD ITALIC LETTER HE
+10308 ; [.30A0.0020.0002.10308] # OLD ITALIC LETTER THE
+10309 ; [.30A1.0020.0002.10309] # OLD ITALIC LETTER I
+1030A ; [.30A2.0020.0002.1030A] # OLD ITALIC LETTER KA
+1030B ; [.30A3.0020.0002.1030B] # OLD ITALIC LETTER EL
+1030C ; [.30A4.0020.0002.1030C] # OLD ITALIC LETTER EM
+1030D ; [.30A5.0020.0002.1030D] # OLD ITALIC LETTER EN
+1030E ; [.30A6.0020.0002.1030E] # OLD ITALIC LETTER ESH
+1030F ; [.30A7.0020.0002.1030F] # OLD ITALIC LETTER O
+10310 ; [.30A8.0020.0002.10310] # OLD ITALIC LETTER PE
+10311 ; [.30A9.0020.0002.10311] # OLD ITALIC LETTER SHE
+10312 ; [.30AA.0020.0002.10312] # OLD ITALIC LETTER KU
+10313 ; [.30AB.0020.0002.10313] # OLD ITALIC LETTER ER
+10314 ; [.30AC.0020.0002.10314] # OLD ITALIC LETTER ES
+10315 ; [.30AD.0020.0002.10315] # OLD ITALIC LETTER TE
+10316 ; [.30AE.0020.0002.10316] # OLD ITALIC LETTER U
+10317 ; [.30AF.0020.0002.10317] # OLD ITALIC LETTER EKS
+10318 ; [.30B0.0020.0002.10318] # OLD ITALIC LETTER PHE
+10319 ; [.30B1.0020.0002.10319] # OLD ITALIC LETTER KHE
+1031A ; [.30B2.0020.0002.1031A] # OLD ITALIC LETTER EF
+1031B ; [.30B3.0020.0002.1031B] # OLD ITALIC LETTER ERS
+1031C ; [.30B4.0020.0002.1031C] # OLD ITALIC LETTER CHE
+1031D ; [.30B5.0020.0002.1031D] # OLD ITALIC LETTER II
+1031E ; [.30B6.0020.0002.1031E] # OLD ITALIC LETTER UU
+10330 ; [.30B7.0020.0002.10330] # GOTHIC LETTER AHSA
+10331 ; [.30B8.0020.0002.10331] # GOTHIC LETTER BAIRKAN
+10332 ; [.30B9.0020.0002.10332] # GOTHIC LETTER GIBA
+10333 ; [.30BA.0020.0002.10333] # GOTHIC LETTER DAGS
+10334 ; [.30BB.0020.0002.10334] # GOTHIC LETTER AIHVUS
+10335 ; [.30BC.0020.0002.10335] # GOTHIC LETTER QAIRTHRA
+10336 ; [.30BD.0020.0002.10336] # GOTHIC LETTER IUJA
+10337 ; [.30BE.0020.0002.10337] # GOTHIC LETTER HAGL
+10338 ; [.30BF.0020.0002.10338] # GOTHIC LETTER THIUTH
+10339 ; [.30C0.0020.0002.10339] # GOTHIC LETTER EIS
+1033A ; [.30C1.0020.0002.1033A] # GOTHIC LETTER KUSMA
+1033B ; [.30C2.0020.0002.1033B] # GOTHIC LETTER LAGUS
+1033C ; [.30C3.0020.0002.1033C] # GOTHIC LETTER MANNA
+1033D ; [.30C4.0020.0002.1033D] # GOTHIC LETTER NAUTHS
+1033E ; [.30C5.0020.0002.1033E] # GOTHIC LETTER JER
+1033F ; [.30C6.0020.0002.1033F] # GOTHIC LETTER URUS
+10340 ; [.30C7.0020.0002.10340] # GOTHIC LETTER PAIRTHRA
+10341 ; [.30C8.0020.0002.10341] # GOTHIC LETTER NINETY
+10342 ; [.30C9.0020.0002.10342] # GOTHIC LETTER RAIDA
+10343 ; [.30CA.0020.0002.10343] # GOTHIC LETTER SAUIL
+10344 ; [.30CB.0020.0002.10344] # GOTHIC LETTER TEIWS
+10345 ; [.30CC.0020.0002.10345] # GOTHIC LETTER WINJA
+10346 ; [.30CD.0020.0002.10346] # GOTHIC LETTER FAIHU
+10347 ; [.30CE.0020.0002.10347] # GOTHIC LETTER IGGWS
+10348 ; [.30CF.0020.0002.10348] # GOTHIC LETTER HWAIR
+10349 ; [.30D0.0020.0002.10349] # GOTHIC LETTER OTHAL
+1034A ; [.30D1.0020.0002.1034A] # GOTHIC LETTER NINE HUNDRED
+10428 ; [.30D2.0020.0002.10428] # DESERET SMALL LETTER LONG I
+10400 ; [.30D2.0020.0008.10400] # DESERET CAPITAL LETTER LONG I
+10429 ; [.30D3.0020.0002.10429] # DESERET SMALL LETTER LONG E
+10401 ; [.30D3.0020.0008.10401] # DESERET CAPITAL LETTER LONG E
+1042A ; [.30D4.0020.0002.1042A] # DESERET SMALL LETTER LONG A
+10402 ; [.30D4.0020.0008.10402] # DESERET CAPITAL LETTER LONG A
+1042B ; [.30D5.0020.0002.1042B] # DESERET SMALL LETTER LONG AH
+10403 ; [.30D5.0020.0008.10403] # DESERET CAPITAL LETTER LONG AH
+1042C ; [.30D6.0020.0002.1042C] # DESERET SMALL LETTER LONG O
+10404 ; [.30D6.0020.0008.10404] # DESERET CAPITAL LETTER LONG O
+1042D ; [.30D7.0020.0002.1042D] # DESERET SMALL LETTER LONG OO
+10405 ; [.30D7.0020.0008.10405] # DESERET CAPITAL LETTER LONG OO
+1042E ; [.30D8.0020.0002.1042E] # DESERET SMALL LETTER SHORT I
+10406 ; [.30D8.0020.0008.10406] # DESERET CAPITAL LETTER SHORT I
+1042F ; [.30D9.0020.0002.1042F] # DESERET SMALL LETTER SHORT E
+10407 ; [.30D9.0020.0008.10407] # DESERET CAPITAL LETTER SHORT E
+10430 ; [.30DA.0020.0002.10430] # DESERET SMALL LETTER SHORT A
+10408 ; [.30DA.0020.0008.10408] # DESERET CAPITAL LETTER SHORT A
+10431 ; [.30DB.0020.0002.10431] # DESERET SMALL LETTER SHORT AH
+10409 ; [.30DB.0020.0008.10409] # DESERET CAPITAL LETTER SHORT AH
+10432 ; [.30DC.0020.0002.10432] # DESERET SMALL LETTER SHORT O
+1040A ; [.30DC.0020.0008.1040A] # DESERET CAPITAL LETTER SHORT O
+10433 ; [.30DD.0020.0002.10433] # DESERET SMALL LETTER SHORT OO
+1040B ; [.30DD.0020.0008.1040B] # DESERET CAPITAL LETTER SHORT OO
+10434 ; [.30DE.0020.0002.10434] # DESERET SMALL LETTER AY
+1040C ; [.30DE.0020.0008.1040C] # DESERET CAPITAL LETTER AY
+10435 ; [.30DF.0020.0002.10435] # DESERET SMALL LETTER OW
+1040D ; [.30DF.0020.0008.1040D] # DESERET CAPITAL LETTER OW
+10436 ; [.30E0.0020.0002.10436] # DESERET SMALL LETTER WU
+1040E ; [.30E0.0020.0008.1040E] # DESERET CAPITAL LETTER WU
+10437 ; [.30E1.0020.0002.10437] # DESERET SMALL LETTER YEE
+1040F ; [.30E1.0020.0008.1040F] # DESERET CAPITAL LETTER YEE
+10438 ; [.30E2.0020.0002.10438] # DESERET SMALL LETTER H
+10410 ; [.30E2.0020.0008.10410] # DESERET CAPITAL LETTER H
+10439 ; [.30E3.0020.0002.10439] # DESERET SMALL LETTER PEE
+10411 ; [.30E3.0020.0008.10411] # DESERET CAPITAL LETTER PEE
+1043A ; [.30E4.0020.0002.1043A] # DESERET SMALL LETTER BEE
+10412 ; [.30E4.0020.0008.10412] # DESERET CAPITAL LETTER BEE
+1043B ; [.30E5.0020.0002.1043B] # DESERET SMALL LETTER TEE
+10413 ; [.30E5.0020.0008.10413] # DESERET CAPITAL LETTER TEE
+1043C ; [.30E6.0020.0002.1043C] # DESERET SMALL LETTER DEE
+10414 ; [.30E6.0020.0008.10414] # DESERET CAPITAL LETTER DEE
+1043D ; [.30E7.0020.0002.1043D] # DESERET SMALL LETTER CHEE
+10415 ; [.30E7.0020.0008.10415] # DESERET CAPITAL LETTER CHEE
+1043E ; [.30E8.0020.0002.1043E] # DESERET SMALL LETTER JEE
+10416 ; [.30E8.0020.0008.10416] # DESERET CAPITAL LETTER JEE
+1043F ; [.30E9.0020.0002.1043F] # DESERET SMALL LETTER KAY
+10417 ; [.30E9.0020.0008.10417] # DESERET CAPITAL LETTER KAY
+10440 ; [.30EA.0020.0002.10440] # DESERET SMALL LETTER GAY
+10418 ; [.30EA.0020.0008.10418] # DESERET CAPITAL LETTER GAY
+10441 ; [.30EB.0020.0002.10441] # DESERET SMALL LETTER EF
+10419 ; [.30EB.0020.0008.10419] # DESERET CAPITAL LETTER EF
+10442 ; [.30EC.0020.0002.10442] # DESERET SMALL LETTER VEE
+1041A ; [.30EC.0020.0008.1041A] # DESERET CAPITAL LETTER VEE
+10443 ; [.30ED.0020.0002.10443] # DESERET SMALL LETTER ETH
+1041B ; [.30ED.0020.0008.1041B] # DESERET CAPITAL LETTER ETH
+10444 ; [.30EE.0020.0002.10444] # DESERET SMALL LETTER THEE
+1041C ; [.30EE.0020.0008.1041C] # DESERET CAPITAL LETTER THEE
+10445 ; [.30EF.0020.0002.10445] # DESERET SMALL LETTER ES
+1041D ; [.30EF.0020.0008.1041D] # DESERET CAPITAL LETTER ES
+10446 ; [.30F0.0020.0002.10446] # DESERET SMALL LETTER ZEE
+1041E ; [.30F0.0020.0008.1041E] # DESERET CAPITAL LETTER ZEE
+10447 ; [.30F1.0020.0002.10447] # DESERET SMALL LETTER ESH
+1041F ; [.30F1.0020.0008.1041F] # DESERET CAPITAL LETTER ESH
+10448 ; [.30F2.0020.0002.10448] # DESERET SMALL LETTER ZHEE
+10420 ; [.30F2.0020.0008.10420] # DESERET CAPITAL LETTER ZHEE
+10449 ; [.30F3.0020.0002.10449] # DESERET SMALL LETTER ER
+10421 ; [.30F3.0020.0008.10421] # DESERET CAPITAL LETTER ER
+1044A ; [.30F4.0020.0002.1044A] # DESERET SMALL LETTER EL
+10422 ; [.30F4.0020.0008.10422] # DESERET CAPITAL LETTER EL
+1044B ; [.30F5.0020.0002.1044B] # DESERET SMALL LETTER EM
+10423 ; [.30F5.0020.0008.10423] # DESERET CAPITAL LETTER EM
+1044C ; [.30F6.0020.0002.1044C] # DESERET SMALL LETTER EN
+10424 ; [.30F6.0020.0008.10424] # DESERET CAPITAL LETTER EN
+1044D ; [.30F7.0020.0002.1044D] # DESERET SMALL LETTER ENG
+10425 ; [.30F7.0020.0008.10425] # DESERET CAPITAL LETTER ENG
+1044E ; [.30F8.0020.0002.1044E] # DESERET SMALL LETTER OI
+10426 ; [.30F8.0020.0008.10426] # DESERET CAPITAL LETTER OI
+1044F ; [.30F9.0020.0002.1044F] # DESERET SMALL LETTER EW
+10427 ; [.30F9.0020.0008.10427] # DESERET CAPITAL LETTER EW
+10450 ; [.30FA.0020.0002.10450] # SHAVIAN LETTER PEEP
+10451 ; [.30FB.0020.0002.10451] # SHAVIAN LETTER TOT
+10452 ; [.30FC.0020.0002.10452] # SHAVIAN LETTER KICK
+10453 ; [.30FD.0020.0002.10453] # SHAVIAN LETTER FEE
+10454 ; [.30FE.0020.0002.10454] # SHAVIAN LETTER THIGH
+10455 ; [.30FF.0020.0002.10455] # SHAVIAN LETTER SO
+10456 ; [.3100.0020.0002.10456] # SHAVIAN LETTER SURE
+10457 ; [.3101.0020.0002.10457] # SHAVIAN LETTER CHURCH
+10458 ; [.3102.0020.0002.10458] # SHAVIAN LETTER YEA
+10459 ; [.3103.0020.0002.10459] # SHAVIAN LETTER HUNG
+1045A ; [.3104.0020.0002.1045A] # SHAVIAN LETTER BIB
+1045B ; [.3105.0020.0002.1045B] # SHAVIAN LETTER DEAD
+1045C ; [.3106.0020.0002.1045C] # SHAVIAN LETTER GAG
+1045D ; [.3107.0020.0002.1045D] # SHAVIAN LETTER VOW
+1045E ; [.3108.0020.0002.1045E] # SHAVIAN LETTER THEY
+1045F ; [.3109.0020.0002.1045F] # SHAVIAN LETTER ZOO
+10460 ; [.310A.0020.0002.10460] # SHAVIAN LETTER MEASURE
+10461 ; [.310B.0020.0002.10461] # SHAVIAN LETTER JUDGE
+10462 ; [.310C.0020.0002.10462] # SHAVIAN LETTER WOE
+10463 ; [.310D.0020.0002.10463] # SHAVIAN LETTER HA-HA
+10464 ; [.310E.0020.0002.10464] # SHAVIAN LETTER LOLL
+10465 ; [.310F.0020.0002.10465] # SHAVIAN LETTER MIME
+10466 ; [.3110.0020.0002.10466] # SHAVIAN LETTER IF
+10467 ; [.3111.0020.0002.10467] # SHAVIAN LETTER EGG
+10468 ; [.3112.0020.0002.10468] # SHAVIAN LETTER ASH
+10469 ; [.3113.0020.0002.10469] # SHAVIAN LETTER ADO
+1046A ; [.3114.0020.0002.1046A] # SHAVIAN LETTER ON
+1046B ; [.3115.0020.0002.1046B] # SHAVIAN LETTER WOOL
+1046C ; [.3116.0020.0002.1046C] # SHAVIAN LETTER OUT
+1046D ; [.3117.0020.0002.1046D] # SHAVIAN LETTER AH
+1046E ; [.3118.0020.0002.1046E] # SHAVIAN LETTER ROAR
+1046F ; [.3119.0020.0002.1046F] # SHAVIAN LETTER NUN
+10470 ; [.311A.0020.0002.10470] # SHAVIAN LETTER EAT
+10471 ; [.311B.0020.0002.10471] # SHAVIAN LETTER AGE
+10472 ; [.311C.0020.0002.10472] # SHAVIAN LETTER ICE
+10473 ; [.311D.0020.0002.10473] # SHAVIAN LETTER UP
+10474 ; [.311E.0020.0002.10474] # SHAVIAN LETTER OAK
+10475 ; [.311F.0020.0002.10475] # SHAVIAN LETTER OOZE
+10476 ; [.3120.0020.0002.10476] # SHAVIAN LETTER OIL
+10477 ; [.3121.0020.0002.10477] # SHAVIAN LETTER AWE
+10478 ; [.3122.0020.0002.10478] # SHAVIAN LETTER ARE
+10479 ; [.3123.0020.0002.10479] # SHAVIAN LETTER OR
+1047A ; [.3124.0020.0002.1047A] # SHAVIAN LETTER AIR
+1047B ; [.3125.0020.0002.1047B] # SHAVIAN LETTER ERR
+1047C ; [.3126.0020.0002.1047C] # SHAVIAN LETTER ARRAY
+1047D ; [.3127.0020.0002.1047D] # SHAVIAN LETTER EAR
+1047E ; [.3128.0020.0002.1047E] # SHAVIAN LETTER IAN
+1047F ; [.3129.0020.0002.1047F] # SHAVIAN LETTER YEW
+10480 ; [.312A.0020.0002.10480] # OSMANYA LETTER ALEF
+10481 ; [.312B.0020.0002.10481] # OSMANYA LETTER BA
+10482 ; [.312C.0020.0002.10482] # OSMANYA LETTER TA
+10483 ; [.312D.0020.0002.10483] # OSMANYA LETTER JA
+10484 ; [.312E.0020.0002.10484] # OSMANYA LETTER XA
+10485 ; [.312F.0020.0002.10485] # OSMANYA LETTER KHA
+10486 ; [.3130.0020.0002.10486] # OSMANYA LETTER DEEL
+10487 ; [.3131.0020.0002.10487] # OSMANYA LETTER RA
+10488 ; [.3132.0020.0002.10488] # OSMANYA LETTER SA
+10489 ; [.3133.0020.0002.10489] # OSMANYA LETTER SHIIN
+1048A ; [.3134.0020.0002.1048A] # OSMANYA LETTER DHA
+1048B ; [.3135.0020.0002.1048B] # OSMANYA LETTER CAYN
+1048C ; [.3136.0020.0002.1048C] # OSMANYA LETTER GA
+1048D ; [.3137.0020.0002.1048D] # OSMANYA LETTER FA
+1048E ; [.3138.0020.0002.1048E] # OSMANYA LETTER QAAF
+1048F ; [.3139.0020.0002.1048F] # OSMANYA LETTER KAAF
+10490 ; [.313A.0020.0002.10490] # OSMANYA LETTER LAAN
+10491 ; [.313B.0020.0002.10491] # OSMANYA LETTER MIIN
+10492 ; [.313C.0020.0002.10492] # OSMANYA LETTER NUUN
+10493 ; [.313D.0020.0002.10493] # OSMANYA LETTER WAW
+10494 ; [.313E.0020.0002.10494] # OSMANYA LETTER HA
+10495 ; [.313F.0020.0002.10495] # OSMANYA LETTER YA
+10496 ; [.3140.0020.0002.10496] # OSMANYA LETTER A
+10497 ; [.3141.0020.0002.10497] # OSMANYA LETTER E
+10498 ; [.3142.0020.0002.10498] # OSMANYA LETTER I
+10499 ; [.3143.0020.0002.10499] # OSMANYA LETTER O
+1049A ; [.3144.0020.0002.1049A] # OSMANYA LETTER U
+1049B ; [.3145.0020.0002.1049B] # OSMANYA LETTER AA
+1049C ; [.3146.0020.0002.1049C] # OSMANYA LETTER EE
+1049D ; [.3147.0020.0002.1049D] # OSMANYA LETTER OO
+10000 ; [.3148.0020.0002.10000] # LINEAR B SYLLABLE B008 A
+10001 ; [.3149.0020.0002.10001] # LINEAR B SYLLABLE B038 E
+10002 ; [.314A.0020.0002.10002] # LINEAR B SYLLABLE B028 I
+10003 ; [.314B.0020.0002.10003] # LINEAR B SYLLABLE B061 O
+10004 ; [.314C.0020.0002.10004] # LINEAR B SYLLABLE B010 U
+10005 ; [.314D.0020.0002.10005] # LINEAR B SYLLABLE B001 DA
+10006 ; [.314E.0020.0002.10006] # LINEAR B SYLLABLE B045 DE
+10007 ; [.314F.0020.0002.10007] # LINEAR B SYLLABLE B007 DI
+10008 ; [.3150.0020.0002.10008] # LINEAR B SYLLABLE B014 DO
+10009 ; [.3151.0020.0002.10009] # LINEAR B SYLLABLE B051 DU
+1000A ; [.3152.0020.0002.1000A] # LINEAR B SYLLABLE B057 JA
+1000B ; [.3153.0020.0002.1000B] # LINEAR B SYLLABLE B046 JE
+1000D ; [.3154.0020.0002.1000D] # LINEAR B SYLLABLE B036 JO
+1000E ; [.3155.0020.0002.1000E] # LINEAR B SYLLABLE B065 JU
+1000F ; [.3156.0020.0002.1000F] # LINEAR B SYLLABLE B077 KA
+10010 ; [.3157.0020.0002.10010] # LINEAR B SYLLABLE B044 KE
+10011 ; [.3158.0020.0002.10011] # LINEAR B SYLLABLE B067 KI
+10012 ; [.3159.0020.0002.10012] # LINEAR B SYLLABLE B070 KO
+10013 ; [.315A.0020.0002.10013] # LINEAR B SYLLABLE B081 KU
+10014 ; [.315B.0020.0002.10014] # LINEAR B SYLLABLE B080 MA
+10015 ; [.315C.0020.0002.10015] # LINEAR B SYLLABLE B013 ME
+10016 ; [.315D.0020.0002.10016] # LINEAR B SYLLABLE B073 MI
+10017 ; [.315E.0020.0002.10017] # LINEAR B SYLLABLE B015 MO
+10018 ; [.315F.0020.0002.10018] # LINEAR B SYLLABLE B023 MU
+10019 ; [.3160.0020.0002.10019] # LINEAR B SYLLABLE B006 NA
+1001A ; [.3161.0020.0002.1001A] # LINEAR B SYLLABLE B024 NE
+1001B ; [.3162.0020.0002.1001B] # LINEAR B SYLLABLE B030 NI
+1001C ; [.3163.0020.0002.1001C] # LINEAR B SYLLABLE B052 NO
+1001D ; [.3164.0020.0002.1001D] # LINEAR B SYLLABLE B055 NU
+1001E ; [.3165.0020.0002.1001E] # LINEAR B SYLLABLE B003 PA
+1001F ; [.3166.0020.0002.1001F] # LINEAR B SYLLABLE B072 PE
+10020 ; [.3167.0020.0002.10020] # LINEAR B SYLLABLE B039 PI
+10021 ; [.3168.0020.0002.10021] # LINEAR B SYLLABLE B011 PO
+10022 ; [.3169.0020.0002.10022] # LINEAR B SYLLABLE B050 PU
+10023 ; [.316A.0020.0002.10023] # LINEAR B SYLLABLE B016 QA
+10024 ; [.316B.0020.0002.10024] # LINEAR B SYLLABLE B078 QE
+10025 ; [.316C.0020.0002.10025] # LINEAR B SYLLABLE B021 QI
+10026 ; [.316D.0020.0002.10026] # LINEAR B SYLLABLE B032 QO
+10028 ; [.316E.0020.0002.10028] # LINEAR B SYLLABLE B060 RA
+10029 ; [.316F.0020.0002.10029] # LINEAR B SYLLABLE B027 RE
+1002A ; [.3170.0020.0002.1002A] # LINEAR B SYLLABLE B053 RI
+1002B ; [.3171.0020.0002.1002B] # LINEAR B SYLLABLE B002 RO
+1002C ; [.3172.0020.0002.1002C] # LINEAR B SYLLABLE B026 RU
+1002D ; [.3173.0020.0002.1002D] # LINEAR B SYLLABLE B031 SA
+1002E ; [.3174.0020.0002.1002E] # LINEAR B SYLLABLE B009 SE
+1002F ; [.3175.0020.0002.1002F] # LINEAR B SYLLABLE B041 SI
+10030 ; [.3176.0020.0002.10030] # LINEAR B SYLLABLE B012 SO
+10031 ; [.3177.0020.0002.10031] # LINEAR B SYLLABLE B058 SU
+10032 ; [.3178.0020.0002.10032] # LINEAR B SYLLABLE B059 TA
+10033 ; [.3179.0020.0002.10033] # LINEAR B SYLLABLE B004 TE
+10034 ; [.317A.0020.0002.10034] # LINEAR B SYLLABLE B037 TI
+10035 ; [.317B.0020.0002.10035] # LINEAR B SYLLABLE B005 TO
+10036 ; [.317C.0020.0002.10036] # LINEAR B SYLLABLE B069 TU
+10037 ; [.317D.0020.0002.10037] # LINEAR B SYLLABLE B054 WA
+10038 ; [.317E.0020.0002.10038] # LINEAR B SYLLABLE B075 WE
+10039 ; [.317F.0020.0002.10039] # LINEAR B SYLLABLE B040 WI
+1003A ; [.3180.0020.0002.1003A] # LINEAR B SYLLABLE B042 WO
+1003C ; [.3181.0020.0002.1003C] # LINEAR B SYLLABLE B017 ZA
+1003D ; [.3182.0020.0002.1003D] # LINEAR B SYLLABLE B074 ZE
+1003F ; [.3183.0020.0002.1003F] # LINEAR B SYLLABLE B020 ZO
+10040 ; [.3184.0020.0002.10040] # LINEAR B SYLLABLE B025 A2
+10041 ; [.3185.0020.0002.10041] # LINEAR B SYLLABLE B043 A3
+10042 ; [.3186.0020.0002.10042] # LINEAR B SYLLABLE B085 AU
+10043 ; [.3187.0020.0002.10043] # LINEAR B SYLLABLE B071 DWE
+10044 ; [.3188.0020.0002.10044] # LINEAR B SYLLABLE B090 DWO
+10045 ; [.3189.0020.0002.10045] # LINEAR B SYLLABLE B048 NWA
+10046 ; [.318A.0020.0002.10046] # LINEAR B SYLLABLE B029 PU2
+10047 ; [.318B.0020.0002.10047] # LINEAR B SYLLABLE B062 PTE
+10048 ; [.318C.0020.0002.10048] # LINEAR B SYLLABLE B076 RA2
+10049 ; [.318D.0020.0002.10049] # LINEAR B SYLLABLE B033 RA3
+1004A ; [.318E.0020.0002.1004A] # LINEAR B SYLLABLE B068 RO2
+1004B ; [.318F.0020.0002.1004B] # LINEAR B SYLLABLE B066 TA2
+1004C ; [.3190.0020.0002.1004C] # LINEAR B SYLLABLE B087 TWE
+1004D ; [.3191.0020.0002.1004D] # LINEAR B SYLLABLE B091 TWO
+10050 ; [.3192.0020.0002.10050] # LINEAR B SYMBOL B018
+10051 ; [.3193.0020.0002.10051] # LINEAR B SYMBOL B019
+10052 ; [.3194.0020.0002.10052] # LINEAR B SYMBOL B022
+10053 ; [.3195.0020.0002.10053] # LINEAR B SYMBOL B034
+10054 ; [.3196.0020.0002.10054] # LINEAR B SYMBOL B047
+10055 ; [.3197.0020.0002.10055] # LINEAR B SYMBOL B049
+10056 ; [.3198.0020.0002.10056] # LINEAR B SYMBOL B056
+10057 ; [.3199.0020.0002.10057] # LINEAR B SYMBOL B063
+10058 ; [.319A.0020.0002.10058] # LINEAR B SYMBOL B064
+10059 ; [.319B.0020.0002.10059] # LINEAR B SYMBOL B079
+1005A ; [.319C.0020.0002.1005A] # LINEAR B SYMBOL B082
+1005B ; [.319D.0020.0002.1005B] # LINEAR B SYMBOL B083
+1005C ; [.319E.0020.0002.1005C] # LINEAR B SYMBOL B086
+1005D ; [.319F.0020.0002.1005D] # LINEAR B SYMBOL B089
+10080 ; [.31A0.0020.0002.10080] # LINEAR B IDEOGRAM B100 MAN
+10081 ; [.31A1.0020.0002.10081] # LINEAR B IDEOGRAM B102 WOMAN
+10082 ; [.31A2.0020.0002.10082] # LINEAR B IDEOGRAM B104 DEER
+10083 ; [.31A3.0020.0002.10083] # LINEAR B IDEOGRAM B105 EQUID
+10084 ; [.31A4.0020.0002.10084] # LINEAR B IDEOGRAM B105F MARE
+10085 ; [.31A5.0020.0002.10085] # LINEAR B IDEOGRAM B105M STALLION
+10086 ; [.31A6.0020.0002.10086] # LINEAR B IDEOGRAM B106F EWE
+10087 ; [.31A7.0020.0002.10087] # LINEAR B IDEOGRAM B106M RAM
+10088 ; [.31A8.0020.0002.10088] # LINEAR B IDEOGRAM B107F SHE-GOAT
+10089 ; [.31A9.0020.0002.10089] # LINEAR B IDEOGRAM B107M HE-GOAT
+1008A ; [.31AA.0020.0002.1008A] # LINEAR B IDEOGRAM B108F SOW
+1008B ; [.31AB.0020.0002.1008B] # LINEAR B IDEOGRAM B108M BOAR
+1008C ; [.31AC.0020.0002.1008C] # LINEAR B IDEOGRAM B109F COW
+1008D ; [.31AD.0020.0002.1008D] # LINEAR B IDEOGRAM B109M BULL
+1008E ; [.31AE.0020.0002.1008E] # LINEAR B IDEOGRAM B120 WHEAT
+1008F ; [.31AF.0020.0002.1008F] # LINEAR B IDEOGRAM B121 BARLEY
+10090 ; [.31B0.0020.0002.10090] # LINEAR B IDEOGRAM B122 OLIVE
+10091 ; [.31B1.0020.0002.10091] # LINEAR B IDEOGRAM B123 SPICE
+10092 ; [.31B2.0020.0002.10092] # LINEAR B IDEOGRAM B125 CYPERUS
+10093 ; [.31B3.0020.0002.10093] # LINEAR B MONOGRAM B127 KAPO
+10094 ; [.31B4.0020.0002.10094] # LINEAR B MONOGRAM B128 KANAKO
+10095 ; [.31B5.0020.0002.10095] # LINEAR B IDEOGRAM B130 OIL
+10096 ; [.31B6.0020.0002.10096] # LINEAR B IDEOGRAM B131 WINE
+10097 ; [.31B7.0020.0002.10097] # LINEAR B IDEOGRAM B132
+10098 ; [.31B8.0020.0002.10098] # LINEAR B MONOGRAM B133 AREPA
+10099 ; [.31B9.0020.0002.10099] # LINEAR B MONOGRAM B135 MERI
+1009A ; [.31BA.0020.0002.1009A] # LINEAR B IDEOGRAM B140 BRONZE
+1009B ; [.31BB.0020.0002.1009B] # LINEAR B IDEOGRAM B141 GOLD
+1009C ; [.31BC.0020.0002.1009C] # LINEAR B IDEOGRAM B142
+1009D ; [.31BD.0020.0002.1009D] # LINEAR B IDEOGRAM B145 WOOL
+1009E ; [.31BE.0020.0002.1009E] # LINEAR B IDEOGRAM B146
+1009F ; [.31BF.0020.0002.1009F] # LINEAR B IDEOGRAM B150
+100A0 ; [.31C0.0020.0002.100A0] # LINEAR B IDEOGRAM B151 HORN
+100A1 ; [.31C1.0020.0002.100A1] # LINEAR B IDEOGRAM B152
+100A2 ; [.31C2.0020.0002.100A2] # LINEAR B IDEOGRAM B153
+100A3 ; [.31C3.0020.0002.100A3] # LINEAR B IDEOGRAM B154
+100A4 ; [.31C4.0020.0002.100A4] # LINEAR B MONOGRAM B156 TURO2
+100A5 ; [.31C5.0020.0002.100A5] # LINEAR B IDEOGRAM B157
+100A6 ; [.31C6.0020.0002.100A6] # LINEAR B IDEOGRAM B158
+100A7 ; [.31C7.0020.0002.100A7] # LINEAR B IDEOGRAM B159 CLOTH
+100A8 ; [.31C8.0020.0002.100A8] # LINEAR B IDEOGRAM B160
+100A9 ; [.31C9.0020.0002.100A9] # LINEAR B IDEOGRAM B161
+100AA ; [.31CA.0020.0002.100AA] # LINEAR B IDEOGRAM B162 GARMENT
+100AB ; [.31CB.0020.0002.100AB] # LINEAR B IDEOGRAM B163 ARMOUR
+100AC ; [.31CC.0020.0002.100AC] # LINEAR B IDEOGRAM B164
+100AD ; [.31CD.0020.0002.100AD] # LINEAR B IDEOGRAM B165
+100AE ; [.31CE.0020.0002.100AE] # LINEAR B IDEOGRAM B166
+100AF ; [.31CF.0020.0002.100AF] # LINEAR B IDEOGRAM B167
+100B0 ; [.31D0.0020.0002.100B0] # LINEAR B IDEOGRAM B168
+100B1 ; [.31D1.0020.0002.100B1] # LINEAR B IDEOGRAM B169
+100B2 ; [.31D2.0020.0002.100B2] # LINEAR B IDEOGRAM B170
+100B3 ; [.31D3.0020.0002.100B3] # LINEAR B IDEOGRAM B171
+100B4 ; [.31D4.0020.0002.100B4] # LINEAR B IDEOGRAM B172
+100B5 ; [.31D5.0020.0002.100B5] # LINEAR B IDEOGRAM B173 MONTH
+100B6 ; [.31D6.0020.0002.100B6] # LINEAR B IDEOGRAM B174
+100B7 ; [.31D7.0020.0002.100B7] # LINEAR B IDEOGRAM B176 TREE
+100B8 ; [.31D8.0020.0002.100B8] # LINEAR B IDEOGRAM B177
+100B9 ; [.31D9.0020.0002.100B9] # LINEAR B IDEOGRAM B178
+100BA ; [.31DA.0020.0002.100BA] # LINEAR B IDEOGRAM B179
+100BB ; [.31DB.0020.0002.100BB] # LINEAR B IDEOGRAM B180
+100BC ; [.31DC.0020.0002.100BC] # LINEAR B IDEOGRAM B181
+100BD ; [.31DD.0020.0002.100BD] # LINEAR B IDEOGRAM B182
+100BE ; [.31DE.0020.0002.100BE] # LINEAR B IDEOGRAM B183
+100BF ; [.31DF.0020.0002.100BF] # LINEAR B IDEOGRAM B184
+100C0 ; [.31E0.0020.0002.100C0] # LINEAR B IDEOGRAM B185
+100C1 ; [.31E1.0020.0002.100C1] # LINEAR B IDEOGRAM B189
+100C2 ; [.31E2.0020.0002.100C2] # LINEAR B IDEOGRAM B190
+100C3 ; [.31E3.0020.0002.100C3] # LINEAR B IDEOGRAM B191 HELMET
+100C4 ; [.31E4.0020.0002.100C4] # LINEAR B IDEOGRAM B220 FOOTSTOOL
+100C5 ; [.31E5.0020.0002.100C5] # LINEAR B IDEOGRAM B225 BATHTUB
+100C6 ; [.31E6.0020.0002.100C6] # LINEAR B IDEOGRAM B230 SPEAR
+100C7 ; [.31E7.0020.0002.100C7] # LINEAR B IDEOGRAM B231 ARROW
+100C8 ; [.31E8.0020.0002.100C8] # LINEAR B IDEOGRAM B232
+100C9 ; [.31E9.0020.0002.100C9] # LINEAR B IDEOGRAM B233 SWORD
+100CA ; [.31EA.0020.0002.100CA] # LINEAR B IDEOGRAM B234
+100CB ; [.31EB.0020.0002.100CB] # LINEAR B IDEOGRAM B236
+100CC ; [.31EC.0020.0002.100CC] # LINEAR B IDEOGRAM B240 WHEELED CHARIOT
+100CD ; [.31ED.0020.0002.100CD] # LINEAR B IDEOGRAM B241 CHARIOT
+100CE ; [.31EE.0020.0002.100CE] # LINEAR B IDEOGRAM B242 CHARIOT FRAME
+100CF ; [.31EF.0020.0002.100CF] # LINEAR B IDEOGRAM B243 WHEEL
+100D0 ; [.31F0.0020.0002.100D0] # LINEAR B IDEOGRAM B245
+100D1 ; [.31F1.0020.0002.100D1] # LINEAR B IDEOGRAM B246
+100D2 ; [.31F2.0020.0002.100D2] # LINEAR B MONOGRAM B247 DIPTE
+100D3 ; [.31F3.0020.0002.100D3] # LINEAR B IDEOGRAM B248
+100D4 ; [.31F4.0020.0002.100D4] # LINEAR B IDEOGRAM B249
+100D5 ; [.31F5.0020.0002.100D5] # LINEAR B IDEOGRAM B251
+100D6 ; [.31F6.0020.0002.100D6] # LINEAR B IDEOGRAM B252
+100D7 ; [.31F7.0020.0002.100D7] # LINEAR B IDEOGRAM B253
+100D8 ; [.31F8.0020.0002.100D8] # LINEAR B IDEOGRAM B254 DART
+100D9 ; [.31F9.0020.0002.100D9] # LINEAR B IDEOGRAM B255
+100DA ; [.31FA.0020.0002.100DA] # LINEAR B IDEOGRAM B256
+100DB ; [.31FB.0020.0002.100DB] # LINEAR B IDEOGRAM B257
+100DC ; [.31FC.0020.0002.100DC] # LINEAR B IDEOGRAM B258
+100DD ; [.31FD.0020.0002.100DD] # LINEAR B IDEOGRAM B259
+100DE ; [.31FE.0020.0002.100DE] # LINEAR B IDEOGRAM VESSEL B155
+100DF ; [.31FF.0020.0002.100DF] # LINEAR B IDEOGRAM VESSEL B200
+100E0 ; [.3200.0020.0002.100E0] # LINEAR B IDEOGRAM VESSEL B201
+100E1 ; [.3201.0020.0002.100E1] # LINEAR B IDEOGRAM VESSEL B202
+100E2 ; [.3202.0020.0002.100E2] # LINEAR B IDEOGRAM VESSEL B203
+100E3 ; [.3203.0020.0002.100E3] # LINEAR B IDEOGRAM VESSEL B204
+100E4 ; [.3204.0020.0002.100E4] # LINEAR B IDEOGRAM VESSEL B205
+100E5 ; [.3205.0020.0002.100E5] # LINEAR B IDEOGRAM VESSEL B206
+100E6 ; [.3206.0020.0002.100E6] # LINEAR B IDEOGRAM VESSEL B207
+100E7 ; [.3207.0020.0002.100E7] # LINEAR B IDEOGRAM VESSEL B208
+100E8 ; [.3208.0020.0002.100E8] # LINEAR B IDEOGRAM VESSEL B209
+100E9 ; [.3209.0020.0002.100E9] # LINEAR B IDEOGRAM VESSEL B210
+100EA ; [.320A.0020.0002.100EA] # LINEAR B IDEOGRAM VESSEL B211
+100EB ; [.320B.0020.0002.100EB] # LINEAR B IDEOGRAM VESSEL B212
+100EC ; [.320C.0020.0002.100EC] # LINEAR B IDEOGRAM VESSEL B213
+100ED ; [.320D.0020.0002.100ED] # LINEAR B IDEOGRAM VESSEL B214
+100EE ; [.320E.0020.0002.100EE] # LINEAR B IDEOGRAM VESSEL B215
+100EF ; [.320F.0020.0002.100EF] # LINEAR B IDEOGRAM VESSEL B216
+100F0 ; [.3210.0020.0002.100F0] # LINEAR B IDEOGRAM VESSEL B217
+100F1 ; [.3211.0020.0002.100F1] # LINEAR B IDEOGRAM VESSEL B218
+100F2 ; [.3212.0020.0002.100F2] # LINEAR B IDEOGRAM VESSEL B219
+100F3 ; [.3213.0020.0002.100F3] # LINEAR B IDEOGRAM VESSEL B221
+100F4 ; [.3214.0020.0002.100F4] # LINEAR B IDEOGRAM VESSEL B222
+100F5 ; [.3215.0020.0002.100F5] # LINEAR B IDEOGRAM VESSEL B226
+100F6 ; [.3216.0020.0002.100F6] # LINEAR B IDEOGRAM VESSEL B227
+100F7 ; [.3217.0020.0002.100F7] # LINEAR B IDEOGRAM VESSEL B228
+100F8 ; [.3218.0020.0002.100F8] # LINEAR B IDEOGRAM VESSEL B229
+100F9 ; [.3219.0020.0002.100F9] # LINEAR B IDEOGRAM VESSEL B250
+100FA ; [.321A.0020.0002.100FA] # LINEAR B IDEOGRAM VESSEL B305
+10800 ; [.321B.0020.0002.10800] # CYPRIOT SYLLABLE A
+10801 ; [.321C.0020.0002.10801] # CYPRIOT SYLLABLE E
+10802 ; [.321D.0020.0002.10802] # CYPRIOT SYLLABLE I
+10803 ; [.321E.0020.0002.10803] # CYPRIOT SYLLABLE O
+10804 ; [.321F.0020.0002.10804] # CYPRIOT SYLLABLE U
+10805 ; [.3220.0020.0002.10805] # CYPRIOT SYLLABLE JA
+10808 ; [.3221.0020.0002.10808] # CYPRIOT SYLLABLE JO
+1080A ; [.3222.0020.0002.1080A] # CYPRIOT SYLLABLE KA
+1080B ; [.3223.0020.0002.1080B] # CYPRIOT SYLLABLE KE
+1080C ; [.3224.0020.0002.1080C] # CYPRIOT SYLLABLE KI
+1080D ; [.3225.0020.0002.1080D] # CYPRIOT SYLLABLE KO
+1080E ; [.3226.0020.0002.1080E] # CYPRIOT SYLLABLE KU
+1080F ; [.3227.0020.0002.1080F] # CYPRIOT SYLLABLE LA
+10810 ; [.3228.0020.0002.10810] # CYPRIOT SYLLABLE LE
+10811 ; [.3229.0020.0002.10811] # CYPRIOT SYLLABLE LI
+10812 ; [.322A.0020.0002.10812] # CYPRIOT SYLLABLE LO
+10813 ; [.322B.0020.0002.10813] # CYPRIOT SYLLABLE LU
+10814 ; [.322C.0020.0002.10814] # CYPRIOT SYLLABLE MA
+10815 ; [.322D.0020.0002.10815] # CYPRIOT SYLLABLE ME
+10816 ; [.322E.0020.0002.10816] # CYPRIOT SYLLABLE MI
+10817 ; [.322F.0020.0002.10817] # CYPRIOT SYLLABLE MO
+10818 ; [.3230.0020.0002.10818] # CYPRIOT SYLLABLE MU
+10819 ; [.3231.0020.0002.10819] # CYPRIOT SYLLABLE NA
+1081A ; [.3232.0020.0002.1081A] # CYPRIOT SYLLABLE NE
+1081B ; [.3233.0020.0002.1081B] # CYPRIOT SYLLABLE NI
+1081C ; [.3234.0020.0002.1081C] # CYPRIOT SYLLABLE NO
+1081D ; [.3235.0020.0002.1081D] # CYPRIOT SYLLABLE NU
+1081E ; [.3236.0020.0002.1081E] # CYPRIOT SYLLABLE PA
+1081F ; [.3237.0020.0002.1081F] # CYPRIOT SYLLABLE PE
+10820 ; [.3238.0020.0002.10820] # CYPRIOT SYLLABLE PI
+10821 ; [.3239.0020.0002.10821] # CYPRIOT SYLLABLE PO
+10822 ; [.323A.0020.0002.10822] # CYPRIOT SYLLABLE PU
+10823 ; [.323B.0020.0002.10823] # CYPRIOT SYLLABLE RA
+10824 ; [.323C.0020.0002.10824] # CYPRIOT SYLLABLE RE
+10825 ; [.323D.0020.0002.10825] # CYPRIOT SYLLABLE RI
+10826 ; [.323E.0020.0002.10826] # CYPRIOT SYLLABLE RO
+10827 ; [.323F.0020.0002.10827] # CYPRIOT SYLLABLE RU
+10828 ; [.3240.0020.0002.10828] # CYPRIOT SYLLABLE SA
+10829 ; [.3241.0020.0002.10829] # CYPRIOT SYLLABLE SE
+1082A ; [.3242.0020.0002.1082A] # CYPRIOT SYLLABLE SI
+1082B ; [.3243.0020.0002.1082B] # CYPRIOT SYLLABLE SO
+1082C ; [.3244.0020.0002.1082C] # CYPRIOT SYLLABLE SU
+1082D ; [.3245.0020.0002.1082D] # CYPRIOT SYLLABLE TA
+1082E ; [.3246.0020.0002.1082E] # CYPRIOT SYLLABLE TE
+1082F ; [.3247.0020.0002.1082F] # CYPRIOT SYLLABLE TI
+10830 ; [.3248.0020.0002.10830] # CYPRIOT SYLLABLE TO
+10831 ; [.3249.0020.0002.10831] # CYPRIOT SYLLABLE TU
+10832 ; [.324A.0020.0002.10832] # CYPRIOT SYLLABLE WA
+10833 ; [.324B.0020.0002.10833] # CYPRIOT SYLLABLE WE
+10834 ; [.324C.0020.0002.10834] # CYPRIOT SYLLABLE WI
+10835 ; [.324D.0020.0002.10835] # CYPRIOT SYLLABLE WO
+10837 ; [.324E.0020.0002.10837] # CYPRIOT SYLLABLE XA
+10838 ; [.324F.0020.0002.10838] # CYPRIOT SYLLABLE XE
+1083C ; [.3250.0020.0002.1083C] # CYPRIOT SYLLABLE ZA
+1083F ; [.3251.0020.0002.1083F] # CYPRIOT SYLLABLE ZO
+10A60 ; [.3252.0020.0002.10A60] # OLD SOUTH ARABIAN LETTER HE
+10A61 ; [.3253.0020.0002.10A61] # OLD SOUTH ARABIAN LETTER LAMEDH
+10A62 ; [.3254.0020.0002.10A62] # OLD SOUTH ARABIAN LETTER HETH
+10A63 ; [.3255.0020.0002.10A63] # OLD SOUTH ARABIAN LETTER MEM
+10A64 ; [.3256.0020.0002.10A64] # OLD SOUTH ARABIAN LETTER QOPH
+10A65 ; [.3257.0020.0002.10A65] # OLD SOUTH ARABIAN LETTER WAW
+10A66 ; [.3258.0020.0002.10A66] # OLD SOUTH ARABIAN LETTER SHIN
+10A67 ; [.3259.0020.0002.10A67] # OLD SOUTH ARABIAN LETTER RESH
+10A68 ; [.325A.0020.0002.10A68] # OLD SOUTH ARABIAN LETTER BETH
+10A69 ; [.325B.0020.0002.10A69] # OLD SOUTH ARABIAN LETTER TAW
+10A6A ; [.325C.0020.0002.10A6A] # OLD SOUTH ARABIAN LETTER SAT
+10A6B ; [.325D.0020.0002.10A6B] # OLD SOUTH ARABIAN LETTER KAPH
+10A6C ; [.325E.0020.0002.10A6C] # OLD SOUTH ARABIAN LETTER NUN
+10A6D ; [.325F.0020.0002.10A6D] # OLD SOUTH ARABIAN LETTER KHETH
+10A6E ; [.3260.0020.0002.10A6E] # OLD SOUTH ARABIAN LETTER SADHE
+10A6F ; [.3261.0020.0002.10A6F] # OLD SOUTH ARABIAN LETTER SAMEKH
+10A70 ; [.3262.0020.0002.10A70] # OLD SOUTH ARABIAN LETTER FE
+10A71 ; [.3263.0020.0002.10A71] # OLD SOUTH ARABIAN LETTER ALEF
+10A72 ; [.3264.0020.0002.10A72] # OLD SOUTH ARABIAN LETTER AYN
+10A73 ; [.3265.0020.0002.10A73] # OLD SOUTH ARABIAN LETTER DHADHE
+10A74 ; [.3266.0020.0002.10A74] # OLD SOUTH ARABIAN LETTER GIMEL
+10A75 ; [.3267.0020.0002.10A75] # OLD SOUTH ARABIAN LETTER DALETH
+10A76 ; [.3268.0020.0002.10A76] # OLD SOUTH ARABIAN LETTER GHAYN
+10A77 ; [.3269.0020.0002.10A77] # OLD SOUTH ARABIAN LETTER TETH
+10A78 ; [.326A.0020.0002.10A78] # OLD SOUTH ARABIAN LETTER ZAYN
+10A79 ; [.326B.0020.0002.10A79] # OLD SOUTH ARABIAN LETTER DHALETH
+10A7A ; [.326C.0020.0002.10A7A] # OLD SOUTH ARABIAN LETTER YODH
+10A7B ; [.326D.0020.0002.10A7B] # OLD SOUTH ARABIAN LETTER THAW
+10A7C ; [.326E.0020.0002.10A7C] # OLD SOUTH ARABIAN LETTER THETH
+10B00 ; [.326F.0020.0002.10B00] # AVESTAN LETTER A
+10B01 ; [.3270.0020.0002.10B01] # AVESTAN LETTER AA
+10B02 ; [.3271.0020.0002.10B02] # AVESTAN LETTER AO
+10B03 ; [.3272.0020.0002.10B03] # AVESTAN LETTER AAO
+10B04 ; [.3273.0020.0002.10B04] # AVESTAN LETTER AN
+10B05 ; [.3274.0020.0002.10B05] # AVESTAN LETTER AAN
+10B06 ; [.3275.0020.0002.10B06] # AVESTAN LETTER AE
+10B07 ; [.3276.0020.0002.10B07] # AVESTAN LETTER AEE
+10B08 ; [.3277.0020.0002.10B08] # AVESTAN LETTER E
+10B09 ; [.3278.0020.0002.10B09] # AVESTAN LETTER EE
+10B0A ; [.3279.0020.0002.10B0A] # AVESTAN LETTER O
+10B0B ; [.327A.0020.0002.10B0B] # AVESTAN LETTER OO
+10B0C ; [.327B.0020.0002.10B0C] # AVESTAN LETTER I
+10B0D ; [.327C.0020.0002.10B0D] # AVESTAN LETTER II
+10B0E ; [.327D.0020.0002.10B0E] # AVESTAN LETTER U
+10B0F ; [.327E.0020.0002.10B0F] # AVESTAN LETTER UU
+10B10 ; [.327F.0020.0002.10B10] # AVESTAN LETTER KE
+10B11 ; [.3280.0020.0002.10B11] # AVESTAN LETTER XE
+10B12 ; [.3281.0020.0002.10B12] # AVESTAN LETTER XYE
+10B13 ; [.3282.0020.0002.10B13] # AVESTAN LETTER XVE
+10B14 ; [.3283.0020.0002.10B14] # AVESTAN LETTER GE
+10B15 ; [.3284.0020.0002.10B15] # AVESTAN LETTER GGE
+10B16 ; [.3285.0020.0002.10B16] # AVESTAN LETTER GHE
+10B17 ; [.3286.0020.0002.10B17] # AVESTAN LETTER CE
+10B18 ; [.3287.0020.0002.10B18] # AVESTAN LETTER JE
+10B19 ; [.3288.0020.0002.10B19] # AVESTAN LETTER TE
+10B1A ; [.3289.0020.0002.10B1A] # AVESTAN LETTER THE
+10B1B ; [.328A.0020.0002.10B1B] # AVESTAN LETTER DE
+10B1C ; [.328B.0020.0002.10B1C] # AVESTAN LETTER DHE
+10B1D ; [.328C.0020.0002.10B1D] # AVESTAN LETTER TTE
+10B1E ; [.328D.0020.0002.10B1E] # AVESTAN LETTER PE
+10B1F ; [.328E.0020.0002.10B1F] # AVESTAN LETTER FE
+10B20 ; [.328F.0020.0002.10B20] # AVESTAN LETTER BE
+10B21 ; [.3290.0020.0002.10B21] # AVESTAN LETTER BHE
+10B22 ; [.3291.0020.0002.10B22] # AVESTAN LETTER NGE
+10B23 ; [.3292.0020.0002.10B23] # AVESTAN LETTER NGYE
+10B24 ; [.3293.0020.0002.10B24] # AVESTAN LETTER NGVE
+10B25 ; [.3294.0020.0002.10B25] # AVESTAN LETTER NE
+10B26 ; [.3295.0020.0002.10B26] # AVESTAN LETTER NYE
+10B27 ; [.3296.0020.0002.10B27] # AVESTAN LETTER NNE
+10B28 ; [.3297.0020.0002.10B28] # AVESTAN LETTER ME
+10B29 ; [.3298.0020.0002.10B29] # AVESTAN LETTER HME
+10B2A ; [.3299.0020.0002.10B2A] # AVESTAN LETTER YYE
+10B2B ; [.329A.0020.0002.10B2B] # AVESTAN LETTER YE
+10B2C ; [.329B.0020.0002.10B2C] # AVESTAN LETTER VE
+10B2D ; [.329C.0020.0002.10B2D] # AVESTAN LETTER RE
+10B2E ; [.329C.0020.0004.10B2E][.0000.0159.0004.10B2E] # AVESTAN LETTER LE; QQKN
+10B2F ; [.329D.0020.0002.10B2F] # AVESTAN LETTER SE
+10B30 ; [.329E.0020.0002.10B30] # AVESTAN LETTER ZE
+10B31 ; [.329F.0020.0002.10B31] # AVESTAN LETTER SHE
+10B32 ; [.32A0.0020.0002.10B32] # AVESTAN LETTER ZHE
+10B33 ; [.32A1.0020.0002.10B33] # AVESTAN LETTER SHYE
+10B34 ; [.32A2.0020.0002.10B34] # AVESTAN LETTER SSHE
+10B35 ; [.32A3.0020.0002.10B35] # AVESTAN LETTER HE
+10840 ; [.32A4.0020.0002.10840] # IMPERIAL ARAMAIC LETTER ALEPH
+10841 ; [.32A5.0020.0002.10841] # IMPERIAL ARAMAIC LETTER BETH
+10842 ; [.32A6.0020.0002.10842] # IMPERIAL ARAMAIC LETTER GIMEL
+10843 ; [.32A7.0020.0002.10843] # IMPERIAL ARAMAIC LETTER DALETH
+10844 ; [.32A8.0020.0002.10844] # IMPERIAL ARAMAIC LETTER HE
+10845 ; [.32A9.0020.0002.10845] # IMPERIAL ARAMAIC LETTER WAW
+10846 ; [.32AA.0020.0002.10846] # IMPERIAL ARAMAIC LETTER ZAYIN
+10847 ; [.32AB.0020.0002.10847] # IMPERIAL ARAMAIC LETTER HETH
+10848 ; [.32AC.0020.0002.10848] # IMPERIAL ARAMAIC LETTER TETH
+10849 ; [.32AD.0020.0002.10849] # IMPERIAL ARAMAIC LETTER YODH
+1084A ; [.32AE.0020.0002.1084A] # IMPERIAL ARAMAIC LETTER KAPH
+1084B ; [.32AF.0020.0002.1084B] # IMPERIAL ARAMAIC LETTER LAMEDH
+1084C ; [.32B0.0020.0002.1084C] # IMPERIAL ARAMAIC LETTER MEM
+1084D ; [.32B1.0020.0002.1084D] # IMPERIAL ARAMAIC LETTER NUN
+1084E ; [.32B2.0020.0002.1084E] # IMPERIAL ARAMAIC LETTER SAMEKH
+1084F ; [.32B3.0020.0002.1084F] # IMPERIAL ARAMAIC LETTER AYIN
+10850 ; [.32B4.0020.0002.10850] # IMPERIAL ARAMAIC LETTER PE
+10851 ; [.32B5.0020.0002.10851] # IMPERIAL ARAMAIC LETTER SADHE
+10852 ; [.32B6.0020.0002.10852] # IMPERIAL ARAMAIC LETTER QOPH
+10853 ; [.32B7.0020.0002.10853] # IMPERIAL ARAMAIC LETTER RESH
+10854 ; [.32B8.0020.0002.10854] # IMPERIAL ARAMAIC LETTER SHIN
+10855 ; [.32B9.0020.0002.10855] # IMPERIAL ARAMAIC LETTER TAW
+10B40 ; [.32BA.0020.0002.10B40] # INSCRIPTIONAL PARTHIAN LETTER ALEPH
+10B41 ; [.32BB.0020.0002.10B41] # INSCRIPTIONAL PARTHIAN LETTER BETH
+10B42 ; [.32BC.0020.0002.10B42] # INSCRIPTIONAL PARTHIAN LETTER GIMEL
+10B43 ; [.32BD.0020.0002.10B43] # INSCRIPTIONAL PARTHIAN LETTER DALETH
+10B44 ; [.32BE.0020.0002.10B44] # INSCRIPTIONAL PARTHIAN LETTER HE
+10B45 ; [.32BF.0020.0002.10B45] # INSCRIPTIONAL PARTHIAN LETTER WAW
+10B46 ; [.32C0.0020.0002.10B46] # INSCRIPTIONAL PARTHIAN LETTER ZAYIN
+10B47 ; [.32C1.0020.0002.10B47] # INSCRIPTIONAL PARTHIAN LETTER HETH
+10B48 ; [.32C2.0020.0002.10B48] # INSCRIPTIONAL PARTHIAN LETTER TETH
+10B49 ; [.32C3.0020.0002.10B49] # INSCRIPTIONAL PARTHIAN LETTER YODH
+10B4A ; [.32C4.0020.0002.10B4A] # INSCRIPTIONAL PARTHIAN LETTER KAPH
+10B4B ; [.32C5.0020.0002.10B4B] # INSCRIPTIONAL PARTHIAN LETTER LAMEDH
+10B4C ; [.32C6.0020.0002.10B4C] # INSCRIPTIONAL PARTHIAN LETTER MEM
+10B4D ; [.32C7.0020.0002.10B4D] # INSCRIPTIONAL PARTHIAN LETTER NUN
+10B4E ; [.32C8.0020.0002.10B4E] # INSCRIPTIONAL PARTHIAN LETTER SAMEKH
+10B4F ; [.32C9.0020.0002.10B4F] # INSCRIPTIONAL PARTHIAN LETTER AYIN
+10B50 ; [.32CA.0020.0002.10B50] # INSCRIPTIONAL PARTHIAN LETTER PE
+10B51 ; [.32CB.0020.0002.10B51] # INSCRIPTIONAL PARTHIAN LETTER SADHE
+10B52 ; [.32CC.0020.0002.10B52] # INSCRIPTIONAL PARTHIAN LETTER QOPH
+10B53 ; [.32CD.0020.0002.10B53] # INSCRIPTIONAL PARTHIAN LETTER RESH
+10B54 ; [.32CE.0020.0002.10B54] # INSCRIPTIONAL PARTHIAN LETTER SHIN
+10B55 ; [.32CF.0020.0002.10B55] # INSCRIPTIONAL PARTHIAN LETTER TAW
+10B60 ; [.32D0.0020.0002.10B60] # INSCRIPTIONAL PAHLAVI LETTER ALEPH
+10B61 ; [.32D1.0020.0002.10B61] # INSCRIPTIONAL PAHLAVI LETTER BETH
+10B62 ; [.32D2.0020.0002.10B62] # INSCRIPTIONAL PAHLAVI LETTER GIMEL
+10B63 ; [.32D3.0020.0002.10B63] # INSCRIPTIONAL PAHLAVI LETTER DALETH
+10B64 ; [.32D4.0020.0002.10B64] # INSCRIPTIONAL PAHLAVI LETTER HE
+10B65 ; [.32D5.0020.0002.10B65] # INSCRIPTIONAL PAHLAVI LETTER WAW-AYIN-RESH
+10B66 ; [.32D6.0020.0002.10B66] # INSCRIPTIONAL PAHLAVI LETTER ZAYIN
+10B67 ; [.32D7.0020.0002.10B67] # INSCRIPTIONAL PAHLAVI LETTER HETH
+10B68 ; [.32D8.0020.0002.10B68] # INSCRIPTIONAL PAHLAVI LETTER TETH
+10B69 ; [.32D9.0020.0002.10B69] # INSCRIPTIONAL PAHLAVI LETTER YODH
+10B6A ; [.32DA.0020.0002.10B6A] # INSCRIPTIONAL PAHLAVI LETTER KAPH
+10B6B ; [.32DB.0020.0002.10B6B] # INSCRIPTIONAL PAHLAVI LETTER LAMEDH
+10B6C ; [.32DC.0020.0002.10B6C] # INSCRIPTIONAL PAHLAVI LETTER MEM-QOPH
+10B6D ; [.32DD.0020.0002.10B6D] # INSCRIPTIONAL PAHLAVI LETTER NUN
+10B6E ; [.32DE.0020.0002.10B6E] # INSCRIPTIONAL PAHLAVI LETTER SAMEKH
+10B6F ; [.32DF.0020.0002.10B6F] # INSCRIPTIONAL PAHLAVI LETTER PE
+10B70 ; [.32E0.0020.0002.10B70] # INSCRIPTIONAL PAHLAVI LETTER SADHE
+10B71 ; [.32E1.0020.0002.10B71] # INSCRIPTIONAL PAHLAVI LETTER SHIN
+10B72 ; [.32E2.0020.0002.10B72] # INSCRIPTIONAL PAHLAVI LETTER TAW
+10380 ; [.32E3.0020.0002.10380] # UGARITIC LETTER ALPA
+10381 ; [.32E4.0020.0002.10381] # UGARITIC LETTER BETA
+10382 ; [.32E5.0020.0002.10382] # UGARITIC LETTER GAMLA
+10383 ; [.32E6.0020.0002.10383] # UGARITIC LETTER KHA
+10384 ; [.32E7.0020.0002.10384] # UGARITIC LETTER DELTA
+10385 ; [.32E8.0020.0002.10385] # UGARITIC LETTER HO
+10386 ; [.32E9.0020.0002.10386] # UGARITIC LETTER WO
+10387 ; [.32EA.0020.0002.10387] # UGARITIC LETTER ZETA
+10388 ; [.32EB.0020.0002.10388] # UGARITIC LETTER HOTA
+10389 ; [.32EC.0020.0002.10389] # UGARITIC LETTER TET
+1038A ; [.32ED.0020.0002.1038A] # UGARITIC LETTER YOD
+1038B ; [.32EE.0020.0002.1038B] # UGARITIC LETTER KAF
+1038C ; [.32EF.0020.0002.1038C] # UGARITIC LETTER SHIN
+1038D ; [.32F0.0020.0002.1038D] # UGARITIC LETTER LAMDA
+1038E ; [.32F1.0020.0002.1038E] # UGARITIC LETTER MEM
+1038F ; [.32F2.0020.0002.1038F] # UGARITIC LETTER DHAL
+10390 ; [.32F3.0020.0002.10390] # UGARITIC LETTER NUN
+10391 ; [.32F4.0020.0002.10391] # UGARITIC LETTER ZU
+10392 ; [.32F5.0020.0002.10392] # UGARITIC LETTER SAMKA
+10393 ; [.32F6.0020.0002.10393] # UGARITIC LETTER AIN
+10394 ; [.32F7.0020.0002.10394] # UGARITIC LETTER PU
+10395 ; [.32F8.0020.0002.10395] # UGARITIC LETTER SADE
+10396 ; [.32F9.0020.0002.10396] # UGARITIC LETTER QOPA
+10397 ; [.32FA.0020.0002.10397] # UGARITIC LETTER RASHA
+10398 ; [.32FB.0020.0002.10398] # UGARITIC LETTER THANNA
+10399 ; [.32FC.0020.0002.10399] # UGARITIC LETTER GHAIN
+1039A ; [.32FD.0020.0002.1039A] # UGARITIC LETTER TO
+1039B ; [.32FE.0020.0002.1039B] # UGARITIC LETTER I
+1039C ; [.32FF.0020.0002.1039C] # UGARITIC LETTER U
+1039D ; [.3300.0020.0002.1039D] # UGARITIC LETTER SSU
+103A0 ; [.3301.0020.0002.103A0] # OLD PERSIAN SIGN A
+103A1 ; [.3302.0020.0002.103A1] # OLD PERSIAN SIGN I
+103A2 ; [.3303.0020.0002.103A2] # OLD PERSIAN SIGN U
+103A3 ; [.3304.0020.0002.103A3] # OLD PERSIAN SIGN KA
+103A4 ; [.3305.0020.0002.103A4] # OLD PERSIAN SIGN KU
+103A5 ; [.3306.0020.0002.103A5] # OLD PERSIAN SIGN GA
+103A6 ; [.3307.0020.0002.103A6] # OLD PERSIAN SIGN GU
+103A7 ; [.3308.0020.0002.103A7] # OLD PERSIAN SIGN XA
+103A8 ; [.3309.0020.0002.103A8] # OLD PERSIAN SIGN CA
+103A9 ; [.330A.0020.0002.103A9] # OLD PERSIAN SIGN JA
+103AA ; [.330B.0020.0002.103AA] # OLD PERSIAN SIGN JI
+103AB ; [.330C.0020.0002.103AB] # OLD PERSIAN SIGN TA
+103AC ; [.330D.0020.0002.103AC] # OLD PERSIAN SIGN TU
+103AD ; [.330E.0020.0002.103AD] # OLD PERSIAN SIGN DA
+103AE ; [.330F.0020.0002.103AE] # OLD PERSIAN SIGN DI
+103AF ; [.3310.0020.0002.103AF] # OLD PERSIAN SIGN DU
+103B0 ; [.3311.0020.0002.103B0] # OLD PERSIAN SIGN THA
+103B1 ; [.3312.0020.0002.103B1] # OLD PERSIAN SIGN PA
+103B2 ; [.3313.0020.0002.103B2] # OLD PERSIAN SIGN BA
+103B3 ; [.3314.0020.0002.103B3] # OLD PERSIAN SIGN FA
+103B4 ; [.3315.0020.0002.103B4] # OLD PERSIAN SIGN NA
+103B5 ; [.3316.0020.0002.103B5] # OLD PERSIAN SIGN NU
+103B6 ; [.3317.0020.0002.103B6] # OLD PERSIAN SIGN MA
+103B7 ; [.3318.0020.0002.103B7] # OLD PERSIAN SIGN MI
+103B8 ; [.3319.0020.0002.103B8] # OLD PERSIAN SIGN MU
+103B9 ; [.331A.0020.0002.103B9] # OLD PERSIAN SIGN YA
+103BA ; [.331B.0020.0002.103BA] # OLD PERSIAN SIGN VA
+103BB ; [.331C.0020.0002.103BB] # OLD PERSIAN SIGN VI
+103BC ; [.331D.0020.0002.103BC] # OLD PERSIAN SIGN RA
+103BD ; [.331E.0020.0002.103BD] # OLD PERSIAN SIGN RU
+103BE ; [.331F.0020.0002.103BE] # OLD PERSIAN SIGN LA
+103BF ; [.3320.0020.0002.103BF] # OLD PERSIAN SIGN SA
+103C0 ; [.3321.0020.0002.103C0] # OLD PERSIAN SIGN ZA
+103C1 ; [.3322.0020.0002.103C1] # OLD PERSIAN SIGN SHA
+103C2 ; [.3323.0020.0002.103C2] # OLD PERSIAN SIGN SSA
+103C3 ; [.3324.0020.0002.103C3] # OLD PERSIAN SIGN HA
+103C8 ; [.3325.0020.0002.103C8] # OLD PERSIAN SIGN AURAMAZDAA
+103C9 ; [.3326.0020.0002.103C9] # OLD PERSIAN SIGN AURAMAZDAA-2
+103CA ; [.3327.0020.0002.103CA] # OLD PERSIAN SIGN AURAMAZDAAHA
+103CB ; [.3328.0020.0002.103CB] # OLD PERSIAN SIGN XSHAAYATHIYA
+103CC ; [.3329.0020.0002.103CC] # OLD PERSIAN SIGN DAHYAAUSH
+103CD ; [.332A.0020.0002.103CD] # OLD PERSIAN SIGN DAHYAAUSH-2
+103CE ; [.332B.0020.0002.103CE] # OLD PERSIAN SIGN BAGA
+103CF ; [.332C.0020.0002.103CF] # OLD PERSIAN SIGN BUUMISH
+12000 ; [.332D.0020.0002.12000] # CUNEIFORM SIGN A
+12001 ; [.332E.0020.0002.12001] # CUNEIFORM SIGN A TIMES A
+12002 ; [.332F.0020.0002.12002] # CUNEIFORM SIGN A TIMES BAD
+12003 ; [.3330.0020.0002.12003] # CUNEIFORM SIGN A TIMES GAN2 TENU
+12004 ; [.3331.0020.0002.12004] # CUNEIFORM SIGN A TIMES HA
+12005 ; [.3332.0020.0002.12005] # CUNEIFORM SIGN A TIMES IGI
+12006 ; [.3333.0020.0002.12006] # CUNEIFORM SIGN A TIMES LAGAR GUNU
+12007 ; [.3334.0020.0002.12007] # CUNEIFORM SIGN A TIMES MUSH
+12008 ; [.3335.0020.0002.12008] # CUNEIFORM SIGN A TIMES SAG
+12009 ; [.3336.0020.0002.12009] # CUNEIFORM SIGN A2
+1200A ; [.3337.0020.0002.1200A] # CUNEIFORM SIGN AB
+1200B ; [.3338.0020.0002.1200B] # CUNEIFORM SIGN AB TIMES ASH2
+1200C ; [.3339.0020.0002.1200C] # CUNEIFORM SIGN AB TIMES DUN3 GUNU
+1200D ; [.333A.0020.0002.1200D] # CUNEIFORM SIGN AB TIMES GAL
+1200E ; [.333B.0020.0002.1200E] # CUNEIFORM SIGN AB TIMES GAN2 TENU
+1200F ; [.333C.0020.0002.1200F] # CUNEIFORM SIGN AB TIMES HA
+12010 ; [.333D.0020.0002.12010] # CUNEIFORM SIGN AB TIMES IGI GUNU
+12011 ; [.333E.0020.0002.12011] # CUNEIFORM SIGN AB TIMES IMIN
+12012 ; [.333F.0020.0002.12012] # CUNEIFORM SIGN AB TIMES LAGAB
+12013 ; [.3340.0020.0002.12013] # CUNEIFORM SIGN AB TIMES SHESH
+12014 ; [.3341.0020.0002.12014] # CUNEIFORM SIGN AB TIMES U PLUS U PLUS U
+12015 ; [.3342.0020.0002.12015] # CUNEIFORM SIGN AB GUNU
+12016 ; [.3343.0020.0002.12016] # CUNEIFORM SIGN AB2
+12017 ; [.3344.0020.0002.12017] # CUNEIFORM SIGN AB2 TIMES BALAG
+12018 ; [.3345.0020.0002.12018] # CUNEIFORM SIGN AB2 TIMES GAN2 TENU
+12019 ; [.3346.0020.0002.12019] # CUNEIFORM SIGN AB2 TIMES ME PLUS EN
+1201A ; [.3347.0020.0002.1201A] # CUNEIFORM SIGN AB2 TIMES SHA3
+1201B ; [.3348.0020.0002.1201B] # CUNEIFORM SIGN AB2 TIMES TAK4
+1201C ; [.3349.0020.0002.1201C] # CUNEIFORM SIGN AD
+1201D ; [.334A.0020.0002.1201D] # CUNEIFORM SIGN AK
+1201E ; [.334B.0020.0002.1201E] # CUNEIFORM SIGN AK TIMES ERIN2
+1201F ; [.334C.0020.0002.1201F] # CUNEIFORM SIGN AK TIMES SHITA PLUS GISH
+12020 ; [.334D.0020.0002.12020] # CUNEIFORM SIGN AL
+12021 ; [.334E.0020.0002.12021] # CUNEIFORM SIGN AL TIMES AL
+12022 ; [.334F.0020.0002.12022] # CUNEIFORM SIGN AL TIMES DIM2
+12023 ; [.3350.0020.0002.12023] # CUNEIFORM SIGN AL TIMES GISH
+12024 ; [.3351.0020.0002.12024] # CUNEIFORM SIGN AL TIMES HA
+12025 ; [.3352.0020.0002.12025] # CUNEIFORM SIGN AL TIMES KAD3
+12026 ; [.3353.0020.0002.12026] # CUNEIFORM SIGN AL TIMES KI
+12027 ; [.3354.0020.0002.12027] # CUNEIFORM SIGN AL TIMES SHE
+12028 ; [.3355.0020.0002.12028] # CUNEIFORM SIGN AL TIMES USH
+12029 ; [.3356.0020.0002.12029] # CUNEIFORM SIGN ALAN
+1202A ; [.3357.0020.0002.1202A] # CUNEIFORM SIGN ALEPH
+1202B ; [.3358.0020.0002.1202B] # CUNEIFORM SIGN AMAR
+1202C ; [.3359.0020.0002.1202C] # CUNEIFORM SIGN AMAR TIMES SHE
+1202D ; [.335A.0020.0002.1202D] # CUNEIFORM SIGN AN
+1202E ; [.335B.0020.0002.1202E] # CUNEIFORM SIGN AN OVER AN
+1202F ; [.335C.0020.0002.1202F] # CUNEIFORM SIGN AN THREE TIMES
+12030 ; [.335D.0020.0002.12030] # CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA
+12031 ; [.335E.0020.0002.12031] # CUNEIFORM SIGN AN PLUS NAGA SQUARED
+12032 ; [.335F.0020.0002.12032] # CUNEIFORM SIGN ANSHE
+12033 ; [.3360.0020.0002.12033] # CUNEIFORM SIGN APIN
+12034 ; [.3361.0020.0002.12034] # CUNEIFORM SIGN ARAD
+12035 ; [.3362.0020.0002.12035] # CUNEIFORM SIGN ARAD TIMES KUR
+12036 ; [.3363.0020.0002.12036] # CUNEIFORM SIGN ARKAB
+12037 ; [.3364.0020.0002.12037] # CUNEIFORM SIGN ASAL2
+12038 ; [.3365.0020.0002.12038] # CUNEIFORM SIGN ASH
+12039 ; [.3366.0020.0002.12039] # CUNEIFORM SIGN ASH ZIDA TENU
+1203A ; [.3367.0020.0002.1203A] # CUNEIFORM SIGN ASH KABA TENU
+1203B ; [.3368.0020.0002.1203B] # CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP
+1203C ; [.3369.0020.0002.1203C] # CUNEIFORM SIGN ASH OVER ASH OVER ASH
+1203D ; [.336A.0020.0002.1203D] # CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH
+1203E ; [.336B.0020.0002.1203E] # CUNEIFORM SIGN ASH2
+1203F ; [.336C.0020.0002.1203F] # CUNEIFORM SIGN ASHGAB
+12040 ; [.336D.0020.0002.12040] # CUNEIFORM SIGN BA
+12041 ; [.336E.0020.0002.12041] # CUNEIFORM SIGN BAD
+12042 ; [.336F.0020.0002.12042] # CUNEIFORM SIGN BAG3
+12043 ; [.3370.0020.0002.12043] # CUNEIFORM SIGN BAHAR2
+12044 ; [.3371.0020.0002.12044] # CUNEIFORM SIGN BAL
+12045 ; [.3372.0020.0002.12045] # CUNEIFORM SIGN BAL OVER BAL
+12046 ; [.3373.0020.0002.12046] # CUNEIFORM SIGN BALAG
+12047 ; [.3374.0020.0002.12047] # CUNEIFORM SIGN BAR
+12048 ; [.3375.0020.0002.12048] # CUNEIFORM SIGN BARA2
+12049 ; [.3376.0020.0002.12049] # CUNEIFORM SIGN BI
+1204A ; [.3377.0020.0002.1204A] # CUNEIFORM SIGN BI TIMES A
+1204B ; [.3378.0020.0002.1204B] # CUNEIFORM SIGN BI TIMES GAR
+1204C ; [.3379.0020.0002.1204C] # CUNEIFORM SIGN BI TIMES IGI GUNU
+1204D ; [.337A.0020.0002.1204D] # CUNEIFORM SIGN BU
+1204E ; [.337B.0020.0002.1204E] # CUNEIFORM SIGN BU OVER BU AB
+1204F ; [.337C.0020.0002.1204F] # CUNEIFORM SIGN BU OVER BU UN
+12050 ; [.337D.0020.0002.12050] # CUNEIFORM SIGN BU CROSSING BU
+12051 ; [.337E.0020.0002.12051] # CUNEIFORM SIGN BULUG
+12052 ; [.337F.0020.0002.12052] # CUNEIFORM SIGN BULUG OVER BULUG
+12053 ; [.3380.0020.0002.12053] # CUNEIFORM SIGN BUR
+12054 ; [.3381.0020.0002.12054] # CUNEIFORM SIGN BUR2
+12055 ; [.3382.0020.0002.12055] # CUNEIFORM SIGN DA
+12056 ; [.3383.0020.0002.12056] # CUNEIFORM SIGN DAG
+12057 ; [.3384.0020.0002.12057] # CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH
+12058 ; [.3385.0020.0002.12058] # CUNEIFORM SIGN DAG KISIM5 TIMES AMAR
+12059 ; [.3386.0020.0002.12059] # CUNEIFORM SIGN DAG KISIM5 TIMES BALAG
+1205A ; [.3387.0020.0002.1205A] # CUNEIFORM SIGN DAG KISIM5 TIMES BI
+1205B ; [.3388.0020.0002.1205B] # CUNEIFORM SIGN DAG KISIM5 TIMES GA
+1205C ; [.3389.0020.0002.1205C] # CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH
+1205D ; [.338A.0020.0002.1205D] # CUNEIFORM SIGN DAG KISIM5 TIMES GI
+1205E ; [.338B.0020.0002.1205E] # CUNEIFORM SIGN DAG KISIM5 TIMES GIR2
+1205F ; [.338C.0020.0002.1205F] # CUNEIFORM SIGN DAG KISIM5 TIMES GUD
+12060 ; [.338D.0020.0002.12060] # CUNEIFORM SIGN DAG KISIM5 TIMES HA
+12061 ; [.338E.0020.0002.12061] # CUNEIFORM SIGN DAG KISIM5 TIMES IR
+12062 ; [.338F.0020.0002.12062] # CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU
+12063 ; [.3390.0020.0002.12063] # CUNEIFORM SIGN DAG KISIM5 TIMES KAK
+12064 ; [.3391.0020.0002.12064] # CUNEIFORM SIGN DAG KISIM5 TIMES LA
+12065 ; [.3392.0020.0002.12065] # CUNEIFORM SIGN DAG KISIM5 TIMES LU
+12066 ; [.3393.0020.0002.12066] # CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2
+12067 ; [.3394.0020.0002.12067] # CUNEIFORM SIGN DAG KISIM5 TIMES LUM
+12068 ; [.3395.0020.0002.12068] # CUNEIFORM SIGN DAG KISIM5 TIMES NE
+12069 ; [.3396.0020.0002.12069] # CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP
+1206A ; [.3397.0020.0002.1206A] # CUNEIFORM SIGN DAG KISIM5 TIMES SI
+1206B ; [.3398.0020.0002.1206B] # CUNEIFORM SIGN DAG KISIM5 TIMES TAK4
+1206C ; [.3399.0020.0002.1206C] # CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2
+1206D ; [.339A.0020.0002.1206D] # CUNEIFORM SIGN DAG KISIM5 TIMES USH
+1206E ; [.339B.0020.0002.1206E] # CUNEIFORM SIGN DAM
+1206F ; [.339C.0020.0002.1206F] # CUNEIFORM SIGN DAR
+12070 ; [.339D.0020.0002.12070] # CUNEIFORM SIGN DARA3
+12071 ; [.339E.0020.0002.12071] # CUNEIFORM SIGN DARA4
+12072 ; [.339F.0020.0002.12072] # CUNEIFORM SIGN DI
+12073 ; [.33A0.0020.0002.12073] # CUNEIFORM SIGN DIB
+12074 ; [.33A1.0020.0002.12074] # CUNEIFORM SIGN DIM
+12075 ; [.33A2.0020.0002.12075] # CUNEIFORM SIGN DIM TIMES SHE
+12076 ; [.33A3.0020.0002.12076] # CUNEIFORM SIGN DIM2
+12077 ; [.33A4.0020.0002.12077] # CUNEIFORM SIGN DIN
+12078 ; [.33A5.0020.0002.12078] # CUNEIFORM SIGN DIN KASKAL U GUNU DISH
+12079 ; [.33A6.0020.0002.12079] # CUNEIFORM SIGN DISH
+1207A ; [.33A7.0020.0002.1207A] # CUNEIFORM SIGN DU
+1207B ; [.33A8.0020.0002.1207B] # CUNEIFORM SIGN DU OVER DU
+1207C ; [.33A9.0020.0002.1207C] # CUNEIFORM SIGN DU GUNU
+1207D ; [.33AA.0020.0002.1207D] # CUNEIFORM SIGN DU SHESHIG
+1207E ; [.33AB.0020.0002.1207E] # CUNEIFORM SIGN DUB
+1207F ; [.33AC.0020.0002.1207F] # CUNEIFORM SIGN DUB TIMES ESH2
+12080 ; [.33AD.0020.0002.12080] # CUNEIFORM SIGN DUB2
+12081 ; [.33AE.0020.0002.12081] # CUNEIFORM SIGN DUG
+12082 ; [.33AF.0020.0002.12082] # CUNEIFORM SIGN DUGUD
+12083 ; [.33B0.0020.0002.12083] # CUNEIFORM SIGN DUH
+12084 ; [.33B1.0020.0002.12084] # CUNEIFORM SIGN DUN
+12085 ; [.33B2.0020.0002.12085] # CUNEIFORM SIGN DUN3
+12086 ; [.33B3.0020.0002.12086] # CUNEIFORM SIGN DUN3 GUNU
+12087 ; [.33B4.0020.0002.12087] # CUNEIFORM SIGN DUN3 GUNU GUNU
+12088 ; [.33B5.0020.0002.12088] # CUNEIFORM SIGN DUN4
+12089 ; [.33B6.0020.0002.12089] # CUNEIFORM SIGN DUR2
+1208A ; [.33B7.0020.0002.1208A] # CUNEIFORM SIGN E
+1208B ; [.33B8.0020.0002.1208B] # CUNEIFORM SIGN E TIMES PAP
+1208C ; [.33B9.0020.0002.1208C] # CUNEIFORM SIGN E OVER E NUN OVER NUN
+1208D ; [.33BA.0020.0002.1208D] # CUNEIFORM SIGN E2
+1208E ; [.33BB.0020.0002.1208E] # CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA
+1208F ; [.33BC.0020.0002.1208F] # CUNEIFORM SIGN E2 TIMES GAR
+12090 ; [.33BD.0020.0002.12090] # CUNEIFORM SIGN E2 TIMES MI
+12091 ; [.33BE.0020.0002.12091] # CUNEIFORM SIGN E2 TIMES SAL
+12092 ; [.33BF.0020.0002.12092] # CUNEIFORM SIGN E2 TIMES SHE
+12093 ; [.33C0.0020.0002.12093] # CUNEIFORM SIGN E2 TIMES U
+12094 ; [.33C1.0020.0002.12094] # CUNEIFORM SIGN EDIN
+12095 ; [.33C2.0020.0002.12095] # CUNEIFORM SIGN EGIR
+12096 ; [.33C3.0020.0002.12096] # CUNEIFORM SIGN EL
+12097 ; [.33C4.0020.0002.12097] # CUNEIFORM SIGN EN
+12098 ; [.33C5.0020.0002.12098] # CUNEIFORM SIGN EN TIMES GAN2
+12099 ; [.33C6.0020.0002.12099] # CUNEIFORM SIGN EN TIMES GAN2 TENU
+1209A ; [.33C7.0020.0002.1209A] # CUNEIFORM SIGN EN TIMES ME
+1209B ; [.33C8.0020.0002.1209B] # CUNEIFORM SIGN EN CROSSING EN
+1209C ; [.33C9.0020.0002.1209C] # CUNEIFORM SIGN EN OPPOSING EN
+1209D ; [.33CA.0020.0002.1209D] # CUNEIFORM SIGN EN SQUARED
+1209E ; [.33CB.0020.0002.1209E] # CUNEIFORM SIGN EREN
+1209F ; [.33CC.0020.0002.1209F] # CUNEIFORM SIGN ERIN2
+120A0 ; [.33CD.0020.0002.120A0] # CUNEIFORM SIGN ESH2
+120A1 ; [.33CE.0020.0002.120A1] # CUNEIFORM SIGN EZEN
+120A2 ; [.33CF.0020.0002.120A2] # CUNEIFORM SIGN EZEN TIMES A
+120A3 ; [.33D0.0020.0002.120A3] # CUNEIFORM SIGN EZEN TIMES A PLUS LAL
+120A4 ; [.33D1.0020.0002.120A4] # CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL
+120A5 ; [.33D2.0020.0002.120A5] # CUNEIFORM SIGN EZEN TIMES AN
+120A6 ; [.33D3.0020.0002.120A6] # CUNEIFORM SIGN EZEN TIMES BAD
+120A7 ; [.33D4.0020.0002.120A7] # CUNEIFORM SIGN EZEN TIMES DUN3 GUNU
+120A8 ; [.33D5.0020.0002.120A8] # CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU
+120A9 ; [.33D6.0020.0002.120A9] # CUNEIFORM SIGN EZEN TIMES HA
+120AA ; [.33D7.0020.0002.120AA] # CUNEIFORM SIGN EZEN TIMES HA GUNU
+120AB ; [.33D8.0020.0002.120AB] # CUNEIFORM SIGN EZEN TIMES IGI GUNU
+120AC ; [.33D9.0020.0002.120AC] # CUNEIFORM SIGN EZEN TIMES KASKAL
+120AD ; [.33DA.0020.0002.120AD] # CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED
+120AE ; [.33DB.0020.0002.120AE] # CUNEIFORM SIGN EZEN TIMES KU3
+120AF ; [.33DC.0020.0002.120AF] # CUNEIFORM SIGN EZEN TIMES LA
+120B0 ; [.33DD.0020.0002.120B0] # CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL
+120B1 ; [.33DE.0020.0002.120B1] # CUNEIFORM SIGN EZEN TIMES LI
+120B2 ; [.33DF.0020.0002.120B2] # CUNEIFORM SIGN EZEN TIMES LU
+120B3 ; [.33E0.0020.0002.120B3] # CUNEIFORM SIGN EZEN TIMES U2
+120B4 ; [.33E1.0020.0002.120B4] # CUNEIFORM SIGN EZEN TIMES UD
+120B5 ; [.33E2.0020.0002.120B5] # CUNEIFORM SIGN GA
+120B6 ; [.33E3.0020.0002.120B6] # CUNEIFORM SIGN GA GUNU
+120B7 ; [.33E4.0020.0002.120B7] # CUNEIFORM SIGN GA2
+120B8 ; [.33E5.0020.0002.120B8] # CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA
+120B9 ; [.33E6.0020.0002.120B9] # CUNEIFORM SIGN GA2 TIMES A PLUS HA
+120BA ; [.33E7.0020.0002.120BA] # CUNEIFORM SIGN GA2 TIMES A PLUS IGI
+120BB ; [.33E8.0020.0002.120BB] # CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB
+120BC ; [.33E9.0020.0002.120BC] # CUNEIFORM SIGN GA2 TIMES AN
+120BD ; [.33EA.0020.0002.120BD] # CUNEIFORM SIGN GA2 TIMES ASH
+120BE ; [.33EB.0020.0002.120BE] # CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL
+120BF ; [.33EC.0020.0002.120BF] # CUNEIFORM SIGN GA2 TIMES BAD
+120C0 ; [.33ED.0020.0002.120C0] # CUNEIFORM SIGN GA2 TIMES BAR PLUS RA
+120C1 ; [.33EE.0020.0002.120C1] # CUNEIFORM SIGN GA2 TIMES BUR
+120C2 ; [.33EF.0020.0002.120C2] # CUNEIFORM SIGN GA2 TIMES BUR PLUS RA
+120C3 ; [.33F0.0020.0002.120C3] # CUNEIFORM SIGN GA2 TIMES DA
+120C4 ; [.33F1.0020.0002.120C4] # CUNEIFORM SIGN GA2 TIMES DI
+120C5 ; [.33F2.0020.0002.120C5] # CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE
+120C6 ; [.33F3.0020.0002.120C6] # CUNEIFORM SIGN GA2 TIMES DUB
+120C7 ; [.33F4.0020.0002.120C7] # CUNEIFORM SIGN GA2 TIMES EL
+120C8 ; [.33F5.0020.0002.120C8] # CUNEIFORM SIGN GA2 TIMES EL PLUS LA
+120C9 ; [.33F6.0020.0002.120C9] # CUNEIFORM SIGN GA2 TIMES EN
+120CA ; [.33F7.0020.0002.120CA] # CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU
+120CB ; [.33F8.0020.0002.120CB] # CUNEIFORM SIGN GA2 TIMES GAN2 TENU
+120CC ; [.33F9.0020.0002.120CC] # CUNEIFORM SIGN GA2 TIMES GAR
+120CD ; [.33FA.0020.0002.120CD] # CUNEIFORM SIGN GA2 TIMES GI
+120CE ; [.33FB.0020.0002.120CE] # CUNEIFORM SIGN GA2 TIMES GI4
+120CF ; [.33FC.0020.0002.120CF] # CUNEIFORM SIGN GA2 TIMES GI4 PLUS A
+120D0 ; [.33FD.0020.0002.120D0] # CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU
+120D1 ; [.33FE.0020.0002.120D1] # CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2
+120D2 ; [.33FF.0020.0002.120D2] # CUNEIFORM SIGN GA2 TIMES HAL
+120D3 ; [.3400.0020.0002.120D3] # CUNEIFORM SIGN GA2 TIMES HAL PLUS LA
+120D4 ; [.3401.0020.0002.120D4] # CUNEIFORM SIGN GA2 TIMES HI PLUS LI
+120D5 ; [.3402.0020.0002.120D5] # CUNEIFORM SIGN GA2 TIMES HUB2
+120D6 ; [.3403.0020.0002.120D6] # CUNEIFORM SIGN GA2 TIMES IGI GUNU
+120D7 ; [.3404.0020.0002.120D7] # CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH
+120D8 ; [.3405.0020.0002.120D8] # CUNEIFORM SIGN GA2 TIMES KAK
+120D9 ; [.3406.0020.0002.120D9] # CUNEIFORM SIGN GA2 TIMES KASKAL
+120DA ; [.3407.0020.0002.120DA] # CUNEIFORM SIGN GA2 TIMES KID
+120DB ; [.3408.0020.0002.120DB] # CUNEIFORM SIGN GA2 TIMES KID PLUS LAL
+120DC ; [.3409.0020.0002.120DC] # CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN
+120DD ; [.340A.0020.0002.120DD] # CUNEIFORM SIGN GA2 TIMES LA
+120DE ; [.340B.0020.0002.120DE] # CUNEIFORM SIGN GA2 TIMES ME PLUS EN
+120DF ; [.340C.0020.0002.120DF] # CUNEIFORM SIGN GA2 TIMES MI
+120E0 ; [.340D.0020.0002.120E0] # CUNEIFORM SIGN GA2 TIMES NUN
+120E1 ; [.340E.0020.0002.120E1] # CUNEIFORM SIGN GA2 TIMES NUN OVER NUN
+120E2 ; [.340F.0020.0002.120E2] # CUNEIFORM SIGN GA2 TIMES PA
+120E3 ; [.3410.0020.0002.120E3] # CUNEIFORM SIGN GA2 TIMES SAL
+120E4 ; [.3411.0020.0002.120E4] # CUNEIFORM SIGN GA2 TIMES SAR
+120E5 ; [.3412.0020.0002.120E5] # CUNEIFORM SIGN GA2 TIMES SHE
+120E6 ; [.3413.0020.0002.120E6] # CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR
+120E7 ; [.3414.0020.0002.120E7] # CUNEIFORM SIGN GA2 TIMES SHID
+120E8 ; [.3415.0020.0002.120E8] # CUNEIFORM SIGN GA2 TIMES SUM
+120E9 ; [.3416.0020.0002.120E9] # CUNEIFORM SIGN GA2 TIMES TAK4
+120EA ; [.3417.0020.0002.120EA] # CUNEIFORM SIGN GA2 TIMES U
+120EB ; [.3418.0020.0002.120EB] # CUNEIFORM SIGN GA2 TIMES UD
+120EC ; [.3419.0020.0002.120EC] # CUNEIFORM SIGN GA2 TIMES UD PLUS DU
+120ED ; [.341A.0020.0002.120ED] # CUNEIFORM SIGN GA2 OVER GA2
+120EE ; [.341B.0020.0002.120EE] # CUNEIFORM SIGN GABA
+120EF ; [.341C.0020.0002.120EF] # CUNEIFORM SIGN GABA CROSSING GABA
+120F0 ; [.341D.0020.0002.120F0] # CUNEIFORM SIGN GAD
+120F1 ; [.341E.0020.0002.120F1] # CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR
+120F2 ; [.341F.0020.0002.120F2] # CUNEIFORM SIGN GAL
+120F3 ; [.3420.0020.0002.120F3] # CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR
+120F4 ; [.3421.0020.0002.120F4] # CUNEIFORM SIGN GALAM
+120F5 ; [.3422.0020.0002.120F5] # CUNEIFORM SIGN GAM
+120F6 ; [.3423.0020.0002.120F6] # CUNEIFORM SIGN GAN
+120F7 ; [.3424.0020.0002.120F7] # CUNEIFORM SIGN GAN2
+120F8 ; [.3425.0020.0002.120F8] # CUNEIFORM SIGN GAN2 TENU
+120F9 ; [.3426.0020.0002.120F9] # CUNEIFORM SIGN GAN2 OVER GAN2
+120FA ; [.3427.0020.0002.120FA] # CUNEIFORM SIGN GAN2 CROSSING GAN2
+120FB ; [.3428.0020.0002.120FB] # CUNEIFORM SIGN GAR
+120FC ; [.3429.0020.0002.120FC] # CUNEIFORM SIGN GAR3
+120FD ; [.342A.0020.0002.120FD] # CUNEIFORM SIGN GASHAN
+120FE ; [.342B.0020.0002.120FE] # CUNEIFORM SIGN GESHTIN
+120FF ; [.342C.0020.0002.120FF] # CUNEIFORM SIGN GESHTIN TIMES KUR
+12100 ; [.342D.0020.0002.12100] # CUNEIFORM SIGN GI
+12101 ; [.342E.0020.0002.12101] # CUNEIFORM SIGN GI TIMES E
+12102 ; [.342F.0020.0002.12102] # CUNEIFORM SIGN GI TIMES U
+12103 ; [.3430.0020.0002.12103] # CUNEIFORM SIGN GI CROSSING GI
+12104 ; [.3431.0020.0002.12104] # CUNEIFORM SIGN GI4
+12105 ; [.3432.0020.0002.12105] # CUNEIFORM SIGN GI4 OVER GI4
+12106 ; [.3433.0020.0002.12106] # CUNEIFORM SIGN GI4 CROSSING GI4
+12107 ; [.3434.0020.0002.12107] # CUNEIFORM SIGN GIDIM
+12108 ; [.3435.0020.0002.12108] # CUNEIFORM SIGN GIR2
+12109 ; [.3436.0020.0002.12109] # CUNEIFORM SIGN GIR2 GUNU
+1210A ; [.3437.0020.0002.1210A] # CUNEIFORM SIGN GIR3
+1210B ; [.3438.0020.0002.1210B] # CUNEIFORM SIGN GIR3 TIMES A PLUS IGI
+1210C ; [.3439.0020.0002.1210C] # CUNEIFORM SIGN GIR3 TIMES GAN2 TENU
+1210D ; [.343A.0020.0002.1210D] # CUNEIFORM SIGN GIR3 TIMES IGI
+1210E ; [.343B.0020.0002.1210E] # CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI
+1210F ; [.343C.0020.0002.1210F] # CUNEIFORM SIGN GIR3 TIMES PA
+12110 ; [.343D.0020.0002.12110] # CUNEIFORM SIGN GISAL
+12111 ; [.343E.0020.0002.12111] # CUNEIFORM SIGN GISH
+12112 ; [.343F.0020.0002.12112] # CUNEIFORM SIGN GISH CROSSING GISH
+12113 ; [.3440.0020.0002.12113] # CUNEIFORM SIGN GISH TIMES BAD
+12114 ; [.3441.0020.0002.12114] # CUNEIFORM SIGN GISH TIMES TAK4
+12115 ; [.3442.0020.0002.12115] # CUNEIFORM SIGN GISH TENU
+12116 ; [.3443.0020.0002.12116] # CUNEIFORM SIGN GU
+12117 ; [.3444.0020.0002.12117] # CUNEIFORM SIGN GU CROSSING GU
+12118 ; [.3445.0020.0002.12118] # CUNEIFORM SIGN GU2
+12119 ; [.3446.0020.0002.12119] # CUNEIFORM SIGN GU2 TIMES KAK
+1211A ; [.3447.0020.0002.1211A] # CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU
+1211B ; [.3448.0020.0002.1211B] # CUNEIFORM SIGN GU2 TIMES NUN
+1211C ; [.3449.0020.0002.1211C] # CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2
+1211D ; [.344A.0020.0002.1211D] # CUNEIFORM SIGN GU2 GUNU
+1211E ; [.344B.0020.0002.1211E] # CUNEIFORM SIGN GUD
+1211F ; [.344C.0020.0002.1211F] # CUNEIFORM SIGN GUD TIMES A PLUS KUR
+12120 ; [.344D.0020.0002.12120] # CUNEIFORM SIGN GUD TIMES KUR
+12121 ; [.344E.0020.0002.12121] # CUNEIFORM SIGN GUD OVER GUD LUGAL
+12122 ; [.344F.0020.0002.12122] # CUNEIFORM SIGN GUL
+12123 ; [.3450.0020.0002.12123] # CUNEIFORM SIGN GUM
+12124 ; [.3451.0020.0002.12124] # CUNEIFORM SIGN GUM TIMES SHE
+12125 ; [.3452.0020.0002.12125] # CUNEIFORM SIGN GUR
+12126 ; [.3453.0020.0002.12126] # CUNEIFORM SIGN GUR7
+12127 ; [.3454.0020.0002.12127] # CUNEIFORM SIGN GURUN
+12128 ; [.3455.0020.0002.12128] # CUNEIFORM SIGN GURUSH
+12129 ; [.3456.0020.0002.12129] # CUNEIFORM SIGN HA
+1212A ; [.3457.0020.0002.1212A] # CUNEIFORM SIGN HA TENU
+1212B ; [.3458.0020.0002.1212B] # CUNEIFORM SIGN HA GUNU
+1212C ; [.3459.0020.0002.1212C] # CUNEIFORM SIGN HAL
+1212D ; [.345A.0020.0002.1212D] # CUNEIFORM SIGN HI
+1212E ; [.345B.0020.0002.1212E] # CUNEIFORM SIGN HI TIMES ASH
+1212F ; [.345C.0020.0002.1212F] # CUNEIFORM SIGN HI TIMES ASH2
+12130 ; [.345D.0020.0002.12130] # CUNEIFORM SIGN HI TIMES BAD
+12131 ; [.345E.0020.0002.12131] # CUNEIFORM SIGN HI TIMES DISH
+12132 ; [.345F.0020.0002.12132] # CUNEIFORM SIGN HI TIMES GAD
+12133 ; [.3460.0020.0002.12133] # CUNEIFORM SIGN HI TIMES KIN
+12134 ; [.3461.0020.0002.12134] # CUNEIFORM SIGN HI TIMES NUN
+12135 ; [.3462.0020.0002.12135] # CUNEIFORM SIGN HI TIMES SHE
+12136 ; [.3463.0020.0002.12136] # CUNEIFORM SIGN HI TIMES U
+12137 ; [.3464.0020.0002.12137] # CUNEIFORM SIGN HU
+12138 ; [.3465.0020.0002.12138] # CUNEIFORM SIGN HUB2
+12139 ; [.3466.0020.0002.12139] # CUNEIFORM SIGN HUB2 TIMES AN
+1213A ; [.3467.0020.0002.1213A] # CUNEIFORM SIGN HUB2 TIMES HAL
+1213B ; [.3468.0020.0002.1213B] # CUNEIFORM SIGN HUB2 TIMES KASKAL
+1213C ; [.3469.0020.0002.1213C] # CUNEIFORM SIGN HUB2 TIMES LISH
+1213D ; [.346A.0020.0002.1213D] # CUNEIFORM SIGN HUB2 TIMES UD
+1213E ; [.346B.0020.0002.1213E] # CUNEIFORM SIGN HUL2
+1213F ; [.346C.0020.0002.1213F] # CUNEIFORM SIGN I
+12140 ; [.346D.0020.0002.12140] # CUNEIFORM SIGN I A
+12141 ; [.346E.0020.0002.12141] # CUNEIFORM SIGN IB
+12142 ; [.346F.0020.0002.12142] # CUNEIFORM SIGN IDIM
+12143 ; [.3470.0020.0002.12143] # CUNEIFORM SIGN IDIM OVER IDIM BUR
+12144 ; [.3471.0020.0002.12144] # CUNEIFORM SIGN IDIM OVER IDIM SQUARED
+12145 ; [.3472.0020.0002.12145] # CUNEIFORM SIGN IG
+12146 ; [.3473.0020.0002.12146] # CUNEIFORM SIGN IGI
+12147 ; [.3474.0020.0002.12147] # CUNEIFORM SIGN IGI DIB
+12148 ; [.3475.0020.0002.12148] # CUNEIFORM SIGN IGI RI
+12149 ; [.3476.0020.0002.12149] # CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD
+1214A ; [.3477.0020.0002.1214A] # CUNEIFORM SIGN IGI GUNU
+1214B ; [.3478.0020.0002.1214B] # CUNEIFORM SIGN IL
+1214C ; [.3479.0020.0002.1214C] # CUNEIFORM SIGN IL TIMES GAN2 TENU
+1214D ; [.347A.0020.0002.1214D] # CUNEIFORM SIGN IL2
+1214E ; [.347B.0020.0002.1214E] # CUNEIFORM SIGN IM
+1214F ; [.347C.0020.0002.1214F] # CUNEIFORM SIGN IM TIMES TAK4
+12150 ; [.347D.0020.0002.12150] # CUNEIFORM SIGN IM CROSSING IM
+12151 ; [.347E.0020.0002.12151] # CUNEIFORM SIGN IM OPPOSING IM
+12152 ; [.347F.0020.0002.12152] # CUNEIFORM SIGN IM SQUARED
+12153 ; [.3480.0020.0002.12153] # CUNEIFORM SIGN IMIN
+12154 ; [.3481.0020.0002.12154] # CUNEIFORM SIGN IN
+12155 ; [.3482.0020.0002.12155] # CUNEIFORM SIGN IR
+12156 ; [.3483.0020.0002.12156] # CUNEIFORM SIGN ISH
+12157 ; [.3484.0020.0002.12157] # CUNEIFORM SIGN KA
+12158 ; [.3485.0020.0002.12158] # CUNEIFORM SIGN KA TIMES A
+12159 ; [.3486.0020.0002.12159] # CUNEIFORM SIGN KA TIMES AD
+1215A ; [.3487.0020.0002.1215A] # CUNEIFORM SIGN KA TIMES AD PLUS KU3
+1215B ; [.3488.0020.0002.1215B] # CUNEIFORM SIGN KA TIMES ASH2
+1215C ; [.3489.0020.0002.1215C] # CUNEIFORM SIGN KA TIMES BAD
+1215D ; [.348A.0020.0002.1215D] # CUNEIFORM SIGN KA TIMES BALAG
+1215E ; [.348B.0020.0002.1215E] # CUNEIFORM SIGN KA TIMES BAR
+1215F ; [.348C.0020.0002.1215F] # CUNEIFORM SIGN KA TIMES BI
+12160 ; [.348D.0020.0002.12160] # CUNEIFORM SIGN KA TIMES ERIN2
+12161 ; [.348E.0020.0002.12161] # CUNEIFORM SIGN KA TIMES ESH2
+12162 ; [.348F.0020.0002.12162] # CUNEIFORM SIGN KA TIMES GA
+12163 ; [.3490.0020.0002.12163] # CUNEIFORM SIGN KA TIMES GAL
+12164 ; [.3491.0020.0002.12164] # CUNEIFORM SIGN KA TIMES GAN2 TENU
+12165 ; [.3492.0020.0002.12165] # CUNEIFORM SIGN KA TIMES GAR
+12166 ; [.3493.0020.0002.12166] # CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A
+12167 ; [.3494.0020.0002.12167] # CUNEIFORM SIGN KA TIMES GI
+12168 ; [.3495.0020.0002.12168] # CUNEIFORM SIGN KA TIMES GIR2
+12169 ; [.3496.0020.0002.12169] # CUNEIFORM SIGN KA TIMES GISH PLUS SAR
+1216A ; [.3497.0020.0002.1216A] # CUNEIFORM SIGN KA TIMES GISH CROSSING GISH
+1216B ; [.3498.0020.0002.1216B] # CUNEIFORM SIGN KA TIMES GU
+1216C ; [.3499.0020.0002.1216C] # CUNEIFORM SIGN KA TIMES GUR7
+1216D ; [.349A.0020.0002.1216D] # CUNEIFORM SIGN KA TIMES IGI
+1216E ; [.349B.0020.0002.1216E] # CUNEIFORM SIGN KA TIMES IM
+1216F ; [.349C.0020.0002.1216F] # CUNEIFORM SIGN KA TIMES KAK
+12170 ; [.349D.0020.0002.12170] # CUNEIFORM SIGN KA TIMES KI
+12171 ; [.349E.0020.0002.12171] # CUNEIFORM SIGN KA TIMES KID
+12172 ; [.349F.0020.0002.12172] # CUNEIFORM SIGN KA TIMES LI
+12173 ; [.34A0.0020.0002.12173] # CUNEIFORM SIGN KA TIMES LU
+12174 ; [.34A1.0020.0002.12174] # CUNEIFORM SIGN KA TIMES ME
+12175 ; [.34A2.0020.0002.12175] # CUNEIFORM SIGN KA TIMES ME PLUS DU
+12176 ; [.34A3.0020.0002.12176] # CUNEIFORM SIGN KA TIMES ME PLUS GI
+12177 ; [.34A4.0020.0002.12177] # CUNEIFORM SIGN KA TIMES ME PLUS TE
+12178 ; [.34A5.0020.0002.12178] # CUNEIFORM SIGN KA TIMES MI
+12179 ; [.34A6.0020.0002.12179] # CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ
+1217A ; [.34A7.0020.0002.1217A] # CUNEIFORM SIGN KA TIMES NE
+1217B ; [.34A8.0020.0002.1217B] # CUNEIFORM SIGN KA TIMES NUN
+1217C ; [.34A9.0020.0002.1217C] # CUNEIFORM SIGN KA TIMES PI
+1217D ; [.34AA.0020.0002.1217D] # CUNEIFORM SIGN KA TIMES RU
+1217E ; [.34AB.0020.0002.1217E] # CUNEIFORM SIGN KA TIMES SA
+1217F ; [.34AC.0020.0002.1217F] # CUNEIFORM SIGN KA TIMES SAR
+12180 ; [.34AD.0020.0002.12180] # CUNEIFORM SIGN KA TIMES SHA
+12181 ; [.34AE.0020.0002.12181] # CUNEIFORM SIGN KA TIMES SHE
+12182 ; [.34AF.0020.0002.12182] # CUNEIFORM SIGN KA TIMES SHID
+12183 ; [.34B0.0020.0002.12183] # CUNEIFORM SIGN KA TIMES SHU
+12184 ; [.34B1.0020.0002.12184] # CUNEIFORM SIGN KA TIMES SIG
+12185 ; [.34B2.0020.0002.12185] # CUNEIFORM SIGN KA TIMES SUHUR
+12186 ; [.34B3.0020.0002.12186] # CUNEIFORM SIGN KA TIMES TAR
+12187 ; [.34B4.0020.0002.12187] # CUNEIFORM SIGN KA TIMES U
+12188 ; [.34B5.0020.0002.12188] # CUNEIFORM SIGN KA TIMES U2
+12189 ; [.34B6.0020.0002.12189] # CUNEIFORM SIGN KA TIMES UD
+1218A ; [.34B7.0020.0002.1218A] # CUNEIFORM SIGN KA TIMES UMUM TIMES PA
+1218B ; [.34B8.0020.0002.1218B] # CUNEIFORM SIGN KA TIMES USH
+1218C ; [.34B9.0020.0002.1218C] # CUNEIFORM SIGN KA TIMES ZI
+1218D ; [.34BA.0020.0002.1218D] # CUNEIFORM SIGN KA2
+1218E ; [.34BB.0020.0002.1218E] # CUNEIFORM SIGN KA2 CROSSING KA2
+1218F ; [.34BC.0020.0002.1218F] # CUNEIFORM SIGN KAB
+12190 ; [.34BD.0020.0002.12190] # CUNEIFORM SIGN KAD2
+12191 ; [.34BE.0020.0002.12191] # CUNEIFORM SIGN KAD3
+12192 ; [.34BF.0020.0002.12192] # CUNEIFORM SIGN KAD4
+12193 ; [.34C0.0020.0002.12193] # CUNEIFORM SIGN KAD5
+12194 ; [.34C1.0020.0002.12194] # CUNEIFORM SIGN KAD5 OVER KAD5
+12195 ; [.34C2.0020.0002.12195] # CUNEIFORM SIGN KAK
+12196 ; [.34C3.0020.0002.12196] # CUNEIFORM SIGN KAK TIMES IGI GUNU
+12197 ; [.34C4.0020.0002.12197] # CUNEIFORM SIGN KAL
+12198 ; [.34C5.0020.0002.12198] # CUNEIFORM SIGN KAL TIMES BAD
+12199 ; [.34C6.0020.0002.12199] # CUNEIFORM SIGN KAL CROSSING KAL
+1219A ; [.34C7.0020.0002.1219A] # CUNEIFORM SIGN KAM2
+1219B ; [.34C8.0020.0002.1219B] # CUNEIFORM SIGN KAM4
+1219C ; [.34C9.0020.0002.1219C] # CUNEIFORM SIGN KASKAL
+1219D ; [.34CA.0020.0002.1219D] # CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U
+1219E ; [.34CB.0020.0002.1219E] # CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U
+1219F ; [.34CC.0020.0002.1219F] # CUNEIFORM SIGN KESH2
+121A0 ; [.34CD.0020.0002.121A0] # CUNEIFORM SIGN KI
+121A1 ; [.34CE.0020.0002.121A1] # CUNEIFORM SIGN KI TIMES BAD
+121A2 ; [.34CF.0020.0002.121A2] # CUNEIFORM SIGN KI TIMES U
+121A3 ; [.34D0.0020.0002.121A3] # CUNEIFORM SIGN KI TIMES UD
+121A4 ; [.34D1.0020.0002.121A4] # CUNEIFORM SIGN KID
+121A5 ; [.34D2.0020.0002.121A5] # CUNEIFORM SIGN KIN
+121A6 ; [.34D3.0020.0002.121A6] # CUNEIFORM SIGN KISAL
+121A7 ; [.34D4.0020.0002.121A7] # CUNEIFORM SIGN KISH
+121A8 ; [.34D5.0020.0002.121A8] # CUNEIFORM SIGN KISIM5
+121A9 ; [.34D6.0020.0002.121A9] # CUNEIFORM SIGN KISIM5 OVER KISIM5
+121AA ; [.34D7.0020.0002.121AA] # CUNEIFORM SIGN KU
+121AB ; [.34D8.0020.0002.121AB] # CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2
+121AC ; [.34D9.0020.0002.121AC] # CUNEIFORM SIGN KU3
+121AD ; [.34DA.0020.0002.121AD] # CUNEIFORM SIGN KU4
+121AE ; [.34DB.0020.0002.121AE] # CUNEIFORM SIGN KU4 VARIANT FORM
+121AF ; [.34DC.0020.0002.121AF] # CUNEIFORM SIGN KU7
+121B0 ; [.34DD.0020.0002.121B0] # CUNEIFORM SIGN KUL
+121B1 ; [.34DE.0020.0002.121B1] # CUNEIFORM SIGN KUL GUNU
+121B2 ; [.34DF.0020.0002.121B2] # CUNEIFORM SIGN KUN
+121B3 ; [.34E0.0020.0002.121B3] # CUNEIFORM SIGN KUR
+121B4 ; [.34E1.0020.0002.121B4] # CUNEIFORM SIGN KUR OPPOSING KUR
+121B5 ; [.34E2.0020.0002.121B5] # CUNEIFORM SIGN KUSHU2
+121B6 ; [.34E3.0020.0002.121B6] # CUNEIFORM SIGN KWU318
+121B7 ; [.34E4.0020.0002.121B7] # CUNEIFORM SIGN LA
+121B8 ; [.34E5.0020.0002.121B8] # CUNEIFORM SIGN LAGAB
+121B9 ; [.34E6.0020.0002.121B9] # CUNEIFORM SIGN LAGAB TIMES A
+121BA ; [.34E7.0020.0002.121BA] # CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA
+121BB ; [.34E8.0020.0002.121BB] # CUNEIFORM SIGN LAGAB TIMES A PLUS GAR
+121BC ; [.34E9.0020.0002.121BC] # CUNEIFORM SIGN LAGAB TIMES A PLUS LAL
+121BD ; [.34EA.0020.0002.121BD] # CUNEIFORM SIGN LAGAB TIMES AL
+121BE ; [.34EB.0020.0002.121BE] # CUNEIFORM SIGN LAGAB TIMES AN
+121BF ; [.34EC.0020.0002.121BF] # CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU
+121C0 ; [.34ED.0020.0002.121C0] # CUNEIFORM SIGN LAGAB TIMES BAD
+121C1 ; [.34EE.0020.0002.121C1] # CUNEIFORM SIGN LAGAB TIMES BI
+121C2 ; [.34EF.0020.0002.121C2] # CUNEIFORM SIGN LAGAB TIMES DAR
+121C3 ; [.34F0.0020.0002.121C3] # CUNEIFORM SIGN LAGAB TIMES EN
+121C4 ; [.34F1.0020.0002.121C4] # CUNEIFORM SIGN LAGAB TIMES GA
+121C5 ; [.34F2.0020.0002.121C5] # CUNEIFORM SIGN LAGAB TIMES GAR
+121C6 ; [.34F3.0020.0002.121C6] # CUNEIFORM SIGN LAGAB TIMES GUD
+121C7 ; [.34F4.0020.0002.121C7] # CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD
+121C8 ; [.34F5.0020.0002.121C8] # CUNEIFORM SIGN LAGAB TIMES HA
+121C9 ; [.34F6.0020.0002.121C9] # CUNEIFORM SIGN LAGAB TIMES HAL
+121CA ; [.34F7.0020.0002.121CA] # CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN
+121CB ; [.34F8.0020.0002.121CB] # CUNEIFORM SIGN LAGAB TIMES IGI GUNU
+121CC ; [.34F9.0020.0002.121CC] # CUNEIFORM SIGN LAGAB TIMES IM
+121CD ; [.34FA.0020.0002.121CD] # CUNEIFORM SIGN LAGAB TIMES IM PLUS HA
+121CE ; [.34FB.0020.0002.121CE] # CUNEIFORM SIGN LAGAB TIMES IM PLUS LU
+121CF ; [.34FC.0020.0002.121CF] # CUNEIFORM SIGN LAGAB TIMES KI
+121D0 ; [.34FD.0020.0002.121D0] # CUNEIFORM SIGN LAGAB TIMES KIN
+121D1 ; [.34FE.0020.0002.121D1] # CUNEIFORM SIGN LAGAB TIMES KU3
+121D2 ; [.34FF.0020.0002.121D2] # CUNEIFORM SIGN LAGAB TIMES KUL
+121D3 ; [.3500.0020.0002.121D3] # CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A
+121D4 ; [.3501.0020.0002.121D4] # CUNEIFORM SIGN LAGAB TIMES LAGAB
+121D5 ; [.3502.0020.0002.121D5] # CUNEIFORM SIGN LAGAB TIMES LISH
+121D6 ; [.3503.0020.0002.121D6] # CUNEIFORM SIGN LAGAB TIMES LU
+121D7 ; [.3504.0020.0002.121D7] # CUNEIFORM SIGN LAGAB TIMES LUL
+121D8 ; [.3505.0020.0002.121D8] # CUNEIFORM SIGN LAGAB TIMES ME
+121D9 ; [.3506.0020.0002.121D9] # CUNEIFORM SIGN LAGAB TIMES ME PLUS EN
+121DA ; [.3507.0020.0002.121DA] # CUNEIFORM SIGN LAGAB TIMES MUSH
+121DB ; [.3508.0020.0002.121DB] # CUNEIFORM SIGN LAGAB TIMES NE
+121DC ; [.3509.0020.0002.121DC] # CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM
+121DD ; [.350A.0020.0002.121DD] # CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2
+121DE ; [.350B.0020.0002.121DE] # CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU
+121DF ; [.350C.0020.0002.121DF] # CUNEIFORM SIGN LAGAB TIMES SHU2
+121E0 ; [.350D.0020.0002.121E0] # CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2
+121E1 ; [.350E.0020.0002.121E1] # CUNEIFORM SIGN LAGAB TIMES SUM
+121E2 ; [.350F.0020.0002.121E2] # CUNEIFORM SIGN LAGAB TIMES TAG
+121E3 ; [.3510.0020.0002.121E3] # CUNEIFORM SIGN LAGAB TIMES TAK4
+121E4 ; [.3511.0020.0002.121E4] # CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA
+121E5 ; [.3512.0020.0002.121E5] # CUNEIFORM SIGN LAGAB TIMES U
+121E6 ; [.3513.0020.0002.121E6] # CUNEIFORM SIGN LAGAB TIMES U PLUS A
+121E7 ; [.3514.0020.0002.121E7] # CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U
+121E8 ; [.3515.0020.0002.121E8] # CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH
+121E9 ; [.3516.0020.0002.121E9] # CUNEIFORM SIGN LAGAB TIMES UD
+121EA ; [.3517.0020.0002.121EA] # CUNEIFORM SIGN LAGAB TIMES USH
+121EB ; [.3518.0020.0002.121EB] # CUNEIFORM SIGN LAGAB SQUARED
+121EC ; [.3519.0020.0002.121EC] # CUNEIFORM SIGN LAGAR
+121ED ; [.351A.0020.0002.121ED] # CUNEIFORM SIGN LAGAR TIMES SHE
+121EE ; [.351B.0020.0002.121EE] # CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM
+121EF ; [.351C.0020.0002.121EF] # CUNEIFORM SIGN LAGAR GUNU
+121F0 ; [.351D.0020.0002.121F0] # CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE
+121F1 ; [.351E.0020.0002.121F1] # CUNEIFORM SIGN LAHSHU
+121F2 ; [.351F.0020.0002.121F2] # CUNEIFORM SIGN LAL
+121F3 ; [.3520.0020.0002.121F3] # CUNEIFORM SIGN LAL TIMES LAL
+121F4 ; [.3521.0020.0002.121F4] # CUNEIFORM SIGN LAM
+121F5 ; [.3522.0020.0002.121F5] # CUNEIFORM SIGN LAM TIMES KUR
+121F6 ; [.3523.0020.0002.121F6] # CUNEIFORM SIGN LAM TIMES KUR PLUS RU
+121F7 ; [.3524.0020.0002.121F7] # CUNEIFORM SIGN LI
+121F8 ; [.3525.0020.0002.121F8] # CUNEIFORM SIGN LIL
+121F9 ; [.3526.0020.0002.121F9] # CUNEIFORM SIGN LIMMU2
+121FA ; [.3527.0020.0002.121FA] # CUNEIFORM SIGN LISH
+121FB ; [.3528.0020.0002.121FB] # CUNEIFORM SIGN LU
+121FC ; [.3529.0020.0002.121FC] # CUNEIFORM SIGN LU TIMES BAD
+121FD ; [.352A.0020.0002.121FD] # CUNEIFORM SIGN LU2
+121FE ; [.352B.0020.0002.121FE] # CUNEIFORM SIGN LU2 TIMES AL
+121FF ; [.352C.0020.0002.121FF] # CUNEIFORM SIGN LU2 TIMES BAD
+12200 ; [.352D.0020.0002.12200] # CUNEIFORM SIGN LU2 TIMES ESH2
+12201 ; [.352E.0020.0002.12201] # CUNEIFORM SIGN LU2 TIMES ESH2 TENU
+12202 ; [.352F.0020.0002.12202] # CUNEIFORM SIGN LU2 TIMES GAN2 TENU
+12203 ; [.3530.0020.0002.12203] # CUNEIFORM SIGN LU2 TIMES HI TIMES BAD
+12204 ; [.3531.0020.0002.12204] # CUNEIFORM SIGN LU2 TIMES IM
+12205 ; [.3532.0020.0002.12205] # CUNEIFORM SIGN LU2 TIMES KAD2
+12206 ; [.3533.0020.0002.12206] # CUNEIFORM SIGN LU2 TIMES KAD3
+12207 ; [.3534.0020.0002.12207] # CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH
+12208 ; [.3535.0020.0002.12208] # CUNEIFORM SIGN LU2 TIMES KI
+12209 ; [.3536.0020.0002.12209] # CUNEIFORM SIGN LU2 TIMES LA PLUS ASH
+1220A ; [.3537.0020.0002.1220A] # CUNEIFORM SIGN LU2 TIMES LAGAB
+1220B ; [.3538.0020.0002.1220B] # CUNEIFORM SIGN LU2 TIMES ME PLUS EN
+1220C ; [.3539.0020.0002.1220C] # CUNEIFORM SIGN LU2 TIMES NE
+1220D ; [.353A.0020.0002.1220D] # CUNEIFORM SIGN LU2 TIMES NU
+1220E ; [.353B.0020.0002.1220E] # CUNEIFORM SIGN LU2 TIMES SI PLUS ASH
+1220F ; [.353C.0020.0002.1220F] # CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU
+12210 ; [.353D.0020.0002.12210] # CUNEIFORM SIGN LU2 TIMES TUG2
+12211 ; [.353E.0020.0002.12211] # CUNEIFORM SIGN LU2 TENU
+12212 ; [.353F.0020.0002.12212] # CUNEIFORM SIGN LU2 CROSSING LU2
+12213 ; [.3540.0020.0002.12213] # CUNEIFORM SIGN LU2 OPPOSING LU2
+12214 ; [.3541.0020.0002.12214] # CUNEIFORM SIGN LU2 SQUARED
+12215 ; [.3542.0020.0002.12215] # CUNEIFORM SIGN LU2 SHESHIG
+12216 ; [.3543.0020.0002.12216] # CUNEIFORM SIGN LU3
+12217 ; [.3544.0020.0002.12217] # CUNEIFORM SIGN LUGAL
+12218 ; [.3545.0020.0002.12218] # CUNEIFORM SIGN LUGAL OVER LUGAL
+12219 ; [.3546.0020.0002.12219] # CUNEIFORM SIGN LUGAL OPPOSING LUGAL
+1221A ; [.3547.0020.0002.1221A] # CUNEIFORM SIGN LUGAL SHESHIG
+1221B ; [.3548.0020.0002.1221B] # CUNEIFORM SIGN LUH
+1221C ; [.3549.0020.0002.1221C] # CUNEIFORM SIGN LUL
+1221D ; [.354A.0020.0002.1221D] # CUNEIFORM SIGN LUM
+1221E ; [.354B.0020.0002.1221E] # CUNEIFORM SIGN LUM OVER LUM
+1221F ; [.354C.0020.0002.1221F] # CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR
+12220 ; [.354D.0020.0002.12220] # CUNEIFORM SIGN MA
+12221 ; [.354E.0020.0002.12221] # CUNEIFORM SIGN MA TIMES TAK4
+12222 ; [.354F.0020.0002.12222] # CUNEIFORM SIGN MA GUNU
+12223 ; [.3550.0020.0002.12223] # CUNEIFORM SIGN MA2
+12224 ; [.3551.0020.0002.12224] # CUNEIFORM SIGN MAH
+12225 ; [.3552.0020.0002.12225] # CUNEIFORM SIGN MAR
+12226 ; [.3553.0020.0002.12226] # CUNEIFORM SIGN MASH
+12227 ; [.3554.0020.0002.12227] # CUNEIFORM SIGN MASH2
+12228 ; [.3555.0020.0002.12228] # CUNEIFORM SIGN ME
+12229 ; [.3556.0020.0002.12229] # CUNEIFORM SIGN MES
+1222A ; [.3557.0020.0002.1222A] # CUNEIFORM SIGN MI
+1222B ; [.3558.0020.0002.1222B] # CUNEIFORM SIGN MIN
+1222C ; [.3559.0020.0002.1222C] # CUNEIFORM SIGN MU
+1222D ; [.355A.0020.0002.1222D] # CUNEIFORM SIGN MU OVER MU
+1222E ; [.355B.0020.0002.1222E] # CUNEIFORM SIGN MUG
+1222F ; [.355C.0020.0002.1222F] # CUNEIFORM SIGN MUG GUNU
+12230 ; [.355D.0020.0002.12230] # CUNEIFORM SIGN MUNSUB
+12231 ; [.355E.0020.0002.12231] # CUNEIFORM SIGN MURGU2
+12232 ; [.355F.0020.0002.12232] # CUNEIFORM SIGN MUSH
+12233 ; [.3560.0020.0002.12233] # CUNEIFORM SIGN MUSH TIMES A
+12234 ; [.3561.0020.0002.12234] # CUNEIFORM SIGN MUSH TIMES KUR
+12235 ; [.3562.0020.0002.12235] # CUNEIFORM SIGN MUSH TIMES ZA
+12236 ; [.3563.0020.0002.12236] # CUNEIFORM SIGN MUSH OVER MUSH
+12237 ; [.3564.0020.0002.12237] # CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA
+12238 ; [.3565.0020.0002.12238] # CUNEIFORM SIGN MUSH CROSSING MUSH
+12239 ; [.3566.0020.0002.12239] # CUNEIFORM SIGN MUSH3
+1223A ; [.3567.0020.0002.1223A] # CUNEIFORM SIGN MUSH3 TIMES A
+1223B ; [.3568.0020.0002.1223B] # CUNEIFORM SIGN MUSH3 TIMES A PLUS DI
+1223C ; [.3569.0020.0002.1223C] # CUNEIFORM SIGN MUSH3 TIMES DI
+1223D ; [.356A.0020.0002.1223D] # CUNEIFORM SIGN MUSH3 GUNU
+1223E ; [.356B.0020.0002.1223E] # CUNEIFORM SIGN NA
+1223F ; [.356C.0020.0002.1223F] # CUNEIFORM SIGN NA2
+12240 ; [.356D.0020.0002.12240] # CUNEIFORM SIGN NAGA
+12241 ; [.356E.0020.0002.12241] # CUNEIFORM SIGN NAGA INVERTED
+12242 ; [.356F.0020.0002.12242] # CUNEIFORM SIGN NAGA TIMES SHU TENU
+12243 ; [.3570.0020.0002.12243] # CUNEIFORM SIGN NAGA OPPOSING NAGA
+12244 ; [.3571.0020.0002.12244] # CUNEIFORM SIGN NAGAR
+12245 ; [.3572.0020.0002.12245] # CUNEIFORM SIGN NAM NUTILLU
+12246 ; [.3573.0020.0002.12246] # CUNEIFORM SIGN NAM
+12247 ; [.3574.0020.0002.12247] # CUNEIFORM SIGN NAM2
+12248 ; [.3575.0020.0002.12248] # CUNEIFORM SIGN NE
+12249 ; [.3576.0020.0002.12249] # CUNEIFORM SIGN NE TIMES A
+1224A ; [.3577.0020.0002.1224A] # CUNEIFORM SIGN NE TIMES UD
+1224B ; [.3578.0020.0002.1224B] # CUNEIFORM SIGN NE SHESHIG
+1224C ; [.3579.0020.0002.1224C] # CUNEIFORM SIGN NI
+1224D ; [.357A.0020.0002.1224D] # CUNEIFORM SIGN NI TIMES E
+1224E ; [.357B.0020.0002.1224E] # CUNEIFORM SIGN NI2
+1224F ; [.357C.0020.0002.1224F] # CUNEIFORM SIGN NIM
+12250 ; [.357D.0020.0002.12250] # CUNEIFORM SIGN NIM TIMES GAN2 TENU
+12251 ; [.357E.0020.0002.12251] # CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU
+12252 ; [.357F.0020.0002.12252] # CUNEIFORM SIGN NINDA2
+12253 ; [.3580.0020.0002.12253] # CUNEIFORM SIGN NINDA2 TIMES AN
+12254 ; [.3581.0020.0002.12254] # CUNEIFORM SIGN NINDA2 TIMES ASH
+12255 ; [.3582.0020.0002.12255] # CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH
+12256 ; [.3583.0020.0002.12256] # CUNEIFORM SIGN NINDA2 TIMES GUD
+12257 ; [.3584.0020.0002.12257] # CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU
+12258 ; [.3585.0020.0002.12258] # CUNEIFORM SIGN NINDA2 TIMES NE
+12259 ; [.3586.0020.0002.12259] # CUNEIFORM SIGN NINDA2 TIMES NUN
+1225A ; [.3587.0020.0002.1225A] # CUNEIFORM SIGN NINDA2 TIMES SHE
+1225B ; [.3588.0020.0002.1225B] # CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN
+1225C ; [.3589.0020.0002.1225C] # CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH
+1225D ; [.358A.0020.0002.1225D] # CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH
+1225E ; [.358B.0020.0002.1225E] # CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH
+1225F ; [.358C.0020.0002.1225F] # CUNEIFORM SIGN NINDA2 TIMES USH
+12260 ; [.358D.0020.0002.12260] # CUNEIFORM SIGN NISAG
+12261 ; [.358E.0020.0002.12261] # CUNEIFORM SIGN NU
+12262 ; [.358F.0020.0002.12262] # CUNEIFORM SIGN NU11
+12263 ; [.3590.0020.0002.12263] # CUNEIFORM SIGN NUN
+12264 ; [.3591.0020.0002.12264] # CUNEIFORM SIGN NUN LAGAR TIMES GAR
+12265 ; [.3592.0020.0002.12265] # CUNEIFORM SIGN NUN LAGAR TIMES MASH
+12266 ; [.3593.0020.0002.12266] # CUNEIFORM SIGN NUN LAGAR TIMES SAL
+12267 ; [.3594.0020.0002.12267] # CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL
+12268 ; [.3595.0020.0002.12268] # CUNEIFORM SIGN NUN LAGAR TIMES USH
+12269 ; [.3596.0020.0002.12269] # CUNEIFORM SIGN NUN TENU
+1226A ; [.3597.0020.0002.1226A] # CUNEIFORM SIGN NUN OVER NUN
+1226B ; [.3598.0020.0002.1226B] # CUNEIFORM SIGN NUN CROSSING NUN
+1226C ; [.3599.0020.0002.1226C] # CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR
+1226D ; [.359A.0020.0002.1226D] # CUNEIFORM SIGN NUNUZ
+1226E ; [.359B.0020.0002.1226E] # CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB
+1226F ; [.359C.0020.0002.1226F] # CUNEIFORM SIGN NUNUZ AB2 TIMES BI
+12270 ; [.359D.0020.0002.12270] # CUNEIFORM SIGN NUNUZ AB2 TIMES DUG
+12271 ; [.359E.0020.0002.12271] # CUNEIFORM SIGN NUNUZ AB2 TIMES GUD
+12272 ; [.359F.0020.0002.12272] # CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU
+12273 ; [.35A0.0020.0002.12273] # CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3
+12274 ; [.35A1.0020.0002.12274] # CUNEIFORM SIGN NUNUZ AB2 TIMES LA
+12275 ; [.35A2.0020.0002.12275] # CUNEIFORM SIGN NUNUZ AB2 TIMES NE
+12276 ; [.35A3.0020.0002.12276] # CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3
+12277 ; [.35A4.0020.0002.12277] # CUNEIFORM SIGN NUNUZ AB2 TIMES U2
+12278 ; [.35A5.0020.0002.12278] # CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI
+12279 ; [.35A6.0020.0002.12279] # CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U
+1227A ; [.35A7.0020.0002.1227A] # CUNEIFORM SIGN PA
+1227B ; [.35A8.0020.0002.1227B] # CUNEIFORM SIGN PAD
+1227C ; [.35A9.0020.0002.1227C] # CUNEIFORM SIGN PAN
+1227D ; [.35AA.0020.0002.1227D] # CUNEIFORM SIGN PAP
+1227E ; [.35AB.0020.0002.1227E] # CUNEIFORM SIGN PESH2
+1227F ; [.35AC.0020.0002.1227F] # CUNEIFORM SIGN PI
+12280 ; [.35AD.0020.0002.12280] # CUNEIFORM SIGN PI TIMES A
+12281 ; [.35AE.0020.0002.12281] # CUNEIFORM SIGN PI TIMES AB
+12282 ; [.35AF.0020.0002.12282] # CUNEIFORM SIGN PI TIMES BI
+12283 ; [.35B0.0020.0002.12283] # CUNEIFORM SIGN PI TIMES BU
+12284 ; [.35B1.0020.0002.12284] # CUNEIFORM SIGN PI TIMES E
+12285 ; [.35B2.0020.0002.12285] # CUNEIFORM SIGN PI TIMES I
+12286 ; [.35B3.0020.0002.12286] # CUNEIFORM SIGN PI TIMES IB
+12287 ; [.35B4.0020.0002.12287] # CUNEIFORM SIGN PI TIMES U
+12288 ; [.35B5.0020.0002.12288] # CUNEIFORM SIGN PI TIMES U2
+12289 ; [.35B6.0020.0002.12289] # CUNEIFORM SIGN PI CROSSING PI
+1228A ; [.35B7.0020.0002.1228A] # CUNEIFORM SIGN PIRIG
+1228B ; [.35B8.0020.0002.1228B] # CUNEIFORM SIGN PIRIG TIMES KAL
+1228C ; [.35B9.0020.0002.1228C] # CUNEIFORM SIGN PIRIG TIMES UD
+1228D ; [.35BA.0020.0002.1228D] # CUNEIFORM SIGN PIRIG TIMES ZA
+1228E ; [.35BB.0020.0002.1228E] # CUNEIFORM SIGN PIRIG OPPOSING PIRIG
+1228F ; [.35BC.0020.0002.1228F] # CUNEIFORM SIGN RA
+12290 ; [.35BD.0020.0002.12290] # CUNEIFORM SIGN RAB
+12291 ; [.35BE.0020.0002.12291] # CUNEIFORM SIGN RI
+12292 ; [.35BF.0020.0002.12292] # CUNEIFORM SIGN RU
+12293 ; [.35C0.0020.0002.12293] # CUNEIFORM SIGN SA
+12294 ; [.35C1.0020.0002.12294] # CUNEIFORM SIGN SAG NUTILLU
+12295 ; [.35C2.0020.0002.12295] # CUNEIFORM SIGN SAG
+12296 ; [.35C3.0020.0002.12296] # CUNEIFORM SIGN SAG TIMES A
+12297 ; [.35C4.0020.0002.12297] # CUNEIFORM SIGN SAG TIMES DU
+12298 ; [.35C5.0020.0002.12298] # CUNEIFORM SIGN SAG TIMES DUB
+12299 ; [.35C6.0020.0002.12299] # CUNEIFORM SIGN SAG TIMES HA
+1229A ; [.35C7.0020.0002.1229A] # CUNEIFORM SIGN SAG TIMES KAK
+1229B ; [.35C8.0020.0002.1229B] # CUNEIFORM SIGN SAG TIMES KUR
+1229C ; [.35C9.0020.0002.1229C] # CUNEIFORM SIGN SAG TIMES LUM
+1229D ; [.35CA.0020.0002.1229D] # CUNEIFORM SIGN SAG TIMES MI
+1229E ; [.35CB.0020.0002.1229E] # CUNEIFORM SIGN SAG TIMES NUN
+1229F ; [.35CC.0020.0002.1229F] # CUNEIFORM SIGN SAG TIMES SAL
+122A0 ; [.35CD.0020.0002.122A0] # CUNEIFORM SIGN SAG TIMES SHID
+122A1 ; [.35CE.0020.0002.122A1] # CUNEIFORM SIGN SAG TIMES TAB
+122A2 ; [.35CF.0020.0002.122A2] # CUNEIFORM SIGN SAG TIMES U2
+122A3 ; [.35D0.0020.0002.122A3] # CUNEIFORM SIGN SAG TIMES UB
+122A4 ; [.35D1.0020.0002.122A4] # CUNEIFORM SIGN SAG TIMES UM
+122A5 ; [.35D2.0020.0002.122A5] # CUNEIFORM SIGN SAG TIMES UR
+122A6 ; [.35D3.0020.0002.122A6] # CUNEIFORM SIGN SAG TIMES USH
+122A7 ; [.35D4.0020.0002.122A7] # CUNEIFORM SIGN SAG OVER SAG
+122A8 ; [.35D5.0020.0002.122A8] # CUNEIFORM SIGN SAG GUNU
+122A9 ; [.35D6.0020.0002.122A9] # CUNEIFORM SIGN SAL
+122AA ; [.35D7.0020.0002.122AA] # CUNEIFORM SIGN SAL LAGAB TIMES ASH2
+122AB ; [.35D8.0020.0002.122AB] # CUNEIFORM SIGN SANGA2
+122AC ; [.35D9.0020.0002.122AC] # CUNEIFORM SIGN SAR
+122AD ; [.35DA.0020.0002.122AD] # CUNEIFORM SIGN SHA
+122AE ; [.35DB.0020.0002.122AE] # CUNEIFORM SIGN SHA3
+122AF ; [.35DC.0020.0002.122AF] # CUNEIFORM SIGN SHA3 TIMES A
+122B0 ; [.35DD.0020.0002.122B0] # CUNEIFORM SIGN SHA3 TIMES BAD
+122B1 ; [.35DE.0020.0002.122B1] # CUNEIFORM SIGN SHA3 TIMES GISH
+122B2 ; [.35DF.0020.0002.122B2] # CUNEIFORM SIGN SHA3 TIMES NE
+122B3 ; [.35E0.0020.0002.122B3] # CUNEIFORM SIGN SHA3 TIMES SHU2
+122B4 ; [.35E1.0020.0002.122B4] # CUNEIFORM SIGN SHA3 TIMES TUR
+122B5 ; [.35E2.0020.0002.122B5] # CUNEIFORM SIGN SHA3 TIMES U
+122B6 ; [.35E3.0020.0002.122B6] # CUNEIFORM SIGN SHA3 TIMES U PLUS A
+122B7 ; [.35E4.0020.0002.122B7] # CUNEIFORM SIGN SHA6
+122B8 ; [.35E5.0020.0002.122B8] # CUNEIFORM SIGN SHAB6
+122B9 ; [.35E6.0020.0002.122B9] # CUNEIFORM SIGN SHAR2
+122BA ; [.35E7.0020.0002.122BA] # CUNEIFORM SIGN SHE
+122BB ; [.35E8.0020.0002.122BB] # CUNEIFORM SIGN SHE HU
+122BC ; [.35E9.0020.0002.122BC] # CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR
+122BD ; [.35EA.0020.0002.122BD] # CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR
+122BE ; [.35EB.0020.0002.122BE] # CUNEIFORM SIGN SHEG9
+122BF ; [.35EC.0020.0002.122BF] # CUNEIFORM SIGN SHEN
+122C0 ; [.35ED.0020.0002.122C0] # CUNEIFORM SIGN SHESH
+122C1 ; [.35EE.0020.0002.122C1] # CUNEIFORM SIGN SHESH2
+122C2 ; [.35EF.0020.0002.122C2] # CUNEIFORM SIGN SHESHLAM
+122C3 ; [.35F0.0020.0002.122C3] # CUNEIFORM SIGN SHID
+122C4 ; [.35F1.0020.0002.122C4] # CUNEIFORM SIGN SHID TIMES A
+122C5 ; [.35F2.0020.0002.122C5] # CUNEIFORM SIGN SHID TIMES IM
+122C6 ; [.35F3.0020.0002.122C6] # CUNEIFORM SIGN SHIM
+122C7 ; [.35F4.0020.0002.122C7] # CUNEIFORM SIGN SHIM TIMES A
+122C8 ; [.35F5.0020.0002.122C8] # CUNEIFORM SIGN SHIM TIMES BAL
+122C9 ; [.35F6.0020.0002.122C9] # CUNEIFORM SIGN SHIM TIMES BULUG
+122CA ; [.35F7.0020.0002.122CA] # CUNEIFORM SIGN SHIM TIMES DIN
+122CB ; [.35F8.0020.0002.122CB] # CUNEIFORM SIGN SHIM TIMES GAR
+122CC ; [.35F9.0020.0002.122CC] # CUNEIFORM SIGN SHIM TIMES IGI
+122CD ; [.35FA.0020.0002.122CD] # CUNEIFORM SIGN SHIM TIMES IGI GUNU
+122CE ; [.35FB.0020.0002.122CE] # CUNEIFORM SIGN SHIM TIMES KUSHU2
+122CF ; [.35FC.0020.0002.122CF] # CUNEIFORM SIGN SHIM TIMES LUL
+122D0 ; [.35FD.0020.0002.122D0] # CUNEIFORM SIGN SHIM TIMES MUG
+122D1 ; [.35FE.0020.0002.122D1] # CUNEIFORM SIGN SHIM TIMES SAL
+122D2 ; [.35FF.0020.0002.122D2] # CUNEIFORM SIGN SHINIG
+122D3 ; [.3600.0020.0002.122D3] # CUNEIFORM SIGN SHIR
+122D4 ; [.3601.0020.0002.122D4] # CUNEIFORM SIGN SHIR TENU
+122D5 ; [.3602.0020.0002.122D5] # CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR
+122D6 ; [.3603.0020.0002.122D6] # CUNEIFORM SIGN SHITA
+122D7 ; [.3604.0020.0002.122D7] # CUNEIFORM SIGN SHU
+122D8 ; [.3605.0020.0002.122D8] # CUNEIFORM SIGN SHU OVER INVERTED SHU
+122D9 ; [.3606.0020.0002.122D9] # CUNEIFORM SIGN SHU2
+122DA ; [.3607.0020.0002.122DA] # CUNEIFORM SIGN SHUBUR
+122DB ; [.3608.0020.0002.122DB] # CUNEIFORM SIGN SI
+122DC ; [.3609.0020.0002.122DC] # CUNEIFORM SIGN SI GUNU
+122DD ; [.360A.0020.0002.122DD] # CUNEIFORM SIGN SIG
+122DE ; [.360B.0020.0002.122DE] # CUNEIFORM SIGN SIG4
+122DF ; [.360C.0020.0002.122DF] # CUNEIFORM SIGN SIG4 OVER SIG4 SHU2
+122E0 ; [.360D.0020.0002.122E0] # CUNEIFORM SIGN SIK2
+122E1 ; [.360E.0020.0002.122E1] # CUNEIFORM SIGN SILA3
+122E2 ; [.360F.0020.0002.122E2] # CUNEIFORM SIGN SU
+122E3 ; [.3610.0020.0002.122E3] # CUNEIFORM SIGN SU OVER SU
+122E4 ; [.3611.0020.0002.122E4] # CUNEIFORM SIGN SUD
+122E5 ; [.3612.0020.0002.122E5] # CUNEIFORM SIGN SUD2
+122E6 ; [.3613.0020.0002.122E6] # CUNEIFORM SIGN SUHUR
+122E7 ; [.3614.0020.0002.122E7] # CUNEIFORM SIGN SUM
+122E8 ; [.3615.0020.0002.122E8] # CUNEIFORM SIGN SUMASH
+122E9 ; [.3616.0020.0002.122E9] # CUNEIFORM SIGN SUR
+122EA ; [.3617.0020.0002.122EA] # CUNEIFORM SIGN SUR9
+122EB ; [.3618.0020.0002.122EB] # CUNEIFORM SIGN TA
+122EC ; [.3619.0020.0002.122EC] # CUNEIFORM SIGN TA ASTERISK
+122ED ; [.361A.0020.0002.122ED] # CUNEIFORM SIGN TA TIMES HI
+122EE ; [.361B.0020.0002.122EE] # CUNEIFORM SIGN TA TIMES MI
+122EF ; [.361C.0020.0002.122EF] # CUNEIFORM SIGN TA GUNU
+122F0 ; [.361D.0020.0002.122F0] # CUNEIFORM SIGN TAB
+122F1 ; [.361E.0020.0002.122F1] # CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH
+122F2 ; [.361F.0020.0002.122F2] # CUNEIFORM SIGN TAB SQUARED
+122F3 ; [.3620.0020.0002.122F3] # CUNEIFORM SIGN TAG
+122F4 ; [.3621.0020.0002.122F4] # CUNEIFORM SIGN TAG TIMES BI
+122F5 ; [.3622.0020.0002.122F5] # CUNEIFORM SIGN TAG TIMES GUD
+122F6 ; [.3623.0020.0002.122F6] # CUNEIFORM SIGN TAG TIMES SHE
+122F7 ; [.3624.0020.0002.122F7] # CUNEIFORM SIGN TAG TIMES SHU
+122F8 ; [.3625.0020.0002.122F8] # CUNEIFORM SIGN TAG TIMES TUG2
+122F9 ; [.3626.0020.0002.122F9] # CUNEIFORM SIGN TAG TIMES UD
+122FA ; [.3627.0020.0002.122FA] # CUNEIFORM SIGN TAK4
+122FB ; [.3628.0020.0002.122FB] # CUNEIFORM SIGN TAR
+122FC ; [.3629.0020.0002.122FC] # CUNEIFORM SIGN TE
+122FD ; [.362A.0020.0002.122FD] # CUNEIFORM SIGN TE GUNU
+122FE ; [.362B.0020.0002.122FE] # CUNEIFORM SIGN TI
+122FF ; [.362C.0020.0002.122FF] # CUNEIFORM SIGN TI TENU
+12300 ; [.362D.0020.0002.12300] # CUNEIFORM SIGN TIL
+12301 ; [.362E.0020.0002.12301] # CUNEIFORM SIGN TIR
+12302 ; [.362F.0020.0002.12302] # CUNEIFORM SIGN TIR TIMES TAK4
+12303 ; [.3630.0020.0002.12303] # CUNEIFORM SIGN TIR OVER TIR
+12304 ; [.3631.0020.0002.12304] # CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR
+12305 ; [.3632.0020.0002.12305] # CUNEIFORM SIGN TU
+12306 ; [.3633.0020.0002.12306] # CUNEIFORM SIGN TUG2
+12307 ; [.3634.0020.0002.12307] # CUNEIFORM SIGN TUK
+12308 ; [.3635.0020.0002.12308] # CUNEIFORM SIGN TUM
+12309 ; [.3636.0020.0002.12309] # CUNEIFORM SIGN TUR
+1230A ; [.3637.0020.0002.1230A] # CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA
+1230B ; [.3638.0020.0002.1230B] # CUNEIFORM SIGN U
+1230C ; [.3639.0020.0002.1230C] # CUNEIFORM SIGN U GUD
+1230D ; [.363A.0020.0002.1230D] # CUNEIFORM SIGN U U U
+1230E ; [.363B.0020.0002.1230E] # CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR
+1230F ; [.363C.0020.0002.1230F] # CUNEIFORM SIGN U OVER U SUR OVER SUR
+12310 ; [.363D.0020.0002.12310] # CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED
+12311 ; [.363E.0020.0002.12311] # CUNEIFORM SIGN U2
+12312 ; [.363F.0020.0002.12312] # CUNEIFORM SIGN UB
+12313 ; [.3640.0020.0002.12313] # CUNEIFORM SIGN UD
+12314 ; [.3641.0020.0002.12314] # CUNEIFORM SIGN UD KUSHU2
+12315 ; [.3642.0020.0002.12315] # CUNEIFORM SIGN UD TIMES BAD
+12316 ; [.3643.0020.0002.12316] # CUNEIFORM SIGN UD TIMES MI
+12317 ; [.3644.0020.0002.12317] # CUNEIFORM SIGN UD TIMES U PLUS U PLUS U
+12318 ; [.3645.0020.0002.12318] # CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU
+12319 ; [.3646.0020.0002.12319] # CUNEIFORM SIGN UD GUNU
+1231A ; [.3647.0020.0002.1231A] # CUNEIFORM SIGN UD SHESHIG
+1231B ; [.3648.0020.0002.1231B] # CUNEIFORM SIGN UD SHESHIG TIMES BAD
+1231C ; [.3649.0020.0002.1231C] # CUNEIFORM SIGN UDUG
+1231D ; [.364A.0020.0002.1231D] # CUNEIFORM SIGN UM
+1231E ; [.364B.0020.0002.1231E] # CUNEIFORM SIGN UM TIMES LAGAB
+1231F ; [.364C.0020.0002.1231F] # CUNEIFORM SIGN UM TIMES ME PLUS DA
+12320 ; [.364D.0020.0002.12320] # CUNEIFORM SIGN UM TIMES SHA3
+12321 ; [.364E.0020.0002.12321] # CUNEIFORM SIGN UM TIMES U
+12322 ; [.364F.0020.0002.12322] # CUNEIFORM SIGN UMBIN
+12323 ; [.3650.0020.0002.12323] # CUNEIFORM SIGN UMUM
+12324 ; [.3651.0020.0002.12324] # CUNEIFORM SIGN UMUM TIMES KASKAL
+12325 ; [.3652.0020.0002.12325] # CUNEIFORM SIGN UMUM TIMES PA
+12326 ; [.3653.0020.0002.12326] # CUNEIFORM SIGN UN
+12327 ; [.3654.0020.0002.12327] # CUNEIFORM SIGN UN GUNU
+12328 ; [.3655.0020.0002.12328] # CUNEIFORM SIGN UR
+12329 ; [.3656.0020.0002.12329] # CUNEIFORM SIGN UR CROSSING UR
+1232A ; [.3657.0020.0002.1232A] # CUNEIFORM SIGN UR SHESHIG
+1232B ; [.3658.0020.0002.1232B] # CUNEIFORM SIGN UR2
+1232C ; [.3659.0020.0002.1232C] # CUNEIFORM SIGN UR2 TIMES A PLUS HA
+1232D ; [.365A.0020.0002.1232D] # CUNEIFORM SIGN UR2 TIMES A PLUS NA
+1232E ; [.365B.0020.0002.1232E] # CUNEIFORM SIGN UR2 TIMES AL
+1232F ; [.365C.0020.0002.1232F] # CUNEIFORM SIGN UR2 TIMES HA
+12330 ; [.365D.0020.0002.12330] # CUNEIFORM SIGN UR2 TIMES NUN
+12331 ; [.365E.0020.0002.12331] # CUNEIFORM SIGN UR2 TIMES U2
+12332 ; [.365F.0020.0002.12332] # CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH
+12333 ; [.3660.0020.0002.12333] # CUNEIFORM SIGN UR2 TIMES U2 PLUS BI
+12334 ; [.3661.0020.0002.12334] # CUNEIFORM SIGN UR4
+12335 ; [.3662.0020.0002.12335] # CUNEIFORM SIGN URI
+12336 ; [.3663.0020.0002.12336] # CUNEIFORM SIGN URI3
+12337 ; [.3664.0020.0002.12337] # CUNEIFORM SIGN URU
+12338 ; [.3665.0020.0002.12338] # CUNEIFORM SIGN URU TIMES A
+12339 ; [.3666.0020.0002.12339] # CUNEIFORM SIGN URU TIMES ASHGAB
+1233A ; [.3667.0020.0002.1233A] # CUNEIFORM SIGN URU TIMES BAR
+1233B ; [.3668.0020.0002.1233B] # CUNEIFORM SIGN URU TIMES DUN
+1233C ; [.3669.0020.0002.1233C] # CUNEIFORM SIGN URU TIMES GA
+1233D ; [.366A.0020.0002.1233D] # CUNEIFORM SIGN URU TIMES GAL
+1233E ; [.366B.0020.0002.1233E] # CUNEIFORM SIGN URU TIMES GAN2 TENU
+1233F ; [.366C.0020.0002.1233F] # CUNEIFORM SIGN URU TIMES GAR
+12340 ; [.366D.0020.0002.12340] # CUNEIFORM SIGN URU TIMES GU
+12341 ; [.366E.0020.0002.12341] # CUNEIFORM SIGN URU TIMES HA
+12342 ; [.366F.0020.0002.12342] # CUNEIFORM SIGN URU TIMES IGI
+12343 ; [.3670.0020.0002.12343] # CUNEIFORM SIGN URU TIMES IM
+12344 ; [.3671.0020.0002.12344] # CUNEIFORM SIGN URU TIMES ISH
+12345 ; [.3672.0020.0002.12345] # CUNEIFORM SIGN URU TIMES KI
+12346 ; [.3673.0020.0002.12346] # CUNEIFORM SIGN URU TIMES LUM
+12347 ; [.3674.0020.0002.12347] # CUNEIFORM SIGN URU TIMES MIN
+12348 ; [.3675.0020.0002.12348] # CUNEIFORM SIGN URU TIMES PA
+12349 ; [.3676.0020.0002.12349] # CUNEIFORM SIGN URU TIMES SHE
+1234A ; [.3677.0020.0002.1234A] # CUNEIFORM SIGN URU TIMES SIG4
+1234B ; [.3678.0020.0002.1234B] # CUNEIFORM SIGN URU TIMES TU
+1234C ; [.3679.0020.0002.1234C] # CUNEIFORM SIGN URU TIMES U PLUS GUD
+1234D ; [.367A.0020.0002.1234D] # CUNEIFORM SIGN URU TIMES UD
+1234E ; [.367B.0020.0002.1234E] # CUNEIFORM SIGN URU TIMES URUDA
+1234F ; [.367C.0020.0002.1234F] # CUNEIFORM SIGN URUDA
+12350 ; [.367D.0020.0002.12350] # CUNEIFORM SIGN URUDA TIMES U
+12351 ; [.367E.0020.0002.12351] # CUNEIFORM SIGN USH
+12352 ; [.367F.0020.0002.12352] # CUNEIFORM SIGN USH TIMES A
+12353 ; [.3680.0020.0002.12353] # CUNEIFORM SIGN USH TIMES KU
+12354 ; [.3681.0020.0002.12354] # CUNEIFORM SIGN USH TIMES KUR
+12355 ; [.3682.0020.0002.12355] # CUNEIFORM SIGN USH TIMES TAK4
+12356 ; [.3683.0020.0002.12356] # CUNEIFORM SIGN USHX
+12357 ; [.3684.0020.0002.12357] # CUNEIFORM SIGN USH2
+12358 ; [.3685.0020.0002.12358] # CUNEIFORM SIGN USHUMX
+12359 ; [.3686.0020.0002.12359] # CUNEIFORM SIGN UTUKI
+1235A ; [.3687.0020.0002.1235A] # CUNEIFORM SIGN UZ3
+1235B ; [.3688.0020.0002.1235B] # CUNEIFORM SIGN UZ3 TIMES KASKAL
+1235C ; [.3689.0020.0002.1235C] # CUNEIFORM SIGN UZU
+1235D ; [.368A.0020.0002.1235D] # CUNEIFORM SIGN ZA
+1235E ; [.368B.0020.0002.1235E] # CUNEIFORM SIGN ZA TENU
+1235F ; [.368C.0020.0002.1235F] # CUNEIFORM SIGN ZA SQUARED TIMES KUR
+12360 ; [.368D.0020.0002.12360] # CUNEIFORM SIGN ZAG
+12361 ; [.368E.0020.0002.12361] # CUNEIFORM SIGN ZAMX
+12362 ; [.368F.0020.0002.12362] # CUNEIFORM SIGN ZE2
+12363 ; [.3690.0020.0002.12363] # CUNEIFORM SIGN ZI
+12364 ; [.3691.0020.0002.12364] # CUNEIFORM SIGN ZI OVER ZI
+12365 ; [.3692.0020.0002.12365] # CUNEIFORM SIGN ZI3
+12366 ; [.3693.0020.0002.12366] # CUNEIFORM SIGN ZIB
+12367 ; [.3694.0020.0002.12367] # CUNEIFORM SIGN ZIB KABA TENU
+12368 ; [.3695.0020.0002.12368] # CUNEIFORM SIGN ZIG
+12369 ; [.3696.0020.0002.12369] # CUNEIFORM SIGN ZIZ2
+1236A ; [.3697.0020.0002.1236A] # CUNEIFORM SIGN ZU
+1236B ; [.3698.0020.0002.1236B] # CUNEIFORM SIGN ZU5
+1236C ; [.3699.0020.0002.1236C] # CUNEIFORM SIGN ZU5 TIMES A
+1236D ; [.369A.0020.0002.1236D] # CUNEIFORM SIGN ZUBUR
+1236E ; [.369B.0020.0002.1236E] # CUNEIFORM SIGN ZUM
+13000 ; [.369C.0020.0002.13000] # EGYPTIAN HIEROGLYPH A001
+13001 ; [.369D.0020.0002.13001] # EGYPTIAN HIEROGLYPH A002
+13002 ; [.369E.0020.0002.13002] # EGYPTIAN HIEROGLYPH A003
+13003 ; [.369F.0020.0002.13003] # EGYPTIAN HIEROGLYPH A004
+13004 ; [.36A0.0020.0002.13004] # EGYPTIAN HIEROGLYPH A005
+13005 ; [.36A1.0020.0002.13005] # EGYPTIAN HIEROGLYPH A005A
+13006 ; [.36A2.0020.0002.13006] # EGYPTIAN HIEROGLYPH A006
+13007 ; [.36A3.0020.0002.13007] # EGYPTIAN HIEROGLYPH A006A
+13008 ; [.36A4.0020.0002.13008] # EGYPTIAN HIEROGLYPH A006B
+13009 ; [.36A5.0020.0002.13009] # EGYPTIAN HIEROGLYPH A007
+1300A ; [.36A6.0020.0002.1300A] # EGYPTIAN HIEROGLYPH A008
+1300B ; [.36A7.0020.0002.1300B] # EGYPTIAN HIEROGLYPH A009
+1300C ; [.36A8.0020.0002.1300C] # EGYPTIAN HIEROGLYPH A010
+1300D ; [.36A9.0020.0002.1300D] # EGYPTIAN HIEROGLYPH A011
+1300E ; [.36AA.0020.0002.1300E] # EGYPTIAN HIEROGLYPH A012
+1300F ; [.36AB.0020.0002.1300F] # EGYPTIAN HIEROGLYPH A013
+13010 ; [.36AC.0020.0002.13010] # EGYPTIAN HIEROGLYPH A014
+13011 ; [.36AD.0020.0002.13011] # EGYPTIAN HIEROGLYPH A014A
+13012 ; [.36AE.0020.0002.13012] # EGYPTIAN HIEROGLYPH A015
+13013 ; [.36AF.0020.0002.13013] # EGYPTIAN HIEROGLYPH A016
+13014 ; [.36B0.0020.0002.13014] # EGYPTIAN HIEROGLYPH A017
+13015 ; [.36B1.0020.0002.13015] # EGYPTIAN HIEROGLYPH A017A
+13016 ; [.36B2.0020.0002.13016] # EGYPTIAN HIEROGLYPH A018
+13017 ; [.36B3.0020.0002.13017] # EGYPTIAN HIEROGLYPH A019
+13018 ; [.36B4.0020.0002.13018] # EGYPTIAN HIEROGLYPH A020
+13019 ; [.36B5.0020.0002.13019] # EGYPTIAN HIEROGLYPH A021
+1301A ; [.36B6.0020.0002.1301A] # EGYPTIAN HIEROGLYPH A022
+1301B ; [.36B7.0020.0002.1301B] # EGYPTIAN HIEROGLYPH A023
+1301C ; [.36B8.0020.0002.1301C] # EGYPTIAN HIEROGLYPH A024
+1301D ; [.36B9.0020.0002.1301D] # EGYPTIAN HIEROGLYPH A025
+1301E ; [.36BA.0020.0002.1301E] # EGYPTIAN HIEROGLYPH A026
+1301F ; [.36BB.0020.0002.1301F] # EGYPTIAN HIEROGLYPH A027
+13020 ; [.36BC.0020.0002.13020] # EGYPTIAN HIEROGLYPH A028
+13021 ; [.36BD.0020.0002.13021] # EGYPTIAN HIEROGLYPH A029
+13022 ; [.36BE.0020.0002.13022] # EGYPTIAN HIEROGLYPH A030
+13023 ; [.36BF.0020.0002.13023] # EGYPTIAN HIEROGLYPH A031
+13024 ; [.36C0.0020.0002.13024] # EGYPTIAN HIEROGLYPH A032
+13025 ; [.36C1.0020.0002.13025] # EGYPTIAN HIEROGLYPH A032A
+13026 ; [.36C2.0020.0002.13026] # EGYPTIAN HIEROGLYPH A033
+13027 ; [.36C3.0020.0002.13027] # EGYPTIAN HIEROGLYPH A034
+13028 ; [.36C4.0020.0002.13028] # EGYPTIAN HIEROGLYPH A035
+13029 ; [.36C5.0020.0002.13029] # EGYPTIAN HIEROGLYPH A036
+1302A ; [.36C6.0020.0002.1302A] # EGYPTIAN HIEROGLYPH A037
+1302B ; [.36C7.0020.0002.1302B] # EGYPTIAN HIEROGLYPH A038
+1302C ; [.36C8.0020.0002.1302C] # EGYPTIAN HIEROGLYPH A039
+1302D ; [.36C9.0020.0002.1302D] # EGYPTIAN HIEROGLYPH A040
+1302E ; [.36CA.0020.0002.1302E] # EGYPTIAN HIEROGLYPH A040A
+1302F ; [.36CB.0020.0002.1302F] # EGYPTIAN HIEROGLYPH A041
+13030 ; [.36CC.0020.0002.13030] # EGYPTIAN HIEROGLYPH A042
+13031 ; [.36CD.0020.0002.13031] # EGYPTIAN HIEROGLYPH A042A
+13032 ; [.36CE.0020.0002.13032] # EGYPTIAN HIEROGLYPH A043
+13033 ; [.36CF.0020.0002.13033] # EGYPTIAN HIEROGLYPH A043A
+13034 ; [.36D0.0020.0002.13034] # EGYPTIAN HIEROGLYPH A044
+13035 ; [.36D1.0020.0002.13035] # EGYPTIAN HIEROGLYPH A045
+13036 ; [.36D2.0020.0002.13036] # EGYPTIAN HIEROGLYPH A045A
+13037 ; [.36D3.0020.0002.13037] # EGYPTIAN HIEROGLYPH A046
+13038 ; [.36D4.0020.0002.13038] # EGYPTIAN HIEROGLYPH A047
+13039 ; [.36D5.0020.0002.13039] # EGYPTIAN HIEROGLYPH A048
+1303A ; [.36D6.0020.0002.1303A] # EGYPTIAN HIEROGLYPH A049
+1303B ; [.36D7.0020.0002.1303B] # EGYPTIAN HIEROGLYPH A050
+1303C ; [.36D8.0020.0002.1303C] # EGYPTIAN HIEROGLYPH A051
+1303D ; [.36D9.0020.0002.1303D] # EGYPTIAN HIEROGLYPH A052
+1303E ; [.36DA.0020.0002.1303E] # EGYPTIAN HIEROGLYPH A053
+1303F ; [.36DB.0020.0002.1303F] # EGYPTIAN HIEROGLYPH A054
+13040 ; [.36DC.0020.0002.13040] # EGYPTIAN HIEROGLYPH A055
+13041 ; [.36DD.0020.0002.13041] # EGYPTIAN HIEROGLYPH A056
+13042 ; [.36DE.0020.0002.13042] # EGYPTIAN HIEROGLYPH A057
+13043 ; [.36DF.0020.0002.13043] # EGYPTIAN HIEROGLYPH A058
+13044 ; [.36E0.0020.0002.13044] # EGYPTIAN HIEROGLYPH A059
+13045 ; [.36E1.0020.0002.13045] # EGYPTIAN HIEROGLYPH A060
+13046 ; [.36E2.0020.0002.13046] # EGYPTIAN HIEROGLYPH A061
+13047 ; [.36E3.0020.0002.13047] # EGYPTIAN HIEROGLYPH A062
+13048 ; [.36E4.0020.0002.13048] # EGYPTIAN HIEROGLYPH A063
+13049 ; [.36E5.0020.0002.13049] # EGYPTIAN HIEROGLYPH A064
+1304A ; [.36E6.0020.0002.1304A] # EGYPTIAN HIEROGLYPH A065
+1304B ; [.36E7.0020.0002.1304B] # EGYPTIAN HIEROGLYPH A066
+1304C ; [.36E8.0020.0002.1304C] # EGYPTIAN HIEROGLYPH A067
+1304D ; [.36E9.0020.0002.1304D] # EGYPTIAN HIEROGLYPH A068
+1304E ; [.36EA.0020.0002.1304E] # EGYPTIAN HIEROGLYPH A069
+1304F ; [.36EB.0020.0002.1304F] # EGYPTIAN HIEROGLYPH A070
+13050 ; [.36EC.0020.0002.13050] # EGYPTIAN HIEROGLYPH B001
+13051 ; [.36ED.0020.0002.13051] # EGYPTIAN HIEROGLYPH B002
+13052 ; [.36EE.0020.0002.13052] # EGYPTIAN HIEROGLYPH B003
+13053 ; [.36EF.0020.0002.13053] # EGYPTIAN HIEROGLYPH B004
+13054 ; [.36F0.0020.0002.13054] # EGYPTIAN HIEROGLYPH B005
+13055 ; [.36F1.0020.0002.13055] # EGYPTIAN HIEROGLYPH B005A
+13056 ; [.36F2.0020.0002.13056] # EGYPTIAN HIEROGLYPH B006
+13057 ; [.36F3.0020.0002.13057] # EGYPTIAN HIEROGLYPH B007
+13058 ; [.36F4.0020.0002.13058] # EGYPTIAN HIEROGLYPH B008
+13059 ; [.36F5.0020.0002.13059] # EGYPTIAN HIEROGLYPH B009
+1305A ; [.36F6.0020.0002.1305A] # EGYPTIAN HIEROGLYPH C001
+1305B ; [.36F7.0020.0002.1305B] # EGYPTIAN HIEROGLYPH C002
+1305C ; [.36F8.0020.0002.1305C] # EGYPTIAN HIEROGLYPH C002A
+1305D ; [.36F9.0020.0002.1305D] # EGYPTIAN HIEROGLYPH C002B
+1305E ; [.36FA.0020.0002.1305E] # EGYPTIAN HIEROGLYPH C002C
+1305F ; [.36FB.0020.0002.1305F] # EGYPTIAN HIEROGLYPH C003
+13060 ; [.36FC.0020.0002.13060] # EGYPTIAN HIEROGLYPH C004
+13061 ; [.36FD.0020.0002.13061] # EGYPTIAN HIEROGLYPH C005
+13062 ; [.36FE.0020.0002.13062] # EGYPTIAN HIEROGLYPH C006
+13063 ; [.36FF.0020.0002.13063] # EGYPTIAN HIEROGLYPH C007
+13064 ; [.3700.0020.0002.13064] # EGYPTIAN HIEROGLYPH C008
+13065 ; [.3701.0020.0002.13065] # EGYPTIAN HIEROGLYPH C009
+13066 ; [.3702.0020.0002.13066] # EGYPTIAN HIEROGLYPH C010
+13067 ; [.3703.0020.0002.13067] # EGYPTIAN HIEROGLYPH C010A
+13068 ; [.3704.0020.0002.13068] # EGYPTIAN HIEROGLYPH C011
+13069 ; [.3705.0020.0002.13069] # EGYPTIAN HIEROGLYPH C012
+1306A ; [.3706.0020.0002.1306A] # EGYPTIAN HIEROGLYPH C013
+1306B ; [.3707.0020.0002.1306B] # EGYPTIAN HIEROGLYPH C014
+1306C ; [.3708.0020.0002.1306C] # EGYPTIAN HIEROGLYPH C015
+1306D ; [.3709.0020.0002.1306D] # EGYPTIAN HIEROGLYPH C016
+1306E ; [.370A.0020.0002.1306E] # EGYPTIAN HIEROGLYPH C017
+1306F ; [.370B.0020.0002.1306F] # EGYPTIAN HIEROGLYPH C018
+13070 ; [.370C.0020.0002.13070] # EGYPTIAN HIEROGLYPH C019
+13071 ; [.370D.0020.0002.13071] # EGYPTIAN HIEROGLYPH C020
+13072 ; [.370E.0020.0002.13072] # EGYPTIAN HIEROGLYPH C021
+13073 ; [.370F.0020.0002.13073] # EGYPTIAN HIEROGLYPH C022
+13074 ; [.3710.0020.0002.13074] # EGYPTIAN HIEROGLYPH C023
+13075 ; [.3711.0020.0002.13075] # EGYPTIAN HIEROGLYPH C024
+13076 ; [.3712.0020.0002.13076] # EGYPTIAN HIEROGLYPH D001
+13077 ; [.3713.0020.0002.13077] # EGYPTIAN HIEROGLYPH D002
+13078 ; [.3714.0020.0002.13078] # EGYPTIAN HIEROGLYPH D003
+13079 ; [.3715.0020.0002.13079] # EGYPTIAN HIEROGLYPH D004
+1307A ; [.3716.0020.0002.1307A] # EGYPTIAN HIEROGLYPH D005
+1307B ; [.3717.0020.0002.1307B] # EGYPTIAN HIEROGLYPH D006
+1307C ; [.3718.0020.0002.1307C] # EGYPTIAN HIEROGLYPH D007
+1307D ; [.3719.0020.0002.1307D] # EGYPTIAN HIEROGLYPH D008
+1307E ; [.371A.0020.0002.1307E] # EGYPTIAN HIEROGLYPH D008A
+1307F ; [.371B.0020.0002.1307F] # EGYPTIAN HIEROGLYPH D009
+13080 ; [.371C.0020.0002.13080] # EGYPTIAN HIEROGLYPH D010
+13081 ; [.371D.0020.0002.13081] # EGYPTIAN HIEROGLYPH D011
+13082 ; [.371E.0020.0002.13082] # EGYPTIAN HIEROGLYPH D012
+13083 ; [.371F.0020.0002.13083] # EGYPTIAN HIEROGLYPH D013
+13084 ; [.3720.0020.0002.13084] # EGYPTIAN HIEROGLYPH D014
+13085 ; [.3721.0020.0002.13085] # EGYPTIAN HIEROGLYPH D015
+13086 ; [.3722.0020.0002.13086] # EGYPTIAN HIEROGLYPH D016
+13087 ; [.3723.0020.0002.13087] # EGYPTIAN HIEROGLYPH D017
+13088 ; [.3724.0020.0002.13088] # EGYPTIAN HIEROGLYPH D018
+13089 ; [.3725.0020.0002.13089] # EGYPTIAN HIEROGLYPH D019
+1308A ; [.3726.0020.0002.1308A] # EGYPTIAN HIEROGLYPH D020
+1308B ; [.3727.0020.0002.1308B] # EGYPTIAN HIEROGLYPH D021
+1308C ; [.3728.0020.0002.1308C] # EGYPTIAN HIEROGLYPH D022
+1308D ; [.3729.0020.0002.1308D] # EGYPTIAN HIEROGLYPH D023
+1308E ; [.372A.0020.0002.1308E] # EGYPTIAN HIEROGLYPH D024
+1308F ; [.372B.0020.0002.1308F] # EGYPTIAN HIEROGLYPH D025
+13090 ; [.372C.0020.0002.13090] # EGYPTIAN HIEROGLYPH D026
+13091 ; [.372D.0020.0002.13091] # EGYPTIAN HIEROGLYPH D027
+13092 ; [.372E.0020.0002.13092] # EGYPTIAN HIEROGLYPH D027A
+13093 ; [.372F.0020.0002.13093] # EGYPTIAN HIEROGLYPH D028
+13094 ; [.3730.0020.0002.13094] # EGYPTIAN HIEROGLYPH D029
+13095 ; [.3731.0020.0002.13095] # EGYPTIAN HIEROGLYPH D030
+13096 ; [.3732.0020.0002.13096] # EGYPTIAN HIEROGLYPH D031
+13097 ; [.3733.0020.0002.13097] # EGYPTIAN HIEROGLYPH D031A
+13098 ; [.3734.0020.0002.13098] # EGYPTIAN HIEROGLYPH D032
+13099 ; [.3735.0020.0002.13099] # EGYPTIAN HIEROGLYPH D033
+1309A ; [.3736.0020.0002.1309A] # EGYPTIAN HIEROGLYPH D034
+1309B ; [.3737.0020.0002.1309B] # EGYPTIAN HIEROGLYPH D034A
+1309C ; [.3738.0020.0002.1309C] # EGYPTIAN HIEROGLYPH D035
+1309D ; [.3739.0020.0002.1309D] # EGYPTIAN HIEROGLYPH D036
+1309E ; [.373A.0020.0002.1309E] # EGYPTIAN HIEROGLYPH D037
+1309F ; [.373B.0020.0002.1309F] # EGYPTIAN HIEROGLYPH D038
+130A0 ; [.373C.0020.0002.130A0] # EGYPTIAN HIEROGLYPH D039
+130A1 ; [.373D.0020.0002.130A1] # EGYPTIAN HIEROGLYPH D040
+130A2 ; [.373E.0020.0002.130A2] # EGYPTIAN HIEROGLYPH D041
+130A3 ; [.373F.0020.0002.130A3] # EGYPTIAN HIEROGLYPH D042
+130A4 ; [.3740.0020.0002.130A4] # EGYPTIAN HIEROGLYPH D043
+130A5 ; [.3741.0020.0002.130A5] # EGYPTIAN HIEROGLYPH D044
+130A6 ; [.3742.0020.0002.130A6] # EGYPTIAN HIEROGLYPH D045
+130A7 ; [.3743.0020.0002.130A7] # EGYPTIAN HIEROGLYPH D046
+130A8 ; [.3744.0020.0002.130A8] # EGYPTIAN HIEROGLYPH D046A
+130A9 ; [.3745.0020.0002.130A9] # EGYPTIAN HIEROGLYPH D047
+130AA ; [.3746.0020.0002.130AA] # EGYPTIAN HIEROGLYPH D048
+130AB ; [.3747.0020.0002.130AB] # EGYPTIAN HIEROGLYPH D048A
+130AC ; [.3748.0020.0002.130AC] # EGYPTIAN HIEROGLYPH D049
+130AD ; [.3749.0020.0002.130AD] # EGYPTIAN HIEROGLYPH D050
+130AE ; [.374A.0020.0002.130AE] # EGYPTIAN HIEROGLYPH D050A
+130AF ; [.374B.0020.0002.130AF] # EGYPTIAN HIEROGLYPH D050B
+130B0 ; [.374C.0020.0002.130B0] # EGYPTIAN HIEROGLYPH D050C
+130B1 ; [.374D.0020.0002.130B1] # EGYPTIAN HIEROGLYPH D050D
+130B2 ; [.374E.0020.0002.130B2] # EGYPTIAN HIEROGLYPH D050E
+130B3 ; [.374F.0020.0002.130B3] # EGYPTIAN HIEROGLYPH D050F
+130B4 ; [.3750.0020.0002.130B4] # EGYPTIAN HIEROGLYPH D050G
+130B5 ; [.3751.0020.0002.130B5] # EGYPTIAN HIEROGLYPH D050H
+130B6 ; [.3752.0020.0002.130B6] # EGYPTIAN HIEROGLYPH D050I
+130B7 ; [.3753.0020.0002.130B7] # EGYPTIAN HIEROGLYPH D051
+130B8 ; [.3754.0020.0002.130B8] # EGYPTIAN HIEROGLYPH D052
+130B9 ; [.3755.0020.0002.130B9] # EGYPTIAN HIEROGLYPH D052A
+130BA ; [.3756.0020.0002.130BA] # EGYPTIAN HIEROGLYPH D053
+130BB ; [.3757.0020.0002.130BB] # EGYPTIAN HIEROGLYPH D054
+130BC ; [.3758.0020.0002.130BC] # EGYPTIAN HIEROGLYPH D054A
+130BD ; [.3759.0020.0002.130BD] # EGYPTIAN HIEROGLYPH D055
+130BE ; [.375A.0020.0002.130BE] # EGYPTIAN HIEROGLYPH D056
+130BF ; [.375B.0020.0002.130BF] # EGYPTIAN HIEROGLYPH D057
+130C0 ; [.375C.0020.0002.130C0] # EGYPTIAN HIEROGLYPH D058
+130C1 ; [.375D.0020.0002.130C1] # EGYPTIAN HIEROGLYPH D059
+130C2 ; [.375E.0020.0002.130C2] # EGYPTIAN HIEROGLYPH D060
+130C3 ; [.375F.0020.0002.130C3] # EGYPTIAN HIEROGLYPH D061
+130C4 ; [.3760.0020.0002.130C4] # EGYPTIAN HIEROGLYPH D062
+130C5 ; [.3761.0020.0002.130C5] # EGYPTIAN HIEROGLYPH D063
+130C6 ; [.3762.0020.0002.130C6] # EGYPTIAN HIEROGLYPH D064
+130C7 ; [.3763.0020.0002.130C7] # EGYPTIAN HIEROGLYPH D065
+130C8 ; [.3764.0020.0002.130C8] # EGYPTIAN HIEROGLYPH D066
+130C9 ; [.3765.0020.0002.130C9] # EGYPTIAN HIEROGLYPH D067
+130CA ; [.3766.0020.0002.130CA] # EGYPTIAN HIEROGLYPH D067A
+130CB ; [.3767.0020.0002.130CB] # EGYPTIAN HIEROGLYPH D067B
+130CC ; [.3768.0020.0002.130CC] # EGYPTIAN HIEROGLYPH D067C
+130CD ; [.3769.0020.0002.130CD] # EGYPTIAN HIEROGLYPH D067D
+130CE ; [.376A.0020.0002.130CE] # EGYPTIAN HIEROGLYPH D067E
+130CF ; [.376B.0020.0002.130CF] # EGYPTIAN HIEROGLYPH D067F
+130D0 ; [.376C.0020.0002.130D0] # EGYPTIAN HIEROGLYPH D067G
+130D1 ; [.376D.0020.0002.130D1] # EGYPTIAN HIEROGLYPH D067H
+130D2 ; [.376E.0020.0002.130D2] # EGYPTIAN HIEROGLYPH E001
+130D3 ; [.376F.0020.0002.130D3] # EGYPTIAN HIEROGLYPH E002
+130D4 ; [.3770.0020.0002.130D4] # EGYPTIAN HIEROGLYPH E003
+130D5 ; [.3771.0020.0002.130D5] # EGYPTIAN HIEROGLYPH E004
+130D6 ; [.3772.0020.0002.130D6] # EGYPTIAN HIEROGLYPH E005
+130D7 ; [.3773.0020.0002.130D7] # EGYPTIAN HIEROGLYPH E006
+130D8 ; [.3774.0020.0002.130D8] # EGYPTIAN HIEROGLYPH E007
+130D9 ; [.3775.0020.0002.130D9] # EGYPTIAN HIEROGLYPH E008
+130DA ; [.3776.0020.0002.130DA] # EGYPTIAN HIEROGLYPH E008A
+130DB ; [.3777.0020.0002.130DB] # EGYPTIAN HIEROGLYPH E009
+130DC ; [.3778.0020.0002.130DC] # EGYPTIAN HIEROGLYPH E009A
+130DD ; [.3779.0020.0002.130DD] # EGYPTIAN HIEROGLYPH E010
+130DE ; [.377A.0020.0002.130DE] # EGYPTIAN HIEROGLYPH E011
+130DF ; [.377B.0020.0002.130DF] # EGYPTIAN HIEROGLYPH E012
+130E0 ; [.377C.0020.0002.130E0] # EGYPTIAN HIEROGLYPH E013
+130E1 ; [.377D.0020.0002.130E1] # EGYPTIAN HIEROGLYPH E014
+130E2 ; [.377E.0020.0002.130E2] # EGYPTIAN HIEROGLYPH E015
+130E3 ; [.377F.0020.0002.130E3] # EGYPTIAN HIEROGLYPH E016
+130E4 ; [.3780.0020.0002.130E4] # EGYPTIAN HIEROGLYPH E016A
+130E5 ; [.3781.0020.0002.130E5] # EGYPTIAN HIEROGLYPH E017
+130E6 ; [.3782.0020.0002.130E6] # EGYPTIAN HIEROGLYPH E017A
+130E7 ; [.3783.0020.0002.130E7] # EGYPTIAN HIEROGLYPH E018
+130E8 ; [.3784.0020.0002.130E8] # EGYPTIAN HIEROGLYPH E019
+130E9 ; [.3785.0020.0002.130E9] # EGYPTIAN HIEROGLYPH E020
+130EA ; [.3786.0020.0002.130EA] # EGYPTIAN HIEROGLYPH E020A
+130EB ; [.3787.0020.0002.130EB] # EGYPTIAN HIEROGLYPH E021
+130EC ; [.3788.0020.0002.130EC] # EGYPTIAN HIEROGLYPH E022
+130ED ; [.3789.0020.0002.130ED] # EGYPTIAN HIEROGLYPH E023
+130EE ; [.378A.0020.0002.130EE] # EGYPTIAN HIEROGLYPH E024
+130EF ; [.378B.0020.0002.130EF] # EGYPTIAN HIEROGLYPH E025
+130F0 ; [.378C.0020.0002.130F0] # EGYPTIAN HIEROGLYPH E026
+130F1 ; [.378D.0020.0002.130F1] # EGYPTIAN HIEROGLYPH E027
+130F2 ; [.378E.0020.0002.130F2] # EGYPTIAN HIEROGLYPH E028
+130F3 ; [.378F.0020.0002.130F3] # EGYPTIAN HIEROGLYPH E028A
+130F4 ; [.3790.0020.0002.130F4] # EGYPTIAN HIEROGLYPH E029
+130F5 ; [.3791.0020.0002.130F5] # EGYPTIAN HIEROGLYPH E030
+130F6 ; [.3792.0020.0002.130F6] # EGYPTIAN HIEROGLYPH E031
+130F7 ; [.3793.0020.0002.130F7] # EGYPTIAN HIEROGLYPH E032
+130F8 ; [.3794.0020.0002.130F8] # EGYPTIAN HIEROGLYPH E033
+130F9 ; [.3795.0020.0002.130F9] # EGYPTIAN HIEROGLYPH E034
+130FA ; [.3796.0020.0002.130FA] # EGYPTIAN HIEROGLYPH E034A
+130FB ; [.3797.0020.0002.130FB] # EGYPTIAN HIEROGLYPH E036
+130FC ; [.3798.0020.0002.130FC] # EGYPTIAN HIEROGLYPH E037
+130FD ; [.3799.0020.0002.130FD] # EGYPTIAN HIEROGLYPH E038
+130FE ; [.379A.0020.0002.130FE] # EGYPTIAN HIEROGLYPH F001
+130FF ; [.379B.0020.0002.130FF] # EGYPTIAN HIEROGLYPH F001A
+13100 ; [.379C.0020.0002.13100] # EGYPTIAN HIEROGLYPH F002
+13101 ; [.379D.0020.0002.13101] # EGYPTIAN HIEROGLYPH F003
+13102 ; [.379E.0020.0002.13102] # EGYPTIAN HIEROGLYPH F004
+13103 ; [.379F.0020.0002.13103] # EGYPTIAN HIEROGLYPH F005
+13104 ; [.37A0.0020.0002.13104] # EGYPTIAN HIEROGLYPH F006
+13105 ; [.37A1.0020.0002.13105] # EGYPTIAN HIEROGLYPH F007
+13106 ; [.37A2.0020.0002.13106] # EGYPTIAN HIEROGLYPH F008
+13107 ; [.37A3.0020.0002.13107] # EGYPTIAN HIEROGLYPH F009
+13108 ; [.37A4.0020.0002.13108] # EGYPTIAN HIEROGLYPH F010
+13109 ; [.37A5.0020.0002.13109] # EGYPTIAN HIEROGLYPH F011
+1310A ; [.37A6.0020.0002.1310A] # EGYPTIAN HIEROGLYPH F012
+1310B ; [.37A7.0020.0002.1310B] # EGYPTIAN HIEROGLYPH F013
+1310C ; [.37A8.0020.0002.1310C] # EGYPTIAN HIEROGLYPH F013A
+1310D ; [.37A9.0020.0002.1310D] # EGYPTIAN HIEROGLYPH F014
+1310E ; [.37AA.0020.0002.1310E] # EGYPTIAN HIEROGLYPH F015
+1310F ; [.37AB.0020.0002.1310F] # EGYPTIAN HIEROGLYPH F016
+13110 ; [.37AC.0020.0002.13110] # EGYPTIAN HIEROGLYPH F017
+13111 ; [.37AD.0020.0002.13111] # EGYPTIAN HIEROGLYPH F018
+13112 ; [.37AE.0020.0002.13112] # EGYPTIAN HIEROGLYPH F019
+13113 ; [.37AF.0020.0002.13113] # EGYPTIAN HIEROGLYPH F020
+13114 ; [.37B0.0020.0002.13114] # EGYPTIAN HIEROGLYPH F021
+13115 ; [.37B1.0020.0002.13115] # EGYPTIAN HIEROGLYPH F021A
+13116 ; [.37B2.0020.0002.13116] # EGYPTIAN HIEROGLYPH F022
+13117 ; [.37B3.0020.0002.13117] # EGYPTIAN HIEROGLYPH F023
+13118 ; [.37B4.0020.0002.13118] # EGYPTIAN HIEROGLYPH F024
+13119 ; [.37B5.0020.0002.13119] # EGYPTIAN HIEROGLYPH F025
+1311A ; [.37B6.0020.0002.1311A] # EGYPTIAN HIEROGLYPH F026
+1311B ; [.37B7.0020.0002.1311B] # EGYPTIAN HIEROGLYPH F027
+1311C ; [.37B8.0020.0002.1311C] # EGYPTIAN HIEROGLYPH F028
+1311D ; [.37B9.0020.0002.1311D] # EGYPTIAN HIEROGLYPH F029
+1311E ; [.37BA.0020.0002.1311E] # EGYPTIAN HIEROGLYPH F030
+1311F ; [.37BB.0020.0002.1311F] # EGYPTIAN HIEROGLYPH F031
+13120 ; [.37BC.0020.0002.13120] # EGYPTIAN HIEROGLYPH F031A
+13121 ; [.37BD.0020.0002.13121] # EGYPTIAN HIEROGLYPH F032
+13122 ; [.37BE.0020.0002.13122] # EGYPTIAN HIEROGLYPH F033
+13123 ; [.37BF.0020.0002.13123] # EGYPTIAN HIEROGLYPH F034
+13124 ; [.37C0.0020.0002.13124] # EGYPTIAN HIEROGLYPH F035
+13125 ; [.37C1.0020.0002.13125] # EGYPTIAN HIEROGLYPH F036
+13126 ; [.37C2.0020.0002.13126] # EGYPTIAN HIEROGLYPH F037
+13127 ; [.37C3.0020.0002.13127] # EGYPTIAN HIEROGLYPH F037A
+13128 ; [.37C4.0020.0002.13128] # EGYPTIAN HIEROGLYPH F038
+13129 ; [.37C5.0020.0002.13129] # EGYPTIAN HIEROGLYPH F038A
+1312A ; [.37C6.0020.0002.1312A] # EGYPTIAN HIEROGLYPH F039
+1312B ; [.37C7.0020.0002.1312B] # EGYPTIAN HIEROGLYPH F040
+1312C ; [.37C8.0020.0002.1312C] # EGYPTIAN HIEROGLYPH F041
+1312D ; [.37C9.0020.0002.1312D] # EGYPTIAN HIEROGLYPH F042
+1312E ; [.37CA.0020.0002.1312E] # EGYPTIAN HIEROGLYPH F043
+1312F ; [.37CB.0020.0002.1312F] # EGYPTIAN HIEROGLYPH F044
+13130 ; [.37CC.0020.0002.13130] # EGYPTIAN HIEROGLYPH F045
+13131 ; [.37CD.0020.0002.13131] # EGYPTIAN HIEROGLYPH F045A
+13132 ; [.37CE.0020.0002.13132] # EGYPTIAN HIEROGLYPH F046
+13133 ; [.37CF.0020.0002.13133] # EGYPTIAN HIEROGLYPH F046A
+13134 ; [.37D0.0020.0002.13134] # EGYPTIAN HIEROGLYPH F047
+13135 ; [.37D1.0020.0002.13135] # EGYPTIAN HIEROGLYPH F047A
+13136 ; [.37D2.0020.0002.13136] # EGYPTIAN HIEROGLYPH F048
+13137 ; [.37D3.0020.0002.13137] # EGYPTIAN HIEROGLYPH F049
+13138 ; [.37D4.0020.0002.13138] # EGYPTIAN HIEROGLYPH F050
+13139 ; [.37D5.0020.0002.13139] # EGYPTIAN HIEROGLYPH F051
+1313A ; [.37D6.0020.0002.1313A] # EGYPTIAN HIEROGLYPH F051A
+1313B ; [.37D7.0020.0002.1313B] # EGYPTIAN HIEROGLYPH F051B
+1313C ; [.37D8.0020.0002.1313C] # EGYPTIAN HIEROGLYPH F051C
+1313D ; [.37D9.0020.0002.1313D] # EGYPTIAN HIEROGLYPH F052
+1313E ; [.37DA.0020.0002.1313E] # EGYPTIAN HIEROGLYPH F053
+1313F ; [.37DB.0020.0002.1313F] # EGYPTIAN HIEROGLYPH G001
+13140 ; [.37DC.0020.0002.13140] # EGYPTIAN HIEROGLYPH G002
+13141 ; [.37DD.0020.0002.13141] # EGYPTIAN HIEROGLYPH G003
+13142 ; [.37DE.0020.0002.13142] # EGYPTIAN HIEROGLYPH G004
+13143 ; [.37DF.0020.0002.13143] # EGYPTIAN HIEROGLYPH G005
+13144 ; [.37E0.0020.0002.13144] # EGYPTIAN HIEROGLYPH G006
+13145 ; [.37E1.0020.0002.13145] # EGYPTIAN HIEROGLYPH G006A
+13146 ; [.37E2.0020.0002.13146] # EGYPTIAN HIEROGLYPH G007
+13147 ; [.37E3.0020.0002.13147] # EGYPTIAN HIEROGLYPH G007A
+13148 ; [.37E4.0020.0002.13148] # EGYPTIAN HIEROGLYPH G007B
+13149 ; [.37E5.0020.0002.13149] # EGYPTIAN HIEROGLYPH G008
+1314A ; [.37E6.0020.0002.1314A] # EGYPTIAN HIEROGLYPH G009
+1314B ; [.37E7.0020.0002.1314B] # EGYPTIAN HIEROGLYPH G010
+1314C ; [.37E8.0020.0002.1314C] # EGYPTIAN HIEROGLYPH G011
+1314D ; [.37E9.0020.0002.1314D] # EGYPTIAN HIEROGLYPH G011A
+1314E ; [.37EA.0020.0002.1314E] # EGYPTIAN HIEROGLYPH G012
+1314F ; [.37EB.0020.0002.1314F] # EGYPTIAN HIEROGLYPH G013
+13150 ; [.37EC.0020.0002.13150] # EGYPTIAN HIEROGLYPH G014
+13151 ; [.37ED.0020.0002.13151] # EGYPTIAN HIEROGLYPH G015
+13152 ; [.37EE.0020.0002.13152] # EGYPTIAN HIEROGLYPH G016
+13153 ; [.37EF.0020.0002.13153] # EGYPTIAN HIEROGLYPH G017
+13154 ; [.37F0.0020.0002.13154] # EGYPTIAN HIEROGLYPH G018
+13155 ; [.37F1.0020.0002.13155] # EGYPTIAN HIEROGLYPH G019
+13156 ; [.37F2.0020.0002.13156] # EGYPTIAN HIEROGLYPH G020
+13157 ; [.37F3.0020.0002.13157] # EGYPTIAN HIEROGLYPH G020A
+13158 ; [.37F4.0020.0002.13158] # EGYPTIAN HIEROGLYPH G021
+13159 ; [.37F5.0020.0002.13159] # EGYPTIAN HIEROGLYPH G022
+1315A ; [.37F6.0020.0002.1315A] # EGYPTIAN HIEROGLYPH G023
+1315B ; [.37F7.0020.0002.1315B] # EGYPTIAN HIEROGLYPH G024
+1315C ; [.37F8.0020.0002.1315C] # EGYPTIAN HIEROGLYPH G025
+1315D ; [.37F9.0020.0002.1315D] # EGYPTIAN HIEROGLYPH G026
+1315E ; [.37FA.0020.0002.1315E] # EGYPTIAN HIEROGLYPH G026A
+1315F ; [.37FB.0020.0002.1315F] # EGYPTIAN HIEROGLYPH G027
+13160 ; [.37FC.0020.0002.13160] # EGYPTIAN HIEROGLYPH G028
+13161 ; [.37FD.0020.0002.13161] # EGYPTIAN HIEROGLYPH G029
+13162 ; [.37FE.0020.0002.13162] # EGYPTIAN HIEROGLYPH G030
+13163 ; [.37FF.0020.0002.13163] # EGYPTIAN HIEROGLYPH G031
+13164 ; [.3800.0020.0002.13164] # EGYPTIAN HIEROGLYPH G032
+13165 ; [.3801.0020.0002.13165] # EGYPTIAN HIEROGLYPH G033
+13166 ; [.3802.0020.0002.13166] # EGYPTIAN HIEROGLYPH G034
+13167 ; [.3803.0020.0002.13167] # EGYPTIAN HIEROGLYPH G035
+13168 ; [.3804.0020.0002.13168] # EGYPTIAN HIEROGLYPH G036
+13169 ; [.3805.0020.0002.13169] # EGYPTIAN HIEROGLYPH G036A
+1316A ; [.3806.0020.0002.1316A] # EGYPTIAN HIEROGLYPH G037
+1316B ; [.3807.0020.0002.1316B] # EGYPTIAN HIEROGLYPH G037A
+1316C ; [.3808.0020.0002.1316C] # EGYPTIAN HIEROGLYPH G038
+1316D ; [.3809.0020.0002.1316D] # EGYPTIAN HIEROGLYPH G039
+1316E ; [.380A.0020.0002.1316E] # EGYPTIAN HIEROGLYPH G040
+1316F ; [.380B.0020.0002.1316F] # EGYPTIAN HIEROGLYPH G041
+13170 ; [.380C.0020.0002.13170] # EGYPTIAN HIEROGLYPH G042
+13171 ; [.380D.0020.0002.13171] # EGYPTIAN HIEROGLYPH G043
+13172 ; [.380E.0020.0002.13172] # EGYPTIAN HIEROGLYPH G043A
+13173 ; [.380F.0020.0002.13173] # EGYPTIAN HIEROGLYPH G044
+13174 ; [.3810.0020.0002.13174] # EGYPTIAN HIEROGLYPH G045
+13175 ; [.3811.0020.0002.13175] # EGYPTIAN HIEROGLYPH G045A
+13176 ; [.3812.0020.0002.13176] # EGYPTIAN HIEROGLYPH G046
+13177 ; [.3813.0020.0002.13177] # EGYPTIAN HIEROGLYPH G047
+13178 ; [.3814.0020.0002.13178] # EGYPTIAN HIEROGLYPH G048
+13179 ; [.3815.0020.0002.13179] # EGYPTIAN HIEROGLYPH G049
+1317A ; [.3816.0020.0002.1317A] # EGYPTIAN HIEROGLYPH G050
+1317B ; [.3817.0020.0002.1317B] # EGYPTIAN HIEROGLYPH G051
+1317C ; [.3818.0020.0002.1317C] # EGYPTIAN HIEROGLYPH G052
+1317D ; [.3819.0020.0002.1317D] # EGYPTIAN HIEROGLYPH G053
+1317E ; [.381A.0020.0002.1317E] # EGYPTIAN HIEROGLYPH G054
+1317F ; [.381B.0020.0002.1317F] # EGYPTIAN HIEROGLYPH H001
+13180 ; [.381C.0020.0002.13180] # EGYPTIAN HIEROGLYPH H002
+13181 ; [.381D.0020.0002.13181] # EGYPTIAN HIEROGLYPH H003
+13182 ; [.381E.0020.0002.13182] # EGYPTIAN HIEROGLYPH H004
+13183 ; [.381F.0020.0002.13183] # EGYPTIAN HIEROGLYPH H005
+13184 ; [.3820.0020.0002.13184] # EGYPTIAN HIEROGLYPH H006
+13185 ; [.3821.0020.0002.13185] # EGYPTIAN HIEROGLYPH H006A
+13186 ; [.3822.0020.0002.13186] # EGYPTIAN HIEROGLYPH H007
+13187 ; [.3823.0020.0002.13187] # EGYPTIAN HIEROGLYPH H008
+13188 ; [.3824.0020.0002.13188] # EGYPTIAN HIEROGLYPH I001
+13189 ; [.3825.0020.0002.13189] # EGYPTIAN HIEROGLYPH I002
+1318A ; [.3826.0020.0002.1318A] # EGYPTIAN HIEROGLYPH I003
+1318B ; [.3827.0020.0002.1318B] # EGYPTIAN HIEROGLYPH I004
+1318C ; [.3828.0020.0002.1318C] # EGYPTIAN HIEROGLYPH I005
+1318D ; [.3829.0020.0002.1318D] # EGYPTIAN HIEROGLYPH I005A
+1318E ; [.382A.0020.0002.1318E] # EGYPTIAN HIEROGLYPH I006
+1318F ; [.382B.0020.0002.1318F] # EGYPTIAN HIEROGLYPH I007
+13190 ; [.382C.0020.0002.13190] # EGYPTIAN HIEROGLYPH I008
+13191 ; [.382D.0020.0002.13191] # EGYPTIAN HIEROGLYPH I009
+13192 ; [.382E.0020.0002.13192] # EGYPTIAN HIEROGLYPH I009A
+13193 ; [.382F.0020.0002.13193] # EGYPTIAN HIEROGLYPH I010
+13194 ; [.3830.0020.0002.13194] # EGYPTIAN HIEROGLYPH I010A
+13195 ; [.3831.0020.0002.13195] # EGYPTIAN HIEROGLYPH I011
+13196 ; [.3832.0020.0002.13196] # EGYPTIAN HIEROGLYPH I011A
+13197 ; [.3833.0020.0002.13197] # EGYPTIAN HIEROGLYPH I012
+13198 ; [.3834.0020.0002.13198] # EGYPTIAN HIEROGLYPH I013
+13199 ; [.3835.0020.0002.13199] # EGYPTIAN HIEROGLYPH I014
+1319A ; [.3836.0020.0002.1319A] # EGYPTIAN HIEROGLYPH I015
+1319B ; [.3837.0020.0002.1319B] # EGYPTIAN HIEROGLYPH K001
+1319C ; [.3838.0020.0002.1319C] # EGYPTIAN HIEROGLYPH K002
+1319D ; [.3839.0020.0002.1319D] # EGYPTIAN HIEROGLYPH K003
+1319E ; [.383A.0020.0002.1319E] # EGYPTIAN HIEROGLYPH K004
+1319F ; [.383B.0020.0002.1319F] # EGYPTIAN HIEROGLYPH K005
+131A0 ; [.383C.0020.0002.131A0] # EGYPTIAN HIEROGLYPH K006
+131A1 ; [.383D.0020.0002.131A1] # EGYPTIAN HIEROGLYPH K007
+131A2 ; [.383E.0020.0002.131A2] # EGYPTIAN HIEROGLYPH K008
+131A3 ; [.383F.0020.0002.131A3] # EGYPTIAN HIEROGLYPH L001
+131A4 ; [.3840.0020.0002.131A4] # EGYPTIAN HIEROGLYPH L002
+131A5 ; [.3841.0020.0002.131A5] # EGYPTIAN HIEROGLYPH L002A
+131A6 ; [.3842.0020.0002.131A6] # EGYPTIAN HIEROGLYPH L003
+131A7 ; [.3843.0020.0002.131A7] # EGYPTIAN HIEROGLYPH L004
+131A8 ; [.3844.0020.0002.131A8] # EGYPTIAN HIEROGLYPH L005
+131A9 ; [.3845.0020.0002.131A9] # EGYPTIAN HIEROGLYPH L006
+131AA ; [.3846.0020.0002.131AA] # EGYPTIAN HIEROGLYPH L006A
+131AB ; [.3847.0020.0002.131AB] # EGYPTIAN HIEROGLYPH L007
+131AC ; [.3848.0020.0002.131AC] # EGYPTIAN HIEROGLYPH L008
+131AD ; [.3849.0020.0002.131AD] # EGYPTIAN HIEROGLYPH M001
+131AE ; [.384A.0020.0002.131AE] # EGYPTIAN HIEROGLYPH M001A
+131AF ; [.384B.0020.0002.131AF] # EGYPTIAN HIEROGLYPH M001B
+131B0 ; [.384C.0020.0002.131B0] # EGYPTIAN HIEROGLYPH M002
+131B1 ; [.384D.0020.0002.131B1] # EGYPTIAN HIEROGLYPH M003
+131B2 ; [.384E.0020.0002.131B2] # EGYPTIAN HIEROGLYPH M003A
+131B3 ; [.384F.0020.0002.131B3] # EGYPTIAN HIEROGLYPH M004
+131B4 ; [.3850.0020.0002.131B4] # EGYPTIAN HIEROGLYPH M005
+131B5 ; [.3851.0020.0002.131B5] # EGYPTIAN HIEROGLYPH M006
+131B6 ; [.3852.0020.0002.131B6] # EGYPTIAN HIEROGLYPH M007
+131B7 ; [.3853.0020.0002.131B7] # EGYPTIAN HIEROGLYPH M008
+131B8 ; [.3854.0020.0002.131B8] # EGYPTIAN HIEROGLYPH M009
+131B9 ; [.3855.0020.0002.131B9] # EGYPTIAN HIEROGLYPH M010
+131BA ; [.3856.0020.0002.131BA] # EGYPTIAN HIEROGLYPH M010A
+131BB ; [.3857.0020.0002.131BB] # EGYPTIAN HIEROGLYPH M011
+131BC ; [.3858.0020.0002.131BC] # EGYPTIAN HIEROGLYPH M012
+131BD ; [.3859.0020.0002.131BD] # EGYPTIAN HIEROGLYPH M012A
+131BE ; [.385A.0020.0002.131BE] # EGYPTIAN HIEROGLYPH M012B
+131BF ; [.385B.0020.0002.131BF] # EGYPTIAN HIEROGLYPH M012C
+131C0 ; [.385C.0020.0002.131C0] # EGYPTIAN HIEROGLYPH M012D
+131C1 ; [.385D.0020.0002.131C1] # EGYPTIAN HIEROGLYPH M012E
+131C2 ; [.385E.0020.0002.131C2] # EGYPTIAN HIEROGLYPH M012F
+131C3 ; [.385F.0020.0002.131C3] # EGYPTIAN HIEROGLYPH M012G
+131C4 ; [.3860.0020.0002.131C4] # EGYPTIAN HIEROGLYPH M012H
+131C5 ; [.3861.0020.0002.131C5] # EGYPTIAN HIEROGLYPH M013
+131C6 ; [.3862.0020.0002.131C6] # EGYPTIAN HIEROGLYPH M014
+131C7 ; [.3863.0020.0002.131C7] # EGYPTIAN HIEROGLYPH M015
+131C8 ; [.3864.0020.0002.131C8] # EGYPTIAN HIEROGLYPH M015A
+131C9 ; [.3865.0020.0002.131C9] # EGYPTIAN HIEROGLYPH M016
+131CA ; [.3866.0020.0002.131CA] # EGYPTIAN HIEROGLYPH M016A
+131CB ; [.3867.0020.0002.131CB] # EGYPTIAN HIEROGLYPH M017
+131CC ; [.3868.0020.0002.131CC] # EGYPTIAN HIEROGLYPH M017A
+131CD ; [.3869.0020.0002.131CD] # EGYPTIAN HIEROGLYPH M018
+131CE ; [.386A.0020.0002.131CE] # EGYPTIAN HIEROGLYPH M019
+131CF ; [.386B.0020.0002.131CF] # EGYPTIAN HIEROGLYPH M020
+131D0 ; [.386C.0020.0002.131D0] # EGYPTIAN HIEROGLYPH M021
+131D1 ; [.386D.0020.0002.131D1] # EGYPTIAN HIEROGLYPH M022
+131D2 ; [.386E.0020.0002.131D2] # EGYPTIAN HIEROGLYPH M022A
+131D3 ; [.386F.0020.0002.131D3] # EGYPTIAN HIEROGLYPH M023
+131D4 ; [.3870.0020.0002.131D4] # EGYPTIAN HIEROGLYPH M024
+131D5 ; [.3871.0020.0002.131D5] # EGYPTIAN HIEROGLYPH M024A
+131D6 ; [.3872.0020.0002.131D6] # EGYPTIAN HIEROGLYPH M025
+131D7 ; [.3873.0020.0002.131D7] # EGYPTIAN HIEROGLYPH M026
+131D8 ; [.3874.0020.0002.131D8] # EGYPTIAN HIEROGLYPH M027
+131D9 ; [.3875.0020.0002.131D9] # EGYPTIAN HIEROGLYPH M028
+131DA ; [.3876.0020.0002.131DA] # EGYPTIAN HIEROGLYPH M028A
+131DB ; [.3877.0020.0002.131DB] # EGYPTIAN HIEROGLYPH M029
+131DC ; [.3878.0020.0002.131DC] # EGYPTIAN HIEROGLYPH M030
+131DD ; [.3879.0020.0002.131DD] # EGYPTIAN HIEROGLYPH M031
+131DE ; [.387A.0020.0002.131DE] # EGYPTIAN HIEROGLYPH M031A
+131DF ; [.387B.0020.0002.131DF] # EGYPTIAN HIEROGLYPH M032
+131E0 ; [.387C.0020.0002.131E0] # EGYPTIAN HIEROGLYPH M033
+131E1 ; [.387D.0020.0002.131E1] # EGYPTIAN HIEROGLYPH M033A
+131E2 ; [.387E.0020.0002.131E2] # EGYPTIAN HIEROGLYPH M033B
+131E3 ; [.387F.0020.0002.131E3] # EGYPTIAN HIEROGLYPH M034
+131E4 ; [.3880.0020.0002.131E4] # EGYPTIAN HIEROGLYPH M035
+131E5 ; [.3881.0020.0002.131E5] # EGYPTIAN HIEROGLYPH M036
+131E6 ; [.3882.0020.0002.131E6] # EGYPTIAN HIEROGLYPH M037
+131E7 ; [.3883.0020.0002.131E7] # EGYPTIAN HIEROGLYPH M038
+131E8 ; [.3884.0020.0002.131E8] # EGYPTIAN HIEROGLYPH M039
+131E9 ; [.3885.0020.0002.131E9] # EGYPTIAN HIEROGLYPH M040
+131EA ; [.3886.0020.0002.131EA] # EGYPTIAN HIEROGLYPH M040A
+131EB ; [.3887.0020.0002.131EB] # EGYPTIAN HIEROGLYPH M041
+131EC ; [.3888.0020.0002.131EC] # EGYPTIAN HIEROGLYPH M042
+131ED ; [.3889.0020.0002.131ED] # EGYPTIAN HIEROGLYPH M043
+131EE ; [.388A.0020.0002.131EE] # EGYPTIAN HIEROGLYPH M044
+131EF ; [.388B.0020.0002.131EF] # EGYPTIAN HIEROGLYPH N001
+131F0 ; [.388C.0020.0002.131F0] # EGYPTIAN HIEROGLYPH N002
+131F1 ; [.388D.0020.0002.131F1] # EGYPTIAN HIEROGLYPH N003
+131F2 ; [.388E.0020.0002.131F2] # EGYPTIAN HIEROGLYPH N004
+131F3 ; [.388F.0020.0002.131F3] # EGYPTIAN HIEROGLYPH N005
+131F4 ; [.3890.0020.0002.131F4] # EGYPTIAN HIEROGLYPH N006
+131F5 ; [.3891.0020.0002.131F5] # EGYPTIAN HIEROGLYPH N007
+131F6 ; [.3892.0020.0002.131F6] # EGYPTIAN HIEROGLYPH N008
+131F7 ; [.3893.0020.0002.131F7] # EGYPTIAN HIEROGLYPH N009
+131F8 ; [.3894.0020.0002.131F8] # EGYPTIAN HIEROGLYPH N010
+131F9 ; [.3895.0020.0002.131F9] # EGYPTIAN HIEROGLYPH N011
+131FA ; [.3896.0020.0002.131FA] # EGYPTIAN HIEROGLYPH N012
+131FB ; [.3897.0020.0002.131FB] # EGYPTIAN HIEROGLYPH N013
+131FC ; [.3898.0020.0002.131FC] # EGYPTIAN HIEROGLYPH N014
+131FD ; [.3899.0020.0002.131FD] # EGYPTIAN HIEROGLYPH N015
+131FE ; [.389A.0020.0002.131FE] # EGYPTIAN HIEROGLYPH N016
+131FF ; [.389B.0020.0002.131FF] # EGYPTIAN HIEROGLYPH N017
+13200 ; [.389C.0020.0002.13200] # EGYPTIAN HIEROGLYPH N018
+13201 ; [.389D.0020.0002.13201] # EGYPTIAN HIEROGLYPH N018A
+13202 ; [.389E.0020.0002.13202] # EGYPTIAN HIEROGLYPH N018B
+13203 ; [.389F.0020.0002.13203] # EGYPTIAN HIEROGLYPH N019
+13204 ; [.38A0.0020.0002.13204] # EGYPTIAN HIEROGLYPH N020
+13205 ; [.38A1.0020.0002.13205] # EGYPTIAN HIEROGLYPH N021
+13206 ; [.38A2.0020.0002.13206] # EGYPTIAN HIEROGLYPH N022
+13207 ; [.38A3.0020.0002.13207] # EGYPTIAN HIEROGLYPH N023
+13208 ; [.38A4.0020.0002.13208] # EGYPTIAN HIEROGLYPH N024
+13209 ; [.38A5.0020.0002.13209] # EGYPTIAN HIEROGLYPH N025
+1320A ; [.38A6.0020.0002.1320A] # EGYPTIAN HIEROGLYPH N025A
+1320B ; [.38A7.0020.0002.1320B] # EGYPTIAN HIEROGLYPH N026
+1320C ; [.38A8.0020.0002.1320C] # EGYPTIAN HIEROGLYPH N027
+1320D ; [.38A9.0020.0002.1320D] # EGYPTIAN HIEROGLYPH N028
+1320E ; [.38AA.0020.0002.1320E] # EGYPTIAN HIEROGLYPH N029
+1320F ; [.38AB.0020.0002.1320F] # EGYPTIAN HIEROGLYPH N030
+13210 ; [.38AC.0020.0002.13210] # EGYPTIAN HIEROGLYPH N031
+13211 ; [.38AD.0020.0002.13211] # EGYPTIAN HIEROGLYPH N032
+13212 ; [.38AE.0020.0002.13212] # EGYPTIAN HIEROGLYPH N033
+13213 ; [.38AF.0020.0002.13213] # EGYPTIAN HIEROGLYPH N033A
+13214 ; [.38B0.0020.0002.13214] # EGYPTIAN HIEROGLYPH N034
+13215 ; [.38B1.0020.0002.13215] # EGYPTIAN HIEROGLYPH N034A
+13216 ; [.38B2.0020.0002.13216] # EGYPTIAN HIEROGLYPH N035
+13217 ; [.38B3.0020.0002.13217] # EGYPTIAN HIEROGLYPH N035A
+13218 ; [.38B4.0020.0002.13218] # EGYPTIAN HIEROGLYPH N036
+13219 ; [.38B5.0020.0002.13219] # EGYPTIAN HIEROGLYPH N037
+1321A ; [.38B6.0020.0002.1321A] # EGYPTIAN HIEROGLYPH N037A
+1321B ; [.38B7.0020.0002.1321B] # EGYPTIAN HIEROGLYPH N038
+1321C ; [.38B8.0020.0002.1321C] # EGYPTIAN HIEROGLYPH N039
+1321D ; [.38B9.0020.0002.1321D] # EGYPTIAN HIEROGLYPH N040
+1321E ; [.38BA.0020.0002.1321E] # EGYPTIAN HIEROGLYPH N041
+1321F ; [.38BB.0020.0002.1321F] # EGYPTIAN HIEROGLYPH N042
+13220 ; [.38BC.0020.0002.13220] # EGYPTIAN HIEROGLYPH NL001
+13221 ; [.38BD.0020.0002.13221] # EGYPTIAN HIEROGLYPH NL002
+13222 ; [.38BE.0020.0002.13222] # EGYPTIAN HIEROGLYPH NL003
+13223 ; [.38BF.0020.0002.13223] # EGYPTIAN HIEROGLYPH NL004
+13224 ; [.38C0.0020.0002.13224] # EGYPTIAN HIEROGLYPH NL005
+13225 ; [.38C1.0020.0002.13225] # EGYPTIAN HIEROGLYPH NL005A
+13226 ; [.38C2.0020.0002.13226] # EGYPTIAN HIEROGLYPH NL006
+13227 ; [.38C3.0020.0002.13227] # EGYPTIAN HIEROGLYPH NL007
+13228 ; [.38C4.0020.0002.13228] # EGYPTIAN HIEROGLYPH NL008
+13229 ; [.38C5.0020.0002.13229] # EGYPTIAN HIEROGLYPH NL009
+1322A ; [.38C6.0020.0002.1322A] # EGYPTIAN HIEROGLYPH NL010
+1322B ; [.38C7.0020.0002.1322B] # EGYPTIAN HIEROGLYPH NL011
+1322C ; [.38C8.0020.0002.1322C] # EGYPTIAN HIEROGLYPH NL012
+1322D ; [.38C9.0020.0002.1322D] # EGYPTIAN HIEROGLYPH NL013
+1322E ; [.38CA.0020.0002.1322E] # EGYPTIAN HIEROGLYPH NL014
+1322F ; [.38CB.0020.0002.1322F] # EGYPTIAN HIEROGLYPH NL015
+13230 ; [.38CC.0020.0002.13230] # EGYPTIAN HIEROGLYPH NL016
+13231 ; [.38CD.0020.0002.13231] # EGYPTIAN HIEROGLYPH NL017
+13232 ; [.38CE.0020.0002.13232] # EGYPTIAN HIEROGLYPH NL017A
+13233 ; [.38CF.0020.0002.13233] # EGYPTIAN HIEROGLYPH NL018
+13234 ; [.38D0.0020.0002.13234] # EGYPTIAN HIEROGLYPH NL019
+13235 ; [.38D1.0020.0002.13235] # EGYPTIAN HIEROGLYPH NL020
+13236 ; [.38D2.0020.0002.13236] # EGYPTIAN HIEROGLYPH NU001
+13237 ; [.38D3.0020.0002.13237] # EGYPTIAN HIEROGLYPH NU002
+13238 ; [.38D4.0020.0002.13238] # EGYPTIAN HIEROGLYPH NU003
+13239 ; [.38D5.0020.0002.13239] # EGYPTIAN HIEROGLYPH NU004
+1323A ; [.38D6.0020.0002.1323A] # EGYPTIAN HIEROGLYPH NU005
+1323B ; [.38D7.0020.0002.1323B] # EGYPTIAN HIEROGLYPH NU006
+1323C ; [.38D8.0020.0002.1323C] # EGYPTIAN HIEROGLYPH NU007
+1323D ; [.38D9.0020.0002.1323D] # EGYPTIAN HIEROGLYPH NU008
+1323E ; [.38DA.0020.0002.1323E] # EGYPTIAN HIEROGLYPH NU009
+1323F ; [.38DB.0020.0002.1323F] # EGYPTIAN HIEROGLYPH NU010
+13240 ; [.38DC.0020.0002.13240] # EGYPTIAN HIEROGLYPH NU010A
+13241 ; [.38DD.0020.0002.13241] # EGYPTIAN HIEROGLYPH NU011
+13242 ; [.38DE.0020.0002.13242] # EGYPTIAN HIEROGLYPH NU011A
+13243 ; [.38DF.0020.0002.13243] # EGYPTIAN HIEROGLYPH NU012
+13244 ; [.38E0.0020.0002.13244] # EGYPTIAN HIEROGLYPH NU013
+13245 ; [.38E1.0020.0002.13245] # EGYPTIAN HIEROGLYPH NU014
+13246 ; [.38E2.0020.0002.13246] # EGYPTIAN HIEROGLYPH NU015
+13247 ; [.38E3.0020.0002.13247] # EGYPTIAN HIEROGLYPH NU016
+13248 ; [.38E4.0020.0002.13248] # EGYPTIAN HIEROGLYPH NU017
+13249 ; [.38E5.0020.0002.13249] # EGYPTIAN HIEROGLYPH NU018
+1324A ; [.38E6.0020.0002.1324A] # EGYPTIAN HIEROGLYPH NU018A
+1324B ; [.38E7.0020.0002.1324B] # EGYPTIAN HIEROGLYPH NU019
+1324C ; [.38E8.0020.0002.1324C] # EGYPTIAN HIEROGLYPH NU020
+1324D ; [.38E9.0020.0002.1324D] # EGYPTIAN HIEROGLYPH NU021
+1324E ; [.38EA.0020.0002.1324E] # EGYPTIAN HIEROGLYPH NU022
+1324F ; [.38EB.0020.0002.1324F] # EGYPTIAN HIEROGLYPH NU022A
+13250 ; [.38EC.0020.0002.13250] # EGYPTIAN HIEROGLYPH O001
+13251 ; [.38ED.0020.0002.13251] # EGYPTIAN HIEROGLYPH O001A
+13252 ; [.38EE.0020.0002.13252] # EGYPTIAN HIEROGLYPH O002
+13253 ; [.38EF.0020.0002.13253] # EGYPTIAN HIEROGLYPH O003
+13254 ; [.38F0.0020.0002.13254] # EGYPTIAN HIEROGLYPH O004
+13255 ; [.38F1.0020.0002.13255] # EGYPTIAN HIEROGLYPH O005
+13256 ; [.38F2.0020.0002.13256] # EGYPTIAN HIEROGLYPH O005A
+13257 ; [.38F3.0020.0002.13257] # EGYPTIAN HIEROGLYPH O006
+13258 ; [.38F4.0020.0002.13258] # EGYPTIAN HIEROGLYPH O006A
+13259 ; [.38F5.0020.0002.13259] # EGYPTIAN HIEROGLYPH O006B
+1325A ; [.38F6.0020.0002.1325A] # EGYPTIAN HIEROGLYPH O006C
+1325B ; [.38F7.0020.0002.1325B] # EGYPTIAN HIEROGLYPH O006D
+1325C ; [.38F8.0020.0002.1325C] # EGYPTIAN HIEROGLYPH O006E
+1325D ; [.38F9.0020.0002.1325D] # EGYPTIAN HIEROGLYPH O006F
+1325E ; [.38FA.0020.0002.1325E] # EGYPTIAN HIEROGLYPH O007
+1325F ; [.38FB.0020.0002.1325F] # EGYPTIAN HIEROGLYPH O008
+13260 ; [.38FC.0020.0002.13260] # EGYPTIAN HIEROGLYPH O009
+13261 ; [.38FD.0020.0002.13261] # EGYPTIAN HIEROGLYPH O010
+13262 ; [.38FE.0020.0002.13262] # EGYPTIAN HIEROGLYPH O010A
+13263 ; [.38FF.0020.0002.13263] # EGYPTIAN HIEROGLYPH O010B
+13264 ; [.3900.0020.0002.13264] # EGYPTIAN HIEROGLYPH O010C
+13265 ; [.3901.0020.0002.13265] # EGYPTIAN HIEROGLYPH O011
+13266 ; [.3902.0020.0002.13266] # EGYPTIAN HIEROGLYPH O012
+13267 ; [.3903.0020.0002.13267] # EGYPTIAN HIEROGLYPH O013
+13268 ; [.3904.0020.0002.13268] # EGYPTIAN HIEROGLYPH O014
+13269 ; [.3905.0020.0002.13269] # EGYPTIAN HIEROGLYPH O015
+1326A ; [.3906.0020.0002.1326A] # EGYPTIAN HIEROGLYPH O016
+1326B ; [.3907.0020.0002.1326B] # EGYPTIAN HIEROGLYPH O017
+1326C ; [.3908.0020.0002.1326C] # EGYPTIAN HIEROGLYPH O018
+1326D ; [.3909.0020.0002.1326D] # EGYPTIAN HIEROGLYPH O019
+1326E ; [.390A.0020.0002.1326E] # EGYPTIAN HIEROGLYPH O019A
+1326F ; [.390B.0020.0002.1326F] # EGYPTIAN HIEROGLYPH O020
+13270 ; [.390C.0020.0002.13270] # EGYPTIAN HIEROGLYPH O020A
+13271 ; [.390D.0020.0002.13271] # EGYPTIAN HIEROGLYPH O021
+13272 ; [.390E.0020.0002.13272] # EGYPTIAN HIEROGLYPH O022
+13273 ; [.390F.0020.0002.13273] # EGYPTIAN HIEROGLYPH O023
+13274 ; [.3910.0020.0002.13274] # EGYPTIAN HIEROGLYPH O024
+13275 ; [.3911.0020.0002.13275] # EGYPTIAN HIEROGLYPH O024A
+13276 ; [.3912.0020.0002.13276] # EGYPTIAN HIEROGLYPH O025
+13277 ; [.3913.0020.0002.13277] # EGYPTIAN HIEROGLYPH O025A
+13278 ; [.3914.0020.0002.13278] # EGYPTIAN HIEROGLYPH O026
+13279 ; [.3915.0020.0002.13279] # EGYPTIAN HIEROGLYPH O027
+1327A ; [.3916.0020.0002.1327A] # EGYPTIAN HIEROGLYPH O028
+1327B ; [.3917.0020.0002.1327B] # EGYPTIAN HIEROGLYPH O029
+1327C ; [.3918.0020.0002.1327C] # EGYPTIAN HIEROGLYPH O029A
+1327D ; [.3919.0020.0002.1327D] # EGYPTIAN HIEROGLYPH O030
+1327E ; [.391A.0020.0002.1327E] # EGYPTIAN HIEROGLYPH O030A
+1327F ; [.391B.0020.0002.1327F] # EGYPTIAN HIEROGLYPH O031
+13280 ; [.391C.0020.0002.13280] # EGYPTIAN HIEROGLYPH O032
+13281 ; [.391D.0020.0002.13281] # EGYPTIAN HIEROGLYPH O033
+13282 ; [.391E.0020.0002.13282] # EGYPTIAN HIEROGLYPH O033A
+13283 ; [.391F.0020.0002.13283] # EGYPTIAN HIEROGLYPH O034
+13284 ; [.3920.0020.0002.13284] # EGYPTIAN HIEROGLYPH O035
+13285 ; [.3921.0020.0002.13285] # EGYPTIAN HIEROGLYPH O036
+13286 ; [.3922.0020.0002.13286] # EGYPTIAN HIEROGLYPH O036A
+13287 ; [.3923.0020.0002.13287] # EGYPTIAN HIEROGLYPH O036B
+13288 ; [.3924.0020.0002.13288] # EGYPTIAN HIEROGLYPH O036C
+13289 ; [.3925.0020.0002.13289] # EGYPTIAN HIEROGLYPH O036D
+1328A ; [.3926.0020.0002.1328A] # EGYPTIAN HIEROGLYPH O037
+1328B ; [.3927.0020.0002.1328B] # EGYPTIAN HIEROGLYPH O038
+1328C ; [.3928.0020.0002.1328C] # EGYPTIAN HIEROGLYPH O039
+1328D ; [.3929.0020.0002.1328D] # EGYPTIAN HIEROGLYPH O040
+1328E ; [.392A.0020.0002.1328E] # EGYPTIAN HIEROGLYPH O041
+1328F ; [.392B.0020.0002.1328F] # EGYPTIAN HIEROGLYPH O042
+13290 ; [.392C.0020.0002.13290] # EGYPTIAN HIEROGLYPH O043
+13291 ; [.392D.0020.0002.13291] # EGYPTIAN HIEROGLYPH O044
+13292 ; [.392E.0020.0002.13292] # EGYPTIAN HIEROGLYPH O045
+13293 ; [.392F.0020.0002.13293] # EGYPTIAN HIEROGLYPH O046
+13294 ; [.3930.0020.0002.13294] # EGYPTIAN HIEROGLYPH O047
+13295 ; [.3931.0020.0002.13295] # EGYPTIAN HIEROGLYPH O048
+13296 ; [.3932.0020.0002.13296] # EGYPTIAN HIEROGLYPH O049
+13297 ; [.3933.0020.0002.13297] # EGYPTIAN HIEROGLYPH O050
+13298 ; [.3934.0020.0002.13298] # EGYPTIAN HIEROGLYPH O050A
+13299 ; [.3935.0020.0002.13299] # EGYPTIAN HIEROGLYPH O050B
+1329A ; [.3936.0020.0002.1329A] # EGYPTIAN HIEROGLYPH O051
+1329B ; [.3937.0020.0002.1329B] # EGYPTIAN HIEROGLYPH P001
+1329C ; [.3938.0020.0002.1329C] # EGYPTIAN HIEROGLYPH P001A
+1329D ; [.3939.0020.0002.1329D] # EGYPTIAN HIEROGLYPH P002
+1329E ; [.393A.0020.0002.1329E] # EGYPTIAN HIEROGLYPH P003
+1329F ; [.393B.0020.0002.1329F] # EGYPTIAN HIEROGLYPH P003A
+132A0 ; [.393C.0020.0002.132A0] # EGYPTIAN HIEROGLYPH P004
+132A1 ; [.393D.0020.0002.132A1] # EGYPTIAN HIEROGLYPH P005
+132A2 ; [.393E.0020.0002.132A2] # EGYPTIAN HIEROGLYPH P006
+132A3 ; [.393F.0020.0002.132A3] # EGYPTIAN HIEROGLYPH P007
+132A4 ; [.3940.0020.0002.132A4] # EGYPTIAN HIEROGLYPH P008
+132A5 ; [.3941.0020.0002.132A5] # EGYPTIAN HIEROGLYPH P009
+132A6 ; [.3942.0020.0002.132A6] # EGYPTIAN HIEROGLYPH P010
+132A7 ; [.3943.0020.0002.132A7] # EGYPTIAN HIEROGLYPH P011
+132A8 ; [.3944.0020.0002.132A8] # EGYPTIAN HIEROGLYPH Q001
+132A9 ; [.3945.0020.0002.132A9] # EGYPTIAN HIEROGLYPH Q002
+132AA ; [.3946.0020.0002.132AA] # EGYPTIAN HIEROGLYPH Q003
+132AB ; [.3947.0020.0002.132AB] # EGYPTIAN HIEROGLYPH Q004
+132AC ; [.3948.0020.0002.132AC] # EGYPTIAN HIEROGLYPH Q005
+132AD ; [.3949.0020.0002.132AD] # EGYPTIAN HIEROGLYPH Q006
+132AE ; [.394A.0020.0002.132AE] # EGYPTIAN HIEROGLYPH Q007
+132AF ; [.394B.0020.0002.132AF] # EGYPTIAN HIEROGLYPH R001
+132B0 ; [.394C.0020.0002.132B0] # EGYPTIAN HIEROGLYPH R002
+132B1 ; [.394D.0020.0002.132B1] # EGYPTIAN HIEROGLYPH R002A
+132B2 ; [.394E.0020.0002.132B2] # EGYPTIAN HIEROGLYPH R003
+132B3 ; [.394F.0020.0002.132B3] # EGYPTIAN HIEROGLYPH R003A
+132B4 ; [.3950.0020.0002.132B4] # EGYPTIAN HIEROGLYPH R003B
+132B5 ; [.3951.0020.0002.132B5] # EGYPTIAN HIEROGLYPH R004
+132B6 ; [.3952.0020.0002.132B6] # EGYPTIAN HIEROGLYPH R005
+132B7 ; [.3953.0020.0002.132B7] # EGYPTIAN HIEROGLYPH R006
+132B8 ; [.3954.0020.0002.132B8] # EGYPTIAN HIEROGLYPH R007
+132B9 ; [.3955.0020.0002.132B9] # EGYPTIAN HIEROGLYPH R008
+132BA ; [.3956.0020.0002.132BA] # EGYPTIAN HIEROGLYPH R009
+132BB ; [.3957.0020.0002.132BB] # EGYPTIAN HIEROGLYPH R010
+132BC ; [.3958.0020.0002.132BC] # EGYPTIAN HIEROGLYPH R010A
+132BD ; [.3959.0020.0002.132BD] # EGYPTIAN HIEROGLYPH R011
+132BE ; [.395A.0020.0002.132BE] # EGYPTIAN HIEROGLYPH R012
+132BF ; [.395B.0020.0002.132BF] # EGYPTIAN HIEROGLYPH R013
+132C0 ; [.395C.0020.0002.132C0] # EGYPTIAN HIEROGLYPH R014
+132C1 ; [.395D.0020.0002.132C1] # EGYPTIAN HIEROGLYPH R015
+132C2 ; [.395E.0020.0002.132C2] # EGYPTIAN HIEROGLYPH R016
+132C3 ; [.395F.0020.0002.132C3] # EGYPTIAN HIEROGLYPH R016A
+132C4 ; [.3960.0020.0002.132C4] # EGYPTIAN HIEROGLYPH R017
+132C5 ; [.3961.0020.0002.132C5] # EGYPTIAN HIEROGLYPH R018
+132C6 ; [.3962.0020.0002.132C6] # EGYPTIAN HIEROGLYPH R019
+132C7 ; [.3963.0020.0002.132C7] # EGYPTIAN HIEROGLYPH R020
+132C8 ; [.3964.0020.0002.132C8] # EGYPTIAN HIEROGLYPH R021
+132C9 ; [.3965.0020.0002.132C9] # EGYPTIAN HIEROGLYPH R022
+132CA ; [.3966.0020.0002.132CA] # EGYPTIAN HIEROGLYPH R023
+132CB ; [.3967.0020.0002.132CB] # EGYPTIAN HIEROGLYPH R024
+132CC ; [.3968.0020.0002.132CC] # EGYPTIAN HIEROGLYPH R025
+132CD ; [.3969.0020.0002.132CD] # EGYPTIAN HIEROGLYPH R026
+132CE ; [.396A.0020.0002.132CE] # EGYPTIAN HIEROGLYPH R027
+132CF ; [.396B.0020.0002.132CF] # EGYPTIAN HIEROGLYPH R028
+132D0 ; [.396C.0020.0002.132D0] # EGYPTIAN HIEROGLYPH R029
+132D1 ; [.396D.0020.0002.132D1] # EGYPTIAN HIEROGLYPH S001
+132D2 ; [.396E.0020.0002.132D2] # EGYPTIAN HIEROGLYPH S002
+132D3 ; [.396F.0020.0002.132D3] # EGYPTIAN HIEROGLYPH S002A
+132D4 ; [.3970.0020.0002.132D4] # EGYPTIAN HIEROGLYPH S003
+132D5 ; [.3971.0020.0002.132D5] # EGYPTIAN HIEROGLYPH S004
+132D6 ; [.3972.0020.0002.132D6] # EGYPTIAN HIEROGLYPH S005
+132D7 ; [.3973.0020.0002.132D7] # EGYPTIAN HIEROGLYPH S006
+132D8 ; [.3974.0020.0002.132D8] # EGYPTIAN HIEROGLYPH S006A
+132D9 ; [.3975.0020.0002.132D9] # EGYPTIAN HIEROGLYPH S007
+132DA ; [.3976.0020.0002.132DA] # EGYPTIAN HIEROGLYPH S008
+132DB ; [.3977.0020.0002.132DB] # EGYPTIAN HIEROGLYPH S009
+132DC ; [.3978.0020.0002.132DC] # EGYPTIAN HIEROGLYPH S010
+132DD ; [.3979.0020.0002.132DD] # EGYPTIAN HIEROGLYPH S011
+132DE ; [.397A.0020.0002.132DE] # EGYPTIAN HIEROGLYPH S012
+132DF ; [.397B.0020.0002.132DF] # EGYPTIAN HIEROGLYPH S013
+132E0 ; [.397C.0020.0002.132E0] # EGYPTIAN HIEROGLYPH S014
+132E1 ; [.397D.0020.0002.132E1] # EGYPTIAN HIEROGLYPH S014A
+132E2 ; [.397E.0020.0002.132E2] # EGYPTIAN HIEROGLYPH S014B
+132E3 ; [.397F.0020.0002.132E3] # EGYPTIAN HIEROGLYPH S015
+132E4 ; [.3980.0020.0002.132E4] # EGYPTIAN HIEROGLYPH S016
+132E5 ; [.3981.0020.0002.132E5] # EGYPTIAN HIEROGLYPH S017
+132E6 ; [.3982.0020.0002.132E6] # EGYPTIAN HIEROGLYPH S017A
+132E7 ; [.3983.0020.0002.132E7] # EGYPTIAN HIEROGLYPH S018
+132E8 ; [.3984.0020.0002.132E8] # EGYPTIAN HIEROGLYPH S019
+132E9 ; [.3985.0020.0002.132E9] # EGYPTIAN HIEROGLYPH S020
+132EA ; [.3986.0020.0002.132EA] # EGYPTIAN HIEROGLYPH S021
+132EB ; [.3987.0020.0002.132EB] # EGYPTIAN HIEROGLYPH S022
+132EC ; [.3988.0020.0002.132EC] # EGYPTIAN HIEROGLYPH S023
+132ED ; [.3989.0020.0002.132ED] # EGYPTIAN HIEROGLYPH S024
+132EE ; [.398A.0020.0002.132EE] # EGYPTIAN HIEROGLYPH S025
+132EF ; [.398B.0020.0002.132EF] # EGYPTIAN HIEROGLYPH S026
+132F0 ; [.398C.0020.0002.132F0] # EGYPTIAN HIEROGLYPH S026A
+132F1 ; [.398D.0020.0002.132F1] # EGYPTIAN HIEROGLYPH S026B
+132F2 ; [.398E.0020.0002.132F2] # EGYPTIAN HIEROGLYPH S027
+132F3 ; [.398F.0020.0002.132F3] # EGYPTIAN HIEROGLYPH S028
+132F4 ; [.3990.0020.0002.132F4] # EGYPTIAN HIEROGLYPH S029
+132F5 ; [.3991.0020.0002.132F5] # EGYPTIAN HIEROGLYPH S030
+132F6 ; [.3992.0020.0002.132F6] # EGYPTIAN HIEROGLYPH S031
+132F7 ; [.3993.0020.0002.132F7] # EGYPTIAN HIEROGLYPH S032
+132F8 ; [.3994.0020.0002.132F8] # EGYPTIAN HIEROGLYPH S033
+132F9 ; [.3995.0020.0002.132F9] # EGYPTIAN HIEROGLYPH S034
+132FA ; [.3996.0020.0002.132FA] # EGYPTIAN HIEROGLYPH S035
+132FB ; [.3997.0020.0002.132FB] # EGYPTIAN HIEROGLYPH S035A
+132FC ; [.3998.0020.0002.132FC] # EGYPTIAN HIEROGLYPH S036
+132FD ; [.3999.0020.0002.132FD] # EGYPTIAN HIEROGLYPH S037
+132FE ; [.399A.0020.0002.132FE] # EGYPTIAN HIEROGLYPH S038
+132FF ; [.399B.0020.0002.132FF] # EGYPTIAN HIEROGLYPH S039
+13300 ; [.399C.0020.0002.13300] # EGYPTIAN HIEROGLYPH S040
+13301 ; [.399D.0020.0002.13301] # EGYPTIAN HIEROGLYPH S041
+13302 ; [.399E.0020.0002.13302] # EGYPTIAN HIEROGLYPH S042
+13303 ; [.399F.0020.0002.13303] # EGYPTIAN HIEROGLYPH S043
+13304 ; [.39A0.0020.0002.13304] # EGYPTIAN HIEROGLYPH S044
+13305 ; [.39A1.0020.0002.13305] # EGYPTIAN HIEROGLYPH S045
+13306 ; [.39A2.0020.0002.13306] # EGYPTIAN HIEROGLYPH S046
+13307 ; [.39A3.0020.0002.13307] # EGYPTIAN HIEROGLYPH T001
+13308 ; [.39A4.0020.0002.13308] # EGYPTIAN HIEROGLYPH T002
+13309 ; [.39A5.0020.0002.13309] # EGYPTIAN HIEROGLYPH T003
+1330A ; [.39A6.0020.0002.1330A] # EGYPTIAN HIEROGLYPH T003A
+1330B ; [.39A7.0020.0002.1330B] # EGYPTIAN HIEROGLYPH T004
+1330C ; [.39A8.0020.0002.1330C] # EGYPTIAN HIEROGLYPH T005
+1330D ; [.39A9.0020.0002.1330D] # EGYPTIAN HIEROGLYPH T006
+1330E ; [.39AA.0020.0002.1330E] # EGYPTIAN HIEROGLYPH T007
+1330F ; [.39AB.0020.0002.1330F] # EGYPTIAN HIEROGLYPH T007A
+13310 ; [.39AC.0020.0002.13310] # EGYPTIAN HIEROGLYPH T008
+13311 ; [.39AD.0020.0002.13311] # EGYPTIAN HIEROGLYPH T008A
+13312 ; [.39AE.0020.0002.13312] # EGYPTIAN HIEROGLYPH T009
+13313 ; [.39AF.0020.0002.13313] # EGYPTIAN HIEROGLYPH T009A
+13314 ; [.39B0.0020.0002.13314] # EGYPTIAN HIEROGLYPH T010
+13315 ; [.39B1.0020.0002.13315] # EGYPTIAN HIEROGLYPH T011
+13316 ; [.39B2.0020.0002.13316] # EGYPTIAN HIEROGLYPH T011A
+13317 ; [.39B3.0020.0002.13317] # EGYPTIAN HIEROGLYPH T012
+13318 ; [.39B4.0020.0002.13318] # EGYPTIAN HIEROGLYPH T013
+13319 ; [.39B5.0020.0002.13319] # EGYPTIAN HIEROGLYPH T014
+1331A ; [.39B6.0020.0002.1331A] # EGYPTIAN HIEROGLYPH T015
+1331B ; [.39B7.0020.0002.1331B] # EGYPTIAN HIEROGLYPH T016
+1331C ; [.39B8.0020.0002.1331C] # EGYPTIAN HIEROGLYPH T016A
+1331D ; [.39B9.0020.0002.1331D] # EGYPTIAN HIEROGLYPH T017
+1331E ; [.39BA.0020.0002.1331E] # EGYPTIAN HIEROGLYPH T018
+1331F ; [.39BB.0020.0002.1331F] # EGYPTIAN HIEROGLYPH T019
+13320 ; [.39BC.0020.0002.13320] # EGYPTIAN HIEROGLYPH T020
+13321 ; [.39BD.0020.0002.13321] # EGYPTIAN HIEROGLYPH T021
+13322 ; [.39BE.0020.0002.13322] # EGYPTIAN HIEROGLYPH T022
+13323 ; [.39BF.0020.0002.13323] # EGYPTIAN HIEROGLYPH T023
+13324 ; [.39C0.0020.0002.13324] # EGYPTIAN HIEROGLYPH T024
+13325 ; [.39C1.0020.0002.13325] # EGYPTIAN HIEROGLYPH T025
+13326 ; [.39C2.0020.0002.13326] # EGYPTIAN HIEROGLYPH T026
+13327 ; [.39C3.0020.0002.13327] # EGYPTIAN HIEROGLYPH T027
+13328 ; [.39C4.0020.0002.13328] # EGYPTIAN HIEROGLYPH T028
+13329 ; [.39C5.0020.0002.13329] # EGYPTIAN HIEROGLYPH T029
+1332A ; [.39C6.0020.0002.1332A] # EGYPTIAN HIEROGLYPH T030
+1332B ; [.39C7.0020.0002.1332B] # EGYPTIAN HIEROGLYPH T031
+1332C ; [.39C8.0020.0002.1332C] # EGYPTIAN HIEROGLYPH T032
+1332D ; [.39C9.0020.0002.1332D] # EGYPTIAN HIEROGLYPH T032A
+1332E ; [.39CA.0020.0002.1332E] # EGYPTIAN HIEROGLYPH T033
+1332F ; [.39CB.0020.0002.1332F] # EGYPTIAN HIEROGLYPH T033A
+13330 ; [.39CC.0020.0002.13330] # EGYPTIAN HIEROGLYPH T034
+13331 ; [.39CD.0020.0002.13331] # EGYPTIAN HIEROGLYPH T035
+13332 ; [.39CE.0020.0002.13332] # EGYPTIAN HIEROGLYPH T036
+13333 ; [.39CF.0020.0002.13333] # EGYPTIAN HIEROGLYPH U001
+13334 ; [.39D0.0020.0002.13334] # EGYPTIAN HIEROGLYPH U002
+13335 ; [.39D1.0020.0002.13335] # EGYPTIAN HIEROGLYPH U003
+13336 ; [.39D2.0020.0002.13336] # EGYPTIAN HIEROGLYPH U004
+13337 ; [.39D3.0020.0002.13337] # EGYPTIAN HIEROGLYPH U005
+13338 ; [.39D4.0020.0002.13338] # EGYPTIAN HIEROGLYPH U006
+13339 ; [.39D5.0020.0002.13339] # EGYPTIAN HIEROGLYPH U006A
+1333A ; [.39D6.0020.0002.1333A] # EGYPTIAN HIEROGLYPH U006B
+1333B ; [.39D7.0020.0002.1333B] # EGYPTIAN HIEROGLYPH U007
+1333C ; [.39D8.0020.0002.1333C] # EGYPTIAN HIEROGLYPH U008
+1333D ; [.39D9.0020.0002.1333D] # EGYPTIAN HIEROGLYPH U009
+1333E ; [.39DA.0020.0002.1333E] # EGYPTIAN HIEROGLYPH U010
+1333F ; [.39DB.0020.0002.1333F] # EGYPTIAN HIEROGLYPH U011
+13340 ; [.39DC.0020.0002.13340] # EGYPTIAN HIEROGLYPH U012
+13341 ; [.39DD.0020.0002.13341] # EGYPTIAN HIEROGLYPH U013
+13342 ; [.39DE.0020.0002.13342] # EGYPTIAN HIEROGLYPH U014
+13343 ; [.39DF.0020.0002.13343] # EGYPTIAN HIEROGLYPH U015
+13344 ; [.39E0.0020.0002.13344] # EGYPTIAN HIEROGLYPH U016
+13345 ; [.39E1.0020.0002.13345] # EGYPTIAN HIEROGLYPH U017
+13346 ; [.39E2.0020.0002.13346] # EGYPTIAN HIEROGLYPH U018
+13347 ; [.39E3.0020.0002.13347] # EGYPTIAN HIEROGLYPH U019
+13348 ; [.39E4.0020.0002.13348] # EGYPTIAN HIEROGLYPH U020
+13349 ; [.39E5.0020.0002.13349] # EGYPTIAN HIEROGLYPH U021
+1334A ; [.39E6.0020.0002.1334A] # EGYPTIAN HIEROGLYPH U022
+1334B ; [.39E7.0020.0002.1334B] # EGYPTIAN HIEROGLYPH U023
+1334C ; [.39E8.0020.0002.1334C] # EGYPTIAN HIEROGLYPH U023A
+1334D ; [.39E9.0020.0002.1334D] # EGYPTIAN HIEROGLYPH U024
+1334E ; [.39EA.0020.0002.1334E] # EGYPTIAN HIEROGLYPH U025
+1334F ; [.39EB.0020.0002.1334F] # EGYPTIAN HIEROGLYPH U026
+13350 ; [.39EC.0020.0002.13350] # EGYPTIAN HIEROGLYPH U027
+13351 ; [.39ED.0020.0002.13351] # EGYPTIAN HIEROGLYPH U028
+13352 ; [.39EE.0020.0002.13352] # EGYPTIAN HIEROGLYPH U029
+13353 ; [.39EF.0020.0002.13353] # EGYPTIAN HIEROGLYPH U029A
+13354 ; [.39F0.0020.0002.13354] # EGYPTIAN HIEROGLYPH U030
+13355 ; [.39F1.0020.0002.13355] # EGYPTIAN HIEROGLYPH U031
+13356 ; [.39F2.0020.0002.13356] # EGYPTIAN HIEROGLYPH U032
+13357 ; [.39F3.0020.0002.13357] # EGYPTIAN HIEROGLYPH U032A
+13358 ; [.39F4.0020.0002.13358] # EGYPTIAN HIEROGLYPH U033
+13359 ; [.39F5.0020.0002.13359] # EGYPTIAN HIEROGLYPH U034
+1335A ; [.39F6.0020.0002.1335A] # EGYPTIAN HIEROGLYPH U035
+1335B ; [.39F7.0020.0002.1335B] # EGYPTIAN HIEROGLYPH U036
+1335C ; [.39F8.0020.0002.1335C] # EGYPTIAN HIEROGLYPH U037
+1335D ; [.39F9.0020.0002.1335D] # EGYPTIAN HIEROGLYPH U038
+1335E ; [.39FA.0020.0002.1335E] # EGYPTIAN HIEROGLYPH U039
+1335F ; [.39FB.0020.0002.1335F] # EGYPTIAN HIEROGLYPH U040
+13360 ; [.39FC.0020.0002.13360] # EGYPTIAN HIEROGLYPH U041
+13361 ; [.39FD.0020.0002.13361] # EGYPTIAN HIEROGLYPH U042
+13362 ; [.39FE.0020.0002.13362] # EGYPTIAN HIEROGLYPH V001
+13363 ; [.39FF.0020.0002.13363] # EGYPTIAN HIEROGLYPH V001A
+13364 ; [.3A00.0020.0002.13364] # EGYPTIAN HIEROGLYPH V001B
+13365 ; [.3A01.0020.0002.13365] # EGYPTIAN HIEROGLYPH V001C
+13366 ; [.3A02.0020.0002.13366] # EGYPTIAN HIEROGLYPH V001D
+13367 ; [.3A03.0020.0002.13367] # EGYPTIAN HIEROGLYPH V001E
+13368 ; [.3A04.0020.0002.13368] # EGYPTIAN HIEROGLYPH V001F
+13369 ; [.3A05.0020.0002.13369] # EGYPTIAN HIEROGLYPH V001G
+1336A ; [.3A06.0020.0002.1336A] # EGYPTIAN HIEROGLYPH V001H
+1336B ; [.3A07.0020.0002.1336B] # EGYPTIAN HIEROGLYPH V001I
+1336C ; [.3A08.0020.0002.1336C] # EGYPTIAN HIEROGLYPH V002
+1336D ; [.3A09.0020.0002.1336D] # EGYPTIAN HIEROGLYPH V002A
+1336E ; [.3A0A.0020.0002.1336E] # EGYPTIAN HIEROGLYPH V003
+1336F ; [.3A0B.0020.0002.1336F] # EGYPTIAN HIEROGLYPH V004
+13370 ; [.3A0C.0020.0002.13370] # EGYPTIAN HIEROGLYPH V005
+13371 ; [.3A0D.0020.0002.13371] # EGYPTIAN HIEROGLYPH V006
+13372 ; [.3A0E.0020.0002.13372] # EGYPTIAN HIEROGLYPH V007
+13373 ; [.3A0F.0020.0002.13373] # EGYPTIAN HIEROGLYPH V007A
+13374 ; [.3A10.0020.0002.13374] # EGYPTIAN HIEROGLYPH V007B
+13375 ; [.3A11.0020.0002.13375] # EGYPTIAN HIEROGLYPH V008
+13376 ; [.3A12.0020.0002.13376] # EGYPTIAN HIEROGLYPH V009
+13377 ; [.3A13.0020.0002.13377] # EGYPTIAN HIEROGLYPH V010
+13378 ; [.3A14.0020.0002.13378] # EGYPTIAN HIEROGLYPH V011
+13379 ; [.3A15.0020.0002.13379] # EGYPTIAN HIEROGLYPH V011A
+1337A ; [.3A16.0020.0002.1337A] # EGYPTIAN HIEROGLYPH V011B
+1337B ; [.3A17.0020.0002.1337B] # EGYPTIAN HIEROGLYPH V011C
+1337C ; [.3A18.0020.0002.1337C] # EGYPTIAN HIEROGLYPH V012
+1337D ; [.3A19.0020.0002.1337D] # EGYPTIAN HIEROGLYPH V012A
+1337E ; [.3A1A.0020.0002.1337E] # EGYPTIAN HIEROGLYPH V012B
+1337F ; [.3A1B.0020.0002.1337F] # EGYPTIAN HIEROGLYPH V013
+13380 ; [.3A1C.0020.0002.13380] # EGYPTIAN HIEROGLYPH V014
+13381 ; [.3A1D.0020.0002.13381] # EGYPTIAN HIEROGLYPH V015
+13382 ; [.3A1E.0020.0002.13382] # EGYPTIAN HIEROGLYPH V016
+13383 ; [.3A1F.0020.0002.13383] # EGYPTIAN HIEROGLYPH V017
+13384 ; [.3A20.0020.0002.13384] # EGYPTIAN HIEROGLYPH V018
+13385 ; [.3A21.0020.0002.13385] # EGYPTIAN HIEROGLYPH V019
+13386 ; [.3A22.0020.0002.13386] # EGYPTIAN HIEROGLYPH V020
+13387 ; [.3A23.0020.0002.13387] # EGYPTIAN HIEROGLYPH V020A
+13388 ; [.3A24.0020.0002.13388] # EGYPTIAN HIEROGLYPH V020B
+13389 ; [.3A25.0020.0002.13389] # EGYPTIAN HIEROGLYPH V020C
+1338A ; [.3A26.0020.0002.1338A] # EGYPTIAN HIEROGLYPH V020D
+1338B ; [.3A27.0020.0002.1338B] # EGYPTIAN HIEROGLYPH V020E
+1338C ; [.3A28.0020.0002.1338C] # EGYPTIAN HIEROGLYPH V020F
+1338D ; [.3A29.0020.0002.1338D] # EGYPTIAN HIEROGLYPH V020G
+1338E ; [.3A2A.0020.0002.1338E] # EGYPTIAN HIEROGLYPH V020H
+1338F ; [.3A2B.0020.0002.1338F] # EGYPTIAN HIEROGLYPH V020I
+13390 ; [.3A2C.0020.0002.13390] # EGYPTIAN HIEROGLYPH V020J
+13391 ; [.3A2D.0020.0002.13391] # EGYPTIAN HIEROGLYPH V020K
+13392 ; [.3A2E.0020.0002.13392] # EGYPTIAN HIEROGLYPH V020L
+13393 ; [.3A2F.0020.0002.13393] # EGYPTIAN HIEROGLYPH V021
+13394 ; [.3A30.0020.0002.13394] # EGYPTIAN HIEROGLYPH V022
+13395 ; [.3A31.0020.0002.13395] # EGYPTIAN HIEROGLYPH V023
+13396 ; [.3A32.0020.0002.13396] # EGYPTIAN HIEROGLYPH V023A
+13397 ; [.3A33.0020.0002.13397] # EGYPTIAN HIEROGLYPH V024
+13398 ; [.3A34.0020.0002.13398] # EGYPTIAN HIEROGLYPH V025
+13399 ; [.3A35.0020.0002.13399] # EGYPTIAN HIEROGLYPH V026
+1339A ; [.3A36.0020.0002.1339A] # EGYPTIAN HIEROGLYPH V027
+1339B ; [.3A37.0020.0002.1339B] # EGYPTIAN HIEROGLYPH V028
+1339C ; [.3A38.0020.0002.1339C] # EGYPTIAN HIEROGLYPH V028A
+1339D ; [.3A39.0020.0002.1339D] # EGYPTIAN HIEROGLYPH V029
+1339E ; [.3A3A.0020.0002.1339E] # EGYPTIAN HIEROGLYPH V029A
+1339F ; [.3A3B.0020.0002.1339F] # EGYPTIAN HIEROGLYPH V030
+133A0 ; [.3A3C.0020.0002.133A0] # EGYPTIAN HIEROGLYPH V030A
+133A1 ; [.3A3D.0020.0002.133A1] # EGYPTIAN HIEROGLYPH V031
+133A2 ; [.3A3E.0020.0002.133A2] # EGYPTIAN HIEROGLYPH V031A
+133A3 ; [.3A3F.0020.0002.133A3] # EGYPTIAN HIEROGLYPH V032
+133A4 ; [.3A40.0020.0002.133A4] # EGYPTIAN HIEROGLYPH V033
+133A5 ; [.3A41.0020.0002.133A5] # EGYPTIAN HIEROGLYPH V033A
+133A6 ; [.3A42.0020.0002.133A6] # EGYPTIAN HIEROGLYPH V034
+133A7 ; [.3A43.0020.0002.133A7] # EGYPTIAN HIEROGLYPH V035
+133A8 ; [.3A44.0020.0002.133A8] # EGYPTIAN HIEROGLYPH V036
+133A9 ; [.3A45.0020.0002.133A9] # EGYPTIAN HIEROGLYPH V037
+133AA ; [.3A46.0020.0002.133AA] # EGYPTIAN HIEROGLYPH V037A
+133AB ; [.3A47.0020.0002.133AB] # EGYPTIAN HIEROGLYPH V038
+133AC ; [.3A48.0020.0002.133AC] # EGYPTIAN HIEROGLYPH V039
+133AD ; [.3A49.0020.0002.133AD] # EGYPTIAN HIEROGLYPH V040
+133AE ; [.3A4A.0020.0002.133AE] # EGYPTIAN HIEROGLYPH V040A
+133AF ; [.3A4B.0020.0002.133AF] # EGYPTIAN HIEROGLYPH W001
+133B0 ; [.3A4C.0020.0002.133B0] # EGYPTIAN HIEROGLYPH W002
+133B1 ; [.3A4D.0020.0002.133B1] # EGYPTIAN HIEROGLYPH W003
+133B2 ; [.3A4E.0020.0002.133B2] # EGYPTIAN HIEROGLYPH W003A
+133B3 ; [.3A4F.0020.0002.133B3] # EGYPTIAN HIEROGLYPH W004
+133B4 ; [.3A50.0020.0002.133B4] # EGYPTIAN HIEROGLYPH W005
+133B5 ; [.3A51.0020.0002.133B5] # EGYPTIAN HIEROGLYPH W006
+133B6 ; [.3A52.0020.0002.133B6] # EGYPTIAN HIEROGLYPH W007
+133B7 ; [.3A53.0020.0002.133B7] # EGYPTIAN HIEROGLYPH W008
+133B8 ; [.3A54.0020.0002.133B8] # EGYPTIAN HIEROGLYPH W009
+133B9 ; [.3A55.0020.0002.133B9] # EGYPTIAN HIEROGLYPH W009A
+133BA ; [.3A56.0020.0002.133BA] # EGYPTIAN HIEROGLYPH W010
+133BB ; [.3A57.0020.0002.133BB] # EGYPTIAN HIEROGLYPH W010A
+133BC ; [.3A58.0020.0002.133BC] # EGYPTIAN HIEROGLYPH W011
+133BD ; [.3A59.0020.0002.133BD] # EGYPTIAN HIEROGLYPH W012
+133BE ; [.3A5A.0020.0002.133BE] # EGYPTIAN HIEROGLYPH W013
+133BF ; [.3A5B.0020.0002.133BF] # EGYPTIAN HIEROGLYPH W014
+133C0 ; [.3A5C.0020.0002.133C0] # EGYPTIAN HIEROGLYPH W014A
+133C1 ; [.3A5D.0020.0002.133C1] # EGYPTIAN HIEROGLYPH W015
+133C2 ; [.3A5E.0020.0002.133C2] # EGYPTIAN HIEROGLYPH W016
+133C3 ; [.3A5F.0020.0002.133C3] # EGYPTIAN HIEROGLYPH W017
+133C4 ; [.3A60.0020.0002.133C4] # EGYPTIAN HIEROGLYPH W017A
+133C5 ; [.3A61.0020.0002.133C5] # EGYPTIAN HIEROGLYPH W018
+133C6 ; [.3A62.0020.0002.133C6] # EGYPTIAN HIEROGLYPH W018A
+133C7 ; [.3A63.0020.0002.133C7] # EGYPTIAN HIEROGLYPH W019
+133C8 ; [.3A64.0020.0002.133C8] # EGYPTIAN HIEROGLYPH W020
+133C9 ; [.3A65.0020.0002.133C9] # EGYPTIAN HIEROGLYPH W021
+133CA ; [.3A66.0020.0002.133CA] # EGYPTIAN HIEROGLYPH W022
+133CB ; [.3A67.0020.0002.133CB] # EGYPTIAN HIEROGLYPH W023
+133CC ; [.3A68.0020.0002.133CC] # EGYPTIAN HIEROGLYPH W024
+133CD ; [.3A69.0020.0002.133CD] # EGYPTIAN HIEROGLYPH W024A
+133CE ; [.3A6A.0020.0002.133CE] # EGYPTIAN HIEROGLYPH W025
+133CF ; [.3A6B.0020.0002.133CF] # EGYPTIAN HIEROGLYPH X001
+133D0 ; [.3A6C.0020.0002.133D0] # EGYPTIAN HIEROGLYPH X002
+133D1 ; [.3A6D.0020.0002.133D1] # EGYPTIAN HIEROGLYPH X003
+133D2 ; [.3A6E.0020.0002.133D2] # EGYPTIAN HIEROGLYPH X004
+133D3 ; [.3A6F.0020.0002.133D3] # EGYPTIAN HIEROGLYPH X004A
+133D4 ; [.3A70.0020.0002.133D4] # EGYPTIAN HIEROGLYPH X004B
+133D5 ; [.3A71.0020.0002.133D5] # EGYPTIAN HIEROGLYPH X005
+133D6 ; [.3A72.0020.0002.133D6] # EGYPTIAN HIEROGLYPH X006
+133D7 ; [.3A73.0020.0002.133D7] # EGYPTIAN HIEROGLYPH X006A
+133D8 ; [.3A74.0020.0002.133D8] # EGYPTIAN HIEROGLYPH X007
+133D9 ; [.3A75.0020.0002.133D9] # EGYPTIAN HIEROGLYPH X008
+133DA ; [.3A76.0020.0002.133DA] # EGYPTIAN HIEROGLYPH X008A
+133DB ; [.3A77.0020.0002.133DB] # EGYPTIAN HIEROGLYPH Y001
+133DC ; [.3A78.0020.0002.133DC] # EGYPTIAN HIEROGLYPH Y001A
+133DD ; [.3A79.0020.0002.133DD] # EGYPTIAN HIEROGLYPH Y002
+133DE ; [.3A7A.0020.0002.133DE] # EGYPTIAN HIEROGLYPH Y003
+133DF ; [.3A7B.0020.0002.133DF] # EGYPTIAN HIEROGLYPH Y004
+133E0 ; [.3A7C.0020.0002.133E0] # EGYPTIAN HIEROGLYPH Y005
+133E1 ; [.3A7D.0020.0002.133E1] # EGYPTIAN HIEROGLYPH Y006
+133E2 ; [.3A7E.0020.0002.133E2] # EGYPTIAN HIEROGLYPH Y007
+133E3 ; [.3A7F.0020.0002.133E3] # EGYPTIAN HIEROGLYPH Y008
+133E4 ; [.3A80.0020.0002.133E4] # EGYPTIAN HIEROGLYPH Z001
+133E5 ; [.3A81.0020.0002.133E5] # EGYPTIAN HIEROGLYPH Z002
+133E6 ; [.3A82.0020.0002.133E6] # EGYPTIAN HIEROGLYPH Z002A
+133E7 ; [.3A83.0020.0002.133E7] # EGYPTIAN HIEROGLYPH Z002B
+133E8 ; [.3A84.0020.0002.133E8] # EGYPTIAN HIEROGLYPH Z002C
+133E9 ; [.3A85.0020.0002.133E9] # EGYPTIAN HIEROGLYPH Z002D
+133EA ; [.3A86.0020.0002.133EA] # EGYPTIAN HIEROGLYPH Z003
+133EB ; [.3A87.0020.0002.133EB] # EGYPTIAN HIEROGLYPH Z003A
+133EC ; [.3A88.0020.0002.133EC] # EGYPTIAN HIEROGLYPH Z003B
+133ED ; [.3A89.0020.0002.133ED] # EGYPTIAN HIEROGLYPH Z004
+133EE ; [.3A8A.0020.0002.133EE] # EGYPTIAN HIEROGLYPH Z004A
+133EF ; [.3A8B.0020.0002.133EF] # EGYPTIAN HIEROGLYPH Z005
+133F0 ; [.3A8C.0020.0002.133F0] # EGYPTIAN HIEROGLYPH Z005A
+133F1 ; [.3A8D.0020.0002.133F1] # EGYPTIAN HIEROGLYPH Z006
+133F2 ; [.3A8E.0020.0002.133F2] # EGYPTIAN HIEROGLYPH Z007
+133F3 ; [.3A8F.0020.0002.133F3] # EGYPTIAN HIEROGLYPH Z008
+133F4 ; [.3A90.0020.0002.133F4] # EGYPTIAN HIEROGLYPH Z009
+133F5 ; [.3A91.0020.0002.133F5] # EGYPTIAN HIEROGLYPH Z010
+133F6 ; [.3A92.0020.0002.133F6] # EGYPTIAN HIEROGLYPH Z011
+133F7 ; [.3A93.0020.0002.133F7] # EGYPTIAN HIEROGLYPH Z012
+133F8 ; [.3A94.0020.0002.133F8] # EGYPTIAN HIEROGLYPH Z013
+133F9 ; [.3A95.0020.0002.133F9] # EGYPTIAN HIEROGLYPH Z014
+133FA ; [.3A96.0020.0002.133FA] # EGYPTIAN HIEROGLYPH Z015
+133FB ; [.3A97.0020.0002.133FB] # EGYPTIAN HIEROGLYPH Z015A
+133FC ; [.3A98.0020.0002.133FC] # EGYPTIAN HIEROGLYPH Z015B
+133FD ; [.3A99.0020.0002.133FD] # EGYPTIAN HIEROGLYPH Z015C
+133FE ; [.3A9A.0020.0002.133FE] # EGYPTIAN HIEROGLYPH Z015D
+133FF ; [.3A9B.0020.0002.133FF] # EGYPTIAN HIEROGLYPH Z015E
+13400 ; [.3A9C.0020.0002.13400] # EGYPTIAN HIEROGLYPH Z015F
+13401 ; [.3A9D.0020.0002.13401] # EGYPTIAN HIEROGLYPH Z015G
+13402 ; [.3A9E.0020.0002.13402] # EGYPTIAN HIEROGLYPH Z015H
+13403 ; [.3A9F.0020.0002.13403] # EGYPTIAN HIEROGLYPH Z015I
+13404 ; [.3AA0.0020.0002.13404] # EGYPTIAN HIEROGLYPH Z016
+13405 ; [.3AA1.0020.0002.13405] # EGYPTIAN HIEROGLYPH Z016A
+13406 ; [.3AA2.0020.0002.13406] # EGYPTIAN HIEROGLYPH Z016B
+13407 ; [.3AA3.0020.0002.13407] # EGYPTIAN HIEROGLYPH Z016C
+13408 ; [.3AA4.0020.0002.13408] # EGYPTIAN HIEROGLYPH Z016D
+13409 ; [.3AA5.0020.0002.13409] # EGYPTIAN HIEROGLYPH Z016E
+1340A ; [.3AA6.0020.0002.1340A] # EGYPTIAN HIEROGLYPH Z016F
+1340B ; [.3AA7.0020.0002.1340B] # EGYPTIAN HIEROGLYPH Z016G
+1340C ; [.3AA8.0020.0002.1340C] # EGYPTIAN HIEROGLYPH Z016H
+1340D ; [.3AA9.0020.0002.1340D] # EGYPTIAN HIEROGLYPH AA001
+1340E ; [.3AAA.0020.0002.1340E] # EGYPTIAN HIEROGLYPH AA002
+1340F ; [.3AAB.0020.0002.1340F] # EGYPTIAN HIEROGLYPH AA003
+13410 ; [.3AAC.0020.0002.13410] # EGYPTIAN HIEROGLYPH AA004
+13411 ; [.3AAD.0020.0002.13411] # EGYPTIAN HIEROGLYPH AA005
+13412 ; [.3AAE.0020.0002.13412] # EGYPTIAN HIEROGLYPH AA006
+13413 ; [.3AAF.0020.0002.13413] # EGYPTIAN HIEROGLYPH AA007
+13414 ; [.3AB0.0020.0002.13414] # EGYPTIAN HIEROGLYPH AA007A
+13415 ; [.3AB1.0020.0002.13415] # EGYPTIAN HIEROGLYPH AA007B
+13416 ; [.3AB2.0020.0002.13416] # EGYPTIAN HIEROGLYPH AA008
+13417 ; [.3AB3.0020.0002.13417] # EGYPTIAN HIEROGLYPH AA009
+13418 ; [.3AB4.0020.0002.13418] # EGYPTIAN HIEROGLYPH AA010
+13419 ; [.3AB5.0020.0002.13419] # EGYPTIAN HIEROGLYPH AA011
+1341A ; [.3AB6.0020.0002.1341A] # EGYPTIAN HIEROGLYPH AA012
+1341B ; [.3AB7.0020.0002.1341B] # EGYPTIAN HIEROGLYPH AA013
+1341C ; [.3AB8.0020.0002.1341C] # EGYPTIAN HIEROGLYPH AA014
+1341D ; [.3AB9.0020.0002.1341D] # EGYPTIAN HIEROGLYPH AA015
+1341E ; [.3ABA.0020.0002.1341E] # EGYPTIAN HIEROGLYPH AA016
+1341F ; [.3ABB.0020.0002.1341F] # EGYPTIAN HIEROGLYPH AA017
+13420 ; [.3ABC.0020.0002.13420] # EGYPTIAN HIEROGLYPH AA018
+13421 ; [.3ABD.0020.0002.13421] # EGYPTIAN HIEROGLYPH AA019
+13422 ; [.3ABE.0020.0002.13422] # EGYPTIAN HIEROGLYPH AA020
+13423 ; [.3ABF.0020.0002.13423] # EGYPTIAN HIEROGLYPH AA021
+13424 ; [.3AC0.0020.0002.13424] # EGYPTIAN HIEROGLYPH AA022
+13425 ; [.3AC1.0020.0002.13425] # EGYPTIAN HIEROGLYPH AA023
+13426 ; [.3AC2.0020.0002.13426] # EGYPTIAN HIEROGLYPH AA024
+13427 ; [.3AC3.0020.0002.13427] # EGYPTIAN HIEROGLYPH AA025
+13428 ; [.3AC4.0020.0002.13428] # EGYPTIAN HIEROGLYPH AA026
+13429 ; [.3AC5.0020.0002.13429] # EGYPTIAN HIEROGLYPH AA027
+1342A ; [.3AC6.0020.0002.1342A] # EGYPTIAN HIEROGLYPH AA028
+1342B ; [.3AC7.0020.0002.1342B] # EGYPTIAN HIEROGLYPH AA029
+1342C ; [.3AC8.0020.0002.1342C] # EGYPTIAN HIEROGLYPH AA030
+1342D ; [.3AC9.0020.0002.1342D] # EGYPTIAN HIEROGLYPH AA031
+1342E ; [.3ACA.0020.0002.1342E] # EGYPTIAN HIEROGLYPH AA032
+2F00  ; [.FB40.0020.0004.4E00][.CE00.0000.0000.4E00] # KANGXI RADICAL ONE; QQK
+3220  ; [*02FF.0020.0004.3220][.FB40.0020.0004.4E00][.CE00.0000.0000.4E00][*0300.0020.001F.3220] # PARENTHESIZED IDEOGRAPH ONE; QQKN
+3280  ; [.FB40.0020.0006.4E00][.CE00.0000.0000.4E00] # CIRCLED IDEOGRAPH ONE; QQK
+3192  ; [.FB40.0020.0014.4E00][.CE00.0000.0000.4E00] # IDEOGRAPHIC ANNOTATION ONE MARK; QQK
+1F229 ; [.FB40.0020.001C.4E00][.CE00.0000.0000.4E00] # SQUARED CJK UNIFIED IDEOGRAPH-4E00; QQK
+319C  ; [.FB40.0020.0014.4E01][.CE01.0000.0000.4E01] # IDEOGRAPHIC ANNOTATION FOURTH MARK; QQK
+3226  ; [*02FF.0020.0004.3226][.FB40.0020.0004.4E03][.CE03.0000.0000.4E03][*0300.0020.001F.3226] # PARENTHESIZED IDEOGRAPH SEVEN; QQKN
+3286  ; [.FB40.0020.0006.4E03][.CE03.0000.0000.4E03] # CIRCLED IDEOGRAPH SEVEN; QQK
+3222  ; [*02FF.0020.0004.3222][.FB40.0020.0004.4E09][.CE09.0000.0000.4E09][*0300.0020.001F.3222] # PARENTHESIZED IDEOGRAPH THREE; QQKN
+1F241 ; [*0347.0020.0004.1F241][.FB40.0020.0004.4E09][.CE09.0000.0000.4E09][*0348.0020.001F.1F241] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09; QQKN
+3282  ; [.FB40.0020.0006.4E09][.CE09.0000.0000.4E09] # CIRCLED IDEOGRAPH THREE; QQK
+3194  ; [.FB40.0020.0014.4E09][.CE09.0000.0000.4E09] # IDEOGRAPHIC ANNOTATION THREE MARK; QQK
+1F22A ; [.FB40.0020.001C.4E09][.CE09.0000.0000.4E09] # SQUARED CJK UNIFIED IDEOGRAPH-4E09; QQK
+32A4  ; [.FB40.0020.0006.4E0A][.CE0A.0000.0000.4E0A] # CIRCLED IDEOGRAPH HIGH; QQK
+3196  ; [.FB40.0020.0014.4E0A][.CE0A.0000.0000.4E0A] # IDEOGRAPHIC ANNOTATION TOP MARK; QQK
+32A6  ; [.FB40.0020.0006.4E0B][.CE0B.0000.0000.4E0B] # CIRCLED IDEOGRAPH LOW; QQK
+3198  ; [.FB40.0020.0014.4E0B][.CE0B.0000.0000.4E0B] # IDEOGRAPHIC ANNOTATION BOTTOM MARK; QQK
+F967  ; [.FB40.0020.0002.4E0D][.CE0D.0000.0000.4E0D] # CJK COMPATIBILITY IDEOGRAPH-F967; QQC
+319B  ; [.FB40.0020.0014.4E19][.CE19.0000.0000.4E19] # IDEOGRAPHIC ANNOTATION THIRD MARK; QQK
+FA70  ; [.FB40.0020.0002.4E26][.CE26.0000.0000.4E26] # CJK COMPATIBILITY IDEOGRAPH-FA70; QQC
+2F01  ; [.FB40.0020.0004.4E28][.CE28.0000.0000.4E28] # KANGXI RADICAL LINE; QQK
+2EA6  ; [.FB40.0020.0004.4E2C][.CE2C.0000.0000.4E2C] # CJK RADICAL SIMPLIFIED HALF TREE TRUNK; QQK
+32A5  ; [.FB40.0020.0006.4E2D][.CE2D.0000.0000.4E2D] # CIRCLED IDEOGRAPH CENTRE; QQK
+3197  ; [.FB40.0020.0014.4E2D][.CE2D.0000.0000.4E2D] # IDEOGRAPHIC ANNOTATION MIDDLE MARK; QQK
+1F22D ; [.FB40.0020.001C.4E2D][.CE2D.0000.0000.4E2D] # SQUARED CJK UNIFIED IDEOGRAPH-4E2D; QQK
+F905  ; [.FB40.0020.0002.4E32][.CE32.0000.0000.4E32] # CJK COMPATIBILITY IDEOGRAPH-F905; QQC
+2F02  ; [.FB40.0020.0004.4E36][.CE36.0000.0000.4E36] # KANGXI RADICAL DOT; QQK
+2E80  ; [.FB40.0020.0004.4E36][.CE36.0000.0000.4E36][.0000.0159.001F.2E80] # CJK RADICAL REPEAT; QQKN
+2F801 ; [.FB40.0020.0002.4E38][.CE38.0000.0000.4E38] # CJK COMPATIBILITY IDEOGRAPH-2F801; QQC
+F95E  ; [.FB40.0020.0002.4E39][.CE39.0000.0000.4E39] # CJK COMPATIBILITY IDEOGRAPH-F95E; QQC
+2F800 ; [.FB40.0020.0002.4E3D][.CE3D.0000.0000.4E3D] # CJK COMPATIBILITY IDEOGRAPH-2F800; QQC
+2F03  ; [.FB40.0020.0004.4E3F][.CE3F.0000.0000.4E3F] # KANGXI RADICAL SLASH; QQK
+2F802 ; [.FB40.0020.0002.4E41][.CE41.0000.0000.4E41] # CJK COMPATIBILITY IDEOGRAPH-2F802; QQC
+2F04  ; [.FB40.0020.0004.4E59][.CE59.0000.0000.4E59] # KANGXI RADICAL SECOND; QQK
+319A  ; [.FB40.0020.0014.4E59][.CE59.0000.0000.4E59] # IDEOGRAPHIC ANNOTATION SECOND MARK; QQK
+2E84  ; [.FB40.0020.0004.4E59][.CE59.0000.0000.4E59][.0000.0159.001F.2E84] # CJK RADICAL SECOND THREE; QQKN
+2E83  ; [.FB40.0020.0004.4E5A][.CE5A.0000.0000.4E5A] # CJK RADICAL SECOND TWO; QQK
+2E82  ; [.FB40.0020.0004.4E5B][.CE5B.0000.0000.4E5B] # CJK RADICAL SECOND ONE; QQK
+3228  ; [*02FF.0020.0004.3228][.FB40.0020.0004.4E5D][.CE5D.0000.0000.4E5D][*0300.0020.001F.3228] # PARENTHESIZED IDEOGRAPH NINE; QQKN
+3288  ; [.FB40.0020.0006.4E5D][.CE5D.0000.0000.4E5D] # CIRCLED IDEOGRAPH NINE; QQK
+F91B  ; [.FB40.0020.0002.4E82][.CE82.0000.0000.4E82] # CJK COMPATIBILITY IDEOGRAPH-F91B; QQC
+2F05  ; [.FB40.0020.0004.4E85][.CE85.0000.0000.4E85] # KANGXI RADICAL HOOK; QQK
+F9BA  ; [.FB40.0020.0002.4E86][.CE86.0000.0000.4E86] # CJK COMPATIBILITY IDEOGRAPH-F9BA; QQC
+2F06  ; [.FB40.0020.0004.4E8C][.CE8C.0000.0000.4E8C] # KANGXI RADICAL TWO; QQK
+3221  ; [*02FF.0020.0004.3221][.FB40.0020.0004.4E8C][.CE8C.0000.0000.4E8C][*0300.0020.001F.3221] # PARENTHESIZED IDEOGRAPH TWO; QQKN
+1F242 ; [*0347.0020.0004.1F242][.FB40.0020.0004.4E8C][.CE8C.0000.0000.4E8C][*0348.0020.001F.1F242] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C; QQKN
+3281  ; [.FB40.0020.0006.4E8C][.CE8C.0000.0000.4E8C] # CIRCLED IDEOGRAPH TWO; QQK
+3193  ; [.FB40.0020.0014.4E8C][.CE8C.0000.0000.4E8C] # IDEOGRAPHIC ANNOTATION TWO MARK; QQK
+1F214 ; [.FB40.0020.001C.4E8C][.CE8C.0000.0000.4E8C] # SQUARED CJK UNIFIED IDEOGRAPH-4E8C; QQK
+3224  ; [*02FF.0020.0004.3224][.FB40.0020.0004.4E94][.CE94.0000.0000.4E94][*0300.0020.001F.3224] # PARENTHESIZED IDEOGRAPH FIVE; QQKN
+3284  ; [.FB40.0020.0006.4E94][.CE94.0000.0000.4E94] # CIRCLED IDEOGRAPH FIVE; QQK
+2F07  ; [.FB40.0020.0004.4EA0][.CEA0.0000.0000.4EA0] # KANGXI RADICAL LID; QQK
+1F218 ; [.FB40.0020.001C.4EA4][.CEA4.0000.0000.4EA4] # SQUARED CJK UNIFIED IDEOGRAPH-4EA4; QQK
+F977  ; [.FB40.0020.0002.4EAE][.CEAE.0000.0000.4EAE] # CJK COMPATIBILITY IDEOGRAPH-F977; QQC
+2F08  ; [.FB40.0020.0004.4EBA][.CEBA.0000.0000.4EBA] # KANGXI RADICAL MAN; QQK
+319F  ; [.FB40.0020.0014.4EBA][.CEBA.0000.0000.4EBA] # IDEOGRAPHIC ANNOTATION MAN MARK; QQK
+2E85  ; [.FB40.0020.0004.4EBB][.CEBB.0000.0000.4EBB] # CJK RADICAL PERSON; QQK
+F9FD  ; [.FB40.0020.0002.4EC0][.CEC0.0000.0000.4EC0] # CJK COMPATIBILITY IDEOGRAPH-F9FD; QQC
+2F819 ; [.FB40.0020.0002.4ECC][.CECC.0000.0000.4ECC] # CJK COMPATIBILITY IDEOGRAPH-2F819; QQC
+3239  ; [*02FF.0020.0004.3239][.FB40.0020.0004.4EE3][.CEE3.0000.0000.4EE3][*0300.0020.001F.3239] # PARENTHESIZED IDEOGRAPH REPRESENT; QQKN
+F9A8  ; [.FB40.0020.0002.4EE4][.CEE4.0000.0000.4EE4] # CJK COMPATIBILITY IDEOGRAPH-F9A8; QQC
+323D  ; [*02FF.0020.0004.323D][.FB40.0020.0004.4F01][.CF01.0000.0000.4F01][*0300.0020.001F.323D] # PARENTHESIZED IDEOGRAPH ENTERPRISE; QQKN
+32AD  ; [.FB40.0020.0006.4F01][.CF01.0000.0000.4F01] # CIRCLED IDEOGRAPH ENTERPRISE; QQK
+3241  ; [*02FF.0020.0004.3241][.FB40.0020.0004.4F11][.CF11.0000.0000.4F11][*0300.0020.001F.3241] # PARENTHESIZED IDEOGRAPH REST; QQKN
+32A1  ; [.FB40.0020.0006.4F11][.CF11.0000.0000.4F11] # CIRCLED IDEOGRAPH REST; QQK
+2F804 ; [.FB40.0020.0002.4F60][.CF60.0000.0000.4F60] # CJK COMPATIBILITY IDEOGRAPH-2F804; QQC
+FA73  ; [.FB40.0020.0002.4F80][.CF80.0000.0000.4F80] # CJK COMPATIBILITY IDEOGRAPH-FA73; QQC
+F92D  ; [.FB40.0020.0002.4F86][.CF86.0000.0000.4F86] # CJK COMPATIBILITY IDEOGRAPH-F92D; QQC
+F9B5  ; [.FB40.0020.0002.4F8B][.CF8B.0000.0000.4F8B] # CJK COMPATIBILITY IDEOGRAPH-F9B5; QQC
+FA30  ; [.FB40.0020.0002.4FAE][.CFAE.0000.0000.4FAE] # CJK COMPATIBILITY IDEOGRAPH-FA30; QQC
+2F805 ; [.FB40.0020.0002.4FAE][.CFAE.0000.0000.4FAE] # CJK COMPATIBILITY IDEOGRAPH-2F805; QQC
+2F806 ; [.FB40.0020.0002.4FBB][.CFBB.0000.0000.4FBB] # CJK COMPATIBILITY IDEOGRAPH-2F806; QQC
+F965  ; [.FB40.0020.0002.4FBF][.CFBF.0000.0000.4FBF] # CJK COMPATIBILITY IDEOGRAPH-F965; QQC
+2F807 ; [.FB40.0020.0002.5002][.D002.0000.0000.5002] # CJK COMPATIBILITY IDEOGRAPH-2F807; QQC
+F9D4  ; [.FB40.0020.0002.502B][.D02B.0000.0000.502B] # CJK COMPATIBILITY IDEOGRAPH-F9D4; QQC
+2F808 ; [.FB40.0020.0002.507A][.D07A.0000.0000.507A] # CJK COMPATIBILITY IDEOGRAPH-2F808; QQC
+2F809 ; [.FB40.0020.0002.5099][.D099.0000.0000.5099] # CJK COMPATIBILITY IDEOGRAPH-2F809; QQC
+2F80B ; [.FB40.0020.0002.50CF][.D0CF.0000.0000.50CF] # CJK COMPATIBILITY IDEOGRAPH-2F80B; QQC
+F9BB  ; [.FB40.0020.0002.50DA][.D0DA.0000.0000.50DA] # CJK COMPATIBILITY IDEOGRAPH-F9BB; QQC
+FA31  ; [.FB40.0020.0002.50E7][.D0E7.0000.0000.50E7] # CJK COMPATIBILITY IDEOGRAPH-FA31; QQC
+2F80A ; [.FB40.0020.0002.50E7][.D0E7.0000.0000.50E7] # CJK COMPATIBILITY IDEOGRAPH-2F80A; QQC
+329D  ; [.FB40.0020.0006.512A][.D12A.0000.0000.512A] # CIRCLED IDEOGRAPH EXCELLENT; QQK
+2F09  ; [.FB40.0020.0004.513F][.D13F.0000.0000.513F] # KANGXI RADICAL LEGS; QQK
+FA0C  ; [.FB40.0020.0002.5140][.D140.0000.0000.5140] # CJK COMPATIBILITY IDEOGRAPH-FA0C; QQC
+FA74  ; [.FB40.0020.0002.5145][.D145.0000.0000.5145] # CJK COMPATIBILITY IDEOGRAPH-FA74; QQC
+FA32  ; [.FB40.0020.0002.514D][.D14D.0000.0000.514D] # CJK COMPATIBILITY IDEOGRAPH-FA32; QQC
+2F80E ; [.FB40.0020.0002.514D][.D14D.0000.0000.514D] # CJK COMPATIBILITY IDEOGRAPH-2F80E; QQC
+2F80F ; [.FB40.0020.0002.5154][.D154.0000.0000.5154] # CJK COMPATIBILITY IDEOGRAPH-2F80F; QQC
+2F810 ; [.FB40.0020.0002.5164][.D164.0000.0000.5164] # CJK COMPATIBILITY IDEOGRAPH-2F810; QQC
+2F0A  ; [.FB40.0020.0004.5165][.D165.0000.0000.5165] # KANGXI RADICAL ENTER; QQK
+2F814 ; [.FB40.0020.0002.5167][.D167.0000.0000.5167] # CJK COMPATIBILITY IDEOGRAPH-2F814; QQC
+FA72  ; [.FB40.0020.0002.5168][.D168.0000.0000.5168] # CJK COMPATIBILITY IDEOGRAPH-FA72; QQC
+F978  ; [.FB40.0020.0002.5169][.D169.0000.0000.5169] # CJK COMPATIBILITY IDEOGRAPH-F978; QQC
+2F0B  ; [.FB40.0020.0004.516B][.D16B.0000.0000.516B] # KANGXI RADICAL EIGHT; QQK
+3227  ; [*02FF.0020.0004.3227][.FB40.0020.0004.516B][.D16B.0000.0000.516B][*0300.0020.001F.3227] # PARENTHESIZED IDEOGRAPH EIGHT; QQKN
+3287  ; [.FB40.0020.0006.516B][.D16B.0000.0000.516B] # CIRCLED IDEOGRAPH EIGHT; QQK
+F9D1  ; [.FB40.0020.0002.516D][.D16D.0000.0000.516D] # CJK COMPATIBILITY IDEOGRAPH-F9D1; QQC
+3225  ; [*02FF.0020.0004.3225][.FB40.0020.0004.516D][.D16D.0000.0000.516D][*0300.0020.001F.3225] # PARENTHESIZED IDEOGRAPH SIX; QQKN
+3285  ; [.FB40.0020.0006.516D][.D16D.0000.0000.516D] # CIRCLED IDEOGRAPH SIX; QQK
+2F811 ; [.FB40.0020.0002.5177][.D177.0000.0000.5177] # CJK COMPATIBILITY IDEOGRAPH-2F811; QQC
+FA75  ; [.FB40.0020.0002.5180][.D180.0000.0000.5180] # CJK COMPATIBILITY IDEOGRAPH-FA75; QQC
+2F0C  ; [.FB40.0020.0004.5182][.D182.0000.0000.5182] # KANGXI RADICAL DOWN BOX; QQK
+2E86  ; [.FB40.0020.0004.5182][.D182.0000.0000.5182][.0000.0159.001F.2E86] # CJK RADICAL BOX; QQKN
+2F815 ; [.FB40.0020.0002.518D][.D18D.0000.0000.518D] # CJK COMPATIBILITY IDEOGRAPH-2F815; QQC
+1F21E ; [.FB40.0020.001C.518D][.D18D.0000.0000.518D] # SQUARED CJK UNIFIED IDEOGRAPH-518D; QQK
+2F8D2 ; [.FB40.0020.0002.5192][.D192.0000.0000.5192] # CJK COMPATIBILITY IDEOGRAPH-2F8D2; QQC
+2F8D3 ; [.FB40.0020.0002.5195][.D195.0000.0000.5195] # CJK COMPATIBILITY IDEOGRAPH-2F8D3; QQC
+2F0D  ; [.FB40.0020.0004.5196][.D196.0000.0000.5196] # KANGXI RADICAL COVER; QQK
+2F817 ; [.FB40.0020.0002.5197][.D197.0000.0000.5197] # CJK COMPATIBILITY IDEOGRAPH-2F817; QQC
+32A2  ; [.FB40.0020.0006.5199][.D199.0000.0000.5199] # CIRCLED IDEOGRAPH COPY; QQK
+2F818 ; [.FB40.0020.0002.51A4][.D1A4.0000.0000.51A4] # CJK COMPATIBILITY IDEOGRAPH-2F818; QQC
+2F0E  ; [.FB40.0020.0004.51AB][.D1AB.0000.0000.51AB] # KANGXI RADICAL ICE; QQK
+2F81A ; [.FB40.0020.0002.51AC][.D1AC.0000.0000.51AC] # CJK COMPATIBILITY IDEOGRAPH-2F81A; QQC
+FA71  ; [.FB40.0020.0002.51B5][.D1B5.0000.0000.51B5] # CJK COMPATIBILITY IDEOGRAPH-FA71; QQC
+2F81B ; [.FB40.0020.0002.51B5][.D1B5.0000.0000.51B5] # CJK COMPATIBILITY IDEOGRAPH-2F81B; QQC
+F92E  ; [.FB40.0020.0002.51B7][.D1B7.0000.0000.51B7] # CJK COMPATIBILITY IDEOGRAPH-F92E; QQC
+F979  ; [.FB40.0020.0002.51C9][.D1C9.0000.0000.51C9] # CJK COMPATIBILITY IDEOGRAPH-F979; QQC
+F955  ; [.FB40.0020.0002.51CC][.D1CC.0000.0000.51CC] # CJK COMPATIBILITY IDEOGRAPH-F955; QQC
+F954  ; [.FB40.0020.0002.51DC][.D1DC.0000.0000.51DC] # CJK COMPATIBILITY IDEOGRAPH-F954; QQC
+FA15  ; [.FB40.0020.0002.51DE][.D1DE.0000.0000.51DE] # CJK COMPATIBILITY IDEOGRAPH-FA15; QQC
+2F0F  ; [.FB40.0020.0004.51E0][.D1E0.0000.0000.51E0] # KANGXI RADICAL TABLE; QQK
+2E87  ; [.FB40.0020.0004.51E0][.D1E0.0000.0000.51E0][.0000.0159.001F.2E87] # CJK RADICAL TABLE; QQKN
+2F81D ; [.FB40.0020.0002.51F5][.D1F5.0000.0000.51F5] # CJK COMPATIBILITY IDEOGRAPH-2F81D; QQC
+2F10  ; [.FB40.0020.0004.51F5][.D1F5.0000.0000.51F5] # KANGXI RADICAL OPEN BOX; QQK
+2F11  ; [.FB40.0020.0004.5200][.D200.0000.0000.5200] # KANGXI RADICAL KNIFE; QQK
+2E88  ; [.FB40.0020.0004.5200][.D200.0000.0000.5200][.0000.0159.001F.2E88] # CJK RADICAL KNIFE ONE; QQKN
+2E89  ; [.FB40.0020.0004.5202][.D202.0000.0000.5202] # CJK RADICAL KNIFE TWO; QQK
+2F81E ; [.FB40.0020.0002.5203][.D203.0000.0000.5203] # CJK COMPATIBILITY IDEOGRAPH-2F81E; QQC
+FA00  ; [.FB40.0020.0002.5207][.D207.0000.0000.5207] # CJK COMPATIBILITY IDEOGRAPH-FA00; QQC
+2F850 ; [.FB40.0020.0002.5207][.D207.0000.0000.5207] # CJK COMPATIBILITY IDEOGRAPH-2F850; QQC
+F99C  ; [.FB40.0020.0002.5217][.D217.0000.0000.5217] # CJK COMPATIBILITY IDEOGRAPH-F99C; QQC
+1F220 ; [.FB40.0020.001C.521D][.D21D.0000.0000.521D] # SQUARED CJK UNIFIED IDEOGRAPH-521D; QQK
+F9DD  ; [.FB40.0020.0002.5229][.D229.0000.0000.5229] # CJK COMPATIBILITY IDEOGRAPH-F9DD; QQC
+F9FF  ; [.FB40.0020.0002.523A][.D23A.0000.0000.523A] # CJK COMPATIBILITY IDEOGRAPH-F9FF; QQC
+2F820 ; [.FB40.0020.0002.523B][.D23B.0000.0000.523B] # CJK COMPATIBILITY IDEOGRAPH-2F820; QQC
+2F821 ; [.FB40.0020.0002.5246][.D246.0000.0000.5246] # CJK COMPATIBILITY IDEOGRAPH-2F821; QQC
+1F21C ; [.FB40.0020.001C.524D][.D24D.0000.0000.524D] # SQUARED CJK UNIFIED IDEOGRAPH-524D; QQK
+2F822 ; [.FB40.0020.0002.5272][.D272.0000.0000.5272] # CJK COMPATIBILITY IDEOGRAPH-2F822; QQC
+2F823 ; [.FB40.0020.0002.5277][.D277.0000.0000.5277] # CJK COMPATIBILITY IDEOGRAPH-2F823; QQC
+F9C7  ; [.FB40.0020.0002.5289][.D289.0000.0000.5289] # CJK COMPATIBILITY IDEOGRAPH-F9C7; QQC
+F98A  ; [.FB40.0020.0002.529B][.D29B.0000.0000.529B] # CJK COMPATIBILITY IDEOGRAPH-F98A; QQC
+2F12  ; [.FB40.0020.0004.529B][.D29B.0000.0000.529B] # KANGXI RADICAL POWER; QQK
+F99D  ; [.FB40.0020.0002.52A3][.D2A3.0000.0000.52A3] # CJK COMPATIBILITY IDEOGRAPH-F99D; QQC
+2F992 ; [.FB40.0020.0002.52B3][.D2B3.0000.0000.52B3] # CJK COMPATIBILITY IDEOGRAPH-2F992; QQC
+3238  ; [*02FF.0020.0004.3238][.FB40.0020.0004.52B4][.D2B4.0000.0000.52B4][*0300.0020.001F.3238] # PARENTHESIZED IDEOGRAPH LABOR; QQKN
+3298  ; [.FB40.0020.0006.52B4][.D2B4.0000.0000.52B4] # CIRCLED IDEOGRAPH LABOR; QQK
+FA76  ; [.FB40.0020.0002.52C7][.D2C7.0000.0000.52C7] # CJK COMPATIBILITY IDEOGRAPH-FA76; QQC
+2F825 ; [.FB40.0020.0002.52C7][.D2C7.0000.0000.52C7] # CJK COMPATIBILITY IDEOGRAPH-2F825; QQC
+FA33  ; [.FB40.0020.0002.52C9][.D2C9.0000.0000.52C9] # CJK COMPATIBILITY IDEOGRAPH-FA33; QQC
+2F826 ; [.FB40.0020.0002.52C9][.D2C9.0000.0000.52C9] # CJK COMPATIBILITY IDEOGRAPH-2F826; QQC
+F952  ; [.FB40.0020.0002.52D2][.D2D2.0000.0000.52D2] # CJK COMPATIBILITY IDEOGRAPH-F952; QQC
+1F247 ; [*0347.0020.0004.1F247][.FB40.0020.0004.52DD][.D2DD.0000.0000.52DD][*0348.0020.001F.1F247] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-52DD; QQKN
+F92F  ; [.FB40.0020.0002.52DE][.D2DE.0000.0000.52DE] # CJK COMPATIBILITY IDEOGRAPH-F92F; QQC
+FA34  ; [.FB40.0020.0002.52E4][.D2E4.0000.0000.52E4] # CJK COMPATIBILITY IDEOGRAPH-FA34; QQC
+2F827 ; [.FB40.0020.0002.52E4][.D2E4.0000.0000.52E4] # CJK COMPATIBILITY IDEOGRAPH-2F827; QQC
+F97F  ; [.FB40.0020.0002.52F5][.D2F5.0000.0000.52F5] # CJK COMPATIBILITY IDEOGRAPH-F97F; QQC
+2F13  ; [.FB40.0020.0004.52F9][.D2F9.0000.0000.52F9] # KANGXI RADICAL WRAP; QQK
+FA77  ; [.FB40.0020.0002.52FA][.D2FA.0000.0000.52FA] # CJK COMPATIBILITY IDEOGRAPH-FA77; QQC
+2F828 ; [.FB40.0020.0002.52FA][.D2FA.0000.0000.52FA] # CJK COMPATIBILITY IDEOGRAPH-2F828; QQC
+2F829 ; [.FB40.0020.0002.5305][.D305.0000.0000.5305] # CJK COMPATIBILITY IDEOGRAPH-2F829; QQC
+2F82A ; [.FB40.0020.0002.5306][.D306.0000.0000.5306] # CJK COMPATIBILITY IDEOGRAPH-2F82A; QQC
+2F14  ; [.FB40.0020.0004.5315][.D315.0000.0000.5315] # KANGXI RADICAL SPOON; QQK
+F963  ; [.FB40.0020.0002.5317][.D317.0000.0000.5317] # CJK COMPATIBILITY IDEOGRAPH-F963; QQC
+2F82B ; [.FB40.0020.0002.5317][.D317.0000.0000.5317] # CJK COMPATIBILITY IDEOGRAPH-2F82B; QQC
+2F15  ; [.FB40.0020.0004.531A][.D31A.0000.0000.531A] # KANGXI RADICAL RIGHT OPEN BOX; QQK
+2F16  ; [.FB40.0020.0004.5338][.D338.0000.0000.5338] # KANGXI RADICAL HIDING ENCLOSURE; QQK
+32A9  ; [.FB40.0020.0006.533B][.D33B.0000.0000.533B] # CIRCLED IDEOGRAPH MEDICINE; QQK
+F9EB  ; [.FB40.0020.0002.533F][.D33F.0000.0000.533F] # CJK COMPATIBILITY IDEOGRAPH-F9EB; QQC
+2F17  ; [.FB40.0020.0004.5341][.D341.0000.0000.5341] # KANGXI RADICAL TEN; QQK
+3038  ; [.FB40.0020.0004.5341][.D341.0000.0000.5341] # HANGZHOU NUMERAL TEN; QQK
+3229  ; [*02FF.0020.0004.3229][.FB40.0020.0004.5341][.D341.0000.0000.5341][*0300.0020.001F.3229] # PARENTHESIZED IDEOGRAPH TEN; QQKN
+3289  ; [.FB40.0020.0006.5341][.D341.0000.0000.5341] # CIRCLED IDEOGRAPH TEN; QQK
+3039  ; [.FB40.0020.0004.5344][.D344.0000.0000.5344] # HANGZHOU NUMERAL TWENTY; QQK
+303A  ; [.FB40.0020.0004.5345][.D345.0000.0000.5345] # HANGZHOU NUMERAL THIRTY; QQK
+2F82C ; [.FB40.0020.0002.5349][.D349.0000.0000.5349] # CJK COMPATIBILITY IDEOGRAPH-2F82C; QQC
+FA35  ; [.FB40.0020.0002.5351][.D351.0000.0000.5351] # CJK COMPATIBILITY IDEOGRAPH-FA35; QQC
+2F82D ; [.FB40.0020.0002.5351][.D351.0000.0000.5351] # CJK COMPATIBILITY IDEOGRAPH-2F82D; QQC
+323F  ; [*02FF.0020.0004.323F][.FB40.0020.0004.5354][.D354.0000.0000.5354][*0300.0020.001F.323F] # PARENTHESIZED IDEOGRAPH ALLIANCE; QQKN
+32AF  ; [.FB40.0020.0006.5354][.D354.0000.0000.5354] # CIRCLED IDEOGRAPH ALLIANCE; QQK
+2F82E ; [.FB40.0020.0002.535A][.D35A.0000.0000.535A] # CJK COMPATIBILITY IDEOGRAPH-2F82E; QQC
+2F18  ; [.FB40.0020.0004.535C][.D35C.0000.0000.535C] # KANGXI RADICAL DIVINATION; QQK
+2E8A  ; [.FB40.0020.0004.535C][.D35C.0000.0000.535C][.0000.0159.001F.2E8A] # CJK RADICAL DIVINATION; QQKN
+2F19  ; [.FB40.0020.0004.5369][.D369.0000.0000.5369] # KANGXI RADICAL SEAL; QQK
+2E8B  ; [.FB40.0020.0004.5369][.D369.0000.0000.5369][.0000.0159.001F.2E8B] # CJK RADICAL SEAL; QQKN
+329E  ; [.FB40.0020.0006.5370][.D370.0000.0000.5370] # CIRCLED IDEOGRAPH PRINT; QQK
+2F82F ; [.FB40.0020.0002.5373][.D373.0000.0000.5373] # CJK COMPATIBILITY IDEOGRAPH-2F82F; QQC
+F91C  ; [.FB40.0020.0002.5375][.D375.0000.0000.5375] # CJK COMPATIBILITY IDEOGRAPH-F91C; QQC
+2F830 ; [.FB40.0020.0002.537D][.D37D.0000.0000.537D] # CJK COMPATIBILITY IDEOGRAPH-2F830; QQC
+2F831 ; [.FB40.0020.0002.537F][.D37F.0000.0000.537F] # CJK COMPATIBILITY IDEOGRAPH-2F831; QQC
+2F832 ; [.FB40.0020.0002.537F][.D37F.0000.0000.537F] # CJK COMPATIBILITY IDEOGRAPH-2F832; QQC
+2F833 ; [.FB40.0020.0002.537F][.D37F.0000.0000.537F] # CJK COMPATIBILITY IDEOGRAPH-2F833; QQC
+2F1A  ; [.FB40.0020.0004.5382][.D382.0000.0000.5382] # KANGXI RADICAL CLIFF; QQK
+2E81  ; [.FB40.0020.0004.5382][.D382.0000.0000.5382][.0000.0159.001F.2E81] # CJK RADICAL CLIFF; QQKN
+2F1B  ; [.FB40.0020.0004.53B6][.D3B6.0000.0000.53B6] # KANGXI RADICAL PRIVATE; QQK
+F96B  ; [.FB40.0020.0002.53C3][.D3C3.0000.0000.53C3] # CJK COMPATIBILITY IDEOGRAPH-F96B; QQC
+2F1C  ; [.FB40.0020.0004.53C8][.D3C8.0000.0000.53C8] # KANGXI RADICAL AGAIN; QQK
+2F836 ; [.FB40.0020.0002.53CA][.D3CA.0000.0000.53CA] # CJK COMPATIBILITY IDEOGRAPH-2F836; QQC
+1F212 ; [.FB40.0020.001C.53CC][.D3CC.0000.0000.53CC] # SQUARED CJK UNIFIED IDEOGRAPH-53CC; QQK
+2F837 ; [.FB40.0020.0002.53DF][.D3DF.0000.0000.53DF] # CJK COMPATIBILITY IDEOGRAPH-2F837; QQC
+2F1D  ; [.FB40.0020.0004.53E3][.D3E3.0000.0000.53E3] # KANGXI RADICAL MOUTH; QQK
+F906  ; [.FB40.0020.0002.53E5][.D3E5.0000.0000.53E5] # CJK COMPATIBILITY IDEOGRAPH-F906; QQC
+2F839 ; [.FB40.0020.0002.53EB][.D3EB.0000.0000.53EB] # CJK COMPATIBILITY IDEOGRAPH-2F839; QQC
+2F83A ; [.FB40.0020.0002.53F1][.D3F1.0000.0000.53F1] # CJK COMPATIBILITY IDEOGRAPH-2F83A; QQC
+32A8  ; [.FB40.0020.0006.53F3][.D3F3.0000.0000.53F3] # CIRCLED IDEOGRAPH RIGHT; QQK
+1F22E ; [.FB40.0020.001C.53F3][.D3F3.0000.0000.53F3] # SQUARED CJK UNIFIED IDEOGRAPH-53F3; QQK
+2F83B ; [.FB40.0020.0002.5406][.D406.0000.0000.5406] # CJK COMPATIBILITY IDEOGRAPH-2F83B; QQC
+3234  ; [*02FF.0020.0004.3234][.FB40.0020.0004.540D][.D40D.0000.0000.540D][*0300.0020.001F.3234] # PARENTHESIZED IDEOGRAPH NAME; QQKN
+3294  ; [.FB40.0020.0006.540D][.D40D.0000.0000.540D] # CIRCLED IDEOGRAPH NAME; QQK
+F9DE  ; [.FB40.0020.0002.540F][.D40F.0000.0000.540F] # CJK COMPATIBILITY IDEOGRAPH-F9DE; QQC
+F9ED  ; [.FB40.0020.0002.541D][.D41D.0000.0000.541D] # CJK COMPATIBILITY IDEOGRAPH-F9ED; QQC
+2F83D ; [.FB40.0020.0002.5438][.D438.0000.0000.5438] # CJK COMPATIBILITY IDEOGRAPH-2F83D; QQC
+1F225 ; [.FB40.0020.001C.5439][.D439.0000.0000.5439] # SQUARED CJK UNIFIED IDEOGRAPH-5439; QQK
+F980  ; [.FB40.0020.0002.5442][.D442.0000.0000.5442] # CJK COMPATIBILITY IDEOGRAPH-F980; QQC
+2F83E ; [.FB40.0020.0002.5448][.D448.0000.0000.5448] # CJK COMPATIBILITY IDEOGRAPH-2F83E; QQC
+2F83F ; [.FB40.0020.0002.5468][.D468.0000.0000.5468] # CJK COMPATIBILITY IDEOGRAPH-2F83F; QQC
+323A  ; [*02FF.0020.0004.323A][.FB40.0020.0004.547C][.D47C.0000.0000.547C][*0300.0020.001F.323A] # PARENTHESIZED IDEOGRAPH CALL; QQKN
+2F83C ; [.FB40.0020.0002.549E][.D49E.0000.0000.549E] # CJK COMPATIBILITY IDEOGRAPH-2F83C; QQC
+2F840 ; [.FB40.0020.0002.54A2][.D4A2.0000.0000.54A2] # CJK COMPATIBILITY IDEOGRAPH-2F840; QQC
+F99E  ; [.FB40.0020.0002.54BD][.D4BD.0000.0000.54BD] # CJK COMPATIBILITY IDEOGRAPH-F99E; QQC
+2F841 ; [.FB40.0020.0002.54F6][.D4F6.0000.0000.54F6] # CJK COMPATIBILITY IDEOGRAPH-2F841; QQC
+2F842 ; [.FB40.0020.0002.5510][.D510.0000.0000.5510] # CJK COMPATIBILITY IDEOGRAPH-2F842; QQC
+3244  ; [.FB40.0020.0006.554F][.D54F.0000.0000.554F] # CIRCLED IDEOGRAPH QUESTION; QQK
+2F843 ; [.FB40.0020.0002.5553][.D553.0000.0000.5553] # CJK COMPATIBILITY IDEOGRAPH-2F843; QQC
+FA79  ; [.FB40.0020.0002.5555][.D555.0000.0000.5555] # CJK COMPATIBILITY IDEOGRAPH-FA79; QQC
+2F844 ; [.FB40.0020.0002.5563][.D563.0000.0000.5563] # CJK COMPATIBILITY IDEOGRAPH-2F844; QQC
+2F845 ; [.FB40.0020.0002.5584][.D584.0000.0000.5584] # CJK COMPATIBILITY IDEOGRAPH-2F845; QQC
+2F846 ; [.FB40.0020.0002.5584][.D584.0000.0000.5584] # CJK COMPATIBILITY IDEOGRAPH-2F846; QQC
+F90B  ; [.FB40.0020.0002.5587][.D587.0000.0000.5587] # CJK COMPATIBILITY IDEOGRAPH-F90B; QQC
+FA7A  ; [.FB40.0020.0002.5599][.D599.0000.0000.5599] # CJK COMPATIBILITY IDEOGRAPH-FA7A; QQC
+2F847 ; [.FB40.0020.0002.5599][.D599.0000.0000.5599] # CJK COMPATIBILITY IDEOGRAPH-2F847; QQC
+FA36  ; [.FB40.0020.0002.559D][.D59D.0000.0000.559D] # CJK COMPATIBILITY IDEOGRAPH-FA36; QQC
+FA78  ; [.FB40.0020.0002.559D][.D59D.0000.0000.559D] # CJK COMPATIBILITY IDEOGRAPH-FA78; QQC
+2F848 ; [.FB40.0020.0002.55AB][.D5AB.0000.0000.55AB] # CJK COMPATIBILITY IDEOGRAPH-2F848; QQC
+2F849 ; [.FB40.0020.0002.55B3][.D5B3.0000.0000.55B3] # CJK COMPATIBILITY IDEOGRAPH-2F849; QQC
+FA0D  ; [.FB40.0020.0002.55C0][.D5C0.0000.0000.55C0] # CJK COMPATIBILITY IDEOGRAPH-FA0D; QQC
+2F84A ; [.FB40.0020.0002.55C2][.D5C2.0000.0000.55C2] # CJK COMPATIBILITY IDEOGRAPH-2F84A; QQC
+FA7B  ; [.FB40.0020.0002.55E2][.D5E2.0000.0000.55E2] # CJK COMPATIBILITY IDEOGRAPH-FA7B; QQC
+FA37  ; [.FB40.0020.0002.5606][.D606.0000.0000.5606] # CJK COMPATIBILITY IDEOGRAPH-FA37; QQC
+2F84C ; [.FB40.0020.0002.5606][.D606.0000.0000.5606] # CJK COMPATIBILITY IDEOGRAPH-2F84C; QQC
+2F84E ; [.FB40.0020.0002.5651][.D651.0000.0000.5651] # CJK COMPATIBILITY IDEOGRAPH-2F84E; QQC
+FA38  ; [.FB40.0020.0002.5668][.D668.0000.0000.5668] # CJK COMPATIBILITY IDEOGRAPH-FA38; QQC
+2F84F ; [.FB40.0020.0002.5674][.D674.0000.0000.5674] # CJK COMPATIBILITY IDEOGRAPH-2F84F; QQC
+2F1E  ; [.FB40.0020.0004.56D7][.D6D7.0000.0000.56D7] # KANGXI RADICAL ENCLOSURE; QQK
+3223  ; [*02FF.0020.0004.3223][.FB40.0020.0004.56DB][.D6DB.0000.0000.56DB][*0300.0020.001F.3223] # PARENTHESIZED IDEOGRAPH FOUR; QQKN
+3283  ; [.FB40.0020.0006.56DB][.D6DB.0000.0000.56DB] # CIRCLED IDEOGRAPH FOUR; QQK
+3195  ; [.FB40.0020.0014.56DB][.D6DB.0000.0000.56DB] # IDEOGRAPHIC ANNOTATION FOUR MARK; QQK
+F9A9  ; [.FB40.0020.0002.56F9][.D6F9.0000.0000.56F9] # CJK COMPATIBILITY IDEOGRAPH-F9A9; QQC
+2F84B ; [.FB40.0020.0002.5716][.D716.0000.0000.5716] # CJK COMPATIBILITY IDEOGRAPH-2F84B; QQC
+2F84D ; [.FB40.0020.0002.5717][.D717.0000.0000.5717] # CJK COMPATIBILITY IDEOGRAPH-2F84D; QQC
+2F1F  ; [.FB40.0020.0004.571F][.D71F.0000.0000.571F] # KANGXI RADICAL EARTH; QQK
+322F  ; [*02FF.0020.0004.322F][.FB40.0020.0004.571F][.D71F.0000.0000.571F][*0300.0020.001F.322F] # PARENTHESIZED IDEOGRAPH EARTH; QQKN
+328F  ; [.FB40.0020.0006.571F][.D71F.0000.0000.571F] # CIRCLED IDEOGRAPH EARTH; QQK
+319E  ; [.FB40.0020.0014.5730][.D730.0000.0000.5730] # IDEOGRAPHIC ANNOTATION EARTH MARK; QQK
+2F855 ; [.FB40.0020.0002.578B][.D78B.0000.0000.578B] # CJK COMPATIBILITY IDEOGRAPH-2F855; QQC
+2F852 ; [.FB40.0020.0002.57CE][.D7CE.0000.0000.57CE] # CJK COMPATIBILITY IDEOGRAPH-2F852; QQC
+2F853 ; [.FB40.0020.0002.57F4][.D7F4.0000.0000.57F4] # CJK COMPATIBILITY IDEOGRAPH-2F853; QQC
+2F854 ; [.FB40.0020.0002.580D][.D80D.0000.0000.580D] # CJK COMPATIBILITY IDEOGRAPH-2F854; QQC
+2F857 ; [.FB40.0020.0002.5831][.D831.0000.0000.5831] # CJK COMPATIBILITY IDEOGRAPH-2F857; QQC
+2F856 ; [.FB40.0020.0002.5832][.D832.0000.0000.5832] # CJK COMPATIBILITY IDEOGRAPH-2F856; QQC
+FA39  ; [.FB40.0020.0002.5840][.D840.0000.0000.5840] # CJK COMPATIBILITY IDEOGRAPH-FA39; QQC
+FA10  ; [.FB40.0020.0002.585A][.D85A.0000.0000.585A] # CJK COMPATIBILITY IDEOGRAPH-FA10; QQC
+FA7C  ; [.FB40.0020.0002.585A][.D85A.0000.0000.585A] # CJK COMPATIBILITY IDEOGRAPH-FA7C; QQC
+F96C  ; [.FB40.0020.0002.585E][.D85E.0000.0000.585E] # CJK COMPATIBILITY IDEOGRAPH-F96C; QQC
+FA3A  ; [.FB40.0020.0002.58A8][.D8A8.0000.0000.58A8] # CJK COMPATIBILITY IDEOGRAPH-FA3A; QQC
+2F858 ; [.FB40.0020.0002.58AC][.D8AC.0000.0000.58AC] # CJK COMPATIBILITY IDEOGRAPH-2F858; QQC
+FA7D  ; [.FB40.0020.0002.58B3][.D8B3.0000.0000.58B3] # CJK COMPATIBILITY IDEOGRAPH-FA7D; QQC
+F94A  ; [.FB40.0020.0002.58D8][.D8D8.0000.0000.58D8] # CJK COMPATIBILITY IDEOGRAPH-F94A; QQC
+F942  ; [.FB40.0020.0002.58DF][.D8DF.0000.0000.58DF] # CJK COMPATIBILITY IDEOGRAPH-F942; QQC
+2F20  ; [.FB40.0020.0004.58EB][.D8EB.0000.0000.58EB] # KANGXI RADICAL SCHOLAR; QQK
+2F851 ; [.FB40.0020.0002.58EE][.D8EE.0000.0000.58EE] # CJK COMPATIBILITY IDEOGRAPH-2F851; QQC
+1F224 ; [.FB40.0020.001C.58F0][.D8F0.0000.0000.58F0] # SQUARED CJK UNIFIED IDEOGRAPH-58F0; QQK
+2F85A ; [.FB40.0020.0002.58F2][.D8F2.0000.0000.58F2] # CJK COMPATIBILITY IDEOGRAPH-2F85A; QQC
+2F85B ; [.FB40.0020.0002.58F7][.D8F7.0000.0000.58F7] # CJK COMPATIBILITY IDEOGRAPH-2F85B; QQC
+2F21  ; [.FB40.0020.0004.5902][.D902.0000.0000.5902] # KANGXI RADICAL GO; QQK
+2F85C ; [.FB40.0020.0002.5906][.D906.0000.0000.5906] # CJK COMPATIBILITY IDEOGRAPH-2F85C; QQC
+2F22  ; [.FB40.0020.0004.590A][.D90A.0000.0000.590A] # KANGXI RADICAL GO SLOWLY; QQK
+2F23  ; [.FB40.0020.0004.5915][.D915.0000.0000.5915] # KANGXI RADICAL EVENING; QQK
+2F85D ; [.FB40.0020.0002.591A][.D91A.0000.0000.591A] # CJK COMPATIBILITY IDEOGRAPH-2F85D; QQC
+1F215 ; [.FB40.0020.001C.591A][.D91A.0000.0000.591A] # SQUARED CJK UNIFIED IDEOGRAPH-591A; QQK
+32B0  ; [.FB40.0020.0006.591C][.D91C.0000.0000.591C] # CIRCLED IDEOGRAPH NIGHT; QQK
+2F85E ; [.FB40.0020.0002.5922][.D922.0000.0000.5922] # CJK COMPATIBILITY IDEOGRAPH-2F85E; QQC
+2F24  ; [.FB40.0020.0004.5927][.D927.0000.0000.5927] # KANGXI RADICAL BIG; QQK
+337D  ; [.FB40.0020.001C.5927][.D927.0000.0000.5927][.FB40.0020.001F.6B63][.EB63.0000.0000.6B63] # SQUARE ERA NAME TAISYOU; QQKN
+319D  ; [.FB40.0020.0014.5929][.D929.0000.0000.5929] # IDEOGRAPHIC ANNOTATION HEAVEN MARK; QQK
+1F217 ; [.FB40.0020.001C.5929][.D929.0000.0000.5929] # SQUARED CJK UNIFIED IDEOGRAPH-5929; QQK
+FA7E  ; [.FB40.0020.0002.5944][.D944.0000.0000.5944] # CJK COMPATIBILITY IDEOGRAPH-FA7E; QQC
+F90C  ; [.FB40.0020.0002.5948][.D948.0000.0000.5948] # CJK COMPATIBILITY IDEOGRAPH-F90C; QQC
+F909  ; [.FB40.0020.0002.5951][.D951.0000.0000.5951] # CJK COMPATIBILITY IDEOGRAPH-F909; QQC
+FA7F  ; [.FB40.0020.0002.5954][.D954.0000.0000.5954] # CJK COMPATIBILITY IDEOGRAPH-FA7F; QQC
+2F85F ; [.FB40.0020.0002.5962][.D962.0000.0000.5962] # CJK COMPATIBILITY IDEOGRAPH-2F85F; QQC
+F981  ; [.FB40.0020.0002.5973][.D973.0000.0000.5973] # CJK COMPATIBILITY IDEOGRAPH-F981; QQC
+2F25  ; [.FB40.0020.0004.5973][.D973.0000.0000.5973] # KANGXI RADICAL WOMAN; QQK
+329B  ; [.FB40.0020.0006.5973][.D973.0000.0000.5973] # CIRCLED IDEOGRAPH FEMALE; QQK
+2F865 ; [.FB40.0020.0002.59D8][.D9D8.0000.0000.59D8] # CJK COMPATIBILITY IDEOGRAPH-2F865; QQC
+2F862 ; [.FB40.0020.0002.59EC][.D9EC.0000.0000.59EC] # CJK COMPATIBILITY IDEOGRAPH-2F862; QQC
+2F863 ; [.FB40.0020.0002.5A1B][.DA1B.0000.0000.5A1B] # CJK COMPATIBILITY IDEOGRAPH-2F863; QQC
+2F864 ; [.FB40.0020.0002.5A27][.DA27.0000.0000.5A27] # CJK COMPATIBILITY IDEOGRAPH-2F864; QQC
+FA80  ; [.FB40.0020.0002.5A62][.DA62.0000.0000.5A62] # CJK COMPATIBILITY IDEOGRAPH-FA80; QQC
+2F866 ; [.FB40.0020.0002.5A66][.DA66.0000.0000.5A66] # CJK COMPATIBILITY IDEOGRAPH-2F866; QQC
+2F986 ; [.FB40.0020.0002.5AB5][.DAB5.0000.0000.5AB5] # CJK COMPATIBILITY IDEOGRAPH-2F986; QQC
+2F869 ; [.FB40.0020.0002.5B08][.DB08.0000.0000.5B08] # CJK COMPATIBILITY IDEOGRAPH-2F869; QQC
+FA81  ; [.FB40.0020.0002.5B28][.DB28.0000.0000.5B28] # CJK COMPATIBILITY IDEOGRAPH-FA81; QQC
+2F86A ; [.FB40.0020.0002.5B3E][.DB3E.0000.0000.5B3E] # CJK COMPATIBILITY IDEOGRAPH-2F86A; QQC
+2F86B ; [.FB40.0020.0002.5B3E][.DB3E.0000.0000.5B3E] # CJK COMPATIBILITY IDEOGRAPH-2F86B; QQC
+2F26  ; [.FB40.0020.0004.5B50][.DB50.0000.0000.5B50] # KANGXI RADICAL CHILD; QQK
+1F211 ; [.FB40.0020.001C.5B57][.DB57.0000.0000.5B57] # SQUARED CJK UNIFIED IDEOGRAPH-5B57; QQK
+323B  ; [*02FF.0020.0004.323B][.FB40.0020.0004.5B66][.DB66.0000.0000.5B66][*0300.0020.001F.323B] # PARENTHESIZED IDEOGRAPH STUDY; QQKN
+32AB  ; [.FB40.0020.0006.5B66][.DB66.0000.0000.5B66] # CIRCLED IDEOGRAPH STUDY; QQK
+2F27  ; [.FB40.0020.0004.5B80][.DB80.0000.0000.5B80] # KANGXI RADICAL ROOF; QQK
+FA04  ; [.FB40.0020.0002.5B85][.DB85.0000.0000.5B85] # CJK COMPATIBILITY IDEOGRAPH-FA04; QQC
+1F243 ; [*0347.0020.0004.1F243][.FB40.0020.0004.5B89][.DB89.0000.0000.5B89][*0348.0020.001F.1F243] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-5B89; QQKN
+32AA  ; [.FB40.0020.0006.5B97][.DB97.0000.0000.5B97] # CIRCLED IDEOGRAPH RELIGION; QQK
+2F86D ; [.FB40.0020.0002.5BC3][.DBC3.0000.0000.5BC3] # CJK COMPATIBILITY IDEOGRAPH-2F86D; QQC
+2F86E ; [.FB40.0020.0002.5BD8][.DBD8.0000.0000.5BD8] # CJK COMPATIBILITY IDEOGRAPH-2F86E; QQC
+F95F  ; [.FB40.0020.0002.5BE7][.DBE7.0000.0000.5BE7] # CJK COMPATIBILITY IDEOGRAPH-F95F; QQC
+F9AA  ; [.FB40.0020.0002.5BE7][.DBE7.0000.0000.5BE7] # CJK COMPATIBILITY IDEOGRAPH-F9AA; QQC
+2F86F ; [.FB40.0020.0002.5BE7][.DBE7.0000.0000.5BE7] # CJK COMPATIBILITY IDEOGRAPH-2F86F; QQC
+F9BC  ; [.FB40.0020.0002.5BEE][.DBEE.0000.0000.5BEE] # CJK COMPATIBILITY IDEOGRAPH-F9BC; QQC
+2F870 ; [.FB40.0020.0002.5BF3][.DBF3.0000.0000.5BF3] # CJK COMPATIBILITY IDEOGRAPH-2F870; QQC
+2F28  ; [.FB40.0020.0004.5BF8][.DBF8.0000.0000.5BF8] # KANGXI RADICAL INCH; QQK
+2F872 ; [.FB40.0020.0002.5BFF][.DBFF.0000.0000.5BFF] # CJK COMPATIBILITY IDEOGRAPH-2F872; QQC
+2F873 ; [.FB40.0020.0002.5C06][.DC06.0000.0000.5C06] # CJK COMPATIBILITY IDEOGRAPH-2F873; QQC
+2F29  ; [.FB40.0020.0004.5C0F][.DC0F.0000.0000.5C0F] # KANGXI RADICAL SMALL; QQK
+2E8C  ; [.FB40.0020.0004.5C0F][.DC0F.0000.0000.5C0F][.0000.0159.001F.2E8C] # CJK RADICAL SMALL ONE; QQKN
+2E8D  ; [.FB40.0020.0004.5C0F][.DC0F.0000.0000.5C0F][.0000.015A.001F.2E8D] # CJK RADICAL SMALL TWO; QQKN
+2F875 ; [.FB40.0020.0002.5C22][.DC22.0000.0000.5C22] # CJK COMPATIBILITY IDEOGRAPH-2F875; QQC
+2E90  ; [.FB40.0020.0004.5C22][.DC22.0000.0000.5C22] # CJK RADICAL LAME THREE; QQK
+2F2A  ; [.FB40.0020.0004.5C22][.DC22.0000.0000.5C22] # KANGXI RADICAL LAME; QQK
+2E8E  ; [.FB40.0020.0004.5C22][.DC22.0000.0000.5C22][.0000.0159.001F.2E8E] # CJK RADICAL LAME ONE; QQKN
+2E8F  ; [.FB40.0020.0004.5C23][.DC23.0000.0000.5C23] # CJK RADICAL LAME TWO; QQK
+2E91  ; [.FB40.0020.0004.5C23][.DC23.0000.0000.5C23][.0000.0159.001F.2E91] # CJK RADICAL LAME FOUR; QQKN
+2F2B  ; [.FB40.0020.0004.5C38][.DC38.0000.0000.5C38] # KANGXI RADICAL CORPSE; QQK
+F9BD  ; [.FB40.0020.0002.5C3F][.DC3F.0000.0000.5C3F] # CJK COMPATIBILITY IDEOGRAPH-F9BD; QQC
+2F877 ; [.FB40.0020.0002.5C60][.DC60.0000.0000.5C60] # CJK COMPATIBILITY IDEOGRAPH-2F877; QQC
+F94B  ; [.FB40.0020.0002.5C62][.DC62.0000.0000.5C62] # CJK COMPATIBILITY IDEOGRAPH-F94B; QQC
+FA3B  ; [.FB40.0020.0002.5C64][.DC64.0000.0000.5C64] # CJK COMPATIBILITY IDEOGRAPH-FA3B; QQC
+F9DF  ; [.FB40.0020.0002.5C65][.DC65.0000.0000.5C65] # CJK COMPATIBILITY IDEOGRAPH-F9DF; QQC
+FA3C  ; [.FB40.0020.0002.5C6E][.DC6E.0000.0000.5C6E] # CJK COMPATIBILITY IDEOGRAPH-FA3C; QQC
+2F878 ; [.FB40.0020.0002.5C6E][.DC6E.0000.0000.5C6E] # CJK COMPATIBILITY IDEOGRAPH-2F878; QQC
+2F2C  ; [.FB40.0020.0004.5C6E][.DC6E.0000.0000.5C6E] # KANGXI RADICAL SPROUT; QQK
+2F2D  ; [.FB40.0020.0004.5C71][.DC71.0000.0000.5C71] # KANGXI RADICAL MOUNTAIN; QQK
+2F87A ; [.FB40.0020.0002.5C8D][.DC8D.0000.0000.5C8D] # CJK COMPATIBILITY IDEOGRAPH-2F87A; QQC
+2F879 ; [.FB40.0020.0002.5CC0][.DCC0.0000.0000.5CC0] # CJK COMPATIBILITY IDEOGRAPH-2F879; QQC
+F9D5  ; [.FB40.0020.0002.5D19][.DD19.0000.0000.5D19] # CJK COMPATIBILITY IDEOGRAPH-F9D5; QQC
+2F87C ; [.FB40.0020.0002.5D43][.DD43.0000.0000.5D43] # CJK COMPATIBILITY IDEOGRAPH-2F87C; QQC
+F921  ; [.FB40.0020.0002.5D50][.DD50.0000.0000.5D50] # CJK COMPATIBILITY IDEOGRAPH-F921; QQC
+2F87F ; [.FB40.0020.0002.5D6B][.DD6B.0000.0000.5D6B] # CJK COMPATIBILITY IDEOGRAPH-2F87F; QQC
+2F87E ; [.FB40.0020.0002.5D6E][.DD6E.0000.0000.5D6E] # CJK COMPATIBILITY IDEOGRAPH-2F87E; QQC
+2F880 ; [.FB40.0020.0002.5D7C][.DD7C.0000.0000.5D7C] # CJK COMPATIBILITY IDEOGRAPH-2F880; QQC
+2F9F4 ; [.FB40.0020.0002.5DB2][.DDB2.0000.0000.5DB2] # CJK COMPATIBILITY IDEOGRAPH-2F9F4; QQC
+F9AB  ; [.FB40.0020.0002.5DBA][.DDBA.0000.0000.5DBA] # CJK COMPATIBILITY IDEOGRAPH-F9AB; QQC
+2F2E  ; [.FB40.0020.0004.5DDB][.DDDB.0000.0000.5DDB] # KANGXI RADICAL RIVER; QQK
+2F881 ; [.FB40.0020.0002.5DE1][.DDE1.0000.0000.5DE1] # CJK COMPATIBILITY IDEOGRAPH-2F881; QQC
+2F882 ; [.FB40.0020.0002.5DE2][.DDE2.0000.0000.5DE2] # CJK COMPATIBILITY IDEOGRAPH-2F882; QQC
+2F2F  ; [.FB40.0020.0004.5DE5][.DDE5.0000.0000.5DE5] # KANGXI RADICAL WORK; QQK
+32A7  ; [.FB40.0020.0006.5DE6][.DDE6.0000.0000.5DE6] # CIRCLED IDEOGRAPH LEFT; QQK
+1F22C ; [.FB40.0020.001C.5DE6][.DDE6.0000.0000.5DE6] # SQUARED CJK UNIFIED IDEOGRAPH-5DE6; QQK
+2F30  ; [.FB40.0020.0004.5DF1][.DDF1.0000.0000.5DF1] # KANGXI RADICAL ONESELF; QQK
+2E92  ; [.FB40.0020.0004.5DF3][.DDF3.0000.0000.5DF3] # CJK RADICAL SNAKE; QQK
+2F884 ; [.FB40.0020.0002.5DFD][.DDFD.0000.0000.5DFD] # CJK COMPATIBILITY IDEOGRAPH-2F884; QQC
+2F31  ; [.FB40.0020.0004.5DFE][.DDFE.0000.0000.5DFE] # KANGXI RADICAL TURBAN; QQK
+2F885 ; [.FB40.0020.0002.5E28][.DE28.0000.0000.5E28] # CJK COMPATIBILITY IDEOGRAPH-2F885; QQC
+2F886 ; [.FB40.0020.0002.5E3D][.DE3D.0000.0000.5E3D] # CJK COMPATIBILITY IDEOGRAPH-2F886; QQC
+2F887 ; [.FB40.0020.0002.5E69][.DE69.0000.0000.5E69] # CJK COMPATIBILITY IDEOGRAPH-2F887; QQC
+2F32  ; [.FB40.0020.0004.5E72][.DE72.0000.0000.5E72] # KANGXI RADICAL DRY; QQK
+337B  ; [.FB40.0020.001C.5E73][.DE73.0000.0000.5E73][.FB40.0020.001F.6210][.E210.0000.0000.6210] # SQUARE ERA NAME HEISEI; QQKN
+F98E  ; [.FB40.0020.0002.5E74][.DE74.0000.0000.5E74] # CJK COMPATIBILITY IDEOGRAPH-F98E; QQC
+2E93  ; [.FB40.0020.0004.5E7A][.DE7A.0000.0000.5E7A] # CJK RADICAL THREAD; QQK
+2F33  ; [.FB40.0020.0004.5E7A][.DE7A.0000.0000.5E7A] # KANGXI RADICAL SHORT THREAD; QQK
+3245  ; [.FB40.0020.0006.5E7C][.DE7C.0000.0000.5E7C] # CIRCLED IDEOGRAPH KINDERGARTEN; QQK
+2F34  ; [.FB40.0020.0004.5E7F][.DE7F.0000.0000.5E7F] # KANGXI RADICAL DOTTED CLIFF; QQK
+FA01  ; [.FB40.0020.0002.5EA6][.DEA6.0000.0000.5EA6] # CJK COMPATIBILITY IDEOGRAPH-FA01; QQC
+2F88B ; [.FB40.0020.0002.5EB0][.DEB0.0000.0000.5EB0] # CJK COMPATIBILITY IDEOGRAPH-2F88B; QQC
+2F88C ; [.FB40.0020.0002.5EB3][.DEB3.0000.0000.5EB3] # CJK COMPATIBILITY IDEOGRAPH-2F88C; QQC
+2F88D ; [.FB40.0020.0002.5EB6][.DEB6.0000.0000.5EB6] # CJK COMPATIBILITY IDEOGRAPH-2F88D; QQC
+F9A2  ; [.FB40.0020.0002.5EC9][.DEC9.0000.0000.5EC9] # CJK COMPATIBILITY IDEOGRAPH-F9A2; QQC
+F928  ; [.FB40.0020.0002.5ECA][.DECA.0000.0000.5ECA] # CJK COMPATIBILITY IDEOGRAPH-F928; QQC
+2F88E ; [.FB40.0020.0002.5ECA][.DECA.0000.0000.5ECA] # CJK COMPATIBILITY IDEOGRAPH-2F88E; QQC
+FA82  ; [.FB40.0020.0002.5ED2][.DED2.0000.0000.5ED2] # CJK COMPATIBILITY IDEOGRAPH-FA82; QQC
+FA0B  ; [.FB40.0020.0002.5ED3][.DED3.0000.0000.5ED3] # CJK COMPATIBILITY IDEOGRAPH-FA0B; QQC
+FA83  ; [.FB40.0020.0002.5ED9][.DED9.0000.0000.5ED9] # CJK COMPATIBILITY IDEOGRAPH-FA83; QQC
+F982  ; [.FB40.0020.0002.5EEC][.DEEC.0000.0000.5EEC] # CJK COMPATIBILITY IDEOGRAPH-F982; QQC
+2F35  ; [.FB40.0020.0004.5EF4][.DEF4.0000.0000.5EF4] # KANGXI RADICAL LONG STRIDE; QQK
+2F890 ; [.FB40.0020.0002.5EFE][.DEFE.0000.0000.5EFE] # CJK COMPATIBILITY IDEOGRAPH-2F890; QQC
+2F36  ; [.FB40.0020.0004.5EFE][.DEFE.0000.0000.5EFE] # KANGXI RADICAL TWO HANDS; QQK
+F943  ; [.FB40.0020.0002.5F04][.DF04.0000.0000.5F04] # CJK COMPATIBILITY IDEOGRAPH-F943; QQC
+2F37  ; [.FB40.0020.0004.5F0B][.DF0B.0000.0000.5F0B] # KANGXI RADICAL SHOOT; QQK
+2F38  ; [.FB40.0020.0004.5F13][.DF13.0000.0000.5F13] # KANGXI RADICAL BOW; QQK
+2F894 ; [.FB40.0020.0002.5F22][.DF22.0000.0000.5F22] # CJK COMPATIBILITY IDEOGRAPH-2F894; QQC
+2F895 ; [.FB40.0020.0002.5F22][.DF22.0000.0000.5F22] # CJK COMPATIBILITY IDEOGRAPH-2F895; QQC
+2F39  ; [.FB40.0020.0004.5F50][.DF50.0000.0000.5F50] # KANGXI RADICAL SNOUT; QQK
+2E95  ; [.FB40.0020.0004.5F50][.DF50.0000.0000.5F50][.0000.0159.001F.2E95] # CJK RADICAL SNOUT TWO; QQKN
+2E94  ; [.FB40.0020.0004.5F51][.DF51.0000.0000.5F51] # CJK RADICAL SNOUT ONE; QQK
+2F874 ; [.FB40.0020.0002.5F53][.DF53.0000.0000.5F53] # CJK COMPATIBILITY IDEOGRAPH-2F874; QQC
+2F3A  ; [.FB40.0020.0004.5F61][.DF61.0000.0000.5F61] # KANGXI RADICAL BRISTLE; QQK
+2F899 ; [.FB40.0020.0002.5F62][.DF62.0000.0000.5F62] # CJK COMPATIBILITY IDEOGRAPH-2F899; QQC
+FA84  ; [.FB40.0020.0002.5F69][.DF69.0000.0000.5F69] # CJK COMPATIBILITY IDEOGRAPH-FA84; QQC
+2F89A ; [.FB40.0020.0002.5F6B][.DF6B.0000.0000.5F6B] # CJK COMPATIBILITY IDEOGRAPH-2F89A; QQC
+2F3B  ; [.FB40.0020.0004.5F73][.DF73.0000.0000.5F73] # KANGXI RADICAL STEP; QQK
+F9D8  ; [.FB40.0020.0002.5F8B][.DF8B.0000.0000.5F8B] # CJK COMPATIBILITY IDEOGRAPH-F9D8; QQC
+1F21D ; [.FB40.0020.001C.5F8C][.DF8C.0000.0000.5F8C] # SQUARED CJK UNIFIED IDEOGRAPH-5F8C; QQK
+2F89C ; [.FB40.0020.0002.5F9A][.DF9A.0000.0000.5F9A] # CJK COMPATIBILITY IDEOGRAPH-2F89C; QQC
+F966  ; [.FB40.0020.0002.5FA9][.DFA9.0000.0000.5FA9] # CJK COMPATIBILITY IDEOGRAPH-F966; QQC
+FA85  ; [.FB40.0020.0002.5FAD][.DFAD.0000.0000.5FAD] # CJK COMPATIBILITY IDEOGRAPH-FA85; QQC
+2F3C  ; [.FB40.0020.0004.5FC3][.DFC3.0000.0000.5FC3] # KANGXI RADICAL HEART; QQK
+2E97  ; [.FB40.0020.0004.5FC3][.DFC3.0000.0000.5FC3][.0000.0159.001F.2E97] # CJK RADICAL HEART TWO; QQKN
+2E96  ; [.FB40.0020.0004.5FC4][.DFC4.0000.0000.5FC4] # CJK RADICAL HEART ONE; QQK
+2F89D ; [.FB40.0020.0002.5FCD][.DFCD.0000.0000.5FCD] # CJK COMPATIBILITY IDEOGRAPH-2F89D; QQC
+2F89E ; [.FB40.0020.0002.5FD7][.DFD7.0000.0000.5FD7] # CJK COMPATIBILITY IDEOGRAPH-2F89E; QQC
+F9A3  ; [.FB40.0020.0002.5FF5][.DFF5.0000.0000.5FF5] # CJK COMPATIBILITY IDEOGRAPH-F9A3; QQC
+2F89F ; [.FB40.0020.0002.5FF9][.DFF9.0000.0000.5FF9] # CJK COMPATIBILITY IDEOGRAPH-2F89F; QQC
+F960  ; [.FB40.0020.0002.6012][.E012.0000.0000.6012] # CJK COMPATIBILITY IDEOGRAPH-F960; QQC
+F9AC  ; [.FB40.0020.0002.601C][.E01C.0000.0000.601C] # CJK COMPATIBILITY IDEOGRAPH-F9AC; QQC
+FA6B  ; [.FB40.0020.0002.6075][.E075.0000.0000.6075] # CJK COMPATIBILITY IDEOGRAPH-FA6B; QQC
+2F8A0 ; [.FB40.0020.0002.6081][.E081.0000.0000.6081] # CJK COMPATIBILITY IDEOGRAPH-2F8A0; QQC
+FA3D  ; [.FB40.0020.0002.6094][.E094.0000.0000.6094] # CJK COMPATIBILITY IDEOGRAPH-FA3D; QQC
+2F8A3 ; [.FB40.0020.0002.6094][.E094.0000.0000.6094] # CJK COMPATIBILITY IDEOGRAPH-2F8A3; QQC
+2F8A5 ; [.FB40.0020.0002.60C7][.E0C7.0000.0000.60C7] # CJK COMPATIBILITY IDEOGRAPH-2F8A5; QQC
+FA86  ; [.FB40.0020.0002.60D8][.E0D8.0000.0000.60D8] # CJK COMPATIBILITY IDEOGRAPH-FA86; QQC
+F9B9  ; [.FB40.0020.0002.60E1][.E0E1.0000.0000.60E1] # CJK COMPATIBILITY IDEOGRAPH-F9B9; QQC
+FA88  ; [.FB40.0020.0002.6108][.E108.0000.0000.6108] # CJK COMPATIBILITY IDEOGRAPH-FA88; QQC
+F9D9  ; [.FB40.0020.0002.6144][.E144.0000.0000.6144] # CJK COMPATIBILITY IDEOGRAPH-F9D9; QQC
+2F8A6 ; [.FB40.0020.0002.6148][.E148.0000.0000.6148] # CJK COMPATIBILITY IDEOGRAPH-2F8A6; QQC
+2F8A7 ; [.FB40.0020.0002.614C][.E14C.0000.0000.614C] # CJK COMPATIBILITY IDEOGRAPH-2F8A7; QQC
+2F8A9 ; [.FB40.0020.0002.614C][.E14C.0000.0000.614C] # CJK COMPATIBILITY IDEOGRAPH-2F8A9; QQC
+FA87  ; [.FB40.0020.0002.614E][.E14E.0000.0000.614E] # CJK COMPATIBILITY IDEOGRAPH-FA87; QQC
+2F8A8 ; [.FB40.0020.0002.614E][.E14E.0000.0000.614E] # CJK COMPATIBILITY IDEOGRAPH-2F8A8; QQC
+FA8A  ; [.FB40.0020.0002.6160][.E160.0000.0000.6160] # CJK COMPATIBILITY IDEOGRAPH-FA8A; QQC
+FA3E  ; [.FB40.0020.0002.6168][.E168.0000.0000.6168] # CJK COMPATIBILITY IDEOGRAPH-FA3E; QQC
+2F8AA ; [.FB40.0020.0002.617A][.E17A.0000.0000.617A] # CJK COMPATIBILITY IDEOGRAPH-2F8AA; QQC
+FA3F  ; [.FB40.0020.0002.618E][.E18E.0000.0000.618E] # CJK COMPATIBILITY IDEOGRAPH-FA3F; QQC
+FA89  ; [.FB40.0020.0002.618E][.E18E.0000.0000.618E] # CJK COMPATIBILITY IDEOGRAPH-FA89; QQC
+2F8AB ; [.FB40.0020.0002.618E][.E18E.0000.0000.618E] # CJK COMPATIBILITY IDEOGRAPH-2F8AB; QQC
+F98F  ; [.FB40.0020.0002.6190][.E190.0000.0000.6190] # CJK COMPATIBILITY IDEOGRAPH-F98F; QQC
+2F8AD ; [.FB40.0020.0002.61A4][.E1A4.0000.0000.61A4] # CJK COMPATIBILITY IDEOGRAPH-2F8AD; QQC
+2F8AE ; [.FB40.0020.0002.61AF][.E1AF.0000.0000.61AF] # CJK COMPATIBILITY IDEOGRAPH-2F8AE; QQC
+2F8AC ; [.FB40.0020.0002.61B2][.E1B2.0000.0000.61B2] # CJK COMPATIBILITY IDEOGRAPH-2F8AC; QQC
+2F8AF ; [.FB40.0020.0002.61DE][.E1DE.0000.0000.61DE] # CJK COMPATIBILITY IDEOGRAPH-2F8AF; QQC
+FA40  ; [.FB40.0020.0002.61F2][.E1F2.0000.0000.61F2] # CJK COMPATIBILITY IDEOGRAPH-FA40; QQC
+FA8B  ; [.FB40.0020.0002.61F2][.E1F2.0000.0000.61F2] # CJK COMPATIBILITY IDEOGRAPH-FA8B; QQC
+2F8B0 ; [.FB40.0020.0002.61F2][.E1F2.0000.0000.61F2] # CJK COMPATIBILITY IDEOGRAPH-2F8B0; QQC
+F90D  ; [.FB40.0020.0002.61F6][.E1F6.0000.0000.61F6] # CJK COMPATIBILITY IDEOGRAPH-F90D; QQC
+2F8B1 ; [.FB40.0020.0002.61F6][.E1F6.0000.0000.61F6] # CJK COMPATIBILITY IDEOGRAPH-2F8B1; QQC
+F990  ; [.FB40.0020.0002.6200][.E200.0000.0000.6200] # CJK COMPATIBILITY IDEOGRAPH-F990; QQC
+2F3D  ; [.FB40.0020.0004.6208][.E208.0000.0000.6208] # KANGXI RADICAL HALBERD; QQK
+2F8B2 ; [.FB40.0020.0002.6210][.E210.0000.0000.6210] # CJK COMPATIBILITY IDEOGRAPH-2F8B2; QQC
+2F8B3 ; [.FB40.0020.0002.621B][.E21B.0000.0000.621B] # CJK COMPATIBILITY IDEOGRAPH-2F8B3; QQC
+F9D2  ; [.FB40.0020.0002.622E][.E22E.0000.0000.622E] # CJK COMPATIBILITY IDEOGRAPH-F9D2; QQC
+FA8C  ; [.FB40.0020.0002.6234][.E234.0000.0000.6234] # CJK COMPATIBILITY IDEOGRAPH-FA8C; QQC
+2F3E  ; [.FB40.0020.0004.6236][.E236.0000.0000.6236] # KANGXI RADICAL DOOR; QQK
+2F3F  ; [.FB40.0020.0004.624B][.E24B.0000.0000.624B] # KANGXI RADICAL HAND; QQK
+1F210 ; [.FB40.0020.001C.624B][.E24B.0000.0000.624B] # SQUARED CJK UNIFIED IDEOGRAPH-624B; QQK
+2E98  ; [.FB40.0020.0004.624C][.E24C.0000.0000.624C] # CJK RADICAL HAND; QQK
+1F245 ; [*0347.0020.0004.1F245][.FB40.0020.0004.6253][.E253.0000.0000.6253][*0348.0020.001F.1F245] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6253; QQKN
+1F231 ; [.FB40.0020.001C.6253][.E253.0000.0000.6253] # SQUARED CJK UNIFIED IDEOGRAPH-6253; QQK
+2F8B4 ; [.FB40.0020.0002.625D][.E25D.0000.0000.625D] # CJK COMPATIBILITY IDEOGRAPH-2F8B4; QQC
+1F227 ; [.FB40.0020.001C.6295][.E295.0000.0000.6295] # SQUARED CJK UNIFIED IDEOGRAPH-6295; QQK
+2F8B5 ; [.FB40.0020.0002.62B1][.E2B1.0000.0000.62B1] # CJK COMPATIBILITY IDEOGRAPH-2F8B5; QQC
+F925  ; [.FB40.0020.0002.62C9][.E2C9.0000.0000.62C9] # CJK COMPATIBILITY IDEOGRAPH-F925; QQC
+F95B  ; [.FB40.0020.0002.62CF][.E2CF.0000.0000.62CF] # CJK COMPATIBILITY IDEOGRAPH-F95B; QQC
+FA02  ; [.FB40.0020.0002.62D3][.E2D3.0000.0000.62D3] # CJK COMPATIBILITY IDEOGRAPH-FA02; QQC
+2F8B6 ; [.FB40.0020.0002.62D4][.E2D4.0000.0000.62D4] # CJK COMPATIBILITY IDEOGRAPH-2F8B6; QQC
+2F8BA ; [.FB40.0020.0002.62FC][.E2FC.0000.0000.62FC] # CJK COMPATIBILITY IDEOGRAPH-2F8BA; QQC
+F973  ; [.FB40.0020.0002.62FE][.E2FE.0000.0000.62FE] # CJK COMPATIBILITY IDEOGRAPH-F973; QQC
+1F22F ; [.FB40.0020.001C.6307][.E307.0000.0000.6307] # SQUARED CJK UNIFIED IDEOGRAPH-6307; QQK
+2F8B9 ; [.FB40.0020.0002.633D][.E33D.0000.0000.633D] # CJK COMPATIBILITY IDEOGRAPH-2F8B9; QQC
+2F8B7 ; [.FB40.0020.0002.6350][.E350.0000.0000.6350] # CJK COMPATIBILITY IDEOGRAPH-2F8B7; QQC
+1F228 ; [.FB40.0020.001C.6355][.E355.0000.0000.6355] # SQUARED CJK UNIFIED IDEOGRAPH-6355; QQK
+2F8BB ; [.FB40.0020.0002.6368][.E368.0000.0000.6368] # CJK COMPATIBILITY IDEOGRAPH-2F8BB; QQC
+F9A4  ; [.FB40.0020.0002.637B][.E37B.0000.0000.637B] # CJK COMPATIBILITY IDEOGRAPH-F9A4; QQC
+2F8BC ; [.FB40.0020.0002.6383][.E383.0000.0000.6383] # CJK COMPATIBILITY IDEOGRAPH-2F8BC; QQC
+F975  ; [.FB40.0020.0002.63A0][.E3A0.0000.0000.63A0] # CJK COMPATIBILITY IDEOGRAPH-F975; QQC
+2F8C1 ; [.FB40.0020.0002.63A9][.E3A9.0000.0000.63A9] # CJK COMPATIBILITY IDEOGRAPH-2F8C1; QQC
+FA8D  ; [.FB40.0020.0002.63C4][.E3C4.0000.0000.63C4] # CJK COMPATIBILITY IDEOGRAPH-FA8D; QQC
+2F8C0 ; [.FB40.0020.0002.63C5][.E3C5.0000.0000.63C5] # CJK COMPATIBILITY IDEOGRAPH-2F8C0; QQC
+2F8BD ; [.FB40.0020.0002.63E4][.E3E4.0000.0000.63E4] # CJK COMPATIBILITY IDEOGRAPH-2F8BD; QQC
+FA8E  ; [.FB40.0020.0002.641C][.E41C.0000.0000.641C] # CJK COMPATIBILITY IDEOGRAPH-FA8E; QQC
+2F8BF ; [.FB40.0020.0002.6422][.E422.0000.0000.6422] # CJK COMPATIBILITY IDEOGRAPH-2F8BF; QQC
+FA8F  ; [.FB40.0020.0002.6452][.E452.0000.0000.6452] # CJK COMPATIBILITY IDEOGRAPH-FA8F; QQC
+2F8C3 ; [.FB40.0020.0002.6469][.E469.0000.0000.6469] # CJK COMPATIBILITY IDEOGRAPH-2F8C3; QQC
+2F8C6 ; [.FB40.0020.0002.6477][.E477.0000.0000.6477] # CJK COMPATIBILITY IDEOGRAPH-2F8C6; QQC
+2F8C4 ; [.FB40.0020.0002.647E][.E47E.0000.0000.647E] # CJK COMPATIBILITY IDEOGRAPH-2F8C4; QQC
+F991  ; [.FB40.0020.0002.649A][.E49A.0000.0000.649A] # CJK COMPATIBILITY IDEOGRAPH-F991; QQC
+2F8C5 ; [.FB40.0020.0002.649D][.E49D.0000.0000.649D] # CJK COMPATIBILITY IDEOGRAPH-2F8C5; QQC
+F930  ; [.FB40.0020.0002.64C4][.E4C4.0000.0000.64C4] # CJK COMPATIBILITY IDEOGRAPH-F930; QQC
+2F40  ; [.FB40.0020.0004.652F][.E52F.0000.0000.652F] # KANGXI RADICAL BRANCH; QQK
+2F41  ; [.FB40.0020.0004.6534][.E534.0000.0000.6534] # KANGXI RADICAL RAP; QQK
+2E99  ; [.FB40.0020.0004.6535][.E535.0000.0000.6535] # CJK RADICAL RAP; QQK
+FA41  ; [.FB40.0020.0002.654F][.E54F.0000.0000.654F] # CJK COMPATIBILITY IDEOGRAPH-FA41; QQC
+2F8C8 ; [.FB40.0020.0002.654F][.E54F.0000.0000.654F] # CJK COMPATIBILITY IDEOGRAPH-2F8C8; QQC
+FA90  ; [.FB40.0020.0002.6556][.E556.0000.0000.6556] # CJK COMPATIBILITY IDEOGRAPH-FA90; QQC
+1F248 ; [*0347.0020.0004.1F248][.FB40.0020.0004.6557][.E557.0000.0000.6557][*0348.0020.001F.1F248] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557; QQKN
+2F8C9 ; [.FB40.0020.0002.656C][.E56C.0000.0000.656C] # CJK COMPATIBILITY IDEOGRAPH-2F8C9; QQC
+F969  ; [.FB40.0020.0002.6578][.E578.0000.0000.6578] # CJK COMPATIBILITY IDEOGRAPH-F969; QQC
+2F42  ; [.FB40.0020.0004.6587][.E587.0000.0000.6587] # KANGXI RADICAL SCRIPT; QQK
+3246  ; [.FB40.0020.0006.6587][.E587.0000.0000.6587] # CIRCLED IDEOGRAPH SCHOOL; QQK
+2F43  ; [.FB40.0020.0004.6597][.E597.0000.0000.6597] # KANGXI RADICAL DIPPER; QQK
+F9BE  ; [.FB40.0020.0002.6599][.E599.0000.0000.6599] # CJK COMPATIBILITY IDEOGRAPH-F9BE; QQC
+1F21B ; [.FB40.0020.001C.6599][.E599.0000.0000.6599] # SQUARED CJK UNIFIED IDEOGRAPH-6599; QQK
+2F44  ; [.FB40.0020.0004.65A4][.E5A4.0000.0000.65A4] # KANGXI RADICAL AXE; QQK
+1F21F ; [.FB40.0020.001C.65B0][.E5B0.0000.0000.65B0] # SQUARED CJK UNIFIED IDEOGRAPH-65B0; QQK
+2F45  ; [.FB40.0020.0004.65B9][.E5B9.0000.0000.65B9] # KANGXI RADICAL SQUARE; QQK
+F983  ; [.FB40.0020.0002.65C5][.E5C5.0000.0000.65C5] # CJK COMPATIBILITY IDEOGRAPH-F983; QQC
+2F46  ; [.FB40.0020.0004.65E0][.E5E0.0000.0000.65E0] # KANGXI RADICAL NOT; QQK
+2E9B  ; [.FB40.0020.0004.65E1][.E5E1.0000.0000.65E1] # CJK RADICAL CHOKE; QQK
+FA42  ; [.FB40.0020.0002.65E2][.E5E2.0000.0000.65E2] # CJK COMPATIBILITY IDEOGRAPH-FA42; QQC
+2F8CB ; [.FB40.0020.0002.65E3][.E5E3.0000.0000.65E3] # CJK COMPATIBILITY IDEOGRAPH-2F8CB; QQC
+2F47  ; [.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5] # KANGXI RADICAL SUN; QQK
+3230  ; [*02FF.0020.0004.3230][.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5][*0300.0020.001F.3230] # PARENTHESIZED IDEOGRAPH SUN; QQKN
+3290  ; [.FB40.0020.0006.65E5][.E5E5.0000.0000.65E5] # CIRCLED IDEOGRAPH SUN; QQK
+2E9C  ; [.FB40.0020.0004.65E5][.E5E5.0000.0000.65E5][.0000.0159.001F.2E9C] # CJK RADICAL SUN; QQKN
+337E  ; [.FB40.0020.001C.660E][.E60E.0000.0000.660E][.FB40.0020.001F.6CBB][.ECBB.0000.0000.6CBB] # SQUARE ERA NAME MEIZI; QQKN
+F9E0  ; [.FB40.0020.0002.6613][.E613.0000.0000.6613] # CJK COMPATIBILITY IDEOGRAPH-F9E0; QQC
+1F219 ; [.FB40.0020.001C.6620][.E620.0000.0000.6620] # SQUARED CJK UNIFIED IDEOGRAPH-6620; QQK
+337C  ; [.FB40.0020.001C.662D][.E62D.0000.0000.662D][.FB40.0020.001F.548C][.D48C.0000.0000.548C] # SQUARE ERA NAME SYOUWA; QQKN
+2F8CD ; [.FB40.0020.0002.6649][.E649.0000.0000.6649] # CJK COMPATIBILITY IDEOGRAPH-2F8CD; QQC
+FA12  ; [.FB40.0020.0002.6674][.E674.0000.0000.6674] # CJK COMPATIBILITY IDEOGRAPH-FA12; QQC
+FA91  ; [.FB40.0020.0002.6674][.E674.0000.0000.6674] # CJK COMPATIBILITY IDEOGRAPH-FA91; QQC
+F9C5  ; [.FB40.0020.0002.6688][.E688.0000.0000.6688] # CJK COMPATIBILITY IDEOGRAPH-F9C5; QQC
+FA43  ; [.FB40.0020.0002.6691][.E691.0000.0000.6691] # CJK COMPATIBILITY IDEOGRAPH-FA43; QQC
+2F8CF ; [.FB40.0020.0002.6691][.E691.0000.0000.6691] # CJK COMPATIBILITY IDEOGRAPH-2F8CF; QQC
+2F8D5 ; [.FB40.0020.0002.669C][.E69C.0000.0000.669C] # CJK COMPATIBILITY IDEOGRAPH-2F8D5; QQC
+FA06  ; [.FB40.0020.0002.66B4][.E6B4.0000.0000.66B4] # CJK COMPATIBILITY IDEOGRAPH-FA06; QQC
+F98B  ; [.FB40.0020.0002.66C6][.E6C6.0000.0000.66C6] # CJK COMPATIBILITY IDEOGRAPH-F98B; QQC
+2F48  ; [.FB40.0020.0004.66F0][.E6F0.0000.0000.66F0] # KANGXI RADICAL SAY; QQK
+F901  ; [.FB40.0020.0002.66F4][.E6F4.0000.0000.66F4] # CJK COMPATIBILITY IDEOGRAPH-F901; QQC
+2F8CC ; [.FB40.0020.0002.66F8][.E6F8.0000.0000.66F8] # CJK COMPATIBILITY IDEOGRAPH-2F8CC; QQC
+2F8D4 ; [.FB40.0020.0002.6700][.E700.0000.0000.6700] # CJK COMPATIBILITY IDEOGRAPH-2F8D4; QQC
+2F49  ; [.FB40.0020.0004.6708][.E708.0000.0000.6708] # KANGXI RADICAL MOON; QQK
+322A  ; [*02FF.0020.0004.322A][.FB40.0020.0004.6708][.E708.0000.0000.6708][*0300.0020.001F.322A] # PARENTHESIZED IDEOGRAPH MOON; QQKN
+328A  ; [.FB40.0020.0006.6708][.E708.0000.0000.6708] # CIRCLED IDEOGRAPH MOON; QQK
+2E9D  ; [.FB40.0020.0004.6708][.E708.0000.0000.6708][.0000.0159.001F.2E9D] # CJK RADICAL MOON; QQKN
+3232  ; [*02FF.0020.0004.3232][.FB40.0020.0004.6709][.E709.0000.0000.6709][*0300.0020.001F.3232] # PARENTHESIZED IDEOGRAPH HAVE; QQKN
+3292  ; [.FB40.0020.0006.6709][.E709.0000.0000.6709] # CIRCLED IDEOGRAPH HAVE; QQK
+F929  ; [.FB40.0020.0002.6717][.E717.0000.0000.6717] # CJK COMPATIBILITY IDEOGRAPH-F929; QQC
+FA92  ; [.FB40.0020.0002.6717][.E717.0000.0000.6717] # CJK COMPATIBILITY IDEOGRAPH-FA92; QQC
+2F8D8 ; [.FB40.0020.0002.6717][.E717.0000.0000.6717] # CJK COMPATIBILITY IDEOGRAPH-2F8D8; QQC
+FA93  ; [.FB40.0020.0002.671B][.E71B.0000.0000.671B] # CJK COMPATIBILITY IDEOGRAPH-FA93; QQC
+2F8D9 ; [.FB40.0020.0002.671B][.E71B.0000.0000.671B] # CJK COMPATIBILITY IDEOGRAPH-2F8D9; QQC
+2F8DA ; [.FB40.0020.0002.6721][.E721.0000.0000.6721] # CJK COMPATIBILITY IDEOGRAPH-2F8DA; QQC
+2F4A  ; [.FB40.0020.0004.6728][.E728.0000.0000.6728] # KANGXI RADICAL TREE; QQK
+322D  ; [*02FF.0020.0004.322D][.FB40.0020.0004.6728][.E728.0000.0000.6728][*0300.0020.001F.322D] # PARENTHESIZED IDEOGRAPH WOOD; QQKN
+328D  ; [.FB40.0020.0006.6728][.E728.0000.0000.6728] # CIRCLED IDEOGRAPH WOOD; QQK
+1F240 ; [*0347.0020.0004.1F240][.FB40.0020.0004.672C][.E72C.0000.0000.672C][*0348.0020.001F.1F240] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C; QQKN
+F9E1  ; [.FB40.0020.0002.674E][.E74E.0000.0000.674E] # CJK COMPATIBILITY IDEOGRAPH-F9E1; QQC
+2F8DC ; [.FB40.0020.0002.6753][.E753.0000.0000.6753] # CJK COMPATIBILITY IDEOGRAPH-2F8DC; QQC
+FA94  ; [.FB40.0020.0002.6756][.E756.0000.0000.6756] # CJK COMPATIBILITY IDEOGRAPH-FA94; QQC
+2F8DB ; [.FB40.0020.0002.675E][.E75E.0000.0000.675E] # CJK COMPATIBILITY IDEOGRAPH-2F8DB; QQC
+F9C8  ; [.FB40.0020.0002.677B][.E77B.0000.0000.677B] # CJK COMPATIBILITY IDEOGRAPH-F9C8; QQC
+2F8E0 ; [.FB40.0020.0002.6785][.E785.0000.0000.6785] # CJK COMPATIBILITY IDEOGRAPH-2F8E0; QQC
+F9F4  ; [.FB40.0020.0002.6797][.E797.0000.0000.6797] # CJK COMPATIBILITY IDEOGRAPH-F9F4; QQC
+F9C9  ; [.FB40.0020.0002.67F3][.E7F3.0000.0000.67F3] # CJK COMPATIBILITY IDEOGRAPH-F9C9; QQC
+2F8DF ; [.FB40.0020.0002.67FA][.E7FA.0000.0000.67FA] # CJK COMPATIBILITY IDEOGRAPH-2F8DF; QQC
+F9DA  ; [.FB40.0020.0002.6817][.E817.0000.0000.6817] # CJK COMPATIBILITY IDEOGRAPH-F9DA; QQC
+2F8E5 ; [.FB40.0020.0002.681F][.E81F.0000.0000.681F] # CJK COMPATIBILITY IDEOGRAPH-2F8E5; QQC
+3231  ; [*02FF.0020.0004.3231][.FB40.0020.0004.682A][.E82A.0000.0000.682A][*0300.0020.001F.3231] # PARENTHESIZED IDEOGRAPH STOCK; QQKN
+3291  ; [.FB40.0020.0006.682A][.E82A.0000.0000.682A] # CIRCLED IDEOGRAPH STOCK; QQK
+337F  ; [.FB40.0020.001C.682A][.E82A.0000.0000.682A][.FB40.0020.001F.5F0F][.DF0F.0000.0000.5F0F][.FB40.0020.001F.4F1A][.CF1A.0000.0000.4F1A][.FB40.0020.001F.793E][.F93E.0000.0000.793E] # SQUARE CORPORATION; QQKN
+2F8E1 ; [.FB40.0020.0002.6852][.E852.0000.0000.6852] # CJK COMPATIBILITY IDEOGRAPH-2F8E1; QQC
+F97A  ; [.FB40.0020.0002.6881][.E881.0000.0000.6881] # CJK COMPATIBILITY IDEOGRAPH-F97A; QQC
+FA44  ; [.FB40.0020.0002.6885][.E885.0000.0000.6885] # CJK COMPATIBILITY IDEOGRAPH-FA44; QQC
+2F8E2 ; [.FB40.0020.0002.6885][.E885.0000.0000.6885] # CJK COMPATIBILITY IDEOGRAPH-2F8E2; QQC
+2F8E4 ; [.FB40.0020.0002.688E][.E88E.0000.0000.688E] # CJK COMPATIBILITY IDEOGRAPH-2F8E4; QQC
+F9E2  ; [.FB40.0020.0002.68A8][.E8A8.0000.0000.68A8] # CJK COMPATIBILITY IDEOGRAPH-F9E2; QQC
+2F8E6 ; [.FB40.0020.0002.6914][.E914.0000.0000.6914] # CJK COMPATIBILITY IDEOGRAPH-2F8E6; QQC
+2F8E8 ; [.FB40.0020.0002.6942][.E942.0000.0000.6942] # CJK COMPATIBILITY IDEOGRAPH-2F8E8; QQC
+2F8E9 ; [.FB40.0020.0002.69A3][.E9A3.0000.0000.69A3] # CJK COMPATIBILITY IDEOGRAPH-2F8E9; QQC
+2F8EA ; [.FB40.0020.0002.69EA][.E9EA.0000.0000.69EA] # CJK COMPATIBILITY IDEOGRAPH-2F8EA; QQC
+F914  ; [.FB40.0020.0002.6A02][.EA02.0000.0000.6A02] # CJK COMPATIBILITY IDEOGRAPH-F914; QQC
+F95C  ; [.FB40.0020.0002.6A02][.EA02.0000.0000.6A02] # CJK COMPATIBILITY IDEOGRAPH-F95C; QQC
+F9BF  ; [.FB40.0020.0002.6A02][.EA02.0000.0000.6A02] # CJK COMPATIBILITY IDEOGRAPH-F9BF; QQC
+F94C  ; [.FB40.0020.0002.6A13][.EA13.0000.0000.6A13] # CJK COMPATIBILITY IDEOGRAPH-F94C; QQC
+2F8EB ; [.FB40.0020.0002.6AA8][.EAA8.0000.0000.6AA8] # CJK COMPATIBILITY IDEOGRAPH-2F8EB; QQC
+F931  ; [.FB40.0020.0002.6AD3][.EAD3.0000.0000.6AD3] # CJK COMPATIBILITY IDEOGRAPH-F931; QQC
+2F8ED ; [.FB40.0020.0002.6ADB][.EADB.0000.0000.6ADB] # CJK COMPATIBILITY IDEOGRAPH-2F8ED; QQC
+F91D  ; [.FB40.0020.0002.6B04][.EB04.0000.0000.6B04] # CJK COMPATIBILITY IDEOGRAPH-F91D; QQC
+2F4B  ; [.FB40.0020.0004.6B20][.EB20.0000.0000.6B20] # KANGXI RADICAL LACK; QQK
+2F8EF ; [.FB40.0020.0002.6B21][.EB21.0000.0000.6B21] # CJK COMPATIBILITY IDEOGRAPH-2F8EF; QQC
+2F8F1 ; [.FB40.0020.0002.6B54][.EB54.0000.0000.6B54] # CJK COMPATIBILITY IDEOGRAPH-2F8F1; QQC
+2F4C  ; [.FB40.0020.0004.6B62][.EB62.0000.0000.6B62] # KANGXI RADICAL STOP; QQK
+32A3  ; [.FB40.0020.0006.6B63][.EB63.0000.0000.6B63] # CIRCLED IDEOGRAPH CORRECT; QQK
+2F8F3 ; [.FB40.0020.0002.6B72][.EB72.0000.0000.6B72] # CJK COMPATIBILITY IDEOGRAPH-2F8F3; QQC
+F98C  ; [.FB40.0020.0002.6B77][.EB77.0000.0000.6B77] # CJK COMPATIBILITY IDEOGRAPH-F98C; QQC
+FA95  ; [.FB40.0020.0002.6B79][.EB79.0000.0000.6B79] # CJK COMPATIBILITY IDEOGRAPH-FA95; QQC
+2F4D  ; [.FB40.0020.0004.6B79][.EB79.0000.0000.6B79] # KANGXI RADICAL DEATH; QQK
+2E9E  ; [.FB40.0020.0004.6B7A][.EB7A.0000.0000.6B7A][.0000.0159.001F.2E9E] # CJK RADICAL DEATH; QQKN
+2F8F4 ; [.FB40.0020.0002.6B9F][.EB9F.0000.0000.6B9F] # CJK COMPATIBILITY IDEOGRAPH-2F8F4; QQC
+F9A5  ; [.FB40.0020.0002.6BAE][.EBAE.0000.0000.6BAE] # CJK COMPATIBILITY IDEOGRAPH-F9A5; QQC
+2F4E  ; [.FB40.0020.0004.6BB3][.EBB3.0000.0000.6BB3] # KANGXI RADICAL WEAPON; QQK
+F970  ; [.FB40.0020.0002.6BBA][.EBBA.0000.0000.6BBA] # CJK COMPATIBILITY IDEOGRAPH-F970; QQC
+FA96  ; [.FB40.0020.0002.6BBA][.EBBA.0000.0000.6BBA] # CJK COMPATIBILITY IDEOGRAPH-FA96; QQC
+2F8F5 ; [.FB40.0020.0002.6BBA][.EBBA.0000.0000.6BBA] # CJK COMPATIBILITY IDEOGRAPH-2F8F5; QQC
+2F8F6 ; [.FB40.0020.0002.6BBB][.EBBB.0000.0000.6BBB] # CJK COMPATIBILITY IDEOGRAPH-2F8F6; QQC
+2F4F  ; [.FB40.0020.0004.6BCB][.EBCB.0000.0000.6BCB] # KANGXI RADICAL DO NOT; QQK
+2E9F  ; [.FB40.0020.0004.6BCD][.EBCD.0000.0000.6BCD] # CJK RADICAL MOTHER; QQK
+2F50  ; [.FB40.0020.0004.6BD4][.EBD4.0000.0000.6BD4] # KANGXI RADICAL COMPARE; QQK
+2F51  ; [.FB40.0020.0004.6BDB][.EBDB.0000.0000.6BDB] # KANGXI RADICAL FUR; QQK
+2F52  ; [.FB40.0020.0004.6C0F][.EC0F.0000.0000.6C0F] # KANGXI RADICAL CLAN; QQK
+2EA0  ; [.FB40.0020.0004.6C11][.EC11.0000.0000.6C11] # CJK RADICAL CIVILIAN; QQK
+2F53  ; [.FB40.0020.0004.6C14][.EC14.0000.0000.6C14] # KANGXI RADICAL STEAM; QQK
+2F54  ; [.FB40.0020.0004.6C34][.EC34.0000.0000.6C34] # KANGXI RADICAL WATER; QQK
+322C  ; [*02FF.0020.0004.322C][.FB40.0020.0004.6C34][.EC34.0000.0000.6C34][*0300.0020.001F.322C] # PARENTHESIZED IDEOGRAPH WATER; QQKN
+328C  ; [.FB40.0020.0006.6C34][.EC34.0000.0000.6C34] # CIRCLED IDEOGRAPH WATER; QQK
+2EA1  ; [.FB40.0020.0004.6C35][.EC35.0000.0000.6C35] # CJK RADICAL WATER ONE; QQK
+2EA2  ; [.FB40.0020.0004.6C3A][.EC3A.0000.0000.6C3A] # CJK RADICAL WATER TWO; QQK
+2F8FA ; [.FB40.0020.0002.6C4E][.EC4E.0000.0000.6C4E] # CJK COMPATIBILITY IDEOGRAPH-2F8FA; QQC
+2F8FE ; [.FB40.0020.0002.6C67][.EC67.0000.0000.6C67] # CJK COMPATIBILITY IDEOGRAPH-2F8FE; QQC
+F972  ; [.FB40.0020.0002.6C88][.EC88.0000.0000.6C88] # CJK COMPATIBILITY IDEOGRAPH-F972; QQC
+2F8FC ; [.FB40.0020.0002.6CBF][.ECBF.0000.0000.6CBF] # CJK COMPATIBILITY IDEOGRAPH-2F8FC; QQC
+F968  ; [.FB40.0020.0002.6CCC][.ECCC.0000.0000.6CCC] # CJK COMPATIBILITY IDEOGRAPH-F968; QQC
+2F8FD ; [.FB40.0020.0002.6CCD][.ECCD.0000.0000.6CCD] # CJK COMPATIBILITY IDEOGRAPH-2F8FD; QQC
+F9E3  ; [.FB40.0020.0002.6CE5][.ECE5.0000.0000.6CE5] # CJK COMPATIBILITY IDEOGRAPH-F9E3; QQC
+329F  ; [.FB40.0020.0006.6CE8][.ECE8.0000.0000.6CE8] # CIRCLED IDEOGRAPH ATTENTION; QQK
+2F8FF ; [.FB40.0020.0002.6D16][.ED16.0000.0000.6D16] # CJK COMPATIBILITY IDEOGRAPH-2F8FF; QQC
+F915  ; [.FB40.0020.0002.6D1B][.ED1B.0000.0000.6D1B] # CJK COMPATIBILITY IDEOGRAPH-F915; QQC
+FA05  ; [.FB40.0020.0002.6D1E][.ED1E.0000.0000.6D1E] # CJK COMPATIBILITY IDEOGRAPH-FA05; QQC
+2F907 ; [.FB40.0020.0002.6D34][.ED34.0000.0000.6D34] # CJK COMPATIBILITY IDEOGRAPH-2F907; QQC
+2F900 ; [.FB40.0020.0002.6D3E][.ED3E.0000.0000.6D3E] # CJK COMPATIBILITY IDEOGRAPH-2F900; QQC
+F9CA  ; [.FB40.0020.0002.6D41][.ED41.0000.0000.6D41] # CJK COMPATIBILITY IDEOGRAPH-F9CA; QQC
+FA97  ; [.FB40.0020.0002.6D41][.ED41.0000.0000.6D41] # CJK COMPATIBILITY IDEOGRAPH-FA97; QQC
+2F902 ; [.FB40.0020.0002.6D41][.ED41.0000.0000.6D41] # CJK COMPATIBILITY IDEOGRAPH-2F902; QQC
+2F903 ; [.FB40.0020.0002.6D69][.ED69.0000.0000.6D69] # CJK COMPATIBILITY IDEOGRAPH-2F903; QQC
+F92A  ; [.FB40.0020.0002.6D6A][.ED6A.0000.0000.6D6A] # CJK COMPATIBILITY IDEOGRAPH-F92A; QQC
+FA45  ; [.FB40.0020.0002.6D77][.ED77.0000.0000.6D77] # CJK COMPATIBILITY IDEOGRAPH-FA45; QQC
+2F901 ; [.FB40.0020.0002.6D77][.ED77.0000.0000.6D77] # CJK COMPATIBILITY IDEOGRAPH-2F901; QQC
+2F904 ; [.FB40.0020.0002.6D78][.ED78.0000.0000.6D78] # CJK COMPATIBILITY IDEOGRAPH-2F904; QQC
+2F905 ; [.FB40.0020.0002.6D85][.ED85.0000.0000.6D85] # CJK COMPATIBILITY IDEOGRAPH-2F905; QQC
+F9F5  ; [.FB40.0020.0002.6DCB][.EDCB.0000.0000.6DCB] # CJK COMPATIBILITY IDEOGRAPH-F9F5; QQC
+F94D  ; [.FB40.0020.0002.6DDA][.EDDA.0000.0000.6DDA] # CJK COMPATIBILITY IDEOGRAPH-F94D; QQC
+F9D6  ; [.FB40.0020.0002.6DEA][.EDEA.0000.0000.6DEA] # CJK COMPATIBILITY IDEOGRAPH-F9D6; QQC
+2F90E ; [.FB40.0020.0002.6DF9][.EDF9.0000.0000.6DF9] # CJK COMPATIBILITY IDEOGRAPH-2F90E; QQC
+FA46  ; [.FB40.0020.0002.6E1A][.EE1A.0000.0000.6E1A] # CJK COMPATIBILITY IDEOGRAPH-FA46; QQC
+2F908 ; [.FB40.0020.0002.6E2F][.EE2F.0000.0000.6E2F] # CJK COMPATIBILITY IDEOGRAPH-2F908; QQC
+2F909 ; [.FB40.0020.0002.6E6E][.EE6E.0000.0000.6E6E] # CJK COMPATIBILITY IDEOGRAPH-2F909; QQC
+F9CB  ; [.FB40.0020.0002.6E9C][.EE9C.0000.0000.6E9C] # CJK COMPATIBILITY IDEOGRAPH-F9CB; QQC
+F9EC  ; [.FB40.0020.0002.6EBA][.EEBA.0000.0000.6EBA] # CJK COMPATIBILITY IDEOGRAPH-F9EC; QQC
+2F90C ; [.FB40.0020.0002.6EC7][.EEC7.0000.0000.6EC7] # CJK COMPATIBILITY IDEOGRAPH-2F90C; QQC
+FA99  ; [.FB40.0020.0002.6ECB][.EECB.0000.0000.6ECB] # CJK COMPATIBILITY IDEOGRAPH-FA99; QQC
+2F90B ; [.FB40.0020.0002.6ECB][.EECB.0000.0000.6ECB] # CJK COMPATIBILITY IDEOGRAPH-2F90B; QQC
+F904  ; [.FB40.0020.0002.6ED1][.EED1.0000.0000.6ED1] # CJK COMPATIBILITY IDEOGRAPH-F904; QQC
+FA98  ; [.FB40.0020.0002.6EDB][.EEDB.0000.0000.6EDB] # CJK COMPATIBILITY IDEOGRAPH-FA98; QQC
+F94E  ; [.FB40.0020.0002.6F0F][.EF0F.0000.0000.6F0F] # CJK COMPATIBILITY IDEOGRAPH-F94E; QQC
+1F226 ; [.FB40.0020.001C.6F14][.EF14.0000.0000.6F14] # SQUARED CJK UNIFIED IDEOGRAPH-6F14; QQK
+FA47  ; [.FB40.0020.0002.6F22][.EF22.0000.0000.6F22] # CJK COMPATIBILITY IDEOGRAPH-FA47; QQC
+FA9A  ; [.FB40.0020.0002.6F22][.EF22.0000.0000.6F22] # CJK COMPATIBILITY IDEOGRAPH-FA9A; QQC
+F992  ; [.FB40.0020.0002.6F23][.EF23.0000.0000.6F23] # CJK COMPATIBILITY IDEOGRAPH-F992; QQC
+2F90F ; [.FB40.0020.0002.6F6E][.EF6E.0000.0000.6F6E] # CJK COMPATIBILITY IDEOGRAPH-2F90F; QQC
+2F912 ; [.FB40.0020.0002.6FC6][.EFC6.0000.0000.6FC6] # CJK COMPATIBILITY IDEOGRAPH-2F912; QQC
+F922  ; [.FB40.0020.0002.6FEB][.EFEB.0000.0000.6FEB] # CJK COMPATIBILITY IDEOGRAPH-F922; QQC
+F984  ; [.FB40.0020.0002.6FFE][.EFFE.0000.0000.6FFE] # CJK COMPATIBILITY IDEOGRAPH-F984; QQC
+2F915 ; [.FB40.0020.0002.701B][.F01B.0000.0000.701B] # CJK COMPATIBILITY IDEOGRAPH-2F915; QQC
+FA9B  ; [.FB40.0020.0002.701E][.F01E.0000.0000.701E] # CJK COMPATIBILITY IDEOGRAPH-FA9B; QQC
+2F914 ; [.FB40.0020.0002.701E][.F01E.0000.0000.701E] # CJK COMPATIBILITY IDEOGRAPH-2F914; QQC
+2F913 ; [.FB40.0020.0002.7039][.F039.0000.0000.7039] # CJK COMPATIBILITY IDEOGRAPH-2F913; QQC
+2F917 ; [.FB40.0020.0002.704A][.F04A.0000.0000.704A] # CJK COMPATIBILITY IDEOGRAPH-2F917; QQC
+2F55  ; [.FB40.0020.0004.706B][.F06B.0000.0000.706B] # KANGXI RADICAL FIRE; QQK
+322B  ; [*02FF.0020.0004.322B][.FB40.0020.0004.706B][.F06B.0000.0000.706B][*0300.0020.001F.322B] # PARENTHESIZED IDEOGRAPH FIRE; QQKN
+328B  ; [.FB40.0020.0006.706B][.F06B.0000.0000.706B] # CIRCLED IDEOGRAPH FIRE; QQK
+2EA3  ; [.FB40.0020.0004.706C][.F06C.0000.0000.706C] # CJK RADICAL FIRE; QQK
+2F835 ; [.FB40.0020.0002.7070][.F070.0000.0000.7070] # CJK COMPATIBILITY IDEOGRAPH-2F835; QQC
+2F919 ; [.FB40.0020.0002.7077][.F077.0000.0000.7077] # CJK COMPATIBILITY IDEOGRAPH-2F919; QQC
+2F918 ; [.FB40.0020.0002.707D][.F07D.0000.0000.707D] # CJK COMPATIBILITY IDEOGRAPH-2F918; QQC
+F9FB  ; [.FB40.0020.0002.7099][.F099.0000.0000.7099] # CJK COMPATIBILITY IDEOGRAPH-F9FB; QQC
+2F91A ; [.FB40.0020.0002.70AD][.F0AD.0000.0000.70AD] # CJK COMPATIBILITY IDEOGRAPH-2F91A; QQC
+1F244 ; [*0347.0020.0004.1F244][.FB40.0020.0004.70B9][.F0B9.0000.0000.70B9][*0348.0020.001F.1F244] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-70B9; QQKN
+F99F  ; [.FB40.0020.0002.70C8][.F0C8.0000.0000.70C8] # CJK COMPATIBILITY IDEOGRAPH-F99F; QQC
+F916  ; [.FB40.0020.0002.70D9][.F0D9.0000.0000.70D9] # CJK COMPATIBILITY IDEOGRAPH-F916; QQC
+1F21A ; [.FB40.0020.001C.7121][.F121.0000.0000.7121] # SQUARED CJK UNIFIED IDEOGRAPH-7121; QQK
+2F91C ; [.FB40.0020.0002.7145][.F145.0000.0000.7145] # CJK COMPATIBILITY IDEOGRAPH-2F91C; QQC
+F993  ; [.FB40.0020.0002.7149][.F149.0000.0000.7149] # CJK COMPATIBILITY IDEOGRAPH-F993; QQC
+FA48  ; [.FB40.0020.0002.716E][.F16E.0000.0000.716E] # CJK COMPATIBILITY IDEOGRAPH-FA48; QQC
+FA9C  ; [.FB40.0020.0002.716E][.F16E.0000.0000.716E] # CJK COMPATIBILITY IDEOGRAPH-FA9C; QQC
+2F91E ; [.FB40.0020.0002.719C][.F19C.0000.0000.719C] # CJK COMPATIBILITY IDEOGRAPH-2F91E; QQC
+F9C0  ; [.FB40.0020.0002.71CE][.F1CE.0000.0000.71CE] # CJK COMPATIBILITY IDEOGRAPH-F9C0; QQC
+F9EE  ; [.FB40.0020.0002.71D0][.F1D0.0000.0000.71D0] # CJK COMPATIBILITY IDEOGRAPH-F9EE; QQC
+F932  ; [.FB40.0020.0002.7210][.F210.0000.0000.7210] # CJK COMPATIBILITY IDEOGRAPH-F932; QQC
+F91E  ; [.FB40.0020.0002.721B][.F21B.0000.0000.721B] # CJK COMPATIBILITY IDEOGRAPH-F91E; QQC
+2F920 ; [.FB40.0020.0002.7228][.F228.0000.0000.7228] # CJK COMPATIBILITY IDEOGRAPH-2F920; QQC
+2F56  ; [.FB40.0020.0004.722A][.F22A.0000.0000.722A] # KANGXI RADICAL CLAW; QQK
+FA49  ; [.FB40.0020.0002.722B][.F22B.0000.0000.722B] # CJK COMPATIBILITY IDEOGRAPH-FA49; QQC
+2EA4  ; [.FB40.0020.0004.722B][.F22B.0000.0000.722B] # CJK RADICAL PAW ONE; QQK
+2EA5  ; [.FB40.0020.0004.722B][.F22B.0000.0000.722B][.0000.0159.001F.2EA5] # CJK RADICAL PAW TWO; QQKN
+FA9E  ; [.FB40.0020.0002.7235][.F235.0000.0000.7235] # CJK COMPATIBILITY IDEOGRAPH-FA9E; QQC
+2F921 ; [.FB40.0020.0002.7235][.F235.0000.0000.7235] # CJK COMPATIBILITY IDEOGRAPH-2F921; QQC
+2F57  ; [.FB40.0020.0004.7236][.F236.0000.0000.7236] # KANGXI RADICAL FATHER; QQK
+2F58  ; [.FB40.0020.0004.723B][.F23B.0000.0000.723B] # KANGXI RADICAL DOUBLE X; QQK
+2F59  ; [.FB40.0020.0004.723F][.F23F.0000.0000.723F] # KANGXI RADICAL HALF TREE TRUNK; QQK
+2F5A  ; [.FB40.0020.0004.7247][.F247.0000.0000.7247] # KANGXI RADICAL SLICE; QQK
+2F922 ; [.FB40.0020.0002.7250][.F250.0000.0000.7250] # CJK COMPATIBILITY IDEOGRAPH-2F922; QQC
+2F5B  ; [.FB40.0020.0004.7259][.F259.0000.0000.7259] # KANGXI RADICAL FANG; QQK
+2F5C  ; [.FB40.0020.0004.725B][.F25B.0000.0000.725B] # KANGXI RADICAL COW; QQK
+2EA7  ; [.FB40.0020.0004.725B][.F25B.0000.0000.725B][.0000.0159.001F.2EA7] # CJK RADICAL COW; QQKN
+F946  ; [.FB40.0020.0002.7262][.F262.0000.0000.7262] # CJK COMPATIBILITY IDEOGRAPH-F946; QQC
+3235  ; [*02FF.0020.0004.3235][.FB40.0020.0004.7279][.F279.0000.0000.7279][*0300.0020.001F.3235] # PARENTHESIZED IDEOGRAPH SPECIAL; QQKN
+3295  ; [.FB40.0020.0006.7279][.F279.0000.0000.7279] # CIRCLED IDEOGRAPH SPECIAL; QQK
+2F924 ; [.FB40.0020.0002.7280][.F280.0000.0000.7280] # CJK COMPATIBILITY IDEOGRAPH-2F924; QQC
+2F925 ; [.FB40.0020.0002.7295][.F295.0000.0000.7295] # CJK COMPATIBILITY IDEOGRAPH-2F925; QQC
+2F5D  ; [.FB40.0020.0004.72AC][.F2AC.0000.0000.72AC] # KANGXI RADICAL DOG; QQK
+2EA8  ; [.FB40.0020.0004.72AD][.F2AD.0000.0000.72AD] # CJK RADICAL DOG; QQK
+FA9F  ; [.FB40.0020.0002.72AF][.F2AF.0000.0000.72AF] # CJK COMPATIBILITY IDEOGRAPH-FA9F; QQC
+F9FA  ; [.FB40.0020.0002.72C0][.F2C0.0000.0000.72C0] # CJK COMPATIBILITY IDEOGRAPH-F9FA; QQC
+F92B  ; [.FB40.0020.0002.72FC][.F2FC.0000.0000.72FC] # CJK COMPATIBILITY IDEOGRAPH-F92B; QQC
+FA16  ; [.FB40.0020.0002.732A][.F32A.0000.0000.732A] # CJK COMPATIBILITY IDEOGRAPH-FA16; QQC
+FAA0  ; [.FB40.0020.0002.732A][.F32A.0000.0000.732A] # CJK COMPATIBILITY IDEOGRAPH-FAA0; QQC
+F9A7  ; [.FB40.0020.0002.7375][.F375.0000.0000.7375] # CJK COMPATIBILITY IDEOGRAPH-F9A7; QQC
+2F928 ; [.FB40.0020.0002.737A][.F37A.0000.0000.737A] # CJK COMPATIBILITY IDEOGRAPH-2F928; QQC
+2F5E  ; [.FB40.0020.0004.7384][.F384.0000.0000.7384] # KANGXI RADICAL PROFOUND; QQK
+F961  ; [.FB40.0020.0002.7387][.F387.0000.0000.7387] # CJK COMPATIBILITY IDEOGRAPH-F961; QQC
+F9DB  ; [.FB40.0020.0002.7387][.F387.0000.0000.7387] # CJK COMPATIBILITY IDEOGRAPH-F9DB; QQC
+2F5F  ; [.FB40.0020.0004.7389][.F389.0000.0000.7389] # KANGXI RADICAL JADE; QQK
+2F929 ; [.FB40.0020.0002.738B][.F38B.0000.0000.738B] # CJK COMPATIBILITY IDEOGRAPH-2F929; QQC
+2EA9  ; [.FB40.0020.0004.738B][.F38B.0000.0000.738B][.0000.0159.001F.2EA9] # CJK RADICAL JADE; QQKN
+2F92B ; [.FB40.0020.0002.73A5][.F3A5.0000.0000.73A5] # CJK COMPATIBILITY IDEOGRAPH-2F92B; QQC
+F9AD  ; [.FB40.0020.0002.73B2][.F3B2.0000.0000.73B2] # CJK COMPATIBILITY IDEOGRAPH-F9AD; QQC
+F917  ; [.FB40.0020.0002.73DE][.F3DE.0000.0000.73DE] # CJK COMPATIBILITY IDEOGRAPH-F917; QQC
+F9E4  ; [.FB40.0020.0002.7406][.F406.0000.0000.7406] # CJK COMPATIBILITY IDEOGRAPH-F9E4; QQC
+F9CC  ; [.FB40.0020.0002.7409][.F409.0000.0000.7409] # CJK COMPATIBILITY IDEOGRAPH-F9CC; QQC
+FA4A  ; [.FB40.0020.0002.7422][.F422.0000.0000.7422] # CJK COMPATIBILITY IDEOGRAPH-FA4A; QQC
+2F92E ; [.FB40.0020.0002.7447][.F447.0000.0000.7447] # CJK COMPATIBILITY IDEOGRAPH-2F92E; QQC
+2F92F ; [.FB40.0020.0002.745C][.F45C.0000.0000.745C] # CJK COMPATIBILITY IDEOGRAPH-2F92F; QQC
+F9AE  ; [.FB40.0020.0002.7469][.F469.0000.0000.7469] # CJK COMPATIBILITY IDEOGRAPH-F9AE; QQC
+FAA1  ; [.FB40.0020.0002.7471][.F471.0000.0000.7471] # CJK COMPATIBILITY IDEOGRAPH-FAA1; QQC
+2F930 ; [.FB40.0020.0002.7471][.F471.0000.0000.7471] # CJK COMPATIBILITY IDEOGRAPH-2F930; QQC
+2F931 ; [.FB40.0020.0002.7485][.F485.0000.0000.7485] # CJK COMPATIBILITY IDEOGRAPH-2F931; QQC
+F994  ; [.FB40.0020.0002.7489][.F489.0000.0000.7489] # CJK COMPATIBILITY IDEOGRAPH-F994; QQC
+F9EF  ; [.FB40.0020.0002.7498][.F498.0000.0000.7498] # CJK COMPATIBILITY IDEOGRAPH-F9EF; QQC
+2F932 ; [.FB40.0020.0002.74CA][.F4CA.0000.0000.74CA] # CJK COMPATIBILITY IDEOGRAPH-2F932; QQC
+2F60  ; [.FB40.0020.0004.74DC][.F4DC.0000.0000.74DC] # KANGXI RADICAL MELON; QQK
+2F61  ; [.FB40.0020.0004.74E6][.F4E6.0000.0000.74E6] # KANGXI RADICAL TILE; QQK
+FAA2  ; [.FB40.0020.0002.7506][.F506.0000.0000.7506] # CJK COMPATIBILITY IDEOGRAPH-FAA2; QQC
+2F62  ; [.FB40.0020.0004.7518][.F518.0000.0000.7518] # KANGXI RADICAL SWEET; QQK
+2F63  ; [.FB40.0020.0004.751F][.F51F.0000.0000.751F] # KANGXI RADICAL LIFE; QQK
+1F222 ; [.FB40.0020.001C.751F][.F51F.0000.0000.751F] # SQUARED CJK UNIFIED IDEOGRAPH-751F; QQK
+2F934 ; [.FB40.0020.0002.7524][.F524.0000.0000.7524] # CJK COMPATIBILITY IDEOGRAPH-2F934; QQC
+2F64  ; [.FB40.0020.0004.7528][.F528.0000.0000.7528] # KANGXI RADICAL USE; QQK
+2F65  ; [.FB40.0020.0004.7530][.F530.0000.0000.7530] # KANGXI RADICAL FIELD; QQK
+3199  ; [.FB40.0020.0014.7532][.F532.0000.0000.7532] # IDEOGRAPHIC ANNOTATION FIRST MARK; QQK
+329A  ; [.FB40.0020.0006.7537][.F537.0000.0000.7537] # CIRCLED IDEOGRAPH MALE; QQK
+FAA3  ; [.FB40.0020.0002.753B][.F53B.0000.0000.753B] # CJK COMPATIBILITY IDEOGRAPH-FAA3; QQC
+2F936 ; [.FB40.0020.0002.753E][.F53E.0000.0000.753E] # CJK COMPATIBILITY IDEOGRAPH-2F936; QQC
+F9CD  ; [.FB40.0020.0002.7559][.F559.0000.0000.7559] # CJK COMPATIBILITY IDEOGRAPH-F9CD; QQC
+F976  ; [.FB40.0020.0002.7565][.F565.0000.0000.7565] # CJK COMPATIBILITY IDEOGRAPH-F976; QQC
+F962  ; [.FB40.0020.0002.7570][.F570.0000.0000.7570] # CJK COMPATIBILITY IDEOGRAPH-F962; QQC
+2F938 ; [.FB40.0020.0002.7570][.F570.0000.0000.7570] # CJK COMPATIBILITY IDEOGRAPH-2F938; QQC
+2F66  ; [.FB40.0020.0004.758B][.F58B.0000.0000.758B] # KANGXI RADICAL BOLT OF CLOTH; QQK
+2EAA  ; [.FB40.0020.0004.758B][.F58B.0000.0000.758B][.0000.0159.001F.2EAA] # CJK RADICAL BOLT OF CLOTH; QQKN
+2F67  ; [.FB40.0020.0004.7592][.F592.0000.0000.7592] # KANGXI RADICAL SICKNESS; QQK
+F9E5  ; [.FB40.0020.0002.75E2][.F5E2.0000.0000.75E2] # CJK COMPATIBILITY IDEOGRAPH-F9E5; QQC
+2F93A ; [.FB40.0020.0002.7610][.F610.0000.0000.7610] # CJK COMPATIBILITY IDEOGRAPH-2F93A; QQC
+FAA4  ; [.FB40.0020.0002.761D][.F61D.0000.0000.761D] # CJK COMPATIBILITY IDEOGRAPH-FAA4; QQC
+FAA5  ; [.FB40.0020.0002.761F][.F61F.0000.0000.761F] # CJK COMPATIBILITY IDEOGRAPH-FAA5; QQC
+F9C1  ; [.FB40.0020.0002.7642][.F642.0000.0000.7642] # CJK COMPATIBILITY IDEOGRAPH-F9C1; QQC
+F90E  ; [.FB40.0020.0002.7669][.F669.0000.0000.7669] # CJK COMPATIBILITY IDEOGRAPH-F90E; QQC
+2F68  ; [.FB40.0020.0004.7676][.F676.0000.0000.7676] # KANGXI RADICAL DOTTED TENT; QQK
+2F69  ; [.FB40.0020.0004.767D][.F67D.0000.0000.767D] # KANGXI RADICAL WHITE; QQK
+2F6A  ; [.FB40.0020.0004.76AE][.F6AE.0000.0000.76AE] # KANGXI RADICAL SKIN; QQK
+2F6B  ; [.FB40.0020.0004.76BF][.F6BF.0000.0000.76BF] # KANGXI RADICAL DISH; QQK
+FA17  ; [.FB40.0020.0002.76CA][.F6CA.0000.0000.76CA] # CJK COMPATIBILITY IDEOGRAPH-FA17; QQC
+FAA6  ; [.FB40.0020.0002.76CA][.F6CA.0000.0000.76CA] # CJK COMPATIBILITY IDEOGRAPH-FAA6; QQC
+1F246 ; [*0347.0020.0004.1F246][.FB40.0020.0004.76D7][.F6D7.0000.0000.76D7][*0348.0020.001F.1F246] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-76D7; QQKN
+FAA7  ; [.FB40.0020.0002.76DB][.F6DB.0000.0000.76DB] # CJK COMPATIBILITY IDEOGRAPH-FAA7; QQC
+323C  ; [*02FF.0020.0004.323C][.FB40.0020.0004.76E3][.F6E3.0000.0000.76E3][*0300.0020.001F.323C] # PARENTHESIZED IDEOGRAPH SUPERVISE; QQKN
+32AC  ; [.FB40.0020.0006.76E3][.F6E3.0000.0000.76E3] # CIRCLED IDEOGRAPH SUPERVISE; QQK
+F933  ; [.FB40.0020.0002.76E7][.F6E7.0000.0000.76E7] # CJK COMPATIBILITY IDEOGRAPH-F933; QQC
+2F6C  ; [.FB40.0020.0004.76EE][.F6EE.0000.0000.76EE] # KANGXI RADICAL EYE; QQK
+2EAB  ; [.FB40.0020.0004.76EE][.F6EE.0000.0000.76EE][.0000.0159.001F.2EAB] # CJK RADICAL EYE; QQKN
+FAA8  ; [.FB40.0020.0002.76F4][.F6F4.0000.0000.76F4] # CJK COMPATIBILITY IDEOGRAPH-FAA8; QQC
+2F940 ; [.FB40.0020.0002.76F4][.F6F4.0000.0000.76F4] # CJK COMPATIBILITY IDEOGRAPH-2F940; QQC
+F96D  ; [.FB40.0020.0002.7701][.F701.0000.0000.7701] # CJK COMPATIBILITY IDEOGRAPH-F96D; QQC
+2F945 ; [.FB40.0020.0002.771E][.F71E.0000.0000.771E] # CJK COMPATIBILITY IDEOGRAPH-2F945; QQC
+2F946 ; [.FB40.0020.0002.771F][.F71F.0000.0000.771F] # CJK COMPATIBILITY IDEOGRAPH-2F946; QQC
+2F947 ; [.FB40.0020.0002.771F][.F71F.0000.0000.771F] # CJK COMPATIBILITY IDEOGRAPH-2F947; QQC
+FAAA  ; [.FB40.0020.0002.7740][.F740.0000.0000.7740] # CJK COMPATIBILITY IDEOGRAPH-FAAA; QQC
+FAA9  ; [.FB40.0020.0002.774A][.F74A.0000.0000.774A] # CJK COMPATIBILITY IDEOGRAPH-FAA9; QQC
+2F948 ; [.FB40.0020.0002.774A][.F74A.0000.0000.774A] # CJK COMPATIBILITY IDEOGRAPH-2F948; QQC
+2F94A ; [.FB40.0020.0002.778B][.F78B.0000.0000.778B] # CJK COMPATIBILITY IDEOGRAPH-2F94A; QQC
+FA9D  ; [.FB40.0020.0002.77A7][.F7A7.0000.0000.77A7] # CJK COMPATIBILITY IDEOGRAPH-FA9D; QQC
+2F6D  ; [.FB40.0020.0004.77DB][.F7DB.0000.0000.77DB] # KANGXI RADICAL SPEAR; QQK
+2F6E  ; [.FB40.0020.0004.77E2][.F7E2.0000.0000.77E2] # KANGXI RADICAL ARROW; QQK
+2F6F  ; [.FB40.0020.0004.77F3][.F7F3.0000.0000.77F3] # KANGXI RADICAL STONE; QQK
+2F94E ; [.FB40.0020.0002.784E][.F84E.0000.0000.784E] # CJK COMPATIBILITY IDEOGRAPH-2F94E; QQC
+F9CE  ; [.FB40.0020.0002.786B][.F86B.0000.0000.786B] # CJK COMPATIBILITY IDEOGRAPH-F9CE; QQC
+F93B  ; [.FB40.0020.0002.788C][.F88C.0000.0000.788C] # CJK COMPATIBILITY IDEOGRAPH-F93B; QQC
+2F94F ; [.FB40.0020.0002.788C][.F88C.0000.0000.788C] # CJK COMPATIBILITY IDEOGRAPH-2F94F; QQC
+FA4B  ; [.FB40.0020.0002.7891][.F891.0000.0000.7891] # CJK COMPATIBILITY IDEOGRAPH-FA4B; QQC
+F947  ; [.FB40.0020.0002.78CA][.F8CA.0000.0000.78CA] # CJK COMPATIBILITY IDEOGRAPH-F947; QQC
+FAAB  ; [.FB40.0020.0002.78CC][.F8CC.0000.0000.78CC] # CJK COMPATIBILITY IDEOGRAPH-FAAB; QQC
+2F950 ; [.FB40.0020.0002.78CC][.F8CC.0000.0000.78CC] # CJK COMPATIBILITY IDEOGRAPH-2F950; QQC
+F964  ; [.FB40.0020.0002.78FB][.F8FB.0000.0000.78FB] # CJK COMPATIBILITY IDEOGRAPH-F964; QQC
+F985  ; [.FB40.0020.0002.792A][.F92A.0000.0000.792A] # CJK COMPATIBILITY IDEOGRAPH-F985; QQC
+2F70  ; [.FB40.0020.0004.793A][.F93A.0000.0000.793A] # KANGXI RADICAL SPIRIT; QQK
+2EAC  ; [.FB40.0020.0004.793A][.F93A.0000.0000.793A][.0000.0159.001F.2EAC] # CJK RADICAL SPIRIT ONE; QQKN
+2EAD  ; [.FB40.0020.0004.793B][.F93B.0000.0000.793B] # CJK RADICAL SPIRIT TWO; QQK
+FA18  ; [.FB40.0020.0002.793C][.F93C.0000.0000.793C] # CJK COMPATIBILITY IDEOGRAPH-FA18; QQC
+FA4C  ; [.FB40.0020.0002.793E][.F93E.0000.0000.793E] # CJK COMPATIBILITY IDEOGRAPH-FA4C; QQC
+3233  ; [*02FF.0020.0004.3233][.FB40.0020.0004.793E][.F93E.0000.0000.793E][*0300.0020.001F.3233] # PARENTHESIZED IDEOGRAPH SOCIETY; QQKN
+3293  ; [.FB40.0020.0006.793E][.F93E.0000.0000.793E] # CIRCLED IDEOGRAPH SOCIETY; QQK
+FA4E  ; [.FB40.0020.0002.7948][.F948.0000.0000.7948] # CJK COMPATIBILITY IDEOGRAPH-FA4E; QQC
+FA4D  ; [.FB40.0020.0002.7949][.F949.0000.0000.7949] # CJK COMPATIBILITY IDEOGRAPH-FA4D; QQC
+FA4F  ; [.FB40.0020.0002.7950][.F950.0000.0000.7950] # CJK COMPATIBILITY IDEOGRAPH-FA4F; QQC
+FA50  ; [.FB40.0020.0002.7956][.F956.0000.0000.7956] # CJK COMPATIBILITY IDEOGRAPH-FA50; QQC
+2F953 ; [.FB40.0020.0002.7956][.F956.0000.0000.7956] # CJK COMPATIBILITY IDEOGRAPH-2F953; QQC
+FA51  ; [.FB40.0020.0002.795D][.F95D.0000.0000.795D] # CJK COMPATIBILITY IDEOGRAPH-FA51; QQC
+3237  ; [*02FF.0020.0004.3237][.FB40.0020.0004.795D][.F95D.0000.0000.795D][*0300.0020.001F.3237] # PARENTHESIZED IDEOGRAPH CONGRATULATION; QQKN
+3297  ; [.FB40.0020.0006.795D][.F95D.0000.0000.795D] # CIRCLED IDEOGRAPH CONGRATULATION; QQK
+FA19  ; [.FB40.0020.0002.795E][.F95E.0000.0000.795E] # CJK COMPATIBILITY IDEOGRAPH-FA19; QQC
+FA1A  ; [.FB40.0020.0002.7965][.F965.0000.0000.7965] # CJK COMPATIBILITY IDEOGRAPH-FA1A; QQC
+3240  ; [*02FF.0020.0004.3240][.FB40.0020.0004.796D][.F96D.0000.0000.796D][*0300.0020.001F.3240] # PARENTHESIZED IDEOGRAPH FESTIVAL; QQKN
+F93C  ; [.FB40.0020.0002.797F][.F97F.0000.0000.797F] # CJK COMPATIBILITY IDEOGRAPH-F93C; QQC
+FA52  ; [.FB40.0020.0002.798D][.F98D.0000.0000.798D] # CJK COMPATIBILITY IDEOGRAPH-FA52; QQC
+FA53  ; [.FB40.0020.0002.798E][.F98E.0000.0000.798E] # CJK COMPATIBILITY IDEOGRAPH-FA53; QQC
+FA1B  ; [.FB40.0020.0002.798F][.F98F.0000.0000.798F] # CJK COMPATIBILITY IDEOGRAPH-FA1B; QQC
+2F956 ; [.FB40.0020.0002.798F][.F98F.0000.0000.798F] # CJK COMPATIBILITY IDEOGRAPH-2F956; QQC
+F9B6  ; [.FB40.0020.0002.79AE][.F9AE.0000.0000.79AE] # CJK COMPATIBILITY IDEOGRAPH-F9B6; QQC
+2F71  ; [.FB40.0020.0004.79B8][.F9B8.0000.0000.79B8] # KANGXI RADICAL TRACK; QQK
+2F72  ; [.FB40.0020.0004.79BE][.F9BE.0000.0000.79BE] # KANGXI RADICAL GRAIN; QQK
+F995  ; [.FB40.0020.0002.79CA][.F9CA.0000.0000.79CA] # CJK COMPATIBILITY IDEOGRAPH-F995; QQC
+3299  ; [.FB40.0020.0006.79D8][.F9D8.0000.0000.79D8] # CIRCLED IDEOGRAPH SECRET; QQK
+2F957 ; [.FB40.0020.0002.79EB][.F9EB.0000.0000.79EB] # CJK COMPATIBILITY IDEOGRAPH-2F957; QQC
+F956  ; [.FB40.0020.0002.7A1C][.FA1C.0000.0000.7A1C] # CJK COMPATIBILITY IDEOGRAPH-F956; QQC
+FA54  ; [.FB40.0020.0002.7A40][.FA40.0000.0000.7A40] # CJK COMPATIBILITY IDEOGRAPH-FA54; QQC
+2F959 ; [.FB40.0020.0002.7A40][.FA40.0000.0000.7A40] # CJK COMPATIBILITY IDEOGRAPH-2F959; QQC
+2F95A ; [.FB40.0020.0002.7A4A][.FA4A.0000.0000.7A4A] # CJK COMPATIBILITY IDEOGRAPH-2F95A; QQC
+2F95B ; [.FB40.0020.0002.7A4F][.FA4F.0000.0000.7A4F] # CJK COMPATIBILITY IDEOGRAPH-2F95B; QQC
+2F73  ; [.FB40.0020.0004.7A74][.FA74.0000.0000.7A74] # KANGXI RADICAL CAVE; QQK
+FA55  ; [.FB40.0020.0002.7A81][.FA81.0000.0000.7A81] # CJK COMPATIBILITY IDEOGRAPH-FA55; QQC
+FAAC  ; [.FB40.0020.0002.7AB1][.FAB1.0000.0000.7AB1] # CJK COMPATIBILITY IDEOGRAPH-FAAC; QQC
+F9F7  ; [.FB40.0020.0002.7ACB][.FACB.0000.0000.7ACB] # CJK COMPATIBILITY IDEOGRAPH-F9F7; QQC
+2F74  ; [.FB40.0020.0004.7ACB][.FACB.0000.0000.7ACB] # KANGXI RADICAL STAND; QQK
+2F95F ; [.FB40.0020.0002.7AEE][.FAEE.0000.0000.7AEE] # CJK COMPATIBILITY IDEOGRAPH-2F95F; QQC
+2F75  ; [.FB40.0020.0004.7AF9][.FAF9.0000.0000.7AF9] # KANGXI RADICAL BAMBOO; QQK
+2EAE  ; [.FB40.0020.0004.7AF9][.FAF9.0000.0000.7AF9][.0000.0159.001F.2EAE] # CJK RADICAL BAMBOO; QQKN
+F9F8  ; [.FB40.0020.0002.7B20][.FB20.0000.0000.7B20] # CJK COMPATIBILITY IDEOGRAPH-F9F8; QQC
+3247  ; [.FB40.0020.0006.7B8F][.FB8F.0000.0000.7B8F] # CIRCLED IDEOGRAPH KOTO; QQK
+FA56  ; [.FB40.0020.0002.7BC0][.FBC0.0000.0000.7BC0] # CJK COMPATIBILITY IDEOGRAPH-FA56; QQC
+FAAD  ; [.FB40.0020.0002.7BC0][.FBC0.0000.0000.7BC0] # CJK COMPATIBILITY IDEOGRAPH-FAAD; QQC
+2F962 ; [.FB40.0020.0002.7BC6][.FBC6.0000.0000.7BC6] # CJK COMPATIBILITY IDEOGRAPH-2F962; QQC
+2F963 ; [.FB40.0020.0002.7BC9][.FBC9.0000.0000.7BC9] # CJK COMPATIBILITY IDEOGRAPH-2F963; QQC
+F9A6  ; [.FB40.0020.0002.7C3E][.FC3E.0000.0000.7C3E] # CJK COMPATIBILITY IDEOGRAPH-F9A6; QQC
+F944  ; [.FB40.0020.0002.7C60][.FC60.0000.0000.7C60] # CJK COMPATIBILITY IDEOGRAPH-F944; QQC
+2F76  ; [.FB40.0020.0004.7C73][.FC73.0000.0000.7C73] # KANGXI RADICAL RICE; QQK
+FAAE  ; [.FB40.0020.0002.7C7B][.FC7B.0000.0000.7C7B] # CJK COMPATIBILITY IDEOGRAPH-FAAE; QQC
+F9F9  ; [.FB40.0020.0002.7C92][.FC92.0000.0000.7C92] # CJK COMPATIBILITY IDEOGRAPH-F9F9; QQC
+FA1D  ; [.FB40.0020.0002.7CBE][.FCBE.0000.0000.7CBE] # CJK COMPATIBILITY IDEOGRAPH-FA1D; QQC
+2F966 ; [.FB40.0020.0002.7CD2][.FCD2.0000.0000.7CD2] # CJK COMPATIBILITY IDEOGRAPH-2F966; QQC
+FA03  ; [.FB40.0020.0002.7CD6][.FCD6.0000.0000.7CD6] # CJK COMPATIBILITY IDEOGRAPH-FA03; QQC
+2F969 ; [.FB40.0020.0002.7CE3][.FCE3.0000.0000.7CE3] # CJK COMPATIBILITY IDEOGRAPH-2F969; QQC
+F97B  ; [.FB40.0020.0002.7CE7][.FCE7.0000.0000.7CE7] # CJK COMPATIBILITY IDEOGRAPH-F97B; QQC
+2F968 ; [.FB40.0020.0002.7CE8][.FCE8.0000.0000.7CE8] # CJK COMPATIBILITY IDEOGRAPH-2F968; QQC
+2F77  ; [.FB40.0020.0004.7CF8][.FCF8.0000.0000.7CF8] # KANGXI RADICAL SILK; QQK
+2EAF  ; [.FB40.0020.0004.7CF9][.FCF9.0000.0000.7CF9] # CJK RADICAL SILK; QQK
+2F96A ; [.FB40.0020.0002.7D00][.FD00.0000.0000.7D00] # CJK COMPATIBILITY IDEOGRAPH-2F96A; QQC
+F9CF  ; [.FB40.0020.0002.7D10][.FD10.0000.0000.7D10] # CJK COMPATIBILITY IDEOGRAPH-F9CF; QQC
+F96A  ; [.FB40.0020.0002.7D22][.FD22.0000.0000.7D22] # CJK COMPATIBILITY IDEOGRAPH-F96A; QQC
+F94F  ; [.FB40.0020.0002.7D2F][.FD2F.0000.0000.7D2F] # CJK COMPATIBILITY IDEOGRAPH-F94F; QQC
+1F221 ; [.FB40.0020.001C.7D42][.FD42.0000.0000.7D42] # SQUARED CJK UNIFIED IDEOGRAPH-7D42; QQK
+FAAF  ; [.FB40.0020.0002.7D5B][.FD5B.0000.0000.7D5B] # CJK COMPATIBILITY IDEOGRAPH-FAAF; QQC
+2F96C ; [.FB40.0020.0002.7D63][.FD63.0000.0000.7D63] # CJK COMPATIBILITY IDEOGRAPH-2F96C; QQC
+F93D  ; [.FB40.0020.0002.7DA0][.FDA0.0000.0000.7DA0] # CJK COMPATIBILITY IDEOGRAPH-F93D; QQC
+F957  ; [.FB40.0020.0002.7DBE][.FDBE.0000.0000.7DBE] # CJK COMPATIBILITY IDEOGRAPH-F957; QQC
+2F96E ; [.FB40.0020.0002.7DC7][.FDC7.0000.0000.7DC7] # CJK COMPATIBILITY IDEOGRAPH-2F96E; QQC
+F996  ; [.FB40.0020.0002.7DF4][.FDF4.0000.0000.7DF4] # CJK COMPATIBILITY IDEOGRAPH-F996; QQC
+FA57  ; [.FB40.0020.0002.7DF4][.FDF4.0000.0000.7DF4] # CJK COMPATIBILITY IDEOGRAPH-FA57; QQC
+FAB0  ; [.FB40.0020.0002.7DF4][.FDF4.0000.0000.7DF4] # CJK COMPATIBILITY IDEOGRAPH-FAB0; QQC
+2F96F ; [.FB40.0020.0002.7E02][.FE02.0000.0000.7E02] # CJK COMPATIBILITY IDEOGRAPH-2F96F; QQC
+FA58  ; [.FB40.0020.0002.7E09][.FE09.0000.0000.7E09] # CJK COMPATIBILITY IDEOGRAPH-FA58; QQC
+F950  ; [.FB40.0020.0002.7E37][.FE37.0000.0000.7E37] # CJK COMPATIBILITY IDEOGRAPH-F950; QQC
+FA59  ; [.FB40.0020.0002.7E41][.FE41.0000.0000.7E41] # CJK COMPATIBILITY IDEOGRAPH-FA59; QQC
+2F970 ; [.FB40.0020.0002.7E45][.FE45.0000.0000.7E45] # CJK COMPATIBILITY IDEOGRAPH-2F970; QQC
+2EB0  ; [.FB40.0020.0004.7E9F][.FE9F.0000.0000.7E9F] # CJK RADICAL C-SIMPLIFIED SILK; QQK
+2F78  ; [.FB40.0020.0004.7F36][.FF36.0000.0000.7F36] # KANGXI RADICAL JAR; QQK
+FAB1  ; [.FB40.0020.0002.7F3E][.FF3E.0000.0000.7F3E] # CJK COMPATIBILITY IDEOGRAPH-FAB1; QQC
+2F79  ; [.FB40.0020.0004.7F51][.FF51.0000.0000.7F51] # KANGXI RADICAL NET; QQK
+2EB2  ; [.FB40.0020.0004.7F52][.FF52.0000.0000.7F52] # CJK RADICAL NET TWO; QQK
+2EB5  ; [.FB40.0020.0004.7F52][.FF52.0000.0000.7F52][.0000.0159.001F.2EB5] # CJK RADICAL MESH; QQKN
+2EB1  ; [.FB40.0020.0004.7F53][.FF53.0000.0000.7F53] # CJK RADICAL NET ONE; QQK
+2EB3  ; [.FB40.0020.0004.7F53][.FF53.0000.0000.7F53][.0000.0159.001F.2EB3] # CJK RADICAL NET THREE; QQKN
+2EB4  ; [.FB40.0020.0004.7F53][.FF53.0000.0000.7F53][.0000.015A.001F.2EB4] # CJK RADICAL NET FOUR; QQKN
+FA5A  ; [.FB40.0020.0002.7F72][.FF72.0000.0000.7F72] # CJK COMPATIBILITY IDEOGRAPH-FA5A; QQC
+F9E6  ; [.FB40.0020.0002.7F79][.FF79.0000.0000.7F79] # CJK COMPATIBILITY IDEOGRAPH-F9E6; QQC
+2F976 ; [.FB40.0020.0002.7F7A][.FF7A.0000.0000.7F7A] # CJK COMPATIBILITY IDEOGRAPH-2F976; QQC
+F90F  ; [.FB40.0020.0002.7F85][.FF85.0000.0000.7F85] # CJK COMPATIBILITY IDEOGRAPH-F90F; QQC
+2F7A  ; [.FB40.0020.0004.7F8A][.FF8A.0000.0000.7F8A] # KANGXI RADICAL SHEEP; QQK
+2EB6  ; [.FB40.0020.0004.7F8A][.FF8A.0000.0000.7F8A][.0000.0159.001F.2EB6] # CJK RADICAL SHEEP; QQKN
+2EB7  ; [.FB40.0020.0004.7F8A][.FF8A.0000.0000.7F8A][.0000.015A.001F.2EB7] # CJK RADICAL RAM; QQKN
+2EB8  ; [.FB40.0020.0004.7F8B][.FF8B.0000.0000.7F8B] # CJK RADICAL EWE; QQK
+2F978 ; [.FB40.0020.0002.7F95][.FF95.0000.0000.7F95] # CJK COMPATIBILITY IDEOGRAPH-2F978; QQC
+F9AF  ; [.FB40.0020.0002.7F9A][.FF9A.0000.0000.7F9A] # CJK COMPATIBILITY IDEOGRAPH-F9AF; QQC
+FA1E  ; [.FB40.0020.0002.7FBD][.FFBD.0000.0000.7FBD] # CJK COMPATIBILITY IDEOGRAPH-FA1E; QQC
+2F7B  ; [.FB40.0020.0004.7FBD][.FFBD.0000.0000.7FBD] # KANGXI RADICAL FEATHER; QQK
+2F979 ; [.FB40.0020.0002.7FFA][.FFFA.0000.0000.7FFA] # CJK COMPATIBILITY IDEOGRAPH-2F979; QQC
+F934  ; [.FB41.0020.0002.8001][.8001.0000.0000.8001] # CJK COMPATIBILITY IDEOGRAPH-F934; QQC
+2F7C  ; [.FB41.0020.0004.8001][.8001.0000.0000.8001] # KANGXI RADICAL OLD; QQK
+2EB9  ; [.FB41.0020.0004.8002][.8002.0000.0000.8002] # CJK RADICAL OLD; QQK
+FA5B  ; [.FB41.0020.0002.8005][.8005.0000.0000.8005] # CJK COMPATIBILITY IDEOGRAPH-FA5B; QQC
+FAB2  ; [.FB41.0020.0002.8005][.8005.0000.0000.8005] # CJK COMPATIBILITY IDEOGRAPH-FAB2; QQC
+2F97A ; [.FB41.0020.0002.8005][.8005.0000.0000.8005] # CJK COMPATIBILITY IDEOGRAPH-2F97A; QQC
+2F7D  ; [.FB41.0020.0004.800C][.800C.0000.0000.800C] # KANGXI RADICAL AND; QQK
+2F7E  ; [.FB41.0020.0004.8012][.8012.0000.0000.8012] # KANGXI RADICAL PLOW; QQK
+2F7F  ; [.FB41.0020.0004.8033][.8033.0000.0000.8033] # KANGXI RADICAL EAR; QQK
+F9B0  ; [.FB41.0020.0002.8046][.8046.0000.0000.8046] # CJK COMPATIBILITY IDEOGRAPH-F9B0; QQC
+2F97D ; [.FB41.0020.0002.8060][.8060.0000.0000.8060] # CJK COMPATIBILITY IDEOGRAPH-2F97D; QQC
+F997  ; [.FB41.0020.0002.806F][.806F.0000.0000.806F] # CJK COMPATIBILITY IDEOGRAPH-F997; QQC
+2F97F ; [.FB41.0020.0002.8070][.8070.0000.0000.8070] # CJK COMPATIBILITY IDEOGRAPH-2F97F; QQC
+F945  ; [.FB41.0020.0002.807E][.807E.0000.0000.807E] # CJK COMPATIBILITY IDEOGRAPH-F945; QQC
+2F80  ; [.FB41.0020.0004.807F][.807F.0000.0000.807F] # KANGXI RADICAL BRUSH; QQK
+2EBB  ; [.FB41.0020.0004.807F][.807F.0000.0000.807F][.0000.0159.001F.2EBB] # CJK RADICAL BRUSH TWO; QQKN
+2EBA  ; [.FB41.0020.0004.8080][.8080.0000.0000.8080] # CJK RADICAL BRUSH ONE; QQK
+2F81  ; [.FB41.0020.0004.8089][.8089.0000.0000.8089] # KANGXI RADICAL MEAT; QQK
+2EBC  ; [.FB41.0020.0004.8089][.8089.0000.0000.8089][.0000.0159.001F.2EBC] # CJK RADICAL MEAT; QQKN
+F953  ; [.FB41.0020.0002.808B][.808B.0000.0000.808B] # CJK COMPATIBILITY IDEOGRAPH-F953; QQC
+2F8D6 ; [.FB41.0020.0002.80AD][.80AD.0000.0000.80AD] # CJK COMPATIBILITY IDEOGRAPH-2F8D6; QQC
+2F982 ; [.FB41.0020.0002.80B2][.80B2.0000.0000.80B2] # CJK COMPATIBILITY IDEOGRAPH-2F982; QQC
+2F983 ; [.FB41.0020.0002.8103][.8103.0000.0000.8103] # CJK COMPATIBILITY IDEOGRAPH-2F983; QQC
+2F985 ; [.FB41.0020.0002.813E][.813E.0000.0000.813E] # CJK COMPATIBILITY IDEOGRAPH-2F985; QQC
+F926  ; [.FB41.0020.0002.81D8][.81D8.0000.0000.81D8] # CJK COMPATIBILITY IDEOGRAPH-F926; QQC
+2F82  ; [.FB41.0020.0004.81E3][.81E3.0000.0000.81E3] # KANGXI RADICAL MINISTER; QQK
+F9F6  ; [.FB41.0020.0002.81E8][.81E8.0000.0000.81E8] # CJK COMPATIBILITY IDEOGRAPH-F9F6; QQC
+2F83  ; [.FB41.0020.0004.81EA][.81EA.0000.0000.81EA] # KANGXI RADICAL SELF; QQK
+3242  ; [*02FF.0020.0004.3242][.FB41.0020.0004.81EA][.81EA.0000.0000.81EA][*0300.0020.001F.3242] # PARENTHESIZED IDEOGRAPH SELF; QQKN
+FA5C  ; [.FB41.0020.0002.81ED][.81ED.0000.0000.81ED] # CJK COMPATIBILITY IDEOGRAPH-FA5C; QQC
+2F84  ; [.FB41.0020.0004.81F3][.81F3.0000.0000.81F3] # KANGXI RADICAL ARRIVE; QQK
+3243  ; [*02FF.0020.0004.3243][.FB41.0020.0004.81F3][.81F3.0000.0000.81F3][*0300.0020.001F.3243] # PARENTHESIZED IDEOGRAPH REACH; QQKN
+2F85  ; [.FB41.0020.0004.81FC][.81FC.0000.0000.81FC] # KANGXI RADICAL MORTAR; QQK
+2EBD  ; [.FB41.0020.0004.81FC][.81FC.0000.0000.81FC][.0000.0159.001F.2EBD] # CJK RADICAL MORTAR; QQKN
+2F893 ; [.FB41.0020.0002.8201][.8201.0000.0000.8201] # CJK COMPATIBILITY IDEOGRAPH-2F893; QQC
+2F98B ; [.FB41.0020.0002.8201][.8201.0000.0000.8201] # CJK COMPATIBILITY IDEOGRAPH-2F98B; QQC
+2F98C ; [.FB41.0020.0002.8204][.8204.0000.0000.8204] # CJK COMPATIBILITY IDEOGRAPH-2F98C; QQC
+2F86  ; [.FB41.0020.0004.820C][.820C.0000.0000.820C] # KANGXI RADICAL TONGUE; QQK
+FA6D  ; [.FB41.0020.0002.8218][.8218.0000.0000.8218] # CJK COMPATIBILITY IDEOGRAPH-FA6D; QQC
+2F87  ; [.FB41.0020.0004.821B][.821B.0000.0000.821B] # KANGXI RADICAL OPPOSE; QQK
+2F88  ; [.FB41.0020.0004.821F][.821F.0000.0000.821F] # KANGXI RADICAL BOAT; QQK
+2F89  ; [.FB41.0020.0004.826E][.826E.0000.0000.826E] # KANGXI RADICAL STOPPING; QQK
+F97C  ; [.FB41.0020.0002.826F][.826F.0000.0000.826F] # CJK COMPATIBILITY IDEOGRAPH-F97C; QQC
+2F8A  ; [.FB41.0020.0004.8272][.8272.0000.0000.8272] # KANGXI RADICAL COLOR; QQK
+2F8B  ; [.FB41.0020.0004.8278][.8278.0000.0000.8278] # KANGXI RADICAL GRASS; QQK
+FA5D  ; [.FB41.0020.0002.8279][.8279.0000.0000.8279] # CJK COMPATIBILITY IDEOGRAPH-FA5D; QQC
+FA5E  ; [.FB41.0020.0002.8279][.8279.0000.0000.8279] # CJK COMPATIBILITY IDEOGRAPH-FA5E; QQC
+2EBE  ; [.FB41.0020.0004.8279][.8279.0000.0000.8279] # CJK RADICAL GRASS ONE; QQK
+2EBF  ; [.FB41.0020.0004.8279][.8279.0000.0000.8279][.0000.0159.001F.2EBF] # CJK RADICAL GRASS TWO; QQKN
+2EC0  ; [.FB41.0020.0004.8279][.8279.0000.0000.8279][.0000.015A.001F.2EC0] # CJK RADICAL GRASS THREE; QQKN
+2F990 ; [.FB41.0020.0002.828B][.828B.0000.0000.828B] # CJK COMPATIBILITY IDEOGRAPH-2F990; QQC
+2F98F ; [.FB41.0020.0002.8291][.8291.0000.0000.8291] # CJK COMPATIBILITY IDEOGRAPH-2F98F; QQC
+2F991 ; [.FB41.0020.0002.829D][.829D.0000.0000.829D] # CJK COMPATIBILITY IDEOGRAPH-2F991; QQC
+2F993 ; [.FB41.0020.0002.82B1][.82B1.0000.0000.82B1] # CJK COMPATIBILITY IDEOGRAPH-2F993; QQC
+2F994 ; [.FB41.0020.0002.82B3][.82B3.0000.0000.82B3] # CJK COMPATIBILITY IDEOGRAPH-2F994; QQC
+2F995 ; [.FB41.0020.0002.82BD][.82BD.0000.0000.82BD] # CJK COMPATIBILITY IDEOGRAPH-2F995; QQC
+F974  ; [.FB41.0020.0002.82E5][.82E5.0000.0000.82E5] # CJK COMPATIBILITY IDEOGRAPH-F974; QQC
+2F998 ; [.FB41.0020.0002.82E5][.82E5.0000.0000.82E5] # CJK COMPATIBILITY IDEOGRAPH-2F998; QQC
+2F996 ; [.FB41.0020.0002.82E6][.82E6.0000.0000.82E6] # CJK COMPATIBILITY IDEOGRAPH-2F996; QQC
+2F999 ; [.FB41.0020.0002.831D][.831D.0000.0000.831D] # CJK COMPATIBILITY IDEOGRAPH-2F999; QQC
+2F99C ; [.FB41.0020.0002.8323][.8323.0000.0000.8323] # CJK COMPATIBILITY IDEOGRAPH-2F99C; QQC
+F9FE  ; [.FB41.0020.0002.8336][.8336.0000.0000.8336] # CJK COMPATIBILITY IDEOGRAPH-F9FE; QQC
+FAB3  ; [.FB41.0020.0002.8352][.8352.0000.0000.8352] # CJK COMPATIBILITY IDEOGRAPH-FAB3; QQC
+2F9A0 ; [.FB41.0020.0002.8353][.8353.0000.0000.8353] # CJK COMPATIBILITY IDEOGRAPH-2F9A0; QQC
+2F99A ; [.FB41.0020.0002.8363][.8363.0000.0000.8363] # CJK COMPATIBILITY IDEOGRAPH-2F99A; QQC
+2F99B ; [.FB41.0020.0002.83AD][.83AD.0000.0000.83AD] # CJK COMPATIBILITY IDEOGRAPH-2F99B; QQC
+2F99D ; [.FB41.0020.0002.83BD][.83BD.0000.0000.83BD] # CJK COMPATIBILITY IDEOGRAPH-2F99D; QQC
+F93E  ; [.FB41.0020.0002.83C9][.83C9.0000.0000.83C9] # CJK COMPATIBILITY IDEOGRAPH-F93E; QQC
+2F9A1 ; [.FB41.0020.0002.83CA][.83CA.0000.0000.83CA] # CJK COMPATIBILITY IDEOGRAPH-2F9A1; QQC
+2F9A2 ; [.FB41.0020.0002.83CC][.83CC.0000.0000.83CC] # CJK COMPATIBILITY IDEOGRAPH-2F9A2; QQC
+2F9A3 ; [.FB41.0020.0002.83DC][.83DC.0000.0000.83DC] # CJK COMPATIBILITY IDEOGRAPH-2F9A3; QQC
+2F99E ; [.FB41.0020.0002.83E7][.83E7.0000.0000.83E7] # CJK COMPATIBILITY IDEOGRAPH-2F99E; QQC
+FAB4  ; [.FB41.0020.0002.83EF][.83EF.0000.0000.83EF] # CJK COMPATIBILITY IDEOGRAPH-FAB4; QQC
+F958  ; [.FB41.0020.0002.83F1][.83F1.0000.0000.83F1] # CJK COMPATIBILITY IDEOGRAPH-F958; QQC
+F918  ; [.FB41.0020.0002.843D][.843D.0000.0000.843D] # CJK COMPATIBILITY IDEOGRAPH-F918; QQC
+F96E  ; [.FB41.0020.0002.8449][.8449.0000.0000.8449] # CJK COMPATIBILITY IDEOGRAPH-F96E; QQC
+FA5F  ; [.FB41.0020.0002.8457][.8457.0000.0000.8457] # CJK COMPATIBILITY IDEOGRAPH-FA5F; QQC
+2F99F ; [.FB41.0020.0002.8457][.8457.0000.0000.8457] # CJK COMPATIBILITY IDEOGRAPH-2F99F; QQC
+F999  ; [.FB41.0020.0002.84EE][.84EE.0000.0000.84EE] # CJK COMPATIBILITY IDEOGRAPH-F999; QQC
+2F9A8 ; [.FB41.0020.0002.84F1][.84F1.0000.0000.84F1] # CJK COMPATIBILITY IDEOGRAPH-2F9A8; QQC
+2F9A9 ; [.FB41.0020.0002.84F3][.84F3.0000.0000.84F3] # CJK COMPATIBILITY IDEOGRAPH-2F9A9; QQC
+F9C2  ; [.FB41.0020.0002.84FC][.84FC.0000.0000.84FC] # CJK COMPATIBILITY IDEOGRAPH-F9C2; QQC
+2F9AA ; [.FB41.0020.0002.8516][.8516.0000.0000.8516] # CJK COMPATIBILITY IDEOGRAPH-2F9AA; QQC
+2F9AC ; [.FB41.0020.0002.8564][.8564.0000.0000.8564] # CJK COMPATIBILITY IDEOGRAPH-2F9AC; QQC
+F923  ; [.FB41.0020.0002.85CD][.85CD.0000.0000.85CD] # CJK COMPATIBILITY IDEOGRAPH-F923; QQC
+F9F0  ; [.FB41.0020.0002.85FA][.85FA.0000.0000.85FA] # CJK COMPATIBILITY IDEOGRAPH-F9F0; QQC
+F935  ; [.FB41.0020.0002.8606][.8606.0000.0000.8606] # CJK COMPATIBILITY IDEOGRAPH-F935; QQC
+FA20  ; [.FB41.0020.0002.8612][.8612.0000.0000.8612] # CJK COMPATIBILITY IDEOGRAPH-FA20; QQC
+F91F  ; [.FB41.0020.0002.862D][.862D.0000.0000.862D] # CJK COMPATIBILITY IDEOGRAPH-F91F; QQC
+F910  ; [.FB41.0020.0002.863F][.863F.0000.0000.863F] # CJK COMPATIBILITY IDEOGRAPH-F910; QQC
+2F8C  ; [.FB41.0020.0004.864D][.864D.0000.0000.864D] # KANGXI RADICAL TIGER; QQK
+2EC1  ; [.FB41.0020.0004.864E][.864E.0000.0000.864E] # CJK RADICAL TIGER; QQK
+2F9B3 ; [.FB41.0020.0002.8650][.8650.0000.0000.8650] # CJK COMPATIBILITY IDEOGRAPH-2F9B3; QQC
+F936  ; [.FB41.0020.0002.865C][.865C.0000.0000.865C] # CJK COMPATIBILITY IDEOGRAPH-F936; QQC
+2F9B4 ; [.FB41.0020.0002.865C][.865C.0000.0000.865C] # CJK COMPATIBILITY IDEOGRAPH-2F9B4; QQC
+2F9B5 ; [.FB41.0020.0002.8667][.8667.0000.0000.8667] # CJK COMPATIBILITY IDEOGRAPH-2F9B5; QQC
+2F9B6 ; [.FB41.0020.0002.8669][.8669.0000.0000.8669] # CJK COMPATIBILITY IDEOGRAPH-2F9B6; QQC
+2F8D  ; [.FB41.0020.0004.866B][.866B.0000.0000.866B] # KANGXI RADICAL INSECT; QQK
+2F9B8 ; [.FB41.0020.0002.8688][.8688.0000.0000.8688] # CJK COMPATIBILITY IDEOGRAPH-2F9B8; QQC
+2F9B7 ; [.FB41.0020.0002.86A9][.86A9.0000.0000.86A9] # CJK COMPATIBILITY IDEOGRAPH-2F9B7; QQC
+2F9BA ; [.FB41.0020.0002.86E2][.86E2.0000.0000.86E2] # CJK COMPATIBILITY IDEOGRAPH-2F9BA; QQC
+2F9B9 ; [.FB41.0020.0002.870E][.870E.0000.0000.870E] # CJK COMPATIBILITY IDEOGRAPH-2F9B9; QQC
+2F9BC ; [.FB41.0020.0002.8728][.8728.0000.0000.8728] # CJK COMPATIBILITY IDEOGRAPH-2F9BC; QQC
+2F9BD ; [.FB41.0020.0002.876B][.876B.0000.0000.876B] # CJK COMPATIBILITY IDEOGRAPH-2F9BD; QQC
+FAB5  ; [.FB41.0020.0002.8779][.8779.0000.0000.8779] # CJK COMPATIBILITY IDEOGRAPH-FAB5; QQC
+2F9BB ; [.FB41.0020.0002.8779][.8779.0000.0000.8779] # CJK COMPATIBILITY IDEOGRAPH-2F9BB; QQC
+2F9BE ; [.FB41.0020.0002.8786][.8786.0000.0000.8786] # CJK COMPATIBILITY IDEOGRAPH-2F9BE; QQC
+F911  ; [.FB41.0020.0002.87BA][.87BA.0000.0000.87BA] # CJK COMPATIBILITY IDEOGRAPH-F911; QQC
+2F9C0 ; [.FB41.0020.0002.87E1][.87E1.0000.0000.87E1] # CJK COMPATIBILITY IDEOGRAPH-2F9C0; QQC
+2F9C1 ; [.FB41.0020.0002.8801][.8801.0000.0000.8801] # CJK COMPATIBILITY IDEOGRAPH-2F9C1; QQC
+F927  ; [.FB41.0020.0002.881F][.881F.0000.0000.881F] # CJK COMPATIBILITY IDEOGRAPH-F927; QQC
+2F8E  ; [.FB41.0020.0004.8840][.8840.0000.0000.8840] # KANGXI RADICAL BLOOD; QQK
+FA08  ; [.FB41.0020.0002.884C][.884C.0000.0000.884C] # CJK COMPATIBILITY IDEOGRAPH-FA08; QQC
+2F8F  ; [.FB41.0020.0004.884C][.884C.0000.0000.884C] # KANGXI RADICAL WALK ENCLOSURE; QQK
+2F9C3 ; [.FB41.0020.0002.8860][.8860.0000.0000.8860] # CJK COMPATIBILITY IDEOGRAPH-2F9C3; QQC
+2F9C4 ; [.FB41.0020.0002.8863][.8863.0000.0000.8863] # CJK COMPATIBILITY IDEOGRAPH-2F9C4; QQC
+2F90  ; [.FB41.0020.0004.8863][.8863.0000.0000.8863] # KANGXI RADICAL CLOTHES; QQK
+2EC2  ; [.FB41.0020.0004.8864][.8864.0000.0000.8864] # CJK RADICAL CLOTHES; QQK
+F9A0  ; [.FB41.0020.0002.88C2][.88C2.0000.0000.88C2] # CJK COMPATIBILITY IDEOGRAPH-F9A0; QQC
+F9E7  ; [.FB41.0020.0002.88CF][.88CF.0000.0000.88CF] # CJK COMPATIBILITY IDEOGRAPH-F9E7; QQC
+2F9C6 ; [.FB41.0020.0002.88D7][.88D7.0000.0000.88D7] # CJK COMPATIBILITY IDEOGRAPH-2F9C6; QQC
+2F9C7 ; [.FB41.0020.0002.88DE][.88DE.0000.0000.88DE] # CJK COMPATIBILITY IDEOGRAPH-2F9C7; QQC
+F9E8  ; [.FB41.0020.0002.88E1][.88E1.0000.0000.88E1] # CJK COMPATIBILITY IDEOGRAPH-F9E8; QQC
+F912  ; [.FB41.0020.0002.88F8][.88F8.0000.0000.88F8] # CJK COMPATIBILITY IDEOGRAPH-F912; QQC
+2F9C9 ; [.FB41.0020.0002.88FA][.88FA.0000.0000.88FA] # CJK COMPATIBILITY IDEOGRAPH-2F9C9; QQC
+FA60  ; [.FB41.0020.0002.8910][.8910.0000.0000.8910] # CJK COMPATIBILITY IDEOGRAPH-FA60; QQC
+FAB6  ; [.FB41.0020.0002.8941][.8941.0000.0000.8941] # CJK COMPATIBILITY IDEOGRAPH-FAB6; QQC
+F924  ; [.FB41.0020.0002.8964][.8964.0000.0000.8964] # CJK COMPATIBILITY IDEOGRAPH-F924; QQC
+2F91  ; [.FB41.0020.0004.897E][.897E.0000.0000.897E] # KANGXI RADICAL WEST; QQK
+2EC4  ; [.FB41.0020.0004.897F][.897F.0000.0000.897F] # CJK RADICAL WEST TWO; QQK
+2EC3  ; [.FB41.0020.0004.8980][.8980.0000.0000.8980] # CJK RADICAL WEST ONE; QQK
+FAB7  ; [.FB41.0020.0002.8986][.8986.0000.0000.8986] # CJK COMPATIBILITY IDEOGRAPH-FAB7; QQC
+FA0A  ; [.FB41.0020.0002.898B][.898B.0000.0000.898B] # CJK COMPATIBILITY IDEOGRAPH-FA0A; QQC
+2F92  ; [.FB41.0020.0004.898B][.898B.0000.0000.898B] # KANGXI RADICAL SEE; QQK
+FA61  ; [.FB41.0020.0002.8996][.8996.0000.0000.8996] # CJK COMPATIBILITY IDEOGRAPH-FA61; QQC
+FAB8  ; [.FB41.0020.0002.8996][.8996.0000.0000.8996] # CJK COMPATIBILITY IDEOGRAPH-FAB8; QQC
+2EC5  ; [.FB41.0020.0004.89C1][.89C1.0000.0000.89C1] # CJK RADICAL C-SIMPLIFIED SEE; QQK
+2EC6  ; [.FB41.0020.0004.89D2][.89D2.0000.0000.89D2] # CJK RADICAL SIMPLIFIED HORN; QQK
+2F93  ; [.FB41.0020.0004.89D2][.89D2.0000.0000.89D2] # KANGXI RADICAL HORN; QQK
+2EC7  ; [.FB41.0020.0004.89D2][.89D2.0000.0000.89D2][.0000.0159.001F.2EC7] # CJK RADICAL HORN; QQKN
+1F216 ; [.FB41.0020.001C.89E3][.89E3.0000.0000.89E3] # SQUARED CJK UNIFIED IDEOGRAPH-89E3; QQK
+2F94  ; [.FB41.0020.0004.8A00][.8A00.0000.0000.8A00] # KANGXI RADICAL SPEECH; QQK
+2F9CF ; [.FB41.0020.0002.8AA0][.8AA0.0000.0000.8AA0] # CJK COMPATIBILITY IDEOGRAPH-2F9CF; QQC
+F96F  ; [.FB41.0020.0002.8AAA][.8AAA.0000.0000.8AAA] # CJK COMPATIBILITY IDEOGRAPH-F96F; QQC
+F9A1  ; [.FB41.0020.0002.8AAA][.8AAA.0000.0000.8AAA] # CJK COMPATIBILITY IDEOGRAPH-F9A1; QQC
+FAB9  ; [.FB41.0020.0002.8ABF][.8ABF.0000.0000.8ABF] # CJK COMPATIBILITY IDEOGRAPH-FAB9; QQC
+FABB  ; [.FB41.0020.0002.8ACB][.8ACB.0000.0000.8ACB] # CJK COMPATIBILITY IDEOGRAPH-FABB; QQC
+F97D  ; [.FB41.0020.0002.8AD2][.8AD2.0000.0000.8AD2] # CJK COMPATIBILITY IDEOGRAPH-F97D; QQC
+F941  ; [.FB41.0020.0002.8AD6][.8AD6.0000.0000.8AD6] # CJK COMPATIBILITY IDEOGRAPH-F941; QQC
+FABE  ; [.FB41.0020.0002.8AED][.8AED.0000.0000.8AED] # CJK COMPATIBILITY IDEOGRAPH-FABE; QQC
+2F9D0 ; [.FB41.0020.0002.8AED][.8AED.0000.0000.8AED] # CJK COMPATIBILITY IDEOGRAPH-2F9D0; QQC
+FA22  ; [.FB41.0020.0002.8AF8][.8AF8.0000.0000.8AF8] # CJK COMPATIBILITY IDEOGRAPH-FA22; QQC
+FABA  ; [.FB41.0020.0002.8AF8][.8AF8.0000.0000.8AF8] # CJK COMPATIBILITY IDEOGRAPH-FABA; QQC
+F95D  ; [.FB41.0020.0002.8AFE][.8AFE.0000.0000.8AFE] # CJK COMPATIBILITY IDEOGRAPH-F95D; QQC
+FABD  ; [.FB41.0020.0002.8AFE][.8AFE.0000.0000.8AFE] # CJK COMPATIBILITY IDEOGRAPH-FABD; QQC
+FA62  ; [.FB41.0020.0002.8B01][.8B01.0000.0000.8B01] # CJK COMPATIBILITY IDEOGRAPH-FA62; QQC
+FABC  ; [.FB41.0020.0002.8B01][.8B01.0000.0000.8B01] # CJK COMPATIBILITY IDEOGRAPH-FABC; QQC
+FA63  ; [.FB41.0020.0002.8B39][.8B39.0000.0000.8B39] # CJK COMPATIBILITY IDEOGRAPH-FA63; QQC
+FABF  ; [.FB41.0020.0002.8B39][.8B39.0000.0000.8B39] # CJK COMPATIBILITY IDEOGRAPH-FABF; QQC
+F9FC  ; [.FB41.0020.0002.8B58][.8B58.0000.0000.8B58] # CJK COMPATIBILITY IDEOGRAPH-F9FC; QQC
+F95A  ; [.FB41.0020.0002.8B80][.8B80.0000.0000.8B80] # CJK COMPATIBILITY IDEOGRAPH-F95A; QQC
+FAC0  ; [.FB41.0020.0002.8B8A][.8B8A.0000.0000.8B8A] # CJK COMPATIBILITY IDEOGRAPH-FAC0; QQC
+2F9D1 ; [.FB41.0020.0002.8B8A][.8B8A.0000.0000.8B8A] # CJK COMPATIBILITY IDEOGRAPH-2F9D1; QQC
+2EC8  ; [.FB41.0020.0004.8BA0][.8BA0.0000.0000.8BA0] # CJK RADICAL C-SIMPLIFIED SPEECH; QQK
+2F95  ; [.FB41.0020.0004.8C37][.8C37.0000.0000.8C37] # KANGXI RADICAL VALLEY; QQK
+2F96  ; [.FB41.0020.0004.8C46][.8C46.0000.0000.8C46] # KANGXI RADICAL BEAN; QQK
+F900  ; [.FB41.0020.0002.8C48][.8C48.0000.0000.8C48] # CJK COMPATIBILITY IDEOGRAPH-F900; QQC
+2F9D2 ; [.FB41.0020.0002.8C55][.8C55.0000.0000.8C55] # CJK COMPATIBILITY IDEOGRAPH-2F9D2; QQC
+2F97  ; [.FB41.0020.0004.8C55][.8C55.0000.0000.8C55] # KANGXI RADICAL PIG; QQK
+2F98  ; [.FB41.0020.0004.8C78][.8C78.0000.0000.8C78] # KANGXI RADICAL BADGER; QQK
+2F99  ; [.FB41.0020.0004.8C9D][.8C9D.0000.0000.8C9D] # KANGXI RADICAL SHELL; QQK
+3236  ; [*02FF.0020.0004.3236][.FB41.0020.0004.8CA1][.8CA1.0000.0000.8CA1][*0300.0020.001F.3236] # PARENTHESIZED IDEOGRAPH FINANCIAL; QQKN
+3296  ; [.FB41.0020.0006.8CA1][.8CA1.0000.0000.8CA1] # CIRCLED IDEOGRAPH FINANCIAL; QQK
+1F223 ; [.FB41.0020.001C.8CA9][.8CA9.0000.0000.8CA9] # SQUARED CJK UNIFIED IDEOGRAPH-8CA9; QQK
+2F9D4 ; [.FB41.0020.0002.8CAB][.8CAB.0000.0000.8CAB] # CJK COMPATIBILITY IDEOGRAPH-2F9D4; QQC
+2F9D5 ; [.FB41.0020.0002.8CC1][.8CC1.0000.0000.8CC1] # CJK COMPATIBILITY IDEOGRAPH-2F9D5; QQC
+F948  ; [.FB41.0020.0002.8CC2][.8CC2.0000.0000.8CC2] # CJK COMPATIBILITY IDEOGRAPH-F948; QQC
+323E  ; [*02FF.0020.0004.323E][.FB41.0020.0004.8CC7][.8CC7.0000.0000.8CC7][*0300.0020.001F.323E] # PARENTHESIZED IDEOGRAPH RESOURCE; QQKN
+32AE  ; [.FB41.0020.0006.8CC7][.8CC7.0000.0000.8CC7] # CIRCLED IDEOGRAPH RESOURCE; QQK
+F903  ; [.FB41.0020.0002.8CC8][.8CC8.0000.0000.8CC8] # CJK COMPATIBILITY IDEOGRAPH-F903; QQC
+FA64  ; [.FB41.0020.0002.8CD3][.8CD3.0000.0000.8CD3] # CJK COMPATIBILITY IDEOGRAPH-FA64; QQC
+FA65  ; [.FB41.0020.0002.8D08][.8D08.0000.0000.8D08] # CJK COMPATIBILITY IDEOGRAPH-FA65; QQC
+FAC1  ; [.FB41.0020.0002.8D08][.8D08.0000.0000.8D08] # CJK COMPATIBILITY IDEOGRAPH-FAC1; QQC
+2F9D6 ; [.FB41.0020.0002.8D1B][.8D1B.0000.0000.8D1B] # CJK COMPATIBILITY IDEOGRAPH-2F9D6; QQC
+2EC9  ; [.FB41.0020.0004.8D1D][.8D1D.0000.0000.8D1D] # CJK RADICAL C-SIMPLIFIED SHELL; QQK
+2F9A  ; [.FB41.0020.0004.8D64][.8D64.0000.0000.8D64] # KANGXI RADICAL RED; QQK
+2F9B  ; [.FB41.0020.0004.8D70][.8D70.0000.0000.8D70] # KANGXI RADICAL RUN; QQK
+1F230 ; [.FB41.0020.001C.8D70][.8D70.0000.0000.8D70] # SQUARED CJK UNIFIED IDEOGRAPH-8D70; QQK
+2F9D7 ; [.FB41.0020.0002.8D77][.8D77.0000.0000.8D77] # CJK COMPATIBILITY IDEOGRAPH-2F9D7; QQC
+2F9C  ; [.FB41.0020.0004.8DB3][.8DB3.0000.0000.8DB3] # KANGXI RADICAL FOOT; QQK
+2ECA  ; [.FB41.0020.0004.8DB3][.8DB3.0000.0000.8DB3][.0000.0159.001F.2ECA] # CJK RADICAL FOOT; QQKN
+2F9DB ; [.FB41.0020.0002.8DBC][.8DBC.0000.0000.8DBC] # CJK COMPATIBILITY IDEOGRAPH-2F9DB; QQC
+2F9DA ; [.FB41.0020.0002.8DCB][.8DCB.0000.0000.8DCB] # CJK COMPATIBILITY IDEOGRAPH-2F9DA; QQC
+F937  ; [.FB41.0020.0002.8DEF][.8DEF.0000.0000.8DEF] # CJK COMPATIBILITY IDEOGRAPH-F937; QQC
+2F9DC ; [.FB41.0020.0002.8DF0][.8DF0.0000.0000.8DF0] # CJK COMPATIBILITY IDEOGRAPH-2F9DC; QQC
+2F9D  ; [.FB41.0020.0004.8EAB][.8EAB.0000.0000.8EAB] # KANGXI RADICAL BODY; QQK
+F902  ; [.FB41.0020.0002.8ECA][.8ECA.0000.0000.8ECA] # CJK COMPATIBILITY IDEOGRAPH-F902; QQC
+2F9E  ; [.FB41.0020.0004.8ECA][.8ECA.0000.0000.8ECA] # KANGXI RADICAL CART; QQK
+2F9DE ; [.FB41.0020.0002.8ED4][.8ED4.0000.0000.8ED4] # CJK COMPATIBILITY IDEOGRAPH-2F9DE; QQC
+F998  ; [.FB41.0020.0002.8F26][.8F26.0000.0000.8F26] # CJK COMPATIBILITY IDEOGRAPH-F998; QQC
+F9D7  ; [.FB41.0020.0002.8F2A][.8F2A.0000.0000.8F2A] # CJK COMPATIBILITY IDEOGRAPH-F9D7; QQC
+FAC2  ; [.FB41.0020.0002.8F38][.8F38.0000.0000.8F38] # CJK COMPATIBILITY IDEOGRAPH-FAC2; QQC
+2F9DF ; [.FB41.0020.0002.8F38][.8F38.0000.0000.8F38] # CJK COMPATIBILITY IDEOGRAPH-2F9DF; QQC
+FA07  ; [.FB41.0020.0002.8F3B][.8F3B.0000.0000.8F3B] # CJK COMPATIBILITY IDEOGRAPH-FA07; QQC
+F98D  ; [.FB41.0020.0002.8F62][.8F62.0000.0000.8F62] # CJK COMPATIBILITY IDEOGRAPH-F98D; QQC
+2ECB  ; [.FB41.0020.0004.8F66][.8F66.0000.0000.8F66] # CJK RADICAL C-SIMPLIFIED CART; QQK
+2F9F  ; [.FB41.0020.0004.8F9B][.8F9B.0000.0000.8F9B] # KANGXI RADICAL BITTER; QQK
+2F98D ; [.FB41.0020.0002.8F9E][.8F9E.0000.0000.8F9E] # CJK COMPATIBILITY IDEOGRAPH-2F98D; QQC
+F971  ; [.FB41.0020.0002.8FB0][.8FB0.0000.0000.8FB0] # CJK COMPATIBILITY IDEOGRAPH-F971; QQC
+2FA0  ; [.FB41.0020.0004.8FB0][.8FB0.0000.0000.8FB0] # KANGXI RADICAL MORNING; QQK
+2FA1  ; [.FB41.0020.0004.8FB5][.8FB5.0000.0000.8FB5] # KANGXI RADICAL WALK; QQK
+FA66  ; [.FB41.0020.0002.8FB6][.8FB6.0000.0000.8FB6] # CJK COMPATIBILITY IDEOGRAPH-FA66; QQC
+2ECC  ; [.FB41.0020.0004.8FB6][.8FB6.0000.0000.8FB6] # CJK RADICAL SIMPLIFIED WALK; QQK
+2ECD  ; [.FB41.0020.0004.8FB6][.8FB6.0000.0000.8FB6][.0000.0159.001F.2ECD] # CJK RADICAL WALK ONE; QQKN
+2ECE  ; [.FB41.0020.0004.8FB6][.8FB6.0000.0000.8FB6][.0000.015A.001F.2ECE] # CJK RADICAL WALK TWO; QQKN
+F99A  ; [.FB41.0020.0002.9023][.9023.0000.0000.9023] # CJK COMPATIBILITY IDEOGRAPH-F99A; QQC
+FA25  ; [.FB41.0020.0002.9038][.9038.0000.0000.9038] # CJK COMPATIBILITY IDEOGRAPH-FA25; QQC
+FA67  ; [.FB41.0020.0002.9038][.9038.0000.0000.9038] # CJK COMPATIBILITY IDEOGRAPH-FA67; QQC
+1F22B ; [.FB41.0020.001C.904A][.904A.0000.0000.904A] # SQUARED CJK UNIFIED IDEOGRAPH-904A; QQK
+329C  ; [.FB41.0020.0006.9069][.9069.0000.0000.9069] # CIRCLED IDEOGRAPH SUITABLE; QQK
+FAC3  ; [.FB41.0020.0002.9072][.9072.0000.0000.9072] # CJK COMPATIBILITY IDEOGRAPH-FAC3; QQC
+F9C3  ; [.FB41.0020.0002.907C][.907C.0000.0000.907C] # CJK COMPATIBILITY IDEOGRAPH-F9C3; QQC
+F913  ; [.FB41.0020.0002.908F][.908F.0000.0000.908F] # CJK COMPATIBILITY IDEOGRAPH-F913; QQC
+2FA2  ; [.FB41.0020.0004.9091][.9091.0000.0000.9091] # KANGXI RADICAL CITY; QQK
+2ECF  ; [.FB41.0020.0004.9091][.9091.0000.0000.9091][.0000.0159.001F.2ECF] # CJK RADICAL CITY; QQKN
+2F9E2 ; [.FB41.0020.0002.9094][.9094.0000.0000.9094] # CJK COMPATIBILITY IDEOGRAPH-2F9E2; QQC
+F92C  ; [.FB41.0020.0002.90CE][.90CE.0000.0000.90CE] # CJK COMPATIBILITY IDEOGRAPH-F92C; QQC
+2F9E3 ; [.FB41.0020.0002.90F1][.90F1.0000.0000.90F1] # CJK COMPATIBILITY IDEOGRAPH-2F9E3; QQC
+FA26  ; [.FB41.0020.0002.90FD][.90FD.0000.0000.90FD] # CJK COMPATIBILITY IDEOGRAPH-FA26; QQC
+2F9E4 ; [.FB41.0020.0002.9111][.9111.0000.0000.9111] # CJK COMPATIBILITY IDEOGRAPH-2F9E4; QQC
+2F9E6 ; [.FB41.0020.0002.911B][.911B.0000.0000.911B] # CJK COMPATIBILITY IDEOGRAPH-2F9E6; QQC
+2FA3  ; [.FB41.0020.0004.9149][.9149.0000.0000.9149] # KANGXI RADICAL WINE; QQK
+F919  ; [.FB41.0020.0002.916A][.916A.0000.0000.916A] # CJK COMPATIBILITY IDEOGRAPH-F919; QQC
+FAC4  ; [.FB41.0020.0002.9199][.9199.0000.0000.9199] # CJK COMPATIBILITY IDEOGRAPH-FAC4; QQC
+F9B7  ; [.FB41.0020.0002.91B4][.91B4.0000.0000.91B4] # CJK COMPATIBILITY IDEOGRAPH-F9B7; QQC
+2FA4  ; [.FB41.0020.0004.91C6][.91C6.0000.0000.91C6] # KANGXI RADICAL DISTINGUISH; QQK
+F9E9  ; [.FB41.0020.0002.91CC][.91CC.0000.0000.91CC] # CJK COMPATIBILITY IDEOGRAPH-F9E9; QQC
+2FA5  ; [.FB41.0020.0004.91CC][.91CC.0000.0000.91CC] # KANGXI RADICAL VILLAGE; QQK
+F97E  ; [.FB41.0020.0002.91CF][.91CF.0000.0000.91CF] # CJK COMPATIBILITY IDEOGRAPH-F97E; QQC
+F90A  ; [.FB41.0020.0002.91D1][.91D1.0000.0000.91D1] # CJK COMPATIBILITY IDEOGRAPH-F90A; QQC
+2FA6  ; [.FB41.0020.0004.91D1][.91D1.0000.0000.91D1] # KANGXI RADICAL GOLD; QQK
+322E  ; [*02FF.0020.0004.322E][.FB41.0020.0004.91D1][.91D1.0000.0000.91D1][*0300.0020.001F.322E] # PARENTHESIZED IDEOGRAPH METAL; QQKN
+328E  ; [.FB41.0020.0006.91D1][.91D1.0000.0000.91D1] # CIRCLED IDEOGRAPH METAL; QQK
+F9B1  ; [.FB41.0020.0002.9234][.9234.0000.0000.9234] # CJK COMPATIBILITY IDEOGRAPH-F9B1; QQC
+2F9E7 ; [.FB41.0020.0002.9238][.9238.0000.0000.9238] # CJK COMPATIBILITY IDEOGRAPH-2F9E7; QQC
+FAC5  ; [.FB41.0020.0002.9276][.9276.0000.0000.9276] # CJK COMPATIBILITY IDEOGRAPH-FAC5; QQC
+2F9EA ; [.FB41.0020.0002.927C][.927C.0000.0000.927C] # CJK COMPATIBILITY IDEOGRAPH-2F9EA; QQC
+2F9E8 ; [.FB41.0020.0002.92D7][.92D7.0000.0000.92D7] # CJK COMPATIBILITY IDEOGRAPH-2F9E8; QQC
+2F9E9 ; [.FB41.0020.0002.92D8][.92D8.0000.0000.92D8] # CJK COMPATIBILITY IDEOGRAPH-2F9E9; QQC
+F93F  ; [.FB41.0020.0002.9304][.9304.0000.0000.9304] # CJK COMPATIBILITY IDEOGRAPH-F93F; QQC
+F99B  ; [.FB41.0020.0002.934A][.934A.0000.0000.934A] # CJK COMPATIBILITY IDEOGRAPH-F99B; QQC
+2F9EB ; [.FB41.0020.0002.93F9][.93F9.0000.0000.93F9] # CJK COMPATIBILITY IDEOGRAPH-2F9EB; QQC
+2F9EC ; [.FB41.0020.0002.9415][.9415.0000.0000.9415] # CJK COMPATIBILITY IDEOGRAPH-2F9EC; QQC
+2ED0  ; [.FB41.0020.0004.9485][.9485.0000.0000.9485] # CJK RADICAL C-SIMPLIFIED GOLD; QQK
+2ED1  ; [.FB41.0020.0004.9577][.9577.0000.0000.9577] # CJK RADICAL LONG ONE; QQK
+2FA7  ; [.FB41.0020.0004.9577][.9577.0000.0000.9577] # KANGXI RADICAL LONG; QQK
+2ED2  ; [.FB41.0020.0004.9578][.9578.0000.0000.9578] # CJK RADICAL LONG TWO; QQK
+2ED3  ; [.FB41.0020.0004.957F][.957F.0000.0000.957F] # CJK RADICAL C-SIMPLIFIED LONG; QQK
+2FA8  ; [.FB41.0020.0004.9580][.9580.0000.0000.9580] # KANGXI RADICAL GATE; QQK
+2F9EE ; [.FB41.0020.0002.958B][.958B.0000.0000.958B] # CJK COMPATIBILITY IDEOGRAPH-2F9EE; QQC
+F986  ; [.FB41.0020.0002.95AD][.95AD.0000.0000.95AD] # CJK COMPATIBILITY IDEOGRAPH-F986; QQC
+2F9F0 ; [.FB41.0020.0002.95B7][.95B7.0000.0000.95B7] # CJK COMPATIBILITY IDEOGRAPH-2F9F0; QQC
+2ED4  ; [.FB41.0020.0004.95E8][.95E8.0000.0000.95E8] # CJK RADICAL C-SIMPLIFIED GATE; QQK
+2FA9  ; [.FB41.0020.0004.961C][.961C.0000.0000.961C] # KANGXI RADICAL MOUND; QQK
+2ED5  ; [.FB41.0020.0004.961C][.961C.0000.0000.961C][.0000.0159.001F.2ED5] # CJK RADICAL MOUND ONE; QQKN
+2ED6  ; [.FB41.0020.0004.961D][.961D.0000.0000.961D] # CJK RADICAL MOUND TWO; QQK
+F9C6  ; [.FB41.0020.0002.962E][.962E.0000.0000.962E] # CJK COMPATIBILITY IDEOGRAPH-F9C6; QQC
+F951  ; [.FB41.0020.0002.964B][.964B.0000.0000.964B] # CJK COMPATIBILITY IDEOGRAPH-F951; QQC
+FA09  ; [.FB41.0020.0002.964D][.964D.0000.0000.964D] # CJK COMPATIBILITY IDEOGRAPH-FA09; QQC
+F959  ; [.FB41.0020.0002.9675][.9675.0000.0000.9675] # CJK COMPATIBILITY IDEOGRAPH-F959; QQC
+F9D3  ; [.FB41.0020.0002.9678][.9678.0000.0000.9678] # CJK COMPATIBILITY IDEOGRAPH-F9D3; QQC
+FAC6  ; [.FB41.0020.0002.967C][.967C.0000.0000.967C] # CJK COMPATIBILITY IDEOGRAPH-FAC6; QQC
+F9DC  ; [.FB41.0020.0002.9686][.9686.0000.0000.9686] # CJK COMPATIBILITY IDEOGRAPH-F9DC; QQC
+F9F1  ; [.FB41.0020.0002.96A3][.96A3.0000.0000.96A3] # CJK COMPATIBILITY IDEOGRAPH-F9F1; QQC
+2FAA  ; [.FB41.0020.0004.96B6][.96B6.0000.0000.96B6] # KANGXI RADICAL SLAVE; QQK
+F9B8  ; [.FB41.0020.0002.96B8][.96B8.0000.0000.96B8] # CJK COMPATIBILITY IDEOGRAPH-F9B8; QQC
+2FAB  ; [.FB41.0020.0004.96B9][.96B9.0000.0000.96B9] # KANGXI RADICAL SHORT TAILED BIRD; QQK
+2F9F3 ; [.FB41.0020.0002.96C3][.96C3.0000.0000.96C3] # CJK COMPATIBILITY IDEOGRAPH-2F9F3; QQC
+F9EA  ; [.FB41.0020.0002.96E2][.96E2.0000.0000.96E2] # CJK COMPATIBILITY IDEOGRAPH-F9EA; QQC
+FA68  ; [.FB41.0020.0002.96E3][.96E3.0000.0000.96E3] # CJK COMPATIBILITY IDEOGRAPH-FA68; QQC
+FAC7  ; [.FB41.0020.0002.96E3][.96E3.0000.0000.96E3] # CJK COMPATIBILITY IDEOGRAPH-FAC7; QQC
+2FAC  ; [.FB41.0020.0004.96E8][.96E8.0000.0000.96E8] # KANGXI RADICAL RAIN; QQK
+2ED7  ; [.FB41.0020.0004.96E8][.96E8.0000.0000.96E8][.0000.0159.001F.2ED7] # CJK RADICAL RAIN; QQKN
+F9B2  ; [.FB41.0020.0002.96F6][.96F6.0000.0000.96F6] # CJK COMPATIBILITY IDEOGRAPH-F9B2; QQC
+F949  ; [.FB41.0020.0002.96F7][.96F7.0000.0000.96F7] # CJK COMPATIBILITY IDEOGRAPH-F949; QQC
+2F9F5 ; [.FB41.0020.0002.9723][.9723.0000.0000.9723] # CJK COMPATIBILITY IDEOGRAPH-2F9F5; QQC
+F938  ; [.FB41.0020.0002.9732][.9732.0000.0000.9732] # CJK COMPATIBILITY IDEOGRAPH-F938; QQC
+F9B3  ; [.FB41.0020.0002.9748][.9748.0000.0000.9748] # CJK COMPATIBILITY IDEOGRAPH-F9B3; QQC
+2FAD  ; [.FB41.0020.0004.9751][.9751.0000.0000.9751] # KANGXI RADICAL BLUE; QQK
+2ED8  ; [.FB41.0020.0004.9752][.9752.0000.0000.9752] # CJK RADICAL BLUE; QQK
+FA1C  ; [.FB41.0020.0002.9756][.9756.0000.0000.9756] # CJK COMPATIBILITY IDEOGRAPH-FA1C; QQC
+FAC8  ; [.FB41.0020.0002.9756][.9756.0000.0000.9756] # CJK COMPATIBILITY IDEOGRAPH-FAC8; QQC
+2FAE  ; [.FB41.0020.0004.975E][.975E.0000.0000.975E] # KANGXI RADICAL WRONG; QQK
+2FAF  ; [.FB41.0020.0004.9762][.9762.0000.0000.9762] # KANGXI RADICAL FACE; QQK
+2FB0  ; [.FB41.0020.0004.9769][.9769.0000.0000.9769] # KANGXI RADICAL LEATHER; QQK
+2FB1  ; [.FB41.0020.0004.97CB][.97CB.0000.0000.97CB] # KANGXI RADICAL TANNED LEATHER; QQK
+FAC9  ; [.FB41.0020.0002.97DB][.97DB.0000.0000.97DB] # CJK COMPATIBILITY IDEOGRAPH-FAC9; QQC
+2F9FA ; [.FB41.0020.0002.97E0][.97E0.0000.0000.97E0] # CJK COMPATIBILITY IDEOGRAPH-2F9FA; QQC
+2ED9  ; [.FB41.0020.0004.97E6][.97E6.0000.0000.97E6] # CJK RADICAL C-SIMPLIFIED TANNED LEATHER; QQK
+2FB2  ; [.FB41.0020.0004.97ED][.97ED.0000.0000.97ED] # KANGXI RADICAL LEEK; QQK
+2FB3  ; [.FB41.0020.0004.97F3][.97F3.0000.0000.97F3] # KANGXI RADICAL SOUND; QQK
+FA69  ; [.FB41.0020.0002.97FF][.97FF.0000.0000.97FF] # CJK COMPATIBILITY IDEOGRAPH-FA69; QQC
+FACA  ; [.FB41.0020.0002.97FF][.97FF.0000.0000.97FF] # CJK COMPATIBILITY IDEOGRAPH-FACA; QQC
+2FB4  ; [.FB41.0020.0004.9801][.9801.0000.0000.9801] # KANGXI RADICAL LEAF; QQK
+32A0  ; [.FB41.0020.0006.9805][.9805.0000.0000.9805] # CIRCLED IDEOGRAPH ITEM; QQK
+FACB  ; [.FB41.0020.0002.980B][.980B.0000.0000.980B] # CJK COMPATIBILITY IDEOGRAPH-FACB; QQC
+2F9FE ; [.FB41.0020.0002.980B][.980B.0000.0000.980B] # CJK COMPATIBILITY IDEOGRAPH-2F9FE; QQC
+2F9FF ; [.FB41.0020.0002.980B][.980B.0000.0000.980B] # CJK COMPATIBILITY IDEOGRAPH-2F9FF; QQC
+F9B4  ; [.FB41.0020.0002.9818][.9818.0000.0000.9818] # CJK COMPATIBILITY IDEOGRAPH-F9B4; QQC
+2FA00 ; [.FB41.0020.0002.9829][.9829.0000.0000.9829] # CJK COMPATIBILITY IDEOGRAPH-2FA00; QQC
+FA6A  ; [.FB41.0020.0002.983B][.983B.0000.0000.983B] # CJK COMPATIBILITY IDEOGRAPH-FA6A; QQC
+FACC  ; [.FB41.0020.0002.983B][.983B.0000.0000.983B] # CJK COMPATIBILITY IDEOGRAPH-FACC; QQC
+F9D0  ; [.FB41.0020.0002.985E][.985E.0000.0000.985E] # CJK COMPATIBILITY IDEOGRAPH-F9D0; QQC
+2EDA  ; [.FB41.0020.0004.9875][.9875.0000.0000.9875] # CJK RADICAL C-SIMPLIFIED LEAF; QQK
+2FB5  ; [.FB41.0020.0004.98A8][.98A8.0000.0000.98A8] # KANGXI RADICAL WIND; QQK
+2EDB  ; [.FB41.0020.0004.98CE][.98CE.0000.0000.98CE] # CJK RADICAL C-SIMPLIFIED WIND; QQK
+2FB6  ; [.FB41.0020.0004.98DB][.98DB.0000.0000.98DB] # KANGXI RADICAL FLY; QQK
+2EDC  ; [.FB41.0020.0004.98DE][.98DE.0000.0000.98DE] # CJK RADICAL C-SIMPLIFIED FLY; QQK
+2EDD  ; [.FB41.0020.0004.98DF][.98DF.0000.0000.98DF] # CJK RADICAL EAT ONE; QQK
+2FB7  ; [.FB41.0020.0004.98DF][.98DF.0000.0000.98DF] # KANGXI RADICAL EAT; QQK
+2EDF  ; [.FB41.0020.0004.98E0][.98E0.0000.0000.98E0] # CJK RADICAL EAT THREE; QQK
+2EDE  ; [.FB41.0020.0004.98E0][.98E0.0000.0000.98E0][.0000.0159.001F.2EDE] # CJK RADICAL EAT TWO; QQKN
+2FA02 ; [.FB41.0020.0002.98E2][.98E2.0000.0000.98E2] # CJK COMPATIBILITY IDEOGRAPH-2FA02; QQC
+FA2A  ; [.FB41.0020.0002.98EF][.98EF.0000.0000.98EF] # CJK COMPATIBILITY IDEOGRAPH-FA2A; QQC
+FA2B  ; [.FB41.0020.0002.98FC][.98FC.0000.0000.98FC] # CJK COMPATIBILITY IDEOGRAPH-FA2B; QQC
+FA2C  ; [.FB41.0020.0002.9928][.9928.0000.0000.9928] # CJK COMPATIBILITY IDEOGRAPH-FA2C; QQC
+2FA04 ; [.FB41.0020.0002.9929][.9929.0000.0000.9929] # CJK COMPATIBILITY IDEOGRAPH-2FA04; QQC
+2EE0  ; [.FB41.0020.0004.9963][.9963.0000.0000.9963] # CJK RADICAL C-SIMPLIFIED EAT; QQK
+2FB8  ; [.FB41.0020.0004.9996][.9996.0000.0000.9996] # KANGXI RADICAL HEAD; QQK
+2EE1  ; [.FB41.0020.0004.9996][.9996.0000.0000.9996][.0000.0159.001F.2EE1] # CJK RADICAL HEAD; QQKN
+2FB9  ; [.FB41.0020.0004.9999][.9999.0000.0000.9999] # KANGXI RADICAL FRAGRANT; QQK
+2FA05 ; [.FB41.0020.0002.99A7][.99A7.0000.0000.99A7] # CJK COMPATIBILITY IDEOGRAPH-2FA05; QQC
+2FBA  ; [.FB41.0020.0004.99AC][.99AC.0000.0000.99AC] # KANGXI RADICAL HORSE; QQK
+2FA06 ; [.FB41.0020.0002.99C2][.99C2.0000.0000.99C2] # CJK COMPATIBILITY IDEOGRAPH-2FA06; QQC
+F91A  ; [.FB41.0020.0002.99F1][.99F1.0000.0000.99F1] # CJK COMPATIBILITY IDEOGRAPH-F91A; QQC
+2FA07 ; [.FB41.0020.0002.99FE][.99FE.0000.0000.99FE] # CJK COMPATIBILITY IDEOGRAPH-2FA07; QQC
+F987  ; [.FB41.0020.0002.9A6A][.9A6A.0000.0000.9A6A] # CJK COMPATIBILITY IDEOGRAPH-F987; QQC
+2EE2  ; [.FB41.0020.0004.9A6C][.9A6C.0000.0000.9A6C] # CJK RADICAL C-SIMPLIFIED HORSE; QQK
+2FBB  ; [.FB41.0020.0004.9AA8][.9AA8.0000.0000.9AA8] # KANGXI RADICAL BONE; QQK
+2EE3  ; [.FB41.0020.0004.9AA8][.9AA8.0000.0000.9AA8][.0000.0159.001F.2EE3] # CJK RADICAL BONE; QQKN
+2FBC  ; [.FB41.0020.0004.9AD8][.9AD8.0000.0000.9AD8] # KANGXI RADICAL TALL; QQK
+2FBD  ; [.FB41.0020.0004.9ADF][.9ADF.0000.0000.9ADF] # KANGXI RADICAL HAIR; QQK
+FACD  ; [.FB41.0020.0002.9B12][.9B12.0000.0000.9B12] # CJK COMPATIBILITY IDEOGRAPH-FACD; QQC
+2FA0A ; [.FB41.0020.0002.9B12][.9B12.0000.0000.9B12] # CJK COMPATIBILITY IDEOGRAPH-2FA0A; QQC
+2FBE  ; [.FB41.0020.0004.9B25][.9B25.0000.0000.9B25] # KANGXI RADICAL FIGHT; QQK
+2FBF  ; [.FB41.0020.0004.9B2F][.9B2F.0000.0000.9B2F] # KANGXI RADICAL SACRIFICIAL WINE; QQK
+2FC0  ; [.FB41.0020.0004.9B32][.9B32.0000.0000.9B32] # KANGXI RADICAL CAULDRON; QQK
+2FC1  ; [.FB41.0020.0004.9B3C][.9B3C.0000.0000.9B3C] # KANGXI RADICAL GHOST; QQK
+2EE4  ; [.FB41.0020.0004.9B3C][.9B3C.0000.0000.9B3C][.0000.0159.001F.2EE4] # CJK RADICAL GHOST; QQKN
+2FC2  ; [.FB41.0020.0004.9B5A][.9B5A.0000.0000.9B5A] # KANGXI RADICAL FISH; QQK
+F939  ; [.FB41.0020.0002.9B6F][.9B6F.0000.0000.9B6F] # CJK COMPATIBILITY IDEOGRAPH-F939; QQC
+2FA0B ; [.FB41.0020.0002.9C40][.9C40.0000.0000.9C40] # CJK COMPATIBILITY IDEOGRAPH-2FA0B; QQC
+F9F2  ; [.FB41.0020.0002.9C57][.9C57.0000.0000.9C57] # CJK COMPATIBILITY IDEOGRAPH-F9F2; QQC
+2EE5  ; [.FB41.0020.0004.9C7C][.9C7C.0000.0000.9C7C] # CJK RADICAL C-SIMPLIFIED FISH; QQK
+2FC3  ; [.FB41.0020.0004.9CE5][.9CE5.0000.0000.9CE5] # KANGXI RADICAL BIRD; QQK
+2FA0C ; [.FB41.0020.0002.9CFD][.9CFD.0000.0000.9CFD] # CJK COMPATIBILITY IDEOGRAPH-2FA0C; QQC
+2FA0F ; [.FB41.0020.0002.9D67][.9D67.0000.0000.9D67] # CJK COMPATIBILITY IDEOGRAPH-2FA0F; QQC
+FA2D  ; [.FB41.0020.0002.9DB4][.9DB4.0000.0000.9DB4] # CJK COMPATIBILITY IDEOGRAPH-FA2D; QQC
+F93A  ; [.FB41.0020.0002.9DFA][.9DFA.0000.0000.9DFA] # CJK COMPATIBILITY IDEOGRAPH-F93A; QQC
+F920  ; [.FB41.0020.0002.9E1E][.9E1E.0000.0000.9E1E] # CJK COMPATIBILITY IDEOGRAPH-F920; QQC
+2EE6  ; [.FB41.0020.0004.9E1F][.9E1F.0000.0000.9E1F] # CJK RADICAL C-SIMPLIFIED BIRD; QQK
+2FC4  ; [.FB41.0020.0004.9E75][.9E75.0000.0000.9E75] # KANGXI RADICAL SALT; QQK
+2EE7  ; [.FB41.0020.0004.9E75][.9E75.0000.0000.9E75][.0000.0159.001F.2EE7] # CJK RADICAL C-SIMPLIFIED SALT; QQKN
+F940  ; [.FB41.0020.0002.9E7F][.9E7F.0000.0000.9E7F] # CJK COMPATIBILITY IDEOGRAPH-F940; QQC
+2FC5  ; [.FB41.0020.0004.9E7F][.9E7F.0000.0000.9E7F] # KANGXI RADICAL DEER; QQK
+F988  ; [.FB41.0020.0002.9E97][.9E97.0000.0000.9E97] # CJK COMPATIBILITY IDEOGRAPH-F988; QQC
+F9F3  ; [.FB41.0020.0002.9E9F][.9E9F.0000.0000.9E9F] # CJK COMPATIBILITY IDEOGRAPH-F9F3; QQC
+2FC6  ; [.FB41.0020.0004.9EA5][.9EA5.0000.0000.9EA5] # KANGXI RADICAL WHEAT; QQK
+2EE8  ; [.FB41.0020.0004.9EA6][.9EA6.0000.0000.9EA6] # CJK RADICAL SIMPLIFIED WHEAT; QQK
+2FA15 ; [.FB41.0020.0002.9EBB][.9EBB.0000.0000.9EBB] # CJK COMPATIBILITY IDEOGRAPH-2FA15; QQC
+2FC7  ; [.FB41.0020.0004.9EBB][.9EBB.0000.0000.9EBB] # KANGXI RADICAL HEMP; QQK
+2FC8  ; [.FB41.0020.0004.9EC3][.9EC3.0000.0000.9EC3] # KANGXI RADICAL YELLOW; QQK
+2EE9  ; [.FB41.0020.0004.9EC4][.9EC4.0000.0000.9EC4] # CJK RADICAL SIMPLIFIED YELLOW; QQK
+2FC9  ; [.FB41.0020.0004.9ECD][.9ECD.0000.0000.9ECD] # KANGXI RADICAL MILLET; QQK
+F989  ; [.FB41.0020.0002.9ECE][.9ECE.0000.0000.9ECE] # CJK COMPATIBILITY IDEOGRAPH-F989; QQC
+2FCA  ; [.FB41.0020.0004.9ED1][.9ED1.0000.0000.9ED1] # KANGXI RADICAL BLACK; QQK
+2FA17 ; [.FB41.0020.0002.9EF9][.9EF9.0000.0000.9EF9] # CJK COMPATIBILITY IDEOGRAPH-2FA17; QQC
+2FCB  ; [.FB41.0020.0004.9EF9][.9EF9.0000.0000.9EF9] # KANGXI RADICAL EMBROIDERY; QQK
+2FCC  ; [.FB41.0020.0004.9EFD][.9EFD.0000.0000.9EFD] # KANGXI RADICAL FROG; QQK
+2FA18 ; [.FB41.0020.0002.9EFE][.9EFE.0000.0000.9EFE] # CJK COMPATIBILITY IDEOGRAPH-2FA18; QQC
+2EEA  ; [.FB41.0020.0004.9EFE][.9EFE.0000.0000.9EFE] # CJK RADICAL C-SIMPLIFIED FROG; QQK
+2FA19 ; [.FB41.0020.0002.9F05][.9F05.0000.0000.9F05] # CJK COMPATIBILITY IDEOGRAPH-2FA19; QQC
+2FCD  ; [.FB41.0020.0004.9F0E][.9F0E.0000.0000.9F0E] # KANGXI RADICAL TRIPOD; QQK
+2FA1A ; [.FB41.0020.0002.9F0F][.9F0F.0000.0000.9F0F] # CJK COMPATIBILITY IDEOGRAPH-2FA1A; QQC
+2FCE  ; [.FB41.0020.0004.9F13][.9F13.0000.0000.9F13] # KANGXI RADICAL DRUM; QQK
+2FA1B ; [.FB41.0020.0002.9F16][.9F16.0000.0000.9F16] # CJK COMPATIBILITY IDEOGRAPH-2FA1B; QQC
+2FCF  ; [.FB41.0020.0004.9F20][.9F20.0000.0000.9F20] # KANGXI RADICAL RAT; QQK
+2FA1C ; [.FB41.0020.0002.9F3B][.9F3B.0000.0000.9F3B] # CJK COMPATIBILITY IDEOGRAPH-2FA1C; QQC
+2FD0  ; [.FB41.0020.0004.9F3B][.9F3B.0000.0000.9F3B] # KANGXI RADICAL NOSE; QQK
+FAD8  ; [.FB41.0020.0002.9F43][.9F43.0000.0000.9F43] # CJK COMPATIBILITY IDEOGRAPH-FAD8; QQC
+2FD1  ; [.FB41.0020.0004.9F4A][.9F4A.0000.0000.9F4A] # KANGXI RADICAL EVEN; QQK
+2EEB  ; [.FB41.0020.0004.9F4A][.9F4A.0000.0000.9F4A][.0000.0159.001F.2EEB] # CJK RADICAL J-SIMPLIFIED EVEN; QQKN
+2EEC  ; [.FB41.0020.0004.9F50][.9F50.0000.0000.9F50] # CJK RADICAL C-SIMPLIFIED EVEN; QQK
+2FD2  ; [.FB41.0020.0004.9F52][.9F52.0000.0000.9F52] # KANGXI RADICAL TOOTH; QQK
+2EED  ; [.FB41.0020.0004.9F52][.9F52.0000.0000.9F52][.0000.0159.001F.2EED] # CJK RADICAL J-SIMPLIFIED TOOTH; QQKN
+2EEE  ; [.FB41.0020.0004.9F7F][.9F7F.0000.0000.9F7F] # CJK RADICAL C-SIMPLIFIED TOOTH; QQK
+F9C4  ; [.FB41.0020.0002.9F8D][.9F8D.0000.0000.9F8D] # CJK COMPATIBILITY IDEOGRAPH-F9C4; QQC
+2FD3  ; [.FB41.0020.0004.9F8D][.9F8D.0000.0000.9F8D] # KANGXI RADICAL DRAGON; QQK
+2EEF  ; [.FB41.0020.0004.9F8D][.9F8D.0000.0000.9F8D][.0000.0159.001F.2EEF] # CJK RADICAL J-SIMPLIFIED DRAGON; QQKN
+FAD9  ; [.FB41.0020.0002.9F8E][.9F8E.0000.0000.9F8E] # CJK COMPATIBILITY IDEOGRAPH-FAD9; QQC
+2EF0  ; [.FB41.0020.0004.9F99][.9F99.0000.0000.9F99] # CJK RADICAL C-SIMPLIFIED DRAGON; QQK
+F907  ; [.FB41.0020.0002.9F9C][.9F9C.0000.0000.9F9C] # CJK COMPATIBILITY IDEOGRAPH-F907; QQC
+F908  ; [.FB41.0020.0002.9F9C][.9F9C.0000.0000.9F9C] # CJK COMPATIBILITY IDEOGRAPH-F908; QQC
+FACE  ; [.FB41.0020.0002.9F9C][.9F9C.0000.0000.9F9C] # CJK COMPATIBILITY IDEOGRAPH-FACE; QQC
+2FD4  ; [.FB41.0020.0004.9F9C][.9F9C.0000.0000.9F9C] # KANGXI RADICAL TURTLE; QQK
+2EF1  ; [.FB41.0020.0004.9F9C][.9F9C.0000.0000.9F9C][.0000.0159.001F.2EF1] # CJK RADICAL TURTLE; QQKN
+2EF2  ; [.FB41.0020.0004.9F9C][.9F9C.0000.0000.9F9C][.0000.015A.001F.2EF2] # CJK RADICAL J-SIMPLIFIED TURTLE; QQKN
+2EF3  ; [.FB41.0020.0004.9F9F][.9F9F.0000.0000.9F9F] # CJK RADICAL C-SIMPLIFIED TURTLE; QQK
+2FD5  ; [.FB41.0020.0004.9FA0][.9FA0.0000.0000.9FA0] # KANGXI RADICAL FLUTE; QQK
+FA0E  ; [.FB41.0020.0002.FA0E][.FA0E.0000.0000.FA0E] # CJK COMPATIBILITY IDEOGRAPH-FA0E
+FA0F  ; [.FB41.0020.0002.FA0F][.FA0F.0000.0000.FA0F] # CJK COMPATIBILITY IDEOGRAPH-FA0F
+FA11  ; [.FB41.0020.0002.FA11][.FA11.0000.0000.FA11] # CJK COMPATIBILITY IDEOGRAPH-FA11
+FA13  ; [.FB41.0020.0002.FA13][.FA13.0000.0000.FA13] # CJK COMPATIBILITY IDEOGRAPH-FA13
+FA14  ; [.FB41.0020.0002.FA14][.FA14.0000.0000.FA14] # CJK COMPATIBILITY IDEOGRAPH-FA14
+FA1F  ; [.FB41.0020.0002.FA1F][.FA1F.0000.0000.FA1F] # CJK COMPATIBILITY IDEOGRAPH-FA1F
+FA21  ; [.FB41.0020.0002.FA21][.FA21.0000.0000.FA21] # CJK COMPATIBILITY IDEOGRAPH-FA21
+FA23  ; [.FB41.0020.0002.FA23][.FA23.0000.0000.FA23] # CJK COMPATIBILITY IDEOGRAPH-FA23
+FA24  ; [.FB41.0020.0002.FA24][.FA24.0000.0000.FA24] # CJK COMPATIBILITY IDEOGRAPH-FA24
+FA27  ; [.FB41.0020.0002.FA27][.FA27.0000.0000.FA27] # CJK COMPATIBILITY IDEOGRAPH-FA27
+FA28  ; [.FB41.0020.0002.FA28][.FA28.0000.0000.FA28] # CJK COMPATIBILITY IDEOGRAPH-FA28
+FA29  ; [.FB41.0020.0002.FA29][.FA29.0000.0000.FA29] # CJK COMPATIBILITY IDEOGRAPH-FA29
+2F80C ; [.FB80.0020.0002.349E][.B49E.0000.0000.349E] # CJK COMPATIBILITY IDEOGRAPH-2F80C; QQC
+2F813 ; [.FB80.0020.0002.34B9][.B4B9.0000.0000.34B9] # CJK COMPATIBILITY IDEOGRAPH-2F813; QQC
+2F9CA ; [.FB80.0020.0002.34BB][.B4BB.0000.0000.34BB] # CJK COMPATIBILITY IDEOGRAPH-2F9CA; QQC
+2F81F ; [.FB80.0020.0002.34DF][.B4DF.0000.0000.34DF] # CJK COMPATIBILITY IDEOGRAPH-2F81F; QQC
+2F824 ; [.FB80.0020.0002.3515][.B515.0000.0000.3515] # CJK COMPATIBILITY IDEOGRAPH-2F824; QQC
+2F867 ; [.FB80.0020.0002.36EE][.B6EE.0000.0000.36EE] # CJK COMPATIBILITY IDEOGRAPH-2F867; QQC
+2F868 ; [.FB80.0020.0002.36FC][.B6FC.0000.0000.36FC] # CJK COMPATIBILITY IDEOGRAPH-2F868; QQC
+2F876 ; [.FB80.0020.0002.3781][.B781.0000.0000.3781] # CJK COMPATIBILITY IDEOGRAPH-2F876; QQC
+2F883 ; [.FB80.0020.0002.382F][.B82F.0000.0000.382F] # CJK COMPATIBILITY IDEOGRAPH-2F883; QQC
+2F888 ; [.FB80.0020.0002.3862][.B862.0000.0000.3862] # CJK COMPATIBILITY IDEOGRAPH-2F888; QQC
+2F88A ; [.FB80.0020.0002.387C][.B87C.0000.0000.387C] # CJK COMPATIBILITY IDEOGRAPH-2F88A; QQC
+2F896 ; [.FB80.0020.0002.38C7][.B8C7.0000.0000.38C7] # CJK COMPATIBILITY IDEOGRAPH-2F896; QQC
+2F89B ; [.FB80.0020.0002.38E3][.B8E3.0000.0000.38E3] # CJK COMPATIBILITY IDEOGRAPH-2F89B; QQC
+2F8A2 ; [.FB80.0020.0002.391C][.B91C.0000.0000.391C] # CJK COMPATIBILITY IDEOGRAPH-2F8A2; QQC
+2F8A1 ; [.FB80.0020.0002.393A][.B93A.0000.0000.393A] # CJK COMPATIBILITY IDEOGRAPH-2F8A1; QQC
+2F8C2 ; [.FB80.0020.0002.3A2E][.BA2E.0000.0000.3A2E] # CJK COMPATIBILITY IDEOGRAPH-2F8C2; QQC
+2F8C7 ; [.FB80.0020.0002.3A6C][.BA6C.0000.0000.3A6C] # CJK COMPATIBILITY IDEOGRAPH-2F8C7; QQC
+2F8D1 ; [.FB80.0020.0002.3AE4][.BAE4.0000.0000.3AE4] # CJK COMPATIBILITY IDEOGRAPH-2F8D1; QQC
+2F8D0 ; [.FB80.0020.0002.3B08][.BB08.0000.0000.3B08] # CJK COMPATIBILITY IDEOGRAPH-2F8D0; QQC
+2F8CE ; [.FB80.0020.0002.3B19][.BB19.0000.0000.3B19] # CJK COMPATIBILITY IDEOGRAPH-2F8CE; QQC
+2F8DE ; [.FB80.0020.0002.3B49][.BB49.0000.0000.3B49] # CJK COMPATIBILITY IDEOGRAPH-2F8DE; QQC
+FAD2  ; [.FB80.0020.0002.3B9D][.BB9D.0000.0000.3B9D] # CJK COMPATIBILITY IDEOGRAPH-FAD2; QQC
+2F8E7 ; [.FB80.0020.0002.3B9D][.BB9D.0000.0000.3B9D] # CJK COMPATIBILITY IDEOGRAPH-2F8E7; QQC
+2F8EE ; [.FB80.0020.0002.3C18][.BC18.0000.0000.3C18] # CJK COMPATIBILITY IDEOGRAPH-2F8EE; QQC
+2F8F2 ; [.FB80.0020.0002.3C4E][.BC4E.0000.0000.3C4E] # CJK COMPATIBILITY IDEOGRAPH-2F8F2; QQC
+2F90A ; [.FB80.0020.0002.3D33][.BD33.0000.0000.3D33] # CJK COMPATIBILITY IDEOGRAPH-2F90A; QQC
+2F916 ; [.FB80.0020.0002.3D96][.BD96.0000.0000.3D96] # CJK COMPATIBILITY IDEOGRAPH-2F916; QQC
+2F92A ; [.FB80.0020.0002.3EAC][.BEAC.0000.0000.3EAC] # CJK COMPATIBILITY IDEOGRAPH-2F92A; QQC
+2F92C ; [.FB80.0020.0002.3EB8][.BEB8.0000.0000.3EB8] # CJK COMPATIBILITY IDEOGRAPH-2F92C; QQC
+2F92D ; [.FB80.0020.0002.3EB8][.BEB8.0000.0000.3EB8] # CJK COMPATIBILITY IDEOGRAPH-2F92D; QQC
+2F933 ; [.FB80.0020.0002.3F1B][.BF1B.0000.0000.3F1B] # CJK COMPATIBILITY IDEOGRAPH-2F933; QQC
+2F93E ; [.FB80.0020.0002.3FFC][.BFFC.0000.0000.3FFC] # CJK COMPATIBILITY IDEOGRAPH-2F93E; QQC
+2F93F ; [.FB80.0020.0002.4008][.C008.0000.0000.4008] # CJK COMPATIBILITY IDEOGRAPH-2F93F; QQC
+FAD3  ; [.FB80.0020.0002.4018][.C018.0000.0000.4018] # CJK COMPATIBILITY IDEOGRAPH-FAD3; QQC
+FAD4  ; [.FB80.0020.0002.4039][.C039.0000.0000.4039] # CJK COMPATIBILITY IDEOGRAPH-FAD4; QQC
+2F949 ; [.FB80.0020.0002.4039][.C039.0000.0000.4039] # CJK COMPATIBILITY IDEOGRAPH-2F949; QQC
+2F94B ; [.FB80.0020.0002.4046][.C046.0000.0000.4046] # CJK COMPATIBILITY IDEOGRAPH-2F94B; QQC
+2F94C ; [.FB80.0020.0002.4096][.C096.0000.0000.4096] # CJK COMPATIBILITY IDEOGRAPH-2F94C; QQC
+2F951 ; [.FB80.0020.0002.40E3][.C0E3.0000.0000.40E3] # CJK COMPATIBILITY IDEOGRAPH-2F951; QQC
+2F958 ; [.FB80.0020.0002.412F][.C12F.0000.0000.412F] # CJK COMPATIBILITY IDEOGRAPH-2F958; QQC
+2F960 ; [.FB80.0020.0002.4202][.C202.0000.0000.4202] # CJK COMPATIBILITY IDEOGRAPH-2F960; QQC
+2F964 ; [.FB80.0020.0002.4227][.C227.0000.0000.4227] # CJK COMPATIBILITY IDEOGRAPH-2F964; QQC
+2F967 ; [.FB80.0020.0002.42A0][.C2A0.0000.0000.42A0] # CJK COMPATIBILITY IDEOGRAPH-2F967; QQC
+2F96D ; [.FB80.0020.0002.4301][.C301.0000.0000.4301] # CJK COMPATIBILITY IDEOGRAPH-2F96D; QQC
+2F971 ; [.FB80.0020.0002.4334][.C334.0000.0000.4334] # CJK COMPATIBILITY IDEOGRAPH-2F971; QQC
+2F974 ; [.FB80.0020.0002.4359][.C359.0000.0000.4359] # CJK COMPATIBILITY IDEOGRAPH-2F974; QQC
+2F981 ; [.FB80.0020.0002.43D5][.C3D5.0000.0000.43D5] # CJK COMPATIBILITY IDEOGRAPH-2F981; QQC
+2F8D7 ; [.FB80.0020.0002.43D9][.C3D9.0000.0000.43D9] # CJK COMPATIBILITY IDEOGRAPH-2F8D7; QQC
+2F984 ; [.FB80.0020.0002.440B][.C40B.0000.0000.440B] # CJK COMPATIBILITY IDEOGRAPH-2F984; QQC
+2F98E ; [.FB80.0020.0002.446B][.C46B.0000.0000.446B] # CJK COMPATIBILITY IDEOGRAPH-2F98E; QQC
+2F9A7 ; [.FB80.0020.0002.452B][.C52B.0000.0000.452B] # CJK COMPATIBILITY IDEOGRAPH-2F9A7; QQC
+2F9AE ; [.FB80.0020.0002.455D][.C55D.0000.0000.455D] # CJK COMPATIBILITY IDEOGRAPH-2F9AE; QQC
+2F9AF ; [.FB80.0020.0002.4561][.C561.0000.0000.4561] # CJK COMPATIBILITY IDEOGRAPH-2F9AF; QQC
+2F9B2 ; [.FB80.0020.0002.456B][.C56B.0000.0000.456B] # CJK COMPATIBILITY IDEOGRAPH-2F9B2; QQC
+2F9BF ; [.FB80.0020.0002.45D7][.C5D7.0000.0000.45D7] # CJK COMPATIBILITY IDEOGRAPH-2F9BF; QQC
+2F9C2 ; [.FB80.0020.0002.45F9][.C5F9.0000.0000.45F9] # CJK COMPATIBILITY IDEOGRAPH-2F9C2; QQC
+2F9C8 ; [.FB80.0020.0002.4635][.C635.0000.0000.4635] # CJK COMPATIBILITY IDEOGRAPH-2F9C8; QQC
+2F9CD ; [.FB80.0020.0002.46BE][.C6BE.0000.0000.46BE] # CJK COMPATIBILITY IDEOGRAPH-2F9CD; QQC
+2F9CE ; [.FB80.0020.0002.46C7][.C6C7.0000.0000.46C7] # CJK COMPATIBILITY IDEOGRAPH-2F9CE; QQC
+2F9EF ; [.FB80.0020.0002.4995][.C995.0000.0000.4995] # CJK COMPATIBILITY IDEOGRAPH-2F9EF; QQC
+2F9F2 ; [.FB80.0020.0002.49E6][.C9E6.0000.0000.49E6] # CJK COMPATIBILITY IDEOGRAPH-2F9F2; QQC
+2F9F8 ; [.FB80.0020.0002.4A6E][.CA6E.0000.0000.4A6E] # CJK COMPATIBILITY IDEOGRAPH-2F9F8; QQC
+2F9F9 ; [.FB80.0020.0002.4A76][.CA76.0000.0000.4A76] # CJK COMPATIBILITY IDEOGRAPH-2F9F9; QQC
+2F9FC ; [.FB80.0020.0002.4AB2][.CAB2.0000.0000.4AB2] # CJK COMPATIBILITY IDEOGRAPH-2F9FC; QQC
+2FA03 ; [.FB80.0020.0002.4B33][.CB33.0000.0000.4B33] # CJK COMPATIBILITY IDEOGRAPH-2FA03; QQC
+2FA08 ; [.FB80.0020.0002.4BCE][.CBCE.0000.0000.4BCE] # CJK COMPATIBILITY IDEOGRAPH-2FA08; QQC
+2FA0D ; [.FB80.0020.0002.4CCE][.CCCE.0000.0000.4CCE] # CJK COMPATIBILITY IDEOGRAPH-2FA0D; QQC
+2FA0E ; [.FB80.0020.0002.4CED][.CCED.0000.0000.4CED] # CJK COMPATIBILITY IDEOGRAPH-2FA0E; QQC
+2FA11 ; [.FB80.0020.0002.4CF8][.CCF8.0000.0000.4CF8] # CJK COMPATIBILITY IDEOGRAPH-2FA11; QQC
+2FA16 ; [.FB80.0020.0002.4D56][.CD56.0000.0000.4D56] # CJK COMPATIBILITY IDEOGRAPH-2FA16; QQC
+2F803 ; [.FB84.0020.0002.20122][.8122.0000.0000.20122] # CJK COMPATIBILITY IDEOGRAPH-2F803; QQC
+2F812 ; [.FB84.0020.0002.2051C][.851C.0000.0000.2051C] # CJK COMPATIBILITY IDEOGRAPH-2F812; QQC
+2F91B ; [.FB84.0020.0002.20525][.8525.0000.0000.20525] # CJK COMPATIBILITY IDEOGRAPH-2F91B; QQC
+2F816 ; [.FB84.0020.0002.2054B][.854B.0000.0000.2054B] # CJK COMPATIBILITY IDEOGRAPH-2F816; QQC
+2F80D ; [.FB84.0020.0002.2063A][.863A.0000.0000.2063A] # CJK COMPATIBILITY IDEOGRAPH-2F80D; QQC
+2F9D9 ; [.FB84.0020.0002.20804][.8804.0000.0000.20804] # CJK COMPATIBILITY IDEOGRAPH-2F9D9; QQC
+2F9DD ; [.FB84.0020.0002.208DE][.88DE.0000.0000.208DE] # CJK COMPATIBILITY IDEOGRAPH-2F9DD; QQC
+2F834 ; [.FB84.0020.0002.20A2C][.8A2C.0000.0000.20A2C] # CJK COMPATIBILITY IDEOGRAPH-2F834; QQC
+2F838 ; [.FB84.0020.0002.20B63][.8B63.0000.0000.20B63] # CJK COMPATIBILITY IDEOGRAPH-2F838; QQC
+2F859 ; [.FB84.0020.0002.214E4][.94E4.0000.0000.214E4] # CJK COMPATIBILITY IDEOGRAPH-2F859; QQC
+2F860 ; [.FB84.0020.0002.216A8][.96A8.0000.0000.216A8] # CJK COMPATIBILITY IDEOGRAPH-2F860; QQC
+2F861 ; [.FB84.0020.0002.216EA][.96EA.0000.0000.216EA] # CJK COMPATIBILITY IDEOGRAPH-2F861; QQC
+2F86C ; [.FB84.0020.0002.219C8][.99C8.0000.0000.219C8] # CJK COMPATIBILITY IDEOGRAPH-2F86C; QQC
+2F871 ; [.FB84.0020.0002.21B18][.9B18.0000.0000.21B18] # CJK COMPATIBILITY IDEOGRAPH-2F871; QQC
+2F8F8 ; [.FB84.0020.0002.21D0B][.9D0B.0000.0000.21D0B] # CJK COMPATIBILITY IDEOGRAPH-2F8F8; QQC
+2F87B ; [.FB84.0020.0002.21DE4][.9DE4.0000.0000.21DE4] # CJK COMPATIBILITY IDEOGRAPH-2F87B; QQC
+2F87D ; [.FB84.0020.0002.21DE6][.9DE6.0000.0000.21DE6] # CJK COMPATIBILITY IDEOGRAPH-2F87D; QQC
+2F889 ; [.FB84.0020.0002.22183][.A183.0000.0000.22183] # CJK COMPATIBILITY IDEOGRAPH-2F889; QQC
+2F939 ; [.FB84.0020.0002.2219F][.A19F.0000.0000.2219F] # CJK COMPATIBILITY IDEOGRAPH-2F939; QQC
+2F891 ; [.FB84.0020.0002.22331][.A331.0000.0000.22331] # CJK COMPATIBILITY IDEOGRAPH-2F891; QQC
+2F892 ; [.FB84.0020.0002.22331][.A331.0000.0000.22331] # CJK COMPATIBILITY IDEOGRAPH-2F892; QQC
+2F8A4 ; [.FB84.0020.0002.226D4][.A6D4.0000.0000.226D4] # CJK COMPATIBILITY IDEOGRAPH-2F8A4; QQC
+FAD0  ; [.FB84.0020.0002.22844][.A844.0000.0000.22844] # CJK COMPATIBILITY IDEOGRAPH-FAD0; QQC
+FACF  ; [.FB84.0020.0002.2284A][.A84A.0000.0000.2284A] # CJK COMPATIBILITY IDEOGRAPH-FACF; QQC
+2F8B8 ; [.FB84.0020.0002.22B0C][.AB0C.0000.0000.22B0C] # CJK COMPATIBILITY IDEOGRAPH-2F8B8; QQC
+2F8BE ; [.FB84.0020.0002.22BF1][.ABF1.0000.0000.22BF1] # CJK COMPATIBILITY IDEOGRAPH-2F8BE; QQC
+2F8CA ; [.FB84.0020.0002.2300A][.B00A.0000.0000.2300A] # CJK COMPATIBILITY IDEOGRAPH-2F8CA; QQC
+2F897 ; [.FB84.0020.0002.232B8][.B2B8.0000.0000.232B8] # CJK COMPATIBILITY IDEOGRAPH-2F897; QQC
+2F980 ; [.FB84.0020.0002.2335F][.B35F.0000.0000.2335F] # CJK COMPATIBILITY IDEOGRAPH-2F980; QQC
+2F989 ; [.FB84.0020.0002.23393][.B393.0000.0000.23393] # CJK COMPATIBILITY IDEOGRAPH-2F989; QQC
+2F98A ; [.FB84.0020.0002.2339C][.B39C.0000.0000.2339C] # CJK COMPATIBILITY IDEOGRAPH-2F98A; QQC
+2F8DD ; [.FB84.0020.0002.233C3][.B3C3.0000.0000.233C3] # CJK COMPATIBILITY IDEOGRAPH-2F8DD; QQC
+FAD1  ; [.FB84.0020.0002.233D5][.B3D5.0000.0000.233D5] # CJK COMPATIBILITY IDEOGRAPH-FAD1; QQC
+2F8E3 ; [.FB84.0020.0002.2346D][.B46D.0000.0000.2346D] # CJK COMPATIBILITY IDEOGRAPH-2F8E3; QQC
+2F8EC ; [.FB84.0020.0002.236A3][.B6A3.0000.0000.236A3] # CJK COMPATIBILITY IDEOGRAPH-2F8EC; QQC
+2F8F0 ; [.FB84.0020.0002.238A7][.B8A7.0000.0000.238A7] # CJK COMPATIBILITY IDEOGRAPH-2F8F0; QQC
+2F8F7 ; [.FB84.0020.0002.23A8D][.BA8D.0000.0000.23A8D] # CJK COMPATIBILITY IDEOGRAPH-2F8F7; QQC
+2F8F9 ; [.FB84.0020.0002.23AFA][.BAFA.0000.0000.23AFA] # CJK COMPATIBILITY IDEOGRAPH-2F8F9; QQC
+2F8FB ; [.FB84.0020.0002.23CBC][.BCBC.0000.0000.23CBC] # CJK COMPATIBILITY IDEOGRAPH-2F8FB; QQC
+2F906 ; [.FB84.0020.0002.23D1E][.BD1E.0000.0000.23D1E] # CJK COMPATIBILITY IDEOGRAPH-2F906; QQC
+2F90D ; [.FB84.0020.0002.23ED1][.BED1.0000.0000.23ED1] # CJK COMPATIBILITY IDEOGRAPH-2F90D; QQC
+2F910 ; [.FB84.0020.0002.23F5E][.BF5E.0000.0000.23F5E] # CJK COMPATIBILITY IDEOGRAPH-2F910; QQC
+2F911 ; [.FB84.0020.0002.23F8E][.BF8E.0000.0000.23F8E] # CJK COMPATIBILITY IDEOGRAPH-2F911; QQC
+2F91D ; [.FB84.0020.0002.24263][.C263.0000.0000.24263] # CJK COMPATIBILITY IDEOGRAPH-2F91D; QQC
+FA6C  ; [.FB84.0020.0002.242EE][.C2EE.0000.0000.242EE] # CJK COMPATIBILITY IDEOGRAPH-FA6C; QQC
+2F91F ; [.FB84.0020.0002.243AB][.C3AB.0000.0000.243AB] # CJK COMPATIBILITY IDEOGRAPH-2F91F; QQC
+2F923 ; [.FB84.0020.0002.24608][.C608.0000.0000.24608] # CJK COMPATIBILITY IDEOGRAPH-2F923; QQC
+2F926 ; [.FB84.0020.0002.24735][.C735.0000.0000.24735] # CJK COMPATIBILITY IDEOGRAPH-2F926; QQC
+2F927 ; [.FB84.0020.0002.24814][.C814.0000.0000.24814] # CJK COMPATIBILITY IDEOGRAPH-2F927; QQC
+2F935 ; [.FB84.0020.0002.24C36][.CC36.0000.0000.24C36] # CJK COMPATIBILITY IDEOGRAPH-2F935; QQC
+2F937 ; [.FB84.0020.0002.24C92][.CC92.0000.0000.24C92] # CJK COMPATIBILITY IDEOGRAPH-2F937; QQC
+2F93B ; [.FB84.0020.0002.24FA1][.CFA1.0000.0000.24FA1] # CJK COMPATIBILITY IDEOGRAPH-2F93B; QQC
+2F93C ; [.FB84.0020.0002.24FB8][.CFB8.0000.0000.24FB8] # CJK COMPATIBILITY IDEOGRAPH-2F93C; QQC
+2F93D ; [.FB84.0020.0002.25044][.D044.0000.0000.25044] # CJK COMPATIBILITY IDEOGRAPH-2F93D; QQC
+2F942 ; [.FB84.0020.0002.250F2][.D0F2.0000.0000.250F2] # CJK COMPATIBILITY IDEOGRAPH-2F942; QQC
+2F941 ; [.FB84.0020.0002.250F3][.D0F3.0000.0000.250F3] # CJK COMPATIBILITY IDEOGRAPH-2F941; QQC
+2F943 ; [.FB84.0020.0002.25119][.D119.0000.0000.25119] # CJK COMPATIBILITY IDEOGRAPH-2F943; QQC
+2F944 ; [.FB84.0020.0002.25133][.D133.0000.0000.25133] # CJK COMPATIBILITY IDEOGRAPH-2F944; QQC
+FAD5  ; [.FB84.0020.0002.25249][.D249.0000.0000.25249] # CJK COMPATIBILITY IDEOGRAPH-FAD5; QQC
+2F94D ; [.FB84.0020.0002.2541D][.D41D.0000.0000.2541D] # CJK COMPATIBILITY IDEOGRAPH-2F94D; QQC
+2F952 ; [.FB84.0020.0002.25626][.D626.0000.0000.25626] # CJK COMPATIBILITY IDEOGRAPH-2F952; QQC
+2F954 ; [.FB84.0020.0002.2569A][.D69A.0000.0000.2569A] # CJK COMPATIBILITY IDEOGRAPH-2F954; QQC
+2F955 ; [.FB84.0020.0002.256C5][.D6C5.0000.0000.256C5] # CJK COMPATIBILITY IDEOGRAPH-2F955; QQC
+2F95C ; [.FB84.0020.0002.2597C][.D97C.0000.0000.2597C] # CJK COMPATIBILITY IDEOGRAPH-2F95C; QQC
+2F95D ; [.FB84.0020.0002.25AA7][.DAA7.0000.0000.25AA7] # CJK COMPATIBILITY IDEOGRAPH-2F95D; QQC
+2F95E ; [.FB84.0020.0002.25AA7][.DAA7.0000.0000.25AA7] # CJK COMPATIBILITY IDEOGRAPH-2F95E; QQC
+2F961 ; [.FB84.0020.0002.25BAB][.DBAB.0000.0000.25BAB] # CJK COMPATIBILITY IDEOGRAPH-2F961; QQC
+2F965 ; [.FB84.0020.0002.25C80][.DC80.0000.0000.25C80] # CJK COMPATIBILITY IDEOGRAPH-2F965; QQC
+FAD6  ; [.FB84.0020.0002.25CD0][.DCD0.0000.0000.25CD0] # CJK COMPATIBILITY IDEOGRAPH-FAD6; QQC
+2F96B ; [.FB84.0020.0002.25F86][.DF86.0000.0000.25F86] # CJK COMPATIBILITY IDEOGRAPH-2F96B; QQC
+2F898 ; [.FB84.0020.0002.261DA][.E1DA.0000.0000.261DA] # CJK COMPATIBILITY IDEOGRAPH-2F898; QQC
+2F972 ; [.FB84.0020.0002.26228][.E228.0000.0000.26228] # CJK COMPATIBILITY IDEOGRAPH-2F972; QQC
+2F973 ; [.FB84.0020.0002.26247][.E247.0000.0000.26247] # CJK COMPATIBILITY IDEOGRAPH-2F973; QQC
+2F975 ; [.FB84.0020.0002.262D9][.E2D9.0000.0000.262D9] # CJK COMPATIBILITY IDEOGRAPH-2F975; QQC
+2F977 ; [.FB84.0020.0002.2633E][.E33E.0000.0000.2633E] # CJK COMPATIBILITY IDEOGRAPH-2F977; QQC
+2F97B ; [.FB84.0020.0002.264DA][.E4DA.0000.0000.264DA] # CJK COMPATIBILITY IDEOGRAPH-2F97B; QQC
+2F97C ; [.FB84.0020.0002.26523][.E523.0000.0000.26523] # CJK COMPATIBILITY IDEOGRAPH-2F97C; QQC
+2F97E ; [.FB84.0020.0002.265A8][.E5A8.0000.0000.265A8] # CJK COMPATIBILITY IDEOGRAPH-2F97E; QQC
+2F987 ; [.FB84.0020.0002.267A7][.E7A7.0000.0000.267A7] # CJK COMPATIBILITY IDEOGRAPH-2F987; QQC
+2F988 ; [.FB84.0020.0002.267B5][.E7B5.0000.0000.267B5] # CJK COMPATIBILITY IDEOGRAPH-2F988; QQC
+2F997 ; [.FB84.0020.0002.26B3C][.EB3C.0000.0000.26B3C] # CJK COMPATIBILITY IDEOGRAPH-2F997; QQC
+2F9A4 ; [.FB84.0020.0002.26C36][.EC36.0000.0000.26C36] # CJK COMPATIBILITY IDEOGRAPH-2F9A4; QQC
+2F9A6 ; [.FB84.0020.0002.26CD5][.ECD5.0000.0000.26CD5] # CJK COMPATIBILITY IDEOGRAPH-2F9A6; QQC
+2F9A5 ; [.FB84.0020.0002.26D6B][.ED6B.0000.0000.26D6B] # CJK COMPATIBILITY IDEOGRAPH-2F9A5; QQC
+2F9AD ; [.FB84.0020.0002.26F2C][.EF2C.0000.0000.26F2C] # CJK COMPATIBILITY IDEOGRAPH-2F9AD; QQC
+2F9B0 ; [.FB84.0020.0002.26FB1][.EFB1.0000.0000.26FB1] # CJK COMPATIBILITY IDEOGRAPH-2F9B0; QQC
+2F9B1 ; [.FB84.0020.0002.270D2][.F0D2.0000.0000.270D2] # CJK COMPATIBILITY IDEOGRAPH-2F9B1; QQC
+2F9AB ; [.FB84.0020.0002.273CA][.F3CA.0000.0000.273CA] # CJK COMPATIBILITY IDEOGRAPH-2F9AB; QQC
+2F9C5 ; [.FB84.0020.0002.27667][.F667.0000.0000.27667] # CJK COMPATIBILITY IDEOGRAPH-2F9C5; QQC
+2F9CB ; [.FB84.0020.0002.278AE][.F8AE.0000.0000.278AE] # CJK COMPATIBILITY IDEOGRAPH-2F9CB; QQC
+2F9CC ; [.FB84.0020.0002.27966][.F966.0000.0000.27966] # CJK COMPATIBILITY IDEOGRAPH-2F9CC; QQC
+2F9D3 ; [.FB84.0020.0002.27CA8][.FCA8.0000.0000.27CA8] # CJK COMPATIBILITY IDEOGRAPH-2F9D3; QQC
+FAD7  ; [.FB84.0020.0002.27ED3][.FED3.0000.0000.27ED3] # CJK COMPATIBILITY IDEOGRAPH-FAD7; QQC
+2F9D8 ; [.FB84.0020.0002.27F2F][.FF2F.0000.0000.27F2F] # CJK COMPATIBILITY IDEOGRAPH-2F9D8; QQC
+2F9E0 ; [.FB85.0020.0002.285D2][.85D2.0000.0000.285D2] # CJK COMPATIBILITY IDEOGRAPH-2F9E0; QQC
+2F9E1 ; [.FB85.0020.0002.285ED][.85ED.0000.0000.285ED] # CJK COMPATIBILITY IDEOGRAPH-2F9E1; QQC
+2F9E5 ; [.FB85.0020.0002.2872E][.872E.0000.0000.2872E] # CJK COMPATIBILITY IDEOGRAPH-2F9E5; QQC
+2F9ED ; [.FB85.0020.0002.28BFA][.8BFA.0000.0000.28BFA] # CJK COMPATIBILITY IDEOGRAPH-2F9ED; QQC
+2F9F1 ; [.FB85.0020.0002.28D77][.8D77.0000.0000.28D77] # CJK COMPATIBILITY IDEOGRAPH-2F9F1; QQC
+2F9F6 ; [.FB85.0020.0002.29145][.9145.0000.0000.29145] # CJK COMPATIBILITY IDEOGRAPH-2F9F6; QQC
+2F81C ; [.FB85.0020.0002.291DF][.91DF.0000.0000.291DF] # CJK COMPATIBILITY IDEOGRAPH-2F81C; QQC
+2F9F7 ; [.FB85.0020.0002.2921A][.921A.0000.0000.2921A] # CJK COMPATIBILITY IDEOGRAPH-2F9F7; QQC
+2F9FB ; [.FB85.0020.0002.2940A][.940A.0000.0000.2940A] # CJK COMPATIBILITY IDEOGRAPH-2F9FB; QQC
+2F9FD ; [.FB85.0020.0002.29496][.9496.0000.0000.29496] # CJK COMPATIBILITY IDEOGRAPH-2F9FD; QQC
+2FA01 ; [.FB85.0020.0002.295B6][.95B6.0000.0000.295B6] # CJK COMPATIBILITY IDEOGRAPH-2FA01; QQC
+2FA09 ; [.FB85.0020.0002.29B30][.9B30.0000.0000.29B30] # CJK COMPATIBILITY IDEOGRAPH-2FA09; QQC
+2FA10 ; [.FB85.0020.0002.2A0CE][.A0CE.0000.0000.2A0CE] # CJK COMPATIBILITY IDEOGRAPH-2FA10; QQC
+2FA12 ; [.FB85.0020.0002.2A105][.A105.0000.0000.2A105] # CJK COMPATIBILITY IDEOGRAPH-2FA12; QQC
+2FA13 ; [.FB85.0020.0002.2A20E][.A20E.0000.0000.2A20E] # CJK COMPATIBILITY IDEOGRAPH-2FA13; QQC
+2FA14 ; [.FB85.0020.0002.2A291][.A291.0000.0000.2A291] # CJK COMPATIBILITY IDEOGRAPH-2FA14; QQC
+2F88F ; [.FB85.0020.0002.2A392][.A392.0000.0000.2A392] # CJK COMPATIBILITY IDEOGRAPH-2F88F; QQC
+2FA1D ; [.FB85.0020.0002.2A600][.A600.0000.0000.2A600] # CJK COMPATIBILITY IDEOGRAPH-2FA1D; QQC
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/XMLParser.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/XMLParser.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/XMLParser.pm	(revision 24799)
@@ -0,0 +1,64 @@
+###########################################################################
+#
+# XMLParser.pm -- Wrapper that ensures the right version of XML::Parser
+#                 is loaded given the version of Perl being used.  Need
+#                 to distinguish between Perl 5.6 and Perl 5.8
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2005-2010 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+
+sub BEGIN {
+    my $perl_dir;
+
+    # Note: $] encodes the version number of perl
+    if ($]>=5.010) { 
+	$perl_dir = "perl-5.10";
+    }
+    elsif ($]>5.008) { 
+	# perl 5.8.1 or above
+	$perl_dir = "perl-5.8";
+    }
+    elsif ($]>=5.008) { 
+	# perl 5.8.1 or above
+	$perl_dir = "perl-5.8";
+    }
+    elsif ($]<5.008) {
+	# assume perl 5.6
+	$perl_dir = "perl-5.6";
+    }
+    else {
+	print STDERR "Warning: Perl 5.8.0 is not a maintained release.\n";
+	print STDERR "         Please upgrade to a newer version of Perl.\n";
+	$perl_dir = "perl-5.8";
+    }
+
+    if ($ENV{'GSDLOS'} !~ /^windows$/i) {
+	# Use push to put this on the end, so an existing XML::Parser will be used by default
+	push (@INC, "$ENV{'GSDLHOME'}/perllib/cpan/$perl_dir");
+    }
+}
+
+use XML::Parser;
+use strict;
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/acronym.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/acronym.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/acronym.pm	(revision 24799)
@@ -0,0 +1,703 @@
+##########################################################################
+#
+# acronym.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+#    class to handle acronyms
+###########################################################################
+
+eval "require diagnostics"; # some perl distros (eg mac) don't have this
+
+package acronym;
+
+use util;
+use strict;
+
+###########################################################################
+#    global variables
+###########################################################################
+# valiables to control the recall/precision tradeoff
+
+#the maximum range to look for acronyms 
+my $max_offset = 30;
+#acronyms must be upper case
+my $upper_case = 1;
+#acronym case must match
+my $case_match = 1;
+#minimum acronym length
+my $min_def_length = 3;
+#minimum acronym length
+my $min_acro_length = 3;
+#minimum acronym length saving
+my $min_length_saving = 4;
+#allow recusive acronyms
+my $allow_recursive = 0;
+#let definitions be all capitals
+my $allow_all_caps = 0;
+
+my @stop_words = split / /, "OF AT THE IN TO AND";
+
+#the text split into an array, one word per element
+my @split_text = ();
+my @acronym_list = ();
+
+
+my %acronyms_found_in_collection = ();
+my %acronyms_banned_from_collection = ();
+
+my $writing_acronyms = 1;
+my $accumulate_acronyms = 1;
+my $markup_accumulate_acronyms = 1;
+my $markup_local_acronyms = 1;
+
+
+
+###########################################################################
+#   file saving / loading stuff
+###########################################################################
+
+sub initialise_acronyms {
+
+    my $local_max_offset = $max_offset;
+    my $local_upper_case = $upper_case;
+    my $local_case_match = $case_match ;
+    my $local_min_def_length = $min_def_length;
+    my $local_min_acro_length = $min_acro_length;
+    my $local_min_length_saving = $min_length_saving;
+    my $local_allow_recursive = $allow_recursive;
+    my $local_allow_all_caps = $allow_all_caps;
+    my @local_stop_words = @stop_words;
+    
+    
+    # the file to collate acronyms into
+
+    my $def_acronym_acc_file_pm = '&util::filename_cat($ENV{\'GSDLCOLLECTDIR\'}, "etc","acronym_definitions.pm");';
+    my $acronym_accumulate_file = eval { $def_acronym_acc_file_pm };
+    my $acronym_options_file = &util::filename_cat($ENV{'GSDLCOLLECTDIR'},"etc","acronym_options.pm");
+
+
+    my $file_text = "";
+    if (open ACRONYM_HANDLE, "<$acronym_options_file")
+    {
+	$file_text = do { local $/; <ACRONYM_HANDLE> };  
+    }
+    if ($file_text eq "")
+    {
+	print STDERR "failed to open $acronym_options_file\n";
+	open ACRONYM_HANDLE, ">$acronym_options_file\n";
+	print ACRONYM_HANDLE "use util;\n";
+	print ACRONYM_HANDLE "#Config file for acronym extraction. EDIT THIS FILE, it should\n";
+	print ACRONYM_HANDLE "#not be overridden by the software. It's read by GSDL using perl's\n";
+	print ACRONYM_HANDLE "#'eval' function, so pretty much anything that's valid in perl is \n";
+	print ACRONYM_HANDLE "#valid here.\n\n";
+	print ACRONYM_HANDLE "#Quite a few things here are defined in terms of recall and precision\n";
+	print ACRONYM_HANDLE "#which are the key measures from Information Retreval (IR). If you\n";
+	print ACRONYM_HANDLE "#don't understand recall and precision, any good IR textbook should\n";
+	print ACRONYM_HANDLE "#explain them fully \n\n";
+	print ACRONYM_HANDLE "#the maximum range to look for acronyms (raise to raise precision)\n"; 
+	print ACRONYM_HANDLE "\$local_max_offset = $max_offset;\n\n"; 
+	print ACRONYM_HANDLE "#acronyms must be upper case (0 = false, 1 = true (high precision))\n";
+	print ACRONYM_HANDLE "\$local_upper_case = $upper_case;\n\n";
+	print ACRONYM_HANDLE "#acronym case must match (0 = false, 1 = true (high precision))\n";
+	print ACRONYM_HANDLE "\$local_case_match = $case_match;\n\n";
+	print ACRONYM_HANDLE "#minimum acronym length (raise to raise precision)\n";
+	print ACRONYM_HANDLE "\$local_min_def_length = $min_def_length;\n\n";
+	print ACRONYM_HANDLE "#let definitions be all capitals\n";
+	print ACRONYM_HANDLE "\$local_allow_all_caps = $allow_all_caps;\n\n";
+	print ACRONYM_HANDLE "#minimum acronym length (raise to raise precision)\n";
+	print ACRONYM_HANDLE "\$local_min_acro_length = 3;\n\n";
+	print ACRONYM_HANDLE "#minimum acronym length saving (raise to raise precision)\n";
+	print ACRONYM_HANDLE "\$local_min_length_saving = 4;\n\n";
+	print ACRONYM_HANDLE "#allow recusive acronyms (0 = false (high precision), 1 = true)\n";
+	print ACRONYM_HANDLE "\$local_allow_recursive = 0;\n\n";
+	print ACRONYM_HANDLE "#stop words-words allowed in acronyms (the multi-lingual version\n";
+	print ACRONYM_HANDLE "#slows down acronym extraction slightly so is not the default)\n";
+	print ACRONYM_HANDLE "#\@local_stop_words = split / /, \"A OF AT THE IN TO AND VON BEI DER DIE DAS DEM DEN DES UND DE DU A LA LE LES L DANS ET S\";\n";
+	print ACRONYM_HANDLE "\@local_stop_words = split / /, \"OF AT THE IN TO AND\";\n"; 
+	print ACRONYM_HANDLE "\n"; 
+	print ACRONYM_HANDLE "#the file to collate acronyms into\n";
+	print ACRONYM_HANDLE "\$acronym_accumulate_file = $def_acronym_acc_file_pm\n";
+	print ACRONYM_HANDLE "\n";
+	print ACRONYM_HANDLE "# any acronym definitions which should always be marked up can be copied here\n";
+	print ACRONYM_HANDLE "# from the acronym_accumulate_file file ...\n";
+	print ACRONYM_HANDLE "# \n";
+	print ACRONYM_HANDLE "# \n";
+	print ACRONYM_HANDLE "# \n";
+	print STDERR "written new options file to $acronym_options_file...\n";
+    } else {
+	print STDERR "read file $acronym_options_file...\n";
+	eval $file_text ;
+	warn $@ if $@;
+	print STDERR "evaluated file $acronym_options_file...\n";
+    }
+
+    $max_offset = $local_max_offset;
+    $upper_case = $local_upper_case;
+    $case_match = $local_case_match ;
+    $min_def_length = $local_min_def_length;
+    $min_acro_length = $local_min_acro_length;
+    $min_length_saving = $local_min_length_saving;
+    $allow_recursive = $local_allow_recursive;
+    $allow_all_caps = $local_allow_all_caps;
+    @stop_words = @local_stop_words;
+        
+
+    &read_all_acronyms_from_file($acronym_accumulate_file);
+#    rename $acronym_file, $acronym_file . "." . int(rand (2<<7)). 
+#	int(rand (2<<7)). int(rand (2<<7)). int(rand (2<<7));
+    if ($writing_acronyms && open ACRONYM_HANDLE, ">$acronym_accumulate_file")
+    {
+	print ACRONYM_HANDLE "#This is an automatically generated file.\n";
+	print ACRONYM_HANDLE "#\n";
+	print ACRONYM_HANDLE "#If you edit this file and it will be overwritten the next\n";
+	print ACRONYM_HANDLE "#time the acronym code runs unless you set the file to \n";
+	print ACRONYM_HANDLE "#read-only. \n";
+	print ACRONYM_HANDLE "#\n";
+	print ACRONYM_HANDLE "#start of acronyms...\n";
+	$writing_acronyms = 1;
+    } else {
+	warn "failed to open $acronym_accumulate_file for writing\n";
+	$writing_acronyms = 0;
+    }
+}
+
+#close the list of accumulated acronyms
+sub finalise_acronyms {
+    if ($writing_acronyms)
+    {
+	print ACRONYM_HANDLE "#end of acronyms.\n";  
+	close ACRONYM_HANDLE;
+    }
+}
+
+#eval a file of accumulated acronyms
+sub read_all_acronyms_from_file {
+    my ($acronym_accumulate_file) = @_;
+
+    my $file_text = " ";
+    if (open ACRONYM_HANDLE, "<$acronym_accumulate_file")
+    {
+	$file_text = do { local $/; <ACRONYM_HANDLE> };  
+    } else {
+	print STDERR "failed to open $acronym_accumulate_file for reading (this is the first pass?).\n";
+    }
+    eval $file_text;
+    #promotes warnings/errors from evaluated file to current context 
+    warn $@ if $@;
+}
+
+#called from within the file of accumulated acronyms to indicate a good acronym
+sub add {
+    my $self = shift (@_);
+    if (defined ($acronyms_found_in_collection{$self->[0]}))
+    {
+	my $def = $self->to_def_string();
+	if ($acronyms_found_in_collection{$self->[0]} =~ m/(^|\|)$def(\||$)/)
+	{
+	    return;
+	}
+	$acronyms_found_in_collection{$self->[0]} = 
+	    $acronyms_found_in_collection{$self->[0]} . "|" . $self->to_def_string();
+    } else {
+	$acronyms_found_in_collection{$self->[0]} = $self->to_def_string();
+    }
+}
+
+#called from within the file of accumulated acronyms to indicate a bad acronym
+sub ban {
+    my $self = shift (@_);
+    
+    if (!defined $acronyms_banned_from_collection{$self->[0]})
+    {
+	$acronyms_banned_from_collection{$self->[0]} = $self->to_def_string();
+    } else {
+	$acronyms_banned_from_collection{$self->[0]} = $acronyms_banned_from_collection{$self->[0]} . "|" . $self->to_def_string();
+    }
+}
+
+
+#write a good acronym to the accumulated acronyms file
+sub write_to_file {
+    my $self = shift (@_);
+    if ($writing_acronyms)
+    {
+	print ACRONYM_HANDLE "new acronym(\"$self->[0]\",\"" . 
+	    $self->to_def_string() . 
+		"\")->add();\n";
+    }
+}
+
+
+###########################################################################
+# mark functionality    
+###########################################################################
+
+#small routine to sort by length 
+sub sort_by_length {
+    length($b) <=> length($a) or $a cmp $b
+}
+
+sub markup_acronyms {
+    my  $text = shift (@_);
+    my  $verbosity_obj = shift (@_);
+    if (defined $text)
+    {
+	for my $acro (sort sort_by_length keys %acronyms_found_in_collection)
+	{
+	    $text  =~ s/^((?:[^\<\n]|(?:\<[^\>\n]*\>))*)$acro([^\<A-Z])/$1$acro\<img src=\"\" width=8 height=8 alt=\"$acronyms_found_in_collection{$acro}\"\>$2/gm;
+	    printf STDERR " " .  $acro . ","
+		if ($verbosity_obj->{'verbosity'} >= 2);
+	}
+    }
+    return $text;
+}
+
+
+
+###########################################################################
+#    member functions 
+###########################################################################
+
+
+sub new {
+    my $trash = shift (@_); 
+    my $acro = shift (@_); 
+    my $def  = shift (@_); 
+    
+    my $self = [
+		"", # 0 acronym
+		[], # 1 definition
+               ];
+    
+    $self->[0] = $acro                    if defined $acro;
+    push @{$self->[1]},  split / /, $def  if defined $def;
+    
+    bless $self;
+}
+
+sub clone  {
+    my $self = shift (@_);
+
+    my $copy = new acronym;
+
+    $copy->[0] = $self->[0];
+    push @{$copy->[1]}, @{$self->[1]};
+    bless $copy;
+
+    return $copy;
+}
+
+#return the acronym
+sub to_acronym {
+    my $self = shift (@_);
+    my @array = @{$self->[1]};
+
+    return $self->[0];
+}
+
+#return the number of words in the acronym definition
+sub words_in_acronym_definition {
+    my $self = shift (@_);
+    my @array = @{$self->[1]};
+
+    return $#array + 1;
+}
+
+#return the number of letters in the acronym definition
+sub letters_in_acronym_definition {
+    my $self = shift (@_);
+
+    return length($self->to_def_string());
+}
+
+#return the number of letters in the acronym definition
+sub letters_in_acronym {
+    my $self = shift (@_);
+
+    return length($self->to_acronym());
+}
+
+#return the acronym definition
+sub to_def_string {
+    my $self = shift (@_);
+
+    my $result = "";
+
+    # do the definition
+    my @array = @{$self->[1]};
+    my $i = 0;
+    while ($i <= $#array)
+    {
+	$result = $result . $array[$i];
+
+	if ($i+1 <= $#array)
+	{
+	    $result = $result . " ";
+	}
+	$i++;
+    }
+    return $result;
+}
+
+
+#print out the kwic for the acronym
+sub to_string_kwic {
+    my $self = shift (@_);
+
+    # the list of all possible combinations
+    my @list = ();
+
+    my $result = "";
+
+    my $j = 0;
+    my @array = @{$self->[1]};
+    while ($j <= $#array)
+    {
+
+	# do the definition
+	my $i = 0;
+
+	#add the key word
+	$result = "<td halign=left>"  . $array[$j] . "</td><td halign=right>";
+
+	#add the proceeding words
+	while ($i < $j)
+	{
+	    $result = $result .  $array[$i] . " ";
+	    $i++;
+	}
+	#add the key word
+	$result = $result . "</td><td halign=left>"  . $array[$j] . 
+	    "</td><td halign=left>";
+
+	#add the trailing words
+	$i++;
+	while ($i <= $#array )
+	{
+	    $result = $result .  $array[$i] . " ";
+	    $i++;
+	}
+
+	#add the actual acronym
+
+	$result = $result . "</td><td halign=left>" . $self->[0] . "</td>";
+
+	push @list, $result;
+	$j++;
+    }
+    return @list;
+}
+
+#this is the one used when building the collection ...
+sub to_string {
+    my $self = shift (@_);
+
+    my $result = $self->[0] . " ";
+
+    # do the definition
+    my @array = @{$self->[1]};
+    my $i = 0;
+    while ($i <= $#array)
+    {
+	$result = $result . $array[$i];
+	if ($i+1 <= $#array)
+	{
+	    $result = $result . " ";
+	}
+	$i++;
+    }
+    return $result;
+}
+
+sub check {
+    my $self = shift (@_);
+
+    if (length($self->to_acronym()) < $min_acro_length) 
+    {
+#	print "acronym " . $self->to_string() . " rejected (too short I)\n";
+	return 0;
+    }
+    if ($self->words_in_acronym_definition() < $min_def_length) 
+    {
+#	print "acronym " . $self->to_string() . " rejected (too short II)\n";
+	return 0;
+    }
+    if ($min_length_saving * $self->letters_in_acronym() > 
+	$self->letters_in_acronym_definition()) 
+    {
+#	print "acronym " . $self->to_string() . " rejected (too short III)\n";
+#	print "" . $min_length_saving .
+#	    "|" . $self->letters_in_acronym() .
+#	    "|" . $self->letters_in_acronym_definition() . "\n";
+	return 0;
+    }
+    if (!$allow_all_caps && 
+	$self->to_def_string() eq uc($self->to_def_string()))
+    {
+#	print "acronym " . $self->to_string() . " rejected (all upper)\n";
+	return 0;
+    }
+    if (!$allow_all_caps)
+    {
+	my $upper_count = 0;
+	my $lower_count = 0;
+	my @letters = $self->to_def_string();
+	for my $letter (split //, $self->to_def_string())
+	{
+	    if ($letter eq uc($letter))
+	    { 
+		$upper_count++;
+	    } else {
+		$lower_count++;
+	    }		
+	}
+	return 0 if ($upper_count > $lower_count);
+    }
+    if (!$allow_recursive && $self->to_def_string() =~ /$self->to_acronym()/i )
+    {
+	return 0;
+    }
+#    print "acronym " . $self->to_string() . " not rejected\n";
+    return 1;
+}
+
+###########################################################################
+#    static functions 
+###########################################################################
+
+sub recurse {
+    my ($acro_offset,       #offset of word we're finding acronyms for
+	$text_offset,       
+	$letter_offset, 
+	@def_so_far) = @_;
+
+    my $word = $split_text[$text_offset];
+    my $acro = $split_text[$acro_offset];
+    $word = "" if !defined $word;
+    $acro = "" if !defined $acro;
+    
+#    print "recurse(" . $acro_offset . ", " . $text_offset . ", " . 
+#	$letter_offset  . ", " . @def_so_far . ")\n";
+
+    #check for termination ...
+    if ($letter_offset >= length($acro))
+    {	
+	my $acronym = new acronym();
+	$acronym->[0] = $acro;
+	push @{$acronym->[1]}, @def_so_far;
+	if ($acronym->check())
+	{
+	    push @acronym_list, ( $acronym );
+	}
+#	print "acronym created\n";
+	return;
+    }
+    #check for recursion
+    if (!$allow_recursive)
+    {
+	if ($word eq $acro)
+	{
+#	    print "recursion detected\n";
+	    return;
+	}
+    }
+    
+    #skip a stop-word
+    my $i = 0;
+    if ($letter_offset != 0)
+    {
+	while ($i <= $#stop_words)
+	{
+	    if ($stop_words[$i] eq uc($word))
+	    {
+#	    print "::found stop word::" . $stop_words[$i] . "\n";
+		&recurse($acro_offset,
+			 $text_offset+1,
+			 $letter_offset,
+			 @def_so_far, $word);
+	    }
+	    $i++;
+	}
+    }
+    $i = 1;
+    #using the first $i letters ...
+    while ($letter_offset+$i <= length($acro) )
+    {
+#	print "". ((substr $word, 0, $i) . " " . 
+#	    (substr $acro, $letter_offset, $i) . "\n");
+	if (((!$case_match) &&
+	     (uc(substr $word, 0, $i) eq
+	      uc(substr $acro, $letter_offset, $i)))
+	    ||
+	    (($case_match) &&
+	     ((substr $word, 0, $i) eq
+	      (substr $acro, $letter_offset, $i))))
+	{
+#	    print "::match::\n";
+#	    print "" . ((substr $word, 0, $i) . " " . 
+#		   (substr $acro, $letter_offset, $i) . "\n");
+	    &recurse($acro_offset,
+		     $text_offset+1,
+		     $letter_offset+$i,
+		     @def_so_far, $word);
+	} else {
+	    return;
+	}	    
+	$i++;
+    }
+    return;
+}
+
+#the main
+sub acronyms {
+    #clean up the text
+    my $processed_text =  shift @_;
+    $$processed_text =~ s/<[^>]*>/ /g;
+    $$processed_text =~ s/\W/ /g;
+    $$processed_text =~ s/[0-9_]/ /g;
+    $$processed_text =~ s/\s+/ /g;
+    $$processed_text =~ s/(\n|\>)References.*/ /i;
+    $$processed_text =~ s/(\n|\>)Bibliography.*/ /i;
+    $$processed_text =~ s/(\n|\>)(Cited Works?).*/ /i;
+    $$processed_text =~ s/(\n|\>)(Works? Cited).*/ /i;
+
+    #clear some global variables
+    @split_text = ();
+    @acronym_list = ();
+
+    return &acronyms_from_clean_text($processed_text);
+}
+
+sub acronyms_from_clean_text {
+    my ($processed_text) = @_;
+
+    @split_text = split / /, $$processed_text;
+
+#    my $i = 0;
+#    while ($i <= $#split_text)
+#    {
+#	print $split_text[$i] . "\n";
+#	$i++;
+#    }
+
+    my $first = 0;
+    my $last = $#split_text +1;
+    my $acro_counter = $first;
+    
+    while ($acro_counter < $last)
+    {
+	my $word = $split_text[$acro_counter];
+
+	if ((!$upper_case) ||
+	    (uc($word) eq $word))
+	{
+	    
+	    if (length $word >= $min_acro_length)
+	    {
+		my $def_counter = 0;
+		if ($acro_counter - $max_offset > 0)
+		{
+		    $def_counter = $acro_counter - $max_offset;
+		}
+		my $local_last = $acro_counter  + $max_offset;
+		if ($local_last > $last)
+		{
+		    $local_last = $last;
+		}
+		while ($def_counter <= $local_last)
+		{
+		    &recurse($acro_counter,$def_counter,0,());
+		    $def_counter++;
+		}
+	    }
+	}
+	$acro_counter++;
+    }
+
+    return \@acronym_list;
+}
+
+
+
+sub test {
+
+#    my $blarg = new acronym();
+#    my $simple;
+#    $simple = 10;
+#    $blarg->initialise($simple, $simple, $simple);
+#    my $blarg2 = $blarg->clone();
+#    print $blarg->to_string();
+#    print $blarg2;
+#    print "\n";
+#    
+    my $tla = new acronym();
+    $tla->[0] = "TLA";
+
+    my @array = ("Three", "Letter", "Acronym");
+#    my $i = 0;
+#    while ($i <= $#array)
+#    {
+#	print @array[$i] . "\n";
+#	$i++;
+#    }
+
+    print "\n";
+    push @{$tla->[1]}, ("Three" );
+    push @{$tla->[1]}, ("Letter" );
+    push @{$tla->[1]}, ("Acronym" );
+    print $tla->to_string(). "\n";
+    print "\n";
+    print "\n";
+    my $tla2 = $tla->clone();
+    push @{$tla2->[1]}, ("One");
+    push @{$tla2->[1]}, ("Two");
+    $tla2->[0] = "ALT";
+    print $tla->to_string(). "\n";
+    print $tla2->to_string(). "\n";
+
+    print "\n";
+    print "\n";
+
+    print "Testing recursion ...\n";
+    my $acros = &acronyms("TLA Three Letter Acronym in tla TlA");
+    
+    foreach my $acro (@$acros)
+    {
+	if ($acro->check)
+        {
+           print "accepted: " .$acro->to_string() . "\n";
+#           print "|" .  $acro->to_acronym() . "|" .  $acro->to_def_string() .
+#              "|" .  $acro->words_in_acronym_definition() .
+#              "|" .  $acro->letters_in_acronym_definition() . 
+#              "|" .  $acro->letters_in_acronym() . "|\n";
+        } else {
+#          print "found but rejected: " .$acro->to_string() . "\n";
+        }
+    }
+}
+
+#uncomment this line to test this package
+#&test();
+
+1;
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/arcinfo.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/arcinfo.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/arcinfo.pm	(revision 24799)
@@ -0,0 +1,470 @@
+###########################################################################
+#
+# arcinfo.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+
+# This module stores information about the archives. At the moment
+# this information just consists of the file name (relative to the
+# directory the archives information file is in) and its OID.
+
+# This module assumes there is a one to one correspondance between
+# a file in the archives directory and an OID.
+
+package arcinfo;
+
+use constant ORDER_OID_INDEX  => 0;
+use constant ORDER_SORT_INDEX => 1;
+
+use constant INFO_FILE_INDEX    => 0;
+use constant INFO_STATUS_INDEX  => 1;
+
+use strict;
+
+use dbutil;
+
+
+# File format read in: OID <tab> Filename <tab> Optional-Index-Status
+
+# Index status can be:
+#  I = Index for the first time
+#  R = Reindex
+#  D = Delete
+#  B = Been indexed
+
+sub new {
+    my $class = shift(@_);
+    my $infodbtype = shift(@_);
+
+    # If the infodbtype wasn't passed in, use the default from dbutil
+    if (!defined($infodbtype))
+    {
+      $infodbtype = &dbutil::get_default_infodb_type();
+    }
+
+    my $self = {'infodbtype' => $infodbtype,
+		'info'=>{},
+		'reverse-info'=>{},
+		'order'=>[],
+		'reverse_sort'=>0};
+
+    return bless $self, $class;
+}
+
+sub _load_info_txt 
+{
+    my $self = shift (@_);
+    my ($filename) = @_;
+
+    if (defined $filename && -e $filename) {
+	open (INFILE, $filename) || 
+	    die "arcinfo::load_info couldn't read $filename\n";
+
+	my ($line, @line);
+	while (defined ($line = <INFILE>)) {
+	    $line =~ s/\cM|\cJ//g; # remove end-of-line characters
+	    @line = split ("\t", $line); # filename, 
+	    if (scalar(@line) >= 2) {
+		$self->add_info (@line);
+	    }
+	}
+	close (INFILE);
+    }
+
+
+}
+
+sub _load_info_db
+{
+    my $self = shift (@_);
+    my ($filename) = @_;
+
+    my $infodb_map = {};
+
+    &dbutil::read_infodb_file($self->{'infodbtype'}, $filename, $infodb_map);
+
+    foreach my $oid ( keys %$infodb_map ) {
+	my $vals = $infodb_map->{$oid};
+	# interested in doc-file and index-status
+
+	my ($doc_file) = ($vals=~/^<doc-file>(.*)$/m);
+	my ($index_status) = ($vals=~/^<index-status>(.*)$/m);
+	my ($sortmeta) = ($vals=~/^<sort-meta>(.*)$/m);
+	$self->add_info ($oid,$doc_file,$index_status,$sortmeta);
+    }
+}
+
+
+sub load_info {
+    my $self = shift (@_);
+    my ($filename) = @_;
+
+    $self->{'info'} = {};
+
+    if ((defined $filename) && (-e $filename)) {
+	if ($filename =~ m/\.inf$/) {
+	    $self->_load_info_txt($filename);
+	}
+	else {
+	    $self->_load_info_db($filename);
+	}
+    }
+}
+
+sub _load_filelist_db
+{
+    my $self = shift (@_);
+    my ($filename) = @_;
+
+    my $infodb_map = {};
+
+    &dbutil::read_infodb_file($self->{'infodbtype'}, $filename, $infodb_map);
+
+    foreach my $file ( keys %$infodb_map ) {
+	$self->{'prev_import_filelist'}->{$file} = 1;
+    }
+}
+
+
+sub load_prev_import_filelist {
+    my $self = shift (@_);
+    my ($filename) = @_;
+
+    $self->{'import-filelist'} = {};
+
+    if ((defined $filename) && (-e $filename)) {
+	if ($filename =~ m/\.inf$/) {
+	    # e.g. 'archives-src.inf' (which includes complete list of file
+	    # from last time import.pl was run)
+	    $self->_load_info_txt($filename);
+	}
+	else {
+	    $self->_load_filelist_db($filename);
+	}
+    }
+}
+
+sub load_revinfo_UNTESTED
+{
+    my $self = shift (@_);
+    my ($rev_filename) = @_;
+
+    my $rev_infodb_map = {};
+
+    &dbutil::read_infodb_file($self->{'infodbtype'}, $rev_filename, $rev_infodb_map);
+
+    foreach my $srcfile ( keys %$rev_infodb_map ) {
+	my $vals = $rev_infodb_map->{$srcfile};
+
+	foreach my $OID ($vals =~ m/^<oid>(.*)$/gm) {
+	    $self->add_revinfo($srcfile,$OID);
+	}
+    }
+}
+
+
+sub _save_info_txt {
+    my $self = shift (@_);
+    my ($filename) = @_;
+
+    my ($OID, $info);
+
+    open (OUTFILE, ">$filename") || 
+	die "arcinfo::save_info couldn't write $filename\n";
+  
+    foreach $info (@{$self->get_OID_list()}) {
+	if (defined $info) {
+	    print OUTFILE join("\t", @$info), "\n";
+	}
+    }
+    close (OUTFILE);
+}
+
+sub _save_info_db {
+    my $self = shift (@_);
+    my ($filename) = @_;
+
+    my $infodbtype = $self->{'infodbtype'};
+
+    # Not the most efficient operation, but will do for now
+
+    # read it in
+    my $infodb_map = {};
+    &dbutil::read_infodb_file($infodbtype, $filename, $infodb_map);
+
+    # change index-status values
+    foreach my $info (@{$self->get_OID_list()}) {
+	if (defined $info) {
+	    my ($oid,$doc_file,$index_status) = @$info;
+	    if (defined $infodb_map->{$oid}) {
+		my $vals_ref = \$infodb_map->{$oid};
+		$$vals_ref =~ s/^<index-status>(.*)$/<index-status>$index_status/m;
+	    }
+	    else {
+		print STDERR "Warning: $filename does not have key $oid\n";
+	    }
+	}
+    }
+
+
+    # write out again
+    my $infodb_handle = &dbutil::open_infodb_write_handle($infodbtype, $filename);
+    foreach my $oid ( keys %$infodb_map ) {
+	my $vals = $infodb_map->{$oid};
+	&dbutil::write_infodb_rawentry($infodbtype,$infodb_handle,$oid,$vals);
+    }
+    &dbutil::close_infodb_write_handle($infodbtype, $infodb_handle);
+
+}
+
+sub save_revinfo_db {
+    my $self = shift (@_);
+    my ($rev_filename) = @_;
+
+    # Output reverse lookup database
+
+    my $rev_infodb_map = $self->{'reverse-info'};
+    my $rev_infodb_handle 
+	= &dbutil::open_infodb_write_handle($self->{'infodbtype'}, $rev_filename, "append");
+
+    foreach my $key ( keys %$rev_infodb_map ) {
+	my $val_hash = $rev_infodb_map->{$key};
+	&dbutil::write_infodb_entry($self->{'infodbtype'}, $rev_infodb_handle, $key, $val_hash);
+    }
+    &dbutil::close_infodb_write_handle($self->{'infodbtype'}, $rev_infodb_handle);
+
+}
+
+sub save_info {
+    my $self = shift (@_);
+    my ($filename) = @_;
+
+    if ($filename =~ m/(contents)|(\.inf)$/) {
+	$self->_save_info_txt($filename);
+    }
+    else {
+	$self->_save_info_db($filename);
+    }
+}
+
+sub delete_info {
+    my $self = shift (@_);
+    my ($OID) = @_;
+
+    if (defined $self->{'info'}->{$OID}) {
+	delete $self->{'info'}->{$OID};
+	
+	my $i = 0;
+	while ($i < scalar (@{$self->{'order'}})) {
+	    if ($self->{'order'}->[$i]->[ORDER_OID_INDEX] eq $OID) {
+		splice (@{$self->{'order'}}, $i, 1);
+		last;
+	    }
+	    
+	    $i ++;
+	}
+    }
+}
+
+sub add_info {
+    my $self = shift (@_);
+    my ($OID, $doc_file, $index_status, $sortmeta) = @_;
+    $sortmeta = "" unless defined $sortmeta;
+    $index_status = "I" unless defined $index_status; # I = needs indexing
+
+    if (! defined($OID)) {
+	# only happens when no files can be processed?
+	return undef;
+    }
+
+    if (defined $self->{'info'}->{$OID}) {
+	# test to see if we are in a reindex situation
+
+	my $existing_status_info = $self->get_status_info($OID);
+
+	if ($existing_status_info eq "D") {
+	    # yes, we're in a reindexing situation
+	    $self->delete_info ($OID);
+
+
+	    # force setting to "reindex"
+	    $index_status = "R";
+
+	}
+	else {
+	    # some other, possibly erroneous, situation has arisen
+	    # where the document already seems to exist
+	    print STDERR "Warning: $OID already exists with index status $existing_status_info\n";
+	    print STDERR "         Deleting previous version\n";
+
+	    $self->delete_info ($OID);
+	}
+    }
+
+    $self->{'info'}->{$OID} = [$doc_file,$index_status,$sortmeta];
+    push (@{$self->{'order'}}, [$OID, $sortmeta]);
+
+
+}
+
+sub set_status_info {
+    my $self = shift (@_);
+    my ($OID, $index_status) = @_;
+
+    my $OID_info = $self->{'info'}->{$OID};
+    $OID_info->[INFO_STATUS_INDEX] = $index_status;
+}
+
+
+sub get_status_info {
+    my $self = shift (@_);
+    my ($OID) = @_;
+
+    my $index_status = undef;
+
+    my $OID_info = $self->{'info'}->{$OID};
+    if (defined $OID_info) {
+	$index_status = $OID_info->[INFO_STATUS_INDEX];
+    }
+    else {
+	die "Unable to find document id $OID\n";
+    }
+
+    return $index_status;
+
+}
+
+
+sub add_reverseinfo {
+    my $self = shift (@_);
+    my ($key, $OID) = @_;
+
+    my $existing_key = $self->{'reverse-info'}->{$key};
+    if (!defined $existing_key) {
+	$existing_key = {};
+	$self->{'reverse-info'}->{$key} = $existing_key;
+    }
+
+    my $existing_oid = $existing_key->{'oid'};	
+    if (!defined $existing_oid) {
+	$existing_oid = [];
+	$existing_key->{'oid'} = $existing_oid;
+    }
+
+    push(@$existing_oid,$OID);
+}
+
+sub set_meta_file_flag {
+    my $self = shift (@_);
+    my ($key) = @_;
+
+    my $existing_key = $self->{'reverse-info'}->{$key};
+    if (!defined $existing_key) {
+	$existing_key = {};
+	$self->{'reverse-info'}->{$key} = $existing_key;
+    }
+
+    $existing_key->{'meta-file'} = ["1"];
+
+}
+sub reverse_sort 
+{
+    my $self = shift(@_);
+    $self->{'reverse_sort'} = 1;
+}
+
+# returns a list of the form [[OID, doc_file, index_status], ...]
+sub get_OID_list 
+{
+    my $self = shift (@_);
+
+    my $order = $self->{'order'};
+
+    my @sorted_order;
+    if ($self->{'reverse_sort'}) {
+	@sorted_order = sort {$b->[ORDER_SORT_INDEX] cmp $a->[ORDER_SORT_INDEX]} @$order;
+    } else {
+	@sorted_order = sort {$a->[ORDER_SORT_INDEX] cmp $b->[ORDER_SORT_INDEX]} @$order;
+    }
+
+    my @list = ();
+
+    foreach my $OID_order (@sorted_order) {
+	my $OID = $OID_order->[ORDER_OID_INDEX];
+	my $OID_info = $self->{'info'}->{$OID};
+
+	push (@list, [$OID, $OID_info->[INFO_FILE_INDEX], 
+		      $OID_info->[INFO_STATUS_INDEX]]);
+    }
+
+    return \@list;
+}
+
+# returns a list of the form [[doc_file, OID], ...]
+sub get_file_list {
+    my $self = shift (@_);
+
+    my $order = $self->{'order'};
+
+    my @sorted_order;
+    if ($self->{'reverse_sort'}) {
+	@sorted_order = sort {$b->[ORDER_SORT_INDEX] cmp $a->[ORDER_SORT_INDEX]} @$order;
+    } else {
+	@sorted_order = sort {$a->[ORDER_SORT_INDEX] cmp $b->[ORDER_SORT_INDEX]} @$order;
+    }
+
+    my @list = ();
+
+    foreach my $OID_order (@sorted_order) {
+	my $OID = $OID_order->[ORDER_OID_INDEX];
+	my $OID_info = $self->{'info'}->{$OID};
+
+	push (@list, [$OID_info->[INFO_FILE_INDEX], $OID]);
+    }
+
+    return \@list;
+}
+
+
+# returns a list of the form [doc_file,index_status,$sort_meta]
+sub get_info {
+    my $self = shift (@_);
+    my ($OID) = @_;
+
+    if (defined $self->{'info'}->{$OID}) {
+	return $self->{'info'}->{$OID};
+    }
+
+    return undef;
+}
+
+
+
+# returns the number of documents so far
+sub size {
+    my $self = shift (@_);
+    return (scalar(@{$self->{'order'}}));
+}
+
+1;
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/basebuilder.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/basebuilder.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/basebuilder.pm	(revision 24799)
@@ -0,0 +1,814 @@
+###########################################################################
+#
+# basebuilder.pm -- base class for collection builders
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package basebuilder;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+use classify;
+use cfgread;
+use colcfg;
+use dbutil;
+use plugin;
+use util;
+
+
+BEGIN {
+    # set autoflush on for STDERR and STDOUT so that mgpp
+    # doesn't get out of sync with plugins
+    STDOUT->autoflush(1);
+    STDERR->autoflush(1);
+}
+
+END {
+    STDOUT->autoflush(0);
+    STDERR->autoflush(0);
+}
+
+our $maxdocsize = 12000;
+
+# used to signify "gs2"(default) or "gs3"
+our $gs_mode = "gs2";
+
+sub new {
+    my ($class, $site, $collection, $source_dir, $build_dir, $verbosity, 
+	$maxdocs, $debug, $keepold, $incremental, $incremental_mode,
+	$remove_empty_classifications, 
+	$outhandle, $no_text, $failhandle, $gli) = @_;
+
+    $outhandle = *STDERR unless defined $outhandle;
+    $no_text = 0 unless defined $no_text;
+    $failhandle = *STDERR unless defined $failhandle;
+
+    # create a builder object
+    my $self = bless {'site'=>$site, # will be undef for Greenstone 2
+		      'collection'=>$collection,
+		      'source_dir'=>$source_dir,
+		      'build_dir'=>$build_dir,
+		      'verbosity'=>$verbosity,
+		      'maxdocs'=>$maxdocs,
+		      'debug'=>$debug,
+		      'keepold'=>$keepold,
+		      'incremental'=>$incremental,
+		      'incremental_mode'=>$incremental_mode,
+		      'remove_empty_classifications'=>$remove_empty_classifications,
+		      'outhandle'=>$outhandle,
+		      'no_text'=>$no_text,
+		      'failhandle'=>$failhandle,
+		      'notbuilt'=>{},    # indexes not built
+		      'gli'=>$gli
+		      }, $class;
+
+    $self->{'gli'} = 0 unless defined $self->{'gli'};
+    
+    # Read in the collection configuration file.
+    my ($colcfgname);
+    ($colcfgname, $gs_mode) = &colcfg::get_collect_cfg_name($outhandle);
+    $self->{'collect_cfg'} = &colcfg::read_collection_cfg ($colcfgname, $gs_mode);
+
+    if ($gs_mode eq "gs3") {
+	# read it in again to save the original form for later writing out
+	# of buildConfig.xml
+	# we use this preserve object because $self->{'collect_cfg'}->{'classify'} somewhat gets modified during the calling of &classify::load_classifiers.
+	$self->{'collect_cfg_preserve'} = &colcfg::read_collection_cfg ($colcfgname, $gs_mode);	
+    }
+    
+    # get the database type for this collection from the collect.cfg file (may be undefined)
+    $self->{'infodbtype'} = $self->{'collect_cfg'}->{'infodbtype'} || &dbutil::get_default_infodb_type();
+
+
+    # load up any dontdb fields
+    $self->{'dontdb'} = {};
+    if (defined ($self->{'collect_cfg'}->{'dontgdbm'})) {
+	foreach my $dg (@{$self->{'collect_cfg'}->{'dontgdbm'}}) {
+	    $self->{'dontdb'}->{$dg} = 1;
+	}
+    }
+
+    $self->{'maxnumeric'} = 4;
+    return $self;
+}
+
+# stuff has been moved here from new, so we can use subclass methods
+sub init {
+    my $self = shift(@_);
+    
+    my $outhandle = $self->{'outhandle'};
+    my $failhandle = $self->{'failhandle'};
+
+    $self->generate_index_list();
+    my $indexes = $self->{'collect_cfg'}->{'indexes'};
+    if (defined $indexes) {
+	# sort out subcollection indexes
+	if (defined $self->{'collect_cfg'}->{'indexsubcollections'}) {
+	    $self->{'collect_cfg'}->{'indexes'} = [];
+	    foreach my $subcollection (@{$self->{'collect_cfg'}->{'indexsubcollections'}}) {
+		foreach my $index (@$indexes) {
+		    push (@{$self->{'collect_cfg'}->{'indexes'}}, "$index:$subcollection");
+		}
+	    }
+	}
+	
+	# sort out language subindexes
+	if (defined $self->{'collect_cfg'}->{'languages'}) {
+	    $indexes = $self->{'collect_cfg'}->{'indexes'};
+	    $self->{'collect_cfg'}->{'indexes'} = [];
+	    foreach my $language (@{$self->{'collect_cfg'}->{'languages'}}) {
+		foreach my $index (@$indexes) {
+		    if (defined ($self->{'collect_cfg'}->{'indexsubcollections'})) {
+			push (@{$self->{'collect_cfg'}->{'indexes'}}, "$index:$language");
+		    }
+		    else { # add in an empty subcollection field
+			push (@{$self->{'collect_cfg'}->{'indexes'}}, "$index\:\:$language");
+		    }
+		}
+	    }
+	}
+    }
+    
+    if (defined($self->{'collect_cfg'}->{'indexes'})) {
+	# make sure that the same index isn't specified more than once
+	my %tmphash = ();
+	my @tmparray = @{$self->{'collect_cfg'}->{'indexes'}};
+	$self->{'collect_cfg'}->{'indexes'} = [];
+	foreach my $i (@tmparray) {
+	    if (!defined ($tmphash{$i})) {
+		push (@{$self->{'collect_cfg'}->{'indexes'}}, $i);
+		$tmphash{$i} = 1;
+	    }
+	}
+    } else {
+	$self->{'collect_cfg'}->{'indexes'} = [];
+    }
+
+    # check incremental against whether builder can cope or not.
+    if ($self->{'incremental'} && !$self->is_incremental_capable()) {
+	print $outhandle "WARNING: The indexer used is not capable of incremental building. Reverting to -removeold\n";
+	$self->{'keepold'} = 0;
+	$self->{'incremental'} = 0;
+	$self->{'incremental_mode'} = "none";
+    
+    }
+
+
+    # get the list of plugins for this collection
+    my $plugins = [];
+    if (defined $self->{'collect_cfg'}->{'plugin'}) {
+	$plugins = $self->{'collect_cfg'}->{'plugin'};
+    }
+    
+    # load all the plugins
+
+    #build up the extra global options for the plugins
+    my @global_opts = ();
+    if (defined $self->{'collect_cfg'}->{'separate_cjk'} && $self->{'collect_cfg'}->{'separate_cjk'} =~ /^true$/i) {
+	push @global_opts, "-separate_cjk";
+    }
+    $self->{'pluginfo'} = &plugin::load_plugins ($plugins, $self->{'verbosity'}, $outhandle, $failhandle, \@global_opts, $self->{'incremental_mode'});
+   
+    if (scalar(@{$self->{'pluginfo'}}) == 0) {
+	print $outhandle "No plugins were loaded.\n";
+	die "\n";
+    }
+
+    # get the list of classifiers for this collection
+    my $classifiers = [];
+    if (defined $self->{'collect_cfg'}->{'classify'}) {
+	$classifiers = $self->{'collect_cfg'}->{'classify'};
+    }
+
+    # load all the classifiers
+    $self->{'classifiers'} = &classify::load_classifiers ($classifiers, $self->{'build_dir'}, $outhandle);
+
+    # load up the document processor for building
+    # if a buildproc class has been created for this collection, use it
+    # otherwise, use the default buildproc for the builder we are initialising
+    my $buildprocdir = undef;
+    my $buildproctype;
+
+    my $collection = $self->{'collection'};
+    if (-e "$ENV{'GSDLCOLLECTDIR'}/custom/${collection}/perllib/custombuildproc.pm") {
+	$buildprocdir = "$ENV{'GSDLCOLLECTDIR'}/custom/${collection}/perllib";
+	$buildproctype = "custombuildproc";
+    } elsif (-e "$ENV{'GSDLCOLLECTDIR'}/perllib/custombuildproc.pm") {
+	$buildprocdir = "$ENV{'GSDLCOLLECTDIR'}/perllib";
+	$buildproctype = "custombuildproc";
+    } elsif (-e "$ENV{'GSDLCOLLECTDIR'}/perllib/${collection}buildproc.pm") {
+	$buildprocdir = "$ENV{'GSDLCOLLECTDIR'}/perllib";
+	$buildproctype = "${collection}buildproc";
+    } else {
+	$buildproctype = $self->default_buildproc();
+    }
+    if (defined $buildprocdir) {
+	require "$buildprocdir/$buildproctype.pm";
+    }
+    else {
+	require "$buildproctype.pm";
+    }
+
+    eval("\$self->{'buildproc'} = new $buildproctype(\$self->{'collection'}, " .
+	 "\$self->{'source_dir'}, \$self->{'build_dir'}, \$self->{'keepold'}, \$self->{'verbosity'}, \$self->{'outhandle'})");
+    die "$@" if $@;
+
+    # We call set_infodbtype() now so the buildproc knows the infodbtype for all phases of the build
+    $self->{'buildproc'}->set_infodbtype($self->{'infodbtype'});
+    
+   $self->generate_index_options();
+
+    if (!$self->{'debug'} && !$self->{'keepold'}) {
+	# remove any old builds
+	&util::rm_r($self->{'build_dir'});
+	&util::mk_all_dir($self->{'build_dir'});
+        
+	# make the text directory
+	my $textdir = "$self->{'build_dir'}/text";
+	&util::mk_all_dir($textdir);
+    }
+
+    if ($self->{'incremental'}) {
+	# some classes may need to do some additional initialisation
+	$self->init_for_incremental_build();
+    }
+    
+}
+
+sub is_incremental_capable
+{
+    # By default we return 'no' as the answer
+    # Safer to assume non-incremental to start with, and then override in
+    # inherited classes that are.
+
+    return 0;
+}
+
+# implement this in subclass if want to do additional initialisation for an
+# incremental build
+sub init_for_incremental_build {
+    my $self = shift (@_);
+}
+
+sub deinit {
+    my $self = shift (@_);
+    
+    &plugin::deinit($self->{'pluginfo'},$self->{'buildproc'});
+}
+
+sub generate_index_options {
+    my $self = shift (@_);
+
+    my $separate_cjk = 0;
+    
+    if (defined($self->{'collect_cfg'}->{'indexoptions'})) {
+	foreach my $option (@{$self->{'collect_cfg'}->{'indexoptions'}}) {
+	    if ($option =~ /separate_cjk/) {
+		$separate_cjk = 1;
+	    }
+	}
+    }
+    # set this for building
+    $self->{'buildproc'}->set_separate_cjk($separate_cjk);
+    # record it for build.cfg
+    $self->{'separate_cjk'} = $separate_cjk;
+}
+ 
+sub set_sections_index_document_metadata {
+    my $self = shift (@_);
+    my ($index) = @_;
+  
+    $self->{'buildproc'}->set_sections_index_document_metadata($index);
+}
+
+sub set_maxnumeric {
+    my $self = shift (@_);
+    my ($maxnumeric) = @_;
+
+    $self->{'maxnumeric'} = $maxnumeric;
+}
+sub set_strip_html {
+    my $self = shift (@_);
+    my ($strip) = @_;
+    
+    $self->{'strip_html'} = $strip;
+    $self->{'buildproc'}->set_strip_html($strip);
+}
+
+sub compress_text {
+    my $self = shift (@_);
+    my ($textindex) = @_;
+
+    print STDERR "compress_text() should be implemented in subclass!!";
+    return;
+}
+
+
+sub build_indexes {
+    my $self = shift (@_);
+    my ($indexname,$indexlevel) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    $self->pre_build_indexes();
+
+    my $indexes = [];
+    if (defined $indexname && $indexname =~ /\w/) {
+	push @$indexes, $indexname;
+    } else {
+	$indexes = $self->{'collect_cfg'}->{'indexes'};
+    }
+
+    # create the mapping between the index descriptions 
+    # and their directory names (includes subcolls and langs)
+    $self->{'index_mapping'} = $self->create_index_mapping ($indexes);
+   
+    # build each of the indexes
+    foreach my $index (@$indexes) {
+	if ($self->want_built($index)) {
+	    print $outhandle "\n*** building index $index in subdirectory " . 
+		"$self->{'index_mapping'}->{$index}\n" if ($self->{'verbosity'} >= 1);
+	    print STDERR "<Stage name='Index' source='$index'>\n" if $self->{'gli'};
+	    $self->build_index($index);
+	} else {
+	    print $outhandle "\n*** ignoring index $index\n" if ($self->{'verbosity'} >= 1);
+	}
+    }
+
+    $self->post_build_indexes();
+
+}
+
+# implement this in subclass if want to do extra stuff at before building
+# all the indexes
+sub pre_build_indexes {
+    my $self = shift(@_);
+    my ($indexname) = @_; # optional parameter
+}
+
+# implement this in subclass if want to do extra stuff at the end of building
+# all the indexes
+sub post_build_indexes {
+    my $self = shift(@_);   
+}
+
+sub build_index {
+    my $self = shift (@_);
+    my ($index) = @_;
+    
+    print STDERR "build_index should be implemented in subclass\n";
+    return;
+}
+
+
+
+sub make_infodatabase {
+    my $self = shift (@_);
+    my $outhandle = $self->{'outhandle'};
+
+    print STDERR "BuildDir: $self->{'build_dir'}\n";
+
+    my $textdir = &util::filename_cat($self->{'build_dir'}, "text");
+    my $assocdir = &util::filename_cat($self->{'build_dir'}, "assoc");
+    &util::mk_all_dir ($textdir);
+    &util::mk_all_dir ($assocdir);
+
+    # Get info database file path
+    my $infodb_type = $self->{'infodbtype'};
+    my $infodb_file_path = &dbutil::get_infodb_file_path($infodb_type, $self->{'collection'}, $textdir);
+
+    print $outhandle "\n*** creating the info database and processing associated files\n" 
+	if ($self->{'verbosity'} >= 1);
+    print STDERR "<Stage name='CreateInfoData'>\n" if $self->{'gli'};
+
+    # init all the classifiers
+    &classify::init_classifiers ($self->{'classifiers'});
+
+    my $reconstructed_docs = undef;
+    my $database_recs = undef;
+
+    if ($self->{'incremental'}) {
+	$database_recs = {};
+
+	&dbutil::read_infodb_file($infodb_type, $infodb_file_path, $database_recs);
+    }
+
+    
+    # Important (for memory usage reasons) that we obtain the filehandle
+    # here for writing out to the database, rather than after 
+    # $reconstructed_docs has been set up (assuming -incremental is on)
+    #
+    # This is because when we open a pipe to txt2db [using open()]
+    # this triggers a fork() followed by exec().  $reconstructed_docs
+    # can get very large, and so if we did the open() after this, it means
+    # the fork creates a clone of the *large* process image which (admittedly)
+    # is then quickly replaced in the execve() with the much smaller image for 
+    # 'txt2db'.  The trouble is, in that seismic second caused by
+    # the fork(), the system really does need to have all that memory available
+    # even though it isn't ultimately used.  The result is an out of memory
+    # error.
+
+    my ($infodb_handle);
+    if ($self->{'debug'}) {
+	$infodb_handle = *STDOUT;
+    }
+    else {
+	$infodb_handle = &dbutil::open_infodb_write_handle($infodb_type, $infodb_file_path);
+	if (!defined($infodb_handle))
+	{
+	    print STDERR "<FatalError name='NoRunText2DB'/>\n</Stage>\n" if $self->{'gli'};
+	    die "builder::make_infodatabase - couldn't open infodb write handle\n";
+	}
+    }
+
+    if ($self->{'incremental'}) {
+	# reconstruct doc_obj metadata from database for all docs
+	$reconstructed_docs 
+	    = &classify::reconstruct_doc_objs_metadata($infodb_type, 
+						       $infodb_file_path,
+						       $database_recs);
+    }
+
+    # set up the document processor
+
+    $self->{'buildproc'}->set_output_handle ($infodb_handle);
+    $self->{'buildproc'}->set_mode ('infodb');
+    $self->{'buildproc'}->set_assocdir ($assocdir);
+    $self->{'buildproc'}->set_dontdb ($self->{'dontdb'});
+    $self->{'buildproc'}->set_classifiers ($self->{'classifiers'});
+    $self->{'buildproc'}->set_indexing_text (0);
+    $self->{'buildproc'}->set_store_text(1);
+    $self->{'buildproc'}->set_store_metadata_coverage ($self->{'collect_cfg'}->{'store_metadata_coverage'});
+
+    # make_infodatabase needs full reset even for incremental build
+    # as incremental works by reconstructing all docs from the database and
+    # then adding in the new ones
+    $self->{'buildproc'}->zero_reset(); 
+
+    $self->{'buildproc'}->{'mdprefix_fields'} = {};
+   
+    &plugin::read ($self->{'pluginfo'}, $self->{'source_dir'}, 
+		   "", {}, {}, $self->{'buildproc'}, $self->{'maxdocs'},0, $self->{'gli'});
+
+    if ($self->{'incremental'}) {
+	# create flat classify structure, ready for new docs to be added
+	foreach my $doc_obj ( @$reconstructed_docs ) {
+	    if (! defined $self->{'buildproc'}->{'dont_process_reconstructed'}->{$doc_obj->get_OID()}) {
+		print $outhandle "  Adding reconstructed ", $doc_obj->get_OID(), " into classify structures\n";
+		$self->{'buildproc'}->process($doc_obj,undef);
+	    } 
+	}
+    }
+    # this has changed to only output collection meta if its 
+    # not in the config file
+    $self->output_collection_meta($infodb_handle);
+    
+    # output classification information
+    &classify::output_classify_info ($self->{'classifiers'}, $infodb_type, $infodb_handle,
+				     $self->{'remove_empty_classifications'}, 
+				     $self->{'gli'});
+
+    # Output classifier reverse lookup, used in incremental deletion
+    ####&classify::print_reverse_lookup($infodb_handle);
+
+    # output doclist
+    my @doc_list = $self->{'buildproc'}->get_doc_list();
+    my $browselist_infodb = { 'hastxt' => [ "0" ],
+			      'childtype' => [ "VList" ],
+			      'numleafdocs' => [ scalar(@doc_list) ],
+			      'thistype' => [ "Invisible" ],
+			      'contains' => [ join(";", @doc_list) ] };
+    &dbutil::write_infodb_entry($infodb_type, $infodb_handle, "browselist", $browselist_infodb);
+
+    &dbutil::close_infodb_write_handle($infodb_type, $infodb_handle) if !$self->{'debug'};
+    
+    if ($infodb_type eq "gdbm-txtgz") {
+	my $gdb_infodb_file_path = &dbutil::get_infodb_file_path("gdbm", $self->{'collection'}, $textdir);
+	if (-e $gdb_infodb_file_path) {
+	    &util::rm($gdb_infodb_file_path);
+	}
+    }
+    print STDERR "</Stage>\n" if $self->{'gli'};
+}
+
+sub make_auxiliary_files {
+    my $self = shift (@_);
+    my ($index);
+    my $build_cfg = {};
+    # subclasses may have already defined stuff in here
+    if (defined $self->{'build_cfg'}) {
+	$build_cfg = $self->{'build_cfg'};
+    }
+
+    my $outhandle = $self->{'outhandle'};
+
+    print $outhandle "\n*** creating auxiliary files \n" if ($self->{'verbosity'} >= 1);
+    print STDERR "<Stage name='CreatingAuxilary'>\n" if $self->{'gli'};
+
+    # get the text directory
+    &util::mk_all_dir ($self->{'build_dir'});
+
+    # store the build date
+    $build_cfg->{'builddate'} = time;
+    $build_cfg->{'buildtype'} = $self->{'buildtype'};
+    $build_cfg->{'indexstem'} = &util::get_dirsep_tail($self->{'collection'});
+    $build_cfg->{'stemindexes'} = $self->{'stemindexes'};
+    if ($self->{'separate_cjk'}) {
+	$build_cfg->{'separate_cjk'} = "true";
+    }
+    
+    # store the number of documents and number of bytes
+    $build_cfg->{'numdocs'} = $self->{'buildproc'}->get_num_docs();
+    $build_cfg->{'numsections'} = $self->{'buildproc'}->get_num_sections();
+    $build_cfg->{'numbytes'} = $self->{'buildproc'}->get_num_bytes();
+
+    # store the mapping between the index names and the directory names
+    # the index map is used to determine what indexes there are, so any that are not built should not be put into the map.
+    my @indexmap = ();
+    foreach my $index (@{$self->{'index_mapping'}->{'indexmaporder'}}) {
+	if (not defined ($self->{'notbuilt'}->{$index})) {
+	    push (@indexmap, "$index\-\>$self->{'index_mapping'}->{'indexmap'}->{$index}");
+	}
+    }
+    $build_cfg->{'indexmap'} = \@indexmap if scalar (@indexmap);
+
+    my @subcollectionmap = ();
+    foreach my $subcollection (@{$self->{'index_mapping'}->{'subcollectionmaporder'}}) {
+	push (@subcollectionmap, "$subcollection\-\>" .
+	      $self->{'index_mapping'}->{'subcollectionmap'}->{$subcollection});
+    }
+    $build_cfg->{'subcollectionmap'} = \@subcollectionmap if scalar (@subcollectionmap);
+
+    my @languagemap = ();
+    foreach my $language (@{$self->{'index_mapping'}->{'languagemaporder'}}) {
+	push (@languagemap, "$language\-\>" .
+	      $self->{'index_mapping'}->{'languagemap'}->{$language});
+    }
+    $build_cfg->{'languagemap'} = \@languagemap if scalar (@languagemap);
+
+    my @notbuilt = ();
+    foreach my $nb (keys %{$self->{'notbuilt'}}) {
+	push (@notbuilt, $nb);
+    }
+    $build_cfg->{'notbuilt'} = \@notbuilt if scalar (@notbuilt);
+
+    $build_cfg->{'maxnumeric'} = $self->{'maxnumeric'};
+
+    $build_cfg->{'infodbtype'} = $self->{'infodbtype'};
+    
+    # write out the earliestDatestamp information needed for OAI
+    my $archivedir = &util::filename_cat ($ENV{'GSDLCOLLECTDIR'}, "archives");
+    if(!-d $archivedir) {
+	$archivedir = &util::filename_cat ($ENV{'GSDLCOLLECTDIR'}, "export");
+    }
+    my $earliestDatestampFile = &util::filename_cat ($archivedir, "earliestDatestamp");
+    my $earliestDatestamp = 0;
+    if (open(FIN,"<$earliestDatestampFile")) {
+	{
+	    # slurp in file as a single line
+	    local $/ = undef;
+	    $earliestDatestamp = <FIN>;
+	    #&unicode::ensure_utf8(\$earliestDatestamp); # turn any high bytes that aren't valid utf-8 into utf-8.
+	}
+	close(FIN);
+    }
+    else {
+	print $outhandle "Warning: unable to read collection's earliestDatestamp from $earliestDatestampFile.\n";
+	print $outhandle "Setting value to 0.\n";
+    }
+    $build_cfg->{'earliestdatestamp'} = $earliestDatestamp;
+    
+    $self->build_cfg_extra($build_cfg);
+
+    if ($gs_mode eq "gs2") {
+      &colcfg::write_build_cfg(&util::filename_cat($self->{'build_dir'},"build.cfg"), $build_cfg);
+    }
+    if ($gs_mode eq "gs3") {
+
+      &colcfg::write_build_cfg_xml(&util::filename_cat($self->{'build_dir'}, "buildConfig.xml"), $build_cfg, $self->{'collect_cfg_preserve'});
+    }    
+
+    print STDERR "</Stage>\n" if $self->{'gli'};
+}
+
+# implement this in subclass if want to add extra stuff to build.cfg
+sub build_cfg_extra {
+   my $self = shift(@_);
+   my ($build_cfg) = @_;
+   
+}
+
+
+sub collect_specific {
+    my $self = shift (@_);
+}
+
+sub want_built {
+    my $self = shift (@_);
+    my ($index) = @_;
+
+    if (defined ($self->{'collect_cfg'}->{'dontbuild'})) {
+	foreach my $checkstr (@{$self->{'collect_cfg'}->{'dontbuild'}}) {
+	    if ($index =~ /^$checkstr$/) {
+		$self->{'notbuilt'}->{$index} = 1;
+		return 0;
+	    }
+	}
+    }
+
+    return 1;
+}
+
+sub create_index_mapping {
+    my $self = shift (@_);
+    my ($indexes) = @_;
+
+    print STDERR "create_index_mapping should be implemented in subclass\n";
+    my %mapping = ();
+    return \%mapping;
+}
+
+# returns a processed version of a field.
+# if the field has only one component the processed
+# version will contain the first character and next consonant
+# of that componant - otherwise it will contain the first 
+# character of the first two components 
+# only uses letdig (\w) characters now
+sub process_field {
+    my $self = shift (@_);
+    my ($field) = @_;
+
+    return "" unless (defined ($field) && $field =~ /\S/);
+    
+    my ($a, $b);
+    my @components = split /,/, $field;
+    if (scalar @components >= 2) {
+	# pick the first letdig from the first two field names
+	($a) = $components[0] =~ /^[^\w]*(\w)/;
+	($b) = $components[1] =~ /^[^\w]*(\w)/;
+    } else {
+	# pick the first two letdig chars
+	($a, $b) = $field =~ /^[^\w]*(\w)[^\w]*?(\w)/i;
+    }
+    # there may not have been any letdigs...
+    $a = 'a' unless defined $a;
+    $b = '0' unless defined $b;
+    
+    my $newfield = "$a$b";
+    if ($newfield =~ /^\d\d$/) {
+	# digits only - Greenstone runtime doesn't like this.
+	$newfield = "a$a";
+    }
+    return $newfield;
+    
+}
+
+sub get_next_version {
+    my $self = shift (@_);
+    my ($nameref) = @_;
+    my $num=0;
+    if ($$nameref =~ /(\d\d)$/) {
+	$num = $1; $num ++;
+	$$nameref =~ s/\d\d$/$num/;
+    } elsif ($$nameref =~ /(\d)$/) {
+	$num = $1;
+	if ($num == 9) {$$nameref =~ s/\d$/10/;}
+	else {$num ++; $$nameref =~ s/\d$/$num/;}
+    } else {
+	$$nameref =~ s/.$/0/;
+    }
+}
+
+
+
+sub get_collection_meta_sets
+{
+    my $self = shift(@_);
+    my $collection_infodb = shift(@_);
+
+    my $mdprefix_fields = $self->{'buildproc'}->{'mdprefix_fields'};
+    foreach my $prefix (keys %$mdprefix_fields)
+    {
+	push(@{$collection_infodb->{"metadataset"}}, $prefix);
+
+	foreach my $field (keys %{$mdprefix_fields->{$prefix}})
+	{
+	    push(@{$collection_infodb->{"metadatalist-$prefix"}}, $field);
+
+	    my $val = $mdprefix_fields->{$prefix}->{$field};
+	    push(@{$collection_infodb->{"metadatafreq-$prefix-$field"}}, $val);
+	}
+    }
+}
+
+
+# default is to output the metadata sets (prefixes) used in collection
+sub output_collection_meta
+{
+    my $self = shift(@_);
+    my $infodb_handle = shift(@_);
+
+    my %collection_infodb = ();
+    $self->get_collection_meta_sets(\%collection_infodb);
+    &dbutil::write_infodb_entry($self->{'infodbtype'}, $infodb_handle, "collection", \%collection_infodb);
+}
+
+# sometimes we need to read in an existing build.cfg - for example, 
+# if doing each stage of building separately, or when doing incremental 
+# building
+sub read_build_cfg {
+    my $self = shift(@_);
+
+    my $buildconfigfilename;
+    
+    if ($gs_mode eq "gs2") {
+	$buildconfigfilename = "build.cfg";
+    } else {
+	$buildconfigfilename = "buildConfig.xml";
+    }
+    
+    my $buildconfigfile = &util::filename_cat($self->{'build_dir'}, $buildconfigfilename);
+    
+    if (!-e $buildconfigfile) {
+	# try the index dir - but do we know where it is?? try here
+	$buildconfigfile  = &util::filename_cat($ENV{'GSDLCOLLECTDIR'}, "index", $buildconfigfilename);
+	if (!-e $buildconfigfile) {
+	    #we cant find a config file - just ignore the field list
+	    return undef;
+	}
+    } 
+    return &colcfg::read_building_cfg( $buildconfigfile, $gs_mode);
+    
+}
+
+sub print_stats {
+    my $self = shift (@_);
+
+    my $outhandle = $self->{'outhandle'};
+    my $indexing_text = $self->{'buildproc'}->get_indexing_text();
+    my $index = $self->{'buildproc'}->get_index();
+    my $num_bytes = $self->{'buildproc'}->get_num_bytes();
+    my $num_processed_bytes = $self->{'buildproc'}->get_num_processed_bytes();
+
+    if ($indexing_text) {
+	print $outhandle "Stats (Creating index $index)\n";
+    } else {
+	print $outhandle "Stats (Compressing text from $index)\n";
+    }
+    print $outhandle "Total bytes in collection: $num_bytes\n";
+    print $outhandle "Total bytes in $index: $num_processed_bytes\n";
+
+    if ($num_processed_bytes < 50 && ($indexing_text || !$self->{'no_text'})) {
+	
+	if ($self->{'incremental'}) {
+	    if ($num_processed_bytes == 0) {
+		if ($indexing_text) {
+		    print $outhandle "No additional text was added to $index\n";
+		} elsif (!$self->{'no_text'}) {
+		    print $outhandle "No additional text was compressed\n";
+		}	
+	    }	
+	}
+	else {
+	    print $outhandle "***************\n";
+	    if ($indexing_text) {
+		print $outhandle "WARNING: There is very little or no text to process for $index\n";
+	    } elsif (!$self->{'no_text'}) {
+		print $outhandle "WARNING: There is very little or no text to compress\n";
+	    }	   
+	    print $outhandle "         Was this your intention?\n";
+	    print $outhandle "***************\n";
+	}
+
+    }
+
+}
+
+sub prepare_build_recipe
+{
+  my ($self) = @_;
+  my $outhandle = $self->{'outhandle'};
+  print $outhandle "WARNING: prepare_build_recipe() should be implemented in subclass!!";
+}
+  
+1;
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/basebuildproc.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/basebuildproc.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/basebuildproc.pm	(revision 24799)
@@ -0,0 +1,837 @@
+##########################################################################
+#
+# basebuildproc.pm -- 
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# This document processor outputs a document for indexing (should be 
+# implemented by subclass) and storing in the database
+
+package basebuildproc;
+
+eval {require bytes};
+
+use classify;
+use dbutil;
+use doc;
+use docproc;
+use strict; 
+no strict 'subs';
+no strict 'refs';
+use util;
+
+BEGIN {
+    @basebuildproc::ISA = ('docproc');
+}
+
+sub new()
+  {
+    my ($class, $collection, $source_dir, $build_dir, $keepold, $verbosity, $outhandle) = @_;
+    my $self = new docproc ();
+
+    # outhandle is where all the debugging info goes
+    # output_handle is where the output of the plugins is piped
+    # to (i.e. mg, database etc.)
+    $outhandle = STDERR unless defined $outhandle;
+
+    $self->{'collection'} = $collection;
+    $self->{'source_dir'} = $source_dir;
+    $self->{'build_dir'}  = $build_dir;
+    $self->{'keepold'}    = $keepold;
+    $self->{'verbosity'}  = $verbosity;
+    $self->{'outhandle'}  = $outhandle;
+
+    $self->{'classifiers'} = [];
+    $self->{'mode'} = "text";
+    $self->{'assocdir'} = $build_dir;
+    $self->{'dontdb'} = {};
+    $self->{'store_metadata_coverage'} = "false";
+
+    $self->{'index'} = "section:text";
+    $self->{'indexexparr'} = [];
+
+    $self->{'separate_cjk'} = 0;
+
+    my $found_num_data = 0;
+    my $buildconfigfile = undef;
+
+    if ($keepold) {
+	# For incremental building need to seed num_docs etc from values
+	# stored in build.cfg (if present)
+	$buildconfigfile = &util::filename_cat($build_dir, "build.cfg");
+	if (-e $buildconfigfile) {
+	    $found_num_data = 1;
+	}
+	else {
+	    # try the index dir
+	    $buildconfigfile = &util::filename_cat($ENV{'GSDLCOLLECTDIR'}, 
+						   "index", "build.cfg");
+	    if (-e $buildconfigfile) {
+		$found_num_data = 1;
+	    }
+	}
+
+    }
+
+    if ($found_num_data)
+      {
+        #print STDERR "Found_Num_Data!\n";
+	my $buildcfg = &colcfg::read_build_cfg($buildconfigfile);
+	$self->{'starting_num_docs'}     = $buildcfg->{'numdocs'};
+        #print STDERR "- num_docs:     $self->{'starting_num_docs'}\n";
+	$self->{'starting_num_sections'} = $buildcfg->{'numsections'};
+        #print STDERR "- num_sections: $self->{'starting_num_sections'}\n";
+	$self->{'starting_num_bytes'}    = $buildcfg->{'numbytes'};
+        #print STDERR "- num_bytes:    $self->{'starting_num_bytes'}\n";
+    }
+    else
+      {
+        #print STDERR "NOT Found_Num_Data!\n";
+        $self->{'starting_num_docs'}     = 0;
+	$self->{'starting_num_sections'} = 0;
+	$self->{'starting_num_bytes'}    = 0;
+      }
+
+    $self->{'output_handle'} = "STDOUT";
+    $self->{'num_docs'}      = $self->{'starting_num_docs'};
+    $self->{'num_sections'}  = $self->{'starting_num_sections'};
+    $self->{'num_bytes'}     = $self->{'starting_num_bytes'};
+
+    $self->{'num_processed_bytes'} = 0;
+    $self->{'store_text'} = 1;
+
+    # what level (section/document) the database - indexer intersection is
+    $self->{'db_level'} = "section";
+    #used by browse interface
+    $self->{'doclist'} = [];
+
+    $self->{'indexing_text'} = 0;
+
+    return bless $self, $class;
+
+}
+
+sub reset {
+    my $self = shift (@_);
+
+    $self->{'num_docs'}      = $self->{'starting_num_docs'};
+    $self->{'num_sections'}  = $self->{'starting_num_sections'};
+    $self->{'num_bytes'}     = $self->{'starting_num_bytes'};
+    
+    $self->{'num_processed_bytes'} = 0;
+}
+
+sub zero_reset {
+    my $self = shift (@_);
+
+    $self->{'num_docs'}      = 0;
+    $self->{'num_sections'}  = 0;
+    # reconstructed docs have no text, just metadata, so we need to 
+    # remember how many bytes we had initially
+    #$self->{'num_bytes'}     = $self->{'starting_num_bytes'};
+    $self->{'num_bytes'} = 0; # we'll store num bytes in db for reconstructed docs.
+    $self->{'num_processed_bytes'} = 0;
+}
+
+sub is_incremental_capable
+{
+    # By default we return 'no' as the answer
+    # Safer to assume non-incremental to start with, and then override in
+    # inherited classes that are.
+
+    return 0;
+}
+
+sub get_num_docs {
+    my $self = shift (@_);
+
+    return $self->{'num_docs'};
+}
+
+sub get_num_sections {
+    my $self = shift (@_);
+
+    return $self->{'num_sections'};
+}
+
+# num_bytes is the actual number of bytes in the collection
+# this is normally the same as what's processed during text compression
+sub get_num_bytes {
+    my $self = shift (@_);
+
+    return $self->{'num_bytes'};
+}
+
+# num_processed_bytes is the number of bytes actually passed
+# to mg for the current index
+sub get_num_processed_bytes {
+    my $self = shift (@_);
+
+    return $self->{'num_processed_bytes'};
+}
+
+sub set_output_handle {
+    my $self = shift (@_);
+    my ($handle) = @_;
+
+    $self->{'output_handle'} = $handle;
+    # Sigh - the output handle isn't always an actual handle. In a couple of
+    # the database drivers (MSSQL and GDBMServer) it's actually a reference
+    # to an object. So we need to test the type before setting the binmode
+    # [jmt12]
+    if (ref $handle eq "GLOB")
+    {
+      binmode($handle,":utf8");
+    }
+}
+
+
+sub set_mode {
+    my $self = shift (@_);
+    my ($mode) = @_;
+
+    $self->{'mode'} = $mode;
+}
+
+sub get_mode {
+    my $self = shift (@_);
+
+    return $self->{'mode'};
+}
+
+sub set_assocdir {
+    my $self = shift (@_);
+    my ($assocdir) = @_;
+
+    $self->{'assocdir'} = $assocdir;
+}
+
+sub set_dontdb {
+    my $self = shift (@_);
+    my ($dontdb) = @_;
+
+    $self->{'dontdb'} = $dontdb;
+}
+
+sub set_infodbtype
+{
+    my $self = shift(@_);
+    my $infodbtype = shift(@_);
+    $self->{'infodbtype'} = $infodbtype;
+}
+
+sub set_index {
+    my $self = shift (@_);
+    my ($index, $indexexparr) = @_;
+
+    $self->{'index'} = $index;
+    $self->{'indexexparr'} = $indexexparr if defined $indexexparr;
+}
+
+sub set_index_languages {
+    my $self = shift (@_);
+    my ($lang_meta, $langarr) = @_;
+    $lang_meta =~ s/^ex\.([^.]+)$/$1/; # strip any ex. namespace iff it's the only namespace prefix (will leave ex.dc.* intact)
+
+    $self->{'lang_meta'} = $lang_meta;
+    $self->{'langarr'} = $langarr;
+}
+
+sub get_index {
+    my $self = shift (@_);
+
+    return $self->{'index'};
+}
+
+sub set_classifiers {
+    my $self = shift (@_);
+    my ($classifiers) = @_;
+
+    $self->{'classifiers'} = $classifiers;
+}
+
+sub set_indexing_text {
+    my $self = shift (@_);
+    my ($indexing_text) = @_;
+
+    $self->{'indexing_text'} = $indexing_text;
+}
+
+sub get_indexing_text {
+    my $self = shift (@_);
+
+    return $self->{'indexing_text'};
+}
+
+sub set_store_text {
+    my $self = shift (@_);
+    my ($store_text) = @_;
+
+    $self->{'store_text'} = $store_text;
+}
+
+sub set_store_metadata_coverage {
+    my $self = shift (@_);
+    my ($store_metadata_coverage) = @_;
+
+    $self->{'store_metadata_coverage'} = $store_metadata_coverage || "";
+}
+
+sub get_doc_list {
+    my $self = shift(@_);
+    
+    return @{$self->{'doclist'}};
+}
+
+# the standard database level is section, but you may want to change it to document
+sub set_db_level {
+    my $self= shift (@_);
+    my ($db_level) = @_;
+
+    $self->{'db_level'} = $db_level;
+}
+
+sub set_sections_index_document_metadata {
+    my $self= shift (@_);
+    my ($index_type) = @_;
+    
+    $self->{'sections_index_document_metadata'} = $index_type;
+}
+
+sub set_separate_cjk {
+    my $self = shift (@_);
+    my ($sep_cjk) = @_;
+
+    $self->{'separate_cjk'} = $sep_cjk;
+}
+
+sub process {
+    my $self = shift (@_);
+    my $method = $self->{'mode'};
+
+    $self->$method(@_);
+}
+
+# post process text depending on field. Currently don't do anything here
+# except cjk separation, and only for indexing
+# should only do this for indexed text (if $self->{'indexing_text'}), 
+# but currently search term highlighting doesn't work if you do that.
+# once thats fixed up, then fix this.
+sub filter_text {
+    my $self = shift (@_);
+    my ($field, $text) = @_;
+
+    # lets do cjk seg here
+    my $new_text =$text;
+    if ($self->{'separate_cjk'}) {
+	$new_text = &cnseg::segment($text);
+    }
+    return $new_text;
+}
+
+
+sub infodb_metadata_stats
+{
+    my $self = shift (@_);
+    my ($field,$edit_mode) = @_;
+
+    # Keep some statistics relating to metadata sets used and
+    # frequency of particular metadata fields within each set
+
+    # Union of metadata prefixes and frequency of fields
+    # (both scoped for this document alone, and across whole collection)
+    
+    if ($field =~ m/^(.+)\.(.*)$/) {
+	my $prefix = $1;
+	my $core_field = $2;
+
+	if (($edit_mode eq "add") || ($edit_mode eq "update")) {
+	    $self->{'doc_mdprefix_fields'}->{$prefix}->{$core_field}++;
+	    $self->{'mdprefix_fields'}->{$prefix}->{$core_field}++;
+	}
+	else {
+	    # delete
+	    $self->{'doc_mdprefix_fields'}->{$prefix}->{$core_field}--;
+	    $self->{'mdprefix_fields'}->{$prefix}->{$core_field}--;
+	}
+
+    }
+    elsif ($field =~ m/^[[:upper:]]/) {
+	# implicit 'ex' metadata set
+
+	if (($edit_mode eq "add") || ($edit_mode eq "update")) {
+
+	    $self->{'doc_mdprefix_fields'}->{'ex'}->{$field}++;
+	    $self->{'mdprefix_fields'}->{'ex'}->{$field}++;
+	}
+	else {
+	    # delete
+	    $self->{'doc_mdprefix_fields'}->{'ex'}->{$field}--;
+	    $self->{'mdprefix_fields'}->{'ex'}->{$field}--;
+	}
+    }
+
+}
+
+
+sub infodbedit {
+    my $self = shift (@_);
+    my ($doc_obj, $filename, $edit_mode) = @_;
+    
+    # only output this document if it is a "indexed_doc" or "info_doc" (database only) document
+    my $doctype = $doc_obj->get_doc_type();
+    return if ($doctype ne "indexed_doc" && $doctype ne "info_doc");
+    
+    my $archivedir = "";
+    if (defined $filename)
+    {
+	# doc_obj derived directly from file
+	my ($dir) = $filename =~ /^(.*?)(?:\/|\\)[^\/\\]*$/;
+	$dir = "" unless defined $dir;
+	$dir =~ s/\\/\//g;
+	$dir =~ s/^\/+//;
+	$dir =~ s/\/+$//;
+
+	$archivedir = $dir;
+
+	if ($edit_mode eq "delete") {
+	    # record this doc so we don't process the reconstructed doc later
+	    $self->{'dont_process_reconstructed'}->{$doc_obj->get_OID()} = 1;
+	    # we don't need to do anything else for the info database for a deleted document. The infodb starts from scratch each time, so no deletion is necessary
+	    $self->delete_assoc_files ($archivedir, "delete");
+	    return;
+	}
+	if ($edit_mode eq "update") {
+	    # we don't want to process the reconstructed doc later, but we will process this version now.
+	    $self->{'dont_process_reconstructed'}->{$doc_obj->get_OID()} = 1;
+	    # delete the old assoc files as they may have changed
+	    $self->delete_assoc_files ($archivedir, "update");
+	}
+	
+	# resolve the final filenames of the files associated with this document
+	# now save the new assoc files for an update/new doc.
+	$self->assoc_files ($doc_obj, $archivedir);
+    }
+    else
+    {
+	# doc_obj reconstructed from database (has metadata, doc structure but no text)
+	my $top_section = $doc_obj->get_top_section();
+	$archivedir = $doc_obj->get_metadata_element($top_section,"archivedir");
+    }
+
+    # rest of code used for add and update. In both cases, we add to the classifiers and to the info database. 
+
+    #add this document to the browse structure
+    push(@{$self->{'doclist'}},$doc_obj->get_OID()) 
+	unless ($doctype eq "classification");
+    $self->{'num_docs'} += 1 unless ($doctype eq "classification");
+	
+    if (!defined $filename) {
+	# a reconstructed doc
+	my $num_reconstructed_bytes = $doc_obj->get_metadata_element ($doc_obj->get_top_section (), "total_numbytes");
+	if (defined $num_reconstructed_bytes) {
+	    $self->{'num_bytes'} += $num_reconstructed_bytes;
+	}
+    }
+    # classify the document
+    &classify::classify_doc ($self->{'classifiers'}, $doc_obj);
+    
+    # now add all the sections to the infodb.
+    
+    # is this a paged or a hierarchical document
+    my ($thistype, $childtype) = $self->get_document_type ($doc_obj);
+
+    my $section = $doc_obj->get_top_section ();
+    my $doc_OID = $doc_obj->get_OID();
+    my $first = 1;
+    my $infodb_handle = $self->{'output_handle'};
+
+    $self->{'doc_mdprefix_fields'} = {};
+
+    while (defined $section)
+    {
+	my $section_OID = $doc_OID;
+	if ($section ne "")
+	{
+	    $section_OID = $doc_OID . "." . $section;
+	}
+	my %section_infodb = ();
+
+	# update a few statistics 
+	$self->{'num_bytes'} += $doc_obj->get_text_length ($section);
+	$self->{'num_sections'} += 1 unless ($doctype eq "classification");
+	
+	# output the fact that this document is a document (unless doctype
+	# has been set to something else from within a plugin
+	my $dtype = $doc_obj->get_metadata_element ($section, "doctype");
+	if (!defined $dtype || $dtype !~ /\w/) {
+	    $section_infodb{"doctype"} = [ "doc" ];
+	}
+
+	if ($first && defined $filename) {
+	    # if we are at the top level of the document, and we are not a reconstructed document, set the total_text_length - used to count bytes when we reconstruct later
+	    my $length = $doc_obj->get_total_text_length();
+	    $section_infodb{"total_numbytes"} = [ $length ];
+	}
+	# Output whether this node contains text
+	#
+	# If doc_obj reconstructed from database file then no need to 
+	# explicitly add <hastxt> as this is preserved as metadata when
+	# the database file is loaded in
+	if (defined $filename)
+	{
+	    # doc_obj derived directly from file
+	    if ($doc_obj->get_text_length($section) > 0) {
+		$section_infodb{"hastxt"} = [ "1" ];
+	    } else {
+		$section_infodb{"hastxt"} = [ "0" ];
+	    }
+	}
+
+	# output all the section metadata
+	my $metadata = $doc_obj->get_all_metadata ($section);
+	foreach my $pair (@$metadata) {
+	    my ($field, $value) = (@$pair);
+
+	    if ($field ne "Identifier" && $field !~ /^gsdl/ && 
+		defined $value && $value ne "") {	    
+
+		# escape problematic stuff
+		$value =~ s/([^\\])\\([^\\])/$1\\\\$2/g;
+		$value =~ s/\n/\\n/g;
+		$value =~ s/\r/\\r/g;
+		# remove any ex. iff it's the only namespace prefix (will leave ex.dc.* intact)
+		$field =~ s/^ex\.([^.]+)$/$1/; # $field =~ s/^ex\.//; 
+
+		# special case for UTF8URL metadata
+		if ($field =~ m/^UTF8URL$/i) {
+		    &dbutil::write_infodb_entry($self->{'infodbtype'}, $infodb_handle, 
+						$value, { 'section' => [ $section_OID ] });
+		}
+		
+		if (!defined $self->{'dontdb'}->{$field}) {
+		    push(@{$section_infodb{$field}}, $value);
+
+		    if ($section eq "" && $self->{'store_metadata_coverage'} =~ /^true$/i)
+		    {
+			$self->infodb_metadata_stats($field,$edit_mode);
+		    }
+		}
+	    }
+	}
+
+	if ($section eq "")
+	{
+	    my $doc_mdprefix_fields = $self->{'doc_mdprefix_fields'};
+
+	    foreach my $prefix (keys %$doc_mdprefix_fields)
+	    {
+		push(@{$section_infodb{"metadataset"}}, $prefix);
+
+		foreach my $field (keys %{$doc_mdprefix_fields->{$prefix}})
+		{
+		    push(@{$section_infodb{"metadatalist-$prefix"}}, $field);
+
+		    my $val = $doc_mdprefix_fields->{$prefix}->{$field};
+		    push(@{$section_infodb{"metadatafreq-$prefix-$field"}}, $val);
+		}
+	    }
+	}
+
+	# If doc_obj reconstructed from database file then no need to 
+	# explicitly add <archivedir> as this is preserved as metadata when
+	# the database file is loaded in
+	if (defined $filename)
+	{
+	    # output archivedir if at top level
+	    if ($section eq $doc_obj->get_top_section()) {
+		$section_infodb{"archivedir"} = [ $archivedir ];
+	    }
+	}
+
+	# output document display type
+	if ($first) {
+	    $section_infodb{"thistype"} = [ $thistype ];
+	}
+
+	if ($self->{'db_level'} eq "document") {
+	    # doc num is num_docs not num_sections
+	    # output the matching document number
+	    $section_infodb{"docnum"} = [ $self->{'num_docs'} ];
+	}
+	else {
+	    # output a list of children
+	    my $children = $doc_obj->get_children ($section);
+	    if (scalar(@$children) > 0) {
+		$section_infodb{"childtype"} = [ $childtype ];
+		my $contains = "";
+		foreach my $child (@$children)
+		{
+		    $contains .= ";" unless ($contains eq "");
+		    if ($child =~ /^.*?\.(\d+)$/)
+		    {
+			$contains .= "\".$1";
+		    }
+		    else
+		    {
+			$contains .= "\".$child";
+		    }
+		}
+		$section_infodb{"contains"} = [ $contains ];
+	    }
+	    # output the matching doc number
+	    $section_infodb{"docnum"} = [ $self->{'num_sections'} ];
+	} 
+	
+	&dbutil::write_infodb_entry($self->{'infodbtype'}, $infodb_handle, $section_OID, \%section_infodb);
+		
+	# output a database entry for the document number, unless we are incremental
+	unless ($self->is_incremental_capable())
+	{
+	    if ($self->{'db_level'} eq "document") {
+		&dbutil::write_infodb_entry($self->{'infodbtype'}, $infodb_handle, $self->{'num_docs'}, { 'section' => [ $doc_OID ] });
+	    }
+	    else {
+		&dbutil::write_infodb_entry($self->{'infodbtype'}, $infodb_handle, $self->{'num_sections'}, { 'section' => [ $section_OID ] });
+	    }
+	}
+	    
+	$first = 0;
+	$section = $doc_obj->get_next_section($section);
+	last if ($self->{'db_level'} eq "document"); # if no sections wanted, only add the docs
+    } # while defined section
+
+}
+
+
+
+
+sub infodb {
+    my $self = shift (@_);
+    my ($doc_obj, $filename) = @_;
+
+    $self->infodbedit($doc_obj,$filename,"add");
+}
+
+sub infodbreindex {
+    my $self = shift (@_);
+    my ($doc_obj, $filename) = @_;
+
+    $self->infodbedit($doc_obj,$filename,"update");
+}
+
+sub infodbdelete {
+    my $self = shift (@_);
+    my ($doc_obj, $filename) = @_;
+
+    $self->infodbedit($doc_obj,$filename,"delete");
+}
+
+
+sub text {
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+    
+    my $handle = $self->{'outhandle'};
+    print $handle "basebuildproc::text function must be implemented in sub classes\n";
+    die "\n";
+}
+
+sub textreindex
+{
+    my $self = shift @_;
+
+    my $outhandle = $self->{'outhandle'};
+    print $outhandle "basebuildproc::textreindex function must be implemented in sub classes\n";
+    if (!$self->is_incremental_capable()) {
+
+	print $outhandle "  This operation is only possible with indexing tools with that support\n";
+	print $outhandle "  incremental building\n";
+    }
+    die "\n";
+}
+
+sub textdelete
+{
+    my $self = shift @_;
+
+    my $outhandle = $self->{'outhandle'};
+    print $outhandle "basebuildproc::textdelete function must be implemented in sub classes\n";
+    if (!$self->is_incremental_capable()) {
+
+	print $outhandle "  This operation is only possible with indexing tools with that support\n";
+	print $outhandle "  incremental building\n";
+    }
+    die "\n";
+}
+
+
+# should the document be indexed - according to the subcollection and language
+# specification.
+sub is_subcollection_doc {
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+    
+    my $indexed_doc = 1;
+    foreach my $indexexp (@{$self->{'indexexparr'}}) {
+	$indexed_doc = 0;
+	my ($field, $exp, $options) = split /\//, $indexexp;
+	if (defined ($field) && defined ($exp)) {
+	    my ($bool) = $field =~ /^(.)/;
+	    $field =~ s/^.// if $bool eq '!';
+	    my @metadata_values;
+	    if ($field =~ /^filename$/i) {
+		push(@metadata_values, $doc_obj->get_source_filename());
+	    }
+	    else {
+		$field =~ s/^ex\.([^.]+)$/$1/; # remove any ex. iff it's the only namespace prefix (will leave ex.dc.* intact)
+		@metadata_values = @{$doc_obj->get_metadata($doc_obj->get_top_section(), $field)};
+	    }
+	    next unless @metadata_values;
+	    foreach my $metadata_value (@metadata_values) {
+		if ($bool eq '!') {
+		    if ($options =~ /^i$/i) {
+			if ($metadata_value !~ /$exp/i) {$indexed_doc = 1; last;}
+		    } else {
+			if ($metadata_value !~ /$exp/) {$indexed_doc = 1; last;}
+		    }
+		} else {
+		    if ($options =~ /^i$/i) {
+			if ($metadata_value =~ /$exp/i) {$indexed_doc = 1; last;}
+		    } else {
+			if ($metadata_value =~ /$exp/) {$indexed_doc = 1; last;}
+		    }
+		}
+	    }
+
+	    last if ($indexed_doc == 1);
+	}
+    }
+    
+    # if this doc is so far in the sub collection, and we have lang info, 
+    # now we check the languages to see if it matches
+    if($indexed_doc && defined $self->{'lang_meta'}) {
+	$indexed_doc = 0;
+	my $field = $doc_obj->get_metadata_element($doc_obj->get_top_section(), $self->{'lang_meta'});
+	if (defined $field) {
+	    foreach my $lang (@{$self->{'langarr'}}) {
+		my ($bool) = $lang =~ /^(.)/;
+		if ($bool eq '!') {
+		    $lang =~ s/^.//;
+		    if ($field !~ /$lang/) {
+			$indexed_doc = 1; last;
+		    }
+		} else {
+		    if ($field =~ /$lang/) {
+			$indexed_doc = 1; last;
+		    }
+		}
+	    }
+	} 
+    }
+    return $indexed_doc;
+    
+}
+
+# use 'Paged' if document has no more than 2 levels
+# and each section at second level has a number for
+# Title metadata
+# also use Paged if gsdlthistype metadata is set to Paged
+sub get_document_type {
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+
+    my $thistype = "VList";
+    my $childtype = "VList";
+    my $title;
+    my @tmp = ();
+    
+    my $section = $doc_obj->get_top_section ();
+    
+    my $gsdlthistype = $doc_obj->get_metadata_element ($section, "gsdlthistype");
+    if (defined $gsdlthistype) {
+	if ($gsdlthistype eq "Paged") {
+	    $childtype = "Paged";
+	    if ($doc_obj->get_text_length ($doc_obj->get_top_section())) {
+		$thistype = "Paged";
+	    } else {
+		$thistype = "Invisible";
+	    }
+	    
+	    return ($thistype, $childtype);
+	} elsif ($gsdlthistype eq "Hierarchy") {
+	    return ($thistype, $childtype); # use VList, VList
+	}
+    }
+    my $first = 1;
+    while (defined $section) {
+	@tmp = split /\./, $section;
+	if (scalar(@tmp) > 1) {
+	    return ($thistype, $childtype);
+	}
+	if (!$first) {
+	    $title = $doc_obj->get_metadata_element ($section, "Title");
+	    if (!defined $title || $title !~ /^\d+$/) {
+		return ($thistype, $childtype);
+	    }
+	}
+	$first = 0;
+	$section = $doc_obj->get_next_section($section);
+    }
+    if ($doc_obj->get_text_length ($doc_obj->get_top_section())) {
+	$thistype = "Paged";
+    } else {
+	$thistype = "Invisible";
+    }
+    $childtype = "Paged";
+    return ($thistype, $childtype);
+}
+
+sub assoc_files 
+{
+    my $self = shift (@_);
+    my ($doc_obj, $archivedir) = @_;
+    my ($afile);
+    
+    foreach my $assoc_file (@{$doc_obj->get_assoc_files()}) {
+      #rint STDERR "Processing associated file - copy " . $assoc_file->[0] . " to " . $assoc_file->[1] . "\n";
+	# if assoc file starts with a slash, we put it relative to the assoc
+	# dir, otherwise it is relative to the HASH... directory
+	if ($assoc_file->[1] =~ m@^[/\\]@) {
+	    $afile = &util::filename_cat($self->{'assocdir'}, $assoc_file->[1]);
+	} else {
+	    $afile = &util::filename_cat($self->{'assocdir'}, $archivedir, $assoc_file->[1]);
+	}
+	&util::hard_link ($assoc_file->[0], $afile, $self->{'verbosity'});
+    }
+}
+
+sub delete_assoc_files 
+{
+    my $self = shift (@_);
+    my ($archivedir, $edit_mode) = @_;
+
+    my $assoc_dir = &util::filename_cat($self->{'assocdir'}, $archivedir);
+    if (-d $assoc_dir) {
+	&util::rm_r($assoc_dir);
+    }
+}
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/buildConfigxml.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/buildConfigxml.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/buildConfigxml.pm	(revision 24799)
@@ -0,0 +1,704 @@
+###########################################################################
+#
+# buildConfigxml.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# reads in buildConfig.xml 
+# Note, only implemented the bits that are currently used, eg by incremental 
+# build code.
+# The resulting data is not a full representation on buildConfig.xml.
+
+package buildConfigxml;
+
+use strict;
+no strict 'refs';
+no strict 'subs';
+
+use XMLParser;
+
+
+# A mapping hash to resolve name discrepancy between gs2 and gs3.
+my $nameMap = {"numDocs" => "numdocs",
+	       "buildType" => "buildtype",
+	       "orthogonalBuildTypes" => "orthogonalbuildtypes"
+	       };
+
+
+# A hash structure which is returned by sub read_cfg_file.
+my $data = {};
+
+# use those unique attribute values to locate the text within the elements
+my $currentLocation = "";
+my $stringexp = q/^(buildType|numDocs)$/;
+my $arrayexp = q/^(orthogonalBuildTypes)$/;
+
+my $indexmap_name = "";
+my $haveindexfields = 0;
+
+# Reads in the model collection configuration file, collectionConfig.xml,
+# into a structure which complies with the one used by gs2 (i.e. one read
+# in by &cfgread::read_cfg_file).
+sub read_cfg_file {
+    my ($filename) = @_;
+    $data = {};
+    if ($filename !~ /buildConfig\.xml$/ || !-f $filename) {
+        return undef;
+    }
+
+    # Removed ProtocolEncoding (see MetadataXMLPlugin for details)
+
+    # create XML::Parser object for parsing metadata.xml files
+    my $parser = new XML::Parser('Style' => 'Stream',
+				 'Pkg' => 'buildConfigxml',
+				 'Handlers' => {'Char' => \&Char,
+						 'Doctype' => \&Doctype
+						 });
+
+    if (!open (COLCFG, $filename)) {
+	print STDERR "buildConfigxml::read_cfg_file couldn't read the cfg file $filename\n";
+    } else {
+
+      $parser->parsefile ($filename);# (COLCFG);
+      close (COLCFG);
+    }
+
+    #&Display; 
+    return $data;
+}
+
+sub StartTag {
+# Those marked with #@ will not be executed at the same time when this sub is being called
+# so that if/elsif is used to avoid unnecessary tests
+    my ($expat, $element) = @_;
+    
+    my $name = $_{'name'};
+    my $shortname = $_{'shortname'};
+
+    
+    #@ handling block metadataList
+    if (defined $name && (($name =~ m/$stringexp/) || ($name =~ m/$arrayexp/))) {
+      $currentLocation = $name;
+      # the value will be retrieved later in Text sub
+    }
+
+    #@ handle indexes - store indexmap (mg) or indexfields and indexfieldmap (mgpp/lucene)
+    elsif ($element =~ /^indexList$/) {
+	# set up the data arrays
+	# this assumes that the build type has been read already, which is
+	# currently the order we save the file in.
+	if ($data->{'buildtype'} eq "mg") {
+	    $indexmap_name = "indexmap";
+	    if (!defined $data->{"indexmap"}) {
+		$data->{"indexmap"} = [];
+	    }
+	}
+	else {
+	    # mgpp or lucene
+	    $indexmap_name = "indexfieldmap";
+	    $haveindexfields = 1;
+	    if (!defined $data->{"indexfieldmap"}) {
+		$data->{"indexfieldmap"} = [];
+	    }
+	    if (!defined $data->{"indexfields"}) {
+		$data->{"indexfields"} = [];
+	    }
+
+	}
+	
+    }
+    
+    elsif ($element =~ /index/) {
+	# store each index in the map
+	if (defined $name && defined $shortname) {
+	    push @{$data->{$indexmap_name}}, "$name->$shortname";
+	    if ($haveindexfields) {
+		push @{$data->{'indexfields'}}, $name;
+	    }
+	}
+    }
+
+
+}
+
+sub EndTag {
+    my ($expat, $element) = @_;
+}
+
+sub Text {
+    if (defined $currentLocation) { 
+	#@ Handling block metadataList(numDocs, buildType)
+	if ($currentLocation =~ /$stringexp/) {
+	    #print $currentLocation;
+	    my $key = $nameMap->{$currentLocation};	
+	    $data->{$key} = $_;
+	    undef $currentLocation;
+	}	
+	elsif ($currentLocation =~ /$arrayexp/) {
+	    #print $currentLocation;
+	    my $key = $nameMap->{$currentLocation};	
+	    push(@{$data->{$key}},$_);
+	    undef $currentLocation;
+	}	
+
+    }	
+}
+
+# This sub is for debugging purposes
+sub Display {
+
+    print "NumDocs = ".$data->{'numdocs'}."\n" if (defined $data->{'numdocs'});
+    print "BuildType = ".$data->{'buildtype'}."\n" if (defined $data->{'buildtype'});
+    print "OrthogonalBuildTypes = ".join(",",@{$data->{'orthogonalbuildtypes'}})."\n" if (defined $data->{'orthogonalbuildtypes'});
+    print  "IndexMap = ". join(" ",@{$data->{'indexmap'}})."\n" if (defined $data->{'indexmap'});
+    print  "IndexFieldMap = ". join(" ",@{$data->{'indexfieldmap'}})."\n" if (defined $data->{'indexfieldmap'});
+    print  "IndexFields = ". join(" ",@{$data->{'indexfields'}})."\n" if (defined $data->{'indexfields'});
+
+}
+
+# is this actually used??
+sub Doctype {
+    my ($expat, $name, $sysid, $pubid, $internal) = @_;
+
+    die if ($name !~ /^buildConfig$/);
+}
+
+# This Char function overrides the one in XML::Parser::Stream to overcome a
+# problem where $expat->{Text} is treated as the return value, slowing
+# things down significantly in some cases.
+sub Char {
+    if ($]<5.008) {
+	use bytes;  # Necessary to prevent encoding issues with XML::Parser 2.31+ and Perl 5.6
+    }
+    $_[0]->{'Text'} .= $_[1];
+    return undef;
+}
+
+
+
+sub write_line {
+    my ($filehandle, $line) = @_;
+    print $filehandle join ("", @$line), "\n";
+}
+
+sub search_and_retrieve_settings
+{
+    my ($buildcfg,$collectcfg) = @_;
+
+    my $settings = {};
+
+    if (defined $buildcfg->{"buildtype"}) {
+	$settings->{'buildtype'} = $buildcfg->{"buildtype"};
+    } else {
+	$settings->{'buildtype'} = "mgpp";
+    }
+    my $buildtype = $settings->{'buildtype'};
+
+    if (defined $collectcfg->{"orthogonalbuildtypes"}) {
+	# Note the use of collectcfg, not bulidcfg
+	$settings->{'orthogonalbuildtypes'} = $collectcfg->{"orthogonalbuildtypes"};
+    } else {
+	$settings->{'orthogonalbuildtypes '}= [];
+    }
+
+    if (defined $buildcfg->{"numdocs"}) {
+	$settings->{'numdocs'} = $buildcfg->{"numdocs"};
+    }
+    else {
+	$settings->{'numdocs'} = 0;
+    }
+
+    my $service_type = "MGPP";
+    if ($buildtype eq "mg") {
+	$service_type = "MG";
+    } elsif ($buildtype eq "lucene") {
+	$service_type = "Lucene";
+    }
+    $settings->{'service_type'} = $service_type;
+
+
+    if (defined $buildcfg->{"infodbtype"}) {
+	$settings->{'infodbtype'} = $buildcfg->{'infodbtype'};
+    }
+    else {
+	$settings->{'infodbtype'} = "gdbm";
+    }
+
+
+    #--
+    # indexes
+    #--
+    
+    my $indexmap = {};  # maps index name to shortname
+    my $indexlist = []; # keeps the order for indexes
+    my $defaultindex = "";
+    my $maptype = ($buildtype eq "mg")  ? "indexmap" : "indexfieldmap";
+
+    if (defined $buildcfg->{$maptype}) {
+	my $first = 1;
+	my $indexmap_t = $buildcfg->{$maptype};
+	foreach my $i (@$indexmap_t) {
+	    my ($k, $v) = $i =~ /^(.*)\-\>(.*)$/;
+	    $indexmap->{$k} = $v;
+	    push @$indexlist, $k;
+	    if ($first) {
+		$defaultindex = $v;
+		$first = 0;
+	    }
+	}
+       # now if the user has assigned a default index, we use it
+	if (defined $collectcfg->{"defaultindex"}) {
+	    $defaultindex = $indexmap->{$collectcfg->{"defaultindex"}};
+	}
+    } else {
+	print STDERR "$maptype not defined";
+    }
+
+    $settings->{'defaultindex'} = $defaultindex;
+    $settings->{'indexmap'} = $indexmap;
+    $settings->{'indexlist'} = $indexlist;
+
+    #--
+    # default lang
+    #--
+    $settings->{'default_lang'} = "";
+    $settings->{'default_lang_short'} = "";
+
+    if (defined $buildcfg->{"languagemap"}) {
+      my $langmap_t = $buildcfg->{"languagemap"};
+      if ((defined $langmap_t) && (scalar(@$langmap_t)>=1)) {
+	  my $l = $langmap_t->[0];
+	  my ($k, $v) = $l =~ m/^(.*)\-\>(.*)$/; 
+	  $settings->{'default_lang'} = $k; #name
+	  $settings->{'default_lang_short'} = $v; #short name
+      }
+
+      # now if the user has assigned a default language (as "en", "ru" etc.)
+      if (defined $collectcfg->{"defaultlanguage"}) {
+	$settings->{'default_lang'} = $collectcfg->{"defaultlanguage"};
+	# what about default_lang_short ?? ####
+      }
+    }
+
+    # default subcol
+    $settings->{'default_subcol'} = "";
+    if (defined $buildcfg->{'subcollectionmap'}) {
+	my $subcolmap_t = $buildcfg->{'subcollectionmap'};
+	if ((defined $subcolmap_t) && (scalar(@$subcolmap_t)>=1)) {
+	    my $l = $subcolmap_t->[0];
+	    my ($k, $v) = $l =~ m/^(.*)\-\>(.*)$/;
+
+	    $settings->{'default_subcol'} = $v;
+	}
+    }
+
+
+    #--
+    # indexstem
+    #--
+    if (defined $buildcfg->{'indexstem'}) {
+	$settings->{'indexstem'} = $buildcfg->{'indexstem'};
+    }
+
+    #--
+    # levelList
+    #--
+
+    my $levelmap = {};
+    my $levellist = [];
+    my $default_search_level = "Doc";
+    my $default_retrieve_level = "Doc";
+    my $default_db_level = "Doc";
+
+    if ($buildtype eq "mgpp" || $buildtype eq "lucene") {
+	if (defined $buildcfg->{'levelmap'}) {
+	    my $first = 1;
+
+	    my $levelmap_t = $buildcfg->{'levelmap'};
+	    foreach my $l (@$levelmap_t) {
+		my ($key, $val) = $l =~ /^(.*)\-\>(.*)$/;
+		$levelmap->{$key} = $val;
+		push @$levellist, $key;
+		if ($first) {
+		    # let default search level follow the first level in the level list
+		    $default_search_level = $val;
+		    # retrieve/database levels may get modified later if text level is defined
+		    $default_retrieve_level = $val;
+		    $default_db_level = $val;
+		    $first = 0;
+		}
+	    }
+	}
+	# the default level assigned by the user is no longer ignored [Shaoqun], but the retrievel level stays the same. 
+       	#if (defined $collectcfg->{"defaultlevel"}) {
+	$default_search_level = $levelmap->{$collectcfg->{"defaultlevel"}};
+        #  $default_retrieve_level = $default_search_level;
+	#}
+	
+	if (defined $buildcfg->{'textlevel'}) {
+	   # let the retrieve/database levels always follow the textlevel
+           $default_retrieve_level = $buildcfg->{'textlevel'};
+	   $default_db_level = $buildcfg->{'textlevel'};
+		 
+	}
+    }
+    $settings->{'levelmap'} = $levelmap;
+    $settings->{'levellist'} = $levellist;
+    $settings->{'default_search_level'} = $default_search_level;
+    $settings->{'default_retrieve_level'} = $default_retrieve_level;
+    $settings->{'default_db_level'} = $default_db_level;
+
+    
+    return $settings;
+}
+
+
+sub write_search_servicerack
+{
+    my ($buildcfg,$settings) = @_;
+
+    my $buildtype    = $settings->{'buildtype'};
+    my $infodbtype   = $settings->{'infodbtype'};
+    my $service_type = $settings->{'service_type'};
+
+    # do the search service 
+    &write_line('COLCFG', ["<serviceRack name=\"GS2", $service_type, "Search\">"]);
+    if (defined $buildcfg->{'indexstem'}) {
+      my $indexstem = $buildcfg->{'indexstem'};
+      &write_line('COLCFG', ["<indexStem name=\"", $indexstem, "\" />"]);     
+    }
+    if (defined $buildcfg->{'infodbtype'}) {
+        &write_line('COLCFG', ["<databaseType name=\"", $infodbtype, "\" />"]);     
+    }
+
+    #indexes
+    my $indexmap = $settings->{'indexmap'};
+    my $indexlist = $settings->{'indexlist'};
+    my $defaultindex = $settings->{'defaultindex'};
+
+    #for each index in indexList, write them out
+    &write_line('COLCFG', ["<indexList>"]);
+    foreach my $i (@$indexlist) {
+	my $index = $indexmap->{$i};
+	&write_line('COLCFG', ["<index name=\"", $i, "\" ", "shortname=\"", $index, "\" />"]);
+    }	
+    &write_line('COLCFG', ["</indexList>"]);
+
+    
+    #$defaultindex = "ZZ" if (!$defaultindex); # index allfields by default
+    if ($defaultindex) {
+	&write_line('COLCFG', ["<defaultIndex shortname=\"", $defaultindex, "\" />"]);
+    }
+
+
+    # do indexOptionList
+    if ($buildtype eq "mg" || $buildtype eq "mgpp") {
+        &write_line('COLCFG', ["<indexOptionList>"]);
+	my $stemindexes = 3; # default is stem and casefold
+	if (defined $buildcfg->{'stemindexes'} && $buildcfg->{'stemindexes'} =~ /^\d+$/ ) {
+	    $stemindexes = $buildcfg->{'stemindexes'};
+	}
+	&write_line('COLCFG', ["<indexOption name=\"stemIndexes\" value=\"", $stemindexes, "\" />"]);
+	
+	my $maxnumeric = 4; # default
+	if (defined $buildcfg->{'maxnumeric'} && $buildcfg->{'maxnumeric'} =~ /^\d+$/) {
+	    $maxnumeric = $buildcfg->{'maxnumeric'};
+	}
+	&write_line('COLCFG', ["<indexOption name=\"maxnumeric\" value=\"", $maxnumeric, "\" />"]);
+        &write_line('COLCFG', ["</indexOptionList>"]);
+    }
+
+    #--
+    # levelList
+    #--
+    my $levelmap = $settings->{'levelmap'};
+    my $levellist = $settings->{'levellist'};
+    my $default_search_level = $settings->{'default_search_level'};
+    my $default_retrieve_level = $settings->{'default_retrieve_level'};
+    my $default_db_level = $settings->{'default_db_level'};
+
+    #for each level in levelList, write them out
+    if ($buildtype ne "mg") {
+	&write_line('COLCFG', ["<levelList>"]);
+	foreach my $lv (@$levellist) {
+	    my $level = $levelmap->{$lv};
+	    &write_line('COLCFG', ["<level name=\"", $lv, "\" shortname=\"", $level, "\" />"]);
+	}	
+	&write_line('COLCFG', ["</levelList>"]);
+    }
+    # add in defaultLevel as the same level as indexLevelList, making the reading job easier
+    if ($buildtype eq "lucene" || $buildtype eq "mgpp") {
+	&write_line('COLCFG', ["<defaultLevel shortname=\"", $default_search_level, "\" />"]);
+    }
+    if ($buildtype eq "lucene" || $buildtype eq "mgpp") {
+        &write_line('COLCFG', ["<defaultDBLevel shortname=\"", $default_db_level, "\" />"]);
+    }
+    # do searchTypeList
+    if ($buildtype eq "mgpp" || $buildtype eq "lucene") {
+	  &write_line('COLCFG', ["<searchTypeList>"]);
+      
+      if (defined $buildcfg->{"searchtype"}) {
+	  my $searchtype_t = $buildcfg->{"searchtype"};
+	  foreach my $s (@$searchtype_t) {
+	  &write_line('COLCFG', ["<searchType name=\"", $s, "\" />"]);
+	}
+      } else {
+	  &write_line('COLCFG', ["<searchType name=\"plain\" />"]);
+	  &write_line('COLCFG', ["<searchType name=\"form\" />"]);
+      }
+	  &write_line('COLCFG', ["</searchTypeList>"]);
+    }
+
+    # do indexLanguageList [in collect.cfg: languages; in build.cfg: languagemap]
+    my $default_lang = $settings->{'default_lang'};
+    my $default_lang_short = $settings->{'default_lang_short'};
+    if (defined $buildcfg->{"languagemap"}) {
+      &write_line('COLCFG', ["<indexLanguageList>"]);
+
+      my $langmap_t = $buildcfg->{"languagemap"};
+      foreach my $l (@$langmap_t) {
+	my ($k, $v) = $l =~ /^(.*)\-\>(.*)$/; 
+
+	&write_line('COLCFG', ["<indexLanguage name=\"", $k, "\" shortname=\"", $v, "\" />"]);
+      }
+
+      &write_line('COLCFG', ["</indexLanguageList>"]);
+
+      &write_line('COLCFG', ["<defaultIndexLanguage name=\"", $default_lang, "\" shortname=\"", $default_lang_short, "\" />"]);
+    }
+
+    # do indexSubcollectionList
+    my $default_subcol = $settings->{'default_subcol'};
+
+    if (defined $buildcfg->{'subcollectionmap'}) {
+      &write_line('COLCFG', ["<indexSubcollectionList>"]);
+      my $subcolmap = {};
+      my @subcollist = ();
+
+      my $subcolmap_t = $buildcfg->{'subcollectionmap'};
+      foreach my $l (@$subcolmap_t) {
+	my ($k, $v) = $l =~ /^(.*)\-\>(.*)$/;
+	$subcolmap->{$k} = $v;
+	push @subcollist, $k;
+      }
+
+      foreach my $sl (@subcollist) {
+	my $subcol = $subcolmap->{$sl};
+	&write_line('COLCFG', ["<indexSubcollection name=\"", $sl, "\" shortname=\"", $subcol, "\" />"]);
+      }	
+
+      &write_line('COLCFG', ["</indexSubcollectionList>"]);
+      &write_line('COLCFG', ["<defaultIndexSubcollection shortname=\"", $default_subcol, "\" />"]);
+    }
+      
+    # close off search service 
+    &write_line('COLCFG', ["</serviceRack>"]);
+
+}
+
+
+sub write_orthogonalsearch_serviceracks
+{
+    my ($buildcfg,$settings) = @_;
+
+    my $infodbtype   = $settings->{'infodbtype'};
+
+    my $orthogonalbuildtypes = $settings->{'orthogonalbuildtypes'};
+
+    foreach my $obt (@$orthogonalbuildtypes) {
+	$obt =~ s/^(.)/\u$1/; # capitialize initial letter
+	$obt =~ s/-(.)/\u$1/g; # change any hyphenated words to cap next letter
+
+	&write_line('COLCFG', ["<serviceRack name=\"GS2", $obt, "Search\">"]);
+
+	&write_line('COLCFG',["<databaseType name=\"",$infodbtype,"\" />"]);  
+	&write_line('COLCFG', ["</serviceRack>"]);
+    }
+}
+
+
+
+sub write_retrieve_servicerack
+{
+    my ($buildcfg,$settings) = @_;
+
+    my $buildtype      = $settings->{'buildtype'};
+    my $infodbtype     = $settings->{'infodbtype'};
+    
+    my $service_type   = $settings->{'service_type'};
+
+    # do the retrieve service
+    &write_line('COLCFG', ["<serviceRack name=\"GS2", $service_type, "Retrieve\">"]);
+
+    # do default index 
+    if (defined $buildcfg->{"languagemap"}) {
+	my $default_lang   = $settings->{'default_lang'};
+	&write_line('COLCFG', ["<defaultIndexLanguage shortname=\"", $default_lang, "\" />"]);
+    }
+    if (defined $buildcfg->{'subcollectionmap'}) {
+	my $default_subcol = $settings->{'default_subcol'};
+	&write_line('COLCFG', ["<defaultIndexSubcollection shortname=\"", $default_subcol, "\" />"]);
+    }
+    if ($buildtype eq "mg") {
+	my $defaultindex   = $settings->{'defaultindex'};
+      &write_line('COLCFG', ["<defaultIndex shortname=\"", $defaultindex, "\" />"]);
+    }
+
+    if (defined $buildcfg->{'indexstem'}) {
+      my $indexstem = $buildcfg->{'indexstem'};
+      &write_line('COLCFG', ["<indexStem name=\"", $indexstem, "\" />"]);     
+    }
+    if ($buildtype eq "mgpp" || $buildtype eq "lucene") {
+	my $default_retrieve_level = $settings->{'default_retrieve_level'};
+      &write_line('COLCFG', ["<defaultLevel shortname=\"", $default_retrieve_level, "\" />"]);
+    }
+    if (defined $buildcfg->{'infodbtype'}) {
+        &write_line('COLCFG', ["<databaseType name=\"", $infodbtype, "\" />"]);     
+    }
+
+    &write_line('COLCFG', ["</serviceRack>"]);
+
+}
+
+
+# Create the buildConfig.xml file for a specific collection
+sub write_cfg_file {
+    # this sub is called in make_auxiliary_files() in basebuilder.pm
+    # the received args: $buildoutfile - destination file: buildConfig.xml
+    #                    $buildcfg - all build options, 
+    #                    $collectcfg - contents of collectionConfig.xml read in by read_cfg_file sub in buildConfigxml.pm.
+    my ($buildoutfile, $buildcfg, $collectcfg) = @_;
+    my $line = [];
+
+    if (!open (COLCFG, ">$buildoutfile")) {
+	print STDERR "buildConfigxml::write_cfg_file couldn't write the build config file $buildoutfile\n";
+	die;
+    }
+
+    my $settings = search_and_retrieve_settings($buildcfg,$collectcfg);
+
+    my $buildtype = $settings->{'buildtype'};
+    my $orthogonalbuildtypes = $settings->{'orthogonalbuildtypes'};
+    my $numdocs = $settings->{'numdocs'};
+
+    &write_line('COLCFG', ["<buildConfig xmlns:gsf=\"http://www.greenstone.org/greenstone3/schema/ConfigFormat\">"]);  
+
+    # output building metadata to build config file 
+    &write_line('COLCFG', ["<metadataList>"]);
+    &write_line('COLCFG', ["<metadata name=\"numDocs\">", $numdocs, "</metadata>"]);
+    &write_line('COLCFG', ["<metadata name=\"buildType\">", $buildtype, "</metadata>"]);
+    foreach my $obt (@$orthogonalbuildtypes) {
+	&write_line('COLCFG', ["<metadata name=\"orthogonalBuildTypes\">", $obt, "</metadata>"]);
+    }
+
+    if (defined $buildcfg->{'indexstem'}) {
+	&write_line('COLCFG', ["<metadata name=\"indexStem\">", $buildcfg->{"indexstem"}, "</metadata>"]);
+    }
+    if (defined $buildcfg->{'infodbtype'}) {
+	&write_line('COLCFG', ["<metadata name=\"infodbType\">", $buildcfg->{"infodbtype"}, "</metadata>"]);
+    }
+    if (defined $buildcfg->{'earliestdatestamp'}) {
+	&write_line('COLCFG', ["<metadata name=\"earliestdatestamp\">", $buildcfg->{"earliestdatestamp"}, "</metadata>"]);
+    }
+
+    &write_line('COLCFG', ["</metadataList>"]);
+
+    # output serviceRackList
+    &write_line('COLCFG', ["<serviceRackList>"]);
+
+    write_search_servicerack($buildcfg,$settings);
+
+    # add in orthogonalbuildtypes
+    write_orthogonalsearch_serviceracks($buildcfg,$settings);
+
+    write_retrieve_servicerack($buildcfg,$settings);
+
+    # do the browse service
+    my $count = 1;
+    my $phind = 0;
+    my $started_classifiers = 0;
+
+    my $classifiers = $collectcfg->{"classify"};
+    foreach my $cl (@$classifiers) {
+      my $name = "CL$count";
+      $count++;
+      my ($classname) = @$cl[0];
+      if ($classname =~ /^phind$/i) {
+	$phind=1;
+	#should add it into coll config classifiers
+	next;
+      }
+      
+      if (not $started_classifiers) {
+	&write_line('COLCFG', ["<serviceRack name=\"GS2Browse\">"]);
+	if (defined $buildcfg->{'indexstem'}) {
+	  my $indexstem = $buildcfg->{'indexstem'};
+	  &write_line('COLCFG', ["<indexStem name=\"", $indexstem, "\" />"]);     
+	}
+	if (defined $buildcfg->{'infodbtype'}) {
+	    my $infodbtype = $buildcfg->{'infodbtype'};
+	    &write_line('COLCFG', ["<databaseType name=\"", $infodbtype, "\" />"]);     
+	}
+	&write_line('COLCFG', ["<classifierList>"]);		
+	$started_classifiers = 1;
+      }
+      my $content = ''; #use buttonname first, then metadata
+      if ($classname eq "DateList") {
+	$content = "Date";
+      } else {
+	for (my $j=0; $j<scalar(@$cl); $j++) {
+	  my $arg = @$cl[$j];
+	  if ($arg eq "-buttonname"){
+	    $content = @$cl[$j+1];
+	    last;
+	  } elsif ($arg eq "-metadata") {
+	    $content = @$cl[$j+1];
+	  }
+	  
+	}
+      }
+      &write_line('COLCFG', ["<classifier name=\"", $name, "\" content=\"", $content, "\" />"]);
+    }     
+    if ($started_classifiers) {
+      # end the classifiers
+      &write_line('COLCFG', ["</classifierList>"]);
+      # close off the Browse service
+      &write_line('COLCFG', ["</serviceRack>"]);
+    }
+    
+    # the phind classifier is a separate service
+    if ($phind) {
+	# if phind classifier
+	&write_line('COLCFG', ["<serviceRack name=\"PhindPhraseBrowse\" />"]);
+    }
+
+    
+    &write_line('COLCFG', ["</serviceRackList>"]);
+    &write_line('COLCFG', ["</buildConfig>"]);
+
+    close (COLCFG);
+  }
+
+
+#########################################################
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cfgread.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cfgread.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cfgread.pm	(revision 24799)
@@ -0,0 +1,241 @@
+###########################################################################
+#
+# cfgread.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# reads in configuration files
+
+package cfgread;
+
+use strict; no strict 'refs';
+
+
+sub read_cfg_line {
+    my ($handle) = @_;
+    my $line = "";
+    my @line = ();
+    my $linecontinues = 0;
+
+    while (defined($line = <$handle>)) {
+	$line =~ s/^\#.*$//;   # remove comments
+	$line =~ s/\cM|\cJ//g; # remove end-of-line characters
+	$line =~ s/^\s+//;     # remove initial white space
+	# Merge with following line if a quoted phrase is left un-closed.
+	if ($line =~ m/^([\"\'])/ || $line =~ m/[^\\]([\"\'])/) {
+	    my $quote=$1;
+
+	    # Improve speed substantially by not doing the regular expression on $line in the while loop
+	    #   (since $line gets longer each iteration, the regular expression gets slower and slower)
+	    # Instead we just check each new line to see if it finishes the quoted multi-line value
+	    if ($line !~ m/$quote(.*?[^\\])?(\\\\)*$quote/)
+	    {
+		my $nextline;
+		while (defined($nextline = <$handle>))
+		{
+		    $nextline =~ s/\r?\n//; # remove end-of-line
+		    $line .= " " . $nextline;
+
+		    # Break out of the while loop if we've found the end of the multi-line value
+		    last if ($nextline =~ m/^(.*?[^\\])?(\\\\)*$quote/);
+		}
+	    }
+	}
+	$linecontinues = $line =~ s/\\$//;
+
+	while ($line =~ s/\s*(\".*?[^\\](\\\\)*\"|\'.*?[^\\](\\\\)*\'|\S+)\s*//) {
+	    if (defined $1) {
+		# remove any enclosing quotes
+		my $entry = $1;
+		$entry =~ s/^([\"\'])(.*)\1$/$2/;
+
+		# substitute an environment variables
+##		$entry =~ s/\$(\w+)/$ENV{$1}/g;
+		$entry =~ s/\$\{(\w+)\}/$ENV{$1}/g;
+		push (@line, $entry);
+	    } else {
+		push (@line, "");
+	    }
+	}
+
+	if (scalar(@line) > 0 && !$linecontinues) {
+#	    print STDERR "line: \"" . join ("\" \"", @line) . "\"\n";
+	    return \@line;
+	}
+    }
+
+    return undef;
+}
+
+sub write_cfg_line {
+    my ($handle, $line) = @_;
+    print $handle join ("\t", @$line), "\n";
+}
+
+
+# stringexp, arrayexp, hashexp,arrayarrayexp and hashhashexp
+# should be something like '^(this|that)$'
+sub read_cfg_file {
+    my ($filename, $stringexp, $arrayexp, $hashexp, $arrayarrayexp,
+	$hashhashexp) = @_;
+    my ($line);
+    my $data = {};
+
+    if (open (COLCFG, $filename)) {
+	while (defined ($line = &read_cfg_line('COLCFG'))) {
+	    if (scalar(@$line) >= 2) {
+		my $key = shift (@$line);
+		if (defined $stringexp && $key =~ /$stringexp/) {
+		    $data->{$key} = shift (@$line);
+
+		} elsif (defined $arrayexp && $key =~ /$arrayexp/) {
+		    push (@{$data->{$key}}, @$line);
+
+		} elsif (defined $hashexp && $key =~ /$hashexp/) {
+		    my $k = shift @$line;
+		    my $v = shift @$line;
+		    $data->{$key}->{$k} = $v;
+		} elsif (defined $arrayarrayexp && $key =~ /$arrayarrayexp/) {
+		    if (!defined $data->{$key}) {
+			$data->{$key} = [];
+		    }
+		    push (@{$data->{$key}}, $line);
+		}
+		elsif (defined $hashhashexp && $key =~ /$hashhashexp/) {
+		    my $k = shift @$line;
+		    my $p = shift @$line;
+		    my $v = shift @$line;
+		    if (!defined $v) {
+			$v = $p;
+			$p = 'default';
+		    }
+		    $data->{$key}->{$k}->{$p} = $v;
+		}
+	    }
+	}
+	close (COLCFG);
+
+    } else {
+	print STDERR "cfgread::read_cfg_file couldn't read the cfg file $filename\n";
+    }
+
+    return $data;
+}
+
+# If the cfg file contains unicode characters, use this method to read from it
+# Used by HFileHierarchy classifier, since an HFile is read as a cfg file, but 
+# can contain unicode characters.
+sub read_cfg_file_unicode {
+    my ($filename, $stringexp, $arrayexp, $hashexp, $arrayarrayexp,
+	$hashhashexp) = @_;
+    my ($line);
+    my $data = {};
+
+    if (open (COLCFG, $filename)) {
+	binmode(COLCFG,":utf8");
+	while (defined ($line = &read_cfg_line('COLCFG'))) {
+	    if (scalar(@$line) >= 2) {
+
+		#map { decode("utf8",$_) } @$line; #use Encode;
+
+		my $key = shift (@$line);
+		if (defined $stringexp && $key =~ /$stringexp/) {
+		    $data->{$key} = shift (@$line);
+
+		} elsif (defined $arrayexp && $key =~ /$arrayexp/) {
+		    push (@{$data->{$key}}, @$line);
+
+		} elsif (defined $hashexp && $key =~ /$hashexp/) {
+		    my $k = shift @$line;
+		    my $v = shift @$line;
+		    $data->{$key}->{$k} = $v;
+		} elsif (defined $arrayarrayexp && $key =~ /$arrayarrayexp/) {
+		    if (!defined $data->{$key}) {
+			$data->{$key} = [];
+		    }
+		    push (@{$data->{$key}}, $line);
+		}
+		elsif (defined $hashhashexp && $key =~ /$hashhashexp/) {
+		    my $k = shift @$line;
+		    my $p = shift @$line;
+		    my $v = shift @$line;
+		    if (!defined $v) {
+			$v = $p;
+			$p = 'default';
+		    }
+		    $data->{$key}->{$k}->{$p} = $v;
+		}
+	    }
+	}
+	close (COLCFG);
+
+    } else {
+	print STDERR "cfgread::read_cfg_file_unicode couldn't read the cfg file $filename\n";
+    }
+
+    return $data;
+}
+
+
+# stringexp, arrayexp, hashexp and arrayarrayexp 
+# should be something like '^(this|that)$'
+sub write_cfg_file {
+    my ($filename, $data, $stringexp, $arrayexp, $hashexp, $arrayarrayexp,
+	$hashhashexp) = @_;
+
+    if (open (COLCFG, ">$filename")) {
+	foreach my $key (sort(keys(%$data))) {
+	    if ($key =~ /$stringexp/) {
+		&write_cfg_line ('COLCFG', [$key, $data->{$key}]);
+	    } elsif ($key =~ /$arrayexp/) {
+		&write_cfg_line ('COLCFG', [$key, @{$data->{$key}}]);
+	    } elsif ($key =~ /$hashexp/) {
+		foreach my $k (keys (%{$data->{$key}})) {
+		    &write_cfg_line ('COLCFG', [$key, $k, $data->{$key}->{$k}]);
+		}
+	    } elsif ($key =~ /$arrayarrayexp/) {
+		foreach my $k (@{$data->{$key}}) {
+		    &write_cfg_line ('COLCFG', [$key, @$k]);
+		}
+	    } elsif ($key =~ /$hashhashexp/) {
+		foreach my $k (keys (%{$data->{$key}})) {
+		    foreach my $p (keys (%{$data->{$key}->{$k}})) {
+			if ($p =~ /default/) {
+			    &write_cfg_line ('COLCFG', 
+					     [$key, $k, $data->{$key}->{$k}]);
+			}
+			else {
+			    &write_cfg_line ('COLCFG', 
+			       [$key, $k, $p, $data->{$key}->{$k}->{$p}]);
+			}
+		    }
+		}
+	    }
+	}
+	close (COLCFG);
+    } else {
+	print STDERR "cfgread::write_cfg_file couldn't write the cfg file $filename\n";
+    }
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cgiactions/baseaction.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cgiactions/baseaction.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cgiactions/baseaction.pm	(revision 24799)
@@ -0,0 +1,496 @@
+###########################################################################
+#
+# baseaction.pm -- 
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2009 New Zealand Digital Library Project
+#
+# This program is free software; you can redistr   te it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+
+package baseaction;
+
+use strict;
+use util;
+use inexport;
+
+our $authenication_enabled = 0;
+our $mail_enabled = 0;
+
+
+# change this to get these values from a config file
+my $mail_to_address = "user\@server";  # Set this appropriately
+my $mail_from_address = "user\@server";  # Set this appropriately
+my $mail_smtp_server = "smtp.server";  # Set this appropriately
+
+
+
+# Required CGI arguments: "a" for action
+#                         "c" for collection
+# Optional CGI arguemnts: "ts" for timestamp (auto generated is missing)
+#                         "site" (used by Greenstone3)
+
+# allow "un" for username to be optional for now
+
+sub new 
+{
+    my $class = shift (@_);
+    my ($action_table,$gsdl_cgi,$iis6_mode) = @_;
+
+    my $self = { 'gsdl_cgi' => $gsdl_cgi, 
+		 'iis6_mode' => $iis6_mode,
+		 'gsdlhome' => $ENV{'GSDLHOME'} };
+
+    # Retrieve the (required) command CGI argument
+    my $action = $gsdl_cgi->clean_param("a");
+
+    if (!defined $action) {
+	my $err_mess = "No action (a=...) specified.\n";
+	$err_mess .= "\nPossible actions are:\n";
+
+	$err_mess .= "  check-installation\n\n";
+
+	foreach my $a (keys %$action_table) {
+	    $err_mess .= "  $a:\n";
+	    $err_mess .= "    Compulsory args: ";
+	    my @comp_args = ("c");
+	    push(@comp_args,"un") if ($authenication_enabled);
+	    push(@comp_args,@{$action_table->{$a}->{'compulsory-args'}});
+	    $err_mess .= join(", ", @comp_args);
+
+	    $err_mess .= "\n";
+
+	    my @opt_args = ();
+	    push(@opt_args,"un") if (!$authenication_enabled);
+	    push(@opt_args,@{$action_table->{$a}->{'optional-args'}});
+
+	    if (scalar(@opt_args)>0) {
+
+		$err_mess .= "    Optional args  : ";
+		$err_mess .= join(", ", @opt_args);
+		$err_mess .= "\n";
+	    }
+	    $err_mess .= "\n";
+	}
+
+	$gsdl_cgi->generate_message($err_mess);
+	exit(-1);
+	    
+    }
+    $gsdl_cgi->delete("a");
+
+	$self = bless $self, $class;
+
+    # The check-installation command has no arguments
+    if ($action eq "check-installation") {
+	$self->check_installation($gsdl_cgi,$iis6_mode);
+	exit 0;
+    }
+
+	
+    if (!defined $action_table->{$action}) {
+	my $valid_actions = join(", ", keys %$action_table);
+
+	my $err_mess = "Unrecognised action (a=$action) specified.\n";
+	$err_mess .= "Valid actions are: $valid_actions\n";
+
+	$gsdl_cgi->generate_error($err_mess);		
+    }
+
+    
+    my $collect = $gsdl_cgi->clean_param("c");
+    if ((!defined $collect) || ($collect =~ m/^\s*$/)) {
+	$gsdl_cgi->generate_error("No collection specified.");
+    }
+    $gsdl_cgi->delete("c");
+
+    # allow un to be optional for now
+    my $username = $gsdl_cgi->clean_param("un");
+
+
+    # Get then remove the ts (timestamp) argument (since this can mess up 
+    #  other scripts)
+    my $timestamp = $gsdl_cgi->clean_param("ts");
+    if ((!defined $timestamp) || ($timestamp =~ m/^\s*$/)) {
+	# Fall back to using the Perl time() function to generate a timestamp
+	$timestamp = time();  
+    }
+    $gsdl_cgi->delete("ts");
+
+    my $site = undef; 
+    if($gsdl_cgi->greenstone_version() != 2) { 
+	# all GS versions after 2 may define site
+	$site = $gsdl_cgi->clean_param("site");   
+	if (!defined $site) {
+	    $gsdl_cgi->generate_error("No site specified.");
+	}
+	$gsdl_cgi->delete("site");
+    }
+    
+
+    $self->{'action'} = $action;
+    $self->{'collect'} = $collect;
+    $self->{'username'} = $username;
+    $self->{'timestamp'} = $timestamp;
+    $self->{'site'} = $site;
+	  
+    # Locate and store compulsory arguments
+    my $comp_args = $action_table->{$action}->{'compulsory-args'};
+    foreach my $ca (@$comp_args) {
+	if (!defined $gsdl_cgi->param($ca)) {
+	    $gsdl_cgi->generate_error("Compulsory argument '$ca' missing");
+	}
+	else {
+	    $self->{$ca} = $gsdl_cgi->clean_param($ca);
+	    $gsdl_cgi->delete($ca);
+	}
+    }
+
+    # Locate and store optional args if present
+    my $opt_args = $action_table->{$action}->{'optional-args'};
+    foreach my $oa (@$opt_args) {
+	if (defined $gsdl_cgi->param($oa)) {
+	    $self->{$oa} = $gsdl_cgi->clean_param($oa);
+	    $gsdl_cgi->delete($oa);
+	}
+    }
+
+	
+	
+    # Retrieve infodb-type
+    if (defined $collect) {
+	
+	my $opt_site = $self->{'site'} || "";
+	
+	my $inexport = newCGI inexport(ref $self,$collect,$gsdl_cgi,$opt_site);
+	my ($config_filename,$collect_cfg) = $inexport->read_collection_cfg($collect);   
+	$self->{'infodbtype'} = $collect_cfg->{'infodbtype'};
+
+    }
+    
+	
+    return $self;
+}
+
+
+sub do_action
+{
+    my $self = shift @_;
+    my $action = $self->{'action'};
+
+    $action =~ s/-/_/g;
+
+    
+    $self->$action();
+
+}
+
+
+
+
+sub authenticate_user
+{
+    my $self = shift @_;
+    my $username = shift(@_);
+    my $collection = shift(@_);
+
+    my $gsdl_cgi = $self->{'gsdl_cgi'};
+
+    # Remove the pw argument (since this can mess up other scripts)
+    my $user_password = $gsdl_cgi->clean_param("pw");
+    $gsdl_cgi->delete("pw");
+
+    if ((!defined $user_password) || ($user_password =~ m/^\s*$/)) {
+	$gsdl_cgi->generate_error("Authentication failed: no password specified.");
+    }
+
+    my $gsdlhome = $ENV{'GSDLHOME'};
+    my $etc_directory = &util::filename_cat($gsdlhome, "etc");
+    my $users_db_file_path = &util::filename_cat($etc_directory, "users.db");
+
+    # Use db2txt to get the user accounts information
+    my $users_db_content = "";
+    open(USERS_DB, "db2txt \"$users_db_file_path\" |");
+    while (<USERS_DB>) {
+	$users_db_content .= $_;
+    }
+
+    # Get the user account information from the users.db database
+    my %users_db_data = ();
+    foreach my $users_db_entry (split(/-{70}/, $users_db_content)) {
+	if ($users_db_entry =~ /\n?\[(.+)\]\n/) {
+	    $users_db_data{$1} = $users_db_entry;
+	}
+    }
+
+    # Check username
+    my $user_data = $users_db_data{$username};
+    if (!defined $user_data) {
+	$gsdl_cgi->generate_error("Authentication failed: no account for user '$username'.");
+    }
+
+    # Check password
+    my ($valid_user_password) = ($user_data =~ /\<password\>(.*)/);
+    if ($user_password ne $valid_user_password) {
+	$gsdl_cgi->generate_error("Authentication failed: incorrect password.");
+    }
+
+    # Check group
+    my ($user_groups) = ($user_data =~ /\<groups\>(.*)/);
+    if ($collection eq "") {
+	# If we're not editing a collection then the user doesn't need to be in a particular group
+	return $user_groups;  # Authentication successful
+    }
+    foreach my $user_group (split(/\,/, $user_groups)) {
+	# Does this user have access to all collections?
+	if ($user_group eq "all-collections-editor") {
+	    return $user_groups;  # Authentication successful
+	}
+	# Does this user have access to personal collections, and is this one?
+	if ($user_group eq "personal-collections-editor" && $collection =~ /^$username\-/) {
+	    return $user_groups;  # Authentication successful
+	}
+	# Does this user have access to this collection
+	if ($user_group eq "$collection-collection-editor") {
+	    return $user_groups;  # Authentication successful
+	}
+    }
+
+    $gsdl_cgi->generate_error("Authentication failed: user is not in the required group.");
+}
+
+
+
+sub check_installation
+{
+    my $self = shift @_;
+    my $iis6_mode = shift(@_);
+
+    my $gsdl_cgi = $self->{'gsdl_cgi'};
+
+    my $installation_ok = 1;
+    my $installation_status = "";
+
+    print STDOUT "Content-type:text/plain\n\n";
+
+    # Check that Java is installed and accessible
+    my $java = $gsdl_cgi->get_java_path();
+    my $java_command = "$java -version 2>&1";
+
+    # IIS 6: redirecting output from STDERR to STDOUT just doesn't work, so we have to let it go
+    #   directly out to the page
+    if ($iis6_mode)
+    {
+	$java_command = "java -version";
+    }
+
+    my $java_output = `$java_command`;
+    my $java_status = $?;
+    if ($java_status < 0) {
+	# The Java command failed
+	$installation_status = "Java failed -- do you have the Java run-time installed?\n" . $gsdl_cgi->check_java_home() . "\n";
+	$installation_ok = 0;
+    }
+    else {
+	$installation_status = "Java found: $java_output";
+    }
+
+    # Show the values of some important environment variables
+    $installation_status .= "\n";
+    $installation_status .= "GSDLHOME: " . $ENV{'GSDLHOME'} . "\n";
+    $installation_status .= "GSDLOS: " . $ENV{'GSDLOS'} . "\n";
+    $installation_status .= "PATH: " . $ENV{'PATH'} . "\n";
+
+    if ($installation_ok) {
+	print STDOUT $installation_status . "\nInstallation OK!";
+    }
+    else {
+	print STDOUT $installation_status;
+    }
+}
+
+sub lock_collection
+{
+    my $self = shift @_;
+    my $username = shift(@_);
+    my $collection = shift(@_);
+
+    my $gsdl_cgi = $self->{'gsdl_cgi'};
+
+    my $steal_lock = $gsdl_cgi->clean_param("steal_lock");
+    $gsdl_cgi->delete("steal_lock");
+
+    if (!defined $username) {
+	# don't have any user details for current user to compare with
+	# even if there is a lock file
+	# For now, allow the current user access.  Might want to
+	# revisit this in the future.
+	return;
+    }
+
+    my $gsdlhome = $ENV{'GSDLHOME'};
+    my $collection_directory = &util::filename_cat($gsdlhome, "collect", $collection);
+    $gsdl_cgi->checked_chdir($collection_directory);
+
+    # Check if a lock file already exists for this collection
+    my $lock_file_name = "gli.lck";
+    if (-e $lock_file_name) {
+	# A lock file already exists... check if it's ours
+	my $lock_file_content = "";
+	open(LOCK_FILE, "<$lock_file_name");
+	while (<LOCK_FILE>) {
+	    $lock_file_content .= $_;
+	}
+	close(LOCK_FILE);
+
+	# Pick out the owner of the lock file
+	$lock_file_content =~ /\<User\>(.*?)\<\/User\>/;
+	my $lock_file_owner = $1;
+
+	# The lock file is ours, so there is no problem
+	if ($lock_file_owner eq $username) {
+	    return;
+	}
+
+	# The lock file is not ours, so throw an error unless "steal_lock" is set
+	unless (defined $steal_lock) {
+	    $gsdl_cgi->generate_error("Collection is locked by: $lock_file_owner");
+	}
+    }
+
+    my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
+    my $current_time = sprintf("%02d/%02d/%d %02d:%02d:%02d", $mday, $mon + 1, $year + 1900, $hour, $min, $sec);
+
+    # Create a lock file for us (in the same format as the GLI) and we're done
+    open(LOCK_FILE, ">$lock_file_name");
+    print LOCK_FILE "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+    print LOCK_FILE "<LockFile>\n";
+    print LOCK_FILE "    <User>" . $username . "</User>\n";
+    print LOCK_FILE "    <Machine>(Remote)</Machine>\n";
+    print LOCK_FILE "    <Date>" . $current_time . "</Date>\n";
+    print LOCK_FILE "</LockFile>\n";
+    close(LOCK_FILE);
+}
+
+
+# Release the gli.lck otherwise no one else will be able to use the collection again.
+sub unlock_collection
+{
+    my $self = shift @_;
+    my ($username, $collection) = @_;
+    my $gsdl_cgi = $self->{'gsdl_cgi'};
+
+    # Obtain the path to the collection GLI lock file
+    my $lock_file_path = &util::filename_cat($ENV{'GSDLHOME'}, "collect", $collection, "gli.lck");
+
+    # If the lock file does exist, check if it is ours
+    if (-e $lock_file_path)
+    {
+	my $lock_file_content = "";
+	open(LOCK_FILE, "<$lock_file_path");
+	while (<LOCK_FILE>) {
+	    $lock_file_content .= $_;
+	}
+	close(LOCK_FILE);
+
+	# Pick out the owner of the lock file
+	$lock_file_content =~ /\<User\>(.*?)\<\/User\>/;
+	my $lock_file_owner = $1;
+
+	# If we are the owner of this lock, we have the right to delete it
+	if ($lock_file_owner eq $username) {
+            unlink($lock_file_path );
+	}
+        else {
+	    $gsdl_cgi->generate_error("Collection is locked by: $lock_file_owner. Cannot be unlocked");
+        }
+    }
+}
+
+
+sub send_mail
+{
+    my $self = shift @_;
+
+    my ($mail_subject,$mail_content) = @_;
+
+    my $gsdl_cgi = $self->{'gsdl_cgi'};
+
+    my $sendmail_command = "\"".&util::get_perl_exec()."\" -S sendmail.pl";
+    $sendmail_command .= " -to \"" . $mail_to_address . "\"";
+    $sendmail_command .= " -from \"" . $mail_from_address . "\"";
+    $sendmail_command .= " -smtp \"" . $mail_smtp_server . "\"";
+    $sendmail_command .= " -subject \"" . $mail_subject . "\"";
+
+    if (!open(POUT, "| $sendmail_command")) {
+	$gsdl_cgi->generate_error("Unable to execute command: $sendmail_command");
+    }
+    print POUT $mail_content . "\n";
+    close(POUT);
+}
+
+
+
+
+sub run_script
+{
+    my $self = shift @_;
+
+    my ($collect, $site, $script) = @_;
+
+    my $gsdl_cgi = $self->{'gsdl_cgi'};
+
+    my $perl_args = $collect;
+
+    my $collect_dir = $gsdl_cgi->get_collection_dir($site); 
+    $perl_args = "-collectdir \"$collect_dir\" " . $perl_args;
+
+    my $perl_command = "\"".&util::get_perl_exec()."\" -S $script $perl_args";
+
+
+    # IIS 6: redirecting output from STDERR to STDOUT just doesn't work, so
+    # we have to let it go directly out to the page
+
+    if (!$self->{'iis6_mode'})
+    {
+	$perl_command .= " 2>&1";
+    }
+
+    if (!open(PIN, "$perl_command |")) {
+	$gsdl_cgi->generate_error("Unable to execute command: $perl_command");
+    }
+
+    print STDOUT "Content-type:text/plain\n\n";
+    print "$perl_command  \n";
+
+    while (defined (my $perl_output_line = <PIN>)) {
+	print STDOUT $perl_output_line;
+    }
+    close(PIN);
+
+    my $perl_status = $?;
+    if ($perl_status > 0) {
+	$gsdl_cgi->generate_error("Perl failed: $perl_command\n--\nExit status: " . ($perl_status / 256));
+    }
+}
+
+
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cgiactions/buildaction.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cgiactions/buildaction.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cgiactions/buildaction.pm	(revision 24799)
@@ -0,0 +1,434 @@
+###########################################################################
+#
+# buildaction.pm -- 
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2009 New Zealand Digital Library Project
+#
+# This program is free software; you can redistr   te it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package buildaction;
+
+use strict;
+
+use JSON;
+
+use cgiactions::baseaction;
+
+use dbutil;
+use ghtml;
+
+use util;
+
+BEGIN {
+#    unshift (@INC, "$ENV{'GSDLHOME'}/perllib/cpan/perl-5.8");
+    require XML::Rules;
+}
+
+
+@buildaction::ISA = ('baseaction');
+
+
+# 'a' for action, and 'c' for collection are also compulsorary, and
+# added in automatically by baseaction
+
+my $action_table =
+{ 
+    "full-import"          => { 'compulsory-args' => [],
+				'optional-args'   => [] }, 
+    
+    "full-buildcol"        => { 'compulsory-args' => [],
+				'optional-args'   => [] },
+    
+    "full-rebuild"         => { 'compulsory-args' => [],
+				'optional-args'   => [] },
+    
+    
+    "incremental-import"   => { 'compulsory-args' => [],
+				'optional-args'   => [] }, 
+
+    "incremental-buildcol" => { 'compulsory-args' => [],
+				'optional-args'   => [] },
+    
+    "incremental-rebuild" => { 'compulsory-args' => [],
+			       'optional-args'   => [] },
+				   
+    "build-by-manifest" => { 'compulsory-args' => [],
+			       'optional-args'   => ["index-files", "reindex-files", "delete-OIDs"] }
+				   
+};
+
+
+sub new 
+{
+    my $class = shift (@_);
+    my ($gsdl_cgi,$iis6_mode) = @_;
+
+    my $self = new baseaction($action_table,$gsdl_cgi,$iis6_mode);
+
+    return bless $self, $class;
+}
+
+
+sub run_build_cmd
+{
+    my $self = shift @_;
+    my ($cmd) = @_;
+
+    my $collect   = $self->{'collect'};
+    my $gsdl_cgi  = $self->{'gsdl_cgi'};
+    my $gsdl_home  = $self->{'gsdlhome'};
+
+    my $output = `$cmd 2>&1`;
+    my $status = $?;
+    my $report = undef;
+
+    if ($status == 0) {
+	$report = "Perl build successful: $cmd\n--\n";
+	$report .= "$output\n";
+    }
+    else {
+	$report = "Perl rebuild failed: $cmd\n--\n";
+	$report .= "$output\n";
+	$report .= "Exit status: " . ($status / 256) . "\n";
+##	$report .= $gsdl_cgi->check_perl_home();
+
+#	$report .= "PATH = ". $ENV{'PATH'}. "\n";
+    }
+
+    return($status,$report);
+}
+
+sub full_import
+{
+    my $self = shift @_;
+
+    my $username  = $self->{'username'};
+    my $collect   = $self->{'collect'};
+    my $gsdl_cgi  = $self->{'gsdl_cgi'};
+    my $gsdl_home  = $self->{'gsdlhome'};
+
+    # Authenticate user if it is enabled
+    if ($baseaction::authentication_enabled) {
+	# Ensure the user is allowed to edit this collection
+	&authenticate_user($gsdl_cgi, $username, $collect);
+    }
+	
+    # Obtain the collect dir
+    my $collect_dir = &util::filename_cat($gsdl_home, "collect");
+
+    # Make sure the collection isn't locked by someone else
+    $self->lock_collection($username, $collect);
+
+    my $bin_script = &util::filename_cat($gsdl_home,"bin","script");
+    my $cmd = "\"".&util::get_perl_exec()."\" -S full-import.pl \"$collect\"";
+
+    my ($status,$report) = $self->run_build_cmd($cmd);
+   
+    # Release the lock once it is done
+    $self->unlock_collection($username, $collect);
+
+    if ($status==0) {
+	$gsdl_cgi->generate_ok_message($report);
+    }
+    else {
+	$gsdl_cgi->generate_error($report);
+    }
+
+}
+
+
+sub full_buildcol
+{
+    my $self = shift @_;
+
+    my $username  = $self->{'username'};
+    my $collect   = $self->{'collect'};
+    my $gsdl_cgi  = $self->{'gsdl_cgi'};
+    my $gsdl_home  = $self->{'gsdlhome'};
+
+    # Authenticate user if it is enabled
+    if ($baseaction::authentication_enabled) {
+	# Ensure the user is allowed to edit this collection
+	&authenticate_user($gsdl_cgi, $username, $collect);
+    }
+    
+    # Obtain the collect dir
+    my $collect_dir = &util::filename_cat($gsdl_home, "collect");
+
+    # Make sure the collection isn't locked by someone else
+    $self->lock_collection($username, $collect);
+
+    my $bin_script = &util::filename_cat($gsdl_home,"bin","script");
+    my $cmd = "\"".&util::get_perl_exec()."\" -S full-buildcol.pl \"$collect\"";
+
+    my ($status,$report) = $self->run_build_cmd($cmd);
+   
+    # Release the lock once it is done
+    $self->unlock_collection($username, $collect);
+
+    if ($status==0) {
+	$gsdl_cgi->generate_ok_message($report);
+    }
+    else {
+	$gsdl_cgi->generate_error($report);
+    }
+}
+
+
+sub full_rebuild
+{
+    my $self = shift @_;
+
+    my $username  = $self->{'username'};
+    my $collect   = $self->{'collect'};
+    my $gsdl_cgi  = $self->{'gsdl_cgi'};
+    my $gsdl_home  = $self->{'gsdlhome'};
+
+    # Authenticate user if it is enabled
+    if ($baseaction::authentication_enabled) {
+	# Ensure the user is allowed to edit this collection
+	&authenticate_user($gsdl_cgi, $username, $collect);
+    }
+	
+    # Obtain the collect dir
+    my $collect_dir = &util::filename_cat($gsdl_home, "collect");
+
+    # Make sure the collection isn't locked by someone else
+    $self->lock_collection($username, $collect);
+	
+    my $bin_script = &util::filename_cat($gsdl_home,"bin","script");
+    my $cmd = "\"".&util::get_perl_exec()."\" -S full-rebuild.pl \"$collect\"";
+
+    my ($status,$report) = $self->run_build_cmd($cmd);
+   
+    # Release the lock once it is done
+    $self->unlock_collection($username, $collect);
+
+    if ($status==0) {
+	$gsdl_cgi->generate_ok_message($report);
+    }
+    else {
+	$gsdl_cgi->generate_error($report);
+    }
+}
+
+
+
+sub incremental_import
+{
+    my $self = shift @_;
+
+    my $username  = $self->{'username'};
+    my $collect   = $self->{'collect'};
+    my $gsdl_cgi  = $self->{'gsdl_cgi'};
+    my $gsdl_home  = $self->{'gsdlhome'};
+
+    # Authenticate user if it is enabled
+    if ($baseaction::authentication_enabled) {
+	# Ensure the user is allowed to edit this collection
+	&authenticate_user($gsdl_cgi, $username, $collect);
+    }
+	
+    # Obtain the collect dir
+    my $collect_dir = &util::filename_cat($gsdl_home, "collect");
+
+    # Make sure the collection isn't locked by someone else
+    $self->lock_collection($username, $collect);
+
+
+    my $bin_script = &util::filename_cat($gsdl_home,"bin","script");
+    my $cmd = "\"".&util::get_perl_exec()."\" -S incremental-import.pl \"$collect\"";
+
+    my ($status,$report) = $self->run_build_cmd($cmd);
+   
+    # Release the lock once it is done
+    $self->unlock_collection($username, $collect);
+
+    if ($status==0) {
+	$gsdl_cgi->generate_ok_message($report);
+    }
+    else {
+	$gsdl_cgi->generate_error($report);
+    }
+}
+
+
+sub incremental_buildcol
+{
+    my $self = shift @_;
+
+    my $username  = $self->{'username'};
+    my $collect   = $self->{'collect'};
+    my $gsdl_cgi  = $self->{'gsdl_cgi'};
+    my $gsdl_home  = $self->{'gsdlhome'};
+
+    # Authenticate user if it is enabled
+    if ($baseaction::authentication_enabled) {
+	# Ensure the user is allowed to edit this collection
+	&authenticate_user($gsdl_cgi, $username, $collect);
+    }
+    
+    # Obtain the collect dir
+    my $collect_dir = &util::filename_cat($gsdl_home, "collect");
+
+    # Make sure the collection isn't locked by someone else
+    $self->lock_collection($username, $collect);
+
+
+    my $bin_script = &util::filename_cat($gsdl_home,"bin","script");
+    my $cmd = "\"".&util::get_perl_exec()."\" -S incremental-buildcol.pl \"$collect\"";
+
+    my ($status,$report) = $self->run_build_cmd($cmd);
+   
+    # Release the lock once it is done
+    $self->unlock_collection($username, $collect);
+
+    if ($status==0) {
+	$gsdl_cgi->generate_ok_message($report);
+    }
+    else {
+	$gsdl_cgi->generate_error($report);
+    }
+}
+
+
+sub incremental_rebuild
+{
+    my $self = shift @_;
+
+    my $username  = $self->{'username'};
+    my $collect   = $self->{'collect'};
+    my $gsdl_cgi  = $self->{'gsdl_cgi'};
+    my $gsdl_home  = $self->{'gsdlhome'};
+
+    # Authenticate user if it is enabled
+    if ($baseaction::authentication_enabled) {
+	# Ensure the user is allowed to edit this collection
+	&authenticate_user($gsdl_cgi, $username, $collect);
+    }
+	
+    # Obtain the collect dir
+    my $collect_dir = &util::filename_cat($gsdl_home, "collect");
+
+    # Make sure the collection isn't locked by someone else
+    $self->lock_collection($username, $collect);
+
+
+    my $bin_script = &util::filename_cat($gsdl_home,"bin","script");
+    my $cmd = "\"".&util::get_perl_exec()."\" -S incremental-rebuild.pl \"$collect\"";
+
+    my ($status,$report) = $self->run_build_cmd($cmd);
+   
+    # Release the lock once it is done
+    $self->unlock_collection($username, $collect);
+
+    if ($status==0) {
+	$gsdl_cgi->generate_ok_message($report);
+    }
+    else {
+	$gsdl_cgi->generate_error($report);
+    }
+}
+
+sub build_by_manifest
+{
+	my $self = shift @_;
+
+    my $username  = $self->{'username'};
+    my $collect   = $self->{'collect'};
+    my $gsdl_cgi  = $self->{'gsdl_cgi'};
+    my $gsdl_home  = $self->{'gsdlhome'};
+
+    # Authenticate user if it is enabled
+    if ($baseaction::authentication_enabled) {
+	# Ensure the user is allowed to edit this collection
+	&authenticate_user($gsdl_cgi, $username, $collect);
+    }
+	
+    # Obtain the collect dir
+    my $collect_dir = &util::filename_cat($gsdl_home, "collect");
+
+    # Make sure the collection isn't locked by someone else
+    $self->lock_collection($username, $collect);
+
+	my $if_json_str   = $self->{'index-files'};
+	my $rf_json_str   = $self->{'reindex-files'};
+	my $df_json_str   = $self->{'delete-OIDs'};
+	
+		
+	my $index_files   = (defined $if_json_str) ? decode_json $if_json_str : [];
+	my $reindex_files = (defined $rf_json_str) ? decode_json $rf_json_str : [];
+	my $delete_files  = (defined $df_json_str) ? decode_json $df_json_str : [];
+	
+	my $index_files_xml   = join("\n", map { "    <Filename>$_</Filename>" } @$index_files);
+	my $reindex_files_xml = join("\n", map { "    <Filename>$_</Filename>" } @$reindex_files);
+	my $delete_files_xml  = join("\n", map { "    <OID>$_</OID>" } @$delete_files);
+	
+	my $manifest_filename = &util::get_tmp_filename(".xml");
+	my ($status,$report);
+			
+	if (open(MOUT,">$manifest_filename")) {
+		binmode(MOUT,":utf8");
+		print MOUT <<MOUTRAW;
+<Manifest>
+  <Index>
+$index_files_xml
+  </Index>
+  <Reindex>
+$reindex_files_xml
+  </Reindex>
+  <Delete>
+$delete_files_xml
+  </Delete>
+</Manifest>
+MOUTRAW
+		close(MOUT);
+		
+		## my $bin_script = &util::filename_cat($gsdl_home,"bin","script");
+		my $cmd = "\"".&util::get_perl_exec()."\" -S incremental-rebuild.pl -manifest \"$manifest_filename\" \"$collect\"";
+
+		($status,$report) = $self->run_build_cmd($cmd);
+		
+		if ($status==0) {
+			&util::rm($manifest_filename);
+		}
+	}
+	else {
+		$status = -1;
+		$report = "Failed to open '$manifest_filename' for output\n$!\n";
+	}
+	
+   
+    # Release the lock once it is done
+    $self->unlock_collection($username, $collect);
+
+    if ($status==0) {
+	$gsdl_cgi->generate_ok_message($report);
+    }
+    else {
+	$gsdl_cgi->generate_error($report);
+    }
+	
+	# incremental-rebuild.pl -manifest manifest.xml \"" + _greenstoneCollectionName  + "\"";
+ }
+
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cgiactions/explodeaction.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cgiactions/explodeaction.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cgiactions/explodeaction.pm	(revision 24799)
@@ -0,0 +1,507 @@
+###########################################################################
+#
+# explodeaction.pm -- 
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2009 New Zealand Digital Library Project
+#
+# This program is free software; you can redistr   te it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package explodeaction;
+
+use strict;
+
+use cgiactions::baseaction;
+
+use dbutil;
+use ghtml;
+use util;
+
+use JSON;
+
+use File::Basename;
+
+BEGIN {
+#    unshift (@INC, "$ENV{'GSDLHOME'}/perllib/cpan/perl-5.8");
+    require XML::Rules;
+}
+
+
+@explodeaction::ISA = ('baseaction');
+
+
+# 'a' for action, and 'c' for collection are also compulsorary, and
+# added in automatically by baseaction
+
+my $action_table =
+{ 
+    "explode-document"          => { 'compulsory-args' => ["d"],
+			    'optional-args'   => [] },
+	"delete-document"           => { 'compulsory-args' => ["d"],
+			    'optional-args'   => [ "onlyadd" ] },
+	"delete-document-array"     => { 'compulsory-args' => ["json"],
+			    'optional-args'   => [ "onlyadd" ] }
+				
+				
+};
+
+
+sub new 
+{
+    my $class = shift (@_);
+    my ($gsdl_cgi,$iis6_mode) = @_;
+
+    my $self = new baseaction($action_table,$gsdl_cgi,$iis6_mode);
+
+    return bless $self, $class;
+}
+
+
+sub get_infodb_type
+{
+    my ($opt_site,$collect_home,$collect) = @_;
+
+    my $out = "STDERR";
+
+    $collect = &colcfg::use_collection($opt_site, $collect, $collect_home);
+
+    if ($collect eq "") {
+	print STDERR "Error: failed to find collection $collect in $collect_home\n";
+	print STDOUT "Content-type:text/plain\n\n";
+	print STDOUT "ERROR: Failed to find collection $collect\n";
+	exit 0;
+	
+    }
+
+    # Read in the collection configuration file.
+    my ($config_filename, $gs_mode) = &colcfg::get_collect_cfg_name($out);
+    my $collectcfg = &colcfg::read_collection_cfg ($config_filename, $gs_mode);
+
+    return $collectcfg->{'infodbtype'};
+}
+
+
+sub docid_to_import_filenames
+{
+    my $self = shift @_;
+
+    my @docids = @_;
+
+	my $collect   = $self->{'collect'};
+	my $gsdl_cgi  = $self->{'gsdl_cgi'};
+    my $infodb_type = $self->{'infodbtype'};
+
+    # Derive the archives dir    
+	my $site = $self->{'site'};
+	my $collect_dir = $gsdl_cgi->get_collection_dir($site);
+	my $archive_dir = &util::filename_cat($collect_dir,$collect,"archives");
+    ##my $archive_dir = &util::filename_cat($ENV{'GSDLCOLLECTDIR'},"archives");
+
+    my $arcinfo_doc_filename 
+	= &dbutil::get_infodb_file_path($infodb_type, "archiveinf-doc", 
+					$archive_dir);
+
+    my %all_import_file_keys = ();
+    
+    foreach my $docid (@docids) {
+	# Obtain the src and associated files specified docID
+	
+	my $doc_rec
+	    = &dbutil::read_infodb_entry($infodb_type, $arcinfo_doc_filename, 
+					 $docid);
+	
+	my $src_files = $doc_rec->{'src-file'};
+	my $assoc_files = $doc_rec->{'assoc-file'};
+	
+	if (defined $src_files) {
+	    foreach my $if (@$src_files) {
+		$all_import_file_keys{$if} = 1;
+	    }
+	}
+
+	if (defined $assoc_files) {
+	    foreach my $if (@$assoc_files) {
+		$all_import_file_keys{$if} = 1;
+	    }
+	}
+    }
+
+    my @all_import_files = keys %all_import_file_keys;
+
+    return \@all_import_files;
+}
+
+
+sub import_filenames_to_docids
+{
+    my $self = shift @_;
+    my ($import_filenames) = @_;
+
+	my $collect   = $self->{'collect'};   
+	my $gsdl_cgi  = $self->{'gsdl_cgi'};
+    my $infodb_type = $self->{'infodbtype'};
+
+    # Derive the archives dir    
+	my $site = $self->{'site'};
+	my $collect_dir = $gsdl_cgi->get_collection_dir($site);
+	my $archive_dir = &util::filename_cat($collect_dir,$collect,"archives");
+    ##my $archive_dir = &util::filename_cat($ENV{'GSDLCOLLECTDIR'},"archives");
+
+    # Obtain the oids for the specified import filenames
+    my $arcinfo_src_filename 
+	= &dbutil::get_infodb_file_path($infodb_type, "archiveinf-src", 
+				 	$archive_dir);
+
+    my %all_oid_keys = ();
+
+    foreach my $if (@$import_filenames) {
+		$if = &util::upgrade_if_dos_filename($if);
+
+	print STDERR "*** looking import filename key \"$if\"\n";
+
+	my $src_rec
+	    = &dbutil::read_infodb_entry($infodb_type, $arcinfo_src_filename, 
+					 $if);
+	my $oids = $src_rec->{'oid'};
+
+	foreach my $o (@$oids) {
+	    $all_oid_keys{$o} = 1;
+	}
+    }
+
+    my @all_oids = keys %all_oid_keys;
+
+    return \@all_oids;
+}
+
+
+sub remove_import_filenames
+{
+    my $self = shift @_;
+    my ($expanded_import_filenames) = @_;
+
+    foreach my $f (@$expanded_import_filenames) {
+	# If this document has been exploded before then
+	# its original source files will have already been removed	
+	if (-e $f) {
+	    &util::rm($f);
+	}
+    }
+}
+
+sub move_docoids_to_import
+{
+    my $self = shift @_;
+    my ($docids) = @_;
+
+	my $collect   = $self->{'collect'};
+	my $gsdl_cgi  = $self->{'gsdl_cgi'};
+    my $infodb_type = $self->{'infodbtype'};
+
+    # Derive the archives and import directories
+	my $site = $self->{'site'};
+	my $collect_dir = $gsdl_cgi->get_collection_dir($site);
+	
+    my $archive_dir = &util::filename_cat($collect_dir,$collect,"archives");
+    my $import_dir  = &util::filename_cat($collect_dir,$collect,"import");
+
+    # Obtain the doc.xml path for the specified docID
+    my $arcinfo_doc_filename 
+	= &dbutil::get_infodb_file_path($infodb_type, "archiveinf-doc", 
+				 	$archive_dir);
+
+    foreach my $docid (@$docids) {
+
+	my $doc_rec
+	    = &dbutil::read_infodb_entry($infodb_type, $arcinfo_doc_filename, 
+					 $docid);
+
+	my $doc_xml_file = $doc_rec->{'doc-file'}->[0];
+
+	# The $doc_xml_file is relative to the archives, so need to do
+	# a bit more work to make sure the right folder containing this
+	# is moved to the right place in the import folder
+
+	my $assoc_path = dirname($doc_xml_file);
+	my $import_assoc_dir = &util::filename_cat($import_dir,$assoc_path);
+	my $archive_assoc_dir = &util::filename_cat($archive_dir,$assoc_path);
+
+	# If assoc_path involves more than one sub directory, then need to make
+	# sure the necessary directories exist in the import area also.
+	# For example, if assoc_path is "a/b/c.dir" then need "import/a/b" to
+	# exists before moving "archives/a/b/c.dir" -> "import/a/b"
+	my $import_target_parent_dir = dirname($import_assoc_dir);
+
+	if (-d $import_assoc_dir) {
+	    # detected version from previous explode => remove it
+	    &util::rm_r($import_assoc_dir);
+	}
+	else {
+	    # First time => make sure parent directory exists to move 
+	    # "c.dir" (see above) into
+	    
+	    &util::mk_all_dir($import_target_parent_dir);
+	}
+
+	&util::cp_r($archive_assoc_dir,$import_target_parent_dir)
+    }
+}
+
+
+sub remove_docoids
+{
+    my $self = shift @_;
+    my ($docids) = @_;
+
+	my $collect   = $self->{'collect'};
+	my $gsdl_cgi  = $self->{'gsdl_cgi'};
+    my $infodb_type = $self->{'infodbtype'};
+
+    # Derive the archives and import directories
+	my $site = $self->{'site'};
+	my $collect_dir = $gsdl_cgi->get_collection_dir($site);
+	
+    my $archive_dir = &util::filename_cat($collect_dir,$collect,"archives");
+
+    # Obtain the doc.xml path for the specified docID
+    my $arcinfo_doc_filename 
+	= &dbutil::get_infodb_file_path($infodb_type, "archiveinf-doc", 
+				 	$archive_dir);
+
+    foreach my $docid (@$docids) {
+
+		my $doc_rec
+			= &dbutil::read_infodb_entry($infodb_type, $arcinfo_doc_filename, 
+					 $docid);
+
+		my $doc_xml_file = $doc_rec->{'doc-file'}->[0];
+
+		# The $doc_xml_file is relative to the archives, so need to do
+		# a bit more work to make sure the right folder containing this
+		# is moved to the right place in the import folder
+
+		my $assoc_path = dirname($doc_xml_file);
+		my $archive_assoc_dir = &util::filename_cat($archive_dir,$assoc_path);
+
+		&util::rm_r($archive_assoc_dir)
+    }
+}
+
+
+sub explode_document 
+{
+    my $self = shift @_;
+
+    my $username  = $self->{'username'};
+    my $collect   = $self->{'collect'};
+    my $gsdl_cgi  = $self->{'gsdl_cgi'};
+    my $gsdl_home  = $self->{'gsdlhome'};
+
+    # Authenticate user if it is enabled
+    if ($baseaction::authentication_enabled) {
+	# Ensure the user is allowed to edit this collection
+	&authenticate_user($gsdl_cgi, $username, $collect);
+    }
+	
+    # Derive the archives dir    
+	my $site = $self->{'site'};
+	my $collect_dir = $gsdl_cgi->get_collection_dir($site);
+	
+	my $archive_dir = &util::filename_cat($collect_dir,$collect,"archives");
+    ##my $archive_dir = &util::filename_cat($ENV{'GSDLCOLLECTDIR'},"archives");
+
+    # Make sure the collection isn't locked by someone else
+    $self->lock_collection($username, $collect);
+
+    # look up additional args
+    my $docid  = $self->{'d'};
+    if ((!defined $docid) || ($docid =~ m/^\s*$/)) {
+	$self->unlock_collection($username, $collect);
+	$gsdl_cgi->generate_error("No docid (d=...) specified.");
+    }
+
+    my ($docid_root,$docid_secnum) = ($docid =~ m/^(.*?)(\..*)?$/);
+
+    my $orig_import_filenames = $self->docid_to_import_filenames($docid_root);
+    my $docid_keys = $self->import_filenames_to_docids($orig_import_filenames);
+    my $expanded_import_filenames = $self->docid_to_import_filenames(@$docid_keys);
+
+    $self->remove_import_filenames($expanded_import_filenames);
+    $self->move_docoids_to_import($docid_keys);
+
+    # Release the lock once it is done
+    $self->unlock_collection($username, $collect);
+
+    my $mess = "Base Doc ID: $docid_root\n-----\n";
+    $mess .= join("\n",@$expanded_import_filenames);
+
+    $gsdl_cgi->generate_ok_message($mess);
+
+}
+
+
+sub delete_document_entry
+{
+	my $self = shift @_;
+	my ($docid_root,$opt_onlyadd) = @_;
+	
+	my $docid_keys = [];
+	if ((defined $opt_onlyadd) && ($opt_onlyadd==1)) {
+		# delete docoid archive folder
+		push(@$docid_keys,$docid_root);
+	}
+	else {
+		print STDERR "**** Not currently implemented for the general case!!\nDeleting 'archive' version only.";
+		
+		push(@$docid_keys,$docid_root);
+		
+		#my $orig_import_filenames = $self->docid_to_import_filenames($docid_root);
+		#$docid_keys = $self->import_filenames_to_docids($orig_import_filenames);
+		#my $expanded_import_filenames = $self->docid_to_import_filenames(@$docid_keys);
+		
+		# need to remove only the files that are not 
+		
+		#$self->remove_import_filenames($expanded_import_filenames);
+	}
+   
+	$self->remove_docoids($docid_keys);
+}
+	
+
+sub delete_document
+{
+    my $self = shift @_;
+
+    my $username  = $self->{'username'};
+    my $collect   = $self->{'collect'};
+    my $gsdl_cgi  = $self->{'gsdl_cgi'};
+    my $gsdl_home  = $self->{'gsdlhome'};
+
+    # Authenticate user if it is enabled
+    if ($baseaction::authentication_enabled) {
+	# Ensure the user is allowed to edit this collection
+	&authenticate_user($gsdl_cgi, $username, $collect);
+    }
+	
+    # Derive the archives dir    
+	my $site = $self->{'site'};
+	my $collect_dir = $gsdl_cgi->get_collection_dir($site);
+	
+	my $archive_dir = &util::filename_cat($collect_dir,$collect,"archives");
+    ##my $archive_dir = &util::filename_cat($ENV{'GSDLCOLLECTDIR'},"archives");
+
+    # Make sure the collection isn't locked by someone else
+    $self->lock_collection($username, $collect);
+
+    # look up additional args
+    my $docid  = $self->{'d'};
+    if ((!defined $docid) || ($docid =~ m/^\s*$/)) {
+	$self->unlock_collection($username, $collect);
+	$gsdl_cgi->generate_error("No docid (d=...) specified.");
+    }
+
+    my ($docid_root,$docid_secnum) = ($docid =~ m/^(.*?)(\..*)?$/);
+
+	my $onlyadd = $self->{'onlyadd'};
+
+	my $status = $self->delete_document_entry($docid_root,$onlyadd);	
+
+    # Release the lock once it is done
+    $self->unlock_collection($username, $collect);
+
+	my $mess = "delete-document successful: Key[$docid_root]\n";
+    $gsdl_cgi->generate_ok_message($mess);
+
+}
+
+
+sub delete_document_array
+{
+    my $self = shift @_;
+
+    my $username  = $self->{'username'};
+    my $collect   = $self->{'collect'};
+    my $gsdl_cgi  = $self->{'gsdl_cgi'};
+    my $gsdlhome  = $self->{'gsdlhome'};
+
+    if ($baseaction::authentication_enabled) {
+	# Ensure the user is allowed to edit this collection
+	&authenticate_user($gsdl_cgi, $username, $collect);
+    }
+
+	my $site = $self->{'site'};
+	my $collect_dir = $gsdl_cgi->get_collection_dir($site);
+	
+    $gsdl_cgi->checked_chdir($collect_dir);
+
+    # Obtain the collect dir
+    ## my $collect_dir = &util::filename_cat($gsdlhome, "collect");
+
+    # Make sure the collection isn't locked by someone else
+    $self->lock_collection($username, $collect);
+
+    # look up additional args
+	
+	my $json_str      = $self->{'json'};
+	my $doc_array = decode_json $json_str;
+
+	my $onlyadd = $self->{'onlyadd'};
+	
+	
+	my $global_status = 0;
+	my $global_mess = "";
+	
+	my @all_docids = ();
+	
+	foreach my $doc_array_rec ( @$doc_array ) {
+		
+		my $docid     = $doc_array_rec->{'docid'};
+		
+		push(@all_docids,$docid);
+		
+		my ($docid_root,$docid_secnum) = ($docid =~ m/^(.*?)(\..*)?$/);
+		  
+		my $status = $self->delete_document_entry($docid_root,$onlyadd);	
+		
+		if ($status != 0) {
+			# Catch error if set infodb entry failed
+			$global_status = $status;
+			$global_mess .= "Failed to delete document key: $docid\n";
+			$global_mess .= "Exit status: $status\n";
+			$global_mess .= "System Error Message: $!\n";
+			$global_mess .= "-" x 20;
+		}
+	}
+
+	if ($global_status != 0) {
+		$global_mess .= "PATH: $ENV{'PATH'}\n";
+		$gsdl_cgi->generate_error($global_mess);
+    }
+    else {
+		my $mess = "delete-document-array successful: Keys[ ".join(", ",@all_docids)."]\n";
+		$gsdl_cgi->generate_ok_message($mess);
+    }
+    
+    # Release the lock once it is done
+    $self->unlock_collection($username, $collect);
+}
+
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cgiactions/imageaction.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cgiactions/imageaction.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cgiactions/imageaction.pm	(revision 24799)
@@ -0,0 +1,202 @@
+###########################################################################
+#
+# imageaction.pm -- 
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2009 New Zealand Digital Library Project
+#
+# This program is free software; you can redistr   te it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package imageaction;
+
+use strict;
+
+use cgiactions::baseaction;
+use util;
+
+@imageaction::ISA = ('baseaction');
+
+
+my $action_table =
+{ 
+    "fit-screen" => { 'compulsory-args' => [ "pageWidth", "pageHeight", 
+					     "assocDir", "assocFile" ],
+		      'optional-args'   => [ "orientation" ] },
+
+};
+
+
+sub new 
+{
+    my $class = shift (@_);
+    my ($gsdl_cgi,$iis6_mode) = @_;
+
+    my $self = new baseaction($action_table,$gsdl_cgi,$iis6_mode);
+
+    return bless $self, $class;
+}
+
+
+
+sub get_mime_type
+{
+    my $self = shift @_;
+
+    my ($file) = @_;
+
+    my %image_mime_re = 
+    (
+	"gif"   => "image/gif",
+	"jpe?g" => "image/jpeg",
+	"png"   => "image/png",
+	"tiff?" => "image/tiff",
+	"bmp"   => "image/bmp"
+    );
+
+    my ($ext) = ($file =~ m/^.*\.(.*)?$/);
+
+    foreach my $re (keys %image_mime_re) {
+	if ($ext =~ m/^$re$/i) {
+	    return $image_mime_re{$re};
+	}
+    }
+
+    return undef;
+}
+
+
+
+
+sub fit_screen
+{
+    my $self = shift @_;
+
+    my $username  = $self->{'username'};
+    my $collect   = $self->{'collect'};
+    my $gsdl_cgi  = $self->{'gsdl_cgi'};
+    my $gsdlhome  = $self->{'gsdlhome'};
+
+
+    if ($baseaction::authentication_enabled) {
+	# Ensure the user is allowed to edit this collection
+	&authenticate_user($gsdl_cgi, $username, $collect);
+    }
+
+    my $site = $self->{'site'};
+    my $collect_directory = $gsdl_cgi->get_collection_dir($site);
+    #my $collect_directory = &util::filename_cat($gsdlhome, "collect");
+#    $gsdl_cgi->checked_chdir($collect_directory);
+
+
+#    # Make sure the collection isn't locked by someone else
+#
+
+    $self->lock_collection($username, $collect);
+
+    # look up additional args
+
+    my $pageWidth  = $self->{'pageWidth'};
+    my $pageHeight = $self->{'pageHeight'};
+    my $assocDir   = $self->{'assocDir'};
+    my $assocFile  = $self->{'assocFile'};
+
+    my $orientation = $self->{'orientation'};
+    $orientation = "portrait" if (!defined $orientation);
+
+    my $toplevel_assoc_dir
+	= &util::filename_cat($collect_directory,$collect,"index","assoc");
+    my $src_full_assoc_filename
+	= &util::filename_cat($toplevel_assoc_dir,$assocDir,$assocFile);
+
+    my $dst_width = $pageWidth;
+    my $dst_height = $pageHeight;
+
+    my $opt_ls = ($orientation eq "landscape") ? "-r" : "";
+    
+    my $dst_file = $dst_width."x".$dst_height."$opt_ls-$assocFile";
+
+    my $dst_full_assoc_filename
+	= &util::filename_cat($toplevel_assoc_dir,$assocDir,$dst_file);
+
+    # **** What if assoc folder is on read-only medium such as CD-ROM?
+    # Should really switch to using some collection specific tmp area
+    # => test if top_level assoc dir has write permission?
+
+    if (!-w $toplevel_assoc_dir) {
+	$gsdl_cgi->generate_error("Cannot write out resized image $dst_full_assoc_filename.");
+    }
+
+    # For now will assume it is writable
+
+    if (!-e $dst_full_assoc_filename) {
+	# generate resized image
+
+	# Better to make sure ImageMagick is installed 
+	
+        my $resize = "-filter Lanczos -resize $dst_width"."x"."$dst_height!";
+	# use of "!" forces convert to produce exactly these dimensions, rather
+	# than preserving aspect ratio.  In actual fact, it is intended that
+	# the width and height values passed in *do* preserve the aspect ratio
+	# Doing it this way makes it easier for the web browser to know (ahead of time) the
+	# width and height of the image that will be generated (useful for putting into
+	# <img> and <div> tags
+
+
+	my $cmd = "\"".&util::get_perl_exec()."\" -S gs-magick.pl convert \"$src_full_assoc_filename\" ";
+	$cmd .= "-rotate 90 " if ($orientation eq "landscape");
+
+	$cmd .= "$resize \"$dst_full_assoc_filename\"";
+
+	`$cmd`;
+
+	# generate resized image in assoc file area (if writable)
+	# otherwise in (collection's??) tmp directory
+    }
+
+    my $mime_type = $self->get_mime_type($dst_file);
+    
+    if (defined $mime_type) {
+	# now output it with suitable mime header
+	print STDOUT "Content-type:$mime_type\n\n";
+
+	if (open(IMGIN,"<$dst_full_assoc_filename")) {
+	    binmode IMGIN;
+	    binmode STDOUT;
+	    
+	    my $data;	     
+	    while (read(IMGIN,$data,1024) != 0) { 
+		print STDOUT $data;
+	    } 
+
+	    close(IMGIN);
+
+	    #system("cat \"$dst_full_assoc_filename\"");
+	}
+	else {
+	    $gsdl_cgi->generate_error("Unable to open $dst_full_assoc_filename for output");
+	}
+    }
+    else {
+	$gsdl_cgi->generate_error("Unrecognised image mime-type for $dst_file");
+    }
+
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cgiactions/indexaction.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cgiactions/indexaction.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cgiactions/indexaction.pm	(revision 24799)
@@ -0,0 +1,380 @@
+###########################################################################
+#
+# indexaction.pm -- 
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2009 New Zealand Digital Library Project
+#
+# This program is free software; you can redistr   te it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+
+package indexaction;
+
+
+use strict;
+use util;
+use cgiactions::baseaction;
+
+
+@indexaction::ISA = ('baseaction');
+
+# 'a' for action, and 'c' for collection are also compulsorary, and
+# added in automatically by baseaction
+
+my $action_table =
+{ 
+    "full-import"          => { 'compulsory-args' => [],
+				'optional-args'   => [] }, 
+    
+    "full-buildcol"        => { 'compulsory-args' => [],
+				'optional-args'   => [] },
+    
+    "full-rebuild"         => { 'compulsory-args' => [],
+				'optional-args'   => [] },
+    
+    
+    "incremental-import"   => { 'compulsory-args' => [],
+				'optional-args'   => [] }, 
+
+    "incremental-buildcol" => { 'compulsory-args' => [],
+				'optional-args'   => [] },
+    
+    "incremental-rebuild" => { 'compulsory-args' => [],
+			       'optional-args'   => [] }
+};
+
+
+sub new 
+{
+    my $class = shift (@_);
+    my ($gsdl_cgi,$iis6_mode) = @_;
+
+    my $self = new baseaction($action_table,$gsdl_cgi,$iis6_mode);
+
+    return bless $self, $class;
+}
+
+
+
+
+
+sub run_build_cmd
+{
+    my $self = shift @_;
+    my ($cmd) = @_;
+
+    my $collect   = $self->{'collect'};
+    my $gsdl_cgi  = $self->{'gsdl_cgi'};
+    my $gsdl_home  = $self->{'gsdlhome'};
+
+    my $output = `$cmd 2>&1`;
+    my $status = $?;
+    my $report = undef;
+
+    if ($status == 0) {
+	$report = "Perl build successful: $cmd\n--\n";
+	$report .= "$output\n";
+    }
+    else {
+	$report = "Perl rebuild failed: $cmd\n--\n";
+	$report .= "$output\n";
+	$report .= "Exit status: " . ($status / 256) . "\n";
+##	$report .= $gsdl_cgi->check_perl_home();
+
+#	$report .= "PATH = ". $ENV{'PATH'}. "\n";
+    }
+
+    return($status,$report);
+}
+
+sub full_import
+{
+    my $self = shift @_;
+
+    my $username  = $self->{'username'};
+    my $collect   = $self->{'collect'};
+    my $gsdl_cgi  = $self->{'gsdl_cgi'};
+    my $gsdl_home  = $self->{'gsdlhome'};
+
+    # Authenticate user if it is enabled
+    if ($baseaction::authentication_enabled) {
+	# Ensure the user is allowed to edit this collection
+	&authenticate_user($gsdl_cgi, $username, $collect);
+    }
+	
+    # Obtain the collect dir
+    my $collect_dir = &util::filename_cat($gsdl_home, "collect");
+
+    # Make sure the collection isn't locked by someone else
+    $self->lock_collection($username, $collect);
+
+    my $bin_script = &util::filename_cat($gsdl_home,"bin","script");
+    my $cmd = "\"".&util::get_perl_exec()."\" -S full-import.pl \"$collect\"";
+
+    my ($status,$report) = $self->run_build_cmd($cmd);
+   
+    # Release the lock once it is done
+    $self->unlock_collection($username, $collect);
+
+    if ($status==0) {
+	$gsdl_cgi->generate_ok_message($report);
+    }
+    else {
+	$gsdl_cgi->generate_error($report);
+    }
+
+}
+
+
+sub full_buildcol
+{
+    my $self = shift @_;
+
+    my $username  = $self->{'username'};
+    my $collect   = $self->{'collect'};
+    my $gsdl_cgi  = $self->{'gsdl_cgi'};
+    my $gsdl_home  = $self->{'gsdlhome'};
+
+    # Authenticate user if it is enabled
+    if ($baseaction::authentication_enabled) {
+	# Ensure the user is allowed to edit this collection
+	&authenticate_user($gsdl_cgi, $username, $collect);
+    }
+    
+    # Obtain the collect dir
+    my $collect_dir = &util::filename_cat($gsdl_home, "collect");
+
+    # Make sure the collection isn't locked by someone else
+    $self->lock_collection($username, $collect);
+
+    my $bin_script = &util::filename_cat($gsdl_home,"bin","script");
+    my $cmd = "\"".&util::get_perl_exec()."\" -S full-buildcol.pl \"$collect\"";
+
+    my ($status,$report) = $self->run_build_cmd($cmd);
+   
+    # Release the lock once it is done
+    $self->unlock_collection($username, $collect);
+
+    if ($status==0) {
+	$gsdl_cgi->generate_ok_message($report);
+    }
+    else {
+	$gsdl_cgi->generate_error($report);
+    }
+}
+
+
+sub full_rebuild
+{
+    my $self = shift @_;
+
+    my $username  = $self->{'username'};
+    my $collect   = $self->{'collect'};
+    my $gsdl_cgi  = $self->{'gsdl_cgi'};
+    my $gsdl_home  = $self->{'gsdlhome'};
+
+    # Authenticate user if it is enabled
+    if ($baseaction::authentication_enabled) {
+	# Ensure the user is allowed to edit this collection
+	&authenticate_user($gsdl_cgi, $username, $collect);
+    }
+	
+    # Obtain the collect dir
+    my $collect_dir = &util::filename_cat($gsdl_home, "collect");
+
+    # Make sure the collection isn't locked by someone else
+    $self->lock_collection($username, $collect);
+
+
+    my $bin_script = &util::filename_cat($gsdl_home,"bin","script");
+    my $cmd = "\"".&util::get_perl_exec()."\" -S full-rebuild.pl \"$collect\"";
+
+    my ($status,$report) = $self->run_build_cmd($cmd);
+   
+    # Release the lock once it is done
+    $self->unlock_collection($username, $collect);
+
+    if ($status==0) {
+	$gsdl_cgi->generate_ok_message($report);
+    }
+    else {
+	$gsdl_cgi->generate_error($report);
+    }
+}
+
+
+
+sub incremental_import
+{
+    my $self = shift @_;
+
+    my $username  = $self->{'username'};
+    my $collect   = $self->{'collect'};
+    my $gsdl_cgi  = $self->{'gsdl_cgi'};
+    my $gsdl_home  = $self->{'gsdlhome'};
+
+    # Authenticate user if it is enabled
+    if ($baseaction::authentication_enabled) {
+	# Ensure the user is allowed to edit this collection
+	&authenticate_user($gsdl_cgi, $username, $collect);
+    }
+	
+    # Obtain the collect dir
+    my $collect_dir = &util::filename_cat($gsdl_home, "collect");
+
+    # Make sure the collection isn't locked by someone else
+    $self->lock_collection($username, $collect);
+
+
+    my $bin_script = &util::filename_cat($gsdl_home,"bin","script");
+    my $cmd = "\"".&util::get_perl_exec()."\" -S incremental-import.pl \"$collect\"";
+
+    my ($status,$report) = $self->run_build_cmd($cmd);
+   
+    # Release the lock once it is done
+    $self->unlock_collection($username, $collect);
+
+    if ($status==0) {
+	$gsdl_cgi->generate_ok_message($report);
+    }
+    else {
+	$gsdl_cgi->generate_error($report);
+    }
+}
+
+
+sub incremental_buildcol
+{
+    my $self = shift @_;
+
+    my $username  = $self->{'username'};
+    my $collect   = $self->{'collect'};
+    my $gsdl_cgi  = $self->{'gsdl_cgi'};
+    my $gsdl_home  = $self->{'gsdlhome'};
+
+    # timestamp could turn out to be useful, but not used just now
+
+    # Authenticate user if it is enabled
+    if ($baseaction::authentication_enabled) {
+	# Ensure the user is allowed to edit this collection
+	&authenticate_user($gsdl_cgi, $username, $collect);
+    }
+    
+    # Obtain the collect dir
+    my $collect_dir = &util::filename_cat($gsdl_home, "collect");
+
+    # Make sure the collection isn't locked by someone else
+    $self->lock_collection($username, $collect);
+
+
+    my $bin_script = &util::filename_cat($gsdl_home,"bin","script");
+    my $cmd = "\"".&util::get_perl_exec()."\" -S incremental-buildcol.pl \"$collect\"";
+
+    my ($status,$report) = $self->run_build_cmd($cmd);
+   
+    # Release the lock once it is done
+    $self->unlock_collection($username, $collect);
+
+    if ($status==0) {
+	$gsdl_cgi->generate_ok_message($report);
+    }
+    else {
+	$gsdl_cgi->generate_error($report);
+    }
+}
+
+
+sub incremental_rebuild
+{
+    my $self = shift @_;
+
+    my $username  = $self->{'username'};
+    my $collect   = $self->{'collect'};
+    my $timestamp = $self->{'timestamp'};
+    my $site      = $self->{'site'};
+
+    my $gsdl_cgi  = $self->{'gsdl_cgi'};
+    my $gsdl_home  = $self->{'gsdlhome'};
+
+    # Authenticate user if it is enabled
+    if ($baseaction::authentication_enabled) {
+	# Ensure the user is allowed to edit this collection
+	&authenticate_user($gsdl_cgi, $username, $collect);
+    }
+	
+    # Make sure the collection isn't locked by someone else
+    $self->lock_collection($username, $collect);
+
+    my $cmd = "\"".&util::get_perl_exec()."\" -S incremental-rebuild.pl \"$collect\"";
+
+    my ($status,$report) = $self->run_build_cmd($cmd);
+   
+    # Release the lock once it is done
+    $self->unlock_collection($username, $collect);
+
+    if ($baseaction::mail_enabled) {
+	$self->send_mail("Remote Greenstone building event", "Incremental building of collection '$collect' complete.");
+    }
+
+    if ($status==0) {
+	$gsdl_cgi->generate_ok_message($report);
+    }
+    else {
+	$gsdl_cgi->generate_error($report);
+    }
+}
+
+
+
+
+sub incremental_rebuild_orig
+{
+    my $self = shift @_;
+
+    my $username  = $self->{'username'};
+    my $collect   = $self->{'collect'};
+    my $timestamp = $self->{'timestamp'};
+    my $site      = $self->{'site'};
+
+    my $gsdl_cgi  = $self->{'gsdl_cgi'};
+
+    # timestamp could turn out to be useful, but not used just now
+
+    # don't user authenticate for now
+    if ($baseaction::authentication_enabled) {
+	# Ensure the user is allowed to edit this collection
+	$self->authenticate_user($username, $collect);
+    }
+
+    # Make sure the collection isn't locked by someone else
+    $self->lock_collection($username, $collect, $site);
+
+    $self->run_script($collect,$site,"incremental-rebuild.pl");
+
+    if ($baseaction::mail_enabled) {
+	$self->send_mail("Remote Greenstone building event", "Build of collection '$collect' complete.");
+    }
+
+}
+
+
+
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cgiactions/metadataaction.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cgiactions/metadataaction.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cgiactions/metadataaction.pm	(revision 24799)
@@ -0,0 +1,1455 @@
+###########################################################################
+#
+# metadataaction.pm -- 
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2009 New Zealand Digital Library Project
+#
+# This program is free software; you can redistr   te it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package metadataaction;
+
+use strict;
+
+use cgiactions::baseaction;
+
+use dbutil;
+use ghtml;
+
+use JSON;
+
+
+BEGIN {
+#    unshift (@INC, "$ENV{'GSDLHOME'}/perllib/cpan/perl-5.8");
+    require XML::Rules;
+}
+
+
+@metadataaction::ISA = ('baseaction');
+
+
+my $action_table =
+{ 
+    "get-live-metadata"     => { 'compulsory-args' => [ "d", "metaname" ],
+			         'optional-args'   => [] }, 
+
+    "get-metadata"          => { 'compulsory-args' => [ "d", "metaname" ],
+			         'optional-args'   => [ "metapos" ] }, 
+
+    "set-live-metadata"     => { 'compulsory-args' => [ "d", "metaname", "metavalue" ],
+			         'optional-args'   => [ ] },
+
+    "set-metadata"          => { 'compulsory-args' => [ "d", "metaname", "metavalue" ],
+			         'optional-args'   => [ "metapos" ] },
+
+	"set-metadata-array"     => { 'compulsory-args' => [ "json" ],
+			         'optional-args'   => [ ] },
+					 
+    "set-archives-metadata" => { 'compulsory-args' => [ "d", "metaname", "metavalue" ],
+			         'optional-args'   => [ "metapos", "metamode" ]
+					  # metamode can be "accumulate", "override",
+				},
+
+    "set-archives-metadata-array" => { 'compulsory-args' => [ "json" ],
+			         'optional-args'   => [ "metamode" ]
+				},
+				
+    "set-import-metadata"   => { 'compulsory-args' => [ "metaname", "metavalue" ],
+			         'optional-args'   => [ "d", "f", "metamode" ]
+				    # metamode can be "accumulate", "override", or "unique-id"
+				 },
+
+
+    "remove-live-metadata"  => { 'compulsory-args' => [ "d", "metaname" ],
+			         'optional-args'   => [ ] },
+
+    "remove-metadata"       => { 'compulsory-args' => [ "d", "metaname" ],
+			         'optional-args'   => [ "metapos" ] },
+
+    "insert-metadata"       => { 'compulsory-args' => [ "d", "metaname", "metavalue" ],
+			         'optional-args'   => [ ]
+			       }
+};
+
+
+sub new 
+{
+    my $class = shift (@_);
+    my ($gsdl_cgi,$iis6_mode) = @_;
+
+    # Treat metavalue specially.  To transmit this through a GET request
+    # the Javascript side has url-encoded it, so here we need to decode
+    # it before proceeding
+
+    my $url_encoded_metavalue = $gsdl_cgi->param("metavalue");
+    my $url_decoded_metavalue = &unicode::url_decode($url_encoded_metavalue,1);
+
+    my $unicode_array = &unicode::utf82unicode($url_decoded_metavalue);
+
+    $url_decoded_metavalue = join("",map(chr($_),@$unicode_array));
+
+    $gsdl_cgi->param("metavalue",$url_decoded_metavalue);
+
+    my $self = new baseaction($action_table,$gsdl_cgi,$iis6_mode);
+
+    return bless $self, $class;
+}
+
+
+sub get_live_metadata
+{
+    my $self = shift @_;
+
+    my $username  = $self->{'username'};
+    my $collect   = $self->{'collect'};
+    my $gsdl_cgi  = $self->{'gsdl_cgi'};
+    my $gsdlhome  = $self->{'gsdlhome'};
+    my $infodbtype = $self->{'infodbtype'};
+	
+    # live metadata gets/saves value scoped (prefixed) by the current usename 
+    # so (for now) let's not bother to enforce authentication
+
+    # Obtain the collect dir
+	my $site = $self->{'site'};
+	my $collect_dir = $gsdl_cgi->get_collection_dir($site);
+    ## my $collect_dir = &util::filename_cat($gsdlhome, "collect");
+
+    # Make sure the collection isn't locked by someone else
+    $self->lock_collection($username, $collect);
+
+    # look up additional args
+    my $docid  = $self->{'d'};
+    if ((!defined $docid) || ($docid =~ m/^\s*$/)) {
+       $gsdl_cgi->generate_error("No docid (d=...) specified.");
+    }
+
+    # Generate the dbkey
+    my $metaname  = $self->{'metaname'};
+    my $dbkey = "$docid.$metaname";
+
+    # To people who know $collect_tail please add some comments
+    # Obtain path to the database
+    my $collect_tail = $collect;
+    $collect_tail =~ s/^.*[\/|\\]//;
+    my $index_text_directory = &util::filename_cat($collect_dir,$collect,"index","text");
+    my $infodb_file_path = &dbutil::get_infodb_file_path($infodbtype, "live-$collect_tail", $index_text_directory);
+    
+    # Obtain the content of the key
+    my $cmd = "gdbmget $infodb_file_path $dbkey";
+    if (open(GIN,"$cmd |") == 0) {
+        # Catch error if gdbmget failed
+	my $mess = "Failed to get metadata key: $metaname\n";
+	$mess .= "$!\n";
+
+	$gsdl_cgi->generate_error($mess);
+    }
+    else {
+	binmode(GIN,":utf8");
+        # Read everything in and concatenate them into $metavalue
+	my $metavalue = "";
+	my $line;
+	while (defined ($line=<GIN>)) {
+	    $metavalue .= $line;
+	}
+	close(GIN);
+	chomp($metavalue); # Get rid off the tailing newlines
+	$gsdl_cgi->generate_ok_message("$metavalue");
+    }
+
+    # Release the lock once it is done
+    $self->unlock_collection($username, $collect);
+}
+
+
+sub get_metadata
+{
+    my $self = shift @_;
+
+    my $username  = $self->{'username'};
+    my $collect   = $self->{'collect'};
+    my $gsdl_cgi  = $self->{'gsdl_cgi'};
+    my $gsdlhome  = $self->{'gsdlhome'};
+
+    # Authenticate user if it is enabled
+    if ($baseaction::authentication_enabled) {
+	# Ensure the user is allowed to edit this collection
+	&authenticate_user($gsdl_cgi, $username, $collect);
+    }
+
+    # Obtain the collect dir
+	my $site = $self->{'site'};
+	my $collect_dir = $gsdl_cgi->get_collection_dir($site);
+    ##my $collect_dir = &util::filename_cat($gsdlhome, "collect");
+
+    # Make sure the collection isn't locked by someone else
+    $self->lock_collection($username, $collect);
+
+    # look up additional args
+    my $docid     = $self->{'d'};
+    my $metaname  = $self->{'metaname'};
+    my $metapos   = $self->{'metapos'};
+    my $infodbtype = $self->{'infodbtype'};
+
+    # To people who know $collect_tail please add some comments
+    # Obtain path to the database
+    my $collect_tail = $collect;
+    $collect_tail =~ s/^.*[\/\\]//;
+    my $index_text_directory = &util::filename_cat($collect_dir,$collect,"index","text");
+    my $infodb_file_path = &dbutil::get_infodb_file_path($infodbtype, $collect_tail, $index_text_directory);
+
+    # Read the docid entry
+    my $doc_rec = &dbutil::read_infodb_entry($infodbtype, $infodb_file_path, $docid);
+  
+    # Basically loop through and unescape_html the values
+    foreach my $k (keys %$doc_rec) {
+	my @escaped_v = ();
+	foreach my $v (@{$doc_rec->{$k}}) {
+	    my $ev = &ghtml::unescape_html($v);
+	    push(@escaped_v, $ev);
+	}
+	$doc_rec->{$k} = \@escaped_v;
+    }
+
+    # Obtain the specified metadata value
+    $metapos = 0 if (!defined $metapos);
+    my $metavalue = $doc_rec->{$metaname}->[$metapos];
+    $gsdl_cgi->generate_ok_message("$metavalue");
+    
+    # Release the lock once it is done
+    $self->unlock_collection($username, $collect);
+}
+
+
+sub set_live_metadata
+{
+    my $self = shift @_;
+
+    my $username  = $self->{'username'};
+    my $collect   = $self->{'collect'};
+    my $gsdl_cgi  = $self->{'gsdl_cgi'};
+    my $gsdlhome  = $self->{'gsdlhome'};
+    my $infodbtype = $self->{'infodbtype'};
+  
+    if ($baseaction::authentication_enabled) {
+	# Ensure the user is allowed to edit this collection
+	&authenticate_user($gsdl_cgi, $username, $collect);
+    }
+
+    # Obtain the collect dir
+	my $site = $self->{'site'};
+	my $collect_dir = $gsdl_cgi->get_collection_dir($site);
+    ##my $collect_dir = &util::filename_cat($gsdlhome, "collect");
+
+    # Make sure the collection isn't locked by someone else
+    $self->lock_collection($username, $collect);
+
+    # look up additional args
+    my $docid     = $self->{'d'};
+    if ((!defined $docid) || ($docid =~ m/^\s*$/)) {
+      $gsdl_cgi->generate_error("No docid (d=...) specified.");
+    }
+    my $metavalue = $self->{'metavalue'};
+  
+
+    # Generate the dbkey    
+    my $metaname  = $self->{'metaname'};
+    my $dbkey = "$docid.$metaname";
+
+    # To people who know $collect_tail please add some comments
+    # Obtain path to the database
+    my $collect_tail = $collect;
+    $collect_tail =~ s/^.*[\/\\]//;
+    my $index_text_directory = &util::filename_cat($collect_dir,$collect,"index","text");
+    my $infodb_file_path = &dbutil::get_infodb_file_path($infodbtype, "live-$collect_tail", $index_text_directory);
+
+    # Set the new value
+    my $cmd = "gdbmset \"$infodb_file_path\" \"$dbkey\" \"$metavalue\"";
+    my $status = system($cmd);
+    if ($status != 0) {
+        # Catch error if gdbmget failed
+	my $mess = "Failed to set metadata key: $dbkey\n";
+
+	$mess .= "PATH: $ENV{'PATH'}\n";
+	$mess .= "cmd = $cmd\n";
+	$mess .= "Exit status: $status\n";
+	$mess .= "System Error Message: $!\n";
+
+	$gsdl_cgi->generate_error($mess);
+    }
+    else {
+	$gsdl_cgi->generate_ok_message("set-live-metadata successful: Key[$metaname]=$metavalue");
+    }
+    
+    # Release the lock once it is done
+    $self->unlock_collection($username, $collect);
+}
+
+sub set_metadata_entry
+{
+	my $self = shift @_;
+	my ($collect_dir,$collect,$infodbtype,$docid,$metaname,$metapos,$metavalue) = @_;
+	
+    # To people who know $collect_tail please add some comments
+    # Obtain path to the database
+    my $collect_tail = $collect;
+    $collect_tail =~ s/^.*[\/\\]//;
+    my $index_text_directory = &util::filename_cat($collect_dir,$collect,"index","text");
+    my $infodb_file_path = &dbutil::get_infodb_file_path($infodbtype, $collect_tail, $index_text_directory);
+	
+#	print STDERR "**** infodb file path = $infodb_file_path\n";
+#	print STDERR "***** infodb type = $infodbtype\n";
+	
+    # Read the docid entry
+    my $doc_rec = &dbutil::read_infodb_entry($infodbtype, $infodb_file_path, $docid);
+	
+    # Set the metadata value
+    if (defined $metapos) {
+		$doc_rec->{$metaname}->[$metapos] = $metavalue;
+    }
+    else {
+		$doc_rec->{$metaname} = [ $metavalue ];
+    }
+ 
+    my $status = &dbutil::set_infodb_entry($infodbtype, $infodb_file_path,$docid,$doc_rec);
+	
+	return $status;
+	
+}
+
+sub set_metadata
+{
+    my $self = shift @_;
+
+    my $username  = $self->{'username'};
+    my $collect   = $self->{'collect'};
+    my $gsdl_cgi  = $self->{'gsdl_cgi'};
+    my $gsdlhome  = $self->{'gsdlhome'};
+
+    if ($baseaction::authentication_enabled) {
+	# Ensure the user is allowed to edit this collection
+	&authenticate_user($gsdl_cgi, $username, $collect);
+    }
+
+	my $site = $self->{'site'};
+	my $collect_dir = $gsdl_cgi->get_collection_dir($site);
+	
+    $gsdl_cgi->checked_chdir($collect_dir);
+
+    # Obtain the collect dir
+    ## my $collect_dir = &util::filename_cat($gsdlhome, "collect");
+
+    # Make sure the collection isn't locked by someone else
+    $self->lock_collection($username, $collect);
+
+    # look up additional args
+    my $docid     = $self->{'d'};
+    my $metaname  = $self->{'metaname'};
+    my $metapos   = $self->{'metapos'};
+    my $metavalue = $self->{'metavalue'};
+    my $infodbtype = $self->{'infodbtype'};
+	
+	my $status = $self->set_metadata_entry($collect_dir,$collect,$infodbtype,$docid,$metaname,$metapos,$metavalue);
+	
+    if ($status != 0) {
+        # Catch error if set infodb entry failed
+	my $mess = "Failed to set metadata key: $docid\n";
+	
+	$mess .= "PATH: $ENV{'PATH'}\n";
+	$mess .= "Exit status: $status\n";
+	$mess .= "System Error Message: $!\n";
+	
+	$gsdl_cgi->generate_error($mess);
+    }
+    else {
+	my $mess = "set-metadata successful: Key[$docid]\n";
+	$mess .= "  $metaname";
+	$mess .= "->[$metapos]" if (defined $metapos);
+	$mess .= " = $metavalue";
+	
+	$gsdl_cgi->generate_ok_message($mess);
+    }
+    
+    # Release the lock once it is done
+    $self->unlock_collection($username, $collect);
+}
+
+
+
+
+sub set_metadata_array
+{
+    my $self = shift @_;
+
+    my $username  = $self->{'username'};
+    my $collect   = $self->{'collect'};
+    my $gsdl_cgi  = $self->{'gsdl_cgi'};
+    my $gsdlhome  = $self->{'gsdlhome'};
+
+    if ($baseaction::authentication_enabled) {
+	# Ensure the user is allowed to edit this collection
+	&authenticate_user($gsdl_cgi, $username, $collect);
+    }
+
+	my $site = $self->{'site'};
+	my $collect_dir = $gsdl_cgi->get_collection_dir($site);
+	
+    $gsdl_cgi->checked_chdir($collect_dir);
+
+    # Obtain the collect dir
+    ## my $collect_dir = &util::filename_cat($gsdlhome, "collect");
+
+    # Make sure the collection isn't locked by someone else
+    $self->lock_collection($username, $collect);
+
+    # look up additional args
+	
+	my $infodbtype = $self->{'infodbtype'};
+	
+	my $json_str      = $self->{'json'};
+	my $doc_array = decode_json $json_str;
+	
+	
+	my $global_status = 0;
+	my $global_mess = "";
+	
+	my @all_docids = ();
+	
+	foreach my $doc_array_rec ( @$doc_array ) {
+		
+		my $docid     = $doc_array_rec->{'docid'};
+		my $metaname  = $doc_array_rec->{'metaname'};
+		my $metapos   = $doc_array_rec->{'metapos'};
+		my $metavalue = $doc_array_rec->{'metavalue'};
+		
+		push(@all_docids,$docid);
+		
+		my $status = $self->set_metadata_entry($collect_dir,$collect,$infodbtype,$docid,$metaname,$metapos,$metavalue);	
+		
+		if ($status != 0) {
+			# Catch error if set infodb entry failed
+			$global_status = $status;
+			$global_mess .= "Failed to set metadata key: $docid\n";
+			$global_mess .= "Exit status: $status\n";
+			$global_mess .= "System Error Message: $!\n";
+			$global_mess .= "-" x 20;
+		}
+	}
+
+	if ($global_status != 0) {
+		$global_mess .= "PATH: $ENV{'PATH'}\n";
+		$gsdl_cgi->generate_error($global_mess);
+    }
+    else {
+		my $mess = "set-metadata-array successful: Keys[ ".join(", ",@all_docids)."]\n";
+		$gsdl_cgi->generate_ok_message($mess);
+    }
+    
+    # Release the lock once it is done
+    $self->unlock_collection($username, $collect);
+}
+
+
+
+sub dxml_metadata
+{
+    my ($tagname, $attrHash, $contextArray, $parentDataArray, $parser) = @_;
+    my $metaname = $parser->{'parameters'}->{'metaname'};
+    my $metamode = $parser->{'parameters'}->{'metamode'};
+    
+    my $opt_doc_secnum = $parser->{'parameters'}->{'secnum'};
+    
+    # Find the right metadata tag and checks if we are going to
+    # override it
+    #
+    # Note: This over writes the first metadata block it
+    # encountered. If there are multiple Sections in the doc.xml, it
+    # might not behave as you would expect
+
+    my $curr_secnum = $parser->{'parameters'}->{'curr_section_num'};
+##    print STDERR "**** checking $opt_doc_secnum <=> $curr_secnum\n";
+##    print STDERR "**** metamode = $metamode\n";
+    
+    if ((!defined $opt_doc_secnum) || ($opt_doc_secnum eq $curr_secnum)) {
+	my $name_attr = $attrHash->{'name'};
+	if (($name_attr eq $metaname) && ($metamode eq "override")) {
+##	    print STDERR "**** got match!!\n";
+	    # Get the value and override the current value
+	    my $metavalue = $parser->{'parameters'}->{'metavalue'};
+	    $attrHash->{'_content'} = $metavalue;
+	    
+	    # Don't want it to wipe out any other pieces of metadata
+	    $parser->{'parameters'}->{'metamode'} = "done";
+	}
+    }
+
+    # RAW is [$tagname => $attrHash] not $tagname => $attrHash!!
+    return [$tagname => $attrHash];
+}
+
+
+sub dxml_description
+{
+    my ($tagname, $attrHash, $contextArray, $parentDataArray, $parser) = @_;
+    my $metamode = $parser->{'parameters'}->{'metamode'};
+
+    # Accumulate the metadata
+    # NOTE: This appends new metadata element to all description fields.
+    # If there are multiple Sections/SubSections, the new metadata block will get appended to all of them
+    if (($metamode eq "accumulate") || ($metamode eq "override")) {
+	# If get to here and metamode is override, the this means there 
+	# was no existing value to overide => treat as an append operation
+
+	# Tack a new metadata tag on to the end of the <Metadata>+ block
+	my $metaname = $parser->{'parameters'}->{'metaname'};
+	my $metavalue = $parser->{'parameters'}->{'metavalue'};
+	
+	my $metadata_attr = { '_content' => $metavalue, 
+			      'name'     => $metaname, 
+			      'mode'     => "accumulate" };
+
+	my $append_metadata = [ "Metadata" => $metadata_attr ];
+	my $description_content = $attrHash->{'_content'};
+
+##	print STDERR "**** appending to doc.xml\n";
+
+	push(@$description_content,"    ", $append_metadata ,"\n        ");
+	$parser->{'parameters'}->{'metamode'} = "done";
+    }
+
+
+    # RAW is [$tagname => $attrHash] not $tagname => $attrHash!!
+    return [$tagname => $attrHash];
+}
+
+
+
+sub dxml_start_section
+{
+    my ($tagname, $attrHash, $contextArray, $parentDataArray, $parser) = @_;
+
+    my $new_depth = scalar(@$contextArray);
+
+    if ($new_depth == 1) {
+	$parser->{'parameters'}->{'curr_section_depth'} = 1;
+	$parser->{'parameters'}->{'curr_section_num'}   = "";
+    }
+
+    my $old_depth  = $parser->{'parameters'}->{'curr_section_depth'};
+    my $old_secnum = $parser->{'parameters'}->{'curr_section_num'};
+
+    my $new_secnum;
+
+    if ($new_depth > $old_depth) {
+	# child subsection
+	$new_secnum = "$old_secnum.1";
+    }
+    elsif ($new_depth == $old_depth) {
+	# sibling section => increase it's value by 1
+	my ($tail_num) = ($old_secnum =~ m/\.(\d+)$/);
+	$tail_num++;
+	$new_secnum = $old_secnum;
+	$new_secnum =~ s/\.(\d+)$/\.$tail_num/;
+    }
+    else {
+	# back up to parent section => lopp off tail
+	$new_secnum = $old_secnum;
+	$new_secnum =~ s/\.\d+$//;
+    }
+
+    $parser->{'parameters'}->{'curr_section_depth'} = $new_depth;
+    $parser->{'parameters'}->{'curr_section_num'}   = $new_secnum;
+
+    print STDERR "*** In Section: $new_secnum\n";
+}
+
+sub edit_xml_file
+{
+    my $self = shift @_;
+    my ($gsdl_cgi, $filename, $start_rules, $rules, $options) = @_;
+
+    # use XML::Rules to add it in (read in and out again)
+    my $parser = XML::Rules->new(start_rules     => $start_rules,
+				 rules           => $rules, 
+				 style           => 'filter',
+                                 output_encoding => 'utf8' );
+
+    my $xml_in = "";
+    if (!open(MIN,"<$filename")) {
+	$gsdl_cgi->generate_error("Unable to read in $filename: $!");
+    }
+    else {
+        # Read all the text in
+	my $line;
+	while (defined ($line=<MIN>)) {
+	    $xml_in .= $line;
+	}
+	close(MIN);
+	
+	my $MOUT;    
+	if (!open($MOUT,">$filename")) {
+	    $gsdl_cgi->generate_error("Unable to write out to $filename: $!");
+	}
+	else {
+	    # Matched lines will get handled by the call backs
+##	    my $xml_out = "";
+
+	    binmode($MOUT,":utf8");
+	    $parser->filter($xml_in,$MOUT, $options);
+
+#	    binmode(MOUT,":utf8");
+#	    print MOUT $xml_out;
+	    close($MOUT);	    
+	}
+    }
+}
+
+
+sub edit_doc_xml
+{
+    my $self = shift @_;
+    my ($gsdl_cgi, $doc_xml_filename, $metaname, $metavalue, $metapos, $metamode, $opt_secnum) = @_;
+
+    # To monitor which section/subsection number we are in
+    my @start_rules = 
+	( 'Section'    => \&dxml_start_section );
+
+    # use XML::Rules to add it in (read in and out again)
+    # Set the call back functions
+    my @rules = 
+	( _default => 'raw',
+	  'Metadata'    => \&dxml_metadata,
+	  'Description' => \&dxml_description);
+	  
+    # Sets the parameters
+    my $options = { 'metaname'  => $metaname,
+		    'metapos'   => $metapos,
+		    'metavalue' => $metavalue,
+		    'metamode'  => $metamode };
+			
+    if (defined $opt_secnum) {
+	$options->{'secnum'} = $opt_secnum;
+    }
+
+    $self->edit_xml_file($gsdl_cgi,$doc_xml_filename,\@start_rules,\@rules,$options);
+}
+
+sub set_archives_metadata_entry
+{
+  	my $self = shift @_;
+	my ($gsdl_cgi,$archive_dir, $collect_dir,$collect, $infodbtype,$docid,$metaname,$metapos,$metavalue,$metamode) = @_;
+	
+    # Obtain the doc.xml path for the specified docID
+    my ($docid_root,$docid_secnum) = ($docid =~ m/^(.*?)(\..*)?$/);
+
+    my $arcinfo_doc_filename = &dbutil::get_infodb_file_path($infodbtype, "archiveinf-doc", $archive_dir);
+    my $doc_rec = &dbutil::read_infodb_entry($infodbtype, $arcinfo_doc_filename, $docid_root);
+    my $doc_xml_file = $doc_rec->{'doc-file'}->[0];
+    
+    # The $doc_xml_file is relative to the archives, and now let's get the full path
+    my $archives_dir = &util::filename_cat($collect_dir,$collect,"archives");    
+    my $doc_xml_filename = &util::filename_cat($archives_dir,$doc_xml_file);
+    
+    # Edit the doc.xml file with the specified metadata name, value and position.
+    # TODO: there is a potential problem here as this edit_doc_xml function 
+    # is assuming the simple doc.xml situation where there is only one Section and no SubSections.
+    # Running import.pl -groupsize will cause this to have multiple sections in one doc.xml
+	
+	print STDERR "** away to call edit_doc_xml\n";
+	
+    $self->edit_doc_xml($gsdl_cgi,$doc_xml_filename,
+			$metaname,$metavalue,$metapos,$metamode,$docid_secnum);
+			
+	print STDERR "*** finished edit_doc_xml\n";
+	
+	return 0; # return 0 for now to indicate no error
+			
+}
+
+
+sub set_archives_metadata
+{
+    my $self = shift @_;
+
+    my $username  = $self->{'username'};
+    my $collect   = $self->{'collect'};
+    my $gsdl_cgi  = $self->{'gsdl_cgi'};
+    my $gsdlhome  = $self->{'gsdlhome'};
+    my $infodbtype = $self->{'infodbtype'};
+	
+
+	
+    if ($baseaction::authentication_enabled) {
+		# Ensure the user is allowed to edit this collection
+		$self->authenticate_user($username, $collect);
+    }
+
+	my $site = $self->{'site'};
+		
+	# Obtain the collect and archive dir   
+	my $collect_dir = $gsdl_cgi->get_collection_dir($site);	
+	
+    my $archive_dir = &util::filename_cat($collect_dir,$collect,"archives");
+
+    # Make sure the collection isn't locked by someone else
+    $self->lock_collection($username, $collect);
+
+    # look up additional args
+    my $docid  = $self->{'d'};
+    my $metaname   = $self->{'metaname'};
+    my $metavalue  = $self->{'metavalue'};
+	
+    my $metapos    = $self->{'metapos'};
+    $metapos = 0 if (!defined $metapos);
+
+    my $metamode   = $self->{'metamode'};
+    if ((!defined $metamode) || ($metamode =~ m/^\s*$/)) {
+	# make "accumulate" the default (less destructive, as won't actually 
+	# delete any existing values)
+	$metamode = "accumulate";
+    } 
+	
+	my $status = $self->set_archives_metadata_entry($gsdl_cgi,$archive_dir, $collect_dir,$collect, $infodbtype,$docid,
+				$metaname,$metapos,$metavalue,$metamode);
+   
+    # Release the lock once it is done
+    $self->unlock_collection($username, $collect);
+
+	if ($status == 0) {
+		my $mess = "set-archives-metadata successful: Key[$docid]\n";
+		$mess .= "  $metaname";
+		$mess .= "->[$metapos]" if (defined $metapos);
+		$mess .= " = $metavalue";
+		$mess .= " ($metamode)\n";
+	
+		$gsdl_cgi->generate_ok_message($mess);	
+	}
+	else {
+		my $mess .= "Failed to set archives metadata key: $docid\n";
+		$mess .= "Exit status: $status\n";
+		$mess .= "System Error Message: $!\n";
+		$mess .= "-" x 20 . "\n";
+		
+		$gsdl_cgi->generate_error($mess);
+	}
+}
+
+
+sub set_archives_metadata_array
+{
+    my $self = shift @_;
+
+    my $username  = $self->{'username'};
+    my $collect   = $self->{'collect'};
+    my $gsdl_cgi  = $self->{'gsdl_cgi'};
+    my $gsdlhome  = $self->{'gsdlhome'};
+
+    if ($baseaction::authentication_enabled) {
+	# Ensure the user is allowed to edit this collection
+	&authenticate_user($gsdl_cgi, $username, $collect);
+    }
+
+	my $site = $self->{'site'};
+	my $collect_dir = $gsdl_cgi->get_collection_dir($site);
+	
+    $gsdl_cgi->checked_chdir($collect_dir);
+
+    # Obtain the collect dir
+    ## my $collect_dir = &util::filename_cat($gsdlhome, "collect");
+
+    # Make sure the collection isn't locked by someone else
+    $self->lock_collection($username, $collect);
+
+    # look up additional args
+	
+	my $infodbtype = $self->{'infodbtype'};
+
+   my $archive_dir = &util::filename_cat($collect_dir,$collect,"archives");
+	
+	my $json_str      = $self->{'json'};
+	my $doc_array = decode_json $json_str;
+	
+	
+	my $global_status = 0;
+	my $global_mess = "";
+	
+	my @all_docids = ();
+	
+	foreach my $doc_array_rec ( @$doc_array ) {
+		
+		my $docid     = $doc_array_rec->{'docid'};
+		my $metaname  = $doc_array_rec->{'metaname'};
+		my $metapos   = $doc_array_rec->{'metapos'};
+		my $metamode   = $self->{'metamode'};
+		my $metavalue = $doc_array_rec->{'metavalue'};
+		
+		# Some sanity checks
+		$metapos = 0 if (!defined $metapos);
+			
+		if ((!defined $metamode) || ($metamode =~ m/^\s*$/)) {
+			# make "accumulate" the default (less destructive, as won't actually 
+			# delete any existing values)
+			$metamode = "accumulate";
+		} 
+	
+		push(@all_docids,$docid);
+		
+		my $status = $self->set_archives_metadata_entry($gsdl_cgi,$archive_dir, $collect_dir,$collect, $infodbtype,$docid,
+				$metaname,$metapos,$metavalue,$metamode);
+		
+		if ($status != 0) {
+			# Catch error if set infodb entry failed
+			$global_status = $status;
+			$global_mess .= "Failed to set metadata key: $docid\n";
+			$global_mess .= "Exit status: $status\n";
+			$global_mess .= "System Error Message: $!\n";
+			$global_mess .= "-" x 20 . "\n";
+		}
+	}
+
+	if ($global_status != 0) {
+		$global_mess .= "PATH: $ENV{'PATH'}\n";
+		$gsdl_cgi->generate_error($global_mess);
+    }
+    else {
+		my $mess = "set-archives-metadata-array successful: Keys[ ".join(", ",@all_docids)."]\n";
+		$gsdl_cgi->generate_ok_message($mess);
+    }
+    
+    # Release the lock once it is done
+    $self->unlock_collection($username, $collect);
+}
+
+
+sub mxml_metadata
+{
+    my ($tagname, $attrHash, $contextArray, $parentDataArray, $parser) = @_;
+    my $metaname = $parser->{'parameters'}->{'metaname'};
+    my $metamode = $parser->{'parameters'}->{'metamode'};
+
+    # Report error if we don't see FileName tag before this
+    die "Fatel Error: Unexpected metadata.xml structure. Undefind current_file, possiblely encountered Description before FileName" if (!defined($parser->{'parameters'}->{'current_file'}));
+    
+    # Don't do anything if we are not in the right FileSet
+    my $file_regexp = $parser->{'parameters'}->{'current_file'};
+    if ($file_regexp =~ /\.\*/) {
+	# Only interested in a file_regexp if it specifies precisely one
+	# file.  
+	# So, skip anything with a .* in it as it is too general
+	return [$tagname => $attrHash];
+    }
+    my $src_file = $parser->{'parameters'}->{'src_file'};
+    if (!($src_file =~ /$file_regexp/)) {
+	return [$tagname => $attrHash];
+    }
+##    print STDERR "*** mxl metamode = $metamode\n";
+
+    # Find the right metadata tag and checks if we are going to override it
+    my $name_attr = $attrHash->{'name'};
+    if (($name_attr eq $metaname) && ($metamode eq "override")) {
+        # Get the value and override the current value
+	my $metavalue = $parser->{'parameters'}->{'metavalue'};
+	$attrHash->{'_content'} = $metavalue;
+
+##	print STDERR "**** overrideing metadata.xml\n";
+
+	# Don't want it to wipe out any other pieces of metadata
+	$parser->{'parameters'}->{'metamode'} = "done";
+    }
+
+    # RAW is [$tagname => $attrHash] not $tagname => $attrHash!!
+    return [$tagname => $attrHash];
+}
+
+
+sub mxml_description
+{
+    my ($tagname, $attrHash, $contextArray, $parentDataArray, $parser) = @_;
+    my $metamode = $parser->{'parameters'}->{'metamode'};    
+
+    # Failed... Report error if we don't see FileName tag before this
+    die "Fatel Error: Unexpected metadata.xml structure. Undefind current_file, possiblely encountered Description before FileName" if (!defined($parser->{'parameters'}->{'current_file'}));
+
+    # Don't do anything if we are not in the right FileSet
+    my $file_regexp = $parser->{'parameters'}->{'current_file'};
+    if ($file_regexp =~ /\.\*/) {
+	# Only interested in a file_regexp if it specifies precisely one
+	# file.  
+	# So, skip anything with a .* in it as it is too general
+	return [$tagname => $attrHash];
+    }
+    my $src_file = $parser->{'parameters'}->{'src_file'};
+    if (!($src_file =~ /$file_regexp/)) {
+	return [$tagname => $attrHash];
+    }
+
+    # Accumulate the metadata block to the end of the description block
+    # Note: This adds metadata block to all description blocks, so if there are 
+    # multiple FileSets, it will add to all of them
+    if (($metamode eq "accumulate") || ($metamode eq "override")) {
+	# if metamode was "override" but get to here then it failed to
+	# find an item to override, in which case it should append its 
+	# value to the end, just like the "accumulate" mode
+
+	# tack a new metadata tag on to the end of the <Metadata>+ block
+	my $metaname = $parser->{'parameters'}->{'metaname'};
+	my $metavalue = $parser->{'parameters'}->{'metavalue'};
+	
+	my $metadata_attr = { '_content' => $metavalue, 
+			      'name'     => $metaname, 
+			      'mode'     => "accumulate" };
+
+	my $append_metadata = [ "Metadata" => $metadata_attr ];
+	my $description_content = $attrHash->{'_content'};
+
+##	print STDERR "*** appending to metadata.xml\n";
+
+	# append the new metadata element to the end of the current
+	# content contained inside this tag
+	push(@$description_content,"    ", $append_metadata ,"\n        ");
+
+	$parser->{'parameters'}->{'metamode'} = "done";
+    }
+
+    # RAW is [$tagname => $attrHash] not $tagname => $attrHash!!
+    return [$tagname => $attrHash];
+}
+
+
+sub mxml_filename
+{
+    my ($tagname, $attrHash, $contextArray, $parentDataArray, $parser) = @_;
+
+    # Store the filename of the Current Fileset
+    # Note: According to http://greenstone.org/dtd/DirectoryMetadata/1.0/DirectoryMetadata.dtd
+    # FileName tag must come before Description tag
+    $parser->{'parameters'}->{'current_file'} = $attrHash->{'_content'};
+
+    # RAW is [$tagname => $attrHash] not $tagname => $attrHash!!
+    return [$tagname => $attrHash];
+}
+
+
+sub mxml_fileset
+{
+    my ($tagname, $attrHash, $contextArray, $parentDataArray, $parser) = @_;
+
+    # Initilise the current_file
+    # Note: According to http://greenstone.org/dtd/DirectoryMetadata/1.0/DirectoryMetadata.dtd
+    # FileName tag must come before Description tag
+    $parser->{'parameters'}->{'current_file'} = "";
+
+    # RAW is [$tagname => $attrHash] not $tagname => $attrHash!!
+    return [$tagname => $attrHash];
+}
+
+
+sub edit_metadata_xml
+{
+    my $self = shift @_;
+    my ($gsdl_cgi, $metadata_xml_filename, $metaname, $metavalue, $metamode, $src_file) = @_;
+
+    # Set the call-back functions for the metadata tags
+    my @rules = 
+	( _default => 'raw',
+          'FileName' => \&mxml_filename,
+	  'Metadata' => \&mxml_metadata,
+	  'Description' => \&mxml_description,
+          'FileSet' => \&mxml_fileset);
+
+    # use XML::Rules to add it in (read in and out again)
+    my $parser = XML::Rules->new(rules => \@rules, 
+				 style => 'filter',
+                                 output_encoding => 'utf8');
+
+    my $xml_in = "";
+    if (!open(MIN,"<$metadata_xml_filename")) {
+	$gsdl_cgi->generate_error("Unable to read in $metadata_xml_filename: $!");
+    }
+    else {
+        # Read them in
+	my $line;
+	while (defined ($line=<MIN>)) {
+	    $xml_in .= $line;
+	}
+	close(MIN);	
+
+        # Filter with the call-back functions
+	my $xml_out = "";
+
+	my $MOUT;
+	if (!open($MOUT,">$metadata_xml_filename")) {
+	    $gsdl_cgi->generate_error("Unable to write out to $metadata_xml_filename: $!");
+	}
+	else {
+	    binmode($MOUT,":utf8");
+
+            # Some wise person please find out how to keep the DTD and encode lines in after it gets filtered by this XML::Rules
+            # At the moment, I will just hack it!
+            #my $header_with_utf8_dtd = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+	    #$header_with_utf8_dtd .= "<!DOCTYPE DirectoryMetadata SYSTEM \"http://greenstone.org/dtd/DirectoryMetadata/1.0/DirectoryMetadata.dtd\">";
+            #$xml_out =~ s/\<\?xml\sversion\=\"1.0\"\?\>/$header_with_utf8_dtd/;
+	    #print MOUT $xml_out;
+
+	    $parser->filter($xml_in, $MOUT, { metaname => $metaname,
+					      metavalue => $metavalue,
+					      metamode => $metamode,
+					      src_file => $src_file,
+					      current_file => undef} );
+	    close($MOUT);	    
+	}
+    }
+}
+
+
+sub set_import_metadata
+{
+    my $self = shift @_;
+    
+    my $username  = $self->{'username'};
+    my $collect   = $self->{'collect'};
+    my $gsdl_cgi  = $self->{'gsdl_cgi'};
+    my $gsdlhome  = $self->{'gsdlhome'};
+    my $infodbtype = $self->{'infodbtype'};
+	
+    if ($baseaction::authentication_enabled) {
+	# Ensure the user is allowed to edit this collection
+	$self->authenticate_user($username, $collect);
+    }
+
+
+    # Obtain the collect and archive dir    
+	my $site = $self->{'site'};
+	my $collect_dir = $gsdl_cgi->get_collection_dir($site);
+
+    ## my $collect_dir = &util::filename_cat($gsdlhome, "collect");
+    my $archive_dir = &util::filename_cat($collect_dir,$collect,"archives");
+
+    # Make sure the collection isn't locked by someone else
+    $self->lock_collection($username, $collect);
+    
+    # look up additional args
+    # want either d= or f=
+    my $docid  = $self->{'d'};
+    my $import_file  = $self->{'f'};
+    if ((!defined $docid) && (!defined $import_file)) {
+	$gsdl_cgi->generate_error("No docid (d=...) or import file (f=) specified.");
+    } 
+
+    # Get the parameters and set default mode to "accumulate"
+    my $metaname   = $self->{'metaname'};
+    my $metavalue  = $self->{'metavalue'};
+##    $metavalue =~ s/&amp;lt;(.*?)&amp;gt;/<$1>/g;
+    $metavalue =~ s/&lt;(.*?)&gt;/<$1>/g;
+    print STDERR "*** set import meta: val = $metavalue\n";
+    
+    my $metamode   = $self->{'metamode'};
+    if ((!defined $metamode) || ($metamode =~ m/^\s*$/)) {
+	# make "accumulate" the default (less destructive, as won't actually 
+	# delete any existing values)
+	$metamode = "accumulate";
+    }
+
+    # Obtain where the metadata.xml is from the archiveinfo-doc.gdb file
+    # If the doc oid is not specified, we assume the metadata.xml is next to the specified "f"
+    my $metadata_xml_file;
+    my $import_filename = undef;
+    if (defined $docid) {
+	my $arcinfo_doc_filename = &dbutil::get_infodb_file_path($infodbtype, "archiveinf-doc", $archive_dir);
+	my $doc_rec = &dbutil::read_infodb_entry($infodbtype, $arcinfo_doc_filename, $docid);
+
+	# This now stores the full pathname
+	$import_filename = $doc_rec->{'src-file'}->[0];	
+    }
+    else {
+        $import_filename = &util::filename_cat($collect_dir,$collect,$import_file);
+    }
+
+    # figure out correct metadata.xml file [?]
+    # Assuming the metadata.xml file is next to the source file
+    # Note: This will not work if it is using the inherited metadata from the parent folder
+    my ($import_tailname, $import_dirname) 
+	= File::Basename::fileparse($import_filename);
+    my $metadata_xml_filename = &util::filename_cat($import_dirname,"metadata.xml");
+
+    # Edit the metadata.xml
+    # Modified by Jeffrey from DL Consulting
+    # Handle the case where there is one metadata.xml file for multiple FileSets
+    # The XML filter needs to know whether it is in the right FileSet
+    # TODO: This doesn't fix the problem where the metadata.xml is not next to the src file.
+    # TODO: This doesn't handle the common metadata (where FileName doesn't point to a single file)
+    $self->edit_metadata_xml($gsdl_cgi, $metadata_xml_filename,
+                             $metaname, $metavalue, $metamode, $import_tailname);
+
+    # Release the lock once it is done
+    $self->unlock_collection($username, $collect);
+
+    my $mess = "set-import-metadata successful: Key[$docid] -> $metadata_xml_filename\n";
+    $mess .= "  $metaname";
+    $mess .= " = $metavalue";
+    $mess .= " ($metamode)\n";
+	
+    $gsdl_cgi->generate_ok_message($mess);
+    
+}
+
+
+sub remove_live_metadata
+{
+    my $self = shift @_;
+
+    my $username  = $self->{'username'};
+    my $collect   = $self->{'collect'};
+    my $gsdl_cgi  = $self->{'gsdl_cgi'};
+    my $gsdlhome  = $self->{'gsdlhome'};
+    my $infodbtype = $self->{'infodbtype'};
+	
+    if ($baseaction::authentication_enabled) {
+	# Ensure the user is allowed to edit this collection
+	&authenticate_user($gsdl_cgi, $username, $collect);
+    }
+
+    # Obtain the collect dir
+    ## my $collect_dir = &util::filename_cat($gsdlhome, "collect");
+	my $site = $self->{'site'};
+	my $collect_dir = $gsdl_cgi->get_collection_dir($site);
+
+    # Make sure the collection isn't locked by someone else
+    $self->lock_collection($username, $collect);
+
+    # look up additional args
+    my $docid     = $self->{'d'};
+    if ((!defined $docid) || ($docid =~ m/^\s*$/)) {
+      $gsdl_cgi->generate_error("No docid (d=...) specified.");
+    }
+    
+    # Generate the dbkey
+    my $metaname  = $self->{'metaname'};
+    my $dbkey = "$docid.$metaname";
+
+    # To people who know $collect_tail please add some comments
+    # Obtain the live gdbm_db path 
+    my $collect_tail = $collect;
+    $collect_tail =~ s/^.*[\/\\]//;
+    my $index_text_directory = &util::filename_cat($collect_dir,$collect,"index","text");
+    my $infodb_file_path = &dbutil::get_infodb_file_path($infodbtype, "live-$collect_tail", $index_text_directory);
+
+    # Remove the key
+    my $cmd = "gdbmdel \"$infodb_file_path\" \"$dbkey\"";
+    my $status = system($cmd);
+    if ($status != 0) {
+        # Catch error if gdbmdel failed
+	my $mess = "Failed to set metadata key: $dbkey\n";
+	
+	$mess .= "PATH: $ENV{'PATH'}\n";
+	$mess .= "cmd = $cmd\n";
+	$mess .= "Exit status: $status\n";
+	$mess .= "System Error Message: $!\n";
+
+	$gsdl_cgi->generate_error($mess);
+    }
+    else {
+	$gsdl_cgi->generate_ok_message("DB remove successful: Key[$metaname]");
+    }
+
+}
+
+
+sub remove_metadata
+{
+    my $self = shift @_;
+
+    my $username  = $self->{'username'};
+    my $collect   = $self->{'collect'};
+    my $gsdl_cgi  = $self->{'gsdl_cgi'};
+    my $gsdlhome  = $self->{'gsdlhome'};
+    my $infodbtype = $self->{'infodbtype'};
+	
+    if ($baseaction::authentication_enabled) {
+	# Ensure the user is allowed to edit this collection
+	&authenticate_user($gsdl_cgi, $username, $collect);
+    }
+
+    # Obtain the collect dir
+	my $site = $self->{'site'};
+	my $collect_dir = $gsdl_cgi->get_collection_dir($site);
+    ## my $collect_dir = &util::filename_cat($gsdlhome, "collect");
+
+    # Make sure the collection isn't locked by someone else
+    $self->lock_collection($username, $collect);
+
+    # look up additional args
+    my $docid     = $self->{'d'};
+    if ((!defined $docid) || ($docid =~ m/^\s*$/)) {
+      $gsdl_cgi->generate_error("No docid (d=...) specified.");
+    }
+    my $metaname  = $self->{'metaname'};
+    my $metapos   = $self->{'metapos'};
+
+    # To people who know $collect_tail please add some comments
+    # Obtain the path to the database
+    my $collect_tail = $collect;
+    $collect_tail =~ s/^.*[\/\\]//;
+    my $index_text_directory = &util::filename_cat($collect_dir,$collect,"index","text");
+    my $infodb_file_path = &dbutil::get_infodb_file_path($infodbtype, $collect_tail, $index_text_directory);
+
+    # Read the docid entry
+    my $doc_rec = &dbutil::read_infodb_entry($infodbtype, $infodb_file_path, $docid);
+
+    # Basically loop through and unescape_html the values
+    foreach my $k (keys %$doc_rec) {
+	my @escaped_v = ();
+	foreach my $v (@{$doc_rec->{$k}}) {
+	    if ($k eq "contains") {
+		# protect quotes in ".2;".3 etc
+		$v =~ s/\"/\\\"/g;
+		push(@escaped_v, $v);
+	    }
+	    else {
+		my $ev = &ghtml::unescape_html($v);
+		$ev =~ s/\"/\\\"/g;
+		push(@escaped_v, $ev);
+	    }
+	}
+	$doc_rec->{$k} = \@escaped_v;
+    }
+
+    # Check to make sure the key does exist
+    if (!defined ($doc_rec->{$metaname})) {
+        $gsdl_cgi->generate_error("No metadata field \"" . $metaname . "\" in the specified document: [" . $docid . "]");
+    }
+
+    # Obtain the specified metadata pos
+    $metapos = 0 if (!defined $metapos);
+
+    # consider check key is defined before deleting?
+    # Loop through the metadata array and ignore the specified position
+    my $filtered_metadata = [];
+    my $num_metadata_vals = scalar(@{$doc_rec->{$metaname}});    
+    for (my $i=0; $i<$num_metadata_vals; $i++) {
+	my $metavalue = shift(@{$doc_rec->{$metaname}});
+
+	if ($i != $metapos) {
+	    push(@$filtered_metadata,$metavalue)
+	}
+    }
+    $doc_rec->{$metaname} = $filtered_metadata;
+
+    # Turn the record back to string
+    my $serialized_doc_rec = &dbutil::convert_infodb_hash_to_string($doc_rec);
+
+    # Store it back to the database
+    my $cmd = "gdbmset \"$infodb_file_path\" \"$docid\" \"$serialized_doc_rec\"";
+    my $status = system($cmd);
+    if ($status != 0) {
+	my $mess = "Failed to set metadata key: $docid\n";
+	
+	$mess .= "PATH: $ENV{'PATH'}\n";
+	$mess .= "cmd = $cmd\n";
+	$mess .= "Exit status: $status\n";
+	$mess .= "System Error Message: $!\n";
+
+	$gsdl_cgi->generate_error($mess);
+    }
+    else {
+	my $mess = "DB set (with item deleted) successful: Key[$docid]\n";
+	$mess .= "  $metaname";
+	$mess .= "->[$metapos]" if (defined $metapos);
+
+	$gsdl_cgi->generate_ok_message($mess);
+    }
+}
+
+
+# Was trying to reused the codes, but the functions need to be broken
+# down more before they can be reused, otherwise there will be too
+# much overhead and duplicate process...
+sub insert_metadata
+{
+    my $self = shift @_;
+    
+    my $username  = $self->{'username'};
+    my $collect   = $self->{'collect'};
+    my $gsdl_cgi  = $self->{'gsdl_cgi'};
+    my $gsdlhome  = $self->{'gsdlhome'};
+    my $infodbtype = $self->{'infodbtype'};
+	
+    # If the import metadata and gdbm database have been updated, we
+    # need to insert some notification to warn user that the the text
+    # they see at the moment is not indexed and require a rebuild.
+    my $rebuild_pending_macro = "_rebuildpendingmessage_";
+
+    if ($baseaction::authentication_enabled) {
+	# Ensure the user is allowed to edit this collection
+	$self->authenticate_user($username, $collect);
+    }
+
+    # Obtain the collect and archive dir   
+	my $site = $self->{'site'};
+	my $collect_dir = $gsdl_cgi->get_collection_dir($site);
+    ##my $collect_dir = &util::filename_cat($gsdlhome, "collect");
+    my $archive_dir = &util::filename_cat($collect_dir,$collect,"archives");
+
+    # Make sure the collection isn't locked by someone else
+    $self->lock_collection($username, $collect);
+    
+    # Check additional args
+    my $docid = $self->{'d'};
+    if (!defined($docid)) {
+	$gsdl_cgi->generate_error("No document id is specified: d=...");
+    } 
+    my $metaname = $self->{'metaname'};
+    if (!defined($metaname)) {
+	$gsdl_cgi->generate_error("No metaname is specified: metadataname=...");
+    } 
+    my $metavalue = $self->{'metavalue'};
+    if (!defined($metavalue) || $metavalue eq "") {
+	$gsdl_cgi->generate_error("No metavalue or empty metavalue is specified: metadataname=...");
+    } 
+    # make "accumulate" the default (less destructive, as won't actually 
+    # delete any existing values)
+    my $metamode = "accumulate";
+
+    #=======================================================================#
+    # set_import_metadata [START]
+    #=======================================================================#
+    # Obtain where the metadata.xml is from the archiveinfo-doc.gdb file
+    # If the doc oid is not specified, we assume the metadata.xml is next to the specified "f"
+    my $metadata_xml_file;
+    my $arcinfo_doc_filename = &dbutil::get_infodb_file_path($infodbtype, "archiveinf-doc", $archive_dir);
+    my $archive_doc_rec = &dbutil::read_infodb_entry($infodbtype, $arcinfo_doc_filename, $docid);
+    
+    # This now stores the full pathname
+    my $import_filename = $archive_doc_rec->{'src-file'}->[0];
+    
+    # figure out correct metadata.xml file [?]
+    # Assuming the metadata.xml file is next to the source file
+    # Note: This will not work if it is using the inherited metadata from the parent folder
+    my ($import_tailname, $import_dirname) 
+	= File::Basename::fileparse($import_filename);
+    my $metadata_xml_filename = &util::filename_cat($import_dirname,"metadata.xml");
+
+    # Shane's escape characters
+    $metavalue = pack "U0C*", unpack "C*", $metavalue;
+    $metavalue =~ s/\,/&#44;/g;
+    $metavalue =~ s/\:/&#58;/g;
+    $metavalue =~ s/\|/&#124;/g;
+    $metavalue =~ s/\(/&#40;/g;
+    $metavalue =~ s/\)/&#41;/g;
+    $metavalue =~ s/\[/&#91;/g;
+    $metavalue =~ s/\\/&#92;/g;
+    $metavalue =~ s/\]/&#93;/g;
+    $metavalue =~ s/\{/&#123;/g;
+    $metavalue =~ s/\}/&#125;/g;
+    $metavalue =~ s/\"/&#34;/g;
+    $metavalue =~ s/\`/&#96;/g;
+    $metavalue =~ s/\n/_newline_/g;
+
+    # Edit the metadata.xml
+    # Modified by Jeffrey from DL Consulting
+    # Handle the case where there is one metadata.xml file for multiple FileSets
+    # The XML filter needs to know whether it is in the right FileSet
+    # TODO: This doesn't fix the problem where the metadata.xml is not next to the src file.
+    # TODO: This doesn't handle the common metadata (where FileName doesn't point to a single file)
+    $self->edit_metadata_xml($gsdl_cgi, $metadata_xml_filename,
+                             $metaname, $metavalue, $metamode, $import_tailname);
+    #=======================================================================#
+    # set_import_metadata [END]
+    #=======================================================================#
+
+
+    #=======================================================================#
+    # set_metadata (accumulate version) [START]
+    #=======================================================================#
+    # To people who know $collect_tail please add some comments
+    # Obtain path to the database
+    my $collect_tail = $collect;
+    $collect_tail =~ s/^.*[\/\\]//;
+    my $index_text_directory = &util::filename_cat($collect_dir,$collect,"index","text");
+    my $infodb_file_path = &dbutil::get_infodb_file_path($infodbtype, $collect_tail, $index_text_directory);
+
+    # Read the docid entry
+    my $doc_rec = &dbutil::read_infodb_entry($infodbtype, $infodb_file_path, $docid);
+   
+    foreach my $k (keys %$doc_rec) {
+	my @escaped_v = ();
+	foreach my $v (@{$doc_rec->{$k}}) {
+	    if ($k eq "contains") {
+		# protect quotes in ".2;".3 etc
+		$v =~ s/\"/\\\"/g;
+		push(@escaped_v, $v);
+	    }
+	    else {
+		my $ev = &ghtml::unescape_html($v);
+		$ev =~ s/\"/\\\"/g;
+		push(@escaped_v, $ev);
+	    }
+	}
+	$doc_rec->{$k} = \@escaped_v;
+    }
+
+    # Protect the quotes
+    $metavalue =~ s/\"/\\\"/g;
+
+    # Adds the pending macro
+    my $macro_metavalue = $rebuild_pending_macro . $metavalue;
+
+    # If the metadata doesn't exist, create a new one
+    if (!defined($doc_rec->{$metaname})){    
+	$doc_rec->{$metaname} = [ $macro_metavalue ];
+    }
+    # Else, let's acculumate the values
+    else {
+        push(@{$doc_rec->{$metaname}},$macro_metavalue);
+    }
+
+    # Generate the record string
+    my $serialized_doc_rec = &dbutil::convert_infodb_hash_to_string($doc_rec);
+
+    # Store it into GDBM
+    my $cmd = "gdbmset \"$infodb_file_path\" \"$docid\" \"$serialized_doc_rec\"";
+    my $status = system($cmd);
+    if ($status != 0) {
+        # Catch error if gdbmget failed
+	my $mess = "Failed to set metadata key: $docid\n";
+	
+	$mess .= "PATH: $ENV{'PATH'}\n";
+	$mess .= "cmd = $cmd\n";
+	$mess .= "Exit status: $status\n";
+	$mess .= "System Error Message: $!\n";
+
+	$gsdl_cgi->generate_error($mess);
+    }
+    else {
+	my $mess = "insert-metadata successful: Key[$docid]\n";
+	$mess .= "  [In metadata.xml] $metaname";
+	$mess .= " = $metavalue\n";
+	$mess .= "  [In database] $metaname";
+	$mess .= " = $macro_metavalue\n";
+	$mess .= "  The new text has not been indexed, rebuilding collection is required\n";
+        $gsdl_cgi->generate_ok_message($mess);
+    }    
+    #=======================================================================#
+    # set_metadata (accumulate version) [END]
+    #=======================================================================#
+
+    # Release the lock once it is done
+    $self->unlock_collection($username, $collect);
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cgiactions/ocraction.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cgiactions/ocraction.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cgiactions/ocraction.pm	(revision 24799)
@@ -0,0 +1,87 @@
+package ocraction;
+
+use strict;
+
+use cgiactions::baseaction;
+
+use dbutil;
+use ghtml;
+
+
+BEGIN {
+#    unshift (@INC, "$ENV{'GSDLHOME'}/perllib/cpan/perl-5.8");
+    require XML::Rules;
+}
+
+
+@ocraction::ISA = ('baseaction');
+
+my $action_table =
+{ 
+    "preformOcr"     => { 'compulsory-args' => [ "d", "imagename" ],
+			         'optional-args'   => [] },
+	"setText"		 =>	{ 'compulsory-args' => [ "d", "newtext" ],
+					 'optional-args'   => [] }
+};
+
+sub new 
+{
+    my $class = shift (@_);
+    my ($gsdl_cgi,$iis6_mode) = @_;
+
+    my $self = new baseaction($action_table,$gsdl_cgi,$iis6_mode);
+
+    return bless $self, $class;
+}
+
+sub preformOcr
+{
+	my $self = shift @_;
+
+	my $collection = $self->{'collect'};
+	my $site = $self->{'site'};
+	my $gsdl_cgi  = $self->{'gsdl_cgi'};
+	
+	my $docId = $self->{'d'};
+	my $imagename = $self->{'imagename'};
+
+	# Change URL style '/' to Windows style
+	$imagename =~ s/\//\\/g;
+
+	my $indexDir = "C:\\Users\\Bryce\\Desktop\\Research\\greenstone3-svn-bryce64\\web\\sites\\localsite\\collect\\jonesmin\\";
+	##my $hashDir = $archivesDir . substr($docId,0,8) . ".dir\\";
+
+	my $imageFile = $indexDir . $imagename;
+
+	my $outputFile = $ENV{'TEMP'} . "\\out";
+	my $cmd = "tesseract $imageFile $outputFile";
+	## print STDERR "\n\n CMD=\n$cmd \n\n";
+
+	my $status = system($cmd);
+	if($status != 0) { print STDERR "\n\n Fail to run \n $cmd \n $! \n\n"; }
+	if (open (FILE, "<$outputFile" . ".txt")==0) {
+		$gsdl_cgi->generate_error("Unable to open file containing OCR'd text:<br> $!");
+		return;
+	}
+		
+	my $result = "";
+	my $line;
+	while(defined ($line=<FILE>)) {
+		$result .= $line;
+	}
+	close FILE;
+	unlink($outputFile . ".txt");
+	
+	$gsdl_cgi->generate_ok_message($result);
+}
+
+sub setText
+{
+	my $self = shift @_;
+	my $collection = $self->{'collect'};
+	my $site = $self->{'site'};
+	my $docId = $self->{'d'};
+	my $newtext = $self->{'newtext'};
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify.pm	(revision 24799)
@@ -0,0 +1,510 @@
+###########################################################################
+#
+# classify.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# functions to handle classifiers
+
+package classify;
+
+require util;
+require AllList;
+
+use dbutil;
+use gsprintf;
+use strict; no strict 'subs';
+
+
+sub gsprintf
+{
+    return &gsprintf::gsprintf(@_);
+}
+
+
+sub load_classifier_for_info {
+    my ($classifier) = shift @_;
+
+    # find the classifier
+#    my $customclassname;
+#    if (defined($ENV{'GSDLCOLLECTION'}))
+#    {
+#	$customclassname = &util::filename_cat($ENV{'GSDLCOLLECTDIR'}, "custom", $ENV{'GSDLCOLLECTION'},
+#                                              "perllib", "classify", "${classifier}.pm");
+#    }
+#    my $colclassname = &util::filename_cat($ENV{'GSDLCOLLECTDIR'}, "perllib", "classify", "${classifier}.pm");
+#    my $mainclassname = &util::filename_cat($ENV{'GSDLHOME'}, "perllib", "classify", "${classifier}.pm");
+#
+#    if (defined($customclassname) && -e $customclassname) { require $customclassname; }
+#    elsif (-e $colclassname) { require $colclassname; }
+#    elsif (-e $mainclassname) { require $mainclassname; }
+#    else {
+#	&gsprintf(STDERR, "{classify.could_not_find_classifier}\n", $classifier) && die "\n";
+#    }
+
+    # = Extensions Support =
+    # Used to have hardcoded list of places to load classifier from. We should,
+    # instead, try loading from all of the perllib places on the library path.
+    # Special cases nedded for collection specific and custom classifier.
+    my @possible_class_paths;
+    if (defined($ENV{'GSDLCOLLECTION'}))
+    {
+      push(@possible_class_paths, &util::filename_cat($ENV{'GSDLCOLLECTDIR'}, 'custom', $ENV{'GSDLCOLLECTION'}, 'perllib', 'classify', $classifier . '.pm'));
+    }
+    # (why does GSDLCOLLECTDIR get set to GSDLHOME for classinfo calls?)
+    if ($ENV{'GSDLCOLLECTDIR'} ne $ENV{'GSDLHOME'})
+    {
+      push(@possible_class_paths, &util::filename_cat($ENV{'GSDLCOLLECTDIR'}, 'perllib', 'classify', $classifier . '.pm'));
+    }
+    foreach my $library_path (@INC)
+    {
+      # only interested in classify paths found in the library paths
+      if ($library_path =~ /classify$/)
+      {
+       push(@possible_class_paths, &util::filename_cat($library_path, $classifier . '.pm'));
+      }
+    }
+    my $found_class = 0;
+    foreach my $possible_class_path (@possible_class_paths)
+    {
+      if (-e $possible_class_path)
+      {
+        require $possible_class_path;
+        $found_class = 1;
+        last;
+      }
+    }
+    if (!$found_class)
+    {
+      &gsprintf(STDERR, "{classify.could_not_find_classifier}\n", $classifier) && die "\n";
+    }
+
+    my ($classobj);
+    my $options = "-gsdlinfo";
+    eval ("\$classobj = new \$classifier([],[$options])");
+    die "$@" if $@;
+
+    return $classobj;
+}
+
+sub load_classifiers {
+    my ($classify_list, $build_dir, $outhandle) = @_;
+    my @classify_objects = ();
+    my $classify_number  = 1;
+
+    my $colclassdir = &util::filename_cat($ENV{'GSDLCOLLECTDIR'},"perllib/classify");
+    my $inc_paths = join(':',@INC);
+    if ($inc_paths !~ /$colclassdir/)
+    {
+      unshift (@INC, $colclassdir); # [jmt12]
+    }
+
+    foreach my $classifyoption (@$classify_list) {
+
+	# get the classifier name
+	my $classname = shift @$classifyoption;
+	next unless defined $classname;
+
+	# find the classifier
+#        my $customclassname = &util::filename_cat($ENV{'GSDLCOLLECTDIR'}, "custom", $ENV{'GSDLCOLLECTION'},
+#                                                  "perllib", "classify", "${classname}.pm");
+#        my $colclassname = &util::filename_cat($ENV{'GSDLCOLLECTDIR'}, "perllib", "classify", "${classname}.pm");
+#        my $mainclassname = &util::filename_cat($ENV{'GSDLHOME'}, "perllib", "classify", "${classname}.pm");
+
+#	if (-e $customclassname) { require $customclassname; }
+#	elsif (-e $colclassname) { require $colclassname; }
+#	elsif (-e $mainclassname) { require $mainclassname; }
+#	else { &gsprintf(STDERR, "{classify.could_not_find_classifier}\n", $classname) && die "\n";
+	       # die "ERROR - couldn't find classifier \"$classname\"\n";
+#        }
+
+        # = Extensions Support =
+        # Used to have hardcoded list of places to load classifier from. We
+        # should, instead, try loading from all of the perllib places on the
+        # library path. Special cases nedded for collection specific and custom
+        # classifier. [jmt12]
+        my @possible_class_paths;
+        if (defined($ENV{'GSDLCOLLECTION'}))
+        {
+          push(@possible_class_paths, &util::filename_cat($ENV{'GSDLCOLLECTDIR'}, 'custom', $ENV{'GSDLCOLLECTION'}, 'perllib', 'classify', $classname . '.pm'));
+        }
+        #push(@possible_class_paths,&util::filename_cat($ENV{'GSDLCOLLECTDIR'}, 'perllib', 'classify', $classname . '.pm'));
+        # (why is the collection specific classify path in INC multiple times?)
+        foreach my $library_path (@INC)
+        {
+          # only interested in classify paths found in the library paths
+          if ($library_path =~ /classify$/)
+          {
+            push(@possible_class_paths, &util::filename_cat($library_path, $classname . '.pm'));
+          }
+        }
+        my $found_class = 0;
+        foreach my $possible_class_path (@possible_class_paths)
+        {
+          if (-e $possible_class_path)
+          {
+            require $possible_class_path;
+            $found_class = 1;
+            last;
+          }
+        }
+        if (!$found_class)
+        {
+          &gsprintf(STDERR, "{classify.could_not_find_classifier}\n", $classname) && die "\n";
+        }
+
+	# create the classify object
+	my ($classobj);
+
+	my @newoptions;
+
+	# do these first so they can be overriden by user supplied options
+	push @newoptions, "-builddir", "$build_dir" if ($build_dir);
+	push @newoptions, "-outhandle", "$outhandle" if ($outhandle);
+	push @newoptions, "-verbosity", "2";
+
+	# backwards compatability hack: if the classifier options are 
+	# in "x=y" format, convert them to parsearg ("-x y") format.
+	my ($opt, $key, $value);
+	foreach $opt (@$classifyoption) {
+	    # if ($opt =~ /^(\w+)=(.*)$/) {
+	    #	push @newoptions, "-$1", $2;
+	    # } else {
+		push @newoptions, $opt;
+	    #}
+	}
+
+	map { $_ = "\"$_\""; } @newoptions;
+	my $options .= join (",", @newoptions);
+
+
+	eval ("\$classobj = new \$classname([],[$options])");
+	die "$@" if $@;
+
+	$classobj->set_number($classify_number);
+	$classify_number ++;
+
+       	# add this object to the list
+	push (@classify_objects, $classobj);
+    }
+
+    my ($classobj);
+    eval ("\$classobj = new AllList()");
+    die "$@" if $@;
+    push (@classify_objects, $classobj);
+
+    return \@classify_objects;
+}
+
+# init_classifiers resets all the classifiers and readys them to process
+# the documents.
+sub init_classifiers {
+    my ($classifiers) = @_;
+    
+    foreach my $classobj (@$classifiers) {
+	$classobj->init();
+    }
+}
+
+
+
+# takes a hashref containing the metadata for an infodb entry, and extracts 
+# the childrens numbers (from the 'contains' entry).	
+# assumes format is ".1;".2;".3
+sub get_children {	
+    my ($doc_db_hash) = @_; 
+
+    my $children = undef;
+
+    my $contains = $doc_db_hash->{'contains'};
+    if (defined ($contains)) {
+	$contains =~ s/\@$//;  #remove trailing @
+	$contains =~ s/^\"\.//; #remove initial ".
+	@$children = split /\;\"\./, $contains;
+    }
+
+    return $children;
+}
+
+    
+sub recurse_sections {
+    my ($doc_obj, $children, $parentoid, $parentsection, $database_recs) = @_;
+
+    return if (!defined $children);
+
+    foreach my $child (sort { $a <=> $b} @$children) {
+	$doc_obj->create_named_section("$parentsection.$child");
+	my $doc_db_rec = $database_recs->{"$parentoid.$child"};
+	my $doc_db_hash = db_rec_to_hash($doc_db_rec);
+
+	# get child's children
+	my $newchildren = &get_children($doc_db_hash); 
+
+	# add content for current section
+	add_section_content($doc_obj, "$parentsection.$child", $doc_db_hash);
+
+	# process all the children if there are any
+	if (defined ($newchildren))
+	{
+	    recurse_sections($doc_obj, $newchildren, "$parentoid.$child", 
+			     "$parentsection.$child", $database_recs);
+	}
+    }
+}					     
+
+
+sub add_section_content {
+    my ($doc_obj, $cursection, $doc_db_hash) = @_;
+ 
+    foreach my $key (keys %$doc_db_hash) {
+	#don't need to store these metadata
+	next if $key =~ /(thistype|childtype|contains|docnum|doctype|classifytype)/i;
+	# but do want things like hastxt and archivedir
+	my @items = split /@/, $doc_db_hash->{$key};
+	# metadata is all from the info database so should already be in utf8
+	map {$doc_obj->add_utf8_metadata ($cursection, $key, $_); } @items;
+
+    }
+}
+
+
+# gets all the metadata from an infodb entry, and puts it into a hashref
+sub db_rec_to_hash {
+    
+    my ($infodb_str_ref) = @_;
+
+    my $hashref = {};
+
+    my @entries = split(/\n/, $infodb_str_ref);
+    foreach my $entry (@entries) {
+	my($key, $value) = ($entry =~ /^<([^>]*)>(.*?)$/ );
+	$hashref->{$key} .= '@' if defined $hashref->{$key};
+	$hashref->{$key} .= $value;
+	
+    }
+   
+    return $hashref;
+}					  
+
+
+sub reconstruct_doc_objs_metadata
+{
+    my $infodb_type = shift(@_);
+    my $infodb_file_path = shift(@_);
+    my $database_recs = shift(@_);
+
+    # dig out top level doc sections
+    my %top_sections = ();
+    my %top_docnums = ();
+    foreach my $key ( keys %$database_recs )
+    {
+	my $md_rec = $database_recs->{$key};
+	my $md_hash = db_rec_to_hash($md_rec);
+
+	if ((defined $md_hash->{'doctype'}) && ($md_hash->{'doctype'} eq "doc")) {
+	    next if ($key =~ m/\./);
+	    $top_sections{$key} = $md_hash;
+	    $top_docnums{$key} = $md_hash->{'docnum'};
+	}
+    }
+
+    # for greenstone document objects based on metadata in database file
+    my @all_docs = ();
+    # we need to make sure the documents were processed in the same order as
+    # before, so sort based on their docnums
+    foreach my $oid ( sort { $top_docnums{$a} <=> $top_docnums{$b} } keys %top_sections )
+    {
+	my $doc_db_hash = $top_sections{$oid};
+
+	my $doc_obj = new doc();
+	$doc_obj->set_OID($oid);
+	my $top = $doc_obj->get_top_section();
+        add_section_content ($doc_obj, $top, $doc_db_hash);
+        my $children = &get_children($doc_db_hash);
+        recurse_sections($doc_obj, $children, $oid, $top, $database_recs);
+
+	push(@all_docs,$doc_obj);
+    }    
+
+    return \@all_docs;   
+}
+
+
+
+
+
+# classify_doc lets each of the classifiers classify a document
+sub classify_doc {
+    my ($classifiers, $doc_obj) = @_;
+
+    foreach my $classobj (@$classifiers) {
+	my $title = $classobj->{'title'};
+
+	$classobj->classify($doc_obj);
+    }
+}
+
+
+our $next_classify_num = 1;
+
+# output_classify_info outputs all the info needed for the classification
+# to the database
+sub output_classify_info
+{
+    my ($classifiers, $infodb_type, $infodb_handle, $remove_empty_classifications, $gli) = @_;
+
+    $gli = 0 unless defined $gli;
+
+    # create a classification containing all the info
+    my $classifyinfo = { 'classifyOID'=> 'browse',
+			 'contains' => [] };
+
+    # get each of the classifications
+    foreach my $classifier (@$classifiers)
+    {
+	my $classifier_info = $classifier->get_classify_info($gli);
+	$classifier_info->{'classifyOID'} = "CL$next_classify_num" unless defined($classifier_info->{'classifyOID'});
+        print STDERR "*** outputting information for classifier: $classifier_info->{'classifyOID'}\n";
+
+	push(@{$classifyinfo->{'contains'}}, $classifier_info);
+	$next_classify_num++;
+    }
+
+    &print_classify_info($infodb_type, $infodb_handle, $classifyinfo, "", $remove_empty_classifications);
+}
+
+
+sub print_classify_info
+{
+    my ($infodb_type, $infodb_handle, $classifyinfo, $OID, $remove_empty_classifications) = @_;
+
+    $OID =~ s/^\.+//; # just for good luck
+
+    # book information is printed elsewhere
+    return if (defined ($classifyinfo->{'OID'}));
+ 
+    # don't want empty classifications
+    return if (&check_contents ($classifyinfo, $remove_empty_classifications) == 0 && $remove_empty_classifications);
+   
+    $OID = $classifyinfo->{'classifyOID'} if defined ($classifyinfo->{'classifyOID'});
+
+    my %classify_infodb = ();
+    $classify_infodb{"doctype"} = [ "classify" ];
+    $classify_infodb{"hastxt"} = [ "0" ];
+    $classify_infodb{"childtype"} = [ $classifyinfo->{'childtype'} ]
+	if defined $classifyinfo->{'childtype'};
+    $classify_infodb{"Title"} = [ $classifyinfo->{'Title'} ]
+	if defined $classifyinfo->{'Title'};
+    $classify_infodb{"numleafdocs"} = [ $classifyinfo->{'numleafdocs'} ]
+	if defined $classifyinfo->{'numleafdocs'};
+    $classify_infodb{"thistype"} = [ $classifyinfo->{'thistype'} ]
+	if defined $classifyinfo->{'thistype'};
+    $classify_infodb{"parameters"} = [ $classifyinfo->{'parameters'} ]
+	if defined $classifyinfo->{'parameters'};
+    $classify_infodb{"supportsmemberof"} = [ $classifyinfo->{'supportsmemberof'} ]
+	if defined $classifyinfo->{'supportsmemberof'};
+    
+    my $contains_text = "";
+    my $mdoffset_text = "";
+    
+    my $next_subOID = 1;
+    my $first = 1;
+    foreach my $tempinfo (@{$classifyinfo->{'contains'}}) {
+	# empty contents were made undefined by clean_contents()
+	next unless defined $tempinfo;
+	if (!defined ($tempinfo->{'classifyOID'}) ||
+	    $tempinfo->{'classifyOID'} ne "oai") {
+	    $contains_text .= ";" unless $first;
+	}
+	$mdoffset_text .= ";" unless $first;
+	$first = 0;
+	
+	if (defined ($tempinfo->{'classifyOID'}))
+	{
+	    if ($tempinfo->{'classifyOID'} ne "oai")
+	    {
+		$contains_text .= $tempinfo->{'classifyOID'};
+	    }
+
+	    &print_classify_info ($infodb_type, $infodb_handle, $tempinfo, $tempinfo->{'classifyOID'},
+				  $remove_empty_classifications);
+	}
+	elsif (defined ($tempinfo->{'OID'}))
+	{
+	    $contains_text .= $tempinfo->{'OID'};
+	    $mdoffset_text .= $tempinfo->{'offset'} if (defined ($tempinfo->{'offset'}));
+	}
+	else
+	{
+	    # Supress having top-level node in Collage classifier
+	    # so no bookshelf icon appears, top-level, along with the
+	    # applet
+	    if (!defined ($tempinfo->{'Title'}) || $tempinfo->{'Title'} ne "Collage")
+	    {
+		$contains_text .= "\".$next_subOID"; 
+	    }
+
+	    &print_classify_info ($infodb_type, $infodb_handle, $tempinfo, "$OID.$next_subOID",
+				  $remove_empty_classifications);
+	    $next_subOID++;
+	}
+    }
+    
+    $classify_infodb{"contains"} = [ $contains_text ];
+    $classify_infodb{"mdtype"} = [ $classifyinfo->{'mdtype'} ]
+	if defined $classifyinfo->{'mdtype'};
+    $classify_infodb{"mdoffset"} = [ $mdoffset_text ]
+	if ($mdoffset_text !~ m/^;+$/);
+    
+    &dbutil::write_infodb_entry($infodb_type, $infodb_handle, $OID, \%classify_infodb);
+}
+
+
+sub check_contents {
+    my ($classifyinfo,$remove_empty_classifications) = @_;
+    $remove_empty_classifications = 0 unless ($remove_empty_classifications);
+    my $num_leaf_docs = 0;
+    my $sub_num_leaf_docs = 0;
+
+    return $classifyinfo->{'numleafdocs'} if (defined $classifyinfo->{'numleafdocs'});
+
+    foreach my $content (@{$classifyinfo->{'contains'}}) {
+	if (defined $content->{'OID'}) {
+	    # found a book
+	    $num_leaf_docs ++;
+	} elsif (($sub_num_leaf_docs = &check_contents ($content,$remove_empty_classifications)) > 0) {
+	    # there's a book somewhere below
+	    $num_leaf_docs += $sub_num_leaf_docs;
+	} else {
+	    if ($remove_empty_classifications){
+		# section contains no books so we want to remove 
+		# it from its parents contents
+		$content = undef;
+	    }
+	}
+    }
+
+    $classifyinfo->{'numleafdocs'} = $num_leaf_docs;
+    return $num_leaf_docs;
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/AZCompactList.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/AZCompactList.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/AZCompactList.pm	(revision 24799)
@@ -0,0 +1,826 @@
+###########################################################################
+#
+# AZCompactList.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+# classifier plugin for sorting alphabetically
+
+package AZCompactList;
+
+use BaseClassifier;
+use sorttools;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+sub BEGIN {
+    @AZCompactList::ISA = ('BaseClassifier');
+}
+
+my $doclevel_list = 
+    [ {	'name' => "top",
+ 	'desc' => "{AZCompactList.doclevel.top}" },
+      { 'name' => "section",
+	'desc' => "{AZCompactList.doclevel.section}" } ];
+
+my $arguments = 
+    [ { 'name' => "metadata",
+	'desc' => "{AZCompactList.metadata}",
+	'type' => "metadata",
+	'reqd' => "yes" },
+      { 'name' => "firstvalueonly",
+	'desc' => "{AZCompactList.firstvalueonly}",
+	'type' => "flag",
+	'reqd' => "no" },
+      { 'name' => "allvalues",
+	'desc' => "{AZCompactList.allvalues}",
+	'type' => "flag",
+	'reqd' => "no" },
+      { 'name' => "sort",
+	'desc' => "{AZCompactList.sort}",
+	'type' => "metadata",
+#	'deft' => "Title",
+	'reqd' => "no" },
+      { 'name' => "removeprefix",
+	'desc' => "{BasClas.removeprefix}",
+	'type' => "regexp",
+	'deft' => "",
+	'reqd' => "no" },
+      { 'name' => "removesuffix",
+	'desc' => "{BasClas.removesuffix}",
+	'type' => "regexp",
+	'deft' => "",
+	'reqd' => "no" },
+      { 'name' => "mingroup",
+	'desc' => "{AZCompactList.mingroup}",
+	'type' => "int",
+	'deft' => "1",
+	'range' => "1,",
+	'reqd' => "no" },
+      { 'name' => "minnesting",
+	'desc' => "{AZCompactList.minnesting}",
+	'type' => "int",
+	'deft' => "20",
+	'range' => "2,",
+	'reqd' => "no" },
+      { 'name' => "mincompact",
+	'desc' => "{AZCompactList.mincompact}",
+	'type' => "int",
+	'deft' => "10",
+	'range' => "1,",
+	'reqd' => "no" },
+      { 'name' => "maxcompact",
+	'desc' => "{AZCompactList.maxcompact}",
+	'type' => "int",
+	'deft' => "30",
+	'range' => "1,",
+	'reqd' => "no" },
+      { 'name' => "doclevel",
+	'desc' => "{AZCompactList.doclevel}",
+	'type' => "enum",
+	'list' => $doclevel_list,
+	'deft' => "top",
+	'reqd' => "no" },
+      { 'name' => "freqsort",
+	'desc' => "{AZCompactList.freqsort}",
+	'type' => "flag"},
+      { 'name' => "recopt",
+	'desc' => "{AZCompactList.recopt}",
+	'type' => "flag",
+	'reqd' => "no" } ];
+
+my $options = 
+{ 	'name'     => "AZCompactList",
+	'desc'     => "{AZCompactList.desc}",
+	'abstract' => "no",
+	'inherits' => "yes",
+	'args'     => $arguments };
+
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new BaseClassifier($pluginlist, $inputargs, $hashArgOptLists);
+
+    if ($self->{'info_only'}) {
+	# don't worry about any options etc
+	return bless $self, $class;
+    }
+    
+    if (!$self->{"metadata"}) {
+	my $outhandle = $self->{'outhandle'};
+	print $outhandle "AZCompactList Error: required option -metadata not supplied\n";
+	$self->print_txt_usage("");  
+	die "AZCompactList Error: required option -metadata not supplied\n";
+    }
+
+    $self->{'metadata'} = $self->strip_ex_from_metadata($self->{'metadata'});
+    # Manually set $self parameters.
+    $self->{'list'} = {};
+    $self->{'listmetavalue'} = {};
+    $self->{'list_mvpair'} = {};
+    $self->{'reclassify'} = {};
+    $self->{'reclassifylist'} = {};
+
+    $self->{'buttonname'} = $self->generate_title_from_metadata($self->{'metadata'}) unless ($self->{'buttonname'});
+    
+    if (defined($self->{"removeprefix"}) && $self->{"removeprefix"}) {
+	$self->{"removeprefix"} =~ s/^\^//; # don't need a leading ^
+    }
+    if (defined($self->{"removesuffix"}) && $self->{"removesuffix"}) {
+	$self->{"removesuffix"} =~ s/\$$//; # don't need a trailing $
+    }
+	
+    $self->{'recopt'} = ($self->{'recopt'} == 0) ? undef : "on";
+    
+    if (defined $self->{'sort'}) {
+	$self->{'sort'} = $self->strip_ex_from_metadata($self->{'sort'});
+    }
+    # Clean out the unused keys
+    if($self->{"removeprefix"} eq "") {delete $self->{"removeprefix"};}
+    if($self->{"removesuffix"} eq "") {delete $self->{"removesuffix"};}
+
+    return bless $self, $class;
+}
+
+sub init 
+{
+    my $self = shift (@_);
+    
+    $self->{'list'} = {};
+    $self->{'listmetavalue'} = {};
+    $self->{'list_mvpair'} = {};
+    $self->{'reclassify'} = {};
+    $self->{'reclassifylist'} = {};
+}
+
+my $tmp = 0;
+
+sub classify
+{
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+
+    my $doc_OID = $doc_obj->get_OID();
+    my $outhandle = $self->{'outhandle'};
+
+    my @sectionlist = ();
+    my $topsection = $doc_obj->get_top_section();
+    my $metaname = $self->{'metadata'};
+
+    $metaname =~ s/(\/|\|).*//; # grab first name in n1/n2/n3 or n1|n2|n3 list
+    my @commameta_list = split(/,|;/, $metaname);
+
+    if ($self->{'doclevel'} =~ /^top(level)?/i)
+    {
+	push(@sectionlist,$topsection);
+    }
+    else
+    {
+	my $thissection = $doc_obj->get_next_section($topsection);
+	while (defined $thissection) 
+	{
+	    push(@sectionlist,$thissection);
+	    $thissection = $doc_obj->get_next_section ($thissection);
+	}
+    }
+
+    my $thissection;
+    foreach $thissection (@sectionlist)
+    {
+	my $full_doc_OID 
+	    = ($thissection ne "") ? "$doc_OID.$thissection" : $doc_OID;
+
+	if (defined $self->{'list_mvpair'}->{$full_doc_OID}) 
+	{
+	    print $outhandle "WARNING: AZCompactList::classify called multiple times for $full_doc_OID\n";
+	} 
+	$self->{'list'}->{$full_doc_OID} = [];	
+	$self->{'listmetavalue'}->{$full_doc_OID} = [];
+	$self->{'list_mvpair'}->{$full_doc_OID} = [];
+
+	my $metavalues = [];
+	foreach my $cmn (@commameta_list) {
+	    my $cmvalues = $doc_obj->get_metadata($thissection,$cmn);
+	    push(@$metavalues,@$cmvalues) if (@{$cmvalues});
+	    last if (@{$cmvalues} && !$self->{'allvalues'});
+	}
+
+	my $metavalue;
+	foreach $metavalue (@$metavalues) 
+	{
+	    # Tidy up use of white space in metavalue for classifying
+	    $metavalue =~ s/^\s*//s;
+	    $metavalue =~ s/\s*$//s;
+	    $metavalue =~ s/\n/ /s;
+	    $metavalue =~ s/\s{2,}/ /s;
+
+	    # if this document doesn't contain the metadata element we're
+	    # sorting by we won't include it in this classification
+	    if (defined $metavalue && $metavalue =~ /\w/) 
+	    {
+		if (defined($self->{'removeprefix'}) &&
+		    length($self->{'removeprefix'})) {
+		    $metavalue =~ s/^$self->{'removeprefix'}//;
+
+		    # check that it's not now empty
+		    if (!$metavalue) {next;}
+		}
+
+		if (defined($self->{'removesuffix'}) &&
+		    length($self->{'removesuffix'})) {
+		    $metavalue =~ s/$self->{'removesuffix'}$//;
+
+		    # check that it's not now empty
+		    if (!$metavalue) {next;}
+		}
+
+		my $formatted_metavalue;
+		if ($self->{'no_metadata_formatting'}) {
+		    $formatted_metavalue = $metavalue;
+		} else {
+		    $formatted_metavalue = &sorttools::format_metadata_for_sorting($self->{'metadata'},	 $metavalue, $doc_obj);
+		}
+		
+		#### prefix-str
+		if (! defined($formatted_metavalue)) {
+		    print $outhandle "Warning: AZCompactList: metavalue is ";
+		    print $outhandle "empty\n";
+		    $formatted_metavalue="";
+		}
+
+		my $mv_pair = { 'mv' => $metavalue, 'fmv' => $formatted_metavalue };
+		push(@{$self->{'list'}->{$full_doc_OID}},$formatted_metavalue);
+		push(@{$self->{'listmetavalue'}->{$full_doc_OID}} ,$metavalue);
+		push(@{$self->{'list_mvpair'}->{$full_doc_OID}},$mv_pair);
+
+
+		last if ($self->{'firstvalueonly'});
+	    }
+	}
+
+	# This is used in reclassify below for AZCompactSectionList
+	my $sortmeta = $doc_obj->get_metadata_element($thissection, $self->{'sort'});
+	$self->{'reclassify'}->{$full_doc_OID} = [$doc_obj,$sortmeta];
+    }
+}
+
+sub reinit 
+{
+    my ($self,$classlist_ref) = @_;
+    my $outhandle = $self->{'outhandle'};
+    
+    my %mtfreq = ();
+    my @single_classlist = ();
+    my @multiple_classlist = ();
+
+    # find out how often each metavalue occurs
+    map 
+    { 
+	foreach my $mvp (@{$self->{'list_mvpair'}->{$_}} )
+	{
+###	    print STDERR "*** plain mv = $mvp->{'mv'}\n";
+###	    print STDERR "*** format mv = $mvp->{'fmv'}\n";
+
+	    my $metavalue = $mvp->{'mv'};
+	    $metavalue =~ s!^-!\\-!; # in case it starts with "-"
+	    $mtfreq{$metavalue}++;
+	}
+    } @$classlist_ref;
+
+    # use this information to split the list: single metavalue/repeated value
+    map
+    { 
+	my $i = 1;
+	my $metavalue;
+	foreach my $mvp (@{$self->{'list_mvpair'}->{$_}})
+	{
+	    my $metavalue = $mvp->{'mv'};
+	    $metavalue =~ s!^-!\\-!; # in case it starts with "-"
+	    my $cs_metavalue = $mvp->{'mv'}; # case sensative
+	    if ($mtfreq{$metavalue} >= $self->{'mingroup'})
+	    {
+###		print STDERR "*** pushing on $cs_metavalue\n";
+		push(@multiple_classlist,[$_,$i,$metavalue]); 
+	    } 
+	    else
+	    {
+		push(@single_classlist,[$_,$cs_metavalue]); 
+		$metavalue =~ tr/[A-Z]/[a-z]/;
+		$self->{'reclassifylist'}->{"Metavalue_$i.$_"} = $metavalue;
+	    }
+	    $i++;
+	}
+    } @$classlist_ref;
+    
+    
+    # Setup sub-classifiers for multiple list
+
+    $self->{'classifiers'} = {};
+
+    my $pm;
+    foreach $pm ("SimpleList", "SectionList")
+    {
+	my $listname 
+	    = &util::filename_cat($ENV{'GSDLHOME'},"perllib/classify/$pm.pm");
+	if (-e $listname) { require $listname; }
+	else 
+	{ 
+	    print $outhandle "AZCompactList ERROR - couldn't find classifier \"$listname\"\n"; 
+	    die "\n";
+	}
+    }
+
+    # Create classifiers objects for each entry >= mingroup
+    my $metavalue;
+    my $doclevel = $self->{'doclevel'};
+    my $mingroup = $self->{'mingroup'};
+    my @metaname_list = split(/\/|\|/,$self->{'metadata'});
+    my $metaname = shift(@metaname_list);
+    my $hierarchical = 0;
+    if (scalar(@metaname_list) > 1) {
+	$hierarchical = 1;
+	$metaname = join('/',@metaname_list);
+    }
+    foreach $metavalue (keys %mtfreq)
+    {
+	if ($mtfreq{$metavalue} >= $mingroup)
+	{
+	    # occurs more often than minimum required to compact into a group
+	    my $listclassobj;
+	    
+	    if (!$hierarchical) 
+	    {	
+		my @args;
+		push @args, ("-metadata", "$metaname");
+		# buttonname is also used for the node's title
+		push @args, ("-buttonname", "$metavalue");
+		push @args, ("-sort", $self->{'sort'});
+
+		my $ptArgs = \@args;
+		if ($doclevel =~ m/^top(level)?/i)
+		{
+		    eval ("\$listclassobj = new SimpleList([],\$ptArgs)"); 
+		}
+		else
+		{
+		    eval ("\$listclassobj = new SectionList([],\$ptArgs)");
+		}
+	    }
+	    else
+	    {
+		
+		my @args;
+		push @args, ("-metadata", "$metaname");
+		# buttonname is also used for the node's title
+		push @args, ("-buttonname", "$metavalue");
+		push @args, ("-sort", $self->{'sort'});
+
+		if (defined $self->{'removeprefix'}) {
+		    push @args, ("-removeprefix", $self->{'removeprefix'});
+		}
+		if (defined $self->{'removesuffix'}) {
+		    push @args, ("-removesuffix", $self->{'removesuffix'});
+		}
+		
+		push @args, ("-doclevel", "$doclevel");
+		push @args, ("-mingroup", $mingroup);
+		push @args, "-recopt ";
+
+		my $ptArgs = \@args;
+		eval ("\$listclassobj = new AZCompactList([],\$ptArgs)");
+	    }
+	    
+	    if ($@) {
+		print $outhandle "$@";
+		die "\n";
+	    }
+	    
+	    $listclassobj->init();
+
+	    if (defined $metavalue && $metavalue =~ /\w/) 
+	    {
+		my $formatted_node = $metavalue;
+
+		if (defined($self->{'removeprefix'}) &&
+		    length($self->{'removeprefix'})) {
+		    $formatted_node =~ s/^$self->{'removeprefix'}//;
+		    # check that it's not now empty
+		    if (!$formatted_node) {next;}
+		}
+		if (defined($self->{'removesuffix'}) &&
+		    length($self->{'removesuffix'})) {
+		    $formatted_node =~ s/$self->{'removesuffix'}$//;
+		    # check that it's not now empty
+		    if (!$formatted_node) {next;}
+		}
+
+		$formatted_node = &sorttools::format_metadata_for_sorting($self->{'metadata'}, $formatted_node) unless $self->{'no_metadata_formatting'};
+
+		# In case our formatted string is empty...
+		if (! defined($formatted_node)) {
+		    print $outhandle "Warning: AZCompactList: metavalue is ";
+		    print $outhandle "empty\n";
+		    $formatted_node="";
+		}
+
+		# use the lower case, for speed of lookup.
+		my $meta_lc=lc($metavalue);
+		$self->{'classifiers'}->{$meta_lc}
+		= { 'classifyobj'   => $listclassobj,
+		    'formattednode' => $formatted_node };
+	    }
+	}
+    }
+
+
+    return (\@single_classlist,\@multiple_classlist);
+}
+
+
+sub reclassify 
+{
+    my ($self,$multiple_cl_ref) = @_;
+
+    # Entries in the current classify list that are "book nodes"
+    # should be recursively classified.
+    #--
+    foreach my $dm_pair (@$multiple_cl_ref) 
+    {
+	my ($doc_OID,$mdoffset,$metavalue,$cs_metavalue) = @$dm_pair;
+        my $listclassobj;
+
+	# find metavalue in list of sub-classifiers
+	# check if we have a key (lower case) for this metadata value
+	my $node_name=lc($metavalue);
+	if (exists $self->{'classifiers'}->{$node_name})
+	{
+	    my ($doc_obj, $sortmeta) = @{$self->{'reclassify'}->{$doc_OID}};
+
+	    # record the metadata value offset temporarily, so eg AZList can
+	    # get the correct metadata value (for multi-valued metadata fields)
+	    $doc_obj->{'mdoffset'}=$mdoffset;
+
+	    if ($doc_OID =~ m/^[^\.]*\.([\d\.]+)$/)
+	    {
+		my $section=$1;
+		if ($self->{'doclevel'} =~ m/^top/i) { # toplevel
+		    $self->{'classifiers'}->{$node_name}->{'classifyobj'}
+		    ->classify($doc_obj,"Section=$section");
+		} else { # section level
+		    # Thanks to Don Gourley for this...
+		    # classify can't handle multi-level section
+		    $self->{'classifiers'}->{$node_name}->{'classifyobj'}
+		    ->classify_section($section, $doc_obj, $sortmeta);
+		}
+	    }
+	    else
+	    {
+		$self->{'classifiers'}->{$node_name}->{'classifyobj'}
+		->classify($doc_obj); 
+	    }
+	} else { # this key is not in the hash
+	    my $outhandle=$self->{outhandle};
+	    print $outhandle "Warning: AZCompactList::reclassify ";
+	    print $outhandle "could not find sub-node for metadata=`$metavalue' with doc_OID $doc_OID\n";
+	}
+    }
+}
+
+
+
+sub get_reclassify_info 
+{
+    my $self = shift (@_);
+    
+    my $node_name;
+    foreach $node_name (keys %{$self->{'classifiers'}}) 
+    {
+        my $classifyinfo 
+	    = $self->{'classifiers'}->{$node_name}->{'classifyobj'}
+	        ->get_classify_info();
+        $self->{'classifiers'}->{$node_name}->{'classifyinfo'} 
+	    = $classifyinfo;
+        $self->{'reclassifylist'}->{"CLASSIFY.$node_name"} 
+	    = $self->{'classifiers'}->{$node_name}->{'formattednode'};
+    }
+}
+
+
+sub alpha_numeric_cmp
+{
+    my ($self,$a,$b) = @_;
+
+    my $title_a = $self->{'reclassifylist'}->{$a};
+    my $title_b = $self->{'reclassifylist'}->{$b};
+    
+    if ($title_a =~ m/^(\d+(\.\d+)?)/)
+    {
+	my $val_a = $1;
+	if ($title_b =~ m/^(\d+(\.\d+)?)/)
+	{
+	    my $val_b = $1;
+	    if ($val_a != $val_b)
+	    {
+		return ($val_a <=> $val_b);
+	    }
+	}
+    }
+    
+    return ($title_a cmp $title_b);
+}
+
+sub frequency_cmp
+{
+    my ($self,$a,$b) = @_;
+
+
+    my $title_a = $self->{'reclassifylist'}->{$a};
+    my $title_b = $self->{'reclassifylist'}->{$b};
+
+    my $a_freq = 1;
+    my $b_freq = 1;
+
+    if ($a =~ m/^CLASSIFY\.(.*)$/)
+    {
+	my $a_node = $1;
+	my $a_nodeinfo = $self->{'classifiers'}->{$a_node}->{'classifyinfo'};
+	$a_freq = scalar(@{$a_nodeinfo->{'contains'}});
+    }
+    
+    if ($b =~ m/^CLASSIFY\.(.*)$/)
+    {
+	my $b_node = $1;
+	my $b_nodeinfo = $self->{'classifiers'}->{$b_node}->{'classifyinfo'};
+	$b_freq = scalar(@{$b_nodeinfo->{'contains'}});
+    }
+
+    return $b_freq <=> $a_freq;
+}
+
+sub get_classify_info {
+    my $self = shift (@_);
+
+    my @classlist =keys %{$self->{'list_mvpair'}}; # list all doc oids
+
+    my ($single_cl_ref,$multiple_cl_ref) = $self->reinit(\@classlist);
+    $self->reclassify($multiple_cl_ref);
+    $self->get_reclassify_info();
+
+    my @reclassified_classlist;
+    if ($self->{'freqsort'})
+    {
+	@reclassified_classlist 
+	    = sort { $self->frequency_cmp($a,$b) } keys %{$self->{'reclassifylist'}};
+	# supress sub-grouping by alphabet
+	map { $self->{'reclassifylist'}->{$_} = "A".$self->{'reclassifylist'}; } keys %{$self->{'reclassifylist'}};
+    }
+    else
+    {
+#	@reclassified_classlist 
+#	    = sort {$self->{'reclassifylist'}->{$a} cmp $self->{'reclassifylist'}->{$b};} keys %{$self->{'reclassifylist'}};
+
+	# alpha_numeric_cmp is slower than "cmp" but handles numbers better ...
+
+	@reclassified_classlist
+	    = sort { $self->alpha_numeric_cmp($a,$b) } keys %{$self->{'reclassifylist'}};
+
+    }
+
+    return $self->splitlist (\@reclassified_classlist);
+}
+
+sub get_entry {
+    my $self = shift (@_);
+    my ($title, $childtype, $metaname, $thistype) = @_;
+    # organise into classification structure
+    my %classifyinfo = ('childtype'=>$childtype,
+                        'Title'=>$title,
+                        'contains'=>[],
+			'mdtype'=>$metaname);
+
+    $classifyinfo{'thistype'} = $thistype
+        if defined $thistype && $thistype =~ /\w/;
+
+    return \%classifyinfo;
+}
+
+
+
+# splitlist takes an ordered list of classifications (@$classlistref) and 
+# splits it up into alphabetical sub-sections.
+sub splitlist {
+    my $self = shift (@_);
+    my ($classlistref) = @_;
+    my $classhash = {};
+
+    # top level
+    my @metanames = split(/\/|\|/,$self->{'metadata'});
+    my $metaname = shift(@metanames);
+
+    my $childtype = "HList";
+    $childtype = "VList" if (scalar (@$classlistref) <= $self->{'minnesting'});
+
+    my $title = $self->{'buttonname'}; # should always be defined by now.
+    my $classifyinfo;
+    if (!defined($self->{'recopt'}))
+    {
+	$classifyinfo 
+	    = $self->get_entry ($title, $childtype, $metaname, "Invisible");
+    }
+    else
+    {
+	$classifyinfo 
+	    = $self->get_entry ($title, $childtype, $metaname, "VList");
+    }
+
+    # don't need to do any splitting if there are less than 'minnesting' classifications
+    if ((scalar @$classlistref) <= $self->{'minnesting'}) {
+	foreach my $subOID (@$classlistref) {
+            if ($subOID =~ /^CLASSIFY\.(.*)$/ 
+		&& defined $self->{'classifiers'}->{$1}) 
+	    {
+                push (@{$classifyinfo->{'contains'}}, 
+		      $self->{'classifiers'}->{$1}->{'classifyinfo'});
+            } 
+	    else 
+	    {
+		$subOID =~ s/^Metavalue_(\d+)\.//;
+		my $metaname_offset = $1 -1;
+		my $oid_rec = {'OID'=>$subOID, 'offset'=>$metaname_offset};
+		push (@{$classifyinfo->{'contains'}}, $oid_rec);
+	    }
+	}
+	return $classifyinfo;
+    }
+	
+    # first split up the list into separate A-Z and 0-9 classifications
+    foreach my $classification (@$classlistref) {
+	my $title = $self->{'reclassifylist'}->{$classification};
+	$title =~ s/&(.){2,4};//g; # remove any HTML special chars
+	$title =~ s/^\W+//g; # remove leading non-word chars
+
+	# only want first character for classification
+	$title =~ m/^(.)/; # always a char, or first byte of wide char?
+	if (defined($1) && $1 ne "") {
+	    $title=$1;
+	} else {
+	    print STDERR "no first character found for \"$title\" - \"" .
+		$self->{'reclassifylist'}->{$classification} . "\"\n";
+	}
+	$title =~ tr/[a-z]/[A-Z]/;
+
+	if ($title =~ /^[0-9]$/) {$title = '0-9';}
+	elsif ($title !~ /^[A-Z]$/) {
+	    my $outhandle = $self->{'outhandle'};
+	    print $outhandle "AZCompactList: WARNING $classification has badly formatted title ($title)\n";
+	}
+	$classhash->{$title} = [] unless defined $classhash->{$title};
+	push (@{$classhash->{$title}}, $classification);
+    }
+    $classhash = $self->compactlist ($classhash);
+
+    my @tmparr = ();
+    foreach my $subsection (sort keys (%$classhash)) {
+	push (@tmparr, $subsection);
+    }
+    
+    # if there's a 0-9 section it will have been sorted to the beginning
+    # but we want it at the end
+    if ($tmparr[0] eq '0-9') {
+	shift @tmparr;
+	push (@tmparr, '0-9');
+    }
+    foreach my $subclass (@tmparr) 
+    {
+	my $tempclassify 
+	    = (scalar(@tmparr)==1) 
+		? ($self->get_entry(" ", "VList", $metaname))
+		: ($self->get_entry($subclass, "VList", $metaname));
+
+
+	foreach my $subsubOID (@{$classhash->{$subclass}}) 
+	{
+            if ($subsubOID =~ /^CLASSIFY\.(.*)$/ 
+		&& defined $self->{'classifiers'}->{$1}) 
+	    {
+		# this is a "bookshelf" node... >1 entry compacted
+                push (@{$tempclassify->{'contains'}}, 
+		      $self->{'classifiers'}->{$1}->{'classifyinfo'});
+		# set the metadata field name, for mdoffset to work
+		$self->{'classifiers'}->{$1}->{'classifyinfo'}->{'mdtype'}=
+		    $metaname;
+	    }
+	    else
+	    {
+		$subsubOID =~ s/^Metavalue_(\d+)\.//;
+		# record the offset if this metadata type has multiple values
+		my $metaname_offset = $1 -1;
+		my $oid_rec = {'OID'=>$subsubOID, 'offset'=>$metaname_offset};
+		push (@{$tempclassify->{'contains'}}, $oid_rec);
+	    }
+	}
+	push (@{$classifyinfo->{'contains'}}, $tempclassify);
+    }
+
+    return $classifyinfo;
+}
+
+sub compactlist {
+    my $self = shift (@_);
+    my ($classhashref) = @_;
+    my $compactedhash = {};
+    my @currentOIDs = ();
+    my $currentfirstletter = "";
+    my $currentlastletter = "";
+    my $lastkey = "";
+
+    # minimum and maximum documents to be displayed per page.
+    # the actual maximum will be max + (min-1).
+    # the smallest sub-section is a single letter at present
+    # so in this case there may be many times max documents
+    # displayed on a page.
+    my $min = $self->{'mincompact'}; 
+    my $max = $self->{'maxcompact'};
+
+    foreach my $subsection (sort keys %$classhashref) {
+	if ($subsection eq '0-9') {
+	    @{$compactedhash->{$subsection}} = @{$classhashref->{$subsection}};
+	    next;
+	}
+	$currentfirstletter = $subsection if $currentfirstletter eq "";
+	if ((scalar (@currentOIDs) < $min) ||
+	    ((scalar (@currentOIDs) + scalar (@{$classhashref->{$subsection}})) <= $max)) {
+	    push (@currentOIDs, @{$classhashref->{$subsection}});
+	    $currentlastletter = $subsection;
+	} else {
+
+	    if ($currentfirstletter eq $currentlastletter) {
+		@{$compactedhash->{$currentfirstletter}} = @currentOIDs;
+		$lastkey = $currentfirstletter;
+	    } else {
+		@{$compactedhash->{"$currentfirstletter-$currentlastletter"}} = @currentOIDs;
+		$lastkey = "$currentfirstletter-$currentlastletter";
+	    } 
+	    if (scalar (@{$classhashref->{$subsection}}) >= $max) {
+		$compactedhash->{$subsection} = $classhashref->{$subsection};
+		@currentOIDs = ();
+		$currentfirstletter = "";
+		$lastkey=$subsection;
+	    } else {
+		@currentOIDs = @{$classhashref->{$subsection}};
+		$currentfirstletter = $subsection;
+		$currentlastletter = $subsection;
+	    }
+	}
+    }
+
+    # add final OIDs to last sub-classification if there aren't many otherwise
+    # add final sub-classification
+
+    # don't add if there aren't any oids
+    if (! scalar (@currentOIDs)) {return $compactedhash;}
+
+    if (scalar (@currentOIDs) < $min) {
+	my ($newkey) = $lastkey =~ /^(.)/;
+	@currentOIDs = (@{$compactedhash->{$lastkey}}, @currentOIDs);
+	delete $compactedhash->{$lastkey};
+	@{$compactedhash->{"$newkey-$currentlastletter"}} = @currentOIDs;
+    } else {
+	if ($currentfirstletter eq $currentlastletter) {
+	    @{$compactedhash->{$currentfirstletter}} = @currentOIDs;
+	} else {
+	    @{$compactedhash->{"$currentfirstletter-$currentlastletter"}} = @currentOIDs;
+	} 
+    }
+
+    return $compactedhash;
+}
+
+1;
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/AZCompactSectionList.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/AZCompactSectionList.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/AZCompactSectionList.pm	(revision 24799)
@@ -0,0 +1,234 @@
+###########################################################################
+#
+# AZCompactSectionList.pm --
+#
+# Experimental AZCompactList with fixes to handle section-level metadata
+#
+###########################################################################
+
+package AZCompactSectionList;
+
+use AZCompactList;
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+sub BEGIN {
+    @AZCompactSectionList::ISA = ('AZCompactList');
+}
+
+my $arguments = [
+		 ];
+my $options = 
+{ 	'name'     => "AZCompactSectionList",
+	'desc'     => "{AZCompactSectionList.desc}",
+	'abstract' => "no",
+	'inherits' => "yes",
+	'args'     => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($classifierslist,$inputargs,$hashArgOptLists) = @_;
+    push(@$classifierslist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+    
+    my $self = new AZCompactList($classifierslist, $inputargs, $hashArgOptLists);
+
+    return bless $self, $class;
+}
+
+#
+# override reinit() & reclassify() to demonstrate possible bug fixes
+# (search for SECTIONFIX? to see lines changed from AZCompactList.pm)
+#
+sub reinit 
+{
+    my ($self,$classlist_ref) = @_;
+    
+    my %mtfreq = ();
+    my @single_classlist = ();
+    my @multiple_classlist = ();
+
+    # find out how often each metavalue occurs
+    map 
+    { 
+	my $mv;
+	foreach $mv (@{$self->{'listmetavalue'}->{$_}} )
+	{
+	    $mtfreq{$mv}++; 
+	}
+    } @$classlist_ref;
+
+    # use this information to split the list: single metavalue/repeated value
+    map
+    { 
+	my $i = 1;
+	my $metavalue;
+	foreach $metavalue (@{$self->{'listmetavalue'}->{$_}})
+	{
+	    if ($mtfreq{$metavalue} >= $self->{'mingroup'})
+	    {
+		push(@multiple_classlist,[$_,$i,$metavalue]); 
+	    } 
+	    else
+	    {
+		push(@single_classlist,[$_,$metavalue]); 
+		$metavalue =~ tr/[A-Z]/[a-z]/;
+		$self->{'reclassifylist'}->{"Metavalue_$i.$_"} = $metavalue;
+	    }
+	    $i++;
+	}
+    } @$classlist_ref;
+    
+    
+    # Setup sub-classifiers for multiple list
+
+    $self->{'classifiers'} = {};
+
+    my $pm;
+    foreach $pm ("SimpleList", "SectionList")
+    {
+	my $listname 
+	    = &util::filename_cat($ENV{'GSDLHOME'},"perllib/classify/$pm.pm");
+	if (-e $listname) { require $listname; }
+	else 
+	{ 
+	    my $outhandle = $self->{'outhandle'};
+	    print $outhandle "AZCompactList ERROR - couldn't find classifier \"$listname\"\n"; 
+	    die "\n";
+	}
+    }
+
+    # Create classifiers objects for each entry >= mingroup
+    my $metavalue;
+    foreach $metavalue (keys %mtfreq)
+    {
+	if ($mtfreq{$metavalue} >= $self->{'mingroup'})
+	{
+	    my $listclassobj;
+	    my $doclevel = $self->{'doclevel'};
+	    my $metaname  = $self->{'metaname'};
+	    my @metaname_list = split('/',$metaname);
+	    $metaname = shift(@metaname_list);
+	    if (@metaname_list==0)
+	    {
+		my @args;
+		push @args, ("-metadata", "$metaname");
+# buttonname is also used for the node's title
+		push @args, ("-buttonname", "$metavalue");
+		push @args, ("-sort", $self->{'sort'});
+
+		my $ptArgs = \@args;
+		if ($doclevel =~ m/^top(level)?/i)
+		{
+		    eval ("\$listclassobj = new SimpleList([],\$ptArgs)"); warn $@ if $@;
+		}
+		else
+		{
+		    # SECTIONFIX?
+		    #eval ("\$listclassobj = new SectionList($args)");
+		    eval ("\$listclassobj = new SectionList([],\$ptArgs)");
+		}
+	    }
+	    else
+	    {
+		$metaname = join('/',@metaname_list);
+		
+		my @args;
+		push @args, ("-metadata", "$metaname");
+# buttonname is also used for the node's title
+		push @args, ("-buttonname", "$metavalue");
+		push @args, ("-doclevel", "$doclevel");
+		push @args, "-recopt";
+
+		# SECTIONFIX?
+		#eval ("\$listclassobj = new AZCompactList($args)");
+		my $ptArgs = \@args;
+		eval ("\$listclassobj = new AZCompactList([],\$ptArgs)");
+	    }
+	    if ($@) {
+		my $outhandle = $self->{'outhandle'};
+		print $outhandle "$@";
+		die "\n";
+	    }
+	    
+	    $listclassobj->init();
+
+	    if (defined $metavalue && $metavalue =~ /\w/) 
+	    {
+		my $formatted_node = $metavalue;
+		if ($self->{'metaname'} =~ m/^Creator(:.*)?$/)
+		{
+		    &sorttools::format_string_name_en(\$formatted_node);
+		} 
+		else 
+		{
+		    &sorttools::format_string_en(\$formatted_node);
+		}
+		
+		$self->{'classifiers'}->{$metavalue} 
+		= { 'classifyobj'   => $listclassobj,
+		    'formattednode' => $formatted_node };
+	    }
+	}
+    }
+
+
+    return (\@single_classlist,\@multiple_classlist);
+}
+
+
+sub reclassify 
+{
+    my ($self,$multiple_cl_ref) = @_;
+
+    # Entries in the current classify list that are "book nodes"
+    # should be recursively classified.
+    #--
+    foreach my $dm_pair (@$multiple_cl_ref) 
+    {
+	my ($doc_OID,$mdoffset,$metavalue) = @$dm_pair;
+        my $listclassobj;
+
+	# find metavalue in list of sub-classifiers
+	my $found = 0;
+	my $node_name;
+	foreach $node_name (keys %{$self->{'classifiers'}}) 
+	{
+	    my $resafe_node_name = $node_name;
+	    $resafe_node_name =~ s/(\(|\)|\[|\]|\{|\}|\^|\$|\.|\+|\*|\?|\|)/\\$1/g;
+	    if ($metavalue =~ m/^$resafe_node_name$/i) 
+	    {
+		my ($doc_obj, $sortmeta) = @{$self->{'reclassify'}->{$doc_OID}};
+
+		# SECTIONFIX?  section must include multiple levels, e.g. '1.12'
+		#if ($doc_OID =~ m/^.*\.(\d+)$/)
+		if ($doc_OID =~ m/^[^\.]*\.([\d\.]+)$/)
+		{
+		    $self->{'classifiers'}->{$node_name}->{'classifyobj'}
+		    # SECTIONFIX? classify can't handle multi-level section
+		    #->classify($doc_obj, "Section=$1"); 
+		    ->classify_section($1, $doc_obj, $sortmeta);
+		}
+		else
+		{
+		    $self->{'classifiers'}->{$node_name}->{'classifyobj'}
+		    ->classify($doc_obj); 
+		}
+		
+		$found = 1;
+		last;
+	    }
+	}
+	
+	if (!$found)
+	{
+	    my $outhandle = $self->{'outhandle'};
+	    print $outhandle "Warning: AZCompactList::reclassify ";
+	    print $outhandle "could not find sub-node for $metavalue with doc_OID $doc_OID\n";
+	}
+    }
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/AZList.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/AZList.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/AZList.pm	(revision 24799)
@@ -0,0 +1,364 @@
+###########################################################################
+#
+# AZList.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# classifier plugin for sorting alphabetically
+
+package AZList;
+
+use BaseClassifier;
+use sorttools;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+sub BEGIN {
+    @AZList::ISA = ('BaseClassifier');
+}
+
+
+my $arguments =
+    [ { 'name' => "metadata",
+	'desc' => "{AZList.metadata}",
+	'type' => "metadata",
+	'reqd' => "yes" } ,
+      { 'name' => "removeprefix",
+	'desc' => "{BasClas.removeprefix}",
+	'type' => "regexp",
+	'deft' => "",
+	'reqd' => "no" } ,
+      { 'name' => "removesuffix",
+	'desc' => "{BasClas.removesuffix}",
+	'type' => "regexp",
+	'deft' => "",
+	'reqd' => "no" } 
+      ];
+
+my $options = { 'name'     => "AZList",
+		'desc'     => "{AZList.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+
+sub new {
+    my ($class) = shift (@_);
+    my ($classifierslist,$inputargs,$hashArgOptLists) = @_;
+    push(@$classifierslist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new BaseClassifier($classifierslist, $inputargs, $hashArgOptLists);
+
+    if ($self->{'info_only'}) {
+	# don't worry about any options etc
+	return bless $self, $class;
+    }
+
+    if (!$self->{"metadata"}) {
+	print STDERR "AZList Error: required option -metadata not supplied \n";
+	$self->print_txt_usage("");  # Use default resource bundle
+	
+	die "AZList Error: required option -metadata not supplied\n";
+    }
+        
+    # Manually set $self parameters.
+    $self->{'list'} = {};
+
+    # Transfer value from Auto Parsing to the variable name that used in previous GreenStone.
+    my $metadata = $self->{"metadata"};
+    $metadata = $self->strip_ex_from_metadata($metadata);
+    my @meta_list = split(/,/, $metadata);
+    $self->{'meta_list'} = \@meta_list;
+
+    $self->{'buttonname'} = $self->generate_title_from_metadata($metadata) unless ($self->{'buttonname'});
+
+    # Further setup 
+    if (defined($self->{"removeprefix"}) && $self->{"removeprefix"}) {
+	$self->{"removeprefix"} =~ s/^\^//; # don't need a leading ^
+    }
+    if (defined($self->{"removesuffix"}) && $self->{"removesuffix"}) {
+	$self->{"removesuffix"} =~ s/\$$//; # don't need a trailing $
+    }
+
+    # Clean out the unused keys
+    delete $self->{"metadata"}; # Delete this key
+
+    if($self->{"removeprefix"} eq "") {delete $self->{"removeprefix"};}
+    if($self->{"removesuffix"} eq "") {delete $self->{"removesuffix"};}
+
+    return bless $self, $class;
+}
+
+sub init {
+    my $self = shift (@_);
+
+    $self->{'list'} = {};
+}
+
+sub classify {
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+
+    my $doc_OID = $doc_obj->get_OID();
+    my $outhandle = $self->{'outhandle'};
+
+    my $metavalue;
+    my $metaname;
+    # should we extend this to use all available metadata not just the first?
+    if (!defined $self->{'meta_list'}) {
+	# just in case
+	return;
+    }
+
+    # find the first available metadata
+    foreach my $m (@{$self->{'meta_list'}}) {
+	$metavalue = $doc_obj->get_metadata_element($doc_obj->get_top_section(), $m);
+	$metaname = $m;
+	last if defined $metavalue;
+    } 
+    
+    #if we haven't found a metavalue here, then the doc shouldn't be included
+    if (!defined $metavalue || $metavalue eq "") {
+	print $outhandle "WARNING: AZList: $doc_OID metadata is empty - not classifying\n";
+	return;
+    }
+
+    if (defined($self->{'removeprefix'}) &&
+	length($self->{'removeprefix'})) {
+	$metavalue =~ s/^$self->{'removeprefix'}//;
+    }
+    if (defined($self->{'removesuffix'}) &&
+	length($self->{'removesuffix'})) {
+	$metavalue =~ s/$self->{'removesuffix'}$//;
+    }
+    
+    
+    $metavalue = &sorttools::format_metadata_for_sorting($metaname, $metavalue, $doc_obj) unless $self->{'no_metadata_formatting'};
+	
+    if (defined $self->{'list'}->{$doc_OID}) {
+	print $outhandle "WARNING: AZList::classify called multiple times for $doc_OID\n";
+    } 
+    if ($metavalue) {
+	$self->{'list'}->{$doc_OID} = $metavalue;
+    } else {
+	# the formatting has made it empty
+	my $outhandle = $self->{'outhandle'};
+	print $outhandle "WARNING: AZList: $doc_OID metadata has become empty - not classifying\n";
+    }
+    
+}
+
+sub alpha_numeric_cmp
+{
+    my ($self,$a,$b) = @_;
+
+    my $title_a = $self->{'list'}->{$a};
+    my $title_b = $self->{'list'}->{$b};
+
+    if ($title_a =~ m/^(\d+(\.\d+)?)/)
+    {
+	my $val_a = $1;
+	if ($title_b =~ m/^(\d+(\.\d+)?)/)
+	{
+	    my $val_b = $1;
+	    if ($val_a != $val_b)
+	    {
+		return ($val_a <=> $val_b);
+	    }
+	}
+    }
+    
+    return ($title_a cmp $title_b);
+}
+
+sub get_classify_info {
+    my $self = shift (@_);
+
+    my @classlist 
+	= sort { $self->alpha_numeric_cmp($a,$b) } keys %{$self->{'list'}};
+
+    return $self->splitlist (\@classlist);
+}
+
+sub get_entry {
+    my $self = shift (@_);
+    my ($title, $childtype, $thistype) = @_;
+    
+    # organise into classification structure
+    my %classifyinfo = ('childtype'=>$childtype,
+			'Title'=>$title,
+			'contains'=>[]);
+    $classifyinfo{'thistype'} = $thistype 
+	if defined $thistype && $thistype =~ /\w/;
+
+    return \%classifyinfo;
+}
+
+# splitlist takes an ordered list of classifications (@$classlistref) and splits it
+# up into alphabetical sub-sections.
+sub splitlist {
+    my $self = shift (@_);
+    my ($classlistref) = @_;
+    my $classhash = {};
+
+    # top level
+    my $childtype = "HList";
+    if (scalar (@$classlistref) <= 39) {$childtype = "VList";}
+    my $classifyinfo = $self->get_entry ($self->{'buttonname'}, $childtype, "Invisible");
+
+    # don't need to do any splitting if there are less than 39 (max + min -1) classifications
+    if ((scalar @$classlistref) <= 39) {
+	foreach my $subOID (@$classlistref) {
+	    push (@{$classifyinfo->{'contains'}}, {'OID'=>$subOID});
+	}
+	return $classifyinfo;
+    }
+	
+    # first split up the list into separate A-Z and 0-9 classifications
+    foreach my $classification (@$classlistref) {
+	my $title = $self->{'list'}->{$classification};
+
+	$title =~ s/^(&.{1,6};|<[^>]>|[^a-zA-Z0-9])//g; # remove any unwanted stuff
+	# only need first char for classification
+	$title =~ m/^(.)/; $title=$1;
+	$title =~ tr/[a-z]/[A-Z]/;
+	if ($title =~ /^[0-9]$/) {$title = '0-9';}
+	elsif ($title !~ /^[A-Z]$/) {
+	    my $outhandle = $self->{'outhandle'};
+	    print $outhandle "AZList: WARNING $classification has badly formatted title ($title)\n";
+	}
+	$classhash->{$title} = [] unless defined $classhash->{$title};
+	push (@{$classhash->{$title}}, $classification);
+    }
+    $classhash = $self->compactlist ($classhash);
+
+    my @tmparr = ();
+    foreach my $subsection (sort keys (%$classhash)) {
+	push (@tmparr, $subsection);
+    }
+    #if there is only one entry here, we suppress the buckets
+    if ((scalar @tmparr) == 1) {
+	$classifyinfo->{'childtype'} = "VList";
+	foreach my $OID (@{$classhash->{$tmparr[0]}}) {
+	    push (@{$classifyinfo->{'contains'}}, {'OID'=>$OID});
+	}
+	return $classifyinfo;
+    }
+    
+    # if there's a 0-9 section it will have been sorted to the beginning
+    # but we want it at the end
+    if ($tmparr[0] eq '0-9') {
+	shift @tmparr;
+	push (@tmparr, '0-9');
+    }
+
+    foreach my $subclass (@tmparr) {
+	my $tempclassify = $self->get_entry($subclass, "VList");
+	foreach my $subsubOID (@{$classhash->{$subclass}}) {
+	    push (@{$tempclassify->{'contains'}}, {'OID'=>$subsubOID});
+	}
+	push (@{$classifyinfo->{'contains'}}, $tempclassify);
+    }
+
+    return $classifyinfo;
+}
+
+sub compactlist {
+    my $self = shift (@_);
+    my ($classhashref) = @_;
+    my $compactedhash = {};
+    my @currentOIDs = ();
+    my $currentfirstletter = "";  # start of working bin
+    my $currentlastletter = "";   # end of working bin
+    my $lastkey = "";             # the name of the last completed key
+
+    # minimum and maximum documents to be displayed per page.
+    # the actual maximum will be max + (min-1).
+    # the smallest sub-section is a single letter at present
+    # so in this case there may be many times max documents
+    # displayed on a page.
+    my $min = 10; 
+    my $max = 30;
+
+    foreach my $subsection (sort keys %$classhashref) {
+	if ($subsection eq '0-9') {
+	    # leave this bin as-is... copy it straight across
+	    @{$compactedhash->{$subsection}} = @{$classhashref->{$subsection}};
+	    next;
+	}
+	$currentfirstletter = $subsection if $currentfirstletter eq "";
+	if ((scalar (@currentOIDs) < $min) ||
+	    ((scalar (@currentOIDs) + scalar (@{$classhashref->{$subsection}})) <= $max)) {
+	    # add this letter to the bin and continue
+	    push (@currentOIDs, @{$classhashref->{$subsection}});
+	    $currentlastletter = $subsection;
+	} else {
+	    # too many or too few for a separate bin
+	    if ($currentfirstletter eq $currentlastletter) {
+		@{$compactedhash->{$currentfirstletter}} = @currentOIDs;
+		$lastkey = $currentfirstletter;
+	    } else {
+		@{$compactedhash->{"$currentfirstletter-$currentlastletter"}} = @currentOIDs;
+		$lastkey = "$currentfirstletter-$currentlastletter";
+	    } 
+	    if (scalar (@{$classhashref->{$subsection}}) >= $max) {
+		# this key is now complete. Start a new one
+		$compactedhash->{$subsection} = $classhashref->{$subsection};
+		@currentOIDs = ();
+		$currentfirstletter = "";
+		$lastkey = $subsection;
+	    } else {
+		@currentOIDs = @{$classhashref->{$subsection}};
+		$currentfirstletter = $subsection;
+		$currentlastletter = $subsection;
+	    }
+	}
+    }
+
+    # add final OIDs to last sub-classification if there aren't many otherwise
+    # add final sub-classification
+    # BUG FIX: don't add anything if there are no currentOIDs (thanks to Don Gourley)
+    if (! scalar(@currentOIDs)) {return $compactedhash;}
+
+    if (scalar (@currentOIDs) < $min) {
+	my ($newkey) = $lastkey =~ /^(.)/;
+	@currentOIDs = (@{$compactedhash->{$lastkey}}, @currentOIDs);
+	delete $compactedhash->{$lastkey};
+	@{$compactedhash->{"$newkey-$currentlastletter"}} = @currentOIDs;
+    } else {
+	if ($currentfirstletter eq $currentlastletter) {
+	    @{$compactedhash->{$currentfirstletter}} = @currentOIDs;
+	}
+	else {
+	    @{$compactedhash->{"$currentfirstletter-$currentlastletter"}} =
+		@currentOIDs;
+	}
+    }
+
+    return $compactedhash;
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/AZSectionList.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/AZSectionList.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/AZSectionList.pm	(revision 24799)
@@ -0,0 +1,124 @@
+###########################################################################
+#
+# AZSectionList.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# classifier plugin for sorting sections alphabetically
+
+# this is very similar to AZList except it sorts by
+# section level metadata (excluding the top level)
+# instead of just top level metadata
+
+# the only change is to the classify() subroutine which 
+# must now iterate through each section, adding each
+# to the classification
+
+# 12/05/02 Added usage datastructure - John Thompson
+
+package AZSectionList;
+
+use AZList;
+use sorttools;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+sub BEGIN {
+    @AZSectionList::ISA = ('AZList');
+}
+
+my $arguments = [
+		 ];
+my $options = { 'name'     => "AZSectionList",
+		'desc'     => "{AZSectionList.desc}",
+		'abstract' => "no",
+		'inherits' => "yes" }; 
+
+
+sub new {
+    my ($class) = shift (@_);
+    my ($classifierslist,$inputargs,$hashArgOptLists) = @_;
+    push(@$classifierslist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new AZList($classifierslist, $inputargs, $hashArgOptLists);
+
+    return bless $self, $class;
+}
+
+sub classify {
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+
+    my $doc_OID = $doc_obj->get_OID();
+    my $thissection = $doc_obj->get_next_section ($doc_obj->get_top_section());
+
+    while (defined $thissection) {
+	$self->classify_section ($thissection, $doc_obj);
+	$thissection = $doc_obj->get_next_section ($thissection);
+    }
+}
+
+sub classify_section {
+    my $self = shift (@_);
+    my ($section, $doc_obj) = @_;
+
+    my $doc_OID = $doc_obj->get_OID();
+
+    my $metavalue;
+    my $metaname;
+
+    if (!defined $self->{'meta_list'}) {
+	# just in case
+	return;
+    }
+
+    # find the first available metadata
+    foreach my $m (@{$self->{'meta_list'}}) {
+	$metavalue = $doc_obj->get_metadata_element($section, $m);
+	$metaname = $m;
+	last if defined $metavalue;
+    } 
+
+    # if this section doesn't contain the metadata element we're
+    # sorting by we won't include it in this classification
+
+    if (defined $metavalue && $metavalue ne "") {
+	if ($self->{'removeprefix'}) {
+	    $metavalue =~ s/^$self->{'removeprefix'}//;
+	}
+	
+	$metavalue = &sorttools::format_metadata_for_sorting($metaname, $metavalue, $doc_obj) unless $self->{'no_metadata_formatting'};
+	if (defined $self->{'list'}->{"$doc_OID.$section"}) {
+	    my $outhandle = $self->{'outhandle'};
+	    print $outhandle "WARNING: AZSectionList::classify called multiple times " .
+		"for $doc_OID.$section\n";
+	} 
+	$self->{'list'}->{"$doc_OID.$section"} = $metavalue;
+    }
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/AllList.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/AllList.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/AllList.pm	(revision 24799)
@@ -0,0 +1,111 @@
+###########################################################################
+#
+# AllList.pm -- Creates a single list of all documents. Use by the oaiserver.
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2005 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package AllList;
+
+use BaseClassifier;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+sub BEGIN {
+    @AllList::ISA = ('BaseClassifier');
+}
+
+my $arguments = 
+    [
+     ];
+
+my $options = { 'name'     => "AllList",
+		'desc' => "{AllList.desc}",
+	        'abstract' => "yes", # hide from gli
+	        'inherits' => "yes" };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($classifierslist,$inputargs,$hashArgOptLists) = @_;
+    push(@$classifierslist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new BaseClassifier($classifierslist, $inputargs, $hashArgOptLists);
+    
+    if ($self->{'info_only'}) {
+	# don't worry about any options etc
+	return bless $self, $class;
+    }
+
+    # Manually set $self parameters.
+    $self->{'list'} = [];
+    $self->{'buttonname'} = "All Documents";
+
+    return bless $self, $class;
+}
+
+sub init {
+    my $self = shift (@_);
+}
+
+sub classify {
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+    
+    my $doc_OID = $doc_obj->get_OID();
+   
+    push (@{$self->{'list'}}, $doc_OID);
+    
+    return;
+}
+
+sub get_classify_info {
+    my $self = shift(@_);
+    my ($no_thistype) = @_;
+
+    my %classifyinfo = ('childtype'   =>'VList',
+			'Title'       =>$self->{'buttonname'},
+			'contains'    =>[],
+			'classifyOID' =>"oai");
+    $classifyinfo{'thistype'} = 'Invisible';
+    my @list = @{$self->{'list'}};
+
+    my $seqNo = 0;
+    foreach my $OID (@list) {
+	my $hashref={};
+	$hashref->{'OID'}=$OID;
+       
+	my %tempinfo=('childtype'=>'VList',
+		      'Title'=>$self->{'buttonname'},
+		      'classifyOID' =>"oai.$seqNo",
+		      'contains'    =>[]);
+
+	push (@{$tempinfo{'contains'}}, $hashref);
+
+	push (@{$classifyinfo{'contains'}}, \%tempinfo);
+	$seqNo ++;
+    }
+
+    return \%classifyinfo;
+}
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/BaseClassifier.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/BaseClassifier.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/BaseClassifier.pm	(revision 24799)
@@ -0,0 +1,394 @@
+###########################################################################
+#
+# BaseClassifier.pm -- base class for all classifiers
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2000 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package BaseClassifier;
+
+# How a classifier works.  
+#
+# For each classifier requested in the collect.cfg file, buildcol.pl creates
+# a new classifier object (a subclass of BaseClassifier).  Later, it passes each 
+# document object to each classifier in turn for classification.
+#
+# Four primary functions are used:
+#
+# 1. "new" is called before the documents are processed to set up the
+#    classifier.
+#
+# 2. "init" is called after buildcol.pl has created the indexes etc but
+#    before the documents are classified in order that the classifier might
+#    set any variables it requires, etc.
+#
+# 3. "classify" is called once for each document object.  The classifier
+#    "classifies" each document and updates its local data accordingly.
+#
+# 4. "get_classify_info" is called after every document has been
+#    classified.  It collates the information about the documents and
+#    stores a reference to the classifier so that Greenstone can later
+#    display it.
+
+# 09/05/02 Added usage datastructure - John Thompson
+# 28/11/03 Commented out verbosity argument - John Thompson
+
+use gsprintf;
+use printusage;
+use parse2;
+use unicode;
+
+# suppress the annoying "subroutine redefined" warning that various
+# classifiers cause under perl 5.6
+$SIG{__WARN__} = sub {warn($_[0]) unless ($_[0] =~ /Subroutine\s+\S+\sredefined/)};
+
+use strict;
+no strict 'subs'; # allow barewords (eg STDERR) as function arguments
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+my $arguments = 
+    [ 
+      { 'name' => "buttonname",
+  	'desc' => "{BasClas.buttonname}",
+	'type' => "string",
+	'deft' => "",
+	'reqd' => "no" },
+      { 'name' => "no_metadata_formatting",
+        'desc' => "{BasClas.no_metadata_formatting}",
+        'type' => "flag" },
+      { 'name' => "builddir",
+	'desc' => "{BasClas.builddir}",
+	'type' => "string",
+	'deft' => "" },
+      { 'name' => "outhandle",
+	'desc' => "{BasClas.outhandle}",
+	'type' => "string",
+	'deft' => "STDERR" },
+      { 'name' => "verbosity",
+	'desc' => "{BasClas.verbosity}",
+#	'type' => "enum",
+	'type' => "int",
+	'deft' => "2",
+	'reqd' => "no" }
+      
+#      { 'name' => "ignore_namespace",
+#	'desc' => "{BasClas.ignore_namespace}",
+#	'type' => "flag"} 
+      ];
+
+my $options = { 'name'     => "BaseClassifier",
+		'desc'     => "{BasClas.desc}",
+		'abstract' => "yes",
+		'inherits' => "no",
+		'args'     => $arguments };
+
+
+sub gsprintf
+{
+    return &gsprintf::gsprintf(@_);
+}
+
+
+sub print_xml_usage
+{
+    my $self = shift(@_);
+    my $header = shift(@_);
+    my $high_level_information_only = shift(@_);
+    
+    # XML output is always in UTF-8
+    &gsprintf::output_strings_in_UTF8;
+
+    if ($header) {
+	&PrintUsage::print_xml_header("classify");
+    }
+    $self->print_xml($high_level_information_only);
+}
+
+
+sub print_xml
+{
+    my $self = shift(@_);
+    my $high_level_information_only = shift(@_);
+
+    my $optionlistref = $self->{'option_list'};
+    my @optionlist = @$optionlistref;
+    my $classifieroptions = shift(@$optionlistref);
+    return if (!defined($classifieroptions));
+
+    &gsprintf(STDERR, "<ClassInfo>\n");
+    &gsprintf(STDERR, "  <Name>$classifieroptions->{'name'}</Name>\n");
+    my $desc = &gsprintf::lookup_string($classifieroptions->{'desc'});
+    $desc =~ s/</&amp;lt;/g; # doubly escaped
+    $desc =~ s/>/&amp;gt;/g;
+    &gsprintf(STDERR, "  <Desc>$desc</Desc>\n");
+    &gsprintf(STDERR, "  <Abstract>$classifieroptions->{'abstract'}</Abstract>\n");
+    &gsprintf(STDERR, "  <Inherits>$classifieroptions->{'inherits'}</Inherits>\n");
+    unless (defined($high_level_information_only)) {
+	&gsprintf(STDERR, "  <Arguments>\n");
+	if (defined($classifieroptions->{'args'})) {
+	    &PrintUsage::print_options_xml($classifieroptions->{'args'});
+	}
+	&gsprintf(STDERR, "  </Arguments>\n");
+
+	# Recurse up the classifier hierarchy
+	$self->print_xml();
+    }
+    &gsprintf(STDERR, "</ClassInfo>\n");
+}
+
+
+sub print_txt_usage
+{
+    my $self = shift(@_);
+
+    # Print the usage message for a classifier (recursively)
+    my $descoffset = $self->determine_description_offset(0);
+    $self->print_classifier_usage($descoffset, 1);
+}
+
+
+sub determine_description_offset
+{
+    my $self = shift(@_);
+    my $maxoffset = shift(@_);
+
+    my $optionlistref = $self->{'option_list'};
+    my @optionlist = @$optionlistref;
+    my $classifieroptions = pop(@$optionlistref);
+    return $maxoffset if (!defined($classifieroptions));
+
+    # Find the length of the longest option string of this classifier
+    my $classifierargs = $classifieroptions->{'args'};
+    if (defined($classifierargs)) {
+	my $longest = &PrintUsage::find_longest_option_string($classifierargs);
+	if ($longest > $maxoffset) {
+	    $maxoffset = $longest;
+	}
+    }
+
+    # Recurse up the classifier hierarchy
+    $maxoffset = $self->determine_description_offset($maxoffset);
+    $self->{'option_list'} = \@optionlist;
+    return $maxoffset;
+}
+
+
+sub print_classifier_usage
+{
+    my $self = shift(@_);
+    my $descoffset = shift(@_);
+    my $isleafclass = shift(@_);
+
+    my $optionlistref = $self->{'option_list'};
+    my @optionlist = @$optionlistref;
+    my $classifieroptions = shift(@$optionlistref);
+    return if (!defined($classifieroptions));
+
+    my $classifiername = $classifieroptions->{'name'};
+    my $classifierargs = $classifieroptions->{'args'};
+    my $classifierdesc = $classifieroptions->{'desc'};
+    # Produce the usage information using the data structure above
+    if ($isleafclass) {
+	if (defined($classifierdesc)) {
+	    &gsprintf(STDERR, "$classifierdesc\n\n");
+	}
+	&gsprintf(STDERR, " {common.usage}: classify $classifiername [{common.options}]\n\n");
+	
+    }
+
+    # Display the classifier options, if there are some
+    if (defined($classifierargs)) {
+	# Calculate the column offset of the option descriptions
+	my $optiondescoffset = $descoffset + 2;  # 2 spaces between options & descriptions
+
+	if ($isleafclass) {
+	    &gsprintf(STDERR, " {common.specific_options}:\n");
+	}
+	else {
+	    &gsprintf(STDERR, " {common.general_options}:\n", $classifiername);
+	}
+
+	# Display the classifier options
+	&PrintUsage::print_options_txt($classifierargs, $optiondescoffset);
+    }
+
+    # Recurse up the classifier hierarchy
+    $self->print_classifier_usage($descoffset, 0);
+    $self->{'option_list'} = \@optionlist;
+}
+
+
+sub new {
+    my ($class) = shift (@_);
+    my ($classifierslist,$args,$hashArgOptLists) = @_;
+    push(@$classifierslist, $class);
+    my $classifier_name = (defined $classifierslist->[0]) ? $classifierslist->[0] : $class;
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+
+    # Manually set $self parameters.
+    my $self = {};
+    $self->{'outhandle'} = STDERR;
+    $self->{'idnum'} = -1;
+    $self->{'option_list'} = $hashArgOptLists->{"OptList"};
+    $self->{"info_only"} = 0;
+
+    # Check if gsdlinfo is in the argument list or not - if it is, don't parse 
+    # the args, just return the object.  
+    foreach my $strArg (@{$args})
+    {
+	if($strArg eq "-gsdlinfo")
+	{
+	    $self->{"info_only"} = 1;
+	    return bless $self, $class;
+	}
+    }
+
+    # general options available to all classifiers
+    if(parse2::parse($args,$hashArgOptLists->{"ArgList"},$self) == -1)
+    {
+	#print out the text usage of this classifier. 
+	my $classTempClass = bless $self, $class;
+	print STDERR "<BadClassifier c=$classifier_name>\n";
+
+	&gsprintf(STDERR, "\n{BasClas.bad_general_option}\n", $classifier_name);
+	$classTempClass->print_txt_usage("");  # Use default resource bundle
+	die "\n";
+    }
+    
+    delete $self->{"info_only"};
+	# user-entered UTF-8 display meta for buttonname. Needs to be internally turned into unicode
+	# (will later be turned back to UTF-8 along with the rest of the metadata)
+	if ($self->{'buttonname'}) {
+		$self->{'buttonname'} = &unicode::convert_utf8_string_to_unicode_string($self->{'buttonname'});
+	}
+    return bless $self, $class;
+}
+
+sub init {
+    my $self = shift (@_);
+
+    $self->{'supportsmemberof'} = &supports_memberof();
+}
+
+sub set_number {
+    my $self = shift (@_);
+    my ($id)   = @_;
+    $self->{'idnum'} = $id;
+}
+
+sub get_number {
+    my $self = shift (@_);
+    return $self->{'idnum'};
+}
+
+sub oid_array_delete
+{
+    my $self = shift (@_);
+    my ($delete_oid,$field) = @_;
+
+    my $outhandle = $self->{'outhandle'};
+
+    my @filtered_list = ();
+    foreach my $existing_oid (@{$self->{$field}}) {
+	if ($existing_oid eq $delete_oid) {
+	    print $outhandle "  Deleting old $delete_oid for ", ref $self, "\n";
+	}
+	else {
+	    push(@filtered_list,$existing_oid);
+	}
+    }
+    $self->{$field} = \@filtered_list;
+}
+
+sub oid_hash_delete
+{
+    my $self = shift (@_);
+    my ($delete_oid,$field) = @_;
+
+    my $outhandle = $self->{'outhandle'};
+
+    print $outhandle "  Deleting old $delete_oid for ", ref $self, "\n";
+    delete $self->{$field}->{$delete_oid};
+}
+
+sub classify {
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+
+    my $outhandle = $self->{'outhandle'};
+    &gsprintf($outhandle, "BaseClassifier::classify {common.must_be_implemented}\n");
+}
+
+sub get_classify_info {
+    my $self = shift (@_);
+
+    my $outhandle = $self->{'outhandle'};
+    &gsprintf($outhandle, "BaseClassifier::get_classify_info {common.must_be_implemented}\n");
+}
+
+sub supports_memberof {
+    my $self = shift(@_);
+
+    return "false";
+}
+
+# previously, if a buttonname wasn't specified, we just use the metadata value,
+# but with a list of metadata, we want to do something a bit nicer so that
+# eg -metadata dc.Title,Title will end up with Title as the buttonname
+
+# current algorithm - use the first element, but strip its namespace
+sub generate_title_from_metadata {
+    
+    my $self = shift (@_);
+    my $metadata = shift (@_);
+
+    return "" unless defined $metadata && $metadata =~ /\S/;
+    
+    my @metalist = split(/,|;/, $metadata);
+    my $firstmeta = $metalist[0];
+    if ($firstmeta =~ /\./) {
+	$firstmeta =~ s/^\w+\.//;
+    }
+    return $firstmeta; 
+}
+
+
+# ex. can be at front, or it may be a list of metadata, separated by ,/; 
+sub strip_ex_from_metadata {
+    my $self = shift (@_);
+    my $metadata = shift (@_);
+
+    return $metadata unless defined $metadata && $metadata =~ /\S/;
+
+    # only remove ex. metadata prefix if there are no other prefixes after it
+    $metadata =~ s/(,|;|:|\/)/$1 /g; # insert a space separator so meta names like flex.Image don't become fl.Image
+    $metadata =~ s/(^| )ex\.([^.,;:\/]+)(,|;|:|\/|$)/$1$2$3/g; 
+					 $metadata =~ s/(,|;|:|\/) /$1/g;
+
+    return $metadata;
+}
+   
+
+1; 
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/Browse.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/Browse.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/Browse.pm	(revision 24799)
@@ -0,0 +1,99 @@
+###########################################################################
+#
+# Browse.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package Browse;
+
+use BaseClassifier;
+use sorttools;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+sub BEGIN {
+    @Browse::ISA = ('BaseClassifier');
+}
+
+my $arguments = [
+		 ];
+my $options = { 'name'     => "Browse",
+		'desc'     => "{Browse.desc}",
+		'abstract' => "yes",
+		'inherits' => "yes" };
+
+
+sub new {
+    my ($class) = shift (@_);
+    my ($classifierslist,$inputargs,$hashArgOptLists) = @_;
+    push(@$classifierslist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new BaseClassifier($classifierslist, $inputargs, $hashArgOptLists);
+
+    if ($self->{'info_only'}) {
+	# don't worry about any options etc
+	return bless $self, $class;
+    }
+
+    # Manually set $self parameters.
+    $self->{'collection'} = $ENV{'GSDLCOLLECTION'}; # classifier information
+    $self->{'buttonname'} = "Browse";
+
+    return bless $self, $class;
+}
+
+sub init {
+    my $self = shift (@_);
+
+    
+}
+
+sub classify {
+    my $self = shift (@_);
+   
+}
+
+sub get_classify_info {
+    my $self = shift (@_);
+  
+
+    # Return the information about the classifier that we'll later want to
+    # use to create macros when the Phind classifier document is displayed.
+    my %classifyinfo = ('thistype'=>'Invisible', 
+                        'Title'=>$self->{'buttonname'},
+			'contains'=>[]);
+    
+    my $collection = $self->{'collection'};
+    my $url = "library?a=br&c=collection";
+    push (@{$classifyinfo{'contains'}}, {'OID'=>$url});
+   
+    return \%classifyinfo;
+
+ 
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/Collage.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/Collage.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/Collage.pm	(revision 24799)
@@ -0,0 +1,266 @@
+##########################################################################
+#
+# Collage.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package Collage;
+
+use BaseClassifier;
+use sorttools;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+sub BEGIN {
+    @Collage::ISA = ('BaseClassifier');
+}
+
+my $arguments = 
+    [ { 'name' => "buttonname",
+  	'desc' => "{Collage.buttonname}",
+	'type' => "string",
+	'deft' => "Collage",
+	'reqd' => "no" }, 
+      { 'name' => "geometry",
+  	'desc' => "{Collage.geometry}",
+	'type' => "string",
+	'deft' => "600x300",
+	'reqd' => "no" },
+      { 'name' => "verbosity",
+  	'desc' => "{BasClas.verbosity}",
+	'type' => "string",
+	'deft' => "5",
+	'reqd' => "no" },
+      { 'name' => "maxDepth",
+  	'desc' => "{Collage.maxDepth}",
+	'type' => "string",
+	'deft' => "500"},
+#      { 'name' => "maxDownloads",
+#  	'desc' => "{Collage.maxDownloads}",
+#	'type' => "string",
+#	'deft' => "",
+#	'reqd' => "no" },
+      { 'name' => "maxDisplay",
+  	'desc' => "{Collage.maxDisplay}",
+	'type' => "string",
+	'deft' => "25",
+	'reqd' => "no" },
+      { 'name' => "imageType",
+  	'desc' => "{Collage.imageType}",
+	'type' => "string",
+	'deft' => ".jpg%%.png",
+	'reqd' => "no" },
+      { 'name' => "bgcolor",
+  	'desc' => "{Collage.bgcolor}",
+	'type' => "string",
+	'deft' => "#96c29a",
+	'reqd' => "no" },
+      { 'name' => "refreshDelay",
+  	'desc' => "{Collage.refreshDelay}",
+	'type' => "string",
+	'deft' => "1500",
+	'reqd' => "no" },
+      { 'name' => "isJava2",
+  	'desc' => "{Collage.isJava2}",
+	'type' => "string",
+	'deft' => "auto",
+	'reqd' => "no" },
+      { 'name' => "imageMustNotHave",
+  	'desc' => "{Collage.imageMustNotHave}",
+	'type' => "string",
+	'deft' => "hl=%%x=%%gt=%%gc=%%.pr",
+	'reqd' => "no" },
+      { 'name' => "caption",
+  	'desc' => "{Collage.caption}",
+	'type' => "string",
+	'deft' => " ",
+	'reqd' => "no" }
+      ];
+
+
+
+
+my $options = { 'name'     => "Collage",
+		'desc'     => "{Collage.desc}",
+		'abstract' => "no",
+		'inherits' => "Yes",
+		'args'     => $arguments };
+
+
+sub new {
+    my ($class) = shift (@_);
+    my ($classifierslist,$inputargs,$hashArgOptLists) = @_;
+    push(@$classifierslist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new BaseClassifier($classifierslist, $inputargs, $hashArgOptLists);
+    
+    if ($self->{'info_only'}) {
+	# don't worry about any options etc
+	return bless $self, $class;
+    }
+
+    # Manually set $self parameters.
+    $self->{'list'} = {};
+    $self->{'buttonname'} = 'Collage' unless ($self->{'buttonname'});
+
+    return bless $self, $class;
+}
+
+sub init {
+    my $self = shift (@_);
+
+    $self->{'list'} = [];
+}
+
+sub classify {
+   
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+
+    my $has_image_type = 0;
+
+    my @image_type_split = split(/%/,$self->{'imageType'});
+    my @image_type_ext = map { "($_)" } @image_type_split;
+    my $image_type_re = join("|",@image_type_ext);
+    $image_type_re =~ s/\./\\\./g;
+
+    my $assoc_files = $doc_obj->{'associated_files'};
+
+    foreach my $af ( @$assoc_files ) {
+	my ($real_filename, $assoc_filename, $mime_type, $section) = @$af;
+	if ($assoc_filename =~ m/$image_type_re/) {
+	    $has_image_type = 1;
+	    last;
+	}
+    }
+
+    if ($has_image_type) {
+
+	my $doc_OID = $doc_obj->get_OID();
+
+	push (@{$self->{'list'}}, $doc_OID);
+	
+    }
+
+}
+
+sub get_classify_info {
+    my $self = shift (@_);
+    
+    my $items_per_page = 2; 
+    my $max_items_per_page = 20;
+
+    my @list      = @{$self->{'list'}};
+
+    my $outhandle = $self->{'outhandle'};
+    my $verbosity = $self->{'verbosity'};
+
+    if ($verbosity>1) {
+	print $outhandle ("$self->{'buttonname'}\n");
+    }
+
+    my $collage_head = $self->get_entry ($self->{'buttonname'}, "Collage", "Invisible");
+    my $collage_curr = $self->get_entry("Collage","VList");
+    push (@{$collage_head->{'contains'}},$collage_curr);
+
+    my $global_c=1;
+    my $within_page_c=1;
+
+    foreach my $oid (@list) {
+	if ($within_page_c>$items_per_page) {
+	    my $title = "Items $global_c+";
+	    my $nested_node = $self->get_entry($title,"VList");
+	    push (@{$collage_curr->{'contains'}}, $nested_node);
+	    $collage_curr = $nested_node;
+
+	    $within_page_c=1;
+	    
+	    $items_per_page++ if ($items_per_page < $max_items_per_page);
+	}
+
+	push (@{$collage_curr->{'contains'}}, {'OID'=>$oid});
+	$global_c++;
+	$within_page_c++;
+    }
+   
+    return $collage_head;
+}
+
+
+sub get_entry {
+    my $self = shift (@_);
+    my ($title, $childtype, $thistype) = @_;
+
+    # organise into classification structure
+    my %classifyinfo = ('childtype'=>$childtype,
+			'Title'=>$title,
+			'contains'=>[]);
+
+    $classifyinfo{'thistype'} = $thistype if (defined $thistype);
+
+    if ($childtype eq "Collage") {
+	my $geometry = $self->{'geometry'};
+	my ($x_dim,$y_dim) = ($geometry =~ m/^(.*)x(.*)$/);
+	my $verbosity = $self->{'verbosity'};
+	my $maxDepth = $self->{'maxDepth'};
+#	my $maxDownloads = $self->{'maxDownloads'};
+	my $maxDisplay = $self->{'maxDisplay'};
+	my $imageType = $self->{'imageType'};
+	my $bgcolor = $self->{'bgcolor'};
+	my $refreshDelay = $self->{'refreshDelay'};
+	my $isJava2 = $self->{'isJava2'};
+	my $imageMustNotHave = $self->{'imageMustNotHave'};
+	my $caption = $self->{'caption'};
+	
+	#if (!defined($maxDownloads)) {
+	#    $maxDownloads="";
+	#}
+
+	my $parameters;
+
+	$parameters = "xdim=".$x_dim;
+	$parameters .= ";ydim=".$y_dim;
+	$parameters .= ";geometry=".$self->{'geometry'};
+	$parameters .= ";verbosity=".$self->{'verbosity'};
+	$parameters .= ";maxDepth=".$self->{'maxDepth'};
+#	$parameters .= ";maxDownloads=".$maxDownloads;
+	$parameters .= ";maxDisplay=".$self->{'maxDisplay'};
+	$parameters .= ";imageType=".$self->{'imageType'};
+	$parameters .= ";bgcolor=".$self->{'bgcolor'};
+	$parameters .= ";refreshDelay=".$self->{'refreshDelay'};
+	$parameters .= ";isJava2=".$self->{'isJava2'};
+	$parameters .= ";caption=".$self->{'caption'};
+
+#	$parameters .= ";imageMustNotHave=".$self->{'imageMustNotHave'};
+
+    
+	$classifyinfo{'parameters'} = $parameters;
+    }
+
+    return \%classifyinfo;
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/DateList.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/DateList.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/DateList.pm	(revision 24799)
@@ -0,0 +1,414 @@
+###########################################################################
+#
+# DateList.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# classifier plugin for sorting by date
+
+# date is assumed to be in the form yyyymmdd
+
+# at present dates are split by year - this should change
+# jrm21 - added option "bymonth", which splits by year and month.
+
+# 23/09/03 Added some more options -kjdon.
+# these include:
+# -nogroup, which makes each year (or year+month) an individual entry in 
+# the horizontal list and prevents compaction
+# -metadata, use a different metadata for the date (instead of Date), still expects yyyymmdd format. this affects display cos greenstone displays Date metadata as dd month yyyy, whereas any other date metadata is displayed as yyyymmdd - this needs fixing
+# -sort specifies an additional metadata to use in sorting, will take affect when two docs have the same date.
+
+package DateList;
+
+use BaseClassifier;
+use sorttools;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+sub BEGIN {
+    @DateList::ISA = ('BaseClassifier');
+}
+
+my $arguments =
+    [ { 'name' => "metadata",
+        'desc' => "{DateList.metadata}",
+        'type' => "metadata",
+	'deft' => "Date",
+        'reqd' => "yes" } ,
+      { 'name' => "sort",
+        'desc' => "{DateList.sort}",
+        'type' => "metadata",
+	'reqd' => "no" } ,
+      { 'name' => "reverse_sort",
+	'desc' => "{DateList.reverse_sort}",
+	'type' => "flag",
+	'reqd' => "no" },
+      { 'name' => "bymonth",
+	'desc' => "{DateList.bymonth}",
+	'type' => "flag",
+	'reqd' => "no" },
+      { 'name' => "nogroup",
+	'desc' => "{DateList.nogroup}",
+	'type' => "flag",
+	'reqd' => "no" },
+      { 'name' => "no_special_formatting",
+	'desc' => "{DateList.no_special_formatting}",
+	'type' => "flag",
+	'reqd' => "no" }
+      
+      ];
+
+my $options = { 'name'     => "DateList",
+		'desc'     => "{DateList.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+
+sub new {
+    my ($class) = shift (@_);
+    my ($classifierslist,$inputargs,$hashArgOptLists) = @_;
+    push(@$classifierslist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new BaseClassifier($classifierslist, $inputargs, $hashArgOptLists);
+
+    if ($self->{'info_only'}) {
+	# don't worry about any options etc
+	return bless $self, $class;
+    }
+
+    # Manually set $self parameters.
+    $self->{'list'} = {};
+
+    if (!defined $self->{"metadata"} || $self->{"metadata"} eq "") {
+	$self->{'metadata'} = "Date";
+    }
+    # remove any ex.s
+    $self->{'metadata'} = $self->strip_ex_from_metadata($self->{'metadata'});
+    $self->{'sort'} = $self->strip_ex_from_metadata($self->{'sort'});
+ 
+    # now can have comma separated list of Dates - we just use the first one (for now)
+    my @meta_list = split(/,/, $self->{"metadata"});
+    $self->{'meta_list'} = \@meta_list;
+ 
+    $self->{'buttonname'} = $self->generate_title_from_metadata($self->{'metadata'}) unless ($self->{'buttonname'});
+
+    $self->{'childtype'} = "DateList";
+    if ($self->{'no_special_formatting'}) {
+	$self->{'childtype'} = "VList";
+    }
+    
+    return bless $self, $class;
+}
+
+sub init {
+    my $self = shift (@_);
+
+    $self->{'list'} = {};
+}
+
+sub classify {
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+
+    my $doc_OID = $doc_obj->get_OID();
+
+    # find the first available metadata
+    my $date;
+    foreach my $m (@{$self->{'meta_list'}}) {
+	$date = $doc_obj->get_metadata_element($doc_obj->get_top_section(), $m);
+	last if defined $date;
+    } 
+    
+    #my $date = $doc_obj->get_metadata_element ($doc_obj->get_top_section(), $self->{'metadata'});
+    if (!defined $date || $date eq "") {
+	# if this document doesn't contain Date element we won't 
+	# include it in this classification
+	return;
+    }
+    
+    my $sort_other = "";
+    if (defined $self->{'sort'} && $self->{'sort'} ne "") {
+	$sort_other = $doc_obj->get_metadata_element ($doc_obj->get_top_section(), $self->{'sort'});
+	$sort_other = &sorttools::format_metadata_for_sorting($self->{'sort'}, $sort_other, $doc_obj) unless $self->{'no_metadata_formatting'};
+    }
+    
+    if (defined $self->{'list'}->{$doc_OID}) {
+	my $outhandle = $self->{'outhandle'};
+	print $outhandle "WARNING: DateList::classify called multiple times for $doc_OID\n";
+    } 
+   
+     
+    $self->{'list'}->{$doc_OID} = "$date$sort_other";
+
+}
+
+
+sub get_classify_info {
+    my $self = shift (@_);
+
+    my @classlist = sort {$self->{'list'}->{$a} cmp $self->{'list'}->{$b};} keys %{$self->{'list'}};
+
+    if ($self->{'reverse_sort'}) {
+	@classlist = reverse @classlist;
+    }
+
+
+    return $self->splitlist (\@classlist);
+}
+
+
+sub get_entry {
+    my $self = shift (@_);
+    my ($title, $childtype, $thistype) = @_;
+    
+    # organise into classification structure
+    my %classifyinfo = ('childtype'=>$childtype,
+			'Title'=>$title,
+			'contains'=>[],
+			'mdtype'=>$self->{'metadata'});
+    $classifyinfo{'thistype'} = $thistype 
+	if defined $thistype && $thistype =~ /\w/;
+
+    return \%classifyinfo;
+}
+
+# splitlist takes an ordered list of classifications (@$classlistref) and
+# splits it up into sub-sections by date
+sub splitlist {
+    my $self = shift (@_);
+    my ($classlistref) = @_;
+    my $classhash = {};
+
+    # top level
+    my $childtype = "HList";
+
+    if (scalar (@$classlistref) <= 39 &&
+	!$self->{'nogroup'}) {$childtype = $self->{'childtype'};}
+
+    my $classifyinfo = $self->get_entry ($self->{'buttonname'}, $childtype, "Invisible");
+    # don't need to do any splitting if there are less than 39 (max + min -1)
+    # classifications, unless nogroup is specified
+    if ((scalar @$classlistref) <= 39 && !$self->{'nogroup'}) {
+	foreach my $subOID (@$classlistref) {
+	    push (@{$classifyinfo->{'contains'}}, {'OID'=>$subOID});
+	}
+	return $classifyinfo;
+    }
+
+
+    if ($self->{'bymonth'}) {
+	# first split up the list into separate year+month classifications
+
+	if (!$self->{'nogroup'}) { # hlist of year+month pairs
+	    # single level of classifications
+	    foreach my $classification (@$classlistref) {
+		my $date = $self->{'list'}->{$classification};
+		$date =~ s/^(\d\d\d\d)-?(\d\d).*$/$1&nbsp;_textmonth$2_/;
+		# sanity check if month is zero
+		if ($date =~ /00_$/) {
+		    $date =~ s/^(\d\d\d\d).*$/$1/g;
+		}
+		$classhash->{$date} = [] unless defined $classhash->{$date};
+		push (@{$classhash->{$date}}, $classification);
+	    }
+	    
+	} else { # don't group - individual years and months
+	    foreach my $classification (@$classlistref) {
+		my $date = $self->{'list'}->{$classification};
+		$date =~ s/^(\d\d\d\d)-?(\d\d).*$/$1&nbsp;_textmonth$2_/;
+		my ($year, $month)=($1,$2);
+		# sanity check if month is zero
+		if ($date =~ /00_$/) {
+		    $date =~ s/^(\d\d\d\d).*$/$1/g;
+		}
+		# create subclass if it doesn't already exist
+		$classhash->{$year} = () unless defined $classhash->{$year};
+	          
+		$classhash->{$year}->{$month} = []
+		    unless defined $classhash->{$year}->{$month};
+		push (@{$classhash->{$year}->{$month}}, $classification);
+
+	    }
+	    # create hlist of years containing hlists of months
+
+	    
+	    if ($self->{'reverse_sort'}){
+               foreach my $subclass (sort {$b <=> $a} 
+				    (keys %$classhash)){
+		  my $yearclassify = $self->get_entry($subclass, "HList");
+		  foreach my $subsubclass (sort {$b <=> $a} 
+					   (keys %{$classhash->{$subclass}})) {
+		      my $monthname=$subsubclass;
+		      if ($monthname >= 1 && $monthname <= 12) {
+			  $monthname="_textmonth" . $monthname . "_";
+		      }
+		      my $monthclassify=$self->get_entry($monthname, $self->{'childtype'});
+		      push (@{$yearclassify->{'contains'}}, $monthclassify);
+		      
+		      foreach my $subsubOID 
+			  (@{$classhash->{$subclass}->{$subsubclass}}) {
+			      push (@{$monthclassify->{'contains'}},
+				  {'OID'=>$subsubOID});
+			  }
+		  }
+		  push (@{$classifyinfo->{'contains'}}, $yearclassify);
+	      }
+	    }
+	    else{
+		foreach my $subclass (sort {$a <=> $b} 
+				    (keys %$classhash)){
+		    my $yearclassify = $self->get_entry($subclass, "HList");
+		    foreach my $subsubclass (sort {$a <=> $b} 
+					     (keys %{$classhash->{$subclass}})) {
+		      my $monthname=$subsubclass;
+		      if ($monthname >= 1 && $monthname <= 12) {
+			  $monthname="_textmonth" . $monthname . "_";
+		      }
+		      my $monthclassify=$self->get_entry($monthname, $self->{'childtype'});
+		      push (@{$yearclassify->{'contains'}}, $monthclassify);
+		      
+		      foreach my $subsubOID 
+			  (@{$classhash->{$subclass}->{$subsubclass}}) {
+			      push (@{$monthclassify->{'contains'}},
+				    {'OID'=>$subsubOID});
+			  }
+		  }
+		    push (@{$classifyinfo->{'contains'}}, $yearclassify);
+		}
+		
+		
+	    }
+	    
+	    return $classifyinfo;
+	} # nogroup
+    }else {
+	# not by month
+	# first split up the list into separate year classifications
+	foreach my $classification (@$classlistref) {
+	    my $date = $self->{'list'}->{$classification};
+	    $date =~ s/^(\d\d\d\d).*$/$1/;
+	    $classhash->{$date} = [] unless defined $classhash->{$date};
+	    push (@{$classhash->{$date}}, $classification);
+	}
+          
+    }
+    
+    # only compact the list if nogroup not specified
+    if (!$self->{'nogroup'}) {
+	$classhash = $self->compactlist ($classhash);
+    }
+
+    if ($self->{'reverse_sort'} && $self->{'nogroup'} ) {
+ 	foreach my $subclass (reverse sort keys %$classhash) {
+	    my $tempclassify = $self->get_entry($subclass, $self->{'childtype'});
+	    foreach my $subsubOID (@{$classhash->{$subclass}}) {
+		push (@{$tempclassify->{'contains'}}, {'OID'=>$subsubOID});
+	    }
+	    push (@{$classifyinfo->{'contains'}}, $tempclassify);
+	}
+    }
+    else{
+	foreach my $subclass (sort keys %$classhash) {
+	    my $tempclassify = $self->get_entry($subclass, $self->{'childtype'});
+	    foreach my $subsubOID (@{$classhash->{$subclass}}) {
+		push (@{$tempclassify->{'contains'}}, {'OID'=>$subsubOID});
+	    }
+	    push (@{$classifyinfo->{'contains'}}, $tempclassify);
+	}
+
+    }
+    
+  
+    return $classifyinfo;
+}
+
+sub compactlist {
+    my $self = shift (@_);
+    my ($classhashref) = @_;
+    my $compactedhash = {};
+    my @currentOIDs = ();
+    my $currentfirstdate = "";
+    my $currentlastdate = "";
+    my $lastkey = "";
+
+    # minimum and maximum documents to be displayed per page.
+    # the actual maximum will be max + (min-1).
+    # the smallest sub-section is a single letter at present
+    # so in this case there may be many times max documents
+    # displayed on a page.
+    my $min = 10; 
+    my $max = 30;
+    foreach my $subsection (sort keys %$classhashref) {
+	$currentfirstdate = $subsection if $currentfirstdate eq "";
+	if ((scalar (@currentOIDs) < $min) ||
+	    ((scalar (@currentOIDs) + scalar (@{$classhashref->{$subsection}})) <= $max)) {
+	    push (@currentOIDs, @{$classhashref->{$subsection}});
+	    $currentlastdate = $subsection;
+	} else {
+	    if ($currentfirstdate eq $currentlastdate) {
+		@{$compactedhash->{$currentfirstdate}} = @currentOIDs;
+		$lastkey = $currentfirstdate;
+	    } else {
+		@{$compactedhash->{"$currentfirstdate-$currentlastdate"}} = @currentOIDs;
+		$lastkey = "$currentfirstdate-$currentlastdate";
+	    } 
+	    if (scalar (@{$classhashref->{$subsection}}) >= $max) {
+		$compactedhash->{$subsection} = $classhashref->{$subsection};
+		@currentOIDs = ();
+		$currentfirstdate = "";
+		$lastkey = $subsection;
+	    } else {
+		@currentOIDs = @{$classhashref->{$subsection}};
+		$currentfirstdate = $subsection;
+		$currentlastdate = $subsection;
+	    }
+	}
+    }
+
+    # add final OIDs to last sub-classification if there aren't many otherwise
+    # add final sub-classification
+    if (scalar (@currentOIDs) > 0) {
+	if ((scalar (@currentOIDs) < $min)) {
+	    
+	    # want every thing in previous up to the dash
+	    my ($newkey) = $lastkey =~ /^([^\-]+)/;
+	    @currentOIDs = (@{$compactedhash->{$lastkey}}, @currentOIDs);
+	    delete $compactedhash->{$lastkey};
+	    @{$compactedhash->{"$newkey-$currentlastdate"}} = @currentOIDs;	
+	} else {
+	    if ($currentfirstdate eq $currentlastdate) {
+		@{$compactedhash->{$currentfirstdate}} = @currentOIDs;
+	    } else {
+		@{$compactedhash->{"$currentfirstdate-$currentlastdate"}} = @currentOIDs;
+	    } 
+	}
+    }
+    
+    return $compactedhash;
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/HFileHierarchy.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/HFileHierarchy.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/HFileHierarchy.pm	(revision 24799)
@@ -0,0 +1,314 @@
+###########################################################################
+#
+# HFileHierarchy.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# classifier plugin for generating hierarchical classifications
+
+
+package HFileHierarchy;
+
+use BaseClassifier;
+use util;
+use cfgread;
+use sorttools;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+sub BEGIN {
+    @HFileHierarchy::ISA = ('BaseClassifier');
+}
+
+my $arguments =
+    [ { 'name' => "metadata",
+	'desc' => "{AZCompactList.metadata}",
+	'type' => "metadata",
+	'reqd' => "yes" },
+      { 'name' => "firstvalueonly",
+	'desc' => "{AZCompactList.firstvalueonly}",
+	'type' => "flag",
+	'reqd' => "no" },
+      { 'name' => "allvalues",
+	'desc' => "{AZCompactList.allvalues}",
+	'type' => "flag",
+	'reqd' => "no" },
+      { 'name' => "hfile",
+	'desc' => "{Hierarchy.hfile}",
+	'type' => "string",
+	'deft' => "",
+	'reqd' => "no" },
+      { 'name' => "sort",
+	'desc' => "{Hierarchy.sort}",
+	'type' => "metadata",
+	'reqd' => "no" },
+      { 'name' => "reverse_sort",
+	'desc' => "{Hierarchy.reverse_sort}",
+	'type' => "flag",
+	'reqd' => "no" },
+      { 'name' => "hlist_at_top",
+	'desc' => "{Hierarchy.hlist_at_top}",
+	'type' => "flag",
+	'reqd' => "no" },
+      { 'name' => "documents_last",
+	'desc' => "{Hierarchy.documents_last}",
+	'type' => "flag",
+	'reqd' => "no"}
+      ];
+
+my $options = 
+{ 	'name'     => "HFileHierarchy",
+	'desc'     => "{HFileHierarchy.desc}",
+	'abstract' => "yes",
+	'inherits' => "yes", 
+	'args'     => $arguments };
+
+
+sub new {
+    my ($class) = shift (@_);
+    my ($classifierslist,$inputargs,$hashArgOptLists) = @_;
+    push(@$classifierslist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new BaseClassifier($classifierslist, $inputargs, $hashArgOptLists);
+
+    if ($self->{'info_only'}) {
+	# don't worry about any options etc
+	return bless $self, $class;
+    }
+
+    my $metadata = $self->{'metadata'};
+    if (!$metadata) {
+	print STDERR "$class Error: required option -metadata not supplied\n";
+	$self->print_txt_usage("");  # Use default resource bundle
+	
+	die "$class Error: required option -metadata not supplied\n";
+    }
+    
+    $self->{'buttonname'} = $self->generate_title_from_metadata($metadata) unless ($self->{'buttonname'});
+    # strip ex from metadata
+    $metadata = $self->strip_ex_from_metadata($metadata);
+
+    my @meta_list = split(/,/, $metadata);
+    $self->{'meta_list'} = \@meta_list;
+
+    # sort = undef in this case is the same as sort=nosort
+    if ($self->{'sort'} eq "nosort") {
+	$self->{'sort'} = undef;
+    }
+    if (defined $self->{'sort'}) { # remove ex. namespace
+	$self->{'sort'} = $self->strip_ex_from_metadata($self->{'sort'});
+    }
+	
+    if ($self->{'hfile'}) {
+	my $hfile = $self->{'hfile'};
+	my $subjectfile;
+	$subjectfile = &util::filename_cat($ENV{'GSDLCOLLECTDIR'},"etc", $hfile);
+	if (!-e $subjectfile) {
+	    my $collfile = $subjectfile;
+	    $subjectfile = &util::filename_cat($ENV{'GSDLHOME'},"etc", $hfile);
+	    if (!-e $subjectfile) {
+		my $outhandle = $self->{'outhandle'};
+		print STDERR "\nHFileHierarchy Error: Can't locate subject file $hfile\n";
+		print STDERR "This file should be in $collfile or $subjectfile\n";
+		$self->print_txt_usage("");  # Use default resource bundle
+		print STDERR "\nHFileHierarchy Error: Can't locate subject file $hfile\n";
+		print STDERR "This file should be in $collfile or $subjectfile\n";
+		die "\n";
+	    }
+	}
+	$self->{'descriptorlist'} = {}; # first field in subject file
+	$self->{'locatorlist'} = {}; # second field in subject file
+	$self->{'subjectfile'} = $subjectfile;
+    }
+    
+
+   # $self->{'firstvalueonly'} = $firstvalueonly;
+   # $self->{'allvalues'} = $allvalues;
+
+    #$self->{'hlist_at_top'} = $hlist_at_top;
+
+    # Clean out the unused keys
+    delete $self->{'metadata'};
+    delete $self->{'hfile'};
+    
+    return bless $self, $class;
+}
+
+sub init {
+    my $self = shift (@_);
+
+    my $subjectfile = $self->{'subjectfile'};
+    if (defined $subjectfile) {
+	# read in the subject file, but read in unicode mode to preserve special characters
+	my $list = &cfgread::read_cfg_file_unicode ($self->{'subjectfile'}, undef, '^[^#]?\S');
+	# $list is a hash that is indexed by the descriptor. The contents of this
+	# hash is a list of two items. The first item is the OID and the second item
+	# is the title
+	foreach my $descriptor (keys (%$list)) {
+	    $self->{'descriptorlist'}->{$descriptor} = $list->{$descriptor}->[0];
+	    unless (defined $self->{'locatorlist'}->{$list->{$descriptor}->[0]}) {
+		$self->{'locatorlist'}->{$list->{$descriptor}->[0]}->{'title'} = $list->{$descriptor}->[1];
+		$self->{'locatorlist'}->{$list->{$descriptor}->[0]}->{'contents'} = [];
+	    }
+	}
+    }
+}
+
+sub hfile_classify
+{
+    my $self = shift (@_);
+    my ($doc_obj,$sortmeta,$metavalues) = @_;
+
+    my $outhandle = $self->{'outhandle'};
+
+    my $doc_OID = $doc_obj->get_OID();
+
+    foreach my $metaelement (@$metavalues) {
+	if ((defined $self->{'descriptorlist'}->{$metaelement}) &&
+	    (defined $self->{'locatorlist'}->{$self->{'descriptorlist'}->{$metaelement}})) {
+
+	    push (@{$self->{'locatorlist'}->{$self->{'descriptorlist'}->{$metaelement}}->{'contents'}}, 
+		  [$doc_OID, $sortmeta]);
+	    my $localid = $self->{'descriptorlist'}->{$metaelement};
+	    my $classid = $self->get_number();
+	    
+	    $doc_obj->add_metadata($doc_obj->get_top_section(), "memberof", "CL$classid.$localid");
+	    
+	}
+    }
+}
+
+
+
+
+sub hfile_get_classify_info {
+    my $self = shift (@_);
+    
+    my ($classifyinfo) = @_;
+
+    my $list = $self->{'locatorlist'};
+
+    my $classifier_num = "CL".$self->get_number();
+    # sorted the keys - otherwise funny things happen - kjdon 03/01/03
+    foreach my $OID (sort keys (%$list)) {
+	my $tempinfo = $self->get_OID_entry ($OID, $classifyinfo, "$classifier_num.$OID", $list->{$OID}->{'title'}, "VList");
+	
+	if (defined $self->{'sort'}) {
+	    if ($self->{'reverse_sort'}) {
+		foreach my $subOID (sort {$b->[1] cmp $a->[1];} @{$list->{$OID}->{'contents'}}) {
+		    push (@{$tempinfo->{'contains'}}, {'OID'=>$subOID->[0]});
+		}
+	    }
+	    else {
+		foreach my $subOID (sort {$a->[1] cmp $b->[1];} @{$list->{$OID}->{'contents'}}) {
+		    push (@{$tempinfo->{'contains'}}, {'OID'=>$subOID->[0]});
+		}
+	    }
+	}
+	else {
+	    foreach my $subOID (@{$list->{$OID}->{'contents'}}) {
+		push (@{$tempinfo->{'contains'}}, {'OID'=>$subOID->[0]});
+	    }
+	}
+    }
+    
+    return $classifyinfo;
+}
+
+
+sub supports_memberof {
+    my $self = shift(@_);
+
+    return "true";
+}
+
+sub get_OID_entry {
+    my $self = shift (@_);
+    my ($OID, $classifyinfo, $classifyOID, $title, $classifytype) = @_;
+
+    $OID = "" unless defined $OID;
+    $OID =~ s/^\.+//;
+
+    my ($headOID, $tailOID) = $OID =~ /^(\d+)(.*)$/;
+    $tailOID = "" unless defined $tailOID;
+
+    if (!defined $headOID) {
+	$classifyinfo->{'Title'} = $title;
+	$classifyinfo->{'classifyOID'} = $classifyOID;
+	$classifyinfo->{'classifytype'} = $classifytype;
+	return $classifyinfo;
+    }
+
+    $classifyinfo->{'contains'} = [] unless defined $classifyinfo->{'contains'};
+    if ($self->{'documents_last'}) {
+	# documents should come after nodes in the classifier
+
+	my $doc_pos = 0;
+	foreach my $thing (@{$classifyinfo->{'contains'}}) {
+	    last if defined $thing->{'OID'};
+	    $doc_pos++;
+	}
+	
+	while ($doc_pos < $headOID) {
+	    splice(@{$classifyinfo->{'contains'}}, $doc_pos, 0, $self->get_entry("", $classifytype));
+	    $doc_pos++;
+	}
+
+	return $self->get_OID_entry ($tailOID, $classifyinfo->{'contains'}->[($headOID-1)], $classifyOID, $title, $classifytype);
+
+    }
+    
+    # else, documents come before nodes
+    my $offset = 0;
+    foreach my $thing (@{$classifyinfo->{'contains'}}) {
+	$offset ++ if defined $thing->{'OID'};
+    }
+
+    while (scalar(@{$classifyinfo->{'contains'}}) < ($headOID+$offset)) { 
+	push (@{$classifyinfo->{'contains'}}, $self->get_entry("", $classifytype));
+    }
+
+    return $self->get_OID_entry ($tailOID, $classifyinfo->{'contains'}->[($headOID+$offset-1)], $classifyOID, $title, $classifytype);
+}
+
+sub get_entry {
+    my $self = shift (@_);
+    my ($title, $childtype, $thistype) = @_;
+    my $memberof = &supports_memberof();
+    
+    # organise into classification structure
+    my %classifyinfo = ('childtype'=>$childtype,
+			'Title'=>$title,
+			'supportsmemberof'=>$memberof,
+			'contains'=>[]);
+    $classifyinfo{'thistype'} = $thistype 
+	if defined $thistype && $thistype =~ /\w/;
+
+    return \%classifyinfo;
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/HTML.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/HTML.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/HTML.pm	(revision 24799)
@@ -0,0 +1,107 @@
+###########################################################################
+#
+# HTML.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# html classifier plugin - creates an empty classification
+# that's simply a link to a web page
+
+package HTML;
+
+use BaseClassifier;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+sub BEGIN {
+    @HTML::ISA = ('BaseClassifier');
+}
+
+my $arguments = 
+    [ { 'name' => "url",
+	'desc' => "{HTML.url}",
+	'type' => "string",
+	'reqd' => "yes" } ,
+      { 'name' => "buttonname",
+	'desc' => "{BasClas.buttonname}",
+	'type' => "string",
+	'deft' => "Browse",
+	'reqd' => "no" } ];
+
+my $options = { 'name'     => "HTML",
+		'desc'     => "{HTML.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+
+sub new {
+    my ($class) = shift (@_);
+    my ($classifierslist,$inputargs,$hashArgOptLists) = @_;
+    push(@$classifierslist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new BaseClassifier($classifierslist, $inputargs, $hashArgOptLists);
+
+    if ($self->{'info_only'}) {
+	# don't worry about any options etc
+	return bless $self, $class;
+    }
+
+    if (!$self->{'url'}) {
+	my $outhandle = $self->{'outhandle'};
+	print $outhandle "HTML Error: required option -url not supplied\n";
+	$self->print_txt_usage("");
+	die "HTML Error: required option -url not supplied\n";
+    }
+    return bless $self, $class;
+}
+
+sub init {
+    my $self = shift (@_);
+}
+
+sub classify {
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+
+    # we don't do anything for individual documents
+}
+
+sub get_classify_info {
+    my $self = shift (@_);
+
+    my %classifyinfo = ('thistype'=>'Invisible',
+			'childtype'=>'HTML',
+			'Title'=>$self->{'buttonname'},
+			'contains'=>[]);
+
+    push (@{$classifyinfo{'contains'}}, {'OID'=>$self->{'url'}});
+
+    return \%classifyinfo;
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/Hierarchy.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/Hierarchy.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/Hierarchy.pm	(revision 24799)
@@ -0,0 +1,352 @@
+###########################################################################
+#
+# Hierarchy.pm -- classifier that enables a Hierarchy to beformed without 
+#                 the need for a hierarchy file (like HFileHierarchy). Used
+#                 to be called AutoHierarchy.  Inherits from HFileHierarchy
+#                 so can also do everything that does as well.
+#                 Created by Imene, modified by Katherine and David.
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# An advanced Hierarchical classifier
+# to see the options, run "perl -S classinfo.pl Hierarchy"
+
+package Hierarchy;
+
+use HFileHierarchy;
+use sorttools;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+sub BEGIN {
+    @Hierarchy::ISA = ('HFileHierarchy');
+}
+
+my $arguments = 
+    [ { 'name' => "separator",
+	'desc' => "{Hierarchy.separator}",
+	'type' => "regexp",
+	'deft' => "[\\\\\\\/|\\\\\\\|]",
+	'reqd' => "no" },
+      { 'name' => "suppresslastlevel",
+	'desc' => "{Hierarchy.suppresslastlevel}",
+	'type' => "flag",
+	'reqd' => "no" },
+      { 'name' => "suppressfirstlevel",
+	'desc' => "{Hierarchy.suppressfirstlevel}",
+	'type' => "flag",
+	'reqd' => "no" }
+      ];
+
+my $options = { 'name'     => "Hierarchy",
+		'desc'     => "{Hierarchy.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+
+sub new {
+    my ($class) = shift (@_);
+    my ($classifierslist,$inputargs,$hashArgOptLists) = @_;
+    push(@$classifierslist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new HFileHierarchy($classifierslist, $inputargs, $hashArgOptLists);
+    
+    # the hash that we use to build up the hierarchy
+    $self->{'path_hash'}= {};
+    
+    return bless $self, $class;
+}
+
+
+sub auto_classify {
+    my $self = shift (@_);
+    my ($doc_obj,$nosort,$sortmeta,$metavalues) = @_;
+
+    my $doc_OID = $doc_obj->get_OID();
+
+    #Add all the metadata values to the hash
+    my $path_hash;
+    my $current_pos;
+    
+    
+    foreach my $metavalue (@$metavalues) {
+	$path_hash = $self->{'path_hash'};
+	my @chunks = split (/$self->{'separator'}/, $metavalue);
+	if ($self->{'suppresslastlevel'}) {
+	    pop(@chunks); # remove the last element from the end
+	}
+	if ($self->{'suppressfirstlevel'}) {
+	    shift(@chunks);
+	}
+	foreach my $folderName (@chunks) 
+	{
+	    # Removing leading and trailing spaces
+	    $folderName =~ s/^(\s+)//;
+	    $folderName =~ s/(\s+)$//;
+	    if ($folderName ne ""){ #sometimes the tokens are empty
+		$current_pos = $self->add_To_Hash($path_hash, $folderName, $nosort);
+		$path_hash = $current_pos->{'nodes'};
+	    } 
+	}
+	# now add the document, with sort meta if needed
+	if ($nosort) {
+	    push(@{$current_pos->{'docs'}}, $doc_OID);
+	} else {
+	    $current_pos->{'docs'}->{$doc_OID} = $sortmeta;
+	    
+	    #if (defined $sortmeta) {
+	#	# can you ever get the same doc twice in one classification??
+	#	$current_pos->{'docs'}->{$doc_OID} = $sortmeta;
+	#    } else {
+	#	$current_pos->{'docs'}->{$doc_OID} = $metavalue;
+	#    }
+	}
+    } # foreach metadata
+
+}
+
+sub classify {
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+
+    my $doc_OID = $doc_obj->get_OID();
+
+    # are we sorting the list??
+    my $nosort = 0;
+    if (!defined $self->{'sort'}) {
+	$nosort = 1;
+    }
+    
+    my $metavalues = [];
+    # find all the metadata values
+    foreach my $m (@{$self->{'meta_list'}}) {
+	my $mvalues = $doc_obj->get_metadata($doc_obj->get_top_section(), $m);
+	next unless (@{$mvalues});
+	if ($self->{'firstvalueonly'}) {
+	    # we only want the first metadata value
+	    push (@$metavalues, $mvalues->[0]);
+	    last;
+	}
+	push (@$metavalues, @$mvalues);
+	last if (!$self->{'allvalues'}); # we don't want to try other elements
+ 	                                 # cos we have already found some 
+    } 
+    
+    return unless (@$metavalues);
+
+    #check for a sort element other than our metadata
+    my $sortmeta = undef;
+    if (!$nosort) {
+	if ($self->{'sort'} =~ /^filename$/i) {
+	    $sortmeta = $doc_obj->get_source_filename();
+	} else {
+	    $sortmeta = $doc_obj->get_metadata_element($doc_obj->get_top_section(), $self->{'sort'});
+	    if (defined $sortmeta && !$self->{'no_metadata_formatting'}) {
+		$sortmeta = &sorttools::format_metadata_for_sorting($self->{'sort'}, $sortmeta, $doc_obj);
+	    }
+	}
+	$sortmeta = "" unless defined $sortmeta;
+    }
+
+    if (defined $self->{'subjectfile'}) {
+	$self->hfile_classify($doc_obj,$sortmeta,$metavalues);
+    }
+    else {
+	$self->auto_classify($doc_obj,$nosort,$sortmeta,$metavalues);
+    }
+}
+
+sub add_To_Hash {
+    my $self = shift (@_);
+    my ($myhash, $k, $nosort) = @_;
+    
+    if (!defined $myhash->{$k}){
+	$myhash->{$k}={};
+	$myhash->{$k}->{'nodes'}={};
+	if ($nosort) {
+	    $myhash->{$k}->{'docs'}=[];
+	} else {
+	    $myhash->{$k}->{'docs'} = {};
+	}
+    }
+    return $myhash->{$k}; 
+}
+
+sub print_Hash{
+    my $self = shift (@_); 
+    my ($myHash, $num_spaces) = @_;
+
+    foreach my $key (keys %{$myHash}){
+	print "\n";
+	$self->print_spaces($num_spaces);
+	print STDERR "$key*";
+	$self->print_Hash($myHash->{$key}, $num_spaces + 2);
+    }    
+}
+
+sub print_spaces{
+    my $self = shift (@_);
+    my ($num_spaces) = @_;
+    
+    for (my $i = 0; $i < $num_spaces; $i++){
+	print STDERR " ";
+    }
+}
+
+sub get_entry {
+    my $self = shift (@_);
+    my ($title, $childtype, $thistype) = @_;
+    
+    # organise into classification structure
+    my %classifyinfo = ('childtype'=>$childtype,
+			'Title'=>$title,
+			'contains'=>[],);
+    $classifyinfo{'thistype'} = $thistype 
+	if defined $thistype && $thistype =~ /\w/;
+    
+    return \%classifyinfo;
+}
+
+sub process_hash {
+    my $self = shift (@_);
+    my ($top_hash, $top_entry) = @_;   
+    my ($entry);
+    
+    my $hash = {};
+    foreach my $key (sort keys %{$top_hash}) {
+	$entry = $self->get_entry($key,"VList","VList");
+	my $has_content = 0;
+	my @doc_list;
+	# generate a sorted list of doc ids
+	if (not (defined ($self->{'sort'})) && scalar(@{$top_hash->{$key}->{'docs'}})) {
+	    @doc_list = @{$top_hash->{$key}->{'docs'}};
+	} elsif (defined ($self->{'sort'}) && (keys %{$top_hash->{$key}->{'docs'}})) {
+	    @doc_list = sort {$top_hash->{$key}->{'docs'}->{$a} 
+			      cmp $top_hash->{$key}->{'docs'}->{$b};} keys %{$top_hash->{$key}->{'docs'}};
+	    
+	}
+
+	if ($self->{'documents_last'}) {
+	    # add nodes, then documents
+	    # if this key has nodes, add them
+	    if (scalar(keys %{$top_hash->{$key}->{'nodes'}})) {
+		$has_content = 1;
+		$self->process_hash($top_hash->{$key}->{'nodes'}, $entry); 
+	    }
+
+	    # if this key has documents, add them
+	    if (@doc_list) {
+		$has_content = 1;
+		foreach my $d (@doc_list) {
+		    push (@{$entry->{'contains'}}, {'OID'=>$d});
+		}    
+	    }
+
+	} else {
+	    # add documents then nodes
+	    # if this key has documents, add them
+	    if (@doc_list) {
+		$has_content = 1;
+		foreach my $d (@doc_list) {
+		    push (@{$entry->{'contains'}}, {'OID'=>$d});
+		}    
+	    }
+	    # if this key has nodes, add them
+	    if (scalar(keys %{$top_hash->{$key}->{'nodes'}})) {
+		$has_content = 1;
+		$self->process_hash($top_hash->{$key}->{'nodes'}, $entry); 
+	    }
+	}
+	
+	# if we have found some content, add the new entry for this key into the parent node
+	if ($has_content) {
+	    push (@{$top_entry->{'contains'}}, $entry);
+	}
+
+    }    
+}
+
+sub auto_get_classify_info {
+    my $self = shift (@_);
+    my ($no_thistype) = @_;
+    $no_thistype = 0 unless defined $no_thistype;
+
+    my ($classification);
+    my $top_h = $self->{'path_hash'};
+
+    if ($self->{'path_hash'}) {
+	if ($self->{'hlist_at_top'}) {
+	    $classification = $self->get_entry ($self->{'buttonname'}, "HList", "Invisible");
+	}
+	else {
+	    $classification = $self->get_entry ($self->{'buttonname'}, "VList", "Invisible");
+	}
+    }
+
+    $self->process_hash($top_h, $classification);
+   
+    return  $classification;
+
+}
+
+sub auto_get_classify_info
+{
+    my $self = shift (@_);
+    my ($classifyinfo) = @_;
+
+    $self->process_hash($self->{'path_hash'}, $classifyinfo);
+
+    return $classifyinfo;
+}
+
+
+sub get_classify_info {
+    my $self = shift (@_);
+
+    my ($classifyinfo);
+
+    if ($self->{'hlist_at_top'}) {
+	$classifyinfo = $self->get_entry ($self->{'buttonname'}, "HList", "Invisible");
+    }
+    else {
+	$classifyinfo = $self->get_entry ($self->{'buttonname'}, "VList", "Invisible");
+    }
+
+    if (defined $self->{'subjectfile'}) {
+	return $self->hfile_get_classify_info($classifyinfo);
+    }
+    else {
+	return $self->auto_get_classify_info($classifyinfo);
+    }
+}
+
+
+1;
+
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/List.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/List.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/List.pm	(revision 24799)
@@ -0,0 +1,903 @@
+###########################################################################
+#
+# List.pm -- A general and flexible list classifier with most of
+#                   the abilities of AZCompactList, and better Unicode,
+#                   metadata and sorting capabilities.
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Author: Michael Dewsnip, NZDL Project, University of Waikato, NZ
+#
+# Copyright (C) 2005 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# TO DO: - Remove punctuation from metadata values before sorting.
+#        - Add an AZCompactList-style hlist option?
+#
+###########################################################################
+
+package List;
+
+
+use BaseClassifier;
+
+use strict;
+
+
+sub BEGIN {
+    @List::ISA = ('BaseClassifier');
+}
+
+my $partition_type_list = 
+    [ { 'name' => "per_letter",
+	'desc' => "{List.level_partition.per_letter}" },
+      { 'name' => "approximate_size",
+	'desc' => "{List.level_partition.approximate_size}"}, 
+      { 'name' => "constant_size",
+	'desc' => "{List.level_partition.constant_size}" },      
+      { 'name' => "none",
+	'desc' => "{List.level_partition.none}" } ];
+
+# following used to check types later on
+my $valid_partition_types = { 'per_letter' => 1,
+			      'constant_size' => 1,
+			      'per_letter_fixed_size' => 1,
+			      'approximate_size' => 1,
+			      'none' => 1};
+
+my $bookshelf_type_list = 
+    [ { 'name' => "always",
+	'desc' => "{List.bookshelf_type.always}" },
+      { 'name' => "duplicate_only",
+	'desc' => "{List.bookshelf_type.duplicate_only}" },
+      { 'name' => "never",
+	'desc' => "{List.bookshelf_type.never}" } ];  
+
+my $arguments = 
+    [ { 'name' => "metadata",
+	'desc' => "{List.metadata}",
+	'type' => "metadata",
+	'reqd' => "yes" },
+
+      # The interesting options
+      { 'name' => "bookshelf_type", 
+	'desc' => "{List.bookshelf_type}",
+	'type' => "enum",
+	'list' => $bookshelf_type_list,
+	'deft' => "never" }, 
+      { 'name' => "classify_sections",
+	'desc' => "{List.classify_sections}",
+	'type' => "flag" },
+      { 'name' => "partition_type_within_level",
+	'desc' => "{List.partition_type_within_level}",
+	'type' => "enumstring",  # Must be enumstring because multiple values can be specified (separated by '/')
+	'list' => $partition_type_list,
+	'deft' => "per_letter" },
+      { 'name' => "partition_size_within_level",
+	'desc' => "{List.partition_size_within_level}",
+	'type' => "string" },  # Must be string because multiple values can be specified (separated by '/')
+      { 'name' => "partition_name_length",
+	'desc' => "{List.partition_name_length}",
+	'type' => "string" },
+      { 'name' => "sort_leaf_nodes_using",
+	'desc' => "{List.sort_leaf_nodes_using}",
+	'type' => "metadata",
+	'deft' => "Title" },
+      { 'name' => "reverse_sort_leaf_nodes",
+	'desc' => "{List.reverse_sort_leaf_nodes}",
+	'type' => "flag"},
+      { 'name' => "sort_using_unicode_collation",
+	'desc' => "{List.sort_using_unicode_collation}",
+	'type' => "flag" },
+      { 'name' => "use_hlist_for",
+	'desc' => "{List.use_hlist_for}",
+	'type' => "string" },
+      { 'name' => "removeprefix",
+	'desc' => "{BasClas.removeprefix}",
+	'type' => "regexp" },
+      { 'name' => "removesuffix",
+	'desc' => "{BasClas.removesuffix}",
+	'type' => "regexp" } ];
+
+my $options = { 'name'     => "List",
+		'desc'     => "{List.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+
+sub new
+{
+    my ($class) = shift(@_);
+    my ($classifierslist, $inputargs, $hashArgOptLists) = @_;
+    push(@$classifierslist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}}, @{$arguments}); 
+    push(@{$hashArgOptLists->{"OptList"}}, $options); 
+
+    my $self = new BaseClassifier($classifierslist, $inputargs, $hashArgOptLists);
+
+    if ($self->{'info_only'}) {
+	# don't worry about any options etc
+	return bless $self, $class;
+    }
+
+    # The metadata elements to use (required)
+    if (!$self->{'metadata'}) {
+	die "Error: No metadata fields specified for List.\n";
+    }
+
+    my @metadata_groups = split(/[\/]/, $self->{'metadata'});
+    $self->{'metadata_groups'} = \@metadata_groups;
+
+    # The classifier button name (default: the first metadata element specified)
+    if (!$self->{'buttonname'}) {
+	my $first_metadata_group = $metadata_groups[0];
+	my $first_metadata_element = (split(/[\;|,\/]/, $first_metadata_group))[0];	
+	$self->{'buttonname'} = $self->generate_title_from_metadata($first_metadata_element);
+    }
+
+    # Whether to group items into a bookshelf, (must be 'always' for all metadata fields except the last)
+    foreach my $metadata_group (@metadata_groups) {
+	$self->{$metadata_group . ".bookshelf_type"} = "always";
+    }    
+    my $last_metadata_group = $metadata_groups[$#metadata_groups];
+    # Default: duplicate_only, ie. leave leaf nodes ungrouped (equivalent to AZCompactList -mingroup 2)
+    $self->{$last_metadata_group . ".bookshelf_type"} = $self->{'bookshelf_type'};
+        
+    # Whether to use an hlist or a vlist for each level in the hierarchy (default: vlist)
+    foreach my $metadata_group (@metadata_groups) {
+	$self->{$metadata_group . ".list_type"} = "VList";
+    }
+    foreach my $metadata_group (split(/\,/, $self->{'use_hlist_for'})) {
+	$self->{$metadata_group . ".list_type"} = "HList";
+    }
+
+    # How the items are grouped into partitions (default: no partition) 
+    # for each level (metadata group), separated by '/'
+    if (!$self->{"partition_type_within_level"}) {
+	foreach my $metadata_group (@metadata_groups) {
+	    $self->{$metadata_group . ".partition_type_within_level"} = "none";
+	}
+    } else {
+	my @partition_type_within_levellist = split(/\//, $self->{'partition_type_within_level'});	
+		
+	my $first = 1;
+	foreach my $metadata_group (@metadata_groups) {
+	    my $partition_type_within_levelelem = shift(@partition_type_within_levellist);
+	    if (defined($partition_type_within_levelelem) && $partition_type_within_levelelem eq "per_letter_fixed_size") {
+		print STDERR "per letter fixed size, changing to approximate size\n";
+		$partition_type_within_levelelem = "approximate_size";
+	    }
+	    if (defined($partition_type_within_levelelem) && defined $valid_partition_types->{$partition_type_within_levelelem}) {
+		$self->{$metadata_group . ".partition_type_within_level"} = $partition_type_within_levelelem;
+	    }
+	    else {
+		if ($first) {
+		    $self->{$metadata_group . ".partition_type_within_level"} = "none";
+		    $first = 0;
+		} else {
+		    $self->{$metadata_group . ".partition_type_within_level"} = $self->{$metadata_groups[0] . ".partition_type_within_level"};
+		}
+		if (defined($partition_type_within_levelelem)) {
+		    # ie invalid entry
+		    print STDERR "invalid partition type for level $metadata_group: $partition_type_within_levelelem, defaulting to ". $self->{$metadata_group . ".partition_type_within_level"} ."\n";
+		}
+	    }
+	}
+    }
+    
+    # The number of items in each partition
+    if (!$self->{'partition_size_within_level'}) {
+	# Default: 20
+	foreach my $metadata_group (@metadata_groups) {
+	    $self->{$metadata_group . ".partition_size_within_level"} = 20;
+	}
+    }
+    else {
+	my @partition_size_within_levellist = split(/\//, $self->{'partition_size_within_level'});
+
+	# Assign values based on the partition_size_within_level parameter
+	foreach my $metadata_group (@metadata_groups) {
+	    my $partition_size_within_levelelem = shift(@partition_size_within_levellist);
+	    if (defined($partition_size_within_levelelem)) {
+		$self->{$metadata_group . ".partition_size_within_level"} = $partition_size_within_levelelem;
+	    }
+	    else {
+		$self->{$metadata_group . ".partition_size_within_level"} = $self->{$metadata_groups[0] . ".partition_size_within_level"};
+	    }
+	}
+    }
+
+    # The removeprefix and removesuffix expressions
+    if ($self->{'removeprefix'}) {
+	# If there are more than one expressions, use '' to quote each experession and '/' to separate
+	my @removeprefix_exprs_within_levellist = split(/'\/'/, $self->{'removeprefix'});
+
+	foreach my $metadata_group (@metadata_groups) {
+	    my $removeprefix_expr_within_levelelem = shift(@removeprefix_exprs_within_levellist);
+	    if (defined($removeprefix_expr_within_levelelem) && $removeprefix_expr_within_levelelem ne "") {
+		# Remove the other ' at the beginning and the end if there is any
+		$removeprefix_expr_within_levelelem =~ s/^'//;
+		$removeprefix_expr_within_levelelem =~ s/'$//;
+		# Remove the extra ^ at the beginning
+		$removeprefix_expr_within_levelelem =~ s/^\^//;
+		$self->{$metadata_group . ".remove_prefix_expr"} = $removeprefix_expr_within_levelelem;
+	    } else {
+		$self->{$metadata_group . ".remove_prefix_expr"} = $self->{$metadata_groups[0] . ".remove_prefix_expr"};
+	    }
+	}
+    } 
+    if ($self->{'removesuffix'}) {	
+	my @removesuffix_exprs_within_levellist = split(/'\/'/, $self->{'removesuffix'});
+
+	foreach my $metadata_group (@metadata_groups) {
+	    my $removesuffix_expr_within_levelelem = shift(@removesuffix_exprs_within_levellist);
+	    if (defined($removesuffix_expr_within_levelelem) && $removesuffix_expr_within_levelelem ne "") {
+		$removesuffix_expr_within_levelelem =~ s/^'//;
+		$removesuffix_expr_within_levelelem =~ s/'$//;
+		# Remove the extra $ at the end
+		$removesuffix_expr_within_levelelem =~ s/\$$//;
+		$self->{$metadata_group . ".remove_suffix_expr"} = $removesuffix_expr_within_levelelem;
+	    } else {
+		$self->{$metadata_group . ".remove_suffix_expr"} = $self->{$metadata_groups[0] . ".remove_suffix_expr"};
+	    }
+	}
+    }
+
+    # The metadata elements to use to sort the leaf nodes (default: Title)
+    my @sort_leaf_nodes_using_metadata_groups = ( "Title" );
+    if ($self->{'sort_leaf_nodes_using'}) {
+	@sort_leaf_nodes_using_metadata_groups = split(/\|/, $self->{'sort_leaf_nodes_using'});
+    }
+    $self->{'sort_leaf_nodes_using_metadata_groups'} = \@sort_leaf_nodes_using_metadata_groups;
+
+    # Create an instance of the Unicode::Collate object if better Unicode sorting is desired
+    if ($self->{'sort_using_unicode_collation'}) {
+	# To use this you first need to download the allkeys.txt file from 
+        # http://www.unicode.org/Public/UCA/latest/allkeys.txt and put it in the Perl
+        # Unicode/Collate directory.
+	require Unicode::Collate;
+	$self->{'unicode_collator'} = Unicode::Collate->new();
+    }
+
+    # An empty array for the document/section OIDs that we are classifying
+    $self->{'OIDs'} = [];
+    # A hash for all the doc ids that we have seen, so we don't classify something twice
+    $self->{'all_doc_OIDs'} = {};
+    return bless $self, $class;
+}
+
+
+sub init
+{
+    # Nothing to do...
+}
+
+
+# Called for each document in the collection
+sub classify
+{
+    my $self = shift(@_);
+    my ($doc_obj) = @_;
+
+    if (defined $self->{'all_doc_OIDs'}->{$doc_obj->get_OID()}) {
+	print STDERR "Warning, List classifier has already seen document ".$doc_obj->get_OID().", not classifying again\n";
+	return;
+    }
+    $self->{'all_doc_OIDs'}->{$doc_obj->get_OID()} = 1;
+    # If "-classify_sections" is set, classify every section of the document
+    if ($self->{'classify_sections'}) {
+	my $section = $doc_obj->get_next_section($doc_obj->get_top_section());
+	while (defined $section) {
+	    $self->classify_section($doc_obj, $doc_obj->get_OID() . ".$section", $section);
+	    $section = $doc_obj->get_next_section($section);
+	}
+    }
+    # Otherwise just classify the top document section
+    else {
+	$self->classify_section($doc_obj, $doc_obj->get_OID(), $doc_obj->get_top_section());
+    }
+    
+}
+
+sub classify_section
+{
+    my $self = shift(@_);
+    my ($doc_obj,$section_OID,$section) = @_;
+
+    my @metadata_groups = @{$self->{'metadata_groups'}};
+
+    # Only classify the section if it has a value for one of the metadata elements in the first group
+    my $classify_section = 0;
+    my $first_metadata_group = $metadata_groups[0];
+    my $remove_prefix_expr = $self->{$first_metadata_group . ".remove_prefix_expr"};
+    my $remove_suffix_expr = $self->{$first_metadata_group . ".remove_suffix_expr"};
+    foreach my $first_metadata_group_element (split(/\;|,/, $first_metadata_group)) {
+	my $real_first_metadata_group_element = $self->strip_ex_from_metadata($first_metadata_group_element);
+	my $first_metadata_group_element_value = $doc_obj->get_metadata_element($section, $real_first_metadata_group_element);	
+	
+	# Remove prefix/suffix if requested
+	if (defined ($first_metadata_group_element_value)) {
+	    if (defined $remove_prefix_expr && $remove_prefix_expr ne "") {	    
+		$first_metadata_group_element_value =~ s/^$remove_prefix_expr//;
+	    }
+	    
+	    if (defined $remove_suffix_expr && $remove_suffix_expr ne "") {
+		$first_metadata_group_element_value =~ s/$remove_suffix_expr$//;
+	    }
+	}
+	if (defined($first_metadata_group_element_value) && $first_metadata_group_element_value ne "") {
+	    # This section must be included in the classifier
+	    $classify_section = 1;
+	    last;
+	} 
+    }
+
+    # We're not classifying this section because it doesn't have the required metadata
+    return if (!$classify_section);
+   
+    # Otherwise, include this section in the classifier
+    
+    push(@{$self->{'OIDs'}}, $section_OID);
+
+    # Create a hash for the metadata values of each metadata element we're interested in
+    my %metadata_groups_done = ();
+    foreach my $metadata_group (@metadata_groups, @{$self->{'sort_leaf_nodes_using_metadata_groups'}}) {
+	# Take care not to do a metadata group more than once
+	unless ($metadata_groups_done{$metadata_group}) {
+	    my $remove_prefix_expr = $self->{$metadata_group . ".remove_prefix_expr"};
+	    my $remove_suffix_expr = $self->{$metadata_group . ".remove_suffix_expr"};
+	    foreach my $metadata_element (split(/\;|,/, $metadata_group)) {		
+		my $real_metadata_element = $self->strip_ex_from_metadata($metadata_element);
+		
+		my @metadata_values = @{$doc_obj->get_metadata($section, $real_metadata_element)};
+		foreach my $metadata_value (@metadata_values) {
+		    # Strip leading and trailing whitespace
+		    $metadata_value =~ s/^\s*//;
+		    $metadata_value =~ s/\s*$//;
+
+		    # Remove prefix/suffix if requested
+		    if (defined $remove_prefix_expr && $remove_prefix_expr ne "") {
+			$metadata_value =~ s/^$remove_prefix_expr//;
+		    }
+		    if (defined $remove_suffix_expr && $remove_suffix_expr ne "") {
+			$metadata_value =~ s/$remove_suffix_expr$//;
+		    }
+
+		    # Don't uppercase metadata here, user can change the display with CSS or javascript
+		    # further on. Moreover, CSS is unable to turn letters that are capitals by default 
+		    # into lowercase, whereas letters that are lowercase by default can be titlecased or 
+		    # capitalised later with CSS if necessary.
+		    # uppercase the metadata - makes the AZList nicer
+		    #$metadata_value = uc($metadata_value);
+		    
+		    # We are already working with unicode aware strings at this 
+		    # stage, so we no longer need to convert from utf8 to unicode 
+		    my $metadata_value_unicode_string = $metadata_value; # $self->convert_utf8_string_to_unicode_string($metadata_value);
+
+		    # Add the metadata value into the list for this combination of metadata group and section
+		    push(@{$self->{$metadata_group . ".list"}->{$section_OID}}, $metadata_value_unicode_string);
+		}
+		last if (@metadata_values > 0);
+	    }
+
+	    $metadata_groups_done{$metadata_group} = 1;
+	}
+    }
+}
+
+
+sub get_classify_info
+{
+    my $self = shift(@_);
+
+    # The metadata groups to classify by
+    my @metadata_groups = @{$self->{'metadata_groups'}};
+    my $first_metadata_group = $metadata_groups[0];
+
+    # The OID values of the documents to include in the classifier
+    my @OIDs = @{$self->{'OIDs'}};
+
+    # Create the root node of the classification hierarchy
+    my %classifier_node = ( 'thistype' => "Invisible",
+			    'childtype' => $self->{$first_metadata_group . ".list_type"},
+			    'Title' => $self->{'buttonname'},
+			    'contains' => [],
+			    'mdtype' => $first_metadata_group );
+
+    # Recursively create the classification hierarchy, one level for each metadata group
+    $self->add_level(\@metadata_groups, \@OIDs, \%classifier_node);
+    return \%classifier_node;
+}
+
+
+sub add_level
+{
+    my $self = shift(@_);
+    my @metadata_groups = @{shift(@_)};
+    my @OIDs = @{shift(@_)};
+    my $classifier_node = shift(@_);
+    
+    my $metadata_group = $metadata_groups[0];
+    
+    if (!defined($self->{$metadata_group . ".list"})) {
+	print STDERR "Warning: No metadata values assigned to $metadata_group.\n";
+	return;
+    }
+
+    # Create a mapping from metadata value to OID
+    my $OID_to_metadata_values_hash_ref = $self->{$metadata_group . ".list"};
+    my %metadata_value_to_OIDs_hash = ();    
+    foreach my $OID (@OIDs)
+    {
+	if ($OID_to_metadata_values_hash_ref->{$OID})
+	{
+	    my @metadata_values = @{$OID_to_metadata_values_hash_ref->{$OID}};
+	    foreach my $metadata_value (@metadata_values)
+	    {
+		push(@{$metadata_value_to_OIDs_hash{$metadata_value}}, $OID);
+	    }
+	}
+    }
+    #print STDERR "Number of distinct values: " . scalar(keys %metadata_value_to_OIDs_hash) . "\n";
+
+    # Partition the values (if necessary)
+    my $partition_type_within_level = $self->{$metadata_group . ".partition_type_within_level"};
+    my $partition_size_within_level = $self->{$metadata_group . ".partition_size_within_level"};
+    if ($partition_type_within_level =~ /^per_letter$/i) {
+	# Generate one hlist for each letter
+	my @sortedmetadata_values = $self->sort_metadata_values_array(keys(%metadata_value_to_OIDs_hash));
+	my %metadata_value_to_OIDs_subhash = ();
+
+	my $lastpartition = substr($sortedmetadata_values[0], 0, 1);
+	foreach my $metadata_value (@sortedmetadata_values) {
+	    my $metadata_valuepartition = substr($metadata_value, 0, 1);
+
+	    # Is this the start of a new partition?
+	    if ($metadata_valuepartition ne $lastpartition) {
+		$self->add_hlist_partition(\@metadata_groups, $classifier_node, $lastpartition, \%metadata_value_to_OIDs_subhash);
+		%metadata_value_to_OIDs_subhash = ();
+		$lastpartition = $metadata_valuepartition;
+	    }
+
+	    $metadata_value_to_OIDs_subhash{$metadata_value} = $metadata_value_to_OIDs_hash{$metadata_value};	    
+	}
+
+	# Don't forget to add the last partition
+	$self->add_hlist_partition(\@metadata_groups, $classifier_node, $lastpartition, \%metadata_value_to_OIDs_subhash);
+
+	# The partitions are stored in an HList
+	$classifier_node->{'childtype'} = "HList";
+    }
+    elsif ($partition_type_within_level =~ /^approximate_size$/i && scalar(keys %metadata_value_to_OIDs_hash) > $partition_size_within_level) {
+	# Generate hlist based on the first letter of the metadata value (like per_letter) but with restriction on the partition size
+	# If a letter has fewer items than specified by the "partition_size_within_level", then group them together if possible
+	# If a letter has more items than specified, split into several hlists.
+	# Depends on the bookshelf_type, one item can be either a document (when bookshelf_type is "never") or a metadata value (otherwise)
+	my $partition_size_within_level = $self->{$metadata_group . ".partition_size_within_level"};		
+	my @sortedmetadata_values = $self->sort_metadata_values_array(keys(%metadata_value_to_OIDs_hash));
+	my $bookshelf_type = $self->{$metadata_group . ".bookshelf_type"};
+	
+	# Separate values by their first letter, each form a bucket, like the per_letter partition type
+	my $last_partition = substr($sortedmetadata_values[0], 0, 1);
+	my %partition_buckets = ();
+	my @metadata_values_in_bucket = ();
+	my $num_items_in_bucket = 0;
+	foreach my $metadata_value (@sortedmetadata_values) {
+	    my $metadata_valuepartition = substr($metadata_value, 0, 1);
+	    if ($metadata_valuepartition ne $last_partition) {
+		my @temp_array = @metadata_values_in_bucket;
+		# Cache the values that belong to this bucket, and the number of items in this bucket, not necessary to be the same number as the metadata values 
+		my %partition_info = ();		
+		$partition_info{'metadata_values'} = \@temp_array;
+		$partition_info{'size'} = $num_items_in_bucket;		
+		$partition_buckets{$last_partition} = \%partition_info;		
+		
+		@metadata_values_in_bucket = ($metadata_value);
+		$num_items_in_bucket = $bookshelf_type eq "never" ? scalar(@{$metadata_value_to_OIDs_hash{$metadata_value}}) : scalar(@metadata_values_in_bucket);
+		$last_partition = $metadata_valuepartition;
+	    } else {
+		$num_items_in_bucket += $bookshelf_type eq "never" ? scalar(@{$metadata_value_to_OIDs_hash{$metadata_value}}) : scalar(@metadata_values_in_bucket);
+		push (@metadata_values_in_bucket, $metadata_value);
+	    }
+	}
+	# Last one
+	my %partition_info = ();
+	$partition_info{'metadata_values'} = \@metadata_values_in_bucket;
+	$partition_info{'size'} = $num_items_in_bucket;	
+	$partition_buckets{$last_partition} = \%partition_info;
+		
+	my @partition_keys = $self->sort_metadata_values_array(keys(%partition_buckets));	
+	for (my $i = 0; $i < scalar(@partition_keys) - 1; $i++) {
+	    my $partition = $partition_keys[$i];
+	    my $items_in_partition = $partition_buckets{$partition}->{'size'};	    	    
+	    # Merge small buckets together, but keep the numeric bucket apart
+	    if ($items_in_partition < $partition_size_within_level) {
+		my $items_in_next_partition = $partition_buckets{$partition_keys[$i+1]}->{'size'};
+		if ($items_in_partition + $items_in_next_partition <= $partition_size_within_level 
+		    && !(($partition =~ /^[^0-9]/ && $partition_keys[$i+1] =~ /^[0-9]/) 
+			 || ($partition =~ /^[0-9]/ && $partition_keys[$i+1] =~ /^[^0-9]/))) {
+		    foreach my $metadata_value_to_merge (@{$partition_buckets{$partition}->{'metadata_values'}}) {
+			push(@{$partition_buckets{$partition_keys[$i+1]}->{'metadata_values'}}, $metadata_value_to_merge);
+		    }		    
+		    $partition_buckets{$partition_keys[$i+1]}->{'size'} += $items_in_partition;
+		    delete $partition_buckets{$partition};		    		    
+		} 
+	    }
+	}
+	@partition_keys = $self->sort_metadata_values_array(keys(%partition_buckets));
+	
+	# Add partitions, and divide big bucket into several
+	my $last_partition_end = "";
+	my $partition_start = "";
+	foreach my $partition (@partition_keys) {
+	    my @metadata_values = $self->sort_metadata_values_array(@{$partition_buckets{$partition}->{'metadata_values'}});
+	    my $items_in_partition = $partition_buckets{$partition}->{'size'}; 
+	    $partition_start = $self->generate_partition_start($metadata_values[0], $last_partition_end, $self->{"partition_name_length"});
+	    
+	    if ($items_in_partition > $partition_size_within_level) {	
+		my $items_done = 0;
+		my %metadata_values_to_OIDs_subhashes = ();
+		for (my $i = 0; $i < scalar(@metadata_values); $i++) {
+		    my $metadata_value = $metadata_values[$i];
+		    # If the bookshelf_type is "never", count the documents, otherwise count the distinct metadata values
+		    my $items_for_this_md_value = $bookshelf_type eq "never" ? scalar(@{$metadata_value_to_OIDs_hash{$metadata_value}}) : 1;
+
+		    my $partitionend = $self->generate_partition_end($metadata_value, $partition_start, $self->{"partition_name_length"});
+		    my $partitionname = $partition_start;
+		    if ($partitionend ne $partition_start) {
+			$partitionname = $partitionname . "-" . $partitionend;
+		    }
+		    
+		    # Start a new partition
+		    if ($items_done + $items_for_this_md_value > $partition_size_within_level && $items_done != 0) {
+			$self->add_hlist_partition(\@metadata_groups, $classifier_node, $partitionname, \%metadata_values_to_OIDs_subhashes);
+			$last_partition_end = $partitionend;			
+			$partition_start = $self->generate_partition_start($metadata_value, $last_partition_end, $self->{"partition_name_length"});
+			$items_done = 0;
+			%metadata_values_to_OIDs_subhashes = ();
+ 		    } 
+		    
+		    # If bookshelf_type is "never" and the current metadata value holds too many items, need to split into several partitions
+                    if ($bookshelf_type eq "never" && $items_for_this_md_value > $partition_size_within_level) {
+			my $partitionname_for_this_value = $self->generate_partition_start($metadata_value, $last_partition_end, $self->{"partition_name_length"});
+			# Get the number of partitions needed for this value
+			my $num_splits = int($items_for_this_md_value / $partition_size_within_level);
+			$num_splits++ if ($items_for_this_md_value / $partition_size_within_level > $num_splits);
+
+			my @OIDs_for_this_value = @{$metadata_value_to_OIDs_hash{$metadata_value}};
+			for (my $i = 0; $i < $num_splits; $i++) {
+			    my %OIDs_subhashes_for_this_value = ();
+			    my @OIDs_for_this_partition = ();
+			    for (my $d = $i * $partition_size_within_level; $d < (($i+1) * $partition_size_within_level > $items_for_this_md_value ? $items_for_this_md_value : ($i+1) * $partition_size_within_level); $d++) {
+				push (@OIDs_for_this_partition, $OIDs_for_this_value[$d]);
+			    } 
+			    
+			    # The last bucket might have only a few items and need to be merged with buckets for subsequent metadata values 
+			    if ($i == $num_splits - 1 && scalar(@OIDs_for_this_partition) < $partition_size_within_level) {
+				$metadata_values_to_OIDs_subhashes{$metadata_value} = \@OIDs_for_this_partition;
+				$items_done += scalar(@OIDs_for_this_partition);
+				next;
+			    }
+			    
+			    # Add an HList for this bucket
+			    $OIDs_subhashes_for_this_value{$metadata_value} = \@OIDs_for_this_partition;
+			    $self->add_hlist_partition(\@metadata_groups, $classifier_node, $partitionname_for_this_value, \%OIDs_subhashes_for_this_value);
+			    $last_partition_end = $partitionname_for_this_value;
+			}
+			next;
+                    }
+		    		    
+		    $metadata_values_to_OIDs_subhashes{$metadata_value} = $metadata_value_to_OIDs_hash{$metadata_value};
+		    $items_done += $bookshelf_type eq "never" ? scalar(@{$metadata_values_to_OIDs_subhashes{$metadata_value}}) : 1;		    
+		    
+		    # The last partition
+		    if($i == scalar(@metadata_values) - 1) {
+			$self->add_hlist_partition(\@metadata_groups, $classifier_node, $partitionname, \%metadata_values_to_OIDs_subhashes);
+		    }
+		}		
+	    } 
+	    else {
+		# The easier case, just add a partition
+		my %metadata_values_to_OIDs_subhashes = ();
+		for (my $i = 0; $i < scalar(@metadata_values); $i++) {
+		    my $metadata_value = $metadata_values[$i];
+		    $metadata_values_to_OIDs_subhashes{$metadata_value} = $metadata_value_to_OIDs_hash{$metadata_value};		    
+		}
+		my $last_metadata_value = $metadata_values[scalar(@metadata_values)-1];
+		my $partitionend = $self->generate_partition_end($last_metadata_value, $partition_start, $self->{"partition_name_length"});
+		my $partitionname = $partition_start;
+		if ($partitionend ne $partition_start) {
+		    $partitionname = $partitionname . "-" . $partitionend;
+		}
+		$self->add_hlist_partition(\@metadata_groups, $classifier_node, $partitionname, \%metadata_values_to_OIDs_subhashes);			
+		$last_partition_end = $partitionend;		
+	    }
+	}	
+	
+	# The partitions are stored in an HList
+	$classifier_node->{'childtype'} = "HList";
+
+    } # end approximate_size
+    else {
+	# Generate hlists of a certain size
+	if ($partition_type_within_level =~ /^constant_size$/i && scalar(keys %metadata_value_to_OIDs_hash) > $partition_size_within_level) {
+	    my @sortedmetadata_values = $self->sort_metadata_values_array(keys(%metadata_value_to_OIDs_hash));
+	    my $itemsdone = 0;
+	    my %metadata_value_to_OIDs_subhash = ();
+	    my $lastpartitionend = "";
+	    my $partitionstart;
+	    foreach my $metadata_value (@sortedmetadata_values) {
+		$metadata_value_to_OIDs_subhash{$metadata_value} = $metadata_value_to_OIDs_hash{$metadata_value};
+		$itemsdone++;
+		my $itemsinpartition = scalar(keys %metadata_value_to_OIDs_subhash);
+
+		# Is this the start of a new partition?
+		if ($itemsinpartition == 1) {
+		    $partitionstart = $self->generate_partition_start($metadata_value, $lastpartitionend, $self->{"partition_name_length"});
+		}
+
+		# Is this the end of the partition?
+		if ($itemsinpartition == $partition_size_within_level || $itemsdone == @sortedmetadata_values) {
+		    my $partitionend = $self->generate_partition_end($metadata_value, $partitionstart, $self->{"partition_name_length"});
+		    my $partitionname = $partitionstart;
+		    if ($partitionend ne $partitionstart) {
+			$partitionname = $partitionname . "-" . $partitionend;
+		    }
+
+		    $self->add_hlist_partition(\@metadata_groups, $classifier_node, $partitionname, \%metadata_value_to_OIDs_subhash);
+		    %metadata_value_to_OIDs_subhash = ();
+		    $lastpartitionend = $partitionend;
+		}
+	    }
+
+	    # The partitions are stored in an HList
+	    $classifier_node->{'childtype'} = "HList";
+	}
+
+	# Otherwise just add all the values to a VList
+	else {
+	    $self->add_vlist(\@metadata_groups, $classifier_node, \%metadata_value_to_OIDs_hash);
+	}
+    }
+}
+
+
+sub generate_partition_start
+{
+    my $self = shift(@_);
+    my $metadata_value = shift(@_);
+    my $lastpartitionend = shift(@_);
+    my $partition_name_length = shift(@_);
+
+    if ($partition_name_length) {
+	return substr($metadata_value, 0, $partition_name_length);
+    }
+
+    my $partitionstart = substr($metadata_value, 0, 1);
+    if ($partitionstart le $lastpartitionend) {
+	$partitionstart = substr($metadata_value, 0, 2);
+	# Give up after three characters
+	if ($partitionstart le $lastpartitionend) {
+	    $partitionstart = substr($metadata_value, 0, 3);
+	}
+    }
+
+    return $partitionstart;
+}
+
+
+sub generate_partition_end
+{
+    my $self = shift(@_);
+    my $metadata_value = shift(@_);
+    my $partitionstart = shift(@_);
+    my $partition_name_length = shift(@_);
+
+    if ($partition_name_length) {
+	return substr($metadata_value, 0, $partition_name_length);
+    }
+
+    my $partitionend = substr($metadata_value, 0, length($partitionstart));
+    if ($partitionend gt $partitionstart) {
+	$partitionend = substr($metadata_value, 0, 1);
+	if ($partitionend le $partitionstart) {
+	    $partitionend = substr($metadata_value, 0, 2);
+	    # Give up after three characters
+	    if ($partitionend le $partitionstart) {
+		$partitionend = substr($metadata_value, 0, 3);
+	    }
+	}
+    }
+
+    return $partitionend;
+}
+
+
+sub add_hlist_partition
+{
+    my $self = shift(@_);
+    my @metadata_groups = @{shift(@_)};
+    my $classifier_node = shift(@_);
+    my $partitionname = shift(@_);
+    my $metadata_value_to_OIDs_hash_ref = shift(@_);
+
+    # Create an hlist partition
+    # Note that we don't need to convert from unicode-aware strings 
+    # to utf8 here, as that is handled elsewhere in the code
+    my %child_classifier_node = ( 'Title' => $partitionname, #'Title' => $self->convert_unicode_string_to_utf8_string($partitionname),
+				  'childtype' => "VList",
+				  'contains' => [] );
+
+    # Add the children to the hlist partition
+    $self->add_vlist(\@metadata_groups, \%child_classifier_node, $metadata_value_to_OIDs_hash_ref);
+    push(@{$classifier_node->{'contains'}}, \%child_classifier_node);
+}
+
+
+sub add_vlist
+{
+    my $self = shift(@_);
+    my @metadata_groups = @{shift(@_)};
+    my $classifier_node = shift(@_);
+    my $metadata_value_to_OIDs_hash_ref = shift(@_);
+
+    my $metadata_group = shift(@metadata_groups);
+    $classifier_node->{'mdtype'} = $metadata_group;
+
+    # Create an entry in the vlist for each value
+    foreach my $metadata_value ($self->sort_metadata_values_array(keys(%{$metadata_value_to_OIDs_hash_ref})))
+    {
+	my @OIDs = @{$metadata_value_to_OIDs_hash_ref->{$metadata_value}};
+	# If there is only one item and 'bookshelf_type' is not always (ie. never or duplicate_only), add the item to the list
+	if (@OIDs == 1 && $self->{$metadata_group . ".bookshelf_type"} ne "always") {
+	    my $OID = $OIDs[0];
+	    my $offset = $self->metadata_offset($metadata_group, $OID, $metadata_value);
+	    push(@{$classifier_node->{'contains'}}, { 'OID' => $OID, 'offset' => $offset });
+	}
+	# If 'bookshelf_type' is 'never', list all the items even if there are duplicated values
+	elsif ($self->{$metadata_group . ".bookshelf_type"} eq "never") {
+	    @OIDs = $self->sort_leaf_items(\@OIDs);
+	    foreach my $OID (@OIDs) {
+		my $offset = $self->metadata_offset($metadata_group, $OID, $metadata_value);
+		push(@{$classifier_node->{'contains'}}, { 'OID' => $OID , 'offset' => $offset });
+	    }
+    
+	}
+	# Otherwise create a sublist (bookshelf) for the metadata value
+	else {
+	    # Note that we don't need to convert from unicode-aware strings 
+	    # to utf8 here, as that is handled elsewhere in the code
+	    my %child_classifier_node = ( 'Title' => $metadata_value, # 'Title' => $self->convert_unicode_string_to_utf8_string($metadata_value),
+					  'childtype' => "VList",
+					  'mdtype' => $metadata_group,
+					  'contains' => [] );
+
+	    #@OIDs = $self->sort_leaf_items(\@OIDs);
+	    # If there are metadata elements remaining, recursively apply the process
+	    if (@metadata_groups > 0) {
+		my $next_metadata_group = $metadata_groups[0];		
+		$child_classifier_node{'childtype'} = $self->{$next_metadata_group . ".list_type"};
+
+		# separate metadata into those that below in the next/sub-metadata_group
+		# and those that below at the current level's metadata_group
+
+		my $OID_to_metadata_values_hash_ref = $self->{$next_metadata_group . ".list"};
+		my @current_level_OIDs = ();
+		my @next_level_OIDs = ();
+		foreach my $OID (@OIDs)
+		{
+		    if ($OID_to_metadata_values_hash_ref->{$OID}) {
+			push(@next_level_OIDs, $OID);
+		    } else {
+			push(@current_level_OIDs, $OID);
+		    }
+		}
+		# recursively process those docs belonging to the sub-metadata_group
+		$self->add_level(\@metadata_groups, \@next_level_OIDs, \%child_classifier_node);
+
+		# For those docs that don't belong in the sub/next_metadata_group, but which belong
+		# at this level, just add the documents as children of this list at the current level
+		@current_level_OIDs = $self->sort_leaf_items(\@current_level_OIDs);
+		foreach my $current_level_OID (@current_level_OIDs) {
+		    my $offset = $self->metadata_offset($metadata_group, $current_level_OID, $metadata_value);
+		    push(@{$child_classifier_node{'contains'}}, { 'OID' => $current_level_OID , 'offset' => $offset });
+		}		
+	    }
+	    # Otherwise just add the documents as children of this list
+	    else {
+		@OIDs = $self->sort_leaf_items(\@OIDs);
+		foreach my $OID (@OIDs) {
+		    my $offset = $self->metadata_offset($metadata_group, $OID, $metadata_value);
+		    push(@{$child_classifier_node{'contains'}}, { 'OID' => $OID , 'offset' => $offset });
+		}
+
+	    }
+
+	    # Add the sublist to the list
+	    push(@{$classifier_node->{'contains'}}, \%child_classifier_node);
+	}
+    }
+}
+
+sub metadata_offset
+{
+    my $self = shift(@_);
+    my $metadata_group = shift(@_);
+    my $OID = shift(@_);
+    my $metadata_value = shift(@_);
+    
+    my $OID_to_metadata_values_hash_ref = $self->{$metadata_group . ".list"};
+    my @metadata_values = @{$OID_to_metadata_values_hash_ref->{$OID}};
+    for (my $i = 0; $i < scalar(@metadata_values); $i++) {
+	if ($metadata_value eq $metadata_values[$i]) {
+	    return $i;
+	}
+    }
+    
+    return 0;
+}
+
+sub sort_leaf_items
+{
+    my $self = shift(@_);
+    my @OIDs = @{shift(@_)};
+#    my $classifier_node = shift(@_);
+    
+    # Sort leaf nodes and add to list
+    my @sort_leaf_nodes_using_metadata_groups = @{$self->{'sort_leaf_nodes_using_metadata_groups'}};
+    foreach my $sort_leaf_nodes_usingmetaelem (reverse @sort_leaf_nodes_using_metadata_groups) {
+	my $OID_to_metadata_values_hash_ref = $self->{$sort_leaf_nodes_usingmetaelem . ".list"};
+	# Force a stable sort (Perl 5.6's sort isn't stable)
+	# !! The [0] bits aren't ideal (multiple metadata values) !! 
+	@OIDs = @OIDs[ sort {
+	  if (defined($OID_to_metadata_values_hash_ref->{$OIDs[$a]} && defined($OID_to_metadata_values_hash_ref->{$OIDs[$b]})))
+	  {
+	    $OID_to_metadata_values_hash_ref->{$OIDs[$a]}[0] cmp $OID_to_metadata_values_hash_ref->{$OIDs[$b]}[0];
+	  }
+	  else
+	  {
+	    $a <=> $b;
+	  }
+	} 0..$#OIDs ];
+    }
+    if ($self->{'reverse_sort_leaf_nodes'}) {
+	#print STDERR "reversing\n";
+	return reverse @OIDs;
+    }
+    return @OIDs;
+}
+
+
+
+sub sort_metadata_values_array
+{
+    my $self = shift(@_);
+    my @metadata_values = @_;
+
+    if ($self->{'unicode_collator'}) {
+	return $self->{'unicode_collator'}->sort(@metadata_values);
+    }
+    else {
+	return sort(@metadata_values);
+    }
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/Phind.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/Phind.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/Phind.pm	(revision 24799)
@@ -0,0 +1,1517 @@
+###########################################################################
+#
+# Phind.pm -- the Phind classifier
+#
+# Copyright (C) 2000 Gordon W. Paynter
+# Copyright (C) 2000 New Zealand Digital Library Project
+#
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# The Phind clasifier plugin. 
+# Type "classinfo.pl Phind" at the command line for a summary.
+
+package Phind;
+
+use BaseClassifier;
+use util;
+use ghtml;
+use unicode;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+my @removedirs = ();
+
+my %wanted_index_files = ('td'=>1,
+			  't'=>1,
+			  'ti'=>1,
+			  'tl'=>1,
+			  'tsd'=>1,
+			  'idb'=>1,
+			  'ib1'=>1,
+			  'ib2'=>1,
+			  'ib3'=>1,
+			  'i'=>1,
+			  'il'=>1,
+			  'w'=>1,
+			  'wa'=>1);
+
+sub BEGIN {
+    @Phind::ISA = ('BaseClassifier');
+}
+
+sub END {
+    
+    # Tidy up stray files - we do this here as there's some weird problem
+    # preventing us from doing it in the get_classify_info() function (on
+    # windows at least) where the close() appears to fail on txthandle and
+    # dochandle, thus preventing us from deleting those files
+
+    foreach my $dir (@removedirs) {
+	if (-d $dir && opendir (DIR, $dir)) {
+	    my @files = readdir DIR;
+	    closedir DIR;
+	
+	    foreach my $file (@files) {
+		next if $file =~ /^\.\.?$/;
+		my ($suffix) = $file =~ /\.([^\.]+)$/;
+		if (!defined $suffix || !defined $wanted_index_files{$suffix}) {
+		    # delete it!
+		    &util::rm (&util::filename_cat ($dir, $file));
+		}
+	    }
+	}
+    }
+}
+
+my $arguments =
+    [ { 'name' => "text",
+	'desc' => "{Phind.text}",
+	'type' => "string",
+	'deft' => "section:Title,section:text",
+	'reqd' => "no" },
+      { 'name' => "title",
+	'desc' => "{Phind.title}",
+	'type' => "metadata",
+	'deft' => "Title",
+	'reqd' => "no" },
+      { 'name' => "buttonname",
+	'desc' => "{BasClas.buttonname}",
+	'type' => "string",
+	'deft' => "Phrase",
+	'reqd' => "no" },
+      { 'name' => "language",
+	'desc' => "{Phind.language}",
+	'type' => "string",
+	'deft' => "en",
+	'reqd' => "no" },
+      { 'name' => "savephrases",
+	'desc' => "{Phind.savephrases}",
+	'type' => "string",
+	'deft' => "",
+	'reqd' => "no" },
+      { 'name' => "suffixmode",
+	'desc' => "{Phind.suffixmode}",
+	'type' => "int",
+	'deft' => "1",
+	'range' => "0,1",
+	'reqd' => "no" },
+      { 'name' => "min_occurs",
+	'desc' => "{Phind.min_occurs}",
+	'type' => "int",
+	'deft' => "2",
+	'range' => "1,",
+	'reqd' => "no" },
+      { 'name' => "thesaurus",
+	'desc' => "{Phind.thesaurus}",
+	'type' => "string",
+	'deft' => "",
+	'reqd' => "no" },
+      { 'name' => "untidy",
+	'desc' => "{Phind.untidy}",
+	'type' => "flag",
+	'reqd' => "no" } ];
+
+my $options = { 'name'     => "Phind",
+		'desc'     => "{Phind.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+
+# Phrase delimiter symbols - these should be abstracted out someplace
+
+my $colstart = "COLLECTIONSTART";
+my $colend   = "COLLECTIONEND";
+my $doclimit = "DOCUMENTLIMIT";
+my $senlimit = "SENTENCELIMIT";
+my @delimiters = ($colstart, $colend, $doclimit, $senlimit);
+
+
+# Create a new Phind browser based on collect.cfg
+
+sub new {
+    my ($class) = shift (@_);
+    my ($classifierslist,$inputargs,$hashArgOptLists) = @_;
+    push(@$classifierslist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new BaseClassifier($classifierslist, $inputargs, $hashArgOptLists);
+
+    if ($self->{'info_only'}) {
+	# don't worry about any options etc
+	return bless $self, $class;
+    }
+
+    # Ensure the Phind generate scripts are in place
+    my $file1 = &util::filename_cat($ENV{'GSDLHOME'}, "bin", $ENV{'GSDLOS'}, "suffix");
+    $file1 .= ".exe" if $ENV{'GSDLOS'} =~ /^windows$/;
+    my $src = &util::filename_cat($ENV{'GSDLHOME'}, "src", "phind", "generate");
+    if (!(-e $file1)) {
+	print STDERR "Phind.pm: ERROR: The Phind \"suffix\" program is not installed.\n\n";
+	exit(1);
+    }
+    
+    # things that may have ex. in them that need to be stripped off
+    $self->{'text'} = $self->strip_ex_from_metadata($self->{'text'});
+    $self->{'title'} = $self->strip_ex_from_metadata($self->{'title'});
+
+    # Transfer value from Auto Parsing to the variable name that used in previous GreenStone.
+    
+    $self->{"indexes"} = $self->{"text"};
+
+    # Further setup
+    $self->{'collection'} = $ENV{'GSDLCOLLECTION'}; # classifier information
+    $self->{'collectiondir'} = $ENV{'GSDLCOLLECTDIR'}; # collection directories
+    if (! defined $self->{'builddir'}) {
+	$self->{'builddir'} = &util::filename_cat($ENV{'GSDLCOLLECTDIR'}, "building");
+    } 
+    $self->{'total'} = 0;
+    
+    # we set phind to be rtl if language is arabic
+    if ($self->{'language'} eq "ar") {
+	$self->{'textorientation'} = "rtl";
+    }
+    # Clean out the unused keys
+    delete $self->{"text"};
+
+    return bless $self, $class;
+}
+
+
+# Initialise the Phind classifier
+
+sub init {
+    my $self = shift (@_);
+
+    # ensure we have a build directory
+    my $builddir = $self->{'builddir'};
+    die unless (-e "$builddir");
+
+    # create Phind directory
+    my $phnumber = 1;
+    my $phinddir = &util::filename_cat($builddir, "phind1");
+    while (-e "$phinddir") {
+	$phnumber++;
+	$phinddir = &util::filename_cat($builddir, "phind$phnumber");
+    }
+    &util::mk_dir("$phinddir");
+    $self->{'phinddir'} = $phinddir;
+    $self->{'phindnumber'} = $phnumber;
+
+    push(@removedirs, $phinddir) unless $self->{'untidy'};
+
+    # open filehandles for documents and text
+    my $clausefile =  &util::filename_cat("$phinddir", "clauses");
+    &util::rm($clausefile) if (-e $clausefile);
+
+    my $txthandle = 'TEXT' . $phnumber;
+    open($txthandle, ">$clausefile") || die "Cannot open $clausefile: $!";
+    $self->{'txthandle'} = $txthandle;
+
+    my $docfile = &util::filename_cat("$phinddir", "docs.txt");
+    &util::rm($docfile) if (-e $docfile);
+
+    my $dochandle = 'DOC' . $phnumber;
+    open($dochandle, ">$docfile") || die "Cannot open $docfile: $!";
+    $self->{'dochandle'} = $dochandle;
+    
+}
+
+
+# Classify each document.
+#
+# Each document is passed here in turn.  The classifier extracts the 
+# text of each and stores it in the clauses file.  Document details are
+# stored in the docs.txt file. 
+
+sub classify {
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+
+    my $verbosity = $self->{'verbosity'};
+    my $top_section = $doc_obj->get_top_section();
+
+    my $titlefield = $self->{'title'};
+    
+    my $title = $doc_obj->get_metadata_element ($top_section, $titlefield);
+    if (!defined($title)) {
+	$title = "";
+	print STDERR "Phind: document has no title\n";
+    }
+    print "process: $title\n" if ($verbosity > 2);
+
+    # Only consider the file if it is in the correct language
+    my $doclanguage = $doc_obj->get_metadata_element ($top_section, "Language");
+    my $phrlanguage = $self->{'language'};
+    return if ($doclanguage && ($doclanguage !~ /$phrlanguage/i));
+
+    # record this file
+    $self->{'total'} ++;
+    # what is $file ???
+    # print "file $self->{'total'}: $file\n" if ($self->{'$verbosity'});
+
+    # Store document details
+    my $OID = $doc_obj->get_OID();
+    $OID = "NULL" unless defined $OID;
+    my $dochandle = $self->{'dochandle'};
+    print $dochandle "<Document>\t$OID\t$title\n";
+    
+    # Store the text occuring in this object
+
+    # output the document delimiter
+    my $txthandle = $self->{'txthandle'};
+    print $txthandle "$doclimit\n";
+
+    # iterate over the required indexes and store their text
+    my $indexes = $self->{'indexes'};
+    my $text = "";
+    my ($part, $level, $field, $section, $data, $dataref);
+
+    foreach $part (split(/,/, $indexes)) {
+
+	# Each field has a level and a data element ((e.g. document:Title)
+	($level, $field) = split(/:/, $part);
+	die unless ($level && $field);
+	
+	# Extract the text from every section
+	# (In phind, document:text and section:text are equivalent)
+	if ($field eq "text") {
+	    $data = "";
+	    $section = $doc_obj->get_top_section();
+	    while (defined($section)) {
+		$data .= $doc_obj->get_text($section) . "\n";
+		$section = $doc_obj->get_next_section($section);
+	    }
+	    $text .= convert_gml_to_tokens($phrlanguage, $data) . "\n";
+	}
+	
+	# Extract a metadata field from a document
+	# (If there is more than one element of the given type, get them all.)
+	elsif ($level eq "document") {
+	    $dataref = $doc_obj->get_metadata($doc_obj->get_top_section(), $field);
+	    foreach $data (@$dataref) {
+		$text .= convert_gml_to_tokens($phrlanguage, $data) . "\n";
+	    } 
+	}
+
+	# Extract metadata from every section in a document
+	elsif ($level eq "section") {
+	    $data = "";
+	    $section = $doc_obj->get_top_section();
+	    while (defined($section)) {
+		$dataref = $doc_obj->get_metadata($section, $field);
+		$data .= join("\n", @$dataref) . "\n";
+		$section = $doc_obj->get_next_section($section);
+	    }
+	    $text .= convert_gml_to_tokens($phrlanguage, $data) . "\n";
+	} 
+	
+	# Some sort of specification which I don't understand
+	else {
+	    die "Unknown level ($level) in Phind index ($part)\n";
+	}
+	
+    }
+
+    # output the text
+    $text =~ tr/\n//s;
+    print $txthandle "$text";
+}
+
+
+# Construct the classifier from the information already gathered
+#
+# When get_classify_info is called, the clauses and docs.txt files have
+# already been constructed in the Phind directory.  This function will
+# translate them into compressed, indexed MGPP files that can be read by
+# the phindcgi script.  It will also register our classifier so that it
+# shows up in the navigation bar.
+
+sub get_classify_info {
+    my $self = shift (@_);
+    my ($gli) = @_;    
+
+    close $self->{'dochandle'};
+    close $self->{'txthandle'};
+    my $verbosity = $self->{'verbosity'};
+    my $out = $self->{'outhandle'};
+    my $phinddir = $self->{'phinddir'};
+
+    my $osextra = "";
+    if ($ENV{'GSDLOS'} !~ /^windows$/i) {
+	$osextra = " -d /";
+    }
+
+    print STDERR "</Stage>\n" if $gli;
+
+    if ($verbosity) {
+	print $out "\n*** Phind.pm generating indexes for ", $self->{'indexes'}, "\n";
+	print $out "***          in ", $self->{'phinddir'}, "\n";
+    }
+
+    print STDERR "<Stage name='Phind'>\n" if $gli;
+
+    # Construct phind indexes
+    my $suffixmode = $self->{'suffixmode'};
+    my $min_occurs = $self->{'min_occurs'};
+    my ($command, $status);
+    
+    # Generate the vocabulary, symbol statistics, and numbers file
+    # from the clauses file
+    print $out "\nExtracting vocabulary and statistics\n" if $verbosity;
+    print STDERR "<Phase name='ExtractingVocab'/>\n" if $gli;
+    &extract_vocabulary($self);
+ 
+    # Use the suffix program to generate the phind/phrases file
+    print $out "\nExtracting phrases from processed text (with suffix)\n" if $verbosity;
+    print STDERR "<Phase name='ExtractingPhrase'/>\n" if $gli;
+    &execute("suffix \"$phinddir\" $suffixmode $min_occurs $verbosity", $verbosity, $out);
+
+    # check that we generated some files. It's not necessarily an error if
+    # we didn't (execute() would have quit on error), but we can't go on.
+    my $phrasesfile=&util::filename_cat($self->{'phinddir'}, 'phrases');
+    if (! -r $phrasesfile) {
+	print STDERR "<Warning name='NoPhrasesFound'/>\n" if $gli;
+	print $out "\nNo phrases found for Phind classifier!\n";
+	return;
+    }   
+
+    # Create the phrase file and put phrase numbers in phind/phrases
+    print $out "\nSorting and renumbering phrases for input to mgpp\n" if $verbosity;
+    print STDERR "<Phase name='SortAndRenumber'/>\n" if $gli;
+    &renumber_phrases($self);
+
+    print $out "\nCreating phrase databases\n";
+    print STDERR "<Phase name='PhraseDatabases'/>\n" if $gli;
+    my $mg_input = &util::filename_cat($phinddir, "pdata.txt");
+    my $mg_stem = &util::filename_cat($phinddir, "pdata");
+
+    &execute("mgpp_passes $osextra -f \"$mg_stem\" -T1 \"$mg_input\"", $verbosity, $out);
+    &execute("mgpp_compression_dict $osextra -f \"$mg_stem\"", $verbosity, $out);
+    &execute("mgpp_passes $osextra -f \"$mg_stem\" -T2 \"$mg_input\"", $verbosity, $out);
+
+    # create the mg index of words
+    print $out "\nCreating word-level search indexes\n";
+    print STDERR "<Phase name='WordLevelIndexes'/>\n" if $gli;
+    $mg_input = &util::filename_cat($phinddir, "pword.txt");
+    $mg_stem = &util::filename_cat($phinddir, "pword");
+
+    &execute("mgpp_passes $osextra -f \"$mg_stem\" -T1 -I1 \"$mg_input\"", $verbosity, $out);
+    &execute("mgpp_compression_dict $osextra -f \"$mg_stem\"", $verbosity, $out);
+    &execute("mgpp_perf_hash_build $osextra -f \"$mg_stem\"", $verbosity, $out);
+    &execute("mgpp_passes $osextra -f \"$mg_stem\" -T2 -I2 \"$mg_input\"", $verbosity, $out);
+    &execute("mgpp_weights_build $osextra -f \"$mg_stem\"", $verbosity, $out);
+    &execute("mgpp_invf_dict $osextra -f \"$mg_stem\"", $verbosity, $out);
+
+    &execute("mgpp_stem_idx $osextra -f \"$mg_stem\" -s 1", $verbosity, $out);
+    &execute("mgpp_stem_idx $osextra -f \"$mg_stem\" -s 2", $verbosity, $out);
+    &execute("mgpp_stem_idx $osextra -f \"$mg_stem\" -s 3", $verbosity, $out);
+
+    # create the mg document information database
+    print $out "\nCreating document information databases\n";
+    print STDERR "<Phase name='DocInfoDatabases'/>\n" if $gli;
+    $mg_input = &util::filename_cat($phinddir, "docs.txt");
+    $mg_stem = &util::filename_cat($phinddir, "docs");
+
+    &execute("mgpp_passes $osextra -f \"$mg_stem\" -T1 \"$mg_input\"", $verbosity, $out);
+    &execute("mgpp_compression_dict $osextra -f \"$mg_stem\"", $verbosity, $out);
+    &execute("mgpp_passes $osextra -f \"$mg_stem\" -T2 \"$mg_input\"", $verbosity, $out);
+
+    my $parameters = "phindnumber=$self->{'phindnumber'}";
+    if (defined ($self->{'textorientation'})) {
+	$parameters .= ";textorientation=$self->{'textorientation'}";
+    }
+    # Return the information about the classifier that we'll later want to
+    # use to create macros when the Phind classifier document is displayed.
+    my %classifyinfo = ('thistype'=>'Invisible',
+                        'childtype'=>'Phind', 
+                        'Title'=>$self->{'buttonname'},
+                        'parameters'=>$parameters,
+			'contains'=>[]);
+    
+    my $collection = $self->{'collection'};
+    my $url = "library?a=p&p=phind&c=$collection";
+    push (@{$classifyinfo{'contains'}}, {'OID'=>$url});
+   
+    return \%classifyinfo;
+}
+
+
+
+sub convert_gml_to_tokens {
+    
+    my ($language_exp, $text) = @_;
+
+    # escape any magic words... - jrm21
+    foreach my $delim (@delimiters) {
+	my $replacement=lc($delim);
+	my $num= $text=~ s/$delim/$replacement/g;
+	if (!$num) {$num=0;}
+    }
+
+    if ($language_exp =~ /^en$/) {
+	return &convert_gml_to_tokens_EN($text);
+    }
+
+    if ($language_exp =~ /zh/) {
+	return &convert_gml_to_tokens_ZH($text);
+    }  
+    
+    $_ = $text;
+
+    # 1. remove GML tags
+
+    # Remove everything that is in a tag
+    s/\s*<p>\s*/ PARAGRAPHBREAK /isgo;
+    s/\s*<br>\s*/ LINEBREAK /isgo;
+    s/<[^>]*>/ /sgo;
+
+    # Now we have the text, but it may contain HTML 
+    # elements coded as &gt; etc.  Remove these tags. 
+    s/&amp;/&/sgo;
+    s/&lt;/</sgo;
+    s/&gt;/>/sgo;
+    s/\s*<p>\s*/ PARAGRAPHBREAK /isgo;
+    s/\s*<br>\s*/ LINEBREAK /isgo;
+    s/<[^>]*>/ /sgo;
+
+    # replace<p> and <br> placeholders with clause break symbol (\n)
+    s/\s+/ /gso;
+    s/PARAGRAPHBREAK/\n/sgo;
+    s/LINEBREAK/\n/sgo;
+
+    
+    # 2. Split the remaining text into space-delimited tokens
+
+    # Convert any HTML special characters (like &quot;) to their UTF8 equivalent
+    s/&([^;]+);/&unicode::ascii2utf8(\&ghtml::getcharequiv($1,1))/gse;
+
+    # Split text at word boundaries
+    s/\b/ /go;
+    
+    # 3. Convert the remaining text to "clause format"
+
+    # Insert newline if the end of a sentence is detected
+    # (delimter is:  "[\.\?\!]\s")
+    # s/\s*[\.\?\!]\s+/\n/go; 
+
+    # remove unnecessary punctuation and replace with clause break symbol (\n)
+    # the following very nicely removes all non alphanumeric characters. too bad if you are not using english...
+    #s/[^\w ]/\n/go;
+    # replace punct with new lines - is this what we want??
+    s/\s*[\?\;\:\!\,\.\"\[\]\{\}\(\)]\s*/\n/go; #"
+    # then remove other punct with space
+    s/[\'\`\\\_]/ /go;
+
+    # remove extraneous whitespace
+    s/ +/ /sgo;
+    s/^\s+//mgo;
+    s/\s*$/\n/mgo;
+
+    # remove lines that contain one word or less
+    s/^\S*$//mgo;
+    s/^\s*$//mgo;
+    tr/\n//s;
+
+    return $_;
+}
+
+# a chinese version
+sub convert_gml_to_tokens_ZH {
+
+    $_ = shift @_;
+
+    # Replace all whitespace with a simple space
+    s/\s+/ /gs;
+    # Remove everything that is in a tag
+    s/\s*<p>\s*/ PARAGRAPHBREAK /isg;
+    s/\s*<br>\s*/ LINEBREAK /isg;
+    s/<[^>]*>/ /sg;
+
+    # Now we have the text, but it may contain HTML 
+    # elements coded as &gt; etc.  Remove these tags. 
+    s/&lt;/</sg;
+    s/&gt;/>/sg;
+
+    s/\s+/ /sg;
+    s/\s*<p>\s*/ PARAGRAPHBREAK /isg;
+    s/\s*<br>\s*/ LINEBREAK /isg;
+    s/<[^>]*>/ /sg;
+
+    # remove &amp; and other miscellaneous markup tags
+    s/&amp;/&/sg;
+    s/&lt;/</sg;
+    s/&gt;/>/sg;
+    s/&amp;/&/sg;
+
+    # replace<p> and <br> placeholders with carriage returns
+    s/PARAGRAPHBREAK/\n/sg;
+    s/LINEBREAK/\n/sg;
+
+    
+#    print STDERR "text:$_\n";
+    return $_;
+}
+
+# A version of convert_gml_to_tokens that is fine-tuned to the English language.
+
+sub convert_gml_to_tokens_EN {
+    $_ = shift @_;
+
+    # FIRST, remove GML tags
+
+    # Replace all whitespace with a simple space
+    s/\s+/ /gs;
+
+    # Remove everything that is in a tag
+    s/\s*<p>\s*/ PARAGRAPHBREAK /isg;
+    s/\s*<br>\s*/ LINEBREAK /isg;
+    s/<[^>]*>/ /sg;
+
+    # Now we have the text, but it may contain HTML 
+    # elements coded as &gt; etc.  Remove these tags. 
+    s/&lt;/</sg;
+    s/&gt;/>/sg;
+
+    s/\s+/ /sg;
+    s/\s*<p>\s*/ PARAGRAPHBREAK /isg;
+    s/\s*<br>\s*/ LINEBREAK /isg;
+    s/<[^>]*>/ /sg;
+
+    # remove &amp; and other miscellaneous markup tags
+    s/&amp;/&/sg;
+    s/&lt;/</sg;
+    s/&gt;/>/sg;
+    s/&amp;/&/sg;
+
+    # replace<p> and <br> placeholders with carriage returns
+    s/PARAGRAPHBREAK/\n/sg;
+    s/LINEBREAK/\n/sg;
+
+
+    # Exceptional punctuation
+    # 
+    # We make special cases of some punctuation
+
+    # remove any apostrophe that indicates omitted letters 
+    s/(\w+)\'(\w*\s)/ $1$2 /g;
+
+    # remove period that appears in a person's initals
+    s/\s([A-Z])\./ $1 /g;
+
+    # replace hyphens in hypheanted words and names with a space
+    s/([A-Za-z])-\s*([A-Za-z])/$1 $2/g;
+
+    # Convert the remaining text to "clause format",
+    # This means removing all excess punctuation and garbage text,
+    # normalising valid punctuation to fullstops and commas,
+    # then putting one cluse on each line.
+
+    # Insert newline when the end of a sentence is detected
+    # (delimter is:  "[\.\?\!]\s")
+    s/\s*[\.\?\!]\s+/\n/g; 
+
+    # split numbers after four digits
+    s/(\d\d\d\d)/$1 /g;
+
+    # split words after 32 characters
+
+    # squash repeated punctuation 
+    tr/A-Za-z0-9 //cs;
+
+    # save email addresses
+    # s/\w+@\w+\.[\w\.]+/EMAIL/g;
+
+    # normalise clause breaks (mostly punctuation symbols) to commas
+    s/[^A-Za-z0-9 \n]+/ , /g;
+
+    # Remove repeated commas, and replace with newline
+    s/\s*,[, ]+/\n/g;
+
+    # remove extra whitespace
+    s/ +/ /sg;
+    s/^\s+//mg;
+    s/\s*$/\n/mg;
+
+    # remove lines that contain one word or less
+    s/^\w*$//mg;
+    s/^\s*$//mg;
+    tr/\n//s;
+
+    return $_;
+
+}
+
+
+
+# Execute a system command
+
+sub execute {
+    my ($command, $verbosity, $outhandle) = @_;
+    print $outhandle "Executing: $command\n"  if ($verbosity > 2);
+    $! = 0;
+    my $status = system($command);
+    if ($status != 0) {
+	print STDERR "Phind - Error executing '$command': $!\n";
+	exit($status);  # this causes the build to fail... 
+    }
+}
+
+
+# Generate the vocabulary, symbol statistics, and numbers file from the
+# clauses file.  This is legacy code, so is a bit messy and probably wont
+# run under windows.
+
+sub extract_vocabulary {
+    my ($self) = @_;
+    
+    my $verbosity = $self->{'verbosity'};
+    my $out = $self->{'outhandle'};
+
+    my $collectiondir = $self->{'collectiondir'};
+    my $phinddir = $self->{'phinddir'};
+
+    my $language_exp = $self->{'language'};
+
+    my ($w, $l, $line, $word);
+    
+    my ($first_delimiter, $last_delimiter,
+	$first_stopword, $last_stopword,
+	$first_extractword, $last_extractword,
+	$first_contentword, $last_contentword,
+	$phrasedelimiter);
+    
+    my $thesaurus = $self->{'thesaurus'};
+    my ($thesaurus_links, $thesaurus_terms, 
+	%thesaurus, $first_thesaurusword, $last_thesaurusword);
+
+    my %symbol;
+    my (%freq);
+
+    print $out "Calculating vocabulary\n" if ($verbosity > 1);
+
+    # Read and store the stopwords
+    my $stopdir = &util::filename_cat($ENV{'GSDLHOME'}, "etc", "packages", "phind", "stopword");
+    my $stopword_files = ();
+    my ($language, $language_dir, $file, $file_name);
+    my %stopwords;
+
+    # Examine each directory in the stopword directory
+    opendir(STOPDIR, $stopdir);
+    foreach $language (readdir STOPDIR) {
+
+	# Ignore entries that do not match the classifier's language
+	next unless ($language =~ /$language_exp/);
+	$language_dir = &util::filename_cat($stopdir, $language);
+	next unless (-d "$language_dir");
+
+	opendir(LANGDIR, $language_dir);
+	foreach $file (readdir LANGDIR) {
+
+	    # Ignore entries that are not stopword files
+	    next unless ($file =~ /sw$/);
+	    $file_name = &util::filename_cat($language_dir, $file);
+	    next unless (-f "$file_name");
+
+	    # Read the stopwords
+	    open(STOPFILE, "<$file_name");
+	    while (<STOPFILE>) {
+		s/^\s+//;
+		s/\s.*//;
+		$word = $_;
+		$l = lc($word);
+		$stopwords{$l} = $word;
+	    }
+	    close STOPFILE;
+
+	}
+	closedir LANGDIR;
+    }
+    closedir STOPDIR;
+
+    # Read thesaurus information
+    if ($thesaurus) {
+
+	# link file exists
+	$thesaurus_links = &util::filename_cat($collectiondir, "etc", "$thesaurus.lnk");
+	die "Cannot find thesaurus link file" unless (-e "$thesaurus_links");
+
+	# ensure term file exists in the correct language
+	if ($language_exp =~ /^([a-z][a-z])/) {
+	    $language = $1;
+	} else {
+	    $language = 'en';
+	}
+	$thesaurus_terms = &util::filename_cat($collectiondir, "etc", "$thesaurus.$language");
+	die "Cannot find thesaurus term file" unless (-e "$thesaurus_terms");
+	
+
+	# Read the thesaurus terms
+	open(TH, "<$thesaurus_terms");
+	while(<TH>) {
+	    s/^\d+ //;
+	    s/\(.*\)//;
+	    foreach $w (split(/\s+/, $_)) {
+		$thesaurus{lc($w)} = $w;
+	    }
+	}
+	close TH;
+    }
+
+    # Read words in the text and count occurences
+    open(TXT, "<$phinddir/clauses");
+
+    my @words;
+    while(<TXT>) {
+	$line = $_;
+	next unless ($line =~ /./);
+	
+	@words = split(/\s+/, $line);
+	foreach $w (@words) {
+	    $l = lc($w);
+	    $w = $l if ((defined $stopwords{$l}) || (defined $thesaurus{$l}));
+	    $freq{$w}++;
+	}
+	$freq{$senlimit}++;
+    }
+    
+    close TXT;
+
+    # Calculate the "best" form of each word
+    my (%bestform, %totalfreq, %bestfreq);
+
+    foreach $w (sort (keys %freq)) {
+	$l = lc($w);
+	
+	# totalfreq is the number of times a term appears in any form
+	$totalfreq{$l} += $freq{$w};
+	
+	if (defined $stopwords{$l}) {
+	    $bestform{$l} = $stopwords{$l};
+	    
+	} elsif (defined $thesaurus{$l}) {
+	    $bestform{$l} = $thesaurus{$l};
+	    
+	} elsif (!$bestform{$l} || ($freq{$w} > $bestfreq{$l})) {
+	    $bestfreq{$l} = $freq{$w};
+	    $bestform{$l} = $w;
+	}
+    }
+    undef %freq;
+    undef %bestfreq;
+    
+
+    # Assign symbol numbers to tokens
+    my $nextsymbol = 1;
+    my (@vocab);
+    
+    # Delimiters
+    $first_delimiter = 1;
+    
+    foreach $word (@delimiters) {
+
+#	$word = lc($word); # jrm21
+	$word = uc($word);
+	$bestform{$word} = $word;
+	$vocab[$nextsymbol] = $word;
+	$symbol{$word} = $nextsymbol;
+	$nextsymbol++;
+    }
+    $last_delimiter = $nextsymbol - 1;
+    # Stopwords
+    $first_stopword = $nextsymbol;
+    
+    foreach my $word (sort keys %stopwords) {
+	# don't include stopword unless it occurs in the text
+	$word = lc($word);
+	next unless ($totalfreq{$word});
+	next if ($symbol{$word});
+	
+	$vocab[$nextsymbol] = $word;
+	$symbol{$word} = $nextsymbol;
+	$nextsymbol++;
+    }
+    $last_stopword = $nextsymbol - 1;
+    $first_contentword = $nextsymbol;
+    
+    # Thesaurus terms
+    if ($thesaurus) {
+	$first_thesaurusword = $nextsymbol;
+    
+	foreach my $word (sort keys %thesaurus) {
+	    
+	    $word = lc($word);
+	    next if ($symbol{$word});
+	    $bestform{$word} = $thesaurus{$word};
+	    
+	    $vocab[$nextsymbol] = $word;
+	    $symbol{$word} = $nextsymbol;
+	    $nextsymbol++;
+	    
+	}
+	$last_thesaurusword = $nextsymbol - 1;
+    }
+
+    # Other content words
+    $first_extractword = $nextsymbol;
+    
+    foreach my $word (sort (keys %bestform)) {
+	
+	next if ($symbol{$word});
+	
+	$vocab[$nextsymbol] = $word;
+	$symbol{$word} = $nextsymbol;
+	$nextsymbol++;
+    }
+    $last_extractword = $nextsymbol - 1;
+    $last_contentword = $nextsymbol - 1;
+    
+    # Outut the words
+    print $out "Saving vocabulary in $phinddir/clauses.vocab\n" if ($verbosity > 1);
+    open(VOC, ">$phinddir/clauses.vocab");
+
+    for (my $i = 1; $i < $nextsymbol; $i++) {
+	$w = $vocab[$i];
+
+	print VOC "$bestform{$w}\n";
+	$totalfreq{$w} = 0 unless ($totalfreq{$w});
+    }
+    close VOC;
+
+
+    # Create statistics file
+    # Output statistics about the vocablary
+    print $out "Saving statistics in $phinddir/clauses.stats\n" if ($verbosity > 1);
+    &util::rm("$phinddir/clauses.stats") if (-e "$phinddir/clauses.stats");
+
+    open(STAT, ">$phinddir/clauses.stats")
+	|| die "Cannot open $phinddir/clauses.stats: $!";
+
+    print STAT "first_delimiter $first_delimiter\n";
+    print STAT "last_delimiter $last_delimiter\n";
+    print STAT "first_stopword $first_stopword\n";
+    print STAT "last_stopword $last_stopword\n";
+    if ($thesaurus) {
+	print STAT "first_thesaurusword $first_thesaurusword\n";
+	print STAT "last_thesaurusword $last_thesaurusword\n";
+    }
+    print STAT "first_extractword $first_extractword\n";
+    print STAT "last_extractword $last_extractword\n";
+    print STAT "first_contentword $first_contentword\n";
+    print STAT "last_contentword $last_contentword\n";
+    print STAT "first_symbol $first_delimiter\n";
+    print STAT "last_symbol $last_contentword\n";
+    print STAT "first_word $first_stopword\n";
+    print STAT "last_word $last_contentword\n";
+    close STAT;
+
+    undef @vocab;
+
+
+    # Create numbers file
+    # Save text as symbol numbers
+    print $out "Saving text as numbers in $phinddir/clauses.numbers\n" if ($verbosity > 1);
+    
+    open(TXT, "<$phinddir/clauses");
+    open(NUM, ">$phinddir/clauses.numbers");
+    
+##    $phrasedelimiter = $symbol{lc($senlimit)}; # jrm21
+##    print NUM "$symbol{lc($colstart)}\n"; # jrm21
+    $phrasedelimiter = $symbol{$senlimit};
+    print NUM "$symbol{$colstart}\n";
+    
+    # set up the special symbols that delimit documents and sentences
+    while(<TXT>) {
+	
+	# split sentence into a list of tokens
+	$line = $_;
+	next unless ($line =~ /./);
+	@words = split(/\s+/, $line);
+	
+	# output one token at a time
+	foreach $word (@words) {
+# don't lower-case special delimiters - jrm21
+	    if (!map {if ($word eq $_) {1} else {()}} @delimiters) {
+		$word = lc($word);
+	    }
+	    print NUM "$symbol{$word}\n";
+	}
+	
+	# output phrase delimiter
+	print NUM "$phrasedelimiter\n";
+    }
+    
+    close TXT;
+#    print NUM "$symbol{lc($colend)}\n";# jrm21
+    print NUM "$symbol{$colend}\n";
+    close NUM;
+
+    # Save thesaurus  data in one convienient file
+    if ($thesaurus) {
+
+	my $thesaurusfile = &util::filename_cat($phinddir, "$thesaurus.numbers");
+
+
+	print $out "Saving thesaurus as numbers in $thesaurusfile\n" 
+	    if ($verbosity > 1);
+
+	# Read the thesaurus terms
+	my ($num, $text, %thes_symbols);
+	
+	open(TH, "<$thesaurus_terms");
+	while(<TH>) {
+	    chomp;
+	    @words = split(/\s+/, $_);
+	    $num = shift @words;
+	    $text = "";
+
+	    # translate words into symbol numbers
+	    foreach $word (@words) {
+		$word = lc($word);
+		if ($symbol{$word}) {
+		    $text .= "s$symbol{$word} ";
+		} elsif ($verbosity) {
+		    print $out "Phind: No thesaurus symbol, ignoring \"$word\"\n";
+		}
+	    }
+	    $text =~ s/ $//;
+	    $thes_symbols{$num} = $text;
+	}
+	close TH;
+
+	# Read the thesaurus links and write the corresponding data
+	open(TH, "<$thesaurus_links");
+	open(THOUT, ">$thesaurusfile");
+
+	while(<TH>) {
+	    chomp;
+	    ($num, $text) = split(/:/, $_);
+
+	    if (defined($thes_symbols{$num})) {
+		print THOUT "$num:$thes_symbols{$num}:$text\n";
+	    } else {
+		print THOUT "$num:untranslated:$text\n";
+	    }
+	}
+	close TH;    
+	close THOUT;
+    }
+
+
+
+
+}
+
+
+# renumber_phrases
+#
+# Prepare the phrases file to be input to mgpp.  The biggest problem is
+# reconciling the phrase identifiers used by the suffix program (which
+# we'll call suffix-id numbers) with the numbers used in the thesaurus
+# (theesaurus-id) to create a ciommon set of phind id numbers (phind-id).
+# Phind-id numbers must be sorted by frequency of occurance.
+#
+# Start creating a set of phind-id numbers from the sorted suffix-id
+# numbers and (if required) the thesaurus-id numbers.  Then add any other
+# phrases occuring in the thesaurus.
+#
+# The last thing we have to do is restore the vocabulary information to the
+# phrase file so that the phrases are stored as words, not as symbol
+# numbers.
+
+# The original phrases file looks something like this:
+#   159396-1:s5175:4:1:116149-2:3:d2240,2;d2253;d2254
+#   159409-1:s5263:6:1:159410-2:6:d2122;d2128;d2129;d2130;d2215;d2380
+#   159415-1:s5267:9:1:159418-2:8:d3,2;d632;d633;d668;d1934;d2010;d2281;d2374
+#   159426-1:s5273:5:2:159429-2,115168-17:5:d252;d815;d938;d939;d2361
+
+
+sub renumber_phrases {
+    my ($self) = @_;
+
+    renumber_suffix_data($self);
+    renumber_thesaurus_data($self);
+    restore_vocabulary_data($self);
+
+}
+
+
+
+# renumber_suffix_data
+#
+# Translate phrases file to phrases.2 using phind keys instead
+# of suffix keys and sorting the expansion data.
+
+sub renumber_suffix_data {
+    my ($self) = @_;
+    
+    my $verbosity = $self->{'verbosity'};
+    my $out = $self->{'outhandle'};
+    print $out "Translate phrases: suffix-ids become phind-id's\n" 
+	if ($verbosity);
+    
+    my $phinddir = $self->{'phinddir'};
+    my $infile = &util::filename_cat($phinddir, 'phrases');
+    my $outfile = &util::filename_cat($phinddir, 'phrases.2');
+
+    # Read the phrase file.  Calculate initial set of phind-id
+    # numbers and store (suffixid -> frequency) relation.
+
+    my %suffixtophind;
+    my @totalfrequency;
+    my (@fields, $suffixid);
+    my $nextphind = 1;
+    
+    open(IN, "<$infile");
+    while(<IN>) {
+
+	chomp;
+	@fields = split(/:/, $_);
+	
+	# get next suffixid and phindid
+	$suffixid = shift @fields;
+	$suffixtophind{$suffixid} = $nextphind;
+
+	# store total frequency
+	shift @fields;
+	$totalfrequency[$nextphind] = shift @fields;
+
+	$nextphind++;
+    }
+    close IN;
+
+
+    # Translate phrases file to phrases.2.  Use phind keys (not suffix
+    # keys), sort expansion and document occurance data in order of
+    # descending frequency..
+    open(IN, "<$infile");
+    open(OUT, ">$outfile");
+    
+    my ($phindid, $text, $tf, $countexp, $expansions, $countdocs, $documents);
+    my (@documwents, @newexp, $k, $n);
+    my $linenumber = 0;
+
+    while(<IN>) {
+	
+	# read the line
+	chomp;
+	@fields = split(/:/, $_);
+	
+	# get a phrase number for this line
+	$suffixid = shift @fields;
+	die unless (defined($suffixtophind{$suffixid}));
+	$phindid = $suffixtophind{$suffixid};
+	
+	# get the symbols in the phrase
+	$text = shift @fields;
+
+	# output status information
+	$linenumber++;
+	if ($verbosity > 2) {
+	    if ($linenumber % 1000 == 0) {
+		print $out "line $linenumber:\t$phindid\t$suffixid\t($text)\n";
+	    }
+	    # what are $num and $key??
+	    #print $out "$num: $key\t($text)\n" if ($verbosity > 3);
+	}
+
+	# get the phrase frequency
+	$tf = shift @fields;
+	
+	# get the number of expansions
+	$countexp = shift @fields;
+	
+	# get the expansions, convert them into phind-id numbers, and sort them
+	$expansions = shift @fields;
+	@newexp = ();
+	foreach $k (split(/,/, $expansions)) {
+	    die "ERROR - no phindid for: $k" unless (defined($suffixtophind{$k}));
+	    $n = $suffixtophind{$k};
+	    push @newexp, $n;
+	}
+	@newexp = sort {$totalfrequency[$b] <=> $totalfrequency[$a]} @newexp;
+
+	# get the number of documents
+	$countdocs = shift @fields;
+	
+	# get the documents and sort them
+	$documents = shift @fields;
+	$documents =~ s/d//g;
+	my @documents = split(/;/, $documents);
+	@documents = sort by_doc_frequency @documents;
+
+	# output the phrase data
+ 	print OUT "$phindid:$text:$tf:$countexp:$countdocs:";
+	print OUT join(",", @newexp), ",:", join(";", @documents), ";\n";
+	
+    }
+
+    close IN;
+    close OUT;
+}
+
+
+# renumber_thesaurus_data
+#
+# Translate phrases.2 to phrases.3, adding thesaurus data if available.
+
+sub renumber_thesaurus_data {
+    my ($self) = @_;
+  
+    my $out = $self->{'outhandle'};
+    my $verbosity = $self->{'verbosity'};
+    my $thesaurus = $self->{'thesaurus'};
+
+    my $phinddir = $self->{'phinddir'};
+    my $infile = &util::filename_cat($phinddir, "phrases.2");
+    my $outfile = &util::filename_cat($phinddir, "phrases.3");
+
+
+    # If no thesaurus is defined, simply move the phrases file.
+    if (!$thesaurus) {
+	print $out "Translate phrases.2: no thesaurus data\n" 
+	    if ($verbosity);
+	&util::mv($infile, $outfile);
+	return;
+    }
+
+    print $out "Translate phrases.2: add thesaurus data\n" 
+	if ($verbosity);
+
+    # 1.
+    # Read thesaurus file and store (symbols->thesaurusid) mapping
+    my $thesaurusfile = &util::filename_cat($phinddir, "$thesaurus.numbers");
+    my %symbolstothesid;
+    my (@fields, $thesid, $symbols);
+    
+    open(TH, "<$thesaurusfile");
+
+    while (<TH>) {
+	
+	chomp;
+	@fields = split(/:/, $_);
+	
+	# get id and text
+	$thesid = shift @fields;
+	$symbols = shift @fields;
+	$symbolstothesid{$symbols} = $thesid;
+    }
+    close TH;    
+
+    # 2. 
+    # Read phrases file to find thesaurus entries that already
+    # have a phindid.  Store their phind-ids for later translation,
+    # and store their frequency for later sorting.
+    my %thesaurustophindid;
+    my %phindidtofrequency;
+    my ($phindid, $freq);
+
+    open(IN, "<$infile");
+    
+    while(<IN>) {
+	
+	chomp;
+	@fields = split(/:/, $_);
+	
+	# phindid and symbols for this line
+	$phindid = shift @fields;
+	$symbols = shift @fields;
+	$freq = shift @fields;
+
+	# do we have a thesaurus id corresponding to this phrase?
+	if (defined($symbolstothesid{$symbols})) {
+	    $thesid = $symbolstothesid{$symbols};
+	    $thesaurustophindid{$thesid} = $phindid;
+	    $phindidtofrequency{$phindid} = $freq;
+	}
+    }
+    close IN;
+  
+    undef %symbolstothesid;
+
+    # 3.
+    # Create phind-id numbers for remaining thesaurus entries,
+    # and note that their frequency is 0 for later sorting.
+    my $nextphindid = $phindid + 1;
+
+    open(TH, "<$thesaurusfile");
+    while(<TH>) {
+	
+	chomp;
+	@fields = split(/:/, $_);
+	
+	# read thesaurus-id and ensure it has a corresponding phind-id
+	$thesid = shift @fields;
+	if (!defined($thesaurustophindid{$thesid})) {
+	    $thesaurustophindid{$thesid} = $nextphindid;
+	    $phindidtofrequency{$nextphindid} = 0;
+	    $nextphindid++;
+	}
+    }
+    close TH;
+
+    # 4.
+    # Translate thesaurus file, replacing thesaurus-id numbers with 
+    # phind-id numbers.
+    my $newthesaurusfile = &util::filename_cat($phinddir, "$thesaurus.phindid");
+    my ($relations, $linkcounter, $linktext, $linktype, @linkdata);
+    my (@links, $linkid, %linkidtotype, $newrelation);
+
+    open(TH, "<$thesaurusfile");
+    open(TO, ">$newthesaurusfile");
+    while(<TH>) {
+	
+	chomp;
+	@fields = split(/:/, $_);
+	
+	# phindid and symbols for this line
+	($thesid, $symbols, $relations) = @fields;
+	
+	die unless ($thesid && $symbols);
+	die unless $thesaurustophindid{$thesid};
+	$phindid = $thesaurustophindid{$thesid};
+
+	# convert each part of the relation string to use phind-id numbers
+	# at the same time, we want to sort the list by frequency.
+	undef %linkidtotype;
+	
+	foreach $linktext (split(/;/, $relations)) {
+	    @linkdata = split(/,/, $linktext);
+	    
+	    # remember the linktype (e.g. BT, NT)
+	    $linktype = shift @linkdata;
+	    
+	    # store the type of each link
+	    foreach $thesid (@linkdata) {
+		die unless (defined($thesaurustophindid{$thesid}));
+		$linkidtotype{$thesaurustophindid{$thesid}} = $linktype;
+	    }
+	}
+
+	# sort the list of links, first by frequency, then by type.
+	@links = sort { ($phindidtofrequency{$b} <=> $phindidtofrequency{$a}) 
+                        or ($linkidtotype{$a} cmp $linkidtotype{$b}) } (keys %linkidtotype);
+	$linkcounter = (scalar @links);
+
+	# create a string describing the link information
+	$linktype = $linkidtotype{$links[0]};
+	$newrelation = $linktype;
+	foreach $linkid (@links) {
+	    if ($linkidtotype{$linkid} ne $linktype) {
+		$linktype = $linkidtotype{$linkid};
+		$newrelation .= ";" . $linktype;
+	    }
+	    $newrelation .= "," . $linkid;
+	}
+	$newrelation .= ";";
+	
+
+	# output the new line
+	print TO "$phindid:$symbols:$linkcounter:$newrelation:\n";
+    }
+    close TH;
+    close TO;
+
+    undef %thesaurustophindid;
+    undef %linkidtotype;
+    undef %phindidtofrequency;
+
+    # 5.
+    # Read thesaurus data (in phind-id format) into memory
+    my %thesaurusdata;
+
+    open(TH, "<$newthesaurusfile");
+    while(<TH>) {
+	chomp;
+	($phindid, $symbols, $linkcounter, $relations) = split(/:/, $_);
+	die unless ($phindid && $symbols);
+	$thesaurusdata{$phindid} = "$symbols:$linkcounter:$relations";
+    }
+    close TH;
+
+    # 6. 
+    # Add thesaurus data to phrases file
+    my ($text, $tf, $countexp, $expansions, $countdocs, $documents);
+    my (@documwents, @newexp, $k, $n);
+    my $linenumber = 0;
+
+    open(IN, "<$infile");
+    open(OUT, ">$outfile");
+
+    # Update existing phrases
+    while(<IN>) {
+	
+	chomp;
+	@fields = split(/:/, $_);
+		
+	# get data for this line
+	$phindid = shift @fields;
+	
+	# output the phrase data, with thesaurus information
+ 	print OUT "$phindid:", join(":", @fields);
+
+	# add thesaurus data
+	if (defined($thesaurusdata{$phindid})) {
+	    @fields = split(/:/, $thesaurusdata{$phindid});
+	    shift @fields;
+	    $linkcounter = shift @fields;
+	    $relations = shift @fields;
+
+	    print OUT ":$linkcounter:$relations";
+	    $thesaurusdata{$phindid} = "";
+	}
+	print OUT "\n";
+    }
+    close IN;
+
+    # Add phrases that aren't already in the file
+    foreach $phindid (sort numerically keys %thesaurusdata) {
+	next unless ($thesaurusdata{$phindid});
+
+	@fields = split(/:/, $thesaurusdata{$phindid});
+	$symbols = shift @fields;
+	$linkcounter = shift @fields;
+	$relations = shift @fields;
+
+	print OUT "$phindid:$symbols:0:0:0:::$linkcounter:$relations\n";
+    }
+    close OUT;
+
+}
+
+# restore_vocabulary_data
+#
+# Read phrases.3 and restore vocabulary information. Then write 
+# this data to the MGPP input files (pword.txt and pdata.txt) and
+# (if requested) to the saved phrases file.
+
+sub restore_vocabulary_data {
+    my ($self) = @_;
+ 
+    my $out = $self->{'outhandle'};
+    my $verbosity = $self->{'verbosity'};
+    print $out "Translate phrases.3: restore vocabulary\n" if ($verbosity);
+
+    my $phinddir = $self->{'phinddir'};
+    my $infile = &util::filename_cat($phinddir, 'phrases.3');
+    my $vocabfile = &util::filename_cat($phinddir, 'clauses.vocab');
+    my $datafile = &util::filename_cat($phinddir, 'pdata.txt');
+    my $wordfile = &util::filename_cat($phinddir, 'pword.txt');
+
+    my $savephrases = $self->{'savephrases'};
+
+    # 1.
+    # Read the vocabulary file
+    open(V, "<$vocabfile")
+	|| die "Cannot open $vocabfile: $!";
+    my @symbol;
+    my $i = 1;
+    while(<V>) {
+	chomp;
+	$symbol[$i++] = $_;
+    }
+    close V;
+
+    # 2. 
+    # Translate phrases.3 to MGPP input files
+    my ($key, $text, $word, $isThesaurus, $line);
+    my @fields;
+    my $linenumber = 0;
+
+    open(IN, "<$infile");
+    open(DATA, ">$datafile");
+    open(WORD, ">$wordfile");
+
+    # Save the phrases in a separate text file
+    if ($savephrases) {
+	print $out "Saving phrases in $savephrases\n" if ($verbosity);
+	open(SAVE, ">$savephrases");
+    }
+
+    while(<IN>) {
+	
+	# read the line
+	chomp;
+	$line = $_;
+	@fields = split(/:/, $line);
+	
+	# get a phrase number for this line
+	$key = shift @fields;
+	
+	# restore the text of the phrase
+	$text = shift @fields;
+	$text =~ s/s(\d+)/$symbol[$1]/g;
+	if ($text =~ / /) {
+	    $word = "";
+	} elsif ($text ne 'untranslated') {
+	    $word = $text;
+	}
+
+	# output the phrase data
+	print DATA "<Document>";
+ 	print DATA "$key:$text:", join(":", @fields), ":\n";
+	
+	# output the word index search data
+	print WORD "<Document>$word\n";
+
+	# output the phrases to a text file
+	if ($savephrases) {
+	    if ((scalar @fields) == 7) {
+		$isThesaurus = 1;
+	    } else {
+		$isThesaurus = 0;
+	    }
+	    print SAVE $fields[0], "\t", $fields[2], "\t$isThesaurus\t$text\n";
+	}
+    }
+    close IN;
+    close WORD;
+    close DATA;
+    close SAVE if ($savephrases);
+
+}
+
+
+
+# sort routines used to renumber phrases
+
+sub numerically { $a <=> $b }
+
+sub by_doc_frequency { 
+    my $fa = 1;
+    if ($a =~ /,/) {
+	$fa = $a;
+	$fa =~ s/\d+,//;
+    }
+    my $fb = 1;
+    if ($b =~ /,/) {
+	$fb = $b;
+	$fb =~ s/\d+,//;
+    }
+
+    return ($fb <=> $fa);
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/RecentDocumentsList.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/RecentDocumentsList.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/RecentDocumentsList.pm	(revision 24799)
@@ -0,0 +1,240 @@
+###########################################################################
+#
+# RecentDocumentsList.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# simple list classifier plugin 
+# to see the options, run "perl -S classinfo.pl RecentDocumentsList"
+
+package RecentDocumentsList;
+
+use BaseClassifier;
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+use sorttools;
+use Time::Local;
+
+sub BEGIN {
+    @RecentDocumentsList::ISA = ('BaseClassifier');
+}
+
+my $arguments =   
+    [ { 'name' => "include_docs_added_since",
+	'desc' => "{RecentDocumentsList.include_docs_added_since}",
+	'type' => "string",
+	'reqd' => "no" },
+      { 'name' => "include_most_recently_added", 
+	'desc' => "{RecentDocumentsList.include_most_recently_added}",
+	'type' => "int",
+	'deft' => "20",
+        'reqd' => "no"},
+      { 'name' => "sort",
+	'desc' => "{RecentDocumentsList.sort}",
+	'type' => "metadata",
+	'reqd' => "no"}
+      ];
+
+my $options = { 'name'     => "RecentDocumentsList",
+		'desc'     => "{RecentDocumentsList.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+
+sub new {
+    my ($class) = shift (@_);
+
+    my ($classifierslist,$inputargs,$hashArgOptLists) = @_;
+    push(@$classifierslist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new BaseClassifier($classifierslist, $inputargs, $hashArgOptLists);
+
+    if ($self->{'info_only'}) {
+	# don't worry about any options etc
+	return bless $self, $class;
+    }
+    # check the arguments
+    
+    if (!$self->{"buttonname"}) {
+	$self->{"buttonname"} = 'RecentDocuments';
+    }
+
+    # we want either include_docs_added_since, or include_most_recently_added, but not both.
+    if (defined $self->{'include_docs_added_since'} && !($self->{'include_docs_added_since'} eq "")){
+	$self->{'classify_by_date'} = 1;
+	my ($year, $month, $day) = $self->{'include_docs_added_since'} =~ 
+	    /^(\d\d\d\d)-?(\d\d)?-?(\d\d)?$/;
+	if (!defined $year) {
+	    &gsprintf($self->{'outhandle'}, "RecentDocumentsList::init {RecentDocumentsList.date_wrong_format}\n");
+	    die "\n";
+	}
+	if (!defined $month || $month < 1 || $month > 12) {
+	    $month = "01";
+	    $day = "01";
+	} elsif (!defined $day || $day < 1 || $day > 31) {
+	    $day = "01";
+	}
+	
+	$self->{'classification_date'} = timelocal(0,0,0,$day,$month-1, $year);
+
+    } else {
+	$self->{'classify_by_date'} = 0;
+    }	
+    if ($self->{'sort'} eq "") {
+	undef $self->{'sort'};
+    }
+    $self->{'sort'} = $self->strip_ex_from_metadata($self->{'sort'});
+
+    # Further setup 
+    $self->{'list'} = {};
+    # if we are getting top X docs, and sorting by meta, we need to store the 
+    # date and the metadata
+    if (!$self->{'classify_by_date'} && $self->{'sort'}) {
+	$self->{'meta_list'} = {};
+    }
+    return bless $self, $class;
+}
+
+sub init {
+    my $self = shift (@_);
+
+}
+
+sub classify {
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+
+    my $doc_OID = $doc_obj->get_OID();
+    my $lastmodified = $doc_obj->get_metadata_element($doc_obj->get_top_section(), "lastmodified");
+    if (!defined $lastmodified || $lastmodified eq "") {
+	print $self->{'outhandle'}, "RecentDocumentsList: $doc_OID has no lastmodified metadata, not classifying\n";
+	return;
+    }
+
+    # doc goes into classification if we are not classifying by date, or the date is after the cutoff date.
+    if ($self->{'classify_by_date'}) {
+	if ($lastmodified > $self->{'classification_date'}) {
+	    my $sort_meta = $lastmodified;
+	    if (defined $self->{'sort'}) {
+		$sort_meta = $doc_obj->get_metadata_element($doc_obj->get_top_section(), $self->{'sort'});
+	    }
+	    $self->{'list'}->{$doc_OID} = $sort_meta;
+	    $doc_obj->add_metadata($doc_obj->get_top_section(), "memberof", "CL".$self->get_number());
+	}	    
+    } else {
+
+	# need to store metadata as well...
+	$self->{'list'}->{$doc_OID} = $lastmodified;
+	if (defined $self->{'sort'}) {
+	    my $sort_meta = $doc_obj->get_metadata_element($doc_obj->get_top_section(), $self->{'sort'});
+	    $self->{'meta_list'}->{$doc_OID} = $sort_meta;
+	}
+    }
+    
+}
+
+
+sub get_classify_info {
+    my $self = shift (@_);
+    my $return_doc_size=0;
+
+    my $list = $self->{'list'};
+
+
+    # organise into classification structure
+    my %classifyinfo = ('thistype'=>'Invisible',
+			'childtype'=>'VList',
+ 			'Title'=>$self->{'buttonname'},
+ 			'contains'=>[]);
+    
+
+    # may or may not support memberof, depending on options set
+    $classifyinfo{'supportsmemberof'} = &supports_memberof();
+
+    # get either all documents (sorted by date), or the top X docs
+    my @sorted_docs = sort {$self->date_or_metadata_sort($a,$b)} keys %{$self->{'list'}};
+    my $numdocs = $self->{'include_most_recently_added'};
+    if ($self->{'classify_by_date'}) { 
+	# just include all docs in the list
+	$numdocs = scalar  (@sorted_docs);
+    } else {
+	if ($numdocs > scalar  (@sorted_docs)) {
+	    $numdocs = scalar  (@sorted_docs);
+	}
+	if ($self->{'sort'}) {
+	    # we need to sort further by metadata
+	    # cut off the list
+	    @sorted_docs = @sorted_docs[0..$numdocs-1];
+	    # sort again
+	    @sorted_docs = sort {$self->external_meta_sort($a,$b)}@sorted_docs;
+	}
+    }
+    for (my $i=0; $i<$numdocs; $i++) {
+	push (@{$classifyinfo{'contains'}}, {'OID'=> $sorted_docs[$i]});
+    }
+	
+	
+    return \%classifyinfo;
+}
+
+# we can only support memberof if we have the include_docs_added_since option, otherwise we don't know at the time of classification of a document if it will be in the classifier or not.
+sub supports_memberof {
+    my $self = shift(@_);
+
+    if ($self->{'classify_by_date'}) {
+	return "true";
+    }
+    return "false";
+}
+
+sub date_or_metadata_sort {
+    my ($self,$a,$b) = @_;
+    # make it do metadata too
+    my $date_a = $self->{'list'}->{$a};
+    my $date_b = $self->{'list'}->{$b};
+    if (!$self->{'sort'} || !$self->{'classify_by_date'}) {
+	# want reverse order (latest to earliest)
+	return ($date_b <=> $date_a);
+    }
+    # meta sorting, use string cmp
+    return ($date_a cmp $date_b);
+}
+
+sub external_meta_sort {
+    my ($self,$a,$b) = @_;
+    
+    my $meta_a = $self->{'meta_list'}->{$a};
+    my $meta_b = $self->{'meta_list'}->{$b};
+
+    return ($meta_a cmp $meta_b);
+}
+
+    
+1;
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/SectionList.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/SectionList.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/SectionList.pm	(revision 24799)
@@ -0,0 +1,152 @@
+###########################################################################
+#
+# SectionList.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# Same as SimpleList classifier but includes all sections of document
+# (excluding top level) rather than just top level document 
+# itself
+
+
+package SectionList;
+
+use SimpleList;
+use sorttools;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+sub BEGIN {
+    @SectionList::ISA = ('SimpleList');
+}
+
+my $arguments = [];
+my $options = { 'name'     => "SectionList",
+		'desc'     => "{SectionList.desc}",
+		'abstract' => "no",
+		'inherits' => "yes" };
+
+
+sub new { 
+    my ($class) = shift (@_);
+    my ($classifierslist,$inputargs,$hashArgOptLists) = @_;
+    push(@$classifierslist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new SimpleList($classifierslist, $inputargs, $hashArgOptLists);
+
+    return bless $self, $class;
+}
+
+sub classify {
+    my $self = shift (@_);
+    my ($doc_obj, @options) = @_;
+    
+    # @options used by AZCompactList when is uses SectionList internally
+    # are we sorting the list??
+    my $nosort = 0;
+    if (defined $self->{'sort'} && $self->{'sort'} eq "nosort") {
+	$nosort = 1;
+    }
+
+    my $thissection = undef;
+
+    foreach my $option (@options)
+    {
+	if ($option =~ m/^section=(\d+)$/i) 
+	{
+	    $thissection = $1;
+	}
+    }
+
+    my $sortmeta = "";
+    if (!$nosort && defined $self->{'sort'}) {
+	if ($self->{'sort'} =~ /^filename$/i) {
+	    $sortmeta = $doc_obj->get_source_filename();
+	} else {
+	    $sortmeta = $doc_obj->get_metadata_element($doc_obj->get_top_section(), $self->{'sort'});
+	    if (defined $sortmeta && !$self->{'no_metadata_formatting'}) {
+		$sortmeta = &sorttools::format_metadata_for_sorting($self->{'sort'}, $sortmeta, $doc_obj);
+	    }
+	}
+	$sortmeta = "" unless defined $sortmeta;
+    }
+
+    if (defined $thissection) {
+	# just classify the one section
+	$self->classify_section($thissection, $doc_obj, $sortmeta, $nosort);
+    } else    
+    {
+	$thissection = $doc_obj->get_next_section ($doc_obj->get_top_section());
+	while (defined $thissection) {
+	    $self->classify_section($thissection, $doc_obj, $sortmeta, $nosort);
+	    $thissection = $doc_obj->get_next_section ($thissection);
+	}
+    }
+}
+
+sub classify_section {
+    my $self = shift (@_);
+    my ($section, $doc_obj, $sortmeta, $nosort) = @_;
+
+    my $doc_OID = $doc_obj->get_OID();
+    $nosort = 0 unless defined $nosort;
+    $sortmeta = "" unless defined $sortmeta;
+
+    my $metavalue;
+    my $metaname;
+    if (defined $self->{'meta_list'}) {
+	# find the first available metadata
+	foreach my $m (@{$self->{'meta_list'}}) {
+	    $metavalue = $doc_obj->get_metadata_element($section, $m);
+	    $metaname = $m;
+	    last if defined $metavalue;
+	} 
+	#if we haven't found a metavalue here, then the section shouldn't be included
+	return unless defined $metavalue;
+    }
+    
+    # we know the section should be included, add it now if we are not sorting
+    if ($nosort) {
+	push (@{$self->{'list'}}, "$doc_OID.$section");
+	return;
+    }
+    # check that it hasn't been added already
+    if (defined $self->{'list'}->{"$doc_OID.$section"}) {
+	my $outhandle = $self->{'outhandle'};
+	print $outhandle "WARNING: SectionList::classify called multiple times for $doc_OID.$section\n";
+    } 
+
+    if (defined $self->{'sort'}) {
+	# sorting on alternative metadata
+	$self->{'list'}->{"$doc_OID.$section"} = $sortmeta;
+    } else {
+	# sorting on the classification metadata
+	# do the same formatting on the meta value as for sort meta
+	$metavalue = &sorttools::format_metadata_for_sorting($metaname, $metavalue, $doc_obj) unless $self->{'no_metadata_formatting'};
+	$self->{'list'}->{"$doc_OID.$section"} = $metavalue;
+    }
+}
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/SimpleList.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/SimpleList.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/classify/SimpleList.pm	(revision 24799)
@@ -0,0 +1,256 @@
+###########################################################################
+#
+# SimpleList.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# simple list classifier plugin 
+# to see the options, run "perl -S classinfo.pl SimpleList"
+
+use BaseClassifier;
+package SimpleList;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+use sorttools;
+
+sub BEGIN {
+    @SimpleList::ISA = ('BaseClassifier');
+}
+
+my $arguments = 
+    [ { 'name' => "metadata",
+	'desc' => "{SimpleList.metadata}",
+	'type' => "metadata",
+	'reqd' => "no" },
+      { 'name' => "sort",
+	'desc' => "{SimpleList.sort}",
+	'type' => "metadata",
+	'reqd' => "no" } ];
+
+my $options = { 'name'     => "SimpleList",
+		'desc'     => "{SimpleList.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+
+sub new {
+    my ($class) = shift (@_);
+
+    my ($classifierslist,$inputargs,$hashArgOptLists) = @_;
+    push(@$classifierslist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new BaseClassifier($classifierslist, $inputargs, $hashArgOptLists);
+
+    if ($self->{'info_only'}) {
+	# don't worry about any options etc
+	return bless $self, $class;
+    }
+
+    # Transfer value from Auto Parsing to the variable name that used in previous GreenStone.
+    my (@meta_list,$meta1);
+    if ($self->{"metadata"}) {
+	# strip off ex.
+	$self->{"metadata"} = $self->strip_ex_from_metadata($self->{'metadata'});
+	@meta_list = split(/,|;/, $self->{"metadata"});
+	$meta1 = $meta_list[0];
+	$self->{'meta_list'} = \@meta_list;
+    } else {
+	$meta1=undef;
+	@meta_list = undef;
+    }
+
+    if (!$self->{"buttonname"}) {
+	if (defined ($self->{'metadata'})) {
+	    $self->{"buttonname"} = $self->generate_title_from_metadata($self->{'metadata'});
+	} else {
+	    $self->{"buttonname"} = 'List';
+	}
+    }
+
+    # Further setup
+    # $self->{"sort"} is handled a bit differently - kjdon
+    # undef means to sort, but use the metadata value from -metadata
+    # because there is no one metadata value to get for sorting when 
+    # we have a list of possible metadata
+    # to get no sorting, set $self->{"sort"} = 'nosort'
+    if (!$self->{"sort"}) {
+	if (defined ($self->{"metadata"})) {
+	    $self->{"sort"} = undef;
+	} else {
+	    $self->{"sort"} = "nosort";
+	}
+    }    
+    if (defined $self->{'sort'}) {
+	$self->{'sort'} = $self->strip_ex_from_metadata($self->{'sort'});
+    }
+    if (defined  $self->{"sort"} &&  $self->{"sort"} eq "nosort") {
+	$self->{'list'} = [];
+    } else {
+	$self->{'list'} = {};
+    }
+        
+    # Clean out the unused keys
+    delete $self->{"metadata"}; # Delete this key
+    
+    return bless $self, $class;
+}
+
+sub init {
+    my $self = shift (@_);
+
+}
+
+sub classify {
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+
+    my $doc_OID = $doc_obj->get_OID();
+
+
+    # are we sorting the list??
+    my $nosort = 0;
+    if (defined $self->{'sort'} && $self->{'sort'} eq "nosort") {
+	$nosort = 1;
+    }
+    
+    my $metavalue;
+    my $metaname;
+    if (defined $self->{'meta_list'}) {
+	my $topsection=$doc_obj->get_top_section();
+
+	# find the correct bit of metadata, if multi-valued metadata field
+	if (exists $doc_obj->{'mdoffset'}) { # set by AZCompactList
+
+	    my $mdoffset=$doc_obj->{'mdoffset'} - 1;
+	    
+	    foreach my $m (@{$self->{'meta_list'}}) {
+		my $values_listref=
+		    $doc_obj->get_metadata($topsection, $m);
+		my $array_size = scalar(@{$values_listref});
+		if ($array_size==0 || $array_size < $mdoffset+1) {
+		    $mdoffset = $mdoffset - $array_size;
+		} else {
+		    $metaname = $m;
+		    # get the correct value using the offset
+		    $metavalue=@$values_listref[$mdoffset];
+                    # use a special format for docOID...
+		    $doc_OID .= ".offset$mdoffset";
+		    last;
+		}
+	    }
+	} else {
+	    # use the first available metadata
+	    foreach my $m (@{$self->{'meta_list'}}) {
+		$metavalue = $doc_obj->
+		    get_metadata_element($topsection, $m);
+		$metaname = $m;
+		last if defined $metavalue;
+	    }
+	} 
+	# if we haven't found a metavalue, then the doc shouldn't be included
+	return unless defined $metavalue;
+    }
+    
+    # we know the doc should be included, add it now if we are not sorting
+    if ($nosort) {
+	push (@{$self->{'list'}}, $doc_OID);
+	return;
+    }
+
+    #check for a sort element other than our metadata
+    if (defined $self->{'sort'}) {
+	my $sortmeta;
+	if ($self->{'sort'} =~ /^filename$/i) {
+	    $sortmeta = $doc_obj->get_source_filename();
+	} else {
+	    $sortmeta = $doc_obj->get_metadata_element($doc_obj->get_top_section(), $self->{'sort'});
+	    if (defined $sortmeta && !$self->{'no_metadata_formatting'}) {
+		$sortmeta = &sorttools::format_metadata_for_sorting($self->{'sort'}, $sortmeta, $doc_obj);
+	    }
+	}
+	$sortmeta = "" unless defined $sortmeta;
+	$self->{'list'}->{$doc_OID} = $sortmeta;
+    } else {
+	# we add to the list based on metadata value
+	# but we need to do the same formatting as for sort value
+	($metavalue) = &sorttools::format_metadata_for_sorting($metaname, $metavalue, $doc_obj) unless $self->{'no_metadata_formatting'};
+	$self->{'list'}->{$doc_OID} = $metavalue;
+    }
+    my $id = $self->get_number();
+    $doc_obj->add_metadata($doc_obj->get_top_section(), "memberof", "CL$id");
+}
+
+
+sub get_classify_info {
+    my $self = shift (@_);
+    my ($gli, $no_thistype) = @_;
+    $no_thistype = 0 unless defined $no_thistype;
+    my $memberof = &supports_memberof();
+
+    my @list = ();
+    if (defined $self->{'sort'} && $self->{'sort'} eq "nosort") {
+	@list = @{$self->{'list'}};
+    } else {
+	if (keys %{$self->{'list'}}) {
+	    @list = sort {$self->{'list'}->{$a} 
+			  cmp $self->{'list'}->{$b};} keys %{$self->{'list'}};
+	}	
+    }
+    # organise into classification structure
+    my %classifyinfo = ('childtype'=>'VList',
+			'Title'=>$self->{'buttonname'},
+			'contains'=>[]);
+    $classifyinfo{'thistype'} = 'Invisible' unless $no_thistype;
+    # always supports memberof
+    $classifyinfo{'supportsmemberof'} = $memberof;
+
+    foreach my $OID (@list) {
+	my $hashref={};
+	# special oid format, if using offsets (from AZCompactList)
+	if ($OID =~ s/\.offset(\d+)$//) {
+	    $hashref->{'offset'}=$1;
+	}
+	$hashref->{'OID'}=$OID;
+
+	push (@{$classifyinfo{'contains'}}, $hashref);
+    }
+
+    return \%classifyinfo;
+}
+
+sub supports_memberof {
+    my $self = shift(@_);
+
+    return "true";
+}
+
+1;
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cnseg.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cnseg.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cnseg.pm	(revision 24799)
@@ -0,0 +1,80 @@
+###########################################################################
+#
+# cnseg.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+
+# this package segments a chinese UTF-8 encoded Unicode
+# string into words.
+
+package cnseg;
+
+use strict;
+use unicode;
+
+
+# 'segment' takes a UTF-8 encoded Unicode Chinese-language
+# string and places U-200B between words -- the ZERO
+# WIDTH SPACE. Each line is treated as a separate 
+# paragraph, so lines in one paragraph should
+# be joined before using this method (normally a single
+# word might span more than one line within a paragraph).
+#
+# 'segment' is currently written in Perl, however, I (Rodger)
+# plan to use C++ (via pipes) once a more complex (and useful!)
+# algorithm is being used. Currently, each Chinese character
+# is treated as a seperate word.
+
+sub segment {
+    my ($in) = @_;
+    my ($c);
+
+    my $uniin = &unicode::utf82unicode($in);
+    my $out = [];
+
+    my $space = 1; # start doesn't need a space
+    foreach $c (@$uniin) {
+	if (($c >= 0x2e80 && $c <= 0xd7a3) ||
+	    ( $c >= 0xf900 && $c <= 0xfa6a)) { # main east asian codes
+	    # currently c++ receptionist code can't handle these large numbers
+	    # search terms need to be segmented the same way. Add these back
+	    # in when fix up c++
+	   # ($c >= 0x20000 && $c <= 0x2a6d6) || # cjk unified ideographs ext B
+	   # ($c >= 0x2f800 && $c <= 0x2fa1d)) { #cjk compatibility ideographs supplement
+	    # CJK character
+	    push (@$out, 0x200b) unless $space;
+	    push (@$out, $c);
+	    push (@$out, 0x200b);
+	    $space = 1;
+
+	} else {
+	    # non-Chinese character
+	    push (@$out, $c);
+	    $space = 0;
+	}
+    }
+
+    return &unicode::unicode2utf8($out);
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/colcfg.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/colcfg.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/colcfg.pm	(revision 24799)
@@ -0,0 +1,308 @@
+###########################################################################
+#
+# colcfg.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# reads/writes the collection configuration files:
+# collect.cfg/collectionConfig.xml and build.cfg/buildConfig.xml
+
+package colcfg;
+
+use cfgread;
+use gsprintf 'gsprintf';
+use strict;
+
+# the collection configuration file data is stored in the form
+#
+# {'infodbtype'}->string
+# {'creator'}->string
+# {'public'}->string
+# {'defaultindex'}->string
+# {'importdir'}->string
+# {'archivedir'}->string
+# {'cachedir'}->string
+# {'builddir'}->string
+# {'removeold'}->string
+# {'textcompress'}->string
+# {'buildtype'}->string
+# {'orthogonalbuildtypes'}->array of strings
+# {'maxnumeric'}->string
+# {'separate_cjk'}->string
+# {'sections_index_document_metadata'}->string (always, unless_section_metadata_exists)
+# {'languagemetadata'} -> string
+# {'maintainer'}->array of strings
+# {'languages'}->array of strings
+# {'indexsubcollections'}->array of strings
+# {'indexes'}->array of strings
+# {'indexoptions'}->array of strings (stem, casefold, accentfold)
+# {'dontbuild'}->array of strings
+# {'dontgdbm'}->array of strings
+# {'mirror'}->array of strings
+# {'phind'}->array of strings
+# {'plugout'}->array of strings
+# {'levels'}->array of strings (for mgpp eg Section, Paragraph)
+# {'searchtype'}->array of strings (for mgpp, form or plain)
+
+# {'subcollection'}->hash of key-value pairs
+
+# {'acquire'}->array of arrays of strings
+# {'plugin'}->array of arrays of strings
+# {'classify'}->array of arrays of strings
+
+# {'collectionmeta'}->hash of key->hash of param-value -used 
+# for language specification
+#    for example, collectionmeta->collectionname->default->demo
+#                                               ->mi->maori demo
+
+# convenience method for reading in either collect.cfg/collectionConfig.xml
+sub read_collection_cfg {
+    my ($filename,$gs_mode) = @_;
+    
+    my $collectcfg = undef;
+
+    if ($gs_mode eq "gs2") {
+	$collectcfg = &colcfg::read_collect_cfg ($filename);
+    } elsif ($gs_mode eq "gs3") {
+	$collectcfg = &colcfg::read_collection_cfg_xml ($filename);
+    }
+    else {
+	print STDERR "Failed to read collection configuration file\n";
+	print STDERR "  Unrecognized mode: $gs_mode\n";
+    }
+
+    return $collectcfg;
+}
+
+# convenience method for writing out either collect.cfg/collectionConfig.xml
+# is this ever used??
+sub write_collection_cfg {
+     my ($filename, $collectcfg_data, $gs_mode) = @_;
+    
+    if ($gs_mode eq "gs2") {
+	&colcfg::write_collect_cfg ($filename, $collectcfg_data );
+    } elsif ($gs_mode eq "gs3") {
+	&colcfg::write_collection_cfg_xml ($filename, $collectcfg_data);
+    }
+    else {
+	print STDERR "Failed to write collection configuration file\n";
+	print STDERR "  Unrecognized mode: $gs_mode\n";
+    }
+}
+   
+# the build configuration file data is stored in the form
+#
+# {'infodbtype'}->string
+# {'builddate'}->string
+# {'buildtype'}->string
+# {'orthogonalbuildtypes'}->array of strings
+# {'metadata'}->array of strings
+# {'languages'}->array of strings
+# {'numdocs'}->string
+# {'numsections'}->string
+# {'numwords'}->string
+# {'numbytes'}->string
+# {'maxnumeric'}->string
+# {'indexfields'}->array of strings
+# {'indexfieldmap'}->array of strings in the form "field->FI"
+# {'indexmap'} -> array of strings
+# {'indexlevels'} -> array of strings
+# {'stemindexes'} -> string (int)
+# {'textlevel'}->string
+# {'levelmap'} -> array of strings in the form "level->shortname"
+
+# convenience method for reading in either build.cfg/buildConfig.xml
+sub read_building_cfg {
+    my ($filename,$gs_mode) = @_;
+    
+    my $buildcfg = undef;
+
+    if ($gs_mode eq "gs2") {
+	$buildcfg = &colcfg::read_build_cfg ($filename);
+    } elsif ($gs_mode eq "gs3") {
+	$buildcfg = &colcfg::read_build_cfg_xml ($filename);
+    }
+    else {
+	print STDERR "Failed to read building configuration file\n";
+	print STDERR "  Unrecognized mode: $gs_mode\n";
+    }
+
+    return $buildcfg;
+}
+
+# convenience method for writing out either build.cfg/buildConfig.xml
+# haven't got one, as gs3 version needs extra parameters
+#sub write_building_cfg {}
+
+##############################
+### gs2/gs3 specific methods
+###############################
+
+#####################################
+### collect.cfg/collectionConfig.xml
+#####################################
+
+# gs2 read in collect.cfg
+sub read_collect_cfg {
+    my ($filename) = @_;
+
+    return &cfgread::read_cfg_file ($filename, 
+				    q/^(infodbtype|creator|public|complexmeta|defaultindex|importdir|/ .
+					q/archivedir|cachedir|builddir|removeold|/ .
+					q/textcompress|buildtype|othogonalbuildtypes|no_text|keepold|gzip|/ .
+					q/verbosity|remove_empty_classifications|OIDtype|OIDmetadata|/ .
+					q/groupsize|maxdocs|debug|mode|saveas|/ .
+					q/sortmeta|removesuffix|removeprefix|create_images|/ .
+					q/maxnumeric|languagemetadata|/ .
+					q/no_strip_html|index|sections_index_document_metadata|/ .
+					q/store_metadata_coverage|indexname|indexlevel)$/,
+				    q/(maintainer|languages|indexsubcollections|orthogonalbuildtypes|/ .
+				       q/indexes|indexoptions|dontbuild|dontgdbm|mirror|levels|plugout|/ .
+				       q/searchtype|searchtypes)$/,
+				    q/^(subcollection|format)$/,
+				    q/^(acquire|plugin|classify)$/,
+				    q/^(collectionmeta)$/);
+}
+
+# gs2 write out collect.cfg
+sub write_collect_cfg {
+    my ($filename, $data) = @_;
+    
+    &cfgread::write_cfg_file($filename, $data,
+			     q/^(infodbtype|creator|public|complexmeta|defaultindex|importdir|/ .
+				 q/archivedir|cachedir|builddir|removeold|/ .
+				 q/textcompress|buildtype|no_text|keepold|gzip|/ .
+				 q/verbosity|remove_empty_classifications|OIDtype|OIDmetadata|/.
+				 q/groupsize|maxdocs|debug|mode|saveas|/ .
+				 q/sortmeta|removesuffix|removeprefix|create_images|/ .
+				 q/maxnumeric|languagemetadata/ .
+				 q/no_strip_html|index|sections_index_document_metadata)$/,
+			     q/^(maintainer|languages|indexsubcollections|orthogonalbuildtypes|/ .
+				 q/indexes|indexoptions|dontbuild|dontgdbm|mirror|levels|/.
+				 q/searchtype|searchtypes)$/,
+			     q/^(subcollection|format)$/,
+			     q/^(acquire|plugin|classify)$/,
+			     q/^(collectionmeta)$/);
+}
+
+# gs3 read in collectionConfig.xml
+sub read_collection_cfg_xml {
+    my ($filename) = @_;
+
+    require collConfigxml;
+    return &collConfigxml::read_cfg_file ($filename);
+}
+
+# gs3 write out collectionConfig.xml
+sub write_collection_cfg_xml {
+ 
+}
+
+#####################################
+### build.cfg/buildConfig.xml
+######################################
+
+# gs2 read build.cfg
+sub read_build_cfg {
+    my ($filename) = @_;
+
+    return &cfgread::read_cfg_file ($filename, 
+		   q/^(earliestdatestamp|infodbtype|builddate|buildtype|numdocs|numsections|numwords|numbytes|maxnumeric|textlevel|indexstem|stemindexes|separate_cjk)$/,
+		   q/^(indexmap|subcollectionmap|languagemap|orthogonalbuildtypes|notbuilt|indexfields|indexfieldmap|indexlevels|levelmap)$/);
+				    
+}
+
+# gs2 write build.cfg
+sub write_build_cfg {
+    my ($filename, $data) = @_;
+
+    &cfgread::write_cfg_file($filename, $data,
+	       q/^(earliestdatestamp|infodbtype|builddate|buildtype|numdocs|numsections|numwords|numbytes|maxnumeric|textlevel|indexstem|stemindexes|separate_cjk)$/,
+	       q/^(indexmap|subcollectionmap|languagemap|orthogonalbuildtypes|notbuilt|indexfields|indexfieldmap|indexlevels|levelmap)$/);		     
+}
+
+# gs3 read buildConfig.xml
+sub read_build_cfg_xml {
+
+    my ($filename) = @_;
+
+    require buildConfigxml;
+    return &buildConfigxml::read_cfg_file($filename);
+}
+
+# gs3 write buildConfig.xml
+sub write_build_cfg_xml {
+    my ($buildoutfile, $buildcfg, $collectcfg) = @_;
+
+    require buildConfigxml;
+    return &buildConfigxml::write_cfg_file ($buildoutfile, $buildcfg, $collectcfg);
+}
+
+
+# method to check for filename of collect.cfg, and gs mode.
+sub get_collect_cfg_name {
+    my ($out) = @_;
+
+    # First check if there's a
+    # gsdl/collect/COLLECTION/custom/COLLECTION/etc/custom.cfg file. This
+    # customization was added for DLC by Stefan, 30/6/2007.
+    my $configfilename = &util::filename_cat ($ENV{'GSDLCOLLECTDIR'}, "custom", $ENV{'GSDLCOLLECTION'}, "etc", "custom.cfg");
+
+    if (-e $configfilename) {
+        return ($configfilename, "gs2");
+    }
+
+    # Now check if there is a collect.cfg file in the usual place, i.e. it is gs2.
+    $configfilename = &util::filename_cat ($ENV{'GSDLCOLLECTDIR'}, "etc", "collect.cfg");
+    if (-e $configfilename) {
+        return ($configfilename, "gs2");
+    }
+
+    # If we get to here we check if there is a collectionConfig.xml file,
+    # i.e. it is gs3.
+    $configfilename = &util::filename_cat ($ENV{'GSDLCOLLECTDIR'}, "etc", "collectionConfig.xml");    
+    if (-e $configfilename) {
+        return ($configfilename, "gs3");
+    }
+
+    # Error. No collection configuration file.
+    (&gsprintf($out, "{common.cannot_find_cfg_file}\n", $configfilename) && die);
+}
+
+
+sub use_collection {
+   my ($site, $collection, $collectdir) = @_;
+
+   if ((defined $site) && ($site ne ""))
+   {
+       return &util::use_site_collection($site, $collection, $collectdir);
+   }
+   else
+   {
+       return &util::use_collection($collection, $collectdir);
+   }
+}
+
+
+1;
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/collConfigxml.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/collConfigxml.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/collConfigxml.pm	(revision 24799)
@@ -0,0 +1,439 @@
+###########################################################################
+#
+# collConfigxml.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# reads in configuration files of xml form
+
+package collConfigxml;
+use strict;
+no strict 'refs';
+no strict 'subs';
+
+use XMLParser;
+
+# A mapping hash to resolve name discrepancy between gs2 and gs3.
+my $nameMap = {"key" => "value",
+	       "creator" => "creator",
+	       "maintainer" => "maintainer",
+	       "public" => "public",
+	       "infodb" => "infodbtype",
+	       "defaultIndex" => "defaultindex",
+	       "defaultLevel" => "defaultlevel",
+	       "name" => "collectionname",
+	       "description" => "collectionextra",
+	       "smallicon" => "iconcollectionsmall",
+	       "icon" => "iconcollection",
+	       "level" => "levels",
+	       "classifier" => "classify",
+	       "indexSubcollection" => "indexsubcollections",
+	       "indexLanguage" => "languages",
+	       "defaultIndexLanguage" => "defaultlanguage",
+	       "index" => "indexes",
+	       "plugin" => "plugin",
+	       "plugout" => "plugout",
+	       "indexOption" => "indexoptions",
+	       "searchType" => "searchtype",
+	       "languageMetadata" => "languagemetadata",
+	       "buildType" => "buildtype",
+	       "orthogonalBuildTypes" => "orthogonalbuildtypes",
+	       "buildOption" => "buildOption"
+	       };
+# A hash structure which is returned by sub read_cfg_file.
+my $data = {};
+
+my $repeatedBlock = q/^(browse|pluginList)$/; #|buildOptionList)$/;
+
+# use those unique attribute values to locate the text within the elements
+# creator, public, maintainer and within a displayItem.
+my $currentLocation = "";
+my $stringexp = q/^(creator|maintainer|public|buildType)$/;
+my $displayItemNames = q/^(name|description)$/;
+  
+# For storing the attributes during the StartTag subroutine, so that 
+# we can use it later in Text (or EndTag) subroutines
+my $currentAttrRef = undef; 
+
+my $currentLevel = "";
+
+# Count the elements with same name within the same block
+# ("plugin", "option")
+my $currentIndex = 0;
+my $arrayexp = q/^(index|level|indexSubcollection|indexLanguage|orthogonalBuildTypes)$/;
+my $arrayarrayexp= q/^(plugin|classifier)$/; #|buildOption)$/;
+my $hashexp = q/^(subcollection)$/; # add other element names that should be represented by hash expressions here
+my $hashhashexp = q/^(displayItem)$/; # add other (collectionmeta) element names that should be represented by hashes of hashes here.
+
+my $defaults = q/^(defaultIndex|defaultLevel|defaultIndexLanguage|languageMetadata)$/;
+
+# Reads in the model collection configuration file, collectionConfig.xml,
+# into a structure which complies with the one used by gs2 (i.e. one read
+# in by &cfgread::read_cfg_file).
+sub read_cfg_file {
+    my ($filename) = @_;
+    $data = {};
+    if ($filename !~ /collectionConfig\.xml$/ || !-f $filename) {
+        return undef;
+    }
+
+    # Removed ProtocolEncoding (see MetadataXMLPlugin for details)
+
+    # create XML::Parser object for parsing metadata.xml files
+    my $parser = new XML::Parser('Style' => 'Stream',
+				 'Pkg' => 'collConfigxml',
+				 'Handlers' => {'Char' => \&Char,
+						 'Doctype' => \&Doctype
+						 });
+    if (!open (COLCFG, $filename)) {
+	print STDERR "cfgread::read_cfg_file couldn't read the cfg file $filename\n";
+    } else {
+
+      $parser->parsefile ($filename);# (COLCFG);
+      close (COLCFG);
+    }
+
+    #&Display; 
+    return $data;
+}
+
+sub StartTag {
+# Those marked with #@ will not be executed at the same time when this sub is being called
+# so that if/elsif is used to avoid unnecessary tests
+    my ($expat, $element) = @_;
+    
+    # See http://search.cpan.org/~msergeant/XML-Parser-2.36/Parser.pm#Stream
+    # %_ is a hash of all the attributes of this element, we want to store them so we can use the attributes
+    # when the textnode contents of the element are parsed in the subroutine Text (that's the handler for Text). 
+    $currentAttrRef = \%_; 
+
+    my $name = $_{'name'};
+    my $value = $_{'value'};
+    my $type = $_{'type'};
+    my $orthogonal = $_{'orthogonal'};
+
+    # for subcollections
+    my $filter = $_{'filter'};
+    
+    # was this just a flax thing??
+    my $assigned = $_{'assigned'};
+    
+    #@ Marking repeated block
+    if ($element =~ /$repeatedBlock/) {
+	$currentIndex = 0;
+    }
+
+    #@ handling block metadataList
+    elsif (defined $name and $name =~ /$stringexp/){
+      $currentLocation = $name;
+    }
+    #@ handling default search index/level/indexLanguage and languageMetadata
+    elsif ($element =~ /$defaults/) {
+      if (defined $name and $name =~ /\w/) {
+	$data->{$nameMap->{$element}} = $name;
+      }
+    }
+
+    #@ handling the displayItems name and description (known as collectionname and collectionextra in GS2)
+    elsif($element eq "displayItemList") {
+	$currentLevel = "displayItemList"; # storing the parent if it is displayItemList
+    } 
+    elsif($element =~ /$hashhashexp/) { # can expand on this to check for other collectionmeta elements
+	if((!defined $assigned) || (defined $assigned and $assigned =~ /\w/ and $assigned eq "true")) {
+	    # either when there is no "assigned" attribute, or when assigned=true (for displayItems):
+	    $currentLocation = $name;
+	}
+    }
+
+    #@ Handling database type: gdbm or gdbm-txtgz, later jdbm.
+    elsif ($element eq "infodb") {
+      $data->{'infodbtype'} = $type;
+    }
+    
+    #@ Handling indexer: mgpp/mg/lucene; stringexp
+    #@ Handling orthogonal indexers: audioDB; arrayexp
+    elsif ($element eq "search") {
+	if ((defined $orthogonal) && ($orthogonal =~ m/^(true|on|1)$/i)) {
+	    push(@{$data->{'orthogonalbuildtypes'}},$type);
+	}
+	else {
+	    $data->{'buildtype'} = $type;
+	}
+    }
+	
+    elsif ($element eq "store_metadata_coverage")
+    {
+##	print STDERR "*&*&*&*&*& HERE &*&*&*&*&*&*";
+	$data->{'store_metadata_coverage'} = $value;
+    }
+
+    #@ Handling searchtype: plain,form; arrayexp
+    #elsif ($element eq "format" and defined $name and $name =~ /searchType/) {
+	#@ Handling searchtype: plain, form
+	#$currentLocation = $name;	
+    #}
+ 
+    #@ Handle index|level|indexSubcollection|indexLanguage
+    elsif ($element =~ /$arrayexp/) {
+      my $key = $nameMap->{$element};	
+      if (!defined $data->{$key}) {
+	$data->{$key} = [];
+      }
+
+      push (@{$data->{$key}},$name);
+    }
+
+    #*****************************************
+    elsif ($element eq "buildOption") {
+        print STDERR "**** BUILD OPTION PAIR $name $value\n";
+        $data->{$name} = $value;
+    }    
+
+
+    #@ indexoptions: accentfold/casefold/stem; arrayexp
+    elsif ($element eq "indexOption") {
+      $currentLevel = "indexOption";
+    }
+    if ($currentLevel eq "indexOption" and $element eq "option") {
+      my $key = $nameMap->{$currentLevel};	
+      if (!defined $data->{$key}) {
+	$data->{$key} = [];
+      }
+      push (@{$data->{$key}},$name);
+    }
+    #@ plugout options
+    elsif ($element eq "plugout") {
+	$currentLevel = "plugout";
+	my $key = $nameMap->{$currentLevel};	
+	if (!defined $data->{$key}) {
+	    $data->{$key} = [];
+	}
+	if(defined $name and $name ne ""){
+	    push (@{$data->{$key}},$name);
+	}
+	else{
+	   push (@{$data->{$key}},"GreenstoneXMLPlugout"); 
+	}
+    }
+    if ($currentLevel eq "plugout" and $element eq "option") {     
+	my $key = $nameMap->{$currentLevel};
+	if (defined $name and $name ne ""){
+	    push (@{$data->{$key}},$name);
+	}
+	if (defined $value and $value ne  ""){
+	    push (@{$data->{$key}},$value);
+	}
+    }
+
+    #@ use hash of hash of strings: hashexp
+    elsif ($element =~ /$hashexp/) {
+      if (!defined $data->{$element}) {
+	$data->{$element} = {};
+      }
+      if (defined $name and $name =~ /\w/) {
+	if (defined $filter and $filter =~ /\w/) {
+	  $data->{$element}->{$name} = $filter;
+
+	}
+      }
+    }
+
+    #@ Handling each classifier/plugin element
+    elsif ($element =~ /$arrayarrayexp/) {
+	# find the gs2 mapping name
+        $currentLevel = $element;
+        my $key = $nameMap->{$element};	
+
+	# define an array of array of strings	foreach $k (@{$data->{$key}}) {
+	if (!defined $data->{$key}) {
+	  $data->{$key} = [];
+	}
+	# Push classifier/plugin name (e.g. AZList) into $data as the first string
+ 	push (@{$data->{$key}->[$currentIndex]},$name);
+    if (defined $value and $value =~ /\w/) {
+        push (@{$data->{$key}->[$currentIndex]}, $value);
+        print "$value\n";
+    }
+	#print $currentIndex."indexup\n";
+      }
+    
+    #@ Handling the option elements in each classifier/plugin element (as the following strings)
+    elsif ($currentLevel =~ /$arrayarrayexp/ and $element eq "option") {
+	# find the gs2 mapping name for classifier and plugin
+        my $key = $nameMap->{$currentLevel};	
+
+	if (defined $name and $name =~ /\w/) {
+	    push (@{$data->{$key}->[$currentIndex]}, $name);
+	}
+	if (defined $value and $value =~ /\w/) {
+            push (@{$data->{$key}->[$currentIndex]}, $value);
+	}
+
+    }
+    
+}
+
+sub EndTag {
+    my ($expat, $element) = @_;
+    my $endTags = q/^(browse|pluginList|displayItemList)$/; #|buildOptionList)$/;   
+    if ($element =~ /$endTags/) {
+		$currentIndex = 0;
+		$currentLevel = "";
+    }
+    # $arrayarrayexp contains classifier|plugin
+    elsif($element =~ /$arrayarrayexp/ ){
+     	$currentIndex = $currentIndex + 1;
+    }
+}
+
+sub Text {
+    if (defined $currentLocation) { 
+	#@ Handling block metadataList(creator, maintainer, public)
+	if($currentLocation =~ /$stringexp/){
+	    #print $currentLocation;
+	    my $key = $nameMap->{$currentLocation};	
+	    $data->{$key} = $_;
+	    undef $currentLocation;
+	}
+	
+	#@ Handling displayItem metadata that are children of displayItemList
+	# that means we will be getting the collection's name and possibly description ('collectionextra' in GS2).
+	elsif($currentLevel eq "displayItemList" && $currentLocation =~ /$displayItemNames/) {
+	    my $lang = $currentAttrRef->{'lang'};
+	    my $name = $currentAttrRef->{'name'};
+	    
+	    # this is how data->collectionmeta's language is set in Greenstone 2. 
+	    # Need to be consistent, since export.pl accesses these values all in the same way
+	    if(!defined $lang) {
+		$lang = 'default';
+	    } else {
+		$lang = "[l=$lang]"; 
+	    }
+	    
+	    if(defined $name and $name =~ /$displayItemNames/) { # attribute name = 'name' || 'description'
+		# using $nameMap->$name resolves to 'collectionname' if $name='name' and 'collectionextra' if $name='description'
+		$data->{'collectionmeta'}->{$nameMap->{$name}}->{$lang} = $_; # the value is the Text parsed
+		#print STDERR "***Found: $nameMap->{$name} collectionmeta, lang is $lang. Value: $data->{'collectionmeta'}->{$nameMap->{$name}}->{$lang}\n";
+	    }
+	    undef $currentLocation;
+	}
+  
+	#@ Handling searchtype: plain,form; arrayexp
+	elsif (defined $currentLocation and $currentLocation =~ /searchType/) {
+	    # map 'searchType' into 'searchtype'
+	    my $key = $nameMap->{$currentLocation};
+	    # split it by ','
+	    my ($plain, $form) = split (",", $_);
+	    
+	    if (!defined $data->{$key}) {
+		$data->{$key} = [];
+	    }
+	    if (defined $plain and $plain =~ /\w/) {
+		push @{ $data->{$key} }, $plain;
+	    }
+	    if (defined $form and $form =~ /\w/) {
+		push @{ $data->{$key} }, $form;
+	    }
+	}
+    }	
+}
+
+# This sub is for debugging purposes
+sub Display {
+    # metadataList
+    foreach my $k (keys %{$data}) {
+	print STDERR "*** metadatalist key $k\n"; 
+    }
+  
+    print STDERR "*** creator: ".$data->{'creator'}."\n" if (defined $data->{'creator'});
+    print STDERR "*** maintainer: ".$data->{"maintainer"}."\n" if (defined $data->{"maintainer"});
+    print STDERR "*** public: ".$data->{"public"}."\n" if (defined $data->{"public"});
+    print STDERR "*** default index: ".$data->{"defaultindex"}."\n" if (defined $data->{"defaultindex"});
+    print STDERR "*** default level: ".$data->{"defaultlevel"}."\n" if (defined $data->{"defaultlevel"});
+    print STDERR "*** build type: ".$data->{"buildtype"}."\n" if (defined $data->{"buildtype"});
+    print STDERR "*** orthogonal build types: ".join(",",$data->{"orthogonalbuildtypes"})."\n" if (defined $data->{"orthogonalbuildtypes"});
+    print STDERR "*** search types: \n";
+    print STDERR join(",",@{$data->{"searchtype"}})."\n" if (defined $data->{"searchtype"});
+    print STDERR "*** levels: \n";
+    print STDERR join(",",@{$data->{'levels'}})."\n" if (defined $data->{'levels'});
+    print STDERR "*** index subcollections: \n";
+    print STDERR join(",",@{$data->{'indexsubcollections'}})."\n" if (defined $data->{'indexsubcollections'});
+    print STDERR "*** indexes: \n";
+    print STDERR join(",",@{$data->{'indexes'}})."\n" if (defined $data->{'indexes'});
+    print STDERR "*** index options: \n";
+    print STDERR join(",",@{$data->{'indexoptions'}})."\n" if (defined $data->{'indexoptions'});
+    print STDERR "*** languages: \n";
+    print STDERR join(",",@{$data->{'languages'}})."\n" if (defined $data->{'languages'});
+    print STDERR "*** language metadata: \n";
+    print STDERR join(",",@{$data->{'languagemetadata'}})."\n" if (defined $data->{'languagemetadata'});
+ 
+    print STDERR "*** Plugins: \n";
+    if (defined $data->{'plugin'}) {
+	foreach $a (@{$data->{'plugin'}}) {
+	    print join(",",@$a);
+	    print "\n";
+	}
+    }
+
+    #print STDERR "*** Build options: \n";
+    #if (defined $data->{'store_metadata_coverage'}) {
+    #foreach $a (@{$data->{'store_metadata_coverage'}}) {
+    #    print join(",",@$a,@$_);
+    #    print "\n";
+    #}
+    #}
+
+    if (defined $data->{'classify'}) {
+	print STDERR "*** Classifiers: \n";
+	map { print join(",",@$_)."\n"; } @{$data->{'classify'}};
+    }
+    
+    if (defined $data->{'subcollection'}) {
+	foreach my $key (keys %{$data->{'subcollection'}}) {
+	    print "subcollection ".$key." ".$data->{'subcollection'}->{$key}."\n";
+	}
+    }
+}
+# is this actually used??
+sub Doctype {
+    my ($expat, $name, $sysid, $pubid, $internal) = @_;
+
+    die if ($name !~ /^CollectionConfig$/);
+}
+
+# This Char function overrides the one in XML::Parser::Stream to overcome a
+# problem where $expat->{Text} is treated as the return value, slowing
+# things down significantly in some cases.
+sub Char {
+    if ($]<5.008) {
+	use bytes;  # Necessary to prevent encoding issues with XML::Parser 2.31+ and Perl 5.6
+    }
+    $_[0]->{'Text'} .= $_[1];
+    return undef;
+}
+
+
+
+
+#########################################################
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/convertutil.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/convertutil.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/convertutil.pm	(revision 24799)
@@ -0,0 +1,348 @@
+###########################################################################
+#
+# convertutil.pm -- utility to help convert files using external applications
+#
+# Copyright (C) 1999 DigiLib Systems Limited, NZ
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+
+package convertutil;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+
+use File::Basename;
+
+
+sub monitor_init
+{
+    # do nothing
+    return {};
+}
+
+sub monitor_deinit
+{
+    my ($saved_rec) = @_;
+    
+    # nothing to do
+}
+
+sub monitor_init_unbuffered
+{
+    my $saved_buffer_len = $|;
+    $| = 1;
+
+    my $saved_rec = { 'saved_buffer_len' => $saved_buffer_len };
+
+    return $saved_rec;
+}
+
+sub monitor_deinit_unbuffered
+{
+    my ($saved_rec) = @_;
+
+    my $saved_buffer_len = $saved_rec->{'saved_buffer_len'};
+
+    $| = $saved_buffer_len;
+}
+
+sub monitor_line
+{
+    my ($line) = @_;
+
+    my $had_error = 0;
+    my $generate_dot = 0;
+
+    return ($had_error,$generate_dot);
+}
+
+sub monitor_line_with_dot
+{
+    my ($line) = @_;
+
+    my $had_error = 0;
+    my $generate_dot = 1;
+
+    return ($had_error,$generate_dot);
+}
+
+
+sub run_general_cmd
+{
+    my ($command,$options) = @_;
+
+
+    # $options points to a hashtable that must have fields for:
+    #  'verbosity', 'outhandle', 'message_prefix' and 'message'
+    #
+    # it can also include functions for monitoring
+    #  'monitor_init'   => takes no input arguments and returns a hashtable for saved data values
+    #  'monitor_line'   => takes $line as input argument, return tuple (had_error,generate_dot)
+    #  'monitor_deinit' => takes the saved data values as input, restores saved values
+    #
+    # Default are provided for these monitor functions if none specified
+
+
+    my $verbosity = $options->{'verbosity'};
+    my $outhandle = $options->{'outhandle'};
+
+    my $message_prefix = $options->{'message_prefix'};
+    my $message = $options->{'message'};
+	
+    my $monitor_init   = $options->{'monitor_init'};
+    my $monitor_line   = $options->{'monitor_line'};
+    my $monitor_deinit = $options->{'monitor_deinit'};
+
+    if (!defined $monitor_init) {
+	$monitor_init = "monitor_init";
+    }
+    if (!defined $monitor_line) {
+	$monitor_line = "monitor_line";
+    }
+    if (!defined $monitor_deinit) {
+	$monitor_deinit = "monitor_deinit";
+    }
+
+#   my ($cpackage,$cfilename,$cline,$csubr,$chas_args,$cwantarray) = caller(4);
+#   print STDERR "Calling method: $cfilename:$cline $cpackage->$csubr:$cline\n";
+
+    print $outhandle "$message_prefix: $command\n" if ($verbosity > 3);
+    print $outhandle "  $message ..." if ($verbosity >= 1);
+
+    my $command_status = undef;
+    my $result = "";
+    my $had_error = 0;
+
+    my $saved_rec = &$monitor_init();
+
+    if (open(CMD,"$command 2>&1 |"))
+    {
+	my $line;
+
+	my $linecount = 0;
+	my $dot_count = 0;
+
+
+	while (defined ($line = <CMD>))
+	{
+	    $linecount++;
+
+	    my ($had_local_error,$generate_dot) = &$monitor_line($line);
+	    
+	    if ($had_local_error) {
+		# set general flag, but allow loop to continue to end building up the $result line
+		print $outhandle "$line\n";
+		$had_error = 1;
+	    }
+
+	
+		if ($generate_dot)
+		{
+			if ($dot_count == 0) { print $outhandle "\n  "; }
+			print $outhandle ".";
+			$dot_count++;
+				if (($dot_count%76)==0) 
+			{
+				print $outhandle "\n  ";
+			}
+		}
+		
+	    $result .= $line;
+	    
+	}
+	print $outhandle "\n";
+
+	
+	close(CMD);
+
+	$command_status = $?;
+	if ($command_status != 0) {
+	    $had_error = 1;
+	    
+	    # for commands that go via an intermediate layer (like commands to imagemagick go 
+	    # through gs-magick.pl), need to shift exit code by 8 and then convert to its 
+	    # signed value to get the actual exit code that imagemagick had emitted.
+	    $command_status >>= 8;
+	    $command_status = (($command_status & 0x80) ? -(0x100 - ($command_status & 0xFF)) : $command_status);	
+
+	    print $outhandle "Error: processing command failed.  Exit status $command_status\n";
+
+	    if ($verbosity >= 3) {
+		print $outhandle "  Command was: $command\n";
+	    }
+	    if ($verbosity >= 4) {
+		print $outhandle "$message_prefix result: $result\n";
+	    }
+	}
+    }
+    else 
+    {
+	$had_error = 1;
+	print STDERR "Error: failed to execute $command\n";
+    }
+
+    &$monitor_deinit($saved_rec);
+
+    if ($verbosity >= 1) {
+	if ($had_error) {
+	    print $outhandle "  ...error encounterd\n";
+	}
+	else {
+	    print $outhandle "  ...done\n";
+	}
+    }
+
+    if (defined $command_status && ($command_status == 0))
+    {
+	# only want to print the following out if verbosity is high enough
+	# and we haven't already printed it out as a detected error above
+	print $outhandle "$message_prefix result: $result\n" if ($verbosity > 5);
+    }
+
+    return ($result,$had_error);
+}
+
+
+sub regenerate_general_cmd
+{
+    my ($command,$ifilename,$ofilename,$options) = @_;
+
+    my $regenerated = 1;
+    my $result = "";
+    my $had_error = 0;
+
+    ($result,$had_error) = run_general_cmd($command,$options);
+
+    # store command args so can be compared with subsequent runs of the command
+    my $args_filename = "$ofilename.args";
+
+    if (open(ARGSOUT,">$args_filename")) {
+	print ARGSOUT $command;
+	print ARGSOUT "\n";
+	close(ARGSOUT);
+    }
+    else {
+	my $outhandle = $options->{'outhandle'};
+	print $outhandle "Warning: Unable to write out caching information to file $args_filename\n";
+	print $outhandle "         This means $ofilename will be regenerated on next build whether\n";
+	print $outhandle "         processing args have changed or not.\n";
+    }
+
+    # Store the result, since ImageConverter.pm extracts the image height and width from the processed result
+    my $result_filename = "$ofilename.result";
+    if (open(RESOUT, ">$result_filename"))
+    {
+	print RESOUT $result;
+	close(RESOUT);
+    }
+    else
+    {
+	my $outhandle = $options->{'outhandle'};
+	print $outhandle "Warning: Unable to write out cached process result to file $result_filename.\n";
+    }
+
+    return ($regenerated,$result,$had_error);
+}
+
+
+
+sub run_cached_general_cmd
+{
+    my ($command,$ifilename,$ofilename,$options) = @_;
+
+    my $outhandle = $options->{'outhandle'};
+    my $verbosity = $options->{'verbosity'};
+    my $message_prefix = $options->{'message_prefix'};
+
+    my $regenerated = 0;
+    my $result = "";
+    my $had_error = 0;
+
+    my $args_filename = "$ofilename.args";
+
+    if ((!-e $ofilename) || (!-e $args_filename)) {
+	($regenerated,$result,$had_error) 
+	    = regenerate_general_cmd($command,$ifilename,$ofilename,$options);
+    }
+    elsif (-M $ifilename < -M $args_filename) {
+	# Source files has been updated/changed in some way
+	# => regenerate
+	print $outhandle "$ifilename modified more recently than cached version\n";
+
+	($regenerated,$result,$had_error) 
+	    = regenerate_general_cmd($command,$ifilename,$ofilename,$options);
+    }
+    else {
+	# file exists => check to see if command to generate it has changed
+
+	if (open (ARGSIN,"<$args_filename")) {
+	    my $prev_command = <ARGSIN>;
+	    chomp($prev_command);
+
+	    close(ARGSIN);
+
+	    if (defined $prev_command) {
+		# if commands are different
+		if ($prev_command ne $command) {
+		    # need to rerun command
+		    ($regenerated,$result,$had_error) 
+			= regenerate_general_cmd($command,$ifilename,$ofilename,$options);
+		}
+		else {
+		    my ($ofile) = ($ofilename =~ m/^.*(cached.*)$/);
+
+		    my $ofile_no_dir = basename($ofile);
+		    print $outhandle "  $message_prefix: Cached file $ofile_no_dir already exists.\n";
+		    print $outhandle "  $message_prefix: No need to regenerate $ofile\n" if ($verbosity > 2);
+           
+		    if ((defined $options->{'cache_mode'}) 
+			&& $options->{'cache_mode'} eq "without_result") {
+			$result = "";			
+		    }
+		    else {
+			# Read in the cached result lines and join them into a single string
+			my $result_filename = "$ofilename.result";
+			if (open(RESIN, "<$result_filename"))
+			{
+			    my @result_lines = <RESIN>;
+			    $result = join("\n", @result_lines);
+			    close(RESIN);
+			}
+			else
+			{
+			    print $outhandle "  $message_prefix: Error, failed to obtain cached result from $result_filename.\n";
+			}
+		    }
+		}
+		    
+	    }
+	}
+	else {
+	    print $outhandle "  $message_prefix: No cached previous args found.  Regenerating $ofilename\n";
+
+	    ($regenerated,$result,$had_error) 
+		= regenerate_general_cmd($command,$ifilename,$ofilename,$options);
+	}
+    }
+
+    return ($regenerated,$result,$had_error);
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/CGI/Ajax.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/CGI/Ajax.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/CGI/Ajax.pm	(revision 24799)
@@ -0,0 +1,1377 @@
+package CGI::Ajax;
+use strict;
+use Data::Dumper;
+use base qw(Class::Accessor);
+use overload '""' => 'show_javascript';    # for building web pages, so
+                                           # you can just say: print $pjx
+
+BEGIN {
+    use vars qw ($VERSION @ISA @METHODS);
+    @METHODS = qw(url_list coderef_list CACHE DEBUG JSDEBUG html
+      js_encode_function cgi_header_extra skip_header fname);
+
+    CGI::Ajax->mk_accessors(@METHODS);
+
+    $VERSION = .707;
+}
+
+########################################### main pod documentation begin ##
+
+=head1 NAME
+
+CGI::Ajax - a perl-specific system for writing Asynchronous web
+applications
+
+=head1 SYNOPSIS
+
+  use strict;
+  use CGI;      # or any other CGI:: form handler/decoder
+  use CGI::Ajax;
+
+  my $cgi = new CGI;
+  my $pjx = new CGI::Ajax( 'exported_func' => \&perl_func );
+  print $pjx->build_html( $cgi, \&Show_HTML);
+
+  sub perl_func {
+    my $input = shift;
+    # do something with $input
+    my $output = $input . " was the input!";
+    return( $output );
+  }
+
+  sub Show_HTML {
+    my $html = <<EOHTML;
+    <HTML>
+    <BODY>
+      Enter something: 
+        <input type="text" name="val1" id="val1"
+         onkeyup="exported_func( ['val1'], ['resultdiv'] );">
+      <br>
+      <div id="resultdiv"></div>
+    </BODY>
+    </HTML>
+  EOHTML
+    return $html;
+  }
+
+When you use CGI::Ajax within Applications that send their own header information,
+you can skip the header:
+
+  my $pjx = new CGI::Ajax(
+    'exported_func' => \&perl_func,
+    'skip_header'   => 1,
+  );
+  $pjx->skip_header(1);
+  
+  print $pjx->build_html( $cgi, \&Show_HTML);
+
+I<There are several fully-functional examples in the 'scripts/'
+directory of the distribution.>
+
+=head1 DESCRIPTION
+
+CGI::Ajax is an object-oriented module that provides a unique
+mechanism for using perl code asynchronously from javascript-
+enhanced HTML pages.  CGI::Ajax unburdens the user from having to
+write extensive javascript, except for associating an exported
+method with a document-defined event (such as onClick, onKeyUp,
+etc).  CGI::Ajax also mixes well with HTML containing more complex
+javascript.
+
+CGI::Ajax supports methods that return single results or multiple
+results to the web page, and supports returning values to multiple
+DIV elements on the HTML page.
+
+Using CGI::Ajax, the URL for the HTTP GET/POST request is
+automatically generated based on HTML layout and events, and the
+page is then dynamically updated with the output from the perl
+function.  Additionally, CGI::Ajax supports mapping URL's to a
+CGI::Ajax function name, so you can separate your code processing
+over multiple scripts.
+
+Other than using the Class::Accessor module to generate CGI::Ajax'
+accessor methods, CGI::Ajax is completely self-contained - it
+does not require you to install a larger package or a full Content
+Management System, etc.
+
+We have added I<support> for other CGI handler/decoder modules,
+like L<CGI::Simple> or L<CGI::Minimal>, but we can't test these
+since we run mod_perl2 only here.  CGI::Ajax checks to see if a
+header() method is available to the CGI object, and then uses it.
+If method() isn't available, it creates it's own minimal header.
+
+A primary goal of CGI::Ajax is to keep the module streamlined and
+maximally flexible.  We are trying to keep the generated javascript
+code to a minimum, but still provide users with a variety of
+methods for deploying CGI::Ajax. And VERY little user javascript.
+
+=head1 EXAMPLES
+
+The CGI::Ajax module allows a Perl subroutine to be called
+asynchronously, when triggered from a javascript event on the
+HTML page.  To do this, the subroutine must be I<registered>,
+usually done during:
+
+  my $pjx = new CGI::Ajax( 'JSFUNC' => \&PERLFUNC );
+
+This maps a perl subroutine (PERLFUNC) to an automatically
+generated Javascript function (JSFUNC).  Next you setup a trigger this
+function when an event occurs (e.g. "onClick"):
+
+  onClick="JSFUNC(['source1','source2'], ['dest1','dest2']);"
+
+where 'source1', 'dest1', 'source2', 'dest2' are the DIV ids of
+HTML elements in your page...
+
+  <input type=text id=source1>
+  <input type=text id=source2>
+  <div id=dest1></div>
+  <div id=dest2></div>
+
+L<CGI::Ajax> sends the values from source1 and source2 to your
+Perl subroutine and returns the results to dest1 and dest2.
+
+=head2 4 Usage Methods
+
+=over 4
+
+=item 1 Standard CGI::Ajax example
+
+Start by defining a perl subroutine that you want available from
+javascript.  In this case we'll define a subrouting that determines
+whether or not an input is odd, even, or not a number (NaN):
+
+  use strict;
+  use CGI::Ajax;
+  use CGI;
+
+
+  sub evenodd_func {
+    my $input = shift;
+
+    # see if input is defined
+    if ( not defined $input ) {
+      return("input not defined or NaN");
+    }
+
+    # see if value is a number (*thanks Randall!*)
+    if ( $input !~ /\A\d+\z/ ) {
+      return("input is NaN");
+    }
+
+    # got a number, so mod by 2
+    $input % 2 == 0 ? return("EVEN") : return("ODD");
+  }
+
+Alternatively, we could have used coderefs to associate an
+exported name...
+
+  my $evenodd_func = sub {
+    # exactly the same as in the above subroutine
+  };
+
+Next we define a function to generate the web page - this can
+be done many different ways, and can also be defined as an
+anonymous sub.  The only requirement is that the sub send back
+the html of the page.  You can do this via a string containing the
+html, or from a coderef that returns the html, or from a function
+(as shown here)...
+
+  sub Show_HTML {
+    my $html = <<EOT;
+  <HTML>
+  <HEAD><title>CGI::Ajax Example</title>
+  </HEAD>
+  <BODY>
+    Enter a number:&nbsp;
+    <input type="text" name="somename" id="val1" size="6"
+       OnKeyUp="evenodd( ['val1'], ['resultdiv'] );">
+    <br>
+    <hr>
+    <div id="resultdiv">
+    </div>
+  </BODY>
+  </HTML>
+EOT
+    return $html;
+  }
+
+The exported Perl subrouting is triggered using the C<OnKeyUp>
+event handler of the input HTML element.  The subroutine takes one
+value from the form, the input element B<'val1'>, and returns the
+the result to an HTML div element with an id of B<'resultdiv'>.
+Sending in the input id in an array format is required to support
+multiple inputs, and similarly, to output multiple the results,
+you can use an array for the output divs, but this isn't mandatory -
+as will be explained in the B<Advanced> usage.
+
+Now create a CGI object and a CGI::Ajax object, associating a reference
+to our subroutine with the name we want available to javascript.
+
+  my $cgi = new CGI();
+  my $pjx = new CGI::Ajax( 'evenodd' => \&evenodd_func );
+
+And if we used a coderef, it would look like this...
+
+  my $pjx = new CGI::Ajax( 'evenodd' => $evenodd_func );
+
+Now we're ready to print the output page; we send in the cgi
+object and the HTML-generating function.
+
+  print $pjx->build_html($cgi,\&Show_HTML);
+
+CGI::Ajax has support for passing in extra HTML header information
+to the CGI object.  This can be accomplished by adding a third
+argument to the build_html() call.  The argument needs to be a
+hashref containing Key=>value pairs that CGI objects understand:
+
+  print $pjx->build_html($cgi,\&Show_HTML,
+    {-charset=>'UTF-8, -expires=>'-1d'});
+
+See L<CGI> for more header() method options.  (CGI.pm, not the 
+Perl6 CGI)
+
+That's it for the CGI::Ajax standard method.  Let's look at
+something more advanced.
+
+=item 2 Advanced CGI::Ajax example
+
+Let's say we wanted to have a perl subroutine process multiple
+values from the HTML page, and similarly return multiple values
+back to distinct divs on the page.  This is easy to do, and
+requires no changes to the perl code - you just create it as you
+would any perl subroutine that works with multiple input values
+and returns multiple values.  The significant change happens in
+the event handler javascript in the HTML...
+
+  onClick="exported_func(['input1','input2'],['result1','result2']);"
+
+Here we associate our javascript function ("exported_func") with
+two HTML element ids ('input1','input2'), and also send in two
+HTML element ids to place the results in ('result1','result2').
+
+=item 3 Sending Perl Subroutine Output to a Javascript function
+
+Occassionally, you might want to have a custom javascript function
+process the returned information from your Perl subroutine.
+This is possible, and the only requierment is that you change
+your event handler code...
+
+  onClick="exported_func(['input1'],[js_process_func]);"
+
+In this scenario, C<js_process_func> is a javascript function you
+write to take the returned value from your Perl subroutine and
+process the results.  I<Note that a javascript function is not
+quoted -- if it were, then CGI::Ajax would look for a HTML element
+with that id.>  Beware that with this usage, B<you are responsible
+for distributing the results to the appropriate place on the
+HTML page>.  If the exported Perl subroutine returns, e.g. 2
+values, then C<js_process_func> would need to process the input
+by working through an array, or using the javascript Function
+C<arguments> object.
+
+  function js_process_func() {
+    var input1 = arguments[0]
+    var input2 = arguments[1];
+    // do something and return results, or set HTML divs using
+    // innerHTML
+    document.getElementById('outputdiv').innerHTML = input1;
+  }
+
+=item 4 URL/Outside Script CGI::Ajax example
+
+There are times when you may want a different script to
+return content to your page.  This could be because you have
+an existing script already written to perform a particular
+task, or you want to distribute a part of your application to another
+script.  This can be accomplished in L<CGI::Ajax> by using a URL in
+place of a locally-defined Perl subroutine.  In this usage,
+you alter you creation of the L<CGI::Ajax> object to link an
+exported javascript function name to a local URL instead of
+a coderef or a subroutine.
+
+  my $url = 'scripts/other_script.pl';
+  my $pjx = new CGI::Ajax( 'external' => $url );
+
+This will work as before in terms of how it is called from you
+event handler:
+
+  onClick="external(['input1','input2'],['resultdiv']);"
+
+The other_script.pl will get the values via a CGI object and
+accessing the 'args' key.  The values of the B<'args'> key will
+be an array of everything that was sent into the script.
+
+  my @input = $cgi->params('args');
+  $input[0]; # contains first argument
+  $input[1]; # contains second argument, etc...
+
+This is good, but what if you need to send in arguments to the
+other script which are directly from the calling Perl script,
+i.e. you want a calling Perl script's variable to be sent, not
+the value from an HTML element on the page?  This is possible
+using the following syntax:
+
+  onClick="exported_func(['args__$input1','args__$input2'],
+                         ['resultdiv']);"
+
+Similary, if the external script required a constant as input
+(e.g.  C<script.pl?args=42>, you would use this syntax:
+
+  onClick="exported_func(['args__42'],['resultdiv']);"
+
+In both of the above examples, the result from the external
+script would get placed into the I<resultdiv> element on our
+(the calling script's) page.
+
+If you are sending more than one argument from an external perl
+script back to a javascript function, you will need to split the
+string (AJAX applications communicate in strings only) on something.
+Internally, we use '__pjx__', and this string is checked for.  If
+found, L<CGI::Ajax> will automatically split it.  However, if you
+don't want to use '__pjx__', you can do it yourself:
+
+For example, from your Perl script, you would...
+
+	return("A|B"); # join with "|"
+
+and then in the javascript function you would have something like...
+
+	process_func() {
+		var arr = arguments[0].split("|");
+		// arr[0] eq 'A'
+		// arr[1] eq 'B'
+	}
+
+In order to rename parameters, in case the outside script needs
+specifically-named parameters and not CGI::Ajax' I<'args'> default
+parameter name, change your event handler associated with an HTML
+event like this
+
+  onClick="exported_func(['myname__$input1','myparam__$input2'],
+                         ['resultdiv']);"
+
+The URL generated would look like this...
+
+C<script.pl?myname=input1&myparam=input2>
+
+You would then retrieve the input in the outside script with this...
+
+  my $p1 = $cgi->params('myname');
+  my $p1 = $cgi->params('myparam');
+
+Finally, what if we need to get a value from our HTML page and we
+want to send that value to an outside script but the outside script
+requires a named parameter different from I<'args'>?  You can
+accomplish this with L<CGI::Ajax> using the getVal() javascript
+method (which returns an array, thus the C<getVal()[0]> notation):
+
+  onClick="exported_func(['myparam__' + getVal('div_id')[0]],
+                         ['resultdiv']);"
+
+This will get the value of our HTML element with and
+I<id> of I<div_id>, and submit it to the url attached to
+I<myparam__>.  So if our exported handler referred to a URI
+called I<script/scr.pl>, and the element on our HTML page called
+I<div_id> contained the number '42', then the URL would look
+like this C<script/scr.pl?myparam=42>.  The result from this
+outside URL would get placed back into our HTML page in the
+element I<resultdiv>.  See the example script that comes with
+the distribution called I<pjx_url.pl> and its associated outside
+script I<convert_degrees.pl> for a working example.
+
+B<N.B.> These examples show the use of outside scripts which
+are other perl scripts - I<but you are not limited to Perl>!
+The outside script could just as easily have been PHP or any other
+CGI script, as long as the return from the other script is just
+the result, and not addition HTML code (like FORM elements, etc).
+
+=back
+
+=head2 GET versus POST
+
+Note that all the examples so far have used the following syntax:
+
+  onClick="exported_func(['input1'],['result1']);"
+
+There is an optional third argument to a L<CGI::Ajax> exported
+function that allows change the submit method.  The above event could
+also have been coded like this...
+
+  onClick="exported_func(['input1'],['result1'], 'GET');"
+
+By default, L<CGI::Ajax> sends a I<'GET'> request.  If you need it,
+for example your URL is getting way too long, you can easily switch
+to a I<'POST'> request with this syntax...
+
+  onClick="exported_func(['input1'],['result1'], 'POST');"
+
+I<('POST' and 'post' are supported)>
+
+=head2 Page Caching
+
+We have implemented a method to prevent page cacheing from undermining
+the AJAX methods in a page.  If you send in an input argument to a
+L<CGI::Ajax>-exported function called 'NO_CACHE', the a special
+parameter will get attached to the end or your url with a random
+number in it.  This will prevent a browser from caching your request.
+
+  onClick="exported_func(['input1','NO_CACHE'],['result1']);"
+
+The extra param is called pjxrand, and won't interfere with the order
+of processing for the rest of your parameters.
+
+Also see the CACHE() method of changing the default cache behavior.
+
+=head1 METHODS
+
+=cut
+
+################################### main pod documentation end ##
+
+######################################################
+## METHODS - public                                 ##
+######################################################
+
+=over 4
+
+=item build_html()
+
+    Purpose: Associates a cgi obj ($cgi) with pjx object, inserts
+             javascript into <HEAD></HEAD> element and constructs
+             the page, or part of the page.  AJAX applications
+             are designed to update only the section of the
+             page that needs it - the whole page doesn't have
+             to be redrawn.  L<CGI::Ajax> applications use the
+             build_html() method to take care of this: if the CGI
+             parameter C<fname> exists, then the return from the
+             L<CGI::Ajax>-exported function is sent to the page.
+             Otherwise, the entire page is sent, since without
+             an C<fname> param, this has to be the first time
+             the page is being built.
+
+  Arguments: The CGI object, and either a coderef, or a string
+             containing html.  Optionally, you can send in a third
+             parameter containing information that will get passed
+             directly to the CGI object header() call.
+    Returns: html or updated html (including the header)
+  Called By: originating cgi script
+
+=cut
+
+sub geturl {
+    my ($self) = @_;
+    my $v;
+    $v = $self->cgi()->url() if $self->cgi()->isa('CGI');
+    $v = $self->cgi()->query()->url()
+      if !defined $v
+      and $self->cgi()->isa('CGI::Application');
+    return $v;
+}
+
+sub remoteaddr {
+    my ($self) = @_;
+    my $v;
+    $v = $self->cgi()->remote_addr() if $self->cgi()->isa('CGI');
+    $v = $self->cgi()->query()->remote_addr()
+      if !defined $v
+      and $self->cgi()->isa('CGI::Application');
+    return $v;
+}
+
+sub getparam {
+    my ( $self, $name ) = @_;
+    my $cgi = $self->cgi();
+    my @v   = $cgi->param($name);
+    if ( @v == 1 and !defined $v[0] ) {
+        my $query = $cgi->isa('CGI::Application');
+        @v = $cgi->query()->param($name) if defined $query;
+    }
+    if (wantarray) {
+        return @v;
+    }
+    return $v[0];
+}
+
+sub getHeader {
+    my ( $self, @extra ) = @_;
+    my $cgi = $self->cgi();
+    return '' if $self->skip_header;
+
+    #    return '' if  $cgi->isa('CGI') || $cgi->isa('CGI::Application') ;
+    return '' if $cgi->isa('CGI::Application');    # from Ajax::Application
+    return $cgi->header(@extra);
+}
+
+sub build_html {
+    my ( $self, $cgi, $html_source, $cgi_header_extra ) = @_;
+    $self->{canQuery} = defined $cgi->isa('CGI::Application');    # pmg
+    if ( ref($cgi) =~ /CGI.*/ or $self->{canQuery} ) { # pmg
+        if ( $self->DEBUG() ) {
+            print STDERR "CGI::Ajax->build_html: CGI* object was received\n";
+        }
+        $self->cgi($cgi);    # associate the cgi obj with the CGI::Ajax object
+    }
+
+    if ( defined $cgi_header_extra ) {
+        if ( $self->DEBUG() ) {
+            print STDERR "CGI::Ajax->build_html: got extra cgi header info\n";
+            if ( ref($cgi_header_extra) eq "HASH" ) {
+                foreach my $k ( keys %$cgi_header_extra ) {
+                    print STDERR "\t$k => ", $cgi_header_extra->{$k}, "\n";
+                }
+            }
+            else {
+                print STDERR "\t$cgi_header_extra\n";
+            }
+        }
+        $self->cgi_header_extra($cgi_header_extra);
+    }
+
+    #check if "fname" was defined in the CGI object
+    my $fnameParam = $self->getparam($self->fname());
+
+    if ( defined $fnameParam ) {    #pmg
+            # it was, so just return the html from the handled request
+        return ( $self->handle_request() );
+    }
+    else {
+
+        # start with the minimum, a http header line and any extra cgi
+        # header params sent in
+        my $html = $self->getHeader( $self->cgi_header_extra() );
+        if ( !defined $html and $self->skip_header == 0 ) {
+
+            # don't have an object with a "header()" method, so just create
+            # a mimimal one
+            $html .= "Content-Type: text/html;";
+            $html .= $self->cgi_header_extra();
+            $html .= "\n\n";
+        }
+
+        # check if the user sent in a coderef for generating the html,
+        # or the actual html
+        if ( ref($html_source) eq "CODE" ) {
+            if ( $self->DEBUG() ) {
+                print STDERR
+                  "CGI::Ajax->build_html: html_source is a CODEREF\n";
+            }
+            eval { $html .= &$html_source };
+            if ($@) {
+
+                # there was a problem evaluating the html-generating function
+                # that was sent in, so generate an error page
+                $html = $self->getHeader( $self->cgi_header_extra() );
+                if ( !defined $html and $self->skip_header == 0 ) {
+
+                 # don't have an object with a "header()" method, so just create
+                 # a mimimal one
+                    $html = "Content-Type: text/html;";
+                    $html .= $self->cgi_header_extra();
+                    $html .= "\n\n";
+                }
+                $html .=
+qq!<html><head><title></title></head><body><h2>Problems</h2> with
+          the html-generating function sent to CGI::Ajax
+          object</body></html>!;
+                return $html;
+            }
+            $self->html($html);    # no problems, so set html
+        }
+        else {
+
+            # user must have sent in raw html, so add it
+            if ( $self->DEBUG() ) {
+                print STDERR "CGI::Ajax->build_html: html_source is HTML\n";
+            }
+            $self->html( $html . $html_source );
+        }
+
+        # now modify the html to insert the javascript
+        $self->insert_js_in_head();
+    }
+    return $self->html();
+}
+
+=item show_javascript()
+
+    Purpose: builds the text of all the javascript that needs to be
+             inserted into the calling scripts html <head> section
+  Arguments:
+    Returns: javascript text
+  Called By: originating web script
+       Note: This method is also overridden so when you just print
+             a CGI::Ajax object it will output all the javascript needed
+             for the web page.
+
+=cut
+
+sub show_javascript {
+    my ($self) = @_;
+    my $rv = $self->show_common_js();    # show the common js
+
+    # build the js for each perl function you want exported to js
+    foreach
+      my $func ( keys %{ $self->coderef_list() }, keys %{ $self->url_list() } )
+    {
+        $rv .= $self->make_function($func);
+    }
+
+    # wrap up the return in a CDATA structure for XML compatibility
+    # (thanks Thos Davis)
+    $rv = "\n" . '//<![CDATA[' . "\n" . $rv . "\n" . '//]]>' . "\n";
+    $rv = '<script type="text/javascript">' . $rv . '</script>';
+    return $rv;
+}
+
+## new
+sub new {
+    my ($class) = shift;
+    my $self = bless( {}, ref($class) || $class );
+
+    #  $self->SUPER::new();
+    $self->fname("fname");# default parameter for exported function name
+    $self->JSDEBUG(0);    # turn javascript debugging off (if on,
+                          # extra info will be added to the web page output
+                          # if set to 1, then the core js will get
+                          # compressed, but the user-defined functions will
+                          # not be compressed.  If set to 2 (or anything
+                          # greater than 1 or 0), then none of the
+                          # javascript will get compressed.
+                          #
+    $self->DEBUG(0);      # turn debugging off (if on, check web logs)
+    $self->CACHE(1);      # default behavior is to allow cache of content
+                          # which can be explicitly switched off by passing
+                          # NO_CACHE in the arg list
+
+    #accessorized attributes
+    $self->coderef_list( {} );
+    $self->url_list(     {} );
+
+    #$self->html("");
+    #$self->cgi();
+    #$self->cgi_header_extra(""); # set cgi_header_extra to an empty string
+
+    # setup a default endcoding; if you need support for international
+    # charsets, use 'escape' instead of encodeURIComponent.  Due to the
+    # number of browser problems users report about scripts with a default of
+    # encodeURIComponent, we are setting the default to 'escape'
+    $self->js_encode_function('escape');
+
+    if ( @_ < 2 ) {
+        die "incorrect usage: must have fn=>code pairs in new\n";
+        
+    }
+
+    while (@_) {
+        my ( $function_name, $code ) = splice( @_, 0, 2 );
+
+        if( $function_name eq 'skip_header' ){
+            $self->skip_header( $code );
+            next;
+        }
+
+        if ( ref($code) eq "CODE" ) {
+            if ( $self->DEBUG() ) {
+                print STDERR "name = $function_name, code = $code\n";
+            }
+
+            # add the name/code to hash
+            $self->coderef_list()->{$function_name} = $code;
+        }
+        elsif ( ref($code) ) {
+            die "Unsuported code block/url\n";
+        }
+        else {
+            if ( $self->DEBUG() ) {
+                print STDERR "Setting function $function_name to url $code\n";
+            }
+
+            # if it's a url, it is added here
+            $self->url_list()->{$function_name} = $code;
+        }
+    }
+    return ($self);
+}
+
+######################################################
+## METHODS - private                                ##
+######################################################
+
+# sub cgiobj(), cgi()
+#
+#    Purpose: accessor method to associate a CGI object with our
+#             CGI::Ajax object
+#  Arguments: a CGI object
+#    Returns: CGI::Ajax objects cgi object
+#  Called By: originating cgi script, or build_html()
+#
+sub cgiobj {
+    my $self = shift;
+
+    # see if any values were sent in...
+    if (@_) {
+        my $cgi = shift;
+
+       # add support for other CGI::* modules This requires that your web server
+       # be configured properly.  I can't test anything but a mod_perl2
+       # setup, so this prevents me from testing CGI::Lite,CGI::Simple, etc.
+        if ( ref($cgi) =~ /CGI.*/
+            or ( $cgi->isa('CGI::Application') && $cgi->query =~ /CGI/ ) )
+        {    #pmg
+            if ( $self->DEBUG() ) {
+                print STDERR "cgiobj() received a CGI-like object ($cgi)\n";
+            }
+            $self->{'cgi'} = $cgi;
+        }
+        else {
+            die
+"CGI::Ajax -- Can't set internal CGI object to a non-CGI object ($cgi)\n";
+        }
+    }
+
+    # return the object
+    return ( $self->{'cgi'} );
+}
+
+sub cgi {
+    my $self = shift;
+    if (@_) {
+        return ( $self->cgiobj(@_) );
+    }
+    else {
+        return ( $self->cgiobj() );
+    }
+}
+
+## # sub cgi_header_extra
+## #
+## #    Purpose: accessor method to associate CGI header information
+## #             with the CGI::Ajax object
+## #  Arguments: a hashref with key=>value pairs that get handed off to
+## #             the CGI object's header() method
+## #    Returns: hashref of extra cgi header params
+## #  Called By: originating cgi script, or build_html()
+##
+## sub cgi_header_extra {
+##   my $self = shift;
+##   if ( @_ ) {
+##     $self->{'cgi_header_extra'} = shift;
+##   }
+##   return( $self->{'cgi_header_extra'} );
+## }
+
+# sub create_js_setRequestHeader
+#
+#    Purpose: create text of the header for the javascript side,
+#             xmlhttprequest call
+#  Arguments: none
+#    Returns: text of header to pass to xmlhttpreq call so it will
+#             match whatever was setup for the main web-page
+#  Called By: originating cgi script, or build_html()
+#
+
+sub create_js_setRequestHeader {
+    my $self             = shift;
+    my $cgi_header_extra = $self->cgi_header_extra();
+    my $js_header_string = q{r.setRequestHeader("};
+
+    #$js_header_string .= $self->cgi()->header( $cgi_header_extra );
+    $js_header_string .= $self->getHeader;
+    $js_header_string .= q{");};
+
+    #if ( ref $cgi_header_extra eq "HASH" ) {
+    #	foreach my $k ( keys(%$cgi_header_extra) ) {
+    #		$js_header_string .= $self->cgi()->header($cgi_headers)
+    #	}
+    #} else {
+    #print STDERR  $self->cgi()->header($cgi_headers) ;
+
+    if ( $self->DEBUG() ) {
+        print STDERR "js_header_string is (", $js_header_string, ")\n";
+    }
+
+    return ($js_header_string);
+}
+
+# sub show_common_js()
+#
+#    Purpose: create text of the javascript needed to interface with
+#             the perl functions
+#  Arguments: none
+#    Returns: text of common javascript subroutine, 'do_http_request'
+#  Called By: originating cgi script, or build_html()
+#
+
+sub show_common_js {
+    my $self     = shift;
+    my $fname    = $self->fname();
+    my $encodefn = $self->js_encode_function();
+    my $decodefn = $encodefn;
+    $decodefn =~ s/^(en)/de/;
+    $decodefn =~ s/^(esc)/unesc/;
+
+    #my $request_header_str = $self->create_js_setRequestHeader();
+    my $request_header_str = "";
+    my $rv                 = <<EOT;
+var ajax = [];
+var cache;
+
+function pjx(args,fname,method) {
+  this.target=args[1];
+  this.args=args[0];
+  method=(method)?method:'GET';
+  if(method=='post'){method='POST';}
+  this.method = method;
+  this.r=ghr();
+  this.url = this.getURL(fname);
+}
+
+function formDump(){
+  var all = [];
+  var fL = document.forms.length;
+  for(var f = 0;f<fL;f++){
+    var els = document.forms[f].elements;
+    for(var e in els){
+      var tmp = (els[e].id != undefined)? els[e].id : els[e].name;
+      if(typeof tmp != 'string'){continue;}
+      if(tmp){ all[all.length]=tmp}
+    }
+  }
+  return all;
+}
+function getVal(id) {
+  if (id.constructor == Function ) { return id(); }
+  if (typeof(id)!= 'string') { return id; }
+
+  var element = document.getElementById(id);
+  if( !element ) {
+    for( var i=0; i<document.forms.length; i++ ){
+      element = document.forms[i].elements[id];
+      if( element ) break;
+    }
+    if( element && !element.type ) element = element[0];
+  }
+  if(!element){
+    alert('ERROR: Cant find HTML element with id or name: ' +
+    id+'. Check that an element with name or id='+id+' exists');
+    return 0;
+  }
+
+  if(element.type == 'select-one') {
+    if(element.selectedIndex == -1) return;
+    var item = element[element.selectedIndex];
+    return  item.value || item.text;
+  }
+  if(element.type == 'select-multiple') {
+    var ans = [];
+    var k =0;
+    for (var i=0;i<element.length;i++) {
+      if (element[i].selected || element[i].checked ) {
+        ans[k++]= element[i].value || element[i].text;
+      }
+    }
+    return ans;
+  }
+  if(element.type == 'radio' || element.type == 'checkbox'){
+    var ans =[];
+    var elms = document.getElementsByTagName('input');
+    var endk = elms.length ;
+    var i =0;
+    for(var k=0;k<endk;k++){
+      if(elms[k].type== element.type && elms[k].checked && (elms[k].id==id||elms[k].name==id)){
+        ans[i++]=elms[k].value;
+      }
+    }
+    return ans;
+  }
+  if( element.value == undefined ){
+    return element.innerHTML;
+  }else{
+    return element.value;
+  }
+}
+function fnsplit(arg) {
+  var url="";
+  if(arg=='NO_CACHE'){cache = 0; return "";};
+  if((typeof(arg)).toLowerCase() == 'object'){
+      for(var k in arg){
+         url += '&' + k + '=' + arg[k];
+      }
+  }else if (arg.indexOf('__') != -1) {
+    arga = arg.split(/__/);
+    url += '&' + arga[0] +'='+ $encodefn(arga[1]);
+  } else {
+    var res = getVal(arg) || '';
+    if(res.constructor != Array){ res = [res] }
+    else if( res.length == 0 ) { res = [ '' ] }
+    for(var i=0;i<res.length;i++) {
+      url += '&args=' + $encodefn(res[i]) + '&' + arg + '=' + $encodefn(res[i]);
+    }
+  }
+  return url;
+}
+
+pjx.prototype =  {
+  send2perl : function(){
+    var r = this.r;
+    var dt = this.target;
+    if (dt==undefined) { return true; }
+    this.pjxInitialized(dt);
+    var url=this.url;
+    var postdata;
+    if(this.method=="POST"){
+      var idx=url.indexOf('?');
+      postdata = url.substr(idx+1);
+      url = url.substr(0,idx);
+    }
+    r.open(this.method,url,true);
+    $request_header_str;
+    if(this.method=="POST"){
+      r.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
+      r.send(postdata);
+    }
+    if(this.method=="GET"){
+      r.send(null);
+    }
+    r.onreadystatechange = handleReturn;
+ },
+ pjxInitialized : function(){},
+ pjxCompleted : function(){},
+ readyState4 : function(){
+    var rsp = $decodefn(this.r.responseText);  /* the response from perl */
+    var splitval = '__pjx__';  /* to split text */
+    /* fix IE problems with undef values in an Array getting squashed*/
+    rsp = rsp.replace(splitval+splitval+'g',splitval+" "+splitval);
+    var data = rsp.split(splitval);  
+    dt = this.target;
+    if (dt.constructor != Array) { dt=[dt]; }
+    if (data.constructor != Array) { data=[data]; }
+    if (typeof(dt[0])!='function') {
+      for ( var i=0; i<dt.length; i++ ) {
+        var div = document.getElementById(dt[i]);
+        if (div.type =='text' || div.type=='textarea' || div.type=='hidden' ) {
+          div.value=data[i];
+        } else if (div.type =='checkbox') {
+          div.checked=data[i];
+        } else {
+          div.innerHTML = data[i];
+        }
+      }
+    } else if (typeof(dt[0])=='function') {
+       dt[0].apply(this,data);
+    }
+    this.pjxCompleted(dt);
+ },
+
+  getURL : function(fname) {
+      var args = this.args;
+      var url= '$fname=' + fname;
+      for (var i=0;i<args.length;i++) {
+        url=url + args[i];
+      }
+      return url;
+  }
+};
+
+handleReturn = function() {
+  for( var k=0; k<ajax.length; k++ ) {
+    if (ajax[k].r==null) { ajax.splice(k--,1); continue; }
+    if ( ajax[k].r.readyState== 4) { 
+      ajax[k].readyState4();
+      ajax.splice(k--,1);
+      continue;
+    }
+  }
+};
+
+var ghr=getghr();
+function getghr(){
+    if(typeof XMLHttpRequest != "undefined")
+    {
+        return function(){return new XMLHttpRequest();}
+    }
+    var msv= ["Msxml2.XMLHTTP.7.0", "Msxml2.XMLHTTP.6.0",
+    "Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0",
+    "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"];
+    for(var j=0;j<=msv.length;j++){
+        try
+        {
+            A = new ActiveXObject(msv[j]);
+            if(A){ 
+              return function(){return new ActiveXObject(msv[j]);}
+            }
+        }
+        catch(e) { }
+     }
+     return false;
+}
+
+
+function jsdebug(){
+    var tmp = document.getElementById('pjxdebugrequest').innerHTML = "<br><pre>";
+    for( var i=0; i < ajax.length; i++ ) {
+      tmp += '<a href= '+ ajax[i].url +' target=_blank>' +
+      decodeURI(ajax[i].url) + ' <' + '/a><br>';
+    }
+    document.getElementById('pjxdebugrequest').innerHTML = tmp + "<" + "/pre>";
+}
+
+EOT
+
+    if ( $self->JSDEBUG() <= 1 ) {
+        $rv = $self->compress_js($rv);
+    }
+
+    return ($rv);
+}
+
+# sub compress_js()
+#
+#    Purpose: searches the javascript for newlines and spaces and
+#             removes them (if a newline) or shrinks them to a single (if
+#             space).
+#  Arguments: javascript to compress
+#    Returns: compressed js string
+#  Called By: show_common_js(),
+#
+
+sub compress_js {
+    my ( $self, $js ) = @_;
+    return if not defined $js;
+    return if $js eq "";
+    $js =~ s/\n//g;      # drop newlines
+    $js =~ s/\s+/ /g;    # replace 1+ spaces with just one space
+    return $js;
+}
+
+# sub insert_js_in_head()
+#
+#    Purpose: searches the html value in the CGI::Ajax object and inserts
+#             the ajax javascript code in the <script></script> section,
+#             or if no such section exists, then it creates it.  If
+#             JSDEBUG is set, then an extra div will be added and the
+#             url will be displayed as a link
+#  Arguments: none
+#    Returns: none
+#  Called By: build_html()
+#
+
+sub insert_js_in_head {
+    my $self  = shift;
+    my $mhtml = $self->html();
+    my $newhtml;
+    my @shtml;
+    my $js = $self->show_javascript();
+
+    if ( $self->JSDEBUG() ) {
+        my $showurl = qq!<br/><div id='pjxdebugrequest'></div><br/>!;
+
+        # find the terminal </body> so we can insert just before it
+        my @splith = $mhtml =~ /(.*)(<\s*\/\s*body[^>]*>?)(.*)/is;
+        $mhtml = $splith[0] . $showurl . $splith[1] . $splith[2];
+    }
+
+    # see if we can match on <head>
+    @shtml = $mhtml =~ /(.*)(<\s*head[^>]*>?)(.*)/is;
+    if (@shtml) {
+
+        # yes, there's already a <head></head>, so let's insert inside it,
+        # at the beginning
+        $newhtml = $shtml[0] . $shtml[1] . $js . $shtml[2];
+    }
+    elsif ( @shtml = $mhtml =~ /(.*)(<\s*html[^>]*>?)(.*)/is ) {
+
+        # there's no <head>, so look for the <html> tag, and insert out
+        # javascript inside that tag
+        $newhtml = $shtml[0] . $shtml[1] . $js . $shtml[2];
+    }
+    else {
+        $newhtml .= "<html><head>";
+        $newhtml .= $js;
+        $newhtml .= "</head><body>";
+        $newhtml .=
+"No head/html tags, nowhere to insert.  Returning javascript anyway<br>";
+        $newhtml .= "</body></html>";
+    }
+    $self->html($newhtml);
+    return;
+}
+
+# sub handle_request()
+#
+#    Purpose: makes sure a fname function name was set in the CGI
+#             object, and then tries to eval the function with
+#             parameters sent in on args
+#  Arguments: none
+#    Returns: the result of the perl subroutine, as text; if multiple
+#             arguments are sent back from the defined, exported perl
+#             method, then join then with a connector (__pjx__).
+#  Called By: build_html()
+#
+
+sub handle_request {
+    my ($self) = shift;
+
+    my $result;    # $result takes the output of the function, if it's an
+                   # array split on __pjx__
+    my @other = ();    # array for catching extra parameters
+
+    # we need to access "fname" in the form from the web page, so make
+    # sure there is a CGI object defined
+    return undef unless defined $self->cgi();
+
+    my $rv = $self->getHeader( $self->cgi_header_extra() );
+    if ( !defined $rv and $self->skip_header == 0 ) {
+
+        # don't have an object with a "header()" method, so just create
+        # a mimimal one
+        $rv = "Content-Type: text/html;";
+
+        # TODO:
+        $rv .= $self->cgi_header_extra();
+        $rv .= "\n\n";
+    }
+
+    # get the name of the function
+    my $func_name = $self->getparam($self->fname());    #pmg
+         # check if the function name was created
+    if ( defined $self->coderef_list()->{$func_name} ) {
+        my $code = $self->coderef_list()->{$func_name};
+
+        # eval the code from the coderef, and append the output to $rv
+        if ( ref($code) eq "CODE" ) {
+            my @args = $self->getparam("args");    #pmg
+            eval { ( $result, @other ) = $code->(@args) };    #pmg
+
+            if ($@) {
+
+                # see if the eval caused and error and report it
+                # Should we be more severe and die?
+                print STDERR "Problem with code: $@\n";
+            }
+
+            if (@other) {
+                $rv .= join( "__pjx__", ( $result, @other ) );
+                if ( $self->DEBUG() ) {
+                    print STDERR "rv = $rv\n";
+                }
+            }
+            else {
+                if ( defined $result ) {
+                    $rv .= $result;
+                }
+            }
+
+        }    # end if ref = CODE
+    }
+    else {
+
+        # # problems with the URL, return a CGI rrror
+        print STDERR "POSSIBLE SECURITY INCIDENT! Browser from ",
+          $self->remoteaddr();
+        print STDERR "\trequested URL: ", $self->geturl();
+        print STDERR "\tfname request: ", $self->getparam($self->fname());
+        print STDERR " -- returning Bad Request status 400\n";
+        my $header = $self->getHeader( -status => '400' );
+        if ( !defined $header ) {
+
+            # don't have an object with a "header()" method, so just create
+            # a mimimal one with 400 error
+            $rv = "Status: 400\nContent-Type: text/html;\n\n";
+        }
+    }
+    return $rv;
+}
+
+# sub make_function()
+#
+#    Purpose: creates the javascript wrapper for the underlying perl
+#             subroutine
+#  Arguments: CGI object from web form, and the name of the perl
+#             function to export to javascript, or a url if the
+#             function name refers to another cgi script
+#    Returns: text of the javascript-wrapped perl subroutine
+#  Called By: show_javascript; called once for each registered perl
+#             subroutine
+#
+
+sub make_function {
+    my ( $self, $func_name ) = @_;
+    return ("") if not defined $func_name;
+    return ("") if $func_name eq "";
+    my $rv = "";
+    my $script = $0 || $ENV{SCRIPT_FILENAME};
+    $script =~ s/.*[\/|\\](.+)$/$1/;
+    my $outside_url = $self->url_list()->{$func_name};
+    my $url = defined $outside_url ? $outside_url : $script;
+    if ( $url =~ /\?/ ) { $url .= '&'; }
+    else { $url .= '?' }
+    $url = "'$url'";
+    my $jsdebug = "";
+
+    if ( $self->JSDEBUG() ) {
+        $jsdebug = "jsdebug()";
+    }
+
+    my $cache = $self->CACHE();
+
+    #create the javascript text
+    $rv .= <<EOT;
+function $func_name() {
+  var args = $func_name.arguments;
+  cache = $cache;
+  for( var i=0; i<args[0].length;i++ ) {
+    args[0][i] = fnsplit(args[0][i]);
+  }
+  var l = ajax.length;
+  ajax[l]= new pjx(args,"$func_name",args[2]);
+  ajax[l].url = $url + ajax[l].url;
+  if ( cache == 0 ) {
+    ajax[l].url = ajax[l].url + '&pjxrand=' + Math.random();
+  }
+  ajax[l].send2perl();
+  $jsdebug;
+}
+EOT
+
+    if ( not $self->JSDEBUG() ) {
+        $rv = $self->compress_js($rv);
+    }
+    return $rv;
+}
+
+=item register()
+
+    Purpose: adds a function name and a code ref to the global coderef
+             hash, after the original object was created
+  Arguments: function name, code reference
+    Returns: none
+  Called By: originating web script
+
+=cut
+
+sub register {
+    my ( $self, $fn, $coderef ) = @_;
+
+    # coderef_list() is a Class::Accessor function
+    # url_list() is a Class::Accessor function
+    if ( ref($coderef) eq "CODE" ) {
+        $self->coderef_list()->{$fn} = $coderef;
+    }
+    elsif ( ref($coderef) ) {
+        die "Unsupported code/url type - error\n";
+    }
+    else {
+        $self->url_list()->{$fn} = $coderef;
+    }
+}
+
+=item fname()
+
+    Purpose: Overrides the default parameter name used for
+             passing an exported function name. Default value
+             is "fname".
+
+  Arguments: fname("new_name"); # sets the new parameter name
+             The overriden fname should be consistent throughout 
+             the entire application. Otherwise results are unpredicted.
+
+    Returns: With no parameters fname() returns the current fname name
+
+
+=item JSDEBUG()
+
+    Purpose: Show the AJAX URL that is being generated, and stop
+             compression of the generated javascript, both of which can aid
+             during debugging.  If set to 1, then the core js will get
+             compressed, but the user-defined functions will not be
+             compressed.  If set to 2 (or anything greater than 1 or 0), 
+             then none of the javascript will get compressed.
+
+  Arguments: JSDEBUG(0); # turn javascript debugging off
+             JSDEBUG(1); # turn javascript debugging on, some javascript compression
+             JSDEBUG(2); # turn javascript debugging on, no javascript compresstion
+    Returns: prints a link to the url that is being generated automatically by
+             the Ajax object. this is VERY useful for seeing what
+             CGI::Ajax is doing. Following the link, will show a page
+             with the output that the page is generating.
+             
+  Called By: $pjx->JSDEBUG(1) # where $pjx is a CGI::Ajax object;
+
+=item DEBUG()
+
+    Purpose: Show debugging information in web server logs
+  Arguments: DEBUG(0); # turn debugging off (default)
+             DEBUG(1); # turn debugging on
+    Returns: prints debugging information to the web server logs using
+             STDERR
+  Called By: $pjx->DEBUG(1) # where $pjx is a CGI::Ajax object;
+
+=item CACHE()
+
+    Purpose: Alter the default result caching behavior.
+  Arguments: CACHE(0); # effectively the same as having NO_CACHE passed in every call
+    Returns: A change in the behavior of build_html such that the javascript
+             produced will always act as if the NO_CACHE argument is passed,
+             regardless of its presence.
+  Called By: $pjx->CACHE(0) # where $pjx is a CGI::Ajax object;
+
+=back
+
+=head1 BUGS
+
+Follow any bugs at our homepage....
+
+  http://www.perljax.us
+
+=head1 SUPPORT
+
+Check out the news/discussion/bugs lists at our homepage:
+
+  http://www.perljax.us
+
+=head1 AUTHORS
+
+  Brian C. Thomas     Brent Pedersen
+  CPAN ID: BCT
+  bct.x42@gmail.com   bpederse@gmail.com
+
+  significant contribution by:
+      Peter Gordon <peter@pg-consultants.com> # CGI::Application + scripts
+      Kyraha  http://michael.kyraha.com/      # getVal(), multiple forms
+      Jan Franczak <jan.franczak@gmail.com>   # CACHE support
+      Shibi NS                                # use ->isa instead of ->can
+     
+  others:
+      RENEEB <RENEEB [...] cpan.org> 
+      stefan.scherer
+      RBS
+      Andrew
+
+
+=head1 A NOTE ABOUT THE MODULE NAME
+
+This module was initiated using the name "Perljax", but then
+registered with CPAN under the WWW group "CGI::", and so became
+"CGI::Perljax".  Upon further deliberation, we decided to change it's
+name to L<CGI::Ajax>.
+
+=head1 COPYRIGHT
+
+This program is free software; you can redistribute
+it and/or modify it under the same terms as Perl itself.
+
+The full text of the license can be found in the
+LICENSE file included with this module.
+
+=head1 SEE ALSO
+
+L<Data::Javascript>
+L<CGI>
+L<Class::Accessor>
+
+=cut
+
+1;
+__END__
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Class/Accessor.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Class/Accessor.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Class/Accessor.pm	(revision 24799)
@@ -0,0 +1,744 @@
+package Class::Accessor;
+require 5.00502;
+use strict;
+$Class::Accessor::VERSION = '0.34';
+
+sub new {
+    my($proto, $fields) = @_;
+    my($class) = ref $proto || $proto;
+
+    $fields = {} unless defined $fields;
+
+    # make a copy of $fields.
+    bless {%$fields}, $class;
+}
+
+sub mk_accessors {
+    my($self, @fields) = @_;
+
+    $self->_mk_accessors('rw', @fields);
+}
+
+if (eval { require Sub::Name }) {
+    Sub::Name->import;
+}
+
+{
+    no strict 'refs';
+
+    sub import {
+        my ($class, @what) = @_;
+        my $caller = caller;
+        for (@what) {
+            if (/^(?:antlers|moose-?like)$/i) {
+                *{"${caller}::has"} = sub {
+                    my ($f, %args) = @_;
+                    $caller->_mk_accessors(($args{is}||"rw"), $f);
+                };
+                *{"${caller}::extends"} = sub {
+                    @{"${caller}::ISA"} = @_;
+                    unless (grep $_->can("_mk_accessors"), @_) {
+                        push @{"${caller}::ISA"}, $class;
+                    }
+                };
+                # we'll use their @ISA as a default, in case it happens to be
+                # set already
+                &{"${caller}::extends"}(@{"${caller}::ISA"});
+            }
+        }
+    }
+
+    sub follow_best_practice {
+        my($self) = @_;
+        my $class = ref $self || $self;
+        *{"${class}::accessor_name_for"}  = \&best_practice_accessor_name_for;
+        *{"${class}::mutator_name_for"}  = \&best_practice_mutator_name_for;
+    }
+
+    sub _mk_accessors {
+        my($self, $access, @fields) = @_;
+        my $class = ref $self || $self;
+        my $ra = $access eq 'rw' || $access eq 'ro';
+        my $wa = $access eq 'rw' || $access eq 'wo';
+
+        foreach my $field (@fields) {
+            my $accessor_name = $self->accessor_name_for($field);
+            my $mutator_name = $self->mutator_name_for($field);
+            if( $accessor_name eq 'DESTROY' or $mutator_name eq 'DESTROY' ) {
+                $self->_carp("Having a data accessor named DESTROY  in '$class' is unwise.");
+            }
+            if ($accessor_name eq $mutator_name) {
+                my $accessor;
+                if ($ra && $wa) {
+                    $accessor = $self->make_accessor($field);
+                } elsif ($ra) {
+                    $accessor = $self->make_ro_accessor($field);
+                } else {
+                    $accessor = $self->make_wo_accessor($field);
+                }
+                my $fullname = "${class}::$accessor_name";
+                my $subnamed = 0;
+                unless (defined &{$fullname}) {
+                    subname($fullname, $accessor) if defined &subname;
+                    $subnamed = 1;
+                    *{$fullname} = $accessor;
+                }
+                if ($accessor_name eq $field) {
+                    # the old behaviour
+                    my $alias = "${class}::_${field}_accessor";
+                    subname($alias, $accessor) if defined &subname and not $subnamed;
+                    *{$alias} = $accessor unless defined &{$alias};
+                }
+            } else {
+                my $fullaccname = "${class}::$accessor_name";
+                my $fullmutname = "${class}::$mutator_name";
+                if ($ra and not defined &{$fullaccname}) {
+                    my $accessor = $self->make_ro_accessor($field);
+                    subname($fullaccname, $accessor) if defined &subname;
+                    *{$fullaccname} = $accessor;
+                }
+                if ($wa and not defined &{$fullmutname}) {
+                    my $mutator = $self->make_wo_accessor($field);
+                    subname($fullmutname, $mutator) if defined &subname;
+                    *{$fullmutname} = $mutator;
+                }
+            }
+        }
+    }
+
+}
+
+sub mk_ro_accessors {
+    my($self, @fields) = @_;
+
+    $self->_mk_accessors('ro', @fields);
+}
+
+sub mk_wo_accessors {
+    my($self, @fields) = @_;
+
+    $self->_mk_accessors('wo', @fields);
+}
+
+sub best_practice_accessor_name_for {
+    my ($class, $field) = @_;
+    return "get_$field";
+}
+
+sub best_practice_mutator_name_for {
+    my ($class, $field) = @_;
+    return "set_$field";
+}
+
+sub accessor_name_for {
+    my ($class, $field) = @_;
+    return $field;
+}
+
+sub mutator_name_for {
+    my ($class, $field) = @_;
+    return $field;
+}
+
+sub set {
+    my($self, $key) = splice(@_, 0, 2);
+
+    if(@_ == 1) {
+        $self->{$key} = $_[0];
+    }
+    elsif(@_ > 1) {
+        $self->{$key} = [@_];
+    }
+    else {
+        $self->_croak("Wrong number of arguments received");
+    }
+}
+
+sub get {
+    my $self = shift;
+
+    if(@_ == 1) {
+        return $self->{$_[0]};
+    }
+    elsif( @_ > 1 ) {
+        return @{$self}{@_};
+    }
+    else {
+        $self->_croak("Wrong number of arguments received");
+    }
+}
+
+sub make_accessor {
+    my ($class, $field) = @_;
+
+    return sub {
+        my $self = shift;
+
+        if(@_) {
+            return $self->set($field, @_);
+        } else {
+            return $self->get($field);
+        }
+    };
+}
+
+sub make_ro_accessor {
+    my($class, $field) = @_;
+
+    return sub {
+        my $self = shift;
+
+        if (@_) {
+            my $caller = caller;
+            $self->_croak("'$caller' cannot alter the value of '$field' on objects of class '$class'");
+        }
+        else {
+            return $self->get($field);
+        }
+    };
+}
+
+sub make_wo_accessor {
+    my($class, $field) = @_;
+
+    return sub {
+        my $self = shift;
+
+        unless (@_) {
+            my $caller = caller;
+            $self->_croak("'$caller' cannot access the value of '$field' on objects of class '$class'");
+        }
+        else {
+            return $self->set($field, @_);
+        }
+    };
+}
+
+
+use Carp ();
+
+sub _carp {
+    my ($self, $msg) = @_;
+    Carp::carp($msg || $self);
+    return;
+}
+
+sub _croak {
+    my ($self, $msg) = @_;
+    Carp::croak($msg || $self);
+    return;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+  Class::Accessor - Automated accessor generation
+
+=head1 SYNOPSIS
+
+  package Foo;
+  use base qw(Class::Accessor);
+  Foo->follow_best_practice;
+  Foo->mk_accessors(qw(name role salary));
+
+  # or if you prefer a Moose-like interface...
+ 
+  package Foo;
+  use Class::Accessor "antlers";
+  has name => ( is => "rw", isa => "Str" );
+  has role => ( is => "rw", isa => "Str" );
+  has salary => ( is => "rw", isa => "Num" );
+
+  # Meanwhile, in a nearby piece of code!
+  # Class::Accessor provides new().
+  my $mp = Foo->new({ name => "Marty", role => "JAPH" });
+
+  my $job = $mp->role;  # gets $mp->{role}
+  $mp->salary(400000);  # sets $mp->{salary} = 400000 # I wish
+  
+  # like my @info = @{$mp}{qw(name role)}
+  my @info = $mp->get(qw(name role));
+  
+  # $mp->{salary} = 400000
+  $mp->set('salary', 400000);
+
+
+=head1 DESCRIPTION
+
+This module automagically generates accessors/mutators for your class.
+
+Most of the time, writing accessors is an exercise in cutting and
+pasting.  You usually wind up with a series of methods like this:
+
+    sub name {
+        my $self = shift;
+        if(@_) {
+            $self->{name} = $_[0];
+        }
+        return $self->{name};
+    }
+
+    sub salary {
+        my $self = shift;
+        if(@_) {
+            $self->{salary} = $_[0];
+        }
+        return $self->{salary};
+    }
+
+  # etc...
+
+One for each piece of data in your object.  While some will be unique,
+doing value checks and special storage tricks, most will simply be
+exercises in repetition.  Not only is it Bad Style to have a bunch of
+repetitious code, but it's also simply not lazy, which is the real
+tragedy.
+
+If you make your module a subclass of Class::Accessor and declare your
+accessor fields with mk_accessors() then you'll find yourself with a
+set of automatically generated accessors which can even be
+customized!
+
+The basic set up is very simple:
+
+    package Foo;
+    use base qw(Class::Accessor);
+    Foo->mk_accessors( qw(far bar car) );
+
+Done.  Foo now has simple far(), bar() and car() accessors
+defined.
+
+Alternatively, if you want to follow Damian's I<best practice> guidelines 
+you can use:
+
+    package Foo;
+    use base qw(Class::Accessor);
+    Foo->follow_best_practice;
+    Foo->mk_accessors( qw(far bar car) );
+
+B<Note:> you must call C<follow_best_practice> before calling C<mk_accessors>.
+
+=head2 Moose-like
+
+By popular demand we now have a simple Moose-like interface.  You can now do:
+
+    package Foo;
+    use Class::Accessor "antlers";
+    has far => ( is => "rw" );
+    has bar => ( is => "rw" );
+    has car => ( is => "rw" );
+
+Currently only the C<is> attribute is supported.
+
+=head1 CONSTRUCTOR
+
+Class::Accessor provides a basic constructor, C<new>.  It generates a
+hash-based object and can be called as either a class method or an
+object method.  
+
+=head2 new
+
+    my $obj = Foo->new;
+    my $obj = $other_obj->new;
+
+    my $obj = Foo->new(\%fields);
+    my $obj = $other_obj->new(\%fields);
+
+It takes an optional %fields hash which is used to initialize the
+object (handy if you use read-only accessors).  The fields of the hash
+correspond to the names of your accessors, so...
+
+    package Foo;
+    use base qw(Class::Accessor);
+    Foo->mk_accessors('foo');
+
+    my $obj = Foo->new({ foo => 42 });
+    print $obj->foo;    # 42
+
+however %fields can contain anything, new() will shove them all into
+your object.
+
+=head1 MAKING ACCESSORS
+
+=head2 follow_best_practice
+
+In Damian's Perl Best Practices book he recommends separate get and set methods
+with the prefix set_ and get_ to make it explicit what you intend to do.  If you
+want to create those accessor methods instead of the default ones, call:
+
+    __PACKAGE__->follow_best_practice
+
+B<before> you call any of the accessor-making methods.
+
+=head2 accessor_name_for / mutator_name_for
+
+You may have your own crazy ideas for the names of the accessors, so you can
+make those happen by overriding C<accessor_name_for> and C<mutator_name_for> in
+your subclass.  (I copied that idea from Class::DBI.)
+
+=head2 mk_accessors
+
+    __PACKAGE__->mk_accessors(@fields);
+
+This creates accessor/mutator methods for each named field given in
+@fields.  Foreach field in @fields it will generate two accessors.
+One called "field()" and the other called "_field_accessor()".  For
+example:
+
+    # Generates foo(), _foo_accessor(), bar() and _bar_accessor().
+    __PACKAGE__->mk_accessors(qw(foo bar));
+
+See L<CAVEATS AND TRICKS/"Overriding autogenerated accessors">
+for details.
+
+=head2 mk_ro_accessors
+
+  __PACKAGE__->mk_ro_accessors(@read_only_fields);
+
+Same as mk_accessors() except it will generate read-only accessors
+(ie. true accessors).  If you attempt to set a value with these
+accessors it will throw an exception.  It only uses get() and not
+set().
+
+    package Foo;
+    use base qw(Class::Accessor);
+    Foo->mk_ro_accessors(qw(foo bar));
+
+    # Let's assume we have an object $foo of class Foo...
+    print $foo->foo;  # ok, prints whatever the value of $foo->{foo} is
+    $foo->foo(42);    # BOOM!  Naughty you.
+
+
+=head2 mk_wo_accessors
+
+  __PACKAGE__->mk_wo_accessors(@write_only_fields);
+
+Same as mk_accessors() except it will generate write-only accessors
+(ie. mutators).  If you attempt to read a value with these accessors
+it will throw an exception.  It only uses set() and not get().
+
+B<NOTE> I'm not entirely sure why this is useful, but I'm sure someone
+will need it.  If you've found a use, let me know.  Right now it's here
+for orthoginality and because it's easy to implement.
+
+    package Foo;
+    use base qw(Class::Accessor);
+    Foo->mk_wo_accessors(qw(foo bar));
+
+    # Let's assume we have an object $foo of class Foo...
+    $foo->foo(42);      # OK.  Sets $self->{foo} = 42
+    print $foo->foo;    # BOOM!  Can't read from this accessor.
+
+=head1 Moose!
+
+If you prefer a Moose-like interface to create accessors, you can use C<has> by
+importing this module like this:
+
+  use Class::Accessor "antlers";
+
+or
+
+  use Class::Accessor "moose-like";
+
+Then you can declare accessors like this:
+
+  has alpha => ( is => "rw", isa => "Str" );
+  has beta  => ( is => "ro", isa => "Str" );
+  has gamma => ( is => "wo", isa => "Str" );
+
+Currently only the C<is> attribute is supported.  And our C<is> also supports
+the "wo" value to make a write-only accessor.
+
+If you are using the Moose-like interface then you should use the C<extends>
+rather than tweaking your C<@ISA> directly.  Basically, replace
+
+  @ISA = qw/Foo Bar/;
+
+with
+
+  extends(qw/Foo Bar/);
+
+=head1 DETAILS
+
+An accessor generated by Class::Accessor looks something like
+this:
+
+    # Your foo may vary.
+    sub foo {
+        my($self) = shift;
+        if(@_) {    # set
+            return $self->set('foo', @_);
+        }
+        else {
+            return $self->get('foo');
+        }
+    }
+
+Very simple.  All it does is determine if you're wanting to set a
+value or get a value and calls the appropriate method.
+Class::Accessor provides default get() and set() methods which
+your class can override.  They're detailed later.
+
+=head2 Modifying the behavior of the accessor
+
+Rather than actually modifying the accessor itself, it is much more
+sensible to simply override the two key methods which the accessor
+calls.  Namely set() and get().
+
+If you -really- want to, you can override make_accessor().
+
+=head2 set
+
+    $obj->set($key, $value);
+    $obj->set($key, @values);
+
+set() defines how generally one stores data in the object.
+
+override this method to change how data is stored by your accessors.
+
+=head2 get
+
+    $value  = $obj->get($key);
+    @values = $obj->get(@keys);
+
+get() defines how data is retreived from your objects.
+
+override this method to change how it is retreived.
+
+=head2 make_accessor
+
+    $accessor = __PACKAGE__->make_accessor($field);
+
+Generates a subroutine reference which acts as an accessor for the given
+$field.  It calls get() and set().
+
+If you wish to change the behavior of your accessors, try overriding
+get() and set() before you start mucking with make_accessor().
+
+=head2 make_ro_accessor
+
+    $read_only_accessor = __PACKAGE__->make_ro_accessor($field);
+
+Generates a subroutine refrence which acts as a read-only accessor for
+the given $field.  It only calls get().
+
+Override get() to change the behavior of your accessors.
+
+=head2 make_wo_accessor
+
+    $read_only_accessor = __PACKAGE__->make_wo_accessor($field);
+
+Generates a subroutine refrence which acts as a write-only accessor
+(mutator) for the given $field.  It only calls set().
+
+Override set() to change the behavior of your accessors.
+
+=head1 EXCEPTIONS
+
+If something goes wrong Class::Accessor will warn or die by calling Carp::carp
+or Carp::croak.  If you don't like this you can override _carp() and _croak() in
+your subclass and do whatever else you want.
+
+=head1 EFFICIENCY
+
+Class::Accessor does not employ an autoloader, thus it is much faster
+than you'd think.  Its generated methods incur no special penalty over
+ones you'd write yourself.
+
+  accessors:
+              Rate  Basic   Fast Faster Direct
+  Basic   367589/s     --   -51%   -55%   -89%
+  Fast    747964/s   103%     --    -9%   -77%
+  Faster  819199/s   123%    10%     --   -75%
+  Direct 3245887/s   783%   334%   296%     --
+
+  mutators:
+              Rate    Acc   Fast Faster Direct
+  Acc     265564/s     --   -54%   -63%   -91%
+  Fast    573439/s   116%     --   -21%   -80%
+  Faster  724710/s   173%    26%     --   -75%
+  Direct 2860979/s   977%   399%   295%     --
+
+Class::Accessor::Fast is faster than methods written by an average programmer
+(where "average" is based on Schwern's example code).
+
+Class::Accessor is slower than average, but more flexible.
+
+Class::Accessor::Faster is even faster than Class::Accessor::Fast.  It uses an
+array internally, not a hash.  This could be a good or bad feature depending on
+your point of view.
+
+Direct hash access is, of course, much faster than all of these, but it
+provides no encapsulation.
+
+Of course, it's not as simple as saying "Class::Accessor is slower than
+average".  These are benchmarks for a simple accessor.  If your accessors do
+any sort of complicated work (such as talking to a database or writing to a
+file) the time spent doing that work will quickly swamp the time spend just
+calling the accessor.  In that case, Class::Accessor and the ones you write
+will be roughly the same speed.
+
+
+=head1 EXAMPLES
+
+Here's an example of generating an accessor for every public field of
+your class.
+
+    package Altoids;
+    
+    use base qw(Class::Accessor Class::Fields);
+    use fields qw(curiously strong mints);
+    Altoids->mk_accessors( Altoids->show_fields('Public') );
+
+    sub new {
+        my $proto = shift;
+        my $class = ref $proto || $proto;
+        return fields::new($class);
+    }
+
+    my Altoids $tin = Altoids->new;
+
+    $tin->curiously('Curiouser and curiouser');
+    print $tin->{curiously};    # prints 'Curiouser and curiouser'
+
+    
+    # Subclassing works, too.
+    package Mint::Snuff;
+    use base qw(Altoids);
+
+    my Mint::Snuff $pouch = Mint::Snuff->new;
+    $pouch->strong('Blow your head off!');
+    print $pouch->{strong};     # prints 'Blow your head off!'
+
+
+Here's a simple example of altering the behavior of your accessors.
+
+    package Foo;
+    use base qw(Class::Accessor);
+    Foo->mk_accessors(qw(this that up down));
+
+    sub get {
+        my $self = shift;
+
+        # Note every time someone gets some data.
+        print STDERR "Getting @_\n";
+
+        $self->SUPER::get(@_);
+    }
+
+    sub set {
+        my ($self, $key) = splice(@_, 0, 2);
+
+        # Note every time someone sets some data.
+        print STDERR "Setting $key to @_\n";
+
+        $self->SUPER::set($key, @_);
+    }
+
+
+=head1 CAVEATS AND TRICKS
+
+Class::Accessor has to do some internal wackiness to get its
+job done quickly and efficiently.  Because of this, there's a few
+tricks and traps one must know about.
+
+Hey, nothing's perfect.
+
+=head2 Don't make a field called DESTROY
+
+This is bad.  Since DESTROY is a magical method it would be bad for us
+to define an accessor using that name.  Class::Accessor will
+carp if you try to use it with a field named "DESTROY".
+
+=head2 Overriding autogenerated accessors
+
+You may want to override the autogenerated accessor with your own, yet
+have your custom accessor call the default one.  For instance, maybe
+you want to have an accessor which checks its input.  Normally, one
+would expect this to work:
+
+    package Foo;
+    use base qw(Class::Accessor);
+    Foo->mk_accessors(qw(email this that whatever));
+
+    # Only accept addresses which look valid.
+    sub email {
+        my($self) = shift;
+        my($email) = @_;
+
+        if( @_ ) {  # Setting
+            require Email::Valid;
+            unless( Email::Valid->address($email) ) {
+                carp("$email doesn't look like a valid address.");
+                return;
+            }
+        }
+
+        return $self->SUPER::email(@_);
+    }
+
+There's a subtle problem in the last example, and it's in this line:
+
+    return $self->SUPER::email(@_);
+
+If we look at how Foo was defined, it called mk_accessors() which
+stuck email() right into Foo's namespace.  There *is* no
+SUPER::email() to delegate to!  Two ways around this... first is to
+make a "pure" base class for Foo.  This pure class will generate the
+accessors and provide the necessary super class for Foo to use:
+
+    package Pure::Organic::Foo;
+    use base qw(Class::Accessor);
+    Pure::Organic::Foo->mk_accessors(qw(email this that whatever));
+
+    package Foo;
+    use base qw(Pure::Organic::Foo);
+
+And now Foo::email() can override the generated
+Pure::Organic::Foo::email() and use it as SUPER::email().
+
+This is probably the most obvious solution to everyone but me.
+Instead, what first made sense to me was for mk_accessors() to define
+an alias of email(), _email_accessor().  Using this solution,
+Foo::email() would be written with:
+
+    return $self->_email_accessor(@_);
+
+instead of the expected SUPER::email().
+
+
+=head1 AUTHORS
+
+Copyright 2009 Marty Pauley <marty+perl@kasei.com>
+
+This program is free software; you can redistribute it and/or modify it under
+the same terms as Perl itself.  That means either (a) the GNU General Public
+License or (b) the Artistic License.
+
+=head2 ORIGINAL AUTHOR
+
+Michael G Schwern <schwern@pobox.com>
+
+=head2 THANKS
+
+Liz and RUZ for performance tweaks.
+
+Tels, for his big feature request/bug report.
+
+Various presenters at YAPC::Asia 2009 for criticising the non-Moose interface.
+
+=head1 SEE ALSO
+
+See L<Class::Accessor::Fast> and L<Class::Accessor::Faster> if speed is more
+important than flexibility.
+
+These are some modules which do similar things in different ways
+L<Class::Struct>, L<Class::Methodmaker>, L<Class::Generate>,
+L<Class::Class>, L<Class::Contract>, L<Moose>, L<Mouse>
+
+See L<Class::DBI> for an example of this module in use.
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Class/Accessor/Fast.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Class/Accessor/Fast.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Class/Accessor/Fast.pm	(revision 24799)
@@ -0,0 +1,93 @@
+package Class::Accessor::Fast;
+use base 'Class::Accessor';
+use strict;
+$Class::Accessor::Fast::VERSION = '0.34';
+
+sub make_accessor {
+    my($class, $field) = @_;
+
+    return sub {
+        return $_[0]->{$field} if scalar(@_) == 1;
+        return $_[0]->{$field}  = scalar(@_) == 2 ? $_[1] : [@_[1..$#_]];
+    };
+}
+
+
+sub make_ro_accessor {
+    my($class, $field) = @_;
+
+    return sub {
+        return $_[0]->{$field} if @_ == 1;
+        my $caller = caller;
+        $_[0]->_croak("'$caller' cannot alter the value of '$field' on objects of class '$class'");
+    };
+}
+
+
+sub make_wo_accessor {
+    my($class, $field) = @_;
+
+    return sub {
+        if (@_ == 1) {
+            my $caller = caller;
+            $_[0]->_croak("'$caller' cannot access the value of '$field' on objects of class '$class'");
+        }
+        else {
+            return $_[0]->{$field} = $_[1] if @_ == 2;
+            return (shift)->{$field} = \@_;
+        }
+    };
+}
+
+
+1;
+
+__END__
+
+=head1 NAME
+
+Class::Accessor::Fast - Faster, but less expandable, accessors
+
+=head1 SYNOPSIS
+
+  package Foo;
+  use base qw(Class::Accessor::Fast);
+
+  # The rest is the same as Class::Accessor but without set() and get().
+
+=head1 DESCRIPTION
+
+This is a faster but less expandable version of Class::Accessor.
+Class::Accessor's generated accessors require two method calls to accompish
+their task (one for the accessor, another for get() or set()).
+Class::Accessor::Fast eliminates calling set()/get() and does the access itself,
+resulting in a somewhat faster accessor.
+
+The downside is that you can't easily alter the behavior of your
+accessors, nor can your subclasses.  Of course, should you need this
+later, you can always swap out Class::Accessor::Fast for
+Class::Accessor.
+
+Read the documentation for Class::Accessor for more info.
+
+=head1 EFFICIENCY
+
+L<Class::Accessor/EFFICIENCY> for an efficiency comparison.
+
+=head1 AUTHORS
+
+Copyright 2007 Marty Pauley <marty+perl@kasei.com>
+
+This program is free software; you can redistribute it and/or modify it under
+the same terms as Perl itself.  That means either (a) the GNU General Public
+License or (b) the Artistic License.
+
+=head2 ORIGINAL AUTHOR
+
+Michael G Schwern <schwern@pobox.com>
+
+=head1 SEE ALSO
+
+L<Class::Accessor>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Class/Accessor/Faster.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Class/Accessor/Faster.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Class/Accessor/Faster.pm	(revision 24799)
@@ -0,0 +1,101 @@
+package Class::Accessor::Faster;
+use base 'Class::Accessor';
+use strict;
+$Class::Accessor::Faster::VERSION = '0.34';
+
+my %slot;
+sub _slot {
+    my($class, $field) = @_;
+    my $n = $slot{$class}->{$field};
+    return $n if defined $n;
+    $n = keys %{$slot{$class}};
+    $slot{$class}->{$field} = $n;
+    return $n;
+}
+
+sub new {
+    my($proto, $fields) = @_;
+    my($class) = ref $proto || $proto;
+    my $self = bless [], $class;
+
+    $fields = {} unless defined $fields;
+    for my $k (keys %$fields) {
+        my $n = $class->_slot($k);
+        $self->[$n] = $fields->{$k};
+    }
+    return $self;
+}
+
+sub make_accessor {
+    my($class, $field) = @_;
+    my $n = $class->_slot($field);
+    return sub {
+        return $_[0]->[$n] if scalar(@_) == 1;
+        return $_[0]->[$n]  = scalar(@_) == 2 ? $_[1] : [@_[1..$#_]];
+    };
+}
+
+sub make_ro_accessor {
+    my($class, $field) = @_;
+    my $n = $class->_slot($field);
+    return sub {
+        return $_[0]->[$n] if @_ == 1;
+        my $caller = caller;
+        $_[0]->_croak("'$caller' cannot alter the value of '$field' on objects of class '$class'");
+    };
+}
+
+sub make_wo_accessor {
+    my($class, $field) = @_;
+    my $n = $class->_slot($field);
+    return sub {
+        if (@_ == 1) {
+            my $caller = caller;
+            $_[0]->_croak("'$caller' cannot access the value of '$field' on objects of class '$class'");
+        } else {
+            return $_[0]->[$n] = $_[1] if @_ == 2;
+            return (shift)->[$n] = \@_;
+        }
+    };
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Class::Accessor::Faster - Even faster, but less expandable, accessors
+
+=head1 SYNOPSIS
+
+  package Foo;
+  use base qw(Class::Accessor::Faster);
+
+=head1 DESCRIPTION
+
+This is a faster but less expandable version of Class::Accessor::Fast.
+
+Class::Accessor's generated accessors require two method calls to accompish
+their task (one for the accessor, another for get() or set()).
+
+Class::Accessor::Fast eliminates calling set()/get() and does the access itself,
+resulting in a somewhat faster accessor.
+
+Class::Accessor::Faster uses an array reference underneath to be faster.
+
+Read the documentation for Class::Accessor for more info.
+
+=head1 AUTHORS
+
+Copyright 2007 Marty Pauley <marty+perl@kasei.com>
+
+This program is free software; you can redistribute it and/or modify it under
+the same terms as Perl itself.  That means either (a) the GNU General Public
+License or (b) the Artistic License.
+
+=head1 SEE ALSO
+
+L<Class::Accessor>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Crypt/UnixCrypt.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Crypt/UnixCrypt.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Crypt/UnixCrypt.pm	(revision 24799)
@@ -0,0 +1,749 @@
+package Crypt::UnixCrypt;
+
+use 5.004;  # i.e. not tested under earlier versions
+use strict;
+use vars qw($VERSION @ISA @EXPORT $OVERRIDE_BUILTIN);
+
+$VERSION = '1.0';
+
+require Exporter;
+@ISA = qw(Exporter);
+
+# Don't override built-in crypt() unless forced to to so
+use Config;
+@EXPORT = qw(crypt)
+	if !defined $Config{d_crypt} ||
+	   (defined $OVERRIDE_BUILTIN && $OVERRIDE_BUILTIN);
+
+
+my $ITERATIONS = 16;
+
+my @con_salt =
+(
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
+	0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 
+	0x0A, 0x0B, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 
+	0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 
+	0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 
+	0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 
+	0x23, 0x24, 0x25, 0x20, 0x21, 0x22, 0x23, 0x24, 
+	0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 
+	0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 
+	0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 
+	0x3D, 0x3E, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 
+);
+
+my @shifts2 =
+(
+	0, 0, 1, 1, 1, 1, 1, 1,
+	0, 1, 1, 1, 1, 1, 1, 0
+);
+
+my @skb0 =
+(
+	# for C bits (numbered as per FIPS 46) 1 2 3 4 5 6
+	0x00000000, 0x00000010, 0x20000000, 0x20000010, 
+	0x00010000, 0x00010010, 0x20010000, 0x20010010, 
+	0x00000800, 0x00000810, 0x20000800, 0x20000810, 
+	0x00010800, 0x00010810, 0x20010800, 0x20010810, 
+	0x00000020, 0x00000030, 0x20000020, 0x20000030, 
+	0x00010020, 0x00010030, 0x20010020, 0x20010030, 
+	0x00000820, 0x00000830, 0x20000820, 0x20000830, 
+	0x00010820, 0x00010830, 0x20010820, 0x20010830, 
+	0x00080000, 0x00080010, 0x20080000, 0x20080010, 
+	0x00090000, 0x00090010, 0x20090000, 0x20090010, 
+	0x00080800, 0x00080810, 0x20080800, 0x20080810, 
+	0x00090800, 0x00090810, 0x20090800, 0x20090810, 
+	0x00080020, 0x00080030, 0x20080020, 0x20080030, 
+	0x00090020, 0x00090030, 0x20090020, 0x20090030, 
+	0x00080820, 0x00080830, 0x20080820, 0x20080830, 
+	0x00090820, 0x00090830, 0x20090820, 0x20090830, 
+);
+my @skb1 =
+(
+	# for C bits (numbered as per FIPS 46) 7 8 10 11 12 13
+	0x00000000, 0x02000000, 0x00002000, 0x02002000, 
+	0x00200000, 0x02200000, 0x00202000, 0x02202000, 
+	0x00000004, 0x02000004, 0x00002004, 0x02002004, 
+	0x00200004, 0x02200004, 0x00202004, 0x02202004, 
+	0x00000400, 0x02000400, 0x00002400, 0x02002400, 
+	0x00200400, 0x02200400, 0x00202400, 0x02202400, 
+	0x00000404, 0x02000404, 0x00002404, 0x02002404, 
+	0x00200404, 0x02200404, 0x00202404, 0x02202404, 
+	0x10000000, 0x12000000, 0x10002000, 0x12002000, 
+	0x10200000, 0x12200000, 0x10202000, 0x12202000, 
+	0x10000004, 0x12000004, 0x10002004, 0x12002004, 
+	0x10200004, 0x12200004, 0x10202004, 0x12202004, 
+	0x10000400, 0x12000400, 0x10002400, 0x12002400, 
+	0x10200400, 0x12200400, 0x10202400, 0x12202400, 
+	0x10000404, 0x12000404, 0x10002404, 0x12002404, 
+	0x10200404, 0x12200404, 0x10202404, 0x12202404, 
+);
+my @skb2 =
+(
+	# for C bits (numbered as per FIPS 46) 14 15 16 17 19 20
+	0x00000000, 0x00000001, 0x00040000, 0x00040001, 
+	0x01000000, 0x01000001, 0x01040000, 0x01040001, 
+	0x00000002, 0x00000003, 0x00040002, 0x00040003, 
+	0x01000002, 0x01000003, 0x01040002, 0x01040003, 
+	0x00000200, 0x00000201, 0x00040200, 0x00040201, 
+	0x01000200, 0x01000201, 0x01040200, 0x01040201, 
+	0x00000202, 0x00000203, 0x00040202, 0x00040203, 
+	0x01000202, 0x01000203, 0x01040202, 0x01040203, 
+	0x08000000, 0x08000001, 0x08040000, 0x08040001, 
+	0x09000000, 0x09000001, 0x09040000, 0x09040001, 
+	0x08000002, 0x08000003, 0x08040002, 0x08040003, 
+	0x09000002, 0x09000003, 0x09040002, 0x09040003, 
+	0x08000200, 0x08000201, 0x08040200, 0x08040201, 
+	0x09000200, 0x09000201, 0x09040200, 0x09040201, 
+	0x08000202, 0x08000203, 0x08040202, 0x08040203, 
+	0x09000202, 0x09000203, 0x09040202, 0x09040203, 
+);
+my @skb3 =
+(
+	# for C bits (numbered as per FIPS 46) 21 23 24 26 27 28
+	0x00000000, 0x00100000, 0x00000100, 0x00100100, 
+	0x00000008, 0x00100008, 0x00000108, 0x00100108, 
+	0x00001000, 0x00101000, 0x00001100, 0x00101100, 
+	0x00001008, 0x00101008, 0x00001108, 0x00101108, 
+	0x04000000, 0x04100000, 0x04000100, 0x04100100, 
+	0x04000008, 0x04100008, 0x04000108, 0x04100108, 
+	0x04001000, 0x04101000, 0x04001100, 0x04101100, 
+	0x04001008, 0x04101008, 0x04001108, 0x04101108, 
+	0x00020000, 0x00120000, 0x00020100, 0x00120100, 
+	0x00020008, 0x00120008, 0x00020108, 0x00120108, 
+	0x00021000, 0x00121000, 0x00021100, 0x00121100, 
+	0x00021008, 0x00121008, 0x00021108, 0x00121108, 
+	0x04020000, 0x04120000, 0x04020100, 0x04120100, 
+	0x04020008, 0x04120008, 0x04020108, 0x04120108, 
+	0x04021000, 0x04121000, 0x04021100, 0x04121100, 
+	0x04021008, 0x04121008, 0x04021108, 0x04121108, 
+);
+my @skb4 =
+(
+	# for D bits (numbered as per FIPS 46) 1 2 3 4 5 6
+	0x00000000, 0x10000000, 0x00010000, 0x10010000, 
+	0x00000004, 0x10000004, 0x00010004, 0x10010004, 
+	0x20000000, 0x30000000, 0x20010000, 0x30010000, 
+	0x20000004, 0x30000004, 0x20010004, 0x30010004, 
+	0x00100000, 0x10100000, 0x00110000, 0x10110000, 
+	0x00100004, 0x10100004, 0x00110004, 0x10110004, 
+	0x20100000, 0x30100000, 0x20110000, 0x30110000, 
+	0x20100004, 0x30100004, 0x20110004, 0x30110004, 
+	0x00001000, 0x10001000, 0x00011000, 0x10011000, 
+	0x00001004, 0x10001004, 0x00011004, 0x10011004, 
+	0x20001000, 0x30001000, 0x20011000, 0x30011000, 
+	0x20001004, 0x30001004, 0x20011004, 0x30011004, 
+	0x00101000, 0x10101000, 0x00111000, 0x10111000, 
+	0x00101004, 0x10101004, 0x00111004, 0x10111004, 
+	0x20101000, 0x30101000, 0x20111000, 0x30111000, 
+	0x20101004, 0x30101004, 0x20111004, 0x30111004, 
+);
+my @skb5 =
+(
+	# for D bits (numbered as per FIPS 46) 8 9 11 12 13 14
+	0x00000000, 0x08000000, 0x00000008, 0x08000008, 
+	0x00000400, 0x08000400, 0x00000408, 0x08000408, 
+	0x00020000, 0x08020000, 0x00020008, 0x08020008, 
+	0x00020400, 0x08020400, 0x00020408, 0x08020408, 
+	0x00000001, 0x08000001, 0x00000009, 0x08000009, 
+	0x00000401, 0x08000401, 0x00000409, 0x08000409, 
+	0x00020001, 0x08020001, 0x00020009, 0x08020009, 
+	0x00020401, 0x08020401, 0x00020409, 0x08020409, 
+	0x02000000, 0x0A000000, 0x02000008, 0x0A000008, 
+	0x02000400, 0x0A000400, 0x02000408, 0x0A000408, 
+	0x02020000, 0x0A020000, 0x02020008, 0x0A020008, 
+	0x02020400, 0x0A020400, 0x02020408, 0x0A020408, 
+	0x02000001, 0x0A000001, 0x02000009, 0x0A000009, 
+	0x02000401, 0x0A000401, 0x02000409, 0x0A000409, 
+	0x02020001, 0x0A020001, 0x02020009, 0x0A020009, 
+	0x02020401, 0x0A020401, 0x02020409, 0x0A020409, 
+);
+my @skb6 =
+(
+	# for D bits (numbered as per FIPS 46) 16 17 18 19 20 21
+	0x00000000, 0x00000100, 0x00080000, 0x00080100, 
+	0x01000000, 0x01000100, 0x01080000, 0x01080100, 
+	0x00000010, 0x00000110, 0x00080010, 0x00080110, 
+	0x01000010, 0x01000110, 0x01080010, 0x01080110, 
+	0x00200000, 0x00200100, 0x00280000, 0x00280100, 
+	0x01200000, 0x01200100, 0x01280000, 0x01280100, 
+	0x00200010, 0x00200110, 0x00280010, 0x00280110, 
+	0x01200010, 0x01200110, 0x01280010, 0x01280110, 
+	0x00000200, 0x00000300, 0x00080200, 0x00080300, 
+	0x01000200, 0x01000300, 0x01080200, 0x01080300, 
+	0x00000210, 0x00000310, 0x00080210, 0x00080310, 
+	0x01000210, 0x01000310, 0x01080210, 0x01080310, 
+	0x00200200, 0x00200300, 0x00280200, 0x00280300, 
+	0x01200200, 0x01200300, 0x01280200, 0x01280300, 
+	0x00200210, 0x00200310, 0x00280210, 0x00280310, 
+	0x01200210, 0x01200310, 0x01280210, 0x01280310, 
+);
+my @skb7 =
+(
+	# for D bits (numbered as per FIPS 46) 22 23 24 25 27 28
+	0x00000000, 0x04000000, 0x00040000, 0x04040000, 
+	0x00000002, 0x04000002, 0x00040002, 0x04040002, 
+	0x00002000, 0x04002000, 0x00042000, 0x04042000, 
+	0x00002002, 0x04002002, 0x00042002, 0x04042002, 
+	0x00000020, 0x04000020, 0x00040020, 0x04040020, 
+	0x00000022, 0x04000022, 0x00040022, 0x04040022, 
+	0x00002020, 0x04002020, 0x00042020, 0x04042020, 
+	0x00002022, 0x04002022, 0x00042022, 0x04042022, 
+	0x00000800, 0x04000800, 0x00040800, 0x04040800, 
+	0x00000802, 0x04000802, 0x00040802, 0x04040802, 
+	0x00002800, 0x04002800, 0x00042800, 0x04042800, 
+	0x00002802, 0x04002802, 0x00042802, 0x04042802, 
+	0x00000820, 0x04000820, 0x00040820, 0x04040820, 
+	0x00000822, 0x04000822, 0x00040822, 0x04040822, 
+	0x00002820, 0x04002820, 0x00042820, 0x04042820, 
+	0x00002822, 0x04002822, 0x00042822, 0x04042822, 
+);
+
+my @SPtrans0 =
+(
+	# nibble 0
+	0x00820200, 0x00020000, 0x80800000, 0x80820200,
+	0x00800000, 0x80020200, 0x80020000, 0x80800000,
+	0x80020200, 0x00820200, 0x00820000, 0x80000200,
+	0x80800200, 0x00800000, 0x00000000, 0x80020000,
+	0x00020000, 0x80000000, 0x00800200, 0x00020200,
+	0x80820200, 0x00820000, 0x80000200, 0x00800200,
+	0x80000000, 0x00000200, 0x00020200, 0x80820000,
+	0x00000200, 0x80800200, 0x80820000, 0x00000000,
+	0x00000000, 0x80820200, 0x00800200, 0x80020000,
+	0x00820200, 0x00020000, 0x80000200, 0x00800200,
+	0x80820000, 0x00000200, 0x00020200, 0x80800000,
+	0x80020200, 0x80000000, 0x80800000, 0x00820000,
+	0x80820200, 0x00020200, 0x00820000, 0x80800200,
+	0x00800000, 0x80000200, 0x80020000, 0x00000000,
+	0x00020000, 0x00800000, 0x80800200, 0x00820200,
+	0x80000000, 0x80820000, 0x00000200, 0x80020200,
+);
+my @SPtrans1 =
+(
+	# nibble 1
+	0x10042004, 0x00000000, 0x00042000, 0x10040000,
+	0x10000004, 0x00002004, 0x10002000, 0x00042000,
+	0x00002000, 0x10040004, 0x00000004, 0x10002000,
+	0x00040004, 0x10042000, 0x10040000, 0x00000004,
+	0x00040000, 0x10002004, 0x10040004, 0x00002000,
+	0x00042004, 0x10000000, 0x00000000, 0x00040004,
+	0x10002004, 0x00042004, 0x10042000, 0x10000004,
+	0x10000000, 0x00040000, 0x00002004, 0x10042004,
+	0x00040004, 0x10042000, 0x10002000, 0x00042004,
+	0x10042004, 0x00040004, 0x10000004, 0x00000000,
+	0x10000000, 0x00002004, 0x00040000, 0x10040004,
+	0x00002000, 0x10000000, 0x00042004, 0x10002004,
+	0x10042000, 0x00002000, 0x00000000, 0x10000004,
+	0x00000004, 0x10042004, 0x00042000, 0x10040000,
+	0x10040004, 0x00040000, 0x00002004, 0x10002000,
+	0x10002004, 0x00000004, 0x10040000, 0x00042000,
+);
+my @SPtrans2 =
+(
+	# nibble 2
+	0x41000000, 0x01010040, 0x00000040, 0x41000040,
+	0x40010000, 0x01000000, 0x41000040, 0x00010040,
+	0x01000040, 0x00010000, 0x01010000, 0x40000000,
+	0x41010040, 0x40000040, 0x40000000, 0x41010000,
+	0x00000000, 0x40010000, 0x01010040, 0x00000040,
+	0x40000040, 0x41010040, 0x00010000, 0x41000000,
+	0x41010000, 0x01000040, 0x40010040, 0x01010000,
+	0x00010040, 0x00000000, 0x01000000, 0x40010040,
+	0x01010040, 0x00000040, 0x40000000, 0x00010000,
+	0x40000040, 0x40010000, 0x01010000, 0x41000040,
+	0x00000000, 0x01010040, 0x00010040, 0x41010000,
+	0x40010000, 0x01000000, 0x41010040, 0x40000000,
+	0x40010040, 0x41000000, 0x01000000, 0x41010040,
+	0x00010000, 0x01000040, 0x41000040, 0x00010040,
+	0x01000040, 0x00000000, 0x41010000, 0x40000040,
+	0x41000000, 0x40010040, 0x00000040, 0x01010000,
+);
+my @SPtrans3 =
+(
+	# nibble 3
+	0x00100402, 0x04000400, 0x00000002, 0x04100402,
+	0x00000000, 0x04100000, 0x04000402, 0x00100002,
+	0x04100400, 0x04000002, 0x04000000, 0x00000402,
+	0x04000002, 0x00100402, 0x00100000, 0x04000000,
+	0x04100002, 0x00100400, 0x00000400, 0x00000002,
+	0x00100400, 0x04000402, 0x04100000, 0x00000400,
+	0x00000402, 0x00000000, 0x00100002, 0x04100400,
+	0x04000400, 0x04100002, 0x04100402, 0x00100000,
+	0x04100002, 0x00000402, 0x00100000, 0x04000002,
+	0x00100400, 0x04000400, 0x00000002, 0x04100000,
+	0x04000402, 0x00000000, 0x00000400, 0x00100002,
+	0x00000000, 0x04100002, 0x04100400, 0x00000400,
+	0x04000000, 0x04100402, 0x00100402, 0x00100000,
+	0x04100402, 0x00000002, 0x04000400, 0x00100402,
+	0x00100002, 0x00100400, 0x04100000, 0x04000402,
+	0x00000402, 0x04000000, 0x04000002, 0x04100400,
+);
+my @SPtrans4 =
+(
+	# nibble 4
+	0x02000000, 0x00004000, 0x00000100, 0x02004108,
+	0x02004008, 0x02000100, 0x00004108, 0x02004000,
+	0x00004000, 0x00000008, 0x02000008, 0x00004100,
+	0x02000108, 0x02004008, 0x02004100, 0x00000000,
+	0x00004100, 0x02000000, 0x00004008, 0x00000108,
+	0x02000100, 0x00004108, 0x00000000, 0x02000008,
+	0x00000008, 0x02000108, 0x02004108, 0x00004008,
+	0x02004000, 0x00000100, 0x00000108, 0x02004100,
+	0x02004100, 0x02000108, 0x00004008, 0x02004000,
+	0x00004000, 0x00000008, 0x02000008, 0x02000100,
+	0x02000000, 0x00004100, 0x02004108, 0x00000000,
+	0x00004108, 0x02000000, 0x00000100, 0x00004008,
+	0x02000108, 0x00000100, 0x00000000, 0x02004108,
+	0x02004008, 0x02004100, 0x00000108, 0x00004000,
+	0x00004100, 0x02004008, 0x02000100, 0x00000108,
+	0x00000008, 0x00004108, 0x02004000, 0x02000008,
+);
+my @SPtrans5 =
+(
+	# nibble 5
+	0x20000010, 0x00080010, 0x00000000, 0x20080800,
+	0x00080010, 0x00000800, 0x20000810, 0x00080000,
+	0x00000810, 0x20080810, 0x00080800, 0x20000000,
+	0x20000800, 0x20000010, 0x20080000, 0x00080810,
+	0x00080000, 0x20000810, 0x20080010, 0x00000000,
+	0x00000800, 0x00000010, 0x20080800, 0x20080010,
+	0x20080810, 0x20080000, 0x20000000, 0x00000810,
+	0x00000010, 0x00080800, 0x00080810, 0x20000800,
+	0x00000810, 0x20000000, 0x20000800, 0x00080810,
+	0x20080800, 0x00080010, 0x00000000, 0x20000800,
+	0x20000000, 0x00000800, 0x20080010, 0x00080000,
+	0x00080010, 0x20080810, 0x00080800, 0x00000010,
+	0x20080810, 0x00080800, 0x00080000, 0x20000810,
+	0x20000010, 0x20080000, 0x00080810, 0x00000000,
+	0x00000800, 0x20000010, 0x20000810, 0x20080800,
+	0x20080000, 0x00000810, 0x00000010, 0x20080010,
+);
+my @SPtrans6 =
+(
+	# nibble 6
+	0x00001000, 0x00000080, 0x00400080, 0x00400001,
+	0x00401081, 0x00001001, 0x00001080, 0x00000000,
+	0x00400000, 0x00400081, 0x00000081, 0x00401000,
+	0x00000001, 0x00401080, 0x00401000, 0x00000081,
+	0x00400081, 0x00001000, 0x00001001, 0x00401081,
+	0x00000000, 0x00400080, 0x00400001, 0x00001080,
+	0x00401001, 0x00001081, 0x00401080, 0x00000001,
+	0x00001081, 0x00401001, 0x00000080, 0x00400000,
+	0x00001081, 0x00401000, 0x00401001, 0x00000081,
+	0x00001000, 0x00000080, 0x00400000, 0x00401001,
+	0x00400081, 0x00001081, 0x00001080, 0x00000000,
+	0x00000080, 0x00400001, 0x00000001, 0x00400080,
+	0x00000000, 0x00400081, 0x00400080, 0x00001080,
+	0x00000081, 0x00001000, 0x00401081, 0x00400000,
+	0x00401080, 0x00000001, 0x00001001, 0x00401081,
+	0x00400001, 0x00401080, 0x00401000, 0x00001001,
+);
+my @SPtrans7 =
+(
+	# nibble 7
+	0x08200020, 0x08208000, 0x00008020, 0x00000000,
+	0x08008000, 0x00200020, 0x08200000, 0x08208020,
+	0x00000020, 0x08000000, 0x00208000, 0x00008020,
+	0x00208020, 0x08008020, 0x08000020, 0x08200000,
+	0x00008000, 0x00208020, 0x00200020, 0x08008000,
+	0x08208020, 0x08000020, 0x00000000, 0x00208000,
+	0x08000000, 0x00200000, 0x08008020, 0x08200020,
+	0x00200000, 0x00008000, 0x08208000, 0x00000020,
+	0x00200000, 0x00008000, 0x08000020, 0x08208020,
+	0x00008020, 0x08000000, 0x00000000, 0x00208000,
+	0x08200020, 0x08008020, 0x08008000, 0x00200020,
+	0x08208000, 0x00000020, 0x00200020, 0x08008000,
+	0x08208020, 0x00200000, 0x08200000, 0x08000020,
+	0x00208000, 0x00008020, 0x08008020, 0x08200000,
+	0x00000020, 0x08208000, 0x00208020, 0x00000000,
+	0x08000000, 0x08200020, 0x00008000, 0x00208020
+);
+
+my @cov_2char =
+(
+	0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 
+	0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 
+	0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 
+	0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 
+	0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x61, 0x62, 
+	0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 
+	0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 
+	0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A
+);
+
+sub ushr  # only for ints! (mimics the Java >>> operator)
+{
+	my ($n, $s) = @_;
+
+	$s &= 0x1f;
+
+	return( ($n >> $s) & (~0 >> $s) );
+}
+
+sub toByte
+{
+	my $value = shift;
+
+	$value &= 0xff;
+	$value = - ((~$value & 0xff) + 1)
+		if $value & 0x80;
+
+	return $value;
+}
+
+sub toInt
+{
+	my $value = shift;
+
+	$value = - ((~$value & 0xffffffff) + 1)
+		if $value & 0x80000000;
+
+	return $value;
+}
+
+sub byteToUnsigned # int byteToUnsigned(byte b)
+{
+	my $value = shift;
+
+	return( $value >= 0 ? $value : $value + 256 );
+}
+
+sub fourBytesToInt # int fourBytesToInt(byte b[], int offset)
+{
+	my ($b, $offset) = @_;
+	my $value;
+
+	$value  =  byteToUnsigned($b->[$offset++]);
+	$value |= (byteToUnsigned($b->[$offset++]) <<  8);
+	$value |= (byteToUnsigned($b->[$offset++]) << 16);
+	$value |= (byteToUnsigned($b->[$offset++]) << 24);
+
+	return toInt($value);
+}
+
+sub intToFourBytes # void intToFourBytes(int iValue, byte b[], int offset)
+{
+	my ($iValue, $b, $offset) = @_;
+
+	$b->[$offset++] = toByte(ushr($iValue, 0) & 0xff);
+	$b->[$offset++] = toByte(ushr($iValue, 8) & 0xff);
+	$b->[$offset++] = toByte(ushr($iValue,16) & 0xff);
+	$b->[$offset++] = toByte(ushr($iValue,24) & 0xff);
+
+	return undef;
+}
+
+sub PERM_OP # void PERM_OP(int a, int b, int n, int m, int results[])
+{
+	my ($a, $b, $n, $m, $results) = @_;
+	my $t;
+
+	$t = (ushr($a,$n) ^ $b) & $m;
+	$a ^= $t << $n;
+	$b ^= $t;
+
+	$results->[0] = toInt($a);
+	$results->[1] = toInt($b);
+
+	return undef;
+}
+
+sub HPERM_OP # void HPERM_OP(int a, int n, int m)
+{
+	my ($a, $n, $m) = @_;
+	my $t;
+
+	$t = (($a << (16 - $n)) ^ $a) & $m;
+	$a = $a ^ $t ^ ushr($t, 16 - $n);
+
+	return toInt($a);
+}
+
+sub des_set_key # int [] des_set_key(byte key[])
+{
+	my ($key) = @_;
+	my @schedule; $#schedule = $ITERATIONS * 2 -1;
+
+	my $c = fourBytesToInt($key, 0);
+	my $d = fourBytesToInt($key, 4);
+
+	my @results; $#results = 1;
+
+	PERM_OP($d, $c, 4, 0x0f0f0f0f, \@results);
+	$d = $results[0]; $c = $results[1];
+
+	$c = HPERM_OP($c, -2, 0xcccc0000);
+	$d = HPERM_OP($d, -2, 0xcccc0000);
+
+	PERM_OP($d, $c, 1, 0x55555555, \@results);
+	$d = $results[0]; $c = $results[1];
+
+	PERM_OP($c, $d, 8, 0x00ff00ff, \@results);
+	$c = $results[0]; $d = $results[1];
+
+	PERM_OP($d, $c, 1, 0x55555555, \@results);
+	$d = $results[0]; $c = $results[1];
+
+	$d = (    (($d & 0x000000ff) << 16) |     ($d & 0x0000ff00)  |
+	       ushr($d & 0x00ff0000,    16) | ushr($c & 0xf0000000, 4));
+	$c &= 0x0fffffff;
+
+	my ($s, $t);
+	my ($i, $j);
+
+	$j = 0;
+	for($i = 0; $i < $ITERATIONS; $i++)
+	{
+		if($shifts2[$i])
+		{
+			$c = ushr($c, 2) | ($c << 26);
+			$d = ushr($d, 2) | ($d << 26);
+		}
+		else
+		{
+			$c = ushr($c, 1) | ($c << 27);
+			$d = ushr($d, 1) | ($d << 27);
+		}
+
+		$c &= 0x0fffffff;
+		$d &= 0x0fffffff;
+
+		$s = $skb0[     ($c   ) & 0x3f                        ]|
+		     $skb1[(ushr($c, 6) & 0x03) | (ushr($c, 7) & 0x3c)]|
+		     $skb2[(ushr($c,13) & 0x0f) | (ushr($c,14) & 0x30)]|
+		     $skb3[(ushr($c,20) & 0x01) | (ushr($c,21) & 0x06) |
+		                                  (ushr($c,22) & 0x38)];
+
+		$t = $skb4[     ($d   ) & 0x3f                         ]|
+		     $skb5[(ushr($d, 7) & 0x03) | (ushr($d, 8) & 0x3c) ]|
+		     $skb6[ ushr($d,15) & 0x3f                         ]|
+		     $skb7[(ushr($d,21) & 0x0f) | (ushr($d,22) & 0x30)];
+
+		$schedule[$j++] = (    ($t << 16) | ($s & 0x0000ffff)) & 0xffffffff;
+		$s              = (ushr($s,   16) | ($t & 0xffff0000));
+
+		$s              = ($s << 4) | ushr($s,28);
+		$schedule[$j++] = $s & 0xffffffff;
+	}
+
+	return \@schedule;
+}
+
+sub D_ENCRYPT # int D_ENCRYPT(int L, int R, int S, int E0, int E1, int s[])
+{
+	my ($L, $R, $S, $E0, $E1, $s) = @_;
+	my ($t, $u, $v);
+
+	$v = $R ^ ushr($R,16);
+	$u = $v & $E0;
+	$v = $v & $E1;
+	$u = ($u ^ ($u << 16)) ^ $R ^ $s->[$S];
+	$t = ($v ^ ($v << 16)) ^ $R ^ $s->[$S + 1];
+	$t = ushr($t, 4) | ($t << 28);
+
+	$L ^= $SPtrans1[    ($t    ) & 0x3f] |
+	      $SPtrans3[ushr($t,  8) & 0x3f] |
+	      $SPtrans5[ushr($t, 16) & 0x3f] |
+	      $SPtrans7[ushr($t, 24) & 0x3f] |
+	      $SPtrans0[    ($u    ) & 0x3f] |
+	      $SPtrans2[ushr($u,  8) & 0x3f] |
+	      $SPtrans4[ushr($u, 16) & 0x3f] |
+	      $SPtrans6[ushr($u, 24) & 0x3f];
+
+	return $L;
+}
+
+sub body # int [] body(int schedule[], int Eswap0, int Eswap1)
+{
+	my ($schedule, $Eswap0, $Eswap1) = @_;
+	my $left  = 0;
+	my $right = 0;
+	my $t     = 0;
+
+	my ($i, $j);
+	for($j = 0; $j < 25; $j++)
+	{
+		for($i = 0; $i < $ITERATIONS * 2; $i += 4)
+		{
+			$left  = D_ENCRYPT($left,  $right, $i,     $Eswap0, $Eswap1, $schedule);
+			$right = D_ENCRYPT($right, $left,  $i + 2, $Eswap0, $Eswap1, $schedule);
+		}
+		$t     = $left; 
+		$left  = $right; 
+		$right = $t;
+	}
+
+	$t = $right;
+
+	$right = ushr($left, 1) | ($left << 31);
+	$left  = ushr($t   , 1) | ($t    << 31);
+
+	$left  &= 0xffffffff;
+	$right &= 0xffffffff;
+
+	my @results; $#results = 1;
+
+	PERM_OP($right, $left, 1, 0x55555555, \@results); 
+	$right = $results[0]; $left = $results[1];
+
+	PERM_OP($left, $right, 8, 0x00ff00ff, \@results); 
+	$left = $results[0]; $right = $results[1];
+
+	PERM_OP($right, $left, 2, 0x33333333, \@results); 
+	$right = $results[0]; $left = $results[1];
+
+	PERM_OP($left, $right, 16, 0x0000ffff, \@results);
+	$left = $results[0]; $right = $results[1];
+
+	PERM_OP($right, $left, 4, 0x0f0f0f0f, \@results);
+	$right = $results[0]; $left = $results[1];
+
+	my @out; $#out = 1;
+
+	$out[0] = $left; $out[1] = $right;
+
+	return \@out;
+}
+
+sub crypt($$) # String crypt(String plaintext, String salt)
+{
+	my ($plaintext, $salt) = @_;
+	my $buffer = '';
+
+	return $buffer if !defined $salt || $salt eq '';
+
+	$salt .= $salt if length $salt < 2;
+	$plaintext = '' if !defined $plaintext;
+ 
+	$buffer = substr $salt,0,2;
+
+	my $Eswap0 = $con_salt[ord(substr $salt,0,1)];
+	my $Eswap1 = $con_salt[ord(substr $salt,1,1)] << 4;
+
+	my @key;
+	@key[0..7] = (0) x 8;
+
+	my @iChar = map { ord($_) << 1 } split(//, $plaintext);
+	my $i;
+	for (my $i = 0; $i < @key && $i < @iChar; $i++) {
+		$key[$i] = toByte($iChar[$i]);
+	}
+
+	my $schedule = des_set_key(\@key);
+	my $out      = body($schedule, $Eswap0, $Eswap1);
+
+	my @b; $#b = 8;
+
+	intToFourBytes($out->[0], \@b, 0);
+	intToFourBytes($out->[1], \@b, 4);
+	$b[8] = 0;
+
+	my ($j, $c, $y, $u);
+	for($i = 2, $y = 0, $u = 0x80; $i < 13; $i++)
+	{
+		for($j = 0, $c = 0; $j < 6; $j++)
+		{
+			$c <<= 1;
+
+			$c |= 1 if ($b[$y] & $u) != 0;
+
+			$u >>= 1;
+
+			if($u == 0)
+			{
+				$y++;
+				$u = 0x80;
+			}
+		}
+		$buffer .= chr($cov_2char[$c]);
+	}
+
+	return $buffer;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Crypt::UnixCrypt - perl-only implementation of the C<crypt> function.
+
+=head1 SYNOPSIS
+
+  use Crypt::UnixCrypt;
+  $hashed = crypt($plaintext,$salt);
+
+  # always use this module's crypt
+  BEGIN { $Crypt::UnixCrpyt::OVERRIDE_BUILTIN = 1 }
+  use Crypt::UnixCrypt;
+
+=head1 DESCRIPTION
+
+This module is for all those poor souls whose perl port answers to the
+use of C<crypt()> with the message `The crypt() function is unimplemented
+due to excessive paranoia.'.
+
+This module won't overload a built-in C<crypt()> unless forced by a true
+value of the variable C<$Crypt::UnixCrypt::OVERRIDE_BUILTIN>.
+
+If you use this module, you probably neither have a built-in C<crypt()>
+function nor a L<crypt(3)> manpage; so I'll supply the appropriate portions
+of its description (from my Linux system) here:
+
+crypt is the password encryption function. It is based on the Data
+Encryption Standard algorithm with variations intended (among other
+things) to discourage use of hardware implementations of a key search.
+
+$plaintext is a user's typed password.
+
+$salt is a two-character string chosen from the set [a-zA-Z0-9./]. This
+string is used to perturb the algorithm in one of 4096 different ways.
+
+By taking the lowest 7 bit of each character of $plaintext (filling it up
+to 8 characters with zeros, if needed), a 56-bit key is obtained. This
+56-bit key is used to encrypt repeatedly a constant string (usually a
+string consisting of all zeros). The returned value points to the
+encrypted password, a series of 13 printable ASCII characters (the first
+two characters represent the salt itself).
+
+Warning: The key space consists of 2**56 equal 7.2e16 possible values.
+Exhaustive searches of this key space are possible using massively
+parallel computers. Software, such as crack(1), is available which will
+search the portion of this key space that is generally used by humans
+for passwords. Hence, password selection should, at minimum, avoid
+common words and names. The use of a passwd(1) program that checks for
+crackable passwords during the selection process is recommended.
+
+The DES algorithm itself has a few quirks which make the use of the
+crypt(3) interface a very poor choice for anything other than password
+authentication. If you are planning on using the crypt(3) interface for
+a cryptography project, don't do it: get a good book on encryption and
+one of the widely available DES libraries.
+
+=head1 COPYRIGHT
+
+This module is free software; you may redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 AUTHORS
+
+Written by Martin Vorlaender, martin@radiogaga.harz.de, 11-DEC-1997.
+Based upon Java source code written by jdumas@zgs.com, which in turn is
+based upon C source code written by Eric Young, eay@psych.uq.oz.au.
+
+=head1 CAVEATS
+
+In extreme situations, this function doesn't behave like C<crypt(3)>,
+e.g. when called with a salt not in [A-Za-z0-9./]{2}.
+
+=head1 SEE ALSO
+
+perl(1), perlfunc(1), crypt(3).
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/File/RandomAccess.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/File/RandomAccess.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/File/RandomAccess.pm	(revision 24799)
@@ -0,0 +1,378 @@
+#------------------------------------------------------------------------------
+# File:         RandomAccess.pm
+#
+# Description:  Buffer to support random access reading of sequential file
+#
+# Revisions:    02/11/2004 - P. Harvey Created
+#               02/20/2004 - P. Harvey Added flag to disable SeekTest in new()
+#               11/18/2004 - P. Harvey Fixed bug with seek relative to end of file
+#               01/02/2005 - P. Harvey Added DEBUG code
+#               01/09/2006 - P. Harvey Fixed bug in ReadLine() when using
+#                            multi-character EOL sequences
+#               02/20/2006 - P. Harvey Fixed bug where seek past end of file could
+#                            generate "substr outside string" warning
+#               06/10/2006 - P. Harvey Decreased $CHUNK_SIZE from 64k to 8k
+#               11/23/2006 - P. Harvey Limit reads to < 0x80000000 bytes
+#               11/26/2008 - P. Harvey Fixed bug in ReadLine when reading from a
+#                            scalar with a multi-character newline
+#               01/24/2009 - PH Protect against reading too much at once
+#
+# Notes:        Calls the normal file i/o routines unless SeekTest() fails, in
+#               which case the file is buffered in memory to allow random access.
+#               SeekTest() is called automatically when the object is created
+#               unless specified.
+#
+#               May also be used for string i/o (just pass a scalar reference)
+#
+# Legal:        Copyright (c) 2003-2010 Phil Harvey (phil at owl.phy.queensu.ca)
+#               This library is free software; you can redistribute it and/or
+#               modify it under the same terms as Perl itself.
+#------------------------------------------------------------------------------
+
+package File::RandomAccess;
+
+use strict;
+require 5.002;
+require Exporter;
+
+use vars qw($VERSION @ISA @EXPORT_OK);
+$VERSION = '1.10';
+@ISA = qw(Exporter);
+
+sub Read($$$);
+
+# constants
+my $CHUNK_SIZE = 8192;  # size of chunks to read from file (must be power of 2)
+my $SLURP_CHUNKS = 16;  # read this many chunks at a time when slurping
+
+#------------------------------------------------------------------------------
+# Create new RandomAccess object
+# Inputs: 0) reference to RandomAccess object or RandomAccess class name
+#         1) file reference or scalar reference
+#         2) flag set if file is already random access (disables automatic SeekTest)
+sub new($$;$)
+{
+    my ($that, $filePt, $isRandom) = @_;
+    my $class = ref($that) || $that;
+    my $self;
+
+    if (ref $filePt eq 'SCALAR') {
+        # string i/o
+        $self = {
+            BUFF_PT => $filePt,
+            POS => 0,
+            LEN => length($$filePt),
+            TESTED => -1,
+        };
+        bless $self, $class;
+    } else {
+        # file i/o
+        my $buff = '';
+        $self = {
+            FILE_PT => $filePt, # file pointer
+            BUFF_PT => \$buff,  # reference to file data
+            POS => 0,           # current position in file
+            LEN => 0,           # data length
+            TESTED => 0,        # 0=untested, 1=passed, -1=failed (requires buffering)
+        };
+        bless $self, $class;
+        $self->SeekTest() unless $isRandom;
+    }
+    return $self;
+}
+
+#------------------------------------------------------------------------------
+# Enable DEBUG code
+# Inputs: 0) reference to RandomAccess object
+sub Debug($)
+{
+    my $self = shift;
+    $self->{DEBUG} = { };
+}
+
+#------------------------------------------------------------------------------
+# Perform seek test and turn on buffering if necessary
+# Inputs: 0) reference to RandomAccess object
+# Returns: 1 if seek test passed (ie. no buffering required)
+# Notes: Must be done before any other i/o
+sub SeekTest($)
+{
+    my $self = shift;
+    unless ($self->{TESTED}) {
+        my $fp = $self->{FILE_PT};
+        if (seek($fp, 1, 1) and seek($fp, -1, 1)) {
+            $self->{TESTED} = 1;    # test passed
+        } else {
+            $self->{TESTED} = -1;   # test failed (requires buffering)
+        }
+    }
+    return $self->{TESTED} == 1 ? 1 : 0;
+}
+
+#------------------------------------------------------------------------------
+# Get current position in file
+# Inputs: 0) reference to RandomAccess object
+# Returns: current position in file
+sub Tell($)
+{
+    my $self = shift;
+    my $rtnVal;
+    if ($self->{TESTED} < 0) {
+        $rtnVal = $self->{POS};
+    } else {
+        $rtnVal = tell($self->{FILE_PT});
+    }
+    return $rtnVal;
+}
+
+#------------------------------------------------------------------------------
+# Seek to position in file
+# Inputs: 0) reference to RandomAccess object
+#         1) position, 2) whence (0 or undef=from start, 1=from cur pos, 2=from end)
+# Returns: 1 on success
+# Notes: When buffered, this doesn't quite behave like seek() since it will return
+#        success even if you seek outside the limits of the file.  However if you
+#        do this, you will get an error on your next Read().
+sub Seek($$;$)
+{
+    my ($self, $num, $whence) = @_;
+    $whence = 0 unless defined $whence;
+    my $rtnVal;
+    if ($self->{TESTED} < 0) {
+        my $newPos;
+        if ($whence == 0) {
+            $newPos = $num;                 # from start of file
+        } elsif ($whence == 1) {
+            $newPos = $num + $self->{POS};  # relative to current position
+        } else {
+            $self->Slurp();                 # read whole file into buffer
+            $newPos = $num + $self->{LEN};  # relative to end of file
+        }
+        if ($newPos >= 0) {
+            $self->{POS} = $newPos;
+            $rtnVal = 1;
+        }
+    } else {
+        $rtnVal = seek($self->{FILE_PT}, $num, $whence);
+    }
+    return $rtnVal;
+}
+
+#------------------------------------------------------------------------------
+# Read from the file
+# Inputs: 0) reference to RandomAccess object, 1) buffer, 2) bytes to read
+# Returns: Number of bytes read
+sub Read($$$)
+{
+    my $self = shift;
+    my $len = $_[1];
+    my $rtnVal;
+
+    # protect against reading too much at once
+    # (also from dying with a "Negative length" error)
+    if ($len & 0xf8000000) {
+        return 0 if $len < 0;
+        # read in smaller blocks because Windows attempts to pre-allocate
+        # memory for the full size, which can lead to an out-of-memory error
+        my $maxLen = 0x4000000; # (MUST be less than bitmask in "if" above)
+        my $num = Read($self, $_[0], $maxLen);
+        return $num if $num < $maxLen;
+        for (;;) {
+            $len -= $maxLen;
+            last if $len <= 0;
+            my $l = $len < $maxLen ? $len : $maxLen;
+            my $buff;
+            my $n = Read($self, $buff, $l);
+            last unless $n;
+            $_[0] .= $buff;
+            $num += $n;
+            last if $n < $l;
+        }
+        return $num;
+    }
+    # read through our buffer if necessary
+    if ($self->{TESTED} < 0) {
+        my $buff;
+        my $newPos = $self->{POS} + $len;
+        # number of bytes to read from file
+        my $num = $newPos - $self->{LEN};
+        if ($num > 0 and $self->{FILE_PT}) {
+            # read data from file in multiples of $CHUNK_SIZE
+            $num = (($num - 1) | ($CHUNK_SIZE - 1)) + 1;
+            $num = read($self->{FILE_PT}, $buff, $num);
+            if ($num) {
+                ${$self->{BUFF_PT}} .= $buff;
+                $self->{LEN} += $num;
+            }
+        }
+        # number of bytes left in data buffer
+        $num = $self->{LEN} - $self->{POS};
+        if ($len <= $num) {
+            $rtnVal = $len;
+        } elsif ($num <= 0) {
+            $_[0] = '';
+            return 0;
+        } else {
+            $rtnVal = $num;
+        }
+        # return data from our buffer
+        $_[0] = substr(${$self->{BUFF_PT}}, $self->{POS}, $rtnVal);
+        $self->{POS} += $rtnVal;
+    } else {
+        # read directly from file
+        $_[0] = '' unless defined $_[0];
+        $rtnVal = read($self->{FILE_PT}, $_[0], $len) || 0;
+    }
+    if ($self->{DEBUG}) {
+        my $pos = $self->Tell() - $rtnVal;
+        unless ($self->{DEBUG}->{$pos} and $self->{DEBUG}->{$pos} > $rtnVal) {
+            $self->{DEBUG}->{$pos} = $rtnVal;
+        }
+    }
+    return $rtnVal;
+}
+
+#------------------------------------------------------------------------------
+# Read a line from file (end of line is $/)
+# Inputs: 0) reference to RandomAccess object, 1) buffer
+# Returns: Number of bytes read
+sub ReadLine($$)
+{
+    my $self = shift;
+    my $rtnVal;
+    my $fp = $self->{FILE_PT};
+
+    if ($self->{TESTED} < 0) {
+        my ($num, $buff);
+        my $pos = $self->{POS};
+        if ($fp) {
+            # make sure we have some data after the current position
+            while ($self->{LEN} <= $pos) {
+                $num = read($fp, $buff, $CHUNK_SIZE);
+                return 0 unless $num;
+                ${$self->{BUFF_PT}} .= $buff;
+                $self->{LEN} += $num;
+            }
+            # scan and read until we find the EOL (or hit EOF)
+            for (;;) {
+                $pos = index(${$self->{BUFF_PT}}, $/, $pos);
+                if ($pos >= 0) {
+                    $pos += length($/);
+                    last;
+                }
+                $pos = $self->{LEN};    # have scanned to end of buffer
+                $num = read($fp, $buff, $CHUNK_SIZE) or last;
+                ${$self->{BUFF_PT}} .= $buff;
+                $self->{LEN} += $num;
+            }
+        } else {
+            # string i/o
+            $pos = index(${$self->{BUFF_PT}}, $/, $pos);
+            if ($pos < 0) {
+                $pos = $self->{LEN};
+                $self->{POS} = $pos if $self->{POS} > $pos;
+            } else {
+                $pos += length($/);
+            }
+        }
+        # read the line from our buffer
+        $rtnVal = $pos - $self->{POS};
+        $_[0] = substr(${$self->{BUFF_PT}}, $self->{POS}, $rtnVal);
+        $self->{POS} = $pos;
+    } else {
+        $_[0] = <$fp>;
+        if (defined $_[0]) {
+            $rtnVal = length($_[0]);
+        } else {
+            $rtnVal = 0;
+        }
+    }
+    if ($self->{DEBUG}) {
+        my $pos = $self->Tell() - $rtnVal;
+        unless ($self->{DEBUG}->{$pos} and $self->{DEBUG}->{$pos} > $rtnVal) {
+            $self->{DEBUG}->{$pos} = $rtnVal;
+        }
+    }
+    return $rtnVal;
+}
+
+#------------------------------------------------------------------------------
+# Read whole file into buffer (without changing read pointer)
+# Inputs: 0) reference to RandomAccess object
+sub Slurp($)
+{
+    my $self = shift;
+    my $fp = $self->{FILE_PT} || return;
+    # read whole file into buffer (in large chunks)
+    my ($buff, $num);
+    while (($num = read($fp, $buff, $CHUNK_SIZE * $SLURP_CHUNKS)) != 0) {
+        ${$self->{BUFF_PT}} .= $buff;
+        $self->{LEN} += $num;
+    }
+}
+
+
+#------------------------------------------------------------------------------
+# set binary mode
+# Inputs: 0) reference to RandomAccess object
+sub BinMode($)
+{
+    my $self = shift;
+    binmode($self->{FILE_PT}) if $self->{FILE_PT};
+}
+
+#------------------------------------------------------------------------------
+# close the file and free the buffer
+# Inputs: 0) reference to RandomAccess object
+sub Close($)
+{
+    my $self = shift;
+
+    if ($self->{DEBUG}) {
+        local $_;
+        if ($self->Seek(0,2)) {
+            $self->{DEBUG}->{$self->Tell()} = 0;    # set EOF marker
+            my $last;
+            my $tot = 0;
+            my $bad = 0;
+            foreach (sort { $a <=> $b } keys %{$self->{DEBUG}}) {
+                my $pos = $_;
+                my $len = $self->{DEBUG}->{$_};
+                if (defined $last and $last < $pos) {
+                    my $bytes = $pos - $last;
+                    $tot += $bytes;
+                    $self->Seek($last);
+                    my $buff;
+                    $self->Read($buff, $bytes);
+                    my $warn = '';
+                    if ($buff =~ /[^\0]/) {
+                        $bad += ($pos - $last);
+                        $warn = ' - NON-ZERO!';
+                    }
+                    printf "0x%.8x - 0x%.8x (%d bytes)$warn\n", $last, $pos, $bytes;
+                }
+                my $cur = $pos + $len;
+                $last = $cur unless defined $last and $last > $cur;
+            }
+            print "$tot bytes missed";
+            $bad and print ", $bad non-zero!";
+            print "\n";
+        } else {
+            warn "File::RandomAccess DEBUG not working (file already closed?)\n";
+        }
+        delete $self->{DEBUG};
+    }
+    # close the file
+    if ($self->{FILE_PT}) {
+        close($self->{FILE_PT});
+        delete $self->{FILE_PT};
+    }
+    # reset the buffer
+    my $emptyBuff = '';
+    $self->{BUFF_PT} = \$emptyBuff;
+    $self->{LEN} = 0;
+    $self->{POS} = 0;
+}
+
+#------------------------------------------------------------------------------
+1;  # end
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/File/RandomAccess.pod
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/File/RandomAccess.pod	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/File/RandomAccess.pod	(revision 24799)
@@ -0,0 +1,231 @@
+#------------------------------------------------------------------------------
+# File:         RandomAccess.pod -- Documentation for File::RandomAccess
+#
+# Description:  Buffer to support random access reading of sequential file
+#
+# Legal:        Copyright (c) 2003-2010 Phil Harvey (phil at owl.phy.queensu.ca)
+#               This library is free software; you can redistribute it and/or
+#               modify it under the same terms as Perl itself.
+#------------------------------------------------------------------------------
+
+=head1 NAME
+
+File::RandomAccess - Random access reads of sequential file or scalar
+
+=head1 SYNOPSIS
+
+    use File::RandomAccess;
+
+    $raf = new File::RandomAccess(\*FILE, $disableSeekTest);
+
+    $raf = new File::RandomAccess(\$data);
+
+    $err = $raf->Seek($pos);
+    $num = $raf->Read($buff, $bytes);
+
+=head1 DESCRIPTION
+
+Allows random access to sequential file by buffering the file if necessary.
+Also allows access to data in memory to be accessed as if it were a file.
+
+=head1 METHODS
+
+=over 4
+
+=item B<new>
+
+Creates a new RandomAccess object given a file reference or
+reference to data in memory.
+
+    # Read from open file or pipe
+    $raf = new File::RandomAccess(\*FILE);
+
+    # Read from data in memory
+    $raf = new File::RandomAccess(\$data);
+
+=over 4
+
+=item Inputs:
+
+0) Reference to RandomAccess object.
+
+1) File reference or scalar reference.
+
+2) flag set if file is already random access (disables automatic SeekTest).
+
+=item Returns:
+
+Reference to RandomAccess object.
+
+=back
+
+=item B<SeekTest>
+
+Performs test seek() on file to determine if buffering is necessary.  If
+the seek() fails, then the file is buffered to allow random access.
+B<SeekTest>() is automatically called from B<new> unless specified.
+
+    $result = $raf->SeekTest();
+
+=over 4
+
+=item Inputs:
+
+0) Reference to RandomAccess object.
+
+=item Returns:
+
+1 if seek test passed (ie. no buffering required).
+
+=item Notes:
+
+Must be called before any other i/o.
+
+=back
+
+=item B<Tell>
+
+Get current position in file
+
+    $pos = $raf->Tell();
+
+=over 4
+
+=item Inputs:
+
+0) Reference to RandomAccess object.
+
+=item Returns:
+
+Current position in file
+
+=back
+
+=item B<Seek>
+
+Seek to specified position in file.  When buffered, this doesn't quite
+behave like seek() since it returns success even if you seek outside the
+limits of the file.
+
+    $success = $raf->Seek($pos, 0);
+
+=over 4
+
+=item Inputs:
+
+0) Reference to RandomAccess object.
+
+1) Position.
+
+2) Whence (0=from start, 1=from cur pos, 2=from end).
+
+=item Returns:
+
+1 on success, 0 otherwise
+
+=back
+
+=item B<Read>
+
+Read data from the file.
+
+    $num = $raf->Read($buff, 1024);
+
+=over 4
+
+=item Inputs:
+
+0) Reference to RandomAccess object.
+
+1) Buffer.
+
+2) Number of bytes to read.
+
+=item Returns:
+
+Number of bytes actually read.
+
+=back
+
+=item B<ReadLine>
+
+Read a line from file (end of line is $/).
+
+=over 4
+
+=item Inputs:
+
+0) Reference to RandomAccess object.
+
+1) Buffer.
+
+=item Returns:
+
+Number of bytes read.
+
+=back
+
+=item B<Slurp>
+
+Read whole file into buffer, without changing read pointer.
+
+=over 4
+
+=item Inputs:
+
+0) Reference to RandomAccess object.
+
+=item Returns:
+
+Nothing.
+
+=back
+
+=item B<BinMode>
+
+Set binary mode for file.
+
+=over 4
+
+=item Inputs:
+
+0) Reference to RandomAccess object.
+
+=item Returns:
+
+Nothing.
+
+=back
+
+=item B<Close>
+
+Close the file and free the buffer.
+
+=over 4
+
+=item Inputs:
+
+0) Reference to RandomAccess object.
+
+=item Returns:
+
+Nothing.
+
+=back
+
+=back
+
+=head1 AUTHOR
+
+Copyright 2003-2011 Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
+# end
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/Entities.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/Entities.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/Entities.pm	(revision 24799)
@@ -0,0 +1,495 @@
+package HTML::Entities;
+
+# $Id: Entities.pm 22649 2010-08-17 02:03:34Z davidb $
+
+=head1 NAME
+
+HTML::Entities - Encode or decode strings with HTML entities
+
+=head1 SYNOPSIS
+
+ use HTML::Entities;
+
+ $a = "V&aring;re norske tegn b&oslash;r &#230res";
+ decode_entities($a);
+ encode_entities($a, "\200-\377");
+
+For example, this:
+
+ $input = "vis-à-vis Beyoncé's naïve\npapier-mâché résumé";
+ print encode_entities($input), "\n"
+
+Prints this out:
+
+ vis-&agrave;-vis Beyonc&eacute;'s na&iuml;ve
+ papier-m&acirc;ch&eacute; r&eacute;sum&eacute;
+
+=head1 DESCRIPTION
+
+This module deals with encoding and decoding of strings with HTML
+character entities.  The module provides the following functions:
+
+=over 4
+
+=item decode_entities( $string, ... )
+
+This routine replaces HTML entities found in the $string with the
+corresponding Unicode character.  Under perl 5.6 and earlier only
+characters in the Latin-1 range are replaced. Unrecognized
+entities are left alone.
+
+If multiple strings are provided as argument they are each decoded
+separately and the same number of strings are returned.
+
+If called in void context the arguments are decoded in-place.
+
+This routine is exported by default.
+
+=item _decode_entities( $string, \%entity2char )
+
+=item _decode_entities( $string, \%entity2char, $expand_prefix )
+
+This will in-place replace HTML entities in $string.  The %entity2char
+hash must be provided.  Named entities not found in the %entity2char
+hash are left alone.  Numeric entities are expanded unless their value
+overflow.
+
+The keys in %entity2char are the entity names to be expanded and their
+values are what they should expand into.  The values do not have to be
+single character strings.  If a key has ";" as suffix,
+then occurrences in $string are only expanded if properly terminated
+with ";".  Entities without ";" will be expanded regardless of how
+they are terminated for compatiblity with how common browsers treat
+entities in the Latin-1 range.
+
+If $expand_prefix is TRUE then entities without trailing ";" in
+%entity2char will even be expanded as a prefix of a longer
+unrecognized name.  The longest matching name in %entity2char will be
+used. This is mainly present for compatibility with an MSIE
+misfeature.
+
+   $string = "foo&nbspbar";
+   _decode_entities($string, { nb => "@", nbsp => "\xA0" }, 1);
+   print $string;  # will print "foo bar"
+
+This routine is exported by default.
+
+=item encode_entities( $string )
+
+=item encode_entities( $string, $unsafe_chars )
+
+This routine replaces unsafe characters in $string with their entity
+representation. A second argument can be given to specify which
+characters to consider unsafe (i.e., which to escape). The default set
+of characters to encode are control chars, high-bit chars, and the
+C<< < >>, C<< & >>, C<< > >>, C<< ' >> and C<< " >>
+characters.  But this, for example, would encode I<just> the
+C<< < >>, C<< & >>, C<< > >>, and C<< " >> characters:
+
+  $encoded = encode_entities($input, '<>&"');
+
+This routine is exported by default.
+
+=item encode_entities_numeric( $string )
+
+=item encode_entities_numeric( $string, $unsafe_chars )
+
+This routine works just like encode_entities, except that the replacement
+entities are always C<&#xI<hexnum>;> and never C<&I<entname>;>.  For
+example, C<encode_entities("r\xF4le")> returns "r&ocirc;le", but
+C<encode_entities_numeric("r\xF4le")> returns "r&#xF4;le".
+
+This routine is I<not> exported by default.  But you can always
+export it with C<use HTML::Entities qw(encode_entities_numeric);>
+or even C<use HTML::Entities qw(:DEFAULT encode_entities_numeric);>
+
+=back
+
+All these routines modify the string passed as the first argument, if
+called in a void context.  In scalar and array contexts, the encoded or
+decoded string is returned (without changing the input string).
+
+If you prefer not to import these routines into your namespace, you can
+call them as:
+
+  use HTML::Entities ();
+  $decoded = HTML::Entities::decode($a);
+  $encoded = HTML::Entities::encode($a);
+  $encoded = HTML::Entities::encode_numeric($a);
+
+The module can also export the %char2entity and the %entity2char
+hashes, which contain the mapping from all characters to the
+corresponding entities (and vice versa, respectively).
+
+=head1 COPYRIGHT
+
+Copyright 1995-2006 Gisle Aas. All rights reserved.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
+
+use strict;
+use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION);
+use vars qw(%entity2char %char2entity);
+
+require 5.004;
+require Exporter;
+@ISA = qw(Exporter);
+
+@EXPORT = qw(encode_entities decode_entities _decode_entities);
+@EXPORT_OK = qw(%entity2char %char2entity encode_entities_numeric);
+
+# The version we (Greenstone) seem to be using looks like it's come
+# from CVS/SVN and so does not parse the following sprintf statement
+# => Doesn't appear to be used anywhere in this file, so commenting out
+#
+#$VERSION = sprintf("%d.%02d", q$Revision: 22649 $ =~ /(\d+)\.(\d+)/);
+#sub Version { $VERSION; }
+
+require HTML::Parser;  # for fast XS implemented decode_entities
+
+
+%entity2char = (
+ # Some normal chars that have special meaning in SGML context
+ amp    => '&',  # ampersand 
+'gt'    => '>',  # greater than
+'lt'    => '<',  # less than
+ quot   => '"',  # double quote
+ apos   => "'",  # single quote
+
+ # PUBLIC ISO 8879-1986//ENTITIES Added Latin 1//EN//HTML
+ AElig	=> chr(198),  # capital AE diphthong (ligature)
+ Aacute	=> chr(193),  # capital A, acute accent
+ Acirc	=> chr(194),  # capital A, circumflex accent
+ Agrave	=> chr(192),  # capital A, grave accent
+ Aring	=> chr(197),  # capital A, ring
+ Atilde	=> chr(195),  # capital A, tilde
+ Auml	=> chr(196),  # capital A, dieresis or umlaut mark
+ Ccedil	=> chr(199),  # capital C, cedilla
+ ETH	=> chr(208),  # capital Eth, Icelandic
+ Eacute	=> chr(201),  # capital E, acute accent
+ Ecirc	=> chr(202),  # capital E, circumflex accent
+ Egrave	=> chr(200),  # capital E, grave accent
+ Euml	=> chr(203),  # capital E, dieresis or umlaut mark
+ Iacute	=> chr(205),  # capital I, acute accent
+ Icirc	=> chr(206),  # capital I, circumflex accent
+ Igrave	=> chr(204),  # capital I, grave accent
+ Iuml	=> chr(207),  # capital I, dieresis or umlaut mark
+ Ntilde	=> chr(209),  # capital N, tilde
+ Oacute	=> chr(211),  # capital O, acute accent
+ Ocirc	=> chr(212),  # capital O, circumflex accent
+ Ograve	=> chr(210),  # capital O, grave accent
+ Oslash	=> chr(216),  # capital O, slash
+ Otilde	=> chr(213),  # capital O, tilde
+ Ouml	=> chr(214),  # capital O, dieresis or umlaut mark
+ THORN	=> chr(222),  # capital THORN, Icelandic
+ Uacute	=> chr(218),  # capital U, acute accent
+ Ucirc	=> chr(219),  # capital U, circumflex accent
+ Ugrave	=> chr(217),  # capital U, grave accent
+ Uuml	=> chr(220),  # capital U, dieresis or umlaut mark
+ Yacute	=> chr(221),  # capital Y, acute accent
+ aacute	=> chr(225),  # small a, acute accent
+ acirc	=> chr(226),  # small a, circumflex accent
+ aelig	=> chr(230),  # small ae diphthong (ligature)
+ agrave	=> chr(224),  # small a, grave accent
+ aring	=> chr(229),  # small a, ring
+ atilde	=> chr(227),  # small a, tilde
+ auml	=> chr(228),  # small a, dieresis or umlaut mark
+ ccedil	=> chr(231),  # small c, cedilla
+ eacute	=> chr(233),  # small e, acute accent
+ ecirc	=> chr(234),  # small e, circumflex accent
+ egrave	=> chr(232),  # small e, grave accent
+ eth	=> chr(240),  # small eth, Icelandic
+ euml	=> chr(235),  # small e, dieresis or umlaut mark
+ iacute	=> chr(237),  # small i, acute accent
+ icirc	=> chr(238),  # small i, circumflex accent
+ igrave	=> chr(236),  # small i, grave accent
+ iuml	=> chr(239),  # small i, dieresis or umlaut mark
+ ntilde	=> chr(241),  # small n, tilde
+ oacute	=> chr(243),  # small o, acute accent
+ ocirc	=> chr(244),  # small o, circumflex accent
+ ograve	=> chr(242),  # small o, grave accent
+ oslash	=> chr(248),  # small o, slash
+ otilde	=> chr(245),  # small o, tilde
+ ouml	=> chr(246),  # small o, dieresis or umlaut mark
+ szlig	=> chr(223),  # small sharp s, German (sz ligature)
+ thorn	=> chr(254),  # small thorn, Icelandic
+ uacute	=> chr(250),  # small u, acute accent
+ ucirc	=> chr(251),  # small u, circumflex accent
+ ugrave	=> chr(249),  # small u, grave accent
+ uuml	=> chr(252),  # small u, dieresis or umlaut mark
+ yacute	=> chr(253),  # small y, acute accent
+ yuml	=> chr(255),  # small y, dieresis or umlaut mark
+
+ # Some extra Latin 1 chars that are listed in the HTML3.2 draft (21-May-96)
+ copy   => chr(169),  # copyright sign
+ reg    => chr(174),  # registered sign
+ nbsp   => chr(160),  # non breaking space
+
+ # Additional ISO-8859/1 entities listed in rfc1866 (section 14)
+ iexcl  => chr(161),
+ cent   => chr(162),
+ pound  => chr(163),
+ curren => chr(164),
+ yen    => chr(165),
+ brvbar => chr(166),
+ sect   => chr(167),
+ uml    => chr(168),
+ ordf   => chr(170),
+ laquo  => chr(171),
+'not'   => chr(172),    # not is a keyword in perl
+ shy    => chr(173),
+ macr   => chr(175),
+ deg    => chr(176),
+ plusmn => chr(177),
+ sup1   => chr(185),
+ sup2   => chr(178),
+ sup3   => chr(179),
+ acute  => chr(180),
+ micro  => chr(181),
+ para   => chr(182),
+ middot => chr(183),
+ cedil  => chr(184),
+ ordm   => chr(186),
+ raquo  => chr(187),
+ frac14 => chr(188),
+ frac12 => chr(189),
+ frac34 => chr(190),
+ iquest => chr(191),
+'times' => chr(215),    # times is a keyword in perl
+ divide => chr(247),
+
+ ( $] > 5.007 ? (
+  'OElig;'    => chr(338),
+  'oelig;'    => chr(339),
+  'Scaron;'   => chr(352),
+  'scaron;'   => chr(353),
+  'Yuml;'     => chr(376),
+  'fnof;'     => chr(402),
+  'circ;'     => chr(710),
+  'tilde;'    => chr(732),
+  'Alpha;'    => chr(913),
+  'Beta;'     => chr(914),
+  'Gamma;'    => chr(915),
+  'Delta;'    => chr(916),
+  'Epsilon;'  => chr(917),
+  'Zeta;'     => chr(918),
+  'Eta;'      => chr(919),
+  'Theta;'    => chr(920),
+  'Iota;'     => chr(921),
+  'Kappa;'    => chr(922),
+  'Lambda;'   => chr(923),
+  'Mu;'       => chr(924),
+  'Nu;'       => chr(925),
+  'Xi;'       => chr(926),
+  'Omicron;'  => chr(927),
+  'Pi;'       => chr(928),
+  'Rho;'      => chr(929),
+  'Sigma;'    => chr(931),
+  'Tau;'      => chr(932),
+  'Upsilon;'  => chr(933),
+  'Phi;'      => chr(934),
+  'Chi;'      => chr(935),
+  'Psi;'      => chr(936),
+  'Omega;'    => chr(937),
+  'alpha;'    => chr(945),
+  'beta;'     => chr(946),
+  'gamma;'    => chr(947),
+  'delta;'    => chr(948),
+  'epsilon;'  => chr(949),
+  'zeta;'     => chr(950),
+  'eta;'      => chr(951),
+  'theta;'    => chr(952),
+  'iota;'     => chr(953),
+  'kappa;'    => chr(954),
+  'lambda;'   => chr(955),
+  'mu;'       => chr(956),
+  'nu;'       => chr(957),
+  'xi;'       => chr(958),
+  'omicron;'  => chr(959),
+  'pi;'       => chr(960),
+  'rho;'      => chr(961),
+  'sigmaf;'   => chr(962),
+  'sigma;'    => chr(963),
+  'tau;'      => chr(964),
+  'upsilon;'  => chr(965),
+  'phi;'      => chr(966),
+  'chi;'      => chr(967),
+  'psi;'      => chr(968),
+  'omega;'    => chr(969),
+  'thetasym;' => chr(977),
+  'upsih;'    => chr(978),
+  'piv;'      => chr(982),
+  'ensp;'     => chr(8194),
+  'emsp;'     => chr(8195),
+  'thinsp;'   => chr(8201),
+  'zwnj;'     => chr(8204),
+  'zwj;'      => chr(8205),
+  'lrm;'      => chr(8206),
+  'rlm;'      => chr(8207),
+  'ndash;'    => chr(8211),
+  'mdash;'    => chr(8212),
+  'lsquo;'    => chr(8216),
+  'rsquo;'    => chr(8217),
+  'sbquo;'    => chr(8218),
+  'ldquo;'    => chr(8220),
+  'rdquo;'    => chr(8221),
+  'bdquo;'    => chr(8222),
+  'dagger;'   => chr(8224),
+  'Dagger;'   => chr(8225),
+  'bull;'     => chr(8226),
+  'hellip;'   => chr(8230),
+  'permil;'   => chr(8240),
+  'prime;'    => chr(8242),
+  'Prime;'    => chr(8243),
+  'lsaquo;'   => chr(8249),
+  'rsaquo;'   => chr(8250),
+  'oline;'    => chr(8254),
+  'frasl;'    => chr(8260),
+  'euro;'     => chr(8364),
+  'image;'    => chr(8465),
+  'weierp;'   => chr(8472),
+  'real;'     => chr(8476),
+  'trade;'    => chr(8482),
+  'alefsym;'  => chr(8501),
+  'larr;'     => chr(8592),
+  'uarr;'     => chr(8593),
+  'rarr;'     => chr(8594),
+  'darr;'     => chr(8595),
+  'harr;'     => chr(8596),
+  'crarr;'    => chr(8629),
+  'lArr;'     => chr(8656),
+  'uArr;'     => chr(8657),
+  'rArr;'     => chr(8658),
+  'dArr;'     => chr(8659),
+  'hArr;'     => chr(8660),
+  'forall;'   => chr(8704),
+  'part;'     => chr(8706),
+  'exist;'    => chr(8707),
+  'empty;'    => chr(8709),
+  'nabla;'    => chr(8711),
+  'isin;'     => chr(8712),
+  'notin;'    => chr(8713),
+  'ni;'       => chr(8715),
+  'prod;'     => chr(8719),
+  'sum;'      => chr(8721),
+  'minus;'    => chr(8722),
+  'lowast;'   => chr(8727),
+  'radic;'    => chr(8730),
+  'prop;'     => chr(8733),
+  'infin;'    => chr(8734),
+  'ang;'      => chr(8736),
+  'and;'      => chr(8743),
+  'or;'       => chr(8744),
+  'cap;'      => chr(8745),
+  'cup;'      => chr(8746),
+  'int;'      => chr(8747),
+  'there4;'   => chr(8756),
+  'sim;'      => chr(8764),
+  'cong;'     => chr(8773),
+  'asymp;'    => chr(8776),
+  'ne;'       => chr(8800),
+  'equiv;'    => chr(8801),
+  'le;'       => chr(8804),
+  'ge;'       => chr(8805),
+  'sub;'      => chr(8834),
+  'sup;'      => chr(8835),
+  'nsub;'     => chr(8836),
+  'sube;'     => chr(8838),
+  'supe;'     => chr(8839),
+  'oplus;'    => chr(8853),
+  'otimes;'   => chr(8855),
+  'perp;'     => chr(8869),
+  'sdot;'     => chr(8901),
+  'lceil;'    => chr(8968),
+  'rceil;'    => chr(8969),
+  'lfloor;'   => chr(8970),
+  'rfloor;'   => chr(8971),
+  'lang;'     => chr(9001),
+  'rang;'     => chr(9002),
+  'loz;'      => chr(9674),
+  'spades;'   => chr(9824),
+  'clubs;'    => chr(9827),
+  'hearts;'   => chr(9829),
+  'diams;'    => chr(9830),
+ ) : ())
+);
+
+
+# Make the opposite mapping
+while (my($entity, $char) = each(%entity2char)) {
+    $entity =~ s/;\z//;
+    $char2entity{$char} = "&$entity;";
+}
+delete $char2entity{"'"};  # only one-way decoding
+
+# Fill in missing entities
+for (0 .. 255) {
+    next if exists $char2entity{chr($_)};
+    $char2entity{chr($_)} = "&#$_;";
+}
+
+my %subst;  # compiled encoding regexps
+
+sub decode_entities_old
+{
+    my $array;
+    if (defined wantarray) {
+	$array = [@_]; # copy
+    } else {
+	$array = \@_;  # modify in-place
+    }
+    my $c;
+    for (@$array) {
+	s/(&\#(\d+);?)/$2 < 256 ? chr($2) : $1/eg;
+	s/(&\#[xX]([0-9a-fA-F]+);?)/$c = hex($2); $c < 256 ? chr($c) : $1/eg;
+	s/(&(\w+);?)/$entity2char{$2} || $1/eg;
+    }
+    wantarray ? @$array : $array->[0];
+}
+
+sub encode_entities
+{
+    my $ref;
+    if (defined wantarray) {
+	my $x = $_[0];
+	$ref = \$x;     # copy
+    } else {
+	$ref = \$_[0];  # modify in-place
+    }
+    if (defined $_[1] and length $_[1]) {
+	unless (exists $subst{$_[1]}) {
+	    # Because we can't compile regex we fake it with a cached sub
+	    my $code = "sub {\$_[0] =~ s/([$_[1]])/\$char2entity{\$1} || num_entity(\$1)/ge; }";
+	    $subst{$_[1]} = eval $code;
+	    die( $@ . " while trying to turn range: \"$_[1]\"\n "
+	      . "into code: $code\n "
+	    ) if $@;
+	}
+	&{$subst{$_[1]}}($$ref);
+    } else {
+	# Encode control chars, high bit chars and '<', '&', '>', ''' and '"'
+	$$ref =~ s/([^\n\r\t !\#\$%\(-;=?-~])/$char2entity{$1} || num_entity($1)/ge;
+    }
+    $$ref;
+}
+
+sub encode_entities_numeric {
+    local %char2entity;
+    return &encode_entities;   # a goto &encode_entities wouldn't work
+}
+
+
+sub num_entity {
+    sprintf "&#x%X;", ord($_[0]);
+}
+
+# Set up aliases
+*encode = \&encode_entities;
+*encode_numeric = \&encode_entities_numeric;
+*encode_numerically = \&encode_entities_numeric;
+*decode = \&decode_entities;
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/Filter.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/Filter.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/Filter.pm	(revision 24799)
@@ -0,0 +1,112 @@
+package HTML::Filter;
+
+use strict;
+use vars qw(@ISA $VERSION);
+
+require HTML::Parser;
+@ISA=qw(HTML::Parser);
+
+$VERSION = sprintf("%d.%02d", q$Revision: 14078 $ =~ /(\d+)\.(\d+)/);
+
+sub declaration { $_[0]->output("<!$_[1]>")     }
+sub process     { $_[0]->output($_[2])          }
+sub comment     { $_[0]->output("<!--$_[1]-->") }
+sub start       { $_[0]->output($_[4])          }
+sub end         { $_[0]->output($_[2])          }
+sub text        { $_[0]->output($_[1])          }
+
+sub output      { print $_[1] }
+
+1;
+
+__END__
+
+=head1 NAME
+
+HTML::Filter - Filter HTML text through the parser
+
+=head1 NOTE
+
+B<This module is deprecated.> The C<HTML::Parser> now provides the
+functionally of C<HTML::Filter> much more efficiently with the the
+C<default> handler.
+
+=head1 SYNOPSIS
+
+ require HTML::Filter;
+ $p = HTML::Filter->new->parse_file("index.html");
+
+=head1 DESCRIPTION
+
+C<HTML::Filter> is an HTML parser that by default prints the
+original text of each HTML element (a slow version of cat(1) basically).
+The callback methods may be overridden to modify the filtering for some
+HTML elements and you can override output() method which is called to
+print the HTML text.
+
+C<HTML::Filter> is a subclass of C<HTML::Parser>. This means that
+the document should be given to the parser by calling the $p->parse()
+or $p->parse_file() methods.
+
+=head1 EXAMPLES
+
+The first example is a filter that will remove all comments from an
+HTML file.  This is achieved by simply overriding the comment method
+to do nothing.
+
+  package CommentStripper;
+  require HTML::Filter;
+  @ISA=qw(HTML::Filter);
+  sub comment { }  # ignore comments
+
+The second example shows a filter that will remove any E<lt>TABLE>s
+found in the HTML file.  We specialize the start() and end() methods
+to count table tags and then make output not happen when inside a
+table.
+
+  package TableStripper;
+  require HTML::Filter;
+  @ISA=qw(HTML::Filter);
+  sub start
+  {
+     my $self = shift;
+     $self->{table_seen}++ if $_[0] eq "table";
+     $self->SUPER::start(@_);
+  }
+
+  sub end
+  {
+     my $self = shift;
+     $self->SUPER::end(@_);
+     $self->{table_seen}-- if $_[0] eq "table";
+  }
+
+  sub output
+  {
+      my $self = shift;
+      unless ($self->{table_seen}) {
+	  $self->SUPER::output(@_);
+      }
+  }
+
+If you want to collect the parsed text internally you might want to do
+something like this:
+
+  package FilterIntoString;
+  require HTML::Filter;
+  @ISA=qw(HTML::Filter);
+  sub output { push(@{$_[0]->{fhtml}}, $_[1]) }
+  sub filtered_html { join("", @{$_[0]->{fhtml}}) }
+
+=head1 SEE ALSO
+
+L<HTML::Parser>
+
+=head1 COPYRIGHT
+
+Copyright 1997-1999 Gisle Aas.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/HeadParser.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/HeadParser.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/HeadParser.pm	(revision 24799)
@@ -0,0 +1,259 @@
+package HTML::HeadParser;
+
+=head1 NAME
+
+HTML::HeadParser - Parse <HEAD> section of a HTML document
+
+=head1 SYNOPSIS
+
+ require HTML::HeadParser;
+ $p = HTML::HeadParser->new;
+ $p->parse($text) and  print "not finished";
+
+ $p->header('Title')          # to access <title>....</title>
+ $p->header('Content-Base')   # to access <base href="http://...">
+ $p->header('Foo')            # to access <meta http-equiv="Foo" content="...">
+
+=head1 DESCRIPTION
+
+The C<HTML::HeadParser> is a specialized (and lightweight)
+C<HTML::Parser> that will only parse the E<lt>HEAD>...E<lt>/HEAD>
+section of an HTML document.  The parse() method
+will return a FALSE value as soon as some E<lt>BODY> element or body
+text are found, and should not be called again after this.
+
+Note that the C<HTML::HeadParser> might get confused if raw undecoded
+UTF-8 is passed to the parse() method.  Make sure the strings are
+properly decoded before passing them on.
+
+The C<HTML::HeadParser> keeps a reference to a header object, and the
+parser will update this header object as the various elements of the
+E<lt>HEAD> section of the HTML document are recognized.  The following
+header fields are affected:
+
+=over 4
+
+=item Content-Base:
+
+The I<Content-Base> header is initialized from the E<lt>base
+href="..."> element.
+
+=item Title:
+
+The I<Title> header is initialized from the E<lt>title>...E<lt>/title>
+element.
+
+=item Isindex:
+
+The I<Isindex> header will be added if there is a E<lt>isindex>
+element in the E<lt>head>.  The header value is initialized from the
+I<prompt> attribute if it is present.  If no I<prompt> attribute is
+given it will have '?' as the value.
+
+=item X-Meta-Foo:
+
+All E<lt>meta> elements will initialize headers with the prefix
+"C<X-Meta->" on the name.  If the E<lt>meta> element contains a
+C<http-equiv> attribute, then it will be honored as the header name.
+
+=back
+
+=head1 METHODS
+
+The following methods (in addition to those provided by the
+superclass) are available:
+
+=over 4
+
+=cut
+
+
+require HTML::Parser;
+@ISA = qw(HTML::Parser);
+
+use HTML::Entities ();
+
+use strict;
+use vars qw($VERSION $DEBUG);
+#$DEBUG = 1;
+$VERSION = sprintf("%d.%02d", q$Revision: 14078 $ =~ /(\d+)\.(\d+)/);
+
+=item $hp = HTML::HeadParser->new
+
+=item $hp = HTML::HeadParser->new( $header )
+
+The object constructor.  The optional $header argument should be a
+reference to an object that implement the header() and push_header()
+methods as defined by the C<HTTP::Headers> class.  Normally it will be
+of some class that isa or delegates to the C<HTTP::Headers> class.
+
+If no $header is given C<HTML::HeadParser> will create an
+C<HTTP::Header> object by itself (initially empty).
+
+=cut
+
+sub new
+{
+    my($class, $header) = @_;
+    unless ($header) {
+	require HTTP::Headers;
+	$header = HTTP::Headers->new;
+    }
+
+    my $self = $class->SUPER::new(api_version => 2,
+				  ignore_elements => [qw(script style)],
+				 );
+    $self->{'header'} = $header;
+    $self->{'tag'} = '';   # name of active element that takes textual content
+    $self->{'text'} = '';  # the accumulated text associated with the element
+    $self;
+}
+
+=item $hp->header;
+
+Returns a reference to the header object.
+
+=item $hp->header( $key )
+
+Returns a header value.  It is just a shorter way to write
+C<$hp-E<gt>header-E<gt>header($key)>.
+
+=cut
+
+sub header
+{
+    my $self = shift;
+    return $self->{'header'} unless @_;
+    $self->{'header'}->header(@_);
+}
+
+sub as_string    # legacy
+{
+    my $self = shift;
+    $self->{'header'}->as_string;
+}
+
+sub flush_text   # internal
+{
+    my $self = shift;
+    my $tag  = $self->{'tag'};
+    my $text = $self->{'text'};
+    $text =~ s/^\s+//;
+    $text =~ s/\s+$//;
+    $text =~ s/\s+/ /g;
+    print "FLUSH $tag => '$text'\n"  if $DEBUG;
+    if ($tag eq 'title') {
+	HTML::Entities::decode($text);
+	$self->{'header'}->push_header(Title => $text);
+    }
+    $self->{'tag'} = $self->{'text'} = '';
+}
+
+# This is an quote from the HTML3.2 DTD which shows which elements
+# that might be present in a <HEAD>...</HEAD>.  Also note that the
+# <HEAD> tags themselves might be missing:
+#
+# <!ENTITY % head.content "TITLE & ISINDEX? & BASE? & STYLE? &
+#                            SCRIPT* & META* & LINK*">
+#
+# <!ELEMENT HEAD O O  (%head.content)>
+
+
+sub start
+{
+    my($self, $tag, $attr) = @_;  # $attr is reference to a HASH
+    print "START[$tag]\n" if $DEBUG;
+    $self->flush_text if $self->{'tag'};
+    if ($tag eq 'meta') {
+	my $key = $attr->{'http-equiv'};
+	if (!defined($key) || !length($key)) {
+	    return unless $attr->{'name'};
+	    $key = "X-Meta-\u$attr->{'name'}";
+	}
+	$self->{'header'}->push_header($key => $attr->{content});
+    } elsif ($tag eq 'base') {
+	return unless exists $attr->{href};
+	$self->{'header'}->push_header('Content-Base' => $attr->{href});
+    } elsif ($tag eq 'isindex') {
+	# This is a non-standard header.  Perhaps we should just ignore
+	# this element
+	$self->{'header'}->push_header(Isindex => $attr->{prompt} || '?');
+    } elsif ($tag =~ /^(?:title|script|style)$/) {
+	# Just remember tag.  Initialize header when we see the end tag.
+	$self->{'tag'} = $tag;
+    } elsif ($tag eq 'link') {
+	return unless exists $attr->{href};
+	# <link href="http:..." rel="xxx" rev="xxx" title="xxx">
+	my $h_val = "<" . delete($attr->{href}) . ">";
+	for (sort keys %{$attr}) {
+	    $h_val .= qq(; $_="$attr->{$_}");
+	}
+	$self->{'header'}->push_header(Link => $h_val);
+    } elsif ($tag eq 'head' || $tag eq 'html') {
+	# ignore
+    } else {
+	 # stop parsing
+	$self->eof;
+    }
+}
+
+sub end
+{
+    my($self, $tag) = @_;
+    print "END[$tag]\n" if $DEBUG;
+    $self->flush_text if $self->{'tag'};
+    $self->eof if $tag eq 'head';
+}
+
+sub text
+{
+    my($self, $text) = @_;
+    $text =~ s/\x{FEFF}//;  # drop Unicode BOM if found
+    print "TEXT[$text]\n" if $DEBUG;
+    my $tag = $self->{tag};
+    if (!$tag && $text =~ /\S/) {
+	# Normal text means start of body
+        $self->eof;
+	return;
+    }
+    return if $tag ne 'title';
+    $self->{'text'} .= $text;
+}
+
+1;
+
+__END__
+
+=back
+
+=head1 EXAMPLE
+
+ $h = HTTP::Headers->new;
+ $p = HTML::HeadParser->new($h);
+ $p->parse(<<EOT);
+ <title>Stupid example</title>
+ <base href="http://www.linpro.no/lwp/">
+ Normal text starts here.
+ EOT
+ undef $p;
+ print $h->title;   # should print "Stupid example"
+
+=head1 SEE ALSO
+
+L<HTML::Parser>, L<HTTP::Headers>
+
+The C<HTTP::Headers> class is distributed as part of the
+I<libwww-perl> package.  If you don't have that distribution installed
+you need to provide the $header argument to the C<HTML::HeadParser>
+constructor with your own object that implements the documented
+protocol.
+
+=head1 COPYRIGHT
+
+Copyright 1996-2001 Gisle Aas. All rights reserved.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/LinkExtor.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/LinkExtor.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/LinkExtor.pm	(revision 24799)
@@ -0,0 +1,187 @@
+package HTML::LinkExtor;
+
+# $Id: LinkExtor.pm 14078 2007-05-17 03:15:41Z lh92 $
+
+require HTML::Parser;
+@ISA = qw(HTML::Parser);
+$VERSION = sprintf("%d.%02d", q$Revision: 14078 $ =~ /(\d+)\.(\d+)/);
+
+=head1 NAME
+
+HTML::LinkExtor - Extract links from an HTML document
+
+=head1 SYNOPSIS
+
+ require HTML::LinkExtor;
+ $p = HTML::LinkExtor->new(\&cb, "http://www.perl.org/");
+ sub cb {
+     my($tag, %links) = @_;
+     print "$tag @{[%links]}\n";
+ }
+ $p->parse_file("index.html");
+
+=head1 DESCRIPTION
+
+I<HTML::LinkExtor> is an HTML parser that extracts links from an
+HTML document.  The I<HTML::LinkExtor> is a subclass of
+I<HTML::Parser>. This means that the document should be given to the
+parser by calling the $p->parse() or $p->parse_file() methods.
+
+=cut
+
+use strict;
+use HTML::Tagset ();
+
+# legacy (some applications grabs this hash directly)
+use vars qw(%LINK_ELEMENT);
+*LINK_ELEMENT = \%HTML::Tagset::linkElements;
+
+=over 4
+
+=item $p = HTML::LinkExtor->new
+
+=item $p = HTML::LinkExtor->new( $callback )
+
+=item $p = HTML::LinkExtor->new( $callback, $base )
+
+The constructor takes two optional arguments. The first is a reference
+to a callback routine. It will be called as links are found. If a
+callback is not provided, then links are just accumulated internally
+and can be retrieved by calling the $p->links() method.
+
+The $base argument is an optional base URL used to absolutize all URLs found.
+You need to have the I<URI> module installed if you provide $base.
+
+The callback is called with the lowercase tag name as first argument,
+and then all link attributes as separate key/value pairs.  All
+non-link attributes are removed.
+
+=cut
+
+sub new
+{
+    my($class, $cb, $base) = @_;
+    my $self = $class->SUPER::new(
+                    start_h => ["_start_tag", "self,tagname,attr"],
+		    report_tags => [keys %HTML::Tagset::linkElements],
+	       );
+    $self->{extractlink_cb} = $cb;
+    if ($base) {
+	require URI;
+	$self->{extractlink_base} = URI->new($base);
+    }
+    $self;
+}
+
+sub _start_tag
+{
+    my($self, $tag, $attr) = @_;
+
+    my $base = $self->{extractlink_base};
+    my $links = $HTML::Tagset::linkElements{$tag};
+    $links = [$links] unless ref $links;
+
+    my @links;
+    my $a;
+    for $a (@$links) {
+	next unless exists $attr->{$a};
+	push(@links, $a, $base ? URI->new($attr->{$a}, $base)->abs($base)
+                               : $attr->{$a});
+    }
+    return unless @links;
+    $self->_found_link($tag, @links);
+}
+
+sub _found_link
+{
+    my $self = shift;
+    my $cb = $self->{extractlink_cb};
+    if ($cb) {
+	&$cb(@_);
+    } else {
+	push(@{$self->{'links'}}, [@_]);
+    }
+}
+
+=item $p->links
+
+Returns a list of all links found in the document.  The returned
+values will be anonymous arrays with the follwing elements:
+
+  [$tag, $attr => $url1, $attr2 => $url2,...]
+
+The $p->links method will also truncate the internal link list.  This
+means that if the method is called twice without any parsing
+between them the second call will return an empty list.
+
+Also note that $p->links will always be empty if a callback routine
+was provided when the I<HTML::LinkExtor> was created.
+
+=cut
+
+sub links
+{
+    my $self = shift;
+    exists($self->{'links'}) ? @{delete $self->{'links'}} : ();
+}
+
+# We override the parse_file() method so that we can clear the links
+# before we start a new file.
+sub parse_file
+{
+    my $self = shift;
+    delete $self->{'links'};
+    $self->SUPER::parse_file(@_);
+}
+
+=back
+
+=head1 EXAMPLE
+
+This is an example showing how you can extract links from a document
+received using LWP:
+
+  use LWP::UserAgent;
+  use HTML::LinkExtor;
+  use URI::URL;
+
+  $url = "http://www.perl.org/";  # for instance
+  $ua = LWP::UserAgent->new;
+
+  # Set up a callback that collect image links
+  my @imgs = ();
+  sub callback {
+     my($tag, %attr) = @_;
+     return if $tag ne 'img';  # we only look closer at <img ...>
+     push(@imgs, values %attr);
+  }
+
+  # Make the parser.  Unfortunately, we don't know the base yet
+  # (it might be diffent from $url)
+  $p = HTML::LinkExtor->new(\&callback);
+
+  # Request document and parse it as it arrives
+  $res = $ua->request(HTTP::Request->new(GET => $url),
+                      sub {$p->parse($_[0])});
+
+  # Expand all image URLs to absolute ones
+  my $base = $res->base;
+  @imgs = map { $_ = url($_, $base)->abs; } @imgs;
+
+  # Print them out
+  print join("\n", @imgs), "\n";
+
+=head1 SEE ALSO
+
+L<HTML::Parser>, L<HTML::Tagset>, L<LWP>, L<URI::URL>
+
+=head1 COPYRIGHT
+
+Copyright 1996-2001 Gisle Aas.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/Parser.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/Parser.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/Parser.pm	(revision 24799)
@@ -0,0 +1,1233 @@
+package HTML::Parser;
+
+# Copyright 1996-2007, Gisle Aas.
+# Copyright 1999-2000, Michael A. Chase.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+use strict;
+use vars qw($VERSION @ISA);
+
+$VERSION = '3.56';  # $Date: 2007-05-17 15:15:41 +1200 (Thu, 17 May 2007) $
+
+require HTML::Entities;
+
+require XSLoader;
+XSLoader::load('HTML::Parser', $VERSION);
+
+sub new
+{
+    my $class = shift;
+    my $self = bless {}, $class;
+    return $self->init(@_);
+}
+
+
+sub init
+{
+    my $self = shift;
+    $self->_alloc_pstate;
+
+    my %arg = @_;
+    my $api_version = delete $arg{api_version} || (@_ ? 3 : 2);
+    if ($api_version >= 4) {
+	require Carp;
+	Carp::croak("API version $api_version not supported " .
+		    "by HTML::Parser $VERSION");
+    }
+
+    if ($api_version < 3) {
+	# Set up method callbacks compatible with HTML-Parser-2.xx
+	$self->handler(text    => "text",    "self,text,is_cdata");
+	$self->handler(end     => "end",     "self,tagname,text");
+	$self->handler(process => "process", "self,token0,text");
+	$self->handler(start   => "start",
+		                  "self,tagname,attr,attrseq,text");
+
+	$self->handler(comment =>
+		       sub {
+			   my($self, $tokens) = @_;
+			   for (@$tokens) {
+			       $self->comment($_);
+			   }
+		       }, "self,tokens");
+
+	$self->handler(declaration =>
+		       sub {
+			   my $self = shift;
+			   $self->declaration(substr($_[0], 2, -1));
+		       }, "self,text");
+    }
+
+    if (my $h = delete $arg{handlers}) {
+	$h = {@$h} if ref($h) eq "ARRAY";
+	while (my($event, $cb) = each %$h) {
+	    $self->handler($event => @$cb);
+	}
+    }
+
+    # In the end we try to assume plain attribute or handler
+    while (my($option, $val) = each %arg) {
+	if ($option =~ /^(\w+)_h$/) {
+	    $self->handler($1 => @$val);
+	}
+        elsif ($option =~ /^(text|start|end|process|declaration|comment)$/) {
+	    require Carp;
+	    Carp::croak("Bad constructor option '$option'");
+        }
+	else {
+	    $self->$option($val);
+	}
+    }
+
+    return $self;
+}
+
+
+sub parse_file
+{
+    my($self, $file) = @_;
+    my $opened;
+    if (!ref($file) && ref(\$file) ne "GLOB") {
+        # Assume $file is a filename
+        local(*F);
+        open(F, $file) || return undef;
+	binmode(F);  # should we? good for byte counts
+        $opened++;
+        $file = *F;
+    }
+    my $chunk = '';
+    while (read($file, $chunk, 512)) {
+	$self->parse($chunk) || last;
+    }
+    close($file) if $opened;
+    $self->eof;
+}
+
+
+sub netscape_buggy_comment  # legacy
+{
+    my $self = shift;
+    require Carp;
+    Carp::carp("netscape_buggy_comment() is deprecated.  " .
+	       "Please use the strict_comment() method instead");
+    my $old = !$self->strict_comment;
+    $self->strict_comment(!shift) if @_;
+    return $old;
+}
+
+# set up method stubs
+sub text { }
+*start       = \&text;
+*end         = \&text;
+*comment     = \&text;
+*declaration = \&text;
+*process     = \&text;
+
+1;
+
+__END__
+
+
+=head1 NAME
+
+HTML::Parser - HTML parser class
+
+=head1 SYNOPSIS
+
+ use HTML::Parser ();
+
+ # Create parser object
+ $p = HTML::Parser->new( api_version => 3,
+                         start_h => [\&start, "tagname, attr"],
+                         end_h   => [\&end,   "tagname"],
+                         marked_sections => 1,
+                       );
+
+ # Parse document text chunk by chunk
+ $p->parse($chunk1);
+ $p->parse($chunk2);
+ #...
+ $p->eof;                 # signal end of document
+
+ # Parse directly from file
+ $p->parse_file("foo.html");
+ # or
+ open(my $fh, "<:utf8", "foo.html") || die;
+ $p->parse_file($fh);
+
+=head1 DESCRIPTION
+
+Objects of the C<HTML::Parser> class will recognize markup and
+separate it from plain text (alias data content) in HTML
+documents.  As different kinds of markup and text are recognized, the
+corresponding event handlers are invoked.
+
+C<HTML::Parser> is not a generic SGML parser.  We have tried to
+make it able to deal with the HTML that is actually "out there", and
+it normally parses as closely as possible to the way the popular web
+browsers do it instead of strictly following one of the many HTML
+specifications from W3C.  Where there is disagreement, there is often
+an option that you can enable to get the official behaviour.
+
+The document to be parsed may be supplied in arbitrary chunks.  This
+makes on-the-fly parsing as documents are received from the network
+possible.
+
+If event driven parsing does not feel right for your application, you
+might want to use C<HTML::PullParser>.  This is an C<HTML::Parser>
+subclass that allows a more conventional program structure.
+
+
+=head1 METHODS
+
+The following method is used to construct a new C<HTML::Parser> object:
+
+=over
+
+=item $p = HTML::Parser->new( %options_and_handlers )
+
+This class method creates a new C<HTML::Parser> object and
+returns it.  Key/value argument pairs may be provided to assign event
+handlers or initialize parser options.  The handlers and parser
+options can also be set or modified later by the method calls described below.
+
+If a top level key is in the form "<event>_h" (e.g., "text_h") then it
+assigns a handler to that event, otherwise it initializes a parser
+option. The event handler specification value must be an array
+reference.  Multiple handlers may also be assigned with the 'handlers
+=> [%handlers]' option.  See examples below.
+
+If new() is called without any arguments, it will create a parser that
+uses callback methods compatible with version 2 of C<HTML::Parser>.
+See the section on "version 2 compatibility" below for details.
+
+The special constructor option 'api_version => 2' can be used to
+initialize version 2 callbacks while still setting other options and
+handlers.  The 'api_version => 3' option can be used if you don't want
+to set any options and don't want to fall back to v2 compatible
+mode.
+
+Examples:
+
+ $p = HTML::Parser->new(api_version => 3,
+                        text_h => [ sub {...}, "dtext" ]);
+
+This creates a new parser object with a text event handler subroutine
+that receives the original text with general entities decoded.
+
+ $p = HTML::Parser->new(api_version => 3,
+			start_h => [ 'my_start', "self,tokens" ]);
+
+This creates a new parser object with a start event handler method
+that receives the $p and the tokens array.
+
+ $p = HTML::Parser->new(api_version => 3,
+		        handlers => { text => [\@array, "event,text"],
+                                      comment => [\@array, "event,text"],
+                                    });
+
+This creates a new parser object that stores the event type and the
+original text in @array for text and comment events.
+
+=back
+
+The following methods feed the HTML document
+to the C<HTML::Parser> object:
+
+=over
+
+=item $p->parse( $string )
+
+Parse $string as the next chunk of the HTML document.  The return
+value is normally a reference to the parser object (i.e. $p).
+Handlers invoked should not attempt to modify the $string in-place until
+$p->parse returns.
+
+If an invoked event handler aborts parsing by calling $p->eof, then
+$p->parse() will return a FALSE value.
+
+=item $p->parse( $code_ref )
+
+If a code reference is passed as the argument to be parsed, then the
+chunks to be parsed are obtained by invoking this function repeatedly.
+Parsing continues until the function returns an empty (or undefined)
+result.  When this happens $p->eof is automatically signaled.
+
+Parsing will also abort if one of the event handlers calls $p->eof.
+
+The effect of this is the same as:
+
+ while (1) {
+    my $chunk = &$code_ref();
+    if (!defined($chunk) || !length($chunk)) {
+        $p->eof;
+        return $p;
+    }
+    $p->parse($chunk) || return undef;
+ }
+
+But it is more efficient as this loop runs internally in XS code.
+
+=item $p->parse_file( $file )
+
+Parse text directly from a file.  The $file argument can be a
+filename, an open file handle, or a reference to an open file
+handle.
+
+If $file contains a filename and the file can't be opened, then the
+method returns an undefined value and $! tells why it failed.
+Otherwise the return value is a reference to the parser object.
+
+If a file handle is passed as the $file argument, then the file will
+normally be read until EOF, but not closed.
+
+If an invoked event handler aborts parsing by calling $p->eof,
+then $p->parse_file() may not have read the entire file.
+
+On systems with multi-byte line terminators, the values passed for the
+offset and length argspecs may be too low if parse_file() is called on
+a file handle that is not in binary mode.
+
+If a filename is passed in, then parse_file() will open the file in
+binary mode.
+
+=item $p->eof
+
+Signals the end of the HTML document.  Calling the $p->eof method
+outside a handler callback will flush any remaining buffered text
+(which triggers the C<text> event if there is any remaining text).
+
+Calling $p->eof inside a handler will terminate parsing at that point
+and cause $p->parse to return a FALSE value.  This also terminates
+parsing by $p->parse_file().
+
+After $p->eof has been called, the parse() and parse_file() methods
+can be invoked to feed new documents with the parser object.
+
+The return value from eof() is a reference to the parser object.
+
+=back
+
+
+Most parser options are controlled by boolean attributes.
+Each boolean attribute is enabled by calling the corresponding method
+with a TRUE argument and disabled with a FALSE argument.  The
+attribute value is left unchanged if no argument is given.  The return
+value from each method is the old attribute value.
+
+Methods that can be used to get and/or set parser options are:
+
+=over
+
+=item $p->attr_encoded
+
+=item $p->attr_encoded( $bool )
+
+By default, the C<attr> and C<@attr> argspecs will have general
+entities for attribute values decoded.  Enabling this attribute leaves
+entities alone.
+
+=item $p->boolean_attribute_value( $val )
+
+This method sets the value reported for boolean attributes inside HTML
+start tags.  By default, the name of the attribute is also used as its
+value.  This affects the values reported for C<tokens> and C<attr>
+argspecs.
+
+=item $p->case_sensitive
+
+=item $p->case_sensitive( $bool )
+
+By default, tagnames and attribute names are down-cased.  Enabling this
+attribute leaves them as found in the HTML source document.
+
+=item $p->closing_plaintext
+
+=item $p->closing_plaintext( $bool )
+
+By default, "plaintext" element can never be closed. Everything up to
+the end of the document is parsed in CDATA mode.  This historical
+behaviour is what at least MSIE does.  Enabling this attribute makes
+closing "</plaintext>" tag effective and the parsing process will resume
+after seeing this tag.  This emulates gecko-based browsers.
+
+=item $p->empty_element_tags
+
+=item $p->empty_element_tags( $bool )
+
+By default, empty element tags are not recognized as such and the "/"
+before ">" is just treated like a normal name character (unless
+C<strict_names> is enabled).  Enabling this attribute make
+C<HTML::Parser> recognize these tags.
+
+Empty element tags look like start tags, but end with the character
+sequence "/>" instead of ">".  When recognized by C<HTML::Parser> they
+cause an artificial end event in addition to the start event.  The
+C<text> for the artificial end event will be empty and the C<tokenpos>
+array will be undefined even though the the token array will have one
+element containing the tag name.
+
+=item $p->marked_sections
+
+=item $p->marked_sections( $bool )
+
+By default, section markings like <![CDATA[...]]> are treated like
+ordinary text.  When this attribute is enabled section markings are
+honoured.
+
+There are currently no events associated with the marked section
+markup, but the text can be returned as C<skipped_text>.
+
+=item $p->strict_comment
+
+=item $p->strict_comment( $bool )
+
+By default, comments are terminated by the first occurrence of "-->".
+This is the behaviour of most popular browsers (like Mozilla, Opera and
+MSIE), but it is not correct according to the official HTML
+standard.  Officially, you need an even number of "--" tokens before
+the closing ">" is recognized and there may not be anything but
+whitespace between an even and an odd "--".
+
+The official behaviour is enabled by enabling this attribute.
+
+Enabling of 'strict_comment' also disables recognizing these forms as
+comments:
+
+  </ comment>
+  <! comment>
+
+
+=item $p->strict_end
+
+=item $p->strict_end( $bool )
+
+By default, attributes and other junk are allowed to be present on end tags in a
+manner that emulates MSIE's behaviour.
+
+The official behaviour is enabled with this attribute.  If enabled,
+only whitespace is allowed between the tagname and the final ">".
+
+=item $p->strict_names
+
+=item $p->strict_names( $bool )
+
+By default, almost anything is allowed in tag and attribute names.
+This is the behaviour of most popular browsers and allows us to parse
+some broken tags with invalid attribute values like:
+
+   <IMG SRC=newprevlstGr.gif ALT=[PREV LIST] BORDER=0>
+
+By default, "LIST]" is parsed as a boolean attribute, not as
+part of the ALT value as was clearly intended.  This is also what
+Mozilla sees.
+
+The official behaviour is enabled by enabling this attribute.  If
+enabled, it will cause the tag above to be reported as text
+since "LIST]" is not a legal attribute name.
+
+=item $p->unbroken_text
+
+=item $p->unbroken_text( $bool )
+
+By default, blocks of text are given to the text handler as soon as
+possible (but the parser takes care always to break text at a
+boundary between whitespace and non-whitespace so single words and
+entities can always be decoded safely).  This might create breaks that
+make it hard to do transformations on the text. When this attribute is
+enabled, blocks of text are always reported in one piece.  This will
+delay the text event until the following (non-text) event has been
+recognized by the parser.
+
+Note that the C<offset> argspec will give you the offset of the first
+segment of text and C<length> is the combined length of the segments.
+Since there might be ignored tags in between, these numbers can't be
+used to directly index in the original document file.
+
+=item $p->utf8_mode
+
+=item $p->utf8_mode( $bool )
+
+Enable this option when parsing raw undecoded UTF-8.  This tells the
+parser that the entities expanded for strings reported by C<attr>,
+C<@attr> and C<dtext> should be expanded as decoded UTF-8 so they end
+up compatible with the surrounding text.
+
+If C<utf8_mode> is enabled then it is an error to pass strings
+containing characters with code above 255 to the parse() method, and
+the parse() method will croak if you try.
+
+Example: The Unicode character "\x{2665}" is "\xE2\x99\xA5" when UTF-8
+encoded.  The character can also be represented by the entity
+"&hearts;" or "&#x2665".  If we feed the parser:
+
+  $p->parse("\xE2\x99\xA5&hearts;");
+
+then C<dtext> will be reported as "\xE2\x99\xA5\x{2665}" without
+C<utf8_mode> enabled, but as "\xE2\x99\xA5\xE2\x99\xA5" when enabled.
+The later string is what you want.
+
+This option is only available with perl-5.8 or better.
+
+=item $p->xml_mode
+
+=item $p->xml_mode( $bool )
+
+Enabling this attribute changes the parser to allow some XML
+constructs.  This enables the behaviour controlled by individually by
+the C<case_sensitive>, C<empty_element_tags>, C<strict_names> and
+C<xml_pic> attributes and also suppresses special treatment of
+elements that are parsed as CDATA for HTML.
+
+=item $p->xml_pic
+
+=item $p->xml_pic( $bool )
+
+By default, I<processing instructions> are terminated by ">". When
+this attribute is enabled, processing instructions are terminated by
+"?>" instead.
+
+=back
+
+As markup and text is recognized, handlers are invoked.  The following
+method is used to set up handlers for different events:
+
+=over
+
+=item $p->handler( event => \&subroutine, $argspec )
+
+=item $p->handler( event => $method_name, $argspec )
+
+=item $p->handler( event => \@accum, $argspec )
+
+=item $p->handler( event => "" );
+
+=item $p->handler( event => undef );
+
+=item $p->handler( event );
+
+This method assigns a subroutine, method, or array to handle an event.
+
+Event is one of C<text>, C<start>, C<end>, C<declaration>, C<comment>,
+C<process>, C<start_document>, C<end_document> or C<default>.
+
+The C<\&subroutine> is a reference to a subroutine which is called to handle
+the event.
+
+The C<$method_name> is the name of a method of $p which is called to handle
+the event.
+
+The C<@accum> is an array that will hold the event information as
+sub-arrays.
+
+If the second argument is "", the event is ignored.
+If it is undef, the default handler is invoked for the event.
+
+The C<$argspec> is a string that describes the information to be reported
+for the event.  Any requested information that does not apply to a
+specific event is passed as C<undef>.  If argspec is omitted, then it
+is left unchanged.
+
+The return value from $p->handler is the old callback routine or a
+reference to the accumulator array.
+
+Any return values from handler callback routines/methods are always
+ignored.  A handler callback can request parsing to be aborted by
+invoking the $p->eof method.  A handler callback is not allowed to
+invoke the $p->parse() or $p->parse_file() method.  An exception will
+be raised if it tries.
+
+Examples:
+
+    $p->handler(start =>  "start", 'self, attr, attrseq, text' );
+
+This causes the "start" method of object $p to be called for 'start' events.
+The callback signature is $p->start(\%attr, \@attr_seq, $text).
+
+    $p->handler(start =>  \&start, 'attr, attrseq, text' );
+
+This causes subroutine start() to be called for 'start' events.
+The callback signature is start(\%attr, \@attr_seq, $text).
+
+    $p->handler(start =>  \@accum, '"S", attr, attrseq, text' );
+
+This causes 'start' event information to be saved in @accum.
+The array elements will be ['S', \%attr, \@attr_seq, $text].
+
+   $p->handler(start => "");
+
+This causes 'start' events to be ignored.  It also suppresses
+invocations of any default handler for start events.  It is in most
+cases equivalent to $p->handler(start => sub {}), but is more
+efficient.  It is different from the empty-sub-handler in that
+C<skipped_text> is not reset by it.
+
+   $p->handler(start => undef);
+
+This causes no handler to be associated with start events.
+If there is a default handler it will be invoked.
+
+=back
+
+Filters based on tags can be set up to limit the number of events
+reported.  The main bottleneck during parsing is often the huge number
+of callbacks made from the parser.  Applying filters can improve
+performance significantly.
+
+The following methods control filters:
+
+=over
+
+=item $p->ignore_elements( @tags )
+
+Both the C<start> event and the C<end> event as well as any events that
+would be reported in between are suppressed.  The ignored elements can
+contain nested occurrences of itself.  Example:
+
+   $p->ignore_elements(qw(script style));
+
+The C<script> and C<style> tags will always nest properly since their
+content is parsed in CDATA mode.  For most other tags
+C<ignore_elements> must be used with caution since HTML is often not
+I<well formed>.
+
+=item $p->ignore_tags( @tags )
+
+Any C<start> and C<end> events involving any of the tags given are
+suppressed.  To reset the filter (i.e. don't suppress any C<start> and
+C<end> events), call C<ignore_tags> without an argument.
+
+=item $p->report_tags( @tags )
+
+Any C<start> and C<end> events involving any of the tags I<not> given
+are suppressed.  To reset the filter (i.e. report all C<start> and
+C<end> events), call C<report_tags> without an argument.
+
+=back
+
+Internally, the system has two filter lists, one for C<report_tags>
+and one for C<ignore_tags>, and both filters are applied.  This
+effectively gives C<ignore_tags> precedence over C<report_tags>.
+
+Examples:
+
+   $p->ignore_tags(qw(style));
+   $p->report_tags(qw(script style));
+
+results in only C<script> events being reported.
+
+=head2 Argspec
+
+Argspec is a string containing a comma-separated list that describes
+the information reported by the event.  The following argspec
+identifier names can be used:
+
+=over
+
+=item C<attr>
+
+Attr causes a reference to a hash of attribute name/value pairs to be
+passed.
+
+Boolean attributes' values are either the value set by
+$p->boolean_attribute_value, or the attribute name if no value has been
+set by $p->boolean_attribute_value.
+
+This passes undef except for C<start> events.
+
+Unless C<xml_mode> or C<case_sensitive> is enabled, the attribute
+names are forced to lower case.
+
+General entities are decoded in the attribute values and
+one layer of matching quotes enclosing the attribute values is removed.
+
+The Unicode character set is assumed for entity decoding.  With Perl
+version 5.6 or earlier only the Latin-1 range is supported, and
+entities for characters outside the range 0..255 are left unchanged.
+
+=item C<@attr>
+
+Basically the same as C<attr>, but keys and values are passed as
+individual arguments and the original sequence of the attributes is
+kept.  The parameters passed will be the same as the @attr calculated
+here:
+
+   @attr = map { $_ => $attr->{$_} } @$attrseq;
+
+assuming $attr and $attrseq here are the hash and array passed as the
+result of C<attr> and C<attrseq> argspecs.
+
+This passes no values for events besides C<start>.
+
+=item C<attrseq>
+
+Attrseq causes a reference to an array of attribute names to be
+passed.  This can be useful if you want to walk the C<attr> hash in
+the original sequence.
+
+This passes undef except for C<start> events.
+
+Unless C<xml_mode> or C<case_sensitive> is enabled, the attribute
+names are forced to lower case.
+
+=item C<column>
+
+Column causes the column number of the start of the event to be passed.
+The first column on a line is 0.
+
+=item C<dtext>
+
+Dtext causes the decoded text to be passed.  General entities are
+automatically decoded unless the event was inside a CDATA section or
+was between literal start and end tags (C<script>, C<style>,
+C<xmp>, and C<plaintext>).
+
+The Unicode character set is assumed for entity decoding.  With Perl
+version 5.6 or earlier only the Latin-1 range is supported, and
+entities for characters outside the range 0..255 are left unchanged.
+
+This passes undef except for C<text> events.
+
+=item C<event>
+
+Event causes the event name to be passed.
+
+The event name is one of C<text>, C<start>, C<end>, C<declaration>,
+C<comment>, C<process>, C<start_document> or C<end_document>.
+
+=item C<is_cdata>
+
+Is_cdata causes a TRUE value to be passed if the event is inside a CDATA
+section or between literal start and end tags (C<script>,
+C<style>, C<xmp>, and C<plaintext>).
+
+if the flag is FALSE for a text event, then you should normally
+either use C<dtext> or decode the entities yourself before the text is
+processed further.
+
+=item C<length>
+
+Length causes the number of bytes of the source text of the event to
+be passed.
+
+=item C<line>
+
+Line causes the line number of the start of the event to be passed.
+The first line in the document is 1.  Line counting doesn't start
+until at least one handler requests this value to be reported.
+
+=item C<offset>
+
+Offset causes the byte position in the HTML document of the start of
+the event to be passed.  The first byte in the document has offset 0.
+
+=item C<offset_end>
+
+Offset_end causes the byte position in the HTML document of the end of
+the event to be passed.  This is the same as C<offset> + C<length>.
+
+=item C<self>
+
+Self causes the current object to be passed to the handler.  If the
+handler is a method, this must be the first element in the argspec.
+
+An alternative to passing self as an argspec is to register closures
+that capture $self by themselves as handlers.  Unfortunately this
+creates circular references which prevent the HTML::Parser object
+from being garbage collected.  Using the C<self> argspec avoids this
+problem.
+
+=item C<skipped_text>
+
+Skipped_text returns the concatenated text of all the events that have
+been skipped since the last time an event was reported.  Events might
+be skipped because no handler is registered for them or because some
+filter applies.  Skipped text also includes marked section markup,
+since there are no events that can catch it.
+
+If an C<"">-handler is registered for an event, then the text for this
+event is not included in C<skipped_text>.  Skipped text both before
+and after the C<"">-event is included in the next reported
+C<skipped_text>.
+
+=item C<tag>
+
+Same as C<tagname>, but prefixed with "/" if it belongs to an C<end>
+event and "!" for a declaration.  The C<tag> does not have any prefix
+for C<start> events, and is in this case identical to C<tagname>.
+
+=item C<tagname>
+
+This is the element name (or I<generic identifier> in SGML jargon) for
+start and end tags.  Since HTML is case insensitive, this name is
+forced to lower case to ease string matching.
+
+Since XML is case sensitive, the tagname case is not changed when
+C<xml_mode> is enabled.  The same happens if the C<case_sensitive> attribute
+is set.
+
+The declaration type of declaration elements is also passed as a tagname,
+even if that is a bit strange.
+In fact, in the current implementation tagname is
+identical to C<token0> except that the name may be forced to lower case.
+
+=item C<token0>
+
+Token0 causes the original text of the first token string to be
+passed.  This should always be the same as $tokens->[0].
+
+For C<declaration> events, this is the declaration type.
+
+For C<start> and C<end> events, this is the tag name.
+
+For C<process> and non-strict C<comment> events, this is everything
+inside the tag.
+
+This passes undef if there are no tokens in the event.
+
+=item C<tokenpos>
+
+Tokenpos causes a reference to an array of token positions to be
+passed.  For each string that appears in C<tokens>, this array
+contains two numbers.  The first number is the offset of the start of
+the token in the original C<text> and the second number is the length
+of the token.
+
+Boolean attributes in a C<start> event will have (0,0) for the
+attribute value offset and length.
+
+This passes undef if there are no tokens in the event (e.g., C<text>)
+and for artificial C<end> events triggered by empty element tags.
+
+If you are using these offsets and lengths to modify C<text>, you
+should either work from right to left, or be very careful to calculate
+the changes to the offsets.
+
+=item C<tokens>
+
+Tokens causes a reference to an array of token strings to be passed.
+The strings are exactly as they were found in the original text,
+no decoding or case changes are applied.
+
+For C<declaration> events, the array contains each word, comment, and
+delimited string starting with the declaration type.
+
+For C<comment> events, this contains each sub-comment.  If
+$p->strict_comments is disabled, there will be only one sub-comment.
+
+For C<start> events, this contains the original tag name followed by
+the attribute name/value pairs.  The values of boolean attributes will
+be either the value set by $p->boolean_attribute_value, or the
+attribute name if no value has been set by
+$p->boolean_attribute_value.
+
+For C<end> events, this contains the original tag name (always one token).
+
+For C<process> events, this contains the process instructions (always one
+token).
+
+This passes C<undef> for C<text> events.
+
+=item C<text>
+
+Text causes the source text (including markup element delimiters) to be
+passed.
+
+=item C<undef>
+
+Pass an undefined value.  Useful as padding where the same handler
+routine is registered for multiple events.
+
+=item C<'...'>
+
+A literal string of 0 to 255 characters enclosed
+in single (') or double (") quotes is passed as entered.
+
+=back
+
+The whole argspec string can be wrapped up in C<'@{...}'> to signal
+that the resulting event array should be flattened.  This only makes a
+difference if an array reference is used as the handler target.
+Consider this example:
+
+   $p->handler(text => [], 'text');
+   $p->handler(text => [], '@{text}']);
+
+With two text events; C<"foo">, C<"bar">; then the first example will end
+up with [["foo"], ["bar"]] and the second with ["foo", "bar"] in
+the handler target array.
+
+
+=head2 Events
+
+Handlers for the following events can be registered:
+
+=over
+
+=item C<comment>
+
+This event is triggered when a markup comment is recognized.
+
+Example:
+
+  <!-- This is a comment -- -- So is this -->
+
+=item C<declaration>
+
+This event is triggered when a I<markup declaration> is recognized.
+
+For typical HTML documents, the only declaration you are
+likely to find is <!DOCTYPE ...>.
+
+Example:
+
+  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+  "http://www.w3.org/TR/html40/strict.dtd">
+
+DTDs inside <!DOCTYPE ...> will confuse HTML::Parser.
+
+=item C<default>
+
+This event is triggered for events that do not have a specific
+handler.  You can set up a handler for this event to catch stuff you
+did not want to catch explicitly.
+
+=item C<end>
+
+This event is triggered when an end tag is recognized.
+
+Example:
+
+  </A>
+
+=item C<end_document>
+
+This event is triggered when $p->eof is called and after any remaining
+text is flushed.  There is no document text associated with this event.
+
+=item C<process>
+
+This event is triggered when a processing instructions markup is
+recognized.
+
+The format and content of processing instructions are system and
+application dependent.
+
+Examples:
+
+  <? HTML processing instructions >
+  <? XML processing instructions ?>
+
+=item C<start>
+
+This event is triggered when a start tag is recognized.
+
+Example:
+
+  <A HREF="http://www.perl.com/">
+
+=item C<start_document>
+
+This event is triggered before any other events for a new document.  A
+handler for it can be used to initialize stuff.  There is no document
+text associated with this event.
+
+=item C<text>
+
+This event is triggered when plain text (characters) is recognized.
+The text may contain multiple lines.  A sequence of text may be broken
+between several text events unless $p->unbroken_text is enabled.
+
+The parser will make sure that it does not break a word or a sequence
+of whitespace between two text events.
+
+=back
+
+=head2 Unicode
+
+The C<HTML::Parser> can parse Unicode strings when running under
+perl-5.8 or better.  If Unicode is passed to $p->parse() then chunks
+of Unicode will be reported to the handlers.  The offset and length
+argspecs will also report their position in terms of characters.
+
+It is safe to parse raw undecoded UTF-8 if you either avoid decoding
+entities and make sure to not use I<argspecs> that do, or enable the
+C<utf8_mode> for the parser.  Parsing of undecoded UTF-8 might be
+useful when parsing from a file where you need the reported offsets
+and lengths to match the byte offsets in the file.
+
+If a filename is passed to $p->parse_file() then the file will be read
+in binary mode.  This will be fine if the file contains only ASCII or
+Latin-1 characters.  If the file contains UTF-8 encoded text then care
+must be taken when decoding entities as described in the previous
+paragraph, but better is to open the file with the UTF-8 layer so that
+it is decoded properly:
+
+   open(my $fh, "<:utf8", "index.html") || die "...: $!";
+   $p->parse_file($fh);
+
+If the file contains text encoded in a charset besides ASCII, Latin-1
+or UTF-8 then decoding will always be needed.
+
+=head1 VERSION 2 COMPATIBILITY
+
+When an C<HTML::Parser> object is constructed with no arguments, a set
+of handlers is automatically provided that is compatible with the old
+HTML::Parser version 2 callback methods.
+
+This is equivalent to the following method calls:
+
+   $p->handler(start   => "start",   "self, tagname, attr, attrseq, text");
+   $p->handler(end     => "end",     "self, tagname, text");
+   $p->handler(text    => "text",    "self, text, is_cdata");
+   $p->handler(process => "process", "self, token0, text");
+   $p->handler(comment =>
+             sub {
+		 my($self, $tokens) = @_;
+		 for (@$tokens) {$self->comment($_);}},
+             "self, tokens");
+   $p->handler(declaration =>
+             sub {
+		 my $self = shift;
+		 $self->declaration(substr($_[0], 2, -1));},
+             "self, text");
+
+Setting up these handlers can also be requested with the "api_version =>
+2" constructor option.
+
+=head1 SUBCLASSING
+
+The C<HTML::Parser> class is subclassable.  Parser objects are plain
+hashes and C<HTML::Parser> reserves only hash keys that start with
+"_hparser".  The parser state can be set up by invoking the init()
+method, which takes the same arguments as new().
+
+=head1 EXAMPLES
+
+The first simple example shows how you might strip out comments from
+an HTML document.  We achieve this by setting up a comment handler that
+does nothing and a default handler that will print out anything else:
+
+  use HTML::Parser;
+  HTML::Parser->new(default_h => [sub { print shift }, 'text'],
+                    comment_h => [""],
+                   )->parse_file(shift || die) || die $!;
+
+An alternative implementation is:
+
+  use HTML::Parser;
+  HTML::Parser->new(end_document_h => [sub { print shift },
+                                       'skipped_text'],
+                    comment_h      => [""],
+                   )->parse_file(shift || die) || die $!;
+
+This will in most cases be much more efficient since only a single
+callback will be made.
+
+The next example prints out the text that is inside the <title>
+element of an HTML document.  Here we start by setting up a start
+handler.  When it sees the title start tag it enables a text handler
+that prints any text found and an end handler that will terminate
+parsing as soon as the title end tag is seen:
+
+  use HTML::Parser ();
+
+  sub start_handler
+  {
+    return if shift ne "title";
+    my $self = shift;
+    $self->handler(text => sub { print shift }, "dtext");
+    $self->handler(end  => sub { shift->eof if shift eq "title"; },
+		           "tagname,self");
+  }
+
+  my $p = HTML::Parser->new(api_version => 3);
+  $p->handler( start => \&start_handler, "tagname,self");
+  $p->parse_file(shift || die) || die $!;
+  print "\n";
+
+More examples are found in the F<eg/> directory of the C<HTML-Parser>
+distribution: the program C<hrefsub> shows how you can edit all links
+found in a document; the program C<htextsub> shows how to edit the text only; the
+program C<hstrip> shows how you can strip out certain tags/elements
+and/or attributes; and the program C<htext> show how to obtain the
+plain text, but not any script/style content.
+
+You can browse the F<eg/> directory online from the I<[Browse]> link on
+the http://search.cpan.org/~gaas/HTML-Parser/ page.
+
+=head1 BUGS
+
+The <style> and <script> sections do not end with the first "</", but
+need the complete corresponding end tag.  The standard behaviour is
+not really practical.
+
+When the I<strict_comment> option is enabled, we still recognize
+comments where there is something other than whitespace between even
+and odd "--" markers.
+
+Once $p->boolean_attribute_value has been set, there is no way to
+restore the default behaviour.
+
+There is currently no way to get both quote characters
+into the same literal argspec.
+
+Empty tags, e.g. "<>" and "</>", are not recognized.  SGML allows them
+to repeat the previous start tag or close the previous start tag
+respectively.
+
+NET tags, e.g. "code/.../" are not recognized.  This is SGML
+shorthand for "<code>...</code>".
+
+Unclosed start or end tags, e.g. "<tt<b>...</b</tt>" are not
+recognized.
+
+=head1 DIAGNOSTICS
+
+The following messages may be produced by HTML::Parser.  The notation
+in this listing is the same as used in L<perldiag>:
+
+=over
+
+=item Not a reference to a hash
+
+(F) The object blessed into or subclassed from HTML::Parser is not a
+hash as required by the HTML::Parser methods.
+
+=item Bad signature in parser state object at %p
+
+(F) The _hparser_xs_state element does not refer to a valid state structure.
+Something must have changed the internal value
+stored in this hash element, or the memory has been overwritten.
+
+=item _hparser_xs_state element is not a reference
+
+(F) The _hparser_xs_state element has been destroyed.
+
+=item Can't find '_hparser_xs_state' element in HTML::Parser hash
+
+(F) The _hparser_xs_state element is missing from the parser hash.
+It was either deleted, or not created when the object was created.
+
+=item API version %s not supported by HTML::Parser %s
+
+(F) The constructor option 'api_version' with an argument greater than
+or equal to 4 is reserved for future extensions.
+
+=item Bad constructor option '%s'
+
+(F) An unknown constructor option key was passed to the new() or
+init() methods.
+
+=item Parse loop not allowed
+
+(F) A handler invoked the parse() or parse_file() method.
+This is not permitted.
+
+=item marked sections not supported
+
+(F) The $p->marked_sections() method was invoked in a HTML::Parser
+module that was compiled without support for marked sections.
+
+=item Unknown boolean attribute (%d)
+
+(F) Something is wrong with the internal logic that set up aliases for
+boolean attributes.
+
+=item Only code or array references allowed as handler
+
+(F) The second argument for $p->handler must be either a subroutine
+reference, then name of a subroutine or method, or a reference to an
+array.
+
+=item No handler for %s events
+
+(F) The first argument to $p->handler must be a valid event name; i.e. one
+of "start", "end", "text", "process", "declaration" or "comment".
+
+=item Unrecognized identifier %s in argspec
+
+(F) The identifier is not a known argspec name.
+Use one of the names mentioned in the argspec section above.
+
+=item Literal string is longer than 255 chars in argspec
+
+(F) The current implementation limits the length of literals in
+an argspec to 255 characters.  Make the literal shorter.
+
+=item Backslash reserved for literal string in argspec
+
+(F) The backslash character "\" is not allowed in argspec literals.
+It is reserved to permit quoting inside a literal in a later version.
+
+=item Unterminated literal string in argspec
+
+(F) The terminating quote character for a literal was not found.
+
+=item Bad argspec (%s)
+
+(F) Only identifier names, literals, spaces and commas
+are allowed in argspecs.
+
+=item Missing comma separator in argspec
+
+(F) Identifiers in an argspec must be separated with ",".
+
+=item Parsing of undecoded UTF-8 will give garbage when decoding entities
+
+(W) The first chunk parsed appears to contain undecoded UTF-8 and one
+or more argspecs that decode entities are used for the callback
+handlers.
+
+The result of decoding will be a mix of encoded and decoded characters
+for any entities that expand to characters with code above 127.  This
+is not a good thing.
+
+The solution is to use the Encode::encode_utf8() on the data before
+feeding it to the $p->parse().  For $p->parse_file() pass a file that
+has been opened in ":utf8" mode.
+
+The parser can process raw undecoded UTF-8 sanely if the C<utf8_mode>
+is enabled or if the "attr", "@attr" or "dtext" argspecs is avoided.
+
+=item Parsing string decoded with wrong endianess
+
+(W) The first character in the document is U+FFFE.  This is not a
+legal Unicode character but a byte swapped BOM.  The result of parsing
+will likely be garbage.
+
+=item Parsing of undecoded UTF-32
+
+(W) The parser found the Unicode UTF-32 BOM signature at the start
+of the document.  The result of parsing will likely be garbage.
+
+=item Parsing of undecoded UTF-16
+
+(W) The parser found the Unicode UTF-16 BOM signature at the start of
+the document.  The result of parsing will likely be garbage.
+
+=back
+
+=head1 SEE ALSO
+
+L<HTML::Entities>, L<HTML::PullParser>, L<HTML::TokeParser>, L<HTML::HeadParser>,
+L<HTML::LinkExtor>, L<HTML::Form>
+
+L<HTML::TreeBuilder> (part of the I<HTML-Tree> distribution)
+
+http://www.w3.org/TR/html4
+
+More information about marked sections and processing instructions may
+be found at C<http://www.sgml.u-net.com/book/sgml-8.htm>.
+
+=head1 COPYRIGHT
+
+ Copyright 1996-2007 Gisle Aas. All rights reserved.
+ Copyright 1999-2000 Michael A. Chase.  All rights reserved.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/PullParser.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/PullParser.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/PullParser.pm	(revision 24799)
@@ -0,0 +1,211 @@
+package HTML::PullParser;
+
+# $Id: PullParser.pm 22649 2010-08-17 02:03:34Z davidb $
+
+require HTML::Parser;
+@ISA=qw(HTML::Parser);
+#$VERSION = sprintf("%d.%02d", q$Revision: 22649 $ =~ /(\d+)\.(\d+)/);
+
+use strict;
+use Carp ();
+
+sub new
+{
+    my($class, %cnf) = @_;
+
+    # Construct argspecs for the various events
+    my %argspec;
+    for (qw(start end text declaration comment process default)) {
+	my $tmp = delete $cnf{$_};
+	next unless defined $tmp;
+	$argspec{$_} = $tmp;
+    }
+    Carp::croak("Info not collected for any events")
+	  unless %argspec;
+
+    my $file = delete $cnf{file};
+    my $doc  = delete $cnf{doc};
+    Carp::croak("Can't parse from both 'doc' and 'file' at the same time")
+	  if defined($file) && defined($doc);
+    Carp::croak("No 'doc' or 'file' given to parse from")
+	  unless defined($file) || defined($doc);
+
+    # Create object
+    $cnf{api_version} = 3;
+    my $self = $class->SUPER::new(%cnf);
+
+    my $accum = $self->{pullparser_accum} = [];
+    while (my($event, $argspec) = each %argspec) {
+	$self->SUPER::handler($event => $accum, $argspec);
+    }
+
+    if (defined $doc) {
+	$self->{pullparser_str_ref} = ref($doc) ? $doc : \$doc;
+	$self->{pullparser_str_pos} = 0;
+    }
+    else {
+	if (!ref($file) && ref(\$file) ne "GLOB") {
+	    require IO::File;
+	    $file = IO::File->new($file, "r") || return;
+	}
+
+	$self->{pullparser_file} = $file;
+    }
+    $self;
+}
+
+
+sub handler
+{
+    Carp::croak("Can't set handlers for HTML::PullParser");
+}
+
+
+sub get_token
+{
+    my $self = shift;
+    while (!@{$self->{pullparser_accum}} && !$self->{pullparser_eof}) {
+	if (my $f = $self->{pullparser_file}) {
+	    # must try to parse more from the file
+	    my $buf;
+	    if (read($f, $buf, 512)) {
+		$self->parse($buf);
+	    } else {
+		$self->eof;
+		$self->{pullparser_eof}++;
+		delete $self->{pullparser_file};
+	    }
+	}
+	elsif (my $sref = $self->{pullparser_str_ref}) {
+	    # must try to parse more from the scalar
+	    my $pos = $self->{pullparser_str_pos};
+	    my $chunk = substr($$sref, $pos, 512);
+	    $self->parse($chunk);
+	    $pos += length($chunk);
+	    if ($pos < length($$sref)) {
+		$self->{pullparser_str_pos} = $pos;
+	    }
+	    else {
+		$self->eof;
+		$self->{pullparser_eof}++;
+		delete $self->{pullparser_str_ref};
+		delete $self->{pullparser_str_pos};
+	    }
+	}
+	else {
+	    die;
+	}
+    }
+    shift @{$self->{pullparser_accum}};
+}
+
+
+sub unget_token
+{
+    my $self = shift;
+    unshift @{$self->{pullparser_accum}}, @_;
+    $self;
+}
+
+1;
+
+
+__END__
+
+=head1 NAME
+
+HTML::PullParser - Alternative HTML::Parser interface
+
+=head1 SYNOPSIS
+
+ use HTML::PullParser;
+
+ $p = HTML::PullParser->new(file => "index.html",
+                            start => 'event, tagname, @attr',
+                            end   => 'event, tagname',
+                            ignore_elements => [qw(script style)],
+                           ) || die "Can't open: $!";
+ while (my $token = $p->get_token) {
+     #...do something with $token
+ }
+
+=head1 DESCRIPTION
+
+The HTML::PullParser is an alternative interface to the HTML::Parser class.
+It basically turns the HTML::Parser inside out.  You associate a file
+(or any IO::Handle object or string) with the parser at construction time and
+then repeatedly call $parser->get_token to obtain the tags and text
+found in the parsed document.
+
+The following methods are provided:
+
+=over 4
+
+=item $p = HTML::PullParser->new( file => $file, %options )
+
+=item $p = HTML::PullParser->new( doc => \$doc, %options )
+
+A C<HTML::PullParser> can be made to parse from either a file or a
+literal document based on whether the C<file> or C<doc> option is
+passed to the parser's constructor.
+
+The C<file> passed in can either be a file name or a file handle
+object.  If a file name is passed, and it can't be opened for reading,
+then the constructor will return an undefined value and $!  will tell
+you why it failed.  Otherwise the argument is taken to be some object
+that the C<HTML::PullParser> can read() from when it needs more data.
+The stream will be read() until EOF, but not closed.
+
+A C<doc> can be passed plain or as a reference
+to a scalar.  If a reference is passed then the value of this scalar
+should not be changed before all tokens have been extracted.
+
+Next the information to be returned for the different token types must
+be set up.  This is done by simply associating an argspec (as defined
+in L<HTML::Parser>) with the events you have an interest in.  For
+instance, if you want C<start> tokens to be reported as the string
+C<'S'> followed by the tagname and the attributes you might pass an
+C<start>-option like this:
+
+   $p = HTML::PullParser->new(
+          doc   => $document_to_parse,
+          start => '"S", tagname, @attr',
+          end   => '"E", tagname',
+        );
+
+At last other C<HTML::Parser> options, like C<ignore_tags>, and
+C<unbroken_text>, can be passed in.  Note that you should not use the
+I<event>_h options to set up parser handlers.  That would confuse the
+inner logic of C<HTML::PullParser>.
+
+=item $token = $p->get_token
+
+This method will return the next I<token> found in the HTML document,
+or C<undef> at the end of the document.  The token is returned as an
+array reference.  The content of this array match the argspec set up
+during C<HTML::PullParser> construction.
+
+=item $p->unget_token( @tokens )
+
+If you find out you have read too many tokens you can push them back,
+so that they are returned again the next time $p->get_token is called.
+
+=back
+
+=head1 EXAMPLES
+
+The 'eg/hform' script shows how we might parse the form section of
+HTML::Documents using HTML::PullParser.
+
+=head1 SEE ALSO
+
+L<HTML::Parser>, L<HTML::TokeParser>
+
+=head1 COPYRIGHT
+
+Copyright 1998-2001 Gisle Aas.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/Tagset.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/Tagset.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/Tagset.pm	(revision 24799)
@@ -0,0 +1,470 @@
+package HTML::Tagset;
+
+use strict;
+
+=head1 NAME
+
+HTML::Tagset - data tables useful in parsing HTML
+
+=head1 VERSION
+
+Version 3.10
+
+=cut
+
+use vars qw( $VERSION );
+
+$VERSION = '3.10';
+
+=head1 SYNOPSIS
+
+  use HTML::Tagset;
+  # Then use any of the items in the HTML::Tagset package
+  #  as need arises
+
+=head1 DESCRIPTION
+
+This module contains several data tables useful in various kinds of
+HTML parsing operations.
+
+Note that all tag names used are lowercase.
+
+In the following documentation, a "hashset" is a hash being used as a
+set -- the hash conveys that its keys are there, and the actual values
+associated with the keys are not significant.  (But what values are
+there, are always true.)
+
+=cut
+
+use vars qw(
+    $VERSION
+    %emptyElement %optionalEndTag %linkElements %boolean_attr
+    %isHeadElement %isBodyElement %isPhraseMarkup
+    %is_Possible_Strict_P_Content
+    %isHeadOrBodyElement
+    %isList %isTableElement %isFormElement
+    %isKnown %canTighten
+    @p_closure_barriers
+    %isCDATA_Parent
+);
+
+=head1 VARIABLES
+
+Note that none of these variables are exported.
+
+=head2 hashset %HTML::Tagset::emptyElement
+
+This hashset has as values the tag-names (GIs) of elements that cannot
+have content.  (For example, "base", "br", "hr".)  So
+C<$HTML::Tagset::emptyElement{'hr'}> exists and is true.
+C<$HTML::Tagset::emptyElement{'dl'}> does not exist, and so is not true.
+
+=cut
+
+%emptyElement   = map {; $_ => 1 } qw(base link meta isindex
+                                     img br hr wbr
+                                     input area param
+                                     embed bgsound spacer
+                                     basefont col frame
+                                     ~comment ~literal
+                                     ~declaration ~pi
+                                    );
+# The "~"-initial names are for pseudo-elements used by HTML::Entities
+#  and TreeBuilder
+
+=head2 hashset %HTML::Tagset::optionalEndTag
+
+This hashset lists tag-names for elements that can have content, but whose
+end-tags are generally, "safely", omissible.  Example:
+C<$HTML::Tagset::emptyElement{'li'}> exists and is true.
+
+=cut
+
+%optionalEndTag = map {; $_ => 1 } qw(p li dt dd); # option th tr td);
+
+=head2 hash %HTML::Tagset::linkElements
+
+Values in this hash are tagnames for elements that might contain
+links, and the value for each is a reference to an array of the names
+of attributes whose values can be links.
+
+=cut
+
+%linkElements =
+(
+ 'a'       => ['href'],
+ 'applet'  => ['archive', 'codebase', 'code'],
+ 'area'    => ['href'],
+ 'base'    => ['href'],
+ 'bgsound' => ['src'],
+ 'blockquote' => ['cite'],
+ 'body'    => ['background'],
+ 'del'     => ['cite'],
+ 'embed'   => ['pluginspage', 'src'],
+ 'form'    => ['action'],
+ 'frame'   => ['src', 'longdesc'],
+ 'iframe'  => ['src', 'longdesc'],
+ 'ilayer'  => ['background'],
+ 'img'     => ['src', 'lowsrc', 'longdesc', 'usemap'],
+ 'input'   => ['src', 'usemap'],
+ 'ins'     => ['cite'],
+ 'isindex' => ['action'],
+ 'head'    => ['profile'],
+ 'layer'   => ['background', 'src'],
+ 'link'    => ['href'],
+ 'object'  => ['classid', 'codebase', 'data', 'archive', 'usemap'],
+ 'q'       => ['cite'],
+ 'script'  => ['src', 'for'],
+ 'table'   => ['background'],
+ 'td'      => ['background'],
+ 'th'      => ['background'],
+ 'tr'      => ['background'],
+ 'xmp'     => ['href'],
+);
+
+=head2 hash %HTML::Tagset::boolean_attr
+
+This hash (not hashset) lists what attributes of what elements can be
+printed without showing the value (for example, the "noshade" attribute
+of "hr" elements).  For elements with only one such attribute, its value
+is simply that attribute name.  For elements with many such attributes,
+the value is a reference to a hashset containing all such attributes.
+
+=cut
+
+%boolean_attr = (
+# TODO: make these all hashes
+  'area'   => 'nohref',
+  'dir'    => 'compact',
+  'dl'     => 'compact',
+  'hr'     => 'noshade',
+  'img'    => 'ismap',
+  'input'  => { 'checked' => 1, 'readonly' => 1, 'disabled' => 1 },
+  'menu'   => 'compact',
+  'ol'     => 'compact',
+  'option' => 'selected',
+  'select' => 'multiple',
+  'td'     => 'nowrap',
+  'th'     => 'nowrap',
+  'ul'     => 'compact',
+);
+
+#==========================================================================
+# List of all elements from Extensible HTML version 1.0 Transitional DTD:
+#
+#   a abbr acronym address applet area b base basefont bdo big
+#   blockquote body br button caption center cite code col colgroup
+#   dd del dfn dir div dl dt em fieldset font form h1 h2 h3 h4 h5 h6
+#   head hr html i iframe img input ins isindex kbd label legend li
+#   link map menu meta noframes noscript object ol optgroup option p
+#   param pre q s samp script select small span strike strong style
+#   sub sup table tbody td textarea tfoot th thead title tr tt u ul
+#   var
+#
+# Varia from Mozilla source internal table of tags:
+#   Implemented:
+#     xmp listing wbr nobr frame frameset noframes ilayer
+#     layer nolayer spacer embed multicol
+#   But these are unimplemented:
+#     sound??  keygen??  server??
+# Also seen here and there:
+#     marquee??  app??  (both unimplemented)
+#==========================================================================
+
+=head2 hashset %HTML::Tagset::isPhraseMarkup
+
+This hashset contains all phrasal-level elements.
+
+=cut
+
+%isPhraseMarkup = map {; $_ => 1 } qw(
+  span abbr acronym q sub sup
+  cite code em kbd samp strong var dfn strike
+  b i u s tt small big 
+  a img br
+  wbr nobr blink
+  font basefont bdo
+  spacer embed noembed
+);  # had: center, hr, table
+
+
+=head2 hashset %HTML::Tagset::is_Possible_Strict_P_Content
+
+This hashset contains all phrasal-level elements that be content of a
+P element, for a strict model of HTML.
+
+=cut
+
+%is_Possible_Strict_P_Content = (
+ %isPhraseMarkup,
+ %isFormElement,
+ map {; $_ => 1} qw( object script map )
+  # I've no idea why there's these latter exceptions.
+  # I'm just following the HTML4.01 DTD.
+);
+
+#from html4 strict:
+#<!ENTITY % fontstyle "TT | I | B | BIG | SMALL">
+#
+#<!ENTITY % phrase "EM | STRONG | DFN | CODE |
+#                   SAMP | KBD | VAR | CITE | ABBR | ACRONYM" >
+#
+#<!ENTITY % special
+#   "A | IMG | OBJECT | BR | SCRIPT | MAP | Q | SUB | SUP | SPAN | BDO">
+#
+#<!ENTITY % formctrl "INPUT | SELECT | TEXTAREA | LABEL | BUTTON">
+#
+#<!-- %inline; covers inline or "text-level" elements -->
+#<!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;">
+
+=head2 hashset %HTML::Tagset::isHeadElement
+
+This hashset contains all elements that elements that should be
+present only in the 'head' element of an HTML document.
+
+=cut
+
+%isHeadElement = map {; $_ => 1 }
+ qw(title base link meta isindex script style object bgsound);
+
+=head2 hashset %HTML::Tagset::isList
+
+This hashset contains all elements that can contain "li" elements.
+
+=cut
+
+%isList         = map {; $_ => 1 } qw(ul ol dir menu);
+
+=head2 hashset %HTML::Tagset::isTableElement
+
+This hashset contains all elements that are to be found only in/under
+a "table" element.
+
+=cut
+
+%isTableElement = map {; $_ => 1 }
+ qw(tr td th thead tbody tfoot caption col colgroup);
+
+=head2 hashset %HTML::Tagset::isFormElement
+
+This hashset contains all elements that are to be found only in/under
+a "form" element.
+
+=cut
+
+%isFormElement  = map {; $_ => 1 }
+ qw(input select option optgroup textarea button label);
+
+=head2 hashset %HTML::Tagset::isBodyMarkup
+
+This hashset contains all elements that are to be found only in/under
+the "body" element of an HTML document.
+
+=cut
+
+%isBodyElement = map {; $_ => 1 } qw(
+  h1 h2 h3 h4 h5 h6
+  p div pre plaintext address blockquote
+  xmp listing
+  center
+
+  multicol
+  iframe ilayer nolayer
+  bgsound
+
+  hr
+  ol ul dir menu li
+  dl dt dd
+  ins del
+  
+  fieldset legend
+  
+  map area
+  applet param object
+  isindex script noscript
+  table
+  center
+  form
+ ),
+ keys %isFormElement,
+ keys %isPhraseMarkup,   # And everything phrasal
+ keys %isTableElement,
+;
+
+
+=head2 hashset %HTML::Tagset::isHeadOrBodyElement
+
+This hashset includes all elements that I notice can fall either in
+the head or in the body.
+
+=cut
+
+%isHeadOrBodyElement = map {; $_ => 1 }
+  qw(script isindex style object map area param noscript bgsound);
+  # i.e., if we find 'script' in the 'body' or the 'head', don't freak out.
+
+
+=head2 hashset %HTML::Tagset::isKnown
+
+This hashset lists all known HTML elements.
+
+=cut
+
+%isKnown = (%isHeadElement, %isBodyElement,
+  map{; $_=>1 }
+   qw( head body html
+       frame frameset noframes
+       ~comment ~pi ~directive ~literal
+));
+ # that should be all known tags ever ever
+
+
+=head2 hashset %HTML::Tagset::canTighten
+
+This hashset lists elements that might have ignorable whitespace as
+children or siblings.
+
+=cut
+
+%canTighten = %isKnown;
+delete @canTighten{
+  keys(%isPhraseMarkup), 'input', 'select',
+  'xmp', 'listing', 'plaintext', 'pre',
+};
+  # xmp, listing, plaintext, and pre  are untightenable, and
+  #   in a really special way.
+@canTighten{'hr','br'} = (1,1);
+ # exceptional 'phrasal' things that ARE subject to tightening.
+
+# The one case where I can think of my tightening rules failing is:
+#  <p>foo bar<center> <em>baz quux</em> ...
+#                    ^-- that would get deleted.
+# But that's pretty gruesome code anyhow.  You gets what you pays for.
+
+#==========================================================================
+
+=head2 array @HTML::Tagset::p_closure_barriers
+
+This array has a meaning that I have only seen a need for in
+C<HTML::TreeBuilder>, but I include it here on the off chance that someone
+might find it of use:
+
+When we see a "E<lt>pE<gt>" token, we go lookup up the lineage for a p
+element we might have to minimize.  At first sight, we might say that
+if there's a p anywhere in the lineage of this new p, it should be
+closed.  But that's wrong.  Consider this document:
+
+  <html>
+    <head>
+      <title>foo</title>
+    </head>
+    <body>
+      <p>foo
+        <table>
+          <tr>
+            <td>
+               foo
+               <p>bar
+            </td>
+          </tr>
+        </table>
+      </p>
+    </body>
+  </html>
+
+The second p is quite legally inside a much higher p.
+
+My formalization of the reason why this is legal, but this:
+
+  <p>foo<p>bar</p></p>
+
+isn't, is that something about the table constitutes a "barrier" to
+the application of the rule about what p must minimize.
+
+So C<@HTML::Tagset::p_closure_barriers> is the list of all such
+barrier-tags.
+
+=cut
+
+@p_closure_barriers = qw(
+  li blockquote
+  ul ol menu dir
+  dl dt dd
+  td th tr table caption
+ );
+
+# In an ideal world (i.e., XHTML) we wouldn't have to bother with any of this
+# monkey business of barriers to minimization!
+
+=head2 hashset %isCDATA_Parent
+
+This hashset includes all elements whose content is CDATA.
+
+=cut
+
+%isCDATA_Parent = map {; $_ => 1 }
+  qw(script style  xmp listing plaintext);
+
+# TODO: there's nothing else that takes CDATA children, right?
+
+# As the HTML3 DTD (Raggett 1995-04-24) noted:
+#   The XMP, LISTING and PLAINTEXT tags are incompatible with SGML
+#   and derive from very early versions of HTML. They require non-
+#   standard parsers and will cause problems for processing
+#   documents with standard SGML tools.
+
+
+=head1 CAVEATS
+
+You may find it useful to alter the behavior of modules (like
+C<HTML::Element> or C<HTML::TreeBuilder>) that use C<HTML::Tagset>'s
+data tables by altering the data tables themselves.  You are welcome
+to try, but be careful; and be aware that different modules may or may
+react differently to the data tables being changed.
+
+Note that it may be inappropriate to use these tables for I<producing>
+HTML -- for example, C<%isHeadOrBodyElement> lists the tagnames
+for all elements that can appear either in the head or in the body,
+such as "script".  That doesn't mean that I am saying your code that
+produces HTML should feel free to put script elements in either place!
+If you are producing programs that spit out HTML, you should be
+I<intimately> familiar with the DTDs for HTML or XHTML (available at
+C<http://www.w3.org/>), and you should slavishly obey them, not
+the data tables in this document.
+
+=head1 SEE ALSO
+
+L<HTML::Element>, L<HTML::TreeBuilder>, L<HTML::LinkExtor>
+
+=head1 COPYRIGHT & LICENSE
+
+Copyright 1995-2000 Gisle Aas.
+
+Copyright 2000-2005 Sean M. Burke.
+
+Copyright 2005 Andy Lester.
+
+This program is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 ACKNOWLEDGEMENTS
+
+Most of the code/data in this module was adapted from code written
+by Gisle Aas for C<HTML::Element>, C<HTML::TreeBuilder>, and
+C<HTML::LinkExtor>.  Then it was maintained by Sean M. Burke.
+
+=head1 AUTHOR
+
+Current maintainer: Andy Lester, C<< <andy at petdance.com> >>
+
+=head1 BUGS
+
+Please report any bugs or feature requests to
+C<bug-html-tagset at rt.cpan.org>, or through the web interface at
+L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=HTML-Tagset>.  I will
+be notified, and then you'll automatically be notified of progress on
+your bug as I make changes.
+
+=cut
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/TokeParser.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/TokeParser.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/TokeParser.pm	(revision 24799)
@@ -0,0 +1,371 @@
+package HTML::TokeParser;
+
+# $Id: TokeParser.pm 22649 2010-08-17 02:03:34Z davidb $
+
+require HTML::PullParser;
+@ISA=qw(HTML::PullParser);
+#$VERSION = sprintf("%d.%02d", q$Revision: 22649 $ =~ /(\d+)\.(\d+)/);
+
+use strict;
+use Carp ();
+use HTML::Entities qw(decode_entities);
+use HTML::Tagset ();
+
+my %ARGS =
+(
+ start       => "'S',tagname,attr,attrseq,text",
+ end         => "'E',tagname,text",
+ text        => "'T',text,is_cdata",
+ process     => "'PI',token0,text",
+ comment     => "'C',text",
+ declaration => "'D',text",
+
+ # options that default on
+ unbroken_text => 1,
+);
+
+
+sub new
+{
+    my $class = shift;
+    my %cnf;
+    if (@_ == 1) {
+	my $type = (ref($_[0]) eq "SCALAR") ? "doc" : "file";
+	%cnf = ($type => $_[0]);
+    }
+    else {
+	%cnf = @_;
+    }
+
+    my $textify = delete $cnf{textify} || {img => "alt", applet => "alt"};
+
+    my $self = $class->SUPER::new(%cnf, %ARGS) || return undef;
+
+    $self->{textify} = $textify;
+    $self;
+}
+
+
+sub get_tag
+{
+    my $self = shift;
+    my $token;
+    while (1) {
+	$token = $self->get_token || return undef;
+	my $type = shift @$token;
+	next unless $type eq "S" || $type eq "E";
+	substr($token->[0], 0, 0) = "/" if $type eq "E";
+	return $token unless @_;
+	for (@_) {
+	    return $token if $token->[0] eq $_;
+	}
+    }
+}
+
+
+sub _textify {
+    my($self, $token) = @_;
+    my $tag = $token->[1];
+    return undef unless exists $self->{textify}{$tag};
+
+    my $alt = $self->{textify}{$tag};
+    my $text;
+    if (ref($alt)) {
+	$text = &$alt(@$token);
+    } else {
+	$text = $token->[2]{$alt || "alt"};
+	$text = "[\U$tag]" unless defined $text;
+    }
+    return $text;
+}
+
+
+sub get_text
+{
+    my $self = shift;
+    my @text;
+    while (my $token = $self->get_token) {
+	my $type = $token->[0];
+	if ($type eq "T") {
+	    my $text = $token->[1];
+	    decode_entities($text) unless $token->[2];
+	    push(@text, $text);
+	} elsif ($type =~ /^[SE]$/) {
+	    my $tag = $token->[1];
+	    if ($type eq "S") {
+		if (defined(my $text = _textify($self, $token))) {
+		    push(@text, $text);
+		    next;
+		}
+	    } else {
+		$tag = "/$tag";
+	    }
+	    if (!@_ || grep $_ eq $tag, @_) {
+		 $self->unget_token($token);
+		 last;
+	    }
+	    push(@text, " ")
+		if $tag eq "br" || !$HTML::Tagset::isPhraseMarkup{$token->[1]};
+	}
+    }
+    join("", @text);
+}
+
+
+sub get_trimmed_text
+{
+    my $self = shift;
+    my $text = $self->get_text(@_);
+    $text =~ s/^\s+//; $text =~ s/\s+$//; $text =~ s/\s+/ /g;
+    $text;
+}
+
+sub get_phrase {
+    my $self = shift;
+    my @text;
+    while (my $token = $self->get_token) {
+	my $type = $token->[0];
+	if ($type eq "T") {
+	    my $text = $token->[1];
+	    decode_entities($text) unless $token->[2];
+	    push(@text, $text);
+	} elsif ($type =~ /^[SE]$/) {
+	    my $tag = $token->[1];
+	    if ($type eq "S") {
+		if (defined(my $text = _textify($self, $token))) {
+		    push(@text, $text);
+		    next;
+		}
+	    }
+	    if (!$HTML::Tagset::isPhraseMarkup{$tag}) {
+		$self->unget_token($token);
+		last;
+	    }
+	    push(@text, " ") if $tag eq "br";
+	}
+    }
+    my $text = join("", @text);
+    $text =~ s/^\s+//; $text =~ s/\s+$//; $text =~ s/\s+/ /g;
+    $text;
+}
+
+1;
+
+
+__END__
+
+=head1 NAME
+
+HTML::TokeParser - Alternative HTML::Parser interface
+
+=head1 SYNOPSIS
+
+ require HTML::TokeParser;
+ $p = HTML::TokeParser->new("index.html") ||
+      die "Can't open: $!";
+ $p->empty_element_tags(1);  # configure its behaviour
+
+ while (my $token = $p->get_token) {
+     #...
+ }
+
+=head1 DESCRIPTION
+
+The C<HTML::TokeParser> is an alternative interface to the
+C<HTML::Parser> class.  It is an C<HTML::PullParser> subclass with a
+predeclared set of token types.  If you wish the tokens to be reported
+differently you probably want to use the C<HTML::PullParser> directly.
+
+The following methods are available:
+
+=over 4
+
+=item $p = HTML::TokeParser->new( $filename, %opt );
+
+=item $p = HTML::TokeParser->new( $filehandle, %opt );
+
+=item $p = HTML::TokeParser->new( \$document, %opt );
+
+The object constructor argument is either a file name, a file handle
+object, or the complete document to be parsed.  Extra options can be
+provided as key/value pairs and are processed as documented by the base
+classes.
+
+If the argument is a plain scalar, then it is taken as the name of a
+file to be opened and parsed.  If the file can't be opened for
+reading, then the constructor will return C<undef> and $! will tell
+you why it failed.
+
+If the argument is a reference to a plain scalar, then this scalar is
+taken to be the literal document to parse.  The value of this
+scalar should not be changed before all tokens have been extracted.
+
+Otherwise the argument is taken to be some object that the
+C<HTML::TokeParser> can read() from when it needs more data.  Typically
+it will be a filehandle of some kind.  The stream will be read() until
+EOF, but not closed.
+
+A newly constructed C<HTML::TokeParser> differ from its base classes
+by having the C<unbroken_text> attribute enabled by default. See
+L<HTML::Parser> for a description of this and other attributes that
+influence how the document is parsed. It is often a good idea to enable
+C<empty_element_tags> behaviour.
+
+Note that the parsing result will likely not be valid if raw undecoded
+UTF-8 is used as a source.  When parsing UTF-8 encoded files turn
+on UTF-8 decoding:
+
+   open(my $fh, "<:utf8", "index.html") || die "Can't open 'index.html': $!";
+   my $p = HTML::TokeParser->new( $fh );
+   # ...
+
+If a $filename is passed to the constructor the file will be opened in
+raw mode and the parsing result will only be valid if its content is
+Latin-1 or pure ASCII.
+
+If parsing from an UTF-8 encoded string buffer decode it first:
+
+   utf8::decode($document);
+   my $p = HTML::TokeParser->new( \$document );
+   # ...
+
+=item $p->get_token
+
+This method will return the next I<token> found in the HTML document,
+or C<undef> at the end of the document.  The token is returned as an
+array reference.  The first element of the array will be a string
+denoting the type of this token: "S" for start tag, "E" for end tag,
+"T" for text, "C" for comment, "D" for declaration, and "PI" for
+process instructions.  The rest of the token array depend on the type
+like this:
+
+  ["S",  $tag, $attr, $attrseq, $text]
+  ["E",  $tag, $text]
+  ["T",  $text, $is_data]
+  ["C",  $text]
+  ["D",  $text]
+  ["PI", $token0, $text]
+
+where $attr is a hash reference, $attrseq is an array reference and
+the rest are plain scalars.  The L<HTML::Parser/Argspec> explains the
+details.
+
+=item $p->unget_token( @tokens )
+
+If you find you have read too many tokens you can push them back,
+so that they are returned the next time $p->get_token is called.
+
+=item $p->get_tag
+
+=item $p->get_tag( @tags )
+
+This method returns the next start or end tag (skipping any other
+tokens), or C<undef> if there are no more tags in the document.  If
+one or more arguments are given, then we skip tokens until one of the
+specified tag types is found.  For example:
+
+   $p->get_tag("font", "/font");
+
+will find the next start or end tag for a font-element.
+
+The tag information is returned as an array reference in the same form
+as for $p->get_token above, but the type code (first element) is
+missing. A start tag will be returned like this:
+
+  [$tag, $attr, $attrseq, $text]
+
+The tagname of end tags are prefixed with "/", i.e. end tag is
+returned like this:
+
+  ["/$tag", $text]
+
+=item $p->get_text
+
+=item $p->get_text( @endtags )
+
+This method returns all text found at the current position. It will
+return a zero length string if the next token is not text. Any
+entities will be converted to their corresponding character.
+
+If one or more arguments are given, then we return all text occurring
+before the first of the specified tags found. For example:
+
+   $p->get_text("p", "br");
+
+will return the text up to either a paragraph of linebreak element.
+
+The text might span tags that should be I<textified>.  This is
+controlled by the $p->{textify} attribute, which is a hash that
+defines how certain tags can be treated as text.  If the name of a
+start tag matches a key in this hash then this tag is converted to
+text.  The hash value is used to specify which tag attribute to obtain
+the text from.  If this tag attribute is missing, then the upper case
+name of the tag enclosed in brackets is returned, e.g. "[IMG]".  The
+hash value can also be a subroutine reference.  In this case the
+routine is called with the start tag token content as its argument and
+the return value is treated as the text.
+
+The default $p->{textify} value is:
+
+  {img => "alt", applet => "alt"}
+
+This means that <IMG> and <APPLET> tags are treated as text, and that
+the text to substitute can be found in the ALT attribute.
+
+=item $p->get_trimmed_text
+
+=item $p->get_trimmed_text( @endtags )
+
+Same as $p->get_text above, but will collapse any sequences of white
+space to a single space character.  Leading and trailing white space is
+removed.
+
+=item $p->get_phrase
+
+This will return all text found at the current position ignoring any
+phrasal-level tags.  Text is extracted until the first non
+phrasal-level tag.  Textification of tags is the same as for
+get_text().  This method will collapse white space in the same way as
+get_trimmed_text() does.
+
+The definition of <i>phrasal-level tags</i> is obtained from the
+HTML::Tagset module.
+
+=back
+
+=head1 EXAMPLES
+
+This example extracts all links from a document.  It will print one
+line for each link, containing the URL and the textual description
+between the <A>...</A> tags:
+
+  use HTML::TokeParser;
+  $p = HTML::TokeParser->new(shift||"index.html");
+
+  while (my $token = $p->get_tag("a")) {
+      my $url = $token->[1]{href} || "-";
+      my $text = $p->get_trimmed_text("/a");
+      print "$url\t$text\n";
+  }
+
+This example extract the <TITLE> from the document:
+
+  use HTML::TokeParser;
+  $p = HTML::TokeParser->new(shift||"index.html");
+  if ($p->get_tag("title")) {
+      my $title = $p->get_trimmed_text;
+      print "Title: $title\n";
+  }
+
+=head1 SEE ALSO
+
+L<HTML::PullParser>, L<HTML::Parser>
+
+=head1 COPYRIGHT
+
+Copyright 1998-2005 Gisle Aas.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/TokeParser/Simple.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/TokeParser/Simple.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/TokeParser/Simple.pm	(revision 24799)
@@ -0,0 +1,627 @@
+package HTML::TokeParser::Simple;
+
+use strict;
+use HTML::TokeParser;
+use HTML::TokeParser::Simple::Token;
+use HTML::TokeParser::Simple::Token::Tag;
+use HTML::TokeParser::Simple::Token::Tag::Start;
+use HTML::TokeParser::Simple::Token::Tag::End;
+use HTML::TokeParser::Simple::Token::Text;
+use HTML::TokeParser::Simple::Token::Comment;
+use HTML::TokeParser::Simple::Token::Declaration;
+use HTML::TokeParser::Simple::Token::ProcessInstruction;
+
+use vars qw/ @ISA $VERSION $REVISION /;
+
+$REVISION = '$Id: Simple.pm 13983 2007-03-15 01:32:44Z lh92 $';
+$VERSION  = '3.15';
+@ISA = qw/ HTML::TokeParser /;
+
+# constructors
+
+my %FACTORY_CLASSES = (
+    S   => 'HTML::TokeParser::Simple::Token::Tag::Start',
+    E   => 'HTML::TokeParser::Simple::Token::Tag::End',
+    T   => 'HTML::TokeParser::Simple::Token::Text',
+    C   => 'HTML::TokeParser::Simple::Token::Comment',
+    D   => 'HTML::TokeParser::Simple::Token::Declaration',
+    PI  => 'HTML::TokeParser::Simple::Token::ProcessInstruction',
+);
+
+sub _croak {
+    my ($proto, $message) = @_;
+    require Carp;
+    Carp::croak($message);
+}
+
+sub new {
+    my ($class, @args) = @_;
+    return 1 == @args
+        ? $class->SUPER::new(@args)
+        : $class->_init(@args);
+}
+
+sub _init {
+    my ($class, $source_type, $source) = @_;
+    my %sources = (
+        file   => sub { $source },
+        handle => sub { $source },
+        string => sub { \$source },
+        url    => sub {
+            eval "require LWP::Simple";
+            $class->_croak("Cannot load LWP::Simple: $@") if $@;
+            my $content = LWP::Simple::get($source);
+            $class->_croak("Could not fetch content from ($source)")
+                unless defined $content;
+            return \$content;
+        },
+    );
+    unless (exists $sources{$source_type}) {
+        $class->_croak("Unknown source type ($source_type)");
+    }
+    return $class->new($sources{$source_type}->());
+}
+
+sub get_token {
+    my $self = shift;
+    my @args = @_;
+    my $token = $self->SUPER::get_token( @args );
+    return unless defined $token;
+    if (my $factory_class = $FACTORY_CLASSES{$token->[0]}) {
+        return $factory_class->new($token);
+    }
+    else {
+        # this should never happen
+        $self->_croak("Cannot determine token class for token (@$token)");
+    }
+}
+
+sub get_tag {
+    my $self = shift;
+    my @args = @_;
+    my $token = $self->SUPER::get_tag( @args );
+    return unless defined $token;
+    return $token->[0] =~ /^\//
+        ?  HTML::TokeParser::Simple::Token::Tag::End->new($token)
+        :  HTML::TokeParser::Simple::Token::Tag::Start->new($token);
+}
+
+sub peek {
+    my ($self, $count) = @_;
+    $count  ||= 1;
+    
+    unless ($count =~ /^\d+$/) {
+        $self->_croak("Argument to peek() must be a positive integer, not ($count)");
+    }
+
+    my $items = 0;
+    my $html  = '';
+    my @tokens;
+    while ( $items++ < $count && defined ( my $token = $self->get_token ) ) {
+        $html .= $token->as_is;
+        push @tokens, $token;
+    }
+    $self->unget_token(@tokens);
+    return $html;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+HTML::TokeParser::Simple - Easy to use C<HTML::TokeParser> interface
+
+=head1 SYNOPSIS
+
+ use HTML::TokeParser::Simple;
+ my $p = HTML::TokeParser::Simple->new( $somefile );
+
+ while ( my $token = $p->get_token ) {
+     # This prints all text in an HTML doc (i.e., it strips the HTML)
+     next unless $token->is_text;
+     print $token->as_is;
+ }
+
+
+=head1 DESCRIPTION
+
+C<HTML::TokeParser> is an excellent module that's often used for parsing HTML.
+However, the tokens returned are not exactly intuitive to parse:
+
+ ["S",  $tag, $attr, $attrseq, $text]
+ ["E",  $tag, $text]
+ ["T",  $text, $is_data]
+ ["C",  $text]
+ ["D",  $text]
+ ["PI", $token0, $text]
+
+To simplify this, C<HTML::TokeParser::Simple> allows the user ask more
+intuitive (read: more self-documenting) questions about the tokens returned.
+
+You can also rebuild some tags on the fly.  Frequently, the attributes
+associated with start tags need to be altered, added to, or deleted.  This
+functionality is built in.
+
+Since this is a subclass of C<HTML::TokeParser>, all C<HTML::TokeParser>
+methods are available.  To truly appreciate the power of this module, please
+read the documentation for C<HTML::TokeParser> and C<HTML::Parser>.
+
+=head1 CONTRUCTORS
+
+=head2 C<new($source)>
+
+The constructor for C<HTML::TokeParser::Simple> can be used just like
+C<HTML::TokeParser>'s constructor:
+
+  my $parser = HTML::TokeParser::Simple->new($filename);
+  # or
+  my $parser = HTML::TokeParser::Simple->new($filehandle);
+  # or
+  my $parser = HTML::TokeParser::Simple->new(\$html_string);
+
+=head2 C<new($source_type, $source)>
+
+If you wish to be more explicit, there is a new style of
+constructor avaiable.
+
+  my $parser = HTML::TokeParser::Simple->new(file   => $filename);
+  # or
+  my $parser = HTML::TokeParser::Simple->new(handle => $filehandle);
+  # or
+  my $parser = HTML::TokeParser::Simple->new(string => $html_string);
+
+Note that you do not have to provide a reference for the string if using the
+string constructor.
+
+As a convenience, you can also attempt to fetch the HTML directly from a URL.
+
+  my $parser = HTML::TokeParser::Simple->new(url => 'http://some.url');
+
+This method relies on C<LWP::Simple>.  If this module is not found or the page
+cannot be fetched, the constructor will C<croak()>.
+
+=head1 PARSER METHODS
+
+=head2 get_token
+
+This method will return the next token that C<HTML::TokeParser::get_token()>
+method would return.  However, it will be blessed into a class appropriate
+which represents the token type.
+
+=head2 get_tag
+
+This method will return the next token that C<HTML::TokeParser::get_tag()>
+method would return.  However, it will be blessed into either the
+L<HTML::TokeParser::Simple::Token::Tag::Start> or
+L<HTML::TokeParser::Simple::Token::Tag::End> class.
+
+=head2 peek
+
+As of version C<3.14>, you can now C<peek()> at the upcomings tokens without
+affecting the state of the parser.  By default, C<peek()> will return the text
+of the next token, but specifying an integer C<$count> will return the text of
+the next C<$count> tokens.
+
+This is useful when you're trying to debug where you are in a document.
+
+ warn $parser->peek(3); # show the next 3 tokens
+
+=head1 ACCESSORS
+
+The following methods may be called on the token object which is returned,
+not on the parser object.
+
+=head2 Boolean Accessors
+
+These accessors return true or false.
+
+=over 4
+
+=item * C<is_tag([$tag])>
+
+Use this to determine if you have any tag.  An optional "tag type" may be
+passed.  This will allow you to match if it's a I<particular> tag.  The
+supplied tag is case-insensitive.
+
+ if ( $token->is_tag ) { ... }
+
+Optionally, you may pass a regular expression as an argument.
+
+=item * C<is_start_tag([$tag])>
+
+Use this to determine if you have a start tag.  An optional "tag type" may be
+passed.  This will allow you to match if it's a I<particular> start tag.  The
+supplied tag is case-insensitive.
+
+ if ( $token->is_start_tag ) { ... }
+ if ( $token->is_start_tag( 'font' ) ) { ... }
+
+Optionally, you may pass a regular expression as an argument.  To match all
+header (h1, h2, ... h6) tags:
+
+ if ( $token->is_start_tag( qr/^h[123456]$/ ) ) { ... }
+
+=item * C<is_end_tag([$tag])>
+
+Use this to determine if you have an end tag.  An optional "tag type" may be
+passed.  This will allow you to match if it's a I<particular> end tag.  The
+supplied tag is case-insensitive.
+
+When testing for an end tag, the forward slash on the tag is optional.
+
+ while ( $token = $p->get_token ) {
+   if ( $token->is_end_tag( 'form' ) ) { ... }
+ }
+
+Or:
+
+ while ( $token = $p->get_token ) {
+   if ( $token->is_end_tag( '/form' ) ) { ... }
+ }
+
+Optionally, you may pass a regular expression as an argument.
+
+=item * C<is_text()>
+
+Use this to determine if you have text.  Note that this is I<not> to be
+confused with the C<return_text> (I<deprecated>) method described below!
+C<is_text> will identify text that the user typically sees display in the Web
+browser.
+
+=item * C<is_comment()>
+
+Are you still reading this?  Nobody reads POD.  Don't you know you're supposed
+to go to CLPM, ask a question that's answered in the POD and get flamed?  It's
+a rite of passage.
+
+Really.
+
+C<is_comment> is used to identify comments.  See the HTML::Parser documentation
+for more information about comments.  There's more than you might think.
+
+=item * C<is_declaration()>
+
+This will match the DTD at the top of your HTML. (You I<do> use DTD's, don't
+you?)
+
+=item * C<is_process_instruction()>
+
+Process Instructions are from XML.  This is very handy if you need to parse out
+PHP and similar things with a parser.
+
+Currently, there appear to be some problems with process instructions.  You can
+override C<HTML::TokeParser::Simple::Token::ProcessInstruction> if you need to.
+
+=item * C<is_pi()>
+
+This is a shorthand for C<is_process_instruction()>.
+
+=back
+
+=head2 Data Accessors
+
+Some of these were originally C<return_> methods, but that name was not only
+unwieldy, but also went against reasonable conventions.  The C<get_> methods
+listed below still have C<return_> methods available for backwards
+compatibility reasons, but they merely call their C<get_> counterpart.  For
+example, calling C<return_tag()> actually calls C<get_tag()> internally.
+
+=over 4
+
+=item * C<get_tag()>
+
+Do you have a start tag or end tag?  This will return the type (lower case).
+Note that this is I<not> the same as the C<get_tag()> method on the actual
+parser object.
+
+=item * C<get_attr([$attribute])>
+
+If you have a start tag, this will return a hash ref with the attribute names
+as keys and the values as the values.
+
+If you pass in an attribute name, it will return the value for just that
+attribute.  
+
+Returns false if the token is not a start tag.
+
+=item * C<get_attrseq()>
+
+For a start tag, this is an array reference with the sequence of the
+attributes, if any.
+
+Returns false if the token is not a start tag.
+
+=item * C<return_text()>
+
+This method has been heavily deprecated (for a couple of years) in favor of
+C<as_is>.  Programmers were getting confused over the difference between
+C<is_text>, C<return_text>, and some parser methods such as
+C<HTML::TokeParser::get_text> and friends.
+
+Using this method still succeeds, but will now carp and B<will be removed>
+in the next major release of this module.
+
+=item * C<as_is()>
+
+This is the exact text of whatever the token is representing.
+
+=item * C<get_token0()>
+
+For processing instructions, this will return the token found immediately after
+the opening tag.  Example:  For <?php, "php" will be the start of the returned
+string.
+
+Note that process instruction handling appears to be incomplete in
+C<HTML::TokeParser>.
+
+Returns false if the token is not a process instruction.
+
+=back
+
+=head1 MUTATORS
+
+The C<delete_attr()> and C<set_attr()> methods allow the programmer to rewrite
+start tag attributes on the fly.  It should be noted that bad HTML will be
+"corrected" by this.  Specifically, the new tag will have all attributes
+lower-cased with the values properly quoted.
+
+Self-closing tags (e.g. E<lt>hr /E<gt>) are also handled correctly.  Some older
+browsers require a space prior to the final slash in a self-closed tag.  If
+such a space is detected in the original HTML, it will be preserved.
+
+Calling a mutator on an token type that does not support that property is a
+no-op.  For example:
+
+ if ($token->is_comment) {
+    $token->set_attr(foo => 'bar'); # does nothing
+ }
+
+=over 4
+
+=item * C<delete_attr($name)>
+
+This method attempts to delete the attribute specified.  It will silently fail
+if called on anything other than a start tag.  The argument is
+case-insensitive, but must otherwise be an exact match of the attribute you are
+attempting to delete.  If the attribute is not found, the method will return
+without changing the tag.
+
+ # <body bgcolor="#FFFFFF">
+ $token->delete_attr('bgcolor');
+ print $token->as_is;
+ # <body>
+ 
+After this method is called, if successful, the C<as_is()>, C<get_attr()>
+and C<get_attrseq()> methods will all return updated results.
+
+=item * C<set_attr($name,$value)>
+
+This method will set the value of an attribute.  If the attribute is not found,
+then C<get_attrseq()> will have the new attribute listed at the end.
+
+ # <p>
+ $token->set_attr(class => 'some_class');
+ print $token->as_is;
+ # <p class="some_class">
+
+ # <body bgcolor="#FFFFFF">
+ $token->set_attr('bgcolor','red');
+ print $token->as_is;
+ # <body bgcolor="red">
+
+After this method is called, if successful, the C<as_is()>, C<get_attr()>
+and C<get_attrseq()> methods will all return updated results.
+
+=item * C<set_attr($hashref)>
+
+Under the premise that C<set_> methods should accept what their corresponding
+C<get_> methods emit, the following works:
+
+  $tag->set_attr($tag->get_attr);
+
+Theoretically that's a no-op and for purposes of rendering HTML, it should be.
+However, internally this calls C<$tag-E<gt>rewrite_tag>, so see that method to
+understand how this may affect you.
+
+Of course, this is useless if you want to actually change the attributes, so you
+can do this:
+
+  my $attrs = {
+    class  => 'headline',
+    valign => 'top'
+  };
+  $token->set_attr($attrs) 
+    if $token->is_start_tag('td') &&  $token->get_attr('class') eq 'stories';
+
+=item * C<rewrite_tag()>
+
+This method rewrites the tag.  The tag name and the name of all attributes will
+be lower-cased.  Values that are not quoted with double quotes will be.  This
+may be called on both start or end tags.  Note that both C<set_attr()> and
+C<delete_attr()> call this method prior to returning.
+
+If called on a token that is not a tag, it simply returns.  Regardless of how
+it is called, it returns the token.
+
+ # <body alink=#0000ff BGCOLOR=#ffffff class='none'>
+ $token->rewrite_tag;
+ print $token->as_is;
+ # <body alink="#0000ff" bgcolor="#ffffff" class="none">
+
+A quick cleanup of sloppy HTML is now the following:
+
+ my $parser = HTML::TokeParser::Simple->new( string => $ugly_html );
+ while (my $token = $parser->get_token) {
+     $token->rewrite_tag;
+     print $token->as_is;
+ }
+
+=back
+
+=head1 PARSER VERSUS TOKENS 
+
+The parser returns tokens that are blessed into appropriate classes.  Some
+people get confused and try to call parser methods on tokens and token methods
+on the parser.  To prevent this, C<HTML::TokeParser::Simple> versions 1.4 and
+above now bless all tokens into appropriate token classes.  Please keep this in
+mind while using this module (and many thanks to PodMaster
+L<http://www.perlmonks.org/index.pl?node_id=107642> for pointing out this issue
+to me.)
+
+=head1 EXAMPLES
+
+=head2 Finding comments
+
+For some strange reason, your Pointy-Haired Boss (PHB) is convinced that the
+graphics department is making fun of him by embedding rude things about him in
+HTML comments.  You need to get all HTML comments from the HTML.
+
+ use strict;
+ use HTML::TokeParser::Simple;
+
+ my @html_docs = glob( "*.html" );
+
+ open PHB, "> phbreport.txt" or die "Cannot open phbreport for writing: $!";
+
+ foreach my $doc ( @html_docs ) {
+     print "Processing $doc\n";
+     my $p = HTML::TokeParser::Simple->new( file => $doc );
+     while ( my $token = $p->get_token ) {
+         next unless $token->is_comment;
+         print PHB $token->as_is, "\n";
+     }
+ }
+
+ close PHB;
+
+=head2 Stripping Comments
+
+Uh oh.  Turns out that your PHB was right for a change.  Many of the comments
+in the HTML weren't very polite.  Since your entire graphics department was
+just fired, it falls on you need to strip those comments from the HTML.
+
+ use strict;
+ use HTML::TokeParser::Simple;
+
+ my $new_folder = 'no_comment/';
+ my @html_docs  = glob( "*.html" );
+
+ foreach my $doc ( @html_docs ) {
+     print "Processing $doc\n";
+     my $new_file = "$new_folder$doc";
+
+     open PHB, "> $new_file" or die "Cannot open $new_file for writing: $!";
+
+     my $p = HTML::TokeParser::Simple->new( $file => doc );
+     while ( my $token = $p->get_token ) {
+         next if $token->is_comment;
+         print PHB $token->as_is;
+     }
+     close PHB;
+ }
+
+=head2 Changing form tags
+
+Your company was foo.com and now is bar.com.  Unfortunately, whoever wrote your
+HTML decided to hardcode "http://www.foo.com/" into the C<action> attribute of
+the form tags.  You need to change it to "http://www.bar.com/".
+
+ use strict;
+ use HTML::TokeParser::Simple;
+
+ my $new_folder = 'new_html/';
+ my @html_docs  = glob( "*.html" );
+
+ foreach my $doc ( @html_docs ) {
+     print "Processing $doc\n";
+     my $new_file = "$new_folder$doc";
+
+     open FILE, "> $new_file" or die "Cannot open $new_file for writing: $!";
+
+     my $p = HTML::TokeParser::Simple->new( file => $doc );
+     while ( my $token = $p->get_token ) {
+         if ( $token->is_start_tag('form') ) {
+             my $action = $token->get_attr(action);
+             $action =~ s/www\.foo\.com/www.bar.com/;
+             $token->set_attr('action', $action);
+         }
+         print FILE $token->as_is;
+     }
+     close FILE;
+ }
+
+=head1 CAVEATS
+
+For compatability reasons with C<HTML::TokeParser>, methods that return
+references are violating encapsulation and altering the references directly
+B<will> alter the state of the object.  Subsequent calls to C<rewrite_tag()>
+can thus have unexpected results.  Do not alter these references directly
+unless you are following behavior described in these docs.  In the future,
+certain methods such as C<get_attr>, C<get_attrseq> and others may return a
+copy of the reference rather than the original reference.  This behavior has
+not yet been changed in order to maintain compatability with previous versions
+of this module.  At the present time, your author is not aware of anyone taking
+advantage of this "feature," but it's better to be safe than sorry.
+
+Use of C<$HTML::Parser::VERSION> which is less than 3.25 may result in
+incorrect behavior as older versions do not always handle XHTML correctly.  It
+is the programmer's responsibility to verify that the behavior of this code
+matches the programmer's needs.
+
+Note that C<HTML::Parser> processes text in 512 byte chunks.  This sometimes
+will cause strange behavior and cause text to be broken into more than one
+token.  You can suppress this behavior with the following command:
+
+ $p->unbroken_text( [$bool] );
+
+See the C<HTML::Parser> documentation and
+http://www.perlmonks.org/index.pl?node_id=230667 for more information.
+
+=head1 BUGS
+
+There are no known bugs, but that's no guarantee.
+
+Address bug reports and comments to: E<lt>eop_divo_sitruc@yahoo.comE<gt>.  When
+sending bug reports, please provide the version of C<HTML::Parser>,
+C<HTML::TokeParser>, C<HTML::TokeParser::Simple>, the version of Perl, and the
+version of the operating system you are using.
+
+Reverse the name to email the author.
+
+=head1 SUBCLASSING
+
+You may wish to change the behavior of this module.  You probably do not want
+to subclass C<HTML::TokeParser::Simple>.  Instead, you'll want to subclass one
+of the token classes.  C<HTML::TokeParser::Simple::Token> is the base class for
+all tokens.  Global behavioral changes should go there.  Otherwise, see the
+appropriate token class for the behavior you wish to alter.
+
+=head1 SEE ALSO
+
+L<HTML::TokeParser::Simple::Token>
+
+L<HTML::TokeParser::Simple::Token::Tag>
+
+L<HTML::TokeParser::Simple::Token::Text>
+
+L<HTML::TokeParser::Simple::Token::Comment>
+
+L<HTML::TokeParser::Simple::Token::Declaration>
+
+L<HTML::TokeParser::Simple::Token::ProcessInstruction>
+
+=head1 COPYRIGHT
+
+Copyright (c) 2004 by Curtis "Ovid" Poe.  All rights reserved.  This program is
+free software; you may redistribute it and/or modify it under the same terms as
+Perl itself
+
+=head1 AUTHOR
+
+Curtis "Ovid" Poe E<lt>eop_divo_sitruc@yahoo.comE<gt>
+
+Reverse the name to email the author.
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/TokeParser/Simple/Token.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/TokeParser/Simple/Token.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/TokeParser/Simple/Token.pm	(revision 24799)
@@ -0,0 +1,133 @@
+package HTML::TokeParser::Simple::Token;
+
+use strict;
+
+use vars qw/ $VERSION $REVISION /;
+$REVISION = '$Id: Token.pm 13983 2007-03-15 01:32:44Z lh92 $';
+$VERSION  = '3.0';
+
+sub new {
+    my ($class, $token) = @_;
+    $class->_croak("This class should not be instantiated") if __PACKAGE__ eq $class;
+    return bless $token, $class;
+}
+
+sub _croak {
+    my ($proto, $message) = @_;
+    require Carp;
+    Carp::croak($message);
+}
+
+sub _carp {
+    my ($proto, $message) = @_;
+    require Carp;
+    Carp::carp($message);
+}
+
+sub is_tag         {}
+sub is_start_tag   {}
+sub is_end_tag     {}
+sub is_text        {}
+sub is_comment     {}
+sub is_declaration {}
+sub is_pi          {}
+sub is_process_instruction {}
+
+sub rewrite_tag    { shift }
+sub delete_attr    {}
+sub set_attr       {}
+sub get_tag        {}
+sub return_tag     {}  # deprecated
+sub get_attr       {}
+sub return_attr    {}  # deprecated
+sub get_attrseq    {}
+sub return_attrseq {}  # deprecated
+sub get_token0     {}
+sub return_token0  {}  # deprecated
+
+# get_foo methods
+
+sub return_text {
+    my ($self) = @_;
+    $self->_carp('return_text() is deprecated.  Use as_is() instead');
+    goto &as_is;
+}
+
+sub as_is { return shift->[-1] }
+
+1;
+
+__END__
+
+=head1 NAME
+
+HTML::TokeParser::Simple::Token - Base class for C<HTML::TokeParser::Simple>
+tokens.
+
+=head1 SYNOPSIS
+
+ use HTML::TokeParser::Simple;
+ my $p = HTML::TokeParser::Simple->new( $somefile );
+
+ while ( my $token = $p->get_token ) {
+     # This prints all text in an HTML doc (i.e., it strips the HTML)
+     next unless $token->is_text;
+     print $token->as_is;
+ }
+
+=head1 DESCRIPTION
+
+This is the base class for all returned tokens.  It should never be
+instantiated directly.  In fact, it will C<croak()> if it is.
+
+=head1 METHODS
+
+The following list of methods are provided by this class.  Most of these are
+stub methods which must be overridden in a subclass.  See 
+L<HTML::TokeParser::Simple> for descriptions of these methods.
+
+=over 4
+
+=item * as_is
+
+=item * delete_attr
+
+=item * get_attr
+
+=item * get_attrseq
+
+=item * get_tag
+
+=item * get_token0
+
+=item * is_comment
+
+=item * is_declaration
+
+=item * is_end_tag
+
+=item * is_pi
+
+=item * is_process_instruction
+
+=item * is_start_tag
+
+=item * is_tag
+
+=item * is_text
+
+=item * return_attr
+
+=item * return_attrseq
+
+=item * return_tag
+
+=item * return_text
+
+=item * return_token0
+
+=item * rewrite_tag
+
+=item * set_attr
+
+=back
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/TokeParser/Simple/Token/Comment.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/TokeParser/Simple/Token/Comment.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/TokeParser/Simple/Token/Comment.pm	(revision 24799)
@@ -0,0 +1,44 @@
+package HTML::TokeParser::Simple::Token::Comment;
+
+use strict;
+
+use vars qw/ $VERSION $REVISION /;
+$REVISION = '$Id: Comment.pm 13983 2007-03-15 01:32:44Z lh92 $';
+$VERSION  = '1.0';
+use base 'HTML::TokeParser::Simple::Token';
+
+sub is_comment { 1 }
+
+1;
+
+__END__
+
+=head1 NAME
+
+HTML::TokeParser::Simple::Token::Comment - Token.pm comment class.
+
+=head1 SYNOPSIS
+
+ use HTML::TokeParser::Simple;
+ my $p = HTML::TokeParser::Simple->new( $somefile );
+
+ while ( my $token = $p->get_token ) {
+     # This prints all text in an HTML doc (i.e., it strips the HTML)
+     next unless $token->is_text;
+     print $token->as_is;
+ }
+
+=head1 DESCRIPTION
+
+This is the class for comment tokens.
+
+See L<HTML::Parser> for detailed information about comments.
+
+=head1 OVERRIDDEN METHODS
+
+=head2 is_comment
+
+C<is_comment()> will return true if the token is the DTD at the top of the
+HTML.
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/TokeParser/Simple/Token/Declaration.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/TokeParser/Simple/Token/Declaration.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/TokeParser/Simple/Token/Declaration.pm	(revision 24799)
@@ -0,0 +1,42 @@
+package HTML::TokeParser::Simple::Token::Declaration;
+
+use strict;
+
+use vars qw/ $VERSION $REVISION /;
+$REVISION = '$Id: Declaration.pm 13983 2007-03-15 01:32:44Z lh92 $';
+$VERSION  = '1.0';
+use base 'HTML::TokeParser::Simple::Token';
+
+sub is_declaration { 1 }
+
+1;
+
+__END__
+
+=head1 NAME
+
+HTML::TokeParser::Simple::Token::Declaration - Token.pm declaration class.
+
+=head1 SYNOPSIS
+
+ use HTML::TokeParser::Simple;
+ my $p = HTML::TokeParser::Simple->new( $somefile );
+
+ while ( my $token = $p->get_token ) {
+     # This prints all text in an HTML doc (i.e., it strips the HTML)
+     next unless $token->is_text;
+     print $token->as_is;
+ }
+
+=head1 DESCRIPTION
+
+This is the declaration class for tokens. 
+
+=head1 OVERRIDDEN METHODS
+
+=head2 is_declaration
+
+C<is_declaration()> will return true if the token is the DTD at the top of the
+HTML.
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/TokeParser/Simple/Token/ProcessInstruction.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/TokeParser/Simple/Token/ProcessInstruction.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/TokeParser/Simple/Token/ProcessInstruction.pm	(revision 24799)
@@ -0,0 +1,63 @@
+package HTML::TokeParser::Simple::Token::ProcessInstruction;
+
+use strict;
+
+use vars qw/ $VERSION $REVISION /;
+$REVISION = '$Id: ProcessInstruction.pm 13983 2007-03-15 01:32:44Z lh92 $';
+$VERSION  = '2.0';
+use base 'HTML::TokeParser::Simple::Token';
+
+sub return_token0 { goto &get_token0 } # deprecated
+
+sub get_token0 {
+    return shift->[1];
+}
+
+sub is_pi { 1 }
+
+sub is_process_instruction { 1 }
+
+1;
+
+__END__
+
+=head1 NAME
+
+HTML::TokeParser::Simple::Token::ProcessInstruction - Token.pm process instruction class.
+
+=head1 SYNOPSIS
+
+ use HTML::TokeParser::Simple;
+ my $p = HTML::TokeParser::Simple->new( $somefile );
+
+ while ( my $token = $p->get_token ) {
+     # This prints all text in an HTML doc (i.e., it strips the HTML)
+     next unless $token->is_text;
+     print $token->as_is;
+ }
+
+=head1 DESCRIPTION
+
+Process Instructions are from XML.  This is very handy if you need to parse out
+PHP and similar things with a parser.
+
+Currently, there appear to be some problems with process instructions.  You can
+override this class if you need finer grained handling of process instructions.
+
+C<is_pi()> and C<is_process_instruction()> both return true.
+
+=head1 OVERRIDDEN METHODS
+
+=over 4
+
+=item * get_token0
+
+=item * is_pi
+
+=item * is_process_instruction
+
+=item * return_token0
+
+=back
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/TokeParser/Simple/Token/Tag.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/TokeParser/Simple/Token/Tag.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/TokeParser/Simple/Token/Tag.pm	(revision 24799)
@@ -0,0 +1,84 @@
+package HTML::TokeParser::Simple::Token::Tag;
+
+use strict;
+
+use vars qw/ $VERSION $REVISION /;
+$REVISION = '$Id: Tag.pm 13983 2007-03-15 01:32:44Z lh92 $';
+$VERSION  = '1.2';
+use base 'HTML::TokeParser::Simple::Token';
+
+my %INSTANCE;
+
+sub new {
+    my ($class, $object) = @_;
+    $class->_croak("This is a base class that should not be instantiated") 
+        if __PACKAGE__ eq $class;
+    my $self = bless $object, $class;
+    $self->_init;
+}
+
+sub _get_attrseq { return [] }
+
+sub _get_attr { return {} }
+
+sub _set_text   { 
+    my $self = shift; 
+    $self->[-1] = shift;
+    return $self;
+}
+
+# attribute munging methods
+# get_foo methods
+
+sub return_text {
+    carp('return_text() is deprecated.  Use as_is() instead');
+    goto &as_is;
+}
+
+sub as_is {
+    return shift->_get_text;
+}
+
+sub get_tag {
+    return shift->_get_tag;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+HTML::TokeParser::Simple::Token::Tag - Token.pm tag class.
+
+=head1 SYNOPSIS
+
+ use HTML::TokeParser::Simple;
+ my $p = HTML::TokeParser::Simple->new( $somefile );
+
+ while ( my $token = $p->get_token ) {
+     # This prints all text in an HTML doc (i.e., it strips the HTML)
+     next unless $token->is_text;
+     print $token->as_is;
+ }
+
+=head1 DESCRIPTION
+
+This is the base class for start and end tokens.  It should not be
+instantiated.  See C<HTML::TokeParser::Simple::Token::Tag::Start> and
+C<HTML::TokeParser::Simple::Token::Tag::End> for details.
+
+=head1 OVERRIDDEN METHODS
+
+The following list of methods are provided by this class.  See
+L<HTML::TokeParser::Simple> for descriptions of these methods.
+
+=over 4
+
+=item * as_is
+
+=item * get_tag
+
+=item * return_text
+
+=back
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/TokeParser/Simple/Token/Tag/End.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/TokeParser/Simple/Token/Tag/End.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/TokeParser/Simple/Token/Tag/End.pm	(revision 24799)
@@ -0,0 +1,135 @@
+package HTML::TokeParser::Simple::Token::Tag::End;
+
+use strict;
+
+use vars qw/ $VERSION $REVISION /;
+$REVISION = '$Id: End.pm 13983 2007-03-15 01:32:44Z lh92 $';
+$VERSION  = '1.0';
+use base 'HTML::TokeParser::Simple::Token::Tag';
+
+my %TOKEN = (
+    tag   => 1,
+    text  => 2
+);
+
+# in order to maintain the 'drop-in replacement' ability with HTML::TokeParser,
+# we cannot alter the array refs.  Thus we must store instance data here.  Ugh.
+
+my %INSTANCE;
+
+sub _init {
+    my $self = shift;
+    if ('E' eq $self->[0]) {
+        $INSTANCE{$self}{offset} = 0;
+        $INSTANCE{$self}{tag}    = $self->[1];
+    }
+    else {
+        $INSTANCE{$self}{offset} = -1;
+        my $tag = $self->[0];
+        $tag =~ s/^\///;
+        $INSTANCE{$self}{tag}    = $tag;
+    }
+    return $self;
+}
+
+sub _get_offset { return $INSTANCE{+shift}{offset} }
+sub _get_text   { return shift->[-1] }
+
+sub _get_tag {
+    my $self  = shift;
+    return $INSTANCE{$self}{tag};
+}
+
+sub DESTROY     { delete $INSTANCE{+shift} }
+
+sub rewrite_tag {
+    my $self    = shift;
+    # capture the final slash if the tag is self-closing
+    my ($self_closing) = $self->_get_text =~ m{(\s?/)>$};
+    $self_closing ||= '';
+    
+    my $first = $self->is_end_tag ? '/' : '';
+    my $tag = sprintf '<%s%s%s>', $first, $self->get_tag, $self_closing;
+    $self->_set_text($tag);
+    return $self;
+}
+
+sub return_text {
+    require Carp;
+    Carp::carp('return_text() is deprecated.  Use as_is() instead');
+    goto &as_is;
+}
+
+sub as_is {
+    return shift->_get_text;
+}
+
+sub get_tag {
+    return shift->_get_tag;
+}
+
+# is_foo methods
+
+sub is_tag {
+    my $self = shift;
+    return $self->is_end_tag( @_ );
+}
+
+sub is_end_tag {
+    my ($self, $tag) = @_;
+    return $tag ? $self->_match_tag($tag) : 1;
+}
+
+sub _match_tag {
+    my ($self, $tag) = @_;
+    if ('Regexp' eq ref $tag) {
+        return $self->_get_tag =~ $tag;
+    }
+    else {
+        $tag = lc $tag;
+        $tag =~ s/^\///;
+        return $self->_get_tag eq $tag;
+    }
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+HTML::TokeParser::Simple::Token::Tag::End - Token.pm "end tag" class.
+
+=head1 SYNOPSIS
+
+ use HTML::TokeParser::Simple;
+ my $p = HTML::TokeParser::Simple->new( $somefile );
+
+ while ( my $token = $p->get_token ) {
+     # This prints all text in an HTML doc (i.e., it strips the HTML)
+     next unless $token->is_text;
+     print $token->as_is;
+ }
+
+=head1 DESCRIPTION
+
+This class does most of the heavy lifting for C<HTML::TokeParser::Simple>.  See
+the C<HTML::TokeParser::Simple> docs for details.
+
+=head1 OVERRIDDEN METHODS
+
+=over 4
+
+=item * as_is
+
+=item * get_tag
+
+=item * is_end_tag
+
+=item * is_tag
+
+=item * return_text
+
+=item * rewrite_tag
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/TokeParser/Simple/Token/Tag/Start.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/TokeParser/Simple/Token/Tag/Start.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/TokeParser/Simple/Token/Tag/Start.pm	(revision 24799)
@@ -0,0 +1,229 @@
+package HTML::TokeParser::Simple::Token::Tag::Start;
+
+use strict;
+
+use vars qw/ $VERSION $REVISION /;
+$REVISION = '$Id: Start.pm 13983 2007-03-15 01:32:44Z lh92 $';
+$VERSION  = '1.0';
+use base 'HTML::TokeParser::Simple::Token::Tag';
+
+use HTML::Entities qw/encode_entities/;
+
+my %TOKEN = (
+    tag     => 1,
+    attr    => 2,
+    attrseq => 3,
+    text    => 4
+);
+
+my %INSTANCE;
+
+sub _init {
+    my $self = shift;
+    if ('S' eq $self->[0]) {
+        $INSTANCE{$self}{offset} = 0;
+        $INSTANCE{$self}{tag}    = $self->[1];
+    }
+    else {
+        $INSTANCE{$self}{offset} = -1;
+        my $tag = $self->[0];
+        $tag =~ s/^\///;
+        $INSTANCE{$self}{tag}    = $tag;
+    }
+    return $self;
+}
+
+sub _get_offset { return $INSTANCE{+shift}{offset} }
+sub _get_text   { return shift->[-1] }
+
+sub _get_tag {
+    my $self  = shift;
+    return $INSTANCE{$self}{tag};
+}
+
+sub _get_attrseq {
+    my $self  = shift;
+    my $index = $TOKEN{attrseq} + $self->_get_offset;
+    return $self->[$index];
+}
+
+sub _get_attr {
+    my $self  = shift;
+    my $index = $TOKEN{attr} + $self->_get_offset;
+    return $self->[$index];
+}
+
+sub DESTROY     { delete $INSTANCE{+shift} }
+
+sub return_attr    { goto &get_attr }
+sub return_attrseq { goto &get_attrseq }
+sub return_tag     { goto &get_tag }
+
+# attribute munging methods
+
+sub set_attr {
+    my ($self, $name, $value) = @_;
+    return 'HASH' eq ref $name
+        ? $self->_set_attr_from_hashref($name)
+        : $self->_set_attr_from_string($name, $value);
+}
+
+sub _set_attr_from_string {
+    my ($self, $name, $value) = @_;
+    $name = lc $name;
+    my $attr    = $self->get_attr;
+    my $attrseq = $self->get_attrseq;
+    unless (exists $attr->{$name}) {
+        push @$attrseq => $name;
+    }
+    $attr->{$name} = $value;
+    $self->rewrite_tag;
+}
+
+sub _set_attr_from_hashref {
+    my ($self, $attr_hash) = @_;
+    while (my ($attr, $value) = each %$attr_hash) {
+        $self->set_attr($attr, $value);
+    }
+    return $self;
+}
+
+sub rewrite_tag {
+    my $self    = shift;
+    my $attr    = $self->get_attr;
+    my $attrseq = $self->get_attrseq;
+
+    # capture the final slash if the tag is self-closing
+    my ($self_closing) = $self->_get_text =~ m{(\s?/)>$};
+    $self_closing ||= '';
+    
+    my $tag = '';
+    foreach ( @$attrseq ) {
+        next if $_ eq '/'; # is this a bug in HTML::TokeParser?
+        $tag .= sprintf qq{ %s="%s"} => $_, encode_entities($attr->{$_});
+    }
+    my $first = $self->is_end_tag ? '/' : '';
+    $tag = sprintf '<%s%s%s%s>', $first, $self->get_tag, $tag, $self_closing;
+    $self->_set_text($tag);
+    return $self;
+}
+
+sub delete_attr {
+    my ($self,$name) = @_;
+    $name = lc $name;
+    my $attr = $self->get_attr;
+    return unless exists $attr->{$name};
+    delete $attr->{$name};
+    my $attrseq = $self->get_attrseq;
+    @$attrseq = grep { $_ ne $name } @$attrseq;
+    $self->rewrite_tag;
+}
+
+# get_foo methods
+
+sub return_text {
+    require Carp;
+    Carp::carp('return_text() is deprecated.  Use as_is() instead');
+    goto &as_is;
+}
+
+sub as_is {
+    return shift->_get_text;
+}
+
+sub get_tag {
+    return shift->_get_tag;
+}
+
+sub get_token0 {
+    return '';
+}
+
+sub get_attr {
+    my $self = shift;
+    my $attributes = $self->_get_attr;
+    return @_ ? $attributes->{lc shift} : $attributes;
+}
+
+sub get_attrseq {
+    my $self = shift;
+    $self->_get_attrseq;
+}
+
+# is_foo methods
+
+sub is_tag {
+    my $self = shift;
+    return $self->is_start_tag( @_ );
+}
+
+sub is_start_tag {
+    my ($self, $tag) = @_;
+    return $tag ? $self->_match_tag($tag) : 1;
+}
+
+sub _match_tag {
+    my ($self, $tag) = @_;
+    return 'Regexp' eq ref $tag
+        ? $self->_get_tag =~ $tag
+        : $self->_get_tag eq lc $tag;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+HTML::TokeParser::Simple::Token::Tag::Start - Token.pm "start tag" class.
+
+=head1 SYNOPSIS
+
+ use HTML::TokeParser::Simple;
+ my $p = HTML::TokeParser::Simple->new( $somefile );
+
+ while ( my $token = $p->get_token ) {
+     # This prints all text in an HTML doc (i.e., it strips the HTML)
+     next unless $token->is_text;
+     print $token->as_is;
+ }
+
+=head1 DESCRIPTION
+
+This class does most of the heavy lifting for C<HTML::TokeParser::Simple>.  See
+the C<HTML::TokeParser::Simple> docs for details.
+
+=head1 OVERRIDDEN METHODS
+
+=over 4
+
+=item * as_is
+
+=item * delete_attr
+
+=item * get_attr
+
+=item * get_attrseq
+
+=item * get_tag
+
+=item * get_token0
+
+=item * is_start_tag
+
+=item * is_tag
+
+=item * return_attr
+
+=item * return_attrseq
+
+=item * return_tag
+
+=item * return_text
+
+=item * rewrite_tag
+
+=item * set_attr
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/TokeParser/Simple/Token/Text.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/TokeParser/Simple/Token/Text.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/HTML/TokeParser/Simple/Token/Text.pm	(revision 24799)
@@ -0,0 +1,50 @@
+package HTML::TokeParser::Simple::Token::Text;
+
+use strict;
+
+use vars qw/ $VERSION $REVISION /;
+$REVISION = '$Id: Text.pm 13983 2007-03-15 01:32:44Z lh92 $';
+$VERSION  = '1.0';
+use base 'HTML::TokeParser::Simple::Token';
+
+sub as_is {
+    return shift->[1];
+}
+
+sub is_text { 1 }
+
+1;
+
+__END__
+
+=head1 NAME
+
+HTML::TokeParser::Simple::Token::Text - Token.pm text class.
+
+=head1 SYNOPSIS
+
+ use HTML::TokeParser::Simple;
+ my $p = HTML::TokeParser::Simple->new( $somefile );
+
+ while ( my $token = $p->get_token ) {
+     # This prints all text in an HTML doc (i.e., it strips the HTML)
+     next unless $token->is_text;
+     print $token->as_is;
+ }
+
+=head1 DESCRIPTION
+
+This class represents "text" tokens.  See the C<HTML::TokeParser::Simple>
+documentation for details.
+
+=head1 OVERRIDDEN METHODS
+
+=over 4
+
+=item * as_is
+
+=item * is_text
+
+=back
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool.pm	(revision 24799)
@@ -0,0 +1,6211 @@
+#------------------------------------------------------------------------------
+# File:         ExifTool.pm
+#
+# Description:  Read and write meta information
+#
+# URL:          http://owl.phy.queensu.ca/~phil/exiftool/
+#
+# Revisions:    Nov. 12/2003 - P. Harvey Created
+#               (See html/history.html for revision history)
+#
+# Legal:        Copyright (c) 2003-2010, Phil Harvey (phil at owl.phy.queensu.ca)
+#               This library is free software; you can redistribute it and/or
+#               modify it under the same terms as Perl itself.
+#------------------------------------------------------------------------------
+
+package Image::ExifTool;
+
+use strict;
+require 5.004;  # require 5.004 for UNIVERSAL::isa (otherwise 5.002 would do)
+require Exporter;
+use File::RandomAccess;
+
+use vars qw($VERSION $RELEASE @ISA %EXPORT_TAGS $AUTOLOAD @fileTypes %allTables
+            @tableOrder $exifAPP1hdr $xmpAPP1hdr $xmpExtAPP1hdr $psAPP13hdr
+            $psAPP13old @loadAllTables %UserDefined $evalWarning %noWriteFile
+            %magicNumber @langs $defaultLang %langName %charsetName %mimeType
+            $swapBytes $swapWords $currentByteOrder %unpackStd);
+
+$VERSION = '8.57';
+$RELEASE = '';
+@ISA = qw(Exporter);
+%EXPORT_TAGS = (
+    # all public non-object-oriented functions:
+    Public => [qw(
+        ImageInfo GetTagName GetShortcuts GetAllTags GetWritableTags
+        GetAllGroups GetDeleteGroups GetFileType CanWrite CanCreate
+    )],
+    # exports not part of the public API, but used by ExifTool modules:
+    DataAccess => [qw(
+        ReadValue GetByteOrder SetByteOrder ToggleByteOrder Get8u Get8s Get16u
+        Get16s Get32u Get32s Get64u GetFloat GetDouble GetFixed32s Write
+        WriteValue Tell Set8u Set8s Set16u Set32u
+    )],
+    Utils => [qw(GetTagTable TagTableKeys GetTagInfoList)],
+    Vars  => [qw(%allTables @tableOrder @fileTypes)],
+);
+# set all of our EXPORT_TAGS in EXPORT_OK
+Exporter::export_ok_tags(keys %EXPORT_TAGS);
+
+# test for problems that can arise if encoding.pm is used
+{ my $t = "\xff"; die "Incompatible encoding!\n" if ord($t) != 0xff; }
+
+# The following functions defined in Image::ExifTool::Writer are declared
+# here so their prototypes will be available.  These Writer routines will be
+# autoloaded when any of them is called.
+sub SetNewValue($;$$%);
+sub SetNewValuesFromFile($$;@);
+sub GetNewValues($;$$);
+sub CountNewValues($);
+sub SaveNewValues($);
+sub RestoreNewValues($);
+sub WriteInfo($$;$$);
+sub SetFileModifyDate($$;$);
+sub SetFileName($$;$);
+sub GetAllTags(;$);
+sub GetWritableTags(;$);
+sub GetAllGroups($);
+sub GetNewGroups($);
+sub GetDeleteGroups();
+# non-public routines below
+sub InsertTagValues($$$;$);
+sub IsWritable($);
+sub GetNewFileName($$);
+sub NextTagKey($$);
+sub LoadAllTables();
+sub GetNewTagInfoList($;$);
+sub GetNewTagInfoHash($@);
+sub GetLangInfo($$);
+sub Get64s($$);
+sub Get64u($$);
+sub GetExtended($$);
+sub DecodeBits($$;$);
+sub EncodeBits($$;$$);
+sub HexDump($;$%);
+sub DumpTrailer($$);
+sub DumpUnknownTrailer($$);
+sub VerboseInfo($$$%);
+sub VerboseDir($$;$$);
+sub VerboseValue($$$;$);
+sub VPrint($$@);
+sub Rationalize($;$);
+sub Write($@);
+sub WriteTrailerBuffer($$$);
+sub AddNewTrailers($;@);
+sub Tell($);
+sub WriteValue($$;$$$$);
+sub WriteDirectory($$$;$);
+sub WriteBinaryData($$$);
+sub CheckBinaryData($$$);
+sub WriteTIFF($$$);
+sub PackUTF8(@);
+sub UnpackUTF8($);
+sub SetPreferredByteOrder($);
+sub CopyBlock($$$);
+sub CopyFileAttrs($$);
+
+# other subroutine definitions
+sub DoEscape($$);
+sub ConvertFileSize($);
+sub ParseArguments($;@); #(defined in attempt to avoid mod_perl problem)
+
+# list of main tag tables to load in LoadAllTables() (sub-tables are recursed
+# automatically).  Note: They will appear in this order in the documentation
+# unless tweaked in BuildTagLookup::GetTableOrder().
+@loadAllTables = qw(
+    PhotoMechanic Exif GeoTiff CanonRaw KyoceraRaw MinoltaRaw PanasonicRaw
+    SigmaRaw JPEG GIMP Jpeg2000 GIF BMP BMP::OS2 PICT PNG MNG DjVu PGF MIFF PSP
+    PDF PostScript Photoshop::Header FujiFilm::RAF Sony::SRF2 Sony::SR2SubIFD
+    Sony::PMP ITC ID3 Vorbis FLAC APE APE::NewHeader APE::OldHeader MPC
+    MPEG::Audio MPEG::Video MPEG::Xing M2TS QuickTime QuickTime::ImageFile
+    Matroska MXF DV Flash Flash::FLV Real::Media Real::Audio Real::Metafile RIFF
+    AIFF ASF DICOM MIE HTML XMP::SVG EXE EXE::PEVersion EXE::PEString EXE::MachO
+    EXE::PEF EXE::ELF LNK Font RSRC Rawzor ZIP ZIP::GZIP ZIP::RAR RTF OOXML
+    iWork
+);
+
+# alphabetical list of current Lang modules
+@langs = qw(cs de en en_ca en_gb es fr it ja ko nl pl ru sv tr zh_cn zh_tw);
+
+$defaultLang = 'en';    # default language
+
+# language names
+%langName = (
+    cs => 'Czech (ÄeÅ¡tina)',
+    de => 'German (Deutsch)',
+    en => 'English',
+    en_ca => 'Canadian English',
+    en_gb => 'British English',
+    es => 'Spanish (EspaÃ±ol)',
+    fr => 'French (FranÃ§ais)',
+    it => 'Italian (Italiano)',
+    ja => 'Japanese (æ¥æ¬èª)',
+    ko => 'Korean (íêµ­ìŽ)',
+    nl => 'Dutch (Nederlands)',
+    pl => 'Polish (Polski)',
+    ru => 'Russian (Ð ÑÑÑÐºÐžÐ¹)',
+    sv => 'Swedish (Svenska)',
+   'tr'=> 'Turkish (TÃŒrkÃ§e)',
+    zh_cn => 'Simplified Chinese (ç®äœäž­æ)',
+    zh_tw => 'Traditional Chinese (ç¹é«äž­æ)',
+);
+
+# recognized file types, in the order we test unknown files
+# Notes: 1) There is no need to test for like types separately here
+# 2) Put types with weak file signatures at end of list to avoid false matches
+@fileTypes = qw(JPEG CRW TIFF GIF MRW RAF X3F JP2 PNG MIE MIFF PS PDF PSD XMP
+                BMP PPM RIFF AIFF ASF MOV MPEG Real SWF PSP FLV OGG FLAC APE MPC
+                MKV MXF DV PMP IND PGF ICC ITC HTML VRD RTF XCF QTIF FPX PICT
+                ZIP GZIP RAR BZ2 TAR RWZ EXE LNK RAW Font RSRC M2TS MP3 DICM);
+
+# file types that we can write (edit)
+my @writeTypes = qw(JPEG TIFF GIF CRW MRW ORF RAF RAW PNG MIE PSD XMP PPM
+                    EPS X3F PS PDF ICC VRD JP2 EXIF AI AIT IND);
+
+# file extensions that we can't write for various base types
+%noWriteFile = (
+    TIFF => [ qw(3FR DCR K25 KDC SRF) ],
+    XMP  => [ 'SVG' ],
+);
+
+# file types that we can create from scratch
+# - must update CanCreate() documentation if this list is changed!
+my %createTypes = (XMP=>1, ICC=>1, MIE=>1, VRD=>1, EXIF=>1);
+
+# file type lookup for all recognized file extensions
+my %fileTypeLookup = (
+   '3FR' => ['TIFF', 'Hasselblad RAW format'],
+   '3G2' => ['MOV',  '3rd Gen. Partnership Project 2 audio/video'],
+   '3GP' => ['MOV',  '3rd Gen. Partnership Project audio/video'],
+   '3GP2'=>  '3G2',
+   '3GPP'=>  '3GP',
+    ACR  => ['DICM', 'American College of Radiology ACR-NEMA'],
+    ACFM => ['Font', 'Adobe Composite Font Metrics'],
+    AFM  => ['Font', 'Adobe Font Metrics'],
+    AMFM => ['Font', 'Adobe Multiple Master Font Metrics'],
+    AI   => [['PDF','PS'], 'Adobe Illustrator'],
+    AIF  =>  'AIFF',
+    AIFC => ['AIFF', 'Audio Interchange File Format Compressed'],
+    AIFF => ['AIFF', 'Audio Interchange File Format'],
+    AIT  =>  'AI',
+    APE  => ['APE',  "Monkey's Audio format"],
+    ARW  => ['TIFF', 'Sony Alpha RAW format'],
+    ASF  => ['ASF',  'Microsoft Advanced Systems Format'],
+    AVI  => ['RIFF', 'Audio Video Interleaved'],
+    BMP  => ['BMP',  'Windows Bitmap'],
+    BTF  => ['BTF',  'Big Tagged Image File Format'], #(unofficial)
+    BZ2  => ['BZ2',  'BZIP2 archive'],
+    CIFF => ['CRW',  'Camera Image File Format'],
+    COS  => ['COS',  'Capture One Settings'],
+    CR2  => ['TIFF', 'Canon RAW 2 format'],
+    CRW  => ['CRW',  'Canon RAW format'],
+    CS1  => ['PSD',  'Sinar CaptureShop 1-Shot RAW'],
+    DC3  =>  'DICM',
+    DCM  =>  'DICM',
+    DCP  => ['TIFF', 'DNG Camera Profile'],
+    DCR  => ['TIFF', 'Kodak Digital Camera RAW'],
+    DFONT=> ['Font', 'Macintosh Data fork Font'],
+    DIB  => ['BMP',  'Device Independent Bitmap'],
+    DIC  =>  'DICM',
+    DICM => ['DICM', 'Digital Imaging and Communications in Medicine'],
+    DIVX => ['ASF',  'DivX media format'],
+    DJV  =>  'DJVU',
+    DJVU => ['AIFF', 'DjVu image'],
+    DLL  => ['EXE',  'Windows Dynamic Link Library'],
+    DNG  => ['TIFF', 'Digital Negative'],
+    DOC  => ['FPX',  'Microsoft Word Document'],
+    DOCM => [['ZIP','FPX'], 'Office Open XML Document Macro-enabled'],
+    # Note: I have seen a password-protected DOCX file which was FPX-like, so I assume
+    # that any other MS Office file could be like this too.  The only difference is
+    # that the ZIP and FPX formats are checked first, so if this is wrong, no biggie.
+    DOCX => [['ZIP','FPX'], 'Office Open XML Document'],
+    DOT  => ['FPX',  'Microsoft Word Template'],
+    DOTM => [['ZIP','FPX'], 'Office Open XML Document Template Macro-enabled'],
+    DOTX => [['ZIP','FPX'], 'Office Open XML Document Template'],
+    DV   => ['DV',   'Digital Video'],
+    DVB  => ['MOV',  'Digital Video Broadcasting'],
+    DYLIB=> ['EXE',  'Mach-O Dynamic Link Library'],
+    EIP  => ['ZIP',  'Capture One Enhanced Image Package'],
+    EPS  => ['EPS',  'Encapsulated PostScript Format'],
+    EPS2 =>  'EPS',
+    EPS3 =>  'EPS',
+    EPSF =>  'EPS',
+    ERF  => ['TIFF', 'Epson Raw Format'],
+    EXE  => ['EXE',  'Windows executable file'],
+    EXIF => ['EXIF', 'Exchangable Image File Metadata'],
+    F4A  => ['MOV',  'Adobe Flash Player 9+ Audio'],
+    F4B  => ['MOV',  'Adobe Flash Player 9+ audio Book'],
+    F4P  => ['MOV',  'Adobe Flash Player 9+ Protected'],
+    F4V  => ['MOV',  'Adobe Flash Player 9+ Video'],
+    FLAC => ['FLAC', 'Free Lossless Audio Codec'],
+    FLA  => ['FPX',  'Macromedia/Adobe Flash project'],
+    FLV  => ['FLV',  'Flash Video'],
+    FPX  => ['FPX',  'FlashPix'],
+    GIF  => ['GIF',  'Compuserve Graphics Interchange Format'],
+    GZ   =>  'GZIP',
+    GZIP => ['GZIP', 'GNU ZIP compressed archive'],
+    HDP  => ['TIFF', 'Windows HD Photo'],
+    HTM  =>  'HTML',
+    HTML => ['HTML', 'HyperText Markup Language'],
+    ICC  => ['ICC',  'International Color Consortium'],
+    ICM  =>  'ICC',
+    IIQ  => ['TIFF', 'Phase One Intelligent Image Quality RAW'],
+    IND  => ['IND',  'Adobe InDesign'],
+    INDD => ['IND',  'Adobe InDesign Document'],
+    INDT => ['IND',  'Adobe InDesign Template'],
+    ITC  => ['ITC',  'iTunes Cover Flow'],
+    JNG  => ['PNG',  'JPG Network Graphics'],
+    JP2  => ['JP2',  'JPEG 2000 file'],
+    # JP4? - looks like a JPEG but the image data is different
+    JPEG =>  'JPG',
+    JPG  => ['JPEG', 'Joint Photographic Experts Group'],
+    JPM  => ['JP2',  'JPEG 2000 compound image'],
+    JPX  => ['JP2',  'JPEG 2000 with extensions'],
+    K25  => ['TIFF', 'Kodak DC25 RAW'],
+    KDC  => ['TIFF', 'Kodak Digital Camera RAW'],
+    KEY  => ['ZIP',  'Apple Keynote presentation'],
+    KTH  => ['ZIP',  'Apple Keynote Theme'],
+    LNK  => ['LNK',  'Windows shortcut'],
+    M2T  =>  'M2TS',
+    M2TS => ['M2TS', 'MPEG-2 Transport Stream'],
+    M2V  => ['MPEG', 'MPEG-2 Video'],
+    M4A  => ['MOV',  'MPEG-4 Audio'],
+    M4B  => ['MOV',  'MPEG-4 audio Book'],
+    M4P  => ['MOV',  'MPEG-4 Protected'],
+    M4V  => ['MOV',  'MPEG-4 Video'],
+    MEF  => ['TIFF', 'Mamiya (RAW) Electronic Format'],
+    MIE  => ['MIE',  'Meta Information Encapsulation format'],
+    MIF  =>  'MIFF',
+    MIFF => ['MIFF', 'Magick Image File Format'],
+    MKA  => ['MKV',  'Matroska Audio'],
+    MKS  => ['MKV',  'Matroska Subtitle'],
+    MKV  => ['MKV',  'Matroska Video'],
+    MNG  => ['PNG',  'Multiple-image Network Graphics'],
+  # MODD => ['PLIST','Sony Picture Motion Metadata'],
+    MOS  => ['TIFF', 'Creo Leaf Mosaic'],
+    MOV  => ['MOV',  'Apple QuickTime movie'],
+    MP3  => ['MP3',  'MPEG-1 Layer 3 audio'],
+    MP4  => ['MOV',  'MPEG-4 video'],
+    MPC  => ['MPC',  'Musepack Audio'],
+    MPEG => ['MPEG', 'MPEG-1 or MPEG-2 audio/video'],
+    MPG  =>  'MPEG',
+    MPO  => ['JPEG', 'Extended Multi-Picture format'],
+    MQV  => ['MOV',  'Sony Mobile Quicktime Video'],
+    MRW  => ['MRW',  'Minolta RAW format'],
+    MTS  => ['M2TS', 'MPEG-2 Transport Stream'],
+    MXF  => ['MXF',  'Material Exchange Format'],
+  # NDPI => ['TIFF', 'Hamamatsu NanoZoomer Digital Pathology Image'],
+    NEF  => ['TIFF', 'Nikon (RAW) Electronic Format'],
+    NEWER => 'COS',
+    NMBTEMPLATE => ['ZIP','Apple Numbers Template'],
+    NRW  => ['TIFF', 'Nikon RAW (2)'],
+    NUMBERS => ['ZIP','Apple Numbers spreadsheet'],
+    ODP  => ['ZIP',  'Open Document Presentation'],
+    ODS  => ['ZIP',  'Open Document Spreadsheet'],
+    ODT  => ['ZIP',  'Open Document Text file'],
+    OGG  => ['OGG',  'Ogg Vorbis audio file'],
+    ORF  => ['ORF',  'Olympus RAW format'],
+    OTF  => ['Font', 'Open Type Font'],
+    PAGES => ['ZIP', 'Apple Pages document'],
+    PBM  => ['PPM',  'Portable BitMap'],
+    PCT  =>  'PICT',
+    PDF  => ['PDF',  'Adobe Portable Document Format'],
+    PEF  => ['TIFF', 'Pentax (RAW) Electronic Format'],
+    PFA  => ['Font', 'PostScript Font ASCII'],
+    PFB  => ['Font', 'PostScript Font Binary'],
+    PFM  => ['Font', 'Printer Font Metrics'],
+    PGF  => ['PGF',  'Progressive Graphics File'],
+    PGM  => ['PPM',  'Portable Gray Map'],
+    PICT => ['PICT', 'Apple PICTure'],
+  # PLIST=> ['PLIST','Apple Property List'],
+    PMP  => ['PMP',  'Sony DSC-F1 Cyber-Shot PMP'], # should stand for Proprietery Metadata Package ;)
+    PNG  => ['PNG',  'Portable Network Graphics'],
+    POT  => ['FPX',  'Microsoft PowerPoint Template'],
+    POTM => [['ZIP','FPX'], 'Office Open XML Presentation Template Macro-enabled'],
+    POTX => [['ZIP','FPX'], 'Office Open XML Presentation Template'],
+    PPM  => ['PPM',  'Portable Pixel Map'],
+    PPS  => ['FPX',  'Microsoft PowerPoint Slideshow'],
+    PPSM => [['ZIP','FPX'], 'Office Open XML Presentation Slideshow Macro-enabled'],
+    PPSX => [['ZIP','FPX'], 'Office Open XML Presentation Slideshow'],
+    PPT  => ['FPX',  'Microsoft PowerPoint Presentation'],
+    PPTM => [['ZIP','FPX'], 'Office Open XML Presentation Macro-enabled'],
+    PPTX => [['ZIP','FPX'], 'Office Open XML Presentation'],
+    PS   => ['PS',   'PostScript'],
+    PS2  =>  'PS',
+    PS3  =>  'PS',
+    PSB  => ['PSD',  'Photoshop Large Document'],
+    PSD  => ['PSD',  'Photoshop Drawing'],
+    PSP  => ['PSP',  'Paint Shop Pro'],
+    PSPFRAME => 'PSP',
+    PSPIMAGE => 'PSP',
+    PSPSHAPE => 'PSP',
+    PSPTUBE  => 'PSP',
+    QIF  =>  'QTIF',
+    QT   => ['MOV',  'QuickTime movie'],
+    QTI  =>  'QTIF',
+    QTIF => ['QTIF', 'QuickTime Image File'],
+    RA   => ['Real', 'Real Audio'],
+    RAF  => ['RAF',  'FujiFilm RAW Format'],
+    RAM  => ['Real', 'Real Audio Metafile'],
+    RAR  => ['RAR',  'RAR Archive'],
+    RAW  => [['RAW','TIFF'], 'Kyocera Contax N Digital RAW or Panasonic RAW'],
+    RIF  =>  'RIFF',
+    RIFF => ['RIFF', 'Resource Interchange File Format'],
+    RM   => ['Real', 'Real Media'],
+    RMVB => ['Real', 'Real Media Variable Bitrate'],
+    RPM  => ['Real', 'Real Media Plug-in Metafile'],
+    RSRC => ['RSRC', 'Mac OS Resource'],
+    RTF  => ['RTF',  'Rich Text Format'],
+    RV   => ['Real', 'Real Video'],
+    RW2  => ['TIFF', 'Panasonic RAW 2'],
+    RWL  => ['TIFF', 'Leica RAW'],
+    RWZ  => ['RWZ',  'Rawzor compressed image'],
+    SO   => ['EXE',  'Shared Object file'],
+    SR2  => ['TIFF', 'Sony RAW Format 2'],
+    SRF  => ['TIFF', 'Sony RAW Format'],
+    SRW  => ['TIFF', 'Samsung RAW format'],
+    SVG  => ['XMP',  'Scalable Vector Graphics'],
+    SWF  => ['SWF',  'Shockwave Flash'],
+    TAR  => ['TAR',  'TAR archive'],
+    THM  => ['JPEG', 'Canon Thumbnail'],
+    THMX => [['ZIP','FPX'], 'Office Open XML Theme'],
+    TIF  =>  'TIFF',
+    TIFF => ['TIFF', 'Tagged Image File Format'],
+    TS   =>  'M2TS',
+    TTC  => ['Font', 'True Type Font Collection'],
+    TTF  => ['Font', 'True Type Font'],
+    TUB  => 'PSP',
+    VOB  => ['MPEG', 'Video Object'],
+    VRD  => ['VRD',  'Canon VRD Recipe Data'],
+    VSD  => ['FPX',  'Microsoft Visio Drawing'],
+    WAV  => ['RIFF', 'WAVeform (Windows digital audio)'],
+    WDP  => ['TIFF', 'Windows Media Photo'],
+    WEBM => ['MKV',  'Google Web Movie'],
+    WEBP => ['RIFF', 'Google Web Picture'],
+    WMA  => ['ASF',  'Windows Media Audio'],
+    WMV  => ['ASF',  'Windows Media Video'],
+    X3F  => ['X3F',  'Sigma RAW format'],
+    XCF  => ['XCF',  'GIMP native image format'],
+    XHTML=> ['HTML', 'Extensible HyperText Markup Language'],
+    XLA  => ['FPX',  'Microsoft Excel Add-in'],
+    XLAM => [['ZIP','FPX'], 'Office Open XML Spreadsheet Add-in Macro-enabled'],
+    XLS  => ['FPX',  'Microsoft Excel Spreadsheet'],
+    XLSB => [['ZIP','FPX'], 'Office Open XML Spreadsheet Binary'],
+    XLSM => [['ZIP','FPX'], 'Office Open XML Spreadsheet Macro-enabled'],
+    XLSX => [['ZIP','FPX'], 'Office Open XML Spreadsheet'],
+    XLT  => ['FPX',  'Microsoft Excel Template'],
+    XLTM => [['ZIP','FPX'], 'Office Open XML Spreadsheet Template Macro-enabled'],
+    XLTX => [['ZIP','FPX'], 'Office Open XML Spreadsheet Template'],
+    XMP  => ['XMP',  'Extensible Metadata Platform'],
+    ZIP  => ['ZIP',  'ZIP archive'],
+);
+
+# descriptions for file types not found in above file extension lookup
+my %fileDescription = (
+    DICOM => 'Digital Imaging and Communications in Medicine',
+    PLIST => 'Property List',
+    XML   => 'Extensible Markup Language',
+    'DJVU (multi-page)' => 'DjVu multi-page image',
+    'Win32 EXE' => 'Windows 32-bit Executable',
+    'Win32 DLL' => 'Windows 32-bit Dynamic Link Library',
+);
+
+# MIME types for applicable file types above
+# (missing entries default to 'application/unknown', but note that
+#  other mime types may be specified by some modules, ie. QuickTime.pm)
+%mimeType = (
+   '3FR' => 'image/x-hasselblad-3fr',
+    AI   => 'application/vnd.adobe.illustrator',
+    AIFF => 'audio/x-aiff',
+    APE  => 'audio/x-monkeys-audio',
+    ASF  => 'video/x-ms-asf',
+    ARW  => 'image/x-sony-arw',
+    AVI  => 'video/x-msvideo',
+    BMP  => 'image/bmp',
+    BTF  => 'image/x-tiff-big', #(NC) (ref http://www.asmail.be/msg0055371937.html)
+    BZ2  => 'application/bzip2',
+   'Canon 1D RAW' => 'image/x-raw', # (uses .TIF file extension)
+    CR2  => 'image/x-canon-cr2',
+    CRW  => 'image/x-canon-crw',
+    DCR  => 'image/x-kodak-dcr',
+    DFONT=> 'application/x-dfont',
+    DICM => 'application/dicom',
+    DIVX => 'video/divx',
+    DJVU => 'image/vnd.djvu',
+    DNG  => 'image/x-adobe-dng',
+    DOC  => 'application/msword',
+    DOCM => 'application/vnd.ms-word.document.macroEnabled',
+    DOCX => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
+    DOT  => 'application/msword',
+    DOTM => 'application/vnd.ms-word.template.macroEnabledTemplate',
+    DOTX => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
+    DV   => 'video/x-dv',
+    EIP  => 'application/x-captureone', #(NC)
+    EPS  => 'application/postscript',
+    ERF  => 'image/x-epson-erf',
+    EXE  => 'application/octet-stream',
+    FLA  => 'application/vnd.adobe.fla',
+    FLAC => 'audio/flac',
+    FLV  => 'video/x-flv',
+    Font => 'application/x-font-type1', # covers PFA, PFB and PFM (not sure about PFM)
+    FPX  => 'image/vnd.fpx',
+    GIF  => 'image/gif',
+    GZIP => 'application/x-gzip',
+    HDP  => 'image/vnd.ms-photo',
+    HTML => 'text/html',
+    ICC  => 'application/vnd.iccprofile',
+    IIQ  => 'image/x-raw',
+    IND  => 'application/x-indesign',
+    ITC  => 'application/itunes',
+    JNG  => 'image/jng',
+    JP2  => 'image/jp2',
+    JPEG => 'image/jpeg',
+    JPM  => 'image/jpm',
+    JPX  => 'image/jpx',
+    K25  => 'image/x-kodak-k25',
+    KDC  => 'image/x-kodak-kdc',
+    LNK  => 'application/octet-stream',
+    M2T  => 'video/mpeg',
+    M2TS => 'video/m2ts',
+    MEF  => 'image/x-mamiya-mef',
+    MIE  => 'application/x-mie',
+    MIFF => 'application/x-magick-image',
+    MKA  => 'audio/x-matroska',
+    MKS  => 'application/x-matroska',
+    MKV  => 'video/x-matroska',
+    MNG  => 'video/mng',
+    MOS  => 'image/x-raw',
+    MOV  => 'video/quicktime',
+    MP3  => 'audio/mpeg',
+    MP4  => 'video/mp4',
+    MPC  => 'audio/x-musepack',
+    MPEG => 'video/mpeg',
+    MRW  => 'image/x-minolta-mrw',
+    MXF  => 'application/mxf',
+    NEF  => 'image/x-nikon-nef',
+    NRW  => 'image/x-nikon-nrw',
+    ODP  => 'application/vnd.oasis.opendocument.presentation',
+    ODS  => 'application/vnd.oasis.opendocument.spreadsheet',
+    ODT  => 'application/vnd.oasis.opendocument.text',
+    OGG  => 'audio/x-ogg',
+    ORF  => 'image/x-olympus-orf',
+    OTF  => 'application/x-font-otf',
+    PBM  => 'image/x-portable-bitmap',
+    PDF  => 'application/pdf',
+    PEF  => 'image/x-pentax-pef',
+    PGF  => 'image/pgf',
+    PGM  => 'image/x-portable-graymap',
+    PICT => 'image/pict',
+    PLIST=> 'application/xml',
+    PNG  => 'image/png',
+    POT  => 'application/vnd.ms-powerpoint',
+    POTM => 'application/vnd.ms-powerpoint.template.macroEnabled',
+    POTX => 'application/vnd.openxmlformats-officedocument.presentationml.template',
+    PPM  => 'image/x-portable-pixmap',
+    PPS  => 'application/vnd.ms-powerpoint',
+    PPSM => 'application/vnd.ms-powerpoint.slideshow.macroEnabled',
+    PPSX => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
+    PPT  => 'application/vnd.ms-powerpoint',
+    PPTM => 'application/vnd.ms-powerpoint.presentation.macroEnabled',
+    PPTX => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
+    PS   => 'application/postscript',
+    PSD  => 'application/vnd.adobe.photoshop',
+    PSP  => 'image/x-paintshoppro', #(NC)
+    QTIF => 'image/x-quicktime',
+    RA   => 'audio/x-pn-realaudio',
+    RAF  => 'image/x-fujifilm-raf',
+    RAM  => 'audio/x-pn-realaudio',
+    RAR  => 'application/x-rar-compressed',
+    RAW  => 'image/x-raw',
+    RM   => 'application/vnd.rn-realmedia',
+    RMVB => 'application/vnd.rn-realmedia-vbr',
+    RPM  => 'audio/x-pn-realaudio-plugin',
+    RSRC => 'application/ResEdit',
+    RTF  => 'text/rtf',
+    RV   => 'video/vnd.rn-realvideo',
+    RW2  => 'image/x-panasonic-rw2',
+    RWL  => 'image/x-leica-rwl',
+    RWZ  => 'image/x-rawzor', #(duplicated in Rawzor.pm)
+    SR2  => 'image/x-sony-sr2',
+    SRF  => 'image/x-sony-srf',
+    SRW  => 'image/x-samsung-srw',
+    SVG  => 'image/svg+xml',
+    SWF  => 'application/x-shockwave-flash',
+    TAR  => 'application/x-tar',
+    THMX => 'application/vnd.ms-officetheme',
+    TIFF => 'image/tiff',
+    TTC  => 'application/x-font-ttf',
+    TTF  => 'application/x-font-ttf',
+    VSD  => 'application/x-visio',
+    WAV  => 'audio/x-wav',
+    WDP  => 'image/vnd.ms-photo',
+    WEBM => 'video/webm',
+    WEBP => 'image/webp',
+    WMA  => 'audio/x-ms-wma',
+    WMV  => 'video/x-ms-wmv',
+    X3F  => 'image/x-sigma-x3f',
+    XCF  => 'image/x-xcf',
+    XLA  => 'application/vnd.ms-excel',
+    XLAM => 'application/vnd.ms-excel.addin.macroEnabled',
+    XLS  => 'application/vnd.ms-excel',
+    XLSB => 'application/vnd.ms-excel.sheet.binary.macroEnabled',
+    XLSM => 'application/vnd.ms-excel.sheet.macroEnabled',
+    XLSX => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
+    XLT  => 'application/vnd.ms-excel',
+    XLTM => 'application/vnd.ms-excel.template.macroEnabled',
+    XLTX => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
+    XML  => 'application/xml',
+    XMP  => 'application/rdf+xml',
+    ZIP  => 'application/zip',
+);
+
+# module names for processing routines of each file type
+# - undefined entries default to same module name as file type
+# - module name '' defaults to Image::ExifTool
+# - module name '0' indicates a recognized but unsupported file
+my %moduleName = (
+    BTF  => 'BigTIFF',
+    BZ2  => 0,
+    CRW  => 'CanonRaw',
+    DICM => 'DICOM',
+    COS  => 'CaptureOne',
+    DOCX => 'OOXML',
+    EPS  => 'PostScript',
+    EXIF => '',
+    ICC  => 'ICC_Profile',
+    IND  => 'InDesign',
+    FLV  => 'Flash',
+    FPX  => 'FlashPix',
+    GZIP => 'ZIP',
+    JP2  => 'Jpeg2000',
+    JPEG => '',
+  # MODD => 'XML',
+    MOV  => 'QuickTime',
+    MKV  => 'Matroska',
+    MP3  => 'ID3',
+    MRW  => 'MinoltaRaw',
+    OGG  => 'Vorbis',
+    ORF  => 'Olympus',
+  # PLIST=> 'XML',
+    PMP  => 'Sony',
+    PS   => 'PostScript',
+    PSD  => 'Photoshop',
+    QTIF => 'QuickTime',
+    RAF  => 'FujiFilm',
+    RAR  => 'ZIP',
+    RAW  => 'KyoceraRaw',
+    RWZ  => 'Rawzor',
+    SWF  => 'Flash',
+    TAR  => 0,
+    TIFF => '',
+    VRD  => 'CanonVRD',
+    X3F  => 'SigmaRaw',
+    XCF  => 'GIMP',
+);
+
+# quick "magic number" file test used to avoid loading module unnecessarily:
+# - regular expression evaluated on first 1024 bytes of file
+# - must match beginning at first byte in file
+# - this test must not be more stringent than module logic
+%magicNumber = (
+    AIFF => '(FORM....AIF[FC]|AT&TFORM)',
+    APE  => '(MAC |APETAGEX|ID3)',
+    ASF  => '\x30\x26\xb2\x75\x8e\x66\xcf\x11\xa6\xd9\x00\xaa\x00\x62\xce\x6c',
+    BMP  => 'BM',
+    BTF  => '(II\x2b\0|MM\0\x2b)',
+    BZ2  => 'BZh[1-9]\x31\x41\x59\x26\x53\x59',
+    CRW  => '(II|MM).{4}HEAP(CCDR|JPGM)',
+    DICM => '(.{128}DICM|\0[\x02\x04\x06\x08]\0[\0-\x20]|[\x02\x04\x06\x08]\0[\0-\x20]\0)',
+    DOCX => 'PK\x03\x04',
+    DV   => '\x1f\x07\0[\x3f\xbf]', # (not tested if extension recognized)
+    EPS  => '(%!PS|%!Ad|\xc5\xd0\xd3\xc6)',
+    EXE  => '(MZ|\xca\xfe\xba\xbe|\xfe\xed\xfa[\xce\xcf]|[\xce\xcf]\xfa\xed\xfe|Joy!peff|\x7fELF|#!\s*/\S*bin/|!<arch>\x0a)',
+    EXIF => '(II\x2a\0|MM\0\x2a)',
+    FLAC => '(fLaC|ID3)',
+    FLV  => 'FLV\x01',
+    Font => '((\0\x01\0\0|OTTO|true|typ1)[\0\x01]|ttcf\0[\x01\x02]\0\0|\0[\x01\x02]|' .
+            '(.{6})?%!(PS-(AdobeFont-|Bitstream )|FontType1-)|Start(Comp|Master)?FontMetrics)',
+    FPX  => '\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1',
+    GIF  => 'GIF8[79]a',
+    GZIP => '\x1f\x8b\x08',
+    HTML => '(?i)<(!DOCTYPE\s+HTML|HTML|\?xml)', # (case insensitive)
+    ICC  => '.{12}(scnr|mntr|prtr|link|spac|abst|nmcl|nkpf)(XYZ |Lab |Luv |YCbr|Yxy |RGB |GRAY|HSV |HLS |CMYK|CMY |[2-9A-F]CLR){2}',
+    IND  => '\x06\x06\xed\xf5\xd8\x1d\x46\xe5\xbd\x31\xef\xe7\xfe\x74\xb7\x1d',
+    ITC  => '.{4}itch',
+    JP2  => '\0\0\0\x0cjP(  |\x1a\x1a)\x0d\x0a\x87\x0a',
+    JPEG => '\xff\xd8\xff',
+    LNK  => '.{4}\x01\x14\x02\0{5}\xc0\0{6}\x46',
+    M2TS => '(....)?\x47',
+    MIE  => '~[\x10\x18]\x04.0MIE',
+    MIFF => 'id=ImageMagick',
+    MKV  => '\x1a\x45\xdf\xa3',
+    MOV  => '.{4}(free|skip|wide|ftyp|pnot|PICT|pict|moov|mdat|junk|uuid)',
+  # MP3  =>  difficult to rule out
+    MPC  => '(MP\+|ID3)',
+    MPEG => '\0\0\x01[\xb0-\xbf]',
+    MRW  => '\0MR[MI]',
+    MXF  => '\x06\x0e\x2b\x34\x02\x05\x01\x01\x0d\x01\x02', # (not tested if extension recognized)
+    OGG  => '(OggS|ID3)',
+    ORF  => '(II|MM)',
+    PDF  => '%PDF-\d+\.\d+',
+    PGF  => 'PGF',
+    PICT => '(.{10}|.{522})(\x11\x01|\x00\x11)',
+    PMP  => '.{8}\0{3}\x7c.{112}\xff\xd8\xff\xdb',
+    PNG  => '(\x89P|\x8aM|\x8bJ)NG\r\n\x1a\n',
+    PPM  => 'P[1-6]\s+',
+    PS   => '(%!PS|%!Ad|\xc5\xd0\xd3\xc6)',
+    PSD  => '8BPS\0[\x01\x02]',
+    PSP  => 'Paint Shop Pro Image File\x0a\x1a\0{5}',
+    QTIF => '.{4}(idsc|idat|iicc)',
+    RAF  => 'FUJIFILM',
+    RAR  => 'Rar!\x1a\x07\0',
+    RAW  => '(.{25}ARECOYK|II|MM)',
+    Real => '(\.RMF|\.ra\xfd|pnm://|rtsp://|http://)',
+    RIFF => 'RIFF',
+    RSRC => '(....)?\0\0\x01\0',
+    RTF  => '[\n\r]*\\{[\n\r]*\\\\rtf',
+    # (don't be too restrictive for RW2/RWL -- how does magic number change for big-endian?)
+    RW2  => '(II|MM)', #(\x55\0\x18\0\0\0\x88\xe7\x74\xd8\xf8\x25\x1d\x4d\x94\x7a\x6e\x77\x82\x2b\x5d\x6a)
+    RWL  => '(II|MM)', #(ditto)
+    RWZ  => 'rawzor',
+    SWF  => '[FC]WS[^\0]',
+    TAR  => '.{257}ustar(  )?\0', # (this doesn't catch old-style tar files)
+    TIFF => '(II|MM)', # don't test magic number (some raw formats are different)
+    VRD  => 'CANON OPTIONAL DATA\0',
+    X3F  => 'FOVb',
+    XCF  => 'gimp xcf ',
+    XMP  => '\0{0,3}(\xfe\xff|\xff\xfe|\xef\xbb\xbf)?\0{0,3}\s*<',
+    ZIP  => 'PK\x03\x04',
+);
+
+# lookup for valid character set names (keys are all lower case)
+%charsetName = (
+    #   Charset setting                       alias(es)
+    # -------------------------   --------------------------------------------
+    utf8        => 'UTF8',        cp65001 => 'UTF8', 'utf-8' => 'UTF8',
+    latin       => 'Latin',       cp1252  => 'Latin', latin1 => 'Latin',
+    latin2      => 'Latin2',      cp1250  => 'Latin2',
+    cyrillic    => 'Cyrillic',    cp1251  => 'Cyrillic', russian => 'Cyrillic',
+    greek       => 'Greek',       cp1253  => 'Greek',
+    turkish     => 'Turkish',     cp1254  => 'Turkish',
+    hebrew      => 'Hebrew',      cp1255  => 'Hebrew',
+    arabic      => 'Arabic',      cp1256  => 'Arabic',
+    baltic      => 'Baltic',      cp1257  => 'Baltic',
+    vietnam     => 'Vietnam',     cp1258  => 'Vietnam',
+    thai        => 'Thai',        cp874   => 'Thai',
+    macroman    => 'MacRoman',    cp10000 => 'MacRoman', mac => 'MacRoman', roman => 'MacRoman',
+    maclatin2   => 'MacLatin2',   cp10029 => 'MacLatin2',
+    maccyrillic => 'MacCyrillic', cp10007 => 'MacCyrillic',
+    macgreek    => 'MacGreek',    cp10006 => 'MacGreek',
+    macturkish  => 'MacTurkish',  cp10081 => 'MacTurkish',
+    macromanian => 'MacRomanian', cp10010 => 'MacRomanian',
+    maciceland  => 'MacIceland',  cp10079 => 'MacIceland',
+    maccroatian => 'MacCroatian', cp10082 => 'MacCroatian',
+);
+
+# default group priority for writing
+my @defaultWriteGroups = qw(EXIF IPTC XMP MakerNotes Photoshop ICC_Profile CanonVRD);
+
+# group hash for ExifTool-generated tags
+my %allGroupsExifTool = ( 0 => 'ExifTool', 1 => 'ExifTool', 2 => 'ExifTool' );
+
+# special tag names (not used for tag info)
+my %specialTags = (
+    TABLE_NAME=>1, SHORT_NAME=>1, PROCESS_PROC=>1, WRITE_PROC=>1, CHECK_PROC=>1,
+    GROUPS=>1, FORMAT=>1, FIRST_ENTRY=>1, TAG_PREFIX=>1, PRINT_CONV=>1,
+    WRITABLE=>1, TABLE_DESC=>1, NOTES=>1, IS_OFFSET=>1, EXTRACT_UNKNOWN=>1,
+    NAMESPACE=>1, PREFERRED=>1, SRC_TABLE=>1, PRIORITY=>1, WRITE_GROUP=>1,
+    LANG_INFO=>1, VARS=>1, DATAMEMBER=>1, IS_SUBDIR=>1, SET_GROUP1=>1,
+);
+
+# headers for various segment types
+$exifAPP1hdr = "Exif\0\0";
+$xmpAPP1hdr = "http://ns.adobe.com/xap/1.0/\0";
+$xmpExtAPP1hdr = "http://ns.adobe.com/xmp/extension/\0";
+$psAPP13hdr = "Photoshop 3.0\0";
+$psAPP13old = 'Adobe_Photoshop2.5:';
+
+sub DummyWriteProc { return 1; }
+
+# lookup for user lenses defined in @Image::ExifTool::UserDefined::Lenses
+%Image::ExifTool::userLens = ( );
+
+# queued plug-in tags to add to lookup
+@Image::ExifTool::pluginTags = ( );
+%Image::ExifTool::pluginTags = ( );
+
+# tag information for preview image -- this should be used for all
+# PreviewImage tags so they are handled properly when reading/writing
+%Image::ExifTool::previewImageTagInfo = (
+    Name => 'PreviewImage',
+    Writable => 'undef',
+    # a value of 'none' is ok...
+    WriteCheck => '$val eq "none" ? undef : $self->CheckImage(\$val)',
+    DataTag => 'PreviewImage',
+    # accept either scalar or scalar reference
+    RawConv => '$self->ValidateImage(ref $val ? $val : \$val, $tag)',
+    # we allow preview image to be set to '', but we don't want a zero-length value
+    # in the IFD, so set it temorarily to 'none'.  Note that the length is <= 4,
+    # so this value will fit in the IFD so the preview fixup won't be generated.
+    ValueConvInv => '$val eq "" and $val="none"; $val',
+);
+
+# extra tags that aren't truly EXIF tags, but are generated by the script
+# Note: any tag in this list with a name corresponding to a Group0 name is
+#       used to write the entire corresponding directory as a block.
+%Image::ExifTool::Extra = (
+    GROUPS => { 0 => 'File', 1 => 'File', 2 => 'Image' },
+    VARS => { NO_ID => 1 }, # tag ID's aren't meaningful for these tags
+    WRITE_PROC => \&DummyWriteProc,
+    Error   => { Priority => 0, Groups => \%allGroupsExifTool },
+    Warning => { Priority => 0, Groups => \%allGroupsExifTool },
+    Comment => {
+        Notes => 'comment embedded in JPEG, GIF89a or PPM/PGM/PBM image',
+        Writable => 1,
+        WriteGroup => 'Comment',
+        Priority => 0,  # to preserve order of JPEG COM segments
+    },
+    Directory => {
+        Groups => { 1 => 'System' },
+        Writable => 1,
+        Protected => 1,
+        # translate backslashes in directory names and add trailing '/'
+        ValueConvInv => '$_=$val; tr/\\\\/\//; m{[^/]$} and $_ .= "/"; $_',
+    },
+    FileName => {
+        Groups => { 1 => 'System' },
+        Writable => 1,
+        Protected => 1,
+        Notes => q{
+            may be written with a full path name to set FileName and Directory in one
+            operation.  See L<filename.html|../filename.html> for more information on
+            writing the FileName and Directory tags
+        },
+        ValueConvInv => '$val=~tr/\\\\/\//; $val',
+    },
+    FileSize => {
+        Groups => { 1 => 'System' },
+        PrintConv => \&ConvertFileSize,
+    },
+    ResourceForkSize => {
+        Groups => { 1 => 'System' },
+        Notes => q{
+            [Mac OS only] size of the file's resource fork if it contains data.  If this
+            tag is generated the ExtractEmbedded option may be used to extract
+            resource-fork information as a sub-document
+        },
+        PrintConv => \&ConvertFileSize,
+    },
+    FileType    => { },
+    FileModifyDate => {
+        Description => 'File Modification Date/Time',
+        Notes => 'the filesystem modification time',
+        Groups => { 1 => 'System', 2 => 'Time' },
+        Writable => 1,
+        # all pseudo-tags must be protected so -tagsfromfile fails with
+        # unrecognized files unless a pseudo tag is specified explicitly
+        Protected => 1,
+        Shift => 'Time',
+        ValueConv => 'ConvertUnixTime($val,1)',
+        ValueConvInv => 'GetUnixTime($val,1)',
+        PrintConv => '$self->ConvertDateTime($val)',
+        PrintConvInv => '$self->InverseDateTime($val)',
+    },
+    FilePermissions => {
+        Groups => { 1 => 'System' },
+        Notes => q{
+            r=read, w=write and x=execute permissions for the file owner, group and
+            others.  The ValueConv value is an octal number so bit test operations on
+            this value should be done in octal, ie. "oct($filePermissions) & 0200"
+        },
+        ValueConv => 'sprintf("%.3o", $val & 0777)',
+        PrintConv => sub {
+            my ($mask, $str, $val) = (0400, '', oct(shift));
+            while ($mask) {
+                foreach (qw(r w x)) {
+                    $str .= $val & $mask ? $_ : '-';
+                    $mask >>= 1;
+                }
+            }
+            return $str;
+        },
+    },
+    MIMEType    => { },
+    ImageWidth  => { },
+    ImageHeight => { },
+    XResolution => { },
+    YResolution => { },
+    MaxVal      => { }, # max pixel value in PPM or PGM image
+    EXIF => {
+        Notes => 'the full EXIF data block from JPEG, PNG, JP2, MIE and MIFF images',
+        Groups => { 0 => 'EXIF', 1 => 'EXIF' },
+        Flags => ['Writable' ,'Protected', 'Binary'],
+        WriteCheck => q{
+            return undef if $val =~ /^(II\x2a\0|MM\0\x2a)/;
+            return 'Invalid EXIF data';
+        },
+    },
+    ICC_Profile => {
+        Notes => 'the full ICC_Profile data block',
+        Groups => { 0 => 'ICC_Profile', 1 => 'ICC_Profile' },
+        Flags => ['Writable' ,'Protected', 'Binary'],
+        WriteCheck => q{
+            require Image::ExifTool::ICC_Profile;
+            return Image::ExifTool::ICC_Profile::ValidateICC(\$val);
+        },
+    },
+    XMP => {
+        Notes => 'the full XMP data block',
+        Groups => { 0 => 'XMP', 1 => 'XMP' },
+        Flags => ['Writable', 'Protected', 'Binary'],
+        Priority => 0,  # so main xmp (which usually comes first) takes priority
+        WriteCheck => q{
+            require Image::ExifTool::XMP;
+            return Image::ExifTool::XMP::CheckXMP($self, $tagInfo, \$val);
+        },
+    },
+    CanonVRD => {
+        Notes => 'the full Canon DPP VRD trailer block',
+        Groups => { 0 => 'CanonVRD', 1 => 'CanonVRD' },
+        Flags => ['Writable' ,'Protected', 'Binary'],
+        Permanent => 0, # (this is 1 by default for MakerNotes tags)
+        WriteCheck => q{
+            return undef if $val =~ /^CANON OPTIONAL DATA\0/;
+            return 'Invalid CanonVRD data';
+        },
+    },
+    CurrentIPTCDigest => {
+        Notes => q{
+            MD5 digest of existing IPTC data.  All zeros if IPTC exists but Digest::MD5
+            is not installed.  Only calculated for IPTC in the standard location as
+            specified by the L<MWG|http://www.metadataworkinggroup.org/>.  ExifTool
+            automates the handling of this tag in the MWG module -- see the
+            L<MWG Tag Name documentation|MWG.html> for details
+        },
+        ValueConv => 'unpack("H*", $val)',
+    },
+    PreviewImage => {
+        Writable => 1,
+        WriteCheck => '$self->CheckImage(\$val)',
+        # can't delete, so set to empty string and return no error
+        DelCheck => '$val = ""; return undef',
+        # accept either scalar or scalar reference
+        RawConv => '$self->ValidateImage(ref $val ? $val : \$val, $tag)',
+    },
+    PreviewPNG  => { Binary => 1 },
+    ExifByteOrder => {
+        Writable => 1,
+        Notes => 'only writable for newly created EXIF segments',
+        PrintConv => {
+            II => 'Little-endian (Intel, II)',
+            MM => 'Big-endian (Motorola, MM)',
+        },
+    },
+    ExifUnicodeByteOrder => {
+        Writable => 1,
+        Notes => q{
+            the EXIF specification is particularly vague about the byte ordering for
+            Unicode text, and different applications use different conventions.  By
+            default ExifTool writes Unicode text in EXIF byte order, but this write-only
+            tag may be used to force a specific byte order
+        },
+        PrintConv => {
+            II => 'Little-endian (Intel, II)',
+            MM => 'Big-endian (Motorola, MM)',
+        },
+    },
+    ExifToolVersion => {
+        Description => 'ExifTool Version Number',
+        Groups => \%allGroupsExifTool,
+    },
+    RAFVersion => { },
+    JPEGDigest => {
+        Notes => q{
+            an MD5 digest of the JPEG quantization tables is combined with the component
+            sub-sampling values to generate the value of this tag.  The result is
+            compared to known values in an attempt to deduce the originating software
+            based only on the JPEG image data.  For performance reasons, this tag is
+            generated only if specifically requested
+        },
+    },
+    Now => {
+        Groups => { 0 => 'ExifTool', 1 => 'ExifTool', 2 => 'Time' },
+        Notes => q{
+            the current date/time.  Useful when setting the tag values, ie.
+            C<"-modifydate<now">.  Not generated unless specifically requested
+        },
+        ValueConv => sub {
+            my $time = shift;
+            my @tm = localtime $time;
+            my $tz = Image::ExifTool::TimeZoneString(\@tm, $time);
+            sprintf("%4d:%.2d:%.2d %.2d:%.2d:%.2d%s", $tm[5]+1900, $tm[4]+1, $tm[3],
+                    $tm[2], $tm[1], $tm[0], $tz);
+        },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    ID3Size     => { },
+    Geotag => {
+        Writable => 1,
+        AllowGroup => '(exif|gps|xmp|xmp-exif)',
+        Notes => q{
+            this write-only tag is used to define the GPS track log data or track log
+            file name.  Currently supported track log formats are GPX, NMEA RMC/GGA/GLL,
+            KML, IGC, Garmin XML and TCX, and Magellan PMGNTRK.  See
+            L<geotag.html|../geotag.html> for details
+        },
+        DelCheck => q{
+            require Image::ExifTool::Geotag;
+            # delete associated tags
+            Image::ExifTool::Geotag::SetGeoValues($self, undef, $wantGroup);
+        },
+        ValueConvInv => q{
+            require Image::ExifTool::Geotag;
+            # always warn because this tag is never set (warning is "\n" on success)
+            my $result = Image::ExifTool::Geotag::LoadTrackLog($self, $val);
+            return '' if not defined $result;   # deleting geo tags
+            return $result if ref $result;      # geotag data hash reference
+            warn "$result\n";                   # error string
+        },
+    },
+    Geotime => {
+        Writable => 1,
+        AllowGroup => '(exif|gps|xmp|xmp-exif)',
+        Notes => q{
+            this write-only tag is used to define a date/time for interpolating a
+            position in the GPS track specified by the Geotag tag.  Writing this tag
+            causes the following 8 tags to be written:  GPSLatitude, GPSLatitudeRef,
+            GPSLongitude, GPSLongitudeRef, GPSAltitude, GPSAltitudeRef, GPSDateStamp and
+            GPSTimeStamp.  The local system timezone is assumed if the date/time value
+            does not contain a timezone.  May be deleted to delete associated GPS tags.
+            A group name of 'EXIF' or 'XMP' may be specified to write or delete only
+            EXIF or XMP GPS tags.  The value of Geotag must be assigned before this tag
+        },
+        DelCheck => q{
+            require Image::ExifTool::Geotag;
+            # delete associated tags
+            Image::ExifTool::Geotag::SetGeoValues($self, undef, $wantGroup);
+        },
+        ValueConvInv => q{
+            require Image::ExifTool::Geotag;
+            warn Image::ExifTool::Geotag::SetGeoValues($self, $val, $wantGroup) . "\n";
+            return undef;
+        },
+    },
+    Geosync => {
+        Writable => 1,
+        AllowGroup => '(exif|gps|xmp|xmp-exif)',
+        Shift => 'Time', # enables "+=" syntax as well as "=+"
+        Notes => q{
+            this write-only tag specifies a time difference to add to Geotime for
+            synchronization with the GPS clock.  For example, set this to "-12" if the
+            camera clock is 12 seconds faster than GPS time.  Input format is
+            "[+-][[[DD ]HH:]MM:]SS[.ss]".  Must be set before Geotime to be effective.
+            Additional features allow calculation of time differences and time drifts,
+            and extraction of synchronization times from image files. See the
+            L<geotagging documentation|../geotag.html> for details
+        },
+        ValueConvInv => q{
+            require Image::ExifTool::Geotag;
+            return Image::ExifTool::Geotag::ConvertGeosync($self, $val);
+        },
+    },
+);
+
+# YCbCrSubSampling values (used by JPEG SOF, EXIF and XMP)
+%Image::ExifTool::JPEG::yCbCrSubSampling = (
+    '1 1' => 'YCbCr4:4:4 (1 1)', #PH
+    '2 1' => 'YCbCr4:2:2 (2 1)', #14 in Exif.pm
+    '2 2' => 'YCbCr4:2:0 (2 2)', #14 in Exif.pm
+    '4 1' => 'YCbCr4:1:1 (4 1)', #14 in Exif.pm
+    '4 2' => 'YCbCr4:1:0 (4 2)', #PH
+    '1 2' => 'YCbCr4:4:0 (1 2)', #PH
+    '1 4' => 'YCbCr4:4:1 (1 4)', #JD
+    '2 4' => 'YCbCr4:2:1 (2 4)', #JD
+);
+
+# define common JPEG segments here to avoid overhead of loading JPEG module
+
+# JPEG SOF (start of frame) tags
+# (ref http://www.w3.org/Graphics/JPEG/itu-t81.pdf)
+%Image::ExifTool::JPEG::SOF = (
+    GROUPS => { 0 => 'File', 1 => 'File', 2 => 'Image' },
+    NOTES => 'This information is extracted from the JPEG Start Of Frame segment.',
+    VARS => { NO_ID => 1 }, # tag ID's aren't meaningful for these tags
+    EncodingProcess => {
+        PrintHex => 1,
+        PrintConv => {
+            0x0 => 'Baseline DCT, Huffman coding',
+            0x1 => 'Extended sequential DCT, Huffman coding',
+            0x2 => 'Progressive DCT, Huffman coding',
+            0x3 => 'Lossless, Huffman coding',
+            0x5 => 'Sequential DCT, differential Huffman coding',
+            0x6 => 'Progressive DCT, differential Huffman coding',
+            0x7 => 'Lossless, Differential Huffman coding',
+            0x9 => 'Extended sequential DCT, arithmetic coding',
+            0xa => 'Progressive DCT, arithmetic coding',
+            0xb => 'Lossless, arithmetic coding',
+            0xd => 'Sequential DCT, differential arithmetic coding',
+            0xe => 'Progressive DCT, differential arithmetic coding',
+            0xf => 'Lossless, differential arithmetic coding',
+        }
+    },
+    BitsPerSample    => { },
+    ImageHeight      => { },
+    ImageWidth       => { },
+    ColorComponents  => { },
+    YCbCrSubSampling => {
+        Notes => 'calculated from components table',
+        PrintConv => \%Image::ExifTool::JPEG::yCbCrSubSampling,
+    },
+);
+
+# JPEG JFIF APP0 definitions
+%Image::ExifTool::JFIF::Main = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    GROUPS => { 0 => 'JFIF', 1 => 'JFIF', 2 => 'Image' },
+    DATAMEMBER => [ 2, 3, 5 ],
+    0 => {
+        Name => 'JFIFVersion',
+        Format => 'int8u[2]',
+        PrintConv => 'sprintf("%d.%.2d", split(" ",$val))',
+    },
+    2 => {
+        Name => 'ResolutionUnit',
+        Writable => 1,
+        RawConv => '$$self{JFIFResolutionUnit} = $val',
+        PrintConv => {
+            0 => 'None',
+            1 => 'inches',
+            2 => 'cm',
+        },
+        Priority => -1,
+    },
+    3 => {
+        Name => 'XResolution',
+        Format => 'int16u',
+        Writable => 1,
+        Priority => -1,
+        RawConv => '$$self{JFIFXResolution} = $val',
+    },
+    5 => {
+        Name => 'YResolution',
+        Format => 'int16u',
+        Writable => 1,
+        Priority => -1,
+        RawConv => '$$self{JFIFYResolution} = $val',
+    },
+);
+%Image::ExifTool::JFIF::Extension = (
+    GROUPS => { 0 => 'JFIF', 1 => 'JFIF', 2 => 'Image' },
+    0x10 => {
+        Name => 'ThumbnailImage',
+        RawConv => '$self->ValidateImage(\$val,$tag)',
+    },
+);
+
+# Composite tags (accumulation of all Composite tag tables)
+%Image::ExifTool::Composite = (
+    GROUPS => { 0 => 'Composite', 1 => 'Composite' },
+    TABLE_NAME => 'Image::ExifTool::Composite',
+    SHORT_NAME => 'Composite',
+    VARS => { NO_ID => 1 }, # want empty tagID's for Composite tags
+    WRITE_PROC => \&DummyWriteProc,
+);
+
+# static private ExifTool variables
+
+%allTables = ( );   # list of all tables loaded (except Composite tags)
+@tableOrder = ( );  # order the tables were loaded
+
+#------------------------------------------------------------------------------
+# Warning handler routines (warning string stored in $evalWarning)
+#
+# Set warning message
+# Inputs: 0) warning string (undef to reset warning)
+sub SetWarning($) { $evalWarning = $_[0]; }
+
+# Get warning message
+sub GetWarning()  { return $evalWarning; }
+
+# Clean unnecessary information (line number, LF) from warning
+# Inputs: 0) warning string or undef to use current warning
+# Returns: cleaned warning
+sub CleanWarning(;$)
+{
+    my $str = shift;
+    unless (defined $str) {
+        return undef unless defined $evalWarning;
+        $str = $evalWarning;
+    }
+    $str = $1 if $str =~ /(.*) at /s;
+    $str =~ s/\s+$//s;
+    return $str;
+}
+
+#==============================================================================
+# New - create new ExifTool object
+# Inputs: 0) reference to exiftool object or ExifTool class name
+# Returns: blessed ExifTool object ref
+sub new
+{
+    local $_;
+    my $that = shift;
+    my $class = ref($that) || $that || 'Image::ExifTool';
+    my $self = bless {}, $class;
+
+    # make sure our main Exif tag table has been loaded
+    GetTagTable("Image::ExifTool::Exif::Main");
+
+    $self->ClearOptions();      # create default options hash
+    $self->{VALUE} = { };       # must initialize this for warning messages
+    $self->{DEL_GROUP} = { };   # lookup for groups to delete when writing
+
+    # initialize our new groups for writing
+    $self->SetNewGroups(@defaultWriteGroups);
+
+    return $self;
+}
+
+#------------------------------------------------------------------------------
+# ImageInfo - return specified information from image file
+# Inputs: 0) [optional] ExifTool object reference
+#         1) filename, file reference, or scalar data reference
+#         2-N) list of tag names to find (or tag list reference or options reference)
+# Returns: reference to hash of tag/value pairs (with "Error" entry on error)
+# Notes:
+#   - if no tags names are specified, the values of all tags are returned
+#   - tags may be specified with leading '-' to exclude, or trailing '#' for ValueConv
+#   - can pass a reference to list of tags to find, in which case the list will
+#     be updated with the tags found in the proper case and in the specified order.
+#   - can pass reference to hash specifying options
+#   - returned tag values may be scalar references indicating binary data
+#   - see ClearOptions() below for a list of options and their default values
+# Examples:
+#   use Image::ExifTool 'ImageInfo';
+#   my $info = ImageInfo($file, 'DateTimeOriginal', 'ImageSize');
+#    - or -
+#   my $exifTool = new Image::ExifTool;
+#   my $info = $exifTool->ImageInfo($file, \@tagList, {Sort=>'Group0'} );
+sub ImageInfo($;@)
+{
+    local $_;
+    # get our ExifTool object ($self) or create one if necessary
+    my $self;
+    if (ref $_[0] and UNIVERSAL::isa($_[0],'Image::ExifTool')) {
+        $self = shift;
+    } else {
+        $self = new Image::ExifTool;
+    }
+    my %saveOptions = %{$self->{OPTIONS}};  # save original options
+
+    # initialize file information
+    $self->{FILENAME} = $self->{RAF} = undef;
+
+    $self->ParseArguments(@_);              # parse our function arguments
+    $self->ExtractInfo(undef);              # extract meta information from image
+    my $info = $self->GetInfo(undef);       # get requested information
+
+    $self->{OPTIONS} = \%saveOptions;       # restore original options
+
+    return $info;   # return requested information
+}
+
+#------------------------------------------------------------------------------
+# Get/set ExifTool options
+# Inputs: 0) ExifTool object reference,
+#         1) Parameter name, 2) Value to set the option
+#         3-N) More parameter/value pairs
+# Returns: original value of last option specified
+sub Options($$;@)
+{
+    local $_;
+    my $self = shift;
+    my $options = $$self{OPTIONS};
+    my $oldVal;
+
+    while (@_) {
+        my $param = shift;
+        $oldVal = $$options{$param};
+        last unless @_;
+        my $newVal = shift;
+        if ($param eq 'Lang') {
+            # allow this to be set to undef to select the default language
+            $newVal = $defaultLang unless defined $newVal;
+            if ($newVal eq $defaultLang) {
+                $$options{$param} = $newVal;
+                delete $$self{CUR_LANG};
+            # make sure the language is available
+            } elsif (eval "require Image::ExifTool::Lang::$newVal") {
+                my $xlat = "Image::ExifTool::Lang::${newVal}::Translate";
+                no strict 'refs';
+                if (%$xlat) {
+                    $$self{CUR_LANG} = \%$xlat;
+                    $$options{$param} = $newVal;
+                }
+            } # else don't change Lang
+        } elsif ($param eq 'Exclude' and defined $newVal) {
+            # clone Exclude list and expand shortcuts
+            my @exclude;
+            if (ref $newVal eq 'ARRAY') {
+                @exclude = @$newVal;
+            } else {
+                @exclude = ($newVal);
+            }
+            ExpandShortcuts(\@exclude, 1);  # (also remove '#' suffix)
+            $$options{$param} = \@exclude;
+        } elsif ($param =~ /^Charset/ or $param eq 'IPTCCharset') {
+            # only allow valid character sets to be set
+            if ($newVal) {
+                my $charset = $charsetName{lc $newVal};
+                if ($charset) {
+                    $$options{$param} = $charset;
+                    # maintain backward-compatibility with old IPTCCharset option
+                    $$options{CharsetIPTC} = $charset if $param eq 'IPTCCharset';
+                } else {
+                    warn "Invalid Charset $newVal\n";
+                }
+            }
+        } else {
+            if ($param eq 'Escape') {
+                # set ESCAPE_PROC
+                if (defined $newVal and $newVal eq 'XML') {
+                    require Image::ExifTool::XMP;
+                    $$self{ESCAPE_PROC} = \&Image::ExifTool::XMP::EscapeXML;
+                } elsif (defined $newVal and $newVal eq 'HTML') {
+                    require Image::ExifTool::HTML;
+                    $$self{ESCAPE_PROC} = \&Image::ExifTool::HTML::EscapeHTML;
+                } else {
+                    delete $$self{ESCAPE_PROC};
+                }
+                # must forget saved values since they depend on Escape method
+                $self->{BOTH} = { };
+            }
+            $$options{$param} = $newVal;
+        }
+    }
+    return $oldVal;
+}
+
+#------------------------------------------------------------------------------
+# ClearOptions - set options to default values
+# Inputs: 0) ExifTool object reference
+sub ClearOptions($)
+{
+    local $_;
+    my $self = shift;
+
+    # create options hash with default values
+    # (commented out options don't need initializing)
+    # +-----------------------------------------------------+
+    # ! DON'T FORGET!!  When adding any new option, must    !
+    # ! decide how it is handled in SetNewValuesFromFile()  !
+    # +-----------------------------------------------------+
+    $self->{OPTIONS} = {
+    #   Binary      => undef,   # flag to extract binary values even if tag not specified
+    #   ByteOrder   => undef,   # default byte order when creating EXIF information
+        Charset     => 'UTF8',  # character set for converting Unicode characters
+        CharsetID3  => 'Latin', # internal ID3v1 character set
+        CharsetIPTC => 'Latin', # fallback IPTC character set if no CodedCharacterSet
+    #   Compact     => undef,   # compact XMP and IPTC data
+        Composite   => 1,       # flag to calculate Composite tags
+    #   Compress    => undef,   # flag to write new values as compressed if possible
+    #   CoordFormat => undef,   # GPS lat/long coordinate format
+    #   DateFormat  => undef,   # format for date/time
+        Duplicates  => 1,       # flag to save duplicate tag values
+    #   Escape      => undef,   # escape special characters
+    #   Exclude     => undef,   # tags to exclude
+    #   ExtractEmbedded =>undef,# flag to extract information from embedded documents
+    #   FastScan    => undef,   # flag to avoid scanning for trailer
+    #   FixBase     => undef,   # fix maker notes base offsets
+    #   GeoMaxIntSecs => undef, # geotag maximum interpolation time (secs)
+    #   GeoMaxExtSecs => undef, # geotag maximum extrapolation time (secs)
+    #   GeoMaxHDOP  => undef,   # geotag maximum HDOP
+    #   GeoMaxPDOP  => undef,   # geotag maximum PDOP
+    #   GeoMinSats  => undef,   # geotag minimum satellites
+    #   Group#      => undef,   # return tags for specified groups in family #
+        HtmlDump    => 0,       # HTML dump (0-3, higher # = bigger limit)
+    #   HtmlDumpBase => undef,  # base address for HTML dump
+    #   IgnoreMinorErrors => undef, # ignore minor errors when reading/writing
+        Lang        => $defaultLang,# localized language for descriptions etc
+    #   LargeFileSupport => undef,  # flag indicating support of 64-bit file offsets
+    #   List        => undef,   # extract lists of PrintConv values into arrays
+        ListSep     => ', ',    # list item separator
+    #   ListSplit   => undef,   # regex for splitting list-type tag values when writing
+    #   MakerNotes  => undef,   # extract maker notes as a block
+    #   MissingTagValue =>undef,# value for missing tags when expanded in expressions
+    #   Password    => undef,   # password for password-protected PDF documents
+        PrintConv   => 1,       # flag to enable print conversion
+    #   SavePath    => undef,   # (undocumented) save family 5 location path
+    #   ScanForXMP  => undef,   # flag to scan for XMP information in all files
+        Sort        => 'Input', # order to sort found tags (Input, File, Alpha, Group#)
+    #   StrictDate  => undef,   # flag to return undef for invalid date conversions
+    #   Struct      => undef,   # return structures as hash references
+        TextOut     => \*STDOUT,# file for Verbose/HtmlDump output
+        Unknown     => 0,       # flag to get values of unknown tags (0-2)
+        Verbose     => 0,       # print verbose messages (0-5, higher # = more verbose)
+    };
+    # keep necessary member variables in sync with options
+    delete $$self{CUR_LANG};
+    delete $$self{ESCAPE_PROC};
+
+    # load user-defined default options
+    if (%Image::ExifTool::UserDefined::Options) {
+        foreach (keys %Image::ExifTool::UserDefined::Options) {
+            $self->Options($_, $Image::ExifTool::UserDefined::Options{$_});
+        }
+    }
+}
+
+#------------------------------------------------------------------------------
+# Extract meta information from image
+# Inputs: 0) ExifTool object reference
+#         1-N) Same as ImageInfo()
+# Returns: 1 if this was a valid image, 0 otherwise
+# Notes: pass an undefined value to avoid parsing arguments
+# Internal 'ReEntry' option allows this routine to be called recursively
+sub ExtractInfo($;@)
+{
+    local $_;
+    my $self = shift;
+    my $options = $self->{OPTIONS};     # pointer to current options
+    my (%saveOptions, $reEntry, $rsize);
+
+    # check for internal ReEntry option to allow recursive calls to ExtractInfo
+    if (ref $_[1] eq 'HASH' and $_[1]{ReEntry} and
+       (ref $_[0] eq 'SCALAR' or ref $_[0] eq 'GLOB'))
+    {
+        # save necessary members for restoring later
+        $reEntry = {
+            RAF       => $$self{RAF},
+            PROCESSED => $$self{PROCESSED},
+            EXIF_DATA => $$self{EXIF_DATA},
+            EXIF_POS  => $$self{EXIF_POS},
+            FILE_TYPE => $$self{FILE_TYPE},
+        };
+        $self->{RAF} = new File::RandomAccess($_[0]);
+        $$self{PROCESSED} = { };
+        delete $$self{EXIF_DATA};
+        delete $$self{EXIF_POS};
+    } else {
+        if (defined $_[0] or $options->{HtmlDump}) {
+            %saveOptions = %$options;       # save original options
+    
+            # require duplicates for html dump
+            $self->Options(Duplicates => 1) if $options->{HtmlDump};
+    
+            if (defined $_[0]) {
+                # only initialize filename if called with arguments
+                $self->{FILENAME} = undef;  # name of file (or '' if we didn't open it)
+                $self->{RAF} = undef;       # RandomAccess object reference
+    
+                $self->ParseArguments(@_);  # initialize from our arguments
+            }
+        }
+        # initialize ExifTool object members
+        $self->Init();
+
+        delete $self->{MAKER_NOTE_FIXUP};   # fixup information for extracted maker notes
+        delete $self->{MAKER_NOTE_BYTE_ORDER};
+
+        # return our version number
+        $self->FoundTag('ExifToolVersion', "$VERSION$RELEASE");
+        $self->FoundTag('Now', time()) if $self->{REQ_TAG_LOOKUP}{now} or $self->{TAGS_FROM_FILE};
+    }
+    my $filename = $self->{FILENAME};   # image file name ('' if already open)
+    my $raf = $self->{RAF};             # RandomAccess object
+
+    local *EXIFTOOL_FILE;   # avoid clashes with global namespace
+
+    my $realname = $filename;
+    unless ($raf) {
+        # save file name
+        if (defined $filename and $filename ne '') {
+            unless ($filename eq '-') {
+                # extract file name from pipe if necessary
+                $realname =~ /\|$/ and $realname =~ s/.*?"(.*?)".*/$1/;
+                my ($dir, $name);
+                if (eval 'require File::Basename') {
+                    $dir = File::Basename::dirname($realname);
+                    $name = File::Basename::basename($realname);
+                } else {
+                    ($name = $realname) =~ tr/\\/\//;
+                    # remove path
+                    $dir = length($1) ? $1 : '/' if $name =~ s/(.*)\///;
+                }
+                $self->FoundTag('FileName', $name);
+                $self->FoundTag('Directory', $dir) if defined $dir and length $dir;
+                # get size of resource fork on Mac OS
+                $rsize = -s "$filename/rsrc" if $^O eq 'darwin' and not $$self{IN_RESOURCE};
+            }
+            # open the file
+            if (open(EXIFTOOL_FILE, $filename)) {
+                # create random access file object
+                $raf = new File::RandomAccess(\*EXIFTOOL_FILE);
+                # patch to force pipe to be buffered because seek returns success
+                # in Windows cmd shell pipe even though it really failed
+                $raf->{TESTED} = -1 if $filename eq '-' or $filename =~ /\|$/;
+                $self->{RAF} = $raf;
+            } else {
+                $self->Error('Error opening file');
+            }
+        } else {
+            $self->Error('No file specified');
+        }
+    }
+
+    if ($raf) {
+        if ($reEntry) {
+            # we already set these tags
+        } elsif (not $raf->{FILE_PT}) {
+            # get file size from image in memory
+            $self->FoundTag('FileSize', length ${$raf->{BUFF_PT}});
+        } elsif (-f $raf->{FILE_PT}) {
+            # get file size and last modified time if this is a plain file
+            my $fileSize = -s _;
+            my $fileTime = -M _;
+            my @stat = stat _;
+            $self->FoundTag('FileSize', $fileSize) if defined $fileSize;
+            $self->FoundTag('ResourceForkSize', $rsize) if $rsize;
+            $self->FoundTag('FileModifyDate', $^T - $fileTime*(24*3600)) if defined $fileTime;
+            $self->FoundTag('FilePermissions', $stat[2]) if defined $stat[2];
+        }
+
+        # get list of file types to check
+        my ($tiffType, %noMagic);
+        $self->{FILE_EXT} = GetFileExtension($realname);
+        my @fileTypeList = GetFileType($realname);
+        if (@fileTypeList) {
+            # add remaining types to end of list so we test them all
+            my $pat = join '|', @fileTypeList;
+            push @fileTypeList, grep(!/^($pat)$/, @fileTypes);
+            $tiffType = $self->{FILE_EXT};
+            $noMagic{MXF} = 1;  # don't do magic number test on MXF or DV files
+            $noMagic{DV} = 1;
+        } else {
+            # scan through all recognized file types
+            @fileTypeList = @fileTypes;
+            $tiffType = 'TIFF';
+        }
+        push @fileTypeList, ''; # end of list marker
+        # initialize the input file for seeking in binary data
+        $raf->BinMode();    # set binary mode before we start reading
+        my $pos = $raf->Tell(); # get file position so we can rewind
+        my %dirInfo = ( RAF => $raf, Base => $pos );
+        # loop through list of file types to test
+        my ($type, $buff, $seekErr);
+        # read first 1024 bytes of file for testing
+        $raf->Read($buff, 1024) or $buff = '';
+        $raf->Seek($pos, 0) or $seekErr = 1;
+        until ($seekErr) {
+            $type = shift @fileTypeList;
+            if ($type) {
+                # do quick test for this file type to avoid loading module unnecessarily
+                next if $magicNumber{$type} and $buff !~ /^$magicNumber{$type}/s and
+                        not $noMagic{$type};
+            } else {
+                last unless defined $type;
+                # last ditch effort to scan past unknown header for JPEG/TIFF
+                next unless $buff =~ /(\xff\xd8\xff|MM\0\x2a|II\x2a\0)/g;
+                $type = ($1 eq "\xff\xd8\xff") ? 'JPEG' : 'TIFF';
+                my $skip = pos($buff) - length($1);
+                $dirInfo{Base} = $pos + $skip;
+                $raf->Seek($pos + $skip, 0) or $seekErr = 1, last;
+                $self->Warn("Skipped unknown $skip byte header");
+            }
+            # save file type in member variable
+            $self->{FILE_TYPE} = $self->{PATH}[0] = $type;
+            $dirInfo{Parent} = ($type eq 'TIFF') ? $tiffType : $type;
+            my $module = $moduleName{$type};
+            $module = $type unless defined $module;
+            my $func = "Process$type";
+
+            # load module if necessary
+            if ($module) {
+                require "Image/ExifTool/$module.pm";
+                $func = "Image::ExifTool::${module}::$func";
+            } elsif ($module eq '0') {
+                $self->SetFileType();
+                $self->Warn('Unsupported file type');
+                last;
+            }
+            # process the file
+            no strict 'refs';
+            &$func($self, \%dirInfo) and last;
+            use strict 'refs';
+
+            # seek back to try again from the same position in the file
+            $raf->Seek($pos, 0) or $seekErr = 1, last;
+        }
+        if ($seekErr) {
+            $self->Error('Error seeking in file');
+        } elsif ($self->Options('ScanForXMP') and (not defined $type or
+            (not $self->Options('FastScan') and not $$self{FoundXMP})))
+        {
+            # scan for XMP
+            $raf->Seek($pos, 0);
+            require Image::ExifTool::XMP;
+            Image::ExifTool::XMP::ScanForXMP($self, $raf) and $type = '';
+        }
+        unless (defined $type) {
+            # if we were given a single image with a known type there
+            # must be a format error since we couldn't read it, otherwise
+            # it is likely we don't support images of this type
+            my $fileType = GetFileType($realname);
+            my $err;
+            if (not $fileType) {
+                $err = 'Unknown file type';
+            } elsif ($fileType eq 'RAW') {
+                $err = 'Unsupported RAW file type';
+            } else {
+                $err = 'File format error';
+            }
+            $self->Error($err);
+        }
+        # extract binary EXIF data block only if requested
+        if (defined $self->{EXIF_DATA} and length $$self{EXIF_DATA} > 16 and
+            ($self->{REQ_TAG_LOOKUP}{exif} or $self->{OPTIONS}{Binary}))
+        {
+            $self->FoundTag('EXIF', $self->{EXIF_DATA});
+        }
+        unless ($reEntry) {
+            $self->{PATH} = [ ];    # reset PATH
+            # calculate Composite tags
+            $self->BuildCompositeTags() if $options->{Composite};
+            # do our HTML dump if requested
+            if ($self->{HTML_DUMP}) {
+                $raf->Seek(0, 2);   # seek to end of file
+                $self->{HTML_DUMP}->FinishTiffDump($self, $raf->Tell());
+                my $pos = $options->{HtmlDumpBase};
+                $pos = ($self->{FIRST_EXIF_POS} || 0) unless defined $pos;
+                my $dataPt = defined $self->{EXIF_DATA} ? \$self->{EXIF_DATA} : undef;
+                undef $dataPt if defined $self->{EXIF_POS} and $pos != $self->{EXIF_POS};
+                my $success = $self->{HTML_DUMP}->Print($raf, $dataPt, $pos,
+                    $options->{TextOut}, $options->{HtmlDump},
+                    $self->{FILENAME} ? "HTML Dump ($self->{FILENAME})" : 'HTML Dump');
+                $self->Warn("Error reading $self->{HTML_DUMP}{ERROR}") if $success < 0;
+            }
+        }
+        if ($filename) {
+            $raf->Close();  # close the file if we opened it
+            # process the resource fork as an embedded file on Mac filesystems
+            if ($rsize and $options->{ExtractEmbedded}) {
+                local *RESOURCE_FILE;
+                if (open(RESOURCE_FILE, "$filename/rsrc")) {
+                    $$self{DOC_NUM} = $$self{DOC_COUNT} + 1;
+                    $$self{IN_RESOURCE} = 1;
+                    $self->ExtractInfo(\*RESOURCE_FILE, { ReEntry => 1 });
+                    close RESOURCE_FILE;
+                    delete $$self{IN_RESOURCE};
+                } else {
+                    $self->Warn('Error opening resource fork');
+                }
+            }
+        }
+    }
+
+    # restore original options
+    %saveOptions and $self->{OPTIONS} = \%saveOptions;
+
+    if ($reEntry) {
+        # restore necessary members when exiting re-entrant code
+        $$self{$_} = $$reEntry{$_} foreach keys %$reEntry;
+    }
+
+    return exists $self->{VALUE}{Error} ? 0 : 1;
+}
+
+#------------------------------------------------------------------------------
+# Get hash of extracted meta information
+# Inputs: 0) ExifTool object reference
+#         1-N) options hash reference, tag list reference or tag names
+# Returns: Reference to information hash
+# Notes: - pass an undefined value to avoid parsing arguments
+#        - If groups are specified, first groups take precedence if duplicate
+#          tags found but Duplicates option not set.
+#        - tag names may end in '#' to extract ValueConv value
+sub GetInfo($;@)
+{
+    local $_;
+    my $self = shift;
+    my %saveOptions;
+
+    unless (@_ and not defined $_[0]) {
+        %saveOptions = %{$self->{OPTIONS}}; # save original options
+        # must set FILENAME so it isn't parsed from the arguments
+        $self->{FILENAME} = '' unless defined $self->{FILENAME};
+        $self->ParseArguments(@_);
+    }
+
+    # get reference to list of tags for which we will return info
+    my ($rtnTags, $byValue) = $self->SetFoundTags();
+
+    # build hash of tag information
+    my (%info, %ignored);
+    my $conv = $self->{OPTIONS}{PrintConv} ? 'PrintConv' : 'ValueConv';
+    foreach (@$rtnTags) {
+        my $val = $self->GetValue($_, $conv);
+        defined $val or $ignored{$_} = 1, next;
+        $info{$_} = $val;
+    }
+
+    # override specified tags with ValueConv value if necessary
+    if (@$byValue and $conv ne 'ValueConv') {
+        # first determine the number of times each non-ValueConv value is used
+        my %nonVal;
+        $nonVal{$_} = ($nonVal{$_} || 0) + 1 foreach @$rtnTags;
+        --$nonVal{$$rtnTags[$_]} foreach @$byValue;
+        # loop through ValueConv tags, updating tag keys and returned values
+        foreach (@$byValue) {
+            my $tag = $$rtnTags[$_];
+            my $val = $self->GetValue($tag, 'ValueConv');
+            next unless defined $val;
+            my $vtag = $tag;
+            # generate a new tag key like "Tag #" or "Tag #(1)"
+            $vtag =~ s/( |$)/ #/;
+            unless (defined $self->{VALUE}->{$vtag}) {
+                $self->{VALUE}{$vtag} = $self->{VALUE}{$tag};
+                $self->{TAG_INFO}{$vtag} = $self->{TAG_INFO}{$tag};
+                $self->{TAG_EXTRA}{$vtag} = $self->{TAG_EXTRA}{$tag};
+                $self->{FILE_ORDER}{$vtag} = $self->{FILE_ORDER}{$tag};
+                # remove existing PrintConv entry unless we are using it too
+                delete $info{$tag} unless $nonVal{$tag};
+            }
+            $$rtnTags[$_] = $vtag;  # store ValueConv value with new tag key
+            $info{$vtag} = $val;    # return ValueConv value
+        }
+    }
+
+    # remove ignored tags from the list
+    my $reqTags = $self->{REQUESTED_TAGS} || [ ];
+    if (%ignored and not @$reqTags) {
+        my @goodTags;
+        foreach (@$rtnTags) {
+            push @goodTags, $_ unless $ignored{$_};
+        }
+        $rtnTags = $self->{FOUND_TAGS} = \@goodTags;
+    }
+
+    # return sorted tag list if provided with a list reference
+    if ($self->{IO_TAG_LIST}) {
+        # use file order by default if no tags specified
+        # (no such thing as 'Input' order in this case)
+        my $sortOrder = $self->{OPTIONS}{Sort};
+        unless (@$reqTags or ($sortOrder and $sortOrder ne 'Input')) {
+            $sortOrder = 'File';
+        }
+        # return tags in specified sort order
+        @{$self->{IO_TAG_LIST}} = $self->GetTagList($rtnTags, $sortOrder);
+    }
+
+    # restore original options
+    %saveOptions and $self->{OPTIONS} = \%saveOptions;
+
+    return \%info;
+}
+
+#------------------------------------------------------------------------------
+# Combine information from a list of info hashes
+# Unless Duplicates is enabled, first entry found takes priority
+# Inputs: 0) ExifTool object reference, 1-N) list of info hash references
+# Returns: Combined information hash reference
+sub CombineInfo($;@)
+{
+    local $_;
+    my $self = shift;
+    my (%combinedInfo, $info, $tag, %haveInfo);
+
+    if ($self->{OPTIONS}{Duplicates}) {
+        while ($info = shift) {
+            foreach $tag (keys %$info) {
+                $combinedInfo{$tag} = $$info{$tag};
+            }
+        }
+    } else {
+        while ($info = shift) {
+            foreach $tag (keys %$info) {
+                my $tagName = GetTagName($tag);
+                next if $haveInfo{$tagName};
+                $haveInfo{$tagName} = 1;
+                $combinedInfo{$tag} = $$info{$tag};
+            }
+        }
+    }
+    return \%combinedInfo;
+}
+
+#------------------------------------------------------------------------------
+# Inputs: 0) ExifTool object reference
+#         1) [optional] reference to info hash or tag list ref (default is found tags)
+#         2) [optional] sort order ('File', 'Input', ...)
+# Returns: List of tags in specified order
+sub GetTagList($;$$)
+{
+    local $_;
+    my ($self, $info, $sortOrder) = @_;
+
+    my $foundTags;
+    if (ref $info eq 'HASH') {
+        my @tags = keys %$info;
+        $foundTags = \@tags;
+    } elsif (ref $info eq 'ARRAY') {
+        $foundTags = $info;
+    }
+    my $fileOrder = $self->{FILE_ORDER};
+
+    if ($foundTags) {
+        # make sure a FILE_ORDER entry exists for all tags
+        # (note: already generated bogus entries for FOUND_TAGS case below)
+        foreach (@$foundTags) {
+            next if defined $$fileOrder{$_};
+            $$fileOrder{$_} = 999;
+        }
+    } else {
+        $sortOrder = $info if $info and not $sortOrder;
+        $foundTags = $self->{FOUND_TAGS} || $self->SetFoundTags() or return undef;
+    }
+    $sortOrder or $sortOrder = $self->{OPTIONS}{Sort};
+
+    # return original list if no sort order specified
+    return @$foundTags unless $sortOrder and $sortOrder ne 'Input';
+
+    if ($sortOrder eq 'Alpha') {
+        return sort @$foundTags;
+    } elsif ($sortOrder =~ /^Group(\d*(:\d+)*)/) {
+        my $family = $1 || 0;
+        # want to maintain a basic file order with the groups
+        # ordered in the way they appear in the file
+        my (%groupCount, %groupOrder);
+        my $numGroups = 0;
+        my $tag;
+        foreach $tag (sort { $$fileOrder{$a} <=> $$fileOrder{$b} } @$foundTags) {
+            my $group = $self->GetGroup($tag, $family);
+            my $num = $groupCount{$group};
+            $num or $num = $groupCount{$group} = ++$numGroups;
+            $groupOrder{$tag} = $num;
+        }
+        return sort { $groupOrder{$a} <=> $groupOrder{$b} or
+                      $$fileOrder{$a} <=> $$fileOrder{$b} } @$foundTags;
+    } else {
+        return sort { $$fileOrder{$a} <=> $$fileOrder{$b} } @$foundTags;
+    }
+}
+
+#------------------------------------------------------------------------------
+# Get list of found tags in specified sort order
+# Inputs: 0) ExifTool object reference, 1) sort order ('File', 'Input', ...)
+# Returns: List of tag keys in specified order
+# Notes: If not specified, sort order is taken from OPTIONS
+sub GetFoundTags($;$)
+{
+    local $_;
+    my ($self, $sortOrder) = @_;
+    my $foundTags = $self->{FOUND_TAGS} || $self->SetFoundTags() or return undef;
+    return $self->GetTagList($foundTags, $sortOrder);
+}
+
+#------------------------------------------------------------------------------
+# Get list of requested tags
+# Inputs: 0) ExifTool object reference
+# Returns: List of requested tag keys
+sub GetRequestedTags($)
+{
+    local $_;
+    return @{$_[0]{REQUESTED_TAGS}};
+}
+
+#------------------------------------------------------------------------------
+# Get tag value
+# Inputs: 0) ExifTool object reference
+#         1) tag key (or flattened tagInfo for getting field values, not part of public API)
+#         2) [optional] Value type: PrintConv, ValueConv, Both or Raw, the default
+#            is PrintConv or ValueConv, depending on the PrintConv option setting
+#         3) raw field value (not part of public API)
+# Returns: Scalar context: tag value or undefined
+#          List context: list of values or empty list
+sub GetValue($$;$)
+{
+    local $_;
+    my ($self, $tag, $type) = @_; # plus: ($fieldValue)
+    my (@convTypes, $tagInfo, $valueConv, $both);
+
+    # figure out what conversions to do
+    $type or $type = $self->{OPTIONS}{PrintConv} ? 'PrintConv' : 'ValueConv';
+
+    # start with the raw value
+    my $value = $self->{VALUE}{$tag};
+    if (not defined $value) {
+        return wantarray ? () : undef unless ref $tag;
+        # get the value of a structure field
+        $tagInfo = $tag;
+        $tag = $$tagInfo{Name};
+        $value = $_[3];
+        # (note: type "Both" is not allowed for structure fields)
+        if ($type ne 'Raw') {
+            push @convTypes, 'ValueConv';
+            push @convTypes, 'PrintConv' unless $type eq 'ValueConv';
+        }
+    } else {
+        $tagInfo = $self->{TAG_INFO}{$tag};
+        if ($$tagInfo{Struct} and ref $value) {
+            # must load XMPStruct.pl just in case (should already be loaded if
+            # a structure was extracted, but we could also arrive here if a simple
+            # list of values was stored incorrectly in a Struct tag)
+            require 'Image/ExifTool/XMPStruct.pl';
+            # convert strucure field values
+            unless ($type eq 'Both') {
+                # (note: ConvertStruct handles the escape too if necessary)
+                return Image::ExifTool::XMP::ConvertStruct($self,$tagInfo,$value,$type);
+            }
+            $valueConv = Image::ExifTool::XMP::ConvertStruct($self,$tagInfo,$value,'ValueConv');
+            $value = Image::ExifTool::XMP::ConvertStruct($self,$tagInfo,$value,'PrintConv');
+            # (must not save these in $$self{BOTH} because the values may have been escaped)
+            return ($valueConv, $value);
+        }
+        if ($type ne 'Raw') {
+            # use values we calculated already if we stored them
+            $both = $self->{BOTH}{$tag};
+            if ($both) {
+                if ($type eq 'PrintConv') {
+                    $value = $$both[1];
+                } elsif ($type eq 'ValueConv') {
+                    $value = $$both[0];
+                    $value = $$both[1] unless defined $value;
+                } else {
+                    ($valueConv, $value) = @$both;
+                }
+            } else {
+                push @convTypes, 'ValueConv';
+                push @convTypes, 'PrintConv' unless $type eq 'ValueConv';
+            }
+        }
+    }
+
+    # do the conversions
+    my (@val, @prt, @raw, $convType);
+    foreach $convType (@convTypes) {
+        # don't convert a scalar reference or structure
+        last if ref $value eq 'SCALAR';
+        my $conv = $$tagInfo{$convType};
+        unless (defined $conv) {
+            if ($convType eq 'ValueConv') {
+                next unless $$tagInfo{Binary};
+                $conv = '\$val';  # return scalar reference for binary values
+            } else {
+                # use PRINT_CONV from tag table if PrintConv doesn't exist
+                next unless defined($conv = $tagInfo->{Table}{PRINT_CONV});
+                next if exists $$tagInfo{$convType};
+            }
+        }
+        # save old ValueConv value if we want Both
+        $valueConv = $value if $type eq 'Both' and $convType eq 'PrintConv';
+        my ($i, $val, $vals, @values, $convList);
+        # split into list if conversion is an array
+        if (ref $conv eq 'ARRAY') {
+            $convList = $conv;
+            $conv = $$convList[0];
+            my @valList = split ' ', $value;
+            # reorganize list if specified (Note: The writer currently doesn't
+            # relist values, so they may be grouped but the order must not change)
+            my $relist = $$tagInfo{Relist};
+            if ($relist) {
+                my (@newList, $oldIndex);
+                foreach $oldIndex (@$relist) {
+                    my ($newVal, @join);
+                    if (ref $oldIndex) {
+                        foreach (@$oldIndex) {
+                            push @join, $valList[$_] if defined $valList[$_];
+                        }
+                        $newVal = join(' ', @join) if @join;
+                    } else {
+                        $newVal = $valList[$oldIndex];
+                    }
+                    push @newList, $newVal if defined $newVal;
+                }
+                $value = \@newList;
+            } else {
+                $value = \@valList;
+            }
+        }
+        # initialize array so we can iterate over values in list
+        if (ref $value eq 'ARRAY') {
+            $i = 0;
+            $vals = $value;
+            $val = $$vals[0];
+        } else {
+            $val = $value;
+        }
+        # loop through all values in list
+        for (;;) {
+            if (defined $conv) {
+                # get values of required tags if this is a Composite tag
+                if (ref $val eq 'HASH' and not @val) {
+                    # disable escape of source values so we don't double escape them
+                    my $oldEscape = $$self{ESCAPE_PROC};
+                    delete $$self{ESCAPE_PROC};
+                    foreach (keys %$val) {
+                        $raw[$_] = $self->{VALUE}{$$val{$_}};
+                        ($val[$_], $prt[$_]) = $self->GetValue($$val{$_}, 'Both');
+                        next if defined $val[$_] or not $tagInfo->{Require}{$_};
+                        $$self{ESCAPE_PROC} = $oldEscape;
+                        return wantarray ? () : undef;
+                    }
+                    $$self{ESCAPE_PROC} = $oldEscape;
+                    # set $val to $val[0], or \@val for a CODE ref conversion
+                    $val = ref $conv eq 'CODE' ? \@val : $val[0];
+                }
+                if (ref $conv eq 'HASH') {
+                    # look up converted value in hash
+                    my $lc;
+                    if (defined($value = $$conv{$val})) {
+                        # override with our localized language PrintConv if available
+                        if ($$self{CUR_LANG} and $convType eq 'PrintConv' and
+                            # (no need to check for lang-alt tag names -- they won't have a PrintConv)
+                            ref($lc = $self->{CUR_LANG}{$$tagInfo{Name}}) eq 'HASH' and
+                            ($lc = $$lc{PrintConv}) and ($lc = $$lc{$value}))
+                        {
+                            $value = $self->Decode($lc, 'UTF8');
+                        }
+                    } else {
+                        if ($$conv{BITMASK}) {
+                            $value = DecodeBits($val, $$conv{BITMASK});
+                            # override with localized language strings
+                            if (defined $value and $$self{CUR_LANG} and $convType eq 'PrintConv' and
+                                ref($lc = $self->{CUR_LANG}{$$tagInfo{Name}}) eq 'HASH' and
+                                ($lc = $$lc{PrintConv}))
+                            {
+                                my @vals = split ', ', $value;
+                                foreach (@vals) {
+                                    $_ = $$lc{$_} if defined $$lc{$_};
+                                }
+                                $value = join ', ', @vals;
+                            }
+                        } elsif (not $$conv{OTHER} or
+                                 # use alternate conversion routine if available
+                                 not defined($value = &{$$conv{OTHER}}($val, undef, $conv)))
+                        {
+                            if (($$tagInfo{PrintHex} or
+                                ($$tagInfo{Mask} and not defined $$tagInfo{PrintHex}))
+                                and $val and IsInt($val) and $convType eq 'PrintConv')
+                            {
+                                $val = sprintf('0x%x',$val);
+                            }
+                            $value = "Unknown ($val)";
+                        }
+                    }
+                } else {
+                    # call subroutine or do eval to convert value
+                    local $SIG{'__WARN__'} = \&SetWarning;
+                    undef $evalWarning;
+                    if (ref $conv eq 'CODE') {
+                        $value = &$conv($val, $self);
+                    } else {
+                        #### eval ValueConv/PrintConv ($val, $self, @val, @prt, @raw)
+                        $value = eval $conv;
+                        $@ and $evalWarning = $@;
+                    }
+                    $self->Warn("$convType $tag: " . CleanWarning()) if $evalWarning;
+                }
+            } else {
+                $value = $val;
+            }
+            last unless $vals;
+            # save this converted value and step to next value in list
+            push @values, $value if defined $value;
+            if (++$i >= scalar(@$vals)) {
+                $value = \@values if @values;
+                last;
+            }
+            $val = $$vals[$i];
+            $conv = $$convList[$i] if $convList;
+        }
+        # return undefined now if no value
+        return wantarray ? () : undef unless defined $value;
+        # join back into single value if split for conversion list
+        if ($convList and ref $value eq 'ARRAY') {
+            $value = join($convType eq 'PrintConv' ? '; ' : ' ', @$value);
+        }
+    }
+    if ($type eq 'Both') {
+        # save both (unescaped) values because we often need them again
+        # (Composite tags need "Both" and often Require one tag for various Composite tags)
+        $self->{BOTH}{$tag} = [ $valueConv, $value ] unless $both;
+        # escape values if necessary
+        if ($$self{ESCAPE_PROC}) {
+            DoEscape($value, $$self{ESCAPE_PROC});
+            if (defined $valueConv) {
+                DoEscape($valueConv, $$self{ESCAPE_PROC});
+            } else {
+                $valueConv = $value;
+            }
+        } elsif (not defined $valueConv) {
+            # $valueConv is undefined if there was no print conversion done
+            $valueConv = $value;
+        }
+        # return Both values as a list (ValueConv, PrintConv)
+        return ($valueConv, $value);
+    }
+    # escape value if necessary
+    DoEscape($value, $$self{ESCAPE_PROC}) if $$self{ESCAPE_PROC};
+
+    if (ref $value eq 'ARRAY') {
+        # return array if requested
+        return @$value if wantarray;
+        # return list reference for Raw, ValueConv or if List or not a list of scalars
+        return $value if $type ne 'PrintConv' or $self->{OPTIONS}{List} or ref $$value[0];
+        # otherwise join in comma-separated string
+        $value = join $self->{OPTIONS}{ListSep}, @$value;
+    }
+    return $value;
+}
+
+#------------------------------------------------------------------------------
+# Get tag identification number
+# Inputs: 0) ExifTool object reference, 1) tag key
+# Returns: Scalar context: Tag ID if available, otherwise ''
+#          List context: 0) Tag ID (or ''), 1) language code (or undef)
+sub GetTagID($$)
+{
+    my ($self, $tag) = @_;
+    my $tagInfo = $self->{TAG_INFO}{$tag};
+    return '' unless $tagInfo and defined $$tagInfo{TagID};
+    return ($$tagInfo{TagID}, $$tagInfo{LangCode}) if wantarray;
+    return $$tagInfo{TagID};
+}
+
+#------------------------------------------------------------------------------
+# Get tag table name
+# Inputs: 0) ExifTool object reference, 1) tag key
+# Returns: Table name if available, otherwise ''
+sub GetTableName($$)
+{
+    my ($self, $tag) = @_;
+    my $tagInfo = $self->{TAG_INFO}{$tag} or return '';
+    return $tagInfo->{Table}{SHORT_NAME};
+}
+
+#------------------------------------------------------------------------------
+# Get tag index number
+# Inputs: 0) ExifTool object reference, 1) tag key
+# Returns: Table index number, or undefined if this tag isn't indexed
+sub GetTagIndex($$)
+{
+    my ($self, $tag) = @_;
+    my $tagInfo = $self->{TAG_INFO}{$tag} or return undef;
+    return $$tagInfo{Index};
+}
+
+#------------------------------------------------------------------------------
+# Get description for specified tag
+# Inputs: 0) ExifTool object reference, 1) tag key
+# Returns: Tag description
+# Notes: Will always return a defined value, even if description isn't available
+sub GetDescription($$)
+{
+    local $_;
+    my ($self, $tag) = @_;
+    my ($desc, $name);
+    my $tagInfo = $self->{TAG_INFO}{$tag};
+    # ($tagInfo won't be defined for missing tags extracted with -f)
+    if ($tagInfo) {
+        # use alternate language description if available
+        while ($$self{CUR_LANG}) {
+            $desc = $self->{CUR_LANG}{$$tagInfo{Name}};
+            if ($desc) {
+                # must look up Description if this tag also has a PrintConv
+                $desc = $$desc{Description} or last if ref $desc;
+            } else {
+                # look up default language of lang-alt tag
+                last unless $$tagInfo{LangCode} and
+                    ($name = $$tagInfo{Name}) =~ s/-$$tagInfo{LangCode}$// and
+                    $desc = $self->{CUR_LANG}{$name};
+                $desc = $$desc{Description} or last if ref $desc;
+                $desc .= " ($$tagInfo{LangCode})";
+            }
+            # escape description if necessary
+            DoEscape($desc, $$self{ESCAPE_PROC}) if $$self{ESCAPE_PROC};
+            # return description in proper Charset
+            return $self->Decode($desc, 'UTF8');
+        }
+        $desc = $$tagInfo{Description};
+    }
+    # just make the tag more readable if description doesn't exist
+    unless ($desc) {
+        $desc = MakeDescription(GetTagName($tag));
+        # save description in tag information
+        $$tagInfo{Description} = $desc if $tagInfo;
+    }
+    return $desc;
+}
+
+#------------------------------------------------------------------------------
+# Get group name for specified tag
+# Inputs: 0) ExifTool object reference
+#         1) tag key (or reference to tagInfo hash, not part of the public API)
+#         2) [optional] group family (-1 to get extended group list)
+# Returns: Scalar context: Group name (for family 0 if not otherwise specified)
+#          Array context: Group name if family specified, otherwise list of
+#          group names for each family.  Returns '' for undefined tag.
+# Notes: Mutiple families may be specified with ':' in family argument (ie. '1:2')
+sub GetGroup($$;$)
+{
+    local $_;
+    my ($self, $tag, $family) = @_;
+    my ($tagInfo, @groups, @families, $simplify, $byTagInfo);
+    if (ref $tag eq 'HASH') {
+        $tagInfo = $tag;
+        $tag = $$tagInfo{Name};
+        # set flag so we don't get extra information for an extracted tag
+        $byTagInfo = 1;
+    } else {
+        $tagInfo = $self->{TAG_INFO}{$tag} or return '';
+    }
+    my $groups = $$tagInfo{Groups};
+    # fill in default groups unless already done
+    # (after this, Groups 0-2 in tagInfo are guaranteed to be defined)
+    unless ($$tagInfo{GotGroups}) {
+        my $tagTablePtr = $$tagInfo{Table};
+        if ($tagTablePtr) {
+            # construct our group list
+            $groups or $groups = $$tagInfo{Groups} = { };
+            # fill in default groups
+            foreach (keys %{$$tagTablePtr{GROUPS}}) {
+                $$groups{$_} or $$groups{$_} = $tagTablePtr->{GROUPS}{$_};
+            }
+        }
+        # set flag indicating group list was built
+        $$tagInfo{GotGroups} = 1;
+    }
+    if (defined $family and $family ne '-1') {
+        if ($family =~ /[^\d]/) {
+            @families = ($family =~ /\d+/g);
+            return $$groups{0} unless @families;
+            $simplify = 1 unless $family =~ /^:/;
+            undef $family;
+            foreach (0..2) { $groups[$_] = $$groups{$_}; }
+        } else {
+            return $$groups{$family} if $family == 0 or $family == 2;
+            $groups[1] = $$groups{1};
+        }
+    } else {
+        return $$groups{0} unless wantarray;
+        foreach (0..2) { $groups[$_] = $$groups{$_}; }
+    }
+    $groups[3] = 'Main';
+    $groups[4] = ($tag =~ /\((\d+)\)$/) ? "Copy$1" : '';
+    # handle dynamic group names if necessary
+    my $ex = $self->{TAG_EXTRA}{$tag};
+    if ($ex and not $byTagInfo) {
+        $groups[0] = $$ex{G0} if $$ex{G0};
+        $groups[1] = $$ex{G1} =~ /^\+(.*)/ ? "$groups[1]$1" : $$ex{G1} if $$ex{G1};
+        $groups[3] = 'Doc' . $$ex{G3} if $$ex{G3};
+        $groups[5] = $$ex{G5} || $groups[1] if defined $$ex{G5};
+    }
+    if ($family) {
+        return $groups[$family] || '' if $family > 0;
+        # add additional matching group names to list
+        # ie) for MIE-Doc, also add MIE1, MIE1-Doc, MIE-Doc1 and MIE1-Doc1
+        # and for MIE2-Doc3, also add MIE2, MIE-Doc3, MIE2-Doc and MIE-Doc
+        if ($groups[1] =~ /^MIE(\d*)-(.+?)(\d*)$/) {
+            push @groups, 'MIE' . ($1 || '1');
+            push @groups, 'MIE' . ($1 ? '' : '1') . "-$2$3";
+            push @groups, "MIE$1-$2" . ($3 ? '' : '1');
+            push @groups, 'MIE' . ($1 ? '' : '1') . "-$2" . ($3 ? '' : '1');
+        }
+    }
+    if (@families) {
+        my @grps;
+        # create list of group names (without identical adjacent groups if simplifying)
+        foreach (@families) {
+            my $grp = $groups[$_] or next;
+            push @grps, $grp unless $simplify and @grps and $grp eq $grps[-1];
+        }
+        # remove leading "Main:" if simplifying
+        shift @grps if $simplify and @grps > 1 and $grps[0] eq 'Main';
+        # return colon-separated string of group names
+        return join ':', @grps;
+    }
+    return @groups;
+}
+
+#------------------------------------------------------------------------------
+# Get group names for specified tags
+# Inputs: 0) ExifTool object reference
+#         1) [optional] information hash reference (default all extracted info)
+#         2) [optional] group family (default 0)
+# Returns: List of group names in alphabetical order
+sub GetGroups($;$$)
+{
+    local $_;
+    my $self = shift;
+    my $info = shift;
+    my $family;
+
+    # figure out our arguments
+    if (ref $info ne 'HASH') {
+        $family = $info;
+        $info = $self->{VALUE};
+    } else {
+        $family = shift;
+    }
+    $family = 0 unless defined $family;
+
+    # get a list of all groups in specified information
+    my ($tag, %groups);
+    foreach $tag (keys %$info) {
+        $groups{ $self->GetGroup($tag, $family) } = 1;
+    }
+    return sort keys %groups;
+}
+
+#------------------------------------------------------------------------------
+# Set priority for group where new values are written
+# Inputs: 0) ExifTool object reference,
+#         1-N) group names (reset to default if no groups specified)
+sub SetNewGroups($;@)
+{
+    local $_;
+    my ($self, @groups) = @_;
+    @groups or @groups = @defaultWriteGroups;
+    my $count = @groups;
+    my %priority;
+    foreach (@groups) {
+        $priority{lc($_)} = $count--;
+    }
+    $priority{file} = 10;       # 'File' group is always written (Comment)
+    $priority{composite} = 10;  # 'Composite' group is always written
+    # set write priority (higher # is higher priority)
+    $self->{WRITE_PRIORITY} = \%priority;
+    $self->{WRITE_GROUPS} = \@groups;
+}
+
+#------------------------------------------------------------------------------
+# Build Composite tags from Require'd/Desire'd tags
+# Inputs: 0) ExifTool object reference
+# Note: Tag values are calculated in alphabetical order unless a tag Require's
+#       or Desire's another Composite tag, in which case the calculation is
+#       deferred until after the other tag is calculated.
+sub BuildCompositeTags($)
+{
+    local $_;
+    my $self = shift;
+
+    $$self{BuildingComposite} = 1;
+    # first, add user-defined Composite tags if necessary
+    if (%UserDefined and $UserDefined{'Image::ExifTool::Composite'}) {
+        AddCompositeTags($UserDefined{'Image::ExifTool::Composite'}, 1);
+        delete $UserDefined{'Image::ExifTool::Composite'};
+    }
+    my @tagList = sort keys %Image::ExifTool::Composite;
+    my %tagsUsed;
+
+    my $rawValue = $self->{VALUE};
+    for (;;) {
+        my %notBuilt;
+        $notBuilt{$_} = 1 foreach @tagList;
+        my @deferredTags;
+        my $tag;
+COMPOSITE_TAG:
+        foreach $tag (@tagList) {
+            next if $specialTags{$tag};
+            my $tagInfo = $self->GetTagInfo(\%Image::ExifTool::Composite, $tag);
+            next unless $tagInfo;
+            # put required tags into array and make sure they all exist
+            my $subDoc = ($$tagInfo{SubDoc} and $$self{DOC_COUNT});
+            my $require = $$tagInfo{Require} || { };
+            my $desire = $$tagInfo{Desire} || { };
+            # loop through sub-documents if necessary
+            my $doc;
+            for (;;) {
+                my (%tagKey, $found, $index);
+                # save Require'd and Desire'd tag values in list
+                for ($index=0; ; ++$index) {
+                    my $reqTag = $$require{$index} || $$desire{$index} or last;
+                    # add family 3 group if generating Composite tags for sub-documents
+                    # (unless tag already begins with family 3 group name)
+                    if ($subDoc and $reqTag !~ /^(Main|Doc\d+):/) {
+                        $reqTag = ($doc ? "Doc$doc:" : 'Main:') . $reqTag;
+                    }
+                    # allow tag group to be specified
+                    if ($reqTag =~ /^(.*):(.+)/) {
+                        my ($reqGroup, $name) = ($1, $2);
+                        if ($reqGroup eq 'Composite' and $notBuilt{$name}) {
+                            push @deferredTags, $tag;
+                            next COMPOSITE_TAG;
+                        }
+                        my ($i, $key, @keys);
+                        for ($i=0; ; ++$i) {
+                            $key = $name;
+                            $key .= " ($i)" if $i;
+                            last unless defined $$rawValue{$key};
+                            push @keys, $key;
+                        }
+                        # find first matching tag
+                        $key = $self->GroupMatches($reqGroup, \@keys);
+                        $reqTag = $key if $key;
+                    } elsif ($notBuilt{$reqTag}) {
+                        # calculate this tag later if it relies on another
+                        # Composite tag which hasn't been calculated yet
+                        push @deferredTags, $tag;
+                        next COMPOSITE_TAG;
+                    }
+                    if (defined $$rawValue{$reqTag}) {
+                        $found = 1;
+                    } elsif ($$require{$index}) {
+                        $found = 0;
+                        last;   # don't continue since we require this tag
+                    }
+                    $tagKey{$index} = $reqTag;
+                }
+                if ($doc) {
+                    if ($found) {
+                        $self->{DOC_NUM} = $doc;
+                        $self->FoundTag($tagInfo, \%tagKey);
+                        delete $self->{DOC_NUM};
+                    }
+                    next if ++$doc <= $self->{DOC_COUNT};
+                    last;
+                } elsif ($found) {
+                    delete $notBuilt{$tag}; # this tag is OK to build now
+                    # keep track of all Require'd tag keys
+                    foreach (keys %tagKey) {
+                        # only tag keys with same name as a Composite tag
+                        # can be replaced (also eliminates keys with
+                        # instance numbers which can't be replaced either)
+                        next unless $Image::ExifTool::Composite{$tagKey{$_}};
+                        my $keyRef = \$tagKey{$_};
+                        $tagsUsed{$$keyRef} or $tagsUsed{$$keyRef} = [ ];
+                        push @{$tagsUsed{$$keyRef}}, $keyRef;
+                    }
+                    # save reference to tag key lookup as value for Composite tag
+                    my $key = $self->FoundTag($tagInfo, \%tagKey);
+                    # check to see if we just replaced one of the tag keys we Require'd
+                    if (defined $key and $tagsUsed{$key}) {
+                        foreach (@{$tagsUsed{$key}}) {
+                            $$_ = $self->{MOVED_KEY};   # replace with new tag key
+                        }
+                        delete $tagsUsed{$key};         # can't be replaced again
+                    }
+                } elsif (not defined $found) {
+                    delete $notBuilt{$tag}; # tag can't be built anyway
+                }
+                last unless $subDoc;
+                $doc = 1;   # continue to process the 1st sub-document
+            }
+        }
+        last unless @deferredTags;
+        if (@deferredTags == @tagList) {
+            # everything was deferred in the last pass,
+            # must be a circular dependency
+            warn "Circular dependency in Composite tags\n";
+            last;
+        }
+        @tagList = @deferredTags; # calculate deferred tags now
+    }
+    delete $$self{BuildingComposite};
+}
+
+#------------------------------------------------------------------------------
+# Get tag name (removes copy index)
+# Inputs: 0) Tag key
+# Returns: Tag name
+sub GetTagName($)
+{
+    local $_;
+    $_[0] =~ /^(\S+)/;
+    return $1;
+}
+
+#------------------------------------------------------------------------------
+# Get list of shortcuts
+# Returns: Shortcut list (sorted alphabetically)
+sub GetShortcuts()
+{
+    local $_;
+    require Image::ExifTool::Shortcuts;
+    return sort keys %Image::ExifTool::Shortcuts::Main;
+}
+
+#------------------------------------------------------------------------------
+# Get file type for specified extension
+# Inputs: 0) file name or extension (case is not significant),
+#            or FileType value if a description is requested
+#         1) flag to return long description instead of type ('0' to return any recognized type)
+# Returns: File type (or desc) or undef if extension not supported or if
+#          description is the same as the input FileType.  In array
+#          context, may return more than one file type if the file may be
+#          different formats.  Returns list of all supported extensions if no
+#          file specified
+sub GetFileType(;$$)
+{
+    local $_;
+    my ($file, $desc) = @_;
+    unless (defined $file) {
+        my @types;
+        if (defined $desc and $desc eq '0') {
+            # return all recognized types
+            @types = sort keys %fileTypeLookup;
+        } else {
+            # return all supported types
+            foreach (sort keys %fileTypeLookup) {
+                push @types, $_ unless defined $moduleName{$_} and $moduleName{$_} eq '0';
+            }
+        }
+        return @types;
+    }
+    my $fileType;
+    my $fileExt = GetFileExtension($file);
+    $fileExt = uc($file) unless $fileExt;
+    $fileExt and $fileType = $fileTypeLookup{$fileExt}; # look up the file type
+    $fileType = $fileTypeLookup{$fileType} unless ref $fileType or not $fileType;
+    # return description if specified
+    # (allow input $file to be a FileType for this purpose)
+    if ($desc) {
+        return $fileType ? $$fileType[1] : $fileDescription{$file};
+    } elsif ($fileType and (not defined $desc or $desc ne '0')) {
+        # return only supported file types
+        my $mod = $moduleName{$$fileType[0]};
+        undef $fileType if defined $mod and $mod eq '0';
+    }
+    $fileType or return wantarray ? () : undef;
+    $fileType = $$fileType[0];      # get file type (or list of types)
+    if (wantarray) {
+        return @$fileType if ref $fileType eq 'ARRAY';
+    } elsif ($fileType) {
+        $fileType = $fileExt if ref $fileType eq 'ARRAY';
+    }
+    return $fileType;
+}
+
+#------------------------------------------------------------------------------
+# Return true if we can write the specified file type
+# Inputs: 0) file name or ext
+# Returns: true if writable, 0 if not writable, undef if unrecognized
+sub CanWrite($)
+{
+    local $_;
+    my $file = shift or return undef;
+    my $type = GetFileType($file) or return undef;
+    if ($noWriteFile{$type}) {
+        # can't write TIFF files with certain extensions (various RAW formats)
+        my $ext = GetFileExtension($file) || uc($file);
+        return grep(/^$ext$/, @{$noWriteFile{$type}}) ? 0 : 1 if $ext;
+    }
+    return scalar(grep /^$type$/, @writeTypes);
+}
+
+#------------------------------------------------------------------------------
+# Return true if we can create the specified file type
+# Inputs: 0) file name or ext
+# Returns: true if creatable, 0 if not writable, undef if unrecognized
+sub CanCreate($)
+{
+    local $_;
+    my $file = shift or return undef;
+    my $ext = GetFileExtension($file) || uc($file);
+    my $type = GetFileType($file) or return undef;
+    return 1 if $createTypes{$ext} or $createTypes{$type};
+    return 0;
+}
+
+#==============================================================================
+# Functions below this are not part of the public API
+
+# Initialize member variables
+# Inputs: 0) ExifTool object reference
+sub Init($)
+{
+    local $_;
+    my $self = shift;
+    # delete all DataMember variables (lower-case names)
+    foreach (keys %$self) {
+        /[a-z]/ and delete $self->{$_};
+    }
+    delete $self->{FOUND_TAGS};     # list of found tags
+    delete $self->{EXIF_DATA};      # the EXIF data block
+    delete $self->{EXIF_POS};       # EXIF position in file
+    delete $self->{FIRST_EXIF_POS}; # position of first EXIF in file
+    delete $self->{HTML_DUMP};      # html dump information
+    delete $self->{SET_GROUP1};     # group1 name override
+    delete $self->{DOC_NUM};        # current embedded document number
+    $self->{DOC_COUNT}  = 0;        # count of embedded documents processed
+    $self->{BASE}       = 0;        # base for offsets from start of file
+    $self->{FILE_ORDER} = { };      # * hash of tag order in file
+    $self->{VALUE}      = { };      # * hash of raw tag values
+    $self->{BOTH}       = { };      # * hash for Value/PrintConv values of Require'd tags
+    $self->{TAG_INFO}   = { };      # * hash of tag information
+    $self->{TAG_EXTRA}  = { };      # * hash of extra tag information (dynamic group names)
+    $self->{PRIORITY}   = { };      # * priority of current tags
+    $self->{LIST_TAGS}  = { };      # hash of tagInfo refs for active List-type tags
+    $self->{PROCESSED}  = { };      # hash of processed directory start positions
+    $self->{DIR_COUNT}  = { };      # count various types of directories
+    $self->{DUPL_TAG}   = { };      # last-used index for duplicate-tag keys
+    $self->{WARNED_ONCE}= { };      # WarnOnce() warnings already issued
+    $self->{PATH}       = [ ];      # current subdirectory path in file when reading
+    $self->{NUM_FOUND}  = 0;        # total number of tags found (incl. duplicates)
+    $self->{CHANGED}    = 0;        # number of tags changed (writer only)
+    $self->{INDENT}     = '  ';     # initial indent for verbose messages
+    $self->{PRIORITY_DIR} = '';     # the priority directory name
+    $self->{LOW_PRIORITY_DIR} = { PreviewIFD => 1 }; # names of priority 0 directories
+    $self->{TIFF_TYPE}  = '';       # type of TIFF data (APP1, TIFF, NEF, etc...)
+    $self->{Make}       = '';       # camera make
+    $self->{Model}      = '';       # camera model
+    $self->{CameraType} = '';       # Olympus camera type
+    if ($self->Options('HtmlDump')) {
+        require Image::ExifTool::HtmlDump;
+        $self->{HTML_DUMP} = new Image::ExifTool::HtmlDump;
+    }
+    # make sure our TextOut is a file reference
+    $self->{OPTIONS}{TextOut} = \*STDOUT unless ref $self->{OPTIONS}{TextOut};
+}
+
+#------------------------------------------------------------------------------
+# Parse function arguments and set member variables accordingly
+# Inputs: Same as ImageInfo()
+# - sets REQUESTED_TAGS, REQ_TAG_LOOKUP, IO_TAG_LIST, FILENAME, RAF, OPTIONS
+sub ParseArguments($;@)
+{
+    my $self = shift;
+    my $options = $self->{OPTIONS};
+    my @exclude;
+    my @oldGroupOpts = grep /^Group/, keys %{$self->{OPTIONS}};
+    my $wasExcludeOpt;
+
+    $self->{REQUESTED_TAGS} = [ ];
+    $self->{REQ_TAG_LOOKUP} = { };
+    $self->{IO_TAG_LIST} = undef;
+
+    # handle our input arguments
+    while (@_) {
+        my $arg = shift;
+        if (ref $arg) {
+            if (ref $arg eq 'ARRAY') {
+                $self->{IO_TAG_LIST} = $arg;
+                foreach (@$arg) {
+                    if (/^-(.*)/) {
+                        push @exclude, $1;
+                    } else {
+                        push @{$self->{REQUESTED_TAGS}}, $_;
+                    }
+                }
+            } elsif (ref $arg eq 'HASH') {
+                my $opt;
+                foreach $opt (keys %$arg) {
+                    # a single new group option overrides all old group options
+                    if (@oldGroupOpts and $opt =~ /^Group/) {
+                        foreach (@oldGroupOpts) {
+                            delete $options->{$_};
+                        }
+                        undef @oldGroupOpts;
+                    }
+                    $self->Options($opt, $$arg{$opt});
+                    $opt eq 'Exclude' and $wasExcludeOpt = 1;
+                }
+            } elsif (ref $arg eq 'SCALAR' or UNIVERSAL::isa($arg,'GLOB')) {
+                next if defined $self->{RAF};
+                # convert image data from UTF-8 to character stream if necessary
+                # (patches RHEL 3 UTF8 LANG problem)
+                if (ref $arg eq 'SCALAR' and $] >= 5.006 and
+                    (eval 'require Encode; Encode::is_utf8($$arg)' or $@))
+                {
+                    # repack by hand if Encode isn't available
+                    my $buff = $@ ? pack('C*',unpack('U0C*',$$arg)) : Encode::encode('utf8',$$arg);
+                    $arg = \$buff;
+                }
+                $self->{RAF} = new File::RandomAccess($arg);
+                # set filename to empty string to indicate that
+                # we have a file but we didn't open it
+                $self->{FILENAME} = '';
+            } elsif (UNIVERSAL::isa($arg, 'File::RandomAccess')) {
+                $self->{RAF} = $arg;
+                $self->{FILENAME} = '';
+            } else {
+                warn "Don't understand ImageInfo argument $arg\n";
+            }
+        } elsif (defined $self->{FILENAME}) {
+            if ($arg =~ /^-(.*)/) {
+                push @exclude, $1;
+            } else {
+                push @{$self->{REQUESTED_TAGS}}, $arg;
+            }
+        } else {
+            $self->{FILENAME} = $arg;
+        }
+    }
+    # expand shortcuts in tag arguments if provided
+    if (@{$self->{REQUESTED_TAGS}}) {
+        ExpandShortcuts($self->{REQUESTED_TAGS});
+        # initialize lookup for requested tags
+        foreach (@{$self->{REQUESTED_TAGS}}) {
+            $self->{REQ_TAG_LOOKUP}{lc(/.+:(.+)/ ? $1 : $_)} = 1;
+        }
+    }
+
+    if (@exclude or $wasExcludeOpt) {
+        # must add existing excluded tags
+        if ($options->{Exclude}) {
+            if (ref $options->{Exclude} eq 'ARRAY') {
+                push @exclude, @{$options->{Exclude}};
+            } else {
+                push @exclude, $options->{Exclude};
+            }
+        }
+        $options->{Exclude} = \@exclude;
+        # expand shortcuts in new exclude list
+        ExpandShortcuts($options->{Exclude}, 1); # (also remove '#' suffix)
+    }
+}
+
+#------------------------------------------------------------------------------
+# Get list of tags in specified group
+# Inputs: 0) ExifTool ref, 1) group spec, 2) tag key or reference to list of tag keys
+# Returns: list of matching tags in list context, or first match in scalar context
+# Notes: Group spec may contain multiple groups separated by colons, each
+#        possibly with a leading family number
+sub GroupMatches($$$)
+{
+    my ($self, $group, $tagList) = @_;
+    $tagList = [ $tagList ] unless ref $tagList;
+    my ($tag, @matches);
+    if ($group =~ /:/) {
+        # check each group name individually (ie. "Author:1IPTC")
+        my @grps = split ':', lc $group;
+        my (@fmys, $g);
+        for ($g=0; $g<@grps; ++$g) {
+            $fmys[$g] = $1 if $grps[$g] =~ s/^(\d+)//;
+        }
+        foreach $tag (@$tagList) {
+            my @groups = $self->GetGroup($tag, -1);
+            for ($g=0; $g<@grps; ++$g) {
+                my $grp = $grps[$g];
+                next if $grp eq '*' or $grp eq 'all';
+                if (defined $fmys[$g]) {
+                    my $f = $fmys[$g];
+                    last unless $groups[$f] and $grps[$g] eq lc $groups[$f];
+                } else {
+                    last unless grep /^$grps[$g]$/i, @groups;
+                }
+            }
+            push @matches, $tag if $g == @grps;
+        }
+    } else {
+        my $family = ($group =~ s/^(\d+)//) ? $1 : -1;
+        foreach $tag (@$tagList) {
+            my @groups = $self->GetGroup($tag, $family);
+            push @matches, $tag if grep(/^$group$/i, @groups);
+        }
+    }
+    return wantarray ? @matches : $matches[0];
+}
+
+#------------------------------------------------------------------------------
+# Set list of found tags from previously requested tags
+# Inputs: 0) ExifTool object reference
+# Returns: 0) Reference to list of found tag keys (in order of requested tags)
+#          1) Reference to list of indices for tags requested by value
+sub SetFoundTags($)
+{
+    my $self = shift;
+    my $options = $self->{OPTIONS};
+    my $reqTags = $self->{REQUESTED_TAGS} || [ ];
+    my $duplicates = $options->{Duplicates};
+    my $exclude = $options->{Exclude};
+    my $fileOrder = $self->{FILE_ORDER};
+    my @groupOptions = sort grep /^Group/, keys %$options;
+    my $doDups = $duplicates || $exclude || @groupOptions;
+    my ($tag, $rtnTags, @byValue);
+
+    # only return requested tags if specified
+    if (@$reqTags) {
+        $rtnTags or $rtnTags = [ ];
+        # scan through the requested tags and generate a list of tags we found
+        my $tagHash = $self->{VALUE};
+        my $reqTag;
+        foreach $reqTag (@$reqTags) {
+            my (@matches, $group, $allGrp, $allTag, $byValue);
+            if ($reqTag =~ /^(.*):(.+)/) {
+                ($group, $tag) = ($1, $2);
+                if ($group =~ /^(\*|all)$/i) {
+                    $allGrp = 1;
+                } elsif ($group !~ /^[-\w:]*$/) {
+                    $self->Warn("Invalid group name '$group'");
+                    $group = 'invalid';
+                }
+            } else {
+                $tag = $reqTag;
+            }
+            $byValue = 1 if $tag =~ s/#$//;
+            if (defined $tagHash->{$reqTag} and not $doDups) {
+                $matches[0] = $tag;
+            } elsif ($tag =~ /^(\*|all)$/i) {
+                # tag name of '*' or 'all' matches all tags
+                if ($doDups or $allGrp) {
+                    @matches = keys %$tagHash;
+                } else {
+                    @matches = grep(!/ /, keys %$tagHash);
+                }
+                next unless @matches;   # don't want entry in list for '*' tag
+                $allTag = 1;
+            } elsif ($tag =~ /[*?]/) {
+                # allow wildcards in tag names
+                $tag =~ s/\*/[-\\w]*/g;
+                $tag =~ s/\?/[-\\w]/g;
+                $tag .= '( .*)?' if $doDups or $allGrp;
+                @matches = grep(/^$tag$/i, keys %$tagHash);
+                next unless @matches;   # don't want entry in list for wildcard tags
+                $allTag = 1;
+            } elsif ($doDups or defined $group) {
+                # must also look for tags like "Tag (1)"
+                @matches = grep(/^$tag( |$)/i, keys %$tagHash);
+            } elsif ($tag =~ /^[-\w]+$/) {
+                # find first matching value
+                # (use in list context to return value instead of count)
+                ($matches[0]) = grep /^$tag$/i, keys %$tagHash;
+                defined $matches[0] or undef @matches;
+            } else {
+                $self->Warn("Invalid tag name '$tag'");
+            }
+            if (defined $group and not $allGrp) {
+                # keep only specified group
+                @matches = $self->GroupMatches($group, \@matches);
+                next unless @matches or not $allTag;
+            }
+            if (@matches > 1) {
+                # maintain original file order for multiple tags
+                @matches = sort { $$fileOrder{$a} <=> $$fileOrder{$b} } @matches;
+                # return only the highest priority tag unless duplicates wanted
+                unless ($doDups or $allTag or $allGrp) {
+                    $tag = shift @matches;
+                    my $oldPriority = $self->{PRIORITY}{$tag} || 1;
+                    foreach (@matches) {
+                        my $priority = $self->{PRIORITY}{$_};
+                        $priority = 1 unless defined $priority;
+                        next unless $priority >= $oldPriority;
+                        $tag = $_;
+                        $oldPriority = $priority || 1;
+                    }
+                    @matches = ( $tag );
+                }
+            } elsif (not @matches) {
+                # put entry in return list even without value (value is undef)
+                $matches[0] = "$tag (0)";
+                # bogus file order entry to avoid warning if sorting in file order
+                $self->{FILE_ORDER}{$matches[0]} = 999;
+            }
+            # save indices of tags extracted by value
+            push @byValue, scalar(@$rtnTags) .. (scalar(@$rtnTags)+scalar(@matches)-1) if $byValue;
+            push @$rtnTags, @matches;
+        }
+    } else {
+        # no requested tags, so we want all tags
+        my @allTags;
+        if ($doDups) {
+            @allTags = keys %{$self->{VALUE}};
+        } else {
+            foreach (keys %{$self->{VALUE}}) {
+                # only include tag if it doesn't end in a copy number
+                push @allTags, $_ unless / /;
+            }
+        }
+        $rtnTags = \@allTags;
+    }
+
+    # filter excluded tags and group options
+    while (($exclude or @groupOptions) and @$rtnTags) {
+        if ($exclude) {
+            my ($pat, %exclude);
+            foreach $pat (@$exclude) {
+                my $group;
+                if ($pat =~ /^(.*):(.+)/) {
+                    ($group, $tag) = ($1, $2);
+                    if ($group =~ /^(\*|all)$/i) {
+                        undef $group;
+                    } elsif ($group !~ /^[-\w:]*$/) {
+                        $self->Warn("Invalid group name '$group'");
+                        $group = 'invalid';
+                    }
+                } else {
+                    $tag = $pat;
+                }
+                my @matches;
+                if ($tag =~ /^(\*|all)$/i) {
+                    @matches = @$rtnTags;
+                } else {
+                    # allow wildcards in tag names
+                    $tag =~ s/\*/[-\\w]*/g;
+                    $tag =~ s/\?/[-\\w]/g;
+                    @matches = grep(/^$tag( |$)/i, @$rtnTags);
+                }
+                @matches = $self->GroupMatches($group, \@matches) if $group and @matches;
+                $exclude{$_} = 1 foreach @matches;
+            }
+            if (%exclude) {
+                my @filteredTags;
+                $exclude{$_} or push @filteredTags, $_ foreach @$rtnTags;
+                $rtnTags = \@filteredTags;      # use new filtered tag list
+                last unless @filteredTags;      # all done if nothing left
+            }
+            last if $duplicates and not @groupOptions;
+        }
+        # filter groups if requested, or to remove duplicates
+        my (%keepTags, %wantGroup, $family, $groupOpt);
+        my $allGroups = 1;
+        # build hash of requested/excluded group names for each group family
+        my $wantOrder = 0;
+        foreach $groupOpt (@groupOptions) {
+            $groupOpt =~ /^Group(\d*(:\d+)*)/ or next;
+            $family = $1 || 0;
+            $wantGroup{$family} or $wantGroup{$family} = { };
+            my $groupList;
+            if (ref $options->{$groupOpt} eq 'ARRAY') {
+                $groupList = $options->{$groupOpt};
+            } else {
+                $groupList = [ $options->{$groupOpt} ];
+            }
+            foreach (@$groupList) {
+                # groups have priority in order they were specified
+                ++$wantOrder;
+                my ($groupName, $want);
+                if (/^-(.*)/) {
+                    # excluded group begins with '-'
+                    $groupName = $1;
+                    $want = 0;          # we don't want tags in this group
+                } else {
+                    $groupName = $_;
+                    $want = $wantOrder; # we want tags in this group
+                    $allGroups = 0;     # don't want all groups if we requested one
+                }
+                $wantGroup{$family}{$groupName} = $want;
+            }
+        }
+        # loop through all tags and decide which ones we want
+        my (@tags, %bestTag);
+GR_TAG: foreach $tag (@$rtnTags) {
+            my $wantTag = $allGroups;   # want tag by default if want all groups
+            foreach $family (keys %wantGroup) {
+                my $group = $self->GetGroup($tag, $family);
+                my $wanted = $wantGroup{$family}{$group};
+                next unless defined $wanted;
+                next GR_TAG unless $wanted;     # skip tag if group excluded
+                # take lowest non-zero want flag
+                next if $wantTag and $wantTag < $wanted;
+                $wantTag = $wanted;
+            }
+            next unless $wantTag;
+            if ($duplicates) {
+                push @tags, $tag;
+            } else {
+                my $tagName = GetTagName($tag);
+                my $bestTag = $bestTag{$tagName};
+                if (defined $bestTag) {
+                    next if $wantTag > $keepTags{$bestTag};
+                    if ($wantTag == $keepTags{$bestTag}) {
+                        # want two tags with the same name -- keep the latest one
+                        if ($tag =~ / \((\d+)\)$/) {
+                            my $tagNum = $1;
+                            next if $bestTag !~ / \((\d+)\)$/ or $1 > $tagNum;
+                        }
+                    }
+                    # this tag is better, so delete old best tag
+                    delete $keepTags{$bestTag};
+                }
+                $keepTags{$tag} = $wantTag;    # keep this tag (for now...)
+                $bestTag{$tagName} = $tag;      # this is our current best tag
+            }
+        }
+        unless ($duplicates) {
+            # construct new tag list with no duplicates, preserving order
+            foreach $tag (@$rtnTags) {
+                push @tags, $tag if $keepTags{$tag};
+            }
+        }
+        $rtnTags = \@tags;
+        last;
+    }
+    $self->{FOUND_TAGS} = $rtnTags;     # save found tags 
+
+    # return reference to found tag keys (and list of indices of tags to extract by value)
+    return wantarray ? ($rtnTags, \@byValue) : $rtnTags;
+}
+
+#------------------------------------------------------------------------------
+# Utility to load our write routines if required (called via AUTOLOAD)
+# Inputs: 0) autoload function, 1-N) function arguments
+# Returns: result of function or dies if function not available
+# To Do: Generalize this routine so it works on systems that don't use '/'
+#        as a path name separator.
+sub DoAutoLoad(@)
+{
+    my $autoload = shift;
+    my @callInfo = split(/::/, $autoload);
+    my $file = 'Image/ExifTool/Write';
+
+    return if $callInfo[$#callInfo] eq 'DESTROY';
+    if (@callInfo == 4) {
+        # load Image/ExifTool/WriteMODULE.pl
+        $file .= "$callInfo[2].pl";
+    } else {
+        # load Image/ExifTool/Writer.pl
+        $file .= 'r.pl';
+    }
+    # attempt to load the package
+    eval "require '$file'" or die "Error while attempting to call $autoload\n$@\n";
+    unless (defined &$autoload) {
+        my @caller = caller(0);
+        # reproduce Perl's standard 'undefined subroutine' message:
+        die "Undefined subroutine $autoload called at $caller[1] line $caller[2]\n";
+    }
+    no strict 'refs';
+    return &$autoload(@_);     # call the function
+}
+
+#------------------------------------------------------------------------------
+# AutoLoad our writer routines when necessary
+#
+sub AUTOLOAD
+{
+    return DoAutoLoad($AUTOLOAD, @_);
+}
+
+#------------------------------------------------------------------------------
+# Add warning tag
+# Inputs: 0) ExifTool object reference, 1) warning message, 2) true if minor
+# Returns: true if warning tag was added
+sub Warn($$;$)
+{
+    my ($self, $str, $ignorable) = @_;
+    if ($ignorable) {
+        return 0 if $self->{OPTIONS}{IgnoreMinorErrors};
+        $str = "[minor] $str";
+    }
+    $self->FoundTag('Warning', $str);
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Add warning tag only once per processed file
+# Inputs: 0) ExifTool object reference, 1) warning message, 2) true if minor
+# Returns: true if warning tag was added
+sub WarnOnce($$;$)
+{
+    my ($self, $str, $ignorable) = @_;
+    return 0 if $ignorable and $self->{OPTIONS}{IgnoreMinorErrors};
+    unless ($$self{WARNED_ONCE}{$str}) {
+        $self->Warn($str, $ignorable);
+        $$self{WARNED_ONCE}{$str} = 1;
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Add error tag
+# Inputs: 0) ExifTool object reference, 1) error message, 2) true if minor
+# Returns: true if error tag was added, otherwise warning was added
+sub Error($$;$)
+{
+    my ($self, $str, $ignorable) = @_;
+    if ($ignorable) {
+        if ($self->{OPTIONS}{IgnoreMinorErrors}) {
+            $self->Warn($str);
+            return 0;
+        }
+        $str = "[minor] $str";
+    }
+    $self->FoundTag('Error', $str);
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Expand shortcuts
+# Inputs: 0) reference to list of tags, 1) set to remove trailing '#'
+# Notes: Handles leading '-' for excluded tags, trailing '#' for ValueConv,
+#        multiple group names, and redirected tags
+sub ExpandShortcuts($;$)
+{
+    my ($tagList, $removeSuffix) = @_;
+    return unless $tagList and @$tagList;
+
+    require Image::ExifTool::Shortcuts;
+
+    # expand shortcuts
+    my $suffix = $removeSuffix ? '' : '#';
+    my @expandedTags;
+    my ($entry, $tag, $excl);
+    foreach $entry (@$tagList) {
+        # skip things like options hash references in list
+        if (ref $entry) {
+            push @expandedTags, $entry;
+            next;
+        }
+        # remove leading '-'
+        ($excl, $tag) = $entry =~ /^(-?)(.*)/s;
+        my ($post, @post, $pre, $v);
+        # handle redirection
+        if (not $excl and $tag =~ /(.+?)([-+]?[<>].+)/s) {
+            ($tag, $post) = ($1, $2);
+            if ($post =~ /^[-+]?>/ or $post !~ /\$/) {
+                # expand shortcuts in postfix (rhs of redirection)
+                my ($op, $p2, $t2) = ($post =~ /([-+]?[<>])(.+:)?(.+)/);
+                $p2 = '' unless defined $p2;
+                $v = ($t2 =~ s/#$//) ? $suffix : ''; # ValueConv suffix
+                my ($match) = grep /^\Q$t2\E$/i, keys %Image::ExifTool::Shortcuts::Main;
+                if ($match) {
+                    foreach (@{$Image::ExifTool::Shortcuts::Main{$match}}) {
+                        /^-/ and next;  # ignore excluded tags
+                        if ($p2 and /(.+:)(.+)/) {
+                            push @post, "$op$_$v";
+                        } else {
+                            push @post, "$op$p2$_$v";
+                        }
+                    }
+                    next unless @post;
+                    $post = shift @post;
+                }
+            }
+        } else {
+            $post = '';
+        }
+        # handle group names
+        if ($tag =~ /(.+:)(.+)/) {
+            ($pre, $tag) = ($1, $2);
+        } else {
+            $pre = '';
+        }
+        $v = ($tag =~ s/#$//) ? $suffix : '';   # ValueConv suffix
+        # loop over all postfixes
+        for (;;) {
+            # expand the tag name
+            my ($match) = grep /^\Q$tag\E$/i, keys %Image::ExifTool::Shortcuts::Main;
+            if ($match) {
+                if ($excl) {
+                    # entry starts with '-', so exclude all tags in this shortcut
+                    foreach (@{$Image::ExifTool::Shortcuts::Main{$match}}) {
+                        /^-/ and next;  # ignore excluded exclude tags
+                        # group of expanded tag takes precedence
+                        if ($pre and /(.+:)(.+)/) {
+                            push @expandedTags, "$excl$_";
+                        } else {
+                            push @expandedTags, "$excl$pre$_";
+                        }
+                    }
+                } elsif (length $pre or length $post or $v) {
+                    foreach (@{$Image::ExifTool::Shortcuts::Main{$match}}) {
+                        /(-?)(.+:)?(.+)/;
+                        if ($2) {
+                            # group from expanded tag takes precedence
+                            push @expandedTags, "$_$v$post";
+                        } else {
+                            push @expandedTags, "$1$pre$3$v$post";
+                        }
+                    }
+                } else {
+                    push @expandedTags, @{$Image::ExifTool::Shortcuts::Main{$match}};
+                }
+            } else {
+                push @expandedTags, "$excl$pre$tag$v$post";
+            }
+            last unless @post;
+            $post = shift @post;
+        }
+    }
+    @$tagList = @expandedTags;
+}
+
+#------------------------------------------------------------------------------
+# Add hash of Composite tags to our composites
+# Inputs: 0) hash reference to table of Composite tags to add or module name,
+#         1) overwrite existing tag
+sub AddCompositeTags($;$)
+{
+    local $_;
+    my ($add, $overwrite) = @_;
+    my $module;
+    unless (ref $add) {
+        $module = $add;
+        $add .= '::Composite';
+        no strict 'refs';
+        $add = \%$add;
+    }
+    my $defaultGroups = $$add{GROUPS};
+
+    # make sure default groups are defined in families 0 and 1
+    if ($defaultGroups) {
+        $defaultGroups->{0} or $defaultGroups->{0} = 'Composite';
+        $defaultGroups->{1} or $defaultGroups->{1} = 'Composite';
+        $defaultGroups->{2} or $defaultGroups->{2} = 'Other';
+    } else {
+        $defaultGroups = $$add{GROUPS} = { 0 => 'Composite', 1 => 'Composite', 2 => 'Other' };
+    }
+    SetupTagTable($add);    # generate tag Name, etc
+    my $tagID;
+    foreach $tagID (sort keys %$add) {
+        next if $specialTags{$tagID};   # must skip special tags
+        my $tagInfo = $$add{$tagID};
+        # tagID's MUST be the exact tag name for logic in BuildCompositeTags()
+        my $tag = $$tagInfo{Name};
+        $$tagInfo{Module} = $module if $$tagInfo{Writable};
+        # allow Composite tags with the same name
+        my ($t, $n, $type);
+        while ($Image::ExifTool::Composite{$tag} and not $overwrite) {
+            $n ? $n += 1 : ($n = 2, $t = $tag);
+            $tag = "${t}_$n";
+            $$tagInfo{NewTagID} = $tag; # save new ID so we can use it in TagLookup
+        }
+        # convert scalar Require/Desire entries
+        foreach $type ('Require','Desire') {
+            my $req = $$tagInfo{$type} or next;
+            $$tagInfo{$type} = { 0 => $req } if ref($req) ne 'HASH';
+        }
+        # add this Composite tag to our main Composite table
+        $$tagInfo{Table} = \%Image::ExifTool::Composite;
+        # (use the original TagID, even if we changed it)
+        # $$tagInfo{TagID} = $tag;
+        # save new tag ID so we can find entry in Composite table
+        $Image::ExifTool::Composite{$tag} = $tagInfo;
+        # set all default groups in tag
+        my $groups = $$tagInfo{Groups};
+        $groups or $groups = $$tagInfo{Groups} = { };
+        # fill in default groups
+        foreach (keys %$defaultGroups) {
+            $$groups{$_} or $$groups{$_} = $$defaultGroups{$_};
+        }
+        # set flag indicating group list was built
+        $$tagInfo{GotGroups} = 1;
+    }
+}
+
+#------------------------------------------------------------------------------
+# Add tags to TagLookup (used for writing)
+# Inputs: 0) source hash of tag definitions, 1) name of destination tag table
+sub AddTagsToLookup($$)
+{
+    my ($tagHash, $table) = @_;
+    if (defined &Image::ExifTool::TagLookup::AddTags) {
+        Image::ExifTool::TagLookup::AddTags($tagHash, $table);
+    } elsif (not $Image::ExifTool::pluginTags{$tagHash}) {
+        # queue these tags until TagLookup is loaded
+        push @Image::ExifTool::pluginTags, [ $tagHash, $table ];
+        # set flag so we don't load same tags twice
+        $Image::ExifTool::pluginTags{$tagHash} = 1;
+    }
+}
+
+#------------------------------------------------------------------------------
+# Expand tagInfo Flags
+# Inputs: 0) tagInfo hash ref
+# Notes: $$tagInfo{Flags} must be defined to call this routine
+sub ExpandFlags($)
+{
+    my $tagInfo = shift;
+    my $flags = $$tagInfo{Flags};
+    if (ref $flags eq 'ARRAY') {
+        foreach (@$flags) {
+            $$tagInfo{$_} = 1;
+        }
+    } elsif (ref $flags eq 'HASH') {
+        my $key;
+        foreach $key (keys %$flags) {
+            $$tagInfo{$key} = $$flags{$key};
+        }
+    } else {
+        $$tagInfo{$flags} = 1;
+    }
+}
+
+#------------------------------------------------------------------------------
+# Set up tag table (must be done once for each tag table used)
+# Inputs: 0) Reference to tag table
+# Notes: - generates 'Name' field from key if it doesn't exist
+#        - stores 'Table' pointer and 'TagID' value
+#        - expands 'Flags' for quick lookup
+sub SetupTagTable($)
+{
+    my $tagTablePtr = shift;
+    my ($tagID, $tagInfo);
+    foreach $tagID (TagTableKeys($tagTablePtr)) {
+        my @infoArray = GetTagInfoList($tagTablePtr,$tagID);
+        # process conditional tagInfo arrays
+        foreach $tagInfo (@infoArray) {
+            $$tagInfo{Table} = $tagTablePtr;
+            $$tagInfo{TagID} = $tagID;
+            my $tag = $$tagInfo{Name};
+            unless (defined $tag) {
+                # generate name equal to tag ID if 'Name' doesn't exist
+                $tag = $tagID;
+                $$tagInfo{Name} = ucfirst($tag); # make first char uppercase
+            }
+            $$tagInfo{Flags} and ExpandFlags($tagInfo);
+        }
+        next unless @infoArray > 1;
+        # add an "Index" member to each tagInfo in a list
+        my $index = 0;
+        foreach $tagInfo (@infoArray) {
+            $$tagInfo{Index} = $index++;
+        }
+    }
+}
+
+#------------------------------------------------------------------------------
+# Utilities to check for numerical types
+# Inputs: 0) value;  Returns: true if value is a numerical type
+# Notes: May change commas to decimals in floats for use in other locales
+sub IsFloat($) {
+    return 1 if $_[0] =~ /^[+-]?(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/;
+    # allow comma separators (for other locales)
+    return 0 unless $_[0] =~ /^[+-]?(?=\d|,\d)\d*(,\d*)?([Ee]([+-]?\d+))?$/;
+    $_[0] =~ tr/,/./;   # but translate ',' to '.'
+    return 1;
+}
+sub IsInt($)      { return scalar($_[0] =~ /^[+-]?\d+$/); }
+sub IsHex($)      { return scalar($_[0] =~ /^(0x)?[0-9a-f]{1,8}$/i); }
+sub IsRational($) { return scalar($_[0] =~ m{^[-+]?\d+/\d+$}); }
+
+# round floating point value to specified number of significant digits
+# Inputs: 0) value, 1) number of sig digits;  Returns: rounded number
+sub RoundFloat($$)
+{
+    my ($val, $sig) = @_;
+    $val == 0 and return 0;
+    my $sign = $val < 0 ? ($val=-$val, -1) : 1;
+    my $log = log($val) / log(10);
+    my $exp = int($log) - $sig + ($log > 0 ? 1 : 0);
+    return $sign * int(10 ** ($log - $exp) + 0.5) * 10 ** $exp;
+}
+
+# Convert strings to floating point numbers (or undef)
+# Inputs: 0-N) list of strings (may be undef)
+# Returns: last value converted
+sub ToFloat(@)
+{
+    local $_;
+    foreach (@_) {
+        next unless defined $_;
+        # (add 0 to convert "0.0" to "0" for tests)
+        $_ = /((?:[+-]?)(?=\d|\.\d)\d*(?:\.\d*)?(?:[Ee](?:[+-]?\d+))?)/ ? $1 + 0 : undef;
+    }
+    return $_[-1];
+}
+
+#------------------------------------------------------------------------------
+# Utility routines to for reading binary data values from file
+
+my %unpackMotorola = ( S => 'n', L => 'N', C => 'C', c => 'c' );
+my %unpackIntel    = ( S => 'v', L => 'V', C => 'C', c => 'c' );
+my %unpackRev = ( N => 'V', V => 'N', C => 'C', n => 'v', v => 'n', c => 'c' );
+
+# the following 4 variables are defined in 'use vars' instead of using 'my'
+# because mod_perl 5.6.1 apparently has a problem with setting file-scope 'my'
+# variables from within subroutines (ref communication with Pavel Merdin):
+# $swapBytes - set if EXIF header is not native byte ordering
+# $swapWords - swap 32-bit words in doubles (ARM quirk)
+$currentByteOrder = 'MM'; # current byte ordering ('II' or 'MM')
+%unpackStd = %unpackMotorola;
+
+# Swap bytes in data if necessary
+# Inputs: 0) data, 1) number of bytes
+# Returns: swapped data
+sub SwapBytes($$)
+{
+    return $_[0] unless $swapBytes;
+    my ($val, $bytes) = @_;
+    my $newVal = '';
+    $newVal .= substr($val, $bytes, 1) while $bytes--;
+    return $newVal;
+}
+# Swap words.  Inputs: 8 bytes of data, Returns: swapped data
+sub SwapWords($)
+{
+    return $_[0] unless $swapWords and length($_[0]) == 8;
+    return substr($_[0],4,4) . substr($_[0],0,4)
+}
+
+# Unpack value, letting unpack() handle byte swapping
+# Inputs: 0) unpack template, 1) data reference, 2) offset
+# Returns: unpacked number
+# - uses value of %unpackStd to determine the unpack template
+# - can only be called for 'S' or 'L' templates since these are the only
+#   templates for which you can specify the byte ordering.
+sub DoUnpackStd(@)
+{
+    $_[2] and return unpack("x$_[2] $unpackStd{$_[0]}", ${$_[1]});
+    return unpack($unpackStd{$_[0]}, ${$_[1]});
+}
+# same, but with reversed byte order
+sub DoUnpackRev(@)
+{
+    my $fmt = $unpackRev{$unpackStd{$_[0]}};
+    $_[2] and return unpack("x$_[2] $fmt", ${$_[1]});
+    return unpack($fmt, ${$_[1]});
+}
+# Pack value
+# Inputs: 0) template, 1) value, 2) data ref (or undef), 3) offset (if data ref)
+# Returns: packed value
+sub DoPackStd(@)
+{
+    my $val = pack($unpackStd{$_[0]}, $_[1]);
+    $_[2] and substr(${$_[2]}, $_[3], length($val)) = $val;
+    return $val;
+}
+# same, but with reversed byte order
+sub DoPackRev(@)
+{
+    my $val = pack($unpackRev{$unpackStd{$_[0]}}, $_[1]);
+    $_[2] and substr(${$_[2]}, $_[3], length($val)) = $val;
+    return $val;
+}
+
+# Unpack value, handling the byte swapping manually
+# Inputs: 0) # bytes, 1) unpack template, 2) data reference, 3) offset
+# Returns: unpacked number
+# - uses value of $swapBytes to determine byte ordering
+sub DoUnpack(@)
+{
+    my ($bytes, $template, $dataPt, $pos) = @_;
+    my $val;
+    if ($swapBytes) {
+        $val = '';
+        $val .= substr($$dataPt,$pos+$bytes,1) while $bytes--;
+    } else {
+        $val = substr($$dataPt,$pos,$bytes);
+    }
+    defined($val) or return undef;
+    return unpack($template,$val);
+}
+
+# Unpack double value
+# Inputs: 0) unpack template, 1) data reference, 2) offset
+# Returns: unpacked number
+sub DoUnpackDbl(@)
+{
+    my ($template, $dataPt, $pos) = @_;
+    my $val = substr($$dataPt,$pos,8);
+    defined($val) or return undef;
+    # swap bytes and 32-bit words (ARM quirk) if necessary, then unpack value
+    return unpack($template, SwapWords(SwapBytes($val, 8)));
+}
+
+# Inputs: 0) data reference, 1) offset into data
+sub Get8s($$)     { return DoUnpackStd('c', @_); }
+sub Get8u($$)     { return DoUnpackStd('C', @_); }
+sub Get16s($$)    { return DoUnpack(2, 's', @_); }
+sub Get16u($$)    { return DoUnpackStd('S', @_); }
+sub Get32s($$)    { return DoUnpack(4, 'l', @_); }
+sub Get32u($$)    { return DoUnpackStd('L', @_); }
+sub GetFloat($$)  { return DoUnpack(4, 'f', @_); }
+sub GetDouble($$) { return DoUnpackDbl('d', @_); }
+sub Get16uRev($$) { return DoUnpackRev('S', @_); }
+
+# rationals may be a floating point number, 'inf' or 'undef'
+sub GetRational32s($$)
+{
+    my ($dataPt, $pos) = @_;
+    my $numer = Get16s($dataPt,$pos);
+    my $denom = Get16s($dataPt, $pos + 2) or return $numer ? 'inf' : 'undef';
+    # round off to a reasonable number of significant figures
+    return RoundFloat($numer / $denom, 7);
+}
+sub GetRational32u($$)
+{
+    my ($dataPt, $pos) = @_;
+    my $numer = Get16u($dataPt,$pos);
+    my $denom = Get16u($dataPt, $pos + 2) or return $numer ? 'inf' : 'undef';
+    return RoundFloat($numer / $denom, 7);
+}
+sub GetRational64s($$)
+{
+    my ($dataPt, $pos) = @_;
+    my $numer = Get32s($dataPt,$pos);
+    my $denom = Get32s($dataPt, $pos + 4) or return $numer ? 'inf' : 'undef';
+    return RoundFloat($numer / $denom, 10);
+}
+sub GetRational64u($$)
+{
+    my ($dataPt, $pos) = @_;
+    my $numer = Get32u($dataPt,$pos);
+    my $denom = Get32u($dataPt, $pos + 4) or return $numer ? 'inf' : 'undef';
+    return RoundFloat($numer / $denom, 10);
+}
+sub GetFixed16s($$)
+{
+    my ($dataPt, $pos) = @_;
+    my $val = Get16s($dataPt, $pos) / 0x100;
+    return int($val * 1000 + ($val<0 ? -0.5 : 0.5)) / 1000;
+}
+sub GetFixed16u($$)
+{
+    my ($dataPt, $pos) = @_;
+    return int((Get16u($dataPt, $pos) / 0x100) * 1000 + 0.5) / 1000;
+}
+sub GetFixed32s($$)
+{
+    my ($dataPt, $pos) = @_;
+    my $val = Get32s($dataPt, $pos) / 0x10000;
+    # remove insignificant digits
+    return int($val * 1e5 + ($val>0 ? 0.5 : -0.5)) / 1e5;
+}
+sub GetFixed32u($$)
+{
+    my ($dataPt, $pos) = @_;
+    # remove insignificant digits
+    return int((Get32u($dataPt, $pos) / 0x10000) * 1e5 + 0.5) / 1e5;
+}
+# Inputs: 0) value, 1) data ref, 2) offset
+sub Set8s(@)  { return DoPackStd('c', @_); }
+sub Set8u(@)  { return DoPackStd('C', @_); }
+sub Set16u(@) { return DoPackStd('S', @_); }
+sub Set32u(@) { return DoPackStd('L', @_); }
+sub Set16uRev(@) { return DoPackRev('S', @_); }
+
+#------------------------------------------------------------------------------
+# Get current byte order ('II' or 'MM')
+sub GetByteOrder() { return $currentByteOrder; }
+
+#------------------------------------------------------------------------------
+# Set byte ordering
+# Inputs: 0) 'MM'=motorola, 'II'=intel (will translate 'BigEndian', 'LittleEndian')
+# Returns: 1 on success
+sub SetByteOrder($)
+{
+    my $order = shift;
+
+    if ($order eq 'MM') {       # big endian (Motorola)
+        %unpackStd = %unpackMotorola;
+    } elsif ($order eq 'II') {  # little endian (Intel)
+        %unpackStd = %unpackIntel;
+    } elsif ($order =~ /^Big/i) {
+        $order = 'MM';
+        %unpackStd = %unpackMotorola;
+    } elsif ($order =~ /^Little/i) {
+        $order = 'II';
+        %unpackStd = %unpackIntel;
+    } else {
+        return 0;
+    }
+    my $val = unpack('S','A ');
+    my $nativeOrder;
+    if ($val == 0x4120) {       # big endian
+        $nativeOrder = 'MM';
+    } elsif ($val == 0x2041) {  # little endian
+        $nativeOrder = 'II';
+    } else {
+        warn sprintf("Unknown native byte order! (pattern %x)\n",$val);
+        return 0;
+    }
+    $currentByteOrder = $order;  # save current byte order
+
+    # swap bytes if our native CPU byte ordering is not the same as the EXIF
+    $swapBytes = ($order ne $nativeOrder);
+
+    # little-endian ARM has big-endian words for doubles (thanks Riku Voipio)
+    # (Note: Riku's patch checked for '0ff3', but I think it should be 'f03f' since
+    # 1 is '000000000000f03f' on an x86 -- so check for both, but which is correct?)
+    my $pack1d = pack('d', 1);
+    $swapWords = ($pack1d eq "\0\0\x0f\xf3\0\0\0\0" or
+                  $pack1d eq "\0\0\xf0\x3f\0\0\0\0");
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Change byte order
+sub ToggleByteOrder()
+{
+    SetByteOrder(GetByteOrder() eq 'II' ? 'MM' : 'II');
+}
+
+#------------------------------------------------------------------------------
+# hash lookups for reading values from data
+my %formatSize = (
+    int8s => 1,
+    int8u => 1,
+    int16s => 2,
+    int16u => 2,
+    int16uRev => 2,
+    int32s => 4,
+    int32u => 4,
+    int64s => 8,
+    int64u => 8,
+    rational32s => 4,
+    rational32u => 4,
+    rational64s => 8,
+    rational64u => 8,
+    fixed16s => 2,
+    fixed16u => 2,
+    fixed32s => 4,
+    fixed32u => 4,
+    float => 4,
+    double => 8,
+    extended => 10,
+    unicode => 2,
+    complex => 8,
+    string => 1,
+    binary => 1,
+   'undef' => 1,
+    ifd => 4,
+    ifd64 => 8,
+);
+my %readValueProc = (
+    int8s => \&Get8s,
+    int8u => \&Get8u,
+    int16s => \&Get16s,
+    int16u => \&Get16u,
+    int16uRev => \&Get16uRev,
+    int32s => \&Get32s,
+    int32u => \&Get32u,
+    int64s => \&Get64s,
+    int64u => \&Get64u,
+    rational32s => \&GetRational32s,
+    rational32u => \&GetRational32u,
+    rational64s => \&GetRational64s,
+    rational64u => \&GetRational64u,
+    fixed16s => \&GetFixed16s,
+    fixed16u => \&GetFixed16u,
+    fixed32s => \&GetFixed32s,
+    fixed32u => \&GetFixed32u,
+    float => \&GetFloat,
+    double => \&GetDouble,
+    extended => \&GetExtended,
+    ifd => \&Get32u,
+    ifd64 => \&Get64u,
+);
+sub FormatSize($) { return $formatSize{$_[0]}; }
+
+#------------------------------------------------------------------------------
+# Read value from binary data (with current byte ordering)
+# Inputs: 0) data reference, 1) value offset, 2) format string,
+#         3) number of values (or undef to use all data)
+#         4) valid data length relative to offset
+# Returns: converted value, or undefined if data isn't there
+#          or list of values in list context
+sub ReadValue($$$$$)
+{
+    my ($dataPt, $offset, $format, $count, $size) = @_;
+
+    my $len = $formatSize{$format};
+    unless ($len) {
+        warn "Unknown format $format";
+        $len = 1;
+    }
+    unless ($count) {
+        return '' if defined $count or $size < $len;
+        $count = int($size / $len);
+    }
+    # make sure entry is inside data
+    if ($len * $count > $size) {
+        $count = int($size / $len);     # shorten count if necessary
+        $count < 1 and return undef;    # return undefined if no data
+    }
+    my @vals;
+    my $proc = $readValueProc{$format};
+    if ($proc) {
+        for (;;) {
+            push @vals, &$proc($dataPt, $offset);
+            last if --$count <= 0;
+            $offset += $len;
+        }
+    } else {
+        # handle undef/binary/string (also unsupported unicode/complex)
+        $vals[0] = substr($$dataPt, $offset, $count * $len);
+        # truncate string at null terminator if necessary
+        $vals[0] =~ s/\0.*//s if $format eq 'string';
+    }
+    return @vals if wantarray;
+    return join(' ', @vals) if @vals > 1;
+    return $vals[0];
+}
+
+#------------------------------------------------------------------------------
+# Decode string with specified encoding
+# Inputs: 0) ExifTool object ref, 1) string to decode
+#         2) source character set name (undef for current Charset)
+#         3) optional source byte order (2-byte and 4-byte fixed-width sets only)
+#         4) optional destination character set (defaults to Charset setting)
+#         5) optional destination byte order (2-byte and 4-byte fixed-width only)
+# Returns: string in destination encoding
+# Note: ExifTool ref may be undef if character both character sets are provided
+#       (but in this case no warnings will be issued)
+sub Decode($$$;$$$)
+{
+    my ($self, $val, $from, $fromOrder, $to, $toOrder) = @_;
+    $from or $from = $$self{OPTIONS}{Charset};
+    $to or $to = $$self{OPTIONS}{Charset};
+    if ($from ne $to and length $val) {
+        require Image::ExifTool::Charset;
+        my $cs1 = $Image::ExifTool::Charset::csType{$from};
+        my $cs2 = $Image::ExifTool::Charset::csType{$to};
+        if ($cs1 and $cs2 and not $cs2 & 0x002) {
+            # treat as straight ASCII if no character will need remapping
+            if (($cs1 | $cs2) & 0x680 or $val =~ /[\x80-\xff]/) {
+                my $uni = Image::ExifTool::Charset::Decompose($self, $val, $from, $fromOrder);
+                $val = Image::ExifTool::Charset::Recompose($self, $uni, $to, $toOrder);
+            }
+        } elsif ($self) {
+            my $set = $cs1 ? $to : $from;
+            unless ($$self{"DecodeWarn$set"}) {
+                $self->Warn("Unsupported character set ($set)");
+                $$self{"DecodeWarn$set"} = 1;
+            }
+        }
+    }
+    return $val;
+}
+
+#------------------------------------------------------------------------------
+# Encode string with specified encoding
+# Inputs: 0) ExifTool object ref, 1) string, 2) destination character set name,
+#         3) optional destination byte order (2-byte and 4-byte fixed-width sets only)
+# Returns: string in specified encoding
+sub Encode($$$;$)
+{
+    my ($self, $val, $to, $toOrder) = @_;
+    return $self->Decode($val, undef, undef, $to, $toOrder);
+}
+
+#------------------------------------------------------------------------------
+# Decode bit mask
+# Inputs: 0) value to decode, 1) Reference to hash for decoding (or undef)
+#         2) optional bits per word (defaults to 32)
+sub DecodeBits($$;$)
+{
+    my ($vals, $lookup, $bits) = @_;
+    $bits or $bits = 32;
+    my ($val, $i, @bitList);
+    my $num = 0;
+    foreach $val (split ' ', $vals) {
+        for ($i=0; $i<$bits; ++$i) {
+            next unless $val & (1 << $i);
+            my $n = $i + $num;
+            if (not $lookup) {
+                push @bitList, $n;
+            } elsif ($$lookup{$n}) {
+                push @bitList, $$lookup{$n};
+            } else {
+                push @bitList, "[$n]";
+            }
+        }
+        $num += $bits;
+    }
+    return '(none)' unless @bitList;
+    return join($lookup ? ', ' : ',', @bitList);
+}
+
+#------------------------------------------------------------------------------
+# Validate an extracted image and repair if necessary
+# Inputs: 0) ExifTool object reference, 1) image reference, 2) tag name or key
+# Returns: image reference or undef if it wasn't valid
+# Note: should be called from RawConv, not ValueConv
+sub ValidateImage($$$)
+{
+    my ($self, $imagePt, $tag) = @_;
+    return undef if $$imagePt eq 'none';
+    unless ($$imagePt =~ /^(Binary data|\xff\xd8\xff)/ or
+            # the first byte of the preview of some Minolta cameras is wrong,
+            # so check for this and set it back to 0xff if necessary
+            $$imagePt =~ s/^.(\xd8\xff\xdb)/\xff$1/s or
+            $self->Options('IgnoreMinorErrors'))
+    {
+        # issue warning only if the tag was specifically requested
+        if ($self->{REQ_TAG_LOOKUP}{lc GetTagName($tag)}) {
+            $self->Warn("$tag is not a valid JPEG image",1);
+            return undef;
+        }
+    }
+    return $imagePt;
+}
+
+#------------------------------------------------------------------------------
+# Make description from a tag name
+# Inputs: 0) tag name 1) optional tagID to add at end of description
+# Returns: description
+sub MakeDescription($;$)
+{
+    my ($tag, $tagID) = @_;
+    # start with the tag name and force first letter to be upper case
+    my $desc = ucfirst($tag);
+    # translate underlines to spaces
+    $desc =~ tr/_/ /;
+    # remove hex TagID from name (to avoid inserting spaces in the number)
+    $desc =~ s/ (0x[\da-f]+)$//i and $tagID = $1 unless defined $tagID;
+    # put a space between lower/UPPER case and lower/number combinations
+    $desc =~ s/([a-z])([A-Z\d])/$1 $2/g;
+    # put a space between acronyms and words
+    $desc =~ s/([A-Z])([A-Z][a-z])/$1 $2/g;
+    # put spaces after numbers (if more than one character following number)
+    $desc =~ s/(\d)([A-Z]\S)/$1 $2/g;
+    # add TagID to description
+    $desc .= ' ' . $tagID if defined $tagID;
+    return $desc;
+}
+
+#------------------------------------------------------------------------------
+# Return printable value
+# Inputs: 0) ExifTool object reference
+#         1) value to print, 2) line length limit (undef defaults to 60, 0=unlimited)
+sub Printable($;$)
+{
+    my ($self, $outStr, $maxLen) = @_;
+    return '(undef)' unless defined $outStr;
+    $outStr =~ tr/\x01-\x1f\x7f-\xff/./;
+    $outStr =~ s/\x00//g;
+    if (defined $maxLen) {
+        # minimum length is 20 (0 is unlimited)
+        $maxLen = 20 if $maxLen and $maxLen < 20;
+    } else {
+        $maxLen = 60;                   # default length is 60
+    }
+    # limit length only if verbose < 4
+    if ($maxLen and length($outStr) > $maxLen and $self->{OPTIONS}{Verbose} < 4) {
+        $outStr = substr($outStr,0,$maxLen-6) . '[snip]';
+    }
+    return $outStr;
+}
+
+#------------------------------------------------------------------------------
+# Convert date/time from Exif format
+# Inputs: 0) ExifTool object reference, 1) Date/time in EXIF format
+# Returns: Formatted date/time string
+sub ConvertDateTime($$)
+{
+    my ($self, $date) = @_;
+    my $dateFormat = $self->{OPTIONS}{DateFormat};
+    # only convert date if a format was specified and the date is recognizable
+    if ($dateFormat) {
+        # a few cameras use incorrect date/time formatting:
+        # - slashes instead of colons in date (RolleiD330, ImpressCam)
+        # - date/time values separated by colon instead of space (Polariod, Sanyo, Sharp, Vivitar)
+        # - single-digit seconds with leading space (HP scanners)
+        $date =~ s/[-+]\d{2}:\d{2}$//;  # remove timezone if it exists
+        my @a = ($date =~ /\d+/g);      # be very flexible about date/time format
+        if (@a and $a[0] > 1900 and $a[0] < 3000 and eval 'require POSIX') {
+            $date = POSIX::strftime($dateFormat, $a[5]||0, $a[4]||0, $a[3]||0,
+                                                 $a[2]||1, ($a[1]||1)-1, $a[0]-1900);
+        } elsif ($self->{OPTIONS}{StrictDate}) {
+            undef $date;
+        }
+    }
+    return $date;
+}
+
+#------------------------------------------------------------------------------
+# Print conversion for time span value
+# Inputs: 0) time ticks, 1) number of seconds per tick (default 1)
+# Returns: readable time
+sub ConvertTimeSpan($;$)
+{
+    my ($val, $mult) = @_;
+    if (Image::ExifTool::IsFloat($val) and $val != 0) {
+        $val *= $mult if $mult;
+        if ($val < 60) {
+            $val = "$val seconds";
+        } elsif ($val < 3600) {
+            my $fmt = ($mult and $mult >= 60) ? '%d' : '%.1f';
+            my $s = ($val == 60 and $mult) ? '' : 's';
+            $val = sprintf("$fmt minute$s", $val / 60);
+        } elsif ($val < 24 * 3600) {
+            $val = sprintf("%.1f hours", $val / 3600);
+        } else {
+            $val = sprintf("%.1f days", $val / (24 * 3600));
+        }
+    }
+    return $val;
+}
+
+#------------------------------------------------------------------------------
+# Patched timelocal() that fixes ActivePerl timezone bug
+# Inputs/Returns: same as timelocal()
+# Notes: must 'require Time::Local' before calling this routine
+sub TimeLocal(@)
+{
+    my $tm = Time::Local::timelocal(@_);
+    if ($^O eq 'MSWin32') {
+        # patch for ActivePerl timezone bug
+        my @t2 = localtime($tm);
+        my $t2 = Time::Local::timelocal(@t2);
+        # adjust timelocal() return value to be consistent with localtime()
+        $tm += $tm - $t2;
+    }
+    return $tm;
+}
+
+#------------------------------------------------------------------------------
+# Get time zone in minutes
+# Inputs: 0) localtime array ref, 1) gmtime array ref
+# Returns: time zone offset in minutes
+sub GetTimeZone(;$$)
+{
+    my ($tm, $gm) = @_;
+    # compute the number of minutes between localtime and gmtime
+    my $min = $$tm[2] * 60 + $$tm[1] - ($$gm[2] * 60 + $$gm[1]);
+    if ($$tm[3] != $$gm[3]) {
+        # account for case where one date wraps to the first of the next month
+        $$gm[3] = $$tm[3] - ($$tm[3]==1 ? 1 : -1) if abs($$tm[3]-$$gm[3]) != 1;
+        # adjust for the +/- one day difference
+        $min += ($$tm[3] - $$gm[3]) * 24 * 60;
+    }
+    return $min;
+}
+
+#------------------------------------------------------------------------------
+# Get time zone string
+# Inputs: 0) time zone offset in minutes
+#     or  0) localtime array ref, 1) corresponding time value
+# Returns: time zone string ("+/-HH:MM")
+sub TimeZoneString($;$)
+{
+    my $min = shift;
+    if (ref $min) {
+        my @gm = gmtime(shift);
+        $min = GetTimeZone($min, \@gm);
+    }
+    my $sign = '+';
+    $min < 0 and $sign = '-', $min = -$min;
+    my $h = int($min / 60);
+    return sprintf('%s%.2d:%.2d', $sign, $h, $min - $h * 60);
+}
+
+#------------------------------------------------------------------------------
+# Convert Unix time to EXIF date/time string
+# Inputs: 0) Unix time value, 1) non-zero to convert to local time
+# Returns: EXIF date/time string (with timezone for local times)
+# Notes: fractional seconds are ignored
+sub ConvertUnixTime($;$)
+{
+    my ($time, $toLocal) = @_;
+    return '0000:00:00 00:00:00' if $time == 0;
+    my (@tm, $tz);
+    if ($toLocal) {
+        @tm = localtime($time);
+        $tz = TimeZoneString(\@tm, $time);
+    } else {
+        @tm = gmtime($time);
+        $tz = '';
+    }
+    my $str = sprintf("%4d:%.2d:%.2d %.2d:%.2d:%.2d%s",
+                      $tm[5]+1900, $tm[4]+1, $tm[3], $tm[2], $tm[1], $tm[0], $tz);
+    return $str;
+}
+
+#------------------------------------------------------------------------------
+# Get Unix time from EXIF-formatted date/time string with optional timezone
+# Inputs: 0) EXIF date/time string, 1) non-zero if time is local
+# Returns: Unix time (seconds since 0:00 GMT Jan 1, 1970) or undefined on error
+sub GetUnixTime($;$)
+{
+    my ($timeStr, $isLocal) = @_;
+    return 0 if $timeStr eq '0000:00:00 00:00:00';
+    my @tm = ($timeStr =~ /^(\d+):(\d+):(\d+)\s+(\d+):(\d+):(\d+)/);
+    return undef unless @tm == 6 and eval 'require Time::Local';
+    my $tzsec = 0;
+    # use specified timezone offset (if given) instead of local system time
+    # if we are converting a local time value
+    if ($isLocal and $timeStr =~ /(?:Z|([-+])(\d+):(\d+))$/i) {
+        # use specified timezone if one exists
+        $tzsec = ($2 * 60 + $3) * ($1 eq '-' ? -60 : 60) if $1;
+        undef $isLocal; # convert using GMT corrected for specified timezone
+    }
+    $tm[0] -= 1900;     # convert year
+    $tm[1] -= 1;        # convert month
+    @tm = reverse @tm;  # change to order required by timelocal()
+    return $isLocal ? TimeLocal(@tm) : Time::Local::timegm(@tm) - $tzsec;
+}
+
+#------------------------------------------------------------------------------
+# Print conversion for file size
+# Inputs: 0) file size in bytes
+# Returns: converted file size
+sub ConvertFileSize($)
+{
+    my $val = shift;
+    $val < 2048 and return "$val bytes";
+    $val < 10240 and return sprintf('%.1f kB', $val / 1024);
+    $val < 2097152 and return sprintf('%.0f kB', $val / 1024);
+    $val < 10485760 and return sprintf('%.1f MB', $val / 1048576);
+    return sprintf('%.0f MB', $val / 1048576);
+}
+
+#------------------------------------------------------------------------------
+# Convert seconds to duration string (handles negative durations)
+# Inputs: 0) floating point seconds
+# Returns: duration string in form "S.SS s", "MM:SS" or "H:MM:SS"
+sub ConvertDuration($)
+{
+    my $time = shift;
+    return $time unless IsFloat($time);
+    return '0 s' if $time == 0;
+    my $sign = ($time > 0 ? '' : (($time = -$time), '-'));
+    return sprintf("$sign%.2f s", $time) if $time < 30;
+    my $h = int($time / 3600);
+    $time -= $h * 3600;
+    my $m = int($time / 60);
+    $time -= $m * 60;
+    return sprintf("$sign%d:%.2d:%.2d", $h, $m, int($time));
+}
+
+#------------------------------------------------------------------------------
+# Print conversion for bitrate values
+# Inputs: 0) bitrate in bits per second
+# Returns: human-readable bitrate string
+# Notes: returns input value without formatting if it isn't numerical
+sub ConvertBitrate($)
+{
+    my $bitrate = shift;
+    IsFloat($bitrate) or return $bitrate;
+    my @units = ('bps', 'kbps', 'Mbps', 'Gbps');
+    for (;;) {
+        my $units = shift @units;
+        $bitrate >= 1000 and @units and $bitrate /= 1000, next;
+        my $fmt = $bitrate < 100 ? '%.3g' : '%.0f';
+        return sprintf("$fmt $units", $bitrate);
+    }
+}
+
+#------------------------------------------------------------------------------
+# Save information for HTML dump
+# Inputs: 0) ExifTool hash ref, 1) start offset, 2) data size
+#         3) comment string, 4) tool tip (or SAME), 5) flags
+sub HDump($$$$;$$)
+{
+    my $self = shift;
+    my $pos = shift;
+    $pos += $$self{BASE} if $$self{BASE};
+    $$self{HTML_DUMP} and $self->{HTML_DUMP}->Add($pos, @_);
+}
+
+#------------------------------------------------------------------------------
+# JPEG constants
+my %jpegMarker = (
+    0x01 => 'TEM',
+    0xc0 => 'SOF0', # to SOF15, with a few exceptions below
+    0xc4 => 'DHT',
+    0xc8 => 'JPGA',
+    0xcc => 'DAC',
+    0xd0 => 'RST0',
+    0xd8 => 'SOI',
+    0xd9 => 'EOI',
+    0xda => 'SOS',
+    0xdb => 'DQT',
+    0xdc => 'DNL',
+    0xdd => 'DRI',
+    0xde => 'DHP',
+    0xdf => 'EXP',
+    0xe0 => 'APP0', # to APP15
+    0xf0 => 'JPG0',
+    0xfe => 'COM',
+);
+
+#------------------------------------------------------------------------------
+# Get JPEG marker name
+# Inputs: 0) Jpeg number
+# Returns: marker name
+sub JpegMarkerName($)
+{
+    my $marker = shift;
+    my $markerName = $jpegMarker{$marker};
+    unless ($markerName) {
+        $markerName = $jpegMarker{$marker & 0xf0};
+        if ($markerName and $markerName =~ /^([A-Z]+)\d+$/) {
+            $markerName = $1 . ($marker & 0x0f);
+        } else {
+            $markerName = sprintf("marker 0x%.2x", $marker);
+        }
+    }
+    return $markerName;
+}
+
+#------------------------------------------------------------------------------
+# Identify trailer ending at specified offset from end of file
+# Inputs: 0) RAF reference, 1) offset from end of file (0 by default)
+# Returns: Trailer info hash (with RAF and DirName set),
+#          or undef if no recognized trailer was found
+# Notes: leaves file position unchanged
+sub IdentifyTrailer($;$)
+{
+    my $raf = shift;
+    my $offset = shift || 0;
+    my $pos = $raf->Tell();
+    my ($buff, $type, $len);
+    while ($raf->Seek(-$offset, 2) and ($len = $raf->Tell()) > 0) {
+        # read up to 64 bytes before specified offset from end of file
+        $len = 64 if $len > 64;
+        $raf->Seek(-$len, 1) and $raf->Read($buff, $len) == $len or last;
+        if ($buff =~ /AXS(!|\*).{8}$/s) {
+            $type = 'AFCP';
+        } elsif ($buff =~ /\xa1\xb2\xc3\xd4$/) {
+            $type = 'FotoStation';
+        } elsif ($buff =~ /cbipcbbl$/) {
+            $type = 'PhotoMechanic';
+        } elsif ($buff =~ /^CANON OPTIONAL DATA\0/) {
+            $type = 'CanonVRD';
+        } elsif ($buff =~ /~\0\x04\0zmie~\0\0\x06.{4}[\x10\x18]\x04$/s or
+                 $buff =~ /~\0\x04\0zmie~\0\0\x0a.{8}[\x10\x18]\x08$/s)
+        {
+            $type = 'MIE';
+        }
+        last;
+    }
+    $raf->Seek($pos, 0);    # restore original file position
+    return $type ? { RAF => $raf, DirName => $type } : undef;
+}
+
+#------------------------------------------------------------------------------
+# Read/rewrite trailer information (including multiple trailers)
+# Inputs: 0) ExifTool object ref, 1) DirInfo ref:
+# - requires RAF and DirName
+# - OutFile is a scalar reference for writing
+# - scans from current file position if ScanForAFCP is set
+# Returns: 1 if trailer was processed or couldn't be processed (or written OK)
+#          0 if trailer was recognized but offsets need fixing (or write error)
+# - DirName, DirLen, DataPos, Offset, Fixup and OutFile are updated
+# - preserves current file position and byte order
+sub ProcessTrailers($$)
+{
+    my ($self, $dirInfo) = @_;
+    my $dirName = $$dirInfo{DirName};
+    my $outfile = $$dirInfo{OutFile};
+    my $offset = $$dirInfo{Offset} || 0;
+    my $fixup = $$dirInfo{Fixup};
+    my $raf = $$dirInfo{RAF};
+    my $pos = $raf->Tell();
+    my $byteOrder = GetByteOrder();
+    my $success = 1;
+    my $path = $$self{PATH};
+
+    for (;;) { # loop through all trailers
+        require "Image/ExifTool/$dirName.pm";
+        my $proc = "Image::ExifTool::${dirName}::Process$dirName";
+        my $outBuff;
+        if ($outfile) {
+            # write to local buffer so we can add trailer in proper order later
+            $$outfile and $$dirInfo{OutFile} = \$outBuff, $outBuff = '';
+            # must generate new fixup if necessary so we can shift
+            # the old fixup separately after we prepend this trailer
+            delete $$dirInfo{Fixup};
+        }
+        delete $$dirInfo{DirLen};       # reset trailer length
+        $$dirInfo{Offset} = $offset;    # set offset from end of file
+        $$dirInfo{Trailer} = 1;         # set Trailer flag in case proc cares
+        # add trailer and DirName to SubDirectory PATH
+        push @$path, 'Trailer', $dirName;
+
+        # read or write this trailer
+        # (proc takes Offset as offset from end of trailer to end of file,
+        #  and returns DataPos and DirLen, and Fixup if applicable)
+        no strict 'refs';
+        my $result = &$proc($self, $dirInfo);
+        use strict 'refs';
+
+        # restore PATH
+        pop @$path;
+        pop @$path;
+        # check result
+        if ($outfile) {
+            if ($result > 0) {
+                if ($outBuff) {
+                    # write trailers to OutFile in original order
+                    $$outfile = $outBuff . $$outfile;
+                    # must adjust old fixup start if it exists
+                    $$fixup{Start} += length($outBuff) if $fixup;
+                    $outBuff = '';      # free memory
+                }
+                if ($fixup) {
+                    # add new fixup information if any
+                    $fixup->AddFixup($$dirInfo{Fixup}) if $$dirInfo{Fixup};
+                } else {
+                    $fixup = $$dirInfo{Fixup};  # save fixup
+                }
+            } else {
+                $success = 0 if $self->Error("Error rewriting $dirName trailer", 1);
+                last;
+            }
+        } elsif ($result < 0) {
+            # can't continue if we must scan for this trailer
+            $success = 0;
+            last;
+        }
+        last unless $result > 0 and $$dirInfo{DirLen};
+        # look for next trailer
+        $offset += $$dirInfo{DirLen};
+        my $nextTrail = IdentifyTrailer($raf, $offset) or last;
+        $dirName = $$dirInfo{DirName} = $$nextTrail{DirName};
+        $raf->Seek($pos, 0);
+    }
+    SetByteOrder($byteOrder);       # restore original byte order
+    $raf->Seek($pos, 0);            # restore original file position
+    $$dirInfo{OutFile} = $outfile;  # restore original outfile
+    $$dirInfo{Offset} = $offset;    # return offset from EOF to start of first trailer
+    $$dirInfo{Fixup} = $fixup;      # return fixup information
+    return $success;
+}
+
+#------------------------------------------------------------------------------
+# Extract EXIF information from a jpg image
+# Inputs: 0) ExifTool object reference, 1) dirInfo ref with RAF set
+# Returns: 1 on success, 0 if this wasn't a valid JPEG file
+sub ProcessJPEG($$)
+{
+    local $_;
+    my ($self, $dirInfo) = @_;
+    my ($ch, $s, $length);
+    my $verbose = $self->{OPTIONS}{Verbose};
+    my $out = $self->{OPTIONS}{TextOut};
+    my $fast = $self->{OPTIONS}{FastScan};
+    my $raf = $$dirInfo{RAF};
+    my $htmlDump = $self->{HTML_DUMP};
+    my %dumpParms = ( Out => $out );
+    my ($success, $icc_profile, $wantTrailer, $trailInfo, %extendedXMP);
+    my ($preview, $scalado, @dqt, $subSampling, $dumpEnd);
+
+    # check to be sure this is a valid JPG file
+    return 0 unless $raf->Read($s, 2) == 2 and $s eq "\xff\xd8";
+    $dumpParms{MaxLen} = 128 if $verbose < 4;
+    unless ($self->{VALUE}{FileType}) {
+        $self->SetFileType();               # set FileType tag
+        $$self{LOW_PRIORITY_DIR}{IFD1} = 1; # lower priority of IFD1 tags
+    }
+    if ($htmlDump) {
+        $dumpEnd = $raf->Tell();
+        my $pos = $dumpEnd - 2;
+        $self->HDump(0, $pos, '[unknown header]') if $pos;
+        $self->HDump($pos, 2, 'JPEG header', 'SOI Marker');
+    }
+    my $path = $$self{PATH};
+    my $pn = scalar @$path;
+
+    # set input record separator to 0xff (the JPEG marker) to make reading quicker
+    local $/ = "\xff";
+
+    my ($nextMarker, $nextSegDataPt, $nextSegPos, $combinedSegData);
+
+    # read file until we reach an end of image (EOI) or start of scan (SOS)
+    Marker: for (;;) {
+        # set marker and data pointer for current segment
+        my $marker = $nextMarker;
+        my $segDataPt = $nextSegDataPt;
+        my $segPos = $nextSegPos;
+        undef $nextMarker;
+        undef $nextSegDataPt;
+#
+# read ahead to the next segment unless we have reached EOI or SOS
+#
+        unless ($marker and ($marker==0xd9 or ($marker==0xda and not $wantTrailer))) {
+            # read up to next marker (JPEG markers begin with 0xff)
+            my $buff;
+            $raf->ReadLine($buff) or last;
+            # JPEG markers can be padded with unlimited 0xff's
+            for (;;) {
+                $raf->Read($ch, 1) or last Marker;
+                $nextMarker = ord($ch);
+                last unless $nextMarker == 0xff;
+            }
+            # read data for all markers except 0xd9 (EOI) and stand-alone
+            # markers 0x00, 0x01 and 0xd0-0xd7 (NULL, TEM, RST0-RST7)
+            if ($nextMarker!=0xd9 and $nextMarker!=0x00 and $nextMarker!=0x01 and
+                ($nextMarker<0xd0 or $nextMarker>0xd7))
+            {
+                # read record length word
+                last unless $raf->Read($s, 2) == 2;
+                my $len = unpack('n',$s);   # get data length
+                last unless defined($len) and $len >= 2;
+                $nextSegPos = $raf->Tell();
+                $len -= 2;  # subtract size of length word
+                last unless $raf->Read($buff, $len) == $len;
+                $nextSegDataPt = \$buff;    # set pointer to our next data
+            }
+            # read second segment too if this was the first
+            next unless defined $marker;
+        }
+        # set some useful variables for the current segment
+        my $markerName = JpegMarkerName($marker);
+        $$path[$pn] = $markerName;
+#
+# parse the current segment
+#
+        # handle SOF markers: SOF0-SOF15, except DHT(0xc4), JPGA(0xc8) and DAC(0xcc)
+        if (($marker & 0xf0) == 0xc0 and ($marker == 0xc0 or $marker & 0x03)) {
+            $length = length $$segDataPt;
+            if ($verbose) {
+                print $out "JPEG $markerName ($length bytes):\n";
+                HexDump($segDataPt, undef, %dumpParms, Addr=>$segPos) if $verbose>2;
+            }
+            next unless $length >= 6;
+            # extract some useful information
+            my ($p, $h, $w, $n) = unpack('Cn2C', $$segDataPt);
+            my $sof = GetTagTable('Image::ExifTool::JPEG::SOF');
+            $self->FoundTag($$sof{ImageWidth}, $w);
+            $self->FoundTag($$sof{ImageHeight}, $h);
+            $self->FoundTag($$sof{EncodingProcess}, $marker - 0xc0);
+            $self->FoundTag($$sof{BitsPerSample}, $p);
+            $self->FoundTag($$sof{ColorComponents}, $n);
+            next unless $n == 3 and $length >= 15;
+            my ($i, $hmin, $hmax, $vmin, $vmax);
+            # loop through all components to determine sampling frequency
+            $subSampling = '';
+            for ($i=0; $i<$n; ++$i) {
+                my $sf = Get8u($segDataPt, 7 + 3 * $i);
+                $subSampling .= sprintf('%.2x', $sf);
+                # isolate horizontal and vertical components
+                my ($hf, $vf) = ($sf >> 4, $sf & 0x0f);
+                unless ($i) {
+                    $hmin = $hmax = $hf;
+                    $vmin = $vmax = $vf;
+                    next;
+                }
+                # determine min/max frequencies
+                $hmin = $hf if $hf < $hmin;
+                $hmax = $hf if $hf > $hmax;
+                $vmin = $vf if $vf < $vmin;
+                $vmax = $vf if $vf > $vmax;
+            }
+            if ($hmin and $vmin) {
+                my ($hs, $vs) = ($hmax / $hmin, $vmax / $vmin);
+                $self->FoundTag($$sof{YCbCrSubSampling}, "$hs $vs");
+            }
+            next;
+        } elsif ($marker == 0xd9) {         # EOI
+            pop @$path;
+            $verbose and print $out "JPEG EOI\n";
+            my $pos = $raf->Tell();
+            if ($htmlDump and $dumpEnd) {
+                $self->HDump($dumpEnd, $pos-2-$dumpEnd, '[JPEG Image Data]', undef, 0x08);
+                $self->HDump($pos-2, 2, 'JPEG EOI', undef);
+                $dumpEnd = 0;
+            }
+            $success = 1;
+            # we are here because we are looking for trailer information
+            if ($wantTrailer) {
+                my $start = $$self{PreviewImageStart};
+                if ($start) {
+                    my $buff;
+                    # most previews start right after the JPEG EOI, but the Olympus E-20
+                    # preview is 508 bytes into the trailer, the K-M Maxxum 7D preview is
+                    # 979 bytes in, and Sony previews can start up to 32 kB into the trailer.
+                    # (and Minolta and Sony previews can have a random first byte...)
+                    my $scanLen = $$self{Make} =~ /Sony/i ? 65536 : 1024;
+                    if ($raf->Read($buff, $scanLen) and ($buff =~ /\xff\xd8\xff./g or
+                        ($self->{Make} =~ /(Minolta|Sony)/i and $buff =~ /.\xd8\xff\xdb/g)))
+                    {
+                        # adjust PreviewImageStart to this location
+                        my $actual = $pos + pos($buff) - 4;
+                        if ($start ne $actual and $verbose > 1) {
+                            print $out "(Fixed PreviewImage location: $start -> $actual)\n";
+                        }
+                        # update preview image offsets
+                        $self->{VALUE}{PreviewImageStart} = $actual if $self->{VALUE}{PreviewImageStart};
+                        $$self{PreviewImageStart} = $actual;
+                        # load preview now if we tried and failed earlier
+                        if ($$self{PreviewError} and $$self{PreviewImageLength}) {
+                            if ($raf->Seek($actual, 0) and $raf->Read($buff, $$self{PreviewImageLength})) {
+                                $self->FoundTag('PreviewImage', $buff);
+                                delete $$self{PreviewError};
+                            }
+                        }
+                    }
+                    $raf->Seek($pos, 0);
+                }
+            }
+            # process trailer now or finish processing trailers
+            # and scan for AFCP if necessary
+            my $fromEnd = 0;
+            if ($trailInfo) {
+                $$trailInfo{ScanForAFCP} = 1;   # scan now if necessary
+                $self->ProcessTrailers($trailInfo);
+                # save offset from end of file to start of first trailer
+                $fromEnd = $$trailInfo{Offset};
+                undef $trailInfo;
+            }
+            if ($$self{LeicaTrailer}) {
+                $raf->Seek(0, 2);
+                $$self{LeicaTrailer}{TrailPos} = $pos;
+                $$self{LeicaTrailer}{TrailLen} = $raf->Tell() - $pos - $fromEnd;
+                Image::ExifTool::Panasonic::ProcessLeicaTrailer($self);
+            }
+            # finally, dump remaining information in JPEG trailer
+            if ($verbose or $htmlDump) {
+                my $endPos = $$self{LeicaTrailerPos};
+                unless ($endPos) {
+                    $raf->Seek(0, 2);
+                    $endPos = $raf->Tell() - $fromEnd;
+                }
+                $self->DumpUnknownTrailer({
+                    RAF => $raf,
+                    DataPos => $pos,
+                    DirLen => $endPos - $pos
+                }) if $endPos > $pos;
+            }
+            last;       # all done parsing file
+        } elsif ($marker == 0xda) {         # SOS
+            pop @$path;
+            # all done with meta information unless we have a trailer
+            $verbose and print $out "JPEG SOS\n";
+            unless ($fast) {
+                $trailInfo = IdentifyTrailer($raf);
+                # process trailer now unless we are doing verbose dump
+                if ($trailInfo and $verbose < 3 and not $htmlDump) {
+                    # process trailers (keep trailInfo to finish processing later
+                    # only if we can't finish without scanning from end of file)
+                    $self->ProcessTrailers($trailInfo) and undef $trailInfo;
+                }
+                if ($wantTrailer) {
+                    # seek ahead and validate preview image
+                    my $buff;
+                    my $curPos = $raf->Tell();
+                    if ($raf->Seek($$self{PreviewImageStart}, 0) and
+                        $raf->Read($buff, 4) == 4 and
+                        $buff =~ /^.\xd8\xff[\xc4\xdb\xe0-\xef]/)
+                    {
+                        undef $wantTrailer;
+                    }
+                    $raf->Seek($curPos, 0) or last;
+                }
+                # seek ahead and process Leica trailer
+                if ($$self{LeicaTrailer}) {
+                    require Image::ExifTool::Panasonic;
+                    Image::ExifTool::Panasonic::ProcessLeicaTrailer($self);
+                    $wantTrailer = 1 if $$self{LeicaTrailer};
+                }
+                next if $trailInfo or $wantTrailer or $verbose > 2 or $htmlDump;
+            }
+            # nothing interesting to parse after start of scan (SOS)
+            $success = 1;
+            last;   # all done parsing file
+        } elsif ($marker==0x00 or $marker==0x01 or ($marker>=0xd0 and $marker<=0xd7)) {
+            # handle stand-alone markers 0x00, 0x01 and 0xd0-0xd7 (NULL, TEM, RST0-RST7)
+            $verbose and $marker and print $out "JPEG $markerName:\n";
+            next;
+        } elsif ($marker == 0xdb and length($$segDataPt) and    # DQT
+            # save the DQT data only if JPEGDigest has been requested
+            $self->{REQ_TAG_LOOKUP}->{jpegdigest})
+        {
+            my $num = unpack('C',$$segDataPt) & 0x0f;   # get table index
+            $dqt[$num] = $$segDataPt if $num < 4;       # save for MD5 calculation
+        }
+        # handle all other markers
+        my $dumpType = '';
+        $length = length $$segDataPt;
+        if ($verbose) {
+            print $out "JPEG $markerName ($length bytes):\n";
+            if ($verbose > 2) {
+                my %extraParms = ( Addr => $segPos );
+                $extraParms{MaxLen} = 128 if $verbose == 4;
+                HexDump($segDataPt, undef, %dumpParms, %extraParms);
+            }
+        }
+        if ($marker == 0xe0) {              # APP0 (JFIF, JFXX, CIFF, AVI1, Ocad)
+            if ($$segDataPt =~ /^JFIF\0/) {
+                $dumpType = 'JFIF';
+                my %dirInfo = (
+                    DataPt => $segDataPt,
+                    DataPos  => $segPos,
+                    DirStart => 5,
+                    DirLen => $length - 5,
+                );
+                SetByteOrder('MM');
+                my $tagTablePtr = GetTagTable('Image::ExifTool::JFIF::Main');
+                $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
+            } elsif ($$segDataPt =~ /^JFXX\0\x10/) {
+                $dumpType = 'JFXX';
+                my $tagTablePtr = GetTagTable('Image::ExifTool::JFIF::Extension');
+                my $tagInfo = $self->GetTagInfo($tagTablePtr, 0x10);
+                $self->FoundTag($tagInfo, substr($$segDataPt, 6));
+            } elsif ($$segDataPt =~ /^(II|MM).{4}HEAPJPGM/s) {
+                next if $fast and $fast > 1;    # skip processing for very fast
+                $dumpType = 'CIFF';
+                my %dirInfo = (
+                    RAF => new File::RandomAccess($segDataPt),
+                );
+                $self->{SET_GROUP1} = 'CIFF';
+                require Image::ExifTool::CanonRaw;
+                Image::ExifTool::CanonRaw::ProcessCRW($self, \%dirInfo);
+                delete $self->{SET_GROUP1};
+            } elsif ($$segDataPt =~ /^(AVI1|Ocad)/) {
+                $dumpType = $1;
+                SetByteOrder('MM');
+                my $tagTablePtr = GetTagTable("Image::ExifTool::JPEG::$dumpType");
+                my %dirInfo = (
+                    DataPt   => $segDataPt,
+                    DataPos  => $segPos,
+                    DirStart => 4,
+                    DirLen   => $length - 4,
+                );
+                $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
+            }
+        } elsif ($marker == 0xe1) {         # APP1 (EXIF, XMP, QVCI)
+            if ($$segDataPt =~ /^Exif\0/) { # (some Kodak cameras don't put a second \0)
+                undef $dumpType;    # (will be dumped here)
+                # this is EXIF data --
+                # get the data block (into a common variable)
+                my $hdrLen = length($exifAPP1hdr);
+                my %dirInfo = (
+                    Parent => $markerName,
+                    DataPt => $segDataPt,
+                    DataPos => $segPos,
+                    DirStart => $hdrLen,
+                    Base => $segPos + $hdrLen,
+                );
+                if ($htmlDump) {
+                    $self->HDump($segPos-4, 4, 'APP1 header', "Data size: $length bytes");
+                    $self->HDump($segPos, $hdrLen, 'Exif header', 'APP1 data type: Exif');
+                    $dumpEnd = $segPos + $length;
+                }
+                # extract the EXIF information (it is in standard TIFF format)
+                $self->ProcessTIFF(\%dirInfo);
+                # avoid looking for preview unless necessary because it really slows
+                # us down -- only look for it if we found pointer, and preview is
+                # outside EXIF, and PreviewImage is specifically requested
+                my $start = $self->GetValue('PreviewImageStart');
+                my $length = $self->GetValue('PreviewImageLength');
+                if (not $start or not $length and $$self{PreviewError}) {
+                    $start = $$self{PreviewImageStart};
+                    $length = $$self{PreviewImageLength};
+                }
+                if ($start and $length and
+                    $start + $length > $self->{EXIF_POS} + length($self->{EXIF_DATA}) and
+                    $self->{REQ_TAG_LOOKUP}{previewimage})
+                {
+                    $$self{PreviewImageStart} = $start;
+                    $$self{PreviewImageLength} = $length;
+                    $wantTrailer = 1;
+                }
+            } elsif ($$segDataPt =~ /^$xmpExtAPP1hdr/) {
+                # off len -- extended XMP header (75 bytes total):
+                #   0  35 bytes - signature
+                #  35  32 bytes - GUID (MD5 hash of full extended XMP data in ASCII)
+                #  67   4 bytes - total size of extended XMP data
+                #  71   4 bytes - offset for this XMP data portion
+                $dumpType = 'Extended XMP';
+                if (length $$segDataPt > 75) {
+                    my ($size, $off) = unpack('x67N2', $$segDataPt);
+                    my $guid = substr($$segDataPt, 35, 32);
+                    my $extXMP = $extendedXMP{$guid};
+                    $extXMP or $extXMP = $extendedXMP{$guid} = { };
+                    $$extXMP{Size} = $size;
+                    $$extXMP{$off} = substr($$segDataPt, 75);
+                    # process extended XMP if complete
+                    my @offsets;
+                    for ($off=0; $off<$size; ) {
+                        last unless defined $$extXMP{$off};
+                        push @offsets, $off;
+                        $off += length $$extXMP{$off};
+                    }
+                    if ($off == $size) {
+                        my $buff = '';
+                        # assemble XMP all together
+                        $buff .= $$extXMP{$_} foreach @offsets;
+                        $dumpType = 'Extended XMP';
+                        my $tagTablePtr = GetTagTable('Image::ExifTool::XMP::Main');
+                        my %dirInfo = (
+                            DataPt   => \$buff,
+                            Parent   => $markerName,
+                        );
+                        $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
+                        delete $extendedXMP{$guid};
+                    }
+                } else {
+                    $self->Warn('Invalid extended XMP segment');
+                }
+            } elsif ($$segDataPt =~ /^QVCI\0/) {
+                $dumpType = 'QVCI';
+                my $tagTablePtr = GetTagTable('Image::ExifTool::Casio::QVCI');
+                my %dirInfo = (
+                    Base     => 0,
+                    DataPt   => $segDataPt,
+                    DataPos  => $segPos,
+                    DataLen  => $length,
+                    DirStart => 0,
+                    DirLen   => $length,
+                    Parent   => $markerName,
+                );
+                $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
+            } else {
+                # Hmmm.  Could be XMP, let's see
+                my $processed;
+                if ($$segDataPt =~ /^http/ or $$segDataPt =~ /<exif:/) {
+                    $dumpType = 'XMP';
+                    # also try to parse XMP with a non-standard header
+                    # (note: this non-standard XMP is ignored when writing)
+                    my $start = ($$segDataPt =~ /^$xmpAPP1hdr/) ? length($xmpAPP1hdr) : 0;
+                    my $tagTablePtr = GetTagTable('Image::ExifTool::XMP::Main');
+                    my %dirInfo = (
+                        Base     => 0,
+                        DataPt   => $segDataPt,
+                        DataPos  => $segPos,
+                        DataLen  => $length,
+                        DirStart => $start,
+                        DirLen   => $length - $start,
+                        Parent   => $markerName,
+                    );
+                    $processed = $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
+                    if ($processed and not $start) {
+                        $self->Warn('Non-standard header for APP1 XMP segment');
+                    }
+                }
+                if ($verbose and not $processed) {
+                    $self->Warn("Ignored EXIF block length $length (bad header)");
+                }
+            }
+        } elsif ($marker == 0xe2) {         # APP2 (ICC Profile, FPXR, MPF, PreviewImage)
+            if ($$segDataPt =~ /^ICC_PROFILE\0/) {
+                $dumpType = 'ICC_Profile';
+                # must concatenate blocks of profile
+                my $block_num = Get8u($segDataPt, 12);
+                my $blocks_tot = Get8u($segDataPt, 13);
+                $icc_profile = '' if $block_num == 1;
+                if (defined $icc_profile) {
+                    $icc_profile .= substr($$segDataPt, 14);
+                    if ($block_num == $blocks_tot) {
+                        my $tagTablePtr = GetTagTable('Image::ExifTool::ICC_Profile::Main');
+                        my %dirInfo = (
+                            DataPt   => \$icc_profile,
+                            DataPos  => $segPos + 14,
+                            DataLen  => length($icc_profile),
+                            DirStart => 0,
+                            DirLen   => length($icc_profile),
+                            Parent   => $markerName,
+                        );
+                        $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
+                        undef $icc_profile;
+                    }
+                }
+            } elsif ($$segDataPt =~ /^FPXR\0/) {
+                next if $fast and $fast > 1;    # skip processing for very fast
+                $dumpType = 'FPXR';
+                my $tagTablePtr = GetTagTable('Image::ExifTool::FlashPix::Main');
+                my %dirInfo = (
+                    DataPt   => $segDataPt,
+                    DataPos  => $segPos,
+                    DataLen  => $length,
+                    DirStart => 0,
+                    DirLen   => $length,
+                    Parent   => $markerName,
+                    # set flag if this is the last FPXR segment
+                    LastFPXR => not ($nextMarker==$marker and $$nextSegDataPt=~/^FPXR\0/),
+                );
+                $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
+            } elsif ($$segDataPt =~ /^MPF\0/) {
+                undef $dumpType;    # (will be dumped here)
+                my %dirInfo = (
+                    Parent => $markerName,
+                    DataPt => $segDataPt,
+                    DataPos => $segPos,
+                    DirStart => 4,
+                    Base => $segPos + 4,
+                    Multi => 1, # the MP Attribute IFD will be MPF1
+                );
+                if ($htmlDump) {
+                    $self->HDump($segPos-4, 4, 'APP2 header', "Data size: $length bytes");
+                    $self->HDump($segPos, 4, 'MPF header', 'APP2 data type: MPF');
+                    $dumpEnd = $segPos + $length;
+                }
+                # extract the MPF information (it is in standard TIFF format)
+                my $tagTablePtr = GetTagTable('Image::ExifTool::MPF::Main');
+                $self->ProcessTIFF(\%dirInfo, $tagTablePtr);
+            } elsif ($$segDataPt =~ /^\xff\xd8\xff\xdb/) {
+                $preview = $$segDataPt;
+                $dumpType = 'Samsung Preview';
+            } elsif ($preview) {
+                $preview .= $$segDataPt;
+                $dumpType = 'Samsung Preview';
+            }
+            if ($preview and $nextMarker ne $marker) {
+                $self->FoundTag('PreviewImage', $preview);
+                undef $preview;
+            }
+        } elsif ($marker == 0xe3) {         # APP3 (Kodak "Meta", Stim)
+            if ($$segDataPt =~ /^(Meta|META|Exif)\0\0/) {
+                undef $dumpType;    # (will be dumped here)
+                my %dirInfo = (
+                    Parent => $markerName,
+                    DataPt => $segDataPt,
+                    DataPos => $segPos,
+                    DirStart => 6,
+                    Base => $segPos + 6,
+                );
+                if ($htmlDump) {
+                    $self->HDump($segPos-4, 10, 'APP3 Meta header');
+                    $dumpEnd = $segPos + $length;
+                }
+                my $tagTablePtr = GetTagTable('Image::ExifTool::Kodak::Meta');
+                $self->ProcessTIFF(\%dirInfo, $tagTablePtr);
+            } elsif ($$segDataPt =~ /^Stim\0/) {
+                undef $dumpType;    # (will be dumped here)
+                my %dirInfo = (
+                    Parent => $markerName,
+                    DataPt => $segDataPt,
+                    DataPos => $segPos,
+                    DirStart => 6,
+                    Base => $segPos + 6,
+                );
+                if ($htmlDump) {
+                    $self->HDump($segPos-4, 4, 'APP3 header', "Data size: $length bytes");
+                    $self->HDump($segPos, 5, 'Stim header', 'APP3 data type: Stim');
+                    $dumpEnd = $segPos + $length;
+                }
+                # extract the Stim information (it is in standard TIFF format)
+                my $tagTablePtr = GetTagTable('Image::ExifTool::Stim::Main');
+                $self->ProcessTIFF(\%dirInfo, $tagTablePtr);
+            } elsif ($$segDataPt =~ /^\xff\xd8\xff\xdb/) {
+                $preview = $$segDataPt;
+                $dumpType = 'Samsung/HP Preview';
+            }
+            # Samsung continues the preview in APP4
+            if ($preview and $nextMarker ne 0xe4) {
+                $self->FoundTag('PreviewImage', $preview);
+                undef $preview;
+            }
+        } elsif ($marker == 0xe4) {         # APP4 ("SCALADO", FPXR, PreviewImage)
+            if ($$segDataPt =~ /^SCALADO\0/ and $length >= 16) {
+                $dumpType = 'SCALADO';
+                my ($num, $idx, $len) = unpack('x8n2N', $$segDataPt);
+                # assume that the segments are in order and just concatinate them
+                $scalado = '' unless defined $scalado;
+                $scalado .= substr($$segDataPt, 16);
+                if ($idx == $num - 1) {
+                    if ($len != length $scalado) {
+                        $self->Warn('Possibly corrupted APP4 SCALADO data', 1);
+                    }
+                    my %dirInfo = (
+                        Parent => $markerName,
+                        DataPt => \$scalado,
+                    );
+                    my $tagTablePtr = GetTagTable('Image::ExifTool::JPEG::Scalado');
+                    $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
+                    undef $scalado;
+                }
+            } elsif ($$segDataPt =~ /^FPXR\0/) {
+                next if $fast and $fast > 1;    # skip processing for very fast
+                $dumpType = 'FPXR';
+                my $tagTablePtr = GetTagTable('Image::ExifTool::FlashPix::Main');
+                my %dirInfo = (
+                    DataPt   => $segDataPt,
+                    DataPos  => $segPos,
+                    DataLen  => $length,
+                    DirStart => 0,
+                    DirLen   => $length,
+                    Parent   => $markerName,
+                    # set flag if this is the last FPXR segment
+                    LastFPXR => not ($nextMarker==$marker and $$nextSegDataPt=~/^FPXR\0/),
+                );
+                $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
+            } elsif ($preview) {
+                # continued Samsung S1060 preview from APP3
+                $preview .= $$segDataPt;
+                # (not sure if next part would be APP5 or APP4 again, but assume APP4)
+                if ($nextMarker ne $marker) {
+                    $self->FoundTag('PreviewImage', $preview);
+                    undef $preview;
+                }
+            }
+        } elsif ($marker == 0xe5) {         # APP5 (Ricoh "RMETA")
+            if ($$segDataPt =~ /^RMETA\0/) {
+                $dumpType = 'Ricoh RMETA';
+                my %dirInfo = (
+                    Parent => $markerName,
+                    DataPt => $segDataPt,
+                    DataPos => $segPos,
+                    DirStart => 6,
+                    Base => $segPos + 6,
+                );
+                my $tagTablePtr = GetTagTable('Image::ExifTool::Ricoh::RMETA');
+                $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
+            }
+        } elsif ($marker == 0xe6) {         # APP6 (Toshiba EPPIM, NITF, HP_TDHD)
+            if ($$segDataPt =~ /^EPPIM\0/) {
+                undef $dumpType;    # (will be dumped here)
+                my %dirInfo = (
+                    Parent => $markerName,
+                    DataPt => $segDataPt,
+                    DataPos => $segPos,
+                    DirStart => 6,
+                    Base => $segPos + 6,
+                );
+                if ($htmlDump) {
+                    $self->HDump($segPos-4, 10, 'APP6 EPPIM header');
+                    $dumpEnd = $segPos + $length;
+                }
+                my $tagTablePtr = GetTagTable('Image::ExifTool::JPEG::EPPIM');
+                $self->ProcessTIFF(\%dirInfo, $tagTablePtr);
+            } elsif ($$segDataPt =~ /^NITF\0/) {
+                $dumpType = 'NITF';
+                SetByteOrder('MM');
+                my $tagTablePtr = GetTagTable('Image::ExifTool::JPEG::NITF');
+                my %dirInfo = (
+                    DataPt   => $segDataPt,
+                    DataPos  => $segPos,
+                    DirStart => 5,
+                    DirLen   => $length - 5,
+                );
+                $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
+            } elsif ($$segDataPt =~ /^TDHD\x01\0\0\0/ and $length > 12) {
+                # HP Photosmart R837 APP6 "TDHD" segment
+                $dumpType = 'TDHD';
+                my $tagTablePtr = GetTagTable('Image::ExifTool::HP::TDHD');
+                my %dirInfo = (
+                    DataPt   => $segDataPt,
+                    DataPos  => $segPos,
+                    DirStart => 12, # (ignore first TDHD element because size includes 12-byte tag header)
+                    DirLen   => $length - 12,
+                );
+                $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
+            }
+        } elsif ($marker == 0xe8) {         # APP8 (SPIFF)
+            # my sample SPIFF has 32 bytes of data, but spec states 30
+            if ($$segDataPt =~ /^SPIFF\0/ and $length == 32) {
+                $dumpType = 'SPIFF';
+                my %dirInfo = (
+                    DataPt => $segDataPt,
+                    DataPos  => $segPos,
+                    DirStart => 6,
+                    DirLen => $length - 6,
+                );
+                my $tagTablePtr = GetTagTable('Image::ExifTool::JPEG::SPIFF');
+                $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
+            }
+        } elsif ($marker == 0xea) {         # APP10 (PhotoStudio Unicode comments)
+            if ($$segDataPt =~ /^UNICODE\0/) {
+                $dumpType = 'PhotoStudio';
+                my $comment = $self->Decode(substr($$segDataPt,8), 'UCS2', 'MM');
+                $self->FoundTag('Comment', $comment);
+            }
+        } elsif ($marker == 0xec) {         # APP12 (Ducky, Picture Info)
+            if ($$segDataPt =~ /^Ducky/) {
+                $dumpType = 'Ducky';
+                my %dirInfo = (
+                    DataPt => $segDataPt,
+                    DataPos => $segPos,
+                    DirStart => 5,
+                    DirLen => $length - 5,
+                );
+                my $tagTablePtr = GetTagTable('Image::ExifTool::APP12::Ducky');
+                $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
+            } else {
+                my %dirInfo = ( DataPt => $segDataPt );
+                my $tagTablePtr = GetTagTable('Image::ExifTool::APP12::PictureInfo');
+                $self->ProcessDirectory(\%dirInfo, $tagTablePtr) and $dumpType = 'Picture Info';
+            }
+        } elsif ($marker == 0xed) {         # APP13 (Photoshop, Adobe_CM)
+            my $isOld;
+            if ($$segDataPt =~ /^$psAPP13hdr/ or ($$segDataPt =~ /^$psAPP13old/ and $isOld=1)) {
+                $dumpType = 'Photoshop';
+                # add this data to the combined data if it exists
+                my $dataPt = $segDataPt;
+                if (defined $combinedSegData) {
+                    $combinedSegData .= substr($$segDataPt,length($psAPP13hdr));
+                    $dataPt = \$combinedSegData;
+                }
+                # peek ahead to see if the next segment is photoshop data too
+                if ($nextMarker == $marker and $$nextSegDataPt =~ /^$psAPP13hdr/) {
+                    # initialize combined data if necessary
+                    $combinedSegData = $$segDataPt unless defined $combinedSegData;
+                    # (will handle the Photoshop data the next time around)
+                } else {
+                    my $hdrlen = $isOld ? 27 : 14;
+                    # process APP13 Photoshop record
+                    my $tagTablePtr = GetTagTable('Image::ExifTool::Photoshop::Main');
+                    my %dirInfo = (
+                        DataPt   => $dataPt,
+                        DataPos  => $segPos,
+                        DataLen  => length $$dataPt,
+                        DirStart => $hdrlen,    # directory starts after identifier
+                        DirLen   => length($$dataPt) - $hdrlen,
+                        Parent   => $markerName,
+                    );
+                    $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
+                    undef $combinedSegData;
+                }
+            } elsif ($$segDataPt =~ /^Adobe_CM/) {
+                $dumpType = 'Adobe_CM';
+                SetByteOrder('MM');
+                my $tagTablePtr = GetTagTable('Image::ExifTool::JPEG::AdobeCM');
+                my %dirInfo = (
+                    DataPt   => $segDataPt,
+                    DataPos  => $segPos,
+                    DirStart => 8,
+                    DirLen   => $length - 8,
+                );
+                $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
+            }
+        } elsif ($marker == 0xee) {         # APP14 (Adobe)
+            if ($$segDataPt =~ /^Adobe/) {
+                $dumpType = 'Adobe';
+                SetByteOrder('MM');
+                my $tagTablePtr = GetTagTable('Image::ExifTool::JPEG::Adobe');
+                my %dirInfo = (
+                    DataPt   => $segDataPt,
+                    DataPos  => $segPos,
+                    DirStart => 5,
+                    DirLen   => $length - 5,
+                );
+                $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
+            }
+        } elsif ($marker == 0xef) {         # APP15 (GraphicConverter)
+            if ($$segDataPt =~ /^Q\s*(\d+)/ and $length == 4) {
+                $dumpType = 'GraphicConverter';
+                my $tagTablePtr = GetTagTable('Image::ExifTool::JPEG::GraphConv');
+                $self->HandleTag($tagTablePtr, 'Q', $1);
+            }
+        } elsif ($marker == 0xfe) {         # COM (JPEG comment)
+            $dumpType = 'Comment';
+            $$segDataPt =~ s/\0+$//;    # some dumb softwares add null terminators
+            $self->FoundTag('Comment', $$segDataPt);
+        } elsif (($marker & 0xf0) != 0xe0) {
+            undef $dumpType;    # only dump unknown APP segments
+        }
+        if (defined $dumpType) {
+            if (not $dumpType and $self->{OPTIONS}{Unknown}) {
+                $self->Warn("Unknown $markerName segment", 1);
+            }
+            if ($htmlDump) {
+                my $desc = $markerName . ($dumpType ? " $dumpType" : '') . ' segment';
+                $self->HDump($segPos-4, $length+4, $desc, undef, 0x08);
+                $dumpEnd = $segPos + $length;
+            }
+        }
+        undef $$segDataPt;
+    }
+    # calculate JPEGDigest if requested
+    if (@dqt and $subSampling) {
+        require Image::ExifTool::JPEGDigest;
+        Image::ExifTool::JPEGDigest::Calculate($self, \@dqt, $subSampling);
+    }
+    $self->Warn('Error reading PreviewImage', 1) if $$self{PreviewError};
+    $self->Warn('Invalid extended XMP') if %extendedXMP;
+    $success or $self->Warn('JPEG format error');
+    pop @$path if @$path > $pn;
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Process EXIF file
+# Inputs/Returns: same as ProcessTIFF
+sub ProcessEXIF($$;$)
+{
+    my ($self, $dirInfo, $tagTablePtr) = @_;
+    return $self->ProcessTIFF($dirInfo, $tagTablePtr);
+}
+
+#------------------------------------------------------------------------------
+# Process TIFF data (wrapper for DoProcessTIFF to allow re-entry)
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) optional tag table ref
+# Returns: 1 if this looked like a valid EXIF block, 0 otherwise, or -1 on write error
+sub ProcessTIFF($$;$)
+{
+    my ($self, $dirInfo, $tagTablePtr) = @_;
+    my $exifData = $$self{EXIF_DATA};
+    my $exifPos = $$self{EXIF_POS};
+    my $rtnVal = $self->DoProcessTIFF($dirInfo, $tagTablePtr);
+    # restore original EXIF information (in case ProcessTIFF is nested)
+    if (defined $exifData) {
+        $$self{EXIF_DATA} = $exifData;
+        $$self{EXIF_POS} = $exifPos;
+    }
+    return $rtnVal;
+}
+
+#------------------------------------------------------------------------------
+# Process TIFF data
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) optional tag table ref
+# Returns: 1 if this looked like a valid EXIF block, 0 otherwise, or -1 on write error
+sub DoProcessTIFF($$;$)
+{
+    my ($self, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $fileType = $$dirInfo{Parent} || '';
+    my $raf = $$dirInfo{RAF};
+    my $base = $$dirInfo{Base} || 0;
+    my $outfile = $$dirInfo{OutFile};
+    my ($err, $canonSig, $otherSig);
+
+    # attempt to read TIFF header
+    $self->{EXIF_DATA} = '';
+    if ($raf) {
+        if ($outfile) {
+            $raf->Seek(0, 0) or return 0;
+            if ($base) {
+                $raf->Read($$dataPt, $base) == $base or return 0;
+                Write($outfile, $$dataPt) or $err = 1;
+            }
+        } else {
+            $raf->Seek($base, 0) or return 0;
+        }
+        # extract full EXIF block (for block copy) from EXIF file
+        my $amount = $fileType eq 'EXIF' ? 65536 * 8 : 8;
+        my $n = $raf->Read($self->{EXIF_DATA}, $amount);
+        if ($n < 8) {
+            return 0 if $n or not $outfile or $fileType ne 'EXIF';
+            # create EXIF file from scratch
+            delete $self->{EXIF_DATA};
+            undef $raf;
+        }
+        if ($n > 8) {
+            $raf->Seek(8, 0);
+            if ($n == $amount) {
+                $self->{EXIF_DATA} = substr($self->{EXIF_DATA}, 0, 8);
+                $self->Warn('EXIF too large to extract as a block'); #(shouldn't happen)
+            }
+        }
+    } elsif ($dataPt and length $$dataPt) {
+        # save a copy of the EXIF data
+        my $dirStart = $$dirInfo{DirStart} || 0;
+        my $dirLen = $$dirInfo{DirLen} || (length($$dataPt) - $dirStart);
+        $self->{EXIF_DATA} = substr($$dataPt, $dirStart, $dirLen);
+        $self->VerboseDir('TIFF') if $self->{OPTIONS}{Verbose} and length($$self{INDENT}) > 2;
+    } elsif ($outfile) {
+        delete $self->{EXIF_DATA};  # create from scratch
+    } else {
+        $self->{EXIF_DATA} = '';
+    }
+    unless (defined $self->{EXIF_DATA}) {
+        # create TIFF information from scratch
+        if ($self->SetPreferredByteOrder() eq 'MM') {
+            $self->{EXIF_DATA} = "MM\0\x2a\0\0\0\x08";
+        } else {
+            $self->{EXIF_DATA} = "II\x2a\0\x08\0\0\0";
+        }
+    }
+    $$self{FIRST_EXIF_POS} = $base + $$self{BASE} unless defined $$self{FIRST_EXIF_POS};
+    $$self{EXIF_POS} = $base + $$self{BASE};
+    $dataPt = \$self->{EXIF_DATA};
+
+    # set byte ordering
+    my $byteOrder = substr($$dataPt,0,2);
+    SetByteOrder($byteOrder) or return 0;
+
+    # verify the byte ordering
+    my $identifier = Get16u($dataPt, 2);
+    # identifier is 0x2a for TIFF (but 0x4f52, 0x5352 or ?? for ORF)
+  # no longer do this because various files use different values
+  # (TIFF=0x2a, RW2/RWL=0x55, HDP=0xbc, BTF=0x2b, ORF=0x4f52/0x5352/0x????)
+  #  return 0 unless $identifier == 0x2a;
+
+    # get offset to IFD0
+    my $offset = Get32u($dataPt, 4);
+    $offset >= 8 or return 0;
+
+    if ($raf) {
+        # Canon CR2 images usually have an offset of 16, but it may be
+        # greater if edited by PhotoMechanic, so check the 4-byte signature
+        if ($identifier == 0x2a and $offset >= 16) {
+            $raf->Read($canonSig, 8) == 8 or return 0;
+            $$dataPt .= $canonSig;
+            if ($canonSig =~ /^(CR\x02\0|\xba\xb0\xac\xbb)/) {
+                $fileType = $canonSig =~ /^CR/ ? 'CR2' : 'Canon 1D RAW';
+                $self->HDump($base+8, 8, "[$fileType header]") if $self->{HTML_DUMP};
+            } else {
+                undef $canonSig;
+            }
+        } elsif ($identifier == 0x55 and $fileType =~ /^(RAW|RW2|RWL|TIFF)$/) {
+            # panasonic RAW, RW2 or RWL file
+            my $magic;
+            # test for RW2/RWL magic number
+            if ($offset >= 0x18 and $raf->Read($magic, 16) and
+                $magic eq "\x88\xe7\x74\xd8\xf8\x25\x1d\x4d\x94\x7a\x6e\x77\x82\x2b\x5d\x6a")
+            {
+                $fileType = 'RW2' unless $fileType eq 'RWL';
+                $self->HDump($base + 8, 16, '[RW2/RWL header]') if $$self{HTML_DUMP};
+                $otherSig = $magic; # save signature for writing
+            } else {
+                $fileType = 'RAW';
+            }
+            $tagTablePtr = GetTagTable('Image::ExifTool::PanasonicRaw::Main');
+        } elsif ($identifier == 0x2b and $fileType eq 'TIFF') {
+            # this looks like a BigTIFF image
+            $raf->Seek(0);
+            require Image::ExifTool::BigTIFF;
+            return 1 if Image::ExifTool::BigTIFF::ProcessBTF($self, $dirInfo);
+        } elsif (Get8u($dataPt, 2) == 0xbc and $byteOrder eq 'II' and $fileType eq 'TIFF') {
+            $fileType = 'HDP';  # Windows HD Photo file
+            # check version number
+            my $ver = Get8u($dataPt, 3);
+            if ($ver > 1) {
+                $self->Error("Windows HD Photo version $ver files not yet supported");
+                return 1;
+            }
+        } elsif ($identifier == 0x4352 and $fileType eq 'TIFF') {
+            $fileType = 'DCP';
+        }
+        # we have a valid TIFF (or whatever) file
+        if ($fileType and not $self->{VALUE}{FileType}) {
+            my $lookup = $fileTypeLookup{$fileType};
+            $lookup = $fileTypeLookup{$lookup} unless ref $lookup or not $lookup;
+            # use file extension to pre-determine type if extension is TIFF-based or type is RAW
+            my $t = (($lookup and $$lookup[0] eq 'TIFF') or $fileType =~ /RAW/) ? $fileType : undef;
+            $self->SetFileType($t);
+        }
+    }
+    my $ifdName = 'IFD0';
+    if (not $tagTablePtr or $$tagTablePtr{GROUPS}{0} eq 'EXIF') {
+        $self->FoundTag('ExifByteOrder', $byteOrder);
+    } else {
+        $ifdName = $$tagTablePtr{GROUPS}{1};
+    }
+    if ($self->{HTML_DUMP}) {
+        my $tip = sprintf("Byte order: %s endian\nIdentifier: 0x%.4x\n$ifdName offset: 0x%.4x",
+                          ($byteOrder eq 'II') ? 'Little' : 'Big', $identifier, $offset);
+        $self->HDump($base, 8, 'TIFF header', $tip, 0);
+    }
+    # remember where we found the TIFF data (APP1, APP3, TIFF, NEF, etc...)
+    $self->{TIFF_TYPE} = $fileType;
+
+    # get reference to the main EXIF table
+    $tagTablePtr or $tagTablePtr = GetTagTable('Image::ExifTool::Exif::Main');
+
+    # build directory information hash
+    my %dirInfo = (
+        Base     => $base,
+        DataPt   => $dataPt,
+        DataLen  => length $$dataPt,
+        DataPos  => 0,
+        DirStart => $offset,
+        DirLen   => length($$dataPt) - $offset,
+        RAF      => $raf,
+        DirName  => $ifdName,
+        Parent   => $fileType,
+        ImageData=> 'Main', # set flag to get information to copy main image data later
+        Multi    => $$dirInfo{Multi},
+    );
+
+    # extract information from the image
+    unless ($outfile) {
+        # process the directory
+        $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
+        # process GeoTiff information if available
+        if ($self->{VALUE}{GeoTiffDirectory}) {
+            require Image::ExifTool::GeoTiff;
+            Image::ExifTool::GeoTiff::ProcessGeoTiff($self);
+        }
+        # process information in recognized trailers
+        if ($raf) {
+            my $trailInfo = IdentifyTrailer($raf);
+            if ($trailInfo) {
+                $$trailInfo{ScanForAFCP} = 1;   # scan to find AFCP if necessary
+                $self->ProcessTrailers($trailInfo);
+            }
+            # dump any other known trailer (ie. A100 RAW Data)
+            if ($$self{HTML_DUMP} and $$self{KnownTrailer}) {
+                my $known = $$self{KnownTrailer};
+                $raf->Seek(0, 2);
+                my $len = $raf->Tell() - $$known{Start};
+                $len -= $$trailInfo{Offset} if $trailInfo;  # account for other trailers
+                $self->HDump($$known{Start}, $len, "[$$known{Name}]") if $len > 0;
+           }
+        }
+        # update FileType if necessary now that we know more about the file
+        if ($$self{DNGVersion} and $self->{VALUE}{FileType} ne 'DNG') {
+            # override whatever FileType we set since we now know it is DNG
+            $self->OverrideFileType('DNG');
+        }
+        return 1;
+    }
+#
+# rewrite the image
+#
+    if ($$dirInfo{NoTiffEnd}) {
+        delete $self->{TIFF_END};
+    } else {
+        # initialize TIFF_END so it will be updated by WriteExif()
+        $self->{TIFF_END} = 0;
+    }
+    if ($canonSig) {
+        # write Canon CR2 specially because it has a header we want to preserve,
+        # and possibly trailers added by the Canon utilities and/or PhotoMechanic
+        $dirInfo{OutFile} = $outfile;
+        require Image::ExifTool::CanonRaw;
+        Image::ExifTool::CanonRaw::WriteCR2($self, \%dirInfo, $tagTablePtr) or $err = 1;
+    } else {
+        # write TIFF header (8 bytes [plus optional signature] followed by IFD)
+        $otherSig = '' unless defined $otherSig;
+        my $offset = 8 + length($otherSig);
+        # construct tiff header
+        my $header = substr($$dataPt, 0, 4) . Set32u($offset) . $otherSig;
+        $dirInfo{NewDataPos} = $offset;
+        $dirInfo{HeaderPtr} = \$header;
+        # preserve padding between image data blocks in ORF images
+        # (otherwise dcraw has problems because it assumes fixed block spacing)
+        $dirInfo{PreserveImagePadding} = 1 if $fileType eq 'ORF' or $identifier != 0x2a;
+        my $newData = $self->WriteDirectory(\%dirInfo, $tagTablePtr);
+        if (not defined $newData) {
+            $err = 1;
+        } elsif (length($newData)) {
+            # update header length in case more was added
+            my $hdrLen = length $header;
+            if ($hdrLen != 8) {
+                Set32u($hdrLen, \$header, 4);
+                # also update preview fixup if necessary
+                my $pi = $$self{PREVIEW_INFO};
+                $$pi{Fixup}{Start} += $hdrLen - 8 if $pi and $$pi{Fixup};
+            }
+            if ($$self{TIFF_TYPE} eq 'ARW' and not $err) {
+                # write any required ARW trailer and patch other ARW quirks
+                require Image::ExifTool::Sony;
+                my $errStr = Image::ExifTool::Sony::FinishARW($self, $dirInfo, \$newData, 
+                                                              $dirInfo{ImageData});
+                $errStr and $self->Error($errStr);
+                delete $dirInfo{ImageData}; # (was copied by FinishARW)
+            } else {
+                Write($outfile, $header, $newData) or $err = 1;
+            }
+            undef $newData; # free memory
+        }
+        # copy over image data now if necessary
+        if (ref $dirInfo{ImageData} and not $err) {
+            $self->CopyImageData($dirInfo{ImageData}, $outfile) or $err = 1;
+            delete $dirInfo{ImageData};
+        }
+    }
+    # make local copy of TIFF_END now (it may be reset when processing trailers)
+    my $tiffEnd = $self->{TIFF_END};
+    delete $self->{TIFF_END};
+
+    # rewrite trailers if they exist
+    if ($raf and $tiffEnd and not $err) {
+        my ($buf, $trailInfo);
+        $raf->Seek(0, 2) or $err = 1;
+        my $extra = $raf->Tell() - $tiffEnd;
+        # check for trailer and process if possible
+        for (;;) {
+            last unless $extra > 12;
+            $raf->Seek($tiffEnd);  # seek back to end of image
+            $trailInfo = IdentifyTrailer($raf);
+            last unless $trailInfo;
+            my $tbuf = '';
+            $$trailInfo{OutFile} = \$tbuf;  # rewrite trailer(s)
+            $$trailInfo{ScanForAFCP} = 1;   # scan for AFCP if necessary
+            # rewrite all trailers to buffer
+            unless ($self->ProcessTrailers($trailInfo)) {
+                undef $trailInfo;
+                $err = 1;
+                last;
+            }
+            # calculate unused bytes before trailer
+            $extra = $$trailInfo{DataPos} - $tiffEnd;
+            last; # yes, the 'for' loop was just a cheap 'goto'
+        }
+        # ignore a single zero byte if used for padding
+        if ($extra > 0 and $tiffEnd & 0x01) {
+            $raf->Seek($tiffEnd, 0) or $err = 1;
+            $raf->Read($buf, 1) or $err = 1;
+            defined $buf and $buf eq "\0" and --$extra, ++$tiffEnd;
+        }
+        if ($extra > 0) {
+            my $known = $$self{KnownTrailer};
+            if ($self->{DEL_GROUP}{Trailer} and not $known) {
+                $self->VPrint(0, "  Deleting unknown trailer ($extra bytes)\n");
+                ++$self->{CHANGED};
+            } elsif ($known) {
+                $self->VPrint(0, "  Copying $$known{Name} ($extra bytes)\n");
+                $raf->Seek($tiffEnd, 0) or $err = 1;
+                CopyBlock($raf, $outfile, $extra) or $err = 1;
+            } else {
+                $raf->Seek($tiffEnd, 0) or $err = 1;
+                # preserve unknown trailer only if it contains non-null data
+                # (Photoshop CS adds a trailer with 2 null bytes)
+                my $size = $extra;
+                for (;;) {
+                    my $n = $size > 65536 ? 65536 : $size;
+                    $raf->Read($buf, $n) == $n or $err = 1, last;
+                    if ($buf =~ /[^\0]/) {
+                        $self->VPrint(0, "  Preserving unknown trailer ($extra bytes)\n");
+                        # copy the trailer since it contains non-null data
+                        Write($outfile, "\0"x($extra-$size)) or $err = 1, last if $size != $extra;
+                        Write($outfile, $buf) or $err = 1, last;
+                        CopyBlock($raf, $outfile, $size-$n) or $err = 1 if $size > $n;
+                        last;
+                    }
+                    $size -= $n;
+                    next if $size > 0;
+                    $self->VPrint(0, "  Deleting blank trailer ($extra bytes)\n");
+                    last;
+                }
+            }
+        }
+        # write trailer buffer if necessary
+        $self->WriteTrailerBuffer($trailInfo, $outfile) or $err = 1 if $trailInfo;
+        # add any new trailers we are creating
+        my $trailPt = $self->AddNewTrailers();
+        Write($outfile, $$trailPt) or $err = 1 if $trailPt;
+    }
+    # check DNG version
+    if ($$self{DNGVersion}) {
+        my $ver = $$self{DNGVersion};
+        # currently support up to DNG version 1.2
+        unless ($ver =~ /^(\d+) (\d+)/ and "$1.$2" <= 1.3) {
+            $ver =~ tr/ /./;
+            $self->Error("DNG Version $ver not yet supported", 1);
+        }
+    }
+    return $err ? -1 : 1;
+}
+
+#------------------------------------------------------------------------------
+# Return list of tag table keys (ignoring special keys)
+# Inputs: 0) reference to tag table
+# Returns: List of table keys (unsorted)
+sub TagTableKeys($)
+{
+    local $_;
+    my $tagTablePtr = shift;
+    my @keyList;
+    foreach (keys %$tagTablePtr) {
+        push(@keyList, $_) unless $specialTags{$_};
+    }
+    return @keyList;
+}
+
+#------------------------------------------------------------------------------
+# GetTagTable
+# Inputs: 0) table name
+# Returns: tag table reference, or undefined if not found
+# Notes: Always use this function instead of requiring module and using table
+# directly since this function also does the following the first time the table
+# is loaded:
+# - requires new module if necessary
+# - generates default GROUPS hash and Group 0 name from module name
+# - registers Composite tags if Composite table found
+# - saves descriptions for tags in specified table
+# - generates default TAG_PREFIX to be used for unknown tags
+sub GetTagTable($)
+{
+    my $tableName = shift or return undef;
+    my $table = $allTables{$tableName};
+
+    unless ($table) {
+        no strict 'refs';
+        unless (%$tableName) {
+            # try to load module for this table
+            if ($tableName =~ /(.*)::/) {
+                my $module = $1;
+                if (eval "require $module") {
+                    # load additional XMP modules if required
+                    if (not %$tableName and $module eq 'Image::ExifTool::XMP') {
+                        require 'Image/ExifTool/XMP2.pl';
+                    }
+                } else {
+                    $@ and warn $@;
+                }
+            }
+            unless (%$tableName) {
+                warn "Can't find table $tableName\n";
+                return undef;
+            }
+        }
+        no strict 'refs';
+        $table = \%$tableName;
+        use strict 'refs';
+        $$table{TABLE_NAME} = $tableName;   # set table name
+        ($$table{SHORT_NAME} = $tableName) =~ s/^Image::ExifTool:://;
+        # set default group 0 and 1 from module name unless already specified
+        my $defaultGroups = $$table{GROUPS};
+        $defaultGroups or $defaultGroups = $$table{GROUPS} = { };
+        unless ($$defaultGroups{0} and $$defaultGroups{1}) {
+            if ($tableName =~ /Image::.*?::([^:]*)/) {
+                $$defaultGroups{0} = $1 unless $$defaultGroups{0};
+                $$defaultGroups{1} = $1 unless $$defaultGroups{1};
+            } else {
+                $$defaultGroups{0} = $tableName unless $$defaultGroups{0};
+                $$defaultGroups{1} = $tableName unless $$defaultGroups{1};
+            }
+        }
+        $$defaultGroups{2} = 'Other' unless $$defaultGroups{2};
+        if ($$defaultGroups{0} eq 'XMP' or $$table{NAMESPACE}) {
+            # initialize some XMP table defaults
+            require Image::ExifTool::XMP;
+            Image::ExifTool::XMP::RegisterNamespace($table); # register all table namespaces
+            # set default write/check procs
+            $$table{WRITE_PROC} = \&Image::ExifTool::XMP::WriteXMP unless $$table{WRITE_PROC};
+            $$table{CHECK_PROC} = \&Image::ExifTool::XMP::CheckXMP unless $$table{CHECK_PROC};
+            $$table{LANG_INFO} = \&Image::ExifTool::XMP::GetLangInfo unless $$table{LANG_INFO};
+        }
+        # generate a tag prefix for unknown tags if necessary
+        unless ($$table{TAG_PREFIX}) {
+            my $tagPrefix;
+            if ($tableName =~ /Image::.*?::(.*)::Main/ || $tableName =~ /Image::.*?::(.*)/) {
+                ($tagPrefix = $1) =~ s/::/_/g;
+            } else {
+                $tagPrefix = $tableName;
+            }
+            $$table{TAG_PREFIX} = $tagPrefix;
+        }
+        # set up the new table
+        SetupTagTable($table);
+        # add any user-defined tags
+        if (%UserDefined and $UserDefined{$tableName}) {
+            my $tagID;
+            foreach $tagID (TagTableKeys($UserDefined{$tableName})) {
+                my $tagInfo = $UserDefined{$tableName}{$tagID};
+                if (ref $tagInfo eq 'HASH') {
+                    $$tagInfo{Name} or $$tagInfo{Name} = ucfirst($tagID);
+                } else {
+                    $tagInfo = { Name => $tagInfo };
+                }
+                if ($$table{WRITABLE} and not defined $$tagInfo{Writable} and
+                    not $$tagInfo{SubDirectory})
+                {
+                    $$tagInfo{Writable} = $$table{WRITABLE};
+                }
+                delete $$table{$tagID}; # replace any existing entry
+                AddTagToTable($table, $tagID, $tagInfo);
+            }
+        }
+        # remember order we loaded the tables in
+        push @tableOrder, $tableName;
+        # insert newly loaded table into list
+        $allTables{$tableName} = $table;
+    }
+    return $table;
+}
+
+#------------------------------------------------------------------------------
+# Process an image directory
+# Inputs: 0) ExifTool object reference, 1) directory information reference
+#         2) tag table reference, 3) optional reference to processing procedure
+# Returns: Result from processing (1=success)
+sub ProcessDirectory($$$;$)
+{
+    my ($self, $dirInfo, $tagTablePtr, $proc) = @_;
+
+    return 0 unless $tagTablePtr and $dirInfo;
+    # use default proc from tag table or EXIF proc as fallback if no proc specified
+    $proc or $proc = $$tagTablePtr{PROCESS_PROC} || \&Image::ExifTool::Exif::ProcessExif;
+    # set directory name from default group0 name if not done already
+    $$dirInfo{DirName} or $$dirInfo{DirName} = $tagTablePtr->{GROUPS}{0};
+    # guard against cyclical recursion into the same directory
+    if (defined $$dirInfo{DirStart} and defined $$dirInfo{DataPos}) {
+        my $addr = $$dirInfo{DirStart} + $$dirInfo{DataPos} + ($$dirInfo{Base}||0);
+        if ($self->{PROCESSED}{$addr}) {
+            $self->Warn("$$dirInfo{DirName} pointer references previous $self->{PROCESSED}{$addr} directory");
+            return 0;
+        }
+        $self->{PROCESSED}{$addr} = $$dirInfo{DirName};
+    }
+    my $oldOrder = GetByteOrder();
+    my $oldIndent = $self->{INDENT};
+    my $oldDir = $self->{DIR_NAME};
+    $self->{LIST_TAGS} = { };  # don't build lists across different directories
+    $self->{INDENT} .= '| ';
+    $self->{DIR_NAME} = $$dirInfo{DirName};
+    push @{$self->{PATH}}, $$dirInfo{DirName};
+
+    # process the directory
+    my $rtnVal = &$proc($self, $dirInfo, $tagTablePtr);
+
+    pop @{$self->{PATH}};
+    $self->{INDENT} = $oldIndent;
+    $self->{DIR_NAME} = $oldDir;
+    SetByteOrder($oldOrder);
+    return $rtnVal;
+}
+
+#------------------------------------------------------------------------------
+# Get Metadata path
+# Inputs: 0) Exiftool object ref
+# Return: Metadata path string
+sub MetadataPath($)
+{
+    my $self = shift;
+    return join '-', @{$$self{PATH}}
+}
+
+#------------------------------------------------------------------------------
+# Get standardized file extension
+# Inputs: 0) file name
+# Returns: standardized extension (all uppercase), or undefined if no extension
+sub GetFileExtension($)
+{
+    my $filename = shift;
+    my $fileExt;
+    if ($filename and $filename =~ /.*\.(.+)$/) {
+        $fileExt = uc($1);   # change extension to upper case
+        # convert TIF extension to TIFF because we use the
+        # extension for the file type tag of TIFF images
+        $fileExt eq 'TIF' and $fileExt = 'TIFF';
+    }
+    return $fileExt;
+}
+
+#------------------------------------------------------------------------------
+# Get list of tag information hashes for given tag ID
+# Inputs: 0) Tag table reference, 1) tag ID
+# Returns: Array of tag information references
+# Notes: Generates tagInfo hash if necessary
+sub GetTagInfoList($$)
+{
+    my ($tagTablePtr, $tagID) = @_;
+    my $tagInfo = $$tagTablePtr{$tagID};
+
+    if (ref $tagInfo eq 'HASH') {
+        return ($tagInfo);
+    } elsif (ref $tagInfo eq 'ARRAY') {
+        return @$tagInfo;
+    } elsif ($tagInfo) {
+        # create hash with name
+        $tagInfo = $$tagTablePtr{$tagID} = { Name => $tagInfo };
+        return ($tagInfo);
+    }
+    return ();
+}
+
+#------------------------------------------------------------------------------
+# Find tag information, processing conditional tags
+# Inputs: 0) ExifTool object reference, 1) tagTable pointer, 2) tag ID
+#         3) optional value reference, 4) optional format type, 5) optional value count
+# Returns: pointer to tagInfo hash, undefined if none found, or '' if $valPt needed
+# Notes: You should always call this routine to find a tag in a table because
+# this routine will evaluate conditional tags.
+# Arguments 3-5 are only required if the information type allows $valPt, $format and/or
+# $count in a Condition, and if not given when needed this routine returns ''.
+sub GetTagInfo($$$;$$$)
+{
+    my ($self, $tagTablePtr, $tagID) = @_;
+    my ($valPt, $format, $count);
+
+    my @infoArray = GetTagInfoList($tagTablePtr, $tagID);
+    # evaluate condition
+    my $tagInfo;
+    foreach $tagInfo (@infoArray) {
+        my $condition = $$tagInfo{Condition};
+        if ($condition) {
+            ($valPt, $format, $count) = splice(@_, 3) if @_ > 3;
+            return '' if $condition =~ /\$(valPt|format|count)\b/ and not defined $valPt;
+            # set old value for use in condition if needed
+            local $SIG{'__WARN__'} = \&SetWarning;
+            undef $evalWarning;
+            #### eval Condition ($self, [$valPt, $format, $count])
+            unless (eval $condition) {
+                $@ and $evalWarning = $@;
+                $self->Warn("Condition $$tagInfo{Name}: " . CleanWarning()) if $evalWarning;
+                next;
+            }
+        }
+        if ($$tagInfo{Unknown} and not $$self{OPTIONS}{Unknown} and not $$self{OPTIONS}{Verbose}) {
+            # don't return Unknown tags unless that option is set
+            return undef;
+        }
+        # return the tag information we found
+        return $tagInfo;
+    }
+    # generate information for unknown tags (numerical only) if required
+    if (not $tagInfo and ($$self{OPTIONS}{Unknown} or $$self{OPTIONS}{Verbose}) and
+        $tagID =~ /^\d+$/ and not $$self{NO_UNKNOWN})
+    {
+        my $printConv;
+        if (defined $$tagTablePtr{PRINT_CONV}) {
+            $printConv = $$tagTablePtr{PRINT_CONV};
+        } else {
+            # limit length of printout (can be very long)
+            $printConv = 'length($val) > 60 ? substr($val,0,55) . "[...]" : $val';
+        }
+        my $hex = sprintf("0x%.4x", $tagID);
+        my $prefix = $$tagTablePtr{TAG_PREFIX};
+        $tagInfo = {
+            Name => "${prefix}_$hex",
+            Description => MakeDescription($prefix, $hex),
+            Unknown => 1,
+            Writable => 0,  # can't write unknown tags
+            PrintConv => $printConv,
+        };
+        # add tag information to table
+        AddTagToTable($tagTablePtr, $tagID, $tagInfo);
+    } else {
+        undef $tagInfo;
+    }
+    return $tagInfo;
+}
+
+#------------------------------------------------------------------------------
+# Add new tag to table (must use this routine to add new tags to a table)
+# Inputs: 0) reference to tag table, 1) tag ID
+#         2) [optional] reference to tag information hash
+# Notes: - will not overwrite existing entry in table
+# - info need contain no entries when this routine is called
+sub AddTagToTable($$;$)
+{
+    my ($tagTablePtr, $tagID, $tagInfo) = @_;
+    $tagInfo or $tagInfo = { };
+
+    # define necessary entries in information hash
+    if ($$tagInfo{Groups}) {
+        # fill in default groups from table GROUPS
+        foreach (keys %{$$tagTablePtr{GROUPS}}) {
+            next if $tagInfo->{Groups}{$_};
+            $tagInfo->{Groups}{$_} = $tagTablePtr->{GROUPS}{$_};
+        }
+    } else {
+        $$tagInfo{Groups} = { %{$$tagTablePtr{GROUPS}} };
+    }
+    $$tagInfo{Flags} and ExpandFlags($tagInfo);
+    $$tagInfo{GotGroups} = 1,
+    $$tagInfo{Table} = $tagTablePtr;
+    $$tagInfo{TagID} = $tagID;
+
+    my $name = $$tagInfo{Name};
+    if (defined $name) {
+        $name =~ tr/-_a-zA-Z0-9//dc;    # remove illegal characters
+    } else {
+        # construct a name from the tag ID
+        $name = $tagID;
+        $name =~ tr/-_a-zA-Z0-9//dc;    # remove illegal characters
+        $name = ucfirst $name;          # start with uppercase
+        # make sure name is a reasonable length
+        my $prefix = $$tagTablePtr{TAG_PREFIX};
+        if ($prefix) {
+            # make description to prevent tagID from getting mangled by MakeDescription()
+            $$tagInfo{Description} = MakeDescription($prefix, $name);
+            $name = "${prefix}_$name";
+        }
+    }
+    # tag names must be at least 2 characters long and begin with a letter
+    $name = "Tag$name" if length($name) <= 1 or $name !~ /^[A-Z]/i;
+    $$tagInfo{Name} = $name;
+    # add tag to table, but never overwrite existing entries (could potentially happen
+    # if someone thinks there isn't any tagInfo because a condition wasn't satisfied)
+    $$tagTablePtr{$tagID} = $tagInfo unless defined $$tagTablePtr{$tagID};
+}
+
+#------------------------------------------------------------------------------
+# Handle simple extraction of new tag information
+# Inputs: 0) ExifTool object ref, 1) tag table reference, 2) tagID, 3) value,
+#         4-N) parameters hash: Index, DataPt, DataPos, Start, Size, Parent,
+#              TagInfo, ProcessProc, RAF
+# Returns: tag key or undef if tag not found
+# Notes: if value is not defined, it is extracted from DataPt using TagInfo
+#        Format and Count if provided
+sub HandleTag($$$$;%)
+{
+    my ($self, $tagTablePtr, $tag, $val, %parms) = @_;
+    my $verbose = $self->{OPTIONS}{Verbose};
+    my $tagInfo = $parms{TagInfo} || $self->GetTagInfo($tagTablePtr, $tag, \$val);
+    my $dataPt = $parms{DataPt};
+    my ($subdir, $format, $count, $size, $noTagInfo);
+
+    if ($tagInfo) {
+        $subdir = $$tagInfo{SubDirectory}
+    } else {
+        return undef unless $verbose;
+        $tagInfo = { Name => "tag $tag" };  # create temporary tagInfo hash
+        $noTagInfo = 1;
+    }
+    # read value if not done already (not necessary for subdir)
+    unless (defined $val or ($subdir and not $$tagInfo{Writable})) {
+        my $start = $parms{Start} || 0;
+        my $size = $parms{Size} || 0;
+        # read from data in memory if possible
+        if ($dataPt and $start >= 0 and $start + $size <= length($$dataPt)) {
+            $format = $$tagInfo{Format} || $$tagTablePtr{FORMAT};
+            if ($format) {
+                $val = ReadValue($dataPt, $start, $format, $$tagInfo{Count}, $size);
+            } else {
+                $val = substr($$dataPt, $start, $size);
+            }
+        } else {
+            $self->Warn("Error extracting value for $$tagInfo{Name}");
+            return undef;
+        }
+    }
+    # do verbose print if necessary
+    if ($verbose) {
+        undef $tagInfo if $noTagInfo;
+        $parms{Value} = $val;
+        $parms{Table} = $tagTablePtr;
+        if ($format) {
+            $count or $count = int(($parms{Size} || 0) / ($formatSize{$format} || 1));
+            $parms{Format} = $format . "[$count]";
+        }
+        $self->VerboseInfo($tag, $tagInfo, %parms);
+    }
+    if ($tagInfo) {
+        if ($subdir) {
+            my $subdirStart = $parms{Start};
+            my $subdirLen = $parms{Size};
+            if ($$subdir{Start}) {
+                my $valuePtr = 0;
+                #### eval Start ($valuePtr)
+                my $off = eval $$subdir{Start};                
+                $subdirStart += $off;
+                $subdirLen -= $off;
+            }
+            $dataPt or $dataPt = \$val;
+            # process subdirectory information
+            my %dirInfo = (
+                DirName  => $$subdir{DirName} || $$tagInfo{Name},
+                DataPt   => $dataPt,
+                DataLen  => length $$dataPt,
+                DataPos  => $parms{DataPos},
+                DirStart => $subdirStart,
+                DirLen   => $subdirLen,
+                Parent   => $parms{Parent},
+                Base     => $parms{Base},
+                Multi    => $$subdir{Multi},
+                TagInfo  => $tagInfo,
+                RAF      => $parms{RAF},
+            );
+            my $oldOrder = GetByteOrder();
+            SetByteOrder($$subdir{ByteOrder}) if $$subdir{ByteOrder};
+            my $subTablePtr = GetTagTable($$subdir{TagTable}) || $tagTablePtr;
+            $self->ProcessDirectory(\%dirInfo, $subTablePtr, $$subdir{ProcessProc} || $parms{ProcessProc});
+            SetByteOrder($oldOrder);
+            # return now unless directory is writable as a block
+            return undef unless $$tagInfo{Writable};
+        }
+        return $self->FoundTag($tagInfo, $val);
+    }
+    return undef;
+}
+
+#------------------------------------------------------------------------------
+# Add tag to hash of extracted information
+# Inputs: 0) ExifTool object reference
+#         1) reference to tagInfo hash or tag name
+#         2) data value (or reference to require hash if Composite)
+# Returns: tag key or undef if no value
+sub FoundTag($$$)
+{
+    local $_;
+    my ($self, $tagInfo, $value) = @_;
+    my $tag;
+
+    if (ref $tagInfo eq 'HASH') {
+        $tag = $$tagInfo{Name} or warn("No tag name\n"), return undef;
+    } else {
+        $tag = $tagInfo;
+        # look for tag in Extra
+        $tagInfo = $self->GetTagInfo(GetTagTable('Image::ExifTool::Extra'), $tag);
+        # make temporary hash if tag doesn't exist in Extra
+        # (not advised to do this since the tag won't show in list)
+        $tagInfo or $tagInfo = { Name => $tag, Groups => \%allGroupsExifTool };
+        $self->{OPTIONS}{Verbose} and $self->VerboseInfo(undef, $tagInfo, Value => $value);
+    }
+    my $rawValueHash = $self->{VALUE};
+    if ($$tagInfo{RawConv}) {
+        # initialize @val for use in Composite RawConv expressions
+        my @val;
+        if (ref $value eq 'HASH') {
+            foreach (keys %$value) { $val[$_] = $$rawValueHash{$$value{$_}}; }
+        }
+        my $conv = $$tagInfo{RawConv};
+        local $SIG{'__WARN__'} = \&SetWarning;
+        undef $evalWarning;
+        if (ref $conv eq 'CODE') {
+            $value = &$conv($value, $self);
+        } else {
+            my $val = $value;   # must do this in case eval references $val
+            # NOTE: RawConv is also evaluated in Writer.pl
+            #### eval RawConv ($self, $val, $tag, $tagInfo)
+            $value = eval $conv;
+            $@ and $evalWarning = $@;
+        }
+        $self->Warn("RawConv $tag: " . CleanWarning()) if $evalWarning;
+        return undef unless defined $value;
+    }
+    # get tag priority
+    my $priority = $$tagInfo{Priority};
+    defined $priority or $priority = $tagInfo->{Table}{PRIORITY};
+    # handle duplicate tag names
+    if (defined $$rawValueHash{$tag}) {
+        # add to list if there is an active list for this tag
+        if ($self->{LIST_TAGS}{$tagInfo}) {
+            $tag = $self->{LIST_TAGS}{$tagInfo};  # use key from previous list tag
+            if (ref $$rawValueHash{$tag} ne 'ARRAY') {
+                $$rawValueHash{$tag} = [ $$rawValueHash{$tag} ];
+            }
+            push @{$$rawValueHash{$tag}}, $value;
+            return $tag;    # return without creating a new entry
+        }
+        # get next available tag key
+        my $nextInd = $self->{DUPL_TAG}{$tag} = ($self->{DUPL_TAG}{$tag} || 0) + 1;
+        my $nextTag = "$tag ($nextInd)";
+#
+# take tag with highest priority
+#
+        # promote existing 0-priority tag so it takes precedence over a new 0-tag
+        # (unless old tag was a sub-document and new tag isn't)
+        my $oldPriority = $self->{PRIORITY}{$tag};
+        unless ($oldPriority) {
+            if ($self->{DOC_NUM} or not $self->{TAG_EXTRA}{$tag} or
+                                    not $self->{TAG_EXTRA}{$tag}{G3})
+            {
+                $oldPriority = 1;
+            } else {
+                $oldPriority = 0; # don't promote sub-document tag over main document
+            }
+        }
+        # set priority for this tag
+        if (defined $priority) {
+            # increase 0-priority tags if this is the priority directory
+            $priority = 1 if not $priority and $$self{DIR_NAME} and
+                             $$self{DIR_NAME} eq $$self{PRIORITY_DIR};
+        } elsif ($$self{DIR_NAME} and $$self{LOW_PRIORITY_DIR}{$$self{DIR_NAME}}) {
+            $priority = 0;  # default is 0 for a LOW_PRIORITY_DIR
+        } else {
+            $priority = 1;  # the normal default
+        }
+        if ($priority >= $oldPriority and not $self->{DOC_NUM}) {
+            # move existing tag out of the way since this tag is higher priority
+            $self->{MOVED_KEY} = $nextTag;  # used in BuildCompositeTags()
+            $self->{PRIORITY}{$nextTag} = $self->{PRIORITY}{$tag};
+            $$rawValueHash{$nextTag} = $$rawValueHash{$tag};
+            $self->{FILE_ORDER}{$nextTag} = $self->{FILE_ORDER}{$tag};
+            my $oldInfo = $self->{TAG_INFO}{$nextTag} = $self->{TAG_INFO}{$tag};
+            if ($self->{TAG_EXTRA}{$tag}) {
+                $self->{TAG_EXTRA}{$nextTag} = $self->{TAG_EXTRA}{$tag};
+                delete $self->{TAG_EXTRA}{$tag};
+            }
+            # update tag key for list if necessary
+            $self->{LIST_TAGS}{$oldInfo} = $nextTag if $self->{LIST_TAGS}{$oldInfo};
+        } else {
+            $tag = $nextTag;        # don't override the existing tag
+        }
+        $self->{PRIORITY}{$tag} = $priority;
+    } elsif ($priority) {
+        # set tag priority (only if exists and non-zero)
+        $self->{PRIORITY}{$tag} = $priority;
+    }
+
+    # save the raw value, file order, tagInfo ref, group1 name,
+    # and tag key for lists if necessary
+    $$rawValueHash{$tag} = $value;
+    $self->{FILE_ORDER}{$tag} = ++$self->{NUM_FOUND};
+    $self->{TAG_INFO}{$tag} = $tagInfo;
+    # set dynamic groups 1 and 3 if necessary
+    $self->{TAG_EXTRA}{$tag}{G1} = $self->{SET_GROUP1} if $self->{SET_GROUP1};
+    if ($self->{DOC_NUM}) {
+        $self->{TAG_EXTRA}{$tag}{G3} = $self->{DOC_NUM};
+        if ($self->{DOC_NUM} =~ /^(\d+)/) {
+            # keep track of maximum 1st-level sub-document number
+            $self->{DOC_COUNT} = $1 unless $self->{DOC_COUNT} >= $1;
+        }
+    }
+    # save path if requested
+    $self->{TAG_EXTRA}{$tag}{G5} = $self->MetadataPath() if $self->{OPTIONS}{SavePath};
+
+    # remember this tagInfo if we will be accumulating values in a list
+    $self->{LIST_TAGS}{$tagInfo} = $tag if $$tagInfo{List} and not $$self{NO_LIST};
+
+    return $tag;
+}
+
+#------------------------------------------------------------------------------
+# Make current directory the priority directory if not set already
+# Inputs: 0) ExifTool object reference
+sub SetPriorityDir($)
+{
+    my $self = shift;
+    $self->{PRIORITY_DIR} = $self->{DIR_NAME} unless $self->{PRIORITY_DIR};
+}
+
+#------------------------------------------------------------------------------
+# Set family 0 or 1 group name specific to this tag instance
+# Inputs: 0) ExifTool ref, 1) tag key, 2) group name, 3) family (default 1)
+sub SetGroup($$$;$)
+{
+    my ($self, $tagKey, $extra, $fam) = @_;
+    $self->{TAG_EXTRA}{$tagKey}{defined $fam ? "G$fam" : 'G1'} = $extra;
+}
+
+#------------------------------------------------------------------------------
+# Delete specified tag
+# Inputs: 0) ExifTool object ref, 1) tag key
+sub DeleteTag($$)
+{
+    my ($self, $tag) = @_;
+    delete $self->{VALUE}{$tag};
+    delete $self->{FILE_ORDER}{$tag};
+    delete $self->{TAG_INFO}{$tag};
+    delete $self->{TAG_EXTRA}{$tag};
+}
+
+#------------------------------------------------------------------------------
+# Escape all elements of a value
+# Inputs: 0) value, 1) escape proc
+sub DoEscape($$)
+{
+    my ($val, $key);
+    if (not ref $_[0]) {
+        $_[0] = &{$_[1]}($_[0]);
+    } elsif (ref $_[0] eq 'ARRAY') {
+        foreach $val (@{$_[0]}) {
+            DoEscape($val, $_[1]);
+        }
+    } elsif (ref $_[0] eq 'HASH') {
+        foreach $key (keys %{$_[0]}) {
+            DoEscape($_[0]{$key}, $_[1]);
+        }
+    }
+}
+
+#------------------------------------------------------------------------------
+# Set the FileType and MIMEType tags
+# Inputs: 0) ExifTool object reference
+#         1) Optional file type (uses FILE_TYPE if not specified)
+#         2) Optional MIME type (uses our lookup if not specified)
+# Notes:  Will NOT set file type twice (subsequent calls ignored)
+sub SetFileType($;$$)
+{
+    my ($self, $fileType, $mimeType) = @_;
+    unless ($self->{VALUE}{FileType}) {
+        my $baseType = $self->{FILE_TYPE};
+        $fileType or $fileType = $baseType;
+        $mimeType or $mimeType = $mimeType{$fileType};
+        # use base file type if necessary (except if 'TIFF', which is a special case)
+        $mimeType = $mimeType{$baseType} unless $mimeType or $baseType eq 'TIFF';
+        $self->FoundTag('FileType', $fileType);
+        $self->FoundTag('MIMEType', $mimeType || 'application/unknown');
+    }
+}
+
+#------------------------------------------------------------------------------
+# Override the FileType and MIMEType tags
+# Inputs: 0) ExifTool object ref, 1) file type
+# Notes:  does nothing if FileType was not previously defined (ie. when writing)
+sub OverrideFileType($$)
+{
+    my ($self, $fileType) = @_;
+    if (defined $$self{VALUE}{FileType} and $fileType ne $$self{VALUE}{FileType}) {
+        $$self{VALUE}{FileType} = $fileType;
+        $$self{VALUE}{MIMEType} = $mimeType{$fileType} || 'application/unknown';
+        if ($$self{OPTIONS}{Verbose}) {
+            $self->VPrint(0,"$$self{INDENT}FileType [override] = $fileType\n");
+            $self->VPrint(0,"$$self{INDENT}MIMEType [override] = $$self{VALUE}{MIMEType}\n");
+        }
+    }
+}
+
+#------------------------------------------------------------------------------
+# Modify the value of the MIMEType tag
+# Inputs: 0) ExifTool object reference, 1) file or MIME type
+# Notes: combines existing type with new type: ie) a/b + c/d => c/b-d
+sub ModifyMimeType($;$)
+{
+    my ($self, $mime) = @_;
+    $mime =~ m{/} or $mime = $mimeType{$mime} or return;
+    my $old = $self->{VALUE}{MIMEType};
+    if (defined $old) {
+        my ($a, $b) = split '/', $old;
+        my ($c, $d) = split '/', $mime;
+        $d =~ s/^x-//;
+        $self->{VALUE}{MIMEType} = "$c/$b-$d";
+        $self->VPrint(0, "  Modified MIMEType = $c/$b-$d\n");
+    } else {
+        $self->FoundTag('MIMEType', $mime);
+    }
+}
+
+#------------------------------------------------------------------------------
+# Print verbose output
+# Inputs: 0) ExifTool ref, 1) verbose level (prints if level > this), 2-N) print args
+sub VPrint($$@)
+{
+    my $self = shift;
+    my $level = shift;
+    if ($self->{OPTIONS}{Verbose} and $self->{OPTIONS}{Verbose} > $level) {
+        my $out = $self->{OPTIONS}{TextOut};
+        print $out @_;
+    }
+}
+
+#------------------------------------------------------------------------------
+# Verbose dump
+# Inputs: 0) ExifTool ref, 1) data ref, 2-N) HexDump options
+sub VerboseDump($$;%)
+{
+    my $self = shift;
+    my $dataPt = shift;
+    if ($self->{OPTIONS}{Verbose} and $self->{OPTIONS}{Verbose} > 2) {
+        my %parms = (
+            Prefix => $self->{INDENT},
+            Out    => $self->{OPTIONS}{TextOut},
+            MaxLen => $self->{OPTIONS}{Verbose} < 4 ? 96 : undef,
+        );
+        HexDump($dataPt, undef, %parms, @_);
+    }
+}
+
+#------------------------------------------------------------------------------
+# Extract binary data from file
+# 0) ExifTool object reference, 1) offset, 2) length, 3) tag name if conditional
+# Returns: binary data, or undef on error
+# Notes: Returns "Binary data #### bytes" instead of data unless tag is
+#        specifically requested or the Binary option is set
+sub ExtractBinary($$$;$)
+{
+    my ($self, $offset, $length, $tag) = @_;
+    my ($isPreview, $buff);
+
+    if ($tag and $tag eq 'PreviewImage') {
+        # save PreviewImage start/length in case we want to dump trailer
+        $$self{PreviewImageStart} = $offset;
+        $$self{PreviewImageLength} = $length;
+        $isPreview = 1;
+    }
+    if ($tag and not $self->{OPTIONS}{Binary} and not $self->{OPTIONS}{Verbose} and
+        not $self->{REQ_TAG_LOOKUP}{lc($tag)})
+    {
+        return "Binary data $length bytes";
+    }
+    unless ($self->{RAF}->Seek($offset,0)
+        and $self->{RAF}->Read($buff, $length) == $length)
+    {
+        $tag or $tag = 'binary data';
+        if ($isPreview and not $$self{BuildingComposite}) {
+            $$self{PreviewError} = 1;
+        } else {
+            $self->Warn("Error reading $tag from file", $isPreview);
+        }
+        return undef;
+    }
+    return $buff;
+}
+
+#------------------------------------------------------------------------------
+# Process binary data
+# Inputs: 0) ExifTool object ref, 1) directory information ref, 2) tag table ref
+# Returns: 1 on success
+# Notes: dirInfo may contain VarFormatData (reference to empty list) to return
+#        details about any variable-length-format tags in the table (used when writing)
+sub ProcessBinaryData($$$)
+{
+    my ($self, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $offset = $$dirInfo{DirStart} || 0;
+    my $size = $$dirInfo{DirLen} || (length($$dataPt) - $offset);
+    my $base = $$dirInfo{Base} || 0;
+    my $verbose = $self->{OPTIONS}{Verbose};
+    my $unknown = $self->{OPTIONS}{Unknown};
+    my $dataPos = $$dirInfo{DataPos} || 0;
+
+    # get default format ('int8u' unless specified)
+    my $defaultFormat = $$tagTablePtr{FORMAT} || 'int8u';
+    my $increment = $formatSize{$defaultFormat};
+    unless ($increment) {
+        warn "Unknown format $defaultFormat\n";
+        $defaultFormat = 'int8u';
+        $increment = $formatSize{$defaultFormat};
+    }
+    # prepare list of tag numbers to extract
+    my @tags;
+    if ($unknown > 1 and defined $$tagTablePtr{FIRST_ENTRY}) {
+        # scan through entire binary table
+        @tags = ($$tagTablePtr{FIRST_ENTRY}..(int($size/$increment) - 1));
+        # add in floating point tag ID's if they exist
+        my @ftags = grep /\./, TagTableKeys($tagTablePtr);
+        @tags = sort { $a <=> $b } @tags, @ftags if @ftags;
+    } elsif ($$dirInfo{DataMember}) {
+        @tags = @{$$dirInfo{DataMember}};
+        $verbose = 0;   # no verbose output of extracted values when writing
+    } else {
+        # extract known tags in numerical order
+        @tags = sort { $a <=> $b } TagTableKeys($tagTablePtr);
+    }
+    $self->VerboseDir('BinaryData', undef, $size) if $verbose;
+    # avoid creating unknown tags for tags that fail condition if Unknown is 1
+    $$self{NO_UNKNOWN} = 1 if $unknown < 2;
+    my ($index, %val);
+    my $nextIndex = 0;
+    my $varSize = 0;
+    foreach $index (@tags) {
+        my ($tagInfo, $val, $saveNextIndex, $len, $mask, $wasVar);
+        if ($$tagTablePtr{$index}) {
+            $tagInfo = $self->GetTagInfo($tagTablePtr, $index);
+            unless ($tagInfo) {
+                next unless defined $tagInfo;
+                my $entry = int($index) * $increment + $varSize;
+                next if $entry >= $size;
+                my $more = $size - $entry;
+                $more = 128 if $more > 128;
+                my $v = substr($$dataPt, $entry+$offset, $more);
+                $tagInfo = $self->GetTagInfo($tagTablePtr, $index, \$v);
+                next unless $tagInfo;
+            }
+            next if $$tagInfo{Unknown} and
+                   ($$tagInfo{Unknown} > $unknown or $index < $nextIndex);
+        } else {
+            # don't generate unknown tags in binary tables unless Unknown > 1
+            next unless $unknown > 1;
+            next if $index < $nextIndex;    # skip if data already used
+            $tagInfo = $self->GetTagInfo($tagTablePtr, $index) or next;
+            $$tagInfo{Unknown} = 2;    # set unknown to 2 for binary unknowns
+        }
+        # get relative offset of this entry
+        my $entry = int($index) * $increment + $varSize;
+        my $more = $size - $entry;
+        last if $more <= 0;     # all done if we have reached the end of data
+        my $count = 1;
+        my $format = $$tagInfo{Format};
+        if (not $format) {
+            $format = $defaultFormat;
+        } elsif ($format eq 'string') {
+            # string with no specified count runs to end of block
+            $count = $more;
+        } elsif ($format eq 'pstring') {
+            $format = 'string';
+            $count = Get8u($dataPt, ($entry++)+$offset);
+            --$more;
+        } elsif (not $formatSize{$format}) {
+            if ($format =~ /(.*)\[(.*)\]/) {
+                # handle format count field
+                $format = $1;
+                $count = $2;
+                # evaluate count to allow count to be based on previous values
+                #### eval Format size (%val, $size, $self)
+                $count = eval $count;
+                $@ and warn("Format $$tagInfo{Name}: $@"), next;
+                next if $count < 0;
+                # allow a variable-length of any format type (with base $count = 1)
+                if ($format =~ s/^var_//) {
+                    $varSize += ($count - 1) * ($formatSize{$format} || 1);
+                    # save variable size data if required for writing
+                    if ($$dirInfo{VarFormatData}) {
+                        push @{$$dirInfo{VarFormatData}}, $index, $varSize;
+                    }
+                }
+            } elsif ($format =~ /^var_/) {
+                # handle variable-length string formats
+                $format = substr($format, 4);
+                pos($$dataPt) = $entry + $offset;
+                undef $count;
+                if ($format eq 'ustring') {
+                    $count = pos($$dataPt) - ($entry+$offset) if $$dataPt =~ /\G(..)*?\0\0/sg;
+                    $varSize -= 2;  # ($count includes base size of 2 bytes)
+                } elsif ($format eq 'pstring') {
+                    $count = Get8u($dataPt, ($entry++)+$offset);
+                    --$more;
+                } elsif ($format eq 'pstr32') {
+                    last if $more < 4;
+                    $count = Get32u($dataPt, $entry + $offset);
+                    $entry += 4;
+                    $more -= 4;
+                } elsif ($format eq 'int16u') {
+                    # int16u size of binary data to follow
+                    last if $more < 2;
+                    $count = Get16u($dataPt, $entry + $offset) + 2;
+                    $varSize -= 2;  # ($count includes size word)
+                    $format = 'undef';
+                } elsif ($$dataPt =~ /\0/g) {
+                    $count = pos($$dataPt) - ($entry+$offset);
+                    --$varSize;     # ($count includes base size of 1 byte)
+                }
+                $count = $more if not defined $count or $count > $more;
+                $varSize += $count; # shift subsequent indices
+                $val = substr($$dataPt, $entry+$offset, $count);
+                $val = $self->Decode($val, 'UCS2') if $format eq 'ustring';
+                $val =~ s/\0.*//s unless $format eq 'undef';  # truncate at null
+                $wasVar = 1;
+                # save variable size data if required for writing
+                if ($$dirInfo{VarFormatData}) {
+                    push @{$$dirInfo{VarFormatData}}, $index, $varSize;
+                }
+            }
+        }
+        # hook to allow format, etc to be set dynamically
+        if (defined $$tagInfo{Hook}) {
+            #### eval Hook ($format, $varSize)
+            eval $$tagInfo{Hook};
+            # save variable size data if required for writing (in case changed by Hook)
+            if ($$dirInfo{VarFormatData}) {
+                $#{$$dirInfo{VarFormatData}} -= 2 if $wasVar; # remove previous entries for this tag
+                push @{$$dirInfo{VarFormatData}}, $index, $varSize;
+            }
+        }
+        if ($unknown > 1) {
+            # calculate next valid index for unknown tag
+            my $ni = int $index;
+            $ni += (($formatSize{$format} || 1) * $count) / $increment unless $wasVar;
+            $saveNextIndex = $nextIndex;
+            $nextIndex = $ni unless $nextIndex > $ni;
+        }
+        # read value now if necessary
+        unless (defined $val and not $$tagInfo{SubDirectory}) {
+            $val = ReadValue($dataPt, $entry+$offset, $format, $count, $more);
+            $mask = $$tagInfo{Mask};
+            $val &= $mask if $mask;
+        }
+        if ($verbose and not $$tagInfo{Hidden}) {
+            if (not $$tagInfo{SubDirectory} or $$tagInfo{Format}) {
+                $len = $count * ($formatSize{$format} || 1);
+                $len = $more if $len > $more;
+            } else {
+                $len = $more;
+            }
+            $self->VerboseInfo($index, $tagInfo,
+                Table  => $tagTablePtr,
+                Value  => $val,
+                DataPt => $dataPt,
+                Size   => $len,
+                Start  => $entry+$offset,
+                Addr   => $entry+$offset+$base+$dataPos,
+                Format => $format,
+                Count  => $count,
+                Extra  => $mask ? sprintf(', mask 0x%.2x',$mask) : undef,
+            );
+        }
+        # parse nested BinaryData directories
+        if ($$tagInfo{SubDirectory}) {
+            my $subTablePtr = GetTagTable($tagInfo->{SubDirectory}{TagTable});
+            # use specified subdirectory length if given
+            if ($$tagInfo{Format} and $formatSize{$format}) {
+                $len = $count * $formatSize{$format};
+                $len = $more if $len > $more;
+            } else {
+                $len = $more;
+                if ($$subTablePtr{PROCESS_PROC} and
+                    $$subTablePtr{PROCESS_PROC} eq \&ProcessBinaryData)
+                {
+                    # the rest of the data will be printed in the subdirectory
+                    $nextIndex = $size / $increment;
+                }
+            }
+            my %subdirInfo = (
+                DataPt   => $dataPt,
+                DataPos  => $dataPos,
+                DirStart => $entry + $offset,
+                DirLen   => $len,
+                Base     => $base,
+            );
+            $self->ProcessDirectory(\%subdirInfo, $subTablePtr);
+            next;
+        }
+        if ($$tagInfo{IsOffset} and $$tagInfo{IsOffset} ne '3') {
+            my $exifTool = $self;
+            #### eval IsOffset ($val, $exifTool)
+            $val += $base + $$self{BASE} if eval $$tagInfo{IsOffset};
+        }
+        $val{$index} = $val;
+        unless ($self->FoundTag($tagInfo,$val)) {
+            # don't increment nextIndex if we didn't extract a tag
+            $nextIndex = $saveNextIndex if defined $saveNextIndex;
+        }
+    }
+    delete $$self{NO_UNKNOWN};
+    return 1;
+}
+
+#..............................................................................
+# Load .ExifTool_config file from user's home directory
+# (use of noConfig is now deprecated, use configFile = '' instead)
+until ($Image::ExifTool::noConfig) {
+    my $file = $Image::ExifTool::configFile;
+    if (not defined $file) {
+        my $config = '.ExifTool_config';
+        # get our home directory (HOMEDRIVE and HOMEPATH are used in Windows cmd shell)
+        my $home = $ENV{EXIFTOOL_HOME} || $ENV{HOME} ||
+                   ($ENV{HOMEDRIVE} || '') . ($ENV{HOMEPATH} || '') || '.';
+        # look for the config file in 1) the home directory, 2) the program dir
+        $file = "$home/$config";
+        -r $file or $file = ($0 =~ /(.*[\\\/])/ ? $1 : './') . $config;
+        -r $file or last;
+    } else {
+        length $file or last;   # filename of "" disables configuration
+        -r $file or warn("Config file not found\n"), last;
+    }
+    eval "require '$file'"; # load the config file
+    # print warning (minus "Compilation failed" part)
+    $@ and $_=$@, s/Compilation failed.*//s, warn $_;
+    if (@Image::ExifTool::UserDefined::Lenses) {
+        foreach (@Image::ExifTool::UserDefined::Lenses) {
+            $Image::ExifTool::userLens{$_} = 1;
+        }
+    }
+    last;
+}
+
+#------------------------------------------------------------------------------
+1;  # end
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool.pod
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool.pod	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool.pod	(revision 24799)
@@ -0,0 +1,2128 @@
+#------------------------------------------------------------------------------
+# File:         ExifTool.pod - Documentation for File::ExifTool
+#
+# Description:  Read and write meta information
+#
+# URL:          http://owl.phy.queensu.ca/~phil/exiftool/
+#
+# Legal:        Copyright (c) 2003-2010, Phil Harvey (phil at owl.phy.queensu.ca)
+#               This library is free software; you can redistribute it and/or
+#               modify it under the same terms as Perl itself.
+#------------------------------------------------------------------------------
+
+=head1 NAME
+
+Image::ExifTool - Read and write meta information
+
+=head1 SYNOPSIS
+
+  use Image::ExifTool qw(:Public);
+
+  # ---- Simple procedural usage ----
+
+  # Get hash of meta information tag names/values from an image
+  $info = ImageInfo('a.jpg');
+
+  # ---- Object-oriented usage ----
+
+  # Create a new Image::ExifTool object
+  $exifTool = new Image::ExifTool;
+
+  # Extract meta information from an image
+  $exifTool->ExtractInfo($file, \%options);
+
+  # Get list of tags in the order they were found in the file
+  @tagList = $exifTool->GetFoundTags('File');
+
+  # Get the value of a specified tag
+  $value = $exifTool->GetValue($tag, $type);
+
+  # Get a tag description
+  $description = $exifTool->GetDescription($tag);
+
+  # Get the group name associated with this tag
+  $group = $exifTool->GetGroup($tag, $family);
+
+  # Set a new value for a tag
+  $exifTool->SetNewValue($tag, $newValue);
+
+  # Write new meta information to a file
+  $success = $exifTool->WriteInfo($srcfile, $dstfile);
+
+  # ...plus a host of other useful methods...
+
+=head1 DESCRIPTION
+
+ExifTool provides an extensible set of perl modules to read and write meta
+information in a wide variety of files, including the maker note information
+of many digital cameras by various manufacturers such as Canon, Casio,
+FujiFilm, GE, HP, JVC/Victor, Kodak, Leaf, Minolta/Konica-Minolta, Nikon,
+Olympus/Epson, Panasonic/Leica, Pentax/Asahi, Reconyx, Ricoh, Samsung,
+Sanyo, Sigma/Foveon and Sony.
+
+Below is a list of file types and meta information formats currently
+supported by ExifTool (r = read, w = write, c = create):
+
+  File Types
+  ------------+-------------+-------------+-------------+------------
+  3FR   r     | DVB   r     | M4A/V r     | PBM   r/w   | RWL   r/w
+  3G2   r     | DYLIB r     | MEF   r/w   | PDF   r/w   | RWZ   r
+  3GP   r     | EIP   r     | MIE   r/w/c | PEF   r/w   | RM    r
+  ACR   r     | EPS   r/w   | MIFF  r     | PFA   r     | SO    r
+  AFM   r     | ERF   r/w   | MKA   r     | PFB   r     | SR2   r/w
+  AI    r/w   | EXE   r     | MKS   r     | PFM   r     | SRF   r
+  AIFF  r     | EXIF  r/w/c | MKV   r     | PGF   r     | SRW   r/w
+  APE   r     | F4A/V r     | MNG   r/w   | PGM   r/w   | SVG   r
+  ARW   r/w   | FLA   r     | MOS   r/w   | PICT  r     | SWF   r
+  ASF   r     | FLAC  r     | MOV   r     | PMP   r     | THM   r/w
+  AVI   r     | FLV   r     | MP3   r     | PNG   r/w   | TIFF  r/w
+  BMP   r     | FPX   r     | MP4   r     | PPM   r/w   | TTC   r
+  BTF   r     | GIF   r/w   | MPC   r     | PPT   r     | TTF   r
+  COS   r     | GZ    r     | MPG   r     | PPTX  r     | VRD   r/w/c
+  CR2   r/w   | HDP   r/w   | MPO   r/w   | PS    r/w   | VSD   r
+  CRW   r/w   | HTML  r     | MQV   r     | PSB   r/w   | WAV   r
+  CS1   r/w   | ICC   r/w/c | MRW   r/w   | PSD   r/w   | WDP   r/w
+  DCM   r     | IIQ   r/w   | MXF   r     | PSP   r     | WEBP  r
+  DCP   r/w   | IND   r/w   | NEF   r/w   | QTIF  r     | WEBM  r
+  DCR   r     | ITC   r     | NRW   r/w   | RA    r     | WMA   r
+  DFONT r     | JNG   r/w   | NUMBERS r   | RAF   r/w   | WMV   r
+  DIVX  r     | JP2   r/w   | ODP   r     | RAM   r     | X3F   r/w
+  DJVU  r     | JPEG  r/w   | ODS   r     | RAR   r     | XCF   r
+  DLL   r     | K25   r     | ODT   r     | RAW   r/w   | XLS   r
+  DNG   r/w   | KDC   r     | OGG   r     | RIFF  r     | XLSX  r
+  DOC   r     | KEY   r     | ORF   r/w   | RSRC  r     | XMP   r/w/c
+  DOCX  r     | LNK   r     | OTF   r     | RTF   r     | ZIP   r
+  DV    r     | M2TS  r     | PAGES r     | RW2   r/w   |
+
+  Meta Information
+  ----------------------+----------------------+---------------------
+  EXIF           r/w/c  |  CIFF           r/w  |  Ricoh RMETA    r
+  GPS            r/w/c  |  AFCP           r/w  |  Picture Info   r
+  IPTC           r/w/c  |  Kodak Meta     r/w  |  Adobe APP14    r
+  XMP            r/w/c  |  FotoStation    r/w  |  MPF            r
+  MakerNotes     r/w/c  |  PhotoMechanic  r/w  |  Stim           r
+  Photoshop IRB  r/w/c  |  JPEG 2000      r    |  APE            r
+  ICC Profile    r/w/c  |  DICOM          r    |  Vorbis         r
+  MIE            r/w/c  |  Flash          r    |  SPIFF          r
+  JFIF           r/w/c  |  FlashPix       r    |  DjVu           r
+  Ducky APP12    r/w/c  |  QuickTime      r    |  M2TS           r
+  PDF            r/w/c  |  Matroska       r    |  PE/COFF        r
+  PNG            r/w/c  |  GeoTIFF        r    |  AVCHD          r
+  Canon VRD      r/w/c  |  PrintIM        r    |  ZIP            r
+  Nikon Capture  r/w/c  |  ID3            r    |  (and more)
+
+=head1 CONFIGURATION
+
+User-defined tags can be added via the ExifTool configuration file, or by
+defining the %Image::ExifTool::UserDefined hash before calling any ExifTool
+methods.  See "ExifTool_config" in the ExifTool distribution for more
+details.
+
+By default ExifTool looks for a configuration file named ".ExifTool_config"
+first in your home directory, then in the directory of the application
+script, but a different file may be specified by setting the ExifTool
+C<configFile> variable before using Image::ExifTool.  For example:
+
+    BEGIN { $Image::ExifTool::configFile = '/Users/phil/myconfig.cfg' }
+    use Image::ExifTool;
+
+or the configuration feature may be disabled by setting C<configFile> to an
+empty string:
+
+    BEGIN { $Image::ExifTool::configFile = '' }
+    use Image::ExifTool;
+
+=head1 EXPORTS
+
+Exports nothing by default, but L</ImageInfo> and all static methods may be
+exported with the C<:Public> export list.
+
+=head1 METHODS
+
+All ExifTool features are accessed through the methods of the public
+interface listed below.  Other Image::ExifTool methods and modules should
+not be accessed directly because their interface may change with future
+versions.
+
+None of these methods should ever die or issue warnings to STDERR if called
+with the proper arguments (with the exception of L</SetNewValue> which
+returns an error string when called in list context, or sends the error to
+STDERR otherwise).  Error and warning messages that occur during processing
+are stored in the values of the Error and Warning tags, and are accessible
+via the L</GetValue> method.
+
+=head2 new
+
+Creates a new ExifTool object.
+
+    $exifTool = new Image::ExifTool;
+
+Note that ExifTool uses AUTOLOAD to load non-member methods, so any class
+using Image::ExifTool as a base class must define an AUTOLOAD which calls
+Image::ExifTool::DoAutoLoad().  ie)
+
+    sub AUTOLOAD
+    {
+        Image::ExifTool::DoAutoLoad($AUTOLOAD, @_);
+    }
+
+=head2 ImageInfo
+
+Read image file and return meta information.  This is the one step function
+for retrieving meta information from an image.  Internally, L</ImageInfo>
+calls L</ExtractInfo> to extract the information, L</GetInfo> to generate
+the information hash, and L</GetTagList> for the returned tag list.
+
+    # return meta information for 2 tags only (procedural)
+    $info = ImageInfo($filename, $tag1, $tag2);
+
+    # return information about an open image file (object-oriented)
+    $info = $exifTool->ImageInfo(\*FILE);
+
+    # return information from image data in memory for specified tags
+    %options = (PrintConv => 0);
+    @tagList = qw(filename imagesize xmp:creator exif:* -ifd1:*);
+    $info = ImageInfo(\$imageData, \@tagList, \%options);
+
+    # extract information from an embedded thumbnail image
+    $info = ImageInfo('image.jpg', 'thumbnailimage');
+    $thumbInfo = ImageInfo($$info{ThumbnailImage});
+
+=over 4
+
+=item Inputs:
+
+L</ImageInfo> is very flexible about the input arguments, and interprets
+them based on their type.  It may be called with one or more arguments.
+The one required argument is either a SCALAR (the image file name), a file
+reference (a reference to the image file) or a SCALAR reference (a
+reference to the image in memory).  Other arguments are optional.  The
+order of the arguments is not significant, except that the first SCALAR is
+taken to be the file name unless a file reference or scalar reference comes
+earlier in the argument list.
+
+Below is an explanation of how the L</ImageInfo> function arguments are
+interpreted:
+
+=over 4
+
+=item ExifTool ref
+
+L</ImageInfo> may be called with an ExifTool object if desired.  The
+advantage of using the object-oriented form is that the options may be set
+before calling L</ImageInfo>, and the object may be used afterward to access
+member functions.  Must be the first argument if used.
+
+=item SCALAR
+
+The first scalar argument is taken to be the file name unless an earlier
+argument specified the image data via a file reference (file ref) or data
+reference (SCALAR ref).  The remaining scalar arguments are names of tags
+for requested information.  All tags are returned if no tags are specified.
+
+Tag names are case-insensitive and may be prefixed by optional group names
+separated by colons.  A group name may begin with a family number (ie.
+'1IPTC:Keywords'), to restrict matches to a specific family.  In the tag
+name, a '?' matches any single character and a '*' matches zero or more
+characters.  Thus 'GROUP:*' represents all tags in a specific group. 
+Wildcards may not be used in group names, with the exception that a group
+name of '*' may be used to extract all available instances of a tag
+regardless of the L</Duplicates> setting (ie. '*:WhiteBalance').  Multiple
+groups may be specified (ie. 'EXIF:Time:*' extracts all EXIF Time tags). And
+finally, a leading '-' indicates a tag to be excluded (ie. '-IFD1:*'), or a
+trailing '#' causes the ValueConv value to be returned for this tag.
+
+Note that keys in the returned information hash and elements of the returned
+tag list are not necessarily the same as these tag names because group names
+are removed, the case may be changed, and an instance number may be added. 
+For this reason it is best to use either the keys of the returned hash or
+the elements of the tag array when accessing the tag values.
+
+See L<Image::ExifTool::TagNames|Image::ExifTool::TagNames> for a complete
+list of ExifTool tag names.
+
+=item File ref
+
+A reference to an open image file.  If you use this method (or a SCALAR
+reference) to access information in an image, the FileName and Directory
+tags will not be returned.  (Also, the FileSize, FileModifyDate and
+FilePermissions tags will not be returned unless it is a plain file.)  Image
+processing begins at the current file position, and on return the file
+position is unspecified.  May be either a standard filehandle, or a
+reference to a L<File::RandomAccess|File::RandomAccess> object.  Note that
+the file remains open and must be closed by the caller after L</ImageInfo>
+returns.
+
+[Advanced:  To allow a non-rewindable stream (ie. a network socket) to be
+re-read after processing with ExifTool, first wrap the file reference in a
+L<File::RandomAccess|File::RandomAccess> object, then pass this object to
+L</ImageInfo>.  The L<File::RandomAccess|File::RandomAccess> object will
+buffer the file if necessary, and may be used to re-read the file after
+L</ImageInfo> returns.]
+
+=item SCALAR ref
+
+A reference to image data in memory.
+
+=item ARRAY ref
+
+Reference to a list of tag names.  On entry, any elements in the list are
+added to the list of requested tags.  Tags with names beginning with '-' are
+excluded.  On return, this list is updated to contain an ordered list of tag
+keys for the returned information.
+
+There will be 1:1 correspondence between the requested tags and the returned
+tag keys only if the L</Duplicates> option is 0 and L</Sort> is 'Input'. 
+(With L</Duplicates> enabled, there may be more entries in the returned list
+of tag keys, and with other L</Sort> settings the entries may not be in the
+same order as requested.)
+
+=item HASH ref
+
+Reference to a hash containing the options settings.  See L</Options>
+documentation below for a list of available options.  Options specified
+as arguments to L</ImageInfo> take precedence over L</Options> settings.
+
+=back
+
+=item Return Values:
+
+L</ImageInfo> returns a reference to a hash of tag key/value pairs.  The tag
+keys are identifiers, which are similar to the tag names but may have an
+embedded instance number if multiple tags with the same name were extracted
+from the image.  Many of the ExifTool functions require a tag key as an
+argument. Use L</GetTagName [static]> to get the tag name for a given tag
+key.  Note that the case of the tag names may not be the same as requested.
+Here is a simple example to print out the information returned by
+L</ImageInfo>:
+
+    foreach (sort keys %$info) {
+        print "$_ => $$info{$_}\n";
+    }
+
+Values of the returned hash are usually simple scalars, but a scalar
+reference is used to indicate binary data and an array reference may be used
+to indicate a list.  Also, a hash reference may be returned if the L</Struct>
+option is used.  Lists of values are joined by commas into a single
+string only if the PrintConv option is enabled and the List option is
+disabled (which are the defaults).  Note that binary values are not
+necessarily extracted unless specifically requested or the Binary option is
+set.  If not extracted the value is a reference to a string of the form
+"Binary data ##### bytes".
+
+The code below gives an example of how to handle these return values, as
+well as illustrating the use of other ExifTool functions:
+
+    use Image::ExifTool;
+    my $exifTool = new Image::ExifTool;
+    $exifTool->Options(Unknown => 1);
+    my $info = $exifTool->ImageInfo('a.jpg');
+    my $group = '';
+    my $tag;
+    foreach $tag ($exifTool->GetFoundTags('Group0')) {
+        if ($group ne $exifTool->GetGroup($tag)) {
+            $group = $exifTool->GetGroup($tag);
+            print "---- $group ----\n";
+        }
+        my $val = $info->{$tag};
+        if (ref $val eq 'SCALAR') {
+            if ($$val =~ /^Binary data/) {
+                $val = "($$val)";
+            } else {
+                my $len = length($$val);
+                $val = "(Binary data $len bytes)";
+            }
+        }
+        printf("%-32s : %s\n", $exifTool->GetDescription($tag), $val);
+    }
+
+=item Notes:
+
+ExifTool returns all values as byte strings of encoded characters.  Perl
+wide characters are not used.  See L</CHARACTER ENCODINGS> for details about
+the encodings.
+
+As well as tags representing information extracted from the image,
+the following tags generated by ExifTool may be returned:
+
+    ExifToolVersion - The ExifTool version number.
+
+    Error - An error message if the image could not be processed.
+
+    Warning - A warning message if problems were encountered while
+              processing the image.
+
+=back
+
+=head2 Options
+
+Get/set ExifTool options.  This function can be called to set the default
+options for an ExifTool object.  Options set this way are in effect for
+all function calls but may be overridden by options passed as arguments
+to some functions.
+
+The initial default options are obtained from values in the
+%Image::ExifTool::UserDefined::Options hash if it exists.  See the
+.ExifTool_config file in the full ExifTool distribution for details.
+
+    # exclude the 'OwnerName' tag from returned information
+    $exifTool->Options(Exclude => 'OwnerName');
+
+    # only get information in EXIF or MakerNotes groups
+    $exifTool->Options(Group0 => ['EXIF', 'MakerNotes']);
+
+    # ignore information from IFD1
+    $exifTool->Options(Group1 => '-IFD1');
+
+    # sort by groups in family 2, and extract unknown tags
+    $exifTool->Options(Sort => 'Group2', Unknown => 1);
+
+    # reset DateFormat option
+    $exifTool->Options(DateFormat => undef);
+
+    # do not extract duplicate tag names
+    $oldSetting = $exifTool->Options(Duplicates => 0);
+
+    # get current Verbose setting
+    $isVerbose = $exifTool->Options('Verbose');
+
+=over 4
+
+=item Inputs:
+
+0) ExifTool object reference.
+
+1) Option parameter name.
+
+2) [optional] Option parameter value (may be undef to clear option).
+
+3-N) [optional] Additional parameter/value pairs.
+
+=item Option Parameters:
+
+=over 4
+
+=item Binary
+
+Flag to extract the value data for all binary tags.  Tag values representing
+large binary data blocks (ie. ThumbnailImage) are not necessarily extracted
+unless this option is set or the tag is specifically requested by name.
+Default is 0.
+
+=item ByteOrder
+
+The byte order for newly created EXIF segments when writing.  Note that if
+EXIF information already exists, the existing order is maintained.  Valid
+values are 'MM', 'II' and undef.  If ByteOrder is not defined (the default),
+then the maker note byte order is used (if they are being copied), otherwise
+big-endian ('MM') order is assumed.  This can also be set via the
+ExifByteOrder tag, but the ByteOrder option takes precedence if both are
+set.
+
+=item Charset
+
+Character set for encoding character strings passed to/from ExifTool with
+code points above U+007F.  Default is UTF8.  Valid values are listed below,
+case is not significant:
+
+  Value        Alias(es)        Description
+  -----------  ---------------  ----------------------------------
+  UTF8         cp65001, UTF-8   UTF-8 characters
+  Latin        cp1252, Latin1   Windows Latin1 (West European)
+  Latin2       cp1250           Windows Latin2 (Central European)
+  Cyrillic     cp1251, Russian  Windows Cyrillic
+  Greek        cp1253           Windows Greek
+  Turkish      cp1254           Windows Turkish
+  Hebrew       cp1255           Windows Hebrew
+  Arabic       cp1256           Windows Arabic
+  Baltic       cp1257           Windows Baltic
+  Vietnam      cp1258           Windows Vietnamese
+  Thai         cp874            Windows Thai
+  MacRoman     cp10000, Roman   Macintosh Roman
+  MacLatin2    cp10029          Macintosh Latin2 (Central Europe)
+  MacCyrillic  cp10007          Macintosh Cyrillic
+  MacGreek     cp10006          Macintosh Greek
+  MacTurkish   cp10081          Macintosh Turkish
+  MacRomanian  cp10010          Macintosh Romanian
+  MacIceland   cp10079          Macintosh Icelandic
+  MacCroatian  cp10082          Macintosh Croatian
+
+Note that this option affects some types of information when reading/writing
+the file and other types when getting/setting tag values, so it must be
+defined for both types of access.
+
+=item CharsetID3
+
+Character encoding to assume for ID3v1 strings.  By the specification ID3v1
+strings should be encoded in ISO 8859-1 (essentially Latin), but some
+applications may use local encoding instead.  Default is Latin.
+
+=item CharsetIPTC
+
+Fallback IPTC character set to assume if IPTC information contains no
+CodedCharacterSet tag.  Possible values are the same as the L</Charset>
+option.  Default is Latin.
+
+Note that this option affects some types of information when reading/writing
+the file and other types when getting/setting tag values, so it must be
+defined for both types of access.
+
+=item CharsetPhotoshop
+
+Character encoding to assume for Photoshop IRB resource names.  Default is
+Latin.
+
+=item Compact
+
+Flag to write compact output.  Default is 0.  The XMP specification suggests
+that the data be padded with blanks to allow in-place editing.  With this
+flag set the 2kB of padding is not written.  Note that this only effects
+embedded XMP since padding is never written for stand-alone XMP files.
+
+=item Composite
+
+Flag to calculate Composite tags automatically.  Default is 1.
+
+=item Compress
+
+Flag to write new values in compressed format if possible.  Has no effect
+unless Compress::Zlib is installed.  Default is 0.
+
+=item CoordFormat
+
+Format for printing GPS coordinates.  This is a printf format string with
+specifiers for degrees, minutes and seconds in that order, however minutes
+and seconds may be omitted.  For example, the following table gives the
+output for the same coordinate using various formats:
+
+      CoordFormat        Example Output
+  -------------------  ------------------
+  q{%d deg %d' %.2f"}  54 deg 59' 22.80"  (default for reading)
+  q{%d %d %.8f}        54 59 22.80000000  (default for copying)
+  q{%d deg %.4f min}   54 deg 59.3800 min
+  q{%.6f degrees}      54.989667 degrees
+
+Note:  To avoid loss of precision, the default coordinate format is
+different when copying tags with L</SetNewValuesFromFile>.
+
+=item DateFormat
+
+Format for printing date/time values.  See C<strftime> in the L<POSIX>
+package for details about the format string.  The default is similar to a
+format of "%Y:%m:%d %H:%M:%S".  If date can not be converted, value is left
+unchanged unless the StrictDate option is set.  Timezones are ignored.
+
+=item Duplicates
+
+Flag to return values from tags with duplicate names when extracting
+information.  Default is 1.
+
+=item Escape
+
+Escape special characters in extracted values for HTML or XML.  Also
+unescapes HTML or XML character entities in input values passed to
+L</SetNewValue>.  Valid settings are 'HTML', 'XML' or undef.  Default is
+undef.
+
+=item Exclude
+
+Exclude specified tags from tags extracted from an image.  The option value
+is either a tag name or reference to a list of tag names to exclude.  The
+case of tag names is not significant.  This option is ignored for
+specifically requested tags.  Tags may also be excluded by preceeding their
+name with a '-' in the arguments to L</ImageInfo>.
+
+=item ExtractEmbedded
+
+Flag to extract information from embedded documents in EPS and PDF files,
+embedded MPF images in JPEG and MPO files, streaming metadata in AVCHD
+videos, and the resource fork of Mac OS files.  Default is 0.
+
+=item FastScan
+
+Flag to increase speed of extracting information from JPEG images.  With
+this option set to 1, ExifTool will not scan to the end of a JPEG image to
+check for an AFCP, CanonVRD, FotoStation, PhotoMechanic, MIE or PreviewImage
+trailer.  This also stops the parsing after the first comment in GIF images,
+and at the audio/video data with RIFF-format files (AVI, WAV, etc), so any
+trailing metadata (ie. XMP written by some utilities) may be missed.  When
+combined with the ScanForXMP option, prevents scanning for XMP in recognized
+file types.  With a value of 2, ExifTool will also avoid extracting any EXIF
+MakerNote information.  Default is 0.
+
+=item FixBase
+
+Fix maker notes base offset.  A common problem with image editing software
+is that offsets in the maker notes are not adjusted properly when the file
+is modified.  This may cause the wrong values to be extracted for some maker
+note entries when reading the edited file.  FixBase specifies an integer
+value to be added to the maker notes base offset.  It may also be set to the
+empty string ('') for ExifTool will take its best guess at the correct base,
+or undef (the default) for no base adjustment.
+
+=item GeoMaxIntSecs
+
+Maximum interpolation time in seconds for geotagging.  Geotagging fails if
+the Geotime value lies between two fixes in the same track which are
+separated by a number of seconds greater than this.  Default is 1800.
+
+=item GeoMaxExtSecs
+
+Maximum extrapolation time in seconds for geotagging.  Geotagging fails if
+the Geotime value lies outside a GPS track by a number of seconds greater
+than this.  Default is 1800.
+
+=item GeoMaxHDOP
+
+Maximum Horizontal (2D) Dilution Of Precision for geotagging.  GPS fixes are
+ignored if the HDOP is greater than this.  Default is undef.
+
+=item GeoMaxPDOP
+
+Maximum Position (3D) Dilution Of Precision for geotagging.  GPS fixes are
+ignored if the PDOP is greater than this.  Default is undef.
+
+=item GeoMinSats
+
+Minimum number of satellites for geotagging.  GPS fixes are ignored if the
+number of acquired satellites is less than this.  Default is undef.
+
+=item Group#
+
+Extract tags only for specified groups in family # (Group0 assumed if #
+not given).  The option value may be a single group name or a reference
+to a list of groups.  Case is significant in group names.  Specify a group
+to be excluded by preceding group name with a '-'.  See L</GetGroup> for a
+description of group families, and L</GetAllGroups [static]> for lists of
+group names.
+
+=item HtmlDump
+
+Dump information in hex to dynamic HTML web page.  The value may be 0-3 for
+increasingly larger limits on the maximum block size.  Default is 0.  Output
+goes to the file specified by the TextOut option (\*STDOUT by default).
+
+=item HtmlDumpBase
+
+Specifies base for HTML dump offsets.  If not defined, the EXIF/TIFF base
+offset is used.  Set to 0 for absolute offsets.  Default is undef.
+
+=item IgnoreMinorErrors
+
+Flag to ignore minor errors.  Causes minor errors to be downgraded to
+warnings, and minor warnings to be ignored.  This option is provided mainly
+to allow writing of files when minor errors occur, but by ignoring some
+minor warnings the behaviour of ExifTool may be changed to allow some
+questionable operations to proceed (such as extracting thumbnail and preview
+images even if they don't have a recognizable header).  Minor
+errors/warnings are denoted by '[minor]' at the start of the message.
+
+=item Lang
+
+Localized language for exiftool tag descriptions, etc.  Available languages
+are given by the Image::ExifTool::Lang module names (ie. 'fr').  If the
+specified language isn't available, the option is not changed.  May be set
+to undef to select the built-in default language.  Default is 'en'.
+
+=item LargeFileSupport
+
+Flag to indicate that 64-bit file offsets are supported on this system.
+Default is 0.
+
+=item List
+
+Flag to extract lists of PrintConv values into arrays instead of joining
+them into a string of values.  The L</ListSep> option specifies the
+separator used when combining values.  Default is 0.
+
+=item ListSep
+
+Separator string used to join lists of PrintConv values when L</List> option
+is not set.  Default is ', '.
+
+=item ListSplit
+
+Regular expression used to split values of list-type tags into individual
+items when writing.  (ie. use ',\\s*' to split a comma-separated list.) 
+Default is undef.
+
+=item MakerNotes
+
+Option to extract MakerNotes and other writable subdirectories (such as
+PrintIM) as a data block.  Normally when the MakerNotes are extracted they
+are rebuilt to include data outside the boundaries of the original maker
+note data block, but a value of 2 disables this feature.  Possible values
+are:
+
+  0 - Do not extract writable subdirectories (default)
+  1 - Extract and rebuild maker notes into self-contained block
+  2 - Extract without rebuilding maker notes
+
+=item MissingTagValue
+
+Value for missing tags in expressions evaluated by L</SetNewValuesFromFile>.
+If not set, a minor error is issued for missing values, or the value is set
+to '' if L</IgnoreMinorErrors> is set.  Default is undef.
+
+=item Password
+
+Password for processing password-protected PDF documents.  Ignored if a
+password is not required.  Character encoding of the password is determined
+by the value of the Charset option at processing time.  Default is undef.
+
+=item PrintConv
+
+Flag to enable automatic print conversion.  Also enables inverse
+print conversion for writing.  Default is 1.
+
+=item ScanForXMP
+
+Flag for scan all files (even unrecognized formats) for XMP information
+unless XMP was already found in the file.  When combined with the FastScan
+option, only unrecognized file types are scanned for XMP.  Default is 0.
+
+=item Sort
+
+Specifies order to sort tags in returned list:
+
+  Input  - Sort in same order as input tag arguments (default)
+  Alpha  - Sort alphabetically
+  File   - Sort in order that tags were found in the file
+  Group# - Sort by tag group, where # is zero or more family
+           numbers separated by colons. If # is not specified,
+           Group0 is assumed.  See GetGroup for a description
+           of group families.
+
+=item StrictDate
+
+Flag to return undefined value for any date which can't be converted when
+the DateFormat option is used.  Default is undef.
+
+=item Struct
+
+Flag to return XMP structures as hash references instead of flattening into
+individual tags.  If not defined (the default), tags are flattened when
+reading (with L<ExtractInfo>), and structured when copying (with
+L</SetNewValuesFromFile>).  Has no effect when writing since both flattened
+and structured tags may always be written.  Possible values are:
+
+  undef - Read flattened tags, copy structured tags (default)
+    0   - Read and copy flattened tags
+    1   - Read and copy structured tags
+
+=item TextOut
+
+Output file reference for Verbose and HtmlDump options.  Default is
+\*STDOUT.
+
+=item Unknown
+
+Flag to get the values of unknown tags.  If set to 1, unknown tags are
+extracted from EXIF (or other tagged-format) directories.  If set to 2,
+unknown tags are also extracted from binary data blocks.  Default is 0.
+
+=item Verbose
+
+Print verbose messages to file specified by TextOut option.  Value may be
+from 0 to 5 for increasingly verbose messages.  Default is 0.  With the
+verbose option set, messages are printed to the console as the file is
+parsed.  Level 1 prints the tag names and raw values.  Level 2 adds more
+details about the tags.  Level 3 adds a hex dump of the tag data, but with
+limits on the number of bytes dumped.  Levels 4 and 5 remove the dump limit
+on tag values and JPEG segment data respectively.
+
+=back
+
+=item Return Values:
+
+The original value of the last specified parameter.
+
+=back
+
+=head2 ClearOptions
+
+Reset all options to their default values.  Loads user-defined default
+option values from the %Image::ExifTool::UserDefined::Options hash in the
+.ExifTool_config file if it exists.
+
+    $exifTool->ClearOptions();
+
+=over 4
+
+=item Inputs:
+
+0) ExifTool object reference
+
+=item Return Values:
+
+(none)
+
+=back
+
+=head2 ExtractInfo
+
+Extract all meta information from an image.
+
+    $success = $exifTool->ExtractInfo('image.jpg', \%options);
+
+=over 4
+
+=item Inputs:
+
+L</ExtractInfo> takes exactly the same arguments as L</ImageInfo>.  The only
+difference is that a list of tag keys is not returned if an ARRAY reference
+is given.  The following options are effective in the call to
+L</ExtractInfo>:
+
+Binary, Charset, CharsetID3, CharsetIPTC, Composite, ExtractEmbedded,
+FastScan, FixBase, HtmlDump, HtmlDumpBase, IgnoreMinorErrors, Lang,
+LargeFileSupport, MakerNotes, ScanForXMP, Struct, TextOut, Unknown and
+Verbose.
+
+=item Return Value:
+
+1 if this was a recognized file format, 0 otherwise (and 'Error' tag set).
+
+=back
+
+=head2 GetInfo
+
+L</GetInfo> is called to return meta information after it has been extracted
+from the image by a previous call to L</ExtractInfo> or L</ImageInfo>. This
+function may be called repeatedly after a single call to L</ExtractInfo> or
+L</ImageInfo>.
+
+    # get image width and hieght only
+    $info = $exifTool->GetInfo('ImageWidth', 'ImageHeight');
+
+    # get information for all tags in list (list updated with tags found)
+    $info = $exifTool->GetInfo(\@ioTagList);
+
+    # get all information in Author or Location groups
+    $info = $exifTool->GetInfo({Group2 => ['Author', 'Location']});
+
+=over 4
+
+=item Inputs:
+
+Inputs are the same as L</ExtractInfo> and L</ImageInfo> except that an
+image can not be specified.  Options in effect are:
+
+Charset, CoordFormat, DateFormat, Duplicates, Escape, Exclude, Group#, Lang,
+List, ListSep, PrintConv, Sort (if a tag list reference is given) and
+StrictDate.
+
+=item Return Value:
+
+Reference to information hash, the same as with L</ImageInfo>.
+
+=back
+
+=head2 WriteInfo
+
+Write meta information to a file.  The specified source file is rewritten to
+the same-type destination file with new information as specified by previous
+calls to L</SetNewValue>.  The necessary segments and/or directories are
+created in the destination file as required to store the specified
+information.  May be called repeatedly to write the same information to
+additional files without the need to call L</SetNewValue> again.
+
+    # add information to a source file, writing output to new file
+    $exifTool->WriteInfo($srcfile, $dstfile);
+
+    # create XMP data file from scratch
+    $exifTool->WriteInfo(undef, $dstfile, 'XMP');
+
+    # overwrite file (you do have backups, right?)
+    $exifTool->WriteInfo($srcfile);
+
+=over 4
+
+=item Inputs:
+
+0) ExifTool object reference
+
+1) Source file name, file reference, scalar reference, or undef to create a
+file from scratch
+
+2) [optional] Destination file name, file reference, scalar reference, or
+undef to overwrite the original file
+
+3) [optional] Destination file type
+
+=item Return Value:
+
+1 if file was written OK, 2 if file was written but no changes made, 0 on
+file write error.
+
+If an error code is returned, an Error tag is set and GetValue('Error') can
+be called to obtain the error description.  A Warning tag may be set even if
+this routine is successful.  Calling WriteInfo clears any pre-existing Error
+and Warning tags.
+
+    $errorMessage = $exifTool->GetValue('Error');
+    $warningMessage = $exifTool->GetValue('Warning');
+
+=item Notes:
+
+The source file name may be undefined to create a file from scratch
+(currently only XMP, MIE, ICC, VRD and EXIF files can be created in this way
+-- see L</CanCreate> for details).  If undefined, the destination file type
+is required unless the type can be determined from the destination file
+name.
+
+If a destination file name is given, the specified file must not exist
+because an existing destination file will not be overwritten.  The
+destination file name may be undefined to overwrite the original file (make
+sure you have backups!).  In this case, if a source file name is provided, a
+temporary file is created and renamed to replace the source file if no
+errors occurred while writing.  Otherwise, if a source file reference or
+scalar reference is used, the image is first written to memory then copied
+back to replace the original if there were no errors.
+
+The destination file type is only used if the source file is undefined.
+
+On Mac OS systems, the file resource fork is preserved if this routine is
+called with a source file name.
+
+=back
+
+The following ExifTool options are effective in the call to L</WriteInfo>:
+
+ByteOrder, Charset, CharsetID3, CharsetIPTC, Compact, Compress, FixBase,
+IgnoreMinorErrors and Verbose.
+
+=head2 CombineInfo
+
+Combine information from more than one information hash into a single hash.
+
+    $info = $exifTool->CombineInfo($info1, $info2, $info3);
+
+=over 4
+
+=item Inputs:
+
+0) ExifTool object reference
+
+1-N) Information hash references
+
+=back
+
+If the Duplicates option is disabled and duplicate tags exist, the order of
+the hashes is significant.  In this case, the value used is the first value
+found as the hashes are scanned in order of input.  The Duplicates option
+is the only option that is in effect for this function.
+
+=head2 GetTagList
+
+Get a sorted list of tags from the specified information hash or tag list.
+
+    @tags = $exifTool->GetTagList($info, 'Group0');
+
+=over 4
+
+=item Inputs:
+
+0) ExifTool object reference,
+
+1) [optional] Information hash reference or tag list reference,
+
+2) [optional] Sort order ('File', 'Input', 'Alpha' or 'Group#').
+
+If the information hash or tag list reference is not provided, then the list
+of found tags from the last call to L</ImageInfo>, L</ExtractInfo> or
+L</GetInfo> is used instead, and the result is the same as if
+L</GetFoundTags> was called.  If sort order is not specified, the sort order
+is taken from the current options settings.
+
+=item Return Values:
+
+A list of tag keys in the specified order.
+
+=back
+
+=head2 GetFoundTags
+
+Get list of found tags in specified sort order.  The found tags are the tags
+for the information obtained from the most recent call to L</ImageInfo>,
+L</ExtractInfo> or L</GetInfo> for this object.
+
+    @tags = $exifTool->GetFoundTags('File');
+
+=over 4
+
+=item Inputs:
+
+0) ExifTool object reference
+
+1) [optional] Sort order ('File', 'Input', 'Alpha' or 'Group#')
+
+If sort order is not specified, the sort order from the ExifTool options is
+used.
+
+=item Return Values:
+
+A list of tag keys in the specified order.
+
+=back
+
+=head2 GetRequestedTags
+
+Get list of requested tags.  These are the tags that were specified in the
+arguments of the most recent call to L</ImageInfo>, L</ExtractInfo> or
+L</GetInfo>, including tags specified via a tag list reference. Shortcut
+tags are expanded in the list.
+
+    @tags = $exifTool->GetRequestedTags();
+
+=over 4
+
+=item Inputs:
+
+(none)
+
+=item Return Values:
+
+List of requested tag keys in the same order that the tags were specified.
+Note that this list will be empty if tags were not specifically requested
+(ie. If extracting all tags).
+
+=back
+
+=head2 GetValue
+
+Get the value of a specified tag.  The returned value is either the
+human-readable (PrintConv) value, the converted machine-readable (ValueConv)
+value, or the original raw (Raw) value.  If the value type is not specified,
+the PrintConv value is returned if the PrintConv option is set, otherwise
+the ValueConv value is returned.  The PrintConv values are same as the
+values returned by L</ImageInfo> and L</GetInfo> in the tag/value hash
+unless the PrintConv option is disabled.
+
+Tags which represent lists of multiple values (as may happen with 'Keywords'
+for example) are handled specially.  In scalar context, the returned
+PrintConv value for these tags is either a string of values or a list
+reference (depending on the List option setting), and the ValueConv value is
+always a list reference.  But in list context, L</GetValue> always returns
+the list itself.
+
+Note that L</GetValue> requires a case-sensitive tag key as an argument.  To
+retrieve tag information based on a case-insensitive tag name (with an
+optional group specifier), use L</GetInfo> instead.
+
+    # PrintConv example
+    my $val = $exifTool->GetValue($tag);
+    if (ref $val eq 'SCALAR') {
+        print "$tag = (unprintable value)\n";
+    } else {
+        print "$tag = $val\n";
+    }
+
+    # ValueConv examples
+    my $val = $exifTool->GetValue($tag, 'ValueConv');
+    if (ref $val eq 'ARRAY') {
+        print "$tag is a list of values\n";
+    } elsif (ref $val eq 'SCALAR') {
+        print "$tag represents binary data\n";
+    } else {
+        print "$tag is a simple scalar\n";
+    }
+
+    my @keywords = $exifTool->GetValue('Keywords', 'ValueConv');
+
+The following options are in effect when <L/GetValue> is called:
+
+Charset, CoordFormat, DateFormat, Escape, Lang, List, ListSep, PrintConv and
+StrictDate.
+
+=over 4
+
+=item Inputs:
+
+0) ExifTool object reference
+
+1) Tag key
+
+2) [optional] Value type, 'PrintConv', 'ValueConv', 'Both' or 'Raw'
+
+The default value type is 'PrintConv' if the PrintConv option is set,
+otherwise the default is 'ValueConv'.  A value type of 'Both' returns both
+ValueConv and PrintConv values as a list.
+
+=item Return Values:
+
+The value of the specified tag.  If the tag represents a list of values and
+the List option is disabled then PrintConv returns a string of values,
+otherwise a reference to the list is returned in scalar context.  The list
+itself is returned in list context.  Values may also be scalar references to
+binary data, or hash references if the Struct option is set.
+
+Note: It is possible for L</GetValue> to return an undefined ValueConv or
+PrintConv value (or an empty list in list context) even if the tag exists,
+since it is possible for these conversions to yield undefined values.
+
+=back
+
+=head2 SetNewValue
+
+Set the new value for a tag.  The routine may be called multiple times to
+set the values of many tags before using L</WriteInfo> to write the new
+values to an image.
+
+For list-type tags (like Keywords), either call repeatedly with the same tag
+name for each value, or call with a reference to the list of values.
+
+    # set a new value for a tag (errors go to STDERR)
+    $success = $exifTool->SetNewValue($tag, $value);
+
+    # set a new value and capture any error message
+    ($success, $errStr) = $exifTool->SetNewValue($tag, $value);
+
+    # delete information for specified tag if it exists in image
+    # (also resets AddValue and DelValue options for this tag)
+    $exifTool->SetNewValue($tag);
+
+    # reset all values from previous calls to SetNewValue()
+    $exifTool->SetNewValue();
+
+    # delete a specific keyword
+    $exifTool->SetNewValue('Keywords', $word, DelValue => 1);
+
+    # set keywords (a List-type tag) with two new values
+    $exifTool->SetNewValue(Keywords => 'word1');
+    $exifTool->SetNewValue(Keywords => 'word2');
+    # equivalent, but set both in one call using an array reference
+    $exifTool->SetNewValue(Keywords => ['word1','word2']);
+
+    # add a keyword without replacing existing keywords in the file
+    $exifTool->SetNewValue(Keywords => $word, AddValue => 1);
+
+    # set a tag in a specific group
+    $exifTool->SetNewValue(Headline => $val, Group => 'XMP');
+    $exifTool->SetNewValue('XMP:Headline' => $val);  # (equivalent)
+
+    # shift original date/time back by 1 hour
+    $exifTool->SetNewValue(DateTimeOriginal => '1:00', Shift => -1);
+
+    # write a tag only if it had a specific value
+    # (the order of the following calls is not significant)
+    $exifTool->SetNewValue(Title => $oldVal, DelValue => 1);
+    $exifTool->SetNewValue(Title => $newVal);
+
+    # write tag by numerical value
+    $exifTool->SetNewValue(Orientation => 6, Type => 'ValueConv');
+    $exifTool->SetNewValue('Orientation#' => 6);  # (equivalent)
+
+    # delete all but EXIF tags
+    $exifTool->SetNewValue('*');  # delete all...
+    $exifTool->SetNewValue('EXIF:*', undef, Replace => 2); # ...but EXIF
+
+    # write structured information as a HASH reference
+    $exifTool->SetNewValue('XMP:Flash' => {
+        mode   => 'on',
+        fired  => 'true',
+        return => 'not'
+    });
+
+    # write structured information as a serialized string
+    $exifTool->SetNewValue('XMP:Flash'=>'{mode=on,fired=true,return=not}');
+
+(See L<http://owl.phy.queensu.ca/~phil/exiftool/struct.html#Serialize> for
+a description of the structure serialization technique.)
+
+=over 4
+
+=item Inputs:
+
+0) ExifTool object reference
+
+1) [optional] Tag key or tag name, or undef to clear all new values.  A tag
+name of '*' can be used when deleting tags to delete all tags, or all tags
+in a specified group.  The tag name may be prefixed by group name, separated
+by a colon (ie. 'EXIF:Artist'), which is equivalent to using a Group option
+argument.  Also, a '#' may be appended to the tag name (ie.
+'EXIF:Orientation#'), with the same effect as setting Type to 'ValueConv'.
+
+2) [optional] New value for tag.  Undefined to delete tag from file.  May be
+a scalar, scalar reference, list reference to set a list of values, or hash
+reference for a structure.  Integer values may be specified as a hexadecimal
+string (with a leading '0x'), and simple rational values may be specified in
+fractional form (ie. '4/10').  Structure tags may be specified either as a
+hash reference or a serialized string (see the last two examples above).
+
+3-N) [optional] SetNewValue option/value pairs (see below).
+
+=item SetNewValue Options:
+
+=over 4
+
+=item AddValue
+
+Specifies that the value be added to an existing list rather than replacing
+the list.  Valid values are 0 or 1.  Default is 0.
+
+=item DelValue
+
+Delete the existing tag if it has the specified value.  Valid values are
+0 or 1.  Default is 0.
+
+=item EditGroup
+
+Create tags in existing groups only.  Don't create new group.  Valid values
+are 0 and 1.  Default is 0.
+
+=item EditOnly
+
+Edit tag only if it already exists.  Don't create new tag.  Valid values are
+0 and 1.  Default is 0.
+
+=item Group
+
+Specifies group name where tag should be written.  If not specified, tag is
+written to highest priority group as specified by L</SetNewGroups>.  Any
+family 0 or 1 group name may be used.  Case is not significant.
+
+=item NoShortcut
+
+Disables default behaviour of looking up tag in shortcuts if not found
+otherwise.
+
+=item Protected
+
+Bit mask for tag protection levels to write.  Bit 0x01 allows writing of
+'unsafe' tags (ie. tags not copied automatically via
+L</SetNewValuesFromFile>).  Bit 0x02 allows writing of 'protected' tags, and
+should only be used internally by ExifTool.  See
+L<Image::ExifTool::TagNames|Image::ExifTool::TagNames>, for a list of tag
+names indicating 'unsafe' and 'protected' tags.  Default is 0.
+
+=item Replace
+
+Flag to replace the previous new values for this tag (ie. replace the values
+set in previous calls to L</SetNewValue>).  This option is most commonly
+used to replace previously-set new values for List-type tags.  Valid values
+are 0 (set new value normally -- adds to new values for List-type tags), 1
+(reset previous new values for this tag and replace with the specified new
+value) or 2 (reset previous new values only).
+
+=item Shift
+
+Shift the tag by the specified value.  Currently only date/time tags can be
+shifted.  Undefined for no shift, 1 for a positive shift, or -1 for a
+negative shift.  If 0, the shift is applied only if the tag is shiftable,
+and the shift is positive if AddValue is set, or negative if DelValue is
+set.  Default is undef.  See
+L<Image::ExifTool::Shift.pl|Image::ExifTool::Shift.pl> for more information.
+
+=item Type
+
+The type of value being set.  Valid values are PrintConv, ValueConv or Raw.
+Default is PrintConv if the L</PrintConv> Option is set, otherwise
+ValueConv.
+
+=back
+
+=item Return Values:
+
+In scalar context, returns the number of tags set and error messages are
+printed to STDERR.  In list context, returns the number of tags set and the
+error string.
+
+=item Notes:
+
+When deleting groups of tags, the Replace option may be used as in the last
+example above to exclude specific groups from a mass delete.  However, this
+technique may not be used to exclude individual tags.  Instead, use
+L</SetNewValuesFromFile> to recover the values of individual tags after
+deleting a group.
+
+=back
+
+The following ExifTool options are effective in the call to L</SetNewValue>:
+
+Charset, Escape, IgnoreMinorErrors, Lang, ListSep, ListSplit, PrintConv and
+Verbose.
+
+=head2 SetNewValuesFromFile
+
+A very powerful routine that sets new values for tags from information found
+in a specified file.
+
+    # set new values from all information in a file...
+    my $info = $exifTool->SetNewValuesFromFile($srcFile);
+    # ...then write these values to another image
+    my $result = $exifTool->WriteInfo($file2, $outFile);
+
+    # set all new values, preserving original groups
+    $exifTool->SetNewValuesFromFile($srcFile, '*:*');
+
+    # set specific information
+    $exifTool->SetNewValuesFromFile($srcFile, @tags);
+
+    # set new value from a different tag in specific group
+    $exifTool->SetNewValuesFromFile($fp, 'IPTC:Keywords>XMP-dc:Subject');
+
+    # add all IPTC keywords to XMP subject list
+    $exifTool->SetNewValuesFromFile($fp, 'IPTC:Keywords+>XMP-dc:Subject');
+
+    # set new value from an expression involving other tags
+    $exifTool->SetNewValuesFromFile($file,
+        'Comment<ISO=$ISO Aperture=$aperture Exposure=$shutterSpeed');
+
+    # set keywords list from the values of multiple tags
+    $exifTool->SetNewValuesFromFile($file, { Replace => 0 },
+        'keywords<xmp:subject', 'keywords<filename');
+
+    # copy all EXIF information, preserving the original IFD
+    # (without '>*.*' tags would be copied to the preferred EXIF IFD)
+    $exifTool->SetNewValuesFromFile($file, 'EXIF:*>*:*');
+
+=over 4
+
+=item Inputs:
+
+0) ExifTool object reference
+
+1) File name, file reference, or scalar reference
+
+2-N) [optional] List of tag names to set or options hash references.  All
+writable tags are set if none are specified.  The tag names are not case
+sensitive, and may be prefixed by an optional family 0 or 1 group name,
+separated by a colon (ie. 'exif:iso').  A leading '-' indicates tags to be
+excluded (ie. '-comment'), or a trailing '#' causes the ValueConv value to
+be copied (same as setting the Type option to 'ValueConv' for this tag
+only).  An asterisk ('*') may be used for the tag name, and is useful when a
+group is specified to set all tags from a group (ie. 'XMP:*').  A special
+feature allows tag names of the form 'SRCTAG>DSTTAG' (or
+'DSTTAGE<lt>SRCTAG') to be specified to copy information to a tag with a
+different name or a specified group. Both 'SRCTAG' and 'DSTTAG' may use '*'
+and/or be prefixed by a group name (ie. 'modifyDate>fileModifyDate' or
+'*>xmp:*').  Copied tags may also be added or deleted from a list with
+arguments of the form 'SRCTAG+>DSTTAG' or 'SRCTAG->DSTTAG'.  Tags are
+evaluated in order, so exclusions apply only to tags included earlier in the
+list.  An extension of this feature allows the tag value to be set from an
+expression containing tag names with leading '$' symbols (ie.
+'CommentE<lt>the file is $filename').  Braces '{}' may be used around the tag
+name to separate it from subsequent text, and a '$$' is used to to represent
+a '$' symbol.  (The behaviour for missing tags in expressions is defined by
+the L</MissingTagValue> option.)  Multiple options hash references may be
+passed to set different options for different tags. Options apply to
+subsequent tags in the argument list.
+
+By default, this routine will commute information between same-named tags in
+different groups, allowing information to be translated between images with
+different formats.  This behaviour may be modified by specifying a group
+name for extracted tags (even if '*' is used as a group name), in which case
+the information is written to the original group, unless redirected to a
+different group.  When '*' is used for a group name, the family 1 group of
+the original tag is preserved.  (For example, specifying '*:*' copies all
+information while preserving the original family 1 groups.)
+
+=item SetNewValuesFromFile Options:
+
+The options are the same was for L</SetNewValue>, and are passed directly
+to L</SetNewValue> internally, with a few exceptions:
+
+- The Replace option defaults to 1 instead of 0 as with L</SetNewValue>.
+
+- The AddValue or DelValue option is set for individual tags if '+>' or '->'
+(or '+E<lt>' or '-E<lt>') are used.
+
+- The Group option is set for tags where a group name is given.
+
+- The Protected flag is set to 1 for individually specified tags.
+
+- The Type option also applies to extracted tags.
+
+=item Return Values:
+
+A hash of information that was set successfully.  May include Warning or
+Error entries if there were problems reading the input file.
+
+=item Notes:
+
+The PrintConv option applies to this routine, but it normally should be left
+on to provide more reliable transfer of information between groups.
+
+If a preview image exists, it is not copied.  The preview image must be
+transferred separately if desired, in a separate call to L</WriteInfo>
+
+When simply copying all information between files of the same type, it is
+usually desirable to preserve the original groups by specifying '*:*' for
+the tags to set.
+
+The L</Duplicates> option is always in effect for tags extracted from the
+source file using this routine.
+
+The L</Struct> option is enabled by default for tags extracted by this
+routine.  This allows the hierarchy of complex structures to be preserved
+when copying, but the Struct option may be set to 0 to override this
+behaviour and copy as flattened tags instead.
+
+=back
+
+=head2 GetNewValues
+
+Get list of new Raw values for the specified tag.  These are the values
+that will be written to file.  Only tags which support a 'List' may return
+more than one value.
+
+    $rawVal = $exifTool->GetNewValues($tag);
+
+    @rawVals = $exifTool->GetNewValues($tag);
+
+=over 4
+
+=item Inputs:
+
+0) ExifTool object reference
+
+1) Tag name (case sensitive, may be prefixed by family 0 or 1 group name)
+
+=item Return Values:
+
+List of new Raw tag values, or first value in list when called in scalar
+context.  The list may be empty either if the tag isn't being written, or if
+it is being deleted (ie. if L</SetNewValue> was called without a value).
+
+=back
+
+=head2 CountNewValues
+
+Return the total number of new values set.
+
+    $numSet = $exifTool->CountNewValues();
+    ($numSet, $numPseudo) = $exifTool->CountNewValues();
+
+=over 4
+
+=item Inputs:
+
+0) ExifTool object reference
+
+=item Return Values:
+
+In scalar context, returns the total number of tags with new values set.  In
+list context, also returns the number of "pseudo" tag values which have been
+set.  "Pseudo" tags are tags like FileName and FileModifyDate which are not
+contained within the file and can be changed without rewriting the file.
+
+=back
+
+=head2 SaveNewValues
+
+Save state of new values to be later restored by L</RestoreNewValues>.
+
+    $exifTool->SaveNewValues();         # save state of new values
+    $exifTool->SetNewValue(ISO => 100); # set new value for ISO
+    $exifTool->WriteInfo($src, $dst1);  # write ISO + previous new values
+    $exifTool->RestoreNewValues();      # restore previous new values
+    $exifTool->WriteInfo($src, $dst2);  # write previous new values only
+
+=over 4
+
+=item Inputs:
+
+0) ExifTool object reference
+
+=item Return Value:
+
+None.
+
+=back
+
+=head2 RestoreNewValues
+
+Restore new values to the settings that existed when L</SaveNewValues> was
+last called.  May be called repeatedly after a single call to
+L</SaveNewValues>.  See L</SaveNewValues> above for an example.
+
+=over 4
+
+=item Inputs:
+
+0) ExifTool object reference
+
+=item Return Value:
+
+None.
+
+=back
+
+=head2 SetFileModifyDate
+
+Set the file modification time from the new value of the FileModifyDate tag.
+
+    $exifTool->SetNewValue(FileModifyDate => '2000:01:02 03:04:05-05:00',
+                           Protected => 1);
+    $result = $exifTool->SetFileModifyDate($file);
+
+=over 4
+
+=item Inputs:
+
+0) ExifTool object reference
+
+1) File name
+
+2) [optional] Base time if applying shift (days before $^T)
+
+=item Return Value:
+
+1 if the time was changed, 0 if nothing was done, or -1 if there was an
+error setting the time.
+
+=item Notes:
+
+Equivalent to, but more efficient than calling L</WriteInfo> when only the
+FileModifyDate tag has been set.  If a timezone is not specified in the
+FileModifyDate value, local time is assumed.  When shifting FileModifyDate,
+the time of the original file is used unless an optional base time is
+specified.
+
+=back
+
+=head2 SetFileName
+
+Set the file name and directory.  If not specified, the new file name is
+derived from the new values of the FileName and Directory tags.  If the
+FileName tag contains a '/', then the file is renamed into a new directory.
+If FileName ends with '/', then it is taken as a directory name and the file
+is moved into the new directory.  The new value for the Directory tag takes
+precedence over any directory specified in FileName.
+
+    $result = $exifTool->SetFileName($file);
+    $result = $exifTool->SetFileName($file, $newName);
+
+=over 4
+
+=item Inputs:
+
+0) ExifTool object reference
+
+1) Current file name
+
+2) [optional] New file name
+
+=item Return Value:
+
+1 if the file name or directory was changed, 0 if nothing was done, or -1 if
+there was an error renaming the file.
+
+=item Notes:
+
+Will not overwrite existing files. New directories are created as necessary.
+
+=back
+
+=head2 SetNewGroups
+
+Set the order of the preferred groups when adding new information.  In
+subsequent calls to L</SetNewValue>, new information will be created in the
+first valid group of this list.  This has an impact only if the group is not
+specified when calling L</SetNewValue> and if the tag name exists in more
+than one group.  The default order is EXIF, IPTC then XMP.  Any family 0
+group name may be used.  Case is not significant.
+
+    $exifTool->SetNewGroups('XMP','EXIF','IPTC');
+
+=over 4
+
+=item Inputs:
+
+0) ExifTool object reference
+
+1-N) Groups in order of priority.  If no groups are specified, the priorities
+are reset to the defaults.
+
+=item Return Value:
+
+None.
+
+=back
+
+=head2 GetNewGroups
+
+Get current group priority list.
+
+    @groups = $exifTool->GetNewGroups();
+
+=over 4
+
+=item Inputs:
+
+0) ExifTool object reference
+
+=item Return Values:
+
+List of group names in order of write priority.  Highest priority first.
+
+=back
+
+=head2 GetTagID
+
+Get the ID for the specified tag.  The ID is the IFD tag number in EXIF
+information, the property name in XMP information, or the data offset in a
+binary data block.  For some tags, such as Composite tags where there is no
+ID, an empty string is returned.  In list context, also returns a language
+code for the tag if available and different from the default language (ie.
+with alternate language entries for XMP "lang-alt" tags).
+
+    $id = $exifTool->GetTagID($tag);
+    ($id, $lang) = $exifTool->GetTagID($tag);
+
+=over 4
+
+=item Inputs:
+
+0) ExifTool object reference
+
+1) Tag key
+
+=item Return Values:
+
+In scalar context, returns the tag ID or '' if there is no ID for this tag.
+In list context, returns the tag ID (or '') and the language code (or
+undef).
+
+=back
+
+=head2 GetDescription
+
+Get description for specified tag.  This function will always return a
+defined value.  In the case where the description doesn't exist, one is
+generated from the tag name.
+
+=over 4
+
+=item Inputs:
+
+0) ExifTool object reference
+
+1) Tag key
+
+=item Return Values:
+
+A description for the specified tag.
+
+=back
+
+=head2 GetGroup
+
+Get group name(s) for a specified tag.
+
+    # return family 0 group name (ie. 'EXIF');
+    $group = $exifTool->GetGroup($tag, 0);
+
+    # return all groups (ie. qw{EXIF IFD0 Author Main})
+    @groups = $exifTool->GetGroup($tag);
+
+    # return groups as a string (ie. 'Main:IFD0:Author')
+    $group = $exifTool->GetGroup($tag, ':3:1:2');
+
+    # return groups as a simplified string (ie. 'IFD0:Author')
+    $group = $exifTool->GetGroup($tag, '3:1:2');
+
+=over 4
+
+=item Inputs:
+
+0) ExifTool object reference
+
+1) Tag key
+
+2) [optional] Group family number, or string of numbers separated by colons
+
+=item Return Values:
+
+Group name (or '' if tag has no group).  If no group family is specified,
+L</GetGroup> returns the name of the group in family 0 when called in scalar
+context, or the names of groups for all families in list context.  Returns a
+string of group names separated by colons if the input group family contains
+a colon.  The string is simplified to remove a leading 'Main:' and adjacent
+identical group names unless the family string begins with a colon.
+
+=item Notes:
+
+The group family numbers are currently available:
+
+    0) Information Type             (ie. EXIF, XMP, IPTC)
+    1) Specific Location            (ie. IFD0, XMP-dc)
+    2) Category                     (ie. Author, Time)
+    3) Document Number              (ie. Main, Doc1, Doc3-2)
+    4) Instance Number              (ie. Copy1, Copy2, Copy3...)
+
+Families 0 and 1 are based on the file structure, and are similar except
+that family 1 is more specific and sub-divides some groups to give more
+detail about the specific location where the information was found.  For
+example, the EXIF group is split up based on the specific IFD (Image File
+Directory), the MakerNotes group is divided into groups for each
+manufacturer, and the XMP group is separated based on the XMP namespace
+prefix.  Note that only common XMP namespaces are listed in the
+L<GetAllGroups documentation|/GetAllGroups [static]>, but additional
+namespaces may be present in some XMP data.  Also note that the 'XMP-xmp...'
+group names may appear in the older form 'XMP-xap...' since these names
+evolved as the XMP standard was developed.  The ICC_Profile group is broken
+down to give information about the specific ICC_Profile tag from which
+multiple values were extracted.  As well, information extracted from the
+ICC_Profile header is separated into the ICC-header group.
+
+Family 2 classifies information based on the logical category to which the
+information refers.
+
+Family 3 gives the document number for tags extracted from embedded
+documents, or 'Main' for tags from the main document.  (See the
+L</ExtractEmbedded> option for extracting tags from embedded documents.) 
+Nested sub-documents (if they exist) are indicated by numbers separated with
+dashes in the group name, to an arbitrary depth. (ie. 'Doc2-3-1' is the 1st
+sub-sub-document of the 3rd sub-document of the 2nd embedded document of the
+main file.)
+
+Family 4 provides a method for differentiating tags when multiple tags exist
+with the same name in the same location.  The primary instance of a tag (the
+tag extracted when the Duplicates option is disabled and no group is
+specified) has no family 4 group name, but additional instances have have
+family 4 group names of 'Copy1', 'Copy2', 'Copy3', etc.
+
+See L</GetAllGroups [static]> for complete lists of group names.
+
+=back
+
+=head2 GetGroups
+
+Get list of group names that exist in the specified information.
+
+    @groups = $exifTool->GetGroups($info, 2);
+    @groups = $exifTool->GetGroups('3:1');
+
+=over 4
+
+=item Inputs:
+
+0) ExifTool object reference
+
+1) [optional] Info hash ref (default is all extracted info)
+
+2) [optional] Group family number, or string of numbers (default 0)
+
+=item Return Values:
+
+List of group names in alphabetical order. If information hash is not
+specified, the group names are returned for all extracted information. See
+L</GetGroup> for an description of family numbers and family number strings.
+
+=back
+
+=head2 BuildCompositeTags
+
+Builds composite tags from required tags.  The composite tags are
+convenience tags which are derived from the values of other tags.  This
+routine is called automatically by L</ImageInfo> and L</ExtractInfo> if the
+Composite option is set.
+
+=over 4
+
+=item Inputs:
+
+0) ExifTool object reference
+
+=item Return Values:
+
+(none)
+
+=item Notes:
+
+Tag values are calculated in alphabetical order unless a tag Require's or
+Desire's another composite tag, in which case the calculation is deferred
+until after the other tag is calculated. Composite tags may need to read
+data from the image for their value to be determined, so for these
+L</BuildCompositeTags> must be called while the image is available.  This is
+only a problem if L</ImageInfo> is called with a filename (as opposed to a
+file reference or scalar reference) since in this case the file is closed
+before L</ImageInfo> returns.  However if you enable the Composite option,
+L</BuildCompositeTags> is called from within L</ImageInfo> before the file
+is closed.
+
+=back
+
+=head2 GetTagName [static]
+
+Get name of tag from tag key.  This is a convenience function that
+strips the embedded instance number, if it exists, from the tag key.
+
+Note: "static" in the heading above indicates that the function does not
+require an ExifTool object reference as the first argument.  All functions
+documented below are also static.
+
+    $tagName = Image::ExifTool::GetTagName($tag);
+
+=over 4
+
+=item Inputs:
+
+0) Tag key
+
+=item Return Value:
+
+Tag name.  This is the same as the tag key but has the instance number
+removed.
+
+=back
+
+=head2 GetShortcuts [static]
+
+Get a list of shortcut tags.
+
+=over 4
+
+=item Inputs:
+
+(none)
+
+=item Return Values:
+
+List of shortcut tags (as defined in Image::ExifTool::Shortcuts).
+
+=back
+
+=head2 GetAllTags [static]
+
+Get list of all available tag names.
+
+    @tagList = Image::ExifTool::GetAllTags($group);
+
+=over 4
+
+=item Inputs:
+
+0) [optional] Group name, or string of group names separated by colons
+
+=item Return Values:
+
+A list of all available tags in alphabetical order, or all tags in a
+specified group or intersection of groups.  The group name is case
+insensitive, and any group in families 0-2 may be used except for EXIF
+family 1 groups (ie. the specific IFD).
+
+=back
+
+=head2 GetWritableTags [static]
+
+Get list of all writable tag names.
+
+    @tagList = Image::ExifTool::GetWritableTags($group);
+
+=over 4
+
+=item Inputs:
+
+0) [optional] Group name, or string of group names separated by colons
+
+=item Return Values:
+
+A list of all writable tags in alphabetical order.  These are the tags for
+which values may be set through L</SetNewValue>.  If a group name is given,
+returns only writable tags in specified group(s).  The group name is case
+insensitive, and any group in families 0-2 may be used except for EXIF
+family 1 groups (ie. the specific IFD).
+
+=back
+
+=head2 GetAllGroups [static]
+
+Get list of all group names in specified family.
+
+    @groupList = Image::ExifTool::GetAllGroups($family);
+
+=over 4
+
+=item Inputs:
+
+0) Group family number (0-4)
+
+=item Return Values:
+
+A list of all groups in the specified family in alphabetical order.
+
+=back
+
+Here is a complete list of groups for each of these families:
+
+=over 4
+
+=item Family 0 (Information Type):
+
+AFCP, AIFF, APE, APP0, APP12, APP13, APP14, APP15, APP4, APP5, APP6, APP8,
+ASF, CanonVRD, Composite, DICOM, DNG, DV, DjVu, Ducky, EXE, EXIF, ExifTool,
+FLAC, File, Flash, FlashPix, Font, FotoStation, GIF, GIMP, GeoTiff, H264,
+HTML, ICC_Profile, ID3, IPTC, ITC, JFIF, JPEG, Jpeg2000, LNK, Leaf, M2TS,
+MIE, MIFF, MNG, MPC, MPEG, MPF, MXF, MakerNotes, Matroska, Meta, PDF, PICT,
+PNG, PSP, PhotoMechanic, Photoshop, PostScript, PrintIM, QuickTime, RAF,
+RIFF, RSRC, RTF, Rawzor, Real, SVG, SigmaRaw, Stim, Vorbis, XML, XMP, ZIP
+
+=item Family 1 (Specific Location):
+
+AC3, AFCP, AIFF, APE, ASF, AVI1, Adobe, AdobeCM, CIFF, Canon, CanonCustom,
+CanonRaw, CanonVRD, Casio, Chapter#, Composite, DICOM, DNG, DV, DjVu,
+DjVu-Meta, Ducky, EPPIM, EXE, EXIF, ExifIFD, ExifTool, FLAC, File, Flash,
+FlashPix, Font, FotoStation, FujiFilm, GE, GIF, GIMP, GPS, GeoTiff,
+GlobParamIFD, GraphConv, H264, HP, HTML, HTML-dc, HTML-ncc, HTML-office,
+HTML-prod, HTML-vw96, HTTP-equiv, ICC-chrm, ICC-clrt, ICC-header, ICC-meas,
+ICC-meta, ICC-view, ICC_Profile, ICC_Profile#, ID3, ID3v1, ID3v1_Enh,
+ID3v2_2, ID3v2_3, ID3v2_4, IFD0, IFD1, IPTC, IPTC#, ITC, InteropIFD, JFIF,
+JPEG, JVC, Jpeg2000, KDC_IFD, Kodak, KodakBordersIFD, KodakEffectsIFD,
+KodakIFD, KyoceraRaw, LNK, Leaf, LeafSubIFD, Leica, M2TS, MAC, MIE-Audio,
+MIE-Camera, MIE-Canon, MIE-Doc, MIE-Extender, MIE-Flash, MIE-GPS, MIE-Geo,
+MIE-Image, MIE-Lens, MIE-Main, MIE-MakerNotes, MIE-Meta, MIE-Orient,
+MIE-Preview, MIE-Thumbnail, MIE-UTM, MIE-Unknown, MIE-Video, MIFF, MNG, MPC,
+MPEG, MPF0, MPImage, MXF, MakerNotes, MakerUnknown, Matroska, MetaIFD,
+Microsoft, Minolta, MinoltaRaw, NITF, Nikon, NikonCapture, NikonCustom,
+NikonScan, Olympus, PDF, PICT, PNG, PSP, Panasonic, Pentax, PhotoMechanic,
+Photoshop, PictureInfo, PostScript, PreviewIFD, PrintIM, ProfileIFD,
+QuickTime, RAF, RAF2, RIFF, RMETA, RSRC, RTF, Rawzor, Real, Real-CONT,
+Real-MDPR, Real-PROP, Real-RA3, Real-RA4, Real-RA5, Real-RJMD, Reconyx,
+Ricoh, SPIFF, SR2, SR2DataIFD, SR2SubIFD, SRF#, SVG, Samsung, Sanyo,
+Scalado, Sigma, SigmaRaw, Sony, SonyIDC, Stim, SubIFD, System, Track#,
+Version0, Vorbis, XML, XMP, XMP-DICOM, XMP-MP, XMP-MP1, XMP-PixelLive,
+XMP-acdsee, XMP-album, XMP-aux, XMP-cc, XMP-cell, XMP-crs, XMP-dc, XMP-dex,
+XMP-digiKam, XMP-exif, XMP-iptcCore, XMP-iptcExt, XMP-lr, XMP-mediapro,
+XMP-microsoft, XMP-mwg-coll, XMP-mwg-kw, XMP-mwg-rs, XMP-pdf, XMP-pdfx,
+XMP-photomech, XMP-photoshop, XMP-plus, XMP-prism, XMP-prl, XMP-pur,
+XMP-rdf, XMP-swf, XMP-tiff, XMP-x, XMP-xmp, XMP-xmpBJ, XMP-xmpDM, XMP-xmpMM,
+XMP-xmpNote, XMP-xmpPLUS, XMP-xmpRights, XMP-xmpTPg, ZIP
+
+=item Family 2 (Category):
+
+Audio, Author, Camera, Document, ExifTool, Image, Location, Other, Printing,
+Time, Unknown, Video
+
+=item Family 3 (Document Number):
+
+Doc#, Main
+
+=item Family 4 (Instance Number):
+
+Copy#
+
+=back
+
+=head2 GetDeleteGroups [static]
+
+Get list of all deletable group names.
+
+    @delGroups = Image::ExifTool::GetDeleteGroups();
+
+=over 4
+
+=item Inputs:
+
+None.
+
+=item Return Values:
+
+A list of deletable group names in alphabetical order.  The current list of
+deletable group names is:
+
+AFCP, CIFF, CanonVRD, EXIF, ExifIFD, Ducky, File, FlashPix, FotoStation,
+GlobParamIFD, GPS, IFD0, IFD1, InteropIFD, ICC_Profile, IPTC, JFIF,
+MakerNotes, Meta, MetaIFD, MIE, PhotoMechanic, Photoshop, PNG, PrintIM,
+RMETA, SubIFD, Trailer, XMP
+
+All names in this list are either family 0 or family 1 group names, with the
+exception of 'Trailer' which allows all trailers in JPEG and TIFF-format
+images to be deleted at once, including unknown trailers.  To schedule a
+group for deletion, call L</SetNewValue> with an undefined value and a tag
+name like 'Trailer:*'.
+
+=back
+
+=head2 GetFileType [static]
+
+Get type of file given file name.
+
+    my $type = Image::ExifTool::GetFileType($filename);
+    my $desc = Image::ExifTool::GetFileType($filename, 1);
+
+=over 4
+
+=item Inputs:
+
+0) [optional] File name (or just an extension)
+
+1) [optional] Flag to return a description instead of a type.  Set to 0 to
+return type for recognized but unsupported files (otherwise the return value
+for unsupported files is undef).
+
+=item Return Value:
+
+A string, based on the file extension, which indicates the basic format of
+the file.  Note that some files may be based on other formats (like many RAW
+image formats are based on TIFF).  In array context, may return more than
+one file type if the file may be based on different formats.  Returns undef
+if files with this extension are not yet supported by ExifTool.  Returns a
+list of extensions for all supported file types if no input extension is
+specified (or all recognized file types if the description flag is set to 0). 
+Returns a more detailed description of the specific file format when the
+description flag is set.
+
+=back
+
+=head2 CanWrite [static]
+
+Can the specified file be written?
+
+    my $writable = Image::ExifTool::CanWrite($filename);
+
+=over 4
+
+=item Inputs:
+
+0) File name or extension
+
+=item Return Value:
+
+True if ExifTool supports writing files of this type (based on the file
+extension).
+
+=back
+
+=head2 CanCreate [static]
+
+Can the specified file be created?
+
+    my $creatable = Image::ExifTool::CanCreate($filename);
+
+=over 4
+
+=item Inputs:
+
+0) File name or extension
+
+=item Return Value:
+
+True if ExifTool can create files with this extension from scratch. 
+Currently, this can only be done with XMP, MIE, ICC, VRD and EXIF files.
+
+=back
+
+=head1 CHARACTER ENCODINGS
+
+Certain meta information formats allow coded character sets other than plain
+ASCII.  When reading, 8-bit encodings are passed straight through ExifTool
+without re-coding unless specified otherwise below, and multi-byte encodings
+are converted according to the L</Charset> option ('UTF8' by default).  When
+writing, the inverse conversions are performed.  See the L</Charset> option
+for a list of valid character sets.
+
+More specific details are given below about how character coding is handled
+for EXIF, IPTC, XMP, PNG, ID3, PDF and MIE information:
+
+=head2 EXIF
+
+Most textual information in EXIF is stored in ASCII format, and ExifTool
+does not convert these tags.  However it is not uncommon for applications to
+write UTF-8 or other encodings where ASCII is expected, and ExifTool will
+quite happily read/write any encoding without conversion.  For a few EXIF
+tags (UserComment, GPSProcessingMethod and GPSAreaInformation) the stored
+text may be encoded either in ASCII, Unicode (UCS-2) or JIS.  When reading
+these tags, Unicode and JIS are converted to the character set specified by
+the L</Charset> option.  Other encodings are not converted.  When writing,
+text is stored as ASCII unless the string contains special characters, in
+which case it is converted from the specified character set and stored as
+Unicode.  ExifTool writes Unicode in native EXIF byte ordering by default,
+but this may be changed by setting the ExifUnicodeByteOrder tag.  The EXIF
+"XP" tags (XPTitle, XPComment, etc) are always stored as little-endian
+Unicode, and are read and written using the specified character set.
+
+=head2 IPTC
+
+The value of the IPTC:CodedCharacterSet tag determines how the internal IPTC
+string values are interpreted.  If CodedCharacterSet exists and has a value
+of 'UTF8' (or 'ESC % G') then string values are assumed to be stored as
+UTF-8, otherwise Windows Latin1 (cp1252, 'Latin') coding is assumed by
+default, but this can be changed with the L</CharsetIPTC> option.  When
+reading, these strings are converted to the character set specified by the
+L</Charset> option.  When writing, the inverse conversions are performed. 
+No conversion is done if the internal (IPTC) and external (ExifTool)
+character sets are the same.  Note that ISO 2022 character set shifting is
+not supported.  Instead, a warning is issued and the string is not converted
+if an ISO 2022 shift code is found.  See L<http://www.iptc.org/IIM/> for the
+official IPTC specification.
+
+=head2 XMP
+
+Exiftool reads XMP encoded as UTF-8, UTF-16 or UTF-32, and converts them all
+to UTF-8 internally.  Also, all XML character entity references and numeric
+character references are converted.  When writing, ExifTool always encodes
+XMP as UTF-8, converting the following 5 characters to XML character
+references: E<amp> E<lt> E<gt> E<39> E<quot>.  By default no further
+conversion is performed, however if the L</Charset> option is other than
+'UTF8' then text is converted to/from a specified character set when
+reading/writing.
+
+=head2 PNG
+
+L<PNG TextualData tags|Image::ExifTool::TagNames/"PNG TextualData Tags"> are
+stored as tEXt, zTXt and iTXt chunks in PNG images.  The tEXt and zTXt
+chunks use ISO 8859-1 encoding, while iTXt uses UTF-8.  When reading,
+ExifTool converts all PNG textual data to the character set specified by the
+L</Charset> option.  When writing, ExifTool generates a tEXt chunk (or zTXt
+with the L</Compress> option) if the text doesn't contain special characters
+or if Latin encoding is specified; otherwise an iTXt chunk is used and the
+text is converted from the specified character set and stored as UTF-8.
+
+=head2 ID3
+
+The ID3v1 specification officially supports only ISO 8859-1 encoding (a
+subset of Windows Latin1), although some applications may incorrectly use
+other character sets.  By default ExifTool converts ID3v1 text from Latin to
+the character set specified by the </Charset> option.  However, the internal
+ID3v1 charset may be specified with the L</CharsetID3> option.  The encoding
+for ID3v2 information is stored in the file, so ExifTool converts ID3v2 text
+from this encoding to the character set specified by the L</Charset> option.
+ExifTool does not currently write ID3 information.
+
+=head2 PDF
+
+PDF text strings are stored in either PDFDocEncoding (similar to Windows
+Latin1) or Unicode (UCS-2).  When reading, ExifTool converts to the
+character set specified by the L</Charset> option.  When writing, ExifTool
+encodes input text from the specified character set as Unicode only if the
+string contains special characters, otherwise PDFDocEncoding is used.
+
+=head2 MIE
+
+MIE strings are stored as either UTF-8 or ISO 8859-1. When reading, UTF-8
+strings are converted according to the L</Charset> option, and ISO 8859-1
+strings are never converted.  When writing, input strings are converted from
+the specified character set to UTF-8.  The resulting strings are stored as
+UTF-8 if they contain multi-byte UTF-8 character sequences, otherwise they
+are stored as ISO 8859-1.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 ACKNOWLEDGEMENTS
+
+Many people have helped in the development of ExifTool through their bug
+reports, comments and suggestions, and/or additions to the code.  See the
+ACKNOWLEDGEMENTS in the individual Image::ExifTool modules and in
+html/index.html of the Image::ExifTool distribution package for a list of
+people who have contributed to this project.
+
+=head1 SEE ALSO
+
+L<exiftool(1)|exiftool>,
+L<Image::ExifTool::TagNames(3pm)|Image::ExifTool::TagNames>,
+L<Image::ExifTool::Shortcuts(3pm)|Image::ExifTool::Shortcuts>,
+L<Image::ExifTool::Shift.pl|Image::ExifTool::Shift.pl>,
+L<Image::Info(3pm)|Image::Info>,
+L<Image::MetaData::JPEG(3pm)|Image::MetaData::JPEG>
+
+=cut
+
+# end
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/AES.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/AES.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/AES.pm	(revision 24799)
@@ -0,0 +1,501 @@
+#------------------------------------------------------------------------------
+# File:         AES.pm
+#
+# Description:  AES encryption with cipher-block chaining
+#
+# Revisions:    2010/10/14 - P. Harvey Created
+#
+# References:   1) http://www.hoozi.com/Articles/AESEncryption.htm
+#               2) http://www.csrc.nist.gov/publications/fips/fips197/fips-197.pdf
+#               3) http://www.faqs.org/rfcs/rfc3602.html
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::AES;
+
+use strict;
+use vars qw($VERSION @ISA @EXPORT_OK);
+require Exporter;
+
+$VERSION = '1.01';
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(Crypt);
+
+my $seeded; # flag set if we already seeded random number generator
+my $nr;     # number of rounds in AES cipher
+my @cbc;    # cipher-block chaining bytes
+
+# arrays (all unsigned character) to hold intermediate results during encryption
+my @state = ([],[],[],[]);  # the 2-dimensional state array
+my @RoundKey;               # round keys
+
+my @sbox = (
+    0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
+    0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
+    0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
+    0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
+    0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
+    0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
+    0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
+    0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
+    0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
+    0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
+    0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
+    0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
+    0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
+    0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
+    0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
+    0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16,
+);
+
+# reverse sbox
+my @rsbox = (
+    0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb,
+    0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb,
+    0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
+    0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25,
+    0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92,
+    0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
+    0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06,
+    0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b,
+    0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
+    0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e,
+    0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b,
+    0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
+    0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,
+    0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef,
+    0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
+    0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d,
+);
+
+# the round constant word array, $rcon[i], contains the values given by
+# x to the power (i-1) being powers of x (x is denoted as {02}) in the field GF(2^8)
+# Note that i starts at 1, not 0).
+my @rcon = (
+    0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a,
+    0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39,
+    0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,
+    0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8,
+    0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef,
+    0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc,
+    0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b,
+    0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3,
+    0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94,
+    0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20,
+    0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35,
+    0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f,
+    0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04,
+    0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63,
+    0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,
+    0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb,
+);
+
+#------------------------------------------------------------------------------
+# This function produces 4*($nr+1) round keys.
+# The round keys are used in each round to encrypt the states.
+# Inputs: 0) key string (must be 16, 24 or 32 bytes long)
+sub KeyExpansion($)
+{
+    my $key = shift;
+    my @key = unpack 'C*', $key;        # convert the key into a byte array
+    my $nk = int(length($key) / 4);     # number of 32-bit words in the key
+    $nr = $nk + 6;                      # number of rounds
+
+    # temporary variables (all unsigned characters)
+    my ($i,@temp);
+    
+    # The first round key is the key itself.
+    for ($i=0; $i<$nk; ++$i) {
+        @RoundKey[$i*4..$i*4+3] = @key[$i*4..$i*4+3];
+    }
+    # All other round keys are found from the previous round keys.
+    while ($i < (4 * ($nr+1))) {
+
+        @temp[0..3] = @RoundKey[($i-1)*4..($i-1)*4+3];
+
+        if ($i % $nk == 0) {
+            # rotate the 4 bytes in a word to the left once
+            # [a0,a1,a2,a3] becomes [a1,a2,a3,a0]
+            @temp[0..3] = @temp[1,2,3,0];
+
+            # take a four-byte input word and apply the S-box
+            # to each of the four bytes to produce an output word.
+            @temp[0..3] = @sbox[@temp[0..3]];
+
+            $temp[0] = $temp[0] ^ $rcon[$i/$nk];
+
+        } elsif ($nk > 6 && $i % $nk == 4) {
+
+            @temp[0..3] = @sbox[@temp[0..3]];
+        }
+        $RoundKey[$i*4+0] = $RoundKey[($i-$nk)*4+0] ^ $temp[0];
+        $RoundKey[$i*4+1] = $RoundKey[($i-$nk)*4+1] ^ $temp[1];
+        $RoundKey[$i*4+2] = $RoundKey[($i-$nk)*4+2] ^ $temp[2];
+        $RoundKey[$i*4+3] = $RoundKey[($i-$nk)*4+3] ^ $temp[3];
+        ++$i;
+    }
+}
+
+#------------------------------------------------------------------------------
+# This function adds the round key to state.
+# The round key is added to the state by an XOR function.
+sub AddRoundKey($)
+{
+    my $round = shift;
+    my ($i,$j);
+    for ($i=0; $i<4; ++$i) {
+        my $k = $round*16 + $i*4;
+        for ($j=0; $j<4; ++$j) {
+            $state[$j][$i] ^= $RoundKey[$k + $j];
+        }
+    }
+}
+
+#------------------------------------------------------------------------------
+# Substitute the values in the state matrix with values in an S-box
+sub SubBytes()
+{
+    my $i;
+    for ($i=0; $i<4; ++$i) {
+        @{$state[$i]}[0..3] = @sbox[@{$state[$i]}[0..3]];
+    }
+}
+
+sub InvSubBytes()
+{
+    my $i;
+    for ($i=0; $i<4; ++$i) {
+        @{$state[$i]}[0..3] = @rsbox[@{$state[$i]}[0..3]];
+    }
+}
+
+#------------------------------------------------------------------------------
+# Shift the rows in the state to the left.
+# Each row is shifted with different offset.
+# Offset = Row number. So the first row is not shifted.
+sub ShiftRows()
+{
+    # rotate first row 1 columns to left
+    @{$state[1]}[0,1,2,3] = @{$state[1]}[1,2,3,0];
+
+    # rotate second row 2 columns to left
+    @{$state[2]}[0,1,2,3] = @{$state[2]}[2,3,0,1];
+
+    # rotate third row 3 columns to left
+    @{$state[3]}[0,1,2,3] = @{$state[3]}[3,0,1,2];
+}
+
+sub InvShiftRows()
+{
+    # rotate first row 1 columns to right
+    @{$state[1]}[0,1,2,3] = @{$state[1]}[3,0,1,2];
+
+    # rotate second row 2 columns to right
+    @{$state[2]}[0,1,2,3] = @{$state[2]}[2,3,0,1];
+
+    # rotate third row 3 columns to right
+    @{$state[3]}[0,1,2,3] = @{$state[3]}[1,2,3,0];
+}
+
+#------------------------------------------------------------------------------
+# Find the product of {02} and the argument to xtime modulo 0x1b
+# Note: returns an integer which may need to be trimmed to 8 bits
+sub xtime($)
+{
+    return ($_[0]<<1) ^ ((($_[0]>>7) & 1) * 0x1b);
+}
+
+#------------------------------------------------------------------------------
+# Multiply numbers in the field GF(2^8)
+sub Mult($$)
+{
+    my ($x, $y) = @_;
+    return (($y & 1) * $x) ^
+           (($y>>1 & 1) * xtime($x)) ^
+           (($y>>2 & 1) * xtime(xtime($x))) ^
+           (($y>>3 & 1) * xtime(xtime(xtime($x)))) ^
+           (($y>>4 & 1) * xtime(xtime(xtime(xtime($x)))));
+}
+
+#------------------------------------------------------------------------------
+# Mix the columns of the state matrix
+sub MixColumns()
+{
+    my ($i,$t0,$t1,$t2);
+    for ($i=0; $i<4; ++$i) {
+        $t0 = $state[0][$i];
+        $t2 = $state[0][$i] ^ $state[1][$i] ^ $state[2][$i] ^ $state[3][$i];
+        $t1 = $state[0][$i] ^ $state[1][$i] ; $t1 = xtime($t1) & 0xff; $state[0][$i] ^= $t1 ^ $t2 ;
+        $t1 = $state[1][$i] ^ $state[2][$i] ; $t1 = xtime($t1) & 0xff; $state[1][$i] ^= $t1 ^ $t2 ;
+        $t1 = $state[2][$i] ^ $state[3][$i] ; $t1 = xtime($t1) & 0xff; $state[2][$i] ^= $t1 ^ $t2 ;
+        $t1 = $state[3][$i] ^ $t0 ;           $t1 = xtime($t1) & 0xff; $state[3][$i] ^= $t1 ^ $t2 ;
+    }
+}
+
+sub InvMixColumns()
+{
+    my $i;
+    for ($i=0; $i<4; ++$i) {
+        my $a = $state[0][$i];
+        my $b = $state[1][$i];
+        my $c = $state[2][$i];
+        my $d = $state[3][$i];
+        $state[0][$i] = (Mult($a,0x0e) ^ Mult($b,0x0b) ^ Mult($c,0x0d) ^ Mult($d,0x09)) & 0xff;
+        $state[1][$i] = (Mult($a,0x09) ^ Mult($b,0x0e) ^ Mult($c,0x0b) ^ Mult($d,0x0d)) & 0xff;
+        $state[2][$i] = (Mult($a,0x0d) ^ Mult($b,0x09) ^ Mult($c,0x0e) ^ Mult($d,0x0b)) & 0xff;
+        $state[3][$i] = (Mult($a,0x0b) ^ Mult($b,0x0d) ^ Mult($c,0x09) ^ Mult($d,0x0e)) & 0xff;
+    }
+}
+
+#------------------------------------------------------------------------------
+# Encrypt (Cipher) or decrypt (InvCipher) a block of data with CBC
+# Inputs: 0) string to cipher (must be 16 bytes long)
+# Returns: cipher'd string
+sub Cipher($)
+{
+    my @in = unpack 'C*', $_[0];    # unpack input plaintext
+    my ($i, $j, $round);
+
+    # copy the input PlainText to state array and apply the CBC
+    for ($i=0; $i<4; ++$i) {
+        for ($j=0; $j<4; ++$j) {
+            my $k = $i*4 + $j;
+            $state[$j][$i] = $in[$k] ^ $cbc[$k];
+        }
+    }
+
+    # add the First round key to the state before starting the rounds
+    AddRoundKey(0);
+
+    # there will be $nr rounds; the first $nr-1 rounds are identical
+    for ($round=1; ; ++$round) {
+        SubBytes();
+        ShiftRows();
+        if ($round < $nr) {
+            MixColumns();
+            AddRoundKey($round);
+        } else {
+            # MixColumns() is not used in the last round
+            AddRoundKey($nr);
+            last;
+        }
+    }
+
+    # the encryption process is over
+    # copy the state array to output array (and save for CBC)
+    for ($i=0; $i<4; ++$i) {
+        for ($j=0; $j<4; ++$j) {
+            $cbc[$i*4+$j] = $state[$j][$i];
+        }
+    }
+    return pack 'C*', @cbc; # return packed ciphertext
+}
+
+sub InvCipher($)
+{
+    my @in = unpack 'C*', $_[0];    # unpack input ciphertext
+    my (@out, $i, $j, $round);
+
+    # copy the input CipherText to state array
+    for ($i=0; $i<4; ++$i) {
+        for ($j=0; $j<4; ++$j) {
+            $state[$j][$i] = $in[$i*4 + $j];
+        }
+    }
+
+    # add the First round key to the state before starting the rounds
+    AddRoundKey($nr);
+
+    # there will be $nr rounds; the first $nr-1 rounds are identical
+    for ($round=$nr-1; ; --$round) {
+        InvShiftRows();
+        InvSubBytes();
+        AddRoundKey($round);
+        # InvMixColumns() is not used in the last round
+        last if $round <= 0;
+        InvMixColumns();
+    }
+
+    # copy the state array to output array and reverse the CBC
+    for ($i=0; $i<4; ++$i) {
+        for ($j=0; $j<4; ++$j) {
+            my $k = $i*4 + $j;
+            $out[$k] = $state[$j][$i] ^ $cbc[$k];
+        }
+    }
+    @cbc = @in;             # update CBC for next block
+    return pack 'C*', @out; # return packed plaintext
+}
+
+#------------------------------------------------------------------------------
+# Encrypt/Decrypt using AES-CBC algorithm (with fixed 16-byte blocks)
+# Inputs: 0) data reference (with leading 16-byte initialization vector when decrypting)
+#         1) encryption key (16, 24 or 32 bytes for AES-128, AES-192 or AES-256)
+#         2) encrypt flag (false for decryption, true with length 16 bytes to
+#            encrypt using this as the CBC IV, or true with other length to
+#            encrypt with a randomly-generated IV)
+#         3) flag to disable padding
+# Returns: error string, or undef on success
+# Notes: encrypts/decrypts data in place
+sub Crypt($$;$$)
+{
+    my ($dataPt, $key, $encrypt, $noPad) = @_;
+
+    # validate key length
+    my $keyLen = length $key;
+    unless ($keyLen == 16 or $keyLen == 24 or $keyLen == 32) {
+        return "Invalid AES key length ($keyLen)";
+    }
+    my $partLen = length($$dataPt) % 16;
+    my ($pos, $i);
+    if ($encrypt) {
+        if (length($encrypt) == 16) {
+            @cbc = unpack 'C*', $encrypt;
+        } else {
+            # generate a random 16-byte CBC initialization vector
+            unless ($seeded) {
+                srand(time() & ($$ + ($$<<15)));
+                $seeded = 1;
+            }
+            for ($i=0; $i<16; ++$i) {
+                $cbc[$i] = int(rand(256));
+            }
+            $encrypt = pack 'C*', @cbc;
+        }
+        $$dataPt = $encrypt . $$dataPt; # add IV to the start of the data
+        # add required padding so we can recover the
+        # original string length after decryption
+        # (padding bytes have value set to padding length)
+        my $padLen = 16 - $partLen;
+        $$dataPt .= (chr($padLen)) x $padLen unless $padLen == 16 and $noPad;
+        $pos = 16;      # start encrypting at byte 16 (after the IV)
+    } elsif ($partLen) {
+        return 'Invalid AES ciphertext length';
+    } elsif (length $$dataPt >= 32) {
+        # take the CBC initialization vector from the start of the data
+        @cbc = unpack 'C16', $$dataPt;
+        $$dataPt = substr($$dataPt, 16);
+        $pos = 0;       # start decrypting from byte 0 (now that IV is removed)
+    } else {
+        $$dataPt = '';  # empty text
+        return undef;
+    }
+    # the KeyExpansion routine must be called before encryption
+    KeyExpansion($key);
+
+    # loop through the data and convert in blocks
+    my $dataLen = length $$dataPt;
+    my $last = $dataLen - 16;
+    my $func = $encrypt ? \&Cipher : \&InvCipher;
+    while ($pos <= $last) {
+        # cipher this block
+        substr($$dataPt, $pos, 16) = &$func(substr($$dataPt, $pos, 16));
+        $pos += 16;
+    }
+    unless ($encrypt or $noPad) {
+        # remove padding if necessary (padding byte value gives length of padding)
+        my $padLen = ord(substr($$dataPt, -1, 1));
+        return 'AES decryption error (invalid pad byte)' if $padLen > 16;
+        $$dataPt = substr($$dataPt, 0, $dataLen - $padLen);
+    }
+    return undef;
+}
+
+1; # end
+
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::AES - AES encryption with cipher-block chaining
+
+=head1 SYNOPSIS
+
+  use Image::ExifTool::AES qw(Crypt);
+
+  $err = Crypt(\$plaintext, $key, 1);   # encryption
+
+  $err = Crypt(\$ciphertext, $key);     # decryption
+
+=head1 DESCRIPTION
+
+This module contains an implementation of the AES encryption/decryption
+algorithms with cipher-block chaining (CBC) and RFC 2898 PKCS #5 padding.
+This is the AESV2 and AESV3 encryption mode used in PDF documents.
+
+=head1 EXPORTS
+
+Exports nothing by default, but L</Crypt> may be exported.
+
+=head1 METHODS
+
+=head2 Crypt
+
+Implement AES encryption/decryption with cipher-block chaining.
+
+=over 4
+
+=item Inputs:
+
+0) Scalar reference for data to encrypt/decrypt.
+
+1) Encryption key string (must have length 16, 24 or 32).
+
+2) [optional] Encrypt flag (false to decrypt).
+
+3) [optional] Flag to avoid removing padding after decrypting, or to avoid
+adding 16 bytes of padding before encrypting when data length is already a
+multiple of 16 bytes.
+
+=item Returns:
+
+On success, the return value is undefined and the data is encrypted or
+decrypted as specified.  Otherwise returns an error string and the data is
+left in an indeterminate state.
+
+=item Notes:
+
+The length of the encryption key dictates the AES mode, with lengths of 16,
+24 and 32 bytes resulting in AES-128, AES-192 and AES-256.
+
+When encrypting, the input data may be any length and will be padded to an
+even 16-byte block size using the specified padding technique.  If the
+encrypt flag has length 16, it is used as the initialization vector for
+the cipher-block chaining, otherwise a random IV is generated.  Upon
+successful return the data will be encrypted, with the first 16 bytes of
+the data being the CBC IV.
+
+When decrypting, the input data begins with the 16-byte CBC initialization
+vector.
+
+=back
+
+=head1 BUGS
+
+This code is blindingly slow.  But in truth, slowing down processing is the
+main purpose of encryption, so this really can't be considered a bug.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.hoozi.com/Articles/AESEncryption.htm>
+
+=item L<http://www.csrc.nist.gov/publications/fips/fips197/fips-197.pdf>
+
+=item L<http://www.faqs.org/rfcs/rfc3602.html>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/AFCP.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/AFCP.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/AFCP.pm	(revision 24799)
@@ -0,0 +1,280 @@
+#------------------------------------------------------------------------------
+# File:         AFCP.pm
+#
+# Description:  Read/write AFCP trailer
+#
+# Revisions:    12/26/2005 - P. Harvey Created
+#
+# References:   1) http://www.tocarte.com/media/axs_afcp_spec.pdf
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::AFCP;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.04';
+
+sub ProcessAFCP($$);
+
+%Image::ExifTool::AFCP::Main = (
+    PROCESS_PROC => \&ProcessAFCP,
+    NOTES => q{
+AFCP stands for AXS File Concatenation Protocol, and is a poorly designed
+protocol for appending information to the end of files.  This can be used as
+an auxiliary technique to store IPTC information in images, but is
+incompatible with some file formats.
+
+ExifTool will read and write (but not create) AFCP IPTC information in JPEG
+and TIFF images.
+    },
+    IPTC => { SubDirectory => { TagTable => 'Image::ExifTool::IPTC::Main' } },
+    TEXT => 'Text',
+    Nail => {
+        Name => 'ThumbnailImage',
+        # (the specification allows for a variable amount of padding before
+        #  the image after a 10-byte header, so look for the JPEG SOI marker,
+        #  otherwise assume a fixed 8 bytes of padding)
+        RawConv => q{
+            pos($val) = 10;
+            my $start = ($val =~ /\xff\xd8\xff/g) ? pos($val) - 3 : 18;
+            my $img = substr($val, $start);
+            return $self->ValidateImage(\$img, $tag);
+        },
+    },
+    PrVw => {
+        Name => 'PreviewImage',
+        RawConv => q{
+            pos($val) = 10;
+            my $start = ($val =~ /\xff\xd8\xff/g) ? pos($val) - 3 : 18;
+            my $img = substr($val, $start);
+            return $self->ValidateImage(\$img, $tag);
+        },
+    },
+);
+
+#------------------------------------------------------------------------------
+# Read/write AFCP information in a file
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# (Set 'ScanForAFCP' member in dirInfo to scan from current position for AFCP)
+# Returns: 1 on success, 0 if this file didn't contain AFCP information
+#          -1 on write error or if the offsets were incorrect on reading
+# - updates DataPos to point to actual AFCP start if ScanForAFCP is set
+# - updates DirLen to trailer length
+# - returns Fixup reference in dirInfo hash when writing
+sub ProcessAFCP($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my $curPos = $raf->Tell();
+    my $offset = $$dirInfo{Offset} || 0;    # offset from end of file
+    my $rtnVal = 0;
+
+NoAFCP: for (;;) {
+        my ($buff, $fix, $dirBuff, $valBuff, $fixup, $vers);
+        # look for AXS trailer
+        last unless $raf->Seek(-12-$offset, 2) and
+                    $raf->Read($buff, 12) == 12 and
+                    $buff =~ /^(AXS(!|\*))/;
+        my $endPos = $raf->Tell();
+        my $hdr = $1;
+        SetByteOrder($2 eq '!' ? 'MM' : 'II');
+        my $startPos = Get32u(\$buff, 4);
+        if ($raf->Seek($startPos, 0) and $raf->Read($buff, 12) == 12 and $buff =~ /^$hdr/) {
+            $fix = 0;
+        } else {
+            $rtnVal = -1;
+            # look for start of AXS trailer if 'ScanForAFCP'
+            last unless $$dirInfo{ScanForAFCP} and $raf->Seek($curPos, 0);
+            my $actualPos = $curPos;
+            # first look for header right at current position
+            for (;;) {
+                last if $raf->Read($buff, 12) == 12 and $buff =~ /^$hdr/;
+                last NoAFCP if $actualPos != $curPos;
+                # scan for AXS header (could be after preview image)
+                for (;;) {
+                    my $buf2;
+                    $raf->Read($buf2, 65536) or last NoAFCP;
+                    $buff .= $buf2;
+                    if ($buff =~ /$hdr/g) {
+                        $actualPos += pos($buff) - length($hdr);
+                        last;   # ok, now go back and re-read header
+                    }
+                    $buf2 = substr($buf2, -3);  # only need last 3 bytes for next test
+                    $actualPos += length($buff) - length($buf2);
+                    $buff = $buf2;
+                }
+                last unless $raf->Seek($actualPos, 0);  # seek to start of AFCP
+            }
+            # calculate shift for fixing AFCP offsets
+            $fix = $actualPos - $startPos;
+        }
+        # set variables returned in dirInfo hash
+        $$dirInfo{DataPos} = $startPos + $fix;  # actual start position
+        $$dirInfo{DirLen} = $endPos - ($startPos + $fix);
+
+        $rtnVal = 1;
+        my $verbose = $exifTool->Options('Verbose');
+        my $out = $exifTool->Options('TextOut');
+        my $outfile = $$dirInfo{OutFile};
+        if ($outfile) {
+            # allow all AFCP information to be deleted
+            if ($exifTool->{DEL_GROUP}->{AFCP}) {
+                $verbose and print $out "  Deleting AFCP\n";
+                ++$exifTool->{CHANGED};
+                last;
+            }
+            $dirBuff = $valBuff = '';
+            require Image::ExifTool::Fixup;
+            $fixup = $$dirInfo{Fixup};
+            $fixup or $fixup = $$dirInfo{Fixup} = new Image::ExifTool::Fixup;
+            $vers = substr($buff, 4, 2); # get version number
+        } else {
+            $exifTool->DumpTrailer($dirInfo) if $verbose or $exifTool->{HTML_DUMP};
+        }
+        # read AFCP directory data
+        my $numEntries = Get16u(\$buff, 6);
+        my $dir;
+        unless ($raf->Read($dir, 12 * $numEntries) == 12 * $numEntries) {
+            $exifTool->Error('Error reading AFCP directory', 1);
+            last;
+        }
+        if ($verbose > 2 and not $outfile) {
+            my $dat = $buff . $dir;
+            print $out "  AFCP Directory:\n";
+            Image::ExifTool::HexDump(\$dat, undef,
+                Addr   => $$dirInfo{DataPos},
+                Width  => 12,
+                Prefix => $exifTool->{INDENT},
+                Out => $out,
+            );
+        }
+        $fix and $exifTool->Warn("Adjusted AFCP offsets by $fix", 1);
+#
+# process AFCP directory
+#
+        my $tagTablePtr = GetTagTable('Image::ExifTool::AFCP::Main');
+        my ($index, $entry);
+        for ($index=0; $index<$numEntries; ++$index) {
+            my $entry = 12 * $index;
+            my $tag = substr($dir, $entry, 4);
+            my $size = Get32u(\$dir, $entry + 4);
+            my $offset = Get32u(\$dir, $entry + 8);
+            if ($size < 0x80000000 and
+                $raf->Seek($offset+$fix, 0) and
+                $raf->Read($buff, $size) == $size)
+            {
+                if ($outfile) {
+                    # rewrite this information
+                    my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+                    if ($tagInfo and $$tagInfo{SubDirectory}) {
+                        my %subdirInfo = (
+                            DataPt => \$buff,
+                            DirStart => 0,
+                            DirLen => $size,
+                            DataPos => $offset + $fix,
+                            Parent => 'AFCP',
+                        );
+                        my $subTable = GetTagTable($tagInfo->{SubDirectory}->{TagTable});
+                        my $newDir = $exifTool->WriteDirectory(\%subdirInfo, $subTable);
+                        if (defined $newDir) {
+                            $size = length $newDir;
+                            $buff = $newDir;
+                        }
+                    }
+                    $fixup->AddFixup(length($dirBuff) + 8);
+                    $dirBuff .= $tag . Set32u($size) . Set32u(length $valBuff);
+                    $valBuff .= $buff;
+                } else {
+                    # extract information
+                    $exifTool->HandleTag($tagTablePtr, $tag, $buff,
+                        DataPt => \$buff,
+                        Size => $size,
+                        Index => $index,
+                        DataPos => $offset + $fix,
+                    );
+                }
+            } else {
+                $exifTool->Warn("Bad AFCP directory");
+                $rtnVal = -1 if $outfile;
+                last;
+            }
+        }
+        if ($outfile and length($dirBuff)) {
+            my $outPos = Tell($outfile);    # get current outfile position
+            # apply fixup to directory pointers
+            my $valPos = $outPos + 12;      # start of value data
+            $fixup->{Shift} += $valPos + length($dirBuff);
+            $fixup->ApplyFixup(\$dirBuff);
+            # write the AFCP header, directory, value data and EOF record (with zero checksums)
+            Write($outfile, $hdr, $vers, Set16u(length($dirBuff)/12), Set32u(0),
+                  $dirBuff, $valBuff, $hdr, Set32u($outPos), Set32u(0)) or $rtnVal = -1;
+            # complete fixup so the calling routine can apply further shifts
+            $fixup->AddFixup(length($dirBuff) + length($valBuff) + 4);
+            $fixup->{Start} += $valPos;
+            $fixup->{Shift} -= $valPos;
+        }
+        last;
+    }
+    return $rtnVal;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::AFCP - Read/write AFCP trailer
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to extract
+information from the AFCP trailer.  Although the AFCP specification is
+compatible with various file formats, ExifTool currently only processes AFCP
+in JPEG images.
+
+=head1 NOTES
+
+AFCP is a specification which allows meta information (including IPTC) to be
+appended to the end of a file.
+
+It is a poorly designed protocol because (like TIFF) it uses absolute
+offsets to specify data locations.  This is a huge blunder because it makes
+the AFCP information dependent on the file length, so it is easily
+invalidated by image editing software which doesn't recognize the AFCP
+trailer to fix up these offsets when the file length changes.  ExifTool will
+attempt to fix these invalid offsets if possible.
+
+Scanning for AFCP information may be time consuming, especially when reading
+from a sequential device, since the information is at the end of the file.
+In these instances, the ExifTool FastScan option may be used to disable
+scanning for AFCP information.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.tocarte.com/media/axs_afcp_spec.pdf>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/AFCP Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/AIFF.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/AIFF.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/AIFF.pm	(revision 24799)
@@ -0,0 +1,241 @@
+#------------------------------------------------------------------------------
+# File:         AIFF.pm
+#
+# Description:  Read AIFF meta information
+#
+# Revisions:    01/06/2006 - P. Harvey Created
+#               09/22/2008 - PH Added DjVu support
+#
+# References:   1) http://developer.apple.com/documentation/QuickTime/INMAC/SOUND/imsoundmgr.30.htm#pgfId=3190
+#               2) http://astronomy.swin.edu.au/~pbourke/dataformats/aiff/
+#               3) http://www.mactech.com/articles/mactech/Vol.06/06.01/SANENormalized/
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::AIFF;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::ID3;
+
+$VERSION = '1.03';
+
+# information for time/date-based tags (time zero is Jan 1, 1904)
+my %timeInfo = (
+    Groups => { 2 => 'Time' },
+    ValueConv => 'ConvertUnixTime($val - ((66 * 365 + 17) * 24 * 3600))',
+    PrintConv => '$self->ConvertDateTime($val)',
+);
+
+# AIFF info
+%Image::ExifTool::AIFF::Main = (
+    GROUPS => { 2 => 'Audio' },
+    NOTES => 'Only the tags decoded by ExifTool are listed in this table.',
+#    FORM => 'Format',
+    FVER => {
+        Name => 'FormatVersion',
+        SubDirectory => { TagTable => 'Image::ExifTool::AIFF::FormatVers' },
+    },
+    COMM => {
+        Name => 'Common',
+        SubDirectory => { TagTable => 'Image::ExifTool::AIFF::Common' },
+    },
+    COMT => {
+        Name => 'Comment',
+        SubDirectory => { TagTable => 'Image::ExifTool::AIFF::Comment' },
+    },
+    NAME => 'Name',
+    AUTH => { Name => 'Author', Groups => { 2 => 'Author' } },
+   '(c) ' => { Name => 'Copyright', Groups => { 2 => 'Author' } },
+    ANNO => 'Annotation',
+   'ID3 ' => {
+        Name => 'ID3',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::ID3::Main',
+            ProcessProc => \&Image::ExifTool::ID3::ProcessID3,
+        },
+    },
+#    SSND => 'SoundData',
+#    MARK => 'Marker',
+#    INST => 'Instrument',
+#    MIDI => 'MidiData',
+#    AESD => 'AudioRecording',
+#    APPL => 'ApplicationSpecific',
+);
+
+%Image::ExifTool::AIFF::Common = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Audio' },
+    FORMAT => 'int16u',
+    0 => 'NumChannels',
+    1 => { Name => 'NumSampleFrames', Format => 'int32u' },
+    3 => 'SampleSize',
+    4 => { Name => 'SampleRate', Format => 'extended' }, #3
+    9 => {
+        Name => 'CompressionType',
+        Format => 'string[4]',
+        PrintConv => {
+            NONE => 'None',
+            ACE2 => 'ACE 2-to-1',
+            ACE8 => 'ACE 8-to-3',
+            MAC3 => 'MAC 3-to-1',
+            MAC6 => 'MAC 6-to-1',
+            sowt => 'Little-endian, no compression',
+        },
+    },
+);
+
+%Image::ExifTool::AIFF::FormatVers = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    FORMAT => 'int32u',
+    0 => { Name => 'FormatVersionTime', %timeInfo },
+);
+
+%Image::ExifTool::AIFF::Comment = (
+    PROCESS_PROC => \&Image::ExifTool::AIFF::ProcessComment,
+    GROUPS => { 2 => 'Audio' },
+    0 => { Name => 'CommentTime', %timeInfo },
+    1 => 'MarkerID',
+    2 => 'Comment',
+);
+
+#------------------------------------------------------------------------------
+# Process AIFF Comment chunk
+# Inputs: 0) ExifTool object reference, 1) DirInfo reference, 2) tag table ref
+# Returns: 1 on success
+sub ProcessComment($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dirLen = $$dirInfo{DirLen};
+    my $verbose = $exifTool->Options('Verbose');
+    return 0 unless $dirLen > 2;
+    my $numComments = unpack('n',$$dataPt);
+    my $pos = 2;
+    my $i;
+    $verbose and $exifTool->VerboseDir('Comment', $numComments);
+    for ($i=0; $i<$numComments; ++$i) {
+        last if $pos + 8 > $dirLen;
+        my ($time, $markerID, $size) = unpack("x${pos}Nnn", $$dataPt);
+        $exifTool->HandleTag($tagTablePtr, 0, $time);
+        $exifTool->HandleTag($tagTablePtr, 1, $markerID) if $markerID;
+        $pos += 8;
+        last if $pos + $size > $dirLen;
+        my $val = substr($$dataPt, $pos, $size);
+        $exifTool->HandleTag($tagTablePtr, 2, $val);
+        ++$size if $size & 0x01;    # account for padding byte if necessary
+        $pos += $size;
+    }
+}
+
+#------------------------------------------------------------------------------
+# Extract information from a AIFF file
+# Inputs: 0) ExifTool object reference, 1) DirInfo reference
+# Returns: 1 on success, 0 if this wasn't a valid AIFF file
+sub ProcessAIFF($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my ($buff, $err, $tagTablePtr, $page, $type);
+
+    # verify this is a valid AIFF file
+    return 0 unless $raf->Read($buff, 12) == 12;
+    my $pos = 12;
+    # check for DjVu image
+    if ($buff =~ /^AT&TFORM/) {
+        # http://www.djvu.org/
+        # http://djvu.sourceforge.net/specs/djvu3changes.txt
+        my $buf2;
+        return 0 unless $raf->Read($buf2, 4) == 4 and $buf2 =~ /^(DJVU|DJVM)/;
+        $pos += 4;
+        $buff = substr($buff, 4) . $buf2;
+        $tagTablePtr = GetTagTable('Image::ExifTool::DjVu::Main');
+        $exifTool->SetFileType('DJVU');
+        # modifiy FileType to indicate a multi-page document
+        $exifTool->{VALUE}->{FileType} .= " (multi-page)" if $buf2 eq 'DJVM';
+        $type = 'DjVu';
+    } else {
+        return 0 unless $buff =~ /^FORM....(AIF(F|C))/s;
+        $exifTool->SetFileType($1);
+        $tagTablePtr = GetTagTable('Image::ExifTool::AIFF::Main');
+        $type = 'AIFF';
+    }
+    SetByteOrder('MM');
+#
+# Read through the IFF chunks
+#
+    for (;;) {
+        $raf->Read($buff, 8) == 8 or last;
+        $pos += 8;
+        my ($tag, $len) = unpack('a4N', $buff);
+        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        $exifTool->VPrint(0, "AIFF '$tag' chunk ($len bytes of data):\n");
+        # AIFF chunks are padded to an even number of bytes
+        my $len2 = $len + ($len & 0x01);
+        if ($tagInfo) {
+            if ($$tagInfo{TypeOnly}) {
+                $len = $len2 = 4;
+                $page = ($page || 0) + 1;
+                $exifTool->VPrint(0, $exifTool->{INDENT} . "Page $page:\n");
+            }
+            $raf->Read($buff, $len2) >= $len or $err=1, last;
+            unless ($$tagInfo{SubDirectory} or $$tagInfo{Binary}) {
+                $buff =~ s/\0+$//;  # remove trailing nulls
+            }
+            $exifTool->HandleTag($tagTablePtr, $tag, $buff,
+                DataPt => \$buff,
+                DataPos => $pos,
+                Start => 0,
+                Size => $len,
+            );
+        } else {
+            $raf->Seek($len2, 1) or $err=1, last;
+        }
+        $pos += $len2;
+    }
+    $err and $exifTool->Warn("Error reading $type file (corrupted?)");
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::AIFF - Read AIFF meta information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains routines required by Image::ExifTool to extract
+information from AIFF (Audio Interchange File Format) audio files.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://developer.apple.com/documentation/QuickTime/INMAC/SOUND/imsoundmgr.30.htm#pgfId=3190>
+
+=item L<http://astronomy.swin.edu.au/~pbourke/dataformats/aiff/>
+
+=item L<http://www.mactech.com/articles/mactech/Vol.06/06.01/SANENormalized/>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/AIFF Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/APE.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/APE.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/APE.pm	(revision 24799)
@@ -0,0 +1,254 @@
+#------------------------------------------------------------------------------
+# File:         APE.pm
+#
+# Description:  Read Monkey's Audio meta information
+#
+# Revisions:    11/13/2006 - P. Harvey Created
+#
+# References:   1) http://www.monkeysaudio.com/
+#               2) http://www.personal.uni-jena.de/~pfk/mpp/sv8/apetag.html
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::APE;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.01';
+
+# APE metadata blocks
+%Image::ExifTool::APE::Main = (
+    GROUPS => { 2 => 'Audio' },
+    NOTES => q{
+        Tags found in Monkey's Audio (APE) information.  Only a few common tags are
+        listed below, but ExifTool will extract any tag found.  ExifTool supports
+        APEv1 and APEv2 tags, as well as ID3 information in APE files.
+    },
+    Album   => { },
+    Artist  => { },
+    Genre   => { },
+    Title   => { },
+    Track   => { },
+    Year    => { },
+    'Tool Version' => { Name => 'ToolVersion' },
+    'Tool Name'    => { Name => 'ToolName' },
+);
+
+# APE MAC header version 3.97 or earlier
+%Image::ExifTool::APE::OldHeader = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 1 => 'MAC', 2 => 'Audio' },
+    FORMAT => 'int16u',
+    NOTES => 'APE MAC audio header for version 3.97 or earlier.',
+    0 => {
+        Name => 'APEVersion',
+        ValueConv => '$val / 1000',
+    },
+    1 => 'CompressionLevel',
+  # 2 => 'FormatFlags',
+    3 => 'Channels',
+    4 => { Name => 'SampleRate', Format => 'int32u' },
+  # 6 => { Name => 'HeaderBytes', Format => 'int32u' }, # WAV header bytes
+  # 8 => { Name => 'TerminatingBytes', Format => 'int32u' },
+    10 => { Name => 'TotalFrames', Format => 'int32u' },
+    12 => { Name => 'FinalFrameBlocks', Format => 'int32u' },
+);
+
+# APE MAC header version 3.98 or later
+%Image::ExifTool::APE::NewHeader = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 1 => 'MAC', 2 => 'Audio' },
+    FORMAT => 'int16u',
+    NOTES => 'APE MAC audio header for version 3.98 or later.',
+    0 => 'CompressionLevel',
+  # 1 => 'FormatFlags',
+    2 => { Name => 'BlocksPerFrame',   Format => 'int32u' },
+    4 => { Name => 'FinalFrameBlocks', Format => 'int32u' },
+    6 => { Name => 'TotalFrames',      Format => 'int32u' },
+    8 => 'BitsPerSample',
+    9 => 'Channels',
+    10 => { Name => 'SampleRate',      Format => 'int32u' },
+);
+
+#------------------------------------------------------------------------------
+# Make tag info hash for specified tag
+# Inputs: 0) tag name, 1) tag table ref
+# - must only call if tag doesn't exist
+sub MakeTag($$)
+{
+    my ($tag, $tagTablePtr) = @_;
+    my $name = ucfirst(lc($tag));
+    # remove invalid characters in tag name and capitalize following letters
+    $name =~ s/[^\w-]+(.?)/\U$1/sg;
+    $name =~ s/([a-z0-9])_([a-z])/$1\U$2/g;
+    Image::ExifTool::AddTagToTable($tagTablePtr, $tag, { Name => $name });
+}
+
+#------------------------------------------------------------------------------
+# Extract information from an APE file
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# - Just looks for APE trailer if FileType is already set
+# Returns: 1 on success, 0 if this wasn't a valid APE file
+sub ProcessAPE($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+
+    # must first check for leading/trailing ID3 information
+    unless ($exifTool->{DoneID3}) {
+        require Image::ExifTool::ID3;
+        Image::ExifTool::ID3::ProcessID3($exifTool, $dirInfo) and return 1;
+    }
+    my $raf = $$dirInfo{RAF};
+    my $verbose = $exifTool->Options('Verbose');
+    my ($buff, $i, $header, $tagTablePtr, $dataPos);
+
+    # check APE signature and process audio information
+    # unless this is some other type of file
+    unless ($exifTool->{VALUE}->{FileType}) {
+        $raf->Read($buff, 32) == 32 or return 0;
+        $buff =~ /^(MAC |APETAGEX)/ or return 0;
+        $exifTool->SetFileType();
+        SetByteOrder('II');
+
+        if ($buff =~ /^APETAGEX/) {
+            # we already read the APE header
+            $header = 1;
+        } else {
+            # process the MAC header
+            my $vers = Get16u(\$buff, 4);
+            my $table;
+            if ($vers <= 3970) {
+                $buff = substr($buff, 4);
+                $table = GetTagTable('Image::ExifTool::APE::OldHeader');
+            } else {
+                my $dlen = Get32u(\$buff, 8);
+                my $hlen = Get32u(\$buff, 12);
+                unless ($dlen & 0x80000000 or $hlen & 0x80000000) {
+                    if ($raf->Seek($dlen, 0) and $raf->Read($buff, $hlen) == $hlen) {
+                        $table = GetTagTable('Image::ExifTool::APE::NewHeader');
+                    }
+                }
+            }
+            $exifTool->ProcessDirectory( { DataPt => \$buff }, $table) if $table;
+        }
+    }
+    # look for APE trailer unless we already found an APE header
+    unless ($header) {
+        # look for the APE trailer footer...
+        my $footPos = -32;
+        # (...but before the ID3v1 trailer if it exists)
+        $footPos -= 128 if $exifTool->{DoneID3} == 2;
+        $raf->Seek($footPos, 2)     or return 1;
+        $raf->Read($buff, 32) == 32 or return 1;
+        $buff =~ /^APETAGEX/        or return 1;
+        SetByteOrder('II');
+    }
+#
+# Read the APE data (we have just read the APE header or footer into $buff)
+#
+    my ($version, $size, $count, $flags) = unpack('x8V4', $buff);
+    $version /= 1000;
+    $size -= 32;    # get size of data only
+    if (($size & 0x80000000) == 0 and
+        ($header or $raf->Seek(-$size-32, 1)) and
+        $raf->Read($buff, $size) == $size)
+    {
+        if ($verbose) {
+            $exifTool->VerboseDir("APEv$version", $count, $size);
+            $exifTool->VerboseDump(\$buff, DataPos => $raf->Tell() - $size);
+        }
+        $tagTablePtr = GetTagTable('Image::ExifTool::APE::Main');
+        $dataPos = $raf->Tell() - $size;
+    } else {
+        $count = -1;
+    }
+#
+# Process the APE tags
+#
+    my $pos = 0;
+    for ($i=0; $i<$count; ++$i) {
+        # read next APE tag
+        last if $pos + 8 > $size;
+        my $len = Get32u(\$buff, $pos);
+        my $flags = Get32u(\$buff, $pos + 4);
+        pos($buff) = $pos + 8;
+        last unless $buff =~ /\G(.*?)\0/sg;
+        my $tag = $1;
+        $pos = pos($buff);
+        last if $pos + $len > $size;
+        my $val = substr($buff, $pos, $len);
+        MakeTag($tag, $tagTablePtr) unless $$tagTablePtr{$tag};
+        # handle binary-value tags
+        if (($flags & 0x06) == 0x02) {
+            my $buf2 = $val;
+            $val = \$buf2;
+            # extract cover art description separately (hackitty hack)
+            if ($tag =~ /^Cover Art/) {
+                $buf2 =~ s/^([\x20-\x7f]*)\0//;
+                if ($1) {
+                    my $t = "$tag Desc";
+                    my $v = $1;
+                    MakeTag($t, $tagTablePtr) unless $$tagTablePtr{$t};
+                    $exifTool->HandleTag($tagTablePtr, $t, $v);
+                }
+            }
+        }
+        $exifTool->HandleTag($tagTablePtr, $tag, $val,
+            Index => $i,
+            DataPt => \$buff,
+            DataPos => $dataPos,
+            Start => $pos,
+            Size => $len,
+        );
+        $pos += $len;
+    }
+    $i == $count or $exifTool->Warn('Bad APE trailer');
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::APE - Read Monkey's Audio meta information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to extract meta
+information from Monkey's Audio (APE) audio files.
+
+=head1 BUGS
+
+Currently doesn't parse MAC header unless it is at the start of the file.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.monkeysaudio.com/>
+
+=item L<http://www.personal.uni-jena.de/~pfk/mpp/sv8/apetag.html>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/APE Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/APP12.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/APP12.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/APP12.pm	(revision 24799)
@@ -0,0 +1,321 @@
+#------------------------------------------------------------------------------
+# File:         APP12.pm
+#
+# Description:  Read APP12 meta information
+#
+# Revisions:    10/18/2005 - P. Harvey Created
+#
+# References:   1) Heinrich Giesen private communication
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::APP12;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess);
+
+$VERSION = '1.08';
+
+sub ProcessAPP12($$$);
+sub ProcessDucky($$$);
+sub WriteDucky($$$);
+
+# APP12 tags (ref PH)
+%Image::ExifTool::APP12::PictureInfo = (
+    PROCESS_PROC => \&ProcessAPP12,
+    GROUPS => { 0 => 'APP12', 1 => 'PictureInfo', 2 => 'Image' },
+    NOTES => q{
+        The JPEG APP12 "Picture Info" segment was used by some older cameras, and
+        contains ASCII-based meta information.  Below are some tags which have been
+        observed Agfa and Polaroid images, however ExifTool will extract information
+        from any tags found in this segment.
+    },
+    FNumber => {
+        ValueConv => '$val=~s/^[A-Za-z ]*//;$val',  # Agfa leads with an 'F'
+        PrintConv => 'sprintf("%.1f",$val)',
+    },
+    Aperture => {
+        PrintConv => 'sprintf("%.1f",$val)',
+    },
+    TimeDate => {
+        Name => 'DateTimeOriginal',
+        Description => 'Date/Time Original',
+        Groups => { 2 => 'Time' },
+        ValueConv => '$val=~/^\d+$/ ? ConvertUnixTime($val) : $val',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    Shutter => {
+        Name => 'ExposureTime',
+        ValueConv => '$val * 1e-6',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+    },
+    shtr => {
+        Name => 'ExposureTime',
+        ValueConv => '$val * 1e-6',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+    },
+   'Serial#'    => {
+        Name => 'SerialNumber',
+        Groups => { 2 => 'Camera' },
+    },
+    Flash       => { PrintConv => { 0 => 'Off', 1 => 'On' } },
+    Macro       => { PrintConv => { 0 => 'Off', 1 => 'On' } },
+    StrobeTime  => { },
+    Ytarget     => { Name => 'YTarget' },
+    ylevel      => { Name => 'YLevel' },
+    FocusPos    => { },
+    FocusMode   => { },
+    Quality     => { },
+    ExpBias     => 'ExposureCompensation',
+    FWare       => 'FirmwareVersion',
+    StrobeTime  => { },
+    Resolution  => { },
+    Protect     => { },
+    ConTake     => { },
+    ImageSize   => { PrintConv => '$val=~tr/-/x/;$val' },
+    ColorMode   => { },
+    Zoom        => { },
+    ZoomPos     => { },
+    LightS      => { },
+    Type        => {
+        Name => 'CameraType',
+        Groups => { 2 => 'Camera' },
+        DataMember => 'CameraType',
+        RawConv => '$self->{CameraType} = $val',
+    },
+    Version     => { Groups => { 2 => 'Camera' } },
+    ID          => { Groups => { 2 => 'Camera' } },
+);
+
+# APP12 segment written in Photoshop "Save For Web" images
+# (from tests with Photoshop 7 files - PH/1)
+%Image::ExifTool::APP12::Ducky = (
+    PROCESS_PROC => \&ProcessDucky,
+    WRITE_PROC => \&WriteDucky,
+    GROUPS => { 0 => 'Ducky', 1 => 'Ducky', 2 => 'Image' },
+    WRITABLE => 'string',
+    NOTES => q{
+        Photoshop uses the JPEG APP12 "Ducky" segment to store some information in
+        "Save for Web" images.
+    },
+    1 => { #PH
+        Name => 'Quality',
+        Priority => 0,
+        Avoid => 1,
+        Writable => 'int32u',
+        ValueConv => 'unpack("N",$val)',    # 4-byte integer
+        ValueConvInv => 'pack("N",$val)',
+        PrintConv => '"$val%"',
+        PrintConvInv => '$val=~/(\d+)/ ? $1 : undef',
+    },
+    2 => { #1
+        Name => 'Comment',
+        Priority => 0,
+        Avoid => 1,
+        # (ignore 4-byte character count at start of value)
+        ValueConv => '$self->Decode(substr($val,4),"UCS2","MM")',
+        ValueConvInv => 'pack("N",length $val) . $self->Encode($val,"UCS2","MM")',
+    },
+    3 => { #PH
+        Name => 'Copyright',
+        Priority => 0,
+        Avoid => 1,
+        Groups => { 2 => 'Author' },
+        # (ignore 4-byte character count at start of value)
+        ValueConv => '$self->Decode(substr($val,4),"UCS2","MM")',
+        ValueConvInv => 'pack("N",length $val) . $self->Encode($val,"UCS2","MM")',
+    },
+);
+
+#------------------------------------------------------------------------------
+# Write APP12 Ducky segment
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: New directory data or undefined on error
+sub WriteDucky($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    $exifTool or return 1;    # allow dummy access to autoload this package
+    my $dataPt = $$dirInfo{DataPt};
+    my $pos = $$dirInfo{DirStart};
+    my $newTags = $exifTool->GetNewTagInfoHash($tagTablePtr);
+    my @addTags = sort { $a <=> $b } keys(%$newTags);
+    my ($dirEnd, %doneTags);
+    if ($dataPt) {
+        $dirEnd = $pos + $$dirInfo{DirLen};
+    } else {
+        my $tmp = '';
+        $dataPt = \$tmp;
+        $pos = $dirEnd = 0;
+    }
+    my $newData = '';
+    SetByteOrder('MM');
+    # process all data blocks in Ducky segment
+    for (;;) {
+        my ($tag, $len, $val);
+        if ($pos + 4 <= $dirEnd) {
+            $tag = Get16u($dataPt, $pos);
+            $len = Get16u($dataPt, $pos + 2);
+            $pos += 4;
+            if ($pos + $len > $dirEnd) {
+                $exifTool->Warn('Invalid Ducky block length');
+                return undef;
+            }
+            $val = substr($$dataPt, $pos, $len);
+            $pos += $len;
+        } else {
+            last unless @addTags;
+            $tag = pop @addTags;
+            next if $doneTags{$tag};
+        }
+        $doneTags{$tag} = 1;
+        my $tagInfo = $$newTags{$tag};
+        if ($tagInfo) {
+            my $nvHash = $exifTool->GetNewValueHash($tagInfo);
+            my $isNew;
+            if (defined $val) {
+                if (Image::ExifTool::IsOverwriting($nvHash, $val)) {
+                    $exifTool->VerboseValue("- Ducky:$$tagInfo{Name}", $val);
+                    $isNew = 1;
+                }
+            } else {
+                next unless Image::ExifTool::IsCreating($nvHash);
+                $isNew = 1;
+            }
+            if ($isNew) {
+                $val = Image::ExifTool::GetNewValues($nvHash);
+                ++$exifTool->{CHANGED};
+                next unless defined $val;   # next if tag is being deleted
+                $exifTool->VerboseValue("+ Ducky:$$tagInfo{Name}", $val);
+            }
+        }
+        $newData .= pack('nn', $tag, length $val) . $val;
+    }
+    $newData .= "\0\0" if length $newData;
+    return $newData;
+}
+
+#------------------------------------------------------------------------------
+# Process APP12 Ducky segment (ref PH)
+# Inputs: 0) ExifTool object reference, 1) Directory information ref, 2) tag table ref
+# Returns: 1 on success, 0 if this wasn't a recognized Ducky segment
+# Notes: This segment has the following format:
+#   1) 5 bytes: "Ducky"
+#   2) multiple data blocks (all integers are big endian):
+#      a) 2 bytes: block type (0=end, 1=Quality, 2=Comment, 3=Copyright)
+#      b) 2 bytes: block length (N)
+#      c) N bytes: block data
+sub ProcessDucky($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $pos = $$dirInfo{DirStart};
+    my $dirEnd = $pos + $$dirInfo{DirLen};
+    SetByteOrder('MM');
+    # process all data blocks in Ducky segment
+    for (;;) {
+        last if $pos + 4 > $dirEnd;
+        my $tag = Get16u($dataPt, $pos);
+        my $len = Get16u($dataPt, $pos + 2);
+        $pos += 4;
+        if ($pos + $len > $dirEnd) {
+            $exifTool->Warn('Invalid Ducky block length');
+            last;
+        }
+        my $val = substr($$dataPt, $pos, $len);
+        $exifTool->HandleTag($tagTablePtr, $tag, $val,
+            DataPt => $dataPt,
+            DataPos => $$dirInfo{DataPos},
+            Start => $pos,
+            Size => $len,
+        );
+        $pos += $len;
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Process APP12 Picture Info segment (ref PH)
+# Inputs: 0) ExifTool object reference, 1) Directory information ref, 2) tag table ref
+# Returns: 1 on success, 0 if this wasn't a recognized APP12
+sub ProcessAPP12($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dirStart = $$dirInfo{DirStart} || 0;
+    my $dirLen = $$dirInfo{DirLen} || (length($$dataPt) - $dirStart);
+    if ($dirLen != $dirStart + length($$dataPt)) {
+        my $buff = substr($$dataPt, $dirStart, $dirLen);
+        $dataPt = \$buff;
+    } else {
+        pos($$dataPt) = $$dirInfo{DirStart};
+    }
+    my $verbose = $exifTool->Options('Verbose');
+    my $success = 0;
+    my $section = '';
+    pos($$dataPt) = 0;
+
+    # this regular expression is a bit complex, but basically we are looking for
+    # section headers (ie. "[Camera Info]") and tag/value pairs (ie. "tag=value",
+    # where "value" may contain white space), separated by spaces or CR/LF.
+    # (APP12 uses CR/LF, but Olympus TextualInfo is similar and uses spaces)
+    while ($$dataPt =~ /(\[.*?\]|[\w#-]+=[\x20-\x7e]+?(?=\s*([\n\r\0]|[\w#-]+=|\[|$)))/g) {
+        my $token = $1;
+        # was this a section name?
+        if ($token =~ /^\[(.*)\]/) {
+            $exifTool->VerboseDir($1) if $verbose;
+            $section = ($token =~ /\[(\S+) ?Info\]/i) ? $1 : '';
+            $success = 1;
+            next;
+        }
+        $exifTool->VerboseDir($$dirInfo{DirName}) if $verbose and not $success;
+        $success = 1;
+        my ($tag, $val) = ($token =~ /(\S+)=(.+)/);
+        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        $verbose and $exifTool->VerboseInfo($tag, $tagInfo, Value => $val);
+        unless ($tagInfo) {
+            # add new tag to table
+            $tagInfo = { Name => ucfirst $tag };
+            # put in Camera group if information in "Camera" section
+            $$tagInfo{Groups} = { 2 => 'Camera' } if $section =~ /camera/i;
+            Image::ExifTool::AddTagToTable($tagTablePtr, $tag, $tagInfo);
+        }
+        $exifTool->FoundTag($tagInfo, $val);
+    }
+    return $success;
+}
+
+
+1;  #end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::APP12 - Read APP12 meta information
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to interpret
+APP12 meta information.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Heinrich Giesen for his help decoding APP12 "Ducky" information.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/APP12 Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/ASF.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/ASF.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/ASF.pm	(revision 24799)
@@ -0,0 +1,870 @@
+#------------------------------------------------------------------------------
+# File:         ASF.pm
+#
+# Description:  Read ASF/WMA/WMV meta information
+#
+# Revisions:    12/23/2005 - P. Harvey Created
+#
+# References:   1) http://www.microsoft.com/windows/windowsmedia/format/asfspec.aspx
+#               2) http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart3.pdf (Oct 2008)
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::ASF;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::Exif;
+use Image::ExifTool::RIFF;
+
+$VERSION = '1.17';
+
+sub ProcessMetadata($$$);
+sub ProcessContentDescription($$$);
+sub ProcessPicture($$$);
+sub ProcessCodecList($$$);
+
+# GUID definitions
+my %errorCorrection = (
+    '20FB5700-5B55-11CF-A8FD-00805F5C442B' => 'No Error Correction',
+    'BFC3CD50-618F-11CF-8BB2-00AA00B4E220' => 'Audio Spread',
+);
+
+my %streamType = (
+    'F8699E40-5B4D-11CF-A8FD-00805F5C442B' => 'Audio',
+    'BC19EFC0-5B4D-11CF-A8FD-00805F5C442B' => 'Video',
+    '59DACFC0-59E6-11D0-A3AC-00A0C90348F6' => 'Command',
+    'B61BE100-5B4E-11CF-A8FD-00805F5C442B' => 'JFIF',
+    '35907DE0-E415-11CF-A917-00805F5C442B' => 'Degradable JPEG',
+    '91BD222C-F21C-497A-8B6D-5AA86BFC0185' => 'File Transfer',
+    '3AFB65E2-47EF-40F2-AC2C-70A90D71D343' => 'Binary',
+);
+
+my %mutex = (
+    'D6E22A00-35DA-11D1-9034-00A0C90349BE' => 'MutexLanguage',
+    'D6E22A01-35DA-11D1-9034-00A0C90349BE' => 'MutexBitrate',
+    'D6E22A02-35DA-11D1-9034-00A0C90349BE' => 'MutexUnknown',
+);
+
+my %bandwidthSharing = (
+    'AF6060AA-5197-11D2-B6AF-00C04FD908E9' => 'SharingExclusive',
+    'AF6060AB-5197-11D2-B6AF-00C04FD908E9' => 'SharingPartial',
+);
+
+my %typeSpecific = (
+    '776257D4-C627-41CB-8F81-7AC7FF1C40CC' => 'WebStreamMediaSubtype',
+    'DA1E6B13-8359-4050-B398-388E965BF00C' => 'WebStreamFormat',
+);
+
+my %advancedContentEncryption = (
+    '7A079BB6-DAA4-4e12-A5CA-91D38DC11A8D' => 'DRMNetworkDevices',
+);
+
+# ASF top level objects
+%Image::ExifTool::ASF::Main = (
+    PROCESS_PROC => \&Image::ExifTool::ASF::ProcessASF,
+    NOTES => q{
+        The ASF format is used by Windows WMA and WMV files, and DIVX videos.  Tag
+        ID's aren't listed because they are huge 128-bit GUID's that would ruin the
+        formatting of this table.
+    },
+    '75B22630-668E-11CF-A6D9-00AA0062CE6C' => {
+        Name => 'Header',
+        SubDirectory => { TagTable => 'Image::ExifTool::ASF::Header', Size => 6 },
+    },
+    '75B22636-668E-11CF-A6D9-00AA0062CE6C' => 'Data',
+    '33000890-E5B1-11CF-89F4-00A0C90349CB' => 'SimpleIndex',
+    'D6E229D3-35DA-11D1-9034-00A0C90349BE' => 'Index',
+    'FEB103F8-12AD-4C64-840F-2A1D2F7AD48C' => 'MediaIndex',
+    '3CB73FD0-0C4A-4803-953D-EDF7B6228F0C' => 'TimecodeIndex',
+    'BE7ACFCB-97A9-42E8-9C71-999491E3AFAC' => { #2
+        Name => 'XMP',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' },
+    },
+);
+
+# ASF header objects
+%Image::ExifTool::ASF::Header = (
+    PROCESS_PROC => \&Image::ExifTool::ASF::ProcessASF,
+    '8CABDCA1-A947-11CF-8EE4-00C00C205365' => {
+        Name => 'FileProperties',
+        SubDirectory => { TagTable => 'Image::ExifTool::ASF::FileProperties' },
+    },
+    'B7DC0791-A9B7-11CF-8EE6-00C00C205365' => {
+        Name => 'StreamProperties',
+        SubDirectory => { TagTable => 'Image::ExifTool::ASF::StreamProperties' },
+    },
+    '5FBF03B5-A92E-11CF-8EE3-00C00C205365' => {
+        Name => 'HeaderExtension',
+        SubDirectory => { TagTable => 'Image::ExifTool::ASF::HeaderExtension', Size => 22 },
+    },
+    '86D15240-311D-11D0-A3A4-00A0C90348F6' => {
+        Name => 'CodecList',
+        SubDirectory => { TagTable => 'Image::ExifTool::ASF::CodecList' },
+    },
+    '1EFB1A30-0B62-11D0-A39B-00A0C90348F6' => 'ScriptCommand',
+    'F487CD01-A951-11CF-8EE6-00C00C205365' => 'Marker',
+    'D6E229DC-35DA-11D1-9034-00A0C90349BE' => 'BitrateMutualExclusion',
+    '75B22635-668E-11CF-A6D9-00AA0062CE6C' => 'ErrorCorrection',
+    '75B22633-668E-11CF-A6D9-00AA0062CE6C' => {
+        Name => 'ContentDescription',
+        SubDirectory => { TagTable => 'Image::ExifTool::ASF::ContentDescr' },
+    },
+    '2211B3FA-BD23-11D2-B4B7-00A0C955FC6E' => {
+        Name => 'ContentBranding',
+        SubDirectory => { TagTable => 'Image::ExifTool::ASF::ContentBranding' },
+    },
+    'D2D0A440-E307-11D2-97F0-00A0C95EA850' => {
+        Name => 'ExtendedContentDescr',
+        SubDirectory => { TagTable => 'Image::ExifTool::ASF::ExtendedDescr' },
+    },
+    '7BF875CE-468D-11D1-8D82-006097C9A2B2' => 'StreamBitrateProps',
+    '2211B3FB-BD23-11D2-B4B7-00A0C955FC6E' => 'ContentEncryption',
+    '298AE614-2622-4C17-B935-DAE07EE9289C' => 'ExtendedContentEncryption',
+    '2211B3FC-BD23-11D2-B4B7-00A0C955FC6E' => 'DigitalSignature',
+    '1806D474-CADF-4509-A4BA-9AABCB96AAE8' => 'Padding',
+);
+
+%Image::ExifTool::ASF::ContentDescr = (
+    PROCESS_PROC => \&ProcessContentDescription,
+    GROUPS => { 2 => 'Video' },
+    0 => 'Title',
+    1 => { Name => 'Author', Groups => { 2 => 'Author' } },
+    2 => { Name => 'Copyright', Groups => { 2 => 'Author' } },
+    3 => 'Description',
+    4 => 'Rating',
+);
+
+%Image::ExifTool::ASF::ContentBranding = (
+    PROCESS_PROC => \&ProcessContentBranding,
+    GROUPS => { 2 => 'Author' },
+    0 => {
+        Name => 'BannerImageType',
+        PrintConv => {
+            0 => 'None',
+            1 => 'Bitmap',
+            2 => 'JPEG',
+            3 => 'GIF',
+        },
+    },
+    1 => { Name => 'BannerImage', Binary => 1 },
+    2 => 'BannerImageURL',
+    3 => 'CopyrightURL',
+);
+
+%Image::ExifTool::ASF::ExtendedDescr = (
+    PROCESS_PROC => \&ProcessExtendedContentDescription,
+    GROUPS => { 2 => 'Video' },
+    ASFLeakyBucketPairs => { Binary => 1 },
+    AspectRatioX => {},
+    AspectRatioY => {},
+    Author => { Groups => { 2 => 'Author' } },
+    AverageLevel => {},
+    BannerImageData => {},
+    BannerImageType => {},
+    BannerImageURL => {},
+    Bitrate => { PrintConv => 'ConvertBitrate($val)' },
+    Broadcast => {},
+    BufferAverage => {},
+    Can_Skip_Backward => {},
+    Can_Skip_Forward => {},
+    Copyright => { Groups => { 2 => 'Author' } },
+    CopyrightURL => { Groups => { 2 => 'Author' } },
+    CurrentBitrate => { PrintConv => 'ConvertBitrate($val)' },
+    Description => {},
+    DRM_ContentID => {},
+    DRM_DRMHeader_ContentDistributor => {},
+    DRM_DRMHeader_ContentID => {},
+    DRM_DRMHeader_IndividualizedVersion => {},
+    DRM_DRMHeader_KeyID => {},
+    DRM_DRMHeader_LicenseAcqURL => {},
+    DRM_DRMHeader_SubscriptionContentID => {},
+    DRM_DRMHeader => {},
+    DRM_IndividualizedVersion => {},
+    DRM_KeyID => {},
+    DRM_LASignatureCert => {},
+    DRM_LASignatureLicSrvCert => {},
+    DRM_LASignaturePrivKey => {},
+    DRM_LASignatureRootCert => {},
+    DRM_LicenseAcqURL => {},
+    DRM_V1LicenseAcqURL => {},
+    Duration => { PrintConv => 'ConvertDuration($val)' },
+    FileSize => {},
+    HasArbitraryDataStream => {},
+    HasAttachedImages => {},
+    HasAudio => {},
+    HasFileTransferStream => {},
+    HasImage => {},
+    HasScript => {},
+    HasVideo => {},
+    Is_Protected => {},
+    Is_Trusted => {},
+    IsVBR => {},
+    NSC_Address => {},
+    NSC_Description => {},
+    NSC_Email => {},
+    NSC_Name => {},
+    NSC_Phone => {},
+    NumberOfFrames => {},
+    OptimalBitrate => { PrintConv => 'ConvertBitrate($val)' },
+    PeakValue => {},
+    Rating => {},
+    Seekable => {},
+    Signature_Name => {},
+    Stridable => {},
+    Title => {},
+    VBRPeak => {},
+    # "WM/" tags...
+    AlbumArtist => {},
+    AlbumCoverURL => {},
+    AlbumTitle => {},
+    ASFPacketCount => {},
+    ASFSecurityObjectsSize => {},
+    AudioFileURL => {},
+    AudioSourceURL => {},
+    AuthorURL => { Groups => { 2 => 'Author' } },
+    BeatsPerMinute => {},
+    Category => {},
+    Codec => {},
+    Composer => {},
+    Conductor => {},
+    ContainerFormat => {},
+    ContentDistributor => {},
+    ContentGroupDescription => {},
+    Director => {},
+    DRM => {},
+    DVDID => {},
+    EncodedBy => {},
+    EncodingSettings => {},
+    EncodingTime => { Groups => { 2 => 'Time' } },
+    Genre => {},
+    GenreID => {},
+    InitialKey => {},
+    ISRC => {},
+    Language => {},
+    Lyrics => {},
+    Lyrics_Synchronised => {},
+    MCDI => {},
+    MediaClassPrimaryID => {},
+    MediaClassSecondaryID => {},
+    MediaCredits => {},
+    MediaIsDelay => {},
+    MediaIsFinale => {},
+    MediaIsLive => {},
+    MediaIsPremiere => {},
+    MediaIsRepeat => {},
+    MediaIsSAP => {},
+    MediaIsStereo => {},
+    MediaIsSubtitled => {},
+    MediaIsTape => {},
+    MediaNetworkAffiliation => {},
+    MediaOriginalBroadcastDateTime => { Groups => { 2 => 'Time' } },
+    MediaOriginalChannel => {},
+    MediaStationCallSign => {},
+    MediaStationName => {},
+    ModifiedBy => {},
+    Mood => {},
+    OriginalAlbumTitle => {},
+    OriginalArtist => {},
+    OriginalFilename => {},
+    OriginalLyricist => {},
+    OriginalReleaseTime => { Groups => { 2 => 'Time' } },
+    OriginalReleaseYear => { Groups => { 2 => 'Time' } },
+    ParentalRating => {},
+    ParentalRatingReason => {},
+    PartOfSet => {},
+    PeakBitrate => { PrintConv => 'ConvertBitrate($val)' },
+    Period => {},
+    Picture => {
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::ASF::Picture',
+        },
+    },
+    PlaylistDelay => {},
+    Producer => {},
+    PromotionURL => {},
+    ProtectionType => {},
+    Provider => {},
+    ProviderCopyright => {},
+    ProviderRating => {},
+    ProviderStyle => {},
+    Publisher => {},
+    RadioStationName => {},
+    RadioStationOwner => {},
+    SharedUserRating => {},
+    StreamTypeInfo => {},
+    SubscriptionContentID => {},
+    SubTitle => {},
+    SubTitleDescription => {},
+    Text => {},
+    ToolName => {},
+    ToolVersion => {},
+    Track => {},
+    TrackNumber => {},
+    UniqueFileIdentifier => {},
+    UserWebURL => {},
+    VideoClosedCaptioning => {},
+    VideoFrameRate => {},
+    VideoHeight => {},
+    VideoWidth => {},
+    WMADRCAverageReference => {},
+    WMADRCAverageTarget => {},
+    WMADRCPeakReference => {},
+    WMADRCPeakTarget => {},
+    WMCollectionGroupID => {},
+    WMCollectionID => {},
+    WMContentID => {},
+    Writer => { Groups => { 2 => 'Author' } },
+    Year => { Groups => { 2 => 'Time' } },
+);
+
+%Image::ExifTool::ASF::Picture = (
+    PROCESS_PROC => \&ProcessPicture,
+    GROUPS => { 2 => 'Image' },
+    0 => {
+        Name => 'PictureType',
+        PrintConv => { # (Note: Duplicated in ID3, ASF and FLAC modules!)
+            0 => 'Other',
+            1 => '32x32 PNG Icon',
+            2 => 'Other Icon',
+            3 => 'Front Cover',
+            4 => 'Back Cover',
+            5 => 'Leaflet',
+            6 => 'Media',
+            7 => 'Lead Artist',
+            8 => 'Artist',
+            9 => 'Conductor',
+            10 => 'Band',
+            11 => 'Composer',
+            12 => 'Lyricist',
+            13 => 'Recording Studio or Location',
+            14 => 'Recording Session',
+            15 => 'Performance',
+            16 => 'Capture from Movie or Video',
+            17 => 'Bright(ly) Colored Fish',
+            18 => 'Illustration',
+            19 => 'Band Logo',
+            20 => 'Publisher Logo',
+        },
+    },
+    1 => 'PictureMimeType',
+    2 => 'PictureDescription',
+    3 => {
+        Name => 'Picture',
+        Binary => 1,
+    },
+);
+
+%Image::ExifTool::ASF::FileProperties = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Video' },
+    0  => {
+        Name => 'FileID',
+        Format => 'binary[16]',
+        ValueConv => 'Image::ExifTool::ASF::GetGUID($val)',
+    },
+    16 => { Name => 'FileLength',   Format => 'int64u' },
+    24 => {
+        Name => 'CreationDate',
+        Format => 'int64u',
+        Groups => { 2 => 'Time' },
+        # time is in 100 ns intervals since 0:00 UTC Jan 1, 1601
+        ValueConv => q{ # (89 leap years between 1601 and 1970)
+            my $t = $val / 1e7 - (((1970-1601)*365+89)*24*3600);
+            return Image::ExifTool::ConvertUnixTime($t) . 'Z';
+        }
+    },
+    32 => { Name => 'DataPackets',  Format => 'int64u' },
+    40 => {
+        Name => 'PlayDuration',
+        Format => 'int64u',
+        ValueConv => '$val / 1e7',
+        PrintConv => 'ConvertDuration($val)',
+    },
+    48 => {
+        Name => 'SendDuration',
+        Format => 'int64u',
+        ValueConv => '$val / 1e7',
+        PrintConv => 'ConvertDuration($val)',
+    },
+    56 => { Name => 'Preroll',      Format => 'int64u' },
+    64 => { Name => 'Flags',        Format => 'int32u' },
+    68 => { Name => 'MinPacketSize',Format => 'int32u' },
+    72 => { Name => 'MaxPacketSize',Format => 'int32u' },
+    76 => { Name => 'MaxBitrate',   Format => 'int32u', PrintConv => 'ConvertBitrate($val)' },
+);
+
+%Image::ExifTool::ASF::StreamProperties = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Video' },
+    NOTES => 'Tags with index 54 and greater are conditional based on the StreamType.',
+    0  => {
+        Name => 'StreamType',
+        Format => 'binary[16]',
+        RawConv => sub { # set ASF_STREAM_TYPE for use in conditional tags
+            my ($val, $exifTool) = @_;
+            $exifTool->{ASF_STREAM_TYPE} = $streamType{GetGUID($val)} || '';
+            return $val;
+        },
+        ValueConv => 'Image::ExifTool::ASF::GetGUID($val)',
+        PrintConv => \%streamType,
+    },
+    16 => {
+        Name => 'ErrorCorrectionType',
+        Format => 'binary[16]',
+        ValueConv => 'Image::ExifTool::ASF::GetGUID($val)',
+        PrintConv => \%errorCorrection,
+    },
+    32 => {
+        Name => 'TimeOffset',
+        Format => 'int64u',
+        ValueConv => '$val / 1e7',
+        PrintConv => '"$val s"',
+    },
+    48 => {
+        Name => 'StreamNumber',
+        Format => 'int16u',
+        PrintConv => '($val & 0x7f) . ($val & 0x8000 ? " (encrypted)" : "")',
+    },
+    54 => [
+        {
+            Condition => '$self->{ASF_STREAM_TYPE} eq "Audio"',
+            Name => 'AudioCodecID',
+            Format => 'int16u',
+            PrintHex => 1,
+            SeparateTable => 'RIFF AudioEncoding',
+            PrintConv => \%Image::ExifTool::RIFF::audioEncoding,
+        },
+        {
+            Condition => '$self->{ASF_STREAM_TYPE} =~ /^(Video|JFIF|Degradable JPEG)$/',
+            Name => 'ImageWidth',
+            Format => 'int32u',
+        },
+    ],
+    56 => {
+        Condition => '$self->{ASF_STREAM_TYPE} eq "Audio"',
+        Name => 'AudioChannels',
+        Format => 'int16u',
+    },
+    58 => [
+        {
+            Condition => '$self->{ASF_STREAM_TYPE} eq "Audio"',
+            Name => 'AudioSampleRate',
+            Format => 'int32u',
+        },
+        {
+            Condition => '$self->{ASF_STREAM_TYPE} =~ /^(Video|JFIF|Degradable JPEG)$/',
+            Name => 'ImageHeight',
+            Format => 'int32u',
+        },
+    ],
+);
+
+%Image::ExifTool::ASF::HeaderExtension = (
+    PROCESS_PROC => \&Image::ExifTool::ASF::ProcessASF,
+    '14E6A5CB-C672-4332-8399-A96952065B5A' => 'ExtendedStreamProps',
+    'A08649CF-4775-4670-8A16-6E35357566CD' => 'AdvancedMutualExcl',
+    'D1465A40-5A79-4338-B71B-E36B8FD6C249' => 'GroupMutualExclusion',
+    'D4FED15B-88D3-454F-81F0-ED5C45999E24' => 'StreamPrioritization',
+    'A69609E6-517B-11D2-B6AF-00C04FD908E9' => 'BandwidthSharing',
+    '7C4346A9-EFE0-4BFC-B229-393EDE415C85' => 'LanguageList',
+    'C5F8CBEA-5BAF-4877-8467-AA8C44FA4CCA' => {
+        Name => 'Metadata',
+        SubDirectory => { TagTable => 'Image::ExifTool::ASF::Metadata' },
+    },
+    '44231C94-9498-49D1-A141-1D134E457054' => {
+        Name => 'MetadataLibrary',
+        SubDirectory => { TagTable => 'Image::ExifTool::ASF::Metadata' },
+    },
+    'D6E229DF-35DA-11D1-9034-00A0C90349BE' => 'IndexParameters',
+    '6B203BAD-3F11-48E4-ACA8-D7613DE2CFA7' => 'TimecodeIndexParms',
+    '75B22630-668E-11CF-A6D9-00AA0062CE6C' => 'Compatibility',
+    '43058533-6981-49E6-9B74-AD12CB86D58C' => 'AdvancedContentEncryption',
+    'ABD3D211-A9BA-11cf-8EE6-00C00C205365' => 'Reserved1',
+);
+
+%Image::ExifTool::ASF::Metadata = (
+    PROCESS_PROC => \&Image::ExifTool::ASF::ProcessMetadata,
+);
+
+%Image::ExifTool::ASF::CodecList = (
+    PROCESS_PROC => \&ProcessCodecList,
+    VideoCodecName => {},
+    VideoCodecDescription => {},
+    AudioCodecName => {},
+    AudioCodecDescription => {},
+    OtherCodecName => {},
+    OtherCodecDescription => {},
+);
+
+#------------------------------------------------------------------------------
+# Generate GUID from 16 bytes of binary data
+# Inputs: 0) data
+# Returns: GUID
+sub GetGUID($)
+{
+    # must do some byte swapping
+    my $buff = unpack('H*',pack('NnnNN',unpack('VvvNN',$_[0])));
+    $buff =~ s/(.{8})(.{4})(.{4})(.{4})/$1-$2-$3-$4-/;
+    return uc($buff);
+}
+
+#------------------------------------------------------------------------------
+# Process ASF content description
+# Inputs: 0) ExifTool object reference, 1) dirInfo ref, 2) tag table reference
+# Returns: 1 on success
+sub ProcessContentDescription($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dirLen = $$dirInfo{DirLen};
+    return 0 if $dirLen < 10;
+    my @len = unpack('v5', $$dataPt);
+    my $pos = 10;
+    my $tag;
+    foreach $tag (0..4) {
+        my $len = shift @len;
+        next unless $len;
+        return 0 if $pos + $len > $dirLen;
+        my $val = $exifTool->Decode(substr($$dataPt,$pos,$len),'UCS2','II');
+        $exifTool->HandleTag($tagTablePtr, $tag, $val);
+        $pos += $len;
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Process ASF content branding
+# Inputs: 0) ExifTool object reference, 1) dirInfo ref, 2) tag table reference
+# Returns: 1 on success
+sub ProcessContentBranding($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dirLen = $$dirInfo{DirLen};
+    return 0 if $dirLen < 40;
+    # decode banner image type
+    $exifTool->HandleTag($tagTablePtr, 0, unpack('V', $$dataPt));
+    # decode banner image, banner URL and copyright URL
+    my $pos = 4;
+    my $tag;
+    foreach $tag (1..3) {
+        return 0 if $pos + 4 > $dirLen;
+        my $size = unpack("x${pos}V", $$dataPt);
+        $pos += 4;
+        next unless $size;
+        return 0 if $pos + $size > $dirLen;
+        my $val = substr($$dataPt, $pos, $size);
+        $exifTool->HandleTag($tagTablePtr, $tag, $val);
+        $pos += $size;
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Read ASF value
+# Inputs: 0) ExifTool object ref, 1) data reference, 2) value offset,
+#         3) format number, 4) size
+# Returns: converted value
+sub ReadASF($$$$$)
+{
+    my ($exifTool, $dataPt, $pos, $format, $size) = @_;
+    my @vals;
+    if ($format == 0) { # unicode string
+        $vals[0] = $exifTool->Decode(substr($$dataPt,$pos,$size),'UCS2','II');
+    } elsif ($format == 2) { # 4-byte boolean
+        @vals = ReadValue($dataPt, $pos, 'int32u', undef, $size);
+        foreach (@vals) {
+            $_ = $_ ? 'True' : 'False';
+        }
+    } elsif ($format == 3) { # int32u
+        @vals = ReadValue($dataPt, $pos, 'int32u', undef, $size);
+    } elsif ($format == 4) { # int64u
+        @vals = ReadValue($dataPt, $pos, 'int64u', undef, $size);
+    } elsif ($format == 5) { # int16u
+        @vals = ReadValue($dataPt, $pos, 'int16u', undef, $size);
+    } else { # any other format (including 1, byte array): return raw data
+        $vals[0] = substr($$dataPt,$pos,$size);
+    }
+    return join ' ', @vals;
+}
+
+#------------------------------------------------------------------------------
+# Process extended content description
+# Inputs: 0) ExifTool object reference, 1) dirInfo ref, 2) tag table reference
+# Returns: 1 on success
+sub ProcessExtendedContentDescription($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dirLen = $$dirInfo{DirLen};
+    return 0 if $dirLen < 2;
+    my $count = Get16u($dataPt, 0);
+    $exifTool->VerboseDir($dirInfo, $count);
+    my $pos = 2;
+    my $i;
+    for ($i=0; $i<$count; ++$i) {
+        return 0 if $pos + 6 > $dirLen;
+        my $nameLen = unpack("x${pos}v", $$dataPt);
+        $pos += 2;
+        return 0 if $pos + $nameLen + 4 > $dirLen;
+        my $tag = Image::ExifTool::Decode(undef,substr($$dataPt,$pos,$nameLen),'UCS2','II','Latin');
+        $tag =~ s/^WM\///; # remove leading "WM/"
+        $pos += $nameLen;
+        my ($dType, $dLen) = unpack("x${pos}v2", $$dataPt);
+        my $val = ReadASF($exifTool,$dataPt,$pos+4,$dType,$dLen);
+        $exifTool->HandleTag($tagTablePtr, $tag, $val,
+            DataPt => $dataPt,
+            Start  => $pos + 4,
+            Size   => $dLen,
+        );
+        $pos += 4 + $dLen;
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Process WM/Picture preview
+# Inputs: 0) ExifTool object reference, 1) dirInfo ref, 2) tag table reference
+# Returns: 1 on success
+sub ProcessPicture($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dirStart = $$dirInfo{DirStart};
+    my $dirLen = $$dirInfo{DirLen};
+    return 0 unless $dirLen > 9;
+    # extract picture type and length
+    my ($type, $picLen) = unpack("x${dirStart}CV", $$dataPt);
+    $exifTool->HandleTag($tagTablePtr, 0, $type);
+    # extract mime type and description strings (null-terminated unicode strings)
+    my $n = $dirLen - 5 - $picLen;
+    return 0 if $n & 0x01 or $n < 4;
+    my $str = substr($$dataPt, $dirStart+5, $n);
+    if ($str =~ /^((?:..)*?)\0\0((?:..)*?)\0\0/) {
+        my ($mime, $desc) = ($1, $2);
+        $exifTool->HandleTag($tagTablePtr, 1, $exifTool->Decode($mime,'UCS2','II'));
+        $exifTool->HandleTag($tagTablePtr, 2, $exifTool->Decode($desc,'UCS2','II')) if length $desc;
+    }
+    $exifTool->HandleTag($tagTablePtr, 3, substr($$dataPt, $dirStart+5+$n, $picLen));
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Process codec list
+# Inputs: 0) ExifTool object reference, 1) dirInfo ref, 2) tag table reference
+# Returns: 1 on success
+sub ProcessCodecList($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dirLen = $$dirInfo{DirLen};
+    return 0 if $dirLen < 20;
+    my $count = Get32u($dataPt, 16);
+    $exifTool->VerboseDir($dirInfo, $count);
+    my $pos = 20;
+    my $i;
+    my %codecType = ( 1 => 'Video', 2 => 'Audio' );
+    for ($i=0; $i<$count; ++$i) {
+        return 0 if $pos + 8 > $dirLen;
+        my $type = ($codecType{Get16u($dataPt, $pos)} || 'Other') . 'Codec';
+        # stupid Windows programmers: these lengths are in characters (others are in bytes)
+        my $nameLen = Get16u($dataPt, $pos + 2) * 2;
+        $pos += 4;
+        return 0 if $pos + $nameLen + 2 > $dirLen;
+        my $name = $exifTool->Decode(substr($$dataPt,$pos,$nameLen),'UCS2','II');
+        $exifTool->HandleTag($tagTablePtr, "${type}Name", $name);
+        my $descLen = Get16u($dataPt, $pos + $nameLen) * 2;
+        $pos += $nameLen + 2;
+        return 0 if $pos + $descLen + 2 > $dirLen;
+        my $desc = $exifTool->Decode(substr($$dataPt,$pos,$descLen),'UCS2','II');
+        $exifTool->HandleTag($tagTablePtr, "${type}Description", $desc);
+        my $infoLen = Get16u($dataPt, $pos + $descLen);
+        $pos += $descLen + 2 + $infoLen;
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Process ASF metadata library
+# Inputs: 0) ExifTool object reference, 1) dirInfo ref, 2) tag table reference
+# Returns: 1 on success
+sub ProcessMetadata($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dirLen = $$dirInfo{DirLen};
+    return 0 if $dirLen < 2;
+    my $count = Get16u($dataPt, 0);
+    $exifTool->VerboseDir($dirInfo, $count);
+    my $pos = 2;
+    my $i;
+    for ($i=0; $i<$count; ++$i) {
+        return 0 if $pos + 12 > $dirLen;
+        my ($index, $stream, $nameLen, $dType, $dLen) = unpack("x${pos}v4V", $$dataPt);
+        $pos += 12;
+        return 0 if $pos + $nameLen + $dLen > $dirLen;
+        my $tag = Image::ExifTool::Decode(undef,substr($$dataPt,$pos,$nameLen),'UCS2','II','Latin');
+        my $val = ReadASF($exifTool,$dataPt,$pos+$nameLen,$dType,$dLen);
+        $exifTool->HandleTag($tagTablePtr, $tag, $val,
+            DataPt => $dataPt,
+            Start  => $pos,
+            Size   => $dLen,
+        );
+        $pos += $nameLen + $dLen;
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Extract information from a ASF file
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference, 2) tag table ref
+# Returns: 1 on success, 0 if this wasn't a valid ASF file
+sub ProcessASF($$;$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $raf = $$dirInfo{RAF};
+    my $verbose = $exifTool->Options('Verbose');
+    my $rtnVal = 0;
+    my $pos = 0;
+    my ($buff, $err, @parentTable, @childEnd);
+
+    for (;;) {
+        last unless $raf->Read($buff, 24) == 24;
+        $pos += 24;
+        my $tag = GetGUID($buff);
+        unless ($tagTablePtr) {
+            # verify this is a valid ASF file
+            last unless $tag eq '75B22630-668E-11CF-A6D9-00AA0062CE6C';
+            my $fileType = $exifTool->{FILE_EXT};
+            $fileType = 'ASF' unless $fileType and $fileType =~ /^(ASF|WMV|WMA|DIVX)$/;
+            $exifTool->SetFileType($fileType);
+            SetByteOrder('II');
+            $tagTablePtr = GetTagTable('Image::ExifTool::ASF::Main');
+            $rtnVal = 1;
+        }
+        my $size = Image::ExifTool::Get64u(\$buff, 16) - 24;
+        if ($size < 0) {
+            $err = 'Invalid ASF object size';
+            last;
+        }
+        if ($size > 0x7fffffff) {
+            if ($size > 0x7fffffff * 4294967296) {
+                $err = 'Invalid ASF object size';
+            } elsif ($exifTool->Options('LargeFileSupport')) {
+                if ($raf->Seek($size, 1)) {
+                    $exifTool->VPrint(0, "  Skipped large ASF object ($size bytes)\n");
+                    $pos += $size;
+                    next;
+                }
+                $err = 'Error seeking past large ASF object';
+            } else {
+                $err = 'Large ASF objects not supported (LargeFileSupport not set)';
+            }
+            last;
+        }
+        # go back to parent tag table if done with previous children
+        if (@childEnd and $pos >= $childEnd[-1]) {
+            pop @childEnd;
+            $tagTablePtr = pop @parentTable;
+            $exifTool->{INDENT} = substr($exifTool->{INDENT},0,-2);
+        }
+        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        $verbose and $exifTool->VerboseInfo($tag, $tagInfo);
+        if ($tagInfo) {
+            my $subdir = $$tagInfo{SubDirectory};
+            if ($subdir) {
+                my $subTable = GetTagTable($$subdir{TagTable});
+                if ($$subTable{PROCESS_PROC} eq \&ProcessASF) {
+                    if (defined $$subdir{Size}) {
+                        my $s = $$subdir{Size};
+                        if ($verbose > 2) {
+                            $raf->Read($buff, $s) == $s or $err = 'Truncated file', last;
+                            $exifTool->VerboseDump(\$buff);
+                        } elsif (not $raf->Seek($s, 1)) {
+                            $err = 'Seek error';
+                            last;
+                        }
+                        # continue processing linearly using subTable
+                        push @parentTable, $tagTablePtr;
+                        push @childEnd, $pos + $size;
+                        $tagTablePtr = $subTable;
+                        $pos += $$subdir{Size};
+                        if ($verbose) {
+                            $exifTool->{INDENT} .= '| ';
+                            $exifTool->VerboseDir($$tagInfo{Name});
+                        }
+                        next;
+                    }
+                } elsif ($raf->Read($buff, $size) == $size) {
+                    my %subdirInfo = (
+                        DataPt => \$buff,
+                        DirStart => 0,
+                        DirLen => $size,
+                        DirName => $$tagInfo{Name},
+                    );
+                    $exifTool->VerboseDump(\$buff) if $verbose > 2;
+                    unless ($exifTool->ProcessDirectory(\%subdirInfo, $subTable)) {
+                        $exifTool->Warn("Error processing $$tagInfo{Name} directory");
+                    }
+                    $pos += $size;
+                    next;
+                } else {
+                    $err = 'Unexpected end of file';
+                    last;
+                }
+            }
+        }
+        if ($verbose > 2) {
+            $raf->Read($buff, $size) == $size or $err = 'Truncated file', last;
+            $exifTool->VerboseDump(\$buff);
+        } elsif (not $raf->Seek($size, 1)) { # skip the block
+            $err = 'Seek error';
+            last;
+        }
+        $pos += $size;
+    }
+    $err and $exifTool->Warn($err);
+    return $rtnVal;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::ASF - Read ASF/WMA/WMV meta information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains routines required by Image::ExifTool to extract
+information from Microsoft Advanced Systems Format (ASF) files, including
+Windows Media Audio (WMA) and Windows Media Video (WMV) files.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.microsoft.com/windows/windowsmedia/format/asfspec.aspx>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/ASF Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/BMP.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/BMP.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/BMP.pm	(revision 24799)
@@ -0,0 +1,179 @@
+#------------------------------------------------------------------------------
+# File:         BMP.pm
+#
+# Description:  Read BMP meta information
+#
+# Revisions:    07/16/2005 - P. Harvey Created
+#
+# References:   1) http://www.fortunecity.com/skyscraper/windows/364/bmpffrmt.html
+#               2) http://www.fourcc.org/rgb.php
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::BMP;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.07';
+
+# BMP chunks
+%Image::ExifTool::BMP::Main = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'File', 1 => 'File', 2 => 'Image' },
+    NOTES => q{
+        There really isn't much meta information in a BMP file as such, just a bit
+        of image related information.
+    },
+    # 0 => size of bitmap structure:
+    #        12  bytes => 'OS/2 V1',
+    #        40  bytes => 'Windows V3',
+    #        64  bytes => 'OS/2 V2',
+    #        68  bytes => some bitmap structure in AVI videos
+    #        108 bytes => 'Windows V4',
+    #        124 bytes => 'Windows V5',
+    4 => {
+        Name => 'ImageWidth',
+        Format => 'int32u',
+    },
+    8 => {
+        Name => 'ImageHeight',
+        Format => 'int32s', # (negative when stored in top-to-bottom order)
+        ValueConv => 'abs($val)',
+    },
+    12 => {
+        Name => 'Planes',
+        Format => 'int16u',
+    },
+    14 => {
+        Name => 'BitDepth',
+        Format => 'int16u',
+    },
+    16 => {
+        Name => 'Compression',
+        Format => 'int32u',
+        # (formatted as string[4] for some values in AVI images)
+        ValueConv => '$val > 256 ? unpack("A4",pack("V",$val)) : $val',
+        PrintConv => {
+            0 => 'None',
+            1 => '8-Bit RLE',
+            2 => '4-Bit RLE',
+            3 => 'Bitfields',
+            4 => 'JPEG', #2
+            5 => 'PNG', #2
+            # pass through ASCII video compression codec ID's
+            OTHER => sub {
+                my $val = shift;
+                # convert non-ascii characters
+                $val =~ s/([\0-\x1f\x7f-\xff])/sprintf('\\x%.2x',ord $1)/eg;
+                return $val;
+            },
+        },
+    },
+    20 => {
+        Name => 'ImageLength',
+        Format => 'int32u',
+    },
+    24 => {
+        Name => 'PixelsPerMeterX',
+        Format => 'int32u',
+    },
+    28 => {
+        Name => 'PixelsPerMeterY',
+        Format => 'int32u',
+    },
+    32 => {
+        Name => 'NumColors',
+        Format => 'int32u',
+        PrintConv => '$val ? $val : "Use BitDepth"',
+    },
+    36 => {
+        Name => 'NumImportantColors',
+        Format => 'int32u',
+        PrintConv => '$val ? $val : "All"',
+    },
+);
+
+# OS/2 12-byte bitmap header (ref http://www.fileformat.info/format/bmp/egff.htm)
+%Image::ExifTool::BMP::OS2 = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'File', 1 => 'File', 2 => 'Image' },
+    NOTES => 'Information extracted from OS/2-format BMP images.',
+    # 0 => size of bitmap structure (12)
+    4  => { Name => 'ImageWidth',  Format => 'int16u' },
+    6  => { Name => 'ImageHeight', Format => 'int16u' },
+    8  => { Name => 'Planes',      Format => 'int16u' },
+    10 => { Name => 'BitDepth',    Format => 'int16u' },
+);
+
+#------------------------------------------------------------------------------
+# Extract EXIF information from a BMP image
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 on success, 0 if this wasn't a valid BMP file
+sub ProcessBMP($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my ($buff, $tagTablePtr);
+
+    # verify this is a valid BMP file
+    return 0 unless $raf->Read($buff, 18) == 18;
+    return 0 unless $buff =~ /^BM/;
+    SetByteOrder('II');
+    my $len = Get32u(\$buff, 14);
+    return 0 unless $len == 12 or $len >= 40;
+    return 0 unless $raf->Seek(-4, 1) and $raf->Read($buff, $len) == $len;
+    $exifTool->SetFileType();   # set the FileType tag
+    my %dirInfo = (
+        DataPt => \$buff,
+        DirStart => 0,
+        DirLen => length($buff),
+    );
+    if ($len == 12) {   # old OS/2 format BMP
+        $tagTablePtr = GetTagTable('Image::ExifTool::BMP::OS2');
+    } else {
+        $tagTablePtr = GetTagTable('Image::ExifTool::BMP::Main');
+    }
+    $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::BMP - Read BMP meta information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to read BMP
+(Windows Bitmap) images.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.fortunecity.com/skyscraper/windows/364/bmpffrmt.html>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/BMP Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/BZZ.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/BZZ.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/BZZ.pm	(revision 24799)
@@ -0,0 +1,472 @@
+#------------------------------------------------------------------------------
+# File:         BZZ.pm
+#
+# Description:  Utility to decode BZZ compressed data
+#
+# Revisions:    09/22/2008 - P. Harvey Created
+#
+# References:   1) http://djvu.sourceforge.net/
+#               2) http://www.djvu.org/
+#
+# Notes:        This code based on ZPCodec and BSByteStream of DjVuLibre 3.5.21
+#               (see NOTES documentation below for license/copyright details)
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::BZZ;
+
+use strict;
+use integer;    # IMPORTANT!!  use integer arithmetic throughout
+require Exporter;
+use vars qw($VERSION @ISA @EXPORT_OK);
+
+$VERSION = '1.00';
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(Decode);
+
+# constants
+sub FREQMAX { 4 }
+sub CTXIDS  { 3 }
+sub MAXBLOCK { 4096 }
+
+# This table has been designed for the ZPCoder
+# by running the following command in file 'zptable.sn':
+# (fast-crude (steady-mat 0.0035  0.0002) 260)))
+my @default_ztable_p = (
+    0x8000, 0x8000, 0x8000, 0x6bbd, 0x6bbd, 0x5d45, 0x5d45, 0x51b9, 0x51b9, 0x4813,
+    0x4813, 0x3fd5, 0x3fd5, 0x38b1, 0x38b1, 0x3275, 0x3275, 0x2cfd, 0x2cfd, 0x2825,
+    0x2825, 0x23ab, 0x23ab, 0x1f87, 0x1f87, 0x1bbb, 0x1bbb, 0x1845, 0x1845, 0x1523,
+    0x1523, 0x1253, 0x1253, 0x0fcf, 0x0fcf, 0x0d95, 0x0d95, 0x0b9d, 0x0b9d, 0x09e3,
+    0x09e3, 0x0861, 0x0861, 0x0711, 0x0711, 0x05f1, 0x05f1, 0x04f9, 0x04f9, 0x0425,
+    0x0425, 0x0371, 0x0371, 0x02d9, 0x02d9, 0x0259, 0x0259, 0x01ed, 0x01ed, 0x0193,
+    0x0193, 0x0149, 0x0149, 0x010b, 0x010b, 0x00d5, 0x00d5, 0x00a5, 0x00a5, 0x007b,
+    0x007b, 0x0057, 0x0057, 0x003b, 0x003b, 0x0023, 0x0023, 0x0013, 0x0013, 0x0007,
+    0x0007, 0x0001, 0x0001, 0x5695, 0x24ee, 0x8000, 0x0d30, 0x481a, 0x0481, 0x3579,
+    0x017a, 0x24ef, 0x007b, 0x1978, 0x0028, 0x10ca, 0x000d, 0x0b5d, 0x0034, 0x078a,
+    0x00a0, 0x050f, 0x0117, 0x0358, 0x01ea, 0x0234, 0x0144, 0x0173, 0x0234, 0x00f5,
+    0x0353, 0x00a1, 0x05c5, 0x011a, 0x03cf, 0x01aa, 0x0285, 0x0286, 0x01ab, 0x03d3,
+    0x011a, 0x05c5, 0x00ba, 0x08ad, 0x007a, 0x0ccc, 0x01eb, 0x1302, 0x02e6, 0x1b81,
+    0x045e, 0x24ef, 0x0690, 0x2865, 0x09de, 0x3987, 0x0dc8, 0x2c99, 0x10ca, 0x3b5f,
+    0x0b5d, 0x5695, 0x078a, 0x8000, 0x050f, 0x24ee, 0x0358, 0x0d30, 0x0234, 0x0481,
+    0x0173, 0x017a, 0x00f5, 0x007b, 0x00a1, 0x0028, 0x011a, 0x000d, 0x01aa, 0x0034,
+    0x0286, 0x00a0, 0x03d3, 0x0117, 0x05c5, 0x01ea, 0x08ad, 0x0144, 0x0ccc, 0x0234,
+    0x1302, 0x0353, 0x1b81, 0x05c5, 0x24ef, 0x03cf, 0x2b74, 0x0285, 0x201d, 0x01ab,
+    0x1715, 0x011a, 0x0fb7, 0x00ba, 0x0a67, 0x01eb, 0x06e7, 0x02e6, 0x0496, 0x045e,
+    0x030d, 0x0690, 0x0206, 0x09de, 0x0155, 0x0dc8, 0x00e1, 0x2b74, 0x0094, 0x201d,
+    0x0188, 0x1715, 0x0252, 0x0fb7, 0x0383, 0x0a67, 0x0547, 0x06e7, 0x07e2, 0x0496,
+    0x0bc0, 0x030d, 0x1178, 0x0206, 0x19da, 0x0155, 0x24ef, 0x00e1, 0x320e, 0x0094,
+    0x432a, 0x0188, 0x447d, 0x0252, 0x5ece, 0x0383, 0x8000, 0x0547, 0x481a, 0x07e2,
+    0x3579, 0x0bc0, 0x24ef, 0x1178, 0x1978, 0x19da, 0x2865, 0x24ef, 0x3987, 0x320e,
+    0x2c99, 0x432a, 0x3b5f, 0x447d, 0x5695, 0x5ece, 0x8000, 0x8000, 0x5695, 0x481a,
+    0x481a, 0, 0, 0, 0, 0
+);
+my @default_ztable_m = (
+    0x0000, 0x0000, 0x0000, 0x10a5, 0x10a5, 0x1f28, 0x1f28, 0x2bd3, 0x2bd3, 0x36e3,
+    0x36e3, 0x408c, 0x408c, 0x48fd, 0x48fd, 0x505d, 0x505d, 0x56d0, 0x56d0, 0x5c71,
+    0x5c71, 0x615b, 0x615b, 0x65a5, 0x65a5, 0x6962, 0x6962, 0x6ca2, 0x6ca2, 0x6f74,
+    0x6f74, 0x71e6, 0x71e6, 0x7404, 0x7404, 0x75d6, 0x75d6, 0x7768, 0x7768, 0x78c2,
+    0x78c2, 0x79ea, 0x79ea, 0x7ae7, 0x7ae7, 0x7bbe, 0x7bbe, 0x7c75, 0x7c75, 0x7d0f,
+    0x7d0f, 0x7d91, 0x7d91, 0x7dfe, 0x7dfe, 0x7e5a, 0x7e5a, 0x7ea6, 0x7ea6, 0x7ee6,
+    0x7ee6, 0x7f1a, 0x7f1a, 0x7f45, 0x7f45, 0x7f6b, 0x7f6b, 0x7f8d, 0x7f8d, 0x7faa,
+    0x7faa, 0x7fc3, 0x7fc3, 0x7fd7, 0x7fd7, 0x7fe7, 0x7fe7, 0x7ff2, 0x7ff2, 0x7ffa,
+    0x7ffa, 0x7fff, 0x7fff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+);
+my @default_ztable_up = (
+     84,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,  16,  17,
+     18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,  32,  33,
+     34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,  48,  49,
+     50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,
+     66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,  81,
+     82,  81,  82,   9,  86,   5,  88,  89,  90,  91,  92,  93,  94,  95,  96,  97,
+     82,  99,  76, 101,  70, 103,  66, 105, 106, 107,  66, 109,  60, 111,  56,  69,
+    114,  65, 116,  61, 118,  57, 120,  53, 122,  49, 124,  43,  72,  39,  60,  33,
+     56,  29,  52,  23,  48,  23,  42, 137,  38,  21, 140,  15, 142,   9, 144, 141,
+    146, 147, 148, 149, 150, 151, 152, 153, 154, 155,  70, 157,  66,  81,  62,  75,
+     58,  69,  54,  65,  50, 167,  44,  65,  40,  59,  34,  55,  30, 175,  24, 177,
+    178, 179, 180, 181, 182, 183, 184,  69, 186,  59, 188,  55, 190,  51, 192,  47,
+    194,  41, 196,  37, 198, 199,  72, 201,  62, 203,  58, 205,  54, 207,  50, 209,
+     46, 211,  40, 213,  36, 215,  30, 217,  26, 219,  20,  71,  14,  61,  14,  57,
+      8,  53, 228,  49, 230,  45, 232,  39, 234,  35, 138,  29,  24,  25, 240,  19,
+     22,  13,  16,  13,  10,   7, 244, 249,  10,  89, 230, 0, 0, 0, 0, 0
+);
+my @default_ztable_dn = (
+    145,   4,   3,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,
+     14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,
+     30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,
+     46,  47,  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,
+     62,  63,  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,
+     78,  79,  80,  85, 226,   6, 176, 143, 138, 141, 112, 135, 104, 133, 100, 129,
+     98, 127,  72, 125, 102, 123,  60, 121, 110, 119, 108, 117,  54, 115,  48, 113,
+    134,  59, 132,  55, 130,  51, 128,  47, 126,  41,  62,  37,  66,  31,  54,  25,
+     50, 131,  46,  17,  40,  15, 136,   7,  32, 139, 172,   9, 170,  85, 168, 248,
+    166, 247, 164, 197, 162,  95, 160, 173, 158, 165, 156, 161,  60, 159,  56,  71,
+     52, 163,  48,  59,  42, 171,  38, 169,  32,  53,  26,  47, 174, 193,  18, 191,
+    222, 189, 218, 187, 216, 185, 214,  61, 212,  53, 210,  49, 208,  45, 206,  39,
+    204, 195, 202,  31, 200, 243,  64, 239,  56, 237,  52, 235,  48, 233,  44, 231,
+     38, 229,  34, 227,  28, 225,  22, 223,  16, 221, 220,  63,   8,  55, 224,  51,
+      2,  47,  87,  43, 246,  37, 244,  33, 238,  27, 236,  21,  16,  15,   8, 241,
+    242,   7,  10, 245,   2,   1,  83, 250,   2, 143, 246, 0, 0, 0, 0, 0
+);
+
+#------------------------------------------------------------------------------
+# New - create new BZZ object
+# Inputs: 0) reference to BZZ object or BZZ class name
+# Returns: blessed BZZ object ref
+sub new
+{
+    local $_;
+    my $that = shift;
+    my $class = ref($that) || $that || 'Image::ExifTool::BZZ';
+    return bless {}, $class;
+}
+
+#------------------------------------------------------------------------------
+# Initialize BZZ object
+# Inputs: 0) BZZ object ref, 1) data ref, 2) true for DjVu compatibility
+sub Init($$)
+{
+    my ($self, $dataPt, $djvucompat) = @_;
+    # Create machine independent ffz table
+    my $ffzt = $$self{ffzt} = [ ];
+    my ($i, $j);
+    for ($i=0; $i<256; $i++) {
+        $$ffzt[$i] = 0;
+        for ($j=$i; $j&0x80; $j<<=1) {
+            $$ffzt[$i] += 1;
+        }
+    }
+    # Initialize table
+    $$self{p} = [ @default_ztable_p ];
+    $$self{'m'} = [ @default_ztable_m ];
+    $$self{up} = [ @default_ztable_up ];
+    $$self{dn} = [ @default_ztable_dn ];
+    # Patch table (and lose DjVu compatibility)
+    unless ($djvucompat) {
+        my ($p, $m, $dn) = ($$self{p}, $$self{'m'}, $$self{dn});
+        for ($j=0; $j<256; $j++) {
+            my $a = (0x10000 - $$p[$j]) & 0xffff;
+            while ($a >= 0x8000) { $a = ($a<<1) & 0xffff }
+            if ($$m[$j]>0 && $a+$$p[$j]>=0x8000 && $a>=$$m[$j]) {
+                $$dn[$j] = $default_ztable_dn[$default_ztable_dn[$j]];
+            }
+        }
+    }
+    $$self{ctx} = [ (0) x 300 ];
+    $$self{DataPt} = $dataPt;
+    $$self{Pos} = 0;
+    $$self{DataLen} = length $$dataPt;
+    $$self{a} = 0;
+    $$self{buffer} = 0;
+    $$self{fence} = 0;
+    $$self{blocksize} = 0;
+    # Read first 16 bits of code
+    if (length($$dataPt) >= 2) {
+        $$self{code} = unpack('n', $$dataPt);
+        $$self{Pos} += 2;
+    } elsif (length($$dataPt) >= 1) {
+        $$self{code} = (unpack('C', $$dataPt) << 8) | 0xff;
+        $$self{Pos}++;
+    } else {
+        $$self{code} = 0xffff;
+    }
+    $$self{byte} = $$self{code} & 0xff;
+    # Preload buffer
+    $$self{delay} = 25;
+    $$self{scount} = 0;
+    # Compute initial fence
+    $$self{fence} = $$self{code} >= 0x8000 ? 0x7fff : $$self{code};
+}
+
+#------------------------------------------------------------------------------
+# Decode data block
+# Inputs: 0) optional BZZ object ref, 1) optional data ref
+# Returns: decoded data or undefined on error
+# Notes: If called without a data ref, an input BZZ object ref must be given and
+#        the BZZ object must have been initialized by a previous call to Init()
+sub Decode($;$)
+{
+    # Decode input stream
+    local $_;
+    my $self;
+    if (ref $_[0] and UNIVERSAL::isa($_[0],'Image::ExifTool::BZZ')) {
+        $self = shift;
+    } else {
+        $self = new Image::ExifTool::BZZ;
+    }
+    my $dataPt = shift;
+    if ($dataPt) {
+        $self->Init($dataPt, 1);
+    } else {
+        $dataPt = $$self{DataPt} or return undef;
+    }
+    # Decode block size
+    my $n = 1;
+    my $m = (1 << 24);
+    while ($n < $m) {
+        my $b = $self->decode_sub(0x8000 + ($$self{a}>>1));
+        $n = ($n<<1) | $b;
+    }
+    $$self{size} = $n - $m;
+
+    return '' unless $$self{size};
+    return undef if $$self{size} > MAXBLOCK()*1024;
+    # Allocate
+    if ($$self{blocksize} < $$self{size}) {
+        $$self{blocksize} = $$self{size};
+    }
+    # Decode Estimation Speed
+    my $fshift = 0;
+    if ($self->decode_sub(0x8000 + ($$self{a}>>1))) {
+        $fshift += 1;
+        $fshift += 1 if $self->decode_sub(0x8000 + ($$self{a}>>1));
+    }
+    # Prepare Quasi MTF
+    my @mtf = (0..255);
+    my @freq = (0) x FREQMAX();
+    my $fadd = 4;
+    # Decode
+    my $mtfno = 3;
+    my $markerpos = -1;
+    my $cx = $$self{ctx};
+    my ($i, @dat);
+byte: for ($i=0; $i<$$self{size}; $i++) {
+        # dummy loop avoids use of "goto" statement
+dummy:  for (;;) {
+            my $ctxid = CTXIDS() - 1;
+            $ctxid = $mtfno if $ctxid > $mtfno;
+            my $cp = 0;
+            my ($imtf, $bits);
+            for ($imtf=0; $imtf<2; ++$imtf) {
+                if ($self->decoder($$cx[$cp+$ctxid])) {
+                    $mtfno = $imtf;
+                    $dat[$i] = $mtf[$mtfno];
+                    # (a "goto" here could give a segfault due to a Perl bug)
+                    last dummy; # do rotation
+                }
+                $cp += CTXIDS();
+            }
+            for ($bits=1; $bits<8; ++$bits, $imtf<<=1) {
+                if ($self->decoder($$cx[$cp])) {
+                    my $n = 1;
+                    my $m = (1 << $bits);
+                    while ($n < $m) {
+                        my $b = $self->decoder($$cx[$cp+$n]);
+                        $n = ($n<<1) | $b;
+                    }
+                    $mtfno = $imtf + $n - $m;
+                    $dat[$i] = $mtf[$mtfno];
+                    last dummy; # do rotation
+                }
+                $cp += $imtf;
+            }
+            $mtfno=256;
+            $dat[$i] = 0;
+            $markerpos=$i;
+            next byte;  # no rotation necessary
+        }
+        # Rotate mtf according to empirical frequencies (new!)
+        # Adjust frequencies for overflow
+        $fadd = $fadd + ($fadd >> $fshift);
+        if ($fadd > 0x10000000)  {
+            $fadd >>= 24;
+            $_ >>= 24 foreach @freq;
+        }
+        # Relocate new char according to new freq
+        my $fc = $fadd;
+        $fc += $freq[$mtfno] if $mtfno < FREQMAX();
+        my $k;
+        for ($k=$mtfno; $k>=FREQMAX(); $k--) {
+            $mtf[$k] = $mtf[$k-1];
+        }
+        for (; $k>0 && $fc>=$freq[$k-1]; $k--) {
+            $mtf[$k] = $mtf[$k-1];
+            $freq[$k] = $freq[$k-1];
+        }
+        $mtf[$k] = $dat[$i];
+        $freq[$k] = $fc;
+        # when "goto" was used, Perl 5.8.6 could segfault here
+        # unless "next" was explicitly stated
+    }
+#
+# Reconstruct the string
+#
+    return undef if $markerpos<1 || $markerpos>=$$self{size};
+    # Allocate pointers
+    # Prepare count buffer
+    my @count = (0) x 256;
+    my @posn;
+    # Fill count buffer
+    no integer;
+    for ($i=0; $i<$markerpos; $i++) {
+        my $c = $dat[$i];
+        $posn[$i] = ($c<<24) | ($count[$c]++ & 0xffffff);
+    }
+    $posn[$i++] = 0; # (initialize marker entry just to be safe)
+    for ( ; $i<$$self{size}; $i++) {
+        my $c = $dat[$i];
+        $posn[$i] = ($c<<24) | ($count[$c]++ & 0xffffff);
+    }
+    use integer;
+    # Compute sorted char positions
+    my $last = 1;
+    for ($i=0; $i<256; $i++) {
+        my $tmp = $count[$i];
+        $count[$i] = $last;
+        $last += $tmp;
+    }
+    # Undo the sort transform
+    $i = 0;
+    $last = $$self{size}-1;
+    while ($last > 0) {
+        my $n = $posn[$i];
+        no integer;
+        my $c = $n >> 24;
+        use integer;
+        $dat[--$last] = $c;
+        $i = $count[$c] + ($n & 0xffffff);
+    }
+    # Final check and return decoded data
+    return undef if $i != $markerpos;
+    pop @dat;   # (last byte isn't real)
+    return pack 'C*', @dat;
+}
+
+#------------------------------------------------------------------------------
+# Inputs: 0) BZZ object ref, 1) ctx
+# Returns: decoded bit
+sub decoder($$)
+{
+    my ($self, $ctx) = @_;
+    my $z = $$self{a} + $self->{p}[$ctx];
+    if ($z <= $$self{fence}) {
+        $$self{a} = $z;
+        return ($ctx & 1);
+    }
+    # must pass $_[1] so subroutine can modify value (darned C++ pass-by-reference!)
+    return $self->decode_sub($z, $_[1]);
+}
+
+#------------------------------------------------------------------------------
+# Inputs: 0) BZZ object ref, 1) z, 2) ctx (or undef)
+# Returns: decoded bit
+sub decode_sub($$;$)
+{
+    my ($self, $z, $ctx) = @_;
+
+    # ensure that we have at least 16 bits of encoded data available
+    if ($$self{scount} < 16) {
+        # preload byte by byte until we have at least 24 bits
+        while ($$self{scount} <= 24) {
+            if ($$self{Pos} < $$self{DataLen}) {
+                $$self{byte} = ord(substr(${$$self{DataPt}}, $$self{Pos}, 1));
+                ++$$self{Pos};
+            } else {
+                $$self{byte} = 0xff;
+                if (--$$self{delay} < 1) {
+                    # setting size to zero forces error return from Decode()
+                    $$self{size} = 0;
+                    return 0;
+                }
+            }
+            $$self{buffer} = ($$self{buffer}<<8) | $$self{byte};
+            $$self{scount} += 8;
+        }
+    }
+    # Save bit
+    my $a = $$self{a};
+    my ($bit, $code);
+    if (defined $ctx) {
+        $bit = ($ctx & 1);
+        # Avoid interval reversion
+        my $d = 0x6000 + (($z+$a)>>2);
+        $z = $d if $z > $d;
+    } else {
+        $bit = 0;
+    }
+    # Test MPS/LPS
+    if ($z > ($code = $$self{code})) {
+        $bit ^= 1;
+        # LPS branch
+        $z = 0x10000 - $z;
+        $a += $z;
+        $code += $z;
+        # LPS adaptation
+        $_[2] = $self->{dn}[$ctx] if defined $ctx;
+        # LPS renormalization
+        my $sft = $a>=0xff00 ? $self->{ffzt}[$a&0xff] + 8 : $self->{ffzt}[($a>>8)&0xff];
+        $$self{scount} -= $sft;
+        $$self{a} = ($a<<$sft) & 0xffff;
+        $code = (($code<<$sft) & 0xffff) | (($$self{buffer}>>$$self{scount}) & ((1<<$sft)-1));
+    } else {
+        # MPS adaptation
+        $_[2] = $self->{up}[$ctx] if defined $ctx and $a >= $self->{'m'}[$ctx];
+        # MPS renormalization
+        $$self{scount} -= 1;
+        $$self{a} = ($z<<1) & 0xffff;
+        $code = (($code<<1) & 0xffff) | (($$self{buffer}>>$$self{scount}) & 1);
+    }
+    # Adjust fence and save new code
+    $$self{fence} = $code >= 0x8000 ? 0x7fff : $code;
+    $$self{code} = $code;
+    return $bit;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::BZZ - Utility to decode BZZ compressed data
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to decode BZZ
+compressed data in DjVu images.
+
+=head1 NOTES
+
+This code is based on ZPCodec and BSByteStream of DjVuLibre 3.5.21 (see
+additional copyrights and the first reference below), which are covered
+under the GNU GPL license.
+
+This is implemented as Image::ExifTool::BZZ instead of Compress::BZZ because
+I am hoping that someone else will write a proper Compress::BZZ module (with
+compression ability).
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+Copyright 2002, Leon Bottou and Yann Le Cun
+Copyright 2001, AT&T
+Copyright 1999-2001, LizardTech Inc.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://djvu.sourceforge.net/>
+
+=item L<http://www.djvu.org/>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::DjVu(3pm)|Image::ExifTool::DjVu>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/BigTIFF.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/BigTIFF.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/BigTIFF.pm	(revision 24799)
@@ -0,0 +1,286 @@
+#------------------------------------------------------------------------------
+# File:         BigTIFF.pm
+#
+# Description:  Read Big TIFF meta information
+#
+# Revisions:    07/03/2007 - P. Harvey Created
+#
+# References:   1) http://www.awaresystems.be/imaging/tiff/bigtiff.html
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::BigTIFF;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::Exif;
+
+$VERSION = '1.05';
+
+my $maxOffset = 0x7fffffff; # currently supported maximum data offset/size
+
+#------------------------------------------------------------------------------
+# Process Big IFD directory
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success, otherwise returns 0 and sets a Warning
+sub ProcessBigIFD($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $raf = $$dirInfo{RAF};
+    my $verbose = $exifTool->{OPTIONS}->{Verbose};
+    my $htmlDump = $exifTool->{HTML_DUMP};
+    my $dirName = $$dirInfo{DirName};
+    my $dirStart = $$dirInfo{DirStart};
+
+    $verbose = -1 if $htmlDump; # mix htmlDump into verbose so we can test for both at once
+
+    # loop through IFD chain
+    for (;;) {
+        if ($dirStart > $maxOffset and not $exifTool->Options('LargeFileSupport')) {
+            $exifTool->Warn('Huge offsets not supported (LargeFileSupport not set)');
+            last;
+        }
+        unless ($raf->Seek($dirStart, 0)) {
+            $exifTool->Warn("Bad $dirName offset");
+            return 0;
+        }
+        my ($dirBuff, $index);
+        unless ($raf->Read($dirBuff, 8) == 8) {
+            $exifTool->Warn("Truncated $dirName count");
+            return 0;
+        }
+        my $numEntries = Image::ExifTool::Get64u(\$dirBuff, 0);
+        $verbose > 0 and $exifTool->VerboseDir($dirName, $numEntries);
+        my $bsize = $numEntries * 20;
+        if ($bsize > $maxOffset) {
+            $exifTool->Warn('Huge directory counts not yet supported');
+            last;
+        }
+        my $bufPos = $raf->Tell();
+        unless ($raf->Read($dirBuff, $bsize) == $bsize) {
+            $exifTool->Warn("Truncated $dirName directory");
+            return 0;
+        }
+        my $nextIFD;
+        $raf->Read($nextIFD, 8) == 8 or undef $nextIFD; # try to read next IFD pointer
+        if ($htmlDump) {
+            $exifTool->HDump($bufPos-8, 8, "$dirName entries", "Entry count: $numEntries");
+            if (defined $nextIFD) {
+                my $tip = sprintf("Offset: 0x%.8x", Image::ExifTool::Get64u(\$nextIFD, 0));
+                $exifTool->HDump($bufPos + 20 * $numEntries, 8, "Next IFD", $tip, 0);
+            }
+        }
+        # loop through all entries in this BigTIFF IFD
+        for ($index=0; $index<$numEntries; ++$index) {
+            my $entry = 20 * $index;
+            my $tagID = Get16u(\$dirBuff, $entry);
+            my $format = Get16u(\$dirBuff, $entry+2);
+            my $count = Image::ExifTool::Get64u(\$dirBuff, $entry+4);
+            my $formatSize = $Image::ExifTool::Exif::formatSize[$format];
+            unless (defined $formatSize) {
+                $exifTool->HDump($bufPos+$entry,20,"[invalid IFD entry]",
+                         "Bad format value: $format", 1);
+                # warn unless the IFD was just padded with zeros
+                $exifTool->Warn(sprintf("Unknown format ($format) for $dirName tag 0x%x",$tagID));
+                return 0; # assume corrupted IFD
+            }
+            my $formatStr = $Image::ExifTool::Exif::formatName[$format];
+            my $size = $count * $formatSize;
+            my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tagID);
+            next unless defined $tagInfo or $verbose;
+            my $valuePtr = $entry + 12;
+            my ($valBuff, $valBase);
+            if ($size > 8) {
+                if ($size > $maxOffset) {
+                    $exifTool->Warn("Can't handle $dirName entry $index (huge size)");
+                    next;
+                }
+                $valuePtr = Image::ExifTool::Get64u(\$dirBuff, $valuePtr);
+                if ($valuePtr > $maxOffset and not $exifTool->Options('LargeFileSupport')) {
+                    $exifTool->Warn("Can't handle $dirName entry $index (LargeFileSupport not set)");
+                    next;
+                }
+                unless ($raf->Seek($valuePtr, 0) and $raf->Read($valBuff, $size) == $size) {
+                    $exifTool->Warn("Error reading $dirName entry $index");
+                    next;
+                }
+                $valBase = 0;
+            } else {
+                $valBuff = substr($dirBuff, $valuePtr, $size);
+                $valBase = $bufPos;
+            }
+            if (defined $tagInfo and not $tagInfo) {
+                # GetTagInfo() required the value for a Condition
+                $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tagID, \$valBuff);
+            }
+            my $val = ReadValue(\$valBuff, 0, $formatStr, $count, $size);
+            if ($htmlDump) {
+                my $tval = $val;
+                if ($formatStr =~ /^rational64([su])$/) {
+                    # show numerator/denominator separately
+                    my $f = ReadValue(\$valBuff, 0, "int32$1", $count*2, $size);
+                    $f =~ s/(-?\d+) (-?\d+)/$1\/$2/g;
+                    $tval .= " ($f)";
+                }
+                my ($tagName, $colName);
+                if ($tagID == 0x927c and $dirName eq 'ExifIFD') {
+                    $tagName = 'MakerNotes';
+                } elsif ($tagInfo) {
+                    $tagName = $$tagInfo{Name};
+                } else {
+                    $tagName = sprintf("Tag 0x%.4x",$tagID);
+                }
+                my $dname = sprintf("$dirName-%.2d", $index);
+                # build our tool tip
+                my $tip = sprintf("Tag ID: 0x%.4x\n", $tagID) .
+                          "Format: $formatStr\[$count]\nSize: $size bytes\n";
+                if ($size > 8) {
+                    $tip .= sprintf("Value offset: 0x%.8x\n", $valuePtr);
+                    $colName = "<span class=H>$tagName</span>";
+                } else {
+                    $colName = $tagName;
+                }
+                $tval = substr($tval,0,28) . '[...]' if length($tval) > 32;
+                if ($formatStr =~ /^(string|undef|binary)/) {
+                    # translate non-printable characters
+                    $tval =~ tr/\x00-\x1f\x7f-\xff/./;
+                } elsif ($tagInfo and Image::ExifTool::IsInt($tval)) {
+                    if ($$tagInfo{IsOffset}) {
+                        $tval = sprintf('0x%.4x', $tval);
+                    } elsif ($$tagInfo{PrintHex}) {
+                        $tval = sprintf('0x%x', $tval);
+                    }
+                }
+                $tip .= "Value: $tval";
+                $exifTool->HDump($entry+$bufPos, 20, "$dname $colName", $tip, 1);
+                if ($size > 8) {
+                    # add value data block
+                    my $flg = ($tagInfo and $$tagInfo{SubDirectory} and $$tagInfo{MakerNotes}) ? 4 : 0;
+                    $exifTool->HDump($valuePtr,$size,"$tagName value",'SAME', $flg);
+                }
+            }
+            if ($tagInfo and $$tagInfo{SubIFD}) {
+                # process all SubIFD's as BigTIFF
+                $verbose > 0 and $exifTool->VerboseInfo($tagID, $tagInfo,
+                    Table   => $tagTablePtr,
+                    Index   => $index,
+                    Value   => $val,
+                    DataPt  => \$valBuff,
+                    DataPos => $valBase + $valuePtr,
+                    Start   => 0,
+                    Size    => $size,
+                    Format  => $formatStr,
+                    Count   => $count,
+                );
+                my @offsets = split ' ', $val;
+                my $i;
+                for ($i=0; $i<scalar(@offsets); ++$i) {
+                    my $subdirName = $$tagInfo{Name};
+                    $subdirName .= $i if $i;
+                    my %subdirInfo = (
+                        RAF      => $raf,
+                        DataPos  => 0,
+                        DirStart => $offsets[$i],
+                        DirName  => $subdirName,
+                        Parent   => $dirInfo,
+                    );
+                    $exifTool->ProcessDirectory(\%subdirInfo, $tagTablePtr, \&ProcessBigIFD);
+                }
+            } else {
+                my $tagKey = $exifTool->HandleTag($tagTablePtr, $tagID, $val,
+                    Index   => $index,
+                    DataPt  => \$valBuff,
+                    DataPos => $valBase + $valuePtr,
+                    Start   => 0,
+                    Size    => $size,
+                    Format  => $formatStr,
+                    TagInfo => $tagInfo,
+                    RAF     => $raf,
+                );
+                $tagKey and $exifTool->SetGroup($tagKey, $dirName);
+            }
+        }
+        last unless $dirName =~ /^(IFD|SubIFD)(\d*)$/;
+        $dirName = $1 . (($2 || 0) + 1);
+        defined $nextIFD or $exifTool->Warn("Bad $dirName pointer"), return 0;
+        $dirStart = Image::ExifTool::Get64u(\$nextIFD, 0);
+        $dirStart or last;
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Extract meta information from a BigTIFF image
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 on success, 0 if this wasn't a valid BigTIFF image
+sub ProcessBTF($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my $buff;
+
+    return 0 unless $raf->Read($buff, 16) == 16;
+    return 0 unless $buff =~ /^(MM\0\x2b\0\x08\0\0|II\x2b\0\x08\0\0\0)/;
+    if ($$dirInfo{OutFile}) {
+        $exifTool->Error('ExifTool does not support writing of BigTIFF images');
+        return 1;
+    }
+    $exifTool->SetFileType('BTF'); # set the FileType tag
+    SetByteOrder(substr($buff, 0, 2));
+    my $offset = Image::ExifTool::Get64u(\$buff, 8);
+    if ($exifTool->{HTML_DUMP}) {
+        my $o = (GetByteOrder() eq 'II') ? 'Little' : 'Big';
+        $exifTool->HDump(0, 8, "BigTIFF header", "Byte order: $o endian", 0);
+        $exifTool->HDump(8, 8, "IFD0 pointer", sprintf("Offset: 0x%.8x",$offset), 0);
+    }
+    my %dirInfo = (
+        RAF      => $raf,
+        DataPos  => 0,
+        DirStart => $offset,
+        DirName  => 'IFD0',
+        Parent   => 'BigTIFF',
+    );
+    my $tagTablePtr = GetTagTable('Image::ExifTool::Exif::Main');
+    $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr, \&ProcessBigIFD);
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::BigTIFF - Read Big TIFF meta information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains routines required by Image::ExifTool to read meta
+information in BigTIFF images.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.awaresystems.be/imaging/tiff/bigtiff.html>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/EXIF Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/BuildTagLookup.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/BuildTagLookup.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/BuildTagLookup.pm	(revision 24799)
@@ -0,0 +1,2227 @@
+#------------------------------------------------------------------------------
+# File:         BuildTagLookup.pm
+#
+# Description:  Utility to build tag lookup tables in Image::ExifTool::TagLookup.pm
+#
+# Revisions:    12/31/2004 - P. Harvey Created
+#               02/15/2005 - PH Added ability to generate TagNames documentation
+#
+# Notes:        Documentation for the tag tables may either be placed in the
+#               %docs hash below or in a NOTES entry in the table itself, and
+#               individual tags may have their own Notes entry.
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::BuildTagLookup;
+
+use strict;
+require Exporter;
+
+BEGIN {
+    # prevent ExifTool from loading the user config file
+    $Image::ExifTool::configFile = '';
+    $Image::ExifTool::debug = 1; # enabled debug messages
+}
+
+use vars qw($VERSION @ISA);
+use Image::ExifTool qw(:Utils :Vars);
+use Image::ExifTool::Exif;
+use Image::ExifTool::Shortcuts;
+use Image::ExifTool::HTML qw(EscapeHTML);
+use Image::ExifTool::IPTC;
+use Image::ExifTool::XMP;
+use Image::ExifTool::Canon;
+use Image::ExifTool::Nikon;
+
+$VERSION = '2.28';
+@ISA = qw(Exporter);
+
+sub NumbersFirst;
+
+my $numbersFirst = 1;   # set to -1 to sort numbers last
+
+# list of all tables in plug-in modules
+my @pluginTables = ('Image::ExifTool::MWG::Composite');
+
+# colors for html pages
+my $noteFont = "<span class=n>";
+my $noteFontSmall = "<span class='n s'>";
+
+my $docType = q{<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+};
+
+my $homePage = 'http://owl.phy.queensu.ca/~phil/exiftool';
+
+# list of all recognized Format strings
+# (not a complete list, but this is all we use so far)
+# (also, formats like "var_X[Y]" are allowed for any valid X)
+my %formatOK = (
+    %Image::ExifTool::Exif::formatNumber,
+    0 => 1,
+    1 => 1,
+    real    => 1,
+    integer => 1,
+    date    => 1,
+    boolean => 1,
+    rational  => 1,
+   'lang-alt' => 1,
+    fixed16u => 1,
+    fixed16s => 1,
+    fixed32u => 1,
+    fixed32s => 1,
+    extended => 1,
+    resize   => 1,
+    digits   => 1,
+    int16uRev => 1,
+    rational32u => 1,
+    rational32s => 1,
+    var_string  => 1,
+    var_int16u  => 1,
+    var_pstr32  => 1,
+    # Matroska
+    signed      => 1,
+    unsigned    => 1,
+    utf8        => 1,
+);
+
+my $caseInsensitive;    # flag to ignore case when sorting tag names
+
+# Descriptions for the TagNames documentation
+# (descriptions may also be defined in tag table NOTES)
+# Note: POD headers in these descriptions start with '~' instead of '=' to keep
+# from confusing POD parsers which apparently parse inside quoted strings.
+my %docs = (
+    PodHeader => q{
+~head1 NAME
+
+Image::ExifTool::TagNames - ExifTool tag name documentation
+
+~head1 DESCRIPTION
+
+This document contains a complete list of ExifTool tag names, organized into
+tables based on information type.  Tag names are used to reference specific
+meta information extracted from or written to a file.
+
+~head1 TAG TABLES
+},
+    ExifTool => q{
+The tables listed below give the names of all tags recognized by ExifTool.
+},
+    ExifTool2 => q{
+B<Tag ID>, B<Index> or B<Sequence> is given in the first column of each
+table.  A B<Tag ID> is the computer-readable equivalent of a tag name, and
+is the identifier that is actually stored in the file.  An B<Index> refers
+to the location of a value when found at a fixed position within a data
+block, and B<Sequence> gives the order of values for a serial data stream.
+
+A B<Tag Name> is the handle by which the information is accessed in
+ExifTool.  In some instances, more than one name may correspond to a single
+tag ID.  In these cases, the actual name used depends on the context in
+which the information is found.  Case is not significant for tag names.  A
+question mark (C<?>) after a tag name indicates that the information is
+either not understood, not verified, or not very useful -- these tags are
+not extracted by ExifTool unless the Unknown (-u) option is enabled.  Be
+aware that some tag names are different than the descriptions printed out by
+default when extracting information with exiftool.  To see the tag names
+instead of the descriptions, use C<exiftool -s>.
+
+The B<Writable> column indicates whether the tag is writable by ExifTool.
+Anything but an C<N> in this column means the tag is writable.  A C<Y>
+indicates writable information that is either unformatted or written using
+the existing format.  Other expressions give details about the information
+format, and vary depending on the general type of information.  The format
+name may be followed by a number in square brackets to indicate the number
+of values written, or the number of characters in a fixed-length string
+(including a null terminator which is added if required).
+
+A plus sign (C<+>) after an entry in the B<Writable> column indicates a
+"list" tag which supports multiple values and allows individual values to be
+added and deleted.  A slash (C</>) indicates an "avoided" tag that is not
+created when writing if another same-named tag may be created instead.  To
+write these tags, the group should be specified.  A tilde (C<~>) indicates a
+tag this is writable only when the print conversion is disabled (by setting
+PrintConv to 0, using the -n option, or suffixing the tag name with a C<#>
+character).  An exclamation point (C<!>) indicates a tag that is considered
+unsafe to write under normal circumstances.  These "unsafe" tags are not set
+when calling SetNewValuesFromFile() or copied with the exiftool
+-tagsFromFile option unless specified explicitly, and care should be taken
+when editing them manually since they may affect the way an image is
+rendered.  An asterisk (C<*>) indicates a "protected" tag which is not
+writable directly, but is written automatically by ExifTool (often when a
+corresponding Composite or Extra tag is written).  A colon (C<:>) indicates
+a mandatory tag which may be added automatically when writing.
+
+The HTML version of these tables also lists possible B<Values> for
+discrete-valued tags, as well as B<Notes> for some tags.  The B<Values> are
+listed as the computer-readable and human-readable values on the left and
+right hand side of an equals sign (C<=>) respectively.  The human-readable
+values are used by default when reading and writing, but the
+computer-readable values may be accessed by disabling the value conversion
+with the -n option on the command line, by setting the ValueConv option to 0
+in the API, or or on a per-tag basis by appending a number symbol (C<#>) to
+the tag name.
+
+B<Note>: If you are familiar with common meta-information tag names, you may
+find that some ExifTool tag names are different than expected.  The usual
+reason for this is to make the tag names more consistent across different
+types of meta information.  To determine a tag name, either consult this
+documentation or run C<exiftool -s> on a file containing the information in
+question.
+},
+    EXIF => q{
+EXIF stands for "Exchangeable Image File Format".  This type of information
+is formatted according to the TIFF specification, and may be found in JPG,
+TIFF, PNG, PGF, MIFF, HDP, PSP and XCF images, as well as many TIFF-based
+RAW images, and even some AVI and MOV videos.
+
+The EXIF meta information is organized into different Image File Directories
+(IFD's) within an image.  The names of these IFD's correspond to the
+ExifTool family 1 group names.  When writing EXIF information, the default
+B<Group> listed below is used unless another group is specified.
+
+The table below lists all EXIF tags.  Also listed are TIFF, DNG, HDP and
+other tags which are not part of the EXIF specification, but may co-exist
+with EXIF tags in some images.  Tags which are part of the EXIF 2.3
+specification have an underlined B<Tag Name> in the HTML version of this
+documentation.  See
+L<http://www.cipa.jp/english/hyoujunka/kikaku/pdf/DC-008-2010_E.pdf> for the
+official EXIF 2.3 specification.
+},
+    GPS => q{
+These GPS tags are part of the EXIF standard, and are stored in a separate
+IFD within the EXIF information.
+
+ExifTool is very flexible about the input format when writing lat/long
+coordinates, and will accept from 1 to 3 floating point numbers (for decimal
+degrees, degrees and minutes, or degrees, minutes and seconds) separated by
+just about anything, and will format them properly according to the EXIF
+specification.
+
+Some GPS tags have values which are fixed-length strings. For these, the
+indicated string lengths include a null terminator which is added
+automatically by ExifTool.  Remember that the descriptive values are used
+when writing (ie. 'Above Sea Level', not '0') unless the print conversion is
+disabled (with '-n' on the command line or the PrintConv option in the API,
+or by suffixing the tag name with a C<#> character).
+
+When adding GPS information to an image, it is important to set all of the
+following tags: GPSLatitude, GPSLatitudeRef, GPSLongitude, GPSLongitudeRef,
+GPSAltitude and GPSAltitudeRef.  ExifTool will write the required
+GPSVersionID tag automatically if new a GPS IFD is added to an image.
+},
+    XMP => q{
+XMP stands for "Extensible Metadata Platform", an XML/RDF-based metadata
+format which is being pushed by Adobe.  Information in this format can be
+embedded in many different image file types including JPG, JP2, TIFF, GIF,
+EPS, PDF, PSD, IND, PNG, DJVU, SVG, PGF, MIFF, XCF, CRW, DNG and a variety
+of proprietary TIFF-based RAW images, as well as MOV, AVI, ASF, WMV, FLV,
+SWF and MP4 videos, and WMA and audio formats supporting ID3v2 information.
+
+The XMP B<Tag ID>'s aren't listed because in most cases they are identical
+to the B<Tag Name> (aside from differences in case).  Tags with different
+ID's are mentioned in the B<Notes> column of the HTML version of this
+document.
+
+All XMP information is stored as character strings.  The B<Writable> column
+specifies the information format:  C<string> is an unformatted string,
+C<integer> is a string of digits (possibly beginning with a '+' or '-'),
+C<real> is a floating point number, C<rational> is entered as a floating
+point number but stored as two C<integer> strings separated by a '/'
+character, C<date> is a date/time string entered in the format "YYYY:mm:dd
+HH:MM:SS[.ss][+/-HH:MM]", C<boolean> is either "True" or "False",
+C<lang-alt> indicates that the tag supports alternate languages (see below),
+and C<struct> is an XMP structure.  When reading, structures are extracted
+only if the Struct (-struct) option is used.  Otherwise the corresponding
+"flattened" tags, indicated by an underline (C<_>) after the B<Writable>
+type, are extracted.  When copying information, the Struct option is in
+effect by default.  When writing, the Struct option has no effect, and both
+structured and flattened tags may be written.  See
+L<http://owl.phy.queensu.ca/~phil/exiftool/struct.html> for more details.
+
+Individual languages for C<lang-alt> tags are accessed by suffixing the tag
+name with a '-', followed by an RFC 3066 language code (ie. "XMP:Title-fr",
+or "Rights-en-US").  (See L<http://www.ietf.org/rfc/rfc3066.txt> for the RFC
+3066 specification.)  A C<lang-alt> tag with no language code accesses the
+"x-default" language, but causes other languages for this tag to be deleted
+when writing.  The "x-default" language code may be specified when writing
+to preserve other existing languages (ie. "XMP-dc:Description-x-default"). 
+When reading, "x-default" is not specified.
+
+The XMP tags are organized according to schema B<Namespace> in the following
+tables.  Note that a few of the longer namespace prefixes given below have
+been shortened for convenience (since the family 1 group names are derived
+from these by adding a leading "XMP-").  In cases where a tag name exists in
+more than one namespace, less common namespaces are avoided when writing.
+However, any namespace may be written by specifying a family 1 group name
+for the tag, ie) XMP-exif:Contrast or XMP-crs:Contrast.  When deciding on
+which tags to add to an image, using standard schemas such as
+L<dc|/XMP dc Tags>, L<xmp|/XMP xmp Tags> or L<iptc|/XMP iptcCore Tags> is
+recommended if possible.
+
+For structures, the heading of the first column is B<Field Name>.  Field
+names are very similar to tag names, except they are used to identify fields
+inside structures instead of stand-alone tags.  See
+L<the Field Name section of the Structured Information documentation|http://owl.phy.queensu.ca/~phil/exiftool/struct.html#Fields> for more
+details.
+
+ExifTool will extract XMP information even if it is not listed in these
+tables.  For example, the C<pdfx> namespace doesn't have a predefined set of
+tag names because it is used to store application-defined PDF information,
+but this information is extracted by ExifTool.
+
+See L<http://www.adobe.com/devnet/xmp/> for the official XMP specification.
+},
+    IPTC => q{
+The tags listed below are part of the International Press Telecommunications
+Council (IPTC) and the Newspaper Association of America (NAA) Information
+Interchange Model (IIM).  This is an older meta information format, slowly
+being phased out in favor of XMP.  (In fact, the newer IPTCCore
+specification actually uses XMP format!)  IPTC information may be embedded
+in JPG, TIFF, PNG, MIFF, PS, PDF, PSD, XCF and DNG images.
+
+IPTC information is separated into different records, each of which has its
+own set of tags.  See
+L<http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf> for the
+official specification.
+
+This specification dictates a length for ASCII (C<string> or C<digits>) and
+binary (C<undef>) values.  These lengths are given in square brackets after
+the B<Writable> format name.  For tags where a range of lengths is allowed,
+the minimum and maximum lengths are separated by a comma within the
+brackets.  IPTC strings are not null terminated.  When writing, ExifTool
+issues a minor warning and truncates the value if it is longer than allowed
+by the IPTC specification. Minor errors may be ignored with the
+IgnoreMinorErrors (-m) option, allowing longer values to be written, but
+beware that values like this may cause problems for some other IPTC readers.
+
+Separate IPTC date and time tags may be written with a combined date/time
+value and ExifTool automagically takes the appropriate part of the date/time
+string depending on whether a date or time tag is being written.  This is
+very useful when copying date/time values to IPTC from other metadata
+formats.
+
+IPTC time values include a timezone offset.  If written with a value which
+doesn't include a timezone then the current local timezone offset is used
+(unless written with a combined date/time, in which case the local timezone
+offset at the specified date/time is used, which may be different due to
+changes in daylight savings time).
+},
+    Photoshop => q{
+Photoshop tags are found in PSD and PSB files, as well as inside embedded
+Photoshop information in many other file types (JPEG, TIFF, PDF, PNG to name
+a few).
+
+Many Photoshop tags are marked as Unknown (indicated by a question mark
+after the tag name) because the information they provide is not very useful
+under normal circumstances I<[and because Adobe denied my application for
+their file format documentation -- apparently open source software is too
+big a concept for them]>.  These unknown tags are not extracted unless the
+Unknown (-u) option is used.
+},
+    PrintIM => q{
+The format of the PrintIM information is known, however no PrintIM tags have
+been decoded.  Use the Unknown (-u) option to extract PrintIM information.
+},
+    GeoTiff => q{
+ExifTool extracts the following tags from GeoTIFF images.  See
+L<http://www.remotesensing.org/geotiff/spec/geotiffhome.html> for the
+complete GeoTIFF specification.
+},
+    JFIF => q{
+The following information is extracted from the JPEG JFIF header.  See
+L<http://www.jpeg.org/public/jfif.pdf> for the JFIF 1.02 specification.
+},
+    Kodak => q{
+Many Kodak models don't store the maker notes in standard IFD format, and
+these formats vary with different models.  Some information has been
+decoded, but much of the Kodak information remains unknown.
+},
+    'Kodak SpecialEffects' => q{
+The Kodak SpecialEffects and Borders tags are found in sub-IFD's within the
+Kodak JPEG APP3 "Meta" segment.
+},
+    Minolta => q{
+These tags are used by Minolta, Konica/Minolta as well as some Sony cameras.
+Minolta doesn't make things easy for decoders because the meaning of some
+tags and the location where some information is stored is different for
+different camera models.  (Take MinoltaQuality for example, which may be
+located in 5 different places.)
+},
+    Olympus => q{
+Tags 0x0000 through 0x0103 are used by some older Olympus cameras, and are
+the same as Konica/Minolta tags.  The Olympus tags are also used for Epson
+and Agfa cameras.
+},
+    Panasonic => q{
+These tags are used in Panasonic/Leica cameras.
+},
+    Pentax => q{
+These tags are used in Pentax/Asahi cameras.
+},
+    Sigma => q{
+These tags are used in Sigma/Foveon cameras.
+},
+    Sony => q{
+The maker notes in images from most recent Sony camera models contain a
+wealth of information, but for some models very little has been decoded. 
+Use the ExifTool Unknown (-u) or Verbose (-v) options to see information
+about the unknown tags.  Also see the Minolta tags which are used by some
+Sony models.
+},
+    CanonRaw => q{
+These tags apply to CRW-format Canon RAW files and information in the APP0
+"CIFF" segment of JPEG images.  When writing CanonRaw/CIFF information, the
+length of the information is preserved (and the new information is truncated
+or padded as required) unless B<Writable> is C<resize>. Currently, only
+JpgFromRaw and ThumbnailImage are allowed to change size.
+
+CRW images also support the addition of a CanonVRD trailer, which in turn
+supports XMP.  This trailer is created automatically if necessary when
+ExifTool is used to write XMP to a CRW image.
+},
+    Unknown => q{
+The following tags are decoded in unsupported maker notes.  Use the Unknown
+(-u) option to display other unknown tags.
+},
+    PDF => q{
+The tags listed in the PDF tables below are those which are used by ExifTool
+to extract meta information, but they are only a small fraction of the total
+number of available PDF tags.  See
+L<http://www.adobe.com/devnet/pdf/pdf_reference.html> for the official PDF
+specification.
+
+ExifTool supports reading and writing PDF documents up to version 1.7
+extension level 3, including support for RC4, AES-128 and AES-256
+encryption.  A Password option is provided to allow processing of
+password-protected PDF files.
+
+When writing PDF files, ExifTool uses an incremental update.  This has the
+advantages of being fast and reversible.  The original PDF can be easily
+recovered by deleting the C<PDF-update> pseudo-group (with
+C<-PDF-update:all=> on the command line).  But there are two main
+disadvantages to this technique:
+
+1) A linearized PDF file is no longer linearized after the update, so it
+must be subsequently re-linearized if this is required.
+
+2) All metadata edits are reversible.  While this would normally be
+considered an advantage, it is a potential security problem because old
+information is never actually deleted from the file.
+},
+    DNG => q{
+The main DNG tags are found in the EXIF table.  The tables below define only
+information found within structures of these main DNG tag values.  See
+L<http://www.adobe.com/products/dng/> for the official DNG specification.
+},
+    MPEG => q{
+The MPEG format doesn't specify any file-level meta information.  In lieu of
+this, information is extracted from the first audio and video frame headers
+in the file.
+},
+    Real => q{
+ExifTool recognizes three basic types of Real audio/video files: 1)
+RealMedia (RM, RV and RMVB), 2) RealAudio (RA), and 3) Real Metafile (RAM
+and RPM).
+},
+    Extra => q{
+The extra tags represent extra information extracted or generated by
+ExifTool that is not directly associated with another tag group.  The three
+writable "pseudo" tags (FileName, Directory and FileModifyDate) may be
+written without the need to rewrite the file since their values are not
+contained within the file data.  These "pseudo" tags belong to the family 1
+"System" group.
+},
+    Composite => q{
+The values of the composite tags are B<Derived From> the values of other
+tags.  These are convenience tags which are calculated after all other
+information is extracted.
+},
+    Shortcuts => q{
+Shortcut tags are convenience tags that represent one or more other tag
+names.  They are used like regular tags to read and write the information
+for a specified set of tags.
+
+The shortcut tags below have been pre-defined, but user-defined shortcuts
+may be added via the %Image::ExifTool::UserDefined::Shortcuts lookup in the
+~/.ExifTool_config file.  See the Image::ExifTool::Shortcuts documentation
+for more details.
+},
+    PodTrailer => q{
+~head1 NOTES
+
+This document generated automatically by
+L<Image::ExifTool::BuildTagLookup|Image::ExifTool::BuildTagLookup>.
+
+~head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+~head1 SEE ALSO
+
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+~cut
+},
+);
+
+# notes for Shortcuts tags
+my %shortcutNotes = (
+    MakerNotes => q{
+        useful when copying tags between files to either copy the maker notes as a
+        block or prevent it from being copied
+    },
+    CommonIFD0 => q{
+        common metadata tags found in IFD0 of TIFF-format images.  Used to simpify
+        deletion of all metadata from these images.  See FAQ number 7 for details
+    },
+    Unsafe => q{
+        "unsafe" tags in JPEG images which are normally not copied.  Defined here
+        as a shortcut to use when rebuilding JPEG EXIF from scratch
+    },
+);
+
+
+
+# EXIF table tag ID's which are part of the EXIF 2.3 specification
+# (used only to add underlines in HTML version of EXIF Tag Table)
+my %exifSpec = (
+    0x100 => 1,  0x212 => 1,   0x9204 => 1,  0xa217 => 1,
+    0x101 => 1,  0x213 => 1,   0x9205 => 1,  0xa300 => 1,
+    0x102 => 1,  0x214 => 1,   0x9206 => 1,  0xa301 => 1,
+    0x103 => 1,  0x8298 => 1,  0x9207 => 1,  0xa302 => 1,
+    0x106 => 1,  0x829a => 1,  0x9208 => 1,  0xa401 => 1,
+    0x10e => 1,  0x829d => 1,  0x9209 => 1,  0xa402 => 1,
+    0x10f => 1,  0x8769 => 1,  0x920a => 1,  0xa403 => 1,
+    0x110 => 1,  0x8822 => 1,  0x9214 => 1,  0xa404 => 1,
+    0x111 => 1,  0x8824 => 1,  0x927c => 1,  0xa405 => 1,
+    0x112 => 1,  0x8825 => 1,  0x9286 => 1,  0xa406 => 1,
+    0x115 => 1,  0x8827 => 1,  0x9290 => 1,  0xa407 => 1,
+    0x116 => 1,  0x8828 => 1,  0x9291 => 1,  0xa408 => 1,
+    0x117 => 1,  0x8830 => 1,  0x9292 => 1,  0xa409 => 1,
+    0x11a => 1,  0x8831 => 1,  0xa000 => 1,  0xa40a => 1,
+    0x11b => 1,  0x8832 => 1,  0xa001 => 1,  0xa40b => 1,
+    0x11c => 1,  0x8833 => 1,  0xa002 => 1,  0xa40c => 1,
+    0x128 => 1,  0x8834 => 1,  0xa003 => 1,  0xa420 => 1,
+    0x12d => 1,  0x8835 => 1,  0xa004 => 1,  0xa430 => 1,
+    0x131 => 1,  0x9000 => 1,  0xa005 => 1,  0xa431 => 1,
+    0x132 => 1,  0x9003 => 1,  0xa20b => 1,  0xa432 => 1,
+    0x13b => 1,  0x9004 => 1,  0xa20c => 1,  0xa433 => 1,
+    0x13e => 1,  0x9101 => 1,  0xa20e => 1,  0xa434 => 1,
+    0x13f => 1,  0x9102 => 1,  0xa20f => 1,  0xa435 => 1,
+    0x201 => 1,  0x9201 => 1,  0xa210 => 1,
+    0x202 => 1,  0x9202 => 1,  0xa214 => 1,
+    0x211 => 1,  0x9203 => 1,  0xa215 => 1,
+);
+# same thing for RIFF INFO tags found in the EXIF spec
+my %riffSpec = (
+    IARL => 1,  ICRD => 1,  IGNR => 1,  IPLT => 1,  ISRC => 1,
+    IART => 1,  ICRP => 1,  IKEY => 1,  IPRD => 1,  ISRF => 1,
+    ICMS => 1,  IDIM => 1,  ILGT => 1,  ISBJ => 1,  ITCH => 1,
+    ICMT => 1,  IDPI => 1,  IMED => 1,  ISFT => 1,
+    ICOP => 1,  IENG => 1,  INAM => 1,  ISHP => 1,
+);
+
+#------------------------------------------------------------------------------
+# New - create new BuildTagLookup object
+# Inputs: 0) reference to BuildTagLookup object or BuildTagLookup class name
+sub new
+{
+    local $_;
+    my $that = shift;
+    my $class = ref($that) || $that || 'Image::ExifTool::BuildTagLookup';
+    my $self = bless {}, $class;
+    my (%subdirs, %isShortcut, %allStructs);
+    my %count = (
+        'unique tag names' => 0,
+        'total tags' => 0,
+    );
+#
+# loop through all tables, accumulating TagLookup and TagName information
+#
+    my (%tagNameInfo, %id, %longID, %longName, %shortName, %tableNum,
+        %tagLookup, %tagExists, %tableWritable, %sepTable, %structs,
+        %compositeModules, %isPlugin, %flattened, %structLookup);
+    $self->{TAG_NAME_INFO} = \%tagNameInfo;
+    $self->{ID_LOOKUP} = \%id;
+    $self->{LONG_ID} = \%longID;
+    $self->{LONG_NAME} = \%longName;
+    $self->{SHORT_NAME} = \%shortName;
+    $self->{TABLE_NUM} = \%tableNum;
+    $self->{TAG_LOOKUP} = \%tagLookup;
+    $self->{TAG_EXISTS} = \%tagExists;
+    $self->{FLATTENED} = \%flattened;
+    $self->{TABLE_WRITABLE} = \%tableWritable;
+    $self->{SEPARATE_TABLE} = \%sepTable;
+    $self->{STRUCTURES} = \%structs;
+    $self->{STRUCT_LOOKUP} = \%structLookup;  # lookup for Struct hash ref based on Struct name
+    $self->{COMPOSITE_MODULES} = \%compositeModules;
+    $self->{COUNT} = \%count;
+
+    Image::ExifTool::LoadAllTables();
+    my @tableNames = sort keys %allTables;
+    # add Shortcuts after other tables
+    push @tableNames, 'Image::ExifTool::Shortcuts::Main';
+    # add plug-in modules last
+    $Image::ExifTool::documentOnly = 1; # (don't really load them)
+    foreach (@pluginTables) {
+        push @tableNames, $_;
+        $isPlugin{$_} = 1;
+    }
+
+    my $tableNum = 0;
+    my $exifTool = new Image::ExifTool;
+    my ($tableName, $tag);
+    # create lookup for short table names
+    foreach $tableName (@tableNames) {
+        my $short = $tableName;
+        $short =~ s/^Image::ExifTool:://;
+        $short =~ s/::Main$//;
+        $short =~ s/::/ /;
+        $short =~ s/^(.+)Tags$/\u$1/ unless $short eq 'Nikon AVITags';
+        $short =~ s/^Exif\b/EXIF/;
+        $shortName{$tableName} = $short;    # remember short name
+        $tableNum{$tableName} = $tableNum++;
+    }
+    # validate DICOM UID values
+    foreach (values %Image::ExifTool::DICOM::uid) {
+        next unless /[\0-\x1f\x7f-\xff]/;
+        warn "Warning: Special characters in DICOM UID value ($_)\n";
+    }
+    # make lookup table to check for shortcut tags
+    foreach $tag (keys %Image::ExifTool::Shortcuts::Main) {
+        my $entry = $Image::ExifTool::Shortcuts::Main{$tag};
+        # ignore if shortcut tag name includes itself
+        next if ref $entry eq 'ARRAY' and grep /^$tag$/, @$entry;
+        $isShortcut{lc($tag)} = 1;
+    }
+    foreach $tableName (@tableNames) {
+        # create short table name
+        my $short = $shortName{$tableName};
+        my $info = $tagNameInfo{$tableName} = [ ];
+        my $isPlugin = $isPlugin{$tableName};
+        my ($table, $shortcut, %isOffset, %datamember, %hasSubdir);
+        if ($short eq 'Shortcuts') {
+            # can't use GetTagTable() for Shortcuts (not a normal table)
+            $table = \%Image::ExifTool::Shortcuts::Main;
+            $shortcut = 1;
+        } elsif ($isPlugin) {
+            $table = GetTagTable($tableName);
+            # don't add to allTables list because this messes our table order
+            delete $allTables{$tableName};
+            pop @tableOrder;
+        } else {
+            $table = GetTagTable($tableName);
+        }
+        my $tableNum = $tableNum{$tableName};
+        my $writeProc = $$table{WRITE_PROC};
+        my $vars = $$table{VARS} || { };
+        $longID{$tableName} = 0;
+        $longName{$tableName} = 0;
+        # save all tag names
+        my ($tagID, $binaryTable, $noID, $isIPTC, $isXMP);
+        $isIPTC = 1 if $writeProc and $writeProc eq \&Image::ExifTool::IPTC::WriteIPTC;
+        # generate flattened tag names for structure fields if this is an XMP table
+        if ($$table{GROUPS} and $$table{GROUPS}{0} eq 'XMP') {
+            $isXMP = 1;
+            foreach $tagID (TagTableKeys($table)) {
+                my $tagInfo = $$table{$tagID};
+                next unless ref $tagInfo eq 'HASH' and $$tagInfo{Struct};
+                Image::ExifTool::XMP::AddFlattenedTags($table, $tagID);
+            }
+        }
+        $noID = 1 if $isXMP or $short =~ /^(Shortcuts|ASF.*)$/ or $$vars{NO_ID};
+        my $processBinaryData = ($$table{PROCESS_PROC} and (
+            $$table{PROCESS_PROC} eq \&Image::ExifTool::ProcessBinaryData or
+            $$table{PROCESS_PROC} eq \&Image::ExifTool::Nikon::ProcessNikonEncrypted));
+        if ($$vars{ID_LABEL} or $processBinaryData) {
+            $binaryTable = 1;
+            $id{$tableName} = $$vars{ID_LABEL} || 'Index';
+        } elsif ($isIPTC and $$table{PROCESS_PROC}) { #only the main IPTC table has a PROCESS_PROC
+            $id{$tableName} = 'Record';
+        } elsif (not $noID) {
+            $id{$tableName} = 'Tag ID';
+        }
+        $caseInsensitive = $isXMP;
+        $numbersFirst = -1 if $$table{VARS} and $$table{VARS}{ALPHA_FIRST};
+        my @keys = sort NumbersFirst TagTableKeys($table);
+        $numbersFirst = 1;
+        my $defFormat = $table->{FORMAT};
+        # use default format for binary data tables
+        $defFormat = 'int8u' if not $defFormat and $binaryTable;
+
+TagID:  foreach $tagID (@keys) {
+            my ($tagInfo, @tagNames, $subdir, $format, @values);
+            my (@infoArray, @require, @writeGroup, @writable);
+            if ($shortcut) {
+                # must build a dummy tagInfo list since Shortcuts is not a normal table
+                $tagInfo = {
+                    Name => $tagID,
+                    Notes => $shortcutNotes{$tagID},
+                    Writable => 1,
+                    Require => { },
+                };
+                my $i;
+                for ($i=0; $i<@{$$table{$tagID}}; ++$i) {
+                    $tagInfo->{Require}->{$i} = $table->{$tagID}->[$i];
+                }
+                @infoArray = ( $tagInfo );
+            } else {
+                @infoArray = GetTagInfoList($table,$tagID);
+            }
+            $format = $defFormat;
+            foreach $tagInfo (@infoArray) {
+                my $name = $$tagInfo{Name};
+                # validate Name
+                warn "Warning: Invalid tag name $short '$name'\n" if $name !~ /^[-\w]+$/;
+                # accumulate information for consistency check of BinaryData tables
+                if ($processBinaryData and $$table{WRITABLE}) {
+                    $isOffset{$tagID} = $name if $$tagInfo{IsOffset};
+                    $hasSubdir{$tagID} = $name if $$tagInfo{SubDirectory};
+                    # require DATAMEMBER for writable var-format tags, Hook and DataMember tags
+                    if ($$tagInfo{Format} and $$tagInfo{Format} =~ /^var_/) {
+                        $datamember{$tagID} = $name;
+                        unless (defined $$tagInfo{Writable} and not $$tagInfo{Writable}) {
+                            warn "Warning: Var-format tag is writable - $short $name\n"
+                        }
+                    } elsif ($$tagInfo{Hook} or ($$tagInfo{RawConv} and
+                             $$tagInfo{RawConv} =~ /\$self(->)?\{\w+\}\s*=(?!~)/))
+                    {
+                        $datamember{$tagID} = $name;
+                    }
+                }
+                if ($$tagInfo{Hidden}) {
+                    warn "Warning: Hidden tag in list - $short $name\n" if @infoArray > 1;
+                    next TagID;
+                }
+                my $writable;
+                if (defined $$tagInfo{Writable}) {
+                    $writable = $$tagInfo{Writable};
+                    # validate Writable
+                    unless ($formatOK{$writable} or  ($writable =~ /(.*)\[/ and $formatOK{$1})) {
+                        warn "Warning: Unknown Writable ($writable) for $short $name\n",
+                    }
+                } elsif (not $$tagInfo{SubDirectory}) {
+                    $writable = $$table{WRITABLE};
+                }
+                # validate some characteristics of obvious date/time tags
+                if ($$tagInfo{PrintConv} and $$tagInfo{PrintConv} eq '$self->ConvertDateTime($val)') {
+                    my @g = $exifTool->GetGroup($tagInfo);
+                    warn "$short $name should be in 'Time' group!\n" unless $g[2] eq 'Time';
+                    if ($writable and not $$tagInfo{Shift} and $g[0] ne 'Composite' and
+                        $short ne 'PostScript')
+                    {
+                        warn "$short $name is not shiftable!\n";
+                    }
+                } elsif ($name =~ /DateTime(?!Stamp)/ and (not $$tagInfo{Groups}{2} or
+                    $$tagInfo{Groups}{2} ne 'Time') and $short ne 'DICOM') {
+                    warn "$short $name should be in 'Time' group!\n";
+                }
+                # validate Description (can't contain special characters)
+                if ($$tagInfo{Description} and
+                    $$tagInfo{Description} ne EscapeHTML($$tagInfo{Description}))
+                {
+                    # this is a problem because the Escape option currently only
+                    # escapes descriptions if the default Lang option isn't default
+                    warn "$name description contains special characters!\n";
+                }
+                # validate SubIFD flag
+                my $subdir = $$tagInfo{SubDirectory};
+                my $struct = $$tagInfo{Struct};
+                my $strTable;
+                if (ref $struct) {
+                    $strTable = $struct;
+                    $struct = $$strTable{STRUCT_NAME};
+                    if ($struct) {
+                        my $oldTable = $structLookup{$struct};
+                        if ($oldTable and $oldTable ne $strTable) {
+                            warn "Duplicate XMP structure with name $struct\n";
+                        } else {
+                            $structLookup{$struct} = $strTable;
+                        }
+                    } else {
+                        warn "Missing STRUCT_NAME for structure in $$tagInfo{Name}\n";
+                        undef $strTable;
+                    }
+                } elsif ($struct) {
+                    $strTable = $structLookup{$struct};
+                    unless ($strTable) {
+                        warn "Missing XMP $struct structure!\n";
+                        undef $struct;
+                    }
+                }
+                my $isSub = ($subdir and $$subdir{Start} and $$subdir{Start} eq '$val');
+                if ($$tagInfo{SubIFD}) {
+                    warn "Warning: Wrong SubDirectory Start for SubIFD tag - $short $name\n" unless $isSub;
+                } else {
+                    warn "Warning: SubIFD flag not set for $short $name\n" if $isSub;
+                }
+                if ($$tagInfo{Notes}) {
+                    my $note = $$tagInfo{Notes};
+                    # remove leading/trailing blank lines
+                    $note =~ s/(^\s+|\s+$)//g;
+                    # remove leading/trailing spaces on each line
+                    $note =~ s/(^[ \t]+|[ \t]+$)//mg;
+                    push @values, "($note)";
+                } elsif ($isXMP and lc $tagID ne lc $name) {
+                    # add note about different XMP Tag ID
+                    if ($$tagInfo{RootTagInfo}) {
+                        push @values, "($tagID)";
+                    } else {
+                        push @values,"(called $tagID by the spec)";
+                    }
+                }
+                my $writeGroup;
+                $writeGroup = $$tagInfo{WriteGroup};
+                unless ($writeGroup) {
+                    $writeGroup = $$table{WRITE_GROUP} if $writable;
+                    $writeGroup = '-' unless $writeGroup;
+                }
+                if (defined $$tagInfo{Format}) {
+                    $format = $$tagInfo{Format};
+                    # validate Format
+                    unless ($formatOK{$format} or $short eq 'PICT' or
+                        ($format =~ /^(var_)?(.*)\[/ and $formatOK{$2}))
+                    {
+                        warn "Warning: Unknown Format ($format) for $short $name\n";
+                    }
+                }
+                if ($subdir) {
+                    my $subTable = $$subdir{TagTable} || $tableName;
+                    push @values, $shortName{$subTable}
+                } elsif ($struct) {
+                    push @values, $struct;
+                    $structs{$struct} = 1;
+                }
+                my $type;
+                foreach $type ('Require','Desire') {
+                    my $require = $$tagInfo{$type};
+                    if (ref $require) {
+                        foreach (sort { $a <=> $b } keys %$require) {
+                            push @require, $$require{$_};
+                        }
+                    } elsif ($require) {
+                        push @require, $require;
+                    }
+                }
+                my $printConv = $$tagInfo{PrintConv};
+                if ($$tagInfo{Mask}) {
+                    my $val = $$tagInfo{Mask};
+                    push @values, sprintf('[Mask 0x%.2x]',$val);
+                    $$tagInfo{PrintHex} = 1 unless defined $$tagInfo{PrintHex};
+                    # verify that all values are within the mask
+                    if (ref $printConv eq 'HASH') {
+                        # convert mask if necessary
+                        if ($$tagInfo{ValueConv}) {
+                            my $v = eval $$tagInfo{ValueConv};
+                            $val = $v if defined $v;
+                        }
+                        foreach (keys %$printConv) {
+                            next if $_ !~ /^\d+$/ or ($_ & $val) == $_;
+                            my $hex = sprintf '0x%.2x', $_;
+                            warn "$short $name PrintConv value $hex is not in Mask!\n";
+                        }
+                    }
+                }
+                if (ref($printConv) =~ /^(HASH|ARRAY)$/) {
+                    my (@printConvList, @indexList, $index);
+                    if (ref $printConv eq 'ARRAY') {
+                        for ($index=0; $index<@$printConv; ++$index) {
+                            next if ref $$printConv[$index] ne 'HASH';
+                            next unless %{$$printConv[$index]};
+                            push @printConvList, $$printConv[$index];
+                            push @indexList, $index;
+                            # collapse values with identical PrintConv's
+                            if (@printConvList >= 2 and $printConvList[-1] eq $printConvList[-2]) {
+                                if (ref $indexList[-2]) {
+                                    push @{$indexList[-2]}, $indexList[-1];
+                                } else {
+                                    $indexList[-2] = [ $indexList[-2], $indexList[-1] ];
+                                }
+                                pop @printConvList;
+                                pop @indexList;
+                            }
+                        }
+                        $printConv = shift @printConvList;
+                        $index = shift @indexList;
+                    }
+                    while (defined $printConv) {
+                        if (defined $index) {
+                            # (print indices of original values if reorganized)
+                            my $s = '';
+                            my $idx = $$tagInfo{Relist} ? $tagInfo->{Relist}->[$index] : $index;
+                            if (ref $idx) {
+                                $s = 's' if @$idx > 1;
+                                # collapse consecutive number ranges
+                                my ($i, @i, $rngStart);
+                                for ($i=0; $i<@$idx; ++$i) {
+                                    if ($i < @$idx - 1 and $$idx[$i+1] == $$idx[$i] + 1) {
+                                        $rngStart = $i unless defined $rngStart;
+                                        next;
+                                    }
+                                    push @i, defined($rngStart) ? "$rngStart-$i" : $i;
+                                }
+                                ($idx = join ', ', @i) =~ s/(.*),/$1 and/;
+                            } elsif (not $$tagInfo{Relist}) {
+                                while (@printConvList and $printConv eq $printConvList[0]) {
+                                    shift @printConvList;
+                                    $index = shift @indexList;
+                                }
+                                if ($idx != $index) {
+                                    $idx = "$idx-$index";
+                                    $s = 's';
+                                }
+                            }
+                            push @values, "[Value$s $idx]";
+                        }
+                        if ($$tagInfo{SeparateTable}) {
+                            $subdir = 1;
+                            my $s = $$tagInfo{SeparateTable};
+                            $s = $name if $s eq '1';
+                            # add module name if not specified
+                            $s =~ / / or ($short =~ /^(\w+)/ and $s = "$1 $s");
+                            push @values, $s;
+                            $sepTable{$s} = $printConv;
+                            # add PrintHex flag to PrintConv so we can check it later
+                            $$printConv{PrintHex} = 1 if $$tagInfo{PrintHex};
+                            $$printConv{PrintString} = 1 if $$tagInfo{PrintString};
+                        } else {
+                            $caseInsensitive = 0;
+                            my @pk = sort NumbersFirst keys %$printConv;
+                            my $n = scalar @values;
+                            my ($bits, $cols, $i);
+                            foreach (@pk) {
+                                next if $_ eq '';
+                                $_ eq 'BITMASK' and $bits = $$printConv{$_}, next;
+                                $_ eq 'OTHER' and next;
+                                my $index;
+                                if (($$tagInfo{PrintHex} or $$printConv{BITMASK}) and /^\d+$/) {
+                                    $index = sprintf('0x%x',$_);
+                                } elsif (/^[+-]?(?=\d|\.\d)\d*(\.\d*)?$/ and not $$tagInfo{PrintString}) {
+                                    $index = $_;
+                                } else {
+                                    $index = $_;
+                                    # translate unprintable values
+                                    if ($index =~ s/([\x00-\x1f\x80-\xff])/sprintf("\\x%.2x",ord $1)/eg) {
+                                        $index = qq{"$index"};
+                                    } else {
+                                        $index = qq{'$index'};
+                                    }
+                                }
+                                push @values, "$index = " . $$printConv{$_};
+                                # validate all PrintConv values
+                                if ($$printConv{$_} =~ /[\0-\x1f\x7f-\xff]/) {
+                                    warn "Warning: Special characters in $short $name PrintConv ($$printConv{$_})\n";
+                                }
+                            }
+                            if ($bits) {
+                                my @pk = sort NumbersFirst keys %$bits;
+                                foreach (@pk) {
+                                    push @values, "Bit $_ = " . $$bits{$_};
+                                }
+                            }
+                            # organize values into columns if specified
+                            if (defined($cols = $$tagInfo{PrintConvColumns})) {
+                                my @new = splice @values, $n;
+                                my $v = '[!HTML]<table class=cols><tr>';
+                                my $rows = int((scalar(@new) + $cols - 1) / $cols);
+                                for ($n=0; $n<@new; $n+=$rows) {
+                                    $v .= "\n  <td>";
+                                    for ($i=0; $i<$rows and $n+$i<@new; ++$i) {
+                                        $v .= "\n  <br>" if $i;
+                                        $v .= EscapeHTML($new[$n+$i]);
+                                    }
+                                    $v .= '</td><td>&nbsp;&nbsp;</td>';
+                                }
+                                push @values, $v . "</tr></table>\n";
+                            }
+                        }
+                        last unless @printConvList;
+                        $printConv = shift @printConvList;
+                        $index = shift @indexList;
+                    }
+                } elsif ($printConv and $printConv =~ /DecodeBits\(\$val,\s*(\{.*\})\s*\)/s) {
+                    $$self{Model} = '';   # needed for Nikon ShootingMode
+                    my $bits = eval $1;
+                    delete $$self{Model};
+                    if ($@) {
+                        warn $@;
+                    } else {
+                        my @pk = sort NumbersFirst keys %$bits;
+                        foreach (@pk) {
+                            push @values, "Bit $_ = " . $$bits{$_};
+                        }
+                    }
+                }
+                if ($subdir and not $$tagInfo{SeparateTable}) {
+                    # subdirectories are only writable if specified explicitly
+                    my $tw = $$tagInfo{Writable};
+                    $writable = '-' . ($tw ? $writable : '');
+                    $writable .= '!' if $tw and ($$tagInfo{Protected} || 0) & 0x01;
+                } else {
+                    # not writable if we can't do the inverse conversions
+                    my $noPrintConvInv;
+                    if ($writable) {
+                        foreach ('PrintConv','ValueConv') {
+                            next unless $$tagInfo{$_};
+                            next if $$tagInfo{$_ . 'Inv'};
+                            next if ref($$tagInfo{$_}) =~ /^(HASH|ARRAY)$/;
+                            next if $$tagInfo{WriteAlso};
+                            if ($_ eq 'ValueConv') {
+                                undef $writable;
+                            } else {
+                                $noPrintConvInv = 1;
+                            }
+                        }
+                    }
+                    if (not $writable) {
+                        $writable = 'N';
+                    } else {
+                        $writable eq '1' and $writable = $format ? $format : 'Y';
+                        my $count = $$tagInfo{Count} || 1;
+                        # adjust count to Writable size if different than Format
+                        if ($writable and $format and $writable ne $format and
+                            $Image::ExifTool::Exif::formatNumber{$writable} and
+                            $Image::ExifTool::Exif::formatNumber{$format})
+                        {
+                            my $n1 = $Image::ExifTool::Exif::formatNumber{$format};
+                            my $n2 = $Image::ExifTool::Exif::formatNumber{$writable};
+                            $count *= $Image::ExifTool::Exif::formatSize[$n1] /
+                                      $Image::ExifTool::Exif::formatSize[$n2];
+                        }
+                        if ($count != 1) {
+                            $count = 'n' if $count < 0;
+                            $writable .= "[$count]";
+                        }
+                        $writable .= '~' if $noPrintConvInv;
+                        # add a '*' if this tag is protected or a '!' for unsafe tags
+                        if ($$tagInfo{Protected}) {
+                            $writable .= '*' if $$tagInfo{Protected} & 0x02;
+                            $writable .= '!' if $$tagInfo{Protected} & 0x01;
+                        }
+                        $writable .= '/' if $$tagInfo{Avoid};
+                    }
+                    $writable = "=struct" if $struct;
+                    $writable .= '_' if defined $$tagInfo{Flat};
+                    $writable .= '+' if $$tagInfo{List};
+                    $writable .= ':' if $$tagInfo{Mandatory};
+                    # separate tables link like subdirectories (flagged with leading '-')
+                    $writable = "-$writable" if $subdir;
+                }
+                # don't duplicate a tag name unless an entry is different
+                my $lcName = lc($name);
+                # check for conflicts with shortcut names
+                if ($isShortcut{$lcName} and $short ne 'Shortcuts' and
+                    ($$tagInfo{Writable} or not $$tagInfo{SubDirectory}))
+                {
+                    warn "WARNING: $short $name is a shortcut tag!\n";
+                }
+                $name .= '?' if $$tagInfo{Unknown};
+                unless (@tagNames and $tagNames[-1] eq $name and
+                    $writeGroup[-1] eq $writeGroup and $writable[-1] eq $writable)
+                {
+                    push @tagNames, $name;
+                    push @writeGroup, $writeGroup;
+                    push @writable, $writable;
+                }
+#
+# add this tag to the tag lookup unless PROCESS_PROC is 0 or shortcut or plug-in tag
+#
+                next if $shortcut or $isPlugin;
+                next if defined $$table{PROCESS_PROC} and not $$table{PROCESS_PROC};
+                # count our tags
+                if ($$tagInfo{SubDirectory}) {
+                    $subdirs{$lcName} or $subdirs{$lcName} = 0;
+                    ++$subdirs{$lcName};
+                } else {
+                    ++$count{'total tags'};
+                    unless ($tagExists{$lcName} and (not $subdirs{$lcName} or $subdirs{$lcName} == $tagExists{$lcName})) {
+                        ++$count{'unique tag names'};
+                    }
+                }
+                $tagExists{$lcName} or $tagExists{$lcName} = 0;
+                ++$tagExists{$lcName};
+                # only add writable tags to lookup table (for speed)
+                my $wflag = $$tagInfo{Writable};
+                next unless $writeProc and ($wflag or ($$table{WRITABLE} and
+                    not defined $wflag and not $$tagInfo{SubDirectory}));
+                $tagLookup{$lcName} or $tagLookup{$lcName} = { };
+                # add to lookup for flattened tags if necessary
+                if ($$tagInfo{RootTagInfo}) {
+                    $flattened{$lcName} or $flattened{$lcName} = { };
+                    $flattened{$lcName}{$tableNum} = $$tagInfo{RootTagInfo}{TagID};
+                }
+                # remember number for this table
+                my $tagIDs = $tagLookup{$lcName}->{$tableNum};
+                # must allow for duplicate tags with the same name in a single table!
+                if ($tagIDs) {
+                    if (ref $tagIDs eq 'HASH') {
+                        $$tagIDs{$tagID} = 1;
+                        next;
+                    } elsif ($tagID eq $tagIDs) {
+                        next;
+                    } else {
+                        $tagIDs = { $tagIDs => 1, $tagID => 1 };
+                    }
+                } else {
+                    $tagIDs = $tagID;
+                }
+                $tableWritable{$tableName} = 1;
+                $tagLookup{$lcName}->{$tableNum} = $tagIDs;
+                if ($short eq 'Composite' and $$tagInfo{Module}) {
+                    $compositeModules{$lcName} = $$tagInfo{Module};
+                }
+            }
+#
+# save TagName information
+#
+            my $tagIDstr;
+            if ($tagID =~ /^\d+(\.\d+)?$/) {
+                if ($1 or $binaryTable or $isIPTC or ($short =~ /^CanonCustom/ and $tagID < 256)) {
+                    if ($tagID < 0x10000) {
+                        $tagIDstr = $tagID;
+                    } else {
+                        $tagIDstr = sprintf('0x%.8x',$tagID);
+                    }
+                } else {
+                    $tagIDstr = sprintf('0x%.4x',$tagID);
+                }
+            } elsif ($short eq 'DICOM') {
+                ($tagIDstr = $tagID) =~ s/_/,/;
+            } else {
+                # convert non-printable characters to hex escape sequences
+                if ($tagID =~ s/([\x00-\x1f\x7f-\xff])/'\x'.unpack('H*',$1)/eg) {
+                    $tagID =~ s/\\x00/\\0/g;
+                    next if $tagID eq 'jP\x1a\x1a'; # ignore abnormal JP2 signature tag
+                    $tagIDstr = qq{"$tagID"};
+                } else {
+                    $tagIDstr = "'$tagID'";
+                }
+            }
+            my $len = length $tagIDstr;
+            $longID{$tableName} = $len if $longID{$tableName} < $len;
+            foreach (@tagNames) {
+                $len = length $_;
+                $longName{$tableName} = $len if $longName{$tableName} < $len;
+            }
+            push @$info, [ $tagIDstr, \@tagNames, \@writable, \@values, \@require, \@writeGroup ];
+        }
+        # do consistency check of writable BinaryData tables
+        if ($processBinaryData and $$table{WRITABLE}) {
+            my %lookup = (
+                IS_OFFSET => \%isOffset,
+                IS_SUBDIR => \%hasSubdir,
+                DATAMEMBER => \%datamember,
+            );
+            my ($var, $tagID);
+            foreach $var (sort keys %lookup) {
+                my $hash = $lookup{$var};
+                if ($$table{$var}) {
+                    foreach $tagID (@{$$table{$var}}) {
+                        $$hash{$tagID} and delete($$hash{$tagID}), next;
+                        warn "Warning: Extra $var for $short tag $tagID\n";
+                    }
+                }
+                foreach $tagID (sort keys %$hash) {
+                    warn "Warning: Missing $var for $short $$hash{$tagID}\n";
+                }
+            }
+        }
+    }
+    # save information about structures
+    my $strName;
+    foreach $strName (keys %structs) {
+        my $struct = $structLookup{$strName};
+        my $info = $tagNameInfo{"XMP $strName Struct"} = [ ];
+        my $tag;
+        foreach $tag (sort keys %$struct) {
+            my $tagInfo = $$struct{$tag};
+            next unless ref $tagInfo eq 'HASH';
+            my $writable = $$tagInfo{Writable};
+            my @vals;
+            unless ($writable) {
+                $writable = $$tagInfo{Struct};
+                ref $writable and $writable = $$writable{STRUCT_NAME};
+                if ($writable) {
+                    push @vals, $writable;
+                    $structs{$writable} = 1;
+                    $writable = "=$writable";
+                } else {
+                    $writable = 'string';
+                }
+            }
+            $writable .= '+' if $$tagInfo{List};
+            push @$info, [
+                $tag,
+                [ $$tagInfo{Name} || ucfirst($tag) ],
+                [ $writable ],
+                \@vals,
+                [], []
+            ];
+        }
+    }
+    return $self;
+}
+
+#------------------------------------------------------------------------------
+# Rewrite this file to build the lookup tables
+# Inputs: 0) BuildTagLookup object reference
+#         1) output tag lookup module name (ie. 'lib/Image/ExifTool/TagLookup.pm')
+# Returns: true on success
+sub WriteTagLookup($$)
+{
+    local ($_, *INFILE, *OUTFILE);
+    my ($self, $file) = @_;
+    my $tagLookup = $self->{TAG_LOOKUP};
+    my $tagExists = $self->{TAG_EXISTS};
+    my $flattened = $self->{FLATTENED};
+    my $tableWritable = $self->{TABLE_WRITABLE};
+#
+# open/create necessary files and transfer file headers
+#
+    my $tmpFile = "${file}_tmp";
+    open(INFILE, $file) or warn("Can't open $file\n"), return 0;
+    unless (open(OUTFILE, ">$tmpFile")) {
+        warn "Can't create temporary file $tmpFile\n";
+        close(INFILE);
+        return 0;
+    }
+    my $success;
+    while (<INFILE>) {
+        print OUTFILE $_ or last;
+        if (/^#\+{4} Begin/) {
+            $success = 1;
+            last;
+        }
+    }
+    print OUTFILE "\n# list of tables containing writable tags\n";
+    print OUTFILE "my \@tableList = (\n";
+
+#
+# write table list
+#
+    my @tableNames = sort keys %allTables;
+    my $tableName;
+    my %wrNum;      # translate from allTables index to writable tables index
+    my $count = 0;
+    my $num = 0;
+    foreach $tableName (@tableNames) {
+        if ($$tableWritable{$tableName}) {
+            print OUTFILE "\t'$tableName',\n";
+            $wrNum{$count} = $num++;
+        }
+        $count++;
+    }
+#
+# write the tag lookup table
+#
+    my $tag;
+    # verify that certain critical tag names aren't duplicated
+    foreach $tag (qw{filename directory}) {
+        next unless $$tagLookup{$tag};
+        my $n = scalar keys %{$$tagLookup{$tag}};
+        warn "Warning: $n writable '$tag' tags!\n" if $n > 1;
+    }
+    print OUTFILE ");\n\n# lookup for all writable tags\nmy \%tagLookup = (\n";
+    foreach $tag (sort keys %$tagLookup) {
+        print OUTFILE "\t'$tag' => { ";
+        my @tableNums = sort { $a <=> $b } keys %{$$tagLookup{$tag}};
+        my (@entries, $tableNum);
+        foreach $tableNum (@tableNums) {
+            my $tagID = $$tagLookup{$tag}{$tableNum};
+            my $rootID = $$flattened{$tag}{$tableNum};
+            my $entry;
+            if (ref $tagID eq 'HASH' or $rootID) {
+                $tagID = { $tagID => 1 } unless ref $tagID eq 'HASH';
+                my @tagIDs = sort keys %$tagID;
+                foreach (@tagIDs) {
+                    if (/^\d+$/) {
+                        $_ = sprintf('0x%x',$_);
+                    } else {
+                        my $quot = "'";
+                        # escape non-printable characters in tag ID if necessary
+                        $quot = '"' if s/[\x00-\x1f,\x7f-\xff]/sprintf('\\x%.2x',ord($&))/ge;
+                        $_ = $quot . $_ . $quot;
+                    }
+                }
+                # reference to root structure ID must come first in lookup
+                # (so we can generate the flattened tags just before we need them)
+                unshift @tagIDs, "\\'$rootID'" if $rootID;
+                $entry = '[' . join(',', @tagIDs) . ']';
+            } elsif ($tagID =~ /^\d+$/) {
+                $entry = sprintf('0x%x',$tagID);
+            } else {
+                $entry = "'$tagID'";
+            }
+            my $wrNum = $wrNum{$tableNum};
+            push @entries, "$wrNum => $entry";
+        }
+        print OUTFILE join(', ', @entries);
+        print OUTFILE " },\n";
+    }
+#
+# write tag exists lookup
+#
+    print OUTFILE ");\n\n# lookup for non-writable tags to check if the name exists\n";
+    print OUTFILE "my \%tagExists = (\n";
+    foreach $tag (sort keys %$tagExists) {
+        next if $$tagLookup{$tag};
+        print OUTFILE "\t'$tag' => 1,\n";
+    }
+#
+# write module lookup for writable composite tags
+#
+    my $compositeModules = $self->{COMPOSITE_MODULES};
+    print OUTFILE ");\n\n# module names for writable Composite tags\n";
+    print OUTFILE "my \%compositeModules = (\n";
+    foreach (sort keys %$compositeModules) {
+        print OUTFILE "\t'$_' => '$$compositeModules{$_}',\n";
+    }
+    print OUTFILE ");\n\n";
+#
+# finish writing TagLookup.pm and clean up
+#
+    if ($success) {
+        $success = 0;
+        while (<INFILE>) {
+            $success or /^#\+{4} End/ or next;
+            print OUTFILE $_;
+            $success = 1;
+        }
+    }
+    close(INFILE);
+    close(OUTFILE) or $success = 0;
+#
+# return success code
+#
+    if ($success) {
+        local (*ORG, *TMP);
+        # only rename the file if something changed
+        open ORG, $file or return 0;
+        open TMP, $tmpFile or return 0;
+        my ($buff, $buf2, $changed);
+        for (;;) {
+            my $n1 = read ORG, $buff, 65536;
+            my $n2 = read TMP, $buf2, 65536;
+            $n1 eq $n2 or $changed = 1, last;
+            last unless $n1;
+            $buff eq $buf2 or $changed = 1, last;
+        }
+        close ORG;
+        close TMP;
+        if ($changed) {
+            rename($tmpFile, $file) or warn("Error renaming $tmpFile\n"), $success = 0;
+        } else {
+            unlink($tmpFile);
+        }
+    } else {
+        unlink($tmpFile);
+        warn "Error rewriting file\n";
+    }
+    return $success;
+}
+
+#------------------------------------------------------------------------------
+# sort numbers first numerically, then strings alphabetically (case insensitive)
+sub NumbersFirst
+{
+    my $rtnVal;
+    my $bNum = ($b =~ /^-?[0-9]+(\.\d*)?$/);
+    if ($a =~ /^-?[0-9]+(\.\d*)?$/) {
+        $rtnVal = ($bNum ? $a <=> $b : -$numbersFirst);
+    } elsif ($bNum) {
+        $rtnVal = $numbersFirst;
+    } else {
+        my ($a2, $b2) = ($a, $b);
+        # expand numbers to 3 digits (with restrictions to avoid messing up ascii-hex tags)
+        $a2 =~ s/(\d+)/sprintf("%.3d",$1)/eg if $a2 =~ /^(APP)?[.0-9 ]*$/ and length($a2)<16;
+        $b2 =~ s/(\d+)/sprintf("%.3d",$1)/eg if $b2 =~ /^(APP)?[.0-9 ]*$/ and length($b2)<16;
+        $caseInsensitive and $rtnVal = (lc($a2) cmp lc($b2));
+        $rtnVal or $rtnVal = ($a2 cmp $b2);
+    }
+    return $rtnVal;
+}
+
+#------------------------------------------------------------------------------
+# Convert pod documentation to pod
+# (funny, I know, but the pod headings must be hidden to prevent confusing
+#  the pod parser)
+# Inputs: 0-N) documentation strings
+sub Doc2Pod($;@)
+{
+    my $doc = shift;
+    local $_;
+    $doc .= shift while @_;
+    $doc =~ s/\n~/\n=/g;
+    $doc =~ s/L<[^>]+?\|(http[^>]+)>/L<$1>/g; # POD doesn't support text for http links
+    return $doc;
+}
+
+#------------------------------------------------------------------------------
+# Convert pod documentation to html
+# Inputs: 0) string
+sub Doc2Html($)
+{
+    my $doc = EscapeHTML(shift);
+    $doc =~ s/\n\n/<\/p>\n\n<p>/g;
+    $doc =~ s/B&lt;(.*?)&gt;/<b>$1<\/b>/sg;
+    $doc =~ s/C&lt;(.*?)&gt;/<code>$1<\/code>/sg;
+    $doc =~ s/I&lt;(.*?)&gt;/<i>$1<\/i>/sg;
+    $doc =~ s{L&lt;([^&]+?)\|\Q$homePage\E/TagNames/(.*?)&gt;}{<a href="$2">$1<\/a>}sg;
+    $doc =~ s{L&lt;([^&]+?)\|\Q$homePage\E/(.*?)&gt;}{<a href="../$2">$1<\/a>}sg;
+    $doc =~ s{L&lt;\Q$homePage\E/TagNames/(.*?)&gt;}{<a href="$1">$1<\/a>}sg;
+    $doc =~ s{L&lt;\Q$homePage\E/(.*?)&gt;}{<a href="../$1">$1<\/a>}sg;
+    $doc =~ s{L&lt;([^&]+?)\|/\w+ ([^/&|]+) Tags&gt;}{<a href="#$2">$1</a>}sg;
+    $doc =~ s/L&lt;([^&]+?)\|(.+?)&gt;/<a href="$2">$1<\/a>/sg;
+    $doc =~ s/L&lt;(.*?)&gt;/<a href="$1">$1<\/a>/sg;
+    return $doc;
+}
+
+#------------------------------------------------------------------------------
+# Get the order that we want to print the tables in the documentation
+# Returns: tables in the order we want
+sub GetTableOrder()
+{
+    my %gotTable;
+    my @tableNames = @tableOrder;
+    my (@orderedTables, %mainTables, @outOfOrder);
+    my $lastTable = '';
+
+    while (@tableNames) {
+        my $tableName = shift @tableNames;
+        next if $gotTable{$tableName};
+        if ($tableName =~ /^Image::ExifTool::(\w+)::Main/) {
+            $mainTables{$1} = 1;
+        } elsif ($lastTable and not $tableName =~ /^${lastTable}::/) {
+            push @outOfOrder, $tableName;
+        }
+        ($lastTable) = ($tableName =~ /^(Image::ExifTool::\w+)/);
+        push @orderedTables, $tableName;
+        $gotTable{$tableName} = 1;
+        my $table = GetTagTable($tableName);
+        # recursively scan through tables in subdirectories
+        my @moreTables;
+        $caseInsensitive = ($$table{GROUPS} and $$table{GROUPS}{0} eq 'XMP');
+        $numbersFirst = -1 if $$table{VARS} and $$table{VARS}{ALPHA_FIRST};
+        my @keys = sort NumbersFirst TagTableKeys($table);
+        $numbersFirst = 1;
+        foreach (@keys) {
+            my @infoArray = GetTagInfoList($table,$_);
+            my $tagInfo;
+            foreach $tagInfo (@infoArray) {
+                my $subdir = $$tagInfo{SubDirectory} or next;
+                $tableName = $$subdir{TagTable} or next;
+                next if $gotTable{$tableName};  # next if table already loaded
+                push @moreTables, $tableName;   # must scan this one too
+            }
+        }
+        unshift @tableNames, @moreTables;
+    }
+    # clean up the order for tables which are out of order
+    # (groups all Canon and Kodak tables together)
+    my %fixOrder;
+    foreach (@outOfOrder) {
+        next unless /^Image::ExifTool::(\w+)/;
+        # only re-order tables which have a corresponding main table
+        next unless $mainTables{$1};
+        $fixOrder{$1} = [];     # fix the order of these tables
+    }
+    my (@sortedTables, %fixPos, $pos);
+    foreach (@orderedTables) {
+        if (/^Image::ExifTool::(\w+)/ and $fixOrder{$1}) {
+            my $fix = $fixOrder{$1};
+            unless (@$fix) {
+                $pos = @sortedTables;
+                $fixPos{$pos} or $fixPos{$pos} = [];
+                push @{$fixPos{$pos}}, $1;
+            }
+            push @{$fix}, $_;
+        } else {
+            push @sortedTables, $_;
+        }
+    }
+    # insert back in better order
+    foreach $pos (sort { $b <=> $a } keys %fixPos) { # (reverse sort)
+        my $fix = $fixPos{$pos};
+        foreach (@$fix) {
+            splice(@sortedTables, $pos, 0, @{$fixOrder{$_}});
+        }
+    }
+    # tweak the table order
+    my %tweakOrder = (
+        JPEG    => '-',     # JPEG comes first
+        IPTC    => 'Exif',  # put IPTC after EXIF,
+        GPS     => 'XMP',   # etc...
+        GeoTiff => 'GPS',
+        CanonVRD=> 'CanonCustom',
+        Kodak   => 'JVC',
+       'Kodak::IFD' => 'Kodak::Unknown',
+       'Kodak::TextualInfo' => 'Kodak::IFD',
+       'Kodak::Processing' => 'Kodak::TextualInfo',
+        Leaf    => 'Kodak',
+        Minolta => 'Leaf',
+        SonyIDC => 'Sony',
+        Unknown => 'SonyIDC',
+        DNG     => 'Unknown',
+        PrintIM => 'ICC_Profile',
+        ID3     => 'PostScript',
+        MinoltaRaw => 'KyoceraRaw',
+        KyoceraRaw => 'CanonRaw',
+        SigmaRaw => 'PanasonicRaw',
+        Olympus => 'NikonCapture',
+        PhotoMechanic => 'FotoStation',
+        Microsoft     => 'PhotoMechanic',
+       'Microsoft::MP'=> 'Microsoft::MP1',
+        GIMP    => 'Microsoft',
+       'Nikon::CameraSettingsD300' => 'Nikon::ShotInfoD300b',
+       'Pentax::LensData' => 'Pentax::LensInfo2',
+       'Sony::SRF2' => 'Sony::SRF',
+       'Samsung::INFO' => 'Samsung::Type2', # (necessary because Samsung doesn't have a main table)
+       'Samsung::MP4' => 'Samsung::INFO', # (necessary because Samsung doesn't have a main table)
+    );
+    my @tweak = sort keys %tweakOrder;
+    while (@tweak) {
+        my $table = shift @tweak;
+        my $first = $tweakOrder{$table};
+        if ($tweakOrder{$first}) {
+            push @tweak, $table;    # must defer this till later
+            next;
+        }
+        delete $tweakOrder{$table}; # because the table won't move again
+        my @moving = grep /^Image::ExifTool::$table\b/, @sortedTables;
+        my @notMoving = grep !/^Image::ExifTool::$table\b/, @sortedTables;
+        my @after;
+        while (@notMoving) {
+            last if $notMoving[-1] =~ /^Image::ExifTool::$first\b/;
+            unshift @after, pop @notMoving;
+        }
+        @sortedTables = (@notMoving, @moving, @after);
+    }
+    return @sortedTables
+}
+
+#------------------------------------------------------------------------------
+# Open HTMLFILE and print header and description
+# Inputs: 0) Filename, 1) optional category
+# Returns: True on success
+my %createdFiles;
+sub OpenHtmlFile($;$$)
+{
+    my ($htmldir, $category, $sepTable) = @_;
+    my ($htmlFile, $head, $title, $url, $class);
+    my $top = '';
+
+    if ($category) {
+        my @names = split ' ', $category;
+        $class = shift @names;
+        $htmlFile = "$htmldir/TagNames/$class.html";
+        $head = $category;
+        if ($head =~ /^XMP .+ Struct$/) {
+            pop @names;
+        } else {
+            $head .= ($sepTable ? ' Values' : ' Tags');
+        }
+        ($title = $head) =~ s/ .* / /;
+        @names and $url = join '_', @names;
+    } else {
+        $htmlFile = "$htmldir/TagNames/index.html";
+        $category = $class = 'ExifTool';
+        $head = $title = 'ExifTool Tag Names';
+    }
+    if ($createdFiles{$htmlFile}) {
+        open(HTMLFILE, ">>${htmlFile}_tmp") or return 0;
+    } else {
+        open(HTMLFILE, ">${htmlFile}_tmp") or return 0;
+        print HTMLFILE "$docType<html>\n<head>\n<title>$title</title>\n";
+        print HTMLFILE "<link rel=stylesheet type='text/css' href='style.css' title='Style'>\n";
+        print HTMLFILE "</head>\n<body>\n";
+        if ($category ne $class and $docs{$class}) {
+            print HTMLFILE "<h2 class=top>$class Tags</h2>\n" or return 0;
+            print HTMLFILE '<p>',Doc2Html($docs{$class}),"</p>\n" or return 0;
+        } else {
+            $top = " class=top";
+        }
+    }
+    $head = "<a name='$url'>$head</a>" if $url;
+    print HTMLFILE "<h2$top>$head</h2>\n" or return 0;
+    print HTMLFILE '<p>',Doc2Html($docs{$category}),"</p>\n" if $docs{$category};
+    $createdFiles{$htmlFile} = 1;
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Close all html files and write trailers
+# Returns: true on success
+# Inputs: 0) BuildTagLookup object reference
+sub CloseHtmlFiles($)
+{
+    my $self = shift;
+    my $preserveDate = $$self{PRESERVE_DATE};
+    my $success = 1;
+    # get the date
+    my ($sec,$min,$hr,$day,$mon,$yr) = localtime;
+    my @month = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
+    $yr += 1900;
+    my $date = "$month[$mon] $day, $yr";
+    my $htmlFile;
+    my $countNewFiles = 0;
+    my $countSameFiles = 0;
+    foreach $htmlFile (keys %createdFiles) {
+        my $tmpFile = $htmlFile . '_tmp';
+        my $fileDate = $date;
+        if ($preserveDate) {
+            my @lines = `grep '<i>Last revised' $htmlFile`;
+            $fileDate = $1 if @lines and $lines[-1] =~ m{<i>Last revised (.*)</i>};
+        }
+        open(HTMLFILE, ">>$tmpFile") or $success = 0, next;
+        # write the trailers
+        print HTMLFILE "<hr>\n";
+        print HTMLFILE "(This document generated automatically by Image::ExifTool::BuildTagLookup)\n";
+        print HTMLFILE "<br><i>Last revised $fileDate</i>\n";
+        print HTMLFILE "<p class=lf><a href=";
+        if ($htmlFile =~ /index\.html$/) {
+            print HTMLFILE "'../index.html'>&lt;-- Back to ExifTool home page</a></p>\n";
+        } else {
+            print HTMLFILE "'index.html'>&lt;-- ExifTool Tag Names</a></p>\n"
+        }
+        print HTMLFILE "</body>\n</html>\n" or $success = 0;
+        close HTMLFILE or $success = 0;
+        # check for differences and only use new file if it was changed
+        # (so the date only gets updated if changes were really made)
+        my $useNewFile;
+        if ($success) {
+            open (TEMPFILE, $tmpFile) or $success = 0, last;
+            if (open (HTMLFILE, $htmlFile)) {
+                while (<HTMLFILE>) {
+                    my $newLine = <TEMPFILE>;
+                    if (defined $newLine) {
+                        next if /^<br><i>Last revised/;
+                        next if $_ eq $newLine;
+                    }
+                    # files are different -- use the new file
+                    $useNewFile = 1;
+                    last;
+                }
+                $useNewFile = 1 if <TEMPFILE>;
+                close HTMLFILE;
+            } else {
+                $useNewFile = 1;
+            }
+            close TEMPFILE;
+            if ($useNewFile) {
+                ++$countNewFiles;
+                rename $tmpFile, $htmlFile or warn("Error renaming temporary file\n"), $success = 0;
+            } else {
+                ++$countSameFiles;
+                unlink $tmpFile;   # erase new file and use existing file
+            }
+        }
+        last unless $success;
+    }
+    # save number of files processed so we can check the results later
+    $self->{COUNT}->{'HTML files changed'} = $countNewFiles;
+    $self->{COUNT}->{'HTML files unchanged'} = $countSameFiles;
+    return $success;
+}
+
+#------------------------------------------------------------------------------
+# Write the TagName HTML and POD documentation
+# Inputs: 0) BuildTagLookup object reference
+#         1) output pod file (ie. 'lib/Image/ExifTool/TagNames.pod')
+#         2) output html directory (ie. 'html')
+# Returns: true on success
+# Notes: My apologies for the patchwork code, but this is only used to generate the docs.
+sub WriteTagNames($$)
+{
+    my ($self, $podFile, $htmldir) = @_;
+    my ($tableName, $short, $url, @sepTables, @structs);
+    my $tagNameInfo = $self->{TAG_NAME_INFO} or return 0;
+    my $idLabel = $self->{ID_LOOKUP};
+    my $shortName = $self->{SHORT_NAME};
+    my $sepTable = $self->{SEPARATE_TABLE};
+    my $structs = $self->{STRUCTURES};
+    my $structLookup = $self->{STRUCT_LOOKUP};
+    my $success = 1;
+    my $columns = 6;    # number of columns in html index
+    my $percent = int(100 / $columns);
+
+    # open the file and write the header
+    open(PODFILE, ">$podFile") or return 0;
+    print PODFILE Doc2Pod($docs{PodHeader}, $docs{ExifTool}, $docs{ExifTool2});
+    mkdir "$htmldir/TagNames";
+    OpenHtmlFile($htmldir) or return 0;
+    print HTMLFILE "<blockquote>\n";
+    print HTMLFILE "<table width='100%' class=frame><tr><td>\n";
+    print HTMLFILE "<table width='100%' class=inner cellspacing=1><tr class=h>\n";
+    print HTMLFILE "<th colspan=$columns><span class=l>Tag Table Index</span></th></tr>\n";
+    print HTMLFILE "<tr class=b><td width='$percent%'>\n";
+    # write the index
+    my @tableNames = GetTableOrder();
+    # add shortcuts last
+    push @tableNames, 'Image::ExifTool::Shortcuts::Main';
+    push @tableNames, @pluginTables;
+    # get list of headings and add any missing ones
+    my $heading = 'xxx';
+    my (@tableIndexNames, @headings);
+    foreach $tableName (@tableNames) {
+        $short = $$shortName{$tableName};
+        my @names = split ' ', $short;
+        my $class = shift @names;
+        if (@names) {
+            # add heading for tables without a Main
+            unless ($heading eq $class) {
+                $heading = $class;
+                push @tableIndexNames, $heading;
+                push @headings, $heading;
+            }
+        } else {
+            $heading = $short;
+            push @headings, $heading;
+        }
+        push @tableIndexNames, $tableName;
+    }
+    @tableNames = @tableIndexNames;
+    # print html index of headings only
+    my $count = 0;
+    my $lines = int((scalar(@headings) + $columns - 1) / $columns);
+    foreach $tableName (@headings) {
+        if ($count) {
+            if ($count % $lines) {
+                print HTMLFILE "<br>\n";
+            } else {
+                print HTMLFILE "</td><td width='$percent%'>\n";
+            }
+        }
+        $short = $$shortName{$tableName};
+        $short = $tableName unless $short;
+        $url = "$short.html";
+        print HTMLFILE "<a href='$url'>$short</a>";
+        ++$count;
+    }
+    print HTMLFILE "\n</td></tr></table></td></tr></table></blockquote>\n";
+    print HTMLFILE '<p>',Doc2Html($docs{ExifTool2}),"</p>\n";
+    # write all the tag tables
+    while (@tableNames or @sepTables or @structs) {
+        while (@sepTables) {
+            $tableName = shift @sepTables;
+            my $printConv = $$sepTable{$tableName};
+            next unless ref $printConv eq 'HASH';
+            $$sepTable{$tableName} = 1;
+            my $notes = $$printConv{Notes};
+            if ($notes) {
+                # remove unnecessary whitespace
+                $notes =~ s/(^\s+|\s+$)//g;
+                $notes =~ s/(^[ \t]+|[ \t]+$)//mg;
+            }
+            my $head = $tableName;
+            $head =~ s/.* //;
+            close HTMLFILE;
+            if (OpenHtmlFile($htmldir, $tableName, 1)) {
+                print HTMLFILE '<p>', Doc2Html($notes), "</p>\n" if $notes;
+                print HTMLFILE "<blockquote>\n";
+                print HTMLFILE "<table class=frame><tr><td>\n";
+                print HTMLFILE "<table class='inner sep' cellspacing=1>\n";
+                my $align = ' class=r';
+                my $wid = 0;
+                my @keys;
+                foreach (sort NumbersFirst keys %$printConv) {
+                    next if /^(Notes|PrintHex|PrintString|OTHER)$/;
+                    $align = '' if $align and /[^\d]/;
+                    my $w = length($_) + length($$printConv{$_});
+                    $wid = $w if $wid < $w;
+                    push @keys, $_;
+                }
+                $wid = length($tableName)+7 if $wid < length($tableName)+7;
+                # print in multiple columns if there is room
+                my $cols = int(80 / ($wid + 4));
+                $cols = 1 if $cols < 1 or $cols > @keys or @keys < 4;
+                my $rows = int((scalar(@keys) + $cols - 1) / $cols);
+                my ($r, $c);
+                print HTMLFILE '<tr class=h>';
+                for ($c=0; $c<$cols; ++$c) {
+                    print HTMLFILE "<th>Value</th><th>$head</th>";
+                }
+                print HTMLFILE "</tr>\n";
+                for ($r=0; $r<$rows; ++$r) {
+                    print HTMLFILE '<tr>';
+                    for ($c=0; $c<$cols; ++$c) {
+                        my $key = $keys[$r + $c*$rows];
+                        my ($index, $prt);
+                        if (defined $key) {
+                            $index = $key;
+                            $prt = '= ' . EscapeHTML($$printConv{$key});
+                            if ($$printConv{PrintHex}) {
+                                $index = sprintf('0x%x',$index);
+                            } elsif ($$printConv{PrintString} or
+                                $index !~ /^[+-]?(?=\d|\.\d)\d*(\.\d*)?$/)
+                            {
+                                $index = "'" . EscapeHTML($index) . "'";
+                            }
+                        } else {
+                            $index = $prt = '&nbsp;';
+                        }
+                        my ($ic, $pc);
+                        if ($c & 0x01) {
+                            $pc = ' class=b';
+                            $ic = $align ? " class='r b'" : $pc;
+                        } else {
+                            $ic = $align;
+                            $pc = '';
+                        }
+                        print HTMLFILE "<td$ic>$index</td><td$pc>$prt</td>\n";
+                    }
+                    print HTMLFILE '</tr>';
+                }
+                print HTMLFILE "</table></td></tr></table></blockquote>\n\n";
+            }
+        }
+        last unless @tableNames or @structs;
+        my $isStruct;
+        if (@structs) {
+            $tableName = shift @structs;
+            next if $$structs{$tableName} == 2; # only list each structure once
+            $$structs{$tableName} = 2;
+            $isStruct = $$structLookup{$tableName};
+            $isStruct or warn("Missing structure $tableName\n"), next;
+            $short = $tableName = "XMP $tableName Struct";
+            my $maxLen = 0;
+            $maxLen < length and $maxLen = length foreach keys %$isStruct;
+            $$self{LONG_ID}{$tableName} = $maxLen;
+        } else {
+            $tableName = shift @tableNames;
+            $short = $$shortName{$tableName};
+            unless ($short) {
+                # this is just an index heading
+                print PODFILE "\n=head2 $tableName Tags\n";
+                print PODFILE Doc2Pod($docs{$tableName}) if $docs{$tableName};
+                next;
+            }
+        }
+        my $isExif = $tableName eq 'Image::ExifTool::Exif::Main' ? 1 : undef;
+        my $isRiff = $tableName eq 'Image::ExifTool::RIFF::Info' ? 1 : undef;
+        my $info = $$tagNameInfo{$tableName};
+        my $id = $$idLabel{$tableName};
+        my ($hid, $showGrp);
+        # widths of the different columns in the POD documentation
+        my ($wID,$wTag,$wReq,$wGrp) = (8,36,24,10);
+        my ($composite, $derived, $notes, $prefix);
+        if ($short eq 'Shortcuts') {
+            $derived = '<th>Refers To</th>';
+            $composite = 2;
+        } elsif ($isStruct) {
+            $derived = '';
+            $notes = $$isStruct{NOTES};
+        } else {
+            my $table = GetTagTable($tableName);
+            $notes = $$table{NOTES};
+            if ($$table{GROUPS}{0} eq 'Composite') {
+                $composite = 1;
+                $derived = '<th>Derived From</th>';
+            } else {
+                $composite = 0;
+                $derived = '';
+            }
+        }
+        my $podIdLen = $self->{LONG_ID}->{$tableName};
+        if ($notes) {
+            # remove unnecessary whitespace
+            $notes =~ s/(^\s+|\s+$)//g;
+            $notes =~ s/(^[ \t]+|[ \t]+$)//mg;
+            if ($notes =~ /leading '(.*?_)' which/) {
+                $prefix = $1;
+                $podIdLen -= length $prefix;
+            }
+        }
+        if ($podIdLen <= $wID) {
+            $podIdLen = $wID;
+        } elsif ($short eq 'DICOM') {
+            $podIdLen = 10;
+        } else {
+            # align tag names in secondary columns if possible
+            my $col = ($podIdLen <= 10) ? 12 : 20;
+            $podIdLen = $col if $podIdLen < $col;
+        }
+        if ($id) {
+            ($hid = "<th>$id</th>") =~ s/ /&nbsp;/g;
+            $wTag -= $podIdLen - $wID;
+            $wID = $podIdLen;
+            my $longTag = $self->{LONG_NAME}->{$tableName};
+            if ($wTag < $longTag) {
+                warn "Notice: Long tags in $tableName table\n";
+                if ($wID - $longTag + $wTag >= 6) { # don't let ID column get too narrow
+                    $wID -= $longTag - $wTag;
+                    $wTag = $longTag;
+                }
+            }
+        } elsif ($composite) {
+            $wTag += $wID - $wReq;
+            $hid = '';
+        } else {
+            $wTag += 9;
+            $hid = '';
+        }
+        if ($short eq 'EXIF') {
+            $derived = '<th>Group</th>';
+            $showGrp = 1;
+            $wTag -= $wGrp + 1;
+        }
+        my $head = ($short =~ / /) ? 'head3' : 'head2';
+        my $str = $isStruct ? '' : ' Tags';
+        print PODFILE "\n=$head $short$str\n";
+        print PODFILE Doc2Pod($docs{$short}) if $docs{$short};
+        print PODFILE "\n", Doc2Pod($notes), "\n" if $notes;
+        my $line = "\n";
+        if ($id) {
+            # shift over 'Index' heading by one character for a bit more balance
+            $id = " $id" if $id eq 'Index';
+            $line .= sprintf "  %-${wID}s", $id;
+        } else {
+            $line .= ' ';
+        }
+        my $tagNameHeading = ($short eq 'XMP') ? 'Namespace' : ($isStruct?'Field':'Tag').' Name';
+        $line .= sprintf " %-${wTag}s", $tagNameHeading;
+        $line .= sprintf " %-${wReq}s", $composite == 2 ? 'Refers To' : 'Derived From' if $composite;
+        $line .= sprintf " %-${wGrp}s", 'Group' if $showGrp;
+        $line .= ' Writable';
+        print PODFILE $line;
+        $line =~ s/^(\s*\w.{6}\w) /$1\t/;   # change space to tab after long ID label (ie. "Sequence")
+        $line =~ s/\S/-/g;
+        $line =~ s/- -/---/g;
+        $line =~ tr/\t/ /;                  # change tab back to space
+        print PODFILE $line,"\n";
+        close HTMLFILE;
+        OpenHtmlFile($htmldir, $short) or $success = 0;
+        print HTMLFILE '<p>',Doc2Html($notes), "</p>\n" if $notes;
+        print HTMLFILE "<blockquote>\n";
+        print HTMLFILE "<table class=frame><tr><td>\n";
+        print HTMLFILE "<table class=inner cellspacing=1>\n";
+        print HTMLFILE "<tr class=h>$hid<th>$tagNameHeading</th>\n";
+        print HTMLFILE "<th>Writable</th>$derived<th>Values / ${noteFont}Notes</span></th></tr>\n";
+        my $rowClass = 1;
+        my $infoCount = 0;
+        my $infoList;
+        foreach $infoList (@$info) {
+            ++$infoCount;
+            my ($tagIDstr, $tagNames, $writable, $values, $require, $writeGroup) = @$infoList;
+            my ($align, $idStr, $w, $tip);
+            my $wTag2 = $wTag;
+            if (not $id) {
+                $idStr = '  ';
+            } elsif ($tagIDstr =~ /^\d+(\.\d+)?$/) {
+                $w = $wID - 3;
+                $idStr = sprintf "  %${w}g    ", $tagIDstr;
+                $align = " class=r";
+            } else {
+                $tagIDstr =~ s/^'$prefix/'/ if $prefix;
+                $w = $wID;
+                my $over = length($tagIDstr) - $w;
+                if ($over > 0) {
+                    # shift over tag name if there is room
+                    if ($over <= $wTag - length($$tagNames[0])) {
+                        $wTag2 -= $over;
+                        $w += $over;
+                    } else {
+                        # put tag name on next line if ID is too long
+                        $idStr = "  $tagIDstr\n   " . (' ' x $w);
+                        warn "Notice: Split $$tagNames[0] line\n";
+                    }
+                }
+                $idStr = sprintf "  %-${w}s ", $tagIDstr unless defined $idStr;
+                $align = '';
+            }
+            my @reqs;
+            my @tags = @$tagNames;
+            my @wGrp = @$writeGroup;
+            my @vals = @$writable;
+            my $wrStr = shift @vals;
+            my $subdir;
+            my @masks = grep /^\[Mask 0x[\da-f]+\]/, @$values;
+            my $tag = shift @tags;
+            # if this is a subdirectory or structure, print subdir name (from values) instead of writable
+            if ($wrStr =~ /^[-=]/) {
+                $subdir = 1;
+                if (@masks) {
+                    # combine any mask into the format string
+                    $wrStr .= " & $1" if $masks[0] =~ /(0x[\da-f]+)/;
+                    shift @masks;
+                    @vals = grep !/^\[Mask 0x[\da-f]+\]/, @$values;
+                } else {
+                    @vals = @$values;
+                }
+                # remove Notes if subdir has Notes as well
+                shift @vals if $vals[0] =~ /^\(/ and @vals >= @$writable;
+                foreach (@vals) { /^\(/ and $_ = '-' }
+                my $i;  # fill in any missing entries from non-directory tags
+                for ($i=0; $i<@$writable; ++$i) {
+                    $vals[$i] = $$writable[$i] unless defined $vals[$i];
+                    if (@masks) {
+                        $vals[$i] .= " & $1" if $masks[0] =~ /(0x[\da-f]+)/;
+                        shift @masks;
+                    }
+                }
+                if ($$sepTable{$vals[0]}) {
+                    $wrStr =~ s/^[-=]//;
+                    $wrStr = 'N' unless $wrStr;
+                } elsif ($$structs{$vals[0]}) {
+                    my $flags = $wrStr =~ /([+_]+)$/ ? $1 : '';
+                    $wrStr = "$vals[0] Struct$flags";
+                } else {
+                    $wrStr = $vals[0];
+                }
+                shift @vals;
+            } elsif ($wrStr and $wrStr ne 'N' and @masks) {
+                # fill in missing entries if masks are different
+                my $mask = shift @masks;
+                while (@masks > @vals) {
+                    last if $masks[@vals] eq $mask;
+                    push @vals, $wrStr;
+                    push @tags, $tag if @tags < @vals;
+                }
+                # add Mask to Writable column in POD doc
+                $wrStr .= " & $1" if $mask =~ /(0x[\da-f]+)/;
+            }
+            printf PODFILE "%s%-${wTag2}s", $idStr, $tag;
+            warn "Warning: Pushed $tag\n" if $id and length($tag) > $wTag2;
+            printf PODFILE " %-${wGrp}s", shift(@wGrp) || '-' if $showGrp;
+            if ($composite) {
+                @reqs = @$require;
+                $w = $wReq; # Keep writable column in line
+                length($tag) > $wTag2 and $w -= length($tag) - $wTag2;
+                printf PODFILE " %-${w}s", shift(@reqs) || '';
+            }
+            printf PODFILE " $wrStr\n";
+            my $numTags = scalar @$tagNames;
+            my $n = 0;
+            while (@tags or @reqs or @vals) {
+                my $more = (@tags or @reqs);
+                $line = '  ';
+                $line .= ' 'x($wID+1) if $id;
+                $line .= sprintf("%-${wTag2}s", shift(@tags) || '');
+                $line .= sprintf(" %-${wReq}s", shift(@reqs) || '') if $composite;
+                $line .= sprintf(" %-${wGrp}s", shift(@wGrp) || '-') if $showGrp;
+                ++$n;
+                if (@vals) {
+                    my $val = shift @vals;
+                    # use writable if this is a note
+                    my $wrStr = $$writable[$n];
+                    if ($subdir and ($val =~ /^\(/ or $val =~ /=/ or ($wrStr and $wrStr !~ /^[-=]/))) {
+                        $val = $wrStr;
+                        if (defined $val) {
+                            $val =~ s/^[-=]//;
+                        } else {
+                            # done with tag if nothing else to print
+                            last unless $more;
+                        }
+                    }
+                    if (defined $val) {
+                        $line .= " $val";
+                        if (@masks) {
+                            $line .= " & $1" if $masks[0] =~ /(0x[\da-f]+)/;
+                            shift @masks;
+                        }
+                    }
+                }
+                $line =~ s/\s+$//;  # trim trailing white space
+                print PODFILE "$line\n";
+            }
+            my @htmlTags;
+            foreach (@$tagNames) {
+                push @htmlTags, EscapeHTML($_);
+            }
+            if (($isExif and $exifSpec{hex $tagIDstr}) or
+                ($isRiff and $tagIDstr=~/(\w+)/ and $riffSpec{$1}))
+            {
+                # underline "unknown" makernote tags only
+                my $n = $tagIDstr eq '0x927c' ? -1 : 0;
+                $htmlTags[$n] = "<u>$htmlTags[$n]</u>";
+            }
+            $rowClass = $rowClass ? '' : " class=b";
+            my $isSubdir;
+            if ($$writable[0] =~ /^[-=]/) {
+                $isSubdir = 1;
+                s/^[-=](.+)/$1/ foreach @$writable;
+            }
+            # add tooltip for hex conversion of Tag ID
+            if ($tagIDstr =~ /^0x[0-9a-f]+$/i) {
+                $tip = sprintf(" title='$tagIDstr = %u'",hex $tagIDstr);
+            } elsif ($tagIDstr =~ /^(\d+)(\.\d*)?$/) {
+                $tip = sprintf(" title='%u = 0x%x'", $1, $1);
+            } else {
+                $tip = '';
+                # use copyright symbol in QuickTime UserData tags
+                $tagIDstr =~ s/^"\\xa9/"&copy;/;
+            }
+            # add tooltip for special writable attributes
+            my $wtip = '';
+            my %wattr = (
+                '_' => 'Flattened',
+                '+' => 'List',
+                '/' => 'Avoided',
+                '~' => 'Writable only with -n',
+                '!' => 'Unsafe',
+                '*' => 'Protected',
+                ':' => 'Mandatory',
+            );
+            my ($wstr, %hasAttr, @hasAttr);
+            foreach $wstr (@$writable) {
+                next unless $wstr =~ m{([+/~!*:_]+)$};
+                my @a = split //, $1;
+                foreach (@a) {
+                    next if $hasAttr{$_};
+                    push @hasAttr, $_;
+                    $hasAttr{$_} = 1;
+                }
+            }
+            if (@hasAttr) {
+                $wtip = " title='";
+                my $n = 0;
+                foreach (@hasAttr) {
+                    $wtip .= "\n" if $n;
+                    $wtip .= " $_ = $wattr{$_}";
+                    ++$n;
+                }
+                $wtip .= "'";
+            }
+            # print this row in the tag table
+            print HTMLFILE "<tr$rowClass>\n";
+            print HTMLFILE "<td$align$tip>$tagIDstr</td>\n" if $id;
+            print HTMLFILE "<td>", join("\n  <br>",@htmlTags), "</td>\n";
+            print HTMLFILE "<td class=c$wtip>",join('<br>',@$writable),"</td>\n";
+            print HTMLFILE '<td class=n>',join("\n  <br>",@$require),"</td>\n" if $composite;
+            print HTMLFILE "<td class=c>",join('<br>',@$writeGroup),"</td>\n" if $showGrp;
+            print HTMLFILE "<td>";
+            if (@$values) {
+                if ($isSubdir) {
+                    my ($smallNote, @values);
+                    foreach (@$values) {
+                        if (/^\(/) {
+                            # set the note font
+                            $smallNote = 1 if $numTags < 2;
+                            push @values, ($smallNote ? $noteFontSmall : $noteFont) . "$_</span>";
+                            next;
+                        }
+                        # make text in square brackets small
+                        /^\[/ and push(@values, "<span class=s>$_</span>"), next;
+                        /=/ and push(@values, $_), next;
+                        my @names = split;
+                        my $suffix = ' Tags';
+                        if ($$sepTable{$_}) {
+                            push @sepTables, $_;
+                            $suffix = ' Values';
+                        }
+                        # currently all structures are in XMP documentation
+                        if ($$structs{$_} and $short =~ /^XMP/) {
+                            unshift @names, 'XMP';
+                            push @structs, $_;  # list this later
+                            $suffix = ' Struct';
+                        }
+                        $url = (shift @names) . '.html';
+                        @names and $url .= '#' . join '_', @names;
+                        push @values, "--&gt; <a href='$url'>$_$suffix</a>";
+                    }
+                    # put small note last
+                    $smallNote and push @values, shift @values;
+                    print HTMLFILE join("\n  <br>",@values);
+                } else {
+                    my ($close, $br) = ('', '');
+                    foreach (@$values) {
+                        if (s/^\[!HTML\]//) {
+                            print HTMLFILE $close if $close;
+                            print HTMLFILE $_;
+                            $close = $br = '';
+                        } else {
+                            if (/^\(/) {
+                                # notes can use POD syntax
+                                $_ = $noteFont . Doc2Html($_) . "</span>";
+                            } else {
+                                $_ = EscapeHTML($_);
+                            }
+                            $close or $_ = "<span class=s>$_", $close = '</span>';
+                            print HTMLFILE $br, $_;
+                            $br = "\n  <br>";
+                        }
+                    }
+                    print HTMLFILE $close if $close;
+                }
+            } else {
+                print HTMLFILE '&nbsp;';
+            }
+            print HTMLFILE "</td></tr>\n";
+        }
+        unless ($infoCount) {
+            printf PODFILE "  [no tags known]\n";
+            my $cols = 3;
+            ++$cols if $hid;
+            ++$cols if $derived;
+            print HTMLFILE "<tr><td colspan=$cols class=c><i>[no tags known]</i></td></tr>\n";
+        }
+        print HTMLFILE "</table></td></tr></table></blockquote>\n\n";
+    }
+    close(HTMLFILE) or $success = 0;
+    CloseHtmlFiles($self) or $success = 0;
+    print PODFILE Doc2Pod($docs{PodTrailer}) or $success = 0;
+    close(PODFILE) or $success = 0;
+    return $success;
+}
+
+1;  # end
+
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::BuildTagLookup - Build ExifTool tag lookup tables
+
+=head1 DESCRIPTION
+
+This module is used to generate the tag lookup tables in
+Image::ExifTool::TagLookup.pm and tag name documentation in
+Image::ExifTool::TagNames.pod, as well as HTML tag name documentation.  It
+is used before each new ExifTool release to update the lookup tables and
+documentation, but it is not used otherwise.
+
+=head1 SYNOPSIS
+
+  use Image::ExifTool::BuildTagLookup;
+
+  $builder = new Image::ExifTool::BuildTagLookup;
+
+  $ok = $builder->WriteTagLookup('lib/Image/ExifTool/TagLookup.pm');
+
+  $ok = $builder->WriteTagNames('lib/Image/ExifTool/TagNames.pod','html');
+
+=head1 MEMBER VARIABLES
+
+=over 4
+
+=item PRESERVE_DATE
+
+Flag to preserve "Last revised" date in HTML files.  Set before calling
+WriteTagNames().
+
+=item COUNT
+
+Reference to hash containing counting statistics.  Keys are the
+descriptions, and values are the numerical counts.  Valid after
+BuildTagLookup object is created, but additional statistics are added by
+WriteTagNames().
+
+=back
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool(3pm)|Image::ExifTool>,
+L<Image::ExifTool::TagLookup(3pm)|Image::ExifTool::TagLookup>,
+L<Image::ExifTool::TagNames(3pm)|Image::ExifTool::TagNames>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Canon.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Canon.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Canon.pm	(revision 24799)
@@ -0,0 +1,6887 @@
+#------------------------------------------------------------------------------
+# File:         Canon.pm
+#
+# Description:  Canon EXIF maker notes tags
+#
+# Revisions:    11/25/2003 - P. Harvey Created
+#               12/03/2003 - P. Harvey Decode lots more tags and add CanonAFInfo
+#               02/17/2004 - Michael Rommel Added IxusAFPoint
+#               01/27/2005 - P. Harvey Disable validation of CanonAFInfo
+#               01/30/2005 - P. Harvey Added a few more tags (ref 4)
+#               02/10/2006 - P. Harvey Decode a lot of new tags (ref 12)
+#               [ongoing]  - P. Harvey Constantly decoding new information
+#
+# Notes:        Must check FocalPlaneX/YResolution values for each new model!
+#
+# References:   1) http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html
+#               2) Michael Rommel private communication (Digital Ixus)
+#               3) Daniel Pittman private communication (PowerShot S70)
+#               4) http://www.wonderland.org/crw/
+#               5) Juha Eskelinen private communication (20D)
+#               6) Richard S. Smith private communication (20D)
+#               7) Denny Priebe private communication (1DmkII)
+#               8) Irwin Poche private communication
+#               9) Michael Tiemann private communication (1DmkII)
+#              10) Volker Gering private communication (1DmkII)
+#              11) "cip" private communication
+#              12) Rainer Honle private communication (5D)
+#              13) http://www.cybercom.net/~dcoffin/dcraw/
+#              14) (bozi) http://www.cpanforum.com/threads/2476 and /2563
+#              15) http://homepage3.nifty.com/kamisaka/makernote/makernote_canon.htm (2007/11/19)
+#                + http://homepage3.nifty.com/kamisaka/makernote/CanonLens.htm (2007/11/19)
+#              16) Emil Sit private communication (30D)
+#              17) http://www.asahi-net.or.jp/~xp8t-ymzk/s10exif.htm
+#              18) Samson Tai private communication (G7)
+#              19) Warren Stockton private communication
+#              20) Bogdan private communication
+#              21) Heiko Hinrichs private communication
+#              22) Dave Nicholson private communication (PowerShot S30)
+#              23) Magne Nilsen private communication (400D)
+#              24) Wolfgang Hoffmann private communication (40D)
+#              26) Steve Balcombe private communication
+#              27) Chris Huebsch private communication (40D)
+#              28) Hal Williamson private communication (XTi)
+#              29) Ger Vermeulen private communication
+#              30) David Pitcher private communication (1DmkIII)
+#              31) Darryl Zurn private communication (A590IS)
+#              32) Rich Taylor private communication (5D)
+#              33) D.J. Cristi private communication
+#              34) Andreas Huggel and Pascal de Bruijn private communication
+#              35) Jan Boelsma private communication
+#              36) Karl-Heinz Klotz private communication (http://www.dslr-forum.de/showthread.php?t=430900)
+#              37) Vesa Kivisto private communication (30D)
+#              38) Kurt Garloff private communication (5DmkII)
+#              39) Irwin Poche private communication (5DmkII)
+#              40) Jose Oliver-Didier private communication
+#              41) http://www.cpanforum.com/threads/10730
+#              42) Norbert Wasser private communication
+#              43) Karsten Sote private communication
+#              44) Hugh Griffiths private communication (5DmkII)
+#              45) Mark Berger private communication (5DmkII)
+#              46) Dieter Steiner private communication (7D)
+#              47) http://www.exiv2.org/
+#              48) Tomasz A. Kawecki private communication (550D, firmware 1.0.6, 1.0.8)
+#              49) http://www.listware.net/201101/digikam-users/49795-digikam-users-re-lens-recognition.html
+#              JD) Jens Duttke private communication
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Canon;
+
+use strict;
+use vars qw($VERSION %canonModelID);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::Exif;
+
+sub WriteCanon($$$);
+sub ProcessSerialData($$$);
+sub ProcessFilters($$$);
+sub SwapWords($);
+
+$VERSION = '2.71';
+
+# Note: Removed 'USM' from 'L' lenses since it is redundant - PH
+# (or is it?  Ref 32 shows 5 non-USM L-type lenses)
+my %canonLensTypes = ( #4
+     Notes => q{
+        Decimal values differentiate lenses which would otherwise have the same
+        LensType, and are used by the Composite LensID tag when attempting to
+        identify the specific lens model.
+     },
+     1 => 'Canon EF 50mm f/1.8',
+     2 => 'Canon EF 28mm f/2.8',
+     # (3 removed in current Kamisaka list)
+     3 => 'Canon EF 135mm f/2.8 Soft', #15/32
+     4 => 'Canon EF 35-105mm f/3.5-4.5 or Sigma Lens', #28
+     4.1 => 'Sigma UC Zoom 35-135mm f/4-5.6',
+     5 => 'Canon EF 35-70mm f/3.5-4.5', #32
+     6 => 'Canon EF 28-70mm f/3.5-4.5 or Sigma or Tokina Lens', #32
+     6.1 => 'Sigma 18-50mm f/3.5-5.6 DC', #23
+     6.2 => 'Sigma 18-125mm f/3.5-5.6 DC IF ASP',
+     6.3 => 'Tokina AF193-2 19-35mm f/3.5-4.5',
+     6.4 => 'Sigma 28-80mm f/3.5-5.6 II Macro', #47
+     7 => 'Canon EF 100-300mm f/5.6L', #15
+     8 => 'Canon EF 100-300mm f/5.6 or Sigma or Tokina Lens', #32
+     8.1 => 'Sigma 70-300mm f/4-5.6 [APO] DG Macro', #15 (both APO and non-APO, ref http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,2947.0.html)
+     8.2 => 'Tokina AT-X242AF 24-200mm f/3.5-5.6', #15
+     9 => 'Canon EF 70-210mm f/4', #32
+     9.1 => 'Sigma 55-200mm f/4-5.6 DC', #34
+    10 => 'Canon EF 50mm f/2.5 Macro or Sigma Lens', #10 (+ LSC Life Size Converter --> 70mm - PH)
+    10.1 => 'Sigma 50mm f/2.8 EX', #4
+    10.2 => 'Sigma 28mm f/1.8',
+    10.3 => 'Sigma 105mm f/2.8 Macro EX', #15
+    10.4 => 'Sigma 70mm f/2.8 EX DG Macro EF', #Jean-Michel Dubois
+    11 => 'Canon EF 35mm f/2', #9
+    13 => 'Canon EF 15mm f/2.8 Fisheye', #9
+    14 => 'Canon EF 50-200mm f/3.5-4.5L', #32
+    15 => 'Canon EF 50-200mm f/3.5-4.5', #32
+    16 => 'Canon EF 35-135mm f/3.5-4.5', #32
+    17 => 'Canon EF 35-70mm f/3.5-4.5A', #32
+    18 => 'Canon EF 28-70mm f/3.5-4.5', #32
+    20 => 'Canon EF 100-200mm f/4.5A', #32
+    21 => 'Canon EF 80-200mm f/2.8L',
+    22 => 'Canon EF 20-35mm f/2.8L or Tokina Lens', #32
+    22.1 => 'Tokina AT-X280AF PRO 28-80mm f/2.8 Aspherical', #15
+    23 => 'Canon EF 35-105mm f/3.5-4.5', #32
+    24 => 'Canon EF 35-80mm f/4-5.6 Power Zoom', #32
+    25 => 'Canon EF 35-80mm f/4-5.6 Power Zoom', #32
+    26 => 'Canon EF 100mm f/2.8 Macro or Other Lens',
+    26.1 => 'Cosina 100mm f/3.5 Macro AF',
+    26.2 => 'Tamron SP AF 90mm f/2.8 Di Macro', #15
+    26.3 => 'Tamron SP AF 180mm f/3.5 Di Macro', #15
+    26.4 => 'Carl Zeiss Planar T* 50mm f/1.4', #PH
+    27 => 'Canon EF 35-80mm f/4-5.6', #32
+    28 => 'Canon EF 80-200mm f/4.5-5.6 or Tamron Lens', #32
+    28.1 => 'Tamron SP AF 28-105mm f/2.8 LD Aspherical IF', #15
+    28.2 => 'Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical [IF] Macro', #4
+    28.3 => 'Tamron AF 70-300mm f/4.5-5.6 Di LD 1:2 Macro Zoom', #11
+    28.4 => 'Tamron AF Aspherical 28-200mm f/3.8-5.6', #14
+    29 => 'Canon EF 50mm f/1.8 II',
+    30 => 'Canon EF 35-105mm f/4.5-5.6', #32
+    31 => 'Canon EF 75-300mm f/4-5.6 or Tamron Lens', #32
+    31.1 => 'Tamron SP AF 300mm f/2.8 LD IF', #15
+    32 => 'Canon EF 24mm f/2.8 or Sigma Lens', #10
+    32.1 => 'Sigma 15mm f/2.8 EX Fisheye', #11
+    33 => 'Voigtlander or Zeiss Lens',
+    33.1 => 'Voigtlander Ultron 40mm f/2 SLII Aspherical', #45
+    33.2 => 'Zeiss Distagon 35mm T* f/2 ZE', #PH
+    35 => 'Canon EF 35-80mm f/4-5.6', #32
+    36 => 'Canon EF 38-76mm f/4.5-5.6', #32
+    37 => 'Canon EF 35-80mm f/4-5.6 or Tamron Lens', #32
+    37.1 => 'Tamron 70-200mm f/2.8 Di LD IF Macro', #PH
+    37.2 => 'Tamron AF 28-300mm f/3.5-6.3 XR Di VC LD Aspherical [IF] Macro Model A20', #38
+    37.3 => 'Tamron SP AF 17-50mm f/2.8 XR Di II VC LD Aspherical [IF]', #34
+    37.4 => 'Tamron AF 18-270mm f/3.5-6.3 Di II VC LD Aspherical [IF] Macro', #http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,2937.0.html
+    38 => 'Canon EF 80-200mm f/4.5-5.6', #32
+    39 => 'Canon EF 75-300mm f/4-5.6',
+    40 => 'Canon EF 28-80mm f/3.5-5.6',
+    41 => 'Canon EF 28-90mm f/4-5.6', #32
+    42 => 'Canon EF 28-200mm f/3.5-5.6 or Tamron Lens', #32
+    42.1 => 'Tamron AF 28-300mm f/3.5-6.3 XR Di VC LD Aspherical [IF] Macro Model A20', #15
+    43 => 'Canon EF 28-105mm f/4-5.6', #10
+    44 => 'Canon EF 90-300mm f/4.5-5.6', #32
+    45 => 'Canon EF-S 18-55mm f/3.5-5.6 [II]', #PH (same ID for version II, ref 20)
+    46 => 'Canon EF 28-90mm f/4-5.6', #32
+    48 => 'Canon EF-S 18-55mm f/3.5-5.6 IS', #20
+    49 => 'Canon EF-S 55-250mm f/4-5.6 IS', #23
+    50 => 'Canon EF-S 18-200mm f/3.5-5.6 IS',
+    51 => 'Canon EF-S 18-135mm f/3.5-5.6 IS', #PH
+    52 => 'Canon EF-S 18-55mm f/3.5-5.6 IS II', #PH
+    94 => 'Canon TS-E 17mm f/4L', #42
+    95 => 'Canon TS-E 24.0mm f/3.5 L II', #43
+    124 => 'Canon MP-E 65mm f/2.8 1-5x Macro Photo', #9
+    125 => 'Canon TS-E 24mm f/3.5L',
+    126 => 'Canon TS-E 45mm f/2.8', #15
+    127 => 'Canon TS-E 90mm f/2.8', #15
+    129 => 'Canon EF 300mm f/2.8L', #32
+    130 => 'Canon EF 50mm f/1.0L', #10/15
+    131 => 'Canon EF 28-80mm f/2.8-4L or Sigma Lens', #32
+    131.1 => 'Sigma 8mm f/3.5 EX DG Circular Fisheye', #15
+    131.2 => 'Sigma 17-35mm f/2.8-4 EX DG Aspherical HSM', #15
+    131.3 => 'Sigma 17-70mm f/2.8-4.5 DC Macro', #PH (NC)
+    131.4 => 'Sigma APO 50-150mm f/2.8 [II] EX DC HSM', #15 ([II] ref PH)
+    131.5 => 'Sigma APO 120-300mm f/2.8 EX DG HSM', #15
+           # 'Sigma APO 120-300mm f/2.8 EX DG HSM + 1.4x', #15
+           # 'Sigma APO 120-300mm f/2.8 EX DG HSM + 2x', #15
+    132 => 'Canon EF 1200mm f/5.6L', #32
+    134 => 'Canon EF 600mm f/4L IS', #15
+    135 => 'Canon EF 200mm f/1.8L',
+    136 => 'Canon EF 300mm f/2.8L',
+    137 => 'Canon EF 85mm f/1.2L or Sigma or Tamron Lens', #10
+    137.1 => 'Sigma 18-50mm f/2.8-4.5 DC OS HSM', #PH
+    137.2 => 'Sigma 50-200mm f/4-5.6 DC OS HSM', #PH
+    137.3 => 'Sigma 18-250mm f/3.5-6.3 DC OS HSM', #PH
+    137.4 => 'Sigma 24-70mm f/2.8 IF EX DG HSM', #PH
+    137.5 => 'Sigma 18-125mm f/3.8-5.6 DC OS HSM', #PH
+    137.6 => 'Sigma 17-70mm f/2.8-4 DC Macro OS HSM', #http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,2819.0.html
+    137.7 => 'Sigma 17-50mm f/2.8 OS HSM', #PH (from Exiv2)
+    137.8 => 'Tamron AF 18-270mm f/3.5-6.3 Di II VC PZD', #(model B008)http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,3090.0.html
+    138 => 'Canon EF 28-80mm f/2.8-4L', #32
+    139 => 'Canon EF 400mm f/2.8L',
+    140 => 'Canon EF 500mm f/4.5L', #32
+    141 => 'Canon EF 500mm f/4.5L',
+    142 => 'Canon EF 300mm f/2.8L IS', #15
+    143 => 'Canon EF 500mm f/4L IS', #15
+    144 => 'Canon EF 35-135mm f/4-5.6 USM', #26
+    145 => 'Canon EF 100-300mm f/4.5-5.6 USM', #32
+    146 => 'Canon EF 70-210mm f/3.5-4.5 USM', #32
+    147 => 'Canon EF 35-135mm f/4-5.6 USM', #32
+    148 => 'Canon EF 28-80mm f/3.5-5.6 USM', #32
+    149 => 'Canon EF 100mm f/2 USM', #9
+    150 => 'Canon EF 14mm f/2.8L or Sigma Lens', #10
+    150.1 => 'Sigma 20mm EX f/1.8', #4
+    150.2 => 'Sigma 30mm f/1.4 DC HSM', #15
+    150.3 => 'Sigma 24mm f/1.8 DG Macro EX', #15
+    151 => 'Canon EF 200mm f/2.8L',
+    152 => 'Canon EF 300mm f/4L IS or Sigma Lens', #15
+    152.1 => 'Sigma 12-24mm f/4.5-5.6 EX DG ASPHERICAL HSM', #15
+    152.2 => 'Sigma 14mm f/2.8 EX Aspherical HSM', #15
+    152.3 => 'Sigma 10-20mm f/4-5.6', #14
+    152.4 => 'Sigma 100-300mm f/4', # (ref Bozi)
+    153 => 'Canon EF 35-350mm f/3.5-5.6L or Sigma or Tamron Lens', #PH
+    153.1 => 'Sigma 50-500mm f/4-6.3 APO HSM EX', #15
+    153.2 => 'Tamron AF 28-300mm f/3.5-6.3 XR LD Aspherical [IF] Macro',
+    153.3 => 'Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical [IF] Macro Model A14', #15
+    153.4 => 'Tamron 18-250mm f/3.5-6.3 Di II LD Aspherical [IF] Macro', #PH
+    154 => 'Canon EF 20mm f/2.8 USM', #15
+    155 => 'Canon EF 85mm f/1.8 USM',
+    156 => 'Canon EF 28-105mm f/3.5-4.5 USM or Tamron Lens',
+    156.1 => 'Tamron SP 70-300mm f/4.0-5.6 Di VC USD', #PH (model A005)
+    160 => 'Canon EF 20-35mm f/3.5-4.5 USM or Tamron or Tokina Lens',
+    160.1 => 'Tamron AF 19-35mm f/3.5-4.5', #44
+    160.2 => 'Tokina AT-X 124 AF 12-24mm f/4 DX', #49 (not sure about specific model - PH)
+    160.3 => 'Tokina AT-X 107 AF DX 10-17mm f/3.5-4.5 Fisheye', #PH (http://osdir.com/ml/digikam-devel/2011-04/msg00275.html)
+    161 => 'Canon EF 28-70mm f/2.8L or Sigma or Tamron Lens',
+    161.1 => 'Sigma 24-70mm f/2.8 EX',
+    161.2 => 'Sigma 28-70mm f/2.8 EX', #PH (http://www.breezesys.com/forum/showthread.php?t=3718)
+    161.3 => 'Tamron AF 17-50mm f/2.8 Di-II LD Aspherical', #40
+    161.4 => 'Tamron 90mm f/2.8',
+    162 => 'Canon EF 200mm f/2.8L', #32
+    163 => 'Canon EF 300mm f/4L', #32
+    164 => 'Canon EF 400mm f/5.6L', #32
+    165 => 'Canon EF 70-200mm f/2.8 L',
+    166 => 'Canon EF 70-200mm f/2.8 L + 1.4x',
+    167 => 'Canon EF 70-200mm f/2.8 L + 2x',
+    168 => 'Canon EF 28mm f/1.8 USM', #15
+    169 => 'Canon EF 17-35mm f/2.8L or Sigma Lens', #15
+    169.1 => 'Sigma 18-200mm f/3.5-6.3 DC OS', #23
+    169.2 => 'Sigma 15-30mm f/3.5-4.5 EX DG Aspherical', #4
+    169.3 => 'Sigma 18-50mm f/2.8 Macro', #26
+    169.4 => 'Sigma 50mm f/1.4 EX DG HSM', #PH
+    169.5 => 'Sigma 85mm f/1.4 EX DG HSM', #Rolando Ruzic
+    169.6 => 'Sigma 30mm f/1.4 EX DC HSM', #Rodolfo Borges
+    170 => 'Canon EF 200mm f/2.8L II', #9
+    171 => 'Canon EF 300mm f/4L', #15
+    172 => 'Canon EF 400mm f/5.6L', #32
+    173 => 'Canon EF 180mm Macro f/3.5L or Sigma Lens', #9
+    173.1 => 'Sigma 180mm EX HSM Macro f/3.5', #14
+    173.2 => 'Sigma APO Macro 150mm f/2.8 EX DG HSM', #14
+    174 => 'Canon EF 135mm f/2L or Sigma Lens', #9
+    174.1 => 'Sigma 70-200mm f/2.8 EX DG APO OS HSM', #PH (probably version II of this lens)
+    175 => 'Canon EF 400mm f/2.8L', #32
+    176 => 'Canon EF 24-85mm f/3.5-4.5 USM',
+    177 => 'Canon EF 300mm f/4L IS', #9
+    178 => 'Canon EF 28-135mm f/3.5-5.6 IS',
+    179 => 'Canon EF 24mm f/1.4L', #20
+    180 => 'Canon EF 35mm f/1.4L', #9
+    181 => 'Canon EF 100-400mm f/4.5-5.6L IS + 1.4x', #15
+    182 => 'Canon EF 100-400mm f/4.5-5.6L IS + 2x',
+    183 => 'Canon EF 100-400mm f/4.5-5.6L IS',
+    184 => 'Canon EF 400mm f/2.8L + 2x', #15
+    185 => 'Canon EF 600mm f/4L IS', #32
+    186 => 'Canon EF 70-200mm f/4L', #9
+    187 => 'Canon EF 70-200mm f/4L + 1.4x', #26
+    188 => 'Canon EF 70-200mm f/4L + 2x', #PH
+    189 => 'Canon EF 70-200mm f/4L + 2.8x', #32
+    190 => 'Canon EF 100mm f/2.8 Macro',
+    191 => 'Canon EF 400mm f/4 DO IS', #9
+    193 => 'Canon EF 35-80mm f/4-5.6 USM', #32
+    194 => 'Canon EF 80-200mm f/4.5-5.6 USM', #32
+    195 => 'Canon EF 35-105mm f/4.5-5.6 USM', #32
+    196 => 'Canon EF 75-300mm f/4-5.6 USM', #15/32
+    197 => 'Canon EF 75-300mm f/4-5.6 IS USM',
+    198 => 'Canon EF 50mm f/1.4 USM', #9
+    199 => 'Canon EF 28-80mm f/3.5-5.6 USM', #32
+    200 => 'Canon EF 75-300mm f/4-5.6 USM', #32
+    201 => 'Canon EF 28-80mm f/3.5-5.6 USM', #32
+    202 => 'Canon EF 28-80mm f/3.5-5.6 USM IV',
+    208 => 'Canon EF 22-55mm f/4-5.6 USM', #32
+    209 => 'Canon EF 55-200mm f/4.5-5.6', #32
+    210 => 'Canon EF 28-90mm f/4-5.6 USM', #32
+    211 => 'Canon EF 28-200mm f/3.5-5.6 USM', #15
+    212 => 'Canon EF 28-105mm f/4-5.6 USM', #15
+    213 => 'Canon EF 90-300mm f/4.5-5.6 USM',
+    214 => 'Canon EF-S 18-55mm f/3.5-5.6 USM', #PH/34
+    215 => 'Canon EF 55-200mm f/4.5-5.6 II USM',
+    224 => 'Canon EF 70-200mm f/2.8L IS', #11
+    225 => 'Canon EF 70-200mm f/2.8L IS + 1.4x', #11
+    226 => 'Canon EF 70-200mm f/2.8L IS + 2x', #14
+    227 => 'Canon EF 70-200mm f/2.8L IS + 2.8x', #32
+    228 => 'Canon EF 28-105mm f/3.5-4.5 USM', #32
+    229 => 'Canon EF 16-35mm f/2.8L', #PH
+    230 => 'Canon EF 24-70mm f/2.8L', #9
+    231 => 'Canon EF 17-40mm f/4L',
+    232 => 'Canon EF 70-300mm f/4.5-5.6 DO IS USM', #15
+    233 => 'Canon EF 28-300mm f/3.5-5.6L IS', #PH
+    234 => 'Canon EF-S 17-85mm f4-5.6 IS USM', #19
+    235 => 'Canon EF-S 10-22mm f/3.5-4.5 USM', #15
+    236 => 'Canon EF-S 60mm f/2.8 Macro USM', #15
+    237 => 'Canon EF 24-105mm f/4L IS', #15
+    238 => 'Canon EF 70-300mm f/4-5.6 IS USM', #15
+    239 => 'Canon EF 85mm f/1.2L II', #15
+    240 => 'Canon EF-S 17-55mm f/2.8 IS USM', #15
+    241 => 'Canon EF 50mm f/1.2L', #15
+    242 => 'Canon EF 70-200mm f/4L IS', #PH
+    243 => 'Canon EF 70-200mm f/4L IS + 1.4x', #15
+    244 => 'Canon EF 70-200mm f/4L IS + 2x', #PH
+    245 => 'Canon EF 70-200mm f/4L IS + 2.8x', #32
+    246 => 'Canon EF 16-35mm f/2.8L II', #PH
+    247 => 'Canon EF 14mm f/2.8L II USM', #32
+    248 => 'Canon EF 200mm f/2L IS', #42
+    249 => 'Canon EF 800mm f/5.6L IS', #35
+    250 => 'Canon EF 24 f/1.4L II', #41
+    251 => 'Canon EF 70-200mm f/2.8L IS II USM',
+    254 => 'Canon EF 100mm f/2.8L Macro IS USM', #42
+    # Note: LensType 488 (0x1e8) is reported as 232 (0xe8) in 7D CameraSettings
+    488 => 'Canon EF-S 15-85mm f/3.5-5.6 IS USM', #PH
+    489 => 'Canon EF 70-300mm f/4-5.6L IS USM', #Gerald Kapounek
+);
+
+# Canon model ID numbers (PH)
+%canonModelID = (
+    0x1010000 => 'PowerShot A30',
+    0x1040000 => 'PowerShot S300 / Digital IXUS 300 / IXY Digital 300',
+    0x1060000 => 'PowerShot A20',
+    0x1080000 => 'PowerShot A10',
+    0x1090000 => 'PowerShot S110 / Digital IXUS v / IXY Digital 200',
+    0x1100000 => 'PowerShot G2',
+    0x1110000 => 'PowerShot S40',
+    0x1120000 => 'PowerShot S30',
+    0x1130000 => 'PowerShot A40',
+    0x1140000 => 'EOS D30',
+    0x1150000 => 'PowerShot A100',
+    0x1160000 => 'PowerShot S200 / Digital IXUS v2 / IXY Digital 200a',
+    0x1170000 => 'PowerShot A200',
+    0x1180000 => 'PowerShot S330 / Digital IXUS 330 / IXY Digital 300a',
+    0x1190000 => 'PowerShot G3',
+    0x1210000 => 'PowerShot S45',
+    0x1230000 => 'PowerShot SD100 / Digital IXUS II / IXY Digital 30',
+    0x1240000 => 'PowerShot S230 / Digital IXUS v3 / IXY Digital 320',
+    0x1250000 => 'PowerShot A70',
+    0x1260000 => 'PowerShot A60',
+    0x1270000 => 'PowerShot S400 / Digital IXUS 400 / IXY Digital 400',
+    0x1290000 => 'PowerShot G5',
+    0x1300000 => 'PowerShot A300',
+    0x1310000 => 'PowerShot S50',
+    0x1340000 => 'PowerShot A80',
+    0x1350000 => 'PowerShot SD10 / Digital IXUS i / IXY Digital L',
+    0x1360000 => 'PowerShot S1 IS',
+    0x1370000 => 'PowerShot Pro1',
+    0x1380000 => 'PowerShot S70',
+    0x1390000 => 'PowerShot S60',
+    0x1400000 => 'PowerShot G6',
+    0x1410000 => 'PowerShot S500 / Digital IXUS 500 / IXY Digital 500',
+    0x1420000 => 'PowerShot A75',
+    0x1440000 => 'PowerShot SD110 / Digital IXUS IIs / IXY Digital 30a',
+    0x1450000 => 'PowerShot A400',
+    0x1470000 => 'PowerShot A310',
+    0x1490000 => 'PowerShot A85',
+    0x1520000 => 'PowerShot S410 / Digital IXUS 430 / IXY Digital 450',
+    0x1530000 => 'PowerShot A95',
+    0x1540000 => 'PowerShot SD300 / Digital IXUS 40 / IXY Digital 50',
+    0x1550000 => 'PowerShot SD200 / Digital IXUS 30 / IXY Digital 40',
+    0x1560000 => 'PowerShot A520',
+    0x1570000 => 'PowerShot A510',
+    0x1590000 => 'PowerShot SD20 / Digital IXUS i5 / IXY Digital L2',
+    0x1640000 => 'PowerShot S2 IS',
+    0x1650000 => 'PowerShot SD430 / Digital IXUS Wireless / IXY Digital Wireless',
+    0x1660000 => 'PowerShot SD500 / Digital IXUS 700 / IXY Digital 600',
+    0x1668000 => 'EOS D60',
+    0x1700000 => 'PowerShot SD30 / Digital IXUS i Zoom / IXY Digital L3',
+    0x1740000 => 'PowerShot A430',
+    0x1750000 => 'PowerShot A410',
+    0x1760000 => 'PowerShot S80',
+    0x1780000 => 'PowerShot A620',
+    0x1790000 => 'PowerShot A610',
+    0x1800000 => 'PowerShot SD630 / Digital IXUS 65 / IXY Digital 80',
+    0x1810000 => 'PowerShot SD450 / Digital IXUS 55 / IXY Digital 60',
+    0x1820000 => 'PowerShot TX1',
+    0x1870000 => 'PowerShot SD400 / Digital IXUS 50 / IXY Digital 55',
+    0x1880000 => 'PowerShot A420',
+    0x1890000 => 'PowerShot SD900 / Digital IXUS 900 Ti / IXY Digital 1000',
+    0x1900000 => 'PowerShot SD550 / Digital IXUS 750 / IXY Digital 700',
+    0x1920000 => 'PowerShot A700',
+    0x1940000 => 'PowerShot SD700 IS / Digital IXUS 800 IS / IXY Digital 800 IS',
+    0x1950000 => 'PowerShot S3 IS',
+    0x1960000 => 'PowerShot A540',
+    0x1970000 => 'PowerShot SD600 / Digital IXUS 60 / IXY Digital 70',
+    0x1980000 => 'PowerShot G7',
+    0x1990000 => 'PowerShot A530',
+    0x2000000 => 'PowerShot SD800 IS / Digital IXUS 850 IS / IXY Digital 900 IS',
+    0x2010000 => 'PowerShot SD40 / Digital IXUS i7 / IXY Digital L4',
+    0x2020000 => 'PowerShot A710 IS',
+    0x2030000 => 'PowerShot A640',
+    0x2040000 => 'PowerShot A630',
+    0x2090000 => 'PowerShot S5 IS',
+    0x2100000 => 'PowerShot A460',
+    0x2120000 => 'PowerShot SD850 IS / Digital IXUS 950 IS / IXY Digital 810 IS',
+    0x2130000 => 'PowerShot A570 IS',
+    0x2140000 => 'PowerShot A560',
+    0x2150000 => 'PowerShot SD750 / Digital IXUS 75 / IXY Digital 90',
+    0x2160000 => 'PowerShot SD1000 / Digital IXUS 70 / IXY Digital 10',
+    0x2180000 => 'PowerShot A550',
+    0x2190000 => 'PowerShot A450',
+    0x2230000 => 'PowerShot G9',
+    0x2240000 => 'PowerShot A650 IS',
+    0x2260000 => 'PowerShot A720 IS',
+    0x2290000 => 'PowerShot SX100 IS',
+    0x2300000 => 'PowerShot SD950 IS / Digital IXUS 960 IS / IXY Digital 2000 IS',
+    0x2310000 => 'PowerShot SD870 IS / Digital IXUS 860 IS / IXY Digital 910 IS',
+    0x2320000 => 'PowerShot SD890 IS / Digital IXUS 970 IS / IXY Digital 820 IS',
+    0x2360000 => 'PowerShot SD790 IS / Digital IXUS 90 IS / IXY Digital 95 IS',
+    0x2370000 => 'PowerShot SD770 IS / Digital IXUS 85 IS / IXY Digital 25 IS',
+    0x2380000 => 'PowerShot A590 IS',
+    0x2390000 => 'PowerShot A580',
+    0x2420000 => 'PowerShot A470',
+    0x2430000 => 'PowerShot SD1100 IS / Digital IXUS 80 IS / IXY Digital 20 IS',
+    0x2460000 => 'PowerShot SX1 IS',
+    0x2470000 => 'PowerShot SX10 IS',
+    0x2480000 => 'PowerShot A1000 IS',
+    0x2490000 => 'PowerShot G10',
+    0x2510000 => 'PowerShot A2000 IS',
+    0x2520000 => 'PowerShot SX110 IS',
+    0x2530000 => 'PowerShot SD990 IS / Digital IXUS 980 IS / IXY Digital 3000 IS',
+    0x2540000 => 'PowerShot SD880 IS / Digital IXUS 870 IS / IXY Digital 920 IS',
+    0x2550000 => 'PowerShot E1',
+    0x2560000 => 'PowerShot D10',
+    0x2570000 => 'PowerShot SD960 IS / Digital IXUS 110 IS / IXY Digital 510 IS',
+    0x2580000 => 'PowerShot A2100 IS',
+    0x2590000 => 'PowerShot A480',
+    0x2600000 => 'PowerShot SX200 IS',
+    0x2610000 => 'PowerShot SD970 IS / Digital IXUS 990 IS / IXY Digital 830 IS',
+    0x2620000 => 'PowerShot SD780 IS / Digital IXUS 100 IS / IXY Digital 210 IS',
+    0x2630000 => 'PowerShot A1100 IS',
+    0x2640000 => 'PowerShot SD1200 IS / Digital IXUS 95 IS / IXY Digital 110 IS',
+    0x2700000 => 'PowerShot G11',
+    0x2710000 => 'PowerShot SX120 IS',
+    0x2720000 => 'PowerShot S90',
+    0x2750000 => 'PowerShot SX20 IS',
+    0x2760000 => 'PowerShot SD980 IS / Digital IXUS 200 IS / IXY Digital 930 IS',
+    0x2770000 => 'PowerShot SD940 IS / Digital IXUS 120 IS / IXY Digital 220 IS',
+    0x2800000 => 'PowerShot A495',
+    0x2810000 => 'PowerShot A490',
+    0x2820000 => 'PowerShot A3100 IS',
+    0x2830000 => 'PowerShot A3000 IS',
+    0x2840000 => 'PowerShot SD1400 IS / IXUS 130 / IXY 400F',
+    0x2850000 => 'PowerShot SD1300 IS / IXUS 105 / IXY 200F',
+    0x2860000 => 'PowerShot SD3500 IS / IXUS 210 / IXY 10S',
+    0x2870000 => 'PowerShot SX210 IS',
+    0x2880000 => 'PowerShot SD4000 IS / IXUS 300 HS / IXY 30S',
+    0x2890000 => 'PowerShot SD4500 IS / IXUS 1000 HS / IXY 50S',
+    0x2920000 => 'PowerShot G12',
+    0x2930000 => 'PowerShot SX30 IS',
+    0x2940000 => 'PowerShot SX130 IS',
+    0x2950000 => 'PowerShot S95',
+    0x2980000 => 'PowerShot A3300 IS',
+    0x2990000 => 'PowerShot A3200 IS',
+    0x3000000 => 'PowerShot ELPH 500 HS / IXUS 310 HS / IXY 31 S',
+    0x3010000 => 'PowerShot Pro90 IS',
+    0x3010001 => 'PowerShot A800',
+    0x3020000 => 'PowerShot ELPH 100 HS / IXUS 115 HS / IXY 210F',
+    0x3030000 => 'PowerShot SX230 HS',
+    0x3040000 => 'PowerShot ELPH 300 HS / IXUS 220 HS / IXY 410F',
+    0x3050000 => 'PowerShot A2200',
+    0x3060000 => 'PowerShot A1200',
+    0x3070000 => 'PowerShot SX220 HS',
+    0x4040000 => 'PowerShot G1',
+    0x6040000 => 'PowerShot S100 / Digital IXUS / IXY Digital',
+    0x4007d673 => 'DC19/DC21/DC22',
+    0x4007d674 => 'XH A1',
+    0x4007d675 => 'HV10',
+    0x4007d676 => 'MD130/MD140/MD150/MD160/ZR850',
+    0x4007d777 => 'DC50', # (iVIS)
+    0x4007d778 => 'HV20', # (iVIS)
+    0x4007d779 => 'DC211', #29
+    0x4007d77a => 'HG10',
+    0x4007d77b => 'HR10', #29 (iVIS)
+    0x4007d77d => 'MD255/ZR950',
+    0x4007d81c => 'HF11',
+    0x4007d878 => 'HV30',
+    0x4007d87e => 'DC301/DC310/DC311/DC320/DC330',
+    0x4007d87f => 'FS100',
+    0x4007d880 => 'HF10', #29 (iVIS/VIXIA)
+    0x4007d882 => 'HG20/HG21', # (VIXIA)
+    0x4007d925 => 'HF21', # (LEGRIA)
+    0x4007d926 => 'HF S11', # (LEGRIA)
+    0x4007d978 => 'HV40', # (LEGRIA)
+    0x4007d987 => 'DC410/DC420',
+    0x4007d988 => 'FS19/FS20/FS21/FS22/FS200', # (LEGRIA)
+    0x4007d989 => 'HF20/HF200', # (LEGRIA)
+    0x4007d98a => 'HF S10/S100', # (LEGRIA/VIXIA)
+    0x4007da8e => 'HF R16/R17/R18/R100/R106', # (LEGRIA/VIXIA)
+    0x4007da8f => 'HF M31/M36/M300', # (LEGRIA/VIXIA, probably also HF M30)
+    0x4007da90 => 'HF S20/S21/S200', # (LEGRIA/VIXIA)
+    0x4007da92 => 'FS36/FS37/FS305/FS306/FS307',
+    # NOTE: some pre-production models may have a model name of
+    # "Canon EOS Kxxx", where "xxx" is the last 3 digits of the model ID below.
+    # This has been observed for the 1DSmkIII/K215 and 400D/K236.
+    0x80000001 => 'EOS-1D',
+    0x80000167 => 'EOS-1DS',
+    0x80000168 => 'EOS 10D',
+    0x80000169 => 'EOS-1D Mark III',
+    0x80000170 => 'EOS Digital Rebel / 300D / Kiss Digital',
+    0x80000174 => 'EOS-1D Mark II',
+    0x80000175 => 'EOS 20D',
+    0x80000176 => 'EOS Digital Rebel XSi / 450D / Kiss X2',
+    0x80000188 => 'EOS-1Ds Mark II',
+    0x80000189 => 'EOS Digital Rebel XT / 350D / Kiss Digital N',
+    0x80000190 => 'EOS 40D',
+    0x80000213 => 'EOS 5D',
+    0x80000215 => 'EOS-1Ds Mark III',
+    0x80000218 => 'EOS 5D Mark II',
+    0x80000232 => 'EOS-1D Mark II N',
+    0x80000234 => 'EOS 30D',
+    0x80000236 => 'EOS Digital Rebel XTi / 400D / Kiss Digital X', # and K236
+    0x80000250 => 'EOS 7D',
+    0x80000252 => 'EOS Rebel T1i / 500D / Kiss X3',
+    0x80000254 => 'EOS Rebel XS / 1000D / Kiss F',
+    0x80000261 => 'EOS 50D',
+    0x80000270 => 'EOS Rebel T2i / 550D / Kiss X4',
+    0x80000281 => 'EOS-1D Mark IV',
+    0x80000286 => 'EOS Rebel T3i / 600D / Kiss X5',
+    0x80000287 => 'EOS 60D',
+    0x80000288 => 'EOS Rebel T3 / 1100D / Kiss X50',
+);
+
+my %canonQuality = (
+    1 => 'Economy',
+    2 => 'Normal',
+    3 => 'Fine',
+    4 => 'RAW',
+    5 => 'Superfine',
+    130 => 'Normal Movie', #22
+);
+my %canonImageSize = (
+    0 => 'Large',
+    1 => 'Medium',
+    2 => 'Small',
+    5 => 'Medium 1', #PH
+    6 => 'Medium 2', #PH
+    7 => 'Medium 3', #PH
+    8 => 'Postcard', #PH (SD200 1600x1200 with DateStamp option)
+    9 => 'Widescreen', #PH (SD900 3648x2048), 22 (HFS200 3264x1840)
+    10 => 'Medium Widescreen', #22 (HFS200 1920x1080)
+    14 => 'Small 1', #PH
+    15 => 'Small 2', #PH
+    16 => 'Small 3', #PH
+    128 => '640x480 Movie', #PH (7D 60fps)
+    129 => 'Medium Movie', #22
+    130 => 'Small Movie', #22
+    137 => '1280x720 Movie', #PH (S95 24fps; D60 50fps)
+    142 => '1920x1080 Movie', #PH (D60 25fps)
+);
+my %canonWhiteBalance = (
+    # -1='Click", -2='Pasted' ?? - PH
+    0 => 'Auto',
+    1 => 'Daylight',
+    2 => 'Cloudy',
+    3 => 'Tungsten',
+    4 => 'Fluorescent',
+    5 => 'Flash',
+    6 => 'Custom',
+    7 => 'Black & White',
+    8 => 'Shade',
+    9 => 'Manual Temperature (Kelvin)',
+    10 => 'PC Set1', #PH
+    11 => 'PC Set2', #PH
+    12 => 'PC Set3', #PH
+    14 => 'Daylight Fluorescent', #3
+    15 => 'Custom 1', #PH
+    16 => 'Custom 2', #PH
+    17 => 'Underwater', #3
+    18 => 'Custom 3', #PH
+    19 => 'Custom 4', #PH
+    20 => 'PC Set4', #PH
+    21 => 'PC Set5', #PH
+    # 22 - Custom 2?
+    # 23 - Custom 3?
+    # 30 - Click White Balance?
+    # 31 - Shot Settings?
+    # 137 - Tungsten?
+    # 138 - White Fluorescent?
+    # 139 - Fluorescent H?
+    # 140 - Manual?
+);
+
+# picture styles used by the 5D
+# (styles 0x4X may be downloaded from Canon)
+# (called "ColorMatrix" in 1D owner manual)
+my %pictureStyles = ( #12
+    0x00 => 'None', #PH
+    0x01 => 'Standard', #15
+    0x02 => 'Portrait', #15
+    0x03 => 'High Saturation', #15
+    0x04 => 'Adobe RGB', #15
+    0x05 => 'Low Saturation', #15
+    0x06 => 'CM Set 1', #PH
+    0x07 => 'CM Set 2', #PH
+    # "ColorMatrix" values end here
+    0x21 => 'User Def. 1',
+    0x22 => 'User Def. 2',
+    0x23 => 'User Def. 3',
+    # "External" styles currently available from Canon are Nostalgia, Clear,
+    # Twilight and Emerald.  The "User Def" styles change to these "External"
+    # codes when these styles are installed in the camera
+    0x41 => 'PC 1', #PH
+    0x42 => 'PC 2', #PH
+    0x43 => 'PC 3', #PH
+    0x81 => 'Standard',
+    0x82 => 'Portrait',
+    0x83 => 'Landscape',
+    0x84 => 'Neutral',
+    0x85 => 'Faithful',
+    0x86 => 'Monochrome',
+    0x87 => 'Auto', #PH
+);
+my %userDefStyles = ( #12/48
+    Notes => q{
+        Base style for user-defined picture styles.  PC values represent external
+        picture styles which may be downloaded from Canon and installed in the
+        camera.
+    },
+    0x41 => 'PC 1',
+    0x42 => 'PC 2',
+    0x43 => 'PC 3',
+    0x81 => 'Standard',
+    0x82 => 'Portrait',
+    0x83 => 'Landscape',
+    0x84 => 'Neutral',
+    0x85 => 'Faithful',
+    0x86 => 'Monochrome',
+);
+
+# picture style tag information for CameraInfo550D
+my %psConv = (
+    -559038737 => 'n/a', # = 0xdeadbeef ! LOL
+    OTHER => sub { return shift },
+);
+my %psInfo = (
+    Format => 'int32s',
+    PrintHex => 1,
+    PrintConv => \%psConv,
+);
+
+# ValueConv that makes long values binary type
+my %longBin = (
+    ValueConv => 'length($val) > 64 ? \$val : $val',
+    ValueConvInv => '$val',
+);
+
+# conversions, etc for CameraColorCalibration tags
+my %cameraColorCalibration = (
+    Format => 'int16s[4]',
+    Unknown => 1,
+    PrintConv => 'sprintf("%4d %4d %4d (%dK)", split(" ",$val))',
+    PrintConvInv => '$val=~s/\s+/ /g; $val=~tr/()K//d; $val',
+);
+
+# conversions, etc for PowerShot CameraColorCalibration tags
+my %cameraColorCalibration2 = (
+    Format => 'int16s[5]',
+    Unknown => 1,
+    PrintConv => 'sprintf("%4d %4d %4d %4d (%dK)", split(" ",$val))',
+    PrintConvInv => '$val=~s/\s+/ /g; $val=~tr/()K//d; $val',
+);
+# conversions, etc for byte-swapped FocusDistance tags
+my %focusDistanceByteSwap = (
+    # this is very odd (little-endian number on odd boundary),
+    # but it does seem to work better with my sample images - PH
+    Format => 'int16uRev',
+    ValueConv => '$val / 100',
+    ValueConvInv => '$val * 100',
+    PrintConv => '$val > 655.345 ? "inf" : "$val m"',
+    PrintConvInv => '$val =~ s/ ?m$//; IsFloat($val) ? $val : 655.35',
+);
+
+# common attributes for writable BinaryData directories
+my %binaryDataAttrs = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+);
+
+#------------------------------------------------------------------------------
+# Canon EXIF Maker Notes
+%Image::ExifTool::Canon::Main = (
+    WRITE_PROC => \&WriteCanon,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0x1 => {
+        Name => 'CanonCameraSettings',
+        SubDirectory => {
+            Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+            TagTable => 'Image::ExifTool::Canon::CameraSettings',
+        },
+    },
+    0x2 => {
+        Name => 'CanonFocalLength',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Canon::FocalLength',
+        },
+    },
+    0x3 => {
+        Name => 'CanonFlashInfo',
+        Unknown => 1,
+    },
+    0x4 => {
+        Name => 'CanonShotInfo',
+        SubDirectory => {
+            Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+            TagTable => 'Image::ExifTool::Canon::ShotInfo',
+        },
+    },
+    0x5 => {
+        Name => 'CanonPanorama',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Canon::Panorama',
+        },
+    },
+    0x6 => {
+        Name => 'CanonImageType',
+        Writable => 'string',
+        Groups => { 2 => 'Image' },
+    },
+    0x7 => {
+        Name => 'CanonFirmwareVersion',
+        Writable => 'string',
+    },
+    0x8 => {
+        Name => 'FileNumber',
+        Writable => 'int32u',
+        Groups => { 2 => 'Image' },
+        PrintConv => '$_=$val,s/(\d+)(\d{4})/$1-$2/,$_',
+        PrintConvInv => '$val=~s/-//g;$val',
+    },
+    0x9 => {
+        Name => 'OwnerName',
+        Writable => 'string',
+        # pad to 32 bytes (including null terminator which will be added)
+        # to avoid bug which crashes DPP if length is 4 bytes
+        ValueConvInv => '$val .= "\0" x (31 - length $val) if length $val < 31; $val',
+    },
+    0xa => {
+        Name => 'UnknownD30',
+        SubDirectory => {
+            Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+            TagTable => 'Image::ExifTool::Canon::UnknownD30',
+        },
+    },
+    0xc => [   # square brackets for a conditional list
+        {
+            # D30
+            Name => 'SerialNumber',
+            Condition => '$$self{Model} =~ /EOS D30\b/',
+            Writable => 'int32u',
+            PrintConv => 'sprintf("%.4x%.5d",$val>>16,$val&0xffff)',
+            PrintConvInv => '$val=~/(.*)-?(\d{5})$/ ? (hex($1)<<16)+$2 : undef',
+        },
+        {
+            # serial number of 1D/1Ds/1D Mark II/1Ds Mark II is usually
+            # displayed w/o leeding zeros (ref 7) (1D uses 6 digits - PH)
+            Name => 'SerialNumber',
+            Condition => '$$self{Model} =~ /EOS-1D/',
+            Writable => 'int32u',
+            PrintConv => 'sprintf("%.6u",$val)',
+            PrintConvInv => '$val',
+        },
+        {
+            # all other models (D60,300D,350D,REBEL,10D,20D,etc)
+            Name => 'SerialNumber',
+            Writable => 'int32u',
+            PrintConv => 'sprintf("%.10u",$val)',
+            PrintConvInv => '$val',
+        },
+    ],
+    0xd => [
+        {
+            Name => 'CanonCameraInfo1D',
+            # (save size of this record as "CameraInfoCount" for later tests)
+            Condition => '($$self{CameraInfoCount} = $count) and $$self{Model} =~ /\b1DS?$/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Canon::CameraInfo1D',
+            },
+        },
+        {
+            Name => 'CanonCameraInfo1DmkII',
+            Condition => '$$self{Model} =~ /\b1Ds? Mark II$/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Canon::CameraInfo1DmkII',
+            },
+        },
+        {
+            Name => 'CanonCameraInfo1DmkIIN',
+            Condition => '$$self{Model} =~ /\b1Ds? Mark II N$/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Canon::CameraInfo1DmkIIN',
+            },
+        },
+        {
+            Name => 'CanonCameraInfo1DmkIII',
+            Condition => '$$self{Model} =~ /\b1Ds? Mark III$/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Canon::CameraInfo1DmkIII',
+            },
+        },
+        {
+            Name => 'CanonCameraInfo1DmkIV',
+            Condition => '$$self{Model} =~ /\b1D Mark IV$/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Canon::CameraInfo1DmkIV',
+            },
+        },
+        {
+            Name => 'CanonCameraInfo5D',
+            Condition => '$$self{Model} =~ /EOS 5D$/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Canon::CameraInfo5D',
+            },
+        },
+        {
+            Name => 'CanonCameraInfo5DmkII',
+            Condition => '$$self{Model} =~ /EOS 5D Mark II$/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Canon::CameraInfo5DmkII',
+            },
+        },
+        {
+            Name => 'CanonCameraInfo7D',
+            Condition => '$$self{Model} =~ /EOS 7D$/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Canon::CameraInfo7D',
+            },
+        },
+        {
+            Name => 'CanonCameraInfo40D',
+            Condition => '$$self{Model} =~ /EOS 40D$/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Canon::CameraInfo40D',
+            },
+        },
+        {
+            Name => 'CanonCameraInfo50D',
+            Condition => '$$self{Model} =~ /EOS 50D$/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Canon::CameraInfo50D',
+            },
+        },
+        {
+            Name => 'CanonCameraInfo60D',
+            Condition => '$$self{Model} =~ /EOS 60D$/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Canon::CameraInfo60D',
+            },
+        },
+        {
+            Name => 'CanonCameraInfo450D',
+            Condition => '$$self{Model} =~ /\b(450D|REBEL XSi|Kiss X2)\b/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Canon::CameraInfo450D',
+            },
+        },
+        {
+            Name => 'CanonCameraInfo500D',
+            Condition => '$$self{Model} =~ /\b(500D|REBEL T1i|Kiss X3)\b/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Canon::CameraInfo500D',
+            },
+        },
+        {
+            Name => 'CanonCameraInfo550D',
+            Condition => '$$self{Model} =~ /\b(550D|REBEL T2i|Kiss X4)\b/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Canon::CameraInfo550D',
+            },
+        },
+        {
+            Name => 'CanonCameraInfo1000D',
+            Condition => '$$self{Model} =~ /\b(1000D|REBEL XS|Kiss F)\b/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Canon::CameraInfo1000D',
+            },
+        },
+        {
+            Name => 'CanonCameraInfoPowerShot',
+            # valid if format is int32u[138] or int32u[148]
+            Condition => '$format eq "int32u" and ($count == 138 or $count == 148)',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Canon::CameraInfoPowerShot',
+            },
+        },
+        {
+            Name => 'CanonCameraInfoPowerShot2',
+            # valid if format is int32u[162], int32u[167], int32u[171] or int32u[264]
+            Condition => q{
+                $format eq "int32u" and ($count == 156 or $count == 162 or
+                $count == 167 or $count == 171 or $count == 264)
+            },
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Canon::CameraInfoPowerShot2',
+            },
+        },
+        {
+            Name => 'CanonCameraInfoUnknown32',
+            Condition => '$format =~ /^int32/',
+            # (counts of 72, 85, 86, 93, 94, 96, 104) - PH
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Canon::CameraInfoUnknown32',
+            },
+        },
+        {
+            Name => 'CanonCameraInfoUnknown16',
+            Condition => '$format =~ /^int16/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Canon::CameraInfoUnknown16',
+            },
+        },
+        {
+            Name => 'CanonCameraInfoUnknown',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Canon::CameraInfoUnknown',
+            },
+        },
+    ],
+    0xe => {
+        Name => 'CanonFileLength',
+        Writable => 'int32u',
+        Groups => { 2 => 'Image' },
+    },
+    0xf => [
+        {   # used by 1DmkII, 1DSmkII and 1DmkIIN
+            Name => 'CustomFunctions1D',
+            Condition => '$$self{Model} =~ /EOS-1D/',
+            SubDirectory => {
+                Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+                TagTable => 'Image::ExifTool::CanonCustom::Functions1D',
+            },
+        },
+        {
+            Name => 'CustomFunctions5D',
+            Condition => '$$self{Model} =~ /EOS 5D/',
+            SubDirectory => {
+                Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+                TagTable => 'Image::ExifTool::CanonCustom::Functions5D',
+            },
+        },
+        {
+            Name => 'CustomFunctions10D',
+            Condition => '$$self{Model} =~ /EOS 10D/',
+            SubDirectory => {
+                Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+                TagTable => 'Image::ExifTool::CanonCustom::Functions10D',
+            },
+        },
+        {
+            Name => 'CustomFunctions20D',
+            Condition => '$$self{Model} =~ /EOS 20D/',
+            SubDirectory => {
+                Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+                TagTable => 'Image::ExifTool::CanonCustom::Functions20D',
+            },
+        },
+        {
+            Name => 'CustomFunctions30D',
+            Condition => '$$self{Model} =~ /EOS 30D/',
+            SubDirectory => {
+                Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+                TagTable => 'Image::ExifTool::CanonCustom::Functions30D',
+            },
+        },
+        {
+            Name => 'CustomFunctions350D',
+            Condition => '$$self{Model} =~ /\b(350D|REBEL XT|Kiss Digital N)\b/',
+            SubDirectory => {
+                Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+                TagTable => 'Image::ExifTool::CanonCustom::Functions350D',
+            },
+        },
+        {
+            Name => 'CustomFunctions400D',
+            Condition => '$$self{Model} =~ /\b(400D|REBEL XTi|Kiss Digital X|K236)\b/',
+            SubDirectory => {
+                Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+                TagTable => 'Image::ExifTool::CanonCustom::Functions400D',
+            },
+        },
+        {
+            Name => 'CustomFunctionsD30',
+            Condition => '$$self{Model} =~ /EOS D30\b/',
+            SubDirectory => {
+                Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+                TagTable => 'Image::ExifTool::CanonCustom::FunctionsD30',
+            },
+        },
+        {
+            Name => 'CustomFunctionsD60',
+            Condition => '$$self{Model} =~ /EOS D60\b/',
+            SubDirectory => {
+                # the stored size in the D60 apparently doesn't include the size word:
+                Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size-2,$size)',
+                # (D60 custom functions are basically the same as D30)
+                TagTable => 'Image::ExifTool::CanonCustom::FunctionsD30',
+            },
+        },
+        {
+            Name => 'CustomFunctionsUnknown',
+            SubDirectory => {
+                Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+                TagTable => 'Image::ExifTool::CanonCustom::FuncsUnknown',
+            },
+        },
+    ],
+    0x10 => { #PH
+        Name => 'CanonModelID',
+        Writable => 'int32u',
+        PrintHex => 1,
+        SeparateTable => 1,
+        PrintConv => \%canonModelID,
+    },
+    0x11 => { #PH
+        Name => 'MovieInfo',
+        SubDirectory => {
+            Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+            TagTable => 'Image::ExifTool::Canon::MovieInfo',
+        },
+    },
+    0x12 => {
+        Name => 'CanonAFInfo',
+        # not really a condition -- just need to store the count for later
+        Condition => '$$self{AFInfoCount} = $count',
+        SubDirectory => {
+            # this record does not begin with a length word, so it
+            # has to be validated differently
+            Validate => 'Image::ExifTool::Canon::ValidateAFInfo($dirData,$subdirStart,$size)',
+            TagTable => 'Image::ExifTool::Canon::AFInfo',
+        },
+    },
+    0x13 => { #PH
+        Name => 'ThumbnailImageValidArea',
+        # left,right,top,bottom edges of image in thumbnail, or all zeros for full frame
+        Notes => 'all zeros for full frame',
+        Writable => 'int16u',
+        Count => 4,
+    },
+    0x15 => { #PH
+        # display format for serial number
+        Name => 'SerialNumberFormat',
+        Writable => 'int32u',
+        PrintHex => 1,
+        PrintConv => {
+            0x90000000 => 'Format 1',
+            0xa0000000 => 'Format 2',
+        },
+    },
+    0x1a => { #15
+        Name => 'SuperMacro',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'On (1)',
+            2 => 'On (2)',
+        },
+    },
+    0x1c => { #PH (A570IS)
+        Name => 'DateStampMode',
+        Writable => 'int16u',
+        Notes => 'used only in postcard mode',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Date',
+            2 => 'Date & Time',
+        },
+    },
+    0x1d => { #PH
+        Name => 'MyColors',
+        SubDirectory => {
+            Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+            TagTable => 'Image::ExifTool::Canon::MyColors',
+        },
+    },
+    0x1e => { #PH
+        Name => 'FirmwareRevision',
+        Writable => 'int32u',
+        # as a hex number: 0xAVVVRR00, where (a bit of guessing here...)
+        #  A = 'a' for alpha, 'b' for beta?
+        #  V = version? (100,101 for normal releases, 100,110,120,130,170 for alpha/beta)
+        #  R = revision? (01-07, except 00 for alpha/beta releases)
+        PrintConv => q{
+            my $rev = sprintf("%.8x", $val);
+            my ($rel, $v1, $v2, $r1, $r2) = ($rev =~ /^(.)(.)(..)0?(.+)(..)$/);
+            my %r = ( a => 'Alpha ', b => 'Beta ', '0' => '' );
+            $rel = defined $r{$rel} ? $r{$rel} : "Unknown($rel) ";
+            return "$rel$v1.$v2 rev $r1.$r2",
+        },
+        PrintConvInv => q{
+            $_=$val; s/Alpha ?/a/i; s/Beta ?/b/i;
+            s/Unknown ?\((.)\)/$1/i; s/ ?rev ?(.)\./0$1/; s/ ?rev ?//;
+            tr/a-fA-F0-9//dc; return hex $_;
+        },
+    },
+    # 0x1f - used for red-eye-corrected images - PH (A570IS)
+    # 0x22 - values 1 and 2 are 2 and 1 for flash pics, 0 otherwise - PH (A570IS)
+    0x23 => { #31
+        Name => 'Categories',
+        Writable => 'int32u',
+        Format => 'int32u', # (necessary to perform conversion for Condition)
+        Notes => '2 values: 1. always 8, 2. Categories',
+        Count => '2',
+        Condition => '$$valPt =~ /^\x08\0\0\0/',
+        ValueConv => '$val =~ s/^8 //; $val',
+        ValueConvInv => '"8 $val"',
+        PrintConvColumns => 2,
+        PrintConv => { BITMASK => {
+            0 => 'People',
+            1 => 'Scenery',
+            2 => 'Events',
+            3 => 'User 1',
+            4 => 'User 2',
+            5 => 'User 3',
+            6 => 'To Do',
+        } },
+    },
+    0x24 => { #PH
+        Name => 'FaceDetect1',
+        SubDirectory => {
+            Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+            TagTable => 'Image::ExifTool::Canon::FaceDetect1',
+        },
+    },
+    0x25 => { #PH
+        Name => 'FaceDetect2',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Canon::FaceDetect2',
+        },
+    },
+    0x26 => { #PH (A570IS,1DmkIII)
+        Name => 'CanonAFInfo2',
+        Condition => '$$valPt !~ /^\0\0\0\0/', # (data may be all zeros in thumbnail of 60D MOV video)
+        SubDirectory => {
+            Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+            TagTable => 'Image::ExifTool::Canon::AFInfo2',
+        },
+    },
+    # 0x27 - value 1 is 1 for high ISO pictures, 0 otherwise
+    #        value 4 is 9 for Flexizone and FaceDetect AF, 1 for Centre AF, 0 otherwise (SX10IS)
+    0x28 => { #JD
+        # bytes 0-1=sequence number (encrypted), 2-5=date/time (encrypted) (ref JD)
+        Name => 'ImageUniqueID',
+        Format => 'undef',
+        Writable => 'int8u',
+        Groups => { 2 => 'Image' },
+        RawConv => '$val eq "\0" x 16 ? undef : $val',
+        ValueConv => 'unpack("H*", $val)',
+        ValueConvInv => 'pack("H*", $val)',
+    },
+    # 0x2d - changes with categories (ref 31)
+    # 0x44 - ShootInfo
+    # 0x62 - UserSetting
+    0x81 => { #13
+        Name => 'RawDataOffset',
+        # (can't yet write 1D raw files)
+        # Writable => 'int32u',
+        # Protected => 2,
+    },
+    0x83 => { #PH
+        Name => 'OriginalDecisionDataOffset',
+        Writable => 'int32u',
+        OffsetPair => 1, # (just used as a flag, since this tag has no pair)
+        # this is an offset to the original decision data block
+        # (offset relative to start of file in JPEG images, but NOT DNG images!)
+        IsOffset => '$val and $$exifTool{FILE_TYPE} ne "JPEG"',
+        Protected => 2,
+        DataTag => 'OriginalDecisionData',
+    },
+    0x90 => {   # used by 1D and 1Ds
+        Name => 'CustomFunctions1D',
+        SubDirectory => {
+            Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+            TagTable => 'Image::ExifTool::CanonCustom::Functions1D',
+        },
+    },
+    0x91 => { #PH
+        Name => 'PersonalFunctions',
+        SubDirectory => {
+            Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+            TagTable => 'Image::ExifTool::CanonCustom::PersonalFuncs',
+        },
+    },
+    0x92 => { #PH
+        Name => 'PersonalFunctionValues',
+        SubDirectory => {
+            Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+            TagTable => 'Image::ExifTool::CanonCustom::PersonalFuncValues',
+        },
+    },
+    0x93 => {
+        Name => 'CanonFileInfo', # (ShootInfoEx)
+        SubDirectory => {
+            Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+            TagTable => 'Image::ExifTool::Canon::FileInfo',
+        },
+    },
+    0x94 => { #PH
+        # AF points for 1D (45 points in 5 rows)
+        Name => 'AFPointsInFocus1D',
+        Notes => 'EOS 1D -- 5 rows: A1-7, B1-10, C1-11, D1-10, E1-7, center point is C6',
+        PrintConv => 'Image::ExifTool::Canon::PrintAFPoints1D($val)',
+    },
+    0x95 => { #PH (observed in 5D sample image)
+        Name => 'LensModel',
+        Writable => 'string',
+    },
+    0x96 => [ #PH
+        {
+            Name => 'SerialInfo',
+            Condition => '$$self{Model} =~ /EOS 5D/',
+            SubDirectory => { TagTable => 'Image::ExifTool::Canon::SerialInfo' },
+        },
+        {
+            Name => 'InternalSerialNumber',
+            Writable => 'string',
+            # remove trailing 0xff's if they exist (Kiss X3)
+            ValueConv => '$val=~s/\xff+$//; $val',
+            ValueConvInv => '$val',
+        },
+    ],
+    0x97 => { #PH
+        Name => 'DustRemovalData',
+        # some interesting stuff is stored in here, like LensType and InternalSerialNumber...
+        Writable => 'undef',
+        Flags => [ 'Binary', 'Protected' ],
+    },
+    0x98 => { #PH
+        Name => 'CropInfo',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Canon::CropInfo',
+        },
+    },
+    0x99 => { #PH (EOS 1D Mark III, 40D, etc)
+        Name => 'CustomFunctions2',
+        SubDirectory => {
+            Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+            TagTable => 'Image::ExifTool::CanonCustom::Functions2',
+        },
+    },
+    0x9a => { #PH
+        Name => 'AspectInfo',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Canon::AspectInfo',
+        },
+    },
+    0xa0 => {
+        Name => 'ProcessingInfo',
+        SubDirectory => {
+            Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+            TagTable => 'Image::ExifTool::Canon::Processing',
+        },
+    },
+    0xa1 => { Name => 'ToneCurveTable', %longBin }, #PH
+    0xa2 => { Name => 'SharpnessTable', %longBin }, #PH
+    0xa3 => { Name => 'SharpnessFreqTable', %longBin }, #PH
+    0xa4 => { Name => 'WhiteBalanceTable', %longBin }, #PH
+    0xa9 => {
+        Name => 'ColorBalance',
+        SubDirectory => {
+            # this offset is necessary because the table is interpreted as short rationals
+            # (4 bytes long) but the first entry is 2 bytes into the table.
+            Start => '$valuePtr + 2',
+            Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart-2,$size+2)',
+            TagTable => 'Image::ExifTool::Canon::ColorBalance',
+        },
+    },
+    0xaa => {
+        Name => 'MeasuredColor',
+        SubDirectory => {
+            Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+            TagTable => 'Image::ExifTool::Canon::MeasuredColor',
+        },
+    },
+    0xae => {
+        Name => 'ColorTemperature',
+        Writable => 'int16u',
+    },
+    0xb0 => { #PH
+        Name => 'CanonFlags',
+        SubDirectory => {
+            Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+            TagTable => 'Image::ExifTool::Canon::Flags',
+        },
+    },
+    0xb1 => { #PH
+        Name => 'ModifiedInfo',
+        SubDirectory => {
+            Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+            TagTable => 'Image::ExifTool::Canon::ModifiedInfo',
+        },
+    },
+    0xb2 => { Name => 'ToneCurveMatching', %longBin }, #PH
+    0xb3 => { Name => 'WhiteBalanceMatching', %longBin }, #PH
+    0xb4 => { #PH
+        Name => 'ColorSpace',
+        Writable => 'int16u',
+        PrintConv => {
+            1 => 'sRGB',
+            2 => 'Adobe RGB',
+        },
+    },
+    0xb6 => {
+        Name => 'PreviewImageInfo',
+        SubDirectory => {
+            # Note: the first word of this block gives the correct block size in bytes, but
+            # the size is wrong by a factor of 2 in the IFD, so we must account for this
+            Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size/2)',
+            TagTable => 'Image::ExifTool::Canon::PreviewImageInfo',
+        },
+    },
+    0xd0 => { #PH
+        Name => 'VRDOffset',
+        Writable => 'int32u',
+        OffsetPair => 1, # (just used as a flag, since this tag has no pair)
+        Protected => 2,
+        DataTag => 'CanonVRD',
+        Notes => 'offset of VRD "recipe data" if it exists',
+    },
+    0xe0 => { #12
+        Name => 'SensorInfo',
+        SubDirectory => {
+            Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+            TagTable => 'Image::ExifTool::Canon::SensorInfo',
+        },
+    },
+    0x4001 => [ #13
+        {   # (int16u[582]) - 20D and 350D
+            Condition => '$count == 582',
+            Name => 'ColorData1',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Canon::ColorData1',
+            },
+        },
+        {   # (int16u[653]) - 1DmkII and 1DSmkII
+            Condition => '$count == 653',
+            Name => 'ColorData2',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Canon::ColorData2',
+            },
+        },
+        {   # (int16u[796]) - 1DmkIIN, 5D, 30D, 400D
+            Condition => '$count == 796',
+            Name => 'ColorData3',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Canon::ColorData3',
+            },
+        },
+        {   # (int16u[692|674|702|1227|1250|1251|1337])
+            # 40D (692), 1DmkIII (674), 1DSmkIII (702), 450D/1000D (1227)
+            # 50D/5DmkII (1250), 500D/7D_pre-prod/1DmkIV_pre-prod (1251),
+            # 1DmkIV/7D/550D_pre-prod (1337), 550D (1338), 1100D (1346)
+            Condition => q{
+                $count == 692  or $count == 674  or $count == 702 or
+                $count == 1227 or $count == 1250 or $count == 1251 or
+                $count == 1337 or $count == 1338 or $count == 1346
+            },
+            Name => 'ColorData4',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Canon::ColorData4',
+            },
+        },
+        {   # (int16u[5120]) - G10
+            Condition => '$count == 5120',
+            Name => 'ColorData5',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Canon::ColorData5',
+            },
+        },
+        {   # (int16u[1273]) - 600D
+            Condition => '$count == 1273',
+            Name => 'ColorData6',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Canon::ColorData6',
+            },
+        },
+        {
+            Name => 'ColorDataUnknown',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Canon::ColorDataUnknown',
+            },
+        },
+    ],
+    0x4002 => { #PH
+        # unknown data block in some JPEG and CR2 images
+        # (5kB for most models, but 22kb for 5D and 30D)
+        Name => 'CRWParam',
+        Format => 'undef',
+        Flags => [ 'Unknown', 'Binary' ],
+    },
+    0x4003 => { #PH
+        Name => 'ColorInfo',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Canon::ColorInfo',
+        },
+    },
+    0x4005 => { #PH
+        Name => 'Flavor',
+        Notes => 'unknown 49kB block, not copied to JPEG images',
+        # 'Drop' because not found in JPEG images (too large for APP1 anyway)
+        Flags => [ 'Unknown', 'Binary', 'Drop' ],
+    },
+    0x4008 => { #PH guess (1DmkIII)
+        Name => 'BlackLevel', # (BasePictStyleOfUser)
+        Unknown => 1,
+    },
+    0x4010 => { #http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,2933.0.html
+        Name => 'CustomPictureStyleFileName',
+        Writable => 'string',
+    },
+    0x4013 => { #PH
+        Name => 'AFMicroAdj',
+        SubDirectory => {
+            Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+            TagTable => 'Image::ExifTool::Canon::AFMicroAdj',
+        },
+    },
+    0x4015 => {
+        Name => 'VignettingCorr',
+        Condition => '$$valPt !~ /^\0\0\0\0/', # (data may be all zeros for 60D)
+        SubDirectory => {
+            # (the size word is at byte 2 in this structure)
+            Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart+2,$size)',
+            TagTable => 'Image::ExifTool::Canon::VignettingCorr',
+        },
+    },
+    0x4016 => {
+        Name => 'VignettingCorr2',
+        SubDirectory => {
+            # (the size word is actually 4 bytes, but it doesn't matter if little-endian)
+            Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+            TagTable => 'Image::ExifTool::Canon::VignettingCorr2',
+        },
+    },
+    0x4018 => { #PH
+        Name => 'LightingOpt',
+        SubDirectory => {
+            Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+            TagTable => 'Image::ExifTool::Canon::LightingOpt',
+        }
+    },
+    0x4019 => { #20
+        Name => 'LensInfo',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Canon::LensInfo',
+        }
+    },
+    0x4020 => { #PH
+        Name => 'AmbienceInfo',
+        Condition => '$$valPt !~ /^\0\0\0\0/', # (data may be all zeros for 60D)
+        SubDirectory => {
+            Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+            TagTable => 'Image::ExifTool::Canon::Ambience',
+        }
+    },
+    0x4024 => { #PH
+        Name => 'FilterInfo',
+        SubDirectory => {
+            Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+            TagTable => 'Image::ExifTool::Canon::FilterInfo',
+        }
+    },
+);
+
+#..............................................................................
+# Canon camera settings (MakerNotes tag 0x01)
+# BinaryData (keys are indices into the int16s array)
+%Image::ExifTool::Canon::CameraSettings = (
+    %binaryDataAttrs,
+    FORMAT => 'int16s',
+    FIRST_ENTRY => 1,
+    DATAMEMBER => [ 22, 25 ],   # necessary for writing
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    1 => {
+        Name => 'MacroMode',
+        PrintConv => {
+            1 => 'Macro',
+            2 => 'Normal',
+        },
+    },
+    2 => {
+        Name => 'SelfTimer',
+        # Custom timer mode if bit 0x4000 is set - PH (A570IS)
+        PrintConv => q{
+            return 'Off' unless $val;
+            return (($val&0xfff) / 10) . ' s' . ($val & 0x4000 ? ', Custom' : '');
+        },
+        PrintConvInv => q{
+            return 0 if $val =~ /^Off/i;
+            $val =~ s/\s*s(ec)?\b//i;
+            $val =~ s/,?\s*Custom$//i ? ($val*10) | 0x4000 : $val*10;
+        },
+    },
+    3 => {
+        Name => 'Quality',
+        PrintConv => \%canonQuality,
+    },
+    4 => {
+        Name => 'CanonFlashMode',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Auto',
+            2 => 'On',
+            3 => 'Red-eye reduction',
+            4 => 'Slow-sync',
+            5 => 'Red-eye reduction (Auto)',
+            6 => 'Red-eye reduction (On)',
+            16 => 'External flash', # not set in D30 or 300D
+        },
+    },
+    5 => {
+        Name => 'ContinuousDrive',
+        PrintConv => {
+            0 => 'Single',
+            1 => 'Continuous',
+            2 => 'Movie', #PH
+            3 => 'Continuous, Speed Priority', #PH
+            4 => 'Continuous, Low', #PH
+            5 => 'Continuous, High', #PH
+            6 => 'Silent Single', #PH
+            # 32-34 - Self-timer?
+        },
+    },
+    7 => {
+        Name => 'FocusMode',
+        PrintConv => {
+            0 => 'One-shot AF',
+            1 => 'AI Servo AF',
+            2 => 'AI Focus AF',
+            3 => 'Manual Focus (3)',
+            4 => 'Single',
+            5 => 'Continuous',
+            6 => 'Manual Focus (6)',
+           16 => 'Pan Focus', #PH
+           # 137 - Single?
+        },
+    },
+    9 => { #PH
+        Name => 'RecordMode',
+        RawConv => '$val==-1 ? undef : $val', #22
+        PrintConv => {
+            1 => 'JPEG',
+            2 => 'CRW+THM', # (300D,etc)
+            3 => 'AVI+THM', # (30D)
+            4 => 'TIF', # +THM? (1Ds) (unconfirmed)
+            5 => 'TIF+JPEG', # (1D) (unconfirmed)
+            6 => 'CR2', # +THM? (1D,30D,350D)
+            7 => 'CR2+JPEG', # (S30)
+            9 => 'Video', # (S95 MOV)
+        },
+    },
+    10 => {
+        Name => 'CanonImageSize',
+        PrintConvColumns => 2,
+        PrintConv => \%canonImageSize,
+    },
+    11 => {
+        Name => 'EasyMode',
+        PrintConvColumns => 3,
+        PrintConv => {
+            0 => 'Full auto',
+            1 => 'Manual',
+            2 => 'Landscape',
+            3 => 'Fast shutter',
+            4 => 'Slow shutter',
+            5 => 'Night',
+            6 => 'Gray Scale', #PH
+            7 => 'Sepia',
+            8 => 'Portrait',
+            9 => 'Sports',
+            10 => 'Macro',
+            11 => 'Black & White', #PH
+            12 => 'Pan focus',
+            13 => 'Vivid', #PH
+            14 => 'Neutral', #PH
+            15 => 'Flash Off',  #8
+            16 => 'Long Shutter', #PH
+            17 => 'Super Macro', #PH
+            18 => 'Foliage', #PH
+            19 => 'Indoor', #PH
+            20 => 'Fireworks', #PH
+            21 => 'Beach', #PH
+            22 => 'Underwater', #PH
+            23 => 'Snow', #PH
+            24 => 'Kids & Pets', #PH
+            25 => 'Night Snapshot', #PH
+            26 => 'Digital Macro', #PH
+            27 => 'My Colors', #PH
+            28 => 'Movie Snap', #PH
+            29 => 'Super Macro 2', #PH
+            30 => 'Color Accent', #18
+            31 => 'Color Swap', #18
+            32 => 'Aquarium', #18
+            33 => 'ISO 3200', #18
+            34 => 'ISO 6400', #PH
+            35 => 'Creative Light Effect', #PH
+            36 => 'Easy', #PH
+            37 => 'Quick Shot', #PH
+            38 => 'Creative Auto', #39
+            39 => 'Zoom Blur', #PH
+            40 => 'Low Light', #PH
+            41 => 'Nostalgic', #PH
+            42 => 'Super Vivid', #PH (SD4500)
+            43 => 'Poster Effect', #PH (SD4500)
+            44 => 'Face Self-timer', #PH
+            45 => 'Smile', #PH
+            46 => 'Wink Self-timer', #PH
+            47 => 'Fisheye Effect', #PH (SX30IS)
+            48 => 'Miniature Effect', #PH (SD4500)
+            49 => 'High-speed Burst', #PH
+            50 => 'Best Image Selection', #PH
+            51 => 'High Dynamic Range', #PH (S95)
+            52 => 'Handheld Night Scene', #PH
+            59 => 'Scene Intelligent Auto', #PH (T3i)
+            257 => 'Spotlight', #PH
+            258 => 'Night 2', #PH
+            259 => 'Night+',
+            260 => 'Super Night', #PH
+            261 => 'Sunset', #PH (SX10IS)
+            263 => 'Night Scene', #PH
+            264 => 'Surface', #PH
+            265 => 'Low Light 2', #PH
+        },
+    },
+    12 => {
+        Name => 'DigitalZoom',
+        PrintConv => {
+            0 => 'None',
+            1 => '2x',
+            2 => '4x',
+            3 => 'Other',  # value obtained from 2*$val[37]/$val[36]
+        },
+    },
+    13 => {
+        Name => 'Contrast',
+        RawConv => '$val == 0x7fff ? undef : $val',
+        %Image::ExifTool::Exif::printParameter,
+    },
+    14 => {
+        Name => 'Saturation',
+        RawConv => '$val == 0x7fff ? undef : $val',
+        %Image::ExifTool::Exif::printParameter,
+    },
+    15 => {
+        Name => 'Sharpness',
+        RawConv => '$val == 0x7fff ? undef : $val',
+        Notes => q{
+            some models use a range of -2 to +2 where 0 is normal sharpening, and
+            others use a range of 0 to 7 where 0 is no sharpening
+        },
+        PrintConv => '$val > 0 ? "+$val" : $val',
+        PrintConvInv => '$val',
+    },
+    16 => {
+        Name => 'CameraISO',
+        RawConv => '$val == 0x7fff ? undef : $val',
+        ValueConv => 'Image::ExifTool::Canon::CameraISO($val)',
+        ValueConvInv => 'Image::ExifTool::Canon::CameraISO($val,1)',
+    },
+    17 => {
+        Name => 'MeteringMode',
+        PrintConv => {
+            0 => 'Default', # older Ixus
+            1 => 'Spot',
+            2 => 'Average', #PH
+            3 => 'Evaluative',
+            4 => 'Partial',
+            5 => 'Center-weighted average',
+        },
+    },
+    18 => {
+        # this is always 2 for the 300D - PH
+        Name => 'FocusRange',
+        PrintConv => {
+            0 => 'Manual',
+            1 => 'Auto',
+            2 => 'Not Known',
+            3 => 'Macro',
+            4 => 'Very Close', #PH
+            5 => 'Close', #PH
+            6 => 'Middle Range', #PH
+            7 => 'Far Range',
+            8 => 'Pan Focus',
+            9 => 'Super Macro', #PH
+            10=> 'Infinity', #PH
+        },
+    },
+    19 => {
+        Name => 'AFPoint',
+        Flags => 'PrintHex',
+        RawConv => '$val==0 ? undef : $val',
+        PrintConv => {
+            0x2005 => 'Manual AF point selection',
+            0x3000 => 'None (MF)',
+            0x3001 => 'Auto AF point selection',
+            0x3002 => 'Right',
+            0x3003 => 'Center',
+            0x3004 => 'Left',
+            0x4001 => 'Auto AF point selection',
+            0x4006 => 'Face Detect', #PH (A570IS)
+        },
+    },
+    20 => {
+        Name => 'CanonExposureMode',
+        PrintConv => {
+            0 => 'Easy',
+            1 => 'Program AE',
+            2 => 'Shutter speed priority AE',
+            3 => 'Aperture-priority AE',
+            4 => 'Manual',
+            5 => 'Depth-of-field AE',
+            6 => 'M-Dep', #PH
+            7 => 'Bulb', #30
+        },
+    },
+    22 => { #4
+        Name => 'LensType',
+        RawConv => '$val ? $$self{LensType}=$val : undef', # don't use if value is zero
+        Notes => 'this value is incorrect for EOS 7D images with lenses of type 256 or greater',
+        SeparateTable => 1,
+        DataMember => 'LensType',
+        PrintConv => \%canonLensTypes,
+    },
+    23 => {
+        Name => 'LongFocal',
+        Format => 'int16u',
+        # this is a bit tricky, but we need the FocalUnits to convert this to mm
+        RawConvInv => '$val * ($$self{FocalUnits} || 1)',
+        ValueConv => '$val / ($$self{FocalUnits} || 1)',
+        ValueConvInv => '$val',
+        PrintConv => '"$val mm"',
+        PrintConvInv => '$val=~s/\s*mm//;$val',
+    },
+    24 => {
+        Name => 'ShortFocal',
+        Format => 'int16u',
+        RawConvInv => '$val * ($$self{FocalUnits} || 1)',
+        ValueConv => '$val / ($$self{FocalUnits} || 1)',
+        ValueConvInv => '$val',
+        PrintConv => '"$val mm"',
+        PrintConvInv => '$val=~s/\s*mm//;$val',
+    },
+    25 => {
+        Name => 'FocalUnits',
+        # conversion from raw focal length values to mm
+        DataMember => 'FocalUnits',
+        RawConv => '$$self{FocalUnits} = $val',
+        PrintConv => '"$val/mm"',
+        PrintConvInv => '$val=~s/\s*\/?\s*mm//;$val',
+    },
+    26 => { #9
+        Name => 'MaxAperture',
+        RawConv => '$val > 0 ? $val : undef',
+        ValueConv => 'exp(Image::ExifTool::Canon::CanonEv($val)*log(2)/2)',
+        ValueConvInv => 'Image::ExifTool::Canon::CanonEvInv(log($val)*2/log(2))',
+        PrintConv => 'sprintf("%.2g",$val)',
+        PrintConvInv => '$val',
+    },
+    27 => { #PH
+        Name => 'MinAperture',
+        RawConv => '$val > 0 ? $val : undef',
+        ValueConv => 'exp(Image::ExifTool::Canon::CanonEv($val)*log(2)/2)',
+        ValueConvInv => 'Image::ExifTool::Canon::CanonEvInv(log($val)*2/log(2))',
+        PrintConv => 'sprintf("%.2g",$val)',
+        PrintConvInv => '$val',
+    },
+    28 => {
+        Name => 'FlashActivity',
+        RawConv => '$val==-1 ? undef : $val',
+    },
+    29 => {
+        Name => 'FlashBits',
+        PrintConvColumns => 2,
+        PrintConv => { BITMASK => {
+            0 => 'Manual', #PH
+            1 => 'TTL', #PH
+            2 => 'A-TTL', #PH
+            3 => 'E-TTL', #PH
+            4 => 'FP sync enabled',
+            7 => '2nd-curtain sync used',
+            11 => 'FP sync used',
+            13 => 'Built-in',
+            14 => 'External', #(may not be set in manual mode - ref 37)
+        } },
+    },
+    32 => {
+        Name => 'FocusContinuous',
+        RawConv => '$val==-1 ? undef : $val',
+        PrintConv => {
+            0 => 'Single',
+            1 => 'Continuous',
+            8 => 'Manual', #22
+        },
+    },
+    33 => { #PH
+        Name => 'AESetting',
+        RawConv => '$val==-1 ? undef : $val',
+        PrintConv => {
+            0 => 'Normal AE',
+            1 => 'Exposure Compensation',
+            2 => 'AE Lock',
+            3 => 'AE Lock + Exposure Comp.',
+            4 => 'No AE',
+        },
+    },
+    34 => { #PH
+        Name => 'ImageStabilization',
+        RawConv => '$val==-1 ? undef : $val',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'On',
+            2 => 'On, Shot Only', #15 (panning for SX10IS)
+            3 => 'On, Panning', #PH (A570IS)
+            4 => 'On, Video', #PH (SX30IS)
+        },
+    },
+    35 => { #PH
+        Name => 'DisplayAperture',
+        RawConv => '$val ? $val : undef',
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+    },
+    36 => 'ZoomSourceWidth', #PH
+    37 => 'ZoomTargetWidth', #PH
+    39 => { #22
+        Name => 'SpotMeteringMode',
+        RawConv => '$val==-1 ? undef : $val',
+        PrintConv => {
+            0 => 'Center',
+            1 => 'AF Point',
+        },
+    },
+    40 => { #PH
+        Name => 'PhotoEffect',
+        RawConv => '$val==-1 ? undef : $val',
+        PrintConvColumns => 2,
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Vivid',
+            2 => 'Neutral',
+            3 => 'Smooth',
+            4 => 'Sepia',
+            5 => 'B&W',
+            6 => 'Custom',
+            100 => 'My Color Data',
+        },
+    },
+    41 => { #PH (A570IS)
+        Name => 'ManualFlashOutput',
+        PrintHex => 1,
+        PrintConv => {
+            0 => 'n/a',
+            0x500 => 'Full',
+            0x502 => 'Medium',
+            0x504 => 'Low',
+            0x7fff => 'n/a', # (EOS models)
+        },
+    },
+    # 41 => non-zero for manual flash intensity - PH (A570IS)
+    42 => {
+        Name => 'ColorTone',
+        RawConv => '$val == 0x7fff ? undef : $val',
+        %Image::ExifTool::Exif::printParameter,
+    },
+    46 => { #PH
+        Name => 'SRAWQuality',
+        RawConv => '$val==-1 ? undef : $val',
+        PrintConv => {
+            0 => 'n/a',
+            1 => 'sRAW1 (mRAW)',
+            2 => 'sRAW2 (sRAW)',
+        },
+    },
+);
+
+# focal length information (MakerNotes tag 0x02)
+%Image::ExifTool::Canon::FocalLength = (
+    %binaryDataAttrs,
+    FORMAT => 'int16u',
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    0 => { #9
+        Name => 'FocalType',
+        RawConv => '$val ? $val : undef', # don't use if value is zero
+        PrintConv => {
+            1 => 'Fixed',
+            2 => 'Zoom',
+        },
+    },
+    1 => {
+        Name => 'FocalLength',
+        # the EXIF FocalLength is more reliable, so set this priority to zero
+        Priority => 0,
+        RawConv => '$val ? $val : undef', # don't use if value is zero
+        RawConvInv => q{
+            my $focalUnits = $$self{FocalUnits};
+            unless ($focalUnits) {
+                $focalUnits = 1;
+                # (this happens when writing FocalLength to CRW images)
+                $self->Warn("FocalUnits not available for FocalLength conversion (1 assumed)");
+            }
+            return $val * $focalUnits;
+        },
+        ValueConv => '$val / ($$self{FocalUnits} || 1)',
+        ValueConvInv => '$val',
+        PrintConv => '"$val mm"',
+        PrintConvInv => '$val=~s/\s*mm//;$val',
+    },
+    2 => [ #4
+        {
+            Name => 'FocalPlaneXSize',
+            Notes => q{
+                these focal plane sizes are only valid for some models, and are affected by
+                digital zoom if applied
+            },
+            # this conversion is valid only for PowerShot models and these EOS models:
+            # D30, D60, 1D, 1DS, 5D, 10D, 20D, 30D, 300D, 350D, and 400D
+            Condition => q{
+                $$self{Model} !~ /EOS/ or
+                $$self{Model} =~ /\b(1DS?|5D|D30|D60|10D|20D|30D|K236)$/ or
+                $$self{Model} =~ /\b((300D|350D|400D) DIGITAL|REBEL( XTi?)?|Kiss Digital( [NX])?)$/
+            },
+            # focal plane image dimensions in 1/1000 inch -- convert to mm
+            RawConv => '$val < 40 ? undef : $val',  # must be reasonable
+            ValueConv => '$val * 25.4 / 1000',
+            ValueConvInv => 'int($val * 1000 / 25.4 + 0.5)',
+            PrintConv => 'sprintf("%.2f mm",$val)',
+            PrintConvInv => '$val=~s/\s*mm$//;$val',
+        },{
+            Name => 'FocalPlaneXUnknown',
+            Unknown => 1,
+        },
+    ],
+    3 => [ #4
+        {
+            Name => 'FocalPlaneYSize',
+            Condition => q{
+                $$self{Model} !~ /EOS/ or
+                $$self{Model} =~ /\b(1DS?|5D|D30|D60|10D|20D|30D|K236)$/ or
+                $$self{Model} =~ /\b((300D|350D|400D) DIGITAL|REBEL( XTi?)?|Kiss Digital( [NX])?)$/
+            },
+            RawConv => '$val < 40 ? undef : $val',  # must be reasonable
+            ValueConv => '$val * 25.4 / 1000',
+            ValueConvInv => 'int($val * 1000 / 25.4 + 0.5)',
+            PrintConv => 'sprintf("%.2f mm",$val)',
+            PrintConvInv => '$val=~s/\s*mm$//;$val',
+        },{
+            Name => 'FocalPlaneYUnknown',
+            Unknown => 1,
+        },
+    ],
+);
+
+# Canon shot information (MakerNotes tag 0x04)
+# BinaryData (keys are indices into the int16s array)
+%Image::ExifTool::Canon::ShotInfo = (
+    %binaryDataAttrs,
+    FORMAT => 'int16s',
+    FIRST_ENTRY => 1,
+    DATAMEMBER => [ 19 ],
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    1 => { #PH
+        Name => 'AutoISO',
+        Notes => 'actual ISO used = BaseISO * AutoISO / 100',
+        ValueConv => 'exp($val/32*log(2))*100',
+        ValueConvInv => '32*log($val/100)/log(2)',
+        PrintConv => 'sprintf("%.0f",$val)',
+        PrintConvInv => '$val',
+    },
+    2 => {
+        Name => 'BaseISO',
+        Priority => 0,
+        RawConv => '$val ? $val : undef',
+        ValueConv => 'exp($val/32*log(2))*100/32',
+        ValueConvInv => '32*log($val*32/100)/log(2)',
+        PrintConv => 'sprintf("%.0f",$val)',
+        PrintConvInv => '$val',
+    },
+    3 => { #9/PH
+        Name => 'MeasuredEV',
+        Notes => q{
+            this is the Canon name for what could better be called MeasuredLV, and
+            should be close to the calculated LightValue for a proper exposure with most
+            models
+        },
+        # empirical offset of +5 seems to be good for EOS models, but maybe
+        # the offset should be less by up to 1 EV for some PowerShot models
+        ValueConv => '$val / 32 + 5',
+        ValueConvInv => '($val - 5) * 32',
+        PrintConv => 'sprintf("%.2f",$val)',
+        PrintConvInv => '$val',
+    },
+    4 => { #2, 9
+        Name => 'TargetAperture',
+        RawConv => '$val > 0 ? $val : undef',
+        ValueConv => 'exp(Image::ExifTool::Canon::CanonEv($val)*log(2)/2)',
+        ValueConvInv => 'Image::ExifTool::Canon::CanonEvInv(log($val)*2/log(2))',
+        PrintConv => 'sprintf("%.2g",$val)',
+        PrintConvInv => '$val',
+    },
+    5 => { #2
+        Name => 'TargetExposureTime',
+        # ignore obviously bad values (also, -32768 may be used for n/a)
+        # (note that a few models always write 0: DC211, and video models)
+        RawConv => '($val > -1000 and ($val or $$self{Model}=~/(EOS|PowerShot|IXUS|IXY)/))? $val : undef',
+        ValueConv => 'exp(-Image::ExifTool::Canon::CanonEv($val)*log(2))',
+        ValueConvInv => 'Image::ExifTool::Canon::CanonEvInv(-log($val)/log(2))',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    6 => {
+        Name => 'ExposureCompensation',
+        ValueConv => 'Image::ExifTool::Canon::CanonEv($val)',
+        ValueConvInv => 'Image::ExifTool::Canon::CanonEvInv($val)',
+        PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    7 => {
+        Name => 'WhiteBalance',
+        PrintConv => \%canonWhiteBalance,
+        SeparateTable => 1,
+    },
+    8 => { #PH
+        Name => 'SlowShutter',
+        PrintConv => {
+            -1 => 'n/a',
+            0 => 'Off',
+            1 => 'Night Scene',
+            2 => 'On',
+            3 => 'None',
+        },
+    },
+    9 => {
+        Name => 'SequenceNumber',
+        Description => 'Shot Number In Continuous Burst',
+    },
+    10 => { #PH/17
+        Name => 'OpticalZoomCode',
+        Groups => { 2 => 'Camera' },
+        Notes => 'for many PowerShot models, a this is 0-6 for wide-tele zoom',
+        # (for many models, 0-6 represent 0-100% zoom, but it is always 8 for
+        #  EOS models, and I have seen values of 16,20,28,32 and 39 too...)
+        # - set to 8 for "n/a" by Canon software (ref 22)
+        PrintConv => '$val == 8 ? "n/a" : $val',
+        PrintConvInv => '$val =~ /[a-z]/i ? 8 : $val',
+    },
+    # 11 - (8 for all EOS samples, [0,8] for other models - PH)
+    12 => { #37
+        Name => 'CameraTemperature',
+        Condition => '$$self{Model} =~ /EOS/ and $$self{Model} !~ /EOS-1DS?$/',
+        Groups => { 2 => 'Camera' },
+        Notes => 'newer EOS models only',
+        # usually zero if not valid for an EOS model (exceptions: 1D, 1DS)
+        RawConv => '$val ? $val : undef',
+        ValueConv => '$val - 128',
+        ValueConvInv => '$val + 128',
+        PrintConv => '"$val C"',
+        PrintConvInv => '$val=~s/ ?C//; $val',
+    },
+    13 => { #PH
+        Name => 'FlashGuideNumber',
+        RawConv => '$val==-1 ? undef : $val',
+        ValueConv => '$val / 32',
+        ValueConvInv => '$val * 32',
+    },
+    # AF points for Ixus and IxusV cameras - 02/17/04 M. Rommel (also D30/D60 - PH)
+    14 => { #2
+        Name => 'AFPointsInFocus',
+        Notes => 'used by D30, D60 and some PowerShot/Ixus models',
+        Groups => { 2 => 'Camera' },
+        Flags => 'PrintHex',
+        RawConv => '$val==0 ? undef : $val',
+        PrintConvColumns => 2,
+        PrintConv => {
+            0x3000 => 'None (MF)',
+            0x3001 => 'Right',
+            0x3002 => 'Center',
+            0x3003 => 'Center+Right',
+            0x3004 => 'Left',
+            0x3005 => 'Left+Right',
+            0x3006 => 'Left+Center',
+            0x3007 => 'All',
+        },
+    },
+    15 => {
+        Name => 'FlashExposureComp',
+        Description => 'Flash Exposure Compensation',
+        ValueConv => 'Image::ExifTool::Canon::CanonEv($val)',
+        ValueConvInv => 'Image::ExifTool::Canon::CanonEvInv($val)',
+        PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    16 => {
+        Name => 'AutoExposureBracketing',
+        PrintConv => {
+            -1 => 'On',
+            0 => 'Off',
+            1 => 'On (shot 1)',
+            2 => 'On (shot 2)',
+            3 => 'On (shot 3)',
+        },
+    },
+    17 => {
+        Name => 'AEBBracketValue',
+        ValueConv => 'Image::ExifTool::Canon::CanonEv($val)',
+        ValueConvInv => 'Image::ExifTool::Canon::CanonEvInv($val)',
+        PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    18 => { #22
+        Name => 'ControlMode',
+        PrintConv => {
+            0 => 'n/a',
+            1 => 'Camera Local Control',
+            3 => 'Computer Remote Control',
+        },
+    },
+    19 => {
+        Name => 'FocusDistanceUpper',
+        DataMember => 'FocusDistanceUpper',
+        Format => 'int16u',
+        Notes => 'FocusDistance tags are only extracted if FocusDistanceUpper is non-zero',
+        RawConv => '($$self{FocusDistanceUpper} = $val) || undef',
+        ValueConv => '$val / 100',
+        ValueConvInv => '$val * 100',
+        PrintConv => '$val > 655.345 ? "inf" : "$val m"',
+        PrintConvInv => '$val =~ s/ ?m$//; IsFloat($val) ? $val : 655.35',
+    },
+    20 => {
+        Name => 'FocusDistanceLower', # (seems to be the upper distance for the 400D)
+        Condition => '$$self{FocusDistanceUpper}',
+        Format => 'int16u',
+        ValueConv => '$val / 100',
+        ValueConvInv => '$val * 100',
+        PrintConv => '$val > 655.345 ? "inf" : "$val m"',
+        PrintConvInv => '$val =~ s/ ?m$//; IsFloat($val) ? $val : 655.35',
+    },
+    21 => {
+        Name => 'FNumber',
+        Priority => 0,
+        RawConv => '$val ? $val : undef',
+        # approximate big translation table by simple calculation - PH
+        ValueConv => 'exp(Image::ExifTool::Canon::CanonEv($val)*log(2)/2)',
+        ValueConvInv => 'Image::ExifTool::Canon::CanonEvInv(log($val)*2/log(2))',
+        PrintConv => 'sprintf("%.2g",$val)',
+        PrintConvInv => '$val',
+    },
+    22 => [
+        {
+            Name => 'ExposureTime',
+            # encoding is different for 20D and 350D (darn!)
+            # (but note that encoding is the same for TargetExposureTime - PH)
+            Condition => '$$self{Model} =~ /\b(20D|350D|REBEL XT|Kiss Digital N)\b/',
+            Priority => 0,
+            # many models write 0 here in JPEG images (even though 0 is the
+            # value for an exposure time of 1 sec), but apparently a value of 0
+            # is valid in a CRW image (=1s, D60 sample)
+            RawConv => '($val or $$self{FILE_TYPE} eq "CRW") ? $val : undef',
+            # approximate big translation table by simple calculation - PH
+            ValueConv => 'exp(-Image::ExifTool::Canon::CanonEv($val)*log(2))*1000/32',
+            ValueConvInv => 'Image::ExifTool::Canon::CanonEvInv(-log($val*32/1000)/log(2))',
+            PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+            PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+        },
+        {
+            Name => 'ExposureTime',
+            Priority => 0,
+            # many models write 0 here in JPEG images (even though 0 is the
+            # value for an exposure time of 1 sec), but apparently a value of 0
+            # is valid in a CRW image (=1s, D60 sample)
+            RawConv => '($val or $$self{FILE_TYPE} eq "CRW") ? $val : undef',
+            # approximate big translation table by simple calculation - PH
+            ValueConv => 'exp(-Image::ExifTool::Canon::CanonEv($val)*log(2))',
+            ValueConvInv => 'Image::ExifTool::Canon::CanonEvInv(-log($val)/log(2))',
+            PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+            PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+        },
+    ],
+    23 => { #37
+        Name => 'MeasuredEV2',
+        Description => 'Measured EV 2',
+        RawConv => '$val ? $val : undef',
+        ValueConv => '$val / 8 - 6',
+        ValueConvInv => 'int(($val + 6) * 8 + 0.5)',
+    },
+    24 => {
+        Name => 'BulbDuration',
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+    },
+    # 25 - (usually 0, but 1 for 2s timer?, 19 for small AVI, 14 for large
+    #       AVI, and -6 and -10 for shots 1 and 2 with stitch assist - PH)
+    26 => { #15
+        Name => 'CameraType',
+        Groups => { 2 => 'Camera' },
+        PrintConv => {
+            0 => 'n/a',
+            248 => 'EOS High-end',
+            250 => 'Compact',
+            252 => 'EOS Mid-range',
+            255 => 'DV Camera', #PH
+        },
+    },
+    27 => {
+        Name => 'AutoRotate',
+        RawConv => '$val >= 0 ? $val : undef',
+        PrintConv => {
+           -1 => 'n/a', # (set to -1 when rotated by Canon software)
+            0 => 'None',
+            1 => 'Rotate 90 CW',
+            2 => 'Rotate 180',
+            3 => 'Rotate 270 CW',
+        },
+    },
+    28 => { #15
+        Name => 'NDFilter',
+        PrintConv => { -1 => 'n/a', 0 => 'Off', 1 => 'On' },
+    },
+    29 => {
+        Name => 'SelfTimer2',
+        RawConv => '$val >= 0 ? $val : undef',
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+    },
+    33 => { #PH (A570IS)
+        Name => 'FlashOutput',
+        RawConv => '($$self{Model}=~/(PowerShot|IXUS|IXY)/ or $val) ? $val : undef',
+        Notes => q{
+            used only for PowerShot models, this has a maximum value of 500 for models
+            like the A570IS
+        },
+    },
+);
+
+# Canon panorama information (MakerNotes tag 0x05)
+%Image::ExifTool::Canon::Panorama = (
+    %binaryDataAttrs,
+    FORMAT => 'int16s',
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    # 0 - values: always 1
+    # 1 - values: 0,256,512(3 sequential L->R images); 0,-256(2 R->L images)
+    2 => 'PanoramaFrameNumber', #(some models this is always 0)
+    # 3 - values: 160(SX10IS,A570IS); 871(S30)
+    # 4 - values: always 0
+    5 => {
+        Name => 'PanoramaDirection',
+        PrintConv => {
+            0 => 'Left to Right',
+            1 => 'Right to Left',
+            2 => 'Bottom to Top',
+            3 => 'Top to Bottom',
+            4 => '2x2 Matrix (Clockwise)',
+        },
+     },
+);
+
+# D30 color information (MakerNotes tag 0x0a)
+%Image::ExifTool::Canon::UnknownD30 = (
+    %binaryDataAttrs,
+    FORMAT => 'int16s',
+    FIRST_ENTRY => 1,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+);
+
+#..............................................................................
+# common CameraInfo tag definitions
+my %ciFNumber = (
+    Name => 'FNumber',
+    Format => 'int8u',
+    Groups => { 2 => 'Image' },
+    RawConv => '$val ? $val : undef',
+    ValueConv => 'exp(($val-8)/16*log(2))',
+    ValueConvInv => 'log($val)*16/log(2)+8',
+    PrintConv => 'sprintf("%.2g",$val)',
+    PrintConvInv => '$val',
+);
+my %ciExposureTime = (
+    Name => 'ExposureTime',
+    Format => 'int8u',
+    Groups => { 2 => 'Image' },
+    RawConv => '$val ? $val : undef',
+    ValueConv => 'exp(4*log(2)*(1-Image::ExifTool::Canon::CanonEv($val-24)))',
+    ValueConvInv => 'Image::ExifTool::Canon::CanonEvInv(1-log($val)/(4*log(2)))+24',
+    PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+    PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+);
+my %ciISO = (
+    Name => 'ISO',
+    Format => 'int8u',
+    Groups => { 2 => 'Image' },
+    ValueConv => '100*exp(($val/8-9)*log(2))',
+    ValueConvInv => '(log($val/100)/log(2)+9)*8',
+    PrintConv => 'sprintf("%.0f",$val)',
+    PrintConvInv => '$val',
+);
+my %ciCameraTemperature = (
+    Name => 'CameraTemperature',
+    Format => 'int8u',
+    ValueConv => '$val - 128',
+    ValueConvInv => '$val + 128',
+    PrintConv => '"$val C"',
+    PrintConvInv => '$val=~s/ ?C//; $val',
+);
+my %ciMacroMagnification = (
+    Name => 'MacroMagnification',
+    Notes => 'currently decoded only for the MP-E 65mm f/2.8 1-5x Macro Photo',
+    Condition => '$$self{LensType} and $$self{LensType} == 124',
+    # 75=1x, 44=5x, log relationship
+    ValueConv => 'exp((75-$val) * log(2) * 3 / 40)',
+    ValueConvInv => '$val > 0 ? 75 - log($val) / log(2) * 40 / 3 : undef',
+    PrintConv => 'sprintf("%.1fx",$val)',
+    PrintConvInv => '$val=~s/\s*x//; $val',
+);
+my %ciFocalLength = (
+    Name => 'FocalLength',
+    Format => 'int16uRev', # (just to make things confusing, the focal lengths are big-endian)
+    # ignore if zero
+    RawConv => '$val ? $val : undef',
+    PrintConv => '"$val mm"',
+    PrintConvInv => '$val=~s/\s*mm//;$val',
+);
+my %ciShortFocal = (
+    Name => 'ShortFocal',
+    Format => 'int16uRev', # byte order is big-endian
+    PrintConv => '"$val mm"',
+    PrintConvInv => '$val=~s/\s*mm//;$val',
+);
+my %ciLongFocal = (
+    Name => 'LongFocal',
+    Format => 'int16uRev', # byte order is big-endian
+    PrintConv => '"$val mm"',
+    PrintConvInv => '$val=~s/\s*mm//;$val',
+);
+
+#..............................................................................
+# Camera information for 1D and 1DS (MakerNotes tag 0x0d)
+# (ref 15 unless otherwise noted)
+%Image::ExifTool::Canon::CameraInfo1D = (
+    %binaryDataAttrs,
+    FORMAT => 'int8u',
+    FIRST_ENTRY => 0,
+    PRIORITY => 0,  # these tags are not reliable since they change with firmware version
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => q{
+        Information in the "CameraInfo" records is tricky to decode because the
+        encodings are very different than in other Canon records (even sometimes
+        switching endianness between values within a single camera), plus there is
+        considerable variation in format from model to model. The first table below
+        lists CameraInfo tags for the 1D and 1DS.
+    },
+    0x04 => { %ciExposureTime }, #9
+    0x0a => {
+        Name => 'FocalLength',
+        Format => 'int16u',
+        # ignore if zero
+        RawConv => '$val ? $val : undef',
+        PrintConv => '"$val mm"',
+        PrintConvInv => '$val=~s/\s*mm//;$val',
+    },
+    0x0d => { #9
+        Name => 'LensType',
+        Format => 'int16uRev', # value is little-endian
+        SeparateTable => 1,
+        RawConv => '$val ? $val : undef', # don't use if value is zero
+        PrintConv => \%canonLensTypes,
+    },
+    0x0e => {
+        Name => 'ShortFocal',
+        Format => 'int16u',
+        PrintConv => '"$val mm"',
+        PrintConvInv => '$val=~s/\s*mm//;$val',
+    },
+    0x10 => {
+        Name => 'LongFocal',
+        Format => 'int16u',
+        PrintConv => '"$val mm"',
+        PrintConvInv => '$val=~s/\s*mm//;$val',
+    },
+    0x41 => {
+        Name => 'SharpnessFrequency', # PatternSharpness?
+        Condition => '$$self{Model} =~ /\b1D$/',
+        Notes => '1D only',
+        PrintConvColumns => 2,
+        PrintConv => {
+            0 => 'n/a',
+            1 => 'Lowest',
+            2 => 'Low',
+            3 => 'Standard',
+            4 => 'High',
+            5 => 'Highest',
+        },
+    },
+    0x42 => {
+        Name => 'Sharpness',
+        Format => 'int8s',
+        Condition => '$$self{Model} =~ /\b1D$/',
+        Notes => '1D only',
+    },
+    0x44 => {
+        Name => 'WhiteBalance',
+        Condition => '$$self{Model} =~ /\b1D$/',
+        Notes => '1D only',
+        SeparateTable => 1,
+        PrintConv => \%canonWhiteBalance,
+    },
+    0x47 => {
+        Name => 'SharpnessFrequency', # PatternSharpness?
+        Condition => '$$self{Model} =~ /\b1DS$/',
+        Notes => '1DS only',
+        PrintConvColumns => 2,
+        PrintConv => {
+            0 => 'n/a',
+            1 => 'Lowest',
+            2 => 'Low',
+            3 => 'Standard',
+            4 => 'High',
+            5 => 'Highest',
+        },
+    },
+    0x48 => [
+        {
+            Name => 'ColorTemperature',
+            Format => 'int16u',
+            Condition => '$$self{Model} =~ /\b1D$/',
+            Notes => '1D only',
+        },
+        {
+            Name => 'Sharpness',
+            Format => 'int8s',
+            Condition => '$$self{Model} =~ /\b1DS$/',
+            Notes => '1DS only',
+        },
+    ],
+    0x4a => {
+        Name => 'WhiteBalance',
+        Condition => '$$self{Model} =~ /\b1DS$/',
+        Notes => '1DS only',
+        SeparateTable => 1,
+        PrintConv => \%canonWhiteBalance,
+    },
+    0x4b => {
+        Name => 'PictureStyle',
+        Condition => '$$self{Model} =~ /\b1D$/',
+        Notes => "1D only, called 'Color Matrix' in owner's manual",
+        Flags => ['PrintHex','SeparateTable'],
+        PrintConv => \%pictureStyles,
+    },
+    0x4e => {
+        Name => 'ColorTemperature',
+        Format => 'int16u',
+        Condition => '$$self{Model} =~ /\b1DS$/',
+        Notes => '1DS only',
+    },
+    0x51 => {
+        Name => 'PictureStyle',
+        Condition => '$$self{Model} =~ /\b1DS$/',
+        Notes => '1DS only',
+        Flags => ['PrintHex','SeparateTable'],
+        PrintConv => \%pictureStyles,
+    },
+);
+
+# Camera information for 1DmkII and 1DSmkII (MakerNotes tag 0x0d)
+# (ref 15 unless otherwise noted)
+%Image::ExifTool::Canon::CameraInfo1DmkII = (
+    %binaryDataAttrs,
+    FORMAT => 'int8u',
+    FIRST_ENTRY => 0,
+    PRIORITY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'CameraInfo tags for the 1DmkII and 1DSmkII.',
+    0x04 => { %ciExposureTime }, #9
+    0x09 => { %ciFocalLength }, #9
+    0x0c => { #9
+        Name => 'LensType',
+        Format => 'int16uRev', # value is big-endian
+        SeparateTable => 1,
+        RawConv => '$val ? $val : undef', # don't use if value is zero
+        PrintConv => \%canonLensTypes,
+    },
+    0x11 => { %ciShortFocal }, #9
+    0x13 => { %ciLongFocal }, #9
+    0x2d => { #9
+        Name => 'FocalType',
+        PrintConv => {
+           0 => 'Fixed',
+           2 => 'Zoom',
+        },
+    },
+    0x36 => {
+        Name => 'WhiteBalance',
+        SeparateTable => 1,
+        PrintConv => \%canonWhiteBalance,
+    },
+    0x37 => {
+        Name => 'ColorTemperature',
+        Format => 'int16uRev',
+    },
+    0x39 => {
+        Name => 'CanonImageSize',
+        Format => 'int16u',
+        PrintConvColumns => 2,
+        PrintConv => \%canonImageSize,
+    },
+    0x66 => {
+        Name => 'JPEGQuality',
+        Notes => 'a number from 1 to 10',
+    },
+    0x6c => { #12
+        Name => 'PictureStyle',
+        Flags => ['PrintHex','SeparateTable'],
+        PrintConv => \%pictureStyles,
+    },
+    0x6e => {
+        Name => 'Saturation',
+        Format => 'int8s',
+        %Image::ExifTool::Exif::printParameter,
+    },
+    0x6f => {
+        Name => 'ColorTone',
+        Format => 'int8s',
+        %Image::ExifTool::Exif::printParameter,
+    },
+    0x72 => {
+        Name => 'Sharpness',
+        Format => 'int8s',
+    },
+    0x73 => {
+        Name => 'Contrast',
+        Format => 'int8s',
+        %Image::ExifTool::Exif::printParameter,
+    },
+    0x75 => {
+        Name => 'ISO',
+        Format => 'string[5]',
+    },
+);
+
+# Camera information for the 1DmkIIN (MakerNotes tag 0x0d)
+# (ref 9 unless otherwise noted)
+%Image::ExifTool::Canon::CameraInfo1DmkIIN = (
+    %binaryDataAttrs,
+    FORMAT => 'int8u',
+    FIRST_ENTRY => 0,
+    PRIORITY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'CameraInfo tags for the 1DmkIIN.',
+    0x04 => { %ciExposureTime },
+    0x09 => { %ciFocalLength },
+    0x0c => {
+        Name => 'LensType',
+        Format => 'int16uRev', # value is big-endian
+        SeparateTable => 1,
+        RawConv => '$val ? $val : undef', # don't use if value is zero
+        PrintConv => \%canonLensTypes,
+    },
+    0x11 => { %ciShortFocal },
+    0x13 => { %ciLongFocal },
+    0x36 => { #15
+        Name => 'WhiteBalance',
+        SeparateTable => 1,
+        PrintConv => \%canonWhiteBalance,
+    },
+    0x37 => { #15
+        Name => 'ColorTemperature',
+        Format => 'int16uRev',
+    },
+    0x73 => { #15
+        Name => 'PictureStyle',
+        Flags => ['PrintHex','SeparateTable'],
+        PrintConv => \%pictureStyles,
+    },
+    0x74 => { #15
+        Name => 'Sharpness',
+        Format => 'int8s',
+    },
+    0x75 => { #15
+        Name => 'Contrast',
+        Format => 'int8s',
+        %Image::ExifTool::Exif::printParameter,
+    },
+    0x76 => { #15
+        Name => 'Saturation',
+        Format => 'int8s',
+        %Image::ExifTool::Exif::printParameter,
+    },
+    0x77 => { #15
+        Name => 'ColorTone',
+        Format => 'int8s',
+        %Image::ExifTool::Exif::printParameter,
+    },
+    0x79 => { #15
+        Name => 'ISO',
+        Format => 'string[5]',
+    },
+);
+
+# Canon camera information for 1DmkIII and 1DSmkIII (MakerNotes tag 0x0d)
+# (ref PH unless otherwise noted)
+%Image::ExifTool::Canon::CameraInfo1DmkIII = (
+    %binaryDataAttrs,
+    FORMAT => 'int8u',
+    FIRST_ENTRY => 0,
+    PRIORITY => 0,
+    IS_SUBDIR => [ 0x2aa ],
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'CameraInfo tags for the 1DmkIII and 1DSmkIII.',
+    0x03 => { %ciFNumber },
+    0x04 => { %ciExposureTime }, #9
+    0x06 => { %ciISO },
+    0x18 => { %ciCameraTemperature }, #36
+    0x1b => { %ciMacroMagnification }, #(NC)
+    0x1d => { %ciFocalLength },
+    0x30 => {
+        Name => 'CameraOrientation', # <-- (always 9th byte after 0xbbbb for all models - Dave Coffin)
+        PrintConv => {
+            0 => 'Horizontal (normal)',
+            1 => 'Rotate 90 CW',
+            2 => 'Rotate 270 CW',
+        },
+    },
+    0x43 => { #21/24
+        Name => 'FocusDistanceUpper',
+        # (it looks like the focus distances are also odd-byte big-endian)
+        %focusDistanceByteSwap,
+    },
+    0x45 => { #21/24
+        Name => 'FocusDistanceLower',
+        %focusDistanceByteSwap,
+    },
+    0x5e => { #15
+        Name => 'WhiteBalance',
+        Format => 'int16u',
+        PrintConv => \%canonWhiteBalance,
+        SeparateTable => 1,
+    },
+    0x62 => { #15
+        Name => 'ColorTemperature',
+        Format => 'int16u',
+    },
+    0x86 => {
+        Name => 'PictureStyle',
+        Flags => ['PrintHex','SeparateTable'],
+        PrintConv => \%pictureStyles,
+    },
+    0x111 => { #15
+        Name => 'LensType',
+        Format => 'int16uRev', # value is big-endian
+        SeparateTable => 1,
+        PrintConv => \%canonLensTypes,
+    },
+    0x113 => { %ciShortFocal },
+    0x115 => { %ciLongFocal },
+    0x136 => { #15
+        Name => 'FirmwareVersion',
+        Format => 'string[6]',
+    },
+    0x172 => {
+        Name => 'FileIndex',
+        Groups => { 2 => 'Image' },
+        Format => 'int32u',
+        ValueConv => '$val + 1',
+        ValueConvInv => '$val - 1',
+    },
+    0x176 => {
+        Name => 'ShutterCount',
+        Notes => 'may be valid only for some 1DmkIII copies, even running the same firmware',
+        Format => 'int32u',
+        ValueConv => '$val + 1',
+        ValueConvInv => '$val - 1',
+    },
+    0x17e => { #(NC)
+        Name => 'DirectoryIndex',
+        Groups => { 2 => 'Image' },
+        Format => 'int32u',
+        ValueConv => '$val - 1',
+        ValueConvInv => '$val + 1',
+    },
+    0x2aa => { #48
+        Name => 'PictureStyleInfo',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Canon::PSInfo',
+        },
+    },
+    0x45a => { #29
+        Name => 'TimeStamp1',
+        Condition => '$$self{Model} =~ /\b1D Mark III$/',
+        Format => 'int32u',
+        Groups => { 2 => 'Time' },
+        # observed in 1DmkIII firmware 5.3.1 (pre-production), 1.0.3, 1.0.8
+        Notes => 'only valid for some versions of the 1DmkIII firmware',
+        Shift => 'Time',
+        RawConv => '$val ? $val : undef',
+        ValueConv => 'ConvertUnixTime($val)',
+        ValueConvInv => 'GetUnixTime($val)',
+        PrintConv => '$self->ConvertDateTime($val)',
+        PrintConvInv => '$self->InverseDateTime($val)',
+    },
+    0x45e => {
+        Name => 'TimeStamp',
+        Format => 'int32u',
+        Groups => { 2 => 'Time' },
+        # observed in 1DmkIII firmware 1.1.0, 1.1.3 and
+        # 1DSmkIII firmware 1.0.0, 1.0.4, 2.1.2, 2.7.1
+        Notes => 'valid for the 1DSmkIII and some versions of the 1DmkIII firmware',
+        Shift => 'Time',
+        RawConv => '$val ? $val : undef',
+        ValueConv => 'ConvertUnixTime($val)',
+        ValueConvInv => 'GetUnixTime($val)',
+        PrintConv => '$self->ConvertDateTime($val)',
+        PrintConvInv => '$self->InverseDateTime($val)',
+    },
+);
+
+# Canon camera information for 1DmkIV (MakerNotes tag 0x0d) (ref PH)
+%Image::ExifTool::Canon::CameraInfo1DmkIV = (
+    %binaryDataAttrs,
+    FIRST_ENTRY => 0,
+    PRIORITY => 0,
+    DATAMEMBER => [ 0x57 ],
+    IS_SUBDIR => [ 0x363, 0x368 ],
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'CameraInfo tags for the 1DmkIV.',
+    0x03 => { %ciFNumber },
+    0x04 => { %ciExposureTime },
+    0x06 => { %ciISO },
+    0x07 => {
+        Name => 'HighlightTonePriority',
+        PrintConv => { 0 => 'Off', 1 => 'On' },
+    },
+    0x08 => {
+        Name => 'MeasuredEV2',
+        Description => 'Measured EV 2',
+        RawConv => '$val ? $val : undef',
+        ValueConv => '$val / 8 - 6',
+        ValueConvInv => 'int(($val + 6) * 8 + 0.5)',
+    },
+    0x09 => {
+        Name => 'MeasuredEV3',
+        Description => 'Measured EV 3',
+        RawConv => '$val ? $val : undef',
+        ValueConv => '$val / 8 - 6',
+        ValueConvInv => 'int(($val + 6) * 8 + 0.5)',
+    },
+    0x15 => {
+        Name => 'FlashMeteringMode',
+        PrintConv => {
+            0 => 'E-TTL',
+            3 => 'TTL',
+            4 => 'External Auto',
+            5 => 'External Manual',
+            6 => 'Off',
+        },
+    },
+    0x19 => { %ciCameraTemperature },
+    0x1e => { %ciFocalLength },
+    0x35 => {
+        Name => 'CameraOrientation',
+        PrintConv => {
+            0 => 'Horizontal (normal)',
+            1 => 'Rotate 90 CW',
+            2 => 'Rotate 270 CW',
+        },
+    },
+    0x54 => {
+        Name => 'FocusDistanceUpper',
+        %focusDistanceByteSwap,
+    },
+    0x56 => {
+        Name => 'FocusDistanceLower',
+        %focusDistanceByteSwap,
+    },
+    0x57 => {
+        Name => 'FirmwareVersionLookAhead',
+        Hidden => 1,
+        # must look ahead to check location of FirmwareVersion string
+        Format => 'undef[0x1a6]',
+        RawConv => q{
+            my $t = substr($val, 0x1e8 - 0x57, 6);
+            $t =~ /^\d+\.\d+\.\d+/ and $$self{CanonFirmA} = 1;
+            $t = substr($val, 0x1ed - 0x57, 6);
+            $t =~ /^\d+\.\d+\.\d+/ and $$self{CanonFirmB} = 1;
+            return undef;   # not a real tag
+        },
+    },
+    0x77 => {
+        Name => 'WhiteBalance',
+        Condition => '$$self{CanonFirmA}',
+        Notes => 'firmware 4.2.1',
+        Format => 'int16u',
+        SeparateTable => 1,
+        PrintConv => \%canonWhiteBalance,
+    },
+    0x78 => {
+        Name => 'WhiteBalance',
+        Condition => '$$self{CanonFirmB}',
+        Notes => 'firmware 1.0.4',
+        Format => 'int16u',
+        SeparateTable => 1,
+        PrintConv => \%canonWhiteBalance,
+    },
+    0x7b => {
+        Name => 'ColorTemperature',
+        Condition => '$$self{CanonFirmA}',
+        Format => 'int16u',
+    },
+    0x7c => {
+        Name => 'ColorTemperature',
+        Condition => '$$self{CanonFirmB}',
+        Format => 'int16u',
+    },
+    0x14e => {
+        Name => 'LensType',
+        Condition => '$$self{CanonFirmA}',
+        Format => 'int16uRev', # value is big-endian
+        SeparateTable => 1,
+        PrintConv => \%canonLensTypes,
+    },
+    0x14f => {
+        Name => 'LensType',
+        Condition => '$$self{CanonFirmB}',
+        Format => 'int16uRev', # value is big-endian
+        SeparateTable => 1,
+        PrintConv => \%canonLensTypes,
+    },
+    0x150 => {
+        %ciShortFocal,
+        Condition => '$$self{CanonFirmA}',
+    },
+    0x151 => {
+        %ciShortFocal,
+        Condition => '$$self{CanonFirmB}',
+    },
+    0x152 => {
+        %ciLongFocal,
+        Condition => '$$self{CanonFirmA}',
+    },
+    0x153 => {
+        %ciLongFocal,
+        Condition => '$$self{CanonFirmB}',
+    },
+    0x1e8 => { # firmware 4.2.1 (pre-production)
+        Name => 'FirmwareVersion',
+        Condition => '$$self{CanonFirmA}',
+        Format => 'string[6]',
+        Writable => 0,
+    },
+    0x1ed => { # firmware 1.0.4
+        Name => 'FirmwareVersion',
+        Condition => '$$self{CanonFirmB}',
+        Format => 'string[6]',
+        Writable => 0,
+    },
+    0x227 => { #(NC)
+        Name => 'FileIndex',
+        Condition => '$$self{CanonFirmA}',
+        Groups => { 2 => 'Image' },
+        Format => 'int32u',
+        ValueConv => '$val + 1',
+        ValueConvInv => '$val - 1',
+    },
+    0x22c => { #(NC)
+        Name => 'FileIndex',
+        Condition => '$$self{CanonFirmB}',
+        Groups => { 2 => 'Image' },
+        Format => 'int32u',
+        ValueConv => '$val + 1',
+        ValueConvInv => '$val - 1',
+    },
+    0x233 => { #(NC)
+        Name => 'DirectoryIndex',
+        Condition => '$$self{CanonFirmA}',
+        Groups => { 2 => 'Image' },
+        Format => 'int32u',
+        ValueConv => '$val - 1',
+        ValueConvInv => '$val + 1',
+    },
+    0x238 => { #(NC)
+        Name => 'DirectoryIndex',
+        Condition => '$$self{CanonFirmB}',
+        Groups => { 2 => 'Image' },
+        Format => 'int32u',
+        ValueConv => '$val - 1',
+        ValueConvInv => '$val + 1',
+    },
+    0x363 => {
+        Name => 'PictureStyleInfo',
+        Condition => '$$self{CanonFirmA}',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Canon::PSInfo',
+        },
+    },
+    0x368 => {
+        Name => 'PictureStyleInfo',
+        Condition => '$$self{CanonFirmB}',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Canon::PSInfo',
+        },
+    },
+);
+
+# Camera information for 5D (MakerNotes tag 0x0d)
+# (ref 12 unless otherwise noted)
+%Image::ExifTool::Canon::CameraInfo5D = (
+    %binaryDataAttrs,
+    FORMAT => 'int8s',
+    FIRST_ENTRY => 0,
+    PRIORITY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'CameraInfo tags for the EOS 5D.',
+    0x03 => { %ciFNumber }, #PH
+    0x04 => { %ciExposureTime }, #9
+    0x06 => { %ciISO }, #PH
+    0x0c => { #9
+        Name => 'LensType',
+        Format => 'int16uRev', # value is big-endian
+        SeparateTable => 1,
+        RawConv => '$val ? $val : undef', # don't use if value is zero
+        PrintConv => \%canonLensTypes,
+    },
+    0x17 => { %ciCameraTemperature }, #PH
+    0x1b => { %ciMacroMagnification }, #PH
+    0x27 => { #PH
+        Name => 'CameraOrientation',
+        PrintConv => {
+            0 => 'Horizontal (normal)',
+            1 => 'Rotate 90 CW',
+            2 => 'Rotate 270 CW',
+        },
+    },
+    0x28 => { %ciFocalLength }, #15
+    0x38 => {
+        Name => 'AFPointsInFocus5D',
+        Format => 'int16uRev',
+        PrintConvColumns => 2,
+        PrintConv => { BITMASK => {
+            0 => 'Center',
+            1 => 'Top',
+            2 => 'Bottom',
+            3 => 'Upper-left',
+            4 => 'Upper-right',
+            5 => 'Lower-left',
+            6 => 'Lower-right',
+            7 => 'Left',
+            8 => 'Right',
+            9 => 'AI Servo1',
+           10 => 'AI Servo2',
+           11 => 'AI Servo3',
+           12 => 'AI Servo4',
+           13 => 'AI Servo5',
+           14 => 'AI Servo6',
+        } },
+    },
+    0x54 => { #15
+        Name => 'WhiteBalance',
+        Format => 'int16u',
+        SeparateTable => 1,
+        PrintConv => \%canonWhiteBalance,
+    },
+    0x58 => { #15
+        Name => 'ColorTemperature',
+        Format => 'int16u',
+    },
+    0x6c => {
+        Name => 'PictureStyle',
+        Format => 'int8u',
+        Flags => ['PrintHex','SeparateTable'],
+        PrintConv => \%pictureStyles,
+    },
+    0x93 => { %ciShortFocal }, #15
+    0x95 => { %ciLongFocal }, #15
+    0x97 => { #15
+        Name => 'LensType',
+        Format => 'int16uRev', # value is big-endian
+        SeparateTable => 1,
+        PrintConv => \%canonLensTypes,
+    },
+    0xa4 => { #PH
+        Name => 'FirmwareRevision',
+        Format => 'string[8]',
+    },
+    0xac => { #PH
+        Name => 'ShortOwnerName',
+        Format => 'string[16]',
+    },
+    0xd0 => {
+        Name => 'ImageNumber',
+        Format => 'int16u',
+        Groups => { 2 => 'Image' },
+        ValueConv => '$val + 1',
+        ValueConvInv => '$val - 1',
+    },
+    0xe8 => 'ContrastStandard',
+    0xe9 => 'ContrastPortrait',
+    0xea => 'ContrastLandscape',
+    0xeb => 'ContrastNeutral',
+    0xec => 'ContrastFaithful',
+    0xed => 'ContrastMonochrome',
+    0xee => 'ContrastUserDef1',
+    0xef => 'ContrastUserDef2',
+    0xf0 => 'ContrastUserDef3',
+    # sharpness values are 0-7
+    0xf1 => 'SharpnessStandard',
+    0xf2 => 'SharpnessPortrait',
+    0xf3 => 'SharpnessLandscape',
+    0xf4 => 'SharpnessNeutral',
+    0xf5 => 'SharpnessFaithful',
+    0xf6 => 'SharpnessMonochrome',
+    0xf7 => 'SharpnessUserDef1',
+    0xf8 => 'SharpnessUserDef2',
+    0xf9 => 'SharpnessUserDef3',
+    0xfa => 'SaturationStandard',
+    0xfb => 'SaturationPortrait',
+    0xfc => 'SaturationLandscape',
+    0xfd => 'SaturationNeutral',
+    0xfe => 'SaturationFaithful',
+    0xff => {
+        Name => 'FilterEffectMonochrome',
+        PrintConv => {
+            0 => 'None',
+            1 => 'Yellow',
+            2 => 'Orange',
+            3 => 'Red',
+            4 => 'Green',
+            -559038737 => 'n/a', # (0xdeadbeef)
+        },
+    },
+    0x100 => 'SaturationUserDef1',
+    0x101 => 'SaturationUserDef2',
+    0x102 => 'SaturationUserDef3',
+    0x103 => 'ColorToneStandard',
+    0x104 => 'ColorTonePortrait',
+    0x105 => 'ColorToneLandscape',
+    0x106 => 'ColorToneNeutral',
+    0x107 => 'ColorToneFaithful',
+    0x108 => {
+        Name => 'ToningEffectMonochrome',
+        PrintConv => {
+            0 => 'None',
+            1 => 'Sepia',
+            2 => 'Blue',
+            3 => 'Purple',
+            4 => 'Green',
+            -559038737 => 'n/a', # (0xdeadbeef)
+        },
+    },
+    0x109 => 'ColorToneUserDef1',
+    0x10a => 'ColorToneUserDef2',
+    0x10b => 'ColorToneUserDef3',
+    0x10c => {
+        Name => 'UserDef1PictureStyle',
+        Format => 'int16u',
+        PrintHex => 1, # (only needed for one tag)
+        SeparateTable => 'UserDefStyle',
+        PrintConv => \%userDefStyles,
+    },
+    0x10e => {
+        Name => 'UserDef2PictureStyle',
+        Format => 'int16u',
+        SeparateTable => 'UserDefStyle',
+        PrintConv => \%userDefStyles,
+    },
+    0x110 => {
+        Name => 'UserDef3PictureStyle',
+        Format => 'int16u',
+        SeparateTable => 'UserDefStyle',
+        PrintConv => \%userDefStyles,
+    },
+    0x11c => {
+        Name => 'TimeStamp',
+        Format => 'int32u',
+        Groups => { 2 => 'Time' },
+        Shift => 'Time',
+        RawConv => '$val ? $val : undef',
+        ValueConv => 'ConvertUnixTime($val)',
+        ValueConvInv => 'GetUnixTime($val)',
+        PrintConv => '$self->ConvertDateTime($val)',
+        PrintConvInv => '$self->InverseDateTime($val)',
+    },
+);
+
+# Camera information for 5D Mark II (MakerNotes tag 0x0d)
+# (ref PH unless otherwise noted)
+%Image::ExifTool::Canon::CameraInfo5DmkII = (
+    %binaryDataAttrs,
+    FORMAT => 'int8u',
+    FIRST_ENTRY => 0,
+    PRIORITY => 0,
+    IS_SUBDIR => [ 0x15a, 0x17e ],
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'CameraInfo tags for the EOS 5D Mark II.',
+    0x03 => { %ciFNumber },
+    0x04 => { %ciExposureTime },
+    0x06 => { %ciISO },
+    0x07 => {
+        Name => 'HighlightTonePriority',
+        PrintConv => { 0 => 'Off', 1 => 'On' },
+    },
+    0x1b => { %ciMacroMagnification }, #PH
+    0x15 => { #PH (580 EX II)
+        Name => 'FlashMeteringMode',
+        PrintConv => {
+            0 => 'E-TTL',
+            3 => 'TTL',
+            4 => 'External Auto',
+            5 => 'External Manual',
+            6 => 'Off',
+        },
+    },
+    0x19 => { %ciCameraTemperature }, #36
+    # 0x1b, 0x1c, 0x1d - same as FileInfo 0x10 - PH
+    0x1e => { %ciFocalLength },
+    0x31 => {
+        Name => 'CameraOrientation',
+        PrintConv => {
+            0 => 'Horizontal (normal)',
+            1 => 'Rotate 90 CW',
+            2 => 'Rotate 270 CW',
+        },
+    },
+    0x50 => {
+        Name => 'FocusDistanceUpper',
+        %focusDistanceByteSwap,
+    },
+    0x52 => {
+        Name => 'FocusDistanceLower',
+        %focusDistanceByteSwap,
+    },
+    0x6f => {
+        Name => 'WhiteBalance',
+        Format => 'int16u',
+        SeparateTable => 1,
+        PrintConv => \%canonWhiteBalance,
+    },
+    0x73 => {
+        Name => 'ColorTemperature',
+        Format => 'int16u',
+    },
+    0xa7 => {
+        Name => 'PictureStyle',
+        Format => 'int8u',
+        Flags => ['PrintHex','SeparateTable'],
+        PrintConv => \%pictureStyles,
+    },
+    0xbd => {
+        Name => 'HighISONoiseReduction',
+        PrintConv => {
+            0 => 'Standard',
+            1 => 'Low',
+            2 => 'Strong',
+            3 => 'Off',
+        },
+    },
+    0xbf => {
+        Name => 'AutoLightingOptimizer',
+        PrintConv => {
+            0 => 'Standard',
+            1 => 'Low',
+            2 => 'Strong',
+            3 => 'Off',
+        },
+    },
+    0xe6 => {
+        Name => 'LensType',
+        Format => 'int16uRev', # value is big-endian
+        SeparateTable => 1,
+        PrintConv => \%canonLensTypes,
+    },
+    0xe8 => { %ciShortFocal },
+    0xea => { %ciLongFocal },
+    0x15a => {
+        Name => 'CameraInfo5DmkII_2a',
+        Condition => '$$valPt =~ /^\d+\.\d+\.\d+[\s\0]/',
+        Notes => 'at this location for firmware 3.4.6 and 3.6.1',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Canon::CameraInfo5DmkII_2',
+        },
+    },
+    0x17e => {
+        Name => 'CameraInfo5DmkII_2b',
+        Condition => '$$valPt =~ /^\d+\.\d+\.\d+[\s\0]/',
+        Notes => 'at this location for firmware 1.0.6 and 4.1.1',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Canon::CameraInfo5DmkII_2',
+        },
+    },
+);
+
+# variable-position Camera information for 5DmkII (ref PH)
+%Image::ExifTool::Canon::CameraInfo5DmkII_2 = (
+    %binaryDataAttrs,
+    FIRST_ENTRY => 0,
+    PRIORITY => 0,
+    IS_SUBDIR => [ 0x179 ],
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'More CameraInfo tags for the EOS 5D Mark II.',
+    0 => {
+        Name => 'FirmwareVersion',
+        Format => 'string[6]',
+        Writable => 0, # not writable for logic reasons
+        # some firmwares have a null instead of a space after the version number
+        RawConv => '$val=~/^\d+\.\d+\.\d+\s*$/ ? $val : undef',
+    },
+    0x3d => {
+        Name => 'FileIndex',
+        Groups => { 2 => 'Image' },
+        Format => 'int32u',
+        ValueConv => '$val + 1',
+        ValueConvInv => '$val - 1',
+    },
+    0x49 => { #(NC)
+        Name => 'DirectoryIndex',
+        Groups => { 2 => 'Image' },
+        Format => 'int32u',
+        ValueConv => '$val - 1',
+        ValueConvInv => '$val + 1',
+    },
+    0x179 => { #48
+        Name => 'PictureStyleInfo',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Canon::PSInfo',
+        },
+    },
+);
+
+# Camera information for 7D (MakerNotes tag 0x0d) (ref PH)
+%Image::ExifTool::Canon::CameraInfo7D = (
+    %binaryDataAttrs,
+    FORMAT => 'int8u',
+    FIRST_ENTRY => 0,
+    PRIORITY => 0,
+    IS_SUBDIR => [ 0x20, 0x24 ],
+    DATAMEMBER => [ 0x1f ],
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'CameraInfo tags for the EOS 7D.',
+    0x03 => { %ciFNumber },
+    0x04 => { %ciExposureTime },
+    0x06 => { %ciISO },
+    0x07 => {
+        Name => 'HighlightTonePriority',
+        PrintConv => { 0 => 'Off', 1 => 'On' },
+    },
+    0x08 => { #37
+        Name => 'MeasuredEV2',
+        Description => 'Measured EV 2',
+        RawConv => '$val ? $val : undef',
+        ValueConv => '$val / 8 - 6',
+        ValueConvInv => 'int(($val + 6) * 8 + 0.5)',
+    },
+    0x09 => { #37
+        Name => 'MeasuredEV',
+        Description => 'Measured EV',
+        RawConv => '$val ? $val : undef',
+        ValueConv => '$val / 8 - 6',
+        ValueConvInv => 'int(($val + 6) * 8 + 0.5)',
+    },
+    0x15 => { #PH (580 EX II)
+        Name => 'FlashMeteringMode',
+        PrintConv => {
+            0 => 'E-TTL',
+            3 => 'TTL',
+            4 => 'External Auto',
+            5 => 'External Manual',
+            6 => 'Off',
+        },
+    },
+    0x19 => { %ciCameraTemperature },
+    0x1e => { %ciFocalLength },
+    0x1f => {
+        Name => 'FirmwareVersionLookAhead',
+        Hidden => 1,
+        # must look ahead to check location of FirmwareVersion string
+        Format => 'undef[0x1a0]',
+        RawConv => q{
+            my $t = substr($val, 0x1a8 - 0x1f, 6);
+            $t =~ /^\d+\.\d+\.\d+/ and $$self{CanonFirmA} = 1;
+            $t = substr($val, 0x1ac - 0x1f, 6);
+            $t =~ /^\d+\.\d+\.\d+/ and $$self{CanonFirmB} = 1;
+            return undef;   # not a real tag
+        },
+    },
+    0x20 => {
+        Name => 'CameraInfo7D_2a',
+        Condition => '$$self{CanonFirmA}',
+        Notes => 'at this location for pre-production firmware version 3.7.5',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Canon::CameraInfo7D_2',
+        },
+    },
+    0x24 => {
+        Name => 'CameraInfo7D_2b',
+        Condition => '$$self{CanonFirmB}',
+        Notes => 'at this location for firmware 1.0.7, 1.0.8, 1.1.0, 1.2.1 and 1.2.2',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Canon::CameraInfo7D_2',
+        },
+    },
+);
+
+# variable-position Camera information for 7D (ref PH)
+%Image::ExifTool::Canon::CameraInfo7D_2 = (
+    %binaryDataAttrs,
+    FORMAT => 'int8u',
+    FIRST_ENTRY => 0,
+    PRIORITY => 0,
+    IS_SUBDIR => [ 0x303 ],
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'More CameraInfo tags for the EOS 7D.',
+    0x11 => {
+        Name => 'CameraOrientation',
+        PrintConv => {
+            0 => 'Horizontal (normal)',
+            1 => 'Rotate 90 CW',
+            2 => 'Rotate 270 CW',
+        },
+    },
+    0x30 => {
+        Name => 'FocusDistanceUpper',
+        %focusDistanceByteSwap,
+    },
+    0x32 => {
+        Name => 'FocusDistanceLower',
+        %focusDistanceByteSwap,
+    },
+    0x53 => {
+        Name => 'WhiteBalance',
+        Format => 'int16u',
+        SeparateTable => 1,
+        PrintConv => \%canonWhiteBalance,
+    },
+    0x57 => {
+        Name => 'ColorTemperature',
+        Format => 'int16u',
+    },
+    0xa5 => {
+        Name => 'HighISONoiseReduction',
+        PrintConv => {
+            0 => 'Standard',
+            1 => 'Low',
+            2 => 'Strong',
+            3 => 'Off',
+        },
+    },
+    0xee => {
+        Name => 'LensType',
+        Format => 'int16uRev', # value is big-endian
+        SeparateTable => 1,
+        PrintConv => \%canonLensTypes,
+    },
+    0xf0 => { %ciShortFocal },
+    0xf2 => { %ciLongFocal },
+    0x188 => {
+        Name => 'FirmwareVersion',
+        Format => 'string[6]',
+        Writable => 0, # not writable for logic reasons
+        # some firmwares have a null instead of a space after the version number
+        RawConv => '$val=~/^\d+\.\d+\.\d+\s*$/ ? $val : undef',
+    },
+    0x1c7 => {
+        Name => 'FileIndex',
+        Groups => { 2 => 'Image' },
+        Format => 'int32u',
+        ValueConv => '$val + 1',
+        ValueConvInv => '$val - 1',
+    },
+    0x1d3 => { #(NC)
+        Name => 'DirectoryIndex',
+        Groups => { 2 => 'Image' },
+        Format => 'int32u',
+        ValueConv => '$val - 1',
+        ValueConvInv => '$val + 1',
+    },
+    0x303 => { #48
+        Name => 'PictureStyleInfo',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Canon::PSInfo',
+        },
+    },
+);
+
+# Canon camera information for 40D (MakerNotes tag 0x0d) (ref PH)
+%Image::ExifTool::Canon::CameraInfo40D = (
+    %binaryDataAttrs,
+    FORMAT => 'int8u',
+    FIRST_ENTRY => 0,
+    PRIORITY => 0,
+    IS_SUBDIR => [ 0x25b ],
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'CameraInfo tags for the EOS 40D.',
+    0x03 => { %ciFNumber }, #PH
+    0x04 => { %ciExposureTime }, #PH
+    0x06 => { %ciISO }, #PH
+    0x15 => { #PH (580 EX II)
+        Name => 'FlashMeteringMode',
+        PrintConv => {
+            0 => 'E-TTL',
+            3 => 'TTL',
+            4 => 'External Auto',
+            5 => 'External Manual',
+            6 => 'Off',
+        },
+    },
+    0x18 => { %ciCameraTemperature }, #36
+    0x1b => { %ciMacroMagnification }, #PH
+    0x1d => { %ciFocalLength }, #PH
+    0x30 => { #20
+        Name => 'CameraOrientation',
+        PrintConv => {
+            0 => 'Horizontal (normal)',
+            1 => 'Rotate 90 CW',
+            2 => 'Rotate 270 CW',
+        },
+    },
+    0x43 => { #21/24
+        Name => 'FocusDistanceUpper',
+        # this is very odd (little-endian number on odd boundary),
+        # but it does seem to work better with my sample images - PH
+        %focusDistanceByteSwap,
+    },
+    0x45 => { #21/24
+        Name => 'FocusDistanceLower',
+        %focusDistanceByteSwap,
+    },
+    0x6f => { #15
+        Name => 'WhiteBalance',
+        Format => 'int16u',
+        PrintConv => \%canonWhiteBalance,
+        SeparateTable => 1,
+    },
+    0x73 => { #15
+        Name => 'ColorTemperature',
+        Format => 'int16u',
+    },
+    0xd6 => { #15
+        Name => 'LensType',
+        Format => 'int16uRev', # value is big-endian
+        SeparateTable => 1,
+        PrintConv => \%canonLensTypes,
+    },
+    0xd8 => { %ciShortFocal }, #15
+    0xda => { %ciLongFocal }, #15
+    0xff => { #15
+        Name => 'FirmwareVersion',
+        Format => 'string[6]',
+    },
+    0x133 => { #27
+        Name => 'FileIndex',
+        Groups => { 2 => 'Image' },
+        Format => 'int32u',
+        Notes => 'combined with DirectoryIndex to give the Composite FileNumber tag',
+        ValueConv => '$val + 1',
+        ValueConvInv => '$val - 1',
+    },
+    0x13f => { #27
+        Name => 'DirectoryIndex',
+        Groups => { 2 => 'Image' },
+        Format => 'int32u',
+        ValueConv => '$val - 1', # yes, minus (opposite to FileIndex)
+        ValueConvInv => '$val + 1',
+    },
+    0x25b => {
+        Name => 'PictureStyleInfo',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Canon::PSInfo',
+        },
+    },
+    0x92b => { #33
+        Name => 'LensModel',
+        Format => 'string[64]',
+    },
+);
+
+# Canon camera information for 50D (MakerNotes tag 0x0d)
+# (ref PH unless otherwise noted)
+%Image::ExifTool::Canon::CameraInfo50D = (
+    %binaryDataAttrs,
+    FORMAT => 'int8u',
+    FIRST_ENTRY => 0,
+    PRIORITY => 0,
+    DATAMEMBER => [ 0x15a, 0x15e ],
+    IS_SUBDIR => [ 0x2d3, 0x2d7 ],
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'CameraInfo tags for the EOS 50D.',
+    0x03 => { %ciFNumber },
+    0x04 => { %ciExposureTime },
+    0x06 => { %ciISO },
+    0x07 => {
+        Name => 'HighlightTonePriority',
+        PrintConv => { 0 => 'Off', 1 => 'On' },
+    },
+    0x15 => { #PH (580 EX II)
+        Name => 'FlashMeteringMode',
+        PrintConv => {
+            0 => 'E-TTL',
+            3 => 'TTL',
+            4 => 'External Auto',
+            5 => 'External Manual',
+            6 => 'Off',
+        },
+    },
+    0x19 => { %ciCameraTemperature }, #36
+    0x1e => { %ciFocalLength },
+    0x31 => {
+        Name => 'CameraOrientation',
+        PrintConv => {
+            0 => 'Horizontal (normal)',
+            1 => 'Rotate 90 CW',
+            2 => 'Rotate 270 CW',
+        },
+    },
+    0x50 => { #33
+        Name => 'FocusDistanceUpper',
+        %focusDistanceByteSwap,
+    },
+    0x52 => { #33
+        Name => 'FocusDistanceLower',
+        %focusDistanceByteSwap,
+    },
+    0x6f => {
+        Name => 'WhiteBalance',
+        Format => 'int16u',
+        SeparateTable => 1,
+        PrintConv => \%canonWhiteBalance,
+    },
+    0x73 => { #33
+        Name => 'ColorTemperature',
+        Format => 'int16u',
+    },
+    0xa7 => {
+        Name => 'PictureStyle',
+        Format => 'int8u',
+        Flags => ['PrintHex','SeparateTable'],
+        PrintConv => \%pictureStyles,
+    },
+    0xbd => {
+        Name => 'HighISONoiseReduction',
+        PrintConv => {
+            0 => 'Standard',
+            1 => 'Low',
+            2 => 'Strong',
+            3 => 'Off',
+        },
+    },
+    0xbf => {
+        Name => 'AutoLightingOptimizer',
+        PrintConv => {
+            0 => 'Standard',
+            1 => 'Low',
+            2 => 'Strong',
+            3 => 'Off',
+        },
+    },
+    0xea => { #33
+        Name => 'LensType',
+        Format => 'int16uRev', # value is big-endian
+        SeparateTable => 1,
+        PrintConv => \%canonLensTypes,
+    },
+    0xec => { %ciShortFocal },
+    0xee => { %ciLongFocal },
+    0x15a => {
+        Name => 'FirmwareVersion',
+        Format => 'string[6]',
+        Notes => 'at this location for firmware 2.6.1',
+        Writable => 0,
+        RawConv => '$val=~/^\d+\.\d+\.\d+\s*$/ ? $$self{CanonFirmA}=$val : undef',
+    },
+    0x15e => { #33
+        Name => 'FirmwareVersion',
+        Format => 'string[6]',
+        Notes => 'at this location for firmware 1.0.2, 1.0.3, 2.9.1 and 3.1.1',
+        Writable => 0,
+        RawConv => '$val=~/^\d+\.\d+\.\d+\s*$/ ? $$self{CanonFirmB}=$val : undef',
+    },
+    0x197 => {
+        Name => 'FileIndex',
+        Condition => '$$self{CanonFirmA}',
+        Groups => { 2 => 'Image' },
+        Format => 'int32u',
+        ValueConv => '$val + 1',
+        ValueConvInv => '$val - 1',
+    },
+    0x19b => {
+        Name => 'FileIndex',
+        Condition => '$$self{CanonFirmB}',
+        Groups => { 2 => 'Image' },
+        Format => 'int32u',
+        ValueConv => '$val + 1',
+        ValueConvInv => '$val - 1',
+    },
+    0x1a3 => { #(NC)
+        Name => 'DirectoryIndex',
+        Condition => '$$self{CanonFirmA}',
+        Groups => { 2 => 'Image' },
+        Format => 'int32u',
+        ValueConv => '$val - 1',
+        ValueConvInv => '$val + 1',
+    },
+    0x1a7 => { #(NC)
+        Name => 'DirectoryIndex',
+        Condition => '$$self{CanonFirmB}',
+        Groups => { 2 => 'Image' },
+        Format => 'int32u',
+        ValueConv => '$val - 1',
+        ValueConvInv => '$val + 1',
+    },
+    0x2d3 => {
+        Name => 'PictureStyleInfo',
+        Condition => '$$self{CanonFirmA}',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Canon::PSInfo',
+        },
+    },
+    0x2d7 => {
+        Name => 'PictureStyleInfo',
+        Condition => '$$self{CanonFirmB}',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Canon::PSInfo',
+        },
+    },
+);
+
+# Canon camera information for 60D (MakerNotes tag 0x0d)
+# (ref PH unless otherwise noted)
+# NOTE: Can probably borrow more 50D tags here, possibly with an offset
+%Image::ExifTool::Canon::CameraInfo60D = (
+    %binaryDataAttrs,
+    FORMAT => 'int8u',
+    FIRST_ENTRY => 0,
+    PRIORITY => 0,
+  #  DATAMEMBER => [ 0x199 ],
+    IS_SUBDIR => [ 0x321 ],
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'CameraInfo tags for the EOS 60D.',
+    0x03 => { %ciFNumber },
+    0x04 => { %ciExposureTime },
+    0x06 => { %ciISO },
+    0x19 => { %ciCameraTemperature },
+    0x1e => { %ciFocalLength },
+    0x36 => {
+        Name => 'CameraOrientation',
+        PrintConv => {
+            0 => 'Horizontal (normal)',
+            1 => 'Rotate 90 CW',
+            2 => 'Rotate 270 CW',
+        },
+    },
+    0x55 => {
+        Name => 'FocusDistanceUpper',
+        %focusDistanceByteSwap,
+    },
+    0x57 => {
+        Name => 'FocusDistanceLower',
+        %focusDistanceByteSwap,
+    },
+    0x7d => {
+        Name => 'ColorTemperature',
+        Format => 'int16u',
+    },
+    0xe8 => {
+        Name => 'LensType',
+        Format => 'int16uRev', # value is big-endian
+        SeparateTable => 1,
+        PrintConv => \%canonLensTypes,
+    },
+    0xea => { %ciShortFocal },
+    0xec => { %ciLongFocal },
+    0x199 => {
+        Name => 'FirmwareVersion',
+        Format => 'string[6]',
+  #      Notes => 'at this location for firmware 2.8.1 and 1.0.5',
+        Writable => 0,
+  #      RawConv => '$val=~/^\d+\.\d+\.\d+\s*$/ ? $$self{CanonFirmA}=$val : undef',
+    },
+    0x1d9 => {
+        Name => 'FileIndex',
+        Groups => { 2 => 'Image' },
+        Format => 'int32u',
+        ValueConv => '$val + 1',
+        ValueConvInv => '$val - 1',
+    },
+    0x1e5 => { #(NC)
+        Name => 'DirectoryIndex',
+        Groups => { 2 => 'Image' },
+        Format => 'int32u',
+        ValueConv => '$val - 1',
+        ValueConvInv => '$val + 1',
+    },
+    0x321 => {
+        Name => 'PictureStyleInfo2',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Canon::PSInfo2',
+        },
+    },
+);
+
+# Canon camera information for 450D (MakerNotes tag 0x0d) (ref PH)
+%Image::ExifTool::Canon::CameraInfo450D = (
+    %binaryDataAttrs,
+    FORMAT => 'int8u',
+    FIRST_ENTRY => 0,
+    PRIORITY => 0,
+    IS_SUBDIR => [ 0x263 ],
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'CameraInfo tags for the EOS 450D.',
+    0x03 => { %ciFNumber }, #PH
+    0x04 => { %ciExposureTime }, #PH
+    0x06 => { %ciISO }, #PH
+    0x15 => { #PH (580 EX II)
+        Name => 'FlashMeteringMode',
+        PrintConv => {
+            0 => 'E-TTL',
+            3 => 'TTL',
+            4 => 'External Auto',
+            5 => 'External Manual',
+            6 => 'Off',
+        },
+    },
+    0x18 => { %ciCameraTemperature }, #36
+    0x1b => { %ciMacroMagnification }, #PH
+    0x1d => { %ciFocalLength }, #PH
+    0x30 => { #20
+        Name => 'CameraOrientation',
+        PrintConv => {
+            0 => 'Horizontal (normal)',
+            1 => 'Rotate 90 CW',
+            2 => 'Rotate 270 CW',
+        },
+    },
+    0x43 => { #20
+        Name => 'FocusDistanceUpper',
+        # this is very odd (little-endian number on odd boundary),
+        # but it does seem to work better with my sample images - PH
+        %focusDistanceByteSwap,
+    },
+    0x45 => { #20
+        Name => 'FocusDistanceLower',
+        %focusDistanceByteSwap,
+    },
+    0x6f => { #PH
+        Name => 'WhiteBalance',
+        Format => 'int16u',
+        PrintConv => \%canonWhiteBalance,
+        SeparateTable => 1,
+    },
+    0x73 => { #PH
+        Name => 'ColorTemperature',
+        Format => 'int16u',
+    },
+    0xde => { #33
+        Name => 'LensType',
+        Format => 'int16uRev', # value is big-endian
+        SeparateTable => 1,
+        PrintConv => \%canonLensTypes,
+    },
+    0x107 => { #PH
+        Name => 'FirmwareVersion',
+        Format => 'string[6]',
+    },
+    0x10f => { #20
+        Name => 'OwnerName',
+        Format => 'string[32]',
+    },
+    0x133 => { #20
+        Name => 'DirectoryIndex',
+        Groups => { 2 => 'Image' },
+        Format => 'int32u',
+    },
+    0x13f => { #20
+        Name => 'FileIndex',
+        Groups => { 2 => 'Image' },
+        Format => 'int32u',
+        ValueConv => '$val + 1',
+        ValueConvInv => '$val - 1',
+    },
+    0x263 => { #PH
+        Name => 'PictureStyleInfo',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Canon::PSInfo',
+        },
+    },
+    0x933 => { #33
+        Name => 'LensModel',
+        Format => 'string[64]',
+    },
+);
+
+# Canon camera information for 500D (MakerNotes tag 0x0d) (ref PH)
+%Image::ExifTool::Canon::CameraInfo500D = (
+    %binaryDataAttrs,
+    FORMAT => 'int8u',
+    FIRST_ENTRY => 0,
+    PRIORITY => 0,
+    IS_SUBDIR => [ 0x30b ],
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'CameraInfo tags for the EOS 500D.',
+    0x03 => { %ciFNumber },
+    0x04 => { %ciExposureTime },
+    0x06 => { %ciISO },
+    0x07 => {
+        Name => 'HighlightTonePriority',
+        PrintConv => { 0 => 'Off', 1 => 'On' },
+    },
+    0x15 => { #PH (580 EX II)
+        Name => 'FlashMeteringMode',
+        PrintConv => {
+            0 => 'E-TTL',
+            3 => 'TTL',
+            4 => 'External Auto',
+            5 => 'External Manual',
+            6 => 'Off',
+        },
+    },
+    0x19 => { %ciCameraTemperature },
+    0x1e => { %ciFocalLength },
+    0x31 => {
+        Name => 'CameraOrientation',
+        PrintConv => {
+            0 => 'Horizontal (normal)',
+            1 => 'Rotate 90 CW',
+            2 => 'Rotate 270 CW',
+        },
+    },
+    0x50 => {
+        Name => 'FocusDistanceUpper',
+        %focusDistanceByteSwap,
+    },
+    0x52 => {
+        Name => 'FocusDistanceLower',
+        %focusDistanceByteSwap,
+    },
+    0x73 => { # (50D + 4)
+        Name => 'WhiteBalance',
+        Format => 'int16u',
+        SeparateTable => 1,
+        PrintConv => \%canonWhiteBalance,
+    },
+    0x77 => { # (50D + 4)
+        Name => 'ColorTemperature',
+        Format => 'int16u',
+    },
+    0xab => { # (50D + 4)
+        Name => 'PictureStyle',
+        Format => 'int8u',
+        Flags => ['PrintHex','SeparateTable'],
+        PrintConv => \%pictureStyles,
+    },
+    0xbc => {
+        Name => 'HighISONoiseReduction',
+        PrintConv => {
+            0 => 'Standard',
+            1 => 'Low',
+            2 => 'Strong',
+            3 => 'Off',
+        },
+    },
+    0xbe => {
+        Name => 'AutoLightingOptimizer',
+        PrintConv => {
+            0 => 'Standard',
+            1 => 'Low',
+            2 => 'Strong',
+            3 => 'Off',
+        },
+    },
+    0xf6 => {
+        Name => 'LensType',
+        Format => 'int16uRev', # value is big-endian
+        SeparateTable => 1,
+        PrintConv => \%canonLensTypes,
+    },
+    0xf8 => { %ciShortFocal },
+    0xfa => { %ciLongFocal },
+    0x190 => {
+        Name => 'FirmwareVersion',
+        Format => 'string[6]',
+        Writable => 0,
+        RawConv => '$val=~/^\d+\.\d+\.\d+\s*$/ ? $val : undef',
+    },
+    0x1d3 => {
+        Name => 'FileIndex',
+        Groups => { 2 => 'Image' },
+        Format => 'int32u',
+        ValueConv => '$val + 1',
+        ValueConvInv => '$val - 1',
+    },
+    0x1df => { #(NC)
+        Name => 'DirectoryIndex',
+        Groups => { 2 => 'Image' },
+        Format => 'int32u',
+        ValueConv => '$val - 1',
+        ValueConvInv => '$val + 1',
+    },
+    0x30b => {
+        Name => 'PictureStyleInfo',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Canon::PSInfo',
+        },
+    },
+);
+
+# Canon camera information for 550D (MakerNotes tag 0x0d) (ref PH)
+%Image::ExifTool::Canon::CameraInfo550D = (
+    %binaryDataAttrs,
+    FORMAT => 'int8u',
+    FIRST_ENTRY => 0,
+    PRIORITY => 0,
+    IS_SUBDIR => [ 0x31c ],
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'CameraInfo tags for the EOS 550D.',
+    0x03 => { %ciFNumber },
+    0x04 => { %ciExposureTime },
+    0x06 => { %ciISO },
+    0x07 => { #(NC)
+        Name => 'HighlightTonePriority',
+        PrintConv => { 0 => 'Off', 1 => 'On' },
+    },
+    0x15 => { #(NC)
+        Name => 'FlashMeteringMode',
+        PrintConv => {
+            0 => 'E-TTL',
+            3 => 'TTL',
+            4 => 'External Auto',
+            5 => 'External Manual',
+            6 => 'Off',
+        },
+    },
+    0x19 => { %ciCameraTemperature }, # (500D + 0)
+    0x1e => { %ciFocalLength }, # (500D + 0)
+    0x35 => { # (500D + 4)
+        Name => 'CameraOrientation',
+        PrintConv => {
+            0 => 'Horizontal (normal)',
+            1 => 'Rotate 90 CW',
+            2 => 'Rotate 270 CW',
+        },
+    },
+    0x54 => { # (500D + 4)
+        Name => 'FocusDistanceUpper',
+        %focusDistanceByteSwap,
+    },
+    0x56 => { # (500D + 4)
+        Name => 'FocusDistanceLower',
+        %focusDistanceByteSwap,
+    },
+    0x78 => { # (500D + 5) (NC)
+        Name => 'WhiteBalance',
+        Format => 'int16u',
+        SeparateTable => 1,
+        PrintConv => \%canonWhiteBalance,
+    },
+    0x7c => { # (500D + 5)
+        Name => 'ColorTemperature',
+        Format => 'int16u',
+    },
+    0xb0 => { # (500D + 5)
+        Name => 'PictureStyle',
+        Format => 'int8u',
+        Flags => ['PrintHex','SeparateTable'],
+        PrintConv => \%pictureStyles,
+    },
+    0xff => { # (500D + 9)
+        Name => 'LensType',
+        Format => 'int16uRev', # value is big-endian
+        SeparateTable => 1,
+        PrintConv => \%canonLensTypes,
+    },
+    0x101 => { %ciShortFocal }, # (500D + 9)
+    0x103 => { %ciLongFocal }, # (500D + 9)
+    0x1a4 => { # (500D + 0x11)
+        Name => 'FirmwareVersion',
+        Format => 'string[6]',
+        Writable => 0,
+        RawConv => '$val=~/^\d+\.\d+\.\d+\s*$/ ? $val : undef',
+    },
+    0x1e4 => { # (500D + 0x11)
+        Name => 'FileIndex',
+        Groups => { 2 => 'Image' },
+        Format => 'int32u',
+        ValueConv => '$val + 1',
+        ValueConvInv => '$val - 1',
+    },
+    0x1f0 => { # (500D + 0x11) (NC)
+        Name => 'DirectoryIndex',
+        Groups => { 2 => 'Image' },
+        Format => 'int32u',
+        ValueConv => '$val - 1',
+        ValueConvInv => '$val + 1',
+    },
+    0x31c => { #48
+        Name => 'PictureStyleInfo',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Canon::PSInfo',
+        },
+    },
+);
+
+# Canon camera information for 1000D (MakerNotes tag 0x0d) (ref PH)
+%Image::ExifTool::Canon::CameraInfo1000D = (
+    %binaryDataAttrs,
+    FORMAT => 'int8u',
+    FIRST_ENTRY => 0,
+    PRIORITY => 0,
+    IS_SUBDIR => [ 0x267 ],
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'CameraInfo tags for the EOS 1000D.',
+    0x03 => { %ciFNumber }, #PH
+    0x04 => { %ciExposureTime }, #PH
+    0x06 => { %ciISO }, #PH
+    0x15 => { #PH (580 EX II)
+        Name => 'FlashMeteringMode',
+        PrintConv => {
+            0 => 'E-TTL',
+            3 => 'TTL',
+            4 => 'External Auto',
+            5 => 'External Manual',
+            6 => 'Off',
+        },
+    },
+    0x18 => { %ciCameraTemperature }, #36
+    0x1b => { %ciMacroMagnification }, #PH (NC)
+    0x1d => { %ciFocalLength }, #PH
+    0x30 => { #20
+        Name => 'CameraOrientation',
+        PrintConv => {
+            0 => 'Horizontal (normal)',
+            1 => 'Rotate 90 CW',
+            2 => 'Rotate 270 CW',
+        },
+    },
+    0x43 => { #20
+        Name => 'FocusDistanceUpper',
+        %focusDistanceByteSwap,
+    },
+    0x45 => { #20
+        Name => 'FocusDistanceLower',
+        %focusDistanceByteSwap,
+    },
+    0x6f => { #PH
+        Name => 'WhiteBalance',
+        Format => 'int16u',
+        PrintConv => \%canonWhiteBalance,
+        SeparateTable => 1,
+    },
+    0x73 => { #PH
+        Name => 'ColorTemperature',
+        Format => 'int16u',
+    },
+    0xe2 => { #PH
+        Name => 'LensType',
+        Format => 'int16uRev', # value is big-endian
+        SeparateTable => 1,
+        PrintConv => \%canonLensTypes,
+    },
+    0x10b => { #PH
+        Name => 'FirmwareVersion',
+        Format => 'string[6]',
+    },
+    0x137 => { #PH (NC)
+        Name => 'DirectoryIndex',
+        Groups => { 2 => 'Image' },
+        Format => 'int32u',
+    },
+    0x143 => { #PH
+        Name => 'FileIndex',
+        Groups => { 2 => 'Image' },
+        Format => 'int32u',
+        ValueConv => '$val + 1',
+        ValueConvInv => '$val - 1',
+    },
+    0x267 => { #PH
+        Name => 'PictureStyleInfo',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Canon::PSInfo',
+        },
+    },
+    0x937 => { #PH
+        Name => 'LensModel',
+        Format => 'string[64]',
+    },
+);
+
+# Canon camera information for PowerShot models (MakerNotes tag 0x0d) - PH
+%Image::ExifTool::Canon::CameraInfoPowerShot = (
+    %binaryDataAttrs,
+    FORMAT => 'int32s',
+    FIRST_ENTRY => 0,
+    PRIORITY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => q{
+        CameraInfo tags for PowerShot models such as the A450, A460, A550, A560,
+        A570, A630, A640, A650, A710, A720, G7, G9, S5, SD40, SD750, SD800, SD850,
+        SD870, SD900, SD950, SD1000, SX100 and TX1.
+    },
+    0x00 => {
+        Name => 'ISO',
+        Groups => { 2 => 'Image' },
+        ValueConv => '100*exp((($val-411)/96)*log(2))',
+        ValueConvInv => 'log($val/100)/log(2)*96+411',
+        PrintConv => 'sprintf("%.0f",$val)',
+        PrintConvInv => '$val',
+    },
+    0x05 => {
+        Name => 'FNumber',
+        Groups => { 2 => 'Image' },
+        ValueConv => 'exp($val/192*log(2))',
+        ValueConvInv => 'log($val)*192/log(2)',
+        PrintConv => 'sprintf("%.2g",$val)',
+        PrintConvInv => '$val',
+    },
+    0x06 => {
+        Name => 'ExposureTime',
+        Groups => { 2 => 'Image' },
+        ValueConv => 'exp(-$val/96*log(2))',
+        ValueConvInv => '-log($val)*96/log(2)',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    0x17 => 'Rotation', # usually the same as Orientation (but not always! why?)
+    # 0x25 - flash fired/not fired (ref 37)
+    # 0x26 - related to flash mode? (ref 37)
+    # 0x37 - related to flash strength (ref 37)
+    # 0x38 - pre-flash fired/no fired or flash data collection (ref 37)
+    135 => { # [-3] <-- index relative to CameraInfoCount
+        Name => 'CameraTemperature',
+        Condition => '$$self{CameraInfoCount} == 138',
+        Notes => 'A450, A460, A550, A630, A640 and A710',
+        PrintConv => '"$val C"',
+        PrintConvInv => '$val=~s/ ?C//; $val',
+    },
+    145 => { #37 [-3]
+        Name => 'CameraTemperature',
+        Condition => '$$self{CameraInfoCount} == 148',
+        Notes => q{
+            A560, A570, A650, A720, G7, G9, S5, SD40, SD750, SD800, SD850, SD870, SD900,
+            SD950, SD1000, SX100 and TX1
+        },
+        PrintConv => '"$val C"',
+        PrintConvInv => '$val=~s/ ?C//; $val',
+    },
+);
+
+# Canon camera information for some PowerShot models (MakerNotes tag 0x0d) - PH
+%Image::ExifTool::Canon::CameraInfoPowerShot2 = (
+    %binaryDataAttrs,
+    FORMAT => 'int32s',
+    FIRST_ENTRY => 0,
+    PRIORITY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => q{
+        CameraInfo tags for PowerShot models such as the A470, A480, A490, A495,
+        A580, A590, A1000, A1100, A2000, A2100, A3000, A3100, D10, E1, G10, G11,
+        S90, S95, SD770, SD780, SD790, SD880, SD890, SD940, SD960, SD970, SD980,
+        SD990, SD1100, SD1200, SD1300, SD1400, SD3500, SD4000, SD4500, SX1, SX10,
+        SX20, SX110, SX120, SX130, SX200 and SX210.
+    },
+    0x01 => {
+        Name => 'ISO',
+        Groups => { 2 => 'Image' },
+        ValueConv => '100*exp((($val-411)/96)*log(2))',
+        ValueConvInv => 'log($val/100)/log(2)*96+411',
+        PrintConv => 'sprintf("%.0f",$val)',
+        PrintConvInv => '$val',
+    },
+    0x06 => {
+        Name => 'FNumber',
+        Groups => { 2 => 'Image' },
+        ValueConv => 'exp($val/192*log(2))',
+        ValueConvInv => 'log($val)*192/log(2)',
+        PrintConv => 'sprintf("%.2g",$val)',
+        PrintConvInv => '$val',
+    },
+    0x07 => {
+        Name => 'ExposureTime',
+        Groups => { 2 => 'Image' },
+        ValueConv => 'exp(-$val/96*log(2))',
+        ValueConvInv => '-log($val)*96/log(2)',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    0x18 => 'Rotation',
+    153 => { # [-3] <-- index relative to CameraInfoCount
+        Name => 'CameraTemperature',
+        Condition => '$$self{CameraInfoCount} == 156',
+        Notes => 'A470, A580, A590, SD770, SD790, SD890 and SD1100',
+        PrintConv => '"$val C"',
+        PrintConvInv => '$val=~s/ ?C//; $val',
+    },
+    159 => { # [-3]
+        Name => 'CameraTemperature',
+        Condition => '$$self{CameraInfoCount} == 162',
+        Notes => 'A1000, A2000, E1, G10, SD880, SD990, SX1, SX10 and SX110',
+        PrintConv => '"$val C"',
+        PrintConvInv => '$val=~s/ ?C//; $val',
+    },
+    164 => { # [-3]
+        Name => 'CameraTemperature',
+        Condition => '$$self{CameraInfoCount} == 167',
+        Notes => 'A480, A1100, A2100, D10, SD780, SD960, SD970, SD1200 and SX200',
+        PrintConv => '"$val C"',
+        PrintConvInv => '$val=~s/ ?C//; $val',
+    },
+    168 => { # [-3]
+        Name => 'CameraTemperature',
+        Condition => '$$self{CameraInfoCount} == 171',
+        Notes => q{
+            A490, A495, A3000, A3100, G11, S90, SD940, SD980, SD1300, SD1400, SD3500,
+            SD4000, SX20, SX120 and SX210
+        },
+        PrintConv => '"$val C"',
+        PrintConvInv => '$val=~s/ ?C//; $val',
+    },
+    261 => { # [-3]
+        Name => 'CameraTemperature',
+        Condition => '$$self{CameraInfoCount} == 264',
+        Notes => 'S95, SD4500 and SX130',
+        PrintConv => '"$val C"',
+        PrintConvInv => '$val=~s/ ?C//; $val',
+    },
+);
+
+# unknown Canon camera information (MakerNotes tag 0x0d) - PH
+%Image::ExifTool::Canon::CameraInfoUnknown32 = (
+    %binaryDataAttrs,
+    FORMAT => 'int32s',
+    FIRST_ENTRY => 0,
+    PRIORITY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'Unknown CameraInfo tags are divided into 3 tables based on format size.',
+    71 => { # [-1] <-- index relative to CameraInfoCount
+        Name => 'CameraTemperature',
+        Condition => '$$self{CameraInfoCount} == 72',
+        Notes => 'S1',
+        PrintConv => '"$val C"',
+        PrintConvInv => '$val=~s/ ?C//; $val',
+    },
+    83 => { # [-2]
+        Name => 'CameraTemperature',
+        Condition => '$$self{CameraInfoCount} == 85',
+        Notes => 'S2',
+        PrintConv => '"$val C"',
+        PrintConvInv => '$val=~s/ ?C//; $val',
+    },
+    91 => { # [-2 or -3]
+        Name => 'CameraTemperature',
+        Condition => '$$self{CameraInfoCount} == 93 or $$self{CameraInfoCount} == 94',
+        Notes => 'A410, A610, A620, S80, SD30, SD400, SD430, SD450, SD500 and SD550',
+        PrintConv => '"$val C"',
+        PrintConvInv => '$val=~s/ ?C//; $val',
+    },
+    92 => { # [-4]
+        Name => 'CameraTemperature',
+        Condition => '$$self{CameraInfoCount} == 96',
+        Notes => 'S3',
+        PrintConv => '"$val C"',
+        PrintConvInv => '$val=~s/ ?C//; $val',
+    },
+    100 => { # [-4]
+        Name => 'CameraTemperature',
+        Condition => '$$self{CameraInfoCount} == 104',
+        Notes => 'A420, A430, A530, A540, A700, SD600, SD630 and SD700',
+        PrintConv => '"$val C"',
+        PrintConvInv => '$val=~s/ ?C//; $val',
+    },
+    466 => { # [-3]
+        Name => 'CameraTemperature',
+        Condition => '$$self{CameraInfoCount} == 469',
+        Notes => 'A1200, A2200, A3200, A3300, 100HS, 300HS and 500HS',
+        PrintConv => '"$val C"',
+        PrintConvInv => '$val=~s/ ?C//; $val',
+    },
+    503 => { # [-3]
+        Name => 'CameraTemperature',
+        Condition => '$$self{CameraInfoCount} == 506',
+        Notes => 'A800',
+        PrintConv => '"$val C"',
+        PrintConvInv => '$val=~s/ ?C//; $val',
+    },
+    506 => { # [-3]
+        Name => 'CameraTemperature',
+        Condition => '$$self{CameraInfoCount} == 509',
+        Notes => 'SX230HS',
+        PrintConv => '"$val C"',
+        PrintConvInv => '$val=~s/ ?C//; $val',
+    },
+);
+
+# unknown Canon camera information (MakerNotes tag 0x0d) - PH
+%Image::ExifTool::Canon::CameraInfoUnknown16 = (
+    %binaryDataAttrs,
+    FORMAT => 'int16s',
+    FIRST_ENTRY => 0,
+    PRIORITY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+);
+
+# unknown Canon camera information (MakerNotes tag 0x0d) - PH
+%Image::ExifTool::Canon::CameraInfoUnknown = (
+    %binaryDataAttrs,
+    FORMAT => 'int8s',
+    FIRST_ENTRY => 0,
+    PRIORITY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+);
+
+# Picture Style information for various cameras (ref 48)
+%Image::ExifTool::Canon::PSInfo = (
+    %binaryDataAttrs,
+    FIRST_ENTRY => 0,
+    PRIORITY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'Custom picture style information for various models.',
+    # (values expected to be "n/a" are flagged as Unknown)
+    0x00 => { Name => 'ContrastStandard',      %psInfo },
+    0x04 => { Name => 'SharpnessStandard',     %psInfo },
+    0x08 => { Name => 'SaturationStandard',    %psInfo },
+    0x0c => { Name => 'ColorToneStandard',     %psInfo },
+    0x10 => { Name => 'FilterEffectStandard',  %psInfo, Unknown => 1 },
+    0x14 => { Name => 'ToningEffectStandard',  %psInfo, Unknown => 1 },
+    0x18 => { Name => 'ContrastPortrait',      %psInfo },
+    0x1c => { Name => 'SharpnessPortrait',     %psInfo },
+    0x20 => { Name => 'SaturationPortrait',    %psInfo },
+    0x24 => { Name => 'ColorTonePortrait',     %psInfo },
+    0x28 => { Name => 'FilterEffectPortrait',  %psInfo, Unknown => 1 },
+    0x2c => { Name => 'ToningEffectPortrait',  %psInfo, Unknown => 1 },
+    0x30 => { Name => 'ContrastLandscape',     %psInfo },
+    0x34 => { Name => 'SharpnessLandscape',    %psInfo },
+    0x38 => { Name => 'SaturationLandscape',   %psInfo },
+    0x3c => { Name => 'ColorToneLandscape',    %psInfo },
+    0x40 => { Name => 'FilterEffectLandscape', %psInfo, Unknown => 1 },
+    0x44 => { Name => 'ToningEffectLandscape', %psInfo, Unknown => 1 },
+    0x48 => { Name => 'ContrastNeutral',       %psInfo },
+    0x4c => { Name => 'SharpnessNeutral',      %psInfo },
+    0x50 => { Name => 'SaturationNeutral',     %psInfo },
+    0x54 => { Name => 'ColorToneNeutral',      %psInfo },
+    0x58 => { Name => 'FilterEffectNeutral',   %psInfo, Unknown => 1 },
+    0x5c => { Name => 'ToningEffectNeutral',   %psInfo, Unknown => 1 },
+    0x60 => { Name => 'ContrastFaithful',      %psInfo },
+    0x64 => { Name => 'SharpnessFaithful',     %psInfo },
+    0x68 => { Name => 'SaturationFaithful',    %psInfo },
+    0x6c => { Name => 'ColorToneFaithful',     %psInfo },
+    0x70 => { Name => 'FilterEffectFaithful',  %psInfo, Unknown => 1 },
+    0x74 => { Name => 'ToningEffectFaithful',  %psInfo, Unknown => 1 },
+    0x78 => { Name => 'ContrastMonochrome',    %psInfo },
+    0x7c => { Name => 'SharpnessMonochrome',   %psInfo },
+    0x80 => { Name => 'SaturationMonochrome',  %psInfo, Unknown => 1 },
+    0x84 => { Name => 'ColorToneMonochrome',   %psInfo, Unknown => 1 },
+    0x88 => { Name => 'FilterEffectMonochrome',%psInfo,
+        PrintConv => {
+            0 => 'None',
+            1 => 'Yellow',
+            2 => 'Orange',
+            3 => 'Red',
+            4 => 'Green',
+            -559038737 => 'n/a', # (0xdeadbeef)
+        },
+    },
+    0x8c => { Name => 'ToningEffectMonochrome',%psInfo,
+        PrintConv => {
+            0 => 'None',
+            1 => 'Sepia',
+            2 => 'Blue',
+            3 => 'Purple',
+            4 => 'Green',
+            -559038737 => 'n/a', # (0xdeadbeef)
+        },
+    },
+    0x90 => { Name => 'ContrastUserDef1',      %psInfo },
+    0x94 => { Name => 'SharpnessUserDef1',     %psInfo },
+    0x98 => { Name => 'SaturationUserDef1',    %psInfo },
+    0x9c => { Name => 'ColorToneUserDef1',     %psInfo },
+    0xa0 => { Name => 'FilterEffectUserDef1',  %psInfo,
+        PrintConv => {
+            0 => 'None',
+            1 => 'Yellow',
+            2 => 'Orange',
+            3 => 'Red',
+            4 => 'Green',
+            -559038737 => 'n/a', # (0xdeadbeef)
+        },
+    },
+    0xa4 => { Name => 'ToningEffectUserDef1',  %psInfo,
+        PrintConv => {
+            0 => 'None',
+            1 => 'Sepia',
+            2 => 'Blue',
+            3 => 'Purple',
+            4 => 'Green',
+            -559038737 => 'n/a', # (0xdeadbeef)
+        },
+    },
+    0xa8 => { Name => 'ContrastUserDef2',      %psInfo },
+    0xac => { Name => 'SharpnessUserDef2',     %psInfo },
+    0xb0 => { Name => 'SaturationUserDef2',    %psInfo },
+    0xb4 => { Name => 'ColorToneUserDef2',     %psInfo },
+    0xb8 => { Name => 'FilterEffectUserDef2',  %psInfo,
+        PrintConv => {
+            0 => 'None',
+            1 => 'Yellow',
+            2 => 'Orange',
+            3 => 'Red',
+            4 => 'Green',
+            -559038737 => 'n/a', # (0xdeadbeef)
+        },
+    },
+    0xbc => { Name => 'ToningEffectUserDef2',  %psInfo,
+        PrintConv => {
+            0 => 'None',
+            1 => 'Sepia',
+            2 => 'Blue',
+            3 => 'Purple',
+            4 => 'Green',
+            -559038737 => 'n/a', # (0xdeadbeef)
+        },
+    },
+    0xc0 => { Name => 'ContrastUserDef3',      %psInfo },
+    0xc4 => { Name => 'SharpnessUserDef3',     %psInfo },
+    0xc8 => { Name => 'SaturationUserDef3',    %psInfo },
+    0xcc => { Name => 'ColorToneUserDef3',     %psInfo },
+    0xd0 => { Name => 'FilterEffectUserDef3',  %psInfo,
+        PrintConv => {
+            0 => 'None',
+            1 => 'Yellow',
+            2 => 'Orange',
+            3 => 'Red',
+            4 => 'Green',
+            -559038737 => 'n/a', # (0xdeadbeef)
+        },
+    },
+    0xd4 => { Name => 'ToningEffectUserDef3',  %psInfo,
+        PrintConv => {
+            0 => 'None',
+            1 => 'Sepia',
+            2 => 'Blue',
+            3 => 'Purple',
+            4 => 'Green',
+            -559038737 => 'n/a', # (0xdeadbeef)
+        },
+    },
+    # base picture style names:
+    0xd8 => {
+        Name => 'UserDef1PictureStyle',
+        Format => 'int16u',
+        SeparateTable => 'UserDefStyle',
+        PrintConv => \%userDefStyles,
+    },
+    0xda => {
+        Name => 'UserDef2PictureStyle',
+        Format => 'int16u',
+        SeparateTable => 'UserDefStyle',
+        PrintConv => \%userDefStyles,
+    },
+    0xdc => {
+        Name => 'UserDef3PictureStyle',
+        Format => 'int16u',
+        SeparateTable => 'UserDefStyle',
+        PrintConv => \%userDefStyles,
+    },
+);
+
+# Picture Style information for the 60D (ref 48)
+%Image::ExifTool::Canon::PSInfo2 = (
+    %binaryDataAttrs,
+    FIRST_ENTRY => 0,
+    PRIORITY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'Custom picture style information for the EOS 60D.',
+    # (values expected to be "n/a" are flagged as Unknown)
+    0x00 => { Name => 'ContrastStandard',      %psInfo },
+    0x04 => { Name => 'SharpnessStandard',     %psInfo },
+    0x08 => { Name => 'SaturationStandard',    %psInfo },
+    0x0c => { Name => 'ColorToneStandard',     %psInfo },
+    0x10 => { Name => 'FilterEffectStandard',  %psInfo, Unknown => 1 },
+    0x14 => { Name => 'ToningEffectStandard',  %psInfo, Unknown => 1 },
+    0x18 => { Name => 'ContrastPortrait',      %psInfo },
+    0x1c => { Name => 'SharpnessPortrait',     %psInfo },
+    0x20 => { Name => 'SaturationPortrait',    %psInfo },
+    0x24 => { Name => 'ColorTonePortrait',     %psInfo },
+    0x28 => { Name => 'FilterEffectPortrait',  %psInfo, Unknown => 1 },
+    0x2c => { Name => 'ToningEffectPortrait',  %psInfo, Unknown => 1 },
+    0x30 => { Name => 'ContrastLandscape',     %psInfo },
+    0x34 => { Name => 'SharpnessLandscape',    %psInfo },
+    0x38 => { Name => 'SaturationLandscape',   %psInfo },
+    0x3c => { Name => 'ColorToneLandscape',    %psInfo },
+    0x40 => { Name => 'FilterEffectLandscape', %psInfo, Unknown => 1 },
+    0x44 => { Name => 'ToningEffectLandscape', %psInfo, Unknown => 1 },
+    0x48 => { Name => 'ContrastNeutral',       %psInfo },
+    0x4c => { Name => 'SharpnessNeutral',      %psInfo },
+    0x50 => { Name => 'SaturationNeutral',     %psInfo },
+    0x54 => { Name => 'ColorToneNeutral',      %psInfo },
+    0x58 => { Name => 'FilterEffectNeutral',   %psInfo, Unknown => 1 },
+    0x5c => { Name => 'ToningEffectNeutral',   %psInfo, Unknown => 1 },
+    0x60 => { Name => 'ContrastFaithful',      %psInfo },
+    0x64 => { Name => 'SharpnessFaithful',     %psInfo },
+    0x68 => { Name => 'SaturationFaithful',    %psInfo },
+    0x6c => { Name => 'ColorToneFaithful',     %psInfo },
+    0x70 => { Name => 'FilterEffectFaithful',  %psInfo, Unknown => 1 },
+    0x74 => { Name => 'ToningEffectFaithful',  %psInfo, Unknown => 1 },
+    0x78 => { Name => 'ContrastMonochrome',    %psInfo },
+    0x7c => { Name => 'SharpnessMonochrome',   %psInfo },
+    0x80 => { Name => 'SaturationMonochrome',  %psInfo, Unknown => 1 },
+    0x84 => { Name => 'ColorToneMonochrome',   %psInfo, Unknown => 1 },
+    0x88 => { Name => 'FilterEffectMonochrome',%psInfo,
+        PrintConv => {
+            0 => 'None',
+            1 => 'Yellow',
+            2 => 'Orange',
+            3 => 'Red',
+            4 => 'Green',
+            -559038737 => 'n/a', # (0xdeadbeef)
+        },
+    },
+    0x8c => { Name => 'ToningEffectMonochrome',%psInfo,
+        PrintConv => {
+            0 => 'None',
+            1 => 'Sepia',
+            2 => 'Blue',
+            3 => 'Purple',
+            4 => 'Green',
+            -559038737 => 'n/a', # (0xdeadbeef)
+        },
+    },
+    0x90 => { Name => 'ContrastUnknown',        %psInfo, Unknown => 1 },
+    0x94 => { Name => 'SharpnessUnknown',       %psInfo, Unknown => 1 },
+    0x98 => { Name => 'SaturationUnknown',      %psInfo, Unknown => 1 },
+    0x9c => { Name => 'ColorToneUnknown',       %psInfo, Unknown => 1 },
+    0xa0 => { Name => 'FilterEffectUnknown',    %psInfo, Unknown => 1,
+        PrintConv => {
+            0 => 'None',
+            1 => 'Yellow',
+            2 => 'Orange',
+            3 => 'Red',
+            4 => 'Green',
+            -559038737 => 'n/a', # (0xdeadbeef)
+        },
+    },
+    0xa4 => { Name => 'ToningEffectUnknown',    %psInfo, Unknown => 1,
+        PrintConv => {
+            0 => 'None',
+            1 => 'Sepia',
+            2 => 'Blue',
+            3 => 'Purple',
+            4 => 'Green',
+            -559038737 => 'n/a', # (0xdeadbeef)
+        },
+    },
+    0xa8 => { Name => 'ContrastUserDef1',      %psInfo },
+    0xac => { Name => 'SharpnessUserDef1',     %psInfo },
+    0xb0 => { Name => 'SaturationUserDef1',    %psInfo },
+    0xb4 => { Name => 'ColorToneUserDef1',     %psInfo },
+    0xb8 => { Name => 'FilterEffectUserDef1',  %psInfo,
+        PrintConv => {
+            0 => 'None',
+            1 => 'Yellow',
+            2 => 'Orange',
+            3 => 'Red',
+            4 => 'Green',
+            -559038737 => 'n/a', # (0xdeadbeef)
+        },
+    },
+    0xbc => { Name => 'ToningEffectUserDef1',  %psInfo,
+        PrintConv => {
+            0 => 'None',
+            1 => 'Sepia',
+            2 => 'Blue',
+            3 => 'Purple',
+            4 => 'Green',
+            -559038737 => 'n/a', # (0xdeadbeef)
+        },
+    },
+    0xc0 => { Name => 'ContrastUserDef2',      %psInfo },
+    0xc4 => { Name => 'SharpnessUserDef2',     %psInfo },
+    0xc8 => { Name => 'SaturationUserDef2',    %psInfo },
+    0xcc => { Name => 'ColorToneUserDef2',     %psInfo },
+    0xd0 => { Name => 'FilterEffectUserDef2',  %psInfo,
+        PrintConv => {
+            0 => 'None',
+            1 => 'Yellow',
+            2 => 'Orange',
+            3 => 'Red',
+            4 => 'Green',
+            -559038737 => 'n/a', # (0xdeadbeef)
+        },
+    },
+    0xd4 => { Name => 'ToningEffectUserDef2',  %psInfo,
+        PrintConv => {
+            0 => 'None',
+            1 => 'Sepia',
+            2 => 'Blue',
+            3 => 'Purple',
+            4 => 'Green',
+            -559038737 => 'n/a', # (0xdeadbeef)
+        },
+    },
+    0xd8 => { Name => 'ContrastUserDef3',      %psInfo },
+    0xdc => { Name => 'SharpnessUserDef3',     %psInfo },
+    0xe0 => { Name => 'SaturationUserDef3',    %psInfo },
+    0xe4 => { Name => 'ColorToneUserDef3',     %psInfo },
+    0xe8 => { Name => 'FilterEffectUserDef3',  %psInfo,
+        PrintConv => {
+            0 => 'None',
+            1 => 'Yellow',
+            2 => 'Orange',
+            3 => 'Red',
+            4 => 'Green',
+            -559038737 => 'n/a', # (0xdeadbeef)
+        },
+    },
+    0xec => { Name => 'ToningEffectUserDef3',  %psInfo,
+        PrintConv => {
+            0 => 'None',
+            1 => 'Sepia',
+            2 => 'Blue',
+            3 => 'Purple',
+            4 => 'Green',
+            -559038737 => 'n/a', # (0xdeadbeef)
+        },
+    },
+    # base picture style names:
+    0xf0 => {
+        Name => 'UserDef1PictureStyle',
+        Format => 'int16u',
+        SeparateTable => 'UserDefStyle',
+        PrintConv => \%userDefStyles,
+    },
+    0xf2 => {
+        Name => 'UserDef2PictureStyle',
+        Format => 'int16u',
+        SeparateTable => 'UserDefStyle',
+        PrintConv => \%userDefStyles,
+    },
+    0xf4 => {
+        Name => 'UserDef3PictureStyle',
+        Format => 'int16u',
+        SeparateTable => 'UserDefStyle',
+        PrintConv => \%userDefStyles,
+    },
+);
+
+# Movie information (MakerNotes tag 0x11) (ref PH)
+%Image::ExifTool::Canon::MovieInfo = (
+    %binaryDataAttrs,
+    FORMAT => 'int16u',
+    FIRST_ENTRY => 1,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Video' },
+    NOTES => 'Tags written by some Canon cameras when recording video.',
+    1 => { # (older PowerShot AVI)
+        Name => 'FrameRate',
+        RawConv => '$val == 65535 ? undef: $val',
+        ValueConvInv => '$val > 65535 ? 65535 : $val',
+    },
+    2 => { # (older PowerShot AVI)
+        Name => 'FrameCount',
+        RawConv => '$val == 65535 ? undef: $val',
+        ValueConvInv => '$val > 65535 ? 65535 : $val',
+    },
+    # 3 - values: 0x0001 (older PowerShot AVI), 0x4004, 0x4005
+    4 => {
+        Name => 'FrameCount',
+        Format => 'int32u',
+    },
+    6 => {
+        Name => 'FrameRate',
+        Format => 'rational32u',
+        PrintConv => 'int($val * 1000 + 0.5) / 1000',
+        PrintConvInv => '$val',
+    },
+    # 9/10 - same as 6/7 (FrameRate)
+    106 => {
+        Name => 'Duration',
+        Format => 'int32u',
+        ValueConv => '$val / 1000',
+        ValueConvInv => '$val * 1000',
+        PrintConv => 'ConvertDuration($val)',
+        PrintConvInv => q{
+            my @a = ($val =~ /\d+(?:\.\d*)?/g);
+            $val  = pop(@a) || 0;         # seconds
+            $val += pop(@a) *   60 if @a; # minutes
+            $val += pop(@a) * 3600 if @a; # hours
+            return $val;
+        },
+    },
+    108 => {
+        Name => 'AudioBitrate',
+        Groups => { 2 => 'Audio' },
+        Format => 'int32u',
+        PrintConv => 'ConvertBitrate($val)',
+        PrintConvInv => q{
+            $val =~ /^(\d+(?:\.\d*)?) ?([kMG]?bps)?$/ or return undef;
+            return $1 * {bps=>1,kbps=>1000,Mbps=>1000000,Gbps=>1000000000}->{$2 || 'bps'};
+        },
+    },
+    110 => {
+        Name => 'AudioSampleRate',
+        Groups => { 2 => 'Audio' },
+        Format => 'int32u',
+    },
+    112 => { # (guess)
+        Name => 'AudioChannels',
+        Groups => { 2 => 'Audio' },
+        Format => 'int32u',
+    },
+    # 114 - values: 0 (60D), 1 (S95)
+    116 => {
+        Name => 'VideoCodec',
+        Format => 'undef[4]',
+        # swap bytes if little endian
+        RawConv => 'GetByteOrder() eq "MM" ? $val : pack("N",unpack("V",$val))',
+        RawConvInv => 'GetByteOrder() eq "MM" ? $val : pack("N",unpack("V",$val))',
+    },
+    # 125 - same as 10
+);
+
+# AF information (MakerNotes tag 0x12) - PH
+%Image::ExifTool::Canon::AFInfo = (
+    PROCESS_PROC => \&ProcessSerialData,
+    VARS => { ID_LABEL => 'Sequence' },
+    FORMAT => 'int16u',
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => q{
+        Auto-focus information used by many older Canon models.  The values in this
+        record are sequential, and some have variable sizes based on the value of
+        NumAFPoints (which may be 1,5,7,9,15,45 or 53).  The AFArea coordinates are
+        given in a system where the image has dimensions given by AFImageWidth and
+        AFImageHeight, and 0,0 is the image center. The direction of the Y axis
+        depends on the camera model, with positive Y upwards for EOS models, but
+        apparently downwards for PowerShot models.
+    },
+    0 => {
+        Name => 'NumAFPoints',
+    },
+    1 => {
+        Name => 'ValidAFPoints',
+        Notes => 'number of AF points valid in the following information',
+    },
+    2 => {
+        Name => 'CanonImageWidth',
+        Groups => { 2 => 'Image' },
+    },
+    3 => {
+        Name => 'CanonImageHeight',
+        Groups => { 2 => 'Image' },
+    },
+    4 => {
+        Name => 'AFImageWidth',
+        Notes => 'size of image in AF coordinates',
+    },
+    5 => 'AFImageHeight',
+    6 => 'AFAreaWidth',
+    7 => 'AFAreaHeight',
+    8 => {
+        Name => 'AFAreaXPositions',
+        Format => 'int16s[$val{0}]',
+    },
+    9 => {
+        Name => 'AFAreaYPositions',
+        Format => 'int16s[$val{0}]',
+    },
+    10 => {
+        Name => 'AFPointsInFocus',
+        Format => 'int16s[int(($val{0}+15)/16)]',
+        PrintConv => 'Image::ExifTool::DecodeBits($val, undef, 16)',
+    },
+    11 => [
+        {
+            Name => 'PrimaryAFPoint',
+            Condition => q{
+                $$self{Model} !~ /EOS/ and
+                (not $$self{AFInfoCount} or $$self{AFInfoCount} != 36)
+            },
+        },
+        {
+            # (some PowerShot 9-point systems put PrimaryAFPoint after 8 unknown values)
+            Name => 'Canon_AFInfo_0x000b',
+            Condition => '$$self{Model} !~ /EOS/',
+            Format => 'int16u[8]',
+            Unknown => 1,
+        },
+        # (serial processing stops here for EOS cameras)
+    ],
+    12 => 'PrimaryAFPoint',
+);
+
+# newer AF information (MakerNotes tag 0x26) - PH (A570IS,1DmkIII,40D)
+# (Note: this tag is out of sequence in A570IS maker notes)
+%Image::ExifTool::Canon::AFInfo2 = (
+    PROCESS_PROC => \&ProcessSerialData,
+    VARS => { ID_LABEL => 'Sequence' },
+    FORMAT => 'int16u',
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => q{
+        Newer version of the AFInfo record containing much of the same information
+        (and coordinate confusion) as the older version.  In this record, values of
+        9 and 45 have been observed for NumAFPoints.
+    },
+    0 => {
+        Name => 'AFInfoSize',
+        Unknown => 1, # normally don't print this out
+    },
+    1 => {
+        Name => 'AFAreaMode',
+        PrintConv => {
+            0 => 'Off (Manual Focus)',
+            2 => 'Single-point AF',
+            4 => 'Multi-point AF or AI AF', # AiAF on A570IS
+            5 => 'Face Detect AF',
+            7 => 'Zone AF', #46
+            8 => 'AF Point Expansion', #46
+            9 => 'Spot AF', #46
+        },
+    },
+    2 => {
+        Name => 'NumAFPoints',
+        RawConv => '$$self{NumAFPoints} = $val', # save for later
+    },
+    3 => {
+        Name => 'ValidAFPoints',
+        Notes => 'number of AF points valid in the following information',
+    },
+    4 => {
+        Name => 'CanonImageWidth',
+        Groups => { 2 => 'Image' },
+    },
+    5 => {
+        Name => 'CanonImageHeight',
+        Groups => { 2 => 'Image' },
+    },
+    6 => {
+        Name => 'AFImageWidth',
+        Notes => 'size of image in AF coordinates',
+    },
+    7 => 'AFImageHeight',
+    8 => {
+        Name => 'AFAreaWidths',
+        Format => 'int16s[$val{2}]',
+    },
+    9 => {
+        Name => 'AFAreaHeights',
+        Format => 'int16s[$val{2}]',
+    },
+    10 => {
+        Name => 'AFAreaXPositions',
+        Format => 'int16s[$val{2}]',
+    },
+    11 => {
+        Name => 'AFAreaYPositions',
+        Format => 'int16s[$val{2}]',
+    },
+    12 => {
+        Name => 'AFPointsInFocus',
+        Format => 'int16s[int(($val{2}+15)/16)]',
+        PrintConv => 'Image::ExifTool::DecodeBits($val, undef, 16)',
+    },
+    13 => [
+        {
+            Name => 'AFPointsSelected',
+            Condition => '$$self{Model} =~ /EOS/',
+            Format => 'int16s[int(($val{2}+15)/16)]',
+            PrintConv => 'Image::ExifTool::DecodeBits($val, undef, 16)',
+        },
+        {
+            Name => 'Canon_AFInfo2_0x000d',
+            Format => 'int16s[int(($val{2}+15)/16)+1]',
+            Unknown => 1,
+        },
+    ],
+    14 => {
+        # usually, but not always, the lowest number AF point in focus
+        Name => 'PrimaryAFPoint',
+        Condition => '$$self{Model} !~ /EOS/',
+    },
+);
+
+# my color mode information (MakerNotes tag 0x1d) - PH (A570IS)
+%Image::ExifTool::Canon::MyColors = (
+    %binaryDataAttrs,
+    FORMAT => 'int16u',
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    0x02 => {
+        Name => 'MyColorMode',
+        PrintConvColumns => 2,
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Positive Film', #15 (SD600)
+            2 => 'Light Skin Tone', #15
+            3 => 'Dark Skin Tone', #15
+            4 => 'Vivid Blue', #15
+            5 => 'Vivid Green', #15
+            6 => 'Vivid Red', #15
+            7 => 'Color Accent', #15 (A610) (NC)
+            8 => 'Color Swap', #15 (A610)
+            9 => 'Custom',
+            12 => 'Vivid',
+            13 => 'Neutral',
+            14 => 'Sepia',
+            15 => 'B&W',
+        },
+    },
+);
+
+# face detect information (MakerNotes tag 0x24) - PH (A570IS)
+%Image::ExifTool::Canon::FaceDetect1 = (
+    %binaryDataAttrs,
+    FORMAT => 'int16u',
+    FIRST_ENTRY => 0,
+    DATAMEMBER => [ 0x02 ],
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    0x02 => {
+        Name => 'FacesDetected',
+        DataMember => 'FacesDetected',
+        RawConv => '$$self{FacesDetected} = $val',
+    },
+    0x03 => {
+        Name => 'FaceDetectFrameSize',
+        Format => 'int16u[2]',
+    },
+    0x08 => {
+        Name => 'Face1Position',
+        Format => 'int16s[2]',
+        RawConv => '$$self{FacesDetected} < 1 ? undef: $val',
+        Notes => q{
+            X-Y coordinates for the center of each face in the Face Detect frame at the
+            time of focus lock. "0 0" is the center, and positive X and Y are to the
+            right and downwards respectively
+        },
+    },
+    0x0a => {
+        Name => 'Face2Position',
+        Format => 'int16s[2]',
+        RawConv => '$$self{FacesDetected} < 2 ? undef : $val',
+    },
+    0x0c => {
+        Name => 'Face3Position',
+        Format => 'int16s[2]',
+        RawConv => '$$self{FacesDetected} < 3 ? undef : $val',
+    },
+    0x0e => {
+        Name => 'Face4Position',
+        Format => 'int16s[2]',
+        RawConv => '$$self{FacesDetected} < 4 ? undef : $val',
+    },
+    0x10 => {
+        Name => 'Face5Position',
+        Format => 'int16s[2]',
+        RawConv => '$$self{FacesDetected} < 5 ? undef : $val',
+    },
+    0x12 => {
+        Name => 'Face6Position',
+        Format => 'int16s[2]',
+        RawConv => '$$self{FacesDetected} < 6 ? undef : $val',
+    },
+    0x14 => {
+        Name => 'Face7Position',
+        Format => 'int16s[2]',
+        RawConv => '$$self{FacesDetected} < 7 ? undef : $val',
+    },
+    0x16 => {
+        Name => 'Face8Position',
+        Format => 'int16s[2]',
+        RawConv => '$$self{FacesDetected} < 8 ? undef : $val',
+    },
+    0x18 => {
+        Name => 'Face9Position',
+        Format => 'int16s[2]',
+        RawConv => '$$self{FacesDetected} < 9 ? undef : $val',
+    },
+);
+
+# more face detect information (MakerNotes tag 0x25) - PH (A570IS)
+%Image::ExifTool::Canon::FaceDetect2 = (
+    %binaryDataAttrs,
+    FORMAT => 'int8u',
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    0x01 => 'FaceWidth',
+    0x02 => 'FacesDetected',
+);
+
+# File number information (MakerNotes tag 0x93)
+%Image::ExifTool::Canon::FileInfo = (
+    %binaryDataAttrs,
+    FORMAT => 'int16s',
+    FIRST_ENTRY => 1,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    1 => [
+        { #5
+            Name => 'FileNumber',
+            Condition => '$$self{Model} =~ /\b(20D|350D|REBEL XT|Kiss Digital N)\b/',
+            Format => 'int32u',
+            # Thanks to Juha Eskelinen for figuring this out:
+            # [this is an odd bit mapping -- it looks like the file number exists as
+            # a 16-bit integer containing the high bits, followed by an 8-bit integer
+            # with the low bits.  But it is more convenient to have this in a single
+            # word, so some bit manipulations are necessary... - PH]
+            # The bit pattern of the 32-bit word is:
+            #   31....24 23....16 15.....8 7......0
+            #   00000000 ffffffff DDDDDDDD ddFFFFFF
+            #     0 = zero bits (not part of the file number?)
+            #     f/F = low/high bits of file number
+            #     d/D = low/high bits of directory number
+            # The directory and file number are then converted into decimal
+            # and separated by a '-' to give the file number used in the 20D
+            ValueConv => '(($val&0xffc0)>>6)*10000+(($val>>16)&0xff)+(($val&0x3f)<<8)',
+            ValueConvInv => q{
+                my $d = int($val/10000);
+                my $f = $val - $d * 10000;
+                return (($d<<6) & 0xffc0) + (($f & 0xff)<<16) + (($f>>8) & 0x3f);
+            },
+            PrintConv => '$_=$val,s/(\d+)(\d{4})/$1-$2/,$_',
+            PrintConvInv => '$val=~s/-//g;$val',
+        },
+        { #16
+            Name => 'FileNumber',
+            Condition => '$$self{Model} =~ /\b(30D|400D|REBEL XTi|Kiss Digital X|K236)\b/',
+            Format => 'int32u',
+            Notes => q{
+                the location of the upper 4 bits of the directory number is a mystery for
+                the EOS 30D, so the reported directory number will be incorrect for original
+                images with a directory number of 164 or greater
+            },
+            # Thanks to Emil Sit for figuring this out:
+            # [more insane bit maniplations like the 20D/350D above, but this time we
+            # appear to have lost the upper 4 bits of the directory number (this was
+            # verified through tests with directory numbers 100, 222, 801 and 999) - PH]
+            # The bit pattern for the 30D is: (see 20D notes above for more information)
+            #   31....24 23....16 15.....8 7......0
+            #   00000000 ffff0000 ddddddFF FFFFFFFF
+            # [NOTE: the 4 high order directory bits don't appear in this record, but
+            # I have chosen to write them into bits 16-19 since these 4 zero bits look
+            # very suspicious, and are a convenient place to store this information - PH]
+            ValueConv  => q{
+                my $d = ($val & 0xffc00) >> 10;
+                # we know there are missing bits if directory number is < 100
+                $d += 0x40 while $d < 100;  # (repair the damage as best we can)
+                return $d*10000 + (($val&0x3ff)<<4) + (($val>>20)&0x0f);
+            },
+            ValueConvInv => q{
+                my $d = int($val/10000);
+                my $f = $val - $d * 10000;
+                return ($d << 10) + (($f>>4)&0x3ff) + (($f&0x0f)<<20);
+            },
+            PrintConv => '$_=$val,s/(\d+)(\d{4})/$1-$2/,$_',
+            PrintConvInv => '$val=~s/-//g;$val',
+        },
+        { #7 (1D, 1Ds)
+            Name => 'ShutterCount',
+            Condition => 'GetByteOrder() eq "MM"',
+            Format => 'int32u',
+        },
+        { #7 (1DmkII, 1DSmkII, 1DSmkIIN)
+            Name => 'ShutterCount',
+            Condition => '$$self{Model} =~ /\b1Ds? Mark II\b/',
+            Format => 'int32u',
+            ValueConv => '($val>>16)|(($val&0xffff)<<16)',
+            ValueConvInv => '($val>>16)|(($val&0xffff)<<16)',
+        },
+        # 5D gives a single byte value (unknown)
+        # 40D stores all zeros
+    ],
+    3 => { #PH
+        Name => 'BracketMode',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'AEB',
+            2 => 'FEB',
+            3 => 'ISO',
+            4 => 'WB',
+        },
+    },
+    4 => 'BracketValue', #PH
+    5 => 'BracketShotNumber', #PH
+    6 => { #PH
+        Name => 'RawJpgQuality',
+        RawConv => '$val<=0 ? undef : $val',
+        PrintConv => \%canonQuality,
+    },
+    7 => { #PH
+        Name => 'RawJpgSize',
+        RawConv => '$val<0 ? undef : $val',
+        PrintConv => \%canonImageSize,
+    },
+    8 => { #PH
+        Name => 'LongExposureNoiseReduction2',
+        Notes => q{
+            for some modules this gives the long exposure noise reduction applied to the
+            image, but for other models this just reflects the setting independent of
+            whether or not it was applied
+        },
+        RawConv => '$val<0 ? undef : $val',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'On (1D)',
+            3 => 'On',
+            4 => 'Auto',
+        },
+    },
+    9 => { #PH
+        Name => 'WBBracketMode',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'On (shift AB)',
+            2 => 'On (shift GM)',
+        },
+    },
+    12 => 'WBBracketValueAB', #PH
+    13 => 'WBBracketValueGM', #PH
+    14 => { #PH
+        Name => 'FilterEffect',
+        RawConv => '$val==-1 ? undef : $val',
+        PrintConv => {
+            0 => 'None',
+            1 => 'Yellow',
+            2 => 'Orange',
+            3 => 'Red',
+            4 => 'Green',
+        },
+    },
+    15 => { #PH
+        Name => 'ToningEffect',
+        RawConv => '$val==-1 ? undef : $val',
+        PrintConv => {
+            0 => 'None',
+            1 => 'Sepia',
+            2 => 'Blue',
+            3 => 'Purple',
+            4 => 'Green',
+        },
+    },
+    16 => { #PH
+        %ciMacroMagnification,
+        # MP-E 65mm on 5DmkII: 44=5x,52~=3.9x,56~=3.3x,62~=2.6x,75=1x
+        # ME-E 65mm on 40D/450D: 72 for all samples (not valid)
+        Condition => q{
+            $$self{LensType} and $$self{LensType} == 124 and
+            $$self{Model} !~ /\b(40D|450D|REBEL XSi|Kiss X2)\b/
+        },
+        Notes => q{
+            currently decoded only for the MP-E 65mm f/2.8 1-5x Macro Photo, and not
+            valid for all camera models
+        },
+    },
+    # 17 - values: 0, 3, 4
+    # 18 - same as LiveViewShooting for all my samples (5DmkII, 50D) - PH
+    19 => { #PH
+        # Note: this value is not displayed by Canon ImageBrowser for the following
+        # models with the live view feature:  1DmkIII, 1DSmkIII, 40D, 450D, 1000D
+        # (this tag could be valid only for some firmware versions:
+        # http://www.breezesys.com/forum/showthread.php?p=16980)
+        Name => 'LiveViewShooting',
+        PrintConv => { 0 => 'Off', 1 => 'On' },
+    },
+    # 22 - values: 0, 1
+    # 23 - values: 0, 21, 22
+    25 => { #PH
+        Name => 'FlashExposureLock',
+        PrintConv => { 0 => 'Off', 1 => 'On' },
+    },
+);
+
+# Internal serial number information (MakerNotes tag 0x96) (ref PH)
+%Image::ExifTool::Canon::SerialInfo = (
+    %binaryDataAttrs,
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    9 => {
+        Name => 'InternalSerialNumber',
+        Format => 'string',
+    },
+);
+
+# Cropping information (MakerNotes tag 0x98) (ref PH)
+%Image::ExifTool::Canon::CropInfo = (
+    %binaryDataAttrs,
+    FORMAT => 'int16u',
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0 => 'CropLeftMargin',  # (NC, may be right)
+    1 => 'CropRightMargin',
+    2 => 'CropTopMargin',   # (NC, may be bottom)
+    3 => 'CropBottomMargin',
+);
+
+# Aspect ratio information (MakerNotes tag 0x9a) (ref PH)
+%Image::ExifTool::Canon::AspectInfo = (
+    %binaryDataAttrs,
+    FORMAT => 'int32u',
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0 => {
+        Name => 'AspectRatio',
+        PrintConv => {
+            0 => '3:2',
+            1 => '1:1',
+            2 => '4:3',
+            7 => '16:9',
+            8 => '4:5',
+        },
+    },
+    1 => 'CroppedImageWidth', # (could use a better name for these)
+    2 => 'CroppedImageHeight',
+);
+
+# Color information (MakerNotes tag 0xa0)
+%Image::ExifTool::Canon::Processing = (
+    %binaryDataAttrs,
+    FORMAT => 'int16s',
+    FIRST_ENTRY => 1,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    1 => { #PH
+        Name => 'ToneCurve',
+        PrintConv => {
+            0 => 'Standard',
+            1 => 'Manual',
+            2 => 'Custom',
+        },
+    },
+    2 => { #12
+        Name => 'Sharpness',
+        Notes => 'all models except the 20D and 350D',
+        Condition => '$$self{Model} !~ /\b(20D|350D|REBEL XT|Kiss Digital N)\b/',
+        Priority => 0,  # (maybe not as reliable as other sharpness values)
+    },
+    3 => { #PH
+        Name => 'SharpnessFrequency', # PatternSharpness?
+        PrintConvColumns => 2,
+        PrintConv => {
+            0 => 'n/a',
+            1 => 'Lowest',
+            2 => 'Low',
+            3 => 'Standard',
+            4 => 'High',
+            5 => 'Highest',
+        },
+    },
+    4 => 'SensorRedLevel', #PH
+    5 => 'SensorBlueLevel', #PH
+    6 => 'WhiteBalanceRed', #PH
+    7 => 'WhiteBalanceBlue', #PH
+    8 => { #PH
+        Name => 'WhiteBalance',
+        RawConv => '$val < 0 ? undef : $val',
+        PrintConv => \%canonWhiteBalance,
+        SeparateTable => 1,
+    },
+    9 => 'ColorTemperature', #6
+    10 => { #12
+        Name => 'PictureStyle',
+        Flags => ['PrintHex','SeparateTable'],
+        PrintConv => \%pictureStyles,
+    },
+    11 => { #PH
+        Name => 'DigitalGain',
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+    },
+    12 => { #PH
+        Name => 'WBShiftAB',
+        Notes => 'positive is a shift toward amber',
+    },
+    13 => { #PH
+        Name => 'WBShiftGM',
+        Notes => 'positive is a shift toward green',
+    },
+);
+
+# Color balance information (MakerNotes tag 0xa9) (ref PH)
+%Image::ExifTool::Canon::ColorBalance = (
+    %binaryDataAttrs,
+    NOTES => 'These tags are used by the 10D and 300D.',
+    FORMAT => 'int16s',
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    # red,green1,green2,blue (ref 2)
+    0  => { Name => 'WB_RGGBLevelsAuto',       Format => 'int16s[4]' },
+    4  => { Name => 'WB_RGGBLevelsDaylight',   Format => 'int16s[4]' },
+    8  => { Name => 'WB_RGGBLevelsShade',      Format => 'int16s[4]' },
+    12 => { Name => 'WB_RGGBLevelsCloudy',     Format => 'int16s[4]' },
+    16 => { Name => 'WB_RGGBLevelsTungsten',   Format => 'int16s[4]' },
+    20 => { Name => 'WB_RGGBLevelsFluorescent',Format => 'int16s[4]' },
+    24 => { Name => 'WB_RGGBLevelsFlash',      Format => 'int16s[4]' },
+    28 => { Name => 'WB_RGGBLevelsCustom',     Format => 'int16s[4]' },
+    32 => { Name => 'WB_RGGBLevelsKelvin',     Format => 'int16s[4]' },
+);
+
+# Measured color levels (MakerNotes tag 0xaa) (ref 37)
+%Image::ExifTool::Canon::MeasuredColor = (
+    %binaryDataAttrs,
+    FORMAT => 'int16u',
+    FIRST_ENTRY => 1,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    1 => {
+        # this is basically the inverse of WB_RGGBLevelsMeasured (ref 37)
+        Name => 'MeasuredRGGB',
+        Format => 'int16u[4]',
+    },
+    # 5 - observed values: 0, 1 - PH
+);
+
+# Flags information (MakerNotes tag 0xb0) (ref PH)
+%Image::ExifTool::Canon::Flags = (
+    %binaryDataAttrs,
+    FORMAT => 'int16s',
+    FIRST_ENTRY => 1,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    1 => 'ModifiedParamFlag',
+);
+
+# Modified information (MakerNotes tag 0xb1) (ref PH)
+%Image::ExifTool::Canon::ModifiedInfo = (
+    %binaryDataAttrs,
+    FORMAT => 'int16s',
+    FIRST_ENTRY => 1,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    1 => {
+        Name => 'ModifiedToneCurve',
+        PrintConv => {
+            0 => 'Standard',
+            1 => 'Manual',
+            2 => 'Custom',
+        },
+    },
+    2 => {
+        Name => 'ModifiedSharpness',
+        Notes => '1D and 5D only',
+        Condition => '$$self{Model} =~ /\b(1D|5D)/',
+    },
+    3 => {
+        Name => 'ModifiedSharpnessFreq', # ModifiedPatternSharpness?
+        PrintConv => {
+            0 => 'n/a',
+            1 => 'Lowest',
+            2 => 'Low',
+            3 => 'Standard',
+            4 => 'High',
+            5 => 'Highest',
+        },
+    },
+    4 => 'ModifiedSensorRedLevel',
+    5 => 'ModifiedSensorBlueLevel',
+    6 => 'ModifiedWhiteBalanceRed',
+    7 => 'ModifiedWhiteBalanceBlue',
+    8 => {
+        Name => 'ModifiedWhiteBalance',
+        PrintConv => \%canonWhiteBalance,
+        SeparateTable => 'WhiteBalance',
+    },
+    9 => 'ModifiedColorTemp',
+    10 => {
+        Name => 'ModifiedPictureStyle',
+        PrintHex => 1,
+        SeparateTable => 'PictureStyle',
+        PrintConv => \%pictureStyles,
+    },
+    11 => {
+        Name => 'ModifiedDigitalGain',
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+    },
+);
+
+# Preview image information (MakerNotes tag 0xb6)
+# - The 300D writes a 1536x1024 preview image that is accessed
+#   through this information - decoded by PH 12/14/03
+%Image::ExifTool::Canon::PreviewImageInfo = (
+    %binaryDataAttrs,
+    FORMAT => 'int32u',
+    FIRST_ENTRY => 1,
+    IS_OFFSET => [ 5 ],   # tag 5 is 'IsOffset'
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+# the size of the preview block in 2-byte increments
+#    0 => {
+#        Name => 'PreviewImageInfoWords',
+#    },
+    1 => {
+        Name => 'PreviewQuality',
+        PrintConv => \%canonQuality,
+    },
+    2 => {
+        Name => 'PreviewImageLength',
+        OffsetPair => 5,   # point to associated offset
+        DataTag => 'PreviewImage',
+        Protected => 2,
+    },
+    3 => 'PreviewImageWidth',
+    4 => 'PreviewImageHeight',
+    5 => {
+        Name => 'PreviewImageStart',
+        Flags => 'IsOffset',
+        OffsetPair => 2,  # associated byte count tagID
+        DataTag => 'PreviewImage',
+        Protected => 2,
+    },
+    # NOTE: The size of the PreviewImageInfo structure is incorrectly
+    # written as 48 bytes (Count=12, Format=int32u), but only the first
+    # 6 int32u values actually exist
+);
+
+# Sensor information (MakerNotes tag 0xe0) (ref 12)
+%Image::ExifTool::Canon::SensorInfo = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    FORMAT => 'int16s',
+    FIRST_ENTRY => 1,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    # Note: Don't make these writable because it confuses Canon decoding software
+    # if these are changed
+    1 => 'SensorWidth',
+    2 => 'SensorHeight',
+    5 => 'SensorLeftBorder', #2
+    6 => 'SensorTopBorder', #2
+    7 => 'SensorRightBorder', #2
+    8 => 'SensorBottomBorder', #2
+    9 => { #22
+        Name => 'BlackMaskLeftBorder',
+        Notes => q{
+            coordinates for the area to the left or right of the image used to calculate
+            the average black level
+        },
+    },
+    10 => 'BlackMaskTopBorder', #22
+    11 => 'BlackMaskRightBorder', #22
+    12 => 'BlackMaskBottomBorder', #22
+);
+
+# Color data (MakerNotes tag 0x4001, count=582) (ref 12)
+%Image::ExifTool::Canon::ColorData1 = (
+    %binaryDataAttrs,
+    NOTES => 'These tags are used by the 20D and 350D.',
+    FORMAT => 'int16s',
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    IS_SUBDIR => [ 0x4b ],
+    # 0x00: size of record in bytes - PH
+    # (dcraw 8.81 uses index 0x19 for WB)
+    0x19 => { Name => 'WB_RGGBLevelsAsShot',      Format => 'int16s[4]' },
+    0x1d => 'ColorTempAsShot',
+    0x1e => { Name => 'WB_RGGBLevelsAuto',        Format => 'int16s[4]' },
+    0x22 => 'ColorTempAuto',
+    0x23 => { Name => 'WB_RGGBLevelsDaylight',    Format => 'int16s[4]' },
+    0x27 => 'ColorTempDaylight',
+    0x28 => { Name => 'WB_RGGBLevelsShade',       Format => 'int16s[4]' },
+    0x2c => 'ColorTempShade',
+    0x2d => { Name => 'WB_RGGBLevelsCloudy',      Format => 'int16s[4]' },
+    0x31 => 'ColorTempCloudy',
+    0x32 => { Name => 'WB_RGGBLevelsTungsten',    Format => 'int16s[4]' },
+    0x36 => 'ColorTempTungsten',
+    0x37 => { Name => 'WB_RGGBLevelsFluorescent', Format => 'int16s[4]' },
+    0x3b => 'ColorTempFluorescent',
+    0x3c => { Name => 'WB_RGGBLevelsFlash',       Format => 'int16s[4]' },
+    0x40 => 'ColorTempFlash',
+    0x41 => { Name => 'WB_RGGBLevelsCustom1',     Format => 'int16s[4]' },
+    0x45 => 'ColorTempCustom1',
+    0x46 => { Name => 'WB_RGGBLevelsCustom2',     Format => 'int16s[4]' },
+    0x4a => 'ColorTempCustom2',
+    0x4b => { #PH
+        Name => 'ColorCalib',
+        Format => 'undef[120]',
+        Unknown => 1, # (all tags are unknown, so we can avoid processing entire directory)
+        Notes => 'A, B, C, Temperature',
+        SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorCalib' }
+    },
+);
+
+# Color data (MakerNotes tag 0x4001, count=653) (ref 12)
+%Image::ExifTool::Canon::ColorData2 = (
+    %binaryDataAttrs,
+    NOTES => 'These tags are used by the 1DmkII and 1DSmkII.',
+    FORMAT => 'int16s',
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    IS_SUBDIR => [ 0xa4 ],
+    0x18 => { Name => 'WB_RGGBLevelsAuto',       Format => 'int16s[4]' },
+    0x1c => 'ColorTempAuto',
+    0x1d => { Name => 'WB_RGGBLevelsUnknown',    Format => 'int16s[4]', Unknown => 1 },
+    0x21 => { Name => 'ColorTempUnknown', Unknown => 1 },
+    # (dcraw 8.81 uses index 0x22 for WB)
+    0x22 => { Name => 'WB_RGGBLevelsAsShot',     Format => 'int16s[4]' },
+    0x26 => 'ColorTempAsShot',
+    0x27 => { Name => 'WB_RGGBLevelsDaylight',   Format => 'int16s[4]' },
+    0x2b => 'ColorTempDaylight',
+    0x2c => { Name => 'WB_RGGBLevelsShade',      Format => 'int16s[4]' },
+    0x30 => 'ColorTempShade',
+    0x31 => { Name => 'WB_RGGBLevelsCloudy',     Format => 'int16s[4]' },
+    0x35 => 'ColorTempCloudy',
+    0x36 => { Name => 'WB_RGGBLevelsTungsten',   Format => 'int16s[4]' },
+    0x3a => 'ColorTempTungsten',
+    0x3b => { Name => 'WB_RGGBLevelsFluorescent',Format => 'int16s[4]' },
+    0x3f => 'ColorTempFluorescent',
+    0x40 => { Name => 'WB_RGGBLevelsKelvin',     Format => 'int16s[4]' },
+    0x44 => 'ColorTempKelvin',
+    0x45 => { Name => 'WB_RGGBLevelsFlash',      Format => 'int16s[4]' },
+    0x49 => 'ColorTempFlash',
+    0x4a => { Name => 'WB_RGGBLevelsUnknown2',   Format => 'int16s[4]', Unknown => 1 },
+    0x4e => { Name => 'ColorTempUnknown2', Unknown => 1 },
+    0x4f => { Name => 'WB_RGGBLevelsUnknown3',   Format => 'int16s[4]', Unknown => 1 },
+    0x53 => { Name => 'ColorTempUnknown3', Unknown => 1 },
+    0x54 => { Name => 'WB_RGGBLevelsUnknown4',   Format => 'int16s[4]', Unknown => 1 },
+    0x58 => { Name => 'ColorTempUnknown4', Unknown => 1 },
+    0x59 => { Name => 'WB_RGGBLevelsUnknown5',   Format => 'int16s[4]', Unknown => 1 },
+    0x5d => { Name => 'ColorTempUnknown5', Unknown => 1 },
+    0x5e => { Name => 'WB_RGGBLevelsUnknown6',   Format => 'int16s[4]', Unknown => 1 },
+    0x62 => { Name => 'ColorTempUnknown6', Unknown => 1 },
+    0x63 => { Name => 'WB_RGGBLevelsUnknown7',   Format => 'int16s[4]', Unknown => 1 },
+    0x67 => { Name => 'ColorTempUnknown7', Unknown => 1 },
+    0x68 => { Name => 'WB_RGGBLevelsUnknown8',   Format => 'int16s[4]', Unknown => 1 },
+    0x6c => { Name => 'ColorTempUnknown8', Unknown => 1 },
+    0x6d => { Name => 'WB_RGGBLevelsUnknown9',   Format => 'int16s[4]', Unknown => 1 },
+    0x71 => { Name => 'ColorTempUnknown9', Unknown => 1 },
+    0x72 => { Name => 'WB_RGGBLevelsUnknown10',  Format => 'int16s[4]', Unknown => 1 },
+    0x76 => { Name => 'ColorTempUnknown10', Unknown => 1 },
+    0x77 => { Name => 'WB_RGGBLevelsUnknown11',  Format => 'int16s[4]', Unknown => 1 },
+    0x7b => { Name => 'ColorTempUnknown11', Unknown => 1 },
+    0x7c => { Name => 'WB_RGGBLevelsUnknown12',  Format => 'int16s[4]', Unknown => 1 },
+    0x80 => { Name => 'ColorTempUnknown12', Unknown => 1 },
+    0x81 => { Name => 'WB_RGGBLevelsUnknown13',  Format => 'int16s[4]', Unknown => 1 },
+    0x85 => { Name => 'ColorTempUnknown13', Unknown => 1 },
+    0x86 => { Name => 'WB_RGGBLevelsUnknown14',  Format => 'int16s[4]', Unknown => 1 },
+    0x8a => { Name => 'ColorTempUnknown14', Unknown => 1 },
+    0x8b => { Name => 'WB_RGGBLevelsUnknown15',  Format => 'int16s[4]', Unknown => 1 },
+    0x8f => { Name => 'ColorTempUnknown15', Unknown => 1 },
+    0x90 => { Name => 'WB_RGGBLevelsPC1',        Format => 'int16s[4]' },
+    0x94 => 'ColorTempPC1',
+    0x95 => { Name => 'WB_RGGBLevelsPC2',        Format => 'int16s[4]' },
+    0x99 => 'ColorTempPC2',
+    0x9a => { Name => 'WB_RGGBLevelsPC3',        Format => 'int16s[4]' },
+    0x9e => 'ColorTempPC3',
+    0x9f => { Name => 'WB_RGGBLevelsUnknown16',  Format => 'int16s[4]', Unknown => 1 },
+    0xa3 => { Name => 'ColorTempUnknown16', Unknown => 1 },
+    0xa4 => { #PH
+        Name => 'ColorCalib',
+        Format => 'undef[120]',
+        Unknown => 1,
+        Notes => 'A, B, C, Temperature',
+        SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorCalib' }
+    },
+    0x26a => { #PH
+        Name => 'RawMeasuredRGGB',
+        Format => 'int32u[4]',
+        Notes => 'raw MeasuredRGGB values, before normalization',
+        # swap words because the word ordering is big-endian, opposite to the byte ordering
+        ValueConv => \&SwapWords,
+        ValueConvInv => \&SwapWords,
+    },
+);
+
+# Color data (MakerNotes tag 0x4001, count=796) (ref 12)
+%Image::ExifTool::Canon::ColorData3 = (
+    %binaryDataAttrs,
+    NOTES => 'These tags are used by the 1DmkIIN, 5D, 30D and 400D.',
+    FORMAT => 'int16s',
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    IS_SUBDIR => [ 0x85 ],
+    0x00 => { #PH
+        Name => 'ColorDataVersion',
+        PrintConv => {
+            1 => '1 (1DmkIIN/5D/30D/400D)',
+        },
+    },
+    # 0x01-0x3e: RGGB coefficients, apparently specific to the
+    # individual camera and possibly used for color calibration (ref 37)
+    # (dcraw 8.81 uses index 0x3f for WB)
+    0x3f => { Name => 'WB_RGGBLevelsAsShot',      Format => 'int16s[4]' },
+    0x43 => 'ColorTempAsShot',
+    0x44 => { Name => 'WB_RGGBLevelsAuto',        Format => 'int16s[4]' },
+    0x48 => 'ColorTempAuto',
+    # not sure exactly what 'Measured' values mean...
+    0x49 => { Name => 'WB_RGGBLevelsMeasured',    Format => 'int16s[4]' },
+    0x4d => 'ColorTempMeasured',
+    0x4e => { Name => 'WB_RGGBLevelsDaylight',    Format => 'int16s[4]' },
+    0x52 => 'ColorTempDaylight',
+    0x53 => { Name => 'WB_RGGBLevelsShade',       Format => 'int16s[4]' },
+    0x57 => 'ColorTempShade',
+    0x58 => { Name => 'WB_RGGBLevelsCloudy',      Format => 'int16s[4]' },
+    0x5c => 'ColorTempCloudy',
+    0x5d => { Name => 'WB_RGGBLevelsTungsten',    Format => 'int16s[4]' },
+    0x61 => 'ColorTempTungsten',
+    0x62 => { Name => 'WB_RGGBLevelsFluorescent', Format => 'int16s[4]' },
+    0x66 => 'ColorTempFluorescent',
+    0x67 => { Name => 'WB_RGGBLevelsKelvin',      Format => 'int16s[4]' },
+    0x6b => 'ColorTempKelvin',
+    0x6c => { Name => 'WB_RGGBLevelsFlash',       Format => 'int16s[4]' },
+    0x70 => 'ColorTempFlash',
+    0x71 => { Name => 'WB_RGGBLevelsPC1',         Format => 'int16s[4]' },
+    0x75 => 'ColorTempPC1',
+    0x76 => { Name => 'WB_RGGBLevelsPC2',         Format => 'int16s[4]' },
+    0x7a => 'ColorTempPC2',
+    0x7b => { Name => 'WB_RGGBLevelsPC3',         Format => 'int16s[4]' },
+    0x7f => 'ColorTempPC3',
+    0x80 => { Name => 'WB_RGGBLevelsCustom',      Format => 'int16s[4]' },
+    0x84 => 'ColorTempCustom',
+    0x85 => { #37
+        Name => 'ColorCalib',
+        Format => 'undef[120]',
+        Unknown => 1,
+        Notes => 'B, C, A, Temperature',
+        SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorCalib' }
+    },
+    # 0xc5-0xc7: looks like black levels (ref 37)
+    # 0xc8-0x1c7: some sort of color table (ref 37)
+    0x248 => { #37
+        Name => 'FlashOutput',
+        ValueConv => '$val >= 255 ? 255 : exp(($val-200)/16*log(2))',
+        ValueConvInv => '$val == 255 ? 255 : 200 + log($val)*16/log(2)',
+        PrintConv => '$val == 255 ? "Strobe or Misfire" : sprintf("%.0f%%", $val * 100)',
+        PrintConvInv => '$val =~ /^(\d(\.?\d*))/ ? $1 / 100 : 255',
+    },
+    0x249 => { #37
+        Name => 'FlashBatteryLevel',
+        # calibration points for external flash: 144=3.76V (almost empty), 192=5.24V (full)
+        # - have seen a value of 201 with internal flash
+        PrintConv => '$val ? sprintf("%.2fV", $val * 5 / 186) : "n/a"',
+        PrintConvInv => '$val=~/^(\d+\.\d+)\s*V?$/i ? int($val*186/5+0.5) : 0',
+    },
+    0x24a => { #37
+        Name => 'ColorTempFlashData',
+        # 0 for no external flash, 35980 for 'Strobe or Misfire'
+        # (lower than ColorTempFlash by up to 200 degrees)
+        RawConv => '($val < 2000 or $val > 12000) ? undef : $val',
+    },
+    # 0x24b: inverse relationship with flash power (ref 37)
+    # 0x286: has value 256 for correct exposure, less for under exposure (seen 96 minimum) (ref 37)
+    0x287 => { #37
+        Name => 'MeasuredRGGBData',
+        Format => 'int32u[4]',
+        Notes => 'MeasuredRGGB may be derived from these data values',
+        # swap words because the word ordering is big-endian, opposite to the byte ordering
+        ValueConv => \&SwapWords,
+        ValueConvInv => \&SwapWords,
+    },
+    # 0x297: ranges from -10 to 30, higher for high ISO (ref 37)
+);
+
+# Color data (MakerNotes tag 0x4001, count=674|692|702|1227|1250|1251|1337|1338|1346) (ref PH)
+%Image::ExifTool::Canon::ColorData4 = (
+    %binaryDataAttrs,
+    NOTES => q{
+        These tags are used by the 1DmkIII, 1DSmkIII, 1DmkIV, 5DmkII, 7D, 40D, 50D,
+        450D, 500D, 550D, 1000D and 1100D.
+    },
+    FORMAT => 'int16s',
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    IS_SUBDIR => [ 0x3f, 0xa8 ],
+    0x00 => {
+        Name => 'ColorDataVersion',
+        PrintConv => {
+            2 => '2 (1DmkIII)',
+            3 => '3 (40D)',
+            4 => '4 (1DSmkIII)',
+            5 => '5 (450D/1000D)',
+            6 => '6 (50D/5DmkII)',
+            7 => '7 (500D/550D/7D/1DmkIV)',
+            9 => '9 (1100D)',
+        },
+    },
+    # 0x01-0x18: unknown RGGB coefficients (int16s[4]) (50D)
+    # (dcraw 8.81 uses index 0x3f for WB)
+    0x3f => {
+        Name => 'ColorCoefs',
+        Format => 'undef[210]', # ColorTempUnknown11 is last entry
+        SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorCoefs' }
+    },
+    0xa8 => {
+        Name => 'ColorCalib',
+        Format => 'undef[120]',
+        Unknown => 1,
+        Notes => 'B, C, A, Temperature',
+        SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorCalib' }
+    },
+    0x280 => { #PH
+        Name => 'RawMeasuredRGGB',
+        Format => 'int32u[4]',
+        Notes => 'raw MeasuredRGGB values, before normalization',
+        # swap words because the word ordering is big-endian, opposite to the byte ordering
+        ValueConv => \&SwapWords,
+        ValueConvInv => \&SwapWords,
+    },
+);
+
+# color coefficients (ref PH)
+%Image::ExifTool::Canon::ColorCoefs = (
+    %binaryDataAttrs,
+    FORMAT => 'int16s',
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0x00 => { Name => 'WB_RGGBLevelsAsShot',      Format => 'int16s[4]' },
+    0x04 => 'ColorTempAsShot',
+    0x05 => { Name => 'WB_RGGBLevelsAuto',        Format => 'int16s[4]' },
+    0x09 => 'ColorTempAuto',
+    0x0a => { Name => 'WB_RGGBLevelsMeasured',    Format => 'int16s[4]' },
+    0x0e => 'ColorTempMeasured',
+    # the following Unknown values are set for the 50D and 5DmkII, and the
+    # SRAW images of the 40D, and affect thumbnail display for the 50D/5DmkII
+    # and conversion for all modes of the 40D
+    0x0f => { Name => 'WB_RGGBLevelsUnknown',     Format => 'int16s[4]', Unknown => 1 },
+    0x13 => { Name => 'ColorTempUnknown', Unknown => 1 },
+    0x14 => { Name => 'WB_RGGBLevelsDaylight',    Format => 'int16s[4]' },
+    0x18 => 'ColorTempDaylight',
+    0x19 => { Name => 'WB_RGGBLevelsShade',       Format => 'int16s[4]' },
+    0x1d => 'ColorTempShade',
+    0x1e => { Name => 'WB_RGGBLevelsCloudy',      Format => 'int16s[4]' },
+    0x22 => 'ColorTempCloudy',
+    0x23 => { Name => 'WB_RGGBLevelsTungsten',    Format => 'int16s[4]' },
+    0x27 => 'ColorTempTungsten',
+    0x28 => { Name => 'WB_RGGBLevelsFluorescent',Format => 'int16s[4]' },
+    0x2c => 'ColorTempFluorescent',
+    # (changing the Kelvin values has no effect on image in DPP... why not?)
+    0x2d => { Name => 'WB_RGGBLevelsKelvin',     Format => 'int16s[4]' },
+    0x31 => 'ColorTempKelvin',
+    0x32 => { Name => 'WB_RGGBLevelsFlash',      Format => 'int16s[4]' },
+    0x36 => 'ColorTempFlash',
+    0x37 => { Name => 'WB_RGGBLevelsUnknown2',   Format => 'int16s[4]', Unknown => 1 },
+    0x3b => { Name => 'ColorTempUnknown2', Unknown => 1 },
+    0x3c => { Name => 'WB_RGGBLevelsUnknown3',   Format => 'int16s[4]', Unknown => 1 },
+    0x40 => { Name => 'ColorTempUnknown3', Unknown => 1 },
+    0x41 => { Name => 'WB_RGGBLevelsUnknown4',   Format => 'int16s[4]', Unknown => 1 },
+    0x45 => { Name => 'ColorTempUnknown4', Unknown => 1 },
+    0x46 => { Name => 'WB_RGGBLevelsUnknown5',   Format => 'int16s[4]', Unknown => 1 },
+    0x4a => { Name => 'ColorTempUnknown5', Unknown => 1 },
+    0x4b => { Name => 'WB_RGGBLevelsUnknown6',   Format => 'int16s[4]', Unknown => 1 },
+    0x4f => { Name => 'ColorTempUnknown6', Unknown => 1 },
+    0x50 => { Name => 'WB_RGGBLevelsUnknown7',   Format => 'int16s[4]', Unknown => 1 },
+    0x54 => { Name => 'ColorTempUnknown7', Unknown => 1 },
+    0x55 => { Name => 'WB_RGGBLevelsUnknown8',   Format => 'int16s[4]', Unknown => 1 },
+    0x59 => { Name => 'ColorTempUnknown8', Unknown => 1 },
+    0x5a => { Name => 'WB_RGGBLevelsUnknown9',   Format => 'int16s[4]', Unknown => 1 },
+    0x5e => { Name => 'ColorTempUnknown9', Unknown => 1 },
+    0x5f => { Name => 'WB_RGGBLevelsUnknown10',  Format => 'int16s[4]', Unknown => 1 },
+    0x63 => { Name => 'ColorTempUnknown10', Unknown => 1 },
+    0x64 => { Name => 'WB_RGGBLevelsUnknown11',  Format => 'int16s[4]', Unknown => 1 },
+    0x68 => { Name => 'ColorTempUnknown11', Unknown => 1 },
+    0x69 => { Name => 'WB_RGGBLevelsUnknown12',  Format => 'int16s[4]', Unknown => 1 },
+    0x6d => { Name => 'ColorTempUnknown12', Unknown => 1 },
+    0x6e => { Name => 'WB_RGGBLevelsUnknown13',  Format => 'int16s[4]', Unknown => 1 },
+    0x72 => { Name => 'ColorTempUnknown13', Unknown => 1 },
+);
+
+# color calibration (ref 37)
+%Image::ExifTool::Canon::ColorCalib = (
+    %binaryDataAttrs,
+    FORMAT => 'int16s',
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    # these coefficients are in a different order compared to older
+    # models (A,B,C in ColorData1/2 vs. C,A,B in ColorData3/4) - PH
+    # Coefficient A most closely matches the blue curvature, and
+    # coefficient B most closely matches the red curvature, but the match
+    # is not perfect, and I don't know what coefficient C is for (certainly
+    # not a green coefficient) - PH
+    NOTES => q{
+        Camera color calibration data.  For the 20D, 350D, 1DmkII and 1DSmkII the
+        order of the cooefficients is A, B, C, Temperature, but for newer models it
+        is B, C, A, Temperature.  These tags are extracted only when the Unknown
+        option is used.
+    },
+    0x00 => { Name => 'CameraColorCalibration01', %cameraColorCalibration },
+    0x04 => { Name => 'CameraColorCalibration02', %cameraColorCalibration },
+    0x08 => { Name => 'CameraColorCalibration03', %cameraColorCalibration },
+    0x0c => { Name => 'CameraColorCalibration04', %cameraColorCalibration },
+    0x10 => { Name => 'CameraColorCalibration05', %cameraColorCalibration },
+    0x14 => { Name => 'CameraColorCalibration06', %cameraColorCalibration },
+    0x18 => { Name => 'CameraColorCalibration07', %cameraColorCalibration },
+    0x1c => { Name => 'CameraColorCalibration08', %cameraColorCalibration },
+    0x20 => { Name => 'CameraColorCalibration09', %cameraColorCalibration },
+    0x24 => { Name => 'CameraColorCalibration10', %cameraColorCalibration },
+    0x28 => { Name => 'CameraColorCalibration11', %cameraColorCalibration },
+    0x2c => { Name => 'CameraColorCalibration12', %cameraColorCalibration },
+    0x30 => { Name => 'CameraColorCalibration13', %cameraColorCalibration },
+    0x34 => { Name => 'CameraColorCalibration14', %cameraColorCalibration },
+    0x38 => { Name => 'CameraColorCalibration15', %cameraColorCalibration },
+);
+
+# Color data (MakerNotes tag 0x4001, count=5120) (ref PH)
+%Image::ExifTool::Canon::ColorData5 = (
+    %binaryDataAttrs,
+    NOTES => 'These tags are used by the PowerShot G10.',
+    FORMAT => 'int16s',
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    IS_SUBDIR => [ 0x47 ],
+    # 0x00 - oddly, this isn't ColorDataVersion (probably should have been version 8)
+    0x47 => {
+        Name => 'ColorCoefs',
+        Format => 'undef[230]', # ColorTempUnknown13 is last entry
+        SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorCoefs' }
+    },
+    0xba => { Name => 'CameraColorCalibration01', %cameraColorCalibration2,
+              Notes => 'B, C, A, D, Temperature' },
+    0xbf => { Name => 'CameraColorCalibration02', %cameraColorCalibration2 },
+    0xc4 => { Name => 'CameraColorCalibration03', %cameraColorCalibration2 },
+    0xc9 => { Name => 'CameraColorCalibration04', %cameraColorCalibration2 },
+    0xce => { Name => 'CameraColorCalibration05', %cameraColorCalibration2 },
+    0xd3 => { Name => 'CameraColorCalibration06', %cameraColorCalibration2 },
+    0xd8 => { Name => 'CameraColorCalibration07', %cameraColorCalibration2 },
+    0xdd => { Name => 'CameraColorCalibration08', %cameraColorCalibration2 },
+    0xe2 => { Name => 'CameraColorCalibration09', %cameraColorCalibration2 },
+    0xe7 => { Name => 'CameraColorCalibration10', %cameraColorCalibration2 },
+    0xec => { Name => 'CameraColorCalibration11', %cameraColorCalibration2 },
+    0xf1 => { Name => 'CameraColorCalibration12', %cameraColorCalibration2 },
+    0xf6 => { Name => 'CameraColorCalibration13', %cameraColorCalibration2 },
+    0xfb => { Name => 'CameraColorCalibration14', %cameraColorCalibration2 },
+    0x100=> { Name => 'CameraColorCalibration15', %cameraColorCalibration2 },
+);
+
+# Color data (MakerNotes tag 0x4001, count=1273) (ref PH)
+%Image::ExifTool::Canon::ColorData6 = (
+    %binaryDataAttrs,
+    NOTES => 'These tags are used by the EOS 600D.',
+    FORMAT => 'int16s',
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    IS_SUBDIR => [ 0xbc ],
+    0x00 => {
+        Name => 'ColorDataVersion',
+        PrintConv => {
+            10 => '10 (600D)',
+        },
+    },
+    0x3f => { Name => 'WB_RGGBLevelsAsShot',     Format => 'int16s[4]' },
+    0x43 => 'ColorTempAsShot',
+    0x44 => { Name => 'WB_RGGBLevelsAuto',       Format => 'int16s[4]' },
+    0x48 => 'ColorTempAuto',
+    0x49 => { Name => 'WB_RGGBLevelsMeasured',   Format => 'int16s[4]' },
+    0x4d => 'ColorTempMeasured',
+    0x4e => { Name => 'WB_RGGBLevelsUnknown',    Format => 'int16s[4]', Unknown => 1 },
+    0x52 => { Name => 'ColorTempUnknown', Unknown => 1 },
+    0x53 => { Name => 'WB_RGGBLevelsUnknown2',   Format => 'int16s[4]', Unknown => 1 },
+    0x57 => { Name => 'ColorTempUnknown2', Unknown => 1 },
+    0x58 => { Name => 'WB_RGGBLevelsUnknown3',   Format => 'int16s[4]', Unknown => 1 },
+    0x5c => { Name => 'ColorTempUnknown3', Unknown => 1 },
+    0x5d => { Name => 'WB_RGGBLevelsUnknown4',   Format => 'int16s[4]', Unknown => 1 },
+    0x61 => { Name => 'ColorTempUnknown4', Unknown => 1 },
+    0x62 => { Name => 'WB_RGGBLevelsUnknown5',   Format => 'int16s[4]', Unknown => 1 },
+    0x66 => { Name => 'ColorTempUnknown5', Unknown => 1 },
+    0x67 => { Name => 'WB_RGGBLevelsDaylight',   Format => 'int16s[4]' },
+    0x6b => 'ColorTempDaylight',
+    0x6c => { Name => 'WB_RGGBLevelsShade',      Format => 'int16s[4]' },
+    0x70 => 'ColorTempShade',
+    0x71 => { Name => 'WB_RGGBLevelsCloudy',     Format => 'int16s[4]' },
+    0x75 => 'ColorTempCloudy',
+    0x76 => { Name => 'WB_RGGBLevelsTungsten',   Format => 'int16s[4]' },
+    0x7a => 'ColorTempTungsten',
+    0x7b => { Name => 'WB_RGGBLevelsFluorescent',Format => 'int16s[4]' },
+    0x7f => 'ColorTempFluorescent',
+    0x80 => { Name => 'WB_RGGBLevelsKelvin',     Format => 'int16s[4]' },
+    0x84 => 'ColorTempKelvin',
+    0x85 => { Name => 'WB_RGGBLevelsFlash',      Format => 'int16s[4]' },
+    0x89 => 'ColorTempFlash',
+    0x8a => { Name => 'WB_RGGBLevelsUnknown6',   Format => 'int16s[4]', Unknown => 1 },
+    0x8e => { Name => 'ColorTempUnknown6', Unknown => 1 },
+    0x8f => { Name => 'WB_RGGBLevelsUnknown7',   Format => 'int16s[4]', Unknown => 1 },
+    0x93 => { Name => 'ColorTempUnknown7', Unknown => 1 },
+    0x94 => { Name => 'WB_RGGBLevelsUnknown8',   Format => 'int16s[4]', Unknown => 1 },
+    0x98 => { Name => 'ColorTempUnknown8', Unknown => 1 },
+    0x99 => { Name => 'WB_RGGBLevelsUnknown9',   Format => 'int16s[4]', Unknown => 1 },
+    0x9d => { Name => 'ColorTempUnknown9', Unknown => 1 },
+    0x9e => { Name => 'WB_RGGBLevelsUnknown10',  Format => 'int16s[4]', Unknown => 1 },
+    0xa2 => { Name => 'ColorTempUnknown10', Unknown => 1 },
+    0xa3 => { Name => 'WB_RGGBLevelsUnknown11',  Format => 'int16s[4]', Unknown => 1 },
+    0xa7 => { Name => 'ColorTempUnknown11', Unknown => 1 },
+    0xa8 => { Name => 'WB_RGGBLevelsUnknown12',  Format => 'int16s[4]', Unknown => 1 },
+    0xac => { Name => 'ColorTempUnknown12', Unknown => 1 },
+    0xad => { Name => 'WB_RGGBLevelsUnknown13',  Format => 'int16s[4]', Unknown => 1 },
+    0xb1 => { Name => 'ColorTempUnknown13', Unknown => 1 },
+    0xb2 => { Name => 'WB_RGGBLevelsUnknown14',  Format => 'int16s[4]', Unknown => 1 },
+    0xb6 => { Name => 'ColorTempUnknown14', Unknown => 1 },
+    0xb7 => { Name => 'WB_RGGBLevelsUnknown15',  Format => 'int16s[4]', Unknown => 1 },
+    0xbb => { Name => 'ColorTempUnknown15', Unknown => 1 },
+    0xbc => {
+        Name => 'ColorCalib',
+        Format => 'undef[120]',
+        Unknown => 1,
+        Notes => 'B, C, A, Temperature',
+        SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorCalib' }
+    },
+    0x194 => { #PH
+        Name => 'RawMeasuredRGGB',
+        Format => 'int32u[4]',
+        Notes => 'raw MeasuredRGGB values, before normalization',
+        # swap words because the word ordering is big-endian, opposite to the byte ordering
+        ValueConv => \&SwapWords,
+        ValueConvInv => \&SwapWords,
+    },
+);
+
+# Unknown color data (MakerNotes tag 0x4001)
+%Image::ExifTool::Canon::ColorDataUnknown = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    FORMAT => 'int16s',
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+);
+
+# Color information (MakerNotes tag 0x4003) (ref PH)
+%Image::ExifTool::Canon::ColorInfo = (
+    %binaryDataAttrs,
+    FORMAT => 'int16s',
+    FIRST_ENTRY => 1,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    1 => {
+        Condition => '$$self{Model} =~ /EOS-1D/',
+        Name => 'Saturation',
+        %Image::ExifTool::Exif::printParameter,
+    },
+    2 => {
+        Name => 'ColorTone',
+        %Image::ExifTool::Exif::printParameter,
+    },
+    3 => {
+        Name => 'ColorSpace',
+        RawConv => '$val ? $val : undef', # ignore tag if zero
+        PrintConv => {
+            1 => 'sRGB',
+            2 => 'Adobe RGB',
+        },
+    },
+);
+
+# AF micro-adjustment information (MakerNotes tag 0x4013) (ref PH)
+%Image::ExifTool::Canon::AFMicroAdj = (
+    %binaryDataAttrs,
+    FORMAT => 'int32s',
+    FIRST_ENTRY => 1,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    1 => {
+        Name => 'AFMicroAdjActive',
+        PrintConv => {
+            0 => 'No',
+            1 => 'Yes',
+        },
+    },
+    2 => {
+        Name => 'AFMicroAdjValue',
+        Format => 'rational64s',
+    },
+);
+
+# Vignetting correction information (MakerNotes tag 0x4015)
+%Image::ExifTool::Canon::VignettingCorr = (
+    %binaryDataAttrs,
+    FORMAT => 'int16s',
+    FIRST_ENTRY => 1,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => q{
+        This information is found in images from the 1DmkIV, 5DmkII, 7D, 50D, 500D
+        and 550D.
+    },
+    # 0 => 'PeripheralLightingVersion', value = 0x1000
+    2 => {
+        Name => 'PeripheralLighting',
+        PrintConv => { 0 => 'Off', 1 => 'On' },
+    },
+    6 => 'PeripheralLightingValue',
+    # 10 - flags?
+    11 => {
+        Name => 'OriginalImageWidth',
+        Notes => 'full size of original image before being rotated or scaled in camera',
+    },
+    12 => 'OriginalImageHeight',
+);
+
+# More Vignetting correction information (MakerNotes tag 0x4016)
+%Image::ExifTool::Canon::VignettingCorr2 = (
+    %binaryDataAttrs,
+    FORMAT => 'int32s',
+    FIRST_ENTRY => 1,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    5 => {
+        Name => 'PeripheralLightingSetting',
+        PrintConv => { 0 => 'Off', 1 => 'On' },
+    },
+);
+
+# Auto Lighting Optimizater information (MakerNotes tag 0x4018) (ref PH)
+%Image::ExifTool::Canon::LightingOpt = (
+    %binaryDataAttrs,
+    FORMAT => 'int32s',
+    FIRST_ENTRY => 1,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'This information is new in images from the EOS 7D.',
+    2 => {
+        Name => 'AutoLightingOptimizer',
+        PrintConv => {
+            0 => 'Standard',
+            1 => 'Low',
+            2 => 'Strong',
+            3 => 'Off',
+        },
+    },
+);
+
+# Lens information (MakerNotes tag 0x4019) (ref 20)
+%Image::ExifTool::Canon::LensInfo = (
+    %binaryDataAttrs,
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0 => { # this doesn't seem to be valid for some models (ie. 550D, 7D?, 1DmkIV?)
+        Name => 'LensSerialNumber',
+        Notes => q{
+            apparently this is an internal serial number because it doesn't correspond
+            to the one printed on the lens
+        },
+        Condition => '$$valPt !~ /^\0\0\0\0/', # (rules out 550D and older lenses)
+        Format => 'undef[5]',
+        ValueConv => 'unpack("H*", $val)',
+        ValueConvInv => 'pack("H*", $val)',
+    },
+);
+
+# Subject mode ambience information (MakerNotes tag 0x4020) (ref PH)
+%Image::ExifTool::Canon::Ambience = (
+    %binaryDataAttrs,
+    FORMAT => 'int32s',
+    FIRST_ENTRY => 1,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    1 => {
+        Name => 'AmbienceSelection',
+        PrintConv => {
+            0 => 'Standard',
+            1 => 'Vivid',
+            2 => 'Warm',
+            3 => 'Soft',
+            4 => 'Cool',
+            5 => 'Intense',
+            6 => 'Brighter',
+            7 => 'Darker',
+            8 => 'Monochrome',
+        },
+    },
+);
+
+# Creative filter information (MakerNotes tag 0x4024) (ref PH)
+%Image::ExifTool::Canon::FilterInfo = (
+    PROCESS_PROC => \&ProcessFilters,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'Information about creative filter settings.',
+    0x101 => {
+        Name => 'GrainyBWFilter',
+        Description => 'Grainy B/W Filter',
+        PrintConv => '$val == -1 ? "Off" : "On ($val)"',
+        PrintConvInv => '$val =~ /([-+]?\d+)/ ? $1 : -1',
+    },
+    0x201 => {
+        Name => 'SoftFocusFilter',
+        PrintConv => '$val == -1 ? "Off" : "On ($val)"',
+        PrintConvInv => '$val =~ /([-+]?\d+)/ ? $1 : -1',
+    },
+    0x301 => {
+        Name => 'ToyCameraFilter',
+        PrintConv => '$val == -1 ? "Off" : "On ($val)"',
+        PrintConvInv => '$val =~ /([-+]?\d+)/ ? $1 : -1',
+    },
+    0x401 => {
+        Name => 'MiniatureFilter',
+        PrintConv => '$val == -1 ? "Off" : "On ($val)"',
+        PrintConvInv => '$val =~ /([-+]?\d+)/ ? $1 : -1',
+    },
+    0x0402 => {
+        Name => 'MiniatureFilterOrientation',
+        PrintConv => {
+            0 => 'Horizontal',
+            1 => 'Vertical',
+        },
+    },
+    0x403=> 'MiniatureFilterPosition',
+    # 0x404 - value: 0, 345, 518, ... (miniature filter width maybe?)
+);
+
+# Canon CNTH atoms (ref PH)
+%Image::ExifTool::Canon::CNTH = (
+    GROUPS => { 0 => 'MakerNotes', 1 => 'Canon', 2 => 'Video' },
+    NOTES => q{
+        Canon-specific QuickTime tags found in the CNTH atom of MOV videos from some
+        cameras such as the PowerShot S95.
+    },
+    CNDA => {
+        Name => 'ThumbnailImage',
+        Format => 'undef',
+        Notes => 'the full THM image, embedded metadata is extracted as the first sub-document',
+        RawConv => q{
+            $$self{DOC_NUM} = ++$$self{DOC_COUNT};
+            $self->ExtractInfo(\$val, { ReEntry => 1 });
+            $$self{DOC_NUM} = 0;
+            return \$val;
+        },
+    },
+);
+
+# Canon composite tags
+%Image::ExifTool::Canon::Composite = (
+    GROUPS => { 2 => 'Camera' },
+    DriveMode => {
+        Require => {
+            0 => 'ContinuousDrive',
+            1 => 'SelfTimer',
+        },
+        ValueConv => '$val[0] ? 0 : ($val[1] ? 1 : 2)',
+        PrintConv => {
+            0 => 'Continuous Shooting',
+            1 => 'Self-timer Operation',
+            2 => 'Single-frame Shooting',
+        },
+    },
+    Lens => {
+        Require => {
+            0 => 'ShortFocal',
+            1 => 'LongFocal',
+        },
+        ValueConv => '$val[0]',
+        PrintConv => 'Image::ExifTool::Canon::PrintFocalRange(@val)',
+    },
+    Lens35efl => {
+        Description => 'Lens',
+        Require => {
+            0 => 'ShortFocal',
+            1 => 'LongFocal',
+            3 => 'Lens',
+        },
+        Desire => {
+            2 => 'ScaleFactor35efl',
+        },
+        ValueConv => '$val[3] * ($val[2] ? $val[2] : 1)',
+        PrintConv => '$prt[3] . ($val[2] ? sprintf(" (35 mm equivalent: %s)",Image::ExifTool::Canon::PrintFocalRange(@val)) : "")',
+    },
+    ShootingMode => {
+        Require => {
+            0 => 'CanonExposureMode',
+            1 => 'EasyMode',
+        },
+        Desire => {
+            2 => 'BulbDuration',
+        },
+        # most Canon models set CanonExposureMode to Manual (4) for Bulb shots,
+        # but the 1DmkIII uses a value of 7 for Bulb, so use this for other
+        # models too (Note that Canon DPP reports "Manual Exposure" here)
+        ValueConv => '$val[0] ? (($val[0] eq "4" and $val[2]) ? 7 : $val[0]) : $val[1] + 10',
+        PrintConv => '$val eq "7" ? "Bulb" : ($val[0] ? $prt[0] : $prt[1])',
+    },
+    FlashType => {
+        Notes => q{
+            may report "Built-in Flash" for some Canon cameras with external flash in
+            manual mode
+        },
+        Require => {
+            0 => 'FlashBits',
+        },
+        RawConv => '$val[0] ? $val : undef',
+        ValueConv => '$val[0]&(1<<14)? 1 : 0',
+        PrintConv => {
+            0 => 'Built-In Flash',
+            1 => 'External',
+        },
+    },
+    RedEyeReduction => {
+        Require => {
+            0 => 'CanonFlashMode',
+            1 => 'FlashBits',
+        },
+        RawConv => '$val[1] ? $val : undef',
+        ValueConv => '($val[0]==3 or $val[0]==4 or $val[0]==6) ? 1 : 0',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'On',
+        },
+    },
+    # same as FlashExposureComp, but undefined if no flash
+    ConditionalFEC => {
+        Description => 'Flash Exposure Compensation',
+        Require => {
+            0 => 'FlashExposureComp',
+            1 => 'FlashBits',
+        },
+        RawConv => '$val[1] ? $val : undef',
+        ValueConv => '$val[0]',
+        PrintConv => '$prt[0]',
+    },
+    # hack to assume 1st curtain unless we see otherwise
+    ShutterCurtainHack => {
+        Description => 'Shutter Curtain Sync',
+        Desire => {
+            0 => 'ShutterCurtainSync',
+        },
+        Require => {
+            1 => 'FlashBits',
+        },
+        RawConv => '$val[1] ? $val : undef',
+        ValueConv => 'defined($val[0]) ? $val[0] : 0',
+        PrintConv => {
+            0 => '1st-curtain sync',
+            1 => '2nd-curtain sync',
+        },
+    },
+    WB_RGGBLevels => {
+        Require => {
+            0 => 'Canon:WhiteBalance',
+        },
+        Desire => {
+            1 => 'WB_RGGBLevelsAsShot',
+            # indices of the following entries correspond to Canon:WhiteBalance + 2
+            2 => 'WB_RGGBLevelsAuto',
+            3 => 'WB_RGGBLevelsDaylight',
+            4 => 'WB_RGGBLevelsCloudy',
+            5 => 'WB_RGGBLevelsTungsten',
+            6 => 'WB_RGGBLevelsFluorescent',
+            7 => 'WB_RGGBLevelsFlash',
+            8 => 'WB_RGGBLevelsCustom',
+           10 => 'WB_RGGBLevelsShade',
+           11 => 'WB_RGGBLevelsKelvin',
+        },
+        ValueConv => '$val[1] ? $val[1] : $val[($val[0] || 0) + 2]',
+    },
+    ISO => {
+        Priority => 0,  # let EXIF:ISO take priority
+        Desire => {
+            0 => 'Canon:CameraISO',
+            1 => 'Canon:BaseISO',
+            2 => 'Canon:AutoISO',
+        },
+        Notes => 'use CameraISO if numerical, otherwise calculate as BaseISO * AutoISO / 100',
+        ValueConv => q{
+            return $val[0] if $val[0] and $val[0] =~ /^\d+$/;
+            return undef unless $val[1] and $val[2];
+            return $val[1] * $val[2] / 100;
+        },
+        PrintConv => 'sprintf("%.0f",$val)',
+    },
+    DigitalZoom => {
+        Require => {
+            0 => 'Canon:ZoomSourceWidth',
+            1 => 'Canon:ZoomTargetWidth',
+            2 => 'Canon:DigitalZoom',
+        },
+        RawConv => q{
+            ToFloat(@val);
+            return undef unless $val[2] and $val[2] == 3 and $val[0] and $val[1];
+            return $val[1] / $val[0];
+        },
+        PrintConv => 'sprintf("%.2fx",$val)',
+    },
+    OriginalDecisionData => {
+        Flags => ['Writable','Protected'],
+        WriteGroup => 'MakerNotes',
+        Require => 'OriginalDecisionDataOffset',
+        RawConv => 'Image::ExifTool::Canon::ReadODD($self,$val[0])',
+    },
+    FileNumber => {
+        Groups => { 2 => 'Image' },
+        Writable => 1,
+        WriteCheck => '$val=~/\d+-\d+/ ? undef : "Invalid format"',
+        DelCheck => '"Can\'t delete"',
+        Require => {
+            0 => 'DirectoryIndex',
+            1 => 'FileIndex',
+        },
+        WriteAlso => {
+            DirectoryIndex => '$val=~/(\d+)-(\d+)/; $1',
+            FileIndex => '$val=~/(\d+)-(\d+)/; $2',
+        },
+        ValueConv => 'sprintf("%.3d-%.4d",@val)',
+    },
+);
+
+# add our composite tags
+Image::ExifTool::AddCompositeTags('Image::ExifTool::Canon');
+
+#------------------------------------------------------------------------------
+# Return lens name with teleconverter if applicable
+# Inputs: 0) lens name string, 1) short focal length
+# Returns: lens string with tc if appropriate
+sub LensWithTC($$)
+{
+    my ($lens, $shortFocal) = @_;
+
+    # add teleconverter multiplication factor if applicable
+    # (and if the LensType doesn't already include one)
+    if (not $lens =~ /x$/ and $lens =~ /(\d+)/) {
+        my $sf = $1;    # short focal length
+        my $tc;
+        foreach $tc (1, 1.4, 2, 2.8) {
+            next if abs($shortFocal - $sf * $tc) > 0.9;
+            $lens .= " + ${tc}x" if $tc > 1;
+            last;
+        }
+    }
+    return $lens;
+}
+
+#------------------------------------------------------------------------------
+# Attempt to identify the specific lens if multiple lenses have the same LensType
+# Inputs: 0) PrintConv hash ref, 1) LensType, 2) ShortFocal, 3) LongFocal
+#         4) MaxAperture, 5) LensModel
+# Notes: PrintConv, LensType, ShortFocal and LongFocal must be defined.
+#        Other inputs are optional.
+sub PrintLensID(@)
+{
+    my ($printConv, $lensType, $shortFocal, $longFocal, $maxAperture, $lensModel) = @_;
+    my $lens = $$printConv{$lensType};
+    if ($lens) {
+        # return this lens unless other lenses have the same LensType
+        return LensWithTC($lens, $shortFocal) unless $$printConv{"$lensType.1"};
+        $lens =~ s/ or .*//s;    # remove everything after "or"
+        # make list of all possible matching lenses
+        my @lenses = ( $lens );
+        my $i;
+        for ($i=1; $$printConv{"$lensType.$i"}; ++$i) {
+            push @lenses, $$printConv{"$lensType.$i"};
+        }
+        # look for lens in user-defined lenses
+        foreach $lens (@lenses) {
+            next unless $Image::ExifTool::userLens{$lens};
+            return LensWithTC($lens, $shortFocal);
+        }
+        # attempt to determine actual lens
+        my ($tc, @maybe, @likely, @matches);
+        foreach $tc (1, 1.4, 2, 2.8) {  # loop through teleconverter scaling factors
+            foreach $lens (@lenses) {
+                next unless $lens =~ /(\d+)(?:-(\d+))?mm.*?(?:[fF]\/?)(\d+(?:\.\d+)?)(?:-(\d+(?:\.\d+)?))?/;
+                # ($1=short focal, $2=long focal, $3=max aperture wide, $4=max aperture tele)
+                my ($sf, $lf, $sa, $la) = ($1, $2, $3, $4);
+                # see if we can rule out this lens by focal length or aperture
+                $lf = $sf if $sf and not $lf;
+                $la = $sa if $sa and not $la;
+                next if abs($shortFocal - $sf * $tc) > 0.9;
+                my $tclens = $lens;
+                $tclens .= " + ${tc}x" if $tc > 1;
+                push @maybe, $tclens;
+                next if abs($longFocal  - $lf * $tc) > 0.9;
+                push @likely, $tclens;
+                if ($maxAperture) {
+                    # (not 100% sure that TC affects MaxAperture, but it should!)
+                    next if $maxAperture < $sa * $tc - 0.15;
+                    next if $maxAperture > $la * $tc + 0.15;
+                }
+                push @matches, $tclens;
+            }
+            last if @maybe;
+        }
+        return join(' or ', @matches) if @matches;
+        return join(' or ', @likely) if @likely;
+        return join(' or ', @maybe) if @maybe;
+    } elsif ($lensModel and $lensModel =~ /\d/) {
+        # use lens model as written by the camera (add "Canon" to the start
+        # since the camera only understands Canon lenses anyway)
+        return "Canon $lensModel";
+    }
+    my $str = '';
+    if ($shortFocal) {
+        $str .= sprintf(' %d', $shortFocal);
+        $str .= sprintf('-%d', $longFocal) if $longFocal and $longFocal != $shortFocal;
+        $str .= 'mm';
+    }
+    return "Unknown$str" if $lensType eq '-1'; # (careful because Sigma LensType's may not be integer)
+    return "Unknown ($lensType)$str";
+}
+
+#------------------------------------------------------------------------------
+# Swap 16-bit words in 32-bit integers
+# Inputs: 0) string of integers
+# Returns: string of word-swapped integers
+sub SwapWords($)
+{
+    my @a = split(' ', shift);
+    $_ = (($_ >> 16) | ($_ << 16)) & 0xffffffff foreach @a;
+    return "@a";
+}
+
+#------------------------------------------------------------------------------
+# Validate first word of Canon binary data
+# Inputs: 0) data pointer, 1) offset, 2-N) list of valid values
+# Returns: true if data value is the same
+sub Validate($$@)
+{
+    my ($dataPt, $offset, @vals) = @_;
+    # the first 16-bit value is the length of the data in bytes
+    my $dataVal = Image::ExifTool::Get16u($dataPt, $offset);
+    my $val;
+    foreach $val (@vals) {
+        return 1 if $val == $dataVal;
+    }
+    return undef;
+}
+
+#------------------------------------------------------------------------------
+# Validate CanonAFInfo
+# Inputs: 0) data pointer, 1) offset, 2) size
+# Returns: true if data appears valid
+sub ValidateAFInfo($$$)
+{
+    my ($dataPt, $offset, $size) = @_;
+    return 0 if $size < 24; # must be at least 24 bytes long (PowerShot Pro1)
+    my $af = Get16u($dataPt, $offset);
+    return 0 if $af !~ /^(1|5|7|9|15|45|53)$/; # check NumAFPoints
+    my $w1 = Get16u($dataPt, $offset + 4);
+    my $h1 = Get16u($dataPt, $offset + 6);
+    return 0 unless $h1 and $w1;
+    my $f1 = $w1 / $h1;
+    # check for normal aspect ratio
+    return 1 if abs($f1 - 1.33) < 0.01 or abs($f1 - 1.67) < 0.01;
+    # ZoomBrowser can modify this for rotated images (ref Joshua Bixby)
+    return 1 if abs($f1 - 0.75) < 0.01 or abs($f1 - 0.60) < 0.01;
+    my $w2 = Get16u($dataPt, $offset + 8);
+    my $h2 = Get16u($dataPt, $offset + 10);
+    return 0 unless $h2 and $w2;
+    # compare aspect ratio with AF image size
+    # (but the Powershot AFImageHeight is odd, hence the test above)
+    return 0 if $w1 eq $h1;
+    my $f2 = $w2 / $h2;
+    return 1 if abs(1-$f1/$f2) < 0.01;
+    return 1 if abs(1-$f1*$f2) < 0.01;
+    return 0;
+}
+
+#------------------------------------------------------------------------------
+# Read original decision data from file (variable length)
+# Inputs: 0) ExifTool object ref, 1) offset in file
+# Returns: reference to original decision data (or undef if no data)
+sub ReadODD($$)
+{
+    my ($exifTool, $offset) = @_;
+    return undef unless $offset;
+    my ($raf, $buff, $buf2, $i, $warn);
+    return undef unless defined($raf = $$exifTool{RAF});
+    # the data block is a variable length and starts with 0xffffffff
+    # followed a 4-byte (int32u) version number
+    my $pos = $raf->Tell();
+    if ($raf->Seek($offset, 0) and $raf->Read($buff, 8)==8 and $buff=~/^\xff{4}.\0\0/s) {
+        my $err = 1;
+        # must set byte order in case it is different than current byte order
+        # (we could be reading this after byte order was changed)
+        my $oldOrder = GetByteOrder();
+        my $version = Get32u(\$buff, 4);
+        if ($version > 20) {
+            ToggleByteOrder();
+            $version = unpack('N',pack('V',$version));
+        }
+        if ($version == 1 or   # 1Ds (big endian)
+            $version == 2)     # 5D/20D (little endian)
+        {
+            # this data is structured as follows:
+            #  4 bytes: all 0xff
+            #  4 bytes: version number (=1 or 2)
+            # 20 bytes: sha1
+            #  4 bytes: record count
+            # for each record:
+            # |  4 bytes: record number (beginning at 0)
+            # |  4 bytes: block offset
+            # |  4 bytes: block length
+            # | 20 bytes: block sha1
+            if ($raf->Read($buf2, 24) == 24) {
+                $buff .= $buf2;
+                my $count = Get32u(\$buf2, 20);
+                # read all records if the count is reasonable
+                if ($count and $count < 20 and
+                    $raf->Read($buf2, $count * 32) == $count * 32)
+                {
+                    $buff .= $buf2;
+                    undef $err;
+                }
+            }
+        } elsif ($version == 3) { # newer models (little endian)
+            # this data is structured as follows:
+            #  4 bytes: all 0xff
+            #  4 bytes: version number (=3)
+            # 24 bytes: sha1 A length (=20) + sha1 A
+            # 24 bytes: sha1 B length (=20) + sha1 B
+            #  4 bytes: length of remaining data (including this length word!)
+            #  8 bytes: salt length (=4) + salt ?
+            #  4 bytes: unknown (=3)
+            #  4 bytes: size of file
+            #  4 bytes: unknown (=1 for most models, 2 for 5DmkII)
+            #  4 bytes: unknown (=1)
+            #  4 bytes: unknown (always the same for a given firmware version)
+            #  4 bytes: unknown (random)
+            #  4 bytes: record count
+            # for each record:
+            # |  4 bytes: record number (beginning at 1)
+            # |  8 bytes: salt length (=4) + salt ?
+            # | 24 bytes: sha1 length (=20) + sha1
+            # |  4 bytes: block count
+            # | for each block:
+            # | |  4 bytes: block offset
+            # | |  4 bytes: block length
+            # followed by zero padding to end of ODD data (~72 bytes)
+            for ($i=0; ; ++$i) {
+                $i == 3 and undef $err, last; # success!
+                $raf->Read($buf2, 4) == 4 or last;
+                $buff .= $buf2;
+                my $len = Get32u(\$buf2, 0);
+                # (the data length includes the length word itself - doh!)
+                $len -= 4 if $i == 2 and $len >= 4;
+                # make sure records are a reasonable size (<= 64kB)
+                $len <= 0x10000 and $raf->Read($buf2, $len) == $len or last;
+                $buff .= $buf2;
+            }
+        } else {
+            $warn = "Unsupported original decision data version $version";
+        }
+        SetByteOrder($oldOrder);
+        unless ($err) {
+            if ($exifTool->Options('HtmlDump')) {
+                $exifTool->HDump($offset, length $buff, '[OriginalDecisionData]', undef);
+            }
+            $raf->Seek($pos, 0);    # restore original file position
+            return \$buff;
+        }
+    }
+    $exifTool->Warn($warn || 'Invalid original decision data');
+    $raf->Seek($pos, 0);    # restore original file position
+    return undef;
+}
+
+#------------------------------------------------------------------------------
+# Convert the CameraISO value
+# Inputs: 0) value, 1) set for inverse conversion
+sub CameraISO($;$)
+{
+    my ($val, $inv) = @_;
+    my $rtnVal;
+    my %isoLookup = (
+         0 => 'n/a',
+        14 => 'Auto High', #PH (S3IS)
+        15 => 'Auto',
+        16 => 50,
+        17 => 100,
+        18 => 200,
+        19 => 400,
+        20 => 800, #PH
+    );
+    if ($inv) {
+        $rtnVal = Image::ExifTool::ReverseLookup($val, \%isoLookup);
+        if (not defined $rtnVal and Image::ExifTool::IsInt($val)) {
+            $rtnVal = ($val & 0x3fff) | 0x4000;
+        }
+    } elsif ($val != 0x7fff) {
+        if ($val & 0x4000) {
+            $rtnVal = $val & 0x3fff;
+        } else {
+            $rtnVal = $isoLookup{$val} || "Unknown ($val)";
+        }
+    }
+    return $rtnVal;
+}
+
+#------------------------------------------------------------------------------
+# Print range of focal lengths
+# Inputs: 0) short focal, 1) long focal, 2) optional scaling factor
+sub PrintFocalRange(@)
+{
+    my ($short, $long, $scale) = @_;
+
+    $scale or $scale = 1;
+    if ($short == $long) {
+        return sprintf("%.1f mm", $short * $scale);
+    } else {
+        return sprintf("%.1f - %.1f mm", $short * $scale, $long * $scale);
+    }
+}
+
+#------------------------------------------------------------------------------
+# Process a serial stream of binary data
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+# Notes: The tagID's for serial stream tags are consecutive indices beginning
+#        at 0, and the corresponding values must be contiguous in memory.
+#        "Unknown" tags must be used to skip padding or unknown values.
+sub ProcessSerialData($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $offset = $$dirInfo{DirStart};
+    my $size = $$dirInfo{DirLen};
+    my $base = $$dirInfo{Base} || 0;
+    my $verbose = $exifTool->Options('Verbose');
+    my $dataPos = $$dirInfo{DataPos} || 0;
+
+    # temporarily set Unknown option so GetTagInfo() will return existing unknown tags
+    # (require to maintain serial data synchronization)
+    my $unknown = $exifTool->Options(Unknown => 1);
+    # but disable unknown tag generation (because processing ends when we run out of tags)
+    $$exifTool{NO_UNKNOWN} = 1;
+
+    $verbose and $exifTool->VerboseDir('SerialData', undef, $size);
+
+    # get default format ('int8u' unless specified)
+    my $defaultFormat = $$tagTablePtr{FORMAT} || 'int8u';
+
+    my ($index, %val);
+    my $pos = 0;
+    for ($index=0; $$tagTablePtr{$index} and $pos <= $size; ++$index) {
+        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $index) or last;
+        my $format = $$tagInfo{Format};
+        my $count = 1;
+        if ($format) {
+            if ($format =~ /(.*)\[(.*)\]/) {
+                $format = $1;
+                $count = $2;
+                # evaluate count to allow count to be based on previous values
+                #### eval Format (%val, $size)
+                $count = eval $count;
+                $@ and warn("Format $$tagInfo{Name}: $@"), last;
+            } elsif ($format eq 'string') {
+                # allow string with no specified count to run to end of block
+                $count = ($size > $pos) ? $size - $pos : 0;
+            }
+        } else {
+            $format = $defaultFormat;
+        }
+        my $len = (Image::ExifTool::FormatSize($format) || 1) * $count;
+        last if $pos + $len > $size;
+        my $val = ReadValue($dataPt, $pos+$offset, $format, $count, $size-$pos);
+        last unless defined $val;
+        if ($verbose) {
+            $exifTool->VerboseInfo($index, $tagInfo,
+                Index  => $index,
+                Table  => $tagTablePtr,
+                Value  => $val,
+                DataPt => $dataPt,
+                Size   => $len,
+                Start  => $pos+$offset,
+                Addr   => $pos+$offset+$base+$dataPos,
+                Format => $format,
+                Count  => $count,
+            );
+        }
+        $val{$index} = $val;
+        if ($$tagInfo{SubDirectory}) {
+            my $subTablePtr = GetTagTable($tagInfo->{SubDirectory}->{TagTable});
+            my %dirInfo = (
+                DataPt => \$val,
+                DataPos => $dataPos + $pos,
+                DirStart => 0,
+                DirLen => length($val),
+            );
+            $exifTool->ProcessDirectory(\%dirInfo, $subTablePtr);
+        } elsif (not $$tagInfo{Unknown} or $unknown) {
+            # don't extract zero-length information
+            $exifTool->FoundTag($tagInfo, $val) if $count;
+        }
+        $pos += $len;
+    }
+    $exifTool->Options(Unknown => $unknown);    # restore Unknown option
+    delete $$exifTool{NO_UNKNOWN};
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Print 1D AF points
+# Inputs: 0) value to convert
+# Focus point pattern:
+#            A1  A2  A3  A4  A5  A6  A7
+#      B1  B2  B3  B4  B5  B6  B7  B8  B9  B10
+#    C1  C2  C3  C4  C5  C6  C7  C9  C9  C10  C11
+#      D1  D2  D3  D4  D5  D6  D7  D8  D9  D10
+#            E1  E2  E3  E4  E5  E6  E7
+sub PrintAFPoints1D($)
+{
+    my $val = shift;
+    return 'Unknown' unless length $val == 8;
+    # list of focus point values for decoding the first byte of the 8-byte record.
+    # they are the x/y positions of each bit in the AF point mask
+    # (y is upper 3 bits / x is lower 5 bits)
+    my @focusPts = (0,0,
+              0x04,0x06,0x08,0x0a,0x0c,0x0e,0x10,         0,0,
+      0x21,0x23,0x25,0x27,0x29,0x2b,0x2d,0x2f,0x31,0x33,
+    0x40,0x42,0x44,0x46,0x48,0x4a,0x4c,0x4d,0x50,0x52,0x54,
+      0x61,0x63,0x65,0x67,0x69,0x6b,0x6d,0x6f,0x71,0x73,  0,0,
+              0x84,0x86,0x88,0x8a,0x8c,0x8e,0x90,   0,0,0,0,0
+    );
+    my $focus = unpack('C',$val);
+    my @bits = split //, unpack('b*',substr($val,1));
+    my @rows = split //, '  AAAAAAA  BBBBBBBBBBCCCCCCCCCCCDDDDDDDDDD  EEEEEEE     ';
+    my ($focusing, $focusPt, @points);
+    my $lastRow = '';
+    my $col = 0;
+    foreach $focusPt (@focusPts) {
+        my $row = shift @rows;
+        $col = ($row eq $lastRow) ? $col + 1 : 1;
+        $lastRow = $row;
+        $focusing = "$row$col" if $focus eq $focusPt;
+        push @points, "$row$col" if shift @bits;
+    }
+    $focusing or $focusing = ($focus eq 0xff) ? 'Auto' : sprintf('Unknown (0x%.2x)',$focus);
+    return "$focusing (" . join(',',@points) . ')';
+}
+
+#------------------------------------------------------------------------------
+# Convert Canon hex-based EV (modulo 0x20) to real number
+# Inputs: 0) value to convert
+# ie) 0x00 -> 0
+#     0x0c -> 0.33333
+#     0x10 -> 0.5
+#     0x14 -> 0.66666
+#     0x20 -> 1   ...  etc
+sub CanonEv($)
+{
+    my $val = shift;
+    my $sign;
+    # temporarily make the number positive
+    if ($val < 0) {
+        $val = -$val;
+        $sign = -1;
+    } else {
+        $sign = 1;
+    }
+    my $frac = $val & 0x1f;
+    $val -= $frac;      # remove fraction
+    # Convert 1/3 and 2/3 codes
+    if ($frac == 0x0c) {
+        $frac = 0x20 / 3;
+    } elsif ($frac == 0x14) {
+        $frac = 0x40 / 3;
+    }
+    return $sign * ($val + $frac) / 0x20;
+}
+
+#------------------------------------------------------------------------------
+# Convert number to Canon hex-based EV (modulo 0x20)
+# Inputs: 0) number
+# Returns: Canon EV code
+sub CanonEvInv($)
+{
+    my $num = shift;
+    my $sign;
+    # temporarily make the number positive
+    if ($num < 0) {
+        $num = -$num;
+        $sign = -1;
+    } else {
+        $sign = 1;
+    }
+    my $val = int($num);
+    my $frac = $num - $val;
+    if (abs($frac - 0.33) < 0.05) {
+        $frac = 0x0c
+    } elsif (abs($frac - 0.67) < 0.05) {
+        $frac = 0x14;
+    } else {
+        $frac = int($frac * 0x20 + 0.5);
+    }
+    return $sign * ($val * 0x20 + $frac);
+}
+
+#------------------------------------------------------------------------------
+# Process a creative filter data
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessFilters($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $pos = $$dirInfo{DirStart};
+    my $dirLen = $$dirInfo{DirLen};
+    my $dataPos = $$dirInfo{DataPos} || 0;
+    my $end = $pos + $dirLen;
+    my $verbose = $exifTool->Options('Verbose');
+
+    return 0 if $dirLen < 8;
+    my $numFilters = Get32u($dataPt, $pos + 4);
+    $verbose and $exifTool->VerboseDir('Creative Filter', $numFilters);
+    $pos += 8;
+    my ($i, $j, $err);
+    for ($i=0; $i<$numFilters; ++$i) {
+        # read filter structure:
+        # 4 bytes - filter number
+        # 4 bytes - filter data length
+        # 4 bytes - number of parameters:
+        # |  4 bytes - paramter ID
+        # |  4 bytes - paramter value count
+        # |  4 bytes * count - paramter values (NC)
+        $pos + 12 > $end and $err = "Truncated data for filter $i", last;
+        my $fnum = Get32u($dataPt, $pos); # (is this an index or an ID?)
+        my $size = Get32u($dataPt, $pos + 4);
+        my $nparm = Get32u($dataPt, $pos + 8);
+        my $nxt = $pos + 4 + $size;
+        $nxt > $end and $err = "Invalid size ($size) for filter $i", last;
+        $verbose and $exifTool->VerboseDir("Filter $fnum", $nparm, $size);
+        $pos += 12;
+        for ($j=0; $j<$nparm; ++$j) {
+            $pos + 12 > $end and $err = "Truncated data for filter $i param $j", last;
+            my $tag = Get32u($dataPt, $pos);
+            my $count = Get32u($dataPt, $pos + 4);
+            $pos += 8;
+            $pos + 4 * $count > $end and $err = "Truncated value for filter $i param $j", last;
+            my $val = ReadValue($dataPt, $pos, 'int32s', $count, 4 * $count);
+            $exifTool->HandleTag($tagTablePtr, $tag, $val,
+                DataPt  => $dataPt,
+                DataPos => $dataPos,
+                Start   => $pos,
+                Size    => 4 * $count,
+            );
+            $pos += 4 * $count;
+        }
+        $pos = $nxt;    # step to next filter
+    }
+    $err and $exifTool->Warn($err, 1);
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Write Canon maker notes
+# Inputs: 0) ExifTool object reference, 1) dirInfo ref, 2) tag table ref
+# Returns: data block (may be empty if no Exif data) or undef on error
+sub WriteCanon($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    $exifTool or return 1;    # allow dummy access to autoload this package
+    my $dirData = Image::ExifTool::Exif::WriteExif($exifTool, $dirInfo, $tagTablePtr);
+    # add footer which is written by some Canon models (format of a TIFF header)
+    if (defined $dirData and length $dirData and $$dirInfo{Fixup}) {
+        $dirData .= GetByteOrder() . Set16u(42) . Set32u(0);
+        $dirInfo->{Fixup}->AddFixup(length($dirData) - 4);
+    }
+    return $dirData;
+}
+
+#------------------------------------------------------------------------------
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Canon - Canon EXIF maker notes tags
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to interpret
+Canon maker notes in EXIF information.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html>
+
+=item L<http://www.wonderland.org/crw/>
+
+=item L<http://www.cybercom.net/~dcoffin/dcraw/>
+
+=item L<http://homepage3.nifty.com/kamisaka/makernote/makernote_canon.htm>
+
+=item (...plus lots of testing with my 300D and my daughter's A570IS!)
+
+=back
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks Michael Rommel and Daniel Pittman for information they provided about
+the Digital Ixus and PowerShot S70 cameras, Juha Eskelinen and Emil Sit for
+figuring out the 20D and 30D FileNumber, Denny Priebe for figuring out a
+couple of 1D tags, and Michael Tiemann, Rainer Honle, Dave Nicholson, Chris
+Huebsch, Ger Vermeulen, Darryl Zurn, D.J. Cristi, Bogdan and Vesa Kivisto for
+decoding a number of new tags.  Also thanks to everyone who made contributions
+to the LensType lookup list or the meanings of other tag values.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/Canon Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/CanonCustom.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/CanonCustom.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/CanonCustom.pm	(revision 24799)
@@ -0,0 +1,2423 @@
+#------------------------------------------------------------------------------
+# File:         CanonCustom.pm
+#
+# Description:  Read and write Canon Custom functions
+#
+# Revisions:    11/25/2003  - P. Harvey Created
+#
+# References:   1) http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html
+#               2) Christian Koller private communication (20D)
+#               3) Rainer Honle private communication (5D)
+#               4) David Pitcher private communication (1DmkIII firmware upgrade)
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::CanonCustom;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess);
+use Image::ExifTool::Canon;
+use Image::ExifTool::Exif;
+
+$VERSION = '1.40';
+
+sub ProcessCanonCustom($$$);
+sub ProcessCanonCustom2($$$);
+sub WriteCanonCustom($$$);
+sub WriteCanonCustom2($$$);
+sub CheckCanonCustom($$$);
+sub ConvertPFn($);
+sub ConvertPFnInv($);
+
+my %onOff = ( 0 => 'On', 1 => 'Off' );
+my %offOn = ( 0 => 'Off', 1 => 'On' );
+my %disableEnable = ( 0 => 'Disable', 1 => 'Enable' );
+my %enableDisable = ( 0 => 'Enable', 1 => 'Disable' );
+my %convPFn = ( PrintConv => \&ConvertPfn, PrintConvInv => \&ConvertPfnInv );
+
+#------------------------------------------------------------------------------
+# Custom functions for the 1D
+# CanonCustom (keys are custom function number)
+%Image::ExifTool::CanonCustom::Functions1D = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    PROCESS_PROC => \&ProcessCanonCustom,
+    WRITE_PROC => \&WriteCanonCustom,
+    CHECK_PROC => \&CheckCanonCustom,
+    WRITABLE => 'int8u',
+    NOTES => q{
+        These custom functions are used by all 1D models up to but not including the
+        Mark III.
+    },
+    0 => {
+        Name => 'FocusingScreen',
+        PrintConv => {
+            0 => 'Ec-N, R',
+            1 => 'Ec-A,B,C,CII,CIII,D,H,I,L',
+        },
+    },
+    1 => {
+        Name => 'FinderDisplayDuringExposure',
+        PrintConv => \%offOn,
+    },
+    2 => {
+        Name => 'ShutterReleaseNoCFCard',
+        Description => 'Shutter Release W/O CF Card',
+        PrintConv => {
+            0 => 'Yes',
+            1 => 'No',
+        },
+    },
+    3 => {
+        Name => 'ISOSpeedExpansion',
+        Description => 'ISO Speed Expansion',
+        PrintConv => {
+            0 => 'No',
+            1 => 'Yes',
+        },
+    },
+    4 => {
+        Name => 'ShutterAELButton',
+        Description => 'Shutter Button/AEL Button',
+        PrintConv => {
+            0 => 'AF/AE lock stop',
+            1 => 'AE lock/AF',
+            2 => 'AF/AF lock, No AE lock',
+            3 => 'AE/AF, No AE lock',
+        },
+    },
+    5 => {
+        Name => 'ManualTv',
+        Description => 'Manual Tv/Av For M',
+        PrintConv => {
+            0 => 'Tv=Main/Av=Control',
+            1 => 'Tv=Control/Av=Main',
+            2 => 'Tv=Main/Av=Main w/o lens',
+            3 => 'Tv=Control/Av=Main w/o lens',
+        },
+    },
+    6 => {
+        Name => 'ExposureLevelIncrements',
+        PrintConv => {
+            0 => '1/3-stop set, 1/3-stop comp.',
+            1 => '1-stop set, 1/3-stop comp.',
+            2 => '1/2-stop set, 1/2-stop comp.',
+        },
+    },
+    7 => {
+        Name => 'USMLensElectronicMF',
+        PrintConv => {
+            0 => 'Turns on after one-shot AF',
+            1 => 'Turns off after one-shot AF',
+            2 => 'Always turned off',
+        },
+    },
+    8 => {
+        Name => 'LCDPanels',
+        Description => 'Top/Back LCD Panels',
+        PrintConv => {
+            0 => 'Remain. shots/File no.',
+            1 => 'ISO/Remain. shots',
+            2 => 'ISO/File no.',
+            3 => 'Shots in folder/Remain. shots',
+        },
+    },
+    9 => {
+        Name => 'AEBSequenceAutoCancel',
+        Description => 'AEB Sequence/Auto Cancel',
+        PrintConv => {
+            0 => '0,-,+/Enabled',
+            1 => '0,-,+/Disabled',
+            2 => '-,0,+/Enabled',
+            3 => '-,0,+/Disabled',
+        },
+    },
+    10 => {
+        Name => 'AFPointIllumination',
+        PrintConv => {
+            0 => 'On',
+            1 => 'Off',
+            2 => 'On without dimming',
+            3 => 'Brighter',
+        },
+    },
+    11 => {
+        Name => 'AFPointSelection',
+        PrintConv => {
+            0 => 'H=AF+Main/V=AF+Command',
+            1 => 'H=Comp+Main/V=Comp+Command',
+            2 => 'H=Command only/V=Assist+Main',
+            3 => 'H=FEL+Main/V=FEL+Command',
+        },
+    },
+    12 => {
+        Name => 'MirrorLockup',
+        PrintConv => \%disableEnable,
+    },
+    13 => {
+        Name => 'AFPointSpotMetering',
+        Description => 'No. AF Points/Spot Metering',
+        PrintConv => {
+            0 => '45/Center AF point',
+            1 => '11/Active AF point',
+            2 => '11/Center AF point',
+            3 => '9/Active AF point',
+        },
+    },
+    14 => {
+        Name => 'FillFlashAutoReduction',
+        PrintConv => \%enableDisable,
+    },
+    15 => {
+        Name => 'ShutterCurtainSync',
+        PrintConv => {
+            0 => '1st-curtain sync',
+            1 => '2nd-curtain sync',
+        },
+    },
+    16 => {
+        Name => 'SafetyShiftInAvOrTv',
+        PrintConv => \%disableEnable,
+    },
+    17 => {
+        Name => 'AFPointActivationArea',
+        PrintConv => {
+            0 => 'Single AF point',
+            1 => 'Expanded (TTL. of 7 AF points)',
+            2 => 'Automatic expanded (max. 13)',
+        },
+    },
+    18 => {
+        Name => 'SwitchToRegisteredAFPoint',
+        PrintConv => {
+            0 => 'Assist + AF',
+            1 => 'Assist',
+            2 => 'Only while pressing assist',
+        },
+    },
+    19 => {
+        Name => 'LensAFStopButton',
+        PrintConv => {
+            0 => 'AF stop',
+            1 => 'AF start',
+            2 => 'AE lock while metering',
+            3 => 'AF point: M -> Auto / Auto -> Ctr.',
+            4 => 'AF mode: ONE SHOT <-> AI SERVO',
+            5 => 'IS start',
+        },
+    },
+    20 => {
+        Name => 'AIServoTrackingSensitivity',
+        PrintConv => {
+            0 => 'Standard',
+            1 => 'Slow',
+            2 => 'Moderately slow',
+            3 => 'Moderately fast',
+            4 => 'Fast',
+        },
+    },
+    21 => {
+        Name => 'AIServoContinuousShooting',
+        PrintConv => {
+            0 => 'Shooting not possible without focus',
+            1 => 'Shooting possible without focus',
+        },
+    },
+);
+
+# Custom functions for the 5D (ref 3)
+%Image::ExifTool::CanonCustom::Functions5D = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    PROCESS_PROC => \&ProcessCanonCustom,
+    WRITE_PROC => \&WriteCanonCustom,
+    CHECK_PROC => \&CheckCanonCustom,
+    WRITABLE => 'int8u',
+    0 => {
+        Name => 'FocusingScreen',
+        PrintConv => {
+            0 => 'Ee-A',
+            1 => 'Ee-D',
+            2 => 'Ee-S',
+        },
+    },
+    1 => {
+        Name => 'SetFunctionWhenShooting',
+        PrintConv => {
+            0 => 'Default (no function)',
+            1 => 'Change quality',
+            2 => 'Change Parameters',
+            3 => 'Menu display',
+            4 => 'Image replay',
+        },
+    },
+    2 => {
+        Name => 'LongExposureNoiseReduction',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Auto',
+            2 => 'On',
+        },
+    },
+    3 => {
+        Name => 'FlashSyncSpeedAv',
+        PrintConv => {
+            0 => 'Auto',
+            1 => '1/200 Fixed',
+        },
+    },
+    4 => {
+        Name => 'Shutter-AELock',
+        PrintConv => {
+            0 => 'AF/AE lock',
+            1 => 'AE lock/AF',
+            2 => 'AF/AF lock, No AE lock',
+            3 => 'AE/AF, No AE lock',
+        },
+    },
+    5 => {
+        Name => 'AFAssistBeam',
+        PrintConv => {
+            0 => 'Emits',
+            1 => 'Does not emit',
+        },
+    },
+    6 => {
+        Name => 'ExposureLevelIncrements',
+        PrintConv => {
+            0 => '1/3 Stop',
+            1 => '1/2 Stop',
+        },
+    },
+    7 => {
+        Name => 'FlashFiring',
+        PrintConv => {
+            0 => 'Fires',
+            1 => 'Does not fire',
+        },
+    },
+    8 => {
+        Name => 'ISOExpansion',
+        PrintConv => \%offOn,
+    },
+    9 => {
+        Name => 'AEBSequenceAutoCancel',
+        Description => 'AEB Sequence/Auto Cancel',
+        PrintConv => {
+            0 => '0,-,+/Enabled',
+            1 => '0,-,+/Disabled',
+            2 => '-,0,+/Enabled',
+            3 => '-,0,+/Disabled',
+        },
+    },
+    10 => {
+        Name => 'SuperimposedDisplay',
+        PrintConv => \%onOff,
+    },
+    11 => {
+        Name => 'MenuButtonDisplayPosition',
+        PrintConv => {
+            0 => 'Previous (top if power off)',
+            1 => 'Previous',
+            2 => 'Top',
+        },
+    },
+    12 => {
+        Name => 'MirrorLockup',
+        PrintConv => \%disableEnable,
+    },
+    13 => {
+        Name => 'AFPointSelectionMethod',
+        PrintConv => {
+            0 => 'Normal',
+            1 => 'Multi-controller direct',
+            2 => 'Quick Control Dial direct',
+        },
+    },
+    14 => {
+        Name => 'ETTLII',
+        Description => 'E-TTL II',
+        PrintConv => {
+            0 => 'Evaluative',
+            1 => 'Average',
+        },
+    },
+    15 => {
+        Name => 'ShutterCurtainSync',
+        PrintConv => {
+            0 => '1st-curtain sync',
+            1 => '2nd-curtain sync',
+        },
+    },
+    16 => {
+        Name => 'SafetyShiftInAvOrTv',
+        PrintConv => \%disableEnable,
+    },
+    17 => {
+        Name => 'AFPointActivationArea',
+        PrintConv => {
+            0 => 'Standard',
+            1 => 'Expanded',
+        },
+    },
+    18 => {
+        Name => 'LCDDisplayReturnToShoot',
+        PrintConv => {
+            0 => 'With Shutter Button only',
+            1 => 'Also with * etc.',
+        },
+    },
+    19 => {
+        Name => 'LensAFStopButton',
+        PrintConv => {
+            0 => 'AF stop',
+            1 => 'AF start',
+            2 => 'AE lock while metering',
+            3 => 'AF point: M -> Auto / Auto -> Ctr.',
+            4 => 'ONE SHOT <-> AI SERVO',
+            5 => 'IS start',
+        },
+    },
+    20 => {
+        Name => 'AddOriginalDecisionData',
+        PrintConv => \%offOn,
+    },
+);
+
+# Custom functions for 10D
+%Image::ExifTool::CanonCustom::Functions10D = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    PROCESS_PROC => \&ProcessCanonCustom,
+    WRITE_PROC => \&WriteCanonCustom,
+    CHECK_PROC => \&CheckCanonCustom,
+    WRITABLE => 'int8u',
+    1 => {
+        Name => 'SetButtonWhenShooting',
+        PrintConv => {
+            0 => 'Normal (disabled)',
+            1 => 'Image quality',
+            2 => 'Change parameters',
+            3 => 'Menu display',
+            4 => 'Image playback',
+        },
+    },
+    2 => {
+        Name => 'ShutterReleaseNoCFCard',
+        Description => 'Shutter Release W/O CF Card',
+        PrintConv => {
+            0 => 'Yes',
+            1 => 'No',
+        },
+    },
+    3 => {
+        Name => 'FlashSyncSpeedAv',
+        PrintConv => {
+            0 => 'Auto',
+            1 => '1/200 Fixed',
+        },
+    },
+    4 => {
+        Name => 'Shutter-AELock',
+        PrintConv => {
+            0 => 'AF/AE lock',
+            1 => 'AE lock/AF',
+            2 => 'AF/AF lock, No AE lock',
+            3 => 'AE/AF, No AE lock',
+        },
+    },
+    5 => {
+        Name => 'AFAssist',
+        Description => 'AF Assist/Flash Firing',
+        PrintConv => {
+            0 => 'Emits/Fires',
+            1 => 'Does not emit/Fires',
+            2 => 'Only ext. flash emits/Fires',
+            3 => 'Emits/Does not fire',
+        },
+    },
+    6 => {
+        Name => 'ExposureLevelIncrements',
+        PrintConv => {
+            0 => '1/2 Stop',
+            1 => '1/3 Stop',
+        },
+    },
+    7 => {
+        Name => 'AFPointRegistration',
+        PrintConv => {
+            0 => 'Center',
+            1 => 'Bottom',
+            2 => 'Right',
+            3 => 'Extreme Right',
+            4 => 'Automatic',
+            5 => 'Extreme Left',
+            6 => 'Left',
+            7 => 'Top',
+        },
+    },
+    8 => {
+        Name => 'RawAndJpgRecording',
+        PrintConv => {
+            0 => 'RAW+Small/Normal',
+            1 => 'RAW+Small/Fine',
+            2 => 'RAW+Medium/Normal',
+            3 => 'RAW+Medium/Fine',
+            4 => 'RAW+Large/Normal',
+            5 => 'RAW+Large/Fine',
+        },
+    },
+    9 => {
+        Name => 'AEBSequenceAutoCancel',
+        Description => 'AEB Sequence/Auto Cancel',
+        PrintConv => {
+            0 => '0,-,+/Enabled',
+            1 => '0,-,+/Disabled',
+            2 => '-,0,+/Enabled',
+            3 => '-,0,+/Disabled',
+        },
+    },
+    10 => {
+        Name => 'SuperimposedDisplay',
+        PrintConv => \%onOff,
+    },
+    11 => {
+        Name => 'MenuButtonDisplayPosition',
+        PrintConv => {
+            0 => 'Previous (top if power off)',
+            1 => 'Previous',
+            2 => 'Top',
+        },
+    },
+    12 => {
+        Name => 'MirrorLockup',
+        PrintConv => \%disableEnable,
+    },
+    13 => {
+        Name => 'AssistButtonFunction',
+        PrintConv => {
+            0 => 'Normal',
+            1 => 'Select Home Position',
+            2 => 'Select HP (while pressing)',
+            3 => 'Av+/- (AF point by QCD)',
+            4 => 'FE lock',
+        },
+    },
+    14 => {
+        Name => 'FillFlashAutoReduction',
+        PrintConv => \%enableDisable,
+    },
+    15 => {
+        Name => 'ShutterCurtainSync',
+        PrintConv => {
+            0 => '1st-curtain sync',
+            1 => '2nd-curtain sync',
+        },
+    },
+    16 => {
+        Name => 'SafetyShiftInAvOrTv',
+        PrintConv => \%disableEnable,
+    },
+    17 => {
+        Name => 'LensAFStopButton',
+        PrintConv => {
+            0 => 'AF stop',
+            1 => 'AF start',
+            2 => 'AE lock while metering',
+            3 => 'AF point: M->Auto/Auto->ctr',
+            4 => 'One Shot <-> AI servo',
+            5 => 'IS start',
+        },
+    },
+);
+
+# Custom functions for the 20D (ref 2)
+%Image::ExifTool::CanonCustom::Functions20D = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    PROCESS_PROC => \&ProcessCanonCustom,
+    WRITE_PROC => \&WriteCanonCustom,
+    CHECK_PROC => \&CheckCanonCustom,
+    WRITABLE => 'int8u',
+    0 => {
+        Name => 'SetFunctionWhenShooting',
+        PrintConv => {
+            0 => 'Default (no function)',
+            1 => 'Change quality',
+            2 => 'Change Parameters',
+            3 => 'Menu display',
+            4 => 'Image replay',
+        },
+    },
+    1 => {
+        Name => 'LongExposureNoiseReduction',
+        PrintConv => \%offOn,
+    },
+    2 => {
+        Name => 'FlashSyncSpeedAv',
+        PrintConv => {
+            0 => 'Auto',
+            1 => '1/250 Fixed',
+        },
+    },
+    3 => {
+        Name => 'Shutter-AELock',
+        PrintConv => {
+            0 => 'AF/AE lock',
+            1 => 'AE lock/AF',
+            2 => 'AF/AF lock, No AE lock',
+            3 => 'AE/AF, No AE lock',
+        },
+    },
+    4 => {
+        Name => 'AFAssistBeam',
+        PrintConv => {
+            0 => 'Emits',
+            1 => 'Does not emit',
+            2 => 'Only ext. flash emits',
+        },
+    },
+    5 => {
+        Name => 'ExposureLevelIncrements',
+        PrintConv => {
+            0 => '1/3 Stop',
+            1 => '1/2 Stop',
+        },
+    },
+    6 => {
+        Name => 'FlashFiring',
+        PrintConv => {
+            0 => 'Fires',
+            1 => 'Does not fire',
+        },
+    },
+    7 => {
+        Name => 'ISOExpansion',
+        PrintConv => \%offOn,
+    },
+    8 => {
+        Name => 'AEBSequenceAutoCancel',
+        Description => 'AEB Sequence/Auto Cancel',
+        PrintConv => {
+            0 => '0,-,+/Enabled',
+            1 => '0,-,+/Disabled',
+            2 => '-,0,+/Enabled',
+            3 => '-,0,+/Disabled',
+        },
+    },
+    9 => {
+        Name => 'SuperimposedDisplay',
+        PrintConv => \%onOff,
+    },
+    10 => {
+        Name => 'MenuButtonDisplayPosition',
+        PrintConv => {
+            0 => 'Previous (top if power off)',
+            1 => 'Previous',
+            2 => 'Top',
+        },
+    },
+    11 => {
+        Name => 'MirrorLockup',
+        PrintConv => \%disableEnable,
+    },
+    12 => {
+        Name => 'AFPointSelectionMethod',
+        PrintConv => {
+            0 => 'Normal',
+            1 => 'Multi-controller direct',
+            2 => 'Quick Control Dial direct',
+        },
+    },
+    13 => {
+        Name => 'ETTLII',
+        Description => 'E-TTL II',
+        PrintConv => {
+            0 => 'Evaluative',
+            1 => 'Average',
+        },
+    },
+    14 => {
+        Name => 'ShutterCurtainSync',
+        PrintConv => {
+            0 => '1st-curtain sync',
+            1 => '2nd-curtain sync',
+        },
+    },
+    15 => {
+        Name => 'SafetyShiftInAvOrTv',
+        PrintConv => \%disableEnable,
+    },
+    16 => {
+        Name => 'LensAFStopButton',
+        PrintConv => {
+            0 => 'AF stop',
+            1 => 'AF start',
+            2 => 'AE lock while metering',
+            3 => 'AF point: M -> Auto / Auto -> Ctr.',
+            4 => 'ONE SHOT <-> AI SERVO',
+            5 => 'IS start',
+        },
+    },
+    17 => {
+        Name => 'AddOriginalDecisionData',
+        PrintConv => \%offOn,
+    },
+);
+
+# Custom functions for the 30D (PH)
+%Image::ExifTool::CanonCustom::Functions30D = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    PROCESS_PROC => \&ProcessCanonCustom,
+    WRITE_PROC => \&WriteCanonCustom,
+    CHECK_PROC => \&CheckCanonCustom,
+    WRITABLE => 'int8u',
+    1 => {
+        Name => 'SetFunctionWhenShooting',
+        PrintConv => {
+            0 => 'Default (no function)',
+            1 => 'Change quality',
+            2 => 'Change Picture Style',
+            3 => 'Menu display',
+            4 => 'Image replay',
+        },
+    },
+    2 => {
+        Name => 'LongExposureNoiseReduction',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Auto',
+            2 => 'On',
+        },
+    },
+    3 => {
+        Name => 'FlashSyncSpeedAv',
+        PrintConv => {
+            0 => 'Auto',
+            1 => '1/250 Fixed',
+        },
+    },
+    4 => {
+        Name => 'Shutter-AELock',
+        PrintConv => {
+            0 => 'AF/AE lock',
+            1 => 'AE lock/AF',
+            2 => 'AF/AF lock, No AE lock',
+            3 => 'AE/AF, No AE lock',
+        },
+    },
+    5 => {
+        Name => 'AFAssistBeam',
+        PrintConv => {
+            0 => 'Emits',
+            1 => 'Does not emit',
+            2 => 'Only ext. flash emits',
+        },
+    },
+    6 => {
+        Name => 'ExposureLevelIncrements',
+        PrintConv => {
+            0 => '1/3 Stop',
+            1 => '1/2 Stop',
+        },
+    },
+    7 => {
+        Name => 'FlashFiring',
+        PrintConv => {
+            0 => 'Fires',
+            1 => 'Does not fire',
+        },
+    },
+    8 => {
+        Name => 'ISOExpansion',
+        PrintConv => \%offOn,
+    },
+    9 => {
+        Name => 'AEBSequenceAutoCancel',
+        Description => 'AEB Sequence/Auto Cancel',
+        PrintConv => {
+            0 => '0,-,+/Enabled',
+            1 => '0,-,+/Disabled',
+            2 => '-,0,+/Enabled',
+            3 => '-,0,+/Disabled',
+        },
+    },
+    10 => {
+        Name => 'SuperimposedDisplay',
+        PrintConv => \%onOff,
+    },
+    11 => {
+        Name => 'MenuButtonDisplayPosition',
+        PrintConv => {
+            0 => 'Previous (top if power off)',
+            1 => 'Previous',
+            2 => 'Top',
+        },
+    },
+    12 => {
+        Name => 'MirrorLockup',
+        PrintConv => \%disableEnable,
+    },
+    13 => {
+        Name => 'AFPointSelectionMethod',
+        PrintConv => {
+            0 => 'Normal',
+            1 => 'Multi-controller direct',
+            2 => 'Quick Control Dial direct',
+        },
+    },
+    14 => {
+        Name => 'ETTLII',
+        Description => 'E-TTL II',
+        PrintConv => {
+            0 => 'Evaluative',
+            1 => 'Average',
+        },
+    },
+    15 => {
+        Name => 'ShutterCurtainSync',
+        PrintConv => {
+            0 => '1st-curtain sync',
+            1 => '2nd-curtain sync',
+        },
+    },
+    16 => {
+        Name => 'SafetyShiftInAvOrTv',
+        PrintConv => \%disableEnable,
+    },
+    17 => {
+        Name => 'MagnifiedView',
+        PrintConv => {
+            0 => 'Image playback only',
+            1 => 'Image review and playback',
+        },
+    },
+    18 => {
+        Name => 'LensAFStopButton',
+        PrintConv => {
+            0 => 'AF stop',
+            1 => 'AF start',
+            2 => 'AE lock while metering',
+            3 => 'AF point: M -> Auto / Auto -> Ctr.',
+            4 => 'ONE SHOT <-> AI SERVO',
+            5 => 'IS start',
+        },
+    },
+    19 => {
+        Name => 'AddOriginalDecisionData',
+        PrintConv => \%offOn,
+    },
+);
+
+# Custom functions for the 350D (PH)
+%Image::ExifTool::CanonCustom::Functions350D = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    PROCESS_PROC => \&ProcessCanonCustom,
+    WRITE_PROC => \&WriteCanonCustom,
+    CHECK_PROC => \&CheckCanonCustom,
+    WRITABLE => 'int8u',
+    0 => {
+        Name => 'SetButtonCrossKeysFunc',
+        PrintConv => {
+            0 => 'Normal',
+            1 => 'Set: Quality',
+            2 => 'Set: Parameter',
+            3 => 'Set: Playback',
+            4 => 'Cross keys: AF point select',
+        },
+    },
+    1 => {
+        Name => 'LongExposureNoiseReduction',
+        PrintConv => \%offOn,
+    },
+    2 => {
+        Name => 'FlashSyncSpeedAv',
+        PrintConv => {
+            0 => 'Auto',
+            1 => '1/200 Fixed',
+        },
+    },
+    3 => {
+        Name => 'Shutter-AELock',
+        PrintConv => {
+            0 => 'AF/AE lock',
+            1 => 'AE lock/AF',
+            2 => 'AF/AF lock, No AE lock',
+            3 => 'AE/AF, No AE lock',
+        },
+    },
+    4 => {
+        Name => 'AFAssistBeam',
+        PrintConv => {
+            0 => 'Emits',
+            1 => 'Does not emit',
+            2 => 'Only ext. flash emits',
+        },
+    },
+    5 => {
+        Name => 'ExposureLevelIncrements',
+        PrintConv => {
+            0 => '1/3 Stop',
+            1 => '1/2 Stop',
+        },
+    },
+    6 => {
+        Name => 'MirrorLockup',
+        PrintConv => \%disableEnable,
+    },
+    7 => {
+        Name => 'ETTLII',
+        Description => 'E-TTL II',
+        PrintConv => {
+            0 => 'Evaluative',
+            1 => 'Average',
+        },
+    },
+    8 => {
+        Name => 'ShutterCurtainSync',
+        PrintConv => {
+            0 => '1st-curtain sync',
+            1 => '2nd-curtain sync',
+        },
+    },
+);
+
+# Custom functions for the 400D (PH)
+%Image::ExifTool::CanonCustom::Functions400D = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    PROCESS_PROC => \&ProcessCanonCustom,
+    WRITE_PROC => \&WriteCanonCustom,
+    CHECK_PROC => \&CheckCanonCustom,
+    WRITABLE => 'int8u',
+    0 => {
+        Name => 'SetButtonCrossKeysFunc',
+        PrintConv => {
+            0 => 'Set: Picture Style',
+            1 => 'Set: Quality',
+            2 => 'Set: Flash Exposure Comp',
+            3 => 'Set: Playback',
+            4 => 'Cross keys: AF point select',
+        },
+    },
+    1 => {
+        Name => 'LongExposureNoiseReduction',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Auto',
+            2 => 'On',
+        },
+    },
+    2 => {
+        Name => 'FlashSyncSpeedAv',
+        PrintConv => {
+            0 => 'Auto',
+            1 => '1/200 Fixed',
+        },
+    },
+    3 => {
+        Name => 'Shutter-AELock',
+        PrintConv => {
+            0 => 'AF/AE lock',
+            1 => 'AE lock/AF',
+            2 => 'AF/AF lock, No AE lock',
+            3 => 'AE/AF, No AE lock',
+        },
+    },
+    4 => {
+        Name => 'AFAssistBeam',
+        PrintConv => {
+            0 => 'Emits',
+            1 => 'Does not emit',
+            2 => 'Only ext. flash emits',
+        },
+    },
+    5 => {
+        Name => 'ExposureLevelIncrements',
+        PrintConv => {
+            0 => '1/3 Stop',
+            1 => '1/2 Stop',
+        },
+    },
+    6 => {
+        Name => 'MirrorLockup',
+        PrintConv => \%disableEnable,
+    },
+    7 => {
+        Name => 'ETTLII',
+        Description => 'E-TTL II',
+        PrintConv => {
+            0 => 'Evaluative',
+            1 => 'Average',
+        },
+    },
+    8 => {
+        Name => 'ShutterCurtainSync',
+        PrintConv => {
+            0 => '1st-curtain sync',
+            1 => '2nd-curtain sync',
+        },
+    },
+    9 => {
+        Name => 'MagnifiedView',
+        PrintConv => {
+            0 => 'Image playback only',
+            1 => 'Image review and playback',
+        },
+    },
+    10 => {
+        Name => 'LCDDisplayAtPowerOn',
+        PrintConv => {
+            0 => 'Display',
+            1 => 'Retain power off status',
+        },
+    },
+);
+
+# Custom functions for the D30/D60
+%Image::ExifTool::CanonCustom::FunctionsD30 = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    PROCESS_PROC => \&ProcessCanonCustom,
+    WRITE_PROC => \&WriteCanonCustom,
+    CHECK_PROC => \&CheckCanonCustom,
+    NOTES => 'Custom functions for the EOS D30 and D60.',
+    WRITABLE => 'int8u',
+    1 => {
+        Name => 'LongExposureNoiseReduction',
+        PrintConv => \%offOn,
+    },
+    2 => {
+        Name => 'Shutter-AELock',
+        PrintConv => {
+            0 => 'AF/AE lock',
+            1 => 'AE lock/AF',
+            2 => 'AF/AF lock',
+            3 => 'AE+release/AE+AF',
+        },
+    },
+    3 => {
+        Name => 'MirrorLockup',
+        PrintConv => \%disableEnable,
+    },
+    4 => {
+        Name => 'ExposureLevelIncrements',
+        PrintConv => {
+            0 => '1/2 Stop',
+            1 => '1/3 Stop',
+        },
+    },
+    5 => {
+        Name => 'AFAssist',
+        PrintConv => {
+            0 => 'Emits/Fires',
+            1 => 'Does not emit/Fires',
+            2 => 'Only ext. flash emits/Fires',
+            3 => 'Emits/Does not fire',
+        },
+    },
+    6 => {
+        Name => 'FlashSyncSpeedAv',
+        PrintConv => {
+            0 => 'Auto',
+            1 => '1/200 Fixed',
+        },
+    },
+    7 => {
+        Name => 'AEBSequenceAutoCancel',
+        Description => 'AEB Sequence/Auto Cancel',
+        PrintConv => {
+            0 => '0,-,+/Enabled',
+            1 => '0,-,+/Disabled',
+            2 => '-,0,+/Enabled',
+            3 => '-,0,+/Disabled',
+        },
+    },
+    8 => {
+        Name => 'ShutterCurtainSync',
+        PrintConv => {
+            0 => '1st-curtain sync',
+            1 => '2nd-curtain sync',
+        },
+    },
+    9 => {
+        Name => 'LensAFStopButton',
+        PrintConv => {
+            0 => 'AF Stop',
+            1 => 'Operate AF',
+            2 => 'Lock AE and start timer',
+        },
+    },
+    10 => {
+        Name => 'FillFlashAutoReduction',
+        PrintConv => \%enableDisable,
+    },
+    11 => {
+        Name => 'MenuButtonReturn',
+        PrintConv => {
+            0 => 'Top',
+            1 => 'Previous (volatile)',
+            2 => 'Previous',
+        },
+    },
+    12 => {
+        Name => 'SetButtonWhenShooting',
+        PrintConv => {
+            0 => 'Default (no function)',
+            1 => 'Image quality',
+            2 => 'Change ISO speed',
+            3 => 'Change parameters',
+        },
+    },
+    13 => {
+        Name => 'SensorCleaning',
+        PrintConv => \%disableEnable,
+    },
+    14 => {
+        Name => 'SuperimposedDisplay',
+        PrintConv => \%onOff,
+    },
+    15 => {
+        Name => 'ShutterReleaseNoCFCard',
+        Description => 'Shutter Release W/O CF Card',
+        PrintConv => {
+            0 => 'Yes',
+            1 => 'No',
+        },
+    },
+);
+
+# Custom functions for unknown cameras
+%Image::ExifTool::CanonCustom::FuncsUnknown = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    PROCESS_PROC => \&ProcessCanonCustom,
+);
+
+# 1D personal function settings (ref PH)
+%Image::ExifTool::CanonCustom::PersonalFuncs = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    NOTES => 'Personal function settings for the EOS-1D.',
+    FORMAT => 'int16u',
+    FIRST_ENTRY => 1,
+    1 => { Name => 'PF0CustomFuncRegistration', %convPFn },
+    2 => { Name => 'PF1DisableShootingModes',   %convPFn },
+    3 => { Name => 'PF2DisableMeteringModes',   %convPFn },
+    4 => { Name => 'PF3ManualExposureMetering', %convPFn },
+    5 => { Name => 'PF4ExposureTimeLimits',     %convPFn },
+    6 => { Name => 'PF5ApertureLimits',         %convPFn },
+    7 => { Name => 'PF6PresetShootingModes',    %convPFn },
+    8 => { Name => 'PF7BracketContinuousShoot', %convPFn },
+    9 => { Name => 'PF8SetBracketShots',        %convPFn },
+    10 => { Name => 'PF9ChangeBracketSequence', %convPFn },
+    11 => { Name => 'PF10RetainProgramShift',   %convPFn },
+    #12 => { Name => 'PF11Unused',               %convPFn },
+    #13 => { Name => 'PF12Unused',               %convPFn },
+    14 => { Name => 'PF13DrivePriority',        %convPFn },
+    15 => { Name => 'PF14DisableFocusSearch',   %convPFn },
+    16 => { Name => 'PF15DisableAFAssistBeam',  %convPFn },
+    17 => { Name => 'PF16AutoFocusPointShoot',  %convPFn },
+    18 => { Name => 'PF17DisableAFPointSel',    %convPFn },
+    19 => { Name => 'PF18EnableAutoAFPointSel', %convPFn },
+    20 => { Name => 'PF19ContinuousShootSpeed', %convPFn },
+    21 => { Name => 'PF20LimitContinousShots',  %convPFn },
+    22 => { Name => 'PF21EnableQuietOperation', %convPFn },
+    #23 => { Name => 'PF22Unused',               %convPFn },
+    24 => { Name => 'PF23SetTimerLengths',      %convPFn },
+    25 => { Name => 'PF24LightLCDDuringBulb',   %convPFn },
+    26 => { Name => 'PF25DefaultClearSettings', %convPFn },
+    27 => { Name => 'PF26ShortenReleaseLag',    %convPFn },
+    28 => { Name => 'PF27ReverseDialRotation',  %convPFn },
+    29 => { Name => 'PF28NoQuickDialExpComp',   %convPFn },
+    30 => { Name => 'PF29QuickDialSwitchOff',   %convPFn },
+    31 => { Name => 'PF30EnlargementMode',      %convPFn },
+    32 => { Name => 'PF31OriginalDecisionData', %convPFn },
+);
+
+# 1D personal function values (ref PH)
+%Image::ExifTool::CanonCustom::PersonalFuncValues = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FORMAT => 'int16u',
+    FIRST_ENTRY => 1,
+    1 => 'PF1Value',
+    2 => 'PF2Value',
+    3 => 'PF3Value',
+    4 => {
+        Name => 'PF4ExposureTimeMin',
+        RawConv => '$val > 0 ? $val : 0',
+        ValueConv => 'exp(-Image::ExifTool::Canon::CanonEv($val*4)*log(2))*1000/8',
+        ValueConvInv => 'Image::ExifTool::Canon::CanonEvInv(-log($val*8/1000)/log(2))/4',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    5 => {
+        Name => 'PF4ExposureTimeMax',
+        RawConv => '$val > 0 ? $val : 0',
+        ValueConv => 'exp(-Image::ExifTool::Canon::CanonEv($val*4)*log(2))*1000/8',
+        ValueConvInv => 'Image::ExifTool::Canon::CanonEvInv(-log($val*8/1000)/log(2))/4',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    6 => {
+        Name => 'PF5ApertureMin',
+        RawConv => '$val > 0 ? $val : 0',
+        ValueConv => 'exp(Image::ExifTool::Canon::CanonEv($val*4-32)*log(2)/2)',
+        ValueConvInv => '(Image::ExifTool::Canon::CanonEvInv(log($val)*2/log(2))+32)/4',
+        PrintConv => 'sprintf("%.2g",$val)',
+        PrintConvInv => '$val',
+    },
+    7 => {
+        Name => 'PF5ApertureMax',
+        RawConv => '$val > 0 ? $val : 0',
+        ValueConv => 'exp(Image::ExifTool::Canon::CanonEv($val*4-32)*log(2)/2)',
+        ValueConvInv => '(Image::ExifTool::Canon::CanonEvInv(log($val)*2/log(2))+32)/4',
+        PrintConv => 'sprintf("%.2g",$val)',
+        PrintConvInv => '$val',
+    },
+    8 => 'PF8BracketShots',
+    9 => 'PF19ShootingSpeedLow',
+    10 => 'PF19ShootingSpeedHigh',
+    11 => 'PF20MaxContinousShots',
+    12 => 'PF23ShutterButtonTime',
+    13 => 'PF23FELockTime',
+    14 => 'PF23PostReleaseTime',
+    15 => 'PF25AEMode',
+    16 => 'PF25MeteringMode',
+    17 => 'PF25DriveMode',
+    18 => 'PF25AFMode',
+    19 => 'PF25AFPointSel',
+    20 => 'PF25ImageSize',
+    21 => 'PF25WBMode',
+    22 => 'PF25Parameters',
+    23 => 'PF25ColorMatrix',
+    24 => 'PF27Value',
+);
+
+# Custom functions used by the 1D Mark III and later models (ref PH)
+%Image::ExifTool::CanonCustom::Functions2 = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    PROCESS_PROC => \&ProcessCanonCustom2,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    WRITE_PROC => \&WriteCanonCustom2,
+    WRITABLE => 'int32s',
+    NOTES => q{
+        Beginning with the EOS 1D Mark III, Canon finally created a set of custom
+        function tags which are (reasonably) consistent across models.  The EOS 1D
+        Mark III has 57 custom function tags divided into four main groups: 1.
+        Exposure (0x0101-0x010f), 2. Image (0x0201-0x0203), Flash Exposure
+        (0x0304-0x0306) and Display (0x0407-0x0409), 3. Auto Focus (0x0501-0x050e)
+        and Drive (0x060f-0x0611), and 4. Operation (0x0701-0x070a) and Others
+        (0x080b-0x0810).  The table below lists tags used by the EOS 1D Mark III, as
+        well as newer tags and values added by later models.
+    },
+    # grouped in 4 groups:
+    # 1) Exposure
+    0x0101 => [
+        {
+            Name => 'ExposureLevelIncrements',
+            Condition => '$$self{Model} =~ /\b1Ds?\b/',
+            Notes => '1DmkIII and 1DmkIV',
+            PrintConv => {
+                0 => '1/3-stop set, 1/3-stop comp.',
+                1 => '1-stop set, 1/3-stop comp.',
+                2 => '1/2-stop set, 1/2-stop comp.',
+            },
+        },
+        {
+            Name => 'ExposureLevelIncrements',
+            Notes => 'other models',
+            PrintConv => {
+                0 => '1/3 Stop',
+                1 => '1/2 Stop',
+            },
+        },
+    ],
+    0x0102 => {
+        Name => 'ISOSpeedIncrements',
+        PrintConv => {
+            0 => '1/3 Stop',
+            1 => '1 Stop',
+        },
+    },
+    0x0103 => [
+        {
+            Name => 'ISOSpeedRange',
+            Condition => '$$self{Model} =~ /\b1D/',
+            Notes => '1DmkIII and 1DmkIV',
+            Count => 3,
+            # (this decoding may not be valid for CR2 images?)
+            ValueConv => [
+                undef,
+                # this may also be set to "H" (Hi6400) -- is this the -1 value I see? - PH
+                '$val < 2 ? $val : ($val < 1000 ? exp(($val/8-9)*log(2))*100 : 0)', # (educated guess)
+                # this may also be set to "L" (Lo50) -- is this the 1 value I see? - PH
+                '$val < 2 ? $val : ($val < 1000 ? exp(($val/8-9)*log(2))*100 : 0)', # (educated guess)
+            ],
+            ValueConvInv => [
+                undef,
+                '$val < 2 ? $val : int(8*(log($val/100)/log(2)+9) + 0.5)',
+                '$val < 2 ? $val : int(8*(log($val/100)/log(2)+9) + 0.5)',
+            ],
+            PrintConv => [
+                \%disableEnable,
+                'sprintf("Max %.0f",$val)',
+                'sprintf("Min %.0f",$val)',
+            ],
+            PrintConvInv => [
+                undef,
+                '$val=~/(-?[\d.]+)/ ? $1 : 0',
+                '$val=~/(-?[\d.]+)/ ? $1 : 0',
+            ],
+        },
+        {
+            Name => 'ISOExpansion',
+            Notes => 'other models',
+            PrintConv => {
+                0 => 'Off',
+                1 => 'On',
+            },
+        },
+    ],
+    0x0104 => {
+        Name => 'AEBAutoCancel',
+        PrintConv => \%onOff,
+    },
+    0x0105 => {
+        Name => 'AEBSequence',
+        Notes => 'value of 2 not used by 40D, 50D, 60D, 5DmkII and 7D',
+        PrintConv => {
+            0 => '0,-,+',
+            1 => '-,0,+',
+            2 => '+,0,-',
+        },
+    },
+    0x0106 => {
+        Name => 'AEBShotCount',
+        Count => -1,
+        Notes => '1 value for the 1DmkIII, 2 for the 1DmkIV',
+        PrintConv => [{
+            0 => 3,
+            1 => 2,
+            2 => 5,
+            3 => 7,
+        }],
+    },
+    0x0107 => {
+        Name => 'SpotMeterLinkToAFPoint',
+        PrintConv => {
+            0 => 'Disable (use center AF point)',
+            1 => 'Enable (use active AF point)',
+        },
+    },
+    0x0108 => {
+        Name => 'SafetyShift',
+        Notes => 'value of 2 not used by 40D, 50D, 60D, 5DmkII and 7D',
+        PrintConv => {
+            0 => 'Disable',
+            1 => 'Enable (Tv/Av)',
+            2 => 'Enable (ISO speed)',
+        },
+    },
+    0x0109 => {
+        Name => 'UsableShootingModes',
+        Count => 2,
+        PrintConv => [
+            \%disableEnable,
+            'sprintf("Flags 0x%x",$val)', # (M, Tv, Av, P, Bulb)
+        ],
+        PrintConvInv => [
+            undef,
+            '$val=~/0x([\dA-F]+)/i ? hex($1) : undef',
+        ],
+    },
+    0x010a => {
+        Name => 'UsableMeteringModes',
+        Count => 2,
+        PrintConv => [
+            \%disableEnable,
+            'sprintf("Flags 0x%x",$val)', # (evaluative,partial,spot,center-weighted average)
+        ],
+        PrintConvInv => [
+            undef,
+            '$val=~/0x([\dA-F]+)/i ? hex($1) : undef',
+        ],
+    },
+    0x010b => {
+        Name => 'ExposureModeInManual',
+        PrintConv => {
+            0 => 'Specified metering mode',
+            1 => 'Evaluative metering',
+            2 => 'Partial metering',
+            3 => 'Spot metering',
+            4 => 'Center-weighted average',
+        },
+    },
+    0x010c => {
+        Name => 'ShutterSpeedRange',
+        Count => 3,
+        ValueConv => [
+            undef,
+            'exp(-($val/8-7)*log(2))',
+            'exp(-($val/8-7)*log(2))',
+        ],
+        ValueConvInv => [
+            undef,
+            'int(-8*(log($val)/log(2)-7) + 0.5)',
+            'int(-8*(log($val)/log(2)-7) + 0.5)',
+        ],
+        PrintConv => [
+            \%disableEnable,
+            '"Hi " . Image::ExifTool::Exif::PrintExposureTime($val)',
+            '"Lo " . Image::ExifTool::Exif::PrintExposureTime($val)',
+        ],
+        PrintConvInv => [
+            undef,
+            '$val=~m{([\d./]+)} ? eval $1 : 0',
+            '$val=~m{([\d./]+)} ? eval $1 : 0',
+        ],
+    },
+    0x010d => {
+        Name => 'ApertureRange',
+        Count => 3,
+        ValueConv => [
+            undef,
+            'exp(($val/8-1)*log(2)/2)',
+            'exp(($val/8-1)*log(2)/2)',
+        ],
+        ValueConvInv => [
+            undef,
+            'int(8*(log($val)*2/log(2)+1) + 0.5)',
+            'int(8*(log($val)*2/log(2)+1) + 0.5)',
+        ],
+        PrintConv => [
+            \%disableEnable,
+            'sprintf("Closed %.2g",$val)',
+            'sprintf("Open %.2g",$val)',
+        ],
+        PrintConvInv => [
+            undef,
+            '$val=~/([\d.]+)/ ? $1 : 0',
+            '$val=~/([\d.]+)/ ? $1 : 0',
+        ],
+    },
+    0x010e => {
+        Name => 'ApplyShootingMeteringMode',
+        Count => 8,
+        PrintConv => [ \%disableEnable ],
+    },
+    0x010f => [
+        {
+            Name => 'FlashSyncSpeedAv',
+            Condition => '$$self{Model} =~ /\b40D\b/',
+            Notes => '40D',
+            PrintConv => {
+                0 => 'Auto',
+                1 => '1/250 Fixed',
+            },
+        },
+        {
+            Name => 'FlashSyncSpeedAv',
+            Condition => '$$self{Model} =~ /\b(50D|60D|7D)\b/',
+            Notes => '50D, 60D and 7D',
+            PrintConv => {
+                0 => 'Auto',
+                1 => '1/250-1/60 Auto',
+                2 => '1/250 Fixed',
+            },
+        },
+        {
+            Name => 'FlashSyncSpeedAv',
+            Condition => '$$self{Model} =~ /\b(450D|XSi|Kiss X2|1000D|XS|Kiss F)\b/',
+            Notes => '450D and 1000D',
+            PrintConv => {
+                0 => 'Auto',
+                1 => '1/200 Fixed',
+            },
+        },
+        {
+            Name => 'FlashSyncSpeedAv',
+            Condition => '$$self{Model} =~ /\b(5D Mark II|500D|T1i|Kiss X3|550D|T2i|Kiss X4)\b/',
+            Notes => '5D Mark II, 500D and 550D',
+            PrintConv => {
+                0 => 'Auto',
+                1 => '1/200-1/60 Auto',
+                2 => '1/200 Fixed',
+            },
+        },
+        {
+            Name => 'FlashSyncSpeedAv',
+            Condition => '$$self{Model} =~ /\b(EOS-1D Mark IV)\b/',
+            Notes => '1D Mark IV',
+            PrintConv => {
+                0 => 'Auto',
+                1 => '1/300-1/60 Auto',
+                2 => '1/300 Fixed',
+            },
+        },
+        {
+            Name => 'FlashSyncSpeedAv',
+            Notes => '1D Mark III',
+            PrintConv => {
+                0 => 'Auto',
+                1 => '1/300 Fixed',
+            },
+        },
+    ],
+    0x0110 => { # new for 1DmkIV
+        Name => 'FEMicroadjustment',
+        Count => 3,
+        PrintConv => [ \%disableEnable ],
+    },
+    0x0111 => { # new for 1DmkIV
+        Name => 'AEMicroadjustment',
+        Count => 3,
+        PrintConv => [ \%disableEnable ],
+    },
+    #### 2a) Image
+    0x0201 => {
+        Name => 'LongExposureNoiseReduction',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Auto',
+            2 => 'On',
+        },
+    },
+    0x0202 => [
+        {
+            Name => 'HighISONoiseReduction',
+            Condition => '$$self{Model} =~ /\b(50D|60D|5D Mark II|7D|500D|T1i|Kiss X3|550D|T2i|Kiss X4)\b/',
+            Notes => '50D, 60D, 500D, 550D, 5DmkII and 7D',
+            PrintConv => {
+                0 => 'Standard',
+                1 => 'Low',
+                2 => 'Strong',
+                3 => 'Off',
+            },
+        },
+        {
+            Name => 'HighISONoiseReduction',
+            Notes => 'other models',
+            PrintConv => \%offOn,
+        },
+    ],
+    0x0203 => {
+        Name => 'HighlightTonePriority',
+        PrintConv => \%disableEnable
+    },
+    0x0204 => [
+        {
+            Name => 'AutoLightingOptimizer',
+            Condition => '$$self{Model} =~ /\b(50D|5D Mark II|500D|T1i|Kiss X3|1D Mark IV)\b/',
+            Notes => '50D, 500D, 5DmkII and 1DmkIV',
+            PrintConv => {
+                0 => 'Standard',
+                1 => 'Low',
+                2 => 'Strong',
+                3 => 'Disable',
+            },
+        },
+        {
+            Name => 'AutoLightingOptimizer',
+            Notes => 'other models',
+            PrintConv => \%enableDisable,
+        },
+    ],
+    #### 2b) Flash exposure
+    0x0304 => {
+        Name => 'ETTLII',
+        Description => 'E-TTL II',
+        PrintConv => {
+            0 => 'Evaluative',
+            1 => 'Average',
+        },
+    },
+    0x0305 => {
+        Name => 'ShutterCurtainSync',
+        PrintConv => {
+            0 => '1st-curtain sync',
+            1 => '2nd-curtain sync',
+        },
+    },
+    0x0306 => {
+        Name => 'FlashFiring',
+        PrintConv => {
+            0 => 'Fires',
+            1 => 'Does not fire',
+        },
+    },
+    #### 2c) Display
+    0x0407 => {
+        Name => 'ViewInfoDuringExposure',
+        PrintConv => \%disableEnable,
+    },
+    0x0408 => {
+        Name => 'LCDIlluminationDuringBulb',
+        PrintConv => \%offOn,
+    },
+    0x0409 => [
+        {
+            Name => 'InfoButtonWhenShooting',
+            Condition => '$$self{Model} =~ /\b1Ds? Mark III\b/',
+            Notes => '1D Mark III',
+            PrintConv => {
+                0 => 'Displays camera settings',
+                1 => 'Displays shooting functions',
+            },
+        },
+        {
+            Name => 'InfoButtonWhenShooting',
+            Notes => '1D Mark IV',
+            PrintConv => {
+                # reversed from earlier models. grr...
+                0 => 'Displays shooting functions',
+                1 => 'Displays camera settings',
+            },
+        },
+    ],
+    #### 3a) Auto focus
+    0x0501 => {
+        Name => 'USMLensElectronicMF',
+        PrintConv => {
+            0 => 'Enable after one-shot AF',
+            1 => 'Disable after one-shot AF',
+            2 => 'Disable in AF mode',
+        },
+    },
+    0x0502 => {
+        Name => 'AIServoTrackingSensitivity',
+        PrintConv => {
+           -2 => 'Slow',
+           -1 => 'Medium Slow',
+            0 => 'Standard',
+            1 => 'Medium Fast',
+            2 => 'Fast',
+        },
+    },
+    0x0503 => {
+        Name => 'AIServoImagePriority',
+        PrintConv => {
+            0 => '1: AF, 2: Tracking',
+            1 => '1: AF, 2: Drive speed',
+            2 => '1: Release, 2: Drive speed',
+            3 => '1: Release, 2: Tracking', # 7D/1DmkIV
+        },
+    },
+    0x0504 => {
+        Name => 'AIServoTrackingMethod',
+        PrintConv => {
+            0 => 'Main focus point priority',
+            1 => 'Continuous AF track priority',
+        },
+    },
+    0x0505 => {
+        Name => 'LensDriveNoAF',
+        PrintConv => {
+            0 => 'Focus search on',
+            1 => 'Focus search off',
+        },
+    },
+    0x0506 => {
+        Name => 'LensAFStopButton',
+        Notes => 'value of 6 not used by 40D, 50D and 5DmkII',
+        PrintConv => {
+            0 => 'AF stop',
+            1 => 'AF start',
+            2 => 'AE lock',
+            3 => 'AF point: M->Auto/Auto->ctr',
+            4 => 'One Shot <-> AI servo',
+            5 => 'IS start',
+            6 => 'Switch to registered AF point',
+            7 => 'Spot AF', # 1DmkIV
+        },
+    },
+    0x0507 => {
+        Name => 'AFMicroadjustment',
+        Count => 5,
+        PrintConv => [
+            {
+                0 => 'Disable',
+                1 => 'Adjust all by same amount',
+                2 => 'Adjust by lens',
+            },
+            # DECODE OTHER VALUES
+        ],
+    },
+    0x0508 => [
+        {
+            Name => 'AFPointAreaExpansion',
+            Condition => '$$self{Model} =~ /\b5D Mark II\b/',
+            Notes => '5D Mark II',
+            PrintConv => {
+                0 => 'Disable',
+                1 => 'Enable',
+            },
+        },
+        {
+            Name => 'AFPointAreaExpansion',
+            PrintConv => {
+                0 => 'Disable',
+                1 => 'Left/right AF points',
+                2 => 'Surrounding AF points',
+                3 => 'All 45 points area', # 1DmkIV
+            },
+        },
+    ],
+    0x0509 => [
+        {
+            Name => 'SelectableAFPoint',
+            Condition => '$$self{Model} =~ /\b1D Mark IV\b/',
+            Notes => '1D Mark IV',
+            PrintConv => {
+                 0 => '45 points',
+                 1 => '19 points',
+                 2 => '11 points',
+                 3 => 'Inner 9 points',
+                 4 => 'Outer 9 points',
+            },
+        },
+        {
+            Name => 'SelectableAFPoint',
+            Notes => 'other models',
+            PrintConv => {
+                0 => '19 points',
+                1 => 'Inner 9 points',
+                2 => 'Outer 9 points',
+                3 => '19 Points, Multi-controller selectable', #4
+                4 => 'Inner 9 Points, Multi-controller selectable', #4
+                5 => 'Outer 9 Points, Multi-controller selectable', #4
+            },
+        },
+    ],
+    0x050a => [
+        {
+            Name => 'SwitchToRegisteredAFPoint',
+            Condition => '$$self{Model} =~ /\b1D Mark IV\b/',
+            Notes => '1D Mark IV',
+            PrintConv => {
+                0 => 'Disable',
+                1 => 'Switch with multi-controller',
+                2 => 'Only while AEL is pressed',
+            },
+        },
+        {
+            Name => 'SwitchToRegisteredAFPoint',
+            Notes => 'other models',
+            PrintConv => \%disableEnable,
+        },
+    ],
+    0x050b => {
+        Name => 'AFPointAutoSelection',
+        PrintConv => {
+            0 => 'Control-direct:disable/Main:enable',
+            1 => 'Control-direct:disable/Main:disable',
+            2 => 'Control-direct:enable/Main:enable',
+        },
+    },
+    0x050c => {
+        Name => 'AFPointDisplayDuringFocus',
+        PrintConv => {
+            0 => 'On',
+            1 => 'Off',
+            2 => 'On (when focus achieved)',
+        },
+    },
+    0x050d => {
+        Name => 'AFPointBrightness',
+        PrintConv => {
+            0 => 'Normal',
+            1 => 'Brighter',
+        },
+    },
+    0x050e => [
+        {
+            Name => 'AFAssistBeam',
+            Condition => '$$self{Model} =~ /\b1D Mark IV\b/',
+            Notes => '1D Mark IV',
+            PrintConv => {
+                0 => 'Emits',
+                1 => 'Does not emit',
+                2 => 'IR AF assist beam only',
+            },
+        },
+        {
+            Name => 'AFAssistBeam',
+            Notes => 'other models; values 2-3 not used by 1DmkIII or 5DmkII, value 3 new for 7D',
+            PrintConv => {
+                0 => 'Emits',
+                1 => 'Does not emit',
+                2 => 'Only ext. flash emits',
+                3 => 'IR AF assist beam only', # new for 7D
+            },
+        },
+    ],
+    0x050f => [ # new for 40D
+        {
+            Name => 'AFPointSelectionMethod',
+            Condition => '$$self{Model} !~ /\b60D\b/',
+            Notes => '40D, 50D and 5DmkII',
+            PrintConv => {
+                0 => 'Normal',
+                1 => 'Multi-controller direct',
+                2 => 'Quick Control Dial direct',
+            },
+        },
+        {
+            Name => 'AFPointSelectionMethod',
+            Notes => '60D',
+            PrintConv => {
+                0 => 'AF point button: Activate AF Sel; Rear dial: Select AF points',
+                1 => 'AF point button: Auto selection; Rear dial: Manual selection',
+            },
+        },
+    ],
+    0x0510 => [ # new for 40D
+        {
+            Name => 'VFDisplayIllumination',
+            Condition => '$$self{Model} =~ /\b7D\b/',
+            Notes => '7D',
+            PrintConv => {
+                0 => 'Auto',
+                1 => 'Enable',
+                2 => 'Disable',
+            },
+        },
+        {
+            Name => 'SuperimposedDisplay',
+            Notes => 'other models',
+            PrintConv => \%onOff,
+        },
+    ],
+    0x0511 => [ # new for 40D
+        {
+            Name => 'AFDuringLiveView',
+            Condition => '$$self{Model} =~ /\b40D\b/',
+            Notes => '40D',
+            PrintConv => \%disableEnable,
+        },
+        {
+            Name => 'AFDuringLiveView',
+            Notes => '450D and 1000D',
+            PrintConv => {
+                0 => 'Disable',
+                1 => 'Quick mode',
+                2 => 'Live mode',
+            },
+        },
+    ],
+    0x0512 => { # new for 7D
+        Name => 'SelectAFAreaSelectMode',
+        PrintConv => [
+            {
+                0 => 'Disable',
+                1 => 'Enable',
+                2 => 'Register',
+                3 => 'Select AF-modes',
+            },
+            # must decode 2nd value
+        ],
+    },
+    0x0513 => { # new for 7D
+        Name => 'ManualAFPointSelectPattern',
+        PrintConv => {
+            0 => 'Stops at AF area edges',
+            1 => 'Continuous',
+        },
+    },
+    0x0514 => { # new for 7D
+        Name => 'DisplayAllAFPoints',
+        PrintConv => \%enableDisable,
+    },
+    0x0515 => { # new for 7D
+        Name => 'FocusDisplayAIServoAndMF',
+        PrintConv => \%enableDisable,
+    },
+    0x0516 => { # new for 7D and 1DmkIV
+        Name => 'OrientationLinkedAFPoint',
+        PrintConv => {
+            0 => 'Same for verical and horizontal',
+            1 => 'Select different AF points',
+        },
+    },
+    0x0517 => { # new for 1DmkIV
+        Name => 'MultiControllerWhileMetering',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'AF point selection',
+        },
+    },
+    #### 3b) Drive
+    0x060f => {
+        Name => 'MirrorLockup',
+        Notes => 'value of 2 not used by some models',
+        PrintConv => {
+            0 => 'Disable',
+            1 => 'Enable',
+            2 => 'Enable: Down with Set',
+        },
+    },
+    0x0610 => {
+        Name => 'ContinuousShootingSpeed',
+        Count => 3,
+        PrintConv => [
+            \%disableEnable,
+            '"Hi $val"',
+            '"Lo $val"',
+        ],
+        PrintConvInv => [
+            undef,
+            '$val=~/(\d+)/ ? $1 : 0',
+            '$val=~/(\d+)/ ? $1 : 0',
+        ],
+    },
+    0x0611 => {
+        Name => 'ContinuousShotLimit',
+        Count => 2,
+        PrintConv => [
+            \%disableEnable,
+            '"$val shots"',
+        ],
+        PrintConvInv => [
+            undef,
+            '$val=~/(\d+)/ ? $1 : 0',
+        ],
+    },
+    #### 4a) Operation
+    0x0701 => [
+        {
+            Name => 'Shutter-AELock',
+            Condition => '$$self{Model} =~ /\b(1000D|XS|Kiss F|500D|T1i|Kiss X3|550D|T2i|Kiss X4)\b/',
+            Notes => '500D, 550D and 1000D',
+            PrintConv => {
+                0 => 'AF/AE lock',
+                1 => 'AE lock/AF',
+                2 => 'AF/AF lock, No AE lock',
+                3 => 'AE/AF, No AE lock',
+            },
+        },
+        {
+            Name => 'AFAndMeteringButtons',
+            Condition => '$$self{Model} =~ /\b60D\b/',
+            Notes => '60D',
+            PrintConv => {
+                0 => 'Metering start',
+                1 => 'Metering + AF start',
+                2 => 'AE lock',
+                3 => 'AF stop',
+                4 => 'No function',
+            },
+        },
+        {
+            Name => 'ShutterButtonAFOnButton',
+            Notes => 'other models',
+            PrintConv => {
+                0 => 'Metering + AF start',
+                1 => 'Metering + AF start/AF stop',
+                2 => 'Metering start/Meter + AF start',
+                3 => 'AE lock/Metering + AF start',
+                4 => 'Metering + AF start/disable',
+            },
+        },
+    ],
+    0x0702 => {
+        Name => 'AFOnAELockButtonSwitch',
+        PrintConv => \%disableEnable,
+    },
+    0x0703 => {
+        Name => 'QuickControlDialInMeter',
+        PrintConv => {
+            0 => 'Exposure comp/Aperture',
+            1 => 'AF point selection',
+            2 => 'ISO speed',
+            3 => 'AF point selection swapped with Exposure comp', #4
+            4 => 'ISO speed swapped with Exposure comp', #4
+        },
+    },
+    0x0704 => [
+        {
+            Name => 'SetButtonWhenShooting',
+            Condition => '$$self{Model} =~ /\b(40D|50D|5D Mark II)\b/',
+            Notes => '40D, 50D and 5DmkII; value of 5 is new for 50D, and 6 is new for 5DmkII',
+            PrintConv => {
+                0 => 'Normal (disabled)',
+                1 => 'Image quality',
+                2 => 'Picture style',
+                3 => 'Menu display',
+                4 => 'Image playback',
+                5 => 'Quick control screen', #50D
+                6 => 'Record movie (Live View)', #5DmkII
+            },
+        },
+        {
+            Name => 'SetButtonWhenShooting',
+            Condition => '$$self{Model} =~ /\b60D\b/',
+            Notes => '60D',
+            PrintConv => {
+                0 => 'Normal (disabled)',
+                1 => 'Image quality',
+                2 => 'Picture style',
+                3 => 'White balance',
+                4 => 'Flash exposure compensation',
+                5 => 'Viewfinder leveling gauge',
+            },
+        },
+        {
+            Name => 'SetButtonWhenShooting',
+            Condition => '$$self{Model} =~ /\b(450D|XSi|Kiss X2|550D|T2i|Kiss X4)\b/',
+            Notes => '450D and 550D; value of 5 is new for 550D',
+            PrintConv => {
+                0 => 'Normal (disabled)',
+                1 => 'Image quality',
+                2 => 'Flash exposure compensation',
+                3 => 'LCD monitor On/Off',
+                4 => 'Menu display',
+                5 => 'ISO speed',
+            },
+        },
+        {
+            Name => 'SetButtonWhenShooting',
+            Condition => '$$self{Model} =~ /\b(1000D|XS|Kiss F)\b/',
+            Notes => '1000D',
+            PrintConv => {
+                0 => 'LCD monitor On/Off',
+                1 => 'Image quality',
+                2 => 'Flash exposure compensation',
+                3 => 'Menu display',
+                4 => 'Disabled',
+            },
+        },
+        {
+            Name => 'SetButtonWhenShooting',
+            Condition => '$$self{Model} =~ /\b(500D|T1i|Kiss X3)\b/',
+            Notes => '500D',
+            PrintConv => {
+                0 => 'Quick control screen',
+                1 => 'Image quality',
+                2 => 'Flash exposure compensation',
+                3 => 'LCD monitor On/Off',
+                4 => 'Menu display',
+                5 => 'Disabled',
+            },
+        },
+        {
+            Name => 'SetButtonWhenShooting',
+            Notes => '1DmkIII and 1DmkIV',
+            PrintConv => {
+                0 => 'Normal (disabled)',
+                1 => 'White balance',
+                2 => 'Image size',
+                3 => 'ISO speed',
+                4 => 'Picture style',
+                5 => 'Record func. + media/folder',
+                6 => 'Menu display',
+                7 => 'Image playback',
+            },
+        },
+    ],
+    0x0705 => {
+        Name => 'ManualTv',
+        Description => 'Manual Tv/Av For M',
+        PrintConv => {
+            0 => 'Tv=Main/Av=Control',
+            1 => 'Tv=Control/Av=Main',
+        },
+    },
+    0x0706 => {
+        Name => 'DialDirectionTvAv',
+        PrintConv => {
+            0 => 'Normal',
+            1 => 'Reversed',
+        },
+    },
+    0x0707 => {
+        Name => 'AvSettingWithoutLens',
+        PrintConv => \%disableEnable,
+    },
+    0x0708 => {
+        Name => 'WBMediaImageSizeSetting',
+        PrintConv => {
+            0 => 'Rear LCD panel',
+            1 => 'LCD monitor',
+        },
+    },
+    0x0709 => {
+        Name => 'LockMicrophoneButton',
+        PrintConv => {
+            # called "sound" in 1DmkIII manual, and "memo" in 1DmkIV manual
+            0 => 'Protect (hold:record memo)',
+            1 => 'Record memo (protect:disable)',
+            2 => 'Play memo (hold:record memo)', # new with 1DmkIV
+        },
+    },
+    0x070a => {
+        Name => 'ButtonFunctionControlOff',
+        PrintConv => {
+            0 => 'Normal (enable)',
+            1 => 'Disable main, Control, Multi-control',
+        },
+    },
+    0x070b => { # 50D (also, 5DmkII writes this but it isn't in user guide)
+        Name => 'AssignFuncButton',
+        PrintConv => {
+            0 => 'LCD brightness',
+            1 => 'Image quality',
+            2 => 'Exposure comp./AEB setting',
+            3 => 'Image jump with main dial',
+            4 => 'Live view function settings',
+        },
+    },
+    0x070c => { # new for 7D
+        Name => 'CustomControls',
+        # (too much stuff to decode)
+    },
+    0x070d => { # new for 1DmkIV
+        Name => 'StartMovieShooting',
+        PrintConv => {
+            0 => 'Default (from LV)',
+            1 => 'Quick start (FEL button)',
+        },
+    },
+    #### 4b) Others
+    0x080b => [
+        {
+            Name => 'FocusingScreen',
+            Condition => '$$self{Model} =~ /\b(40D|50D|60D)\b/',
+            Notes => '40D, 50D and 60D',
+            PrintConv => {
+                0 => 'Ef-A',
+                1 => 'Ef-D',
+                2 => 'Ef-S',
+            },
+        },
+        {
+            Name => 'FocusingScreen',
+            Condition => '$$self{Model} =~ /\b5D Mark II\b/',
+            Notes => '5D Mark II',
+            PrintConv => {
+                0 => 'Eg-A',
+                1 => 'Eg-D',
+                2 => 'Eg-S',
+            },
+        },
+        {
+            Name => 'FocusingScreen',
+            Notes => '1DmkIII and 1DmkIV',
+            PrintConv => {
+                0 => 'Ec-CIV',
+                1 => 'Ec-A,B,C,CII,CIII,D,H,I,L',
+                2 => 'Ec-S',
+                3 => 'Ec-N,R',
+            },
+        },
+    ],
+    0x080c => {
+        Name => 'TimerLength',
+        Count => 4,
+        PrintConv => [
+            \%disableEnable,
+            '"6 s: $val"',
+            '"16 s: $val"',
+            '"After release: $val"',
+        ],
+        PrintConvInv => [
+            undef,
+            '$val=~/(\d+)$/ ? $1 : 0',
+            '$val=~/(\d+)$/ ? $1 : 0',
+            '$val=~/(\d+)$/ ? $1 : 0',
+        ],
+    },
+    0x080d => {
+        Name => 'ShortReleaseTimeLag',
+        PrintConv => \%disableEnable,
+    },
+    0x080e => {
+        Name => 'AddAspectRatioInfo',
+        PrintConv => {
+            0 => 'Off',
+            1 => '6:6',
+            2 => '3:4',
+            3 => '4:5',
+            4 => '6:7',
+            5 => '10:12',
+            6 => '5:7',
+        },
+    },
+    0x080f => {
+        Name => 'AddOriginalDecisionData', # called ("image verification" in 1DmkIV manual)
+        PrintConv => \%offOn,
+    },
+    0x0810 => {
+        Name => 'LiveViewExposureSimulation',
+        PrintConv => {
+            0 => 'Disable (LCD auto adjust)',
+            1 => 'Enable (simulates exposure)',
+        },
+    },
+    0x0811 => {
+        Name => 'LCDDisplayAtPowerOn',
+        PrintConv => {
+            0 => 'Display',
+            1 => 'Retain power off status',
+        },
+    },
+);
+
+#------------------------------------------------------------------------------
+# Conversion routines
+# Inputs: 0) value to convert
+sub ConvertPfn($)
+{
+    my $val = shift;
+    return $val ? ($val==1 ? 'On' : "On ($val)") : "Off";
+}
+sub ConvertPfnInv($)
+{
+    my $val = shift;
+    return $1 if $val =~ /(\d+)/;
+    return  1 if $val =~ /on/i;
+    return  0 if $val =~ /off/i;
+    return undef;
+}
+
+#------------------------------------------------------------------------------
+# Read/Write Canon custom 2 directory (used by 1D Mark III)
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessCanonCustom2($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $offset = $$dirInfo{DirStart};
+    my $size = $$dirInfo{DirLen};
+    my $write = $$dirInfo{Write};
+    my $verbose = $exifTool->Options('Verbose');
+    my $newTags;
+
+    # first entry in array must be the size
+    my $len = Get16u($dataPt, $offset);
+    unless ($len == $size and $len >= 8) {
+        $exifTool->Warn("Invalid CanonCustom2 data");
+        return 0;
+    }
+    # get group count
+    my $count = Get32u($dataPt, $offset + 4);
+    if ($write) {
+        $newTags = $exifTool->GetNewTagInfoHash($tagTablePtr);
+        $exifTool->VPrint(0, "  Rewriting CanonCustom2\n");
+    } elsif ($verbose) {
+        $exifTool->VerboseDir('CanonCustom2', $count);
+    }
+    my $pos = $offset + 8;
+    my $end = $offset + $size;
+    # loop through group records
+    for (; $pos<$end; ) {
+        last if $pos + 12 > $end;
+        my $recNum = Get32u($dataPt, $pos);
+        my $recLen = Get32u($dataPt, $pos + 4);
+        my $recCount = Get32u($dataPt, $pos + 8);
+        last if $recLen < 8;    # must be at least 8 bytes for recNum and recLen
+        $pos += 12;
+        my $recPos = $pos;
+        my $recEnd = $pos + $recLen;
+        if ($verbose and not $write) {
+            $exifTool->VerboseDir("CanonCustom2 group $recNum", $recCount);
+        }
+        my ($i, $num, $tag);
+        for ($i=0; $recPos + 8 < $recEnd; ++$i, $recPos+=4*$num) {
+            $tag = Get32u($dataPt, $recPos);
+            $num = Get32u($dataPt, $recPos + 4);
+            $recPos += 8;
+            last if $recPos + $num * 4 > $recEnd;
+            my $val = ReadValue($dataPt, $recPos, 'int32s', $num, $num * 4);
+            if ($write) {
+                # write new value
+                my $tagInfo = $$newTags{$tag};
+                next unless $tagInfo;
+                my $nvHash = $exifTool->GetNewValueHash($tagInfo);
+                next unless Image::ExifTool::IsOverwriting($nvHash, $val);
+                my $newVal = Image::ExifTool::GetNewValues($nvHash);
+                next unless defined $newVal;    # can't delete from a custom table
+                WriteValue($newVal, 'int32s', $num, $dataPt, $recPos);
+                $exifTool->VerboseValue("- CanonCustom:$$tagInfo{Name}", $val);
+                $exifTool->VerboseValue("+ CanonCustom:$$tagInfo{Name}", $newVal);
+                ++$exifTool->{CHANGED};
+            } else {
+                # save extracted tag
+                my $oldInfo = $$tagTablePtr{$tag};
+                $exifTool->HandleTag($tagTablePtr, $tag, $val,
+                    Index  => $i,
+                    Format => 'int32u',
+                    Count  => $num,
+                    Size   => $num * 4,
+                );
+                my $tagInfo = $$tagTablePtr{$tag};
+                # generate properly formatted description if we just added the tag
+                if ($tagInfo and not $oldInfo) {
+                    ($$tagInfo{Description} = $$tagInfo{Name}) =~ tr/_/ /;
+                    $$tagInfo{Description} =~ s/CanonCustom Functions/Canon Custom Functions /;
+                }
+            }
+        }
+        $pos += $recLen - 8;
+    }
+    if ($pos != $end) {
+        $exifTool->Warn('Possibly corrupted CanonCustom2 data');
+        return 0;
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Write Canon custom 2 data
+# Inputs: 0) ExifTool object reference, 1) dirInfo hash ref, 2) tag table ref
+# Returns: New custom data block or undefined on error
+sub WriteCanonCustom2($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    $exifTool or return 1;    # allow dummy access to autoload this package
+    my $dataPt = $$dirInfo{DataPt};
+    # edit a copy of the custom function 2 data
+    my $buff = substr($$dataPt, $$dirInfo{DirStart}, $$dirInfo{DirLen});
+    my %dirInfo = (
+        DataPt   => \$buff,
+        DirStart => 0,
+        DirLen   => $$dirInfo{DirLen},
+        Write    => 1,
+    );
+    ProcessCanonCustom2($exifTool, \%dirInfo, $tagTablePtr) or return undef;
+    return $buff;
+}
+
+#------------------------------------------------------------------------------
+# Process Canon custom directory
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessCanonCustom($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $offset = $$dirInfo{DirStart};
+    my $size = $$dirInfo{DirLen};
+    my $verbose = $exifTool->Options('Verbose');
+
+    # first entry in array must be the size
+    my $len = Get16u($dataPt,$offset);
+    unless ($len == $size or ($$exifTool{Model}=~/\bD60\b/ and $len+2 == $size)) {
+        $exifTool->Warn("Invalid CanonCustom data");
+        return 0;
+    }
+    $verbose and $exifTool->VerboseDir('CanonCustom', $size/2-1);
+    my $pos;
+    for ($pos=2; $pos<$size; $pos+=2) {
+        # ($pos is position within custom directory)
+        my $val = Get16u($dataPt,$offset+$pos);
+        my $tag = ($val >> 8);
+        $val = ($val & 0xff);
+        $exifTool->HandleTag($tagTablePtr, $tag, $val,
+            Index  => $pos/2-1,
+            Format => 'int8u',
+            Count  => 1,
+            Size   => 1,
+        );
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Check new value for Canon custom data block
+# Inputs: 0) ExifTool object reference, 1) tagInfo hash ref, 2) raw value ref
+# Returns: error string or undef (and may modify value) on success
+sub CheckCanonCustom($$$)
+{
+    my ($exifTool, $tagInfo, $valPtr) = @_;
+    return Image::ExifTool::CheckValue($valPtr, 'int8u');
+}
+
+#------------------------------------------------------------------------------
+# Write Canon custom data
+# Inputs: 0) ExifTool object reference, 1) dirInfo hash ref, 2) tag table ref
+# Returns: New custom data block or undefined on error
+sub WriteCanonCustom($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    $exifTool or return 1;    # allow dummy access to autoload this package
+    my $dataPt = $$dirInfo{DataPt};
+    my $dirStart = $$dirInfo{DirStart} || 0;
+    my $dirLen = $$dirInfo{DirLen} || length($$dataPt) - $dirStart;
+    my $dirName = $$dirInfo{DirName};
+    my $newData = substr($$dataPt, $dirStart, $dirLen) or return undef;
+    $dataPt = \$newData;
+
+    # first entry in array must be the size
+    my $len = Get16u($dataPt, 0);
+    unless ($len == $dirLen or ($$exifTool{Model}=~/\bD60\b/ and $len+2 == $dirLen)) {
+        $exifTool->Warn("Invalid CanonCustom data");
+        return undef;
+    }
+    my $newTags = $exifTool->GetNewTagInfoHash($tagTablePtr);
+    my $pos;
+    for ($pos=2; $pos<$dirLen; $pos+=2) {
+        my $val = Get16u($dataPt, $pos);
+        my $tag = ($val >> 8);
+        my $tagInfo = $$newTags{$tag};
+        next unless $tagInfo;
+        my $nvHash = $exifTool->GetNewValueHash($tagInfo);
+        $val = ($val & 0xff);
+        next unless Image::ExifTool::IsOverwriting($nvHash, $val);
+        my $newVal = Image::ExifTool::GetNewValues($nvHash);
+        next unless defined $newVal;    # can't delete from a custom table
+        Set16u(($newVal & 0xff) + ($tag << 8), $dataPt, $pos);
+        $exifTool->VerboseValue("- $dirName:$$tagInfo{Name}", $val);
+        $exifTool->VerboseValue("+ $dirName:$$tagInfo{Name}", $newVal);
+        ++$exifTool->{CHANGED};
+    }
+    return $newData;
+}
+
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::CanonCustom - Read and Write Canon custom functions
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+The Canon custom functions meta information is very specific to the
+camera model, and is found in both the EXIF maker notes and in the
+Canon RAW files.  This module contains the definitions necessary for
+Image::ExifTool to read this information.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html>
+
+=back
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Christian Koller for his work in decoding the 20D custom
+functions, Rainer Honle for decoding the 5D custom functions and David
+Pitcher for adding a few undocumented 1DmkIII settings.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/Canon Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/CanonRaw.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/CanonRaw.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/CanonRaw.pm	(revision 24799)
@@ -0,0 +1,928 @@
+#------------------------------------------------------------------------------
+# File:         CanonRaw.pm
+#
+# Description:  Read Canon RAW (CRW) meta information
+#
+# Revisions:    11/25/2003 - P. Harvey Created
+#               12/02/2003 - P. Harvey Completely reworked and figured out many
+#                            more tags
+#               01/19/2004 - P. Harvey Added CleanRaw()
+#
+# References:   1) http://www.cybercom.net/~dcoffin/dcraw/
+#               2) http://www.wonderland.org/crw/
+#               3) http://xyrion.org/ciff/CIFFspecV1R04.pdf
+#               4) Dave Nicholson private communication (PowerShot S30)
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::CanonRaw;
+
+use strict;
+use vars qw($VERSION $AUTOLOAD %crwTagFormat);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::Exif;
+use Image::ExifTool::Canon;
+
+$VERSION = '1.54';
+
+sub WriteCRW($$);
+sub ProcessCanonRaw($$$);
+sub WriteCanonRaw($$$);
+sub CheckCanonRaw($$$);
+sub InitMakerNotes($);
+sub SaveMakerNotes($);
+sub BuildMakerNotes($$$$$$);
+
+# formats for CRW tag types (($tag >> 8) & 0x38)
+# Note: don't define format for undefined types
+%crwTagFormat = (
+    0x00 => 'int8u',
+    0x08 => 'string',
+    0x10 => 'int16u',
+    0x18 => 'int32u',
+  # 0x20 => 'undef',
+  # 0x28 => 'undef',
+  # 0x30 => 'undef',
+);
+
+# Canon raw file tag table
+# Note: Tag ID's have upper 2 bits set to zero, since these 2 bits
+# just specify the location of the information
+%Image::ExifTool::CanonRaw::Main = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    PROCESS_PROC => \&ProcessCanonRaw,
+    WRITE_PROC => \&WriteCanonRaw,
+    CHECK_PROC => \&CheckCanonRaw,
+    WRITABLE => 1,
+    0x0000 => { Name => 'NullRecord', Writable => 'undef' }, #3
+    0x0001 => { #3
+        Name => 'FreeBytes',
+        Format => 'undef',
+        Binary => 1,
+    },
+    0x0032 => { Name => 'CanonColorInfo1', Writable => 0 },
+    0x0805 => [
+        # this tag is found in more than one directory...
+        {
+            Condition => '$self->{DIR_NAME} eq "ImageDescription"',
+            Name => 'CanonFileDescription',
+            Writable => 'string[32]',
+        },
+        {
+            Name => 'UserComment',
+            Writable => 'string[256]',
+        },
+    ],
+    0x080a => {
+        Name => 'CanonRawMakeModel',
+        Writable => 0,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::CanonRaw::MakeModel',
+        },
+    },
+    0x080b => { Name => 'CanonFirmwareVersion', Writable => 'string[32]' },
+    0x080c => { Name => 'ComponentVersion',     Writable => 'string'     }, #3
+    0x080d => { Name => 'ROMOperationMode',     Writable => 'string[8]'  }, #3
+    0x0810 => { Name => 'OwnerName',            Writable => 'string[32]' },
+    0x0815 => { Name => 'CanonImageType',       Writable => 'string[32]' },
+    0x0816 => { Name => 'OriginalFileName',     Writable => 'string[32]' },
+    0x0817 => { Name => 'ThumbnailFileName',    Writable => 'string[32]' },
+    0x100a => { #3
+        Name => 'TargetImageType',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Real-world Subject',
+            1 => 'Written Document',
+        },
+    },
+    0x1010 => { #3
+        Name => 'ShutterReleaseMethod',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Single Shot',
+            2 => 'Continuous Shooting',
+        },
+    },
+    0x1011 => { #3
+        Name => 'ShutterReleaseTiming',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Priority on shutter',
+            1 => 'Priority on focus',
+        },
+    },
+    0x1016 => { Name => 'ReleaseSetting',       Writable => 'int16u' }, #3
+    0x101c => { Name => 'BaseISO',              Writable => 'int16u' }, #3
+    0x1028=> { #PH
+        Name => 'CanonFlashInfo',
+        Writable => 'int16u',
+        Count => 4,
+        Unknown => 1,
+    },
+    0x1029 => {
+        Name => 'CanonFocalLength',
+        Writable => 0,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Canon::FocalLength',
+        },
+    },
+    0x102a => {
+        Name => 'CanonShotInfo',
+        Writable => 0,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Canon::ShotInfo',
+        },
+    },
+    0x102c => {
+        Name => 'CanonColorInfo2',
+        Writable => 0,
+        # for the S30, the following information has been decoded: (ref 4)
+        # offset 66: int32u - shutter half press time in ms
+        # offset 70: int32u - image capture time in ms
+        # offset 74: int16u - custom white balance flag (0=Off, 512=On)
+    },
+    0x102d => {
+        Name => 'CanonCameraSettings',
+        Writable => 0,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Canon::CameraSettings',
+        },
+    },
+    0x1030 => { #4
+        Name => 'WhiteSample',
+        Writable => 0,
+        SubDirectory => {
+            Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+            TagTable => 'Image::ExifTool::CanonRaw::WhiteSample',
+        },
+    },
+    0x1031 => {
+        Name => 'SensorInfo',
+        Writable => 0,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Canon::SensorInfo',
+        },
+    },
+    # this tag has only be verified for the 10D in CRW files, but the D30 and D60
+    # also produce CRW images and have CustomFunction information in their JPEG's
+    0x1033 => [
+        {
+            Name => 'CustomFunctions10D',
+            Condition => '$self->{Model} =~ /EOS 10D/',
+            SubDirectory => {
+                Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+                TagTable => 'Image::ExifTool::CanonCustom::Functions10D',
+            },
+        },
+        {
+            Name => 'CustomFunctionsD30',
+            Condition => '$self->{Model} =~ /EOS D30\b/',
+            SubDirectory => {
+                Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+                TagTable => 'Image::ExifTool::CanonCustom::FunctionsD30',
+            },
+        },
+        {
+            Name => 'CustomFunctionsD60',
+            Condition => '$self->{Model} =~ /EOS D60\b/',
+            SubDirectory => {
+                # the stored size in the D60 apparently doesn't include the size word:
+                Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size-2,$size)',
+                # (D60 custom functions are basically the same as D30)
+                TagTable => 'Image::ExifTool::CanonCustom::FunctionsD30',
+            },
+        },
+        {
+            Name => 'CustomFunctionsUnknown',
+            SubDirectory => {
+                Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+                TagTable => 'Image::ExifTool::CanonCustom::FuncsUnknown',
+            },
+        },
+    ],
+    0x1038 => {
+        Name => 'CanonAFInfo',
+        Writable => 0,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Canon::AFInfo',
+        },
+    },
+    0x1093 => {
+        Name => 'CanonFileInfo',
+        SubDirectory => {
+            Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+            TagTable => 'Image::ExifTool::Canon::FileInfo',
+        },
+    },
+    0x10a9 => {
+        Name => 'ColorBalance',
+        Writable => 0,
+        SubDirectory => {
+            # this offset is necessary because the table contains short rationals
+            # (4 bytes long) but the first entry is 2 bytes into the table.
+            Start => '2',
+            TagTable => 'Image::ExifTool::Canon::ColorBalance',
+        },
+    },
+    0x10b5 => { #PH
+        Name => 'RawJpgInfo',
+        SubDirectory => {
+            Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)',
+            TagTable => 'Image::ExifTool::CanonRaw::RawJpgInfo',
+        },
+    },
+    0x10ae => {
+        Name => 'ColorTemperature',
+        Writable => 'int16u',
+    },
+    0x10b4 => {
+        Name => 'ColorSpace',
+        Writable => 'int16u',
+        PrintConv => {
+            1 => 'sRGB',
+            2 => 'Adobe RGB',
+            0xffff => 'Uncalibrated',
+        },
+    },
+    0x1803 => { #3
+        Name => 'ImageFormat',
+        Writable => 0,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::CanonRaw::ImageFormat',
+        },
+    },
+    0x1804 => { Name => 'RecordID', Writable => 'int32u' }, #3
+    0x1806 => { #3
+        Name => 'SelfTimerTime',
+        Writable => 'int32u',
+        ValueConv => '$val / 1000',
+        ValueConvInv => '$val * 1000',
+        PrintConv => '"$val s"',
+        PrintConvInv => '$val=~s/\s*s.*//;$val',
+    },
+    0x1807 => {
+        Name => 'TargetDistanceSetting',
+        Format => 'float',
+        PrintConv => '"$val mm"',
+        PrintConvInv => '$val=~s/\s*mm$//;$val',
+    },
+    0x180b => [
+        {
+            # D30
+            Name => 'SerialNumber',
+            Condition => '$$self{Model} =~ /EOS D30\b/',
+            Writable => 'int32u',
+            PrintConv => 'sprintf("%x-%.5d",$val>>16,$val&0xffff)',
+            PrintConvInv => '$val=~/(.*)-(\d+)/ ? (hex($1)<<16)+$2 : undef',
+        },
+        {
+            # all EOS models (D30, 10D, 300D)
+            Name => 'SerialNumber',
+            Condition => '$$self{Model} =~ /EOS/',
+            Writable => 'int32u',
+            PrintConv => 'sprintf("%.10d",$val)',
+            PrintConvInv => '$val',
+        },
+        {
+            # this is not SerialNumber for PowerShot models (but what is it?) - PH
+            Name => 'UnknownNumber',
+            Unknown => 1,
+        },
+    ],
+    0x180e => {
+        Name => 'TimeStamp',
+        Writable => 0,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::CanonRaw::TimeStamp',
+        },
+    },
+    0x1810 => {
+        Name => 'ImageInfo',
+        Writable => 0,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::CanonRaw::ImageInfo',
+        },
+    },
+    0x1813 => { #3
+        Name => 'FlashInfo',
+        Writable => 0,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::CanonRaw::FlashInfo',
+        },
+    },
+    0x1814 => { #3
+        Name => 'MeasuredEV',
+        Notes => q{
+            this is the Canon name for what could better be called MeasuredLV, and
+            should be close to the calculated LightValue for a proper exposure with most
+            models
+        },
+        Format => 'float',
+        ValueConv => '$val + 5',
+        ValueConvInv => '$val - 5',
+    },
+    0x1817 => {
+        Name => 'FileNumber',
+        Writable => 'int32u',
+        Groups => { 2 => 'Image' },
+        PrintConv => '$_=$val;s/(\d+)(\d{4})/$1-$2/;$_',
+        PrintConvInv => '$_=$val;s/-//;$_',
+    },
+    0x1818 => { #3
+        Name => 'ExposureInfo',
+        Groups => { 1 => 'CIFF' }, # (only so CIFF shows up in group lists)
+        Writable => 0,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::CanonRaw::ExposureInfo',
+        },
+    },
+    0x1834 => { #PH
+        Name => 'CanonModelID',
+        Writable => 'int32u',
+        PrintHex => 1,
+        Notes => q{
+            this is the complete list of model ID numbers, but note that many of these
+            models do not produce CRW images
+        },
+        SeparateTable => 'Canon CanonModelID',
+        PrintConv => \%Image::ExifTool::Canon::canonModelID,
+    },
+    0x1835 => {
+        Name => 'DecoderTable',
+        Writable => 0,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::CanonRaw::DecoderTable',
+        },
+    },
+    0x183b => { #PH
+        # display format for serial number
+        Name => 'SerialNumberFormat',
+        Writable => 'int32u',
+        PrintHex => 1,
+        PrintConv => {
+            0x90000000 => 'Format 1',
+            0xa0000000 => 'Format 2',
+        },
+    },
+    0x2005 => {
+        Name => 'RawData',
+        Writable => 0,
+        Binary => 1,
+    },
+    0x2007 => {
+        Name => 'JpgFromRaw',
+        Writable => 'resize',  # 'resize' allows this value to change size
+        Permanent => 0,
+        RawConv => '$self->ValidateImage(\$val,$tag)',
+    },
+    0x2008 => {
+        Name => 'ThumbnailImage',
+        Writable => 'resize',  # 'resize' allows this value to change size
+        WriteCheck => '$self->CheckImage(\$val)',
+        Permanent => 0,
+        RawConv => '$self->ValidateImage(\$val,$tag)',
+    },
+    # the following entries are subdirectories
+    # (any 0x28 and 0x30 tag types are handled automatically by the decoding logic)
+    0x2804 => {
+        Name => 'ImageDescription',
+        SubDirectory => { },
+        Writable => 0,
+    },
+    0x2807 => { #3
+        Name => 'CameraObject',
+        SubDirectory => { },
+        Writable => 0,
+    },
+    0x3002 => { #3
+        Name => 'ShootingRecord',
+        SubDirectory => { },
+        Writable => 0,
+    },
+    0x3003 => { #3
+        Name => 'MeasuredInfo',
+        SubDirectory => { },
+        Writable => 0,
+    },
+    0x3004 => { #3
+        Name => 'CameraSpecification',
+        SubDirectory => { },
+        Writable => 0,
+    },
+    0x300a => { #3
+        Name => 'ImageProps',
+        SubDirectory => { },
+        Writable => 0,
+    },
+    0x300b => {
+        Name => 'ExifInformation',
+        SubDirectory => { },
+        Writable => 0,
+    },
+);
+
+# Canon binary data blocks
+%Image::ExifTool::CanonRaw::MakeModel = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    DATAMEMBER => [ 0, 6 ], # indices of data members to extract when writing
+    WRITABLE => 1,
+    FORMAT => 'string',
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    # (can't specify a first entry because this isn't
+    # a simple binary table with fixed offsets)
+    0 => {
+        Name => 'Make',
+        Format => 'string[6]',  # "Canon\0"
+        DataMember => 'Make',
+        RawConv => '$self->{Make} = $val',
+    },
+    6 => {
+        Name => 'Model',
+        Format => 'string', # no size = to the end of the data
+        Description => 'Camera Model Name',
+        DataMember => 'Model',
+        RawConv => '$self->{Model} = $val',
+    },
+);
+
+%Image::ExifTool::CanonRaw::TimeStamp = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FORMAT => 'int32u',
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Time' },
+    0 => {
+        Name => 'DateTimeOriginal',
+        Description => 'Date/Time Original',
+        Shift => 'Time',
+        ValueConv => 'ConvertUnixTime($val)',
+        ValueConvInv => 'GetUnixTime($val)',
+        PrintConv => '$self->ConvertDateTime($val)',
+        PrintConvInv => '$self->InverseDateTime($val)',
+    },
+    1 => { #3
+        Name => 'TimeZoneCode',
+        Format => 'int32s',
+        ValueConv => '$val / 3600',
+        ValueConvInv => '$val * 3600',
+    },
+    2 => { #3
+        Name => 'TimeZoneInfo',
+        Notes => 'set to 0x80000000 if TimeZoneCode is valid',
+    },
+);
+
+%Image::ExifTool::CanonRaw::ImageFormat = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FORMAT => 'int32u',
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    0 => {
+        Name => 'FileFormat',
+        Flags => 'PrintHex',
+        PrintConv => {
+            0x00010000 => 'JPEG (lossy)',
+            0x00010002 => 'JPEG (non-quantization)',
+            0x00010003 => 'JPEG (lossy/non-quantization toggled)',
+            0x00020001 => 'CRW',
+        },
+    },
+    1 => {
+        Name => 'TargetCompressionRatio',
+        Format => 'float',
+    },
+);
+
+%Image::ExifTool::CanonRaw::RawJpgInfo = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FORMAT => 'int16u',
+    FIRST_ENTRY => 1,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+#    0 => 'RawJpgInfoSize',
+    1 => { #PH
+        Name => 'RawJpgQuality',
+        PrintConv => {
+            1 => 'Economy',
+            2 => 'Normal',
+            3 => 'Fine',
+            5 => 'Superfine',
+        },
+    },
+    2 => { #PH
+        Name => 'RawJpgSize',
+        PrintConv => {
+            0 => 'Large',
+            1 => 'Medium',
+            2 => 'Small',
+        },
+    },
+    3 => 'RawJpgWidth', #PH
+    4 => 'RawJpgHeight', #PH
+);
+
+%Image::ExifTool::CanonRaw::FlashInfo = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FORMAT => 'float',
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    0 => 'FlashGuideNumber',
+    1 => 'FlashThreshold',
+);
+
+%Image::ExifTool::CanonRaw::ExposureInfo = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FORMAT => 'float',
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    0 => 'ExposureCompensation',
+    1 => {
+        Name => 'ShutterSpeedValue',
+        ValueConv => 'abs($val)<100 ? 1/(2**$val) : 0',
+        ValueConvInv => '$val>0 ? -log($val)/log(2) : -100',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    2 => {
+        Name => 'ApertureValue',
+        ValueConv => '2 ** ($val / 2)',
+        ValueConvInv => '$val>0 ? 2*log($val)/log(2) : 0',
+        PrintConv => 'sprintf("%.1f",$val)',
+        PrintConvInv => '$val',
+    },
+);
+
+%Image::ExifTool::CanonRaw::ImageInfo = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    FORMAT => 'int32u',
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    # Note: Don't make these writable (except rotation) because it confuses
+    # Canon decoding software if the are changed
+    0 => 'ImageWidth', #3
+    1 => 'ImageHeight', #3
+    2 => { #3
+        Name => 'PixelAspectRatio',
+        Format => 'float',
+    },
+    3 => {
+        Name => 'Rotation',
+        Format => 'int32s',
+        Writable => 'int32s',
+    },
+    4 => 'ComponentBitDepth', #3
+    5 => 'ColorBitDepth', #3
+    6 => 'ColorBW', #3
+);
+
+# ref 4
+%Image::ExifTool::CanonRaw::DecoderTable = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    FORMAT => 'int32u',
+    FIRST_ENTRY => 0,
+    0 => 'DecoderTableNumber',
+    2 => 'CompressedDataOffset',
+    3 => 'CompressedDataLength',
+);
+
+# ref 1/4
+%Image::ExifTool::CanonRaw::WhiteSample = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    FORMAT => 'int16u',
+    FIRST_ENTRY => 1,
+    1 => 'WhiteSampleWidth',
+    2 => 'WhiteSampleHeight',
+    3 => 'WhiteSampleLeftBorder',
+    4 => 'WhiteSampleTopBorder',
+    5 => 'WhiteSampleBits',
+    # this is followed by the encrypted white sample values (ref 1)
+);
+
+#------------------------------------------------------------------------------
+# AutoLoad our writer routines when necessary
+#
+sub AUTOLOAD
+{
+    return Image::ExifTool::DoAutoLoad($AUTOLOAD, @_);
+}
+
+#------------------------------------------------------------------------------
+# Process Raw file directory
+# Inputs: 0) ExifTool object reference
+#         1) directory information reference, 2) tag table reference
+# Returns: 1 on success
+sub ProcessCanonRaw($$$)
+{
+    my ($exifTool, $dirInfo, $rawTagTable) = @_;
+    my $blockStart = $$dirInfo{DirStart};
+    my $blockSize = $$dirInfo{DirLen};
+    my $raf = $$dirInfo{RAF} or return 0;
+    my $buff;
+    my $verbose = $exifTool->Options('Verbose');
+    my $buildMakerNotes = $exifTool->Options('MakerNotes');
+
+    # 4 bytes at end of block give directory position within block
+    $raf->Seek($blockStart+$blockSize-4, 0) or return 0;
+    $raf->Read($buff, 4) == 4 or return 0;
+    my $dirOffset = Get32u(\$buff,0) + $blockStart;
+    $raf->Seek($dirOffset, 0) or return 0;
+    $raf->Read($buff, 2) == 2 or return 0;
+    my $entries = Get16u(\$buff,0);         # get number of entries in directory
+    # read the directory (10 bytes per entry)
+    $raf->Read($buff, 10 * $entries) == 10 * $entries or return 0;
+
+    $verbose and $exifTool->VerboseDir('CIFF', $entries);
+    my $index;
+    for ($index=0; $index<$entries; ++$index) {
+        my $pt = 10 * $index;
+        my $tag = Get16u(\$buff, $pt);
+        my $size = Get32u(\$buff, $pt+2);
+        my $valuePtr = Get32u(\$buff, $pt+6);
+        my $ptr = $valuePtr + $blockStart;  # all pointers relative to block start
+        if ($tag & 0x8000) {
+            $exifTool->Warn('Bad CRW directory entry');
+            return 1;
+        }
+        my $tagID = $tag & 0x3fff;          # get tag ID
+        my $tagType = ($tag >> 8) & 0x38;   # get tag type
+        my $valueInDir = ($tag & 0x4000);   # flag for value in directory
+        my $tagInfo = $exifTool->GetTagInfo($rawTagTable, $tagID);
+        if (($tagType==0x28 or $tagType==0x30) and not $valueInDir) {
+            # this type of tag specifies a raw subdirectory
+            my $name;
+            $tagInfo and $name = $$tagInfo{Name};
+            $name or $name = sprintf("CanonRaw_0x%.4x", $tag);
+            my %subdirInfo = (
+                DirName  => $name,
+                DataLen  => 0,
+                DirStart => $ptr,
+                DirLen   => $size,
+                Nesting  => $$dirInfo{Nesting} + 1,
+                RAF      => $raf,
+                Parent   => $$dirInfo{DirName},
+            );
+            if ($verbose) {
+                my $fakeInfo = { Name => $name, SubDirectory => { } };
+                $exifTool->VerboseInfo($tagID, $fakeInfo,
+                    'Index'  => $index,
+                    'Size'   => $size,
+                    'Start'  => $ptr,
+                );
+            }
+            $exifTool->ProcessDirectory(\%subdirInfo, $rawTagTable);
+            next;
+        }
+        my ($valueDataPos, $count, $subdir);
+        my $format = $crwTagFormat{$tagType};
+        if ($tagInfo) {
+            $subdir = $$tagInfo{SubDirectory};
+            $format = $$tagInfo{Format} if $$tagInfo{Format};
+            $count = $$tagInfo{Count};
+        }
+        # get value data
+        my ($value, $delRawConv);
+        if ($valueInDir) {  # is the value data in the directory?
+            # this type of tag stores the value in the 'size' and 'ptr' fields
+            $valueDataPos = $dirOffset + $pt + 4;
+            $size = 8;
+            $value = substr($buff, $pt+2, $size);
+            # set count to 1 by default for normal values in directory
+            $count = 1 if not defined $count and $format and
+                          $format ne 'string' and not $subdir;
+        } else {
+            $valueDataPos = $ptr;
+            if ($size <= 512 or ($verbose > 2 and $size <= 65536)
+                or ($tagInfo and ($$tagInfo{SubDirectory}
+                or grep(/^$$tagInfo{Name}$/i, $exifTool->GetRequestedTags()) )))
+            {
+                # read value if size is small or specifically requested
+                # or if this is a SubDirectory
+                unless ($raf->Seek($ptr, 0) and $raf->Read($value, $size) == $size) {
+                    $exifTool->Warn(sprintf("Error reading %d bytes from 0x%x",$size,$ptr));
+                    next;
+                }
+            } else {
+                $value = "Binary data $size bytes";
+                if ($tagInfo) {
+                    if ($exifTool->Options('Binary') or $verbose) {
+                        # read the value anyway
+                        unless ($raf->Seek($ptr, 0) and $raf->Read($value, $size) == $size) {
+                            $exifTool->Warn(sprintf("Error reading %d bytes from 0x%x",$size,$ptr));
+                            next;
+                        }
+                    }
+                    # force this to be a binary (scalar reference)
+                    $$tagInfo{RawConv} = '\$val';
+                    $delRawConv = 1;
+                }
+                $size = length $value;
+                undef $format;
+            }
+        }
+        # set count from tagInfo count if necessary
+        if ($format and not $count) {
+            # set count according to format and size
+            my $fnum = $Image::ExifTool::Exif::formatNumber{$format};
+            my $fsiz = $Image::ExifTool::Exif::formatSize[$fnum];
+            $count = int($size / $fsiz);
+        }
+        if ($verbose) {
+            my $val = $value;
+            $format and $val = ReadValue(\$val, 0, $format, $count, $size);
+            $exifTool->VerboseInfo($tagID, $tagInfo,
+                Table   => $rawTagTable,
+                Index   => $index,
+                Value   => $val,
+                DataPt  => \$value,
+                DataPos => $valueDataPos,
+                Size    => $size,
+                Format  => $format,
+                Count   => $count,
+            );
+        }
+        if ($buildMakerNotes) {
+            # build maker notes information if requested
+            BuildMakerNotes($exifTool, $tagID, $tagInfo, \$value, $format, $count);
+        }
+        next unless defined $tagInfo;
+
+        if ($subdir) {
+            my $name = $$tagInfo{Name};
+            my $newTagTable;
+            if ($$subdir{TagTable}) {
+                $newTagTable = GetTagTable($$subdir{TagTable});
+                unless ($newTagTable) {
+                    warn "Unknown tag table $$subdir{TagTable}\n";
+                    next;
+                }
+            } else {
+                warn "Must specify TagTable for SubDirectory $name\n";
+                next;
+            }
+            my $subdirStart = 0;
+            #### eval Start ()
+            $subdirStart = eval $$subdir{Start} if $$subdir{Start};
+            my $dirData = \$value;
+            my %subdirInfo = (
+                Name     => $name,
+                DataPt   => $dirData,
+                DataLen  => $size,
+                DataPos  => $valueDataPos,
+                DirStart => $subdirStart,
+                DirLen   => $size - $subdirStart,
+                Nesting  => $$dirInfo{Nesting} + 1,
+                RAF      => $raf,
+                Parent   => $$dirInfo{DirName},
+            );
+            #### eval Validate ($dirData, $subdirStart, $size)
+            if (defined $$subdir{Validate} and not eval $$subdir{Validate}) {
+                $exifTool->Warn("Invalid $name data");
+            } else {
+                $exifTool->ProcessDirectory(\%subdirInfo, $newTagTable, $$subdir{ProcessProc});
+            }
+        } else {
+            # convert to specified format if necessary
+            $format and $value = ReadValue(\$value, 0, $format, $count, $size);
+            # save the information
+            $exifTool->FoundTag($tagInfo, $value);
+            delete $$tagInfo{RawConv} if $delRawConv;
+        }
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# get information from raw file
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 if this was a valid Canon RAW file
+sub ProcessCRW($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my ($buff, $sig);
+    my $raf = $$dirInfo{RAF};
+    my $buildMakerNotes = $exifTool->Options('MakerNotes');
+
+    $raf->Read($buff,2) == 2      or return 0;
+    SetByteOrder($buff)           or return 0;
+    $raf->Read($buff,4) == 4      or return 0;
+    $raf->Read($sig,8) == 8       or return 0;  # get file signature
+    $sig =~ /^HEAP(CCDR|JPGM)/    or return 0;  # validate signature
+    my $hlen = Get32u(\$buff, 0);
+
+    $raf->Seek(0, 2)              or return 0;  # seek to end of file
+    my $filesize = $raf->Tell()   or return 0;
+
+    # initialize maker note data if building maker notes
+    $buildMakerNotes and InitMakerNotes($exifTool);
+
+    # set the FileType tag unless already done (ie. APP0 CIFF record in JPEG image)
+    $exifTool->SetFileType();
+
+    # build directory information for main raw directory
+    my %dirInfo = (
+        DataLen  => 0,
+        DirStart => $hlen,
+        DirLen   => $filesize - $hlen,
+        Nesting  => 0,
+        RAF      => $raf,
+        Parent   => 'CRW',
+    );
+
+    # process the raw directory
+    my $rawTagTable = GetTagTable('Image::ExifTool::CanonRaw::Main');
+    unless ($exifTool->ProcessDirectory(\%dirInfo, $rawTagTable)) {
+        $exifTool->Warn('CRW file format error');
+    }
+
+    # finish building maker notes if necessary
+    $buildMakerNotes and SaveMakerNotes($exifTool);
+
+    # process trailers if they exist in CRW file (not in CIFF information!)
+    if ($$exifTool{FILE_TYPE} eq 'CRW') {
+        my $trailInfo = Image::ExifTool::IdentifyTrailer($raf);
+        $exifTool->ProcessTrailers($trailInfo) if $trailInfo;
+    }
+
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::CanonRaw - Read Canon RAW (CRW) meta information
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to interpret
+meta information from Canon CRW raw files.  These files are written directly
+by some Canon cameras, and contain meta information similar to that found in
+the EXIF Canon maker notes.
+
+=head1 NOTES
+
+The CR2 format written by some Canon cameras is very different the CRW
+format processed by this module.  (CR2 is TIFF-based and uses standard EXIF
+tags.)
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.cybercom.net/~dcoffin/dcraw/>
+
+=item L<http://www.wonderland.org/crw/>
+
+=item L<http://xyrion.org/ciff/>
+
+=item L<http://owl.phy.queensu.ca/~phil/exiftool/canon_raw.html>
+
+=back
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Dave Nicholson for decoding a number of new tags.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/CanonRaw Tags>,
+L<Image::ExifTool::Canon(3pm)|Image::ExifTool::Canon>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/CanonVRD.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/CanonVRD.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/CanonVRD.pm	(revision 24799)
@@ -0,0 +1,1383 @@
+#------------------------------------------------------------------------------
+# File:         CanonVRD.pm
+#
+# Description:  Read/write Canon VRD information
+#
+# Revisions:    2006/10/30 - P. Harvey Created
+#               2007/10/23 - PH Added new VRD 3.0 tags
+#               2008/08/29 - PH Added new VRD 3.4 tags
+#               2008/12/02 - PH Added new VRD 3.5 tags
+#               2010/06/18 - PH Support variable-length CustomPictureStyle data
+#               2010/09/14 - PH Added r/w support for XMP in VRD
+#
+# References:   1) Bogdan private communication (Canon DPP v3.4.1.1)
+#               2) Gert Kello private communiation (DPP 3.8)
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::CanonVRD;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.12';
+
+sub ProcessCanonVRD($$;$);
+sub WriteCanonVRD($$;$);
+sub ProcessEditData($$$);
+sub ProcessIHL($$$);
+sub ProcessIHLExif($$$);
+
+# map for adding directories to VRD
+my %vrdMap = (
+    XMP      => 'CanonVRD',
+    CanonVRD => 'VRD',
+);
+
+my %noYes = ( 0 => 'No', 1 => 'Yes' );
+
+# main tag table blocks in CanonVRD trailer (ref PH)
+%Image::ExifTool::CanonVRD::Main = (
+    WRITE_PROC => \&WriteCanonVRD,
+    PROCESS_PROC => \&ProcessCanonVRD,
+    NOTES => q{
+        Canon Digital Photo Professional writes VRD (Recipe Data) information as a
+        trailer record to JPEG, TIFF, CRW and CR2 images, or as a stand-alone VRD
+        file.  The tags listed below represent information found in this record. 
+        The complete VRD data record may be accessed as a block using the Extra
+        'CanonVRD' tag, but this tag is not extracted or copied unless specified
+        explicitly.
+    },
+    0xffff00f4 => {
+        Name => 'EditData',
+        SubDirectory => { TagTable => 'Image::ExifTool::CanonVRD::Edit' },
+    },
+    0xffff00f5 => {
+        Name => 'IHLData',
+        SubDirectory => { TagTable => 'Image::ExifTool::CanonVRD::IHL' },
+    },
+    0xffff00f6 => {
+        Name => 'XMP',
+        Flags => [ 'Binary', 'Protected' ],
+        Writable => 'undef',    # allow writing/deleting as a block
+        SubDirectory => {
+            DirName => 'XMP',
+            TagTable => 'Image::ExifTool::XMP::Main',
+        },
+    },
+);
+
+# the VRD edit information is divided into sections
+%Image::ExifTool::CanonVRD::Edit = (
+    WRITE_PROC => \&ProcessEditData,
+    PROCESS_PROC => \&ProcessEditData,
+    VARS => { ID_LABEL => 'Index' }, # change TagID label in documentation
+    NOTES => 'Canon VRD edit information.',
+    0 => {
+        Name => 'VRD1',
+        Size => 0x272,  # size of version 1.0 edit information in bytes
+        SubDirectory => { TagTable => 'Image::ExifTool::CanonVRD::Ver1' },
+    },
+    1 => {
+        Name => 'VRDStampTool',
+        # (size is variable, and obtained from int32u at end of last directory)
+        Size => 0,      # size is variable, and obtained from int32u at directory start
+        SubDirectory => { TagTable => 'Image::ExifTool::CanonVRD::StampTool' },
+    },
+    2 => {
+        Name => 'VRD2',
+        Size => undef,  # size is the remaining edit data
+        SubDirectory => { TagTable => 'Image::ExifTool::CanonVRD::Ver2' },
+    },
+);
+
+# "IHL Created Optional Item Data" tags (not yet writable)
+%Image::ExifTool::CanonVRD::IHL = (
+    PROCESS_PROC => \&ProcessIHL,
+    TAG_PREFIX => 'VRD_IHL',
+    GROUPS => { 2 => 'Image' },
+    1 => [
+        # this contains edited TIFF-format data, with an original IFD at 0x0008
+        # and an edited IFD with offset given in the TIFF header.
+        {
+            Name => 'IHL_EXIF',
+            Condition => '$self->Options("ExtractEmbedded")',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Exif::Main',
+                ProcessProc => \&ProcessIHLExif,
+            },
+        },{
+            Name => 'IHL_EXIF',
+            Notes => q{
+                extracted as a block if the Unknown option is used, or processed as the
+                first sub-document with the ExtractEmbedded option
+            },
+            Binary => 1,
+            Unknown => 1,
+        },
+    ],
+    # 2 - written by DPP 3.0.2.6, and it looks something like edit data,
+    #     but I haven't decoded it yet - PH
+    3 => {
+        # (same size as the PreviewImage with DPP 3.0.2.6)
+        Name => 'ThumbnailImage',
+        Binary => 1,
+    },
+    4 => {
+        Name => 'PreviewImage',
+        Binary => 1,
+    },
+    5 => {
+        Name => 'RawCodecVersion',
+        ValueConv => '$val =~ s/\0.*//; $val',  # truncate string at null
+    },
+    6 => {
+        Name => 'CRCDevelParams',
+        Binary => 1,
+        Unknown => 1,
+    },
+);
+
+# VRD version 1 tags (ref PH)
+%Image::ExifTool::CanonVRD::Ver1 = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    GROUPS => { 2 => 'Image' },
+    DATAMEMBER => [ 0x002 ],   # necessary for writing
+#
+# RAW image adjustment
+#
+    0x002 => {
+        Name => 'VRDVersion',
+        Format => 'int16u',
+        Writable => 0,
+        DataMember => 'VRDVersion',
+        RawConv => '$$self{VRDVersion} = $val',
+        PrintConv => 'sprintf("%.2f", $val / 100)',
+    },
+    # 0x006 related somehow to RGB levels
+    0x008 => {
+        Name => 'WBAdjRGBLevels',
+        Format => 'int16u[3]',
+    },
+    0x018 => {
+        Name => 'WhiteBalanceAdj',
+        Format => 'int16u',
+        PrintConv => {
+            0 => 'Auto',
+            1 => 'Daylight',
+            2 => 'Cloudy',
+            3 => 'Tungsten',
+            4 => 'Fluorescent',
+            5 => 'Flash',
+            8 => 'Shade',
+            9 => 'Kelvin',
+            30 => 'Manual (Click)',
+            31 => 'Shot Settings',
+        },
+    },
+    0x01a => {
+        Name => 'WBAdjColorTemp',
+        Format => 'int16u',
+    },
+    # 0x01c similar to 0x006
+    # 0x01e similar to 0x008
+    0x024 => {
+        Name => 'WBFineTuneActive',
+        Format => 'int16u',
+        PrintConv => \%noYes,
+    },
+    0x028 => {
+        Name => 'WBFineTuneSaturation',
+        Format => 'int16u',
+    },
+    0x02c => {
+        Name => 'WBFineTuneTone',
+        Format => 'int16u',
+    },
+    0x02e => {
+        Name => 'RawColorAdj',
+        Format => 'int16u',
+        PrintConv => {
+            0 => 'Shot Settings',
+            1 => 'Faithful',
+            2 => 'Custom',
+        },
+    },
+    0x030 => {
+        Name => 'RawCustomSaturation',
+        Format => 'int32s',
+    },
+    0x034 => {
+        Name => 'RawCustomTone',
+        Format => 'int32s',
+    },
+    0x038 => {
+        Name => 'RawBrightnessAdj',
+        Format => 'int32s',
+        ValueConv => '$val / 6000',
+        ValueConvInv => 'int($val * 6000 + ($val < 0 ? -0.5 : 0.5))',
+        PrintConv => 'sprintf("%.2f",$val)',
+        PrintConvInv => '$val',
+    },
+    0x03c => {
+        Name => 'ToneCurveProperty',
+        Format => 'int16u',
+        PrintConv => {
+            0 => 'Shot Settings',
+            1 => 'Linear',
+            2 => 'Custom 1',
+            3 => 'Custom 2',
+            4 => 'Custom 3',
+            5 => 'Custom 4',
+            6 => 'Custom 5',
+        },
+    },
+    # 0x040 usually "10 9 2"
+    0x07a => {
+        Name => 'DynamicRangeMin',
+        Format => 'int16u',
+    },
+    0x07c => {
+        Name => 'DynamicRangeMax',
+        Format => 'int16u',
+    },
+    # 0x0c6 usually "10 9 2"
+#
+# RGB image adjustment
+#
+    0x110 => {
+        Name => 'ToneCurveActive',
+        Format => 'int16u',
+        PrintConv => \%noYes,
+    },
+    0x113 => {
+        Name => 'ToneCurveMode',
+        PrintConv => { 0 => 'RGB', 1 => 'Luminance' },
+    },
+    0x114 => {
+        Name => 'BrightnessAdj',
+        Format => 'int8s',
+    },
+    0x115 => {
+        Name => 'ContrastAdj',
+        Format => 'int8s',
+    },
+    0x116 => {
+        Name => 'SaturationAdj',
+        Format => 'int16s',
+    },
+    0x11e => {
+        Name => 'ColorToneAdj',
+        Notes => 'in degrees, so -1 is the same as 359',
+        Format => 'int32s',
+    },
+    0x126 => {
+        Name => 'LuminanceCurvePoints',
+        Format => 'int16u[21]',
+        PrintConv => 'Image::ExifTool::CanonVRD::ToneCurvePrint($val)',
+        PrintConvInv => 'Image::ExifTool::CanonVRD::ToneCurvePrintInv($val)',
+    },
+    0x150 => {
+        Name => 'LuminanceCurveLimits',
+        Notes => '4 numbers: input and output highlight and shadow points',
+        Format => 'int16u[4]',
+    },
+    0x159 => {
+        Name => 'ToneCurveInterpolation',
+        PrintConv => { 0 => 'Curve', 1 => 'Straight' },
+    },
+    0x160 => {
+        Name => 'RedCurvePoints',
+        Format => 'int16u[21]',
+        PrintConv => 'Image::ExifTool::CanonVRD::ToneCurvePrint($val)',
+        PrintConvInv => 'Image::ExifTool::CanonVRD::ToneCurvePrintInv($val)',
+    },
+    # 0x193 same as 0x159
+    0x19a => {
+        Name => 'GreenCurvePoints',
+        Format => 'int16u[21]',
+        PrintConv => 'Image::ExifTool::CanonVRD::ToneCurvePrint($val)',
+        PrintConvInv => 'Image::ExifTool::CanonVRD::ToneCurvePrintInv($val)',
+    },
+    # 0x1cd same as 0x159
+    0x1d4 => {
+        Name => 'BlueCurvePoints',
+        Format => 'int16u[21]',
+        PrintConv => 'Image::ExifTool::CanonVRD::ToneCurvePrint($val)',
+        PrintConvInv => 'Image::ExifTool::CanonVRD::ToneCurvePrintInv($val)',
+    },
+    0x18a => {
+        Name => 'RedCurveLimits',
+        Format => 'int16u[4]',
+    },
+    0x1c4 => {
+        Name => 'GreenCurveLimits',
+        Format => 'int16u[4]',
+    },
+    0x1fe => {
+        Name => 'BlueCurveLimits',
+        Format => 'int16u[4]',
+    },
+    # 0x207 same as 0x159
+    0x20e => {
+        Name => 'RGBCurvePoints',
+        Format => 'int16u[21]',
+        PrintConv => 'Image::ExifTool::CanonVRD::ToneCurvePrint($val)',
+        PrintConvInv => 'Image::ExifTool::CanonVRD::ToneCurvePrintInv($val)',
+    },
+    0x238 => {
+        Name => 'RGBCurveLimits',
+        Format => 'int16u[4]',
+    },
+    # 0x241 same as 0x159
+    0x244 => {
+        Name => 'CropActive',
+        Format => 'int16u',
+        PrintConv => \%noYes,
+    },
+    0x246 => {
+        Name => 'CropLeft',
+        Notes => 'crop coordinates in original unrotated image',
+        Format => 'int16u',
+    },
+    0x248 => {
+        Name => 'CropTop',
+        Format => 'int16u',
+    },
+    0x24a => {
+        Name => 'CropWidth',
+        Format => 'int16u',
+    },
+    0x24c => {
+        Name => 'CropHeight',
+        Format => 'int16u',
+    },
+    0x25a => {
+        Name => 'SharpnessAdj',
+        Format => 'int16u',
+    },
+    0x260 => {
+        Name => 'CropAspectRatio',
+        Format => 'int16u',
+        PrintConv => {
+            0 => 'Free',
+            1 => '3:2',
+            2 => '2:3',
+            3 => '4:3',
+            4 => '3:4',
+            5 => 'A-size Landscape',
+            6 => 'A-size Portrait',
+            7 => 'Letter-size Landscape',
+            8 => 'Letter-size Portrait',
+            9 => '4:5',
+            10 => '5:4',
+            11 => '1:1',
+        },
+    },
+    0x262 => {
+        Name => 'ConstrainedCropWidth',
+        Format => 'float',
+        PrintConv => 'sprintf("%.7g",$val)',
+        PrintConvInv => '$val',
+    },
+    0x266 => {
+        Name => 'ConstrainedCropHeight',
+        Format => 'float',
+        PrintConv => 'sprintf("%.7g",$val)',
+        PrintConvInv => '$val',
+    },
+    0x26a => {
+        Name => 'CheckMark',
+        Format => 'int16u',
+        PrintConv => {
+            0 => 'Clear',
+            1 => 1,
+            2 => 2,
+            3 => 3,
+        },
+    },
+    0x26e => {
+        Name => 'Rotation',
+        Format => 'int16u',
+        PrintConv => {
+            0 => 0,
+            1 => 90,
+            2 => 180,
+            3 => 270,
+        },
+    },
+    0x270 => {
+        Name => 'WorkColorSpace',
+        Format => 'int16u',
+        PrintConv => {
+            0 => 'sRGB',
+            1 => 'Adobe RGB',
+            2 => 'Wide Gamut RGB',
+            3 => 'Apple RGB',
+            4 => 'ColorMatch RGB',
+        },
+    },
+    # (VRD 1.0 edit data ends here -- 0x272 bytes)
+);
+
+# VRD Stamp Tool tags (ref PH)
+%Image::ExifTool::CanonVRD::StampTool = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    0x00 => {
+        Name => 'StampToolCount',
+        Format => 'int32u',
+    },
+);
+
+# VRD version 2 and 3 tags (ref PH)
+%Image::ExifTool::CanonVRD::Ver2 = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    FORMAT => 'int16s',
+    DATAMEMBER => [ 0x58 ], # (required for writable var-format tags)
+    GROUPS => { 2 => 'Image' },
+    NOTES => 'Tags added in DPP version 2.0 and later.',
+    0x02 => {
+        Name => 'PictureStyle',
+        PrintConv => {
+            0 => 'Standard',
+            1 => 'Portrait',
+            2 => 'Landscape',
+            3 => 'Neutral',
+            4 => 'Faithful',
+            5 => 'Monochrome',
+            6 => 'Unknown?', # PH (maybe in-camera custom picture style?)
+            7 => 'Custom',
+        },
+    },
+    0x03 => {
+        Name => 'IsCustomPictureStyle',
+        PrintConv => \%noYes,
+    },
+    0x0d => 'StandardRawColorTone',
+    0x0e => 'StandardRawSaturation',
+    0x0f => 'StandardRawContrast',
+    0x10 => {
+        Name => 'StandardRawLinear',
+        PrintConv => \%noYes,
+    },
+    0x11 => 'StandardRawSharpness',
+    0x12 => 'StandardRawHighlightPoint',
+    0x13 => 'StandardRawShadowPoint',
+    0x14 => 'StandardOutputHighlightPoint', #2
+    0x15 => 'StandardOutputShadowPoint', #2
+    0x16 => 'PortraitRawColorTone',
+    0x17 => 'PortraitRawSaturation',
+    0x18 => 'PortraitRawContrast',
+    0x19 => {
+        Name => 'PortraitRawLinear',
+        PrintConv => \%noYes,
+    },
+    0x1a => 'PortraitRawSharpness',
+    0x1b => 'PortraitRawHighlightPoint',
+    0x1c => 'PortraitRawShadowPoint',
+    0x1d => 'PortraitOutputHighlightPoint',
+    0x1e => 'PortraitOutputShadowPoint',
+    0x1f => 'LandscapeRawColorTone',
+    0x20 => 'LandscapeRawSaturation',
+    0x21 => 'LandscapeRawContrast',
+    0x22 => {
+        Name => 'LandscapeRawLinear',
+        PrintConv => \%noYes,
+    },
+    0x23 => 'LandscapeRawSharpness',
+    0x24 => 'LandscapeRawHighlightPoint',
+    0x25 => 'LandscapeRawShadowPoint',
+    0x26 => 'LandscapeOutputHighlightPoint',
+    0x27 => 'LandscapeOutputShadowPoint',
+    0x28 => 'NeutralRawColorTone',
+    0x29 => 'NeutralRawSaturation',
+    0x2a => 'NeutralRawContrast',
+    0x2b => {
+        Name => 'NeutralRawLinear',
+        PrintConv => \%noYes,
+    },
+    0x2c => 'NeutralRawSharpness',
+    0x2d => 'NeutralRawHighlightPoint',
+    0x2e => 'NeutralRawShadowPoint',
+    0x2f => 'NeutralOutputHighlightPoint',
+    0x30 => 'NeutralOutputShadowPoint',
+    0x31 => 'FaithfulRawColorTone',
+    0x32 => 'FaithfulRawSaturation',
+    0x33 => 'FaithfulRawContrast',
+    0x34 => {
+        Name => 'FaithfulRawLinear',
+        PrintConv => \%noYes,
+    },
+    0x35 => 'FaithfulRawSharpness',
+    0x36 => 'FaithfulRawHighlightPoint',
+    0x37 => 'FaithfulRawShadowPoint',
+    0x38 => 'FaithfulOutputHighlightPoint',
+    0x39 => 'FaithfulOutputShadowPoint',
+    0x3a => {
+        Name => 'MonochromeFilterEffect',
+        PrintConv => {
+            -2 => 'None',
+            -1 => 'Yellow',
+            0 => 'Orange',
+            1 => 'Red',
+            2 => 'Green',
+        },
+    },
+    0x3b => {
+        Name => 'MonochromeToningEffect',
+        PrintConv => {
+            -2 => 'None',
+            -1 => 'Sepia',
+            0 => 'Blue',
+            1 => 'Purple',
+            2 => 'Green',
+        },
+    },
+    0x3c => 'MonochromeContrast',
+    0x3d => {
+        Name => 'MonochromeLinear',
+        PrintConv => \%noYes,
+    },
+    0x3e => 'MonochromeSharpness',
+    0x3f => 'MonochromeRawHighlightPoint',
+    0x40 => 'MonochromeRawShadowPoint',
+    0x41 => 'MonochromeOutputHighlightPoint',
+    0x42 => 'MonochromeOutputShadowPoint',
+    0x45 => { Name => 'UnknownContrast',            Unknown => 1 },
+    0x46 => {
+        Name => 'UnknownLinear',
+        Unknown => 1,
+        PrintConv => \%noYes,
+    },
+    0x47 => { Name => 'UnknownSharpness',           Unknown => 1 },
+    0x48 => { Name => 'UnknownRawHighlightPoint',   Unknown => 1 },
+    0x49 => { Name => 'UnknownRawShadowPoint',      Unknown => 1 },
+    0x4a => { Name => 'UnknownOutputHighlightPoint',Unknown => 1 },
+    0x4b => { Name => 'UnknownOutputShadowPoint',   Unknown => 1 },
+    0x4e => 'CustomContrast',
+    0x4f => {
+        Name => 'CustomLinear',
+        PrintConv => \%noYes,
+    },
+    0x50 => 'CustomSharpness',
+    0x51 => 'CustomRawHighlightPoint',
+    0x52 => 'CustomRawShadowPoint',
+    0x53 => 'CustomOutputHighlightPoint',
+    0x54 => 'CustomOutputShadowPoint',
+    0x58 => {
+        Name => 'CustomPictureStyleData',
+        Format => 'var_int16u',
+        Binary => 1,
+        Notes => 'variable-length data structure',
+        Writable => 0,
+        RawConv => 'length($val) == 2 ? undef : $val', # ignore if no data
+    },
+    # (VRD 2.0 edit data ends here: 178 bytes, index 0x59)
+    0x5e => [{
+        Name => 'ChrominanceNoiseReduction',
+        Condition => '$$self{VRDVersion} < 330',
+        Notes => 'VRDVersion prior to 3.30',
+        PrintConv => {
+            0   => 'Off',
+            58  => 'Low',
+            100 => 'High',
+        },
+    },{ #1
+        Name => 'ChrominanceNoiseReduction',
+        Notes => 'VRDVersion 3.30 or later',
+        PrintHex => 1,
+        PrintConvColumns => 4,
+        PrintConv => {
+            0x00 => 0,
+            0x10 => 1,
+            0x21 => 2,
+            0x32 => 3,
+            0x42 => 4,
+            0x53 => 5,
+            0x64 => 6,
+            0x74 => 7,
+            0x85 => 8,
+            0x96 => 9,
+            0xa6 => 10,
+            0xa7 => 11,
+            0xa8 => 12,
+            0xa9 => 13,
+            0xaa => 14,
+            0xab => 15,
+            0xac => 16,
+            0xad => 17,
+            0xae => 18,
+            0xaf => 19,
+            0xb0 => 20,
+        },
+    }],
+    0x5f => [{
+        Name => 'LuminanceNoiseReduction',
+        Condition => '$$self{VRDVersion} < 330',
+        Notes => 'VRDVersion prior to 3.30',
+        PrintConv => {
+            0   => 'Off',
+            65  => 'Low',
+            100 => 'High',
+        },
+    },{ #1
+        Name => 'LuminanceNoiseReduction',
+        Notes => 'VRDVersion 3.30 or later',
+        PrintHex => 1,
+        PrintConvColumns => 4,
+        PrintConv => {
+            0x00 => 0,
+            0x41 => 1,
+            0x64 => 2,
+            0x6e => 3,
+            0x78 => 4,
+            0x82 => 5,
+            0x8c => 6,
+            0x96 => 7,
+            0xa0 => 8,
+            0xaa => 9,
+            0xb4 => 10,
+            0xb5 => 11,
+            0xb6 => 12,
+            0xb7 => 13,
+            0xb8 => 14,
+            0xb9 => 15,
+            0xba => 16,
+            0xbb => 17,
+            0xbc => 18,
+            0xbd => 19,
+            0xbe => 20,
+        },
+    }],
+    0x60 => [{
+        Name => 'ChrominanceNR_TIFF_JPEG',
+        Condition => '$$self{VRDVersion} < 330',
+        Notes => 'VRDVersion prior to 3.30',
+        PrintConv => {
+            0   => 'Off',
+            33  => 'Low',
+            100 => 'High',
+        },
+    },{ #1
+        Name => 'ChrominanceNR_TIFF_JPEG',
+        Notes => 'VRDVersion 3.30 or later',
+        PrintHex => 1,
+        PrintConvColumns => 4,
+        PrintConv => {
+            0x00 => 0,
+            0x10 => 1,
+            0x21 => 2,
+            0x32 => 3,
+            0x42 => 4,
+            0x53 => 5,
+            0x64 => 6,
+            0x74 => 7,
+            0x85 => 8,
+            0x96 => 9,
+            0xa6 => 10,
+            0xa7 => 11,
+            0xa8 => 12,
+            0xa9 => 13,
+            0xaa => 14,
+            0xab => 15,
+            0xac => 16,
+            0xad => 17,
+            0xae => 18,
+            0xaf => 19,
+            0xb0 => 20,
+        },
+    }],
+    # (VRD 3.0 edit data ends here: 196 bytes, index 0x62)
+    0x62 => {
+        Name => 'ChromaticAberrationOn',
+        ValueConv => \%noYes,
+    },
+    0x63 => {
+        Name => 'DistortionCorrectionOn',
+        ValueConv => \%noYes,
+    },
+    0x64 => {
+        Name => 'PeripheralIlluminationOn',
+        ValueConv => \%noYes,
+    },
+    0x65 => {
+        Name => 'ColorBlur',
+        ValueConv => \%noYes,
+    },
+    0x66 => {
+        Name => 'ChromaticAberration',
+        ValueConv => '$val / 0x400',
+        ValueConvInv => 'int($val * 0x400 + 0.5)',
+        PrintConv => 'sprintf("%.0f%%", $val * 100)',
+        PrintConvInv => 'ToFloat($val) / 100',
+    },
+    0x67 => {
+        Name => 'DistortionCorrection',
+        ValueConv => '$val / 0x400',
+        ValueConvInv => 'int($val * 0x400 + 0.5)',
+        PrintConv => 'sprintf("%.0f%%", $val * 100)',
+        PrintConvInv => 'ToFloat($val) / 100',
+    },
+    0x68 => {
+        Name => 'PeripheralIllumination',
+        ValueConv => '$val / 0x400',
+        ValueConvInv => 'int($val * 0x400 + 0.5)',
+        PrintConv => 'sprintf("%.0f%%", $val * 100)',
+        PrintConvInv => 'ToFloat($val) / 100',
+    },
+    0x69 => {
+        Name => 'AberrationCorrectionDistance',
+        Notes => '100% = infinity',
+        RawConv => '$val == 0x7fff ? undef : $val',
+        ValueConv => '1 - $val / 0x400',
+        ValueConvInv => 'int((1 - $val) * 0x400 + 0.5)',
+        PrintConv => 'sprintf("%.0f%%", $val * 100)',
+        PrintConvInv => 'ToFloat($val) / 100',
+    },
+    0x6a => 'ChromaticAberrationRed',
+    0x6b => 'ChromaticAberrationBlue',
+    0x6d => { #1
+        Name => 'LuminanceNR_TIFF_JPEG',
+        Notes => 'val = raw / 10',
+        ValueConv => '$val / 10',
+        ValueConvInv => 'int($val * 10 + 0.5)',
+    },
+    # (VRD 3.4 edit data ends here: 220 bytes, index 0x6e)
+    0x6e => {
+        Name => 'AutoLightingOptimizerOn',
+        PrintConv => \%noYes,
+    },
+    0x6f => {
+        Name => 'AutoLightingOptimizer',
+        PrintConv => {
+            100 => 'Low',
+            200 => 'Standard',
+            300 => 'Strong',
+            0x7fff => 'n/a', #1
+        },
+    },
+    # (VRD 3.5 edit data ends here: 232 bytes, index 0x74)
+    0x75 => {
+        Name => 'StandardRawHighlight',
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+    },
+    0x76 => {
+        Name => 'PortraitRawHighlight',
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+    },
+    0x77 => {
+        Name => 'LandscapeRawHighlight',
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+    },
+    0x78 => {
+        Name => 'NeutralRawHighlight',
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+    },
+    0x79 => {
+        Name => 'FaithfulRawHighlight',
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+    },
+    0x7a => {
+        Name => 'MonochromeRawHighlight',
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+    },
+    0x7b => {
+        Name => 'UnknownRawHighlight',
+        Unknown => 1,
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+    },
+    0x7c => {
+        Name => 'CustomRawHighlight',
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+    },
+    0x7e => {
+        Name => 'StandardRawShadow',
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+    },
+    0x7f => {
+        Name => 'PortraitRawShadow',
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+    },
+    0x80 => {
+        Name => 'LandscapeRawShadow',
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+    },
+    0x81 => {
+        Name => 'NeutralRawShadow',
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+    },
+    0x82 => {
+        Name => 'FaithfulRawShadow',
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+    },
+    0x83 => {
+        Name => 'MonochromeRawShadow',
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+    },
+    0x84 => {
+        Name => 'UnknownRawShadow',
+        Unknown => 1,
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+    },
+    0x85 => {
+        Name => 'CustomRawShadow',
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+    },
+    0x8b => { #2
+        Name => 'AngleAdj',
+        Format => 'int32s',
+        ValueConv => '$val / 100',
+        ValueConvInv => '$val * 100',
+    },
+    0x8e => {
+        Name => 'CheckMark2',
+        Format => 'int16u',
+        PrintConv => {
+            0 => 'Clear',
+            1 => 1,
+            2 => 2,
+            3 => 3,
+            4 => 4,
+            5 => 5,
+        },
+    },
+    # (VRD 3.8 edit data ends here: 286 bytes, index 0x8f)
+    0x90 => {
+        Name => 'UnsharpMask',
+        PrintConv => { 0 => 'Off', 1 => 'On' },
+    },
+    0x92 => 'UnsharpMaskStrength',
+    0x94 => 'UnsharpMaskFineness',
+    0x96 => 'UnsharpMaskThreshold',
+    # (VRD 3.91 edit data ends here: 392 bytes, index 0xc4)
+);
+
+#------------------------------------------------------------------------------
+# Tone curve print conversion
+sub ToneCurvePrint($)
+{
+    my $val = shift;
+    my @vals = split ' ', $val;
+    return $val unless @vals == 21;
+    my $n = shift @vals;
+    return $val unless $n >= 2 and $n <= 10;
+    $val = '';
+    while ($n--) {
+        $val and $val .= ' ';
+        $val .= '(' . shift(@vals) . ',' . shift(@vals) . ')';
+    }
+    return $val;
+}
+
+#------------------------------------------------------------------------------
+# Inverse print conversion for tone curve
+sub ToneCurvePrintInv($)
+{
+    my $val = shift;
+    my @vals = ($val =~ /\((\d+),(\d+)\)/g);
+    return undef unless @vals >= 4 and @vals <= 20 and not @vals & 0x01;
+    unshift @vals, scalar(@vals) / 2;
+    while (@vals < 21) { push @vals, 0 }
+    return join(' ',@vals);
+}
+
+#------------------------------------------------------------------------------
+# Read/Write VRD edit data
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: Reading: 1 on success; Writing: modified edit data, or undef if nothing changed
+sub ProcessEditData($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    $exifTool or return 1;    # allow dummy access
+    my $dataPt = $$dirInfo{DataPt};
+    my $pos = $$dirInfo{DirStart};
+    my $dataPos = $$dirInfo{DataPos};
+    my $outfile = $$dirInfo{OutFile};
+    my $dirLen = $$dirInfo{DirLen};
+    my $dirEnd = $pos + $dirLen;
+    my $verbose = $exifTool->Options('Verbose');
+    my $out = $exifTool->Options('TextOut');
+    my $oldChanged = $$exifTool{CHANGED};
+
+    $exifTool->VerboseDir('VRD Edit Data', 0, $dirLen);
+
+    # loop through all records in the edit data
+    my ($recNum, $recLen, $err);
+    for ($recNum=0;; ++$recNum, $pos+=$recLen) {
+        if ($pos + 4 > $dirEnd) {
+            last if $pos == $dirEnd;    # all done if we arrived at end
+            $recLen = 0;    # just reset record size (will exit loop on test below)
+        } else {
+            $recLen = Get32u($dataPt, $pos);
+        }
+        $pos += 4;          # move to start of record
+        if ($pos + $recLen > $dirEnd) {
+            $exifTool->Warn('Possibly corrupt CanonVRD Edit record');
+            $err = 1;
+            last;
+        }
+        if ($verbose > 1 and not $outfile) {
+            printf $out "$$exifTool{INDENT}CanonVRD Edit record ($recLen bytes at offset 0x%x)\n",
+                   $pos + $dataPos;
+        }
+
+        # our edit information is the 0th record, so don't process the others
+        next if $recNum;
+
+        # process VRD edit information
+        my $subTablePtr = GetTagTable('Image::ExifTool::CanonVRD::Edit');
+        my $index;
+        my $editData = substr($$dataPt, $pos, $recLen);
+        my %subdirInfo = (
+            DataPt => \$editData,
+            DataPos => $dataPos + $pos,
+        );
+        my $start = 0;
+        # loop through various sections of the VRD edit data
+        for ($index=0; ; ++$index) {
+            my $tagInfo = $$subTablePtr{$index} or last;
+            my $dirLen;
+            my $maxLen = $recLen - $start;
+            if ($$tagInfo{Size}) {
+                $dirLen = $$tagInfo{Size};
+            } elsif (defined $$tagInfo{Size}) {
+                # get size from int32u at $start
+                last unless $start + 4 <= $recLen;
+                $dirLen = Get32u(\$editData, $start);
+                $start += 4; # skip the length word
+            } else {
+                $dirLen = $maxLen;
+            }
+            $dirLen > $maxLen and $dirLen = $maxLen;
+            if ($dirLen) {
+                my $subTable = GetTagTable($tagInfo->{SubDirectory}->{TagTable});
+                my $subName = $$tagInfo{Name};
+                $subdirInfo{DirStart} = $start;
+                $subdirInfo{DirLen} = $dirLen;
+                $subdirInfo{DirName} = $subName;
+                if ($outfile) {
+                    # rewrite this section of the VRD edit information
+                    $verbose and print $out "  Rewriting Canon $subName\n";
+                    my $newVal = $exifTool->WriteDirectory(\%subdirInfo, $subTable);
+                    substr($$dataPt, $pos+$start, $dirLen) = $newVal if $newVal;
+                } else {
+                    $exifTool->VPrint(0, "$$exifTool{INDENT}$subName (SubDirectory) -->\n");
+                    $exifTool->VerboseDump(\$editData,
+                        Start => $start,
+                        Addr  => $dataPos + $pos + $start,
+                        Len   => $dirLen,
+                    );
+                    # extract tags from this section of the VRD edit information
+                    $exifTool->ProcessDirectory(\%subdirInfo, $subTable);
+                }
+            }
+            # next section starts at the end of this one
+            $start += $dirLen;
+        }
+    }
+    if ($outfile) {
+        return undef if $oldChanged == $$exifTool{CHANGED};
+        return substr($$dataPt, $$dirInfo{DirStart}, $dirLen);
+    }
+    return $err ? 0 : 1;
+}
+
+#------------------------------------------------------------------------------
+# Process VRD IHL data
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessIHL($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dataPos = $$dirInfo{DataPos};
+    my $pos = $$dirInfo{DirStart};
+    my $dirLen = $$dirInfo{DirLen};
+    my $dirEnd = $pos + $dirLen;
+
+    $exifTool->VerboseDir('VRD IHL', 0, $dirLen);
+
+    SetByteOrder('II'); # (make up your mind, Canon!)
+    while ($pos + 48 <= $dirEnd) {
+        my $hdr = substr($$dataPt, $pos, 48);
+        unless ($hdr =~ /^IHL Created Optional Item Data\0\0/) {
+            $exifTool->Warn('Possibly corrupted VRD IHL data');
+            last;
+        }
+        my $tag  = Get32u($dataPt, $pos + 36);
+        my $size = Get32u($dataPt, $pos + 40); # size of data in IHL record
+        my $next = Get32u($dataPt, $pos + 44); # size of complete IHL record
+        if ($size > $next or $pos + 48 + $next > $dirEnd) {
+            $exifTool->Warn(sprintf('Bad size for VRD IHL tag 0x%.4x', $tag));
+            last;
+        }
+        $pos += 48;
+        $exifTool->HandleTag($tagTablePtr, $tag, substr($$dataPt, $pos, $size),
+            DataPt  => $dataPt,
+            DataPos => $dataPos,
+            Start   => $pos,
+            Size    => $size
+        );
+        $pos += $next;
+    }
+    return 1;
+}    
+    
+#------------------------------------------------------------------------------
+# Process VRD IHL EXIF data
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessIHLExif($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    $$exifTool{DOC_NUM} = 1;
+    # the IHL-edited maker notes may look messed up, but the offsets should be OK
+    my $oldFix = $exifTool->Options(FixBase => 0);
+    my $rtnVal = $exifTool->ProcessTIFF($dirInfo, $tagTablePtr);
+    $exifTool->Options(FixBase => $oldFix);
+    delete $$exifTool{DOC_NUM};
+    return $rtnVal;
+}
+
+#------------------------------------------------------------------------------
+# Read/write Canon VRD file
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 if this was a Canon VRD file, 0 otherwise, -1 on write error
+sub ProcessVRD($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my $buff;
+    my $num = $raf->Read($buff, 0x1c);
+
+    # initialize write directories if necessary
+    $exifTool->InitWriteDirs(\%vrdMap, 'XMP') if $$dirInfo{OutFile};
+
+    if (not $num and $$dirInfo{OutFile}) {
+        # create new VRD file from scratch
+        my $newVal = $exifTool->GetNewValues('CanonVRD');
+        if ($newVal) {
+            $exifTool->VPrint(0, "  Writing CanonVRD as a block\n");
+            Write($$dirInfo{OutFile}, $newVal) or return -1;
+            ++$exifTool->{CHANGED};
+        } else {
+            # allow VRD to be created from individual tags
+            if ($$exifTool{ADD_DIRS}{CanonVRD}) {
+                my $newVal = '';
+                if (ProcessCanonVRD($exifTool, { OutFile => \$newVal }) > 0) {
+                    Write($$dirInfo{OutFile}, $newVal) or return -1;
+                    ++$exifTool->{CHANGED};
+                    return 1;
+                }
+            }
+            $exifTool->Error('No CanonVRD information to write');
+        }
+    } else {
+        $num == 0x1c or return 0;
+        $buff =~ /^CANON OPTIONAL DATA\0/ or return 0;
+        $exifTool->SetFileType();
+        $$dirInfo{DirName} = 'CanonVRD';    # set directory name for verbose output
+        my $result = ProcessCanonVRD($exifTool, $dirInfo);
+        return $result if $result < 0;
+        $result or $exifTool->Warn('Format error in VRD file');
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Write VRD data record as a block
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: VRD data block (may be empty if no VRD data)
+# Notes: Increments ExifTool CHANGED flag if changed
+sub WriteCanonVRD($$;$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    $exifTool or return 1;    # allow dummy access
+    my $nvHash = $exifTool->GetNewValueHash($Image::ExifTool::Extra{CanonVRD});
+    return undef unless Image::ExifTool::IsOverwriting($nvHash);
+    my $val = Image::ExifTool::GetNewValues($nvHash);
+    $val = '' unless defined $val;
+    ++$exifTool->{CHANGED};
+    return $val;
+}
+
+#------------------------------------------------------------------------------
+# Read/write CanonVRD information
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 on success, 0 not valid VRD, or -1 error writing
+# - updates DataPos to point to start of CanonVRD information
+# - updates DirLen to trailer length
+sub ProcessCanonVRD($$;$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $raf = $$dirInfo{RAF};
+    my $offset = $$dirInfo{Offset} || 0;
+    my $outfile = $$dirInfo{OutFile};
+    my $verbose = $exifTool->Options('Verbose');
+    my $out = $exifTool->Options('TextOut');
+    my ($buff, $footer, $header, $created, $err);
+    my ($blockLen, $blockType, $size, %didDir);
+
+    if (not $raf) {
+        my $vrdPt = $$dirInfo{DataPt};
+        unless ($vrdPt) {
+            return 1 unless $outfile;
+            # create blank VRD data from scratch
+            my $blank = "CANON OPTIONAL DATA\0\0\x01\0\0\0\0\0\0" .
+                        "CANON OPTIONAL DATA\0" . ("\0" x 42) . "\xff\xd9";
+            $vrdPt = \$blank;
+            $verbose and printf $out "  Creating CanonVRD trailer\n";
+            $created = 1;
+        }
+        $raf = new File::RandomAccess($vrdPt);
+    }
+    # read and validate the trailer footer
+    $raf->Seek(-64-$offset, 2)    or return 0;
+    $raf->Read($footer, 64) == 64 or return 0;
+    $footer =~ /^CANON OPTIONAL DATA\0(.{4})/s or return 0;
+    $size = unpack('N', $1);
+
+    # read and validate the header too
+    # (header is 0x1c bytes and footer is 0x40 bytes)
+    unless (($size & 0x80000000) == 0 and
+            $raf->Seek(-$size-0x5c, 1) and
+            $raf->Read($header, 0x1c) == 0x1c and
+            $header =~ /^CANON OPTIONAL DATA\0/ and
+            $raf->Read($buff, $size) == $size)
+    {
+        $exifTool->Warn('Bad CanonVRD trailer');
+        return 0;
+    }
+    # extract CanonVRD block if Binary option set, or if requested
+    if ($exifTool->{OPTIONS}->{Binary} or $exifTool->{REQ_TAG_LOOKUP}->{canonvrd}) {
+        $exifTool->FoundTag('CanonVRD', $header . $buff . $footer);
+    }
+    # set variables returned in dirInfo hash
+    $$dirInfo{DataPos} = $raf->Tell() - $size - 0x1c;
+    $$dirInfo{DirLen} = $size + 0x5c;
+
+    if ($outfile) {
+        $verbose and not $created and printf $out "  Rewriting CanonVRD trailer\n";
+        # delete CanonVRD information if specified
+        if ($exifTool->{DEL_GROUP}->{CanonVRD} or $exifTool->{DEL_GROUP}->{Trailer} or
+            # also delete if writing as a block (will get added back again later)
+            $exifTool->{NEW_VALUE}->{$Image::ExifTool::Extra{CanonVRD}})
+        {
+            if ($exifTool->{FILE_TYPE} eq 'VRD') {
+                my $newVal = $exifTool->GetNewValues('CanonVRD');
+                if ($newVal) {
+                    $verbose and printf $out "  Writing CanonVRD as a block\n";
+                    Write($outfile, $newVal) or return -1;
+                    ++$exifTool->{CHANGED};
+                } else {
+                    $exifTool->Error("Can't delete all CanonVRD information from a VRD file");
+                }
+            } else {
+                $verbose and printf $out "  Deleting CanonVRD trailer\n";
+                ++$exifTool->{CHANGED};
+            }
+            return 1;
+        }
+        # write now and return if CanonVRD was set as a block
+        my $val = $exifTool->GetNewValues('CanonVRD');
+        if ($val) {
+            $verbose and print $out "  Writing CanonVRD as a block\n";
+            Write($outfile, $val) or return -1;
+            ++$exifTool->{CHANGED};
+            return 1;
+        }
+    } elsif ($verbose or $exifTool->{HTML_DUMP}) {
+        $exifTool->DumpTrailer($dirInfo) if $$dirInfo{RAF};
+    }
+
+    $tagTablePtr = GetTagTable('Image::ExifTool::CanonVRD::Main');
+
+    # validate VRD trailer and get position and length of edit record
+    SetByteOrder('MM');
+    my $pos = 0;
+    my $vrdPos = $$dirInfo{DataPos} + length($header);
+    my $dataPt = \$buff;
+
+    # loop through the VRD blocks
+    for (;;) {
+        if ($pos + 8 > $size) {
+            last if $pos == $size;
+            $blockLen = $size;  # mark as invalid
+        } else {
+            $blockType = Get32u($dataPt, $pos);
+            $blockLen = Get32u($dataPt, $pos + 4);
+        }
+        $pos += 8;          # move to start of block
+        if ($pos + $blockLen > $size) {
+            $exifTool->Warn('Possibly corrupt CanonVRD block');
+            last;
+        }
+        if ($verbose > 1 and not $outfile) {
+            printf $out "  CanonVRD block 0x%.8x ($blockLen bytes at offset 0x%x)\n",
+                $blockType, $pos + $vrdPos;
+            if ($verbose > 2) {
+                my %parms = (
+                    Start  => $pos,
+                    Addr   => $pos + $vrdPos,
+                    Out    => $out,
+                    Prefix => $$exifTool{INDENT},
+                );
+                $parms{MaxLen} = $verbose == 3 ? 96 : 2048 if $verbose < 5;
+                Image::ExifTool::HexDump($dataPt, $blockLen, %parms);
+            }
+        }
+        my $tagInfo = $$tagTablePtr{$blockType};
+        unless ($tagInfo) {
+            unless ($exifTool->Options('Unknown')) {
+                $pos += $blockLen;  # step to next block
+                next;
+            }
+            my $name = sprintf('CanonVRD_0x%.8x', $blockType);
+            my $desc = $name;
+            $desc =~ tr/_/ /;
+            $tagInfo = {
+                Name        => $name,
+                Description => $desc,
+                Binary      => 1,
+            };
+            Image::ExifTool::AddTagToTable($tagTablePtr, $blockType, $tagInfo);
+        }
+        if ($$tagInfo{SubDirectory}) {
+            my $subTablePtr = GetTagTable($$tagInfo{SubDirectory}{TagTable});
+            my %subdirInfo = (
+                DataPt   => $dataPt,
+                DataLen  => length $$dataPt,
+                DataPos  => $vrdPos,
+                DirStart => $pos,
+                DirLen   => $blockLen,
+                DirName  => $$tagInfo{Name},
+                Parent   => 'CanonVRD',
+                OutFile  => $outfile,
+            );
+            if ($outfile) {
+                # set flag indicating we did this directory
+                $didDir{$$tagInfo{Name}} = 1;
+                my $dat;
+                if ($$exifTool{NEW_VALUE}{$tagInfo}) {
+                    # write as a block
+                    $exifTool->VPrint(0, "Writing $$tagInfo{Name} as a block\n");
+                    $dat = $exifTool->GetNewValues($tagInfo);
+                    $dat = '' unless defined $dat;
+                    ++$$exifTool{CHANGED};
+                } else {
+                    $dat = $exifTool->WriteDirectory(\%subdirInfo, $subTablePtr);
+                }
+                # update data with new directory
+                if (defined $dat) {
+                    my $buf2;
+                    if (length $dat or $$exifTool{FILE_TYPE} !~ /^(CRW|VRD)$/) {
+                        # replace with new block (updating the block length word)
+                        $buf2 = substr($$dataPt, 0, $pos - 4) . Set32u(length $dat) . $dat;
+                    } else {
+                        # remove block totally (CRW/VRD files only)
+                        $buf2 = substr($$dataPt, 0, $pos - 8);
+                    }
+                    my $oldBlockEnd = $pos + $blockLen;
+                    $pos = length $$dataPt; # set to start of next block
+                    $buf2 .= substr($$dataPt, $oldBlockEnd);
+                    undef $$dataPt;         # free the memory
+                    $dataPt = \$buf2;
+                    # update the new VRD length in the header/footer
+                    Set32u(length($buf2), \$header, 0x18);
+                    Set32u(length($buf2), \$footer, 0x14);
+                    next;
+                }
+            } else {
+                # extract as a block if requested
+                $exifTool->ProcessDirectory(\%subdirInfo, $subTablePtr);
+            }
+        } else {
+            $exifTool->HandleTag($tagTablePtr, $blockType, substr($$dataPt, $pos, $blockLen));
+        }
+        $pos += $blockLen;  # step to next block
+    }
+    if ($outfile) {
+        # create XMP block if necessary (CRW/VRD files only)
+        if ($$exifTool{ADD_DIRS}{CanonVRD} and not $didDir{XMP}) {
+            my $subTablePtr = GetTagTable('Image::ExifTool::XMP::Main');
+            my $dat = $exifTool->WriteDirectory({ Parent => 'CanonVRD' }, $subTablePtr);
+            if ($dat) {
+                $$dataPt .= Set32u(0xffff00f6) . Set32u(length $dat) . $dat;
+                # update the new VRD length in the header/footer
+                Set32u(length($$dataPt), \$header, 0x18);
+                Set32u(length($$dataPt), \$footer, 0x14);
+            }
+        }
+        # write CanonVRD trailer unless it is empty
+        if (length $$dataPt) {
+            Write($outfile, $header, $$dataPt, $footer) or $err = 1;
+        } else {
+            $verbose and printf $out "  Deleting CanonVRD trailer\n";
+        }
+    }
+    undef $$dataPt;
+    return $err ? -1 : 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::CanonVRD - Read/write Canon VRD information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to read and
+write VRD Recipe Data information as written by the Canon Digital Photo
+Professional software.  This information is written to VRD files, and as a
+trailer in JPEG, CRW, CR2 and TIFF images.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Bogdan and Gert Kello for decoding some tags.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/CanonVRD Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/CaptureOne.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/CaptureOne.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/CaptureOne.pm	(revision 24799)
@@ -0,0 +1,231 @@
+#------------------------------------------------------------------------------
+# File:         CaptureOne.pm
+#
+# Description:  Read Capture One EIP and COS files
+#
+# Revisions:    2009/11/01 - P. Harvey Created
+#
+# Notes:        The EIP format is a ZIP file containing an image (IIQ or TIFF)
+#               and some settings files (COS).  COS files are XML based.
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::CaptureOne;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::XMP;
+use Image::ExifTool::ZIP;
+
+$VERSION = '1.02';
+
+# CaptureOne COS XML tags
+# - tags are added dynamically when encountered
+# - this table is not listed in tag name docs
+%Image::ExifTool::CaptureOne::Main = (
+    GROUPS => { 0 => 'XML', 1 => 'XML', 2 => 'Image' },
+    PROCESS_PROC => \&Image::ExifTool::XMP::ProcessXMP,
+    VARS => { NO_ID => 1 },
+    ColorCorrections => { ValueConv => '\$val' }, # (long list of floating point numbers)
+);
+
+#------------------------------------------------------------------------------
+# We found an XMP property name/value
+# Inputs: 0) attribute list ref, 1) attr hash ref,
+#         2) property name ref, 3) property value ref
+sub HandleCOSAttrs($$$$)
+{
+    my ($attrList, $attrs, $prop, $valPt) = @_;
+    if (not length $$valPt and defined $$attrs{K} and defined $$attrs{V}) {
+        $$prop = $$attrs{K};
+        $$valPt = $$attrs{V};
+        # remove these attributes from the list
+        my @attrs = @$attrList;
+        @$attrList = ( );
+        my $a;
+        foreach $a (@attrs) {
+            if ($a eq 'K' or $a eq 'V') {
+                delete $$attrs{$a};
+            } else {
+                push @$attrList, $a;
+            }
+        }
+    }
+}
+
+#------------------------------------------------------------------------------
+# We found a COS property name/value
+# Inputs: 0) ExifTool object ref, 1) tag table ref
+#         2) reference to array of XMP property names (last is current property)
+#         3) property value, 4) attribute hash ref (not used here)
+# Returns: 1 if valid tag was found
+sub FoundCOS($$$$;$)
+{
+    my ($exifTool, $tagTablePtr, $props, $val, $attrs) = @_;
+
+    my $tag = $$props[-1];
+    unless ($$tagTablePtr{$tag}) {
+        $exifTool->VPrint(0, "  | [adding $tag]\n");
+        my $name = ucfirst $tag;
+        $name =~ tr/-_a-zA-Z0-9//dc;
+        return 0 unless length $tag;
+        my %tagInfo = ( Name => $tag );
+        # try formatting any tag with "Date" in the name as a date
+        # (shouldn't affect non-date tags)
+        if ($name =~ /Date(?![a-z])/) {
+            $tagInfo{Groups} = { 2 => 'Time' };
+            $tagInfo{ValueConv} = 'Image::ExifTool::XMP::ConvertXMPDate($val,1)';
+            $tagInfo{PrintConv} = '$self->ConvertDateTime($val)';
+        }
+        Image::ExifTool::AddTagToTable($tagTablePtr, $tag, \%tagInfo);
+    }
+    # convert from UTF8 to ExifTool Charset
+    $val = $exifTool->Decode($val, "UTF8");
+    # un-escape XML character entities
+    $val = Image::ExifTool::XMP::UnescapeXML($val);
+    $exifTool->HandleTag($tagTablePtr, $tag, $val);
+    return 0;
+}
+
+#------------------------------------------------------------------------------
+# Extract information from a COS file
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 on success, 0 if this wasn't a valid XML file
+sub ProcessCOS($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+
+    # process using XMP module, but override handling of attributes and tags
+    $$dirInfo{XMPParseOpts} = {
+        AttrProc => \&HandleCOSAttrs,
+        FoundProc => \&FoundCOS,
+    };
+    my $tagTablePtr = GetTagTable('Image::ExifTool::CaptureOne::Main');
+    my $success = $exifTool->ProcessDirectory($dirInfo, $tagTablePtr);
+    delete $$dirInfo{XMLParseArgs};
+    return $success;
+}
+
+#------------------------------------------------------------------------------
+# Extract information from a CaptureOne EIP file
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1
+# Notes: Upon entry to this routine, the file type has already been verified
+# and the dirInfo hash contains a ZIP element unique to this process proc:
+#   ZIP     - reference to Archive::Zip object for this file
+sub ProcessEIP($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $zip = $$dirInfo{ZIP};
+    my ($file, $buff, $status, $member, %parseFile);
+
+    $exifTool->SetFileType('EIP');
+
+    # must catch all Archive::Zip warnings
+    local $SIG{'__WARN__'} = \&Image::ExifTool::ZIP::WarnProc;
+    # find all manifest files
+    my @members = $zip->membersMatching('^manifest\d*.xml$');
+    # and choose the one with the highest version number (any better ideas?)
+    while (@members) {
+        my $m = shift @members;
+        my $f = $m->fileName();
+        next if $file and $file gt $f;
+        $member = $m;
+        $file = $f;
+    }
+    # get file names from our chosen manifest file
+    if ($member) {
+        ($buff, $status) = $zip->contents($member);
+        if (not $status) {
+            my $foundImage;
+            while ($buff =~ m{<(RawPath|SettingsPath)>(.*?)</\1>}sg) {
+                $file = $2;
+                next unless $file =~ /\.(cos|iiq|jpe?g|tiff?)$/i;
+                $parseFile{$file} = 1;    # set flag to parse this file
+                $foundImage = 1 unless $file =~ /\.cos$/i;
+            }
+            # ignore manifest unless it contained a valid image
+            undef %parseFile unless $foundImage;
+        }
+    }
+    # extract meta information from embedded files
+    my $docNum = 0;
+    @members = $zip->members(); # get all members
+    foreach $member (@members) {
+        # get filename of this ZIP member
+        $file = $member->fileName();
+        next unless defined $file;
+        $exifTool->VPrint(0, "File: $file\n");
+        # set the document number and extract ZIP tags
+        $$exifTool{DOC_NUM} = ++$docNum;
+        Image::ExifTool::ZIP::HandleMember($exifTool, $member);
+        if (%parseFile) {
+            next unless $parseFile{$file};
+        } else {
+            # reading the manifest didn't work, so look for image files in the
+            # root directory and .cos files in the CaptureOne directory
+            next unless $file =~ m{^([^/]+\.(iiq|jpe?g|tiff?)|CaptureOne/.*\.cos)$}i;
+        }
+        # extract the contents of the file
+        # Note: this could use a LOT of memory here for RAW images...
+        ($buff, $status) = $zip->contents($member);
+        $status and $exifTool->Warn("Error extracting $file"), next;
+        if ($file =~ /\.cos$/i) {
+            # process Capture One Settings files
+            my %dirInfo = (
+                DataPt => \$buff,
+                DirLen => length $buff,
+                DataLen => length $buff,
+            );
+            ProcessCOS($exifTool, \%dirInfo);
+        } else {
+            # set HtmlDump error if necessary because it doesn't work with embedded files
+            if ($$exifTool{HTML_DUMP}) {
+                $$exifTool{HTML_DUMP}{Error} = "Sorry, can't dump images embedded in ZIP files";
+            }
+            # process IIQ, JPEG and TIFF images
+            $exifTool->ExtractInfo(\$buff, { ReEntry => 1 });
+        }
+        undef $buff;    # (free memory now)
+    }
+    delete $$exifTool{DOC_NUM};
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::CaptureOne - Read Capture One EIP and COS files
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to extract meta
+information from Capture One EIP (Enhanced Image Package) and COS (Capture
+One Settings) files.
+
+=head1 NOTES
+
+The EIP format is a ZIP file containing an image (IIQ or TIFF) and some
+settings files (COS).
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/ZIP Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Casio.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Casio.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Casio.pm	(revision 24799)
@@ -0,0 +1,1052 @@
+#------------------------------------------------------------------------------
+# File:         Casio.pm
+#
+# Description:  Casio EXIF maker notes tags
+#
+# Revisions:    12/09/2003 - P. Harvey Created
+#               09/10/2004 - P. Harvey Added MakerNote2 (thanks to Joachim Loehr)
+#
+# References:   1) http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html
+#               2) Joachim Loehr private communication
+#               3) http://homepage3.nifty.com/kamisaka/makernote/makernote_casio.htm
+#               4) http://www.gvsoft.homedns.org/exif/makernote-casio.html
+#               5) Robert Chi private communication (EX-F1)
+#               JD) Jens Duttke private communication
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Casio;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool::Exif;
+
+$VERSION = '1.32';
+
+# older Casio maker notes (ref 1)
+%Image::ExifTool::Casio::Main = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    WRITABLE => 1,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0x0001 => {
+        Name => 'RecordingMode' ,
+        Writable => 'int16u',
+        PrintConv => {
+            1 => 'Single Shutter',
+            2 => 'Panorama',
+            3 => 'Night Scene',
+            4 => 'Portrait',
+            5 => 'Landscape',
+            7 => 'Panorama', #4
+            10 => 'Night Scene', #4
+            15 => 'Portrait', #4
+            16 => 'Landscape', #4
+        },
+    },
+    0x0002 => {
+        Name => 'Quality',
+        Writable => 'int16u',
+        PrintConv => { 1 => 'Economy', 2 => 'Normal', 3 => 'Fine' },
+    },
+    0x0003 => {
+        Name => 'FocusMode',
+        Writable => 'int16u',
+        PrintConv => {
+            2 => 'Macro',
+            3 => 'Auto',
+            4 => 'Manual',
+            5 => 'Infinity',
+            7 => 'Spot AF', #4
+        },
+    },
+    0x0004 => [
+        {
+            Name => 'FlashMode',
+            Condition => '$self->{Model} =~ /^QV-(3500EX|8000SX)/',
+            Writable => 'int16u',
+            PrintConv => {
+                1 => 'Auto',
+                2 => 'On',
+                3 => 'Off',
+                4 => 'Off', #4
+                5 => 'Red-eye Reduction', #4
+            },
+        },
+        {
+            Name => 'FlashMode',
+            Writable => 'int16u',
+            PrintConv => {
+                1 => 'Auto',
+                2 => 'On',
+                3 => 'Off',
+                4 => 'Red-eye Reduction',
+            },
+        },
+    ],
+    0x0005 => {
+        Name => 'FlashIntensity',
+        Writable => 'int16u',
+        PrintConv => {
+            11 => 'Weak',
+            12 => 'Low', #4
+            13 => 'Normal',
+            14 => 'High', #4
+            15 => 'Strong',
+        },
+    },
+    0x0006 => {
+        Name => 'ObjectDistance',
+        Writable => 'int32u',
+        ValueConv => '$val / 1000', #4
+        ValueConvInv => '$val * 1000',
+        PrintConv => '"$val m"',
+        PrintConvInv => '$val=~s/\s*m$//;$val',
+    },
+    0x0007 => {
+        Name => 'WhiteBalance',
+        Writable => 'int16u',
+        PrintConv => {
+            1 => 'Auto',
+            2 => 'Tungsten',
+            3 => 'Daylight',
+            4 => 'Fluorescent',
+            5 => 'Shade',
+            129 => 'Manual',
+        },
+    },
+    # 0x0009 Bulb? (ref unknown)
+    0x000a => {
+        Name => 'DigitalZoom',
+        Writable => 'int32u',
+        PrintHex => 1,
+        PrintConv => {
+            0x10000 => 'Off',
+            0x10001 => '2x',
+            0x19999 => '1.6x', #4
+            0x20000 => '2x', #4
+            0x33333 => '3.2x', #4
+            0x40000 => '4x', #4
+        },
+    },
+    0x000b => {
+        Name => 'Sharpness',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Normal',
+            1 => 'Soft',
+            2 => 'Hard',
+            16 => 'Normal', #4
+            17 => '+1', #4
+            18 => '-1', #4
+         },
+    },
+    0x000c => {
+        Name => 'Contrast',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Normal',
+            1 => 'Low',
+            2 => 'High',
+            16 => 'Normal', #4
+            17 => '+1', #4
+            18 => '-1', #4
+        },
+    },
+    0x000d => {
+        Name => 'Saturation',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Normal',
+            1 => 'Low',
+            2 => 'High',
+            16 => 'Normal', #4
+            17 => '+1', #4
+            18 => '-1', #4
+        },
+    },
+    0x0014 => {
+        Name => 'ISO',
+        Writable => 'int16u',
+        Priority => 0,
+    },
+    0x0015 => { #JD (Similar to Type2 0x2001)
+        Name => 'FirmwareDate',
+        Writable => 'string',
+        Format => 'undef', # the 'string' contains nulls
+        Count => 18,
+        PrintConv => q{
+            $_ = $val;
+            if (/^(\d{2})(\d{2})\0\0(\d{2})(\d{2})\0\0(\d{2})(.{2})\0{2}$/) {
+                my $yr = $1 + ($1 < 70 ? 2000 : 1900);
+                my $sec = $6;
+                $val = "$yr:$2:$3 $4:$5";
+                $val .= ":$sec" if $sec=~/^\d{2}$/;
+                return $val;
+            }
+            tr/\0/./;  s/\.+$//;
+            return "Unknown ($_)";
+        },
+        PrintConvInv => q{
+            $_ = $val;
+            if (/^(19|20)(\d{2}):(\d{2}):(\d{2}) (\d{2}):(\d{2})$/) {
+                return "$2$3\0\0$4$5\0\0$6\0\0\0\0";
+            } elsif (/^Unknown\s*\((.*)\)$/i) {
+                $_ = $1;  tr/./\0/;
+                return $_;
+            } else {
+                return undef;
+            }
+        },
+    },
+    0x0016 => { #4
+        Name => 'Enhancement',
+        Writable => 'int16u',
+        PrintConv => {
+            1 => 'Off',
+            2 => 'Red',
+            3 => 'Green',
+            4 => 'Blue',
+            5 => 'Flesh Tones',
+        },
+    },
+    0x0017 => { #4
+        Name => 'ColorFilter',
+        Writable => 'int16u',
+        PrintConv => {
+            1 => 'Off',
+            2 => 'Black & White',
+            3 => 'Sepia',
+            4 => 'Red',
+            5 => 'Green',
+            6 => 'Blue',
+            7 => 'Yellow',
+            8 => 'Pink',
+            9 => 'Purple',
+        },
+    },
+    0x0018 => { #4
+        Name => 'AFPoint',
+        Writable => 'int16u',
+        Notes => 'may not be valid for all models', #JD
+        PrintConv => {
+            1 => 'Center',
+            2 => 'Upper Left',
+            3 => 'Upper Right',
+            4 => 'Near Left/Right of Center',
+            5 => 'Far Left/Right of Center',
+            6 => 'Far Left/Right of Center/Bottom',
+            7 => 'Top Near-Left',
+            8 => 'Near Upper/Left',
+            9 => 'Top Near-Right',
+            10 => 'Top Left',
+            11 => 'Top Center',
+            12 => 'Top Right',
+            13 => 'Center Left',
+            14 => 'Center Right',
+            15 => 'Bottom Left',
+            16 => 'Bottom Center',
+            17 => 'Bottom Right',
+        },
+    },
+    0x0019 => { #4
+        Name => 'FlashIntensity',
+        Writable => 'int16u',
+        PrintConv => {
+            1 => 'Normal',
+            2 => 'Weak',
+            3 => 'Strong',
+        },
+    },
+    0x0e00 => {
+        Name => 'PrintIM',
+        Description => 'Print Image Matching',
+        # crazy I know, but the offset for this value is entry-based
+        # (QV-2100, QV-2900UX, QV-3500EX and QV-4000) even though the
+        # offsets for other values isn't
+        EntryBased => 1,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::PrintIM::Main',
+        },
+    },
+);
+
+# ref 2:
+%Image::ExifTool::Casio::Type2 = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    WRITABLE => 1,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0x0002 => {
+        Name => 'PreviewImageSize',
+        Groups => { 2 => 'Image' },
+        Writable => 'int16u',
+        Count => 2,
+        PrintConv => '$val =~ tr/ /x/; $val',
+        PrintConvInv => '$val =~ tr/x/ /; $val',
+    },
+    0x0003 => {
+        Name => 'PreviewImageLength',
+        Groups => { 2 => 'Image' },
+        OffsetPair => 0x0004, # point to associated offset
+        DataTag => 'PreviewImage',
+        Writable => 'int32u',
+        Protected => 2,
+    },
+    0x0004 => {
+        Name => 'PreviewImageStart',
+        Groups => { 2 => 'Image' },
+        Flags => 'IsOffset',
+        OffsetPair => 0x0003, # point to associated byte count
+        DataTag => 'PreviewImage',
+        Writable => 'int32u',
+        Protected => 2,
+    },
+    0x0008 => {
+        Name => 'QualityMode',
+        Writable => 'int16u',
+        PrintConv => {
+           0 => 'Economy',
+           1 => 'Normal',
+           2 => 'Fine',
+        },
+    },
+    0x0009 => {
+        Name => 'CasioImageSize',
+        Groups => { 2 => 'Image' },
+        Writable => 'int16u',
+        PrintConv => {
+            0 => '640x480',
+            4 => '1600x1200',
+            5 => '2048x1536',
+            20 => '2288x1712',
+            21 => '2592x1944',
+            22 => '2304x1728',
+            36 => '3008x2008',
+        },
+    },
+    0x000d => {
+        Name => 'FocusMode',
+        Writable => 'int16u',
+        PrintConv => {
+           0 => 'Normal',
+           1 => 'Macro',
+        },
+    },
+    0x0014 => {
+        Name => 'ISO',
+        Writable => 'int16u',
+        Priority => 0,
+        PrintConv => {
+           3 => 50,
+           4 => 64,
+           6 => 100,
+           9 => 200,
+        },
+    },
+    0x0019 => {
+        Name => 'WhiteBalance',
+        Writable => 'int16u',
+        PrintConv => {
+           0 => 'Auto',
+           1 => 'Daylight',
+           2 => 'Shade',
+           3 => 'Tungsten',
+           4 => 'Fluorescent',
+           5 => 'Manual',
+        },
+    },
+    0x001d => {
+        Name => 'FocalLength',
+        Writable => 'rational64u',
+        PrintConv => 'sprintf("%.1f mm",$val)',
+        PrintConvInv => '$val=~s/\s*mm$//;$val',
+    },
+    0x001f => {
+        Name => 'Saturation',
+        Writable => 'int16u',
+        PrintConv => {
+           0 => 'Low',
+           1 => 'Normal',
+           2 => 'High',
+        },
+    },
+    0x0020 => {
+        Name => 'Contrast',
+        Writable => 'int16u',
+        PrintConv => {
+           0 => 'Low',
+           1 => 'Normal',
+           2 => 'High',
+        },
+    },
+    0x0021 => {
+        Name => 'Sharpness',
+        Writable => 'int16u',
+        PrintConv => {
+           0 => 'Soft',
+           1 => 'Normal',
+           2 => 'Hard',
+        },
+    },
+    0x0e00 => {
+        Name => 'PrintIM',
+        Description => 'Print Image Matching',
+        Writable => 0,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::PrintIM::Main',
+        },
+    },
+    0x2000 => {
+        # this image data is also referenced by tags 3 and 4
+        # (nasty that they double-reference the image!)
+        %Image::ExifTool::previewImageTagInfo,
+    },
+    0x2001 => { #PH
+        # I downloaded images from 12 different EX-Z50 cameras, and they showed
+        # only 3 distinct dates here (2004:08:31 18:55, 2004:09:13 14:14, and
+        # 2004:11:26 17:07), so I'm guessing this is a firmware version date - PH
+        Name => 'FirmwareDate',
+        Writable => 'string',
+        Format => 'undef', # the 'string' contains nulls
+        Count => 18,
+        PrintConv => q{
+            $_ = $val;
+            if (/^(\d{2})(\d{2})\0\0(\d{2})(\d{2})\0\0(\d{2})\0{4}$/) {
+                my $yr = $1 + ($1 < 70 ? 2000 : 1900);
+                return "$yr:$2:$3 $4:$5";
+            }
+            tr/\0/./;  s/\.+$//;
+            return "Unknown ($_)";
+        },
+        PrintConvInv => q{
+            $_ = $val;
+            if (/^(19|20)(\d{2}):(\d{2}):(\d{2}) (\d{2}):(\d{2})$/) {
+                return "$2$3\0\0$4$5\0\0$6\0\0\0\0";
+            } elsif (/^Unknown\s*\((.*)\)$/i) {
+                $_ = $1;  tr/./\0/;
+                return $_;
+            } else {
+                return undef;
+            }
+        },
+    },
+    0x2011 => {
+        Name => 'WhiteBalanceBias',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x2012 => {
+        Name => 'WhiteBalance',
+        Writable => 'int16u',
+        PrintConv => {
+           0 => 'Manual',
+           1 => 'Daylight', #3
+           3 => 'Shade', #3
+           4 => 'Flash?',
+           6 => 'Fluorescent', #3
+           9 => 'Tungsten?', #PH (EX-Z77)
+           10 => 'Tungsten', #3
+           12 => 'Flash',
+        },
+    },
+    0x2021 => { #JD (guess)
+        Name => 'AFPointPosition',
+        Writable => 'int16u',
+        Count => 4,
+        PrintConv => q{
+            my @v = split ' ', $val;
+            return 'n/a' if $v[0] == 65535 or not $v[1] or not $v[3];
+            sprintf "%.2g %.2g", $v[0]/$v[1], $v[2]/$v[3];
+        },
+    },
+    0x2022 => {
+        Name => 'ObjectDistance',
+        Writable => 'int32u',
+        ValueConv => '$val >= 0x20000000 ? "inf" : $val / 1000',
+        ValueConvInv => '$val eq "inf" ? 0x20000000 : $val * 1000',
+        PrintConv => '$val eq "inf" ? $val : "$val m"',
+        PrintConvInv => '$val=~s/\s*m$//;$val',
+    },
+    # 0x2023 looks interesting (values 0,1,2,3,5 in samples) - PH
+    #        - 1 for makeup mode shots (portrait?) (EX-Z450)
+    0x2034 => {
+        Name => 'FlashDistance',
+        Writable => 'int16u',
+    },
+    # 0x203e - normally 62000, but 62001 for anti-shake mode - PH
+    0x2076 => { #PH (EX-Z450)
+        # ("Enhancement" was taken already, so call this "SpecialEffect" for lack of a better name)
+        Name => 'SpecialEffectMode',
+        Writable => 'int8u',
+        Count => 3,
+        PrintConv => {
+            '0 0 0' => 'Off',
+            '1 0 0' => 'Makeup',
+            '2 0 0' => 'Mist Removal',
+            '3 0 0' => 'Vivid Landscape',
+            # have also seen '1 1 1', '2 2 4', '4 3 3', '4 4 4'
+            # '0 0 14' and '0 0 42' - premium auto night shot (EX-Z2300)
+        },
+    },
+    0x2089 => [ #PH
+        {
+            Name => 'FaceInfo1',
+            Condition => '$$valPt =~ /^(\0\0|.\x02\x80\x01\xe0)/s', # (EX-H5)
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Casio::FaceInfo1',
+                ByteOrder => 'BigEndian',
+            },
+        },{
+            Name => 'FaceInfo2',
+            Condition => '$$valPt =~ /^\x02\x01/', # (EX-H20G,EX-ZR100)
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Casio::FaceInfo2',
+                ByteOrder => 'LittleEndian',
+            },
+        },{
+            Name => 'FaceInfoUnknown',
+            Unknown => 1,
+        },
+    ],
+    # 0x208a - also some sort of face detection information - PH
+    0x211c => { #PH
+        Name => 'FacesDetected',
+        Format => 'int8u',
+    },
+    0x3000 => {
+        Name => 'RecordMode',
+        Writable => 'int16u',
+        PrintConv => {
+            2 => 'Program AE', #3
+            3 => 'Shutter Priority', #3
+            4 => 'Aperture Priority', #3
+            5 => 'Manual', #3
+            6 => 'Best Shot', #3
+            17 => 'Movie', #PH (UHQ?)
+            19 => 'Movie (19)', #PH (HQ?, EX-P505)
+            20 => 'YouTube Movie', #PH
+            '2 0' => 'Program AE', #PH (NC)
+            '3 0' => 'Shutter Priority', #PH (NC)
+            '4 0' => 'Aperture Priority', #PH (NC)
+            '5 0' => 'Manual', #PH (NC)
+            '6 0' => 'Best Shot', #PH (NC)
+        },
+    },
+    0x3001 => { #3
+        Name => 'ReleaseMode',
+        Writable => 'int16u',
+        PrintConv => {
+            1 => 'Normal',
+            3 => 'AE Bracketing',
+            11 => 'WB Bracketing',
+            13 => 'Contrast Bracketing', #(not sure about translation - PH)
+            19 => 'High Speed Burst', #PH (EX-FH25, 40fps)
+            # have also seen: 2, 7(common), 14, 18 - PH
+        },
+    },
+    0x3002 => {
+        Name => 'Quality',
+        Writable => 'int16u',
+        PrintConv => {
+           1 => 'Economy',
+           2 => 'Normal',
+           3 => 'Fine',
+        },
+    },
+    0x3003 => {
+        Name => 'FocusMode',
+        Writable => 'int16u',
+        PrintConv => {
+           0 => 'Manual', #(guess at translation)
+           1 => 'Focus Lock', #(guess at translation)
+           2 => 'Macro', #3
+           3 => 'Single-Area Auto Focus',
+           5 => 'Infinity', #PH
+           6 => 'Multi-Area Auto Focus',
+           8 => 'Super Macro', #PH (EX-Z2300)
+        },
+    },
+    0x3006 => {
+        Name => 'HometownCity',
+        Writable => 'string',
+    },
+    0x3007 => {
+        Name => 'BestShotMode',
+        Writable => 'int16u',
+        # unfortunately these numbers are model-dependent,
+        # so we can't use a lookup as usual - PH
+        PrintConv => '$val ? $val : "Off"',
+        PrintConvInv => '$val=~/(\d+)/ ? $1 : 0',
+    },
+    0x3008 => { #3
+        Name => 'AutoISO',
+        Writable => 'int16u',
+        PrintConv => {
+            1 => 'On',
+            2 => 'Off',
+            7 => 'On (high sensitivity)', #PH
+            8 => 'On (anti-shake)', #PH
+            10 => 'High Speed', #PH (EX-FC150)
+        },
+    },
+    0x3009 => { #PH (EX-Z77)
+        Name => 'AFMode',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'On',
+            # have seen 2(EX-Z35 macro/portrait), 3(portrait) and 5(auto mode)
+            4 => 'Face Recognition', # "Family First"
+        },
+    },
+    0x3011 => { #3
+        Name => 'Sharpness',
+        Format => 'int16s',
+        Writable => 'undef',
+    },
+    0x3012 => { #3
+        Name => 'Contrast',
+        Format => 'int16s',
+        Writable => 'undef',
+    },
+    0x3013 => { #3
+        Name => 'Saturation',
+        Format => 'int16s',
+        Writable => 'undef',
+    },
+    0x3014 => {
+        Name => 'ISO',
+        Writable => 'int16u',
+        Priority => 0,
+    },
+    0x3015 => {
+        Name => 'ColorMode',
+        Writable => 'int16u',
+        PrintConv => {  
+            0 => 'Off',
+            2 => 'Black & White', #PH (EX-Z400,FH20)
+            3 => 'Sepia', #PH (EX-Z400)
+        },
+    },
+    0x3016 => {
+        Name => 'Enhancement',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Scenery', #PH (NC) (EX-Z77)
+            3 => 'Green', #PH (EX-Z77)
+            5 => 'Underwater', #PH (NC) (EX-Z77)
+            9 => 'Flesh Tones', #PH (EX-Z77)
+        },
+    },
+    0x3017 => {
+        Name => 'ColorFilter',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Blue', #PH (FH20,Z400)
+            3 => 'Green', #PH (FH20)
+            4 => 'Yellow', #PH (FH20)
+            5 => 'Red', #PH (FH20,Z77)
+            6 => 'Purple', #PH (FH20,Z77,Z400)
+            7 => 'Pink', #PH (FH20)
+        },
+    },
+    0x301b => { #PH
+        Name => 'UnknownMode',
+        Writable => 'int16u',
+        Unknown => 1,
+        PrintConv => {
+            0 => 'Normal',
+            8 => 'Silent Movie',
+            39 => 'HDR', # (EX-ZR10)
+            45 => 'Premium Auto', # (EX-2300)
+            47 => 'Painting', # (EX-2300)
+            49 => 'Crayon Drawing', # (EX-2300)
+            51 => 'Panorama', # (EX-ZR10)
+            52 => 'Art HDR', # (EX-ZR10)
+        },
+    },
+    0x301c => { #3
+        Name => 'SequenceNumber', # for continuous shooting
+        Writable => 'int16u',
+    },
+    0x301d => { #3
+        Name => 'BracketSequence',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    # 0x301e - MultiBracket ? (ref 3)
+    0x3020 => { #3
+        Name => 'ImageStabilization',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'On',
+            2 => 'Best Shot',
+            # 3 observed in MOV videos (EX-V7)
+            # (newer models write 2 numbers here - PH)
+            '0 0' => 'Off', #PH
+            # have seen '0 1' for EX-Z2000 which has 5 modes: Auto, Camera AS, Image AS, DEMO, Off
+            '16 0' => 'Slow Shutter', #PH (EX-Z77)
+            '18 0' => 'Anti-Shake', #PH (EX-Z77)
+            '20 0' => 'High Sensitivity', #PH (EX-Z77)
+            '0 3' => 'CCD Shift', #PH (guess)
+            '2 3' => 'High Speed Anti-Shake', #PH (EX-FC150)
+        },
+    },
+    0x302a => { #PH (EX-Z450)
+        Name => 'LightingMode', #(just guessing here)
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'High Dynamic Range', # (EX-Z77 anti-blur shot)
+            5 => 'Shadow Enhance Low', #(NC)
+            6 => 'Shadow Enhance High', #(NC)
+        },
+    },
+    0x302b => { #PH (EX-Z77)
+        Name => 'PortraitRefiner',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            1 => '+1',
+            2 => '+2',
+        },
+    },
+    0x3030 => { #PH (EX-Z450)
+        Name => 'SpecialEffectLevel',
+        Writable => 'int16u',
+    },
+    0x3031 => { #PH (EX-Z450)
+        Name => 'SpecialEffectSetting',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Makeup',
+            2 => 'Mist Removal',
+            3 => 'Vivid Landscape',
+            16 => 'Art Shot', # (EX-Z2300)
+        },
+    },
+    0x3103 => { #5
+        Name => 'DriveMode',
+        Writable => 'int16u',
+        PrintConvColumns => 2,
+        PrintConv => {
+            OTHER => sub {
+                # handle new values of future models
+                my ($val, $inv) = @_;
+                return $val =~ /(\d+)/ ? $1 : undef if $inv;
+                return "Continuous ($val fps)";
+            },
+            0 => 'Single Shot', #PH (NC)
+            1 => 'Continuous Shooting', # (1 fps for the EX-F1)
+            2 => 'Continuous (2 fps)',
+            3 => 'Continuous (3 fps)',
+            4 => 'Continuous (4 fps)',
+            5 => 'Continuous (5 fps)',
+            6 => 'Continuous (6 fps)',
+            7 => 'Continuous (7 fps)',
+            10 => 'Continuous (10 fps)',
+            12 => 'Continuous (12 fps)',
+            15 => 'Continuous (15 fps)',
+            20 => 'Continuous (20 fps)',
+            30 => 'Continuous (30 fps)',
+            40 => 'Continuous (40 fps)', #PH (EX-FH25)
+            60 => 'Continuous (60 fps)',
+            240 => 'Auto-N',
+        },
+    },
+    0x4001 => { #PH (AVI videos)
+        Name => 'CaptureFrameRate',
+        Writable => 'int16u',
+        Count => -1,
+        ValueConv => q{
+            my @v=split(" ",$val);
+            return $val / 1000 if @v == 1;
+            return $v[1] ? "$v[1]-$v[0]" : ($v[0] > 10000 ? $v[0] / 1000 : $v[0]);
+        },
+        ValueConvInv => '$val <= 60 ? $val * 1000 : int($val) . " 0"',
+    },
+    # 0x4002 - AVI videos, related to video quality or size - PH
+    0x4003 => { #PH (AVI and MOV videos)
+        Name => 'VideoQuality',
+        Writable => 'int16u',
+        PrintConv => {
+            1 => 'Standard',
+            # 2 - could this be LP?
+            3 => 'HD (720p)',
+            4 => 'Full HD (1080p)', # (EX-ZR10, 30fps 1920x1080)
+            5 => 'Low', # used in High Speed modes
+        },
+    },
+);
+
+# face detection information (ref PH) (EX-H5)
+%Image::ExifTool::Casio::FaceInfo1 = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    DATAMEMBER => [ 0 ],
+    NOTES => 'Face-detect tags extracted from models such as the EX-H5.',
+    0x00 => { # (NC)
+        Name => 'FacesDetected',
+        DataMember => 'FacesDetected',
+        RawConv => '$$self{FacesDetected} = $val',
+    },
+    0x01 => {
+        Name => 'FaceDetectFrameSize',
+        Condition => '$$self{FacesDetected} >= 1', # (otherwise zeros)
+        Format => 'int16u[2]',
+    },
+    0x0d => {
+        Name => 'Face1Position',
+        Condition => '$$self{FacesDetected} >= 1',
+        Format => 'int16u[4]',
+        Notes => q{
+            left, top, right and bottom of detected face in coordinates of
+            FaceDetectFrameSize, with increasing Y downwards
+        },
+    },
+    # decoding NOT CONFIRMED (NC) for faces 2-10!
+    0x7c => {
+        Name => 'Face2Position',
+        Condition => '$$self{FacesDetected} >= 2',
+        Format => 'int16u[4]',
+    },
+    0xeb => {
+        Name => 'Face3Position',
+        Condition => '$$self{FacesDetected} >= 3',
+        Format => 'int16u[4]',
+    },
+    0x15a => {
+        Name => 'Face4Position',
+        Condition => '$$self{FacesDetected} >= 4',
+        Format => 'int16u[4]',
+    },
+    0x1c9 => {
+        Name => 'Face5Position',
+        Condition => '$$self{FacesDetected} >= 5',
+        Format => 'int16u[4]',
+    },
+    0x238 => {
+        Name => 'Face6Position',
+        Condition => '$$self{FacesDetected} >= 6',
+        Format => 'int16u[4]',
+    },
+    0x2a7 => {
+        Name => 'Face7Position',
+        Condition => '$$self{FacesDetected} >= 7',
+        Format => 'int16u[4]',
+    },
+    0x316 => {
+        Name => 'Face8Position',
+        Condition => '$$self{FacesDetected} >= 8',
+        Format => 'int16u[4]',
+    },
+    0x385 => {
+        Name => 'Face9Position',
+        Condition => '$$self{FacesDetected} >= 9',
+        Format => 'int16u[4]',
+    },
+    0x3f4 => {
+        Name => 'Face10Position',
+        Condition => '$$self{FacesDetected} >= 10',
+        Format => 'int16u[4]',
+    },
+);
+
+# face detection information (ref PH) (EX-ZR100)
+%Image::ExifTool::Casio::FaceInfo2 = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    DATAMEMBER => [ 2 ],
+    NOTES => 'Face-detect tags extracted from models such as the EX-H20G and EX-ZR100.',
+    0x02 => {
+        Name => 'FacesDetected',
+        DataMember => 'FacesDetected',
+        RawConv => '$$self{FacesDetected} = $val',
+    },
+    0x04 => {
+        Name => 'FaceDetectFrameSize',
+        Condition => '$$self{FacesDetected} >= 1',
+        Format => 'int16u[2]',
+    },
+    0x08 => {
+        Name => 'FaceOrientation',
+        Condition => '$$self{FacesDetected} >= 1',
+        PrintConv => {
+            0 => 'Horizontal (normal)',
+            1 => 'Rotate 90 CW',
+            2 => 'Rotate 270 CW',
+            3 => 'Rotate 180', # (NC)
+        },
+        Notes => 'orientation of face relative to unrotated image',
+    },
+    # 0x0a - FaceDetectFrameSize again
+    # 0x11 - Face1Detected flag (1=detected)
+    0x18 => {
+        Name => 'Face1Position',
+        Condition => '$$self{FacesDetected} >= 1',
+        Format => 'int16u[4]',
+        Notes => q{
+            left, top, right and bottom of detected face in coordinates of
+            FaceDetectFrameSize, with increasing Y downwards
+        },
+    },
+    # 0x45 - Face2Detected, etc...
+    0x4c => {
+        Name => 'Face2Position',
+        Condition => '$$self{FacesDetected} >= 2',
+        Format => 'int16u[4]',
+    },
+    0x80 => {
+        Name => 'Face3Position',
+        Condition => '$$self{FacesDetected} >= 3',
+        Format => 'int16u[4]',
+    },
+    0xb4 => {
+        Name => 'Face4Position',
+        Condition => '$$self{FacesDetected} >= 4',
+        Format => 'int16u[4]',
+    },
+    0xe8 => {
+        Name => 'Face5Position',
+        Condition => '$$self{FacesDetected} >= 5',
+        Format => 'int16u[4]',
+    },
+    0x11c => {
+        Name => 'Face6Position',
+        Condition => '$$self{FacesDetected} >= 6',
+        Format => 'int16u[4]',
+    },
+    0x150 => {
+        Name => 'Face7Position',
+        Condition => '$$self{FacesDetected} >= 7',
+        Format => 'int16u[4]',
+    },
+    0x184 => {
+        Name => 'Face8Position',
+        Condition => '$$self{FacesDetected} >= 8',
+        Format => 'int16u[4]',
+    },
+    0x1b8 => {
+        Name => 'Face9Position',
+        Condition => '$$self{FacesDetected} >= 9',
+        Format => 'int16u[4]',
+    },
+    0x1ec => {
+        Name => 'Face10Position',
+        Condition => '$$self{FacesDetected} >= 10',
+        Format => 'int16u[4]',
+    },
+);
+
+# Casio APP1 QVCI segment found in QV-7000SX images (ref PH)
+%Image::ExifTool::Casio::QVCI = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    FIRST_ENTRY => 0,
+    NOTES => q{
+        This information is found in the APP1 QVCI segment of JPEG images from the
+        Casio QV-7000SX.
+    },
+    0x2c => {
+        Name => 'CasioQuality',
+        PrintConv => {
+            1 => 'Economy',
+            2 => 'Normal',
+            3 => 'Fine',
+            4 => 'Super Fine',
+        },
+    },
+    0x37 => {
+        Name => 'FocalRange',
+        Unknown => 1,
+    },
+    0x4d => {
+        Name => 'DateTimeOriginal',
+        Description => 'Date/Time Original',
+        Format => 'string[20]',
+        Groups => { 2 => 'Time' },
+        ValueConv => '$val=~tr/./:/; $val=~s/(\d+:\d+:\d+):/$1 /; $val',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    0x62 => {
+        Name => 'ModelType',
+        Format => 'string[7]',
+    },
+    0x72 => { # could be serial number or manufacture date in form YYMMDDxx ?
+        Name => 'ManufactureIndex',
+        Format => 'string[9]',
+    },
+    0x7c => {
+        Name => 'ManufactureCode',
+        Format => 'string[9]',
+    },
+);
+
+# tags in Casio AVI videos (ref PH)
+%Image::ExifTool::Casio::AVI = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    FIRST_ENTRY => 0,
+    NOTES => 'This information is found in Casio GV-10 AVI videos.',
+    0 => {
+        Name => 'Software', # (equivalent to RIFF Software tag)
+        Format => 'string',
+    },
+);
+
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Casio - Casio EXIF maker notes tags
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to interpret
+Casio maker notes in EXIF information.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html>
+
+=back
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Joachim Loehr for adding support for the type 2 maker notes, and
+Jens Duttke and Robert Chi for decoding some tags.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/Casio Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset.pm	(revision 24799)
@@ -0,0 +1,396 @@
+#------------------------------------------------------------------------------
+# File:         Charset.pm
+#
+# Description:  ExifTool character encoding routines
+#
+# Revisions:    2009/08/28 - P. Harvey created
+#               2010/01/20 - P. Harvey complete re-write
+#               2010/07/16 - P. Harvey added UTF-16 support
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Charset;
+
+use strict;
+use vars qw($VERSION %csType);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.07';
+
+my %charsetTable;   # character set tables we've loaded
+
+# lookup for converting Unicode to 1-byte character sets
+my %unicode2byte = (
+  Latin => {    # pre-load Latin (cp1252) for speed
+    0x20ac => 0x80,  0x0160 => 0x8a,  0x2013 => 0x96,
+    0x201a => 0x82,  0x2039 => 0x8b,  0x2014 => 0x97,
+    0x0192 => 0x83,  0x0152 => 0x8c,  0x02dc => 0x98,
+    0x201e => 0x84,  0x017d => 0x8e,  0x2122 => 0x99,
+    0x2026 => 0x85,  0x2018 => 0x91,  0x0161 => 0x9a,
+    0x2020 => 0x86,  0x2019 => 0x92,  0x203a => 0x9b,
+    0x2021 => 0x87,  0x201c => 0x93,  0x0153 => 0x9c,
+    0x02c6 => 0x88,  0x201d => 0x94,  0x017e => 0x9e,
+    0x2030 => 0x89,  0x2022 => 0x95,  0x0178 => 0x9f,
+  },
+);
+
+# bit flags for all supported character sets
+# (this number must be correct because it dictates the decoding algorithm!)
+#   0x001 = character set requires a translation module
+#   0x002 = inverse conversion not yet supported by Recompose()
+#   0x080 = some characters with codepoints in the range 0x00-0x7f are remapped
+#   0x100 = 1-byte fixed-width characters
+#   0x200 = 2-byte fixed-width characters
+#   0x400 = 4-byte fixed-width characters
+#   0x800 = 1- and 2-byte variable-width characters, or 1-byte
+#           fixed-width characters that map into multiple codepoints
+# Note: In its public interface, ExifTool can currently only support type 0x101
+#       and lower character sets because strings are only converted if they
+#       contain characters above 0x7f and there is no provision for specifying
+#       the byte order for input/output values
+%csType = (
+    UTF8         => 0x100,
+    ASCII        => 0x100, # (treated like UTF8)
+    Arabic       => 0x101,
+    Baltic       => 0x101,
+    Cyrillic     => 0x101,
+    Greek        => 0x101,
+    Hebrew       => 0x101,
+    Latin        => 0x101,
+    Latin2       => 0x101,
+    MacCroatian  => 0x101,
+    MacCyrillic  => 0x101,
+    MacGreek     => 0x101,
+    MacIceland   => 0x101,
+    MacLatin2    => 0x101,
+    MacRoman     => 0x101,
+    MacRomanian  => 0x101,
+    MacTurkish   => 0x101,
+    Thai         => 0x101,
+    Turkish      => 0x101,
+    Vietnam      => 0x101,
+    MacArabic    => 0x103, # (directional characters not supported)
+    PDFDoc       => 0x181,
+    Unicode      => 0x200, # (UCS2)
+    UCS2         => 0x200,
+    UTF16        => 0x200,
+    Symbol       => 0x201,
+    JIS          => 0x201,
+    UCS4         => 0x400,
+    MacChineseCN => 0x803,
+    MacChineseTW => 0x803,
+    MacHebrew    => 0x803, # (directional characters not supported)
+    MacKorean    => 0x803,
+    MacRSymbol   => 0x803,
+    MacThai      => 0x803,
+    MacJapanese  => 0x883,
+    ShiftJIS     => 0x883,
+);
+
+#------------------------------------------------------------------------------
+# Load character set module
+# Inputs: 0) Module name
+# Returns: Reference to lookup hash, or undef on error
+sub LoadCharset($)
+{
+    my $charset = shift;
+    my $conv = $charsetTable{$charset};
+    unless ($conv) {
+        # load translation module
+        my $module = "Image::ExifTool::Charset::$charset";
+        no strict 'refs';
+        if (%$module or eval "require $module") {
+            $conv = $charsetTable{$charset} = \%$module;
+        }
+    }
+    return $conv;
+}
+
+#------------------------------------------------------------------------------
+# Decompose string with specified encoding into an array of integer code points
+# Inputs: 0) ExifTool object ref (or undef), 1) string, 2) character set name,
+#         3) optional byte order ('II','MM','Unknown' or undef to use ExifTool ordering)
+# Returns: Reference to array of Unicode values
+# Notes: Accepts any type of character set
+# - byte order only used for fixed-width 2-byte and 4-byte character sets
+# - byte order mark observed and then removed with UCS2 and UCS4
+# - no warnings are issued if ExifTool object is not provided
+sub Decompose($$$;$)
+{
+    local $_;
+    my ($exifTool, $val, $charset) = @_; # ($byteOrder assigned later if required)
+    my $type = $csType{$charset};
+    my (@uni, $conv);
+
+    if ($type & 0x001) {
+        $conv = LoadCharset($charset);
+        unless ($conv) {
+            # (shouldn't happen)
+            $exifTool->Warn("Invalid character set $charset") if $exifTool;
+            return \@uni;   # error!
+        }
+    } elsif ($type == 0x100) {
+        # convert ASCII and UTF8 (treat ASCII as UTF8)
+        if ($] < 5.006001) {
+            # do it ourself
+            @uni = Image::ExifTool::UnpackUTF8($val);
+        } else {
+            # handle warnings from malformed UTF-8
+            undef $Image::ExifTool::evalWarning;
+            local $SIG{'__WARN__'} = \&Image::ExifTool::SetWarning;
+            # (somehow the meaning of "U0" was reversed in Perl 5.10.0!)
+            @uni = unpack($] < 5.010000 ? 'U0U*' : 'C0U*', $val);
+            # issue warning if we had errors
+            if ($Image::ExifTool::evalWarning and $exifTool and not $$exifTool{WarnBadUTF8}) {
+                $exifTool->Warn('Malformed UTF-8 character(s)');
+                $$exifTool{WarnBadUTF8} = 1;
+            }
+        }
+        return \@uni;       # all done!
+    }
+    if ($type & 0x100) {        # 1-byte fixed-width characters
+        @uni = unpack('C*', $val);
+        foreach (@uni) {
+            $_ = $$conv{$_} if defined $$conv{$_};
+        }
+    } elsif ($type & 0x600) {   # 2-byte or 4-byte fixed-width characters
+        my $unknown;
+        my $byteOrder = $_[3];
+        if (not $byteOrder) {
+            $byteOrder = GetByteOrder();
+        } elsif ($byteOrder eq 'Unknown') {
+            $byteOrder = GetByteOrder();
+            $unknown = 1;
+        }
+        my $fmt = $byteOrder eq 'MM' ? 'n*' : 'v*';
+        if ($type & 0x400) {    # 4-byte
+            $fmt = uc $fmt; # unpack as 'N*' or 'V*'
+            # honour BOM if it exists
+            $val =~ s/^(\0\0\xfe\xff|\xff\xfe\0\0)// and $fmt = $1 eq "\0\0\xfe\xff" ? 'N*' : 'V*';
+            undef $unknown; # (byte order logic applies to 2-byte only)
+        } elsif ($val =~ s/^(\xfe\xff|\xff\xfe)//) {
+            $fmt = $1 eq "\xfe\xff" ? 'n*' : 'v*';
+            undef $unknown;
+        }
+        # convert from UCS2 or UCS4
+        @uni = unpack($fmt, $val);
+
+        if (not $conv) {
+            # no translation necessary
+            if ($unknown) {
+                # check the byte order
+                my (%bh, %bl);
+                my ($zh, $zl) = (0, 0);
+                foreach (@uni) {
+                    $bh{$_ >> 8} = 1;
+                    $bl{$_ & 0xff} = 1;
+                    ++$zh unless $_ & 0xff00;
+                    ++$zl unless $_ & 0x00ff;
+                }
+                # count the number of unique values in the hi and lo bytes
+                my ($bh, $bl) = (scalar(keys %bh), scalar(keys %bl));
+                # the byte with the greater number of unique values should be
+                # the low-order byte, otherwise the byte which is zero more
+                # often is likely the high-order byte
+                if ($bh > $bl or ($bh == $bl and $zl > $zh)) {
+                    # we guessed wrong, so decode using the other byte order
+                    $fmt =~ tr/nvNV/vnVN/;
+                    @uni = unpack($fmt, $val);
+                }
+            }
+            # handle surrogate pairs of UTF-16
+            if ($charset eq 'UTF16') {
+                my $i;
+                for ($i=0; $i<$#uni; ++$i) {
+                    next unless ($uni[$i]   & 0xfc00) == 0xd800 and
+                                ($uni[$i+1] & 0xfc00) == 0xdc00;
+                    my $cp = 0x10000 + (($uni[$i] & 0x3ff) << 10) + ($uni[$i+1] & 0x3ff);
+                    splice(@uni, $i, 2, $cp);
+                }
+            }
+        } elsif ($unknown) {
+            # count encoding errors as we do the translation
+            my $e1 = 0;
+            foreach (@uni) {
+                defined $$conv{$_} and $_ = $$conv{$_}, next;
+                ++$e1;
+            }
+            # try the other byte order if we had any errors
+            if ($e1) {
+                $fmt = $byteOrder eq 'MM' ? 'v*' : 'n*'; #(reversed)
+                my @try = unpack($fmt, $val);
+                my $e2 = 0;
+                foreach (@try) {
+                    defined $$conv{$_} and $_ = $$conv{$_}, next;
+                    ++$e2;
+                }
+                # use this byte order if there are fewer errors
+                return \@try if $e2 < $e1;
+            }
+        } else {
+            # translate any characters found in the lookup
+            foreach (@uni) {
+                $_ = $$conv{$_} if defined $$conv{$_};
+            }
+        }
+    } else {                    # variable-width characters
+        # unpack into bytes
+        my @bytes = unpack('C*', $val);
+        while (@bytes) {
+            my $ch = shift @bytes;
+            my $cv = $$conv{$ch};
+            # pass straight through if no translation
+            $cv or push(@uni, $ch), next;
+            # byte translates into single Unicode character
+            ref $cv or push(@uni, $cv), next;
+            # byte maps into multiple Unicode characters
+            ref $cv eq 'ARRAY' and push(@uni, @$cv), next;
+            # handle 2-byte character codes
+            $ch = shift @bytes;
+            if (defined $ch) {
+                if ($$cv{$ch}) {
+                    $cv = $$cv{$ch};
+                    ref $cv or push(@uni, $cv), next;
+                    push @uni, @$cv;        # multiple Unicode characters
+                } else {
+                    push @uni, ord('?');    # encoding error
+                    unshift @bytes, $ch;
+                }
+            } else {
+                push @uni, ord('?');        # encoding error
+            }
+        }
+    }
+    return \@uni;
+}
+
+#------------------------------------------------------------------------------
+# Convert array of code point integers into a string with specified encoding
+# Inputs: 0) ExifTool ref (or undef), 1) unicode character array ref,
+#         2) character set (note: not all types are supported)
+#         3) byte order ('MM' or 'II', multi-byte sets only, defaults to current byte order)
+# Returns: converted string (truncated at null character if it exists), empty on error
+# Notes: converts elements of input character array to new code points
+# - ExifTool ref may be undef provided $charset is defined
+sub Recompose($$;$$)
+{
+    local $_;
+    my ($exifTool, $uni, $charset) = @_; # ($byteOrder assigned later if required)
+    my ($outVal, $conv, $inv);
+    $charset or $charset = $$exifTool{OPTIONS}{Charset};
+    my $csType = $csType{$charset};
+    if ($csType == 0x100) {     # UTF8 (also treat ASCII as UTF8)
+        if ($] >= 5.006001) {
+            # let Perl do it
+            $outVal = pack('C0U*', @$uni);
+        } else {
+            # do it ourself
+            $outVal = Image::ExifTool::PackUTF8(@$uni);
+        }
+        $outVal =~ s/\0.*//s;   # truncate at null terminator
+        return $outVal;
+    }
+    # get references to forward and inverse lookup tables
+    if ($csType & 0x801) {
+        $conv = LoadCharset($charset);
+        unless ($conv) {
+            $exifTool->Warn("Missing charset $charset") if $exifTool;
+            return '';
+        }
+        $inv = $unicode2byte{$charset};
+        # generate inverse lookup if necessary
+        unless ($inv) {
+            if (not $csType or $csType & 0x802) {
+                $exifTool->Warn("Invalid destination charset $charset") if $exifTool;
+                return '';
+            }
+            # prepare table to convert from Unicode to 1-byte characters
+            my ($char, %inv);
+            foreach $char (keys %$conv) {
+                $inv{$$conv{$char}} = $char;
+            }
+            $inv = $unicode2byte{$charset} = \%inv;
+        }
+    }
+    if ($csType & 0x100) {      # 1-byte fixed-width
+        # convert to specified character set
+        foreach (@$uni) {
+            next if $_ < 0x80;
+            $$inv{$_} and $_ = $$inv{$_}, next;
+            # our tables omit 1-byte characters with the same values as Unicode,
+            # so pass them straight through after making sure there isn't a
+            # different character with this byte value
+            next if $_ < 0x100 and not $$conv{$_};
+            $_ = ord('?');  # set invalid characters to '?'
+            if ($exifTool and not $$exifTool{EncodingError}) {
+                $exifTool->Warn("Some character(s) could not be encoded in $charset");
+                $$exifTool{EncodingError} = 1;
+            }
+        }
+        # repack as an 8-bit string and truncate at null
+        $outVal = pack('C*', @$uni);
+        $outVal =~ s/\0.*//s;
+    } else {                    # 2-byte and 4-byte fixed-width
+        # convert if required
+        if ($inv) {
+            $$inv{$_} and $_ = $$inv{$_} foreach @$uni;
+        }
+        # generate surrogate pairs of UTF-16
+        if ($charset eq 'UTF16') {
+            my $i;
+            for ($i=0; $i<@$uni; ++$i) {
+                next unless $$uni[$i] >= 0x10000 and $$uni[$i] < 0x10ffff;
+                my $t = $$uni[$i] - 0x10000;
+                my $w1 = 0xd800 + (($t >> 10) & 0x3ff);
+                my $w2 = 0xdc00 + ($t & 0x3ff);
+                splice(@$uni, $i, 1, $w1, $w2);
+                ++$i;   # skip surrogate pair
+            }
+        }
+        # pack as 2- or 4-byte integer in specified byte order
+        my $byteOrder = $_[3] || GetByteOrder();
+        my $fmt = $byteOrder eq 'MM' ? 'n*' : 'v*';
+        $fmt = uc($fmt) if $csType & 0x400;
+        $outVal = pack($fmt, @$uni);
+    }
+    return $outVal;
+}
+
+1; # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Charset - ExifTool character encoding routines
+
+=head1 SYNOPSIS
+
+This module is required by Image::ExifTool.
+
+=head1 DESCRIPTION
+
+This module contains routines used by ExifTool to translate special
+character sets.  Currently, the following character sets are supported:
+
+  UTF8, UTF16, UCS2, UCS4, Arabic, Baltic, Cyrillic, Greek, Hebrew, JIS,
+  Latin, Latin2, MacArabic, MacChineseCN, MacChineseTW, MacCroatian,
+  MacCyrillic, MacGreek, MacHebrew, MacIceland, MacJapanese, MacKorean,
+  MacLatin2, MacRSymbol, MacRoman, MacRomanian, MacThai, MacTurkish,
+  PDFDoc, RSymbol, ShiftJIS, Symbol, Thai, Turkish, Vietnam
+
+However, only some of these character sets are available to the user via
+ExifTool options; the multi-byte character sets are used only internally
+when decoding certain types of information.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/Arabic.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/Arabic.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/Arabic.pm	(revision 24799)
@@ -0,0 +1,39 @@
+#------------------------------------------------------------------------------
+# File:         Arabic.pm
+#
+# Description:  cp1256 to Unicode
+#
+# Revisions:    2010/01/20 - P. Harvey created
+#
+# References:   1) http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1256.TXT
+#
+# Notes:        The table omits 1-byte characters with the same values as Unicode
+#------------------------------------------------------------------------------
+use strict;
+
+%Image::ExifTool::Charset::Arabic = (
+  0x80 => 0x20ac, 0x81 => 0x067e, 0x82 => 0x201a, 0x83 => 0x0192,
+  0x84 => 0x201e, 0x85 => 0x2026, 0x86 => 0x2020, 0x87 => 0x2021,
+  0x88 => 0x02c6, 0x89 => 0x2030, 0x8a => 0x0679, 0x8b => 0x2039,
+  0x8c => 0x0152, 0x8d => 0x0686, 0x8e => 0x0698, 0x8f => 0x0688,
+  0x90 => 0x06af, 0x91 => 0x2018, 0x92 => 0x2019, 0x93 => 0x201c,
+  0x94 => 0x201d, 0x95 => 0x2022, 0x96 => 0x2013, 0x97 => 0x2014,
+  0x98 => 0x06a9, 0x99 => 0x2122, 0x9a => 0x0691, 0x9b => 0x203a,
+  0x9c => 0x0153, 0x9d => 0x200c, 0x9e => 0x200d, 0x9f => 0x06ba,
+  0xa1 => 0x060c, 0xaa => 0x06be, 0xba => 0x061b, 0xbf => 0x061f,
+  0xc0 => 0x06c1, 0xc1 => 0x0621, 0xc2 => 0x0622, 0xc3 => 0x0623,
+  0xc4 => 0x0624, 0xc5 => 0x0625, 0xc6 => 0x0626, 0xc7 => 0x0627,
+  0xc8 => 0x0628, 0xc9 => 0x0629, 0xca => 0x062a, 0xcb => 0x062b,
+  0xcc => 0x062c, 0xcd => 0x062d, 0xce => 0x062e, 0xcf => 0x062f,
+  0xd0 => 0x0630, 0xd1 => 0x0631, 0xd2 => 0x0632, 0xd3 => 0x0633,
+  0xd4 => 0x0634, 0xd5 => 0x0635, 0xd6 => 0x0636, 0xd8 => 0x0637,
+  0xd9 => 0x0638, 0xda => 0x0639, 0xdb => 0x063a, 0xdc => 0x0640,
+  0xdd => 0x0641, 0xde => 0x0642, 0xdf => 0x0643, 0xe1 => 0x0644,
+  0xe3 => 0x0645, 0xe4 => 0x0646, 0xe5 => 0x0647, 0xe6 => 0x0648,
+  0xec => 0x0649, 0xed => 0x064a, 0xf0 => 0x064b, 0xf1 => 0x064c,
+  0xf2 => 0x064d, 0xf3 => 0x064e, 0xf5 => 0x064f, 0xf6 => 0x0650,
+  0xf8 => 0x0651, 0xfa => 0x0652, 0xfd => 0x200e, 0xfe => 0x200f,
+  0xff => 0x06d2,
+);
+
+1; # end
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/Baltic.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/Baltic.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/Baltic.pm	(revision 24799)
@@ -0,0 +1,35 @@
+#------------------------------------------------------------------------------
+# File:         Baltic.pm
+#
+# Description:  cp1257 to Unicode
+#
+# Revisions:    2010/01/20 - P. Harvey created
+#
+# References:   1) http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1257.TXT
+#
+# Notes:        The table omits 1-byte characters with the same values as Unicode
+#------------------------------------------------------------------------------
+use strict;
+
+%Image::ExifTool::Charset::Baltic = (
+  0x80 => 0x20ac, 0x82 => 0x201a, 0x84 => 0x201e, 0x85 => 0x2026,
+  0x86 => 0x2020, 0x87 => 0x2021, 0x89 => 0x2030, 0x8b => 0x2039, 0x8d => 0xa8,
+  0x8e => 0x02c7, 0x8f => 0xb8, 0x91 => 0x2018, 0x92 => 0x2019, 0x93 => 0x201c,
+  0x94 => 0x201d, 0x95 => 0x2022, 0x96 => 0x2013, 0x97 => 0x2014,
+  0x99 => 0x2122, 0x9b => 0x203a, 0x9d => 0xaf, 0x9e => 0x02db, 0xa8 => 0xd8,
+  0xaa => 0x0156, 0xaf => 0xc6, 0xb8 => 0xf8, 0xba => 0x0157, 0xbf => 0xe6,
+  0xc0 => 0x0104, 0xc1 => 0x012e, 0xc2 => 0x0100, 0xc3 => 0x0106,
+  0xc6 => 0x0118, 0xc7 => 0x0112, 0xc8 => 0x010c, 0xca => 0x0179,
+  0xcb => 0x0116, 0xcc => 0x0122, 0xcd => 0x0136, 0xce => 0x012a,
+  0xcf => 0x013b, 0xd0 => 0x0160, 0xd1 => 0x0143, 0xd2 => 0x0145,
+  0xd4 => 0x014c, 0xd8 => 0x0172, 0xd9 => 0x0141, 0xda => 0x015a,
+  0xdb => 0x016a, 0xdd => 0x017b, 0xde => 0x017d, 0xe0 => 0x0105,
+  0xe1 => 0x012f, 0xe2 => 0x0101, 0xe3 => 0x0107, 0xe6 => 0x0119,
+  0xe7 => 0x0113, 0xe8 => 0x010d, 0xea => 0x017a, 0xeb => 0x0117,
+  0xec => 0x0123, 0xed => 0x0137, 0xee => 0x012b, 0xef => 0x013c,
+  0xf0 => 0x0161, 0xf1 => 0x0144, 0xf2 => 0x0146, 0xf4 => 0x014d,
+  0xf8 => 0x0173, 0xf9 => 0x0142, 0xfa => 0x015b, 0xfb => 0x016b,
+  0xfd => 0x017c, 0xfe => 0x017e, 0xff => 0x02d9,
+);
+
+1; # end
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/Cyrillic.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/Cyrillic.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/Cyrillic.pm	(revision 24799)
@@ -0,0 +1,45 @@
+#------------------------------------------------------------------------------
+# File:         Cyrillic.pm
+#
+# Description:  cp1251 to Unicode
+#
+# Revisions:    2010/01/20 - P. Harvey created
+#
+# References:   1) http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1251.TXT
+#
+# Notes:        The table omits 1-byte characters with the same values as Unicode
+#------------------------------------------------------------------------------
+use strict;
+
+%Image::ExifTool::Charset::Cyrillic = (
+  0x80 => 0x0402, 0x81 => 0x0403, 0x82 => 0x201a, 0x83 => 0x0453,
+  0x84 => 0x201e, 0x85 => 0x2026, 0x86 => 0x2020, 0x87 => 0x2021,
+  0x88 => 0x20ac, 0x89 => 0x2030, 0x8a => 0x0409, 0x8b => 0x2039,
+  0x8c => 0x040a, 0x8d => 0x040c, 0x8e => 0x040b, 0x8f => 0x040f,
+  0x90 => 0x0452, 0x91 => 0x2018, 0x92 => 0x2019, 0x93 => 0x201c,
+  0x94 => 0x201d, 0x95 => 0x2022, 0x96 => 0x2013, 0x97 => 0x2014,
+  0x99 => 0x2122, 0x9a => 0x0459, 0x9b => 0x203a, 0x9c => 0x045a,
+  0x9d => 0x045c, 0x9e => 0x045b, 0x9f => 0x045f, 0xa1 => 0x040e,
+  0xa2 => 0x045e, 0xa3 => 0x0408, 0xa5 => 0x0490, 0xa8 => 0x0401,
+  0xaa => 0x0404, 0xaf => 0x0407, 0xb2 => 0x0406, 0xb3 => 0x0456,
+  0xb4 => 0x0491, 0xb8 => 0x0451, 0xb9 => 0x2116, 0xba => 0x0454,
+  0xbc => 0x0458, 0xbd => 0x0405, 0xbe => 0x0455, 0xbf => 0x0457,
+  0xc0 => 0x0410, 0xc1 => 0x0411, 0xc2 => 0x0412, 0xc3 => 0x0413,
+  0xc4 => 0x0414, 0xc5 => 0x0415, 0xc6 => 0x0416, 0xc7 => 0x0417,
+  0xc8 => 0x0418, 0xc9 => 0x0419, 0xca => 0x041a, 0xcb => 0x041b,
+  0xcc => 0x041c, 0xcd => 0x041d, 0xce => 0x041e, 0xcf => 0x041f,
+  0xd0 => 0x0420, 0xd1 => 0x0421, 0xd2 => 0x0422, 0xd3 => 0x0423,
+  0xd4 => 0x0424, 0xd5 => 0x0425, 0xd6 => 0x0426, 0xd7 => 0x0427,
+  0xd8 => 0x0428, 0xd9 => 0x0429, 0xda => 0x042a, 0xdb => 0x042b,
+  0xdc => 0x042c, 0xdd => 0x042d, 0xde => 0x042e, 0xdf => 0x042f,
+  0xe0 => 0x0430, 0xe1 => 0x0431, 0xe2 => 0x0432, 0xe3 => 0x0433,
+  0xe4 => 0x0434, 0xe5 => 0x0435, 0xe6 => 0x0436, 0xe7 => 0x0437,
+  0xe8 => 0x0438, 0xe9 => 0x0439, 0xea => 0x043a, 0xeb => 0x043b,
+  0xec => 0x043c, 0xed => 0x043d, 0xee => 0x043e, 0xef => 0x043f,
+  0xf0 => 0x0440, 0xf1 => 0x0441, 0xf2 => 0x0442, 0xf3 => 0x0443,
+  0xf4 => 0x0444, 0xf5 => 0x0445, 0xf6 => 0x0446, 0xf7 => 0x0447,
+  0xf8 => 0x0448, 0xf9 => 0x0449, 0xfa => 0x044a, 0xfb => 0x044b,
+  0xfc => 0x044c, 0xfd => 0x044d, 0xfe => 0x044e, 0xff => 0x044f,
+);
+
+1; # end
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/Greek.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/Greek.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/Greek.pm	(revision 24799)
@@ -0,0 +1,40 @@
+#------------------------------------------------------------------------------
+# File:         Greek.pm
+#
+# Description:  cp1253 to Unicode
+#
+# Revisions:    2010/01/20 - P. Harvey created
+#
+# References:   1) http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1253.TXT
+#
+# Notes:        The table omits 1-byte characters with the same values as Unicode
+#------------------------------------------------------------------------------
+use strict;
+
+%Image::ExifTool::Charset::Greek = (
+  0x80 => 0x20ac, 0x82 => 0x201a, 0x83 => 0x0192, 0x84 => 0x201e,
+  0x85 => 0x2026, 0x86 => 0x2020, 0x87 => 0x2021, 0x89 => 0x2030,
+  0x8b => 0x2039, 0x91 => 0x2018, 0x92 => 0x2019, 0x93 => 0x201c,
+  0x94 => 0x201d, 0x95 => 0x2022, 0x96 => 0x2013, 0x97 => 0x2014,
+  0x99 => 0x2122, 0x9b => 0x203a, 0xa1 => 0x0385, 0xa2 => 0x0386,
+  0xaf => 0x2015, 0xb4 => 0x0384, 0xb8 => 0x0388, 0xb9 => 0x0389,
+  0xba => 0x038a, 0xbc => 0x038c, 0xbe => 0x038e, 0xbf => 0x038f,
+  0xc0 => 0x0390, 0xc1 => 0x0391, 0xc2 => 0x0392, 0xc3 => 0x0393,
+  0xc4 => 0x0394, 0xc5 => 0x0395, 0xc6 => 0x0396, 0xc7 => 0x0397,
+  0xc8 => 0x0398, 0xc9 => 0x0399, 0xca => 0x039a, 0xcb => 0x039b,
+  0xcc => 0x039c, 0xcd => 0x039d, 0xce => 0x039e, 0xcf => 0x039f,
+  0xd0 => 0x03a0, 0xd1 => 0x03a1, 0xd3 => 0x03a3, 0xd4 => 0x03a4,
+  0xd5 => 0x03a5, 0xd6 => 0x03a6, 0xd7 => 0x03a7, 0xd8 => 0x03a8,
+  0xd9 => 0x03a9, 0xda => 0x03aa, 0xdb => 0x03ab, 0xdc => 0x03ac,
+  0xdd => 0x03ad, 0xde => 0x03ae, 0xdf => 0x03af, 0xe0 => 0x03b0,
+  0xe1 => 0x03b1, 0xe2 => 0x03b2, 0xe3 => 0x03b3, 0xe4 => 0x03b4,
+  0xe5 => 0x03b5, 0xe6 => 0x03b6, 0xe7 => 0x03b7, 0xe8 => 0x03b8,
+  0xe9 => 0x03b9, 0xea => 0x03ba, 0xeb => 0x03bb, 0xec => 0x03bc,
+  0xed => 0x03bd, 0xee => 0x03be, 0xef => 0x03bf, 0xf0 => 0x03c0,
+  0xf1 => 0x03c1, 0xf2 => 0x03c2, 0xf3 => 0x03c3, 0xf4 => 0x03c4,
+  0xf5 => 0x03c5, 0xf6 => 0x03c6, 0xf7 => 0x03c7, 0xf8 => 0x03c8,
+  0xf9 => 0x03c9, 0xfa => 0x03ca, 0xfb => 0x03cb, 0xfc => 0x03cc,
+  0xfd => 0x03cd, 0xfe => 0x03ce,
+);
+
+1; # end
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/Hebrew.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/Hebrew.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/Hebrew.pm	(revision 24799)
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+# File:         Hebrew.pm
+#
+# Description:  cp1255 to Unicode
+#
+# Revisions:    2010/01/20 - P. Harvey created
+#
+# References:   1) http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1255.TXT
+#
+# Notes:        The table omits 1-byte characters with the same values as Unicode
+#------------------------------------------------------------------------------
+use strict;
+
+%Image::ExifTool::Charset::Hebrew = (
+  0x80 => 0x20ac, 0x82 => 0x201a, 0x83 => 0x0192, 0x84 => 0x201e,
+  0x85 => 0x2026, 0x86 => 0x2020, 0x87 => 0x2021, 0x88 => 0x02c6,
+  0x89 => 0x2030, 0x8b => 0x2039, 0x91 => 0x2018, 0x92 => 0x2019,
+  0x93 => 0x201c, 0x94 => 0x201d, 0x95 => 0x2022, 0x96 => 0x2013,
+  0x97 => 0x2014, 0x98 => 0x02dc, 0x99 => 0x2122, 0x9b => 0x203a,
+  0xa4 => 0x20aa, 0xaa => 0xd7, 0xba => 0xf7, 0xc0 => 0x05b0, 0xc1 => 0x05b1,
+  0xc2 => 0x05b2, 0xc3 => 0x05b3, 0xc4 => 0x05b4, 0xc5 => 0x05b5,
+  0xc6 => 0x05b6, 0xc7 => 0x05b7, 0xc8 => 0x05b8, 0xc9 => 0x05b9,
+  0xcb => 0x05bb, 0xcc => 0x05bc, 0xcd => 0x05bd, 0xce => 0x05be,
+  0xcf => 0x05bf, 0xd0 => 0x05c0, 0xd1 => 0x05c1, 0xd2 => 0x05c2,
+  0xd3 => 0x05c3, 0xd4 => 0x05f0, 0xd5 => 0x05f1, 0xd6 => 0x05f2,
+  0xd7 => 0x05f3, 0xd8 => 0x05f4, 0xe0 => 0x05d0, 0xe1 => 0x05d1,
+  0xe2 => 0x05d2, 0xe3 => 0x05d3, 0xe4 => 0x05d4, 0xe5 => 0x05d5,
+  0xe6 => 0x05d6, 0xe7 => 0x05d7, 0xe8 => 0x05d8, 0xe9 => 0x05d9,
+  0xea => 0x05da, 0xeb => 0x05db, 0xec => 0x05dc, 0xed => 0x05dd,
+  0xee => 0x05de, 0xef => 0x05df, 0xf0 => 0x05e0, 0xf1 => 0x05e1,
+  0xf2 => 0x05e2, 0xf3 => 0x05e3, 0xf4 => 0x05e4, 0xf5 => 0x05e5,
+  0xf6 => 0x05e6, 0xf7 => 0x05e7, 0xf8 => 0x05e8, 0xf9 => 0x05e9,
+  0xfa => 0x05ea, 0xfd => 0x200e, 0xfe => 0x200f,
+);
+
+1; # end
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/JIS.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/JIS.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/JIS.pm	(revision 24799)
@@ -0,0 +1,1735 @@
+#------------------------------------------------------------------------------
+# File:         JIS.pm
+#
+# Description:  JIS X 0208 (1990) to Unicode
+#
+# Revisions:    2010/01/20 - P. Harvey created
+#
+# References:   1) http://unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/JIS0208.TXT
+#------------------------------------------------------------------------------
+use strict;
+
+%Image::ExifTool::Charset::JIS = (
+  0x2121 => 0x3000, 0x2122 => 0x3001, 0x2123 => 0x3002, 0x2124 => 0xff0c,
+  0x2125 => 0xff0e, 0x2126 => 0x30fb, 0x2127 => 0xff1a, 0x2128 => 0xff1b,
+  0x2129 => 0xff1f, 0x212a => 0xff01, 0x212b => 0x309b, 0x212c => 0x309c,
+  0x212d => 0x00b4, 0x212e => 0xff40, 0x212f => 0x00a8, 0x2130 => 0xff3e,
+  0x2131 => 0xffe3, 0x2132 => 0xff3f, 0x2133 => 0x30fd, 0x2134 => 0x30fe,
+  0x2135 => 0x309d, 0x2136 => 0x309e, 0x2137 => 0x3003, 0x2138 => 0x4edd,
+  0x2139 => 0x3005, 0x213a => 0x3006, 0x213b => 0x3007, 0x213c => 0x30fc,
+  0x213d => 0x2015, 0x213e => 0x2010, 0x213f => 0xff0f, 0x2140 => 0x005c,
+  0x2141 => 0x301c, 0x2142 => 0x2016, 0x2143 => 0xff5c, 0x2144 => 0x2026,
+  0x2145 => 0x2025, 0x2146 => 0x2018, 0x2147 => 0x2019, 0x2148 => 0x201c,
+  0x2149 => 0x201d, 0x214a => 0xff08, 0x214b => 0xff09, 0x214c => 0x3014,
+  0x214d => 0x3015, 0x214e => 0xff3b, 0x214f => 0xff3d, 0x2150 => 0xff5b,
+  0x2151 => 0xff5d, 0x2152 => 0x3008, 0x2153 => 0x3009, 0x2154 => 0x300a,
+  0x2155 => 0x300b, 0x2156 => 0x300c, 0x2157 => 0x300d, 0x2158 => 0x300e,
+  0x2159 => 0x300f, 0x215a => 0x3010, 0x215b => 0x3011, 0x215c => 0xff0b,
+  0x215d => 0x2212, 0x215e => 0x00b1, 0x215f => 0x00d7, 0x2160 => 0x00f7,
+  0x2161 => 0xff1d, 0x2162 => 0x2260, 0x2163 => 0xff1c, 0x2164 => 0xff1e,
+  0x2165 => 0x2266, 0x2166 => 0x2267, 0x2167 => 0x221e, 0x2168 => 0x2234,
+  0x2169 => 0x2642, 0x216a => 0x2640, 0x216b => 0x00b0, 0x216c => 0x2032,
+  0x216d => 0x2033, 0x216e => 0x2103, 0x216f => 0xffe5, 0x2170 => 0xff04,
+  0x2171 => 0x00a2, 0x2172 => 0x00a3, 0x2173 => 0xff05, 0x2174 => 0xff03,
+  0x2175 => 0xff06, 0x2176 => 0xff0a, 0x2177 => 0xff20, 0x2178 => 0x00a7,
+  0x2179 => 0x2606, 0x217a => 0x2605, 0x217b => 0x25cb, 0x217c => 0x25cf,
+  0x217d => 0x25ce, 0x217e => 0x25c7, 0x2221 => 0x25c6, 0x2222 => 0x25a1,
+  0x2223 => 0x25a0, 0x2224 => 0x25b3, 0x2225 => 0x25b2, 0x2226 => 0x25bd,
+  0x2227 => 0x25bc, 0x2228 => 0x203b, 0x2229 => 0x3012, 0x222a => 0x2192,
+  0x222b => 0x2190, 0x222c => 0x2191, 0x222d => 0x2193, 0x222e => 0x3013,
+  0x223a => 0x2208, 0x223b => 0x220b, 0x223c => 0x2286, 0x223d => 0x2287,
+  0x223e => 0x2282, 0x223f => 0x2283, 0x2240 => 0x222a, 0x2241 => 0x2229,
+  0x224a => 0x2227, 0x224b => 0x2228, 0x224c => 0x00ac, 0x224d => 0x21d2,
+  0x224e => 0x21d4, 0x224f => 0x2200, 0x2250 => 0x2203, 0x225c => 0x2220,
+  0x225d => 0x22a5, 0x225e => 0x2312, 0x225f => 0x2202, 0x2260 => 0x2207,
+  0x2261 => 0x2261, 0x2262 => 0x2252, 0x2263 => 0x226a, 0x2264 => 0x226b,
+  0x2265 => 0x221a, 0x2266 => 0x223d, 0x2267 => 0x221d, 0x2268 => 0x2235,
+  0x2269 => 0x222b, 0x226a => 0x222c, 0x2272 => 0x212b, 0x2273 => 0x2030,
+  0x2274 => 0x266f, 0x2275 => 0x266d, 0x2276 => 0x266a, 0x2277 => 0x2020,
+  0x2278 => 0x2021, 0x2279 => 0x00b6, 0x227e => 0x25ef, 0x2330 => 0xff10,
+  0x2331 => 0xff11, 0x2332 => 0xff12, 0x2333 => 0xff13, 0x2334 => 0xff14,
+  0x2335 => 0xff15, 0x2336 => 0xff16, 0x2337 => 0xff17, 0x2338 => 0xff18,
+  0x2339 => 0xff19, 0x2341 => 0xff21, 0x2342 => 0xff22, 0x2343 => 0xff23,
+  0x2344 => 0xff24, 0x2345 => 0xff25, 0x2346 => 0xff26, 0x2347 => 0xff27,
+  0x2348 => 0xff28, 0x2349 => 0xff29, 0x234a => 0xff2a, 0x234b => 0xff2b,
+  0x234c => 0xff2c, 0x234d => 0xff2d, 0x234e => 0xff2e, 0x234f => 0xff2f,
+  0x2350 => 0xff30, 0x2351 => 0xff31, 0x2352 => 0xff32, 0x2353 => 0xff33,
+  0x2354 => 0xff34, 0x2355 => 0xff35, 0x2356 => 0xff36, 0x2357 => 0xff37,
+  0x2358 => 0xff38, 0x2359 => 0xff39, 0x235a => 0xff3a, 0x2361 => 0xff41,
+  0x2362 => 0xff42, 0x2363 => 0xff43, 0x2364 => 0xff44, 0x2365 => 0xff45,
+  0x2366 => 0xff46, 0x2367 => 0xff47, 0x2368 => 0xff48, 0x2369 => 0xff49,
+  0x236a => 0xff4a, 0x236b => 0xff4b, 0x236c => 0xff4c, 0x236d => 0xff4d,
+  0x236e => 0xff4e, 0x236f => 0xff4f, 0x2370 => 0xff50, 0x2371 => 0xff51,
+  0x2372 => 0xff52, 0x2373 => 0xff53, 0x2374 => 0xff54, 0x2375 => 0xff55,
+  0x2376 => 0xff56, 0x2377 => 0xff57, 0x2378 => 0xff58, 0x2379 => 0xff59,
+  0x237a => 0xff5a, 0x2421 => 0x3041, 0x2422 => 0x3042, 0x2423 => 0x3043,
+  0x2424 => 0x3044, 0x2425 => 0x3045, 0x2426 => 0x3046, 0x2427 => 0x3047,
+  0x2428 => 0x3048, 0x2429 => 0x3049, 0x242a => 0x304a, 0x242b => 0x304b,
+  0x242c => 0x304c, 0x242d => 0x304d, 0x242e => 0x304e, 0x242f => 0x304f,
+  0x2430 => 0x3050, 0x2431 => 0x3051, 0x2432 => 0x3052, 0x2433 => 0x3053,
+  0x2434 => 0x3054, 0x2435 => 0x3055, 0x2436 => 0x3056, 0x2437 => 0x3057,
+  0x2438 => 0x3058, 0x2439 => 0x3059, 0x243a => 0x305a, 0x243b => 0x305b,
+  0x243c => 0x305c, 0x243d => 0x305d, 0x243e => 0x305e, 0x243f => 0x305f,
+  0x2440 => 0x3060, 0x2441 => 0x3061, 0x2442 => 0x3062, 0x2443 => 0x3063,
+  0x2444 => 0x3064, 0x2445 => 0x3065, 0x2446 => 0x3066, 0x2447 => 0x3067,
+  0x2448 => 0x3068, 0x2449 => 0x3069, 0x244a => 0x306a, 0x244b => 0x306b,
+  0x244c => 0x306c, 0x244d => 0x306d, 0x244e => 0x306e, 0x244f => 0x306f,
+  0x2450 => 0x3070, 0x2451 => 0x3071, 0x2452 => 0x3072, 0x2453 => 0x3073,
+  0x2454 => 0x3074, 0x2455 => 0x3075, 0x2456 => 0x3076, 0x2457 => 0x3077,
+  0x2458 => 0x3078, 0x2459 => 0x3079, 0x245a => 0x307a, 0x245b => 0x307b,
+  0x245c => 0x307c, 0x245d => 0x307d, 0x245e => 0x307e, 0x245f => 0x307f,
+  0x2460 => 0x3080, 0x2461 => 0x3081, 0x2462 => 0x3082, 0x2463 => 0x3083,
+  0x2464 => 0x3084, 0x2465 => 0x3085, 0x2466 => 0x3086, 0x2467 => 0x3087,
+  0x2468 => 0x3088, 0x2469 => 0x3089, 0x246a => 0x308a, 0x246b => 0x308b,
+  0x246c => 0x308c, 0x246d => 0x308d, 0x246e => 0x308e, 0x246f => 0x308f,
+  0x2470 => 0x3090, 0x2471 => 0x3091, 0x2472 => 0x3092, 0x2473 => 0x3093,
+  0x2521 => 0x30a1, 0x2522 => 0x30a2, 0x2523 => 0x30a3, 0x2524 => 0x30a4,
+  0x2525 => 0x30a5, 0x2526 => 0x30a6, 0x2527 => 0x30a7, 0x2528 => 0x30a8,
+  0x2529 => 0x30a9, 0x252a => 0x30aa, 0x252b => 0x30ab, 0x252c => 0x30ac,
+  0x252d => 0x30ad, 0x252e => 0x30ae, 0x252f => 0x30af, 0x2530 => 0x30b0,
+  0x2531 => 0x30b1, 0x2532 => 0x30b2, 0x2533 => 0x30b3, 0x2534 => 0x30b4,
+  0x2535 => 0x30b5, 0x2536 => 0x30b6, 0x2537 => 0x30b7, 0x2538 => 0x30b8,
+  0x2539 => 0x30b9, 0x253a => 0x30ba, 0x253b => 0x30bb, 0x253c => 0x30bc,
+  0x253d => 0x30bd, 0x253e => 0x30be, 0x253f => 0x30bf, 0x2540 => 0x30c0,
+  0x2541 => 0x30c1, 0x2542 => 0x30c2, 0x2543 => 0x30c3, 0x2544 => 0x30c4,
+  0x2545 => 0x30c5, 0x2546 => 0x30c6, 0x2547 => 0x30c7, 0x2548 => 0x30c8,
+  0x2549 => 0x30c9, 0x254a => 0x30ca, 0x254b => 0x30cb, 0x254c => 0x30cc,
+  0x254d => 0x30cd, 0x254e => 0x30ce, 0x254f => 0x30cf, 0x2550 => 0x30d0,
+  0x2551 => 0x30d1, 0x2552 => 0x30d2, 0x2553 => 0x30d3, 0x2554 => 0x30d4,
+  0x2555 => 0x30d5, 0x2556 => 0x30d6, 0x2557 => 0x30d7, 0x2558 => 0x30d8,
+  0x2559 => 0x30d9, 0x255a => 0x30da, 0x255b => 0x30db, 0x255c => 0x30dc,
+  0x255d => 0x30dd, 0x255e => 0x30de, 0x255f => 0x30df, 0x2560 => 0x30e0,
+  0x2561 => 0x30e1, 0x2562 => 0x30e2, 0x2563 => 0x30e3, 0x2564 => 0x30e4,
+  0x2565 => 0x30e5, 0x2566 => 0x30e6, 0x2567 => 0x30e7, 0x2568 => 0x30e8,
+  0x2569 => 0x30e9, 0x256a => 0x30ea, 0x256b => 0x30eb, 0x256c => 0x30ec,
+  0x256d => 0x30ed, 0x256e => 0x30ee, 0x256f => 0x30ef, 0x2570 => 0x30f0,
+  0x2571 => 0x30f1, 0x2572 => 0x30f2, 0x2573 => 0x30f3, 0x2574 => 0x30f4,
+  0x2575 => 0x30f5, 0x2576 => 0x30f6, 0x2621 => 0x0391, 0x2622 => 0x0392,
+  0x2623 => 0x0393, 0x2624 => 0x0394, 0x2625 => 0x0395, 0x2626 => 0x0396,
+  0x2627 => 0x0397, 0x2628 => 0x0398, 0x2629 => 0x0399, 0x262a => 0x039a,
+  0x262b => 0x039b, 0x262c => 0x039c, 0x262d => 0x039d, 0x262e => 0x039e,
+  0x262f => 0x039f, 0x2630 => 0x03a0, 0x2631 => 0x03a1, 0x2632 => 0x03a3,
+  0x2633 => 0x03a4, 0x2634 => 0x03a5, 0x2635 => 0x03a6, 0x2636 => 0x03a7,
+  0x2637 => 0x03a8, 0x2638 => 0x03a9, 0x2641 => 0x03b1, 0x2642 => 0x03b2,
+  0x2643 => 0x03b3, 0x2644 => 0x03b4, 0x2645 => 0x03b5, 0x2646 => 0x03b6,
+  0x2647 => 0x03b7, 0x2648 => 0x03b8, 0x2649 => 0x03b9, 0x264a => 0x03ba,
+  0x264b => 0x03bb, 0x264c => 0x03bc, 0x264d => 0x03bd, 0x264e => 0x03be,
+  0x264f => 0x03bf, 0x2650 => 0x03c0, 0x2651 => 0x03c1, 0x2652 => 0x03c3,
+  0x2653 => 0x03c4, 0x2654 => 0x03c5, 0x2655 => 0x03c6, 0x2656 => 0x03c7,
+  0x2657 => 0x03c8, 0x2658 => 0x03c9, 0x2721 => 0x0410, 0x2722 => 0x0411,
+  0x2723 => 0x0412, 0x2724 => 0x0413, 0x2725 => 0x0414, 0x2726 => 0x0415,
+  0x2727 => 0x0401, 0x2728 => 0x0416, 0x2729 => 0x0417, 0x272a => 0x0418,
+  0x272b => 0x0419, 0x272c => 0x041a, 0x272d => 0x041b, 0x272e => 0x041c,
+  0x272f => 0x041d, 0x2730 => 0x041e, 0x2731 => 0x041f, 0x2732 => 0x0420,
+  0x2733 => 0x0421, 0x2734 => 0x0422, 0x2735 => 0x0423, 0x2736 => 0x0424,
+  0x2737 => 0x0425, 0x2738 => 0x0426, 0x2739 => 0x0427, 0x273a => 0x0428,
+  0x273b => 0x0429, 0x273c => 0x042a, 0x273d => 0x042b, 0x273e => 0x042c,
+  0x273f => 0x042d, 0x2740 => 0x042e, 0x2741 => 0x042f, 0x2751 => 0x0430,
+  0x2752 => 0x0431, 0x2753 => 0x0432, 0x2754 => 0x0433, 0x2755 => 0x0434,
+  0x2756 => 0x0435, 0x2757 => 0x0451, 0x2758 => 0x0436, 0x2759 => 0x0437,
+  0x275a => 0x0438, 0x275b => 0x0439, 0x275c => 0x043a, 0x275d => 0x043b,
+  0x275e => 0x043c, 0x275f => 0x043d, 0x2760 => 0x043e, 0x2761 => 0x043f,
+  0x2762 => 0x0440, 0x2763 => 0x0441, 0x2764 => 0x0442, 0x2765 => 0x0443,
+  0x2766 => 0x0444, 0x2767 => 0x0445, 0x2768 => 0x0446, 0x2769 => 0x0447,
+  0x276a => 0x0448, 0x276b => 0x0449, 0x276c => 0x044a, 0x276d => 0x044b,
+  0x276e => 0x044c, 0x276f => 0x044d, 0x2770 => 0x044e, 0x2771 => 0x044f,
+  0x2821 => 0x2500, 0x2822 => 0x2502, 0x2823 => 0x250c, 0x2824 => 0x2510,
+  0x2825 => 0x2518, 0x2826 => 0x2514, 0x2827 => 0x251c, 0x2828 => 0x252c,
+  0x2829 => 0x2524, 0x282a => 0x2534, 0x282b => 0x253c, 0x282c => 0x2501,
+  0x282d => 0x2503, 0x282e => 0x250f, 0x282f => 0x2513, 0x2830 => 0x251b,
+  0x2831 => 0x2517, 0x2832 => 0x2523, 0x2833 => 0x2533, 0x2834 => 0x252b,
+  0x2835 => 0x253b, 0x2836 => 0x254b, 0x2837 => 0x2520, 0x2838 => 0x252f,
+  0x2839 => 0x2528, 0x283a => 0x2537, 0x283b => 0x253f, 0x283c => 0x251d,
+  0x283d => 0x2530, 0x283e => 0x2525, 0x283f => 0x2538, 0x2840 => 0x2542,
+  0x3021 => 0x4e9c, 0x3022 => 0x5516, 0x3023 => 0x5a03, 0x3024 => 0x963f,
+  0x3025 => 0x54c0, 0x3026 => 0x611b, 0x3027 => 0x6328, 0x3028 => 0x59f6,
+  0x3029 => 0x9022, 0x302a => 0x8475, 0x302b => 0x831c, 0x302c => 0x7a50,
+  0x302d => 0x60aa, 0x302e => 0x63e1, 0x302f => 0x6e25, 0x3030 => 0x65ed,
+  0x3031 => 0x8466, 0x3032 => 0x82a6, 0x3033 => 0x9bf5, 0x3034 => 0x6893,
+  0x3035 => 0x5727, 0x3036 => 0x65a1, 0x3037 => 0x6271, 0x3038 => 0x5b9b,
+  0x3039 => 0x59d0, 0x303a => 0x867b, 0x303b => 0x98f4, 0x303c => 0x7d62,
+  0x303d => 0x7dbe, 0x303e => 0x9b8e, 0x303f => 0x6216, 0x3040 => 0x7c9f,
+  0x3041 => 0x88b7, 0x3042 => 0x5b89, 0x3043 => 0x5eb5, 0x3044 => 0x6309,
+  0x3045 => 0x6697, 0x3046 => 0x6848, 0x3047 => 0x95c7, 0x3048 => 0x978d,
+  0x3049 => 0x674f, 0x304a => 0x4ee5, 0x304b => 0x4f0a, 0x304c => 0x4f4d,
+  0x304d => 0x4f9d, 0x304e => 0x5049, 0x304f => 0x56f2, 0x3050 => 0x5937,
+  0x3051 => 0x59d4, 0x3052 => 0x5a01, 0x3053 => 0x5c09, 0x3054 => 0x60df,
+  0x3055 => 0x610f, 0x3056 => 0x6170, 0x3057 => 0x6613, 0x3058 => 0x6905,
+  0x3059 => 0x70ba, 0x305a => 0x754f, 0x305b => 0x7570, 0x305c => 0x79fb,
+  0x305d => 0x7dad, 0x305e => 0x7def, 0x305f => 0x80c3, 0x3060 => 0x840e,
+  0x3061 => 0x8863, 0x3062 => 0x8b02, 0x3063 => 0x9055, 0x3064 => 0x907a,
+  0x3065 => 0x533b, 0x3066 => 0x4e95, 0x3067 => 0x4ea5, 0x3068 => 0x57df,
+  0x3069 => 0x80b2, 0x306a => 0x90c1, 0x306b => 0x78ef, 0x306c => 0x4e00,
+  0x306d => 0x58f1, 0x306e => 0x6ea2, 0x306f => 0x9038, 0x3070 => 0x7a32,
+  0x3071 => 0x8328, 0x3072 => 0x828b, 0x3073 => 0x9c2f, 0x3074 => 0x5141,
+  0x3075 => 0x5370, 0x3076 => 0x54bd, 0x3077 => 0x54e1, 0x3078 => 0x56e0,
+  0x3079 => 0x59fb, 0x307a => 0x5f15, 0x307b => 0x98f2, 0x307c => 0x6deb,
+  0x307d => 0x80e4, 0x307e => 0x852d, 0x3121 => 0x9662, 0x3122 => 0x9670,
+  0x3123 => 0x96a0, 0x3124 => 0x97fb, 0x3125 => 0x540b, 0x3126 => 0x53f3,
+  0x3127 => 0x5b87, 0x3128 => 0x70cf, 0x3129 => 0x7fbd, 0x312a => 0x8fc2,
+  0x312b => 0x96e8, 0x312c => 0x536f, 0x312d => 0x9d5c, 0x312e => 0x7aba,
+  0x312f => 0x4e11, 0x3130 => 0x7893, 0x3131 => 0x81fc, 0x3132 => 0x6e26,
+  0x3133 => 0x5618, 0x3134 => 0x5504, 0x3135 => 0x6b1d, 0x3136 => 0x851a,
+  0x3137 => 0x9c3b, 0x3138 => 0x59e5, 0x3139 => 0x53a9, 0x313a => 0x6d66,
+  0x313b => 0x74dc, 0x313c => 0x958f, 0x313d => 0x5642, 0x313e => 0x4e91,
+  0x313f => 0x904b, 0x3140 => 0x96f2, 0x3141 => 0x834f, 0x3142 => 0x990c,
+  0x3143 => 0x53e1, 0x3144 => 0x55b6, 0x3145 => 0x5b30, 0x3146 => 0x5f71,
+  0x3147 => 0x6620, 0x3148 => 0x66f3, 0x3149 => 0x6804, 0x314a => 0x6c38,
+  0x314b => 0x6cf3, 0x314c => 0x6d29, 0x314d => 0x745b, 0x314e => 0x76c8,
+  0x314f => 0x7a4e, 0x3150 => 0x9834, 0x3151 => 0x82f1, 0x3152 => 0x885b,
+  0x3153 => 0x8a60, 0x3154 => 0x92ed, 0x3155 => 0x6db2, 0x3156 => 0x75ab,
+  0x3157 => 0x76ca, 0x3158 => 0x99c5, 0x3159 => 0x60a6, 0x315a => 0x8b01,
+  0x315b => 0x8d8a, 0x315c => 0x95b2, 0x315d => 0x698e, 0x315e => 0x53ad,
+  0x315f => 0x5186, 0x3160 => 0x5712, 0x3161 => 0x5830, 0x3162 => 0x5944,
+  0x3163 => 0x5bb4, 0x3164 => 0x5ef6, 0x3165 => 0x6028, 0x3166 => 0x63a9,
+  0x3167 => 0x63f4, 0x3168 => 0x6cbf, 0x3169 => 0x6f14, 0x316a => 0x708e,
+  0x316b => 0x7114, 0x316c => 0x7159, 0x316d => 0x71d5, 0x316e => 0x733f,
+  0x316f => 0x7e01, 0x3170 => 0x8276, 0x3171 => 0x82d1, 0x3172 => 0x8597,
+  0x3173 => 0x9060, 0x3174 => 0x925b, 0x3175 => 0x9d1b, 0x3176 => 0x5869,
+  0x3177 => 0x65bc, 0x3178 => 0x6c5a, 0x3179 => 0x7525, 0x317a => 0x51f9,
+  0x317b => 0x592e, 0x317c => 0x5965, 0x317d => 0x5f80, 0x317e => 0x5fdc,
+  0x3221 => 0x62bc, 0x3222 => 0x65fa, 0x3223 => 0x6a2a, 0x3224 => 0x6b27,
+  0x3225 => 0x6bb4, 0x3226 => 0x738b, 0x3227 => 0x7fc1, 0x3228 => 0x8956,
+  0x3229 => 0x9d2c, 0x322a => 0x9d0e, 0x322b => 0x9ec4, 0x322c => 0x5ca1,
+  0x322d => 0x6c96, 0x322e => 0x837b, 0x322f => 0x5104, 0x3230 => 0x5c4b,
+  0x3231 => 0x61b6, 0x3232 => 0x81c6, 0x3233 => 0x6876, 0x3234 => 0x7261,
+  0x3235 => 0x4e59, 0x3236 => 0x4ffa, 0x3237 => 0x5378, 0x3238 => 0x6069,
+  0x3239 => 0x6e29, 0x323a => 0x7a4f, 0x323b => 0x97f3, 0x323c => 0x4e0b,
+  0x323d => 0x5316, 0x323e => 0x4eee, 0x323f => 0x4f55, 0x3240 => 0x4f3d,
+  0x3241 => 0x4fa1, 0x3242 => 0x4f73, 0x3243 => 0x52a0, 0x3244 => 0x53ef,
+  0x3245 => 0x5609, 0x3246 => 0x590f, 0x3247 => 0x5ac1, 0x3248 => 0x5bb6,
+  0x3249 => 0x5be1, 0x324a => 0x79d1, 0x324b => 0x6687, 0x324c => 0x679c,
+  0x324d => 0x67b6, 0x324e => 0x6b4c, 0x324f => 0x6cb3, 0x3250 => 0x706b,
+  0x3251 => 0x73c2, 0x3252 => 0x798d, 0x3253 => 0x79be, 0x3254 => 0x7a3c,
+  0x3255 => 0x7b87, 0x3256 => 0x82b1, 0x3257 => 0x82db, 0x3258 => 0x8304,
+  0x3259 => 0x8377, 0x325a => 0x83ef, 0x325b => 0x83d3, 0x325c => 0x8766,
+  0x325d => 0x8ab2, 0x325e => 0x5629, 0x325f => 0x8ca8, 0x3260 => 0x8fe6,
+  0x3261 => 0x904e, 0x3262 => 0x971e, 0x3263 => 0x868a, 0x3264 => 0x4fc4,
+  0x3265 => 0x5ce8, 0x3266 => 0x6211, 0x3267 => 0x7259, 0x3268 => 0x753b,
+  0x3269 => 0x81e5, 0x326a => 0x82bd, 0x326b => 0x86fe, 0x326c => 0x8cc0,
+  0x326d => 0x96c5, 0x326e => 0x9913, 0x326f => 0x99d5, 0x3270 => 0x4ecb,
+  0x3271 => 0x4f1a, 0x3272 => 0x89e3, 0x3273 => 0x56de, 0x3274 => 0x584a,
+  0x3275 => 0x58ca, 0x3276 => 0x5efb, 0x3277 => 0x5feb, 0x3278 => 0x602a,
+  0x3279 => 0x6094, 0x327a => 0x6062, 0x327b => 0x61d0, 0x327c => 0x6212,
+  0x327d => 0x62d0, 0x327e => 0x6539, 0x3321 => 0x9b41, 0x3322 => 0x6666,
+  0x3323 => 0x68b0, 0x3324 => 0x6d77, 0x3325 => 0x7070, 0x3326 => 0x754c,
+  0x3327 => 0x7686, 0x3328 => 0x7d75, 0x3329 => 0x82a5, 0x332a => 0x87f9,
+  0x332b => 0x958b, 0x332c => 0x968e, 0x332d => 0x8c9d, 0x332e => 0x51f1,
+  0x332f => 0x52be, 0x3330 => 0x5916, 0x3331 => 0x54b3, 0x3332 => 0x5bb3,
+  0x3333 => 0x5d16, 0x3334 => 0x6168, 0x3335 => 0x6982, 0x3336 => 0x6daf,
+  0x3337 => 0x788d, 0x3338 => 0x84cb, 0x3339 => 0x8857, 0x333a => 0x8a72,
+  0x333b => 0x93a7, 0x333c => 0x9ab8, 0x333d => 0x6d6c, 0x333e => 0x99a8,
+  0x333f => 0x86d9, 0x3340 => 0x57a3, 0x3341 => 0x67ff, 0x3342 => 0x86ce,
+  0x3343 => 0x920e, 0x3344 => 0x5283, 0x3345 => 0x5687, 0x3346 => 0x5404,
+  0x3347 => 0x5ed3, 0x3348 => 0x62e1, 0x3349 => 0x64b9, 0x334a => 0x683c,
+  0x334b => 0x6838, 0x334c => 0x6bbb, 0x334d => 0x7372, 0x334e => 0x78ba,
+  0x334f => 0x7a6b, 0x3350 => 0x899a, 0x3351 => 0x89d2, 0x3352 => 0x8d6b,
+  0x3353 => 0x8f03, 0x3354 => 0x90ed, 0x3355 => 0x95a3, 0x3356 => 0x9694,
+  0x3357 => 0x9769, 0x3358 => 0x5b66, 0x3359 => 0x5cb3, 0x335a => 0x697d,
+  0x335b => 0x984d, 0x335c => 0x984e, 0x335d => 0x639b, 0x335e => 0x7b20,
+  0x335f => 0x6a2b, 0x3360 => 0x6a7f, 0x3361 => 0x68b6, 0x3362 => 0x9c0d,
+  0x3363 => 0x6f5f, 0x3364 => 0x5272, 0x3365 => 0x559d, 0x3366 => 0x6070,
+  0x3367 => 0x62ec, 0x3368 => 0x6d3b, 0x3369 => 0x6e07, 0x336a => 0x6ed1,
+  0x336b => 0x845b, 0x336c => 0x8910, 0x336d => 0x8f44, 0x336e => 0x4e14,
+  0x336f => 0x9c39, 0x3370 => 0x53f6, 0x3371 => 0x691b, 0x3372 => 0x6a3a,
+  0x3373 => 0x9784, 0x3374 => 0x682a, 0x3375 => 0x515c, 0x3376 => 0x7ac3,
+  0x3377 => 0x84b2, 0x3378 => 0x91dc, 0x3379 => 0x938c, 0x337a => 0x565b,
+  0x337b => 0x9d28, 0x337c => 0x6822, 0x337d => 0x8305, 0x337e => 0x8431,
+  0x3421 => 0x7ca5, 0x3422 => 0x5208, 0x3423 => 0x82c5, 0x3424 => 0x74e6,
+  0x3425 => 0x4e7e, 0x3426 => 0x4f83, 0x3427 => 0x51a0, 0x3428 => 0x5bd2,
+  0x3429 => 0x520a, 0x342a => 0x52d8, 0x342b => 0x52e7, 0x342c => 0x5dfb,
+  0x342d => 0x559a, 0x342e => 0x582a, 0x342f => 0x59e6, 0x3430 => 0x5b8c,
+  0x3431 => 0x5b98, 0x3432 => 0x5bdb, 0x3433 => 0x5e72, 0x3434 => 0x5e79,
+  0x3435 => 0x60a3, 0x3436 => 0x611f, 0x3437 => 0x6163, 0x3438 => 0x61be,
+  0x3439 => 0x63db, 0x343a => 0x6562, 0x343b => 0x67d1, 0x343c => 0x6853,
+  0x343d => 0x68fa, 0x343e => 0x6b3e, 0x343f => 0x6b53, 0x3440 => 0x6c57,
+  0x3441 => 0x6f22, 0x3442 => 0x6f97, 0x3443 => 0x6f45, 0x3444 => 0x74b0,
+  0x3445 => 0x7518, 0x3446 => 0x76e3, 0x3447 => 0x770b, 0x3448 => 0x7aff,
+  0x3449 => 0x7ba1, 0x344a => 0x7c21, 0x344b => 0x7de9, 0x344c => 0x7f36,
+  0x344d => 0x7ff0, 0x344e => 0x809d, 0x344f => 0x8266, 0x3450 => 0x839e,
+  0x3451 => 0x89b3, 0x3452 => 0x8acc, 0x3453 => 0x8cab, 0x3454 => 0x9084,
+  0x3455 => 0x9451, 0x3456 => 0x9593, 0x3457 => 0x9591, 0x3458 => 0x95a2,
+  0x3459 => 0x9665, 0x345a => 0x97d3, 0x345b => 0x9928, 0x345c => 0x8218,
+  0x345d => 0x4e38, 0x345e => 0x542b, 0x345f => 0x5cb8, 0x3460 => 0x5dcc,
+  0x3461 => 0x73a9, 0x3462 => 0x764c, 0x3463 => 0x773c, 0x3464 => 0x5ca9,
+  0x3465 => 0x7feb, 0x3466 => 0x8d0b, 0x3467 => 0x96c1, 0x3468 => 0x9811,
+  0x3469 => 0x9854, 0x346a => 0x9858, 0x346b => 0x4f01, 0x346c => 0x4f0e,
+  0x346d => 0x5371, 0x346e => 0x559c, 0x346f => 0x5668, 0x3470 => 0x57fa,
+  0x3471 => 0x5947, 0x3472 => 0x5b09, 0x3473 => 0x5bc4, 0x3474 => 0x5c90,
+  0x3475 => 0x5e0c, 0x3476 => 0x5e7e, 0x3477 => 0x5fcc, 0x3478 => 0x63ee,
+  0x3479 => 0x673a, 0x347a => 0x65d7, 0x347b => 0x65e2, 0x347c => 0x671f,
+  0x347d => 0x68cb, 0x347e => 0x68c4, 0x3521 => 0x6a5f, 0x3522 => 0x5e30,
+  0x3523 => 0x6bc5, 0x3524 => 0x6c17, 0x3525 => 0x6c7d, 0x3526 => 0x757f,
+  0x3527 => 0x7948, 0x3528 => 0x5b63, 0x3529 => 0x7a00, 0x352a => 0x7d00,
+  0x352b => 0x5fbd, 0x352c => 0x898f, 0x352d => 0x8a18, 0x352e => 0x8cb4,
+  0x352f => 0x8d77, 0x3530 => 0x8ecc, 0x3531 => 0x8f1d, 0x3532 => 0x98e2,
+  0x3533 => 0x9a0e, 0x3534 => 0x9b3c, 0x3535 => 0x4e80, 0x3536 => 0x507d,
+  0x3537 => 0x5100, 0x3538 => 0x5993, 0x3539 => 0x5b9c, 0x353a => 0x622f,
+  0x353b => 0x6280, 0x353c => 0x64ec, 0x353d => 0x6b3a, 0x353e => 0x72a0,
+  0x353f => 0x7591, 0x3540 => 0x7947, 0x3541 => 0x7fa9, 0x3542 => 0x87fb,
+  0x3543 => 0x8abc, 0x3544 => 0x8b70, 0x3545 => 0x63ac, 0x3546 => 0x83ca,
+  0x3547 => 0x97a0, 0x3548 => 0x5409, 0x3549 => 0x5403, 0x354a => 0x55ab,
+  0x354b => 0x6854, 0x354c => 0x6a58, 0x354d => 0x8a70, 0x354e => 0x7827,
+  0x354f => 0x6775, 0x3550 => 0x9ecd, 0x3551 => 0x5374, 0x3552 => 0x5ba2,
+  0x3553 => 0x811a, 0x3554 => 0x8650, 0x3555 => 0x9006, 0x3556 => 0x4e18,
+  0x3557 => 0x4e45, 0x3558 => 0x4ec7, 0x3559 => 0x4f11, 0x355a => 0x53ca,
+  0x355b => 0x5438, 0x355c => 0x5bae, 0x355d => 0x5f13, 0x355e => 0x6025,
+  0x355f => 0x6551, 0x3560 => 0x673d, 0x3561 => 0x6c42, 0x3562 => 0x6c72,
+  0x3563 => 0x6ce3, 0x3564 => 0x7078, 0x3565 => 0x7403, 0x3566 => 0x7a76,
+  0x3567 => 0x7aae, 0x3568 => 0x7b08, 0x3569 => 0x7d1a, 0x356a => 0x7cfe,
+  0x356b => 0x7d66, 0x356c => 0x65e7, 0x356d => 0x725b, 0x356e => 0x53bb,
+  0x356f => 0x5c45, 0x3570 => 0x5de8, 0x3571 => 0x62d2, 0x3572 => 0x62e0,
+  0x3573 => 0x6319, 0x3574 => 0x6e20, 0x3575 => 0x865a, 0x3576 => 0x8a31,
+  0x3577 => 0x8ddd, 0x3578 => 0x92f8, 0x3579 => 0x6f01, 0x357a => 0x79a6,
+  0x357b => 0x9b5a, 0x357c => 0x4ea8, 0x357d => 0x4eab, 0x357e => 0x4eac,
+  0x3621 => 0x4f9b, 0x3622 => 0x4fa0, 0x3623 => 0x50d1, 0x3624 => 0x5147,
+  0x3625 => 0x7af6, 0x3626 => 0x5171, 0x3627 => 0x51f6, 0x3628 => 0x5354,
+  0x3629 => 0x5321, 0x362a => 0x537f, 0x362b => 0x53eb, 0x362c => 0x55ac,
+  0x362d => 0x5883, 0x362e => 0x5ce1, 0x362f => 0x5f37, 0x3630 => 0x5f4a,
+  0x3631 => 0x602f, 0x3632 => 0x6050, 0x3633 => 0x606d, 0x3634 => 0x631f,
+  0x3635 => 0x6559, 0x3636 => 0x6a4b, 0x3637 => 0x6cc1, 0x3638 => 0x72c2,
+  0x3639 => 0x72ed, 0x363a => 0x77ef, 0x363b => 0x80f8, 0x363c => 0x8105,
+  0x363d => 0x8208, 0x363e => 0x854e, 0x363f => 0x90f7, 0x3640 => 0x93e1,
+  0x3641 => 0x97ff, 0x3642 => 0x9957, 0x3643 => 0x9a5a, 0x3644 => 0x4ef0,
+  0x3645 => 0x51dd, 0x3646 => 0x5c2d, 0x3647 => 0x6681, 0x3648 => 0x696d,
+  0x3649 => 0x5c40, 0x364a => 0x66f2, 0x364b => 0x6975, 0x364c => 0x7389,
+  0x364d => 0x6850, 0x364e => 0x7c81, 0x364f => 0x50c5, 0x3650 => 0x52e4,
+  0x3651 => 0x5747, 0x3652 => 0x5dfe, 0x3653 => 0x9326, 0x3654 => 0x65a4,
+  0x3655 => 0x6b23, 0x3656 => 0x6b3d, 0x3657 => 0x7434, 0x3658 => 0x7981,
+  0x3659 => 0x79bd, 0x365a => 0x7b4b, 0x365b => 0x7dca, 0x365c => 0x82b9,
+  0x365d => 0x83cc, 0x365e => 0x887f, 0x365f => 0x895f, 0x3660 => 0x8b39,
+  0x3661 => 0x8fd1, 0x3662 => 0x91d1, 0x3663 => 0x541f, 0x3664 => 0x9280,
+  0x3665 => 0x4e5d, 0x3666 => 0x5036, 0x3667 => 0x53e5, 0x3668 => 0x533a,
+  0x3669 => 0x72d7, 0x366a => 0x7396, 0x366b => 0x77e9, 0x366c => 0x82e6,
+  0x366d => 0x8eaf, 0x366e => 0x99c6, 0x366f => 0x99c8, 0x3670 => 0x99d2,
+  0x3671 => 0x5177, 0x3672 => 0x611a, 0x3673 => 0x865e, 0x3674 => 0x55b0,
+  0x3675 => 0x7a7a, 0x3676 => 0x5076, 0x3677 => 0x5bd3, 0x3678 => 0x9047,
+  0x3679 => 0x9685, 0x367a => 0x4e32, 0x367b => 0x6adb, 0x367c => 0x91e7,
+  0x367d => 0x5c51, 0x367e => 0x5c48, 0x3721 => 0x6398, 0x3722 => 0x7a9f,
+  0x3723 => 0x6c93, 0x3724 => 0x9774, 0x3725 => 0x8f61, 0x3726 => 0x7aaa,
+  0x3727 => 0x718a, 0x3728 => 0x9688, 0x3729 => 0x7c82, 0x372a => 0x6817,
+  0x372b => 0x7e70, 0x372c => 0x6851, 0x372d => 0x936c, 0x372e => 0x52f2,
+  0x372f => 0x541b, 0x3730 => 0x85ab, 0x3731 => 0x8a13, 0x3732 => 0x7fa4,
+  0x3733 => 0x8ecd, 0x3734 => 0x90e1, 0x3735 => 0x5366, 0x3736 => 0x8888,
+  0x3737 => 0x7941, 0x3738 => 0x4fc2, 0x3739 => 0x50be, 0x373a => 0x5211,
+  0x373b => 0x5144, 0x373c => 0x5553, 0x373d => 0x572d, 0x373e => 0x73ea,
+  0x373f => 0x578b, 0x3740 => 0x5951, 0x3741 => 0x5f62, 0x3742 => 0x5f84,
+  0x3743 => 0x6075, 0x3744 => 0x6176, 0x3745 => 0x6167, 0x3746 => 0x61a9,
+  0x3747 => 0x63b2, 0x3748 => 0x643a, 0x3749 => 0x656c, 0x374a => 0x666f,
+  0x374b => 0x6842, 0x374c => 0x6e13, 0x374d => 0x7566, 0x374e => 0x7a3d,
+  0x374f => 0x7cfb, 0x3750 => 0x7d4c, 0x3751 => 0x7d99, 0x3752 => 0x7e4b,
+  0x3753 => 0x7f6b, 0x3754 => 0x830e, 0x3755 => 0x834a, 0x3756 => 0x86cd,
+  0x3757 => 0x8a08, 0x3758 => 0x8a63, 0x3759 => 0x8b66, 0x375a => 0x8efd,
+  0x375b => 0x981a, 0x375c => 0x9d8f, 0x375d => 0x82b8, 0x375e => 0x8fce,
+  0x375f => 0x9be8, 0x3760 => 0x5287, 0x3761 => 0x621f, 0x3762 => 0x6483,
+  0x3763 => 0x6fc0, 0x3764 => 0x9699, 0x3765 => 0x6841, 0x3766 => 0x5091,
+  0x3767 => 0x6b20, 0x3768 => 0x6c7a, 0x3769 => 0x6f54, 0x376a => 0x7a74,
+  0x376b => 0x7d50, 0x376c => 0x8840, 0x376d => 0x8a23, 0x376e => 0x6708,
+  0x376f => 0x4ef6, 0x3770 => 0x5039, 0x3771 => 0x5026, 0x3772 => 0x5065,
+  0x3773 => 0x517c, 0x3774 => 0x5238, 0x3775 => 0x5263, 0x3776 => 0x55a7,
+  0x3777 => 0x570f, 0x3778 => 0x5805, 0x3779 => 0x5acc, 0x377a => 0x5efa,
+  0x377b => 0x61b2, 0x377c => 0x61f8, 0x377d => 0x62f3, 0x377e => 0x6372,
+  0x3821 => 0x691c, 0x3822 => 0x6a29, 0x3823 => 0x727d, 0x3824 => 0x72ac,
+  0x3825 => 0x732e, 0x3826 => 0x7814, 0x3827 => 0x786f, 0x3828 => 0x7d79,
+  0x3829 => 0x770c, 0x382a => 0x80a9, 0x382b => 0x898b, 0x382c => 0x8b19,
+  0x382d => 0x8ce2, 0x382e => 0x8ed2, 0x382f => 0x9063, 0x3830 => 0x9375,
+  0x3831 => 0x967a, 0x3832 => 0x9855, 0x3833 => 0x9a13, 0x3834 => 0x9e78,
+  0x3835 => 0x5143, 0x3836 => 0x539f, 0x3837 => 0x53b3, 0x3838 => 0x5e7b,
+  0x3839 => 0x5f26, 0x383a => 0x6e1b, 0x383b => 0x6e90, 0x383c => 0x7384,
+  0x383d => 0x73fe, 0x383e => 0x7d43, 0x383f => 0x8237, 0x3840 => 0x8a00,
+  0x3841 => 0x8afa, 0x3842 => 0x9650, 0x3843 => 0x4e4e, 0x3844 => 0x500b,
+  0x3845 => 0x53e4, 0x3846 => 0x547c, 0x3847 => 0x56fa, 0x3848 => 0x59d1,
+  0x3849 => 0x5b64, 0x384a => 0x5df1, 0x384b => 0x5eab, 0x384c => 0x5f27,
+  0x384d => 0x6238, 0x384e => 0x6545, 0x384f => 0x67af, 0x3850 => 0x6e56,
+  0x3851 => 0x72d0, 0x3852 => 0x7cca, 0x3853 => 0x88b4, 0x3854 => 0x80a1,
+  0x3855 => 0x80e1, 0x3856 => 0x83f0, 0x3857 => 0x864e, 0x3858 => 0x8a87,
+  0x3859 => 0x8de8, 0x385a => 0x9237, 0x385b => 0x96c7, 0x385c => 0x9867,
+  0x385d => 0x9f13, 0x385e => 0x4e94, 0x385f => 0x4e92, 0x3860 => 0x4f0d,
+  0x3861 => 0x5348, 0x3862 => 0x5449, 0x3863 => 0x543e, 0x3864 => 0x5a2f,
+  0x3865 => 0x5f8c, 0x3866 => 0x5fa1, 0x3867 => 0x609f, 0x3868 => 0x68a7,
+  0x3869 => 0x6a8e, 0x386a => 0x745a, 0x386b => 0x7881, 0x386c => 0x8a9e,
+  0x386d => 0x8aa4, 0x386e => 0x8b77, 0x386f => 0x9190, 0x3870 => 0x4e5e,
+  0x3871 => 0x9bc9, 0x3872 => 0x4ea4, 0x3873 => 0x4f7c, 0x3874 => 0x4faf,
+  0x3875 => 0x5019, 0x3876 => 0x5016, 0x3877 => 0x5149, 0x3878 => 0x516c,
+  0x3879 => 0x529f, 0x387a => 0x52b9, 0x387b => 0x52fe, 0x387c => 0x539a,
+  0x387d => 0x53e3, 0x387e => 0x5411, 0x3921 => 0x540e, 0x3922 => 0x5589,
+  0x3923 => 0x5751, 0x3924 => 0x57a2, 0x3925 => 0x597d, 0x3926 => 0x5b54,
+  0x3927 => 0x5b5d, 0x3928 => 0x5b8f, 0x3929 => 0x5de5, 0x392a => 0x5de7,
+  0x392b => 0x5df7, 0x392c => 0x5e78, 0x392d => 0x5e83, 0x392e => 0x5e9a,
+  0x392f => 0x5eb7, 0x3930 => 0x5f18, 0x3931 => 0x6052, 0x3932 => 0x614c,
+  0x3933 => 0x6297, 0x3934 => 0x62d8, 0x3935 => 0x63a7, 0x3936 => 0x653b,
+  0x3937 => 0x6602, 0x3938 => 0x6643, 0x3939 => 0x66f4, 0x393a => 0x676d,
+  0x393b => 0x6821, 0x393c => 0x6897, 0x393d => 0x69cb, 0x393e => 0x6c5f,
+  0x393f => 0x6d2a, 0x3940 => 0x6d69, 0x3941 => 0x6e2f, 0x3942 => 0x6e9d,
+  0x3943 => 0x7532, 0x3944 => 0x7687, 0x3945 => 0x786c, 0x3946 => 0x7a3f,
+  0x3947 => 0x7ce0, 0x3948 => 0x7d05, 0x3949 => 0x7d18, 0x394a => 0x7d5e,
+  0x394b => 0x7db1, 0x394c => 0x8015, 0x394d => 0x8003, 0x394e => 0x80af,
+  0x394f => 0x80b1, 0x3950 => 0x8154, 0x3951 => 0x818f, 0x3952 => 0x822a,
+  0x3953 => 0x8352, 0x3954 => 0x884c, 0x3955 => 0x8861, 0x3956 => 0x8b1b,
+  0x3957 => 0x8ca2, 0x3958 => 0x8cfc, 0x3959 => 0x90ca, 0x395a => 0x9175,
+  0x395b => 0x9271, 0x395c => 0x783f, 0x395d => 0x92fc, 0x395e => 0x95a4,
+  0x395f => 0x964d, 0x3960 => 0x9805, 0x3961 => 0x9999, 0x3962 => 0x9ad8,
+  0x3963 => 0x9d3b, 0x3964 => 0x525b, 0x3965 => 0x52ab, 0x3966 => 0x53f7,
+  0x3967 => 0x5408, 0x3968 => 0x58d5, 0x3969 => 0x62f7, 0x396a => 0x6fe0,
+  0x396b => 0x8c6a, 0x396c => 0x8f5f, 0x396d => 0x9eb9, 0x396e => 0x514b,
+  0x396f => 0x523b, 0x3970 => 0x544a, 0x3971 => 0x56fd, 0x3972 => 0x7a40,
+  0x3973 => 0x9177, 0x3974 => 0x9d60, 0x3975 => 0x9ed2, 0x3976 => 0x7344,
+  0x3977 => 0x6f09, 0x3978 => 0x8170, 0x3979 => 0x7511, 0x397a => 0x5ffd,
+  0x397b => 0x60da, 0x397c => 0x9aa8, 0x397d => 0x72db, 0x397e => 0x8fbc,
+  0x3a21 => 0x6b64, 0x3a22 => 0x9803, 0x3a23 => 0x4eca, 0x3a24 => 0x56f0,
+  0x3a25 => 0x5764, 0x3a26 => 0x58be, 0x3a27 => 0x5a5a, 0x3a28 => 0x6068,
+  0x3a29 => 0x61c7, 0x3a2a => 0x660f, 0x3a2b => 0x6606, 0x3a2c => 0x6839,
+  0x3a2d => 0x68b1, 0x3a2e => 0x6df7, 0x3a2f => 0x75d5, 0x3a30 => 0x7d3a,
+  0x3a31 => 0x826e, 0x3a32 => 0x9b42, 0x3a33 => 0x4e9b, 0x3a34 => 0x4f50,
+  0x3a35 => 0x53c9, 0x3a36 => 0x5506, 0x3a37 => 0x5d6f, 0x3a38 => 0x5de6,
+  0x3a39 => 0x5dee, 0x3a3a => 0x67fb, 0x3a3b => 0x6c99, 0x3a3c => 0x7473,
+  0x3a3d => 0x7802, 0x3a3e => 0x8a50, 0x3a3f => 0x9396, 0x3a40 => 0x88df,
+  0x3a41 => 0x5750, 0x3a42 => 0x5ea7, 0x3a43 => 0x632b, 0x3a44 => 0x50b5,
+  0x3a45 => 0x50ac, 0x3a46 => 0x518d, 0x3a47 => 0x6700, 0x3a48 => 0x54c9,
+  0x3a49 => 0x585e, 0x3a4a => 0x59bb, 0x3a4b => 0x5bb0, 0x3a4c => 0x5f69,
+  0x3a4d => 0x624d, 0x3a4e => 0x63a1, 0x3a4f => 0x683d, 0x3a50 => 0x6b73,
+  0x3a51 => 0x6e08, 0x3a52 => 0x707d, 0x3a53 => 0x91c7, 0x3a54 => 0x7280,
+  0x3a55 => 0x7815, 0x3a56 => 0x7826, 0x3a57 => 0x796d, 0x3a58 => 0x658e,
+  0x3a59 => 0x7d30, 0x3a5a => 0x83dc, 0x3a5b => 0x88c1, 0x3a5c => 0x8f09,
+  0x3a5d => 0x969b, 0x3a5e => 0x5264, 0x3a5f => 0x5728, 0x3a60 => 0x6750,
+  0x3a61 => 0x7f6a, 0x3a62 => 0x8ca1, 0x3a63 => 0x51b4, 0x3a64 => 0x5742,
+  0x3a65 => 0x962a, 0x3a66 => 0x583a, 0x3a67 => 0x698a, 0x3a68 => 0x80b4,
+  0x3a69 => 0x54b2, 0x3a6a => 0x5d0e, 0x3a6b => 0x57fc, 0x3a6c => 0x7895,
+  0x3a6d => 0x9dfa, 0x3a6e => 0x4f5c, 0x3a6f => 0x524a, 0x3a70 => 0x548b,
+  0x3a71 => 0x643e, 0x3a72 => 0x6628, 0x3a73 => 0x6714, 0x3a74 => 0x67f5,
+  0x3a75 => 0x7a84, 0x3a76 => 0x7b56, 0x3a77 => 0x7d22, 0x3a78 => 0x932f,
+  0x3a79 => 0x685c, 0x3a7a => 0x9bad, 0x3a7b => 0x7b39, 0x3a7c => 0x5319,
+  0x3a7d => 0x518a, 0x3a7e => 0x5237, 0x3b21 => 0x5bdf, 0x3b22 => 0x62f6,
+  0x3b23 => 0x64ae, 0x3b24 => 0x64e6, 0x3b25 => 0x672d, 0x3b26 => 0x6bba,
+  0x3b27 => 0x85a9, 0x3b28 => 0x96d1, 0x3b29 => 0x7690, 0x3b2a => 0x9bd6,
+  0x3b2b => 0x634c, 0x3b2c => 0x9306, 0x3b2d => 0x9bab, 0x3b2e => 0x76bf,
+  0x3b2f => 0x6652, 0x3b30 => 0x4e09, 0x3b31 => 0x5098, 0x3b32 => 0x53c2,
+  0x3b33 => 0x5c71, 0x3b34 => 0x60e8, 0x3b35 => 0x6492, 0x3b36 => 0x6563,
+  0x3b37 => 0x685f, 0x3b38 => 0x71e6, 0x3b39 => 0x73ca, 0x3b3a => 0x7523,
+  0x3b3b => 0x7b97, 0x3b3c => 0x7e82, 0x3b3d => 0x8695, 0x3b3e => 0x8b83,
+  0x3b3f => 0x8cdb, 0x3b40 => 0x9178, 0x3b41 => 0x9910, 0x3b42 => 0x65ac,
+  0x3b43 => 0x66ab, 0x3b44 => 0x6b8b, 0x3b45 => 0x4ed5, 0x3b46 => 0x4ed4,
+  0x3b47 => 0x4f3a, 0x3b48 => 0x4f7f, 0x3b49 => 0x523a, 0x3b4a => 0x53f8,
+  0x3b4b => 0x53f2, 0x3b4c => 0x55e3, 0x3b4d => 0x56db, 0x3b4e => 0x58eb,
+  0x3b4f => 0x59cb, 0x3b50 => 0x59c9, 0x3b51 => 0x59ff, 0x3b52 => 0x5b50,
+  0x3b53 => 0x5c4d, 0x3b54 => 0x5e02, 0x3b55 => 0x5e2b, 0x3b56 => 0x5fd7,
+  0x3b57 => 0x601d, 0x3b58 => 0x6307, 0x3b59 => 0x652f, 0x3b5a => 0x5b5c,
+  0x3b5b => 0x65af, 0x3b5c => 0x65bd, 0x3b5d => 0x65e8, 0x3b5e => 0x679d,
+  0x3b5f => 0x6b62, 0x3b60 => 0x6b7b, 0x3b61 => 0x6c0f, 0x3b62 => 0x7345,
+  0x3b63 => 0x7949, 0x3b64 => 0x79c1, 0x3b65 => 0x7cf8, 0x3b66 => 0x7d19,
+  0x3b67 => 0x7d2b, 0x3b68 => 0x80a2, 0x3b69 => 0x8102, 0x3b6a => 0x81f3,
+  0x3b6b => 0x8996, 0x3b6c => 0x8a5e, 0x3b6d => 0x8a69, 0x3b6e => 0x8a66,
+  0x3b6f => 0x8a8c, 0x3b70 => 0x8aee, 0x3b71 => 0x8cc7, 0x3b72 => 0x8cdc,
+  0x3b73 => 0x96cc, 0x3b74 => 0x98fc, 0x3b75 => 0x6b6f, 0x3b76 => 0x4e8b,
+  0x3b77 => 0x4f3c, 0x3b78 => 0x4f8d, 0x3b79 => 0x5150, 0x3b7a => 0x5b57,
+  0x3b7b => 0x5bfa, 0x3b7c => 0x6148, 0x3b7d => 0x6301, 0x3b7e => 0x6642,
+  0x3c21 => 0x6b21, 0x3c22 => 0x6ecb, 0x3c23 => 0x6cbb, 0x3c24 => 0x723e,
+  0x3c25 => 0x74bd, 0x3c26 => 0x75d4, 0x3c27 => 0x78c1, 0x3c28 => 0x793a,
+  0x3c29 => 0x800c, 0x3c2a => 0x8033, 0x3c2b => 0x81ea, 0x3c2c => 0x8494,
+  0x3c2d => 0x8f9e, 0x3c2e => 0x6c50, 0x3c2f => 0x9e7f, 0x3c30 => 0x5f0f,
+  0x3c31 => 0x8b58, 0x3c32 => 0x9d2b, 0x3c33 => 0x7afa, 0x3c34 => 0x8ef8,
+  0x3c35 => 0x5b8d, 0x3c36 => 0x96eb, 0x3c37 => 0x4e03, 0x3c38 => 0x53f1,
+  0x3c39 => 0x57f7, 0x3c3a => 0x5931, 0x3c3b => 0x5ac9, 0x3c3c => 0x5ba4,
+  0x3c3d => 0x6089, 0x3c3e => 0x6e7f, 0x3c3f => 0x6f06, 0x3c40 => 0x75be,
+  0x3c41 => 0x8cea, 0x3c42 => 0x5b9f, 0x3c43 => 0x8500, 0x3c44 => 0x7be0,
+  0x3c45 => 0x5072, 0x3c46 => 0x67f4, 0x3c47 => 0x829d, 0x3c48 => 0x5c61,
+  0x3c49 => 0x854a, 0x3c4a => 0x7e1e, 0x3c4b => 0x820e, 0x3c4c => 0x5199,
+  0x3c4d => 0x5c04, 0x3c4e => 0x6368, 0x3c4f => 0x8d66, 0x3c50 => 0x659c,
+  0x3c51 => 0x716e, 0x3c52 => 0x793e, 0x3c53 => 0x7d17, 0x3c54 => 0x8005,
+  0x3c55 => 0x8b1d, 0x3c56 => 0x8eca, 0x3c57 => 0x906e, 0x3c58 => 0x86c7,
+  0x3c59 => 0x90aa, 0x3c5a => 0x501f, 0x3c5b => 0x52fa, 0x3c5c => 0x5c3a,
+  0x3c5d => 0x6753, 0x3c5e => 0x707c, 0x3c5f => 0x7235, 0x3c60 => 0x914c,
+  0x3c61 => 0x91c8, 0x3c62 => 0x932b, 0x3c63 => 0x82e5, 0x3c64 => 0x5bc2,
+  0x3c65 => 0x5f31, 0x3c66 => 0x60f9, 0x3c67 => 0x4e3b, 0x3c68 => 0x53d6,
+  0x3c69 => 0x5b88, 0x3c6a => 0x624b, 0x3c6b => 0x6731, 0x3c6c => 0x6b8a,
+  0x3c6d => 0x72e9, 0x3c6e => 0x73e0, 0x3c6f => 0x7a2e, 0x3c70 => 0x816b,
+  0x3c71 => 0x8da3, 0x3c72 => 0x9152, 0x3c73 => 0x9996, 0x3c74 => 0x5112,
+  0x3c75 => 0x53d7, 0x3c76 => 0x546a, 0x3c77 => 0x5bff, 0x3c78 => 0x6388,
+  0x3c79 => 0x6a39, 0x3c7a => 0x7dac, 0x3c7b => 0x9700, 0x3c7c => 0x56da,
+  0x3c7d => 0x53ce, 0x3c7e => 0x5468, 0x3d21 => 0x5b97, 0x3d22 => 0x5c31,
+  0x3d23 => 0x5dde, 0x3d24 => 0x4fee, 0x3d25 => 0x6101, 0x3d26 => 0x62fe,
+  0x3d27 => 0x6d32, 0x3d28 => 0x79c0, 0x3d29 => 0x79cb, 0x3d2a => 0x7d42,
+  0x3d2b => 0x7e4d, 0x3d2c => 0x7fd2, 0x3d2d => 0x81ed, 0x3d2e => 0x821f,
+  0x3d2f => 0x8490, 0x3d30 => 0x8846, 0x3d31 => 0x8972, 0x3d32 => 0x8b90,
+  0x3d33 => 0x8e74, 0x3d34 => 0x8f2f, 0x3d35 => 0x9031, 0x3d36 => 0x914b,
+  0x3d37 => 0x916c, 0x3d38 => 0x96c6, 0x3d39 => 0x919c, 0x3d3a => 0x4ec0,
+  0x3d3b => 0x4f4f, 0x3d3c => 0x5145, 0x3d3d => 0x5341, 0x3d3e => 0x5f93,
+  0x3d3f => 0x620e, 0x3d40 => 0x67d4, 0x3d41 => 0x6c41, 0x3d42 => 0x6e0b,
+  0x3d43 => 0x7363, 0x3d44 => 0x7e26, 0x3d45 => 0x91cd, 0x3d46 => 0x9283,
+  0x3d47 => 0x53d4, 0x3d48 => 0x5919, 0x3d49 => 0x5bbf, 0x3d4a => 0x6dd1,
+  0x3d4b => 0x795d, 0x3d4c => 0x7e2e, 0x3d4d => 0x7c9b, 0x3d4e => 0x587e,
+  0x3d4f => 0x719f, 0x3d50 => 0x51fa, 0x3d51 => 0x8853, 0x3d52 => 0x8ff0,
+  0x3d53 => 0x4fca, 0x3d54 => 0x5cfb, 0x3d55 => 0x6625, 0x3d56 => 0x77ac,
+  0x3d57 => 0x7ae3, 0x3d58 => 0x821c, 0x3d59 => 0x99ff, 0x3d5a => 0x51c6,
+  0x3d5b => 0x5faa, 0x3d5c => 0x65ec, 0x3d5d => 0x696f, 0x3d5e => 0x6b89,
+  0x3d5f => 0x6df3, 0x3d60 => 0x6e96, 0x3d61 => 0x6f64, 0x3d62 => 0x76fe,
+  0x3d63 => 0x7d14, 0x3d64 => 0x5de1, 0x3d65 => 0x9075, 0x3d66 => 0x9187,
+  0x3d67 => 0x9806, 0x3d68 => 0x51e6, 0x3d69 => 0x521d, 0x3d6a => 0x6240,
+  0x3d6b => 0x6691, 0x3d6c => 0x66d9, 0x3d6d => 0x6e1a, 0x3d6e => 0x5eb6,
+  0x3d6f => 0x7dd2, 0x3d70 => 0x7f72, 0x3d71 => 0x66f8, 0x3d72 => 0x85af,
+  0x3d73 => 0x85f7, 0x3d74 => 0x8af8, 0x3d75 => 0x52a9, 0x3d76 => 0x53d9,
+  0x3d77 => 0x5973, 0x3d78 => 0x5e8f, 0x3d79 => 0x5f90, 0x3d7a => 0x6055,
+  0x3d7b => 0x92e4, 0x3d7c => 0x9664, 0x3d7d => 0x50b7, 0x3d7e => 0x511f,
+  0x3e21 => 0x52dd, 0x3e22 => 0x5320, 0x3e23 => 0x5347, 0x3e24 => 0x53ec,
+  0x3e25 => 0x54e8, 0x3e26 => 0x5546, 0x3e27 => 0x5531, 0x3e28 => 0x5617,
+  0x3e29 => 0x5968, 0x3e2a => 0x59be, 0x3e2b => 0x5a3c, 0x3e2c => 0x5bb5,
+  0x3e2d => 0x5c06, 0x3e2e => 0x5c0f, 0x3e2f => 0x5c11, 0x3e30 => 0x5c1a,
+  0x3e31 => 0x5e84, 0x3e32 => 0x5e8a, 0x3e33 => 0x5ee0, 0x3e34 => 0x5f70,
+  0x3e35 => 0x627f, 0x3e36 => 0x6284, 0x3e37 => 0x62db, 0x3e38 => 0x638c,
+  0x3e39 => 0x6377, 0x3e3a => 0x6607, 0x3e3b => 0x660c, 0x3e3c => 0x662d,
+  0x3e3d => 0x6676, 0x3e3e => 0x677e, 0x3e3f => 0x68a2, 0x3e40 => 0x6a1f,
+  0x3e41 => 0x6a35, 0x3e42 => 0x6cbc, 0x3e43 => 0x6d88, 0x3e44 => 0x6e09,
+  0x3e45 => 0x6e58, 0x3e46 => 0x713c, 0x3e47 => 0x7126, 0x3e48 => 0x7167,
+  0x3e49 => 0x75c7, 0x3e4a => 0x7701, 0x3e4b => 0x785d, 0x3e4c => 0x7901,
+  0x3e4d => 0x7965, 0x3e4e => 0x79f0, 0x3e4f => 0x7ae0, 0x3e50 => 0x7b11,
+  0x3e51 => 0x7ca7, 0x3e52 => 0x7d39, 0x3e53 => 0x8096, 0x3e54 => 0x83d6,
+  0x3e55 => 0x848b, 0x3e56 => 0x8549, 0x3e57 => 0x885d, 0x3e58 => 0x88f3,
+  0x3e59 => 0x8a1f, 0x3e5a => 0x8a3c, 0x3e5b => 0x8a54, 0x3e5c => 0x8a73,
+  0x3e5d => 0x8c61, 0x3e5e => 0x8cde, 0x3e5f => 0x91a4, 0x3e60 => 0x9266,
+  0x3e61 => 0x937e, 0x3e62 => 0x9418, 0x3e63 => 0x969c, 0x3e64 => 0x9798,
+  0x3e65 => 0x4e0a, 0x3e66 => 0x4e08, 0x3e67 => 0x4e1e, 0x3e68 => 0x4e57,
+  0x3e69 => 0x5197, 0x3e6a => 0x5270, 0x3e6b => 0x57ce, 0x3e6c => 0x5834,
+  0x3e6d => 0x58cc, 0x3e6e => 0x5b22, 0x3e6f => 0x5e38, 0x3e70 => 0x60c5,
+  0x3e71 => 0x64fe, 0x3e72 => 0x6761, 0x3e73 => 0x6756, 0x3e74 => 0x6d44,
+  0x3e75 => 0x72b6, 0x3e76 => 0x7573, 0x3e77 => 0x7a63, 0x3e78 => 0x84b8,
+  0x3e79 => 0x8b72, 0x3e7a => 0x91b8, 0x3e7b => 0x9320, 0x3e7c => 0x5631,
+  0x3e7d => 0x57f4, 0x3e7e => 0x98fe, 0x3f21 => 0x62ed, 0x3f22 => 0x690d,
+  0x3f23 => 0x6b96, 0x3f24 => 0x71ed, 0x3f25 => 0x7e54, 0x3f26 => 0x8077,
+  0x3f27 => 0x8272, 0x3f28 => 0x89e6, 0x3f29 => 0x98df, 0x3f2a => 0x8755,
+  0x3f2b => 0x8fb1, 0x3f2c => 0x5c3b, 0x3f2d => 0x4f38, 0x3f2e => 0x4fe1,
+  0x3f2f => 0x4fb5, 0x3f30 => 0x5507, 0x3f31 => 0x5a20, 0x3f32 => 0x5bdd,
+  0x3f33 => 0x5be9, 0x3f34 => 0x5fc3, 0x3f35 => 0x614e, 0x3f36 => 0x632f,
+  0x3f37 => 0x65b0, 0x3f38 => 0x664b, 0x3f39 => 0x68ee, 0x3f3a => 0x699b,
+  0x3f3b => 0x6d78, 0x3f3c => 0x6df1, 0x3f3d => 0x7533, 0x3f3e => 0x75b9,
+  0x3f3f => 0x771f, 0x3f40 => 0x795e, 0x3f41 => 0x79e6, 0x3f42 => 0x7d33,
+  0x3f43 => 0x81e3, 0x3f44 => 0x82af, 0x3f45 => 0x85aa, 0x3f46 => 0x89aa,
+  0x3f47 => 0x8a3a, 0x3f48 => 0x8eab, 0x3f49 => 0x8f9b, 0x3f4a => 0x9032,
+  0x3f4b => 0x91dd, 0x3f4c => 0x9707, 0x3f4d => 0x4eba, 0x3f4e => 0x4ec1,
+  0x3f4f => 0x5203, 0x3f50 => 0x5875, 0x3f51 => 0x58ec, 0x3f52 => 0x5c0b,
+  0x3f53 => 0x751a, 0x3f54 => 0x5c3d, 0x3f55 => 0x814e, 0x3f56 => 0x8a0a,
+  0x3f57 => 0x8fc5, 0x3f58 => 0x9663, 0x3f59 => 0x976d, 0x3f5a => 0x7b25,
+  0x3f5b => 0x8acf, 0x3f5c => 0x9808, 0x3f5d => 0x9162, 0x3f5e => 0x56f3,
+  0x3f5f => 0x53a8, 0x3f60 => 0x9017, 0x3f61 => 0x5439, 0x3f62 => 0x5782,
+  0x3f63 => 0x5e25, 0x3f64 => 0x63a8, 0x3f65 => 0x6c34, 0x3f66 => 0x708a,
+  0x3f67 => 0x7761, 0x3f68 => 0x7c8b, 0x3f69 => 0x7fe0, 0x3f6a => 0x8870,
+  0x3f6b => 0x9042, 0x3f6c => 0x9154, 0x3f6d => 0x9310, 0x3f6e => 0x9318,
+  0x3f6f => 0x968f, 0x3f70 => 0x745e, 0x3f71 => 0x9ac4, 0x3f72 => 0x5d07,
+  0x3f73 => 0x5d69, 0x3f74 => 0x6570, 0x3f75 => 0x67a2, 0x3f76 => 0x8da8,
+  0x3f77 => 0x96db, 0x3f78 => 0x636e, 0x3f79 => 0x6749, 0x3f7a => 0x6919,
+  0x3f7b => 0x83c5, 0x3f7c => 0x9817, 0x3f7d => 0x96c0, 0x3f7e => 0x88fe,
+  0x4021 => 0x6f84, 0x4022 => 0x647a, 0x4023 => 0x5bf8, 0x4024 => 0x4e16,
+  0x4025 => 0x702c, 0x4026 => 0x755d, 0x4027 => 0x662f, 0x4028 => 0x51c4,
+  0x4029 => 0x5236, 0x402a => 0x52e2, 0x402b => 0x59d3, 0x402c => 0x5f81,
+  0x402d => 0x6027, 0x402e => 0x6210, 0x402f => 0x653f, 0x4030 => 0x6574,
+  0x4031 => 0x661f, 0x4032 => 0x6674, 0x4033 => 0x68f2, 0x4034 => 0x6816,
+  0x4035 => 0x6b63, 0x4036 => 0x6e05, 0x4037 => 0x7272, 0x4038 => 0x751f,
+  0x4039 => 0x76db, 0x403a => 0x7cbe, 0x403b => 0x8056, 0x403c => 0x58f0,
+  0x403d => 0x88fd, 0x403e => 0x897f, 0x403f => 0x8aa0, 0x4040 => 0x8a93,
+  0x4041 => 0x8acb, 0x4042 => 0x901d, 0x4043 => 0x9192, 0x4044 => 0x9752,
+  0x4045 => 0x9759, 0x4046 => 0x6589, 0x4047 => 0x7a0e, 0x4048 => 0x8106,
+  0x4049 => 0x96bb, 0x404a => 0x5e2d, 0x404b => 0x60dc, 0x404c => 0x621a,
+  0x404d => 0x65a5, 0x404e => 0x6614, 0x404f => 0x6790, 0x4050 => 0x77f3,
+  0x4051 => 0x7a4d, 0x4052 => 0x7c4d, 0x4053 => 0x7e3e, 0x4054 => 0x810a,
+  0x4055 => 0x8cac, 0x4056 => 0x8d64, 0x4057 => 0x8de1, 0x4058 => 0x8e5f,
+  0x4059 => 0x78a9, 0x405a => 0x5207, 0x405b => 0x62d9, 0x405c => 0x63a5,
+  0x405d => 0x6442, 0x405e => 0x6298, 0x405f => 0x8a2d, 0x4060 => 0x7a83,
+  0x4061 => 0x7bc0, 0x4062 => 0x8aac, 0x4063 => 0x96ea, 0x4064 => 0x7d76,
+  0x4065 => 0x820c, 0x4066 => 0x8749, 0x4067 => 0x4ed9, 0x4068 => 0x5148,
+  0x4069 => 0x5343, 0x406a => 0x5360, 0x406b => 0x5ba3, 0x406c => 0x5c02,
+  0x406d => 0x5c16, 0x406e => 0x5ddd, 0x406f => 0x6226, 0x4070 => 0x6247,
+  0x4071 => 0x64b0, 0x4072 => 0x6813, 0x4073 => 0x6834, 0x4074 => 0x6cc9,
+  0x4075 => 0x6d45, 0x4076 => 0x6d17, 0x4077 => 0x67d3, 0x4078 => 0x6f5c,
+  0x4079 => 0x714e, 0x407a => 0x717d, 0x407b => 0x65cb, 0x407c => 0x7a7f,
+  0x407d => 0x7bad, 0x407e => 0x7dda, 0x4121 => 0x7e4a, 0x4122 => 0x7fa8,
+  0x4123 => 0x817a, 0x4124 => 0x821b, 0x4125 => 0x8239, 0x4126 => 0x85a6,
+  0x4127 => 0x8a6e, 0x4128 => 0x8cce, 0x4129 => 0x8df5, 0x412a => 0x9078,
+  0x412b => 0x9077, 0x412c => 0x92ad, 0x412d => 0x9291, 0x412e => 0x9583,
+  0x412f => 0x9bae, 0x4130 => 0x524d, 0x4131 => 0x5584, 0x4132 => 0x6f38,
+  0x4133 => 0x7136, 0x4134 => 0x5168, 0x4135 => 0x7985, 0x4136 => 0x7e55,
+  0x4137 => 0x81b3, 0x4138 => 0x7cce, 0x4139 => 0x564c, 0x413a => 0x5851,
+  0x413b => 0x5ca8, 0x413c => 0x63aa, 0x413d => 0x66fe, 0x413e => 0x66fd,
+  0x413f => 0x695a, 0x4140 => 0x72d9, 0x4141 => 0x758f, 0x4142 => 0x758e,
+  0x4143 => 0x790e, 0x4144 => 0x7956, 0x4145 => 0x79df, 0x4146 => 0x7c97,
+  0x4147 => 0x7d20, 0x4148 => 0x7d44, 0x4149 => 0x8607, 0x414a => 0x8a34,
+  0x414b => 0x963b, 0x414c => 0x9061, 0x414d => 0x9f20, 0x414e => 0x50e7,
+  0x414f => 0x5275, 0x4150 => 0x53cc, 0x4151 => 0x53e2, 0x4152 => 0x5009,
+  0x4153 => 0x55aa, 0x4154 => 0x58ee, 0x4155 => 0x594f, 0x4156 => 0x723d,
+  0x4157 => 0x5b8b, 0x4158 => 0x5c64, 0x4159 => 0x531d, 0x415a => 0x60e3,
+  0x415b => 0x60f3, 0x415c => 0x635c, 0x415d => 0x6383, 0x415e => 0x633f,
+  0x415f => 0x63bb, 0x4160 => 0x64cd, 0x4161 => 0x65e9, 0x4162 => 0x66f9,
+  0x4163 => 0x5de3, 0x4164 => 0x69cd, 0x4165 => 0x69fd, 0x4166 => 0x6f15,
+  0x4167 => 0x71e5, 0x4168 => 0x4e89, 0x4169 => 0x75e9, 0x416a => 0x76f8,
+  0x416b => 0x7a93, 0x416c => 0x7cdf, 0x416d => 0x7dcf, 0x416e => 0x7d9c,
+  0x416f => 0x8061, 0x4170 => 0x8349, 0x4171 => 0x8358, 0x4172 => 0x846c,
+  0x4173 => 0x84bc, 0x4174 => 0x85fb, 0x4175 => 0x88c5, 0x4176 => 0x8d70,
+  0x4177 => 0x9001, 0x4178 => 0x906d, 0x4179 => 0x9397, 0x417a => 0x971c,
+  0x417b => 0x9a12, 0x417c => 0x50cf, 0x417d => 0x5897, 0x417e => 0x618e,
+  0x4221 => 0x81d3, 0x4222 => 0x8535, 0x4223 => 0x8d08, 0x4224 => 0x9020,
+  0x4225 => 0x4fc3, 0x4226 => 0x5074, 0x4227 => 0x5247, 0x4228 => 0x5373,
+  0x4229 => 0x606f, 0x422a => 0x6349, 0x422b => 0x675f, 0x422c => 0x6e2c,
+  0x422d => 0x8db3, 0x422e => 0x901f, 0x422f => 0x4fd7, 0x4230 => 0x5c5e,
+  0x4231 => 0x8cca, 0x4232 => 0x65cf, 0x4233 => 0x7d9a, 0x4234 => 0x5352,
+  0x4235 => 0x8896, 0x4236 => 0x5176, 0x4237 => 0x63c3, 0x4238 => 0x5b58,
+  0x4239 => 0x5b6b, 0x423a => 0x5c0a, 0x423b => 0x640d, 0x423c => 0x6751,
+  0x423d => 0x905c, 0x423e => 0x4ed6, 0x423f => 0x591a, 0x4240 => 0x592a,
+  0x4241 => 0x6c70, 0x4242 => 0x8a51, 0x4243 => 0x553e, 0x4244 => 0x5815,
+  0x4245 => 0x59a5, 0x4246 => 0x60f0, 0x4247 => 0x6253, 0x4248 => 0x67c1,
+  0x4249 => 0x8235, 0x424a => 0x6955, 0x424b => 0x9640, 0x424c => 0x99c4,
+  0x424d => 0x9a28, 0x424e => 0x4f53, 0x424f => 0x5806, 0x4250 => 0x5bfe,
+  0x4251 => 0x8010, 0x4252 => 0x5cb1, 0x4253 => 0x5e2f, 0x4254 => 0x5f85,
+  0x4255 => 0x6020, 0x4256 => 0x614b, 0x4257 => 0x6234, 0x4258 => 0x66ff,
+  0x4259 => 0x6cf0, 0x425a => 0x6ede, 0x425b => 0x80ce, 0x425c => 0x817f,
+  0x425d => 0x82d4, 0x425e => 0x888b, 0x425f => 0x8cb8, 0x4260 => 0x9000,
+  0x4261 => 0x902e, 0x4262 => 0x968a, 0x4263 => 0x9edb, 0x4264 => 0x9bdb,
+  0x4265 => 0x4ee3, 0x4266 => 0x53f0, 0x4267 => 0x5927, 0x4268 => 0x7b2c,
+  0x4269 => 0x918d, 0x426a => 0x984c, 0x426b => 0x9df9, 0x426c => 0x6edd,
+  0x426d => 0x7027, 0x426e => 0x5353, 0x426f => 0x5544, 0x4270 => 0x5b85,
+  0x4271 => 0x6258, 0x4272 => 0x629e, 0x4273 => 0x62d3, 0x4274 => 0x6ca2,
+  0x4275 => 0x6fef, 0x4276 => 0x7422, 0x4277 => 0x8a17, 0x4278 => 0x9438,
+  0x4279 => 0x6fc1, 0x427a => 0x8afe, 0x427b => 0x8338, 0x427c => 0x51e7,
+  0x427d => 0x86f8, 0x427e => 0x53ea, 0x4321 => 0x53e9, 0x4322 => 0x4f46,
+  0x4323 => 0x9054, 0x4324 => 0x8fb0, 0x4325 => 0x596a, 0x4326 => 0x8131,
+  0x4327 => 0x5dfd, 0x4328 => 0x7aea, 0x4329 => 0x8fbf, 0x432a => 0x68da,
+  0x432b => 0x8c37, 0x432c => 0x72f8, 0x432d => 0x9c48, 0x432e => 0x6a3d,
+  0x432f => 0x8ab0, 0x4330 => 0x4e39, 0x4331 => 0x5358, 0x4332 => 0x5606,
+  0x4333 => 0x5766, 0x4334 => 0x62c5, 0x4335 => 0x63a2, 0x4336 => 0x65e6,
+  0x4337 => 0x6b4e, 0x4338 => 0x6de1, 0x4339 => 0x6e5b, 0x433a => 0x70ad,
+  0x433b => 0x77ed, 0x433c => 0x7aef, 0x433d => 0x7baa, 0x433e => 0x7dbb,
+  0x433f => 0x803d, 0x4340 => 0x80c6, 0x4341 => 0x86cb, 0x4342 => 0x8a95,
+  0x4343 => 0x935b, 0x4344 => 0x56e3, 0x4345 => 0x58c7, 0x4346 => 0x5f3e,
+  0x4347 => 0x65ad, 0x4348 => 0x6696, 0x4349 => 0x6a80, 0x434a => 0x6bb5,
+  0x434b => 0x7537, 0x434c => 0x8ac7, 0x434d => 0x5024, 0x434e => 0x77e5,
+  0x434f => 0x5730, 0x4350 => 0x5f1b, 0x4351 => 0x6065, 0x4352 => 0x667a,
+  0x4353 => 0x6c60, 0x4354 => 0x75f4, 0x4355 => 0x7a1a, 0x4356 => 0x7f6e,
+  0x4357 => 0x81f4, 0x4358 => 0x8718, 0x4359 => 0x9045, 0x435a => 0x99b3,
+  0x435b => 0x7bc9, 0x435c => 0x755c, 0x435d => 0x7af9, 0x435e => 0x7b51,
+  0x435f => 0x84c4, 0x4360 => 0x9010, 0x4361 => 0x79e9, 0x4362 => 0x7a92,
+  0x4363 => 0x8336, 0x4364 => 0x5ae1, 0x4365 => 0x7740, 0x4366 => 0x4e2d,
+  0x4367 => 0x4ef2, 0x4368 => 0x5b99, 0x4369 => 0x5fe0, 0x436a => 0x62bd,
+  0x436b => 0x663c, 0x436c => 0x67f1, 0x436d => 0x6ce8, 0x436e => 0x866b,
+  0x436f => 0x8877, 0x4370 => 0x8a3b, 0x4371 => 0x914e, 0x4372 => 0x92f3,
+  0x4373 => 0x99d0, 0x4374 => 0x6a17, 0x4375 => 0x7026, 0x4376 => 0x732a,
+  0x4377 => 0x82e7, 0x4378 => 0x8457, 0x4379 => 0x8caf, 0x437a => 0x4e01,
+  0x437b => 0x5146, 0x437c => 0x51cb, 0x437d => 0x558b, 0x437e => 0x5bf5,
+  0x4421 => 0x5e16, 0x4422 => 0x5e33, 0x4423 => 0x5e81, 0x4424 => 0x5f14,
+  0x4425 => 0x5f35, 0x4426 => 0x5f6b, 0x4427 => 0x5fb4, 0x4428 => 0x61f2,
+  0x4429 => 0x6311, 0x442a => 0x66a2, 0x442b => 0x671d, 0x442c => 0x6f6e,
+  0x442d => 0x7252, 0x442e => 0x753a, 0x442f => 0x773a, 0x4430 => 0x8074,
+  0x4431 => 0x8139, 0x4432 => 0x8178, 0x4433 => 0x8776, 0x4434 => 0x8abf,
+  0x4435 => 0x8adc, 0x4436 => 0x8d85, 0x4437 => 0x8df3, 0x4438 => 0x929a,
+  0x4439 => 0x9577, 0x443a => 0x9802, 0x443b => 0x9ce5, 0x443c => 0x52c5,
+  0x443d => 0x6357, 0x443e => 0x76f4, 0x443f => 0x6715, 0x4440 => 0x6c88,
+  0x4441 => 0x73cd, 0x4442 => 0x8cc3, 0x4443 => 0x93ae, 0x4444 => 0x9673,
+  0x4445 => 0x6d25, 0x4446 => 0x589c, 0x4447 => 0x690e, 0x4448 => 0x69cc,
+  0x4449 => 0x8ffd, 0x444a => 0x939a, 0x444b => 0x75db, 0x444c => 0x901a,
+  0x444d => 0x585a, 0x444e => 0x6802, 0x444f => 0x63b4, 0x4450 => 0x69fb,
+  0x4451 => 0x4f43, 0x4452 => 0x6f2c, 0x4453 => 0x67d8, 0x4454 => 0x8fbb,
+  0x4455 => 0x8526, 0x4456 => 0x7db4, 0x4457 => 0x9354, 0x4458 => 0x693f,
+  0x4459 => 0x6f70, 0x445a => 0x576a, 0x445b => 0x58f7, 0x445c => 0x5b2c,
+  0x445d => 0x7d2c, 0x445e => 0x722a, 0x445f => 0x540a, 0x4460 => 0x91e3,
+  0x4461 => 0x9db4, 0x4462 => 0x4ead, 0x4463 => 0x4f4e, 0x4464 => 0x505c,
+  0x4465 => 0x5075, 0x4466 => 0x5243, 0x4467 => 0x8c9e, 0x4468 => 0x5448,
+  0x4469 => 0x5824, 0x446a => 0x5b9a, 0x446b => 0x5e1d, 0x446c => 0x5e95,
+  0x446d => 0x5ead, 0x446e => 0x5ef7, 0x446f => 0x5f1f, 0x4470 => 0x608c,
+  0x4471 => 0x62b5, 0x4472 => 0x633a, 0x4473 => 0x63d0, 0x4474 => 0x68af,
+  0x4475 => 0x6c40, 0x4476 => 0x7887, 0x4477 => 0x798e, 0x4478 => 0x7a0b,
+  0x4479 => 0x7de0, 0x447a => 0x8247, 0x447b => 0x8a02, 0x447c => 0x8ae6,
+  0x447d => 0x8e44, 0x447e => 0x9013, 0x4521 => 0x90b8, 0x4522 => 0x912d,
+  0x4523 => 0x91d8, 0x4524 => 0x9f0e, 0x4525 => 0x6ce5, 0x4526 => 0x6458,
+  0x4527 => 0x64e2, 0x4528 => 0x6575, 0x4529 => 0x6ef4, 0x452a => 0x7684,
+  0x452b => 0x7b1b, 0x452c => 0x9069, 0x452d => 0x93d1, 0x452e => 0x6eba,
+  0x452f => 0x54f2, 0x4530 => 0x5fb9, 0x4531 => 0x64a4, 0x4532 => 0x8f4d,
+  0x4533 => 0x8fed, 0x4534 => 0x9244, 0x4535 => 0x5178, 0x4536 => 0x586b,
+  0x4537 => 0x5929, 0x4538 => 0x5c55, 0x4539 => 0x5e97, 0x453a => 0x6dfb,
+  0x453b => 0x7e8f, 0x453c => 0x751c, 0x453d => 0x8cbc, 0x453e => 0x8ee2,
+  0x453f => 0x985b, 0x4540 => 0x70b9, 0x4541 => 0x4f1d, 0x4542 => 0x6bbf,
+  0x4543 => 0x6fb1, 0x4544 => 0x7530, 0x4545 => 0x96fb, 0x4546 => 0x514e,
+  0x4547 => 0x5410, 0x4548 => 0x5835, 0x4549 => 0x5857, 0x454a => 0x59ac,
+  0x454b => 0x5c60, 0x454c => 0x5f92, 0x454d => 0x6597, 0x454e => 0x675c,
+  0x454f => 0x6e21, 0x4550 => 0x767b, 0x4551 => 0x83df, 0x4552 => 0x8ced,
+  0x4553 => 0x9014, 0x4554 => 0x90fd, 0x4555 => 0x934d, 0x4556 => 0x7825,
+  0x4557 => 0x783a, 0x4558 => 0x52aa, 0x4559 => 0x5ea6, 0x455a => 0x571f,
+  0x455b => 0x5974, 0x455c => 0x6012, 0x455d => 0x5012, 0x455e => 0x515a,
+  0x455f => 0x51ac, 0x4560 => 0x51cd, 0x4561 => 0x5200, 0x4562 => 0x5510,
+  0x4563 => 0x5854, 0x4564 => 0x5858, 0x4565 => 0x5957, 0x4566 => 0x5b95,
+  0x4567 => 0x5cf6, 0x4568 => 0x5d8b, 0x4569 => 0x60bc, 0x456a => 0x6295,
+  0x456b => 0x642d, 0x456c => 0x6771, 0x456d => 0x6843, 0x456e => 0x68bc,
+  0x456f => 0x68df, 0x4570 => 0x76d7, 0x4571 => 0x6dd8, 0x4572 => 0x6e6f,
+  0x4573 => 0x6d9b, 0x4574 => 0x706f, 0x4575 => 0x71c8, 0x4576 => 0x5f53,
+  0x4577 => 0x75d8, 0x4578 => 0x7977, 0x4579 => 0x7b49, 0x457a => 0x7b54,
+  0x457b => 0x7b52, 0x457c => 0x7cd6, 0x457d => 0x7d71, 0x457e => 0x5230,
+  0x4621 => 0x8463, 0x4622 => 0x8569, 0x4623 => 0x85e4, 0x4624 => 0x8a0e,
+  0x4625 => 0x8b04, 0x4626 => 0x8c46, 0x4627 => 0x8e0f, 0x4628 => 0x9003,
+  0x4629 => 0x900f, 0x462a => 0x9419, 0x462b => 0x9676, 0x462c => 0x982d,
+  0x462d => 0x9a30, 0x462e => 0x95d8, 0x462f => 0x50cd, 0x4630 => 0x52d5,
+  0x4631 => 0x540c, 0x4632 => 0x5802, 0x4633 => 0x5c0e, 0x4634 => 0x61a7,
+  0x4635 => 0x649e, 0x4636 => 0x6d1e, 0x4637 => 0x77b3, 0x4638 => 0x7ae5,
+  0x4639 => 0x80f4, 0x463a => 0x8404, 0x463b => 0x9053, 0x463c => 0x9285,
+  0x463d => 0x5ce0, 0x463e => 0x9d07, 0x463f => 0x533f, 0x4640 => 0x5f97,
+  0x4641 => 0x5fb3, 0x4642 => 0x6d9c, 0x4643 => 0x7279, 0x4644 => 0x7763,
+  0x4645 => 0x79bf, 0x4646 => 0x7be4, 0x4647 => 0x6bd2, 0x4648 => 0x72ec,
+  0x4649 => 0x8aad, 0x464a => 0x6803, 0x464b => 0x6a61, 0x464c => 0x51f8,
+  0x464d => 0x7a81, 0x464e => 0x6934, 0x464f => 0x5c4a, 0x4650 => 0x9cf6,
+  0x4651 => 0x82eb, 0x4652 => 0x5bc5, 0x4653 => 0x9149, 0x4654 => 0x701e,
+  0x4655 => 0x5678, 0x4656 => 0x5c6f, 0x4657 => 0x60c7, 0x4658 => 0x6566,
+  0x4659 => 0x6c8c, 0x465a => 0x8c5a, 0x465b => 0x9041, 0x465c => 0x9813,
+  0x465d => 0x5451, 0x465e => 0x66c7, 0x465f => 0x920d, 0x4660 => 0x5948,
+  0x4661 => 0x90a3, 0x4662 => 0x5185, 0x4663 => 0x4e4d, 0x4664 => 0x51ea,
+  0x4665 => 0x8599, 0x4666 => 0x8b0e, 0x4667 => 0x7058, 0x4668 => 0x637a,
+  0x4669 => 0x934b, 0x466a => 0x6962, 0x466b => 0x99b4, 0x466c => 0x7e04,
+  0x466d => 0x7577, 0x466e => 0x5357, 0x466f => 0x6960, 0x4670 => 0x8edf,
+  0x4671 => 0x96e3, 0x4672 => 0x6c5d, 0x4673 => 0x4e8c, 0x4674 => 0x5c3c,
+  0x4675 => 0x5f10, 0x4676 => 0x8fe9, 0x4677 => 0x5302, 0x4678 => 0x8cd1,
+  0x4679 => 0x8089, 0x467a => 0x8679, 0x467b => 0x5eff, 0x467c => 0x65e5,
+  0x467d => 0x4e73, 0x467e => 0x5165, 0x4721 => 0x5982, 0x4722 => 0x5c3f,
+  0x4723 => 0x97ee, 0x4724 => 0x4efb, 0x4725 => 0x598a, 0x4726 => 0x5fcd,
+  0x4727 => 0x8a8d, 0x4728 => 0x6fe1, 0x4729 => 0x79b0, 0x472a => 0x7962,
+  0x472b => 0x5be7, 0x472c => 0x8471, 0x472d => 0x732b, 0x472e => 0x71b1,
+  0x472f => 0x5e74, 0x4730 => 0x5ff5, 0x4731 => 0x637b, 0x4732 => 0x649a,
+  0x4733 => 0x71c3, 0x4734 => 0x7c98, 0x4735 => 0x4e43, 0x4736 => 0x5efc,
+  0x4737 => 0x4e4b, 0x4738 => 0x57dc, 0x4739 => 0x56a2, 0x473a => 0x60a9,
+  0x473b => 0x6fc3, 0x473c => 0x7d0d, 0x473d => 0x80fd, 0x473e => 0x8133,
+  0x473f => 0x81bf, 0x4740 => 0x8fb2, 0x4741 => 0x8997, 0x4742 => 0x86a4,
+  0x4743 => 0x5df4, 0x4744 => 0x628a, 0x4745 => 0x64ad, 0x4746 => 0x8987,
+  0x4747 => 0x6777, 0x4748 => 0x6ce2, 0x4749 => 0x6d3e, 0x474a => 0x7436,
+  0x474b => 0x7834, 0x474c => 0x5a46, 0x474d => 0x7f75, 0x474e => 0x82ad,
+  0x474f => 0x99ac, 0x4750 => 0x4ff3, 0x4751 => 0x5ec3, 0x4752 => 0x62dd,
+  0x4753 => 0x6392, 0x4754 => 0x6557, 0x4755 => 0x676f, 0x4756 => 0x76c3,
+  0x4757 => 0x724c, 0x4758 => 0x80cc, 0x4759 => 0x80ba, 0x475a => 0x8f29,
+  0x475b => 0x914d, 0x475c => 0x500d, 0x475d => 0x57f9, 0x475e => 0x5a92,
+  0x475f => 0x6885, 0x4760 => 0x6973, 0x4761 => 0x7164, 0x4762 => 0x72fd,
+  0x4763 => 0x8cb7, 0x4764 => 0x58f2, 0x4765 => 0x8ce0, 0x4766 => 0x966a,
+  0x4767 => 0x9019, 0x4768 => 0x877f, 0x4769 => 0x79e4, 0x476a => 0x77e7,
+  0x476b => 0x8429, 0x476c => 0x4f2f, 0x476d => 0x5265, 0x476e => 0x535a,
+  0x476f => 0x62cd, 0x4770 => 0x67cf, 0x4771 => 0x6cca, 0x4772 => 0x767d,
+  0x4773 => 0x7b94, 0x4774 => 0x7c95, 0x4775 => 0x8236, 0x4776 => 0x8584,
+  0x4777 => 0x8feb, 0x4778 => 0x66dd, 0x4779 => 0x6f20, 0x477a => 0x7206,
+  0x477b => 0x7e1b, 0x477c => 0x83ab, 0x477d => 0x99c1, 0x477e => 0x9ea6,
+  0x4821 => 0x51fd, 0x4822 => 0x7bb1, 0x4823 => 0x7872, 0x4824 => 0x7bb8,
+  0x4825 => 0x8087, 0x4826 => 0x7b48, 0x4827 => 0x6ae8, 0x4828 => 0x5e61,
+  0x4829 => 0x808c, 0x482a => 0x7551, 0x482b => 0x7560, 0x482c => 0x516b,
+  0x482d => 0x9262, 0x482e => 0x6e8c, 0x482f => 0x767a, 0x4830 => 0x9197,
+  0x4831 => 0x9aea, 0x4832 => 0x4f10, 0x4833 => 0x7f70, 0x4834 => 0x629c,
+  0x4835 => 0x7b4f, 0x4836 => 0x95a5, 0x4837 => 0x9ce9, 0x4838 => 0x567a,
+  0x4839 => 0x5859, 0x483a => 0x86e4, 0x483b => 0x96bc, 0x483c => 0x4f34,
+  0x483d => 0x5224, 0x483e => 0x534a, 0x483f => 0x53cd, 0x4840 => 0x53db,
+  0x4841 => 0x5e06, 0x4842 => 0x642c, 0x4843 => 0x6591, 0x4844 => 0x677f,
+  0x4845 => 0x6c3e, 0x4846 => 0x6c4e, 0x4847 => 0x7248, 0x4848 => 0x72af,
+  0x4849 => 0x73ed, 0x484a => 0x7554, 0x484b => 0x7e41, 0x484c => 0x822c,
+  0x484d => 0x85e9, 0x484e => 0x8ca9, 0x484f => 0x7bc4, 0x4850 => 0x91c6,
+  0x4851 => 0x7169, 0x4852 => 0x9812, 0x4853 => 0x98ef, 0x4854 => 0x633d,
+  0x4855 => 0x6669, 0x4856 => 0x756a, 0x4857 => 0x76e4, 0x4858 => 0x78d0,
+  0x4859 => 0x8543, 0x485a => 0x86ee, 0x485b => 0x532a, 0x485c => 0x5351,
+  0x485d => 0x5426, 0x485e => 0x5983, 0x485f => 0x5e87, 0x4860 => 0x5f7c,
+  0x4861 => 0x60b2, 0x4862 => 0x6249, 0x4863 => 0x6279, 0x4864 => 0x62ab,
+  0x4865 => 0x6590, 0x4866 => 0x6bd4, 0x4867 => 0x6ccc, 0x4868 => 0x75b2,
+  0x4869 => 0x76ae, 0x486a => 0x7891, 0x486b => 0x79d8, 0x486c => 0x7dcb,
+  0x486d => 0x7f77, 0x486e => 0x80a5, 0x486f => 0x88ab, 0x4870 => 0x8ab9,
+  0x4871 => 0x8cbb, 0x4872 => 0x907f, 0x4873 => 0x975e, 0x4874 => 0x98db,
+  0x4875 => 0x6a0b, 0x4876 => 0x7c38, 0x4877 => 0x5099, 0x4878 => 0x5c3e,
+  0x4879 => 0x5fae, 0x487a => 0x6787, 0x487b => 0x6bd8, 0x487c => 0x7435,
+  0x487d => 0x7709, 0x487e => 0x7f8e, 0x4921 => 0x9f3b, 0x4922 => 0x67ca,
+  0x4923 => 0x7a17, 0x4924 => 0x5339, 0x4925 => 0x758b, 0x4926 => 0x9aed,
+  0x4927 => 0x5f66, 0x4928 => 0x819d, 0x4929 => 0x83f1, 0x492a => 0x8098,
+  0x492b => 0x5f3c, 0x492c => 0x5fc5, 0x492d => 0x7562, 0x492e => 0x7b46,
+  0x492f => 0x903c, 0x4930 => 0x6867, 0x4931 => 0x59eb, 0x4932 => 0x5a9b,
+  0x4933 => 0x7d10, 0x4934 => 0x767e, 0x4935 => 0x8b2c, 0x4936 => 0x4ff5,
+  0x4937 => 0x5f6a, 0x4938 => 0x6a19, 0x4939 => 0x6c37, 0x493a => 0x6f02,
+  0x493b => 0x74e2, 0x493c => 0x7968, 0x493d => 0x8868, 0x493e => 0x8a55,
+  0x493f => 0x8c79, 0x4940 => 0x5edf, 0x4941 => 0x63cf, 0x4942 => 0x75c5,
+  0x4943 => 0x79d2, 0x4944 => 0x82d7, 0x4945 => 0x9328, 0x4946 => 0x92f2,
+  0x4947 => 0x849c, 0x4948 => 0x86ed, 0x4949 => 0x9c2d, 0x494a => 0x54c1,
+  0x494b => 0x5f6c, 0x494c => 0x658c, 0x494d => 0x6d5c, 0x494e => 0x7015,
+  0x494f => 0x8ca7, 0x4950 => 0x8cd3, 0x4951 => 0x983b, 0x4952 => 0x654f,
+  0x4953 => 0x74f6, 0x4954 => 0x4e0d, 0x4955 => 0x4ed8, 0x4956 => 0x57e0,
+  0x4957 => 0x592b, 0x4958 => 0x5a66, 0x4959 => 0x5bcc, 0x495a => 0x51a8,
+  0x495b => 0x5e03, 0x495c => 0x5e9c, 0x495d => 0x6016, 0x495e => 0x6276,
+  0x495f => 0x6577, 0x4960 => 0x65a7, 0x4961 => 0x666e, 0x4962 => 0x6d6e,
+  0x4963 => 0x7236, 0x4964 => 0x7b26, 0x4965 => 0x8150, 0x4966 => 0x819a,
+  0x4967 => 0x8299, 0x4968 => 0x8b5c, 0x4969 => 0x8ca0, 0x496a => 0x8ce6,
+  0x496b => 0x8d74, 0x496c => 0x961c, 0x496d => 0x9644, 0x496e => 0x4fae,
+  0x496f => 0x64ab, 0x4970 => 0x6b66, 0x4971 => 0x821e, 0x4972 => 0x8461,
+  0x4973 => 0x856a, 0x4974 => 0x90e8, 0x4975 => 0x5c01, 0x4976 => 0x6953,
+  0x4977 => 0x98a8, 0x4978 => 0x847a, 0x4979 => 0x8557, 0x497a => 0x4f0f,
+  0x497b => 0x526f, 0x497c => 0x5fa9, 0x497d => 0x5e45, 0x497e => 0x670d,
+  0x4a21 => 0x798f, 0x4a22 => 0x8179, 0x4a23 => 0x8907, 0x4a24 => 0x8986,
+  0x4a25 => 0x6df5, 0x4a26 => 0x5f17, 0x4a27 => 0x6255, 0x4a28 => 0x6cb8,
+  0x4a29 => 0x4ecf, 0x4a2a => 0x7269, 0x4a2b => 0x9b92, 0x4a2c => 0x5206,
+  0x4a2d => 0x543b, 0x4a2e => 0x5674, 0x4a2f => 0x58b3, 0x4a30 => 0x61a4,
+  0x4a31 => 0x626e, 0x4a32 => 0x711a, 0x4a33 => 0x596e, 0x4a34 => 0x7c89,
+  0x4a35 => 0x7cde, 0x4a36 => 0x7d1b, 0x4a37 => 0x96f0, 0x4a38 => 0x6587,
+  0x4a39 => 0x805e, 0x4a3a => 0x4e19, 0x4a3b => 0x4f75, 0x4a3c => 0x5175,
+  0x4a3d => 0x5840, 0x4a3e => 0x5e63, 0x4a3f => 0x5e73, 0x4a40 => 0x5f0a,
+  0x4a41 => 0x67c4, 0x4a42 => 0x4e26, 0x4a43 => 0x853d, 0x4a44 => 0x9589,
+  0x4a45 => 0x965b, 0x4a46 => 0x7c73, 0x4a47 => 0x9801, 0x4a48 => 0x50fb,
+  0x4a49 => 0x58c1, 0x4a4a => 0x7656, 0x4a4b => 0x78a7, 0x4a4c => 0x5225,
+  0x4a4d => 0x77a5, 0x4a4e => 0x8511, 0x4a4f => 0x7b86, 0x4a50 => 0x504f,
+  0x4a51 => 0x5909, 0x4a52 => 0x7247, 0x4a53 => 0x7bc7, 0x4a54 => 0x7de8,
+  0x4a55 => 0x8fba, 0x4a56 => 0x8fd4, 0x4a57 => 0x904d, 0x4a58 => 0x4fbf,
+  0x4a59 => 0x52c9, 0x4a5a => 0x5a29, 0x4a5b => 0x5f01, 0x4a5c => 0x97ad,
+  0x4a5d => 0x4fdd, 0x4a5e => 0x8217, 0x4a5f => 0x92ea, 0x4a60 => 0x5703,
+  0x4a61 => 0x6355, 0x4a62 => 0x6b69, 0x4a63 => 0x752b, 0x4a64 => 0x88dc,
+  0x4a65 => 0x8f14, 0x4a66 => 0x7a42, 0x4a67 => 0x52df, 0x4a68 => 0x5893,
+  0x4a69 => 0x6155, 0x4a6a => 0x620a, 0x4a6b => 0x66ae, 0x4a6c => 0x6bcd,
+  0x4a6d => 0x7c3f, 0x4a6e => 0x83e9, 0x4a6f => 0x5023, 0x4a70 => 0x4ff8,
+  0x4a71 => 0x5305, 0x4a72 => 0x5446, 0x4a73 => 0x5831, 0x4a74 => 0x5949,
+  0x4a75 => 0x5b9d, 0x4a76 => 0x5cf0, 0x4a77 => 0x5cef, 0x4a78 => 0x5d29,
+  0x4a79 => 0x5e96, 0x4a7a => 0x62b1, 0x4a7b => 0x6367, 0x4a7c => 0x653e,
+  0x4a7d => 0x65b9, 0x4a7e => 0x670b, 0x4b21 => 0x6cd5, 0x4b22 => 0x6ce1,
+  0x4b23 => 0x70f9, 0x4b24 => 0x7832, 0x4b25 => 0x7e2b, 0x4b26 => 0x80de,
+  0x4b27 => 0x82b3, 0x4b28 => 0x840c, 0x4b29 => 0x84ec, 0x4b2a => 0x8702,
+  0x4b2b => 0x8912, 0x4b2c => 0x8a2a, 0x4b2d => 0x8c4a, 0x4b2e => 0x90a6,
+  0x4b2f => 0x92d2, 0x4b30 => 0x98fd, 0x4b31 => 0x9cf3, 0x4b32 => 0x9d6c,
+  0x4b33 => 0x4e4f, 0x4b34 => 0x4ea1, 0x4b35 => 0x508d, 0x4b36 => 0x5256,
+  0x4b37 => 0x574a, 0x4b38 => 0x59a8, 0x4b39 => 0x5e3d, 0x4b3a => 0x5fd8,
+  0x4b3b => 0x5fd9, 0x4b3c => 0x623f, 0x4b3d => 0x66b4, 0x4b3e => 0x671b,
+  0x4b3f => 0x67d0, 0x4b40 => 0x68d2, 0x4b41 => 0x5192, 0x4b42 => 0x7d21,
+  0x4b43 => 0x80aa, 0x4b44 => 0x81a8, 0x4b45 => 0x8b00, 0x4b46 => 0x8c8c,
+  0x4b47 => 0x8cbf, 0x4b48 => 0x927e, 0x4b49 => 0x9632, 0x4b4a => 0x5420,
+  0x4b4b => 0x982c, 0x4b4c => 0x5317, 0x4b4d => 0x50d5, 0x4b4e => 0x535c,
+  0x4b4f => 0x58a8, 0x4b50 => 0x64b2, 0x4b51 => 0x6734, 0x4b52 => 0x7267,
+  0x4b53 => 0x7766, 0x4b54 => 0x7a46, 0x4b55 => 0x91e6, 0x4b56 => 0x52c3,
+  0x4b57 => 0x6ca1, 0x4b58 => 0x6b86, 0x4b59 => 0x5800, 0x4b5a => 0x5e4c,
+  0x4b5b => 0x5954, 0x4b5c => 0x672c, 0x4b5d => 0x7ffb, 0x4b5e => 0x51e1,
+  0x4b5f => 0x76c6, 0x4b60 => 0x6469, 0x4b61 => 0x78e8, 0x4b62 => 0x9b54,
+  0x4b63 => 0x9ebb, 0x4b64 => 0x57cb, 0x4b65 => 0x59b9, 0x4b66 => 0x6627,
+  0x4b67 => 0x679a, 0x4b68 => 0x6bce, 0x4b69 => 0x54e9, 0x4b6a => 0x69d9,
+  0x4b6b => 0x5e55, 0x4b6c => 0x819c, 0x4b6d => 0x6795, 0x4b6e => 0x9baa,
+  0x4b6f => 0x67fe, 0x4b70 => 0x9c52, 0x4b71 => 0x685d, 0x4b72 => 0x4ea6,
+  0x4b73 => 0x4fe3, 0x4b74 => 0x53c8, 0x4b75 => 0x62b9, 0x4b76 => 0x672b,
+  0x4b77 => 0x6cab, 0x4b78 => 0x8fc4, 0x4b79 => 0x4fad, 0x4b7a => 0x7e6d,
+  0x4b7b => 0x9ebf, 0x4b7c => 0x4e07, 0x4b7d => 0x6162, 0x4b7e => 0x6e80,
+  0x4c21 => 0x6f2b, 0x4c22 => 0x8513, 0x4c23 => 0x5473, 0x4c24 => 0x672a,
+  0x4c25 => 0x9b45, 0x4c26 => 0x5df3, 0x4c27 => 0x7b95, 0x4c28 => 0x5cac,
+  0x4c29 => 0x5bc6, 0x4c2a => 0x871c, 0x4c2b => 0x6e4a, 0x4c2c => 0x84d1,
+  0x4c2d => 0x7a14, 0x4c2e => 0x8108, 0x4c2f => 0x5999, 0x4c30 => 0x7c8d,
+  0x4c31 => 0x6c11, 0x4c32 => 0x7720, 0x4c33 => 0x52d9, 0x4c34 => 0x5922,
+  0x4c35 => 0x7121, 0x4c36 => 0x725f, 0x4c37 => 0x77db, 0x4c38 => 0x9727,
+  0x4c39 => 0x9d61, 0x4c3a => 0x690b, 0x4c3b => 0x5a7f, 0x4c3c => 0x5a18,
+  0x4c3d => 0x51a5, 0x4c3e => 0x540d, 0x4c3f => 0x547d, 0x4c40 => 0x660e,
+  0x4c41 => 0x76df, 0x4c42 => 0x8ff7, 0x4c43 => 0x9298, 0x4c44 => 0x9cf4,
+  0x4c45 => 0x59ea, 0x4c46 => 0x725d, 0x4c47 => 0x6ec5, 0x4c48 => 0x514d,
+  0x4c49 => 0x68c9, 0x4c4a => 0x7dbf, 0x4c4b => 0x7dec, 0x4c4c => 0x9762,
+  0x4c4d => 0x9eba, 0x4c4e => 0x6478, 0x4c4f => 0x6a21, 0x4c50 => 0x8302,
+  0x4c51 => 0x5984, 0x4c52 => 0x5b5f, 0x4c53 => 0x6bdb, 0x4c54 => 0x731b,
+  0x4c55 => 0x76f2, 0x4c56 => 0x7db2, 0x4c57 => 0x8017, 0x4c58 => 0x8499,
+  0x4c59 => 0x5132, 0x4c5a => 0x6728, 0x4c5b => 0x9ed9, 0x4c5c => 0x76ee,
+  0x4c5d => 0x6762, 0x4c5e => 0x52ff, 0x4c5f => 0x9905, 0x4c60 => 0x5c24,
+  0x4c61 => 0x623b, 0x4c62 => 0x7c7e, 0x4c63 => 0x8cb0, 0x4c64 => 0x554f,
+  0x4c65 => 0x60b6, 0x4c66 => 0x7d0b, 0x4c67 => 0x9580, 0x4c68 => 0x5301,
+  0x4c69 => 0x4e5f, 0x4c6a => 0x51b6, 0x4c6b => 0x591c, 0x4c6c => 0x723a,
+  0x4c6d => 0x8036, 0x4c6e => 0x91ce, 0x4c6f => 0x5f25, 0x4c70 => 0x77e2,
+  0x4c71 => 0x5384, 0x4c72 => 0x5f79, 0x4c73 => 0x7d04, 0x4c74 => 0x85ac,
+  0x4c75 => 0x8a33, 0x4c76 => 0x8e8d, 0x4c77 => 0x9756, 0x4c78 => 0x67f3,
+  0x4c79 => 0x85ae, 0x4c7a => 0x9453, 0x4c7b => 0x6109, 0x4c7c => 0x6108,
+  0x4c7d => 0x6cb9, 0x4c7e => 0x7652, 0x4d21 => 0x8aed, 0x4d22 => 0x8f38,
+  0x4d23 => 0x552f, 0x4d24 => 0x4f51, 0x4d25 => 0x512a, 0x4d26 => 0x52c7,
+  0x4d27 => 0x53cb, 0x4d28 => 0x5ba5, 0x4d29 => 0x5e7d, 0x4d2a => 0x60a0,
+  0x4d2b => 0x6182, 0x4d2c => 0x63d6, 0x4d2d => 0x6709, 0x4d2e => 0x67da,
+  0x4d2f => 0x6e67, 0x4d30 => 0x6d8c, 0x4d31 => 0x7336, 0x4d32 => 0x7337,
+  0x4d33 => 0x7531, 0x4d34 => 0x7950, 0x4d35 => 0x88d5, 0x4d36 => 0x8a98,
+  0x4d37 => 0x904a, 0x4d38 => 0x9091, 0x4d39 => 0x90f5, 0x4d3a => 0x96c4,
+  0x4d3b => 0x878d, 0x4d3c => 0x5915, 0x4d3d => 0x4e88, 0x4d3e => 0x4f59,
+  0x4d3f => 0x4e0e, 0x4d40 => 0x8a89, 0x4d41 => 0x8f3f, 0x4d42 => 0x9810,
+  0x4d43 => 0x50ad, 0x4d44 => 0x5e7c, 0x4d45 => 0x5996, 0x4d46 => 0x5bb9,
+  0x4d47 => 0x5eb8, 0x4d48 => 0x63da, 0x4d49 => 0x63fa, 0x4d4a => 0x64c1,
+  0x4d4b => 0x66dc, 0x4d4c => 0x694a, 0x4d4d => 0x69d8, 0x4d4e => 0x6d0b,
+  0x4d4f => 0x6eb6, 0x4d50 => 0x7194, 0x4d51 => 0x7528, 0x4d52 => 0x7aaf,
+  0x4d53 => 0x7f8a, 0x4d54 => 0x8000, 0x4d55 => 0x8449, 0x4d56 => 0x84c9,
+  0x4d57 => 0x8981, 0x4d58 => 0x8b21, 0x4d59 => 0x8e0a, 0x4d5a => 0x9065,
+  0x4d5b => 0x967d, 0x4d5c => 0x990a, 0x4d5d => 0x617e, 0x4d5e => 0x6291,
+  0x4d5f => 0x6b32, 0x4d60 => 0x6c83, 0x4d61 => 0x6d74, 0x4d62 => 0x7fcc,
+  0x4d63 => 0x7ffc, 0x4d64 => 0x6dc0, 0x4d65 => 0x7f85, 0x4d66 => 0x87ba,
+  0x4d67 => 0x88f8, 0x4d68 => 0x6765, 0x4d69 => 0x83b1, 0x4d6a => 0x983c,
+  0x4d6b => 0x96f7, 0x4d6c => 0x6d1b, 0x4d6d => 0x7d61, 0x4d6e => 0x843d,
+  0x4d6f => 0x916a, 0x4d70 => 0x4e71, 0x4d71 => 0x5375, 0x4d72 => 0x5d50,
+  0x4d73 => 0x6b04, 0x4d74 => 0x6feb, 0x4d75 => 0x85cd, 0x4d76 => 0x862d,
+  0x4d77 => 0x89a7, 0x4d78 => 0x5229, 0x4d79 => 0x540f, 0x4d7a => 0x5c65,
+  0x4d7b => 0x674e, 0x4d7c => 0x68a8, 0x4d7d => 0x7406, 0x4d7e => 0x7483,
+  0x4e21 => 0x75e2, 0x4e22 => 0x88cf, 0x4e23 => 0x88e1, 0x4e24 => 0x91cc,
+  0x4e25 => 0x96e2, 0x4e26 => 0x9678, 0x4e27 => 0x5f8b, 0x4e28 => 0x7387,
+  0x4e29 => 0x7acb, 0x4e2a => 0x844e, 0x4e2b => 0x63a0, 0x4e2c => 0x7565,
+  0x4e2d => 0x5289, 0x4e2e => 0x6d41, 0x4e2f => 0x6e9c, 0x4e30 => 0x7409,
+  0x4e31 => 0x7559, 0x4e32 => 0x786b, 0x4e33 => 0x7c92, 0x4e34 => 0x9686,
+  0x4e35 => 0x7adc, 0x4e36 => 0x9f8d, 0x4e37 => 0x4fb6, 0x4e38 => 0x616e,
+  0x4e39 => 0x65c5, 0x4e3a => 0x865c, 0x4e3b => 0x4e86, 0x4e3c => 0x4eae,
+  0x4e3d => 0x50da, 0x4e3e => 0x4e21, 0x4e3f => 0x51cc, 0x4e40 => 0x5bee,
+  0x4e41 => 0x6599, 0x4e42 => 0x6881, 0x4e43 => 0x6dbc, 0x4e44 => 0x731f,
+  0x4e45 => 0x7642, 0x4e46 => 0x77ad, 0x4e47 => 0x7a1c, 0x4e48 => 0x7ce7,
+  0x4e49 => 0x826f, 0x4e4a => 0x8ad2, 0x4e4b => 0x907c, 0x4e4c => 0x91cf,
+  0x4e4d => 0x9675, 0x4e4e => 0x9818, 0x4e4f => 0x529b, 0x4e50 => 0x7dd1,
+  0x4e51 => 0x502b, 0x4e52 => 0x5398, 0x4e53 => 0x6797, 0x4e54 => 0x6dcb,
+  0x4e55 => 0x71d0, 0x4e56 => 0x7433, 0x4e57 => 0x81e8, 0x4e58 => 0x8f2a,
+  0x4e59 => 0x96a3, 0x4e5a => 0x9c57, 0x4e5b => 0x9e9f, 0x4e5c => 0x7460,
+  0x4e5d => 0x5841, 0x4e5e => 0x6d99, 0x4e5f => 0x7d2f, 0x4e60 => 0x985e,
+  0x4e61 => 0x4ee4, 0x4e62 => 0x4f36, 0x4e63 => 0x4f8b, 0x4e64 => 0x51b7,
+  0x4e65 => 0x52b1, 0x4e66 => 0x5dba, 0x4e67 => 0x601c, 0x4e68 => 0x73b2,
+  0x4e69 => 0x793c, 0x4e6a => 0x82d3, 0x4e6b => 0x9234, 0x4e6c => 0x96b7,
+  0x4e6d => 0x96f6, 0x4e6e => 0x970a, 0x4e6f => 0x9e97, 0x4e70 => 0x9f62,
+  0x4e71 => 0x66a6, 0x4e72 => 0x6b74, 0x4e73 => 0x5217, 0x4e74 => 0x52a3,
+  0x4e75 => 0x70c8, 0x4e76 => 0x88c2, 0x4e77 => 0x5ec9, 0x4e78 => 0x604b,
+  0x4e79 => 0x6190, 0x4e7a => 0x6f23, 0x4e7b => 0x7149, 0x4e7c => 0x7c3e,
+  0x4e7d => 0x7df4, 0x4e7e => 0x806f, 0x4f21 => 0x84ee, 0x4f22 => 0x9023,
+  0x4f23 => 0x932c, 0x4f24 => 0x5442, 0x4f25 => 0x9b6f, 0x4f26 => 0x6ad3,
+  0x4f27 => 0x7089, 0x4f28 => 0x8cc2, 0x4f29 => 0x8def, 0x4f2a => 0x9732,
+  0x4f2b => 0x52b4, 0x4f2c => 0x5a41, 0x4f2d => 0x5eca, 0x4f2e => 0x5f04,
+  0x4f2f => 0x6717, 0x4f30 => 0x697c, 0x4f31 => 0x6994, 0x4f32 => 0x6d6a,
+  0x4f33 => 0x6f0f, 0x4f34 => 0x7262, 0x4f35 => 0x72fc, 0x4f36 => 0x7bed,
+  0x4f37 => 0x8001, 0x4f38 => 0x807e, 0x4f39 => 0x874b, 0x4f3a => 0x90ce,
+  0x4f3b => 0x516d, 0x4f3c => 0x9e93, 0x4f3d => 0x7984, 0x4f3e => 0x808b,
+  0x4f3f => 0x9332, 0x4f40 => 0x8ad6, 0x4f41 => 0x502d, 0x4f42 => 0x548c,
+  0x4f43 => 0x8a71, 0x4f44 => 0x6b6a, 0x4f45 => 0x8cc4, 0x4f46 => 0x8107,
+  0x4f47 => 0x60d1, 0x4f48 => 0x67a0, 0x4f49 => 0x9df2, 0x4f4a => 0x4e99,
+  0x4f4b => 0x4e98, 0x4f4c => 0x9c10, 0x4f4d => 0x8a6b, 0x4f4e => 0x85c1,
+  0x4f4f => 0x8568, 0x4f50 => 0x6900, 0x4f51 => 0x6e7e, 0x4f52 => 0x7897,
+  0x4f53 => 0x8155, 0x5021 => 0x5f0c, 0x5022 => 0x4e10, 0x5023 => 0x4e15,
+  0x5024 => 0x4e2a, 0x5025 => 0x4e31, 0x5026 => 0x4e36, 0x5027 => 0x4e3c,
+  0x5028 => 0x4e3f, 0x5029 => 0x4e42, 0x502a => 0x4e56, 0x502b => 0x4e58,
+  0x502c => 0x4e82, 0x502d => 0x4e85, 0x502e => 0x8c6b, 0x502f => 0x4e8a,
+  0x5030 => 0x8212, 0x5031 => 0x5f0d, 0x5032 => 0x4e8e, 0x5033 => 0x4e9e,
+  0x5034 => 0x4e9f, 0x5035 => 0x4ea0, 0x5036 => 0x4ea2, 0x5037 => 0x4eb0,
+  0x5038 => 0x4eb3, 0x5039 => 0x4eb6, 0x503a => 0x4ece, 0x503b => 0x4ecd,
+  0x503c => 0x4ec4, 0x503d => 0x4ec6, 0x503e => 0x4ec2, 0x503f => 0x4ed7,
+  0x5040 => 0x4ede, 0x5041 => 0x4eed, 0x5042 => 0x4edf, 0x5043 => 0x4ef7,
+  0x5044 => 0x4f09, 0x5045 => 0x4f5a, 0x5046 => 0x4f30, 0x5047 => 0x4f5b,
+  0x5048 => 0x4f5d, 0x5049 => 0x4f57, 0x504a => 0x4f47, 0x504b => 0x4f76,
+  0x504c => 0x4f88, 0x504d => 0x4f8f, 0x504e => 0x4f98, 0x504f => 0x4f7b,
+  0x5050 => 0x4f69, 0x5051 => 0x4f70, 0x5052 => 0x4f91, 0x5053 => 0x4f6f,
+  0x5054 => 0x4f86, 0x5055 => 0x4f96, 0x5056 => 0x5118, 0x5057 => 0x4fd4,
+  0x5058 => 0x4fdf, 0x5059 => 0x4fce, 0x505a => 0x4fd8, 0x505b => 0x4fdb,
+  0x505c => 0x4fd1, 0x505d => 0x4fda, 0x505e => 0x4fd0, 0x505f => 0x4fe4,
+  0x5060 => 0x4fe5, 0x5061 => 0x501a, 0x5062 => 0x5028, 0x5063 => 0x5014,
+  0x5064 => 0x502a, 0x5065 => 0x5025, 0x5066 => 0x5005, 0x5067 => 0x4f1c,
+  0x5068 => 0x4ff6, 0x5069 => 0x5021, 0x506a => 0x5029, 0x506b => 0x502c,
+  0x506c => 0x4ffe, 0x506d => 0x4fef, 0x506e => 0x5011, 0x506f => 0x5006,
+  0x5070 => 0x5043, 0x5071 => 0x5047, 0x5072 => 0x6703, 0x5073 => 0x5055,
+  0x5074 => 0x5050, 0x5075 => 0x5048, 0x5076 => 0x505a, 0x5077 => 0x5056,
+  0x5078 => 0x506c, 0x5079 => 0x5078, 0x507a => 0x5080, 0x507b => 0x509a,
+  0x507c => 0x5085, 0x507d => 0x50b4, 0x507e => 0x50b2, 0x5121 => 0x50c9,
+  0x5122 => 0x50ca, 0x5123 => 0x50b3, 0x5124 => 0x50c2, 0x5125 => 0x50d6,
+  0x5126 => 0x50de, 0x5127 => 0x50e5, 0x5128 => 0x50ed, 0x5129 => 0x50e3,
+  0x512a => 0x50ee, 0x512b => 0x50f9, 0x512c => 0x50f5, 0x512d => 0x5109,
+  0x512e => 0x5101, 0x512f => 0x5102, 0x5130 => 0x5116, 0x5131 => 0x5115,
+  0x5132 => 0x5114, 0x5133 => 0x511a, 0x5134 => 0x5121, 0x5135 => 0x513a,
+  0x5136 => 0x5137, 0x5137 => 0x513c, 0x5138 => 0x513b, 0x5139 => 0x513f,
+  0x513a => 0x5140, 0x513b => 0x5152, 0x513c => 0x514c, 0x513d => 0x5154,
+  0x513e => 0x5162, 0x513f => 0x7af8, 0x5140 => 0x5169, 0x5141 => 0x516a,
+  0x5142 => 0x516e, 0x5143 => 0x5180, 0x5144 => 0x5182, 0x5145 => 0x56d8,
+  0x5146 => 0x518c, 0x5147 => 0x5189, 0x5148 => 0x518f, 0x5149 => 0x5191,
+  0x514a => 0x5193, 0x514b => 0x5195, 0x514c => 0x5196, 0x514d => 0x51a4,
+  0x514e => 0x51a6, 0x514f => 0x51a2, 0x5150 => 0x51a9, 0x5151 => 0x51aa,
+  0x5152 => 0x51ab, 0x5153 => 0x51b3, 0x5154 => 0x51b1, 0x5155 => 0x51b2,
+  0x5156 => 0x51b0, 0x5157 => 0x51b5, 0x5158 => 0x51bd, 0x5159 => 0x51c5,
+  0x515a => 0x51c9, 0x515b => 0x51db, 0x515c => 0x51e0, 0x515d => 0x8655,
+  0x515e => 0x51e9, 0x515f => 0x51ed, 0x5160 => 0x51f0, 0x5161 => 0x51f5,
+  0x5162 => 0x51fe, 0x5163 => 0x5204, 0x5164 => 0x520b, 0x5165 => 0x5214,
+  0x5166 => 0x520e, 0x5167 => 0x5227, 0x5168 => 0x522a, 0x5169 => 0x522e,
+  0x516a => 0x5233, 0x516b => 0x5239, 0x516c => 0x524f, 0x516d => 0x5244,
+  0x516e => 0x524b, 0x516f => 0x524c, 0x5170 => 0x525e, 0x5171 => 0x5254,
+  0x5172 => 0x526a, 0x5173 => 0x5274, 0x5174 => 0x5269, 0x5175 => 0x5273,
+  0x5176 => 0x527f, 0x5177 => 0x527d, 0x5178 => 0x528d, 0x5179 => 0x5294,
+  0x517a => 0x5292, 0x517b => 0x5271, 0x517c => 0x5288, 0x517d => 0x5291,
+  0x517e => 0x8fa8, 0x5221 => 0x8fa7, 0x5222 => 0x52ac, 0x5223 => 0x52ad,
+  0x5224 => 0x52bc, 0x5225 => 0x52b5, 0x5226 => 0x52c1, 0x5227 => 0x52cd,
+  0x5228 => 0x52d7, 0x5229 => 0x52de, 0x522a => 0x52e3, 0x522b => 0x52e6,
+  0x522c => 0x98ed, 0x522d => 0x52e0, 0x522e => 0x52f3, 0x522f => 0x52f5,
+  0x5230 => 0x52f8, 0x5231 => 0x52f9, 0x5232 => 0x5306, 0x5233 => 0x5308,
+  0x5234 => 0x7538, 0x5235 => 0x530d, 0x5236 => 0x5310, 0x5237 => 0x530f,
+  0x5238 => 0x5315, 0x5239 => 0x531a, 0x523a => 0x5323, 0x523b => 0x532f,
+  0x523c => 0x5331, 0x523d => 0x5333, 0x523e => 0x5338, 0x523f => 0x5340,
+  0x5240 => 0x5346, 0x5241 => 0x5345, 0x5242 => 0x4e17, 0x5243 => 0x5349,
+  0x5244 => 0x534d, 0x5245 => 0x51d6, 0x5246 => 0x535e, 0x5247 => 0x5369,
+  0x5248 => 0x536e, 0x5249 => 0x5918, 0x524a => 0x537b, 0x524b => 0x5377,
+  0x524c => 0x5382, 0x524d => 0x5396, 0x524e => 0x53a0, 0x524f => 0x53a6,
+  0x5250 => 0x53a5, 0x5251 => 0x53ae, 0x5252 => 0x53b0, 0x5253 => 0x53b6,
+  0x5254 => 0x53c3, 0x5255 => 0x7c12, 0x5256 => 0x96d9, 0x5257 => 0x53df,
+  0x5258 => 0x66fc, 0x5259 => 0x71ee, 0x525a => 0x53ee, 0x525b => 0x53e8,
+  0x525c => 0x53ed, 0x525d => 0x53fa, 0x525e => 0x5401, 0x525f => 0x543d,
+  0x5260 => 0x5440, 0x5261 => 0x542c, 0x5262 => 0x542d, 0x5263 => 0x543c,
+  0x5264 => 0x542e, 0x5265 => 0x5436, 0x5266 => 0x5429, 0x5267 => 0x541d,
+  0x5268 => 0x544e, 0x5269 => 0x548f, 0x526a => 0x5475, 0x526b => 0x548e,
+  0x526c => 0x545f, 0x526d => 0x5471, 0x526e => 0x5477, 0x526f => 0x5470,
+  0x5270 => 0x5492, 0x5271 => 0x547b, 0x5272 => 0x5480, 0x5273 => 0x5476,
+  0x5274 => 0x5484, 0x5275 => 0x5490, 0x5276 => 0x5486, 0x5277 => 0x54c7,
+  0x5278 => 0x54a2, 0x5279 => 0x54b8, 0x527a => 0x54a5, 0x527b => 0x54ac,
+  0x527c => 0x54c4, 0x527d => 0x54c8, 0x527e => 0x54a8, 0x5321 => 0x54ab,
+  0x5322 => 0x54c2, 0x5323 => 0x54a4, 0x5324 => 0x54be, 0x5325 => 0x54bc,
+  0x5326 => 0x54d8, 0x5327 => 0x54e5, 0x5328 => 0x54e6, 0x5329 => 0x550f,
+  0x532a => 0x5514, 0x532b => 0x54fd, 0x532c => 0x54ee, 0x532d => 0x54ed,
+  0x532e => 0x54fa, 0x532f => 0x54e2, 0x5330 => 0x5539, 0x5331 => 0x5540,
+  0x5332 => 0x5563, 0x5333 => 0x554c, 0x5334 => 0x552e, 0x5335 => 0x555c,
+  0x5336 => 0x5545, 0x5337 => 0x5556, 0x5338 => 0x5557, 0x5339 => 0x5538,
+  0x533a => 0x5533, 0x533b => 0x555d, 0x533c => 0x5599, 0x533d => 0x5580,
+  0x533e => 0x54af, 0x533f => 0x558a, 0x5340 => 0x559f, 0x5341 => 0x557b,
+  0x5342 => 0x557e, 0x5343 => 0x5598, 0x5344 => 0x559e, 0x5345 => 0x55ae,
+  0x5346 => 0x557c, 0x5347 => 0x5583, 0x5348 => 0x55a9, 0x5349 => 0x5587,
+  0x534a => 0x55a8, 0x534b => 0x55da, 0x534c => 0x55c5, 0x534d => 0x55df,
+  0x534e => 0x55c4, 0x534f => 0x55dc, 0x5350 => 0x55e4, 0x5351 => 0x55d4,
+  0x5352 => 0x5614, 0x5353 => 0x55f7, 0x5354 => 0x5616, 0x5355 => 0x55fe,
+  0x5356 => 0x55fd, 0x5357 => 0x561b, 0x5358 => 0x55f9, 0x5359 => 0x564e,
+  0x535a => 0x5650, 0x535b => 0x71df, 0x535c => 0x5634, 0x535d => 0x5636,
+  0x535e => 0x5632, 0x535f => 0x5638, 0x5360 => 0x566b, 0x5361 => 0x5664,
+  0x5362 => 0x562f, 0x5363 => 0x566c, 0x5364 => 0x566a, 0x5365 => 0x5686,
+  0x5366 => 0x5680, 0x5367 => 0x568a, 0x5368 => 0x56a0, 0x5369 => 0x5694,
+  0x536a => 0x568f, 0x536b => 0x56a5, 0x536c => 0x56ae, 0x536d => 0x56b6,
+  0x536e => 0x56b4, 0x536f => 0x56c2, 0x5370 => 0x56bc, 0x5371 => 0x56c1,
+  0x5372 => 0x56c3, 0x5373 => 0x56c0, 0x5374 => 0x56c8, 0x5375 => 0x56ce,
+  0x5376 => 0x56d1, 0x5377 => 0x56d3, 0x5378 => 0x56d7, 0x5379 => 0x56ee,
+  0x537a => 0x56f9, 0x537b => 0x5700, 0x537c => 0x56ff, 0x537d => 0x5704,
+  0x537e => 0x5709, 0x5421 => 0x5708, 0x5422 => 0x570b, 0x5423 => 0x570d,
+  0x5424 => 0x5713, 0x5425 => 0x5718, 0x5426 => 0x5716, 0x5427 => 0x55c7,
+  0x5428 => 0x571c, 0x5429 => 0x5726, 0x542a => 0x5737, 0x542b => 0x5738,
+  0x542c => 0x574e, 0x542d => 0x573b, 0x542e => 0x5740, 0x542f => 0x574f,
+  0x5430 => 0x5769, 0x5431 => 0x57c0, 0x5432 => 0x5788, 0x5433 => 0x5761,
+  0x5434 => 0x577f, 0x5435 => 0x5789, 0x5436 => 0x5793, 0x5437 => 0x57a0,
+  0x5438 => 0x57b3, 0x5439 => 0x57a4, 0x543a => 0x57aa, 0x543b => 0x57b0,
+  0x543c => 0x57c3, 0x543d => 0x57c6, 0x543e => 0x57d4, 0x543f => 0x57d2,
+  0x5440 => 0x57d3, 0x5441 => 0x580a, 0x5442 => 0x57d6, 0x5443 => 0x57e3,
+  0x5444 => 0x580b, 0x5445 => 0x5819, 0x5446 => 0x581d, 0x5447 => 0x5872,
+  0x5448 => 0x5821, 0x5449 => 0x5862, 0x544a => 0x584b, 0x544b => 0x5870,
+  0x544c => 0x6bc0, 0x544d => 0x5852, 0x544e => 0x583d, 0x544f => 0x5879,
+  0x5450 => 0x5885, 0x5451 => 0x58b9, 0x5452 => 0x589f, 0x5453 => 0x58ab,
+  0x5454 => 0x58ba, 0x5455 => 0x58de, 0x5456 => 0x58bb, 0x5457 => 0x58b8,
+  0x5458 => 0x58ae, 0x5459 => 0x58c5, 0x545a => 0x58d3, 0x545b => 0x58d1,
+  0x545c => 0x58d7, 0x545d => 0x58d9, 0x545e => 0x58d8, 0x545f => 0x58e5,
+  0x5460 => 0x58dc, 0x5461 => 0x58e4, 0x5462 => 0x58df, 0x5463 => 0x58ef,
+  0x5464 => 0x58fa, 0x5465 => 0x58f9, 0x5466 => 0x58fb, 0x5467 => 0x58fc,
+  0x5468 => 0x58fd, 0x5469 => 0x5902, 0x546a => 0x590a, 0x546b => 0x5910,
+  0x546c => 0x591b, 0x546d => 0x68a6, 0x546e => 0x5925, 0x546f => 0x592c,
+  0x5470 => 0x592d, 0x5471 => 0x5932, 0x5472 => 0x5938, 0x5473 => 0x593e,
+  0x5474 => 0x7ad2, 0x5475 => 0x5955, 0x5476 => 0x5950, 0x5477 => 0x594e,
+  0x5478 => 0x595a, 0x5479 => 0x5958, 0x547a => 0x5962, 0x547b => 0x5960,
+  0x547c => 0x5967, 0x547d => 0x596c, 0x547e => 0x5969, 0x5521 => 0x5978,
+  0x5522 => 0x5981, 0x5523 => 0x599d, 0x5524 => 0x4f5e, 0x5525 => 0x4fab,
+  0x5526 => 0x59a3, 0x5527 => 0x59b2, 0x5528 => 0x59c6, 0x5529 => 0x59e8,
+  0x552a => 0x59dc, 0x552b => 0x598d, 0x552c => 0x59d9, 0x552d => 0x59da,
+  0x552e => 0x5a25, 0x552f => 0x5a1f, 0x5530 => 0x5a11, 0x5531 => 0x5a1c,
+  0x5532 => 0x5a09, 0x5533 => 0x5a1a, 0x5534 => 0x5a40, 0x5535 => 0x5a6c,
+  0x5536 => 0x5a49, 0x5537 => 0x5a35, 0x5538 => 0x5a36, 0x5539 => 0x5a62,
+  0x553a => 0x5a6a, 0x553b => 0x5a9a, 0x553c => 0x5abc, 0x553d => 0x5abe,
+  0x553e => 0x5acb, 0x553f => 0x5ac2, 0x5540 => 0x5abd, 0x5541 => 0x5ae3,
+  0x5542 => 0x5ad7, 0x5543 => 0x5ae6, 0x5544 => 0x5ae9, 0x5545 => 0x5ad6,
+  0x5546 => 0x5afa, 0x5547 => 0x5afb, 0x5548 => 0x5b0c, 0x5549 => 0x5b0b,
+  0x554a => 0x5b16, 0x554b => 0x5b32, 0x554c => 0x5ad0, 0x554d => 0x5b2a,
+  0x554e => 0x5b36, 0x554f => 0x5b3e, 0x5550 => 0x5b43, 0x5551 => 0x5b45,
+  0x5552 => 0x5b40, 0x5553 => 0x5b51, 0x5554 => 0x5b55, 0x5555 => 0x5b5a,
+  0x5556 => 0x5b5b, 0x5557 => 0x5b65, 0x5558 => 0x5b69, 0x5559 => 0x5b70,
+  0x555a => 0x5b73, 0x555b => 0x5b75, 0x555c => 0x5b78, 0x555d => 0x6588,
+  0x555e => 0x5b7a, 0x555f => 0x5b80, 0x5560 => 0x5b83, 0x5561 => 0x5ba6,
+  0x5562 => 0x5bb8, 0x5563 => 0x5bc3, 0x5564 => 0x5bc7, 0x5565 => 0x5bc9,
+  0x5566 => 0x5bd4, 0x5567 => 0x5bd0, 0x5568 => 0x5be4, 0x5569 => 0x5be6,
+  0x556a => 0x5be2, 0x556b => 0x5bde, 0x556c => 0x5be5, 0x556d => 0x5beb,
+  0x556e => 0x5bf0, 0x556f => 0x5bf6, 0x5570 => 0x5bf3, 0x5571 => 0x5c05,
+  0x5572 => 0x5c07, 0x5573 => 0x5c08, 0x5574 => 0x5c0d, 0x5575 => 0x5c13,
+  0x5576 => 0x5c20, 0x5577 => 0x5c22, 0x5578 => 0x5c28, 0x5579 => 0x5c38,
+  0x557a => 0x5c39, 0x557b => 0x5c41, 0x557c => 0x5c46, 0x557d => 0x5c4e,
+  0x557e => 0x5c53, 0x5621 => 0x5c50, 0x5622 => 0x5c4f, 0x5623 => 0x5b71,
+  0x5624 => 0x5c6c, 0x5625 => 0x5c6e, 0x5626 => 0x4e62, 0x5627 => 0x5c76,
+  0x5628 => 0x5c79, 0x5629 => 0x5c8c, 0x562a => 0x5c91, 0x562b => 0x5c94,
+  0x562c => 0x599b, 0x562d => 0x5cab, 0x562e => 0x5cbb, 0x562f => 0x5cb6,
+  0x5630 => 0x5cbc, 0x5631 => 0x5cb7, 0x5632 => 0x5cc5, 0x5633 => 0x5cbe,
+  0x5634 => 0x5cc7, 0x5635 => 0x5cd9, 0x5636 => 0x5ce9, 0x5637 => 0x5cfd,
+  0x5638 => 0x5cfa, 0x5639 => 0x5ced, 0x563a => 0x5d8c, 0x563b => 0x5cea,
+  0x563c => 0x5d0b, 0x563d => 0x5d15, 0x563e => 0x5d17, 0x563f => 0x5d5c,
+  0x5640 => 0x5d1f, 0x5641 => 0x5d1b, 0x5642 => 0x5d11, 0x5643 => 0x5d14,
+  0x5644 => 0x5d22, 0x5645 => 0x5d1a, 0x5646 => 0x5d19, 0x5647 => 0x5d18,
+  0x5648 => 0x5d4c, 0x5649 => 0x5d52, 0x564a => 0x5d4e, 0x564b => 0x5d4b,
+  0x564c => 0x5d6c, 0x564d => 0x5d73, 0x564e => 0x5d76, 0x564f => 0x5d87,
+  0x5650 => 0x5d84, 0x5651 => 0x5d82, 0x5652 => 0x5da2, 0x5653 => 0x5d9d,
+  0x5654 => 0x5dac, 0x5655 => 0x5dae, 0x5656 => 0x5dbd, 0x5657 => 0x5d90,
+  0x5658 => 0x5db7, 0x5659 => 0x5dbc, 0x565a => 0x5dc9, 0x565b => 0x5dcd,
+  0x565c => 0x5dd3, 0x565d => 0x5dd2, 0x565e => 0x5dd6, 0x565f => 0x5ddb,
+  0x5660 => 0x5deb, 0x5661 => 0x5df2, 0x5662 => 0x5df5, 0x5663 => 0x5e0b,
+  0x5664 => 0x5e1a, 0x5665 => 0x5e19, 0x5666 => 0x5e11, 0x5667 => 0x5e1b,
+  0x5668 => 0x5e36, 0x5669 => 0x5e37, 0x566a => 0x5e44, 0x566b => 0x5e43,
+  0x566c => 0x5e40, 0x566d => 0x5e4e, 0x566e => 0x5e57, 0x566f => 0x5e54,
+  0x5670 => 0x5e5f, 0x5671 => 0x5e62, 0x5672 => 0x5e64, 0x5673 => 0x5e47,
+  0x5674 => 0x5e75, 0x5675 => 0x5e76, 0x5676 => 0x5e7a, 0x5677 => 0x9ebc,
+  0x5678 => 0x5e7f, 0x5679 => 0x5ea0, 0x567a => 0x5ec1, 0x567b => 0x5ec2,
+  0x567c => 0x5ec8, 0x567d => 0x5ed0, 0x567e => 0x5ecf, 0x5721 => 0x5ed6,
+  0x5722 => 0x5ee3, 0x5723 => 0x5edd, 0x5724 => 0x5eda, 0x5725 => 0x5edb,
+  0x5726 => 0x5ee2, 0x5727 => 0x5ee1, 0x5728 => 0x5ee8, 0x5729 => 0x5ee9,
+  0x572a => 0x5eec, 0x572b => 0x5ef1, 0x572c => 0x5ef3, 0x572d => 0x5ef0,
+  0x572e => 0x5ef4, 0x572f => 0x5ef8, 0x5730 => 0x5efe, 0x5731 => 0x5f03,
+  0x5732 => 0x5f09, 0x5733 => 0x5f5d, 0x5734 => 0x5f5c, 0x5735 => 0x5f0b,
+  0x5736 => 0x5f11, 0x5737 => 0x5f16, 0x5738 => 0x5f29, 0x5739 => 0x5f2d,
+  0x573a => 0x5f38, 0x573b => 0x5f41, 0x573c => 0x5f48, 0x573d => 0x5f4c,
+  0x573e => 0x5f4e, 0x573f => 0x5f2f, 0x5740 => 0x5f51, 0x5741 => 0x5f56,
+  0x5742 => 0x5f57, 0x5743 => 0x5f59, 0x5744 => 0x5f61, 0x5745 => 0x5f6d,
+  0x5746 => 0x5f73, 0x5747 => 0x5f77, 0x5748 => 0x5f83, 0x5749 => 0x5f82,
+  0x574a => 0x5f7f, 0x574b => 0x5f8a, 0x574c => 0x5f88, 0x574d => 0x5f91,
+  0x574e => 0x5f87, 0x574f => 0x5f9e, 0x5750 => 0x5f99, 0x5751 => 0x5f98,
+  0x5752 => 0x5fa0, 0x5753 => 0x5fa8, 0x5754 => 0x5fad, 0x5755 => 0x5fbc,
+  0x5756 => 0x5fd6, 0x5757 => 0x5ffb, 0x5758 => 0x5fe4, 0x5759 => 0x5ff8,
+  0x575a => 0x5ff1, 0x575b => 0x5fdd, 0x575c => 0x60b3, 0x575d => 0x5fff,
+  0x575e => 0x6021, 0x575f => 0x6060, 0x5760 => 0x6019, 0x5761 => 0x6010,
+  0x5762 => 0x6029, 0x5763 => 0x600e, 0x5764 => 0x6031, 0x5765 => 0x601b,
+  0x5766 => 0x6015, 0x5767 => 0x602b, 0x5768 => 0x6026, 0x5769 => 0x600f,
+  0x576a => 0x603a, 0x576b => 0x605a, 0x576c => 0x6041, 0x576d => 0x606a,
+  0x576e => 0x6077, 0x576f => 0x605f, 0x5770 => 0x604a, 0x5771 => 0x6046,
+  0x5772 => 0x604d, 0x5773 => 0x6063, 0x5774 => 0x6043, 0x5775 => 0x6064,
+  0x5776 => 0x6042, 0x5777 => 0x606c, 0x5778 => 0x606b, 0x5779 => 0x6059,
+  0x577a => 0x6081, 0x577b => 0x608d, 0x577c => 0x60e7, 0x577d => 0x6083,
+  0x577e => 0x609a, 0x5821 => 0x6084, 0x5822 => 0x609b, 0x5823 => 0x6096,
+  0x5824 => 0x6097, 0x5825 => 0x6092, 0x5826 => 0x60a7, 0x5827 => 0x608b,
+  0x5828 => 0x60e1, 0x5829 => 0x60b8, 0x582a => 0x60e0, 0x582b => 0x60d3,
+  0x582c => 0x60b4, 0x582d => 0x5ff0, 0x582e => 0x60bd, 0x582f => 0x60c6,
+  0x5830 => 0x60b5, 0x5831 => 0x60d8, 0x5832 => 0x614d, 0x5833 => 0x6115,
+  0x5834 => 0x6106, 0x5835 => 0x60f6, 0x5836 => 0x60f7, 0x5837 => 0x6100,
+  0x5838 => 0x60f4, 0x5839 => 0x60fa, 0x583a => 0x6103, 0x583b => 0x6121,
+  0x583c => 0x60fb, 0x583d => 0x60f1, 0x583e => 0x610d, 0x583f => 0x610e,
+  0x5840 => 0x6147, 0x5841 => 0x613e, 0x5842 => 0x6128, 0x5843 => 0x6127,
+  0x5844 => 0x614a, 0x5845 => 0x613f, 0x5846 => 0x613c, 0x5847 => 0x612c,
+  0x5848 => 0x6134, 0x5849 => 0x613d, 0x584a => 0x6142, 0x584b => 0x6144,
+  0x584c => 0x6173, 0x584d => 0x6177, 0x584e => 0x6158, 0x584f => 0x6159,
+  0x5850 => 0x615a, 0x5851 => 0x616b, 0x5852 => 0x6174, 0x5853 => 0x616f,
+  0x5854 => 0x6165, 0x5855 => 0x6171, 0x5856 => 0x615f, 0x5857 => 0x615d,
+  0x5858 => 0x6153, 0x5859 => 0x6175, 0x585a => 0x6199, 0x585b => 0x6196,
+  0x585c => 0x6187, 0x585d => 0x61ac, 0x585e => 0x6194, 0x585f => 0x619a,
+  0x5860 => 0x618a, 0x5861 => 0x6191, 0x5862 => 0x61ab, 0x5863 => 0x61ae,
+  0x5864 => 0x61cc, 0x5865 => 0x61ca, 0x5866 => 0x61c9, 0x5867 => 0x61f7,
+  0x5868 => 0x61c8, 0x5869 => 0x61c3, 0x586a => 0x61c6, 0x586b => 0x61ba,
+  0x586c => 0x61cb, 0x586d => 0x7f79, 0x586e => 0x61cd, 0x586f => 0x61e6,
+  0x5870 => 0x61e3, 0x5871 => 0x61f6, 0x5872 => 0x61fa, 0x5873 => 0x61f4,
+  0x5874 => 0x61ff, 0x5875 => 0x61fd, 0x5876 => 0x61fc, 0x5877 => 0x61fe,
+  0x5878 => 0x6200, 0x5879 => 0x6208, 0x587a => 0x6209, 0x587b => 0x620d,
+  0x587c => 0x620c, 0x587d => 0x6214, 0x587e => 0x621b, 0x5921 => 0x621e,
+  0x5922 => 0x6221, 0x5923 => 0x622a, 0x5924 => 0x622e, 0x5925 => 0x6230,
+  0x5926 => 0x6232, 0x5927 => 0x6233, 0x5928 => 0x6241, 0x5929 => 0x624e,
+  0x592a => 0x625e, 0x592b => 0x6263, 0x592c => 0x625b, 0x592d => 0x6260,
+  0x592e => 0x6268, 0x592f => 0x627c, 0x5930 => 0x6282, 0x5931 => 0x6289,
+  0x5932 => 0x627e, 0x5933 => 0x6292, 0x5934 => 0x6293, 0x5935 => 0x6296,
+  0x5936 => 0x62d4, 0x5937 => 0x6283, 0x5938 => 0x6294, 0x5939 => 0x62d7,
+  0x593a => 0x62d1, 0x593b => 0x62bb, 0x593c => 0x62cf, 0x593d => 0x62ff,
+  0x593e => 0x62c6, 0x593f => 0x64d4, 0x5940 => 0x62c8, 0x5941 => 0x62dc,
+  0x5942 => 0x62cc, 0x5943 => 0x62ca, 0x5944 => 0x62c2, 0x5945 => 0x62c7,
+  0x5946 => 0x629b, 0x5947 => 0x62c9, 0x5948 => 0x630c, 0x5949 => 0x62ee,
+  0x594a => 0x62f1, 0x594b => 0x6327, 0x594c => 0x6302, 0x594d => 0x6308,
+  0x594e => 0x62ef, 0x594f => 0x62f5, 0x5950 => 0x6350, 0x5951 => 0x633e,
+  0x5952 => 0x634d, 0x5953 => 0x641c, 0x5954 => 0x634f, 0x5955 => 0x6396,
+  0x5956 => 0x638e, 0x5957 => 0x6380, 0x5958 => 0x63ab, 0x5959 => 0x6376,
+  0x595a => 0x63a3, 0x595b => 0x638f, 0x595c => 0x6389, 0x595d => 0x639f,
+  0x595e => 0x63b5, 0x595f => 0x636b, 0x5960 => 0x6369, 0x5961 => 0x63be,
+  0x5962 => 0x63e9, 0x5963 => 0x63c0, 0x5964 => 0x63c6, 0x5965 => 0x63e3,
+  0x5966 => 0x63c9, 0x5967 => 0x63d2, 0x5968 => 0x63f6, 0x5969 => 0x63c4,
+  0x596a => 0x6416, 0x596b => 0x6434, 0x596c => 0x6406, 0x596d => 0x6413,
+  0x596e => 0x6426, 0x596f => 0x6436, 0x5970 => 0x651d, 0x5971 => 0x6417,
+  0x5972 => 0x6428, 0x5973 => 0x640f, 0x5974 => 0x6467, 0x5975 => 0x646f,
+  0x5976 => 0x6476, 0x5977 => 0x644e, 0x5978 => 0x652a, 0x5979 => 0x6495,
+  0x597a => 0x6493, 0x597b => 0x64a5, 0x597c => 0x64a9, 0x597d => 0x6488,
+  0x597e => 0x64bc, 0x5a21 => 0x64da, 0x5a22 => 0x64d2, 0x5a23 => 0x64c5,
+  0x5a24 => 0x64c7, 0x5a25 => 0x64bb, 0x5a26 => 0x64d8, 0x5a27 => 0x64c2,
+  0x5a28 => 0x64f1, 0x5a29 => 0x64e7, 0x5a2a => 0x8209, 0x5a2b => 0x64e0,
+  0x5a2c => 0x64e1, 0x5a2d => 0x62ac, 0x5a2e => 0x64e3, 0x5a2f => 0x64ef,
+  0x5a30 => 0x652c, 0x5a31 => 0x64f6, 0x5a32 => 0x64f4, 0x5a33 => 0x64f2,
+  0x5a34 => 0x64fa, 0x5a35 => 0x6500, 0x5a36 => 0x64fd, 0x5a37 => 0x6518,
+  0x5a38 => 0x651c, 0x5a39 => 0x6505, 0x5a3a => 0x6524, 0x5a3b => 0x6523,
+  0x5a3c => 0x652b, 0x5a3d => 0x6534, 0x5a3e => 0x6535, 0x5a3f => 0x6537,
+  0x5a40 => 0x6536, 0x5a41 => 0x6538, 0x5a42 => 0x754b, 0x5a43 => 0x6548,
+  0x5a44 => 0x6556, 0x5a45 => 0x6555, 0x5a46 => 0x654d, 0x5a47 => 0x6558,
+  0x5a48 => 0x655e, 0x5a49 => 0x655d, 0x5a4a => 0x6572, 0x5a4b => 0x6578,
+  0x5a4c => 0x6582, 0x5a4d => 0x6583, 0x5a4e => 0x8b8a, 0x5a4f => 0x659b,
+  0x5a50 => 0x659f, 0x5a51 => 0x65ab, 0x5a52 => 0x65b7, 0x5a53 => 0x65c3,
+  0x5a54 => 0x65c6, 0x5a55 => 0x65c1, 0x5a56 => 0x65c4, 0x5a57 => 0x65cc,
+  0x5a58 => 0x65d2, 0x5a59 => 0x65db, 0x5a5a => 0x65d9, 0x5a5b => 0x65e0,
+  0x5a5c => 0x65e1, 0x5a5d => 0x65f1, 0x5a5e => 0x6772, 0x5a5f => 0x660a,
+  0x5a60 => 0x6603, 0x5a61 => 0x65fb, 0x5a62 => 0x6773, 0x5a63 => 0x6635,
+  0x5a64 => 0x6636, 0x5a65 => 0x6634, 0x5a66 => 0x661c, 0x5a67 => 0x664f,
+  0x5a68 => 0x6644, 0x5a69 => 0x6649, 0x5a6a => 0x6641, 0x5a6b => 0x665e,
+  0x5a6c => 0x665d, 0x5a6d => 0x6664, 0x5a6e => 0x6667, 0x5a6f => 0x6668,
+  0x5a70 => 0x665f, 0x5a71 => 0x6662, 0x5a72 => 0x6670, 0x5a73 => 0x6683,
+  0x5a74 => 0x6688, 0x5a75 => 0x668e, 0x5a76 => 0x6689, 0x5a77 => 0x6684,
+  0x5a78 => 0x6698, 0x5a79 => 0x669d, 0x5a7a => 0x66c1, 0x5a7b => 0x66b9,
+  0x5a7c => 0x66c9, 0x5a7d => 0x66be, 0x5a7e => 0x66bc, 0x5b21 => 0x66c4,
+  0x5b22 => 0x66b8, 0x5b23 => 0x66d6, 0x5b24 => 0x66da, 0x5b25 => 0x66e0,
+  0x5b26 => 0x663f, 0x5b27 => 0x66e6, 0x5b28 => 0x66e9, 0x5b29 => 0x66f0,
+  0x5b2a => 0x66f5, 0x5b2b => 0x66f7, 0x5b2c => 0x670f, 0x5b2d => 0x6716,
+  0x5b2e => 0x671e, 0x5b2f => 0x6726, 0x5b30 => 0x6727, 0x5b31 => 0x9738,
+  0x5b32 => 0x672e, 0x5b33 => 0x673f, 0x5b34 => 0x6736, 0x5b35 => 0x6741,
+  0x5b36 => 0x6738, 0x5b37 => 0x6737, 0x5b38 => 0x6746, 0x5b39 => 0x675e,
+  0x5b3a => 0x6760, 0x5b3b => 0x6759, 0x5b3c => 0x6763, 0x5b3d => 0x6764,
+  0x5b3e => 0x6789, 0x5b3f => 0x6770, 0x5b40 => 0x67a9, 0x5b41 => 0x677c,
+  0x5b42 => 0x676a, 0x5b43 => 0x678c, 0x5b44 => 0x678b, 0x5b45 => 0x67a6,
+  0x5b46 => 0x67a1, 0x5b47 => 0x6785, 0x5b48 => 0x67b7, 0x5b49 => 0x67ef,
+  0x5b4a => 0x67b4, 0x5b4b => 0x67ec, 0x5b4c => 0x67b3, 0x5b4d => 0x67e9,
+  0x5b4e => 0x67b8, 0x5b4f => 0x67e4, 0x5b50 => 0x67de, 0x5b51 => 0x67dd,
+  0x5b52 => 0x67e2, 0x5b53 => 0x67ee, 0x5b54 => 0x67b9, 0x5b55 => 0x67ce,
+  0x5b56 => 0x67c6, 0x5b57 => 0x67e7, 0x5b58 => 0x6a9c, 0x5b59 => 0x681e,
+  0x5b5a => 0x6846, 0x5b5b => 0x6829, 0x5b5c => 0x6840, 0x5b5d => 0x684d,
+  0x5b5e => 0x6832, 0x5b5f => 0x684e, 0x5b60 => 0x68b3, 0x5b61 => 0x682b,
+  0x5b62 => 0x6859, 0x5b63 => 0x6863, 0x5b64 => 0x6877, 0x5b65 => 0x687f,
+  0x5b66 => 0x689f, 0x5b67 => 0x688f, 0x5b68 => 0x68ad, 0x5b69 => 0x6894,
+  0x5b6a => 0x689d, 0x5b6b => 0x689b, 0x5b6c => 0x6883, 0x5b6d => 0x6aae,
+  0x5b6e => 0x68b9, 0x5b6f => 0x6874, 0x5b70 => 0x68b5, 0x5b71 => 0x68a0,
+  0x5b72 => 0x68ba, 0x5b73 => 0x690f, 0x5b74 => 0x688d, 0x5b75 => 0x687e,
+  0x5b76 => 0x6901, 0x5b77 => 0x68ca, 0x5b78 => 0x6908, 0x5b79 => 0x68d8,
+  0x5b7a => 0x6922, 0x5b7b => 0x6926, 0x5b7c => 0x68e1, 0x5b7d => 0x690c,
+  0x5b7e => 0x68cd, 0x5c21 => 0x68d4, 0x5c22 => 0x68e7, 0x5c23 => 0x68d5,
+  0x5c24 => 0x6936, 0x5c25 => 0x6912, 0x5c26 => 0x6904, 0x5c27 => 0x68d7,
+  0x5c28 => 0x68e3, 0x5c29 => 0x6925, 0x5c2a => 0x68f9, 0x5c2b => 0x68e0,
+  0x5c2c => 0x68ef, 0x5c2d => 0x6928, 0x5c2e => 0x692a, 0x5c2f => 0x691a,
+  0x5c30 => 0x6923, 0x5c31 => 0x6921, 0x5c32 => 0x68c6, 0x5c33 => 0x6979,
+  0x5c34 => 0x6977, 0x5c35 => 0x695c, 0x5c36 => 0x6978, 0x5c37 => 0x696b,
+  0x5c38 => 0x6954, 0x5c39 => 0x697e, 0x5c3a => 0x696e, 0x5c3b => 0x6939,
+  0x5c3c => 0x6974, 0x5c3d => 0x693d, 0x5c3e => 0x6959, 0x5c3f => 0x6930,
+  0x5c40 => 0x6961, 0x5c41 => 0x695e, 0x5c42 => 0x695d, 0x5c43 => 0x6981,
+  0x5c44 => 0x696a, 0x5c45 => 0x69b2, 0x5c46 => 0x69ae, 0x5c47 => 0x69d0,
+  0x5c48 => 0x69bf, 0x5c49 => 0x69c1, 0x5c4a => 0x69d3, 0x5c4b => 0x69be,
+  0x5c4c => 0x69ce, 0x5c4d => 0x5be8, 0x5c4e => 0x69ca, 0x5c4f => 0x69dd,
+  0x5c50 => 0x69bb, 0x5c51 => 0x69c3, 0x5c52 => 0x69a7, 0x5c53 => 0x6a2e,
+  0x5c54 => 0x6991, 0x5c55 => 0x69a0, 0x5c56 => 0x699c, 0x5c57 => 0x6995,
+  0x5c58 => 0x69b4, 0x5c59 => 0x69de, 0x5c5a => 0x69e8, 0x5c5b => 0x6a02,
+  0x5c5c => 0x6a1b, 0x5c5d => 0x69ff, 0x5c5e => 0x6b0a, 0x5c5f => 0x69f9,
+  0x5c60 => 0x69f2, 0x5c61 => 0x69e7, 0x5c62 => 0x6a05, 0x5c63 => 0x69b1,
+  0x5c64 => 0x6a1e, 0x5c65 => 0x69ed, 0x5c66 => 0x6a14, 0x5c67 => 0x69eb,
+  0x5c68 => 0x6a0a, 0x5c69 => 0x6a12, 0x5c6a => 0x6ac1, 0x5c6b => 0x6a23,
+  0x5c6c => 0x6a13, 0x5c6d => 0x6a44, 0x5c6e => 0x6a0c, 0x5c6f => 0x6a72,
+  0x5c70 => 0x6a36, 0x5c71 => 0x6a78, 0x5c72 => 0x6a47, 0x5c73 => 0x6a62,
+  0x5c74 => 0x6a59, 0x5c75 => 0x6a66, 0x5c76 => 0x6a48, 0x5c77 => 0x6a38,
+  0x5c78 => 0x6a22, 0x5c79 => 0x6a90, 0x5c7a => 0x6a8d, 0x5c7b => 0x6aa0,
+  0x5c7c => 0x6a84, 0x5c7d => 0x6aa2, 0x5c7e => 0x6aa3, 0x5d21 => 0x6a97,
+  0x5d22 => 0x8617, 0x5d23 => 0x6abb, 0x5d24 => 0x6ac3, 0x5d25 => 0x6ac2,
+  0x5d26 => 0x6ab8, 0x5d27 => 0x6ab3, 0x5d28 => 0x6aac, 0x5d29 => 0x6ade,
+  0x5d2a => 0x6ad1, 0x5d2b => 0x6adf, 0x5d2c => 0x6aaa, 0x5d2d => 0x6ada,
+  0x5d2e => 0x6aea, 0x5d2f => 0x6afb, 0x5d30 => 0x6b05, 0x5d31 => 0x8616,
+  0x5d32 => 0x6afa, 0x5d33 => 0x6b12, 0x5d34 => 0x6b16, 0x5d35 => 0x9b31,
+  0x5d36 => 0x6b1f, 0x5d37 => 0x6b38, 0x5d38 => 0x6b37, 0x5d39 => 0x76dc,
+  0x5d3a => 0x6b39, 0x5d3b => 0x98ee, 0x5d3c => 0x6b47, 0x5d3d => 0x6b43,
+  0x5d3e => 0x6b49, 0x5d3f => 0x6b50, 0x5d40 => 0x6b59, 0x5d41 => 0x6b54,
+  0x5d42 => 0x6b5b, 0x5d43 => 0x6b5f, 0x5d44 => 0x6b61, 0x5d45 => 0x6b78,
+  0x5d46 => 0x6b79, 0x5d47 => 0x6b7f, 0x5d48 => 0x6b80, 0x5d49 => 0x6b84,
+  0x5d4a => 0x6b83, 0x5d4b => 0x6b8d, 0x5d4c => 0x6b98, 0x5d4d => 0x6b95,
+  0x5d4e => 0x6b9e, 0x5d4f => 0x6ba4, 0x5d50 => 0x6baa, 0x5d51 => 0x6bab,
+  0x5d52 => 0x6baf, 0x5d53 => 0x6bb2, 0x5d54 => 0x6bb1, 0x5d55 => 0x6bb3,
+  0x5d56 => 0x6bb7, 0x5d57 => 0x6bbc, 0x5d58 => 0x6bc6, 0x5d59 => 0x6bcb,
+  0x5d5a => 0x6bd3, 0x5d5b => 0x6bdf, 0x5d5c => 0x6bec, 0x5d5d => 0x6beb,
+  0x5d5e => 0x6bf3, 0x5d5f => 0x6bef, 0x5d60 => 0x9ebe, 0x5d61 => 0x6c08,
+  0x5d62 => 0x6c13, 0x5d63 => 0x6c14, 0x5d64 => 0x6c1b, 0x5d65 => 0x6c24,
+  0x5d66 => 0x6c23, 0x5d67 => 0x6c5e, 0x5d68 => 0x6c55, 0x5d69 => 0x6c62,
+  0x5d6a => 0x6c6a, 0x5d6b => 0x6c82, 0x5d6c => 0x6c8d, 0x5d6d => 0x6c9a,
+  0x5d6e => 0x6c81, 0x5d6f => 0x6c9b, 0x5d70 => 0x6c7e, 0x5d71 => 0x6c68,
+  0x5d72 => 0x6c73, 0x5d73 => 0x6c92, 0x5d74 => 0x6c90, 0x5d75 => 0x6cc4,
+  0x5d76 => 0x6cf1, 0x5d77 => 0x6cd3, 0x5d78 => 0x6cbd, 0x5d79 => 0x6cd7,
+  0x5d7a => 0x6cc5, 0x5d7b => 0x6cdd, 0x5d7c => 0x6cae, 0x5d7d => 0x6cb1,
+  0x5d7e => 0x6cbe, 0x5e21 => 0x6cba, 0x5e22 => 0x6cdb, 0x5e23 => 0x6cef,
+  0x5e24 => 0x6cd9, 0x5e25 => 0x6cea, 0x5e26 => 0x6d1f, 0x5e27 => 0x884d,
+  0x5e28 => 0x6d36, 0x5e29 => 0x6d2b, 0x5e2a => 0x6d3d, 0x5e2b => 0x6d38,
+  0x5e2c => 0x6d19, 0x5e2d => 0x6d35, 0x5e2e => 0x6d33, 0x5e2f => 0x6d12,
+  0x5e30 => 0x6d0c, 0x5e31 => 0x6d63, 0x5e32 => 0x6d93, 0x5e33 => 0x6d64,
+  0x5e34 => 0x6d5a, 0x5e35 => 0x6d79, 0x5e36 => 0x6d59, 0x5e37 => 0x6d8e,
+  0x5e38 => 0x6d95, 0x5e39 => 0x6fe4, 0x5e3a => 0x6d85, 0x5e3b => 0x6df9,
+  0x5e3c => 0x6e15, 0x5e3d => 0x6e0a, 0x5e3e => 0x6db5, 0x5e3f => 0x6dc7,
+  0x5e40 => 0x6de6, 0x5e41 => 0x6db8, 0x5e42 => 0x6dc6, 0x5e43 => 0x6dec,
+  0x5e44 => 0x6dde, 0x5e45 => 0x6dcc, 0x5e46 => 0x6de8, 0x5e47 => 0x6dd2,
+  0x5e48 => 0x6dc5, 0x5e49 => 0x6dfa, 0x5e4a => 0x6dd9, 0x5e4b => 0x6de4,
+  0x5e4c => 0x6dd5, 0x5e4d => 0x6dea, 0x5e4e => 0x6dee, 0x5e4f => 0x6e2d,
+  0x5e50 => 0x6e6e, 0x5e51 => 0x6e2e, 0x5e52 => 0x6e19, 0x5e53 => 0x6e72,
+  0x5e54 => 0x6e5f, 0x5e55 => 0x6e3e, 0x5e56 => 0x6e23, 0x5e57 => 0x6e6b,
+  0x5e58 => 0x6e2b, 0x5e59 => 0x6e76, 0x5e5a => 0x6e4d, 0x5e5b => 0x6e1f,
+  0x5e5c => 0x6e43, 0x5e5d => 0x6e3a, 0x5e5e => 0x6e4e, 0x5e5f => 0x6e24,
+  0x5e60 => 0x6eff, 0x5e61 => 0x6e1d, 0x5e62 => 0x6e38, 0x5e63 => 0x6e82,
+  0x5e64 => 0x6eaa, 0x5e65 => 0x6e98, 0x5e66 => 0x6ec9, 0x5e67 => 0x6eb7,
+  0x5e68 => 0x6ed3, 0x5e69 => 0x6ebd, 0x5e6a => 0x6eaf, 0x5e6b => 0x6ec4,
+  0x5e6c => 0x6eb2, 0x5e6d => 0x6ed4, 0x5e6e => 0x6ed5, 0x5e6f => 0x6e8f,
+  0x5e70 => 0x6ea5, 0x5e71 => 0x6ec2, 0x5e72 => 0x6e9f, 0x5e73 => 0x6f41,
+  0x5e74 => 0x6f11, 0x5e75 => 0x704c, 0x5e76 => 0x6eec, 0x5e77 => 0x6ef8,
+  0x5e78 => 0x6efe, 0x5e79 => 0x6f3f, 0x5e7a => 0x6ef2, 0x5e7b => 0x6f31,
+  0x5e7c => 0x6eef, 0x5e7d => 0x6f32, 0x5e7e => 0x6ecc, 0x5f21 => 0x6f3e,
+  0x5f22 => 0x6f13, 0x5f23 => 0x6ef7, 0x5f24 => 0x6f86, 0x5f25 => 0x6f7a,
+  0x5f26 => 0x6f78, 0x5f27 => 0x6f81, 0x5f28 => 0x6f80, 0x5f29 => 0x6f6f,
+  0x5f2a => 0x6f5b, 0x5f2b => 0x6ff3, 0x5f2c => 0x6f6d, 0x5f2d => 0x6f82,
+  0x5f2e => 0x6f7c, 0x5f2f => 0x6f58, 0x5f30 => 0x6f8e, 0x5f31 => 0x6f91,
+  0x5f32 => 0x6fc2, 0x5f33 => 0x6f66, 0x5f34 => 0x6fb3, 0x5f35 => 0x6fa3,
+  0x5f36 => 0x6fa1, 0x5f37 => 0x6fa4, 0x5f38 => 0x6fb9, 0x5f39 => 0x6fc6,
+  0x5f3a => 0x6faa, 0x5f3b => 0x6fdf, 0x5f3c => 0x6fd5, 0x5f3d => 0x6fec,
+  0x5f3e => 0x6fd4, 0x5f3f => 0x6fd8, 0x5f40 => 0x6ff1, 0x5f41 => 0x6fee,
+  0x5f42 => 0x6fdb, 0x5f43 => 0x7009, 0x5f44 => 0x700b, 0x5f45 => 0x6ffa,
+  0x5f46 => 0x7011, 0x5f47 => 0x7001, 0x5f48 => 0x700f, 0x5f49 => 0x6ffe,
+  0x5f4a => 0x701b, 0x5f4b => 0x701a, 0x5f4c => 0x6f74, 0x5f4d => 0x701d,
+  0x5f4e => 0x7018, 0x5f4f => 0x701f, 0x5f50 => 0x7030, 0x5f51 => 0x703e,
+  0x5f52 => 0x7032, 0x5f53 => 0x7051, 0x5f54 => 0x7063, 0x5f55 => 0x7099,
+  0x5f56 => 0x7092, 0x5f57 => 0x70af, 0x5f58 => 0x70f1, 0x5f59 => 0x70ac,
+  0x5f5a => 0x70b8, 0x5f5b => 0x70b3, 0x5f5c => 0x70ae, 0x5f5d => 0x70df,
+  0x5f5e => 0x70cb, 0x5f5f => 0x70dd, 0x5f60 => 0x70d9, 0x5f61 => 0x7109,
+  0x5f62 => 0x70fd, 0x5f63 => 0x711c, 0x5f64 => 0x7119, 0x5f65 => 0x7165,
+  0x5f66 => 0x7155, 0x5f67 => 0x7188, 0x5f68 => 0x7166, 0x5f69 => 0x7162,
+  0x5f6a => 0x714c, 0x5f6b => 0x7156, 0x5f6c => 0x716c, 0x5f6d => 0x718f,
+  0x5f6e => 0x71fb, 0x5f6f => 0x7184, 0x5f70 => 0x7195, 0x5f71 => 0x71a8,
+  0x5f72 => 0x71ac, 0x5f73 => 0x71d7, 0x5f74 => 0x71b9, 0x5f75 => 0x71be,
+  0x5f76 => 0x71d2, 0x5f77 => 0x71c9, 0x5f78 => 0x71d4, 0x5f79 => 0x71ce,
+  0x5f7a => 0x71e0, 0x5f7b => 0x71ec, 0x5f7c => 0x71e7, 0x5f7d => 0x71f5,
+  0x5f7e => 0x71fc, 0x6021 => 0x71f9, 0x6022 => 0x71ff, 0x6023 => 0x720d,
+  0x6024 => 0x7210, 0x6025 => 0x721b, 0x6026 => 0x7228, 0x6027 => 0x722d,
+  0x6028 => 0x722c, 0x6029 => 0x7230, 0x602a => 0x7232, 0x602b => 0x723b,
+  0x602c => 0x723c, 0x602d => 0x723f, 0x602e => 0x7240, 0x602f => 0x7246,
+  0x6030 => 0x724b, 0x6031 => 0x7258, 0x6032 => 0x7274, 0x6033 => 0x727e,
+  0x6034 => 0x7282, 0x6035 => 0x7281, 0x6036 => 0x7287, 0x6037 => 0x7292,
+  0x6038 => 0x7296, 0x6039 => 0x72a2, 0x603a => 0x72a7, 0x603b => 0x72b9,
+  0x603c => 0x72b2, 0x603d => 0x72c3, 0x603e => 0x72c6, 0x603f => 0x72c4,
+  0x6040 => 0x72ce, 0x6041 => 0x72d2, 0x6042 => 0x72e2, 0x6043 => 0x72e0,
+  0x6044 => 0x72e1, 0x6045 => 0x72f9, 0x6046 => 0x72f7, 0x6047 => 0x500f,
+  0x6048 => 0x7317, 0x6049 => 0x730a, 0x604a => 0x731c, 0x604b => 0x7316,
+  0x604c => 0x731d, 0x604d => 0x7334, 0x604e => 0x732f, 0x604f => 0x7329,
+  0x6050 => 0x7325, 0x6051 => 0x733e, 0x6052 => 0x734e, 0x6053 => 0x734f,
+  0x6054 => 0x9ed8, 0x6055 => 0x7357, 0x6056 => 0x736a, 0x6057 => 0x7368,
+  0x6058 => 0x7370, 0x6059 => 0x7378, 0x605a => 0x7375, 0x605b => 0x737b,
+  0x605c => 0x737a, 0x605d => 0x73c8, 0x605e => 0x73b3, 0x605f => 0x73ce,
+  0x6060 => 0x73bb, 0x6061 => 0x73c0, 0x6062 => 0x73e5, 0x6063 => 0x73ee,
+  0x6064 => 0x73de, 0x6065 => 0x74a2, 0x6066 => 0x7405, 0x6067 => 0x746f,
+  0x6068 => 0x7425, 0x6069 => 0x73f8, 0x606a => 0x7432, 0x606b => 0x743a,
+  0x606c => 0x7455, 0x606d => 0x743f, 0x606e => 0x745f, 0x606f => 0x7459,
+  0x6070 => 0x7441, 0x6071 => 0x745c, 0x6072 => 0x7469, 0x6073 => 0x7470,
+  0x6074 => 0x7463, 0x6075 => 0x746a, 0x6076 => 0x7476, 0x6077 => 0x747e,
+  0x6078 => 0x748b, 0x6079 => 0x749e, 0x607a => 0x74a7, 0x607b => 0x74ca,
+  0x607c => 0x74cf, 0x607d => 0x74d4, 0x607e => 0x73f1, 0x6121 => 0x74e0,
+  0x6122 => 0x74e3, 0x6123 => 0x74e7, 0x6124 => 0x74e9, 0x6125 => 0x74ee,
+  0x6126 => 0x74f2, 0x6127 => 0x74f0, 0x6128 => 0x74f1, 0x6129 => 0x74f8,
+  0x612a => 0x74f7, 0x612b => 0x7504, 0x612c => 0x7503, 0x612d => 0x7505,
+  0x612e => 0x750c, 0x612f => 0x750e, 0x6130 => 0x750d, 0x6131 => 0x7515,
+  0x6132 => 0x7513, 0x6133 => 0x751e, 0x6134 => 0x7526, 0x6135 => 0x752c,
+  0x6136 => 0x753c, 0x6137 => 0x7544, 0x6138 => 0x754d, 0x6139 => 0x754a,
+  0x613a => 0x7549, 0x613b => 0x755b, 0x613c => 0x7546, 0x613d => 0x755a,
+  0x613e => 0x7569, 0x613f => 0x7564, 0x6140 => 0x7567, 0x6141 => 0x756b,
+  0x6142 => 0x756d, 0x6143 => 0x7578, 0x6144 => 0x7576, 0x6145 => 0x7586,
+  0x6146 => 0x7587, 0x6147 => 0x7574, 0x6148 => 0x758a, 0x6149 => 0x7589,
+  0x614a => 0x7582, 0x614b => 0x7594, 0x614c => 0x759a, 0x614d => 0x759d,
+  0x614e => 0x75a5, 0x614f => 0x75a3, 0x6150 => 0x75c2, 0x6151 => 0x75b3,
+  0x6152 => 0x75c3, 0x6153 => 0x75b5, 0x6154 => 0x75bd, 0x6155 => 0x75b8,
+  0x6156 => 0x75bc, 0x6157 => 0x75b1, 0x6158 => 0x75cd, 0x6159 => 0x75ca,
+  0x615a => 0x75d2, 0x615b => 0x75d9, 0x615c => 0x75e3, 0x615d => 0x75de,
+  0x615e => 0x75fe, 0x615f => 0x75ff, 0x6160 => 0x75fc, 0x6161 => 0x7601,
+  0x6162 => 0x75f0, 0x6163 => 0x75fa, 0x6164 => 0x75f2, 0x6165 => 0x75f3,
+  0x6166 => 0x760b, 0x6167 => 0x760d, 0x6168 => 0x7609, 0x6169 => 0x761f,
+  0x616a => 0x7627, 0x616b => 0x7620, 0x616c => 0x7621, 0x616d => 0x7622,
+  0x616e => 0x7624, 0x616f => 0x7634, 0x6170 => 0x7630, 0x6171 => 0x763b,
+  0x6172 => 0x7647, 0x6173 => 0x7648, 0x6174 => 0x7646, 0x6175 => 0x765c,
+  0x6176 => 0x7658, 0x6177 => 0x7661, 0x6178 => 0x7662, 0x6179 => 0x7668,
+  0x617a => 0x7669, 0x617b => 0x766a, 0x617c => 0x7667, 0x617d => 0x766c,
+  0x617e => 0x7670, 0x6221 => 0x7672, 0x6222 => 0x7676, 0x6223 => 0x7678,
+  0x6224 => 0x767c, 0x6225 => 0x7680, 0x6226 => 0x7683, 0x6227 => 0x7688,
+  0x6228 => 0x768b, 0x6229 => 0x768e, 0x622a => 0x7696, 0x622b => 0x7693,
+  0x622c => 0x7699, 0x622d => 0x769a, 0x622e => 0x76b0, 0x622f => 0x76b4,
+  0x6230 => 0x76b8, 0x6231 => 0x76b9, 0x6232 => 0x76ba, 0x6233 => 0x76c2,
+  0x6234 => 0x76cd, 0x6235 => 0x76d6, 0x6236 => 0x76d2, 0x6237 => 0x76de,
+  0x6238 => 0x76e1, 0x6239 => 0x76e5, 0x623a => 0x76e7, 0x623b => 0x76ea,
+  0x623c => 0x862f, 0x623d => 0x76fb, 0x623e => 0x7708, 0x623f => 0x7707,
+  0x6240 => 0x7704, 0x6241 => 0x7729, 0x6242 => 0x7724, 0x6243 => 0x771e,
+  0x6244 => 0x7725, 0x6245 => 0x7726, 0x6246 => 0x771b, 0x6247 => 0x7737,
+  0x6248 => 0x7738, 0x6249 => 0x7747, 0x624a => 0x775a, 0x624b => 0x7768,
+  0x624c => 0x776b, 0x624d => 0x775b, 0x624e => 0x7765, 0x624f => 0x777f,
+  0x6250 => 0x777e, 0x6251 => 0x7779, 0x6252 => 0x778e, 0x6253 => 0x778b,
+  0x6254 => 0x7791, 0x6255 => 0x77a0, 0x6256 => 0x779e, 0x6257 => 0x77b0,
+  0x6258 => 0x77b6, 0x6259 => 0x77b9, 0x625a => 0x77bf, 0x625b => 0x77bc,
+  0x625c => 0x77bd, 0x625d => 0x77bb, 0x625e => 0x77c7, 0x625f => 0x77cd,
+  0x6260 => 0x77d7, 0x6261 => 0x77da, 0x6262 => 0x77dc, 0x6263 => 0x77e3,
+  0x6264 => 0x77ee, 0x6265 => 0x77fc, 0x6266 => 0x780c, 0x6267 => 0x7812,
+  0x6268 => 0x7926, 0x6269 => 0x7820, 0x626a => 0x792a, 0x626b => 0x7845,
+  0x626c => 0x788e, 0x626d => 0x7874, 0x626e => 0x7886, 0x626f => 0x787c,
+  0x6270 => 0x789a, 0x6271 => 0x788c, 0x6272 => 0x78a3, 0x6273 => 0x78b5,
+  0x6274 => 0x78aa, 0x6275 => 0x78af, 0x6276 => 0x78d1, 0x6277 => 0x78c6,
+  0x6278 => 0x78cb, 0x6279 => 0x78d4, 0x627a => 0x78be, 0x627b => 0x78bc,
+  0x627c => 0x78c5, 0x627d => 0x78ca, 0x627e => 0x78ec, 0x6321 => 0x78e7,
+  0x6322 => 0x78da, 0x6323 => 0x78fd, 0x6324 => 0x78f4, 0x6325 => 0x7907,
+  0x6326 => 0x7912, 0x6327 => 0x7911, 0x6328 => 0x7919, 0x6329 => 0x792c,
+  0x632a => 0x792b, 0x632b => 0x7940, 0x632c => 0x7960, 0x632d => 0x7957,
+  0x632e => 0x795f, 0x632f => 0x795a, 0x6330 => 0x7955, 0x6331 => 0x7953,
+  0x6332 => 0x797a, 0x6333 => 0x797f, 0x6334 => 0x798a, 0x6335 => 0x799d,
+  0x6336 => 0x79a7, 0x6337 => 0x9f4b, 0x6338 => 0x79aa, 0x6339 => 0x79ae,
+  0x633a => 0x79b3, 0x633b => 0x79b9, 0x633c => 0x79ba, 0x633d => 0x79c9,
+  0x633e => 0x79d5, 0x633f => 0x79e7, 0x6340 => 0x79ec, 0x6341 => 0x79e1,
+  0x6342 => 0x79e3, 0x6343 => 0x7a08, 0x6344 => 0x7a0d, 0x6345 => 0x7a18,
+  0x6346 => 0x7a19, 0x6347 => 0x7a20, 0x6348 => 0x7a1f, 0x6349 => 0x7980,
+  0x634a => 0x7a31, 0x634b => 0x7a3b, 0x634c => 0x7a3e, 0x634d => 0x7a37,
+  0x634e => 0x7a43, 0x634f => 0x7a57, 0x6350 => 0x7a49, 0x6351 => 0x7a61,
+  0x6352 => 0x7a62, 0x6353 => 0x7a69, 0x6354 => 0x9f9d, 0x6355 => 0x7a70,
+  0x6356 => 0x7a79, 0x6357 => 0x7a7d, 0x6358 => 0x7a88, 0x6359 => 0x7a97,
+  0x635a => 0x7a95, 0x635b => 0x7a98, 0x635c => 0x7a96, 0x635d => 0x7aa9,
+  0x635e => 0x7ac8, 0x635f => 0x7ab0, 0x6360 => 0x7ab6, 0x6361 => 0x7ac5,
+  0x6362 => 0x7ac4, 0x6363 => 0x7abf, 0x6364 => 0x9083, 0x6365 => 0x7ac7,
+  0x6366 => 0x7aca, 0x6367 => 0x7acd, 0x6368 => 0x7acf, 0x6369 => 0x7ad5,
+  0x636a => 0x7ad3, 0x636b => 0x7ad9, 0x636c => 0x7ada, 0x636d => 0x7add,
+  0x636e => 0x7ae1, 0x636f => 0x7ae2, 0x6370 => 0x7ae6, 0x6371 => 0x7aed,
+  0x6372 => 0x7af0, 0x6373 => 0x7b02, 0x6374 => 0x7b0f, 0x6375 => 0x7b0a,
+  0x6376 => 0x7b06, 0x6377 => 0x7b33, 0x6378 => 0x7b18, 0x6379 => 0x7b19,
+  0x637a => 0x7b1e, 0x637b => 0x7b35, 0x637c => 0x7b28, 0x637d => 0x7b36,
+  0x637e => 0x7b50, 0x6421 => 0x7b7a, 0x6422 => 0x7b04, 0x6423 => 0x7b4d,
+  0x6424 => 0x7b0b, 0x6425 => 0x7b4c, 0x6426 => 0x7b45, 0x6427 => 0x7b75,
+  0x6428 => 0x7b65, 0x6429 => 0x7b74, 0x642a => 0x7b67, 0x642b => 0x7b70,
+  0x642c => 0x7b71, 0x642d => 0x7b6c, 0x642e => 0x7b6e, 0x642f => 0x7b9d,
+  0x6430 => 0x7b98, 0x6431 => 0x7b9f, 0x6432 => 0x7b8d, 0x6433 => 0x7b9c,
+  0x6434 => 0x7b9a, 0x6435 => 0x7b8b, 0x6436 => 0x7b92, 0x6437 => 0x7b8f,
+  0x6438 => 0x7b5d, 0x6439 => 0x7b99, 0x643a => 0x7bcb, 0x643b => 0x7bc1,
+  0x643c => 0x7bcc, 0x643d => 0x7bcf, 0x643e => 0x7bb4, 0x643f => 0x7bc6,
+  0x6440 => 0x7bdd, 0x6441 => 0x7be9, 0x6442 => 0x7c11, 0x6443 => 0x7c14,
+  0x6444 => 0x7be6, 0x6445 => 0x7be5, 0x6446 => 0x7c60, 0x6447 => 0x7c00,
+  0x6448 => 0x7c07, 0x6449 => 0x7c13, 0x644a => 0x7bf3, 0x644b => 0x7bf7,
+  0x644c => 0x7c17, 0x644d => 0x7c0d, 0x644e => 0x7bf6, 0x644f => 0x7c23,
+  0x6450 => 0x7c27, 0x6451 => 0x7c2a, 0x6452 => 0x7c1f, 0x6453 => 0x7c37,
+  0x6454 => 0x7c2b, 0x6455 => 0x7c3d, 0x6456 => 0x7c4c, 0x6457 => 0x7c43,
+  0x6458 => 0x7c54, 0x6459 => 0x7c4f, 0x645a => 0x7c40, 0x645b => 0x7c50,
+  0x645c => 0x7c58, 0x645d => 0x7c5f, 0x645e => 0x7c64, 0x645f => 0x7c56,
+  0x6460 => 0x7c65, 0x6461 => 0x7c6c, 0x6462 => 0x7c75, 0x6463 => 0x7c83,
+  0x6464 => 0x7c90, 0x6465 => 0x7ca4, 0x6466 => 0x7cad, 0x6467 => 0x7ca2,
+  0x6468 => 0x7cab, 0x6469 => 0x7ca1, 0x646a => 0x7ca8, 0x646b => 0x7cb3,
+  0x646c => 0x7cb2, 0x646d => 0x7cb1, 0x646e => 0x7cae, 0x646f => 0x7cb9,
+  0x6470 => 0x7cbd, 0x6471 => 0x7cc0, 0x6472 => 0x7cc5, 0x6473 => 0x7cc2,
+  0x6474 => 0x7cd8, 0x6475 => 0x7cd2, 0x6476 => 0x7cdc, 0x6477 => 0x7ce2,
+  0x6478 => 0x9b3b, 0x6479 => 0x7cef, 0x647a => 0x7cf2, 0x647b => 0x7cf4,
+  0x647c => 0x7cf6, 0x647d => 0x7cfa, 0x647e => 0x7d06, 0x6521 => 0x7d02,
+  0x6522 => 0x7d1c, 0x6523 => 0x7d15, 0x6524 => 0x7d0a, 0x6525 => 0x7d45,
+  0x6526 => 0x7d4b, 0x6527 => 0x7d2e, 0x6528 => 0x7d32, 0x6529 => 0x7d3f,
+  0x652a => 0x7d35, 0x652b => 0x7d46, 0x652c => 0x7d73, 0x652d => 0x7d56,
+  0x652e => 0x7d4e, 0x652f => 0x7d72, 0x6530 => 0x7d68, 0x6531 => 0x7d6e,
+  0x6532 => 0x7d4f, 0x6533 => 0x7d63, 0x6534 => 0x7d93, 0x6535 => 0x7d89,
+  0x6536 => 0x7d5b, 0x6537 => 0x7d8f, 0x6538 => 0x7d7d, 0x6539 => 0x7d9b,
+  0x653a => 0x7dba, 0x653b => 0x7dae, 0x653c => 0x7da3, 0x653d => 0x7db5,
+  0x653e => 0x7dc7, 0x653f => 0x7dbd, 0x6540 => 0x7dab, 0x6541 => 0x7e3d,
+  0x6542 => 0x7da2, 0x6543 => 0x7daf, 0x6544 => 0x7ddc, 0x6545 => 0x7db8,
+  0x6546 => 0x7d9f, 0x6547 => 0x7db0, 0x6548 => 0x7dd8, 0x6549 => 0x7ddd,
+  0x654a => 0x7de4, 0x654b => 0x7dde, 0x654c => 0x7dfb, 0x654d => 0x7df2,
+  0x654e => 0x7de1, 0x654f => 0x7e05, 0x6550 => 0x7e0a, 0x6551 => 0x7e23,
+  0x6552 => 0x7e21, 0x6553 => 0x7e12, 0x6554 => 0x7e31, 0x6555 => 0x7e1f,
+  0x6556 => 0x7e09, 0x6557 => 0x7e0b, 0x6558 => 0x7e22, 0x6559 => 0x7e46,
+  0x655a => 0x7e66, 0x655b => 0x7e3b, 0x655c => 0x7e35, 0x655d => 0x7e39,
+  0x655e => 0x7e43, 0x655f => 0x7e37, 0x6560 => 0x7e32, 0x6561 => 0x7e3a,
+  0x6562 => 0x7e67, 0x6563 => 0x7e5d, 0x6564 => 0x7e56, 0x6565 => 0x7e5e,
+  0x6566 => 0x7e59, 0x6567 => 0x7e5a, 0x6568 => 0x7e79, 0x6569 => 0x7e6a,
+  0x656a => 0x7e69, 0x656b => 0x7e7c, 0x656c => 0x7e7b, 0x656d => 0x7e83,
+  0x656e => 0x7dd5, 0x656f => 0x7e7d, 0x6570 => 0x8fae, 0x6571 => 0x7e7f,
+  0x6572 => 0x7e88, 0x6573 => 0x7e89, 0x6574 => 0x7e8c, 0x6575 => 0x7e92,
+  0x6576 => 0x7e90, 0x6577 => 0x7e93, 0x6578 => 0x7e94, 0x6579 => 0x7e96,
+  0x657a => 0x7e8e, 0x657b => 0x7e9b, 0x657c => 0x7e9c, 0x657d => 0x7f38,
+  0x657e => 0x7f3a, 0x6621 => 0x7f45, 0x6622 => 0x7f4c, 0x6623 => 0x7f4d,
+  0x6624 => 0x7f4e, 0x6625 => 0x7f50, 0x6626 => 0x7f51, 0x6627 => 0x7f55,
+  0x6628 => 0x7f54, 0x6629 => 0x7f58, 0x662a => 0x7f5f, 0x662b => 0x7f60,
+  0x662c => 0x7f68, 0x662d => 0x7f69, 0x662e => 0x7f67, 0x662f => 0x7f78,
+  0x6630 => 0x7f82, 0x6631 => 0x7f86, 0x6632 => 0x7f83, 0x6633 => 0x7f88,
+  0x6634 => 0x7f87, 0x6635 => 0x7f8c, 0x6636 => 0x7f94, 0x6637 => 0x7f9e,
+  0x6638 => 0x7f9d, 0x6639 => 0x7f9a, 0x663a => 0x7fa3, 0x663b => 0x7faf,
+  0x663c => 0x7fb2, 0x663d => 0x7fb9, 0x663e => 0x7fae, 0x663f => 0x7fb6,
+  0x6640 => 0x7fb8, 0x6641 => 0x8b71, 0x6642 => 0x7fc5, 0x6643 => 0x7fc6,
+  0x6644 => 0x7fca, 0x6645 => 0x7fd5, 0x6646 => 0x7fd4, 0x6647 => 0x7fe1,
+  0x6648 => 0x7fe6, 0x6649 => 0x7fe9, 0x664a => 0x7ff3, 0x664b => 0x7ff9,
+  0x664c => 0x98dc, 0x664d => 0x8006, 0x664e => 0x8004, 0x664f => 0x800b,
+  0x6650 => 0x8012, 0x6651 => 0x8018, 0x6652 => 0x8019, 0x6653 => 0x801c,
+  0x6654 => 0x8021, 0x6655 => 0x8028, 0x6656 => 0x803f, 0x6657 => 0x803b,
+  0x6658 => 0x804a, 0x6659 => 0x8046, 0x665a => 0x8052, 0x665b => 0x8058,
+  0x665c => 0x805a, 0x665d => 0x805f, 0x665e => 0x8062, 0x665f => 0x8068,
+  0x6660 => 0x8073, 0x6661 => 0x8072, 0x6662 => 0x8070, 0x6663 => 0x8076,
+  0x6664 => 0x8079, 0x6665 => 0x807d, 0x6666 => 0x807f, 0x6667 => 0x8084,
+  0x6668 => 0x8086, 0x6669 => 0x8085, 0x666a => 0x809b, 0x666b => 0x8093,
+  0x666c => 0x809a, 0x666d => 0x80ad, 0x666e => 0x5190, 0x666f => 0x80ac,
+  0x6670 => 0x80db, 0x6671 => 0x80e5, 0x6672 => 0x80d9, 0x6673 => 0x80dd,
+  0x6674 => 0x80c4, 0x6675 => 0x80da, 0x6676 => 0x80d6, 0x6677 => 0x8109,
+  0x6678 => 0x80ef, 0x6679 => 0x80f1, 0x667a => 0x811b, 0x667b => 0x8129,
+  0x667c => 0x8123, 0x667d => 0x812f, 0x667e => 0x814b, 0x6721 => 0x968b,
+  0x6722 => 0x8146, 0x6723 => 0x813e, 0x6724 => 0x8153, 0x6725 => 0x8151,
+  0x6726 => 0x80fc, 0x6727 => 0x8171, 0x6728 => 0x816e, 0x6729 => 0x8165,
+  0x672a => 0x8166, 0x672b => 0x8174, 0x672c => 0x8183, 0x672d => 0x8188,
+  0x672e => 0x818a, 0x672f => 0x8180, 0x6730 => 0x8182, 0x6731 => 0x81a0,
+  0x6732 => 0x8195, 0x6733 => 0x81a4, 0x6734 => 0x81a3, 0x6735 => 0x815f,
+  0x6736 => 0x8193, 0x6737 => 0x81a9, 0x6738 => 0x81b0, 0x6739 => 0x81b5,
+  0x673a => 0x81be, 0x673b => 0x81b8, 0x673c => 0x81bd, 0x673d => 0x81c0,
+  0x673e => 0x81c2, 0x673f => 0x81ba, 0x6740 => 0x81c9, 0x6741 => 0x81cd,
+  0x6742 => 0x81d1, 0x6743 => 0x81d9, 0x6744 => 0x81d8, 0x6745 => 0x81c8,
+  0x6746 => 0x81da, 0x6747 => 0x81df, 0x6748 => 0x81e0, 0x6749 => 0x81e7,
+  0x674a => 0x81fa, 0x674b => 0x81fb, 0x674c => 0x81fe, 0x674d => 0x8201,
+  0x674e => 0x8202, 0x674f => 0x8205, 0x6750 => 0x8207, 0x6751 => 0x820a,
+  0x6752 => 0x820d, 0x6753 => 0x8210, 0x6754 => 0x8216, 0x6755 => 0x8229,
+  0x6756 => 0x822b, 0x6757 => 0x8238, 0x6758 => 0x8233, 0x6759 => 0x8240,
+  0x675a => 0x8259, 0x675b => 0x8258, 0x675c => 0x825d, 0x675d => 0x825a,
+  0x675e => 0x825f, 0x675f => 0x8264, 0x6760 => 0x8262, 0x6761 => 0x8268,
+  0x6762 => 0x826a, 0x6763 => 0x826b, 0x6764 => 0x822e, 0x6765 => 0x8271,
+  0x6766 => 0x8277, 0x6767 => 0x8278, 0x6768 => 0x827e, 0x6769 => 0x828d,
+  0x676a => 0x8292, 0x676b => 0x82ab, 0x676c => 0x829f, 0x676d => 0x82bb,
+  0x676e => 0x82ac, 0x676f => 0x82e1, 0x6770 => 0x82e3, 0x6771 => 0x82df,
+  0x6772 => 0x82d2, 0x6773 => 0x82f4, 0x6774 => 0x82f3, 0x6775 => 0x82fa,
+  0x6776 => 0x8393, 0x6777 => 0x8303, 0x6778 => 0x82fb, 0x6779 => 0x82f9,
+  0x677a => 0x82de, 0x677b => 0x8306, 0x677c => 0x82dc, 0x677d => 0x8309,
+  0x677e => 0x82d9, 0x6821 => 0x8335, 0x6822 => 0x8334, 0x6823 => 0x8316,
+  0x6824 => 0x8332, 0x6825 => 0x8331, 0x6826 => 0x8340, 0x6827 => 0x8339,
+  0x6828 => 0x8350, 0x6829 => 0x8345, 0x682a => 0x832f, 0x682b => 0x832b,
+  0x682c => 0x8317, 0x682d => 0x8318, 0x682e => 0x8385, 0x682f => 0x839a,
+  0x6830 => 0x83aa, 0x6831 => 0x839f, 0x6832 => 0x83a2, 0x6833 => 0x8396,
+  0x6834 => 0x8323, 0x6835 => 0x838e, 0x6836 => 0x8387, 0x6837 => 0x838a,
+  0x6838 => 0x837c, 0x6839 => 0x83b5, 0x683a => 0x8373, 0x683b => 0x8375,
+  0x683c => 0x83a0, 0x683d => 0x8389, 0x683e => 0x83a8, 0x683f => 0x83f4,
+  0x6840 => 0x8413, 0x6841 => 0x83eb, 0x6842 => 0x83ce, 0x6843 => 0x83fd,
+  0x6844 => 0x8403, 0x6845 => 0x83d8, 0x6846 => 0x840b, 0x6847 => 0x83c1,
+  0x6848 => 0x83f7, 0x6849 => 0x8407, 0x684a => 0x83e0, 0x684b => 0x83f2,
+  0x684c => 0x840d, 0x684d => 0x8422, 0x684e => 0x8420, 0x684f => 0x83bd,
+  0x6850 => 0x8438, 0x6851 => 0x8506, 0x6852 => 0x83fb, 0x6853 => 0x846d,
+  0x6854 => 0x842a, 0x6855 => 0x843c, 0x6856 => 0x855a, 0x6857 => 0x8484,
+  0x6858 => 0x8477, 0x6859 => 0x846b, 0x685a => 0x84ad, 0x685b => 0x846e,
+  0x685c => 0x8482, 0x685d => 0x8469, 0x685e => 0x8446, 0x685f => 0x842c,
+  0x6860 => 0x846f, 0x6861 => 0x8479, 0x6862 => 0x8435, 0x6863 => 0x84ca,
+  0x6864 => 0x8462, 0x6865 => 0x84b9, 0x6866 => 0x84bf, 0x6867 => 0x849f,
+  0x6868 => 0x84d9, 0x6869 => 0x84cd, 0x686a => 0x84bb, 0x686b => 0x84da,
+  0x686c => 0x84d0, 0x686d => 0x84c1, 0x686e => 0x84c6, 0x686f => 0x84d6,
+  0x6870 => 0x84a1, 0x6871 => 0x8521, 0x6872 => 0x84ff, 0x6873 => 0x84f4,
+  0x6874 => 0x8517, 0x6875 => 0x8518, 0x6876 => 0x852c, 0x6877 => 0x851f,
+  0x6878 => 0x8515, 0x6879 => 0x8514, 0x687a => 0x84fc, 0x687b => 0x8540,
+  0x687c => 0x8563, 0x687d => 0x8558, 0x687e => 0x8548, 0x6921 => 0x8541,
+  0x6922 => 0x8602, 0x6923 => 0x854b, 0x6924 => 0x8555, 0x6925 => 0x8580,
+  0x6926 => 0x85a4, 0x6927 => 0x8588, 0x6928 => 0x8591, 0x6929 => 0x858a,
+  0x692a => 0x85a8, 0x692b => 0x856d, 0x692c => 0x8594, 0x692d => 0x859b,
+  0x692e => 0x85ea, 0x692f => 0x8587, 0x6930 => 0x859c, 0x6931 => 0x8577,
+  0x6932 => 0x857e, 0x6933 => 0x8590, 0x6934 => 0x85c9, 0x6935 => 0x85ba,
+  0x6936 => 0x85cf, 0x6937 => 0x85b9, 0x6938 => 0x85d0, 0x6939 => 0x85d5,
+  0x693a => 0x85dd, 0x693b => 0x85e5, 0x693c => 0x85dc, 0x693d => 0x85f9,
+  0x693e => 0x860a, 0x693f => 0x8613, 0x6940 => 0x860b, 0x6941 => 0x85fe,
+  0x6942 => 0x85fa, 0x6943 => 0x8606, 0x6944 => 0x8622, 0x6945 => 0x861a,
+  0x6946 => 0x8630, 0x6947 => 0x863f, 0x6948 => 0x864d, 0x6949 => 0x4e55,
+  0x694a => 0x8654, 0x694b => 0x865f, 0x694c => 0x8667, 0x694d => 0x8671,
+  0x694e => 0x8693, 0x694f => 0x86a3, 0x6950 => 0x86a9, 0x6951 => 0x86aa,
+  0x6952 => 0x868b, 0x6953 => 0x868c, 0x6954 => 0x86b6, 0x6955 => 0x86af,
+  0x6956 => 0x86c4, 0x6957 => 0x86c6, 0x6958 => 0x86b0, 0x6959 => 0x86c9,
+  0x695a => 0x8823, 0x695b => 0x86ab, 0x695c => 0x86d4, 0x695d => 0x86de,
+  0x695e => 0x86e9, 0x695f => 0x86ec, 0x6960 => 0x86df, 0x6961 => 0x86db,
+  0x6962 => 0x86ef, 0x6963 => 0x8712, 0x6964 => 0x8706, 0x6965 => 0x8708,
+  0x6966 => 0x8700, 0x6967 => 0x8703, 0x6968 => 0x86fb, 0x6969 => 0x8711,
+  0x696a => 0x8709, 0x696b => 0x870d, 0x696c => 0x86f9, 0x696d => 0x870a,
+  0x696e => 0x8734, 0x696f => 0x873f, 0x6970 => 0x8737, 0x6971 => 0x873b,
+  0x6972 => 0x8725, 0x6973 => 0x8729, 0x6974 => 0x871a, 0x6975 => 0x8760,
+  0x6976 => 0x875f, 0x6977 => 0x8778, 0x6978 => 0x874c, 0x6979 => 0x874e,
+  0x697a => 0x8774, 0x697b => 0x8757, 0x697c => 0x8768, 0x697d => 0x876e,
+  0x697e => 0x8759, 0x6a21 => 0x8753, 0x6a22 => 0x8763, 0x6a23 => 0x876a,
+  0x6a24 => 0x8805, 0x6a25 => 0x87a2, 0x6a26 => 0x879f, 0x6a27 => 0x8782,
+  0x6a28 => 0x87af, 0x6a29 => 0x87cb, 0x6a2a => 0x87bd, 0x6a2b => 0x87c0,
+  0x6a2c => 0x87d0, 0x6a2d => 0x96d6, 0x6a2e => 0x87ab, 0x6a2f => 0x87c4,
+  0x6a30 => 0x87b3, 0x6a31 => 0x87c7, 0x6a32 => 0x87c6, 0x6a33 => 0x87bb,
+  0x6a34 => 0x87ef, 0x6a35 => 0x87f2, 0x6a36 => 0x87e0, 0x6a37 => 0x880f,
+  0x6a38 => 0x880d, 0x6a39 => 0x87fe, 0x6a3a => 0x87f6, 0x6a3b => 0x87f7,
+  0x6a3c => 0x880e, 0x6a3d => 0x87d2, 0x6a3e => 0x8811, 0x6a3f => 0x8816,
+  0x6a40 => 0x8815, 0x6a41 => 0x8822, 0x6a42 => 0x8821, 0x6a43 => 0x8831,
+  0x6a44 => 0x8836, 0x6a45 => 0x8839, 0x6a46 => 0x8827, 0x6a47 => 0x883b,
+  0x6a48 => 0x8844, 0x6a49 => 0x8842, 0x6a4a => 0x8852, 0x6a4b => 0x8859,
+  0x6a4c => 0x885e, 0x6a4d => 0x8862, 0x6a4e => 0x886b, 0x6a4f => 0x8881,
+  0x6a50 => 0x887e, 0x6a51 => 0x889e, 0x6a52 => 0x8875, 0x6a53 => 0x887d,
+  0x6a54 => 0x88b5, 0x6a55 => 0x8872, 0x6a56 => 0x8882, 0x6a57 => 0x8897,
+  0x6a58 => 0x8892, 0x6a59 => 0x88ae, 0x6a5a => 0x8899, 0x6a5b => 0x88a2,
+  0x6a5c => 0x888d, 0x6a5d => 0x88a4, 0x6a5e => 0x88b0, 0x6a5f => 0x88bf,
+  0x6a60 => 0x88b1, 0x6a61 => 0x88c3, 0x6a62 => 0x88c4, 0x6a63 => 0x88d4,
+  0x6a64 => 0x88d8, 0x6a65 => 0x88d9, 0x6a66 => 0x88dd, 0x6a67 => 0x88f9,
+  0x6a68 => 0x8902, 0x6a69 => 0x88fc, 0x6a6a => 0x88f4, 0x6a6b => 0x88e8,
+  0x6a6c => 0x88f2, 0x6a6d => 0x8904, 0x6a6e => 0x890c, 0x6a6f => 0x890a,
+  0x6a70 => 0x8913, 0x6a71 => 0x8943, 0x6a72 => 0x891e, 0x6a73 => 0x8925,
+  0x6a74 => 0x892a, 0x6a75 => 0x892b, 0x6a76 => 0x8941, 0x6a77 => 0x8944,
+  0x6a78 => 0x893b, 0x6a79 => 0x8936, 0x6a7a => 0x8938, 0x6a7b => 0x894c,
+  0x6a7c => 0x891d, 0x6a7d => 0x8960, 0x6a7e => 0x895e, 0x6b21 => 0x8966,
+  0x6b22 => 0x8964, 0x6b23 => 0x896d, 0x6b24 => 0x896a, 0x6b25 => 0x896f,
+  0x6b26 => 0x8974, 0x6b27 => 0x8977, 0x6b28 => 0x897e, 0x6b29 => 0x8983,
+  0x6b2a => 0x8988, 0x6b2b => 0x898a, 0x6b2c => 0x8993, 0x6b2d => 0x8998,
+  0x6b2e => 0x89a1, 0x6b2f => 0x89a9, 0x6b30 => 0x89a6, 0x6b31 => 0x89ac,
+  0x6b32 => 0x89af, 0x6b33 => 0x89b2, 0x6b34 => 0x89ba, 0x6b35 => 0x89bd,
+  0x6b36 => 0x89bf, 0x6b37 => 0x89c0, 0x6b38 => 0x89da, 0x6b39 => 0x89dc,
+  0x6b3a => 0x89dd, 0x6b3b => 0x89e7, 0x6b3c => 0x89f4, 0x6b3d => 0x89f8,
+  0x6b3e => 0x8a03, 0x6b3f => 0x8a16, 0x6b40 => 0x8a10, 0x6b41 => 0x8a0c,
+  0x6b42 => 0x8a1b, 0x6b43 => 0x8a1d, 0x6b44 => 0x8a25, 0x6b45 => 0x8a36,
+  0x6b46 => 0x8a41, 0x6b47 => 0x8a5b, 0x6b48 => 0x8a52, 0x6b49 => 0x8a46,
+  0x6b4a => 0x8a48, 0x6b4b => 0x8a7c, 0x6b4c => 0x8a6d, 0x6b4d => 0x8a6c,
+  0x6b4e => 0x8a62, 0x6b4f => 0x8a85, 0x6b50 => 0x8a82, 0x6b51 => 0x8a84,
+  0x6b52 => 0x8aa8, 0x6b53 => 0x8aa1, 0x6b54 => 0x8a91, 0x6b55 => 0x8aa5,
+  0x6b56 => 0x8aa6, 0x6b57 => 0x8a9a, 0x6b58 => 0x8aa3, 0x6b59 => 0x8ac4,
+  0x6b5a => 0x8acd, 0x6b5b => 0x8ac2, 0x6b5c => 0x8ada, 0x6b5d => 0x8aeb,
+  0x6b5e => 0x8af3, 0x6b5f => 0x8ae7, 0x6b60 => 0x8ae4, 0x6b61 => 0x8af1,
+  0x6b62 => 0x8b14, 0x6b63 => 0x8ae0, 0x6b64 => 0x8ae2, 0x6b65 => 0x8af7,
+  0x6b66 => 0x8ade, 0x6b67 => 0x8adb, 0x6b68 => 0x8b0c, 0x6b69 => 0x8b07,
+  0x6b6a => 0x8b1a, 0x6b6b => 0x8ae1, 0x6b6c => 0x8b16, 0x6b6d => 0x8b10,
+  0x6b6e => 0x8b17, 0x6b6f => 0x8b20, 0x6b70 => 0x8b33, 0x6b71 => 0x97ab,
+  0x6b72 => 0x8b26, 0x6b73 => 0x8b2b, 0x6b74 => 0x8b3e, 0x6b75 => 0x8b28,
+  0x6b76 => 0x8b41, 0x6b77 => 0x8b4c, 0x6b78 => 0x8b4f, 0x6b79 => 0x8b4e,
+  0x6b7a => 0x8b49, 0x6b7b => 0x8b56, 0x6b7c => 0x8b5b, 0x6b7d => 0x8b5a,
+  0x6b7e => 0x8b6b, 0x6c21 => 0x8b5f, 0x6c22 => 0x8b6c, 0x6c23 => 0x8b6f,
+  0x6c24 => 0x8b74, 0x6c25 => 0x8b7d, 0x6c26 => 0x8b80, 0x6c27 => 0x8b8c,
+  0x6c28 => 0x8b8e, 0x6c29 => 0x8b92, 0x6c2a => 0x8b93, 0x6c2b => 0x8b96,
+  0x6c2c => 0x8b99, 0x6c2d => 0x8b9a, 0x6c2e => 0x8c3a, 0x6c2f => 0x8c41,
+  0x6c30 => 0x8c3f, 0x6c31 => 0x8c48, 0x6c32 => 0x8c4c, 0x6c33 => 0x8c4e,
+  0x6c34 => 0x8c50, 0x6c35 => 0x8c55, 0x6c36 => 0x8c62, 0x6c37 => 0x8c6c,
+  0x6c38 => 0x8c78, 0x6c39 => 0x8c7a, 0x6c3a => 0x8c82, 0x6c3b => 0x8c89,
+  0x6c3c => 0x8c85, 0x6c3d => 0x8c8a, 0x6c3e => 0x8c8d, 0x6c3f => 0x8c8e,
+  0x6c40 => 0x8c94, 0x6c41 => 0x8c7c, 0x6c42 => 0x8c98, 0x6c43 => 0x621d,
+  0x6c44 => 0x8cad, 0x6c45 => 0x8caa, 0x6c46 => 0x8cbd, 0x6c47 => 0x8cb2,
+  0x6c48 => 0x8cb3, 0x6c49 => 0x8cae, 0x6c4a => 0x8cb6, 0x6c4b => 0x8cc8,
+  0x6c4c => 0x8cc1, 0x6c4d => 0x8ce4, 0x6c4e => 0x8ce3, 0x6c4f => 0x8cda,
+  0x6c50 => 0x8cfd, 0x6c51 => 0x8cfa, 0x6c52 => 0x8cfb, 0x6c53 => 0x8d04,
+  0x6c54 => 0x8d05, 0x6c55 => 0x8d0a, 0x6c56 => 0x8d07, 0x6c57 => 0x8d0f,
+  0x6c58 => 0x8d0d, 0x6c59 => 0x8d10, 0x6c5a => 0x9f4e, 0x6c5b => 0x8d13,
+  0x6c5c => 0x8ccd, 0x6c5d => 0x8d14, 0x6c5e => 0x8d16, 0x6c5f => 0x8d67,
+  0x6c60 => 0x8d6d, 0x6c61 => 0x8d71, 0x6c62 => 0x8d73, 0x6c63 => 0x8d81,
+  0x6c64 => 0x8d99, 0x6c65 => 0x8dc2, 0x6c66 => 0x8dbe, 0x6c67 => 0x8dba,
+  0x6c68 => 0x8dcf, 0x6c69 => 0x8dda, 0x6c6a => 0x8dd6, 0x6c6b => 0x8dcc,
+  0x6c6c => 0x8ddb, 0x6c6d => 0x8dcb, 0x6c6e => 0x8dea, 0x6c6f => 0x8deb,
+  0x6c70 => 0x8ddf, 0x6c71 => 0x8de3, 0x6c72 => 0x8dfc, 0x6c73 => 0x8e08,
+  0x6c74 => 0x8e09, 0x6c75 => 0x8dff, 0x6c76 => 0x8e1d, 0x6c77 => 0x8e1e,
+  0x6c78 => 0x8e10, 0x6c79 => 0x8e1f, 0x6c7a => 0x8e42, 0x6c7b => 0x8e35,
+  0x6c7c => 0x8e30, 0x6c7d => 0x8e34, 0x6c7e => 0x8e4a, 0x6d21 => 0x8e47,
+  0x6d22 => 0x8e49, 0x6d23 => 0x8e4c, 0x6d24 => 0x8e50, 0x6d25 => 0x8e48,
+  0x6d26 => 0x8e59, 0x6d27 => 0x8e64, 0x6d28 => 0x8e60, 0x6d29 => 0x8e2a,
+  0x6d2a => 0x8e63, 0x6d2b => 0x8e55, 0x6d2c => 0x8e76, 0x6d2d => 0x8e72,
+  0x6d2e => 0x8e7c, 0x6d2f => 0x8e81, 0x6d30 => 0x8e87, 0x6d31 => 0x8e85,
+  0x6d32 => 0x8e84, 0x6d33 => 0x8e8b, 0x6d34 => 0x8e8a, 0x6d35 => 0x8e93,
+  0x6d36 => 0x8e91, 0x6d37 => 0x8e94, 0x6d38 => 0x8e99, 0x6d39 => 0x8eaa,
+  0x6d3a => 0x8ea1, 0x6d3b => 0x8eac, 0x6d3c => 0x8eb0, 0x6d3d => 0x8ec6,
+  0x6d3e => 0x8eb1, 0x6d3f => 0x8ebe, 0x6d40 => 0x8ec5, 0x6d41 => 0x8ec8,
+  0x6d42 => 0x8ecb, 0x6d43 => 0x8edb, 0x6d44 => 0x8ee3, 0x6d45 => 0x8efc,
+  0x6d46 => 0x8efb, 0x6d47 => 0x8eeb, 0x6d48 => 0x8efe, 0x6d49 => 0x8f0a,
+  0x6d4a => 0x8f05, 0x6d4b => 0x8f15, 0x6d4c => 0x8f12, 0x6d4d => 0x8f19,
+  0x6d4e => 0x8f13, 0x6d4f => 0x8f1c, 0x6d50 => 0x8f1f, 0x6d51 => 0x8f1b,
+  0x6d52 => 0x8f0c, 0x6d53 => 0x8f26, 0x6d54 => 0x8f33, 0x6d55 => 0x8f3b,
+  0x6d56 => 0x8f39, 0x6d57 => 0x8f45, 0x6d58 => 0x8f42, 0x6d59 => 0x8f3e,
+  0x6d5a => 0x8f4c, 0x6d5b => 0x8f49, 0x6d5c => 0x8f46, 0x6d5d => 0x8f4e,
+  0x6d5e => 0x8f57, 0x6d5f => 0x8f5c, 0x6d60 => 0x8f62, 0x6d61 => 0x8f63,
+  0x6d62 => 0x8f64, 0x6d63 => 0x8f9c, 0x6d64 => 0x8f9f, 0x6d65 => 0x8fa3,
+  0x6d66 => 0x8fad, 0x6d67 => 0x8faf, 0x6d68 => 0x8fb7, 0x6d69 => 0x8fda,
+  0x6d6a => 0x8fe5, 0x6d6b => 0x8fe2, 0x6d6c => 0x8fea, 0x6d6d => 0x8fef,
+  0x6d6e => 0x9087, 0x6d6f => 0x8ff4, 0x6d70 => 0x9005, 0x6d71 => 0x8ff9,
+  0x6d72 => 0x8ffa, 0x6d73 => 0x9011, 0x6d74 => 0x9015, 0x6d75 => 0x9021,
+  0x6d76 => 0x900d, 0x6d77 => 0x901e, 0x6d78 => 0x9016, 0x6d79 => 0x900b,
+  0x6d7a => 0x9027, 0x6d7b => 0x9036, 0x6d7c => 0x9035, 0x6d7d => 0x9039,
+  0x6d7e => 0x8ff8, 0x6e21 => 0x904f, 0x6e22 => 0x9050, 0x6e23 => 0x9051,
+  0x6e24 => 0x9052, 0x6e25 => 0x900e, 0x6e26 => 0x9049, 0x6e27 => 0x903e,
+  0x6e28 => 0x9056, 0x6e29 => 0x9058, 0x6e2a => 0x905e, 0x6e2b => 0x9068,
+  0x6e2c => 0x906f, 0x6e2d => 0x9076, 0x6e2e => 0x96a8, 0x6e2f => 0x9072,
+  0x6e30 => 0x9082, 0x6e31 => 0x907d, 0x6e32 => 0x9081, 0x6e33 => 0x9080,
+  0x6e34 => 0x908a, 0x6e35 => 0x9089, 0x6e36 => 0x908f, 0x6e37 => 0x90a8,
+  0x6e38 => 0x90af, 0x6e39 => 0x90b1, 0x6e3a => 0x90b5, 0x6e3b => 0x90e2,
+  0x6e3c => 0x90e4, 0x6e3d => 0x6248, 0x6e3e => 0x90db, 0x6e3f => 0x9102,
+  0x6e40 => 0x9112, 0x6e41 => 0x9119, 0x6e42 => 0x9132, 0x6e43 => 0x9130,
+  0x6e44 => 0x914a, 0x6e45 => 0x9156, 0x6e46 => 0x9158, 0x6e47 => 0x9163,
+  0x6e48 => 0x9165, 0x6e49 => 0x9169, 0x6e4a => 0x9173, 0x6e4b => 0x9172,
+  0x6e4c => 0x918b, 0x6e4d => 0x9189, 0x6e4e => 0x9182, 0x6e4f => 0x91a2,
+  0x6e50 => 0x91ab, 0x6e51 => 0x91af, 0x6e52 => 0x91aa, 0x6e53 => 0x91b5,
+  0x6e54 => 0x91b4, 0x6e55 => 0x91ba, 0x6e56 => 0x91c0, 0x6e57 => 0x91c1,
+  0x6e58 => 0x91c9, 0x6e59 => 0x91cb, 0x6e5a => 0x91d0, 0x6e5b => 0x91d6,
+  0x6e5c => 0x91df, 0x6e5d => 0x91e1, 0x6e5e => 0x91db, 0x6e5f => 0x91fc,
+  0x6e60 => 0x91f5, 0x6e61 => 0x91f6, 0x6e62 => 0x921e, 0x6e63 => 0x91ff,
+  0x6e64 => 0x9214, 0x6e65 => 0x922c, 0x6e66 => 0x9215, 0x6e67 => 0x9211,
+  0x6e68 => 0x925e, 0x6e69 => 0x9257, 0x6e6a => 0x9245, 0x6e6b => 0x9249,
+  0x6e6c => 0x9264, 0x6e6d => 0x9248, 0x6e6e => 0x9295, 0x6e6f => 0x923f,
+  0x6e70 => 0x924b, 0x6e71 => 0x9250, 0x6e72 => 0x929c, 0x6e73 => 0x9296,
+  0x6e74 => 0x9293, 0x6e75 => 0x929b, 0x6e76 => 0x925a, 0x6e77 => 0x92cf,
+  0x6e78 => 0x92b9, 0x6e79 => 0x92b7, 0x6e7a => 0x92e9, 0x6e7b => 0x930f,
+  0x6e7c => 0x92fa, 0x6e7d => 0x9344, 0x6e7e => 0x932e, 0x6f21 => 0x9319,
+  0x6f22 => 0x9322, 0x6f23 => 0x931a, 0x6f24 => 0x9323, 0x6f25 => 0x933a,
+  0x6f26 => 0x9335, 0x6f27 => 0x933b, 0x6f28 => 0x935c, 0x6f29 => 0x9360,
+  0x6f2a => 0x937c, 0x6f2b => 0x936e, 0x6f2c => 0x9356, 0x6f2d => 0x93b0,
+  0x6f2e => 0x93ac, 0x6f2f => 0x93ad, 0x6f30 => 0x9394, 0x6f31 => 0x93b9,
+  0x6f32 => 0x93d6, 0x6f33 => 0x93d7, 0x6f34 => 0x93e8, 0x6f35 => 0x93e5,
+  0x6f36 => 0x93d8, 0x6f37 => 0x93c3, 0x6f38 => 0x93dd, 0x6f39 => 0x93d0,
+  0x6f3a => 0x93c8, 0x6f3b => 0x93e4, 0x6f3c => 0x941a, 0x6f3d => 0x9414,
+  0x6f3e => 0x9413, 0x6f3f => 0x9403, 0x6f40 => 0x9407, 0x6f41 => 0x9410,
+  0x6f42 => 0x9436, 0x6f43 => 0x942b, 0x6f44 => 0x9435, 0x6f45 => 0x9421,
+  0x6f46 => 0x943a, 0x6f47 => 0x9441, 0x6f48 => 0x9452, 0x6f49 => 0x9444,
+  0x6f4a => 0x945b, 0x6f4b => 0x9460, 0x6f4c => 0x9462, 0x6f4d => 0x945e,
+  0x6f4e => 0x946a, 0x6f4f => 0x9229, 0x6f50 => 0x9470, 0x6f51 => 0x9475,
+  0x6f52 => 0x9477, 0x6f53 => 0x947d, 0x6f54 => 0x945a, 0x6f55 => 0x947c,
+  0x6f56 => 0x947e, 0x6f57 => 0x9481, 0x6f58 => 0x947f, 0x6f59 => 0x9582,
+  0x6f5a => 0x9587, 0x6f5b => 0x958a, 0x6f5c => 0x9594, 0x6f5d => 0x9596,
+  0x6f5e => 0x9598, 0x6f5f => 0x9599, 0x6f60 => 0x95a0, 0x6f61 => 0x95a8,
+  0x6f62 => 0x95a7, 0x6f63 => 0x95ad, 0x6f64 => 0x95bc, 0x6f65 => 0x95bb,
+  0x6f66 => 0x95b9, 0x6f67 => 0x95be, 0x6f68 => 0x95ca, 0x6f69 => 0x6ff6,
+  0x6f6a => 0x95c3, 0x6f6b => 0x95cd, 0x6f6c => 0x95cc, 0x6f6d => 0x95d5,
+  0x6f6e => 0x95d4, 0x6f6f => 0x95d6, 0x6f70 => 0x95dc, 0x6f71 => 0x95e1,
+  0x6f72 => 0x95e5, 0x6f73 => 0x95e2, 0x6f74 => 0x9621, 0x6f75 => 0x9628,
+  0x6f76 => 0x962e, 0x6f77 => 0x962f, 0x6f78 => 0x9642, 0x6f79 => 0x964c,
+  0x6f7a => 0x964f, 0x6f7b => 0x964b, 0x6f7c => 0x9677, 0x6f7d => 0x965c,
+  0x6f7e => 0x965e, 0x7021 => 0x965d, 0x7022 => 0x965f, 0x7023 => 0x9666,
+  0x7024 => 0x9672, 0x7025 => 0x966c, 0x7026 => 0x968d, 0x7027 => 0x9698,
+  0x7028 => 0x9695, 0x7029 => 0x9697, 0x702a => 0x96aa, 0x702b => 0x96a7,
+  0x702c => 0x96b1, 0x702d => 0x96b2, 0x702e => 0x96b0, 0x702f => 0x96b4,
+  0x7030 => 0x96b6, 0x7031 => 0x96b8, 0x7032 => 0x96b9, 0x7033 => 0x96ce,
+  0x7034 => 0x96cb, 0x7035 => 0x96c9, 0x7036 => 0x96cd, 0x7037 => 0x894d,
+  0x7038 => 0x96dc, 0x7039 => 0x970d, 0x703a => 0x96d5, 0x703b => 0x96f9,
+  0x703c => 0x9704, 0x703d => 0x9706, 0x703e => 0x9708, 0x703f => 0x9713,
+  0x7040 => 0x970e, 0x7041 => 0x9711, 0x7042 => 0x970f, 0x7043 => 0x9716,
+  0x7044 => 0x9719, 0x7045 => 0x9724, 0x7046 => 0x972a, 0x7047 => 0x9730,
+  0x7048 => 0x9739, 0x7049 => 0x973d, 0x704a => 0x973e, 0x704b => 0x9744,
+  0x704c => 0x9746, 0x704d => 0x9748, 0x704e => 0x9742, 0x704f => 0x9749,
+  0x7050 => 0x975c, 0x7051 => 0x9760, 0x7052 => 0x9764, 0x7053 => 0x9766,
+  0x7054 => 0x9768, 0x7055 => 0x52d2, 0x7056 => 0x976b, 0x7057 => 0x9771,
+  0x7058 => 0x9779, 0x7059 => 0x9785, 0x705a => 0x977c, 0x705b => 0x9781,
+  0x705c => 0x977a, 0x705d => 0x9786, 0x705e => 0x978b, 0x705f => 0x978f,
+  0x7060 => 0x9790, 0x7061 => 0x979c, 0x7062 => 0x97a8, 0x7063 => 0x97a6,
+  0x7064 => 0x97a3, 0x7065 => 0x97b3, 0x7066 => 0x97b4, 0x7067 => 0x97c3,
+  0x7068 => 0x97c6, 0x7069 => 0x97c8, 0x706a => 0x97cb, 0x706b => 0x97dc,
+  0x706c => 0x97ed, 0x706d => 0x9f4f, 0x706e => 0x97f2, 0x706f => 0x7adf,
+  0x7070 => 0x97f6, 0x7071 => 0x97f5, 0x7072 => 0x980f, 0x7073 => 0x980c,
+  0x7074 => 0x9838, 0x7075 => 0x9824, 0x7076 => 0x9821, 0x7077 => 0x9837,
+  0x7078 => 0x983d, 0x7079 => 0x9846, 0x707a => 0x984f, 0x707b => 0x984b,
+  0x707c => 0x986b, 0x707d => 0x986f, 0x707e => 0x9870, 0x7121 => 0x9871,
+  0x7122 => 0x9874, 0x7123 => 0x9873, 0x7124 => 0x98aa, 0x7125 => 0x98af,
+  0x7126 => 0x98b1, 0x7127 => 0x98b6, 0x7128 => 0x98c4, 0x7129 => 0x98c3,
+  0x712a => 0x98c6, 0x712b => 0x98e9, 0x712c => 0x98eb, 0x712d => 0x9903,
+  0x712e => 0x9909, 0x712f => 0x9912, 0x7130 => 0x9914, 0x7131 => 0x9918,
+  0x7132 => 0x9921, 0x7133 => 0x991d, 0x7134 => 0x991e, 0x7135 => 0x9924,
+  0x7136 => 0x9920, 0x7137 => 0x992c, 0x7138 => 0x992e, 0x7139 => 0x993d,
+  0x713a => 0x993e, 0x713b => 0x9942, 0x713c => 0x9949, 0x713d => 0x9945,
+  0x713e => 0x9950, 0x713f => 0x994b, 0x7140 => 0x9951, 0x7141 => 0x9952,
+  0x7142 => 0x994c, 0x7143 => 0x9955, 0x7144 => 0x9997, 0x7145 => 0x9998,
+  0x7146 => 0x99a5, 0x7147 => 0x99ad, 0x7148 => 0x99ae, 0x7149 => 0x99bc,
+  0x714a => 0x99df, 0x714b => 0x99db, 0x714c => 0x99dd, 0x714d => 0x99d8,
+  0x714e => 0x99d1, 0x714f => 0x99ed, 0x7150 => 0x99ee, 0x7151 => 0x99f1,
+  0x7152 => 0x99f2, 0x7153 => 0x99fb, 0x7154 => 0x99f8, 0x7155 => 0x9a01,
+  0x7156 => 0x9a0f, 0x7157 => 0x9a05, 0x7158 => 0x99e2, 0x7159 => 0x9a19,
+  0x715a => 0x9a2b, 0x715b => 0x9a37, 0x715c => 0x9a45, 0x715d => 0x9a42,
+  0x715e => 0x9a40, 0x715f => 0x9a43, 0x7160 => 0x9a3e, 0x7161 => 0x9a55,
+  0x7162 => 0x9a4d, 0x7163 => 0x9a5b, 0x7164 => 0x9a57, 0x7165 => 0x9a5f,
+  0x7166 => 0x9a62, 0x7167 => 0x9a65, 0x7168 => 0x9a64, 0x7169 => 0x9a69,
+  0x716a => 0x9a6b, 0x716b => 0x9a6a, 0x716c => 0x9aad, 0x716d => 0x9ab0,
+  0x716e => 0x9abc, 0x716f => 0x9ac0, 0x7170 => 0x9acf, 0x7171 => 0x9ad1,
+  0x7172 => 0x9ad3, 0x7173 => 0x9ad4, 0x7174 => 0x9ade, 0x7175 => 0x9adf,
+  0x7176 => 0x9ae2, 0x7177 => 0x9ae3, 0x7178 => 0x9ae6, 0x7179 => 0x9aef,
+  0x717a => 0x9aeb, 0x717b => 0x9aee, 0x717c => 0x9af4, 0x717d => 0x9af1,
+  0x717e => 0x9af7, 0x7221 => 0x9afb, 0x7222 => 0x9b06, 0x7223 => 0x9b18,
+  0x7224 => 0x9b1a, 0x7225 => 0x9b1f, 0x7226 => 0x9b22, 0x7227 => 0x9b23,
+  0x7228 => 0x9b25, 0x7229 => 0x9b27, 0x722a => 0x9b28, 0x722b => 0x9b29,
+  0x722c => 0x9b2a, 0x722d => 0x9b2e, 0x722e => 0x9b2f, 0x722f => 0x9b32,
+  0x7230 => 0x9b44, 0x7231 => 0x9b43, 0x7232 => 0x9b4f, 0x7233 => 0x9b4d,
+  0x7234 => 0x9b4e, 0x7235 => 0x9b51, 0x7236 => 0x9b58, 0x7237 => 0x9b74,
+  0x7238 => 0x9b93, 0x7239 => 0x9b83, 0x723a => 0x9b91, 0x723b => 0x9b96,
+  0x723c => 0x9b97, 0x723d => 0x9b9f, 0x723e => 0x9ba0, 0x723f => 0x9ba8,
+  0x7240 => 0x9bb4, 0x7241 => 0x9bc0, 0x7242 => 0x9bca, 0x7243 => 0x9bb9,
+  0x7244 => 0x9bc6, 0x7245 => 0x9bcf, 0x7246 => 0x9bd1, 0x7247 => 0x9bd2,
+  0x7248 => 0x9be3, 0x7249 => 0x9be2, 0x724a => 0x9be4, 0x724b => 0x9bd4,
+  0x724c => 0x9be1, 0x724d => 0x9c3a, 0x724e => 0x9bf2, 0x724f => 0x9bf1,
+  0x7250 => 0x9bf0, 0x7251 => 0x9c15, 0x7252 => 0x9c14, 0x7253 => 0x9c09,
+  0x7254 => 0x9c13, 0x7255 => 0x9c0c, 0x7256 => 0x9c06, 0x7257 => 0x9c08,
+  0x7258 => 0x9c12, 0x7259 => 0x9c0a, 0x725a => 0x9c04, 0x725b => 0x9c2e,
+  0x725c => 0x9c1b, 0x725d => 0x9c25, 0x725e => 0x9c24, 0x725f => 0x9c21,
+  0x7260 => 0x9c30, 0x7261 => 0x9c47, 0x7262 => 0x9c32, 0x7263 => 0x9c46,
+  0x7264 => 0x9c3e, 0x7265 => 0x9c5a, 0x7266 => 0x9c60, 0x7267 => 0x9c67,
+  0x7268 => 0x9c76, 0x7269 => 0x9c78, 0x726a => 0x9ce7, 0x726b => 0x9cec,
+  0x726c => 0x9cf0, 0x726d => 0x9d09, 0x726e => 0x9d08, 0x726f => 0x9ceb,
+  0x7270 => 0x9d03, 0x7271 => 0x9d06, 0x7272 => 0x9d2a, 0x7273 => 0x9d26,
+  0x7274 => 0x9daf, 0x7275 => 0x9d23, 0x7276 => 0x9d1f, 0x7277 => 0x9d44,
+  0x7278 => 0x9d15, 0x7279 => 0x9d12, 0x727a => 0x9d41, 0x727b => 0x9d3f,
+  0x727c => 0x9d3e, 0x727d => 0x9d46, 0x727e => 0x9d48, 0x7321 => 0x9d5d,
+  0x7322 => 0x9d5e, 0x7323 => 0x9d64, 0x7324 => 0x9d51, 0x7325 => 0x9d50,
+  0x7326 => 0x9d59, 0x7327 => 0x9d72, 0x7328 => 0x9d89, 0x7329 => 0x9d87,
+  0x732a => 0x9dab, 0x732b => 0x9d6f, 0x732c => 0x9d7a, 0x732d => 0x9d9a,
+  0x732e => 0x9da4, 0x732f => 0x9da9, 0x7330 => 0x9db2, 0x7331 => 0x9dc4,
+  0x7332 => 0x9dc1, 0x7333 => 0x9dbb, 0x7334 => 0x9db8, 0x7335 => 0x9dba,
+  0x7336 => 0x9dc6, 0x7337 => 0x9dcf, 0x7338 => 0x9dc2, 0x7339 => 0x9dd9,
+  0x733a => 0x9dd3, 0x733b => 0x9df8, 0x733c => 0x9de6, 0x733d => 0x9ded,
+  0x733e => 0x9def, 0x733f => 0x9dfd, 0x7340 => 0x9e1a, 0x7341 => 0x9e1b,
+  0x7342 => 0x9e1e, 0x7343 => 0x9e75, 0x7344 => 0x9e79, 0x7345 => 0x9e7d,
+  0x7346 => 0x9e81, 0x7347 => 0x9e88, 0x7348 => 0x9e8b, 0x7349 => 0x9e8c,
+  0x734a => 0x9e92, 0x734b => 0x9e95, 0x734c => 0x9e91, 0x734d => 0x9e9d,
+  0x734e => 0x9ea5, 0x734f => 0x9ea9, 0x7350 => 0x9eb8, 0x7351 => 0x9eaa,
+  0x7352 => 0x9ead, 0x7353 => 0x9761, 0x7354 => 0x9ecc, 0x7355 => 0x9ece,
+  0x7356 => 0x9ecf, 0x7357 => 0x9ed0, 0x7358 => 0x9ed4, 0x7359 => 0x9edc,
+  0x735a => 0x9ede, 0x735b => 0x9edd, 0x735c => 0x9ee0, 0x735d => 0x9ee5,
+  0x735e => 0x9ee8, 0x735f => 0x9eef, 0x7360 => 0x9ef4, 0x7361 => 0x9ef6,
+  0x7362 => 0x9ef7, 0x7363 => 0x9ef9, 0x7364 => 0x9efb, 0x7365 => 0x9efc,
+  0x7366 => 0x9efd, 0x7367 => 0x9f07, 0x7368 => 0x9f08, 0x7369 => 0x76b7,
+  0x736a => 0x9f15, 0x736b => 0x9f21, 0x736c => 0x9f2c, 0x736d => 0x9f3e,
+  0x736e => 0x9f4a, 0x736f => 0x9f52, 0x7370 => 0x9f54, 0x7371 => 0x9f63,
+  0x7372 => 0x9f5f, 0x7373 => 0x9f60, 0x7374 => 0x9f61, 0x7375 => 0x9f66,
+  0x7376 => 0x9f67, 0x7377 => 0x9f6c, 0x7378 => 0x9f6a, 0x7379 => 0x9f77,
+  0x737a => 0x9f72, 0x737b => 0x9f76, 0x737c => 0x9f95, 0x737d => 0x9f9c,
+  0x737e => 0x9fa0, 0x7421 => 0x582f, 0x7422 => 0x69c7, 0x7423 => 0x9059,
+  0x7424 => 0x7464, 0x7425 => 0x51dc, 0x7426 => 0x7199,
+);
+
+1; # end
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/Latin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/Latin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/Latin.pm	(revision 24799)
@@ -0,0 +1,24 @@
+#------------------------------------------------------------------------------
+# File:         Latin.pm
+#
+# Description:  cp1252 to Unicode
+#
+# Revisions:    2010/01/20 - P. Harvey created
+#
+# References:   1) http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT
+#
+# Notes:        The table omits 1-byte characters with the same values as Unicode
+#------------------------------------------------------------------------------
+use strict;
+
+%Image::ExifTool::Charset::Latin = (
+  0x80 => 0x20ac, 0x82 => 0x201a, 0x83 => 0x0192, 0x84 => 0x201e,
+  0x85 => 0x2026, 0x86 => 0x2020, 0x87 => 0x2021, 0x88 => 0x02c6,
+  0x89 => 0x2030, 0x8a => 0x0160, 0x8b => 0x2039, 0x8c => 0x0152,
+  0x8e => 0x017d, 0x91 => 0x2018, 0x92 => 0x2019, 0x93 => 0x201c,
+  0x94 => 0x201d, 0x95 => 0x2022, 0x96 => 0x2013, 0x97 => 0x2014,
+  0x98 => 0x02dc, 0x99 => 0x2122, 0x9a => 0x0161, 0x9b => 0x203a,
+  0x9c => 0x0153, 0x9e => 0x017e, 0x9f => 0x0178,
+);
+
+1; # end
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/Latin2.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/Latin2.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/Latin2.pm	(revision 24799)
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+# File:         Latin2.pm
+#
+# Description:  cp1250 to Unicode
+#
+# Revisions:    2010/01/20 - P. Harvey created
+#
+# References:   1) http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1250.TXT
+#
+# Notes:        The table omits 1-byte characters with the same values as Unicode
+#------------------------------------------------------------------------------
+use strict;
+
+%Image::ExifTool::Charset::Latin2 = (
+  0x80 => 0x20ac, 0x82 => 0x201a, 0x84 => 0x201e, 0x85 => 0x2026,
+  0x86 => 0x2020, 0x87 => 0x2021, 0x89 => 0x2030, 0x8a => 0x0160,
+  0x8b => 0x2039, 0x8c => 0x015a, 0x8d => 0x0164, 0x8e => 0x017d,
+  0x8f => 0x0179, 0x91 => 0x2018, 0x92 => 0x2019, 0x93 => 0x201c,
+  0x94 => 0x201d, 0x95 => 0x2022, 0x96 => 0x2013, 0x97 => 0x2014,
+  0x99 => 0x2122, 0x9a => 0x0161, 0x9b => 0x203a, 0x9c => 0x015b,
+  0x9d => 0x0165, 0x9e => 0x017e, 0x9f => 0x017a, 0xa1 => 0x02c7,
+  0xa2 => 0x02d8, 0xa3 => 0x0141, 0xa5 => 0x0104, 0xaa => 0x015e,
+  0xaf => 0x017b, 0xb2 => 0x02db, 0xb3 => 0x0142, 0xb9 => 0x0105,
+  0xba => 0x015f, 0xbc => 0x013d, 0xbd => 0x02dd, 0xbe => 0x013e,
+  0xbf => 0x017c, 0xc0 => 0x0154, 0xc3 => 0x0102, 0xc5 => 0x0139,
+  0xc6 => 0x0106, 0xc8 => 0x010c, 0xca => 0x0118, 0xcc => 0x011a,
+  0xcf => 0x010e, 0xd0 => 0x0110, 0xd1 => 0x0143, 0xd2 => 0x0147,
+  0xd5 => 0x0150, 0xd8 => 0x0158, 0xd9 => 0x016e, 0xdb => 0x0170,
+  0xde => 0x0162, 0xe0 => 0x0155, 0xe3 => 0x0103, 0xe5 => 0x013a,
+  0xe6 => 0x0107, 0xe8 => 0x010d, 0xea => 0x0119, 0xec => 0x011b,
+  0xef => 0x010f, 0xf0 => 0x0111, 0xf1 => 0x0144, 0xf2 => 0x0148,
+  0xf5 => 0x0151, 0xf8 => 0x0159, 0xf9 => 0x016f, 0xfb => 0x0171,
+  0xfe => 0x0163, 0xff => 0x02d9,
+);
+
+1; # end
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacArabic.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacArabic.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacArabic.pm	(revision 24799)
@@ -0,0 +1,47 @@
+#------------------------------------------------------------------------------
+# File:         MacArabic.pm
+#
+# Description:  Mac Arabic to Unicode
+#
+# Revisions:    2010/01/20 - P. Harvey created
+#
+# References:   1) http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/ARABIC.TXT
+#
+# Notes:        The table omits 1-byte characters with the same values as Unicode
+#               and directional characters are ignored
+#------------------------------------------------------------------------------
+use strict;
+
+%Image::ExifTool::Charset::MacArabic = (
+  0x80 => 0xc4, 0x81 => 0xa0, 0x82 => 0xc7, 0x83 => 0xc9, 0x84 => 0xd1,
+  0x85 => 0xd6, 0x86 => 0xdc, 0x87 => 0xe1, 0x88 => 0xe0, 0x89 => 0xe2,
+  0x8a => 0xe4, 0x8b => 0x06ba, 0x8c => 0xab, 0x8d => 0xe7, 0x8e => 0xe9,
+  0x8f => 0xe8, 0x90 => 0xea, 0x91 => 0xeb, 0x92 => 0xed, 0x93 => 0x2026,
+  0x94 => 0xee, 0x95 => 0xef, 0x96 => 0xf1, 0x97 => 0xf3, 0x98 => 0xbb,
+  0x99 => 0xf4, 0x9a => 0xf6, 0x9b => 0xf7, 0x9c => 0xfa, 0x9d => 0xf9,
+  0x9e => 0xfb, 0x9f => 0xfc, 0xa0 => 0x20, 0xa1 => 0x21, 0xa2 => 0x22,
+  0xa3 => 0x23, 0xa4 => 0x24, 0xa5 => 0x066a, 0xa6 => 0x26, 0xa7 => 0x27,
+  0xa8 => 0x28, 0xa9 => 0x29, 0xaa => 0x2a, 0xab => 0x2b, 0xac => 0x060c,
+  0xad => 0x2d, 0xae => 0x2e, 0xaf => 0x2f, 0xb0 => 0x0660, 0xb1 => 0x0661,
+  0xb2 => 0x0662, 0xb3 => 0x0663, 0xb4 => 0x0664, 0xb5 => 0x0665,
+  0xb6 => 0x0666, 0xb7 => 0x0667, 0xb8 => 0x0668, 0xb9 => 0x0669, 0xba => 0x3a,
+  0xbb => 0x061b, 0xbc => 0x3c, 0xbd => 0x3d, 0xbe => 0x3e, 0xbf => 0x061f,
+  0xc0 => 0x274a, 0xc1 => 0x0621, 0xc2 => 0x0622, 0xc3 => 0x0623,
+  0xc4 => 0x0624, 0xc5 => 0x0625, 0xc6 => 0x0626, 0xc7 => 0x0627,
+  0xc8 => 0x0628, 0xc9 => 0x0629, 0xca => 0x062a, 0xcb => 0x062b,
+  0xcc => 0x062c, 0xcd => 0x062d, 0xce => 0x062e, 0xcf => 0x062f,
+  0xd0 => 0x0630, 0xd1 => 0x0631, 0xd2 => 0x0632, 0xd3 => 0x0633,
+  0xd4 => 0x0634, 0xd5 => 0x0635, 0xd6 => 0x0636, 0xd7 => 0x0637,
+  0xd8 => 0x0638, 0xd9 => 0x0639, 0xda => 0x063a, 0xdb => 0x5b, 0xdc => 0x5c,
+  0xdd => 0x5d, 0xde => 0x5e, 0xdf => 0x5f, 0xe0 => 0x0640, 0xe1 => 0x0641,
+  0xe2 => 0x0642, 0xe3 => 0x0643, 0xe4 => 0x0644, 0xe5 => 0x0645,
+  0xe6 => 0x0646, 0xe7 => 0x0647, 0xe8 => 0x0648, 0xe9 => 0x0649,
+  0xea => 0x064a, 0xeb => 0x064b, 0xec => 0x064c, 0xed => 0x064d,
+  0xee => 0x064e, 0xef => 0x064f, 0xf0 => 0x0650, 0xf1 => 0x0651,
+  0xf2 => 0x0652, 0xf3 => 0x067e, 0xf4 => 0x0679, 0xf5 => 0x0686,
+  0xf6 => 0x06d5, 0xf7 => 0x06a4, 0xf8 => 0x06af, 0xf9 => 0x0688,
+  0xfa => 0x0691, 0xfb => 0x7b, 0xfc => 0x7c, 0xfd => 0x7d, 0xfe => 0x0698,
+  0xff => 0x06d2,
+);
+
+1; # end
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacChineseCN.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacChineseCN.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacChineseCN.pm	(revision 24799)
@@ -0,0 +1,2088 @@
+#------------------------------------------------------------------------------
+# File:         MacChineseCN.pm
+#
+# Description:  Mac Chinese Simplified to Unicode
+#
+# Revisions:    2010/01/20 - P. Harvey created
+#
+# References:   1) http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/CHINSIMP.TXT
+#
+# Notes:        The table omits 1-byte characters with the same values as Unicode
+#------------------------------------------------------------------------------
+use strict;
+
+%Image::ExifTool::Charset::MacChineseCN = (
+  0x80 => [0xfc,0xf87f], 0x81 => 0xf880, 0x82 => 0xf881, 0xfd => 0xa9,
+  0xfe => 0x2122, 0xff => 0x2026,
+  0xa1 => {
+    0xa1 => 0x3000, 0xa2 => 0x3001, 0xa3 => 0x3002, 0xa4 => 0xb7,
+    0xa5 => 0x02c9, 0xa6 => 0x02c7, 0xa7 => 0xa8, 0xa8 => 0x3003,
+    0xa9 => 0x3005, 0xaa => 0x2014, 0xab => 0x301c, 0xac => 0x2016,
+    0xad => 0x22ef, 0xae => 0x2018, 0xaf => 0x2019, 0xb0 => 0x201c,
+    0xb1 => 0x201d, 0xb2 => 0x3014, 0xb3 => 0x3015, 0xb4 => 0x3008,
+    0xb5 => 0x3009, 0xb6 => 0x300a, 0xb7 => 0x300b, 0xb8 => 0x300c,
+    0xb9 => 0x300d, 0xba => 0x300e, 0xbb => 0x300f, 0xbc => 0x3016,
+    0xbd => 0x3017, 0xbe => 0x3010, 0xbf => 0x3011, 0xc0 => 0xb1, 0xc1 => 0xd7,
+    0xc2 => 0xf7, 0xc3 => 0x2236, 0xc4 => 0x2227, 0xc5 => 0x2228,
+    0xc6 => 0x2211, 0xc7 => 0x220f, 0xc8 => 0x222a, 0xc9 => 0x2229,
+    0xca => 0x2208, 0xcb => 0x2237, 0xcc => 0x221a, 0xcd => 0x22a5,
+    0xce => 0x2225, 0xcf => 0x2220, 0xd0 => 0x2312, 0xd1 => 0x2299,
+    0xd2 => 0x222b, 0xd3 => 0x222e, 0xd4 => 0x2261, 0xd5 => 0x224c,
+    0xd6 => 0x2248, 0xd7 => 0x223d, 0xd8 => 0x221d, 0xd9 => 0x2260,
+    0xda => 0x226e, 0xdb => 0x226f, 0xdc => 0x2264, 0xdd => 0x2265,
+    0xde => 0x221e, 0xdf => 0x2235, 0xe0 => 0x2234, 0xe1 => 0x2642,
+    0xe2 => 0x2640, 0xe3 => 0xb0, 0xe4 => 0x2032, 0xe5 => 0x2033,
+    0xe6 => 0x2103, 0xe7 => 0xff04, 0xe8 => 0xa4, 0xe9 => 0xa2, 0xea => 0xa3,
+    0xeb => 0x2030, 0xec => 0xa7, 0xed => 0x2116, 0xee => 0x2606,
+    0xef => 0x2605, 0xf0 => 0x25cb, 0xf1 => 0x25cf, 0xf2 => 0x25ce,
+    0xf3 => 0x25c7, 0xf4 => 0x25c6, 0xf5 => 0x25a1, 0xf6 => 0x25a0,
+    0xf7 => 0x25b3, 0xf8 => 0x25b2, 0xf9 => 0x203b, 0xfa => 0x2192,
+    0xfb => 0x2190, 0xfc => 0x2191, 0xfd => 0x2193, 0xfe => 0x3013,
+  },
+  0xa2 => {
+    0xb1 => 0x2488, 0xb2 => 0x2489, 0xb3 => 0x248a, 0xb4 => 0x248b,
+    0xb5 => 0x248c, 0xb6 => 0x248d, 0xb7 => 0x248e, 0xb8 => 0x248f,
+    0xb9 => 0x2490, 0xba => 0x2491, 0xbb => 0x2492, 0xbc => 0x2493,
+    0xbd => 0x2494, 0xbe => 0x2495, 0xbf => 0x2496, 0xc0 => 0x2497,
+    0xc1 => 0x2498, 0xc2 => 0x2499, 0xc3 => 0x249a, 0xc4 => 0x249b,
+    0xc5 => 0x2474, 0xc6 => 0x2475, 0xc7 => 0x2476, 0xc8 => 0x2477,
+    0xc9 => 0x2478, 0xca => 0x2479, 0xcb => 0x247a, 0xcc => 0x247b,
+    0xcd => 0x247c, 0xce => 0x247d, 0xcf => 0x247e, 0xd0 => 0x247f,
+    0xd1 => 0x2480, 0xd2 => 0x2481, 0xd3 => 0x2482, 0xd4 => 0x2483,
+    0xd5 => 0x2484, 0xd6 => 0x2485, 0xd7 => 0x2486, 0xd8 => 0x2487,
+    0xd9 => 0x2460, 0xda => 0x2461, 0xdb => 0x2462, 0xdc => 0x2463,
+    0xdd => 0x2464, 0xde => 0x2465, 0xdf => 0x2466, 0xe0 => 0x2467,
+    0xe1 => 0x2468, 0xe2 => 0x2469, 0xe5 => 0x3220, 0xe6 => 0x3221,
+    0xe7 => 0x3222, 0xe8 => 0x3223, 0xe9 => 0x3224, 0xea => 0x3225,
+    0xeb => 0x3226, 0xec => 0x3227, 0xed => 0x3228, 0xee => 0x3229,
+    0xf1 => 0x2160, 0xf2 => 0x2161, 0xf3 => 0x2162, 0xf4 => 0x2163,
+    0xf5 => 0x2164, 0xf6 => 0x2165, 0xf7 => 0x2166, 0xf8 => 0x2167,
+    0xf9 => 0x2168, 0xfa => 0x2169, 0xfb => 0x216a, 0xfc => 0x216b,
+  },
+  0xa3 => {
+    0xa1 => 0xff01, 0xa2 => 0xff02, 0xa3 => 0xff03, 0xa4 => 0xa5,
+    0xa5 => 0xff05, 0xa6 => 0xff06, 0xa7 => 0xff07, 0xa8 => 0xff08,
+    0xa9 => 0xff09, 0xaa => 0xff0a, 0xab => 0xff0b, 0xac => 0xff0c,
+    0xad => 0xff0d, 0xae => 0xff0e, 0xaf => 0xff0f, 0xb0 => 0xff10,
+    0xb1 => 0xff11, 0xb2 => 0xff12, 0xb3 => 0xff13, 0xb4 => 0xff14,
+    0xb5 => 0xff15, 0xb6 => 0xff16, 0xb7 => 0xff17, 0xb8 => 0xff18,
+    0xb9 => 0xff19, 0xba => 0xff1a, 0xbb => 0xff1b, 0xbc => 0xff1c,
+    0xbd => 0xff1d, 0xbe => 0xff1e, 0xbf => 0xff1f, 0xc0 => 0xff20,
+    0xc1 => 0xff21, 0xc2 => 0xff22, 0xc3 => 0xff23, 0xc4 => 0xff24,
+    0xc5 => 0xff25, 0xc6 => 0xff26, 0xc7 => 0xff27, 0xc8 => 0xff28,
+    0xc9 => 0xff29, 0xca => 0xff2a, 0xcb => 0xff2b, 0xcc => 0xff2c,
+    0xcd => 0xff2d, 0xce => 0xff2e, 0xcf => 0xff2f, 0xd0 => 0xff30,
+    0xd1 => 0xff31, 0xd2 => 0xff32, 0xd3 => 0xff33, 0xd4 => 0xff34,
+    0xd5 => 0xff35, 0xd6 => 0xff36, 0xd7 => 0xff37, 0xd8 => 0xff38,
+    0xd9 => 0xff39, 0xda => 0xff3a, 0xdb => 0xff3b, 0xdc => 0xff3c,
+    0xdd => 0xff3d, 0xde => 0xff3e, 0xdf => 0xff3f, 0xe0 => 0xff40,
+    0xe1 => 0xff41, 0xe2 => 0xff42, 0xe3 => 0xff43, 0xe4 => 0xff44,
+    0xe5 => 0xff45, 0xe6 => 0xff46, 0xe7 => 0xff47, 0xe8 => 0xff48,
+    0xe9 => 0xff49, 0xea => 0xff4a, 0xeb => 0xff4b, 0xec => 0xff4c,
+    0xed => 0xff4d, 0xee => 0xff4e, 0xef => 0xff4f, 0xf0 => 0xff50,
+    0xf1 => 0xff51, 0xf2 => 0xff52, 0xf3 => 0xff53, 0xf4 => 0xff54,
+    0xf5 => 0xff55, 0xf6 => 0xff56, 0xf7 => 0xff57, 0xf8 => 0xff58,
+    0xf9 => 0xff59, 0xfa => 0xff5a, 0xfb => 0xff5b, 0xfc => 0xff5c,
+    0xfd => 0xff5d, 0xfe => 0x203e,
+  },
+  0xa4 => {
+    0xa1 => 0x3041, 0xa2 => 0x3042, 0xa3 => 0x3043, 0xa4 => 0x3044,
+    0xa5 => 0x3045, 0xa6 => 0x3046, 0xa7 => 0x3047, 0xa8 => 0x3048,
+    0xa9 => 0x3049, 0xaa => 0x304a, 0xab => 0x304b, 0xac => 0x304c,
+    0xad => 0x304d, 0xae => 0x304e, 0xaf => 0x304f, 0xb0 => 0x3050,
+    0xb1 => 0x3051, 0xb2 => 0x3052, 0xb3 => 0x3053, 0xb4 => 0x3054,
+    0xb5 => 0x3055, 0xb6 => 0x3056, 0xb7 => 0x3057, 0xb8 => 0x3058,
+    0xb9 => 0x3059, 0xba => 0x305a, 0xbb => 0x305b, 0xbc => 0x305c,
+    0xbd => 0x305d, 0xbe => 0x305e, 0xbf => 0x305f, 0xc0 => 0x3060,
+    0xc1 => 0x3061, 0xc2 => 0x3062, 0xc3 => 0x3063, 0xc4 => 0x3064,
+    0xc5 => 0x3065, 0xc6 => 0x3066, 0xc7 => 0x3067, 0xc8 => 0x3068,
+    0xc9 => 0x3069, 0xca => 0x306a, 0xcb => 0x306b, 0xcc => 0x306c,
+    0xcd => 0x306d, 0xce => 0x306e, 0xcf => 0x306f, 0xd0 => 0x3070,
+    0xd1 => 0x3071, 0xd2 => 0x3072, 0xd3 => 0x3073, 0xd4 => 0x3074,
+    0xd5 => 0x3075, 0xd6 => 0x3076, 0xd7 => 0x3077, 0xd8 => 0x3078,
+    0xd9 => 0x3079, 0xda => 0x307a, 0xdb => 0x307b, 0xdc => 0x307c,
+    0xdd => 0x307d, 0xde => 0x307e, 0xdf => 0x307f, 0xe0 => 0x3080,
+    0xe1 => 0x3081, 0xe2 => 0x3082, 0xe3 => 0x3083, 0xe4 => 0x3084,
+    0xe5 => 0x3085, 0xe6 => 0x3086, 0xe7 => 0x3087, 0xe8 => 0x3088,
+    0xe9 => 0x3089, 0xea => 0x308a, 0xeb => 0x308b, 0xec => 0x308c,
+    0xed => 0x308d, 0xee => 0x308e, 0xef => 0x308f, 0xf0 => 0x3090,
+    0xf1 => 0x3091, 0xf2 => 0x3092, 0xf3 => 0x3093,
+  },
+  0xa5 => {
+    0xa1 => 0x30a1, 0xa2 => 0x30a2, 0xa3 => 0x30a3, 0xa4 => 0x30a4,
+    0xa5 => 0x30a5, 0xa6 => 0x30a6, 0xa7 => 0x30a7, 0xa8 => 0x30a8,
+    0xa9 => 0x30a9, 0xaa => 0x30aa, 0xab => 0x30ab, 0xac => 0x30ac,
+    0xad => 0x30ad, 0xae => 0x30ae, 0xaf => 0x30af, 0xb0 => 0x30b0,
+    0xb1 => 0x30b1, 0xb2 => 0x30b2, 0xb3 => 0x30b3, 0xb4 => 0x30b4,
+    0xb5 => 0x30b5, 0xb6 => 0x30b6, 0xb7 => 0x30b7, 0xb8 => 0x30b8,
+    0xb9 => 0x30b9, 0xba => 0x30ba, 0xbb => 0x30bb, 0xbc => 0x30bc,
+    0xbd => 0x30bd, 0xbe => 0x30be, 0xbf => 0x30bf, 0xc0 => 0x30c0,
+    0xc1 => 0x30c1, 0xc2 => 0x30c2, 0xc3 => 0x30c3, 0xc4 => 0x30c4,
+    0xc5 => 0x30c5, 0xc6 => 0x30c6, 0xc7 => 0x30c7, 0xc8 => 0x30c8,
+    0xc9 => 0x30c9, 0xca => 0x30ca, 0xcb => 0x30cb, 0xcc => 0x30cc,
+    0xcd => 0x30cd, 0xce => 0x30ce, 0xcf => 0x30cf, 0xd0 => 0x30d0,
+    0xd1 => 0x30d1, 0xd2 => 0x30d2, 0xd3 => 0x30d3, 0xd4 => 0x30d4,
+    0xd5 => 0x30d5, 0xd6 => 0x30d6, 0xd7 => 0x30d7, 0xd8 => 0x30d8,
+    0xd9 => 0x30d9, 0xda => 0x30da, 0xdb => 0x30db, 0xdc => 0x30dc,
+    0xdd => 0x30dd, 0xde => 0x30de, 0xdf => 0x30df, 0xe0 => 0x30e0,
+    0xe1 => 0x30e1, 0xe2 => 0x30e2, 0xe3 => 0x30e3, 0xe4 => 0x30e4,
+    0xe5 => 0x30e5, 0xe6 => 0x30e6, 0xe7 => 0x30e7, 0xe8 => 0x30e8,
+    0xe9 => 0x30e9, 0xea => 0x30ea, 0xeb => 0x30eb, 0xec => 0x30ec,
+    0xed => 0x30ed, 0xee => 0x30ee, 0xef => 0x30ef, 0xf0 => 0x30f0,
+    0xf1 => 0x30f1, 0xf2 => 0x30f2, 0xf3 => 0x30f3, 0xf4 => 0x30f4,
+    0xf5 => 0x30f5, 0xf6 => 0x30f6,
+  },
+  0xa6 => {
+    0xa1 => 0x0391, 0xa2 => 0x0392, 0xa3 => 0x0393, 0xa4 => 0x0394,
+    0xa5 => 0x0395, 0xa6 => 0x0396, 0xa7 => 0x0397, 0xa8 => 0x0398,
+    0xa9 => 0x0399, 0xaa => 0x039a, 0xab => 0x039b, 0xac => 0x039c,
+    0xad => 0x039d, 0xae => 0x039e, 0xaf => 0x039f, 0xb0 => 0x03a0,
+    0xb1 => 0x03a1, 0xb2 => 0x03a3, 0xb3 => 0x03a4, 0xb4 => 0x03a5,
+    0xb5 => 0x03a6, 0xb6 => 0x03a7, 0xb7 => 0x03a8, 0xb8 => 0x03a9,
+    0xc1 => 0x03b1, 0xc2 => 0x03b2, 0xc3 => 0x03b3, 0xc4 => 0x03b4,
+    0xc5 => 0x03b5, 0xc6 => 0x03b6, 0xc7 => 0x03b7, 0xc8 => 0x03b8,
+    0xc9 => 0x03b9, 0xca => 0x03ba, 0xcb => 0x03bb, 0xcc => 0x03bc,
+    0xcd => 0x03bd, 0xce => 0x03be, 0xcf => 0x03bf, 0xd0 => 0x03c0,
+    0xd1 => 0x03c1, 0xd2 => 0x03c3, 0xd3 => 0x03c4, 0xd4 => 0x03c5,
+    0xd5 => 0x03c6, 0xd6 => 0x03c7, 0xd7 => 0x03c8, 0xd8 => 0x03c9,
+    0xd9 => [0xff0c,0xf87e], 0xda => [0x3002,0xf87e], 0xdb => [0x3001,0xf87e],
+    0xdc => [0xff1a,0xf87e], 0xdd => [0xff1b,0xf87e], 0xde => [0xff01,0xf87e],
+    0xdf => [0xff1f,0xf87e], 0xe0 => 0xfe35, 0xe1 => 0xfe36, 0xe2 => 0xfe39,
+    0xe3 => 0xfe3a, 0xe4 => 0xfe3f, 0xe5 => 0xfe40, 0xe6 => 0xfe3d,
+    0xe7 => 0xfe3e, 0xe8 => 0xfe41, 0xe9 => 0xfe42, 0xea => 0xfe43,
+    0xeb => 0xfe44, 0xec => [0x3016,0xf87e], 0xed => [0x3017,0xf87e],
+    0xee => 0xfe3b, 0xef => 0xfe3c, 0xf0 => 0xfe37, 0xf1 => 0xfe38,
+    0xf2 => 0xfe31, 0xf3 => [0x22ef,0xf87e], 0xf4 => 0xfe33, 0xf5 => 0xfe34,
+  },
+  0xa7 => {
+    0xa1 => 0x0410, 0xa2 => 0x0411, 0xa3 => 0x0412, 0xa4 => 0x0413,
+    0xa5 => 0x0414, 0xa6 => 0x0415, 0xa7 => 0x0401, 0xa8 => 0x0416,
+    0xa9 => 0x0417, 0xaa => 0x0418, 0xab => 0x0419, 0xac => 0x041a,
+    0xad => 0x041b, 0xae => 0x041c, 0xaf => 0x041d, 0xb0 => 0x041e,
+    0xb1 => 0x041f, 0xb2 => 0x0420, 0xb3 => 0x0421, 0xb4 => 0x0422,
+    0xb5 => 0x0423, 0xb6 => 0x0424, 0xb7 => 0x0425, 0xb8 => 0x0426,
+    0xb9 => 0x0427, 0xba => 0x0428, 0xbb => 0x0429, 0xbc => 0x042a,
+    0xbd => 0x042b, 0xbe => 0x042c, 0xbf => 0x042d, 0xc0 => 0x042e,
+    0xc1 => 0x042f, 0xd1 => 0x0430, 0xd2 => 0x0431, 0xd3 => 0x0432,
+    0xd4 => 0x0433, 0xd5 => 0x0434, 0xd6 => 0x0435, 0xd7 => 0x0451,
+    0xd8 => 0x0436, 0xd9 => 0x0437, 0xda => 0x0438, 0xdb => 0x0439,
+    0xdc => 0x043a, 0xdd => 0x043b, 0xde => 0x043c, 0xdf => 0x043d,
+    0xe0 => 0x043e, 0xe1 => 0x043f, 0xe2 => 0x0440, 0xe3 => 0x0441,
+    0xe4 => 0x0442, 0xe5 => 0x0443, 0xe6 => 0x0444, 0xe7 => 0x0445,
+    0xe8 => 0x0446, 0xe9 => 0x0447, 0xea => 0x0448, 0xeb => 0x0449,
+    0xec => 0x044a, 0xed => 0x044b, 0xee => 0x044c, 0xef => 0x044d,
+    0xf0 => 0x044e, 0xf1 => 0x044f,
+  },
+  0xa8 => {
+    0xa1 => 0x0101, 0xa2 => 0xe1, 0xa3 => 0x01ce, 0xa4 => 0xe0, 0xa5 => 0x0113,
+    0xa6 => 0xe9, 0xa7 => 0x011b, 0xa8 => 0xe8, 0xa9 => 0x012b, 0xaa => 0xed,
+    0xab => 0x01d0, 0xac => 0xec, 0xad => 0x014d, 0xae => 0xf3, 0xaf => 0x01d2,
+    0xb0 => 0xf2, 0xb1 => 0x016b, 0xb2 => 0xfa, 0xb3 => 0x01d4, 0xb4 => 0xf9,
+    0xb5 => 0x01d6, 0xb6 => 0x01d8, 0xb7 => 0x01da, 0xb8 => 0x01dc,
+    0xb9 => 0xfc, 0xba => 0xea, 0xbb => 0x0251, 0xbc => 0x1e3f, 0xbd => 0x0144,
+    0xbe => 0x0148, 0xbf => 0x01f9, 0xc0 => 0x0261, 0xc5 => 0x3105,
+    0xc6 => 0x3106, 0xc7 => 0x3107, 0xc8 => 0x3108, 0xc9 => 0x3109,
+    0xca => 0x310a, 0xcb => 0x310b, 0xcc => 0x310c, 0xcd => 0x310d,
+    0xce => 0x310e, 0xcf => 0x310f, 0xd0 => 0x3110, 0xd1 => 0x3111,
+    0xd2 => 0x3112, 0xd3 => 0x3113, 0xd4 => 0x3114, 0xd5 => 0x3115,
+    0xd6 => 0x3116, 0xd7 => 0x3117, 0xd8 => 0x3118, 0xd9 => 0x3119,
+    0xda => 0x311a, 0xdb => 0x311b, 0xdc => 0x311c, 0xdd => 0x311d,
+    0xde => 0x311e, 0xdf => 0x311f, 0xe0 => 0x3120, 0xe1 => 0x3121,
+    0xe2 => 0x3122, 0xe3 => 0x3123, 0xe4 => 0x3124, 0xe5 => 0x3125,
+    0xe6 => 0x3126, 0xe7 => 0x3127, 0xe8 => 0x3128, 0xe9 => 0x3129,
+  },
+  0xa9 => {
+    0xa4 => 0x2500, 0xa5 => 0x2501, 0xa6 => 0x2502, 0xa7 => 0x2503,
+    0xa8 => 0x2504, 0xa9 => 0x2505, 0xaa => 0x2506, 0xab => 0x2507,
+    0xac => 0x2508, 0xad => 0x2509, 0xae => 0x250a, 0xaf => 0x250b,
+    0xb0 => 0x250c, 0xb1 => 0x250d, 0xb2 => 0x250e, 0xb3 => 0x250f,
+    0xb4 => 0x2510, 0xb5 => 0x2511, 0xb6 => 0x2512, 0xb7 => 0x2513,
+    0xb8 => 0x2514, 0xb9 => 0x2515, 0xba => 0x2516, 0xbb => 0x2517,
+    0xbc => 0x2518, 0xbd => 0x2519, 0xbe => 0x251a, 0xbf => 0x251b,
+    0xc0 => 0x251c, 0xc1 => 0x251d, 0xc2 => 0x251e, 0xc3 => 0x251f,
+    0xc4 => 0x2520, 0xc5 => 0x2521, 0xc6 => 0x2522, 0xc7 => 0x2523,
+    0xc8 => 0x2524, 0xc9 => 0x2525, 0xca => 0x2526, 0xcb => 0x2527,
+    0xcc => 0x2528, 0xcd => 0x2529, 0xce => 0x252a, 0xcf => 0x252b,
+    0xd0 => 0x252c, 0xd1 => 0x252d, 0xd2 => 0x252e, 0xd3 => 0x252f,
+    0xd4 => 0x2530, 0xd5 => 0x2531, 0xd6 => 0x2532, 0xd7 => 0x2533,
+    0xd8 => 0x2534, 0xd9 => 0x2535, 0xda => 0x2536, 0xdb => 0x2537,
+    0xdc => 0x2538, 0xdd => 0x2539, 0xde => 0x253a, 0xdf => 0x253b,
+    0xe0 => 0x253c, 0xe1 => 0x253d, 0xe2 => 0x253e, 0xe3 => 0x253f,
+    0xe4 => 0x2540, 0xe5 => 0x2541, 0xe6 => 0x2542, 0xe7 => 0x2543,
+    0xe8 => 0x2544, 0xe9 => 0x2545, 0xea => 0x2546, 0xeb => 0x2547,
+    0xec => 0x2548, 0xed => 0x2549, 0xee => 0x254a, 0xef => 0x254b,
+  },
+  0xb0 => {
+    0xa1 => 0x554a, 0xa2 => 0x963f, 0xa3 => 0x57c3, 0xa4 => 0x6328,
+    0xa5 => 0x54ce, 0xa6 => 0x5509, 0xa7 => 0x54c0, 0xa8 => 0x7691,
+    0xa9 => 0x764c, 0xaa => 0x853c, 0xab => 0x77ee, 0xac => 0x827e,
+    0xad => 0x788d, 0xae => 0x7231, 0xaf => 0x9698, 0xb0 => 0x978d,
+    0xb1 => 0x6c28, 0xb2 => 0x5b89, 0xb3 => 0x4ffa, 0xb4 => 0x6309,
+    0xb5 => 0x6697, 0xb6 => 0x5cb8, 0xb7 => 0x80fa, 0xb8 => 0x6848,
+    0xb9 => 0x80ae, 0xba => 0x6602, 0xbb => 0x76ce, 0xbc => 0x51f9,
+    0xbd => 0x6556, 0xbe => 0x71ac, 0xbf => 0x7ff1, 0xc0 => 0x8884,
+    0xc1 => 0x50b2, 0xc2 => 0x5965, 0xc3 => 0x61ca, 0xc4 => 0x6fb3,
+    0xc5 => 0x82ad, 0xc6 => 0x634c, 0xc7 => 0x6252, 0xc8 => 0x53ed,
+    0xc9 => 0x5427, 0xca => 0x7b06, 0xcb => 0x516b, 0xcc => 0x75a4,
+    0xcd => 0x5df4, 0xce => 0x62d4, 0xcf => 0x8dcb, 0xd0 => 0x9776,
+    0xd1 => 0x628a, 0xd2 => 0x8019, 0xd3 => 0x575d, 0xd4 => 0x9738,
+    0xd5 => 0x7f62, 0xd6 => 0x7238, 0xd7 => 0x767d, 0xd8 => 0x67cf,
+    0xd9 => 0x767e, 0xda => 0x6446, 0xdb => 0x4f70, 0xdc => 0x8d25,
+    0xdd => 0x62dc, 0xde => 0x7a17, 0xdf => 0x6591, 0xe0 => 0x73ed,
+    0xe1 => 0x642c, 0xe2 => 0x6273, 0xe3 => 0x822c, 0xe4 => 0x9881,
+    0xe5 => 0x677f, 0xe6 => 0x7248, 0xe7 => 0x626e, 0xe8 => 0x62cc,
+    0xe9 => 0x4f34, 0xea => 0x74e3, 0xeb => 0x534a, 0xec => 0x529e,
+    0xed => 0x7eca, 0xee => 0x90a6, 0xef => 0x5e2e, 0xf0 => 0x6886,
+    0xf1 => 0x699c, 0xf2 => 0x8180, 0xf3 => 0x7ed1, 0xf4 => 0x68d2,
+    0xf5 => 0x78c5, 0xf6 => 0x868c, 0xf7 => 0x9551, 0xf8 => 0x508d,
+    0xf9 => 0x8c24, 0xfa => 0x82de, 0xfb => 0x80de, 0xfc => 0x5305,
+    0xfd => 0x8912, 0xfe => 0x5265,
+  },
+  0xb1 => {
+    0xa1 => 0x8584, 0xa2 => 0x96f9, 0xa3 => 0x4fdd, 0xa4 => 0x5821,
+    0xa5 => 0x9971, 0xa6 => 0x5b9d, 0xa7 => 0x62b1, 0xa8 => 0x62a5,
+    0xa9 => 0x66b4, 0xaa => 0x8c79, 0xab => 0x9c8d, 0xac => 0x7206,
+    0xad => 0x676f, 0xae => 0x7891, 0xaf => 0x60b2, 0xb0 => 0x5351,
+    0xb1 => 0x5317, 0xb2 => 0x8f88, 0xb3 => 0x80cc, 0xb4 => 0x8d1d,
+    0xb5 => 0x94a1, 0xb6 => 0x500d, 0xb7 => 0x72c8, 0xb8 => 0x5907,
+    0xb9 => 0x60eb, 0xba => 0x7119, 0xbb => 0x88ab, 0xbc => 0x5954,
+    0xbd => 0x82ef, 0xbe => 0x672c, 0xbf => 0x7b28, 0xc0 => 0x5d29,
+    0xc1 => 0x7ef7, 0xc2 => 0x752d, 0xc3 => 0x6cf5, 0xc4 => 0x8e66,
+    0xc5 => 0x8ff8, 0xc6 => 0x903c, 0xc7 => 0x9f3b, 0xc8 => 0x6bd4,
+    0xc9 => 0x9119, 0xca => 0x7b14, 0xcb => 0x5f7c, 0xcc => 0x78a7,
+    0xcd => 0x84d6, 0xce => 0x853d, 0xcf => 0x6bd5, 0xd0 => 0x6bd9,
+    0xd1 => 0x6bd6, 0xd2 => 0x5e01, 0xd3 => 0x5e87, 0xd4 => 0x75f9,
+    0xd5 => 0x95ed, 0xd6 => 0x655d, 0xd7 => 0x5f0a, 0xd8 => 0x5fc5,
+    0xd9 => 0x8f9f, 0xda => 0x58c1, 0xdb => 0x81c2, 0xdc => 0x907f,
+    0xdd => 0x965b, 0xde => 0x97ad, 0xdf => 0x8fb9, 0xe0 => 0x7f16,
+    0xe1 => 0x8d2c, 0xe2 => 0x6241, 0xe3 => 0x4fbf, 0xe4 => 0x53d8,
+    0xe5 => 0x535e, 0xe6 => 0x8fa8, 0xe7 => 0x8fa9, 0xe8 => 0x8fab,
+    0xe9 => 0x904d, 0xea => 0x6807, 0xeb => 0x5f6a, 0xec => 0x8198,
+    0xed => 0x8868, 0xee => 0x9cd6, 0xef => 0x618b, 0xf0 => 0x522b,
+    0xf1 => 0x762a, 0xf2 => 0x5f6c, 0xf3 => 0x658c, 0xf4 => 0x6fd2,
+    0xf5 => 0x6ee8, 0xf6 => 0x5bbe, 0xf7 => 0x6448, 0xf8 => 0x5175,
+    0xf9 => 0x51b0, 0xfa => 0x67c4, 0xfb => 0x4e19, 0xfc => 0x79c9,
+    0xfd => 0x997c, 0xfe => 0x70b3,
+  },
+  0xb2 => {
+    0xa1 => 0x75c5, 0xa2 => 0x5e76, 0xa3 => 0x73bb, 0xa4 => 0x83e0,
+    0xa5 => 0x64ad, 0xa6 => 0x62e8, 0xa7 => 0x94b5, 0xa8 => 0x6ce2,
+    0xa9 => 0x535a, 0xaa => 0x52c3, 0xab => 0x640f, 0xac => 0x94c2,
+    0xad => 0x7b94, 0xae => 0x4f2f, 0xaf => 0x5e1b, 0xb0 => 0x8236,
+    0xb1 => 0x8116, 0xb2 => 0x818a, 0xb3 => 0x6e24, 0xb4 => 0x6cca,
+    0xb5 => 0x9a73, 0xb6 => 0x6355, 0xb7 => 0x535c, 0xb8 => 0x54fa,
+    0xb9 => 0x8865, 0xba => 0x57e0, 0xbb => 0x4e0d, 0xbc => 0x5e03,
+    0xbd => 0x6b65, 0xbe => 0x7c3f, 0xbf => 0x90e8, 0xc0 => 0x6016,
+    0xc1 => 0x64e6, 0xc2 => 0x731c, 0xc3 => 0x88c1, 0xc4 => 0x6750,
+    0xc5 => 0x624d, 0xc6 => 0x8d22, 0xc7 => 0x776c, 0xc8 => 0x8e29,
+    0xc9 => 0x91c7, 0xca => 0x5f69, 0xcb => 0x83dc, 0xcc => 0x8521,
+    0xcd => 0x9910, 0xce => 0x53c2, 0xcf => 0x8695, 0xd0 => 0x6b8b,
+    0xd1 => 0x60ed, 0xd2 => 0x60e8, 0xd3 => 0x707f, 0xd4 => 0x82cd,
+    0xd5 => 0x8231, 0xd6 => 0x4ed3, 0xd7 => 0x6ca7, 0xd8 => 0x85cf,
+    0xd9 => 0x64cd, 0xda => 0x7cd9, 0xdb => 0x69fd, 0xdc => 0x66f9,
+    0xdd => 0x8349, 0xde => 0x5395, 0xdf => 0x7b56, 0xe0 => 0x4fa7,
+    0xe1 => 0x518c, 0xe2 => 0x6d4b, 0xe3 => 0x5c42, 0xe4 => 0x8e6d,
+    0xe5 => 0x63d2, 0xe6 => 0x53c9, 0xe7 => 0x832c, 0xe8 => 0x8336,
+    0xe9 => 0x67e5, 0xea => 0x78b4, 0xeb => 0x643d, 0xec => 0x5bdf,
+    0xed => 0x5c94, 0xee => 0x5dee, 0xef => 0x8be7, 0xf0 => 0x62c6,
+    0xf1 => 0x67f4, 0xf2 => 0x8c7a, 0xf3 => 0x6400, 0xf4 => 0x63ba,
+    0xf5 => 0x8749, 0xf6 => 0x998b, 0xf7 => 0x8c17, 0xf8 => 0x7f20,
+    0xf9 => 0x94f2, 0xfa => 0x4ea7, 0xfb => 0x9610, 0xfc => 0x98a4,
+    0xfd => 0x660c, 0xfe => 0x7316,
+  },
+  0xb3 => {
+    0xa1 => 0x573a, 0xa2 => 0x5c1d, 0xa3 => 0x5e38, 0xa4 => 0x957f,
+    0xa5 => 0x507f, 0xa6 => 0x80a0, 0xa7 => 0x5382, 0xa8 => 0x655e,
+    0xa9 => 0x7545, 0xaa => 0x5531, 0xab => 0x5021, 0xac => 0x8d85,
+    0xad => 0x6284, 0xae => 0x949e, 0xaf => 0x671d, 0xb0 => 0x5632,
+    0xb1 => 0x6f6e, 0xb2 => 0x5de2, 0xb3 => 0x5435, 0xb4 => 0x7092,
+    0xb5 => 0x8f66, 0xb6 => 0x626f, 0xb7 => 0x64a4, 0xb8 => 0x63a3,
+    0xb9 => 0x5f7b, 0xba => 0x6f88, 0xbb => 0x90f4, 0xbc => 0x81e3,
+    0xbd => 0x8fb0, 0xbe => 0x5c18, 0xbf => 0x6668, 0xc0 => 0x5ff1,
+    0xc1 => 0x6c89, 0xc2 => 0x9648, 0xc3 => 0x8d81, 0xc4 => 0x886c,
+    0xc5 => 0x6491, 0xc6 => 0x79f0, 0xc7 => 0x57ce, 0xc8 => 0x6a59,
+    0xc9 => 0x6210, 0xca => 0x5448, 0xcb => 0x4e58, 0xcc => 0x7a0b,
+    0xcd => 0x60e9, 0xce => 0x6f84, 0xcf => 0x8bda, 0xd0 => 0x627f,
+    0xd1 => 0x901e, 0xd2 => 0x9a8b, 0xd3 => 0x79e4, 0xd4 => 0x5403,
+    0xd5 => 0x75f4, 0xd6 => 0x6301, 0xd7 => 0x5319, 0xd8 => 0x6c60,
+    0xd9 => 0x8fdf, 0xda => 0x5f1b, 0xdb => 0x9a70, 0xdc => 0x803b,
+    0xdd => 0x9f7f, 0xde => 0x4f88, 0xdf => 0x5c3a, 0xe0 => 0x8d64,
+    0xe1 => 0x7fc5, 0xe2 => 0x65a5, 0xe3 => 0x70bd, 0xe4 => 0x5145,
+    0xe5 => 0x51b2, 0xe6 => 0x866b, 0xe7 => 0x5d07, 0xe8 => 0x5ba0,
+    0xe9 => 0x62bd, 0xea => 0x916c, 0xeb => 0x7574, 0xec => 0x8e0c,
+    0xed => 0x7a20, 0xee => 0x6101, 0xef => 0x7b79, 0xf0 => 0x4ec7,
+    0xf1 => 0x7ef8, 0xf2 => 0x7785, 0xf3 => 0x4e11, 0xf4 => 0x81ed,
+    0xf5 => 0x521d, 0xf6 => 0x51fa, 0xf7 => 0x6a71, 0xf8 => 0x53a8,
+    0xf9 => 0x8e87, 0xfa => 0x9504, 0xfb => 0x96cf, 0xfc => 0x6ec1,
+    0xfd => 0x9664, 0xfe => 0x695a,
+  },
+  0xb4 => {
+    0xa1 => 0x7840, 0xa2 => 0x50a8, 0xa3 => 0x77d7, 0xa4 => 0x6410,
+    0xa5 => 0x89e6, 0xa6 => 0x5904, 0xa7 => 0x63e3, 0xa8 => 0x5ddd,
+    0xa9 => 0x7a7f, 0xaa => 0x693d, 0xab => 0x4f20, 0xac => 0x8239,
+    0xad => 0x5598, 0xae => 0x4e32, 0xaf => 0x75ae, 0xb0 => 0x7a97,
+    0xb1 => 0x5e62, 0xb2 => 0x5e8a, 0xb3 => 0x95ef, 0xb4 => 0x521b,
+    0xb5 => 0x5439, 0xb6 => 0x708a, 0xb7 => 0x6376, 0xb8 => 0x9524,
+    0xb9 => 0x5782, 0xba => 0x6625, 0xbb => 0x693f, 0xbc => 0x9187,
+    0xbd => 0x5507, 0xbe => 0x6df3, 0xbf => 0x7eaf, 0xc0 => 0x8822,
+    0xc1 => 0x6233, 0xc2 => 0x7ef0, 0xc3 => 0x75b5, 0xc4 => 0x8328,
+    0xc5 => 0x78c1, 0xc6 => 0x96cc, 0xc7 => 0x8f9e, 0xc8 => 0x6148,
+    0xc9 => 0x74f7, 0xca => 0x8bcd, 0xcb => 0x6b64, 0xcc => 0x523a,
+    0xcd => 0x8d50, 0xce => 0x6b21, 0xcf => 0x806a, 0xd0 => 0x8471,
+    0xd1 => 0x56f1, 0xd2 => 0x5306, 0xd3 => 0x4ece, 0xd4 => 0x4e1b,
+    0xd5 => 0x51d1, 0xd6 => 0x7c97, 0xd7 => 0x918b, 0xd8 => 0x7c07,
+    0xd9 => 0x4fc3, 0xda => 0x8e7f, 0xdb => 0x7be1, 0xdc => 0x7a9c,
+    0xdd => 0x6467, 0xde => 0x5d14, 0xdf => 0x50ac, 0xe0 => 0x8106,
+    0xe1 => 0x7601, 0xe2 => 0x7cb9, 0xe3 => 0x6dec, 0xe4 => 0x7fe0,
+    0xe5 => 0x6751, 0xe6 => 0x5b58, 0xe7 => 0x5bf8, 0xe8 => 0x78cb,
+    0xe9 => 0x64ae, 0xea => 0x6413, 0xeb => 0x63aa, 0xec => 0x632b,
+    0xed => 0x9519, 0xee => 0x642d, 0xef => 0x8fbe, 0xf0 => 0x7b54,
+    0xf1 => 0x7629, 0xf2 => 0x6253, 0xf3 => 0x5927, 0xf4 => 0x5446,
+    0xf5 => 0x6b79, 0xf6 => 0x50a3, 0xf7 => 0x6234, 0xf8 => 0x5e26,
+    0xf9 => 0x6b86, 0xfa => 0x4ee3, 0xfb => 0x8d37, 0xfc => 0x888b,
+    0xfd => 0x5f85, 0xfe => 0x902e,
+  },
+  0xb5 => {
+    0xa1 => 0x6020, 0xa2 => 0x803d, 0xa3 => 0x62c5, 0xa4 => 0x4e39,
+    0xa5 => 0x5355, 0xa6 => 0x90f8, 0xa7 => 0x63b8, 0xa8 => 0x80c6,
+    0xa9 => 0x65e6, 0xaa => 0x6c2e, 0xab => 0x4f46, 0xac => 0x60ee,
+    0xad => 0x6de1, 0xae => 0x8bde, 0xaf => 0x5f39, 0xb0 => 0x86cb,
+    0xb1 => 0x5f53, 0xb2 => 0x6321, 0xb3 => 0x515a, 0xb4 => 0x8361,
+    0xb5 => 0x6863, 0xb6 => 0x5200, 0xb7 => 0x6363, 0xb8 => 0x8e48,
+    0xb9 => 0x5012, 0xba => 0x5c9b, 0xbb => 0x7977, 0xbc => 0x5bfc,
+    0xbd => 0x5230, 0xbe => 0x7a3b, 0xbf => 0x60bc, 0xc0 => 0x9053,
+    0xc1 => 0x76d7, 0xc2 => 0x5fb7, 0xc3 => 0x5f97, 0xc4 => 0x7684,
+    0xc5 => 0x8e6c, 0xc6 => 0x706f, 0xc7 => 0x767b, 0xc8 => 0x7b49,
+    0xc9 => 0x77aa, 0xca => 0x51f3, 0xcb => 0x9093, 0xcc => 0x5824,
+    0xcd => 0x4f4e, 0xce => 0x6ef4, 0xcf => 0x8fea, 0xd0 => 0x654c,
+    0xd1 => 0x7b1b, 0xd2 => 0x72c4, 0xd3 => 0x6da4, 0xd4 => 0x7fdf,
+    0xd5 => 0x5ae1, 0xd6 => 0x62b5, 0xd7 => 0x5e95, 0xd8 => 0x5730,
+    0xd9 => 0x8482, 0xda => 0x7b2c, 0xdb => 0x5e1d, 0xdc => 0x5f1f,
+    0xdd => 0x9012, 0xde => 0x7f14, 0xdf => 0x98a0, 0xe0 => 0x6382,
+    0xe1 => 0x6ec7, 0xe2 => 0x7898, 0xe3 => 0x70b9, 0xe4 => 0x5178,
+    0xe5 => 0x975b, 0xe6 => 0x57ab, 0xe7 => 0x7535, 0xe8 => 0x4f43,
+    0xe9 => 0x7538, 0xea => 0x5e97, 0xeb => 0x60e6, 0xec => 0x5960,
+    0xed => 0x6dc0, 0xee => 0x6bbf, 0xef => 0x7889, 0xf0 => 0x53fc,
+    0xf1 => 0x96d5, 0xf2 => 0x51cb, 0xf3 => 0x5201, 0xf4 => 0x6389,
+    0xf5 => 0x540a, 0xf6 => 0x9493, 0xf7 => 0x8c03, 0xf8 => 0x8dcc,
+    0xf9 => 0x7239, 0xfa => 0x789f, 0xfb => 0x8776, 0xfc => 0x8fed,
+    0xfd => 0x8c0d, 0xfe => 0x53e0,
+  },
+  0xb6 => {
+    0xa1 => 0x4e01, 0xa2 => 0x76ef, 0xa3 => 0x53ee, 0xa4 => 0x9489,
+    0xa5 => 0x9876, 0xa6 => 0x9f0e, 0xa7 => 0x952d, 0xa8 => 0x5b9a,
+    0xa9 => 0x8ba2, 0xaa => 0x4e22, 0xab => 0x4e1c, 0xac => 0x51ac,
+    0xad => 0x8463, 0xae => 0x61c2, 0xaf => 0x52a8, 0xb0 => 0x680b,
+    0xb1 => 0x4f97, 0xb2 => 0x606b, 0xb3 => 0x51bb, 0xb4 => 0x6d1e,
+    0xb5 => 0x515c, 0xb6 => 0x6296, 0xb7 => 0x6597, 0xb8 => 0x9661,
+    0xb9 => 0x8c46, 0xba => 0x9017, 0xbb => 0x75d8, 0xbc => 0x90fd,
+    0xbd => 0x7763, 0xbe => 0x6bd2, 0xbf => 0x728a, 0xc0 => 0x72ec,
+    0xc1 => 0x8bfb, 0xc2 => 0x5835, 0xc3 => 0x7779, 0xc4 => 0x8d4c,
+    0xc5 => 0x675c, 0xc6 => 0x9540, 0xc7 => 0x809a, 0xc8 => 0x5ea6,
+    0xc9 => 0x6e21, 0xca => 0x5992, 0xcb => 0x7aef, 0xcc => 0x77ed,
+    0xcd => 0x953b, 0xce => 0x6bb5, 0xcf => 0x65ad, 0xd0 => 0x7f0e,
+    0xd1 => 0x5806, 0xd2 => 0x5151, 0xd3 => 0x961f, 0xd4 => 0x5bf9,
+    0xd5 => 0x58a9, 0xd6 => 0x5428, 0xd7 => 0x8e72, 0xd8 => 0x6566,
+    0xd9 => 0x987f, 0xda => 0x56e4, 0xdb => 0x949d, 0xdc => 0x76fe,
+    0xdd => 0x9041, 0xde => 0x6387, 0xdf => 0x54c6, 0xe0 => 0x591a,
+    0xe1 => 0x593a, 0xe2 => 0x579b, 0xe3 => 0x8eb2, 0xe4 => 0x6735,
+    0xe5 => 0x8dfa, 0xe6 => 0x8235, 0xe7 => 0x5241, 0xe8 => 0x60f0,
+    0xe9 => 0x5815, 0xea => 0x86fe, 0xeb => 0x5ce8, 0xec => 0x9e45,
+    0xed => 0x4fc4, 0xee => 0x989d, 0xef => 0x8bb9, 0xf0 => 0x5a25,
+    0xf1 => 0x6076, 0xf2 => 0x5384, 0xf3 => 0x627c, 0xf4 => 0x904f,
+    0xf5 => 0x9102, 0xf6 => 0x997f, 0xf7 => 0x6069, 0xf8 => 0x800c,
+    0xf9 => 0x513f, 0xfa => 0x8033, 0xfb => 0x5c14, 0xfc => 0x9975,
+    0xfd => 0x6d31, 0xfe => 0x4e8c,
+  },
+  0xb7 => {
+    0xa1 => 0x8d30, 0xa2 => 0x53d1, 0xa3 => 0x7f5a, 0xa4 => 0x7b4f,
+    0xa5 => 0x4f10, 0xa6 => 0x4e4f, 0xa7 => 0x9600, 0xa8 => 0x6cd5,
+    0xa9 => 0x73d0, 0xaa => 0x85e9, 0xab => 0x5e06, 0xac => 0x756a,
+    0xad => 0x7ffb, 0xae => 0x6a0a, 0xaf => 0x77fe, 0xb0 => 0x9492,
+    0xb1 => 0x7e41, 0xb2 => 0x51e1, 0xb3 => 0x70e6, 0xb4 => 0x53cd,
+    0xb5 => 0x8fd4, 0xb6 => 0x8303, 0xb7 => 0x8d29, 0xb8 => 0x72af,
+    0xb9 => 0x996d, 0xba => 0x6cdb, 0xbb => 0x574a, 0xbc => 0x82b3,
+    0xbd => 0x65b9, 0xbe => 0x80aa, 0xbf => 0x623f, 0xc0 => 0x9632,
+    0xc1 => 0x59a8, 0xc2 => 0x4eff, 0xc3 => 0x8bbf, 0xc4 => 0x7eba,
+    0xc5 => 0x653e, 0xc6 => 0x83f2, 0xc7 => 0x975e, 0xc8 => 0x5561,
+    0xc9 => 0x98de, 0xca => 0x80a5, 0xcb => 0x532a, 0xcc => 0x8bfd,
+    0xcd => 0x5420, 0xce => 0x80ba, 0xcf => 0x5e9f, 0xd0 => 0x6cb8,
+    0xd1 => 0x8d39, 0xd2 => 0x82ac, 0xd3 => 0x915a, 0xd4 => 0x5429,
+    0xd5 => 0x6c1b, 0xd6 => 0x5206, 0xd7 => 0x7eb7, 0xd8 => 0x575f,
+    0xd9 => 0x711a, 0xda => 0x6c7e, 0xdb => 0x7c89, 0xdc => 0x594b,
+    0xdd => 0x4efd, 0xde => 0x5fff, 0xdf => 0x6124, 0xe0 => 0x7caa,
+    0xe1 => 0x4e30, 0xe2 => 0x5c01, 0xe3 => 0x67ab, 0xe4 => 0x8702,
+    0xe5 => 0x5cf0, 0xe6 => 0x950b, 0xe7 => 0x98ce, 0xe8 => 0x75af,
+    0xe9 => 0x70fd, 0xea => 0x9022, 0xeb => 0x51af, 0xec => 0x7f1d,
+    0xed => 0x8bbd, 0xee => 0x5949, 0xef => 0x51e4, 0xf0 => 0x4f5b,
+    0xf1 => 0x5426, 0xf2 => 0x592b, 0xf3 => 0x6577, 0xf4 => 0x80a4,
+    0xf5 => 0x5b75, 0xf6 => 0x6276, 0xf7 => 0x62c2, 0xf8 => 0x8f90,
+    0xf9 => 0x5e45, 0xfa => 0x6c1f, 0xfb => 0x7b26, 0xfc => 0x4f0f,
+    0xfd => 0x4fd8, 0xfe => 0x670d,
+  },
+  0xb8 => {
+    0xa1 => 0x6d6e, 0xa2 => 0x6daa, 0xa3 => 0x798f, 0xa4 => 0x88b1,
+    0xa5 => 0x5f17, 0xa6 => 0x752b, 0xa7 => 0x629a, 0xa8 => 0x8f85,
+    0xa9 => 0x4fef, 0xaa => 0x91dc, 0xab => 0x65a7, 0xac => 0x812f,
+    0xad => 0x8151, 0xae => 0x5e9c, 0xaf => 0x8150, 0xb0 => 0x8d74,
+    0xb1 => 0x526f, 0xb2 => 0x8986, 0xb3 => 0x8d4b, 0xb4 => 0x590d,
+    0xb5 => 0x5085, 0xb6 => 0x4ed8, 0xb7 => 0x961c, 0xb8 => 0x7236,
+    0xb9 => 0x8179, 0xba => 0x8d1f, 0xbb => 0x5bcc, 0xbc => 0x8ba3,
+    0xbd => 0x9644, 0xbe => 0x5987, 0xbf => 0x7f1a, 0xc0 => 0x5490,
+    0xc1 => 0x5676, 0xc2 => 0x560e, 0xc3 => 0x8be5, 0xc4 => 0x6539,
+    0xc5 => 0x6982, 0xc6 => 0x9499, 0xc7 => 0x76d6, 0xc8 => 0x6e89,
+    0xc9 => 0x5e72, 0xca => 0x7518, 0xcb => 0x6746, 0xcc => 0x67d1,
+    0xcd => 0x7aff, 0xce => 0x809d, 0xcf => 0x8d76, 0xd0 => 0x611f,
+    0xd1 => 0x79c6, 0xd2 => 0x6562, 0xd3 => 0x8d63, 0xd4 => 0x5188,
+    0xd5 => 0x521a, 0xd6 => 0x94a2, 0xd7 => 0x7f38, 0xd8 => 0x809b,
+    0xd9 => 0x7eb2, 0xda => 0x5c97, 0xdb => 0x6e2f, 0xdc => 0x6760,
+    0xdd => 0x7bd9, 0xde => 0x768b, 0xdf => 0x9ad8, 0xe0 => 0x818f,
+    0xe1 => 0x7f94, 0xe2 => 0x7cd5, 0xe3 => 0x641e, 0xe4 => 0x9550,
+    0xe5 => 0x7a3f, 0xe6 => 0x544a, 0xe7 => 0x54e5, 0xe8 => 0x6b4c,
+    0xe9 => 0x6401, 0xea => 0x6208, 0xeb => 0x9e3d, 0xec => 0x80f3,
+    0xed => 0x7599, 0xee => 0x5272, 0xef => 0x9769, 0xf0 => 0x845b,
+    0xf1 => 0x683c, 0xf2 => 0x86e4, 0xf3 => 0x9601, 0xf4 => 0x9694,
+    0xf5 => 0x94ec, 0xf6 => 0x4e2a, 0xf7 => 0x5404, 0xf8 => 0x7ed9,
+    0xf9 => 0x6839, 0xfa => 0x8ddf, 0xfb => 0x8015, 0xfc => 0x66f4,
+    0xfd => 0x5e9a, 0xfe => 0x7fb9,
+  },
+  0xb9 => {
+    0xa1 => 0x57c2, 0xa2 => 0x803f, 0xa3 => 0x6897, 0xa4 => 0x5de5,
+    0xa5 => 0x653b, 0xa6 => 0x529f, 0xa7 => 0x606d, 0xa8 => 0x9f9a,
+    0xa9 => 0x4f9b, 0xaa => 0x8eac, 0xab => 0x516c, 0xac => 0x5bab,
+    0xad => 0x5f13, 0xae => 0x5de9, 0xaf => 0x6c5e, 0xb0 => 0x62f1,
+    0xb1 => 0x8d21, 0xb2 => 0x5171, 0xb3 => 0x94a9, 0xb4 => 0x52fe,
+    0xb5 => 0x6c9f, 0xb6 => 0x82df, 0xb7 => 0x72d7, 0xb8 => 0x57a2,
+    0xb9 => 0x6784, 0xba => 0x8d2d, 0xbb => 0x591f, 0xbc => 0x8f9c,
+    0xbd => 0x83c7, 0xbe => 0x5495, 0xbf => 0x7b8d, 0xc0 => 0x4f30,
+    0xc1 => 0x6cbd, 0xc2 => 0x5b64, 0xc3 => 0x59d1, 0xc4 => 0x9f13,
+    0xc5 => 0x53e4, 0xc6 => 0x86ca, 0xc7 => 0x9aa8, 0xc8 => 0x8c37,
+    0xc9 => 0x80a1, 0xca => 0x6545, 0xcb => 0x987e, 0xcc => 0x56fa,
+    0xcd => 0x96c7, 0xce => 0x522e, 0xcf => 0x74dc, 0xd0 => 0x5250,
+    0xd1 => 0x5be1, 0xd2 => 0x6302, 0xd3 => 0x8902, 0xd4 => 0x4e56,
+    0xd5 => 0x62d0, 0xd6 => 0x602a, 0xd7 => 0x68fa, 0xd8 => 0x5173,
+    0xd9 => 0x5b98, 0xda => 0x51a0, 0xdb => 0x89c2, 0xdc => 0x7ba1,
+    0xdd => 0x9986, 0xde => 0x7f50, 0xdf => 0x60ef, 0xe0 => 0x704c,
+    0xe1 => 0x8d2f, 0xe2 => 0x5149, 0xe3 => 0x5e7f, 0xe4 => 0x901b,
+    0xe5 => 0x7470, 0xe6 => 0x89c4, 0xe7 => 0x572d, 0xe8 => 0x7845,
+    0xe9 => 0x5f52, 0xea => 0x9f9f, 0xeb => 0x95fa, 0xec => 0x8f68,
+    0xed => 0x9b3c, 0xee => 0x8be1, 0xef => 0x7678, 0xf0 => 0x6842,
+    0xf1 => 0x67dc, 0xf2 => 0x8dea, 0xf3 => 0x8d35, 0xf4 => 0x523d,
+    0xf5 => 0x8f8a, 0xf6 => 0x6eda, 0xf7 => 0x68cd, 0xf8 => 0x9505,
+    0xf9 => 0x90ed, 0xfa => 0x56fd, 0xfb => 0x679c, 0xfc => 0x88f9,
+    0xfd => 0x8fc7, 0xfe => 0x54c8,
+  },
+  0xba => {
+    0xa1 => 0x9ab8, 0xa2 => 0x5b69, 0xa3 => 0x6d77, 0xa4 => 0x6c26,
+    0xa5 => 0x4ea5, 0xa6 => 0x5bb3, 0xa7 => 0x9a87, 0xa8 => 0x9163,
+    0xa9 => 0x61a8, 0xaa => 0x90af, 0xab => 0x97e9, 0xac => 0x542b,
+    0xad => 0x6db5, 0xae => 0x5bd2, 0xaf => 0x51fd, 0xb0 => 0x558a,
+    0xb1 => 0x7f55, 0xb2 => 0x7ff0, 0xb3 => 0x64bc, 0xb4 => 0x634d,
+    0xb5 => 0x65f1, 0xb6 => 0x61be, 0xb7 => 0x608d, 0xb8 => 0x710a,
+    0xb9 => 0x6c57, 0xba => 0x6c49, 0xbb => 0x592f, 0xbc => 0x676d,
+    0xbd => 0x822a, 0xbe => 0x58d5, 0xbf => 0x568e, 0xc0 => 0x8c6a,
+    0xc1 => 0x6beb, 0xc2 => 0x90dd, 0xc3 => 0x597d, 0xc4 => 0x8017,
+    0xc5 => 0x53f7, 0xc6 => 0x6d69, 0xc7 => 0x5475, 0xc8 => 0x559d,
+    0xc9 => 0x8377, 0xca => 0x83cf, 0xcb => 0x6838, 0xcc => 0x79be,
+    0xcd => 0x548c, 0xce => 0x4f55, 0xcf => 0x5408, 0xd0 => 0x76d2,
+    0xd1 => 0x8c89, 0xd2 => 0x9602, 0xd3 => 0x6cb3, 0xd4 => 0x6db8,
+    0xd5 => 0x8d6b, 0xd6 => 0x8910, 0xd7 => 0x9e64, 0xd8 => 0x8d3a,
+    0xd9 => 0x563f, 0xda => 0x9ed1, 0xdb => 0x75d5, 0xdc => 0x5f88,
+    0xdd => 0x72e0, 0xde => 0x6068, 0xdf => 0x54fc, 0xe0 => 0x4ea8,
+    0xe1 => 0x6a2a, 0xe2 => 0x8861, 0xe3 => 0x6052, 0xe4 => 0x8f70,
+    0xe5 => 0x54c4, 0xe6 => 0x70d8, 0xe7 => 0x8679, 0xe8 => 0x9e3f,
+    0xe9 => 0x6d2a, 0xea => 0x5b8f, 0xeb => 0x5f18, 0xec => 0x7ea2,
+    0xed => 0x5589, 0xee => 0x4faf, 0xef => 0x7334, 0xf0 => 0x543c,
+    0xf1 => 0x539a, 0xf2 => 0x5019, 0xf3 => 0x540e, 0xf4 => 0x547c,
+    0xf5 => 0x4e4e, 0xf6 => 0x5ffd, 0xf7 => 0x745a, 0xf8 => 0x58f6,
+    0xf9 => 0x846b, 0xfa => 0x80e1, 0xfb => 0x8774, 0xfc => 0x72d0,
+    0xfd => 0x7cca, 0xfe => 0x6e56,
+  },
+  0xbb => {
+    0xa1 => 0x5f27, 0xa2 => 0x864e, 0xa3 => 0x552c, 0xa4 => 0x62a4,
+    0xa5 => 0x4e92, 0xa6 => 0x6caa, 0xa7 => 0x6237, 0xa8 => 0x82b1,
+    0xa9 => 0x54d7, 0xaa => 0x534e, 0xab => 0x733e, 0xac => 0x6ed1,
+    0xad => 0x753b, 0xae => 0x5212, 0xaf => 0x5316, 0xb0 => 0x8bdd,
+    0xb1 => 0x69d0, 0xb2 => 0x5f8a, 0xb3 => 0x6000, 0xb4 => 0x6dee,
+    0xb5 => 0x574f, 0xb6 => 0x6b22, 0xb7 => 0x73af, 0xb8 => 0x6853,
+    0xb9 => 0x8fd8, 0xba => 0x7f13, 0xbb => 0x6362, 0xbc => 0x60a3,
+    0xbd => 0x5524, 0xbe => 0x75ea, 0xbf => 0x8c62, 0xc0 => 0x7115,
+    0xc1 => 0x6da3, 0xc2 => 0x5ba6, 0xc3 => 0x5e7b, 0xc4 => 0x8352,
+    0xc5 => 0x614c, 0xc6 => 0x9ec4, 0xc7 => 0x78fa, 0xc8 => 0x8757,
+    0xc9 => 0x7c27, 0xca => 0x7687, 0xcb => 0x51f0, 0xcc => 0x60f6,
+    0xcd => 0x714c, 0xce => 0x6643, 0xcf => 0x5e4c, 0xd0 => 0x604d,
+    0xd1 => 0x8c0e, 0xd2 => 0x7070, 0xd3 => 0x6325, 0xd4 => 0x8f89,
+    0xd5 => 0x5fbd, 0xd6 => 0x6062, 0xd7 => 0x86d4, 0xd8 => 0x56de,
+    0xd9 => 0x6bc1, 0xda => 0x6094, 0xdb => 0x6167, 0xdc => 0x5349,
+    0xdd => 0x60e0, 0xde => 0x6666, 0xdf => 0x8d3f, 0xe0 => 0x79fd,
+    0xe1 => 0x4f1a, 0xe2 => 0x70e9, 0xe3 => 0x6c47, 0xe4 => 0x8bb3,
+    0xe5 => 0x8bf2, 0xe6 => 0x7ed8, 0xe7 => 0x8364, 0xe8 => 0x660f,
+    0xe9 => 0x5a5a, 0xea => 0x9b42, 0xeb => 0x6d51, 0xec => 0x6df7,
+    0xed => 0x8c41, 0xee => 0x6d3b, 0xef => 0x4f19, 0xf0 => 0x706b,
+    0xf1 => 0x83b7, 0xf2 => 0x6216, 0xf3 => 0x60d1, 0xf4 => 0x970d,
+    0xf5 => 0x8d27, 0xf6 => 0x7978, 0xf7 => 0x51fb, 0xf8 => 0x573e,
+    0xf9 => 0x57fa, 0xfa => 0x673a, 0xfb => 0x7578, 0xfc => 0x7a3d,
+    0xfd => 0x79ef, 0xfe => 0x7b95,
+  },
+  0xbc => {
+    0xa1 => 0x808c, 0xa2 => 0x9965, 0xa3 => 0x8ff9, 0xa4 => 0x6fc0,
+    0xa5 => 0x8ba5, 0xa6 => 0x9e21, 0xa7 => 0x59ec, 0xa8 => 0x7ee9,
+    0xa9 => 0x7f09, 0xaa => 0x5409, 0xab => 0x6781, 0xac => 0x68d8,
+    0xad => 0x8f91, 0xae => 0x7c4d, 0xaf => 0x96c6, 0xb0 => 0x53ca,
+    0xb1 => 0x6025, 0xb2 => 0x75be, 0xb3 => 0x6c72, 0xb4 => 0x5373,
+    0xb5 => 0x5ac9, 0xb6 => 0x7ea7, 0xb7 => 0x6324, 0xb8 => 0x51e0,
+    0xb9 => 0x810a, 0xba => 0x5df1, 0xbb => 0x84df, 0xbc => 0x6280,
+    0xbd => 0x5180, 0xbe => 0x5b63, 0xbf => 0x4f0e, 0xc0 => 0x796d,
+    0xc1 => 0x5242, 0xc2 => 0x60b8, 0xc3 => 0x6d4e, 0xc4 => 0x5bc4,
+    0xc5 => 0x5bc2, 0xc6 => 0x8ba1, 0xc7 => 0x8bb0, 0xc8 => 0x65e2,
+    0xc9 => 0x5fcc, 0xca => 0x9645, 0xcb => 0x5993, 0xcc => 0x7ee7,
+    0xcd => 0x7eaa, 0xce => 0x5609, 0xcf => 0x67b7, 0xd0 => 0x5939,
+    0xd1 => 0x4f73, 0xd2 => 0x5bb6, 0xd3 => 0x52a0, 0xd4 => 0x835a,
+    0xd5 => 0x988a, 0xd6 => 0x8d3e, 0xd7 => 0x7532, 0xd8 => 0x94be,
+    0xd9 => 0x5047, 0xda => 0x7a3c, 0xdb => 0x4ef7, 0xdc => 0x67b6,
+    0xdd => 0x9a7e, 0xde => 0x5ac1, 0xdf => 0x6b7c, 0xe0 => 0x76d1,
+    0xe1 => 0x575a, 0xe2 => 0x5c16, 0xe3 => 0x7b3a, 0xe4 => 0x95f4,
+    0xe5 => 0x714e, 0xe6 => 0x517c, 0xe7 => 0x80a9, 0xe8 => 0x8270,
+    0xe9 => 0x5978, 0xea => 0x7f04, 0xeb => 0x8327, 0xec => 0x68c0,
+    0xed => 0x67ec, 0xee => 0x78b1, 0xef => 0x7877, 0xf0 => 0x62e3,
+    0xf1 => 0x6361, 0xf2 => 0x7b80, 0xf3 => 0x4fed, 0xf4 => 0x526a,
+    0xf5 => 0x51cf, 0xf6 => 0x8350, 0xf7 => 0x69db, 0xf8 => 0x9274,
+    0xf9 => 0x8df5, 0xfa => 0x8d31, 0xfb => 0x89c1, 0xfc => 0x952e,
+    0xfd => 0x7bad, 0xfe => 0x4ef6,
+  },
+  0xbd => {
+    0xa1 => 0x5065, 0xa2 => 0x8230, 0xa3 => 0x5251, 0xa4 => 0x996f,
+    0xa5 => 0x6e10, 0xa6 => 0x6e85, 0xa7 => 0x6da7, 0xa8 => 0x5efa,
+    0xa9 => 0x50f5, 0xaa => 0x59dc, 0xab => 0x5c06, 0xac => 0x6d46,
+    0xad => 0x6c5f, 0xae => 0x7586, 0xaf => 0x848b, 0xb0 => 0x6868,
+    0xb1 => 0x5956, 0xb2 => 0x8bb2, 0xb3 => 0x5320, 0xb4 => 0x9171,
+    0xb5 => 0x964d, 0xb6 => 0x8549, 0xb7 => 0x6912, 0xb8 => 0x7901,
+    0xb9 => 0x7126, 0xba => 0x80f6, 0xbb => 0x4ea4, 0xbc => 0x90ca,
+    0xbd => 0x6d47, 0xbe => 0x9a84, 0xbf => 0x5a07, 0xc0 => 0x56bc,
+    0xc1 => 0x6405, 0xc2 => 0x94f0, 0xc3 => 0x77eb, 0xc4 => 0x4fa5,
+    0xc5 => 0x811a, 0xc6 => 0x72e1, 0xc7 => 0x89d2, 0xc8 => 0x997a,
+    0xc9 => 0x7f34, 0xca => 0x7ede, 0xcb => 0x527f, 0xcc => 0x6559,
+    0xcd => 0x9175, 0xce => 0x8f7f, 0xcf => 0x8f83, 0xd0 => 0x53eb,
+    0xd1 => 0x7a96, 0xd2 => 0x63ed, 0xd3 => 0x63a5, 0xd4 => 0x7686,
+    0xd5 => 0x79f8, 0xd6 => 0x8857, 0xd7 => 0x9636, 0xd8 => 0x622a,
+    0xd9 => 0x52ab, 0xda => 0x8282, 0xdb => 0x6854, 0xdc => 0x6770,
+    0xdd => 0x6377, 0xde => 0x776b, 0xdf => 0x7aed, 0xe0 => 0x6d01,
+    0xe1 => 0x7ed3, 0xe2 => 0x89e3, 0xe3 => 0x59d0, 0xe4 => 0x6212,
+    0xe5 => 0x85c9, 0xe6 => 0x82a5, 0xe7 => 0x754c, 0xe8 => 0x501f,
+    0xe9 => 0x4ecb, 0xea => 0x75a5, 0xeb => 0x8beb, 0xec => 0x5c4a,
+    0xed => 0x5dfe, 0xee => 0x7b4b, 0xef => 0x65a4, 0xf0 => 0x91d1,
+    0xf1 => 0x4eca, 0xf2 => 0x6d25, 0xf3 => 0x895f, 0xf4 => 0x7d27,
+    0xf5 => 0x9526, 0xf6 => 0x4ec5, 0xf7 => 0x8c28, 0xf8 => 0x8fdb,
+    0xf9 => 0x9773, 0xfa => 0x664b, 0xfb => 0x7981, 0xfc => 0x8fd1,
+    0xfd => 0x70ec, 0xfe => 0x6d78,
+  },
+  0xbe => {
+    0xa1 => 0x5c3d, 0xa2 => 0x52b2, 0xa3 => 0x8346, 0xa4 => 0x5162,
+    0xa5 => 0x830e, 0xa6 => 0x775b, 0xa7 => 0x6676, 0xa8 => 0x9cb8,
+    0xa9 => 0x4eac, 0xaa => 0x60ca, 0xab => 0x7cbe, 0xac => 0x7cb3,
+    0xad => 0x7ecf, 0xae => 0x4e95, 0xaf => 0x8b66, 0xb0 => 0x666f,
+    0xb1 => 0x9888, 0xb2 => 0x9759, 0xb3 => 0x5883, 0xb4 => 0x656c,
+    0xb5 => 0x955c, 0xb6 => 0x5f84, 0xb7 => 0x75c9, 0xb8 => 0x9756,
+    0xb9 => 0x7adf, 0xba => 0x7ade, 0xbb => 0x51c0, 0xbc => 0x70af,
+    0xbd => 0x7a98, 0xbe => 0x63ea, 0xbf => 0x7a76, 0xc0 => 0x7ea0,
+    0xc1 => 0x7396, 0xc2 => 0x97ed, 0xc3 => 0x4e45, 0xc4 => 0x7078,
+    0xc5 => 0x4e5d, 0xc6 => 0x9152, 0xc7 => 0x53a9, 0xc8 => 0x6551,
+    0xc9 => 0x65e7, 0xca => 0x81fc, 0xcb => 0x8205, 0xcc => 0x548e,
+    0xcd => 0x5c31, 0xce => 0x759a, 0xcf => 0x97a0, 0xd0 => 0x62d8,
+    0xd1 => 0x72d9, 0xd2 => 0x75bd, 0xd3 => 0x5c45, 0xd4 => 0x9a79,
+    0xd5 => 0x83ca, 0xd6 => 0x5c40, 0xd7 => 0x5480, 0xd8 => 0x77e9,
+    0xd9 => 0x4e3e, 0xda => 0x6cae, 0xdb => 0x805a, 0xdc => 0x62d2,
+    0xdd => 0x636e, 0xde => 0x5de8, 0xdf => 0x5177, 0xe0 => 0x8ddd,
+    0xe1 => 0x8e1e, 0xe2 => 0x952f, 0xe3 => 0x4ff1, 0xe4 => 0x53e5,
+    0xe5 => 0x60e7, 0xe6 => 0x70ac, 0xe7 => 0x5267, 0xe8 => 0x6350,
+    0xe9 => 0x9e43, 0xea => 0x5a1f, 0xeb => 0x5026, 0xec => 0x7737,
+    0xed => 0x5377, 0xee => 0x7ee2, 0xef => 0x6485, 0xf0 => 0x652b,
+    0xf1 => 0x6289, 0xf2 => 0x6398, 0xf3 => 0x5014, 0xf4 => 0x7235,
+    0xf5 => 0x89c9, 0xf6 => 0x51b3, 0xf7 => 0x8bc0, 0xf8 => 0x7edd,
+    0xf9 => 0x5747, 0xfa => 0x83cc, 0xfb => 0x94a7, 0xfc => 0x519b,
+    0xfd => 0x541b, 0xfe => 0x5cfb,
+  },
+  0xbf => {
+    0xa1 => 0x4fca, 0xa2 => 0x7ae3, 0xa3 => 0x6d5a, 0xa4 => 0x90e1,
+    0xa5 => 0x9a8f, 0xa6 => 0x5580, 0xa7 => 0x5496, 0xa8 => 0x5361,
+    0xa9 => 0x54af, 0xaa => 0x5f00, 0xab => 0x63e9, 0xac => 0x6977,
+    0xad => 0x51ef, 0xae => 0x6168, 0xaf => 0x520a, 0xb0 => 0x582a,
+    0xb1 => 0x52d8, 0xb2 => 0x574e, 0xb3 => 0x780d, 0xb4 => 0x770b,
+    0xb5 => 0x5eb7, 0xb6 => 0x6177, 0xb7 => 0x7ce0, 0xb8 => 0x625b,
+    0xb9 => 0x6297, 0xba => 0x4ea2, 0xbb => 0x7095, 0xbc => 0x8003,
+    0xbd => 0x62f7, 0xbe => 0x70e4, 0xbf => 0x9760, 0xc0 => 0x5777,
+    0xc1 => 0x82db, 0xc2 => 0x67ef, 0xc3 => 0x68f5, 0xc4 => 0x78d5,
+    0xc5 => 0x9897, 0xc6 => 0x79d1, 0xc7 => 0x58f3, 0xc8 => 0x54b3,
+    0xc9 => 0x53ef, 0xca => 0x6e34, 0xcb => 0x514b, 0xcc => 0x523b,
+    0xcd => 0x5ba2, 0xce => 0x8bfe, 0xcf => 0x80af, 0xd0 => 0x5543,
+    0xd1 => 0x57a6, 0xd2 => 0x6073, 0xd3 => 0x5751, 0xd4 => 0x542d,
+    0xd5 => 0x7a7a, 0xd6 => 0x6050, 0xd7 => 0x5b54, 0xd8 => 0x63a7,
+    0xd9 => 0x62a0, 0xda => 0x53e3, 0xdb => 0x6263, 0xdc => 0x5bc7,
+    0xdd => 0x67af, 0xde => 0x54ed, 0xdf => 0x7a9f, 0xe0 => 0x82e6,
+    0xe1 => 0x9177, 0xe2 => 0x5e93, 0xe3 => 0x88e4, 0xe4 => 0x5938,
+    0xe5 => 0x57ae, 0xe6 => 0x630e, 0xe7 => 0x8de8, 0xe8 => 0x80ef,
+    0xe9 => 0x5757, 0xea => 0x7b77, 0xeb => 0x4fa9, 0xec => 0x5feb,
+    0xed => 0x5bbd, 0xee => 0x6b3e, 0xef => 0x5321, 0xf0 => 0x7b50,
+    0xf1 => 0x72c2, 0xf2 => 0x6846, 0xf3 => 0x77ff, 0xf4 => 0x7736,
+    0xf5 => 0x65f7, 0xf6 => 0x51b5, 0xf7 => 0x4e8f, 0xf8 => 0x76d4,
+    0xf9 => 0x5cbf, 0xfa => 0x7aa5, 0xfb => 0x8475, 0xfc => 0x594e,
+    0xfd => 0x9b41, 0xfe => 0x5080,
+  },
+  0xc0 => {
+    0xa1 => 0x9988, 0xa2 => 0x6127, 0xa3 => 0x6e83, 0xa4 => 0x5764,
+    0xa5 => 0x6606, 0xa6 => 0x6346, 0xa7 => 0x56f0, 0xa8 => 0x62ec,
+    0xa9 => 0x6269, 0xaa => 0x5ed3, 0xab => 0x9614, 0xac => 0x5783,
+    0xad => 0x62c9, 0xae => 0x5587, 0xaf => 0x8721, 0xb0 => 0x814a,
+    0xb1 => 0x8fa3, 0xb2 => 0x5566, 0xb3 => 0x83b1, 0xb4 => 0x6765,
+    0xb5 => 0x8d56, 0xb6 => 0x84dd, 0xb7 => 0x5a6a, 0xb8 => 0x680f,
+    0xb9 => 0x62e6, 0xba => 0x7bee, 0xbb => 0x9611, 0xbc => 0x5170,
+    0xbd => 0x6f9c, 0xbe => 0x8c30, 0xbf => 0x63fd, 0xc0 => 0x89c8,
+    0xc1 => 0x61d2, 0xc2 => 0x7f06, 0xc3 => 0x70c2, 0xc4 => 0x6ee5,
+    0xc5 => 0x7405, 0xc6 => 0x6994, 0xc7 => 0x72fc, 0xc8 => 0x5eca,
+    0xc9 => 0x90ce, 0xca => 0x6717, 0xcb => 0x6d6a, 0xcc => 0x635e,
+    0xcd => 0x52b3, 0xce => 0x7262, 0xcf => 0x8001, 0xd0 => 0x4f6c,
+    0xd1 => 0x59e5, 0xd2 => 0x916a, 0xd3 => 0x70d9, 0xd4 => 0x6d9d,
+    0xd5 => 0x52d2, 0xd6 => 0x4e50, 0xd7 => 0x96f7, 0xd8 => 0x956d,
+    0xd9 => 0x857e, 0xda => 0x78ca, 0xdb => 0x7d2f, 0xdc => 0x5121,
+    0xdd => 0x5792, 0xde => 0x64c2, 0xdf => 0x808b, 0xe0 => 0x7c7b,
+    0xe1 => 0x6cea, 0xe2 => 0x68f1, 0xe3 => 0x695e, 0xe4 => 0x51b7,
+    0xe5 => 0x5398, 0xe6 => 0x68a8, 0xe7 => 0x7281, 0xe8 => 0x9ece,
+    0xe9 => 0x7bf1, 0xea => 0x72f8, 0xeb => 0x79bb, 0xec => 0x6f13,
+    0xed => 0x7406, 0xee => 0x674e, 0xef => 0x91cc, 0xf0 => 0x9ca4,
+    0xf1 => 0x793c, 0xf2 => 0x8389, 0xf3 => 0x8354, 0xf4 => 0x540f,
+    0xf5 => 0x6817, 0xf6 => 0x4e3d, 0xf7 => 0x5389, 0xf8 => 0x52b1,
+    0xf9 => 0x783e, 0xfa => 0x5386, 0xfb => 0x5229, 0xfc => 0x5088,
+    0xfd => 0x4f8b, 0xfe => 0x4fd0,
+  },
+  0xc1 => {
+    0xa1 => 0x75e2, 0xa2 => 0x7acb, 0xa3 => 0x7c92, 0xa4 => 0x6ca5,
+    0xa5 => 0x96b6, 0xa6 => 0x529b, 0xa7 => 0x7483, 0xa8 => 0x54e9,
+    0xa9 => 0x4fe9, 0xaa => 0x8054, 0xab => 0x83b2, 0xac => 0x8fde,
+    0xad => 0x9570, 0xae => 0x5ec9, 0xaf => 0x601c, 0xb0 => 0x6d9f,
+    0xb1 => 0x5e18, 0xb2 => 0x655b, 0xb3 => 0x8138, 0xb4 => 0x94fe,
+    0xb5 => 0x604b, 0xb6 => 0x70bc, 0xb7 => 0x7ec3, 0xb8 => 0x7cae,
+    0xb9 => 0x51c9, 0xba => 0x6881, 0xbb => 0x7cb1, 0xbc => 0x826f,
+    0xbd => 0x4e24, 0xbe => 0x8f86, 0xbf => 0x91cf, 0xc0 => 0x667e,
+    0xc1 => 0x4eae, 0xc2 => 0x8c05, 0xc3 => 0x64a9, 0xc4 => 0x804a,
+    0xc5 => 0x50da, 0xc6 => 0x7597, 0xc7 => 0x71ce, 0xc8 => 0x5be5,
+    0xc9 => 0x8fbd, 0xca => 0x6f66, 0xcb => 0x4e86, 0xcc => 0x6482,
+    0xcd => 0x9563, 0xce => 0x5ed6, 0xcf => 0x6599, 0xd0 => 0x5217,
+    0xd1 => 0x88c2, 0xd2 => 0x70c8, 0xd3 => 0x52a3, 0xd4 => 0x730e,
+    0xd5 => 0x7433, 0xd6 => 0x6797, 0xd7 => 0x78f7, 0xd8 => 0x9716,
+    0xd9 => 0x4e34, 0xda => 0x90bb, 0xdb => 0x9cde, 0xdc => 0x6dcb,
+    0xdd => 0x51db, 0xde => 0x8d41, 0xdf => 0x541d, 0xe0 => 0x62ce,
+    0xe1 => 0x73b2, 0xe2 => 0x83f1, 0xe3 => 0x96f6, 0xe4 => 0x9f84,
+    0xe5 => 0x94c3, 0xe6 => 0x4f36, 0xe7 => 0x7f9a, 0xe8 => 0x51cc,
+    0xe9 => 0x7075, 0xea => 0x9675, 0xeb => 0x5cad, 0xec => 0x9886,
+    0xed => 0x53e6, 0xee => 0x4ee4, 0xef => 0x6e9c, 0xf0 => 0x7409,
+    0xf1 => 0x69b4, 0xf2 => 0x786b, 0xf3 => 0x998f, 0xf4 => 0x7559,
+    0xf5 => 0x5218, 0xf6 => 0x7624, 0xf7 => 0x6d41, 0xf8 => 0x67f3,
+    0xf9 => 0x516d, 0xfa => 0x9f99, 0xfb => 0x804b, 0xfc => 0x5499,
+    0xfd => 0x7b3c, 0xfe => 0x7abf,
+  },
+  0xc2 => {
+    0xa1 => 0x9686, 0xa2 => 0x5784, 0xa3 => 0x62e2, 0xa4 => 0x9647,
+    0xa5 => 0x697c, 0xa6 => 0x5a04, 0xa7 => 0x6402, 0xa8 => 0x7bd3,
+    0xa9 => 0x6f0f, 0xaa => 0x964b, 0xab => 0x82a6, 0xac => 0x5362,
+    0xad => 0x9885, 0xae => 0x5e90, 0xaf => 0x7089, 0xb0 => 0x63b3,
+    0xb1 => 0x5364, 0xb2 => 0x864f, 0xb3 => 0x9c81, 0xb4 => 0x9e93,
+    0xb5 => 0x788c, 0xb6 => 0x9732, 0xb7 => 0x8def, 0xb8 => 0x8d42,
+    0xb9 => 0x9e7f, 0xba => 0x6f5e, 0xbb => 0x7984, 0xbc => 0x5f55,
+    0xbd => 0x9646, 0xbe => 0x622e, 0xbf => 0x9a74, 0xc0 => 0x5415,
+    0xc1 => 0x94dd, 0xc2 => 0x4fa3, 0xc3 => 0x65c5, 0xc4 => 0x5c65,
+    0xc5 => 0x5c61, 0xc6 => 0x7f15, 0xc7 => 0x8651, 0xc8 => 0x6c2f,
+    0xc9 => 0x5f8b, 0xca => 0x7387, 0xcb => 0x6ee4, 0xcc => 0x7eff,
+    0xcd => 0x5ce6, 0xce => 0x631b, 0xcf => 0x5b6a, 0xd0 => 0x6ee6,
+    0xd1 => 0x5375, 0xd2 => 0x4e71, 0xd3 => 0x63a0, 0xd4 => 0x7565,
+    0xd5 => 0x62a1, 0xd6 => 0x8f6e, 0xd7 => 0x4f26, 0xd8 => 0x4ed1,
+    0xd9 => 0x6ca6, 0xda => 0x7eb6, 0xdb => 0x8bba, 0xdc => 0x841d,
+    0xdd => 0x87ba, 0xde => 0x7f57, 0xdf => 0x903b, 0xe0 => 0x9523,
+    0xe1 => 0x7ba9, 0xe2 => 0x9aa1, 0xe3 => 0x88f8, 0xe4 => 0x843d,
+    0xe5 => 0x6d1b, 0xe6 => 0x9a86, 0xe7 => 0x7edc, 0xe8 => 0x5988,
+    0xe9 => 0x9ebb, 0xea => 0x739b, 0xeb => 0x7801, 0xec => 0x8682,
+    0xed => 0x9a6c, 0xee => 0x9a82, 0xef => 0x561b, 0xf0 => 0x5417,
+    0xf1 => 0x57cb, 0xf2 => 0x4e70, 0xf3 => 0x9ea6, 0xf4 => 0x5356,
+    0xf5 => 0x8fc8, 0xf6 => 0x8109, 0xf7 => 0x7792, 0xf8 => 0x9992,
+    0xf9 => 0x86ee, 0xfa => 0x6ee1, 0xfb => 0x8513, 0xfc => 0x66fc,
+    0xfd => 0x6162, 0xfe => 0x6f2b,
+  },
+  0xc3 => {
+    0xa1 => 0x8c29, 0xa2 => 0x8292, 0xa3 => 0x832b, 0xa4 => 0x76f2,
+    0xa5 => 0x6c13, 0xa6 => 0x5fd9, 0xa7 => 0x83bd, 0xa8 => 0x732b,
+    0xa9 => 0x8305, 0xaa => 0x951a, 0xab => 0x6bdb, 0xac => 0x77db,
+    0xad => 0x94c6, 0xae => 0x536f, 0xaf => 0x8302, 0xb0 => 0x5192,
+    0xb1 => 0x5e3d, 0xb2 => 0x8c8c, 0xb3 => 0x8d38, 0xb4 => 0x4e48,
+    0xb5 => 0x73ab, 0xb6 => 0x679a, 0xb7 => 0x6885, 0xb8 => 0x9176,
+    0xb9 => 0x9709, 0xba => 0x7164, 0xbb => 0x6ca1, 0xbc => 0x7709,
+    0xbd => 0x5a92, 0xbe => 0x9541, 0xbf => 0x6bcf, 0xc0 => 0x7f8e,
+    0xc1 => 0x6627, 0xc2 => 0x5bd0, 0xc3 => 0x59b9, 0xc4 => 0x5a9a,
+    0xc5 => 0x95e8, 0xc6 => 0x95f7, 0xc7 => 0x4eec, 0xc8 => 0x840c,
+    0xc9 => 0x8499, 0xca => 0x6aac, 0xcb => 0x76df, 0xcc => 0x9530,
+    0xcd => 0x731b, 0xce => 0x68a6, 0xcf => 0x5b5f, 0xd0 => 0x772f,
+    0xd1 => 0x919a, 0xd2 => 0x9761, 0xd3 => 0x7cdc, 0xd4 => 0x8ff7,
+    0xd5 => 0x8c1c, 0xd6 => 0x5f25, 0xd7 => 0x7c73, 0xd8 => 0x79d8,
+    0xd9 => 0x89c5, 0xda => 0x6ccc, 0xdb => 0x871c, 0xdc => 0x5bc6,
+    0xdd => 0x5e42, 0xde => 0x68c9, 0xdf => 0x7720, 0xe0 => 0x7ef5,
+    0xe1 => 0x5195, 0xe2 => 0x514d, 0xe3 => 0x52c9, 0xe4 => 0x5a29,
+    0xe5 => 0x7f05, 0xe6 => 0x9762, 0xe7 => 0x82d7, 0xe8 => 0x63cf,
+    0xe9 => 0x7784, 0xea => 0x85d0, 0xeb => 0x79d2, 0xec => 0x6e3a,
+    0xed => 0x5e99, 0xee => 0x5999, 0xef => 0x8511, 0xf0 => 0x706d,
+    0xf1 => 0x6c11, 0xf2 => 0x62bf, 0xf3 => 0x76bf, 0xf4 => 0x654f,
+    0xf5 => 0x60af, 0xf6 => 0x95fd, 0xf7 => 0x660e, 0xf8 => 0x879f,
+    0xf9 => 0x9e23, 0xfa => 0x94ed, 0xfb => 0x540d, 0xfc => 0x547d,
+    0xfd => 0x8c2c, 0xfe => 0x6478,
+  },
+  0xc4 => {
+    0xa1 => 0x6479, 0xa2 => 0x8611, 0xa3 => 0x6a21, 0xa4 => 0x819c,
+    0xa5 => 0x78e8, 0xa6 => 0x6469, 0xa7 => 0x9b54, 0xa8 => 0x62b9,
+    0xa9 => 0x672b, 0xaa => 0x83ab, 0xab => 0x58a8, 0xac => 0x9ed8,
+    0xad => 0x6cab, 0xae => 0x6f20, 0xaf => 0x5bde, 0xb0 => 0x964c,
+    0xb1 => 0x8c0b, 0xb2 => 0x725f, 0xb3 => 0x67d0, 0xb4 => 0x62c7,
+    0xb5 => 0x7261, 0xb6 => 0x4ea9, 0xb7 => 0x59c6, 0xb8 => 0x6bcd,
+    0xb9 => 0x5893, 0xba => 0x66ae, 0xbb => 0x5e55, 0xbc => 0x52df,
+    0xbd => 0x6155, 0xbe => 0x6728, 0xbf => 0x76ee, 0xc0 => 0x7766,
+    0xc1 => 0x7267, 0xc2 => 0x7a46, 0xc3 => 0x62ff, 0xc4 => 0x54ea,
+    0xc5 => 0x5450, 0xc6 => 0x94a0, 0xc7 => 0x90a3, 0xc8 => 0x5a1c,
+    0xc9 => 0x7eb3, 0xca => 0x6c16, 0xcb => 0x4e43, 0xcc => 0x5976,
+    0xcd => 0x8010, 0xce => 0x5948, 0xcf => 0x5357, 0xd0 => 0x7537,
+    0xd1 => 0x96be, 0xd2 => 0x56ca, 0xd3 => 0x6320, 0xd4 => 0x8111,
+    0xd5 => 0x607c, 0xd6 => 0x95f9, 0xd7 => 0x6dd6, 0xd8 => 0x5462,
+    0xd9 => 0x9981, 0xda => 0x5185, 0xdb => 0x5ae9, 0xdc => 0x80fd,
+    0xdd => 0x59ae, 0xde => 0x9713, 0xdf => 0x502a, 0xe0 => 0x6ce5,
+    0xe1 => 0x5c3c, 0xe2 => 0x62df, 0xe3 => 0x4f60, 0xe4 => 0x533f,
+    0xe5 => 0x817b, 0xe6 => 0x9006, 0xe7 => 0x6eba, 0xe8 => 0x852b,
+    0xe9 => 0x62c8, 0xea => 0x5e74, 0xeb => 0x78be, 0xec => 0x64b5,
+    0xed => 0x637b, 0xee => 0x5ff5, 0xef => 0x5a18, 0xf0 => 0x917f,
+    0xf1 => 0x9e1f, 0xf2 => 0x5c3f, 0xf3 => 0x634f, 0xf4 => 0x8042,
+    0xf5 => 0x5b7d, 0xf6 => 0x556e, 0xf7 => 0x954a, 0xf8 => 0x954d,
+    0xf9 => 0x6d85, 0xfa => 0x60a8, 0xfb => 0x67e0, 0xfc => 0x72de,
+    0xfd => 0x51dd, 0xfe => 0x5b81,
+  },
+  0xc5 => {
+    0xa1 => 0x62e7, 0xa2 => 0x6cde, 0xa3 => 0x725b, 0xa4 => 0x626d,
+    0xa5 => 0x94ae, 0xa6 => 0x7ebd, 0xa7 => 0x8113, 0xa8 => 0x6d53,
+    0xa9 => 0x519c, 0xaa => 0x5f04, 0xab => 0x5974, 0xac => 0x52aa,
+    0xad => 0x6012, 0xae => 0x5973, 0xaf => 0x6696, 0xb0 => 0x8650,
+    0xb1 => 0x759f, 0xb2 => 0x632a, 0xb3 => 0x61e6, 0xb4 => 0x7cef,
+    0xb5 => 0x8bfa, 0xb6 => 0x54e6, 0xb7 => 0x6b27, 0xb8 => 0x9e25,
+    0xb9 => 0x6bb4, 0xba => 0x85d5, 0xbb => 0x5455, 0xbc => 0x5076,
+    0xbd => 0x6ca4, 0xbe => 0x556a, 0xbf => 0x8db4, 0xc0 => 0x722c,
+    0xc1 => 0x5e15, 0xc2 => 0x6015, 0xc3 => 0x7436, 0xc4 => 0x62cd,
+    0xc5 => 0x6392, 0xc6 => 0x724c, 0xc7 => 0x5f98, 0xc8 => 0x6e43,
+    0xc9 => 0x6d3e, 0xca => 0x6500, 0xcb => 0x6f58, 0xcc => 0x76d8,
+    0xcd => 0x78d0, 0xce => 0x76fc, 0xcf => 0x7554, 0xd0 => 0x5224,
+    0xd1 => 0x53db, 0xd2 => 0x4e53, 0xd3 => 0x5e9e, 0xd4 => 0x65c1,
+    0xd5 => 0x802a, 0xd6 => 0x80d6, 0xd7 => 0x629b, 0xd8 => 0x5486,
+    0xd9 => 0x5228, 0xda => 0x70ae, 0xdb => 0x888d, 0xdc => 0x8dd1,
+    0xdd => 0x6ce1, 0xde => 0x5478, 0xdf => 0x80da, 0xe0 => 0x57f9,
+    0xe1 => 0x88f4, 0xe2 => 0x8d54, 0xe3 => 0x966a, 0xe4 => 0x914d,
+    0xe5 => 0x4f69, 0xe6 => 0x6c9b, 0xe7 => 0x55b7, 0xe8 => 0x76c6,
+    0xe9 => 0x7830, 0xea => 0x62a8, 0xeb => 0x70f9, 0xec => 0x6f8e,
+    0xed => 0x5f6d, 0xee => 0x84ec, 0xef => 0x68da, 0xf0 => 0x787c,
+    0xf1 => 0x7bf7, 0xf2 => 0x81a8, 0xf3 => 0x670b, 0xf4 => 0x9e4f,
+    0xf5 => 0x6367, 0xf6 => 0x78b0, 0xf7 => 0x576f, 0xf8 => 0x7812,
+    0xf9 => 0x9739, 0xfa => 0x6279, 0xfb => 0x62ab, 0xfc => 0x5288,
+    0xfd => 0x7435, 0xfe => 0x6bd7,
+  },
+  0xc6 => {
+    0xa1 => 0x5564, 0xa2 => 0x813e, 0xa3 => 0x75b2, 0xa4 => 0x76ae,
+    0xa5 => 0x5339, 0xa6 => 0x75de, 0xa7 => 0x50fb, 0xa8 => 0x5c41,
+    0xa9 => 0x8b6c, 0xaa => 0x7bc7, 0xab => 0x504f, 0xac => 0x7247,
+    0xad => 0x9a97, 0xae => 0x98d8, 0xaf => 0x6f02, 0xb0 => 0x74e2,
+    0xb1 => 0x7968, 0xb2 => 0x6487, 0xb3 => 0x77a5, 0xb4 => 0x62fc,
+    0xb5 => 0x9891, 0xb6 => 0x8d2b, 0xb7 => 0x54c1, 0xb8 => 0x8058,
+    0xb9 => 0x4e52, 0xba => 0x576a, 0xbb => 0x82f9, 0xbc => 0x840d,
+    0xbd => 0x5e73, 0xbe => 0x51ed, 0xbf => 0x74f6, 0xc0 => 0x8bc4,
+    0xc1 => 0x5c4f, 0xc2 => 0x5761, 0xc3 => 0x6cfc, 0xc4 => 0x9887,
+    0xc5 => 0x5a46, 0xc6 => 0x7834, 0xc7 => 0x9b44, 0xc8 => 0x8feb,
+    0xc9 => 0x7c95, 0xca => 0x5256, 0xcb => 0x6251, 0xcc => 0x94fa,
+    0xcd => 0x4ec6, 0xce => 0x8386, 0xcf => 0x8461, 0xd0 => 0x83e9,
+    0xd1 => 0x84b2, 0xd2 => 0x57d4, 0xd3 => 0x6734, 0xd4 => 0x5703,
+    0xd5 => 0x666e, 0xd6 => 0x6d66, 0xd7 => 0x8c31, 0xd8 => 0x66dd,
+    0xd9 => 0x7011, 0xda => 0x671f, 0xdb => 0x6b3a, 0xdc => 0x6816,
+    0xdd => 0x621a, 0xde => 0x59bb, 0xdf => 0x4e03, 0xe0 => 0x51c4,
+    0xe1 => 0x6f06, 0xe2 => 0x67d2, 0xe3 => 0x6c8f, 0xe4 => 0x5176,
+    0xe5 => 0x68cb, 0xe6 => 0x5947, 0xe7 => 0x6b67, 0xe8 => 0x7566,
+    0xe9 => 0x5d0e, 0xea => 0x8110, 0xeb => 0x9f50, 0xec => 0x65d7,
+    0xed => 0x7948, 0xee => 0x7941, 0xef => 0x9a91, 0xf0 => 0x8d77,
+    0xf1 => 0x5c82, 0xf2 => 0x4e5e, 0xf3 => 0x4f01, 0xf4 => 0x542f,
+    0xf5 => 0x5951, 0xf6 => 0x780c, 0xf7 => 0x5668, 0xf8 => 0x6c14,
+    0xf9 => 0x8fc4, 0xfa => 0x5f03, 0xfb => 0x6c7d, 0xfc => 0x6ce3,
+    0xfd => 0x8bab, 0xfe => 0x6390,
+  },
+  0xc7 => {
+    0xa1 => 0x6070, 0xa2 => 0x6d3d, 0xa3 => 0x7275, 0xa4 => 0x6266,
+    0xa5 => 0x948e, 0xa6 => 0x94c5, 0xa7 => 0x5343, 0xa8 => 0x8fc1,
+    0xa9 => 0x7b7e, 0xaa => 0x4edf, 0xab => 0x8c26, 0xac => 0x4e7e,
+    0xad => 0x9ed4, 0xae => 0x94b1, 0xaf => 0x94b3, 0xb0 => 0x524d,
+    0xb1 => 0x6f5c, 0xb2 => 0x9063, 0xb3 => 0x6d45, 0xb4 => 0x8c34,
+    0xb5 => 0x5811, 0xb6 => 0x5d4c, 0xb7 => 0x6b20, 0xb8 => 0x6b49,
+    0xb9 => 0x67aa, 0xba => 0x545b, 0xbb => 0x8154, 0xbc => 0x7f8c,
+    0xbd => 0x5899, 0xbe => 0x8537, 0xbf => 0x5f3a, 0xc0 => 0x62a2,
+    0xc1 => 0x6a47, 0xc2 => 0x9539, 0xc3 => 0x6572, 0xc4 => 0x6084,
+    0xc5 => 0x6865, 0xc6 => 0x77a7, 0xc7 => 0x4e54, 0xc8 => 0x4fa8,
+    0xc9 => 0x5de7, 0xca => 0x9798, 0xcb => 0x64ac, 0xcc => 0x7fd8,
+    0xcd => 0x5ced, 0xce => 0x4fcf, 0xcf => 0x7a8d, 0xd0 => 0x5207,
+    0xd1 => 0x8304, 0xd2 => 0x4e14, 0xd3 => 0x602f, 0xd4 => 0x7a83,
+    0xd5 => 0x94a6, 0xd6 => 0x4fb5, 0xd7 => 0x4eb2, 0xd8 => 0x79e6,
+    0xd9 => 0x7434, 0xda => 0x52e4, 0xdb => 0x82b9, 0xdc => 0x64d2,
+    0xdd => 0x79bd, 0xde => 0x5bdd, 0xdf => 0x6c81, 0xe0 => 0x9752,
+    0xe1 => 0x8f7b, 0xe2 => 0x6c22, 0xe3 => 0x503e, 0xe4 => 0x537f,
+    0xe5 => 0x6e05, 0xe6 => 0x64ce, 0xe7 => 0x6674, 0xe8 => 0x6c30,
+    0xe9 => 0x60c5, 0xea => 0x9877, 0xeb => 0x8bf7, 0xec => 0x5e86,
+    0xed => 0x743c, 0xee => 0x7a77, 0xef => 0x79cb, 0xf0 => 0x4e18,
+    0xf1 => 0x90b1, 0xf2 => 0x7403, 0xf3 => 0x6c42, 0xf4 => 0x56da,
+    0xf5 => 0x914b, 0xf6 => 0x6cc5, 0xf7 => 0x8d8b, 0xf8 => 0x533a,
+    0xf9 => 0x86c6, 0xfa => 0x66f2, 0xfb => 0x8eaf, 0xfc => 0x5c48,
+    0xfd => 0x9a71, 0xfe => 0x6e20,
+  },
+  0xc8 => {
+    0xa1 => 0x53d6, 0xa2 => 0x5a36, 0xa3 => 0x9f8b, 0xa4 => 0x8da3,
+    0xa5 => 0x53bb, 0xa6 => 0x5708, 0xa7 => 0x98a7, 0xa8 => 0x6743,
+    0xa9 => 0x919b, 0xaa => 0x6cc9, 0xab => 0x5168, 0xac => 0x75ca,
+    0xad => 0x62f3, 0xae => 0x72ac, 0xaf => 0x5238, 0xb0 => 0x529d,
+    0xb1 => 0x7f3a, 0xb2 => 0x7094, 0xb3 => 0x7638, 0xb4 => 0x5374,
+    0xb5 => 0x9e4a, 0xb6 => 0x69b7, 0xb7 => 0x786e, 0xb8 => 0x96c0,
+    0xb9 => 0x88d9, 0xba => 0x7fa4, 0xbb => 0x7136, 0xbc => 0x71c3,
+    0xbd => 0x5189, 0xbe => 0x67d3, 0xbf => 0x74e4, 0xc0 => 0x58e4,
+    0xc1 => 0x6518, 0xc2 => 0x56b7, 0xc3 => 0x8ba9, 0xc4 => 0x9976,
+    0xc5 => 0x6270, 0xc6 => 0x7ed5, 0xc7 => 0x60f9, 0xc8 => 0x70ed,
+    0xc9 => 0x58ec, 0xca => 0x4ec1, 0xcb => 0x4eba, 0xcc => 0x5fcd,
+    0xcd => 0x97e7, 0xce => 0x4efb, 0xcf => 0x8ba4, 0xd0 => 0x5203,
+    0xd1 => 0x598a, 0xd2 => 0x7eab, 0xd3 => 0x6254, 0xd4 => 0x4ecd,
+    0xd5 => 0x65e5, 0xd6 => 0x620e, 0xd7 => 0x8338, 0xd8 => 0x84c9,
+    0xd9 => 0x8363, 0xda => 0x878d, 0xdb => 0x7194, 0xdc => 0x6eb6,
+    0xdd => 0x5bb9, 0xde => 0x7ed2, 0xdf => 0x5197, 0xe0 => 0x63c9,
+    0xe1 => 0x67d4, 0xe2 => 0x8089, 0xe3 => 0x8339, 0xe4 => 0x8815,
+    0xe5 => 0x5112, 0xe6 => 0x5b7a, 0xe7 => 0x5982, 0xe8 => 0x8fb1,
+    0xe9 => 0x4e73, 0xea => 0x6c5d, 0xeb => 0x5165, 0xec => 0x8925,
+    0xed => 0x8f6f, 0xee => 0x962e, 0xef => 0x854a, 0xf0 => 0x745e,
+    0xf1 => 0x9510, 0xf2 => 0x95f0, 0xf3 => 0x6da6, 0xf4 => 0x82e5,
+    0xf5 => 0x5f31, 0xf6 => 0x6492, 0xf7 => 0x6d12, 0xf8 => 0x8428,
+    0xf9 => 0x816e, 0xfa => 0x9cc3, 0xfb => 0x585e, 0xfc => 0x8d5b,
+    0xfd => 0x4e09, 0xfe => 0x53c1,
+  },
+  0xc9 => {
+    0xa1 => 0x4f1e, 0xa2 => 0x6563, 0xa3 => 0x6851, 0xa4 => 0x55d3,
+    0xa5 => 0x4e27, 0xa6 => 0x6414, 0xa7 => 0x9a9a, 0xa8 => 0x626b,
+    0xa9 => 0x5ac2, 0xaa => 0x745f, 0xab => 0x8272, 0xac => 0x6da9,
+    0xad => 0x68ee, 0xae => 0x50e7, 0xaf => 0x838e, 0xb0 => 0x7802,
+    0xb1 => 0x6740, 0xb2 => 0x5239, 0xb3 => 0x6c99, 0xb4 => 0x7eb1,
+    0xb5 => 0x50bb, 0xb6 => 0x5565, 0xb7 => 0x715e, 0xb8 => 0x7b5b,
+    0xb9 => 0x6652, 0xba => 0x73ca, 0xbb => 0x82eb, 0xbc => 0x6749,
+    0xbd => 0x5c71, 0xbe => 0x5220, 0xbf => 0x717d, 0xc0 => 0x886b,
+    0xc1 => 0x95ea, 0xc2 => 0x9655, 0xc3 => 0x64c5, 0xc4 => 0x8d61,
+    0xc5 => 0x81b3, 0xc6 => 0x5584, 0xc7 => 0x6c55, 0xc8 => 0x6247,
+    0xc9 => 0x7f2e, 0xca => 0x5892, 0xcb => 0x4f24, 0xcc => 0x5546,
+    0xcd => 0x8d4f, 0xce => 0x664c, 0xcf => 0x4e0a, 0xd0 => 0x5c1a,
+    0xd1 => 0x88f3, 0xd2 => 0x68a2, 0xd3 => 0x634e, 0xd4 => 0x7a0d,
+    0xd5 => 0x70e7, 0xd6 => 0x828d, 0xd7 => 0x52fa, 0xd8 => 0x97f6,
+    0xd9 => 0x5c11, 0xda => 0x54e8, 0xdb => 0x90b5, 0xdc => 0x7ecd,
+    0xdd => 0x5962, 0xde => 0x8d4a, 0xdf => 0x86c7, 0xe0 => 0x820c,
+    0xe1 => 0x820d, 0xe2 => 0x8d66, 0xe3 => 0x6444, 0xe4 => 0x5c04,
+    0xe5 => 0x6151, 0xe6 => 0x6d89, 0xe7 => 0x793e, 0xe8 => 0x8bbe,
+    0xe9 => 0x7837, 0xea => 0x7533, 0xeb => 0x547b, 0xec => 0x4f38,
+    0xed => 0x8eab, 0xee => 0x6df1, 0xef => 0x5a20, 0xf0 => 0x7ec5,
+    0xf1 => 0x795e, 0xf2 => 0x6c88, 0xf3 => 0x5ba1, 0xf4 => 0x5a76,
+    0xf5 => 0x751a, 0xf6 => 0x80be, 0xf7 => 0x614e, 0xf8 => 0x6e17,
+    0xf9 => 0x58f0, 0xfa => 0x751f, 0xfb => 0x7525, 0xfc => 0x7272,
+    0xfd => 0x5347, 0xfe => 0x7ef3,
+  },
+  0xca => {
+    0xa1 => 0x7701, 0xa2 => 0x76db, 0xa3 => 0x5269, 0xa4 => 0x80dc,
+    0xa5 => 0x5723, 0xa6 => 0x5e08, 0xa7 => 0x5931, 0xa8 => 0x72ee,
+    0xa9 => 0x65bd, 0xaa => 0x6e7f, 0xab => 0x8bd7, 0xac => 0x5c38,
+    0xad => 0x8671, 0xae => 0x5341, 0xaf => 0x77f3, 0xb0 => 0x62fe,
+    0xb1 => 0x65f6, 0xb2 => 0x4ec0, 0xb3 => 0x98df, 0xb4 => 0x8680,
+    0xb5 => 0x5b9e, 0xb6 => 0x8bc6, 0xb7 => 0x53f2, 0xb8 => 0x77e2,
+    0xb9 => 0x4f7f, 0xba => 0x5c4e, 0xbb => 0x9a76, 0xbc => 0x59cb,
+    0xbd => 0x5f0f, 0xbe => 0x793a, 0xbf => 0x58eb, 0xc0 => 0x4e16,
+    0xc1 => 0x67ff, 0xc2 => 0x4e8b, 0xc3 => 0x62ed, 0xc4 => 0x8a93,
+    0xc5 => 0x901d, 0xc6 => 0x52bf, 0xc7 => 0x662f, 0xc8 => 0x55dc,
+    0xc9 => 0x566c, 0xca => 0x9002, 0xcb => 0x4ed5, 0xcc => 0x4f8d,
+    0xcd => 0x91ca, 0xce => 0x9970, 0xcf => 0x6c0f, 0xd0 => 0x5e02,
+    0xd1 => 0x6043, 0xd2 => 0x5ba4, 0xd3 => 0x89c6, 0xd4 => 0x8bd5,
+    0xd5 => 0x6536, 0xd6 => 0x624b, 0xd7 => 0x9996, 0xd8 => 0x5b88,
+    0xd9 => 0x5bff, 0xda => 0x6388, 0xdb => 0x552e, 0xdc => 0x53d7,
+    0xdd => 0x7626, 0xde => 0x517d, 0xdf => 0x852c, 0xe0 => 0x67a2,
+    0xe1 => 0x68b3, 0xe2 => 0x6b8a, 0xe3 => 0x6292, 0xe4 => 0x8f93,
+    0xe5 => 0x53d4, 0xe6 => 0x8212, 0xe7 => 0x6dd1, 0xe8 => 0x758f,
+    0xe9 => 0x4e66, 0xea => 0x8d4e, 0xeb => 0x5b70, 0xec => 0x719f,
+    0xed => 0x85af, 0xee => 0x6691, 0xef => 0x66d9, 0xf0 => 0x7f72,
+    0xf1 => 0x8700, 0xf2 => 0x9ecd, 0xf3 => 0x9f20, 0xf4 => 0x5c5e,
+    0xf5 => 0x672f, 0xf6 => 0x8ff0, 0xf7 => 0x6811, 0xf8 => 0x675f,
+    0xf9 => 0x620d, 0xfa => 0x7ad6, 0xfb => 0x5885, 0xfc => 0x5eb6,
+    0xfd => 0x6570, 0xfe => 0x6f31,
+  },
+  0xcb => {
+    0xa1 => 0x6055, 0xa2 => 0x5237, 0xa3 => 0x800d, 0xa4 => 0x6454,
+    0xa5 => 0x8870, 0xa6 => 0x7529, 0xa7 => 0x5e05, 0xa8 => 0x6813,
+    0xa9 => 0x62f4, 0xaa => 0x971c, 0xab => 0x53cc, 0xac => 0x723d,
+    0xad => 0x8c01, 0xae => 0x6c34, 0xaf => 0x7761, 0xb0 => 0x7a0e,
+    0xb1 => 0x542e, 0xb2 => 0x77ac, 0xb3 => 0x987a, 0xb4 => 0x821c,
+    0xb5 => 0x8bf4, 0xb6 => 0x7855, 0xb7 => 0x6714, 0xb8 => 0x70c1,
+    0xb9 => 0x65af, 0xba => 0x6495, 0xbb => 0x5636, 0xbc => 0x601d,
+    0xbd => 0x79c1, 0xbe => 0x53f8, 0xbf => 0x4e1d, 0xc0 => 0x6b7b,
+    0xc1 => 0x8086, 0xc2 => 0x5bfa, 0xc3 => 0x55e3, 0xc4 => 0x56db,
+    0xc5 => 0x4f3a, 0xc6 => 0x4f3c, 0xc7 => 0x9972, 0xc8 => 0x5df3,
+    0xc9 => 0x677e, 0xca => 0x8038, 0xcb => 0x6002, 0xcc => 0x9882,
+    0xcd => 0x9001, 0xce => 0x5b8b, 0xcf => 0x8bbc, 0xd0 => 0x8bf5,
+    0xd1 => 0x641c, 0xd2 => 0x8258, 0xd3 => 0x64de, 0xd4 => 0x55fd,
+    0xd5 => 0x82cf, 0xd6 => 0x9165, 0xd7 => 0x4fd7, 0xd8 => 0x7d20,
+    0xd9 => 0x901f, 0xda => 0x7c9f, 0xdb => 0x50f3, 0xdc => 0x5851,
+    0xdd => 0x6eaf, 0xde => 0x5bbf, 0xdf => 0x8bc9, 0xe0 => 0x8083,
+    0xe1 => 0x9178, 0xe2 => 0x849c, 0xe3 => 0x7b97, 0xe4 => 0x867d,
+    0xe5 => 0x968b, 0xe6 => 0x968f, 0xe7 => 0x7ee5, 0xe8 => 0x9ad3,
+    0xe9 => 0x788e, 0xea => 0x5c81, 0xeb => 0x7a57, 0xec => 0x9042,
+    0xed => 0x96a7, 0xee => 0x795f, 0xef => 0x5b59, 0xf0 => 0x635f,
+    0xf1 => 0x7b0b, 0xf2 => 0x84d1, 0xf3 => 0x68ad, 0xf4 => 0x5506,
+    0xf5 => 0x7f29, 0xf6 => 0x7410, 0xf7 => 0x7d22, 0xf8 => 0x9501,
+    0xf9 => 0x6240, 0xfa => 0x584c, 0xfb => 0x4ed6, 0xfc => 0x5b83,
+    0xfd => 0x5979, 0xfe => 0x5854,
+  },
+  0xcc => {
+    0xa1 => 0x736d, 0xa2 => 0x631e, 0xa3 => 0x8e4b, 0xa4 => 0x8e0f,
+    0xa5 => 0x80ce, 0xa6 => 0x82d4, 0xa7 => 0x62ac, 0xa8 => 0x53f0,
+    0xa9 => 0x6cf0, 0xaa => 0x915e, 0xab => 0x592a, 0xac => 0x6001,
+    0xad => 0x6c70, 0xae => 0x574d, 0xaf => 0x644a, 0xb0 => 0x8d2a,
+    0xb1 => 0x762b, 0xb2 => 0x6ee9, 0xb3 => 0x575b, 0xb4 => 0x6a80,
+    0xb5 => 0x75f0, 0xb6 => 0x6f6d, 0xb7 => 0x8c2d, 0xb8 => 0x8c08,
+    0xb9 => 0x5766, 0xba => 0x6bef, 0xbb => 0x8892, 0xbc => 0x78b3,
+    0xbd => 0x63a2, 0xbe => 0x53f9, 0xbf => 0x70ad, 0xc0 => 0x6c64,
+    0xc1 => 0x5858, 0xc2 => 0x642a, 0xc3 => 0x5802, 0xc4 => 0x68e0,
+    0xc5 => 0x819b, 0xc6 => 0x5510, 0xc7 => 0x7cd6, 0xc8 => 0x5018,
+    0xc9 => 0x8eba, 0xca => 0x6dcc, 0xcb => 0x8d9f, 0xcc => 0x70eb,
+    0xcd => 0x638f, 0xce => 0x6d9b, 0xcf => 0x6ed4, 0xd0 => 0x7ee6,
+    0xd1 => 0x8404, 0xd2 => 0x6843, 0xd3 => 0x9003, 0xd4 => 0x6dd8,
+    0xd5 => 0x9676, 0xd6 => 0x8ba8, 0xd7 => 0x5957, 0xd8 => 0x7279,
+    0xd9 => 0x85e4, 0xda => 0x817e, 0xdb => 0x75bc, 0xdc => 0x8a8a,
+    0xdd => 0x68af, 0xde => 0x5254, 0xdf => 0x8e22, 0xe0 => 0x9511,
+    0xe1 => 0x63d0, 0xe2 => 0x9898, 0xe3 => 0x8e44, 0xe4 => 0x557c,
+    0xe5 => 0x4f53, 0xe6 => 0x66ff, 0xe7 => 0x568f, 0xe8 => 0x60d5,
+    0xe9 => 0x6d95, 0xea => 0x5243, 0xeb => 0x5c49, 0xec => 0x5929,
+    0xed => 0x6dfb, 0xee => 0x586b, 0xef => 0x7530, 0xf0 => 0x751c,
+    0xf1 => 0x606c, 0xf2 => 0x8214, 0xf3 => 0x8146, 0xf4 => 0x6311,
+    0xf5 => 0x6761, 0xf6 => 0x8fe2, 0xf7 => 0x773a, 0xf8 => 0x8df3,
+    0xf9 => 0x8d34, 0xfa => 0x94c1, 0xfb => 0x5e16, 0xfc => 0x5385,
+    0xfd => 0x542c, 0xfe => 0x70c3,
+  },
+  0xcd => {
+    0xa1 => 0x6c40, 0xa2 => 0x5ef7, 0xa3 => 0x505c, 0xa4 => 0x4ead,
+    0xa5 => 0x5ead, 0xa6 => 0x633a, 0xa7 => 0x8247, 0xa8 => 0x901a,
+    0xa9 => 0x6850, 0xaa => 0x916e, 0xab => 0x77b3, 0xac => 0x540c,
+    0xad => 0x94dc, 0xae => 0x5f64, 0xaf => 0x7ae5, 0xb0 => 0x6876,
+    0xb1 => 0x6345, 0xb2 => 0x7b52, 0xb3 => 0x7edf, 0xb4 => 0x75db,
+    0xb5 => 0x5077, 0xb6 => 0x6295, 0xb7 => 0x5934, 0xb8 => 0x900f,
+    0xb9 => 0x51f8, 0xba => 0x79c3, 0xbb => 0x7a81, 0xbc => 0x56fe,
+    0xbd => 0x5f92, 0xbe => 0x9014, 0xbf => 0x6d82, 0xc0 => 0x5c60,
+    0xc1 => 0x571f, 0xc2 => 0x5410, 0xc3 => 0x5154, 0xc4 => 0x6e4d,
+    0xc5 => 0x56e2, 0xc6 => 0x63a8, 0xc7 => 0x9893, 0xc8 => 0x817f,
+    0xc9 => 0x8715, 0xca => 0x892a, 0xcb => 0x9000, 0xcc => 0x541e,
+    0xcd => 0x5c6f, 0xce => 0x81c0, 0xcf => 0x62d6, 0xd0 => 0x6258,
+    0xd1 => 0x8131, 0xd2 => 0x9e35, 0xd3 => 0x9640, 0xd4 => 0x9a6e,
+    0xd5 => 0x9a7c, 0xd6 => 0x692d, 0xd7 => 0x59a5, 0xd8 => 0x62d3,
+    0xd9 => 0x553e, 0xda => 0x6316, 0xdb => 0x54c7, 0xdc => 0x86d9,
+    0xdd => 0x6d3c, 0xde => 0x5a03, 0xdf => 0x74e6, 0xe0 => 0x889c,
+    0xe1 => 0x6b6a, 0xe2 => 0x5916, 0xe3 => 0x8c4c, 0xe4 => 0x5f2f,
+    0xe5 => 0x6e7e, 0xe6 => 0x73a9, 0xe7 => 0x987d, 0xe8 => 0x4e38,
+    0xe9 => 0x70f7, 0xea => 0x5b8c, 0xeb => 0x7897, 0xec => 0x633d,
+    0xed => 0x665a, 0xee => 0x7696, 0xef => 0x60cb, 0xf0 => 0x5b9b,
+    0xf1 => 0x5a49, 0xf2 => 0x4e07, 0xf3 => 0x8155, 0xf4 => 0x6c6a,
+    0xf5 => 0x738b, 0xf6 => 0x4ea1, 0xf7 => 0x6789, 0xf8 => 0x7f51,
+    0xf9 => 0x5f80, 0xfa => 0x65fa, 0xfb => 0x671b, 0xfc => 0x5fd8,
+    0xfd => 0x5984, 0xfe => 0x5a01,
+  },
+  0xce => {
+    0xa1 => 0x5dcd, 0xa2 => 0x5fae, 0xa3 => 0x5371, 0xa4 => 0x97e6,
+    0xa5 => 0x8fdd, 0xa6 => 0x6845, 0xa7 => 0x56f4, 0xa8 => 0x552f,
+    0xa9 => 0x60df, 0xaa => 0x4e3a, 0xab => 0x6f4d, 0xac => 0x7ef4,
+    0xad => 0x82c7, 0xae => 0x840e, 0xaf => 0x59d4, 0xb0 => 0x4f1f,
+    0xb1 => 0x4f2a, 0xb2 => 0x5c3e, 0xb3 => 0x7eac, 0xb4 => 0x672a,
+    0xb5 => 0x851a, 0xb6 => 0x5473, 0xb7 => 0x754f, 0xb8 => 0x80c3,
+    0xb9 => 0x5582, 0xba => 0x9b4f, 0xbb => 0x4f4d, 0xbc => 0x6e2d,
+    0xbd => 0x8c13, 0xbe => 0x5c09, 0xbf => 0x6170, 0xc0 => 0x536b,
+    0xc1 => 0x761f, 0xc2 => 0x6e29, 0xc3 => 0x868a, 0xc4 => 0x6587,
+    0xc5 => 0x95fb, 0xc6 => 0x7eb9, 0xc7 => 0x543b, 0xc8 => 0x7a33,
+    0xc9 => 0x7d0a, 0xca => 0x95ee, 0xcb => 0x55e1, 0xcc => 0x7fc1,
+    0xcd => 0x74ee, 0xce => 0x631d, 0xcf => 0x8717, 0xd0 => 0x6da1,
+    0xd1 => 0x7a9d, 0xd2 => 0x6211, 0xd3 => 0x65a1, 0xd4 => 0x5367,
+    0xd5 => 0x63e1, 0xd6 => 0x6c83, 0xd7 => 0x5deb, 0xd8 => 0x545c,
+    0xd9 => 0x94a8, 0xda => 0x4e4c, 0xdb => 0x6c61, 0xdc => 0x8bec,
+    0xdd => 0x5c4b, 0xde => 0x65e0, 0xdf => 0x829c, 0xe0 => 0x68a7,
+    0xe1 => 0x543e, 0xe2 => 0x5434, 0xe3 => 0x6bcb, 0xe4 => 0x6b66,
+    0xe5 => 0x4e94, 0xe6 => 0x6342, 0xe7 => 0x5348, 0xe8 => 0x821e,
+    0xe9 => 0x4f0d, 0xea => 0x4fae, 0xeb => 0x575e, 0xec => 0x620a,
+    0xed => 0x96fe, 0xee => 0x6664, 0xef => 0x7269, 0xf0 => 0x52ff,
+    0xf1 => 0x52a1, 0xf2 => 0x609f, 0xf3 => 0x8bef, 0xf4 => 0x6614,
+    0xf5 => 0x7199, 0xf6 => 0x6790, 0xf7 => 0x897f, 0xf8 => 0x7852,
+    0xf9 => 0x77fd, 0xfa => 0x6670, 0xfb => 0x563b, 0xfc => 0x5438,
+    0xfd => 0x9521, 0xfe => 0x727a,
+  },
+  0xcf => {
+    0xa1 => 0x7a00, 0xa2 => 0x606f, 0xa3 => 0x5e0c, 0xa4 => 0x6089,
+    0xa5 => 0x819d, 0xa6 => 0x5915, 0xa7 => 0x60dc, 0xa8 => 0x7184,
+    0xa9 => 0x70ef, 0xaa => 0x6eaa, 0xab => 0x6c50, 0xac => 0x7280,
+    0xad => 0x6a84, 0xae => 0x88ad, 0xaf => 0x5e2d, 0xb0 => 0x4e60,
+    0xb1 => 0x5ab3, 0xb2 => 0x559c, 0xb3 => 0x94e3, 0xb4 => 0x6d17,
+    0xb5 => 0x7cfb, 0xb6 => 0x9699, 0xb7 => 0x620f, 0xb8 => 0x7ec6,
+    0xb9 => 0x778e, 0xba => 0x867e, 0xbb => 0x5323, 0xbc => 0x971e,
+    0xbd => 0x8f96, 0xbe => 0x6687, 0xbf => 0x5ce1, 0xc0 => 0x4fa0,
+    0xc1 => 0x72ed, 0xc2 => 0x4e0b, 0xc3 => 0x53a6, 0xc4 => 0x590f,
+    0xc5 => 0x5413, 0xc6 => 0x6380, 0xc7 => 0x9528, 0xc8 => 0x5148,
+    0xc9 => 0x4ed9, 0xca => 0x9c9c, 0xcb => 0x7ea4, 0xcc => 0x54b8,
+    0xcd => 0x8d24, 0xce => 0x8854, 0xcf => 0x8237, 0xd0 => 0x95f2,
+    0xd1 => 0x6d8e, 0xd2 => 0x5f26, 0xd3 => 0x5acc, 0xd4 => 0x663e,
+    0xd5 => 0x9669, 0xd6 => 0x73b0, 0xd7 => 0x732e, 0xd8 => 0x53bf,
+    0xd9 => 0x817a, 0xda => 0x9985, 0xdb => 0x7fa1, 0xdc => 0x5baa,
+    0xdd => 0x9677, 0xde => 0x9650, 0xdf => 0x7ebf, 0xe0 => 0x76f8,
+    0xe1 => 0x53a2, 0xe2 => 0x9576, 0xe3 => 0x9999, 0xe4 => 0x7bb1,
+    0xe5 => 0x8944, 0xe6 => 0x6e58, 0xe7 => 0x4e61, 0xe8 => 0x7fd4,
+    0xe9 => 0x7965, 0xea => 0x8be6, 0xeb => 0x60f3, 0xec => 0x54cd,
+    0xed => 0x4eab, 0xee => 0x9879, 0xef => 0x5df7, 0xf0 => 0x6a61,
+    0xf1 => 0x50cf, 0xf2 => 0x5411, 0xf3 => 0x8c61, 0xf4 => 0x8427,
+    0xf5 => 0x785d, 0xf6 => 0x9704, 0xf7 => 0x524a, 0xf8 => 0x54ee,
+    0xf9 => 0x56a3, 0xfa => 0x9500, 0xfb => 0x6d88, 0xfc => 0x5bb5,
+    0xfd => 0x6dc6, 0xfe => 0x6653,
+  },
+  0xd0 => {
+    0xa1 => 0x5c0f, 0xa2 => 0x5b5d, 0xa3 => 0x6821, 0xa4 => 0x8096,
+    0xa5 => 0x5578, 0xa6 => 0x7b11, 0xa7 => 0x6548, 0xa8 => 0x6954,
+    0xa9 => 0x4e9b, 0xaa => 0x6b47, 0xab => 0x874e, 0xac => 0x978b,
+    0xad => 0x534f, 0xae => 0x631f, 0xaf => 0x643a, 0xb0 => 0x90aa,
+    0xb1 => 0x659c, 0xb2 => 0x80c1, 0xb3 => 0x8c10, 0xb4 => 0x5199,
+    0xb5 => 0x68b0, 0xb6 => 0x5378, 0xb7 => 0x87f9, 0xb8 => 0x61c8,
+    0xb9 => 0x6cc4, 0xba => 0x6cfb, 0xbb => 0x8c22, 0xbc => 0x5c51,
+    0xbd => 0x85aa, 0xbe => 0x82af, 0xbf => 0x950c, 0xc0 => 0x6b23,
+    0xc1 => 0x8f9b, 0xc2 => 0x65b0, 0xc3 => 0x5ffb, 0xc4 => 0x5fc3,
+    0xc5 => 0x4fe1, 0xc6 => 0x8845, 0xc7 => 0x661f, 0xc8 => 0x8165,
+    0xc9 => 0x7329, 0xca => 0x60fa, 0xcb => 0x5174, 0xcc => 0x5211,
+    0xcd => 0x578b, 0xce => 0x5f62, 0xcf => 0x90a2, 0xd0 => 0x884c,
+    0xd1 => 0x9192, 0xd2 => 0x5e78, 0xd3 => 0x674f, 0xd4 => 0x6027,
+    0xd5 => 0x59d3, 0xd6 => 0x5144, 0xd7 => 0x51f6, 0xd8 => 0x80f8,
+    0xd9 => 0x5308, 0xda => 0x6c79, 0xdb => 0x96c4, 0xdc => 0x718a,
+    0xdd => 0x4f11, 0xde => 0x4fee, 0xdf => 0x7f9e, 0xe0 => 0x673d,
+    0xe1 => 0x55c5, 0xe2 => 0x9508, 0xe3 => 0x79c0, 0xe4 => 0x8896,
+    0xe5 => 0x7ee3, 0xe6 => 0x589f, 0xe7 => 0x620c, 0xe8 => 0x9700,
+    0xe9 => 0x865a, 0xea => 0x5618, 0xeb => 0x987b, 0xec => 0x5f90,
+    0xed => 0x8bb8, 0xee => 0x84c4, 0xef => 0x9157, 0xf0 => 0x53d9,
+    0xf1 => 0x65ed, 0xf2 => 0x5e8f, 0xf3 => 0x755c, 0xf4 => 0x6064,
+    0xf5 => 0x7d6e, 0xf6 => 0x5a7f, 0xf7 => 0x7eea, 0xf8 => 0x7eed,
+    0xf9 => 0x8f69, 0xfa => 0x55a7, 0xfb => 0x5ba3, 0xfc => 0x60ac,
+    0xfd => 0x65cb, 0xfe => 0x7384,
+  },
+  0xd1 => {
+    0xa1 => 0x9009, 0xa2 => 0x7663, 0xa3 => 0x7729, 0xa4 => 0x7eda,
+    0xa5 => 0x9774, 0xa6 => 0x859b, 0xa7 => 0x5b66, 0xa8 => 0x7a74,
+    0xa9 => 0x96ea, 0xaa => 0x8840, 0xab => 0x52cb, 0xac => 0x718f,
+    0xad => 0x5faa, 0xae => 0x65ec, 0xaf => 0x8be2, 0xb0 => 0x5bfb,
+    0xb1 => 0x9a6f, 0xb2 => 0x5de1, 0xb3 => 0x6b89, 0xb4 => 0x6c5b,
+    0xb5 => 0x8bad, 0xb6 => 0x8baf, 0xb7 => 0x900a, 0xb8 => 0x8fc5,
+    0xb9 => 0x538b, 0xba => 0x62bc, 0xbb => 0x9e26, 0xbc => 0x9e2d,
+    0xbd => 0x5440, 0xbe => 0x4e2b, 0xbf => 0x82bd, 0xc0 => 0x7259,
+    0xc1 => 0x869c, 0xc2 => 0x5d16, 0xc3 => 0x8859, 0xc4 => 0x6daf,
+    0xc5 => 0x96c5, 0xc6 => 0x54d1, 0xc7 => 0x4e9a, 0xc8 => 0x8bb6,
+    0xc9 => 0x7109, 0xca => 0x54bd, 0xcb => 0x9609, 0xcc => 0x70df,
+    0xcd => 0x6df9, 0xce => 0x76d0, 0xcf => 0x4e25, 0xd0 => 0x7814,
+    0xd1 => 0x8712, 0xd2 => 0x5ca9, 0xd3 => 0x5ef6, 0xd4 => 0x8a00,
+    0xd5 => 0x989c, 0xd6 => 0x960e, 0xd7 => 0x708e, 0xd8 => 0x6cbf,
+    0xd9 => 0x5944, 0xda => 0x63a9, 0xdb => 0x773c, 0xdc => 0x884d,
+    0xdd => 0x6f14, 0xde => 0x8273, 0xdf => 0x5830, 0xe0 => 0x71d5,
+    0xe1 => 0x538c, 0xe2 => 0x781a, 0xe3 => 0x96c1, 0xe4 => 0x5501,
+    0xe5 => 0x5f66, 0xe6 => 0x7130, 0xe7 => 0x5bb4, 0xe8 => 0x8c1a,
+    0xe9 => 0x9a8c, 0xea => 0x6b83, 0xeb => 0x592e, 0xec => 0x9e2f,
+    0xed => 0x79e7, 0xee => 0x6768, 0xef => 0x626c, 0xf0 => 0x4f6f,
+    0xf1 => 0x75a1, 0xf2 => 0x7f8a, 0xf3 => 0x6d0b, 0xf4 => 0x9633,
+    0xf5 => 0x6c27, 0xf6 => 0x4ef0, 0xf7 => 0x75d2, 0xf8 => 0x517b,
+    0xf9 => 0x6837, 0xfa => 0x6f3e, 0xfb => 0x9080, 0xfc => 0x8170,
+    0xfd => 0x5996, 0xfe => 0x7476,
+  },
+  0xd2 => {
+    0xa1 => 0x6447, 0xa2 => 0x5c27, 0xa3 => 0x9065, 0xa4 => 0x7a91,
+    0xa5 => 0x8c23, 0xa6 => 0x59da, 0xa7 => 0x54ac, 0xa8 => 0x8200,
+    0xa9 => 0x836f, 0xaa => 0x8981, 0xab => 0x8000, 0xac => 0x6930,
+    0xad => 0x564e, 0xae => 0x8036, 0xaf => 0x7237, 0xb0 => 0x91ce,
+    0xb1 => 0x51b6, 0xb2 => 0x4e5f, 0xb3 => 0x9875, 0xb4 => 0x6396,
+    0xb5 => 0x4e1a, 0xb6 => 0x53f6, 0xb7 => 0x66f3, 0xb8 => 0x814b,
+    0xb9 => 0x591c, 0xba => 0x6db2, 0xbb => 0x4e00, 0xbc => 0x58f9,
+    0xbd => 0x533b, 0xbe => 0x63d6, 0xbf => 0x94f1, 0xc0 => 0x4f9d,
+    0xc1 => 0x4f0a, 0xc2 => 0x8863, 0xc3 => 0x9890, 0xc4 => 0x5937,
+    0xc5 => 0x9057, 0xc6 => 0x79fb, 0xc7 => 0x4eea, 0xc8 => 0x80f0,
+    0xc9 => 0x7591, 0xca => 0x6c82, 0xcb => 0x5b9c, 0xcc => 0x59e8,
+    0xcd => 0x5f5d, 0xce => 0x6905, 0xcf => 0x8681, 0xd0 => 0x501a,
+    0xd1 => 0x5df2, 0xd2 => 0x4e59, 0xd3 => 0x77e3, 0xd4 => 0x4ee5,
+    0xd5 => 0x827a, 0xd6 => 0x6291, 0xd7 => 0x6613, 0xd8 => 0x9091,
+    0xd9 => 0x5c79, 0xda => 0x4ebf, 0xdb => 0x5f79, 0xdc => 0x81c6,
+    0xdd => 0x9038, 0xde => 0x8084, 0xdf => 0x75ab, 0xe0 => 0x4ea6,
+    0xe1 => 0x88d4, 0xe2 => 0x610f, 0xe3 => 0x6bc5, 0xe4 => 0x5fc6,
+    0xe5 => 0x4e49, 0xe6 => 0x76ca, 0xe7 => 0x6ea2, 0xe8 => 0x8be3,
+    0xe9 => 0x8bae, 0xea => 0x8c0a, 0xeb => 0x8bd1, 0xec => 0x5f02,
+    0xed => 0x7ffc, 0xee => 0x7fcc, 0xef => 0x7ece, 0xf0 => 0x8335,
+    0xf1 => 0x836b, 0xf2 => 0x56e0, 0xf3 => 0x6bb7, 0xf4 => 0x97f3,
+    0xf5 => 0x9634, 0xf6 => 0x59fb, 0xf7 => 0x541f, 0xf8 => 0x94f6,
+    0xf9 => 0x6deb, 0xfa => 0x5bc5, 0xfb => 0x996e, 0xfc => 0x5c39,
+    0xfd => 0x5f15, 0xfe => 0x9690,
+  },
+  0xd3 => {
+    0xa1 => 0x5370, 0xa2 => 0x82f1, 0xa3 => 0x6a31, 0xa4 => 0x5a74,
+    0xa5 => 0x9e70, 0xa6 => 0x5e94, 0xa7 => 0x7f28, 0xa8 => 0x83b9,
+    0xa9 => 0x8424, 0xaa => 0x8425, 0xab => 0x8367, 0xac => 0x8747,
+    0xad => 0x8fce, 0xae => 0x8d62, 0xaf => 0x76c8, 0xb0 => 0x5f71,
+    0xb1 => 0x9896, 0xb2 => 0x786c, 0xb3 => 0x6620, 0xb4 => 0x54df,
+    0xb5 => 0x62e5, 0xb6 => 0x4f63, 0xb7 => 0x81c3, 0xb8 => 0x75c8,
+    0xb9 => 0x5eb8, 0xba => 0x96cd, 0xbb => 0x8e0a, 0xbc => 0x86f9,
+    0xbd => 0x548f, 0xbe => 0x6cf3, 0xbf => 0x6d8c, 0xc0 => 0x6c38,
+    0xc1 => 0x607f, 0xc2 => 0x52c7, 0xc3 => 0x7528, 0xc4 => 0x5e7d,
+    0xc5 => 0x4f18, 0xc6 => 0x60a0, 0xc7 => 0x5fe7, 0xc8 => 0x5c24,
+    0xc9 => 0x7531, 0xca => 0x90ae, 0xcb => 0x94c0, 0xcc => 0x72b9,
+    0xcd => 0x6cb9, 0xce => 0x6e38, 0xcf => 0x9149, 0xd0 => 0x6709,
+    0xd1 => 0x53cb, 0xd2 => 0x53f3, 0xd3 => 0x4f51, 0xd4 => 0x91c9,
+    0xd5 => 0x8bf1, 0xd6 => 0x53c8, 0xd7 => 0x5e7c, 0xd8 => 0x8fc2,
+    0xd9 => 0x6de4, 0xda => 0x4e8e, 0xdb => 0x76c2, 0xdc => 0x6986,
+    0xdd => 0x865e, 0xde => 0x611a, 0xdf => 0x8206, 0xe0 => 0x4f59,
+    0xe1 => 0x4fde, 0xe2 => 0x903e, 0xe3 => 0x9c7c, 0xe4 => 0x6109,
+    0xe5 => 0x6e1d, 0xe6 => 0x6e14, 0xe7 => 0x9685, 0xe8 => 0x4e88,
+    0xe9 => 0x5a31, 0xea => 0x96e8, 0xeb => 0x4e0e, 0xec => 0x5c7f,
+    0xed => 0x79b9, 0xee => 0x5b87, 0xef => 0x8bed, 0xf0 => 0x7fbd,
+    0xf1 => 0x7389, 0xf2 => 0x57df, 0xf3 => 0x828b, 0xf4 => 0x90c1,
+    0xf5 => 0x5401, 0xf6 => 0x9047, 0xf7 => 0x55bb, 0xf8 => 0x5cea,
+    0xf9 => 0x5fa1, 0xfa => 0x6108, 0xfb => 0x6b32, 0xfc => 0x72f1,
+    0xfd => 0x80b2, 0xfe => 0x8a89,
+  },
+  0xd4 => {
+    0xa1 => 0x6d74, 0xa2 => 0x5bd3, 0xa3 => 0x88d5, 0xa4 => 0x9884,
+    0xa5 => 0x8c6b, 0xa6 => 0x9a6d, 0xa7 => 0x9e33, 0xa8 => 0x6e0a,
+    0xa9 => 0x51a4, 0xaa => 0x5143, 0xab => 0x57a3, 0xac => 0x8881,
+    0xad => 0x539f, 0xae => 0x63f4, 0xaf => 0x8f95, 0xb0 => 0x56ed,
+    0xb1 => 0x5458, 0xb2 => 0x5706, 0xb3 => 0x733f, 0xb4 => 0x6e90,
+    0xb5 => 0x7f18, 0xb6 => 0x8fdc, 0xb7 => 0x82d1, 0xb8 => 0x613f,
+    0xb9 => 0x6028, 0xba => 0x9662, 0xbb => 0x66f0, 0xbc => 0x7ea6,
+    0xbd => 0x8d8a, 0xbe => 0x8dc3, 0xbf => 0x94a5, 0xc0 => 0x5cb3,
+    0xc1 => 0x7ca4, 0xc2 => 0x6708, 0xc3 => 0x60a6, 0xc4 => 0x9605,
+    0xc5 => 0x8018, 0xc6 => 0x4e91, 0xc7 => 0x90e7, 0xc8 => 0x5300,
+    0xc9 => 0x9668, 0xca => 0x5141, 0xcb => 0x8fd0, 0xcc => 0x8574,
+    0xcd => 0x915d, 0xce => 0x6655, 0xcf => 0x97f5, 0xd0 => 0x5b55,
+    0xd1 => 0x531d, 0xd2 => 0x7838, 0xd3 => 0x6742, 0xd4 => 0x683d,
+    0xd5 => 0x54c9, 0xd6 => 0x707e, 0xd7 => 0x5bb0, 0xd8 => 0x8f7d,
+    0xd9 => 0x518d, 0xda => 0x5728, 0xdb => 0x54b1, 0xdc => 0x6512,
+    0xdd => 0x6682, 0xde => 0x8d5e, 0xdf => 0x8d43, 0xe0 => 0x810f,
+    0xe1 => 0x846c, 0xe2 => 0x906d, 0xe3 => 0x7cdf, 0xe4 => 0x51ff,
+    0xe5 => 0x85fb, 0xe6 => 0x67a3, 0xe7 => 0x65e9, 0xe8 => 0x6fa1,
+    0xe9 => 0x86a4, 0xea => 0x8e81, 0xeb => 0x566a, 0xec => 0x9020,
+    0xed => 0x7682, 0xee => 0x7076, 0xef => 0x71e5, 0xf0 => 0x8d23,
+    0xf1 => 0x62e9, 0xf2 => 0x5219, 0xf3 => 0x6cfd, 0xf4 => 0x8d3c,
+    0xf5 => 0x600e, 0xf6 => 0x589e, 0xf7 => 0x618e, 0xf8 => 0x66fe,
+    0xf9 => 0x8d60, 0xfa => 0x624e, 0xfb => 0x55b3, 0xfc => 0x6e23,
+    0xfd => 0x672d, 0xfe => 0x8f67,
+  },
+  0xd5 => {
+    0xa1 => 0x94e1, 0xa2 => 0x95f8, 0xa3 => 0x7728, 0xa4 => 0x6805,
+    0xa5 => 0x69a8, 0xa6 => 0x548b, 0xa7 => 0x4e4d, 0xa8 => 0x70b8,
+    0xa9 => 0x8bc8, 0xaa => 0x6458, 0xab => 0x658b, 0xac => 0x5b85,
+    0xad => 0x7a84, 0xae => 0x503a, 0xaf => 0x5be8, 0xb0 => 0x77bb,
+    0xb1 => 0x6be1, 0xb2 => 0x8a79, 0xb3 => 0x7c98, 0xb4 => 0x6cbe,
+    0xb5 => 0x76cf, 0xb6 => 0x65a9, 0xb7 => 0x8f97, 0xb8 => 0x5d2d,
+    0xb9 => 0x5c55, 0xba => 0x8638, 0xbb => 0x6808, 0xbc => 0x5360,
+    0xbd => 0x6218, 0xbe => 0x7ad9, 0xbf => 0x6e5b, 0xc0 => 0x7efd,
+    0xc1 => 0x6a1f, 0xc2 => 0x7ae0, 0xc3 => 0x5f70, 0xc4 => 0x6f33,
+    0xc5 => 0x5f20, 0xc6 => 0x638c, 0xc7 => 0x6da8, 0xc8 => 0x6756,
+    0xc9 => 0x4e08, 0xca => 0x5e10, 0xcb => 0x8d26, 0xcc => 0x4ed7,
+    0xcd => 0x80c0, 0xce => 0x7634, 0xcf => 0x969c, 0xd0 => 0x62db,
+    0xd1 => 0x662d, 0xd2 => 0x627e, 0xd3 => 0x6cbc, 0xd4 => 0x8d75,
+    0xd5 => 0x7167, 0xd6 => 0x7f69, 0xd7 => 0x5146, 0xd8 => 0x8087,
+    0xd9 => 0x53ec, 0xda => 0x906e, 0xdb => 0x6298, 0xdc => 0x54f2,
+    0xdd => 0x86f0, 0xde => 0x8f99, 0xdf => 0x8005, 0xe0 => 0x9517,
+    0xe1 => 0x8517, 0xe2 => 0x8fd9, 0xe3 => 0x6d59, 0xe4 => 0x73cd,
+    0xe5 => 0x659f, 0xe6 => 0x771f, 0xe7 => 0x7504, 0xe8 => 0x7827,
+    0xe9 => 0x81fb, 0xea => 0x8d1e, 0xeb => 0x9488, 0xec => 0x4fa6,
+    0xed => 0x6795, 0xee => 0x75b9, 0xef => 0x8bca, 0xf0 => 0x9707,
+    0xf1 => 0x632f, 0xf2 => 0x9547, 0xf3 => 0x9635, 0xf4 => 0x84b8,
+    0xf5 => 0x6323, 0xf6 => 0x7741, 0xf7 => 0x5f81, 0xf8 => 0x72f0,
+    0xf9 => 0x4e89, 0xfa => 0x6014, 0xfb => 0x6574, 0xfc => 0x62ef,
+    0xfd => 0x6b63, 0xfe => 0x653f,
+  },
+  0xd6 => {
+    0xa1 => 0x5e27, 0xa2 => 0x75c7, 0xa3 => 0x90d1, 0xa4 => 0x8bc1,
+    0xa5 => 0x829d, 0xa6 => 0x679d, 0xa7 => 0x652f, 0xa8 => 0x5431,
+    0xa9 => 0x8718, 0xaa => 0x77e5, 0xab => 0x80a2, 0xac => 0x8102,
+    0xad => 0x6c41, 0xae => 0x4e4b, 0xaf => 0x7ec7, 0xb0 => 0x804c,
+    0xb1 => 0x76f4, 0xb2 => 0x690d, 0xb3 => 0x6b96, 0xb4 => 0x6267,
+    0xb5 => 0x503c, 0xb6 => 0x4f84, 0xb7 => 0x5740, 0xb8 => 0x6307,
+    0xb9 => 0x6b62, 0xba => 0x8dbe, 0xbb => 0x53ea, 0xbc => 0x65e8,
+    0xbd => 0x7eb8, 0xbe => 0x5fd7, 0xbf => 0x631a, 0xc0 => 0x63b7,
+    0xc1 => 0x81f3, 0xc2 => 0x81f4, 0xc3 => 0x7f6e, 0xc4 => 0x5e1c,
+    0xc5 => 0x5cd9, 0xc6 => 0x5236, 0xc7 => 0x667a, 0xc8 => 0x79e9,
+    0xc9 => 0x7a1a, 0xca => 0x8d28, 0xcb => 0x7099, 0xcc => 0x75d4,
+    0xcd => 0x6ede, 0xce => 0x6cbb, 0xcf => 0x7a92, 0xd0 => 0x4e2d,
+    0xd1 => 0x76c5, 0xd2 => 0x5fe0, 0xd3 => 0x949f, 0xd4 => 0x8877,
+    0xd5 => 0x7ec8, 0xd6 => 0x79cd, 0xd7 => 0x80bf, 0xd8 => 0x91cd,
+    0xd9 => 0x4ef2, 0xda => 0x4f17, 0xdb => 0x821f, 0xdc => 0x5468,
+    0xdd => 0x5dde, 0xde => 0x6d32, 0xdf => 0x8bcc, 0xe0 => 0x7ca5,
+    0xe1 => 0x8f74, 0xe2 => 0x8098, 0xe3 => 0x5e1a, 0xe4 => 0x5492,
+    0xe5 => 0x76b1, 0xe6 => 0x5b99, 0xe7 => 0x663c, 0xe8 => 0x9aa4,
+    0xe9 => 0x73e0, 0xea => 0x682a, 0xeb => 0x86db, 0xec => 0x6731,
+    0xed => 0x732a, 0xee => 0x8bf8, 0xef => 0x8bdb, 0xf0 => 0x9010,
+    0xf1 => 0x7af9, 0xf2 => 0x70db, 0xf3 => 0x716e, 0xf4 => 0x62c4,
+    0xf5 => 0x77a9, 0xf6 => 0x5631, 0xf7 => 0x4e3b, 0xf8 => 0x8457,
+    0xf9 => 0x67f1, 0xfa => 0x52a9, 0xfb => 0x86c0, 0xfc => 0x8d2e,
+    0xfd => 0x94f8, 0xfe => 0x7b51,
+  },
+  0xd7 => {
+    0xa1 => 0x4f4f, 0xa2 => 0x6ce8, 0xa3 => 0x795d, 0xa4 => 0x9a7b,
+    0xa5 => 0x6293, 0xa6 => 0x722a, 0xa7 => 0x62fd, 0xa8 => 0x4e13,
+    0xa9 => 0x7816, 0xaa => 0x8f6c, 0xab => 0x64b0, 0xac => 0x8d5a,
+    0xad => 0x7bc6, 0xae => 0x6869, 0xaf => 0x5e84, 0xb0 => 0x88c5,
+    0xb1 => 0x5986, 0xb2 => 0x649e, 0xb3 => 0x58ee, 0xb4 => 0x72b6,
+    0xb5 => 0x690e, 0xb6 => 0x9525, 0xb7 => 0x8ffd, 0xb8 => 0x8d58,
+    0xb9 => 0x5760, 0xba => 0x7f00, 0xbb => 0x8c06, 0xbc => 0x51c6,
+    0xbd => 0x6349, 0xbe => 0x62d9, 0xbf => 0x5353, 0xc0 => 0x684c,
+    0xc1 => 0x7422, 0xc2 => 0x8301, 0xc3 => 0x914c, 0xc4 => 0x5544,
+    0xc5 => 0x7740, 0xc6 => 0x707c, 0xc7 => 0x6d4a, 0xc8 => 0x5179,
+    0xc9 => 0x54a8, 0xca => 0x8d44, 0xcb => 0x59ff, 0xcc => 0x6ecb,
+    0xcd => 0x6dc4, 0xce => 0x5b5c, 0xcf => 0x7d2b, 0xd0 => 0x4ed4,
+    0xd1 => 0x7c7d, 0xd2 => 0x6ed3, 0xd3 => 0x5b50, 0xd4 => 0x81ea,
+    0xd5 => 0x6e0d, 0xd6 => 0x5b57, 0xd7 => 0x9b03, 0xd8 => 0x68d5,
+    0xd9 => 0x8e2a, 0xda => 0x5b97, 0xdb => 0x7efc, 0xdc => 0x603b,
+    0xdd => 0x7eb5, 0xde => 0x90b9, 0xdf => 0x8d70, 0xe0 => 0x594f,
+    0xe1 => 0x63cd, 0xe2 => 0x79df, 0xe3 => 0x8db3, 0xe4 => 0x5352,
+    0xe5 => 0x65cf, 0xe6 => 0x7956, 0xe7 => 0x8bc5, 0xe8 => 0x963b,
+    0xe9 => 0x7ec4, 0xea => 0x94bb, 0xeb => 0x7e82, 0xec => 0x5634,
+    0xed => 0x9189, 0xee => 0x6700, 0xef => 0x7f6a, 0xf0 => 0x5c0a,
+    0xf1 => 0x9075, 0xf2 => 0x6628, 0xf3 => 0x5de6, 0xf4 => 0x4f50,
+    0xf5 => 0x67de, 0xf6 => 0x505a, 0xf7 => 0x4f5c, 0xf8 => 0x5750,
+    0xf9 => 0x5ea7,
+  },
+  0xd8 => {
+    0xa1 => 0x4e8d, 0xa2 => 0x4e0c, 0xa3 => 0x5140, 0xa4 => 0x4e10,
+    0xa5 => 0x5eff, 0xa6 => 0x5345, 0xa7 => 0x4e15, 0xa8 => 0x4e98,
+    0xa9 => 0x4e1e, 0xaa => 0x9b32, 0xab => 0x5b6c, 0xac => 0x5669,
+    0xad => 0x4e28, 0xae => 0x79ba, 0xaf => 0x4e3f, 0xb0 => 0x5315,
+    0xb1 => 0x4e47, 0xb2 => 0x592d, 0xb3 => 0x723b, 0xb4 => 0x536e,
+    0xb5 => 0x6c10, 0xb6 => 0x56df, 0xb7 => 0x80e4, 0xb8 => 0x9997,
+    0xb9 => 0x6bd3, 0xba => 0x777e, 0xbb => 0x9f17, 0xbc => 0x4e36,
+    0xbd => 0x4e9f, 0xbe => 0x9f10, 0xbf => 0x4e5c, 0xc0 => 0x4e69,
+    0xc1 => 0x4e93, 0xc2 => 0x8288, 0xc3 => 0x5b5b, 0xc4 => 0x556c,
+    0xc5 => 0x560f, 0xc6 => 0x4ec4, 0xc7 => 0x538d, 0xc8 => 0x539d,
+    0xc9 => 0x53a3, 0xca => 0x53a5, 0xcb => 0x53ae, 0xcc => 0x9765,
+    0xcd => 0x8d5d, 0xce => 0x531a, 0xcf => 0x53f5, 0xd0 => 0x5326,
+    0xd1 => 0x532e, 0xd2 => 0x533e, 0xd3 => 0x8d5c, 0xd4 => 0x5366,
+    0xd5 => 0x5363, 0xd6 => 0x5202, 0xd7 => 0x5208, 0xd8 => 0x520e,
+    0xd9 => 0x522d, 0xda => 0x5233, 0xdb => 0x523f, 0xdc => 0x5240,
+    0xdd => 0x524c, 0xde => 0x525e, 0xdf => 0x5261, 0xe0 => 0x525c,
+    0xe1 => 0x84af, 0xe2 => 0x527d, 0xe3 => 0x5282, 0xe4 => 0x5281,
+    0xe5 => 0x5290, 0xe6 => 0x5293, 0xe7 => 0x5182, 0xe8 => 0x7f54,
+    0xe9 => 0x4ebb, 0xea => 0x4ec3, 0xeb => 0x4ec9, 0xec => 0x4ec2,
+    0xed => 0x4ee8, 0xee => 0x4ee1, 0xef => 0x4eeb, 0xf0 => 0x4ede,
+    0xf1 => 0x4f1b, 0xf2 => 0x4ef3, 0xf3 => 0x4f22, 0xf4 => 0x4f64,
+    0xf5 => 0x4ef5, 0xf6 => 0x4f25, 0xf7 => 0x4f27, 0xf8 => 0x4f09,
+    0xf9 => 0x4f2b, 0xfa => 0x4f5e, 0xfb => 0x4f67, 0xfc => 0x6538,
+    0xfd => 0x4f5a, 0xfe => 0x4f5d,
+  },
+  0xd9 => {
+    0xa1 => 0x4f5f, 0xa2 => 0x4f57, 0xa3 => 0x4f32, 0xa4 => 0x4f3d,
+    0xa5 => 0x4f76, 0xa6 => 0x4f74, 0xa7 => 0x4f91, 0xa8 => 0x4f89,
+    0xa9 => 0x4f83, 0xaa => 0x4f8f, 0xab => 0x4f7e, 0xac => 0x4f7b,
+    0xad => 0x4faa, 0xae => 0x4f7c, 0xaf => 0x4fac, 0xb0 => 0x4f94,
+    0xb1 => 0x4fe6, 0xb2 => 0x4fe8, 0xb3 => 0x4fea, 0xb4 => 0x4fc5,
+    0xb5 => 0x4fda, 0xb6 => 0x4fe3, 0xb7 => 0x4fdc, 0xb8 => 0x4fd1,
+    0xb9 => 0x4fdf, 0xba => 0x4ff8, 0xbb => 0x5029, 0xbc => 0x504c,
+    0xbd => 0x4ff3, 0xbe => 0x502c, 0xbf => 0x500f, 0xc0 => 0x502e,
+    0xc1 => 0x502d, 0xc2 => 0x4ffe, 0xc3 => 0x501c, 0xc4 => 0x500c,
+    0xc5 => 0x5025, 0xc6 => 0x5028, 0xc7 => 0x507e, 0xc8 => 0x5043,
+    0xc9 => 0x5055, 0xca => 0x5048, 0xcb => 0x504e, 0xcc => 0x506c,
+    0xcd => 0x507b, 0xce => 0x50a5, 0xcf => 0x50a7, 0xd0 => 0x50a9,
+    0xd1 => 0x50ba, 0xd2 => 0x50d6, 0xd3 => 0x5106, 0xd4 => 0x50ed,
+    0xd5 => 0x50ec, 0xd6 => 0x50e6, 0xd7 => 0x50ee, 0xd8 => 0x5107,
+    0xd9 => 0x510b, 0xda => 0x4edd, 0xdb => 0x6c3d, 0xdc => 0x4f58,
+    0xdd => 0x4f65, 0xde => 0x4fce, 0xdf => 0x9fa0, 0xe0 => 0x6c46,
+    0xe1 => 0x7c74, 0xe2 => 0x516e, 0xe3 => 0x5dfd, 0xe4 => 0x9ec9,
+    0xe5 => 0x9998, 0xe6 => 0x5181, 0xe7 => 0x5914, 0xe8 => 0x52f9,
+    0xe9 => 0x530d, 0xea => 0x8a07, 0xeb => 0x5310, 0xec => 0x51eb,
+    0xed => 0x5919, 0xee => 0x5155, 0xef => 0x4ea0, 0xf0 => 0x5156,
+    0xf1 => 0x4eb3, 0xf2 => 0x886e, 0xf3 => 0x88a4, 0xf4 => 0x4eb5,
+    0xf5 => 0x8114, 0xf6 => 0x88d2, 0xf7 => 0x7980, 0xf8 => 0x5b34,
+    0xf9 => 0x8803, 0xfa => 0x7fb8, 0xfb => 0x51ab, 0xfc => 0x51b1,
+    0xfd => 0x51bd, 0xfe => 0x51bc,
+  },
+  0xda => {
+    0xa1 => 0x51c7, 0xa2 => 0x5196, 0xa3 => 0x51a2, 0xa4 => 0x51a5,
+    0xa5 => 0x8ba0, 0xa6 => 0x8ba6, 0xa7 => 0x8ba7, 0xa8 => 0x8baa,
+    0xa9 => 0x8bb4, 0xaa => 0x8bb5, 0xab => 0x8bb7, 0xac => 0x8bc2,
+    0xad => 0x8bc3, 0xae => 0x8bcb, 0xaf => 0x8bcf, 0xb0 => 0x8bce,
+    0xb1 => 0x8bd2, 0xb2 => 0x8bd3, 0xb3 => 0x8bd4, 0xb4 => 0x8bd6,
+    0xb5 => 0x8bd8, 0xb6 => 0x8bd9, 0xb7 => 0x8bdc, 0xb8 => 0x8bdf,
+    0xb9 => 0x8be0, 0xba => 0x8be4, 0xbb => 0x8be8, 0xbc => 0x8be9,
+    0xbd => 0x8bee, 0xbe => 0x8bf0, 0xbf => 0x8bf3, 0xc0 => 0x8bf6,
+    0xc1 => 0x8bf9, 0xc2 => 0x8bfc, 0xc3 => 0x8bff, 0xc4 => 0x8c00,
+    0xc5 => 0x8c02, 0xc6 => 0x8c04, 0xc7 => 0x8c07, 0xc8 => 0x8c0c,
+    0xc9 => 0x8c0f, 0xca => 0x8c11, 0xcb => 0x8c12, 0xcc => 0x8c14,
+    0xcd => 0x8c15, 0xce => 0x8c16, 0xcf => 0x8c19, 0xd0 => 0x8c1b,
+    0xd1 => 0x8c18, 0xd2 => 0x8c1d, 0xd3 => 0x8c1f, 0xd4 => 0x8c20,
+    0xd5 => 0x8c21, 0xd6 => 0x8c25, 0xd7 => 0x8c27, 0xd8 => 0x8c2a,
+    0xd9 => 0x8c2b, 0xda => 0x8c2e, 0xdb => 0x8c2f, 0xdc => 0x8c32,
+    0xdd => 0x8c33, 0xde => 0x8c35, 0xdf => 0x8c36, 0xe0 => 0x5369,
+    0xe1 => 0x537a, 0xe2 => 0x961d, 0xe3 => 0x9622, 0xe4 => 0x9621,
+    0xe5 => 0x9631, 0xe6 => 0x962a, 0xe7 => 0x963d, 0xe8 => 0x963c,
+    0xe9 => 0x9642, 0xea => 0x9649, 0xeb => 0x9654, 0xec => 0x965f,
+    0xed => 0x9667, 0xee => 0x966c, 0xef => 0x9672, 0xf0 => 0x9674,
+    0xf1 => 0x9688, 0xf2 => 0x968d, 0xf3 => 0x9697, 0xf4 => 0x96b0,
+    0xf5 => 0x9097, 0xf6 => 0x909b, 0xf7 => 0x909d, 0xf8 => 0x9099,
+    0xf9 => 0x90ac, 0xfa => 0x90a1, 0xfb => 0x90b4, 0xfc => 0x90b3,
+    0xfd => 0x90b6, 0xfe => 0x90ba,
+  },
+  0xdb => {
+    0xa1 => 0x90b8, 0xa2 => 0x90b0, 0xa3 => 0x90cf, 0xa4 => 0x90c5,
+    0xa5 => 0x90be, 0xa6 => 0x90d0, 0xa7 => 0x90c4, 0xa8 => 0x90c7,
+    0xa9 => 0x90d3, 0xaa => 0x90e6, 0xab => 0x90e2, 0xac => 0x90dc,
+    0xad => 0x90d7, 0xae => 0x90db, 0xaf => 0x90eb, 0xb0 => 0x90ef,
+    0xb1 => 0x90fe, 0xb2 => 0x9104, 0xb3 => 0x9122, 0xb4 => 0x911e,
+    0xb5 => 0x9123, 0xb6 => 0x9131, 0xb7 => 0x912f, 0xb8 => 0x9139,
+    0xb9 => 0x9143, 0xba => 0x9146, 0xbb => 0x520d, 0xbc => 0x5942,
+    0xbd => 0x52a2, 0xbe => 0x52ac, 0xbf => 0x52ad, 0xc0 => 0x52be,
+    0xc1 => 0x54ff, 0xc2 => 0x52d0, 0xc3 => 0x52d6, 0xc4 => 0x52f0,
+    0xc5 => 0x53df, 0xc6 => 0x71ee, 0xc7 => 0x77cd, 0xc8 => 0x5ef4,
+    0xc9 => 0x51f5, 0xca => 0x51fc, 0xcb => 0x9b2f, 0xcc => 0x53b6,
+    0xcd => 0x5f01, 0xce => 0x755a, 0xcf => 0x5def, 0xd0 => 0x574c,
+    0xd1 => 0x57a9, 0xd2 => 0x57a1, 0xd3 => 0x587e, 0xd4 => 0x58bc,
+    0xd5 => 0x58c5, 0xd6 => 0x58d1, 0xd7 => 0x5729, 0xd8 => 0x572c,
+    0xd9 => 0x572a, 0xda => 0x5733, 0xdb => 0x5739, 0xdc => 0x572e,
+    0xdd => 0x572f, 0xde => 0x575c, 0xdf => 0x573b, 0xe0 => 0x5742,
+    0xe1 => 0x5769, 0xe2 => 0x5785, 0xe3 => 0x576b, 0xe4 => 0x5786,
+    0xe5 => 0x577c, 0xe6 => 0x577b, 0xe7 => 0x5768, 0xe8 => 0x576d,
+    0xe9 => 0x5776, 0xea => 0x5773, 0xeb => 0x57ad, 0xec => 0x57a4,
+    0xed => 0x578c, 0xee => 0x57b2, 0xef => 0x57cf, 0xf0 => 0x57a7,
+    0xf1 => 0x57b4, 0xf2 => 0x5793, 0xf3 => 0x57a0, 0xf4 => 0x57d5,
+    0xf5 => 0x57d8, 0xf6 => 0x57da, 0xf7 => 0x57d9, 0xf8 => 0x57d2,
+    0xf9 => 0x57b8, 0xfa => 0x57f4, 0xfb => 0x57ef, 0xfc => 0x57f8,
+    0xfd => 0x57e4, 0xfe => 0x57dd,
+  },
+  0xdc => {
+    0xa1 => 0x580b, 0xa2 => 0x580d, 0xa3 => 0x57fd, 0xa4 => 0x57ed,
+    0xa5 => 0x5800, 0xa6 => 0x581e, 0xa7 => 0x5819, 0xa8 => 0x5844,
+    0xa9 => 0x5820, 0xaa => 0x5865, 0xab => 0x586c, 0xac => 0x5881,
+    0xad => 0x5889, 0xae => 0x589a, 0xaf => 0x5880, 0xb0 => 0x99a8,
+    0xb1 => 0x9f19, 0xb2 => 0x61ff, 0xb3 => 0x8279, 0xb4 => 0x827d,
+    0xb5 => 0x827f, 0xb6 => 0x828f, 0xb7 => 0x828a, 0xb8 => 0x82a8,
+    0xb9 => 0x8284, 0xba => 0x828e, 0xbb => 0x8291, 0xbc => 0x8297,
+    0xbd => 0x8299, 0xbe => 0x82ab, 0xbf => 0x82b8, 0xc0 => 0x82be,
+    0xc1 => 0x82b0, 0xc2 => 0x82c8, 0xc3 => 0x82ca, 0xc4 => 0x82e3,
+    0xc5 => 0x8298, 0xc6 => 0x82b7, 0xc7 => 0x82ae, 0xc8 => 0x82cb,
+    0xc9 => 0x82cc, 0xca => 0x82c1, 0xcb => 0x82a9, 0xcc => 0x82b4,
+    0xcd => 0x82a1, 0xce => 0x82aa, 0xcf => 0x829f, 0xd0 => 0x82c4,
+    0xd1 => 0x82ce, 0xd2 => 0x82a4, 0xd3 => 0x82e1, 0xd4 => 0x8309,
+    0xd5 => 0x82f7, 0xd6 => 0x82e4, 0xd7 => 0x830f, 0xd8 => 0x8307,
+    0xd9 => 0x82dc, 0xda => 0x82f4, 0xdb => 0x82d2, 0xdc => 0x82d8,
+    0xdd => 0x830c, 0xde => 0x82fb, 0xdf => 0x82d3, 0xe0 => 0x8311,
+    0xe1 => 0x831a, 0xe2 => 0x8306, 0xe3 => 0x8314, 0xe4 => 0x8315,
+    0xe5 => 0x82e0, 0xe6 => 0x82d5, 0xe7 => 0x831c, 0xe8 => 0x8351,
+    0xe9 => 0x835b, 0xea => 0x835c, 0xeb => 0x8308, 0xec => 0x8392,
+    0xed => 0x833c, 0xee => 0x8334, 0xef => 0x8331, 0xf0 => 0x839b,
+    0xf1 => 0x835e, 0xf2 => 0x832f, 0xf3 => 0x834f, 0xf4 => 0x8347,
+    0xf5 => 0x8343, 0xf6 => 0x835f, 0xf7 => 0x8340, 0xf8 => 0x8317,
+    0xf9 => 0x8360, 0xfa => 0x832d, 0xfb => 0x833a, 0xfc => 0x8333,
+    0xfd => 0x8366, 0xfe => 0x8365,
+  },
+  0xdd => {
+    0xa1 => 0x8368, 0xa2 => 0x831b, 0xa3 => 0x8369, 0xa4 => 0x836c,
+    0xa5 => 0x836a, 0xa6 => 0x836d, 0xa7 => 0x836e, 0xa8 => 0x83b0,
+    0xa9 => 0x8378, 0xaa => 0x83b3, 0xab => 0x83b4, 0xac => 0x83a0,
+    0xad => 0x83aa, 0xae => 0x8393, 0xaf => 0x839c, 0xb0 => 0x8385,
+    0xb1 => 0x837c, 0xb2 => 0x83b6, 0xb3 => 0x83a9, 0xb4 => 0x837d,
+    0xb5 => 0x83b8, 0xb6 => 0x837b, 0xb7 => 0x8398, 0xb8 => 0x839e,
+    0xb9 => 0x83a8, 0xba => 0x83ba, 0xbb => 0x83bc, 0xbc => 0x83c1,
+    0xbd => 0x8401, 0xbe => 0x83e5, 0xbf => 0x83d8, 0xc0 => 0x5807,
+    0xc1 => 0x8418, 0xc2 => 0x840b, 0xc3 => 0x83dd, 0xc4 => 0x83fd,
+    0xc5 => 0x83d6, 0xc6 => 0x841c, 0xc7 => 0x8438, 0xc8 => 0x8411,
+    0xc9 => 0x8406, 0xca => 0x83d4, 0xcb => 0x83df, 0xcc => 0x840f,
+    0xcd => 0x8403, 0xce => 0x83f8, 0xcf => 0x83f9, 0xd0 => 0x83ea,
+    0xd1 => 0x83c5, 0xd2 => 0x83c0, 0xd3 => 0x8426, 0xd4 => 0x83f0,
+    0xd5 => 0x83e1, 0xd6 => 0x845c, 0xd7 => 0x8451, 0xd8 => 0x845a,
+    0xd9 => 0x8459, 0xda => 0x8473, 0xdb => 0x8487, 0xdc => 0x8488,
+    0xdd => 0x847a, 0xde => 0x8489, 0xdf => 0x8478, 0xe0 => 0x843c,
+    0xe1 => 0x8446, 0xe2 => 0x8469, 0xe3 => 0x8476, 0xe4 => 0x848c,
+    0xe5 => 0x848e, 0xe6 => 0x8431, 0xe7 => 0x846d, 0xe8 => 0x84c1,
+    0xe9 => 0x84cd, 0xea => 0x84d0, 0xeb => 0x84e6, 0xec => 0x84bd,
+    0xed => 0x84d3, 0xee => 0x84ca, 0xef => 0x84bf, 0xf0 => 0x84ba,
+    0xf1 => 0x84e0, 0xf2 => 0x84a1, 0xf3 => 0x84b9, 0xf4 => 0x84b4,
+    0xf5 => 0x8497, 0xf6 => 0x84e5, 0xf7 => 0x84e3, 0xf8 => 0x850c,
+    0xf9 => 0x750d, 0xfa => 0x8538, 0xfb => 0x84f0, 0xfc => 0x8539,
+    0xfd => 0x851f, 0xfe => 0x853a,
+  },
+  0xde => {
+    0xa1 => 0x8556, 0xa2 => 0x853b, 0xa3 => 0x84ff, 0xa4 => 0x84fc,
+    0xa5 => 0x8559, 0xa6 => 0x8548, 0xa7 => 0x8568, 0xa8 => 0x8564,
+    0xa9 => 0x855e, 0xaa => 0x857a, 0xab => 0x77a2, 0xac => 0x8543,
+    0xad => 0x8572, 0xae => 0x857b, 0xaf => 0x85a4, 0xb0 => 0x85a8,
+    0xb1 => 0x8587, 0xb2 => 0x858f, 0xb3 => 0x8579, 0xb4 => 0x85ae,
+    0xb5 => 0x859c, 0xb6 => 0x8585, 0xb7 => 0x85b9, 0xb8 => 0x85b7,
+    0xb9 => 0x85b0, 0xba => 0x85d3, 0xbb => 0x85c1, 0xbc => 0x85dc,
+    0xbd => 0x85ff, 0xbe => 0x8627, 0xbf => 0x8605, 0xc0 => 0x8629,
+    0xc1 => 0x8616, 0xc2 => 0x863c, 0xc3 => 0x5efe, 0xc4 => 0x5f08,
+    0xc5 => 0x593c, 0xc6 => 0x5941, 0xc7 => 0x8037, 0xc8 => 0x5955,
+    0xc9 => 0x595a, 0xca => 0x5958, 0xcb => 0x530f, 0xcc => 0x5c22,
+    0xcd => 0x5c25, 0xce => 0x5c2c, 0xcf => 0x5c34, 0xd0 => 0x624c,
+    0xd1 => 0x626a, 0xd2 => 0x629f, 0xd3 => 0x62bb, 0xd4 => 0x62ca,
+    0xd5 => 0x62da, 0xd6 => 0x62d7, 0xd7 => 0x62ee, 0xd8 => 0x6322,
+    0xd9 => 0x62f6, 0xda => 0x6339, 0xdb => 0x634b, 0xdc => 0x6343,
+    0xdd => 0x63ad, 0xde => 0x63f6, 0xdf => 0x6371, 0xe0 => 0x637a,
+    0xe1 => 0x638e, 0xe2 => 0x63b4, 0xe3 => 0x636d, 0xe4 => 0x63ac,
+    0xe5 => 0x638a, 0xe6 => 0x6369, 0xe7 => 0x63ae, 0xe8 => 0x63bc,
+    0xe9 => 0x63f2, 0xea => 0x63f8, 0xeb => 0x63e0, 0xec => 0x63ff,
+    0xed => 0x63c4, 0xee => 0x63de, 0xef => 0x63ce, 0xf0 => 0x6452,
+    0xf1 => 0x63c6, 0xf2 => 0x63be, 0xf3 => 0x6445, 0xf4 => 0x6441,
+    0xf5 => 0x640b, 0xf6 => 0x641b, 0xf7 => 0x6420, 0xf8 => 0x640c,
+    0xf9 => 0x6426, 0xfa => 0x6421, 0xfb => 0x645e, 0xfc => 0x6484,
+    0xfd => 0x646d, 0xfe => 0x6496,
+  },
+  0xdf => {
+    0xa1 => 0x647a, 0xa2 => 0x64b7, 0xa3 => 0x64b8, 0xa4 => 0x6499,
+    0xa5 => 0x64ba, 0xa6 => 0x64c0, 0xa7 => 0x64d0, 0xa8 => 0x64d7,
+    0xa9 => 0x64e4, 0xaa => 0x64e2, 0xab => 0x6509, 0xac => 0x6525,
+    0xad => 0x652e, 0xae => 0x5f0b, 0xaf => 0x5fd2, 0xb0 => 0x7519,
+    0xb1 => 0x5f11, 0xb2 => 0x535f, 0xb3 => 0x53f1, 0xb4 => 0x53fd,
+    0xb5 => 0x53e9, 0xb6 => 0x53e8, 0xb7 => 0x53fb, 0xb8 => 0x5412,
+    0xb9 => 0x5416, 0xba => 0x5406, 0xbb => 0x544b, 0xbc => 0x5452,
+    0xbd => 0x5453, 0xbe => 0x5454, 0xbf => 0x5456, 0xc0 => 0x5443,
+    0xc1 => 0x5421, 0xc2 => 0x5457, 0xc3 => 0x5459, 0xc4 => 0x5423,
+    0xc5 => 0x5432, 0xc6 => 0x5482, 0xc7 => 0x5494, 0xc8 => 0x5477,
+    0xc9 => 0x5471, 0xca => 0x5464, 0xcb => 0x549a, 0xcc => 0x549b,
+    0xcd => 0x5484, 0xce => 0x5476, 0xcf => 0x5466, 0xd0 => 0x549d,
+    0xd1 => 0x54d0, 0xd2 => 0x54ad, 0xd3 => 0x54c2, 0xd4 => 0x54b4,
+    0xd5 => 0x54d2, 0xd6 => 0x54a7, 0xd7 => 0x54a6, 0xd8 => 0x54d3,
+    0xd9 => 0x54d4, 0xda => 0x5472, 0xdb => 0x54a3, 0xdc => 0x54d5,
+    0xdd => 0x54bb, 0xde => 0x54bf, 0xdf => 0x54cc, 0xe0 => 0x54d9,
+    0xe1 => 0x54da, 0xe2 => 0x54dc, 0xe3 => 0x54a9, 0xe4 => 0x54aa,
+    0xe5 => 0x54a4, 0xe6 => 0x54dd, 0xe7 => 0x54cf, 0xe8 => 0x54de,
+    0xe9 => 0x551b, 0xea => 0x54e7, 0xeb => 0x5520, 0xec => 0x54fd,
+    0xed => 0x5514, 0xee => 0x54f3, 0xef => 0x5522, 0xf0 => 0x5523,
+    0xf1 => 0x550f, 0xf2 => 0x5511, 0xf3 => 0x5527, 0xf4 => 0x552a,
+    0xf5 => 0x5567, 0xf6 => 0x558f, 0xf7 => 0x55b5, 0xf8 => 0x5549,
+    0xf9 => 0x556d, 0xfa => 0x5541, 0xfb => 0x5555, 0xfc => 0x553f,
+    0xfd => 0x5550, 0xfe => 0x553c,
+  },
+  0xe0 => {
+    0xa1 => 0x5537, 0xa2 => 0x5556, 0xa3 => 0x5575, 0xa4 => 0x5576,
+    0xa5 => 0x5577, 0xa6 => 0x5533, 0xa7 => 0x5530, 0xa8 => 0x555c,
+    0xa9 => 0x558b, 0xaa => 0x55d2, 0xab => 0x5583, 0xac => 0x55b1,
+    0xad => 0x55b9, 0xae => 0x5588, 0xaf => 0x5581, 0xb0 => 0x559f,
+    0xb1 => 0x557e, 0xb2 => 0x55d6, 0xb3 => 0x5591, 0xb4 => 0x557b,
+    0xb5 => 0x55df, 0xb6 => 0x55bd, 0xb7 => 0x55be, 0xb8 => 0x5594,
+    0xb9 => 0x5599, 0xba => 0x55ea, 0xbb => 0x55f7, 0xbc => 0x55c9,
+    0xbd => 0x561f, 0xbe => 0x55d1, 0xbf => 0x55eb, 0xc0 => 0x55ec,
+    0xc1 => 0x55d4, 0xc2 => 0x55e6, 0xc3 => 0x55dd, 0xc4 => 0x55c4,
+    0xc5 => 0x55ef, 0xc6 => 0x55e5, 0xc7 => 0x55f2, 0xc8 => 0x55f3,
+    0xc9 => 0x55cc, 0xca => 0x55cd, 0xcb => 0x55e8, 0xcc => 0x55f5,
+    0xcd => 0x55e4, 0xce => 0x8f94, 0xcf => 0x561e, 0xd0 => 0x5608,
+    0xd1 => 0x560c, 0xd2 => 0x5601, 0xd3 => 0x5624, 0xd4 => 0x5623,
+    0xd5 => 0x55fe, 0xd6 => 0x5600, 0xd7 => 0x5627, 0xd8 => 0x562d,
+    0xd9 => 0x5658, 0xda => 0x5639, 0xdb => 0x5657, 0xdc => 0x562c,
+    0xdd => 0x564d, 0xde => 0x5662, 0xdf => 0x5659, 0xe0 => 0x565c,
+    0xe1 => 0x564c, 0xe2 => 0x5654, 0xe3 => 0x5686, 0xe4 => 0x5664,
+    0xe5 => 0x5671, 0xe6 => 0x566b, 0xe7 => 0x567b, 0xe8 => 0x567c,
+    0xe9 => 0x5685, 0xea => 0x5693, 0xeb => 0x56af, 0xec => 0x56d4,
+    0xed => 0x56d7, 0xee => 0x56dd, 0xef => 0x56e1, 0xf0 => 0x56f5,
+    0xf1 => 0x56eb, 0xf2 => 0x56f9, 0xf3 => 0x56ff, 0xf4 => 0x5704,
+    0xf5 => 0x570a, 0xf6 => 0x5709, 0xf7 => 0x571c, 0xf8 => 0x5e0f,
+    0xf9 => 0x5e19, 0xfa => 0x5e14, 0xfb => 0x5e11, 0xfc => 0x5e31,
+    0xfd => 0x5e3b, 0xfe => 0x5e3c,
+  },
+  0xe1 => {
+    0xa1 => 0x5e37, 0xa2 => 0x5e44, 0xa3 => 0x5e54, 0xa4 => 0x5e5b,
+    0xa5 => 0x5e5e, 0xa6 => 0x5e61, 0xa7 => 0x5c8c, 0xa8 => 0x5c7a,
+    0xa9 => 0x5c8d, 0xaa => 0x5c90, 0xab => 0x5c96, 0xac => 0x5c88,
+    0xad => 0x5c98, 0xae => 0x5c99, 0xaf => 0x5c91, 0xb0 => 0x5c9a,
+    0xb1 => 0x5c9c, 0xb2 => 0x5cb5, 0xb3 => 0x5ca2, 0xb4 => 0x5cbd,
+    0xb5 => 0x5cac, 0xb6 => 0x5cab, 0xb7 => 0x5cb1, 0xb8 => 0x5ca3,
+    0xb9 => 0x5cc1, 0xba => 0x5cb7, 0xbb => 0x5cc4, 0xbc => 0x5cd2,
+    0xbd => 0x5ce4, 0xbe => 0x5ccb, 0xbf => 0x5ce5, 0xc0 => 0x5d02,
+    0xc1 => 0x5d03, 0xc2 => 0x5d27, 0xc3 => 0x5d26, 0xc4 => 0x5d2e,
+    0xc5 => 0x5d24, 0xc6 => 0x5d1e, 0xc7 => 0x5d06, 0xc8 => 0x5d1b,
+    0xc9 => 0x5d58, 0xca => 0x5d3e, 0xcb => 0x5d34, 0xcc => 0x5d3d,
+    0xcd => 0x5d6c, 0xce => 0x5d5b, 0xcf => 0x5d6f, 0xd0 => 0x5d5d,
+    0xd1 => 0x5d6b, 0xd2 => 0x5d4b, 0xd3 => 0x5d4a, 0xd4 => 0x5d69,
+    0xd5 => 0x5d74, 0xd6 => 0x5d82, 0xd7 => 0x5d99, 0xd8 => 0x5d9d,
+    0xd9 => 0x8c73, 0xda => 0x5db7, 0xdb => 0x5dc5, 0xdc => 0x5f73,
+    0xdd => 0x5f77, 0xde => 0x5f82, 0xdf => 0x5f87, 0xe0 => 0x5f89,
+    0xe1 => 0x5f8c, 0xe2 => 0x5f95, 0xe3 => 0x5f99, 0xe4 => 0x5f9c,
+    0xe5 => 0x5fa8, 0xe6 => 0x5fad, 0xe7 => 0x5fb5, 0xe8 => 0x5fbc,
+    0xe9 => 0x8862, 0xea => 0x5f61, 0xeb => 0x72ad, 0xec => 0x72b0,
+    0xed => 0x72b4, 0xee => 0x72b7, 0xef => 0x72b8, 0xf0 => 0x72c3,
+    0xf1 => 0x72c1, 0xf2 => 0x72ce, 0xf3 => 0x72cd, 0xf4 => 0x72d2,
+    0xf5 => 0x72e8, 0xf6 => 0x72ef, 0xf7 => 0x72e9, 0xf8 => 0x72f2,
+    0xf9 => 0x72f4, 0xfa => 0x72f7, 0xfb => 0x7301, 0xfc => 0x72f3,
+    0xfd => 0x7303, 0xfe => 0x72fa,
+  },
+  0xe2 => {
+    0xa1 => 0x72fb, 0xa2 => 0x7317, 0xa3 => 0x7313, 0xa4 => 0x7321,
+    0xa5 => 0x730a, 0xa6 => 0x731e, 0xa7 => 0x731d, 0xa8 => 0x7315,
+    0xa9 => 0x7322, 0xaa => 0x7339, 0xab => 0x7325, 0xac => 0x732c,
+    0xad => 0x7338, 0xae => 0x7331, 0xaf => 0x7350, 0xb0 => 0x734d,
+    0xb1 => 0x7357, 0xb2 => 0x7360, 0xb3 => 0x736c, 0xb4 => 0x736f,
+    0xb5 => 0x737e, 0xb6 => 0x821b, 0xb7 => 0x5925, 0xb8 => 0x98e7,
+    0xb9 => 0x5924, 0xba => 0x5902, 0xbb => 0x9963, 0xbc => 0x9967,
+    0xbd => 0x9968, 0xbe => 0x9969, 0xbf => 0x996a, 0xc0 => 0x996b,
+    0xc1 => 0x996c, 0xc2 => 0x9974, 0xc3 => 0x9977, 0xc4 => 0x997d,
+    0xc5 => 0x9980, 0xc6 => 0x9984, 0xc7 => 0x9987, 0xc8 => 0x998a,
+    0xc9 => 0x998d, 0xca => 0x9990, 0xcb => 0x9991, 0xcc => 0x9993,
+    0xcd => 0x9994, 0xce => 0x9995, 0xcf => 0x5e80, 0xd0 => 0x5e91,
+    0xd1 => 0x5e8b, 0xd2 => 0x5e96, 0xd3 => 0x5ea5, 0xd4 => 0x5ea0,
+    0xd5 => 0x5eb9, 0xd6 => 0x5eb5, 0xd7 => 0x5ebe, 0xd8 => 0x5eb3,
+    0xd9 => 0x8d53, 0xda => 0x5ed2, 0xdb => 0x5ed1, 0xdc => 0x5edb,
+    0xdd => 0x5ee8, 0xde => 0x5eea, 0xdf => 0x81ba, 0xe0 => 0x5fc4,
+    0xe1 => 0x5fc9, 0xe2 => 0x5fd6, 0xe3 => 0x5fcf, 0xe4 => 0x6003,
+    0xe5 => 0x5fee, 0xe6 => 0x6004, 0xe7 => 0x5fe1, 0xe8 => 0x5fe4,
+    0xe9 => 0x5ffe, 0xea => 0x6005, 0xeb => 0x6006, 0xec => 0x5fea,
+    0xed => 0x5fed, 0xee => 0x5ff8, 0xef => 0x6019, 0xf0 => 0x6035,
+    0xf1 => 0x6026, 0xf2 => 0x601b, 0xf3 => 0x600f, 0xf4 => 0x600d,
+    0xf5 => 0x6029, 0xf6 => 0x602b, 0xf7 => 0x600a, 0xf8 => 0x603f,
+    0xf9 => 0x6021, 0xfa => 0x6078, 0xfb => 0x6079, 0xfc => 0x607b,
+    0xfd => 0x607a, 0xfe => 0x6042,
+  },
+  0xe3 => {
+    0xa1 => 0x606a, 0xa2 => 0x607d, 0xa3 => 0x6096, 0xa4 => 0x609a,
+    0xa5 => 0x60ad, 0xa6 => 0x609d, 0xa7 => 0x6083, 0xa8 => 0x6092,
+    0xa9 => 0x608c, 0xaa => 0x609b, 0xab => 0x60ec, 0xac => 0x60bb,
+    0xad => 0x60b1, 0xae => 0x60dd, 0xaf => 0x60d8, 0xb0 => 0x60c6,
+    0xb1 => 0x60da, 0xb2 => 0x60b4, 0xb3 => 0x6120, 0xb4 => 0x6126,
+    0xb5 => 0x6115, 0xb6 => 0x6123, 0xb7 => 0x60f4, 0xb8 => 0x6100,
+    0xb9 => 0x610e, 0xba => 0x612b, 0xbb => 0x614a, 0xbc => 0x6175,
+    0xbd => 0x61ac, 0xbe => 0x6194, 0xbf => 0x61a7, 0xc0 => 0x61b7,
+    0xc1 => 0x61d4, 0xc2 => 0x61f5, 0xc3 => 0x5fdd, 0xc4 => 0x96b3,
+    0xc5 => 0x95e9, 0xc6 => 0x95eb, 0xc7 => 0x95f1, 0xc8 => 0x95f3,
+    0xc9 => 0x95f5, 0xca => 0x95f6, 0xcb => 0x95fc, 0xcc => 0x95fe,
+    0xcd => 0x9603, 0xce => 0x9604, 0xcf => 0x9606, 0xd0 => 0x9608,
+    0xd1 => 0x960a, 0xd2 => 0x960b, 0xd3 => 0x960c, 0xd4 => 0x960d,
+    0xd5 => 0x960f, 0xd6 => 0x9612, 0xd7 => 0x9615, 0xd8 => 0x9616,
+    0xd9 => 0x9617, 0xda => 0x9619, 0xdb => 0x961a, 0xdc => 0x4e2c,
+    0xdd => 0x723f, 0xde => 0x6215, 0xdf => 0x6c35, 0xe0 => 0x6c54,
+    0xe1 => 0x6c5c, 0xe2 => 0x6c4a, 0xe3 => 0x6ca3, 0xe4 => 0x6c85,
+    0xe5 => 0x6c90, 0xe6 => 0x6c94, 0xe7 => 0x6c8c, 0xe8 => 0x6c68,
+    0xe9 => 0x6c69, 0xea => 0x6c74, 0xeb => 0x6c76, 0xec => 0x6c86,
+    0xed => 0x6ca9, 0xee => 0x6cd0, 0xef => 0x6cd4, 0xf0 => 0x6cad,
+    0xf1 => 0x6cf7, 0xf2 => 0x6cf8, 0xf3 => 0x6cf1, 0xf4 => 0x6cd7,
+    0xf5 => 0x6cb2, 0xf6 => 0x6ce0, 0xf7 => 0x6cd6, 0xf8 => 0x6cfa,
+    0xf9 => 0x6ceb, 0xfa => 0x6cee, 0xfb => 0x6cb1, 0xfc => 0x6cd3,
+    0xfd => 0x6cef, 0xfe => 0x6cfe,
+  },
+  0xe4 => {
+    0xa1 => 0x6d39, 0xa2 => 0x6d27, 0xa3 => 0x6d0c, 0xa4 => 0x6d43,
+    0xa5 => 0x6d48, 0xa6 => 0x6d07, 0xa7 => 0x6d04, 0xa8 => 0x6d19,
+    0xa9 => 0x6d0e, 0xaa => 0x6d2b, 0xab => 0x6d4d, 0xac => 0x6d2e,
+    0xad => 0x6d35, 0xae => 0x6d1a, 0xaf => 0x6d4f, 0xb0 => 0x6d52,
+    0xb1 => 0x6d54, 0xb2 => 0x6d33, 0xb3 => 0x6d91, 0xb4 => 0x6d6f,
+    0xb5 => 0x6d9e, 0xb6 => 0x6da0, 0xb7 => 0x6d5e, 0xb8 => 0x6d93,
+    0xb9 => 0x6d94, 0xba => 0x6d5c, 0xbb => 0x6d60, 0xbc => 0x6d7c,
+    0xbd => 0x6d63, 0xbe => 0x6e1a, 0xbf => 0x6dc7, 0xc0 => 0x6dc5,
+    0xc1 => 0x6dde, 0xc2 => 0x6e0e, 0xc3 => 0x6dbf, 0xc4 => 0x6de0,
+    0xc5 => 0x6e11, 0xc6 => 0x6de6, 0xc7 => 0x6ddd, 0xc8 => 0x6dd9,
+    0xc9 => 0x6e16, 0xca => 0x6dab, 0xcb => 0x6e0c, 0xcc => 0x6dae,
+    0xcd => 0x6e2b, 0xce => 0x6e6e, 0xcf => 0x6e4e, 0xd0 => 0x6e6b,
+    0xd1 => 0x6eb2, 0xd2 => 0x6e5f, 0xd3 => 0x6e86, 0xd4 => 0x6e53,
+    0xd5 => 0x6e54, 0xd6 => 0x6e32, 0xd7 => 0x6e25, 0xd8 => 0x6e44,
+    0xd9 => 0x6edf, 0xda => 0x6eb1, 0xdb => 0x6e98, 0xdc => 0x6ee0,
+    0xdd => 0x6f2d, 0xde => 0x6ee2, 0xdf => 0x6ea5, 0xe0 => 0x6ea7,
+    0xe1 => 0x6ebd, 0xe2 => 0x6ebb, 0xe3 => 0x6eb7, 0xe4 => 0x6ed7,
+    0xe5 => 0x6eb4, 0xe6 => 0x6ecf, 0xe7 => 0x6e8f, 0xe8 => 0x6ec2,
+    0xe9 => 0x6e9f, 0xea => 0x6f62, 0xeb => 0x6f46, 0xec => 0x6f47,
+    0xed => 0x6f24, 0xee => 0x6f15, 0xef => 0x6ef9, 0xf0 => 0x6f2f,
+    0xf1 => 0x6f36, 0xf2 => 0x6f4b, 0xf3 => 0x6f74, 0xf4 => 0x6f2a,
+    0xf5 => 0x6f09, 0xf6 => 0x6f29, 0xf7 => 0x6f89, 0xf8 => 0x6f8d,
+    0xf9 => 0x6f8c, 0xfa => 0x6f78, 0xfb => 0x6f72, 0xfc => 0x6f7c,
+    0xfd => 0x6f7a, 0xfe => 0x6fd1,
+  },
+  0xe5 => {
+    0xa1 => 0x6fc9, 0xa2 => 0x6fa7, 0xa3 => 0x6fb9, 0xa4 => 0x6fb6,
+    0xa5 => 0x6fc2, 0xa6 => 0x6fe1, 0xa7 => 0x6fee, 0xa8 => 0x6fde,
+    0xa9 => 0x6fe0, 0xaa => 0x6fef, 0xab => 0x701a, 0xac => 0x7023,
+    0xad => 0x701b, 0xae => 0x7039, 0xaf => 0x7035, 0xb0 => 0x704f,
+    0xb1 => 0x705e, 0xb2 => 0x5b80, 0xb3 => 0x5b84, 0xb4 => 0x5b95,
+    0xb5 => 0x5b93, 0xb6 => 0x5ba5, 0xb7 => 0x5bb8, 0xb8 => 0x752f,
+    0xb9 => 0x9a9e, 0xba => 0x6434, 0xbb => 0x5be4, 0xbc => 0x5bee,
+    0xbd => 0x8930, 0xbe => 0x5bf0, 0xbf => 0x8e47, 0xc0 => 0x8b07,
+    0xc1 => 0x8fb6, 0xc2 => 0x8fd3, 0xc3 => 0x8fd5, 0xc4 => 0x8fe5,
+    0xc5 => 0x8fee, 0xc6 => 0x8fe4, 0xc7 => 0x8fe9, 0xc8 => 0x8fe6,
+    0xc9 => 0x8ff3, 0xca => 0x8fe8, 0xcb => 0x9005, 0xcc => 0x9004,
+    0xcd => 0x900b, 0xce => 0x9026, 0xcf => 0x9011, 0xd0 => 0x900d,
+    0xd1 => 0x9016, 0xd2 => 0x9021, 0xd3 => 0x9035, 0xd4 => 0x9036,
+    0xd5 => 0x902d, 0xd6 => 0x902f, 0xd7 => 0x9044, 0xd8 => 0x9051,
+    0xd9 => 0x9052, 0xda => 0x9050, 0xdb => 0x9068, 0xdc => 0x9058,
+    0xdd => 0x9062, 0xde => 0x905b, 0xdf => 0x66b9, 0xe0 => 0x9074,
+    0xe1 => 0x907d, 0xe2 => 0x9082, 0xe3 => 0x9088, 0xe4 => 0x9083,
+    0xe5 => 0x908b, 0xe6 => 0x5f50, 0xe7 => 0x5f57, 0xe8 => 0x5f56,
+    0xe9 => 0x5f58, 0xea => 0x5c3b, 0xeb => 0x54ab, 0xec => 0x5c50,
+    0xed => 0x5c59, 0xee => 0x5b71, 0xef => 0x5c63, 0xf0 => 0x5c66,
+    0xf1 => 0x7fbc, 0xf2 => 0x5f2a, 0xf3 => 0x5f29, 0xf4 => 0x5f2d,
+    0xf5 => 0x8274, 0xf6 => 0x5f3c, 0xf7 => 0x9b3b, 0xf8 => 0x5c6e,
+    0xf9 => 0x5981, 0xfa => 0x5983, 0xfb => 0x598d, 0xfc => 0x59a9,
+    0xfd => 0x59aa, 0xfe => 0x59a3,
+  },
+  0xe6 => {
+    0xa1 => 0x5997, 0xa2 => 0x59ca, 0xa3 => 0x59ab, 0xa4 => 0x599e,
+    0xa5 => 0x59a4, 0xa6 => 0x59d2, 0xa7 => 0x59b2, 0xa8 => 0x59af,
+    0xa9 => 0x59d7, 0xaa => 0x59be, 0xab => 0x5a05, 0xac => 0x5a06,
+    0xad => 0x59dd, 0xae => 0x5a08, 0xaf => 0x59e3, 0xb0 => 0x59d8,
+    0xb1 => 0x59f9, 0xb2 => 0x5a0c, 0xb3 => 0x5a09, 0xb4 => 0x5a32,
+    0xb5 => 0x5a34, 0xb6 => 0x5a11, 0xb7 => 0x5a23, 0xb8 => 0x5a13,
+    0xb9 => 0x5a40, 0xba => 0x5a67, 0xbb => 0x5a4a, 0xbc => 0x5a55,
+    0xbd => 0x5a3c, 0xbe => 0x5a62, 0xbf => 0x5a75, 0xc0 => 0x80ec,
+    0xc1 => 0x5aaa, 0xc2 => 0x5a9b, 0xc3 => 0x5a77, 0xc4 => 0x5a7a,
+    0xc5 => 0x5abe, 0xc6 => 0x5aeb, 0xc7 => 0x5ab2, 0xc8 => 0x5ad2,
+    0xc9 => 0x5ad4, 0xca => 0x5ab8, 0xcb => 0x5ae0, 0xcc => 0x5ae3,
+    0xcd => 0x5af1, 0xce => 0x5ad6, 0xcf => 0x5ae6, 0xd0 => 0x5ad8,
+    0xd1 => 0x5adc, 0xd2 => 0x5b09, 0xd3 => 0x5b17, 0xd4 => 0x5b16,
+    0xd5 => 0x5b32, 0xd6 => 0x5b37, 0xd7 => 0x5b40, 0xd8 => 0x5c15,
+    0xd9 => 0x5c1c, 0xda => 0x5b5a, 0xdb => 0x5b65, 0xdc => 0x5b73,
+    0xdd => 0x5b51, 0xde => 0x5b53, 0xdf => 0x5b62, 0xe0 => 0x9a75,
+    0xe1 => 0x9a77, 0xe2 => 0x9a78, 0xe3 => 0x9a7a, 0xe4 => 0x9a7f,
+    0xe5 => 0x9a7d, 0xe6 => 0x9a80, 0xe7 => 0x9a81, 0xe8 => 0x9a85,
+    0xe9 => 0x9a88, 0xea => 0x9a8a, 0xeb => 0x9a90, 0xec => 0x9a92,
+    0xed => 0x9a93, 0xee => 0x9a96, 0xef => 0x9a98, 0xf0 => 0x9a9b,
+    0xf1 => 0x9a9c, 0xf2 => 0x9a9d, 0xf3 => 0x9a9f, 0xf4 => 0x9aa0,
+    0xf5 => 0x9aa2, 0xf6 => 0x9aa3, 0xf7 => 0x9aa5, 0xf8 => 0x9aa7,
+    0xf9 => 0x7e9f, 0xfa => 0x7ea1, 0xfb => 0x7ea3, 0xfc => 0x7ea5,
+    0xfd => 0x7ea8, 0xfe => 0x7ea9,
+  },
+  0xe7 => {
+    0xa1 => 0x7ead, 0xa2 => 0x7eb0, 0xa3 => 0x7ebe, 0xa4 => 0x7ec0,
+    0xa5 => 0x7ec1, 0xa6 => 0x7ec2, 0xa7 => 0x7ec9, 0xa8 => 0x7ecb,
+    0xa9 => 0x7ecc, 0xaa => 0x7ed0, 0xab => 0x7ed4, 0xac => 0x7ed7,
+    0xad => 0x7edb, 0xae => 0x7ee0, 0xaf => 0x7ee1, 0xb0 => 0x7ee8,
+    0xb1 => 0x7eeb, 0xb2 => 0x7eee, 0xb3 => 0x7eef, 0xb4 => 0x7ef1,
+    0xb5 => 0x7ef2, 0xb6 => 0x7f0d, 0xb7 => 0x7ef6, 0xb8 => 0x7efa,
+    0xb9 => 0x7efb, 0xba => 0x7efe, 0xbb => 0x7f01, 0xbc => 0x7f02,
+    0xbd => 0x7f03, 0xbe => 0x7f07, 0xbf => 0x7f08, 0xc0 => 0x7f0b,
+    0xc1 => 0x7f0c, 0xc2 => 0x7f0f, 0xc3 => 0x7f11, 0xc4 => 0x7f12,
+    0xc5 => 0x7f17, 0xc6 => 0x7f19, 0xc7 => 0x7f1c, 0xc8 => 0x7f1b,
+    0xc9 => 0x7f1f, 0xca => 0x7f21, 0xcb => 0x7f22, 0xcc => 0x7f23,
+    0xcd => 0x7f24, 0xce => 0x7f25, 0xcf => 0x7f26, 0xd0 => 0x7f27,
+    0xd1 => 0x7f2a, 0xd2 => 0x7f2b, 0xd3 => 0x7f2c, 0xd4 => 0x7f2d,
+    0xd5 => 0x7f2f, 0xd6 => 0x7f30, 0xd7 => 0x7f31, 0xd8 => 0x7f32,
+    0xd9 => 0x7f33, 0xda => 0x7f35, 0xdb => 0x5e7a, 0xdc => 0x757f,
+    0xdd => 0x5ddb, 0xde => 0x753e, 0xdf => 0x9095, 0xe0 => 0x738e,
+    0xe1 => 0x7391, 0xe2 => 0x73ae, 0xe3 => 0x73a2, 0xe4 => 0x739f,
+    0xe5 => 0x73cf, 0xe6 => 0x73c2, 0xe7 => 0x73d1, 0xe8 => 0x73b7,
+    0xe9 => 0x73b3, 0xea => 0x73c0, 0xeb => 0x73c9, 0xec => 0x73c8,
+    0xed => 0x73e5, 0xee => 0x73d9, 0xef => 0x987c, 0xf0 => 0x740a,
+    0xf1 => 0x73e9, 0xf2 => 0x73e7, 0xf3 => 0x73de, 0xf4 => 0x73ba,
+    0xf5 => 0x73f2, 0xf6 => 0x740f, 0xf7 => 0x742a, 0xf8 => 0x745b,
+    0xf9 => 0x7426, 0xfa => 0x7425, 0xfb => 0x7428, 0xfc => 0x7430,
+    0xfd => 0x742e, 0xfe => 0x742c,
+  },
+  0xe8 => {
+    0xa1 => 0x741b, 0xa2 => 0x741a, 0xa3 => 0x7441, 0xa4 => 0x745c,
+    0xa5 => 0x7457, 0xa6 => 0x7455, 0xa7 => 0x7459, 0xa8 => 0x7477,
+    0xa9 => 0x746d, 0xaa => 0x747e, 0xab => 0x749c, 0xac => 0x748e,
+    0xad => 0x7480, 0xae => 0x7481, 0xaf => 0x7487, 0xb0 => 0x748b,
+    0xb1 => 0x749e, 0xb2 => 0x74a8, 0xb3 => 0x74a9, 0xb4 => 0x7490,
+    0xb5 => 0x74a7, 0xb6 => 0x74d2, 0xb7 => 0x74ba, 0xb8 => 0x97ea,
+    0xb9 => 0x97eb, 0xba => 0x97ec, 0xbb => 0x674c, 0xbc => 0x6753,
+    0xbd => 0x675e, 0xbe => 0x6748, 0xbf => 0x6769, 0xc0 => 0x67a5,
+    0xc1 => 0x6787, 0xc2 => 0x676a, 0xc3 => 0x6773, 0xc4 => 0x6798,
+    0xc5 => 0x67a7, 0xc6 => 0x6775, 0xc7 => 0x67a8, 0xc8 => 0x679e,
+    0xc9 => 0x67ad, 0xca => 0x678b, 0xcb => 0x6777, 0xcc => 0x677c,
+    0xcd => 0x67f0, 0xce => 0x6809, 0xcf => 0x67d8, 0xd0 => 0x680a,
+    0xd1 => 0x67e9, 0xd2 => 0x67b0, 0xd3 => 0x680c, 0xd4 => 0x67d9,
+    0xd5 => 0x67b5, 0xd6 => 0x67da, 0xd7 => 0x67b3, 0xd8 => 0x67dd,
+    0xd9 => 0x6800, 0xda => 0x67c3, 0xdb => 0x67b8, 0xdc => 0x67e2,
+    0xdd => 0x680e, 0xde => 0x67c1, 0xdf => 0x67fd, 0xe0 => 0x6832,
+    0xe1 => 0x6833, 0xe2 => 0x6860, 0xe3 => 0x6861, 0xe4 => 0x684e,
+    0xe5 => 0x6862, 0xe6 => 0x6844, 0xe7 => 0x6864, 0xe8 => 0x6883,
+    0xe9 => 0x681d, 0xea => 0x6855, 0xeb => 0x6866, 0xec => 0x6841,
+    0xed => 0x6867, 0xee => 0x6840, 0xef => 0x683e, 0xf0 => 0x684a,
+    0xf1 => 0x6849, 0xf2 => 0x6829, 0xf3 => 0x68b5, 0xf4 => 0x688f,
+    0xf5 => 0x6874, 0xf6 => 0x6877, 0xf7 => 0x6893, 0xf8 => 0x686b,
+    0xf9 => 0x68c2, 0xfa => 0x696e, 0xfb => 0x68fc, 0xfc => 0x691f,
+    0xfd => 0x6920, 0xfe => 0x68f9,
+  },
+  0xe9 => {
+    0xa1 => 0x6924, 0xa2 => 0x68f0, 0xa3 => 0x690b, 0xa4 => 0x6901,
+    0xa5 => 0x6957, 0xa6 => 0x68e3, 0xa7 => 0x6910, 0xa8 => 0x6971,
+    0xa9 => 0x6939, 0xaa => 0x6960, 0xab => 0x6942, 0xac => 0x695d,
+    0xad => 0x6984, 0xae => 0x696b, 0xaf => 0x6980, 0xb0 => 0x6998,
+    0xb1 => 0x6978, 0xb2 => 0x6934, 0xb3 => 0x69cc, 0xb4 => 0x6987,
+    0xb5 => 0x6988, 0xb6 => 0x69ce, 0xb7 => 0x6989, 0xb8 => 0x6966,
+    0xb9 => 0x6963, 0xba => 0x6979, 0xbb => 0x699b, 0xbc => 0x69a7,
+    0xbd => 0x69bb, 0xbe => 0x69ab, 0xbf => 0x69ad, 0xc0 => 0x69d4,
+    0xc1 => 0x69b1, 0xc2 => 0x69c1, 0xc3 => 0x69ca, 0xc4 => 0x69df,
+    0xc5 => 0x6995, 0xc6 => 0x69e0, 0xc7 => 0x698d, 0xc8 => 0x69ff,
+    0xc9 => 0x6a2f, 0xca => 0x69ed, 0xcb => 0x6a17, 0xcc => 0x6a18,
+    0xcd => 0x6a65, 0xce => 0x69f2, 0xcf => 0x6a44, 0xd0 => 0x6a3e,
+    0xd1 => 0x6aa0, 0xd2 => 0x6a50, 0xd3 => 0x6a5b, 0xd4 => 0x6a35,
+    0xd5 => 0x6a8e, 0xd6 => 0x6a79, 0xd7 => 0x6a3d, 0xd8 => 0x6a28,
+    0xd9 => 0x6a58, 0xda => 0x6a7c, 0xdb => 0x6a91, 0xdc => 0x6a90,
+    0xdd => 0x6aa9, 0xde => 0x6a97, 0xdf => 0x6aab, 0xe0 => 0x7337,
+    0xe1 => 0x7352, 0xe2 => 0x6b81, 0xe3 => 0x6b82, 0xe4 => 0x6b87,
+    0xe5 => 0x6b84, 0xe6 => 0x6b92, 0xe7 => 0x6b93, 0xe8 => 0x6b8d,
+    0xe9 => 0x6b9a, 0xea => 0x6b9b, 0xeb => 0x6ba1, 0xec => 0x6baa,
+    0xed => 0x8f6b, 0xee => 0x8f6d, 0xef => 0x8f71, 0xf0 => 0x8f72,
+    0xf1 => 0x8f73, 0xf2 => 0x8f75, 0xf3 => 0x8f76, 0xf4 => 0x8f78,
+    0xf5 => 0x8f77, 0xf6 => 0x8f79, 0xf7 => 0x8f7a, 0xf8 => 0x8f7c,
+    0xf9 => 0x8f7e, 0xfa => 0x8f81, 0xfb => 0x8f82, 0xfc => 0x8f84,
+    0xfd => 0x8f87, 0xfe => 0x8f8b,
+  },
+  0xea => {
+    0xa1 => 0x8f8d, 0xa2 => 0x8f8e, 0xa3 => 0x8f8f, 0xa4 => 0x8f98,
+    0xa5 => 0x8f9a, 0xa6 => 0x8ece, 0xa7 => 0x620b, 0xa8 => 0x6217,
+    0xa9 => 0x621b, 0xaa => 0x621f, 0xab => 0x6222, 0xac => 0x6221,
+    0xad => 0x6225, 0xae => 0x6224, 0xaf => 0x622c, 0xb0 => 0x81e7,
+    0xb1 => 0x74ef, 0xb2 => 0x74f4, 0xb3 => 0x74ff, 0xb4 => 0x750f,
+    0xb5 => 0x7511, 0xb6 => 0x7513, 0xb7 => 0x6534, 0xb8 => 0x65ee,
+    0xb9 => 0x65ef, 0xba => 0x65f0, 0xbb => 0x660a, 0xbc => 0x6619,
+    0xbd => 0x6772, 0xbe => 0x6603, 0xbf => 0x6615, 0xc0 => 0x6600,
+    0xc1 => 0x7085, 0xc2 => 0x66f7, 0xc3 => 0x661d, 0xc4 => 0x6634,
+    0xc5 => 0x6631, 0xc6 => 0x6636, 0xc7 => 0x6635, 0xc8 => 0x8006,
+    0xc9 => 0x665f, 0xca => 0x6654, 0xcb => 0x6641, 0xcc => 0x664f,
+    0xcd => 0x6656, 0xce => 0x6661, 0xcf => 0x6657, 0xd0 => 0x6677,
+    0xd1 => 0x6684, 0xd2 => 0x668c, 0xd3 => 0x66a7, 0xd4 => 0x669d,
+    0xd5 => 0x66be, 0xd6 => 0x66db, 0xd7 => 0x66dc, 0xd8 => 0x66e6,
+    0xd9 => 0x66e9, 0xda => 0x8d32, 0xdb => 0x8d33, 0xdc => 0x8d36,
+    0xdd => 0x8d3b, 0xde => 0x8d3d, 0xdf => 0x8d40, 0xe0 => 0x8d45,
+    0xe1 => 0x8d46, 0xe2 => 0x8d48, 0xe3 => 0x8d49, 0xe4 => 0x8d47,
+    0xe5 => 0x8d4d, 0xe6 => 0x8d55, 0xe7 => 0x8d59, 0xe8 => 0x89c7,
+    0xe9 => 0x89ca, 0xea => 0x89cb, 0xeb => 0x89cc, 0xec => 0x89ce,
+    0xed => 0x89cf, 0xee => 0x89d0, 0xef => 0x89d1, 0xf0 => 0x726e,
+    0xf1 => 0x729f, 0xf2 => 0x725d, 0xf3 => 0x7266, 0xf4 => 0x726f,
+    0xf5 => 0x727e, 0xf6 => 0x727f, 0xf7 => 0x7284, 0xf8 => 0x728b,
+    0xf9 => 0x728d, 0xfa => 0x728f, 0xfb => 0x7292, 0xfc => 0x6308,
+    0xfd => 0x6332, 0xfe => 0x63b0,
+  },
+  0xeb => {
+    0xa1 => 0x643f, 0xa2 => 0x64d8, 0xa3 => 0x8004, 0xa4 => 0x6bea,
+    0xa5 => 0x6bf3, 0xa6 => 0x6bfd, 0xa7 => 0x6bf5, 0xa8 => 0x6bf9,
+    0xa9 => 0x6c05, 0xaa => 0x6c07, 0xab => 0x6c06, 0xac => 0x6c0d,
+    0xad => 0x6c15, 0xae => 0x6c18, 0xaf => 0x6c19, 0xb0 => 0x6c1a,
+    0xb1 => 0x6c21, 0xb2 => 0x6c29, 0xb3 => 0x6c24, 0xb4 => 0x6c2a,
+    0xb5 => 0x6c32, 0xb6 => 0x6535, 0xb7 => 0x6555, 0xb8 => 0x656b,
+    0xb9 => 0x724d, 0xba => 0x7252, 0xbb => 0x7256, 0xbc => 0x7230,
+    0xbd => 0x8662, 0xbe => 0x5216, 0xbf => 0x809f, 0xc0 => 0x809c,
+    0xc1 => 0x8093, 0xc2 => 0x80bc, 0xc3 => 0x670a, 0xc4 => 0x80bd,
+    0xc5 => 0x80b1, 0xc6 => 0x80ab, 0xc7 => 0x80ad, 0xc8 => 0x80b4,
+    0xc9 => 0x80b7, 0xca => 0x80e7, 0xcb => 0x80e8, 0xcc => 0x80e9,
+    0xcd => 0x80ea, 0xce => 0x80db, 0xcf => 0x80c2, 0xd0 => 0x80c4,
+    0xd1 => 0x80d9, 0xd2 => 0x80cd, 0xd3 => 0x80d7, 0xd4 => 0x6710,
+    0xd5 => 0x80dd, 0xd6 => 0x80eb, 0xd7 => 0x80f1, 0xd8 => 0x80f4,
+    0xd9 => 0x80ed, 0xda => 0x810d, 0xdb => 0x810e, 0xdc => 0x80f2,
+    0xdd => 0x80fc, 0xde => 0x6715, 0xdf => 0x8112, 0xe0 => 0x8c5a,
+    0xe1 => 0x8136, 0xe2 => 0x811e, 0xe3 => 0x812c, 0xe4 => 0x8118,
+    0xe5 => 0x8132, 0xe6 => 0x8148, 0xe7 => 0x814c, 0xe8 => 0x8153,
+    0xe9 => 0x8174, 0xea => 0x8159, 0xeb => 0x815a, 0xec => 0x8171,
+    0xed => 0x8160, 0xee => 0x8169, 0xef => 0x817c, 0xf0 => 0x817d,
+    0xf1 => 0x816d, 0xf2 => 0x8167, 0xf3 => 0x584d, 0xf4 => 0x5ab5,
+    0xf5 => 0x8188, 0xf6 => 0x8182, 0xf7 => 0x8191, 0xf8 => 0x6ed5,
+    0xf9 => 0x81a3, 0xfa => 0x81aa, 0xfb => 0x81cc, 0xfc => 0x6726,
+    0xfd => 0x81ca, 0xfe => 0x81bb,
+  },
+  0xec => {
+    0xa1 => 0x81c1, 0xa2 => 0x81a6, 0xa3 => 0x6b24, 0xa4 => 0x6b37,
+    0xa5 => 0x6b39, 0xa6 => 0x6b43, 0xa7 => 0x6b46, 0xa8 => 0x6b59,
+    0xa9 => 0x98d1, 0xaa => 0x98d2, 0xab => 0x98d3, 0xac => 0x98d5,
+    0xad => 0x98d9, 0xae => 0x98da, 0xaf => 0x6bb3, 0xb0 => 0x5f40,
+    0xb1 => 0x6bc2, 0xb2 => 0x89f3, 0xb3 => 0x6590, 0xb4 => 0x9f51,
+    0xb5 => 0x6593, 0xb6 => 0x65bc, 0xb7 => 0x65c6, 0xb8 => 0x65c4,
+    0xb9 => 0x65c3, 0xba => 0x65cc, 0xbb => 0x65ce, 0xbc => 0x65d2,
+    0xbd => 0x65d6, 0xbe => 0x7080, 0xbf => 0x709c, 0xc0 => 0x7096,
+    0xc1 => 0x709d, 0xc2 => 0x70bb, 0xc3 => 0x70c0, 0xc4 => 0x70b7,
+    0xc5 => 0x70ab, 0xc6 => 0x70b1, 0xc7 => 0x70e8, 0xc8 => 0x70ca,
+    0xc9 => 0x7110, 0xca => 0x7113, 0xcb => 0x7116, 0xcc => 0x712f,
+    0xcd => 0x7131, 0xce => 0x7173, 0xcf => 0x715c, 0xd0 => 0x7168,
+    0xd1 => 0x7145, 0xd2 => 0x7172, 0xd3 => 0x714a, 0xd4 => 0x7178,
+    0xd5 => 0x717a, 0xd6 => 0x7198, 0xd7 => 0x71b3, 0xd8 => 0x71b5,
+    0xd9 => 0x71a8, 0xda => 0x71a0, 0xdb => 0x71e0, 0xdc => 0x71d4,
+    0xdd => 0x71e7, 0xde => 0x71f9, 0xdf => 0x721d, 0xe0 => 0x7228,
+    0xe1 => 0x706c, 0xe2 => 0x7118, 0xe3 => 0x7166, 0xe4 => 0x71b9,
+    0xe5 => 0x623e, 0xe6 => 0x623d, 0xe7 => 0x6243, 0xe8 => 0x6248,
+    0xe9 => 0x6249, 0xea => 0x793b, 0xeb => 0x7940, 0xec => 0x7946,
+    0xed => 0x7949, 0xee => 0x795b, 0xef => 0x795c, 0xf0 => 0x7953,
+    0xf1 => 0x795a, 0xf2 => 0x7962, 0xf3 => 0x7957, 0xf4 => 0x7960,
+    0xf5 => 0x796f, 0xf6 => 0x7967, 0xf7 => 0x797a, 0xf8 => 0x7985,
+    0xf9 => 0x798a, 0xfa => 0x799a, 0xfb => 0x79a7, 0xfc => 0x79b3,
+    0xfd => 0x5fd1, 0xfe => 0x5fd0,
+  },
+  0xed => {
+    0xa1 => 0x603c, 0xa2 => 0x605d, 0xa3 => 0x605a, 0xa4 => 0x6067,
+    0xa5 => 0x6041, 0xa6 => 0x6059, 0xa7 => 0x6063, 0xa8 => 0x60ab,
+    0xa9 => 0x6106, 0xaa => 0x610d, 0xab => 0x615d, 0xac => 0x61a9,
+    0xad => 0x619d, 0xae => 0x61cb, 0xaf => 0x61d1, 0xb0 => 0x6206,
+    0xb1 => 0x8080, 0xb2 => 0x807f, 0xb3 => 0x6c93, 0xb4 => 0x6cf6,
+    0xb5 => 0x6dfc, 0xb6 => 0x77f6, 0xb7 => 0x77f8, 0xb8 => 0x7800,
+    0xb9 => 0x7809, 0xba => 0x7817, 0xbb => 0x7818, 0xbc => 0x7811,
+    0xbd => 0x65ab, 0xbe => 0x782d, 0xbf => 0x781c, 0xc0 => 0x781d,
+    0xc1 => 0x7839, 0xc2 => 0x783a, 0xc3 => 0x783b, 0xc4 => 0x781f,
+    0xc5 => 0x783c, 0xc6 => 0x7825, 0xc7 => 0x782c, 0xc8 => 0x7823,
+    0xc9 => 0x7829, 0xca => 0x784e, 0xcb => 0x786d, 0xcc => 0x7856,
+    0xcd => 0x7857, 0xce => 0x7826, 0xcf => 0x7850, 0xd0 => 0x7847,
+    0xd1 => 0x784c, 0xd2 => 0x786a, 0xd3 => 0x789b, 0xd4 => 0x7893,
+    0xd5 => 0x789a, 0xd6 => 0x7887, 0xd7 => 0x789c, 0xd8 => 0x78a1,
+    0xd9 => 0x78a3, 0xda => 0x78b2, 0xdb => 0x78b9, 0xdc => 0x78a5,
+    0xdd => 0x78d4, 0xde => 0x78d9, 0xdf => 0x78c9, 0xe0 => 0x78ec,
+    0xe1 => 0x78f2, 0xe2 => 0x7905, 0xe3 => 0x78f4, 0xe4 => 0x7913,
+    0xe5 => 0x7924, 0xe6 => 0x791e, 0xe7 => 0x7934, 0xe8 => 0x9f9b,
+    0xe9 => 0x9ef9, 0xea => 0x9efb, 0xeb => 0x9efc, 0xec => 0x76f1,
+    0xed => 0x7704, 0xee => 0x770d, 0xef => 0x76f9, 0xf0 => 0x7707,
+    0xf1 => 0x7708, 0xf2 => 0x771a, 0xf3 => 0x7722, 0xf4 => 0x7719,
+    0xf5 => 0x772d, 0xf6 => 0x7726, 0xf7 => 0x7735, 0xf8 => 0x7738,
+    0xf9 => 0x7750, 0xfa => 0x7751, 0xfb => 0x7747, 0xfc => 0x7743,
+    0xfd => 0x775a, 0xfe => 0x7768,
+  },
+  0xee => {
+    0xa1 => 0x7762, 0xa2 => 0x7765, 0xa3 => 0x777f, 0xa4 => 0x778d,
+    0xa5 => 0x777d, 0xa6 => 0x7780, 0xa7 => 0x778c, 0xa8 => 0x7791,
+    0xa9 => 0x779f, 0xaa => 0x77a0, 0xab => 0x77b0, 0xac => 0x77b5,
+    0xad => 0x77bd, 0xae => 0x753a, 0xaf => 0x7540, 0xb0 => 0x754e,
+    0xb1 => 0x754b, 0xb2 => 0x7548, 0xb3 => 0x755b, 0xb4 => 0x7572,
+    0xb5 => 0x7579, 0xb6 => 0x7583, 0xb7 => 0x7f58, 0xb8 => 0x7f61,
+    0xb9 => 0x7f5f, 0xba => 0x8a48, 0xbb => 0x7f68, 0xbc => 0x7f74,
+    0xbd => 0x7f71, 0xbe => 0x7f79, 0xbf => 0x7f81, 0xc0 => 0x7f7e,
+    0xc1 => 0x76cd, 0xc2 => 0x76e5, 0xc3 => 0x8832, 0xc4 => 0x9485,
+    0xc5 => 0x9486, 0xc6 => 0x9487, 0xc7 => 0x948b, 0xc8 => 0x948a,
+    0xc9 => 0x948c, 0xca => 0x948d, 0xcb => 0x948f, 0xcc => 0x9490,
+    0xcd => 0x9494, 0xce => 0x9497, 0xcf => 0x9495, 0xd0 => 0x949a,
+    0xd1 => 0x949b, 0xd2 => 0x949c, 0xd3 => 0x94a3, 0xd4 => 0x94a4,
+    0xd5 => 0x94ab, 0xd6 => 0x94aa, 0xd7 => 0x94ad, 0xd8 => 0x94ac,
+    0xd9 => 0x94af, 0xda => 0x94b0, 0xdb => 0x94b2, 0xdc => 0x94b4,
+    0xdd => 0x94b6, 0xde => 0x94b7, 0xdf => 0x94b8, 0xe0 => 0x94b9,
+    0xe1 => 0x94ba, 0xe2 => 0x94bc, 0xe3 => 0x94bd, 0xe4 => 0x94bf,
+    0xe5 => 0x94c4, 0xe6 => 0x94c8, 0xe7 => 0x94c9, 0xe8 => 0x94ca,
+    0xe9 => 0x94cb, 0xea => 0x94cc, 0xeb => 0x94cd, 0xec => 0x94ce,
+    0xed => 0x94d0, 0xee => 0x94d1, 0xef => 0x94d2, 0xf0 => 0x94d5,
+    0xf1 => 0x94d6, 0xf2 => 0x94d7, 0xf3 => 0x94d9, 0xf4 => 0x94d8,
+    0xf5 => 0x94db, 0xf6 => 0x94de, 0xf7 => 0x94df, 0xf8 => 0x94e0,
+    0xf9 => 0x94e2, 0xfa => 0x94e4, 0xfb => 0x94e5, 0xfc => 0x94e7,
+    0xfd => 0x94e8, 0xfe => 0x94ea,
+  },
+  0xef => {
+    0xa1 => 0x94e9, 0xa2 => 0x94eb, 0xa3 => 0x94ee, 0xa4 => 0x94ef,
+    0xa5 => 0x94f3, 0xa6 => 0x94f4, 0xa7 => 0x94f5, 0xa8 => 0x94f7,
+    0xa9 => 0x94f9, 0xaa => 0x94fc, 0xab => 0x94fd, 0xac => 0x94ff,
+    0xad => 0x9503, 0xae => 0x9502, 0xaf => 0x9506, 0xb0 => 0x9507,
+    0xb1 => 0x9509, 0xb2 => 0x950a, 0xb3 => 0x950d, 0xb4 => 0x950e,
+    0xb5 => 0x950f, 0xb6 => 0x9512, 0xb7 => 0x9513, 0xb8 => 0x9514,
+    0xb9 => 0x9515, 0xba => 0x9516, 0xbb => 0x9518, 0xbc => 0x951b,
+    0xbd => 0x951d, 0xbe => 0x951e, 0xbf => 0x951f, 0xc0 => 0x9522,
+    0xc1 => 0x952a, 0xc2 => 0x952b, 0xc3 => 0x9529, 0xc4 => 0x952c,
+    0xc5 => 0x9531, 0xc6 => 0x9532, 0xc7 => 0x9534, 0xc8 => 0x9536,
+    0xc9 => 0x9537, 0xca => 0x9538, 0xcb => 0x953c, 0xcc => 0x953e,
+    0xcd => 0x953f, 0xce => 0x9542, 0xcf => 0x9535, 0xd0 => 0x9544,
+    0xd1 => 0x9545, 0xd2 => 0x9546, 0xd3 => 0x9549, 0xd4 => 0x954c,
+    0xd5 => 0x954e, 0xd6 => 0x954f, 0xd7 => 0x9552, 0xd8 => 0x9553,
+    0xd9 => 0x9554, 0xda => 0x9556, 0xdb => 0x9557, 0xdc => 0x9558,
+    0xdd => 0x9559, 0xde => 0x955b, 0xdf => 0x955e, 0xe0 => 0x955f,
+    0xe1 => 0x955d, 0xe2 => 0x9561, 0xe3 => 0x9562, 0xe4 => 0x9564,
+    0xe5 => 0x9565, 0xe6 => 0x9566, 0xe7 => 0x9567, 0xe8 => 0x9568,
+    0xe9 => 0x9569, 0xea => 0x956a, 0xeb => 0x956b, 0xec => 0x956c,
+    0xed => 0x956f, 0xee => 0x9571, 0xef => 0x9572, 0xf0 => 0x9573,
+    0xf1 => 0x953a, 0xf2 => 0x77e7, 0xf3 => 0x77ec, 0xf4 => 0x96c9,
+    0xf5 => 0x79d5, 0xf6 => 0x79ed, 0xf7 => 0x79e3, 0xf8 => 0x79eb,
+    0xf9 => 0x7a06, 0xfa => 0x5d47, 0xfb => 0x7a03, 0xfc => 0x7a02,
+    0xfd => 0x7a1e, 0xfe => 0x7a14,
+  },
+  0xf0 => {
+    0xa1 => 0x7a39, 0xa2 => 0x7a37, 0xa3 => 0x7a51, 0xa4 => 0x9ecf,
+    0xa5 => 0x99a5, 0xa6 => 0x7a70, 0xa7 => 0x7688, 0xa8 => 0x768e,
+    0xa9 => 0x7693, 0xaa => 0x7699, 0xab => 0x76a4, 0xac => 0x74de,
+    0xad => 0x74e0, 0xae => 0x752c, 0xaf => 0x9e20, 0xb0 => 0x9e22,
+    0xb1 => 0x9e28, 0xb2 => 0x9e29, 0xb3 => 0x9e2a, 0xb4 => 0x9e2b,
+    0xb5 => 0x9e2c, 0xb6 => 0x9e32, 0xb7 => 0x9e31, 0xb8 => 0x9e36,
+    0xb9 => 0x9e38, 0xba => 0x9e37, 0xbb => 0x9e39, 0xbc => 0x9e3a,
+    0xbd => 0x9e3e, 0xbe => 0x9e41, 0xbf => 0x9e42, 0xc0 => 0x9e44,
+    0xc1 => 0x9e46, 0xc2 => 0x9e47, 0xc3 => 0x9e48, 0xc4 => 0x9e49,
+    0xc5 => 0x9e4b, 0xc6 => 0x9e4c, 0xc7 => 0x9e4e, 0xc8 => 0x9e51,
+    0xc9 => 0x9e55, 0xca => 0x9e57, 0xcb => 0x9e5a, 0xcc => 0x9e5b,
+    0xcd => 0x9e5c, 0xce => 0x9e5e, 0xcf => 0x9e63, 0xd0 => 0x9e66,
+    0xd1 => 0x9e67, 0xd2 => 0x9e68, 0xd3 => 0x9e69, 0xd4 => 0x9e6a,
+    0xd5 => 0x9e6b, 0xd6 => 0x9e6c, 0xd7 => 0x9e71, 0xd8 => 0x9e6d,
+    0xd9 => 0x9e73, 0xda => 0x7592, 0xdb => 0x7594, 0xdc => 0x7596,
+    0xdd => 0x75a0, 0xde => 0x759d, 0xdf => 0x75ac, 0xe0 => 0x75a3,
+    0xe1 => 0x75b3, 0xe2 => 0x75b4, 0xe3 => 0x75b8, 0xe4 => 0x75c4,
+    0xe5 => 0x75b1, 0xe6 => 0x75b0, 0xe7 => 0x75c3, 0xe8 => 0x75c2,
+    0xe9 => 0x75d6, 0xea => 0x75cd, 0xeb => 0x75e3, 0xec => 0x75e8,
+    0xed => 0x75e6, 0xee => 0x75e4, 0xef => 0x75eb, 0xf0 => 0x75e7,
+    0xf1 => 0x7603, 0xf2 => 0x75f1, 0xf3 => 0x75fc, 0xf4 => 0x75ff,
+    0xf5 => 0x7610, 0xf6 => 0x7600, 0xf7 => 0x7605, 0xf8 => 0x760c,
+    0xf9 => 0x7617, 0xfa => 0x760a, 0xfb => 0x7625, 0xfc => 0x7618,
+    0xfd => 0x7615, 0xfe => 0x7619,
+  },
+  0xf1 => {
+    0xa1 => 0x761b, 0xa2 => 0x763c, 0xa3 => 0x7622, 0xa4 => 0x7620,
+    0xa5 => 0x7640, 0xa6 => 0x762d, 0xa7 => 0x7630, 0xa8 => 0x763f,
+    0xa9 => 0x7635, 0xaa => 0x7643, 0xab => 0x763e, 0xac => 0x7633,
+    0xad => 0x764d, 0xae => 0x765e, 0xaf => 0x7654, 0xb0 => 0x765c,
+    0xb1 => 0x7656, 0xb2 => 0x766b, 0xb3 => 0x766f, 0xb4 => 0x7fca,
+    0xb5 => 0x7ae6, 0xb6 => 0x7a78, 0xb7 => 0x7a79, 0xb8 => 0x7a80,
+    0xb9 => 0x7a86, 0xba => 0x7a88, 0xbb => 0x7a95, 0xbc => 0x7aa6,
+    0xbd => 0x7aa0, 0xbe => 0x7aac, 0xbf => 0x7aa8, 0xc0 => 0x7aad,
+    0xc1 => 0x7ab3, 0xc2 => 0x8864, 0xc3 => 0x8869, 0xc4 => 0x8872,
+    0xc5 => 0x887d, 0xc6 => 0x887f, 0xc7 => 0x8882, 0xc8 => 0x88a2,
+    0xc9 => 0x88c6, 0xca => 0x88b7, 0xcb => 0x88bc, 0xcc => 0x88c9,
+    0xcd => 0x88e2, 0xce => 0x88ce, 0xcf => 0x88e3, 0xd0 => 0x88e5,
+    0xd1 => 0x88f1, 0xd2 => 0x891a, 0xd3 => 0x88fc, 0xd4 => 0x88e8,
+    0xd5 => 0x88fe, 0xd6 => 0x88f0, 0xd7 => 0x8921, 0xd8 => 0x8919,
+    0xd9 => 0x8913, 0xda => 0x891b, 0xdb => 0x890a, 0xdc => 0x8934,
+    0xdd => 0x892b, 0xde => 0x8936, 0xdf => 0x8941, 0xe0 => 0x8966,
+    0xe1 => 0x897b, 0xe2 => 0x758b, 0xe3 => 0x80e5, 0xe4 => 0x76b2,
+    0xe5 => 0x76b4, 0xe6 => 0x77dc, 0xe7 => 0x8012, 0xe8 => 0x8014,
+    0xe9 => 0x8016, 0xea => 0x801c, 0xeb => 0x8020, 0xec => 0x8022,
+    0xed => 0x8025, 0xee => 0x8026, 0xef => 0x8027, 0xf0 => 0x8029,
+    0xf1 => 0x8028, 0xf2 => 0x8031, 0xf3 => 0x800b, 0xf4 => 0x8035,
+    0xf5 => 0x8043, 0xf6 => 0x8046, 0xf7 => 0x804d, 0xf8 => 0x8052,
+    0xf9 => 0x8069, 0xfa => 0x8071, 0xfb => 0x8983, 0xfc => 0x9878,
+    0xfd => 0x9880, 0xfe => 0x9883,
+  },
+  0xf2 => {
+    0xa1 => 0x9889, 0xa2 => 0x988c, 0xa3 => 0x988d, 0xa4 => 0x988f,
+    0xa5 => 0x9894, 0xa6 => 0x989a, 0xa7 => 0x989b, 0xa8 => 0x989e,
+    0xa9 => 0x989f, 0xaa => 0x98a1, 0xab => 0x98a2, 0xac => 0x98a5,
+    0xad => 0x98a6, 0xae => 0x864d, 0xaf => 0x8654, 0xb0 => 0x866c,
+    0xb1 => 0x866e, 0xb2 => 0x867f, 0xb3 => 0x867a, 0xb4 => 0x867c,
+    0xb5 => 0x867b, 0xb6 => 0x86a8, 0xb7 => 0x868d, 0xb8 => 0x868b,
+    0xb9 => 0x86ac, 0xba => 0x869d, 0xbb => 0x86a7, 0xbc => 0x86a3,
+    0xbd => 0x86aa, 0xbe => 0x8693, 0xbf => 0x86a9, 0xc0 => 0x86b6,
+    0xc1 => 0x86c4, 0xc2 => 0x86b5, 0xc3 => 0x86ce, 0xc4 => 0x86b0,
+    0xc5 => 0x86ba, 0xc6 => 0x86b1, 0xc7 => 0x86af, 0xc8 => 0x86c9,
+    0xc9 => 0x86cf, 0xca => 0x86b4, 0xcb => 0x86e9, 0xcc => 0x86f1,
+    0xcd => 0x86f2, 0xce => 0x86ed, 0xcf => 0x86f3, 0xd0 => 0x86d0,
+    0xd1 => 0x8713, 0xd2 => 0x86de, 0xd3 => 0x86f4, 0xd4 => 0x86df,
+    0xd5 => 0x86d8, 0xd6 => 0x86d1, 0xd7 => 0x8703, 0xd8 => 0x8707,
+    0xd9 => 0x86f8, 0xda => 0x8708, 0xdb => 0x870a, 0xdc => 0x870d,
+    0xdd => 0x8709, 0xde => 0x8723, 0xdf => 0x873b, 0xe0 => 0x871e,
+    0xe1 => 0x8725, 0xe2 => 0x872e, 0xe3 => 0x871a, 0xe4 => 0x873e,
+    0xe5 => 0x8748, 0xe6 => 0x8734, 0xe7 => 0x8731, 0xe8 => 0x8729,
+    0xe9 => 0x8737, 0xea => 0x873f, 0xeb => 0x8782, 0xec => 0x8722,
+    0xed => 0x877d, 0xee => 0x877e, 0xef => 0x877b, 0xf0 => 0x8760,
+    0xf1 => 0x8770, 0xf2 => 0x874c, 0xf3 => 0x876e, 0xf4 => 0x878b,
+    0xf5 => 0x8753, 0xf6 => 0x8763, 0xf7 => 0x877c, 0xf8 => 0x8764,
+    0xf9 => 0x8759, 0xfa => 0x8765, 0xfb => 0x8793, 0xfc => 0x87af,
+    0xfd => 0x87a8, 0xfe => 0x87d2,
+  },
+  0xf3 => {
+    0xa1 => 0x87c6, 0xa2 => 0x8788, 0xa3 => 0x8785, 0xa4 => 0x87ad,
+    0xa5 => 0x8797, 0xa6 => 0x8783, 0xa7 => 0x87ab, 0xa8 => 0x87e5,
+    0xa9 => 0x87ac, 0xaa => 0x87b5, 0xab => 0x87b3, 0xac => 0x87cb,
+    0xad => 0x87d3, 0xae => 0x87bd, 0xaf => 0x87d1, 0xb0 => 0x87c0,
+    0xb1 => 0x87ca, 0xb2 => 0x87db, 0xb3 => 0x87ea, 0xb4 => 0x87e0,
+    0xb5 => 0x87ee, 0xb6 => 0x8816, 0xb7 => 0x8813, 0xb8 => 0x87fe,
+    0xb9 => 0x880a, 0xba => 0x881b, 0xbb => 0x8821, 0xbc => 0x8839,
+    0xbd => 0x883c, 0xbe => 0x7f36, 0xbf => 0x7f42, 0xc0 => 0x7f44,
+    0xc1 => 0x7f45, 0xc2 => 0x8210, 0xc3 => 0x7afa, 0xc4 => 0x7afd,
+    0xc5 => 0x7b08, 0xc6 => 0x7b03, 0xc7 => 0x7b04, 0xc8 => 0x7b15,
+    0xc9 => 0x7b0a, 0xca => 0x7b2b, 0xcb => 0x7b0f, 0xcc => 0x7b47,
+    0xcd => 0x7b38, 0xce => 0x7b2a, 0xcf => 0x7b19, 0xd0 => 0x7b2e,
+    0xd1 => 0x7b31, 0xd2 => 0x7b20, 0xd3 => 0x7b25, 0xd4 => 0x7b24,
+    0xd5 => 0x7b33, 0xd6 => 0x7b3e, 0xd7 => 0x7b1e, 0xd8 => 0x7b58,
+    0xd9 => 0x7b5a, 0xda => 0x7b45, 0xdb => 0x7b75, 0xdc => 0x7b4c,
+    0xdd => 0x7b5d, 0xde => 0x7b60, 0xdf => 0x7b6e, 0xe0 => 0x7b7b,
+    0xe1 => 0x7b62, 0xe2 => 0x7b72, 0xe3 => 0x7b71, 0xe4 => 0x7b90,
+    0xe5 => 0x7ba6, 0xe6 => 0x7ba7, 0xe7 => 0x7bb8, 0xe8 => 0x7bac,
+    0xe9 => 0x7b9d, 0xea => 0x7ba8, 0xeb => 0x7b85, 0xec => 0x7baa,
+    0xed => 0x7b9c, 0xee => 0x7ba2, 0xef => 0x7bab, 0xf0 => 0x7bb4,
+    0xf1 => 0x7bd1, 0xf2 => 0x7bc1, 0xf3 => 0x7bcc, 0xf4 => 0x7bdd,
+    0xf5 => 0x7bda, 0xf6 => 0x7be5, 0xf7 => 0x7be6, 0xf8 => 0x7bea,
+    0xf9 => 0x7c0c, 0xfa => 0x7bfe, 0xfb => 0x7bfc, 0xfc => 0x7c0f,
+    0xfd => 0x7c16, 0xfe => 0x7c0b,
+  },
+  0xf4 => {
+    0xa1 => 0x7c1f, 0xa2 => 0x7c2a, 0xa3 => 0x7c26, 0xa4 => 0x7c38,
+    0xa5 => 0x7c41, 0xa6 => 0x7c40, 0xa7 => 0x81fe, 0xa8 => 0x8201,
+    0xa9 => 0x8202, 0xaa => 0x8204, 0xab => 0x81ec, 0xac => 0x8844,
+    0xad => 0x8221, 0xae => 0x8222, 0xaf => 0x8223, 0xb0 => 0x822d,
+    0xb1 => 0x822f, 0xb2 => 0x8228, 0xb3 => 0x822b, 0xb4 => 0x8238,
+    0xb5 => 0x823b, 0xb6 => 0x8233, 0xb7 => 0x8234, 0xb8 => 0x823e,
+    0xb9 => 0x8244, 0xba => 0x8249, 0xbb => 0x824b, 0xbc => 0x824f,
+    0xbd => 0x825a, 0xbe => 0x825f, 0xbf => 0x8268, 0xc0 => 0x887e,
+    0xc1 => 0x8885, 0xc2 => 0x8888, 0xc3 => 0x88d8, 0xc4 => 0x88df,
+    0xc5 => 0x895e, 0xc6 => 0x7f9d, 0xc7 => 0x7f9f, 0xc8 => 0x7fa7,
+    0xc9 => 0x7faf, 0xca => 0x7fb0, 0xcb => 0x7fb2, 0xcc => 0x7c7c,
+    0xcd => 0x6549, 0xce => 0x7c91, 0xcf => 0x7c9d, 0xd0 => 0x7c9c,
+    0xd1 => 0x7c9e, 0xd2 => 0x7ca2, 0xd3 => 0x7cb2, 0xd4 => 0x7cbc,
+    0xd5 => 0x7cbd, 0xd6 => 0x7cc1, 0xd7 => 0x7cc7, 0xd8 => 0x7ccc,
+    0xd9 => 0x7ccd, 0xda => 0x7cc8, 0xdb => 0x7cc5, 0xdc => 0x7cd7,
+    0xdd => 0x7ce8, 0xde => 0x826e, 0xdf => 0x66a8, 0xe0 => 0x7fbf,
+    0xe1 => 0x7fce, 0xe2 => 0x7fd5, 0xe3 => 0x7fe5, 0xe4 => 0x7fe1,
+    0xe5 => 0x7fe6, 0xe6 => 0x7fe9, 0xe7 => 0x7fee, 0xe8 => 0x7ff3,
+    0xe9 => 0x7cf8, 0xea => 0x7d77, 0xeb => 0x7da6, 0xec => 0x7dae,
+    0xed => 0x7e47, 0xee => 0x7e9b, 0xef => 0x9eb8, 0xf0 => 0x9eb4,
+    0xf1 => 0x8d73, 0xf2 => 0x8d84, 0xf3 => 0x8d94, 0xf4 => 0x8d91,
+    0xf5 => 0x8db1, 0xf6 => 0x8d67, 0xf7 => 0x8d6d, 0xf8 => 0x8c47,
+    0xf9 => 0x8c49, 0xfa => 0x914a, 0xfb => 0x9150, 0xfc => 0x914e,
+    0xfd => 0x914f, 0xfe => 0x9164,
+  },
+  0xf5 => {
+    0xa1 => 0x9162, 0xa2 => 0x9161, 0xa3 => 0x9170, 0xa4 => 0x9169,
+    0xa5 => 0x916f, 0xa6 => 0x917d, 0xa7 => 0x917e, 0xa8 => 0x9172,
+    0xa9 => 0x9174, 0xaa => 0x9179, 0xab => 0x918c, 0xac => 0x9185,
+    0xad => 0x9190, 0xae => 0x918d, 0xaf => 0x9191, 0xb0 => 0x91a2,
+    0xb1 => 0x91a3, 0xb2 => 0x91aa, 0xb3 => 0x91ad, 0xb4 => 0x91ae,
+    0xb5 => 0x91af, 0xb6 => 0x91b5, 0xb7 => 0x91b4, 0xb8 => 0x91ba,
+    0xb9 => 0x8c55, 0xba => 0x9e7e, 0xbb => 0x8db8, 0xbc => 0x8deb,
+    0xbd => 0x8e05, 0xbe => 0x8e59, 0xbf => 0x8e69, 0xc0 => 0x8db5,
+    0xc1 => 0x8dbf, 0xc2 => 0x8dbc, 0xc3 => 0x8dba, 0xc4 => 0x8dc4,
+    0xc5 => 0x8dd6, 0xc6 => 0x8dd7, 0xc7 => 0x8dda, 0xc8 => 0x8dde,
+    0xc9 => 0x8dce, 0xca => 0x8dcf, 0xcb => 0x8ddb, 0xcc => 0x8dc6,
+    0xcd => 0x8dec, 0xce => 0x8df7, 0xcf => 0x8df8, 0xd0 => 0x8de3,
+    0xd1 => 0x8df9, 0xd2 => 0x8dfb, 0xd3 => 0x8de4, 0xd4 => 0x8e09,
+    0xd5 => 0x8dfd, 0xd6 => 0x8e14, 0xd7 => 0x8e1d, 0xd8 => 0x8e1f,
+    0xd9 => 0x8e2c, 0xda => 0x8e2e, 0xdb => 0x8e23, 0xdc => 0x8e2f,
+    0xdd => 0x8e3a, 0xde => 0x8e40, 0xdf => 0x8e39, 0xe0 => 0x8e35,
+    0xe1 => 0x8e3d, 0xe2 => 0x8e31, 0xe3 => 0x8e49, 0xe4 => 0x8e41,
+    0xe5 => 0x8e42, 0xe6 => 0x8e51, 0xe7 => 0x8e52, 0xe8 => 0x8e4a,
+    0xe9 => 0x8e70, 0xea => 0x8e76, 0xeb => 0x8e7c, 0xec => 0x8e6f,
+    0xed => 0x8e74, 0xee => 0x8e85, 0xef => 0x8e8f, 0xf0 => 0x8e94,
+    0xf1 => 0x8e90, 0xf2 => 0x8e9c, 0xf3 => 0x8e9e, 0xf4 => 0x8c78,
+    0xf5 => 0x8c82, 0xf6 => 0x8c8a, 0xf7 => 0x8c85, 0xf8 => 0x8c98,
+    0xf9 => 0x8c94, 0xfa => 0x659b, 0xfb => 0x89d6, 0xfc => 0x89de,
+    0xfd => 0x89da, 0xfe => 0x89dc,
+  },
+  0xf6 => {
+    0xa1 => 0x89e5, 0xa2 => 0x89eb, 0xa3 => 0x89ef, 0xa4 => 0x8a3e,
+    0xa5 => 0x8b26, 0xa6 => 0x9753, 0xa7 => 0x96e9, 0xa8 => 0x96f3,
+    0xa9 => 0x96ef, 0xaa => 0x9706, 0xab => 0x9701, 0xac => 0x9708,
+    0xad => 0x970f, 0xae => 0x970e, 0xaf => 0x972a, 0xb0 => 0x972d,
+    0xb1 => 0x9730, 0xb2 => 0x973e, 0xb3 => 0x9f80, 0xb4 => 0x9f83,
+    0xb5 => 0x9f85, 0xb6 => 0x9f86, 0xb7 => 0x9f87, 0xb8 => 0x9f88,
+    0xb9 => 0x9f89, 0xba => 0x9f8a, 0xbb => 0x9f8c, 0xbc => 0x9efe,
+    0xbd => 0x9f0b, 0xbe => 0x9f0d, 0xbf => 0x96b9, 0xc0 => 0x96bc,
+    0xc1 => 0x96bd, 0xc2 => 0x96ce, 0xc3 => 0x96d2, 0xc4 => 0x77bf,
+    0xc5 => 0x96e0, 0xc6 => 0x928e, 0xc7 => 0x92ae, 0xc8 => 0x92c8,
+    0xc9 => 0x933e, 0xca => 0x936a, 0xcb => 0x93ca, 0xcc => 0x938f,
+    0xcd => 0x943e, 0xce => 0x946b, 0xcf => 0x9c7f, 0xd0 => 0x9c82,
+    0xd1 => 0x9c85, 0xd2 => 0x9c86, 0xd3 => 0x9c87, 0xd4 => 0x9c88,
+    0xd5 => 0x7a23, 0xd6 => 0x9c8b, 0xd7 => 0x9c8e, 0xd8 => 0x9c90,
+    0xd9 => 0x9c91, 0xda => 0x9c92, 0xdb => 0x9c94, 0xdc => 0x9c95,
+    0xdd => 0x9c9a, 0xde => 0x9c9b, 0xdf => 0x9c9e, 0xe0 => 0x9c9f,
+    0xe1 => 0x9ca0, 0xe2 => 0x9ca1, 0xe3 => 0x9ca2, 0xe4 => 0x9ca3,
+    0xe5 => 0x9ca5, 0xe6 => 0x9ca6, 0xe7 => 0x9ca7, 0xe8 => 0x9ca8,
+    0xe9 => 0x9ca9, 0xea => 0x9cab, 0xeb => 0x9cad, 0xec => 0x9cae,
+    0xed => 0x9cb0, 0xee => 0x9cb1, 0xef => 0x9cb2, 0xf0 => 0x9cb3,
+    0xf1 => 0x9cb4, 0xf2 => 0x9cb5, 0xf3 => 0x9cb6, 0xf4 => 0x9cb7,
+    0xf5 => 0x9cba, 0xf6 => 0x9cbb, 0xf7 => 0x9cbc, 0xf8 => 0x9cbd,
+    0xf9 => 0x9cc4, 0xfa => 0x9cc5, 0xfb => 0x9cc6, 0xfc => 0x9cc7,
+    0xfd => 0x9cca, 0xfe => 0x9ccb,
+  },
+  0xf7 => {
+    0xa1 => 0x9ccc, 0xa2 => 0x9ccd, 0xa3 => 0x9cce, 0xa4 => 0x9ccf,
+    0xa5 => 0x9cd0, 0xa6 => 0x9cd3, 0xa7 => 0x9cd4, 0xa8 => 0x9cd5,
+    0xa9 => 0x9cd7, 0xaa => 0x9cd8, 0xab => 0x9cd9, 0xac => 0x9cdc,
+    0xad => 0x9cdd, 0xae => 0x9cdf, 0xaf => 0x9ce2, 0xb0 => 0x977c,
+    0xb1 => 0x9785, 0xb2 => 0x9791, 0xb3 => 0x9792, 0xb4 => 0x9794,
+    0xb5 => 0x97af, 0xb6 => 0x97ab, 0xb7 => 0x97a3, 0xb8 => 0x97b2,
+    0xb9 => 0x97b4, 0xba => 0x9ab1, 0xbb => 0x9ab0, 0xbc => 0x9ab7,
+    0xbd => 0x9e58, 0xbe => 0x9ab6, 0xbf => 0x9aba, 0xc0 => 0x9abc,
+    0xc1 => 0x9ac1, 0xc2 => 0x9ac0, 0xc3 => 0x9ac5, 0xc4 => 0x9ac2,
+    0xc5 => 0x9acb, 0xc6 => 0x9acc, 0xc7 => 0x9ad1, 0xc8 => 0x9b45,
+    0xc9 => 0x9b43, 0xca => 0x9b47, 0xcb => 0x9b49, 0xcc => 0x9b48,
+    0xcd => 0x9b4d, 0xce => 0x9b51, 0xcf => 0x98e8, 0xd0 => 0x990d,
+    0xd1 => 0x992e, 0xd2 => 0x9955, 0xd3 => 0x9954, 0xd4 => 0x9adf,
+    0xd5 => 0x9ae1, 0xd6 => 0x9ae6, 0xd7 => 0x9aef, 0xd8 => 0x9aeb,
+    0xd9 => 0x9afb, 0xda => 0x9aed, 0xdb => 0x9af9, 0xdc => 0x9b08,
+    0xdd => 0x9b0f, 0xde => 0x9b13, 0xdf => 0x9b1f, 0xe0 => 0x9b23,
+    0xe1 => 0x9ebd, 0xe2 => 0x9ebe, 0xe3 => 0x7e3b, 0xe4 => 0x9e82,
+    0xe5 => 0x9e87, 0xe6 => 0x9e88, 0xe7 => 0x9e8b, 0xe8 => 0x9e92,
+    0xe9 => 0x93d6, 0xea => 0x9e9d, 0xeb => 0x9e9f, 0xec => 0x9edb,
+    0xed => 0x9edc, 0xee => 0x9edd, 0xef => 0x9ee0, 0xf0 => 0x9edf,
+    0xf1 => 0x9ee2, 0xf2 => 0x9ee9, 0xf3 => 0x9ee7, 0xf4 => 0x9ee5,
+    0xf5 => 0x9eea, 0xf6 => 0x9eef, 0xf7 => 0x9f22, 0xf8 => 0x9f2c,
+    0xf9 => 0x9f2f, 0xfa => 0x9f39, 0xfb => 0x9f37, 0xfc => 0x9f3d,
+    0xfd => 0x9f3e, 0xfe => 0x9f44,
+  },
+);
+
+1; # end
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacChineseTW.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacChineseTW.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacChineseTW.pm	(revision 24799)
@@ -0,0 +1,3623 @@
+#------------------------------------------------------------------------------
+# File:         MacChineseTW.pm
+#
+# Description:  Mac Chinese Traditional to Unicode
+#
+# Revisions:    2010/01/20 - P. Harvey created
+#
+# References:   1) http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/CHINTRAD.TXT
+#
+# Notes:        The table omits 1-byte characters with the same values as Unicode
+#------------------------------------------------------------------------------
+use strict;
+
+%Image::ExifTool::Charset::MacChineseTW = (
+  0x80 => [0x5c,0xf87f], 0x81 => 0xf880, 0x82 => 0xf881, 0xfd => 0xa9,
+  0xfe => 0x2122, 0xff => 0x2026,
+  0xa1 => {
+    0x40 => 0x3000, 0x41 => 0xff0c, 0x42 => 0x3001, 0x43 => 0x3002,
+    0x44 => 0xff0e, 0x45 => 0xb7, 0x46 => 0xff1b, 0x47 => 0xff1a,
+    0x48 => 0xff1f, 0x49 => 0xff01, 0x4a => 0xfe30, 0x4b => 0x22ef,
+    0x4c => 0x2025, 0x4d => [0xff0c,0xf87d], 0x4e => [0x3001,0xf87d],
+    0x4f => [0xff0e,0xf87d], 0x50 => [0xff0e,0xf87e], 0x51 => [0xff1b,0xf87d],
+    0x52 => [0xff1a,0xf87d], 0x53 => [0xff1f,0xf87d], 0x54 => [0xff01,0xf87d],
+    0x55 => 0xff5c, 0x56 => 0x2013, 0x57 => 0xfe31, 0x58 => 0x2014,
+    0x59 => 0xfe33, 0x5a => [0xff3f,0xf87f], 0x5b => 0xfe34, 0x5c => 0xfe4f,
+    0x5d => 0xff08, 0x5e => 0xff09, 0x5f => 0xfe35, 0x60 => 0xfe36,
+    0x61 => 0xff5b, 0x62 => 0xff5d, 0x63 => 0xfe37, 0x64 => 0xfe38,
+    0x65 => 0x3014, 0x66 => 0x3015, 0x67 => 0xfe39, 0x68 => 0xfe3a,
+    0x69 => 0x3010, 0x6a => 0x3011, 0x6b => 0xfe3b, 0x6c => 0xfe3c,
+    0x6d => 0x300a, 0x6e => 0x300b, 0x6f => 0xfe3d, 0x70 => 0xfe3e,
+    0x71 => 0x3008, 0x72 => 0x3009, 0x73 => 0xfe3f, 0x74 => 0xfe40,
+    0x75 => 0x300c, 0x76 => 0x300d, 0x77 => 0xfe41, 0x78 => 0xfe42,
+    0x79 => 0x300e, 0x7a => 0x300f, 0x7b => 0xfe43, 0x7c => 0xfe44,
+    0x7d => [0xff08,0xf87f], 0x7e => [0xff09,0xf87f], 0xa1 => [0xff5b,0xf87f],
+    0xa2 => [0xff5d,0xf87f], 0xa3 => [0x3014,0xf87f], 0xa4 => [0x3015,0xf87f],
+    0xa5 => 0x2018, 0xa6 => 0x2019, 0xa7 => 0x201c, 0xa8 => 0x201d,
+    0xa9 => 0x301d, 0xaa => 0x301e, 0xab => 0x2035, 0xac => 0x2032,
+    0xad => 0xff03, 0xae => 0xff06, 0xaf => 0xff0a, 0xb0 => 0x203b,
+    0xb1 => 0xa7, 0xb2 => 0x3003, 0xb3 => 0x25cb, 0xb4 => 0x25cf,
+    0xb5 => 0x25b3, 0xb6 => 0x25b2, 0xb7 => 0x25ce, 0xb8 => 0x2606,
+    0xb9 => 0x2605, 0xba => 0x25c7, 0xbb => 0x25c6, 0xbc => 0x25a1,
+    0xbd => 0x25a0, 0xbe => 0x25bd, 0xbf => 0x25bc, 0xc0 => 0x32a3,
+    0xc1 => 0x2105, 0xc2 => 0x203e, 0xc3 => [0x203e,0xf87c], 0xc4 => 0xff3f,
+    0xc5 => [0xff3f,0xf87c], 0xc6 => 0xfe49, 0xc7 => 0xfe4a, 0xc8 => 0xfe4d,
+    0xc9 => 0xfe4e, 0xca => 0xfe4b, 0xcb => [0xfe4b,0xf87c], 0xcc => 0xfe5f,
+    0xcd => 0xfe60, 0xce => 0xfe61, 0xcf => 0xff0b, 0xd0 => 0xff0d,
+    0xd1 => 0xd7, 0xd2 => 0xf7, 0xd3 => 0xb1, 0xd4 => 0x221a, 0xd5 => 0xff1c,
+    0xd6 => 0xff1e, 0xd7 => 0xff1d, 0xd8 => 0x2266, 0xd9 => 0x2267,
+    0xda => 0x2260, 0xdb => 0x221e, 0xdc => 0x2252, 0xdd => 0x2261,
+    0xde => 0xfe62, 0xdf => 0xfe63, 0xe0 => 0xfe64, 0xe1 => 0xfe65,
+    0xe2 => 0xfe66, 0xe3 => 0x223c, 0xe4 => 0x2229, 0xe5 => 0x222a,
+    0xe6 => 0x22a5, 0xe7 => 0x2220, 0xe8 => 0x221f, 0xe9 => 0x22bf,
+    0xea => 0x33d2, 0xeb => 0x33d1, 0xec => 0x222b, 0xed => 0x222e,
+    0xee => 0x2235, 0xef => 0x2234, 0xf0 => 0x2640, 0xf1 => 0x2642,
+    0xf2 => 0x2295, 0xf3 => 0x2609, 0xf4 => 0x2191, 0xf5 => 0x2193,
+    0xf6 => 0x2190, 0xf7 => 0x2192, 0xf8 => 0x2196, 0xf9 => 0x2197,
+    0xfa => 0x2199, 0xfb => 0x2198, 0xfc => 0x2225, 0xfd => 0x2223,
+    0xfe => [0xff0f,0xf87f],
+  },
+  0xa2 => {
+    0x40 => [0xff3c,0xf87f], 0x41 => 0xff0f, 0x42 => 0xff3c, 0x43 => 0xff04,
+    0x44 => 0xa5, 0x45 => 0x3012, 0x46 => 0xa2, 0x47 => 0xa3, 0x48 => 0xff05,
+    0x49 => 0xff20, 0x4a => 0x2103, 0x4b => 0x2109, 0x4c => 0xfe69,
+    0x4d => 0xfe6a, 0x4e => 0xfe6b, 0x4f => 0x33d5, 0x50 => 0x339c,
+    0x51 => 0x339d, 0x52 => 0x339e, 0x53 => 0x33ce, 0x54 => 0x33a1,
+    0x55 => 0x338e, 0x56 => 0x338f, 0x57 => 0x33c4, 0x58 => 0xb0,
+    0x59 => 0x5159, 0x5a => 0x515b, 0x5b => 0x515e, 0x5c => 0x515d,
+    0x5d => 0x5161, 0x5e => 0x5163, 0x5f => 0x55e7, 0x60 => 0x74e9,
+    0x61 => 0x7cce, 0x62 => 0x2581, 0x63 => 0x2582, 0x64 => 0x2583,
+    0x65 => 0x2584, 0x66 => 0x2585, 0x67 => 0x2586, 0x68 => 0x2587,
+    0x69 => 0x2588, 0x6a => 0x258f, 0x6b => 0x258e, 0x6c => 0x258d,
+    0x6d => 0x258c, 0x6e => 0x258b, 0x6f => 0x258a, 0x70 => 0x2589,
+    0x71 => 0x253c, 0x72 => 0x2534, 0x73 => 0x252c, 0x74 => 0x2524,
+    0x75 => 0x251c, 0x76 => 0x2594, 0x77 => 0x2500, 0x78 => 0x2502,
+    0x79 => [0x2502,0xf87f], 0x7a => 0x250c, 0x7b => 0x2510, 0x7c => 0x2514,
+    0x7d => 0x2518, 0x7e => 0x256d, 0xa1 => 0x256e, 0xa2 => 0x2570,
+    0xa3 => 0x256f, 0xa4 => 0x2550, 0xa5 => 0x255e, 0xa6 => 0x256a,
+    0xa7 => 0x2561, 0xa8 => 0x25e2, 0xa9 => 0x25e3, 0xaa => 0x25e5,
+    0xab => 0x25e4, 0xac => 0x2571, 0xad => 0x2572, 0xae => 0x2573,
+    0xaf => 0xff10, 0xb0 => 0xff11, 0xb1 => 0xff12, 0xb2 => 0xff13,
+    0xb3 => 0xff14, 0xb4 => 0xff15, 0xb5 => 0xff16, 0xb6 => 0xff17,
+    0xb7 => 0xff18, 0xb8 => 0xff19, 0xb9 => 0x2160, 0xba => 0x2161,
+    0xbb => 0x2162, 0xbc => 0x2163, 0xbd => 0x2164, 0xbe => 0x2165,
+    0xbf => 0x2166, 0xc0 => 0x2167, 0xc1 => 0x2168, 0xc2 => 0x2169,
+    0xc3 => 0x3021, 0xc4 => 0x3022, 0xc5 => 0x3023, 0xc6 => 0x3024,
+    0xc7 => 0x3025, 0xc8 => 0x3026, 0xc9 => 0x3027, 0xca => 0x3028,
+    0xcb => 0x3029, 0xcc => [0x5341,0xf87f], 0xcd => 0x5344,
+    0xce => [0x5345,0xf87f], 0xcf => 0xff21, 0xd0 => 0xff22, 0xd1 => 0xff23,
+    0xd2 => 0xff24, 0xd3 => 0xff25, 0xd4 => 0xff26, 0xd5 => 0xff27,
+    0xd6 => 0xff28, 0xd7 => 0xff29, 0xd8 => 0xff2a, 0xd9 => 0xff2b,
+    0xda => 0xff2c, 0xdb => 0xff2d, 0xdc => 0xff2e, 0xdd => 0xff2f,
+    0xde => 0xff30, 0xdf => 0xff31, 0xe0 => 0xff32, 0xe1 => 0xff33,
+    0xe2 => 0xff34, 0xe3 => 0xff35, 0xe4 => 0xff36, 0xe5 => 0xff37,
+    0xe6 => 0xff38, 0xe7 => 0xff39, 0xe8 => 0xff3a, 0xe9 => 0xff41,
+    0xea => 0xff42, 0xeb => 0xff43, 0xec => 0xff44, 0xed => 0xff45,
+    0xee => 0xff46, 0xef => 0xff47, 0xf0 => 0xff48, 0xf1 => 0xff49,
+    0xf2 => 0xff4a, 0xf3 => 0xff4b, 0xf4 => 0xff4c, 0xf5 => 0xff4d,
+    0xf6 => 0xff4e, 0xf7 => 0xff4f, 0xf8 => 0xff50, 0xf9 => 0xff51,
+    0xfa => 0xff52, 0xfb => 0xff53, 0xfc => 0xff54, 0xfd => 0xff55,
+    0xfe => 0xff56,
+  },
+  0xa3 => {
+    0x40 => 0xff57, 0x41 => 0xff58, 0x42 => 0xff59, 0x43 => 0xff5a,
+    0x44 => 0x0391, 0x45 => 0x0392, 0x46 => 0x0393, 0x47 => 0x0394,
+    0x48 => 0x0395, 0x49 => 0x0396, 0x4a => 0x0397, 0x4b => 0x0398,
+    0x4c => 0x0399, 0x4d => 0x039a, 0x4e => 0x039b, 0x4f => 0x039c,
+    0x50 => 0x039d, 0x51 => 0x039e, 0x52 => 0x039f, 0x53 => 0x03a0,
+    0x54 => 0x03a1, 0x55 => 0x03a3, 0x56 => 0x03a4, 0x57 => 0x03a5,
+    0x58 => 0x03a6, 0x59 => 0x03a7, 0x5a => 0x03a8, 0x5b => 0x03a9,
+    0x5c => 0x03b1, 0x5d => 0x03b2, 0x5e => 0x03b3, 0x5f => 0x03b4,
+    0x60 => 0x03b5, 0x61 => 0x03b6, 0x62 => 0x03b7, 0x63 => 0x03b8,
+    0x64 => 0x03b9, 0x65 => 0x03ba, 0x66 => 0x03bb, 0x67 => 0x03bc,
+    0x68 => 0x03bd, 0x69 => 0x03be, 0x6a => 0x03bf, 0x6b => 0x03c0,
+    0x6c => 0x03c1, 0x6d => 0x03c3, 0x6e => 0x03c4, 0x6f => 0x03c5,
+    0x70 => 0x03c6, 0x71 => 0x03c7, 0x72 => 0x03c8, 0x73 => 0x03c9,
+    0x74 => 0x3105, 0x75 => 0x3106, 0x76 => 0x3107, 0x77 => 0x3108,
+    0x78 => 0x3109, 0x79 => 0x310a, 0x7a => 0x310b, 0x7b => 0x310c,
+    0x7c => 0x310d, 0x7d => 0x310e, 0x7e => 0x310f, 0xa1 => 0x3110,
+    0xa2 => 0x3111, 0xa3 => 0x3112, 0xa4 => 0x3113, 0xa5 => 0x3114,
+    0xa6 => 0x3115, 0xa7 => 0x3116, 0xa8 => 0x3117, 0xa9 => 0x3118,
+    0xaa => 0x3119, 0xab => 0x311a, 0xac => 0x311b, 0xad => 0x311c,
+    0xae => 0x311d, 0xaf => 0x311e, 0xb0 => 0x311f, 0xb1 => 0x3120,
+    0xb2 => 0x3121, 0xb3 => 0x3122, 0xb4 => 0x3123, 0xb5 => 0x3124,
+    0xb6 => 0x3125, 0xb7 => 0x3126, 0xb8 => 0x3127, 0xb9 => 0x3128,
+    0xba => 0x3129, 0xbb => 0x02d9, 0xbc => 0x02c9, 0xbd => 0x02ca,
+    0xbe => 0x02c7, 0xbf => 0x02cb,
+  },
+  0xa4 => {
+    0x40 => 0x4e00, 0x41 => 0x4e59, 0x42 => 0x4e01, 0x43 => 0x4e03,
+    0x44 => 0x4e43, 0x45 => 0x4e5d, 0x46 => 0x4e86, 0x47 => 0x4e8c,
+    0x48 => 0x4eba, 0x49 => 0x513f, 0x4a => 0x5165, 0x4b => 0x516b,
+    0x4c => 0x51e0, 0x4d => 0x5200, 0x4e => 0x5201, 0x4f => 0x529b,
+    0x50 => 0x5315, 0x51 => 0x5341, 0x52 => 0x535c, 0x53 => 0x53c8,
+    0x54 => 0x4e09, 0x55 => 0x4e0b, 0x56 => 0x4e08, 0x57 => 0x4e0a,
+    0x58 => 0x4e2b, 0x59 => 0x4e38, 0x5a => 0x51e1, 0x5b => 0x4e45,
+    0x5c => 0x4e48, 0x5d => 0x4e5f, 0x5e => 0x4e5e, 0x5f => 0x4e8e,
+    0x60 => 0x4ea1, 0x61 => 0x5140, 0x62 => 0x5203, 0x63 => 0x52fa,
+    0x64 => 0x5343, 0x65 => 0x53c9, 0x66 => 0x53e3, 0x67 => 0x571f,
+    0x68 => 0x58eb, 0x69 => 0x5915, 0x6a => 0x5927, 0x6b => 0x5973,
+    0x6c => 0x5b50, 0x6d => 0x5b51, 0x6e => 0x5b53, 0x6f => 0x5bf8,
+    0x70 => 0x5c0f, 0x71 => 0x5c22, 0x72 => 0x5c38, 0x73 => 0x5c71,
+    0x74 => 0x5ddd, 0x75 => 0x5de5, 0x76 => 0x5df1, 0x77 => 0x5df2,
+    0x78 => 0x5df3, 0x79 => 0x5dfe, 0x7a => 0x5e72, 0x7b => 0x5efe,
+    0x7c => 0x5f0b, 0x7d => 0x5f13, 0x7e => 0x624d, 0xa1 => 0x4e11,
+    0xa2 => 0x4e10, 0xa3 => 0x4e0d, 0xa4 => 0x4e2d, 0xa5 => 0x4e30,
+    0xa6 => 0x4e39, 0xa7 => 0x4e4b, 0xa8 => 0x5c39, 0xa9 => 0x4e88,
+    0xaa => 0x4e91, 0xab => 0x4e95, 0xac => 0x4e92, 0xad => 0x4e94,
+    0xae => 0x4ea2, 0xaf => 0x4ec1, 0xb0 => 0x4ec0, 0xb1 => 0x4ec3,
+    0xb2 => 0x4ec6, 0xb3 => 0x4ec7, 0xb4 => 0x4ecd, 0xb5 => 0x4eca,
+    0xb6 => 0x4ecb, 0xb7 => 0x4ec4, 0xb8 => 0x5143, 0xb9 => 0x5141,
+    0xba => 0x5167, 0xbb => 0x516d, 0xbc => 0x516e, 0xbd => 0x516c,
+    0xbe => 0x5197, 0xbf => 0x51f6, 0xc0 => 0x5206, 0xc1 => 0x5207,
+    0xc2 => 0x5208, 0xc3 => 0x52fb, 0xc4 => 0x52fe, 0xc5 => 0x52ff,
+    0xc6 => 0x5316, 0xc7 => 0x5339, 0xc8 => 0x5348, 0xc9 => 0x5347,
+    0xca => 0x5345, 0xcb => 0x535e, 0xcc => 0x5384, 0xcd => 0x53cb,
+    0xce => 0x53ca, 0xcf => 0x53cd, 0xd0 => 0x58ec, 0xd1 => 0x5929,
+    0xd2 => 0x592b, 0xd3 => 0x592a, 0xd4 => 0x592d, 0xd5 => 0x5b54,
+    0xd6 => 0x5c11, 0xd7 => 0x5c24, 0xd8 => 0x5c3a, 0xd9 => 0x5c6f,
+    0xda => 0x5df4, 0xdb => 0x5e7b, 0xdc => 0x5eff, 0xdd => 0x5f14,
+    0xde => 0x5f15, 0xdf => 0x5fc3, 0xe0 => 0x6208, 0xe1 => 0x6236,
+    0xe2 => 0x624b, 0xe3 => 0x624e, 0xe4 => 0x652f, 0xe5 => 0x6587,
+    0xe6 => 0x6597, 0xe7 => 0x65a4, 0xe8 => 0x65b9, 0xe9 => 0x65e5,
+    0xea => 0x66f0, 0xeb => 0x6708, 0xec => 0x6728, 0xed => 0x6b20,
+    0xee => 0x6b62, 0xef => 0x6b79, 0xf0 => 0x6bcb, 0xf1 => 0x6bd4,
+    0xf2 => 0x6bdb, 0xf3 => 0x6c0f, 0xf4 => 0x6c34, 0xf5 => 0x706b,
+    0xf6 => 0x722a, 0xf7 => 0x7236, 0xf8 => 0x723b, 0xf9 => 0x7247,
+    0xfa => 0x7259, 0xfb => 0x725b, 0xfc => 0x72ac, 0xfd => 0x738b,
+    0xfe => 0x4e19,
+  },
+  0xa5 => {
+    0x40 => 0x4e16, 0x41 => 0x4e15, 0x42 => 0x4e14, 0x43 => 0x4e18,
+    0x44 => 0x4e3b, 0x45 => 0x4e4d, 0x46 => 0x4e4f, 0x47 => 0x4e4e,
+    0x48 => 0x4ee5, 0x49 => 0x4ed8, 0x4a => 0x4ed4, 0x4b => 0x4ed5,
+    0x4c => 0x4ed6, 0x4d => 0x4ed7, 0x4e => 0x4ee3, 0x4f => 0x4ee4,
+    0x50 => 0x4ed9, 0x51 => 0x4ede, 0x52 => 0x5145, 0x53 => 0x5144,
+    0x54 => 0x5189, 0x55 => 0x518a, 0x56 => 0x51ac, 0x57 => 0x51f9,
+    0x58 => 0x51fa, 0x59 => 0x51f8, 0x5a => 0x520a, 0x5b => 0x52a0,
+    0x5c => 0x529f, 0x5d => 0x5305, 0x5e => 0x5306, 0x5f => 0x5317,
+    0x60 => 0x531d, 0x61 => 0x4edf, 0x62 => 0x534a, 0x63 => 0x5349,
+    0x64 => 0x5361, 0x65 => 0x5360, 0x66 => 0x536f, 0x67 => 0x536e,
+    0x68 => 0x53bb, 0x69 => 0x53ef, 0x6a => 0x53e4, 0x6b => 0x53f3,
+    0x6c => 0x53ec, 0x6d => 0x53ee, 0x6e => 0x53e9, 0x6f => 0x53e8,
+    0x70 => 0x53fc, 0x71 => 0x53f8, 0x72 => 0x53f5, 0x73 => 0x53eb,
+    0x74 => 0x53e6, 0x75 => 0x53ea, 0x76 => 0x53f2, 0x77 => 0x53f1,
+    0x78 => 0x53f0, 0x79 => 0x53e5, 0x7a => 0x53ed, 0x7b => 0x53fb,
+    0x7c => 0x56db, 0x7d => 0x56da, 0x7e => 0x5916, 0xa1 => 0x592e,
+    0xa2 => 0x5931, 0xa3 => 0x5974, 0xa4 => 0x5976, 0xa5 => 0x5b55,
+    0xa6 => 0x5b83, 0xa7 => 0x5c3c, 0xa8 => 0x5de8, 0xa9 => 0x5de7,
+    0xaa => 0x5de6, 0xab => 0x5e02, 0xac => 0x5e03, 0xad => 0x5e73,
+    0xae => 0x5e7c, 0xaf => 0x5f01, 0xb0 => 0x5f18, 0xb1 => 0x5f17,
+    0xb2 => 0x5fc5, 0xb3 => 0x620a, 0xb4 => 0x6253, 0xb5 => 0x6254,
+    0xb6 => 0x6252, 0xb7 => 0x6251, 0xb8 => 0x65a5, 0xb9 => 0x65e6,
+    0xba => 0x672e, 0xbb => 0x672c, 0xbc => 0x672a, 0xbd => 0x672b,
+    0xbe => 0x672d, 0xbf => 0x6b63, 0xc0 => 0x6bcd, 0xc1 => 0x6c11,
+    0xc2 => 0x6c10, 0xc3 => 0x6c38, 0xc4 => 0x6c41, 0xc5 => 0x6c40,
+    0xc6 => 0x6c3e, 0xc7 => 0x72af, 0xc8 => 0x7384, 0xc9 => 0x7389,
+    0xca => 0x74dc, 0xcb => 0x74e6, 0xcc => 0x7518, 0xcd => 0x751f,
+    0xce => 0x7528, 0xcf => 0x7529, 0xd0 => 0x7530, 0xd1 => 0x7531,
+    0xd2 => 0x7532, 0xd3 => 0x7533, 0xd4 => 0x758b, 0xd5 => 0x767d,
+    0xd6 => 0x76ae, 0xd7 => 0x76bf, 0xd8 => 0x76ee, 0xd9 => 0x77db,
+    0xda => 0x77e2, 0xdb => 0x77f3, 0xdc => 0x793a, 0xdd => 0x79be,
+    0xde => 0x7a74, 0xdf => 0x7acb, 0xe0 => 0x4e1e, 0xe1 => 0x4e1f,
+    0xe2 => 0x4e52, 0xe3 => 0x4e53, 0xe4 => 0x4e69, 0xe5 => 0x4e99,
+    0xe6 => 0x4ea4, 0xe7 => 0x4ea6, 0xe8 => 0x4ea5, 0xe9 => 0x4eff,
+    0xea => 0x4f09, 0xeb => 0x4f19, 0xec => 0x4f0a, 0xed => 0x4f15,
+    0xee => 0x4f0d, 0xef => 0x4f10, 0xf0 => 0x4f11, 0xf1 => 0x4f0f,
+    0xf2 => 0x4ef2, 0xf3 => 0x4ef6, 0xf4 => 0x4efb, 0xf5 => 0x4ef0,
+    0xf6 => 0x4ef3, 0xf7 => 0x4efd, 0xf8 => 0x4f01, 0xf9 => 0x4f0b,
+    0xfa => 0x5149, 0xfb => 0x5147, 0xfc => 0x5146, 0xfd => 0x5148,
+    0xfe => 0x5168,
+  },
+  0xa6 => {
+    0x40 => 0x5171, 0x41 => 0x518d, 0x42 => 0x51b0, 0x43 => 0x5217,
+    0x44 => 0x5211, 0x45 => 0x5212, 0x46 => 0x520e, 0x47 => 0x5216,
+    0x48 => 0x52a3, 0x49 => 0x5308, 0x4a => 0x5321, 0x4b => 0x5320,
+    0x4c => 0x5370, 0x4d => 0x5371, 0x4e => 0x5409, 0x4f => 0x540f,
+    0x50 => 0x540c, 0x51 => 0x540a, 0x52 => 0x5410, 0x53 => 0x5401,
+    0x54 => 0x540b, 0x55 => 0x5404, 0x56 => 0x5411, 0x57 => 0x540d,
+    0x58 => 0x5408, 0x59 => 0x5403, 0x5a => 0x540e, 0x5b => 0x5406,
+    0x5c => 0x5412, 0x5d => 0x56e0, 0x5e => 0x56de, 0x5f => 0x56dd,
+    0x60 => 0x5733, 0x61 => 0x5730, 0x62 => 0x5728, 0x63 => 0x572d,
+    0x64 => 0x572c, 0x65 => 0x572f, 0x66 => 0x5729, 0x67 => 0x5919,
+    0x68 => 0x591a, 0x69 => 0x5937, 0x6a => 0x5938, 0x6b => 0x5984,
+    0x6c => 0x5978, 0x6d => 0x5983, 0x6e => 0x597d, 0x6f => 0x5979,
+    0x70 => 0x5982, 0x71 => 0x5981, 0x72 => 0x5b57, 0x73 => 0x5b58,
+    0x74 => 0x5b87, 0x75 => 0x5b88, 0x76 => 0x5b85, 0x77 => 0x5b89,
+    0x78 => 0x5bfa, 0x79 => 0x5c16, 0x7a => 0x5c79, 0x7b => 0x5dde,
+    0x7c => 0x5e06, 0x7d => 0x5e76, 0x7e => 0x5e74, 0xa1 => 0x5f0f,
+    0xa2 => 0x5f1b, 0xa3 => 0x5fd9, 0xa4 => 0x5fd6, 0xa5 => 0x620e,
+    0xa6 => 0x620c, 0xa7 => 0x620d, 0xa8 => 0x6210, 0xa9 => 0x6263,
+    0xaa => 0x625b, 0xab => 0x6258, 0xac => 0x6536, 0xad => 0x65e9,
+    0xae => 0x65e8, 0xaf => 0x65ec, 0xb0 => 0x65ed, 0xb1 => 0x66f2,
+    0xb2 => 0x66f3, 0xb3 => 0x6709, 0xb4 => 0x673d, 0xb5 => 0x6734,
+    0xb6 => 0x6731, 0xb7 => 0x6735, 0xb8 => 0x6b21, 0xb9 => 0x6b64,
+    0xba => 0x6b7b, 0xbb => 0x6c16, 0xbc => 0x6c5d, 0xbd => 0x6c57,
+    0xbe => 0x6c59, 0xbf => 0x6c5f, 0xc0 => 0x6c60, 0xc1 => 0x6c50,
+    0xc2 => 0x6c55, 0xc3 => 0x6c61, 0xc4 => 0x6c5b, 0xc5 => 0x6c4d,
+    0xc6 => 0x6c4e, 0xc7 => 0x7070, 0xc8 => 0x725f, 0xc9 => 0x725d,
+    0xca => 0x767e, 0xcb => 0x7af9, 0xcc => 0x7c73, 0xcd => 0x7cf8,
+    0xce => 0x7f36, 0xcf => 0x7f8a, 0xd0 => 0x7fbd, 0xd1 => 0x8001,
+    0xd2 => 0x8003, 0xd3 => 0x800c, 0xd4 => 0x8012, 0xd5 => 0x8033,
+    0xd6 => 0x807f, 0xd7 => 0x8089, 0xd8 => 0x808b, 0xd9 => 0x808c,
+    0xda => 0x81e3, 0xdb => 0x81ea, 0xdc => 0x81f3, 0xdd => 0x81fc,
+    0xde => 0x820c, 0xdf => 0x821b, 0xe0 => 0x821f, 0xe1 => 0x826e,
+    0xe2 => 0x8272, 0xe3 => 0x827e, 0xe4 => 0x866b, 0xe5 => 0x8840,
+    0xe6 => 0x884c, 0xe7 => 0x8863, 0xe8 => 0x897f, 0xe9 => 0x9621,
+    0xea => 0x4e32, 0xeb => 0x4ea8, 0xec => 0x4f4d, 0xed => 0x4f4f,
+    0xee => 0x4f47, 0xef => 0x4f57, 0xf0 => 0x4f5e, 0xf1 => 0x4f34,
+    0xf2 => 0x4f5b, 0xf3 => 0x4f55, 0xf4 => 0x4f30, 0xf5 => 0x4f50,
+    0xf6 => 0x4f51, 0xf7 => 0x4f3d, 0xf8 => 0x4f3a, 0xf9 => 0x4f38,
+    0xfa => 0x4f43, 0xfb => 0x4f54, 0xfc => 0x4f3c, 0xfd => 0x4f46,
+    0xfe => 0x4f63,
+  },
+  0xa7 => {
+    0x40 => 0x4f5c, 0x41 => 0x4f60, 0x42 => 0x4f2f, 0x43 => 0x4f4e,
+    0x44 => 0x4f36, 0x45 => 0x4f59, 0x46 => 0x4f5d, 0x47 => 0x4f48,
+    0x48 => 0x4f5a, 0x49 => 0x514c, 0x4a => 0x514b, 0x4b => 0x514d,
+    0x4c => 0x5175, 0x4d => 0x51b6, 0x4e => 0x51b7, 0x4f => 0x5225,
+    0x50 => 0x5224, 0x51 => 0x5229, 0x52 => 0x522a, 0x53 => 0x5228,
+    0x54 => 0x52ab, 0x55 => 0x52a9, 0x56 => 0x52aa, 0x57 => 0x52ac,
+    0x58 => 0x5323, 0x59 => 0x5373, 0x5a => 0x5375, 0x5b => 0x541d,
+    0x5c => 0x542d, 0x5d => 0x541e, 0x5e => 0x543e, 0x5f => 0x5426,
+    0x60 => 0x544e, 0x61 => 0x5427, 0x62 => 0x5446, 0x63 => 0x5443,
+    0x64 => 0x5433, 0x65 => 0x5448, 0x66 => 0x5442, 0x67 => 0x541b,
+    0x68 => 0x5429, 0x69 => 0x544a, 0x6a => 0x5439, 0x6b => 0x543b,
+    0x6c => 0x5438, 0x6d => 0x542e, 0x6e => 0x5435, 0x6f => 0x5436,
+    0x70 => 0x5420, 0x71 => 0x543c, 0x72 => 0x5440, 0x73 => 0x5431,
+    0x74 => 0x542b, 0x75 => 0x541f, 0x76 => 0x542c, 0x77 => 0x56ea,
+    0x78 => 0x56f0, 0x79 => 0x56e4, 0x7a => 0x56eb, 0x7b => 0x574a,
+    0x7c => 0x5751, 0x7d => 0x5740, 0x7e => 0x574d, 0xa1 => 0x5747,
+    0xa2 => 0x574e, 0xa3 => 0x573e, 0xa4 => 0x5750, 0xa5 => 0x574f,
+    0xa6 => 0x573b, 0xa7 => 0x58ef, 0xa8 => 0x593e, 0xa9 => 0x599d,
+    0xaa => 0x5992, 0xab => 0x59a8, 0xac => 0x599e, 0xad => 0x59a3,
+    0xae => 0x5999, 0xaf => 0x5996, 0xb0 => 0x598d, 0xb1 => 0x59a4,
+    0xb2 => 0x5993, 0xb3 => 0x598a, 0xb4 => 0x59a5, 0xb5 => 0x5b5d,
+    0xb6 => 0x5b5c, 0xb7 => 0x5b5a, 0xb8 => 0x5b5b, 0xb9 => 0x5b8c,
+    0xba => 0x5b8b, 0xbb => 0x5b8f, 0xbc => 0x5c2c, 0xbd => 0x5c40,
+    0xbe => 0x5c41, 0xbf => 0x5c3f, 0xc0 => 0x5c3e, 0xc1 => 0x5c90,
+    0xc2 => 0x5c91, 0xc3 => 0x5c94, 0xc4 => 0x5c8c, 0xc5 => 0x5deb,
+    0xc6 => 0x5e0c, 0xc7 => 0x5e8f, 0xc8 => 0x5e87, 0xc9 => 0x5e8a,
+    0xca => 0x5ef7, 0xcb => 0x5f04, 0xcc => 0x5f1f, 0xcd => 0x5f64,
+    0xce => 0x5f62, 0xcf => 0x5f77, 0xd0 => 0x5f79, 0xd1 => 0x5fd8,
+    0xd2 => 0x5fcc, 0xd3 => 0x5fd7, 0xd4 => 0x5fcd, 0xd5 => 0x5ff1,
+    0xd6 => 0x5feb, 0xd7 => 0x5ff8, 0xd8 => 0x5fea, 0xd9 => 0x6212,
+    0xda => 0x6211, 0xdb => 0x6284, 0xdc => 0x6297, 0xdd => 0x6296,
+    0xde => 0x6280, 0xdf => 0x6276, 0xe0 => 0x6289, 0xe1 => 0x626d,
+    0xe2 => 0x628a, 0xe3 => 0x627c, 0xe4 => 0x627e, 0xe5 => 0x6279,
+    0xe6 => 0x6273, 0xe7 => 0x6292, 0xe8 => 0x626f, 0xe9 => 0x6298,
+    0xea => 0x626e, 0xeb => 0x6295, 0xec => 0x6293, 0xed => 0x6291,
+    0xee => 0x6286, 0xef => 0x6539, 0xf0 => 0x653b, 0xf1 => 0x6538,
+    0xf2 => 0x65f1, 0xf3 => 0x66f4, 0xf4 => 0x675f, 0xf5 => 0x674e,
+    0xf6 => 0x674f, 0xf7 => 0x6750, 0xf8 => 0x6751, 0xf9 => 0x675c,
+    0xfa => 0x6756, 0xfb => 0x675e, 0xfc => 0x6749, 0xfd => 0x6746,
+    0xfe => 0x6760,
+  },
+  0xa8 => {
+    0x40 => 0x6753, 0x41 => 0x6757, 0x42 => 0x6b65, 0x43 => 0x6bcf,
+    0x44 => 0x6c42, 0x45 => 0x6c5e, 0x46 => 0x6c99, 0x47 => 0x6c81,
+    0x48 => 0x6c88, 0x49 => 0x6c89, 0x4a => 0x6c85, 0x4b => 0x6c9b,
+    0x4c => 0x6c6a, 0x4d => 0x6c7a, 0x4e => 0x6c90, 0x4f => 0x6c70,
+    0x50 => 0x6c8c, 0x51 => 0x6c68, 0x52 => 0x6c96, 0x53 => 0x6c92,
+    0x54 => 0x6c7d, 0x55 => 0x6c83, 0x56 => 0x6c72, 0x57 => 0x6c7e,
+    0x58 => 0x6c74, 0x59 => 0x6c86, 0x5a => 0x6c76, 0x5b => 0x6c8d,
+    0x5c => 0x6c94, 0x5d => 0x6c98, 0x5e => 0x6c82, 0x5f => 0x7076,
+    0x60 => 0x707c, 0x61 => 0x707d, 0x62 => 0x7078, 0x63 => 0x7262,
+    0x64 => 0x7261, 0x65 => 0x7260, 0x66 => 0x72c4, 0x67 => 0x72c2,
+    0x68 => 0x7396, 0x69 => 0x752c, 0x6a => 0x752b, 0x6b => 0x7537,
+    0x6c => 0x7538, 0x6d => 0x7682, 0x6e => 0x76ef, 0x6f => 0x77e3,
+    0x70 => 0x79c1, 0x71 => 0x79c0, 0x72 => 0x79bf, 0x73 => 0x7a76,
+    0x74 => 0x7cfb, 0x75 => 0x7f55, 0x76 => 0x8096, 0x77 => 0x8093,
+    0x78 => 0x809d, 0x79 => 0x8098, 0x7a => 0x809b, 0x7b => 0x809a,
+    0x7c => 0x80b2, 0x7d => 0x826f, 0x7e => 0x8292, 0xa1 => 0x828b,
+    0xa2 => 0x828d, 0xa3 => 0x898b, 0xa4 => 0x89d2, 0xa5 => 0x8a00,
+    0xa6 => 0x8c37, 0xa7 => 0x8c46, 0xa8 => 0x8c55, 0xa9 => 0x8c9d,
+    0xaa => 0x8d64, 0xab => 0x8d70, 0xac => 0x8db3, 0xad => 0x8eab,
+    0xae => 0x8eca, 0xaf => 0x8f9b, 0xb0 => 0x8fb0, 0xb1 => 0x8fc2,
+    0xb2 => 0x8fc6, 0xb3 => 0x8fc5, 0xb4 => 0x8fc4, 0xb5 => 0x5de1,
+    0xb6 => 0x9091, 0xb7 => 0x90a2, 0xb8 => 0x90aa, 0xb9 => 0x90a6,
+    0xba => 0x90a3, 0xbb => 0x9149, 0xbc => 0x91c6, 0xbd => 0x91cc,
+    0xbe => 0x9632, 0xbf => 0x962e, 0xc0 => 0x9631, 0xc1 => 0x962a,
+    0xc2 => 0x962c, 0xc3 => 0x4e26, 0xc4 => 0x4e56, 0xc5 => 0x4e73,
+    0xc6 => 0x4e8b, 0xc7 => 0x4e9b, 0xc8 => 0x4e9e, 0xc9 => 0x4eab,
+    0xca => 0x4eac, 0xcb => 0x4f6f, 0xcc => 0x4f9d, 0xcd => 0x4f8d,
+    0xce => 0x4f73, 0xcf => 0x4f7f, 0xd0 => 0x4f6c, 0xd1 => 0x4f9b,
+    0xd2 => 0x4f8b, 0xd3 => 0x4f86, 0xd4 => 0x4f83, 0xd5 => 0x4f70,
+    0xd6 => 0x4f75, 0xd7 => 0x4f88, 0xd8 => 0x4f69, 0xd9 => 0x4f7b,
+    0xda => 0x4f96, 0xdb => 0x4f7e, 0xdc => 0x4f8f, 0xdd => 0x4f91,
+    0xde => 0x4f7a, 0xdf => 0x5154, 0xe0 => 0x5152, 0xe1 => 0x5155,
+    0xe2 => 0x5169, 0xe3 => 0x5177, 0xe4 => 0x5176, 0xe5 => 0x5178,
+    0xe6 => 0x51bd, 0xe7 => 0x51fd, 0xe8 => 0x523b, 0xe9 => 0x5238,
+    0xea => 0x5237, 0xeb => 0x523a, 0xec => 0x5230, 0xed => 0x522e,
+    0xee => 0x5236, 0xef => 0x5241, 0xf0 => 0x52be, 0xf1 => 0x52bb,
+    0xf2 => 0x5352, 0xf3 => 0x5354, 0xf4 => 0x5353, 0xf5 => 0x5351,
+    0xf6 => 0x5366, 0xf7 => 0x5377, 0xf8 => 0x5378, 0xf9 => 0x5379,
+    0xfa => 0x53d6, 0xfb => 0x53d4, 0xfc => 0x53d7, 0xfd => 0x5473,
+    0xfe => 0x5475,
+  },
+  0xa9 => {
+    0x40 => 0x5496, 0x41 => 0x5478, 0x42 => 0x5495, 0x43 => 0x5480,
+    0x44 => 0x547b, 0x45 => 0x5477, 0x46 => 0x5484, 0x47 => 0x5492,
+    0x48 => 0x5486, 0x49 => 0x547c, 0x4a => 0x5490, 0x4b => 0x5471,
+    0x4c => 0x5476, 0x4d => 0x548c, 0x4e => 0x549a, 0x4f => 0x5462,
+    0x50 => 0x5468, 0x51 => 0x548b, 0x52 => 0x547d, 0x53 => 0x548e,
+    0x54 => 0x56fa, 0x55 => 0x5783, 0x56 => 0x5777, 0x57 => 0x576a,
+    0x58 => 0x5769, 0x59 => 0x5761, 0x5a => 0x5766, 0x5b => 0x5764,
+    0x5c => 0x577c, 0x5d => 0x591c, 0x5e => 0x5949, 0x5f => 0x5947,
+    0x60 => 0x5948, 0x61 => 0x5944, 0x62 => 0x5954, 0x63 => 0x59be,
+    0x64 => 0x59bb, 0x65 => 0x59d4, 0x66 => 0x59b9, 0x67 => 0x59ae,
+    0x68 => 0x59d1, 0x69 => 0x59c6, 0x6a => 0x59d0, 0x6b => 0x59cd,
+    0x6c => 0x59cb, 0x6d => 0x59d3, 0x6e => 0x59ca, 0x6f => 0x59af,
+    0x70 => 0x59b3, 0x71 => 0x59d2, 0x72 => 0x59c5, 0x73 => 0x5b5f,
+    0x74 => 0x5b64, 0x75 => 0x5b63, 0x76 => 0x5b97, 0x77 => 0x5b9a,
+    0x78 => 0x5b98, 0x79 => 0x5b9c, 0x7a => 0x5b99, 0x7b => 0x5b9b,
+    0x7c => 0x5c1a, 0x7d => 0x5c48, 0x7e => 0x5c45, 0xa1 => 0x5c46,
+    0xa2 => 0x5cb7, 0xa3 => 0x5ca1, 0xa4 => 0x5cb8, 0xa5 => 0x5ca9,
+    0xa6 => 0x5cab, 0xa7 => 0x5cb1, 0xa8 => 0x5cb3, 0xa9 => 0x5e18,
+    0xaa => 0x5e1a, 0xab => 0x5e16, 0xac => 0x5e15, 0xad => 0x5e1b,
+    0xae => 0x5e11, 0xaf => 0x5e78, 0xb0 => 0x5e9a, 0xb1 => 0x5e97,
+    0xb2 => 0x5e9c, 0xb3 => 0x5e95, 0xb4 => 0x5e96, 0xb5 => 0x5ef6,
+    0xb6 => 0x5f26, 0xb7 => 0x5f27, 0xb8 => 0x5f29, 0xb9 => 0x5f80,
+    0xba => 0x5f81, 0xbb => 0x5f7f, 0xbc => 0x5f7c, 0xbd => 0x5fdd,
+    0xbe => 0x5fe0, 0xbf => 0x5ffd, 0xc0 => 0x5ff5, 0xc1 => 0x5fff,
+    0xc2 => 0x600f, 0xc3 => 0x6014, 0xc4 => 0x602f, 0xc5 => 0x6035,
+    0xc6 => 0x6016, 0xc7 => 0x602a, 0xc8 => 0x6015, 0xc9 => 0x6021,
+    0xca => 0x6027, 0xcb => 0x6029, 0xcc => 0x602b, 0xcd => 0x601b,
+    0xce => 0x6216, 0xcf => 0x6215, 0xd0 => 0x623f, 0xd1 => 0x623e,
+    0xd2 => 0x6240, 0xd3 => 0x627f, 0xd4 => 0x62c9, 0xd5 => 0x62cc,
+    0xd6 => 0x62c4, 0xd7 => 0x62bf, 0xd8 => 0x62c2, 0xd9 => 0x62b9,
+    0xda => 0x62d2, 0xdb => 0x62db, 0xdc => 0x62ab, 0xdd => 0x62d3,
+    0xde => 0x62d4, 0xdf => 0x62cb, 0xe0 => 0x62c8, 0xe1 => 0x62a8,
+    0xe2 => 0x62bd, 0xe3 => 0x62bc, 0xe4 => 0x62d0, 0xe5 => 0x62d9,
+    0xe6 => 0x62c7, 0xe7 => 0x62cd, 0xe8 => 0x62b5, 0xe9 => 0x62da,
+    0xea => 0x62b1, 0xeb => 0x62d8, 0xec => 0x62d6, 0xed => 0x62d7,
+    0xee => 0x62c6, 0xef => 0x62ac, 0xf0 => 0x62ce, 0xf1 => 0x653e,
+    0xf2 => 0x65a7, 0xf3 => 0x65bc, 0xf4 => 0x65fa, 0xf5 => 0x6614,
+    0xf6 => 0x6613, 0xf7 => 0x660c, 0xf8 => 0x6606, 0xf9 => 0x6602,
+    0xfa => 0x660e, 0xfb => 0x6600, 0xfc => 0x660f, 0xfd => 0x6615,
+    0xfe => 0x660a,
+  },
+  0xaa => {
+    0x40 => 0x6607, 0x41 => 0x670d, 0x42 => 0x670b, 0x43 => 0x676d,
+    0x44 => 0x678b, 0x45 => 0x6795, 0x46 => 0x6771, 0x47 => 0x679c,
+    0x48 => 0x6773, 0x49 => 0x6777, 0x4a => 0x6787, 0x4b => 0x679d,
+    0x4c => 0x6797, 0x4d => 0x676f, 0x4e => 0x6770, 0x4f => 0x677f,
+    0x50 => 0x6789, 0x51 => 0x677e, 0x52 => 0x6790, 0x53 => 0x6775,
+    0x54 => 0x679a, 0x55 => 0x6793, 0x56 => 0x677c, 0x57 => 0x676a,
+    0x58 => 0x6772, 0x59 => 0x6b23, 0x5a => 0x6b66, 0x5b => 0x6b67,
+    0x5c => 0x6b7f, 0x5d => 0x6c13, 0x5e => 0x6c1b, 0x5f => 0x6ce3,
+    0x60 => 0x6ce8, 0x61 => 0x6cf3, 0x62 => 0x6cb1, 0x63 => 0x6ccc,
+    0x64 => 0x6ce5, 0x65 => 0x6cb3, 0x66 => 0x6cbd, 0x67 => 0x6cbe,
+    0x68 => 0x6cbc, 0x69 => 0x6ce2, 0x6a => 0x6cab, 0x6b => 0x6cd5,
+    0x6c => 0x6cd3, 0x6d => 0x6cb8, 0x6e => 0x6cc4, 0x6f => 0x6cb9,
+    0x70 => 0x6cc1, 0x71 => 0x6cae, 0x72 => 0x6cd7, 0x73 => 0x6cc5,
+    0x74 => 0x6cf1, 0x75 => 0x6cbf, 0x76 => 0x6cbb, 0x77 => 0x6ce1,
+    0x78 => 0x6cdb, 0x79 => 0x6cca, 0x7a => 0x6cac, 0x7b => 0x6cef,
+    0x7c => 0x6cdc, 0x7d => 0x6cd6, 0x7e => 0x6ce0, 0xa1 => 0x7095,
+    0xa2 => 0x708e, 0xa3 => 0x7092, 0xa4 => 0x708a, 0xa5 => 0x7099,
+    0xa6 => 0x722c, 0xa7 => 0x722d, 0xa8 => 0x7238, 0xa9 => 0x7248,
+    0xaa => 0x7267, 0xab => 0x7269, 0xac => 0x72c0, 0xad => 0x72ce,
+    0xae => 0x72d9, 0xaf => 0x72d7, 0xb0 => 0x72d0, 0xb1 => 0x73a9,
+    0xb2 => 0x73a8, 0xb3 => 0x739f, 0xb4 => 0x73ab, 0xb5 => 0x73a5,
+    0xb6 => 0x753d, 0xb7 => 0x759d, 0xb8 => 0x7599, 0xb9 => 0x759a,
+    0xba => 0x7684, 0xbb => 0x76c2, 0xbc => 0x76f2, 0xbd => 0x76f4,
+    0xbe => 0x77e5, 0xbf => 0x77fd, 0xc0 => 0x793e, 0xc1 => 0x7940,
+    0xc2 => 0x7941, 0xc3 => 0x79c9, 0xc4 => 0x79c8, 0xc5 => 0x7a7a,
+    0xc6 => 0x7a79, 0xc7 => 0x7afa, 0xc8 => 0x7cfe, 0xc9 => 0x7f54,
+    0xca => 0x7f8c, 0xcb => 0x7f8b, 0xcc => 0x8005, 0xcd => 0x80ba,
+    0xce => 0x80a5, 0xcf => 0x80a2, 0xd0 => 0x80b1, 0xd1 => 0x80a1,
+    0xd2 => 0x80ab, 0xd3 => 0x80a9, 0xd4 => 0x80b4, 0xd5 => 0x80aa,
+    0xd6 => 0x80af, 0xd7 => 0x81e5, 0xd8 => 0x81fe, 0xd9 => 0x820d,
+    0xda => 0x82b3, 0xdb => 0x829d, 0xdc => 0x8299, 0xdd => 0x82ad,
+    0xde => 0x82bd, 0xdf => 0x829f, 0xe0 => 0x82b9, 0xe1 => 0x82b1,
+    0xe2 => 0x82ac, 0xe3 => 0x82a5, 0xe4 => 0x82af, 0xe5 => 0x82b8,
+    0xe6 => 0x82a3, 0xe7 => 0x82b0, 0xe8 => 0x82be, 0xe9 => 0x82b7,
+    0xea => 0x864e, 0xeb => 0x8671, 0xec => 0x521d, 0xed => 0x8868,
+    0xee => 0x8ecb, 0xef => 0x8fce, 0xf0 => 0x8fd4, 0xf1 => 0x8fd1,
+    0xf2 => 0x90b5, 0xf3 => 0x90b8, 0xf4 => 0x90b1, 0xf5 => 0x90b6,
+    0xf6 => 0x91c7, 0xf7 => 0x91d1, 0xf8 => 0x9577, 0xf9 => 0x9580,
+    0xfa => 0x961c, 0xfb => 0x9640, 0xfc => 0x963f, 0xfd => 0x963b,
+    0xfe => 0x9644,
+  },
+  0xab => {
+    0x40 => 0x9642, 0x41 => 0x96b9, 0x42 => 0x96e8, 0x43 => 0x9752,
+    0x44 => 0x975e, 0x45 => 0x4e9f, 0x46 => 0x4ead, 0x47 => 0x4eae,
+    0x48 => 0x4fe1, 0x49 => 0x4fb5, 0x4a => 0x4faf, 0x4b => 0x4fbf,
+    0x4c => 0x4fe0, 0x4d => 0x4fd1, 0x4e => 0x4fcf, 0x4f => 0x4fdd,
+    0x50 => 0x4fc3, 0x51 => 0x4fb6, 0x52 => 0x4fd8, 0x53 => 0x4fdf,
+    0x54 => 0x4fca, 0x55 => 0x4fd7, 0x56 => 0x4fae, 0x57 => 0x4fd0,
+    0x58 => 0x4fc4, 0x59 => 0x4fc2, 0x5a => 0x4fda, 0x5b => 0x4fce,
+    0x5c => 0x4fde, 0x5d => 0x4fb7, 0x5e => 0x5157, 0x5f => 0x5192,
+    0x60 => 0x5191, 0x61 => 0x51a0, 0x62 => 0x524e, 0x63 => 0x5243,
+    0x64 => 0x524a, 0x65 => 0x524d, 0x66 => 0x524c, 0x67 => 0x524b,
+    0x68 => 0x5247, 0x69 => 0x52c7, 0x6a => 0x52c9, 0x6b => 0x52c3,
+    0x6c => 0x52c1, 0x6d => 0x530d, 0x6e => 0x5357, 0x6f => 0x537b,
+    0x70 => 0x539a, 0x71 => 0x53db, 0x72 => 0x54ac, 0x73 => 0x54c0,
+    0x74 => 0x54a8, 0x75 => 0x54ce, 0x76 => 0x54c9, 0x77 => 0x54b8,
+    0x78 => 0x54a6, 0x79 => 0x54b3, 0x7a => 0x54c7, 0x7b => 0x54c2,
+    0x7c => 0x54bd, 0x7d => 0x54aa, 0x7e => 0x54c1, 0xa1 => 0x54c4,
+    0xa2 => 0x54c8, 0xa3 => 0x54af, 0xa4 => 0x54ab, 0xa5 => 0x54b1,
+    0xa6 => 0x54bb, 0xa7 => 0x54a9, 0xa8 => 0x54a7, 0xa9 => 0x54bf,
+    0xaa => 0x56ff, 0xab => 0x5782, 0xac => 0x578b, 0xad => 0x57a0,
+    0xae => 0x57a3, 0xaf => 0x57a2, 0xb0 => 0x57ce, 0xb1 => 0x57ae,
+    0xb2 => 0x5793, 0xb3 => 0x5955, 0xb4 => 0x5951, 0xb5 => 0x594f,
+    0xb6 => 0x594e, 0xb7 => 0x5950, 0xb8 => 0x59dc, 0xb9 => 0x59d8,
+    0xba => 0x59ff, 0xbb => 0x59e3, 0xbc => 0x59e8, 0xbd => 0x5a03,
+    0xbe => 0x59e5, 0xbf => 0x59ea, 0xc0 => 0x59da, 0xc1 => 0x59e6,
+    0xc2 => 0x5a01, 0xc3 => 0x59fb, 0xc4 => 0x5b69, 0xc5 => 0x5ba3,
+    0xc6 => 0x5ba6, 0xc7 => 0x5ba4, 0xc8 => 0x5ba2, 0xc9 => 0x5ba5,
+    0xca => 0x5c01, 0xcb => 0x5c4e, 0xcc => 0x5c4f, 0xcd => 0x5c4d,
+    0xce => 0x5c4b, 0xcf => 0x5cd9, 0xd0 => 0x5cd2, 0xd1 => 0x5df7,
+    0xd2 => 0x5e1d, 0xd3 => 0x5e25, 0xd4 => 0x5e1f, 0xd5 => 0x5e7d,
+    0xd6 => 0x5ea0, 0xd7 => 0x5ea6, 0xd8 => 0x5efa, 0xd9 => 0x5f08,
+    0xda => 0x5f2d, 0xdb => 0x5f65, 0xdc => 0x5f88, 0xdd => 0x5f85,
+    0xde => 0x5f8a, 0xdf => 0x5f8b, 0xe0 => 0x5f87, 0xe1 => 0x5f8c,
+    0xe2 => 0x5f89, 0xe3 => 0x6012, 0xe4 => 0x601d, 0xe5 => 0x6020,
+    0xe6 => 0x6025, 0xe7 => 0x600e, 0xe8 => 0x6028, 0xe9 => 0x604d,
+    0xea => 0x6070, 0xeb => 0x6068, 0xec => 0x6062, 0xed => 0x6046,
+    0xee => 0x6043, 0xef => 0x606c, 0xf0 => 0x606b, 0xf1 => 0x606a,
+    0xf2 => 0x6064, 0xf3 => 0x6241, 0xf4 => 0x62dc, 0xf5 => 0x6316,
+    0xf6 => 0x6309, 0xf7 => 0x62fc, 0xf8 => 0x62ed, 0xf9 => 0x6301,
+    0xfa => 0x62ee, 0xfb => 0x62fd, 0xfc => 0x6307, 0xfd => 0x62f1,
+    0xfe => 0x62f7,
+  },
+  0xac => {
+    0x40 => 0x62ef, 0x41 => 0x62ec, 0x42 => 0x62fe, 0x43 => 0x62f4,
+    0x44 => 0x6311, 0x45 => 0x6302, 0x46 => 0x653f, 0x47 => 0x6545,
+    0x48 => 0x65ab, 0x49 => 0x65bd, 0x4a => 0x65e2, 0x4b => 0x6625,
+    0x4c => 0x662d, 0x4d => 0x6620, 0x4e => 0x6627, 0x4f => 0x662f,
+    0x50 => 0x661f, 0x51 => 0x6628, 0x52 => 0x6631, 0x53 => 0x6624,
+    0x54 => 0x66f7, 0x55 => 0x67ff, 0x56 => 0x67d3, 0x57 => 0x67f1,
+    0x58 => 0x67d4, 0x59 => 0x67d0, 0x5a => 0x67ec, 0x5b => 0x67b6,
+    0x5c => 0x67af, 0x5d => 0x67f5, 0x5e => 0x67e9, 0x5f => 0x67ef,
+    0x60 => 0x67c4, 0x61 => 0x67d1, 0x62 => 0x67b4, 0x63 => 0x67da,
+    0x64 => 0x67e5, 0x65 => 0x67b8, 0x66 => 0x67cf, 0x67 => 0x67de,
+    0x68 => 0x67f3, 0x69 => 0x67b0, 0x6a => 0x67d9, 0x6b => 0x67e2,
+    0x6c => 0x67dd, 0x6d => 0x67d2, 0x6e => 0x6b6a, 0x6f => 0x6b83,
+    0x70 => 0x6b86, 0x71 => 0x6bb5, 0x72 => 0x6bd2, 0x73 => 0x6bd7,
+    0x74 => 0x6c1f, 0x75 => 0x6cc9, 0x76 => 0x6d0b, 0x77 => 0x6d32,
+    0x78 => 0x6d2a, 0x79 => 0x6d41, 0x7a => 0x6d25, 0x7b => 0x6d0c,
+    0x7c => 0x6d31, 0x7d => 0x6d1e, 0x7e => 0x6d17, 0xa1 => 0x6d3b,
+    0xa2 => 0x6d3d, 0xa3 => 0x6d3e, 0xa4 => 0x6d36, 0xa5 => 0x6d1b,
+    0xa6 => 0x6cf5, 0xa7 => 0x6d39, 0xa8 => 0x6d27, 0xa9 => 0x6d38,
+    0xaa => 0x6d29, 0xab => 0x6d2e, 0xac => 0x6d35, 0xad => 0x6d0e,
+    0xae => 0x6d2b, 0xaf => 0x70ab, 0xb0 => 0x70ba, 0xb1 => 0x70b3,
+    0xb2 => 0x70ac, 0xb3 => 0x70af, 0xb4 => 0x70ad, 0xb5 => 0x70b8,
+    0xb6 => 0x70ae, 0xb7 => 0x70a4, 0xb8 => 0x7230, 0xb9 => 0x7272,
+    0xba => 0x726f, 0xbb => 0x7274, 0xbc => 0x72e9, 0xbd => 0x72e0,
+    0xbe => 0x72e1, 0xbf => 0x73b7, 0xc0 => 0x73ca, 0xc1 => 0x73bb,
+    0xc2 => 0x73b2, 0xc3 => 0x73cd, 0xc4 => 0x73c0, 0xc5 => 0x73b3,
+    0xc6 => 0x751a, 0xc7 => 0x752d, 0xc8 => 0x754f, 0xc9 => 0x754c,
+    0xca => 0x754e, 0xcb => 0x754b, 0xcc => 0x75ab, 0xcd => 0x75a4,
+    0xce => 0x75a5, 0xcf => 0x75a2, 0xd0 => 0x75a3, 0xd1 => 0x7678,
+    0xd2 => 0x7686, 0xd3 => 0x7687, 0xd4 => 0x7688, 0xd5 => 0x76c8,
+    0xd6 => 0x76c6, 0xd7 => 0x76c3, 0xd8 => 0x76c5, 0xd9 => 0x7701,
+    0xda => 0x76f9, 0xdb => 0x76f8, 0xdc => 0x7709, 0xdd => 0x770b,
+    0xde => 0x76fe, 0xdf => 0x76fc, 0xe0 => 0x7707, 0xe1 => 0x77dc,
+    0xe2 => 0x7802, 0xe3 => 0x7814, 0xe4 => 0x780c, 0xe5 => 0x780d,
+    0xe6 => 0x7946, 0xe7 => 0x7949, 0xe8 => 0x7948, 0xe9 => 0x7947,
+    0xea => 0x79b9, 0xeb => 0x79ba, 0xec => 0x79d1, 0xed => 0x79d2,
+    0xee => 0x79cb, 0xef => 0x7a7f, 0xf0 => 0x7a81, 0xf1 => 0x7aff,
+    0xf2 => 0x7afd, 0xf3 => 0x7c7d, 0xf4 => 0x7d02, 0xf5 => 0x7d05,
+    0xf6 => 0x7d00, 0xf7 => 0x7d09, 0xf8 => 0x7d07, 0xf9 => 0x7d04,
+    0xfa => 0x7d06, 0xfb => 0x7f38, 0xfc => 0x7f8e, 0xfd => 0x7fbf,
+    0xfe => 0x8004,
+  },
+  0xad => {
+    0x40 => 0x8010, 0x41 => 0x800d, 0x42 => 0x8011, 0x43 => 0x8036,
+    0x44 => 0x80d6, 0x45 => 0x80e5, 0x46 => 0x80da, 0x47 => 0x80c3,
+    0x48 => 0x80c4, 0x49 => 0x80cc, 0x4a => 0x80e1, 0x4b => 0x80db,
+    0x4c => 0x80ce, 0x4d => 0x80de, 0x4e => 0x80e4, 0x4f => 0x80dd,
+    0x50 => 0x81f4, 0x51 => 0x8222, 0x52 => 0x82e7, 0x53 => 0x8303,
+    0x54 => 0x8305, 0x55 => 0x82e3, 0x56 => 0x82db, 0x57 => 0x82e6,
+    0x58 => 0x8304, 0x59 => 0x82e5, 0x5a => 0x8302, 0x5b => 0x8309,
+    0x5c => 0x82d2, 0x5d => 0x82d7, 0x5e => 0x82f1, 0x5f => 0x8301,
+    0x60 => 0x82dc, 0x61 => 0x82d4, 0x62 => 0x82d1, 0x63 => 0x82de,
+    0x64 => 0x82d3, 0x65 => 0x82df, 0x66 => 0x82ef, 0x67 => 0x8306,
+    0x68 => 0x8650, 0x69 => 0x8679, 0x6a => 0x867b, 0x6b => 0x867a,
+    0x6c => 0x884d, 0x6d => 0x886b, 0x6e => 0x8981, 0x6f => 0x89d4,
+    0x70 => 0x8a08, 0x71 => 0x8a02, 0x72 => 0x8a03, 0x73 => 0x8c9e,
+    0x74 => 0x8ca0, 0x75 => 0x8d74, 0x76 => 0x8d73, 0x77 => 0x8db4,
+    0x78 => 0x8ecd, 0x79 => 0x8ecc, 0x7a => 0x8ff0, 0x7b => 0x8fe6,
+    0x7c => 0x8fe2, 0x7d => 0x8fea, 0x7e => 0x8fe5, 0xa1 => 0x8fed,
+    0xa2 => 0x8feb, 0xa3 => 0x8fe4, 0xa4 => 0x8fe8, 0xa5 => 0x90ca,
+    0xa6 => 0x90ce, 0xa7 => 0x90c1, 0xa8 => 0x90c3, 0xa9 => 0x914b,
+    0xaa => 0x914a, 0xab => 0x91cd, 0xac => 0x9582, 0xad => 0x9650,
+    0xae => 0x964b, 0xaf => 0x964c, 0xb0 => 0x964d, 0xb1 => 0x9762,
+    0xb2 => 0x9769, 0xb3 => 0x97cb, 0xb4 => 0x97ed, 0xb5 => 0x97f3,
+    0xb6 => 0x9801, 0xb7 => 0x98a8, 0xb8 => 0x98db, 0xb9 => 0x98df,
+    0xba => 0x9996, 0xbb => 0x9999, 0xbc => 0x4e58, 0xbd => 0x4eb3,
+    0xbe => 0x500c, 0xbf => 0x500d, 0xc0 => 0x5023, 0xc1 => 0x4fef,
+    0xc2 => 0x5026, 0xc3 => 0x5025, 0xc4 => 0x4ff8, 0xc5 => 0x5029,
+    0xc6 => 0x5016, 0xc7 => 0x5006, 0xc8 => 0x503c, 0xc9 => 0x501f,
+    0xca => 0x501a, 0xcb => 0x5012, 0xcc => 0x5011, 0xcd => 0x4ffa,
+    0xce => 0x5000, 0xcf => 0x5014, 0xd0 => 0x5028, 0xd1 => 0x4ff1,
+    0xd2 => 0x5021, 0xd3 => 0x500b, 0xd4 => 0x5019, 0xd5 => 0x5018,
+    0xd6 => 0x4ff3, 0xd7 => 0x4fee, 0xd8 => 0x502d, 0xd9 => 0x502a,
+    0xda => 0x4ffe, 0xdb => 0x502b, 0xdc => 0x5009, 0xdd => 0x517c,
+    0xde => 0x51a4, 0xdf => 0x51a5, 0xe0 => 0x51a2, 0xe1 => 0x51cd,
+    0xe2 => 0x51cc, 0xe3 => 0x51c6, 0xe4 => 0x51cb, 0xe5 => 0x5256,
+    0xe6 => 0x525c, 0xe7 => 0x5254, 0xe8 => 0x525b, 0xe9 => 0x525d,
+    0xea => 0x532a, 0xeb => 0x537f, 0xec => 0x539f, 0xed => 0x539d,
+    0xee => 0x53df, 0xef => 0x54e8, 0xf0 => 0x5510, 0xf1 => 0x5501,
+    0xf2 => 0x5537, 0xf3 => 0x54fc, 0xf4 => 0x54e5, 0xf5 => 0x54f2,
+    0xf6 => 0x5506, 0xf7 => 0x54fa, 0xf8 => 0x5514, 0xf9 => 0x54e9,
+    0xfa => 0x54ed, 0xfb => 0x54e1, 0xfc => 0x5509, 0xfd => 0x54ee,
+    0xfe => 0x54ea,
+  },
+  0xae => {
+    0x40 => 0x54e6, 0x41 => 0x5527, 0x42 => 0x5507, 0x43 => 0x54fd,
+    0x44 => 0x550f, 0x45 => 0x5703, 0x46 => 0x5704, 0x47 => 0x57c2,
+    0x48 => 0x57d4, 0x49 => 0x57cb, 0x4a => 0x57c3, 0x4b => 0x5809,
+    0x4c => 0x590f, 0x4d => 0x5957, 0x4e => 0x5958, 0x4f => 0x595a,
+    0x50 => 0x5a11, 0x51 => 0x5a18, 0x52 => 0x5a1c, 0x53 => 0x5a1f,
+    0x54 => 0x5a1b, 0x55 => 0x5a13, 0x56 => 0x59ec, 0x57 => 0x5a20,
+    0x58 => 0x5a23, 0x59 => 0x5a29, 0x5a => 0x5a25, 0x5b => 0x5a0c,
+    0x5c => 0x5a09, 0x5d => 0x5b6b, 0x5e => 0x5c58, 0x5f => 0x5bb0,
+    0x60 => 0x5bb3, 0x61 => 0x5bb6, 0x62 => 0x5bb4, 0x63 => 0x5bae,
+    0x64 => 0x5bb5, 0x65 => 0x5bb9, 0x66 => 0x5bb8, 0x67 => 0x5c04,
+    0x68 => 0x5c51, 0x69 => 0x5c55, 0x6a => 0x5c50, 0x6b => 0x5ced,
+    0x6c => 0x5cfd, 0x6d => 0x5cfb, 0x6e => 0x5cea, 0x6f => 0x5ce8,
+    0x70 => 0x5cf0, 0x71 => 0x5cf6, 0x72 => 0x5d01, 0x73 => 0x5cf4,
+    0x74 => 0x5dee, 0x75 => 0x5e2d, 0x76 => 0x5e2b, 0x77 => 0x5eab,
+    0x78 => 0x5ead, 0x79 => 0x5ea7, 0x7a => 0x5f31, 0x7b => 0x5f92,
+    0x7c => 0x5f91, 0x7d => 0x5f90, 0x7e => 0x6059, 0xa1 => 0x6063,
+    0xa2 => 0x6065, 0xa3 => 0x6050, 0xa4 => 0x6055, 0xa5 => 0x606d,
+    0xa6 => 0x6069, 0xa7 => 0x606f, 0xa8 => 0x6084, 0xa9 => 0x609f,
+    0xaa => 0x609a, 0xab => 0x608d, 0xac => 0x6094, 0xad => 0x608c,
+    0xae => 0x6085, 0xaf => 0x6096, 0xb0 => 0x6247, 0xb1 => 0x62f3,
+    0xb2 => 0x6308, 0xb3 => 0x62ff, 0xb4 => 0x634e, 0xb5 => 0x633e,
+    0xb6 => 0x632f, 0xb7 => 0x6355, 0xb8 => 0x6342, 0xb9 => 0x6346,
+    0xba => 0x634f, 0xbb => 0x6349, 0xbc => 0x633a, 0xbd => 0x6350,
+    0xbe => 0x633d, 0xbf => 0x632a, 0xc0 => 0x632b, 0xc1 => 0x6328,
+    0xc2 => 0x634d, 0xc3 => 0x634c, 0xc4 => 0x6548, 0xc5 => 0x6549,
+    0xc6 => 0x6599, 0xc7 => 0x65c1, 0xc8 => 0x65c5, 0xc9 => 0x6642,
+    0xca => 0x6649, 0xcb => 0x664f, 0xcc => 0x6643, 0xcd => 0x6652,
+    0xce => 0x664c, 0xcf => 0x6645, 0xd0 => 0x6641, 0xd1 => 0x66f8,
+    0xd2 => 0x6714, 0xd3 => 0x6715, 0xd4 => 0x6717, 0xd5 => 0x6821,
+    0xd6 => 0x6838, 0xd7 => 0x6848, 0xd8 => 0x6846, 0xd9 => 0x6853,
+    0xda => 0x6839, 0xdb => 0x6842, 0xdc => 0x6854, 0xdd => 0x6829,
+    0xde => 0x68b3, 0xdf => 0x6817, 0xe0 => 0x684c, 0xe1 => 0x6851,
+    0xe2 => 0x683d, 0xe3 => 0x67f4, 0xe4 => 0x6850, 0xe5 => 0x6840,
+    0xe6 => 0x683c, 0xe7 => 0x6843, 0xe8 => 0x682a, 0xe9 => 0x6845,
+    0xea => 0x6813, 0xeb => 0x6818, 0xec => 0x6841, 0xed => 0x6b8a,
+    0xee => 0x6b89, 0xef => 0x6bb7, 0xf0 => 0x6c23, 0xf1 => 0x6c27,
+    0xf2 => 0x6c28, 0xf3 => 0x6c26, 0xf4 => 0x6c24, 0xf5 => 0x6cf0,
+    0xf6 => 0x6d6a, 0xf7 => 0x6d95, 0xf8 => 0x6d88, 0xf9 => 0x6d87,
+    0xfa => 0x6d66, 0xfb => 0x6d78, 0xfc => 0x6d77, 0xfd => 0x6d59,
+    0xfe => 0x6d93,
+  },
+  0xaf => {
+    0x40 => 0x6d6c, 0x41 => 0x6d89, 0x42 => 0x6d6e, 0x43 => 0x6d5a,
+    0x44 => 0x6d74, 0x45 => 0x6d69, 0x46 => 0x6d8c, 0x47 => 0x6d8a,
+    0x48 => 0x6d79, 0x49 => 0x6d85, 0x4a => 0x6d65, 0x4b => 0x6d94,
+    0x4c => 0x70ca, 0x4d => 0x70d8, 0x4e => 0x70e4, 0x4f => 0x70d9,
+    0x50 => 0x70c8, 0x51 => 0x70cf, 0x52 => 0x7239, 0x53 => 0x7279,
+    0x54 => 0x72fc, 0x55 => 0x72f9, 0x56 => 0x72fd, 0x57 => 0x72f8,
+    0x58 => 0x72f7, 0x59 => 0x7386, 0x5a => 0x73ed, 0x5b => 0x7409,
+    0x5c => 0x73ee, 0x5d => 0x73e0, 0x5e => 0x73ea, 0x5f => 0x73de,
+    0x60 => 0x7554, 0x61 => 0x755d, 0x62 => 0x755c, 0x63 => 0x755a,
+    0x64 => 0x7559, 0x65 => 0x75be, 0x66 => 0x75c5, 0x67 => 0x75c7,
+    0x68 => 0x75b2, 0x69 => 0x75b3, 0x6a => 0x75bd, 0x6b => 0x75bc,
+    0x6c => 0x75b9, 0x6d => 0x75c2, 0x6e => 0x75b8, 0x6f => 0x768b,
+    0x70 => 0x76b0, 0x71 => 0x76ca, 0x72 => 0x76cd, 0x73 => 0x76ce,
+    0x74 => 0x7729, 0x75 => 0x771f, 0x76 => 0x7720, 0x77 => 0x7728,
+    0x78 => 0x77e9, 0x79 => 0x7830, 0x7a => 0x7827, 0x7b => 0x7838,
+    0x7c => 0x781d, 0x7d => 0x7834, 0x7e => 0x7837, 0xa1 => 0x7825,
+    0xa2 => 0x782d, 0xa3 => 0x7820, 0xa4 => 0x781f, 0xa5 => 0x7832,
+    0xa6 => 0x7955, 0xa7 => 0x7950, 0xa8 => 0x7960, 0xa9 => 0x795f,
+    0xaa => 0x7956, 0xab => 0x795e, 0xac => 0x795d, 0xad => 0x7957,
+    0xae => 0x795a, 0xaf => 0x79e4, 0xb0 => 0x79e3, 0xb1 => 0x79e7,
+    0xb2 => 0x79df, 0xb3 => 0x79e6, 0xb4 => 0x79e9, 0xb5 => 0x79d8,
+    0xb6 => 0x7a84, 0xb7 => 0x7a88, 0xb8 => 0x7ad9, 0xb9 => 0x7b06,
+    0xba => 0x7b11, 0xbb => 0x7c89, 0xbc => 0x7d21, 0xbd => 0x7d17,
+    0xbe => 0x7d0b, 0xbf => 0x7d0a, 0xc0 => 0x7d20, 0xc1 => 0x7d22,
+    0xc2 => 0x7d14, 0xc3 => 0x7d10, 0xc4 => 0x7d15, 0xc5 => 0x7d1a,
+    0xc6 => 0x7d1c, 0xc7 => 0x7d0d, 0xc8 => 0x7d19, 0xc9 => 0x7d1b,
+    0xca => 0x7f3a, 0xcb => 0x7f5f, 0xcc => 0x7f94, 0xcd => 0x7fc5,
+    0xce => 0x7fc1, 0xcf => 0x8006, 0xd0 => 0x8018, 0xd1 => 0x8015,
+    0xd2 => 0x8019, 0xd3 => 0x8017, 0xd4 => 0x803d, 0xd5 => 0x803f,
+    0xd6 => 0x80f1, 0xd7 => 0x8102, 0xd8 => 0x80f0, 0xd9 => 0x8105,
+    0xda => 0x80ed, 0xdb => 0x80f4, 0xdc => 0x8106, 0xdd => 0x80f8,
+    0xde => 0x80f3, 0xdf => 0x8108, 0xe0 => 0x80fd, 0xe1 => 0x810a,
+    0xe2 => 0x80fc, 0xe3 => 0x80ef, 0xe4 => 0x81ed, 0xe5 => 0x81ec,
+    0xe6 => 0x8200, 0xe7 => 0x8210, 0xe8 => 0x822a, 0xe9 => 0x822b,
+    0xea => 0x8228, 0xeb => 0x822c, 0xec => 0x82bb, 0xed => 0x832b,
+    0xee => 0x8352, 0xef => 0x8354, 0xf0 => 0x834a, 0xf1 => 0x8338,
+    0xf2 => 0x8350, 0xf3 => 0x8349, 0xf4 => 0x8335, 0xf5 => 0x8334,
+    0xf6 => 0x834f, 0xf7 => 0x8332, 0xf8 => 0x8339, 0xf9 => 0x8336,
+    0xfa => 0x8317, 0xfb => 0x8340, 0xfc => 0x8331, 0xfd => 0x8328,
+    0xfe => 0x8343,
+  },
+  0xb0 => {
+    0x40 => 0x8654, 0x41 => 0x868a, 0x42 => 0x86aa, 0x43 => 0x8693,
+    0x44 => 0x86a4, 0x45 => 0x86a9, 0x46 => 0x868c, 0x47 => 0x86a3,
+    0x48 => 0x869c, 0x49 => 0x8870, 0x4a => 0x8877, 0x4b => 0x8881,
+    0x4c => 0x8882, 0x4d => 0x887d, 0x4e => 0x8879, 0x4f => 0x8a18,
+    0x50 => 0x8a10, 0x51 => 0x8a0e, 0x52 => 0x8a0c, 0x53 => 0x8a15,
+    0x54 => 0x8a0a, 0x55 => 0x8a17, 0x56 => 0x8a13, 0x57 => 0x8a16,
+    0x58 => 0x8a0f, 0x59 => 0x8a11, 0x5a => 0x8c48, 0x5b => 0x8c7a,
+    0x5c => 0x8c79, 0x5d => 0x8ca1, 0x5e => 0x8ca2, 0x5f => 0x8d77,
+    0x60 => 0x8eac, 0x61 => 0x8ed2, 0x62 => 0x8ed4, 0x63 => 0x8ecf,
+    0x64 => 0x8fb1, 0x65 => 0x9001, 0x66 => 0x9006, 0x67 => 0x8ff7,
+    0x68 => 0x9000, 0x69 => 0x8ffa, 0x6a => 0x8ff4, 0x6b => 0x9003,
+    0x6c => 0x8ffd, 0x6d => 0x9005, 0x6e => 0x8ff8, 0x6f => 0x9095,
+    0x70 => 0x90e1, 0x71 => 0x90dd, 0x72 => 0x90e2, 0x73 => 0x9152,
+    0x74 => 0x914d, 0x75 => 0x914c, 0x76 => 0x91d8, 0x77 => 0x91dd,
+    0x78 => 0x91d7, 0x79 => 0x91dc, 0x7a => 0x91d9, 0x7b => 0x9583,
+    0x7c => 0x9662, 0x7d => 0x9663, 0x7e => 0x9661, 0xa1 => 0x965b,
+    0xa2 => 0x965d, 0xa3 => 0x9664, 0xa4 => 0x9658, 0xa5 => 0x965e,
+    0xa6 => 0x96bb, 0xa7 => 0x98e2, 0xa8 => 0x99ac, 0xa9 => 0x9aa8,
+    0xaa => 0x9ad8, 0xab => 0x9b25, 0xac => 0x9b32, 0xad => 0x9b3c,
+    0xae => 0x4e7e, 0xaf => 0x507a, 0xb0 => 0x507d, 0xb1 => 0x505c,
+    0xb2 => 0x5047, 0xb3 => 0x5043, 0xb4 => 0x504c, 0xb5 => 0x505a,
+    0xb6 => 0x5049, 0xb7 => 0x5065, 0xb8 => 0x5076, 0xb9 => 0x504e,
+    0xba => 0x5055, 0xbb => 0x5075, 0xbc => 0x5074, 0xbd => 0x5077,
+    0xbe => 0x504f, 0xbf => 0x500f, 0xc0 => 0x506f, 0xc1 => 0x506d,
+    0xc2 => 0x515c, 0xc3 => 0x5195, 0xc4 => 0x51f0, 0xc5 => 0x526a,
+    0xc6 => 0x526f, 0xc7 => 0x52d2, 0xc8 => 0x52d9, 0xc9 => 0x52d8,
+    0xca => 0x52d5, 0xcb => 0x5310, 0xcc => 0x530f, 0xcd => 0x5319,
+    0xce => 0x533f, 0xcf => 0x5340, 0xd0 => 0x533e, 0xd1 => 0x53c3,
+    0xd2 => 0x66fc, 0xd3 => 0x5546, 0xd4 => 0x556a, 0xd5 => 0x5566,
+    0xd6 => 0x5544, 0xd7 => 0x555e, 0xd8 => 0x5561, 0xd9 => 0x5543,
+    0xda => 0x554a, 0xdb => 0x5531, 0xdc => 0x5556, 0xdd => 0x554f,
+    0xde => 0x5555, 0xdf => 0x552f, 0xe0 => 0x5564, 0xe1 => 0x5538,
+    0xe2 => 0x552e, 0xe3 => 0x555c, 0xe4 => 0x552c, 0xe5 => 0x5563,
+    0xe6 => 0x5533, 0xe7 => 0x5541, 0xe8 => 0x5557, 0xe9 => 0x5708,
+    0xea => 0x570b, 0xeb => 0x5709, 0xec => 0x57df, 0xed => 0x5805,
+    0xee => 0x580a, 0xef => 0x5806, 0xf0 => 0x57e0, 0xf1 => 0x57e4,
+    0xf2 => 0x57fa, 0xf3 => 0x5802, 0xf4 => 0x5835, 0xf5 => 0x57f7,
+    0xf6 => 0x57f9, 0xf7 => 0x5920, 0xf8 => 0x5962, 0xf9 => 0x5a36,
+    0xfa => 0x5a41, 0xfb => 0x5a49, 0xfc => 0x5a66, 0xfd => 0x5a6a,
+    0xfe => 0x5a40,
+  },
+  0xb1 => {
+    0x40 => 0x5a3c, 0x41 => 0x5a62, 0x42 => 0x5a5a, 0x43 => 0x5a46,
+    0x44 => 0x5a4a, 0x45 => 0x5b70, 0x46 => 0x5bc7, 0x47 => 0x5bc5,
+    0x48 => 0x5bc4, 0x49 => 0x5bc2, 0x4a => 0x5bbf, 0x4b => 0x5bc6,
+    0x4c => 0x5c09, 0x4d => 0x5c08, 0x4e => 0x5c07, 0x4f => 0x5c60,
+    0x50 => 0x5c5c, 0x51 => 0x5c5d, 0x52 => 0x5d07, 0x53 => 0x5d06,
+    0x54 => 0x5d0e, 0x55 => 0x5d1b, 0x56 => 0x5d16, 0x57 => 0x5d22,
+    0x58 => 0x5d11, 0x59 => 0x5d29, 0x5a => 0x5d14, 0x5b => 0x5d19,
+    0x5c => 0x5d24, 0x5d => 0x5d27, 0x5e => 0x5d17, 0x5f => 0x5de2,
+    0x60 => 0x5e38, 0x61 => 0x5e36, 0x62 => 0x5e33, 0x63 => 0x5e37,
+    0x64 => 0x5eb7, 0x65 => 0x5eb8, 0x66 => 0x5eb6, 0x67 => 0x5eb5,
+    0x68 => 0x5ebe, 0x69 => 0x5f35, 0x6a => 0x5f37, 0x6b => 0x5f57,
+    0x6c => 0x5f6c, 0x6d => 0x5f69, 0x6e => 0x5f6b, 0x6f => 0x5f97,
+    0x70 => 0x5f99, 0x71 => 0x5f9e, 0x72 => 0x5f98, 0x73 => 0x5fa1,
+    0x74 => 0x5fa0, 0x75 => 0x5f9c, 0x76 => 0x607f, 0x77 => 0x60a3,
+    0x78 => 0x6089, 0x79 => 0x60a0, 0x7a => 0x60a8, 0x7b => 0x60cb,
+    0x7c => 0x60b4, 0x7d => 0x60e6, 0x7e => 0x60bd, 0xa1 => 0x60c5,
+    0xa2 => 0x60bb, 0xa3 => 0x60b5, 0xa4 => 0x60dc, 0xa5 => 0x60bc,
+    0xa6 => 0x60d8, 0xa7 => 0x60d5, 0xa8 => 0x60c6, 0xa9 => 0x60df,
+    0xaa => 0x60b8, 0xab => 0x60da, 0xac => 0x60c7, 0xad => 0x621a,
+    0xae => 0x621b, 0xaf => 0x6248, 0xb0 => 0x63a0, 0xb1 => 0x63a7,
+    0xb2 => 0x6372, 0xb3 => 0x6396, 0xb4 => 0x63a2, 0xb5 => 0x63a5,
+    0xb6 => 0x6377, 0xb7 => 0x6367, 0xb8 => 0x6398, 0xb9 => 0x63aa,
+    0xba => 0x6371, 0xbb => 0x63a9, 0xbc => 0x6389, 0xbd => 0x6383,
+    0xbe => 0x639b, 0xbf => 0x636b, 0xc0 => 0x63a8, 0xc1 => 0x6384,
+    0xc2 => 0x6388, 0xc3 => 0x6399, 0xc4 => 0x63a1, 0xc5 => 0x63ac,
+    0xc6 => 0x6392, 0xc7 => 0x638f, 0xc8 => 0x6380, 0xc9 => 0x637b,
+    0xca => 0x6369, 0xcb => 0x6368, 0xcc => 0x637a, 0xcd => 0x655d,
+    0xce => 0x6556, 0xcf => 0x6551, 0xd0 => 0x6559, 0xd1 => 0x6557,
+    0xd2 => 0x555f, 0xd3 => 0x654f, 0xd4 => 0x6558, 0xd5 => 0x6555,
+    0xd6 => 0x6554, 0xd7 => 0x659c, 0xd8 => 0x659b, 0xd9 => 0x65ac,
+    0xda => 0x65cf, 0xdb => 0x65cb, 0xdc => 0x65cc, 0xdd => 0x65ce,
+    0xde => 0x665d, 0xdf => 0x665a, 0xe0 => 0x6664, 0xe1 => 0x6668,
+    0xe2 => 0x6666, 0xe3 => 0x665e, 0xe4 => 0x66f9, 0xe5 => 0x52d7,
+    0xe6 => 0x671b, 0xe7 => 0x6881, 0xe8 => 0x68af, 0xe9 => 0x68a2,
+    0xea => 0x6893, 0xeb => 0x68b5, 0xec => 0x687f, 0xed => 0x6876,
+    0xee => 0x68b1, 0xef => 0x68a7, 0xf0 => 0x6897, 0xf1 => 0x68b0,
+    0xf2 => 0x6883, 0xf3 => 0x68c4, 0xf4 => 0x68ad, 0xf5 => 0x6886,
+    0xf6 => 0x6885, 0xf7 => 0x6894, 0xf8 => 0x689d, 0xf9 => 0x68a8,
+    0xfa => 0x689f, 0xfb => 0x68a1, 0xfc => 0x6882, 0xfd => 0x6b32,
+    0xfe => 0x6bba,
+  },
+  0xb2 => {
+    0x40 => 0x6beb, 0x41 => 0x6bec, 0x42 => 0x6c2b, 0x43 => 0x6d8e,
+    0x44 => 0x6dbc, 0x45 => 0x6df3, 0x46 => 0x6dd9, 0x47 => 0x6db2,
+    0x48 => 0x6de1, 0x49 => 0x6dcc, 0x4a => 0x6de4, 0x4b => 0x6dfb,
+    0x4c => 0x6dfa, 0x4d => 0x6e05, 0x4e => 0x6dc7, 0x4f => 0x6dcb,
+    0x50 => 0x6daf, 0x51 => 0x6dd1, 0x52 => 0x6dae, 0x53 => 0x6dde,
+    0x54 => 0x6df9, 0x55 => 0x6db8, 0x56 => 0x6df7, 0x57 => 0x6df5,
+    0x58 => 0x6dc5, 0x59 => 0x6dd2, 0x5a => 0x6e1a, 0x5b => 0x6db5,
+    0x5c => 0x6dda, 0x5d => 0x6deb, 0x5e => 0x6dd8, 0x5f => 0x6dea,
+    0x60 => 0x6df1, 0x61 => 0x6dee, 0x62 => 0x6de8, 0x63 => 0x6dc6,
+    0x64 => 0x6dc4, 0x65 => 0x6daa, 0x66 => 0x6dec, 0x67 => 0x6dbf,
+    0x68 => 0x6de6, 0x69 => 0x70f9, 0x6a => 0x7109, 0x6b => 0x710a,
+    0x6c => 0x70fd, 0x6d => 0x70ef, 0x6e => 0x723d, 0x6f => 0x727d,
+    0x70 => 0x7281, 0x71 => 0x731c, 0x72 => 0x731b, 0x73 => 0x7316,
+    0x74 => 0x7313, 0x75 => 0x7319, 0x76 => 0x7387, 0x77 => 0x7405,
+    0x78 => 0x740a, 0x79 => 0x7403, 0x7a => 0x7406, 0x7b => 0x73fe,
+    0x7c => 0x740d, 0x7d => 0x74e0, 0x7e => 0x74f6, 0xa1 => 0x74f7,
+    0xa2 => 0x751c, 0xa3 => 0x7522, 0xa4 => 0x7565, 0xa5 => 0x7566,
+    0xa6 => 0x7562, 0xa7 => 0x7570, 0xa8 => 0x758f, 0xa9 => 0x75d4,
+    0xaa => 0x75d5, 0xab => 0x75b5, 0xac => 0x75ca, 0xad => 0x75cd,
+    0xae => 0x768e, 0xaf => 0x76d4, 0xb0 => 0x76d2, 0xb1 => 0x76db,
+    0xb2 => 0x7737, 0xb3 => 0x773e, 0xb4 => 0x773c, 0xb5 => 0x7736,
+    0xb6 => 0x7738, 0xb7 => 0x773a, 0xb8 => 0x786b, 0xb9 => 0x7843,
+    0xba => 0x784e, 0xbb => 0x7965, 0xbc => 0x7968, 0xbd => 0x796d,
+    0xbe => 0x79fb, 0xbf => 0x7a92, 0xc0 => 0x7a95, 0xc1 => 0x7b20,
+    0xc2 => 0x7b28, 0xc3 => 0x7b1b, 0xc4 => 0x7b2c, 0xc5 => 0x7b26,
+    0xc6 => 0x7b19, 0xc7 => 0x7b1e, 0xc8 => 0x7b2e, 0xc9 => 0x7c92,
+    0xca => 0x7c97, 0xcb => 0x7c95, 0xcc => 0x7d46, 0xcd => 0x7d43,
+    0xce => 0x7d71, 0xcf => 0x7d2e, 0xd0 => 0x7d39, 0xd1 => 0x7d3c,
+    0xd2 => 0x7d40, 0xd3 => 0x7d30, 0xd4 => 0x7d33, 0xd5 => 0x7d44,
+    0xd6 => 0x7d2f, 0xd7 => 0x7d42, 0xd8 => 0x7d32, 0xd9 => 0x7d31,
+    0xda => 0x7f3d, 0xdb => 0x7f9e, 0xdc => 0x7f9a, 0xdd => 0x7fcc,
+    0xde => 0x7fce, 0xdf => 0x7fd2, 0xe0 => 0x801c, 0xe1 => 0x804a,
+    0xe2 => 0x8046, 0xe3 => 0x812f, 0xe4 => 0x8116, 0xe5 => 0x8123,
+    0xe6 => 0x812b, 0xe7 => 0x8129, 0xe8 => 0x8130, 0xe9 => 0x8124,
+    0xea => 0x8202, 0xeb => 0x8235, 0xec => 0x8237, 0xed => 0x8236,
+    0xee => 0x8239, 0xef => 0x838e, 0xf0 => 0x839e, 0xf1 => 0x8398,
+    0xf2 => 0x8378, 0xf3 => 0x83a2, 0xf4 => 0x8396, 0xf5 => 0x83bd,
+    0xf6 => 0x83ab, 0xf7 => 0x8392, 0xf8 => 0x838a, 0xf9 => 0x8393,
+    0xfa => 0x8389, 0xfb => 0x83a0, 0xfc => 0x8377, 0xfd => 0x837b,
+    0xfe => 0x837c,
+  },
+  0xb3 => {
+    0x40 => 0x8386, 0x41 => 0x83a7, 0x42 => 0x8655, 0x43 => 0x5f6a,
+    0x44 => 0x86c7, 0x45 => 0x86c0, 0x46 => 0x86b6, 0x47 => 0x86c4,
+    0x48 => 0x86b5, 0x49 => 0x86c6, 0x4a => 0x86cb, 0x4b => 0x86b1,
+    0x4c => 0x86af, 0x4d => 0x86c9, 0x4e => 0x8853, 0x4f => 0x889e,
+    0x50 => 0x8888, 0x51 => 0x88ab, 0x52 => 0x8892, 0x53 => 0x8896,
+    0x54 => 0x888d, 0x55 => 0x888b, 0x56 => 0x8993, 0x57 => 0x898f,
+    0x58 => 0x8a2a, 0x59 => 0x8a1d, 0x5a => 0x8a23, 0x5b => 0x8a25,
+    0x5c => 0x8a31, 0x5d => 0x8a2d, 0x5e => 0x8a1f, 0x5f => 0x8a1b,
+    0x60 => 0x8a22, 0x61 => 0x8c49, 0x62 => 0x8c5a, 0x63 => 0x8ca9,
+    0x64 => 0x8cac, 0x65 => 0x8cab, 0x66 => 0x8ca8, 0x67 => 0x8caa,
+    0x68 => 0x8ca7, 0x69 => 0x8d67, 0x6a => 0x8d66, 0x6b => 0x8dbe,
+    0x6c => 0x8dba, 0x6d => 0x8edb, 0x6e => 0x8edf, 0x6f => 0x9019,
+    0x70 => 0x900d, 0x71 => 0x901a, 0x72 => 0x9017, 0x73 => 0x9023,
+    0x74 => 0x901f, 0x75 => 0x901d, 0x76 => 0x9010, 0x77 => 0x9015,
+    0x78 => 0x901e, 0x79 => 0x9020, 0x7a => 0x900f, 0x7b => 0x9022,
+    0x7c => 0x9016, 0x7d => 0x901b, 0x7e => 0x9014, 0xa1 => 0x90e8,
+    0xa2 => 0x90ed, 0xa3 => 0x90fd, 0xa4 => 0x9157, 0xa5 => 0x91ce,
+    0xa6 => 0x91f5, 0xa7 => 0x91e6, 0xa8 => 0x91e3, 0xa9 => 0x91e7,
+    0xaa => 0x91ed, 0xab => 0x91e9, 0xac => 0x9589, 0xad => 0x966a,
+    0xae => 0x9675, 0xaf => 0x9673, 0xb0 => 0x9678, 0xb1 => 0x9670,
+    0xb2 => 0x9674, 0xb3 => 0x9676, 0xb4 => 0x9677, 0xb5 => 0x966c,
+    0xb6 => 0x96c0, 0xb7 => 0x96ea, 0xb8 => 0x96e9, 0xb9 => 0x7ae0,
+    0xba => 0x7adf, 0xbb => 0x9802, 0xbc => 0x9803, 0xbd => 0x9b5a,
+    0xbe => 0x9ce5, 0xbf => 0x9e75, 0xc0 => 0x9e7f, 0xc1 => 0x9ea5,
+    0xc2 => 0x9ebb, 0xc3 => 0x50a2, 0xc4 => 0x508d, 0xc5 => 0x5085,
+    0xc6 => 0x5099, 0xc7 => 0x5091, 0xc8 => 0x5080, 0xc9 => 0x5096,
+    0xca => 0x5098, 0xcb => 0x509a, 0xcc => 0x6700, 0xcd => 0x51f1,
+    0xce => 0x5272, 0xcf => 0x5274, 0xd0 => 0x5275, 0xd1 => 0x5269,
+    0xd2 => 0x52de, 0xd3 => 0x52dd, 0xd4 => 0x52db, 0xd5 => 0x535a,
+    0xd6 => 0x53a5, 0xd7 => 0x557b, 0xd8 => 0x5580, 0xd9 => 0x55a7,
+    0xda => 0x557c, 0xdb => 0x558a, 0xdc => 0x559d, 0xdd => 0x5598,
+    0xde => 0x5582, 0xdf => 0x559c, 0xe0 => 0x55aa, 0xe1 => 0x5594,
+    0xe2 => 0x5587, 0xe3 => 0x558b, 0xe4 => 0x5583, 0xe5 => 0x55b3,
+    0xe6 => 0x55ae, 0xe7 => 0x559f, 0xe8 => 0x553e, 0xe9 => 0x55b2,
+    0xea => 0x559a, 0xeb => 0x55bb, 0xec => 0x55ac, 0xed => 0x55b1,
+    0xee => 0x557e, 0xef => 0x5589, 0xf0 => 0x55ab, 0xf1 => 0x5599,
+    0xf2 => 0x570d, 0xf3 => 0x582f, 0xf4 => 0x582a, 0xf5 => 0x5834,
+    0xf6 => 0x5824, 0xf7 => 0x5830, 0xf8 => 0x5831, 0xf9 => 0x5821,
+    0xfa => 0x581d, 0xfb => 0x5820, 0xfc => 0x58f9, 0xfd => 0x58fa,
+    0xfe => 0x5960,
+  },
+  0xb4 => {
+    0x40 => 0x5a77, 0x41 => 0x5a9a, 0x42 => 0x5a7f, 0x43 => 0x5a92,
+    0x44 => 0x5a9b, 0x45 => 0x5aa7, 0x46 => 0x5b73, 0x47 => 0x5b71,
+    0x48 => 0x5bd2, 0x49 => 0x5bcc, 0x4a => 0x5bd3, 0x4b => 0x5bd0,
+    0x4c => 0x5c0a, 0x4d => 0x5c0b, 0x4e => 0x5c31, 0x4f => 0x5d4c,
+    0x50 => 0x5d50, 0x51 => 0x5d34, 0x52 => 0x5d47, 0x53 => 0x5dfd,
+    0x54 => 0x5e45, 0x55 => 0x5e3d, 0x56 => 0x5e40, 0x57 => 0x5e43,
+    0x58 => 0x5e7e, 0x59 => 0x5eca, 0x5a => 0x5ec1, 0x5b => 0x5ec2,
+    0x5c => 0x5ec4, 0x5d => 0x5f3c, 0x5e => 0x5f6d, 0x5f => 0x5fa9,
+    0x60 => 0x5faa, 0x61 => 0x5fa8, 0x62 => 0x60d1, 0x63 => 0x60e1,
+    0x64 => 0x60b2, 0x65 => 0x60b6, 0x66 => 0x60e0, 0x67 => 0x611c,
+    0x68 => 0x6123, 0x69 => 0x60fa, 0x6a => 0x6115, 0x6b => 0x60f0,
+    0x6c => 0x60fb, 0x6d => 0x60f4, 0x6e => 0x6168, 0x6f => 0x60f1,
+    0x70 => 0x610e, 0x71 => 0x60f6, 0x72 => 0x6109, 0x73 => 0x6100,
+    0x74 => 0x6112, 0x75 => 0x621f, 0x76 => 0x6249, 0x77 => 0x63a3,
+    0x78 => 0x638c, 0x79 => 0x63cf, 0x7a => 0x63c0, 0x7b => 0x63e9,
+    0x7c => 0x63c9, 0x7d => 0x63c6, 0x7e => 0x63cd, 0xa1 => 0x63d2,
+    0xa2 => 0x63e3, 0xa3 => 0x63d0, 0xa4 => 0x63e1, 0xa5 => 0x63d6,
+    0xa6 => 0x63ed, 0xa7 => 0x63ee, 0xa8 => 0x6376, 0xa9 => 0x63f4,
+    0xaa => 0x63ea, 0xab => 0x63db, 0xac => 0x6452, 0xad => 0x63da,
+    0xae => 0x63f9, 0xaf => 0x655e, 0xb0 => 0x6566, 0xb1 => 0x6562,
+    0xb2 => 0x6563, 0xb3 => 0x6591, 0xb4 => 0x6590, 0xb5 => 0x65af,
+    0xb6 => 0x666e, 0xb7 => 0x6670, 0xb8 => 0x6674, 0xb9 => 0x6676,
+    0xba => 0x666f, 0xbb => 0x6691, 0xbc => 0x667a, 0xbd => 0x667e,
+    0xbe => 0x6677, 0xbf => 0x66fe, 0xc0 => 0x66ff, 0xc1 => 0x671f,
+    0xc2 => 0x671d, 0xc3 => 0x68fa, 0xc4 => 0x68d5, 0xc5 => 0x68e0,
+    0xc6 => 0x68d8, 0xc7 => 0x68d7, 0xc8 => 0x6905, 0xc9 => 0x68df,
+    0xca => 0x68f5, 0xcb => 0x68ee, 0xcc => 0x68e7, 0xcd => 0x68f9,
+    0xce => 0x68d2, 0xcf => 0x68f2, 0xd0 => 0x68e3, 0xd1 => 0x68cb,
+    0xd2 => 0x68cd, 0xd3 => 0x690d, 0xd4 => 0x6912, 0xd5 => 0x690e,
+    0xd6 => 0x68c9, 0xd7 => 0x68da, 0xd8 => 0x696e, 0xd9 => 0x68fb,
+    0xda => 0x6b3e, 0xdb => 0x6b3a, 0xdc => 0x6b3d, 0xdd => 0x6b98,
+    0xde => 0x6b96, 0xdf => 0x6bbc, 0xe0 => 0x6bef, 0xe1 => 0x6c2e,
+    0xe2 => 0x6c2f, 0xe3 => 0x6c2c, 0xe4 => 0x6e2f, 0xe5 => 0x6e38,
+    0xe6 => 0x6e54, 0xe7 => 0x6e21, 0xe8 => 0x6e32, 0xe9 => 0x6e67,
+    0xea => 0x6e4a, 0xeb => 0x6e20, 0xec => 0x6e25, 0xed => 0x6e23,
+    0xee => 0x6e1b, 0xef => 0x6e5b, 0xf0 => 0x6e58, 0xf1 => 0x6e24,
+    0xf2 => 0x6e56, 0xf3 => 0x6e6e, 0xf4 => 0x6e2d, 0xf5 => 0x6e26,
+    0xf6 => 0x6e6f, 0xf7 => 0x6e34, 0xf8 => 0x6e4d, 0xf9 => 0x6e3a,
+    0xfa => 0x6e2c, 0xfb => 0x6e43, 0xfc => 0x6e1d, 0xfd => 0x6e3e,
+    0xfe => 0x6ecb,
+  },
+  0xb5 => {
+    0x40 => 0x6e89, 0x41 => 0x6e19, 0x42 => 0x6e4e, 0x43 => 0x6e63,
+    0x44 => 0x6e44, 0x45 => 0x6e72, 0x46 => 0x6e69, 0x47 => 0x6e5f,
+    0x48 => 0x7119, 0x49 => 0x711a, 0x4a => 0x7126, 0x4b => 0x7130,
+    0x4c => 0x7121, 0x4d => 0x7136, 0x4e => 0x716e, 0x4f => 0x711c,
+    0x50 => 0x724c, 0x51 => 0x7284, 0x52 => 0x7280, 0x53 => 0x7336,
+    0x54 => 0x7325, 0x55 => 0x7334, 0x56 => 0x7329, 0x57 => 0x743a,
+    0x58 => 0x742a, 0x59 => 0x7433, 0x5a => 0x7422, 0x5b => 0x7425,
+    0x5c => 0x7435, 0x5d => 0x7436, 0x5e => 0x7434, 0x5f => 0x742f,
+    0x60 => 0x741b, 0x61 => 0x7426, 0x62 => 0x7428, 0x63 => 0x7525,
+    0x64 => 0x7526, 0x65 => 0x756b, 0x66 => 0x756a, 0x67 => 0x75e2,
+    0x68 => 0x75db, 0x69 => 0x75e3, 0x6a => 0x75d9, 0x6b => 0x75d8,
+    0x6c => 0x75de, 0x6d => 0x75e0, 0x6e => 0x767b, 0x6f => 0x767c,
+    0x70 => 0x7696, 0x71 => 0x7693, 0x72 => 0x76b4, 0x73 => 0x76dc,
+    0x74 => 0x774f, 0x75 => 0x77ed, 0x76 => 0x785d, 0x77 => 0x786c,
+    0x78 => 0x786f, 0x79 => 0x7a0d, 0x7a => 0x7a08, 0x7b => 0x7a0b,
+    0x7c => 0x7a05, 0x7d => 0x7a00, 0x7e => 0x7a98, 0xa1 => 0x7a97,
+    0xa2 => 0x7a96, 0xa3 => 0x7ae5, 0xa4 => 0x7ae3, 0xa5 => 0x7b49,
+    0xa6 => 0x7b56, 0xa7 => 0x7b46, 0xa8 => 0x7b50, 0xa9 => 0x7b52,
+    0xaa => 0x7b54, 0xab => 0x7b4d, 0xac => 0x7b4b, 0xad => 0x7b4f,
+    0xae => 0x7b51, 0xaf => 0x7c9f, 0xb0 => 0x7ca5, 0xb1 => 0x7d5e,
+    0xb2 => 0x7d50, 0xb3 => 0x7d68, 0xb4 => 0x7d55, 0xb5 => 0x7d2b,
+    0xb6 => 0x7d6e, 0xb7 => 0x7d72, 0xb8 => 0x7d61, 0xb9 => 0x7d66,
+    0xba => 0x7d62, 0xbb => 0x7d70, 0xbc => 0x7d73, 0xbd => 0x5584,
+    0xbe => 0x7fd4, 0xbf => 0x7fd5, 0xc0 => 0x800b, 0xc1 => 0x8052,
+    0xc2 => 0x8085, 0xc3 => 0x8155, 0xc4 => 0x8154, 0xc5 => 0x814b,
+    0xc6 => 0x8151, 0xc7 => 0x814e, 0xc8 => 0x8139, 0xc9 => 0x8146,
+    0xca => 0x813e, 0xcb => 0x814c, 0xcc => 0x8153, 0xcd => 0x8174,
+    0xce => 0x8212, 0xcf => 0x821c, 0xd0 => 0x83e9, 0xd1 => 0x8403,
+    0xd2 => 0x83f8, 0xd3 => 0x840d, 0xd4 => 0x83e0, 0xd5 => 0x83c5,
+    0xd6 => 0x840b, 0xd7 => 0x83c1, 0xd8 => 0x83ef, 0xd9 => 0x83f1,
+    0xda => 0x83f4, 0xdb => 0x8457, 0xdc => 0x840a, 0xdd => 0x83f0,
+    0xde => 0x840c, 0xdf => 0x83cc, 0xe0 => 0x83fd, 0xe1 => 0x83f2,
+    0xe2 => 0x83ca, 0xe3 => 0x8438, 0xe4 => 0x840e, 0xe5 => 0x8404,
+    0xe6 => 0x83dc, 0xe7 => 0x8407, 0xe8 => 0x83d4, 0xe9 => 0x83df,
+    0xea => 0x865b, 0xeb => 0x86df, 0xec => 0x86d9, 0xed => 0x86ed,
+    0xee => 0x86d4, 0xef => 0x86db, 0xf0 => 0x86e4, 0xf1 => 0x86d0,
+    0xf2 => 0x86de, 0xf3 => 0x8857, 0xf4 => 0x88c1, 0xf5 => 0x88c2,
+    0xf6 => 0x88b1, 0xf7 => 0x8983, 0xf8 => 0x8996, 0xf9 => 0x8a3b,
+    0xfa => 0x8a60, 0xfb => 0x8a55, 0xfc => 0x8a5e, 0xfd => 0x8a3c,
+    0xfe => 0x8a41,
+  },
+  0xb6 => {
+    0x40 => 0x8a54, 0x41 => 0x8a5b, 0x42 => 0x8a50, 0x43 => 0x8a46,
+    0x44 => 0x8a34, 0x45 => 0x8a3a, 0x46 => 0x8a36, 0x47 => 0x8a56,
+    0x48 => 0x8c61, 0x49 => 0x8c82, 0x4a => 0x8caf, 0x4b => 0x8cbc,
+    0x4c => 0x8cb3, 0x4d => 0x8cbd, 0x4e => 0x8cc1, 0x4f => 0x8cbb,
+    0x50 => 0x8cc0, 0x51 => 0x8cb4, 0x52 => 0x8cb7, 0x53 => 0x8cb6,
+    0x54 => 0x8cbf, 0x55 => 0x8cb8, 0x56 => 0x8d8a, 0x57 => 0x8d85,
+    0x58 => 0x8d81, 0x59 => 0x8dce, 0x5a => 0x8ddd, 0x5b => 0x8dcb,
+    0x5c => 0x8dda, 0x5d => 0x8dd1, 0x5e => 0x8dcc, 0x5f => 0x8ddb,
+    0x60 => 0x8dc6, 0x61 => 0x8efb, 0x62 => 0x8ef8, 0x63 => 0x8efc,
+    0x64 => 0x8f9c, 0x65 => 0x902e, 0x66 => 0x9035, 0x67 => 0x9031,
+    0x68 => 0x9038, 0x69 => 0x9032, 0x6a => 0x9036, 0x6b => 0x9102,
+    0x6c => 0x90f5, 0x6d => 0x9109, 0x6e => 0x90fe, 0x6f => 0x9163,
+    0x70 => 0x9165, 0x71 => 0x91cf, 0x72 => 0x9214, 0x73 => 0x9215,
+    0x74 => 0x9223, 0x75 => 0x9209, 0x76 => 0x921e, 0x77 => 0x920d,
+    0x78 => 0x9210, 0x79 => 0x9207, 0x7a => 0x9211, 0x7b => 0x9594,
+    0x7c => 0x958f, 0x7d => 0x958b, 0x7e => 0x9591, 0xa1 => 0x9593,
+    0xa2 => 0x9592, 0xa3 => 0x958e, 0xa4 => 0x968a, 0xa5 => 0x968e,
+    0xa6 => 0x968b, 0xa7 => 0x967d, 0xa8 => 0x9685, 0xa9 => 0x9686,
+    0xaa => 0x968d, 0xab => 0x9672, 0xac => 0x9684, 0xad => 0x96c1,
+    0xae => 0x96c5, 0xaf => 0x96c4, 0xb0 => 0x96c6, 0xb1 => 0x96c7,
+    0xb2 => 0x96ef, 0xb3 => 0x96f2, 0xb4 => 0x97cc, 0xb5 => 0x9805,
+    0xb6 => 0x9806, 0xb7 => 0x9808, 0xb8 => 0x98e7, 0xb9 => 0x98ea,
+    0xba => 0x98ef, 0xbb => 0x98e9, 0xbc => 0x98f2, 0xbd => 0x98ed,
+    0xbe => 0x99ae, 0xbf => 0x99ad, 0xc0 => 0x9ec3, 0xc1 => 0x9ecd,
+    0xc2 => 0x9ed1, 0xc3 => 0x4e82, 0xc4 => 0x50ad, 0xc5 => 0x50b5,
+    0xc6 => 0x50b2, 0xc7 => 0x50b3, 0xc8 => 0x50c5, 0xc9 => 0x50be,
+    0xca => 0x50ac, 0xcb => 0x50b7, 0xcc => 0x50bb, 0xcd => 0x50af,
+    0xce => 0x50c7, 0xcf => 0x527f, 0xd0 => 0x5277, 0xd1 => 0x527d,
+    0xd2 => 0x52df, 0xd3 => 0x52e6, 0xd4 => 0x52e4, 0xd5 => 0x52e2,
+    0xd6 => 0x52e3, 0xd7 => 0x532f, 0xd8 => 0x55df, 0xd9 => 0x55e8,
+    0xda => 0x55d3, 0xdb => 0x55e6, 0xdc => 0x55ce, 0xdd => 0x55dc,
+    0xde => 0x55c7, 0xdf => 0x55d1, 0xe0 => 0x55e3, 0xe1 => 0x55e4,
+    0xe2 => 0x55ef, 0xe3 => 0x55da, 0xe4 => 0x55e1, 0xe5 => 0x55c5,
+    0xe6 => 0x55c6, 0xe7 => 0x55e5, 0xe8 => 0x55c9, 0xe9 => 0x5712,
+    0xea => 0x5713, 0xeb => 0x585e, 0xec => 0x5851, 0xed => 0x5858,
+    0xee => 0x5857, 0xef => 0x585a, 0xf0 => 0x5854, 0xf1 => 0x586b,
+    0xf2 => 0x584c, 0xf3 => 0x586d, 0xf4 => 0x584a, 0xf5 => 0x5862,
+    0xf6 => 0x5852, 0xf7 => 0x584b, 0xf8 => 0x5967, 0xf9 => 0x5ac1,
+    0xfa => 0x5ac9, 0xfb => 0x5acc, 0xfc => 0x5abe, 0xfd => 0x5abd,
+    0xfe => 0x5abc,
+  },
+  0xb7 => {
+    0x40 => 0x5ab3, 0x41 => 0x5ac2, 0x42 => 0x5ab2, 0x43 => 0x5d69,
+    0x44 => 0x5d6f, 0x45 => 0x5e4c, 0x46 => 0x5e79, 0x47 => 0x5ec9,
+    0x48 => 0x5ec8, 0x49 => 0x5f12, 0x4a => 0x5f59, 0x4b => 0x5fac,
+    0x4c => 0x5fae, 0x4d => 0x611a, 0x4e => 0x610f, 0x4f => 0x6148,
+    0x50 => 0x611f, 0x51 => 0x60f3, 0x52 => 0x611b, 0x53 => 0x60f9,
+    0x54 => 0x6101, 0x55 => 0x6108, 0x56 => 0x614e, 0x57 => 0x614c,
+    0x58 => 0x6144, 0x59 => 0x614d, 0x5a => 0x613e, 0x5b => 0x6134,
+    0x5c => 0x6127, 0x5d => 0x610d, 0x5e => 0x6106, 0x5f => 0x6137,
+    0x60 => 0x6221, 0x61 => 0x6222, 0x62 => 0x6413, 0x63 => 0x643e,
+    0x64 => 0x641e, 0x65 => 0x642a, 0x66 => 0x642d, 0x67 => 0x643d,
+    0x68 => 0x642c, 0x69 => 0x640f, 0x6a => 0x641c, 0x6b => 0x6414,
+    0x6c => 0x640d, 0x6d => 0x6436, 0x6e => 0x6416, 0x6f => 0x6417,
+    0x70 => 0x6406, 0x71 => 0x656c, 0x72 => 0x659f, 0x73 => 0x65b0,
+    0x74 => 0x6697, 0x75 => 0x6689, 0x76 => 0x6687, 0x77 => 0x6688,
+    0x78 => 0x6696, 0x79 => 0x6684, 0x7a => 0x6698, 0x7b => 0x668d,
+    0x7c => 0x6703, 0x7d => 0x6994, 0x7e => 0x696d, 0xa1 => 0x695a,
+    0xa2 => 0x6977, 0xa3 => 0x6960, 0xa4 => 0x6954, 0xa5 => 0x6975,
+    0xa6 => 0x6930, 0xa7 => 0x6982, 0xa8 => 0x694a, 0xa9 => 0x6968,
+    0xaa => 0x696b, 0xab => 0x695e, 0xac => 0x6953, 0xad => 0x6979,
+    0xae => 0x6986, 0xaf => 0x695d, 0xb0 => 0x6963, 0xb1 => 0x695b,
+    0xb2 => 0x6b47, 0xb3 => 0x6b72, 0xb4 => 0x6bc0, 0xb5 => 0x6bbf,
+    0xb6 => 0x6bd3, 0xb7 => 0x6bfd, 0xb8 => 0x6ea2, 0xb9 => 0x6eaf,
+    0xba => 0x6ed3, 0xbb => 0x6eb6, 0xbc => 0x6ec2, 0xbd => 0x6e90,
+    0xbe => 0x6e9d, 0xbf => 0x6ec7, 0xc0 => 0x6ec5, 0xc1 => 0x6ea5,
+    0xc2 => 0x6e98, 0xc3 => 0x6ebc, 0xc4 => 0x6eba, 0xc5 => 0x6eab,
+    0xc6 => 0x6ed1, 0xc7 => 0x6e96, 0xc8 => 0x6e9c, 0xc9 => 0x6ec4,
+    0xca => 0x6ed4, 0xcb => 0x6eaa, 0xcc => 0x6ea7, 0xcd => 0x6eb4,
+    0xce => 0x714e, 0xcf => 0x7159, 0xd0 => 0x7169, 0xd1 => 0x7164,
+    0xd2 => 0x7149, 0xd3 => 0x7167, 0xd4 => 0x715c, 0xd5 => 0x716c,
+    0xd6 => 0x7166, 0xd7 => 0x714c, 0xd8 => 0x7165, 0xd9 => 0x715e,
+    0xda => 0x7146, 0xdb => 0x7168, 0xdc => 0x7156, 0xdd => 0x723a,
+    0xde => 0x7252, 0xdf => 0x7337, 0xe0 => 0x7345, 0xe1 => 0x733f,
+    0xe2 => 0x733e, 0xe3 => 0x746f, 0xe4 => 0x745a, 0xe5 => 0x7455,
+    0xe6 => 0x745f, 0xe7 => 0x745e, 0xe8 => 0x7441, 0xe9 => 0x743f,
+    0xea => 0x7459, 0xeb => 0x745b, 0xec => 0x745c, 0xed => 0x7576,
+    0xee => 0x7578, 0xef => 0x7600, 0xf0 => 0x75f0, 0xf1 => 0x7601,
+    0xf2 => 0x75f2, 0xf3 => 0x75f1, 0xf4 => 0x75fa, 0xf5 => 0x75ff,
+    0xf6 => 0x75f4, 0xf7 => 0x75f3, 0xf8 => 0x76de, 0xf9 => 0x76df,
+    0xfa => 0x775b, 0xfb => 0x776b, 0xfc => 0x7766, 0xfd => 0x775e,
+    0xfe => 0x7763,
+  },
+  0xb8 => {
+    0x40 => 0x7779, 0x41 => 0x776a, 0x42 => 0x776c, 0x43 => 0x775c,
+    0x44 => 0x7765, 0x45 => 0x7768, 0x46 => 0x7762, 0x47 => 0x77ee,
+    0x48 => 0x788e, 0x49 => 0x78b0, 0x4a => 0x7897, 0x4b => 0x7898,
+    0x4c => 0x788c, 0x4d => 0x7889, 0x4e => 0x787c, 0x4f => 0x7891,
+    0x50 => 0x7893, 0x51 => 0x787f, 0x52 => 0x797a, 0x53 => 0x797f,
+    0x54 => 0x7981, 0x55 => 0x842c, 0x56 => 0x79bd, 0x57 => 0x7a1c,
+    0x58 => 0x7a1a, 0x59 => 0x7a20, 0x5a => 0x7a14, 0x5b => 0x7a1f,
+    0x5c => 0x7a1e, 0x5d => 0x7a9f, 0x5e => 0x7aa0, 0x5f => 0x7b77,
+    0x60 => 0x7bc0, 0x61 => 0x7b60, 0x62 => 0x7b6e, 0x63 => 0x7b67,
+    0x64 => 0x7cb1, 0x65 => 0x7cb3, 0x66 => 0x7cb5, 0x67 => 0x7d93,
+    0x68 => 0x7d79, 0x69 => 0x7d91, 0x6a => 0x7d81, 0x6b => 0x7d8f,
+    0x6c => 0x7d5b, 0x6d => 0x7f6e, 0x6e => 0x7f69, 0x6f => 0x7f6a,
+    0x70 => 0x7f72, 0x71 => 0x7fa9, 0x72 => 0x7fa8, 0x73 => 0x7fa4,
+    0x74 => 0x8056, 0x75 => 0x8058, 0x76 => 0x8086, 0x77 => 0x8084,
+    0x78 => 0x8171, 0x79 => 0x8170, 0x7a => 0x8178, 0x7b => 0x8165,
+    0x7c => 0x816e, 0x7d => 0x8173, 0x7e => 0x816b, 0xa1 => 0x8179,
+    0xa2 => 0x817a, 0xa3 => 0x8166, 0xa4 => 0x8205, 0xa5 => 0x8247,
+    0xa6 => 0x8482, 0xa7 => 0x8477, 0xa8 => 0x843d, 0xa9 => 0x8431,
+    0xaa => 0x8475, 0xab => 0x8466, 0xac => 0x846b, 0xad => 0x8449,
+    0xae => 0x846c, 0xaf => 0x845b, 0xb0 => 0x843c, 0xb1 => 0x8435,
+    0xb2 => 0x8461, 0xb3 => 0x8463, 0xb4 => 0x8469, 0xb5 => 0x846d,
+    0xb6 => 0x8446, 0xb7 => 0x865e, 0xb8 => 0x865c, 0xb9 => 0x865f,
+    0xba => 0x86f9, 0xbb => 0x8713, 0xbc => 0x8708, 0xbd => 0x8707,
+    0xbe => 0x8700, 0xbf => 0x86fe, 0xc0 => 0x86fb, 0xc1 => 0x8702,
+    0xc2 => 0x8703, 0xc3 => 0x8706, 0xc4 => 0x870a, 0xc5 => 0x8859,
+    0xc6 => 0x88df, 0xc7 => 0x88d4, 0xc8 => 0x88d9, 0xc9 => 0x88dc,
+    0xca => 0x88d8, 0xcb => 0x88dd, 0xcc => 0x88e1, 0xcd => 0x88ca,
+    0xce => 0x88d5, 0xcf => 0x88d2, 0xd0 => 0x899c, 0xd1 => 0x89e3,
+    0xd2 => 0x8a6b, 0xd3 => 0x8a72, 0xd4 => 0x8a73, 0xd5 => 0x8a66,
+    0xd6 => 0x8a69, 0xd7 => 0x8a70, 0xd8 => 0x8a87, 0xd9 => 0x8a7c,
+    0xda => 0x8a63, 0xdb => 0x8aa0, 0xdc => 0x8a71, 0xdd => 0x8a85,
+    0xde => 0x8a6d, 0xdf => 0x8a62, 0xe0 => 0x8a6e, 0xe1 => 0x8a6c,
+    0xe2 => 0x8a79, 0xe3 => 0x8a7b, 0xe4 => 0x8a3e, 0xe5 => 0x8a68,
+    0xe6 => 0x8c62, 0xe7 => 0x8c8a, 0xe8 => 0x8c89, 0xe9 => 0x8cca,
+    0xea => 0x8cc7, 0xeb => 0x8cc8, 0xec => 0x8cc4, 0xed => 0x8cb2,
+    0xee => 0x8cc3, 0xef => 0x8cc2, 0xf0 => 0x8cc5, 0xf1 => 0x8de1,
+    0xf2 => 0x8ddf, 0xf3 => 0x8de8, 0xf4 => 0x8def, 0xf5 => 0x8df3,
+    0xf6 => 0x8dfa, 0xf7 => 0x8dea, 0xf8 => 0x8de4, 0xf9 => 0x8de6,
+    0xfa => 0x8eb2, 0xfb => 0x8f03, 0xfc => 0x8f09, 0xfd => 0x8efe,
+    0xfe => 0x8f0a,
+  },
+  0xb9 => {
+    0x40 => 0x8f9f, 0x41 => 0x8fb2, 0x42 => 0x904b, 0x43 => 0x904a,
+    0x44 => 0x9053, 0x45 => 0x9042, 0x46 => 0x9054, 0x47 => 0x903c,
+    0x48 => 0x9055, 0x49 => 0x9050, 0x4a => 0x9047, 0x4b => 0x904f,
+    0x4c => 0x904e, 0x4d => 0x904d, 0x4e => 0x9051, 0x4f => 0x903e,
+    0x50 => 0x9041, 0x51 => 0x9112, 0x52 => 0x9117, 0x53 => 0x916c,
+    0x54 => 0x916a, 0x55 => 0x9169, 0x56 => 0x91c9, 0x57 => 0x9237,
+    0x58 => 0x9257, 0x59 => 0x9238, 0x5a => 0x923d, 0x5b => 0x9240,
+    0x5c => 0x923e, 0x5d => 0x925b, 0x5e => 0x924b, 0x5f => 0x9264,
+    0x60 => 0x9251, 0x61 => 0x9234, 0x62 => 0x9249, 0x63 => 0x924d,
+    0x64 => 0x9245, 0x65 => 0x9239, 0x66 => 0x923f, 0x67 => 0x925a,
+    0x68 => 0x9598, 0x69 => 0x9698, 0x6a => 0x9694, 0x6b => 0x9695,
+    0x6c => 0x96cd, 0x6d => 0x96cb, 0x6e => 0x96c9, 0x6f => 0x96ca,
+    0x70 => 0x96f7, 0x71 => 0x96fb, 0x72 => 0x96f9, 0x73 => 0x96f6,
+    0x74 => 0x9756, 0x75 => 0x9774, 0x76 => 0x9776, 0x77 => 0x9810,
+    0x78 => 0x9811, 0x79 => 0x9813, 0x7a => 0x980a, 0x7b => 0x9812,
+    0x7c => 0x980c, 0x7d => 0x98fc, 0x7e => 0x98f4, 0xa1 => 0x98fd,
+    0xa2 => 0x98fe, 0xa3 => 0x99b3, 0xa4 => 0x99b1, 0xa5 => 0x99b4,
+    0xa6 => 0x9ae1, 0xa7 => 0x9ce9, 0xa8 => 0x9e82, 0xa9 => 0x9f0e,
+    0xaa => 0x9f13, 0xab => 0x9f20, 0xac => 0x50e7, 0xad => 0x50ee,
+    0xae => 0x50e5, 0xaf => 0x50d6, 0xb0 => 0x50ed, 0xb1 => 0x50da,
+    0xb2 => 0x50d5, 0xb3 => 0x50cf, 0xb4 => 0x50d1, 0xb5 => 0x50f1,
+    0xb6 => 0x50ce, 0xb7 => 0x50e9, 0xb8 => 0x5162, 0xb9 => 0x51f3,
+    0xba => 0x5283, 0xbb => 0x5282, 0xbc => 0x5331, 0xbd => 0x53ad,
+    0xbe => 0x55fe, 0xbf => 0x5600, 0xc0 => 0x561b, 0xc1 => 0x5617,
+    0xc2 => 0x55fd, 0xc3 => 0x5614, 0xc4 => 0x5606, 0xc5 => 0x5609,
+    0xc6 => 0x560d, 0xc7 => 0x560e, 0xc8 => 0x55f7, 0xc9 => 0x5616,
+    0xca => 0x561f, 0xcb => 0x5608, 0xcc => 0x5610, 0xcd => 0x55f6,
+    0xce => 0x5718, 0xcf => 0x5716, 0xd0 => 0x5875, 0xd1 => 0x587e,
+    0xd2 => 0x5883, 0xd3 => 0x5893, 0xd4 => 0x588a, 0xd5 => 0x5879,
+    0xd6 => 0x5885, 0xd7 => 0x587d, 0xd8 => 0x58fd, 0xd9 => 0x5925,
+    0xda => 0x5922, 0xdb => 0x5924, 0xdc => 0x596a, 0xdd => 0x5969,
+    0xde => 0x5ae1, 0xdf => 0x5ae6, 0xe0 => 0x5ae9, 0xe1 => 0x5ad7,
+    0xe2 => 0x5ad6, 0xe3 => 0x5ad8, 0xe4 => 0x5ae3, 0xe5 => 0x5b75,
+    0xe6 => 0x5bde, 0xe7 => 0x5be7, 0xe8 => 0x5be1, 0xe9 => 0x5be5,
+    0xea => 0x5be6, 0xeb => 0x5be8, 0xec => 0x5be2, 0xed => 0x5be4,
+    0xee => 0x5bdf, 0xef => 0x5c0d, 0xf0 => 0x5c62, 0xf1 => 0x5d84,
+    0xf2 => 0x5d87, 0xf3 => 0x5e5b, 0xf4 => 0x5e63, 0xf5 => 0x5e55,
+    0xf6 => 0x5e57, 0xf7 => 0x5e54, 0xf8 => 0x5ed3, 0xf9 => 0x5ed6,
+    0xfa => 0x5f0a, 0xfb => 0x5f46, 0xfc => 0x5f70, 0xfd => 0x5fb9,
+    0xfe => 0x6147,
+  },
+  0xba => {
+    0x40 => 0x613f, 0x41 => 0x614b, 0x42 => 0x6177, 0x43 => 0x6162,
+    0x44 => 0x6163, 0x45 => 0x615f, 0x46 => 0x615a, 0x47 => 0x6158,
+    0x48 => 0x6175, 0x49 => 0x622a, 0x4a => 0x6487, 0x4b => 0x6458,
+    0x4c => 0x6454, 0x4d => 0x64a4, 0x4e => 0x6478, 0x4f => 0x645f,
+    0x50 => 0x647a, 0x51 => 0x6451, 0x52 => 0x6467, 0x53 => 0x6434,
+    0x54 => 0x646d, 0x55 => 0x647b, 0x56 => 0x6572, 0x57 => 0x65a1,
+    0x58 => 0x65d7, 0x59 => 0x65d6, 0x5a => 0x66a2, 0x5b => 0x66a8,
+    0x5c => 0x669d, 0x5d => 0x699c, 0x5e => 0x69a8, 0x5f => 0x6995,
+    0x60 => 0x69c1, 0x61 => 0x69ae, 0x62 => 0x69d3, 0x63 => 0x69cb,
+    0x64 => 0x699b, 0x65 => 0x69b7, 0x66 => 0x69bb, 0x67 => 0x69ab,
+    0x68 => 0x69b4, 0x69 => 0x69d0, 0x6a => 0x69cd, 0x6b => 0x69ad,
+    0x6c => 0x69cc, 0x6d => 0x69a6, 0x6e => 0x69c3, 0x6f => 0x69a3,
+    0x70 => 0x6b49, 0x71 => 0x6b4c, 0x72 => 0x6c33, 0x73 => 0x6f33,
+    0x74 => 0x6f14, 0x75 => 0x6efe, 0x76 => 0x6f13, 0x77 => 0x6ef4,
+    0x78 => 0x6f29, 0x79 => 0x6f3e, 0x7a => 0x6f20, 0x7b => 0x6f2c,
+    0x7c => 0x6f0f, 0x7d => 0x6f02, 0x7e => 0x6f22, 0xa1 => 0x6eff,
+    0xa2 => 0x6eef, 0xa3 => 0x6f06, 0xa4 => 0x6f31, 0xa5 => 0x6f38,
+    0xa6 => 0x6f32, 0xa7 => 0x6f23, 0xa8 => 0x6f15, 0xa9 => 0x6f2b,
+    0xaa => 0x6f2f, 0xab => 0x6f88, 0xac => 0x6f2a, 0xad => 0x6eec,
+    0xae => 0x6f01, 0xaf => 0x6ef2, 0xb0 => 0x6ecc, 0xb1 => 0x6ef7,
+    0xb2 => 0x7194, 0xb3 => 0x7199, 0xb4 => 0x717d, 0xb5 => 0x718a,
+    0xb6 => 0x7184, 0xb7 => 0x7192, 0xb8 => 0x723e, 0xb9 => 0x7292,
+    0xba => 0x7296, 0xbb => 0x7344, 0xbc => 0x7350, 0xbd => 0x7464,
+    0xbe => 0x7463, 0xbf => 0x746a, 0xc0 => 0x7470, 0xc1 => 0x746d,
+    0xc2 => 0x7504, 0xc3 => 0x7591, 0xc4 => 0x7627, 0xc5 => 0x760d,
+    0xc6 => 0x760b, 0xc7 => 0x7609, 0xc8 => 0x7613, 0xc9 => 0x76e1,
+    0xca => 0x76e3, 0xcb => 0x7784, 0xcc => 0x777d, 0xcd => 0x777f,
+    0xce => 0x7761, 0xcf => 0x78c1, 0xd0 => 0x789f, 0xd1 => 0x78a7,
+    0xd2 => 0x78b3, 0xd3 => 0x78a9, 0xd4 => 0x78a3, 0xd5 => 0x798e,
+    0xd6 => 0x798f, 0xd7 => 0x798d, 0xd8 => 0x7a2e, 0xd9 => 0x7a31,
+    0xda => 0x7aaa, 0xdb => 0x7aa9, 0xdc => 0x7aed, 0xdd => 0x7aef,
+    0xde => 0x7ba1, 0xdf => 0x7b95, 0xe0 => 0x7b8b, 0xe1 => 0x7b75,
+    0xe2 => 0x7b97, 0xe3 => 0x7b9d, 0xe4 => 0x7b94, 0xe5 => 0x7b8f,
+    0xe6 => 0x7bb8, 0xe7 => 0x7b87, 0xe8 => 0x7b84, 0xe9 => 0x7cb9,
+    0xea => 0x7cbd, 0xeb => 0x7cbe, 0xec => 0x7dbb, 0xed => 0x7db0,
+    0xee => 0x7d9c, 0xef => 0x7dbd, 0xf0 => 0x7dbe, 0xf1 => 0x7da0,
+    0xf2 => 0x7dca, 0xf3 => 0x7db4, 0xf4 => 0x7db2, 0xf5 => 0x7db1,
+    0xf6 => 0x7dba, 0xf7 => 0x7da2, 0xf8 => 0x7dbf, 0xf9 => 0x7db5,
+    0xfa => 0x7db8, 0xfb => 0x7dad, 0xfc => 0x7dd2, 0xfd => 0x7dc7,
+    0xfe => 0x7dac,
+  },
+  0xbb => {
+    0x40 => 0x7f70, 0x41 => 0x7fe0, 0x42 => 0x7fe1, 0x43 => 0x7fdf,
+    0x44 => 0x805e, 0x45 => 0x805a, 0x46 => 0x8087, 0x47 => 0x8150,
+    0x48 => 0x8180, 0x49 => 0x818f, 0x4a => 0x8188, 0x4b => 0x818a,
+    0x4c => 0x817f, 0x4d => 0x8182, 0x4e => 0x81e7, 0x4f => 0x81fa,
+    0x50 => 0x8207, 0x51 => 0x8214, 0x52 => 0x821e, 0x53 => 0x824b,
+    0x54 => 0x84c9, 0x55 => 0x84bf, 0x56 => 0x84c6, 0x57 => 0x84c4,
+    0x58 => 0x8499, 0x59 => 0x849e, 0x5a => 0x84b2, 0x5b => 0x849c,
+    0x5c => 0x84cb, 0x5d => 0x84b8, 0x5e => 0x84c0, 0x5f => 0x84d3,
+    0x60 => 0x8490, 0x61 => 0x84bc, 0x62 => 0x84d1, 0x63 => 0x84ca,
+    0x64 => 0x873f, 0x65 => 0x871c, 0x66 => 0x873b, 0x67 => 0x8722,
+    0x68 => 0x8725, 0x69 => 0x8734, 0x6a => 0x8718, 0x6b => 0x8755,
+    0x6c => 0x8737, 0x6d => 0x8729, 0x6e => 0x88f3, 0x6f => 0x8902,
+    0x70 => 0x88f4, 0x71 => 0x88f9, 0x72 => 0x88f8, 0x73 => 0x88fd,
+    0x74 => 0x88e8, 0x75 => 0x891a, 0x76 => 0x88ef, 0x77 => 0x8aa6,
+    0x78 => 0x8a8c, 0x79 => 0x8a9e, 0x7a => 0x8aa3, 0x7b => 0x8a8d,
+    0x7c => 0x8aa1, 0x7d => 0x8a93, 0x7e => 0x8aa4, 0xa1 => 0x8aaa,
+    0xa2 => 0x8aa5, 0xa3 => 0x8aa8, 0xa4 => 0x8a98, 0xa5 => 0x8a91,
+    0xa6 => 0x8a9a, 0xa7 => 0x8aa7, 0xa8 => 0x8c6a, 0xa9 => 0x8c8d,
+    0xaa => 0x8c8c, 0xab => 0x8cd3, 0xac => 0x8cd1, 0xad => 0x8cd2,
+    0xae => 0x8d6b, 0xaf => 0x8d99, 0xb0 => 0x8d95, 0xb1 => 0x8dfc,
+    0xb2 => 0x8f14, 0xb3 => 0x8f12, 0xb4 => 0x8f15, 0xb5 => 0x8f13,
+    0xb6 => 0x8fa3, 0xb7 => 0x9060, 0xb8 => 0x9058, 0xb9 => 0x905c,
+    0xba => 0x9063, 0xbb => 0x9059, 0xbc => 0x905e, 0xbd => 0x9062,
+    0xbe => 0x905d, 0xbf => 0x905b, 0xc0 => 0x9119, 0xc1 => 0x9118,
+    0xc2 => 0x911e, 0xc3 => 0x9175, 0xc4 => 0x9178, 0xc5 => 0x9177,
+    0xc6 => 0x9174, 0xc7 => 0x9278, 0xc8 => 0x9280, 0xc9 => 0x9285,
+    0xca => 0x9298, 0xcb => 0x9296, 0xcc => 0x927b, 0xcd => 0x9293,
+    0xce => 0x929c, 0xcf => 0x92a8, 0xd0 => 0x927c, 0xd1 => 0x9291,
+    0xd2 => 0x95a1, 0xd3 => 0x95a8, 0xd4 => 0x95a9, 0xd5 => 0x95a3,
+    0xd6 => 0x95a5, 0xd7 => 0x95a4, 0xd8 => 0x9699, 0xd9 => 0x969c,
+    0xda => 0x969b, 0xdb => 0x96cc, 0xdc => 0x96d2, 0xdd => 0x9700,
+    0xde => 0x977c, 0xdf => 0x9785, 0xe0 => 0x97f6, 0xe1 => 0x9817,
+    0xe2 => 0x9818, 0xe3 => 0x98af, 0xe4 => 0x98b1, 0xe5 => 0x9903,
+    0xe6 => 0x9905, 0xe7 => 0x990c, 0xe8 => 0x9909, 0xe9 => 0x99c1,
+    0xea => 0x9aaf, 0xeb => 0x9ab0, 0xec => 0x9ae6, 0xed => 0x9b41,
+    0xee => 0x9b42, 0xef => 0x9cf4, 0xf0 => 0x9cf6, 0xf1 => 0x9cf3,
+    0xf2 => 0x9ebc, 0xf3 => 0x9f3b, 0xf4 => 0x9f4a, 0xf5 => 0x5104,
+    0xf6 => 0x5100, 0xf7 => 0x50fb, 0xf8 => 0x50f5, 0xf9 => 0x50f9,
+    0xfa => 0x5102, 0xfb => 0x5108, 0xfc => 0x5109, 0xfd => 0x5105,
+    0xfe => 0x51dc,
+  },
+  0xbc => {
+    0x40 => 0x5287, 0x41 => 0x5288, 0x42 => 0x5289, 0x43 => 0x528d,
+    0x44 => 0x528a, 0x45 => 0x52f0, 0x46 => 0x53b2, 0x47 => 0x562e,
+    0x48 => 0x563b, 0x49 => 0x5639, 0x4a => 0x5632, 0x4b => 0x563f,
+    0x4c => 0x5634, 0x4d => 0x5629, 0x4e => 0x5653, 0x4f => 0x564e,
+    0x50 => 0x5657, 0x51 => 0x5674, 0x52 => 0x5636, 0x53 => 0x562f,
+    0x54 => 0x5630, 0x55 => 0x5880, 0x56 => 0x589f, 0x57 => 0x589e,
+    0x58 => 0x58b3, 0x59 => 0x589c, 0x5a => 0x58ae, 0x5b => 0x58a9,
+    0x5c => 0x58a6, 0x5d => 0x596d, 0x5e => 0x5b09, 0x5f => 0x5afb,
+    0x60 => 0x5b0b, 0x61 => 0x5af5, 0x62 => 0x5b0c, 0x63 => 0x5b08,
+    0x64 => 0x5bee, 0x65 => 0x5bec, 0x66 => 0x5be9, 0x67 => 0x5beb,
+    0x68 => 0x5c64, 0x69 => 0x5c65, 0x6a => 0x5d9d, 0x6b => 0x5d94,
+    0x6c => 0x5e62, 0x6d => 0x5e5f, 0x6e => 0x5e61, 0x6f => 0x5ee2,
+    0x70 => 0x5eda, 0x71 => 0x5edf, 0x72 => 0x5edd, 0x73 => 0x5ee3,
+    0x74 => 0x5ee0, 0x75 => 0x5f48, 0x76 => 0x5f71, 0x77 => 0x5fb7,
+    0x78 => 0x5fb5, 0x79 => 0x6176, 0x7a => 0x6167, 0x7b => 0x616e,
+    0x7c => 0x615d, 0x7d => 0x6155, 0x7e => 0x6182, 0xa1 => 0x617c,
+    0xa2 => 0x6170, 0xa3 => 0x616b, 0xa4 => 0x617e, 0xa5 => 0x61a7,
+    0xa6 => 0x6190, 0xa7 => 0x61ab, 0xa8 => 0x618e, 0xa9 => 0x61ac,
+    0xaa => 0x619a, 0xab => 0x61a4, 0xac => 0x6194, 0xad => 0x61ae,
+    0xae => 0x622e, 0xaf => 0x6469, 0xb0 => 0x646f, 0xb1 => 0x6479,
+    0xb2 => 0x649e, 0xb3 => 0x64b2, 0xb4 => 0x6488, 0xb5 => 0x6490,
+    0xb6 => 0x64b0, 0xb7 => 0x64a5, 0xb8 => 0x6493, 0xb9 => 0x6495,
+    0xba => 0x64a9, 0xbb => 0x6492, 0xbc => 0x64ae, 0xbd => 0x64ad,
+    0xbe => 0x64ab, 0xbf => 0x649a, 0xc0 => 0x64ac, 0xc1 => 0x6499,
+    0xc2 => 0x64a2, 0xc3 => 0x64b3, 0xc4 => 0x6575, 0xc5 => 0x6577,
+    0xc6 => 0x6578, 0xc7 => 0x66ae, 0xc8 => 0x66ab, 0xc9 => 0x66b4,
+    0xca => 0x66b1, 0xcb => 0x6a23, 0xcc => 0x6a1f, 0xcd => 0x69e8,
+    0xce => 0x6a01, 0xcf => 0x6a1e, 0xd0 => 0x6a19, 0xd1 => 0x69fd,
+    0xd2 => 0x6a21, 0xd3 => 0x6a13, 0xd4 => 0x6a0a, 0xd5 => 0x69f3,
+    0xd6 => 0x6a02, 0xd7 => 0x6a05, 0xd8 => 0x69ed, 0xd9 => 0x6a11,
+    0xda => 0x6b50, 0xdb => 0x6b4e, 0xdc => 0x6ba4, 0xdd => 0x6bc5,
+    0xde => 0x6bc6, 0xdf => 0x6f3f, 0xe0 => 0x6f7c, 0xe1 => 0x6f84,
+    0xe2 => 0x6f51, 0xe3 => 0x6f66, 0xe4 => 0x6f54, 0xe5 => 0x6f86,
+    0xe6 => 0x6f6d, 0xe7 => 0x6f5b, 0xe8 => 0x6f78, 0xe9 => 0x6f6e,
+    0xea => 0x6f8e, 0xeb => 0x6f7a, 0xec => 0x6f70, 0xed => 0x6f64,
+    0xee => 0x6f97, 0xef => 0x6f58, 0xf0 => 0x6ed5, 0xf1 => 0x6f6f,
+    0xf2 => 0x6f60, 0xf3 => 0x6f5f, 0xf4 => 0x719f, 0xf5 => 0x71ac,
+    0xf6 => 0x71b1, 0xf7 => 0x71a8, 0xf8 => 0x7256, 0xf9 => 0x729b,
+    0xfa => 0x734e, 0xfb => 0x7357, 0xfc => 0x7469, 0xfd => 0x748b,
+    0xfe => 0x7483,
+  },
+  0xbd => {
+    0x40 => 0x747e, 0x41 => 0x7480, 0x42 => 0x757f, 0x43 => 0x7620,
+    0x44 => 0x7629, 0x45 => 0x761f, 0x46 => 0x7624, 0x47 => 0x7626,
+    0x48 => 0x7621, 0x49 => 0x7622, 0x4a => 0x769a, 0x4b => 0x76ba,
+    0x4c => 0x76e4, 0x4d => 0x778e, 0x4e => 0x7787, 0x4f => 0x778c,
+    0x50 => 0x7791, 0x51 => 0x778b, 0x52 => 0x78cb, 0x53 => 0x78c5,
+    0x54 => 0x78ba, 0x55 => 0x78ca, 0x56 => 0x78be, 0x57 => 0x78d5,
+    0x58 => 0x78bc, 0x59 => 0x78d0, 0x5a => 0x7a3f, 0x5b => 0x7a3c,
+    0x5c => 0x7a40, 0x5d => 0x7a3d, 0x5e => 0x7a37, 0x5f => 0x7a3b,
+    0x60 => 0x7aaf, 0x61 => 0x7aae, 0x62 => 0x7bad, 0x63 => 0x7bb1,
+    0x64 => 0x7bc4, 0x65 => 0x7bb4, 0x66 => 0x7bc6, 0x67 => 0x7bc7,
+    0x68 => 0x7bc1, 0x69 => 0x7ba0, 0x6a => 0x7bcc, 0x6b => 0x7cca,
+    0x6c => 0x7de0, 0x6d => 0x7df4, 0x6e => 0x7def, 0x6f => 0x7dfb,
+    0x70 => 0x7dd8, 0x71 => 0x7dec, 0x72 => 0x7ddd, 0x73 => 0x7de8,
+    0x74 => 0x7de3, 0x75 => 0x7dda, 0x76 => 0x7dde, 0x77 => 0x7de9,
+    0x78 => 0x7d9e, 0x79 => 0x7dd9, 0x7a => 0x7df2, 0x7b => 0x7df9,
+    0x7c => 0x7f75, 0x7d => 0x7f77, 0x7e => 0x7faf, 0xa1 => 0x7fe9,
+    0xa2 => 0x8026, 0xa3 => 0x819b, 0xa4 => 0x819c, 0xa5 => 0x819d,
+    0xa6 => 0x81a0, 0xa7 => 0x819a, 0xa8 => 0x8198, 0xa9 => 0x8517,
+    0xaa => 0x853d, 0xab => 0x851a, 0xac => 0x84ee, 0xad => 0x852c,
+    0xae => 0x852d, 0xaf => 0x8513, 0xb0 => 0x8511, 0xb1 => 0x8523,
+    0xb2 => 0x8521, 0xb3 => 0x8514, 0xb4 => 0x84ec, 0xb5 => 0x8525,
+    0xb6 => 0x84ff, 0xb7 => 0x8506, 0xb8 => 0x8782, 0xb9 => 0x8774,
+    0xba => 0x8776, 0xbb => 0x8760, 0xbc => 0x8766, 0xbd => 0x8778,
+    0xbe => 0x8768, 0xbf => 0x8759, 0xc0 => 0x8757, 0xc1 => 0x874c,
+    0xc2 => 0x8753, 0xc3 => 0x885b, 0xc4 => 0x885d, 0xc5 => 0x8910,
+    0xc6 => 0x8907, 0xc7 => 0x8912, 0xc8 => 0x8913, 0xc9 => 0x8915,
+    0xca => 0x890a, 0xcb => 0x8abc, 0xcc => 0x8ad2, 0xcd => 0x8ac7,
+    0xce => 0x8ac4, 0xcf => 0x8a95, 0xd0 => 0x8acb, 0xd1 => 0x8af8,
+    0xd2 => 0x8ab2, 0xd3 => 0x8ac9, 0xd4 => 0x8ac2, 0xd5 => 0x8abf,
+    0xd6 => 0x8ab0, 0xd7 => 0x8ad6, 0xd8 => 0x8acd, 0xd9 => 0x8ab6,
+    0xda => 0x8ab9, 0xdb => 0x8adb, 0xdc => 0x8c4c, 0xdd => 0x8c4e,
+    0xde => 0x8c6c, 0xdf => 0x8ce0, 0xe0 => 0x8cde, 0xe1 => 0x8ce6,
+    0xe2 => 0x8ce4, 0xe3 => 0x8cec, 0xe4 => 0x8ced, 0xe5 => 0x8ce2,
+    0xe6 => 0x8ce3, 0xe7 => 0x8cdc, 0xe8 => 0x8cea, 0xe9 => 0x8ce1,
+    0xea => 0x8d6d, 0xeb => 0x8d9f, 0xec => 0x8da3, 0xed => 0x8e2b,
+    0xee => 0x8e10, 0xef => 0x8e1d, 0xf0 => 0x8e22, 0xf1 => 0x8e0f,
+    0xf2 => 0x8e29, 0xf3 => 0x8e1f, 0xf4 => 0x8e21, 0xf5 => 0x8e1e,
+    0xf6 => 0x8eba, 0xf7 => 0x8f1d, 0xf8 => 0x8f1b, 0xf9 => 0x8f1f,
+    0xfa => 0x8f29, 0xfb => 0x8f26, 0xfc => 0x8f2a, 0xfd => 0x8f1c,
+    0xfe => 0x8f1e,
+  },
+  0xbe => {
+    0x40 => 0x8f25, 0x41 => 0x9069, 0x42 => 0x906e, 0x43 => 0x9068,
+    0x44 => 0x906d, 0x45 => 0x9077, 0x46 => 0x9130, 0x47 => 0x912d,
+    0x48 => 0x9127, 0x49 => 0x9131, 0x4a => 0x9187, 0x4b => 0x9189,
+    0x4c => 0x918b, 0x4d => 0x9183, 0x4e => 0x92c5, 0x4f => 0x92bb,
+    0x50 => 0x92b7, 0x51 => 0x92ea, 0x52 => 0x92ac, 0x53 => 0x92e4,
+    0x54 => 0x92c1, 0x55 => 0x92b3, 0x56 => 0x92bc, 0x57 => 0x92d2,
+    0x58 => 0x92c7, 0x59 => 0x92f0, 0x5a => 0x92b2, 0x5b => 0x95ad,
+    0x5c => 0x95b1, 0x5d => 0x9704, 0x5e => 0x9706, 0x5f => 0x9707,
+    0x60 => 0x9709, 0x61 => 0x9760, 0x62 => 0x978d, 0x63 => 0x978b,
+    0x64 => 0x978f, 0x65 => 0x9821, 0x66 => 0x982b, 0x67 => 0x981c,
+    0x68 => 0x98b3, 0x69 => 0x990a, 0x6a => 0x9913, 0x6b => 0x9912,
+    0x6c => 0x9918, 0x6d => 0x99dd, 0x6e => 0x99d0, 0x6f => 0x99df,
+    0x70 => 0x99db, 0x71 => 0x99d1, 0x72 => 0x99d5, 0x73 => 0x99d2,
+    0x74 => 0x99d9, 0x75 => 0x9ab7, 0x76 => 0x9aee, 0x77 => 0x9aef,
+    0x78 => 0x9b27, 0x79 => 0x9b45, 0x7a => 0x9b44, 0x7b => 0x9b77,
+    0x7c => 0x9b6f, 0x7d => 0x9d06, 0x7e => 0x9d09, 0xa1 => 0x9d03,
+    0xa2 => 0x9ea9, 0xa3 => 0x9ebe, 0xa4 => 0x9ece, 0xa5 => 0x58a8,
+    0xa6 => 0x9f52, 0xa7 => 0x5112, 0xa8 => 0x5118, 0xa9 => 0x5114,
+    0xaa => 0x5110, 0xab => 0x5115, 0xac => 0x5180, 0xad => 0x51aa,
+    0xae => 0x51dd, 0xaf => 0x5291, 0xb0 => 0x5293, 0xb1 => 0x52f3,
+    0xb2 => 0x5659, 0xb3 => 0x566b, 0xb4 => 0x5679, 0xb5 => 0x5669,
+    0xb6 => 0x5664, 0xb7 => 0x5678, 0xb8 => 0x566a, 0xb9 => 0x5668,
+    0xba => 0x5665, 0xbb => 0x5671, 0xbc => 0x566f, 0xbd => 0x566c,
+    0xbe => 0x5662, 0xbf => 0x5676, 0xc0 => 0x58c1, 0xc1 => 0x58be,
+    0xc2 => 0x58c7, 0xc3 => 0x58c5, 0xc4 => 0x596e, 0xc5 => 0x5b1d,
+    0xc6 => 0x5b34, 0xc7 => 0x5b78, 0xc8 => 0x5bf0, 0xc9 => 0x5c0e,
+    0xca => 0x5f4a, 0xcb => 0x61b2, 0xcc => 0x6191, 0xcd => 0x61a9,
+    0xce => 0x618a, 0xcf => 0x61cd, 0xd0 => 0x61b6, 0xd1 => 0x61be,
+    0xd2 => 0x61ca, 0xd3 => 0x61c8, 0xd4 => 0x6230, 0xd5 => 0x64c5,
+    0xd6 => 0x64c1, 0xd7 => 0x64cb, 0xd8 => 0x64bb, 0xd9 => 0x64bc,
+    0xda => 0x64da, 0xdb => 0x64c4, 0xdc => 0x64c7, 0xdd => 0x64c2,
+    0xde => 0x64cd, 0xdf => 0x64bf, 0xe0 => 0x64d2, 0xe1 => 0x64d4,
+    0xe2 => 0x64be, 0xe3 => 0x6574, 0xe4 => 0x66c6, 0xe5 => 0x66c9,
+    0xe6 => 0x66b9, 0xe7 => 0x66c4, 0xe8 => 0x66c7, 0xe9 => 0x66b8,
+    0xea => 0x6a3d, 0xeb => 0x6a38, 0xec => 0x6a3a, 0xed => 0x6a59,
+    0xee => 0x6a6b, 0xef => 0x6a58, 0xf0 => 0x6a39, 0xf1 => 0x6a44,
+    0xf2 => 0x6a62, 0xf3 => 0x6a61, 0xf4 => 0x6a4b, 0xf5 => 0x6a47,
+    0xf6 => 0x6a35, 0xf7 => 0x6a5f, 0xf8 => 0x6a48, 0xf9 => 0x6b59,
+    0xfa => 0x6b77, 0xfb => 0x6c05, 0xfc => 0x6fc2, 0xfd => 0x6fb1,
+    0xfe => 0x6fa1,
+  },
+  0xbf => {
+    0x40 => 0x6fc3, 0x41 => 0x6fa4, 0x42 => 0x6fc1, 0x43 => 0x6fa7,
+    0x44 => 0x6fb3, 0x45 => 0x6fc0, 0x46 => 0x6fb9, 0x47 => 0x6fb6,
+    0x48 => 0x6fa6, 0x49 => 0x6fa0, 0x4a => 0x6fb4, 0x4b => 0x71be,
+    0x4c => 0x71c9, 0x4d => 0x71d0, 0x4e => 0x71d2, 0x4f => 0x71c8,
+    0x50 => 0x71d5, 0x51 => 0x71b9, 0x52 => 0x71ce, 0x53 => 0x71d9,
+    0x54 => 0x71dc, 0x55 => 0x71c3, 0x56 => 0x71c4, 0x57 => 0x7368,
+    0x58 => 0x749c, 0x59 => 0x74a3, 0x5a => 0x7498, 0x5b => 0x749f,
+    0x5c => 0x749e, 0x5d => 0x74e2, 0x5e => 0x750c, 0x5f => 0x750d,
+    0x60 => 0x7634, 0x61 => 0x7638, 0x62 => 0x763a, 0x63 => 0x76e7,
+    0x64 => 0x76e5, 0x65 => 0x77a0, 0x66 => 0x779e, 0x67 => 0x779f,
+    0x68 => 0x77a5, 0x69 => 0x78e8, 0x6a => 0x78da, 0x6b => 0x78ec,
+    0x6c => 0x78e7, 0x6d => 0x79a6, 0x6e => 0x7a4d, 0x6f => 0x7a4e,
+    0x70 => 0x7a46, 0x71 => 0x7a4c, 0x72 => 0x7a4b, 0x73 => 0x7aba,
+    0x74 => 0x7bd9, 0x75 => 0x7c11, 0x76 => 0x7bc9, 0x77 => 0x7be4,
+    0x78 => 0x7bdb, 0x79 => 0x7be1, 0x7a => 0x7be9, 0x7b => 0x7be6,
+    0x7c => 0x7cd5, 0x7d => 0x7cd6, 0x7e => 0x7e0a, 0xa1 => 0x7e11,
+    0xa2 => 0x7e08, 0xa3 => 0x7e1b, 0xa4 => 0x7e23, 0xa5 => 0x7e1e,
+    0xa6 => 0x7e1d, 0xa7 => 0x7e09, 0xa8 => 0x7e10, 0xa9 => 0x7f79,
+    0xaa => 0x7fb2, 0xab => 0x7ff0, 0xac => 0x7ff1, 0xad => 0x7fee,
+    0xae => 0x8028, 0xaf => 0x81b3, 0xb0 => 0x81a9, 0xb1 => 0x81a8,
+    0xb2 => 0x81fb, 0xb3 => 0x8208, 0xb4 => 0x8258, 0xb5 => 0x8259,
+    0xb6 => 0x854a, 0xb7 => 0x8559, 0xb8 => 0x8548, 0xb9 => 0x8568,
+    0xba => 0x8569, 0xbb => 0x8543, 0xbc => 0x8549, 0xbd => 0x856d,
+    0xbe => 0x856a, 0xbf => 0x855e, 0xc0 => 0x8783, 0xc1 => 0x879f,
+    0xc2 => 0x879e, 0xc3 => 0x87a2, 0xc4 => 0x878d, 0xc5 => 0x8861,
+    0xc6 => 0x892a, 0xc7 => 0x8932, 0xc8 => 0x8925, 0xc9 => 0x892b,
+    0xca => 0x8921, 0xcb => 0x89aa, 0xcc => 0x89a6, 0xcd => 0x8ae6,
+    0xce => 0x8afa, 0xcf => 0x8aeb, 0xd0 => 0x8af1, 0xd1 => 0x8b00,
+    0xd2 => 0x8adc, 0xd3 => 0x8ae7, 0xd4 => 0x8aee, 0xd5 => 0x8afe,
+    0xd6 => 0x8b01, 0xd7 => 0x8b02, 0xd8 => 0x8af7, 0xd9 => 0x8aed,
+    0xda => 0x8af3, 0xdb => 0x8af6, 0xdc => 0x8afc, 0xdd => 0x8c6b,
+    0xde => 0x8c6d, 0xdf => 0x8c93, 0xe0 => 0x8cf4, 0xe1 => 0x8e44,
+    0xe2 => 0x8e31, 0xe3 => 0x8e34, 0xe4 => 0x8e42, 0xe5 => 0x8e39,
+    0xe6 => 0x8e35, 0xe7 => 0x8f3b, 0xe8 => 0x8f2f, 0xe9 => 0x8f38,
+    0xea => 0x8f33, 0xeb => 0x8fa8, 0xec => 0x8fa6, 0xed => 0x9075,
+    0xee => 0x9074, 0xef => 0x9078, 0xf0 => 0x9072, 0xf1 => 0x907c,
+    0xf2 => 0x907a, 0xf3 => 0x9134, 0xf4 => 0x9192, 0xf5 => 0x9320,
+    0xf6 => 0x9336, 0xf7 => 0x92f8, 0xf8 => 0x9333, 0xf9 => 0x932f,
+    0xfa => 0x9322, 0xfb => 0x92fc, 0xfc => 0x932b, 0xfd => 0x9304,
+    0xfe => 0x931a,
+  },
+  0xc0 => {
+    0x40 => 0x9310, 0x41 => 0x9326, 0x42 => 0x9321, 0x43 => 0x9315,
+    0x44 => 0x932e, 0x45 => 0x9319, 0x46 => 0x95bb, 0x47 => 0x96a7,
+    0x48 => 0x96a8, 0x49 => 0x96aa, 0x4a => 0x96d5, 0x4b => 0x970e,
+    0x4c => 0x9711, 0x4d => 0x9716, 0x4e => 0x970d, 0x4f => 0x9713,
+    0x50 => 0x970f, 0x51 => 0x975b, 0x52 => 0x975c, 0x53 => 0x9766,
+    0x54 => 0x9798, 0x55 => 0x9830, 0x56 => 0x9838, 0x57 => 0x983b,
+    0x58 => 0x9837, 0x59 => 0x982d, 0x5a => 0x9839, 0x5b => 0x9824,
+    0x5c => 0x9910, 0x5d => 0x9928, 0x5e => 0x991e, 0x5f => 0x991b,
+    0x60 => 0x9921, 0x61 => 0x991a, 0x62 => 0x99ed, 0x63 => 0x99e2,
+    0x64 => 0x99f1, 0x65 => 0x9ab8, 0x66 => 0x9abc, 0x67 => 0x9afb,
+    0x68 => 0x9aed, 0x69 => 0x9b28, 0x6a => 0x9b91, 0x6b => 0x9d15,
+    0x6c => 0x9d23, 0x6d => 0x9d26, 0x6e => 0x9d28, 0x6f => 0x9d12,
+    0x70 => 0x9d1b, 0x71 => 0x9ed8, 0x72 => 0x9ed4, 0x73 => 0x9f8d,
+    0x74 => 0x9f9c, 0x75 => 0x512a, 0x76 => 0x511f, 0x77 => 0x5121,
+    0x78 => 0x5132, 0x79 => 0x52f5, 0x7a => 0x568e, 0x7b => 0x5680,
+    0x7c => 0x5690, 0x7d => 0x5685, 0x7e => 0x5687, 0xa1 => 0x568f,
+    0xa2 => 0x58d5, 0xa3 => 0x58d3, 0xa4 => 0x58d1, 0xa5 => 0x58ce,
+    0xa6 => 0x5b30, 0xa7 => 0x5b2a, 0xa8 => 0x5b24, 0xa9 => 0x5b7a,
+    0xaa => 0x5c37, 0xab => 0x5c68, 0xac => 0x5dbc, 0xad => 0x5dba,
+    0xae => 0x5dbd, 0xaf => 0x5db8, 0xb0 => 0x5e6b, 0xb1 => 0x5f4c,
+    0xb2 => 0x5fbd, 0xb3 => 0x61c9, 0xb4 => 0x61c2, 0xb5 => 0x61c7,
+    0xb6 => 0x61e6, 0xb7 => 0x61cb, 0xb8 => 0x6232, 0xb9 => 0x6234,
+    0xba => 0x64ce, 0xbb => 0x64ca, 0xbc => 0x64d8, 0xbd => 0x64e0,
+    0xbe => 0x64f0, 0xbf => 0x64e6, 0xc0 => 0x64ec, 0xc1 => 0x64f1,
+    0xc2 => 0x64e2, 0xc3 => 0x64ed, 0xc4 => 0x6582, 0xc5 => 0x6583,
+    0xc6 => 0x66d9, 0xc7 => 0x66d6, 0xc8 => 0x6a80, 0xc9 => 0x6a94,
+    0xca => 0x6a84, 0xcb => 0x6aa2, 0xcc => 0x6a9c, 0xcd => 0x6adb,
+    0xce => 0x6aa3, 0xcf => 0x6a7e, 0xd0 => 0x6a97, 0xd1 => 0x6a90,
+    0xd2 => 0x6aa0, 0xd3 => 0x6b5c, 0xd4 => 0x6bae, 0xd5 => 0x6bda,
+    0xd6 => 0x6c08, 0xd7 => 0x6fd8, 0xd8 => 0x6ff1, 0xd9 => 0x6fdf,
+    0xda => 0x6fe0, 0xdb => 0x6fdb, 0xdc => 0x6fe4, 0xdd => 0x6feb,
+    0xde => 0x6fef, 0xdf => 0x6f80, 0xe0 => 0x6fec, 0xe1 => 0x6fe1,
+    0xe2 => 0x6fe9, 0xe3 => 0x6fd5, 0xe4 => 0x6fee, 0xe5 => 0x6ff0,
+    0xe6 => 0x71e7, 0xe7 => 0x71df, 0xe8 => 0x71ee, 0xe9 => 0x71e6,
+    0xea => 0x71e5, 0xeb => 0x71ed, 0xec => 0x71ec, 0xed => 0x71f4,
+    0xee => 0x71e0, 0xef => 0x7235, 0xf0 => 0x7246, 0xf1 => 0x7370,
+    0xf2 => 0x7372, 0xf3 => 0x74a9, 0xf4 => 0x74b0, 0xf5 => 0x74a6,
+    0xf6 => 0x74a8, 0xf7 => 0x7646, 0xf8 => 0x7642, 0xf9 => 0x764c,
+    0xfa => 0x76ea, 0xfb => 0x77b3, 0xfc => 0x77aa, 0xfd => 0x77b0,
+    0xfe => 0x77ac,
+  },
+  0xc1 => {
+    0x40 => 0x77a7, 0x41 => 0x77ad, 0x42 => 0x77ef, 0x43 => 0x78f7,
+    0x44 => 0x78fa, 0x45 => 0x78f4, 0x46 => 0x78ef, 0x47 => 0x7901,
+    0x48 => 0x79a7, 0x49 => 0x79aa, 0x4a => 0x7a57, 0x4b => 0x7abf,
+    0x4c => 0x7c07, 0x4d => 0x7c0d, 0x4e => 0x7bfe, 0x4f => 0x7bf7,
+    0x50 => 0x7c0c, 0x51 => 0x7be0, 0x52 => 0x7ce0, 0x53 => 0x7cdc,
+    0x54 => 0x7cde, 0x55 => 0x7ce2, 0x56 => 0x7cdf, 0x57 => 0x7cd9,
+    0x58 => 0x7cdd, 0x59 => 0x7e2e, 0x5a => 0x7e3e, 0x5b => 0x7e46,
+    0x5c => 0x7e37, 0x5d => 0x7e32, 0x5e => 0x7e43, 0x5f => 0x7e2b,
+    0x60 => 0x7e3d, 0x61 => 0x7e31, 0x62 => 0x7e45, 0x63 => 0x7e41,
+    0x64 => 0x7e34, 0x65 => 0x7e39, 0x66 => 0x7e48, 0x67 => 0x7e35,
+    0x68 => 0x7e3f, 0x69 => 0x7e2f, 0x6a => 0x7f44, 0x6b => 0x7ff3,
+    0x6c => 0x7ffc, 0x6d => 0x8071, 0x6e => 0x8072, 0x6f => 0x8070,
+    0x70 => 0x806f, 0x71 => 0x8073, 0x72 => 0x81c6, 0x73 => 0x81c3,
+    0x74 => 0x81ba, 0x75 => 0x81c2, 0x76 => 0x81c0, 0x77 => 0x81bf,
+    0x78 => 0x81bd, 0x79 => 0x81c9, 0x7a => 0x81be, 0x7b => 0x81e8,
+    0x7c => 0x8209, 0x7d => 0x8271, 0x7e => 0x85aa, 0xa1 => 0x8584,
+    0xa2 => 0x857e, 0xa3 => 0x859c, 0xa4 => 0x8591, 0xa5 => 0x8594,
+    0xa6 => 0x85af, 0xa7 => 0x859b, 0xa8 => 0x8587, 0xa9 => 0x85a8,
+    0xaa => 0x858a, 0xab => 0x8667, 0xac => 0x87c0, 0xad => 0x87d1,
+    0xae => 0x87b3, 0xaf => 0x87d2, 0xb0 => 0x87c6, 0xb1 => 0x87ab,
+    0xb2 => 0x87bb, 0xb3 => 0x87ba, 0xb4 => 0x87c8, 0xb5 => 0x87cb,
+    0xb6 => 0x893b, 0xb7 => 0x8936, 0xb8 => 0x8944, 0xb9 => 0x8938,
+    0xba => 0x893d, 0xbb => 0x89ac, 0xbc => 0x8b0e, 0xbd => 0x8b17,
+    0xbe => 0x8b19, 0xbf => 0x8b1b, 0xc0 => 0x8b0a, 0xc1 => 0x8b20,
+    0xc2 => 0x8b1d, 0xc3 => 0x8b04, 0xc4 => 0x8b10, 0xc5 => 0x8c41,
+    0xc6 => 0x8c3f, 0xc7 => 0x8c73, 0xc8 => 0x8cfa, 0xc9 => 0x8cfd,
+    0xca => 0x8cfc, 0xcb => 0x8cf8, 0xcc => 0x8cfb, 0xcd => 0x8da8,
+    0xce => 0x8e49, 0xcf => 0x8e4b, 0xd0 => 0x8e48, 0xd1 => 0x8e4a,
+    0xd2 => 0x8f44, 0xd3 => 0x8f3e, 0xd4 => 0x8f42, 0xd5 => 0x8f45,
+    0xd6 => 0x8f3f, 0xd7 => 0x907f, 0xd8 => 0x907d, 0xd9 => 0x9084,
+    0xda => 0x9081, 0xdb => 0x9082, 0xdc => 0x9080, 0xdd => 0x9139,
+    0xde => 0x91a3, 0xdf => 0x919e, 0xe0 => 0x919c, 0xe1 => 0x934d,
+    0xe2 => 0x9382, 0xe3 => 0x9328, 0xe4 => 0x9375, 0xe5 => 0x934a,
+    0xe6 => 0x9365, 0xe7 => 0x934b, 0xe8 => 0x9318, 0xe9 => 0x937e,
+    0xea => 0x936c, 0xeb => 0x935b, 0xec => 0x9370, 0xed => 0x935a,
+    0xee => 0x9354, 0xef => 0x95ca, 0xf0 => 0x95cb, 0xf1 => 0x95cc,
+    0xf2 => 0x95c8, 0xf3 => 0x95c6, 0xf4 => 0x96b1, 0xf5 => 0x96b8,
+    0xf6 => 0x96d6, 0xf7 => 0x971c, 0xf8 => 0x971e, 0xf9 => 0x97a0,
+    0xfa => 0x97d3, 0xfb => 0x9846, 0xfc => 0x98b6, 0xfd => 0x9935,
+    0xfe => 0x9a01,
+  },
+  0xc2 => {
+    0x40 => 0x99ff, 0x41 => 0x9bae, 0x42 => 0x9bab, 0x43 => 0x9baa,
+    0x44 => 0x9bad, 0x45 => 0x9d3b, 0x46 => 0x9d3f, 0x47 => 0x9e8b,
+    0x48 => 0x9ecf, 0x49 => 0x9ede, 0x4a => 0x9edc, 0x4b => 0x9edd,
+    0x4c => 0x9edb, 0x4d => 0x9f3e, 0x4e => 0x9f4b, 0x4f => 0x53e2,
+    0x50 => 0x5695, 0x51 => 0x56ae, 0x52 => 0x58d9, 0x53 => 0x58d8,
+    0x54 => 0x5b38, 0x55 => 0x5f5d, 0x56 => 0x61e3, 0x57 => 0x6233,
+    0x58 => 0x64f4, 0x59 => 0x64f2, 0x5a => 0x64fe, 0x5b => 0x6506,
+    0x5c => 0x64fa, 0x5d => 0x64fb, 0x5e => 0x64f7, 0x5f => 0x65b7,
+    0x60 => 0x66dc, 0x61 => 0x6726, 0x62 => 0x6ab3, 0x63 => 0x6aac,
+    0x64 => 0x6ac3, 0x65 => 0x6abb, 0x66 => 0x6ab8, 0x67 => 0x6ac2,
+    0x68 => 0x6aae, 0x69 => 0x6aaf, 0x6a => 0x6b5f, 0x6b => 0x6b78,
+    0x6c => 0x6baf, 0x6d => 0x7009, 0x6e => 0x700b, 0x6f => 0x6ffe,
+    0x70 => 0x7006, 0x71 => 0x6ffa, 0x72 => 0x7011, 0x73 => 0x700f,
+    0x74 => 0x71fb, 0x75 => 0x71fc, 0x76 => 0x71fe, 0x77 => 0x71f8,
+    0x78 => 0x7377, 0x79 => 0x7375, 0x7a => 0x74a7, 0x7b => 0x74bf,
+    0x7c => 0x7515, 0x7d => 0x7656, 0x7e => 0x7658, 0xa1 => 0x7652,
+    0xa2 => 0x77bd, 0xa3 => 0x77bf, 0xa4 => 0x77bb, 0xa5 => 0x77bc,
+    0xa6 => 0x790e, 0xa7 => 0x79ae, 0xa8 => 0x7a61, 0xa9 => 0x7a62,
+    0xaa => 0x7a60, 0xab => 0x7ac4, 0xac => 0x7ac5, 0xad => 0x7c2b,
+    0xae => 0x7c27, 0xaf => 0x7c2a, 0xb0 => 0x7c1e, 0xb1 => 0x7c23,
+    0xb2 => 0x7c21, 0xb3 => 0x7ce7, 0xb4 => 0x7e54, 0xb5 => 0x7e55,
+    0xb6 => 0x7e5e, 0xb7 => 0x7e5a, 0xb8 => 0x7e61, 0xb9 => 0x7e52,
+    0xba => 0x7e59, 0xbb => 0x7f48, 0xbc => 0x7ff9, 0xbd => 0x7ffb,
+    0xbe => 0x8077, 0xbf => 0x8076, 0xc0 => 0x81cd, 0xc1 => 0x81cf,
+    0xc2 => 0x820a, 0xc3 => 0x85cf, 0xc4 => 0x85a9, 0xc5 => 0x85cd,
+    0xc6 => 0x85d0, 0xc7 => 0x85c9, 0xc8 => 0x85b0, 0xc9 => 0x85ba,
+    0xca => 0x85b9, 0xcb => 0x85a6, 0xcc => 0x87ef, 0xcd => 0x87ec,
+    0xce => 0x87f2, 0xcf => 0x87e0, 0xd0 => 0x8986, 0xd1 => 0x89b2,
+    0xd2 => 0x89f4, 0xd3 => 0x8b28, 0xd4 => 0x8b39, 0xd5 => 0x8b2c,
+    0xd6 => 0x8b2b, 0xd7 => 0x8c50, 0xd8 => 0x8d05, 0xd9 => 0x8e59,
+    0xda => 0x8e63, 0xdb => 0x8e66, 0xdc => 0x8e64, 0xdd => 0x8e5f,
+    0xde => 0x8e55, 0xdf => 0x8ec0, 0xe0 => 0x8f49, 0xe1 => 0x8f4d,
+    0xe2 => 0x9087, 0xe3 => 0x9083, 0xe4 => 0x9088, 0xe5 => 0x91ab,
+    0xe6 => 0x91ac, 0xe7 => 0x91d0, 0xe8 => 0x9394, 0xe9 => 0x938a,
+    0xea => 0x9396, 0xeb => 0x93a2, 0xec => 0x93b3, 0xed => 0x93ae,
+    0xee => 0x93ac, 0xef => 0x93b0, 0xf0 => 0x9398, 0xf1 => 0x939a,
+    0xf2 => 0x9397, 0xf3 => 0x95d4, 0xf4 => 0x95d6, 0xf5 => 0x95d0,
+    0xf6 => 0x95d5, 0xf7 => 0x96e2, 0xf8 => 0x96dc, 0xf9 => 0x96d9,
+    0xfa => 0x96db, 0xfb => 0x96de, 0xfc => 0x9724, 0xfd => 0x97a3,
+    0xfe => 0x97a6,
+  },
+  0xc3 => {
+    0x40 => 0x97ad, 0x41 => 0x97f9, 0x42 => 0x984d, 0x43 => 0x984f,
+    0x44 => 0x984c, 0x45 => 0x984e, 0x46 => 0x9853, 0x47 => 0x98ba,
+    0x48 => 0x993e, 0x49 => 0x993f, 0x4a => 0x993d, 0x4b => 0x992e,
+    0x4c => 0x99a5, 0x4d => 0x9a0e, 0x4e => 0x9ac1, 0x4f => 0x9b03,
+    0x50 => 0x9b06, 0x51 => 0x9b4f, 0x52 => 0x9b4e, 0x53 => 0x9b4d,
+    0x54 => 0x9bca, 0x55 => 0x9bc9, 0x56 => 0x9bfd, 0x57 => 0x9bc8,
+    0x58 => 0x9bc0, 0x59 => 0x9d51, 0x5a => 0x9d5d, 0x5b => 0x9d60,
+    0x5c => 0x9ee0, 0x5d => 0x9f15, 0x5e => 0x9f2c, 0x5f => 0x5133,
+    0x60 => 0x56a5, 0x61 => 0x58de, 0x62 => 0x58df, 0x63 => 0x58e2,
+    0x64 => 0x5bf5, 0x65 => 0x9f90, 0x66 => 0x5eec, 0x67 => 0x61f2,
+    0x68 => 0x61f7, 0x69 => 0x61f6, 0x6a => 0x61f5, 0x6b => 0x6500,
+    0x6c => 0x650f, 0x6d => 0x66e0, 0x6e => 0x66dd, 0x6f => 0x6ae5,
+    0x70 => 0x6add, 0x71 => 0x6ada, 0x72 => 0x6ad3, 0x73 => 0x701b,
+    0x74 => 0x701f, 0x75 => 0x7028, 0x76 => 0x701a, 0x77 => 0x701d,
+    0x78 => 0x7015, 0x79 => 0x7018, 0x7a => 0x7206, 0x7b => 0x720d,
+    0x7c => 0x7258, 0x7d => 0x72a2, 0x7e => 0x7378, 0xa1 => 0x737a,
+    0xa2 => 0x74bd, 0xa3 => 0x74ca, 0xa4 => 0x74e3, 0xa5 => 0x7587,
+    0xa6 => 0x7586, 0xa7 => 0x765f, 0xa8 => 0x7661, 0xa9 => 0x77c7,
+    0xaa => 0x7919, 0xab => 0x79b1, 0xac => 0x7a6b, 0xad => 0x7a69,
+    0xae => 0x7c3e, 0xaf => 0x7c3f, 0xb0 => 0x7c38, 0xb1 => 0x7c3d,
+    0xb2 => 0x7c37, 0xb3 => 0x7c40, 0xb4 => 0x7e6b, 0xb5 => 0x7e6d,
+    0xb6 => 0x7e79, 0xb7 => 0x7e69, 0xb8 => 0x7e6a, 0xb9 => 0x7f85,
+    0xba => 0x7e73, 0xbb => 0x7fb6, 0xbc => 0x7fb9, 0xbd => 0x7fb8,
+    0xbe => 0x81d8, 0xbf => 0x85e9, 0xc0 => 0x85dd, 0xc1 => 0x85ea,
+    0xc2 => 0x85d5, 0xc3 => 0x85e4, 0xc4 => 0x85e5, 0xc5 => 0x85f7,
+    0xc6 => 0x87fb, 0xc7 => 0x8805, 0xc8 => 0x880d, 0xc9 => 0x87f9,
+    0xca => 0x87fe, 0xcb => 0x8960, 0xcc => 0x895f, 0xcd => 0x8956,
+    0xce => 0x895e, 0xcf => 0x8b41, 0xd0 => 0x8b5c, 0xd1 => 0x8b58,
+    0xd2 => 0x8b49, 0xd3 => 0x8b5a, 0xd4 => 0x8b4e, 0xd5 => 0x8b4f,
+    0xd6 => 0x8b46, 0xd7 => 0x8b59, 0xd8 => 0x8d08, 0xd9 => 0x8d0a,
+    0xda => 0x8e7c, 0xdb => 0x8e72, 0xdc => 0x8e87, 0xdd => 0x8e76,
+    0xde => 0x8e6c, 0xdf => 0x8e7a, 0xe0 => 0x8e74, 0xe1 => 0x8f54,
+    0xe2 => 0x8f4e, 0xe3 => 0x8fad, 0xe4 => 0x908a, 0xe5 => 0x908b,
+    0xe6 => 0x91b1, 0xe7 => 0x91ae, 0xe8 => 0x93e1, 0xe9 => 0x93d1,
+    0xea => 0x93df, 0xeb => 0x93c3, 0xec => 0x93c8, 0xed => 0x93dc,
+    0xee => 0x93dd, 0xef => 0x93d6, 0xf0 => 0x93e2, 0xf1 => 0x93cd,
+    0xf2 => 0x93d8, 0xf3 => 0x93e4, 0xf4 => 0x93d7, 0xf5 => 0x93e8,
+    0xf6 => 0x95dc, 0xf7 => 0x96b4, 0xf8 => 0x96e3, 0xf9 => 0x972a,
+    0xfa => 0x9727, 0xfb => 0x9761, 0xfc => 0x97dc, 0xfd => 0x97fb,
+    0xfe => 0x985e,
+  },
+  0xc4 => {
+    0x40 => 0x9858, 0x41 => 0x985b, 0x42 => 0x98bc, 0x43 => 0x9945,
+    0x44 => 0x9949, 0x45 => 0x9a16, 0x46 => 0x9a19, 0x47 => 0x9b0d,
+    0x48 => 0x9be8, 0x49 => 0x9be7, 0x4a => 0x9bd6, 0x4b => 0x9bdb,
+    0x4c => 0x9d89, 0x4d => 0x9d61, 0x4e => 0x9d72, 0x4f => 0x9d6a,
+    0x50 => 0x9d6c, 0x51 => 0x9e92, 0x52 => 0x9e97, 0x53 => 0x9e93,
+    0x54 => 0x9eb4, 0x55 => 0x52f8, 0x56 => 0x56a8, 0x57 => 0x56b7,
+    0x58 => 0x56b6, 0x59 => 0x56b4, 0x5a => 0x56bc, 0x5b => 0x58e4,
+    0x5c => 0x5b40, 0x5d => 0x5b43, 0x5e => 0x5b7d, 0x5f => 0x5bf6,
+    0x60 => 0x5dc9, 0x61 => 0x61f8, 0x62 => 0x61fa, 0x63 => 0x6518,
+    0x64 => 0x6514, 0x65 => 0x6519, 0x66 => 0x66e6, 0x67 => 0x6727,
+    0x68 => 0x6aec, 0x69 => 0x703e, 0x6a => 0x7030, 0x6b => 0x7032,
+    0x6c => 0x7210, 0x6d => 0x737b, 0x6e => 0x74cf, 0x6f => 0x7662,
+    0x70 => 0x7665, 0x71 => 0x7926, 0x72 => 0x792a, 0x73 => 0x792c,
+    0x74 => 0x792b, 0x75 => 0x7ac7, 0x76 => 0x7af6, 0x77 => 0x7c4c,
+    0x78 => 0x7c43, 0x79 => 0x7c4d, 0x7a => 0x7cef, 0x7b => 0x7cf0,
+    0x7c => 0x8fae, 0x7d => 0x7e7d, 0x7e => 0x7e7c, 0xa1 => 0x7e82,
+    0xa2 => 0x7f4c, 0xa3 => 0x8000, 0xa4 => 0x81da, 0xa5 => 0x8266,
+    0xa6 => 0x85fb, 0xa7 => 0x85f9, 0xa8 => 0x8611, 0xa9 => 0x85fa,
+    0xaa => 0x8606, 0xab => 0x860b, 0xac => 0x8607, 0xad => 0x860a,
+    0xae => 0x8814, 0xaf => 0x8815, 0xb0 => 0x8964, 0xb1 => 0x89ba,
+    0xb2 => 0x89f8, 0xb3 => 0x8b70, 0xb4 => 0x8b6c, 0xb5 => 0x8b66,
+    0xb6 => 0x8b6f, 0xb7 => 0x8b5f, 0xb8 => 0x8b6b, 0xb9 => 0x8d0f,
+    0xba => 0x8d0d, 0xbb => 0x8e89, 0xbc => 0x8e81, 0xbd => 0x8e85,
+    0xbe => 0x8e82, 0xbf => 0x91b4, 0xc0 => 0x91cb, 0xc1 => 0x9418,
+    0xc2 => 0x9403, 0xc3 => 0x93fd, 0xc4 => 0x95e1, 0xc5 => 0x9730,
+    0xc6 => 0x98c4, 0xc7 => 0x9952, 0xc8 => 0x9951, 0xc9 => 0x99a8,
+    0xca => 0x9a2b, 0xcb => 0x9a30, 0xcc => 0x9a37, 0xcd => 0x9a35,
+    0xce => 0x9c13, 0xcf => 0x9c0d, 0xd0 => 0x9e79, 0xd1 => 0x9eb5,
+    0xd2 => 0x9ee8, 0xd3 => 0x9f2f, 0xd4 => 0x9f5f, 0xd5 => 0x9f63,
+    0xd6 => 0x9f61, 0xd7 => 0x5137, 0xd8 => 0x5138, 0xd9 => 0x56c1,
+    0xda => 0x56c0, 0xdb => 0x56c2, 0xdc => 0x5914, 0xdd => 0x5c6c,
+    0xde => 0x5dcd, 0xdf => 0x61fc, 0xe0 => 0x61fe, 0xe1 => 0x651d,
+    0xe2 => 0x651c, 0xe3 => 0x6595, 0xe4 => 0x66e9, 0xe5 => 0x6afb,
+    0xe6 => 0x6b04, 0xe7 => 0x6afa, 0xe8 => 0x6bb2, 0xe9 => 0x704c,
+    0xea => 0x721b, 0xeb => 0x72a7, 0xec => 0x74d6, 0xed => 0x74d4,
+    0xee => 0x7669, 0xef => 0x77d3, 0xf0 => 0x7c50, 0xf1 => 0x7e8f,
+    0xf2 => 0x7e8c, 0xf3 => 0x7fbc, 0xf4 => 0x8617, 0xf5 => 0x862d,
+    0xf6 => 0x861a, 0xf7 => 0x8823, 0xf8 => 0x8822, 0xf9 => 0x8821,
+    0xfa => 0x881f, 0xfb => 0x896a, 0xfc => 0x896c, 0xfd => 0x89bd,
+    0xfe => 0x8b74,
+  },
+  0xc5 => {
+    0x40 => 0x8b77, 0x41 => 0x8b7d, 0x42 => 0x8d13, 0x43 => 0x8e8a,
+    0x44 => 0x8e8d, 0x45 => 0x8e8b, 0x46 => 0x8f5f, 0x47 => 0x8faf,
+    0x48 => 0x91ba, 0x49 => 0x942e, 0x4a => 0x9433, 0x4b => 0x9435,
+    0x4c => 0x943a, 0x4d => 0x9438, 0x4e => 0x9432, 0x4f => 0x942b,
+    0x50 => 0x95e2, 0x51 => 0x9738, 0x52 => 0x9739, 0x53 => 0x9732,
+    0x54 => 0x97ff, 0x55 => 0x9867, 0x56 => 0x9865, 0x57 => 0x9957,
+    0x58 => 0x9a45, 0x59 => 0x9a43, 0x5a => 0x9a40, 0x5b => 0x9a3e,
+    0x5c => 0x9acf, 0x5d => 0x9b54, 0x5e => 0x9b51, 0x5f => 0x9c2d,
+    0x60 => 0x9c25, 0x61 => 0x9daf, 0x62 => 0x9db4, 0x63 => 0x9dc2,
+    0x64 => 0x9db8, 0x65 => 0x9e9d, 0x66 => 0x9eef, 0x67 => 0x9f19,
+    0x68 => 0x9f5c, 0x69 => 0x9f66, 0x6a => 0x9f67, 0x6b => 0x513c,
+    0x6c => 0x513b, 0x6d => 0x56c8, 0x6e => 0x56ca, 0x6f => 0x56c9,
+    0x70 => 0x5b7f, 0x71 => 0x5dd4, 0x72 => 0x5dd2, 0x73 => 0x5f4e,
+    0x74 => 0x61ff, 0x75 => 0x6524, 0x76 => 0x6b0a, 0x77 => 0x6b61,
+    0x78 => 0x7051, 0x79 => 0x7058, 0x7a => 0x7380, 0x7b => 0x74e4,
+    0x7c => 0x758a, 0x7d => 0x766e, 0x7e => 0x766c, 0xa1 => 0x79b3,
+    0xa2 => 0x7c60, 0xa3 => 0x7c5f, 0xa4 => 0x807e, 0xa5 => 0x807d,
+    0xa6 => 0x81df, 0xa7 => 0x8972, 0xa8 => 0x896f, 0xa9 => 0x89fc,
+    0xaa => 0x8b80, 0xab => 0x8d16, 0xac => 0x8d17, 0xad => 0x8e91,
+    0xae => 0x8e93, 0xaf => 0x8f61, 0xb0 => 0x9148, 0xb1 => 0x9444,
+    0xb2 => 0x9451, 0xb3 => 0x9452, 0xb4 => 0x973d, 0xb5 => 0x973e,
+    0xb6 => 0x97c3, 0xb7 => 0x97c1, 0xb8 => 0x986b, 0xb9 => 0x9955,
+    0xba => 0x9a55, 0xbb => 0x9a4d, 0xbc => 0x9ad2, 0xbd => 0x9b1a,
+    0xbe => 0x9c49, 0xbf => 0x9c31, 0xc0 => 0x9c3e, 0xc1 => 0x9c3b,
+    0xc2 => 0x9dd3, 0xc3 => 0x9dd7, 0xc4 => 0x9f34, 0xc5 => 0x9f6c,
+    0xc6 => 0x9f6a, 0xc7 => 0x9f94, 0xc8 => 0x56cc, 0xc9 => 0x5dd6,
+    0xca => 0x6200, 0xcb => 0x6523, 0xcc => 0x652b, 0xcd => 0x652a,
+    0xce => 0x66ec, 0xcf => 0x6b10, 0xd0 => 0x74da, 0xd1 => 0x7aca,
+    0xd2 => 0x7c64, 0xd3 => 0x7c63, 0xd4 => 0x7c65, 0xd5 => 0x7e93,
+    0xd6 => 0x7e96, 0xd7 => 0x7e94, 0xd8 => 0x81e2, 0xd9 => 0x8638,
+    0xda => 0x863f, 0xdb => 0x8831, 0xdc => 0x8b8a, 0xdd => 0x9090,
+    0xde => 0x908f, 0xdf => 0x9463, 0xe0 => 0x9460, 0xe1 => 0x9464,
+    0xe2 => 0x9768, 0xe3 => 0x986f, 0xe4 => 0x995c, 0xe5 => 0x9a5a,
+    0xe6 => 0x9a5b, 0xe7 => 0x9a57, 0xe8 => 0x9ad3, 0xe9 => 0x9ad4,
+    0xea => 0x9ad1, 0xeb => 0x9c54, 0xec => 0x9c57, 0xed => 0x9c56,
+    0xee => 0x9de5, 0xef => 0x9e9f, 0xf0 => 0x9ef4, 0xf1 => 0x56d1,
+    0xf2 => 0x58e9, 0xf3 => 0x652c, 0xf4 => 0x705e, 0xf5 => 0x7671,
+    0xf6 => 0x7672, 0xf7 => 0x77d7, 0xf8 => 0x7f50, 0xf9 => 0x7f88,
+    0xfa => 0x8836, 0xfb => 0x8839, 0xfc => 0x8862, 0xfd => 0x8b93,
+    0xfe => 0x8b92,
+  },
+  0xc6 => {
+    0x40 => 0x8b96, 0x41 => 0x8277, 0x42 => 0x8d1b, 0x43 => 0x91c0,
+    0x44 => 0x946a, 0x45 => 0x9742, 0x46 => 0x9748, 0x47 => 0x9744,
+    0x48 => 0x97c6, 0x49 => 0x9870, 0x4a => 0x9a5f, 0x4b => 0x9b22,
+    0x4c => 0x9b58, 0x4d => 0x9c5f, 0x4e => 0x9df9, 0x4f => 0x9dfa,
+    0x50 => 0x9e7c, 0x51 => 0x9e7d, 0x52 => 0x9f07, 0x53 => 0x9f77,
+    0x54 => 0x9f72, 0x55 => 0x5ef3, 0x56 => 0x6b16, 0x57 => 0x7063,
+    0x58 => 0x7c6c, 0x59 => 0x7c6e, 0x5a => 0x883b, 0x5b => 0x89c0,
+    0x5c => 0x8ea1, 0x5d => 0x91c1, 0x5e => 0x9472, 0x5f => 0x9470,
+    0x60 => 0x9871, 0x61 => 0x995e, 0x62 => 0x9ad6, 0x63 => 0x9b23,
+    0x64 => 0x9ecc, 0x65 => 0x7064, 0x66 => 0x77da, 0x67 => 0x8b9a,
+    0x68 => 0x9477, 0x69 => 0x97c9, 0x6a => 0x9a62, 0x6b => 0x9a65,
+    0x6c => 0x7e9c, 0x6d => 0x8b9c, 0x6e => 0x8eaa, 0x6f => 0x91c5,
+    0x70 => 0x947d, 0x71 => 0x947e, 0x72 => 0x947c, 0x73 => 0x9c77,
+    0x74 => 0x9c78, 0x75 => 0x9ef7, 0x76 => 0x8c54, 0x77 => 0x947f,
+    0x78 => 0x9e1a, 0x79 => 0x7228, 0x7a => 0x9a6a, 0x7b => 0x9b31,
+    0x7c => 0x9e1b, 0x7d => 0x9e1e, 0x7e => 0x7c72,
+  },
+  0xc9 => {
+    0x40 => 0x4e42, 0x41 => 0x4e5c, 0x42 => 0x51f5, 0x43 => 0x531a,
+    0x44 => 0x5382, 0x45 => 0x4e07, 0x46 => 0x4e0c, 0x47 => 0x4e47,
+    0x48 => 0x4e8d, 0x49 => 0x56d7, 0x4a => 0xfa0c, 0x4b => 0x5c6e,
+    0x4c => 0x5f73, 0x4d => 0x4e0f, 0x4e => 0x5187, 0x4f => 0x4e0e,
+    0x50 => 0x4e2e, 0x51 => 0x4e93, 0x52 => 0x4ec2, 0x53 => 0x4ec9,
+    0x54 => 0x4ec8, 0x55 => 0x5198, 0x56 => 0x52fc, 0x57 => 0x536c,
+    0x58 => 0x53b9, 0x59 => 0x5720, 0x5a => 0x5903, 0x5b => 0x592c,
+    0x5c => 0x5c10, 0x5d => 0x5dff, 0x5e => 0x65e1, 0x5f => 0x6bb3,
+    0x60 => 0x6bcc, 0x61 => 0x6c14, 0x62 => 0x723f, 0x63 => 0x4e31,
+    0x64 => 0x4e3c, 0x65 => 0x4ee8, 0x66 => 0x4edc, 0x67 => 0x4ee9,
+    0x68 => 0x4ee1, 0x69 => 0x4edd, 0x6a => 0x4eda, 0x6b => 0x520c,
+    0x6c => 0x531c, 0x6d => 0x534c, 0x6e => 0x5722, 0x6f => 0x5723,
+    0x70 => 0x5917, 0x71 => 0x592f, 0x72 => 0x5b81, 0x73 => 0x5b84,
+    0x74 => 0x5c12, 0x75 => 0x5c3b, 0x76 => 0x5c74, 0x77 => 0x5c73,
+    0x78 => 0x5e04, 0x79 => 0x5e80, 0x7a => 0x5e82, 0x7b => 0x5fc9,
+    0x7c => 0x6209, 0x7d => 0x6250, 0x7e => 0x6c15, 0xa1 => 0x6c36,
+    0xa2 => 0x6c43, 0xa3 => 0x6c3f, 0xa4 => 0x6c3b, 0xa5 => 0x72ae,
+    0xa6 => 0x72b0, 0xa7 => 0x738a, 0xa8 => 0x79b8, 0xa9 => 0x808a,
+    0xaa => 0x961e, 0xab => 0x4f0e, 0xac => 0x4f18, 0xad => 0x4f2c,
+    0xae => 0x4ef5, 0xaf => 0x4f14, 0xb0 => 0x4ef1, 0xb1 => 0x4f00,
+    0xb2 => 0x4ef7, 0xb3 => 0x4f08, 0xb4 => 0x4f1d, 0xb5 => 0x4f02,
+    0xb6 => 0x4f05, 0xb7 => 0x4f22, 0xb8 => 0x4f13, 0xb9 => 0x4f04,
+    0xba => 0x4ef4, 0xbb => 0x4f12, 0xbc => 0x51b1, 0xbd => 0x5213,
+    0xbe => 0x5209, 0xbf => 0x5210, 0xc0 => 0x52a6, 0xc1 => 0x5322,
+    0xc2 => 0x531f, 0xc3 => 0x534d, 0xc4 => 0x538a, 0xc5 => 0x5407,
+    0xc6 => 0x56e1, 0xc7 => 0x56df, 0xc8 => 0x572e, 0xc9 => 0x572a,
+    0xca => 0x5734, 0xcb => 0x593c, 0xcc => 0x5980, 0xcd => 0x597c,
+    0xce => 0x5985, 0xcf => 0x597b, 0xd0 => 0x597e, 0xd1 => 0x5977,
+    0xd2 => 0x597f, 0xd3 => 0x5b56, 0xd4 => 0x5c15, 0xd5 => 0x5c25,
+    0xd6 => 0x5c7c, 0xd7 => 0x5c7a, 0xd8 => 0x5c7b, 0xd9 => 0x5c7e,
+    0xda => 0x5ddf, 0xdb => 0x5e75, 0xdc => 0x5e84, 0xdd => 0x5f02,
+    0xde => 0x5f1a, 0xdf => 0x5f74, 0xe0 => 0x5fd5, 0xe1 => 0x5fd4,
+    0xe2 => 0x5fcf, 0xe3 => 0x625c, 0xe4 => 0x625e, 0xe5 => 0x6264,
+    0xe6 => 0x6261, 0xe7 => 0x6266, 0xe8 => 0x6262, 0xe9 => 0x6259,
+    0xea => 0x6260, 0xeb => 0x625a, 0xec => 0x6265, 0xed => 0x65ef,
+    0xee => 0x65ee, 0xef => 0x673e, 0xf0 => 0x6739, 0xf1 => 0x6738,
+    0xf2 => 0x673b, 0xf3 => 0x673a, 0xf4 => 0x673f, 0xf5 => 0x673c,
+    0xf6 => 0x6733, 0xf7 => 0x6c18, 0xf8 => 0x6c46, 0xf9 => 0x6c52,
+    0xfa => 0x6c5c, 0xfb => 0x6c4f, 0xfc => 0x6c4a, 0xfd => 0x6c54,
+    0xfe => 0x6c4b,
+  },
+  0xca => {
+    0x40 => 0x6c4c, 0x41 => 0x7071, 0x42 => 0x725e, 0x43 => 0x72b4,
+    0x44 => 0x72b5, 0x45 => 0x738e, 0x46 => 0x752a, 0x47 => 0x767f,
+    0x48 => 0x7a75, 0x49 => 0x7f51, 0x4a => 0x8278, 0x4b => 0x827c,
+    0x4c => 0x8280, 0x4d => 0x827d, 0x4e => 0x827f, 0x4f => 0x864d,
+    0x50 => 0x897e, 0x51 => 0x9099, 0x52 => 0x9097, 0x53 => 0x9098,
+    0x54 => 0x909b, 0x55 => 0x9094, 0x56 => 0x9622, 0x57 => 0x9624,
+    0x58 => 0x9620, 0x59 => 0x9623, 0x5a => 0x4f56, 0x5b => 0x4f3b,
+    0x5c => 0x4f62, 0x5d => 0x4f49, 0x5e => 0x4f53, 0x5f => 0x4f64,
+    0x60 => 0x4f3e, 0x61 => 0x4f67, 0x62 => 0x4f52, 0x63 => 0x4f5f,
+    0x64 => 0x4f41, 0x65 => 0x4f58, 0x66 => 0x4f2d, 0x67 => 0x4f33,
+    0x68 => 0x4f3f, 0x69 => 0x4f61, 0x6a => 0x518f, 0x6b => 0x51b9,
+    0x6c => 0x521c, 0x6d => 0x521e, 0x6e => 0x5221, 0x6f => 0x52ad,
+    0x70 => 0x52ae, 0x71 => 0x5309, 0x72 => 0x5363, 0x73 => 0x5372,
+    0x74 => 0x538e, 0x75 => 0x538f, 0x76 => 0x5430, 0x77 => 0x5437,
+    0x78 => 0x542a, 0x79 => 0x5454, 0x7a => 0x5445, 0x7b => 0x5419,
+    0x7c => 0x541c, 0x7d => 0x5425, 0x7e => 0x5418, 0xa1 => 0x543d,
+    0xa2 => 0x544f, 0xa3 => 0x5441, 0xa4 => 0x5428, 0xa5 => 0x5424,
+    0xa6 => 0x5447, 0xa7 => 0x56ee, 0xa8 => 0x56e7, 0xa9 => 0x56e5,
+    0xaa => 0x5741, 0xab => 0x5745, 0xac => 0x574c, 0xad => 0x5749,
+    0xae => 0x574b, 0xaf => 0x5752, 0xb0 => 0x5906, 0xb1 => 0x5940,
+    0xb2 => 0x59a6, 0xb3 => 0x5998, 0xb4 => 0x59a0, 0xb5 => 0x5997,
+    0xb6 => 0x598e, 0xb7 => 0x59a2, 0xb8 => 0x5990, 0xb9 => 0x598f,
+    0xba => 0x59a7, 0xbb => 0x59a1, 0xbc => 0x5b8e, 0xbd => 0x5b92,
+    0xbe => 0x5c28, 0xbf => 0x5c2a, 0xc0 => 0x5c8d, 0xc1 => 0x5c8f,
+    0xc2 => 0x5c88, 0xc3 => 0x5c8b, 0xc4 => 0x5c89, 0xc5 => 0x5c92,
+    0xc6 => 0x5c8a, 0xc7 => 0x5c86, 0xc8 => 0x5c93, 0xc9 => 0x5c95,
+    0xca => 0x5de0, 0xcb => 0x5e0a, 0xcc => 0x5e0e, 0xcd => 0x5e8b,
+    0xce => 0x5e89, 0xcf => 0x5e8c, 0xd0 => 0x5e88, 0xd1 => 0x5e8d,
+    0xd2 => 0x5f05, 0xd3 => 0x5f1d, 0xd4 => 0x5f78, 0xd5 => 0x5f76,
+    0xd6 => 0x5fd2, 0xd7 => 0x5fd1, 0xd8 => 0x5fd0, 0xd9 => 0x5fed,
+    0xda => 0x5fe8, 0xdb => 0x5fee, 0xdc => 0x5ff3, 0xdd => 0x5fe1,
+    0xde => 0x5fe4, 0xdf => 0x5fe3, 0xe0 => 0x5ffa, 0xe1 => 0x5fef,
+    0xe2 => 0x5ff7, 0xe3 => 0x5ffb, 0xe4 => 0x6000, 0xe5 => 0x5ff4,
+    0xe6 => 0x623a, 0xe7 => 0x6283, 0xe8 => 0x628c, 0xe9 => 0x628e,
+    0xea => 0x628f, 0xeb => 0x6294, 0xec => 0x6287, 0xed => 0x6271,
+    0xee => 0x627b, 0xef => 0x627a, 0xf0 => 0x6270, 0xf1 => 0x6281,
+    0xf2 => 0x6288, 0xf3 => 0x6277, 0xf4 => 0x627d, 0xf5 => 0x6272,
+    0xf6 => 0x6274, 0xf7 => 0x6537, 0xf8 => 0x65f0, 0xf9 => 0x65f4,
+    0xfa => 0x65f3, 0xfb => 0x65f2, 0xfc => 0x65f5, 0xfd => 0x6745,
+    0xfe => 0x6747,
+  },
+  0xcb => {
+    0x40 => 0x6759, 0x41 => 0x6755, 0x42 => 0x674c, 0x43 => 0x6748,
+    0x44 => 0x675d, 0x45 => 0x674d, 0x46 => 0x675a, 0x47 => 0x674b,
+    0x48 => 0x6bd0, 0x49 => 0x6c19, 0x4a => 0x6c1a, 0x4b => 0x6c78,
+    0x4c => 0x6c67, 0x4d => 0x6c6b, 0x4e => 0x6c84, 0x4f => 0x6c8b,
+    0x50 => 0x6c8f, 0x51 => 0x6c71, 0x52 => 0x6c6f, 0x53 => 0x6c69,
+    0x54 => 0x6c9a, 0x55 => 0x6c6d, 0x56 => 0x6c87, 0x57 => 0x6c95,
+    0x58 => 0x6c9c, 0x59 => 0x6c66, 0x5a => 0x6c73, 0x5b => 0x6c65,
+    0x5c => 0x6c7b, 0x5d => 0x6c8e, 0x5e => 0x7074, 0x5f => 0x707a,
+    0x60 => 0x7263, 0x61 => 0x72bf, 0x62 => 0x72bd, 0x63 => 0x72c3,
+    0x64 => 0x72c6, 0x65 => 0x72c1, 0x66 => 0x72ba, 0x67 => 0x72c5,
+    0x68 => 0x7395, 0x69 => 0x7397, 0x6a => 0x7393, 0x6b => 0x7394,
+    0x6c => 0x7392, 0x6d => 0x753a, 0x6e => 0x7539, 0x6f => 0x7594,
+    0x70 => 0x7595, 0x71 => 0x7681, 0x72 => 0x793d, 0x73 => 0x8034,
+    0x74 => 0x8095, 0x75 => 0x8099, 0x76 => 0x8090, 0x77 => 0x8092,
+    0x78 => 0x809c, 0x79 => 0x8290, 0x7a => 0x828f, 0x7b => 0x8285,
+    0x7c => 0x828e, 0x7d => 0x8291, 0x7e => 0x8293, 0xa1 => 0x828a,
+    0xa2 => 0x8283, 0xa3 => 0x8284, 0xa4 => 0x8c78, 0xa5 => 0x8fc9,
+    0xa6 => 0x8fbf, 0xa7 => 0x909f, 0xa8 => 0x90a1, 0xa9 => 0x90a5,
+    0xaa => 0x909e, 0xab => 0x90a7, 0xac => 0x90a0, 0xad => 0x9630,
+    0xae => 0x9628, 0xaf => 0x962f, 0xb0 => 0x962d, 0xb1 => 0x4e33,
+    0xb2 => 0x4f98, 0xb3 => 0x4f7c, 0xb4 => 0x4f85, 0xb5 => 0x4f7d,
+    0xb6 => 0x4f80, 0xb7 => 0x4f87, 0xb8 => 0x4f76, 0xb9 => 0x4f74,
+    0xba => 0x4f89, 0xbb => 0x4f84, 0xbc => 0x4f77, 0xbd => 0x4f4c,
+    0xbe => 0x4f97, 0xbf => 0x4f6a, 0xc0 => 0x4f9a, 0xc1 => 0x4f79,
+    0xc2 => 0x4f81, 0xc3 => 0x4f78, 0xc4 => 0x4f90, 0xc5 => 0x4f9c,
+    0xc6 => 0x4f94, 0xc7 => 0x4f9e, 0xc8 => 0x4f92, 0xc9 => 0x4f82,
+    0xca => 0x4f95, 0xcb => 0x4f6b, 0xcc => 0x4f6e, 0xcd => 0x519e,
+    0xce => 0x51bc, 0xcf => 0x51be, 0xd0 => 0x5235, 0xd1 => 0x5232,
+    0xd2 => 0x5233, 0xd3 => 0x5246, 0xd4 => 0x5231, 0xd5 => 0x52bc,
+    0xd6 => 0x530a, 0xd7 => 0x530b, 0xd8 => 0x533c, 0xd9 => 0x5392,
+    0xda => 0x5394, 0xdb => 0x5487, 0xdc => 0x547f, 0xdd => 0x5481,
+    0xde => 0x5491, 0xdf => 0x5482, 0xe0 => 0x5488, 0xe1 => 0x546b,
+    0xe2 => 0x547a, 0xe3 => 0x547e, 0xe4 => 0x5465, 0xe5 => 0x546c,
+    0xe6 => 0x5474, 0xe7 => 0x5466, 0xe8 => 0x548d, 0xe9 => 0x546f,
+    0xea => 0x5461, 0xeb => 0x5460, 0xec => 0x5498, 0xed => 0x5463,
+    0xee => 0x5467, 0xef => 0x5464, 0xf0 => 0x56f7, 0xf1 => 0x56f9,
+    0xf2 => 0x576f, 0xf3 => 0x5772, 0xf4 => 0x576d, 0xf5 => 0x576b,
+    0xf6 => 0x5771, 0xf7 => 0x5770, 0xf8 => 0x5776, 0xf9 => 0x5780,
+    0xfa => 0x5775, 0xfb => 0x577b, 0xfc => 0x5773, 0xfd => 0x5774,
+    0xfe => 0x5762,
+  },
+  0xcc => {
+    0x40 => 0x5768, 0x41 => 0x577d, 0x42 => 0x590c, 0x43 => 0x5945,
+    0x44 => 0x59b5, 0x45 => 0x59ba, 0x46 => 0x59cf, 0x47 => 0x59ce,
+    0x48 => 0x59b2, 0x49 => 0x59cc, 0x4a => 0x59c1, 0x4b => 0x59b6,
+    0x4c => 0x59bc, 0x4d => 0x59c3, 0x4e => 0x59d6, 0x4f => 0x59b1,
+    0x50 => 0x59bd, 0x51 => 0x59c0, 0x52 => 0x59c8, 0x53 => 0x59b4,
+    0x54 => 0x59c7, 0x55 => 0x5b62, 0x56 => 0x5b65, 0x57 => 0x5b93,
+    0x58 => 0x5b95, 0x59 => 0x5c44, 0x5a => 0x5c47, 0x5b => 0x5cae,
+    0x5c => 0x5ca4, 0x5d => 0x5ca0, 0x5e => 0x5cb5, 0x5f => 0x5caf,
+    0x60 => 0x5ca8, 0x61 => 0x5cac, 0x62 => 0x5c9f, 0x63 => 0x5ca3,
+    0x64 => 0x5cad, 0x65 => 0x5ca2, 0x66 => 0x5caa, 0x67 => 0x5ca7,
+    0x68 => 0x5c9d, 0x69 => 0x5ca5, 0x6a => 0x5cb6, 0x6b => 0x5cb0,
+    0x6c => 0x5ca6, 0x6d => 0x5e17, 0x6e => 0x5e14, 0x6f => 0x5e19,
+    0x70 => 0x5f28, 0x71 => 0x5f22, 0x72 => 0x5f23, 0x73 => 0x5f24,
+    0x74 => 0x5f54, 0x75 => 0x5f82, 0x76 => 0x5f7e, 0x77 => 0x5f7d,
+    0x78 => 0x5fde, 0x79 => 0x5fe5, 0x7a => 0x602d, 0x7b => 0x6026,
+    0x7c => 0x6019, 0x7d => 0x6032, 0x7e => 0x600b, 0xa1 => 0x6034,
+    0xa2 => 0x600a, 0xa3 => 0x6017, 0xa4 => 0x6033, 0xa5 => 0x601a,
+    0xa6 => 0x601e, 0xa7 => 0x602c, 0xa8 => 0x6022, 0xa9 => 0x600d,
+    0xaa => 0x6010, 0xab => 0x602e, 0xac => 0x6013, 0xad => 0x6011,
+    0xae => 0x600c, 0xaf => 0x6009, 0xb0 => 0x601c, 0xb1 => 0x6214,
+    0xb2 => 0x623d, 0xb3 => 0x62ad, 0xb4 => 0x62b4, 0xb5 => 0x62d1,
+    0xb6 => 0x62be, 0xb7 => 0x62aa, 0xb8 => 0x62b6, 0xb9 => 0x62ca,
+    0xba => 0x62ae, 0xbb => 0x62b3, 0xbc => 0x62af, 0xbd => 0x62bb,
+    0xbe => 0x62a9, 0xbf => 0x62b0, 0xc0 => 0x62b8, 0xc1 => 0x653d,
+    0xc2 => 0x65a8, 0xc3 => 0x65bb, 0xc4 => 0x6609, 0xc5 => 0x65fc,
+    0xc6 => 0x6604, 0xc7 => 0x6612, 0xc8 => 0x6608, 0xc9 => 0x65fb,
+    0xca => 0x6603, 0xcb => 0x660b, 0xcc => 0x660d, 0xcd => 0x6605,
+    0xce => 0x65fd, 0xcf => 0x6611, 0xd0 => 0x6610, 0xd1 => 0x66f6,
+    0xd2 => 0x670a, 0xd3 => 0x6785, 0xd4 => 0x676c, 0xd5 => 0x678e,
+    0xd6 => 0x6792, 0xd7 => 0x6776, 0xd8 => 0x677b, 0xd9 => 0x6798,
+    0xda => 0x6786, 0xdb => 0x6784, 0xdc => 0x6774, 0xdd => 0x678d,
+    0xde => 0x678c, 0xdf => 0x677a, 0xe0 => 0x679f, 0xe1 => 0x6791,
+    0xe2 => 0x6799, 0xe3 => 0x6783, 0xe4 => 0x677d, 0xe5 => 0x6781,
+    0xe6 => 0x6778, 0xe7 => 0x6779, 0xe8 => 0x6794, 0xe9 => 0x6b25,
+    0xea => 0x6b80, 0xeb => 0x6b7e, 0xec => 0x6bde, 0xed => 0x6c1d,
+    0xee => 0x6c93, 0xef => 0x6cec, 0xf0 => 0x6ceb, 0xf1 => 0x6cee,
+    0xf2 => 0x6cd9, 0xf3 => 0x6cb6, 0xf4 => 0x6cd4, 0xf5 => 0x6cad,
+    0xf6 => 0x6ce7, 0xf7 => 0x6cb7, 0xf8 => 0x6cd0, 0xf9 => 0x6cc2,
+    0xfa => 0x6cba, 0xfb => 0x6cc3, 0xfc => 0x6cc6, 0xfd => 0x6ced,
+    0xfe => 0x6cf2,
+  },
+  0xcd => {
+    0x40 => 0x6cd2, 0x41 => 0x6cdd, 0x42 => 0x6cb4, 0x43 => 0x6c8a,
+    0x44 => 0x6c9d, 0x45 => 0x6c80, 0x46 => 0x6cde, 0x47 => 0x6cc0,
+    0x48 => 0x6d30, 0x49 => 0x6ccd, 0x4a => 0x6cc7, 0x4b => 0x6cb0,
+    0x4c => 0x6cf9, 0x4d => 0x6ccf, 0x4e => 0x6ce9, 0x4f => 0x6cd1,
+    0x50 => 0x7094, 0x51 => 0x7098, 0x52 => 0x7085, 0x53 => 0x7093,
+    0x54 => 0x7086, 0x55 => 0x7084, 0x56 => 0x7091, 0x57 => 0x7096,
+    0x58 => 0x7082, 0x59 => 0x709a, 0x5a => 0x7083, 0x5b => 0x726a,
+    0x5c => 0x72d6, 0x5d => 0x72cb, 0x5e => 0x72d8, 0x5f => 0x72c9,
+    0x60 => 0x72dc, 0x61 => 0x72d2, 0x62 => 0x72d4, 0x63 => 0x72da,
+    0x64 => 0x72cc, 0x65 => 0x72d1, 0x66 => 0x73a4, 0x67 => 0x73a1,
+    0x68 => 0x73ad, 0x69 => 0x73a6, 0x6a => 0x73a2, 0x6b => 0x73a0,
+    0x6c => 0x73ac, 0x6d => 0x739d, 0x6e => 0x74dd, 0x6f => 0x74e8,
+    0x70 => 0x753f, 0x71 => 0x7540, 0x72 => 0x753e, 0x73 => 0x758c,
+    0x74 => 0x7598, 0x75 => 0x76af, 0x76 => 0x76f3, 0x77 => 0x76f1,
+    0x78 => 0x76f0, 0x79 => 0x76f5, 0x7a => 0x77f8, 0x7b => 0x77fc,
+    0x7c => 0x77f9, 0x7d => 0x77fb, 0x7e => 0x77fa, 0xa1 => 0x77f7,
+    0xa2 => 0x7942, 0xa3 => 0x793f, 0xa4 => 0x79c5, 0xa5 => 0x7a78,
+    0xa6 => 0x7a7b, 0xa7 => 0x7afb, 0xa8 => 0x7c75, 0xa9 => 0x7cfd,
+    0xaa => 0x8035, 0xab => 0x808f, 0xac => 0x80ae, 0xad => 0x80a3,
+    0xae => 0x80b8, 0xaf => 0x80b5, 0xb0 => 0x80ad, 0xb1 => 0x8220,
+    0xb2 => 0x82a0, 0xb3 => 0x82c0, 0xb4 => 0x82ab, 0xb5 => 0x829a,
+    0xb6 => 0x8298, 0xb7 => 0x829b, 0xb8 => 0x82b5, 0xb9 => 0x82a7,
+    0xba => 0x82ae, 0xbb => 0x82bc, 0xbc => 0x829e, 0xbd => 0x82ba,
+    0xbe => 0x82b4, 0xbf => 0x82a8, 0xc0 => 0x82a1, 0xc1 => 0x82a9,
+    0xc2 => 0x82c2, 0xc3 => 0x82a4, 0xc4 => 0x82c3, 0xc5 => 0x82b6,
+    0xc6 => 0x82a2, 0xc7 => 0x8670, 0xc8 => 0x866f, 0xc9 => 0x866d,
+    0xca => 0x866e, 0xcb => 0x8c56, 0xcc => 0x8fd2, 0xcd => 0x8fcb,
+    0xce => 0x8fd3, 0xcf => 0x8fcd, 0xd0 => 0x8fd6, 0xd1 => 0x8fd5,
+    0xd2 => 0x8fd7, 0xd3 => 0x90b2, 0xd4 => 0x90b4, 0xd5 => 0x90af,
+    0xd6 => 0x90b3, 0xd7 => 0x90b0, 0xd8 => 0x9639, 0xd9 => 0x963d,
+    0xda => 0x963c, 0xdb => 0x963a, 0xdc => 0x9643, 0xdd => 0x4fcd,
+    0xde => 0x4fc5, 0xdf => 0x4fd3, 0xe0 => 0x4fb2, 0xe1 => 0x4fc9,
+    0xe2 => 0x4fcb, 0xe3 => 0x4fc1, 0xe4 => 0x4fd4, 0xe5 => 0x4fdc,
+    0xe6 => 0x4fd9, 0xe7 => 0x4fbb, 0xe8 => 0x4fb3, 0xe9 => 0x4fdb,
+    0xea => 0x4fc7, 0xeb => 0x4fd6, 0xec => 0x4fba, 0xed => 0x4fc0,
+    0xee => 0x4fb9, 0xef => 0x4fec, 0xf0 => 0x5244, 0xf1 => 0x5249,
+    0xf2 => 0x52c0, 0xf3 => 0x52c2, 0xf4 => 0x533d, 0xf5 => 0x537c,
+    0xf6 => 0x5397, 0xf7 => 0x5396, 0xf8 => 0x5399, 0xf9 => 0x5398,
+    0xfa => 0x54ba, 0xfb => 0x54a1, 0xfc => 0x54ad, 0xfd => 0x54a5,
+    0xfe => 0x54cf,
+  },
+  0xce => {
+    0x40 => 0x54c3, 0x41 => 0x830d, 0x42 => 0x54b7, 0x43 => 0x54ae,
+    0x44 => 0x54d6, 0x45 => 0x54b6, 0x46 => 0x54c5, 0x47 => 0x54c6,
+    0x48 => 0x54a0, 0x49 => 0x5470, 0x4a => 0x54bc, 0x4b => 0x54a2,
+    0x4c => 0x54be, 0x4d => 0x5472, 0x4e => 0x54de, 0x4f => 0x54b0,
+    0x50 => 0x57b5, 0x51 => 0x579e, 0x52 => 0x579f, 0x53 => 0x57a4,
+    0x54 => 0x578c, 0x55 => 0x5797, 0x56 => 0x579d, 0x57 => 0x579b,
+    0x58 => 0x5794, 0x59 => 0x5798, 0x5a => 0x578f, 0x5b => 0x5799,
+    0x5c => 0x57a5, 0x5d => 0x579a, 0x5e => 0x5795, 0x5f => 0x58f4,
+    0x60 => 0x590d, 0x61 => 0x5953, 0x62 => 0x59e1, 0x63 => 0x59de,
+    0x64 => 0x59ee, 0x65 => 0x5a00, 0x66 => 0x59f1, 0x67 => 0x59dd,
+    0x68 => 0x59fa, 0x69 => 0x59fd, 0x6a => 0x59fc, 0x6b => 0x59f6,
+    0x6c => 0x59e4, 0x6d => 0x59f2, 0x6e => 0x59f7, 0x6f => 0x59db,
+    0x70 => 0x59e9, 0x71 => 0x59f3, 0x72 => 0x59f5, 0x73 => 0x59e0,
+    0x74 => 0x59fe, 0x75 => 0x59f4, 0x76 => 0x59ed, 0x77 => 0x5ba8,
+    0x78 => 0x5c4c, 0x79 => 0x5cd0, 0x7a => 0x5cd8, 0x7b => 0x5ccc,
+    0x7c => 0x5cd7, 0x7d => 0x5ccb, 0x7e => 0x5cdb, 0xa1 => 0x5cde,
+    0xa2 => 0x5cda, 0xa3 => 0x5cc9, 0xa4 => 0x5cc7, 0xa5 => 0x5cca,
+    0xa6 => 0x5cd6, 0xa7 => 0x5cd3, 0xa8 => 0x5cd4, 0xa9 => 0x5ccf,
+    0xaa => 0x5cc8, 0xab => 0x5cc6, 0xac => 0x5cce, 0xad => 0x5cdf,
+    0xae => 0x5cf8, 0xaf => 0x5df9, 0xb0 => 0x5e21, 0xb1 => 0x5e22,
+    0xb2 => 0x5e23, 0xb3 => 0x5e20, 0xb4 => 0x5e24, 0xb5 => 0x5eb0,
+    0xb6 => 0x5ea4, 0xb7 => 0x5ea2, 0xb8 => 0x5e9b, 0xb9 => 0x5ea3,
+    0xba => 0x5ea5, 0xbb => 0x5f07, 0xbc => 0x5f2e, 0xbd => 0x5f56,
+    0xbe => 0x5f86, 0xbf => 0x6037, 0xc0 => 0x6039, 0xc1 => 0x6054,
+    0xc2 => 0x6072, 0xc3 => 0x605e, 0xc4 => 0x6045, 0xc5 => 0x6053,
+    0xc6 => 0x6047, 0xc7 => 0x6049, 0xc8 => 0x605b, 0xc9 => 0x604c,
+    0xca => 0x6040, 0xcb => 0x6042, 0xcc => 0x605f, 0xcd => 0x6024,
+    0xce => 0x6044, 0xcf => 0x6058, 0xd0 => 0x6066, 0xd1 => 0x606e,
+    0xd2 => 0x6242, 0xd3 => 0x6243, 0xd4 => 0x62cf, 0xd5 => 0x630d,
+    0xd6 => 0x630b, 0xd7 => 0x62f5, 0xd8 => 0x630e, 0xd9 => 0x6303,
+    0xda => 0x62eb, 0xdb => 0x62f9, 0xdc => 0x630f, 0xdd => 0x630c,
+    0xde => 0x62f8, 0xdf => 0x62f6, 0xe0 => 0x6300, 0xe1 => 0x6313,
+    0xe2 => 0x6314, 0xe3 => 0x62fa, 0xe4 => 0x6315, 0xe5 => 0x62fb,
+    0xe6 => 0x62f0, 0xe7 => 0x6541, 0xe8 => 0x6543, 0xe9 => 0x65aa,
+    0xea => 0x65bf, 0xeb => 0x6636, 0xec => 0x6621, 0xed => 0x6632,
+    0xee => 0x6635, 0xef => 0x661c, 0xf0 => 0x6626, 0xf1 => 0x6622,
+    0xf2 => 0x6633, 0xf3 => 0x662b, 0xf4 => 0x663a, 0xf5 => 0x661d,
+    0xf6 => 0x6634, 0xf7 => 0x6639, 0xf8 => 0x662e, 0xf9 => 0x670f,
+    0xfa => 0x6710, 0xfb => 0x67c1, 0xfc => 0x67f2, 0xfd => 0x67c8,
+    0xfe => 0x67ba,
+  },
+  0xcf => {
+    0x40 => 0x67dc, 0x41 => 0x67bb, 0x42 => 0x67f8, 0x43 => 0x67d8,
+    0x44 => 0x67c0, 0x45 => 0x67b7, 0x46 => 0x67c5, 0x47 => 0x67eb,
+    0x48 => 0x67e4, 0x49 => 0x67df, 0x4a => 0x67b5, 0x4b => 0x67cd,
+    0x4c => 0x67b3, 0x4d => 0x67f7, 0x4e => 0x67f6, 0x4f => 0x67ee,
+    0x50 => 0x67e3, 0x51 => 0x67c2, 0x52 => 0x67b9, 0x53 => 0x67ce,
+    0x54 => 0x67e7, 0x55 => 0x67f0, 0x56 => 0x67b2, 0x57 => 0x67fc,
+    0x58 => 0x67c6, 0x59 => 0x67ed, 0x5a => 0x67cc, 0x5b => 0x67ae,
+    0x5c => 0x67e6, 0x5d => 0x67db, 0x5e => 0x67fa, 0x5f => 0x67c9,
+    0x60 => 0x67ca, 0x61 => 0x67c3, 0x62 => 0x67ea, 0x63 => 0x67cb,
+    0x64 => 0x6b28, 0x65 => 0x6b82, 0x66 => 0x6b84, 0x67 => 0x6bb6,
+    0x68 => 0x6bd6, 0x69 => 0x6bd8, 0x6a => 0x6be0, 0x6b => 0x6c20,
+    0x6c => 0x6c21, 0x6d => 0x6d28, 0x6e => 0x6d34, 0x6f => 0x6d2d,
+    0x70 => 0x6d1f, 0x71 => 0x6d3c, 0x72 => 0x6d3f, 0x73 => 0x6d12,
+    0x74 => 0x6d0a, 0x75 => 0x6cda, 0x76 => 0x6d33, 0x77 => 0x6d04,
+    0x78 => 0x6d19, 0x79 => 0x6d3a, 0x7a => 0x6d1a, 0x7b => 0x6d11,
+    0x7c => 0x6d00, 0x7d => 0x6d1d, 0x7e => 0x6d42, 0xa1 => 0x6d01,
+    0xa2 => 0x6d18, 0xa3 => 0x6d37, 0xa4 => 0x6d03, 0xa5 => 0x6d0f,
+    0xa6 => 0x6d40, 0xa7 => 0x6d07, 0xa8 => 0x6d20, 0xa9 => 0x6d2c,
+    0xaa => 0x6d08, 0xab => 0x6d22, 0xac => 0x6d09, 0xad => 0x6d10,
+    0xae => 0x70b7, 0xaf => 0x709f, 0xb0 => 0x70be, 0xb1 => 0x70b1,
+    0xb2 => 0x70b0, 0xb3 => 0x70a1, 0xb4 => 0x70b4, 0xb5 => 0x70b5,
+    0xb6 => 0x70a9, 0xb7 => 0x7241, 0xb8 => 0x7249, 0xb9 => 0x724a,
+    0xba => 0x726c, 0xbb => 0x7270, 0xbc => 0x7273, 0xbd => 0x726e,
+    0xbe => 0x72ca, 0xbf => 0x72e4, 0xc0 => 0x72e8, 0xc1 => 0x72eb,
+    0xc2 => 0x72df, 0xc3 => 0x72ea, 0xc4 => 0x72e6, 0xc5 => 0x72e3,
+    0xc6 => 0x7385, 0xc7 => 0x73cc, 0xc8 => 0x73c2, 0xc9 => 0x73c8,
+    0xca => 0x73c5, 0xcb => 0x73b9, 0xcc => 0x73b6, 0xcd => 0x73b5,
+    0xce => 0x73b4, 0xcf => 0x73eb, 0xd0 => 0x73bf, 0xd1 => 0x73c7,
+    0xd2 => 0x73be, 0xd3 => 0x73c3, 0xd4 => 0x73c6, 0xd5 => 0x73b8,
+    0xd6 => 0x73cb, 0xd7 => 0x74ec, 0xd8 => 0x74ee, 0xd9 => 0x752e,
+    0xda => 0x7547, 0xdb => 0x7548, 0xdc => 0x75a7, 0xdd => 0x75aa,
+    0xde => 0x7679, 0xdf => 0x76c4, 0xe0 => 0x7708, 0xe1 => 0x7703,
+    0xe2 => 0x7704, 0xe3 => 0x7705, 0xe4 => 0x770a, 0xe5 => 0x76f7,
+    0xe6 => 0x76fb, 0xe7 => 0x76fa, 0xe8 => 0x77e7, 0xe9 => 0x77e8,
+    0xea => 0x7806, 0xeb => 0x7811, 0xec => 0x7812, 0xed => 0x7805,
+    0xee => 0x7810, 0xef => 0x780f, 0xf0 => 0x780e, 0xf1 => 0x7809,
+    0xf2 => 0x7803, 0xf3 => 0x7813, 0xf4 => 0x794a, 0xf5 => 0x794c,
+    0xf6 => 0x794b, 0xf7 => 0x7945, 0xf8 => 0x7944, 0xf9 => 0x79d5,
+    0xfa => 0x79cd, 0xfb => 0x79cf, 0xfc => 0x79d6, 0xfd => 0x79ce,
+    0xfe => 0x7a80,
+  },
+  0xd0 => {
+    0x40 => 0x7a7e, 0x41 => 0x7ad1, 0x42 => 0x7b00, 0x43 => 0x7b01,
+    0x44 => 0x7c7a, 0x45 => 0x7c78, 0x46 => 0x7c79, 0x47 => 0x7c7f,
+    0x48 => 0x7c80, 0x49 => 0x7c81, 0x4a => 0x7d03, 0x4b => 0x7d08,
+    0x4c => 0x7d01, 0x4d => 0x7f58, 0x4e => 0x7f91, 0x4f => 0x7f8d,
+    0x50 => 0x7fbe, 0x51 => 0x8007, 0x52 => 0x800e, 0x53 => 0x800f,
+    0x54 => 0x8014, 0x55 => 0x8037, 0x56 => 0x80d8, 0x57 => 0x80c7,
+    0x58 => 0x80e0, 0x59 => 0x80d1, 0x5a => 0x80c8, 0x5b => 0x80c2,
+    0x5c => 0x80d0, 0x5d => 0x80c5, 0x5e => 0x80e3, 0x5f => 0x80d9,
+    0x60 => 0x80dc, 0x61 => 0x80ca, 0x62 => 0x80d5, 0x63 => 0x80c9,
+    0x64 => 0x80cf, 0x65 => 0x80d7, 0x66 => 0x80e6, 0x67 => 0x80cd,
+    0x68 => 0x81ff, 0x69 => 0x8221, 0x6a => 0x8294, 0x6b => 0x82d9,
+    0x6c => 0x82fe, 0x6d => 0x82f9, 0x6e => 0x8307, 0x6f => 0x82e8,
+    0x70 => 0x8300, 0x71 => 0x82d5, 0x72 => 0x833a, 0x73 => 0x82eb,
+    0x74 => 0x82d6, 0x75 => 0x82f4, 0x76 => 0x82ec, 0x77 => 0x82e1,
+    0x78 => 0x82f2, 0x79 => 0x82f5, 0x7a => 0x830c, 0x7b => 0x82fb,
+    0x7c => 0x82f6, 0x7d => 0x82f0, 0x7e => 0x82ea, 0xa1 => 0x82e4,
+    0xa2 => 0x82e0, 0xa3 => 0x82fa, 0xa4 => 0x82f3, 0xa5 => 0x82ed,
+    0xa6 => 0x8677, 0xa7 => 0x8674, 0xa8 => 0x867c, 0xa9 => 0x8673,
+    0xaa => 0x8841, 0xab => 0x884e, 0xac => 0x8867, 0xad => 0x886a,
+    0xae => 0x8869, 0xaf => 0x89d3, 0xb0 => 0x8a04, 0xb1 => 0x8a07,
+    0xb2 => 0x8d72, 0xb3 => 0x8fe3, 0xb4 => 0x8fe1, 0xb5 => 0x8fee,
+    0xb6 => 0x8fe0, 0xb7 => 0x90f1, 0xb8 => 0x90bd, 0xb9 => 0x90bf,
+    0xba => 0x90d5, 0xbb => 0x90c5, 0xbc => 0x90be, 0xbd => 0x90c7,
+    0xbe => 0x90cb, 0xbf => 0x90c8, 0xc0 => 0x91d4, 0xc1 => 0x91d3,
+    0xc2 => 0x9654, 0xc3 => 0x964f, 0xc4 => 0x9651, 0xc5 => 0x9653,
+    0xc6 => 0x964a, 0xc7 => 0x964e, 0xc8 => 0x501e, 0xc9 => 0x5005,
+    0xca => 0x5007, 0xcb => 0x5013, 0xcc => 0x5022, 0xcd => 0x5030,
+    0xce => 0x501b, 0xcf => 0x4ff5, 0xd0 => 0x4ff4, 0xd1 => 0x5033,
+    0xd2 => 0x5037, 0xd3 => 0x502c, 0xd4 => 0x4ff6, 0xd5 => 0x4ff7,
+    0xd6 => 0x5017, 0xd7 => 0x501c, 0xd8 => 0x5020, 0xd9 => 0x5027,
+    0xda => 0x5035, 0xdb => 0x502f, 0xdc => 0x5031, 0xdd => 0x500e,
+    0xde => 0x515a, 0xdf => 0x5194, 0xe0 => 0x5193, 0xe1 => 0x51ca,
+    0xe2 => 0x51c4, 0xe3 => 0x51c5, 0xe4 => 0x51c8, 0xe5 => 0x51ce,
+    0xe6 => 0x5261, 0xe7 => 0x525a, 0xe8 => 0x5252, 0xe9 => 0x525e,
+    0xea => 0x525f, 0xeb => 0x5255, 0xec => 0x5262, 0xed => 0x52cd,
+    0xee => 0x530e, 0xef => 0x539e, 0xf0 => 0x5526, 0xf1 => 0x54e2,
+    0xf2 => 0x5517, 0xf3 => 0x5512, 0xf4 => 0x54e7, 0xf5 => 0x54f3,
+    0xf6 => 0x54e4, 0xf7 => 0x551a, 0xf8 => 0x54ff, 0xf9 => 0x5504,
+    0xfa => 0x5508, 0xfb => 0x54eb, 0xfc => 0x5511, 0xfd => 0x5505,
+    0xfe => 0x54f1,
+  },
+  0xd1 => {
+    0x40 => 0x550a, 0x41 => 0x54fb, 0x42 => 0x54f7, 0x43 => 0x54f8,
+    0x44 => 0x54e0, 0x45 => 0x550e, 0x46 => 0x5503, 0x47 => 0x550b,
+    0x48 => 0x5701, 0x49 => 0x5702, 0x4a => 0x57cc, 0x4b => 0x5832,
+    0x4c => 0x57d5, 0x4d => 0x57d2, 0x4e => 0x57ba, 0x4f => 0x57c6,
+    0x50 => 0x57bd, 0x51 => 0x57bc, 0x52 => 0x57b8, 0x53 => 0x57b6,
+    0x54 => 0x57bf, 0x55 => 0x57c7, 0x56 => 0x57d0, 0x57 => 0x57b9,
+    0x58 => 0x57c1, 0x59 => 0x590e, 0x5a => 0x594a, 0x5b => 0x5a19,
+    0x5c => 0x5a16, 0x5d => 0x5a2d, 0x5e => 0x5a2e, 0x5f => 0x5a15,
+    0x60 => 0x5a0f, 0x61 => 0x5a17, 0x62 => 0x5a0a, 0x63 => 0x5a1e,
+    0x64 => 0x5a33, 0x65 => 0x5b6c, 0x66 => 0x5ba7, 0x67 => 0x5bad,
+    0x68 => 0x5bac, 0x69 => 0x5c03, 0x6a => 0x5c56, 0x6b => 0x5c54,
+    0x6c => 0x5cec, 0x6d => 0x5cff, 0x6e => 0x5cee, 0x6f => 0x5cf1,
+    0x70 => 0x5cf7, 0x71 => 0x5d00, 0x72 => 0x5cf9, 0x73 => 0x5e29,
+    0x74 => 0x5e28, 0x75 => 0x5ea8, 0x76 => 0x5eae, 0x77 => 0x5eaa,
+    0x78 => 0x5eac, 0x79 => 0x5f33, 0x7a => 0x5f30, 0x7b => 0x5f67,
+    0x7c => 0x605d, 0x7d => 0x605a, 0x7e => 0x6067, 0xa1 => 0x6041,
+    0xa2 => 0x60a2, 0xa3 => 0x6088, 0xa4 => 0x6080, 0xa5 => 0x6092,
+    0xa6 => 0x6081, 0xa7 => 0x609d, 0xa8 => 0x6083, 0xa9 => 0x6095,
+    0xaa => 0x609b, 0xab => 0x6097, 0xac => 0x6087, 0xad => 0x609c,
+    0xae => 0x608e, 0xaf => 0x6219, 0xb0 => 0x6246, 0xb1 => 0x62f2,
+    0xb2 => 0x6310, 0xb3 => 0x6356, 0xb4 => 0x632c, 0xb5 => 0x6344,
+    0xb6 => 0x6345, 0xb7 => 0x6336, 0xb8 => 0x6343, 0xb9 => 0x63e4,
+    0xba => 0x6339, 0xbb => 0x634b, 0xbc => 0x634a, 0xbd => 0x633c,
+    0xbe => 0x6329, 0xbf => 0x6341, 0xc0 => 0x6334, 0xc1 => 0x6358,
+    0xc2 => 0x6354, 0xc3 => 0x6359, 0xc4 => 0x632d, 0xc5 => 0x6347,
+    0xc6 => 0x6333, 0xc7 => 0x635a, 0xc8 => 0x6351, 0xc9 => 0x6338,
+    0xca => 0x6357, 0xcb => 0x6340, 0xcc => 0x6348, 0xcd => 0x654a,
+    0xce => 0x6546, 0xcf => 0x65c6, 0xd0 => 0x65c3, 0xd1 => 0x65c4,
+    0xd2 => 0x65c2, 0xd3 => 0x664a, 0xd4 => 0x665f, 0xd5 => 0x6647,
+    0xd6 => 0x6651, 0xd7 => 0x6712, 0xd8 => 0x6713, 0xd9 => 0x681f,
+    0xda => 0x681a, 0xdb => 0x6849, 0xdc => 0x6832, 0xdd => 0x6833,
+    0xde => 0x683b, 0xdf => 0x684b, 0xe0 => 0x684f, 0xe1 => 0x6816,
+    0xe2 => 0x6831, 0xe3 => 0x681c, 0xe4 => 0x6835, 0xe5 => 0x682b,
+    0xe6 => 0x682d, 0xe7 => 0x682f, 0xe8 => 0x684e, 0xe9 => 0x6844,
+    0xea => 0x6834, 0xeb => 0x681d, 0xec => 0x6812, 0xed => 0x6814,
+    0xee => 0x6826, 0xef => 0x6828, 0xf0 => 0x682e, 0xf1 => 0x684d,
+    0xf2 => 0x683a, 0xf3 => 0x6825, 0xf4 => 0x6820, 0xf5 => 0x6b2c,
+    0xf6 => 0x6b2f, 0xf7 => 0x6b2d, 0xf8 => 0x6b31, 0xf9 => 0x6b34,
+    0xfa => 0x6b6d, 0xfb => 0x8082, 0xfc => 0x6b88, 0xfd => 0x6be6,
+    0xfe => 0x6be4,
+  },
+  0xd2 => {
+    0x40 => 0x6be8, 0x41 => 0x6be3, 0x42 => 0x6be2, 0x43 => 0x6be7,
+    0x44 => 0x6c25, 0x45 => 0x6d7a, 0x46 => 0x6d63, 0x47 => 0x6d64,
+    0x48 => 0x6d76, 0x49 => 0x6d0d, 0x4a => 0x6d61, 0x4b => 0x6d92,
+    0x4c => 0x6d58, 0x4d => 0x6d62, 0x4e => 0x6d6d, 0x4f => 0x6d6f,
+    0x50 => 0x6d91, 0x51 => 0x6d8d, 0x52 => 0x6def, 0x53 => 0x6d7f,
+    0x54 => 0x6d86, 0x55 => 0x6d5e, 0x56 => 0x6d67, 0x57 => 0x6d60,
+    0x58 => 0x6d97, 0x59 => 0x6d70, 0x5a => 0x6d7c, 0x5b => 0x6d5f,
+    0x5c => 0x6d82, 0x5d => 0x6d98, 0x5e => 0x6d2f, 0x5f => 0x6d68,
+    0x60 => 0x6d8b, 0x61 => 0x6d7e, 0x62 => 0x6d80, 0x63 => 0x6d84,
+    0x64 => 0x6d16, 0x65 => 0x6d83, 0x66 => 0x6d7b, 0x67 => 0x6d7d,
+    0x68 => 0x6d75, 0x69 => 0x6d90, 0x6a => 0x70dc, 0x6b => 0x70d3,
+    0x6c => 0x70d1, 0x6d => 0x70dd, 0x6e => 0x70cb, 0x6f => 0x7f39,
+    0x70 => 0x70e2, 0x71 => 0x70d7, 0x72 => 0x70d2, 0x73 => 0x70de,
+    0x74 => 0x70e0, 0x75 => 0x70d4, 0x76 => 0x70cd, 0x77 => 0x70c5,
+    0x78 => 0x70c6, 0x79 => 0x70c7, 0x7a => 0x70da, 0x7b => 0x70ce,
+    0x7c => 0x70e1, 0x7d => 0x7242, 0x7e => 0x7278, 0xa1 => 0x7277,
+    0xa2 => 0x7276, 0xa3 => 0x7300, 0xa4 => 0x72fa, 0xa5 => 0x72f4,
+    0xa6 => 0x72fe, 0xa7 => 0x72f6, 0xa8 => 0x72f3, 0xa9 => 0x72fb,
+    0xaa => 0x7301, 0xab => 0x73d3, 0xac => 0x73d9, 0xad => 0x73e5,
+    0xae => 0x73d6, 0xaf => 0x73bc, 0xb0 => 0x73e7, 0xb1 => 0x73e3,
+    0xb2 => 0x73e9, 0xb3 => 0x73dc, 0xb4 => 0x73d2, 0xb5 => 0x73db,
+    0xb6 => 0x73d4, 0xb7 => 0x73dd, 0xb8 => 0x73da, 0xb9 => 0x73d7,
+    0xba => 0x73d8, 0xbb => 0x73e8, 0xbc => 0x74de, 0xbd => 0x74df,
+    0xbe => 0x74f4, 0xbf => 0x74f5, 0xc0 => 0x7521, 0xc1 => 0x755b,
+    0xc2 => 0x755f, 0xc3 => 0x75b0, 0xc4 => 0x75c1, 0xc5 => 0x75bb,
+    0xc6 => 0x75c4, 0xc7 => 0x75c0, 0xc8 => 0x75bf, 0xc9 => 0x75b6,
+    0xca => 0x75ba, 0xcb => 0x768a, 0xcc => 0x76c9, 0xcd => 0x771d,
+    0xce => 0x771b, 0xcf => 0x7710, 0xd0 => 0x7713, 0xd1 => 0x7712,
+    0xd2 => 0x7723, 0xd3 => 0x7711, 0xd4 => 0x7715, 0xd5 => 0x7719,
+    0xd6 => 0x771a, 0xd7 => 0x7722, 0xd8 => 0x7727, 0xd9 => 0x7823,
+    0xda => 0x782c, 0xdb => 0x7822, 0xdc => 0x7835, 0xdd => 0x782f,
+    0xde => 0x7828, 0xdf => 0x782e, 0xe0 => 0x782b, 0xe1 => 0x7821,
+    0xe2 => 0x7829, 0xe3 => 0x7833, 0xe4 => 0x782a, 0xe5 => 0x7831,
+    0xe6 => 0x7954, 0xe7 => 0x795b, 0xe8 => 0x794f, 0xe9 => 0x795c,
+    0xea => 0x7953, 0xeb => 0x7952, 0xec => 0x7951, 0xed => 0x79eb,
+    0xee => 0x79ec, 0xef => 0x79e0, 0xf0 => 0x79ee, 0xf1 => 0x79ed,
+    0xf2 => 0x79ea, 0xf3 => 0x79dc, 0xf4 => 0x79de, 0xf5 => 0x79dd,
+    0xf6 => 0x7a86, 0xf7 => 0x7a89, 0xf8 => 0x7a85, 0xf9 => 0x7a8b,
+    0xfa => 0x7a8c, 0xfb => 0x7a8a, 0xfc => 0x7a87, 0xfd => 0x7ad8,
+    0xfe => 0x7b10,
+  },
+  0xd3 => {
+    0x40 => 0x7b04, 0x41 => 0x7b13, 0x42 => 0x7b05, 0x43 => 0x7b0f,
+    0x44 => 0x7b08, 0x45 => 0x7b0a, 0x46 => 0x7b0e, 0x47 => 0x7b09,
+    0x48 => 0x7b12, 0x49 => 0x7c84, 0x4a => 0x7c91, 0x4b => 0x7c8a,
+    0x4c => 0x7c8c, 0x4d => 0x7c88, 0x4e => 0x7c8d, 0x4f => 0x7c85,
+    0x50 => 0x7d1e, 0x51 => 0x7d1d, 0x52 => 0x7d11, 0x53 => 0x7d0e,
+    0x54 => 0x7d18, 0x55 => 0x7d16, 0x56 => 0x7d13, 0x57 => 0x7d1f,
+    0x58 => 0x7d12, 0x59 => 0x7d0f, 0x5a => 0x7d0c, 0x5b => 0x7f5c,
+    0x5c => 0x7f61, 0x5d => 0x7f5e, 0x5e => 0x7f60, 0x5f => 0x7f5d,
+    0x60 => 0x7f5b, 0x61 => 0x7f96, 0x62 => 0x7f92, 0x63 => 0x7fc3,
+    0x64 => 0x7fc2, 0x65 => 0x7fc0, 0x66 => 0x8016, 0x67 => 0x803e,
+    0x68 => 0x8039, 0x69 => 0x80fa, 0x6a => 0x80f2, 0x6b => 0x80f9,
+    0x6c => 0x80f5, 0x6d => 0x8101, 0x6e => 0x80fb, 0x6f => 0x8100,
+    0x70 => 0x8201, 0x71 => 0x822f, 0x72 => 0x8225, 0x73 => 0x8333,
+    0x74 => 0x832d, 0x75 => 0x8344, 0x76 => 0x8319, 0x77 => 0x8351,
+    0x78 => 0x8325, 0x79 => 0x8356, 0x7a => 0x833f, 0x7b => 0x8341,
+    0x7c => 0x8326, 0x7d => 0x831c, 0x7e => 0x8322, 0xa1 => 0x8342,
+    0xa2 => 0x834e, 0xa3 => 0x831b, 0xa4 => 0x832a, 0xa5 => 0x8308,
+    0xa6 => 0x833c, 0xa7 => 0x834d, 0xa8 => 0x8316, 0xa9 => 0x8324,
+    0xaa => 0x8320, 0xab => 0x8337, 0xac => 0x832f, 0xad => 0x8329,
+    0xae => 0x8347, 0xaf => 0x8345, 0xb0 => 0x834c, 0xb1 => 0x8353,
+    0xb2 => 0x831e, 0xb3 => 0x832c, 0xb4 => 0x834b, 0xb5 => 0x8327,
+    0xb6 => 0x8348, 0xb7 => 0x8653, 0xb8 => 0x8652, 0xb9 => 0x86a2,
+    0xba => 0x86a8, 0xbb => 0x8696, 0xbc => 0x868d, 0xbd => 0x8691,
+    0xbe => 0x869e, 0xbf => 0x8687, 0xc0 => 0x8697, 0xc1 => 0x8686,
+    0xc2 => 0x868b, 0xc3 => 0x869a, 0xc4 => 0x8685, 0xc5 => 0x86a5,
+    0xc6 => 0x8699, 0xc7 => 0x86a1, 0xc8 => 0x86a7, 0xc9 => 0x8695,
+    0xca => 0x8698, 0xcb => 0x868e, 0xcc => 0x869d, 0xcd => 0x8690,
+    0xce => 0x8694, 0xcf => 0x8843, 0xd0 => 0x8844, 0xd1 => 0x886d,
+    0xd2 => 0x8875, 0xd3 => 0x8876, 0xd4 => 0x8872, 0xd5 => 0x8880,
+    0xd6 => 0x8871, 0xd7 => 0x887f, 0xd8 => 0x886f, 0xd9 => 0x8883,
+    0xda => 0x887e, 0xdb => 0x8874, 0xdc => 0x887c, 0xdd => 0x8a12,
+    0xde => 0x8c47, 0xdf => 0x8c57, 0xe0 => 0x8c7b, 0xe1 => 0x8ca4,
+    0xe2 => 0x8ca3, 0xe3 => 0x8d76, 0xe4 => 0x8d78, 0xe5 => 0x8db5,
+    0xe6 => 0x8db7, 0xe7 => 0x8db6, 0xe8 => 0x8ed1, 0xe9 => 0x8ed3,
+    0xea => 0x8ffe, 0xeb => 0x8ff5, 0xec => 0x9002, 0xed => 0x8fff,
+    0xee => 0x8ffb, 0xef => 0x9004, 0xf0 => 0x8ffc, 0xf1 => 0x8ff6,
+    0xf2 => 0x90d6, 0xf3 => 0x90e0, 0xf4 => 0x90d9, 0xf5 => 0x90da,
+    0xf6 => 0x90e3, 0xf7 => 0x90df, 0xf8 => 0x90e5, 0xf9 => 0x90d8,
+    0xfa => 0x90db, 0xfb => 0x90d7, 0xfc => 0x90dc, 0xfd => 0x90e4,
+    0xfe => 0x9150,
+  },
+  0xd4 => {
+    0x40 => 0x914e, 0x41 => 0x914f, 0x42 => 0x91d5, 0x43 => 0x91e2,
+    0x44 => 0x91da, 0x45 => 0x965c, 0x46 => 0x965f, 0x47 => 0x96bc,
+    0x48 => 0x98e3, 0x49 => 0x9adf, 0x4a => 0x9b2f, 0x4b => 0x4e7f,
+    0x4c => 0x5070, 0x4d => 0x506a, 0x4e => 0x5061, 0x4f => 0x505e,
+    0x50 => 0x5060, 0x51 => 0x5053, 0x52 => 0x504b, 0x53 => 0x505d,
+    0x54 => 0x5072, 0x55 => 0x5048, 0x56 => 0x504d, 0x57 => 0x5041,
+    0x58 => 0x505b, 0x59 => 0x504a, 0x5a => 0x5062, 0x5b => 0x5015,
+    0x5c => 0x5045, 0x5d => 0x505f, 0x5e => 0x5069, 0x5f => 0x506b,
+    0x60 => 0x5063, 0x61 => 0x5064, 0x62 => 0x5046, 0x63 => 0x5040,
+    0x64 => 0x506e, 0x65 => 0x5073, 0x66 => 0x5057, 0x67 => 0x5051,
+    0x68 => 0x51d0, 0x69 => 0x526b, 0x6a => 0x526d, 0x6b => 0x526c,
+    0x6c => 0x526e, 0x6d => 0x52d6, 0x6e => 0x52d3, 0x6f => 0x532d,
+    0x70 => 0x539c, 0x71 => 0x5575, 0x72 => 0x5576, 0x73 => 0x553c,
+    0x74 => 0x554d, 0x75 => 0x5550, 0x76 => 0x5534, 0x77 => 0x552a,
+    0x78 => 0x5551, 0x79 => 0x5562, 0x7a => 0x5536, 0x7b => 0x5535,
+    0x7c => 0x5530, 0x7d => 0x5552, 0x7e => 0x5545, 0xa1 => 0x550c,
+    0xa2 => 0x5532, 0xa3 => 0x5565, 0xa4 => 0x554e, 0xa5 => 0x5539,
+    0xa6 => 0x5548, 0xa7 => 0x552d, 0xa8 => 0x553b, 0xa9 => 0x5540,
+    0xaa => 0x554b, 0xab => 0x570a, 0xac => 0x5707, 0xad => 0x57fb,
+    0xae => 0x5814, 0xaf => 0x57e2, 0xb0 => 0x57f6, 0xb1 => 0x57dc,
+    0xb2 => 0x57f4, 0xb3 => 0x5800, 0xb4 => 0x57ed, 0xb5 => 0x57fd,
+    0xb6 => 0x5808, 0xb7 => 0x57f8, 0xb8 => 0x580b, 0xb9 => 0x57f3,
+    0xba => 0x57cf, 0xbb => 0x5807, 0xbc => 0x57ee, 0xbd => 0x57e3,
+    0xbe => 0x57f2, 0xbf => 0x57e5, 0xc0 => 0x57ec, 0xc1 => 0x57e1,
+    0xc2 => 0x580e, 0xc3 => 0x57fc, 0xc4 => 0x5810, 0xc5 => 0x57e7,
+    0xc6 => 0x5801, 0xc7 => 0x580c, 0xc8 => 0x57f1, 0xc9 => 0x57e9,
+    0xca => 0x57f0, 0xcb => 0x580d, 0xcc => 0x5804, 0xcd => 0x595c,
+    0xce => 0x5a60, 0xcf => 0x5a58, 0xd0 => 0x5a55, 0xd1 => 0x5a67,
+    0xd2 => 0x5a5e, 0xd3 => 0x5a38, 0xd4 => 0x5a35, 0xd5 => 0x5a6d,
+    0xd6 => 0x5a50, 0xd7 => 0x5a5f, 0xd8 => 0x5a65, 0xd9 => 0x5a6c,
+    0xda => 0x5a53, 0xdb => 0x5a64, 0xdc => 0x5a57, 0xdd => 0x5a43,
+    0xde => 0x5a5d, 0xdf => 0x5a52, 0xe0 => 0x5a44, 0xe1 => 0x5a5b,
+    0xe2 => 0x5a48, 0xe3 => 0x5a8e, 0xe4 => 0x5a3e, 0xe5 => 0x5a4d,
+    0xe6 => 0x5a39, 0xe7 => 0x5a4c, 0xe8 => 0x5a70, 0xe9 => 0x5a69,
+    0xea => 0x5a47, 0xeb => 0x5a51, 0xec => 0x5a56, 0xed => 0x5a42,
+    0xee => 0x5a5c, 0xef => 0x5b72, 0xf0 => 0x5b6e, 0xf1 => 0x5bc1,
+    0xf2 => 0x5bc0, 0xf3 => 0x5c59, 0xf4 => 0x5d1e, 0xf5 => 0x5d0b,
+    0xf6 => 0x5d1d, 0xf7 => 0x5d1a, 0xf8 => 0x5d20, 0xf9 => 0x5d0c,
+    0xfa => 0x5d28, 0xfb => 0x5d0d, 0xfc => 0x5d26, 0xfd => 0x5d25,
+    0xfe => 0x5d0f,
+  },
+  0xd5 => {
+    0x40 => 0x5d30, 0x41 => 0x5d12, 0x42 => 0x5d23, 0x43 => 0x5d1f,
+    0x44 => 0x5d2e, 0x45 => 0x5e3e, 0x46 => 0x5e34, 0x47 => 0x5eb1,
+    0x48 => 0x5eb4, 0x49 => 0x5eb9, 0x4a => 0x5eb2, 0x4b => 0x5eb3,
+    0x4c => 0x5f36, 0x4d => 0x5f38, 0x4e => 0x5f9b, 0x4f => 0x5f96,
+    0x50 => 0x5f9f, 0x51 => 0x608a, 0x52 => 0x6090, 0x53 => 0x6086,
+    0x54 => 0x60be, 0x55 => 0x60b0, 0x56 => 0x60ba, 0x57 => 0x60d3,
+    0x58 => 0x60d4, 0x59 => 0x60cf, 0x5a => 0x60e4, 0x5b => 0x60d9,
+    0x5c => 0x60dd, 0x5d => 0x60c8, 0x5e => 0x60b1, 0x5f => 0x60db,
+    0x60 => 0x60b7, 0x61 => 0x60ca, 0x62 => 0x60bf, 0x63 => 0x60c3,
+    0x64 => 0x60cd, 0x65 => 0x60c0, 0x66 => 0x6332, 0x67 => 0x6365,
+    0x68 => 0x638a, 0x69 => 0x6382, 0x6a => 0x637d, 0x6b => 0x63bd,
+    0x6c => 0x639e, 0x6d => 0x63ad, 0x6e => 0x639d, 0x6f => 0x6397,
+    0x70 => 0x63ab, 0x71 => 0x638e, 0x72 => 0x636f, 0x73 => 0x6387,
+    0x74 => 0x6390, 0x75 => 0x636e, 0x76 => 0x63af, 0x77 => 0x6375,
+    0x78 => 0x639c, 0x79 => 0x636d, 0x7a => 0x63ae, 0x7b => 0x637c,
+    0x7c => 0x63a4, 0x7d => 0x633b, 0x7e => 0x639f, 0xa1 => 0x6378,
+    0xa2 => 0x6385, 0xa3 => 0x6381, 0xa4 => 0x6391, 0xa5 => 0x638d,
+    0xa6 => 0x6370, 0xa7 => 0x6553, 0xa8 => 0x65cd, 0xa9 => 0x6665,
+    0xaa => 0x6661, 0xab => 0x665b, 0xac => 0x6659, 0xad => 0x665c,
+    0xae => 0x6662, 0xaf => 0x6718, 0xb0 => 0x6879, 0xb1 => 0x6887,
+    0xb2 => 0x6890, 0xb3 => 0x689c, 0xb4 => 0x686d, 0xb5 => 0x686e,
+    0xb6 => 0x68ae, 0xb7 => 0x68ab, 0xb8 => 0x6956, 0xb9 => 0x686f,
+    0xba => 0x68a3, 0xbb => 0x68ac, 0xbc => 0x68a9, 0xbd => 0x6875,
+    0xbe => 0x6874, 0xbf => 0x68b2, 0xc0 => 0x688f, 0xc1 => 0x6877,
+    0xc2 => 0x6892, 0xc3 => 0x687c, 0xc4 => 0x686b, 0xc5 => 0x6872,
+    0xc6 => 0x68aa, 0xc7 => 0x6880, 0xc8 => 0x6871, 0xc9 => 0x687e,
+    0xca => 0x689b, 0xcb => 0x6896, 0xcc => 0x688b, 0xcd => 0x68a0,
+    0xce => 0x6889, 0xcf => 0x68a4, 0xd0 => 0x6878, 0xd1 => 0x687b,
+    0xd2 => 0x6891, 0xd3 => 0x688c, 0xd4 => 0x688a, 0xd5 => 0x687d,
+    0xd6 => 0x6b36, 0xd7 => 0x6b33, 0xd8 => 0x6b37, 0xd9 => 0x6b38,
+    0xda => 0x6b91, 0xdb => 0x6b8f, 0xdc => 0x6b8d, 0xdd => 0x6b8e,
+    0xde => 0x6b8c, 0xdf => 0x6c2a, 0xe0 => 0x6dc0, 0xe1 => 0x6dab,
+    0xe2 => 0x6db4, 0xe3 => 0x6db3, 0xe4 => 0x6e74, 0xe5 => 0x6dac,
+    0xe6 => 0x6de9, 0xe7 => 0x6de2, 0xe8 => 0x6db7, 0xe9 => 0x6df6,
+    0xea => 0x6dd4, 0xeb => 0x6e00, 0xec => 0x6dc8, 0xed => 0x6de0,
+    0xee => 0x6ddf, 0xef => 0x6dd6, 0xf0 => 0x6dbe, 0xf1 => 0x6de5,
+    0xf2 => 0x6ddc, 0xf3 => 0x6ddd, 0xf4 => 0x6ddb, 0xf5 => 0x6df4,
+    0xf6 => 0x6dca, 0xf7 => 0x6dbd, 0xf8 => 0x6ded, 0xf9 => 0x6df0,
+    0xfa => 0x6dba, 0xfb => 0x6dd5, 0xfc => 0x6dc2, 0xfd => 0x6dcf,
+    0xfe => 0x6dc9,
+  },
+  0xd6 => {
+    0x40 => 0x6dd0, 0x41 => 0x6df2, 0x42 => 0x6dd3, 0x43 => 0x6dfd,
+    0x44 => 0x6dd7, 0x45 => 0x6dcd, 0x46 => 0x6de3, 0x47 => 0x6dbb,
+    0x48 => 0x70fa, 0x49 => 0x710d, 0x4a => 0x70f7, 0x4b => 0x7117,
+    0x4c => 0x70f4, 0x4d => 0x710c, 0x4e => 0x70f0, 0x4f => 0x7104,
+    0x50 => 0x70f3, 0x51 => 0x7110, 0x52 => 0x70fc, 0x53 => 0x70ff,
+    0x54 => 0x7106, 0x55 => 0x7113, 0x56 => 0x7100, 0x57 => 0x70f8,
+    0x58 => 0x70f6, 0x59 => 0x710b, 0x5a => 0x7102, 0x5b => 0x710e,
+    0x5c => 0x727e, 0x5d => 0x727b, 0x5e => 0x727c, 0x5f => 0x727f,
+    0x60 => 0x731d, 0x61 => 0x7317, 0x62 => 0x7307, 0x63 => 0x7311,
+    0x64 => 0x7318, 0x65 => 0x730a, 0x66 => 0x7308, 0x67 => 0x72ff,
+    0x68 => 0x730f, 0x69 => 0x731e, 0x6a => 0x7388, 0x6b => 0x73f6,
+    0x6c => 0x73f8, 0x6d => 0x73f5, 0x6e => 0x7404, 0x6f => 0x7401,
+    0x70 => 0x73fd, 0x71 => 0x7407, 0x72 => 0x7400, 0x73 => 0x73fa,
+    0x74 => 0x73fc, 0x75 => 0x73ff, 0x76 => 0x740c, 0x77 => 0x740b,
+    0x78 => 0x73f4, 0x79 => 0x7408, 0x7a => 0x7564, 0x7b => 0x7563,
+    0x7c => 0x75ce, 0x7d => 0x75d2, 0x7e => 0x75cf, 0xa1 => 0x75cb,
+    0xa2 => 0x75cc, 0xa3 => 0x75d1, 0xa4 => 0x75d0, 0xa5 => 0x768f,
+    0xa6 => 0x7689, 0xa7 => 0x76d3, 0xa8 => 0x7739, 0xa9 => 0x772f,
+    0xaa => 0x772d, 0xab => 0x7731, 0xac => 0x7732, 0xad => 0x7734,
+    0xae => 0x7733, 0xaf => 0x773d, 0xb0 => 0x7725, 0xb1 => 0x773b,
+    0xb2 => 0x7735, 0xb3 => 0x7848, 0xb4 => 0x7852, 0xb5 => 0x7849,
+    0xb6 => 0x784d, 0xb7 => 0x784a, 0xb8 => 0x784c, 0xb9 => 0x7826,
+    0xba => 0x7845, 0xbb => 0x7850, 0xbc => 0x7964, 0xbd => 0x7967,
+    0xbe => 0x7969, 0xbf => 0x796a, 0xc0 => 0x7963, 0xc1 => 0x796b,
+    0xc2 => 0x7961, 0xc3 => 0x79bb, 0xc4 => 0x79fa, 0xc5 => 0x79f8,
+    0xc6 => 0x79f6, 0xc7 => 0x79f7, 0xc8 => 0x7a8f, 0xc9 => 0x7a94,
+    0xca => 0x7a90, 0xcb => 0x7b35, 0xcc => 0x7b47, 0xcd => 0x7b34,
+    0xce => 0x7b25, 0xcf => 0x7b30, 0xd0 => 0x7b22, 0xd1 => 0x7b24,
+    0xd2 => 0x7b33, 0xd3 => 0x7b18, 0xd4 => 0x7b2a, 0xd5 => 0x7b1d,
+    0xd6 => 0x7b31, 0xd7 => 0x7b2b, 0xd8 => 0x7b2d, 0xd9 => 0x7b2f,
+    0xda => 0x7b32, 0xdb => 0x7b38, 0xdc => 0x7b1a, 0xdd => 0x7b23,
+    0xde => 0x7c94, 0xdf => 0x7c98, 0xe0 => 0x7c96, 0xe1 => 0x7ca3,
+    0xe2 => 0x7d35, 0xe3 => 0x7d3d, 0xe4 => 0x7d38, 0xe5 => 0x7d36,
+    0xe6 => 0x7d3a, 0xe7 => 0x7d45, 0xe8 => 0x7d2c, 0xe9 => 0x7d29,
+    0xea => 0x7d41, 0xeb => 0x7d47, 0xec => 0x7d3e, 0xed => 0x7d3f,
+    0xee => 0x7d4a, 0xef => 0x7d3b, 0xf0 => 0x7d28, 0xf1 => 0x7f63,
+    0xf2 => 0x7f95, 0xf3 => 0x7f9c, 0xf4 => 0x7f9d, 0xf5 => 0x7f9b,
+    0xf6 => 0x7fca, 0xf7 => 0x7fcb, 0xf8 => 0x7fcd, 0xf9 => 0x7fd0,
+    0xfa => 0x7fd1, 0xfb => 0x7fc7, 0xfc => 0x7fcf, 0xfd => 0x7fc9,
+    0xfe => 0x801f,
+  },
+  0xd7 => {
+    0x40 => 0x801e, 0x41 => 0x801b, 0x42 => 0x8047, 0x43 => 0x8043,
+    0x44 => 0x8048, 0x45 => 0x8118, 0x46 => 0x8125, 0x47 => 0x8119,
+    0x48 => 0x811b, 0x49 => 0x812d, 0x4a => 0x811f, 0x4b => 0x812c,
+    0x4c => 0x811e, 0x4d => 0x8121, 0x4e => 0x8115, 0x4f => 0x8127,
+    0x50 => 0x811d, 0x51 => 0x8122, 0x52 => 0x8211, 0x53 => 0x8238,
+    0x54 => 0x8233, 0x55 => 0x823a, 0x56 => 0x8234, 0x57 => 0x8232,
+    0x58 => 0x8274, 0x59 => 0x8390, 0x5a => 0x83a3, 0x5b => 0x83a8,
+    0x5c => 0x838d, 0x5d => 0x837a, 0x5e => 0x8373, 0x5f => 0x83a4,
+    0x60 => 0x8374, 0x61 => 0x838f, 0x62 => 0x8381, 0x63 => 0x8395,
+    0x64 => 0x8399, 0x65 => 0x8375, 0x66 => 0x8394, 0x67 => 0x83a9,
+    0x68 => 0x837d, 0x69 => 0x8383, 0x6a => 0x838c, 0x6b => 0x839d,
+    0x6c => 0x839b, 0x6d => 0x83aa, 0x6e => 0x838b, 0x6f => 0x837e,
+    0x70 => 0x83a5, 0x71 => 0x83af, 0x72 => 0x8388, 0x73 => 0x8397,
+    0x74 => 0x83b0, 0x75 => 0x837f, 0x76 => 0x83a6, 0x77 => 0x8387,
+    0x78 => 0x83ae, 0x79 => 0x8376, 0x7a => 0x839a, 0x7b => 0x8659,
+    0x7c => 0x8656, 0x7d => 0x86bf, 0x7e => 0x86b7, 0xa1 => 0x86c2,
+    0xa2 => 0x86c1, 0xa3 => 0x86c5, 0xa4 => 0x86ba, 0xa5 => 0x86b0,
+    0xa6 => 0x86c8, 0xa7 => 0x86b9, 0xa8 => 0x86b3, 0xa9 => 0x86b8,
+    0xaa => 0x86cc, 0xab => 0x86b4, 0xac => 0x86bb, 0xad => 0x86bc,
+    0xae => 0x86c3, 0xaf => 0x86bd, 0xb0 => 0x86be, 0xb1 => 0x8852,
+    0xb2 => 0x8889, 0xb3 => 0x8895, 0xb4 => 0x88a8, 0xb5 => 0x88a2,
+    0xb6 => 0x88aa, 0xb7 => 0x889a, 0xb8 => 0x8891, 0xb9 => 0x88a1,
+    0xba => 0x889f, 0xbb => 0x8898, 0xbc => 0x88a7, 0xbd => 0x8899,
+    0xbe => 0x889b, 0xbf => 0x8897, 0xc0 => 0x88a4, 0xc1 => 0x88ac,
+    0xc2 => 0x888c, 0xc3 => 0x8893, 0xc4 => 0x888e, 0xc5 => 0x8982,
+    0xc6 => 0x89d6, 0xc7 => 0x89d9, 0xc8 => 0x89d5, 0xc9 => 0x8a30,
+    0xca => 0x8a27, 0xcb => 0x8a2c, 0xcc => 0x8a1e, 0xcd => 0x8c39,
+    0xce => 0x8c3b, 0xcf => 0x8c5c, 0xd0 => 0x8c5d, 0xd1 => 0x8c7d,
+    0xd2 => 0x8ca5, 0xd3 => 0x8d7d, 0xd4 => 0x8d7b, 0xd5 => 0x8d79,
+    0xd6 => 0x8dbc, 0xd7 => 0x8dc2, 0xd8 => 0x8db9, 0xd9 => 0x8dbf,
+    0xda => 0x8dc1, 0xdb => 0x8ed8, 0xdc => 0x8ede, 0xdd => 0x8edd,
+    0xde => 0x8edc, 0xdf => 0x8ed7, 0xe0 => 0x8ee0, 0xe1 => 0x8ee1,
+    0xe2 => 0x9024, 0xe3 => 0x900b, 0xe4 => 0x9011, 0xe5 => 0x901c,
+    0xe6 => 0x900c, 0xe7 => 0x9021, 0xe8 => 0x90ef, 0xe9 => 0x90ea,
+    0xea => 0x90f0, 0xeb => 0x90f4, 0xec => 0x90f2, 0xed => 0x90f3,
+    0xee => 0x90d4, 0xef => 0x90eb, 0xf0 => 0x90ec, 0xf1 => 0x90e9,
+    0xf2 => 0x9156, 0xf3 => 0x9158, 0xf4 => 0x915a, 0xf5 => 0x9153,
+    0xf6 => 0x9155, 0xf7 => 0x91ec, 0xf8 => 0x91f4, 0xf9 => 0x91f1,
+    0xfa => 0x91f3, 0xfb => 0x91f8, 0xfc => 0x91e4, 0xfd => 0x91f9,
+    0xfe => 0x91ea,
+  },
+  0xd8 => {
+    0x40 => 0x91eb, 0x41 => 0x91f7, 0x42 => 0x91e8, 0x43 => 0x91ee,
+    0x44 => 0x957a, 0x45 => 0x9586, 0x46 => 0x9588, 0x47 => 0x967c,
+    0x48 => 0x966d, 0x49 => 0x966b, 0x4a => 0x9671, 0x4b => 0x966f,
+    0x4c => 0x96bf, 0x4d => 0x976a, 0x4e => 0x9804, 0x4f => 0x98e5,
+    0x50 => 0x9997, 0x51 => 0x509b, 0x52 => 0x5095, 0x53 => 0x5094,
+    0x54 => 0x509e, 0x55 => 0x508b, 0x56 => 0x50a3, 0x57 => 0x5083,
+    0x58 => 0x508c, 0x59 => 0x508e, 0x5a => 0x509d, 0x5b => 0x5068,
+    0x5c => 0x509c, 0x5d => 0x5092, 0x5e => 0x5082, 0x5f => 0x5087,
+    0x60 => 0x515f, 0x61 => 0x51d4, 0x62 => 0x5312, 0x63 => 0x5311,
+    0x64 => 0x53a4, 0x65 => 0x53a7, 0x66 => 0x5591, 0x67 => 0x55a8,
+    0x68 => 0x55a5, 0x69 => 0x55ad, 0x6a => 0x5577, 0x6b => 0x5645,
+    0x6c => 0x55a2, 0x6d => 0x5593, 0x6e => 0x5588, 0x6f => 0x558f,
+    0x70 => 0x55b5, 0x71 => 0x5581, 0x72 => 0x55a3, 0x73 => 0x5592,
+    0x74 => 0x55a4, 0x75 => 0x557d, 0x76 => 0x558c, 0x77 => 0x55a6,
+    0x78 => 0x557f, 0x79 => 0x5595, 0x7a => 0x55a1, 0x7b => 0x558e,
+    0x7c => 0x570c, 0x7d => 0x5829, 0x7e => 0x5837, 0xa1 => 0x5819,
+    0xa2 => 0x581e, 0xa3 => 0x5827, 0xa4 => 0x5823, 0xa5 => 0x5828,
+    0xa6 => 0x57f5, 0xa7 => 0x5848, 0xa8 => 0x5825, 0xa9 => 0x581c,
+    0xaa => 0x581b, 0xab => 0x5833, 0xac => 0x583f, 0xad => 0x5836,
+    0xae => 0x582e, 0xaf => 0x5839, 0xb0 => 0x5838, 0xb1 => 0x582d,
+    0xb2 => 0x582c, 0xb3 => 0x583b, 0xb4 => 0x5961, 0xb5 => 0x5aaf,
+    0xb6 => 0x5a94, 0xb7 => 0x5a9f, 0xb8 => 0x5a7a, 0xb9 => 0x5aa2,
+    0xba => 0x5a9e, 0xbb => 0x5a78, 0xbc => 0x5aa6, 0xbd => 0x5a7c,
+    0xbe => 0x5aa5, 0xbf => 0x5aac, 0xc0 => 0x5a95, 0xc1 => 0x5aae,
+    0xc2 => 0x5a37, 0xc3 => 0x5a84, 0xc4 => 0x5a8a, 0xc5 => 0x5a97,
+    0xc6 => 0x5a83, 0xc7 => 0x5a8b, 0xc8 => 0x5aa9, 0xc9 => 0x5a7b,
+    0xca => 0x5a7d, 0xcb => 0x5a8c, 0xcc => 0x5a9c, 0xcd => 0x5a8f,
+    0xce => 0x5a93, 0xcf => 0x5a9d, 0xd0 => 0x5bea, 0xd1 => 0x5bcd,
+    0xd2 => 0x5bcb, 0xd3 => 0x5bd4, 0xd4 => 0x5bd1, 0xd5 => 0x5bca,
+    0xd6 => 0x5bce, 0xd7 => 0x5c0c, 0xd8 => 0x5c30, 0xd9 => 0x5d37,
+    0xda => 0x5d43, 0xdb => 0x5d6b, 0xdc => 0x5d41, 0xdd => 0x5d4b,
+    0xde => 0x5d3f, 0xdf => 0x5d35, 0xe0 => 0x5d51, 0xe1 => 0x5d4e,
+    0xe2 => 0x5d55, 0xe3 => 0x5d33, 0xe4 => 0x5d3a, 0xe5 => 0x5d52,
+    0xe6 => 0x5d3d, 0xe7 => 0x5d31, 0xe8 => 0x5d59, 0xe9 => 0x5d42,
+    0xea => 0x5d39, 0xeb => 0x5d49, 0xec => 0x5d38, 0xed => 0x5d3c,
+    0xee => 0x5d32, 0xef => 0x5d36, 0xf0 => 0x5d40, 0xf1 => 0x5d45,
+    0xf2 => 0x5e44, 0xf3 => 0x5e41, 0xf4 => 0x5f58, 0xf5 => 0x5fa6,
+    0xf6 => 0x5fa5, 0xf7 => 0x5fab, 0xf8 => 0x60c9, 0xf9 => 0x60b9,
+    0xfa => 0x60cc, 0xfb => 0x60e2, 0xfc => 0x60ce, 0xfd => 0x60c4,
+    0xfe => 0x6114,
+  },
+  0xd9 => {
+    0x40 => 0x60f2, 0x41 => 0x610a, 0x42 => 0x6116, 0x43 => 0x6105,
+    0x44 => 0x60f5, 0x45 => 0x6113, 0x46 => 0x60f8, 0x47 => 0x60fc,
+    0x48 => 0x60fe, 0x49 => 0x60c1, 0x4a => 0x6103, 0x4b => 0x6118,
+    0x4c => 0x611d, 0x4d => 0x6110, 0x4e => 0x60ff, 0x4f => 0x6104,
+    0x50 => 0x610b, 0x51 => 0x624a, 0x52 => 0x6394, 0x53 => 0x63b1,
+    0x54 => 0x63b0, 0x55 => 0x63ce, 0x56 => 0x63e5, 0x57 => 0x63e8,
+    0x58 => 0x63ef, 0x59 => 0x63c3, 0x5a => 0x649d, 0x5b => 0x63f3,
+    0x5c => 0x63ca, 0x5d => 0x63e0, 0x5e => 0x63f6, 0x5f => 0x63d5,
+    0x60 => 0x63f2, 0x61 => 0x63f5, 0x62 => 0x6461, 0x63 => 0x63df,
+    0x64 => 0x63be, 0x65 => 0x63dd, 0x66 => 0x63dc, 0x67 => 0x63c4,
+    0x68 => 0x63d8, 0x69 => 0x63d3, 0x6a => 0x63c2, 0x6b => 0x63c7,
+    0x6c => 0x63cc, 0x6d => 0x63cb, 0x6e => 0x63c8, 0x6f => 0x63f0,
+    0x70 => 0x63d7, 0x71 => 0x63d9, 0x72 => 0x6532, 0x73 => 0x6567,
+    0x74 => 0x656a, 0x75 => 0x6564, 0x76 => 0x655c, 0x77 => 0x6568,
+    0x78 => 0x6565, 0x79 => 0x658c, 0x7a => 0x659d, 0x7b => 0x659e,
+    0x7c => 0x65ae, 0x7d => 0x65d0, 0x7e => 0x65d2, 0xa1 => 0x667c,
+    0xa2 => 0x666c, 0xa3 => 0x667b, 0xa4 => 0x6680, 0xa5 => 0x6671,
+    0xa6 => 0x6679, 0xa7 => 0x666a, 0xa8 => 0x6672, 0xa9 => 0x6701,
+    0xaa => 0x690c, 0xab => 0x68d3, 0xac => 0x6904, 0xad => 0x68dc,
+    0xae => 0x692a, 0xaf => 0x68ec, 0xb0 => 0x68ea, 0xb1 => 0x68f1,
+    0xb2 => 0x690f, 0xb3 => 0x68d6, 0xb4 => 0x68f7, 0xb5 => 0x68eb,
+    0xb6 => 0x68e4, 0xb7 => 0x68f6, 0xb8 => 0x6913, 0xb9 => 0x6910,
+    0xba => 0x68f3, 0xbb => 0x68e1, 0xbc => 0x6907, 0xbd => 0x68cc,
+    0xbe => 0x6908, 0xbf => 0x6970, 0xc0 => 0x68b4, 0xc1 => 0x6911,
+    0xc2 => 0x68ef, 0xc3 => 0x68c6, 0xc4 => 0x6914, 0xc5 => 0x68f8,
+    0xc6 => 0x68d0, 0xc7 => 0x68fd, 0xc8 => 0x68fc, 0xc9 => 0x68e8,
+    0xca => 0x690b, 0xcb => 0x690a, 0xcc => 0x6917, 0xcd => 0x68ce,
+    0xce => 0x68c8, 0xcf => 0x68dd, 0xd0 => 0x68de, 0xd1 => 0x68e6,
+    0xd2 => 0x68f4, 0xd3 => 0x68d1, 0xd4 => 0x6906, 0xd5 => 0x68d4,
+    0xd6 => 0x68e9, 0xd7 => 0x6915, 0xd8 => 0x6925, 0xd9 => 0x68c7,
+    0xda => 0x6b39, 0xdb => 0x6b3b, 0xdc => 0x6b3f, 0xdd => 0x6b3c,
+    0xde => 0x6b94, 0xdf => 0x6b97, 0xe0 => 0x6b99, 0xe1 => 0x6b95,
+    0xe2 => 0x6bbd, 0xe3 => 0x6bf0, 0xe4 => 0x6bf2, 0xe5 => 0x6bf3,
+    0xe6 => 0x6c30, 0xe7 => 0x6dfc, 0xe8 => 0x6e46, 0xe9 => 0x6e47,
+    0xea => 0x6e1f, 0xeb => 0x6e49, 0xec => 0x6e88, 0xed => 0x6e3c,
+    0xee => 0x6e3d, 0xef => 0x6e45, 0xf0 => 0x6e62, 0xf1 => 0x6e2b,
+    0xf2 => 0x6e3f, 0xf3 => 0x6e41, 0xf4 => 0x6e5d, 0xf5 => 0x6e73,
+    0xf6 => 0x6e1c, 0xf7 => 0x6e33, 0xf8 => 0x6e4b, 0xf9 => 0x6e40,
+    0xfa => 0x6e51, 0xfb => 0x6e3b, 0xfc => 0x6e03, 0xfd => 0x6e2e,
+    0xfe => 0x6e5e,
+  },
+  0xda => {
+    0x40 => 0x6e68, 0x41 => 0x6e5c, 0x42 => 0x6e61, 0x43 => 0x6e31,
+    0x44 => 0x6e28, 0x45 => 0x6e60, 0x46 => 0x6e71, 0x47 => 0x6e6b,
+    0x48 => 0x6e39, 0x49 => 0x6e22, 0x4a => 0x6e30, 0x4b => 0x6e53,
+    0x4c => 0x6e65, 0x4d => 0x6e27, 0x4e => 0x6e78, 0x4f => 0x6e64,
+    0x50 => 0x6e77, 0x51 => 0x6e55, 0x52 => 0x6e79, 0x53 => 0x6e52,
+    0x54 => 0x6e66, 0x55 => 0x6e35, 0x56 => 0x6e36, 0x57 => 0x6e5a,
+    0x58 => 0x7120, 0x59 => 0x711e, 0x5a => 0x712f, 0x5b => 0x70fb,
+    0x5c => 0x712e, 0x5d => 0x7131, 0x5e => 0x7123, 0x5f => 0x7125,
+    0x60 => 0x7122, 0x61 => 0x7132, 0x62 => 0x711f, 0x63 => 0x7128,
+    0x64 => 0x713a, 0x65 => 0x711b, 0x66 => 0x724b, 0x67 => 0x725a,
+    0x68 => 0x7288, 0x69 => 0x7289, 0x6a => 0x7286, 0x6b => 0x7285,
+    0x6c => 0x728b, 0x6d => 0x7312, 0x6e => 0x730b, 0x6f => 0x7330,
+    0x70 => 0x7322, 0x71 => 0x7331, 0x72 => 0x7333, 0x73 => 0x7327,
+    0x74 => 0x7332, 0x75 => 0x732d, 0x76 => 0x7326, 0x77 => 0x7323,
+    0x78 => 0x7335, 0x79 => 0x730c, 0x7a => 0x742e, 0x7b => 0x742c,
+    0x7c => 0x7430, 0x7d => 0x742b, 0x7e => 0x7416, 0xa1 => 0x741a,
+    0xa2 => 0x7421, 0xa3 => 0x742d, 0xa4 => 0x7431, 0xa5 => 0x7424,
+    0xa6 => 0x7423, 0xa7 => 0x741d, 0xa8 => 0x7429, 0xa9 => 0x7420,
+    0xaa => 0x7432, 0xab => 0x74fb, 0xac => 0x752f, 0xad => 0x756f,
+    0xae => 0x756c, 0xaf => 0x75e7, 0xb0 => 0x75da, 0xb1 => 0x75e1,
+    0xb2 => 0x75e6, 0xb3 => 0x75dd, 0xb4 => 0x75df, 0xb5 => 0x75e4,
+    0xb6 => 0x75d7, 0xb7 => 0x7695, 0xb8 => 0x7692, 0xb9 => 0x76da,
+    0xba => 0x7746, 0xbb => 0x7747, 0xbc => 0x7744, 0xbd => 0x774d,
+    0xbe => 0x7745, 0xbf => 0x774a, 0xc0 => 0x774e, 0xc1 => 0x774b,
+    0xc2 => 0x774c, 0xc3 => 0x77de, 0xc4 => 0x77ec, 0xc5 => 0x7860,
+    0xc6 => 0x7864, 0xc7 => 0x7865, 0xc8 => 0x785c, 0xc9 => 0x786d,
+    0xca => 0x7871, 0xcb => 0x786a, 0xcc => 0x786e, 0xcd => 0x7870,
+    0xce => 0x7869, 0xcf => 0x7868, 0xd0 => 0x785e, 0xd1 => 0x7862,
+    0xd2 => 0x7974, 0xd3 => 0x7973, 0xd4 => 0x7972, 0xd5 => 0x7970,
+    0xd6 => 0x7a02, 0xd7 => 0x7a0a, 0xd8 => 0x7a03, 0xd9 => 0x7a0c,
+    0xda => 0x7a04, 0xdb => 0x7a99, 0xdc => 0x7ae6, 0xdd => 0x7ae4,
+    0xde => 0x7b4a, 0xdf => 0x7b3b, 0xe0 => 0x7b44, 0xe1 => 0x7b48,
+    0xe2 => 0x7b4c, 0xe3 => 0x7b4e, 0xe4 => 0x7b40, 0xe5 => 0x7b58,
+    0xe6 => 0x7b45, 0xe7 => 0x7ca2, 0xe8 => 0x7c9e, 0xe9 => 0x7ca8,
+    0xea => 0x7ca1, 0xeb => 0x7d58, 0xec => 0x7d6f, 0xed => 0x7d63,
+    0xee => 0x7d53, 0xef => 0x7d56, 0xf0 => 0x7d67, 0xf1 => 0x7d6a,
+    0xf2 => 0x7d4f, 0xf3 => 0x7d6d, 0xf4 => 0x7d5c, 0xf5 => 0x7d6b,
+    0xf6 => 0x7d52, 0xf7 => 0x7d54, 0xf8 => 0x7d69, 0xf9 => 0x7d51,
+    0xfa => 0x7d5f, 0xfb => 0x7d4e, 0xfc => 0x7f3e, 0xfd => 0x7f3f,
+    0xfe => 0x7f65,
+  },
+  0xdb => {
+    0x40 => 0x7f66, 0x41 => 0x7fa2, 0x42 => 0x7fa0, 0x43 => 0x7fa1,
+    0x44 => 0x7fd7, 0x45 => 0x8051, 0x46 => 0x804f, 0x47 => 0x8050,
+    0x48 => 0x80fe, 0x49 => 0x80d4, 0x4a => 0x8143, 0x4b => 0x814a,
+    0x4c => 0x8152, 0x4d => 0x814f, 0x4e => 0x8147, 0x4f => 0x813d,
+    0x50 => 0x814d, 0x51 => 0x813a, 0x52 => 0x81e6, 0x53 => 0x81ee,
+    0x54 => 0x81f7, 0x55 => 0x81f8, 0x56 => 0x81f9, 0x57 => 0x8204,
+    0x58 => 0x823c, 0x59 => 0x823d, 0x5a => 0x823f, 0x5b => 0x8275,
+    0x5c => 0x833b, 0x5d => 0x83cf, 0x5e => 0x83f9, 0x5f => 0x8423,
+    0x60 => 0x83c0, 0x61 => 0x83e8, 0x62 => 0x8412, 0x63 => 0x83e7,
+    0x64 => 0x83e4, 0x65 => 0x83fc, 0x66 => 0x83f6, 0x67 => 0x8410,
+    0x68 => 0x83c6, 0x69 => 0x83c8, 0x6a => 0x83eb, 0x6b => 0x83e3,
+    0x6c => 0x83bf, 0x6d => 0x8401, 0x6e => 0x83dd, 0x6f => 0x83e5,
+    0x70 => 0x83d8, 0x71 => 0x83ff, 0x72 => 0x83e1, 0x73 => 0x83cb,
+    0x74 => 0x83ce, 0x75 => 0x83d6, 0x76 => 0x83f5, 0x77 => 0x83c9,
+    0x78 => 0x8409, 0x79 => 0x840f, 0x7a => 0x83de, 0x7b => 0x8411,
+    0x7c => 0x8406, 0x7d => 0x83c2, 0x7e => 0x83f3, 0xa1 => 0x83d5,
+    0xa2 => 0x83fa, 0xa3 => 0x83c7, 0xa4 => 0x83d1, 0xa5 => 0x83ea,
+    0xa6 => 0x8413, 0xa7 => 0x83c3, 0xa8 => 0x83ec, 0xa9 => 0x83ee,
+    0xaa => 0x83c4, 0xab => 0x83fb, 0xac => 0x83d7, 0xad => 0x83e2,
+    0xae => 0x841b, 0xaf => 0x83db, 0xb0 => 0x83fe, 0xb1 => 0x86d8,
+    0xb2 => 0x86e2, 0xb3 => 0x86e6, 0xb4 => 0x86d3, 0xb5 => 0x86e3,
+    0xb6 => 0x86da, 0xb7 => 0x86ea, 0xb8 => 0x86dd, 0xb9 => 0x86eb,
+    0xba => 0x86dc, 0xbb => 0x86ec, 0xbc => 0x86e9, 0xbd => 0x86d7,
+    0xbe => 0x86e8, 0xbf => 0x86d1, 0xc0 => 0x8848, 0xc1 => 0x8856,
+    0xc2 => 0x8855, 0xc3 => 0x88ba, 0xc4 => 0x88d7, 0xc5 => 0x88b9,
+    0xc6 => 0x88b8, 0xc7 => 0x88c0, 0xc8 => 0x88be, 0xc9 => 0x88b6,
+    0xca => 0x88bc, 0xcb => 0x88b7, 0xcc => 0x88bd, 0xcd => 0x88b2,
+    0xce => 0x8901, 0xcf => 0x88c9, 0xd0 => 0x8995, 0xd1 => 0x8998,
+    0xd2 => 0x8997, 0xd3 => 0x89dd, 0xd4 => 0x89da, 0xd5 => 0x89db,
+    0xd6 => 0x8a4e, 0xd7 => 0x8a4d, 0xd8 => 0x8a39, 0xd9 => 0x8a59,
+    0xda => 0x8a40, 0xdb => 0x8a57, 0xdc => 0x8a58, 0xdd => 0x8a44,
+    0xde => 0x8a45, 0xdf => 0x8a52, 0xe0 => 0x8a48, 0xe1 => 0x8a51,
+    0xe2 => 0x8a4a, 0xe3 => 0x8a4c, 0xe4 => 0x8a4f, 0xe5 => 0x8c5f,
+    0xe6 => 0x8c81, 0xe7 => 0x8c80, 0xe8 => 0x8cba, 0xe9 => 0x8cbe,
+    0xea => 0x8cb0, 0xeb => 0x8cb9, 0xec => 0x8cb5, 0xed => 0x8d84,
+    0xee => 0x8d80, 0xef => 0x8d89, 0xf0 => 0x8dd8, 0xf1 => 0x8dd3,
+    0xf2 => 0x8dcd, 0xf3 => 0x8dc7, 0xf4 => 0x8dd6, 0xf5 => 0x8ddc,
+    0xf6 => 0x8dcf, 0xf7 => 0x8dd5, 0xf8 => 0x8dd9, 0xf9 => 0x8dc8,
+    0xfa => 0x8dd7, 0xfb => 0x8dc5, 0xfc => 0x8eef, 0xfd => 0x8ef7,
+    0xfe => 0x8efa,
+  },
+  0xdc => {
+    0x40 => 0x8ef9, 0x41 => 0x8ee6, 0x42 => 0x8eee, 0x43 => 0x8ee5,
+    0x44 => 0x8ef5, 0x45 => 0x8ee7, 0x46 => 0x8ee8, 0x47 => 0x8ef6,
+    0x48 => 0x8eeb, 0x49 => 0x8ef1, 0x4a => 0x8eec, 0x4b => 0x8ef4,
+    0x4c => 0x8ee9, 0x4d => 0x902d, 0x4e => 0x9034, 0x4f => 0x902f,
+    0x50 => 0x9106, 0x51 => 0x912c, 0x52 => 0x9104, 0x53 => 0x90ff,
+    0x54 => 0x90fc, 0x55 => 0x9108, 0x56 => 0x90f9, 0x57 => 0x90fb,
+    0x58 => 0x9101, 0x59 => 0x9100, 0x5a => 0x9107, 0x5b => 0x9105,
+    0x5c => 0x9103, 0x5d => 0x9161, 0x5e => 0x9164, 0x5f => 0x915f,
+    0x60 => 0x9162, 0x61 => 0x9160, 0x62 => 0x9201, 0x63 => 0x920a,
+    0x64 => 0x9225, 0x65 => 0x9203, 0x66 => 0x921a, 0x67 => 0x9226,
+    0x68 => 0x920f, 0x69 => 0x920c, 0x6a => 0x9200, 0x6b => 0x9212,
+    0x6c => 0x91ff, 0x6d => 0x91fd, 0x6e => 0x9206, 0x6f => 0x9204,
+    0x70 => 0x9227, 0x71 => 0x9202, 0x72 => 0x921c, 0x73 => 0x9224,
+    0x74 => 0x9219, 0x75 => 0x9217, 0x76 => 0x9205, 0x77 => 0x9216,
+    0x78 => 0x957b, 0x79 => 0x958d, 0x7a => 0x958c, 0x7b => 0x9590,
+    0x7c => 0x9687, 0x7d => 0x967e, 0x7e => 0x9688, 0xa1 => 0x9689,
+    0xa2 => 0x9683, 0xa3 => 0x9680, 0xa4 => 0x96c2, 0xa5 => 0x96c8,
+    0xa6 => 0x96c3, 0xa7 => 0x96f1, 0xa8 => 0x96f0, 0xa9 => 0x976c,
+    0xaa => 0x9770, 0xab => 0x976e, 0xac => 0x9807, 0xad => 0x98a9,
+    0xae => 0x98eb, 0xaf => 0x9ce6, 0xb0 => 0x9ef9, 0xb1 => 0x4e83,
+    0xb2 => 0x4e84, 0xb3 => 0x4eb6, 0xb4 => 0x50bd, 0xb5 => 0x50bf,
+    0xb6 => 0x50c6, 0xb7 => 0x50ae, 0xb8 => 0x50c4, 0xb9 => 0x50ca,
+    0xba => 0x50b4, 0xbb => 0x50c8, 0xbc => 0x50c2, 0xbd => 0x50b0,
+    0xbe => 0x50c1, 0xbf => 0x50ba, 0xc0 => 0x50b1, 0xc1 => 0x50cb,
+    0xc2 => 0x50c9, 0xc3 => 0x50b6, 0xc4 => 0x50b8, 0xc5 => 0x51d7,
+    0xc6 => 0x527a, 0xc7 => 0x5278, 0xc8 => 0x527b, 0xc9 => 0x527c,
+    0xca => 0x55c3, 0xcb => 0x55db, 0xcc => 0x55cc, 0xcd => 0x55d0,
+    0xce => 0x55cb, 0xcf => 0x55ca, 0xd0 => 0x55dd, 0xd1 => 0x55c0,
+    0xd2 => 0x55d4, 0xd3 => 0x55c4, 0xd4 => 0x55e9, 0xd5 => 0x55bf,
+    0xd6 => 0x55d2, 0xd7 => 0x558d, 0xd8 => 0x55cf, 0xd9 => 0x55d5,
+    0xda => 0x55e2, 0xdb => 0x55d6, 0xdc => 0x55c8, 0xdd => 0x55f2,
+    0xde => 0x55cd, 0xdf => 0x55d9, 0xe0 => 0x55c2, 0xe1 => 0x5714,
+    0xe2 => 0x5853, 0xe3 => 0x5868, 0xe4 => 0x5864, 0xe5 => 0x584f,
+    0xe6 => 0x584d, 0xe7 => 0x5849, 0xe8 => 0x586f, 0xe9 => 0x5855,
+    0xea => 0x584e, 0xeb => 0x585d, 0xec => 0x5859, 0xed => 0x5865,
+    0xee => 0x585b, 0xef => 0x583d, 0xf0 => 0x5863, 0xf1 => 0x5871,
+    0xf2 => 0x58fc, 0xf3 => 0x5ac7, 0xf4 => 0x5ac4, 0xf5 => 0x5acb,
+    0xf6 => 0x5aba, 0xf7 => 0x5ab8, 0xf8 => 0x5ab1, 0xf9 => 0x5ab5,
+    0xfa => 0x5ab0, 0xfb => 0x5abf, 0xfc => 0x5ac8, 0xfd => 0x5abb,
+    0xfe => 0x5ac6,
+  },
+  0xdd => {
+    0x40 => 0x5ab7, 0x41 => 0x5ac0, 0x42 => 0x5aca, 0x43 => 0x5ab4,
+    0x44 => 0x5ab6, 0x45 => 0x5acd, 0x46 => 0x5ab9, 0x47 => 0x5a90,
+    0x48 => 0x5bd6, 0x49 => 0x5bd8, 0x4a => 0x5bd9, 0x4b => 0x5c1f,
+    0x4c => 0x5c33, 0x4d => 0x5d71, 0x4e => 0x5d63, 0x4f => 0x5d4a,
+    0x50 => 0x5d65, 0x51 => 0x5d72, 0x52 => 0x5d6c, 0x53 => 0x5d5e,
+    0x54 => 0x5d68, 0x55 => 0x5d67, 0x56 => 0x5d62, 0x57 => 0x5df0,
+    0x58 => 0x5e4f, 0x59 => 0x5e4e, 0x5a => 0x5e4a, 0x5b => 0x5e4d,
+    0x5c => 0x5e4b, 0x5d => 0x5ec5, 0x5e => 0x5ecc, 0x5f => 0x5ec6,
+    0x60 => 0x5ecb, 0x61 => 0x5ec7, 0x62 => 0x5f40, 0x63 => 0x5faf,
+    0x64 => 0x5fad, 0x65 => 0x60f7, 0x66 => 0x6149, 0x67 => 0x614a,
+    0x68 => 0x612b, 0x69 => 0x6145, 0x6a => 0x6136, 0x6b => 0x6132,
+    0x6c => 0x612e, 0x6d => 0x6146, 0x6e => 0x612f, 0x6f => 0x614f,
+    0x70 => 0x6129, 0x71 => 0x6140, 0x72 => 0x6220, 0x73 => 0x9168,
+    0x74 => 0x6223, 0x75 => 0x6225, 0x76 => 0x6224, 0x77 => 0x63c5,
+    0x78 => 0x63f1, 0x79 => 0x63eb, 0x7a => 0x6410, 0x7b => 0x6412,
+    0x7c => 0x6409, 0x7d => 0x6420, 0x7e => 0x6424, 0xa1 => 0x6433,
+    0xa2 => 0x6443, 0xa3 => 0x641f, 0xa4 => 0x6415, 0xa5 => 0x6418,
+    0xa6 => 0x6439, 0xa7 => 0x6437, 0xa8 => 0x6422, 0xa9 => 0x6423,
+    0xaa => 0x640c, 0xab => 0x6426, 0xac => 0x6430, 0xad => 0x6428,
+    0xae => 0x6441, 0xaf => 0x6435, 0xb0 => 0x642f, 0xb1 => 0x640a,
+    0xb2 => 0x641a, 0xb3 => 0x6440, 0xb4 => 0x6425, 0xb5 => 0x6427,
+    0xb6 => 0x640b, 0xb7 => 0x63e7, 0xb8 => 0x641b, 0xb9 => 0x642e,
+    0xba => 0x6421, 0xbb => 0x640e, 0xbc => 0x656f, 0xbd => 0x6592,
+    0xbe => 0x65d3, 0xbf => 0x6686, 0xc0 => 0x668c, 0xc1 => 0x6695,
+    0xc2 => 0x6690, 0xc3 => 0x668b, 0xc4 => 0x668a, 0xc5 => 0x6699,
+    0xc6 => 0x6694, 0xc7 => 0x6678, 0xc8 => 0x6720, 0xc9 => 0x6966,
+    0xca => 0x695f, 0xcb => 0x6938, 0xcc => 0x694e, 0xcd => 0x6962,
+    0xce => 0x6971, 0xcf => 0x693f, 0xd0 => 0x6945, 0xd1 => 0x696a,
+    0xd2 => 0x6939, 0xd3 => 0x6942, 0xd4 => 0x6957, 0xd5 => 0x6959,
+    0xd6 => 0x697a, 0xd7 => 0x6948, 0xd8 => 0x6949, 0xd9 => 0x6935,
+    0xda => 0x696c, 0xdb => 0x6933, 0xdc => 0x693d, 0xdd => 0x6965,
+    0xde => 0x68f0, 0xdf => 0x6978, 0xe0 => 0x6934, 0xe1 => 0x6969,
+    0xe2 => 0x6940, 0xe3 => 0x696f, 0xe4 => 0x6944, 0xe5 => 0x6976,
+    0xe6 => 0x6958, 0xe7 => 0x6941, 0xe8 => 0x6974, 0xe9 => 0x694c,
+    0xea => 0x693b, 0xeb => 0x694b, 0xec => 0x6937, 0xed => 0x695c,
+    0xee => 0x694f, 0xef => 0x6951, 0xf0 => 0x6932, 0xf1 => 0x6952,
+    0xf2 => 0x692f, 0xf3 => 0x697b, 0xf4 => 0x693c, 0xf5 => 0x6b46,
+    0xf6 => 0x6b45, 0xf7 => 0x6b43, 0xf8 => 0x6b42, 0xf9 => 0x6b48,
+    0xfa => 0x6b41, 0xfb => 0x6b9b, 0xfc => 0xfa0d, 0xfd => 0x6bfb,
+    0xfe => 0x6bfc,
+  },
+  0xde => {
+    0x40 => 0x6bf9, 0x41 => 0x6bf7, 0x42 => 0x6bf8, 0x43 => 0x6e9b,
+    0x44 => 0x6ed6, 0x45 => 0x6ec8, 0x46 => 0x6e8f, 0x47 => 0x6ec0,
+    0x48 => 0x6e9f, 0x49 => 0x6e93, 0x4a => 0x6e94, 0x4b => 0x6ea0,
+    0x4c => 0x6eb1, 0x4d => 0x6eb9, 0x4e => 0x6ec6, 0x4f => 0x6ed2,
+    0x50 => 0x6ebd, 0x51 => 0x6ec1, 0x52 => 0x6e9e, 0x53 => 0x6ec9,
+    0x54 => 0x6eb7, 0x55 => 0x6eb0, 0x56 => 0x6ecd, 0x57 => 0x6ea6,
+    0x58 => 0x6ecf, 0x59 => 0x6eb2, 0x5a => 0x6ebe, 0x5b => 0x6ec3,
+    0x5c => 0x6edc, 0x5d => 0x6ed8, 0x5e => 0x6e99, 0x5f => 0x6e92,
+    0x60 => 0x6e8e, 0x61 => 0x6e8d, 0x62 => 0x6ea4, 0x63 => 0x6ea1,
+    0x64 => 0x6ebf, 0x65 => 0x6eb3, 0x66 => 0x6ed0, 0x67 => 0x6eca,
+    0x68 => 0x6e97, 0x69 => 0x6eae, 0x6a => 0x6ea3, 0x6b => 0x7147,
+    0x6c => 0x7154, 0x6d => 0x7152, 0x6e => 0x7163, 0x6f => 0x7160,
+    0x70 => 0x7141, 0x71 => 0x715d, 0x72 => 0x7162, 0x73 => 0x7172,
+    0x74 => 0x7178, 0x75 => 0x716a, 0x76 => 0x7161, 0x77 => 0x7142,
+    0x78 => 0x7158, 0x79 => 0x7143, 0x7a => 0x714b, 0x7b => 0x7170,
+    0x7c => 0x715f, 0x7d => 0x7150, 0x7e => 0x7153, 0xa1 => 0x7144,
+    0xa2 => 0x714d, 0xa3 => 0x715a, 0xa4 => 0x724f, 0xa5 => 0x728d,
+    0xa6 => 0x728c, 0xa7 => 0x7291, 0xa8 => 0x7290, 0xa9 => 0x728e,
+    0xaa => 0x733c, 0xab => 0x7342, 0xac => 0x733b, 0xad => 0x733a,
+    0xae => 0x7340, 0xaf => 0x734a, 0xb0 => 0x7349, 0xb1 => 0x7444,
+    0xb2 => 0x744a, 0xb3 => 0x744b, 0xb4 => 0x7452, 0xb5 => 0x7451,
+    0xb6 => 0x7457, 0xb7 => 0x7440, 0xb8 => 0x744f, 0xb9 => 0x7450,
+    0xba => 0x744e, 0xbb => 0x7442, 0xbc => 0x7446, 0xbd => 0x744d,
+    0xbe => 0x7454, 0xbf => 0x74e1, 0xc0 => 0x74ff, 0xc1 => 0x74fe,
+    0xc2 => 0x74fd, 0xc3 => 0x751d, 0xc4 => 0x7579, 0xc5 => 0x7577,
+    0xc6 => 0x6983, 0xc7 => 0x75ef, 0xc8 => 0x760f, 0xc9 => 0x7603,
+    0xca => 0x75f7, 0xcb => 0x75fe, 0xcc => 0x75fc, 0xcd => 0x75f9,
+    0xce => 0x75f8, 0xcf => 0x7610, 0xd0 => 0x75fb, 0xd1 => 0x75f6,
+    0xd2 => 0x75ed, 0xd3 => 0x75f5, 0xd4 => 0x75fd, 0xd5 => 0x7699,
+    0xd6 => 0x76b5, 0xd7 => 0x76dd, 0xd8 => 0x7755, 0xd9 => 0x775f,
+    0xda => 0x7760, 0xdb => 0x7752, 0xdc => 0x7756, 0xdd => 0x775a,
+    0xde => 0x7769, 0xdf => 0x7767, 0xe0 => 0x7754, 0xe1 => 0x7759,
+    0xe2 => 0x776d, 0xe3 => 0x77e0, 0xe4 => 0x7887, 0xe5 => 0x789a,
+    0xe6 => 0x7894, 0xe7 => 0x788f, 0xe8 => 0x7884, 0xe9 => 0x7895,
+    0xea => 0x7885, 0xeb => 0x7886, 0xec => 0x78a1, 0xed => 0x7883,
+    0xee => 0x7879, 0xef => 0x7899, 0xf0 => 0x7880, 0xf1 => 0x7896,
+    0xf2 => 0x787b, 0xf3 => 0x797c, 0xf4 => 0x7982, 0xf5 => 0x797d,
+    0xf6 => 0x7979, 0xf7 => 0x7a11, 0xf8 => 0x7a18, 0xf9 => 0x7a19,
+    0xfa => 0x7a12, 0xfb => 0x7a17, 0xfc => 0x7a15, 0xfd => 0x7a22,
+    0xfe => 0x7a13,
+  },
+  0xdf => {
+    0x40 => 0x7a1b, 0x41 => 0x7a10, 0x42 => 0x7aa3, 0x43 => 0x7aa2,
+    0x44 => 0x7a9e, 0x45 => 0x7aeb, 0x46 => 0x7b66, 0x47 => 0x7b64,
+    0x48 => 0x7b6d, 0x49 => 0x7b74, 0x4a => 0x7b69, 0x4b => 0x7b72,
+    0x4c => 0x7b65, 0x4d => 0x7b73, 0x4e => 0x7b71, 0x4f => 0x7b70,
+    0x50 => 0x7b61, 0x51 => 0x7b78, 0x52 => 0x7b76, 0x53 => 0x7b63,
+    0x54 => 0x7cb2, 0x55 => 0x7cb4, 0x56 => 0x7caf, 0x57 => 0x7d88,
+    0x58 => 0x7d86, 0x59 => 0x7d80, 0x5a => 0x7d8d, 0x5b => 0x7d7f,
+    0x5c => 0x7d85, 0x5d => 0x7d7a, 0x5e => 0x7d8e, 0x5f => 0x7d7b,
+    0x60 => 0x7d83, 0x61 => 0x7d7c, 0x62 => 0x7d8c, 0x63 => 0x7d94,
+    0x64 => 0x7d84, 0x65 => 0x7d7d, 0x66 => 0x7d92, 0x67 => 0x7f6d,
+    0x68 => 0x7f6b, 0x69 => 0x7f67, 0x6a => 0x7f68, 0x6b => 0x7f6c,
+    0x6c => 0x7fa6, 0x6d => 0x7fa5, 0x6e => 0x7fa7, 0x6f => 0x7fdb,
+    0x70 => 0x7fdc, 0x71 => 0x8021, 0x72 => 0x8164, 0x73 => 0x8160,
+    0x74 => 0x8177, 0x75 => 0x815c, 0x76 => 0x8169, 0x77 => 0x815b,
+    0x78 => 0x8162, 0x79 => 0x8172, 0x7a => 0x6721, 0x7b => 0x815e,
+    0x7c => 0x8176, 0x7d => 0x8167, 0x7e => 0x816f, 0xa1 => 0x8144,
+    0xa2 => 0x8161, 0xa3 => 0x821d, 0xa4 => 0x8249, 0xa5 => 0x8244,
+    0xa6 => 0x8240, 0xa7 => 0x8242, 0xa8 => 0x8245, 0xa9 => 0x84f1,
+    0xaa => 0x843f, 0xab => 0x8456, 0xac => 0x8476, 0xad => 0x8479,
+    0xae => 0x848f, 0xaf => 0x848d, 0xb0 => 0x8465, 0xb1 => 0x8451,
+    0xb2 => 0x8440, 0xb3 => 0x8486, 0xb4 => 0x8467, 0xb5 => 0x8430,
+    0xb6 => 0x844d, 0xb7 => 0x847d, 0xb8 => 0x845a, 0xb9 => 0x8459,
+    0xba => 0x8474, 0xbb => 0x8473, 0xbc => 0x845d, 0xbd => 0x8507,
+    0xbe => 0x845e, 0xbf => 0x8437, 0xc0 => 0x843a, 0xc1 => 0x8434,
+    0xc2 => 0x847a, 0xc3 => 0x8443, 0xc4 => 0x8478, 0xc5 => 0x8432,
+    0xc6 => 0x8445, 0xc7 => 0x8429, 0xc8 => 0x83d9, 0xc9 => 0x844b,
+    0xca => 0x842f, 0xcb => 0x8442, 0xcc => 0x842d, 0xcd => 0x845f,
+    0xce => 0x8470, 0xcf => 0x8439, 0xd0 => 0x844e, 0xd1 => 0x844c,
+    0xd2 => 0x8452, 0xd3 => 0x846f, 0xd4 => 0x84c5, 0xd5 => 0x848e,
+    0xd6 => 0x843b, 0xd7 => 0x8447, 0xd8 => 0x8436, 0xd9 => 0x8433,
+    0xda => 0x8468, 0xdb => 0x847e, 0xdc => 0x8444, 0xdd => 0x842b,
+    0xde => 0x8460, 0xdf => 0x8454, 0xe0 => 0x846e, 0xe1 => 0x8450,
+    0xe2 => 0x870b, 0xe3 => 0x8704, 0xe4 => 0x86f7, 0xe5 => 0x870c,
+    0xe6 => 0x86fa, 0xe7 => 0x86d6, 0xe8 => 0x86f5, 0xe9 => 0x874d,
+    0xea => 0x86f8, 0xeb => 0x870e, 0xec => 0x8709, 0xed => 0x8701,
+    0xee => 0x86f6, 0xef => 0x870d, 0xf0 => 0x8705, 0xf1 => 0x88d6,
+    0xf2 => 0x88cb, 0xf3 => 0x88cd, 0xf4 => 0x88ce, 0xf5 => 0x88de,
+    0xf6 => 0x88db, 0xf7 => 0x88da, 0xf8 => 0x88cc, 0xf9 => 0x88d0,
+    0xfa => 0x8985, 0xfb => 0x899b, 0xfc => 0x89df, 0xfd => 0x89e5,
+    0xfe => 0x89e4,
+  },
+  0xe0 => {
+    0x40 => 0x89e1, 0x41 => 0x89e0, 0x42 => 0x89e2, 0x43 => 0x89dc,
+    0x44 => 0x89e6, 0x45 => 0x8a76, 0x46 => 0x8a86, 0x47 => 0x8a7f,
+    0x48 => 0x8a61, 0x49 => 0x8a3f, 0x4a => 0x8a77, 0x4b => 0x8a82,
+    0x4c => 0x8a84, 0x4d => 0x8a75, 0x4e => 0x8a83, 0x4f => 0x8a81,
+    0x50 => 0x8a74, 0x51 => 0x8a7a, 0x52 => 0x8c3c, 0x53 => 0x8c4b,
+    0x54 => 0x8c4a, 0x55 => 0x8c65, 0x56 => 0x8c64, 0x57 => 0x8c66,
+    0x58 => 0x8c86, 0x59 => 0x8c84, 0x5a => 0x8c85, 0x5b => 0x8ccc,
+    0x5c => 0x8d68, 0x5d => 0x8d69, 0x5e => 0x8d91, 0x5f => 0x8d8c,
+    0x60 => 0x8d8e, 0x61 => 0x8d8f, 0x62 => 0x8d8d, 0x63 => 0x8d93,
+    0x64 => 0x8d94, 0x65 => 0x8d90, 0x66 => 0x8d92, 0x67 => 0x8df0,
+    0x68 => 0x8de0, 0x69 => 0x8dec, 0x6a => 0x8df1, 0x6b => 0x8dee,
+    0x6c => 0x8dd0, 0x6d => 0x8de9, 0x6e => 0x8de3, 0x6f => 0x8de2,
+    0x70 => 0x8de7, 0x71 => 0x8df2, 0x72 => 0x8deb, 0x73 => 0x8df4,
+    0x74 => 0x8f06, 0x75 => 0x8eff, 0x76 => 0x8f01, 0x77 => 0x8f00,
+    0x78 => 0x8f05, 0x79 => 0x8f07, 0x7a => 0x8f08, 0x7b => 0x8f02,
+    0x7c => 0x8f0b, 0x7d => 0x9052, 0x7e => 0x903f, 0xa1 => 0x9044,
+    0xa2 => 0x9049, 0xa3 => 0x903d, 0xa4 => 0x9110, 0xa5 => 0x910d,
+    0xa6 => 0x910f, 0xa7 => 0x9111, 0xa8 => 0x9116, 0xa9 => 0x9114,
+    0xaa => 0x910b, 0xab => 0x910e, 0xac => 0x916e, 0xad => 0x916f,
+    0xae => 0x9248, 0xaf => 0x9252, 0xb0 => 0x9230, 0xb1 => 0x923a,
+    0xb2 => 0x9266, 0xb3 => 0x9233, 0xb4 => 0x9265, 0xb5 => 0x925e,
+    0xb6 => 0x9283, 0xb7 => 0x922e, 0xb8 => 0x924a, 0xb9 => 0x9246,
+    0xba => 0x926d, 0xbb => 0x926c, 0xbc => 0x924f, 0xbd => 0x9260,
+    0xbe => 0x9267, 0xbf => 0x926f, 0xc0 => 0x9236, 0xc1 => 0x9261,
+    0xc2 => 0x9270, 0xc3 => 0x9231, 0xc4 => 0x9254, 0xc5 => 0x9263,
+    0xc6 => 0x9250, 0xc7 => 0x9272, 0xc8 => 0x924e, 0xc9 => 0x9253,
+    0xca => 0x924c, 0xcb => 0x9256, 0xcc => 0x9232, 0xcd => 0x959f,
+    0xce => 0x959c, 0xcf => 0x959e, 0xd0 => 0x959b, 0xd1 => 0x9692,
+    0xd2 => 0x9693, 0xd3 => 0x9691, 0xd4 => 0x9697, 0xd5 => 0x96ce,
+    0xd6 => 0x96fa, 0xd7 => 0x96fd, 0xd8 => 0x96f8, 0xd9 => 0x96f5,
+    0xda => 0x9773, 0xdb => 0x9777, 0xdc => 0x9778, 0xdd => 0x9772,
+    0xde => 0x980f, 0xdf => 0x980d, 0xe0 => 0x980e, 0xe1 => 0x98ac,
+    0xe2 => 0x98f6, 0xe3 => 0x98f9, 0xe4 => 0x99af, 0xe5 => 0x99b2,
+    0xe6 => 0x99b0, 0xe7 => 0x99b5, 0xe8 => 0x9aad, 0xe9 => 0x9aab,
+    0xea => 0x9b5b, 0xeb => 0x9cea, 0xec => 0x9ced, 0xed => 0x9ce7,
+    0xee => 0x9e80, 0xef => 0x9efd, 0xf0 => 0x50e6, 0xf1 => 0x50d4,
+    0xf2 => 0x50d7, 0xf3 => 0x50e8, 0xf4 => 0x50f3, 0xf5 => 0x50db,
+    0xf6 => 0x50ea, 0xf7 => 0x50dd, 0xf8 => 0x50e4, 0xf9 => 0x50d3,
+    0xfa => 0x50ec, 0xfb => 0x50f0, 0xfc => 0x50ef, 0xfd => 0x50e3,
+    0xfe => 0x50e0,
+  },
+  0xe1 => {
+    0x40 => 0x51d8, 0x41 => 0x5280, 0x42 => 0x5281, 0x43 => 0x52e9,
+    0x44 => 0x52eb, 0x45 => 0x5330, 0x46 => 0x53ac, 0x47 => 0x5627,
+    0x48 => 0x5615, 0x49 => 0x560c, 0x4a => 0x5612, 0x4b => 0x55fc,
+    0x4c => 0x560f, 0x4d => 0x561c, 0x4e => 0x5601, 0x4f => 0x5613,
+    0x50 => 0x5602, 0x51 => 0x55fa, 0x52 => 0x561d, 0x53 => 0x5604,
+    0x54 => 0x55ff, 0x55 => 0x55f9, 0x56 => 0x5889, 0x57 => 0x587c,
+    0x58 => 0x5890, 0x59 => 0x5898, 0x5a => 0x5886, 0x5b => 0x5881,
+    0x5c => 0x587f, 0x5d => 0x5874, 0x5e => 0x588b, 0x5f => 0x587a,
+    0x60 => 0x5887, 0x61 => 0x5891, 0x62 => 0x588e, 0x63 => 0x5876,
+    0x64 => 0x5882, 0x65 => 0x5888, 0x66 => 0x587b, 0x67 => 0x5894,
+    0x68 => 0x588f, 0x69 => 0x58fe, 0x6a => 0x596b, 0x6b => 0x5adc,
+    0x6c => 0x5aee, 0x6d => 0x5ae5, 0x6e => 0x5ad5, 0x6f => 0x5aea,
+    0x70 => 0x5ada, 0x71 => 0x5aed, 0x72 => 0x5aeb, 0x73 => 0x5af3,
+    0x74 => 0x5ae2, 0x75 => 0x5ae0, 0x76 => 0x5adb, 0x77 => 0x5aec,
+    0x78 => 0x5ade, 0x79 => 0x5add, 0x7a => 0x5ad9, 0x7b => 0x5ae8,
+    0x7c => 0x5adf, 0x7d => 0x5b77, 0x7e => 0x5be0, 0xa1 => 0x5be3,
+    0xa2 => 0x5c63, 0xa3 => 0x5d82, 0xa4 => 0x5d80, 0xa5 => 0x5d7d,
+    0xa6 => 0x5d86, 0xa7 => 0x5d7a, 0xa8 => 0x5d81, 0xa9 => 0x5d77,
+    0xaa => 0x5d8a, 0xab => 0x5d89, 0xac => 0x5d88, 0xad => 0x5d7e,
+    0xae => 0x5d7c, 0xaf => 0x5d8d, 0xb0 => 0x5d79, 0xb1 => 0x5d7f,
+    0xb2 => 0x5e58, 0xb3 => 0x5e59, 0xb4 => 0x5e53, 0xb5 => 0x5ed8,
+    0xb6 => 0x5ed1, 0xb7 => 0x5ed7, 0xb8 => 0x5ece, 0xb9 => 0x5edc,
+    0xba => 0x5ed5, 0xbb => 0x5ed9, 0xbc => 0x5ed2, 0xbd => 0x5ed4,
+    0xbe => 0x5f44, 0xbf => 0x5f43, 0xc0 => 0x5f6f, 0xc1 => 0x5fb6,
+    0xc2 => 0x612c, 0xc3 => 0x6128, 0xc4 => 0x6141, 0xc5 => 0x615e,
+    0xc6 => 0x6171, 0xc7 => 0x6173, 0xc8 => 0x6152, 0xc9 => 0x6153,
+    0xca => 0x6172, 0xcb => 0x616c, 0xcc => 0x6180, 0xcd => 0x6174,
+    0xce => 0x6154, 0xcf => 0x617a, 0xd0 => 0x615b, 0xd1 => 0x6165,
+    0xd2 => 0x613b, 0xd3 => 0x616a, 0xd4 => 0x6161, 0xd5 => 0x6156,
+    0xd6 => 0x6229, 0xd7 => 0x6227, 0xd8 => 0x622b, 0xd9 => 0x642b,
+    0xda => 0x644d, 0xdb => 0x645b, 0xdc => 0x645d, 0xdd => 0x6474,
+    0xde => 0x6476, 0xdf => 0x6472, 0xe0 => 0x6473, 0xe1 => 0x647d,
+    0xe2 => 0x6475, 0xe3 => 0x6466, 0xe4 => 0x64a6, 0xe5 => 0x644e,
+    0xe6 => 0x6482, 0xe7 => 0x645e, 0xe8 => 0x645c, 0xe9 => 0x644b,
+    0xea => 0x6453, 0xeb => 0x6460, 0xec => 0x6450, 0xed => 0x647f,
+    0xee => 0x643f, 0xef => 0x646c, 0xf0 => 0x646b, 0xf1 => 0x6459,
+    0xf2 => 0x6465, 0xf3 => 0x6477, 0xf4 => 0x6573, 0xf5 => 0x65a0,
+    0xf6 => 0x66a1, 0xf7 => 0x66a0, 0xf8 => 0x669f, 0xf9 => 0x6705,
+    0xfa => 0x6704, 0xfb => 0x6722, 0xfc => 0x69b1, 0xfd => 0x69b6,
+    0xfe => 0x69c9,
+  },
+  0xe2 => {
+    0x40 => 0x69a0, 0x41 => 0x69ce, 0x42 => 0x6996, 0x43 => 0x69b0,
+    0x44 => 0x69ac, 0x45 => 0x69bc, 0x46 => 0x6991, 0x47 => 0x6999,
+    0x48 => 0x698e, 0x49 => 0x69a7, 0x4a => 0x698d, 0x4b => 0x69a9,
+    0x4c => 0x69be, 0x4d => 0x69af, 0x4e => 0x69bf, 0x4f => 0x69c4,
+    0x50 => 0x69bd, 0x51 => 0x69a4, 0x52 => 0x69d4, 0x53 => 0x69b9,
+    0x54 => 0x69ca, 0x55 => 0x699a, 0x56 => 0x69cf, 0x57 => 0x69b3,
+    0x58 => 0x6993, 0x59 => 0x69aa, 0x5a => 0x69a1, 0x5b => 0x699e,
+    0x5c => 0x69d9, 0x5d => 0x6997, 0x5e => 0x6990, 0x5f => 0x69c2,
+    0x60 => 0x69b5, 0x61 => 0x69a5, 0x62 => 0x69c6, 0x63 => 0x6b4a,
+    0x64 => 0x6b4d, 0x65 => 0x6b4b, 0x66 => 0x6b9e, 0x67 => 0x6b9f,
+    0x68 => 0x6ba0, 0x69 => 0x6bc3, 0x6a => 0x6bc4, 0x6b => 0x6bfe,
+    0x6c => 0x6ece, 0x6d => 0x6ef5, 0x6e => 0x6ef1, 0x6f => 0x6f03,
+    0x70 => 0x6f25, 0x71 => 0x6ef8, 0x72 => 0x6f37, 0x73 => 0x6efb,
+    0x74 => 0x6f2e, 0x75 => 0x6f09, 0x76 => 0x6f4e, 0x77 => 0x6f19,
+    0x78 => 0x6f1a, 0x79 => 0x6f27, 0x7a => 0x6f18, 0x7b => 0x6f3b,
+    0x7c => 0x6f12, 0x7d => 0x6eed, 0x7e => 0x6f0a, 0xa1 => 0x6f36,
+    0xa2 => 0x6f73, 0xa3 => 0x6ef9, 0xa4 => 0x6eee, 0xa5 => 0x6f2d,
+    0xa6 => 0x6f40, 0xa7 => 0x6f30, 0xa8 => 0x6f3c, 0xa9 => 0x6f35,
+    0xaa => 0x6eeb, 0xab => 0x6f07, 0xac => 0x6f0e, 0xad => 0x6f43,
+    0xae => 0x6f05, 0xaf => 0x6efd, 0xb0 => 0x6ef6, 0xb1 => 0x6f39,
+    0xb2 => 0x6f1c, 0xb3 => 0x6efc, 0xb4 => 0x6f3a, 0xb5 => 0x6f1f,
+    0xb6 => 0x6f0d, 0xb7 => 0x6f1e, 0xb8 => 0x6f08, 0xb9 => 0x6f21,
+    0xba => 0x7187, 0xbb => 0x7190, 0xbc => 0x7189, 0xbd => 0x7180,
+    0xbe => 0x7185, 0xbf => 0x7182, 0xc0 => 0x718f, 0xc1 => 0x717b,
+    0xc2 => 0x7186, 0xc3 => 0x7181, 0xc4 => 0x7197, 0xc5 => 0x7244,
+    0xc6 => 0x7253, 0xc7 => 0x7297, 0xc8 => 0x7295, 0xc9 => 0x7293,
+    0xca => 0x7343, 0xcb => 0x734d, 0xcc => 0x7351, 0xcd => 0x734c,
+    0xce => 0x7462, 0xcf => 0x7473, 0xd0 => 0x7471, 0xd1 => 0x7475,
+    0xd2 => 0x7472, 0xd3 => 0x7467, 0xd4 => 0x746e, 0xd5 => 0x7500,
+    0xd6 => 0x7502, 0xd7 => 0x7503, 0xd8 => 0x757d, 0xd9 => 0x7590,
+    0xda => 0x7616, 0xdb => 0x7608, 0xdc => 0x760c, 0xdd => 0x7615,
+    0xde => 0x7611, 0xdf => 0x760a, 0xe0 => 0x7614, 0xe1 => 0x76b8,
+    0xe2 => 0x7781, 0xe3 => 0x777c, 0xe4 => 0x7785, 0xe5 => 0x7782,
+    0xe6 => 0x776e, 0xe7 => 0x7780, 0xe8 => 0x776f, 0xe9 => 0x777e,
+    0xea => 0x7783, 0xeb => 0x78b2, 0xec => 0x78aa, 0xed => 0x78b4,
+    0xee => 0x78ad, 0xef => 0x78a8, 0xf0 => 0x787e, 0xf1 => 0x78ab,
+    0xf2 => 0x789e, 0xf3 => 0x78a5, 0xf4 => 0x78a0, 0xf5 => 0x78ac,
+    0xf6 => 0x78a2, 0xf7 => 0x78a4, 0xf8 => 0x7998, 0xf9 => 0x798a,
+    0xfa => 0x798b, 0xfb => 0x7996, 0xfc => 0x7995, 0xfd => 0x7994,
+    0xfe => 0x7993,
+  },
+  0xe3 => {
+    0x40 => 0x7997, 0x41 => 0x7988, 0x42 => 0x7992, 0x43 => 0x7990,
+    0x44 => 0x7a2b, 0x45 => 0x7a4a, 0x46 => 0x7a30, 0x47 => 0x7a2f,
+    0x48 => 0x7a28, 0x49 => 0x7a26, 0x4a => 0x7aa8, 0x4b => 0x7aab,
+    0x4c => 0x7aac, 0x4d => 0x7aee, 0x4e => 0x7b88, 0x4f => 0x7b9c,
+    0x50 => 0x7b8a, 0x51 => 0x7b91, 0x52 => 0x7b90, 0x53 => 0x7b96,
+    0x54 => 0x7b8d, 0x55 => 0x7b8c, 0x56 => 0x7b9b, 0x57 => 0x7b8e,
+    0x58 => 0x7b85, 0x59 => 0x7b98, 0x5a => 0x5284, 0x5b => 0x7b99,
+    0x5c => 0x7ba4, 0x5d => 0x7b82, 0x5e => 0x7cbb, 0x5f => 0x7cbf,
+    0x60 => 0x7cbc, 0x61 => 0x7cba, 0x62 => 0x7da7, 0x63 => 0x7db7,
+    0x64 => 0x7dc2, 0x65 => 0x7da3, 0x66 => 0x7daa, 0x67 => 0x7dc1,
+    0x68 => 0x7dc0, 0x69 => 0x7dc5, 0x6a => 0x7d9d, 0x6b => 0x7dce,
+    0x6c => 0x7dc4, 0x6d => 0x7dc6, 0x6e => 0x7dcb, 0x6f => 0x7dcc,
+    0x70 => 0x7daf, 0x71 => 0x7db9, 0x72 => 0x7d96, 0x73 => 0x7dbc,
+    0x74 => 0x7d9f, 0x75 => 0x7da6, 0x76 => 0x7dae, 0x77 => 0x7da9,
+    0x78 => 0x7da1, 0x79 => 0x7dc9, 0x7a => 0x7f73, 0x7b => 0x7fe2,
+    0x7c => 0x7fe3, 0x7d => 0x7fe5, 0x7e => 0x7fde, 0xa1 => 0x8024,
+    0xa2 => 0x805d, 0xa3 => 0x805c, 0xa4 => 0x8189, 0xa5 => 0x8186,
+    0xa6 => 0x8183, 0xa7 => 0x8187, 0xa8 => 0x818d, 0xa9 => 0x818c,
+    0xaa => 0x818b, 0xab => 0x8215, 0xac => 0x8497, 0xad => 0x84a4,
+    0xae => 0x84a1, 0xaf => 0x849f, 0xb0 => 0x84ba, 0xb1 => 0x84ce,
+    0xb2 => 0x84c2, 0xb3 => 0x84ac, 0xb4 => 0x84ae, 0xb5 => 0x84ab,
+    0xb6 => 0x84b9, 0xb7 => 0x84b4, 0xb8 => 0x84c1, 0xb9 => 0x84cd,
+    0xba => 0x84aa, 0xbb => 0x849a, 0xbc => 0x84b1, 0xbd => 0x84d0,
+    0xbe => 0x849d, 0xbf => 0x84a7, 0xc0 => 0x84bb, 0xc1 => 0x84a2,
+    0xc2 => 0x8494, 0xc3 => 0x84c7, 0xc4 => 0x84cc, 0xc5 => 0x849b,
+    0xc6 => 0x84a9, 0xc7 => 0x84af, 0xc8 => 0x84a8, 0xc9 => 0x84d6,
+    0xca => 0x8498, 0xcb => 0x84b6, 0xcc => 0x84cf, 0xcd => 0x84a0,
+    0xce => 0x84d7, 0xcf => 0x84d4, 0xd0 => 0x84d2, 0xd1 => 0x84db,
+    0xd2 => 0x84b0, 0xd3 => 0x8491, 0xd4 => 0x8661, 0xd5 => 0x8733,
+    0xd6 => 0x8723, 0xd7 => 0x8728, 0xd8 => 0x876b, 0xd9 => 0x8740,
+    0xda => 0x872e, 0xdb => 0x871e, 0xdc => 0x8721, 0xdd => 0x8719,
+    0xde => 0x871b, 0xdf => 0x8743, 0xe0 => 0x872c, 0xe1 => 0x8741,
+    0xe2 => 0x873e, 0xe3 => 0x8746, 0xe4 => 0x8720, 0xe5 => 0x8732,
+    0xe6 => 0x872a, 0xe7 => 0x872d, 0xe8 => 0x873c, 0xe9 => 0x8712,
+    0xea => 0x873a, 0xeb => 0x8731, 0xec => 0x8735, 0xed => 0x8742,
+    0xee => 0x8726, 0xef => 0x8727, 0xf0 => 0x8738, 0xf1 => 0x8724,
+    0xf2 => 0x871a, 0xf3 => 0x8730, 0xf4 => 0x8711, 0xf5 => 0x88f7,
+    0xf6 => 0x88e7, 0xf7 => 0x88f1, 0xf8 => 0x88f2, 0xf9 => 0x88fa,
+    0xfa => 0x88fe, 0xfb => 0x88ee, 0xfc => 0x88fc, 0xfd => 0x88f6,
+    0xfe => 0x88fb,
+  },
+  0xe4 => {
+    0x40 => 0x88f0, 0x41 => 0x88ec, 0x42 => 0x88eb, 0x43 => 0x899d,
+    0x44 => 0x89a1, 0x45 => 0x899f, 0x46 => 0x899e, 0x47 => 0x89e9,
+    0x48 => 0x89eb, 0x49 => 0x89e8, 0x4a => 0x8aab, 0x4b => 0x8a99,
+    0x4c => 0x8a8b, 0x4d => 0x8a92, 0x4e => 0x8a8f, 0x4f => 0x8a96,
+    0x50 => 0x8c3d, 0x51 => 0x8c68, 0x52 => 0x8c69, 0x53 => 0x8cd5,
+    0x54 => 0x8ccf, 0x55 => 0x8cd7, 0x56 => 0x8d96, 0x57 => 0x8e09,
+    0x58 => 0x8e02, 0x59 => 0x8dff, 0x5a => 0x8e0d, 0x5b => 0x8dfd,
+    0x5c => 0x8e0a, 0x5d => 0x8e03, 0x5e => 0x8e07, 0x5f => 0x8e06,
+    0x60 => 0x8e05, 0x61 => 0x8dfe, 0x62 => 0x8e00, 0x63 => 0x8e04,
+    0x64 => 0x8f10, 0x65 => 0x8f11, 0x66 => 0x8f0e, 0x67 => 0x8f0d,
+    0x68 => 0x9123, 0x69 => 0x911c, 0x6a => 0x9120, 0x6b => 0x9122,
+    0x6c => 0x911f, 0x6d => 0x911d, 0x6e => 0x911a, 0x6f => 0x9124,
+    0x70 => 0x9121, 0x71 => 0x911b, 0x72 => 0x917a, 0x73 => 0x9172,
+    0x74 => 0x9179, 0x75 => 0x9173, 0x76 => 0x92a5, 0x77 => 0x92a4,
+    0x78 => 0x9276, 0x79 => 0x929b, 0x7a => 0x927a, 0x7b => 0x92a0,
+    0x7c => 0x9294, 0x7d => 0x92aa, 0x7e => 0x928d, 0xa1 => 0x92a6,
+    0xa2 => 0x929a, 0xa3 => 0x92ab, 0xa4 => 0x9279, 0xa5 => 0x9297,
+    0xa6 => 0x927f, 0xa7 => 0x92a3, 0xa8 => 0x92ee, 0xa9 => 0x928e,
+    0xaa => 0x9282, 0xab => 0x9295, 0xac => 0x92a2, 0xad => 0x927d,
+    0xae => 0x9288, 0xaf => 0x92a1, 0xb0 => 0x928a, 0xb1 => 0x9286,
+    0xb2 => 0x928c, 0xb3 => 0x9299, 0xb4 => 0x92a7, 0xb5 => 0x927e,
+    0xb6 => 0x9287, 0xb7 => 0x92a9, 0xb8 => 0x929d, 0xb9 => 0x928b,
+    0xba => 0x922d, 0xbb => 0x969e, 0xbc => 0x96a1, 0xbd => 0x96ff,
+    0xbe => 0x9758, 0xbf => 0x977d, 0xc0 => 0x977a, 0xc1 => 0x977e,
+    0xc2 => 0x9783, 0xc3 => 0x9780, 0xc4 => 0x9782, 0xc5 => 0x977b,
+    0xc6 => 0x9784, 0xc7 => 0x9781, 0xc8 => 0x977f, 0xc9 => 0x97ce,
+    0xca => 0x97cd, 0xcb => 0x9816, 0xcc => 0x98ad, 0xcd => 0x98ae,
+    0xce => 0x9902, 0xcf => 0x9900, 0xd0 => 0x9907, 0xd1 => 0x999d,
+    0xd2 => 0x999c, 0xd3 => 0x99c3, 0xd4 => 0x99b9, 0xd5 => 0x99bb,
+    0xd6 => 0x99ba, 0xd7 => 0x99c2, 0xd8 => 0x99bd, 0xd9 => 0x99c7,
+    0xda => 0x9ab1, 0xdb => 0x9ae3, 0xdc => 0x9ae7, 0xdd => 0x9b3e,
+    0xde => 0x9b3f, 0xdf => 0x9b60, 0xe0 => 0x9b61, 0xe1 => 0x9b5f,
+    0xe2 => 0x9cf1, 0xe3 => 0x9cf2, 0xe4 => 0x9cf5, 0xe5 => 0x9ea7,
+    0xe6 => 0x50ff, 0xe7 => 0x5103, 0xe8 => 0x5130, 0xe9 => 0x50f8,
+    0xea => 0x5106, 0xeb => 0x5107, 0xec => 0x50f6, 0xed => 0x50fe,
+    0xee => 0x510b, 0xef => 0x510c, 0xf0 => 0x50fd, 0xf1 => 0x510a,
+    0xf2 => 0x528b, 0xf3 => 0x528c, 0xf4 => 0x52f1, 0xf5 => 0x52ef,
+    0xf6 => 0x5648, 0xf7 => 0x5642, 0xf8 => 0x564c, 0xf9 => 0x5635,
+    0xfa => 0x5641, 0xfb => 0x564a, 0xfc => 0x5649, 0xfd => 0x5646,
+    0xfe => 0x5658,
+  },
+  0xe5 => {
+    0x40 => 0x565a, 0x41 => 0x5640, 0x42 => 0x5633, 0x43 => 0x563d,
+    0x44 => 0x562c, 0x45 => 0x563e, 0x46 => 0x5638, 0x47 => 0x562a,
+    0x48 => 0x563a, 0x49 => 0x571a, 0x4a => 0x58ab, 0x4b => 0x589d,
+    0x4c => 0x58b1, 0x4d => 0x58a0, 0x4e => 0x58a3, 0x4f => 0x58af,
+    0x50 => 0x58ac, 0x51 => 0x58a5, 0x52 => 0x58a1, 0x53 => 0x58ff,
+    0x54 => 0x5aff, 0x55 => 0x5af4, 0x56 => 0x5afd, 0x57 => 0x5af7,
+    0x58 => 0x5af6, 0x59 => 0x5b03, 0x5a => 0x5af8, 0x5b => 0x5b02,
+    0x5c => 0x5af9, 0x5d => 0x5b01, 0x5e => 0x5b07, 0x5f => 0x5b05,
+    0x60 => 0x5b0f, 0x61 => 0x5c67, 0x62 => 0x5d99, 0x63 => 0x5d97,
+    0x64 => 0x5d9f, 0x65 => 0x5d92, 0x66 => 0x5da2, 0x67 => 0x5d93,
+    0x68 => 0x5d95, 0x69 => 0x5da0, 0x6a => 0x5d9c, 0x6b => 0x5da1,
+    0x6c => 0x5d9a, 0x6d => 0x5d9e, 0x6e => 0x5e69, 0x6f => 0x5e5d,
+    0x70 => 0x5e60, 0x71 => 0x5e5c, 0x72 => 0x7df3, 0x73 => 0x5edb,
+    0x74 => 0x5ede, 0x75 => 0x5ee1, 0x76 => 0x5f49, 0x77 => 0x5fb2,
+    0x78 => 0x618b, 0x79 => 0x6183, 0x7a => 0x6179, 0x7b => 0x61b1,
+    0x7c => 0x61b0, 0x7d => 0x61a2, 0x7e => 0x6189, 0xa1 => 0x619b,
+    0xa2 => 0x6193, 0xa3 => 0x61af, 0xa4 => 0x61ad, 0xa5 => 0x619f,
+    0xa6 => 0x6192, 0xa7 => 0x61aa, 0xa8 => 0x61a1, 0xa9 => 0x618d,
+    0xaa => 0x6166, 0xab => 0x61b3, 0xac => 0x622d, 0xad => 0x646e,
+    0xae => 0x6470, 0xaf => 0x6496, 0xb0 => 0x64a0, 0xb1 => 0x6485,
+    0xb2 => 0x6497, 0xb3 => 0x649c, 0xb4 => 0x648f, 0xb5 => 0x648b,
+    0xb6 => 0x648a, 0xb7 => 0x648c, 0xb8 => 0x64a3, 0xb9 => 0x649f,
+    0xba => 0x6468, 0xbb => 0x64b1, 0xbc => 0x6498, 0xbd => 0x6576,
+    0xbe => 0x657a, 0xbf => 0x6579, 0xc0 => 0x657b, 0xc1 => 0x65b2,
+    0xc2 => 0x65b3, 0xc3 => 0x66b5, 0xc4 => 0x66b0, 0xc5 => 0x66a9,
+    0xc6 => 0x66b2, 0xc7 => 0x66b7, 0xc8 => 0x66aa, 0xc9 => 0x66af,
+    0xca => 0x6a00, 0xcb => 0x6a06, 0xcc => 0x6a17, 0xcd => 0x69e5,
+    0xce => 0x69f8, 0xcf => 0x6a15, 0xd0 => 0x69f1, 0xd1 => 0x69e4,
+    0xd2 => 0x6a20, 0xd3 => 0x69ff, 0xd4 => 0x69ec, 0xd5 => 0x69e2,
+    0xd6 => 0x6a1b, 0xd7 => 0x6a1d, 0xd8 => 0x69fe, 0xd9 => 0x6a27,
+    0xda => 0x69f2, 0xdb => 0x69ee, 0xdc => 0x6a14, 0xdd => 0x69f7,
+    0xde => 0x69e7, 0xdf => 0x6a40, 0xe0 => 0x6a08, 0xe1 => 0x69e6,
+    0xe2 => 0x69fb, 0xe3 => 0x6a0d, 0xe4 => 0x69fc, 0xe5 => 0x69eb,
+    0xe6 => 0x6a09, 0xe7 => 0x6a04, 0xe8 => 0x6a18, 0xe9 => 0x6a25,
+    0xea => 0x6a0f, 0xeb => 0x69f6, 0xec => 0x6a26, 0xed => 0x6a07,
+    0xee => 0x69f4, 0xef => 0x6a16, 0xf0 => 0x6b51, 0xf1 => 0x6ba5,
+    0xf2 => 0x6ba3, 0xf3 => 0x6ba2, 0xf4 => 0x6ba6, 0xf5 => 0x6c01,
+    0xf6 => 0x6c00, 0xf7 => 0x6bff, 0xf8 => 0x6c02, 0xf9 => 0x6f41,
+    0xfa => 0x6f26, 0xfb => 0x6f7e, 0xfc => 0x6f87, 0xfd => 0x6fc6,
+    0xfe => 0x6f92,
+  },
+  0xe6 => {
+    0x40 => 0x6f8d, 0x41 => 0x6f89, 0x42 => 0x6f8c, 0x43 => 0x6f62,
+    0x44 => 0x6f4f, 0x45 => 0x6f85, 0x46 => 0x6f5a, 0x47 => 0x6f96,
+    0x48 => 0x6f76, 0x49 => 0x6f6c, 0x4a => 0x6f82, 0x4b => 0x6f55,
+    0x4c => 0x6f72, 0x4d => 0x6f52, 0x4e => 0x6f50, 0x4f => 0x6f57,
+    0x50 => 0x6f94, 0x51 => 0x6f93, 0x52 => 0x6f5d, 0x53 => 0x6f00,
+    0x54 => 0x6f61, 0x55 => 0x6f6b, 0x56 => 0x6f7d, 0x57 => 0x6f67,
+    0x58 => 0x6f90, 0x59 => 0x6f53, 0x5a => 0x6f8b, 0x5b => 0x6f69,
+    0x5c => 0x6f7f, 0x5d => 0x6f95, 0x5e => 0x6f63, 0x5f => 0x6f77,
+    0x60 => 0x6f6a, 0x61 => 0x6f7b, 0x62 => 0x71b2, 0x63 => 0x71af,
+    0x64 => 0x719b, 0x65 => 0x71b0, 0x66 => 0x71a0, 0x67 => 0x719a,
+    0x68 => 0x71a9, 0x69 => 0x71b5, 0x6a => 0x719d, 0x6b => 0x71a5,
+    0x6c => 0x719e, 0x6d => 0x71a4, 0x6e => 0x71a1, 0x6f => 0x71aa,
+    0x70 => 0x719c, 0x71 => 0x71a7, 0x72 => 0x71b3, 0x73 => 0x7298,
+    0x74 => 0x729a, 0x75 => 0x7358, 0x76 => 0x7352, 0x77 => 0x735e,
+    0x78 => 0x735f, 0x79 => 0x7360, 0x7a => 0x735d, 0x7b => 0x735b,
+    0x7c => 0x7361, 0x7d => 0x735a, 0x7e => 0x7359, 0xa1 => 0x7362,
+    0xa2 => 0x7487, 0xa3 => 0x7489, 0xa4 => 0x748a, 0xa5 => 0x7486,
+    0xa6 => 0x7481, 0xa7 => 0x747d, 0xa8 => 0x7485, 0xa9 => 0x7488,
+    0xaa => 0x747c, 0xab => 0x7479, 0xac => 0x7508, 0xad => 0x7507,
+    0xae => 0x757e, 0xaf => 0x7625, 0xb0 => 0x761e, 0xb1 => 0x7619,
+    0xb2 => 0x761d, 0xb3 => 0x761c, 0xb4 => 0x7623, 0xb5 => 0x761a,
+    0xb6 => 0x7628, 0xb7 => 0x761b, 0xb8 => 0x769c, 0xb9 => 0x769d,
+    0xba => 0x769e, 0xbb => 0x769b, 0xbc => 0x778d, 0xbd => 0x778f,
+    0xbe => 0x7789, 0xbf => 0x7788, 0xc0 => 0x78cd, 0xc1 => 0x78bb,
+    0xc2 => 0x78cf, 0xc3 => 0x78cc, 0xc4 => 0x78d1, 0xc5 => 0x78ce,
+    0xc6 => 0x78d4, 0xc7 => 0x78c8, 0xc8 => 0x78c3, 0xc9 => 0x78c4,
+    0xca => 0x78c9, 0xcb => 0x799a, 0xcc => 0x79a1, 0xcd => 0x79a0,
+    0xce => 0x799c, 0xcf => 0x79a2, 0xd0 => 0x799b, 0xd1 => 0x6b76,
+    0xd2 => 0x7a39, 0xd3 => 0x7ab2, 0xd4 => 0x7ab4, 0xd5 => 0x7ab3,
+    0xd6 => 0x7bb7, 0xd7 => 0x7bcb, 0xd8 => 0x7bbe, 0xd9 => 0x7bac,
+    0xda => 0x7bce, 0xdb => 0x7baf, 0xdc => 0x7bb9, 0xdd => 0x7bca,
+    0xde => 0x7bb5, 0xdf => 0x7cc5, 0xe0 => 0x7cc8, 0xe1 => 0x7ccc,
+    0xe2 => 0x7ccb, 0xe3 => 0x7df7, 0xe4 => 0x7ddb, 0xe5 => 0x7dea,
+    0xe6 => 0x7de7, 0xe7 => 0x7dd7, 0xe8 => 0x7de1, 0xe9 => 0x7e03,
+    0xea => 0x7dfa, 0xeb => 0x7de6, 0xec => 0x7df6, 0xed => 0x7df1,
+    0xee => 0x7df0, 0xef => 0x7dee, 0xf0 => 0x7ddf, 0xf1 => 0x7f76,
+    0xf2 => 0x7fac, 0xf3 => 0x7fb0, 0xf4 => 0x7fad, 0xf5 => 0x7fed,
+    0xf6 => 0x7feb, 0xf7 => 0x7fea, 0xf8 => 0x7fec, 0xf9 => 0x7fe6,
+    0xfa => 0x7fe8, 0xfb => 0x8064, 0xfc => 0x8067, 0xfd => 0x81a3,
+    0xfe => 0x819f,
+  },
+  0xe7 => {
+    0x40 => 0x819e, 0x41 => 0x8195, 0x42 => 0x81a2, 0x43 => 0x8199,
+    0x44 => 0x8197, 0x45 => 0x8216, 0x46 => 0x824f, 0x47 => 0x8253,
+    0x48 => 0x8252, 0x49 => 0x8250, 0x4a => 0x824e, 0x4b => 0x8251,
+    0x4c => 0x8524, 0x4d => 0x853b, 0x4e => 0x850f, 0x4f => 0x8500,
+    0x50 => 0x8529, 0x51 => 0x850e, 0x52 => 0x8509, 0x53 => 0x850d,
+    0x54 => 0x851f, 0x55 => 0x850a, 0x56 => 0x8527, 0x57 => 0x851c,
+    0x58 => 0x84fb, 0x59 => 0x852b, 0x5a => 0x84fa, 0x5b => 0x8508,
+    0x5c => 0x850c, 0x5d => 0x84f4, 0x5e => 0x852a, 0x5f => 0x84f2,
+    0x60 => 0x8515, 0x61 => 0x84f7, 0x62 => 0x84eb, 0x63 => 0x84f3,
+    0x64 => 0x84fc, 0x65 => 0x8512, 0x66 => 0x84ea, 0x67 => 0x84e9,
+    0x68 => 0x8516, 0x69 => 0x84fe, 0x6a => 0x8528, 0x6b => 0x851d,
+    0x6c => 0x852e, 0x6d => 0x8502, 0x6e => 0x84fd, 0x6f => 0x851e,
+    0x70 => 0x84f6, 0x71 => 0x8531, 0x72 => 0x8526, 0x73 => 0x84e7,
+    0x74 => 0x84e8, 0x75 => 0x84f0, 0x76 => 0x84ef, 0x77 => 0x84f9,
+    0x78 => 0x8518, 0x79 => 0x8520, 0x7a => 0x8530, 0x7b => 0x850b,
+    0x7c => 0x8519, 0x7d => 0x852f, 0x7e => 0x8662, 0xa1 => 0x8756,
+    0xa2 => 0x8763, 0xa3 => 0x8764, 0xa4 => 0x8777, 0xa5 => 0x87e1,
+    0xa6 => 0x8773, 0xa7 => 0x8758, 0xa8 => 0x8754, 0xa9 => 0x875b,
+    0xaa => 0x8752, 0xab => 0x8761, 0xac => 0x875a, 0xad => 0x8751,
+    0xae => 0x875e, 0xaf => 0x876d, 0xb0 => 0x876a, 0xb1 => 0x8750,
+    0xb2 => 0x874e, 0xb3 => 0x875f, 0xb4 => 0x875d, 0xb5 => 0x876f,
+    0xb6 => 0x876c, 0xb7 => 0x877a, 0xb8 => 0x876e, 0xb9 => 0x875c,
+    0xba => 0x8765, 0xbb => 0x874f, 0xbc => 0x877b, 0xbd => 0x8775,
+    0xbe => 0x8762, 0xbf => 0x8767, 0xc0 => 0x8769, 0xc1 => 0x885a,
+    0xc2 => 0x8905, 0xc3 => 0x890c, 0xc4 => 0x8914, 0xc5 => 0x890b,
+    0xc6 => 0x8917, 0xc7 => 0x8918, 0xc8 => 0x8919, 0xc9 => 0x8906,
+    0xca => 0x8916, 0xcb => 0x8911, 0xcc => 0x890e, 0xcd => 0x8909,
+    0xce => 0x89a2, 0xcf => 0x89a4, 0xd0 => 0x89a3, 0xd1 => 0x89ed,
+    0xd2 => 0x89f0, 0xd3 => 0x89ec, 0xd4 => 0x8acf, 0xd5 => 0x8ac6,
+    0xd6 => 0x8ab8, 0xd7 => 0x8ad3, 0xd8 => 0x8ad1, 0xd9 => 0x8ad4,
+    0xda => 0x8ad5, 0xdb => 0x8abb, 0xdc => 0x8ad7, 0xdd => 0x8abe,
+    0xde => 0x8ac0, 0xdf => 0x8ac5, 0xe0 => 0x8ad8, 0xe1 => 0x8ac3,
+    0xe2 => 0x8aba, 0xe3 => 0x8abd, 0xe4 => 0x8ad9, 0xe5 => 0x8c3e,
+    0xe6 => 0x8c4d, 0xe7 => 0x8c8f, 0xe8 => 0x8ce5, 0xe9 => 0x8cdf,
+    0xea => 0x8cd9, 0xeb => 0x8ce8, 0xec => 0x8cda, 0xed => 0x8cdd,
+    0xee => 0x8ce7, 0xef => 0x8da0, 0xf0 => 0x8d9c, 0xf1 => 0x8da1,
+    0xf2 => 0x8d9b, 0xf3 => 0x8e20, 0xf4 => 0x8e23, 0xf5 => 0x8e25,
+    0xf6 => 0x8e24, 0xf7 => 0x8e2e, 0xf8 => 0x8e15, 0xf9 => 0x8e1b,
+    0xfa => 0x8e16, 0xfb => 0x8e11, 0xfc => 0x8e19, 0xfd => 0x8e26,
+    0xfe => 0x8e27,
+  },
+  0xe8 => {
+    0x40 => 0x8e14, 0x41 => 0x8e12, 0x42 => 0x8e18, 0x43 => 0x8e13,
+    0x44 => 0x8e1c, 0x45 => 0x8e17, 0x46 => 0x8e1a, 0x47 => 0x8f2c,
+    0x48 => 0x8f24, 0x49 => 0x8f18, 0x4a => 0x8f1a, 0x4b => 0x8f20,
+    0x4c => 0x8f23, 0x4d => 0x8f16, 0x4e => 0x8f17, 0x4f => 0x9073,
+    0x50 => 0x9070, 0x51 => 0x906f, 0x52 => 0x9067, 0x53 => 0x906b,
+    0x54 => 0x912f, 0x55 => 0x912b, 0x56 => 0x9129, 0x57 => 0x912a,
+    0x58 => 0x9132, 0x59 => 0x9126, 0x5a => 0x912e, 0x5b => 0x9185,
+    0x5c => 0x9186, 0x5d => 0x918a, 0x5e => 0x9181, 0x5f => 0x9182,
+    0x60 => 0x9184, 0x61 => 0x9180, 0x62 => 0x92d0, 0x63 => 0x92c3,
+    0x64 => 0x92c4, 0x65 => 0x92c0, 0x66 => 0x92d9, 0x67 => 0x92b6,
+    0x68 => 0x92cf, 0x69 => 0x92f1, 0x6a => 0x92df, 0x6b => 0x92d8,
+    0x6c => 0x92e9, 0x6d => 0x92d7, 0x6e => 0x92dd, 0x6f => 0x92cc,
+    0x70 => 0x92ef, 0x71 => 0x92c2, 0x72 => 0x92e8, 0x73 => 0x92ca,
+    0x74 => 0x92c8, 0x75 => 0x92ce, 0x76 => 0x92e6, 0x77 => 0x92cd,
+    0x78 => 0x92d5, 0x79 => 0x92c9, 0x7a => 0x92e0, 0x7b => 0x92de,
+    0x7c => 0x92e7, 0x7d => 0x92d1, 0x7e => 0x92d3, 0xa1 => 0x92b5,
+    0xa2 => 0x92e1, 0xa3 => 0x92c6, 0xa4 => 0x92b4, 0xa5 => 0x957c,
+    0xa6 => 0x95ac, 0xa7 => 0x95ab, 0xa8 => 0x95ae, 0xa9 => 0x95b0,
+    0xaa => 0x96a4, 0xab => 0x96a2, 0xac => 0x96d3, 0xad => 0x9705,
+    0xae => 0x9708, 0xaf => 0x9702, 0xb0 => 0x975a, 0xb1 => 0x978a,
+    0xb2 => 0x978e, 0xb3 => 0x9788, 0xb4 => 0x97d0, 0xb5 => 0x97cf,
+    0xb6 => 0x981e, 0xb7 => 0x981d, 0xb8 => 0x9826, 0xb9 => 0x9829,
+    0xba => 0x9828, 0xbb => 0x9820, 0xbc => 0x981b, 0xbd => 0x9827,
+    0xbe => 0x98b2, 0xbf => 0x9908, 0xc0 => 0x98fa, 0xc1 => 0x9911,
+    0xc2 => 0x9914, 0xc3 => 0x9916, 0xc4 => 0x9917, 0xc5 => 0x9915,
+    0xc6 => 0x99dc, 0xc7 => 0x99cd, 0xc8 => 0x99cf, 0xc9 => 0x99d3,
+    0xca => 0x99d4, 0xcb => 0x99ce, 0xcc => 0x99c9, 0xcd => 0x99d6,
+    0xce => 0x99d8, 0xcf => 0x99cb, 0xd0 => 0x99d7, 0xd1 => 0x99cc,
+    0xd2 => 0x9ab3, 0xd3 => 0x9aec, 0xd4 => 0x9aeb, 0xd5 => 0x9af3,
+    0xd6 => 0x9af2, 0xd7 => 0x9af1, 0xd8 => 0x9b46, 0xd9 => 0x9b43,
+    0xda => 0x9b67, 0xdb => 0x9b74, 0xdc => 0x9b71, 0xdd => 0x9b66,
+    0xde => 0x9b76, 0xdf => 0x9b75, 0xe0 => 0x9b70, 0xe1 => 0x9b68,
+    0xe2 => 0x9b64, 0xe3 => 0x9b6c, 0xe4 => 0x9cfc, 0xe5 => 0x9cfa,
+    0xe6 => 0x9cfd, 0xe7 => 0x9cff, 0xe8 => 0x9cf7, 0xe9 => 0x9d07,
+    0xea => 0x9d00, 0xeb => 0x9cf9, 0xec => 0x9cfb, 0xed => 0x9d08,
+    0xee => 0x9d05, 0xef => 0x9d04, 0xf0 => 0x9e83, 0xf1 => 0x9ed3,
+    0xf2 => 0x9f0f, 0xf3 => 0x9f10, 0xf4 => 0x511c, 0xf5 => 0x5113,
+    0xf6 => 0x5117, 0xf7 => 0x511a, 0xf8 => 0x5111, 0xf9 => 0x51de,
+    0xfa => 0x5334, 0xfb => 0x53e1, 0xfc => 0x5670, 0xfd => 0x5660,
+    0xfe => 0x566e,
+  },
+  0xe9 => {
+    0x40 => 0x5673, 0x41 => 0x5666, 0x42 => 0x5663, 0x43 => 0x566d,
+    0x44 => 0x5672, 0x45 => 0x565e, 0x46 => 0x5677, 0x47 => 0x571c,
+    0x48 => 0x571b, 0x49 => 0x58c8, 0x4a => 0x58bd, 0x4b => 0x58c9,
+    0x4c => 0x58bf, 0x4d => 0x58ba, 0x4e => 0x58c2, 0x4f => 0x58bc,
+    0x50 => 0x58c6, 0x51 => 0x5b17, 0x52 => 0x5b19, 0x53 => 0x5b1b,
+    0x54 => 0x5b21, 0x55 => 0x5b14, 0x56 => 0x5b13, 0x57 => 0x5b10,
+    0x58 => 0x5b16, 0x59 => 0x5b28, 0x5a => 0x5b1a, 0x5b => 0x5b20,
+    0x5c => 0x5b1e, 0x5d => 0x5bef, 0x5e => 0x5dac, 0x5f => 0x5db1,
+    0x60 => 0x5da9, 0x61 => 0x5da7, 0x62 => 0x5db5, 0x63 => 0x5db0,
+    0x64 => 0x5dae, 0x65 => 0x5daa, 0x66 => 0x5da8, 0x67 => 0x5db2,
+    0x68 => 0x5dad, 0x69 => 0x5daf, 0x6a => 0x5db4, 0x6b => 0x5e67,
+    0x6c => 0x5e68, 0x6d => 0x5e66, 0x6e => 0x5e6f, 0x6f => 0x5ee9,
+    0x70 => 0x5ee7, 0x71 => 0x5ee6, 0x72 => 0x5ee8, 0x73 => 0x5ee5,
+    0x74 => 0x5f4b, 0x75 => 0x5fbc, 0x76 => 0x619d, 0x77 => 0x61a8,
+    0x78 => 0x6196, 0x79 => 0x61c5, 0x7a => 0x61b4, 0x7b => 0x61c6,
+    0x7c => 0x61c1, 0x7d => 0x61cc, 0x7e => 0x61ba, 0xa1 => 0x61bf,
+    0xa2 => 0x61b8, 0xa3 => 0x618c, 0xa4 => 0x64d7, 0xa5 => 0x64d6,
+    0xa6 => 0x64d0, 0xa7 => 0x64cf, 0xa8 => 0x64c9, 0xa9 => 0x64bd,
+    0xaa => 0x6489, 0xab => 0x64c3, 0xac => 0x64db, 0xad => 0x64f3,
+    0xae => 0x64d9, 0xaf => 0x6533, 0xb0 => 0x657f, 0xb1 => 0x657c,
+    0xb2 => 0x65a2, 0xb3 => 0x66c8, 0xb4 => 0x66be, 0xb5 => 0x66c0,
+    0xb6 => 0x66ca, 0xb7 => 0x66cb, 0xb8 => 0x66cf, 0xb9 => 0x66bd,
+    0xba => 0x66bb, 0xbb => 0x66ba, 0xbc => 0x66cc, 0xbd => 0x6723,
+    0xbe => 0x6a34, 0xbf => 0x6a66, 0xc0 => 0x6a49, 0xc1 => 0x6a67,
+    0xc2 => 0x6a32, 0xc3 => 0x6a68, 0xc4 => 0x6a3e, 0xc5 => 0x6a5d,
+    0xc6 => 0x6a6d, 0xc7 => 0x6a76, 0xc8 => 0x6a5b, 0xc9 => 0x6a51,
+    0xca => 0x6a28, 0xcb => 0x6a5a, 0xcc => 0x6a3b, 0xcd => 0x6a3f,
+    0xce => 0x6a41, 0xcf => 0x6a6a, 0xd0 => 0x6a64, 0xd1 => 0x6a50,
+    0xd2 => 0x6a4f, 0xd3 => 0x6a54, 0xd4 => 0x6a6f, 0xd5 => 0x6a69,
+    0xd6 => 0x6a60, 0xd7 => 0x6a3c, 0xd8 => 0x6a5e, 0xd9 => 0x6a56,
+    0xda => 0x6a55, 0xdb => 0x6a4d, 0xdc => 0x6a4e, 0xdd => 0x6a46,
+    0xde => 0x6b55, 0xdf => 0x6b54, 0xe0 => 0x6b56, 0xe1 => 0x6ba7,
+    0xe2 => 0x6baa, 0xe3 => 0x6bab, 0xe4 => 0x6bc8, 0xe5 => 0x6bc7,
+    0xe6 => 0x6c04, 0xe7 => 0x6c03, 0xe8 => 0x6c06, 0xe9 => 0x6fad,
+    0xea => 0x6fcb, 0xeb => 0x6fa3, 0xec => 0x6fc7, 0xed => 0x6fbc,
+    0xee => 0x6fce, 0xef => 0x6fc8, 0xf0 => 0x6f5e, 0xf1 => 0x6fc4,
+    0xf2 => 0x6fbd, 0xf3 => 0x6f9e, 0xf4 => 0x6fca, 0xf5 => 0x6fa8,
+    0xf6 => 0x7004, 0xf7 => 0x6fa5, 0xf8 => 0x6fae, 0xf9 => 0x6fba,
+    0xfa => 0x6fac, 0xfb => 0x6faa, 0xfc => 0x6fcf, 0xfd => 0x6fbf,
+    0xfe => 0x6fb8,
+  },
+  0xea => {
+    0x40 => 0x6fa2, 0x41 => 0x6fc9, 0x42 => 0x6fab, 0x43 => 0x6fcd,
+    0x44 => 0x6faf, 0x45 => 0x6fb2, 0x46 => 0x6fb0, 0x47 => 0x71c5,
+    0x48 => 0x71c2, 0x49 => 0x71bf, 0x4a => 0x71b8, 0x4b => 0x71d6,
+    0x4c => 0x71c0, 0x4d => 0x71c1, 0x4e => 0x71cb, 0x4f => 0x71d4,
+    0x50 => 0x71ca, 0x51 => 0x71c7, 0x52 => 0x71cf, 0x53 => 0x71bd,
+    0x54 => 0x71d8, 0x55 => 0x71bc, 0x56 => 0x71c6, 0x57 => 0x71da,
+    0x58 => 0x71db, 0x59 => 0x729d, 0x5a => 0x729e, 0x5b => 0x7369,
+    0x5c => 0x7366, 0x5d => 0x7367, 0x5e => 0x736c, 0x5f => 0x7365,
+    0x60 => 0x736b, 0x61 => 0x736a, 0x62 => 0x747f, 0x63 => 0x749a,
+    0x64 => 0x74a0, 0x65 => 0x7494, 0x66 => 0x7492, 0x67 => 0x7495,
+    0x68 => 0x74a1, 0x69 => 0x750b, 0x6a => 0x7580, 0x6b => 0x762f,
+    0x6c => 0x762d, 0x6d => 0x7631, 0x6e => 0x763d, 0x6f => 0x7633,
+    0x70 => 0x763c, 0x71 => 0x7635, 0x72 => 0x7632, 0x73 => 0x7630,
+    0x74 => 0x76bb, 0x75 => 0x76e6, 0x76 => 0x779a, 0x77 => 0x779d,
+    0x78 => 0x77a1, 0x79 => 0x779c, 0x7a => 0x779b, 0x7b => 0x77a2,
+    0x7c => 0x77a3, 0x7d => 0x7795, 0x7e => 0x7799, 0xa1 => 0x7797,
+    0xa2 => 0x78dd, 0xa3 => 0x78e9, 0xa4 => 0x78e5, 0xa5 => 0x78ea,
+    0xa6 => 0x78de, 0xa7 => 0x78e3, 0xa8 => 0x78db, 0xa9 => 0x78e1,
+    0xaa => 0x78e2, 0xab => 0x78ed, 0xac => 0x78df, 0xad => 0x78e0,
+    0xae => 0x79a4, 0xaf => 0x7a44, 0xb0 => 0x7a48, 0xb1 => 0x7a47,
+    0xb2 => 0x7ab6, 0xb3 => 0x7ab8, 0xb4 => 0x7ab5, 0xb5 => 0x7ab1,
+    0xb6 => 0x7ab7, 0xb7 => 0x7bde, 0xb8 => 0x7be3, 0xb9 => 0x7be7,
+    0xba => 0x7bdd, 0xbb => 0x7bd5, 0xbc => 0x7be5, 0xbd => 0x7bda,
+    0xbe => 0x7be8, 0xbf => 0x7bf9, 0xc0 => 0x7bd4, 0xc1 => 0x7bea,
+    0xc2 => 0x7be2, 0xc3 => 0x7bdc, 0xc4 => 0x7beb, 0xc5 => 0x7bd8,
+    0xc6 => 0x7bdf, 0xc7 => 0x7cd2, 0xc8 => 0x7cd4, 0xc9 => 0x7cd7,
+    0xca => 0x7cd0, 0xcb => 0x7cd1, 0xcc => 0x7e12, 0xcd => 0x7e21,
+    0xce => 0x7e17, 0xcf => 0x7e0c, 0xd0 => 0x7e1f, 0xd1 => 0x7e20,
+    0xd2 => 0x7e13, 0xd3 => 0x7e0e, 0xd4 => 0x7e1c, 0xd5 => 0x7e15,
+    0xd6 => 0x7e1a, 0xd7 => 0x7e22, 0xd8 => 0x7e0b, 0xd9 => 0x7e0f,
+    0xda => 0x7e16, 0xdb => 0x7e0d, 0xdc => 0x7e14, 0xdd => 0x7e25,
+    0xde => 0x7e24, 0xdf => 0x7f43, 0xe0 => 0x7f7b, 0xe1 => 0x7f7c,
+    0xe2 => 0x7f7a, 0xe3 => 0x7fb1, 0xe4 => 0x7fef, 0xe5 => 0x802a,
+    0xe6 => 0x8029, 0xe7 => 0x806c, 0xe8 => 0x81b1, 0xe9 => 0x81a6,
+    0xea => 0x81ae, 0xeb => 0x81b9, 0xec => 0x81b5, 0xed => 0x81ab,
+    0xee => 0x81b0, 0xef => 0x81ac, 0xf0 => 0x81b4, 0xf1 => 0x81b2,
+    0xf2 => 0x81b7, 0xf3 => 0x81a7, 0xf4 => 0x81f2, 0xf5 => 0x8255,
+    0xf6 => 0x8256, 0xf7 => 0x8257, 0xf8 => 0x8556, 0xf9 => 0x8545,
+    0xfa => 0x856b, 0xfb => 0x854d, 0xfc => 0x8553, 0xfd => 0x8561,
+    0xfe => 0x8558,
+  },
+  0xeb => {
+    0x40 => 0x8540, 0x41 => 0x8546, 0x42 => 0x8564, 0x43 => 0x8541,
+    0x44 => 0x8562, 0x45 => 0x8544, 0x46 => 0x8551, 0x47 => 0x8547,
+    0x48 => 0x8563, 0x49 => 0x853e, 0x4a => 0x855b, 0x4b => 0x8571,
+    0x4c => 0x854e, 0x4d => 0x856e, 0x4e => 0x8575, 0x4f => 0x8555,
+    0x50 => 0x8567, 0x51 => 0x8560, 0x52 => 0x858c, 0x53 => 0x8566,
+    0x54 => 0x855d, 0x55 => 0x8554, 0x56 => 0x8565, 0x57 => 0x856c,
+    0x58 => 0x8663, 0x59 => 0x8665, 0x5a => 0x8664, 0x5b => 0x879b,
+    0x5c => 0x878f, 0x5d => 0x8797, 0x5e => 0x8793, 0x5f => 0x8792,
+    0x60 => 0x8788, 0x61 => 0x8781, 0x62 => 0x8796, 0x63 => 0x8798,
+    0x64 => 0x8779, 0x65 => 0x8787, 0x66 => 0x87a3, 0x67 => 0x8785,
+    0x68 => 0x8790, 0x69 => 0x8791, 0x6a => 0x879d, 0x6b => 0x8784,
+    0x6c => 0x8794, 0x6d => 0x879c, 0x6e => 0x879a, 0x6f => 0x8789,
+    0x70 => 0x891e, 0x71 => 0x8926, 0x72 => 0x8930, 0x73 => 0x892d,
+    0x74 => 0x892e, 0x75 => 0x8927, 0x76 => 0x8931, 0x77 => 0x8922,
+    0x78 => 0x8929, 0x79 => 0x8923, 0x7a => 0x892f, 0x7b => 0x892c,
+    0x7c => 0x891f, 0x7d => 0x89f1, 0x7e => 0x8ae0, 0xa1 => 0x8ae2,
+    0xa2 => 0x8af2, 0xa3 => 0x8af4, 0xa4 => 0x8af5, 0xa5 => 0x8add,
+    0xa6 => 0x8b14, 0xa7 => 0x8ae4, 0xa8 => 0x8adf, 0xa9 => 0x8af0,
+    0xaa => 0x8ac8, 0xab => 0x8ade, 0xac => 0x8ae1, 0xad => 0x8ae8,
+    0xae => 0x8aff, 0xaf => 0x8aef, 0xb0 => 0x8afb, 0xb1 => 0x8c91,
+    0xb2 => 0x8c92, 0xb3 => 0x8c90, 0xb4 => 0x8cf5, 0xb5 => 0x8cee,
+    0xb6 => 0x8cf1, 0xb7 => 0x8cf0, 0xb8 => 0x8cf3, 0xb9 => 0x8d6c,
+    0xba => 0x8d6e, 0xbb => 0x8da5, 0xbc => 0x8da7, 0xbd => 0x8e33,
+    0xbe => 0x8e3e, 0xbf => 0x8e38, 0xc0 => 0x8e40, 0xc1 => 0x8e45,
+    0xc2 => 0x8e36, 0xc3 => 0x8e3c, 0xc4 => 0x8e3d, 0xc5 => 0x8e41,
+    0xc6 => 0x8e30, 0xc7 => 0x8e3f, 0xc8 => 0x8ebd, 0xc9 => 0x8f36,
+    0xca => 0x8f2e, 0xcb => 0x8f35, 0xcc => 0x8f32, 0xcd => 0x8f39,
+    0xce => 0x8f37, 0xcf => 0x8f34, 0xd0 => 0x9076, 0xd1 => 0x9079,
+    0xd2 => 0x907b, 0xd3 => 0x9086, 0xd4 => 0x90fa, 0xd5 => 0x9133,
+    0xd6 => 0x9135, 0xd7 => 0x9136, 0xd8 => 0x9193, 0xd9 => 0x9190,
+    0xda => 0x9191, 0xdb => 0x918d, 0xdc => 0x918f, 0xdd => 0x9327,
+    0xde => 0x931e, 0xdf => 0x9308, 0xe0 => 0x931f, 0xe1 => 0x9306,
+    0xe2 => 0x930f, 0xe3 => 0x937a, 0xe4 => 0x9338, 0xe5 => 0x933c,
+    0xe6 => 0x931b, 0xe7 => 0x9323, 0xe8 => 0x9312, 0xe9 => 0x9301,
+    0xea => 0x9346, 0xeb => 0x932d, 0xec => 0x930e, 0xed => 0x930d,
+    0xee => 0x92cb, 0xef => 0x931d, 0xf0 => 0x92fa, 0xf1 => 0x9325,
+    0xf2 => 0x9313, 0xf3 => 0x92f9, 0xf4 => 0x92f7, 0xf5 => 0x9334,
+    0xf6 => 0x9302, 0xf7 => 0x9324, 0xf8 => 0x92ff, 0xf9 => 0x9329,
+    0xfa => 0x9339, 0xfb => 0x9335, 0xfc => 0x932a, 0xfd => 0x9314,
+    0xfe => 0x930c,
+  },
+  0xec => {
+    0x40 => 0x930b, 0x41 => 0x92fe, 0x42 => 0x9309, 0x43 => 0x9300,
+    0x44 => 0x92fb, 0x45 => 0x9316, 0x46 => 0x95bc, 0x47 => 0x95cd,
+    0x48 => 0x95be, 0x49 => 0x95b9, 0x4a => 0x95ba, 0x4b => 0x95b6,
+    0x4c => 0x95bf, 0x4d => 0x95b5, 0x4e => 0x95bd, 0x4f => 0x96a9,
+    0x50 => 0x96d4, 0x51 => 0x970b, 0x52 => 0x9712, 0x53 => 0x9710,
+    0x54 => 0x9799, 0x55 => 0x9797, 0x56 => 0x9794, 0x57 => 0x97f0,
+    0x58 => 0x97f8, 0x59 => 0x9835, 0x5a => 0x982f, 0x5b => 0x9832,
+    0x5c => 0x9924, 0x5d => 0x991f, 0x5e => 0x9927, 0x5f => 0x9929,
+    0x60 => 0x999e, 0x61 => 0x99ee, 0x62 => 0x99ec, 0x63 => 0x99e5,
+    0x64 => 0x99e4, 0x65 => 0x99f0, 0x66 => 0x99e3, 0x67 => 0x99ea,
+    0x68 => 0x99e9, 0x69 => 0x99e7, 0x6a => 0x9ab9, 0x6b => 0x9abf,
+    0x6c => 0x9ab4, 0x6d => 0x9abb, 0x6e => 0x9af6, 0x6f => 0x9afa,
+    0x70 => 0x9af9, 0x71 => 0x9af7, 0x72 => 0x9b33, 0x73 => 0x9b80,
+    0x74 => 0x9b85, 0x75 => 0x9b87, 0x76 => 0x9b7c, 0x77 => 0x9b7e,
+    0x78 => 0x9b7b, 0x79 => 0x9b82, 0x7a => 0x9b93, 0x7b => 0x9b92,
+    0x7c => 0x9b90, 0x7d => 0x9b7a, 0x7e => 0x9b95, 0xa1 => 0x9b7d,
+    0xa2 => 0x9b88, 0xa3 => 0x9d25, 0xa4 => 0x9d17, 0xa5 => 0x9d20,
+    0xa6 => 0x9d1e, 0xa7 => 0x9d14, 0xa8 => 0x9d29, 0xa9 => 0x9d1d,
+    0xaa => 0x9d18, 0xab => 0x9d22, 0xac => 0x9d10, 0xad => 0x9d19,
+    0xae => 0x9d1f, 0xaf => 0x9e88, 0xb0 => 0x9e86, 0xb1 => 0x9e87,
+    0xb2 => 0x9eae, 0xb3 => 0x9ead, 0xb4 => 0x9ed5, 0xb5 => 0x9ed6,
+    0xb6 => 0x9efa, 0xb7 => 0x9f12, 0xb8 => 0x9f3d, 0xb9 => 0x5126,
+    0xba => 0x5125, 0xbb => 0x5122, 0xbc => 0x5124, 0xbd => 0x5120,
+    0xbe => 0x5129, 0xbf => 0x52f4, 0xc0 => 0x5693, 0xc1 => 0x568c,
+    0xc2 => 0x568d, 0xc3 => 0x5686, 0xc4 => 0x5684, 0xc5 => 0x5683,
+    0xc6 => 0x567e, 0xc7 => 0x5682, 0xc8 => 0x567f, 0xc9 => 0x5681,
+    0xca => 0x58d6, 0xcb => 0x58d4, 0xcc => 0x58cf, 0xcd => 0x58d2,
+    0xce => 0x5b2d, 0xcf => 0x5b25, 0xd0 => 0x5b32, 0xd1 => 0x5b23,
+    0xd2 => 0x5b2c, 0xd3 => 0x5b27, 0xd4 => 0x5b26, 0xd5 => 0x5b2f,
+    0xd6 => 0x5b2e, 0xd7 => 0x5b7b, 0xd8 => 0x5bf1, 0xd9 => 0x5bf2,
+    0xda => 0x5db7, 0xdb => 0x5e6c, 0xdc => 0x5e6a, 0xdd => 0x5fbe,
+    0xde => 0x5fbb, 0xdf => 0x61c3, 0xe0 => 0x61b5, 0xe1 => 0x61bc,
+    0xe2 => 0x61e7, 0xe3 => 0x61e0, 0xe4 => 0x61e5, 0xe5 => 0x61e4,
+    0xe6 => 0x61e8, 0xe7 => 0x61de, 0xe8 => 0x64ef, 0xe9 => 0x64e9,
+    0xea => 0x64e3, 0xeb => 0x64eb, 0xec => 0x64e4, 0xed => 0x64e8,
+    0xee => 0x6581, 0xef => 0x6580, 0xf0 => 0x65b6, 0xf1 => 0x65da,
+    0xf2 => 0x66d2, 0xf3 => 0x6a8d, 0xf4 => 0x6a96, 0xf5 => 0x6a81,
+    0xf6 => 0x6aa5, 0xf7 => 0x6a89, 0xf8 => 0x6a9f, 0xf9 => 0x6a9b,
+    0xfa => 0x6aa1, 0xfb => 0x6a9e, 0xfc => 0x6a87, 0xfd => 0x6a93,
+    0xfe => 0x6a8e,
+  },
+  0xed => {
+    0x40 => 0x6a95, 0x41 => 0x6a83, 0x42 => 0x6aa8, 0x43 => 0x6aa4,
+    0x44 => 0x6a91, 0x45 => 0x6a7f, 0x46 => 0x6aa6, 0x47 => 0x6a9a,
+    0x48 => 0x6a85, 0x49 => 0x6a8c, 0x4a => 0x6a92, 0x4b => 0x6b5b,
+    0x4c => 0x6bad, 0x4d => 0x6c09, 0x4e => 0x6fcc, 0x4f => 0x6fa9,
+    0x50 => 0x6ff4, 0x51 => 0x6fd4, 0x52 => 0x6fe3, 0x53 => 0x6fdc,
+    0x54 => 0x6fed, 0x55 => 0x6fe7, 0x56 => 0x6fe6, 0x57 => 0x6fde,
+    0x58 => 0x6ff2, 0x59 => 0x6fdd, 0x5a => 0x6fe2, 0x5b => 0x6fe8,
+    0x5c => 0x71e1, 0x5d => 0x71f1, 0x5e => 0x71e8, 0x5f => 0x71f2,
+    0x60 => 0x71e4, 0x61 => 0x71f0, 0x62 => 0x71e2, 0x63 => 0x7373,
+    0x64 => 0x736e, 0x65 => 0x736f, 0x66 => 0x7497, 0x67 => 0x74b2,
+    0x68 => 0x74ab, 0x69 => 0x7490, 0x6a => 0x74aa, 0x6b => 0x74ad,
+    0x6c => 0x74b1, 0x6d => 0x74a5, 0x6e => 0x74af, 0x6f => 0x7510,
+    0x70 => 0x7511, 0x71 => 0x7512, 0x72 => 0x750f, 0x73 => 0x7584,
+    0x74 => 0x7643, 0x75 => 0x7648, 0x76 => 0x7649, 0x77 => 0x7647,
+    0x78 => 0x76a4, 0x79 => 0x76e9, 0x7a => 0x77b5, 0x7b => 0x77ab,
+    0x7c => 0x77b2, 0x7d => 0x77b7, 0x7e => 0x77b6, 0xa1 => 0x77b4,
+    0xa2 => 0x77b1, 0xa3 => 0x77a8, 0xa4 => 0x77f0, 0xa5 => 0x78f3,
+    0xa6 => 0x78fd, 0xa7 => 0x7902, 0xa8 => 0x78fb, 0xa9 => 0x78fc,
+    0xaa => 0x78f2, 0xab => 0x7905, 0xac => 0x78f9, 0xad => 0x78fe,
+    0xae => 0x7904, 0xaf => 0x79ab, 0xb0 => 0x79a8, 0xb1 => 0x7a5c,
+    0xb2 => 0x7a5b, 0xb3 => 0x7a56, 0xb4 => 0x7a58, 0xb5 => 0x7a54,
+    0xb6 => 0x7a5a, 0xb7 => 0x7abe, 0xb8 => 0x7ac0, 0xb9 => 0x7ac1,
+    0xba => 0x7c05, 0xbb => 0x7c0f, 0xbc => 0x7bf2, 0xbd => 0x7c00,
+    0xbe => 0x7bff, 0xbf => 0x7bfb, 0xc0 => 0x7c0e, 0xc1 => 0x7bf4,
+    0xc2 => 0x7c0b, 0xc3 => 0x7bf3, 0xc4 => 0x7c02, 0xc5 => 0x7c09,
+    0xc6 => 0x7c03, 0xc7 => 0x7c01, 0xc8 => 0x7bf8, 0xc9 => 0x7bfd,
+    0xca => 0x7c06, 0xcb => 0x7bf0, 0xcc => 0x7bf1, 0xcd => 0x7c10,
+    0xce => 0x7c0a, 0xcf => 0x7ce8, 0xd0 => 0x7e2d, 0xd1 => 0x7e3c,
+    0xd2 => 0x7e42, 0xd3 => 0x7e33, 0xd4 => 0x9848, 0xd5 => 0x7e38,
+    0xd6 => 0x7e2a, 0xd7 => 0x7e49, 0xd8 => 0x7e40, 0xd9 => 0x7e47,
+    0xda => 0x7e29, 0xdb => 0x7e4c, 0xdc => 0x7e30, 0xdd => 0x7e3b,
+    0xde => 0x7e36, 0xdf => 0x7e44, 0xe0 => 0x7e3a, 0xe1 => 0x7f45,
+    0xe2 => 0x7f7f, 0xe3 => 0x7f7e, 0xe4 => 0x7f7d, 0xe5 => 0x7ff4,
+    0xe6 => 0x7ff2, 0xe7 => 0x802c, 0xe8 => 0x81bb, 0xe9 => 0x81c4,
+    0xea => 0x81cc, 0xeb => 0x81ca, 0xec => 0x81c5, 0xed => 0x81c7,
+    0xee => 0x81bc, 0xef => 0x81e9, 0xf0 => 0x825b, 0xf1 => 0x825a,
+    0xf2 => 0x825c, 0xf3 => 0x8583, 0xf4 => 0x8580, 0xf5 => 0x858f,
+    0xf6 => 0x85a7, 0xf7 => 0x8595, 0xf8 => 0x85a0, 0xf9 => 0x858b,
+    0xfa => 0x85a3, 0xfb => 0x857b, 0xfc => 0x85a4, 0xfd => 0x859a,
+    0xfe => 0x859e,
+  },
+  0xee => {
+    0x40 => 0x8577, 0x41 => 0x857c, 0x42 => 0x8589, 0x43 => 0x85a1,
+    0x44 => 0x857a, 0x45 => 0x8578, 0x46 => 0x8557, 0x47 => 0x858e,
+    0x48 => 0x8596, 0x49 => 0x8586, 0x4a => 0x858d, 0x4b => 0x8599,
+    0x4c => 0x859d, 0x4d => 0x8581, 0x4e => 0x85a2, 0x4f => 0x8582,
+    0x50 => 0x8588, 0x51 => 0x8585, 0x52 => 0x8579, 0x53 => 0x8576,
+    0x54 => 0x8598, 0x55 => 0x8590, 0x56 => 0x859f, 0x57 => 0x8668,
+    0x58 => 0x87be, 0x59 => 0x87aa, 0x5a => 0x87ad, 0x5b => 0x87c5,
+    0x5c => 0x87b0, 0x5d => 0x87ac, 0x5e => 0x87b9, 0x5f => 0x87b5,
+    0x60 => 0x87bc, 0x61 => 0x87ae, 0x62 => 0x87c9, 0x63 => 0x87c3,
+    0x64 => 0x87c2, 0x65 => 0x87cc, 0x66 => 0x87b7, 0x67 => 0x87af,
+    0x68 => 0x87c4, 0x69 => 0x87ca, 0x6a => 0x87b4, 0x6b => 0x87b6,
+    0x6c => 0x87bf, 0x6d => 0x87b8, 0x6e => 0x87bd, 0x6f => 0x87de,
+    0x70 => 0x87b2, 0x71 => 0x8935, 0x72 => 0x8933, 0x73 => 0x893c,
+    0x74 => 0x893e, 0x75 => 0x8941, 0x76 => 0x8952, 0x77 => 0x8937,
+    0x78 => 0x8942, 0x79 => 0x89ad, 0x7a => 0x89af, 0x7b => 0x89ae,
+    0x7c => 0x89f2, 0x7d => 0x89f3, 0x7e => 0x8b1e, 0xa1 => 0x8b18,
+    0xa2 => 0x8b16, 0xa3 => 0x8b11, 0xa4 => 0x8b05, 0xa5 => 0x8b0b,
+    0xa6 => 0x8b22, 0xa7 => 0x8b0f, 0xa8 => 0x8b12, 0xa9 => 0x8b15,
+    0xaa => 0x8b07, 0xab => 0x8b0d, 0xac => 0x8b08, 0xad => 0x8b06,
+    0xae => 0x8b1c, 0xaf => 0x8b13, 0xb0 => 0x8b1a, 0xb1 => 0x8c4f,
+    0xb2 => 0x8c70, 0xb3 => 0x8c72, 0xb4 => 0x8c71, 0xb5 => 0x8c6f,
+    0xb6 => 0x8c95, 0xb7 => 0x8c94, 0xb8 => 0x8cf9, 0xb9 => 0x8d6f,
+    0xba => 0x8e4e, 0xbb => 0x8e4d, 0xbc => 0x8e53, 0xbd => 0x8e50,
+    0xbe => 0x8e4c, 0xbf => 0x8e47, 0xc0 => 0x8f43, 0xc1 => 0x8f40,
+    0xc2 => 0x9085, 0xc3 => 0x907e, 0xc4 => 0x9138, 0xc5 => 0x919a,
+    0xc6 => 0x91a2, 0xc7 => 0x919b, 0xc8 => 0x9199, 0xc9 => 0x919f,
+    0xca => 0x91a1, 0xcb => 0x919d, 0xcc => 0x91a0, 0xcd => 0x93a1,
+    0xce => 0x9383, 0xcf => 0x93af, 0xd0 => 0x9364, 0xd1 => 0x9356,
+    0xd2 => 0x9347, 0xd3 => 0x937c, 0xd4 => 0x9358, 0xd5 => 0x935c,
+    0xd6 => 0x9376, 0xd7 => 0x9349, 0xd8 => 0x9350, 0xd9 => 0x9351,
+    0xda => 0x9360, 0xdb => 0x936d, 0xdc => 0x938f, 0xdd => 0x934c,
+    0xde => 0x936a, 0xdf => 0x9379, 0xe0 => 0x9357, 0xe1 => 0x9355,
+    0xe2 => 0x9352, 0xe3 => 0x934f, 0xe4 => 0x9371, 0xe5 => 0x9377,
+    0xe6 => 0x937b, 0xe7 => 0x9361, 0xe8 => 0x935e, 0xe9 => 0x9363,
+    0xea => 0x9367, 0xeb => 0x9380, 0xec => 0x934e, 0xed => 0x9359,
+    0xee => 0x95c7, 0xef => 0x95c0, 0xf0 => 0x95c9, 0xf1 => 0x95c3,
+    0xf2 => 0x95c5, 0xf3 => 0x95b7, 0xf4 => 0x96ae, 0xf5 => 0x96b0,
+    0xf6 => 0x96ac, 0xf7 => 0x9720, 0xf8 => 0x971f, 0xf9 => 0x9718,
+    0xfa => 0x971d, 0xfb => 0x9719, 0xfc => 0x979a, 0xfd => 0x97a1,
+    0xfe => 0x979c,
+  },
+  0xef => {
+    0x40 => 0x979e, 0x41 => 0x979d, 0x42 => 0x97d5, 0x43 => 0x97d4,
+    0x44 => 0x97f1, 0x45 => 0x9841, 0x46 => 0x9844, 0x47 => 0x984a,
+    0x48 => 0x9849, 0x49 => 0x9845, 0x4a => 0x9843, 0x4b => 0x9925,
+    0x4c => 0x992b, 0x4d => 0x992c, 0x4e => 0x992a, 0x4f => 0x9933,
+    0x50 => 0x9932, 0x51 => 0x992f, 0x52 => 0x992d, 0x53 => 0x9931,
+    0x54 => 0x9930, 0x55 => 0x9998, 0x56 => 0x99a3, 0x57 => 0x99a1,
+    0x58 => 0x9a02, 0x59 => 0x99fa, 0x5a => 0x99f4, 0x5b => 0x99f7,
+    0x5c => 0x99f9, 0x5d => 0x99f8, 0x5e => 0x99f6, 0x5f => 0x99fb,
+    0x60 => 0x99fd, 0x61 => 0x99fe, 0x62 => 0x99fc, 0x63 => 0x9a03,
+    0x64 => 0x9abe, 0x65 => 0x9afe, 0x66 => 0x9afd, 0x67 => 0x9b01,
+    0x68 => 0x9afc, 0x69 => 0x9b48, 0x6a => 0x9b9a, 0x6b => 0x9ba8,
+    0x6c => 0x9b9e, 0x6d => 0x9b9b, 0x6e => 0x9ba6, 0x6f => 0x9ba1,
+    0x70 => 0x9ba5, 0x71 => 0x9ba4, 0x72 => 0x9b86, 0x73 => 0x9ba2,
+    0x74 => 0x9ba0, 0x75 => 0x9baf, 0x76 => 0x9d33, 0x77 => 0x9d41,
+    0x78 => 0x9d67, 0x79 => 0x9d36, 0x7a => 0x9d2e, 0x7b => 0x9d2f,
+    0x7c => 0x9d31, 0x7d => 0x9d38, 0x7e => 0x9d30, 0xa1 => 0x9d45,
+    0xa2 => 0x9d42, 0xa3 => 0x9d43, 0xa4 => 0x9d3e, 0xa5 => 0x9d37,
+    0xa6 => 0x9d40, 0xa7 => 0x9d3d, 0xa8 => 0x7ff5, 0xa9 => 0x9d2d,
+    0xaa => 0x9e8a, 0xab => 0x9e89, 0xac => 0x9e8d, 0xad => 0x9eb0,
+    0xae => 0x9ec8, 0xaf => 0x9eda, 0xb0 => 0x9efb, 0xb1 => 0x9eff,
+    0xb2 => 0x9f24, 0xb3 => 0x9f23, 0xb4 => 0x9f22, 0xb5 => 0x9f54,
+    0xb6 => 0x9fa0, 0xb7 => 0x5131, 0xb8 => 0x512d, 0xb9 => 0x512e,
+    0xba => 0x5698, 0xbb => 0x569c, 0xbc => 0x5697, 0xbd => 0x569a,
+    0xbe => 0x569d, 0xbf => 0x5699, 0xc0 => 0x5970, 0xc1 => 0x5b3c,
+    0xc2 => 0x5c69, 0xc3 => 0x5c6a, 0xc4 => 0x5dc0, 0xc5 => 0x5e6d,
+    0xc6 => 0x5e6e, 0xc7 => 0x61d8, 0xc8 => 0x61df, 0xc9 => 0x61ed,
+    0xca => 0x61ee, 0xcb => 0x61f1, 0xcc => 0x61ea, 0xcd => 0x61f0,
+    0xce => 0x61eb, 0xcf => 0x61d6, 0xd0 => 0x61e9, 0xd1 => 0x64ff,
+    0xd2 => 0x6504, 0xd3 => 0x64fd, 0xd4 => 0x64f8, 0xd5 => 0x6501,
+    0xd6 => 0x6503, 0xd7 => 0x64fc, 0xd8 => 0x6594, 0xd9 => 0x65db,
+    0xda => 0x66da, 0xdb => 0x66db, 0xdc => 0x66d8, 0xdd => 0x6ac5,
+    0xde => 0x6ab9, 0xdf => 0x6abd, 0xe0 => 0x6ae1, 0xe1 => 0x6ac6,
+    0xe2 => 0x6aba, 0xe3 => 0x6ab6, 0xe4 => 0x6ab7, 0xe5 => 0x6ac7,
+    0xe6 => 0x6ab4, 0xe7 => 0x6aad, 0xe8 => 0x6b5e, 0xe9 => 0x6bc9,
+    0xea => 0x6c0b, 0xeb => 0x7007, 0xec => 0x700c, 0xed => 0x700d,
+    0xee => 0x7001, 0xef => 0x7005, 0xf0 => 0x7014, 0xf1 => 0x700e,
+    0xf2 => 0x6fff, 0xf3 => 0x7000, 0xf4 => 0x6ffb, 0xf5 => 0x7026,
+    0xf6 => 0x6ffc, 0xf7 => 0x6ff7, 0xf8 => 0x700a, 0xf9 => 0x7201,
+    0xfa => 0x71ff, 0xfb => 0x71f9, 0xfc => 0x7203, 0xfd => 0x71fd,
+    0xfe => 0x7376,
+  },
+  0xf0 => {
+    0x40 => 0x74b8, 0x41 => 0x74c0, 0x42 => 0x74b5, 0x43 => 0x74c1,
+    0x44 => 0x74be, 0x45 => 0x74b6, 0x46 => 0x74bb, 0x47 => 0x74c2,
+    0x48 => 0x7514, 0x49 => 0x7513, 0x4a => 0x765c, 0x4b => 0x7664,
+    0x4c => 0x7659, 0x4d => 0x7650, 0x4e => 0x7653, 0x4f => 0x7657,
+    0x50 => 0x765a, 0x51 => 0x76a6, 0x52 => 0x76bd, 0x53 => 0x76ec,
+    0x54 => 0x77c2, 0x55 => 0x77ba, 0x56 => 0x78ff, 0x57 => 0x790c,
+    0x58 => 0x7913, 0x59 => 0x7914, 0x5a => 0x7909, 0x5b => 0x7910,
+    0x5c => 0x7912, 0x5d => 0x7911, 0x5e => 0x79ad, 0x5f => 0x79ac,
+    0x60 => 0x7a5f, 0x61 => 0x7c1c, 0x62 => 0x7c29, 0x63 => 0x7c19,
+    0x64 => 0x7c20, 0x65 => 0x7c1f, 0x66 => 0x7c2d, 0x67 => 0x7c1d,
+    0x68 => 0x7c26, 0x69 => 0x7c28, 0x6a => 0x7c22, 0x6b => 0x7c25,
+    0x6c => 0x7c30, 0x6d => 0x7e5c, 0x6e => 0x7e50, 0x6f => 0x7e56,
+    0x70 => 0x7e63, 0x71 => 0x7e58, 0x72 => 0x7e62, 0x73 => 0x7e5f,
+    0x74 => 0x7e51, 0x75 => 0x7e60, 0x76 => 0x7e57, 0x77 => 0x7e53,
+    0x78 => 0x7fb5, 0x79 => 0x7fb3, 0x7a => 0x7ff7, 0x7b => 0x7ff8,
+    0x7c => 0x8075, 0x7d => 0x81d1, 0x7e => 0x81d2, 0xa1 => 0x81d0,
+    0xa2 => 0x825f, 0xa3 => 0x825e, 0xa4 => 0x85b4, 0xa5 => 0x85c6,
+    0xa6 => 0x85c0, 0xa7 => 0x85c3, 0xa8 => 0x85c2, 0xa9 => 0x85b3,
+    0xaa => 0x85b5, 0xab => 0x85bd, 0xac => 0x85c7, 0xad => 0x85c4,
+    0xae => 0x85bf, 0xaf => 0x85cb, 0xb0 => 0x85ce, 0xb1 => 0x85c8,
+    0xb2 => 0x85c5, 0xb3 => 0x85b1, 0xb4 => 0x85b6, 0xb5 => 0x85d2,
+    0xb6 => 0x8624, 0xb7 => 0x85b8, 0xb8 => 0x85b7, 0xb9 => 0x85be,
+    0xba => 0x8669, 0xbb => 0x87e7, 0xbc => 0x87e6, 0xbd => 0x87e2,
+    0xbe => 0x87db, 0xbf => 0x87eb, 0xc0 => 0x87ea, 0xc1 => 0x87e5,
+    0xc2 => 0x87df, 0xc3 => 0x87f3, 0xc4 => 0x87e4, 0xc5 => 0x87d4,
+    0xc6 => 0x87dc, 0xc7 => 0x87d3, 0xc8 => 0x87ed, 0xc9 => 0x87d8,
+    0xca => 0x87e3, 0xcb => 0x87a4, 0xcc => 0x87d7, 0xcd => 0x87d9,
+    0xce => 0x8801, 0xcf => 0x87f4, 0xd0 => 0x87e8, 0xd1 => 0x87dd,
+    0xd2 => 0x8953, 0xd3 => 0x894b, 0xd4 => 0x894f, 0xd5 => 0x894c,
+    0xd6 => 0x8946, 0xd7 => 0x8950, 0xd8 => 0x8951, 0xd9 => 0x8949,
+    0xda => 0x8b2a, 0xdb => 0x8b27, 0xdc => 0x8b23, 0xdd => 0x8b33,
+    0xde => 0x8b30, 0xdf => 0x8b35, 0xe0 => 0x8b47, 0xe1 => 0x8b2f,
+    0xe2 => 0x8b3c, 0xe3 => 0x8b3e, 0xe4 => 0x8b31, 0xe5 => 0x8b25,
+    0xe6 => 0x8b37, 0xe7 => 0x8b26, 0xe8 => 0x8b36, 0xe9 => 0x8b2e,
+    0xea => 0x8b24, 0xeb => 0x8b3b, 0xec => 0x8b3d, 0xed => 0x8b3a,
+    0xee => 0x8c42, 0xef => 0x8c75, 0xf0 => 0x8c99, 0xf1 => 0x8c98,
+    0xf2 => 0x8c97, 0xf3 => 0x8cfe, 0xf4 => 0x8d04, 0xf5 => 0x8d02,
+    0xf6 => 0x8d00, 0xf7 => 0x8e5c, 0xf8 => 0x8e62, 0xf9 => 0x8e60,
+    0xfa => 0x8e57, 0xfb => 0x8e56, 0xfc => 0x8e5e, 0xfd => 0x8e65,
+    0xfe => 0x8e67,
+  },
+  0xf1 => {
+    0x40 => 0x8e5b, 0x41 => 0x8e5a, 0x42 => 0x8e61, 0x43 => 0x8e5d,
+    0x44 => 0x8e69, 0x45 => 0x8e54, 0x46 => 0x8f46, 0x47 => 0x8f47,
+    0x48 => 0x8f48, 0x49 => 0x8f4b, 0x4a => 0x9128, 0x4b => 0x913a,
+    0x4c => 0x913b, 0x4d => 0x913e, 0x4e => 0x91a8, 0x4f => 0x91a5,
+    0x50 => 0x91a7, 0x51 => 0x91af, 0x52 => 0x91aa, 0x53 => 0x93b5,
+    0x54 => 0x938c, 0x55 => 0x9392, 0x56 => 0x93b7, 0x57 => 0x939b,
+    0x58 => 0x939d, 0x59 => 0x9389, 0x5a => 0x93a7, 0x5b => 0x938e,
+    0x5c => 0x93aa, 0x5d => 0x939e, 0x5e => 0x93a6, 0x5f => 0x9395,
+    0x60 => 0x9388, 0x61 => 0x9399, 0x62 => 0x939f, 0x63 => 0x938d,
+    0x64 => 0x93b1, 0x65 => 0x9391, 0x66 => 0x93b2, 0x67 => 0x93a4,
+    0x68 => 0x93a8, 0x69 => 0x93b4, 0x6a => 0x93a3, 0x6b => 0x93a5,
+    0x6c => 0x95d2, 0x6d => 0x95d3, 0x6e => 0x95d1, 0x6f => 0x96b3,
+    0x70 => 0x96d7, 0x71 => 0x96da, 0x72 => 0x5dc2, 0x73 => 0x96df,
+    0x74 => 0x96d8, 0x75 => 0x96dd, 0x76 => 0x9723, 0x77 => 0x9722,
+    0x78 => 0x9725, 0x79 => 0x97ac, 0x7a => 0x97ae, 0x7b => 0x97a8,
+    0x7c => 0x97ab, 0x7d => 0x97a4, 0x7e => 0x97aa, 0xa1 => 0x97a2,
+    0xa2 => 0x97a5, 0xa3 => 0x97d7, 0xa4 => 0x97d9, 0xa5 => 0x97d6,
+    0xa6 => 0x97d8, 0xa7 => 0x97fa, 0xa8 => 0x9850, 0xa9 => 0x9851,
+    0xaa => 0x9852, 0xab => 0x98b8, 0xac => 0x9941, 0xad => 0x993c,
+    0xae => 0x993a, 0xaf => 0x9a0f, 0xb0 => 0x9a0b, 0xb1 => 0x9a09,
+    0xb2 => 0x9a0d, 0xb3 => 0x9a04, 0xb4 => 0x9a11, 0xb5 => 0x9a0a,
+    0xb6 => 0x9a05, 0xb7 => 0x9a07, 0xb8 => 0x9a06, 0xb9 => 0x9ac0,
+    0xba => 0x9adc, 0xbb => 0x9b08, 0xbc => 0x9b04, 0xbd => 0x9b05,
+    0xbe => 0x9b29, 0xbf => 0x9b35, 0xc0 => 0x9b4a, 0xc1 => 0x9b4c,
+    0xc2 => 0x9b4b, 0xc3 => 0x9bc7, 0xc4 => 0x9bc6, 0xc5 => 0x9bc3,
+    0xc6 => 0x9bbf, 0xc7 => 0x9bc1, 0xc8 => 0x9bb5, 0xc9 => 0x9bb8,
+    0xca => 0x9bd3, 0xcb => 0x9bb6, 0xcc => 0x9bc4, 0xcd => 0x9bb9,
+    0xce => 0x9bbd, 0xcf => 0x9d5c, 0xd0 => 0x9d53, 0xd1 => 0x9d4f,
+    0xd2 => 0x9d4a, 0xd3 => 0x9d5b, 0xd4 => 0x9d4b, 0xd5 => 0x9d59,
+    0xd6 => 0x9d56, 0xd7 => 0x9d4c, 0xd8 => 0x9d57, 0xd9 => 0x9d52,
+    0xda => 0x9d54, 0xdb => 0x9d5f, 0xdc => 0x9d58, 0xdd => 0x9d5a,
+    0xde => 0x9e8e, 0xdf => 0x9e8c, 0xe0 => 0x9edf, 0xe1 => 0x9f01,
+    0xe2 => 0x9f00, 0xe3 => 0x9f16, 0xe4 => 0x9f25, 0xe5 => 0x9f2b,
+    0xe6 => 0x9f2a, 0xe7 => 0x9f29, 0xe8 => 0x9f28, 0xe9 => 0x9f4c,
+    0xea => 0x9f55, 0xeb => 0x5134, 0xec => 0x5135, 0xed => 0x5296,
+    0xee => 0x52f7, 0xef => 0x53b4, 0xf0 => 0x56ab, 0xf1 => 0x56ad,
+    0xf2 => 0x56a6, 0xf3 => 0x56a7, 0xf4 => 0x56aa, 0xf5 => 0x56ac,
+    0xf6 => 0x58da, 0xf7 => 0x58dd, 0xf8 => 0x58db, 0xf9 => 0x5912,
+    0xfa => 0x5b3d, 0xfb => 0x5b3e, 0xfc => 0x5b3f, 0xfd => 0x5dc3,
+    0xfe => 0x5e70,
+  },
+  0xf2 => {
+    0x40 => 0x5fbf, 0x41 => 0x61fb, 0x42 => 0x6507, 0x43 => 0x6510,
+    0x44 => 0x650d, 0x45 => 0x6509, 0x46 => 0x650c, 0x47 => 0x650e,
+    0x48 => 0x6584, 0x49 => 0x65de, 0x4a => 0x65dd, 0x4b => 0x66de,
+    0x4c => 0x6ae7, 0x4d => 0x6ae0, 0x4e => 0x6acc, 0x4f => 0x6ad1,
+    0x50 => 0x6ad9, 0x51 => 0x6acb, 0x52 => 0x6adf, 0x53 => 0x6adc,
+    0x54 => 0x6ad0, 0x55 => 0x6aeb, 0x56 => 0x6acf, 0x57 => 0x6acd,
+    0x58 => 0x6ade, 0x59 => 0x6b60, 0x5a => 0x6bb0, 0x5b => 0x6c0c,
+    0x5c => 0x7019, 0x5d => 0x7027, 0x5e => 0x7020, 0x5f => 0x7016,
+    0x60 => 0x702b, 0x61 => 0x7021, 0x62 => 0x7022, 0x63 => 0x7023,
+    0x64 => 0x7029, 0x65 => 0x7017, 0x66 => 0x7024, 0x67 => 0x701c,
+    0x68 => 0x702a, 0x69 => 0x720c, 0x6a => 0x720a, 0x6b => 0x7207,
+    0x6c => 0x7202, 0x6d => 0x7205, 0x6e => 0x72a5, 0x6f => 0x72a6,
+    0x70 => 0x72a4, 0x71 => 0x72a3, 0x72 => 0x72a1, 0x73 => 0x74cb,
+    0x74 => 0x74c5, 0x75 => 0x74b7, 0x76 => 0x74c3, 0x77 => 0x7516,
+    0x78 => 0x7660, 0x79 => 0x77c9, 0x7a => 0x77ca, 0x7b => 0x77c4,
+    0x7c => 0x77f1, 0x7d => 0x791d, 0x7e => 0x791b, 0xa1 => 0x7921,
+    0xa2 => 0x791c, 0xa3 => 0x7917, 0xa4 => 0x791e, 0xa5 => 0x79b0,
+    0xa6 => 0x7a67, 0xa7 => 0x7a68, 0xa8 => 0x7c33, 0xa9 => 0x7c3c,
+    0xaa => 0x7c39, 0xab => 0x7c2c, 0xac => 0x7c3b, 0xad => 0x7cec,
+    0xae => 0x7cea, 0xaf => 0x7e76, 0xb0 => 0x7e75, 0xb1 => 0x7e78,
+    0xb2 => 0x7e70, 0xb3 => 0x7e77, 0xb4 => 0x7e6f, 0xb5 => 0x7e7a,
+    0xb6 => 0x7e72, 0xb7 => 0x7e74, 0xb8 => 0x7e68, 0xb9 => 0x7f4b,
+    0xba => 0x7f4a, 0xbb => 0x7f83, 0xbc => 0x7f86, 0xbd => 0x7fb7,
+    0xbe => 0x7ffd, 0xbf => 0x7ffe, 0xc0 => 0x8078, 0xc1 => 0x81d7,
+    0xc2 => 0x81d5, 0xc3 => 0x8264, 0xc4 => 0x8261, 0xc5 => 0x8263,
+    0xc6 => 0x85eb, 0xc7 => 0x85f1, 0xc8 => 0x85ed, 0xc9 => 0x85d9,
+    0xca => 0x85e1, 0xcb => 0x85e8, 0xcc => 0x85da, 0xcd => 0x85d7,
+    0xce => 0x85ec, 0xcf => 0x85f2, 0xd0 => 0x85f8, 0xd1 => 0x85d8,
+    0xd2 => 0x85df, 0xd3 => 0x85e3, 0xd4 => 0x85dc, 0xd5 => 0x85d1,
+    0xd6 => 0x85f0, 0xd7 => 0x85e6, 0xd8 => 0x85ef, 0xd9 => 0x85de,
+    0xda => 0x85e2, 0xdb => 0x8800, 0xdc => 0x87fa, 0xdd => 0x8803,
+    0xde => 0x87f6, 0xdf => 0x87f7, 0xe0 => 0x8809, 0xe1 => 0x880c,
+    0xe2 => 0x880b, 0xe3 => 0x8806, 0xe4 => 0x87fc, 0xe5 => 0x8808,
+    0xe6 => 0x87ff, 0xe7 => 0x880a, 0xe8 => 0x8802, 0xe9 => 0x8962,
+    0xea => 0x895a, 0xeb => 0x895b, 0xec => 0x8957, 0xed => 0x8961,
+    0xee => 0x895c, 0xef => 0x8958, 0xf0 => 0x895d, 0xf1 => 0x8959,
+    0xf2 => 0x8988, 0xf3 => 0x89b7, 0xf4 => 0x89b6, 0xf5 => 0x89f6,
+    0xf6 => 0x8b50, 0xf7 => 0x8b48, 0xf8 => 0x8b4a, 0xf9 => 0x8b40,
+    0xfa => 0x8b53, 0xfb => 0x8b56, 0xfc => 0x8b54, 0xfd => 0x8b4b,
+    0xfe => 0x8b55,
+  },
+  0xf3 => {
+    0x40 => 0x8b51, 0x41 => 0x8b42, 0x42 => 0x8b52, 0x43 => 0x8b57,
+    0x44 => 0x8c43, 0x45 => 0x8c77, 0x46 => 0x8c76, 0x47 => 0x8c9a,
+    0x48 => 0x8d06, 0x49 => 0x8d07, 0x4a => 0x8d09, 0x4b => 0x8dac,
+    0x4c => 0x8daa, 0x4d => 0x8dad, 0x4e => 0x8dab, 0x4f => 0x8e6d,
+    0x50 => 0x8e78, 0x51 => 0x8e73, 0x52 => 0x8e6a, 0x53 => 0x8e6f,
+    0x54 => 0x8e7b, 0x55 => 0x8ec2, 0x56 => 0x8f52, 0x57 => 0x8f51,
+    0x58 => 0x8f4f, 0x59 => 0x8f50, 0x5a => 0x8f53, 0x5b => 0x8fb4,
+    0x5c => 0x9140, 0x5d => 0x913f, 0x5e => 0x91b0, 0x5f => 0x91ad,
+    0x60 => 0x93de, 0x61 => 0x93c7, 0x62 => 0x93cf, 0x63 => 0x93c2,
+    0x64 => 0x93da, 0x65 => 0x93d0, 0x66 => 0x93f9, 0x67 => 0x93ec,
+    0x68 => 0x93cc, 0x69 => 0x93d9, 0x6a => 0x93a9, 0x6b => 0x93e6,
+    0x6c => 0x93ca, 0x6d => 0x93d4, 0x6e => 0x93ee, 0x6f => 0x93e3,
+    0x70 => 0x93d5, 0x71 => 0x93c4, 0x72 => 0x93ce, 0x73 => 0x93c0,
+    0x74 => 0x93d2, 0x75 => 0x93e7, 0x76 => 0x957d, 0x77 => 0x95da,
+    0x78 => 0x95db, 0x79 => 0x96e1, 0x7a => 0x9729, 0x7b => 0x972b,
+    0x7c => 0x972c, 0x7d => 0x9728, 0x7e => 0x9726, 0xa1 => 0x97b3,
+    0xa2 => 0x97b7, 0xa3 => 0x97b6, 0xa4 => 0x97dd, 0xa5 => 0x97de,
+    0xa6 => 0x97df, 0xa7 => 0x985c, 0xa8 => 0x9859, 0xa9 => 0x985d,
+    0xaa => 0x9857, 0xab => 0x98bf, 0xac => 0x98bd, 0xad => 0x98bb,
+    0xae => 0x98be, 0xaf => 0x9948, 0xb0 => 0x9947, 0xb1 => 0x9943,
+    0xb2 => 0x99a6, 0xb3 => 0x99a7, 0xb4 => 0x9a1a, 0xb5 => 0x9a15,
+    0xb6 => 0x9a25, 0xb7 => 0x9a1d, 0xb8 => 0x9a24, 0xb9 => 0x9a1b,
+    0xba => 0x9a22, 0xbb => 0x9a20, 0xbc => 0x9a27, 0xbd => 0x9a23,
+    0xbe => 0x9a1e, 0xbf => 0x9a1c, 0xc0 => 0x9a14, 0xc1 => 0x9ac2,
+    0xc2 => 0x9b0b, 0xc3 => 0x9b0a, 0xc4 => 0x9b0e, 0xc5 => 0x9b0c,
+    0xc6 => 0x9b37, 0xc7 => 0x9bea, 0xc8 => 0x9beb, 0xc9 => 0x9be0,
+    0xca => 0x9bde, 0xcb => 0x9be4, 0xcc => 0x9be6, 0xcd => 0x9be2,
+    0xce => 0x9bf0, 0xcf => 0x9bd4, 0xd0 => 0x9bd7, 0xd1 => 0x9bec,
+    0xd2 => 0x9bdc, 0xd3 => 0x9bd9, 0xd4 => 0x9be5, 0xd5 => 0x9bd5,
+    0xd6 => 0x9be1, 0xd7 => 0x9bda, 0xd8 => 0x9d77, 0xd9 => 0x9d81,
+    0xda => 0x9d8a, 0xdb => 0x9d84, 0xdc => 0x9d88, 0xdd => 0x9d71,
+    0xde => 0x9d80, 0xdf => 0x9d78, 0xe0 => 0x9d86, 0xe1 => 0x9d8b,
+    0xe2 => 0x9d8c, 0xe3 => 0x9d7d, 0xe4 => 0x9d6b, 0xe5 => 0x9d74,
+    0xe6 => 0x9d75, 0xe7 => 0x9d70, 0xe8 => 0x9d69, 0xe9 => 0x9d85,
+    0xea => 0x9d73, 0xeb => 0x9d7b, 0xec => 0x9d82, 0xed => 0x9d6f,
+    0xee => 0x9d79, 0xef => 0x9d7f, 0xf0 => 0x9d87, 0xf1 => 0x9d68,
+    0xf2 => 0x9e94, 0xf3 => 0x9e91, 0xf4 => 0x9ec0, 0xf5 => 0x9efc,
+    0xf6 => 0x9f2d, 0xf7 => 0x9f40, 0xf8 => 0x9f41, 0xf9 => 0x9f4d,
+    0xfa => 0x9f56, 0xfb => 0x9f57, 0xfc => 0x9f58, 0xfd => 0x5337,
+    0xfe => 0x56b2,
+  },
+  0xf4 => {
+    0x40 => 0x56b5, 0x41 => 0x56b3, 0x42 => 0x58e3, 0x43 => 0x5b45,
+    0x44 => 0x5dc6, 0x45 => 0x5dc7, 0x46 => 0x5eee, 0x47 => 0x5eef,
+    0x48 => 0x5fc0, 0x49 => 0x5fc1, 0x4a => 0x61f9, 0x4b => 0x6517,
+    0x4c => 0x6516, 0x4d => 0x6515, 0x4e => 0x6513, 0x4f => 0x65df,
+    0x50 => 0x66e8, 0x51 => 0x66e3, 0x52 => 0x66e4, 0x53 => 0x6af3,
+    0x54 => 0x6af0, 0x55 => 0x6aea, 0x56 => 0x6ae8, 0x57 => 0x6af9,
+    0x58 => 0x6af1, 0x59 => 0x6aee, 0x5a => 0x6aef, 0x5b => 0x703c,
+    0x5c => 0x7035, 0x5d => 0x702f, 0x5e => 0x7037, 0x5f => 0x7034,
+    0x60 => 0x7031, 0x61 => 0x7042, 0x62 => 0x7038, 0x63 => 0x703f,
+    0x64 => 0x703a, 0x65 => 0x7039, 0x66 => 0x7040, 0x67 => 0x703b,
+    0x68 => 0x7033, 0x69 => 0x7041, 0x6a => 0x7213, 0x6b => 0x7214,
+    0x6c => 0x72a8, 0x6d => 0x737d, 0x6e => 0x737c, 0x6f => 0x74ba,
+    0x70 => 0x76ab, 0x71 => 0x76aa, 0x72 => 0x76be, 0x73 => 0x76ed,
+    0x74 => 0x77cc, 0x75 => 0x77ce, 0x76 => 0x77cf, 0x77 => 0x77cd,
+    0x78 => 0x77f2, 0x79 => 0x7925, 0x7a => 0x7923, 0x7b => 0x7927,
+    0x7c => 0x7928, 0x7d => 0x7924, 0x7e => 0x7929, 0xa1 => 0x79b2,
+    0xa2 => 0x7a6e, 0xa3 => 0x7a6c, 0xa4 => 0x7a6d, 0xa5 => 0x7af7,
+    0xa6 => 0x7c49, 0xa7 => 0x7c48, 0xa8 => 0x7c4a, 0xa9 => 0x7c47,
+    0xaa => 0x7c45, 0xab => 0x7cee, 0xac => 0x7e7b, 0xad => 0x7e7e,
+    0xae => 0x7e81, 0xaf => 0x7e80, 0xb0 => 0x7fba, 0xb1 => 0x7fff,
+    0xb2 => 0x8079, 0xb3 => 0x81db, 0xb4 => 0x81d9, 0xb5 => 0x820b,
+    0xb6 => 0x8268, 0xb7 => 0x8269, 0xb8 => 0x8622, 0xb9 => 0x85ff,
+    0xba => 0x8601, 0xbb => 0x85fe, 0xbc => 0x861b, 0xbd => 0x8600,
+    0xbe => 0x85f6, 0xbf => 0x8604, 0xc0 => 0x8609, 0xc1 => 0x8605,
+    0xc2 => 0x860c, 0xc3 => 0x85fd, 0xc4 => 0x8819, 0xc5 => 0x8810,
+    0xc6 => 0x8811, 0xc7 => 0x8817, 0xc8 => 0x8813, 0xc9 => 0x8816,
+    0xca => 0x8963, 0xcb => 0x8966, 0xcc => 0x89b9, 0xcd => 0x89f7,
+    0xce => 0x8b60, 0xcf => 0x8b6a, 0xd0 => 0x8b5d, 0xd1 => 0x8b68,
+    0xd2 => 0x8b63, 0xd3 => 0x8b65, 0xd4 => 0x8b67, 0xd5 => 0x8b6d,
+    0xd6 => 0x8dae, 0xd7 => 0x8e86, 0xd8 => 0x8e88, 0xd9 => 0x8e84,
+    0xda => 0x8f59, 0xdb => 0x8f56, 0xdc => 0x8f57, 0xdd => 0x8f55,
+    0xde => 0x8f58, 0xdf => 0x8f5a, 0xe0 => 0x908d, 0xe1 => 0x9143,
+    0xe2 => 0x9141, 0xe3 => 0x91b7, 0xe4 => 0x91b5, 0xe5 => 0x91b2,
+    0xe6 => 0x91b3, 0xe7 => 0x940b, 0xe8 => 0x9413, 0xe9 => 0x93fb,
+    0xea => 0x9420, 0xeb => 0x940f, 0xec => 0x9414, 0xed => 0x93fe,
+    0xee => 0x9415, 0xef => 0x9410, 0xf0 => 0x9428, 0xf1 => 0x9419,
+    0xf2 => 0x940d, 0xf3 => 0x93f5, 0xf4 => 0x9400, 0xf5 => 0x93f7,
+    0xf6 => 0x9407, 0xf7 => 0x940e, 0xf8 => 0x9416, 0xf9 => 0x9412,
+    0xfa => 0x93fa, 0xfb => 0x9409, 0xfc => 0x93f8, 0xfd => 0x940a,
+    0xfe => 0x93ff,
+  },
+  0xf5 => {
+    0x40 => 0x93fc, 0x41 => 0x940c, 0x42 => 0x93f6, 0x43 => 0x9411,
+    0x44 => 0x9406, 0x45 => 0x95de, 0x46 => 0x95e0, 0x47 => 0x95df,
+    0x48 => 0x972e, 0x49 => 0x972f, 0x4a => 0x97b9, 0x4b => 0x97bb,
+    0x4c => 0x97fd, 0x4d => 0x97fe, 0x4e => 0x9860, 0x4f => 0x9862,
+    0x50 => 0x9863, 0x51 => 0x985f, 0x52 => 0x98c1, 0x53 => 0x98c2,
+    0x54 => 0x9950, 0x55 => 0x994e, 0x56 => 0x9959, 0x57 => 0x994c,
+    0x58 => 0x994b, 0x59 => 0x9953, 0x5a => 0x9a32, 0x5b => 0x9a34,
+    0x5c => 0x9a31, 0x5d => 0x9a2c, 0x5e => 0x9a2a, 0x5f => 0x9a36,
+    0x60 => 0x9a29, 0x61 => 0x9a2e, 0x62 => 0x9a38, 0x63 => 0x9a2d,
+    0x64 => 0x9ac7, 0x65 => 0x9aca, 0x66 => 0x9ac6, 0x67 => 0x9b10,
+    0x68 => 0x9b12, 0x69 => 0x9b11, 0x6a => 0x9c0b, 0x6b => 0x9c08,
+    0x6c => 0x9bf7, 0x6d => 0x9c05, 0x6e => 0x9c12, 0x6f => 0x9bf8,
+    0x70 => 0x9c40, 0x71 => 0x9c07, 0x72 => 0x9c0e, 0x73 => 0x9c06,
+    0x74 => 0x9c17, 0x75 => 0x9c14, 0x76 => 0x9c09, 0x77 => 0x9d9f,
+    0x78 => 0x9d99, 0x79 => 0x9da4, 0x7a => 0x9d9d, 0x7b => 0x9d92,
+    0x7c => 0x9d98, 0x7d => 0x9d90, 0x7e => 0x9d9b, 0xa1 => 0x9da0,
+    0xa2 => 0x9d94, 0xa3 => 0x9d9c, 0xa4 => 0x9daa, 0xa5 => 0x9d97,
+    0xa6 => 0x9da1, 0xa7 => 0x9d9a, 0xa8 => 0x9da2, 0xa9 => 0x9da8,
+    0xaa => 0x9d9e, 0xab => 0x9da3, 0xac => 0x9dbf, 0xad => 0x9da9,
+    0xae => 0x9d96, 0xaf => 0x9da6, 0xb0 => 0x9da7, 0xb1 => 0x9e99,
+    0xb2 => 0x9e9b, 0xb3 => 0x9e9a, 0xb4 => 0x9ee5, 0xb5 => 0x9ee4,
+    0xb6 => 0x9ee7, 0xb7 => 0x9ee6, 0xb8 => 0x9f30, 0xb9 => 0x9f2e,
+    0xba => 0x9f5b, 0xbb => 0x9f60, 0xbc => 0x9f5e, 0xbd => 0x9f5d,
+    0xbe => 0x9f59, 0xbf => 0x9f91, 0xc0 => 0x513a, 0xc1 => 0x5139,
+    0xc2 => 0x5298, 0xc3 => 0x5297, 0xc4 => 0x56c3, 0xc5 => 0x56bd,
+    0xc6 => 0x56be, 0xc7 => 0x5b48, 0xc8 => 0x5b47, 0xc9 => 0x5dcb,
+    0xca => 0x5dcf, 0xcb => 0x5ef1, 0xcc => 0x61fd, 0xcd => 0x651b,
+    0xce => 0x6b02, 0xcf => 0x6afc, 0xd0 => 0x6b03, 0xd1 => 0x6af8,
+    0xd2 => 0x6b00, 0xd3 => 0x7043, 0xd4 => 0x7044, 0xd5 => 0x704a,
+    0xd6 => 0x7048, 0xd7 => 0x7049, 0xd8 => 0x7045, 0xd9 => 0x7046,
+    0xda => 0x721d, 0xdb => 0x721a, 0xdc => 0x7219, 0xdd => 0x737e,
+    0xde => 0x7517, 0xdf => 0x766a, 0xe0 => 0x77d0, 0xe1 => 0x792d,
+    0xe2 => 0x7931, 0xe3 => 0x792f, 0xe4 => 0x7c54, 0xe5 => 0x7c53,
+    0xe6 => 0x7cf2, 0xe7 => 0x7e8a, 0xe8 => 0x7e87, 0xe9 => 0x7e88,
+    0xea => 0x7e8b, 0xeb => 0x7e86, 0xec => 0x7e8d, 0xed => 0x7f4d,
+    0xee => 0x7fbb, 0xef => 0x8030, 0xf0 => 0x81dd, 0xf1 => 0x8618,
+    0xf2 => 0x862a, 0xf3 => 0x8626, 0xf4 => 0x861f, 0xf5 => 0x8623,
+    0xf6 => 0x861c, 0xf7 => 0x8619, 0xf8 => 0x8627, 0xf9 => 0x862e,
+    0xfa => 0x8621, 0xfb => 0x8620, 0xfc => 0x8629, 0xfd => 0x861e,
+    0xfe => 0x8625,
+  },
+  0xf6 => {
+    0x40 => 0x8829, 0x41 => 0x881d, 0x42 => 0x881b, 0x43 => 0x8820,
+    0x44 => 0x8824, 0x45 => 0x881c, 0x46 => 0x882b, 0x47 => 0x884a,
+    0x48 => 0x896d, 0x49 => 0x8969, 0x4a => 0x896e, 0x4b => 0x896b,
+    0x4c => 0x89fa, 0x4d => 0x8b79, 0x4e => 0x8b78, 0x4f => 0x8b45,
+    0x50 => 0x8b7a, 0x51 => 0x8b7b, 0x52 => 0x8d10, 0x53 => 0x8d14,
+    0x54 => 0x8daf, 0x55 => 0x8e8e, 0x56 => 0x8e8c, 0x57 => 0x8f5e,
+    0x58 => 0x8f5b, 0x59 => 0x8f5d, 0x5a => 0x9146, 0x5b => 0x9144,
+    0x5c => 0x9145, 0x5d => 0x91b9, 0x5e => 0x943f, 0x5f => 0x943b,
+    0x60 => 0x9436, 0x61 => 0x9429, 0x62 => 0x943d, 0x63 => 0x943c,
+    0x64 => 0x9430, 0x65 => 0x9439, 0x66 => 0x942a, 0x67 => 0x9437,
+    0x68 => 0x942c, 0x69 => 0x9440, 0x6a => 0x9431, 0x6b => 0x95e5,
+    0x6c => 0x95e4, 0x6d => 0x95e3, 0x6e => 0x9735, 0x6f => 0x973a,
+    0x70 => 0x97bf, 0x71 => 0x97e1, 0x72 => 0x9864, 0x73 => 0x98c9,
+    0x74 => 0x98c6, 0x75 => 0x98c0, 0x76 => 0x9958, 0x77 => 0x9956,
+    0x78 => 0x9a39, 0x79 => 0x9a3d, 0x7a => 0x9a46, 0x7b => 0x9a44,
+    0x7c => 0x9a42, 0x7d => 0x9a41, 0x7e => 0x9a3a, 0xa1 => 0x9a3f,
+    0xa2 => 0x9acd, 0xa3 => 0x9b15, 0xa4 => 0x9b17, 0xa5 => 0x9b18,
+    0xa6 => 0x9b16, 0xa7 => 0x9b3a, 0xa8 => 0x9b52, 0xa9 => 0x9c2b,
+    0xaa => 0x9c1d, 0xab => 0x9c1c, 0xac => 0x9c2c, 0xad => 0x9c23,
+    0xae => 0x9c28, 0xaf => 0x9c29, 0xb0 => 0x9c24, 0xb1 => 0x9c21,
+    0xb2 => 0x9db7, 0xb3 => 0x9db6, 0xb4 => 0x9dbc, 0xb5 => 0x9dc1,
+    0xb6 => 0x9dc7, 0xb7 => 0x9dca, 0xb8 => 0x9dcf, 0xb9 => 0x9dbe,
+    0xba => 0x9dc5, 0xbb => 0x9dc3, 0xbc => 0x9dbb, 0xbd => 0x9db5,
+    0xbe => 0x9dce, 0xbf => 0x9db9, 0xc0 => 0x9dba, 0xc1 => 0x9dac,
+    0xc2 => 0x9dc8, 0xc3 => 0x9db1, 0xc4 => 0x9dad, 0xc5 => 0x9dcc,
+    0xc6 => 0x9db3, 0xc7 => 0x9dcd, 0xc8 => 0x9db2, 0xc9 => 0x9e7a,
+    0xca => 0x9e9c, 0xcb => 0x9eeb, 0xcc => 0x9eee, 0xcd => 0x9eed,
+    0xce => 0x9f1b, 0xcf => 0x9f18, 0xd0 => 0x9f1a, 0xd1 => 0x9f31,
+    0xd2 => 0x9f4e, 0xd3 => 0x9f65, 0xd4 => 0x9f64, 0xd5 => 0x9f92,
+    0xd6 => 0x4eb9, 0xd7 => 0x56c6, 0xd8 => 0x56c5, 0xd9 => 0x56cb,
+    0xda => 0x5971, 0xdb => 0x5b4b, 0xdc => 0x5b4c, 0xdd => 0x5dd5,
+    0xde => 0x5dd1, 0xdf => 0x5ef2, 0xe0 => 0x6521, 0xe1 => 0x6520,
+    0xe2 => 0x6526, 0xe3 => 0x6522, 0xe4 => 0x6b0b, 0xe5 => 0x6b08,
+    0xe6 => 0x6b09, 0xe7 => 0x6c0d, 0xe8 => 0x7055, 0xe9 => 0x7056,
+    0xea => 0x7057, 0xeb => 0x7052, 0xec => 0x721e, 0xed => 0x721f,
+    0xee => 0x72a9, 0xef => 0x737f, 0xf0 => 0x74d8, 0xf1 => 0x74d5,
+    0xf2 => 0x74d9, 0xf3 => 0x74d7, 0xf4 => 0x766d, 0xf5 => 0x76ad,
+    0xf6 => 0x7935, 0xf7 => 0x79b4, 0xf8 => 0x7a70, 0xf9 => 0x7a71,
+    0xfa => 0x7c57, 0xfb => 0x7c5c, 0xfc => 0x7c59, 0xfd => 0x7c5b,
+    0xfe => 0x7c5a,
+  },
+  0xf7 => {
+    0x40 => 0x7cf4, 0x41 => 0x7cf1, 0x42 => 0x7e91, 0x43 => 0x7f4f,
+    0x44 => 0x7f87, 0x45 => 0x81de, 0x46 => 0x826b, 0x47 => 0x8634,
+    0x48 => 0x8635, 0x49 => 0x8633, 0x4a => 0x862c, 0x4b => 0x8632,
+    0x4c => 0x8636, 0x4d => 0x882c, 0x4e => 0x8828, 0x4f => 0x8826,
+    0x50 => 0x882a, 0x51 => 0x8825, 0x52 => 0x8971, 0x53 => 0x89bf,
+    0x54 => 0x89be, 0x55 => 0x89fb, 0x56 => 0x8b7e, 0x57 => 0x8b84,
+    0x58 => 0x8b82, 0x59 => 0x8b86, 0x5a => 0x8b85, 0x5b => 0x8b7f,
+    0x5c => 0x8d15, 0x5d => 0x8e95, 0x5e => 0x8e94, 0x5f => 0x8e9a,
+    0x60 => 0x8e92, 0x61 => 0x8e90, 0x62 => 0x8e96, 0x63 => 0x8e97,
+    0x64 => 0x8f60, 0x65 => 0x8f62, 0x66 => 0x9147, 0x67 => 0x944c,
+    0x68 => 0x9450, 0x69 => 0x944a, 0x6a => 0x944b, 0x6b => 0x944f,
+    0x6c => 0x9447, 0x6d => 0x9445, 0x6e => 0x9448, 0x6f => 0x9449,
+    0x70 => 0x9446, 0x71 => 0x973f, 0x72 => 0x97e3, 0x73 => 0x986a,
+    0x74 => 0x9869, 0x75 => 0x98cb, 0x76 => 0x9954, 0x77 => 0x995b,
+    0x78 => 0x9a4e, 0x79 => 0x9a53, 0x7a => 0x9a54, 0x7b => 0x9a4c,
+    0x7c => 0x9a4f, 0x7d => 0x9a48, 0x7e => 0x9a4a, 0xa1 => 0x9a49,
+    0xa2 => 0x9a52, 0xa3 => 0x9a50, 0xa4 => 0x9ad0, 0xa5 => 0x9b19,
+    0xa6 => 0x9b2b, 0xa7 => 0x9b3b, 0xa8 => 0x9b56, 0xa9 => 0x9b55,
+    0xaa => 0x9c46, 0xab => 0x9c48, 0xac => 0x9c3f, 0xad => 0x9c44,
+    0xae => 0x9c39, 0xaf => 0x9c33, 0xb0 => 0x9c41, 0xb1 => 0x9c3c,
+    0xb2 => 0x9c37, 0xb3 => 0x9c34, 0xb4 => 0x9c32, 0xb5 => 0x9c3d,
+    0xb6 => 0x9c36, 0xb7 => 0x9ddb, 0xb8 => 0x9dd2, 0xb9 => 0x9dde,
+    0xba => 0x9dda, 0xbb => 0x9dcb, 0xbc => 0x9dd0, 0xbd => 0x9ddc,
+    0xbe => 0x9dd1, 0xbf => 0x9ddf, 0xc0 => 0x9de9, 0xc1 => 0x9dd9,
+    0xc2 => 0x9dd8, 0xc3 => 0x9dd6, 0xc4 => 0x9df5, 0xc5 => 0x9dd5,
+    0xc6 => 0x9ddd, 0xc7 => 0x9eb6, 0xc8 => 0x9ef0, 0xc9 => 0x9f35,
+    0xca => 0x9f33, 0xcb => 0x9f32, 0xcc => 0x9f42, 0xcd => 0x9f6b,
+    0xce => 0x9f95, 0xcf => 0x9fa2, 0xd0 => 0x513d, 0xd1 => 0x5299,
+    0xd2 => 0x58e8, 0xd3 => 0x58e7, 0xd4 => 0x5972, 0xd5 => 0x5b4d,
+    0xd6 => 0x5dd8, 0xd7 => 0x882f, 0xd8 => 0x5f4f, 0xd9 => 0x6201,
+    0xda => 0x6203, 0xdb => 0x6204, 0xdc => 0x6529, 0xdd => 0x6525,
+    0xde => 0x6596, 0xdf => 0x66eb, 0xe0 => 0x6b11, 0xe1 => 0x6b12,
+    0xe2 => 0x6b0f, 0xe3 => 0x6bca, 0xe4 => 0x705b, 0xe5 => 0x705a,
+    0xe6 => 0x7222, 0xe7 => 0x7382, 0xe8 => 0x7381, 0xe9 => 0x7383,
+    0xea => 0x7670, 0xeb => 0x77d4, 0xec => 0x7c67, 0xed => 0x7c66,
+    0xee => 0x7e95, 0xef => 0x826c, 0xf0 => 0x863a, 0xf1 => 0x8640,
+    0xf2 => 0x8639, 0xf3 => 0x863c, 0xf4 => 0x8631, 0xf5 => 0x863b,
+    0xf6 => 0x863e, 0xf7 => 0x8830, 0xf8 => 0x8832, 0xf9 => 0x882e,
+    0xfa => 0x8833, 0xfb => 0x8976, 0xfc => 0x8974, 0xfd => 0x8973,
+    0xfe => 0x89fe,
+  },
+  0xf8 => {
+    0x40 => 0x8b8c, 0x41 => 0x8b8e, 0x42 => 0x8b8b, 0x43 => 0x8b88,
+    0x44 => 0x8c45, 0x45 => 0x8d19, 0x46 => 0x8e98, 0x47 => 0x8f64,
+    0x48 => 0x8f63, 0x49 => 0x91bc, 0x4a => 0x9462, 0x4b => 0x9455,
+    0x4c => 0x945d, 0x4d => 0x9457, 0x4e => 0x945e, 0x4f => 0x97c4,
+    0x50 => 0x97c5, 0x51 => 0x9800, 0x52 => 0x9a56, 0x53 => 0x9a59,
+    0x54 => 0x9b1e, 0x55 => 0x9b1f, 0x56 => 0x9b20, 0x57 => 0x9c52,
+    0x58 => 0x9c58, 0x59 => 0x9c50, 0x5a => 0x9c4a, 0x5b => 0x9c4d,
+    0x5c => 0x9c4b, 0x5d => 0x9c55, 0x5e => 0x9c59, 0x5f => 0x9c4c,
+    0x60 => 0x9c4e, 0x61 => 0x9dfb, 0x62 => 0x9df7, 0x63 => 0x9def,
+    0x64 => 0x9de3, 0x65 => 0x9deb, 0x66 => 0x9df8, 0x67 => 0x9de4,
+    0x68 => 0x9df6, 0x69 => 0x9de1, 0x6a => 0x9dee, 0x6b => 0x9de6,
+    0x6c => 0x9df2, 0x6d => 0x9df0, 0x6e => 0x9de2, 0x6f => 0x9dec,
+    0x70 => 0x9df4, 0x71 => 0x9df3, 0x72 => 0x9de8, 0x73 => 0x9ded,
+    0x74 => 0x9ec2, 0x75 => 0x9ed0, 0x76 => 0x9ef2, 0x77 => 0x9ef3,
+    0x78 => 0x9f06, 0x79 => 0x9f1c, 0x7a => 0x9f38, 0x7b => 0x9f37,
+    0x7c => 0x9f36, 0x7d => 0x9f43, 0x7e => 0x9f4f, 0xa1 => 0x9f71,
+    0xa2 => 0x9f70, 0xa3 => 0x9f6e, 0xa4 => 0x9f6f, 0xa5 => 0x56d3,
+    0xa6 => 0x56cd, 0xa7 => 0x5b4e, 0xa8 => 0x5c6d, 0xa9 => 0x652d,
+    0xaa => 0x66ed, 0xab => 0x66ee, 0xac => 0x6b13, 0xad => 0x705f,
+    0xae => 0x7061, 0xaf => 0x705d, 0xb0 => 0x7060, 0xb1 => 0x7223,
+    0xb2 => 0x74db, 0xb3 => 0x74e5, 0xb4 => 0x77d5, 0xb5 => 0x7938,
+    0xb6 => 0x79b7, 0xb7 => 0x79b6, 0xb8 => 0x7c6a, 0xb9 => 0x7e97,
+    0xba => 0x7f89, 0xbb => 0x826d, 0xbc => 0x8643, 0xbd => 0x8838,
+    0xbe => 0x8837, 0xbf => 0x8835, 0xc0 => 0x884b, 0xc1 => 0x8b94,
+    0xc2 => 0x8b95, 0xc3 => 0x8e9e, 0xc4 => 0x8e9f, 0xc5 => 0x8ea0,
+    0xc6 => 0x8e9d, 0xc7 => 0x91be, 0xc8 => 0x91bd, 0xc9 => 0x91c2,
+    0xca => 0x946b, 0xcb => 0x9468, 0xcc => 0x9469, 0xcd => 0x96e5,
+    0xce => 0x9746, 0xcf => 0x9743, 0xd0 => 0x9747, 0xd1 => 0x97c7,
+    0xd2 => 0x97e5, 0xd3 => 0x9a5e, 0xd4 => 0x9ad5, 0xd5 => 0x9b59,
+    0xd6 => 0x9c63, 0xd7 => 0x9c67, 0xd8 => 0x9c66, 0xd9 => 0x9c62,
+    0xda => 0x9c5e, 0xdb => 0x9c60, 0xdc => 0x9e02, 0xdd => 0x9dfe,
+    0xde => 0x9e07, 0xdf => 0x9e03, 0xe0 => 0x9e06, 0xe1 => 0x9e05,
+    0xe2 => 0x9e00, 0xe3 => 0x9e01, 0xe4 => 0x9e09, 0xe5 => 0x9dff,
+    0xe6 => 0x9dfd, 0xe7 => 0x9e04, 0xe8 => 0x9ea0, 0xe9 => 0x9f1e,
+    0xea => 0x9f46, 0xeb => 0x9f74, 0xec => 0x9f75, 0xed => 0x9f76,
+    0xee => 0x56d4, 0xef => 0x652e, 0xf0 => 0x65b8, 0xf1 => 0x6b18,
+    0xf2 => 0x6b19, 0xf3 => 0x6b17, 0xf4 => 0x6b1a, 0xf5 => 0x7062,
+    0xf6 => 0x7226, 0xf7 => 0x72aa, 0xf8 => 0x77d8, 0xf9 => 0x77d9,
+    0xfa => 0x7939, 0xfb => 0x7c69, 0xfc => 0x7c6b, 0xfd => 0x7cf6,
+    0xfe => 0x7e9a,
+  },
+  0xf9 => {
+    0x40 => 0x7e98, 0x41 => 0x7e9b, 0x42 => 0x7e99, 0x43 => 0x81e0,
+    0x44 => 0x81e1, 0x45 => 0x8646, 0x46 => 0x8647, 0x47 => 0x8648,
+    0x48 => 0x8979, 0x49 => 0x897a, 0x4a => 0x897c, 0x4b => 0x897b,
+    0x4c => 0x89ff, 0x4d => 0x8b98, 0x4e => 0x8b99, 0x4f => 0x8ea5,
+    0x50 => 0x8ea4, 0x51 => 0x8ea3, 0x52 => 0x946e, 0x53 => 0x946d,
+    0x54 => 0x946f, 0x55 => 0x9471, 0x56 => 0x9473, 0x57 => 0x9749,
+    0x58 => 0x9872, 0x59 => 0x995f, 0x5a => 0x9c68, 0x5b => 0x9c6e,
+    0x5c => 0x9c6d, 0x5d => 0x9e0b, 0x5e => 0x9e0d, 0x5f => 0x9e10,
+    0x60 => 0x9e0f, 0x61 => 0x9e12, 0x62 => 0x9e11, 0x63 => 0x9ea1,
+    0x64 => 0x9ef5, 0x65 => 0x9f09, 0x66 => 0x9f47, 0x67 => 0x9f78,
+    0x68 => 0x9f7b, 0x69 => 0x9f7a, 0x6a => 0x9f79, 0x6b => 0x571e,
+    0x6c => 0x7066, 0x6d => 0x7c6f, 0x6e => 0x883c, 0x6f => 0x8db2,
+    0x70 => 0x8ea6, 0x71 => 0x91c3, 0x72 => 0x9474, 0x73 => 0x9478,
+    0x74 => 0x9476, 0x75 => 0x9475, 0x76 => 0x9a60, 0x77 => 0x9c74,
+    0x78 => 0x9c73, 0x79 => 0x9c71, 0x7a => 0x9c75, 0x7b => 0x9e14,
+    0x7c => 0x9e13, 0x7d => 0x9ef6, 0x7e => 0x9f0a, 0xa1 => 0x9fa4,
+    0xa2 => 0x7068, 0xa3 => 0x7065, 0xa4 => 0x7cf7, 0xa5 => 0x866a,
+    0xa6 => 0x883e, 0xa7 => 0x883d, 0xa8 => 0x883f, 0xa9 => 0x8b9e,
+    0xaa => 0x8c9c, 0xab => 0x8ea9, 0xac => 0x8ec9, 0xad => 0x974b,
+    0xae => 0x9873, 0xaf => 0x9874, 0xb0 => 0x98cc, 0xb1 => 0x9961,
+    0xb2 => 0x99ab, 0xb3 => 0x9a64, 0xb4 => 0x9a66, 0xb5 => 0x9a67,
+    0xb6 => 0x9b24, 0xb7 => 0x9e15, 0xb8 => 0x9e17, 0xb9 => 0x9f48,
+    0xba => 0x6207, 0xbb => 0x6b1e, 0xbc => 0x7227, 0xbd => 0x864c,
+    0xbe => 0x8ea8, 0xbf => 0x9482, 0xc0 => 0x9480, 0xc1 => 0x9481,
+    0xc2 => 0x9a69, 0xc3 => 0x9a68, 0xc4 => 0x9b2e, 0xc5 => 0x9e19,
+    0xc6 => 0x7229, 0xc7 => 0x864b, 0xc8 => 0x8b9f, 0xc9 => 0x9483,
+    0xca => 0x9c79, 0xcb => 0x9eb7, 0xcc => 0x7675, 0xcd => 0x9a6b,
+    0xce => 0x9c7a, 0xcf => 0x9e1d, 0xd0 => 0x7069, 0xd1 => 0x706a,
+    0xd2 => 0x9ea4, 0xd3 => 0x9f7e, 0xd4 => 0x9f49, 0xd5 => 0x9f98,
+  },
+);
+
+1; # end
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacCroatian.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacCroatian.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacCroatian.pm	(revision 24799)
@@ -0,0 +1,43 @@
+#------------------------------------------------------------------------------
+# File:         MacCroatian.pm
+#
+# Description:  Mac Croatian to Unicode
+#
+# Revisions:    2010/01/20 - P. Harvey created
+#
+# References:   1) http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/CROATIAN.TXT
+#
+# Notes:        The table omits 1-byte characters with the same values as Unicode
+#------------------------------------------------------------------------------
+use strict;
+
+%Image::ExifTool::Charset::MacCroatian = (
+  0x80 => 0xc4, 0x81 => 0xc5, 0x82 => 0xc7, 0x83 => 0xc9, 0x84 => 0xd1,
+  0x85 => 0xd6, 0x86 => 0xdc, 0x87 => 0xe1, 0x88 => 0xe0, 0x89 => 0xe2,
+  0x8a => 0xe4, 0x8b => 0xe3, 0x8c => 0xe5, 0x8d => 0xe7, 0x8e => 0xe9,
+  0x8f => 0xe8, 0x90 => 0xea, 0x91 => 0xeb, 0x92 => 0xed, 0x93 => 0xec,
+  0x94 => 0xee, 0x95 => 0xef, 0x96 => 0xf1, 0x97 => 0xf3, 0x98 => 0xf2,
+  0x99 => 0xf4, 0x9a => 0xf6, 0x9b => 0xf5, 0x9c => 0xfa, 0x9d => 0xf9,
+  0x9e => 0xfb, 0x9f => 0xfc, 0xa0 => 0x2020, 0xa1 => 0xb0, 0xa4 => 0xa7,
+  0xa5 => 0x2022, 0xa6 => 0xb6, 0xa7 => 0xdf, 0xa8 => 0xae, 0xa9 => 0x0160,
+  0xaa => 0x2122, 0xab => 0xb4, 0xac => 0xa8, 0xad => 0x2260, 0xae => 0x017d,
+  0xaf => 0xd8, 0xb0 => 0x221e, 0xb2 => 0x2264, 0xb3 => 0x2265, 0xb4 => 0x2206,
+  0xb6 => 0x2202, 0xb7 => 0x2211, 0xb8 => 0x220f, 0xb9 => 0x0161,
+  0xba => 0x222b, 0xbb => 0xaa, 0xbc => 0xba, 0xbd => 0x03a9, 0xbe => 0x017e,
+  0xbf => 0xf8, 0xc0 => 0xbf, 0xc1 => 0xa1, 0xc2 => 0xac, 0xc3 => 0x221a,
+  0xc4 => 0x0192, 0xc5 => 0x2248, 0xc6 => 0x0106, 0xc7 => 0xab, 0xc8 => 0x010c,
+  0xc9 => 0x2026, 0xca => 0xa0, 0xcb => 0xc0, 0xcc => 0xc3, 0xcd => 0xd5,
+  0xce => 0x0152, 0xcf => 0x0153, 0xd0 => 0x0110, 0xd1 => 0x2014,
+  0xd2 => 0x201c, 0xd3 => 0x201d, 0xd4 => 0x2018, 0xd5 => 0x2019, 0xd6 => 0xf7,
+  0xd7 => 0x25ca, 0xd8 => 0xf8ff, 0xd9 => 0xa9, 0xda => 0x2044, 0xdb => 0x20ac,
+  0xdc => 0x2039, 0xdd => 0x203a, 0xde => 0xc6, 0xdf => 0xbb, 0xe0 => 0x2013,
+  0xe1 => 0xb7, 0xe2 => 0x201a, 0xe3 => 0x201e, 0xe4 => 0x2030, 0xe5 => 0xc2,
+  0xe6 => 0x0107, 0xe7 => 0xc1, 0xe8 => 0x010d, 0xe9 => 0xc8, 0xea => 0xcd,
+  0xeb => 0xce, 0xec => 0xcf, 0xed => 0xcc, 0xee => 0xd3, 0xef => 0xd4,
+  0xf0 => 0x0111, 0xf1 => 0xd2, 0xf2 => 0xda, 0xf3 => 0xdb, 0xf4 => 0xd9,
+  0xf5 => 0x0131, 0xf6 => 0x02c6, 0xf7 => 0x02dc, 0xf8 => 0xaf, 0xf9 => 0x03c0,
+  0xfa => 0xcb, 0xfb => 0x02da, 0xfc => 0xb8, 0xfd => 0xca, 0xfe => 0xe6,
+  0xff => 0x02c7,
+);
+
+1; # end
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacCyrillic.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacCyrillic.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacCyrillic.pm	(revision 24799)
@@ -0,0 +1,47 @@
+#------------------------------------------------------------------------------
+# File:         MacCyrillic.pm
+#
+# Description:  Mac Cyrillic to Unicode
+#
+# Revisions:    2010/01/20 - P. Harvey created
+#
+# References:   1) http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/CYRILLIC.TXT
+#
+# Notes:        The table omits 1-byte characters with the same values as Unicode
+#------------------------------------------------------------------------------
+use strict;
+
+%Image::ExifTool::Charset::MacCyrillic = (
+  0x80 => 0x0410, 0x81 => 0x0411, 0x82 => 0x0412, 0x83 => 0x0413,
+  0x84 => 0x0414, 0x85 => 0x0415, 0x86 => 0x0416, 0x87 => 0x0417,
+  0x88 => 0x0418, 0x89 => 0x0419, 0x8a => 0x041a, 0x8b => 0x041b,
+  0x8c => 0x041c, 0x8d => 0x041d, 0x8e => 0x041e, 0x8f => 0x041f,
+  0x90 => 0x0420, 0x91 => 0x0421, 0x92 => 0x0422, 0x93 => 0x0423,
+  0x94 => 0x0424, 0x95 => 0x0425, 0x96 => 0x0426, 0x97 => 0x0427,
+  0x98 => 0x0428, 0x99 => 0x0429, 0x9a => 0x042a, 0x9b => 0x042b,
+  0x9c => 0x042c, 0x9d => 0x042d, 0x9e => 0x042e, 0x9f => 0x042f,
+  0xa0 => 0x2020, 0xa1 => 0xb0, 0xa2 => 0x0490, 0xa4 => 0xa7, 0xa5 => 0x2022,
+  0xa6 => 0xb6, 0xa7 => 0x0406, 0xa8 => 0xae, 0xaa => 0x2122, 0xab => 0x0402,
+  0xac => 0x0452, 0xad => 0x2260, 0xae => 0x0403, 0xaf => 0x0453,
+  0xb0 => 0x221e, 0xb2 => 0x2264, 0xb3 => 0x2265, 0xb4 => 0x0456,
+  0xb6 => 0x0491, 0xb7 => 0x0408, 0xb8 => 0x0404, 0xb9 => 0x0454,
+  0xba => 0x0407, 0xbb => 0x0457, 0xbc => 0x0409, 0xbd => 0x0459,
+  0xbe => 0x040a, 0xbf => 0x045a, 0xc0 => 0x0458, 0xc1 => 0x0405, 0xc2 => 0xac,
+  0xc3 => 0x221a, 0xc4 => 0x0192, 0xc5 => 0x2248, 0xc6 => 0x2206, 0xc7 => 0xab,
+  0xc8 => 0xbb, 0xc9 => 0x2026, 0xca => 0xa0, 0xcb => 0x040b, 0xcc => 0x045b,
+  0xcd => 0x040c, 0xce => 0x045c, 0xcf => 0x0455, 0xd0 => 0x2013,
+  0xd1 => 0x2014, 0xd2 => 0x201c, 0xd3 => 0x201d, 0xd4 => 0x2018,
+  0xd5 => 0x2019, 0xd6 => 0xf7, 0xd7 => 0x201e, 0xd8 => 0x040e, 0xd9 => 0x045e,
+  0xda => 0x040f, 0xdb => 0x045f, 0xdc => 0x2116, 0xdd => 0x0401,
+  0xde => 0x0451, 0xdf => 0x044f, 0xe0 => 0x0430, 0xe1 => 0x0431,
+  0xe2 => 0x0432, 0xe3 => 0x0433, 0xe4 => 0x0434, 0xe5 => 0x0435,
+  0xe6 => 0x0436, 0xe7 => 0x0437, 0xe8 => 0x0438, 0xe9 => 0x0439,
+  0xea => 0x043a, 0xeb => 0x043b, 0xec => 0x043c, 0xed => 0x043d,
+  0xee => 0x043e, 0xef => 0x043f, 0xf0 => 0x0440, 0xf1 => 0x0441,
+  0xf2 => 0x0442, 0xf3 => 0x0443, 0xf4 => 0x0444, 0xf5 => 0x0445,
+  0xf6 => 0x0446, 0xf7 => 0x0447, 0xf8 => 0x0448, 0xf9 => 0x0449,
+  0xfa => 0x044a, 0xfb => 0x044b, 0xfc => 0x044c, 0xfd => 0x044d,
+  0xfe => 0x044e, 0xff => 0x20ac,
+);
+
+1; # end
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacGreek.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacGreek.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacGreek.pm	(revision 24799)
@@ -0,0 +1,45 @@
+#------------------------------------------------------------------------------
+# File:         MacGreek.pm
+#
+# Description:  Mac Greek to Unicode
+#
+# Revisions:    2010/01/20 - P. Harvey created
+#
+# References:   1) http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/GREEK.TXT
+#
+# Notes:        The table omits 1-byte characters with the same values as Unicode
+#------------------------------------------------------------------------------
+use strict;
+
+%Image::ExifTool::Charset::MacGreek = (
+  0x80 => 0xc4, 0x81 => 0xb9, 0x82 => 0xb2, 0x83 => 0xc9, 0x84 => 0xb3,
+  0x85 => 0xd6, 0x86 => 0xdc, 0x87 => 0x0385, 0x88 => 0xe0, 0x89 => 0xe2,
+  0x8a => 0xe4, 0x8b => 0x0384, 0x8c => 0xa8, 0x8d => 0xe7, 0x8e => 0xe9,
+  0x8f => 0xe8, 0x90 => 0xea, 0x91 => 0xeb, 0x92 => 0xa3, 0x93 => 0x2122,
+  0x94 => 0xee, 0x95 => 0xef, 0x96 => 0x2022, 0x97 => 0xbd, 0x98 => 0x2030,
+  0x99 => 0xf4, 0x9a => 0xf6, 0x9b => 0xa6, 0x9c => 0x20ac, 0x9d => 0xf9,
+  0x9e => 0xfb, 0x9f => 0xfc, 0xa0 => 0x2020, 0xa1 => 0x0393, 0xa2 => 0x0394,
+  0xa3 => 0x0398, 0xa4 => 0x039b, 0xa5 => 0x039e, 0xa6 => 0x03a0, 0xa7 => 0xdf,
+  0xa8 => 0xae, 0xaa => 0x03a3, 0xab => 0x03aa, 0xac => 0xa7, 0xad => 0x2260,
+  0xae => 0xb0, 0xaf => 0xb7, 0xb0 => 0x0391, 0xb2 => 0x2264, 0xb3 => 0x2265,
+  0xb4 => 0xa5, 0xb5 => 0x0392, 0xb6 => 0x0395, 0xb7 => 0x0396, 0xb8 => 0x0397,
+  0xb9 => 0x0399, 0xba => 0x039a, 0xbb => 0x039c, 0xbc => 0x03a6,
+  0xbd => 0x03ab, 0xbe => 0x03a8, 0xbf => 0x03a9, 0xc0 => 0x03ac,
+  0xc1 => 0x039d, 0xc2 => 0xac, 0xc3 => 0x039f, 0xc4 => 0x03a1, 0xc5 => 0x2248,
+  0xc6 => 0x03a4, 0xc7 => 0xab, 0xc8 => 0xbb, 0xc9 => 0x2026, 0xca => 0xa0,
+  0xcb => 0x03a5, 0xcc => 0x03a7, 0xcd => 0x0386, 0xce => 0x0388,
+  0xcf => 0x0153, 0xd0 => 0x2013, 0xd1 => 0x2015, 0xd2 => 0x201c,
+  0xd3 => 0x201d, 0xd4 => 0x2018, 0xd5 => 0x2019, 0xd6 => 0xf7, 0xd7 => 0x0389,
+  0xd8 => 0x038a, 0xd9 => 0x038c, 0xda => 0x038e, 0xdb => 0x03ad,
+  0xdc => 0x03ae, 0xdd => 0x03af, 0xde => 0x03cc, 0xdf => 0x038f,
+  0xe0 => 0x03cd, 0xe1 => 0x03b1, 0xe2 => 0x03b2, 0xe3 => 0x03c8,
+  0xe4 => 0x03b4, 0xe5 => 0x03b5, 0xe6 => 0x03c6, 0xe7 => 0x03b3,
+  0xe8 => 0x03b7, 0xe9 => 0x03b9, 0xea => 0x03be, 0xeb => 0x03ba,
+  0xec => 0x03bb, 0xed => 0x03bc, 0xee => 0x03bd, 0xef => 0x03bf,
+  0xf0 => 0x03c0, 0xf1 => 0x03ce, 0xf2 => 0x03c1, 0xf3 => 0x03c3,
+  0xf4 => 0x03c4, 0xf5 => 0x03b8, 0xf6 => 0x03c9, 0xf7 => 0x03c2,
+  0xf8 => 0x03c7, 0xf9 => 0x03c5, 0xfa => 0x03b6, 0xfb => 0x03ca,
+  0xfc => 0x03cb, 0xfd => 0x0390, 0xfe => 0x03b0, 0xff => 0xad,
+);
+
+1; # end
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacHebrew.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacHebrew.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacHebrew.pm	(revision 24799)
@@ -0,0 +1,47 @@
+#------------------------------------------------------------------------------
+# File:         MacHebrew.pm
+#
+# Description:  Mac Hebrew to Unicode
+#
+# Revisions:    2010/01/20 - P. Harvey created
+#
+# References:   1) http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/HEBREW.TXT
+#
+# Notes:        The table omits 1-byte characters with the same values as Unicode
+#               and directional characters are ignored
+#------------------------------------------------------------------------------
+use strict;
+
+%Image::ExifTool::Charset::MacHebrew = (
+  0x80 => 0xc4, 0x81 => [0x05f2,0x05b7], 0x82 => 0xc7, 0x83 => 0xc9,
+  0x84 => 0xd1, 0x85 => 0xd6, 0x86 => 0xdc, 0x87 => 0xe1, 0x88 => 0xe0,
+  0x89 => 0xe2, 0x8a => 0xe4, 0x8b => 0xe3, 0x8c => 0xe5, 0x8d => 0xe7,
+  0x8e => 0xe9, 0x8f => 0xe8, 0x90 => 0xea, 0x91 => 0xeb, 0x92 => 0xed,
+  0x93 => 0xec, 0x94 => 0xee, 0x95 => 0xef, 0x96 => 0xf1, 0x97 => 0xf3,
+  0x98 => 0xf2, 0x99 => 0xf4, 0x9a => 0xf6, 0x9b => 0xf5, 0x9c => 0xfa,
+  0x9d => 0xf9, 0x9e => 0xfb, 0x9f => 0xfc, 0xa0 => 0x20, 0xa1 => 0x21,
+  0xa2 => 0x22, 0xa3 => 0x23, 0xa4 => 0x24, 0xa5 => 0x25, 0xa6 => 0x20aa,
+  0xa7 => 0x27, 0xa8 => 0x29, 0xa9 => 0x28, 0xaa => 0x2a, 0xab => 0x2b,
+  0xac => 0x2c, 0xad => 0x2d, 0xae => 0x2e, 0xaf => 0x2f, 0xb0 => 0x30,
+  0xb1 => 0x31, 0xb2 => 0x32, 0xb3 => 0x33, 0xb4 => 0x34, 0xb5 => 0x35,
+  0xb6 => 0x36, 0xb7 => 0x37, 0xb8 => 0x38, 0xb9 => 0x39, 0xba => 0x3a,
+  0xbb => 0x3b, 0xbc => 0x3c, 0xbd => 0x3d, 0xbe => 0x3e, 0xbf => 0x3f,
+  0xc0 => [0xf86a,0x05dc,0x05b9], 0xc1 => 0x201e, 0xc2 => 0xf89b,
+  0xc3 => 0xf89c, 0xc4 => 0xf89d, 0xc5 => 0xf89e, 0xc6 => 0x05bc,
+  0xc7 => 0xfb4b, 0xc8 => 0xfb35, 0xc9 => 0x2026, 0xca => 0xa0, 0xcb => 0x05b8,
+  0xcc => 0x05b7, 0xcd => 0x05b5, 0xce => 0x05b6, 0xcf => 0x05b4,
+  0xd0 => 0x2013, 0xd1 => 0x2014, 0xd2 => 0x201c, 0xd3 => 0x201d,
+  0xd4 => 0x2018, 0xd5 => 0x2019, 0xd6 => 0xfb2a, 0xd7 => 0xfb2b,
+  0xd8 => 0x05bf, 0xd9 => 0x05b0, 0xda => 0x05b2, 0xdb => 0x05b1,
+  0xdc => 0x05bb, 0xdd => 0x05b9, 0xde => [0x05b8,0xf87f], 0xdf => 0x05b3,
+  0xe0 => 0x05d0, 0xe1 => 0x05d1, 0xe2 => 0x05d2, 0xe3 => 0x05d3,
+  0xe4 => 0x05d4, 0xe5 => 0x05d5, 0xe6 => 0x05d6, 0xe7 => 0x05d7,
+  0xe8 => 0x05d8, 0xe9 => 0x05d9, 0xea => 0x05da, 0xeb => 0x05db,
+  0xec => 0x05dc, 0xed => 0x05dd, 0xee => 0x05de, 0xef => 0x05df,
+  0xf0 => 0x05e0, 0xf1 => 0x05e1, 0xf2 => 0x05e2, 0xf3 => 0x05e3,
+  0xf4 => 0x05e4, 0xf5 => 0x05e5, 0xf6 => 0x05e6, 0xf7 => 0x05e7,
+  0xf8 => 0x05e8, 0xf9 => 0x05e9, 0xfa => 0x05ea, 0xfb => 0x7d, 0xfc => 0x5d,
+  0xfd => 0x7b, 0xfe => 0x5b, 0xff => 0x7c,
+);
+
+1; # end
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacIceland.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacIceland.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacIceland.pm	(revision 24799)
@@ -0,0 +1,42 @@
+#------------------------------------------------------------------------------
+# File:         MacIceland.pm
+#
+# Description:  Mac Icelandic to Unicode
+#
+# Revisions:    2010/01/20 - P. Harvey created
+#
+# References:   1) http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/ICELAND.TXT
+#
+# Notes:        The table omits 1-byte characters with the same values as Unicode
+#------------------------------------------------------------------------------
+use strict;
+
+%Image::ExifTool::Charset::MacIceland = (
+  0x80 => 0xc4, 0x81 => 0xc5, 0x82 => 0xc7, 0x83 => 0xc9, 0x84 => 0xd1,
+  0x85 => 0xd6, 0x86 => 0xdc, 0x87 => 0xe1, 0x88 => 0xe0, 0x89 => 0xe2,
+  0x8a => 0xe4, 0x8b => 0xe3, 0x8c => 0xe5, 0x8d => 0xe7, 0x8e => 0xe9,
+  0x8f => 0xe8, 0x90 => 0xea, 0x91 => 0xeb, 0x92 => 0xed, 0x93 => 0xec,
+  0x94 => 0xee, 0x95 => 0xef, 0x96 => 0xf1, 0x97 => 0xf3, 0x98 => 0xf2,
+  0x99 => 0xf4, 0x9a => 0xf6, 0x9b => 0xf5, 0x9c => 0xfa, 0x9d => 0xf9,
+  0x9e => 0xfb, 0x9f => 0xfc, 0xa0 => 0xdd, 0xa1 => 0xb0, 0xa4 => 0xa7,
+  0xa5 => 0x2022, 0xa6 => 0xb6, 0xa7 => 0xdf, 0xa8 => 0xae, 0xaa => 0x2122,
+  0xab => 0xb4, 0xac => 0xa8, 0xad => 0x2260, 0xae => 0xc6, 0xaf => 0xd8,
+  0xb0 => 0x221e, 0xb2 => 0x2264, 0xb3 => 0x2265, 0xb4 => 0xa5, 0xb6 => 0x2202,
+  0xb7 => 0x2211, 0xb8 => 0x220f, 0xb9 => 0x03c0, 0xba => 0x222b, 0xbb => 0xaa,
+  0xbc => 0xba, 0xbd => 0x03a9, 0xbe => 0xe6, 0xbf => 0xf8, 0xc0 => 0xbf,
+  0xc1 => 0xa1, 0xc2 => 0xac, 0xc3 => 0x221a, 0xc4 => 0x0192, 0xc5 => 0x2248,
+  0xc6 => 0x2206, 0xc7 => 0xab, 0xc8 => 0xbb, 0xc9 => 0x2026, 0xca => 0xa0,
+  0xcb => 0xc0, 0xcc => 0xc3, 0xcd => 0xd5, 0xce => 0x0152, 0xcf => 0x0153,
+  0xd0 => 0x2013, 0xd1 => 0x2014, 0xd2 => 0x201c, 0xd3 => 0x201d,
+  0xd4 => 0x2018, 0xd5 => 0x2019, 0xd6 => 0xf7, 0xd7 => 0x25ca, 0xd8 => 0xff,
+  0xd9 => 0x0178, 0xda => 0x2044, 0xdb => 0x20ac, 0xdc => 0xd0, 0xdd => 0xf0,
+  0xdf => 0xfe, 0xe0 => 0xfd, 0xe1 => 0xb7, 0xe2 => 0x201a, 0xe3 => 0x201e,
+  0xe4 => 0x2030, 0xe5 => 0xc2, 0xe6 => 0xca, 0xe7 => 0xc1, 0xe8 => 0xcb,
+  0xe9 => 0xc8, 0xea => 0xcd, 0xeb => 0xce, 0xec => 0xcf, 0xed => 0xcc,
+  0xee => 0xd3, 0xef => 0xd4, 0xf0 => 0xf8ff, 0xf1 => 0xd2, 0xf2 => 0xda,
+  0xf3 => 0xdb, 0xf4 => 0xd9, 0xf5 => 0x0131, 0xf6 => 0x02c6, 0xf7 => 0x02dc,
+  0xf8 => 0xaf, 0xf9 => 0x02d8, 0xfa => 0x02d9, 0xfb => 0x02da, 0xfc => 0xb8,
+  0xfd => 0x02dd, 0xfe => 0x02db, 0xff => 0x02c7,
+);
+
+1; # end
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacJapanese.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacJapanese.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacJapanese.pm	(revision 24799)
@@ -0,0 +1,1933 @@
+#------------------------------------------------------------------------------
+# File:         MacJapanese.pm
+#
+# Description:  Mac Japanese to Unicode
+#
+# Revisions:    2010/01/20 - P. Harvey created
+#
+# References:   1) http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/JAPANESE.TXT
+#
+# Notes:        The table omits 1-byte characters with the same values as Unicode
+#               This set re-maps characters with codepoints less than 0x80
+#------------------------------------------------------------------------------
+use strict;
+
+%Image::ExifTool::Charset::MacJapanese = (
+  0x5c => 0xa5, 0x80 => 0x5c, 0xa1 => 0xff61, 0xa2 => 0xff62, 0xa3 => 0xff63,
+  0xa4 => 0xff64, 0xa5 => 0xff65, 0xa6 => 0xff66, 0xa7 => 0xff67,
+  0xa8 => 0xff68, 0xa9 => 0xff69, 0xaa => 0xff6a, 0xab => 0xff6b,
+  0xac => 0xff6c, 0xad => 0xff6d, 0xae => 0xff6e, 0xaf => 0xff6f,
+  0xb0 => 0xff70, 0xb1 => 0xff71, 0xb2 => 0xff72, 0xb3 => 0xff73,
+  0xb4 => 0xff74, 0xb5 => 0xff75, 0xb6 => 0xff76, 0xb7 => 0xff77,
+  0xb8 => 0xff78, 0xb9 => 0xff79, 0xba => 0xff7a, 0xbb => 0xff7b,
+  0xbc => 0xff7c, 0xbd => 0xff7d, 0xbe => 0xff7e, 0xbf => 0xff7f,
+  0xc0 => 0xff80, 0xc1 => 0xff81, 0xc2 => 0xff82, 0xc3 => 0xff83,
+  0xc4 => 0xff84, 0xc5 => 0xff85, 0xc6 => 0xff86, 0xc7 => 0xff87,
+  0xc8 => 0xff88, 0xc9 => 0xff89, 0xca => 0xff8a, 0xcb => 0xff8b,
+  0xcc => 0xff8c, 0xcd => 0xff8d, 0xce => 0xff8e, 0xcf => 0xff8f,
+  0xd0 => 0xff90, 0xd1 => 0xff91, 0xd2 => 0xff92, 0xd3 => 0xff93,
+  0xd4 => 0xff94, 0xd5 => 0xff95, 0xd6 => 0xff96, 0xd7 => 0xff97,
+  0xd8 => 0xff98, 0xd9 => 0xff99, 0xda => 0xff9a, 0xdb => 0xff9b,
+  0xdc => 0xff9c, 0xdd => 0xff9d, 0xde => 0xff9e, 0xdf => 0xff9f, 0xfd => 0xa9,
+  0xfe => 0x2122, 0xff => [0x2026,0xf87f],
+  0x81 => {
+    0x40 => 0x3000, 0x41 => 0x3001, 0x42 => 0x3002, 0x43 => 0xff0c,
+    0x44 => 0xff0e, 0x45 => 0x30fb, 0x46 => 0xff1a, 0x47 => 0xff1b,
+    0x48 => 0xff1f, 0x49 => 0xff01, 0x4a => 0x309b, 0x4b => 0x309c,
+    0x4c => 0xb4, 0x4d => 0xff40, 0x4e => 0xa8, 0x4f => 0xff3e, 0x50 => 0xffe3,
+    0x51 => 0xff3f, 0x52 => 0x30fd, 0x53 => 0x30fe, 0x54 => 0x309d,
+    0x55 => 0x309e, 0x56 => 0x3003, 0x57 => 0x4edd, 0x58 => 0x3005,
+    0x59 => 0x3006, 0x5a => 0x3007, 0x5b => 0x30fc, 0x5c => 0x2014,
+    0x5d => 0x2010, 0x5e => 0xff0f, 0x5f => 0xff3c, 0x60 => 0x301c,
+    0x61 => 0x2016, 0x62 => 0xff5c, 0x63 => 0x2026, 0x64 => 0x2025,
+    0x65 => 0x2018, 0x66 => 0x2019, 0x67 => 0x201c, 0x68 => 0x201d,
+    0x69 => 0xff08, 0x6a => 0xff09, 0x6b => 0x3014, 0x6c => 0x3015,
+    0x6d => 0xff3b, 0x6e => 0xff3d, 0x6f => 0xff5b, 0x70 => 0xff5d,
+    0x71 => 0x3008, 0x72 => 0x3009, 0x73 => 0x300a, 0x74 => 0x300b,
+    0x75 => 0x300c, 0x76 => 0x300d, 0x77 => 0x300e, 0x78 => 0x300f,
+    0x79 => 0x3010, 0x7a => 0x3011, 0x7b => 0xff0b, 0x7c => 0x2212,
+    0x7d => 0xb1, 0x7e => 0xd7, 0x80 => 0xf7, 0x81 => 0xff1d, 0x82 => 0x2260,
+    0x83 => 0xff1c, 0x84 => 0xff1e, 0x85 => 0x2266, 0x86 => 0x2267,
+    0x87 => 0x221e, 0x88 => 0x2234, 0x89 => 0x2642, 0x8a => 0x2640,
+    0x8b => 0xb0, 0x8c => 0x2032, 0x8d => 0x2033, 0x8e => 0x2103,
+    0x8f => 0xffe5, 0x90 => 0xff04, 0x91 => 0xa2, 0x92 => 0xa3, 0x93 => 0xff05,
+    0x94 => 0xff03, 0x95 => 0xff06, 0x96 => 0xff0a, 0x97 => 0xff20,
+    0x98 => 0xa7, 0x99 => 0x2606, 0x9a => 0x2605, 0x9b => 0x25cb,
+    0x9c => 0x25cf, 0x9d => 0x25ce, 0x9e => 0x25c7, 0x9f => 0x25c6,
+    0xa0 => 0x25a1, 0xa1 => 0x25a0, 0xa2 => 0x25b3, 0xa3 => 0x25b2,
+    0xa4 => 0x25bd, 0xa5 => 0x25bc, 0xa6 => 0x203b, 0xa7 => 0x3012,
+    0xa8 => 0x2192, 0xa9 => 0x2190, 0xaa => 0x2191, 0xab => 0x2193,
+    0xac => 0x3013, 0xb8 => 0x2208, 0xb9 => 0x220b, 0xba => 0x2286,
+    0xbb => 0x2287, 0xbc => 0x2282, 0xbd => 0x2283, 0xbe => 0x222a,
+    0xbf => 0x2229, 0xc8 => 0x2227, 0xc9 => 0x2228, 0xca => 0xac,
+    0xcb => 0x21d2, 0xcc => 0x21d4, 0xcd => 0x2200, 0xce => 0x2203,
+    0xda => 0x2220, 0xdb => 0x22a5, 0xdc => 0x2312, 0xdd => 0x2202,
+    0xde => 0x2207, 0xdf => 0x2261, 0xe0 => 0x2252, 0xe1 => 0x226a,
+    0xe2 => 0x226b, 0xe3 => 0x221a, 0xe4 => 0x223d, 0xe5 => 0x221d,
+    0xe6 => 0x2235, 0xe7 => 0x222b, 0xe8 => 0x222c, 0xf0 => 0x212b,
+    0xf1 => 0x2030, 0xf2 => 0x266f, 0xf3 => 0x266d, 0xf4 => 0x266a,
+    0xf5 => 0x2020, 0xf6 => 0x2021, 0xf7 => 0xb6, 0xfc => 0x25ef,
+  },
+  0x82 => {
+    0x4f => 0xff10, 0x50 => 0xff11, 0x51 => 0xff12, 0x52 => 0xff13,
+    0x53 => 0xff14, 0x54 => 0xff15, 0x55 => 0xff16, 0x56 => 0xff17,
+    0x57 => 0xff18, 0x58 => 0xff19, 0x60 => 0xff21, 0x61 => 0xff22,
+    0x62 => 0xff23, 0x63 => 0xff24, 0x64 => 0xff25, 0x65 => 0xff26,
+    0x66 => 0xff27, 0x67 => 0xff28, 0x68 => 0xff29, 0x69 => 0xff2a,
+    0x6a => 0xff2b, 0x6b => 0xff2c, 0x6c => 0xff2d, 0x6d => 0xff2e,
+    0x6e => 0xff2f, 0x6f => 0xff30, 0x70 => 0xff31, 0x71 => 0xff32,
+    0x72 => 0xff33, 0x73 => 0xff34, 0x74 => 0xff35, 0x75 => 0xff36,
+    0x76 => 0xff37, 0x77 => 0xff38, 0x78 => 0xff39, 0x79 => 0xff3a,
+    0x81 => 0xff41, 0x82 => 0xff42, 0x83 => 0xff43, 0x84 => 0xff44,
+    0x85 => 0xff45, 0x86 => 0xff46, 0x87 => 0xff47, 0x88 => 0xff48,
+    0x89 => 0xff49, 0x8a => 0xff4a, 0x8b => 0xff4b, 0x8c => 0xff4c,
+    0x8d => 0xff4d, 0x8e => 0xff4e, 0x8f => 0xff4f, 0x90 => 0xff50,
+    0x91 => 0xff51, 0x92 => 0xff52, 0x93 => 0xff53, 0x94 => 0xff54,
+    0x95 => 0xff55, 0x96 => 0xff56, 0x97 => 0xff57, 0x98 => 0xff58,
+    0x99 => 0xff59, 0x9a => 0xff5a, 0x9f => 0x3041, 0xa0 => 0x3042,
+    0xa1 => 0x3043, 0xa2 => 0x3044, 0xa3 => 0x3045, 0xa4 => 0x3046,
+    0xa5 => 0x3047, 0xa6 => 0x3048, 0xa7 => 0x3049, 0xa8 => 0x304a,
+    0xa9 => 0x304b, 0xaa => 0x304c, 0xab => 0x304d, 0xac => 0x304e,
+    0xad => 0x304f, 0xae => 0x3050, 0xaf => 0x3051, 0xb0 => 0x3052,
+    0xb1 => 0x3053, 0xb2 => 0x3054, 0xb3 => 0x3055, 0xb4 => 0x3056,
+    0xb5 => 0x3057, 0xb6 => 0x3058, 0xb7 => 0x3059, 0xb8 => 0x305a,
+    0xb9 => 0x305b, 0xba => 0x305c, 0xbb => 0x305d, 0xbc => 0x305e,
+    0xbd => 0x305f, 0xbe => 0x3060, 0xbf => 0x3061, 0xc0 => 0x3062,
+    0xc1 => 0x3063, 0xc2 => 0x3064, 0xc3 => 0x3065, 0xc4 => 0x3066,
+    0xc5 => 0x3067, 0xc6 => 0x3068, 0xc7 => 0x3069, 0xc8 => 0x306a,
+    0xc9 => 0x306b, 0xca => 0x306c, 0xcb => 0x306d, 0xcc => 0x306e,
+    0xcd => 0x306f, 0xce => 0x3070, 0xcf => 0x3071, 0xd0 => 0x3072,
+    0xd1 => 0x3073, 0xd2 => 0x3074, 0xd3 => 0x3075, 0xd4 => 0x3076,
+    0xd5 => 0x3077, 0xd6 => 0x3078, 0xd7 => 0x3079, 0xd8 => 0x307a,
+    0xd9 => 0x307b, 0xda => 0x307c, 0xdb => 0x307d, 0xdc => 0x307e,
+    0xdd => 0x307f, 0xde => 0x3080, 0xdf => 0x3081, 0xe0 => 0x3082,
+    0xe1 => 0x3083, 0xe2 => 0x3084, 0xe3 => 0x3085, 0xe4 => 0x3086,
+    0xe5 => 0x3087, 0xe6 => 0x3088, 0xe7 => 0x3089, 0xe8 => 0x308a,
+    0xe9 => 0x308b, 0xea => 0x308c, 0xeb => 0x308d, 0xec => 0x308e,
+    0xed => 0x308f, 0xee => 0x3090, 0xef => 0x3091, 0xf0 => 0x3092,
+    0xf1 => 0x3093,
+  },
+  0x83 => {
+    0x40 => 0x30a1, 0x41 => 0x30a2, 0x42 => 0x30a3, 0x43 => 0x30a4,
+    0x44 => 0x30a5, 0x45 => 0x30a6, 0x46 => 0x30a7, 0x47 => 0x30a8,
+    0x48 => 0x30a9, 0x49 => 0x30aa, 0x4a => 0x30ab, 0x4b => 0x30ac,
+    0x4c => 0x30ad, 0x4d => 0x30ae, 0x4e => 0x30af, 0x4f => 0x30b0,
+    0x50 => 0x30b1, 0x51 => 0x30b2, 0x52 => 0x30b3, 0x53 => 0x30b4,
+    0x54 => 0x30b5, 0x55 => 0x30b6, 0x56 => 0x30b7, 0x57 => 0x30b8,
+    0x58 => 0x30b9, 0x59 => 0x30ba, 0x5a => 0x30bb, 0x5b => 0x30bc,
+    0x5c => 0x30bd, 0x5d => 0x30be, 0x5e => 0x30bf, 0x5f => 0x30c0,
+    0x60 => 0x30c1, 0x61 => 0x30c2, 0x62 => 0x30c3, 0x63 => 0x30c4,
+    0x64 => 0x30c5, 0x65 => 0x30c6, 0x66 => 0x30c7, 0x67 => 0x30c8,
+    0x68 => 0x30c9, 0x69 => 0x30ca, 0x6a => 0x30cb, 0x6b => 0x30cc,
+    0x6c => 0x30cd, 0x6d => 0x30ce, 0x6e => 0x30cf, 0x6f => 0x30d0,
+    0x70 => 0x30d1, 0x71 => 0x30d2, 0x72 => 0x30d3, 0x73 => 0x30d4,
+    0x74 => 0x30d5, 0x75 => 0x30d6, 0x76 => 0x30d7, 0x77 => 0x30d8,
+    0x78 => 0x30d9, 0x79 => 0x30da, 0x7a => 0x30db, 0x7b => 0x30dc,
+    0x7c => 0x30dd, 0x7d => 0x30de, 0x7e => 0x30df, 0x80 => 0x30e0,
+    0x81 => 0x30e1, 0x82 => 0x30e2, 0x83 => 0x30e3, 0x84 => 0x30e4,
+    0x85 => 0x30e5, 0x86 => 0x30e6, 0x87 => 0x30e7, 0x88 => 0x30e8,
+    0x89 => 0x30e9, 0x8a => 0x30ea, 0x8b => 0x30eb, 0x8c => 0x30ec,
+    0x8d => 0x30ed, 0x8e => 0x30ee, 0x8f => 0x30ef, 0x90 => 0x30f0,
+    0x91 => 0x30f1, 0x92 => 0x30f2, 0x93 => 0x30f3, 0x94 => 0x30f4,
+    0x95 => 0x30f5, 0x96 => 0x30f6, 0x9f => 0x0391, 0xa0 => 0x0392,
+    0xa1 => 0x0393, 0xa2 => 0x0394, 0xa3 => 0x0395, 0xa4 => 0x0396,
+    0xa5 => 0x0397, 0xa6 => 0x0398, 0xa7 => 0x0399, 0xa8 => 0x039a,
+    0xa9 => 0x039b, 0xaa => 0x039c, 0xab => 0x039d, 0xac => 0x039e,
+    0xad => 0x039f, 0xae => 0x03a0, 0xaf => 0x03a1, 0xb0 => 0x03a3,
+    0xb1 => 0x03a4, 0xb2 => 0x03a5, 0xb3 => 0x03a6, 0xb4 => 0x03a7,
+    0xb5 => 0x03a8, 0xb6 => 0x03a9, 0xbf => 0x03b1, 0xc0 => 0x03b2,
+    0xc1 => 0x03b3, 0xc2 => 0x03b4, 0xc3 => 0x03b5, 0xc4 => 0x03b6,
+    0xc5 => 0x03b7, 0xc6 => 0x03b8, 0xc7 => 0x03b9, 0xc8 => 0x03ba,
+    0xc9 => 0x03bb, 0xca => 0x03bc, 0xcb => 0x03bd, 0xcc => 0x03be,
+    0xcd => 0x03bf, 0xce => 0x03c0, 0xcf => 0x03c1, 0xd0 => 0x03c3,
+    0xd1 => 0x03c4, 0xd2 => 0x03c5, 0xd3 => 0x03c6, 0xd4 => 0x03c7,
+    0xd5 => 0x03c8, 0xd6 => 0x03c9,
+  },
+  0x84 => {
+    0x40 => 0x0410, 0x41 => 0x0411, 0x42 => 0x0412, 0x43 => 0x0413,
+    0x44 => 0x0414, 0x45 => 0x0415, 0x46 => 0x0401, 0x47 => 0x0416,
+    0x48 => 0x0417, 0x49 => 0x0418, 0x4a => 0x0419, 0x4b => 0x041a,
+    0x4c => 0x041b, 0x4d => 0x041c, 0x4e => 0x041d, 0x4f => 0x041e,
+    0x50 => 0x041f, 0x51 => 0x0420, 0x52 => 0x0421, 0x53 => 0x0422,
+    0x54 => 0x0423, 0x55 => 0x0424, 0x56 => 0x0425, 0x57 => 0x0426,
+    0x58 => 0x0427, 0x59 => 0x0428, 0x5a => 0x0429, 0x5b => 0x042a,
+    0x5c => 0x042b, 0x5d => 0x042c, 0x5e => 0x042d, 0x5f => 0x042e,
+    0x60 => 0x042f, 0x70 => 0x0430, 0x71 => 0x0431, 0x72 => 0x0432,
+    0x73 => 0x0433, 0x74 => 0x0434, 0x75 => 0x0435, 0x76 => 0x0451,
+    0x77 => 0x0436, 0x78 => 0x0437, 0x79 => 0x0438, 0x7a => 0x0439,
+    0x7b => 0x043a, 0x7c => 0x043b, 0x7d => 0x043c, 0x7e => 0x043d,
+    0x80 => 0x043e, 0x81 => 0x043f, 0x82 => 0x0440, 0x83 => 0x0441,
+    0x84 => 0x0442, 0x85 => 0x0443, 0x86 => 0x0444, 0x87 => 0x0445,
+    0x88 => 0x0446, 0x89 => 0x0447, 0x8a => 0x0448, 0x8b => 0x0449,
+    0x8c => 0x044a, 0x8d => 0x044b, 0x8e => 0x044c, 0x8f => 0x044d,
+    0x90 => 0x044e, 0x91 => 0x044f, 0x9f => 0x2500, 0xa0 => 0x2502,
+    0xa1 => 0x250c, 0xa2 => 0x2510, 0xa3 => 0x2518, 0xa4 => 0x2514,
+    0xa5 => 0x251c, 0xa6 => 0x252c, 0xa7 => 0x2524, 0xa8 => 0x2534,
+    0xa9 => 0x253c, 0xaa => 0x2501, 0xab => 0x2503, 0xac => 0x250f,
+    0xad => 0x2513, 0xae => 0x251b, 0xaf => 0x2517, 0xb0 => 0x2523,
+    0xb1 => 0x2533, 0xb2 => 0x252b, 0xb3 => 0x253b, 0xb4 => 0x254b,
+    0xb5 => 0x2520, 0xb6 => 0x252f, 0xb7 => 0x2528, 0xb8 => 0x2537,
+    0xb9 => 0x253f, 0xba => 0x251d, 0xbb => 0x2530, 0xbc => 0x2525,
+    0xbd => 0x2538, 0xbe => 0x2542,
+  },
+  0x85 => {
+    0x40 => 0x2460, 0x41 => 0x2461, 0x42 => 0x2462, 0x43 => 0x2463,
+    0x44 => 0x2464, 0x45 => 0x2465, 0x46 => 0x2466, 0x47 => 0x2467,
+    0x48 => 0x2468, 0x49 => 0x2469, 0x4a => 0x246a, 0x4b => 0x246b,
+    0x4c => 0x246c, 0x4d => 0x246d, 0x4e => 0x246e, 0x4f => 0x246f,
+    0x50 => 0x2470, 0x51 => 0x2471, 0x52 => 0x2472, 0x53 => 0x2473,
+    0x5e => 0x2474, 0x5f => 0x2475, 0x60 => 0x2476, 0x61 => 0x2477,
+    0x62 => 0x2478, 0x63 => 0x2479, 0x64 => 0x247a, 0x65 => 0x247b,
+    0x66 => 0x247c, 0x67 => 0x247d, 0x68 => 0x247e, 0x69 => 0x247f,
+    0x6a => 0x2480, 0x6b => 0x2481, 0x6c => 0x2482, 0x6d => 0x2483,
+    0x6e => 0x2484, 0x6f => 0x2485, 0x70 => 0x2486, 0x71 => 0x2487,
+    0x7c => 0x2776, 0x7d => 0x2777, 0x7e => 0x2778, 0x80 => 0x2779,
+    0x81 => 0x277a, 0x82 => 0x277b, 0x83 => 0x277c, 0x84 => 0x277d,
+    0x85 => 0x277e, 0x91 => [0xf860,0x30,0x2e], 0x92 => 0x2488, 0x93 => 0x2489,
+    0x94 => 0x248a, 0x95 => 0x248b, 0x96 => 0x248c, 0x97 => 0x248d,
+    0x98 => 0x248e, 0x99 => 0x248f, 0x9a => 0x2490, 0x9f => 0x2160,
+    0xa0 => 0x2161, 0xa1 => 0x2162, 0xa2 => 0x2163, 0xa3 => 0x2164,
+    0xa4 => 0x2165, 0xa5 => 0x2166, 0xa6 => 0x2167, 0xa7 => 0x2168,
+    0xa8 => 0x2169, 0xa9 => 0x216a, 0xaa => 0x216b,
+    0xab => [0xf862,0x58,0x49,0x49,0x49], 0xac => [0xf861,0x58,0x49,0x56],
+    0xad => [0xf860,0x58,0x56], 0xb3 => 0x2170, 0xb4 => 0x2171, 0xb5 => 0x2172,
+    0xb6 => 0x2173, 0xb7 => 0x2174, 0xb8 => 0x2175, 0xb9 => 0x2176,
+    0xba => 0x2177, 0xbb => 0x2178, 0xbc => 0x2179, 0xbd => 0x217a,
+    0xbe => 0x217b, 0xbf => [0xf862,0x78,0x69,0x69,0x69],
+    0xc0 => [0xf861,0x78,0x69,0x76], 0xc1 => [0xf860,0x78,0x76], 0xdb => 0x249c,
+    0xdc => 0x249d, 0xdd => 0x249e, 0xde => 0x249f, 0xdf => 0x24a0,
+    0xe0 => 0x24a1, 0xe1 => 0x24a2, 0xe2 => 0x24a3, 0xe3 => 0x24a4,
+    0xe4 => 0x24a5, 0xe5 => 0x24a6, 0xe6 => 0x24a7, 0xe7 => 0x24a8,
+    0xe8 => 0x24a9, 0xe9 => 0x24aa, 0xea => 0x24ab, 0xeb => 0x24ac,
+    0xec => 0x24ad, 0xed => 0x24ae, 0xee => 0x24af, 0xef => 0x24b0,
+    0xf0 => 0x24b1, 0xf1 => 0x24b2, 0xf2 => 0x24b3, 0xf3 => 0x24b4,
+    0xf4 => 0x24b5,
+  },
+  0x86 => {
+    0x40 => 0x339c, 0x41 => 0x339f, 0x42 => 0x339d, 0x43 => 0x33a0,
+    0x44 => 0x33a4, 0x45 => [0xff4d,0xf87f], 0x46 => 0x33a1, 0x47 => 0x33a5,
+    0x48 => 0x339e, 0x49 => 0x33a2, 0x4a => 0x338e, 0x4b => [0xff47,0xf87f],
+    0x4c => 0x338f, 0x4d => 0x33c4, 0x4e => 0x3396, 0x4f => 0x3397,
+    0x50 => 0x2113, 0x51 => 0x3398, 0x52 => 0x33b3, 0x53 => 0x33b2,
+    0x54 => 0x33b1, 0x55 => 0x33b0, 0x56 => 0x2109, 0x57 => 0x33d4,
+    0x58 => 0x33cb, 0x59 => 0x3390, 0x5a => 0x3385, 0x5b => 0x3386,
+    0x5c => 0x3387, 0x5d => [0xf860,0x54,0x42], 0x9b => 0x2116, 0x9c => 0x33cd,
+    0x9d => 0x2121, 0x9e => [0xf861,0x46,0x41,0x58], 0x9f => 0x2664,
+    0xa0 => 0x2667, 0xa1 => 0x2661, 0xa2 => 0x2662, 0xa3 => 0x2660,
+    0xa4 => 0x2663, 0xa5 => 0x2665, 0xa6 => 0x2666, 0xb3 => 0x3020,
+    0xb4 => 0x260e, 0xb5 => 0x3004, 0xc7 => 0x261e, 0xc8 => 0x261c,
+    0xc9 => 0x261d, 0xca => 0x261f, 0xcb => 0x21c6, 0xcc => 0x21c4,
+    0xcd => 0x21c5, 0xce => [0xf860,0x2193,0x2191], 0xcf => 0x21e8,
+    0xd0 => 0x21e6, 0xd1 => 0x21e7, 0xd2 => 0x21e9, 0xd3 => [0x21e8,0xf87a],
+    0xd4 => [0x21e6,0xf87a], 0xd5 => [0x21e7,0xf87a], 0xd6 => [0x21e9,0xf87a],
+  },
+  0x87 => {
+    0x40 => 0x3230, 0x41 => 0x322a, 0x42 => 0x322b, 0x43 => 0x322c,
+    0x44 => 0x322d, 0x45 => 0x322e, 0x46 => 0x322f, 0x47 => 0x3240,
+    0x48 => 0x3237, 0x49 => 0x3242, 0x4a => 0x3243, 0x4b => 0x3239,
+    0x4c => 0x323a, 0x4d => 0x3231, 0x4e => 0x323e, 0x4f => 0x3234,
+    0x50 => 0x3232, 0x51 => 0x323b, 0x52 => 0x3236, 0x53 => 0x3233,
+    0x54 => 0x3235, 0x55 => 0x323c, 0x56 => 0x323d, 0x57 => 0x323f,
+    0x58 => 0x3238, 0x91 => [0x5927,0x20dd], 0x92 => [0x5c0f,0x20dd],
+    0x93 => 0x32a4, 0x94 => 0x32a5, 0x95 => 0x32a6, 0x96 => 0x32a7,
+    0x97 => 0x32a8, 0x98 => 0x32a9, 0x99 => 0x3296, 0x9a => 0x329d,
+    0x9b => 0x3298, 0x9c => 0x329e, 0x9d => [0x63a7,0x20dd], 0x9e => 0x3299,
+    0x9f => 0x3349, 0xa0 => 0x3322, 0xa1 => 0x334d, 0xa2 => 0x3314,
+    0xa3 => 0x3316, 0xa4 => 0x3305, 0xa5 => 0x3333, 0xa6 => 0x334e,
+    0xa7 => 0x3303, 0xa8 => 0x3336, 0xa9 => 0x3318, 0xaa => 0x3315,
+    0xab => 0x3327, 0xac => 0x3351, 0xad => 0x334a, 0xae => 0x3339,
+    0xaf => 0x3357, 0xb0 => 0x330d, 0xb1 => 0x3342, 0xb2 => 0x3323,
+    0xb3 => 0x3326, 0xb4 => 0x333b, 0xb5 => 0x332b, 0xbd => 0x3300,
+    0xbe => 0x331e, 0xbf => 0x332a, 0xc0 => 0x3331, 0xc1 => 0x3347,
+    0xe5 => 0x337e, 0xe6 => 0x337d, 0xe7 => 0x337c, 0xe8 => 0x337b,
+    0xfa => 0x337f, 0xfb => [0xf862,0x6709,0x9650,0x4f1a,0x793e],
+    0xfc => [0xf862,0x8ca1,0x56e3,0x6cd5,0x4eba],
+  },
+  0x88 => {
+    0x40 => 0x222e, 0x41 => 0x221f, 0x42 => 0x22bf, 0x54 => 0x301d,
+    0x55 => 0x301f, 0x68 => 0x3094, 0x6a => 0x30f7, 0x6b => 0x30f8,
+    0x6c => 0x30f9, 0x6d => 0x30fa, 0x9f => 0x4e9c, 0xa0 => 0x5516,
+    0xa1 => 0x5a03, 0xa2 => 0x963f, 0xa3 => 0x54c0, 0xa4 => 0x611b,
+    0xa5 => 0x6328, 0xa6 => 0x59f6, 0xa7 => 0x9022, 0xa8 => 0x8475,
+    0xa9 => 0x831c, 0xaa => 0x7a50, 0xab => 0x60aa, 0xac => 0x63e1,
+    0xad => 0x6e25, 0xae => 0x65ed, 0xaf => 0x8466, 0xb0 => 0x82a6,
+    0xb1 => 0x9bf5, 0xb2 => 0x6893, 0xb3 => 0x5727, 0xb4 => 0x65a1,
+    0xb5 => 0x6271, 0xb6 => 0x5b9b, 0xb7 => 0x59d0, 0xb8 => 0x867b,
+    0xb9 => 0x98f4, 0xba => 0x7d62, 0xbb => 0x7dbe, 0xbc => 0x9b8e,
+    0xbd => 0x6216, 0xbe => 0x7c9f, 0xbf => 0x88b7, 0xc0 => 0x5b89,
+    0xc1 => 0x5eb5, 0xc2 => 0x6309, 0xc3 => 0x6697, 0xc4 => 0x6848,
+    0xc5 => 0x95c7, 0xc6 => 0x978d, 0xc7 => 0x674f, 0xc8 => 0x4ee5,
+    0xc9 => 0x4f0a, 0xca => 0x4f4d, 0xcb => 0x4f9d, 0xcc => 0x5049,
+    0xcd => 0x56f2, 0xce => 0x5937, 0xcf => 0x59d4, 0xd0 => 0x5a01,
+    0xd1 => 0x5c09, 0xd2 => 0x60df, 0xd3 => 0x610f, 0xd4 => 0x6170,
+    0xd5 => 0x6613, 0xd6 => 0x6905, 0xd7 => 0x70ba, 0xd8 => 0x754f,
+    0xd9 => 0x7570, 0xda => 0x79fb, 0xdb => 0x7dad, 0xdc => 0x7def,
+    0xdd => 0x80c3, 0xde => 0x840e, 0xdf => 0x8863, 0xe0 => 0x8b02,
+    0xe1 => 0x9055, 0xe2 => 0x907a, 0xe3 => 0x533b, 0xe4 => 0x4e95,
+    0xe5 => 0x4ea5, 0xe6 => 0x57df, 0xe7 => 0x80b2, 0xe8 => 0x90c1,
+    0xe9 => 0x78ef, 0xea => 0x4e00, 0xeb => 0x58f1, 0xec => 0x6ea2,
+    0xed => 0x9038, 0xee => 0x7a32, 0xef => 0x8328, 0xf0 => 0x828b,
+    0xf1 => 0x9c2f, 0xf2 => 0x5141, 0xf3 => 0x5370, 0xf4 => 0x54bd,
+    0xf5 => 0x54e1, 0xf6 => 0x56e0, 0xf7 => 0x59fb, 0xf8 => 0x5f15,
+    0xf9 => 0x98f2, 0xfa => 0x6deb, 0xfb => 0x80e4, 0xfc => 0x852d,
+  },
+  0x89 => {
+    0x40 => 0x9662, 0x41 => 0x9670, 0x42 => 0x96a0, 0x43 => 0x97fb,
+    0x44 => 0x540b, 0x45 => 0x53f3, 0x46 => 0x5b87, 0x47 => 0x70cf,
+    0x48 => 0x7fbd, 0x49 => 0x8fc2, 0x4a => 0x96e8, 0x4b => 0x536f,
+    0x4c => 0x9d5c, 0x4d => 0x7aba, 0x4e => 0x4e11, 0x4f => 0x7893,
+    0x50 => 0x81fc, 0x51 => 0x6e26, 0x52 => 0x5618, 0x53 => 0x5504,
+    0x54 => 0x6b1d, 0x55 => 0x851a, 0x56 => 0x9c3b, 0x57 => 0x59e5,
+    0x58 => 0x53a9, 0x59 => 0x6d66, 0x5a => 0x74dc, 0x5b => 0x958f,
+    0x5c => 0x5642, 0x5d => 0x4e91, 0x5e => 0x904b, 0x5f => 0x96f2,
+    0x60 => 0x834f, 0x61 => 0x990c, 0x62 => 0x53e1, 0x63 => 0x55b6,
+    0x64 => 0x5b30, 0x65 => 0x5f71, 0x66 => 0x6620, 0x67 => 0x66f3,
+    0x68 => 0x6804, 0x69 => 0x6c38, 0x6a => 0x6cf3, 0x6b => 0x6d29,
+    0x6c => 0x745b, 0x6d => 0x76c8, 0x6e => 0x7a4e, 0x6f => 0x9834,
+    0x70 => 0x82f1, 0x71 => 0x885b, 0x72 => 0x8a60, 0x73 => 0x92ed,
+    0x74 => 0x6db2, 0x75 => 0x75ab, 0x76 => 0x76ca, 0x77 => 0x99c5,
+    0x78 => 0x60a6, 0x79 => 0x8b01, 0x7a => 0x8d8a, 0x7b => 0x95b2,
+    0x7c => 0x698e, 0x7d => 0x53ad, 0x7e => 0x5186, 0x80 => 0x5712,
+    0x81 => 0x5830, 0x82 => 0x5944, 0x83 => 0x5bb4, 0x84 => 0x5ef6,
+    0x85 => 0x6028, 0x86 => 0x63a9, 0x87 => 0x63f4, 0x88 => 0x6cbf,
+    0x89 => 0x6f14, 0x8a => 0x708e, 0x8b => 0x7114, 0x8c => 0x7159,
+    0x8d => 0x71d5, 0x8e => 0x733f, 0x8f => 0x7e01, 0x90 => 0x8276,
+    0x91 => 0x82d1, 0x92 => 0x8597, 0x93 => 0x9060, 0x94 => 0x925b,
+    0x95 => 0x9d1b, 0x96 => 0x5869, 0x97 => 0x65bc, 0x98 => 0x6c5a,
+    0x99 => 0x7525, 0x9a => 0x51f9, 0x9b => 0x592e, 0x9c => 0x5965,
+    0x9d => 0x5f80, 0x9e => 0x5fdc, 0x9f => 0x62bc, 0xa0 => 0x65fa,
+    0xa1 => 0x6a2a, 0xa2 => 0x6b27, 0xa3 => 0x6bb4, 0xa4 => 0x738b,
+    0xa5 => 0x7fc1, 0xa6 => 0x8956, 0xa7 => 0x9d2c, 0xa8 => 0x9d0e,
+    0xa9 => 0x9ec4, 0xaa => 0x5ca1, 0xab => 0x6c96, 0xac => 0x837b,
+    0xad => 0x5104, 0xae => 0x5c4b, 0xaf => 0x61b6, 0xb0 => 0x81c6,
+    0xb1 => 0x6876, 0xb2 => 0x7261, 0xb3 => 0x4e59, 0xb4 => 0x4ffa,
+    0xb5 => 0x5378, 0xb6 => 0x6069, 0xb7 => 0x6e29, 0xb8 => 0x7a4f,
+    0xb9 => 0x97f3, 0xba => 0x4e0b, 0xbb => 0x5316, 0xbc => 0x4eee,
+    0xbd => 0x4f55, 0xbe => 0x4f3d, 0xbf => 0x4fa1, 0xc0 => 0x4f73,
+    0xc1 => 0x52a0, 0xc2 => 0x53ef, 0xc3 => 0x5609, 0xc4 => 0x590f,
+    0xc5 => 0x5ac1, 0xc6 => 0x5bb6, 0xc7 => 0x5be1, 0xc8 => 0x79d1,
+    0xc9 => 0x6687, 0xca => 0x679c, 0xcb => 0x67b6, 0xcc => 0x6b4c,
+    0xcd => 0x6cb3, 0xce => 0x706b, 0xcf => 0x73c2, 0xd0 => 0x798d,
+    0xd1 => 0x79be, 0xd2 => 0x7a3c, 0xd3 => 0x7b87, 0xd4 => 0x82b1,
+    0xd5 => 0x82db, 0xd6 => 0x8304, 0xd7 => 0x8377, 0xd8 => 0x83ef,
+    0xd9 => 0x83d3, 0xda => 0x8766, 0xdb => 0x8ab2, 0xdc => 0x5629,
+    0xdd => 0x8ca8, 0xde => 0x8fe6, 0xdf => 0x904e, 0xe0 => 0x971e,
+    0xe1 => 0x868a, 0xe2 => 0x4fc4, 0xe3 => 0x5ce8, 0xe4 => 0x6211,
+    0xe5 => 0x7259, 0xe6 => 0x753b, 0xe7 => 0x81e5, 0xe8 => 0x82bd,
+    0xe9 => 0x86fe, 0xea => 0x8cc0, 0xeb => 0x96c5, 0xec => 0x9913,
+    0xed => 0x99d5, 0xee => 0x4ecb, 0xef => 0x4f1a, 0xf0 => 0x89e3,
+    0xf1 => 0x56de, 0xf2 => 0x584a, 0xf3 => 0x58ca, 0xf4 => 0x5efb,
+    0xf5 => 0x5feb, 0xf6 => 0x602a, 0xf7 => 0x6094, 0xf8 => 0x6062,
+    0xf9 => 0x61d0, 0xfa => 0x6212, 0xfb => 0x62d0, 0xfc => 0x6539,
+  },
+  0x8a => {
+    0x40 => 0x9b41, 0x41 => 0x6666, 0x42 => 0x68b0, 0x43 => 0x6d77,
+    0x44 => 0x7070, 0x45 => 0x754c, 0x46 => 0x7686, 0x47 => 0x7d75,
+    0x48 => 0x82a5, 0x49 => 0x87f9, 0x4a => 0x958b, 0x4b => 0x968e,
+    0x4c => 0x8c9d, 0x4d => 0x51f1, 0x4e => 0x52be, 0x4f => 0x5916,
+    0x50 => 0x54b3, 0x51 => 0x5bb3, 0x52 => 0x5d16, 0x53 => 0x6168,
+    0x54 => 0x6982, 0x55 => 0x6daf, 0x56 => 0x788d, 0x57 => 0x84cb,
+    0x58 => 0x8857, 0x59 => 0x8a72, 0x5a => 0x93a7, 0x5b => 0x9ab8,
+    0x5c => 0x6d6c, 0x5d => 0x99a8, 0x5e => 0x86d9, 0x5f => 0x57a3,
+    0x60 => 0x67ff, 0x61 => 0x86ce, 0x62 => 0x920e, 0x63 => 0x5283,
+    0x64 => 0x5687, 0x65 => 0x5404, 0x66 => 0x5ed3, 0x67 => 0x62e1,
+    0x68 => 0x64b9, 0x69 => 0x683c, 0x6a => 0x6838, 0x6b => 0x6bbb,
+    0x6c => 0x7372, 0x6d => 0x78ba, 0x6e => 0x7a6b, 0x6f => 0x899a,
+    0x70 => 0x89d2, 0x71 => 0x8d6b, 0x72 => 0x8f03, 0x73 => 0x90ed,
+    0x74 => 0x95a3, 0x75 => 0x9694, 0x76 => 0x9769, 0x77 => 0x5b66,
+    0x78 => 0x5cb3, 0x79 => 0x697d, 0x7a => 0x984d, 0x7b => 0x984e,
+    0x7c => 0x639b, 0x7d => 0x7b20, 0x7e => 0x6a2b, 0x80 => 0x6a7f,
+    0x81 => 0x68b6, 0x82 => 0x9c0d, 0x83 => 0x6f5f, 0x84 => 0x5272,
+    0x85 => 0x559d, 0x86 => 0x6070, 0x87 => 0x62ec, 0x88 => 0x6d3b,
+    0x89 => 0x6e07, 0x8a => 0x6ed1, 0x8b => 0x845b, 0x8c => 0x8910,
+    0x8d => 0x8f44, 0x8e => 0x4e14, 0x8f => 0x9c39, 0x90 => 0x53f6,
+    0x91 => 0x691b, 0x92 => 0x6a3a, 0x93 => 0x9784, 0x94 => 0x682a,
+    0x95 => 0x515c, 0x96 => 0x7ac3, 0x97 => 0x84b2, 0x98 => 0x91dc,
+    0x99 => 0x938c, 0x9a => 0x565b, 0x9b => 0x9d28, 0x9c => 0x6822,
+    0x9d => 0x8305, 0x9e => 0x8431, 0x9f => 0x7ca5, 0xa0 => 0x5208,
+    0xa1 => 0x82c5, 0xa2 => 0x74e6, 0xa3 => 0x4e7e, 0xa4 => 0x4f83,
+    0xa5 => 0x51a0, 0xa6 => 0x5bd2, 0xa7 => 0x520a, 0xa8 => 0x52d8,
+    0xa9 => 0x52e7, 0xaa => 0x5dfb, 0xab => 0x559a, 0xac => 0x582a,
+    0xad => 0x59e6, 0xae => 0x5b8c, 0xaf => 0x5b98, 0xb0 => 0x5bdb,
+    0xb1 => 0x5e72, 0xb2 => 0x5e79, 0xb3 => 0x60a3, 0xb4 => 0x611f,
+    0xb5 => 0x6163, 0xb6 => 0x61be, 0xb7 => 0x63db, 0xb8 => 0x6562,
+    0xb9 => 0x67d1, 0xba => 0x6853, 0xbb => 0x68fa, 0xbc => 0x6b3e,
+    0xbd => 0x6b53, 0xbe => 0x6c57, 0xbf => 0x6f22, 0xc0 => 0x6f97,
+    0xc1 => 0x6f45, 0xc2 => 0x74b0, 0xc3 => 0x7518, 0xc4 => 0x76e3,
+    0xc5 => 0x770b, 0xc6 => 0x7aff, 0xc7 => 0x7ba1, 0xc8 => 0x7c21,
+    0xc9 => 0x7de9, 0xca => 0x7f36, 0xcb => 0x7ff0, 0xcc => 0x809d,
+    0xcd => 0x8266, 0xce => 0x839e, 0xcf => 0x89b3, 0xd0 => 0x8acc,
+    0xd1 => 0x8cab, 0xd2 => 0x9084, 0xd3 => 0x9451, 0xd4 => 0x9593,
+    0xd5 => 0x9591, 0xd6 => 0x95a2, 0xd7 => 0x9665, 0xd8 => 0x97d3,
+    0xd9 => 0x9928, 0xda => 0x8218, 0xdb => 0x4e38, 0xdc => 0x542b,
+    0xdd => 0x5cb8, 0xde => 0x5dcc, 0xdf => 0x73a9, 0xe0 => 0x764c,
+    0xe1 => 0x773c, 0xe2 => 0x5ca9, 0xe3 => 0x7feb, 0xe4 => 0x8d0b,
+    0xe5 => 0x96c1, 0xe6 => 0x9811, 0xe7 => 0x9854, 0xe8 => 0x9858,
+    0xe9 => 0x4f01, 0xea => 0x4f0e, 0xeb => 0x5371, 0xec => 0x559c,
+    0xed => 0x5668, 0xee => 0x57fa, 0xef => 0x5947, 0xf0 => 0x5b09,
+    0xf1 => 0x5bc4, 0xf2 => 0x5c90, 0xf3 => 0x5e0c, 0xf4 => 0x5e7e,
+    0xf5 => 0x5fcc, 0xf6 => 0x63ee, 0xf7 => 0x673a, 0xf8 => 0x65d7,
+    0xf9 => 0x65e2, 0xfa => 0x671f, 0xfb => 0x68cb, 0xfc => 0x68c4,
+  },
+  0x8b => {
+    0x40 => 0x6a5f, 0x41 => 0x5e30, 0x42 => 0x6bc5, 0x43 => 0x6c17,
+    0x44 => 0x6c7d, 0x45 => 0x757f, 0x46 => 0x7948, 0x47 => 0x5b63,
+    0x48 => 0x7a00, 0x49 => 0x7d00, 0x4a => 0x5fbd, 0x4b => 0x898f,
+    0x4c => 0x8a18, 0x4d => 0x8cb4, 0x4e => 0x8d77, 0x4f => 0x8ecc,
+    0x50 => 0x8f1d, 0x51 => 0x98e2, 0x52 => 0x9a0e, 0x53 => 0x9b3c,
+    0x54 => 0x4e80, 0x55 => 0x507d, 0x56 => 0x5100, 0x57 => 0x5993,
+    0x58 => 0x5b9c, 0x59 => 0x622f, 0x5a => 0x6280, 0x5b => 0x64ec,
+    0x5c => 0x6b3a, 0x5d => 0x72a0, 0x5e => 0x7591, 0x5f => 0x7947,
+    0x60 => 0x7fa9, 0x61 => 0x87fb, 0x62 => 0x8abc, 0x63 => 0x8b70,
+    0x64 => 0x63ac, 0x65 => 0x83ca, 0x66 => 0x97a0, 0x67 => 0x5409,
+    0x68 => 0x5403, 0x69 => 0x55ab, 0x6a => 0x6854, 0x6b => 0x6a58,
+    0x6c => 0x8a70, 0x6d => 0x7827, 0x6e => 0x6775, 0x6f => 0x9ecd,
+    0x70 => 0x5374, 0x71 => 0x5ba2, 0x72 => 0x811a, 0x73 => 0x8650,
+    0x74 => 0x9006, 0x75 => 0x4e18, 0x76 => 0x4e45, 0x77 => 0x4ec7,
+    0x78 => 0x4f11, 0x79 => 0x53ca, 0x7a => 0x5438, 0x7b => 0x5bae,
+    0x7c => 0x5f13, 0x7d => 0x6025, 0x7e => 0x6551, 0x80 => 0x673d,
+    0x81 => 0x6c42, 0x82 => 0x6c72, 0x83 => 0x6ce3, 0x84 => 0x7078,
+    0x85 => 0x7403, 0x86 => 0x7a76, 0x87 => 0x7aae, 0x88 => 0x7b08,
+    0x89 => 0x7d1a, 0x8a => 0x7cfe, 0x8b => 0x7d66, 0x8c => 0x65e7,
+    0x8d => 0x725b, 0x8e => 0x53bb, 0x8f => 0x5c45, 0x90 => 0x5de8,
+    0x91 => 0x62d2, 0x92 => 0x62e0, 0x93 => 0x6319, 0x94 => 0x6e20,
+    0x95 => 0x865a, 0x96 => 0x8a31, 0x97 => 0x8ddd, 0x98 => 0x92f8,
+    0x99 => 0x6f01, 0x9a => 0x79a6, 0x9b => 0x9b5a, 0x9c => 0x4ea8,
+    0x9d => 0x4eab, 0x9e => 0x4eac, 0x9f => 0x4f9b, 0xa0 => 0x4fa0,
+    0xa1 => 0x50d1, 0xa2 => 0x5147, 0xa3 => 0x7af6, 0xa4 => 0x5171,
+    0xa5 => 0x51f6, 0xa6 => 0x5354, 0xa7 => 0x5321, 0xa8 => 0x537f,
+    0xa9 => 0x53eb, 0xaa => 0x55ac, 0xab => 0x5883, 0xac => 0x5ce1,
+    0xad => 0x5f37, 0xae => 0x5f4a, 0xaf => 0x602f, 0xb0 => 0x6050,
+    0xb1 => 0x606d, 0xb2 => 0x631f, 0xb3 => 0x6559, 0xb4 => 0x6a4b,
+    0xb5 => 0x6cc1, 0xb6 => 0x72c2, 0xb7 => 0x72ed, 0xb8 => 0x77ef,
+    0xb9 => 0x80f8, 0xba => 0x8105, 0xbb => 0x8208, 0xbc => 0x854e,
+    0xbd => 0x90f7, 0xbe => 0x93e1, 0xbf => 0x97ff, 0xc0 => 0x9957,
+    0xc1 => 0x9a5a, 0xc2 => 0x4ef0, 0xc3 => 0x51dd, 0xc4 => 0x5c2d,
+    0xc5 => 0x6681, 0xc6 => 0x696d, 0xc7 => 0x5c40, 0xc8 => 0x66f2,
+    0xc9 => 0x6975, 0xca => 0x7389, 0xcb => 0x6850, 0xcc => 0x7c81,
+    0xcd => 0x50c5, 0xce => 0x52e4, 0xcf => 0x5747, 0xd0 => 0x5dfe,
+    0xd1 => 0x9326, 0xd2 => 0x65a4, 0xd3 => 0x6b23, 0xd4 => 0x6b3d,
+    0xd5 => 0x7434, 0xd6 => 0x7981, 0xd7 => 0x79bd, 0xd8 => 0x7b4b,
+    0xd9 => 0x7dca, 0xda => 0x82b9, 0xdb => 0x83cc, 0xdc => 0x887f,
+    0xdd => 0x895f, 0xde => 0x8b39, 0xdf => 0x8fd1, 0xe0 => 0x91d1,
+    0xe1 => 0x541f, 0xe2 => 0x9280, 0xe3 => 0x4e5d, 0xe4 => 0x5036,
+    0xe5 => 0x53e5, 0xe6 => 0x533a, 0xe7 => 0x72d7, 0xe8 => 0x7396,
+    0xe9 => 0x77e9, 0xea => 0x82e6, 0xeb => 0x8eaf, 0xec => 0x99c6,
+    0xed => 0x99c8, 0xee => 0x99d2, 0xef => 0x5177, 0xf0 => 0x611a,
+    0xf1 => 0x865e, 0xf2 => 0x55b0, 0xf3 => 0x7a7a, 0xf4 => 0x5076,
+    0xf5 => 0x5bd3, 0xf6 => 0x9047, 0xf7 => 0x9685, 0xf8 => 0x4e32,
+    0xf9 => 0x6adb, 0xfa => 0x91e7, 0xfb => 0x5c51, 0xfc => 0x5c48,
+  },
+  0x8c => {
+    0x40 => 0x6398, 0x41 => 0x7a9f, 0x42 => 0x6c93, 0x43 => 0x9774,
+    0x44 => 0x8f61, 0x45 => 0x7aaa, 0x46 => 0x718a, 0x47 => 0x9688,
+    0x48 => 0x7c82, 0x49 => 0x6817, 0x4a => 0x7e70, 0x4b => 0x6851,
+    0x4c => 0x936c, 0x4d => 0x52f2, 0x4e => 0x541b, 0x4f => 0x85ab,
+    0x50 => 0x8a13, 0x51 => 0x7fa4, 0x52 => 0x8ecd, 0x53 => 0x90e1,
+    0x54 => 0x5366, 0x55 => 0x8888, 0x56 => 0x7941, 0x57 => 0x4fc2,
+    0x58 => 0x50be, 0x59 => 0x5211, 0x5a => 0x5144, 0x5b => 0x5553,
+    0x5c => 0x572d, 0x5d => 0x73ea, 0x5e => 0x578b, 0x5f => 0x5951,
+    0x60 => 0x5f62, 0x61 => 0x5f84, 0x62 => 0x6075, 0x63 => 0x6176,
+    0x64 => 0x6167, 0x65 => 0x61a9, 0x66 => 0x63b2, 0x67 => 0x643a,
+    0x68 => 0x656c, 0x69 => 0x666f, 0x6a => 0x6842, 0x6b => 0x6e13,
+    0x6c => 0x7566, 0x6d => 0x7a3d, 0x6e => 0x7cfb, 0x6f => 0x7d4c,
+    0x70 => 0x7d99, 0x71 => 0x7e4b, 0x72 => 0x7f6b, 0x73 => 0x830e,
+    0x74 => 0x834a, 0x75 => 0x86cd, 0x76 => 0x8a08, 0x77 => 0x8a63,
+    0x78 => 0x8b66, 0x79 => 0x8efd, 0x7a => 0x981a, 0x7b => 0x9d8f,
+    0x7c => 0x82b8, 0x7d => 0x8fce, 0x7e => 0x9be8, 0x80 => 0x5287,
+    0x81 => 0x621f, 0x82 => 0x6483, 0x83 => 0x6fc0, 0x84 => 0x9699,
+    0x85 => 0x6841, 0x86 => 0x5091, 0x87 => 0x6b20, 0x88 => 0x6c7a,
+    0x89 => 0x6f54, 0x8a => 0x7a74, 0x8b => 0x7d50, 0x8c => 0x8840,
+    0x8d => 0x8a23, 0x8e => 0x6708, 0x8f => 0x4ef6, 0x90 => 0x5039,
+    0x91 => 0x5026, 0x92 => 0x5065, 0x93 => 0x517c, 0x94 => 0x5238,
+    0x95 => 0x5263, 0x96 => 0x55a7, 0x97 => 0x570f, 0x98 => 0x5805,
+    0x99 => 0x5acc, 0x9a => 0x5efa, 0x9b => 0x61b2, 0x9c => 0x61f8,
+    0x9d => 0x62f3, 0x9e => 0x6372, 0x9f => 0x691c, 0xa0 => 0x6a29,
+    0xa1 => 0x727d, 0xa2 => 0x72ac, 0xa3 => 0x732e, 0xa4 => 0x7814,
+    0xa5 => 0x786f, 0xa6 => 0x7d79, 0xa7 => 0x770c, 0xa8 => 0x80a9,
+    0xa9 => 0x898b, 0xaa => 0x8b19, 0xab => 0x8ce2, 0xac => 0x8ed2,
+    0xad => 0x9063, 0xae => 0x9375, 0xaf => 0x967a, 0xb0 => 0x9855,
+    0xb1 => 0x9a13, 0xb2 => 0x9e78, 0xb3 => 0x5143, 0xb4 => 0x539f,
+    0xb5 => 0x53b3, 0xb6 => 0x5e7b, 0xb7 => 0x5f26, 0xb8 => 0x6e1b,
+    0xb9 => 0x6e90, 0xba => 0x7384, 0xbb => 0x73fe, 0xbc => 0x7d43,
+    0xbd => 0x8237, 0xbe => 0x8a00, 0xbf => 0x8afa, 0xc0 => 0x9650,
+    0xc1 => 0x4e4e, 0xc2 => 0x500b, 0xc3 => 0x53e4, 0xc4 => 0x547c,
+    0xc5 => 0x56fa, 0xc6 => 0x59d1, 0xc7 => 0x5b64, 0xc8 => 0x5df1,
+    0xc9 => 0x5eab, 0xca => 0x5f27, 0xcb => 0x6238, 0xcc => 0x6545,
+    0xcd => 0x67af, 0xce => 0x6e56, 0xcf => 0x72d0, 0xd0 => 0x7cca,
+    0xd1 => 0x88b4, 0xd2 => 0x80a1, 0xd3 => 0x80e1, 0xd4 => 0x83f0,
+    0xd5 => 0x864e, 0xd6 => 0x8a87, 0xd7 => 0x8de8, 0xd8 => 0x9237,
+    0xd9 => 0x96c7, 0xda => 0x9867, 0xdb => 0x9f13, 0xdc => 0x4e94,
+    0xdd => 0x4e92, 0xde => 0x4f0d, 0xdf => 0x5348, 0xe0 => 0x5449,
+    0xe1 => 0x543e, 0xe2 => 0x5a2f, 0xe3 => 0x5f8c, 0xe4 => 0x5fa1,
+    0xe5 => 0x609f, 0xe6 => 0x68a7, 0xe7 => 0x6a8e, 0xe8 => 0x745a,
+    0xe9 => 0x7881, 0xea => 0x8a9e, 0xeb => 0x8aa4, 0xec => 0x8b77,
+    0xed => 0x9190, 0xee => 0x4e5e, 0xef => 0x9bc9, 0xf0 => 0x4ea4,
+    0xf1 => 0x4f7c, 0xf2 => 0x4faf, 0xf3 => 0x5019, 0xf4 => 0x5016,
+    0xf5 => 0x5149, 0xf6 => 0x516c, 0xf7 => 0x529f, 0xf8 => 0x52b9,
+    0xf9 => 0x52fe, 0xfa => 0x539a, 0xfb => 0x53e3, 0xfc => 0x5411,
+  },
+  0x8d => {
+    0x40 => 0x540e, 0x41 => 0x5589, 0x42 => 0x5751, 0x43 => 0x57a2,
+    0x44 => 0x597d, 0x45 => 0x5b54, 0x46 => 0x5b5d, 0x47 => 0x5b8f,
+    0x48 => 0x5de5, 0x49 => 0x5de7, 0x4a => 0x5df7, 0x4b => 0x5e78,
+    0x4c => 0x5e83, 0x4d => 0x5e9a, 0x4e => 0x5eb7, 0x4f => 0x5f18,
+    0x50 => 0x6052, 0x51 => 0x614c, 0x52 => 0x6297, 0x53 => 0x62d8,
+    0x54 => 0x63a7, 0x55 => 0x653b, 0x56 => 0x6602, 0x57 => 0x6643,
+    0x58 => 0x66f4, 0x59 => 0x676d, 0x5a => 0x6821, 0x5b => 0x6897,
+    0x5c => 0x69cb, 0x5d => 0x6c5f, 0x5e => 0x6d2a, 0x5f => 0x6d69,
+    0x60 => 0x6e2f, 0x61 => 0x6e9d, 0x62 => 0x7532, 0x63 => 0x7687,
+    0x64 => 0x786c, 0x65 => 0x7a3f, 0x66 => 0x7ce0, 0x67 => 0x7d05,
+    0x68 => 0x7d18, 0x69 => 0x7d5e, 0x6a => 0x7db1, 0x6b => 0x8015,
+    0x6c => 0x8003, 0x6d => 0x80af, 0x6e => 0x80b1, 0x6f => 0x8154,
+    0x70 => 0x818f, 0x71 => 0x822a, 0x72 => 0x8352, 0x73 => 0x884c,
+    0x74 => 0x8861, 0x75 => 0x8b1b, 0x76 => 0x8ca2, 0x77 => 0x8cfc,
+    0x78 => 0x90ca, 0x79 => 0x9175, 0x7a => 0x9271, 0x7b => 0x783f,
+    0x7c => 0x92fc, 0x7d => 0x95a4, 0x7e => 0x964d, 0x80 => 0x9805,
+    0x81 => 0x9999, 0x82 => 0x9ad8, 0x83 => 0x9d3b, 0x84 => 0x525b,
+    0x85 => 0x52ab, 0x86 => 0x53f7, 0x87 => 0x5408, 0x88 => 0x58d5,
+    0x89 => 0x62f7, 0x8a => 0x6fe0, 0x8b => 0x8c6a, 0x8c => 0x8f5f,
+    0x8d => 0x9eb9, 0x8e => 0x514b, 0x8f => 0x523b, 0x90 => 0x544a,
+    0x91 => 0x56fd, 0x92 => 0x7a40, 0x93 => 0x9177, 0x94 => 0x9d60,
+    0x95 => 0x9ed2, 0x96 => 0x7344, 0x97 => 0x6f09, 0x98 => 0x8170,
+    0x99 => 0x7511, 0x9a => 0x5ffd, 0x9b => 0x60da, 0x9c => 0x9aa8,
+    0x9d => 0x72db, 0x9e => 0x8fbc, 0x9f => 0x6b64, 0xa0 => 0x9803,
+    0xa1 => 0x4eca, 0xa2 => 0x56f0, 0xa3 => 0x5764, 0xa4 => 0x58be,
+    0xa5 => 0x5a5a, 0xa6 => 0x6068, 0xa7 => 0x61c7, 0xa8 => 0x660f,
+    0xa9 => 0x6606, 0xaa => 0x6839, 0xab => 0x68b1, 0xac => 0x6df7,
+    0xad => 0x75d5, 0xae => 0x7d3a, 0xaf => 0x826e, 0xb0 => 0x9b42,
+    0xb1 => 0x4e9b, 0xb2 => 0x4f50, 0xb3 => 0x53c9, 0xb4 => 0x5506,
+    0xb5 => 0x5d6f, 0xb6 => 0x5de6, 0xb7 => 0x5dee, 0xb8 => 0x67fb,
+    0xb9 => 0x6c99, 0xba => 0x7473, 0xbb => 0x7802, 0xbc => 0x8a50,
+    0xbd => 0x9396, 0xbe => 0x88df, 0xbf => 0x5750, 0xc0 => 0x5ea7,
+    0xc1 => 0x632b, 0xc2 => 0x50b5, 0xc3 => 0x50ac, 0xc4 => 0x518d,
+    0xc5 => 0x6700, 0xc6 => 0x54c9, 0xc7 => 0x585e, 0xc8 => 0x59bb,
+    0xc9 => 0x5bb0, 0xca => 0x5f69, 0xcb => 0x624d, 0xcc => 0x63a1,
+    0xcd => 0x683d, 0xce => 0x6b73, 0xcf => 0x6e08, 0xd0 => 0x707d,
+    0xd1 => 0x91c7, 0xd2 => 0x7280, 0xd3 => 0x7815, 0xd4 => 0x7826,
+    0xd5 => 0x796d, 0xd6 => 0x658e, 0xd7 => 0x7d30, 0xd8 => 0x83dc,
+    0xd9 => 0x88c1, 0xda => 0x8f09, 0xdb => 0x969b, 0xdc => 0x5264,
+    0xdd => 0x5728, 0xde => 0x6750, 0xdf => 0x7f6a, 0xe0 => 0x8ca1,
+    0xe1 => 0x51b4, 0xe2 => 0x5742, 0xe3 => 0x962a, 0xe4 => 0x583a,
+    0xe5 => 0x698a, 0xe6 => 0x80b4, 0xe7 => 0x54b2, 0xe8 => 0x5d0e,
+    0xe9 => 0x57fc, 0xea => 0x7895, 0xeb => 0x9dfa, 0xec => 0x4f5c,
+    0xed => 0x524a, 0xee => 0x548b, 0xef => 0x643e, 0xf0 => 0x6628,
+    0xf1 => 0x6714, 0xf2 => 0x67f5, 0xf3 => 0x7a84, 0xf4 => 0x7b56,
+    0xf5 => 0x7d22, 0xf6 => 0x932f, 0xf7 => 0x685c, 0xf8 => 0x9bad,
+    0xf9 => 0x7b39, 0xfa => 0x5319, 0xfb => 0x518a, 0xfc => 0x5237,
+  },
+  0x8e => {
+    0x40 => 0x5bdf, 0x41 => 0x62f6, 0x42 => 0x64ae, 0x43 => 0x64e6,
+    0x44 => 0x672d, 0x45 => 0x6bba, 0x46 => 0x85a9, 0x47 => 0x96d1,
+    0x48 => 0x7690, 0x49 => 0x9bd6, 0x4a => 0x634c, 0x4b => 0x9306,
+    0x4c => 0x9bab, 0x4d => 0x76bf, 0x4e => 0x6652, 0x4f => 0x4e09,
+    0x50 => 0x5098, 0x51 => 0x53c2, 0x52 => 0x5c71, 0x53 => 0x60e8,
+    0x54 => 0x6492, 0x55 => 0x6563, 0x56 => 0x685f, 0x57 => 0x71e6,
+    0x58 => 0x73ca, 0x59 => 0x7523, 0x5a => 0x7b97, 0x5b => 0x7e82,
+    0x5c => 0x8695, 0x5d => 0x8b83, 0x5e => 0x8cdb, 0x5f => 0x9178,
+    0x60 => 0x9910, 0x61 => 0x65ac, 0x62 => 0x66ab, 0x63 => 0x6b8b,
+    0x64 => 0x4ed5, 0x65 => 0x4ed4, 0x66 => 0x4f3a, 0x67 => 0x4f7f,
+    0x68 => 0x523a, 0x69 => 0x53f8, 0x6a => 0x53f2, 0x6b => 0x55e3,
+    0x6c => 0x56db, 0x6d => 0x58eb, 0x6e => 0x59cb, 0x6f => 0x59c9,
+    0x70 => 0x59ff, 0x71 => 0x5b50, 0x72 => 0x5c4d, 0x73 => 0x5e02,
+    0x74 => 0x5e2b, 0x75 => 0x5fd7, 0x76 => 0x601d, 0x77 => 0x6307,
+    0x78 => 0x652f, 0x79 => 0x5b5c, 0x7a => 0x65af, 0x7b => 0x65bd,
+    0x7c => 0x65e8, 0x7d => 0x679d, 0x7e => 0x6b62, 0x80 => 0x6b7b,
+    0x81 => 0x6c0f, 0x82 => 0x7345, 0x83 => 0x7949, 0x84 => 0x79c1,
+    0x85 => 0x7cf8, 0x86 => 0x7d19, 0x87 => 0x7d2b, 0x88 => 0x80a2,
+    0x89 => 0x8102, 0x8a => 0x81f3, 0x8b => 0x8996, 0x8c => 0x8a5e,
+    0x8d => 0x8a69, 0x8e => 0x8a66, 0x8f => 0x8a8c, 0x90 => 0x8aee,
+    0x91 => 0x8cc7, 0x92 => 0x8cdc, 0x93 => 0x96cc, 0x94 => 0x98fc,
+    0x95 => 0x6b6f, 0x96 => 0x4e8b, 0x97 => 0x4f3c, 0x98 => 0x4f8d,
+    0x99 => 0x5150, 0x9a => 0x5b57, 0x9b => 0x5bfa, 0x9c => 0x6148,
+    0x9d => 0x6301, 0x9e => 0x6642, 0x9f => 0x6b21, 0xa0 => 0x6ecb,
+    0xa1 => 0x6cbb, 0xa2 => 0x723e, 0xa3 => 0x74bd, 0xa4 => 0x75d4,
+    0xa5 => 0x78c1, 0xa6 => 0x793a, 0xa7 => 0x800c, 0xa8 => 0x8033,
+    0xa9 => 0x81ea, 0xaa => 0x8494, 0xab => 0x8f9e, 0xac => 0x6c50,
+    0xad => 0x9e7f, 0xae => 0x5f0f, 0xaf => 0x8b58, 0xb0 => 0x9d2b,
+    0xb1 => 0x7afa, 0xb2 => 0x8ef8, 0xb3 => 0x5b8d, 0xb4 => 0x96eb,
+    0xb5 => 0x4e03, 0xb6 => 0x53f1, 0xb7 => 0x57f7, 0xb8 => 0x5931,
+    0xb9 => 0x5ac9, 0xba => 0x5ba4, 0xbb => 0x6089, 0xbc => 0x6e7f,
+    0xbd => 0x6f06, 0xbe => 0x75be, 0xbf => 0x8cea, 0xc0 => 0x5b9f,
+    0xc1 => 0x8500, 0xc2 => 0x7be0, 0xc3 => 0x5072, 0xc4 => 0x67f4,
+    0xc5 => 0x829d, 0xc6 => 0x5c61, 0xc7 => 0x854a, 0xc8 => 0x7e1e,
+    0xc9 => 0x820e, 0xca => 0x5199, 0xcb => 0x5c04, 0xcc => 0x6368,
+    0xcd => 0x8d66, 0xce => 0x659c, 0xcf => 0x716e, 0xd0 => 0x793e,
+    0xd1 => 0x7d17, 0xd2 => 0x8005, 0xd3 => 0x8b1d, 0xd4 => 0x8eca,
+    0xd5 => 0x906e, 0xd6 => 0x86c7, 0xd7 => 0x90aa, 0xd8 => 0x501f,
+    0xd9 => 0x52fa, 0xda => 0x5c3a, 0xdb => 0x6753, 0xdc => 0x707c,
+    0xdd => 0x7235, 0xde => 0x914c, 0xdf => 0x91c8, 0xe0 => 0x932b,
+    0xe1 => 0x82e5, 0xe2 => 0x5bc2, 0xe3 => 0x5f31, 0xe4 => 0x60f9,
+    0xe5 => 0x4e3b, 0xe6 => 0x53d6, 0xe7 => 0x5b88, 0xe8 => 0x624b,
+    0xe9 => 0x6731, 0xea => 0x6b8a, 0xeb => 0x72e9, 0xec => 0x73e0,
+    0xed => 0x7a2e, 0xee => 0x816b, 0xef => 0x8da3, 0xf0 => 0x9152,
+    0xf1 => 0x9996, 0xf2 => 0x5112, 0xf3 => 0x53d7, 0xf4 => 0x546a,
+    0xf5 => 0x5bff, 0xf6 => 0x6388, 0xf7 => 0x6a39, 0xf8 => 0x7dac,
+    0xf9 => 0x9700, 0xfa => 0x56da, 0xfb => 0x53ce, 0xfc => 0x5468,
+  },
+  0x8f => {
+    0x40 => 0x5b97, 0x41 => 0x5c31, 0x42 => 0x5dde, 0x43 => 0x4fee,
+    0x44 => 0x6101, 0x45 => 0x62fe, 0x46 => 0x6d32, 0x47 => 0x79c0,
+    0x48 => 0x79cb, 0x49 => 0x7d42, 0x4a => 0x7e4d, 0x4b => 0x7fd2,
+    0x4c => 0x81ed, 0x4d => 0x821f, 0x4e => 0x8490, 0x4f => 0x8846,
+    0x50 => 0x8972, 0x51 => 0x8b90, 0x52 => 0x8e74, 0x53 => 0x8f2f,
+    0x54 => 0x9031, 0x55 => 0x914b, 0x56 => 0x916c, 0x57 => 0x96c6,
+    0x58 => 0x919c, 0x59 => 0x4ec0, 0x5a => 0x4f4f, 0x5b => 0x5145,
+    0x5c => 0x5341, 0x5d => 0x5f93, 0x5e => 0x620e, 0x5f => 0x67d4,
+    0x60 => 0x6c41, 0x61 => 0x6e0b, 0x62 => 0x7363, 0x63 => 0x7e26,
+    0x64 => 0x91cd, 0x65 => 0x9283, 0x66 => 0x53d4, 0x67 => 0x5919,
+    0x68 => 0x5bbf, 0x69 => 0x6dd1, 0x6a => 0x795d, 0x6b => 0x7e2e,
+    0x6c => 0x7c9b, 0x6d => 0x587e, 0x6e => 0x719f, 0x6f => 0x51fa,
+    0x70 => 0x8853, 0x71 => 0x8ff0, 0x72 => 0x4fca, 0x73 => 0x5cfb,
+    0x74 => 0x6625, 0x75 => 0x77ac, 0x76 => 0x7ae3, 0x77 => 0x821c,
+    0x78 => 0x99ff, 0x79 => 0x51c6, 0x7a => 0x5faa, 0x7b => 0x65ec,
+    0x7c => 0x696f, 0x7d => 0x6b89, 0x7e => 0x6df3, 0x80 => 0x6e96,
+    0x81 => 0x6f64, 0x82 => 0x76fe, 0x83 => 0x7d14, 0x84 => 0x5de1,
+    0x85 => 0x9075, 0x86 => 0x9187, 0x87 => 0x9806, 0x88 => 0x51e6,
+    0x89 => 0x521d, 0x8a => 0x6240, 0x8b => 0x6691, 0x8c => 0x66d9,
+    0x8d => 0x6e1a, 0x8e => 0x5eb6, 0x8f => 0x7dd2, 0x90 => 0x7f72,
+    0x91 => 0x66f8, 0x92 => 0x85af, 0x93 => 0x85f7, 0x94 => 0x8af8,
+    0x95 => 0x52a9, 0x96 => 0x53d9, 0x97 => 0x5973, 0x98 => 0x5e8f,
+    0x99 => 0x5f90, 0x9a => 0x6055, 0x9b => 0x92e4, 0x9c => 0x9664,
+    0x9d => 0x50b7, 0x9e => 0x511f, 0x9f => 0x52dd, 0xa0 => 0x5320,
+    0xa1 => 0x5347, 0xa2 => 0x53ec, 0xa3 => 0x54e8, 0xa4 => 0x5546,
+    0xa5 => 0x5531, 0xa6 => 0x5617, 0xa7 => 0x5968, 0xa8 => 0x59be,
+    0xa9 => 0x5a3c, 0xaa => 0x5bb5, 0xab => 0x5c06, 0xac => 0x5c0f,
+    0xad => 0x5c11, 0xae => 0x5c1a, 0xaf => 0x5e84, 0xb0 => 0x5e8a,
+    0xb1 => 0x5ee0, 0xb2 => 0x5f70, 0xb3 => 0x627f, 0xb4 => 0x6284,
+    0xb5 => 0x62db, 0xb6 => 0x638c, 0xb7 => 0x6377, 0xb8 => 0x6607,
+    0xb9 => 0x660c, 0xba => 0x662d, 0xbb => 0x6676, 0xbc => 0x677e,
+    0xbd => 0x68a2, 0xbe => 0x6a1f, 0xbf => 0x6a35, 0xc0 => 0x6cbc,
+    0xc1 => 0x6d88, 0xc2 => 0x6e09, 0xc3 => 0x6e58, 0xc4 => 0x713c,
+    0xc5 => 0x7126, 0xc6 => 0x7167, 0xc7 => 0x75c7, 0xc8 => 0x7701,
+    0xc9 => 0x785d, 0xca => 0x7901, 0xcb => 0x7965, 0xcc => 0x79f0,
+    0xcd => 0x7ae0, 0xce => 0x7b11, 0xcf => 0x7ca7, 0xd0 => 0x7d39,
+    0xd1 => 0x8096, 0xd2 => 0x83d6, 0xd3 => 0x848b, 0xd4 => 0x8549,
+    0xd5 => 0x885d, 0xd6 => 0x88f3, 0xd7 => 0x8a1f, 0xd8 => 0x8a3c,
+    0xd9 => 0x8a54, 0xda => 0x8a73, 0xdb => 0x8c61, 0xdc => 0x8cde,
+    0xdd => 0x91a4, 0xde => 0x9266, 0xdf => 0x937e, 0xe0 => 0x9418,
+    0xe1 => 0x969c, 0xe2 => 0x9798, 0xe3 => 0x4e0a, 0xe4 => 0x4e08,
+    0xe5 => 0x4e1e, 0xe6 => 0x4e57, 0xe7 => 0x5197, 0xe8 => 0x5270,
+    0xe9 => 0x57ce, 0xea => 0x5834, 0xeb => 0x58cc, 0xec => 0x5b22,
+    0xed => 0x5e38, 0xee => 0x60c5, 0xef => 0x64fe, 0xf0 => 0x6761,
+    0xf1 => 0x6756, 0xf2 => 0x6d44, 0xf3 => 0x72b6, 0xf4 => 0x7573,
+    0xf5 => 0x7a63, 0xf6 => 0x84b8, 0xf7 => 0x8b72, 0xf8 => 0x91b8,
+    0xf9 => 0x9320, 0xfa => 0x5631, 0xfb => 0x57f4, 0xfc => 0x98fe,
+  },
+  0x90 => {
+    0x40 => 0x62ed, 0x41 => 0x690d, 0x42 => 0x6b96, 0x43 => 0x71ed,
+    0x44 => 0x7e54, 0x45 => 0x8077, 0x46 => 0x8272, 0x47 => 0x89e6,
+    0x48 => 0x98df, 0x49 => 0x8755, 0x4a => 0x8fb1, 0x4b => 0x5c3b,
+    0x4c => 0x4f38, 0x4d => 0x4fe1, 0x4e => 0x4fb5, 0x4f => 0x5507,
+    0x50 => 0x5a20, 0x51 => 0x5bdd, 0x52 => 0x5be9, 0x53 => 0x5fc3,
+    0x54 => 0x614e, 0x55 => 0x632f, 0x56 => 0x65b0, 0x57 => 0x664b,
+    0x58 => 0x68ee, 0x59 => 0x699b, 0x5a => 0x6d78, 0x5b => 0x6df1,
+    0x5c => 0x7533, 0x5d => 0x75b9, 0x5e => 0x771f, 0x5f => 0x795e,
+    0x60 => 0x79e6, 0x61 => 0x7d33, 0x62 => 0x81e3, 0x63 => 0x82af,
+    0x64 => 0x85aa, 0x65 => 0x89aa, 0x66 => 0x8a3a, 0x67 => 0x8eab,
+    0x68 => 0x8f9b, 0x69 => 0x9032, 0x6a => 0x91dd, 0x6b => 0x9707,
+    0x6c => 0x4eba, 0x6d => 0x4ec1, 0x6e => 0x5203, 0x6f => 0x5875,
+    0x70 => 0x58ec, 0x71 => 0x5c0b, 0x72 => 0x751a, 0x73 => 0x5c3d,
+    0x74 => 0x814e, 0x75 => 0x8a0a, 0x76 => 0x8fc5, 0x77 => 0x9663,
+    0x78 => 0x976d, 0x79 => 0x7b25, 0x7a => 0x8acf, 0x7b => 0x9808,
+    0x7c => 0x9162, 0x7d => 0x56f3, 0x7e => 0x53a8, 0x80 => 0x9017,
+    0x81 => 0x5439, 0x82 => 0x5782, 0x83 => 0x5e25, 0x84 => 0x63a8,
+    0x85 => 0x6c34, 0x86 => 0x708a, 0x87 => 0x7761, 0x88 => 0x7c8b,
+    0x89 => 0x7fe0, 0x8a => 0x8870, 0x8b => 0x9042, 0x8c => 0x9154,
+    0x8d => 0x9310, 0x8e => 0x9318, 0x8f => 0x968f, 0x90 => 0x745e,
+    0x91 => 0x9ac4, 0x92 => 0x5d07, 0x93 => 0x5d69, 0x94 => 0x6570,
+    0x95 => 0x67a2, 0x96 => 0x8da8, 0x97 => 0x96db, 0x98 => 0x636e,
+    0x99 => 0x6749, 0x9a => 0x6919, 0x9b => 0x83c5, 0x9c => 0x9817,
+    0x9d => 0x96c0, 0x9e => 0x88fe, 0x9f => 0x6f84, 0xa0 => 0x647a,
+    0xa1 => 0x5bf8, 0xa2 => 0x4e16, 0xa3 => 0x702c, 0xa4 => 0x755d,
+    0xa5 => 0x662f, 0xa6 => 0x51c4, 0xa7 => 0x5236, 0xa8 => 0x52e2,
+    0xa9 => 0x59d3, 0xaa => 0x5f81, 0xab => 0x6027, 0xac => 0x6210,
+    0xad => 0x653f, 0xae => 0x6574, 0xaf => 0x661f, 0xb0 => 0x6674,
+    0xb1 => 0x68f2, 0xb2 => 0x6816, 0xb3 => 0x6b63, 0xb4 => 0x6e05,
+    0xb5 => 0x7272, 0xb6 => 0x751f, 0xb7 => 0x76db, 0xb8 => 0x7cbe,
+    0xb9 => 0x8056, 0xba => 0x58f0, 0xbb => 0x88fd, 0xbc => 0x897f,
+    0xbd => 0x8aa0, 0xbe => 0x8a93, 0xbf => 0x8acb, 0xc0 => 0x901d,
+    0xc1 => 0x9192, 0xc2 => 0x9752, 0xc3 => 0x9759, 0xc4 => 0x6589,
+    0xc5 => 0x7a0e, 0xc6 => 0x8106, 0xc7 => 0x96bb, 0xc8 => 0x5e2d,
+    0xc9 => 0x60dc, 0xca => 0x621a, 0xcb => 0x65a5, 0xcc => 0x6614,
+    0xcd => 0x6790, 0xce => 0x77f3, 0xcf => 0x7a4d, 0xd0 => 0x7c4d,
+    0xd1 => 0x7e3e, 0xd2 => 0x810a, 0xd3 => 0x8cac, 0xd4 => 0x8d64,
+    0xd5 => 0x8de1, 0xd6 => 0x8e5f, 0xd7 => 0x78a9, 0xd8 => 0x5207,
+    0xd9 => 0x62d9, 0xda => 0x63a5, 0xdb => 0x6442, 0xdc => 0x6298,
+    0xdd => 0x8a2d, 0xde => 0x7a83, 0xdf => 0x7bc0, 0xe0 => 0x8aac,
+    0xe1 => 0x96ea, 0xe2 => 0x7d76, 0xe3 => 0x820c, 0xe4 => 0x8749,
+    0xe5 => 0x4ed9, 0xe6 => 0x5148, 0xe7 => 0x5343, 0xe8 => 0x5360,
+    0xe9 => 0x5ba3, 0xea => 0x5c02, 0xeb => 0x5c16, 0xec => 0x5ddd,
+    0xed => 0x6226, 0xee => 0x6247, 0xef => 0x64b0, 0xf0 => 0x6813,
+    0xf1 => 0x6834, 0xf2 => 0x6cc9, 0xf3 => 0x6d45, 0xf4 => 0x6d17,
+    0xf5 => 0x67d3, 0xf6 => 0x6f5c, 0xf7 => 0x714e, 0xf8 => 0x717d,
+    0xf9 => 0x65cb, 0xfa => 0x7a7f, 0xfb => 0x7bad, 0xfc => 0x7dda,
+  },
+  0x91 => {
+    0x40 => 0x7e4a, 0x41 => 0x7fa8, 0x42 => 0x817a, 0x43 => 0x821b,
+    0x44 => 0x8239, 0x45 => 0x85a6, 0x46 => 0x8a6e, 0x47 => 0x8cce,
+    0x48 => 0x8df5, 0x49 => 0x9078, 0x4a => 0x9077, 0x4b => 0x92ad,
+    0x4c => 0x9291, 0x4d => 0x9583, 0x4e => 0x9bae, 0x4f => 0x524d,
+    0x50 => 0x5584, 0x51 => 0x6f38, 0x52 => 0x7136, 0x53 => 0x5168,
+    0x54 => 0x7985, 0x55 => 0x7e55, 0x56 => 0x81b3, 0x57 => 0x7cce,
+    0x58 => 0x564c, 0x59 => 0x5851, 0x5a => 0x5ca8, 0x5b => 0x63aa,
+    0x5c => 0x66fe, 0x5d => 0x66fd, 0x5e => 0x695a, 0x5f => 0x72d9,
+    0x60 => 0x758f, 0x61 => 0x758e, 0x62 => 0x790e, 0x63 => 0x7956,
+    0x64 => 0x79df, 0x65 => 0x7c97, 0x66 => 0x7d20, 0x67 => 0x7d44,
+    0x68 => 0x8607, 0x69 => 0x8a34, 0x6a => 0x963b, 0x6b => 0x9061,
+    0x6c => 0x9f20, 0x6d => 0x50e7, 0x6e => 0x5275, 0x6f => 0x53cc,
+    0x70 => 0x53e2, 0x71 => 0x5009, 0x72 => 0x55aa, 0x73 => 0x58ee,
+    0x74 => 0x594f, 0x75 => 0x723d, 0x76 => 0x5b8b, 0x77 => 0x5c64,
+    0x78 => 0x531d, 0x79 => 0x60e3, 0x7a => 0x60f3, 0x7b => 0x635c,
+    0x7c => 0x6383, 0x7d => 0x633f, 0x7e => 0x63bb, 0x80 => 0x64cd,
+    0x81 => 0x65e9, 0x82 => 0x66f9, 0x83 => 0x5de3, 0x84 => 0x69cd,
+    0x85 => 0x69fd, 0x86 => 0x6f15, 0x87 => 0x71e5, 0x88 => 0x4e89,
+    0x89 => 0x75e9, 0x8a => 0x76f8, 0x8b => 0x7a93, 0x8c => 0x7cdf,
+    0x8d => 0x7dcf, 0x8e => 0x7d9c, 0x8f => 0x8061, 0x90 => 0x8349,
+    0x91 => 0x8358, 0x92 => 0x846c, 0x93 => 0x84bc, 0x94 => 0x85fb,
+    0x95 => 0x88c5, 0x96 => 0x8d70, 0x97 => 0x9001, 0x98 => 0x906d,
+    0x99 => 0x9397, 0x9a => 0x971c, 0x9b => 0x9a12, 0x9c => 0x50cf,
+    0x9d => 0x5897, 0x9e => 0x618e, 0x9f => 0x81d3, 0xa0 => 0x8535,
+    0xa1 => 0x8d08, 0xa2 => 0x9020, 0xa3 => 0x4fc3, 0xa4 => 0x5074,
+    0xa5 => 0x5247, 0xa6 => 0x5373, 0xa7 => 0x606f, 0xa8 => 0x6349,
+    0xa9 => 0x675f, 0xaa => 0x6e2c, 0xab => 0x8db3, 0xac => 0x901f,
+    0xad => 0x4fd7, 0xae => 0x5c5e, 0xaf => 0x8cca, 0xb0 => 0x65cf,
+    0xb1 => 0x7d9a, 0xb2 => 0x5352, 0xb3 => 0x8896, 0xb4 => 0x5176,
+    0xb5 => 0x63c3, 0xb6 => 0x5b58, 0xb7 => 0x5b6b, 0xb8 => 0x5c0a,
+    0xb9 => 0x640d, 0xba => 0x6751, 0xbb => 0x905c, 0xbc => 0x4ed6,
+    0xbd => 0x591a, 0xbe => 0x592a, 0xbf => 0x6c70, 0xc0 => 0x8a51,
+    0xc1 => 0x553e, 0xc2 => 0x5815, 0xc3 => 0x59a5, 0xc4 => 0x60f0,
+    0xc5 => 0x6253, 0xc6 => 0x67c1, 0xc7 => 0x8235, 0xc8 => 0x6955,
+    0xc9 => 0x9640, 0xca => 0x99c4, 0xcb => 0x9a28, 0xcc => 0x4f53,
+    0xcd => 0x5806, 0xce => 0x5bfe, 0xcf => 0x8010, 0xd0 => 0x5cb1,
+    0xd1 => 0x5e2f, 0xd2 => 0x5f85, 0xd3 => 0x6020, 0xd4 => 0x614b,
+    0xd5 => 0x6234, 0xd6 => 0x66ff, 0xd7 => 0x6cf0, 0xd8 => 0x6ede,
+    0xd9 => 0x80ce, 0xda => 0x817f, 0xdb => 0x82d4, 0xdc => 0x888b,
+    0xdd => 0x8cb8, 0xde => 0x9000, 0xdf => 0x902e, 0xe0 => 0x968a,
+    0xe1 => 0x9edb, 0xe2 => 0x9bdb, 0xe3 => 0x4ee3, 0xe4 => 0x53f0,
+    0xe5 => 0x5927, 0xe6 => 0x7b2c, 0xe7 => 0x918d, 0xe8 => 0x984c,
+    0xe9 => 0x9df9, 0xea => 0x6edd, 0xeb => 0x7027, 0xec => 0x5353,
+    0xed => 0x5544, 0xee => 0x5b85, 0xef => 0x6258, 0xf0 => 0x629e,
+    0xf1 => 0x62d3, 0xf2 => 0x6ca2, 0xf3 => 0x6fef, 0xf4 => 0x7422,
+    0xf5 => 0x8a17, 0xf6 => 0x9438, 0xf7 => 0x6fc1, 0xf8 => 0x8afe,
+    0xf9 => 0x8338, 0xfa => 0x51e7, 0xfb => 0x86f8, 0xfc => 0x53ea,
+  },
+  0x92 => {
+    0x40 => 0x53e9, 0x41 => 0x4f46, 0x42 => 0x9054, 0x43 => 0x8fb0,
+    0x44 => 0x596a, 0x45 => 0x8131, 0x46 => 0x5dfd, 0x47 => 0x7aea,
+    0x48 => 0x8fbf, 0x49 => 0x68da, 0x4a => 0x8c37, 0x4b => 0x72f8,
+    0x4c => 0x9c48, 0x4d => 0x6a3d, 0x4e => 0x8ab0, 0x4f => 0x4e39,
+    0x50 => 0x5358, 0x51 => 0x5606, 0x52 => 0x5766, 0x53 => 0x62c5,
+    0x54 => 0x63a2, 0x55 => 0x65e6, 0x56 => 0x6b4e, 0x57 => 0x6de1,
+    0x58 => 0x6e5b, 0x59 => 0x70ad, 0x5a => 0x77ed, 0x5b => 0x7aef,
+    0x5c => 0x7baa, 0x5d => 0x7dbb, 0x5e => 0x803d, 0x5f => 0x80c6,
+    0x60 => 0x86cb, 0x61 => 0x8a95, 0x62 => 0x935b, 0x63 => 0x56e3,
+    0x64 => 0x58c7, 0x65 => 0x5f3e, 0x66 => 0x65ad, 0x67 => 0x6696,
+    0x68 => 0x6a80, 0x69 => 0x6bb5, 0x6a => 0x7537, 0x6b => 0x8ac7,
+    0x6c => 0x5024, 0x6d => 0x77e5, 0x6e => 0x5730, 0x6f => 0x5f1b,
+    0x70 => 0x6065, 0x71 => 0x667a, 0x72 => 0x6c60, 0x73 => 0x75f4,
+    0x74 => 0x7a1a, 0x75 => 0x7f6e, 0x76 => 0x81f4, 0x77 => 0x8718,
+    0x78 => 0x9045, 0x79 => 0x99b3, 0x7a => 0x7bc9, 0x7b => 0x755c,
+    0x7c => 0x7af9, 0x7d => 0x7b51, 0x7e => 0x84c4, 0x80 => 0x9010,
+    0x81 => 0x79e9, 0x82 => 0x7a92, 0x83 => 0x8336, 0x84 => 0x5ae1,
+    0x85 => 0x7740, 0x86 => 0x4e2d, 0x87 => 0x4ef2, 0x88 => 0x5b99,
+    0x89 => 0x5fe0, 0x8a => 0x62bd, 0x8b => 0x663c, 0x8c => 0x67f1,
+    0x8d => 0x6ce8, 0x8e => 0x866b, 0x8f => 0x8877, 0x90 => 0x8a3b,
+    0x91 => 0x914e, 0x92 => 0x92f3, 0x93 => 0x99d0, 0x94 => 0x6a17,
+    0x95 => 0x7026, 0x96 => 0x732a, 0x97 => 0x82e7, 0x98 => 0x8457,
+    0x99 => 0x8caf, 0x9a => 0x4e01, 0x9b => 0x5146, 0x9c => 0x51cb,
+    0x9d => 0x558b, 0x9e => 0x5bf5, 0x9f => 0x5e16, 0xa0 => 0x5e33,
+    0xa1 => 0x5e81, 0xa2 => 0x5f14, 0xa3 => 0x5f35, 0xa4 => 0x5f6b,
+    0xa5 => 0x5fb4, 0xa6 => 0x61f2, 0xa7 => 0x6311, 0xa8 => 0x66a2,
+    0xa9 => 0x671d, 0xaa => 0x6f6e, 0xab => 0x7252, 0xac => 0x753a,
+    0xad => 0x773a, 0xae => 0x8074, 0xaf => 0x8139, 0xb0 => 0x8178,
+    0xb1 => 0x8776, 0xb2 => 0x8abf, 0xb3 => 0x8adc, 0xb4 => 0x8d85,
+    0xb5 => 0x8df3, 0xb6 => 0x929a, 0xb7 => 0x9577, 0xb8 => 0x9802,
+    0xb9 => 0x9ce5, 0xba => 0x52c5, 0xbb => 0x6357, 0xbc => 0x76f4,
+    0xbd => 0x6715, 0xbe => 0x6c88, 0xbf => 0x73cd, 0xc0 => 0x8cc3,
+    0xc1 => 0x93ae, 0xc2 => 0x9673, 0xc3 => 0x6d25, 0xc4 => 0x589c,
+    0xc5 => 0x690e, 0xc6 => 0x69cc, 0xc7 => 0x8ffd, 0xc8 => 0x939a,
+    0xc9 => 0x75db, 0xca => 0x901a, 0xcb => 0x585a, 0xcc => 0x6802,
+    0xcd => 0x63b4, 0xce => 0x69fb, 0xcf => 0x4f43, 0xd0 => 0x6f2c,
+    0xd1 => 0x67d8, 0xd2 => 0x8fbb, 0xd3 => 0x8526, 0xd4 => 0x7db4,
+    0xd5 => 0x9354, 0xd6 => 0x693f, 0xd7 => 0x6f70, 0xd8 => 0x576a,
+    0xd9 => 0x58f7, 0xda => 0x5b2c, 0xdb => 0x7d2c, 0xdc => 0x722a,
+    0xdd => 0x540a, 0xde => 0x91e3, 0xdf => 0x9db4, 0xe0 => 0x4ead,
+    0xe1 => 0x4f4e, 0xe2 => 0x505c, 0xe3 => 0x5075, 0xe4 => 0x5243,
+    0xe5 => 0x8c9e, 0xe6 => 0x5448, 0xe7 => 0x5824, 0xe8 => 0x5b9a,
+    0xe9 => 0x5e1d, 0xea => 0x5e95, 0xeb => 0x5ead, 0xec => 0x5ef7,
+    0xed => 0x5f1f, 0xee => 0x608c, 0xef => 0x62b5, 0xf0 => 0x633a,
+    0xf1 => 0x63d0, 0xf2 => 0x68af, 0xf3 => 0x6c40, 0xf4 => 0x7887,
+    0xf5 => 0x798e, 0xf6 => 0x7a0b, 0xf7 => 0x7de0, 0xf8 => 0x8247,
+    0xf9 => 0x8a02, 0xfa => 0x8ae6, 0xfb => 0x8e44, 0xfc => 0x9013,
+  },
+  0x93 => {
+    0x40 => 0x90b8, 0x41 => 0x912d, 0x42 => 0x91d8, 0x43 => 0x9f0e,
+    0x44 => 0x6ce5, 0x45 => 0x6458, 0x46 => 0x64e2, 0x47 => 0x6575,
+    0x48 => 0x6ef4, 0x49 => 0x7684, 0x4a => 0x7b1b, 0x4b => 0x9069,
+    0x4c => 0x93d1, 0x4d => 0x6eba, 0x4e => 0x54f2, 0x4f => 0x5fb9,
+    0x50 => 0x64a4, 0x51 => 0x8f4d, 0x52 => 0x8fed, 0x53 => 0x9244,
+    0x54 => 0x5178, 0x55 => 0x586b, 0x56 => 0x5929, 0x57 => 0x5c55,
+    0x58 => 0x5e97, 0x59 => 0x6dfb, 0x5a => 0x7e8f, 0x5b => 0x751c,
+    0x5c => 0x8cbc, 0x5d => 0x8ee2, 0x5e => 0x985b, 0x5f => 0x70b9,
+    0x60 => 0x4f1d, 0x61 => 0x6bbf, 0x62 => 0x6fb1, 0x63 => 0x7530,
+    0x64 => 0x96fb, 0x65 => 0x514e, 0x66 => 0x5410, 0x67 => 0x5835,
+    0x68 => 0x5857, 0x69 => 0x59ac, 0x6a => 0x5c60, 0x6b => 0x5f92,
+    0x6c => 0x6597, 0x6d => 0x675c, 0x6e => 0x6e21, 0x6f => 0x767b,
+    0x70 => 0x83df, 0x71 => 0x8ced, 0x72 => 0x9014, 0x73 => 0x90fd,
+    0x74 => 0x934d, 0x75 => 0x7825, 0x76 => 0x783a, 0x77 => 0x52aa,
+    0x78 => 0x5ea6, 0x79 => 0x571f, 0x7a => 0x5974, 0x7b => 0x6012,
+    0x7c => 0x5012, 0x7d => 0x515a, 0x7e => 0x51ac, 0x80 => 0x51cd,
+    0x81 => 0x5200, 0x82 => 0x5510, 0x83 => 0x5854, 0x84 => 0x5858,
+    0x85 => 0x5957, 0x86 => 0x5b95, 0x87 => 0x5cf6, 0x88 => 0x5d8b,
+    0x89 => 0x60bc, 0x8a => 0x6295, 0x8b => 0x642d, 0x8c => 0x6771,
+    0x8d => 0x6843, 0x8e => 0x68bc, 0x8f => 0x68df, 0x90 => 0x76d7,
+    0x91 => 0x6dd8, 0x92 => 0x6e6f, 0x93 => 0x6d9b, 0x94 => 0x706f,
+    0x95 => 0x71c8, 0x96 => 0x5f53, 0x97 => 0x75d8, 0x98 => 0x7977,
+    0x99 => 0x7b49, 0x9a => 0x7b54, 0x9b => 0x7b52, 0x9c => 0x7cd6,
+    0x9d => 0x7d71, 0x9e => 0x5230, 0x9f => 0x8463, 0xa0 => 0x8569,
+    0xa1 => 0x85e4, 0xa2 => 0x8a0e, 0xa3 => 0x8b04, 0xa4 => 0x8c46,
+    0xa5 => 0x8e0f, 0xa6 => 0x9003, 0xa7 => 0x900f, 0xa8 => 0x9419,
+    0xa9 => 0x9676, 0xaa => 0x982d, 0xab => 0x9a30, 0xac => 0x95d8,
+    0xad => 0x50cd, 0xae => 0x52d5, 0xaf => 0x540c, 0xb0 => 0x5802,
+    0xb1 => 0x5c0e, 0xb2 => 0x61a7, 0xb3 => 0x649e, 0xb4 => 0x6d1e,
+    0xb5 => 0x77b3, 0xb6 => 0x7ae5, 0xb7 => 0x80f4, 0xb8 => 0x8404,
+    0xb9 => 0x9053, 0xba => 0x9285, 0xbb => 0x5ce0, 0xbc => 0x9d07,
+    0xbd => 0x533f, 0xbe => 0x5f97, 0xbf => 0x5fb3, 0xc0 => 0x6d9c,
+    0xc1 => 0x7279, 0xc2 => 0x7763, 0xc3 => 0x79bf, 0xc4 => 0x7be4,
+    0xc5 => 0x6bd2, 0xc6 => 0x72ec, 0xc7 => 0x8aad, 0xc8 => 0x6803,
+    0xc9 => 0x6a61, 0xca => 0x51f8, 0xcb => 0x7a81, 0xcc => 0x6934,
+    0xcd => 0x5c4a, 0xce => 0x9cf6, 0xcf => 0x82eb, 0xd0 => 0x5bc5,
+    0xd1 => 0x9149, 0xd2 => 0x701e, 0xd3 => 0x5678, 0xd4 => 0x5c6f,
+    0xd5 => 0x60c7, 0xd6 => 0x6566, 0xd7 => 0x6c8c, 0xd8 => 0x8c5a,
+    0xd9 => 0x9041, 0xda => 0x9813, 0xdb => 0x5451, 0xdc => 0x66c7,
+    0xdd => 0x920d, 0xde => 0x5948, 0xdf => 0x90a3, 0xe0 => 0x5185,
+    0xe1 => 0x4e4d, 0xe2 => 0x51ea, 0xe3 => 0x8599, 0xe4 => 0x8b0e,
+    0xe5 => 0x7058, 0xe6 => 0x637a, 0xe7 => 0x934b, 0xe8 => 0x6962,
+    0xe9 => 0x99b4, 0xea => 0x7e04, 0xeb => 0x7577, 0xec => 0x5357,
+    0xed => 0x6960, 0xee => 0x8edf, 0xef => 0x96e3, 0xf0 => 0x6c5d,
+    0xf1 => 0x4e8c, 0xf2 => 0x5c3c, 0xf3 => 0x5f10, 0xf4 => 0x8fe9,
+    0xf5 => 0x5302, 0xf6 => 0x8cd1, 0xf7 => 0x8089, 0xf8 => 0x8679,
+    0xf9 => 0x5eff, 0xfa => 0x65e5, 0xfb => 0x4e73, 0xfc => 0x5165,
+  },
+  0x94 => {
+    0x40 => 0x5982, 0x41 => 0x5c3f, 0x42 => 0x97ee, 0x43 => 0x4efb,
+    0x44 => 0x598a, 0x45 => 0x5fcd, 0x46 => 0x8a8d, 0x47 => 0x6fe1,
+    0x48 => 0x79b0, 0x49 => 0x7962, 0x4a => 0x5be7, 0x4b => 0x8471,
+    0x4c => 0x732b, 0x4d => 0x71b1, 0x4e => 0x5e74, 0x4f => 0x5ff5,
+    0x50 => 0x637b, 0x51 => 0x649a, 0x52 => 0x71c3, 0x53 => 0x7c98,
+    0x54 => 0x4e43, 0x55 => 0x5efc, 0x56 => 0x4e4b, 0x57 => 0x57dc,
+    0x58 => 0x56a2, 0x59 => 0x60a9, 0x5a => 0x6fc3, 0x5b => 0x7d0d,
+    0x5c => 0x80fd, 0x5d => 0x8133, 0x5e => 0x81bf, 0x5f => 0x8fb2,
+    0x60 => 0x8997, 0x61 => 0x86a4, 0x62 => 0x5df4, 0x63 => 0x628a,
+    0x64 => 0x64ad, 0x65 => 0x8987, 0x66 => 0x6777, 0x67 => 0x6ce2,
+    0x68 => 0x6d3e, 0x69 => 0x7436, 0x6a => 0x7834, 0x6b => 0x5a46,
+    0x6c => 0x7f75, 0x6d => 0x82ad, 0x6e => 0x99ac, 0x6f => 0x4ff3,
+    0x70 => 0x5ec3, 0x71 => 0x62dd, 0x72 => 0x6392, 0x73 => 0x6557,
+    0x74 => 0x676f, 0x75 => 0x76c3, 0x76 => 0x724c, 0x77 => 0x80cc,
+    0x78 => 0x80ba, 0x79 => 0x8f29, 0x7a => 0x914d, 0x7b => 0x500d,
+    0x7c => 0x57f9, 0x7d => 0x5a92, 0x7e => 0x6885, 0x80 => 0x6973,
+    0x81 => 0x7164, 0x82 => 0x72fd, 0x83 => 0x8cb7, 0x84 => 0x58f2,
+    0x85 => 0x8ce0, 0x86 => 0x966a, 0x87 => 0x9019, 0x88 => 0x877f,
+    0x89 => 0x79e4, 0x8a => 0x77e7, 0x8b => 0x8429, 0x8c => 0x4f2f,
+    0x8d => 0x5265, 0x8e => 0x535a, 0x8f => 0x62cd, 0x90 => 0x67cf,
+    0x91 => 0x6cca, 0x92 => 0x767d, 0x93 => 0x7b94, 0x94 => 0x7c95,
+    0x95 => 0x8236, 0x96 => 0x8584, 0x97 => 0x8feb, 0x98 => 0x66dd,
+    0x99 => 0x6f20, 0x9a => 0x7206, 0x9b => 0x7e1b, 0x9c => 0x83ab,
+    0x9d => 0x99c1, 0x9e => 0x9ea6, 0x9f => 0x51fd, 0xa0 => 0x7bb1,
+    0xa1 => 0x7872, 0xa2 => 0x7bb8, 0xa3 => 0x8087, 0xa4 => 0x7b48,
+    0xa5 => 0x6ae8, 0xa6 => 0x5e61, 0xa7 => 0x808c, 0xa8 => 0x7551,
+    0xa9 => 0x7560, 0xaa => 0x516b, 0xab => 0x9262, 0xac => 0x6e8c,
+    0xad => 0x767a, 0xae => 0x9197, 0xaf => 0x9aea, 0xb0 => 0x4f10,
+    0xb1 => 0x7f70, 0xb2 => 0x629c, 0xb3 => 0x7b4f, 0xb4 => 0x95a5,
+    0xb5 => 0x9ce9, 0xb6 => 0x567a, 0xb7 => 0x5859, 0xb8 => 0x86e4,
+    0xb9 => 0x96bc, 0xba => 0x4f34, 0xbb => 0x5224, 0xbc => 0x534a,
+    0xbd => 0x53cd, 0xbe => 0x53db, 0xbf => 0x5e06, 0xc0 => 0x642c,
+    0xc1 => 0x6591, 0xc2 => 0x677f, 0xc3 => 0x6c3e, 0xc4 => 0x6c4e,
+    0xc5 => 0x7248, 0xc6 => 0x72af, 0xc7 => 0x73ed, 0xc8 => 0x7554,
+    0xc9 => 0x7e41, 0xca => 0x822c, 0xcb => 0x85e9, 0xcc => 0x8ca9,
+    0xcd => 0x7bc4, 0xce => 0x91c6, 0xcf => 0x7169, 0xd0 => 0x9812,
+    0xd1 => 0x98ef, 0xd2 => 0x633d, 0xd3 => 0x6669, 0xd4 => 0x756a,
+    0xd5 => 0x76e4, 0xd6 => 0x78d0, 0xd7 => 0x8543, 0xd8 => 0x86ee,
+    0xd9 => 0x532a, 0xda => 0x5351, 0xdb => 0x5426, 0xdc => 0x5983,
+    0xdd => 0x5e87, 0xde => 0x5f7c, 0xdf => 0x60b2, 0xe0 => 0x6249,
+    0xe1 => 0x6279, 0xe2 => 0x62ab, 0xe3 => 0x6590, 0xe4 => 0x6bd4,
+    0xe5 => 0x6ccc, 0xe6 => 0x75b2, 0xe7 => 0x76ae, 0xe8 => 0x7891,
+    0xe9 => 0x79d8, 0xea => 0x7dcb, 0xeb => 0x7f77, 0xec => 0x80a5,
+    0xed => 0x88ab, 0xee => 0x8ab9, 0xef => 0x8cbb, 0xf0 => 0x907f,
+    0xf1 => 0x975e, 0xf2 => 0x98db, 0xf3 => 0x6a0b, 0xf4 => 0x7c38,
+    0xf5 => 0x5099, 0xf6 => 0x5c3e, 0xf7 => 0x5fae, 0xf8 => 0x6787,
+    0xf9 => 0x6bd8, 0xfa => 0x7435, 0xfb => 0x7709, 0xfc => 0x7f8e,
+  },
+  0x95 => {
+    0x40 => 0x9f3b, 0x41 => 0x67ca, 0x42 => 0x7a17, 0x43 => 0x5339,
+    0x44 => 0x758b, 0x45 => 0x9aed, 0x46 => 0x5f66, 0x47 => 0x819d,
+    0x48 => 0x83f1, 0x49 => 0x8098, 0x4a => 0x5f3c, 0x4b => 0x5fc5,
+    0x4c => 0x7562, 0x4d => 0x7b46, 0x4e => 0x903c, 0x4f => 0x6867,
+    0x50 => 0x59eb, 0x51 => 0x5a9b, 0x52 => 0x7d10, 0x53 => 0x767e,
+    0x54 => 0x8b2c, 0x55 => 0x4ff5, 0x56 => 0x5f6a, 0x57 => 0x6a19,
+    0x58 => 0x6c37, 0x59 => 0x6f02, 0x5a => 0x74e2, 0x5b => 0x7968,
+    0x5c => 0x8868, 0x5d => 0x8a55, 0x5e => 0x8c79, 0x5f => 0x5edf,
+    0x60 => 0x63cf, 0x61 => 0x75c5, 0x62 => 0x79d2, 0x63 => 0x82d7,
+    0x64 => 0x9328, 0x65 => 0x92f2, 0x66 => 0x849c, 0x67 => 0x86ed,
+    0x68 => 0x9c2d, 0x69 => 0x54c1, 0x6a => 0x5f6c, 0x6b => 0x658c,
+    0x6c => 0x6d5c, 0x6d => 0x7015, 0x6e => 0x8ca7, 0x6f => 0x8cd3,
+    0x70 => 0x983b, 0x71 => 0x654f, 0x72 => 0x74f6, 0x73 => 0x4e0d,
+    0x74 => 0x4ed8, 0x75 => 0x57e0, 0x76 => 0x592b, 0x77 => 0x5a66,
+    0x78 => 0x5bcc, 0x79 => 0x51a8, 0x7a => 0x5e03, 0x7b => 0x5e9c,
+    0x7c => 0x6016, 0x7d => 0x6276, 0x7e => 0x6577, 0x80 => 0x65a7,
+    0x81 => 0x666e, 0x82 => 0x6d6e, 0x83 => 0x7236, 0x84 => 0x7b26,
+    0x85 => 0x8150, 0x86 => 0x819a, 0x87 => 0x8299, 0x88 => 0x8b5c,
+    0x89 => 0x8ca0, 0x8a => 0x8ce6, 0x8b => 0x8d74, 0x8c => 0x961c,
+    0x8d => 0x9644, 0x8e => 0x4fae, 0x8f => 0x64ab, 0x90 => 0x6b66,
+    0x91 => 0x821e, 0x92 => 0x8461, 0x93 => 0x856a, 0x94 => 0x90e8,
+    0x95 => 0x5c01, 0x96 => 0x6953, 0x97 => 0x98a8, 0x98 => 0x847a,
+    0x99 => 0x8557, 0x9a => 0x4f0f, 0x9b => 0x526f, 0x9c => 0x5fa9,
+    0x9d => 0x5e45, 0x9e => 0x670d, 0x9f => 0x798f, 0xa0 => 0x8179,
+    0xa1 => 0x8907, 0xa2 => 0x8986, 0xa3 => 0x6df5, 0xa4 => 0x5f17,
+    0xa5 => 0x6255, 0xa6 => 0x6cb8, 0xa7 => 0x4ecf, 0xa8 => 0x7269,
+    0xa9 => 0x9b92, 0xaa => 0x5206, 0xab => 0x543b, 0xac => 0x5674,
+    0xad => 0x58b3, 0xae => 0x61a4, 0xaf => 0x626e, 0xb0 => 0x711a,
+    0xb1 => 0x596e, 0xb2 => 0x7c89, 0xb3 => 0x7cde, 0xb4 => 0x7d1b,
+    0xb5 => 0x96f0, 0xb6 => 0x6587, 0xb7 => 0x805e, 0xb8 => 0x4e19,
+    0xb9 => 0x4f75, 0xba => 0x5175, 0xbb => 0x5840, 0xbc => 0x5e63,
+    0xbd => 0x5e73, 0xbe => 0x5f0a, 0xbf => 0x67c4, 0xc0 => 0x4e26,
+    0xc1 => 0x853d, 0xc2 => 0x9589, 0xc3 => 0x965b, 0xc4 => 0x7c73,
+    0xc5 => 0x9801, 0xc6 => 0x50fb, 0xc7 => 0x58c1, 0xc8 => 0x7656,
+    0xc9 => 0x78a7, 0xca => 0x5225, 0xcb => 0x77a5, 0xcc => 0x8511,
+    0xcd => 0x7b86, 0xce => 0x504f, 0xcf => 0x5909, 0xd0 => 0x7247,
+    0xd1 => 0x7bc7, 0xd2 => 0x7de8, 0xd3 => 0x8fba, 0xd4 => 0x8fd4,
+    0xd5 => 0x904d, 0xd6 => 0x4fbf, 0xd7 => 0x52c9, 0xd8 => 0x5a29,
+    0xd9 => 0x5f01, 0xda => 0x97ad, 0xdb => 0x4fdd, 0xdc => 0x8217,
+    0xdd => 0x92ea, 0xde => 0x5703, 0xdf => 0x6355, 0xe0 => 0x6b69,
+    0xe1 => 0x752b, 0xe2 => 0x88dc, 0xe3 => 0x8f14, 0xe4 => 0x7a42,
+    0xe5 => 0x52df, 0xe6 => 0x5893, 0xe7 => 0x6155, 0xe8 => 0x620a,
+    0xe9 => 0x66ae, 0xea => 0x6bcd, 0xeb => 0x7c3f, 0xec => 0x83e9,
+    0xed => 0x5023, 0xee => 0x4ff8, 0xef => 0x5305, 0xf0 => 0x5446,
+    0xf1 => 0x5831, 0xf2 => 0x5949, 0xf3 => 0x5b9d, 0xf4 => 0x5cf0,
+    0xf5 => 0x5cef, 0xf6 => 0x5d29, 0xf7 => 0x5e96, 0xf8 => 0x62b1,
+    0xf9 => 0x6367, 0xfa => 0x653e, 0xfb => 0x65b9, 0xfc => 0x670b,
+  },
+  0x96 => {
+    0x40 => 0x6cd5, 0x41 => 0x6ce1, 0x42 => 0x70f9, 0x43 => 0x7832,
+    0x44 => 0x7e2b, 0x45 => 0x80de, 0x46 => 0x82b3, 0x47 => 0x840c,
+    0x48 => 0x84ec, 0x49 => 0x8702, 0x4a => 0x8912, 0x4b => 0x8a2a,
+    0x4c => 0x8c4a, 0x4d => 0x90a6, 0x4e => 0x92d2, 0x4f => 0x98fd,
+    0x50 => 0x9cf3, 0x51 => 0x9d6c, 0x52 => 0x4e4f, 0x53 => 0x4ea1,
+    0x54 => 0x508d, 0x55 => 0x5256, 0x56 => 0x574a, 0x57 => 0x59a8,
+    0x58 => 0x5e3d, 0x59 => 0x5fd8, 0x5a => 0x5fd9, 0x5b => 0x623f,
+    0x5c => 0x66b4, 0x5d => 0x671b, 0x5e => 0x67d0, 0x5f => 0x68d2,
+    0x60 => 0x5192, 0x61 => 0x7d21, 0x62 => 0x80aa, 0x63 => 0x81a8,
+    0x64 => 0x8b00, 0x65 => 0x8c8c, 0x66 => 0x8cbf, 0x67 => 0x927e,
+    0x68 => 0x9632, 0x69 => 0x5420, 0x6a => 0x982c, 0x6b => 0x5317,
+    0x6c => 0x50d5, 0x6d => 0x535c, 0x6e => 0x58a8, 0x6f => 0x64b2,
+    0x70 => 0x6734, 0x71 => 0x7267, 0x72 => 0x7766, 0x73 => 0x7a46,
+    0x74 => 0x91e6, 0x75 => 0x52c3, 0x76 => 0x6ca1, 0x77 => 0x6b86,
+    0x78 => 0x5800, 0x79 => 0x5e4c, 0x7a => 0x5954, 0x7b => 0x672c,
+    0x7c => 0x7ffb, 0x7d => 0x51e1, 0x7e => 0x76c6, 0x80 => 0x6469,
+    0x81 => 0x78e8, 0x82 => 0x9b54, 0x83 => 0x9ebb, 0x84 => 0x57cb,
+    0x85 => 0x59b9, 0x86 => 0x6627, 0x87 => 0x679a, 0x88 => 0x6bce,
+    0x89 => 0x54e9, 0x8a => 0x69d9, 0x8b => 0x5e55, 0x8c => 0x819c,
+    0x8d => 0x6795, 0x8e => 0x9baa, 0x8f => 0x67fe, 0x90 => 0x9c52,
+    0x91 => 0x685d, 0x92 => 0x4ea6, 0x93 => 0x4fe3, 0x94 => 0x53c8,
+    0x95 => 0x62b9, 0x96 => 0x672b, 0x97 => 0x6cab, 0x98 => 0x8fc4,
+    0x99 => 0x4fad, 0x9a => 0x7e6d, 0x9b => 0x9ebf, 0x9c => 0x4e07,
+    0x9d => 0x6162, 0x9e => 0x6e80, 0x9f => 0x6f2b, 0xa0 => 0x8513,
+    0xa1 => 0x5473, 0xa2 => 0x672a, 0xa3 => 0x9b45, 0xa4 => 0x5df3,
+    0xa5 => 0x7b95, 0xa6 => 0x5cac, 0xa7 => 0x5bc6, 0xa8 => 0x871c,
+    0xa9 => 0x6e4a, 0xaa => 0x84d1, 0xab => 0x7a14, 0xac => 0x8108,
+    0xad => 0x5999, 0xae => 0x7c8d, 0xaf => 0x6c11, 0xb0 => 0x7720,
+    0xb1 => 0x52d9, 0xb2 => 0x5922, 0xb3 => 0x7121, 0xb4 => 0x725f,
+    0xb5 => 0x77db, 0xb6 => 0x9727, 0xb7 => 0x9d61, 0xb8 => 0x690b,
+    0xb9 => 0x5a7f, 0xba => 0x5a18, 0xbb => 0x51a5, 0xbc => 0x540d,
+    0xbd => 0x547d, 0xbe => 0x660e, 0xbf => 0x76df, 0xc0 => 0x8ff7,
+    0xc1 => 0x9298, 0xc2 => 0x9cf4, 0xc3 => 0x59ea, 0xc4 => 0x725d,
+    0xc5 => 0x6ec5, 0xc6 => 0x514d, 0xc7 => 0x68c9, 0xc8 => 0x7dbf,
+    0xc9 => 0x7dec, 0xca => 0x9762, 0xcb => 0x9eba, 0xcc => 0x6478,
+    0xcd => 0x6a21, 0xce => 0x8302, 0xcf => 0x5984, 0xd0 => 0x5b5f,
+    0xd1 => 0x6bdb, 0xd2 => 0x731b, 0xd3 => 0x76f2, 0xd4 => 0x7db2,
+    0xd5 => 0x8017, 0xd6 => 0x8499, 0xd7 => 0x5132, 0xd8 => 0x6728,
+    0xd9 => 0x9ed9, 0xda => 0x76ee, 0xdb => 0x6762, 0xdc => 0x52ff,
+    0xdd => 0x9905, 0xde => 0x5c24, 0xdf => 0x623b, 0xe0 => 0x7c7e,
+    0xe1 => 0x8cb0, 0xe2 => 0x554f, 0xe3 => 0x60b6, 0xe4 => 0x7d0b,
+    0xe5 => 0x9580, 0xe6 => 0x5301, 0xe7 => 0x4e5f, 0xe8 => 0x51b6,
+    0xe9 => 0x591c, 0xea => 0x723a, 0xeb => 0x8036, 0xec => 0x91ce,
+    0xed => 0x5f25, 0xee => 0x77e2, 0xef => 0x5384, 0xf0 => 0x5f79,
+    0xf1 => 0x7d04, 0xf2 => 0x85ac, 0xf3 => 0x8a33, 0xf4 => 0x8e8d,
+    0xf5 => 0x9756, 0xf6 => 0x67f3, 0xf7 => 0x85ae, 0xf8 => 0x9453,
+    0xf9 => 0x6109, 0xfa => 0x6108, 0xfb => 0x6cb9, 0xfc => 0x7652,
+  },
+  0x97 => {
+    0x40 => 0x8aed, 0x41 => 0x8f38, 0x42 => 0x552f, 0x43 => 0x4f51,
+    0x44 => 0x512a, 0x45 => 0x52c7, 0x46 => 0x53cb, 0x47 => 0x5ba5,
+    0x48 => 0x5e7d, 0x49 => 0x60a0, 0x4a => 0x6182, 0x4b => 0x63d6,
+    0x4c => 0x6709, 0x4d => 0x67da, 0x4e => 0x6e67, 0x4f => 0x6d8c,
+    0x50 => 0x7336, 0x51 => 0x7337, 0x52 => 0x7531, 0x53 => 0x7950,
+    0x54 => 0x88d5, 0x55 => 0x8a98, 0x56 => 0x904a, 0x57 => 0x9091,
+    0x58 => 0x90f5, 0x59 => 0x96c4, 0x5a => 0x878d, 0x5b => 0x5915,
+    0x5c => 0x4e88, 0x5d => 0x4f59, 0x5e => 0x4e0e, 0x5f => 0x8a89,
+    0x60 => 0x8f3f, 0x61 => 0x9810, 0x62 => 0x50ad, 0x63 => 0x5e7c,
+    0x64 => 0x5996, 0x65 => 0x5bb9, 0x66 => 0x5eb8, 0x67 => 0x63da,
+    0x68 => 0x63fa, 0x69 => 0x64c1, 0x6a => 0x66dc, 0x6b => 0x694a,
+    0x6c => 0x69d8, 0x6d => 0x6d0b, 0x6e => 0x6eb6, 0x6f => 0x7194,
+    0x70 => 0x7528, 0x71 => 0x7aaf, 0x72 => 0x7f8a, 0x73 => 0x8000,
+    0x74 => 0x8449, 0x75 => 0x84c9, 0x76 => 0x8981, 0x77 => 0x8b21,
+    0x78 => 0x8e0a, 0x79 => 0x9065, 0x7a => 0x967d, 0x7b => 0x990a,
+    0x7c => 0x617e, 0x7d => 0x6291, 0x7e => 0x6b32, 0x80 => 0x6c83,
+    0x81 => 0x6d74, 0x82 => 0x7fcc, 0x83 => 0x7ffc, 0x84 => 0x6dc0,
+    0x85 => 0x7f85, 0x86 => 0x87ba, 0x87 => 0x88f8, 0x88 => 0x6765,
+    0x89 => 0x83b1, 0x8a => 0x983c, 0x8b => 0x96f7, 0x8c => 0x6d1b,
+    0x8d => 0x7d61, 0x8e => 0x843d, 0x8f => 0x916a, 0x90 => 0x4e71,
+    0x91 => 0x5375, 0x92 => 0x5d50, 0x93 => 0x6b04, 0x94 => 0x6feb,
+    0x95 => 0x85cd, 0x96 => 0x862d, 0x97 => 0x89a7, 0x98 => 0x5229,
+    0x99 => 0x540f, 0x9a => 0x5c65, 0x9b => 0x674e, 0x9c => 0x68a8,
+    0x9d => 0x7406, 0x9e => 0x7483, 0x9f => 0x75e2, 0xa0 => 0x88cf,
+    0xa1 => 0x88e1, 0xa2 => 0x91cc, 0xa3 => 0x96e2, 0xa4 => 0x9678,
+    0xa5 => 0x5f8b, 0xa6 => 0x7387, 0xa7 => 0x7acb, 0xa8 => 0x844e,
+    0xa9 => 0x63a0, 0xaa => 0x7565, 0xab => 0x5289, 0xac => 0x6d41,
+    0xad => 0x6e9c, 0xae => 0x7409, 0xaf => 0x7559, 0xb0 => 0x786b,
+    0xb1 => 0x7c92, 0xb2 => 0x9686, 0xb3 => 0x7adc, 0xb4 => 0x9f8d,
+    0xb5 => 0x4fb6, 0xb6 => 0x616e, 0xb7 => 0x65c5, 0xb8 => 0x865c,
+    0xb9 => 0x4e86, 0xba => 0x4eae, 0xbb => 0x50da, 0xbc => 0x4e21,
+    0xbd => 0x51cc, 0xbe => 0x5bee, 0xbf => 0x6599, 0xc0 => 0x6881,
+    0xc1 => 0x6dbc, 0xc2 => 0x731f, 0xc3 => 0x7642, 0xc4 => 0x77ad,
+    0xc5 => 0x7a1c, 0xc6 => 0x7ce7, 0xc7 => 0x826f, 0xc8 => 0x8ad2,
+    0xc9 => 0x907c, 0xca => 0x91cf, 0xcb => 0x9675, 0xcc => 0x9818,
+    0xcd => 0x529b, 0xce => 0x7dd1, 0xcf => 0x502b, 0xd0 => 0x5398,
+    0xd1 => 0x6797, 0xd2 => 0x6dcb, 0xd3 => 0x71d0, 0xd4 => 0x7433,
+    0xd5 => 0x81e8, 0xd6 => 0x8f2a, 0xd7 => 0x96a3, 0xd8 => 0x9c57,
+    0xd9 => 0x9e9f, 0xda => 0x7460, 0xdb => 0x5841, 0xdc => 0x6d99,
+    0xdd => 0x7d2f, 0xde => 0x985e, 0xdf => 0x4ee4, 0xe0 => 0x4f36,
+    0xe1 => 0x4f8b, 0xe2 => 0x51b7, 0xe3 => 0x52b1, 0xe4 => 0x5dba,
+    0xe5 => 0x601c, 0xe6 => 0x73b2, 0xe7 => 0x793c, 0xe8 => 0x82d3,
+    0xe9 => 0x9234, 0xea => 0x96b7, 0xeb => 0x96f6, 0xec => 0x970a,
+    0xed => 0x9e97, 0xee => 0x9f62, 0xef => 0x66a6, 0xf0 => 0x6b74,
+    0xf1 => 0x5217, 0xf2 => 0x52a3, 0xf3 => 0x70c8, 0xf4 => 0x88c2,
+    0xf5 => 0x5ec9, 0xf6 => 0x604b, 0xf7 => 0x6190, 0xf8 => 0x6f23,
+    0xf9 => 0x7149, 0xfa => 0x7c3e, 0xfb => 0x7df4, 0xfc => 0x806f,
+  },
+  0x98 => {
+    0x40 => 0x84ee, 0x41 => 0x9023, 0x42 => 0x932c, 0x43 => 0x5442,
+    0x44 => 0x9b6f, 0x45 => 0x6ad3, 0x46 => 0x7089, 0x47 => 0x8cc2,
+    0x48 => 0x8def, 0x49 => 0x9732, 0x4a => 0x52b4, 0x4b => 0x5a41,
+    0x4c => 0x5eca, 0x4d => 0x5f04, 0x4e => 0x6717, 0x4f => 0x697c,
+    0x50 => 0x6994, 0x51 => 0x6d6a, 0x52 => 0x6f0f, 0x53 => 0x7262,
+    0x54 => 0x72fc, 0x55 => 0x7bed, 0x56 => 0x8001, 0x57 => 0x807e,
+    0x58 => 0x874b, 0x59 => 0x90ce, 0x5a => 0x516d, 0x5b => 0x9e93,
+    0x5c => 0x7984, 0x5d => 0x808b, 0x5e => 0x9332, 0x5f => 0x8ad6,
+    0x60 => 0x502d, 0x61 => 0x548c, 0x62 => 0x8a71, 0x63 => 0x6b6a,
+    0x64 => 0x8cc4, 0x65 => 0x8107, 0x66 => 0x60d1, 0x67 => 0x67a0,
+    0x68 => 0x9df2, 0x69 => 0x4e99, 0x6a => 0x4e98, 0x6b => 0x9c10,
+    0x6c => 0x8a6b, 0x6d => 0x85c1, 0x6e => 0x8568, 0x6f => 0x6900,
+    0x70 => 0x6e7e, 0x71 => 0x7897, 0x72 => 0x8155, 0x9f => 0x5f0c,
+    0xa0 => 0x4e10, 0xa1 => 0x4e15, 0xa2 => 0x4e2a, 0xa3 => 0x4e31,
+    0xa4 => 0x4e36, 0xa5 => 0x4e3c, 0xa6 => 0x4e3f, 0xa7 => 0x4e42,
+    0xa8 => 0x4e56, 0xa9 => 0x4e58, 0xaa => 0x4e82, 0xab => 0x4e85,
+    0xac => 0x8c6b, 0xad => 0x4e8a, 0xae => 0x8212, 0xaf => 0x5f0d,
+    0xb0 => 0x4e8e, 0xb1 => 0x4e9e, 0xb2 => 0x4e9f, 0xb3 => 0x4ea0,
+    0xb4 => 0x4ea2, 0xb5 => 0x4eb0, 0xb6 => 0x4eb3, 0xb7 => 0x4eb6,
+    0xb8 => 0x4ece, 0xb9 => 0x4ecd, 0xba => 0x4ec4, 0xbb => 0x4ec6,
+    0xbc => 0x4ec2, 0xbd => 0x4ed7, 0xbe => 0x4ede, 0xbf => 0x4eed,
+    0xc0 => 0x4edf, 0xc1 => 0x4ef7, 0xc2 => 0x4f09, 0xc3 => 0x4f5a,
+    0xc4 => 0x4f30, 0xc5 => 0x4f5b, 0xc6 => 0x4f5d, 0xc7 => 0x4f57,
+    0xc8 => 0x4f47, 0xc9 => 0x4f76, 0xca => 0x4f88, 0xcb => 0x4f8f,
+    0xcc => 0x4f98, 0xcd => 0x4f7b, 0xce => 0x4f69, 0xcf => 0x4f70,
+    0xd0 => 0x4f91, 0xd1 => 0x4f6f, 0xd2 => 0x4f86, 0xd3 => 0x4f96,
+    0xd4 => 0x5118, 0xd5 => 0x4fd4, 0xd6 => 0x4fdf, 0xd7 => 0x4fce,
+    0xd8 => 0x4fd8, 0xd9 => 0x4fdb, 0xda => 0x4fd1, 0xdb => 0x4fda,
+    0xdc => 0x4fd0, 0xdd => 0x4fe4, 0xde => 0x4fe5, 0xdf => 0x501a,
+    0xe0 => 0x5028, 0xe1 => 0x5014, 0xe2 => 0x502a, 0xe3 => 0x5025,
+    0xe4 => 0x5005, 0xe5 => 0x4f1c, 0xe6 => 0x4ff6, 0xe7 => 0x5021,
+    0xe8 => 0x5029, 0xe9 => 0x502c, 0xea => 0x4ffe, 0xeb => 0x4fef,
+    0xec => 0x5011, 0xed => 0x5006, 0xee => 0x5043, 0xef => 0x5047,
+    0xf0 => 0x6703, 0xf1 => 0x5055, 0xf2 => 0x5050, 0xf3 => 0x5048,
+    0xf4 => 0x505a, 0xf5 => 0x5056, 0xf6 => 0x506c, 0xf7 => 0x5078,
+    0xf8 => 0x5080, 0xf9 => 0x509a, 0xfa => 0x5085, 0xfb => 0x50b4,
+    0xfc => 0x50b2,
+  },
+  0x99 => {
+    0x40 => 0x50c9, 0x41 => 0x50ca, 0x42 => 0x50b3, 0x43 => 0x50c2,
+    0x44 => 0x50d6, 0x45 => 0x50de, 0x46 => 0x50e5, 0x47 => 0x50ed,
+    0x48 => 0x50e3, 0x49 => 0x50ee, 0x4a => 0x50f9, 0x4b => 0x50f5,
+    0x4c => 0x5109, 0x4d => 0x5101, 0x4e => 0x5102, 0x4f => 0x5116,
+    0x50 => 0x5115, 0x51 => 0x5114, 0x52 => 0x511a, 0x53 => 0x5121,
+    0x54 => 0x513a, 0x55 => 0x5137, 0x56 => 0x513c, 0x57 => 0x513b,
+    0x58 => 0x513f, 0x59 => 0x5140, 0x5a => 0x5152, 0x5b => 0x514c,
+    0x5c => 0x5154, 0x5d => 0x5162, 0x5e => 0x7af8, 0x5f => 0x5169,
+    0x60 => 0x516a, 0x61 => 0x516e, 0x62 => 0x5180, 0x63 => 0x5182,
+    0x64 => 0x56d8, 0x65 => 0x518c, 0x66 => 0x5189, 0x67 => 0x518f,
+    0x68 => 0x5191, 0x69 => 0x5193, 0x6a => 0x5195, 0x6b => 0x5196,
+    0x6c => 0x51a4, 0x6d => 0x51a6, 0x6e => 0x51a2, 0x6f => 0x51a9,
+    0x70 => 0x51aa, 0x71 => 0x51ab, 0x72 => 0x51b3, 0x73 => 0x51b1,
+    0x74 => 0x51b2, 0x75 => 0x51b0, 0x76 => 0x51b5, 0x77 => 0x51bd,
+    0x78 => 0x51c5, 0x79 => 0x51c9, 0x7a => 0x51db, 0x7b => 0x51e0,
+    0x7c => 0x8655, 0x7d => 0x51e9, 0x7e => 0x51ed, 0x80 => 0x51f0,
+    0x81 => 0x51f5, 0x82 => 0x51fe, 0x83 => 0x5204, 0x84 => 0x520b,
+    0x85 => 0x5214, 0x86 => 0x520e, 0x87 => 0x5227, 0x88 => 0x522a,
+    0x89 => 0x522e, 0x8a => 0x5233, 0x8b => 0x5239, 0x8c => 0x524f,
+    0x8d => 0x5244, 0x8e => 0x524b, 0x8f => 0x524c, 0x90 => 0x525e,
+    0x91 => 0x5254, 0x92 => 0x526a, 0x93 => 0x5274, 0x94 => 0x5269,
+    0x95 => 0x5273, 0x96 => 0x527f, 0x97 => 0x527d, 0x98 => 0x528d,
+    0x99 => 0x5294, 0x9a => 0x5292, 0x9b => 0x5271, 0x9c => 0x5288,
+    0x9d => 0x5291, 0x9e => 0x8fa8, 0x9f => 0x8fa7, 0xa0 => 0x52ac,
+    0xa1 => 0x52ad, 0xa2 => 0x52bc, 0xa3 => 0x52b5, 0xa4 => 0x52c1,
+    0xa5 => 0x52cd, 0xa6 => 0x52d7, 0xa7 => 0x52de, 0xa8 => 0x52e3,
+    0xa9 => 0x52e6, 0xaa => 0x98ed, 0xab => 0x52e0, 0xac => 0x52f3,
+    0xad => 0x52f5, 0xae => 0x52f8, 0xaf => 0x52f9, 0xb0 => 0x5306,
+    0xb1 => 0x5308, 0xb2 => 0x7538, 0xb3 => 0x530d, 0xb4 => 0x5310,
+    0xb5 => 0x530f, 0xb6 => 0x5315, 0xb7 => 0x531a, 0xb8 => 0x5323,
+    0xb9 => 0x532f, 0xba => 0x5331, 0xbb => 0x5333, 0xbc => 0x5338,
+    0xbd => 0x5340, 0xbe => 0x5346, 0xbf => 0x5345, 0xc0 => 0x4e17,
+    0xc1 => 0x5349, 0xc2 => 0x534d, 0xc3 => 0x51d6, 0xc4 => 0x535e,
+    0xc5 => 0x5369, 0xc6 => 0x536e, 0xc7 => 0x5918, 0xc8 => 0x537b,
+    0xc9 => 0x5377, 0xca => 0x5382, 0xcb => 0x5396, 0xcc => 0x53a0,
+    0xcd => 0x53a6, 0xce => 0x53a5, 0xcf => 0x53ae, 0xd0 => 0x53b0,
+    0xd1 => 0x53b6, 0xd2 => 0x53c3, 0xd3 => 0x7c12, 0xd4 => 0x96d9,
+    0xd5 => 0x53df, 0xd6 => 0x66fc, 0xd7 => 0x71ee, 0xd8 => 0x53ee,
+    0xd9 => 0x53e8, 0xda => 0x53ed, 0xdb => 0x53fa, 0xdc => 0x5401,
+    0xdd => 0x543d, 0xde => 0x5440, 0xdf => 0x542c, 0xe0 => 0x542d,
+    0xe1 => 0x543c, 0xe2 => 0x542e, 0xe3 => 0x5436, 0xe4 => 0x5429,
+    0xe5 => 0x541d, 0xe6 => 0x544e, 0xe7 => 0x548f, 0xe8 => 0x5475,
+    0xe9 => 0x548e, 0xea => 0x545f, 0xeb => 0x5471, 0xec => 0x5477,
+    0xed => 0x5470, 0xee => 0x5492, 0xef => 0x547b, 0xf0 => 0x5480,
+    0xf1 => 0x5476, 0xf2 => 0x5484, 0xf3 => 0x5490, 0xf4 => 0x5486,
+    0xf5 => 0x54c7, 0xf6 => 0x54a2, 0xf7 => 0x54b8, 0xf8 => 0x54a5,
+    0xf9 => 0x54ac, 0xfa => 0x54c4, 0xfb => 0x54c8, 0xfc => 0x54a8,
+  },
+  0x9a => {
+    0x40 => 0x54ab, 0x41 => 0x54c2, 0x42 => 0x54a4, 0x43 => 0x54be,
+    0x44 => 0x54bc, 0x45 => 0x54d8, 0x46 => 0x54e5, 0x47 => 0x54e6,
+    0x48 => 0x550f, 0x49 => 0x5514, 0x4a => 0x54fd, 0x4b => 0x54ee,
+    0x4c => 0x54ed, 0x4d => 0x54fa, 0x4e => 0x54e2, 0x4f => 0x5539,
+    0x50 => 0x5540, 0x51 => 0x5563, 0x52 => 0x554c, 0x53 => 0x552e,
+    0x54 => 0x555c, 0x55 => 0x5545, 0x56 => 0x5556, 0x57 => 0x5557,
+    0x58 => 0x5538, 0x59 => 0x5533, 0x5a => 0x555d, 0x5b => 0x5599,
+    0x5c => 0x5580, 0x5d => 0x54af, 0x5e => 0x558a, 0x5f => 0x559f,
+    0x60 => 0x557b, 0x61 => 0x557e, 0x62 => 0x5598, 0x63 => 0x559e,
+    0x64 => 0x55ae, 0x65 => 0x557c, 0x66 => 0x5583, 0x67 => 0x55a9,
+    0x68 => 0x5587, 0x69 => 0x55a8, 0x6a => 0x55da, 0x6b => 0x55c5,
+    0x6c => 0x55df, 0x6d => 0x55c4, 0x6e => 0x55dc, 0x6f => 0x55e4,
+    0x70 => 0x55d4, 0x71 => 0x5614, 0x72 => 0x55f7, 0x73 => 0x5616,
+    0x74 => 0x55fe, 0x75 => 0x55fd, 0x76 => 0x561b, 0x77 => 0x55f9,
+    0x78 => 0x564e, 0x79 => 0x5650, 0x7a => 0x71df, 0x7b => 0x5634,
+    0x7c => 0x5636, 0x7d => 0x5632, 0x7e => 0x5638, 0x80 => 0x566b,
+    0x81 => 0x5664, 0x82 => 0x562f, 0x83 => 0x566c, 0x84 => 0x566a,
+    0x85 => 0x5686, 0x86 => 0x5680, 0x87 => 0x568a, 0x88 => 0x56a0,
+    0x89 => 0x5694, 0x8a => 0x568f, 0x8b => 0x56a5, 0x8c => 0x56ae,
+    0x8d => 0x56b6, 0x8e => 0x56b4, 0x8f => 0x56c2, 0x90 => 0x56bc,
+    0x91 => 0x56c1, 0x92 => 0x56c3, 0x93 => 0x56c0, 0x94 => 0x56c8,
+    0x95 => 0x56ce, 0x96 => 0x56d1, 0x97 => 0x56d3, 0x98 => 0x56d7,
+    0x99 => 0x56ee, 0x9a => 0x56f9, 0x9b => 0x5700, 0x9c => 0x56ff,
+    0x9d => 0x5704, 0x9e => 0x5709, 0x9f => 0x5708, 0xa0 => 0x570b,
+    0xa1 => 0x570d, 0xa2 => 0x5713, 0xa3 => 0x5718, 0xa4 => 0x5716,
+    0xa5 => 0x55c7, 0xa6 => 0x571c, 0xa7 => 0x5726, 0xa8 => 0x5737,
+    0xa9 => 0x5738, 0xaa => 0x574e, 0xab => 0x573b, 0xac => 0x5740,
+    0xad => 0x574f, 0xae => 0x5769, 0xaf => 0x57c0, 0xb0 => 0x5788,
+    0xb1 => 0x5761, 0xb2 => 0x577f, 0xb3 => 0x5789, 0xb4 => 0x5793,
+    0xb5 => 0x57a0, 0xb6 => 0x57b3, 0xb7 => 0x57a4, 0xb8 => 0x57aa,
+    0xb9 => 0x57b0, 0xba => 0x57c3, 0xbb => 0x57c6, 0xbc => 0x57d4,
+    0xbd => 0x57d2, 0xbe => 0x57d3, 0xbf => 0x580a, 0xc0 => 0x57d6,
+    0xc1 => 0x57e3, 0xc2 => 0x580b, 0xc3 => 0x5819, 0xc4 => 0x581d,
+    0xc5 => 0x5872, 0xc6 => 0x5821, 0xc7 => 0x5862, 0xc8 => 0x584b,
+    0xc9 => 0x5870, 0xca => 0x6bc0, 0xcb => 0x5852, 0xcc => 0x583d,
+    0xcd => 0x5879, 0xce => 0x5885, 0xcf => 0x58b9, 0xd0 => 0x589f,
+    0xd1 => 0x58ab, 0xd2 => 0x58ba, 0xd3 => 0x58de, 0xd4 => 0x58bb,
+    0xd5 => 0x58b8, 0xd6 => 0x58ae, 0xd7 => 0x58c5, 0xd8 => 0x58d3,
+    0xd9 => 0x58d1, 0xda => 0x58d7, 0xdb => 0x58d9, 0xdc => 0x58d8,
+    0xdd => 0x58e5, 0xde => 0x58dc, 0xdf => 0x58e4, 0xe0 => 0x58df,
+    0xe1 => 0x58ef, 0xe2 => 0x58fa, 0xe3 => 0x58f9, 0xe4 => 0x58fb,
+    0xe5 => 0x58fc, 0xe6 => 0x58fd, 0xe7 => 0x5902, 0xe8 => 0x590a,
+    0xe9 => 0x5910, 0xea => 0x591b, 0xeb => 0x68a6, 0xec => 0x5925,
+    0xed => 0x592c, 0xee => 0x592d, 0xef => 0x5932, 0xf0 => 0x5938,
+    0xf1 => 0x593e, 0xf2 => 0x7ad2, 0xf3 => 0x5955, 0xf4 => 0x5950,
+    0xf5 => 0x594e, 0xf6 => 0x595a, 0xf7 => 0x5958, 0xf8 => 0x5962,
+    0xf9 => 0x5960, 0xfa => 0x5967, 0xfb => 0x596c, 0xfc => 0x5969,
+  },
+  0x9b => {
+    0x40 => 0x5978, 0x41 => 0x5981, 0x42 => 0x599d, 0x43 => 0x4f5e,
+    0x44 => 0x4fab, 0x45 => 0x59a3, 0x46 => 0x59b2, 0x47 => 0x59c6,
+    0x48 => 0x59e8, 0x49 => 0x59dc, 0x4a => 0x598d, 0x4b => 0x59d9,
+    0x4c => 0x59da, 0x4d => 0x5a25, 0x4e => 0x5a1f, 0x4f => 0x5a11,
+    0x50 => 0x5a1c, 0x51 => 0x5a09, 0x52 => 0x5a1a, 0x53 => 0x5a40,
+    0x54 => 0x5a6c, 0x55 => 0x5a49, 0x56 => 0x5a35, 0x57 => 0x5a36,
+    0x58 => 0x5a62, 0x59 => 0x5a6a, 0x5a => 0x5a9a, 0x5b => 0x5abc,
+    0x5c => 0x5abe, 0x5d => 0x5acb, 0x5e => 0x5ac2, 0x5f => 0x5abd,
+    0x60 => 0x5ae3, 0x61 => 0x5ad7, 0x62 => 0x5ae6, 0x63 => 0x5ae9,
+    0x64 => 0x5ad6, 0x65 => 0x5afa, 0x66 => 0x5afb, 0x67 => 0x5b0c,
+    0x68 => 0x5b0b, 0x69 => 0x5b16, 0x6a => 0x5b32, 0x6b => 0x5ad0,
+    0x6c => 0x5b2a, 0x6d => 0x5b36, 0x6e => 0x5b3e, 0x6f => 0x5b43,
+    0x70 => 0x5b45, 0x71 => 0x5b40, 0x72 => 0x5b51, 0x73 => 0x5b55,
+    0x74 => 0x5b5a, 0x75 => 0x5b5b, 0x76 => 0x5b65, 0x77 => 0x5b69,
+    0x78 => 0x5b70, 0x79 => 0x5b73, 0x7a => 0x5b75, 0x7b => 0x5b78,
+    0x7c => 0x6588, 0x7d => 0x5b7a, 0x7e => 0x5b80, 0x80 => 0x5b83,
+    0x81 => 0x5ba6, 0x82 => 0x5bb8, 0x83 => 0x5bc3, 0x84 => 0x5bc7,
+    0x85 => 0x5bc9, 0x86 => 0x5bd4, 0x87 => 0x5bd0, 0x88 => 0x5be4,
+    0x89 => 0x5be6, 0x8a => 0x5be2, 0x8b => 0x5bde, 0x8c => 0x5be5,
+    0x8d => 0x5beb, 0x8e => 0x5bf0, 0x8f => 0x5bf6, 0x90 => 0x5bf3,
+    0x91 => 0x5c05, 0x92 => 0x5c07, 0x93 => 0x5c08, 0x94 => 0x5c0d,
+    0x95 => 0x5c13, 0x96 => 0x5c20, 0x97 => 0x5c22, 0x98 => 0x5c28,
+    0x99 => 0x5c38, 0x9a => 0x5c39, 0x9b => 0x5c41, 0x9c => 0x5c46,
+    0x9d => 0x5c4e, 0x9e => 0x5c53, 0x9f => 0x5c50, 0xa0 => 0x5c4f,
+    0xa1 => 0x5b71, 0xa2 => 0x5c6c, 0xa3 => 0x5c6e, 0xa4 => 0x4e62,
+    0xa5 => 0x5c76, 0xa6 => 0x5c79, 0xa7 => 0x5c8c, 0xa8 => 0x5c91,
+    0xa9 => 0x5c94, 0xaa => 0x599b, 0xab => 0x5cab, 0xac => 0x5cbb,
+    0xad => 0x5cb6, 0xae => 0x5cbc, 0xaf => 0x5cb7, 0xb0 => 0x5cc5,
+    0xb1 => 0x5cbe, 0xb2 => 0x5cc7, 0xb3 => 0x5cd9, 0xb4 => 0x5ce9,
+    0xb5 => 0x5cfd, 0xb6 => 0x5cfa, 0xb7 => 0x5ced, 0xb8 => 0x5d8c,
+    0xb9 => 0x5cea, 0xba => 0x5d0b, 0xbb => 0x5d15, 0xbc => 0x5d17,
+    0xbd => 0x5d5c, 0xbe => 0x5d1f, 0xbf => 0x5d1b, 0xc0 => 0x5d11,
+    0xc1 => 0x5d14, 0xc2 => 0x5d22, 0xc3 => 0x5d1a, 0xc4 => 0x5d19,
+    0xc5 => 0x5d18, 0xc6 => 0x5d4c, 0xc7 => 0x5d52, 0xc8 => 0x5d4e,
+    0xc9 => 0x5d4b, 0xca => 0x5d6c, 0xcb => 0x5d73, 0xcc => 0x5d76,
+    0xcd => 0x5d87, 0xce => 0x5d84, 0xcf => 0x5d82, 0xd0 => 0x5da2,
+    0xd1 => 0x5d9d, 0xd2 => 0x5dac, 0xd3 => 0x5dae, 0xd4 => 0x5dbd,
+    0xd5 => 0x5d90, 0xd6 => 0x5db7, 0xd7 => 0x5dbc, 0xd8 => 0x5dc9,
+    0xd9 => 0x5dcd, 0xda => 0x5dd3, 0xdb => 0x5dd2, 0xdc => 0x5dd6,
+    0xdd => 0x5ddb, 0xde => 0x5deb, 0xdf => 0x5df2, 0xe0 => 0x5df5,
+    0xe1 => 0x5e0b, 0xe2 => 0x5e1a, 0xe3 => 0x5e19, 0xe4 => 0x5e11,
+    0xe5 => 0x5e1b, 0xe6 => 0x5e36, 0xe7 => 0x5e37, 0xe8 => 0x5e44,
+    0xe9 => 0x5e43, 0xea => 0x5e40, 0xeb => 0x5e4e, 0xec => 0x5e57,
+    0xed => 0x5e54, 0xee => 0x5e5f, 0xef => 0x5e62, 0xf0 => 0x5e64,
+    0xf1 => 0x5e47, 0xf2 => 0x5e75, 0xf3 => 0x5e76, 0xf4 => 0x5e7a,
+    0xf5 => 0x9ebc, 0xf6 => 0x5e7f, 0xf7 => 0x5ea0, 0xf8 => 0x5ec1,
+    0xf9 => 0x5ec2, 0xfa => 0x5ec8, 0xfb => 0x5ed0, 0xfc => 0x5ecf,
+  },
+  0x9c => {
+    0x40 => 0x5ed6, 0x41 => 0x5ee3, 0x42 => 0x5edd, 0x43 => 0x5eda,
+    0x44 => 0x5edb, 0x45 => 0x5ee2, 0x46 => 0x5ee1, 0x47 => 0x5ee8,
+    0x48 => 0x5ee9, 0x49 => 0x5eec, 0x4a => 0x5ef1, 0x4b => 0x5ef3,
+    0x4c => 0x5ef0, 0x4d => 0x5ef4, 0x4e => 0x5ef8, 0x4f => 0x5efe,
+    0x50 => 0x5f03, 0x51 => 0x5f09, 0x52 => 0x5f5d, 0x53 => 0x5f5c,
+    0x54 => 0x5f0b, 0x55 => 0x5f11, 0x56 => 0x5f16, 0x57 => 0x5f29,
+    0x58 => 0x5f2d, 0x59 => 0x5f38, 0x5a => 0x5f41, 0x5b => 0x5f48,
+    0x5c => 0x5f4c, 0x5d => 0x5f4e, 0x5e => 0x5f2f, 0x5f => 0x5f51,
+    0x60 => 0x5f56, 0x61 => 0x5f57, 0x62 => 0x5f59, 0x63 => 0x5f61,
+    0x64 => 0x5f6d, 0x65 => 0x5f73, 0x66 => 0x5f77, 0x67 => 0x5f83,
+    0x68 => 0x5f82, 0x69 => 0x5f7f, 0x6a => 0x5f8a, 0x6b => 0x5f88,
+    0x6c => 0x5f91, 0x6d => 0x5f87, 0x6e => 0x5f9e, 0x6f => 0x5f99,
+    0x70 => 0x5f98, 0x71 => 0x5fa0, 0x72 => 0x5fa8, 0x73 => 0x5fad,
+    0x74 => 0x5fbc, 0x75 => 0x5fd6, 0x76 => 0x5ffb, 0x77 => 0x5fe4,
+    0x78 => 0x5ff8, 0x79 => 0x5ff1, 0x7a => 0x5fdd, 0x7b => 0x60b3,
+    0x7c => 0x5fff, 0x7d => 0x6021, 0x7e => 0x6060, 0x80 => 0x6019,
+    0x81 => 0x6010, 0x82 => 0x6029, 0x83 => 0x600e, 0x84 => 0x6031,
+    0x85 => 0x601b, 0x86 => 0x6015, 0x87 => 0x602b, 0x88 => 0x6026,
+    0x89 => 0x600f, 0x8a => 0x603a, 0x8b => 0x605a, 0x8c => 0x6041,
+    0x8d => 0x606a, 0x8e => 0x6077, 0x8f => 0x605f, 0x90 => 0x604a,
+    0x91 => 0x6046, 0x92 => 0x604d, 0x93 => 0x6063, 0x94 => 0x6043,
+    0x95 => 0x6064, 0x96 => 0x6042, 0x97 => 0x606c, 0x98 => 0x606b,
+    0x99 => 0x6059, 0x9a => 0x6081, 0x9b => 0x608d, 0x9c => 0x60e7,
+    0x9d => 0x6083, 0x9e => 0x609a, 0x9f => 0x6084, 0xa0 => 0x609b,
+    0xa1 => 0x6096, 0xa2 => 0x6097, 0xa3 => 0x6092, 0xa4 => 0x60a7,
+    0xa5 => 0x608b, 0xa6 => 0x60e1, 0xa7 => 0x60b8, 0xa8 => 0x60e0,
+    0xa9 => 0x60d3, 0xaa => 0x60b4, 0xab => 0x5ff0, 0xac => 0x60bd,
+    0xad => 0x60c6, 0xae => 0x60b5, 0xaf => 0x60d8, 0xb0 => 0x614d,
+    0xb1 => 0x6115, 0xb2 => 0x6106, 0xb3 => 0x60f6, 0xb4 => 0x60f7,
+    0xb5 => 0x6100, 0xb6 => 0x60f4, 0xb7 => 0x60fa, 0xb8 => 0x6103,
+    0xb9 => 0x6121, 0xba => 0x60fb, 0xbb => 0x60f1, 0xbc => 0x610d,
+    0xbd => 0x610e, 0xbe => 0x6147, 0xbf => 0x613e, 0xc0 => 0x6128,
+    0xc1 => 0x6127, 0xc2 => 0x614a, 0xc3 => 0x613f, 0xc4 => 0x613c,
+    0xc5 => 0x612c, 0xc6 => 0x6134, 0xc7 => 0x613d, 0xc8 => 0x6142,
+    0xc9 => 0x6144, 0xca => 0x6173, 0xcb => 0x6177, 0xcc => 0x6158,
+    0xcd => 0x6159, 0xce => 0x615a, 0xcf => 0x616b, 0xd0 => 0x6174,
+    0xd1 => 0x616f, 0xd2 => 0x6165, 0xd3 => 0x6171, 0xd4 => 0x615f,
+    0xd5 => 0x615d, 0xd6 => 0x6153, 0xd7 => 0x6175, 0xd8 => 0x6199,
+    0xd9 => 0x6196, 0xda => 0x6187, 0xdb => 0x61ac, 0xdc => 0x6194,
+    0xdd => 0x619a, 0xde => 0x618a, 0xdf => 0x6191, 0xe0 => 0x61ab,
+    0xe1 => 0x61ae, 0xe2 => 0x61cc, 0xe3 => 0x61ca, 0xe4 => 0x61c9,
+    0xe5 => 0x61f7, 0xe6 => 0x61c8, 0xe7 => 0x61c3, 0xe8 => 0x61c6,
+    0xe9 => 0x61ba, 0xea => 0x61cb, 0xeb => 0x7f79, 0xec => 0x61cd,
+    0xed => 0x61e6, 0xee => 0x61e3, 0xef => 0x61f6, 0xf0 => 0x61fa,
+    0xf1 => 0x61f4, 0xf2 => 0x61ff, 0xf3 => 0x61fd, 0xf4 => 0x61fc,
+    0xf5 => 0x61fe, 0xf6 => 0x6200, 0xf7 => 0x6208, 0xf8 => 0x6209,
+    0xf9 => 0x620d, 0xfa => 0x620c, 0xfb => 0x6214, 0xfc => 0x621b,
+  },
+  0x9d => {
+    0x40 => 0x621e, 0x41 => 0x6221, 0x42 => 0x622a, 0x43 => 0x622e,
+    0x44 => 0x6230, 0x45 => 0x6232, 0x46 => 0x6233, 0x47 => 0x6241,
+    0x48 => 0x624e, 0x49 => 0x625e, 0x4a => 0x6263, 0x4b => 0x625b,
+    0x4c => 0x6260, 0x4d => 0x6268, 0x4e => 0x627c, 0x4f => 0x6282,
+    0x50 => 0x6289, 0x51 => 0x627e, 0x52 => 0x6292, 0x53 => 0x6293,
+    0x54 => 0x6296, 0x55 => 0x62d4, 0x56 => 0x6283, 0x57 => 0x6294,
+    0x58 => 0x62d7, 0x59 => 0x62d1, 0x5a => 0x62bb, 0x5b => 0x62cf,
+    0x5c => 0x62ff, 0x5d => 0x62c6, 0x5e => 0x64d4, 0x5f => 0x62c8,
+    0x60 => 0x62dc, 0x61 => 0x62cc, 0x62 => 0x62ca, 0x63 => 0x62c2,
+    0x64 => 0x62c7, 0x65 => 0x629b, 0x66 => 0x62c9, 0x67 => 0x630c,
+    0x68 => 0x62ee, 0x69 => 0x62f1, 0x6a => 0x6327, 0x6b => 0x6302,
+    0x6c => 0x6308, 0x6d => 0x62ef, 0x6e => 0x62f5, 0x6f => 0x6350,
+    0x70 => 0x633e, 0x71 => 0x634d, 0x72 => 0x641c, 0x73 => 0x634f,
+    0x74 => 0x6396, 0x75 => 0x638e, 0x76 => 0x6380, 0x77 => 0x63ab,
+    0x78 => 0x6376, 0x79 => 0x63a3, 0x7a => 0x638f, 0x7b => 0x6389,
+    0x7c => 0x639f, 0x7d => 0x63b5, 0x7e => 0x636b, 0x80 => 0x6369,
+    0x81 => 0x63be, 0x82 => 0x63e9, 0x83 => 0x63c0, 0x84 => 0x63c6,
+    0x85 => 0x63e3, 0x86 => 0x63c9, 0x87 => 0x63d2, 0x88 => 0x63f6,
+    0x89 => 0x63c4, 0x8a => 0x6416, 0x8b => 0x6434, 0x8c => 0x6406,
+    0x8d => 0x6413, 0x8e => 0x6426, 0x8f => 0x6436, 0x90 => 0x651d,
+    0x91 => 0x6417, 0x92 => 0x6428, 0x93 => 0x640f, 0x94 => 0x6467,
+    0x95 => 0x646f, 0x96 => 0x6476, 0x97 => 0x644e, 0x98 => 0x652a,
+    0x99 => 0x6495, 0x9a => 0x6493, 0x9b => 0x64a5, 0x9c => 0x64a9,
+    0x9d => 0x6488, 0x9e => 0x64bc, 0x9f => 0x64da, 0xa0 => 0x64d2,
+    0xa1 => 0x64c5, 0xa2 => 0x64c7, 0xa3 => 0x64bb, 0xa4 => 0x64d8,
+    0xa5 => 0x64c2, 0xa6 => 0x64f1, 0xa7 => 0x64e7, 0xa8 => 0x8209,
+    0xa9 => 0x64e0, 0xaa => 0x64e1, 0xab => 0x62ac, 0xac => 0x64e3,
+    0xad => 0x64ef, 0xae => 0x652c, 0xaf => 0x64f6, 0xb0 => 0x64f4,
+    0xb1 => 0x64f2, 0xb2 => 0x64fa, 0xb3 => 0x6500, 0xb4 => 0x64fd,
+    0xb5 => 0x6518, 0xb6 => 0x651c, 0xb7 => 0x6505, 0xb8 => 0x6524,
+    0xb9 => 0x6523, 0xba => 0x652b, 0xbb => 0x6534, 0xbc => 0x6535,
+    0xbd => 0x6537, 0xbe => 0x6536, 0xbf => 0x6538, 0xc0 => 0x754b,
+    0xc1 => 0x6548, 0xc2 => 0x6556, 0xc3 => 0x6555, 0xc4 => 0x654d,
+    0xc5 => 0x6558, 0xc6 => 0x655e, 0xc7 => 0x655d, 0xc8 => 0x6572,
+    0xc9 => 0x6578, 0xca => 0x6582, 0xcb => 0x6583, 0xcc => 0x8b8a,
+    0xcd => 0x659b, 0xce => 0x659f, 0xcf => 0x65ab, 0xd0 => 0x65b7,
+    0xd1 => 0x65c3, 0xd2 => 0x65c6, 0xd3 => 0x65c1, 0xd4 => 0x65c4,
+    0xd5 => 0x65cc, 0xd6 => 0x65d2, 0xd7 => 0x65db, 0xd8 => 0x65d9,
+    0xd9 => 0x65e0, 0xda => 0x65e1, 0xdb => 0x65f1, 0xdc => 0x6772,
+    0xdd => 0x660a, 0xde => 0x6603, 0xdf => 0x65fb, 0xe0 => 0x6773,
+    0xe1 => 0x6635, 0xe2 => 0x6636, 0xe3 => 0x6634, 0xe4 => 0x661c,
+    0xe5 => 0x664f, 0xe6 => 0x6644, 0xe7 => 0x6649, 0xe8 => 0x6641,
+    0xe9 => 0x665e, 0xea => 0x665d, 0xeb => 0x6664, 0xec => 0x6667,
+    0xed => 0x6668, 0xee => 0x665f, 0xef => 0x6662, 0xf0 => 0x6670,
+    0xf1 => 0x6683, 0xf2 => 0x6688, 0xf3 => 0x668e, 0xf4 => 0x6689,
+    0xf5 => 0x6684, 0xf6 => 0x6698, 0xf7 => 0x669d, 0xf8 => 0x66c1,
+    0xf9 => 0x66b9, 0xfa => 0x66c9, 0xfb => 0x66be, 0xfc => 0x66bc,
+  },
+  0x9e => {
+    0x40 => 0x66c4, 0x41 => 0x66b8, 0x42 => 0x66d6, 0x43 => 0x66da,
+    0x44 => 0x66e0, 0x45 => 0x663f, 0x46 => 0x66e6, 0x47 => 0x66e9,
+    0x48 => 0x66f0, 0x49 => 0x66f5, 0x4a => 0x66f7, 0x4b => 0x670f,
+    0x4c => 0x6716, 0x4d => 0x671e, 0x4e => 0x6726, 0x4f => 0x6727,
+    0x50 => 0x9738, 0x51 => 0x672e, 0x52 => 0x673f, 0x53 => 0x6736,
+    0x54 => 0x6741, 0x55 => 0x6738, 0x56 => 0x6737, 0x57 => 0x6746,
+    0x58 => 0x675e, 0x59 => 0x6760, 0x5a => 0x6759, 0x5b => 0x6763,
+    0x5c => 0x6764, 0x5d => 0x6789, 0x5e => 0x6770, 0x5f => 0x67a9,
+    0x60 => 0x677c, 0x61 => 0x676a, 0x62 => 0x678c, 0x63 => 0x678b,
+    0x64 => 0x67a6, 0x65 => 0x67a1, 0x66 => 0x6785, 0x67 => 0x67b7,
+    0x68 => 0x67ef, 0x69 => 0x67b4, 0x6a => 0x67ec, 0x6b => 0x67b3,
+    0x6c => 0x67e9, 0x6d => 0x67b8, 0x6e => 0x67e4, 0x6f => 0x67de,
+    0x70 => 0x67dd, 0x71 => 0x67e2, 0x72 => 0x67ee, 0x73 => 0x67b9,
+    0x74 => 0x67ce, 0x75 => 0x67c6, 0x76 => 0x67e7, 0x77 => 0x6a9c,
+    0x78 => 0x681e, 0x79 => 0x6846, 0x7a => 0x6829, 0x7b => 0x6840,
+    0x7c => 0x684d, 0x7d => 0x6832, 0x7e => 0x684e, 0x80 => 0x68b3,
+    0x81 => 0x682b, 0x82 => 0x6859, 0x83 => 0x6863, 0x84 => 0x6877,
+    0x85 => 0x687f, 0x86 => 0x689f, 0x87 => 0x688f, 0x88 => 0x68ad,
+    0x89 => 0x6894, 0x8a => 0x689d, 0x8b => 0x689b, 0x8c => 0x6883,
+    0x8d => 0x6aae, 0x8e => 0x68b9, 0x8f => 0x6874, 0x90 => 0x68b5,
+    0x91 => 0x68a0, 0x92 => 0x68ba, 0x93 => 0x690f, 0x94 => 0x688d,
+    0x95 => 0x687e, 0x96 => 0x6901, 0x97 => 0x68ca, 0x98 => 0x6908,
+    0x99 => 0x68d8, 0x9a => 0x6922, 0x9b => 0x6926, 0x9c => 0x68e1,
+    0x9d => 0x690c, 0x9e => 0x68cd, 0x9f => 0x68d4, 0xa0 => 0x68e7,
+    0xa1 => 0x68d5, 0xa2 => 0x6936, 0xa3 => 0x6912, 0xa4 => 0x6904,
+    0xa5 => 0x68d7, 0xa6 => 0x68e3, 0xa7 => 0x6925, 0xa8 => 0x68f9,
+    0xa9 => 0x68e0, 0xaa => 0x68ef, 0xab => 0x6928, 0xac => 0x692a,
+    0xad => 0x691a, 0xae => 0x6923, 0xaf => 0x6921, 0xb0 => 0x68c6,
+    0xb1 => 0x6979, 0xb2 => 0x6977, 0xb3 => 0x695c, 0xb4 => 0x6978,
+    0xb5 => 0x696b, 0xb6 => 0x6954, 0xb7 => 0x697e, 0xb8 => 0x696e,
+    0xb9 => 0x6939, 0xba => 0x6974, 0xbb => 0x693d, 0xbc => 0x6959,
+    0xbd => 0x6930, 0xbe => 0x6961, 0xbf => 0x695e, 0xc0 => 0x695d,
+    0xc1 => 0x6981, 0xc2 => 0x696a, 0xc3 => 0x69b2, 0xc4 => 0x69ae,
+    0xc5 => 0x69d0, 0xc6 => 0x69bf, 0xc7 => 0x69c1, 0xc8 => 0x69d3,
+    0xc9 => 0x69be, 0xca => 0x69ce, 0xcb => 0x5be8, 0xcc => 0x69ca,
+    0xcd => 0x69dd, 0xce => 0x69bb, 0xcf => 0x69c3, 0xd0 => 0x69a7,
+    0xd1 => 0x6a2e, 0xd2 => 0x6991, 0xd3 => 0x69a0, 0xd4 => 0x699c,
+    0xd5 => 0x6995, 0xd6 => 0x69b4, 0xd7 => 0x69de, 0xd8 => 0x69e8,
+    0xd9 => 0x6a02, 0xda => 0x6a1b, 0xdb => 0x69ff, 0xdc => 0x6b0a,
+    0xdd => 0x69f9, 0xde => 0x69f2, 0xdf => 0x69e7, 0xe0 => 0x6a05,
+    0xe1 => 0x69b1, 0xe2 => 0x6a1e, 0xe3 => 0x69ed, 0xe4 => 0x6a14,
+    0xe5 => 0x69eb, 0xe6 => 0x6a0a, 0xe7 => 0x6a12, 0xe8 => 0x6ac1,
+    0xe9 => 0x6a23, 0xea => 0x6a13, 0xeb => 0x6a44, 0xec => 0x6a0c,
+    0xed => 0x6a72, 0xee => 0x6a36, 0xef => 0x6a78, 0xf0 => 0x6a47,
+    0xf1 => 0x6a62, 0xf2 => 0x6a59, 0xf3 => 0x6a66, 0xf4 => 0x6a48,
+    0xf5 => 0x6a38, 0xf6 => 0x6a22, 0xf7 => 0x6a90, 0xf8 => 0x6a8d,
+    0xf9 => 0x6aa0, 0xfa => 0x6a84, 0xfb => 0x6aa2, 0xfc => 0x6aa3,
+  },
+  0x9f => {
+    0x40 => 0x6a97, 0x41 => 0x8617, 0x42 => 0x6abb, 0x43 => 0x6ac3,
+    0x44 => 0x6ac2, 0x45 => 0x6ab8, 0x46 => 0x6ab3, 0x47 => 0x6aac,
+    0x48 => 0x6ade, 0x49 => 0x6ad1, 0x4a => 0x6adf, 0x4b => 0x6aaa,
+    0x4c => 0x6ada, 0x4d => 0x6aea, 0x4e => 0x6afb, 0x4f => 0x6b05,
+    0x50 => 0x8616, 0x51 => 0x6afa, 0x52 => 0x6b12, 0x53 => 0x6b16,
+    0x54 => 0x9b31, 0x55 => 0x6b1f, 0x56 => 0x6b38, 0x57 => 0x6b37,
+    0x58 => 0x76dc, 0x59 => 0x6b39, 0x5a => 0x98ee, 0x5b => 0x6b47,
+    0x5c => 0x6b43, 0x5d => 0x6b49, 0x5e => 0x6b50, 0x5f => 0x6b59,
+    0x60 => 0x6b54, 0x61 => 0x6b5b, 0x62 => 0x6b5f, 0x63 => 0x6b61,
+    0x64 => 0x6b78, 0x65 => 0x6b79, 0x66 => 0x6b7f, 0x67 => 0x6b80,
+    0x68 => 0x6b84, 0x69 => 0x6b83, 0x6a => 0x6b8d, 0x6b => 0x6b98,
+    0x6c => 0x6b95, 0x6d => 0x6b9e, 0x6e => 0x6ba4, 0x6f => 0x6baa,
+    0x70 => 0x6bab, 0x71 => 0x6baf, 0x72 => 0x6bb2, 0x73 => 0x6bb1,
+    0x74 => 0x6bb3, 0x75 => 0x6bb7, 0x76 => 0x6bbc, 0x77 => 0x6bc6,
+    0x78 => 0x6bcb, 0x79 => 0x6bd3, 0x7a => 0x6bdf, 0x7b => 0x6bec,
+    0x7c => 0x6beb, 0x7d => 0x6bf3, 0x7e => 0x6bef, 0x80 => 0x9ebe,
+    0x81 => 0x6c08, 0x82 => 0x6c13, 0x83 => 0x6c14, 0x84 => 0x6c1b,
+    0x85 => 0x6c24, 0x86 => 0x6c23, 0x87 => 0x6c5e, 0x88 => 0x6c55,
+    0x89 => 0x6c62, 0x8a => 0x6c6a, 0x8b => 0x6c82, 0x8c => 0x6c8d,
+    0x8d => 0x6c9a, 0x8e => 0x6c81, 0x8f => 0x6c9b, 0x90 => 0x6c7e,
+    0x91 => 0x6c68, 0x92 => 0x6c73, 0x93 => 0x6c92, 0x94 => 0x6c90,
+    0x95 => 0x6cc4, 0x96 => 0x6cf1, 0x97 => 0x6cd3, 0x98 => 0x6cbd,
+    0x99 => 0x6cd7, 0x9a => 0x6cc5, 0x9b => 0x6cdd, 0x9c => 0x6cae,
+    0x9d => 0x6cb1, 0x9e => 0x6cbe, 0x9f => 0x6cba, 0xa0 => 0x6cdb,
+    0xa1 => 0x6cef, 0xa2 => 0x6cd9, 0xa3 => 0x6cea, 0xa4 => 0x6d1f,
+    0xa5 => 0x884d, 0xa6 => 0x6d36, 0xa7 => 0x6d2b, 0xa8 => 0x6d3d,
+    0xa9 => 0x6d38, 0xaa => 0x6d19, 0xab => 0x6d35, 0xac => 0x6d33,
+    0xad => 0x6d12, 0xae => 0x6d0c, 0xaf => 0x6d63, 0xb0 => 0x6d93,
+    0xb1 => 0x6d64, 0xb2 => 0x6d5a, 0xb3 => 0x6d79, 0xb4 => 0x6d59,
+    0xb5 => 0x6d8e, 0xb6 => 0x6d95, 0xb7 => 0x6fe4, 0xb8 => 0x6d85,
+    0xb9 => 0x6df9, 0xba => 0x6e15, 0xbb => 0x6e0a, 0xbc => 0x6db5,
+    0xbd => 0x6dc7, 0xbe => 0x6de6, 0xbf => 0x6db8, 0xc0 => 0x6dc6,
+    0xc1 => 0x6dec, 0xc2 => 0x6dde, 0xc3 => 0x6dcc, 0xc4 => 0x6de8,
+    0xc5 => 0x6dd2, 0xc6 => 0x6dc5, 0xc7 => 0x6dfa, 0xc8 => 0x6dd9,
+    0xc9 => 0x6de4, 0xca => 0x6dd5, 0xcb => 0x6dea, 0xcc => 0x6dee,
+    0xcd => 0x6e2d, 0xce => 0x6e6e, 0xcf => 0x6e2e, 0xd0 => 0x6e19,
+    0xd1 => 0x6e72, 0xd2 => 0x6e5f, 0xd3 => 0x6e3e, 0xd4 => 0x6e23,
+    0xd5 => 0x6e6b, 0xd6 => 0x6e2b, 0xd7 => 0x6e76, 0xd8 => 0x6e4d,
+    0xd9 => 0x6e1f, 0xda => 0x6e43, 0xdb => 0x6e3a, 0xdc => 0x6e4e,
+    0xdd => 0x6e24, 0xde => 0x6eff, 0xdf => 0x6e1d, 0xe0 => 0x6e38,
+    0xe1 => 0x6e82, 0xe2 => 0x6eaa, 0xe3 => 0x6e98, 0xe4 => 0x6ec9,
+    0xe5 => 0x6eb7, 0xe6 => 0x6ed3, 0xe7 => 0x6ebd, 0xe8 => 0x6eaf,
+    0xe9 => 0x6ec4, 0xea => 0x6eb2, 0xeb => 0x6ed4, 0xec => 0x6ed5,
+    0xed => 0x6e8f, 0xee => 0x6ea5, 0xef => 0x6ec2, 0xf0 => 0x6e9f,
+    0xf1 => 0x6f41, 0xf2 => 0x6f11, 0xf3 => 0x704c, 0xf4 => 0x6eec,
+    0xf5 => 0x6ef8, 0xf6 => 0x6efe, 0xf7 => 0x6f3f, 0xf8 => 0x6ef2,
+    0xf9 => 0x6f31, 0xfa => 0x6eef, 0xfb => 0x6f32, 0xfc => 0x6ecc,
+  },
+  0xe0 => {
+    0x40 => 0x6f3e, 0x41 => 0x6f13, 0x42 => 0x6ef7, 0x43 => 0x6f86,
+    0x44 => 0x6f7a, 0x45 => 0x6f78, 0x46 => 0x6f81, 0x47 => 0x6f80,
+    0x48 => 0x6f6f, 0x49 => 0x6f5b, 0x4a => 0x6ff3, 0x4b => 0x6f6d,
+    0x4c => 0x6f82, 0x4d => 0x6f7c, 0x4e => 0x6f58, 0x4f => 0x6f8e,
+    0x50 => 0x6f91, 0x51 => 0x6fc2, 0x52 => 0x6f66, 0x53 => 0x6fb3,
+    0x54 => 0x6fa3, 0x55 => 0x6fa1, 0x56 => 0x6fa4, 0x57 => 0x6fb9,
+    0x58 => 0x6fc6, 0x59 => 0x6faa, 0x5a => 0x6fdf, 0x5b => 0x6fd5,
+    0x5c => 0x6fec, 0x5d => 0x6fd4, 0x5e => 0x6fd8, 0x5f => 0x6ff1,
+    0x60 => 0x6fee, 0x61 => 0x6fdb, 0x62 => 0x7009, 0x63 => 0x700b,
+    0x64 => 0x6ffa, 0x65 => 0x7011, 0x66 => 0x7001, 0x67 => 0x700f,
+    0x68 => 0x6ffe, 0x69 => 0x701b, 0x6a => 0x701a, 0x6b => 0x6f74,
+    0x6c => 0x701d, 0x6d => 0x7018, 0x6e => 0x701f, 0x6f => 0x7030,
+    0x70 => 0x703e, 0x71 => 0x7032, 0x72 => 0x7051, 0x73 => 0x7063,
+    0x74 => 0x7099, 0x75 => 0x7092, 0x76 => 0x70af, 0x77 => 0x70f1,
+    0x78 => 0x70ac, 0x79 => 0x70b8, 0x7a => 0x70b3, 0x7b => 0x70ae,
+    0x7c => 0x70df, 0x7d => 0x70cb, 0x7e => 0x70dd, 0x80 => 0x70d9,
+    0x81 => 0x7109, 0x82 => 0x70fd, 0x83 => 0x711c, 0x84 => 0x7119,
+    0x85 => 0x7165, 0x86 => 0x7155, 0x87 => 0x7188, 0x88 => 0x7166,
+    0x89 => 0x7162, 0x8a => 0x714c, 0x8b => 0x7156, 0x8c => 0x716c,
+    0x8d => 0x718f, 0x8e => 0x71fb, 0x8f => 0x7184, 0x90 => 0x7195,
+    0x91 => 0x71a8, 0x92 => 0x71ac, 0x93 => 0x71d7, 0x94 => 0x71b9,
+    0x95 => 0x71be, 0x96 => 0x71d2, 0x97 => 0x71c9, 0x98 => 0x71d4,
+    0x99 => 0x71ce, 0x9a => 0x71e0, 0x9b => 0x71ec, 0x9c => 0x71e7,
+    0x9d => 0x71f5, 0x9e => 0x71fc, 0x9f => 0x71f9, 0xa0 => 0x71ff,
+    0xa1 => 0x720d, 0xa2 => 0x7210, 0xa3 => 0x721b, 0xa4 => 0x7228,
+    0xa5 => 0x722d, 0xa6 => 0x722c, 0xa7 => 0x7230, 0xa8 => 0x7232,
+    0xa9 => 0x723b, 0xaa => 0x723c, 0xab => 0x723f, 0xac => 0x7240,
+    0xad => 0x7246, 0xae => 0x724b, 0xaf => 0x7258, 0xb0 => 0x7274,
+    0xb1 => 0x727e, 0xb2 => 0x7282, 0xb3 => 0x7281, 0xb4 => 0x7287,
+    0xb5 => 0x7292, 0xb6 => 0x7296, 0xb7 => 0x72a2, 0xb8 => 0x72a7,
+    0xb9 => 0x72b9, 0xba => 0x72b2, 0xbb => 0x72c3, 0xbc => 0x72c6,
+    0xbd => 0x72c4, 0xbe => 0x72ce, 0xbf => 0x72d2, 0xc0 => 0x72e2,
+    0xc1 => 0x72e0, 0xc2 => 0x72e1, 0xc3 => 0x72f9, 0xc4 => 0x72f7,
+    0xc5 => 0x500f, 0xc6 => 0x7317, 0xc7 => 0x730a, 0xc8 => 0x731c,
+    0xc9 => 0x7316, 0xca => 0x731d, 0xcb => 0x7334, 0xcc => 0x732f,
+    0xcd => 0x7329, 0xce => 0x7325, 0xcf => 0x733e, 0xd0 => 0x734e,
+    0xd1 => 0x734f, 0xd2 => 0x9ed8, 0xd3 => 0x7357, 0xd4 => 0x736a,
+    0xd5 => 0x7368, 0xd6 => 0x7370, 0xd7 => 0x7378, 0xd8 => 0x7375,
+    0xd9 => 0x737b, 0xda => 0x737a, 0xdb => 0x73c8, 0xdc => 0x73b3,
+    0xdd => 0x73ce, 0xde => 0x73bb, 0xdf => 0x73c0, 0xe0 => 0x73e5,
+    0xe1 => 0x73ee, 0xe2 => 0x73de, 0xe3 => 0x74a2, 0xe4 => 0x7405,
+    0xe5 => 0x746f, 0xe6 => 0x7425, 0xe7 => 0x73f8, 0xe8 => 0x7432,
+    0xe9 => 0x743a, 0xea => 0x7455, 0xeb => 0x743f, 0xec => 0x745f,
+    0xed => 0x7459, 0xee => 0x7441, 0xef => 0x745c, 0xf0 => 0x7469,
+    0xf1 => 0x7470, 0xf2 => 0x7463, 0xf3 => 0x746a, 0xf4 => 0x7476,
+    0xf5 => 0x747e, 0xf6 => 0x748b, 0xf7 => 0x749e, 0xf8 => 0x74a7,
+    0xf9 => 0x74ca, 0xfa => 0x74cf, 0xfb => 0x74d4, 0xfc => 0x73f1,
+  },
+  0xe1 => {
+    0x40 => 0x74e0, 0x41 => 0x74e3, 0x42 => 0x74e7, 0x43 => 0x74e9,
+    0x44 => 0x74ee, 0x45 => 0x74f2, 0x46 => 0x74f0, 0x47 => 0x74f1,
+    0x48 => 0x74f8, 0x49 => 0x74f7, 0x4a => 0x7504, 0x4b => 0x7503,
+    0x4c => 0x7505, 0x4d => 0x750c, 0x4e => 0x750e, 0x4f => 0x750d,
+    0x50 => 0x7515, 0x51 => 0x7513, 0x52 => 0x751e, 0x53 => 0x7526,
+    0x54 => 0x752c, 0x55 => 0x753c, 0x56 => 0x7544, 0x57 => 0x754d,
+    0x58 => 0x754a, 0x59 => 0x7549, 0x5a => 0x755b, 0x5b => 0x7546,
+    0x5c => 0x755a, 0x5d => 0x7569, 0x5e => 0x7564, 0x5f => 0x7567,
+    0x60 => 0x756b, 0x61 => 0x756d, 0x62 => 0x7578, 0x63 => 0x7576,
+    0x64 => 0x7586, 0x65 => 0x7587, 0x66 => 0x7574, 0x67 => 0x758a,
+    0x68 => 0x7589, 0x69 => 0x7582, 0x6a => 0x7594, 0x6b => 0x759a,
+    0x6c => 0x759d, 0x6d => 0x75a5, 0x6e => 0x75a3, 0x6f => 0x75c2,
+    0x70 => 0x75b3, 0x71 => 0x75c3, 0x72 => 0x75b5, 0x73 => 0x75bd,
+    0x74 => 0x75b8, 0x75 => 0x75bc, 0x76 => 0x75b1, 0x77 => 0x75cd,
+    0x78 => 0x75ca, 0x79 => 0x75d2, 0x7a => 0x75d9, 0x7b => 0x75e3,
+    0x7c => 0x75de, 0x7d => 0x75fe, 0x7e => 0x75ff, 0x80 => 0x75fc,
+    0x81 => 0x7601, 0x82 => 0x75f0, 0x83 => 0x75fa, 0x84 => 0x75f2,
+    0x85 => 0x75f3, 0x86 => 0x760b, 0x87 => 0x760d, 0x88 => 0x7609,
+    0x89 => 0x761f, 0x8a => 0x7627, 0x8b => 0x7620, 0x8c => 0x7621,
+    0x8d => 0x7622, 0x8e => 0x7624, 0x8f => 0x7634, 0x90 => 0x7630,
+    0x91 => 0x763b, 0x92 => 0x7647, 0x93 => 0x7648, 0x94 => 0x7646,
+    0x95 => 0x765c, 0x96 => 0x7658, 0x97 => 0x7661, 0x98 => 0x7662,
+    0x99 => 0x7668, 0x9a => 0x7669, 0x9b => 0x766a, 0x9c => 0x7667,
+    0x9d => 0x766c, 0x9e => 0x7670, 0x9f => 0x7672, 0xa0 => 0x7676,
+    0xa1 => 0x7678, 0xa2 => 0x767c, 0xa3 => 0x7680, 0xa4 => 0x7683,
+    0xa5 => 0x7688, 0xa6 => 0x768b, 0xa7 => 0x768e, 0xa8 => 0x7696,
+    0xa9 => 0x7693, 0xaa => 0x7699, 0xab => 0x769a, 0xac => 0x76b0,
+    0xad => 0x76b4, 0xae => 0x76b8, 0xaf => 0x76b9, 0xb0 => 0x76ba,
+    0xb1 => 0x76c2, 0xb2 => 0x76cd, 0xb3 => 0x76d6, 0xb4 => 0x76d2,
+    0xb5 => 0x76de, 0xb6 => 0x76e1, 0xb7 => 0x76e5, 0xb8 => 0x76e7,
+    0xb9 => 0x76ea, 0xba => 0x862f, 0xbb => 0x76fb, 0xbc => 0x7708,
+    0xbd => 0x7707, 0xbe => 0x7704, 0xbf => 0x7729, 0xc0 => 0x7724,
+    0xc1 => 0x771e, 0xc2 => 0x7725, 0xc3 => 0x7726, 0xc4 => 0x771b,
+    0xc5 => 0x7737, 0xc6 => 0x7738, 0xc7 => 0x7747, 0xc8 => 0x775a,
+    0xc9 => 0x7768, 0xca => 0x776b, 0xcb => 0x775b, 0xcc => 0x7765,
+    0xcd => 0x777f, 0xce => 0x777e, 0xcf => 0x7779, 0xd0 => 0x778e,
+    0xd1 => 0x778b, 0xd2 => 0x7791, 0xd3 => 0x77a0, 0xd4 => 0x779e,
+    0xd5 => 0x77b0, 0xd6 => 0x77b6, 0xd7 => 0x77b9, 0xd8 => 0x77bf,
+    0xd9 => 0x77bc, 0xda => 0x77bd, 0xdb => 0x77bb, 0xdc => 0x77c7,
+    0xdd => 0x77cd, 0xde => 0x77d7, 0xdf => 0x77da, 0xe0 => 0x77dc,
+    0xe1 => 0x77e3, 0xe2 => 0x77ee, 0xe3 => 0x77fc, 0xe4 => 0x780c,
+    0xe5 => 0x7812, 0xe6 => 0x7926, 0xe7 => 0x7820, 0xe8 => 0x792a,
+    0xe9 => 0x7845, 0xea => 0x788e, 0xeb => 0x7874, 0xec => 0x7886,
+    0xed => 0x787c, 0xee => 0x789a, 0xef => 0x788c, 0xf0 => 0x78a3,
+    0xf1 => 0x78b5, 0xf2 => 0x78aa, 0xf3 => 0x78af, 0xf4 => 0x78d1,
+    0xf5 => 0x78c6, 0xf6 => 0x78cb, 0xf7 => 0x78d4, 0xf8 => 0x78be,
+    0xf9 => 0x78bc, 0xfa => 0x78c5, 0xfb => 0x78ca, 0xfc => 0x78ec,
+  },
+  0xe2 => {
+    0x40 => 0x78e7, 0x41 => 0x78da, 0x42 => 0x78fd, 0x43 => 0x78f4,
+    0x44 => 0x7907, 0x45 => 0x7912, 0x46 => 0x7911, 0x47 => 0x7919,
+    0x48 => 0x792c, 0x49 => 0x792b, 0x4a => 0x7940, 0x4b => 0x7960,
+    0x4c => 0x7957, 0x4d => 0x795f, 0x4e => 0x795a, 0x4f => 0x7955,
+    0x50 => 0x7953, 0x51 => 0x797a, 0x52 => 0x797f, 0x53 => 0x798a,
+    0x54 => 0x799d, 0x55 => 0x79a7, 0x56 => 0x9f4b, 0x57 => 0x79aa,
+    0x58 => 0x79ae, 0x59 => 0x79b3, 0x5a => 0x79b9, 0x5b => 0x79ba,
+    0x5c => 0x79c9, 0x5d => 0x79d5, 0x5e => 0x79e7, 0x5f => 0x79ec,
+    0x60 => 0x79e1, 0x61 => 0x79e3, 0x62 => 0x7a08, 0x63 => 0x7a0d,
+    0x64 => 0x7a18, 0x65 => 0x7a19, 0x66 => 0x7a20, 0x67 => 0x7a1f,
+    0x68 => 0x7980, 0x69 => 0x7a31, 0x6a => 0x7a3b, 0x6b => 0x7a3e,
+    0x6c => 0x7a37, 0x6d => 0x7a43, 0x6e => 0x7a57, 0x6f => 0x7a49,
+    0x70 => 0x7a61, 0x71 => 0x7a62, 0x72 => 0x7a69, 0x73 => 0x9f9d,
+    0x74 => 0x7a70, 0x75 => 0x7a79, 0x76 => 0x7a7d, 0x77 => 0x7a88,
+    0x78 => 0x7a97, 0x79 => 0x7a95, 0x7a => 0x7a98, 0x7b => 0x7a96,
+    0x7c => 0x7aa9, 0x7d => 0x7ac8, 0x7e => 0x7ab0, 0x80 => 0x7ab6,
+    0x81 => 0x7ac5, 0x82 => 0x7ac4, 0x83 => 0x7abf, 0x84 => 0x9083,
+    0x85 => 0x7ac7, 0x86 => 0x7aca, 0x87 => 0x7acd, 0x88 => 0x7acf,
+    0x89 => 0x7ad5, 0x8a => 0x7ad3, 0x8b => 0x7ad9, 0x8c => 0x7ada,
+    0x8d => 0x7add, 0x8e => 0x7ae1, 0x8f => 0x7ae2, 0x90 => 0x7ae6,
+    0x91 => 0x7aed, 0x92 => 0x7af0, 0x93 => 0x7b02, 0x94 => 0x7b0f,
+    0x95 => 0x7b0a, 0x96 => 0x7b06, 0x97 => 0x7b33, 0x98 => 0x7b18,
+    0x99 => 0x7b19, 0x9a => 0x7b1e, 0x9b => 0x7b35, 0x9c => 0x7b28,
+    0x9d => 0x7b36, 0x9e => 0x7b50, 0x9f => 0x7b7a, 0xa0 => 0x7b04,
+    0xa1 => 0x7b4d, 0xa2 => 0x7b0b, 0xa3 => 0x7b4c, 0xa4 => 0x7b45,
+    0xa5 => 0x7b75, 0xa6 => 0x7b65, 0xa7 => 0x7b74, 0xa8 => 0x7b67,
+    0xa9 => 0x7b70, 0xaa => 0x7b71, 0xab => 0x7b6c, 0xac => 0x7b6e,
+    0xad => 0x7b9d, 0xae => 0x7b98, 0xaf => 0x7b9f, 0xb0 => 0x7b8d,
+    0xb1 => 0x7b9c, 0xb2 => 0x7b9a, 0xb3 => 0x7b8b, 0xb4 => 0x7b92,
+    0xb5 => 0x7b8f, 0xb6 => 0x7b5d, 0xb7 => 0x7b99, 0xb8 => 0x7bcb,
+    0xb9 => 0x7bc1, 0xba => 0x7bcc, 0xbb => 0x7bcf, 0xbc => 0x7bb4,
+    0xbd => 0x7bc6, 0xbe => 0x7bdd, 0xbf => 0x7be9, 0xc0 => 0x7c11,
+    0xc1 => 0x7c14, 0xc2 => 0x7be6, 0xc3 => 0x7be5, 0xc4 => 0x7c60,
+    0xc5 => 0x7c00, 0xc6 => 0x7c07, 0xc7 => 0x7c13, 0xc8 => 0x7bf3,
+    0xc9 => 0x7bf7, 0xca => 0x7c17, 0xcb => 0x7c0d, 0xcc => 0x7bf6,
+    0xcd => 0x7c23, 0xce => 0x7c27, 0xcf => 0x7c2a, 0xd0 => 0x7c1f,
+    0xd1 => 0x7c37, 0xd2 => 0x7c2b, 0xd3 => 0x7c3d, 0xd4 => 0x7c4c,
+    0xd5 => 0x7c43, 0xd6 => 0x7c54, 0xd7 => 0x7c4f, 0xd8 => 0x7c40,
+    0xd9 => 0x7c50, 0xda => 0x7c58, 0xdb => 0x7c5f, 0xdc => 0x7c64,
+    0xdd => 0x7c56, 0xde => 0x7c65, 0xdf => 0x7c6c, 0xe0 => 0x7c75,
+    0xe1 => 0x7c83, 0xe2 => 0x7c90, 0xe3 => 0x7ca4, 0xe4 => 0x7cad,
+    0xe5 => 0x7ca2, 0xe6 => 0x7cab, 0xe7 => 0x7ca1, 0xe8 => 0x7ca8,
+    0xe9 => 0x7cb3, 0xea => 0x7cb2, 0xeb => 0x7cb1, 0xec => 0x7cae,
+    0xed => 0x7cb9, 0xee => 0x7cbd, 0xef => 0x7cc0, 0xf0 => 0x7cc5,
+    0xf1 => 0x7cc2, 0xf2 => 0x7cd8, 0xf3 => 0x7cd2, 0xf4 => 0x7cdc,
+    0xf5 => 0x7ce2, 0xf6 => 0x9b3b, 0xf7 => 0x7cef, 0xf8 => 0x7cf2,
+    0xf9 => 0x7cf4, 0xfa => 0x7cf6, 0xfb => 0x7cfa, 0xfc => 0x7d06,
+  },
+  0xe3 => {
+    0x40 => 0x7d02, 0x41 => 0x7d1c, 0x42 => 0x7d15, 0x43 => 0x7d0a,
+    0x44 => 0x7d45, 0x45 => 0x7d4b, 0x46 => 0x7d2e, 0x47 => 0x7d32,
+    0x48 => 0x7d3f, 0x49 => 0x7d35, 0x4a => 0x7d46, 0x4b => 0x7d73,
+    0x4c => 0x7d56, 0x4d => 0x7d4e, 0x4e => 0x7d72, 0x4f => 0x7d68,
+    0x50 => 0x7d6e, 0x51 => 0x7d4f, 0x52 => 0x7d63, 0x53 => 0x7d93,
+    0x54 => 0x7d89, 0x55 => 0x7d5b, 0x56 => 0x7d8f, 0x57 => 0x7d7d,
+    0x58 => 0x7d9b, 0x59 => 0x7dba, 0x5a => 0x7dae, 0x5b => 0x7da3,
+    0x5c => 0x7db5, 0x5d => 0x7dc7, 0x5e => 0x7dbd, 0x5f => 0x7dab,
+    0x60 => 0x7e3d, 0x61 => 0x7da2, 0x62 => 0x7daf, 0x63 => 0x7ddc,
+    0x64 => 0x7db8, 0x65 => 0x7d9f, 0x66 => 0x7db0, 0x67 => 0x7dd8,
+    0x68 => 0x7ddd, 0x69 => 0x7de4, 0x6a => 0x7dde, 0x6b => 0x7dfb,
+    0x6c => 0x7df2, 0x6d => 0x7de1, 0x6e => 0x7e05, 0x6f => 0x7e0a,
+    0x70 => 0x7e23, 0x71 => 0x7e21, 0x72 => 0x7e12, 0x73 => 0x7e31,
+    0x74 => 0x7e1f, 0x75 => 0x7e09, 0x76 => 0x7e0b, 0x77 => 0x7e22,
+    0x78 => 0x7e46, 0x79 => 0x7e66, 0x7a => 0x7e3b, 0x7b => 0x7e35,
+    0x7c => 0x7e39, 0x7d => 0x7e43, 0x7e => 0x7e37, 0x80 => 0x7e32,
+    0x81 => 0x7e3a, 0x82 => 0x7e67, 0x83 => 0x7e5d, 0x84 => 0x7e56,
+    0x85 => 0x7e5e, 0x86 => 0x7e59, 0x87 => 0x7e5a, 0x88 => 0x7e79,
+    0x89 => 0x7e6a, 0x8a => 0x7e69, 0x8b => 0x7e7c, 0x8c => 0x7e7b,
+    0x8d => 0x7e83, 0x8e => 0x7dd5, 0x8f => 0x7e7d, 0x90 => 0x8fae,
+    0x91 => 0x7e7f, 0x92 => 0x7e88, 0x93 => 0x7e89, 0x94 => 0x7e8c,
+    0x95 => 0x7e92, 0x96 => 0x7e90, 0x97 => 0x7e93, 0x98 => 0x7e94,
+    0x99 => 0x7e96, 0x9a => 0x7e8e, 0x9b => 0x7e9b, 0x9c => 0x7e9c,
+    0x9d => 0x7f38, 0x9e => 0x7f3a, 0x9f => 0x7f45, 0xa0 => 0x7f4c,
+    0xa1 => 0x7f4d, 0xa2 => 0x7f4e, 0xa3 => 0x7f50, 0xa4 => 0x7f51,
+    0xa5 => 0x7f55, 0xa6 => 0x7f54, 0xa7 => 0x7f58, 0xa8 => 0x7f5f,
+    0xa9 => 0x7f60, 0xaa => 0x7f68, 0xab => 0x7f69, 0xac => 0x7f67,
+    0xad => 0x7f78, 0xae => 0x7f82, 0xaf => 0x7f86, 0xb0 => 0x7f83,
+    0xb1 => 0x7f88, 0xb2 => 0x7f87, 0xb3 => 0x7f8c, 0xb4 => 0x7f94,
+    0xb5 => 0x7f9e, 0xb6 => 0x7f9d, 0xb7 => 0x7f9a, 0xb8 => 0x7fa3,
+    0xb9 => 0x7faf, 0xba => 0x7fb2, 0xbb => 0x7fb9, 0xbc => 0x7fae,
+    0xbd => 0x7fb6, 0xbe => 0x7fb8, 0xbf => 0x8b71, 0xc0 => 0x7fc5,
+    0xc1 => 0x7fc6, 0xc2 => 0x7fca, 0xc3 => 0x7fd5, 0xc4 => 0x7fd4,
+    0xc5 => 0x7fe1, 0xc6 => 0x7fe6, 0xc7 => 0x7fe9, 0xc8 => 0x7ff3,
+    0xc9 => 0x7ff9, 0xca => 0x98dc, 0xcb => 0x8006, 0xcc => 0x8004,
+    0xcd => 0x800b, 0xce => 0x8012, 0xcf => 0x8018, 0xd0 => 0x8019,
+    0xd1 => 0x801c, 0xd2 => 0x8021, 0xd3 => 0x8028, 0xd4 => 0x803f,
+    0xd5 => 0x803b, 0xd6 => 0x804a, 0xd7 => 0x8046, 0xd8 => 0x8052,
+    0xd9 => 0x8058, 0xda => 0x805a, 0xdb => 0x805f, 0xdc => 0x8062,
+    0xdd => 0x8068, 0xde => 0x8073, 0xdf => 0x8072, 0xe0 => 0x8070,
+    0xe1 => 0x8076, 0xe2 => 0x8079, 0xe3 => 0x807d, 0xe4 => 0x807f,
+    0xe5 => 0x8084, 0xe6 => 0x8086, 0xe7 => 0x8085, 0xe8 => 0x809b,
+    0xe9 => 0x8093, 0xea => 0x809a, 0xeb => 0x80ad, 0xec => 0x5190,
+    0xed => 0x80ac, 0xee => 0x80db, 0xef => 0x80e5, 0xf0 => 0x80d9,
+    0xf1 => 0x80dd, 0xf2 => 0x80c4, 0xf3 => 0x80da, 0xf4 => 0x80d6,
+    0xf5 => 0x8109, 0xf6 => 0x80ef, 0xf7 => 0x80f1, 0xf8 => 0x811b,
+    0xf9 => 0x8129, 0xfa => 0x8123, 0xfb => 0x812f, 0xfc => 0x814b,
+  },
+  0xe4 => {
+    0x40 => 0x968b, 0x41 => 0x8146, 0x42 => 0x813e, 0x43 => 0x8153,
+    0x44 => 0x8151, 0x45 => 0x80fc, 0x46 => 0x8171, 0x47 => 0x816e,
+    0x48 => 0x8165, 0x49 => 0x8166, 0x4a => 0x8174, 0x4b => 0x8183,
+    0x4c => 0x8188, 0x4d => 0x818a, 0x4e => 0x8180, 0x4f => 0x8182,
+    0x50 => 0x81a0, 0x51 => 0x8195, 0x52 => 0x81a4, 0x53 => 0x81a3,
+    0x54 => 0x815f, 0x55 => 0x8193, 0x56 => 0x81a9, 0x57 => 0x81b0,
+    0x58 => 0x81b5, 0x59 => 0x81be, 0x5a => 0x81b8, 0x5b => 0x81bd,
+    0x5c => 0x81c0, 0x5d => 0x81c2, 0x5e => 0x81ba, 0x5f => 0x81c9,
+    0x60 => 0x81cd, 0x61 => 0x81d1, 0x62 => 0x81d9, 0x63 => 0x81d8,
+    0x64 => 0x81c8, 0x65 => 0x81da, 0x66 => 0x81df, 0x67 => 0x81e0,
+    0x68 => 0x81e7, 0x69 => 0x81fa, 0x6a => 0x81fb, 0x6b => 0x81fe,
+    0x6c => 0x8201, 0x6d => 0x8202, 0x6e => 0x8205, 0x6f => 0x8207,
+    0x70 => 0x820a, 0x71 => 0x820d, 0x72 => 0x8210, 0x73 => 0x8216,
+    0x74 => 0x8229, 0x75 => 0x822b, 0x76 => 0x8238, 0x77 => 0x8233,
+    0x78 => 0x8240, 0x79 => 0x8259, 0x7a => 0x8258, 0x7b => 0x825d,
+    0x7c => 0x825a, 0x7d => 0x825f, 0x7e => 0x8264, 0x80 => 0x8262,
+    0x81 => 0x8268, 0x82 => 0x826a, 0x83 => 0x826b, 0x84 => 0x822e,
+    0x85 => 0x8271, 0x86 => 0x8277, 0x87 => 0x8278, 0x88 => 0x827e,
+    0x89 => 0x828d, 0x8a => 0x8292, 0x8b => 0x82ab, 0x8c => 0x829f,
+    0x8d => 0x82bb, 0x8e => 0x82ac, 0x8f => 0x82e1, 0x90 => 0x82e3,
+    0x91 => 0x82df, 0x92 => 0x82d2, 0x93 => 0x82f4, 0x94 => 0x82f3,
+    0x95 => 0x82fa, 0x96 => 0x8393, 0x97 => 0x8303, 0x98 => 0x82fb,
+    0x99 => 0x82f9, 0x9a => 0x82de, 0x9b => 0x8306, 0x9c => 0x82dc,
+    0x9d => 0x8309, 0x9e => 0x82d9, 0x9f => 0x8335, 0xa0 => 0x8334,
+    0xa1 => 0x8316, 0xa2 => 0x8332, 0xa3 => 0x8331, 0xa4 => 0x8340,
+    0xa5 => 0x8339, 0xa6 => 0x8350, 0xa7 => 0x8345, 0xa8 => 0x832f,
+    0xa9 => 0x832b, 0xaa => 0x8317, 0xab => 0x8318, 0xac => 0x8385,
+    0xad => 0x839a, 0xae => 0x83aa, 0xaf => 0x839f, 0xb0 => 0x83a2,
+    0xb1 => 0x8396, 0xb2 => 0x8323, 0xb3 => 0x838e, 0xb4 => 0x8387,
+    0xb5 => 0x838a, 0xb6 => 0x837c, 0xb7 => 0x83b5, 0xb8 => 0x8373,
+    0xb9 => 0x8375, 0xba => 0x83a0, 0xbb => 0x8389, 0xbc => 0x83a8,
+    0xbd => 0x83f4, 0xbe => 0x8413, 0xbf => 0x83eb, 0xc0 => 0x83ce,
+    0xc1 => 0x83fd, 0xc2 => 0x8403, 0xc3 => 0x83d8, 0xc4 => 0x840b,
+    0xc5 => 0x83c1, 0xc6 => 0x83f7, 0xc7 => 0x8407, 0xc8 => 0x83e0,
+    0xc9 => 0x83f2, 0xca => 0x840d, 0xcb => 0x8422, 0xcc => 0x8420,
+    0xcd => 0x83bd, 0xce => 0x8438, 0xcf => 0x8506, 0xd0 => 0x83fb,
+    0xd1 => 0x846d, 0xd2 => 0x842a, 0xd3 => 0x843c, 0xd4 => 0x855a,
+    0xd5 => 0x8484, 0xd6 => 0x8477, 0xd7 => 0x846b, 0xd8 => 0x84ad,
+    0xd9 => 0x846e, 0xda => 0x8482, 0xdb => 0x8469, 0xdc => 0x8446,
+    0xdd => 0x842c, 0xde => 0x846f, 0xdf => 0x8479, 0xe0 => 0x8435,
+    0xe1 => 0x84ca, 0xe2 => 0x8462, 0xe3 => 0x84b9, 0xe4 => 0x84bf,
+    0xe5 => 0x849f, 0xe6 => 0x84d9, 0xe7 => 0x84cd, 0xe8 => 0x84bb,
+    0xe9 => 0x84da, 0xea => 0x84d0, 0xeb => 0x84c1, 0xec => 0x84c6,
+    0xed => 0x84d6, 0xee => 0x84a1, 0xef => 0x8521, 0xf0 => 0x84ff,
+    0xf1 => 0x84f4, 0xf2 => 0x8517, 0xf3 => 0x8518, 0xf4 => 0x852c,
+    0xf5 => 0x851f, 0xf6 => 0x8515, 0xf7 => 0x8514, 0xf8 => 0x84fc,
+    0xf9 => 0x8540, 0xfa => 0x8563, 0xfb => 0x8558, 0xfc => 0x8548,
+  },
+  0xe5 => {
+    0x40 => 0x8541, 0x41 => 0x8602, 0x42 => 0x854b, 0x43 => 0x8555,
+    0x44 => 0x8580, 0x45 => 0x85a4, 0x46 => 0x8588, 0x47 => 0x8591,
+    0x48 => 0x858a, 0x49 => 0x85a8, 0x4a => 0x856d, 0x4b => 0x8594,
+    0x4c => 0x859b, 0x4d => 0x85ea, 0x4e => 0x8587, 0x4f => 0x859c,
+    0x50 => 0x8577, 0x51 => 0x857e, 0x52 => 0x8590, 0x53 => 0x85c9,
+    0x54 => 0x85ba, 0x55 => 0x85cf, 0x56 => 0x85b9, 0x57 => 0x85d0,
+    0x58 => 0x85d5, 0x59 => 0x85dd, 0x5a => 0x85e5, 0x5b => 0x85dc,
+    0x5c => 0x85f9, 0x5d => 0x860a, 0x5e => 0x8613, 0x5f => 0x860b,
+    0x60 => 0x85fe, 0x61 => 0x85fa, 0x62 => 0x8606, 0x63 => 0x8622,
+    0x64 => 0x861a, 0x65 => 0x8630, 0x66 => 0x863f, 0x67 => 0x864d,
+    0x68 => 0x4e55, 0x69 => 0x8654, 0x6a => 0x865f, 0x6b => 0x8667,
+    0x6c => 0x8671, 0x6d => 0x8693, 0x6e => 0x86a3, 0x6f => 0x86a9,
+    0x70 => 0x86aa, 0x71 => 0x868b, 0x72 => 0x868c, 0x73 => 0x86b6,
+    0x74 => 0x86af, 0x75 => 0x86c4, 0x76 => 0x86c6, 0x77 => 0x86b0,
+    0x78 => 0x86c9, 0x79 => 0x8823, 0x7a => 0x86ab, 0x7b => 0x86d4,
+    0x7c => 0x86de, 0x7d => 0x86e9, 0x7e => 0x86ec, 0x80 => 0x86df,
+    0x81 => 0x86db, 0x82 => 0x86ef, 0x83 => 0x8712, 0x84 => 0x8706,
+    0x85 => 0x8708, 0x86 => 0x8700, 0x87 => 0x8703, 0x88 => 0x86fb,
+    0x89 => 0x8711, 0x8a => 0x8709, 0x8b => 0x870d, 0x8c => 0x86f9,
+    0x8d => 0x870a, 0x8e => 0x8734, 0x8f => 0x873f, 0x90 => 0x8737,
+    0x91 => 0x873b, 0x92 => 0x8725, 0x93 => 0x8729, 0x94 => 0x871a,
+    0x95 => 0x8760, 0x96 => 0x875f, 0x97 => 0x8778, 0x98 => 0x874c,
+    0x99 => 0x874e, 0x9a => 0x8774, 0x9b => 0x8757, 0x9c => 0x8768,
+    0x9d => 0x876e, 0x9e => 0x8759, 0x9f => 0x8753, 0xa0 => 0x8763,
+    0xa1 => 0x876a, 0xa2 => 0x8805, 0xa3 => 0x87a2, 0xa4 => 0x879f,
+    0xa5 => 0x8782, 0xa6 => 0x87af, 0xa7 => 0x87cb, 0xa8 => 0x87bd,
+    0xa9 => 0x87c0, 0xaa => 0x87d0, 0xab => 0x96d6, 0xac => 0x87ab,
+    0xad => 0x87c4, 0xae => 0x87b3, 0xaf => 0x87c7, 0xb0 => 0x87c6,
+    0xb1 => 0x87bb, 0xb2 => 0x87ef, 0xb3 => 0x87f2, 0xb4 => 0x87e0,
+    0xb5 => 0x880f, 0xb6 => 0x880d, 0xb7 => 0x87fe, 0xb8 => 0x87f6,
+    0xb9 => 0x87f7, 0xba => 0x880e, 0xbb => 0x87d2, 0xbc => 0x8811,
+    0xbd => 0x8816, 0xbe => 0x8815, 0xbf => 0x8822, 0xc0 => 0x8821,
+    0xc1 => 0x8831, 0xc2 => 0x8836, 0xc3 => 0x8839, 0xc4 => 0x8827,
+    0xc5 => 0x883b, 0xc6 => 0x8844, 0xc7 => 0x8842, 0xc8 => 0x8852,
+    0xc9 => 0x8859, 0xca => 0x885e, 0xcb => 0x8862, 0xcc => 0x886b,
+    0xcd => 0x8881, 0xce => 0x887e, 0xcf => 0x889e, 0xd0 => 0x8875,
+    0xd1 => 0x887d, 0xd2 => 0x88b5, 0xd3 => 0x8872, 0xd4 => 0x8882,
+    0xd5 => 0x8897, 0xd6 => 0x8892, 0xd7 => 0x88ae, 0xd8 => 0x8899,
+    0xd9 => 0x88a2, 0xda => 0x888d, 0xdb => 0x88a4, 0xdc => 0x88b0,
+    0xdd => 0x88bf, 0xde => 0x88b1, 0xdf => 0x88c3, 0xe0 => 0x88c4,
+    0xe1 => 0x88d4, 0xe2 => 0x88d8, 0xe3 => 0x88d9, 0xe4 => 0x88dd,
+    0xe5 => 0x88f9, 0xe6 => 0x8902, 0xe7 => 0x88fc, 0xe8 => 0x88f4,
+    0xe9 => 0x88e8, 0xea => 0x88f2, 0xeb => 0x8904, 0xec => 0x890c,
+    0xed => 0x890a, 0xee => 0x8913, 0xef => 0x8943, 0xf0 => 0x891e,
+    0xf1 => 0x8925, 0xf2 => 0x892a, 0xf3 => 0x892b, 0xf4 => 0x8941,
+    0xf5 => 0x8944, 0xf6 => 0x893b, 0xf7 => 0x8936, 0xf8 => 0x8938,
+    0xf9 => 0x894c, 0xfa => 0x891d, 0xfb => 0x8960, 0xfc => 0x895e,
+  },
+  0xe6 => {
+    0x40 => 0x8966, 0x41 => 0x8964, 0x42 => 0x896d, 0x43 => 0x896a,
+    0x44 => 0x896f, 0x45 => 0x8974, 0x46 => 0x8977, 0x47 => 0x897e,
+    0x48 => 0x8983, 0x49 => 0x8988, 0x4a => 0x898a, 0x4b => 0x8993,
+    0x4c => 0x8998, 0x4d => 0x89a1, 0x4e => 0x89a9, 0x4f => 0x89a6,
+    0x50 => 0x89ac, 0x51 => 0x89af, 0x52 => 0x89b2, 0x53 => 0x89ba,
+    0x54 => 0x89bd, 0x55 => 0x89bf, 0x56 => 0x89c0, 0x57 => 0x89da,
+    0x58 => 0x89dc, 0x59 => 0x89dd, 0x5a => 0x89e7, 0x5b => 0x89f4,
+    0x5c => 0x89f8, 0x5d => 0x8a03, 0x5e => 0x8a16, 0x5f => 0x8a10,
+    0x60 => 0x8a0c, 0x61 => 0x8a1b, 0x62 => 0x8a1d, 0x63 => 0x8a25,
+    0x64 => 0x8a36, 0x65 => 0x8a41, 0x66 => 0x8a5b, 0x67 => 0x8a52,
+    0x68 => 0x8a46, 0x69 => 0x8a48, 0x6a => 0x8a7c, 0x6b => 0x8a6d,
+    0x6c => 0x8a6c, 0x6d => 0x8a62, 0x6e => 0x8a85, 0x6f => 0x8a82,
+    0x70 => 0x8a84, 0x71 => 0x8aa8, 0x72 => 0x8aa1, 0x73 => 0x8a91,
+    0x74 => 0x8aa5, 0x75 => 0x8aa6, 0x76 => 0x8a9a, 0x77 => 0x8aa3,
+    0x78 => 0x8ac4, 0x79 => 0x8acd, 0x7a => 0x8ac2, 0x7b => 0x8ada,
+    0x7c => 0x8aeb, 0x7d => 0x8af3, 0x7e => 0x8ae7, 0x80 => 0x8ae4,
+    0x81 => 0x8af1, 0x82 => 0x8b14, 0x83 => 0x8ae0, 0x84 => 0x8ae2,
+    0x85 => 0x8af7, 0x86 => 0x8ade, 0x87 => 0x8adb, 0x88 => 0x8b0c,
+    0x89 => 0x8b07, 0x8a => 0x8b1a, 0x8b => 0x8ae1, 0x8c => 0x8b16,
+    0x8d => 0x8b10, 0x8e => 0x8b17, 0x8f => 0x8b20, 0x90 => 0x8b33,
+    0x91 => 0x97ab, 0x92 => 0x8b26, 0x93 => 0x8b2b, 0x94 => 0x8b3e,
+    0x95 => 0x8b28, 0x96 => 0x8b41, 0x97 => 0x8b4c, 0x98 => 0x8b4f,
+    0x99 => 0x8b4e, 0x9a => 0x8b49, 0x9b => 0x8b56, 0x9c => 0x8b5b,
+    0x9d => 0x8b5a, 0x9e => 0x8b6b, 0x9f => 0x8b5f, 0xa0 => 0x8b6c,
+    0xa1 => 0x8b6f, 0xa2 => 0x8b74, 0xa3 => 0x8b7d, 0xa4 => 0x8b80,
+    0xa5 => 0x8b8c, 0xa6 => 0x8b8e, 0xa7 => 0x8b92, 0xa8 => 0x8b93,
+    0xa9 => 0x8b96, 0xaa => 0x8b99, 0xab => 0x8b9a, 0xac => 0x8c3a,
+    0xad => 0x8c41, 0xae => 0x8c3f, 0xaf => 0x8c48, 0xb0 => 0x8c4c,
+    0xb1 => 0x8c4e, 0xb2 => 0x8c50, 0xb3 => 0x8c55, 0xb4 => 0x8c62,
+    0xb5 => 0x8c6c, 0xb6 => 0x8c78, 0xb7 => 0x8c7a, 0xb8 => 0x8c82,
+    0xb9 => 0x8c89, 0xba => 0x8c85, 0xbb => 0x8c8a, 0xbc => 0x8c8d,
+    0xbd => 0x8c8e, 0xbe => 0x8c94, 0xbf => 0x8c7c, 0xc0 => 0x8c98,
+    0xc1 => 0x621d, 0xc2 => 0x8cad, 0xc3 => 0x8caa, 0xc4 => 0x8cbd,
+    0xc5 => 0x8cb2, 0xc6 => 0x8cb3, 0xc7 => 0x8cae, 0xc8 => 0x8cb6,
+    0xc9 => 0x8cc8, 0xca => 0x8cc1, 0xcb => 0x8ce4, 0xcc => 0x8ce3,
+    0xcd => 0x8cda, 0xce => 0x8cfd, 0xcf => 0x8cfa, 0xd0 => 0x8cfb,
+    0xd1 => 0x8d04, 0xd2 => 0x8d05, 0xd3 => 0x8d0a, 0xd4 => 0x8d07,
+    0xd5 => 0x8d0f, 0xd6 => 0x8d0d, 0xd7 => 0x8d10, 0xd8 => 0x9f4e,
+    0xd9 => 0x8d13, 0xda => 0x8ccd, 0xdb => 0x8d14, 0xdc => 0x8d16,
+    0xdd => 0x8d67, 0xde => 0x8d6d, 0xdf => 0x8d71, 0xe0 => 0x8d73,
+    0xe1 => 0x8d81, 0xe2 => 0x8d99, 0xe3 => 0x8dc2, 0xe4 => 0x8dbe,
+    0xe5 => 0x8dba, 0xe6 => 0x8dcf, 0xe7 => 0x8dda, 0xe8 => 0x8dd6,
+    0xe9 => 0x8dcc, 0xea => 0x8ddb, 0xeb => 0x8dcb, 0xec => 0x8dea,
+    0xed => 0x8deb, 0xee => 0x8ddf, 0xef => 0x8de3, 0xf0 => 0x8dfc,
+    0xf1 => 0x8e08, 0xf2 => 0x8e09, 0xf3 => 0x8dff, 0xf4 => 0x8e1d,
+    0xf5 => 0x8e1e, 0xf6 => 0x8e10, 0xf7 => 0x8e1f, 0xf8 => 0x8e42,
+    0xf9 => 0x8e35, 0xfa => 0x8e30, 0xfb => 0x8e34, 0xfc => 0x8e4a,
+  },
+  0xe7 => {
+    0x40 => 0x8e47, 0x41 => 0x8e49, 0x42 => 0x8e4c, 0x43 => 0x8e50,
+    0x44 => 0x8e48, 0x45 => 0x8e59, 0x46 => 0x8e64, 0x47 => 0x8e60,
+    0x48 => 0x8e2a, 0x49 => 0x8e63, 0x4a => 0x8e55, 0x4b => 0x8e76,
+    0x4c => 0x8e72, 0x4d => 0x8e7c, 0x4e => 0x8e81, 0x4f => 0x8e87,
+    0x50 => 0x8e85, 0x51 => 0x8e84, 0x52 => 0x8e8b, 0x53 => 0x8e8a,
+    0x54 => 0x8e93, 0x55 => 0x8e91, 0x56 => 0x8e94, 0x57 => 0x8e99,
+    0x58 => 0x8eaa, 0x59 => 0x8ea1, 0x5a => 0x8eac, 0x5b => 0x8eb0,
+    0x5c => 0x8ec6, 0x5d => 0x8eb1, 0x5e => 0x8ebe, 0x5f => 0x8ec5,
+    0x60 => 0x8ec8, 0x61 => 0x8ecb, 0x62 => 0x8edb, 0x63 => 0x8ee3,
+    0x64 => 0x8efc, 0x65 => 0x8efb, 0x66 => 0x8eeb, 0x67 => 0x8efe,
+    0x68 => 0x8f0a, 0x69 => 0x8f05, 0x6a => 0x8f15, 0x6b => 0x8f12,
+    0x6c => 0x8f19, 0x6d => 0x8f13, 0x6e => 0x8f1c, 0x6f => 0x8f1f,
+    0x70 => 0x8f1b, 0x71 => 0x8f0c, 0x72 => 0x8f26, 0x73 => 0x8f33,
+    0x74 => 0x8f3b, 0x75 => 0x8f39, 0x76 => 0x8f45, 0x77 => 0x8f42,
+    0x78 => 0x8f3e, 0x79 => 0x8f4c, 0x7a => 0x8f49, 0x7b => 0x8f46,
+    0x7c => 0x8f4e, 0x7d => 0x8f57, 0x7e => 0x8f5c, 0x80 => 0x8f62,
+    0x81 => 0x8f63, 0x82 => 0x8f64, 0x83 => 0x8f9c, 0x84 => 0x8f9f,
+    0x85 => 0x8fa3, 0x86 => 0x8fad, 0x87 => 0x8faf, 0x88 => 0x8fb7,
+    0x89 => 0x8fda, 0x8a => 0x8fe5, 0x8b => 0x8fe2, 0x8c => 0x8fea,
+    0x8d => 0x8fef, 0x8e => 0x9087, 0x8f => 0x8ff4, 0x90 => 0x9005,
+    0x91 => 0x8ff9, 0x92 => 0x8ffa, 0x93 => 0x9011, 0x94 => 0x9015,
+    0x95 => 0x9021, 0x96 => 0x900d, 0x97 => 0x901e, 0x98 => 0x9016,
+    0x99 => 0x900b, 0x9a => 0x9027, 0x9b => 0x9036, 0x9c => 0x9035,
+    0x9d => 0x9039, 0x9e => 0x8ff8, 0x9f => 0x904f, 0xa0 => 0x9050,
+    0xa1 => 0x9051, 0xa2 => 0x9052, 0xa3 => 0x900e, 0xa4 => 0x9049,
+    0xa5 => 0x903e, 0xa6 => 0x9056, 0xa7 => 0x9058, 0xa8 => 0x905e,
+    0xa9 => 0x9068, 0xaa => 0x906f, 0xab => 0x9076, 0xac => 0x96a8,
+    0xad => 0x9072, 0xae => 0x9082, 0xaf => 0x907d, 0xb0 => 0x9081,
+    0xb1 => 0x9080, 0xb2 => 0x908a, 0xb3 => 0x9089, 0xb4 => 0x908f,
+    0xb5 => 0x90a8, 0xb6 => 0x90af, 0xb7 => 0x90b1, 0xb8 => 0x90b5,
+    0xb9 => 0x90e2, 0xba => 0x90e4, 0xbb => 0x6248, 0xbc => 0x90db,
+    0xbd => 0x9102, 0xbe => 0x9112, 0xbf => 0x9119, 0xc0 => 0x9132,
+    0xc1 => 0x9130, 0xc2 => 0x914a, 0xc3 => 0x9156, 0xc4 => 0x9158,
+    0xc5 => 0x9163, 0xc6 => 0x9165, 0xc7 => 0x9169, 0xc8 => 0x9173,
+    0xc9 => 0x9172, 0xca => 0x918b, 0xcb => 0x9189, 0xcc => 0x9182,
+    0xcd => 0x91a2, 0xce => 0x91ab, 0xcf => 0x91af, 0xd0 => 0x91aa,
+    0xd1 => 0x91b5, 0xd2 => 0x91b4, 0xd3 => 0x91ba, 0xd4 => 0x91c0,
+    0xd5 => 0x91c1, 0xd6 => 0x91c9, 0xd7 => 0x91cb, 0xd8 => 0x91d0,
+    0xd9 => 0x91d6, 0xda => 0x91df, 0xdb => 0x91e1, 0xdc => 0x91db,
+    0xdd => 0x91fc, 0xde => 0x91f5, 0xdf => 0x91f6, 0xe0 => 0x921e,
+    0xe1 => 0x91ff, 0xe2 => 0x9214, 0xe3 => 0x922c, 0xe4 => 0x9215,
+    0xe5 => 0x9211, 0xe6 => 0x925e, 0xe7 => 0x9257, 0xe8 => 0x9245,
+    0xe9 => 0x9249, 0xea => 0x9264, 0xeb => 0x9248, 0xec => 0x9295,
+    0xed => 0x923f, 0xee => 0x924b, 0xef => 0x9250, 0xf0 => 0x929c,
+    0xf1 => 0x9296, 0xf2 => 0x9293, 0xf3 => 0x929b, 0xf4 => 0x925a,
+    0xf5 => 0x92cf, 0xf6 => 0x92b9, 0xf7 => 0x92b7, 0xf8 => 0x92e9,
+    0xf9 => 0x930f, 0xfa => 0x92fa, 0xfb => 0x9344, 0xfc => 0x932e,
+  },
+  0xe8 => {
+    0x40 => 0x9319, 0x41 => 0x9322, 0x42 => 0x931a, 0x43 => 0x9323,
+    0x44 => 0x933a, 0x45 => 0x9335, 0x46 => 0x933b, 0x47 => 0x935c,
+    0x48 => 0x9360, 0x49 => 0x937c, 0x4a => 0x936e, 0x4b => 0x9356,
+    0x4c => 0x93b0, 0x4d => 0x93ac, 0x4e => 0x93ad, 0x4f => 0x9394,
+    0x50 => 0x93b9, 0x51 => 0x93d6, 0x52 => 0x93d7, 0x53 => 0x93e8,
+    0x54 => 0x93e5, 0x55 => 0x93d8, 0x56 => 0x93c3, 0x57 => 0x93dd,
+    0x58 => 0x93d0, 0x59 => 0x93c8, 0x5a => 0x93e4, 0x5b => 0x941a,
+    0x5c => 0x9414, 0x5d => 0x9413, 0x5e => 0x9403, 0x5f => 0x9407,
+    0x60 => 0x9410, 0x61 => 0x9436, 0x62 => 0x942b, 0x63 => 0x9435,
+    0x64 => 0x9421, 0x65 => 0x943a, 0x66 => 0x9441, 0x67 => 0x9452,
+    0x68 => 0x9444, 0x69 => 0x945b, 0x6a => 0x9460, 0x6b => 0x9462,
+    0x6c => 0x945e, 0x6d => 0x946a, 0x6e => 0x9229, 0x6f => 0x9470,
+    0x70 => 0x9475, 0x71 => 0x9477, 0x72 => 0x947d, 0x73 => 0x945a,
+    0x74 => 0x947c, 0x75 => 0x947e, 0x76 => 0x9481, 0x77 => 0x947f,
+    0x78 => 0x9582, 0x79 => 0x9587, 0x7a => 0x958a, 0x7b => 0x9594,
+    0x7c => 0x9596, 0x7d => 0x9598, 0x7e => 0x9599, 0x80 => 0x95a0,
+    0x81 => 0x95a8, 0x82 => 0x95a7, 0x83 => 0x95ad, 0x84 => 0x95bc,
+    0x85 => 0x95bb, 0x86 => 0x95b9, 0x87 => 0x95be, 0x88 => 0x95ca,
+    0x89 => 0x6ff6, 0x8a => 0x95c3, 0x8b => 0x95cd, 0x8c => 0x95cc,
+    0x8d => 0x95d5, 0x8e => 0x95d4, 0x8f => 0x95d6, 0x90 => 0x95dc,
+    0x91 => 0x95e1, 0x92 => 0x95e5, 0x93 => 0x95e2, 0x94 => 0x9621,
+    0x95 => 0x9628, 0x96 => 0x962e, 0x97 => 0x962f, 0x98 => 0x9642,
+    0x99 => 0x964c, 0x9a => 0x964f, 0x9b => 0x964b, 0x9c => 0x9677,
+    0x9d => 0x965c, 0x9e => 0x965e, 0x9f => 0x965d, 0xa0 => 0x965f,
+    0xa1 => 0x9666, 0xa2 => 0x9672, 0xa3 => 0x966c, 0xa4 => 0x968d,
+    0xa5 => 0x9698, 0xa6 => 0x9695, 0xa7 => 0x9697, 0xa8 => 0x96aa,
+    0xa9 => 0x96a7, 0xaa => 0x96b1, 0xab => 0x96b2, 0xac => 0x96b0,
+    0xad => 0x96b4, 0xae => 0x96b6, 0xaf => 0x96b8, 0xb0 => 0x96b9,
+    0xb1 => 0x96ce, 0xb2 => 0x96cb, 0xb3 => 0x96c9, 0xb4 => 0x96cd,
+    0xb5 => 0x894d, 0xb6 => 0x96dc, 0xb7 => 0x970d, 0xb8 => 0x96d5,
+    0xb9 => 0x96f9, 0xba => 0x9704, 0xbb => 0x9706, 0xbc => 0x9708,
+    0xbd => 0x9713, 0xbe => 0x970e, 0xbf => 0x9711, 0xc0 => 0x970f,
+    0xc1 => 0x9716, 0xc2 => 0x9719, 0xc3 => 0x9724, 0xc4 => 0x972a,
+    0xc5 => 0x9730, 0xc6 => 0x9739, 0xc7 => 0x973d, 0xc8 => 0x973e,
+    0xc9 => 0x9744, 0xca => 0x9746, 0xcb => 0x9748, 0xcc => 0x9742,
+    0xcd => 0x9749, 0xce => 0x975c, 0xcf => 0x9760, 0xd0 => 0x9764,
+    0xd1 => 0x9766, 0xd2 => 0x9768, 0xd3 => 0x52d2, 0xd4 => 0x976b,
+    0xd5 => 0x9771, 0xd6 => 0x9779, 0xd7 => 0x9785, 0xd8 => 0x977c,
+    0xd9 => 0x9781, 0xda => 0x977a, 0xdb => 0x9786, 0xdc => 0x978b,
+    0xdd => 0x978f, 0xde => 0x9790, 0xdf => 0x979c, 0xe0 => 0x97a8,
+    0xe1 => 0x97a6, 0xe2 => 0x97a3, 0xe3 => 0x97b3, 0xe4 => 0x97b4,
+    0xe5 => 0x97c3, 0xe6 => 0x97c6, 0xe7 => 0x97c8, 0xe8 => 0x97cb,
+    0xe9 => 0x97dc, 0xea => 0x97ed, 0xeb => 0x9f4f, 0xec => 0x97f2,
+    0xed => 0x7adf, 0xee => 0x97f6, 0xef => 0x97f5, 0xf0 => 0x980f,
+    0xf1 => 0x980c, 0xf2 => 0x9838, 0xf3 => 0x9824, 0xf4 => 0x9821,
+    0xf5 => 0x9837, 0xf6 => 0x983d, 0xf7 => 0x9846, 0xf8 => 0x984f,
+    0xf9 => 0x984b, 0xfa => 0x986b, 0xfb => 0x986f, 0xfc => 0x9870,
+  },
+  0xe9 => {
+    0x40 => 0x9871, 0x41 => 0x9874, 0x42 => 0x9873, 0x43 => 0x98aa,
+    0x44 => 0x98af, 0x45 => 0x98b1, 0x46 => 0x98b6, 0x47 => 0x98c4,
+    0x48 => 0x98c3, 0x49 => 0x98c6, 0x4a => 0x98e9, 0x4b => 0x98eb,
+    0x4c => 0x9903, 0x4d => 0x9909, 0x4e => 0x9912, 0x4f => 0x9914,
+    0x50 => 0x9918, 0x51 => 0x9921, 0x52 => 0x991d, 0x53 => 0x991e,
+    0x54 => 0x9924, 0x55 => 0x9920, 0x56 => 0x992c, 0x57 => 0x992e,
+    0x58 => 0x993d, 0x59 => 0x993e, 0x5a => 0x9942, 0x5b => 0x9949,
+    0x5c => 0x9945, 0x5d => 0x9950, 0x5e => 0x994b, 0x5f => 0x9951,
+    0x60 => 0x9952, 0x61 => 0x994c, 0x62 => 0x9955, 0x63 => 0x9997,
+    0x64 => 0x9998, 0x65 => 0x99a5, 0x66 => 0x99ad, 0x67 => 0x99ae,
+    0x68 => 0x99bc, 0x69 => 0x99df, 0x6a => 0x99db, 0x6b => 0x99dd,
+    0x6c => 0x99d8, 0x6d => 0x99d1, 0x6e => 0x99ed, 0x6f => 0x99ee,
+    0x70 => 0x99f1, 0x71 => 0x99f2, 0x72 => 0x99fb, 0x73 => 0x99f8,
+    0x74 => 0x9a01, 0x75 => 0x9a0f, 0x76 => 0x9a05, 0x77 => 0x99e2,
+    0x78 => 0x9a19, 0x79 => 0x9a2b, 0x7a => 0x9a37, 0x7b => 0x9a45,
+    0x7c => 0x9a42, 0x7d => 0x9a40, 0x7e => 0x9a43, 0x80 => 0x9a3e,
+    0x81 => 0x9a55, 0x82 => 0x9a4d, 0x83 => 0x9a5b, 0x84 => 0x9a57,
+    0x85 => 0x9a5f, 0x86 => 0x9a62, 0x87 => 0x9a65, 0x88 => 0x9a64,
+    0x89 => 0x9a69, 0x8a => 0x9a6b, 0x8b => 0x9a6a, 0x8c => 0x9aad,
+    0x8d => 0x9ab0, 0x8e => 0x9abc, 0x8f => 0x9ac0, 0x90 => 0x9acf,
+    0x91 => 0x9ad1, 0x92 => 0x9ad3, 0x93 => 0x9ad4, 0x94 => 0x9ade,
+    0x95 => 0x9adf, 0x96 => 0x9ae2, 0x97 => 0x9ae3, 0x98 => 0x9ae6,
+    0x99 => 0x9aef, 0x9a => 0x9aeb, 0x9b => 0x9aee, 0x9c => 0x9af4,
+    0x9d => 0x9af1, 0x9e => 0x9af7, 0x9f => 0x9afb, 0xa0 => 0x9b06,
+    0xa1 => 0x9b18, 0xa2 => 0x9b1a, 0xa3 => 0x9b1f, 0xa4 => 0x9b22,
+    0xa5 => 0x9b23, 0xa6 => 0x9b25, 0xa7 => 0x9b27, 0xa8 => 0x9b28,
+    0xa9 => 0x9b29, 0xaa => 0x9b2a, 0xab => 0x9b2e, 0xac => 0x9b2f,
+    0xad => 0x9b32, 0xae => 0x9b44, 0xaf => 0x9b43, 0xb0 => 0x9b4f,
+    0xb1 => 0x9b4d, 0xb2 => 0x9b4e, 0xb3 => 0x9b51, 0xb4 => 0x9b58,
+    0xb5 => 0x9b74, 0xb6 => 0x9b93, 0xb7 => 0x9b83, 0xb8 => 0x9b91,
+    0xb9 => 0x9b96, 0xba => 0x9b97, 0xbb => 0x9b9f, 0xbc => 0x9ba0,
+    0xbd => 0x9ba8, 0xbe => 0x9bb4, 0xbf => 0x9bc0, 0xc0 => 0x9bca,
+    0xc1 => 0x9bb9, 0xc2 => 0x9bc6, 0xc3 => 0x9bcf, 0xc4 => 0x9bd1,
+    0xc5 => 0x9bd2, 0xc6 => 0x9be3, 0xc7 => 0x9be2, 0xc8 => 0x9be4,
+    0xc9 => 0x9bd4, 0xca => 0x9be1, 0xcb => 0x9c3a, 0xcc => 0x9bf2,
+    0xcd => 0x9bf1, 0xce => 0x9bf0, 0xcf => 0x9c15, 0xd0 => 0x9c14,
+    0xd1 => 0x9c09, 0xd2 => 0x9c13, 0xd3 => 0x9c0c, 0xd4 => 0x9c06,
+    0xd5 => 0x9c08, 0xd6 => 0x9c12, 0xd7 => 0x9c0a, 0xd8 => 0x9c04,
+    0xd9 => 0x9c2e, 0xda => 0x9c1b, 0xdb => 0x9c25, 0xdc => 0x9c24,
+    0xdd => 0x9c21, 0xde => 0x9c30, 0xdf => 0x9c47, 0xe0 => 0x9c32,
+    0xe1 => 0x9c46, 0xe2 => 0x9c3e, 0xe3 => 0x9c5a, 0xe4 => 0x9c60,
+    0xe5 => 0x9c67, 0xe6 => 0x9c76, 0xe7 => 0x9c78, 0xe8 => 0x9ce7,
+    0xe9 => 0x9cec, 0xea => 0x9cf0, 0xeb => 0x9d09, 0xec => 0x9d08,
+    0xed => 0x9ceb, 0xee => 0x9d03, 0xef => 0x9d06, 0xf0 => 0x9d2a,
+    0xf1 => 0x9d26, 0xf2 => 0x9daf, 0xf3 => 0x9d23, 0xf4 => 0x9d1f,
+    0xf5 => 0x9d44, 0xf6 => 0x9d15, 0xf7 => 0x9d12, 0xf8 => 0x9d41,
+    0xf9 => 0x9d3f, 0xfa => 0x9d3e, 0xfb => 0x9d46, 0xfc => 0x9d48,
+  },
+  0xea => {
+    0x40 => 0x9d5d, 0x41 => 0x9d5e, 0x42 => 0x9d64, 0x43 => 0x9d51,
+    0x44 => 0x9d50, 0x45 => 0x9d59, 0x46 => 0x9d72, 0x47 => 0x9d89,
+    0x48 => 0x9d87, 0x49 => 0x9dab, 0x4a => 0x9d6f, 0x4b => 0x9d7a,
+    0x4c => 0x9d9a, 0x4d => 0x9da4, 0x4e => 0x9da9, 0x4f => 0x9db2,
+    0x50 => 0x9dc4, 0x51 => 0x9dc1, 0x52 => 0x9dbb, 0x53 => 0x9db8,
+    0x54 => 0x9dba, 0x55 => 0x9dc6, 0x56 => 0x9dcf, 0x57 => 0x9dc2,
+    0x58 => 0x9dd9, 0x59 => 0x9dd3, 0x5a => 0x9df8, 0x5b => 0x9de6,
+    0x5c => 0x9ded, 0x5d => 0x9def, 0x5e => 0x9dfd, 0x5f => 0x9e1a,
+    0x60 => 0x9e1b, 0x61 => 0x9e1e, 0x62 => 0x9e75, 0x63 => 0x9e79,
+    0x64 => 0x9e7d, 0x65 => 0x9e81, 0x66 => 0x9e88, 0x67 => 0x9e8b,
+    0x68 => 0x9e8c, 0x69 => 0x9e92, 0x6a => 0x9e95, 0x6b => 0x9e91,
+    0x6c => 0x9e9d, 0x6d => 0x9ea5, 0x6e => 0x9ea9, 0x6f => 0x9eb8,
+    0x70 => 0x9eaa, 0x71 => 0x9ead, 0x72 => 0x9761, 0x73 => 0x9ecc,
+    0x74 => 0x9ece, 0x75 => 0x9ecf, 0x76 => 0x9ed0, 0x77 => 0x9ed4,
+    0x78 => 0x9edc, 0x79 => 0x9ede, 0x7a => 0x9edd, 0x7b => 0x9ee0,
+    0x7c => 0x9ee5, 0x7d => 0x9ee8, 0x7e => 0x9eef, 0x80 => 0x9ef4,
+    0x81 => 0x9ef6, 0x82 => 0x9ef7, 0x83 => 0x9ef9, 0x84 => 0x9efb,
+    0x85 => 0x9efc, 0x86 => 0x9efd, 0x87 => 0x9f07, 0x88 => 0x9f08,
+    0x89 => 0x76b7, 0x8a => 0x9f15, 0x8b => 0x9f21, 0x8c => 0x9f2c,
+    0x8d => 0x9f3e, 0x8e => 0x9f4a, 0x8f => 0x9f52, 0x90 => 0x9f54,
+    0x91 => 0x9f63, 0x92 => 0x9f5f, 0x93 => 0x9f60, 0x94 => 0x9f61,
+    0x95 => 0x9f66, 0x96 => 0x9f67, 0x97 => 0x9f6c, 0x98 => 0x9f6a,
+    0x99 => 0x9f77, 0x9a => 0x9f72, 0x9b => 0x9f76, 0x9c => 0x9f95,
+    0x9d => 0x9f9c, 0x9e => 0x9fa0, 0x9f => 0x582f, 0xa0 => 0x69c7,
+    0xa1 => 0x9059, 0xa2 => 0x7464, 0xa3 => 0x51dc, 0xa4 => 0x7199,
+  },
+  0xeb => {
+    0x41 => [0x3001,0xf87e], 0x42 => [0x3002,0xf87e], 0x50 => [0xffe3,0xf87e],
+    0x51 => 0xfe33, 0x5b => [0x30fc,0xf87e], 0x5c => 0xfe31,
+    0x5d => [0x2010,0xf87e], 0x60 => [0x301c,0xf87e], 0x61 => [0x2016,0xf87e],
+    0x62 => [0xff5c,0xf87e], 0x63 => [0x2026,0xf87e], 0x64 => 0xfe30,
+    0x69 => 0xfe35, 0x6a => 0xfe36, 0x6b => 0xfe39, 0x6c => 0xfe3a,
+    0x6d => [0xff3b,0xf87e], 0x6e => [0xff3d,0xf87e], 0x6f => 0xfe37,
+    0x70 => 0xfe38, 0x71 => 0xfe3f, 0x72 => 0xfe40, 0x73 => 0xfe3d,
+    0x74 => 0xfe3e, 0x75 => 0xfe41, 0x76 => 0xfe42, 0x77 => 0xfe43,
+    0x78 => 0xfe44, 0x79 => 0xfe3b, 0x7a => 0xfe3c, 0x81 => [0xff1d,0xf87e],
+  },
+  0xec => {
+    0x9f => [0x3041,0xf87e], 0xa1 => [0x3043,0xf87e], 0xa3 => [0x3045,0xf87e],
+    0xa5 => [0x3047,0xf87e], 0xa7 => [0x3049,0xf87e], 0xc1 => [0x3063,0xf87e],
+    0xe1 => [0x3083,0xf87e], 0xe3 => [0x3085,0xf87e], 0xe5 => [0x3087,0xf87e],
+    0xec => [0x308e,0xf87e],
+  },
+  0xed => {
+    0x40 => [0x30a1,0xf87e], 0x42 => [0x30a3,0xf87e], 0x44 => [0x30a5,0xf87e],
+    0x46 => [0x30a7,0xf87e], 0x48 => [0x30a9,0xf87e], 0x62 => [0x30c3,0xf87e],
+    0x83 => [0x30e3,0xf87e], 0x85 => [0x30e5,0xf87e], 0x87 => [0x30e7,0xf87e],
+    0x8e => [0x30ee,0xf87e], 0x95 => [0x30f5,0xf87e], 0x96 => [0x30f6,0xf87e],
+  },
+);
+
+1; # end
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacKorean.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacKorean.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacKorean.pm	(revision 24799)
@@ -0,0 +1,2720 @@
+#------------------------------------------------------------------------------
+# File:         MacKorean.pm
+#
+# Description:  Mac Korean to Unicode
+#
+# Revisions:    2010/01/20 - P. Harvey created
+#
+# References:   1) http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/KOREAN.TXT
+#
+# Notes:        The table omits 1-byte characters with the same values as Unicode
+#------------------------------------------------------------------------------
+use strict;
+
+%Image::ExifTool::Charset::MacKorean = (
+  0x80 => 0xa0, 0x81 => 0x20a9, 0x82 => [0x2013,0xf87f], 0x83 => 0xa9,
+  0x84 => [0xff3f,0xf87f], 0xff => [0x2026,0xf87f],
+  0xa1 => {
+    0x41 => [0x300c,0xf87f], 0x42 => [0x300d,0xf87f], 0x43 => [0x300c,0xf87b],
+    0x44 => [0x300d,0xf87b], 0x45 => [0x300c,0xf87c], 0x46 => [0x300d,0xf87c],
+    0x47 => [0x300e,0xf87c], 0x48 => [0x300f,0xf87c], 0x49 => [0x300a,0xf878],
+    0x4a => [0x300b,0xf878], 0x4b => [0x3008,0xf878], 0x4c => [0x3009,0xf878],
+    0x4d => 0xfe59, 0x4e => 0xfe5a, 0x4f => [0xfe59,0xf87f],
+    0x50 => [0xfe5a,0xf87f], 0x51 => [0x2985,0xf87f], 0x52 => [0x2986,0xf87f],
+    0x53 => [0x2985,0xf879], 0x54 => [0x2986,0xf879], 0x55 => [0x2985,0xf87c],
+    0x56 => [0x2986,0xf87c], 0x57 => [0x28,0xf87c], 0x58 => [0x29,0xf87c],
+    0x59 => 0x2985, 0x5a => 0x2986, 0x5b => [0x3010,0xf87f],
+    0x5c => [0x3011,0xf87f], 0x5d => 0x3016, 0x5e => 0x3017, 0x5f => 0x3018,
+    0x60 => 0x3019, 0x61 => [0x5b,0xf87b], 0x62 => [0x5d,0xf87b],
+    0x63 => [0x5b,0xf87c], 0x64 => [0x5d,0xf87c], 0x65 => [0x2985,0xf87b],
+    0x66 => [0x2986,0xf87b], 0x67 => [0x2020,0xf87f], 0x68 => [0x2021,0xf87f],
+    0x69 => [0x2020,0xf87b], 0x6a => [0x2021,0xf87c], 0x6b => [0x2020,0xf877],
+    0x6c => [0x2a,0xf877], 0x6d => 0x2051, 0x6e => 0xf840, 0x6f => 0x201f,
+    0x70 => 0x201b, 0x71 => 0x207a, 0x72 => 0x207b, 0x73 => [0xd7,0xf877],
+    0x74 => [0x221e,0xf877], 0x75 => [0x223d,0xf877], 0x76 => [0xb1,0xf877],
+    0x77 => [0x2213,0xf877], 0x78 => [0x3e,0xf877], 0x79 => [0x3c,0xf877],
+    0x7a => 0x207c, 0x7b => [0x2260,0xf877], 0x7c => 0x207d, 0x7d => 0x207e,
+    0x81 => [0x7b,0xf877], 0x82 => [0x7d,0xf877], 0x83 => [0x5b,0xf877],
+    0x84 => [0x5d,0xf877], 0x85 => [0x2229,0xf877], 0x86 => [0x222a,0xf877],
+    0x87 => [0x2282,0xf877], 0x88 => [0x2208,0xf877], 0x89 => [0x2211,0xf877],
+    0x8a => [0x21,0xf877], 0x8b => [0x3007,0xf876], 0x8c => [0x4e00,0xf876],
+    0x8d => [0x4e8c,0xf876], 0x8e => [0x4e09,0xf876], 0x8f => [0x56db,0xf876],
+    0x90 => [0x4e94,0xf876], 0x91 => [0x516d,0xf876], 0x92 => [0x4e03,0xf876],
+    0x93 => [0x516b,0xf876], 0x94 => [0x4e5d,0xf876], 0x95 => [0x5341,0xf876],
+    0x96 => 0x204c, 0x97 => 0x204d, 0x98 => 0x02bc, 0x99 => 0x2997,
+    0x9a => 0x2998, 0x9c => [0xff0a,0xf874], 0x9d => [0x2051,0xf87c],
+    0x9e => [0xff0a,0xf875], 0x9f => [0xff0a,0xf871], 0xa0 => [0x2051,0xf879],
+    0xa1 => 0x3000, 0xa2 => 0x3001, 0xa3 => 0x3002, 0xa4 => 0xb7,
+    0xa5 => 0x2025, 0xa6 => 0x2026, 0xa7 => 0xa8, 0xa8 => 0x3003,
+    0xa9 => 0x2013, 0xaa => 0x2014, 0xab => 0x2016, 0xac => 0xff3c,
+    0xad => 0x301c, 0xae => 0x2018, 0xaf => 0x2019, 0xb0 => 0x201c,
+    0xb1 => 0x201d, 0xb2 => 0x3014, 0xb3 => 0x3015, 0xb4 => 0x3008,
+    0xb5 => 0x3009, 0xb6 => 0x300a, 0xb7 => 0x300b, 0xb8 => 0x300c,
+    0xb9 => 0x300d, 0xba => 0x300e, 0xbb => 0x300f, 0xbc => 0x3010,
+    0xbd => 0x3011, 0xbe => 0xb1, 0xbf => 0xd7, 0xc0 => 0xf7, 0xc1 => 0x2260,
+    0xc2 => 0x2264, 0xc3 => 0x2265, 0xc4 => 0x221e, 0xc5 => 0x2234,
+    0xc6 => 0xb0, 0xc7 => 0x2032, 0xc8 => 0x2033, 0xc9 => 0x2103,
+    0xca => 0x212b, 0xcb => 0xa2, 0xcc => 0xa3, 0xcd => 0xa5, 0xce => 0x2642,
+    0xcf => 0x2640, 0xd0 => 0x2220, 0xd1 => 0x22a5, 0xd2 => 0x2312,
+    0xd3 => 0x2202, 0xd4 => 0x2207, 0xd5 => 0x2261, 0xd6 => 0x2252,
+    0xd7 => 0xa7, 0xd8 => 0x203b, 0xd9 => 0x2606, 0xda => 0x2605,
+    0xdb => 0x25cb, 0xdc => 0x25cf, 0xdd => 0x25ce, 0xde => 0x25c7,
+    0xdf => 0x25c6, 0xe0 => 0x25a1, 0xe1 => 0x25a0, 0xe2 => 0x25b3,
+    0xe3 => 0x25b2, 0xe4 => 0x25bd, 0xe5 => 0x25bc, 0xe6 => 0x2192,
+    0xe7 => 0x2190, 0xe8 => 0x2191, 0xe9 => 0x2193, 0xea => 0x2194,
+    0xeb => 0x3013, 0xec => 0x226a, 0xed => 0x226b, 0xee => 0x221a,
+    0xef => 0x223d, 0xf0 => 0x221d, 0xf1 => 0x2235, 0xf2 => 0x222b,
+    0xf3 => 0x222c, 0xf4 => 0x2208, 0xf5 => 0x220b, 0xf6 => 0x2286,
+    0xf7 => 0x2287, 0xf8 => 0x2282, 0xf9 => 0x2283, 0xfa => 0x222a,
+    0xfb => 0x2229, 0xfc => 0x2227, 0xfd => 0x2228, 0xfe => 0xac,
+  },
+  0xa2 => {
+    0x41 => [0x2985,0xf878], 0x42 => [0x2986,0xf878], 0x43 => [0x2985,0xf873],
+    0x44 => [0x2986,0xf873], 0x45 => [0xfe59,0xf87c], 0x46 => [0xfe5a,0xf87c],
+    0x47 => [0x3016,0xf878], 0x48 => [0x3017,0xf878], 0x49 => [0x3010,0xf878],
+    0x4a => [0x3011,0xf878], 0x4b => [0x28,0xf87f], 0x4c => [0x29,0xf87f],
+    0xa1 => 0x21d2, 0xa2 => 0x21d4, 0xa3 => 0x2200, 0xa4 => 0x2203,
+    0xa5 => 0xb4, 0xa6 => 0x02dc, 0xa7 => 0x02c7, 0xa8 => 0x02d8,
+    0xa9 => 0x02dd, 0xaa => 0x02da, 0xab => 0x02d9, 0xac => 0xb8,
+    0xad => 0x02db, 0xae => 0xa1, 0xaf => 0xbf, 0xb0 => 0x02d0, 0xb1 => 0x222e,
+    0xb2 => 0x2211, 0xb3 => 0x220f, 0xb4 => 0xa4, 0xb5 => 0x2109,
+    0xb6 => 0x2030, 0xb7 => 0x25c1, 0xb8 => 0x25c0, 0xb9 => 0x25b7,
+    0xba => 0x25b6, 0xbb => 0x2664, 0xbc => 0x2660, 0xbd => 0x2661,
+    0xbe => 0x2665, 0xbf => 0x2667, 0xc0 => 0x2663, 0xc1 => 0x25c9,
+    0xc2 => 0x25c8, 0xc3 => 0x25a3, 0xc4 => 0x25d0, 0xc5 => 0x25d1,
+    0xc6 => 0x2592, 0xc7 => 0x25a4, 0xc8 => 0x25a5, 0xc9 => 0x25a8,
+    0xca => 0x25a7, 0xcb => 0x25a6, 0xcc => 0x25a9, 0xcd => 0x2668,
+    0xce => 0x260f, 0xcf => 0x260e, 0xd0 => 0x261c, 0xd1 => 0x261e,
+    0xd2 => 0xb6, 0xd3 => 0x2020, 0xd4 => 0x2021, 0xd5 => 0x2195,
+    0xd6 => 0x2197, 0xd7 => 0x2199, 0xd8 => 0x2196, 0xd9 => 0x2198,
+    0xda => 0x266d, 0xdb => 0x2669, 0xdc => 0x266a, 0xdd => 0x266c,
+    0xde => 0x327f, 0xdf => 0x321c, 0xe0 => 0x2116, 0xe1 => 0x33c7,
+    0xe2 => 0x2122, 0xe3 => 0x33c2, 0xe4 => 0x33d8, 0xe5 => 0x2121,
+    0xe6 => [0x31,0x20de,0xf87c], 0xe7 => [0x32,0x20de,0xf87c],
+    0xe8 => [0x33,0x20de,0xf87c], 0xe9 => [0x34,0x20de,0xf87c],
+    0xea => [0x35,0x20de,0xf87c], 0xeb => [0x36,0x20de,0xf87c],
+    0xec => [0x37,0x20de,0xf87c], 0xed => [0x38,0x20de,0xf87c],
+    0xee => [0x39,0x20de,0xf87c], 0xef => [0xf863,0x5b,0x31,0x30,0x5d],
+    0xf0 => [0xf863,0x5b,0x31,0x31,0x5d], 0xf1 => [0xf863,0x5b,0x31,0x32,0x5d],
+    0xf2 => [0xf863,0x5b,0x31,0x33,0x5d], 0xf3 => [0xf863,0x5b,0x31,0x34,0x5d],
+    0xf4 => [0xf863,0x5b,0x31,0x35,0x5d], 0xf5 => [0xf863,0x5b,0x31,0x36,0x5d],
+    0xf6 => [0xf863,0x5b,0x31,0x37,0x5d], 0xf7 => [0xf863,0x5b,0x31,0x38,0x5d],
+    0xf8 => [0xf863,0x5b,0x31,0x39,0x5d], 0xf9 => [0xf863,0x5b,0x32,0x30,0x5d],
+    0xfa => [0xb6,0xf87f], 0xfb => [0x2016,0xf87b], 0xfc => [0x2016,0xf87c],
+    0xfd => 0x22ee, 0xfe => 0x2237,
+  },
+  0xa3 => {
+    0x41 => [0x31,0x20de,0xf87b], 0x42 => [0x32,0x20de,0xf87b],
+    0x43 => [0x33,0x20de,0xf87b], 0x44 => [0x34,0x20de,0xf87b],
+    0x45 => [0x35,0x20de,0xf87b], 0x46 => [0x36,0x20de,0xf87b],
+    0x47 => [0x37,0x20de,0xf87b], 0x48 => [0x38,0x20de,0xf87b],
+    0x49 => [0x39,0x20de,0xf87b], 0x4a => [0xf864,0x5b,0x31,0x30,0x5d],
+    0x4b => [0xf864,0x5b,0x31,0x31,0x5d], 0x4c => [0xf864,0x5b,0x31,0x32,0x5d],
+    0x4d => [0xf864,0x5b,0x31,0x33,0x5d], 0x4e => [0xf864,0x5b,0x31,0x34,0x5d],
+    0x4f => [0xf864,0x5b,0x31,0x35,0x5d], 0x50 => [0xf864,0x5b,0x31,0x36,0x5d],
+    0x51 => [0xf864,0x5b,0x31,0x37,0x5d], 0x52 => [0xf864,0x5b,0x31,0x38,0x5d],
+    0x53 => [0xf864,0x5b,0x31,0x39,0x5d], 0x54 => [0xf864,0x5b,0x32,0x30,0x5d],
+    0x55 => 0x278a, 0x56 => 0x278b, 0x57 => 0x278c, 0x58 => 0x278d,
+    0x59 => 0x278e, 0x5a => 0x278f, 0x5b => 0x2790, 0x5c => 0x2791,
+    0x5d => 0x2792, 0x5e => 0x2793, 0x5f => [0x24eb,0xf87f],
+    0x60 => [0x24ec,0xf87f], 0x61 => [0x24ed,0xf87f], 0x62 => [0x24ee,0xf87f],
+    0x63 => [0x24ef,0xf87f], 0x64 => [0x24f0,0xf87f], 0x65 => [0x24f1,0xf87f],
+    0x66 => [0x24f2,0xf87f], 0x67 => [0x24f3,0xf87f], 0x68 => [0x24f4,0xf87f],
+    0x69 => [0xf861,0x28,0x41,0x29], 0x6a => [0xf861,0x28,0x42,0x29],
+    0x6b => [0xf861,0x28,0x43,0x29], 0x6c => [0xf861,0x28,0x44,0x29],
+    0x6d => [0xf861,0x28,0x45,0x29], 0x6e => [0xf861,0x28,0x46,0x29],
+    0x6f => [0xf861,0x28,0x47,0x29], 0x70 => [0xf861,0x28,0x48,0x29],
+    0x71 => [0xf861,0x28,0x49,0x29], 0x72 => [0xf861,0x28,0x4a,0x29],
+    0x73 => [0xf861,0x28,0x4b,0x29], 0x74 => [0xf861,0x28,0x4c,0x29],
+    0x75 => [0xf861,0x28,0x4d,0x29], 0x76 => [0xf861,0x28,0x4e,0x29],
+    0x77 => [0xf861,0x28,0x4f,0x29], 0x78 => [0xf861,0x28,0x50,0x29],
+    0x79 => [0xf861,0x28,0x51,0x29], 0x7a => [0xf861,0x28,0x52,0x29],
+    0x7b => [0xf861,0x28,0x53,0x29], 0x7c => [0xf861,0x28,0x54,0x29],
+    0x7d => [0xf861,0x28,0x55,0x29], 0x81 => [0xf861,0x28,0x56,0x29],
+    0x82 => [0xf861,0x28,0x57,0x29], 0x83 => [0xf861,0x28,0x58,0x29],
+    0x84 => [0xf861,0x28,0x59,0x29], 0x85 => [0xf861,0x28,0x5a,0x29],
+    0x86 => 0x24b6, 0x87 => 0x24b7, 0x88 => 0x24b8, 0x89 => 0x24b9,
+    0x8a => 0x24ba, 0x8b => 0x24bb, 0x8c => 0x24bc, 0x8d => 0x24bd,
+    0x8e => 0x24be, 0x8f => 0x24bf, 0x90 => 0x24c0, 0x91 => 0x24c1,
+    0x92 => 0x24c2, 0x93 => 0x24c3, 0x94 => 0x24c4, 0x95 => 0x24c5,
+    0x96 => 0x24c6, 0x97 => 0x24c7, 0x98 => 0x24c8, 0x99 => 0x24c9,
+    0x9a => 0x24ca, 0x9b => 0x24cb, 0x9c => 0x24cc, 0x9d => 0x24cd,
+    0x9e => 0x24ce, 0x9f => 0x24cf, 0xa1 => 0xff01, 0xa2 => 0xff02,
+    0xa3 => 0xff03, 0xa4 => 0xff04, 0xa5 => 0xff05, 0xa6 => 0xff06,
+    0xa7 => 0xff07, 0xa8 => 0xff08, 0xa9 => 0xff09, 0xaa => 0xff0a,
+    0xab => 0xff0b, 0xac => 0xff0c, 0xad => 0xff0d, 0xae => 0xff0e,
+    0xaf => 0xff0f, 0xb0 => 0xff10, 0xb1 => 0xff11, 0xb2 => 0xff12,
+    0xb3 => 0xff13, 0xb4 => 0xff14, 0xb5 => 0xff15, 0xb6 => 0xff16,
+    0xb7 => 0xff17, 0xb8 => 0xff18, 0xb9 => 0xff19, 0xba => 0xff1a,
+    0xbb => 0xff1b, 0xbc => 0xff1c, 0xbd => 0xff1d, 0xbe => 0xff1e,
+    0xbf => 0xff1f, 0xc0 => 0xff20, 0xc1 => 0xff21, 0xc2 => 0xff22,
+    0xc3 => 0xff23, 0xc4 => 0xff24, 0xc5 => 0xff25, 0xc6 => 0xff26,
+    0xc7 => 0xff27, 0xc8 => 0xff28, 0xc9 => 0xff29, 0xca => 0xff2a,
+    0xcb => 0xff2b, 0xcc => 0xff2c, 0xcd => 0xff2d, 0xce => 0xff2e,
+    0xcf => 0xff2f, 0xd0 => 0xff30, 0xd1 => 0xff31, 0xd2 => 0xff32,
+    0xd3 => 0xff33, 0xd4 => 0xff34, 0xd5 => 0xff35, 0xd6 => 0xff36,
+    0xd7 => 0xff37, 0xd8 => 0xff38, 0xd9 => 0xff39, 0xda => 0xff3a,
+    0xdb => 0xff3b, 0xdc => 0xffe6, 0xdd => 0xff3d, 0xde => 0xff3e,
+    0xdf => 0xff3f, 0xe0 => 0xff40, 0xe1 => 0xff41, 0xe2 => 0xff42,
+    0xe3 => 0xff43, 0xe4 => 0xff44, 0xe5 => 0xff45, 0xe6 => 0xff46,
+    0xe7 => 0xff47, 0xe8 => 0xff48, 0xe9 => 0xff49, 0xea => 0xff4a,
+    0xeb => 0xff4b, 0xec => 0xff4c, 0xed => 0xff4d, 0xee => 0xff4e,
+    0xef => 0xff4f, 0xf0 => 0xff50, 0xf1 => 0xff51, 0xf2 => 0xff52,
+    0xf3 => 0xff53, 0xf4 => 0xff54, 0xf5 => 0xff55, 0xf6 => 0xff56,
+    0xf7 => 0xff57, 0xf8 => 0xff58, 0xf9 => 0xff59, 0xfa => 0xff5a,
+    0xfb => 0xff5b, 0xfc => 0xff5c, 0xfd => 0xff5d, 0xfe => 0x203e,
+  },
+  0xa4 => {
+    0x41 => [0x31,0x20de,0xf87f], 0x42 => [0x32,0x20de,0xf87f],
+    0x43 => [0x33,0x20de,0xf87f], 0x44 => [0x34,0x20de,0xf87f],
+    0x45 => [0x35,0x20de,0xf87f], 0x46 => [0x36,0x20de,0xf87f],
+    0x47 => [0x37,0x20de,0xf87f], 0x48 => [0x38,0x20de,0xf87f],
+    0x49 => [0x39,0x20de,0xf87f], 0x4a => [0xf862,0x5b,0x31,0x30,0x5d],
+    0x4b => [0xf862,0x5b,0x31,0x31,0x5d], 0x4c => [0xf862,0x5b,0x31,0x32,0x5d],
+    0x4d => [0xf862,0x5b,0x31,0x33,0x5d], 0x4e => [0xf862,0x5b,0x31,0x34,0x5d],
+    0x4f => [0xf862,0x5b,0x31,0x35,0x5d], 0x50 => [0xf862,0x5b,0x31,0x36,0x5d],
+    0x51 => [0xf862,0x5b,0x31,0x37,0x5d], 0x52 => [0xf862,0x5b,0x31,0x38,0x5d],
+    0x53 => [0xf862,0x5b,0x31,0x39,0x5d], 0x54 => [0xf862,0x5b,0x32,0x30,0x5d],
+    0x55 => [0x31,0x20de,0xf87a], 0x56 => [0x32,0x20de,0xf87a],
+    0x57 => [0x33,0x20de,0xf87a], 0x58 => [0x34,0x20de,0xf87a],
+    0x59 => [0x35,0x20de,0xf87a], 0x5a => [0x36,0x20de,0xf87a],
+    0x5b => [0x37,0x20de,0xf87a], 0x5c => [0x38,0x20de,0xf87a],
+    0x5d => [0x39,0x20de,0xf87a], 0x5e => [0xf865,0x5b,0x31,0x30,0x5d],
+    0x5f => [0xf865,0x5b,0x31,0x31,0x5d], 0x60 => [0xf865,0x5b,0x31,0x32,0x5d],
+    0x61 => [0xf865,0x5b,0x31,0x33,0x5d], 0x62 => [0xf865,0x5b,0x31,0x34,0x5d],
+    0x63 => [0xf865,0x5b,0x31,0x35,0x5d], 0x64 => [0xf865,0x5b,0x31,0x36,0x5d],
+    0x65 => [0xf865,0x5b,0x31,0x37,0x5d], 0x66 => [0xf865,0x5b,0x31,0x38,0x5d],
+    0x67 => [0xf865,0x5b,0x31,0x39,0x5d], 0x68 => [0xf865,0x5b,0x32,0x30,0x5d],
+    0x69 => [0x278a,0xf87f], 0x6a => [0x278b,0xf87f], 0x6b => [0x278c,0xf87f],
+    0x6c => [0x278d,0xf87f], 0x6d => [0x278e,0xf87f], 0x6e => [0x278f,0xf87f],
+    0x6f => [0x2790,0xf87f], 0x70 => [0x2791,0xf87f], 0x71 => [0x2792,0xf87f],
+    0x72 => [0x2793,0xf87f], 0x73 => [0x24eb,0xf878], 0x74 => [0x24ec,0xf878],
+    0x75 => [0x24ed,0xf878], 0x76 => [0x24ee,0xf878], 0x77 => [0x24ef,0xf878],
+    0x78 => [0x24f0,0xf878], 0x79 => [0x24f1,0xf878], 0x7a => [0x24f2,0xf878],
+    0x7b => [0x24f3,0xf878], 0x7c => [0x24f4,0xf878], 0x7d => 0x2a26,
+    0x81 => 0x227a, 0x82 => 0x227b, 0x83 => 0x22ce, 0x84 => 0x22cf,
+    0x85 => 0x2280, 0x86 => 0x2281, 0x87 => 0x2270, 0x88 => 0x2271,
+    0x89 => 0x2272, 0x8a => 0x2273, 0x8b => 0x2ac5, 0x8c => 0x2acb,
+    0x8d => 0x2ac6, 0x8e => 0x2acc, 0x8f => 0x2276, 0x90 => 0x2277,
+    0x91 => 0x2279, 0x92 => 0x22da, 0x93 => 0x22db, 0x94 => 0x2a8b,
+    0x95 => 0x2a8c, 0x96 => 0x2a91, 0x97 => 0x2a92, 0x98 => [0x2222,0xf87f],
+    0x99 => 0x2245, 0x9a => 0x2243, 0x9b => 0x2248, 0x9c => 0x29a3,
+    0x9d => 0x22a4, 0x9e => [0x2225,0x0347], 0x9f => [0x2afd,0x0347],
+    0xa1 => 0x3131, 0xa2 => 0x3132, 0xa3 => 0x3133, 0xa4 => 0x3134,
+    0xa5 => 0x3135, 0xa6 => 0x3136, 0xa7 => 0x3137, 0xa8 => 0x3138,
+    0xa9 => 0x3139, 0xaa => 0x313a, 0xab => 0x313b, 0xac => 0x313c,
+    0xad => 0x313d, 0xae => 0x313e, 0xaf => 0x313f, 0xb0 => 0x3140,
+    0xb1 => 0x3141, 0xb2 => 0x3142, 0xb3 => 0x3143, 0xb4 => 0x3144,
+    0xb5 => 0x3145, 0xb6 => 0x3146, 0xb7 => 0x3147, 0xb8 => 0x3148,
+    0xb9 => 0x3149, 0xba => 0x314a, 0xbb => 0x314b, 0xbc => 0x314c,
+    0xbd => 0x314d, 0xbe => 0x314e, 0xbf => 0x314f, 0xc0 => 0x3150,
+    0xc1 => 0x3151, 0xc2 => 0x3152, 0xc3 => 0x3153, 0xc4 => 0x3154,
+    0xc5 => 0x3155, 0xc6 => 0x3156, 0xc7 => 0x3157, 0xc8 => 0x3158,
+    0xc9 => 0x3159, 0xca => 0x315a, 0xcb => 0x315b, 0xcc => 0x315c,
+    0xcd => 0x315d, 0xce => 0x315e, 0xcf => 0x315f, 0xd0 => 0x3160,
+    0xd1 => 0x3161, 0xd2 => 0x3162, 0xd3 => 0x3163, 0xd4 => 0x3164,
+    0xd5 => 0x3165, 0xd6 => 0x3166, 0xd7 => 0x3167, 0xd8 => 0x3168,
+    0xd9 => 0x3169, 0xda => 0x316a, 0xdb => 0x316b, 0xdc => 0x316c,
+    0xdd => 0x316d, 0xde => 0x316e, 0xdf => 0x316f, 0xe0 => 0x3170,
+    0xe1 => 0x3171, 0xe2 => 0x3172, 0xe3 => 0x3173, 0xe4 => 0x3174,
+    0xe5 => 0x3175, 0xe6 => 0x3176, 0xe7 => 0x3177, 0xe8 => 0x3178,
+    0xe9 => 0x3179, 0xea => 0x317a, 0xeb => 0x317b, 0xec => 0x317c,
+    0xed => 0x317d, 0xee => 0x317e, 0xef => 0x317f, 0xf0 => 0x3180,
+    0xf1 => 0x3181, 0xf2 => 0x3182, 0xf3 => 0x3183, 0xf4 => 0x3184,
+    0xf5 => 0x3185, 0xf6 => 0x3186, 0xf7 => 0x3187, 0xf8 => 0x3188,
+    0xf9 => 0x3189, 0xfa => 0x318a, 0xfb => 0x318b, 0xfc => 0x318c,
+    0xfd => 0x318d, 0xfe => 0x318e,
+  },
+  0xa5 => {
+    0x41 => [0x30,0x20de], 0x42 => [0x31,0x20de], 0x43 => [0x32,0x20de],
+    0x44 => [0x33,0x20de], 0x45 => [0x34,0x20de], 0x46 => [0x35,0x20de],
+    0x47 => [0x36,0x20de], 0x48 => [0x37,0x20de], 0x49 => [0x38,0x20de],
+    0x4a => [0x39,0x20de], 0x4b => [0x24ea,0xf87f], 0x4c => [0x2460,0xf87f],
+    0x4d => [0x2461,0xf87f], 0x4e => [0x2462,0xf87f], 0x4f => [0x2463,0xf87f],
+    0x50 => [0x2464,0xf87f], 0x51 => [0x2465,0xf87f], 0x52 => [0x2466,0xf87f],
+    0x53 => [0x2467,0xf87f], 0x54 => [0x2468,0xf87f],
+    0x55 => [0xf860,0x41,0x29], 0x56 => [0xf860,0x42,0x29],
+    0x57 => [0xf860,0x43,0x29], 0x58 => [0xf860,0x44,0x29],
+    0x59 => [0xf860,0x45,0x29], 0x5a => [0xf860,0x46,0x29],
+    0x5b => [0xf860,0x47,0x29], 0x5c => [0xf860,0x48,0x29],
+    0x5d => [0xf860,0x49,0x29], 0x5e => [0xf860,0x4a,0x29],
+    0x5f => [0xf860,0x4b,0x29], 0x60 => [0xf860,0x4c,0x29],
+    0x61 => [0xf860,0x4d,0x29], 0x62 => [0xf860,0x4e,0x29],
+    0x63 => [0xf860,0x4f,0x29], 0x64 => [0xf860,0x50,0x29],
+    0x65 => [0xf860,0x51,0x29], 0x66 => [0xf860,0x52,0x29],
+    0x67 => [0xf860,0x53,0x29], 0x68 => [0xf860,0x54,0x29],
+    0x69 => [0xf860,0x55,0x29], 0x6a => [0xf860,0x56,0x29],
+    0x6b => [0xf860,0x57,0x29], 0x6c => [0xf860,0x58,0x29],
+    0x6d => [0xf860,0x59,0x29], 0x6e => [0xf860,0x5a,0x29],
+    0x6f => [0xf860,0x61,0x29], 0x70 => [0xf860,0x62,0x29],
+    0x71 => [0xf860,0x63,0x29], 0x72 => [0xf860,0x64,0x29],
+    0x73 => [0xf860,0x65,0x29], 0x74 => [0xf860,0x66,0x29],
+    0x75 => [0xf860,0x67,0x29], 0x76 => [0xf860,0x68,0x29],
+    0x77 => [0xf860,0x69,0x29], 0x78 => [0xf860,0x6a,0x29],
+    0x79 => [0xf860,0x6b,0x29], 0x7a => [0xf860,0x6c,0x29],
+    0x7b => [0xf860,0x6d,0x29], 0x7c => [0xf860,0x6e,0x29],
+    0x7d => [0xf860,0x6f,0x29], 0x81 => [0xf860,0x70,0x29],
+    0x82 => [0xf860,0x71,0x29], 0x83 => [0xf860,0x72,0x29],
+    0x84 => [0xf860,0x73,0x29], 0x85 => [0xf860,0x74,0x29],
+    0x86 => [0xf860,0x75,0x29], 0x87 => [0xf860,0x76,0x29],
+    0x88 => [0xf860,0x77,0x29], 0x89 => [0xf860,0x78,0x29],
+    0x8a => [0xf860,0x79,0x29], 0x8b => [0xf860,0x7a,0x29], 0xa1 => 0x2170,
+    0xa2 => 0x2171, 0xa3 => 0x2172, 0xa4 => 0x2173, 0xa5 => 0x2174,
+    0xa6 => 0x2175, 0xa7 => 0x2176, 0xa8 => 0x2177, 0xa9 => 0x2178,
+    0xaa => 0x2179, 0xb0 => 0x2160, 0xb1 => 0x2161, 0xb2 => 0x2162,
+    0xb3 => 0x2163, 0xb4 => 0x2164, 0xb5 => 0x2165, 0xb6 => 0x2166,
+    0xb7 => 0x2167, 0xb8 => 0x2168, 0xb9 => 0x2169, 0xc1 => 0x0391,
+    0xc2 => 0x0392, 0xc3 => 0x0393, 0xc4 => 0x0394, 0xc5 => 0x0395,
+    0xc6 => 0x0396, 0xc7 => 0x0397, 0xc8 => 0x0398, 0xc9 => 0x0399,
+    0xca => 0x039a, 0xcb => 0x039b, 0xcc => 0x039c, 0xcd => 0x039d,
+    0xce => 0x039e, 0xcf => 0x039f, 0xd0 => 0x03a0, 0xd1 => 0x03a1,
+    0xd2 => 0x03a3, 0xd3 => 0x03a4, 0xd4 => 0x03a5, 0xd5 => 0x03a6,
+    0xd6 => 0x03a7, 0xd7 => 0x03a8, 0xd8 => 0x03a9, 0xda => [0xff01,0xf874],
+    0xdb => [0x3002,0xf87d], 0xdc => [0x2032,0xf87f], 0xdd => [0x2033,0xf87f],
+    0xde => 0x2034, 0xe1 => 0x03b1, 0xe2 => 0x03b2, 0xe3 => 0x03b3,
+    0xe4 => 0x03b4, 0xe5 => 0x03b5, 0xe6 => 0x03b6, 0xe7 => 0x03b7,
+    0xe8 => 0x03b8, 0xe9 => 0x03b9, 0xea => 0x03ba, 0xeb => 0x03bb,
+    0xec => 0x03bc, 0xed => 0x03bd, 0xee => 0x03be, 0xef => 0x03bf,
+    0xf0 => 0x03c0, 0xf1 => 0x03c1, 0xf2 => 0x03c3, 0xf3 => 0x03c4,
+    0xf4 => 0x03c5, 0xf5 => 0x03c6, 0xf6 => 0x03c7, 0xf7 => 0x03c8,
+    0xf8 => 0x03c9, 0xf9 => [0x3257,0xf87a], 0xfa => [0x3258,0xf87a],
+    0xfb => [0x3259,0xf87a], 0xfc => [0x325a,0xf87a],
+  },
+  0xa6 => {
+    0x41 => [0xf83d,0xf87f], 0x42 => 0xf83d, 0x43 => [0x2020,0xf87c],
+    0x44 => [0xf860,0x2020,0x2020], 0x45 => [0xf860,0x2021,0x2021],
+    0x46 => [0xf861,0x2020,0x2020,0x2020], 0x47 => [0xa7,0xf87c],
+    0x48 => 0x266f, 0x49 => [0xff0a,0xf87f], 0x4a => [0xff0a,0xf873],
+    0x4b => [0x2051,0xf874], 0x4c => [0xf860,0x2a,0x2a], 0x4d => 0x2042,
+    0x4e => 0x204e, 0x4f => [0x2051,0xf871], 0x50 => [0xf867,0x2a,0x2a],
+    0x51 => [0x2042,0xf879], 0x52 => 0x273d, 0x53 => 0x2731, 0x54 => 0x2747,
+    0x55 => 0x2022, 0x56 => [0x25a0,0x20df], 0x57 => [0x25c7,0x20df],
+    0x58 => 0xf805, 0x59 => [0x25a1,0x20df], 0x5a => 0x2039, 0x5b => 0x203a,
+    0x5c => 0xab, 0x5d => 0xbb, 0x5e => [0x261c,0xf87f],
+    0x5f => [0x261e,0xf87f], 0x60 => [0xf806,0x20df],
+    0x61 => [0x25c7,0x20df,0x20df], 0x62 => [0x25c7,0x20de], 0x63 => 0xf806,
+    0x64 => 0x29c8, 0x65 => [0x25c6,0x20de], 0x66 => [0xf805,0x20de],
+    0x67 => [0x29c8,0x20de], 0x68 => 0x29be, 0x69 => [0x25ce,0x20dd],
+    0x6a => [0x25b3,0x20dd], 0x6b => [0x25b2,0x20dd], 0x6c => 0x271a,
+    0x6d => 0x2716, 0x6e => 0x29bf, 0x6f => 0x25ef, 0x70 => [0x25ef,0xf87c],
+    0x71 => [0x2610,0xf87c], 0x72 => 0x2723, 0x73 => 0x2756, 0x74 => 0xf80a,
+    0x75 => 0x25cc, 0x76 => [0x2610,0xf87f], 0x77 => 0x2610, 0x78 => 0x25a2,
+    0x79 => [0x2723,0xf87a], 0x7a => [0x2756,0xf87a], 0x7b => [0x273f,0xf87a],
+    0x7c => 0x273f, 0x7d => [0x3013,0xf87c], 0x81 => 0xf809,
+    0x82 => [0x25c9,0x20dd], 0x83 => 0x274d, 0x84 => 0x25cd,
+    0x85 => [0x27e1,0x20dd], 0x86 => [0xf80b,0xf87f], 0x87 => [0x2720,0xf87a],
+    0x88 => 0x2720, 0x89 => [0x25c8,0xf87f], 0x8a => [0x25a8,0xf87f],
+    0x8d => 0x2741, 0x8e => [0x2756,0xf87f], 0x8f => 0xf808,
+    0x90 => [0x20a9,0xf87f], 0x91 => [0xf809,0xf87a], 0x92 => [0x534d,0xf87f],
+    0x93 => 0x262f, 0x96 => 0xf80b, 0x97 => [0x262f,0xf87a],
+    0x98 => [0x262f,0xf876], 0x99 => 0x2740, 0x9a => 0xf80c,
+    0x9b => [0x2748,0x20d8], 0x9e => 0x3020, 0x9f => 0xf807, 0xa1 => 0x2500,
+    0xa2 => 0x2502, 0xa3 => 0x250c, 0xa4 => 0x2510, 0xa5 => 0x2518,
+    0xa6 => 0x2514, 0xa7 => 0x251c, 0xa8 => 0x252c, 0xa9 => 0x2524,
+    0xaa => 0x2534, 0xab => 0x253c, 0xac => 0x2501, 0xad => 0x2503,
+    0xae => 0x250f, 0xaf => 0x2513, 0xb0 => 0x251b, 0xb1 => 0x2517,
+    0xb2 => 0x2523, 0xb3 => 0x2533, 0xb4 => 0x252b, 0xb5 => 0x253b,
+    0xb6 => 0x254b, 0xb7 => 0x2520, 0xb8 => 0x252f, 0xb9 => 0x2528,
+    0xba => 0x2537, 0xbb => 0x253f, 0xbc => 0x251d, 0xbd => 0x2530,
+    0xbe => 0x2525, 0xbf => 0x2538, 0xc0 => 0x2542, 0xc1 => 0x2512,
+    0xc2 => 0x2511, 0xc3 => 0x251a, 0xc4 => 0x2519, 0xc5 => 0x2516,
+    0xc6 => 0x2515, 0xc7 => 0x250e, 0xc8 => 0x250d, 0xc9 => 0x251e,
+    0xca => 0x251f, 0xcb => 0x2521, 0xcc => 0x2522, 0xcd => 0x2526,
+    0xce => 0x2527, 0xcf => 0x2529, 0xd0 => 0x252a, 0xd1 => 0x252d,
+    0xd2 => 0x252e, 0xd3 => 0x2531, 0xd4 => 0x2532, 0xd5 => 0x2535,
+    0xd6 => 0x2536, 0xd7 => 0x2539, 0xd8 => 0x253a, 0xd9 => 0x253d,
+    0xda => 0x253e, 0xdb => 0x2540, 0xdc => 0x2541, 0xdd => 0x2543,
+    0xde => 0x2544, 0xdf => 0x2545, 0xe0 => 0x2546, 0xe1 => 0x2547,
+    0xe2 => 0x2548, 0xe3 => 0x2549, 0xe4 => 0x254a, 0xe5 => 0x2776,
+    0xe6 => 0x2777, 0xe7 => 0x2778, 0xe8 => 0x2779, 0xe9 => 0x277a,
+    0xea => 0x277b, 0xeb => 0x277c, 0xec => 0x277d, 0xed => 0x277e,
+    0xee => 0x277f, 0xef => 0x24eb, 0xf0 => 0x24ec, 0xf1 => 0x24ed,
+    0xf2 => 0x24ee, 0xf3 => 0x24ef, 0xf4 => 0x24f0, 0xf5 => 0x24f1,
+    0xf6 => 0x24f2, 0xf7 => 0x24f3, 0xf8 => 0x24f4, 0xf9 => [0x3251,0xf87a],
+    0xfa => [0x3252,0xf87a], 0xfb => [0x3253,0xf87a], 0xfc => [0x3254,0xf87a],
+    0xfd => [0x3255,0xf87a], 0xfe => [0x3256,0xf87a],
+  },
+  0xa7 => {
+    0x41 => [0x2642,0xf87f], 0x42 => 0x3012, 0x43 => 0x3036,
+    0x44 => [0x25cb,0xf87f], 0x45 => [0x25b3,0xf87f], 0x46 => 0x25fb,
+    0x47 => 0xf84c, 0x48 => [0x2394,0xf876], 0x49 => [0x25ad,0xf878],
+    0x4a => 0x25ad, 0x4b => 0xf84d, 0x4c => 0xf84e, 0x4d => 0xf84f,
+    0x4e => [0x25c7,0xf87f], 0x4f => [0x51f9,0xf87f], 0x50 => [0x51f8,0xf87f],
+    0x51 => 0x2206, 0x52 => [0x2206,0xf87f], 0x53 => 0x221f,
+    0x54 => [0x222a,0xf87f], 0x55 => 0x2225, 0x56 => 0x2226,
+    0x57 => [0x2229,0xf87f], 0x58 => 0x2253, 0x59 => 0x2251, 0x5a => 0x2266,
+    0x5b => 0x2267, 0x5c => 0x2213, 0x5d => 0x2295, 0x5e => 0x2296,
+    0x5f => 0x2297, 0x60 => 0x2a38, 0x61 => 0x2314, 0x62 => [0x3d,0x20e5],
+    0x63 => [0x2261,0x20e5], 0x64 => 0x2262, 0x65 => [0x3d,0x20d2],
+    0x66 => 0x25b1, 0x67 => [0x2d,0x0308], 0x68 => 0x2222, 0x69 => 0x2250,
+    0x6a => 0x03d5, 0x6b => 0x2ae8, 0x6c => 0x22a3, 0x6d => [0x22a5,0x0338],
+    0x6e => [0x2261,0x20d2], 0x6f => 0x226e, 0x70 => 0x226f, 0x71 => 0x2285,
+    0x72 => 0x2284, 0x73 => 0x2209, 0x74 => 0x220c, 0x75 => 0x22bb,
+    0x76 => 0x22bc, 0x77 => 0x225a, 0x78 => 0x2306, 0x79 => [0x223d,0x0336],
+    0x7a => [0x2314,0xf87f], 0x7b => 0x2a72, 0x7c => [0x88dc,0x20e4],
+    0x7d => [0xf862,0xc8fc,0xc2dd,0xd68c,0xc0ac],
+    0x81 => [0xf863,0xc8fc,0xc2dd,0xd68c,0xc0ac], 0x82 => 0x329e,
+    0x83 => [0x329e,0xf87f], 0x84 => 0x203c, 0x85 => 0x2049,
+    0x86 => [0x203c,0xf87f], 0x87 => 0x2047, 0x88 => [0x25c7,0xf87c],
+    0x89 => [0x25c7,0xf879], 0x8a => [0x25c7,0xf87b], 0x8b => [0x25c6,0xf879],
+    0x8c => [0x25a1,0xf87c], 0x8d => [0x25a1,0xf879], 0x8e => [0x25a1,0xf87b],
+    0x8f => 0x2588, 0x90 => 0x25e6, 0x91 => [0x25cb,0xf879],
+    0x92 => [0x25cb,0xf87b], 0x93 => [0x25cf,0xf879], 0x94 => 0x25bf,
+    0x95 => 0x25b5, 0x96 => 0x25b9, 0x97 => 0x25c3, 0x98 => 0x2666,
+    0x99 => 0x2981, 0x9a => 0x25fc, 0x9b => [0x25b4,0x20e4], 0x9c => 0x25ca,
+    0x9d => 0x3231, 0x9e => 0x3239, 0x9f => 0x33cb, 0xa1 => 0x3395,
+    0xa2 => 0x3396, 0xa3 => 0x3397, 0xa4 => 0x2113, 0xa5 => 0x3398,
+    0xa6 => 0x33c4, 0xa7 => 0x33a3, 0xa8 => 0x33a4, 0xa9 => 0x33a5,
+    0xaa => 0x33a6, 0xab => 0x3399, 0xac => 0x339a, 0xad => 0x339b,
+    0xae => 0x339c, 0xaf => 0x339d, 0xb0 => 0x339e, 0xb1 => 0x339f,
+    0xb2 => 0x33a0, 0xb3 => 0x33a1, 0xb4 => 0x33a2, 0xb5 => 0x33ca,
+    0xb6 => 0x338d, 0xb7 => 0x338e, 0xb8 => 0x338f, 0xb9 => 0x33cf,
+    0xba => 0x3388, 0xbb => 0x3389, 0xbc => 0x33c8, 0xbd => 0x33a7,
+    0xbe => 0x33a8, 0xbf => 0x33b0, 0xc0 => 0x33b1, 0xc1 => 0x33b2,
+    0xc2 => 0x33b3, 0xc3 => 0x33b4, 0xc4 => 0x33b5, 0xc5 => 0x33b6,
+    0xc6 => 0x33b7, 0xc7 => 0x33b8, 0xc8 => 0x33b9, 0xc9 => 0x3380,
+    0xca => 0x3381, 0xcb => 0x3382, 0xcc => 0x3383, 0xcd => 0x3384,
+    0xce => 0x33ba, 0xcf => 0x33bb, 0xd0 => 0x33bc, 0xd1 => 0x33bd,
+    0xd2 => 0x33be, 0xd3 => 0x33bf, 0xd4 => 0x3390, 0xd5 => 0x3391,
+    0xd6 => 0x3392, 0xd7 => 0x3393, 0xd8 => 0x3394, 0xd9 => 0x2126,
+    0xda => 0x33c0, 0xdb => 0x33c1, 0xdc => 0x338a, 0xdd => 0x338b,
+    0xde => 0x338c, 0xdf => 0x33d6, 0xe0 => 0x33c5, 0xe1 => 0x33ad,
+    0xe2 => 0x33ae, 0xe3 => 0x33af, 0xe4 => 0x33db, 0xe5 => 0x33a9,
+    0xe6 => 0x33aa, 0xe7 => 0x33ab, 0xe8 => 0x33ac, 0xe9 => 0x33dd,
+    0xea => 0x33d0, 0xeb => 0x33d3, 0xec => 0x33c3, 0xed => 0x33c9,
+    0xee => 0x33dc, 0xef => 0x33c6, 0xf0 => 0x246f, 0xf1 => 0x2470,
+    0xf2 => 0x2471, 0xf3 => 0x2472, 0xf4 => 0x2473, 0xf5 => 0x3251,
+    0xf6 => 0x3252, 0xf7 => 0x3253, 0xf8 => 0x3254, 0xf9 => 0x3255,
+    0xfa => 0x3256, 0xfb => 0x3257, 0xfc => 0x3258, 0xfd => 0x3259,
+    0xfe => 0x325a,
+  },
+  0xa8 => {
+    0x41 => [0x2192,0xf87b], 0x42 => [0x2190,0xf87b], 0x43 => [0x2191,0xf87b],
+    0x44 => [0x2193,0xf87b], 0x45 => [0x2196,0xf87b], 0x46 => [0x2197,0xf87b],
+    0x47 => [0x2198,0xf87b], 0x48 => [0x2199,0xf87b], 0x49 => 0x21d0,
+    0x4a => 0x21cf, 0x4b => 0x21cd, 0x4c => [0x21d4,0xf87f],
+    0x4d => [0x2192,0xf87c], 0x4e => [0x2190,0xf87c], 0x4f => [0x2191,0xf87c],
+    0x50 => [0x2193,0xf87c], 0x51 => [0x2194,0xf87c], 0x52 => [0x2195,0xf87c],
+    0x53 => [0x2190,0xf879], 0x54 => [0x2192,0xf879], 0x55 => [0x2191,0xf879],
+    0x56 => [0x2193,0xf879], 0x57 => [0x21e6,0x20de], 0x58 => [0x21e8,0x20de],
+    0x59 => [0x21e7,0x20de], 0x5a => [0x21e9,0x20de], 0x5b => [0x21e6,0x20dd],
+    0x5c => 0x27b2, 0x5d => [0x21e7,0x20dd], 0x5e => [0x21e9,0x20dd],
+    0x5f => [0x2190,0xf87f], 0x60 => 0x279c, 0x61 => [0x2191,0xf87f],
+    0x62 => [0x2193,0xf87f], 0x63 => [0x2190,0xf875], 0x64 => [0x2192,0xf875],
+    0x65 => [0x2191,0xf875], 0x66 => [0x2193,0xf875], 0x67 => 0xf846,
+    0x68 => 0xf847, 0x69 => [0x2190,0xf871], 0x6a => 0x279b,
+    0x6b => [0x2190,0xf872], 0x6c => [0x2192,0xf872], 0x6d => [0x2191,0xf872],
+    0x6e => [0x2193,0xf872], 0x6f => 0x2962, 0x70 => 0x2964, 0x71 => 0x2963,
+    0x72 => 0x2965, 0x73 => [0x21e6,0xf87a], 0x74 => 0x27a1,
+    0x75 => [0x21e7,0xf87a], 0x76 => [0x21e9,0xf87a], 0x77 => [0x21e6,0xf87b],
+    0x78 => 0x279e, 0x79 => [0x21e7,0xf87b], 0x7a => [0x21e9,0xf87b],
+    0x7b => 0x21b2, 0x7c => 0x21b1, 0x7d => [0x21bb,0xf87b], 0x81 => 0x21b4,
+    0x82 => 0x21b0, 0x83 => 0x21b3, 0x84 => [0x2939,0xf87f],
+    0x85 => [0x2934,0xf87f], 0x86 => 0x2936, 0x87 => [0x21b1,0xf87f],
+    0x88 => [0x21bb,0xf87f], 0x89 => 0x2935, 0x8a => [0x21b0,0xf87f],
+    0x8b => 0x2937, 0x8c => 0x2939, 0x8d => 0x2934, 0x8e => [0x21e6,0xf879],
+    0x8f => [0x21e8,0xf879], 0x90 => [0x21e7,0xf879], 0x91 => [0x21e9,0xf879],
+    0x92 => 0x21bc, 0x93 => 0x21c0, 0x94 => 0xf841, 0x95 => [0x21d4,0xf879],
+    0x96 => [0x21e8,0xf874], 0x97 => [0x21e6,0xf874], 0x98 => [0x21c0,0xf879],
+    0x99 => [0x21bc,0xf879], 0x9a => [0x21d2,0xf87c], 0x9b => [0x21d0,0xf87c],
+    0x9c => 0xf849, 0x9d => 0xf848, 0x9e => 0x21c4, 0x9f => 0x21c5,
+    0xa1 => 0xc6, 0xa2 => 0xd0, 0xa3 => 0xaa, 0xa4 => 0x0126, 0xa6 => 0x0132,
+    0xa8 => 0x013f, 0xa9 => 0x0141, 0xaa => 0xd8, 0xab => 0x0152, 0xac => 0xba,
+    0xad => 0xde, 0xae => 0x0166, 0xaf => 0x014a, 0xb1 => 0x3260,
+    0xb2 => 0x3261, 0xb3 => 0x3262, 0xb4 => 0x3263, 0xb5 => 0x3264,
+    0xb6 => 0x3265, 0xb7 => 0x3266, 0xb8 => 0x3267, 0xb9 => 0x3268,
+    0xba => 0x3269, 0xbb => 0x326a, 0xbc => 0x326b, 0xbd => 0x326c,
+    0xbe => 0x326d, 0xbf => 0x326e, 0xc0 => 0x326f, 0xc1 => 0x3270,
+    0xc2 => 0x3271, 0xc3 => 0x3272, 0xc4 => 0x3273, 0xc5 => 0x3274,
+    0xc6 => 0x3275, 0xc7 => 0x3276, 0xc8 => 0x3277, 0xc9 => 0x3278,
+    0xca => 0x3279, 0xcb => 0x327a, 0xcc => 0x327b, 0xcd => 0x24d0,
+    0xce => 0x24d1, 0xcf => 0x24d2, 0xd0 => 0x24d3, 0xd1 => 0x24d4,
+    0xd2 => 0x24d5, 0xd3 => 0x24d6, 0xd4 => 0x24d7, 0xd5 => 0x24d8,
+    0xd6 => 0x24d9, 0xd7 => 0x24da, 0xd8 => 0x24db, 0xd9 => 0x24dc,
+    0xda => 0x24dd, 0xdb => 0x24de, 0xdc => 0x24df, 0xdd => 0x24e0,
+    0xde => 0x24e1, 0xdf => 0x24e2, 0xe0 => 0x24e3, 0xe1 => 0x24e4,
+    0xe2 => 0x24e5, 0xe3 => 0x24e6, 0xe4 => 0x24e7, 0xe5 => 0x24e8,
+    0xe6 => 0x24e9, 0xe7 => 0x2460, 0xe8 => 0x2461, 0xe9 => 0x2462,
+    0xea => 0x2463, 0xeb => 0x2464, 0xec => 0x2465, 0xed => 0x2466,
+    0xee => 0x2467, 0xef => 0x2468, 0xf0 => 0x2469, 0xf1 => 0x246a,
+    0xf2 => 0x246b, 0xf3 => 0x246c, 0xf4 => 0x246d, 0xf5 => 0x246e,
+    0xf6 => 0xbd, 0xf7 => 0x2153, 0xf8 => 0x2154, 0xf9 => 0xbc, 0xfa => 0xbe,
+    0xfb => 0x215b, 0xfc => 0x215c, 0xfd => 0x215d, 0xfe => 0x215e,
+  },
+  0xa9 => {
+    0x41 => [0xf860,0x41,0x2e], 0x42 => [0xf860,0x42,0x2e],
+    0x43 => [0xf860,0x43,0x2e], 0x44 => [0xf860,0x44,0x2e],
+    0x45 => [0xf860,0x45,0x2e], 0x46 => [0xf860,0x46,0x2e],
+    0x47 => [0xf860,0x47,0x2e], 0x48 => [0xf860,0x48,0x2e],
+    0x49 => [0xf860,0x49,0x2e], 0x4a => [0xf860,0x4a,0x2e],
+    0x4b => [0xf860,0x4b,0x2e], 0x4c => [0xf860,0x4c,0x2e],
+    0x4d => [0xf860,0x4d,0x2e], 0x4e => [0xf860,0x4e,0x2e],
+    0x4f => [0xf860,0x4f,0x2e], 0x50 => [0xf860,0x50,0x2e],
+    0x51 => [0xf860,0x51,0x2e], 0x52 => [0xf860,0x52,0x2e],
+    0x53 => [0xf860,0x53,0x2e], 0x54 => [0xf860,0x54,0x2e],
+    0x55 => [0xf860,0x55,0x2e], 0x56 => [0xf860,0x56,0x2e],
+    0x57 => [0xf860,0x57,0x2e], 0x58 => [0xf860,0x58,0x2e],
+    0x59 => [0xf860,0x59,0x2e], 0x5a => [0xf860,0x5a,0x2e],
+    0x5b => [0xf860,0x61,0x2e], 0x5c => [0xf860,0x62,0x2e],
+    0x5d => [0xf860,0x63,0x2e], 0x5e => [0xf860,0x64,0x2e],
+    0x5f => [0xf860,0x65,0x2e], 0x60 => [0xf860,0x66,0x2e],
+    0x61 => [0xf860,0x67,0x2e], 0x62 => [0xf860,0x68,0x2e],
+    0x63 => [0xf860,0x69,0x2e], 0x64 => [0xf860,0x6a,0x2e],
+    0x65 => [0xf860,0x6b,0x2e], 0x66 => [0xf860,0x6c,0x2e],
+    0x67 => [0xf860,0x6d,0x2e], 0x68 => [0xf860,0x6e,0x2e],
+    0x69 => [0xf860,0x6f,0x2e], 0x6a => [0xf860,0x70,0x2e],
+    0x6b => [0xf860,0x71,0x2e], 0x6c => [0xf860,0x72,0x2e],
+    0x6d => [0xf860,0x73,0x2e], 0x6e => [0xf860,0x74,0x2e],
+    0x6f => [0xf860,0x75,0x2e], 0x70 => [0xf860,0x76,0x2e],
+    0x71 => [0xf860,0x77,0x2e], 0x72 => [0xf860,0x78,0x2e],
+    0x73 => [0xf860,0x79,0x2e], 0x74 => [0xf860,0x7a,0x2e], 0xa1 => 0xe6,
+    0xa2 => 0x0111, 0xa3 => 0xf0, 0xa4 => 0x0127, 0xa5 => 0x0131,
+    0xa6 => 0x0133, 0xa7 => 0x0138, 0xa8 => 0x0140, 0xa9 => 0x0142,
+    0xaa => 0xf8, 0xab => 0x0153, 0xac => 0xdf, 0xad => 0xfe, 0xae => 0x0167,
+    0xaf => 0x014b, 0xb0 => 0x0149, 0xb1 => 0x3200, 0xb2 => 0x3201,
+    0xb3 => 0x3202, 0xb4 => 0x3203, 0xb5 => 0x3204, 0xb6 => 0x3205,
+    0xb7 => 0x3206, 0xb8 => 0x3207, 0xb9 => 0x3208, 0xba => 0x3209,
+    0xbb => 0x320a, 0xbc => 0x320b, 0xbd => 0x320c, 0xbe => 0x320d,
+    0xbf => 0x320e, 0xc0 => 0x320f, 0xc1 => 0x3210, 0xc2 => 0x3211,
+    0xc3 => 0x3212, 0xc4 => 0x3213, 0xc5 => 0x3214, 0xc6 => 0x3215,
+    0xc7 => 0x3216, 0xc8 => 0x3217, 0xc9 => 0x3218, 0xca => 0x3219,
+    0xcb => 0x321a, 0xcc => 0x321b, 0xcd => 0x249c, 0xce => 0x249d,
+    0xcf => 0x249e, 0xd0 => 0x249f, 0xd1 => 0x24a0, 0xd2 => 0x24a1,
+    0xd3 => 0x24a2, 0xd4 => 0x24a3, 0xd5 => 0x24a4, 0xd6 => 0x24a5,
+    0xd7 => 0x24a6, 0xd8 => 0x24a7, 0xd9 => 0x24a8, 0xda => 0x24a9,
+    0xdb => 0x24aa, 0xdc => 0x24ab, 0xdd => 0x24ac, 0xde => 0x24ad,
+    0xdf => 0x24ae, 0xe0 => 0x24af, 0xe1 => 0x24b0, 0xe2 => 0x24b1,
+    0xe3 => 0x24b2, 0xe4 => 0x24b3, 0xe5 => 0x24b4, 0xe6 => 0x24b5,
+    0xe7 => 0x2474, 0xe8 => 0x2475, 0xe9 => 0x2476, 0xea => 0x2477,
+    0xeb => 0x2478, 0xec => 0x2479, 0xed => 0x247a, 0xee => 0x247b,
+    0xef => 0x247c, 0xf0 => 0x247d, 0xf1 => 0x247e, 0xf2 => 0x247f,
+    0xf3 => 0x2480, 0xf4 => 0x2481, 0xf5 => 0x2482, 0xf6 => 0xb9, 0xf7 => 0xb2,
+    0xf8 => 0xb3, 0xf9 => 0x2074, 0xfa => 0x207f, 0xfb => 0x2081,
+    0xfc => 0x2082, 0xfd => 0x2083, 0xfe => 0x2084,
+  },
+  0xaa => {
+    0x41 => [0xc6b4,0x20de], 0x42 => [0xb2f5,0x20de], 0x43 => [0xc8fc,0x20de],
+    0x44 => [0xba85,0x20de], 0x45 => [0xb300,0x20de], 0x46 => [0xd615,0x20de],
+    0x47 => [0xbd80,0x20de], 0x48 => [0xc804,0x20de], 0x49 => [0xc811,0x20de],
+    0x4a => [0xc218,0x20de], 0x4b => [0xb3d9,0x20de], 0x4c => [0xbe44,0x20de],
+    0x4d => [0xbc18,0x20de], 0x4e => [0xc790,0x20de], 0x4f => [0xd0c0,0x20de],
+    0x50 => [0xac10,0x20de], 0x51 => [0xc57d,0x20de], 0x52 => [0xc778,0x20de],
+    0x53 => [0xb73b,0x20de], 0x54 => [0x5370,0x20de], 0x55 => [0x8a3b,0x20de],
+    0x56 => [0xc608,0x20de], 0x57 => [0x611f,0x20de], 0x58 => [0x51a0,0x20de],
+    0x59 => [0x7b54,0x20de], 0x5a => [0x4ee3,0x20de], 0x5b => [0x982d,0x20de],
+    0x5c => [0x52d5,0x20de], 0x5d => [0x540d,0x20de], 0x5e => [0x76ee,0x20de],
+    0x5f => [0x53cd,0x20de], 0x60 => [0x88dc,0x20de], 0x61 => [0x672c,0x20de],
+    0x62 => [0x526f,0x20de], 0x63 => [0x5e8f,0x20de], 0x64 => [0x9023,0x20de],
+    0x65 => [0x5f71,0x20de], 0x66 => [0x4f8b,0x20de], 0x67 => [0x6e90,0x20de],
+    0x68 => [0x5b50,0x20de], 0x69 => [0x524d,0x20de], 0x6a => [0x7bc0,0x20de],
+    0x6b => [0x63a5,0x20de], 0x6c => [0x52a9,0x20de], 0x6d => [0x6307,0x20de],
+    0x6e => [0x4ed6,0x20de], 0x6f => [0x6d3e,0x20de], 0x70 => [0x5f62,0x20de],
+    0x71 => [0xc870,0x20de], 0x72 => [0xbb38,0x20de,0xf87a],
+    0x73 => [0xb2f5,0x20de,0xf87a], 0x74 => [0xc8fc,0x20de,0xf87a],
+    0x75 => [0xb73b,0x20de,0xf87a], 0x76 => [0x8a3b,0x20de,0xf87a],
+    0x77 => [0xad50,0x20de,0xf87a], 0x78 => [0xc5ed,0x20de,0xf87a],
+    0x79 => [0xc74c,0x20de,0xf87a], 0x7a => [0xc815,0x20de,0xf87a],
+    0x7b => [0xd574,0x20de,0xf87a], 0x7c => [0xc608,0x20de,0xf87a],
+    0x7d => [0xc874,0x20dd], 0x81 => [0xb77c,0x20dd], 0x82 => [0xb9c8,0x20dd],
+    0x83 => [0xbc14,0x20dd], 0x84 => [0xc0ac,0x20dd], 0x85 => [0xc544,0x20dd],
+    0x86 => [0xc790,0x20dd], 0x87 => [0xcc28,0x20dd], 0x88 => [0xce74,0x20dd],
+    0x89 => [0xd0c0,0x20dd], 0x8a => [0xd30c,0x20dd], 0x8b => [0xb192,0x20dd],
+    0x8c => [0xb0ae,0x20dd], 0x8d => [0xba85,0x20dd], 0x8e => [0xb300,0x20dd],
+    0x8f => [0xd615,0x20dd], 0x90 => [0xbd80,0x20dd], 0x91 => [0xc804,0x20dd],
+    0x92 => [0xc811,0x20dd], 0x93 => [0xc218,0x20dd], 0x94 => [0xb3d9,0x20dd],
+    0x95 => [0xbe44,0x20dd], 0x96 => [0xac8c,0x20dd], 0x97 => [0xbc18,0x20dd],
+    0x98 => [0xc18d,0x20dd], 0x99 => [0xc778,0x20dd], 0x9a => [0xbcf8,0x20dd],
+    0x9b => [0xc57d,0x20dd], 0x9c => [0xc219,0x20dd], 0x9d => [0xc720,0x20dd],
+    0x9e => [0xad00,0x20dd], 0x9f => [0x51a0,0x20dd], 0xa1 => 0x3041,
+    0xa2 => 0x3042, 0xa3 => 0x3043, 0xa4 => 0x3044, 0xa5 => 0x3045,
+    0xa6 => 0x3046, 0xa7 => 0x3047, 0xa8 => 0x3048, 0xa9 => 0x3049,
+    0xaa => 0x304a, 0xab => 0x304b, 0xac => 0x304c, 0xad => 0x304d,
+    0xae => 0x304e, 0xaf => 0x304f, 0xb0 => 0x3050, 0xb1 => 0x3051,
+    0xb2 => 0x3052, 0xb3 => 0x3053, 0xb4 => 0x3054, 0xb5 => 0x3055,
+    0xb6 => 0x3056, 0xb7 => 0x3057, 0xb8 => 0x3058, 0xb9 => 0x3059,
+    0xba => 0x305a, 0xbb => 0x305b, 0xbc => 0x305c, 0xbd => 0x305d,
+    0xbe => 0x305e, 0xbf => 0x305f, 0xc0 => 0x3060, 0xc1 => 0x3061,
+    0xc2 => 0x3062, 0xc3 => 0x3063, 0xc4 => 0x3064, 0xc5 => 0x3065,
+    0xc6 => 0x3066, 0xc7 => 0x3067, 0xc8 => 0x3068, 0xc9 => 0x3069,
+    0xca => 0x306a, 0xcb => 0x306b, 0xcc => 0x306c, 0xcd => 0x306d,
+    0xce => 0x306e, 0xcf => 0x306f, 0xd0 => 0x3070, 0xd1 => 0x3071,
+    0xd2 => 0x3072, 0xd3 => 0x3073, 0xd4 => 0x3074, 0xd5 => 0x3075,
+    0xd6 => 0x3076, 0xd7 => 0x3077, 0xd8 => 0x3078, 0xd9 => 0x3079,
+    0xda => 0x307a, 0xdb => 0x307b, 0xdc => 0x307c, 0xdd => 0x307d,
+    0xde => 0x307e, 0xdf => 0x307f, 0xe0 => 0x3080, 0xe1 => 0x3081,
+    0xe2 => 0x3082, 0xe3 => 0x3083, 0xe4 => 0x3084, 0xe5 => 0x3085,
+    0xe6 => 0x3086, 0xe7 => 0x3087, 0xe8 => 0x3088, 0xe9 => 0x3089,
+    0xea => 0x308a, 0xeb => 0x308b, 0xec => 0x308c, 0xed => 0x308d,
+    0xee => 0x308e, 0xef => 0x308f, 0xf0 => 0x3090, 0xf1 => 0x3091,
+    0xf2 => 0x3092, 0xf3 => 0x3093, 0xf4 => 0x2483, 0xf5 => 0x2484,
+    0xf6 => 0x2485, 0xf7 => 0x2486, 0xf8 => 0x2487,
+    0xf9 => [0xf862,0x28,0x32,0x31,0x29], 0xfa => [0xf862,0x28,0x32,0x32,0x29],
+    0xfb => [0xf862,0x28,0x32,0x33,0x29], 0xfc => [0xf862,0x28,0x32,0x34,0x29],
+    0xfd => [0xf862,0x28,0x32,0x35,0x29], 0xfe => [0xf862,0x28,0x32,0x36,0x29],
+  },
+  0xab => {
+    0x41 => [0xc870,0x20dd], 0x42 => [0xad6d,0x20dd], 0x43 => [0xac10,0x20dd],
+    0x44 => [0x5370,0x20dd], 0x45 => [0x8863,0x20dd], 0x46 => [0x672b,0x20dd],
+    0x47 => [0xac70,0x20dd], 0x48 => [0xb2f5,0x20dd], 0x49 => [0xbcc0,0x20dd],
+    0x4a => [0xc0c1,0x20dd], 0x4b => [0xc13c,0x20dd], 0x4c => [0xc2e0,0x20dd],
+    0x4d => [0xc5ec,0x20dd], 0x4e => [0xc608,0x20dd], 0x4f => [0xc6d0,0x20dd],
+    0x50 => [0xc791,0x20dd], 0x51 => [0xc900,0x20dd], 0x52 => [0xd0b9,0x20dd],
+    0x53 => [0xc678,0x20dd], 0x54 => [0xd65c,0x20dd], 0x55 => [0xac04,0x20dd],
+    0x56 => [0xac19,0x20dd], 0x57 => [0xc2e4,0x20dd], 0x58 => [0x611f,0x20dd],
+    0x59 => [0x6163,0x20dd], 0x5a => [0x4ee3,0x20dd], 0x5b => [0x52d5,0x20dd],
+    0x5c => 0x3294, 0x5d => [0x53cd,0x20dd], 0x5e => [0x526f,0x20dd],
+    0x5f => [0x81ea,0x20dd], 0x60 => [0x524d,0x20dd], 0x61 => [0x96fb,0x20dd],
+    0x62 => [0x63a5,0x20dd], 0x63 => [0x52a9,0x20dd], 0x64 => [0x6ce8,0x20dd],
+    0x65 => [0x53c3,0x20dd], 0x66 => [0x672c,0x20dd], 0x67 => [0x65b0,0x20dd],
+    0x68 => [0x73fe,0x20dd], 0x69 => [0x5f62,0x20dd], 0x6a => [0x9593,0x20dd],
+    0x6b => [0x570b,0x20dd], 0x6c => 0x32a5, 0x6d => [0x4ed6,0x20dd],
+    0x6e => [0xbe60,0x20dd], 0x6f => [0xc2dc,0x20dd], 0x70 => [0xc785,0x20dd],
+    0x71 => [0xc73c,0x20dd], 0x72 => [0xc74c,0x20dd], 0x73 => [0xc9c1,0x20dd],
+    0x74 => [0xd45c,0x20dd], 0x75 => [0xac00,0x20dd], 0x76 => [0xb098,0x20dd],
+    0x77 => [0xb2e4,0x20dd], 0x78 => [0xd558,0x20dd],
+    0x79 => [0xb9c8,0x20dd,0xf87a], 0x7a => [0xbc14,0x20dd,0xf87a],
+    0x7b => [0xc0ac,0x20dd,0xf87a], 0x7c => [0xc544,0x20dd,0xf87a],
+    0x7d => [0xc790,0x20dd,0xf87a], 0x81 => [0xcc28,0x20dd,0xf87a],
+    0x82 => [0xce74,0x20dd,0xf87a], 0x83 => [0xd0c0,0x20dd,0xf87a],
+    0x84 => [0xd30c,0x20dd,0xf87a], 0x85 => [0xd558,0x20dd,0xf87a],
+    0x86 => [0xbe44,0x20dd,0xf87a], 0x87 => [0xb2f5,0x20dd,0xf87a],
+    0x88 => [0xbe60,0x20dd,0xf87a], 0x89 => [0xbcf8,0x20dd,0xf87a],
+    0x8a => [0xb2e8,0x20dd,0xf87a], 0x8b => [0xc13c,0x20dd,0xf87a],
+    0x8c => [0xc2dc,0x20dd,0xf87a], 0x8d => [0xc5ec,0x20dd,0xf87a],
+    0x8e => [0xc608,0x20dd,0xf87a], 0x8f => [0xc73c,0x20dd,0xf87a],
+    0x90 => [0xc74c,0x20dd,0xf87a], 0x91 => [0xc785,0x20dd,0xf87a],
+    0x92 => [0xc81c,0x20dd,0xf87a], 0x93 => [0xc874,0x20dd,0xf87a],
+    0x94 => [0xc900,0x20dd,0xf87a], 0x95 => [0xd45c,0x20dd,0xf87a],
+    0x96 => [0xd574,0x20dd,0xf87a], 0x97 => [0xb290,0x20dd,0xf87a],
+    0x98 => [0xb192,0x20dd,0xf87a], 0x99 => [0xb0ae,0x20dd,0xf87a],
+    0x9a => [0xbc18,0x20dd,0xf87a], 0x9b => [0xac00,0x20dd,0xf87a],
+    0x9c => [0xb098,0x20dd,0xf87a], 0x9d => [0xb2e4,0x20dd,0xf87a],
+    0x9e => [0xb77c,0x20dd,0xf87a], 0x9f => [0xc678,0x20dd,0xf87a],
+    0xa1 => 0x30a1, 0xa2 => 0x30a2, 0xa3 => 0x30a3, 0xa4 => 0x30a4,
+    0xa5 => 0x30a5, 0xa6 => 0x30a6, 0xa7 => 0x30a7, 0xa8 => 0x30a8,
+    0xa9 => 0x30a9, 0xaa => 0x30aa, 0xab => 0x30ab, 0xac => 0x30ac,
+    0xad => 0x30ad, 0xae => 0x30ae, 0xaf => 0x30af, 0xb0 => 0x30b0,
+    0xb1 => 0x30b1, 0xb2 => 0x30b2, 0xb3 => 0x30b3, 0xb4 => 0x30b4,
+    0xb5 => 0x30b5, 0xb6 => 0x30b6, 0xb7 => 0x30b7, 0xb8 => 0x30b8,
+    0xb9 => 0x30b9, 0xba => 0x30ba, 0xbb => 0x30bb, 0xbc => 0x30bc,
+    0xbd => 0x30bd, 0xbe => 0x30be, 0xbf => 0x30bf, 0xc0 => 0x30c0,
+    0xc1 => 0x30c1, 0xc2 => 0x30c2, 0xc3 => 0x30c3, 0xc4 => 0x30c4,
+    0xc5 => 0x30c5, 0xc6 => 0x30c6, 0xc7 => 0x30c7, 0xc8 => 0x30c8,
+    0xc9 => 0x30c9, 0xca => 0x30ca, 0xcb => 0x30cb, 0xcc => 0x30cc,
+    0xcd => 0x30cd, 0xce => 0x30ce, 0xcf => 0x30cf, 0xd0 => 0x30d0,
+    0xd1 => 0x30d1, 0xd2 => 0x30d2, 0xd3 => 0x30d3, 0xd4 => 0x30d4,
+    0xd5 => 0x30d5, 0xd6 => 0x30d6, 0xd7 => 0x30d7, 0xd8 => 0x30d8,
+    0xd9 => 0x30d9, 0xda => 0x30da, 0xdb => 0x30db, 0xdc => 0x30dc,
+    0xdd => 0x30dd, 0xde => 0x30de, 0xdf => 0x30df, 0xe0 => 0x30e0,
+    0xe1 => 0x30e1, 0xe2 => 0x30e2, 0xe3 => 0x30e3, 0xe4 => 0x30e4,
+    0xe5 => 0x30e5, 0xe6 => 0x30e6, 0xe7 => 0x30e7, 0xe8 => 0x30e8,
+    0xe9 => 0x30e9, 0xea => 0x30ea, 0xeb => 0x30eb, 0xec => 0x30ec,
+    0xed => 0x30ed, 0xee => 0x30ee, 0xef => 0x30ef, 0xf0 => 0x30f0,
+    0xf1 => 0x30f1, 0xf2 => 0x30f2, 0xf3 => 0x30f3, 0xf4 => 0x30f4,
+    0xf5 => 0x30f5, 0xf6 => 0x30f6, 0xf7 => [0xf862,0x28,0x32,0x37,0x29],
+    0xf8 => [0xf862,0x28,0x32,0x38,0x29], 0xf9 => [0xf862,0x28,0x32,0x39,0x29],
+    0xfa => [0xf862,0x28,0x33,0x30,0x29],
+  },
+  0xac => {
+    0x41 => 0x21f0, 0x42 => 0xf843, 0x43 => 0x27b5, 0x44 => [0x2964,0xf87f],
+    0x45 => [0x2962,0xf87f], 0x46 => [0x21e8,0xf870], 0x47 => [0x21e6,0xf870],
+    0x48 => 0x27a4, 0x49 => 0xf844, 0x4a => 0xf84b, 0x4b => 0xf84a,
+    0x4c => [0x21c0,0xf87f], 0x4d => [0x21bc,0xf87f], 0x4e => [0x21e8,0xf87f],
+    0x4f => [0x21e6,0xf87f], 0x50 => 0x21b6, 0x51 => 0x21b7, 0x52 => 0x219d,
+    0x53 => 0x219c, 0x54 => 0xf842, 0x55 => [0x2190,0xf87a],
+    0x56 => [0x2192,0xf87a], 0x57 => [0x2191,0xf87a], 0x58 => [0x2193,0xf87a],
+    0x59 => [0x21e6,0xf87c], 0x5a => [0x21e8,0xf87c], 0x5b => [0x21e7,0xf87c],
+    0x5c => [0x21e9,0xf87c], 0x5d => [0x2190,0xf873], 0x5e => 0x2794,
+    0x5f => 0xf845, 0x60 => [0x2191,0xf873], 0x61 => [0x2193,0xf873],
+    0x62 => [0x2190,0xf878], 0x63 => [0x2192,0xf878], 0x64 => [0x2191,0xf878],
+    0x65 => [0x2193,0xf878], 0x66 => [0x2190,0xf874], 0x67 => [0x2192,0xf874],
+    0x68 => [0x2191,0xf874], 0x69 => [0x2193,0xf874], 0x6a => 0x21e0,
+    0x6b => 0x21e2, 0x6c => 0x21e1, 0x6d => 0x21e3, 0x6e => [0x21e6,0xf875],
+    0x6f => [0x21e8,0xf875], 0x70 => [0x21e7,0xf875], 0x71 => [0x21e9,0xf875],
+    0x72 => 0x21e6, 0x73 => 0x21e8, 0x74 => 0x21e7, 0x75 => 0x21e9,
+    0x76 => [0x2936,0xf87a], 0x77 => [0x21b1,0xf87a], 0x78 => [0x21bb,0xf87a],
+    0x79 => [0x2935,0xf87a], 0x7a => [0x21b0,0xf87a], 0x7b => [0x2937,0xf87a],
+    0x7c => [0x2939,0xf87a], 0x7d => [0x2934,0xf87a], 0x81 => [0x2936,0xf87c],
+    0x82 => [0x21b1,0xf87c], 0x83 => [0x21bb,0xf87c], 0x84 => [0x2935,0xf87c],
+    0x85 => [0x21b0,0xf87c], 0x86 => [0x2937,0xf87c], 0x87 => [0x2939,0xf87c],
+    0x88 => [0x2934,0xf87c], 0x89 => [0x2190,0xf870], 0x8a => [0x2192,0xf870],
+    0x8b => [0x2191,0xf870], 0x8c => [0x2193,0xf870], 0x8d => 0x261d,
+    0x8e => 0x261f, 0x8f => [0x261d,0xf87f], 0x90 => [0x261f,0xf87f],
+    0x91 => [0xb2e8,0x20dd], 0x92 => [0xcc38,0x20dd], 0x93 => [0xc18c,0x20dd],
+    0x94 => [0xc911,0x20dd], 0x95 => [0xc77c,0x20dd], 0x96 => [0xc774,0x20dd],
+    0x97 => [0xd734,0x20dd], 0xa1 => 0x0410, 0xa2 => 0x0411, 0xa3 => 0x0412,
+    0xa4 => 0x0413, 0xa5 => 0x0414, 0xa6 => 0x0415, 0xa7 => 0x0401,
+    0xa8 => 0x0416, 0xa9 => 0x0417, 0xaa => 0x0418, 0xab => 0x0419,
+    0xac => 0x041a, 0xad => 0x041b, 0xae => 0x041c, 0xaf => 0x041d,
+    0xb0 => 0x041e, 0xb1 => 0x041f, 0xb2 => 0x0420, 0xb3 => 0x0421,
+    0xb4 => 0x0422, 0xb5 => 0x0423, 0xb6 => 0x0424, 0xb7 => 0x0425,
+    0xb8 => 0x0426, 0xb9 => 0x0427, 0xba => 0x0428, 0xbb => 0x0429,
+    0xbc => 0x042a, 0xbd => 0x042b, 0xbe => 0x042c, 0xbf => 0x042d,
+    0xc0 => 0x042e, 0xc1 => 0x042f, 0xc2 => [0x31,0x20de,0xf875],
+    0xc3 => [0x32,0x20de,0xf875], 0xc4 => [0x33,0x20de,0xf875],
+    0xc5 => [0x34,0x20de,0xf875], 0xc6 => [0x35,0x20de,0xf875],
+    0xc7 => [0x36,0x20de,0xf875], 0xc8 => [0x37,0x20de,0xf875],
+    0xc9 => [0x38,0x20de,0xf875], 0xca => [0x39,0x20de,0xf875],
+    0xcb => [0xf866,0x5b,0x31,0x30,0x5d], 0xcc => [0xf866,0x5b,0x31,0x31,0x5d],
+    0xcd => [0xf866,0x5b,0x31,0x32,0x5d], 0xce => [0xf866,0x5b,0x31,0x33,0x5d],
+    0xcf => [0xf866,0x5b,0x31,0x34,0x5d], 0xd0 => [0xf866,0x5b,0x31,0x35,0x5d],
+    0xd1 => 0x0430, 0xd2 => 0x0431, 0xd3 => 0x0432, 0xd4 => 0x0433,
+    0xd5 => 0x0434, 0xd6 => 0x0435, 0xd7 => 0x0451, 0xd8 => 0x0436,
+    0xd9 => 0x0437, 0xda => 0x0438, 0xdb => 0x0439, 0xdc => 0x043a,
+    0xdd => 0x043b, 0xde => 0x043c, 0xdf => 0x043d, 0xe0 => 0x043e,
+    0xe1 => 0x043f, 0xe2 => 0x0440, 0xe3 => 0x0441, 0xe4 => 0x0442,
+    0xe5 => 0x0443, 0xe6 => 0x0444, 0xe7 => 0x0445, 0xe8 => 0x0446,
+    0xe9 => 0x0447, 0xea => 0x0448, 0xeb => 0x0449, 0xec => 0x044a,
+    0xed => 0x044b, 0xee => 0x044c, 0xef => 0x044d, 0xf0 => 0x044e,
+    0xf1 => 0x044f, 0xf2 => [0xf866,0x5b,0x31,0x36,0x5d],
+    0xf3 => [0xf866,0x5b,0x31,0x37,0x5d], 0xf4 => [0xf866,0x5b,0x31,0x38,0x5d],
+    0xf5 => [0xf866,0x5b,0x31,0x39,0x5d], 0xf6 => [0xf866,0x5b,0x32,0x30,0x5d],
+  },
+  0xad => {
+    0x41 => [0x4e00,0x20de,0xf87a], 0x42 => [0x4e8c,0x20de,0xf87a],
+    0x43 => [0x4e09,0x20de,0xf87a], 0x44 => [0x56db,0x20de,0xf87a],
+    0x45 => [0x4e94,0x20de,0xf87a], 0x46 => [0x516d,0x20de,0xf87a],
+    0x47 => [0x4e03,0x20de,0xf87a], 0x48 => [0x516b,0x20de,0xf87a],
+    0x49 => [0x4e5d,0x20de,0xf87a], 0x4a => [0x5341,0x20de,0xf87a],
+    0x4b => [0xf863,0x5b,0x5341,0x4e00,0x5d],
+    0x4c => [0xf863,0x5b,0x5341,0x4e8c,0x5d],
+    0x4d => [0xf863,0x5b,0x5341,0x4e09,0x5d],
+    0x4e => [0xf863,0x5b,0x5341,0x56db,0x5d],
+    0x4f => [0xf863,0x5b,0x5341,0x4e94,0x5d],
+    0x50 => [0xf863,0x5b,0x5341,0x516d,0x5d],
+    0x51 => [0xf863,0x5b,0x5341,0x4e03,0x5d],
+    0x52 => [0xf863,0x5b,0x5341,0x516b,0x5d],
+    0x53 => [0xf863,0x5b,0x5341,0x4e5d,0x5d],
+    0x54 => [0xf863,0x5b,0x4e8c,0x5341,0x5d], 0x55 => [0x4e00,0x20de],
+    0x56 => [0x4e8c,0x20de], 0x57 => [0x4e09,0x20de], 0x58 => [0x56db,0x20de],
+    0x59 => [0x4e94,0x20de], 0x5a => [0x516d,0x20de], 0x5b => [0x4e03,0x20de],
+    0x5c => [0x516b,0x20de], 0x5d => [0x4e5d,0x20de], 0x5e => [0x5341,0x20de],
+    0x5f => [0xf862,0x5b,0x5341,0x4e00,0x5d],
+    0x60 => [0xf862,0x5b,0x5341,0x4e8c,0x5d],
+    0x61 => [0xf862,0x5b,0x5341,0x4e09,0x5d],
+    0x62 => [0xf862,0x5b,0x5341,0x56db,0x5d],
+    0x63 => [0xf862,0x5b,0x5341,0x4e94,0x5d],
+    0x64 => [0xf862,0x5b,0x5341,0x516d,0x5d],
+    0x65 => [0xf862,0x5b,0x5341,0x4e03,0x5d],
+    0x66 => [0xf862,0x5b,0x5341,0x516b,0x5d],
+    0x67 => [0xf862,0x5b,0x5341,0x4e5d,0x5d],
+    0x68 => [0xf862,0x5b,0x4e8c,0x5341,0x5d], 0x69 => [0x65e5,0x20de],
+    0x6a => [0x6708,0x20de], 0x6b => [0x706b,0x20de], 0x6c => [0x6c34,0x20de],
+    0x6d => [0x6728,0x20de], 0x6e => [0x91d1,0x20de], 0x6f => [0x571f,0x20de],
+    0x70 => 0x3290, 0x71 => 0x328a, 0x72 => 0x328b, 0x73 => 0x328c,
+    0x74 => 0x328d, 0x75 => 0x328e, 0x76 => 0x328f,
+    0x77 => [0x65e5,0x20de,0xf87c], 0x78 => [0x6708,0x20de,0xf87c],
+    0x79 => [0x706b,0x20de,0xf87c], 0x7a => [0x6c34,0x20de,0xf87c],
+    0x7b => [0x6728,0x20de,0xf87c], 0x7c => [0x91d1,0x20de,0xf87c],
+    0x7d => [0x571f,0x20de,0xf87c], 0xa1 => [0x300c,0xf879],
+    0xa2 => [0x300d,0xf879], 0xa3 => [0x300e,0xf879], 0xa4 => [0x300f,0xf879],
+    0xa5 => [0x21e8,0xf878], 0xa6 => [0x21e6,0xf878], 0xa7 => [0x21e7,0xf878],
+    0xa8 => [0x21e9,0xf878], 0xa9 => 0x301e, 0xaa => 0x301f, 0xab => 0x2036,
+    0xac => [0x2033,0xf873], 0xad => 0x2035, 0xae => [0x2032,0xf873],
+    0xaf => [0x21e7,0xf87f], 0xb0 => [0x21,0xf87f],
+  },
+  0xb0 => {
+    0xa1 => 0xac00, 0xa2 => 0xac01, 0xa3 => 0xac04, 0xa4 => 0xac07,
+    0xa5 => 0xac08, 0xa6 => 0xac09, 0xa7 => 0xac0a, 0xa8 => 0xac10,
+    0xa9 => 0xac11, 0xaa => 0xac12, 0xab => 0xac13, 0xac => 0xac14,
+    0xad => 0xac15, 0xae => 0xac16, 0xaf => 0xac17, 0xb0 => 0xac19,
+    0xb1 => 0xac1a, 0xb2 => 0xac1b, 0xb3 => 0xac1c, 0xb4 => 0xac1d,
+    0xb5 => 0xac20, 0xb6 => 0xac24, 0xb7 => 0xac2c, 0xb8 => 0xac2d,
+    0xb9 => 0xac2f, 0xba => 0xac30, 0xbb => 0xac31, 0xbc => 0xac38,
+    0xbd => 0xac39, 0xbe => 0xac3c, 0xbf => 0xac40, 0xc0 => 0xac4b,
+    0xc1 => 0xac4d, 0xc2 => 0xac54, 0xc3 => 0xac58, 0xc4 => 0xac5c,
+    0xc5 => 0xac70, 0xc6 => 0xac71, 0xc7 => 0xac74, 0xc8 => 0xac77,
+    0xc9 => 0xac78, 0xca => 0xac7a, 0xcb => 0xac80, 0xcc => 0xac81,
+    0xcd => 0xac83, 0xce => 0xac84, 0xcf => 0xac85, 0xd0 => 0xac86,
+    0xd1 => 0xac89, 0xd2 => 0xac8a, 0xd3 => 0xac8b, 0xd4 => 0xac8c,
+    0xd5 => 0xac90, 0xd6 => 0xac94, 0xd7 => 0xac9c, 0xd8 => 0xac9d,
+    0xd9 => 0xac9f, 0xda => 0xaca0, 0xdb => 0xaca1, 0xdc => 0xaca8,
+    0xdd => 0xaca9, 0xde => 0xacaa, 0xdf => 0xacac, 0xe0 => 0xacaf,
+    0xe1 => 0xacb0, 0xe2 => 0xacb8, 0xe3 => 0xacb9, 0xe4 => 0xacbb,
+    0xe5 => 0xacbc, 0xe6 => 0xacbd, 0xe7 => 0xacc1, 0xe8 => 0xacc4,
+    0xe9 => 0xacc8, 0xea => 0xaccc, 0xeb => 0xacd5, 0xec => 0xacd7,
+    0xed => 0xace0, 0xee => 0xace1, 0xef => 0xace4, 0xf0 => 0xace7,
+    0xf1 => 0xace8, 0xf2 => 0xacea, 0xf3 => 0xacec, 0xf4 => 0xacef,
+    0xf5 => 0xacf0, 0xf6 => 0xacf1, 0xf7 => 0xacf3, 0xf8 => 0xacf5,
+    0xf9 => 0xacf6, 0xfa => 0xacfc, 0xfb => 0xacfd, 0xfc => 0xad00,
+    0xfd => 0xad04, 0xfe => 0xad06,
+  },
+  0xb1 => {
+    0xa1 => 0xad0c, 0xa2 => 0xad0d, 0xa3 => 0xad0f, 0xa4 => 0xad11,
+    0xa5 => 0xad18, 0xa6 => 0xad1c, 0xa7 => 0xad20, 0xa8 => 0xad29,
+    0xa9 => 0xad2c, 0xaa => 0xad2d, 0xab => 0xad34, 0xac => 0xad35,
+    0xad => 0xad38, 0xae => 0xad3c, 0xaf => 0xad44, 0xb0 => 0xad45,
+    0xb1 => 0xad47, 0xb2 => 0xad49, 0xb3 => 0xad50, 0xb4 => 0xad54,
+    0xb5 => 0xad58, 0xb6 => 0xad61, 0xb7 => 0xad63, 0xb8 => 0xad6c,
+    0xb9 => 0xad6d, 0xba => 0xad70, 0xbb => 0xad73, 0xbc => 0xad74,
+    0xbd => 0xad75, 0xbe => 0xad76, 0xbf => 0xad7b, 0xc0 => 0xad7c,
+    0xc1 => 0xad7d, 0xc2 => 0xad7f, 0xc3 => 0xad81, 0xc4 => 0xad82,
+    0xc5 => 0xad88, 0xc6 => 0xad89, 0xc7 => 0xad8c, 0xc8 => 0xad90,
+    0xc9 => 0xad9c, 0xca => 0xad9d, 0xcb => 0xada4, 0xcc => 0xadb7,
+    0xcd => 0xadc0, 0xce => 0xadc1, 0xcf => 0xadc4, 0xd0 => 0xadc8,
+    0xd1 => 0xadd0, 0xd2 => 0xadd1, 0xd3 => 0xadd3, 0xd4 => 0xaddc,
+    0xd5 => 0xade0, 0xd6 => 0xade4, 0xd7 => 0xadf8, 0xd8 => 0xadf9,
+    0xd9 => 0xadfc, 0xda => 0xadff, 0xdb => 0xae00, 0xdc => 0xae01,
+    0xdd => 0xae08, 0xde => 0xae09, 0xdf => 0xae0b, 0xe0 => 0xae0d,
+    0xe1 => 0xae14, 0xe2 => 0xae30, 0xe3 => 0xae31, 0xe4 => 0xae34,
+    0xe5 => 0xae37, 0xe6 => 0xae38, 0xe7 => 0xae3a, 0xe8 => 0xae40,
+    0xe9 => 0xae41, 0xea => 0xae43, 0xeb => 0xae45, 0xec => 0xae46,
+    0xed => 0xae4a, 0xee => 0xae4c, 0xef => 0xae4d, 0xf0 => 0xae4e,
+    0xf1 => 0xae50, 0xf2 => 0xae54, 0xf3 => 0xae56, 0xf4 => 0xae5c,
+    0xf5 => 0xae5d, 0xf6 => 0xae5f, 0xf7 => 0xae60, 0xf8 => 0xae61,
+    0xf9 => 0xae65, 0xfa => 0xae68, 0xfb => 0xae69, 0xfc => 0xae6c,
+    0xfd => 0xae70, 0xfe => 0xae78,
+  },
+  0xb2 => {
+    0xa1 => 0xae79, 0xa2 => 0xae7b, 0xa3 => 0xae7c, 0xa4 => 0xae7d,
+    0xa5 => 0xae84, 0xa6 => 0xae85, 0xa7 => 0xae8c, 0xa8 => 0xaebc,
+    0xa9 => 0xaebd, 0xaa => 0xaebe, 0xab => 0xaec0, 0xac => 0xaec4,
+    0xad => 0xaecc, 0xae => 0xaecd, 0xaf => 0xaecf, 0xb0 => 0xaed0,
+    0xb1 => 0xaed1, 0xb2 => 0xaed8, 0xb3 => 0xaed9, 0xb4 => 0xaedc,
+    0xb5 => 0xaee8, 0xb6 => 0xaeeb, 0xb7 => 0xaeed, 0xb8 => 0xaef4,
+    0xb9 => 0xaef8, 0xba => 0xaefc, 0xbb => 0xaf07, 0xbc => 0xaf08,
+    0xbd => 0xaf0d, 0xbe => 0xaf10, 0xbf => 0xaf2c, 0xc0 => 0xaf2d,
+    0xc1 => 0xaf30, 0xc2 => 0xaf32, 0xc3 => 0xaf34, 0xc4 => 0xaf3c,
+    0xc5 => 0xaf3d, 0xc6 => 0xaf3f, 0xc7 => 0xaf41, 0xc8 => 0xaf42,
+    0xc9 => 0xaf43, 0xca => 0xaf48, 0xcb => 0xaf49, 0xcc => 0xaf50,
+    0xcd => 0xaf5c, 0xce => 0xaf5d, 0xcf => 0xaf64, 0xd0 => 0xaf65,
+    0xd1 => 0xaf79, 0xd2 => 0xaf80, 0xd3 => 0xaf84, 0xd4 => 0xaf88,
+    0xd5 => 0xaf90, 0xd6 => 0xaf91, 0xd7 => 0xaf95, 0xd8 => 0xaf9c,
+    0xd9 => 0xafb8, 0xda => 0xafb9, 0xdb => 0xafbc, 0xdc => 0xafc0,
+    0xdd => 0xafc7, 0xde => 0xafc8, 0xdf => 0xafc9, 0xe0 => 0xafcb,
+    0xe1 => 0xafcd, 0xe2 => 0xafce, 0xe3 => 0xafd4, 0xe4 => 0xafdc,
+    0xe5 => 0xafe8, 0xe6 => 0xafe9, 0xe7 => 0xaff0, 0xe8 => 0xaff1,
+    0xe9 => 0xaff4, 0xea => 0xaff8, 0xeb => 0xb000, 0xec => 0xb001,
+    0xed => 0xb004, 0xee => 0xb00c, 0xef => 0xb010, 0xf0 => 0xb014,
+    0xf1 => 0xb01c, 0xf2 => 0xb01d, 0xf3 => 0xb028, 0xf4 => 0xb044,
+    0xf5 => 0xb045, 0xf6 => 0xb048, 0xf7 => 0xb04a, 0xf8 => 0xb04c,
+    0xf9 => 0xb04e, 0xfa => 0xb053, 0xfb => 0xb054, 0xfc => 0xb055,
+    0xfd => 0xb057, 0xfe => 0xb059,
+  },
+  0xb3 => {
+    0xa1 => 0xb05d, 0xa2 => 0xb07c, 0xa3 => 0xb07d, 0xa4 => 0xb080,
+    0xa5 => 0xb084, 0xa6 => 0xb08c, 0xa7 => 0xb08d, 0xa8 => 0xb08f,
+    0xa9 => 0xb091, 0xaa => 0xb098, 0xab => 0xb099, 0xac => 0xb09a,
+    0xad => 0xb09c, 0xae => 0xb09f, 0xaf => 0xb0a0, 0xb0 => 0xb0a1,
+    0xb1 => 0xb0a2, 0xb2 => 0xb0a8, 0xb3 => 0xb0a9, 0xb4 => 0xb0ab,
+    0xb5 => 0xb0ac, 0xb6 => 0xb0ad, 0xb7 => 0xb0ae, 0xb8 => 0xb0af,
+    0xb9 => 0xb0b1, 0xba => 0xb0b3, 0xbb => 0xb0b4, 0xbc => 0xb0b5,
+    0xbd => 0xb0b8, 0xbe => 0xb0bc, 0xbf => 0xb0c4, 0xc0 => 0xb0c5,
+    0xc1 => 0xb0c7, 0xc2 => 0xb0c8, 0xc3 => 0xb0c9, 0xc4 => 0xb0d0,
+    0xc5 => 0xb0d1, 0xc6 => 0xb0d4, 0xc7 => 0xb0d8, 0xc8 => 0xb0e0,
+    0xc9 => 0xb0e5, 0xca => 0xb108, 0xcb => 0xb109, 0xcc => 0xb10b,
+    0xcd => 0xb10c, 0xce => 0xb110, 0xcf => 0xb112, 0xd0 => 0xb113,
+    0xd1 => 0xb118, 0xd2 => 0xb119, 0xd3 => 0xb11b, 0xd4 => 0xb11c,
+    0xd5 => 0xb11d, 0xd6 => 0xb123, 0xd7 => 0xb124, 0xd8 => 0xb125,
+    0xd9 => 0xb128, 0xda => 0xb12c, 0xdb => 0xb134, 0xdc => 0xb135,
+    0xdd => 0xb137, 0xde => 0xb138, 0xdf => 0xb139, 0xe0 => 0xb140,
+    0xe1 => 0xb141, 0xe2 => 0xb144, 0xe3 => 0xb148, 0xe4 => 0xb150,
+    0xe5 => 0xb151, 0xe6 => 0xb154, 0xe7 => 0xb155, 0xe8 => 0xb158,
+    0xe9 => 0xb15c, 0xea => 0xb160, 0xeb => 0xb178, 0xec => 0xb179,
+    0xed => 0xb17c, 0xee => 0xb180, 0xef => 0xb182, 0xf0 => 0xb188,
+    0xf1 => 0xb189, 0xf2 => 0xb18b, 0xf3 => 0xb18d, 0xf4 => 0xb192,
+    0xf5 => 0xb193, 0xf6 => 0xb194, 0xf7 => 0xb198, 0xf8 => 0xb19c,
+    0xf9 => 0xb1a8, 0xfa => 0xb1cc, 0xfb => 0xb1d0, 0xfc => 0xb1d4,
+    0xfd => 0xb1dc, 0xfe => 0xb1dd,
+  },
+  0xb4 => {
+    0xa1 => 0xb1df, 0xa2 => 0xb1e8, 0xa3 => 0xb1e9, 0xa4 => 0xb1ec,
+    0xa5 => 0xb1f0, 0xa6 => 0xb1f9, 0xa7 => 0xb1fb, 0xa8 => 0xb1fd,
+    0xa9 => 0xb204, 0xaa => 0xb205, 0xab => 0xb208, 0xac => 0xb20b,
+    0xad => 0xb20c, 0xae => 0xb214, 0xaf => 0xb215, 0xb0 => 0xb217,
+    0xb1 => 0xb219, 0xb2 => 0xb220, 0xb3 => 0xb234, 0xb4 => 0xb23c,
+    0xb5 => 0xb258, 0xb6 => 0xb25c, 0xb7 => 0xb260, 0xb8 => 0xb268,
+    0xb9 => 0xb269, 0xba => 0xb274, 0xbb => 0xb275, 0xbc => 0xb27c,
+    0xbd => 0xb284, 0xbe => 0xb285, 0xbf => 0xb289, 0xc0 => 0xb290,
+    0xc1 => 0xb291, 0xc2 => 0xb294, 0xc3 => 0xb298, 0xc4 => 0xb299,
+    0xc5 => 0xb29a, 0xc6 => 0xb2a0, 0xc7 => 0xb2a1, 0xc8 => 0xb2a3,
+    0xc9 => 0xb2a5, 0xca => 0xb2a6, 0xcb => 0xb2aa, 0xcc => 0xb2ac,
+    0xcd => 0xb2b0, 0xce => 0xb2b4, 0xcf => 0xb2c8, 0xd0 => 0xb2c9,
+    0xd1 => 0xb2cc, 0xd2 => 0xb2d0, 0xd3 => 0xb2d2, 0xd4 => 0xb2d8,
+    0xd5 => 0xb2d9, 0xd6 => 0xb2db, 0xd7 => 0xb2dd, 0xd8 => 0xb2e2,
+    0xd9 => 0xb2e4, 0xda => 0xb2e5, 0xdb => 0xb2e6, 0xdc => 0xb2e8,
+    0xdd => 0xb2eb, 0xde => 0xb2ec, 0xdf => 0xb2ed, 0xe0 => 0xb2ee,
+    0xe1 => 0xb2ef, 0xe2 => 0xb2f3, 0xe3 => 0xb2f4, 0xe4 => 0xb2f5,
+    0xe5 => 0xb2f7, 0xe6 => 0xb2f8, 0xe7 => 0xb2f9, 0xe8 => 0xb2fa,
+    0xe9 => 0xb2fb, 0xea => 0xb2ff, 0xeb => 0xb300, 0xec => 0xb301,
+    0xed => 0xb304, 0xee => 0xb308, 0xef => 0xb310, 0xf0 => 0xb311,
+    0xf1 => 0xb313, 0xf2 => 0xb314, 0xf3 => 0xb315, 0xf4 => 0xb31c,
+    0xf5 => 0xb354, 0xf6 => 0xb355, 0xf7 => 0xb356, 0xf8 => 0xb358,
+    0xf9 => 0xb35b, 0xfa => 0xb35c, 0xfb => 0xb35e, 0xfc => 0xb35f,
+    0xfd => 0xb364, 0xfe => 0xb365,
+  },
+  0xb5 => {
+    0xa1 => 0xb367, 0xa2 => 0xb369, 0xa3 => 0xb36b, 0xa4 => 0xb36e,
+    0xa5 => 0xb370, 0xa6 => 0xb371, 0xa7 => 0xb374, 0xa8 => 0xb378,
+    0xa9 => 0xb380, 0xaa => 0xb381, 0xab => 0xb383, 0xac => 0xb384,
+    0xad => 0xb385, 0xae => 0xb38c, 0xaf => 0xb390, 0xb0 => 0xb394,
+    0xb1 => 0xb3a0, 0xb2 => 0xb3a1, 0xb3 => 0xb3a8, 0xb4 => 0xb3ac,
+    0xb5 => 0xb3c4, 0xb6 => 0xb3c5, 0xb7 => 0xb3c8, 0xb8 => 0xb3cb,
+    0xb9 => 0xb3cc, 0xba => 0xb3ce, 0xbb => 0xb3d0, 0xbc => 0xb3d4,
+    0xbd => 0xb3d5, 0xbe => 0xb3d7, 0xbf => 0xb3d9, 0xc0 => 0xb3db,
+    0xc1 => 0xb3dd, 0xc2 => 0xb3e0, 0xc3 => 0xb3e4, 0xc4 => 0xb3e8,
+    0xc5 => 0xb3fc, 0xc6 => 0xb410, 0xc7 => 0xb418, 0xc8 => 0xb41c,
+    0xc9 => 0xb420, 0xca => 0xb428, 0xcb => 0xb429, 0xcc => 0xb42b,
+    0xcd => 0xb434, 0xce => 0xb450, 0xcf => 0xb451, 0xd0 => 0xb454,
+    0xd1 => 0xb458, 0xd2 => 0xb460, 0xd3 => 0xb461, 0xd4 => 0xb463,
+    0xd5 => 0xb465, 0xd6 => 0xb46c, 0xd7 => 0xb480, 0xd8 => 0xb488,
+    0xd9 => 0xb49d, 0xda => 0xb4a4, 0xdb => 0xb4a8, 0xdc => 0xb4ac,
+    0xdd => 0xb4b5, 0xde => 0xb4b7, 0xdf => 0xb4b9, 0xe0 => 0xb4c0,
+    0xe1 => 0xb4c4, 0xe2 => 0xb4c8, 0xe3 => 0xb4d0, 0xe4 => 0xb4d5,
+    0xe5 => 0xb4dc, 0xe6 => 0xb4dd, 0xe7 => 0xb4e0, 0xe8 => 0xb4e3,
+    0xe9 => 0xb4e4, 0xea => 0xb4e6, 0xeb => 0xb4ec, 0xec => 0xb4ed,
+    0xed => 0xb4ef, 0xee => 0xb4f1, 0xef => 0xb4f8, 0xf0 => 0xb514,
+    0xf1 => 0xb515, 0xf2 => 0xb518, 0xf3 => 0xb51b, 0xf4 => 0xb51c,
+    0xf5 => 0xb524, 0xf6 => 0xb525, 0xf7 => 0xb527, 0xf8 => 0xb528,
+    0xf9 => 0xb529, 0xfa => 0xb52a, 0xfb => 0xb530, 0xfc => 0xb531,
+    0xfd => 0xb534, 0xfe => 0xb538,
+  },
+  0xb6 => {
+    0xa1 => 0xb540, 0xa2 => 0xb541, 0xa3 => 0xb543, 0xa4 => 0xb544,
+    0xa5 => 0xb545, 0xa6 => 0xb54b, 0xa7 => 0xb54c, 0xa8 => 0xb54d,
+    0xa9 => 0xb550, 0xaa => 0xb554, 0xab => 0xb55c, 0xac => 0xb55d,
+    0xad => 0xb55f, 0xae => 0xb560, 0xaf => 0xb561, 0xb0 => 0xb5a0,
+    0xb1 => 0xb5a1, 0xb2 => 0xb5a4, 0xb3 => 0xb5a8, 0xb4 => 0xb5aa,
+    0xb5 => 0xb5ab, 0xb6 => 0xb5b0, 0xb7 => 0xb5b1, 0xb8 => 0xb5b3,
+    0xb9 => 0xb5b4, 0xba => 0xb5b5, 0xbb => 0xb5bb, 0xbc => 0xb5bc,
+    0xbd => 0xb5bd, 0xbe => 0xb5c0, 0xbf => 0xb5c4, 0xc0 => 0xb5cc,
+    0xc1 => 0xb5cd, 0xc2 => 0xb5cf, 0xc3 => 0xb5d0, 0xc4 => 0xb5d1,
+    0xc5 => 0xb5d8, 0xc6 => 0xb5ec, 0xc7 => 0xb610, 0xc8 => 0xb611,
+    0xc9 => 0xb614, 0xca => 0xb618, 0xcb => 0xb625, 0xcc => 0xb62c,
+    0xcd => 0xb634, 0xce => 0xb648, 0xcf => 0xb664, 0xd0 => 0xb668,
+    0xd1 => 0xb69c, 0xd2 => 0xb69d, 0xd3 => 0xb6a0, 0xd4 => 0xb6a4,
+    0xd5 => 0xb6ab, 0xd6 => 0xb6ac, 0xd7 => 0xb6b1, 0xd8 => 0xb6d4,
+    0xd9 => 0xb6f0, 0xda => 0xb6f4, 0xdb => 0xb6f8, 0xdc => 0xb700,
+    0xdd => 0xb701, 0xde => 0xb705, 0xdf => 0xb728, 0xe0 => 0xb729,
+    0xe1 => 0xb72c, 0xe2 => 0xb72f, 0xe3 => 0xb730, 0xe4 => 0xb738,
+    0xe5 => 0xb739, 0xe6 => 0xb73b, 0xe7 => 0xb744, 0xe8 => 0xb748,
+    0xe9 => 0xb74c, 0xea => 0xb754, 0xeb => 0xb755, 0xec => 0xb760,
+    0xed => 0xb764, 0xee => 0xb768, 0xef => 0xb770, 0xf0 => 0xb771,
+    0xf1 => 0xb773, 0xf2 => 0xb775, 0xf3 => 0xb77c, 0xf4 => 0xb77d,
+    0xf5 => 0xb780, 0xf6 => 0xb784, 0xf7 => 0xb78c, 0xf8 => 0xb78d,
+    0xf9 => 0xb78f, 0xfa => 0xb790, 0xfb => 0xb791, 0xfc => 0xb792,
+    0xfd => 0xb796, 0xfe => 0xb797,
+  },
+  0xb7 => {
+    0xa1 => 0xb798, 0xa2 => 0xb799, 0xa3 => 0xb79c, 0xa4 => 0xb7a0,
+    0xa5 => 0xb7a8, 0xa6 => 0xb7a9, 0xa7 => 0xb7ab, 0xa8 => 0xb7ac,
+    0xa9 => 0xb7ad, 0xaa => 0xb7b4, 0xab => 0xb7b5, 0xac => 0xb7b8,
+    0xad => 0xb7c7, 0xae => 0xb7c9, 0xaf => 0xb7ec, 0xb0 => 0xb7ed,
+    0xb1 => 0xb7f0, 0xb2 => 0xb7f4, 0xb3 => 0xb7fc, 0xb4 => 0xb7fd,
+    0xb5 => 0xb7ff, 0xb6 => 0xb800, 0xb7 => 0xb801, 0xb8 => 0xb807,
+    0xb9 => 0xb808, 0xba => 0xb809, 0xbb => 0xb80c, 0xbc => 0xb810,
+    0xbd => 0xb818, 0xbe => 0xb819, 0xbf => 0xb81b, 0xc0 => 0xb81d,
+    0xc1 => 0xb824, 0xc2 => 0xb825, 0xc3 => 0xb828, 0xc4 => 0xb82c,
+    0xc5 => 0xb834, 0xc6 => 0xb835, 0xc7 => 0xb837, 0xc8 => 0xb838,
+    0xc9 => 0xb839, 0xca => 0xb840, 0xcb => 0xb844, 0xcc => 0xb851,
+    0xcd => 0xb853, 0xce => 0xb85c, 0xcf => 0xb85d, 0xd0 => 0xb860,
+    0xd1 => 0xb864, 0xd2 => 0xb86c, 0xd3 => 0xb86d, 0xd4 => 0xb86f,
+    0xd5 => 0xb871, 0xd6 => 0xb878, 0xd7 => 0xb87c, 0xd8 => 0xb88d,
+    0xd9 => 0xb8a8, 0xda => 0xb8b0, 0xdb => 0xb8b4, 0xdc => 0xb8b8,
+    0xdd => 0xb8c0, 0xde => 0xb8c1, 0xdf => 0xb8c3, 0xe0 => 0xb8c5,
+    0xe1 => 0xb8cc, 0xe2 => 0xb8d0, 0xe3 => 0xb8d4, 0xe4 => 0xb8dd,
+    0xe5 => 0xb8df, 0xe6 => 0xb8e1, 0xe7 => 0xb8e8, 0xe8 => 0xb8e9,
+    0xe9 => 0xb8ec, 0xea => 0xb8f0, 0xeb => 0xb8f8, 0xec => 0xb8f9,
+    0xed => 0xb8fb, 0xee => 0xb8fd, 0xef => 0xb904, 0xf0 => 0xb918,
+    0xf1 => 0xb920, 0xf2 => 0xb93c, 0xf3 => 0xb93d, 0xf4 => 0xb940,
+    0xf5 => 0xb944, 0xf6 => 0xb94c, 0xf7 => 0xb94f, 0xf8 => 0xb951,
+    0xf9 => 0xb958, 0xfa => 0xb959, 0xfb => 0xb95c, 0xfc => 0xb960,
+    0xfd => 0xb968, 0xfe => 0xb969,
+  },
+  0xb8 => {
+    0xa1 => 0xb96b, 0xa2 => 0xb96d, 0xa3 => 0xb974, 0xa4 => 0xb975,
+    0xa5 => 0xb978, 0xa6 => 0xb97c, 0xa7 => 0xb984, 0xa8 => 0xb985,
+    0xa9 => 0xb987, 0xaa => 0xb989, 0xab => 0xb98a, 0xac => 0xb98d,
+    0xad => 0xb98e, 0xae => 0xb9ac, 0xaf => 0xb9ad, 0xb0 => 0xb9b0,
+    0xb1 => 0xb9b4, 0xb2 => 0xb9bc, 0xb3 => 0xb9bd, 0xb4 => 0xb9bf,
+    0xb5 => 0xb9c1, 0xb6 => 0xb9c8, 0xb7 => 0xb9c9, 0xb8 => 0xb9cc,
+    0xb9 => 0xb9ce, 0xba => 0xb9cf, 0xbb => 0xb9d0, 0xbc => 0xb9d1,
+    0xbd => 0xb9d2, 0xbe => 0xb9d8, 0xbf => 0xb9d9, 0xc0 => 0xb9db,
+    0xc1 => 0xb9dd, 0xc2 => 0xb9de, 0xc3 => 0xb9e1, 0xc4 => 0xb9e3,
+    0xc5 => 0xb9e4, 0xc6 => 0xb9e5, 0xc7 => 0xb9e8, 0xc8 => 0xb9ec,
+    0xc9 => 0xb9f4, 0xca => 0xb9f5, 0xcb => 0xb9f7, 0xcc => 0xb9f8,
+    0xcd => 0xb9f9, 0xce => 0xb9fa, 0xcf => 0xba00, 0xd0 => 0xba01,
+    0xd1 => 0xba08, 0xd2 => 0xba15, 0xd3 => 0xba38, 0xd4 => 0xba39,
+    0xd5 => 0xba3c, 0xd6 => 0xba40, 0xd7 => 0xba42, 0xd8 => 0xba48,
+    0xd9 => 0xba49, 0xda => 0xba4b, 0xdb => 0xba4d, 0xdc => 0xba4e,
+    0xdd => 0xba53, 0xde => 0xba54, 0xdf => 0xba55, 0xe0 => 0xba58,
+    0xe1 => 0xba5c, 0xe2 => 0xba64, 0xe3 => 0xba65, 0xe4 => 0xba67,
+    0xe5 => 0xba68, 0xe6 => 0xba69, 0xe7 => 0xba70, 0xe8 => 0xba71,
+    0xe9 => 0xba74, 0xea => 0xba78, 0xeb => 0xba83, 0xec => 0xba84,
+    0xed => 0xba85, 0xee => 0xba87, 0xef => 0xba8c, 0xf0 => 0xbaa8,
+    0xf1 => 0xbaa9, 0xf2 => 0xbaab, 0xf3 => 0xbaac, 0xf4 => 0xbab0,
+    0xf5 => 0xbab2, 0xf6 => 0xbab8, 0xf7 => 0xbab9, 0xf8 => 0xbabb,
+    0xf9 => 0xbabd, 0xfa => 0xbac4, 0xfb => 0xbac8, 0xfc => 0xbad8,
+    0xfd => 0xbad9, 0xfe => 0xbafc,
+  },
+  0xb9 => {
+    0xa1 => 0xbb00, 0xa2 => 0xbb04, 0xa3 => 0xbb0d, 0xa4 => 0xbb0f,
+    0xa5 => 0xbb11, 0xa6 => 0xbb18, 0xa7 => 0xbb1c, 0xa8 => 0xbb20,
+    0xa9 => 0xbb29, 0xaa => 0xbb2b, 0xab => 0xbb34, 0xac => 0xbb35,
+    0xad => 0xbb36, 0xae => 0xbb38, 0xaf => 0xbb3b, 0xb0 => 0xbb3c,
+    0xb1 => 0xbb3d, 0xb2 => 0xbb3e, 0xb3 => 0xbb44, 0xb4 => 0xbb45,
+    0xb5 => 0xbb47, 0xb6 => 0xbb49, 0xb7 => 0xbb4d, 0xb8 => 0xbb4f,
+    0xb9 => 0xbb50, 0xba => 0xbb54, 0xbb => 0xbb58, 0xbc => 0xbb61,
+    0xbd => 0xbb63, 0xbe => 0xbb6c, 0xbf => 0xbb88, 0xc0 => 0xbb8c,
+    0xc1 => 0xbb90, 0xc2 => 0xbba4, 0xc3 => 0xbba8, 0xc4 => 0xbbac,
+    0xc5 => 0xbbb4, 0xc6 => 0xbbb7, 0xc7 => 0xbbc0, 0xc8 => 0xbbc4,
+    0xc9 => 0xbbc8, 0xca => 0xbbd0, 0xcb => 0xbbd3, 0xcc => 0xbbf8,
+    0xcd => 0xbbf9, 0xce => 0xbbfc, 0xcf => 0xbbff, 0xd0 => 0xbc00,
+    0xd1 => 0xbc02, 0xd2 => 0xbc08, 0xd3 => 0xbc09, 0xd4 => 0xbc0b,
+    0xd5 => 0xbc0c, 0xd6 => 0xbc0d, 0xd7 => 0xbc0f, 0xd8 => 0xbc11,
+    0xd9 => 0xbc14, 0xda => 0xbc15, 0xdb => 0xbc16, 0xdc => 0xbc17,
+    0xdd => 0xbc18, 0xde => 0xbc1b, 0xdf => 0xbc1c, 0xe0 => 0xbc1d,
+    0xe1 => 0xbc1e, 0xe2 => 0xbc1f, 0xe3 => 0xbc24, 0xe4 => 0xbc25,
+    0xe5 => 0xbc27, 0xe6 => 0xbc29, 0xe7 => 0xbc2d, 0xe8 => 0xbc30,
+    0xe9 => 0xbc31, 0xea => 0xbc34, 0xeb => 0xbc38, 0xec => 0xbc40,
+    0xed => 0xbc41, 0xee => 0xbc43, 0xef => 0xbc44, 0xf0 => 0xbc45,
+    0xf1 => 0xbc49, 0xf2 => 0xbc4c, 0xf3 => 0xbc4d, 0xf4 => 0xbc50,
+    0xf5 => 0xbc5d, 0xf6 => 0xbc84, 0xf7 => 0xbc85, 0xf8 => 0xbc88,
+    0xf9 => 0xbc8b, 0xfa => 0xbc8c, 0xfb => 0xbc8e, 0xfc => 0xbc94,
+    0xfd => 0xbc95, 0xfe => 0xbc97,
+  },
+  0xba => {
+    0xa1 => 0xbc99, 0xa2 => 0xbc9a, 0xa3 => 0xbca0, 0xa4 => 0xbca1,
+    0xa5 => 0xbca4, 0xa6 => 0xbca7, 0xa7 => 0xbca8, 0xa8 => 0xbcb0,
+    0xa9 => 0xbcb1, 0xaa => 0xbcb3, 0xab => 0xbcb4, 0xac => 0xbcb5,
+    0xad => 0xbcbc, 0xae => 0xbcbd, 0xaf => 0xbcc0, 0xb0 => 0xbcc4,
+    0xb1 => 0xbccd, 0xb2 => 0xbccf, 0xb3 => 0xbcd0, 0xb4 => 0xbcd1,
+    0xb5 => 0xbcd5, 0xb6 => 0xbcd8, 0xb7 => 0xbcdc, 0xb8 => 0xbcf4,
+    0xb9 => 0xbcf5, 0xba => 0xbcf6, 0xbb => 0xbcf8, 0xbc => 0xbcfc,
+    0xbd => 0xbd04, 0xbe => 0xbd05, 0xbf => 0xbd07, 0xc0 => 0xbd09,
+    0xc1 => 0xbd10, 0xc2 => 0xbd14, 0xc3 => 0xbd24, 0xc4 => 0xbd2c,
+    0xc5 => 0xbd40, 0xc6 => 0xbd48, 0xc7 => 0xbd49, 0xc8 => 0xbd4c,
+    0xc9 => 0xbd50, 0xca => 0xbd58, 0xcb => 0xbd59, 0xcc => 0xbd64,
+    0xcd => 0xbd68, 0xce => 0xbd80, 0xcf => 0xbd81, 0xd0 => 0xbd84,
+    0xd1 => 0xbd87, 0xd2 => 0xbd88, 0xd3 => 0xbd89, 0xd4 => 0xbd8a,
+    0xd5 => 0xbd90, 0xd6 => 0xbd91, 0xd7 => 0xbd93, 0xd8 => 0xbd95,
+    0xd9 => 0xbd99, 0xda => 0xbd9a, 0xdb => 0xbd9c, 0xdc => 0xbda4,
+    0xdd => 0xbdb0, 0xde => 0xbdb8, 0xdf => 0xbdd4, 0xe0 => 0xbdd5,
+    0xe1 => 0xbdd8, 0xe2 => 0xbddc, 0xe3 => 0xbde9, 0xe4 => 0xbdf0,
+    0xe5 => 0xbdf4, 0xe6 => 0xbdf8, 0xe7 => 0xbe00, 0xe8 => 0xbe03,
+    0xe9 => 0xbe05, 0xea => 0xbe0c, 0xeb => 0xbe0d, 0xec => 0xbe10,
+    0xed => 0xbe14, 0xee => 0xbe1c, 0xef => 0xbe1d, 0xf0 => 0xbe1f,
+    0xf1 => 0xbe44, 0xf2 => 0xbe45, 0xf3 => 0xbe48, 0xf4 => 0xbe4c,
+    0xf5 => 0xbe4e, 0xf6 => 0xbe54, 0xf7 => 0xbe55, 0xf8 => 0xbe57,
+    0xf9 => 0xbe59, 0xfa => 0xbe5a, 0xfb => 0xbe5b, 0xfc => 0xbe60,
+    0xfd => 0xbe61, 0xfe => 0xbe64,
+  },
+  0xbb => {
+    0xa1 => 0xbe68, 0xa2 => 0xbe6a, 0xa3 => 0xbe70, 0xa4 => 0xbe71,
+    0xa5 => 0xbe73, 0xa6 => 0xbe74, 0xa7 => 0xbe75, 0xa8 => 0xbe7b,
+    0xa9 => 0xbe7c, 0xaa => 0xbe7d, 0xab => 0xbe80, 0xac => 0xbe84,
+    0xad => 0xbe8c, 0xae => 0xbe8d, 0xaf => 0xbe8f, 0xb0 => 0xbe90,
+    0xb1 => 0xbe91, 0xb2 => 0xbe98, 0xb3 => 0xbe99, 0xb4 => 0xbea8,
+    0xb5 => 0xbed0, 0xb6 => 0xbed1, 0xb7 => 0xbed4, 0xb8 => 0xbed7,
+    0xb9 => 0xbed8, 0xba => 0xbee0, 0xbb => 0xbee3, 0xbc => 0xbee4,
+    0xbd => 0xbee5, 0xbe => 0xbeec, 0xbf => 0xbf01, 0xc0 => 0xbf08,
+    0xc1 => 0xbf09, 0xc2 => 0xbf18, 0xc3 => 0xbf19, 0xc4 => 0xbf1b,
+    0xc5 => 0xbf1c, 0xc6 => 0xbf1d, 0xc7 => 0xbf40, 0xc8 => 0xbf41,
+    0xc9 => 0xbf44, 0xca => 0xbf48, 0xcb => 0xbf50, 0xcc => 0xbf51,
+    0xcd => 0xbf55, 0xce => 0xbf94, 0xcf => 0xbfb0, 0xd0 => 0xbfc5,
+    0xd1 => 0xbfcc, 0xd2 => 0xbfcd, 0xd3 => 0xbfd0, 0xd4 => 0xbfd4,
+    0xd5 => 0xbfdc, 0xd6 => 0xbfdf, 0xd7 => 0xbfe1, 0xd8 => 0xc03c,
+    0xd9 => 0xc051, 0xda => 0xc058, 0xdb => 0xc05c, 0xdc => 0xc060,
+    0xdd => 0xc068, 0xde => 0xc069, 0xdf => 0xc090, 0xe0 => 0xc091,
+    0xe1 => 0xc094, 0xe2 => 0xc098, 0xe3 => 0xc0a0, 0xe4 => 0xc0a1,
+    0xe5 => 0xc0a3, 0xe6 => 0xc0a5, 0xe7 => 0xc0ac, 0xe8 => 0xc0ad,
+    0xe9 => 0xc0af, 0xea => 0xc0b0, 0xeb => 0xc0b3, 0xec => 0xc0b4,
+    0xed => 0xc0b5, 0xee => 0xc0b6, 0xef => 0xc0bc, 0xf0 => 0xc0bd,
+    0xf1 => 0xc0bf, 0xf2 => 0xc0c0, 0xf3 => 0xc0c1, 0xf4 => 0xc0c5,
+    0xf5 => 0xc0c8, 0xf6 => 0xc0c9, 0xf7 => 0xc0cc, 0xf8 => 0xc0d0,
+    0xf9 => 0xc0d8, 0xfa => 0xc0d9, 0xfb => 0xc0db, 0xfc => 0xc0dc,
+    0xfd => 0xc0dd, 0xfe => 0xc0e4,
+  },
+  0xbc => {
+    0xa1 => 0xc0e5, 0xa2 => 0xc0e8, 0xa3 => 0xc0ec, 0xa4 => 0xc0f4,
+    0xa5 => 0xc0f5, 0xa6 => 0xc0f7, 0xa7 => 0xc0f9, 0xa8 => 0xc100,
+    0xa9 => 0xc104, 0xaa => 0xc108, 0xab => 0xc110, 0xac => 0xc115,
+    0xad => 0xc11c, 0xae => 0xc11d, 0xaf => 0xc11e, 0xb0 => 0xc11f,
+    0xb1 => 0xc120, 0xb2 => 0xc123, 0xb3 => 0xc124, 0xb4 => 0xc126,
+    0xb5 => 0xc127, 0xb6 => 0xc12c, 0xb7 => 0xc12d, 0xb8 => 0xc12f,
+    0xb9 => 0xc130, 0xba => 0xc131, 0xbb => 0xc136, 0xbc => 0xc138,
+    0xbd => 0xc139, 0xbe => 0xc13c, 0xbf => 0xc140, 0xc0 => 0xc148,
+    0xc1 => 0xc149, 0xc2 => 0xc14b, 0xc3 => 0xc14c, 0xc4 => 0xc14d,
+    0xc5 => 0xc154, 0xc6 => 0xc155, 0xc7 => 0xc158, 0xc8 => 0xc15c,
+    0xc9 => 0xc164, 0xca => 0xc165, 0xcb => 0xc167, 0xcc => 0xc168,
+    0xcd => 0xc169, 0xce => 0xc170, 0xcf => 0xc174, 0xd0 => 0xc178,
+    0xd1 => 0xc185, 0xd2 => 0xc18c, 0xd3 => 0xc18d, 0xd4 => 0xc18e,
+    0xd5 => 0xc190, 0xd6 => 0xc194, 0xd7 => 0xc196, 0xd8 => 0xc19c,
+    0xd9 => 0xc19d, 0xda => 0xc19f, 0xdb => 0xc1a1, 0xdc => 0xc1a5,
+    0xdd => 0xc1a8, 0xde => 0xc1a9, 0xdf => 0xc1ac, 0xe0 => 0xc1b0,
+    0xe1 => 0xc1bd, 0xe2 => 0xc1c4, 0xe3 => 0xc1c8, 0xe4 => 0xc1cc,
+    0xe5 => 0xc1d4, 0xe6 => 0xc1d7, 0xe7 => 0xc1d8, 0xe8 => 0xc1e0,
+    0xe9 => 0xc1e4, 0xea => 0xc1e8, 0xeb => 0xc1f0, 0xec => 0xc1f1,
+    0xed => 0xc1f3, 0xee => 0xc1fc, 0xef => 0xc1fd, 0xf0 => 0xc200,
+    0xf1 => 0xc204, 0xf2 => 0xc20c, 0xf3 => 0xc20d, 0xf4 => 0xc20f,
+    0xf5 => 0xc211, 0xf6 => 0xc218, 0xf7 => 0xc219, 0xf8 => 0xc21c,
+    0xf9 => 0xc21f, 0xfa => 0xc220, 0xfb => 0xc228, 0xfc => 0xc229,
+    0xfd => 0xc22b, 0xfe => 0xc22d,
+  },
+  0xbd => {
+    0xa1 => 0xc22f, 0xa2 => 0xc231, 0xa3 => 0xc232, 0xa4 => 0xc234,
+    0xa5 => 0xc248, 0xa6 => 0xc250, 0xa7 => 0xc251, 0xa8 => 0xc254,
+    0xa9 => 0xc258, 0xaa => 0xc260, 0xab => 0xc265, 0xac => 0xc26c,
+    0xad => 0xc26d, 0xae => 0xc270, 0xaf => 0xc274, 0xb0 => 0xc27c,
+    0xb1 => 0xc27d, 0xb2 => 0xc27f, 0xb3 => 0xc281, 0xb4 => 0xc288,
+    0xb5 => 0xc289, 0xb6 => 0xc290, 0xb7 => 0xc298, 0xb8 => 0xc29b,
+    0xb9 => 0xc29d, 0xba => 0xc2a4, 0xbb => 0xc2a5, 0xbc => 0xc2a8,
+    0xbd => 0xc2ac, 0xbe => 0xc2ad, 0xbf => 0xc2b4, 0xc0 => 0xc2b5,
+    0xc1 => 0xc2b7, 0xc2 => 0xc2b9, 0xc3 => 0xc2dc, 0xc4 => 0xc2dd,
+    0xc5 => 0xc2e0, 0xc6 => 0xc2e3, 0xc7 => 0xc2e4, 0xc8 => 0xc2eb,
+    0xc9 => 0xc2ec, 0xca => 0xc2ed, 0xcb => 0xc2ef, 0xcc => 0xc2f1,
+    0xcd => 0xc2f6, 0xce => 0xc2f8, 0xcf => 0xc2f9, 0xd0 => 0xc2fb,
+    0xd1 => 0xc2fc, 0xd2 => 0xc300, 0xd3 => 0xc308, 0xd4 => 0xc309,
+    0xd5 => 0xc30c, 0xd6 => 0xc30d, 0xd7 => 0xc313, 0xd8 => 0xc314,
+    0xd9 => 0xc315, 0xda => 0xc318, 0xdb => 0xc31c, 0xdc => 0xc324,
+    0xdd => 0xc325, 0xde => 0xc328, 0xdf => 0xc329, 0xe0 => 0xc345,
+    0xe1 => 0xc368, 0xe2 => 0xc369, 0xe3 => 0xc36c, 0xe4 => 0xc370,
+    0xe5 => 0xc372, 0xe6 => 0xc378, 0xe7 => 0xc379, 0xe8 => 0xc37c,
+    0xe9 => 0xc37d, 0xea => 0xc384, 0xeb => 0xc388, 0xec => 0xc38c,
+    0xed => 0xc3c0, 0xee => 0xc3d8, 0xef => 0xc3d9, 0xf0 => 0xc3dc,
+    0xf1 => 0xc3df, 0xf2 => 0xc3e0, 0xf3 => 0xc3e2, 0xf4 => 0xc3e8,
+    0xf5 => 0xc3e9, 0xf6 => 0xc3ed, 0xf7 => 0xc3f4, 0xf8 => 0xc3f5,
+    0xf9 => 0xc3f8, 0xfa => 0xc408, 0xfb => 0xc410, 0xfc => 0xc424,
+    0xfd => 0xc42c, 0xfe => 0xc430,
+  },
+  0xbe => {
+    0xa1 => 0xc434, 0xa2 => 0xc43c, 0xa3 => 0xc43d, 0xa4 => 0xc448,
+    0xa5 => 0xc464, 0xa6 => 0xc465, 0xa7 => 0xc468, 0xa8 => 0xc46c,
+    0xa9 => 0xc474, 0xaa => 0xc475, 0xab => 0xc479, 0xac => 0xc480,
+    0xad => 0xc494, 0xae => 0xc49c, 0xaf => 0xc4b8, 0xb0 => 0xc4bc,
+    0xb1 => 0xc4e9, 0xb2 => 0xc4f0, 0xb3 => 0xc4f1, 0xb4 => 0xc4f4,
+    0xb5 => 0xc4f8, 0xb6 => 0xc4fa, 0xb7 => 0xc4ff, 0xb8 => 0xc500,
+    0xb9 => 0xc501, 0xba => 0xc50c, 0xbb => 0xc510, 0xbc => 0xc514,
+    0xbd => 0xc51c, 0xbe => 0xc528, 0xbf => 0xc529, 0xc0 => 0xc52c,
+    0xc1 => 0xc530, 0xc2 => 0xc538, 0xc3 => 0xc539, 0xc4 => 0xc53b,
+    0xc5 => 0xc53d, 0xc6 => 0xc544, 0xc7 => 0xc545, 0xc8 => 0xc548,
+    0xc9 => 0xc549, 0xca => 0xc54a, 0xcb => 0xc54c, 0xcc => 0xc54d,
+    0xcd => 0xc54e, 0xce => 0xc553, 0xcf => 0xc554, 0xd0 => 0xc555,
+    0xd1 => 0xc557, 0xd2 => 0xc558, 0xd3 => 0xc559, 0xd4 => 0xc55d,
+    0xd5 => 0xc55e, 0xd6 => 0xc560, 0xd7 => 0xc561, 0xd8 => 0xc564,
+    0xd9 => 0xc568, 0xda => 0xc570, 0xdb => 0xc571, 0xdc => 0xc573,
+    0xdd => 0xc574, 0xde => 0xc575, 0xdf => 0xc57c, 0xe0 => 0xc57d,
+    0xe1 => 0xc580, 0xe2 => 0xc584, 0xe3 => 0xc587, 0xe4 => 0xc58c,
+    0xe5 => 0xc58d, 0xe6 => 0xc58f, 0xe7 => 0xc591, 0xe8 => 0xc595,
+    0xe9 => 0xc597, 0xea => 0xc598, 0xeb => 0xc59c, 0xec => 0xc5a0,
+    0xed => 0xc5a9, 0xee => 0xc5b4, 0xef => 0xc5b5, 0xf0 => 0xc5b8,
+    0xf1 => 0xc5b9, 0xf2 => 0xc5bb, 0xf3 => 0xc5bc, 0xf4 => 0xc5bd,
+    0xf5 => 0xc5be, 0xf6 => 0xc5c4, 0xf7 => 0xc5c5, 0xf8 => 0xc5c6,
+    0xf9 => 0xc5c7, 0xfa => 0xc5c8, 0xfb => 0xc5c9, 0xfc => 0xc5ca,
+    0xfd => 0xc5cc, 0xfe => 0xc5ce,
+  },
+  0xbf => {
+    0xa1 => 0xc5d0, 0xa2 => 0xc5d1, 0xa3 => 0xc5d4, 0xa4 => 0xc5d8,
+    0xa5 => 0xc5e0, 0xa6 => 0xc5e1, 0xa7 => 0xc5e3, 0xa8 => 0xc5e5,
+    0xa9 => 0xc5ec, 0xaa => 0xc5ed, 0xab => 0xc5ee, 0xac => 0xc5f0,
+    0xad => 0xc5f4, 0xae => 0xc5f6, 0xaf => 0xc5f7, 0xb0 => 0xc5fc,
+    0xb1 => 0xc5fd, 0xb2 => 0xc5fe, 0xb3 => 0xc5ff, 0xb4 => 0xc600,
+    0xb5 => 0xc601, 0xb6 => 0xc605, 0xb7 => 0xc606, 0xb8 => 0xc607,
+    0xb9 => 0xc608, 0xba => 0xc60c, 0xbb => 0xc610, 0xbc => 0xc618,
+    0xbd => 0xc619, 0xbe => 0xc61b, 0xbf => 0xc61c, 0xc0 => 0xc624,
+    0xc1 => 0xc625, 0xc2 => 0xc628, 0xc3 => 0xc62c, 0xc4 => 0xc62d,
+    0xc5 => 0xc62e, 0xc6 => 0xc630, 0xc7 => 0xc633, 0xc8 => 0xc634,
+    0xc9 => 0xc635, 0xca => 0xc637, 0xcb => 0xc639, 0xcc => 0xc63b,
+    0xcd => 0xc640, 0xce => 0xc641, 0xcf => 0xc644, 0xd0 => 0xc648,
+    0xd1 => 0xc650, 0xd2 => 0xc651, 0xd3 => 0xc653, 0xd4 => 0xc654,
+    0xd5 => 0xc655, 0xd6 => 0xc65c, 0xd7 => 0xc65d, 0xd8 => 0xc660,
+    0xd9 => 0xc66c, 0xda => 0xc66f, 0xdb => 0xc671, 0xdc => 0xc678,
+    0xdd => 0xc679, 0xde => 0xc67c, 0xdf => 0xc680, 0xe0 => 0xc688,
+    0xe1 => 0xc689, 0xe2 => 0xc68b, 0xe3 => 0xc68d, 0xe4 => 0xc694,
+    0xe5 => 0xc695, 0xe6 => 0xc698, 0xe7 => 0xc69c, 0xe8 => 0xc6a4,
+    0xe9 => 0xc6a5, 0xea => 0xc6a7, 0xeb => 0xc6a9, 0xec => 0xc6b0,
+    0xed => 0xc6b1, 0xee => 0xc6b4, 0xef => 0xc6b8, 0xf0 => 0xc6b9,
+    0xf1 => 0xc6ba, 0xf2 => 0xc6c0, 0xf3 => 0xc6c1, 0xf4 => 0xc6c3,
+    0xf5 => 0xc6c5, 0xf6 => 0xc6cc, 0xf7 => 0xc6cd, 0xf8 => 0xc6d0,
+    0xf9 => 0xc6d4, 0xfa => 0xc6dc, 0xfb => 0xc6dd, 0xfc => 0xc6e0,
+    0xfd => 0xc6e1, 0xfe => 0xc6e8,
+  },
+  0xc0 => {
+    0xa1 => 0xc6e9, 0xa2 => 0xc6ec, 0xa3 => 0xc6f0, 0xa4 => 0xc6f8,
+    0xa5 => 0xc6f9, 0xa6 => 0xc6fd, 0xa7 => 0xc704, 0xa8 => 0xc705,
+    0xa9 => 0xc708, 0xaa => 0xc70c, 0xab => 0xc714, 0xac => 0xc715,
+    0xad => 0xc717, 0xae => 0xc719, 0xaf => 0xc720, 0xb0 => 0xc721,
+    0xb1 => 0xc724, 0xb2 => 0xc728, 0xb3 => 0xc730, 0xb4 => 0xc731,
+    0xb5 => 0xc733, 0xb6 => 0xc735, 0xb7 => 0xc737, 0xb8 => 0xc73c,
+    0xb9 => 0xc73d, 0xba => 0xc740, 0xbb => 0xc744, 0xbc => 0xc74a,
+    0xbd => 0xc74c, 0xbe => 0xc74d, 0xbf => 0xc74f, 0xc0 => 0xc751,
+    0xc1 => 0xc752, 0xc2 => 0xc753, 0xc3 => 0xc754, 0xc4 => 0xc755,
+    0xc5 => 0xc756, 0xc6 => 0xc757, 0xc7 => 0xc758, 0xc8 => 0xc75c,
+    0xc9 => 0xc760, 0xca => 0xc768, 0xcb => 0xc76b, 0xcc => 0xc774,
+    0xcd => 0xc775, 0xce => 0xc778, 0xcf => 0xc77c, 0xd0 => 0xc77d,
+    0xd1 => 0xc77e, 0xd2 => 0xc783, 0xd3 => 0xc784, 0xd4 => 0xc785,
+    0xd5 => 0xc787, 0xd6 => 0xc788, 0xd7 => 0xc789, 0xd8 => 0xc78a,
+    0xd9 => 0xc78e, 0xda => 0xc790, 0xdb => 0xc791, 0xdc => 0xc794,
+    0xdd => 0xc796, 0xde => 0xc797, 0xdf => 0xc798, 0xe0 => 0xc79a,
+    0xe1 => 0xc7a0, 0xe2 => 0xc7a1, 0xe3 => 0xc7a3, 0xe4 => 0xc7a4,
+    0xe5 => 0xc7a5, 0xe6 => 0xc7a6, 0xe7 => 0xc7ac, 0xe8 => 0xc7ad,
+    0xe9 => 0xc7b0, 0xea => 0xc7b4, 0xeb => 0xc7bc, 0xec => 0xc7bd,
+    0xed => 0xc7bf, 0xee => 0xc7c0, 0xef => 0xc7c1, 0xf0 => 0xc7c8,
+    0xf1 => 0xc7c9, 0xf2 => 0xc7cc, 0xf3 => 0xc7ce, 0xf4 => 0xc7d0,
+    0xf5 => 0xc7d8, 0xf6 => 0xc7dd, 0xf7 => 0xc7e4, 0xf8 => 0xc7e8,
+    0xf9 => 0xc7ec, 0xfa => 0xc800, 0xfb => 0xc801, 0xfc => 0xc804,
+    0xfd => 0xc808, 0xfe => 0xc80a,
+  },
+  0xc1 => {
+    0xa1 => 0xc810, 0xa2 => 0xc811, 0xa3 => 0xc813, 0xa4 => 0xc815,
+    0xa5 => 0xc816, 0xa6 => 0xc81c, 0xa7 => 0xc81d, 0xa8 => 0xc820,
+    0xa9 => 0xc824, 0xaa => 0xc82c, 0xab => 0xc82d, 0xac => 0xc82f,
+    0xad => 0xc831, 0xae => 0xc838, 0xaf => 0xc83c, 0xb0 => 0xc840,
+    0xb1 => 0xc848, 0xb2 => 0xc849, 0xb3 => 0xc84c, 0xb4 => 0xc84d,
+    0xb5 => 0xc854, 0xb6 => 0xc870, 0xb7 => 0xc871, 0xb8 => 0xc874,
+    0xb9 => 0xc878, 0xba => 0xc87a, 0xbb => 0xc880, 0xbc => 0xc881,
+    0xbd => 0xc883, 0xbe => 0xc885, 0xbf => 0xc886, 0xc0 => 0xc887,
+    0xc1 => 0xc88b, 0xc2 => 0xc88c, 0xc3 => 0xc88d, 0xc4 => 0xc894,
+    0xc5 => 0xc89d, 0xc6 => 0xc89f, 0xc7 => 0xc8a1, 0xc8 => 0xc8a8,
+    0xc9 => 0xc8bc, 0xca => 0xc8bd, 0xcb => 0xc8c4, 0xcc => 0xc8c8,
+    0xcd => 0xc8cc, 0xce => 0xc8d4, 0xcf => 0xc8d5, 0xd0 => 0xc8d7,
+    0xd1 => 0xc8d9, 0xd2 => 0xc8e0, 0xd3 => 0xc8e1, 0xd4 => 0xc8e4,
+    0xd5 => 0xc8f5, 0xd6 => 0xc8fc, 0xd7 => 0xc8fd, 0xd8 => 0xc900,
+    0xd9 => 0xc904, 0xda => 0xc905, 0xdb => 0xc906, 0xdc => 0xc90c,
+    0xdd => 0xc90d, 0xde => 0xc90f, 0xdf => 0xc911, 0xe0 => 0xc918,
+    0xe1 => 0xc92c, 0xe2 => 0xc934, 0xe3 => 0xc950, 0xe4 => 0xc951,
+    0xe5 => 0xc954, 0xe6 => 0xc958, 0xe7 => 0xc960, 0xe8 => 0xc961,
+    0xe9 => 0xc963, 0xea => 0xc96c, 0xeb => 0xc970, 0xec => 0xc974,
+    0xed => 0xc97c, 0xee => 0xc988, 0xef => 0xc989, 0xf0 => 0xc98c,
+    0xf1 => 0xc990, 0xf2 => 0xc998, 0xf3 => 0xc999, 0xf4 => 0xc99b,
+    0xf5 => 0xc99d, 0xf6 => 0xc9c0, 0xf7 => 0xc9c1, 0xf8 => 0xc9c4,
+    0xf9 => 0xc9c7, 0xfa => 0xc9c8, 0xfb => 0xc9ca, 0xfc => 0xc9d0,
+    0xfd => 0xc9d1, 0xfe => 0xc9d3,
+  },
+  0xc2 => {
+    0xa1 => 0xc9d5, 0xa2 => 0xc9d6, 0xa3 => 0xc9d9, 0xa4 => 0xc9da,
+    0xa5 => 0xc9dc, 0xa6 => 0xc9dd, 0xa7 => 0xc9e0, 0xa8 => 0xc9e2,
+    0xa9 => 0xc9e4, 0xaa => 0xc9e7, 0xab => 0xc9ec, 0xac => 0xc9ed,
+    0xad => 0xc9ef, 0xae => 0xc9f0, 0xaf => 0xc9f1, 0xb0 => 0xc9f8,
+    0xb1 => 0xc9f9, 0xb2 => 0xc9fc, 0xb3 => 0xca00, 0xb4 => 0xca08,
+    0xb5 => 0xca09, 0xb6 => 0xca0b, 0xb7 => 0xca0c, 0xb8 => 0xca0d,
+    0xb9 => 0xca14, 0xba => 0xca18, 0xbb => 0xca29, 0xbc => 0xca4c,
+    0xbd => 0xca4d, 0xbe => 0xca50, 0xbf => 0xca54, 0xc0 => 0xca5c,
+    0xc1 => 0xca5d, 0xc2 => 0xca5f, 0xc3 => 0xca60, 0xc4 => 0xca61,
+    0xc5 => 0xca68, 0xc6 => 0xca7d, 0xc7 => 0xca84, 0xc8 => 0xca98,
+    0xc9 => 0xcabc, 0xca => 0xcabd, 0xcb => 0xcac0, 0xcc => 0xcac4,
+    0xcd => 0xcacc, 0xce => 0xcacd, 0xcf => 0xcacf, 0xd0 => 0xcad1,
+    0xd1 => 0xcad3, 0xd2 => 0xcad8, 0xd3 => 0xcad9, 0xd4 => 0xcae0,
+    0xd5 => 0xcaec, 0xd6 => 0xcaf4, 0xd7 => 0xcb08, 0xd8 => 0xcb10,
+    0xd9 => 0xcb14, 0xda => 0xcb18, 0xdb => 0xcb20, 0xdc => 0xcb21,
+    0xdd => 0xcb41, 0xde => 0xcb48, 0xdf => 0xcb49, 0xe0 => 0xcb4c,
+    0xe1 => 0xcb50, 0xe2 => 0xcb58, 0xe3 => 0xcb59, 0xe4 => 0xcb5d,
+    0xe5 => 0xcb64, 0xe6 => 0xcb78, 0xe7 => 0xcb79, 0xe8 => 0xcb9c,
+    0xe9 => 0xcbb8, 0xea => 0xcbd4, 0xeb => 0xcbe4, 0xec => 0xcbe7,
+    0xed => 0xcbe9, 0xee => 0xcc0c, 0xef => 0xcc0d, 0xf0 => 0xcc10,
+    0xf1 => 0xcc14, 0xf2 => 0xcc1c, 0xf3 => 0xcc1d, 0xf4 => 0xcc21,
+    0xf5 => 0xcc22, 0xf6 => 0xcc27, 0xf7 => 0xcc28, 0xf8 => 0xcc29,
+    0xf9 => 0xcc2c, 0xfa => 0xcc2e, 0xfb => 0xcc30, 0xfc => 0xcc38,
+    0xfd => 0xcc39, 0xfe => 0xcc3b,
+  },
+  0xc3 => {
+    0xa1 => 0xcc3c, 0xa2 => 0xcc3d, 0xa3 => 0xcc3e, 0xa4 => 0xcc44,
+    0xa5 => 0xcc45, 0xa6 => 0xcc48, 0xa7 => 0xcc4c, 0xa8 => 0xcc54,
+    0xa9 => 0xcc55, 0xaa => 0xcc57, 0xab => 0xcc58, 0xac => 0xcc59,
+    0xad => 0xcc60, 0xae => 0xcc64, 0xaf => 0xcc66, 0xb0 => 0xcc68,
+    0xb1 => 0xcc70, 0xb2 => 0xcc75, 0xb3 => 0xcc98, 0xb4 => 0xcc99,
+    0xb5 => 0xcc9c, 0xb6 => 0xcca0, 0xb7 => 0xcca8, 0xb8 => 0xcca9,
+    0xb9 => 0xccab, 0xba => 0xccac, 0xbb => 0xccad, 0xbc => 0xccb4,
+    0xbd => 0xccb5, 0xbe => 0xccb8, 0xbf => 0xccbc, 0xc0 => 0xccc4,
+    0xc1 => 0xccc5, 0xc2 => 0xccc7, 0xc3 => 0xccc9, 0xc4 => 0xccd0,
+    0xc5 => 0xccd4, 0xc6 => 0xcce4, 0xc7 => 0xccec, 0xc8 => 0xccf0,
+    0xc9 => 0xcd01, 0xca => 0xcd08, 0xcb => 0xcd09, 0xcc => 0xcd0c,
+    0xcd => 0xcd10, 0xce => 0xcd18, 0xcf => 0xcd19, 0xd0 => 0xcd1b,
+    0xd1 => 0xcd1d, 0xd2 => 0xcd24, 0xd3 => 0xcd28, 0xd4 => 0xcd2c,
+    0xd5 => 0xcd39, 0xd6 => 0xcd5c, 0xd7 => 0xcd60, 0xd8 => 0xcd64,
+    0xd9 => 0xcd6c, 0xda => 0xcd6d, 0xdb => 0xcd6f, 0xdc => 0xcd71,
+    0xdd => 0xcd78, 0xde => 0xcd88, 0xdf => 0xcd94, 0xe0 => 0xcd95,
+    0xe1 => 0xcd98, 0xe2 => 0xcd9c, 0xe3 => 0xcda4, 0xe4 => 0xcda5,
+    0xe5 => 0xcda7, 0xe6 => 0xcda9, 0xe7 => 0xcdb0, 0xe8 => 0xcdc4,
+    0xe9 => 0xcdcc, 0xea => 0xcdd0, 0xeb => 0xcde8, 0xec => 0xcdec,
+    0xed => 0xcdf0, 0xee => 0xcdf8, 0xef => 0xcdf9, 0xf0 => 0xcdfb,
+    0xf1 => 0xcdfd, 0xf2 => 0xce04, 0xf3 => 0xce08, 0xf4 => 0xce0c,
+    0xf5 => 0xce14, 0xf6 => 0xce19, 0xf7 => 0xce20, 0xf8 => 0xce21,
+    0xf9 => 0xce24, 0xfa => 0xce28, 0xfb => 0xce30, 0xfc => 0xce31,
+    0xfd => 0xce33, 0xfe => 0xce35,
+  },
+  0xc4 => {
+    0xa1 => 0xce58, 0xa2 => 0xce59, 0xa3 => 0xce5c, 0xa4 => 0xce5f,
+    0xa5 => 0xce60, 0xa6 => 0xce61, 0xa7 => 0xce68, 0xa8 => 0xce69,
+    0xa9 => 0xce6b, 0xaa => 0xce6d, 0xab => 0xce74, 0xac => 0xce75,
+    0xad => 0xce78, 0xae => 0xce7c, 0xaf => 0xce84, 0xb0 => 0xce85,
+    0xb1 => 0xce87, 0xb2 => 0xce89, 0xb3 => 0xce90, 0xb4 => 0xce91,
+    0xb5 => 0xce94, 0xb6 => 0xce98, 0xb7 => 0xcea0, 0xb8 => 0xcea1,
+    0xb9 => 0xcea3, 0xba => 0xcea4, 0xbb => 0xcea5, 0xbc => 0xceac,
+    0xbd => 0xcead, 0xbe => 0xcec1, 0xbf => 0xcee4, 0xc0 => 0xcee5,
+    0xc1 => 0xcee8, 0xc2 => 0xceeb, 0xc3 => 0xceec, 0xc4 => 0xcef4,
+    0xc5 => 0xcef5, 0xc6 => 0xcef7, 0xc7 => 0xcef8, 0xc8 => 0xcef9,
+    0xc9 => 0xcf00, 0xca => 0xcf01, 0xcb => 0xcf04, 0xcc => 0xcf08,
+    0xcd => 0xcf10, 0xce => 0xcf11, 0xcf => 0xcf13, 0xd0 => 0xcf15,
+    0xd1 => 0xcf1c, 0xd2 => 0xcf20, 0xd3 => 0xcf24, 0xd4 => 0xcf2c,
+    0xd5 => 0xcf2d, 0xd6 => 0xcf2f, 0xd7 => 0xcf30, 0xd8 => 0xcf31,
+    0xd9 => 0xcf38, 0xda => 0xcf54, 0xdb => 0xcf55, 0xdc => 0xcf58,
+    0xdd => 0xcf5c, 0xde => 0xcf64, 0xdf => 0xcf65, 0xe0 => 0xcf67,
+    0xe1 => 0xcf69, 0xe2 => 0xcf70, 0xe3 => 0xcf71, 0xe4 => 0xcf74,
+    0xe5 => 0xcf78, 0xe6 => 0xcf80, 0xe7 => 0xcf85, 0xe8 => 0xcf8c,
+    0xe9 => 0xcfa1, 0xea => 0xcfa8, 0xeb => 0xcfb0, 0xec => 0xcfc4,
+    0xed => 0xcfe0, 0xee => 0xcfe1, 0xef => 0xcfe4, 0xf0 => 0xcfe8,
+    0xf1 => 0xcff0, 0xf2 => 0xcff1, 0xf3 => 0xcff3, 0xf4 => 0xcff5,
+    0xf5 => 0xcffc, 0xf6 => 0xd000, 0xf7 => 0xd004, 0xf8 => 0xd011,
+    0xf9 => 0xd018, 0xfa => 0xd02d, 0xfb => 0xd034, 0xfc => 0xd035,
+    0xfd => 0xd038, 0xfe => 0xd03c,
+  },
+  0xc5 => {
+    0xa1 => 0xd044, 0xa2 => 0xd045, 0xa3 => 0xd047, 0xa4 => 0xd049,
+    0xa5 => 0xd050, 0xa6 => 0xd054, 0xa7 => 0xd058, 0xa8 => 0xd060,
+    0xa9 => 0xd06c, 0xaa => 0xd06d, 0xab => 0xd070, 0xac => 0xd074,
+    0xad => 0xd07c, 0xae => 0xd07d, 0xaf => 0xd081, 0xb0 => 0xd0a4,
+    0xb1 => 0xd0a5, 0xb2 => 0xd0a8, 0xb3 => 0xd0ac, 0xb4 => 0xd0b4,
+    0xb5 => 0xd0b5, 0xb6 => 0xd0b7, 0xb7 => 0xd0b9, 0xb8 => 0xd0c0,
+    0xb9 => 0xd0c1, 0xba => 0xd0c4, 0xbb => 0xd0c8, 0xbc => 0xd0c9,
+    0xbd => 0xd0d0, 0xbe => 0xd0d1, 0xbf => 0xd0d3, 0xc0 => 0xd0d4,
+    0xc1 => 0xd0d5, 0xc2 => 0xd0dc, 0xc3 => 0xd0dd, 0xc4 => 0xd0e0,
+    0xc5 => 0xd0e4, 0xc6 => 0xd0ec, 0xc7 => 0xd0ed, 0xc8 => 0xd0ef,
+    0xc9 => 0xd0f0, 0xca => 0xd0f1, 0xcb => 0xd0f8, 0xcc => 0xd10d,
+    0xcd => 0xd130, 0xce => 0xd131, 0xcf => 0xd134, 0xd0 => 0xd138,
+    0xd1 => 0xd13a, 0xd2 => 0xd140, 0xd3 => 0xd141, 0xd4 => 0xd143,
+    0xd5 => 0xd144, 0xd6 => 0xd145, 0xd7 => 0xd14c, 0xd8 => 0xd14d,
+    0xd9 => 0xd150, 0xda => 0xd154, 0xdb => 0xd15c, 0xdc => 0xd15d,
+    0xdd => 0xd15f, 0xde => 0xd161, 0xdf => 0xd168, 0xe0 => 0xd16c,
+    0xe1 => 0xd17c, 0xe2 => 0xd184, 0xe3 => 0xd188, 0xe4 => 0xd1a0,
+    0xe5 => 0xd1a1, 0xe6 => 0xd1a4, 0xe7 => 0xd1a8, 0xe8 => 0xd1b0,
+    0xe9 => 0xd1b1, 0xea => 0xd1b3, 0xeb => 0xd1b5, 0xec => 0xd1ba,
+    0xed => 0xd1bc, 0xee => 0xd1c0, 0xef => 0xd1d8, 0xf0 => 0xd1f4,
+    0xf1 => 0xd1f8, 0xf2 => 0xd207, 0xf3 => 0xd209, 0xf4 => 0xd210,
+    0xf5 => 0xd22c, 0xf6 => 0xd22d, 0xf7 => 0xd230, 0xf8 => 0xd234,
+    0xf9 => 0xd23c, 0xfa => 0xd23d, 0xfb => 0xd23f, 0xfc => 0xd241,
+    0xfd => 0xd248, 0xfe => 0xd25c,
+  },
+  0xc6 => {
+    0xa1 => 0xd264, 0xa2 => 0xd280, 0xa3 => 0xd281, 0xa4 => 0xd284,
+    0xa5 => 0xd288, 0xa6 => 0xd290, 0xa7 => 0xd291, 0xa8 => 0xd295,
+    0xa9 => 0xd29c, 0xaa => 0xd2a0, 0xab => 0xd2a4, 0xac => 0xd2ac,
+    0xad => 0xd2b1, 0xae => 0xd2b8, 0xaf => 0xd2b9, 0xb0 => 0xd2bc,
+    0xb1 => 0xd2bf, 0xb2 => 0xd2c0, 0xb3 => 0xd2c2, 0xb4 => 0xd2c8,
+    0xb5 => 0xd2c9, 0xb6 => 0xd2cb, 0xb7 => 0xd2d4, 0xb8 => 0xd2d8,
+    0xb9 => 0xd2dc, 0xba => 0xd2e4, 0xbb => 0xd2e5, 0xbc => 0xd2f0,
+    0xbd => 0xd2f1, 0xbe => 0xd2f4, 0xbf => 0xd2f8, 0xc0 => 0xd300,
+    0xc1 => 0xd301, 0xc2 => 0xd303, 0xc3 => 0xd305, 0xc4 => 0xd30c,
+    0xc5 => 0xd30d, 0xc6 => 0xd30e, 0xc7 => 0xd310, 0xc8 => 0xd314,
+    0xc9 => 0xd316, 0xca => 0xd31c, 0xcb => 0xd31d, 0xcc => 0xd31f,
+    0xcd => 0xd320, 0xce => 0xd321, 0xcf => 0xd325, 0xd0 => 0xd328,
+    0xd1 => 0xd329, 0xd2 => 0xd32c, 0xd3 => 0xd330, 0xd4 => 0xd338,
+    0xd5 => 0xd339, 0xd6 => 0xd33b, 0xd7 => 0xd33c, 0xd8 => 0xd33d,
+    0xd9 => 0xd344, 0xda => 0xd345, 0xdb => 0xd37c, 0xdc => 0xd37d,
+    0xdd => 0xd380, 0xde => 0xd384, 0xdf => 0xd38c, 0xe0 => 0xd38d,
+    0xe1 => 0xd38f, 0xe2 => 0xd390, 0xe3 => 0xd391, 0xe4 => 0xd398,
+    0xe5 => 0xd399, 0xe6 => 0xd39c, 0xe7 => 0xd3a0, 0xe8 => 0xd3a8,
+    0xe9 => 0xd3a9, 0xea => 0xd3ab, 0xeb => 0xd3ad, 0xec => 0xd3b4,
+    0xed => 0xd3b8, 0xee => 0xd3bc, 0xef => 0xd3c4, 0xf0 => 0xd3c5,
+    0xf1 => 0xd3c8, 0xf2 => 0xd3c9, 0xf3 => 0xd3d0, 0xf4 => 0xd3d8,
+    0xf5 => 0xd3e1, 0xf6 => 0xd3e3, 0xf7 => 0xd3ec, 0xf8 => 0xd3ed,
+    0xf9 => 0xd3f0, 0xfa => 0xd3f4, 0xfb => 0xd3fc, 0xfc => 0xd3fd,
+    0xfd => 0xd3ff, 0xfe => 0xd401,
+  },
+  0xc7 => {
+    0xa1 => 0xd408, 0xa2 => 0xd41d, 0xa3 => 0xd440, 0xa4 => 0xd444,
+    0xa5 => 0xd45c, 0xa6 => 0xd460, 0xa7 => 0xd464, 0xa8 => 0xd46d,
+    0xa9 => 0xd46f, 0xaa => 0xd478, 0xab => 0xd479, 0xac => 0xd47c,
+    0xad => 0xd47f, 0xae => 0xd480, 0xaf => 0xd482, 0xb0 => 0xd488,
+    0xb1 => 0xd489, 0xb2 => 0xd48b, 0xb3 => 0xd48d, 0xb4 => 0xd494,
+    0xb5 => 0xd4a9, 0xb6 => 0xd4cc, 0xb7 => 0xd4d0, 0xb8 => 0xd4d4,
+    0xb9 => 0xd4dc, 0xba => 0xd4df, 0xbb => 0xd4e8, 0xbc => 0xd4ec,
+    0xbd => 0xd4f0, 0xbe => 0xd4f8, 0xbf => 0xd4fb, 0xc0 => 0xd4fd,
+    0xc1 => 0xd504, 0xc2 => 0xd508, 0xc3 => 0xd50c, 0xc4 => 0xd514,
+    0xc5 => 0xd515, 0xc6 => 0xd517, 0xc7 => 0xd53c, 0xc8 => 0xd53d,
+    0xc9 => 0xd540, 0xca => 0xd544, 0xcb => 0xd54c, 0xcc => 0xd54d,
+    0xcd => 0xd54f, 0xce => 0xd551, 0xcf => 0xd558, 0xd0 => 0xd559,
+    0xd1 => 0xd55c, 0xd2 => 0xd560, 0xd3 => 0xd565, 0xd4 => 0xd568,
+    0xd5 => 0xd569, 0xd6 => 0xd56b, 0xd7 => 0xd56d, 0xd8 => 0xd574,
+    0xd9 => 0xd575, 0xda => 0xd578, 0xdb => 0xd57c, 0xdc => 0xd584,
+    0xdd => 0xd585, 0xde => 0xd587, 0xdf => 0xd588, 0xe0 => 0xd589,
+    0xe1 => 0xd590, 0xe2 => 0xd5a5, 0xe3 => 0xd5c8, 0xe4 => 0xd5c9,
+    0xe5 => 0xd5cc, 0xe6 => 0xd5d0, 0xe7 => 0xd5d2, 0xe8 => 0xd5d8,
+    0xe9 => 0xd5d9, 0xea => 0xd5db, 0xeb => 0xd5dd, 0xec => 0xd5e4,
+    0xed => 0xd5e5, 0xee => 0xd5e8, 0xef => 0xd5ec, 0xf0 => 0xd5f4,
+    0xf1 => 0xd5f5, 0xf2 => 0xd5f7, 0xf3 => 0xd5f9, 0xf4 => 0xd600,
+    0xf5 => 0xd601, 0xf6 => 0xd604, 0xf7 => 0xd608, 0xf8 => 0xd610,
+    0xf9 => 0xd611, 0xfa => 0xd613, 0xfb => 0xd614, 0xfc => 0xd615,
+    0xfd => 0xd61c, 0xfe => 0xd620,
+  },
+  0xc8 => {
+    0xa1 => 0xd624, 0xa2 => 0xd62d, 0xa3 => 0xd638, 0xa4 => 0xd639,
+    0xa5 => 0xd63c, 0xa6 => 0xd640, 0xa7 => 0xd645, 0xa8 => 0xd648,
+    0xa9 => 0xd649, 0xaa => 0xd64b, 0xab => 0xd64d, 0xac => 0xd651,
+    0xad => 0xd654, 0xae => 0xd655, 0xaf => 0xd658, 0xb0 => 0xd65c,
+    0xb1 => 0xd667, 0xb2 => 0xd669, 0xb3 => 0xd670, 0xb4 => 0xd671,
+    0xb5 => 0xd674, 0xb6 => 0xd683, 0xb7 => 0xd685, 0xb8 => 0xd68c,
+    0xb9 => 0xd68d, 0xba => 0xd690, 0xbb => 0xd694, 0xbc => 0xd69d,
+    0xbd => 0xd69f, 0xbe => 0xd6a1, 0xbf => 0xd6a8, 0xc0 => 0xd6ac,
+    0xc1 => 0xd6b0, 0xc2 => 0xd6b9, 0xc3 => 0xd6bb, 0xc4 => 0xd6c4,
+    0xc5 => 0xd6c5, 0xc6 => 0xd6c8, 0xc7 => 0xd6cc, 0xc8 => 0xd6d1,
+    0xc9 => 0xd6d4, 0xca => 0xd6d7, 0xcb => 0xd6d9, 0xcc => 0xd6e0,
+    0xcd => 0xd6e4, 0xce => 0xd6e8, 0xcf => 0xd6f0, 0xd0 => 0xd6f5,
+    0xd1 => 0xd6fc, 0xd2 => 0xd6fd, 0xd3 => 0xd700, 0xd4 => 0xd704,
+    0xd5 => 0xd711, 0xd6 => 0xd718, 0xd7 => 0xd719, 0xd8 => 0xd71c,
+    0xd9 => 0xd720, 0xda => 0xd728, 0xdb => 0xd729, 0xdc => 0xd72b,
+    0xdd => 0xd72d, 0xde => 0xd734, 0xdf => 0xd735, 0xe0 => 0xd738,
+    0xe1 => 0xd73c, 0xe2 => 0xd744, 0xe3 => 0xd747, 0xe4 => 0xd749,
+    0xe5 => 0xd750, 0xe6 => 0xd751, 0xe7 => 0xd754, 0xe8 => 0xd756,
+    0xe9 => 0xd757, 0xea => 0xd758, 0xeb => 0xd759, 0xec => 0xd760,
+    0xed => 0xd761, 0xee => 0xd763, 0xef => 0xd765, 0xf0 => 0xd769,
+    0xf1 => 0xd76c, 0xf2 => 0xd770, 0xf3 => 0xd774, 0xf4 => 0xd77c,
+    0xf5 => 0xd77d, 0xf6 => 0xd781, 0xf7 => 0xd788, 0xf8 => 0xd789,
+    0xf9 => 0xd78c, 0xfa => 0xd790, 0xfb => 0xd798, 0xfc => 0xd799,
+    0xfd => 0xd79b, 0xfe => 0xd79d,
+  },
+  0xca => {
+    0xa1 => 0x4f3d, 0xa2 => 0x4f73, 0xa3 => 0x5047, 0xa4 => 0x50f9,
+    0xa5 => 0x52a0, 0xa6 => 0x53ef, 0xa7 => 0x5475, 0xa8 => 0x54e5,
+    0xa9 => 0x5609, 0xaa => 0x5ac1, 0xab => 0x5bb6, 0xac => 0x6687,
+    0xad => 0x67b6, 0xae => 0x67b7, 0xaf => 0x67ef, 0xb0 => 0x6b4c,
+    0xb1 => 0x73c2, 0xb2 => 0x75c2, 0xb3 => 0x7a3c, 0xb4 => 0x82db,
+    0xb5 => 0x8304, 0xb6 => 0x8857, 0xb7 => 0x8888, 0xb8 => 0x8a36,
+    0xb9 => 0x8cc8, 0xba => 0x8dcf, 0xbb => 0x8efb, 0xbc => 0x8fe6,
+    0xbd => 0x99d5, 0xbe => 0x523b, 0xbf => 0x5374, 0xc0 => 0x5404,
+    0xc1 => 0x606a, 0xc2 => 0x6164, 0xc3 => 0x6bbc, 0xc4 => 0x73cf,
+    0xc5 => 0x811a, 0xc6 => 0x89ba, 0xc7 => 0x89d2, 0xc8 => 0x95a3,
+    0xc9 => 0x4f83, 0xca => 0x520a, 0xcb => 0x58be, 0xcc => 0x5978,
+    0xcd => 0x59e6, 0xce => 0x5e72, 0xcf => 0x5e79, 0xd0 => 0x61c7,
+    0xd1 => 0x63c0, 0xd2 => 0x6746, 0xd3 => 0x67ec, 0xd4 => 0x687f,
+    0xd5 => 0x6f97, 0xd6 => 0x764e, 0xd7 => 0x770b, 0xd8 => 0x78f5,
+    0xd9 => 0x7a08, 0xda => 0x7aff, 0xdb => 0x7c21, 0xdc => 0x809d,
+    0xdd => 0x826e, 0xde => 0x8271, 0xdf => 0x8aeb, 0xe0 => 0x9593,
+    0xe1 => 0x4e6b, 0xe2 => 0x559d, 0xe3 => 0x66f7, 0xe4 => 0x6e34,
+    0xe5 => 0x78a3, 0xe6 => 0x7aed, 0xe7 => 0x845b, 0xe8 => 0x8910,
+    0xe9 => 0x874e, 0xea => 0x97a8, 0xeb => 0x52d8, 0xec => 0x574e,
+    0xed => 0x582a, 0xee => 0x5d4c, 0xef => 0x611f, 0xf0 => 0x61be,
+    0xf1 => 0x6221, 0xf2 => 0x6562, 0xf3 => 0x67d1, 0xf4 => 0x6a44,
+    0xf5 => 0x6e1b, 0xf6 => 0x7518, 0xf7 => 0x75b3, 0xf8 => 0x76e3,
+    0xf9 => 0x77b0, 0xfa => 0x7d3a, 0xfb => 0x90af, 0xfc => 0x9451,
+    0xfd => 0x9452, 0xfe => 0x9f95,
+  },
+  0xcb => {
+    0xa1 => 0x5323, 0xa2 => 0x5cac, 0xa3 => 0x7532, 0xa4 => 0x80db,
+    0xa5 => 0x9240, 0xa6 => 0x9598, 0xa7 => 0x525b, 0xa8 => 0x5808,
+    0xa9 => 0x59dc, 0xaa => 0x5ca1, 0xab => 0x5d17, 0xac => 0x5eb7,
+    0xad => 0x5f3a, 0xae => 0x5f4a, 0xaf => 0x6177, 0xb0 => 0x6c5f,
+    0xb1 => 0x757a, 0xb2 => 0x7586, 0xb3 => 0x7ce0, 0xb4 => 0x7d73,
+    0xb5 => 0x7db1, 0xb6 => 0x7f8c, 0xb7 => 0x8154, 0xb8 => 0x8221,
+    0xb9 => 0x8591, 0xba => 0x8941, 0xbb => 0x8b1b, 0xbc => 0x92fc,
+    0xbd => 0x964d, 0xbe => 0x9c47, 0xbf => 0x4ecb, 0xc0 => 0x4ef7,
+    0xc1 => 0x500b, 0xc2 => 0x51f1, 0xc3 => 0x584f, 0xc4 => 0x6137,
+    0xc5 => 0x613e, 0xc6 => 0x6168, 0xc7 => 0x6539, 0xc8 => 0x69ea,
+    0xc9 => 0x6f11, 0xca => 0x75a5, 0xcb => 0x7686, 0xcc => 0x76d6,
+    0xcd => 0x7b87, 0xce => 0x82a5, 0xcf => 0x84cb, 0xd0 => 0xf900,
+    0xd1 => 0x93a7, 0xd2 => 0x958b, 0xd3 => 0x5580, 0xd4 => 0x5ba2,
+    0xd5 => 0x5751, 0xd6 => 0xf901, 0xd7 => 0x7cb3, 0xd8 => 0x7fb9,
+    0xd9 => 0x91b5, 0xda => 0x5028, 0xdb => 0x53bb, 0xdc => 0x5c45,
+    0xdd => 0x5de8, 0xde => 0x62d2, 0xdf => 0x636e, 0xe0 => 0x64da,
+    0xe1 => 0x64e7, 0xe2 => 0x6e20, 0xe3 => 0x70ac, 0xe4 => 0x795b,
+    0xe5 => 0x8ddd, 0xe6 => 0x8e1e, 0xe7 => 0xf902, 0xe8 => 0x907d,
+    0xe9 => 0x9245, 0xea => 0x92f8, 0xeb => 0x4e7e, 0xec => 0x4ef6,
+    0xed => 0x5065, 0xee => 0x5dfe, 0xef => 0x5efa, 0xf0 => 0x6106,
+    0xf1 => 0x6957, 0xf2 => 0x8171, 0xf3 => 0x8654, 0xf4 => 0x8e47,
+    0xf5 => 0x9375, 0xf6 => 0x9a2b, 0xf7 => 0x4e5e, 0xf8 => 0x5091,
+    0xf9 => 0x6770, 0xfa => 0x6840, 0xfb => 0x5109, 0xfc => 0x528d,
+    0xfd => 0x5292, 0xfe => 0x6aa2,
+  },
+  0xcc => {
+    0xa1 => 0x77bc, 0xa2 => 0x9210, 0xa3 => 0x9ed4, 0xa4 => 0x52ab,
+    0xa5 => 0x602f, 0xa6 => 0x8ff2, 0xa7 => 0x5048, 0xa8 => 0x61a9,
+    0xa9 => 0x63ed, 0xaa => 0x64ca, 0xab => 0x683c, 0xac => 0x6a84,
+    0xad => 0x6fc0, 0xae => 0x8188, 0xaf => 0x89a1, 0xb0 => 0x9694,
+    0xb1 => 0x5805, 0xb2 => 0x727d, 0xb3 => 0x72ac, 0xb4 => 0x7504,
+    0xb5 => 0x7d79, 0xb6 => 0x7e6d, 0xb7 => 0x80a9, 0xb8 => 0x898b,
+    0xb9 => 0x8b74, 0xba => 0x9063, 0xbb => 0x9d51, 0xbc => 0x6289,
+    0xbd => 0x6c7a, 0xbe => 0x6f54, 0xbf => 0x7d50, 0xc0 => 0x7f3a,
+    0xc1 => 0x8a23, 0xc2 => 0x517c, 0xc3 => 0x614a, 0xc4 => 0x7b9d,
+    0xc5 => 0x8b19, 0xc6 => 0x9257, 0xc7 => 0x938c, 0xc8 => 0x4eac,
+    0xc9 => 0x4fd3, 0xca => 0x501e, 0xcb => 0x50be, 0xcc => 0x5106,
+    0xcd => 0x52c1, 0xce => 0x52cd, 0xcf => 0x537f, 0xd0 => 0x5770,
+    0xd1 => 0x5883, 0xd2 => 0x5e9a, 0xd3 => 0x5f91, 0xd4 => 0x6176,
+    0xd5 => 0x61ac, 0xd6 => 0x64ce, 0xd7 => 0x656c, 0xd8 => 0x666f,
+    0xd9 => 0x66bb, 0xda => 0x66f4, 0xdb => 0x6897, 0xdc => 0x6d87,
+    0xdd => 0x7085, 0xde => 0x70f1, 0xdf => 0x749f, 0xe0 => 0x74a5,
+    0xe1 => 0x74ca, 0xe2 => 0x75d9, 0xe3 => 0x786c, 0xe4 => 0x78ec,
+    0xe5 => 0x7adf, 0xe6 => 0x7af6, 0xe7 => 0x7d45, 0xe8 => 0x7d93,
+    0xe9 => 0x8015, 0xea => 0x803f, 0xeb => 0x811b, 0xec => 0x8396,
+    0xed => 0x8b66, 0xee => 0x8f15, 0xef => 0x9015, 0xf0 => 0x93e1,
+    0xf1 => 0x9803, 0xf2 => 0x9838, 0xf3 => 0x9a5a, 0xf4 => 0x9be8,
+    0xf5 => 0x4fc2, 0xf6 => 0x5553, 0xf7 => 0x583a, 0xf8 => 0x5951,
+    0xf9 => 0x5b63, 0xfa => 0x5c46, 0xfb => 0x60b8, 0xfc => 0x6212,
+    0xfd => 0x6842, 0xfe => 0x68b0,
+  },
+  0xcd => {
+    0xa1 => 0x68e8, 0xa2 => 0x6eaa, 0xa3 => 0x754c, 0xa4 => 0x7678,
+    0xa5 => 0x78ce, 0xa6 => 0x7a3d, 0xa7 => 0x7cfb, 0xa8 => 0x7e6b,
+    0xa9 => 0x7e7c, 0xaa => 0x8a08, 0xab => 0x8aa1, 0xac => 0x8c3f,
+    0xad => 0x968e, 0xae => 0x9dc4, 0xaf => 0x53e4, 0xb0 => 0x53e9,
+    0xb1 => 0x544a, 0xb2 => 0x5471, 0xb3 => 0x56fa, 0xb4 => 0x59d1,
+    0xb5 => 0x5b64, 0xb6 => 0x5c3b, 0xb7 => 0x5eab, 0xb8 => 0x62f7,
+    0xb9 => 0x6537, 0xba => 0x6545, 0xbb => 0x6572, 0xbc => 0x66a0,
+    0xbd => 0x67af, 0xbe => 0x69c1, 0xbf => 0x6cbd, 0xc0 => 0x75fc,
+    0xc1 => 0x7690, 0xc2 => 0x777e, 0xc3 => 0x7a3f, 0xc4 => 0x7f94,
+    0xc5 => 0x8003, 0xc6 => 0x80a1, 0xc7 => 0x818f, 0xc8 => 0x82e6,
+    0xc9 => 0x82fd, 0xca => 0x83f0, 0xcb => 0x85c1, 0xcc => 0x8831,
+    0xcd => 0x88b4, 0xce => 0x8aa5, 0xcf => 0xf903, 0xd0 => 0x8f9c,
+    0xd1 => 0x932e, 0xd2 => 0x96c7, 0xd3 => 0x9867, 0xd4 => 0x9ad8,
+    0xd5 => 0x9f13, 0xd6 => 0x54ed, 0xd7 => 0x659b, 0xd8 => 0x66f2,
+    0xd9 => 0x688f, 0xda => 0x7a40, 0xdb => 0x8c37, 0xdc => 0x9d60,
+    0xdd => 0x56f0, 0xde => 0x5764, 0xdf => 0x5d11, 0xe0 => 0x6606,
+    0xe1 => 0x68b1, 0xe2 => 0x68cd, 0xe3 => 0x6efe, 0xe4 => 0x7428,
+    0xe5 => 0x889e, 0xe6 => 0x9be4, 0xe7 => 0x6c68, 0xe8 => 0xf904,
+    0xe9 => 0x9aa8, 0xea => 0x4f9b, 0xeb => 0x516c, 0xec => 0x5171,
+    0xed => 0x529f, 0xee => 0x5b54, 0xef => 0x5de5, 0xf0 => 0x6050,
+    0xf1 => 0x606d, 0xf2 => 0x62f1, 0xf3 => 0x63a7, 0xf4 => 0x653b,
+    0xf5 => 0x73d9, 0xf6 => 0x7a7a, 0xf7 => 0x86a3, 0xf8 => 0x8ca2,
+    0xf9 => 0x978f, 0xfa => 0x4e32, 0xfb => 0x5be1, 0xfc => 0x6208,
+    0xfd => 0x679c, 0xfe => 0x74dc,
+  },
+  0xce => {
+    0xa1 => 0x79d1, 0xa2 => 0x83d3, 0xa3 => 0x8a87, 0xa4 => 0x8ab2,
+    0xa5 => 0x8de8, 0xa6 => 0x904e, 0xa7 => 0x934b, 0xa8 => 0x9846,
+    0xa9 => 0x5ed3, 0xaa => 0x69e8, 0xab => 0x85ff, 0xac => 0x90ed,
+    0xad => 0xf905, 0xae => 0x51a0, 0xaf => 0x5b98, 0xb0 => 0x5bec,
+    0xb1 => 0x6163, 0xb2 => 0x68fa, 0xb3 => 0x6b3e, 0xb4 => 0x704c,
+    0xb5 => 0x742f, 0xb6 => 0x74d8, 0xb7 => 0x7ba1, 0xb8 => 0x7f50,
+    0xb9 => 0x83c5, 0xba => 0x89c0, 0xbb => 0x8cab, 0xbc => 0x95dc,
+    0xbd => 0x9928, 0xbe => 0x522e, 0xbf => 0x605d, 0xc0 => 0x62ec,
+    0xc1 => 0x9002, 0xc2 => 0x4f8a, 0xc3 => 0x5149, 0xc4 => 0x5321,
+    0xc5 => 0x58d9, 0xc6 => 0x5ee3, 0xc7 => 0x66e0, 0xc8 => 0x6d38,
+    0xc9 => 0x709a, 0xca => 0x72c2, 0xcb => 0x73d6, 0xcc => 0x7b50,
+    0xcd => 0x80f1, 0xce => 0x945b, 0xcf => 0x5366, 0xd0 => 0x639b,
+    0xd1 => 0x7f6b, 0xd2 => 0x4e56, 0xd3 => 0x5080, 0xd4 => 0x584a,
+    0xd5 => 0x58de, 0xd6 => 0x602a, 0xd7 => 0x6127, 0xd8 => 0x62d0,
+    0xd9 => 0x69d0, 0xda => 0x9b41, 0xdb => 0x5b8f, 0xdc => 0x7d18,
+    0xdd => 0x80b1, 0xde => 0x8f5f, 0xdf => 0x4ea4, 0xe0 => 0x50d1,
+    0xe1 => 0x54ac, 0xe2 => 0x55ac, 0xe3 => 0x5b0c, 0xe4 => 0x5da0,
+    0xe5 => 0x5de7, 0xe6 => 0x652a, 0xe7 => 0x654e, 0xe8 => 0x6821,
+    0xe9 => 0x6a4b, 0xea => 0x72e1, 0xeb => 0x768e, 0xec => 0x77ef,
+    0xed => 0x7d5e, 0xee => 0x7ff9, 0xef => 0x81a0, 0xf0 => 0x854e,
+    0xf1 => 0x86df, 0xf2 => 0x8f03, 0xf3 => 0x8f4e, 0xf4 => 0x90ca,
+    0xf5 => 0x9903, 0xf6 => 0x9a55, 0xf7 => 0x9bab, 0xf8 => 0x4e18,
+    0xf9 => 0x4e45, 0xfa => 0x4e5d, 0xfb => 0x4ec7, 0xfc => 0x4ff1,
+    0xfd => 0x5177, 0xfe => 0x52fe,
+  },
+  0xcf => {
+    0xa1 => 0x5340, 0xa2 => 0x53e3, 0xa3 => 0x53e5, 0xa4 => 0x548e,
+    0xa5 => 0x5614, 0xa6 => 0x5775, 0xa7 => 0x57a2, 0xa8 => 0x5bc7,
+    0xa9 => 0x5d87, 0xaa => 0x5ed0, 0xab => 0x61fc, 0xac => 0x62d8,
+    0xad => 0x6551, 0xae => 0x67b8, 0xaf => 0x67e9, 0xb0 => 0x69cb,
+    0xb1 => 0x6b50, 0xb2 => 0x6bc6, 0xb3 => 0x6bec, 0xb4 => 0x6c42,
+    0xb5 => 0x6e9d, 0xb6 => 0x7078, 0xb7 => 0x72d7, 0xb8 => 0x7396,
+    0xb9 => 0x7403, 0xba => 0x77bf, 0xbb => 0x77e9, 0xbc => 0x7a76,
+    0xbd => 0x7d7f, 0xbe => 0x8009, 0xbf => 0x81fc, 0xc0 => 0x8205,
+    0xc1 => 0x820a, 0xc2 => 0x82df, 0xc3 => 0x8862, 0xc4 => 0x8b33,
+    0xc5 => 0x8cfc, 0xc6 => 0x8ec0, 0xc7 => 0x9011, 0xc8 => 0x90b1,
+    0xc9 => 0x9264, 0xca => 0x92b6, 0xcb => 0x99d2, 0xcc => 0x9a45,
+    0xcd => 0x9ce9, 0xce => 0x9dd7, 0xcf => 0x9f9c, 0xd0 => 0x570b,
+    0xd1 => 0x5c40, 0xd2 => 0x83ca, 0xd3 => 0x97a0, 0xd4 => 0x97ab,
+    0xd5 => 0x9eb4, 0xd6 => 0x541b, 0xd7 => 0x7a98, 0xd8 => 0x7fa4,
+    0xd9 => 0x88d9, 0xda => 0x8ecd, 0xdb => 0x90e1, 0xdc => 0x5800,
+    0xdd => 0x5c48, 0xde => 0x6398, 0xdf => 0x7a9f, 0xe0 => 0x5bae,
+    0xe1 => 0x5f13, 0xe2 => 0x7a79, 0xe3 => 0x7aae, 0xe4 => 0x828e,
+    0xe5 => 0x8eac, 0xe6 => 0x5026, 0xe7 => 0x5238, 0xe8 => 0x52f8,
+    0xe9 => 0x5377, 0xea => 0x5708, 0xeb => 0x62f3, 0xec => 0x6372,
+    0xed => 0x6b0a, 0xee => 0x6dc3, 0xef => 0x7737, 0xf0 => 0x53a5,
+    0xf1 => 0x7357, 0xf2 => 0x8568, 0xf3 => 0x8e76, 0xf4 => 0x95d5,
+    0xf5 => 0x673a, 0xf6 => 0x6ac3, 0xf7 => 0x6f70, 0xf8 => 0x8a6d,
+    0xf9 => 0x8ecc, 0xfa => 0x994b, 0xfb => 0xf906, 0xfc => 0x6677,
+    0xfd => 0x6b78, 0xfe => 0x8cb4,
+  },
+  0xd0 => {
+    0xa1 => 0x9b3c, 0xa2 => 0xf907, 0xa3 => 0x53eb, 0xa4 => 0x572d,
+    0xa5 => 0x594e, 0xa6 => 0x63c6, 0xa7 => 0x69fb, 0xa8 => 0x73ea,
+    0xa9 => 0x7845, 0xaa => 0x7aba, 0xab => 0x7ac5, 0xac => 0x7cfe,
+    0xad => 0x8475, 0xae => 0x898f, 0xaf => 0x8d73, 0xb0 => 0x9035,
+    0xb1 => 0x95a8, 0xb2 => 0x52fb, 0xb3 => 0x5747, 0xb4 => 0x7547,
+    0xb5 => 0x7b60, 0xb6 => 0x83cc, 0xb7 => 0x921e, 0xb8 => 0xf908,
+    0xb9 => 0x6a58, 0xba => 0x514b, 0xbb => 0x524b, 0xbc => 0x5287,
+    0xbd => 0x621f, 0xbe => 0x68d8, 0xbf => 0x6975, 0xc0 => 0x9699,
+    0xc1 => 0x50c5, 0xc2 => 0x52a4, 0xc3 => 0x52e4, 0xc4 => 0x61c3,
+    0xc5 => 0x65a4, 0xc6 => 0x6839, 0xc7 => 0x69ff, 0xc8 => 0x747e,
+    0xc9 => 0x7b4b, 0xca => 0x82b9, 0xcb => 0x83eb, 0xcc => 0x89b2,
+    0xcd => 0x8b39, 0xce => 0x8fd1, 0xcf => 0x9949, 0xd0 => 0xf909,
+    0xd1 => 0x4eca, 0xd2 => 0x5997, 0xd3 => 0x64d2, 0xd4 => 0x6611,
+    0xd5 => 0x6a8e, 0xd6 => 0x7434, 0xd7 => 0x7981, 0xd8 => 0x79bd,
+    0xd9 => 0x82a9, 0xda => 0x887e, 0xdb => 0x887f, 0xdc => 0x895f,
+    0xdd => 0xf90a, 0xde => 0x9326, 0xdf => 0x4f0b, 0xe0 => 0x53ca,
+    0xe1 => 0x6025, 0xe2 => 0x6271, 0xe3 => 0x6c72, 0xe4 => 0x7d1a,
+    0xe5 => 0x7d66, 0xe6 => 0x4e98, 0xe7 => 0x5162, 0xe8 => 0x77dc,
+    0xe9 => 0x80af, 0xea => 0x4f01, 0xeb => 0x4f0e, 0xec => 0x5176,
+    0xed => 0x5180, 0xee => 0x55dc, 0xef => 0x5668, 0xf0 => 0x573b,
+    0xf1 => 0x57fa, 0xf2 => 0x57fc, 0xf3 => 0x5914, 0xf4 => 0x5947,
+    0xf5 => 0x5993, 0xf6 => 0x5bc4, 0xf7 => 0x5c90, 0xf8 => 0x5d0e,
+    0xf9 => 0x5df1, 0xfa => 0x5e7e, 0xfb => 0x5fcc, 0xfc => 0x6280,
+    0xfd => 0x65d7, 0xfe => 0x65e3,
+  },
+  0xd1 => {
+    0xa1 => 0x671e, 0xa2 => 0x671f, 0xa3 => 0x675e, 0xa4 => 0x68cb,
+    0xa5 => 0x68c4, 0xa6 => 0x6a5f, 0xa7 => 0x6b3a, 0xa8 => 0x6c23,
+    0xa9 => 0x6c7d, 0xaa => 0x6c82, 0xab => 0x6dc7, 0xac => 0x7398,
+    0xad => 0x7426, 0xae => 0x742a, 0xaf => 0x7482, 0xb0 => 0x74a3,
+    0xb1 => 0x7578, 0xb2 => 0x757f, 0xb3 => 0x7881, 0xb4 => 0x78ef,
+    0xb5 => 0x7941, 0xb6 => 0x7947, 0xb7 => 0x7948, 0xb8 => 0x797a,
+    0xb9 => 0x7b95, 0xba => 0x7d00, 0xbb => 0x7dba, 0xbc => 0x7f88,
+    0xbd => 0x8006, 0xbe => 0x802d, 0xbf => 0x808c, 0xc0 => 0x8a18,
+    0xc1 => 0x8b4f, 0xc2 => 0x8c48, 0xc3 => 0x8d77, 0xc4 => 0x9321,
+    0xc5 => 0x9324, 0xc6 => 0x98e2, 0xc7 => 0x9951, 0xc8 => 0x9a0e,
+    0xc9 => 0x9a0f, 0xca => 0x9a65, 0xcb => 0x9e92, 0xcc => 0x7dca,
+    0xcd => 0x4f76, 0xce => 0x5409, 0xcf => 0x62ee, 0xd0 => 0x6854,
+    0xd1 => 0x91d1, 0xd2 => 0x55ab, 0xd3 => 0x513a, 0xd4 => 0xf90b,
+    0xd5 => 0xf90c, 0xd6 => 0x5a1c, 0xd7 => 0x61e6, 0xd8 => 0xf90d,
+    0xd9 => 0x62cf, 0xda => 0x62ff, 0xdb => 0xf90e, 0xdc => 0xf90f,
+    0xdd => 0xf910, 0xde => 0xf911, 0xdf => 0xf912, 0xe0 => 0xf913,
+    0xe1 => 0x90a3, 0xe2 => 0xf914, 0xe3 => 0xf915, 0xe4 => 0xf916,
+    0xe5 => 0xf917, 0xe6 => 0xf918, 0xe7 => 0x8afe, 0xe8 => 0xf919,
+    0xe9 => 0xf91a, 0xea => 0xf91b, 0xeb => 0xf91c, 0xec => 0x6696,
+    0xed => 0xf91d, 0xee => 0x7156, 0xef => 0xf91e, 0xf0 => 0xf91f,
+    0xf1 => 0x96e3, 0xf2 => 0xf920, 0xf3 => 0x634f, 0xf4 => 0x637a,
+    0xf5 => 0x5357, 0xf6 => 0xf921, 0xf7 => 0x678f, 0xf8 => 0x6960,
+    0xf9 => 0x6e73, 0xfa => 0xf922, 0xfb => 0x7537, 0xfc => 0xf923,
+    0xfd => 0xf924, 0xfe => 0xf925,
+  },
+  0xd2 => {
+    0xa1 => 0x7d0d, 0xa2 => 0xf926, 0xa3 => 0xf927, 0xa4 => 0x8872,
+    0xa5 => 0x56ca, 0xa6 => 0x5a18, 0xa7 => 0xf928, 0xa8 => 0xf929,
+    0xa9 => 0xf92a, 0xaa => 0xf92b, 0xab => 0xf92c, 0xac => 0x4e43,
+    0xad => 0xf92d, 0xae => 0x5167, 0xaf => 0x5948, 0xb0 => 0x67f0,
+    0xb1 => 0x8010, 0xb2 => 0xf92e, 0xb3 => 0x5973, 0xb4 => 0x5e74,
+    0xb5 => 0x649a, 0xb6 => 0x79ca, 0xb7 => 0x5ff5, 0xb8 => 0x606c,
+    0xb9 => 0x62c8, 0xba => 0x637b, 0xbb => 0x5be7, 0xbc => 0x5bd7,
+    0xbd => 0x52aa, 0xbe => 0xf92f, 0xbf => 0x5974, 0xc0 => 0x5f29,
+    0xc1 => 0x6012, 0xc2 => 0xf930, 0xc3 => 0xf931, 0xc4 => 0xf932,
+    0xc5 => 0x7459, 0xc6 => 0xf933, 0xc7 => 0xf934, 0xc8 => 0xf935,
+    0xc9 => 0xf936, 0xca => 0xf937, 0xcb => 0xf938, 0xcc => 0x99d1,
+    0xcd => 0xf939, 0xce => 0xf93a, 0xcf => 0xf93b, 0xd0 => 0xf93c,
+    0xd1 => 0xf93d, 0xd2 => 0xf93e, 0xd3 => 0xf93f, 0xd4 => 0xf940,
+    0xd5 => 0xf941, 0xd6 => 0xf942, 0xd7 => 0xf943, 0xd8 => 0x6fc3,
+    0xd9 => 0xf944, 0xda => 0xf945, 0xdb => 0x81bf, 0xdc => 0x8fb2,
+    0xdd => 0x60f1, 0xde => 0xf946, 0xdf => 0xf947, 0xe0 => 0x8166,
+    0xe1 => 0xf948, 0xe2 => 0xf949, 0xe3 => 0x5c3f, 0xe4 => 0xf94a,
+    0xe5 => 0xf94b, 0xe6 => 0xf94c, 0xe7 => 0xf94d, 0xe8 => 0xf94e,
+    0xe9 => 0xf94f, 0xea => 0xf950, 0xeb => 0xf951, 0xec => 0x5ae9,
+    0xed => 0x8a25, 0xee => 0x677b, 0xef => 0x7d10, 0xf0 => 0xf952,
+    0xf1 => 0xf953, 0xf2 => 0xf954, 0xf3 => 0xf955, 0xf4 => 0xf956,
+    0xf5 => 0xf957, 0xf6 => 0x80fd, 0xf7 => 0xf958, 0xf8 => 0xf959,
+    0xf9 => 0x5c3c, 0xfa => 0x6ce5, 0xfb => 0x533f, 0xfc => 0x6eba,
+    0xfd => 0x591a, 0xfe => 0x8336,
+  },
+  0xd3 => {
+    0xa1 => 0x4e39, 0xa2 => 0x4eb6, 0xa3 => 0x4f46, 0xa4 => 0x55ae,
+    0xa5 => 0x5718, 0xa6 => 0x58c7, 0xa7 => 0x5f56, 0xa8 => 0x65b7,
+    0xa9 => 0x65e6, 0xaa => 0x6a80, 0xab => 0x6bb5, 0xac => 0x6e4d,
+    0xad => 0x77ed, 0xae => 0x7aef, 0xaf => 0x7c1e, 0xb0 => 0x7dde,
+    0xb1 => 0x86cb, 0xb2 => 0x8892, 0xb3 => 0x9132, 0xb4 => 0x935b,
+    0xb5 => 0x64bb, 0xb6 => 0x6fbe, 0xb7 => 0x737a, 0xb8 => 0x75b8,
+    0xb9 => 0x9054, 0xba => 0x5556, 0xbb => 0x574d, 0xbc => 0x61ba,
+    0xbd => 0x64d4, 0xbe => 0x66c7, 0xbf => 0x6de1, 0xc0 => 0x6e5b,
+    0xc1 => 0x6f6d, 0xc2 => 0x6fb9, 0xc3 => 0x75f0, 0xc4 => 0x8043,
+    0xc5 => 0x81bd, 0xc6 => 0x8541, 0xc7 => 0x8983, 0xc8 => 0x8ac7,
+    0xc9 => 0x8b5a, 0xca => 0x931f, 0xcb => 0x6c93, 0xcc => 0x7553,
+    0xcd => 0x7b54, 0xce => 0x8e0f, 0xcf => 0x905d, 0xd0 => 0x5510,
+    0xd1 => 0x5802, 0xd2 => 0x5858, 0xd3 => 0x5e62, 0xd4 => 0x6207,
+    0xd5 => 0x649e, 0xd6 => 0x68e0, 0xd7 => 0x7576, 0xd8 => 0x7cd6,
+    0xd9 => 0x87b3, 0xda => 0x9ee8, 0xdb => 0x4ee3, 0xdc => 0x5788,
+    0xdd => 0x576e, 0xde => 0x5927, 0xdf => 0x5c0d, 0xe0 => 0x5cb1,
+    0xe1 => 0x5e36, 0xe2 => 0x5f85, 0xe3 => 0x6234, 0xe4 => 0x64e1,
+    0xe5 => 0x73b3, 0xe6 => 0x81fa, 0xe7 => 0x888b, 0xe8 => 0x8cb8,
+    0xe9 => 0x968a, 0xea => 0x9edb, 0xeb => 0x5b85, 0xec => 0x5fb7,
+    0xed => 0x60b3, 0xee => 0x5012, 0xef => 0x5200, 0xf0 => 0x5230,
+    0xf1 => 0x5716, 0xf2 => 0x5835, 0xf3 => 0x5857, 0xf4 => 0x5c0e,
+    0xf5 => 0x5c60, 0xf6 => 0x5cf6, 0xf7 => 0x5d8b, 0xf8 => 0x5ea6,
+    0xf9 => 0x5f92, 0xfa => 0x60bc, 0xfb => 0x6311, 0xfc => 0x6389,
+    0xfd => 0x6417, 0xfe => 0x6843,
+  },
+  0xd4 => {
+    0xa1 => 0x68f9, 0xa2 => 0x6ac2, 0xa3 => 0x6dd8, 0xa4 => 0x6e21,
+    0xa5 => 0x6ed4, 0xa6 => 0x6fe4, 0xa7 => 0x71fe, 0xa8 => 0x76dc,
+    0xa9 => 0x7779, 0xaa => 0x79b1, 0xab => 0x7a3b, 0xac => 0x8404,
+    0xad => 0x89a9, 0xae => 0x8ced, 0xaf => 0x8df3, 0xb0 => 0x8e48,
+    0xb1 => 0x9003, 0xb2 => 0x9014, 0xb3 => 0x9053, 0xb4 => 0x90fd,
+    0xb5 => 0x934d, 0xb6 => 0x9676, 0xb7 => 0x97dc, 0xb8 => 0x6bd2,
+    0xb9 => 0x7006, 0xba => 0x7258, 0xbb => 0x72a2, 0xbc => 0x7368,
+    0xbd => 0x7763, 0xbe => 0x79bf, 0xbf => 0x7be4, 0xc0 => 0x7e9b,
+    0xc1 => 0x8b80, 0xc2 => 0x58a9, 0xc3 => 0x60c7, 0xc4 => 0x6566,
+    0xc5 => 0x65fd, 0xc6 => 0x66be, 0xc7 => 0x6c8c, 0xc8 => 0x711e,
+    0xc9 => 0x71c9, 0xca => 0x8c5a, 0xcb => 0x9813, 0xcc => 0x4e6d,
+    0xcd => 0x7a81, 0xce => 0x4edd, 0xcf => 0x51ac, 0xd0 => 0x51cd,
+    0xd1 => 0x52d5, 0xd2 => 0x540c, 0xd3 => 0x61a7, 0xd4 => 0x6771,
+    0xd5 => 0x6850, 0xd6 => 0x68df, 0xd7 => 0x6d1e, 0xd8 => 0x6f7c,
+    0xd9 => 0x75bc, 0xda => 0x77b3, 0xdb => 0x7ae5, 0xdc => 0x80f4,
+    0xdd => 0x8463, 0xde => 0x9285, 0xdf => 0x515c, 0xe0 => 0x6597,
+    0xe1 => 0x675c, 0xe2 => 0x6793, 0xe3 => 0x75d8, 0xe4 => 0x7ac7,
+    0xe5 => 0x8373, 0xe6 => 0xf95a, 0xe7 => 0x8c46, 0xe8 => 0x9017,
+    0xe9 => 0x982d, 0xea => 0x5c6f, 0xeb => 0x81c0, 0xec => 0x829a,
+    0xed => 0x9041, 0xee => 0x906f, 0xef => 0x920d, 0xf0 => 0x5f97,
+    0xf1 => 0x5d9d, 0xf2 => 0x6a59, 0xf3 => 0x71c8, 0xf4 => 0x767b,
+    0xf5 => 0x7b49, 0xf6 => 0x85e4, 0xf7 => 0x8b04, 0xf8 => 0x9127,
+    0xf9 => 0x9a30, 0xfa => 0x5587, 0xfb => 0x61f6, 0xfc => 0xf95b,
+    0xfd => 0x7669, 0xfe => 0x7f85,
+  },
+  0xd5 => {
+    0xa1 => 0x863f, 0xa2 => 0x87ba, 0xa3 => 0x88f8, 0xa4 => 0x908f,
+    0xa5 => 0xf95c, 0xa6 => 0x6d1b, 0xa7 => 0x70d9, 0xa8 => 0x73de,
+    0xa9 => 0x7d61, 0xaa => 0x843d, 0xab => 0xf95d, 0xac => 0x916a,
+    0xad => 0x99f1, 0xae => 0xf95e, 0xaf => 0x4e82, 0xb0 => 0x5375,
+    0xb1 => 0x6b04, 0xb2 => 0x6b12, 0xb3 => 0x703e, 0xb4 => 0x721b,
+    0xb5 => 0x862d, 0xb6 => 0x9e1e, 0xb7 => 0x524c, 0xb8 => 0x8fa3,
+    0xb9 => 0x5d50, 0xba => 0x64e5, 0xbb => 0x652c, 0xbc => 0x6b16,
+    0xbd => 0x6feb, 0xbe => 0x7c43, 0xbf => 0x7e9c, 0xc0 => 0x85cd,
+    0xc1 => 0x8964, 0xc2 => 0x89bd, 0xc3 => 0x62c9, 0xc4 => 0x81d8,
+    0xc5 => 0x881f, 0xc6 => 0x5eca, 0xc7 => 0x6717, 0xc8 => 0x6d6a,
+    0xc9 => 0x72fc, 0xca => 0x7405, 0xcb => 0x746f, 0xcc => 0x8782,
+    0xcd => 0x90de, 0xce => 0x4f86, 0xcf => 0x5d0d, 0xd0 => 0x5fa0,
+    0xd1 => 0x840a, 0xd2 => 0x51b7, 0xd3 => 0x63a0, 0xd4 => 0x7565,
+    0xd5 => 0x4eae, 0xd6 => 0x5006, 0xd7 => 0x5169, 0xd8 => 0x51c9,
+    0xd9 => 0x6881, 0xda => 0x6a11, 0xdb => 0x7cae, 0xdc => 0x7cb1,
+    0xdd => 0x7ce7, 0xde => 0x826f, 0xdf => 0x8ad2, 0xe0 => 0x8f1b,
+    0xe1 => 0x91cf, 0xe2 => 0x4fb6, 0xe3 => 0x5137, 0xe4 => 0x52f5,
+    0xe5 => 0x5442, 0xe6 => 0x5eec, 0xe7 => 0x616e, 0xe8 => 0x623e,
+    0xe9 => 0x65c5, 0xea => 0x6ada, 0xeb => 0x6ffe, 0xec => 0x792a,
+    0xed => 0x85dc, 0xee => 0x8823, 0xef => 0x95ad, 0xf0 => 0x9a62,
+    0xf1 => 0x9a6a, 0xf2 => 0x9e97, 0xf3 => 0x9ece, 0xf4 => 0x529b,
+    0xf5 => 0x66c6, 0xf6 => 0x6b77, 0xf7 => 0x701d, 0xf8 => 0x792b,
+    0xf9 => 0x8f62, 0xfa => 0x9742, 0xfb => 0x6190, 0xfc => 0x6200,
+    0xfd => 0x6523, 0xfe => 0x6f23,
+  },
+  0xd6 => {
+    0xa1 => 0x7149, 0xa2 => 0x7489, 0xa3 => 0x7df4, 0xa4 => 0x806f,
+    0xa5 => 0x84ee, 0xa6 => 0x8f26, 0xa7 => 0x9023, 0xa8 => 0x934a,
+    0xa9 => 0x51bd, 0xaa => 0x5217, 0xab => 0x52a3, 0xac => 0x6d0c,
+    0xad => 0x70c8, 0xae => 0x88c2, 0xaf => 0x5ec9, 0xb0 => 0x6582,
+    0xb1 => 0x6bae, 0xb2 => 0x6fc2, 0xb3 => 0x7c3e, 0xb4 => 0x7375,
+    0xb5 => 0x4ee4, 0xb6 => 0x4f36, 0xb7 => 0x56f9, 0xb8 => 0xf95f,
+    0xb9 => 0x5cba, 0xba => 0x5dba, 0xbb => 0x601c, 0xbc => 0x73b2,
+    0xbd => 0x7b2d, 0xbe => 0x7f9a, 0xbf => 0x7fce, 0xc0 => 0x8046,
+    0xc1 => 0x901e, 0xc2 => 0x9234, 0xc3 => 0x96f6, 0xc4 => 0x9748,
+    0xc5 => 0x9818, 0xc6 => 0x9f61, 0xc7 => 0x4f8b, 0xc8 => 0x6fa7,
+    0xc9 => 0x79ae, 0xca => 0x91b4, 0xcb => 0x96b7, 0xcc => 0x52de,
+    0xcd => 0xf960, 0xce => 0x6488, 0xcf => 0x64c4, 0xd0 => 0x6ad3,
+    0xd1 => 0x6f5e, 0xd2 => 0x7018, 0xd3 => 0x7210, 0xd4 => 0x76e7,
+    0xd5 => 0x8001, 0xd6 => 0x8606, 0xd7 => 0x865c, 0xd8 => 0x8def,
+    0xd9 => 0x8f05, 0xda => 0x9732, 0xdb => 0x9b6f, 0xdc => 0x9dfa,
+    0xdd => 0x9e75, 0xde => 0x788c, 0xdf => 0x797f, 0xe0 => 0x7da0,
+    0xe1 => 0x83c9, 0xe2 => 0x9304, 0xe3 => 0x9e7f, 0xe4 => 0x9e93,
+    0xe5 => 0x8ad6, 0xe6 => 0x58df, 0xe7 => 0x5f04, 0xe8 => 0x6727,
+    0xe9 => 0x7027, 0xea => 0x74cf, 0xeb => 0x7c60, 0xec => 0x807e,
+    0xed => 0x5121, 0xee => 0x7028, 0xef => 0x7262, 0xf0 => 0x78ca,
+    0xf1 => 0x8cc2, 0xf2 => 0x8cda, 0xf3 => 0x8cf4, 0xf4 => 0x96f7,
+    0xf5 => 0x4e86, 0xf6 => 0x50da, 0xf7 => 0x5bee, 0xf8 => 0x5ed6,
+    0xf9 => 0x6599, 0xfa => 0x71ce, 0xfb => 0x7642, 0xfc => 0x77ad,
+    0xfd => 0x804a, 0xfe => 0x84fc,
+  },
+  0xd7 => {
+    0xa1 => 0x907c, 0xa2 => 0x9b27, 0xa3 => 0x9f8d, 0xa4 => 0x58d8,
+    0xa5 => 0x5a41, 0xa6 => 0x5c62, 0xa7 => 0x6a13, 0xa8 => 0x6dda,
+    0xa9 => 0x6f0f, 0xaa => 0x763b, 0xab => 0x7d2f, 0xac => 0x7e37,
+    0xad => 0x851e, 0xae => 0x8938, 0xaf => 0x93e4, 0xb0 => 0x964b,
+    0xb1 => 0x5289, 0xb2 => 0x65d2, 0xb3 => 0x67f3, 0xb4 => 0x69b4,
+    0xb5 => 0x6d41, 0xb6 => 0x6e9c, 0xb7 => 0x700f, 0xb8 => 0x7409,
+    0xb9 => 0x7460, 0xba => 0x7559, 0xbb => 0x7624, 0xbc => 0x786b,
+    0xbd => 0x8b2c, 0xbe => 0x985e, 0xbf => 0x516d, 0xc0 => 0x622e,
+    0xc1 => 0x9678, 0xc2 => 0x4f96, 0xc3 => 0x502b, 0xc4 => 0x5d19,
+    0xc5 => 0x6dea, 0xc6 => 0x7db8, 0xc7 => 0x8f2a, 0xc8 => 0x5f8b,
+    0xc9 => 0x6144, 0xca => 0x6817, 0xcb => 0xf961, 0xcc => 0x9686,
+    0xcd => 0x52d2, 0xce => 0x808b, 0xcf => 0x51dc, 0xd0 => 0x51cc,
+    0xd1 => 0x695e, 0xd2 => 0x7a1c, 0xd3 => 0x7dbe, 0xd4 => 0x83f1,
+    0xd5 => 0x9675, 0xd6 => 0x4fda, 0xd7 => 0x5229, 0xd8 => 0x5398,
+    0xd9 => 0x540f, 0xda => 0x550e, 0xdb => 0x5c65, 0xdc => 0x60a7,
+    0xdd => 0x674e, 0xde => 0x68a8, 0xdf => 0x6d6c, 0xe0 => 0x7281,
+    0xe1 => 0x72f8, 0xe2 => 0x7406, 0xe3 => 0x7483, 0xe4 => 0xf962,
+    0xe5 => 0x75e2, 0xe6 => 0x7c6c, 0xe7 => 0x7f79, 0xe8 => 0x7fb8,
+    0xe9 => 0x8389, 0xea => 0x88cf, 0xeb => 0x88e1, 0xec => 0x91cc,
+    0xed => 0x91d0, 0xee => 0x96e2, 0xef => 0x9bc9, 0xf0 => 0x541d,
+    0xf1 => 0x6f7e, 0xf2 => 0x71d0, 0xf3 => 0x7498, 0xf4 => 0x85fa,
+    0xf5 => 0x8eaa, 0xf6 => 0x96a3, 0xf7 => 0x9c57, 0xf8 => 0x9e9f,
+    0xf9 => 0x6797, 0xfa => 0x6dcb, 0xfb => 0x7433, 0xfc => 0x81e8,
+    0xfd => 0x9716, 0xfe => 0x782c,
+  },
+  0xd8 => {
+    0xa1 => 0x7acb, 0xa2 => 0x7b20, 0xa3 => 0x7c92, 0xa4 => 0x6469,
+    0xa5 => 0x746a, 0xa6 => 0x75f2, 0xa7 => 0x78bc, 0xa8 => 0x78e8,
+    0xa9 => 0x99ac, 0xaa => 0x9b54, 0xab => 0x9ebb, 0xac => 0x5bde,
+    0xad => 0x5e55, 0xae => 0x6f20, 0xaf => 0x819c, 0xb0 => 0x83ab,
+    0xb1 => 0x9088, 0xb2 => 0x4e07, 0xb3 => 0x534d, 0xb4 => 0x5a29,
+    0xb5 => 0x5dd2, 0xb6 => 0x5f4e, 0xb7 => 0x6162, 0xb8 => 0x633d,
+    0xb9 => 0x6669, 0xba => 0x66fc, 0xbb => 0x6eff, 0xbc => 0x6f2b,
+    0xbd => 0x7063, 0xbe => 0x779e, 0xbf => 0x842c, 0xc0 => 0x8513,
+    0xc1 => 0x883b, 0xc2 => 0x8f13, 0xc3 => 0x9945, 0xc4 => 0x9c3b,
+    0xc5 => 0x551c, 0xc6 => 0x62b9, 0xc7 => 0x672b, 0xc8 => 0x6cab,
+    0xc9 => 0x8309, 0xca => 0x896a, 0xcb => 0x977a, 0xcc => 0x4ea1,
+    0xcd => 0x5984, 0xce => 0x5fd8, 0xcf => 0x5fd9, 0xd0 => 0x671b,
+    0xd1 => 0x7db2, 0xd2 => 0x7f54, 0xd3 => 0x8292, 0xd4 => 0x832b,
+    0xd5 => 0x83bd, 0xd6 => 0x8f1e, 0xd7 => 0x9099, 0xd8 => 0x57cb,
+    0xd9 => 0x59b9, 0xda => 0x5a92, 0xdb => 0x5bd0, 0xdc => 0x6627,
+    0xdd => 0x679a, 0xde => 0x6885, 0xdf => 0x6bcf, 0xe0 => 0x7164,
+    0xe1 => 0x7f75, 0xe2 => 0x8cb7, 0xe3 => 0x8ce3, 0xe4 => 0x9081,
+    0xe5 => 0x9b45, 0xe6 => 0x8108, 0xe7 => 0x8c8a, 0xe8 => 0x964c,
+    0xe9 => 0x9a40, 0xea => 0x9ea5, 0xeb => 0x5b5f, 0xec => 0x6c13,
+    0xed => 0x731b, 0xee => 0x76f2, 0xef => 0x76df, 0xf0 => 0x840c,
+    0xf1 => 0x51aa, 0xf2 => 0x8993, 0xf3 => 0x514d, 0xf4 => 0x5195,
+    0xf5 => 0x52c9, 0xf6 => 0x68c9, 0xf7 => 0x6c94, 0xf8 => 0x7704,
+    0xf9 => 0x7720, 0xfa => 0x7dbf, 0xfb => 0x7dec, 0xfc => 0x9762,
+    0xfd => 0x9eb5, 0xfe => 0x6ec5,
+  },
+  0xd9 => {
+    0xa1 => 0x8511, 0xa2 => 0x51a5, 0xa3 => 0x540d, 0xa4 => 0x547d,
+    0xa5 => 0x660e, 0xa6 => 0x669d, 0xa7 => 0x6927, 0xa8 => 0x6e9f,
+    0xa9 => 0x76bf, 0xaa => 0x7791, 0xab => 0x8317, 0xac => 0x84c2,
+    0xad => 0x879f, 0xae => 0x9169, 0xaf => 0x9298, 0xb0 => 0x9cf4,
+    0xb1 => 0x8882, 0xb2 => 0x4fae, 0xb3 => 0x5192, 0xb4 => 0x52df,
+    0xb5 => 0x59c6, 0xb6 => 0x5e3d, 0xb7 => 0x6155, 0xb8 => 0x6478,
+    0xb9 => 0x6479, 0xba => 0x66ae, 0xbb => 0x67d0, 0xbc => 0x6a21,
+    0xbd => 0x6bcd, 0xbe => 0x6bdb, 0xbf => 0x725f, 0xc0 => 0x7261,
+    0xc1 => 0x7441, 0xc2 => 0x7738, 0xc3 => 0x77db, 0xc4 => 0x8017,
+    0xc5 => 0x82bc, 0xc6 => 0x8305, 0xc7 => 0x8b00, 0xc8 => 0x8b28,
+    0xc9 => 0x8c8c, 0xca => 0x6728, 0xcb => 0x6c90, 0xcc => 0x7267,
+    0xcd => 0x76ee, 0xce => 0x7766, 0xcf => 0x7a46, 0xd0 => 0x9da9,
+    0xd1 => 0x6b7f, 0xd2 => 0x6c92, 0xd3 => 0x5922, 0xd4 => 0x6726,
+    0xd5 => 0x8499, 0xd6 => 0x536f, 0xd7 => 0x5893, 0xd8 => 0x5999,
+    0xd9 => 0x5edf, 0xda => 0x63cf, 0xdb => 0x6634, 0xdc => 0x6773,
+    0xdd => 0x6e3a, 0xde => 0x732b, 0xdf => 0x7ad7, 0xe0 => 0x82d7,
+    0xe1 => 0x9328, 0xe2 => 0x52d9, 0xe3 => 0x5deb, 0xe4 => 0x61ae,
+    0xe5 => 0x61cb, 0xe6 => 0x620a, 0xe7 => 0x62c7, 0xe8 => 0x64ab,
+    0xe9 => 0x65e0, 0xea => 0x6959, 0xeb => 0x6b66, 0xec => 0x6bcb,
+    0xed => 0x7121, 0xee => 0x73f7, 0xef => 0x755d, 0xf0 => 0x7e46,
+    0xf1 => 0x821e, 0xf2 => 0x8302, 0xf3 => 0x856a, 0xf4 => 0x8aa3,
+    0xf5 => 0x8cbf, 0xf6 => 0x9727, 0xf7 => 0x9d61, 0xf8 => 0x58a8,
+    0xf9 => 0x9ed8, 0xfa => 0x5011, 0xfb => 0x520e, 0xfc => 0x543b,
+    0xfd => 0x554f, 0xfe => 0x6587,
+  },
+  0xda => {
+    0xa1 => 0x6c76, 0xa2 => 0x7d0a, 0xa3 => 0x7d0b, 0xa4 => 0x805e,
+    0xa5 => 0x868a, 0xa6 => 0x9580, 0xa7 => 0x96ef, 0xa8 => 0x52ff,
+    0xa9 => 0x6c95, 0xaa => 0x7269, 0xab => 0x5473, 0xac => 0x5a9a,
+    0xad => 0x5c3e, 0xae => 0x5d4b, 0xaf => 0x5f4c, 0xb0 => 0x5fae,
+    0xb1 => 0x672a, 0xb2 => 0x68b6, 0xb3 => 0x6963, 0xb4 => 0x6e3c,
+    0xb5 => 0x6e44, 0xb6 => 0x7709, 0xb7 => 0x7c73, 0xb8 => 0x7f8e,
+    0xb9 => 0x8587, 0xba => 0x8b0e, 0xbb => 0x8ff7, 0xbc => 0x9761,
+    0xbd => 0x9ef4, 0xbe => 0x5cb7, 0xbf => 0x60b6, 0xc0 => 0x610d,
+    0xc1 => 0x61ab, 0xc2 => 0x654f, 0xc3 => 0x65fb, 0xc4 => 0x65fc,
+    0xc5 => 0x6c11, 0xc6 => 0x6cef, 0xc7 => 0x739f, 0xc8 => 0x73c9,
+    0xc9 => 0x7de1, 0xca => 0x9594, 0xcb => 0x5bc6, 0xcc => 0x871c,
+    0xcd => 0x8b10, 0xce => 0x525d, 0xcf => 0x535a, 0xd0 => 0x62cd,
+    0xd1 => 0x640f, 0xd2 => 0x64b2, 0xd3 => 0x6734, 0xd4 => 0x6a38,
+    0xd5 => 0x6cca, 0xd6 => 0x73c0, 0xd7 => 0x749e, 0xd8 => 0x7b94,
+    0xd9 => 0x7c95, 0xda => 0x7e1b, 0xdb => 0x818a, 0xdc => 0x8236,
+    0xdd => 0x8584, 0xde => 0x8feb, 0xdf => 0x96f9, 0xe0 => 0x99c1,
+    0xe1 => 0x4f34, 0xe2 => 0x534a, 0xe3 => 0x53cd, 0xe4 => 0x53db,
+    0xe5 => 0x62cc, 0xe6 => 0x642c, 0xe7 => 0x6500, 0xe8 => 0x6591,
+    0xe9 => 0x69c3, 0xea => 0x6cee, 0xeb => 0x6f58, 0xec => 0x73ed,
+    0xed => 0x7554, 0xee => 0x7622, 0xef => 0x76e4, 0xf0 => 0x76fc,
+    0xf1 => 0x78d0, 0xf2 => 0x78fb, 0xf3 => 0x792c, 0xf4 => 0x7d46,
+    0xf5 => 0x822c, 0xf6 => 0x87e0, 0xf7 => 0x8fd4, 0xf8 => 0x9812,
+    0xf9 => 0x98ef, 0xfa => 0x52c3, 0xfb => 0x62d4, 0xfc => 0x64a5,
+    0xfd => 0x6e24, 0xfe => 0x6f51,
+  },
+  0xdb => {
+    0xa1 => 0x767c, 0xa2 => 0x8dcb, 0xa3 => 0x91b1, 0xa4 => 0x9262,
+    0xa5 => 0x9aee, 0xa6 => 0x9b43, 0xa7 => 0x5023, 0xa8 => 0x508d,
+    0xa9 => 0x574a, 0xaa => 0x59a8, 0xab => 0x5c28, 0xac => 0x5e47,
+    0xad => 0x5f77, 0xae => 0x623f, 0xaf => 0x653e, 0xb0 => 0x65b9,
+    0xb1 => 0x65c1, 0xb2 => 0x6609, 0xb3 => 0x678b, 0xb4 => 0x699c,
+    0xb5 => 0x6ec2, 0xb6 => 0x78c5, 0xb7 => 0x7d21, 0xb8 => 0x80aa,
+    0xb9 => 0x8180, 0xba => 0x822b, 0xbb => 0x82b3, 0xbc => 0x84a1,
+    0xbd => 0x868c, 0xbe => 0x8a2a, 0xbf => 0x8b17, 0xc0 => 0x90a6,
+    0xc1 => 0x9632, 0xc2 => 0x9f90, 0xc3 => 0x500d, 0xc4 => 0x4ff3,
+    0xc5 => 0xf963, 0xc6 => 0x57f9, 0xc7 => 0x5f98, 0xc8 => 0x62dc,
+    0xc9 => 0x6392, 0xca => 0x676f, 0xcb => 0x6e43, 0xcc => 0x7119,
+    0xcd => 0x76c3, 0xce => 0x80cc, 0xcf => 0x80da, 0xd0 => 0x88f4,
+    0xd1 => 0x88f5, 0xd2 => 0x8919, 0xd3 => 0x8ce0, 0xd4 => 0x8f29,
+    0xd5 => 0x914d, 0xd6 => 0x966a, 0xd7 => 0x4f2f, 0xd8 => 0x4f70,
+    0xd9 => 0x5e1b, 0xda => 0x67cf, 0xdb => 0x6822, 0xdc => 0x767d,
+    0xdd => 0x767e, 0xde => 0x9b44, 0xdf => 0x5e61, 0xe0 => 0x6a0a,
+    0xe1 => 0x7169, 0xe2 => 0x71d4, 0xe3 => 0x756a, 0xe4 => 0xf964,
+    0xe5 => 0x7e41, 0xe6 => 0x8543, 0xe7 => 0x85e9, 0xe8 => 0x98dc,
+    0xe9 => 0x4f10, 0xea => 0x7b4f, 0xeb => 0x7f70, 0xec => 0x95a5,
+    0xed => 0x51e1, 0xee => 0x5e06, 0xef => 0x68b5, 0xf0 => 0x6c3e,
+    0xf1 => 0x6c4e, 0xf2 => 0x6cdb, 0xf3 => 0x72af, 0xf4 => 0x7bc4,
+    0xf5 => 0x8303, 0xf6 => 0x6cd5, 0xf7 => 0x743a, 0xf8 => 0x50fb,
+    0xf9 => 0x5288, 0xfa => 0x58c1, 0xfb => 0x64d8, 0xfc => 0x6a97,
+    0xfd => 0x74a7, 0xfe => 0x7656,
+  },
+  0xdc => {
+    0xa1 => 0x78a7, 0xa2 => 0x8617, 0xa3 => 0x95e2, 0xa4 => 0x9739,
+    0xa5 => 0xf965, 0xa6 => 0x535e, 0xa7 => 0x5f01, 0xa8 => 0x8b8a,
+    0xa9 => 0x8fa8, 0xaa => 0x8faf, 0xab => 0x908a, 0xac => 0x5225,
+    0xad => 0x77a5, 0xae => 0x9c49, 0xaf => 0x9f08, 0xb0 => 0x4e19,
+    0xb1 => 0x5002, 0xb2 => 0x5175, 0xb3 => 0x5c5b, 0xb4 => 0x5e77,
+    0xb5 => 0x661e, 0xb6 => 0x663a, 0xb7 => 0x67c4, 0xb8 => 0x68c5,
+    0xb9 => 0x70b3, 0xba => 0x7501, 0xbb => 0x75c5, 0xbc => 0x79c9,
+    0xbd => 0x7add, 0xbe => 0x8f27, 0xbf => 0x9920, 0xc0 => 0x9a08,
+    0xc1 => 0x4fdd, 0xc2 => 0x5821, 0xc3 => 0x5831, 0xc4 => 0x5bf6,
+    0xc5 => 0x666e, 0xc6 => 0x6b65, 0xc7 => 0x6d11, 0xc8 => 0x6e7a,
+    0xc9 => 0x6f7d, 0xca => 0x73e4, 0xcb => 0x752b, 0xcc => 0x83e9,
+    0xcd => 0x88dc, 0xce => 0x8913, 0xcf => 0x8b5c, 0xd0 => 0x8f14,
+    0xd1 => 0x4f0f, 0xd2 => 0x50d5, 0xd3 => 0x5310, 0xd4 => 0x535c,
+    0xd5 => 0x5b93, 0xd6 => 0x5fa9, 0xd7 => 0x670d, 0xd8 => 0x798f,
+    0xd9 => 0x8179, 0xda => 0x832f, 0xdb => 0x8514, 0xdc => 0x8907,
+    0xdd => 0x8986, 0xde => 0x8f39, 0xdf => 0x8f3b, 0xe0 => 0x99a5,
+    0xe1 => 0x9c12, 0xe2 => 0x672c, 0xe3 => 0x4e76, 0xe4 => 0x4ff8,
+    0xe5 => 0x5949, 0xe6 => 0x5c01, 0xe7 => 0x5cef, 0xe8 => 0x5cf0,
+    0xe9 => 0x6367, 0xea => 0x68d2, 0xeb => 0x70fd, 0xec => 0x71a2,
+    0xed => 0x742b, 0xee => 0x7e2b, 0xef => 0x84ec, 0xf0 => 0x8702,
+    0xf1 => 0x9022, 0xf2 => 0x92d2, 0xf3 => 0x9cf3, 0xf4 => 0x4e0d,
+    0xf5 => 0x4ed8, 0xf6 => 0x4fef, 0xf7 => 0x5085, 0xf8 => 0x5256,
+    0xf9 => 0x526f, 0xfa => 0x5426, 0xfb => 0x5490, 0xfc => 0x57e0,
+    0xfd => 0x592b, 0xfe => 0x5a66,
+  },
+  0xdd => {
+    0xa1 => 0x5b5a, 0xa2 => 0x5b75, 0xa3 => 0x5bcc, 0xa4 => 0x5e9c,
+    0xa5 => 0xf966, 0xa6 => 0x6276, 0xa7 => 0x6577, 0xa8 => 0x65a7,
+    0xa9 => 0x6d6e, 0xaa => 0x6ea5, 0xab => 0x7236, 0xac => 0x7b26,
+    0xad => 0x7c3f, 0xae => 0x7f36, 0xaf => 0x8150, 0xb0 => 0x8151,
+    0xb1 => 0x819a, 0xb2 => 0x8240, 0xb3 => 0x8299, 0xb4 => 0x83a9,
+    0xb5 => 0x8a03, 0xb6 => 0x8ca0, 0xb7 => 0x8ce6, 0xb8 => 0x8cfb,
+    0xb9 => 0x8d74, 0xba => 0x8dba, 0xbb => 0x90e8, 0xbc => 0x91dc,
+    0xbd => 0x961c, 0xbe => 0x9644, 0xbf => 0x99d9, 0xc0 => 0x9ce7,
+    0xc1 => 0x5317, 0xc2 => 0x5206, 0xc3 => 0x5429, 0xc4 => 0x5674,
+    0xc5 => 0x58b3, 0xc6 => 0x5954, 0xc7 => 0x596e, 0xc8 => 0x5fff,
+    0xc9 => 0x61a4, 0xca => 0x626e, 0xcb => 0x6610, 0xcc => 0x6c7e,
+    0xcd => 0x711a, 0xce => 0x76c6, 0xcf => 0x7c89, 0xd0 => 0x7cde,
+    0xd1 => 0x7d1b, 0xd2 => 0x82ac, 0xd3 => 0x8cc1, 0xd4 => 0x96f0,
+    0xd5 => 0xf967, 0xd6 => 0x4f5b, 0xd7 => 0x5f17, 0xd8 => 0x5f7f,
+    0xd9 => 0x62c2, 0xda => 0x5d29, 0xdb => 0x670b, 0xdc => 0x68da,
+    0xdd => 0x787c, 0xde => 0x7e43, 0xdf => 0x9d6c, 0xe0 => 0x4e15,
+    0xe1 => 0x5099, 0xe2 => 0x5315, 0xe3 => 0x532a, 0xe4 => 0x5351,
+    0xe5 => 0x5983, 0xe6 => 0x5a62, 0xe7 => 0x5e87, 0xe8 => 0x60b2,
+    0xe9 => 0x618a, 0xea => 0x6249, 0xeb => 0x6279, 0xec => 0x6590,
+    0xed => 0x6787, 0xee => 0x69a7, 0xef => 0x6bd4, 0xf0 => 0x6bd6,
+    0xf1 => 0x6bd7, 0xf2 => 0x6bd8, 0xf3 => 0x6cb8, 0xf4 => 0xf968,
+    0xf5 => 0x7435, 0xf6 => 0x75fa, 0xf7 => 0x7812, 0xf8 => 0x7891,
+    0xf9 => 0x79d5, 0xfa => 0x79d8, 0xfb => 0x7c83, 0xfc => 0x7dcb,
+    0xfd => 0x7fe1, 0xfe => 0x80a5,
+  },
+  0xde => {
+    0xa1 => 0x813e, 0xa2 => 0x81c2, 0xa3 => 0x83f2, 0xa4 => 0x871a,
+    0xa5 => 0x88e8, 0xa6 => 0x8ab9, 0xa7 => 0x8b6c, 0xa8 => 0x8cbb,
+    0xa9 => 0x9119, 0xaa => 0x975e, 0xab => 0x98db, 0xac => 0x9f3b,
+    0xad => 0x56ac, 0xae => 0x5b2a, 0xaf => 0x5f6c, 0xb0 => 0x658c,
+    0xb1 => 0x6ab3, 0xb2 => 0x6baf, 0xb3 => 0x6d5c, 0xb4 => 0x6ff1,
+    0xb5 => 0x7015, 0xb6 => 0x725d, 0xb7 => 0x73ad, 0xb8 => 0x8ca7,
+    0xb9 => 0x8cd3, 0xba => 0x983b, 0xbb => 0x6191, 0xbc => 0x6c37,
+    0xbd => 0x8058, 0xbe => 0x9a01, 0xbf => 0x4e4d, 0xc0 => 0x4e8b,
+    0xc1 => 0x4e9b, 0xc2 => 0x4ed5, 0xc3 => 0x4f3a, 0xc4 => 0x4f3c,
+    0xc5 => 0x4f7f, 0xc6 => 0x4fdf, 0xc7 => 0x50ff, 0xc8 => 0x53f2,
+    0xc9 => 0x53f8, 0xca => 0x5506, 0xcb => 0x55e3, 0xcc => 0x56db,
+    0xcd => 0x58eb, 0xce => 0x5962, 0xcf => 0x5a11, 0xd0 => 0x5beb,
+    0xd1 => 0x5bfa, 0xd2 => 0x5c04, 0xd3 => 0x5df3, 0xd4 => 0x5e2b,
+    0xd5 => 0x5f99, 0xd6 => 0x601d, 0xd7 => 0x6368, 0xd8 => 0x659c,
+    0xd9 => 0x65af, 0xda => 0x67f6, 0xdb => 0x67fb, 0xdc => 0x68ad,
+    0xdd => 0x6b7b, 0xde => 0x6c99, 0xdf => 0x6cd7, 0xe0 => 0x6e23,
+    0xe1 => 0x7009, 0xe2 => 0x7345, 0xe3 => 0x7802, 0xe4 => 0x793e,
+    0xe5 => 0x7940, 0xe6 => 0x7960, 0xe7 => 0x79c1, 0xe8 => 0x7be9,
+    0xe9 => 0x7d17, 0xea => 0x7d72, 0xeb => 0x8086, 0xec => 0x820d,
+    0xed => 0x838e, 0xee => 0x84d1, 0xef => 0x86c7, 0xf0 => 0x88df,
+    0xf1 => 0x8a50, 0xf2 => 0x8a5e, 0xf3 => 0x8b1d, 0xf4 => 0x8cdc,
+    0xf5 => 0x8d66, 0xf6 => 0x8fad, 0xf7 => 0x90aa, 0xf8 => 0x98fc,
+    0xf9 => 0x99df, 0xfa => 0x9e9d, 0xfb => 0x524a, 0xfc => 0xf969,
+    0xfd => 0x6714, 0xfe => 0xf96a,
+  },
+  0xdf => {
+    0xa1 => 0x5098, 0xa2 => 0x522a, 0xa3 => 0x5c71, 0xa4 => 0x6563,
+    0xa5 => 0x6c55, 0xa6 => 0x73ca, 0xa7 => 0x7523, 0xa8 => 0x759d,
+    0xa9 => 0x7b97, 0xaa => 0x849c, 0xab => 0x9178, 0xac => 0x9730,
+    0xad => 0x4e77, 0xae => 0x6492, 0xaf => 0x6bba, 0xb0 => 0x715e,
+    0xb1 => 0x85a9, 0xb2 => 0x4e09, 0xb3 => 0xf96b, 0xb4 => 0x6749,
+    0xb5 => 0x68ee, 0xb6 => 0x6e17, 0xb7 => 0x829f, 0xb8 => 0x8518,
+    0xb9 => 0x886b, 0xba => 0x63f7, 0xbb => 0x6f81, 0xbc => 0x9212,
+    0xbd => 0x98af, 0xbe => 0x4e0a, 0xbf => 0x50b7, 0xc0 => 0x50cf,
+    0xc1 => 0x511f, 0xc2 => 0x5546, 0xc3 => 0x55aa, 0xc4 => 0x5617,
+    0xc5 => 0x5b40, 0xc6 => 0x5c19, 0xc7 => 0x5ce0, 0xc8 => 0x5e38,
+    0xc9 => 0x5e8a, 0xca => 0x5ea0, 0xcb => 0x5ec2, 0xcc => 0x60f3,
+    0xcd => 0x6851, 0xce => 0x6a61, 0xcf => 0x6e58, 0xd0 => 0x723d,
+    0xd1 => 0x7240, 0xd2 => 0x72c0, 0xd3 => 0x76f8, 0xd4 => 0x7965,
+    0xd5 => 0x7bb1, 0xd6 => 0x7fd4, 0xd7 => 0x88f3, 0xd8 => 0x89f4,
+    0xd9 => 0x8a73, 0xda => 0x8c61, 0xdb => 0x8cde, 0xdc => 0x971c,
+    0xdd => 0x585e, 0xde => 0x74bd, 0xdf => 0x8cfd, 0xe0 => 0x55c7,
+    0xe1 => 0xf96c, 0xe2 => 0x7a61, 0xe3 => 0x7d22, 0xe4 => 0x8272,
+    0xe5 => 0x7272, 0xe6 => 0x751f, 0xe7 => 0x7525, 0xe8 => 0xf96d,
+    0xe9 => 0x7b19, 0xea => 0x5885, 0xeb => 0x58fb, 0xec => 0x5dbc,
+    0xed => 0x5e8f, 0xee => 0x5eb6, 0xef => 0x5f90, 0xf0 => 0x6055,
+    0xf1 => 0x6292, 0xf2 => 0x637f, 0xf3 => 0x654d, 0xf4 => 0x6691,
+    0xf5 => 0x66d9, 0xf6 => 0x66f8, 0xf7 => 0x6816, 0xf8 => 0x68f2,
+    0xf9 => 0x7280, 0xfa => 0x745e, 0xfb => 0x7b6e, 0xfc => 0x7d6e,
+    0xfd => 0x7dd6, 0xfe => 0x7f72,
+  },
+  0xe0 => {
+    0xa1 => 0x80e5, 0xa2 => 0x8212, 0xa3 => 0x85af, 0xa4 => 0x897f,
+    0xa5 => 0x8a93, 0xa6 => 0x901d, 0xa7 => 0x92e4, 0xa8 => 0x9ecd,
+    0xa9 => 0x9f20, 0xaa => 0x5915, 0xab => 0x596d, 0xac => 0x5e2d,
+    0xad => 0x60dc, 0xae => 0x6614, 0xaf => 0x6673, 0xb0 => 0x6790,
+    0xb1 => 0x6c50, 0xb2 => 0x6dc5, 0xb3 => 0x6f5f, 0xb4 => 0x77f3,
+    0xb5 => 0x78a9, 0xb6 => 0x84c6, 0xb7 => 0x91cb, 0xb8 => 0x932b,
+    0xb9 => 0x4ed9, 0xba => 0x50ca, 0xbb => 0x5148, 0xbc => 0x5584,
+    0xbd => 0x5b0b, 0xbe => 0x5ba3, 0xbf => 0x6247, 0xc0 => 0x657e,
+    0xc1 => 0x65cb, 0xc2 => 0x6e32, 0xc3 => 0x717d, 0xc4 => 0x7401,
+    0xc5 => 0x7444, 0xc6 => 0x7487, 0xc7 => 0x74bf, 0xc8 => 0x766c,
+    0xc9 => 0x79aa, 0xca => 0x7dda, 0xcb => 0x7e55, 0xcc => 0x7fa8,
+    0xcd => 0x817a, 0xce => 0x81b3, 0xcf => 0x8239, 0xd0 => 0x861a,
+    0xd1 => 0x87ec, 0xd2 => 0x8a75, 0xd3 => 0x8de3, 0xd4 => 0x9078,
+    0xd5 => 0x9291, 0xd6 => 0x9425, 0xd7 => 0x994d, 0xd8 => 0x9bae,
+    0xd9 => 0x5368, 0xda => 0x5c51, 0xdb => 0x6954, 0xdc => 0x6cc4,
+    0xdd => 0x6d29, 0xde => 0x6e2b, 0xdf => 0x820c, 0xe0 => 0x859b,
+    0xe1 => 0x893b, 0xe2 => 0x8a2d, 0xe3 => 0x8aaa, 0xe4 => 0x96ea,
+    0xe5 => 0x9f67, 0xe6 => 0x5261, 0xe7 => 0x66b9, 0xe8 => 0x6bb2,
+    0xe9 => 0x7e96, 0xea => 0x87fe, 0xeb => 0x8d0d, 0xec => 0x9583,
+    0xed => 0x965d, 0xee => 0x651d, 0xef => 0x6d89, 0xf0 => 0x71ee,
+    0xf1 => 0xf96e, 0xf2 => 0x57ce, 0xf3 => 0x59d3, 0xf4 => 0x5bac,
+    0xf5 => 0x6027, 0xf6 => 0x60fa, 0xf7 => 0x6210, 0xf8 => 0x661f,
+    0xf9 => 0x665f, 0xfa => 0x7329, 0xfb => 0x73f9, 0xfc => 0x76db,
+    0xfd => 0x7701, 0xfe => 0x7b6c,
+  },
+  0xe1 => {
+    0xa1 => 0x8056, 0xa2 => 0x8072, 0xa3 => 0x8165, 0xa4 => 0x8aa0,
+    0xa5 => 0x9192, 0xa6 => 0x4e16, 0xa7 => 0x52e2, 0xa8 => 0x6b72,
+    0xa9 => 0x6d17, 0xaa => 0x7a05, 0xab => 0x7b39, 0xac => 0x7d30,
+    0xad => 0xf96f, 0xae => 0x8cb0, 0xaf => 0x53ec, 0xb0 => 0x562f,
+    0xb1 => 0x5851, 0xb2 => 0x5bb5, 0xb3 => 0x5c0f, 0xb4 => 0x5c11,
+    0xb5 => 0x5de2, 0xb6 => 0x6240, 0xb7 => 0x6383, 0xb8 => 0x6414,
+    0xb9 => 0x662d, 0xba => 0x68b3, 0xbb => 0x6cbc, 0xbc => 0x6d88,
+    0xbd => 0x6eaf, 0xbe => 0x701f, 0xbf => 0x70a4, 0xc0 => 0x71d2,
+    0xc1 => 0x7526, 0xc2 => 0x758f, 0xc3 => 0x758e, 0xc4 => 0x7619,
+    0xc5 => 0x7b11, 0xc6 => 0x7be0, 0xc7 => 0x7c2b, 0xc8 => 0x7d20,
+    0xc9 => 0x7d39, 0xca => 0x852c, 0xcb => 0x856d, 0xcc => 0x8607,
+    0xcd => 0x8a34, 0xce => 0x900d, 0xcf => 0x9061, 0xd0 => 0x90b5,
+    0xd1 => 0x92b7, 0xd2 => 0x97f6, 0xd3 => 0x9a37, 0xd4 => 0x4fd7,
+    0xd5 => 0x5c6c, 0xd6 => 0x675f, 0xd7 => 0x6d91, 0xd8 => 0x7c9f,
+    0xd9 => 0x7e8c, 0xda => 0x8b16, 0xdb => 0x8d16, 0xdc => 0x901f,
+    0xdd => 0x5b6b, 0xde => 0x5dfd, 0xdf => 0x640d, 0xe0 => 0x84c0,
+    0xe1 => 0x905c, 0xe2 => 0x98e1, 0xe3 => 0x7387, 0xe4 => 0x5b8b,
+    0xe5 => 0x609a, 0xe6 => 0x677e, 0xe7 => 0x6dde, 0xe8 => 0x8a1f,
+    0xe9 => 0x8aa6, 0xea => 0x9001, 0xeb => 0x980c, 0xec => 0x5237,
+    0xed => 0xf970, 0xee => 0x7051, 0xef => 0x788e, 0xf0 => 0x9396,
+    0xf1 => 0x8870, 0xf2 => 0x91d7, 0xf3 => 0x4fee, 0xf4 => 0x53d7,
+    0xf5 => 0x55fd, 0xf6 => 0x56da, 0xf7 => 0x5782, 0xf8 => 0x58fd,
+    0xf9 => 0x5ac2, 0xfa => 0x5b88, 0xfb => 0x5cab, 0xfc => 0x5cc0,
+    0xfd => 0x5e25, 0xfe => 0x6101,
+  },
+  0xe2 => {
+    0xa1 => 0x620d, 0xa2 => 0x624b, 0xa3 => 0x6388, 0xa4 => 0x641c,
+    0xa5 => 0x6536, 0xa6 => 0x6578, 0xa7 => 0x6a39, 0xa8 => 0x6b8a,
+    0xa9 => 0x6c34, 0xaa => 0x6d19, 0xab => 0x6f31, 0xac => 0x71e7,
+    0xad => 0x72e9, 0xae => 0x7378, 0xaf => 0x7407, 0xb0 => 0x74b2,
+    0xb1 => 0x7626, 0xb2 => 0x7761, 0xb3 => 0x79c0, 0xb4 => 0x7a57,
+    0xb5 => 0x7aea, 0xb6 => 0x7cb9, 0xb7 => 0x7d8f, 0xb8 => 0x7dac,
+    0xb9 => 0x7e61, 0xba => 0x7f9e, 0xbb => 0x8129, 0xbc => 0x8331,
+    0xbd => 0x8490, 0xbe => 0x84da, 0xbf => 0x85ea, 0xc0 => 0x8896,
+    0xc1 => 0x8ab0, 0xc2 => 0x8b90, 0xc3 => 0x8f38, 0xc4 => 0x9042,
+    0xc5 => 0x9083, 0xc6 => 0x916c, 0xc7 => 0x9296, 0xc8 => 0x92b9,
+    0xc9 => 0x968b, 0xca => 0x96a7, 0xcb => 0x96a8, 0xcc => 0x96d6,
+    0xcd => 0x9700, 0xce => 0x9808, 0xcf => 0x9996, 0xd0 => 0x9ad3,
+    0xd1 => 0x9b1a, 0xd2 => 0x53d4, 0xd3 => 0x587e, 0xd4 => 0x5919,
+    0xd5 => 0x5b70, 0xd6 => 0x5bbf, 0xd7 => 0x6dd1, 0xd8 => 0x6f5a,
+    0xd9 => 0x719f, 0xda => 0x7421, 0xdb => 0x74b9, 0xdc => 0x8085,
+    0xdd => 0x83fd, 0xde => 0x5de1, 0xdf => 0x5f87, 0xe0 => 0x5faa,
+    0xe1 => 0x6042, 0xe2 => 0x65ec, 0xe3 => 0x6812, 0xe4 => 0x696f,
+    0xe5 => 0x6a53, 0xe6 => 0x6b89, 0xe7 => 0x6d35, 0xe8 => 0x6df3,
+    0xe9 => 0x73e3, 0xea => 0x76fe, 0xeb => 0x77ac, 0xec => 0x7b4d,
+    0xed => 0x7d14, 0xee => 0x8123, 0xef => 0x821c, 0xf0 => 0x8340,
+    0xf1 => 0x84f4, 0xf2 => 0x8563, 0xf3 => 0x8a62, 0xf4 => 0x8ac4,
+    0xf5 => 0x9187, 0xf6 => 0x931e, 0xf7 => 0x9806, 0xf8 => 0x99b4,
+    0xf9 => 0x620c, 0xfa => 0x8853, 0xfb => 0x8ff0, 0xfc => 0x9265,
+    0xfd => 0x5d07, 0xfe => 0x5d27,
+  },
+  0xe3 => {
+    0xa1 => 0x5d69, 0xa2 => 0x745f, 0xa3 => 0x819d, 0xa4 => 0x8768,
+    0xa5 => 0x6fd5, 0xa6 => 0x62fe, 0xa7 => 0x7fd2, 0xa8 => 0x8936,
+    0xa9 => 0x8972, 0xaa => 0x4e1e, 0xab => 0x4e58, 0xac => 0x50e7,
+    0xad => 0x52dd, 0xae => 0x5347, 0xaf => 0x627f, 0xb0 => 0x6607,
+    0xb1 => 0x7e69, 0xb2 => 0x8805, 0xb3 => 0x965e, 0xb4 => 0x4f8d,
+    0xb5 => 0x5319, 0xb6 => 0x5636, 0xb7 => 0x59cb, 0xb8 => 0x5aa4,
+    0xb9 => 0x5c38, 0xba => 0x5c4e, 0xbb => 0x5c4d, 0xbc => 0x5e02,
+    0xbd => 0x5f11, 0xbe => 0x6043, 0xbf => 0x65bd, 0xc0 => 0x662f,
+    0xc1 => 0x6642, 0xc2 => 0x67be, 0xc3 => 0x67f4, 0xc4 => 0x731c,
+    0xc5 => 0x77e2, 0xc6 => 0x793a, 0xc7 => 0x7fc5, 0xc8 => 0x8494,
+    0xc9 => 0x84cd, 0xca => 0x8996, 0xcb => 0x8a66, 0xcc => 0x8a69,
+    0xcd => 0x8ae1, 0xce => 0x8c55, 0xcf => 0x8c7a, 0xd0 => 0x57f4,
+    0xd1 => 0x5bd4, 0xd2 => 0x5f0f, 0xd3 => 0x606f, 0xd4 => 0x62ed,
+    0xd5 => 0x690d, 0xd6 => 0x6b96, 0xd7 => 0x6e5c, 0xd8 => 0x7184,
+    0xd9 => 0x7bd2, 0xda => 0x8755, 0xdb => 0x8b58, 0xdc => 0x8efe,
+    0xdd => 0x98df, 0xde => 0x98fe, 0xdf => 0x4f38, 0xe0 => 0x4f81,
+    0xe1 => 0x4fe1, 0xe2 => 0x547b, 0xe3 => 0x5a20, 0xe4 => 0x5bb8,
+    0xe5 => 0x613c, 0xe6 => 0x65b0, 0xe7 => 0x6668, 0xe8 => 0x71fc,
+    0xe9 => 0x7533, 0xea => 0x795e, 0xeb => 0x7d33, 0xec => 0x814e,
+    0xed => 0x81e3, 0xee => 0x8398, 0xef => 0x85aa, 0xf0 => 0x85ce,
+    0xf1 => 0x8703, 0xf2 => 0x8a0a, 0xf3 => 0x8eab, 0xf4 => 0x8f9b,
+    0xf5 => 0xf971, 0xf6 => 0x8fc5, 0xf7 => 0x5931, 0xf8 => 0x5ba4,
+    0xf9 => 0x5be6, 0xfa => 0x6089, 0xfb => 0x5be9, 0xfc => 0x5c0b,
+    0xfd => 0x5fc3, 0xfe => 0x6c81,
+  },
+  0xe4 => {
+    0xa1 => 0xf972, 0xa2 => 0x6df1, 0xa3 => 0x700b, 0xa4 => 0x751a,
+    0xa5 => 0x82af, 0xa6 => 0x8af6, 0xa7 => 0x4ec0, 0xa8 => 0x5341,
+    0xa9 => 0xf973, 0xaa => 0x96d9, 0xab => 0x6c0f, 0xac => 0x4e9e,
+    0xad => 0x4fc4, 0xae => 0x5152, 0xaf => 0x555e, 0xb0 => 0x5a25,
+    0xb1 => 0x5ce8, 0xb2 => 0x6211, 0xb3 => 0x7259, 0xb4 => 0x82bd,
+    0xb5 => 0x83aa, 0xb6 => 0x86fe, 0xb7 => 0x8859, 0xb8 => 0x8a1d,
+    0xb9 => 0x963f, 0xba => 0x96c5, 0xbb => 0x9913, 0xbc => 0x9d09,
+    0xbd => 0x9d5d, 0xbe => 0x580a, 0xbf => 0x5cb3, 0xc0 => 0x5dbd,
+    0xc1 => 0x5e44, 0xc2 => 0x60e1, 0xc3 => 0x6115, 0xc4 => 0x63e1,
+    0xc5 => 0x6a02, 0xc6 => 0x6e25, 0xc7 => 0x9102, 0xc8 => 0x9354,
+    0xc9 => 0x984e, 0xca => 0x9c10, 0xcb => 0x9f77, 0xcc => 0x5b89,
+    0xcd => 0x5cb8, 0xce => 0x6309, 0xcf => 0x664f, 0xd0 => 0x6848,
+    0xd1 => 0x773c, 0xd2 => 0x96c1, 0xd3 => 0x978d, 0xd4 => 0x9854,
+    0xd5 => 0x9b9f, 0xd6 => 0x65a1, 0xd7 => 0x8b01, 0xd8 => 0x8ecb,
+    0xd9 => 0x95bc, 0xda => 0x5535, 0xdb => 0x5ca9, 0xdc => 0x5dd6,
+    0xdd => 0x5eb5, 0xde => 0x6697, 0xdf => 0x764c, 0xe0 => 0x83f4,
+    0xe1 => 0x95c7, 0xe2 => 0x58d3, 0xe3 => 0x62bc, 0xe4 => 0x72ce,
+    0xe5 => 0x9d28, 0xe6 => 0x4ef0, 0xe7 => 0x592e, 0xe8 => 0x600f,
+    0xe9 => 0x663b, 0xea => 0x6b83, 0xeb => 0x79e7, 0xec => 0x9d26,
+    0xed => 0x5393, 0xee => 0x54c0, 0xef => 0x57c3, 0xf0 => 0x5d16,
+    0xf1 => 0x611b, 0xf2 => 0x66d6, 0xf3 => 0x6daf, 0xf4 => 0x788d,
+    0xf5 => 0x827e, 0xf6 => 0x9698, 0xf7 => 0x9744, 0xf8 => 0x5384,
+    0xf9 => 0x627c, 0xfa => 0x6396, 0xfb => 0x6db2, 0xfc => 0x7e0a,
+    0xfd => 0x814b, 0xfe => 0x984d,
+  },
+  0xe5 => {
+    0xa1 => 0x6afb, 0xa2 => 0x7f4c, 0xa3 => 0x9daf, 0xa4 => 0x9e1a,
+    0xa5 => 0x4e5f, 0xa6 => 0x503b, 0xa7 => 0x51b6, 0xa8 => 0x591c,
+    0xa9 => 0x60f9, 0xaa => 0x63f6, 0xab => 0x6930, 0xac => 0x723a,
+    0xad => 0x8036, 0xae => 0xf974, 0xaf => 0x91ce, 0xb0 => 0x5f31,
+    0xb1 => 0xf975, 0xb2 => 0xf976, 0xb3 => 0x7d04, 0xb4 => 0x82e5,
+    0xb5 => 0x846f, 0xb6 => 0x84bb, 0xb7 => 0x85e5, 0xb8 => 0x8e8d,
+    0xb9 => 0xf977, 0xba => 0x4f6f, 0xbb => 0xf978, 0xbc => 0xf979,
+    0xbd => 0x58e4, 0xbe => 0x5b43, 0xbf => 0x6059, 0xc0 => 0x63da,
+    0xc1 => 0x6518, 0xc2 => 0x656d, 0xc3 => 0x6698, 0xc4 => 0xf97a,
+    0xc5 => 0x694a, 0xc6 => 0x6a23, 0xc7 => 0x6d0b, 0xc8 => 0x7001,
+    0xc9 => 0x716c, 0xca => 0x75d2, 0xcb => 0x760d, 0xcc => 0x79b3,
+    0xcd => 0x7a70, 0xce => 0xf97b, 0xcf => 0x7f8a, 0xd0 => 0xf97c,
+    0xd1 => 0x8944, 0xd2 => 0xf97d, 0xd3 => 0x8b93, 0xd4 => 0x91c0,
+    0xd5 => 0x967d, 0xd6 => 0xf97e, 0xd7 => 0x990a, 0xd8 => 0x5704,
+    0xd9 => 0x5fa1, 0xda => 0x65bc, 0xdb => 0x6f01, 0xdc => 0x7600,
+    0xdd => 0x79a6, 0xde => 0x8a9e, 0xdf => 0x99ad, 0xe0 => 0x9b5a,
+    0xe1 => 0x9f6c, 0xe2 => 0x5104, 0xe3 => 0x61b6, 0xe4 => 0x6291,
+    0xe5 => 0x6a8d, 0xe6 => 0x81c6, 0xe7 => 0x5043, 0xe8 => 0x5830,
+    0xe9 => 0x5f66, 0xea => 0x7109, 0xeb => 0x8a00, 0xec => 0x8afa,
+    0xed => 0x5b7c, 0xee => 0x8616, 0xef => 0x4ffa, 0xf0 => 0x513c,
+    0xf1 => 0x56b4, 0xf2 => 0x5944, 0xf3 => 0x63a9, 0xf4 => 0x6df9,
+    0xf5 => 0x5daa, 0xf6 => 0x696d, 0xf7 => 0x5186, 0xf8 => 0x4e88,
+    0xf9 => 0x4f59, 0xfa => 0xf97f, 0xfb => 0xf980, 0xfc => 0xf981,
+    0xfd => 0x5982, 0xfe => 0xf982,
+  },
+  0xe6 => {
+    0xa1 => 0xf983, 0xa2 => 0x6b5f, 0xa3 => 0x6c5d, 0xa4 => 0xf984,
+    0xa5 => 0x74b5, 0xa6 => 0x7916, 0xa7 => 0xf985, 0xa8 => 0x8207,
+    0xa9 => 0x8245, 0xaa => 0x8339, 0xab => 0x8f3f, 0xac => 0x8f5d,
+    0xad => 0xf986, 0xae => 0x9918, 0xaf => 0xf987, 0xb0 => 0xf988,
+    0xb1 => 0xf989, 0xb2 => 0x4ea6, 0xb3 => 0xf98a, 0xb4 => 0x57df,
+    0xb5 => 0x5f79, 0xb6 => 0x6613, 0xb7 => 0xf98b, 0xb8 => 0xf98c,
+    0xb9 => 0x75ab, 0xba => 0x7e79, 0xbb => 0x8b6f, 0xbc => 0xf98d,
+    0xbd => 0x9006, 0xbe => 0x9a5b, 0xbf => 0x56a5, 0xc0 => 0x5827,
+    0xc1 => 0x59f8, 0xc2 => 0x5a1f, 0xc3 => 0x5bb4, 0xc4 => 0xf98e,
+    0xc5 => 0x5ef6, 0xc6 => 0xf98f, 0xc7 => 0xf990, 0xc8 => 0x6350,
+    0xc9 => 0x633b, 0xca => 0xf991, 0xcb => 0x693d, 0xcc => 0x6c87,
+    0xcd => 0x6cbf, 0xce => 0x6d8e, 0xcf => 0x6d93, 0xd0 => 0x6df5,
+    0xd1 => 0x6f14, 0xd2 => 0xf992, 0xd3 => 0x70df, 0xd4 => 0x7136,
+    0xd5 => 0x7159, 0xd6 => 0xf993, 0xd7 => 0x71c3, 0xd8 => 0x71d5,
+    0xd9 => 0xf994, 0xda => 0x784f, 0xdb => 0x786f, 0xdc => 0xf995,
+    0xdd => 0x7b75, 0xde => 0x7de3, 0xdf => 0xf996, 0xe0 => 0x7e2f,
+    0xe1 => 0xf997, 0xe2 => 0x884d, 0xe3 => 0x8edf, 0xe4 => 0xf998,
+    0xe5 => 0xf999, 0xe6 => 0xf99a, 0xe7 => 0x925b, 0xe8 => 0xf99b,
+    0xe9 => 0x9cf6, 0xea => 0xf99c, 0xeb => 0xf99d, 0xec => 0xf99e,
+    0xed => 0x6085, 0xee => 0x6d85, 0xef => 0xf99f, 0xf0 => 0x71b1,
+    0xf1 => 0xf9a0, 0xf2 => 0xf9a1, 0xf3 => 0x95b1, 0xf4 => 0x53ad,
+    0xf5 => 0xf9a2, 0xf6 => 0xf9a3, 0xf7 => 0xf9a4, 0xf8 => 0x67d3,
+    0xf9 => 0xf9a5, 0xfa => 0x708e, 0xfb => 0x7130, 0xfc => 0x7430,
+    0xfd => 0x8276, 0xfe => 0x82d2,
+  },
+  0xe7 => {
+    0xa1 => 0xf9a6, 0xa2 => 0x95bb, 0xa3 => 0x9ae5, 0xa4 => 0x9e7d,
+    0xa5 => 0x66c4, 0xa6 => 0xf9a7, 0xa7 => 0x71c1, 0xa8 => 0x8449,
+    0xa9 => 0xf9a8, 0xaa => 0xf9a9, 0xab => 0x584b, 0xac => 0xf9aa,
+    0xad => 0xf9ab, 0xae => 0x5db8, 0xaf => 0x5f71, 0xb0 => 0xf9ac,
+    0xb1 => 0x6620, 0xb2 => 0x668e, 0xb3 => 0x6979, 0xb4 => 0x69ae,
+    0xb5 => 0x6c38, 0xb6 => 0x6cf3, 0xb7 => 0x6e36, 0xb8 => 0x6f41,
+    0xb9 => 0x6fda, 0xba => 0x701b, 0xbb => 0x702f, 0xbc => 0x7150,
+    0xbd => 0x71df, 0xbe => 0x7370, 0xbf => 0xf9ad, 0xc0 => 0x745b,
+    0xc1 => 0xf9ae, 0xc2 => 0x74d4, 0xc3 => 0x76c8, 0xc4 => 0x7a4e,
+    0xc5 => 0x7e93, 0xc6 => 0xf9af, 0xc7 => 0xf9b0, 0xc8 => 0x82f1,
+    0xc9 => 0x8a60, 0xca => 0x8fce, 0xcb => 0xf9b1, 0xcc => 0x9348,
+    0xcd => 0xf9b2, 0xce => 0x9719, 0xcf => 0xf9b3, 0xd0 => 0xf9b4,
+    0xd1 => 0x4e42, 0xd2 => 0x502a, 0xd3 => 0xf9b5, 0xd4 => 0x5208,
+    0xd5 => 0x53e1, 0xd6 => 0x66f3, 0xd7 => 0x6c6d, 0xd8 => 0x6fca,
+    0xd9 => 0x730a, 0xda => 0x777f, 0xdb => 0x7a62, 0xdc => 0x82ae,
+    0xdd => 0x85dd, 0xde => 0x8602, 0xdf => 0xf9b6, 0xe0 => 0x88d4,
+    0xe1 => 0x8a63, 0xe2 => 0x8b7d, 0xe3 => 0x8c6b, 0xe4 => 0xf9b7,
+    0xe5 => 0x92b3, 0xe6 => 0xf9b8, 0xe7 => 0x9713, 0xe8 => 0x9810,
+    0xe9 => 0x4e94, 0xea => 0x4f0d, 0xeb => 0x4fc9, 0xec => 0x50b2,
+    0xed => 0x5348, 0xee => 0x543e, 0xef => 0x5433, 0xf0 => 0x55da,
+    0xf1 => 0x5862, 0xf2 => 0x58ba, 0xf3 => 0x5967, 0xf4 => 0x5a1b,
+    0xf5 => 0x5be4, 0xf6 => 0x609f, 0xf7 => 0xf9b9, 0xf8 => 0x61ca,
+    0xf9 => 0x6556, 0xfa => 0x65ff, 0xfb => 0x6664, 0xfc => 0x68a7,
+    0xfd => 0x6c5a, 0xfe => 0x6fb3,
+  },
+  0xe8 => {
+    0xa1 => 0x70cf, 0xa2 => 0x71ac, 0xa3 => 0x7352, 0xa4 => 0x7b7d,
+    0xa5 => 0x8708, 0xa6 => 0x8aa4, 0xa7 => 0x9c32, 0xa8 => 0x9f07,
+    0xa9 => 0x5c4b, 0xaa => 0x6c83, 0xab => 0x7344, 0xac => 0x7389,
+    0xad => 0x923a, 0xae => 0x6eab, 0xaf => 0x7465, 0xb0 => 0x761f,
+    0xb1 => 0x7a69, 0xb2 => 0x7e15, 0xb3 => 0x860a, 0xb4 => 0x5140,
+    0xb5 => 0x58c5, 0xb6 => 0x64c1, 0xb7 => 0x74ee, 0xb8 => 0x7515,
+    0xb9 => 0x7670, 0xba => 0x7fc1, 0xbb => 0x9095, 0xbc => 0x96cd,
+    0xbd => 0x9954, 0xbe => 0x6e26, 0xbf => 0x74e6, 0xc0 => 0x7aa9,
+    0xc1 => 0x7aaa, 0xc2 => 0x81e5, 0xc3 => 0x86d9, 0xc4 => 0x8778,
+    0xc5 => 0x8a1b, 0xc6 => 0x5a49, 0xc7 => 0x5b8c, 0xc8 => 0x5b9b,
+    0xc9 => 0x68a1, 0xca => 0x6900, 0xcb => 0x6d63, 0xcc => 0x73a9,
+    0xcd => 0x7413, 0xce => 0x742c, 0xcf => 0x7897, 0xd0 => 0x7de9,
+    0xd1 => 0x7feb, 0xd2 => 0x8118, 0xd3 => 0x8155, 0xd4 => 0x839e,
+    0xd5 => 0x8c4c, 0xd6 => 0x962e, 0xd7 => 0x9811, 0xd8 => 0x66f0,
+    0xd9 => 0x5f80, 0xda => 0x65fa, 0xdb => 0x6789, 0xdc => 0x6c6a,
+    0xdd => 0x738b, 0xde => 0x502d, 0xdf => 0x5a03, 0xe0 => 0x6b6a,
+    0xe1 => 0x77ee, 0xe2 => 0x5916, 0xe3 => 0x5d6c, 0xe4 => 0x5dcd,
+    0xe5 => 0x7325, 0xe6 => 0x754f, 0xe7 => 0xf9ba, 0xe8 => 0xf9bb,
+    0xe9 => 0x50e5, 0xea => 0x51f9, 0xeb => 0x582f, 0xec => 0x592d,
+    0xed => 0x5996, 0xee => 0x59da, 0xef => 0x5be5, 0xf0 => 0xf9bc,
+    0xf1 => 0xf9bd, 0xf2 => 0x5da2, 0xf3 => 0x62d7, 0xf4 => 0x6416,
+    0xf5 => 0x6493, 0xf6 => 0x64fe, 0xf7 => 0xf9be, 0xf8 => 0x66dc,
+    0xf9 => 0xf9bf, 0xfa => 0x6a48, 0xfb => 0xf9c0, 0xfc => 0x71ff,
+    0xfd => 0x7464, 0xfe => 0xf9c1,
+  },
+  0xe9 => {
+    0xa1 => 0x7a88, 0xa2 => 0x7aaf, 0xa3 => 0x7e47, 0xa4 => 0x7e5e,
+    0xa5 => 0x8000, 0xa6 => 0x8170, 0xa7 => 0xf9c2, 0xa8 => 0x87ef,
+    0xa9 => 0x8981, 0xaa => 0x8b20, 0xab => 0x9059, 0xac => 0xf9c3,
+    0xad => 0x9080, 0xae => 0x9952, 0xaf => 0x617e, 0xb0 => 0x6b32,
+    0xb1 => 0x6d74, 0xb2 => 0x7e1f, 0xb3 => 0x8925, 0xb4 => 0x8fb1,
+    0xb5 => 0x4fd1, 0xb6 => 0x50ad, 0xb7 => 0x5197, 0xb8 => 0x52c7,
+    0xb9 => 0x57c7, 0xba => 0x5889, 0xbb => 0x5bb9, 0xbc => 0x5eb8,
+    0xbd => 0x6142, 0xbe => 0x6995, 0xbf => 0x6d8c, 0xc0 => 0x6e67,
+    0xc1 => 0x6eb6, 0xc2 => 0x7194, 0xc3 => 0x7462, 0xc4 => 0x7528,
+    0xc5 => 0x752c, 0xc6 => 0x8073, 0xc7 => 0x8338, 0xc8 => 0x84c9,
+    0xc9 => 0x8e0a, 0xca => 0x9394, 0xcb => 0x93de, 0xcc => 0xf9c4,
+    0xcd => 0x4e8e, 0xce => 0x4f51, 0xcf => 0x5076, 0xd0 => 0x512a,
+    0xd1 => 0x53c8, 0xd2 => 0x53cb, 0xd3 => 0x53f3, 0xd4 => 0x5b87,
+    0xd5 => 0x5bd3, 0xd6 => 0x5c24, 0xd7 => 0x611a, 0xd8 => 0x6182,
+    0xd9 => 0x65f4, 0xda => 0x725b, 0xdb => 0x7397, 0xdc => 0x7440,
+    0xdd => 0x76c2, 0xde => 0x7950, 0xdf => 0x7991, 0xe0 => 0x79b9,
+    0xe1 => 0x7d06, 0xe2 => 0x7fbd, 0xe3 => 0x828b, 0xe4 => 0x85d5,
+    0xe5 => 0x865e, 0xe6 => 0x8fc2, 0xe7 => 0x9047, 0xe8 => 0x90f5,
+    0xe9 => 0x91ea, 0xea => 0x9685, 0xeb => 0x96e8, 0xec => 0x96e9,
+    0xed => 0x52d6, 0xee => 0x5f67, 0xef => 0x65ed, 0xf0 => 0x6631,
+    0xf1 => 0x682f, 0xf2 => 0x715c, 0xf3 => 0x7a36, 0xf4 => 0x90c1,
+    0xf5 => 0x980a, 0xf6 => 0x4e91, 0xf7 => 0xf9c5, 0xf8 => 0x6a52,
+    0xf9 => 0x6b9e, 0xfa => 0x6f90, 0xfb => 0x7189, 0xfc => 0x8018,
+    0xfd => 0x82b8, 0xfe => 0x8553,
+  },
+  0xea => {
+    0xa1 => 0x904b, 0xa2 => 0x9695, 0xa3 => 0x96f2, 0xa4 => 0x97fb,
+    0xa5 => 0x851a, 0xa6 => 0x9b31, 0xa7 => 0x4e90, 0xa8 => 0x718a,
+    0xa9 => 0x96c4, 0xaa => 0x5143, 0xab => 0x539f, 0xac => 0x54e1,
+    0xad => 0x5713, 0xae => 0x5712, 0xaf => 0x57a3, 0xb0 => 0x5a9b,
+    0xb1 => 0x5ac4, 0xb2 => 0x5bc3, 0xb3 => 0x6028, 0xb4 => 0x613f,
+    0xb5 => 0x63f4, 0xb6 => 0x6c85, 0xb7 => 0x6d39, 0xb8 => 0x6e72,
+    0xb9 => 0x6e90, 0xba => 0x7230, 0xbb => 0x733f, 0xbc => 0x7457,
+    0xbd => 0x82d1, 0xbe => 0x8881, 0xbf => 0x8f45, 0xc0 => 0x9060,
+    0xc1 => 0xf9c6, 0xc2 => 0x9662, 0xc3 => 0x9858, 0xc4 => 0x9d1b,
+    0xc5 => 0x6708, 0xc6 => 0x8d8a, 0xc7 => 0x925e, 0xc8 => 0x4f4d,
+    0xc9 => 0x5049, 0xca => 0x50de, 0xcb => 0x5371, 0xcc => 0x570d,
+    0xcd => 0x59d4, 0xce => 0x5a01, 0xcf => 0x5c09, 0xd0 => 0x6170,
+    0xd1 => 0x6690, 0xd2 => 0x6e2d, 0xd3 => 0x7232, 0xd4 => 0x744b,
+    0xd5 => 0x7def, 0xd6 => 0x80c3, 0xd7 => 0x840e, 0xd8 => 0x8466,
+    0xd9 => 0x853f, 0xda => 0x875f, 0xdb => 0x885b, 0xdc => 0x8918,
+    0xdd => 0x8b02, 0xde => 0x9055, 0xdf => 0x97cb, 0xe0 => 0x9b4f,
+    0xe1 => 0x4e73, 0xe2 => 0x4f91, 0xe3 => 0x5112, 0xe4 => 0x516a,
+    0xe5 => 0xf9c7, 0xe6 => 0x552f, 0xe7 => 0x55a9, 0xe8 => 0x5b7a,
+    0xe9 => 0x5ba5, 0xea => 0x5e7c, 0xeb => 0x5e7d, 0xec => 0x5ebe,
+    0xed => 0x60a0, 0xee => 0x60df, 0xef => 0x6108, 0xf0 => 0x6109,
+    0xf1 => 0x63c4, 0xf2 => 0x6538, 0xf3 => 0x6709, 0xf4 => 0xf9c8,
+    0xf5 => 0x67d4, 0xf6 => 0x67da, 0xf7 => 0xf9c9, 0xf8 => 0x6961,
+    0xf9 => 0x6962, 0xfa => 0x6cb9, 0xfb => 0x6d27, 0xfc => 0xf9ca,
+    0xfd => 0x6e38, 0xfe => 0xf9cb,
+  },
+  0xeb => {
+    0xa1 => 0x6fe1, 0xa2 => 0x7336, 0xa3 => 0x7337, 0xa4 => 0xf9cc,
+    0xa5 => 0x745c, 0xa6 => 0x7531, 0xa7 => 0xf9cd, 0xa8 => 0x7652,
+    0xa9 => 0xf9ce, 0xaa => 0xf9cf, 0xab => 0x7dad, 0xac => 0x81fe,
+    0xad => 0x8438, 0xae => 0x88d5, 0xaf => 0x8a98, 0xb0 => 0x8adb,
+    0xb1 => 0x8aed, 0xb2 => 0x8e30, 0xb3 => 0x8e42, 0xb4 => 0x904a,
+    0xb5 => 0x903e, 0xb6 => 0x907a, 0xb7 => 0x9149, 0xb8 => 0x91c9,
+    0xb9 => 0x936e, 0xba => 0xf9d0, 0xbb => 0xf9d1, 0xbc => 0x5809,
+    0xbd => 0xf9d2, 0xbe => 0x6bd3, 0xbf => 0x8089, 0xc0 => 0x80b2,
+    0xc1 => 0xf9d3, 0xc2 => 0xf9d4, 0xc3 => 0x5141, 0xc4 => 0x596b,
+    0xc5 => 0x5c39, 0xc6 => 0xf9d5, 0xc7 => 0xf9d6, 0xc8 => 0x6f64,
+    0xc9 => 0x73a7, 0xca => 0x80e4, 0xcb => 0x8d07, 0xcc => 0xf9d7,
+    0xcd => 0x9217, 0xce => 0x958f, 0xcf => 0xf9d8, 0xd0 => 0xf9d9,
+    0xd1 => 0xf9da, 0xd2 => 0xf9db, 0xd3 => 0x807f, 0xd4 => 0x620e,
+    0xd5 => 0x701c, 0xd6 => 0x7d68, 0xd7 => 0x878d, 0xd8 => 0xf9dc,
+    0xd9 => 0x57a0, 0xda => 0x6069, 0xdb => 0x6147, 0xdc => 0x6bb7,
+    0xdd => 0x8abe, 0xde => 0x9280, 0xdf => 0x96b1, 0xe0 => 0x4e59,
+    0xe1 => 0x541f, 0xe2 => 0x6deb, 0xe3 => 0x852d, 0xe4 => 0x9670,
+    0xe5 => 0x97f3, 0xe6 => 0x98ee, 0xe7 => 0x63d6, 0xe8 => 0x6ce3,
+    0xe9 => 0x9091, 0xea => 0x51dd, 0xeb => 0x61c9, 0xec => 0x81ba,
+    0xed => 0x9df9, 0xee => 0x4f9d, 0xef => 0x501a, 0xf0 => 0x5100,
+    0xf1 => 0x5b9c, 0xf2 => 0x610f, 0xf3 => 0x61ff, 0xf4 => 0x64ec,
+    0xf5 => 0x6905, 0xf6 => 0x6bc5, 0xf7 => 0x7591, 0xf8 => 0x77e3,
+    0xf9 => 0x7fa9, 0xfa => 0x8264, 0xfb => 0x858f, 0xfc => 0x87fb,
+    0xfd => 0x8863, 0xfe => 0x8abc,
+  },
+  0xec => {
+    0xa1 => 0x8b70, 0xa2 => 0x91ab, 0xa3 => 0x4e8c, 0xa4 => 0x4ee5,
+    0xa5 => 0x4f0a, 0xa6 => 0xf9dd, 0xa7 => 0xf9de, 0xa8 => 0x5937,
+    0xa9 => 0x59e8, 0xaa => 0xf9df, 0xab => 0x5df2, 0xac => 0x5f1b,
+    0xad => 0x5f5b, 0xae => 0x6021, 0xaf => 0xf9e0, 0xb0 => 0xf9e1,
+    0xb1 => 0xf9e2, 0xb2 => 0xf9e3, 0xb3 => 0x723e, 0xb4 => 0x73e5,
+    0xb5 => 0xf9e4, 0xb6 => 0x7570, 0xb7 => 0x75cd, 0xb8 => 0xf9e5,
+    0xb9 => 0x79fb, 0xba => 0xf9e6, 0xbb => 0x800c, 0xbc => 0x8033,
+    0xbd => 0x8084, 0xbe => 0x82e1, 0xbf => 0x8351, 0xc0 => 0xf9e7,
+    0xc1 => 0xf9e8, 0xc2 => 0x8cbd, 0xc3 => 0x8cb3, 0xc4 => 0x9087,
+    0xc5 => 0xf9e9, 0xc6 => 0xf9ea, 0xc7 => 0x98f4, 0xc8 => 0x990c,
+    0xc9 => 0xf9eb, 0xca => 0xf9ec, 0xcb => 0x7037, 0xcc => 0x76ca,
+    0xcd => 0x7fca, 0xce => 0x7fcc, 0xcf => 0x7ffc, 0xd0 => 0x8b1a,
+    0xd1 => 0x4eba, 0xd2 => 0x4ec1, 0xd3 => 0x5203, 0xd4 => 0x5370,
+    0xd5 => 0xf9ed, 0xd6 => 0x54bd, 0xd7 => 0x56e0, 0xd8 => 0x59fb,
+    0xd9 => 0x5bc5, 0xda => 0x5f15, 0xdb => 0x5fcd, 0xdc => 0x6e6e,
+    0xdd => 0xf9ee, 0xde => 0xf9ef, 0xdf => 0x7d6a, 0xe0 => 0x8335,
+    0xe1 => 0xf9f0, 0xe2 => 0x8693, 0xe3 => 0x8a8d, 0xe4 => 0xf9f1,
+    0xe5 => 0x976d, 0xe6 => 0x9777, 0xe7 => 0xf9f2, 0xe8 => 0xf9f3,
+    0xe9 => 0x4e00, 0xea => 0x4f5a, 0xeb => 0x4f7e, 0xec => 0x58f9,
+    0xed => 0x65e5, 0xee => 0x6ea2, 0xef => 0x9038, 0xf0 => 0x93b0,
+    0xf1 => 0x99b9, 0xf2 => 0x4efb, 0xf3 => 0x58ec, 0xf4 => 0x598a,
+    0xf5 => 0x59d9, 0xf6 => 0x6041, 0xf7 => 0xf9f4, 0xf8 => 0xf9f5,
+    0xf9 => 0x7a14, 0xfa => 0xf9f6, 0xfb => 0x834f, 0xfc => 0x8cc3,
+    0xfd => 0x5165, 0xfe => 0x5344,
+  },
+  0xed => {
+    0xa1 => 0xf9f7, 0xa2 => 0xf9f8, 0xa3 => 0xf9f9, 0xa4 => 0x4ecd,
+    0xa5 => 0x5269, 0xa6 => 0x5b55, 0xa7 => 0x82bf, 0xa8 => 0x4ed4,
+    0xa9 => 0x523a, 0xaa => 0x54a8, 0xab => 0x59c9, 0xac => 0x59ff,
+    0xad => 0x5b50, 0xae => 0x5b57, 0xaf => 0x5b5c, 0xb0 => 0x6063,
+    0xb1 => 0x6148, 0xb2 => 0x6ecb, 0xb3 => 0x7099, 0xb4 => 0x716e,
+    0xb5 => 0x7386, 0xb6 => 0x74f7, 0xb7 => 0x75b5, 0xb8 => 0x78c1,
+    0xb9 => 0x7d2b, 0xba => 0x8005, 0xbb => 0x81ea, 0xbc => 0x8328,
+    0xbd => 0x8517, 0xbe => 0x85c9, 0xbf => 0x8aee, 0xc0 => 0x8cc7,
+    0xc1 => 0x96cc, 0xc2 => 0x4f5c, 0xc3 => 0x52fa, 0xc4 => 0x56bc,
+    0xc5 => 0x65ab, 0xc6 => 0x6628, 0xc7 => 0x707c, 0xc8 => 0x70b8,
+    0xc9 => 0x7235, 0xca => 0x7dbd, 0xcb => 0x828d, 0xcc => 0x914c,
+    0xcd => 0x96c0, 0xce => 0x9d72, 0xcf => 0x5b71, 0xd0 => 0x68e7,
+    0xd1 => 0x6b98, 0xd2 => 0x6f7a, 0xd3 => 0x76de, 0xd4 => 0x5c91,
+    0xd5 => 0x66ab, 0xd6 => 0x6f5b, 0xd7 => 0x7bb4, 0xd8 => 0x7c2a,
+    0xd9 => 0x8836, 0xda => 0x96dc, 0xdb => 0x4e08, 0xdc => 0x4ed7,
+    0xdd => 0x5320, 0xde => 0x5834, 0xdf => 0x58bb, 0xe0 => 0x58ef,
+    0xe1 => 0x596c, 0xe2 => 0x5c07, 0xe3 => 0x5e33, 0xe4 => 0x5e84,
+    0xe5 => 0x5f35, 0xe6 => 0x638c, 0xe7 => 0x66b2, 0xe8 => 0x6756,
+    0xe9 => 0x6a1f, 0xea => 0x6aa3, 0xeb => 0x6b0c, 0xec => 0x6f3f,
+    0xed => 0x7246, 0xee => 0xf9fa, 0xef => 0x7350, 0xf0 => 0x748b,
+    0xf1 => 0x7ae0, 0xf2 => 0x7ca7, 0xf3 => 0x8178, 0xf4 => 0x81df,
+    0xf5 => 0x81e7, 0xf6 => 0x838a, 0xf7 => 0x846c, 0xf8 => 0x8523,
+    0xf9 => 0x8594, 0xfa => 0x85cf, 0xfb => 0x88dd, 0xfc => 0x8d13,
+    0xfd => 0x91ac, 0xfe => 0x9577,
+  },
+  0xee => {
+    0xa1 => 0x969c, 0xa2 => 0x518d, 0xa3 => 0x54c9, 0xa4 => 0x5728,
+    0xa5 => 0x5bb0, 0xa6 => 0x624d, 0xa7 => 0x6750, 0xa8 => 0x683d,
+    0xa9 => 0x6893, 0xaa => 0x6e3d, 0xab => 0x6ed3, 0xac => 0x707d,
+    0xad => 0x7e21, 0xae => 0x88c1, 0xaf => 0x8ca1, 0xb0 => 0x8f09,
+    0xb1 => 0x9f4b, 0xb2 => 0x9f4e, 0xb3 => 0x722d, 0xb4 => 0x7b8f,
+    0xb5 => 0x8acd, 0xb6 => 0x931a, 0xb7 => 0x4f47, 0xb8 => 0x4f4e,
+    0xb9 => 0x5132, 0xba => 0x5480, 0xbb => 0x59d0, 0xbc => 0x5e95,
+    0xbd => 0x62b5, 0xbe => 0x6775, 0xbf => 0x696e, 0xc0 => 0x6a17,
+    0xc1 => 0x6cae, 0xc2 => 0x6e1a, 0xc3 => 0x72d9, 0xc4 => 0x732a,
+    0xc5 => 0x75bd, 0xc6 => 0x7bb8, 0xc7 => 0x7d35, 0xc8 => 0x82e7,
+    0xc9 => 0x83f9, 0xca => 0x8457, 0xcb => 0x85f7, 0xcc => 0x8a5b,
+    0xcd => 0x8caf, 0xce => 0x8e87, 0xcf => 0x9019, 0xd0 => 0x90b8,
+    0xd1 => 0x96ce, 0xd2 => 0x9f5f, 0xd3 => 0x52e3, 0xd4 => 0x540a,
+    0xd5 => 0x5ae1, 0xd6 => 0x5bc2, 0xd7 => 0x6458, 0xd8 => 0x6575,
+    0xd9 => 0x6ef4, 0xda => 0x72c4, 0xdb => 0xf9fb, 0xdc => 0x7684,
+    0xdd => 0x7a4d, 0xde => 0x7b1b, 0xdf => 0x7c4d, 0xe0 => 0x7e3e,
+    0xe1 => 0x7fdf, 0xe2 => 0x837b, 0xe3 => 0x8b2b, 0xe4 => 0x8cca,
+    0xe5 => 0x8d64, 0xe6 => 0x8de1, 0xe7 => 0x8e5f, 0xe8 => 0x8fea,
+    0xe9 => 0x8ff9, 0xea => 0x9069, 0xeb => 0x93d1, 0xec => 0x4f43,
+    0xed => 0x4f7a, 0xee => 0x50b3, 0xef => 0x5168, 0xf0 => 0x5178,
+    0xf1 => 0x524d, 0xf2 => 0x526a, 0xf3 => 0x5861, 0xf4 => 0x587c,
+    0xf5 => 0x5960, 0xf6 => 0x5c08, 0xf7 => 0x5c55, 0xf8 => 0x5edb,
+    0xf9 => 0x609b, 0xfa => 0x6230, 0xfb => 0x6813, 0xfc => 0x6bbf,
+    0xfd => 0x6c08, 0xfe => 0x6fb1,
+  },
+  0xef => {
+    0xa1 => 0x714e, 0xa2 => 0x7420, 0xa3 => 0x7530, 0xa4 => 0x7538,
+    0xa5 => 0x7551, 0xa6 => 0x7672, 0xa7 => 0x7b4c, 0xa8 => 0x7b8b,
+    0xa9 => 0x7bad, 0xaa => 0x7bc6, 0xab => 0x7e8f, 0xac => 0x8a6e,
+    0xad => 0x8f3e, 0xae => 0x8f49, 0xaf => 0x923f, 0xb0 => 0x9293,
+    0xb1 => 0x9322, 0xb2 => 0x942b, 0xb3 => 0x96fb, 0xb4 => 0x985a,
+    0xb5 => 0x986b, 0xb6 => 0x991e, 0xb7 => 0x5207, 0xb8 => 0x622a,
+    0xb9 => 0x6298, 0xba => 0x6d59, 0xbb => 0x7664, 0xbc => 0x7aca,
+    0xbd => 0x7bc0, 0xbe => 0x7d76, 0xbf => 0x5360, 0xc0 => 0x5cbe,
+    0xc1 => 0x5e97, 0xc2 => 0x6f38, 0xc3 => 0x70b9, 0xc4 => 0x7c98,
+    0xc5 => 0x9711, 0xc6 => 0x9b8e, 0xc7 => 0x9ede, 0xc8 => 0x63a5,
+    0xc9 => 0x647a, 0xca => 0x8776, 0xcb => 0x4e01, 0xcc => 0x4e95,
+    0xcd => 0x4ead, 0xce => 0x505c, 0xcf => 0x5075, 0xd0 => 0x5448,
+    0xd1 => 0x59c3, 0xd2 => 0x5b9a, 0xd3 => 0x5e40, 0xd4 => 0x5ead,
+    0xd5 => 0x5ef7, 0xd6 => 0x5f81, 0xd7 => 0x60c5, 0xd8 => 0x633a,
+    0xd9 => 0x653f, 0xda => 0x6574, 0xdb => 0x65cc, 0xdc => 0x6676,
+    0xdd => 0x6678, 0xde => 0x67fe, 0xdf => 0x6968, 0xe0 => 0x6a89,
+    0xe1 => 0x6b63, 0xe2 => 0x6c40, 0xe3 => 0x6dc0, 0xe4 => 0x6de8,
+    0xe5 => 0x6e1f, 0xe6 => 0x6e5e, 0xe7 => 0x701e, 0xe8 => 0x70a1,
+    0xe9 => 0x738e, 0xea => 0x73fd, 0xeb => 0x753a, 0xec => 0x775b,
+    0xed => 0x7887, 0xee => 0x798e, 0xef => 0x7a0b, 0xf0 => 0x7a7d,
+    0xf1 => 0x7cbe, 0xf2 => 0x7d8e, 0xf3 => 0x8247, 0xf4 => 0x8a02,
+    0xf5 => 0x8aea, 0xf6 => 0x8c9e, 0xf7 => 0x912d, 0xf8 => 0x914a,
+    0xf9 => 0x91d8, 0xfa => 0x9266, 0xfb => 0x92cc, 0xfc => 0x9320,
+    0xfd => 0x9706, 0xfe => 0x9756,
+  },
+  0xf0 => {
+    0xa1 => 0x975c, 0xa2 => 0x9802, 0xa3 => 0x9f0e, 0xa4 => 0x5236,
+    0xa5 => 0x5291, 0xa6 => 0x557c, 0xa7 => 0x5824, 0xa8 => 0x5e1d,
+    0xa9 => 0x5f1f, 0xaa => 0x608c, 0xab => 0x63d0, 0xac => 0x68af,
+    0xad => 0x6fdf, 0xae => 0x796d, 0xaf => 0x7b2c, 0xb0 => 0x81cd,
+    0xb1 => 0x85ba, 0xb2 => 0x88fd, 0xb3 => 0x8af8, 0xb4 => 0x8e44,
+    0xb5 => 0x918d, 0xb6 => 0x9664, 0xb7 => 0x969b, 0xb8 => 0x973d,
+    0xb9 => 0x984c, 0xba => 0x9f4a, 0xbb => 0x4fce, 0xbc => 0x5146,
+    0xbd => 0x51cb, 0xbe => 0x52a9, 0xbf => 0x5632, 0xc0 => 0x5f14,
+    0xc1 => 0x5f6b, 0xc2 => 0x63aa, 0xc3 => 0x64cd, 0xc4 => 0x65e9,
+    0xc5 => 0x6641, 0xc6 => 0x66fa, 0xc7 => 0x66f9, 0xc8 => 0x671d,
+    0xc9 => 0x689d, 0xca => 0x68d7, 0xcb => 0x69fd, 0xcc => 0x6f15,
+    0xcd => 0x6f6e, 0xce => 0x7167, 0xcf => 0x71e5, 0xd0 => 0x722a,
+    0xd1 => 0x74aa, 0xd2 => 0x773a, 0xd3 => 0x7956, 0xd4 => 0x795a,
+    0xd5 => 0x79df, 0xd6 => 0x7a20, 0xd7 => 0x7a95, 0xd8 => 0x7c97,
+    0xd9 => 0x7cdf, 0xda => 0x7d44, 0xdb => 0x7e70, 0xdc => 0x8087,
+    0xdd => 0x85fb, 0xde => 0x86a4, 0xdf => 0x8a54, 0xe0 => 0x8abf,
+    0xe1 => 0x8d99, 0xe2 => 0x8e81, 0xe3 => 0x9020, 0xe4 => 0x906d,
+    0xe5 => 0x91e3, 0xe6 => 0x963b, 0xe7 => 0x96d5, 0xe8 => 0x9ce5,
+    0xe9 => 0x65cf, 0xea => 0x7c07, 0xeb => 0x8db3, 0xec => 0x93c3,
+    0xed => 0x5b58, 0xee => 0x5c0a, 0xef => 0x5352, 0xf0 => 0x62d9,
+    0xf1 => 0x731d, 0xf2 => 0x5027, 0xf3 => 0x5b97, 0xf4 => 0x5f9e,
+    0xf5 => 0x60b0, 0xf6 => 0x616b, 0xf7 => 0x68d5, 0xf8 => 0x6dd9,
+    0xf9 => 0x742e, 0xfa => 0x7a2e, 0xfb => 0x7d42, 0xfc => 0x7d9c,
+    0xfd => 0x7e31, 0xfe => 0x816b,
+  },
+  0xf1 => {
+    0xa1 => 0x8e2a, 0xa2 => 0x8e35, 0xa3 => 0x937e, 0xa4 => 0x9418,
+    0xa5 => 0x4f50, 0xa6 => 0x5750, 0xa7 => 0x5de6, 0xa8 => 0x5ea7,
+    0xa9 => 0x632b, 0xaa => 0x7f6a, 0xab => 0x4e3b, 0xac => 0x4f4f,
+    0xad => 0x4f8f, 0xae => 0x505a, 0xaf => 0x59dd, 0xb0 => 0x80c4,
+    0xb1 => 0x546a, 0xb2 => 0x5468, 0xb3 => 0x55fe, 0xb4 => 0x594f,
+    0xb5 => 0x5b99, 0xb6 => 0x5dde, 0xb7 => 0x5eda, 0xb8 => 0x665d,
+    0xb9 => 0x6731, 0xba => 0x67f1, 0xbb => 0x682a, 0xbc => 0x6ce8,
+    0xbd => 0x6d32, 0xbe => 0x6e4a, 0xbf => 0x6f8d, 0xc0 => 0x70b7,
+    0xc1 => 0x73e0, 0xc2 => 0x7587, 0xc3 => 0x7c4c, 0xc4 => 0x7d02,
+    0xc5 => 0x7d2c, 0xc6 => 0x7da2, 0xc7 => 0x821f, 0xc8 => 0x86db,
+    0xc9 => 0x8a3b, 0xca => 0x8a85, 0xcb => 0x8d70, 0xcc => 0x8e8a,
+    0xcd => 0x8f33, 0xce => 0x9031, 0xcf => 0x914e, 0xd0 => 0x9152,
+    0xd1 => 0x9444, 0xd2 => 0x99d0, 0xd3 => 0x7af9, 0xd4 => 0x7ca5,
+    0xd5 => 0x4fca, 0xd6 => 0x5101, 0xd7 => 0x51c6, 0xd8 => 0x57c8,
+    0xd9 => 0x5bef, 0xda => 0x5cfb, 0xdb => 0x6659, 0xdc => 0x6a3d,
+    0xdd => 0x6d5a, 0xde => 0x6e96, 0xdf => 0x6fec, 0xe0 => 0x710c,
+    0xe1 => 0x756f, 0xe2 => 0x7ae3, 0xe3 => 0x8822, 0xe4 => 0x9021,
+    0xe5 => 0x9075, 0xe6 => 0x96cb, 0xe7 => 0x99ff, 0xe8 => 0x8301,
+    0xe9 => 0x4e2d, 0xea => 0x4ef2, 0xeb => 0x8846, 0xec => 0x91cd,
+    0xed => 0x537d, 0xee => 0x6adb, 0xef => 0x696b, 0xf0 => 0x6c41,
+    0xf1 => 0x847a, 0xf2 => 0x589e, 0xf3 => 0x618e, 0xf4 => 0x66fe,
+    0xf5 => 0x62ef, 0xf6 => 0x70dd, 0xf7 => 0x7511, 0xf8 => 0x75c7,
+    0xf9 => 0x7e52, 0xfa => 0x84b8, 0xfb => 0x8b49, 0xfc => 0x8d08,
+    0xfd => 0x4e4b, 0xfe => 0x53ea,
+  },
+  0xf2 => {
+    0xa1 => 0x54ab, 0xa2 => 0x5730, 0xa3 => 0x5740, 0xa4 => 0x5fd7,
+    0xa5 => 0x6301, 0xa6 => 0x6307, 0xa7 => 0x646f, 0xa8 => 0x652f,
+    0xa9 => 0x65e8, 0xaa => 0x667a, 0xab => 0x679d, 0xac => 0x67b3,
+    0xad => 0x6b62, 0xae => 0x6c60, 0xaf => 0x6c9a, 0xb0 => 0x6f2c,
+    0xb1 => 0x77e5, 0xb2 => 0x7825, 0xb3 => 0x7949, 0xb4 => 0x7957,
+    0xb5 => 0x7d19, 0xb6 => 0x80a2, 0xb7 => 0x8102, 0xb8 => 0x81f3,
+    0xb9 => 0x829d, 0xba => 0x82b7, 0xbb => 0x8718, 0xbc => 0x8a8c,
+    0xbd => 0xf9fc, 0xbe => 0x8d04, 0xbf => 0x8dbe, 0xc0 => 0x9072,
+    0xc1 => 0x76f4, 0xc2 => 0x7a19, 0xc3 => 0x7a37, 0xc4 => 0x7e54,
+    0xc5 => 0x8077, 0xc6 => 0x5507, 0xc7 => 0x55d4, 0xc8 => 0x5875,
+    0xc9 => 0x632f, 0xca => 0x6422, 0xcb => 0x6649, 0xcc => 0x664b,
+    0xcd => 0x686d, 0xce => 0x699b, 0xcf => 0x6b84, 0xd0 => 0x6d25,
+    0xd1 => 0x6eb1, 0xd2 => 0x73cd, 0xd3 => 0x7468, 0xd4 => 0x74a1,
+    0xd5 => 0x755b, 0xd6 => 0x75b9, 0xd7 => 0x76e1, 0xd8 => 0x771e,
+    0xd9 => 0x778b, 0xda => 0x79e6, 0xdb => 0x7e09, 0xdc => 0x7e1d,
+    0xdd => 0x81fb, 0xde => 0x852f, 0xdf => 0x8897, 0xe0 => 0x8a3a,
+    0xe1 => 0x8cd1, 0xe2 => 0x8eeb, 0xe3 => 0x8fb0, 0xe4 => 0x9032,
+    0xe5 => 0x93ad, 0xe6 => 0x9663, 0xe7 => 0x9673, 0xe8 => 0x9707,
+    0xe9 => 0x4f84, 0xea => 0x53f1, 0xeb => 0x59ea, 0xec => 0x5ac9,
+    0xed => 0x5e19, 0xee => 0x684e, 0xef => 0x74c6, 0xf0 => 0x75be,
+    0xf1 => 0x79e9, 0xf2 => 0x7a92, 0xf3 => 0x81a3, 0xf4 => 0x86ed,
+    0xf5 => 0x8cea, 0xf6 => 0x8dcc, 0xf7 => 0x8fed, 0xf8 => 0x659f,
+    0xf9 => 0x6715, 0xfa => 0xf9fd, 0xfb => 0x57f7, 0xfc => 0x6f57,
+    0xfd => 0x7ddd, 0xfe => 0x8f2f,
+  },
+  0xf3 => {
+    0xa1 => 0x93f6, 0xa2 => 0x96c6, 0xa3 => 0x5fb5, 0xa4 => 0x61f2,
+    0xa5 => 0x6f84, 0xa6 => 0x4e14, 0xa7 => 0x4f98, 0xa8 => 0x501f,
+    0xa9 => 0x53c9, 0xaa => 0x55df, 0xab => 0x5d6f, 0xac => 0x5dee,
+    0xad => 0x6b21, 0xae => 0x6b64, 0xaf => 0x78cb, 0xb0 => 0x7b9a,
+    0xb1 => 0xf9fe, 0xb2 => 0x8e49, 0xb3 => 0x8eca, 0xb4 => 0x906e,
+    0xb5 => 0x6349, 0xb6 => 0x643e, 0xb7 => 0x7740, 0xb8 => 0x7a84,
+    0xb9 => 0x932f, 0xba => 0x947f, 0xbb => 0x9f6a, 0xbc => 0x64b0,
+    0xbd => 0x6faf, 0xbe => 0x71e6, 0xbf => 0x74a8, 0xc0 => 0x74da,
+    0xc1 => 0x7ac4, 0xc2 => 0x7c12, 0xc3 => 0x7e82, 0xc4 => 0x7cb2,
+    0xc5 => 0x7e98, 0xc6 => 0x8b9a, 0xc7 => 0x8d0a, 0xc8 => 0x947d,
+    0xc9 => 0x9910, 0xca => 0x994c, 0xcb => 0x5239, 0xcc => 0x5bdf,
+    0xcd => 0x64e6, 0xce => 0x672d, 0xcf => 0x7d2e, 0xd0 => 0x50ed,
+    0xd1 => 0x53c3, 0xd2 => 0x5879, 0xd3 => 0x6158, 0xd4 => 0x6159,
+    0xd5 => 0x61fa, 0xd6 => 0x65ac, 0xd7 => 0x7ad9, 0xd8 => 0x8b92,
+    0xd9 => 0x8b96, 0xda => 0x5009, 0xdb => 0x5021, 0xdc => 0x5275,
+    0xdd => 0x5531, 0xde => 0x5a3c, 0xdf => 0x5ee0, 0xe0 => 0x5f70,
+    0xe1 => 0x6134, 0xe2 => 0x655e, 0xe3 => 0x660c, 0xe4 => 0x6636,
+    0xe5 => 0x66a2, 0xe6 => 0x69cd, 0xe7 => 0x6ec4, 0xe8 => 0x6f32,
+    0xe9 => 0x7316, 0xea => 0x7621, 0xeb => 0x7a93, 0xec => 0x8139,
+    0xed => 0x8259, 0xee => 0x83d6, 0xef => 0x84bc, 0xf0 => 0x50b5,
+    0xf1 => 0x57f0, 0xf2 => 0x5bc0, 0xf3 => 0x5be8, 0xf4 => 0x5f69,
+    0xf5 => 0x63a1, 0xf6 => 0x7826, 0xf7 => 0x7db5, 0xf8 => 0x83dc,
+    0xf9 => 0x8521, 0xfa => 0x91c7, 0xfb => 0x91f5, 0xfc => 0x518a,
+    0xfd => 0x67f5, 0xfe => 0x7b56,
+  },
+  0xf4 => {
+    0xa1 => 0x8cac, 0xa2 => 0x51c4, 0xa3 => 0x59bb, 0xa4 => 0x60bd,
+    0xa5 => 0x8655, 0xa6 => 0x501c, 0xa7 => 0xf9ff, 0xa8 => 0x5254,
+    0xa9 => 0x5c3a, 0xaa => 0x617d, 0xab => 0x621a, 0xac => 0x62d3,
+    0xad => 0x64f2, 0xae => 0x65a5, 0xaf => 0x6ecc, 0xb0 => 0x7620,
+    0xb1 => 0x810a, 0xb2 => 0x8e60, 0xb3 => 0x965f, 0xb4 => 0x96bb,
+    0xb5 => 0x4edf, 0xb6 => 0x5343, 0xb7 => 0x5598, 0xb8 => 0x5929,
+    0xb9 => 0x5ddd, 0xba => 0x64c5, 0xbb => 0x6cc9, 0xbc => 0x6dfa,
+    0xbd => 0x7394, 0xbe => 0x7a7f, 0xbf => 0x821b, 0xc0 => 0x85a6,
+    0xc1 => 0x8ce4, 0xc2 => 0x8e10, 0xc3 => 0x9077, 0xc4 => 0x91e7,
+    0xc5 => 0x95e1, 0xc6 => 0x9621, 0xc7 => 0x97c6, 0xc8 => 0x51f8,
+    0xc9 => 0x54f2, 0xca => 0x5586, 0xcb => 0x5fb9, 0xcc => 0x64a4,
+    0xcd => 0x6f88, 0xce => 0x7db4, 0xcf => 0x8f1f, 0xd0 => 0x8f4d,
+    0xd1 => 0x9435, 0xd2 => 0x50c9, 0xd3 => 0x5c16, 0xd4 => 0x6cbe,
+    0xd5 => 0x6dfb, 0xd6 => 0x751b, 0xd7 => 0x77bb, 0xd8 => 0x7c3d,
+    0xd9 => 0x7c64, 0xda => 0x8a79, 0xdb => 0x8ac2, 0xdc => 0x581e,
+    0xdd => 0x59be, 0xde => 0x5e16, 0xdf => 0x6377, 0xe0 => 0x7252,
+    0xe1 => 0x758a, 0xe2 => 0x776b, 0xe3 => 0x8adc, 0xe4 => 0x8cbc,
+    0xe5 => 0x8f12, 0xe6 => 0x5ef3, 0xe7 => 0x6674, 0xe8 => 0x6df8,
+    0xe9 => 0x807d, 0xea => 0x83c1, 0xeb => 0x8acb, 0xec => 0x9751,
+    0xed => 0x9bd6, 0xee => 0xfa00, 0xef => 0x5243, 0xf0 => 0x66ff,
+    0xf1 => 0x6d95, 0xf2 => 0x6eef, 0xf3 => 0x7de0, 0xf4 => 0x8ae6,
+    0xf5 => 0x902e, 0xf6 => 0x905e, 0xf7 => 0x9ad4, 0xf8 => 0x521d,
+    0xf9 => 0x527f, 0xfa => 0x54e8, 0xfb => 0x6194, 0xfc => 0x6284,
+    0xfd => 0x62db, 0xfe => 0x68a2,
+  },
+  0xf5 => {
+    0xa1 => 0x6912, 0xa2 => 0x695a, 0xa3 => 0x6a35, 0xa4 => 0x7092,
+    0xa5 => 0x7126, 0xa6 => 0x785d, 0xa7 => 0x7901, 0xa8 => 0x790e,
+    0xa9 => 0x79d2, 0xaa => 0x7a0d, 0xab => 0x8096, 0xac => 0x8278,
+    0xad => 0x82d5, 0xae => 0x8349, 0xaf => 0x8549, 0xb0 => 0x8c82,
+    0xb1 => 0x8d85, 0xb2 => 0x9162, 0xb3 => 0x918b, 0xb4 => 0x91ae,
+    0xb5 => 0x4fc3, 0xb6 => 0x56d1, 0xb7 => 0x71ed, 0xb8 => 0x77d7,
+    0xb9 => 0x8700, 0xba => 0x89f8, 0xbb => 0x5bf8, 0xbc => 0x5fd6,
+    0xbd => 0x6751, 0xbe => 0x90a8, 0xbf => 0x53e2, 0xc0 => 0x585a,
+    0xc1 => 0x5bf5, 0xc2 => 0x60a4, 0xc3 => 0x6181, 0xc4 => 0x6460,
+    0xc5 => 0x7e3d, 0xc6 => 0x8070, 0xc7 => 0x8525, 0xc8 => 0x9283,
+    0xc9 => 0x64ae, 0xca => 0x50ac, 0xcb => 0x5d14, 0xcc => 0x6700,
+    0xcd => 0x589c, 0xce => 0x62bd, 0xcf => 0x63a8, 0xd0 => 0x690e,
+    0xd1 => 0x6978, 0xd2 => 0x6a1e, 0xd3 => 0x6e6b, 0xd4 => 0x76ba,
+    0xd5 => 0x79cb, 0xd6 => 0x82bb, 0xd7 => 0x8429, 0xd8 => 0x8acf,
+    0xd9 => 0x8da8, 0xda => 0x8ffd, 0xdb => 0x9112, 0xdc => 0x914b,
+    0xdd => 0x919c, 0xde => 0x9310, 0xdf => 0x9318, 0xe0 => 0x939a,
+    0xe1 => 0x96db, 0xe2 => 0x9a36, 0xe3 => 0x9c0d, 0xe4 => 0x4e11,
+    0xe5 => 0x755c, 0xe6 => 0x795d, 0xe7 => 0x7afa, 0xe8 => 0x7b51,
+    0xe9 => 0x7bc9, 0xea => 0x7e2e, 0xeb => 0x84c4, 0xec => 0x8e59,
+    0xed => 0x8e74, 0xee => 0x8ef8, 0xef => 0x9010, 0xf0 => 0x6625,
+    0xf1 => 0x693f, 0xf2 => 0x7443, 0xf3 => 0x51fa, 0xf4 => 0x672e,
+    0xf5 => 0x9edc, 0xf6 => 0x5145, 0xf7 => 0x5fe0, 0xf8 => 0x6c96,
+    0xf9 => 0x87f2, 0xfa => 0x885d, 0xfb => 0x8877, 0xfc => 0x60b4,
+    0xfd => 0x81b5, 0xfe => 0x8403,
+  },
+  0xf6 => {
+    0xa1 => 0x8d05, 0xa2 => 0x53d6, 0xa3 => 0x5439, 0xa4 => 0x5634,
+    0xa5 => 0x5a36, 0xa6 => 0x5c31, 0xa7 => 0x708a, 0xa8 => 0x7fe0,
+    0xa9 => 0x805a, 0xaa => 0x8106, 0xab => 0x81ed, 0xac => 0x8da3,
+    0xad => 0x9189, 0xae => 0x9a5f, 0xaf => 0x9df2, 0xb0 => 0x5074,
+    0xb1 => 0x4ec4, 0xb2 => 0x53a0, 0xb3 => 0x60fb, 0xb4 => 0x6e2c,
+    0xb5 => 0x5c64, 0xb6 => 0x4f88, 0xb7 => 0x5024, 0xb8 => 0x55e4,
+    0xb9 => 0x5cd9, 0xba => 0x5e5f, 0xbb => 0x6065, 0xbc => 0x6894,
+    0xbd => 0x6cbb, 0xbe => 0x6dc4, 0xbf => 0x71be, 0xc0 => 0x75d4,
+    0xc1 => 0x75f4, 0xc2 => 0x7661, 0xc3 => 0x7a1a, 0xc4 => 0x7a49,
+    0xc5 => 0x7dc7, 0xc6 => 0x7dfb, 0xc7 => 0x7f6e, 0xc8 => 0x81f4,
+    0xc9 => 0x86a9, 0xca => 0x8f1c, 0xcb => 0x96c9, 0xcc => 0x99b3,
+    0xcd => 0x9f52, 0xce => 0x5247, 0xcf => 0x52c5, 0xd0 => 0x98ed,
+    0xd1 => 0x89aa, 0xd2 => 0x4e03, 0xd3 => 0x67d2, 0xd4 => 0x6f06,
+    0xd5 => 0x4fb5, 0xd6 => 0x5be2, 0xd7 => 0x6795, 0xd8 => 0x6c88,
+    0xd9 => 0x6d78, 0xda => 0x741b, 0xdb => 0x7827, 0xdc => 0x91dd,
+    0xdd => 0x937c, 0xde => 0x87c4, 0xdf => 0x79e4, 0xe0 => 0x7a31,
+    0xe1 => 0x5feb, 0xe2 => 0x4ed6, 0xe3 => 0x54a4, 0xe4 => 0x553e,
+    0xe5 => 0x58ae, 0xe6 => 0x59a5, 0xe7 => 0x60f0, 0xe8 => 0x6253,
+    0xe9 => 0x62d6, 0xea => 0x6736, 0xeb => 0x6955, 0xec => 0x8235,
+    0xed => 0x9640, 0xee => 0x99b1, 0xef => 0x99dd, 0xf0 => 0x502c,
+    0xf1 => 0x5353, 0xf2 => 0x5544, 0xf3 => 0x577c, 0xf4 => 0xfa01,
+    0xf5 => 0x6258, 0xf6 => 0xfa02, 0xf7 => 0x64e2, 0xf8 => 0x666b,
+    0xf9 => 0x67dd, 0xfa => 0x6fc1, 0xfb => 0x6fef, 0xfc => 0x7422,
+    0xfd => 0x7438, 0xfe => 0x8a17,
+  },
+  0xf7 => {
+    0xa1 => 0x9438, 0xa2 => 0x5451, 0xa3 => 0x5606, 0xa4 => 0x5766,
+    0xa5 => 0x5f48, 0xa6 => 0x619a, 0xa7 => 0x6b4e, 0xa8 => 0x7058,
+    0xa9 => 0x70ad, 0xaa => 0x7dbb, 0xab => 0x8a95, 0xac => 0x596a,
+    0xad => 0x812b, 0xae => 0x63a2, 0xaf => 0x7708, 0xb0 => 0x803d,
+    0xb1 => 0x8caa, 0xb2 => 0x5854, 0xb3 => 0x642d, 0xb4 => 0x69bb,
+    0xb5 => 0x5b95, 0xb6 => 0x5e11, 0xb7 => 0x6e6f, 0xb8 => 0xfa03,
+    0xb9 => 0x8569, 0xba => 0x514c, 0xbb => 0x53f0, 0xbc => 0x592a,
+    0xbd => 0x6020, 0xbe => 0x614b, 0xbf => 0x6b86, 0xc0 => 0x6c70,
+    0xc1 => 0x6cf0, 0xc2 => 0x7b1e, 0xc3 => 0x80ce, 0xc4 => 0x82d4,
+    0xc5 => 0x8dc6, 0xc6 => 0x90b0, 0xc7 => 0x98b1, 0xc8 => 0xfa04,
+    0xc9 => 0x64c7, 0xca => 0x6fa4, 0xcb => 0x6491, 0xcc => 0x6504,
+    0xcd => 0x514e, 0xce => 0x5410, 0xcf => 0x571f, 0xd0 => 0x8a0e,
+    0xd1 => 0x615f, 0xd2 => 0x6876, 0xd3 => 0xfa05, 0xd4 => 0x75db,
+    0xd5 => 0x7b52, 0xd6 => 0x7d71, 0xd7 => 0x901a, 0xd8 => 0x5806,
+    0xd9 => 0x69cc, 0xda => 0x817f, 0xdb => 0x892a, 0xdc => 0x9000,
+    0xdd => 0x9839, 0xde => 0x5078, 0xdf => 0x5957, 0xe0 => 0x59ac,
+    0xe1 => 0x6295, 0xe2 => 0x900f, 0xe3 => 0x9b2a, 0xe4 => 0x615d,
+    0xe5 => 0x7279, 0xe6 => 0x95d6, 0xe7 => 0x5761, 0xe8 => 0x5a46,
+    0xe9 => 0x5df4, 0xea => 0x628a, 0xeb => 0x64ad, 0xec => 0x64fa,
+    0xed => 0x6777, 0xee => 0x6ce2, 0xef => 0x6d3e, 0xf0 => 0x722c,
+    0xf1 => 0x7436, 0xf2 => 0x7834, 0xf3 => 0x7f77, 0xf4 => 0x82ad,
+    0xf5 => 0x8ddb, 0xf6 => 0x9817, 0xf7 => 0x5224, 0xf8 => 0x5742,
+    0xf9 => 0x677f, 0xfa => 0x7248, 0xfb => 0x74e3, 0xfc => 0x8ca9,
+    0xfd => 0x8fa6, 0xfe => 0x9211,
+  },
+  0xf8 => {
+    0xa1 => 0x962a, 0xa2 => 0x516b, 0xa3 => 0x53ed, 0xa4 => 0x634c,
+    0xa5 => 0x4f69, 0xa6 => 0x5504, 0xa7 => 0x6096, 0xa8 => 0x6557,
+    0xa9 => 0x6c9b, 0xaa => 0x6d7f, 0xab => 0x724c, 0xac => 0x72fd,
+    0xad => 0x7a17, 0xae => 0x8987, 0xaf => 0x8c9d, 0xb0 => 0x5f6d,
+    0xb1 => 0x6f8e, 0xb2 => 0x70f9, 0xb3 => 0x81a8, 0xb4 => 0x610e,
+    0xb5 => 0x4fbf, 0xb6 => 0x504f, 0xb7 => 0x6241, 0xb8 => 0x7247,
+    0xb9 => 0x7bc7, 0xba => 0x7de8, 0xbb => 0x7fe9, 0xbc => 0x904d,
+    0xbd => 0x97ad, 0xbe => 0x9a19, 0xbf => 0x8cb6, 0xc0 => 0x576a,
+    0xc1 => 0x5e73, 0xc2 => 0x67b0, 0xc3 => 0x840d, 0xc4 => 0x8a55,
+    0xc5 => 0x5420, 0xc6 => 0x5b16, 0xc7 => 0x5e63, 0xc8 => 0x5ee2,
+    0xc9 => 0x5f0a, 0xca => 0x6583, 0xcb => 0x80ba, 0xcc => 0x853d,
+    0xcd => 0x9589, 0xce => 0x965b, 0xcf => 0x4f48, 0xd0 => 0x5305,
+    0xd1 => 0x530d, 0xd2 => 0x530f, 0xd3 => 0x5486, 0xd4 => 0x54fa,
+    0xd5 => 0x5703, 0xd6 => 0x5e03, 0xd7 => 0x6016, 0xd8 => 0x629b,
+    0xd9 => 0x62b1, 0xda => 0x6355, 0xdb => 0xfa06, 0xdc => 0x6ce1,
+    0xdd => 0x6d66, 0xde => 0x75b1, 0xdf => 0x7832, 0xe0 => 0x80de,
+    0xe1 => 0x812f, 0xe2 => 0x82de, 0xe3 => 0x8461, 0xe4 => 0x84b2,
+    0xe5 => 0x888d, 0xe6 => 0x8912, 0xe7 => 0x900b, 0xe8 => 0x92ea,
+    0xe9 => 0x98fd, 0xea => 0x9b91, 0xeb => 0x5e45, 0xec => 0x66b4,
+    0xed => 0x66dd, 0xee => 0x7011, 0xef => 0x7206, 0xf0 => 0xfa07,
+    0xf1 => 0x4ff5, 0xf2 => 0x527d, 0xf3 => 0x5f6a, 0xf4 => 0x6153,
+    0xf5 => 0x6753, 0xf6 => 0x6a19, 0xf7 => 0x6f02, 0xf8 => 0x74e2,
+    0xf9 => 0x7968, 0xfa => 0x8868, 0xfb => 0x8c79, 0xfc => 0x98c7,
+    0xfd => 0x98c4, 0xfe => 0x9a43,
+  },
+  0xf9 => {
+    0xa1 => 0x54c1, 0xa2 => 0x7a1f, 0xa3 => 0x6953, 0xa4 => 0x8af7,
+    0xa5 => 0x8c4a, 0xa6 => 0x98a8, 0xa7 => 0x99ae, 0xa8 => 0x5f7c,
+    0xa9 => 0x62ab, 0xaa => 0x75b2, 0xab => 0x76ae, 0xac => 0x88ab,
+    0xad => 0x907f, 0xae => 0x9642, 0xaf => 0x5339, 0xb0 => 0x5f3c,
+    0xb1 => 0x5fc5, 0xb2 => 0x6ccc, 0xb3 => 0x73cc, 0xb4 => 0x7562,
+    0xb5 => 0x758b, 0xb6 => 0x7b46, 0xb7 => 0x82fe, 0xb8 => 0x999d,
+    0xb9 => 0x4e4f, 0xba => 0x903c, 0xbb => 0x4e0b, 0xbc => 0x4f55,
+    0xbd => 0x53a6, 0xbe => 0x590f, 0xbf => 0x5ec8, 0xc0 => 0x6630,
+    0xc1 => 0x6cb3, 0xc2 => 0x7455, 0xc3 => 0x8377, 0xc4 => 0x8766,
+    0xc5 => 0x8cc0, 0xc6 => 0x9050, 0xc7 => 0x971e, 0xc8 => 0x9c15,
+    0xc9 => 0x58d1, 0xca => 0x5b78, 0xcb => 0x8650, 0xcc => 0x8b14,
+    0xcd => 0x9db4, 0xce => 0x5bd2, 0xcf => 0x6068, 0xd0 => 0x608d,
+    0xd1 => 0x65f1, 0xd2 => 0x6c57, 0xd3 => 0x6f22, 0xd4 => 0x6fa3,
+    0xd5 => 0x701a, 0xd6 => 0x7f55, 0xd7 => 0x7ff0, 0xd8 => 0x9591,
+    0xd9 => 0x9592, 0xda => 0x9650, 0xdb => 0x97d3, 0xdc => 0x5272,
+    0xdd => 0x8f44, 0xde => 0x51fd, 0xdf => 0x542b, 0xe0 => 0x54b8,
+    0xe1 => 0x5563, 0xe2 => 0x558a, 0xe3 => 0x6abb, 0xe4 => 0x6db5,
+    0xe5 => 0x7dd8, 0xe6 => 0x8266, 0xe7 => 0x929c, 0xe8 => 0x9677,
+    0xe9 => 0x9e79, 0xea => 0x5408, 0xeb => 0x54c8, 0xec => 0x76d2,
+    0xed => 0x86e4, 0xee => 0x95a4, 0xef => 0x95d4, 0xf0 => 0x965c,
+    0xf1 => 0x4ea2, 0xf2 => 0x4f09, 0xf3 => 0x59ee, 0xf4 => 0x5ae6,
+    0xf5 => 0x5df7, 0xf6 => 0x6052, 0xf7 => 0x6297, 0xf8 => 0x676d,
+    0xf9 => 0x6841, 0xfa => 0x6c86, 0xfb => 0x6e2f, 0xfc => 0x7f38,
+    0xfd => 0x809b, 0xfe => 0x822a,
+  },
+  0xfa => {
+    0xa1 => 0xfa08, 0xa2 => 0xfa09, 0xa3 => 0x9805, 0xa4 => 0x4ea5,
+    0xa5 => 0x5055, 0xa6 => 0x54b3, 0xa7 => 0x5793, 0xa8 => 0x595a,
+    0xa9 => 0x5b69, 0xaa => 0x5bb3, 0xab => 0x61c8, 0xac => 0x6977,
+    0xad => 0x6d77, 0xae => 0x7023, 0xaf => 0x87f9, 0xb0 => 0x89e3,
+    0xb1 => 0x8a72, 0xb2 => 0x8ae7, 0xb3 => 0x9082, 0xb4 => 0x99ed,
+    0xb5 => 0x9ab8, 0xb6 => 0x52be, 0xb7 => 0x6838, 0xb8 => 0x5016,
+    0xb9 => 0x5e78, 0xba => 0x674f, 0xbb => 0x8347, 0xbc => 0x884c,
+    0xbd => 0x4eab, 0xbe => 0x5411, 0xbf => 0x56ae, 0xc0 => 0x73e6,
+    0xc1 => 0x9115, 0xc2 => 0x97ff, 0xc3 => 0x9909, 0xc4 => 0x9957,
+    0xc5 => 0x9999, 0xc6 => 0x5653, 0xc7 => 0x589f, 0xc8 => 0x865b,
+    0xc9 => 0x8a31, 0xca => 0x61b2, 0xcb => 0x6af6, 0xcc => 0x737b,
+    0xcd => 0x8ed2, 0xce => 0x6b47, 0xcf => 0x96aa, 0xd0 => 0x9a57,
+    0xd1 => 0x5955, 0xd2 => 0x7200, 0xd3 => 0x8d6b, 0xd4 => 0x9769,
+    0xd5 => 0x4fd4, 0xd6 => 0x5cf4, 0xd7 => 0x5f26, 0xd8 => 0x61f8,
+    0xd9 => 0x665b, 0xda => 0x6ceb, 0xdb => 0x70ab, 0xdc => 0x7384,
+    0xdd => 0x73b9, 0xde => 0x73fe, 0xdf => 0x7729, 0xe0 => 0x774d,
+    0xe1 => 0x7d43, 0xe2 => 0x7d62, 0xe3 => 0x7e23, 0xe4 => 0x8237,
+    0xe5 => 0x8852, 0xe6 => 0xfa0a, 0xe7 => 0x8ce2, 0xe8 => 0x9249,
+    0xe9 => 0x986f, 0xea => 0x5b51, 0xeb => 0x7a74, 0xec => 0x8840,
+    0xed => 0x9801, 0xee => 0x5acc, 0xef => 0x4fe0, 0xf0 => 0x5354,
+    0xf1 => 0x593e, 0xf2 => 0x5cfd, 0xf3 => 0x633e, 0xf4 => 0x6d79,
+    0xf5 => 0x72f9, 0xf6 => 0x8105, 0xf7 => 0x8107, 0xf8 => 0x83a2,
+    0xf9 => 0x92cf, 0xfa => 0x9830, 0xfb => 0x4ea8, 0xfc => 0x5144,
+    0xfd => 0x5211, 0xfe => 0x578b,
+  },
+  0xfb => {
+    0xa1 => 0x5f62, 0xa2 => 0x6cc2, 0xa3 => 0x6ece, 0xa4 => 0x7005,
+    0xa5 => 0x7050, 0xa6 => 0x70af, 0xa7 => 0x7192, 0xa8 => 0x73e9,
+    0xa9 => 0x7469, 0xaa => 0x834a, 0xab => 0x87a2, 0xac => 0x8861,
+    0xad => 0x9008, 0xae => 0x90a2, 0xaf => 0x93a3, 0xb0 => 0x99a8,
+    0xb1 => 0x516e, 0xb2 => 0x5f57, 0xb3 => 0x60e0, 0xb4 => 0x6167,
+    0xb5 => 0x66b3, 0xb6 => 0x8559, 0xb7 => 0x8e4a, 0xb8 => 0x91af,
+    0xb9 => 0x978b, 0xba => 0x4e4e, 0xbb => 0x4e92, 0xbc => 0x547c,
+    0xbd => 0x58d5, 0xbe => 0x58fa, 0xbf => 0x597d, 0xc0 => 0x5cb5,
+    0xc1 => 0x5f27, 0xc2 => 0x6236, 0xc3 => 0x6248, 0xc4 => 0x660a,
+    0xc5 => 0x6667, 0xc6 => 0x6beb, 0xc7 => 0x6d69, 0xc8 => 0x6dcf,
+    0xc9 => 0x6e56, 0xca => 0x6ef8, 0xcb => 0x6f94, 0xcc => 0x6fe0,
+    0xcd => 0x6fe9, 0xce => 0x705d, 0xcf => 0x72d0, 0xd0 => 0x7425,
+    0xd1 => 0x745a, 0xd2 => 0x74e0, 0xd3 => 0x7693, 0xd4 => 0x795c,
+    0xd5 => 0x7cca, 0xd6 => 0x7e1e, 0xd7 => 0x80e1, 0xd8 => 0x82a6,
+    0xd9 => 0x846b, 0xda => 0x84bf, 0xdb => 0x864e, 0xdc => 0x865f,
+    0xdd => 0x8774, 0xde => 0x8b77, 0xdf => 0x8c6a, 0xe0 => 0x93ac,
+    0xe1 => 0x9800, 0xe2 => 0x9865, 0xe3 => 0x60d1, 0xe4 => 0x6216,
+    0xe5 => 0x9177, 0xe6 => 0x5a5a, 0xe7 => 0x660f, 0xe8 => 0x6df7,
+    0xe9 => 0x6e3e, 0xea => 0x743f, 0xeb => 0x9b42, 0xec => 0x5ffd,
+    0xed => 0x60da, 0xee => 0x7b0f, 0xef => 0x54c4, 0xf0 => 0x5f18,
+    0xf1 => 0x6c5e, 0xf2 => 0x6cd3, 0xf3 => 0x6d2a, 0xf4 => 0x70d8,
+    0xf5 => 0x7d05, 0xf6 => 0x8679, 0xf7 => 0x8a0c, 0xf8 => 0x9d3b,
+    0xf9 => 0x5316, 0xfa => 0x548c, 0xfb => 0x5b05, 0xfc => 0x6a3a,
+    0xfd => 0x706b, 0xfe => 0x7575,
+  },
+  0xfc => {
+    0xa1 => 0x798d, 0xa2 => 0x79be, 0xa3 => 0x82b1, 0xa4 => 0x83ef,
+    0xa5 => 0x8a71, 0xa6 => 0x8b41, 0xa7 => 0x8ca8, 0xa8 => 0x9774,
+    0xa9 => 0xfa0b, 0xaa => 0x64f4, 0xab => 0x652b, 0xac => 0x78ba,
+    0xad => 0x78bb, 0xae => 0x7a6b, 0xaf => 0x4e38, 0xb0 => 0x559a,
+    0xb1 => 0x5950, 0xb2 => 0x5ba6, 0xb3 => 0x5e7b, 0xb4 => 0x60a3,
+    0xb5 => 0x63db, 0xb6 => 0x6b61, 0xb7 => 0x6665, 0xb8 => 0x6853,
+    0xb9 => 0x6e19, 0xba => 0x7165, 0xbb => 0x74b0, 0xbc => 0x7d08,
+    0xbd => 0x9084, 0xbe => 0x9a69, 0xbf => 0x9c25, 0xc0 => 0x6d3b,
+    0xc1 => 0x6ed1, 0xc2 => 0x733e, 0xc3 => 0x8c41, 0xc4 => 0x95ca,
+    0xc5 => 0x51f0, 0xc6 => 0x5e4c, 0xc7 => 0x5fa8, 0xc8 => 0x604d,
+    0xc9 => 0x60f6, 0xca => 0x6130, 0xcb => 0x614c, 0xcc => 0x6643,
+    0xcd => 0x6644, 0xce => 0x69a5, 0xcf => 0x6cc1, 0xd0 => 0x6e5f,
+    0xd1 => 0x6ec9, 0xd2 => 0x6f62, 0xd3 => 0x714c, 0xd4 => 0x749c,
+    0xd5 => 0x7687, 0xd6 => 0x7bc1, 0xd7 => 0x7c27, 0xd8 => 0x8352,
+    0xd9 => 0x8757, 0xda => 0x9051, 0xdb => 0x968d, 0xdc => 0x9ec3,
+    0xdd => 0x532f, 0xde => 0x56de, 0xdf => 0x5efb, 0xe0 => 0x5f8a,
+    0xe1 => 0x6062, 0xe2 => 0x6094, 0xe3 => 0x61f7, 0xe4 => 0x6666,
+    0xe5 => 0x6703, 0xe6 => 0x6a9c, 0xe7 => 0x6dee, 0xe8 => 0x6fae,
+    0xe9 => 0x7070, 0xea => 0x736a, 0xeb => 0x7e6a, 0xec => 0x81be,
+    0xed => 0x8334, 0xee => 0x86d4, 0xef => 0x8aa8, 0xf0 => 0x8cc4,
+    0xf1 => 0x5283, 0xf2 => 0x7372, 0xf3 => 0x5b96, 0xf4 => 0x6a6b,
+    0xf5 => 0x9404, 0xf6 => 0x54ee, 0xf7 => 0x5686, 0xf8 => 0x5b5d,
+    0xf9 => 0x6548, 0xfa => 0x6585, 0xfb => 0x66c9, 0xfc => 0x689f,
+    0xfd => 0x6d8d, 0xfe => 0x6dc6,
+  },
+  0xfd => {
+    0xa1 => 0x723b, 0xa2 => 0x80b4, 0xa3 => 0x9175, 0xa4 => 0x9a4d,
+    0xa5 => 0x4faf, 0xa6 => 0x5019, 0xa7 => 0x539a, 0xa8 => 0x540e,
+    0xa9 => 0x543c, 0xaa => 0x5589, 0xab => 0x55c5, 0xac => 0x5e3f,
+    0xad => 0x5f8c, 0xae => 0x673d, 0xaf => 0x7166, 0xb0 => 0x73dd,
+    0xb1 => 0x9005, 0xb2 => 0x52db, 0xb3 => 0x52f3, 0xb4 => 0x5864,
+    0xb5 => 0x58ce, 0xb6 => 0x7104, 0xb7 => 0x718f, 0xb8 => 0x71fb,
+    0xb9 => 0x85b0, 0xba => 0x8a13, 0xbb => 0x6688, 0xbc => 0x85a8,
+    0xbd => 0x55a7, 0xbe => 0x6684, 0xbf => 0x714a, 0xc0 => 0x8431,
+    0xc1 => 0x5349, 0xc2 => 0x5599, 0xc3 => 0x6bc1, 0xc4 => 0x5f59,
+    0xc5 => 0x5fbd, 0xc6 => 0x63ee, 0xc7 => 0x6689, 0xc8 => 0x7147,
+    0xc9 => 0x8af1, 0xca => 0x8f1d, 0xcb => 0x9ebe, 0xcc => 0x4f11,
+    0xcd => 0x643a, 0xce => 0x70cb, 0xcf => 0x7566, 0xd0 => 0x8667,
+    0xd1 => 0x6064, 0xd2 => 0x8b4e, 0xd3 => 0x9df8, 0xd4 => 0x5147,
+    0xd5 => 0x51f6, 0xd6 => 0x5308, 0xd7 => 0x6d36, 0xd8 => 0x80f8,
+    0xd9 => 0x9ed1, 0xda => 0x6615, 0xdb => 0x6b23, 0xdc => 0x7098,
+    0xdd => 0x75d5, 0xde => 0x5403, 0xdf => 0x5c79, 0xe0 => 0x7d07,
+    0xe1 => 0x8a16, 0xe2 => 0x6b20, 0xe3 => 0x6b3d, 0xe4 => 0x6b46,
+    0xe5 => 0x5438, 0xe6 => 0x6070, 0xe7 => 0x6d3d, 0xe8 => 0x7fd5,
+    0xe9 => 0x8208, 0xea => 0x50d6, 0xeb => 0x51de, 0xec => 0x559c,
+    0xed => 0x566b, 0xee => 0x56cd, 0xef => 0x59ec, 0xf0 => 0x5b09,
+    0xf1 => 0x5e0c, 0xf2 => 0x6199, 0xf3 => 0x6198, 0xf4 => 0x6231,
+    0xf5 => 0x665e, 0xf6 => 0x66e6, 0xf7 => 0x7199, 0xf8 => 0x71b9,
+    0xf9 => 0x71ba, 0xfa => 0x72a7, 0xfb => 0x79a7, 0xfc => 0x7a00,
+    0xfd => 0x7fb2, 0xfe => 0x8a70,
+  },
+);
+
+1; # end
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacLatin2.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacLatin2.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacLatin2.pm	(revision 24799)
@@ -0,0 +1,44 @@
+#------------------------------------------------------------------------------
+# File:         MacLatin2.pm
+#
+# Description:  Mac Central European to Unicode
+#
+# Revisions:    2010/01/20 - P. Harvey created
+#
+# References:   1) http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/CENTEURO.TXT
+#
+# Notes:        The table omits 1-byte characters with the same values as Unicode
+#------------------------------------------------------------------------------
+use strict;
+
+%Image::ExifTool::Charset::MacLatin2 = (
+  0x80 => 0xc4, 0x81 => 0x0100, 0x82 => 0x0101, 0x83 => 0xc9, 0x84 => 0x0104,
+  0x85 => 0xd6, 0x86 => 0xdc, 0x87 => 0xe1, 0x88 => 0x0105, 0x89 => 0x010c,
+  0x8a => 0xe4, 0x8b => 0x010d, 0x8c => 0x0106, 0x8d => 0x0107, 0x8e => 0xe9,
+  0x8f => 0x0179, 0x90 => 0x017a, 0x91 => 0x010e, 0x92 => 0xed, 0x93 => 0x010f,
+  0x94 => 0x0112, 0x95 => 0x0113, 0x96 => 0x0116, 0x97 => 0xf3, 0x98 => 0x0117,
+  0x99 => 0xf4, 0x9a => 0xf6, 0x9b => 0xf5, 0x9c => 0xfa, 0x9d => 0x011a,
+  0x9e => 0x011b, 0x9f => 0xfc, 0xa0 => 0x2020, 0xa1 => 0xb0, 0xa2 => 0x0118,
+  0xa4 => 0xa7, 0xa5 => 0x2022, 0xa6 => 0xb6, 0xa7 => 0xdf, 0xa8 => 0xae,
+  0xaa => 0x2122, 0xab => 0x0119, 0xac => 0xa8, 0xad => 0x2260, 0xae => 0x0123,
+  0xaf => 0x012e, 0xb0 => 0x012f, 0xb1 => 0x012a, 0xb2 => 0x2264,
+  0xb3 => 0x2265, 0xb4 => 0x012b, 0xb5 => 0x0136, 0xb6 => 0x2202,
+  0xb7 => 0x2211, 0xb8 => 0x0142, 0xb9 => 0x013b, 0xba => 0x013c,
+  0xbb => 0x013d, 0xbc => 0x013e, 0xbd => 0x0139, 0xbe => 0x013a,
+  0xbf => 0x0145, 0xc0 => 0x0146, 0xc1 => 0x0143, 0xc2 => 0xac, 0xc3 => 0x221a,
+  0xc4 => 0x0144, 0xc5 => 0x0147, 0xc6 => 0x2206, 0xc7 => 0xab, 0xc8 => 0xbb,
+  0xc9 => 0x2026, 0xca => 0xa0, 0xcb => 0x0148, 0xcc => 0x0150, 0xcd => 0xd5,
+  0xce => 0x0151, 0xcf => 0x014c, 0xd0 => 0x2013, 0xd1 => 0x2014,
+  0xd2 => 0x201c, 0xd3 => 0x201d, 0xd4 => 0x2018, 0xd5 => 0x2019, 0xd6 => 0xf7,
+  0xd7 => 0x25ca, 0xd8 => 0x014d, 0xd9 => 0x0154, 0xda => 0x0155,
+  0xdb => 0x0158, 0xdc => 0x2039, 0xdd => 0x203a, 0xde => 0x0159,
+  0xdf => 0x0156, 0xe0 => 0x0157, 0xe1 => 0x0160, 0xe2 => 0x201a,
+  0xe3 => 0x201e, 0xe4 => 0x0161, 0xe5 => 0x015a, 0xe6 => 0x015b, 0xe7 => 0xc1,
+  0xe8 => 0x0164, 0xe9 => 0x0165, 0xea => 0xcd, 0xeb => 0x017d, 0xec => 0x017e,
+  0xed => 0x016a, 0xee => 0xd3, 0xef => 0xd4, 0xf0 => 0x016b, 0xf1 => 0x016e,
+  0xf2 => 0xda, 0xf3 => 0x016f, 0xf4 => 0x0170, 0xf5 => 0x0171, 0xf6 => 0x0172,
+  0xf7 => 0x0173, 0xf8 => 0xdd, 0xf9 => 0xfd, 0xfa => 0x0137, 0xfb => 0x017b,
+  0xfc => 0x0141, 0xfd => 0x017c, 0xfe => 0x0122, 0xff => 0x02c7,
+);
+
+1; # end
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacRSymbol.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacRSymbol.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacRSymbol.pm	(revision 24799)
@@ -0,0 +1,2087 @@
+#------------------------------------------------------------------------------
+# File:         MacRSymbol.pm
+#
+# Description:  Mac RSymbol (cp10008) to Unicode
+#
+# Revisions:    2010/01/20 - P. Harvey created
+#
+# References:   1) http://www.haible.de/bruno/charsets/conversion-tables/GB2312.tar.bz2
+#
+# Notes:        The table omits 1-byte characters with the same values as Unicode
+#------------------------------------------------------------------------------
+use strict;
+
+%Image::ExifTool::Charset::MacRSymbol = (
+  0x81 => 0xf8d8, 0x82 => 0xf8d9, 0x83 => 0xf8da, 0x84 => 0xf8db,
+  0x85 => 0xf8dc, 0x86 => 0xf8dd, 0x87 => 0xf8de, 0x88 => 0xf8df,
+  0x89 => 0xf8e0, 0x8a => 0xf8e1, 0x8b => 0xf8e2, 0x8c => 0xf8e3,
+  0x8d => 0xf8e4, 0x8e => 0xf8e5, 0x8f => 0xf8e6, 0x90 => 0xf8e7,
+  0x91 => 0xf8e8, 0x92 => 0xf8e9, 0x93 => 0xf8ea, 0x94 => 0xf8eb,
+  0x95 => 0xf8ec, 0x96 => 0xf8ed, 0x97 => 0xf8ee, 0x98 => 0xf8ef,
+  0x99 => 0xf8f0, 0x9a => 0xf8f1, 0x9b => 0xf8f2, 0x9c => 0xf8f3,
+  0x9d => 0xf8f4, 0x9e => 0xf8f5, 0x9f => 0xf8f6, 0xa0 => 0xf8f7,
+  0xa1 => {
+    0xa1 => 0x3000, 0xa2 => 0x3001, 0xa3 => 0x3002, 0xa4 => 0x30fb,
+    0xa5 => 0x02c9, 0xa6 => 0x02c7, 0xa7 => 0xa8, 0xa8 => 0x3003,
+    0xa9 => 0x3005, 0xaa => 0x2015, 0xab => 0xff5e, 0xad => 0x2026,
+    0xae => 0x2018, 0xaf => 0x2019, 0xb0 => 0x201c, 0xb1 => 0x201d,
+    0xb2 => 0x3014, 0xb3 => 0x3015, 0xb4 => 0x3008, 0xb5 => 0x3009,
+    0xb6 => 0x300a, 0xb7 => 0x300b, 0xb8 => 0x300c, 0xb9 => 0x300d,
+    0xba => 0x300e, 0xbb => 0x300f, 0xbc => 0x3016, 0xbd => 0x3017,
+    0xbe => 0x3010, 0xbf => 0x3011, 0xc0 => 0xb1, 0xc1 => 0xd7, 0xc2 => 0xf7,
+    0xc3 => 0x2236, 0xc4 => 0x2227, 0xc5 => 0x2228, 0xc6 => 0x2211,
+    0xc7 => 0x220f, 0xc8 => 0x222a, 0xc9 => 0x2229, 0xca => 0x2208,
+    0xcb => 0x2237, 0xcc => 0x221a, 0xcd => 0x22a5, 0xce => 0x2225,
+    0xcf => 0x2220, 0xd0 => 0x2312, 0xd1 => 0x2299, 0xd2 => 0x222b,
+    0xd3 => 0x222e, 0xd4 => 0x2261, 0xd5 => 0x224c, 0xd6 => 0x2248,
+    0xd7 => 0x223d, 0xd8 => 0x221d, 0xd9 => 0x2260, 0xda => 0x226e,
+    0xdb => 0x226f, 0xdc => 0x2264, 0xdd => 0x2265, 0xde => 0x221e,
+    0xdf => 0x2235, 0xe0 => 0x2234, 0xe1 => 0x2642, 0xe2 => 0x2640,
+    0xe3 => 0xb0, 0xe4 => 0x2032, 0xe5 => 0x2033, 0xe6 => 0x2103,
+    0xe7 => 0xff04, 0xe8 => 0xa4, 0xe9 => 0xffe0, 0xea => 0xffe1,
+    0xeb => 0x2030, 0xec => 0xa7, 0xed => 0x2116, 0xee => 0x2606,
+    0xef => 0x2605, 0xf0 => 0x25cb, 0xf1 => 0x25cf, 0xf2 => 0x25ce,
+    0xf3 => 0x25c7, 0xf4 => 0x25c6, 0xf5 => 0x25a1, 0xf6 => 0x25a0,
+    0xf7 => 0x25b3, 0xf8 => 0x25b2, 0xf9 => 0x203b, 0xfa => 0x2192,
+    0xfb => 0x2190, 0xfc => 0x2191, 0xfd => 0x2193, 0xfe => 0x3013,
+  },
+  0xa2 => {
+    0xb1 => 0x2488, 0xb2 => 0x2489, 0xb3 => 0x248a, 0xb4 => 0x248b,
+    0xb5 => 0x248c, 0xb6 => 0x248d, 0xb7 => 0x248e, 0xb8 => 0x248f,
+    0xb9 => 0x2490, 0xba => 0x2491, 0xbb => 0x2492, 0xbc => 0x2493,
+    0xbd => 0x2494, 0xbe => 0x2495, 0xbf => 0x2496, 0xc0 => 0x2497,
+    0xc1 => 0x2498, 0xc2 => 0x2499, 0xc3 => 0x249a, 0xc4 => 0x249b,
+    0xc5 => 0x2474, 0xc6 => 0x2475, 0xc7 => 0x2476, 0xc8 => 0x2477,
+    0xc9 => 0x2478, 0xca => 0x2479, 0xcb => 0x247a, 0xcc => 0x247b,
+    0xcd => 0x247c, 0xce => 0x247d, 0xcf => 0x247e, 0xd0 => 0x247f,
+    0xd1 => 0x2480, 0xd2 => 0x2481, 0xd3 => 0x2482, 0xd4 => 0x2483,
+    0xd5 => 0x2484, 0xd6 => 0x2485, 0xd7 => 0x2486, 0xd8 => 0x2487,
+    0xd9 => 0x2460, 0xda => 0x2461, 0xdb => 0x2462, 0xdc => 0x2463,
+    0xdd => 0x2464, 0xde => 0x2465, 0xdf => 0x2466, 0xe0 => 0x2467,
+    0xe1 => 0x2468, 0xe2 => 0x2469, 0xe5 => 0x3220, 0xe6 => 0x3221,
+    0xe7 => 0x3222, 0xe8 => 0x3223, 0xe9 => 0x3224, 0xea => 0x3225,
+    0xeb => 0x3226, 0xec => 0x3227, 0xed => 0x3228, 0xee => 0x3229,
+    0xf1 => 0x2160, 0xf2 => 0x2161, 0xf3 => 0x2162, 0xf4 => 0x2163,
+    0xf5 => 0x2164, 0xf6 => 0x2165, 0xf7 => 0x2166, 0xf8 => 0x2167,
+    0xf9 => 0x2168, 0xfa => 0x2169, 0xfb => 0x216a, 0xfc => 0x216b,
+  },
+  0xa3 => {
+    0xa1 => 0xff01, 0xa2 => 0xff02, 0xa3 => 0xff03, 0xa4 => 0xffe5,
+    0xa5 => 0xff05, 0xa6 => 0xff06, 0xa7 => 0xff07, 0xa8 => 0xff08,
+    0xa9 => 0xff09, 0xaa => 0xff0a, 0xab => 0xff0b, 0xac => 0xff0c,
+    0xad => 0xff0d, 0xae => 0xff0e, 0xaf => 0xff0f, 0xb0 => 0xff10,
+    0xb1 => 0xff11, 0xb2 => 0xff12, 0xb3 => 0xff13, 0xb4 => 0xff14,
+    0xb5 => 0xff15, 0xb6 => 0xff16, 0xb7 => 0xff17, 0xb8 => 0xff18,
+    0xb9 => 0xff19, 0xba => 0xff1a, 0xbb => 0xff1b, 0xbc => 0xff1c,
+    0xbd => 0xff1d, 0xbe => 0xff1e, 0xbf => 0xff1f, 0xc0 => 0xff20,
+    0xc1 => 0xff21, 0xc2 => 0xff22, 0xc3 => 0xff23, 0xc4 => 0xff24,
+    0xc5 => 0xff25, 0xc6 => 0xff26, 0xc7 => 0xff27, 0xc8 => 0xff28,
+    0xc9 => 0xff29, 0xca => 0xff2a, 0xcb => 0xff2b, 0xcc => 0xff2c,
+    0xcd => 0xff2d, 0xce => 0xff2e, 0xcf => 0xff2f, 0xd0 => 0xff30,
+    0xd1 => 0xff31, 0xd2 => 0xff32, 0xd3 => 0xff33, 0xd4 => 0xff34,
+    0xd5 => 0xff35, 0xd6 => 0xff36, 0xd7 => 0xff37, 0xd8 => 0xff38,
+    0xd9 => 0xff39, 0xda => 0xff3a, 0xdb => 0xff3b, 0xdc => 0xff3c,
+    0xdd => 0xff3d, 0xde => 0xff3e, 0xdf => 0xff3f, 0xe0 => 0xff40,
+    0xe1 => 0xff41, 0xe2 => 0xff42, 0xe3 => 0xff43, 0xe4 => 0xff44,
+    0xe5 => 0xff45, 0xe6 => 0xff46, 0xe7 => 0xff47, 0xe8 => 0xff48,
+    0xe9 => 0xff49, 0xea => 0xff4a, 0xeb => 0xff4b, 0xec => 0xff4c,
+    0xed => 0xff4d, 0xee => 0xff4e, 0xef => 0xff4f, 0xf0 => 0xff50,
+    0xf1 => 0xff51, 0xf2 => 0xff52, 0xf3 => 0xff53, 0xf4 => 0xff54,
+    0xf5 => 0xff55, 0xf6 => 0xff56, 0xf7 => 0xff57, 0xf8 => 0xff58,
+    0xf9 => 0xff59, 0xfa => 0xff5a, 0xfb => 0xff5b, 0xfc => 0xff5c,
+    0xfd => 0xff5d, 0xfe => 0xffe3,
+  },
+  0xa4 => {
+    0xa1 => 0x3041, 0xa2 => 0x3042, 0xa3 => 0x3043, 0xa4 => 0x3044,
+    0xa5 => 0x3045, 0xa6 => 0x3046, 0xa7 => 0x3047, 0xa8 => 0x3048,
+    0xa9 => 0x3049, 0xaa => 0x304a, 0xab => 0x304b, 0xac => 0x304c,
+    0xad => 0x304d, 0xae => 0x304e, 0xaf => 0x304f, 0xb0 => 0x3050,
+    0xb1 => 0x3051, 0xb2 => 0x3052, 0xb3 => 0x3053, 0xb4 => 0x3054,
+    0xb5 => 0x3055, 0xb6 => 0x3056, 0xb7 => 0x3057, 0xb8 => 0x3058,
+    0xb9 => 0x3059, 0xba => 0x305a, 0xbb => 0x305b, 0xbc => 0x305c,
+    0xbd => 0x305d, 0xbe => 0x305e, 0xbf => 0x305f, 0xc0 => 0x3060,
+    0xc1 => 0x3061, 0xc2 => 0x3062, 0xc3 => 0x3063, 0xc4 => 0x3064,
+    0xc5 => 0x3065, 0xc6 => 0x3066, 0xc7 => 0x3067, 0xc8 => 0x3068,
+    0xc9 => 0x3069, 0xca => 0x306a, 0xcb => 0x306b, 0xcc => 0x306c,
+    0xcd => 0x306d, 0xce => 0x306e, 0xcf => 0x306f, 0xd0 => 0x3070,
+    0xd1 => 0x3071, 0xd2 => 0x3072, 0xd3 => 0x3073, 0xd4 => 0x3074,
+    0xd5 => 0x3075, 0xd6 => 0x3076, 0xd7 => 0x3077, 0xd8 => 0x3078,
+    0xd9 => 0x3079, 0xda => 0x307a, 0xdb => 0x307b, 0xdc => 0x307c,
+    0xdd => 0x307d, 0xde => 0x307e, 0xdf => 0x307f, 0xe0 => 0x3080,
+    0xe1 => 0x3081, 0xe2 => 0x3082, 0xe3 => 0x3083, 0xe4 => 0x3084,
+    0xe5 => 0x3085, 0xe6 => 0x3086, 0xe7 => 0x3087, 0xe8 => 0x3088,
+    0xe9 => 0x3089, 0xea => 0x308a, 0xeb => 0x308b, 0xec => 0x308c,
+    0xed => 0x308d, 0xee => 0x308e, 0xef => 0x308f, 0xf0 => 0x3090,
+    0xf1 => 0x3091, 0xf2 => 0x3092, 0xf3 => 0x3093,
+  },
+  0xa5 => {
+    0xa1 => 0x30a1, 0xa2 => 0x30a2, 0xa3 => 0x30a3, 0xa4 => 0x30a4,
+    0xa5 => 0x30a5, 0xa6 => 0x30a6, 0xa7 => 0x30a7, 0xa8 => 0x30a8,
+    0xa9 => 0x30a9, 0xaa => 0x30aa, 0xab => 0x30ab, 0xac => 0x30ac,
+    0xad => 0x30ad, 0xae => 0x30ae, 0xaf => 0x30af, 0xb0 => 0x30b0,
+    0xb1 => 0x30b1, 0xb2 => 0x30b2, 0xb3 => 0x30b3, 0xb4 => 0x30b4,
+    0xb5 => 0x30b5, 0xb6 => 0x30b6, 0xb7 => 0x30b7, 0xb8 => 0x30b8,
+    0xb9 => 0x30b9, 0xba => 0x30ba, 0xbb => 0x30bb, 0xbc => 0x30bc,
+    0xbd => 0x30bd, 0xbe => 0x30be, 0xbf => 0x30bf, 0xc0 => 0x30c0,
+    0xc1 => 0x30c1, 0xc2 => 0x30c2, 0xc3 => 0x30c3, 0xc4 => 0x30c4,
+    0xc5 => 0x30c5, 0xc6 => 0x30c6, 0xc7 => 0x30c7, 0xc8 => 0x30c8,
+    0xc9 => 0x30c9, 0xca => 0x30ca, 0xcb => 0x30cb, 0xcc => 0x30cc,
+    0xcd => 0x30cd, 0xce => 0x30ce, 0xcf => 0x30cf, 0xd0 => 0x30d0,
+    0xd1 => 0x30d1, 0xd2 => 0x30d2, 0xd3 => 0x30d3, 0xd4 => 0x30d4,
+    0xd5 => 0x30d5, 0xd6 => 0x30d6, 0xd7 => 0x30d7, 0xd8 => 0x30d8,
+    0xd9 => 0x30d9, 0xda => 0x30da, 0xdb => 0x30db, 0xdc => 0x30dc,
+    0xdd => 0x30dd, 0xde => 0x30de, 0xdf => 0x30df, 0xe0 => 0x30e0,
+    0xe1 => 0x30e1, 0xe2 => 0x30e2, 0xe3 => 0x30e3, 0xe4 => 0x30e4,
+    0xe5 => 0x30e5, 0xe6 => 0x30e6, 0xe7 => 0x30e7, 0xe8 => 0x30e8,
+    0xe9 => 0x30e9, 0xea => 0x30ea, 0xeb => 0x30eb, 0xec => 0x30ec,
+    0xed => 0x30ed, 0xee => 0x30ee, 0xef => 0x30ef, 0xf0 => 0x30f0,
+    0xf1 => 0x30f1, 0xf2 => 0x30f2, 0xf3 => 0x30f3, 0xf4 => 0x30f4,
+    0xf5 => 0x30f5, 0xf6 => 0x30f6,
+  },
+  0xa6 => {
+    0xa1 => 0x0391, 0xa2 => 0x0392, 0xa3 => 0x0393, 0xa4 => 0x0394,
+    0xa5 => 0x0395, 0xa6 => 0x0396, 0xa7 => 0x0397, 0xa8 => 0x0398,
+    0xa9 => 0x0399, 0xaa => 0x039a, 0xab => 0x039b, 0xac => 0x039c,
+    0xad => 0x039d, 0xae => 0x039e, 0xaf => 0x039f, 0xb0 => 0x03a0,
+    0xb1 => 0x03a1, 0xb2 => 0x03a3, 0xb3 => 0x03a4, 0xb4 => 0x03a5,
+    0xb5 => 0x03a6, 0xb6 => 0x03a7, 0xb7 => 0x03a8, 0xb8 => 0x03a9,
+    0xc1 => 0x03b1, 0xc2 => 0x03b2, 0xc3 => 0x03b3, 0xc4 => 0x03b4,
+    0xc5 => 0x03b5, 0xc6 => 0x03b6, 0xc7 => 0x03b7, 0xc8 => 0x03b8,
+    0xc9 => 0x03b9, 0xca => 0x03ba, 0xcb => 0x03bb, 0xcc => 0x03bc,
+    0xcd => 0x03bd, 0xce => 0x03be, 0xcf => 0x03bf, 0xd0 => 0x03c0,
+    0xd1 => 0x03c1, 0xd2 => 0x03c3, 0xd3 => 0x03c4, 0xd4 => 0x03c5,
+    0xd5 => 0x03c6, 0xd6 => 0x03c7, 0xd7 => 0x03c8, 0xd8 => 0x03c9,
+  },
+  0xa7 => {
+    0xa1 => 0x0410, 0xa2 => 0x0411, 0xa3 => 0x0412, 0xa4 => 0x0413,
+    0xa5 => 0x0414, 0xa6 => 0x0415, 0xa7 => 0x0401, 0xa8 => 0x0416,
+    0xa9 => 0x0417, 0xaa => 0x0418, 0xab => 0x0419, 0xac => 0x041a,
+    0xad => 0x041b, 0xae => 0x041c, 0xaf => 0x041d, 0xb0 => 0x041e,
+    0xb1 => 0x041f, 0xb2 => 0x0420, 0xb3 => 0x0421, 0xb4 => 0x0422,
+    0xb5 => 0x0423, 0xb6 => 0x0424, 0xb7 => 0x0425, 0xb8 => 0x0426,
+    0xb9 => 0x0427, 0xba => 0x0428, 0xbb => 0x0429, 0xbc => 0x042a,
+    0xbd => 0x042b, 0xbe => 0x042c, 0xbf => 0x042d, 0xc0 => 0x042e,
+    0xc1 => 0x042f, 0xd1 => 0x0430, 0xd2 => 0x0431, 0xd3 => 0x0432,
+    0xd4 => 0x0433, 0xd5 => 0x0434, 0xd6 => 0x0435, 0xd7 => 0x0451,
+    0xd8 => 0x0436, 0xd9 => 0x0437, 0xda => 0x0438, 0xdb => 0x0439,
+    0xdc => 0x043a, 0xdd => 0x043b, 0xde => 0x043c, 0xdf => 0x043d,
+    0xe0 => 0x043e, 0xe1 => 0x043f, 0xe2 => 0x0440, 0xe3 => 0x0441,
+    0xe4 => 0x0442, 0xe5 => 0x0443, 0xe6 => 0x0444, 0xe7 => 0x0445,
+    0xe8 => 0x0446, 0xe9 => 0x0447, 0xea => 0x0448, 0xeb => 0x0449,
+    0xec => 0x044a, 0xed => 0x044b, 0xee => 0x044c, 0xef => 0x044d,
+    0xf0 => 0x044e, 0xf1 => 0x044f,
+  },
+  0xa8 => {
+    0xa1 => 0x0101, 0xa2 => 0xe1, 0xa3 => 0x01ce, 0xa4 => 0xe0, 0xa5 => 0x0113,
+    0xa6 => 0xe9, 0xa7 => 0x011b, 0xa8 => 0xe8, 0xa9 => 0x012b, 0xaa => 0xed,
+    0xab => 0x01d0, 0xac => 0xec, 0xad => 0x014d, 0xae => 0xf3, 0xaf => 0x01d2,
+    0xb0 => 0xf2, 0xb1 => 0x016b, 0xb2 => 0xfa, 0xb3 => 0x01d4, 0xb4 => 0xf9,
+    0xb5 => 0x01d6, 0xb6 => 0x01d8, 0xb7 => 0x01da, 0xb8 => 0x01dc,
+    0xb9 => 0xfc, 0xba => 0xea, 0xc5 => 0x3105, 0xc6 => 0x3106, 0xc7 => 0x3107,
+    0xc8 => 0x3108, 0xc9 => 0x3109, 0xca => 0x310a, 0xcb => 0x310b,
+    0xcc => 0x310c, 0xcd => 0x310d, 0xce => 0x310e, 0xcf => 0x310f,
+    0xd0 => 0x3110, 0xd1 => 0x3111, 0xd2 => 0x3112, 0xd3 => 0x3113,
+    0xd4 => 0x3114, 0xd5 => 0x3115, 0xd6 => 0x3116, 0xd7 => 0x3117,
+    0xd8 => 0x3118, 0xd9 => 0x3119, 0xda => 0x311a, 0xdb => 0x311b,
+    0xdc => 0x311c, 0xdd => 0x311d, 0xde => 0x311e, 0xdf => 0x311f,
+    0xe0 => 0x3120, 0xe1 => 0x3121, 0xe2 => 0x3122, 0xe3 => 0x3123,
+    0xe4 => 0x3124, 0xe5 => 0x3125, 0xe6 => 0x3126, 0xe7 => 0x3127,
+    0xe8 => 0x3128, 0xe9 => 0x3129,
+  },
+  0xa9 => {
+    0xa4 => 0x2500, 0xa5 => 0x2501, 0xa6 => 0x2502, 0xa7 => 0x2503,
+    0xa8 => 0x2504, 0xa9 => 0x2505, 0xaa => 0x2506, 0xab => 0x2507,
+    0xac => 0x2508, 0xad => 0x2509, 0xae => 0x250a, 0xaf => 0x250b,
+    0xb0 => 0x250c, 0xb1 => 0x250d, 0xb2 => 0x250e, 0xb3 => 0x250f,
+    0xb4 => 0x2510, 0xb5 => 0x2511, 0xb6 => 0x2512, 0xb7 => 0x2513,
+    0xb8 => 0x2514, 0xb9 => 0x2515, 0xba => 0x2516, 0xbb => 0x2517,
+    0xbc => 0x2518, 0xbd => 0x2519, 0xbe => 0x251a, 0xbf => 0x251b,
+    0xc0 => 0x251c, 0xc1 => 0x251d, 0xc2 => 0x251e, 0xc3 => 0x251f,
+    0xc4 => 0x2520, 0xc5 => 0x2521, 0xc6 => 0x2522, 0xc7 => 0x2523,
+    0xc8 => 0x2524, 0xc9 => 0x2525, 0xca => 0x2526, 0xcb => 0x2527,
+    0xcc => 0x2528, 0xcd => 0x2529, 0xce => 0x252a, 0xcf => 0x252b,
+    0xd0 => 0x252c, 0xd1 => 0x252d, 0xd2 => 0x252e, 0xd3 => 0x252f,
+    0xd4 => 0x2530, 0xd5 => 0x2531, 0xd6 => 0x2532, 0xd7 => 0x2533,
+    0xd8 => 0x2534, 0xd9 => 0x2535, 0xda => 0x2536, 0xdb => 0x2537,
+    0xdc => 0x2538, 0xdd => 0x2539, 0xde => 0x253a, 0xdf => 0x253b,
+    0xe0 => 0x253c, 0xe1 => 0x253d, 0xe2 => 0x253e, 0xe3 => 0x253f,
+    0xe4 => 0x2540, 0xe5 => 0x2541, 0xe6 => 0x2542, 0xe7 => 0x2543,
+    0xe8 => 0x2544, 0xe9 => 0x2545, 0xea => 0x2546, 0xeb => 0x2547,
+    0xec => 0x2548, 0xed => 0x2549, 0xee => 0x254a, 0xef => 0x254b,
+  },
+  0xb0 => {
+    0xa1 => 0x554a, 0xa2 => 0x963f, 0xa3 => 0x57c3, 0xa4 => 0x6328,
+    0xa5 => 0x54ce, 0xa6 => 0x5509, 0xa7 => 0x54c0, 0xa8 => 0x7691,
+    0xa9 => 0x764c, 0xaa => 0x853c, 0xab => 0x77ee, 0xac => 0x827e,
+    0xad => 0x788d, 0xae => 0x7231, 0xaf => 0x9698, 0xb0 => 0x978d,
+    0xb1 => 0x6c28, 0xb2 => 0x5b89, 0xb3 => 0x4ffa, 0xb4 => 0x6309,
+    0xb5 => 0x6697, 0xb6 => 0x5cb8, 0xb7 => 0x80fa, 0xb8 => 0x6848,
+    0xb9 => 0x80ae, 0xba => 0x6602, 0xbb => 0x76ce, 0xbc => 0x51f9,
+    0xbd => 0x6556, 0xbe => 0x71ac, 0xbf => 0x7ff1, 0xc0 => 0x8884,
+    0xc1 => 0x50b2, 0xc2 => 0x5965, 0xc3 => 0x61ca, 0xc4 => 0x6fb3,
+    0xc5 => 0x82ad, 0xc6 => 0x634c, 0xc7 => 0x6252, 0xc8 => 0x53ed,
+    0xc9 => 0x5427, 0xca => 0x7b06, 0xcb => 0x516b, 0xcc => 0x75a4,
+    0xcd => 0x5df4, 0xce => 0x62d4, 0xcf => 0x8dcb, 0xd0 => 0x9776,
+    0xd1 => 0x628a, 0xd2 => 0x8019, 0xd3 => 0x575d, 0xd4 => 0x9738,
+    0xd5 => 0x7f62, 0xd6 => 0x7238, 0xd7 => 0x767d, 0xd8 => 0x67cf,
+    0xd9 => 0x767e, 0xda => 0x6446, 0xdb => 0x4f70, 0xdc => 0x8d25,
+    0xdd => 0x62dc, 0xde => 0x7a17, 0xdf => 0x6591, 0xe0 => 0x73ed,
+    0xe1 => 0x642c, 0xe2 => 0x6273, 0xe3 => 0x822c, 0xe4 => 0x9881,
+    0xe5 => 0x677f, 0xe6 => 0x7248, 0xe7 => 0x626e, 0xe8 => 0x62cc,
+    0xe9 => 0x4f34, 0xea => 0x74e3, 0xeb => 0x534a, 0xec => 0x529e,
+    0xed => 0x7eca, 0xee => 0x90a6, 0xef => 0x5e2e, 0xf0 => 0x6886,
+    0xf1 => 0x699c, 0xf2 => 0x8180, 0xf3 => 0x7ed1, 0xf4 => 0x68d2,
+    0xf5 => 0x78c5, 0xf6 => 0x868c, 0xf7 => 0x9551, 0xf8 => 0x508d,
+    0xf9 => 0x8c24, 0xfa => 0x82de, 0xfb => 0x80de, 0xfc => 0x5305,
+    0xfd => 0x8912, 0xfe => 0x5265,
+  },
+  0xb1 => {
+    0xa1 => 0x8584, 0xa2 => 0x96f9, 0xa3 => 0x4fdd, 0xa4 => 0x5821,
+    0xa5 => 0x9971, 0xa6 => 0x5b9d, 0xa7 => 0x62b1, 0xa8 => 0x62a5,
+    0xa9 => 0x66b4, 0xaa => 0x8c79, 0xab => 0x9c8d, 0xac => 0x7206,
+    0xad => 0x676f, 0xae => 0x7891, 0xaf => 0x60b2, 0xb0 => 0x5351,
+    0xb1 => 0x5317, 0xb2 => 0x8f88, 0xb3 => 0x80cc, 0xb4 => 0x8d1d,
+    0xb5 => 0x94a1, 0xb6 => 0x500d, 0xb7 => 0x72c8, 0xb8 => 0x5907,
+    0xb9 => 0x60eb, 0xba => 0x7119, 0xbb => 0x88ab, 0xbc => 0x5954,
+    0xbd => 0x82ef, 0xbe => 0x672c, 0xbf => 0x7b28, 0xc0 => 0x5d29,
+    0xc1 => 0x7ef7, 0xc2 => 0x752d, 0xc3 => 0x6cf5, 0xc4 => 0x8e66,
+    0xc5 => 0x8ff8, 0xc6 => 0x903c, 0xc7 => 0x9f3b, 0xc8 => 0x6bd4,
+    0xc9 => 0x9119, 0xca => 0x7b14, 0xcb => 0x5f7c, 0xcc => 0x78a7,
+    0xcd => 0x84d6, 0xce => 0x853d, 0xcf => 0x6bd5, 0xd0 => 0x6bd9,
+    0xd1 => 0x6bd6, 0xd2 => 0x5e01, 0xd3 => 0x5e87, 0xd4 => 0x75f9,
+    0xd5 => 0x95ed, 0xd6 => 0x655d, 0xd7 => 0x5f0a, 0xd8 => 0x5fc5,
+    0xd9 => 0x8f9f, 0xda => 0x58c1, 0xdb => 0x81c2, 0xdc => 0x907f,
+    0xdd => 0x965b, 0xde => 0x97ad, 0xdf => 0x8fb9, 0xe0 => 0x7f16,
+    0xe1 => 0x8d2c, 0xe2 => 0x6241, 0xe3 => 0x4fbf, 0xe4 => 0x53d8,
+    0xe5 => 0x535e, 0xe6 => 0x8fa8, 0xe7 => 0x8fa9, 0xe8 => 0x8fab,
+    0xe9 => 0x904d, 0xea => 0x6807, 0xeb => 0x5f6a, 0xec => 0x8198,
+    0xed => 0x8868, 0xee => 0x9cd6, 0xef => 0x618b, 0xf0 => 0x522b,
+    0xf1 => 0x762a, 0xf2 => 0x5f6c, 0xf3 => 0x658c, 0xf4 => 0x6fd2,
+    0xf5 => 0x6ee8, 0xf6 => 0x5bbe, 0xf7 => 0x6448, 0xf8 => 0x5175,
+    0xf9 => 0x51b0, 0xfa => 0x67c4, 0xfb => 0x4e19, 0xfc => 0x79c9,
+    0xfd => 0x997c, 0xfe => 0x70b3,
+  },
+  0xb2 => {
+    0xa1 => 0x75c5, 0xa2 => 0x5e76, 0xa3 => 0x73bb, 0xa4 => 0x83e0,
+    0xa5 => 0x64ad, 0xa6 => 0x62e8, 0xa7 => 0x94b5, 0xa8 => 0x6ce2,
+    0xa9 => 0x535a, 0xaa => 0x52c3, 0xab => 0x640f, 0xac => 0x94c2,
+    0xad => 0x7b94, 0xae => 0x4f2f, 0xaf => 0x5e1b, 0xb0 => 0x8236,
+    0xb1 => 0x8116, 0xb2 => 0x818a, 0xb3 => 0x6e24, 0xb4 => 0x6cca,
+    0xb5 => 0x9a73, 0xb6 => 0x6355, 0xb7 => 0x535c, 0xb8 => 0x54fa,
+    0xb9 => 0x8865, 0xba => 0x57e0, 0xbb => 0x4e0d, 0xbc => 0x5e03,
+    0xbd => 0x6b65, 0xbe => 0x7c3f, 0xbf => 0x90e8, 0xc0 => 0x6016,
+    0xc1 => 0x64e6, 0xc2 => 0x731c, 0xc3 => 0x88c1, 0xc4 => 0x6750,
+    0xc5 => 0x624d, 0xc6 => 0x8d22, 0xc7 => 0x776c, 0xc8 => 0x8e29,
+    0xc9 => 0x91c7, 0xca => 0x5f69, 0xcb => 0x83dc, 0xcc => 0x8521,
+    0xcd => 0x9910, 0xce => 0x53c2, 0xcf => 0x8695, 0xd0 => 0x6b8b,
+    0xd1 => 0x60ed, 0xd2 => 0x60e8, 0xd3 => 0x707f, 0xd4 => 0x82cd,
+    0xd5 => 0x8231, 0xd6 => 0x4ed3, 0xd7 => 0x6ca7, 0xd8 => 0x85cf,
+    0xd9 => 0x64cd, 0xda => 0x7cd9, 0xdb => 0x69fd, 0xdc => 0x66f9,
+    0xdd => 0x8349, 0xde => 0x5395, 0xdf => 0x7b56, 0xe0 => 0x4fa7,
+    0xe1 => 0x518c, 0xe2 => 0x6d4b, 0xe3 => 0x5c42, 0xe4 => 0x8e6d,
+    0xe5 => 0x63d2, 0xe6 => 0x53c9, 0xe7 => 0x832c, 0xe8 => 0x8336,
+    0xe9 => 0x67e5, 0xea => 0x78b4, 0xeb => 0x643d, 0xec => 0x5bdf,
+    0xed => 0x5c94, 0xee => 0x5dee, 0xef => 0x8be7, 0xf0 => 0x62c6,
+    0xf1 => 0x67f4, 0xf2 => 0x8c7a, 0xf3 => 0x6400, 0xf4 => 0x63ba,
+    0xf5 => 0x8749, 0xf6 => 0x998b, 0xf7 => 0x8c17, 0xf8 => 0x7f20,
+    0xf9 => 0x94f2, 0xfa => 0x4ea7, 0xfb => 0x9610, 0xfc => 0x98a4,
+    0xfd => 0x660c, 0xfe => 0x7316,
+  },
+  0xb3 => {
+    0xa1 => 0x573a, 0xa2 => 0x5c1d, 0xa3 => 0x5e38, 0xa4 => 0x957f,
+    0xa5 => 0x507f, 0xa6 => 0x80a0, 0xa7 => 0x5382, 0xa8 => 0x655e,
+    0xa9 => 0x7545, 0xaa => 0x5531, 0xab => 0x5021, 0xac => 0x8d85,
+    0xad => 0x6284, 0xae => 0x949e, 0xaf => 0x671d, 0xb0 => 0x5632,
+    0xb1 => 0x6f6e, 0xb2 => 0x5de2, 0xb3 => 0x5435, 0xb4 => 0x7092,
+    0xb5 => 0x8f66, 0xb6 => 0x626f, 0xb7 => 0x64a4, 0xb8 => 0x63a3,
+    0xb9 => 0x5f7b, 0xba => 0x6f88, 0xbb => 0x90f4, 0xbc => 0x81e3,
+    0xbd => 0x8fb0, 0xbe => 0x5c18, 0xbf => 0x6668, 0xc0 => 0x5ff1,
+    0xc1 => 0x6c89, 0xc2 => 0x9648, 0xc3 => 0x8d81, 0xc4 => 0x886c,
+    0xc5 => 0x6491, 0xc6 => 0x79f0, 0xc7 => 0x57ce, 0xc8 => 0x6a59,
+    0xc9 => 0x6210, 0xca => 0x5448, 0xcb => 0x4e58, 0xcc => 0x7a0b,
+    0xcd => 0x60e9, 0xce => 0x6f84, 0xcf => 0x8bda, 0xd0 => 0x627f,
+    0xd1 => 0x901e, 0xd2 => 0x9a8b, 0xd3 => 0x79e4, 0xd4 => 0x5403,
+    0xd5 => 0x75f4, 0xd6 => 0x6301, 0xd7 => 0x5319, 0xd8 => 0x6c60,
+    0xd9 => 0x8fdf, 0xda => 0x5f1b, 0xdb => 0x9a70, 0xdc => 0x803b,
+    0xdd => 0x9f7f, 0xde => 0x4f88, 0xdf => 0x5c3a, 0xe0 => 0x8d64,
+    0xe1 => 0x7fc5, 0xe2 => 0x65a5, 0xe3 => 0x70bd, 0xe4 => 0x5145,
+    0xe5 => 0x51b2, 0xe6 => 0x866b, 0xe7 => 0x5d07, 0xe8 => 0x5ba0,
+    0xe9 => 0x62bd, 0xea => 0x916c, 0xeb => 0x7574, 0xec => 0x8e0c,
+    0xed => 0x7a20, 0xee => 0x6101, 0xef => 0x7b79, 0xf0 => 0x4ec7,
+    0xf1 => 0x7ef8, 0xf2 => 0x7785, 0xf3 => 0x4e11, 0xf4 => 0x81ed,
+    0xf5 => 0x521d, 0xf6 => 0x51fa, 0xf7 => 0x6a71, 0xf8 => 0x53a8,
+    0xf9 => 0x8e87, 0xfa => 0x9504, 0xfb => 0x96cf, 0xfc => 0x6ec1,
+    0xfd => 0x9664, 0xfe => 0x695a,
+  },
+  0xb4 => {
+    0xa1 => 0x7840, 0xa2 => 0x50a8, 0xa3 => 0x77d7, 0xa4 => 0x6410,
+    0xa5 => 0x89e6, 0xa6 => 0x5904, 0xa7 => 0x63e3, 0xa8 => 0x5ddd,
+    0xa9 => 0x7a7f, 0xaa => 0x693d, 0xab => 0x4f20, 0xac => 0x8239,
+    0xad => 0x5598, 0xae => 0x4e32, 0xaf => 0x75ae, 0xb0 => 0x7a97,
+    0xb1 => 0x5e62, 0xb2 => 0x5e8a, 0xb3 => 0x95ef, 0xb4 => 0x521b,
+    0xb5 => 0x5439, 0xb6 => 0x708a, 0xb7 => 0x6376, 0xb8 => 0x9524,
+    0xb9 => 0x5782, 0xba => 0x6625, 0xbb => 0x693f, 0xbc => 0x9187,
+    0xbd => 0x5507, 0xbe => 0x6df3, 0xbf => 0x7eaf, 0xc0 => 0x8822,
+    0xc1 => 0x6233, 0xc2 => 0x7ef0, 0xc3 => 0x75b5, 0xc4 => 0x8328,
+    0xc5 => 0x78c1, 0xc6 => 0x96cc, 0xc7 => 0x8f9e, 0xc8 => 0x6148,
+    0xc9 => 0x74f7, 0xca => 0x8bcd, 0xcb => 0x6b64, 0xcc => 0x523a,
+    0xcd => 0x8d50, 0xce => 0x6b21, 0xcf => 0x806a, 0xd0 => 0x8471,
+    0xd1 => 0x56f1, 0xd2 => 0x5306, 0xd3 => 0x4ece, 0xd4 => 0x4e1b,
+    0xd5 => 0x51d1, 0xd6 => 0x7c97, 0xd7 => 0x918b, 0xd8 => 0x7c07,
+    0xd9 => 0x4fc3, 0xda => 0x8e7f, 0xdb => 0x7be1, 0xdc => 0x7a9c,
+    0xdd => 0x6467, 0xde => 0x5d14, 0xdf => 0x50ac, 0xe0 => 0x8106,
+    0xe1 => 0x7601, 0xe2 => 0x7cb9, 0xe3 => 0x6dec, 0xe4 => 0x7fe0,
+    0xe5 => 0x6751, 0xe6 => 0x5b58, 0xe7 => 0x5bf8, 0xe8 => 0x78cb,
+    0xe9 => 0x64ae, 0xea => 0x6413, 0xeb => 0x63aa, 0xec => 0x632b,
+    0xed => 0x9519, 0xee => 0x642d, 0xef => 0x8fbe, 0xf0 => 0x7b54,
+    0xf1 => 0x7629, 0xf2 => 0x6253, 0xf3 => 0x5927, 0xf4 => 0x5446,
+    0xf5 => 0x6b79, 0xf6 => 0x50a3, 0xf7 => 0x6234, 0xf8 => 0x5e26,
+    0xf9 => 0x6b86, 0xfa => 0x4ee3, 0xfb => 0x8d37, 0xfc => 0x888b,
+    0xfd => 0x5f85, 0xfe => 0x902e,
+  },
+  0xb5 => {
+    0xa1 => 0x6020, 0xa2 => 0x803d, 0xa3 => 0x62c5, 0xa4 => 0x4e39,
+    0xa5 => 0x5355, 0xa6 => 0x90f8, 0xa7 => 0x63b8, 0xa8 => 0x80c6,
+    0xa9 => 0x65e6, 0xaa => 0x6c2e, 0xab => 0x4f46, 0xac => 0x60ee,
+    0xad => 0x6de1, 0xae => 0x8bde, 0xaf => 0x5f39, 0xb0 => 0x86cb,
+    0xb1 => 0x5f53, 0xb2 => 0x6321, 0xb3 => 0x515a, 0xb4 => 0x8361,
+    0xb5 => 0x6863, 0xb6 => 0x5200, 0xb7 => 0x6363, 0xb8 => 0x8e48,
+    0xb9 => 0x5012, 0xba => 0x5c9b, 0xbb => 0x7977, 0xbc => 0x5bfc,
+    0xbd => 0x5230, 0xbe => 0x7a3b, 0xbf => 0x60bc, 0xc0 => 0x9053,
+    0xc1 => 0x76d7, 0xc2 => 0x5fb7, 0xc3 => 0x5f97, 0xc4 => 0x7684,
+    0xc5 => 0x8e6c, 0xc6 => 0x706f, 0xc7 => 0x767b, 0xc8 => 0x7b49,
+    0xc9 => 0x77aa, 0xca => 0x51f3, 0xcb => 0x9093, 0xcc => 0x5824,
+    0xcd => 0x4f4e, 0xce => 0x6ef4, 0xcf => 0x8fea, 0xd0 => 0x654c,
+    0xd1 => 0x7b1b, 0xd2 => 0x72c4, 0xd3 => 0x6da4, 0xd4 => 0x7fdf,
+    0xd5 => 0x5ae1, 0xd6 => 0x62b5, 0xd7 => 0x5e95, 0xd8 => 0x5730,
+    0xd9 => 0x8482, 0xda => 0x7b2c, 0xdb => 0x5e1d, 0xdc => 0x5f1f,
+    0xdd => 0x9012, 0xde => 0x7f14, 0xdf => 0x98a0, 0xe0 => 0x6382,
+    0xe1 => 0x6ec7, 0xe2 => 0x7898, 0xe3 => 0x70b9, 0xe4 => 0x5178,
+    0xe5 => 0x975b, 0xe6 => 0x57ab, 0xe7 => 0x7535, 0xe8 => 0x4f43,
+    0xe9 => 0x7538, 0xea => 0x5e97, 0xeb => 0x60e6, 0xec => 0x5960,
+    0xed => 0x6dc0, 0xee => 0x6bbf, 0xef => 0x7889, 0xf0 => 0x53fc,
+    0xf1 => 0x96d5, 0xf2 => 0x51cb, 0xf3 => 0x5201, 0xf4 => 0x6389,
+    0xf5 => 0x540a, 0xf6 => 0x9493, 0xf7 => 0x8c03, 0xf8 => 0x8dcc,
+    0xf9 => 0x7239, 0xfa => 0x789f, 0xfb => 0x8776, 0xfc => 0x8fed,
+    0xfd => 0x8c0d, 0xfe => 0x53e0,
+  },
+  0xb6 => {
+    0xa1 => 0x4e01, 0xa2 => 0x76ef, 0xa3 => 0x53ee, 0xa4 => 0x9489,
+    0xa5 => 0x9876, 0xa6 => 0x9f0e, 0xa7 => 0x952d, 0xa8 => 0x5b9a,
+    0xa9 => 0x8ba2, 0xaa => 0x4e22, 0xab => 0x4e1c, 0xac => 0x51ac,
+    0xad => 0x8463, 0xae => 0x61c2, 0xaf => 0x52a8, 0xb0 => 0x680b,
+    0xb1 => 0x4f97, 0xb2 => 0x606b, 0xb3 => 0x51bb, 0xb4 => 0x6d1e,
+    0xb5 => 0x515c, 0xb6 => 0x6296, 0xb7 => 0x6597, 0xb8 => 0x9661,
+    0xb9 => 0x8c46, 0xba => 0x9017, 0xbb => 0x75d8, 0xbc => 0x90fd,
+    0xbd => 0x7763, 0xbe => 0x6bd2, 0xbf => 0x728a, 0xc0 => 0x72ec,
+    0xc1 => 0x8bfb, 0xc2 => 0x5835, 0xc3 => 0x7779, 0xc4 => 0x8d4c,
+    0xc5 => 0x675c, 0xc6 => 0x9540, 0xc7 => 0x809a, 0xc8 => 0x5ea6,
+    0xc9 => 0x6e21, 0xca => 0x5992, 0xcb => 0x7aef, 0xcc => 0x77ed,
+    0xcd => 0x953b, 0xce => 0x6bb5, 0xcf => 0x65ad, 0xd0 => 0x7f0e,
+    0xd1 => 0x5806, 0xd2 => 0x5151, 0xd3 => 0x961f, 0xd4 => 0x5bf9,
+    0xd5 => 0x58a9, 0xd6 => 0x5428, 0xd7 => 0x8e72, 0xd8 => 0x6566,
+    0xd9 => 0x987f, 0xda => 0x56e4, 0xdb => 0x949d, 0xdc => 0x76fe,
+    0xdd => 0x9041, 0xde => 0x6387, 0xdf => 0x54c6, 0xe0 => 0x591a,
+    0xe1 => 0x593a, 0xe2 => 0x579b, 0xe3 => 0x8eb2, 0xe4 => 0x6735,
+    0xe5 => 0x8dfa, 0xe6 => 0x8235, 0xe7 => 0x5241, 0xe8 => 0x60f0,
+    0xe9 => 0x5815, 0xea => 0x86fe, 0xeb => 0x5ce8, 0xec => 0x9e45,
+    0xed => 0x4fc4, 0xee => 0x989d, 0xef => 0x8bb9, 0xf0 => 0x5a25,
+    0xf1 => 0x6076, 0xf2 => 0x5384, 0xf3 => 0x627c, 0xf4 => 0x904f,
+    0xf5 => 0x9102, 0xf6 => 0x997f, 0xf7 => 0x6069, 0xf8 => 0x800c,
+    0xf9 => 0x513f, 0xfa => 0x8033, 0xfb => 0x5c14, 0xfc => 0x9975,
+    0xfd => 0x6d31, 0xfe => 0x4e8c,
+  },
+  0xb7 => {
+    0xa1 => 0x8d30, 0xa2 => 0x53d1, 0xa3 => 0x7f5a, 0xa4 => 0x7b4f,
+    0xa5 => 0x4f10, 0xa6 => 0x4e4f, 0xa7 => 0x9600, 0xa8 => 0x6cd5,
+    0xa9 => 0x73d0, 0xaa => 0x85e9, 0xab => 0x5e06, 0xac => 0x756a,
+    0xad => 0x7ffb, 0xae => 0x6a0a, 0xaf => 0x77fe, 0xb0 => 0x9492,
+    0xb1 => 0x7e41, 0xb2 => 0x51e1, 0xb3 => 0x70e6, 0xb4 => 0x53cd,
+    0xb5 => 0x8fd4, 0xb6 => 0x8303, 0xb7 => 0x8d29, 0xb8 => 0x72af,
+    0xb9 => 0x996d, 0xba => 0x6cdb, 0xbb => 0x574a, 0xbc => 0x82b3,
+    0xbd => 0x65b9, 0xbe => 0x80aa, 0xbf => 0x623f, 0xc0 => 0x9632,
+    0xc1 => 0x59a8, 0xc2 => 0x4eff, 0xc3 => 0x8bbf, 0xc4 => 0x7eba,
+    0xc5 => 0x653e, 0xc6 => 0x83f2, 0xc7 => 0x975e, 0xc8 => 0x5561,
+    0xc9 => 0x98de, 0xca => 0x80a5, 0xcb => 0x532a, 0xcc => 0x8bfd,
+    0xcd => 0x5420, 0xce => 0x80ba, 0xcf => 0x5e9f, 0xd0 => 0x6cb8,
+    0xd1 => 0x8d39, 0xd2 => 0x82ac, 0xd3 => 0x915a, 0xd4 => 0x5429,
+    0xd5 => 0x6c1b, 0xd6 => 0x5206, 0xd7 => 0x7eb7, 0xd8 => 0x575f,
+    0xd9 => 0x711a, 0xda => 0x6c7e, 0xdb => 0x7c89, 0xdc => 0x594b,
+    0xdd => 0x4efd, 0xde => 0x5fff, 0xdf => 0x6124, 0xe0 => 0x7caa,
+    0xe1 => 0x4e30, 0xe2 => 0x5c01, 0xe3 => 0x67ab, 0xe4 => 0x8702,
+    0xe5 => 0x5cf0, 0xe6 => 0x950b, 0xe7 => 0x98ce, 0xe8 => 0x75af,
+    0xe9 => 0x70fd, 0xea => 0x9022, 0xeb => 0x51af, 0xec => 0x7f1d,
+    0xed => 0x8bbd, 0xee => 0x5949, 0xef => 0x51e4, 0xf0 => 0x4f5b,
+    0xf1 => 0x5426, 0xf2 => 0x592b, 0xf3 => 0x6577, 0xf4 => 0x80a4,
+    0xf5 => 0x5b75, 0xf6 => 0x6276, 0xf7 => 0x62c2, 0xf8 => 0x8f90,
+    0xf9 => 0x5e45, 0xfa => 0x6c1f, 0xfb => 0x7b26, 0xfc => 0x4f0f,
+    0xfd => 0x4fd8, 0xfe => 0x670d,
+  },
+  0xb8 => {
+    0xa1 => 0x6d6e, 0xa2 => 0x6daa, 0xa3 => 0x798f, 0xa4 => 0x88b1,
+    0xa5 => 0x5f17, 0xa6 => 0x752b, 0xa7 => 0x629a, 0xa8 => 0x8f85,
+    0xa9 => 0x4fef, 0xaa => 0x91dc, 0xab => 0x65a7, 0xac => 0x812f,
+    0xad => 0x8151, 0xae => 0x5e9c, 0xaf => 0x8150, 0xb0 => 0x8d74,
+    0xb1 => 0x526f, 0xb2 => 0x8986, 0xb3 => 0x8d4b, 0xb4 => 0x590d,
+    0xb5 => 0x5085, 0xb6 => 0x4ed8, 0xb7 => 0x961c, 0xb8 => 0x7236,
+    0xb9 => 0x8179, 0xba => 0x8d1f, 0xbb => 0x5bcc, 0xbc => 0x8ba3,
+    0xbd => 0x9644, 0xbe => 0x5987, 0xbf => 0x7f1a, 0xc0 => 0x5490,
+    0xc1 => 0x5676, 0xc2 => 0x560e, 0xc3 => 0x8be5, 0xc4 => 0x6539,
+    0xc5 => 0x6982, 0xc6 => 0x9499, 0xc7 => 0x76d6, 0xc8 => 0x6e89,
+    0xc9 => 0x5e72, 0xca => 0x7518, 0xcb => 0x6746, 0xcc => 0x67d1,
+    0xcd => 0x7aff, 0xce => 0x809d, 0xcf => 0x8d76, 0xd0 => 0x611f,
+    0xd1 => 0x79c6, 0xd2 => 0x6562, 0xd3 => 0x8d63, 0xd4 => 0x5188,
+    0xd5 => 0x521a, 0xd6 => 0x94a2, 0xd7 => 0x7f38, 0xd8 => 0x809b,
+    0xd9 => 0x7eb2, 0xda => 0x5c97, 0xdb => 0x6e2f, 0xdc => 0x6760,
+    0xdd => 0x7bd9, 0xde => 0x768b, 0xdf => 0x9ad8, 0xe0 => 0x818f,
+    0xe1 => 0x7f94, 0xe2 => 0x7cd5, 0xe3 => 0x641e, 0xe4 => 0x9550,
+    0xe5 => 0x7a3f, 0xe6 => 0x544a, 0xe7 => 0x54e5, 0xe8 => 0x6b4c,
+    0xe9 => 0x6401, 0xea => 0x6208, 0xeb => 0x9e3d, 0xec => 0x80f3,
+    0xed => 0x7599, 0xee => 0x5272, 0xef => 0x9769, 0xf0 => 0x845b,
+    0xf1 => 0x683c, 0xf2 => 0x86e4, 0xf3 => 0x9601, 0xf4 => 0x9694,
+    0xf5 => 0x94ec, 0xf6 => 0x4e2a, 0xf7 => 0x5404, 0xf8 => 0x7ed9,
+    0xf9 => 0x6839, 0xfa => 0x8ddf, 0xfb => 0x8015, 0xfc => 0x66f4,
+    0xfd => 0x5e9a, 0xfe => 0x7fb9,
+  },
+  0xb9 => {
+    0xa1 => 0x57c2, 0xa2 => 0x803f, 0xa3 => 0x6897, 0xa4 => 0x5de5,
+    0xa5 => 0x653b, 0xa6 => 0x529f, 0xa7 => 0x606d, 0xa8 => 0x9f9a,
+    0xa9 => 0x4f9b, 0xaa => 0x8eac, 0xab => 0x516c, 0xac => 0x5bab,
+    0xad => 0x5f13, 0xae => 0x5de9, 0xaf => 0x6c5e, 0xb0 => 0x62f1,
+    0xb1 => 0x8d21, 0xb2 => 0x5171, 0xb3 => 0x94a9, 0xb4 => 0x52fe,
+    0xb5 => 0x6c9f, 0xb6 => 0x82df, 0xb7 => 0x72d7, 0xb8 => 0x57a2,
+    0xb9 => 0x6784, 0xba => 0x8d2d, 0xbb => 0x591f, 0xbc => 0x8f9c,
+    0xbd => 0x83c7, 0xbe => 0x5495, 0xbf => 0x7b8d, 0xc0 => 0x4f30,
+    0xc1 => 0x6cbd, 0xc2 => 0x5b64, 0xc3 => 0x59d1, 0xc4 => 0x9f13,
+    0xc5 => 0x53e4, 0xc6 => 0x86ca, 0xc7 => 0x9aa8, 0xc8 => 0x8c37,
+    0xc9 => 0x80a1, 0xca => 0x6545, 0xcb => 0x987e, 0xcc => 0x56fa,
+    0xcd => 0x96c7, 0xce => 0x522e, 0xcf => 0x74dc, 0xd0 => 0x5250,
+    0xd1 => 0x5be1, 0xd2 => 0x6302, 0xd3 => 0x8902, 0xd4 => 0x4e56,
+    0xd5 => 0x62d0, 0xd6 => 0x602a, 0xd7 => 0x68fa, 0xd8 => 0x5173,
+    0xd9 => 0x5b98, 0xda => 0x51a0, 0xdb => 0x89c2, 0xdc => 0x7ba1,
+    0xdd => 0x9986, 0xde => 0x7f50, 0xdf => 0x60ef, 0xe0 => 0x704c,
+    0xe1 => 0x8d2f, 0xe2 => 0x5149, 0xe3 => 0x5e7f, 0xe4 => 0x901b,
+    0xe5 => 0x7470, 0xe6 => 0x89c4, 0xe7 => 0x572d, 0xe8 => 0x7845,
+    0xe9 => 0x5f52, 0xea => 0x9f9f, 0xeb => 0x95fa, 0xec => 0x8f68,
+    0xed => 0x9b3c, 0xee => 0x8be1, 0xef => 0x7678, 0xf0 => 0x6842,
+    0xf1 => 0x67dc, 0xf2 => 0x8dea, 0xf3 => 0x8d35, 0xf4 => 0x523d,
+    0xf5 => 0x8f8a, 0xf6 => 0x6eda, 0xf7 => 0x68cd, 0xf8 => 0x9505,
+    0xf9 => 0x90ed, 0xfa => 0x56fd, 0xfb => 0x679c, 0xfc => 0x88f9,
+    0xfd => 0x8fc7, 0xfe => 0x54c8,
+  },
+  0xba => {
+    0xa1 => 0x9ab8, 0xa2 => 0x5b69, 0xa3 => 0x6d77, 0xa4 => 0x6c26,
+    0xa5 => 0x4ea5, 0xa6 => 0x5bb3, 0xa7 => 0x9a87, 0xa8 => 0x9163,
+    0xa9 => 0x61a8, 0xaa => 0x90af, 0xab => 0x97e9, 0xac => 0x542b,
+    0xad => 0x6db5, 0xae => 0x5bd2, 0xaf => 0x51fd, 0xb0 => 0x558a,
+    0xb1 => 0x7f55, 0xb2 => 0x7ff0, 0xb3 => 0x64bc, 0xb4 => 0x634d,
+    0xb5 => 0x65f1, 0xb6 => 0x61be, 0xb7 => 0x608d, 0xb8 => 0x710a,
+    0xb9 => 0x6c57, 0xba => 0x6c49, 0xbb => 0x592f, 0xbc => 0x676d,
+    0xbd => 0x822a, 0xbe => 0x58d5, 0xbf => 0x568e, 0xc0 => 0x8c6a,
+    0xc1 => 0x6beb, 0xc2 => 0x90dd, 0xc3 => 0x597d, 0xc4 => 0x8017,
+    0xc5 => 0x53f7, 0xc6 => 0x6d69, 0xc7 => 0x5475, 0xc8 => 0x559d,
+    0xc9 => 0x8377, 0xca => 0x83cf, 0xcb => 0x6838, 0xcc => 0x79be,
+    0xcd => 0x548c, 0xce => 0x4f55, 0xcf => 0x5408, 0xd0 => 0x76d2,
+    0xd1 => 0x8c89, 0xd2 => 0x9602, 0xd3 => 0x6cb3, 0xd4 => 0x6db8,
+    0xd5 => 0x8d6b, 0xd6 => 0x8910, 0xd7 => 0x9e64, 0xd8 => 0x8d3a,
+    0xd9 => 0x563f, 0xda => 0x9ed1, 0xdb => 0x75d5, 0xdc => 0x5f88,
+    0xdd => 0x72e0, 0xde => 0x6068, 0xdf => 0x54fc, 0xe0 => 0x4ea8,
+    0xe1 => 0x6a2a, 0xe2 => 0x8861, 0xe3 => 0x6052, 0xe4 => 0x8f70,
+    0xe5 => 0x54c4, 0xe6 => 0x70d8, 0xe7 => 0x8679, 0xe8 => 0x9e3f,
+    0xe9 => 0x6d2a, 0xea => 0x5b8f, 0xeb => 0x5f18, 0xec => 0x7ea2,
+    0xed => 0x5589, 0xee => 0x4faf, 0xef => 0x7334, 0xf0 => 0x543c,
+    0xf1 => 0x539a, 0xf2 => 0x5019, 0xf3 => 0x540e, 0xf4 => 0x547c,
+    0xf5 => 0x4e4e, 0xf6 => 0x5ffd, 0xf7 => 0x745a, 0xf8 => 0x58f6,
+    0xf9 => 0x846b, 0xfa => 0x80e1, 0xfb => 0x8774, 0xfc => 0x72d0,
+    0xfd => 0x7cca, 0xfe => 0x6e56,
+  },
+  0xbb => {
+    0xa1 => 0x5f27, 0xa2 => 0x864e, 0xa3 => 0x552c, 0xa4 => 0x62a4,
+    0xa5 => 0x4e92, 0xa6 => 0x6caa, 0xa7 => 0x6237, 0xa8 => 0x82b1,
+    0xa9 => 0x54d7, 0xaa => 0x534e, 0xab => 0x733e, 0xac => 0x6ed1,
+    0xad => 0x753b, 0xae => 0x5212, 0xaf => 0x5316, 0xb0 => 0x8bdd,
+    0xb1 => 0x69d0, 0xb2 => 0x5f8a, 0xb3 => 0x6000, 0xb4 => 0x6dee,
+    0xb5 => 0x574f, 0xb6 => 0x6b22, 0xb7 => 0x73af, 0xb8 => 0x6853,
+    0xb9 => 0x8fd8, 0xba => 0x7f13, 0xbb => 0x6362, 0xbc => 0x60a3,
+    0xbd => 0x5524, 0xbe => 0x75ea, 0xbf => 0x8c62, 0xc0 => 0x7115,
+    0xc1 => 0x6da3, 0xc2 => 0x5ba6, 0xc3 => 0x5e7b, 0xc4 => 0x8352,
+    0xc5 => 0x614c, 0xc6 => 0x9ec4, 0xc7 => 0x78fa, 0xc8 => 0x8757,
+    0xc9 => 0x7c27, 0xca => 0x7687, 0xcb => 0x51f0, 0xcc => 0x60f6,
+    0xcd => 0x714c, 0xce => 0x6643, 0xcf => 0x5e4c, 0xd0 => 0x604d,
+    0xd1 => 0x8c0e, 0xd2 => 0x7070, 0xd3 => 0x6325, 0xd4 => 0x8f89,
+    0xd5 => 0x5fbd, 0xd6 => 0x6062, 0xd7 => 0x86d4, 0xd8 => 0x56de,
+    0xd9 => 0x6bc1, 0xda => 0x6094, 0xdb => 0x6167, 0xdc => 0x5349,
+    0xdd => 0x60e0, 0xde => 0x6666, 0xdf => 0x8d3f, 0xe0 => 0x79fd,
+    0xe1 => 0x4f1a, 0xe2 => 0x70e9, 0xe3 => 0x6c47, 0xe4 => 0x8bb3,
+    0xe5 => 0x8bf2, 0xe6 => 0x7ed8, 0xe7 => 0x8364, 0xe8 => 0x660f,
+    0xe9 => 0x5a5a, 0xea => 0x9b42, 0xeb => 0x6d51, 0xec => 0x6df7,
+    0xed => 0x8c41, 0xee => 0x6d3b, 0xef => 0x4f19, 0xf0 => 0x706b,
+    0xf1 => 0x83b7, 0xf2 => 0x6216, 0xf3 => 0x60d1, 0xf4 => 0x970d,
+    0xf5 => 0x8d27, 0xf6 => 0x7978, 0xf7 => 0x51fb, 0xf8 => 0x573e,
+    0xf9 => 0x57fa, 0xfa => 0x673a, 0xfb => 0x7578, 0xfc => 0x7a3d,
+    0xfd => 0x79ef, 0xfe => 0x7b95,
+  },
+  0xbc => {
+    0xa1 => 0x808c, 0xa2 => 0x9965, 0xa3 => 0x8ff9, 0xa4 => 0x6fc0,
+    0xa5 => 0x8ba5, 0xa6 => 0x9e21, 0xa7 => 0x59ec, 0xa8 => 0x7ee9,
+    0xa9 => 0x7f09, 0xaa => 0x5409, 0xab => 0x6781, 0xac => 0x68d8,
+    0xad => 0x8f91, 0xae => 0x7c4d, 0xaf => 0x96c6, 0xb0 => 0x53ca,
+    0xb1 => 0x6025, 0xb2 => 0x75be, 0xb3 => 0x6c72, 0xb4 => 0x5373,
+    0xb5 => 0x5ac9, 0xb6 => 0x7ea7, 0xb7 => 0x6324, 0xb8 => 0x51e0,
+    0xb9 => 0x810a, 0xba => 0x5df1, 0xbb => 0x84df, 0xbc => 0x6280,
+    0xbd => 0x5180, 0xbe => 0x5b63, 0xbf => 0x4f0e, 0xc0 => 0x796d,
+    0xc1 => 0x5242, 0xc2 => 0x60b8, 0xc3 => 0x6d4e, 0xc4 => 0x5bc4,
+    0xc5 => 0x5bc2, 0xc6 => 0x8ba1, 0xc7 => 0x8bb0, 0xc8 => 0x65e2,
+    0xc9 => 0x5fcc, 0xca => 0x9645, 0xcb => 0x5993, 0xcc => 0x7ee7,
+    0xcd => 0x7eaa, 0xce => 0x5609, 0xcf => 0x67b7, 0xd0 => 0x5939,
+    0xd1 => 0x4f73, 0xd2 => 0x5bb6, 0xd3 => 0x52a0, 0xd4 => 0x835a,
+    0xd5 => 0x988a, 0xd6 => 0x8d3e, 0xd7 => 0x7532, 0xd8 => 0x94be,
+    0xd9 => 0x5047, 0xda => 0x7a3c, 0xdb => 0x4ef7, 0xdc => 0x67b6,
+    0xdd => 0x9a7e, 0xde => 0x5ac1, 0xdf => 0x6b7c, 0xe0 => 0x76d1,
+    0xe1 => 0x575a, 0xe2 => 0x5c16, 0xe3 => 0x7b3a, 0xe4 => 0x95f4,
+    0xe5 => 0x714e, 0xe6 => 0x517c, 0xe7 => 0x80a9, 0xe8 => 0x8270,
+    0xe9 => 0x5978, 0xea => 0x7f04, 0xeb => 0x8327, 0xec => 0x68c0,
+    0xed => 0x67ec, 0xee => 0x78b1, 0xef => 0x7877, 0xf0 => 0x62e3,
+    0xf1 => 0x6361, 0xf2 => 0x7b80, 0xf3 => 0x4fed, 0xf4 => 0x526a,
+    0xf5 => 0x51cf, 0xf6 => 0x8350, 0xf7 => 0x69db, 0xf8 => 0x9274,
+    0xf9 => 0x8df5, 0xfa => 0x8d31, 0xfb => 0x89c1, 0xfc => 0x952e,
+    0xfd => 0x7bad, 0xfe => 0x4ef6,
+  },
+  0xbd => {
+    0xa1 => 0x5065, 0xa2 => 0x8230, 0xa3 => 0x5251, 0xa4 => 0x996f,
+    0xa5 => 0x6e10, 0xa6 => 0x6e85, 0xa7 => 0x6da7, 0xa8 => 0x5efa,
+    0xa9 => 0x50f5, 0xaa => 0x59dc, 0xab => 0x5c06, 0xac => 0x6d46,
+    0xad => 0x6c5f, 0xae => 0x7586, 0xaf => 0x848b, 0xb0 => 0x6868,
+    0xb1 => 0x5956, 0xb2 => 0x8bb2, 0xb3 => 0x5320, 0xb4 => 0x9171,
+    0xb5 => 0x964d, 0xb6 => 0x8549, 0xb7 => 0x6912, 0xb8 => 0x7901,
+    0xb9 => 0x7126, 0xba => 0x80f6, 0xbb => 0x4ea4, 0xbc => 0x90ca,
+    0xbd => 0x6d47, 0xbe => 0x9a84, 0xbf => 0x5a07, 0xc0 => 0x56bc,
+    0xc1 => 0x6405, 0xc2 => 0x94f0, 0xc3 => 0x77eb, 0xc4 => 0x4fa5,
+    0xc5 => 0x811a, 0xc6 => 0x72e1, 0xc7 => 0x89d2, 0xc8 => 0x997a,
+    0xc9 => 0x7f34, 0xca => 0x7ede, 0xcb => 0x527f, 0xcc => 0x6559,
+    0xcd => 0x9175, 0xce => 0x8f7f, 0xcf => 0x8f83, 0xd0 => 0x53eb,
+    0xd1 => 0x7a96, 0xd2 => 0x63ed, 0xd3 => 0x63a5, 0xd4 => 0x7686,
+    0xd5 => 0x79f8, 0xd6 => 0x8857, 0xd7 => 0x9636, 0xd8 => 0x622a,
+    0xd9 => 0x52ab, 0xda => 0x8282, 0xdb => 0x6854, 0xdc => 0x6770,
+    0xdd => 0x6377, 0xde => 0x776b, 0xdf => 0x7aed, 0xe0 => 0x6d01,
+    0xe1 => 0x7ed3, 0xe2 => 0x89e3, 0xe3 => 0x59d0, 0xe4 => 0x6212,
+    0xe5 => 0x85c9, 0xe6 => 0x82a5, 0xe7 => 0x754c, 0xe8 => 0x501f,
+    0xe9 => 0x4ecb, 0xea => 0x75a5, 0xeb => 0x8beb, 0xec => 0x5c4a,
+    0xed => 0x5dfe, 0xee => 0x7b4b, 0xef => 0x65a4, 0xf0 => 0x91d1,
+    0xf1 => 0x4eca, 0xf2 => 0x6d25, 0xf3 => 0x895f, 0xf4 => 0x7d27,
+    0xf5 => 0x9526, 0xf6 => 0x4ec5, 0xf7 => 0x8c28, 0xf8 => 0x8fdb,
+    0xf9 => 0x9773, 0xfa => 0x664b, 0xfb => 0x7981, 0xfc => 0x8fd1,
+    0xfd => 0x70ec, 0xfe => 0x6d78,
+  },
+  0xbe => {
+    0xa1 => 0x5c3d, 0xa2 => 0x52b2, 0xa3 => 0x8346, 0xa4 => 0x5162,
+    0xa5 => 0x830e, 0xa6 => 0x775b, 0xa7 => 0x6676, 0xa8 => 0x9cb8,
+    0xa9 => 0x4eac, 0xaa => 0x60ca, 0xab => 0x7cbe, 0xac => 0x7cb3,
+    0xad => 0x7ecf, 0xae => 0x4e95, 0xaf => 0x8b66, 0xb0 => 0x666f,
+    0xb1 => 0x9888, 0xb2 => 0x9759, 0xb3 => 0x5883, 0xb4 => 0x656c,
+    0xb5 => 0x955c, 0xb6 => 0x5f84, 0xb7 => 0x75c9, 0xb8 => 0x9756,
+    0xb9 => 0x7adf, 0xba => 0x7ade, 0xbb => 0x51c0, 0xbc => 0x70af,
+    0xbd => 0x7a98, 0xbe => 0x63ea, 0xbf => 0x7a76, 0xc0 => 0x7ea0,
+    0xc1 => 0x7396, 0xc2 => 0x97ed, 0xc3 => 0x4e45, 0xc4 => 0x7078,
+    0xc5 => 0x4e5d, 0xc6 => 0x9152, 0xc7 => 0x53a9, 0xc8 => 0x6551,
+    0xc9 => 0x65e7, 0xca => 0x81fc, 0xcb => 0x8205, 0xcc => 0x548e,
+    0xcd => 0x5c31, 0xce => 0x759a, 0xcf => 0x97a0, 0xd0 => 0x62d8,
+    0xd1 => 0x72d9, 0xd2 => 0x75bd, 0xd3 => 0x5c45, 0xd4 => 0x9a79,
+    0xd5 => 0x83ca, 0xd6 => 0x5c40, 0xd7 => 0x5480, 0xd8 => 0x77e9,
+    0xd9 => 0x4e3e, 0xda => 0x6cae, 0xdb => 0x805a, 0xdc => 0x62d2,
+    0xdd => 0x636e, 0xde => 0x5de8, 0xdf => 0x5177, 0xe0 => 0x8ddd,
+    0xe1 => 0x8e1e, 0xe2 => 0x952f, 0xe3 => 0x4ff1, 0xe4 => 0x53e5,
+    0xe5 => 0x60e7, 0xe6 => 0x70ac, 0xe7 => 0x5267, 0xe8 => 0x6350,
+    0xe9 => 0x9e43, 0xea => 0x5a1f, 0xeb => 0x5026, 0xec => 0x7737,
+    0xed => 0x5377, 0xee => 0x7ee2, 0xef => 0x6485, 0xf0 => 0x652b,
+    0xf1 => 0x6289, 0xf2 => 0x6398, 0xf3 => 0x5014, 0xf4 => 0x7235,
+    0xf5 => 0x89c9, 0xf6 => 0x51b3, 0xf7 => 0x8bc0, 0xf8 => 0x7edd,
+    0xf9 => 0x5747, 0xfa => 0x83cc, 0xfb => 0x94a7, 0xfc => 0x519b,
+    0xfd => 0x541b, 0xfe => 0x5cfb,
+  },
+  0xbf => {
+    0xa1 => 0x4fca, 0xa2 => 0x7ae3, 0xa3 => 0x6d5a, 0xa4 => 0x90e1,
+    0xa5 => 0x9a8f, 0xa6 => 0x5580, 0xa7 => 0x5496, 0xa8 => 0x5361,
+    0xa9 => 0x54af, 0xaa => 0x5f00, 0xab => 0x63e9, 0xac => 0x6977,
+    0xad => 0x51ef, 0xae => 0x6168, 0xaf => 0x520a, 0xb0 => 0x582a,
+    0xb1 => 0x52d8, 0xb2 => 0x574e, 0xb3 => 0x780d, 0xb4 => 0x770b,
+    0xb5 => 0x5eb7, 0xb6 => 0x6177, 0xb7 => 0x7ce0, 0xb8 => 0x625b,
+    0xb9 => 0x6297, 0xba => 0x4ea2, 0xbb => 0x7095, 0xbc => 0x8003,
+    0xbd => 0x62f7, 0xbe => 0x70e4, 0xbf => 0x9760, 0xc0 => 0x5777,
+    0xc1 => 0x82db, 0xc2 => 0x67ef, 0xc3 => 0x68f5, 0xc4 => 0x78d5,
+    0xc5 => 0x9897, 0xc6 => 0x79d1, 0xc7 => 0x58f3, 0xc8 => 0x54b3,
+    0xc9 => 0x53ef, 0xca => 0x6e34, 0xcb => 0x514b, 0xcc => 0x523b,
+    0xcd => 0x5ba2, 0xce => 0x8bfe, 0xcf => 0x80af, 0xd0 => 0x5543,
+    0xd1 => 0x57a6, 0xd2 => 0x6073, 0xd3 => 0x5751, 0xd4 => 0x542d,
+    0xd5 => 0x7a7a, 0xd6 => 0x6050, 0xd7 => 0x5b54, 0xd8 => 0x63a7,
+    0xd9 => 0x62a0, 0xda => 0x53e3, 0xdb => 0x6263, 0xdc => 0x5bc7,
+    0xdd => 0x67af, 0xde => 0x54ed, 0xdf => 0x7a9f, 0xe0 => 0x82e6,
+    0xe1 => 0x9177, 0xe2 => 0x5e93, 0xe3 => 0x88e4, 0xe4 => 0x5938,
+    0xe5 => 0x57ae, 0xe6 => 0x630e, 0xe7 => 0x8de8, 0xe8 => 0x80ef,
+    0xe9 => 0x5757, 0xea => 0x7b77, 0xeb => 0x4fa9, 0xec => 0x5feb,
+    0xed => 0x5bbd, 0xee => 0x6b3e, 0xef => 0x5321, 0xf0 => 0x7b50,
+    0xf1 => 0x72c2, 0xf2 => 0x6846, 0xf3 => 0x77ff, 0xf4 => 0x7736,
+    0xf5 => 0x65f7, 0xf6 => 0x51b5, 0xf7 => 0x4e8f, 0xf8 => 0x76d4,
+    0xf9 => 0x5cbf, 0xfa => 0x7aa5, 0xfb => 0x8475, 0xfc => 0x594e,
+    0xfd => 0x9b41, 0xfe => 0x5080,
+  },
+  0xc0 => {
+    0xa1 => 0x9988, 0xa2 => 0x6127, 0xa3 => 0x6e83, 0xa4 => 0x5764,
+    0xa5 => 0x6606, 0xa6 => 0x6346, 0xa7 => 0x56f0, 0xa8 => 0x62ec,
+    0xa9 => 0x6269, 0xaa => 0x5ed3, 0xab => 0x9614, 0xac => 0x5783,
+    0xad => 0x62c9, 0xae => 0x5587, 0xaf => 0x8721, 0xb0 => 0x814a,
+    0xb1 => 0x8fa3, 0xb2 => 0x5566, 0xb3 => 0x83b1, 0xb4 => 0x6765,
+    0xb5 => 0x8d56, 0xb6 => 0x84dd, 0xb7 => 0x5a6a, 0xb8 => 0x680f,
+    0xb9 => 0x62e6, 0xba => 0x7bee, 0xbb => 0x9611, 0xbc => 0x5170,
+    0xbd => 0x6f9c, 0xbe => 0x8c30, 0xbf => 0x63fd, 0xc0 => 0x89c8,
+    0xc1 => 0x61d2, 0xc2 => 0x7f06, 0xc3 => 0x70c2, 0xc4 => 0x6ee5,
+    0xc5 => 0x7405, 0xc6 => 0x6994, 0xc7 => 0x72fc, 0xc8 => 0x5eca,
+    0xc9 => 0x90ce, 0xca => 0x6717, 0xcb => 0x6d6a, 0xcc => 0x635e,
+    0xcd => 0x52b3, 0xce => 0x7262, 0xcf => 0x8001, 0xd0 => 0x4f6c,
+    0xd1 => 0x59e5, 0xd2 => 0x916a, 0xd3 => 0x70d9, 0xd4 => 0x6d9d,
+    0xd5 => 0x52d2, 0xd6 => 0x4e50, 0xd7 => 0x96f7, 0xd8 => 0x956d,
+    0xd9 => 0x857e, 0xda => 0x78ca, 0xdb => 0x7d2f, 0xdc => 0x5121,
+    0xdd => 0x5792, 0xde => 0x64c2, 0xdf => 0x808b, 0xe0 => 0x7c7b,
+    0xe1 => 0x6cea, 0xe2 => 0x68f1, 0xe3 => 0x695e, 0xe4 => 0x51b7,
+    0xe5 => 0x5398, 0xe6 => 0x68a8, 0xe7 => 0x7281, 0xe8 => 0x9ece,
+    0xe9 => 0x7bf1, 0xea => 0x72f8, 0xeb => 0x79bb, 0xec => 0x6f13,
+    0xed => 0x7406, 0xee => 0x674e, 0xef => 0x91cc, 0xf0 => 0x9ca4,
+    0xf1 => 0x793c, 0xf2 => 0x8389, 0xf3 => 0x8354, 0xf4 => 0x540f,
+    0xf5 => 0x6817, 0xf6 => 0x4e3d, 0xf7 => 0x5389, 0xf8 => 0x52b1,
+    0xf9 => 0x783e, 0xfa => 0x5386, 0xfb => 0x5229, 0xfc => 0x5088,
+    0xfd => 0x4f8b, 0xfe => 0x4fd0,
+  },
+  0xc1 => {
+    0xa1 => 0x75e2, 0xa2 => 0x7acb, 0xa3 => 0x7c92, 0xa4 => 0x6ca5,
+    0xa5 => 0x96b6, 0xa6 => 0x529b, 0xa7 => 0x7483, 0xa8 => 0x54e9,
+    0xa9 => 0x4fe9, 0xaa => 0x8054, 0xab => 0x83b2, 0xac => 0x8fde,
+    0xad => 0x9570, 0xae => 0x5ec9, 0xaf => 0x601c, 0xb0 => 0x6d9f,
+    0xb1 => 0x5e18, 0xb2 => 0x655b, 0xb3 => 0x8138, 0xb4 => 0x94fe,
+    0xb5 => 0x604b, 0xb6 => 0x70bc, 0xb7 => 0x7ec3, 0xb8 => 0x7cae,
+    0xb9 => 0x51c9, 0xba => 0x6881, 0xbb => 0x7cb1, 0xbc => 0x826f,
+    0xbd => 0x4e24, 0xbe => 0x8f86, 0xbf => 0x91cf, 0xc0 => 0x667e,
+    0xc1 => 0x4eae, 0xc2 => 0x8c05, 0xc3 => 0x64a9, 0xc4 => 0x804a,
+    0xc5 => 0x50da, 0xc6 => 0x7597, 0xc7 => 0x71ce, 0xc8 => 0x5be5,
+    0xc9 => 0x8fbd, 0xca => 0x6f66, 0xcb => 0x4e86, 0xcc => 0x6482,
+    0xcd => 0x9563, 0xce => 0x5ed6, 0xcf => 0x6599, 0xd0 => 0x5217,
+    0xd1 => 0x88c2, 0xd2 => 0x70c8, 0xd3 => 0x52a3, 0xd4 => 0x730e,
+    0xd5 => 0x7433, 0xd6 => 0x6797, 0xd7 => 0x78f7, 0xd8 => 0x9716,
+    0xd9 => 0x4e34, 0xda => 0x90bb, 0xdb => 0x9cde, 0xdc => 0x6dcb,
+    0xdd => 0x51db, 0xde => 0x8d41, 0xdf => 0x541d, 0xe0 => 0x62ce,
+    0xe1 => 0x73b2, 0xe2 => 0x83f1, 0xe3 => 0x96f6, 0xe4 => 0x9f84,
+    0xe5 => 0x94c3, 0xe6 => 0x4f36, 0xe7 => 0x7f9a, 0xe8 => 0x51cc,
+    0xe9 => 0x7075, 0xea => 0x9675, 0xeb => 0x5cad, 0xec => 0x9886,
+    0xed => 0x53e6, 0xee => 0x4ee4, 0xef => 0x6e9c, 0xf0 => 0x7409,
+    0xf1 => 0x69b4, 0xf2 => 0x786b, 0xf3 => 0x998f, 0xf4 => 0x7559,
+    0xf5 => 0x5218, 0xf6 => 0x7624, 0xf7 => 0x6d41, 0xf8 => 0x67f3,
+    0xf9 => 0x516d, 0xfa => 0x9f99, 0xfb => 0x804b, 0xfc => 0x5499,
+    0xfd => 0x7b3c, 0xfe => 0x7abf,
+  },
+  0xc2 => {
+    0xa1 => 0x9686, 0xa2 => 0x5784, 0xa3 => 0x62e2, 0xa4 => 0x9647,
+    0xa5 => 0x697c, 0xa6 => 0x5a04, 0xa7 => 0x6402, 0xa8 => 0x7bd3,
+    0xa9 => 0x6f0f, 0xaa => 0x964b, 0xab => 0x82a6, 0xac => 0x5362,
+    0xad => 0x9885, 0xae => 0x5e90, 0xaf => 0x7089, 0xb0 => 0x63b3,
+    0xb1 => 0x5364, 0xb2 => 0x864f, 0xb3 => 0x9c81, 0xb4 => 0x9e93,
+    0xb5 => 0x788c, 0xb6 => 0x9732, 0xb7 => 0x8def, 0xb8 => 0x8d42,
+    0xb9 => 0x9e7f, 0xba => 0x6f5e, 0xbb => 0x7984, 0xbc => 0x5f55,
+    0xbd => 0x9646, 0xbe => 0x622e, 0xbf => 0x9a74, 0xc0 => 0x5415,
+    0xc1 => 0x94dd, 0xc2 => 0x4fa3, 0xc3 => 0x65c5, 0xc4 => 0x5c65,
+    0xc5 => 0x5c61, 0xc6 => 0x7f15, 0xc7 => 0x8651, 0xc8 => 0x6c2f,
+    0xc9 => 0x5f8b, 0xca => 0x7387, 0xcb => 0x6ee4, 0xcc => 0x7eff,
+    0xcd => 0x5ce6, 0xce => 0x631b, 0xcf => 0x5b6a, 0xd0 => 0x6ee6,
+    0xd1 => 0x5375, 0xd2 => 0x4e71, 0xd3 => 0x63a0, 0xd4 => 0x7565,
+    0xd5 => 0x62a1, 0xd6 => 0x8f6e, 0xd7 => 0x4f26, 0xd8 => 0x4ed1,
+    0xd9 => 0x6ca6, 0xda => 0x7eb6, 0xdb => 0x8bba, 0xdc => 0x841d,
+    0xdd => 0x87ba, 0xde => 0x7f57, 0xdf => 0x903b, 0xe0 => 0x9523,
+    0xe1 => 0x7ba9, 0xe2 => 0x9aa1, 0xe3 => 0x88f8, 0xe4 => 0x843d,
+    0xe5 => 0x6d1b, 0xe6 => 0x9a86, 0xe7 => 0x7edc, 0xe8 => 0x5988,
+    0xe9 => 0x9ebb, 0xea => 0x739b, 0xeb => 0x7801, 0xec => 0x8682,
+    0xed => 0x9a6c, 0xee => 0x9a82, 0xef => 0x561b, 0xf0 => 0x5417,
+    0xf1 => 0x57cb, 0xf2 => 0x4e70, 0xf3 => 0x9ea6, 0xf4 => 0x5356,
+    0xf5 => 0x8fc8, 0xf6 => 0x8109, 0xf7 => 0x7792, 0xf8 => 0x9992,
+    0xf9 => 0x86ee, 0xfa => 0x6ee1, 0xfb => 0x8513, 0xfc => 0x66fc,
+    0xfd => 0x6162, 0xfe => 0x6f2b,
+  },
+  0xc3 => {
+    0xa1 => 0x8c29, 0xa2 => 0x8292, 0xa3 => 0x832b, 0xa4 => 0x76f2,
+    0xa5 => 0x6c13, 0xa6 => 0x5fd9, 0xa7 => 0x83bd, 0xa8 => 0x732b,
+    0xa9 => 0x8305, 0xaa => 0x951a, 0xab => 0x6bdb, 0xac => 0x77db,
+    0xad => 0x94c6, 0xae => 0x536f, 0xaf => 0x8302, 0xb0 => 0x5192,
+    0xb1 => 0x5e3d, 0xb2 => 0x8c8c, 0xb3 => 0x8d38, 0xb4 => 0x4e48,
+    0xb5 => 0x73ab, 0xb6 => 0x679a, 0xb7 => 0x6885, 0xb8 => 0x9176,
+    0xb9 => 0x9709, 0xba => 0x7164, 0xbb => 0x6ca1, 0xbc => 0x7709,
+    0xbd => 0x5a92, 0xbe => 0x9541, 0xbf => 0x6bcf, 0xc0 => 0x7f8e,
+    0xc1 => 0x6627, 0xc2 => 0x5bd0, 0xc3 => 0x59b9, 0xc4 => 0x5a9a,
+    0xc5 => 0x95e8, 0xc6 => 0x95f7, 0xc7 => 0x4eec, 0xc8 => 0x840c,
+    0xc9 => 0x8499, 0xca => 0x6aac, 0xcb => 0x76df, 0xcc => 0x9530,
+    0xcd => 0x731b, 0xce => 0x68a6, 0xcf => 0x5b5f, 0xd0 => 0x772f,
+    0xd1 => 0x919a, 0xd2 => 0x9761, 0xd3 => 0x7cdc, 0xd4 => 0x8ff7,
+    0xd5 => 0x8c1c, 0xd6 => 0x5f25, 0xd7 => 0x7c73, 0xd8 => 0x79d8,
+    0xd9 => 0x89c5, 0xda => 0x6ccc, 0xdb => 0x871c, 0xdc => 0x5bc6,
+    0xdd => 0x5e42, 0xde => 0x68c9, 0xdf => 0x7720, 0xe0 => 0x7ef5,
+    0xe1 => 0x5195, 0xe2 => 0x514d, 0xe3 => 0x52c9, 0xe4 => 0x5a29,
+    0xe5 => 0x7f05, 0xe6 => 0x9762, 0xe7 => 0x82d7, 0xe8 => 0x63cf,
+    0xe9 => 0x7784, 0xea => 0x85d0, 0xeb => 0x79d2, 0xec => 0x6e3a,
+    0xed => 0x5e99, 0xee => 0x5999, 0xef => 0x8511, 0xf0 => 0x706d,
+    0xf1 => 0x6c11, 0xf2 => 0x62bf, 0xf3 => 0x76bf, 0xf4 => 0x654f,
+    0xf5 => 0x60af, 0xf6 => 0x95fd, 0xf7 => 0x660e, 0xf8 => 0x879f,
+    0xf9 => 0x9e23, 0xfa => 0x94ed, 0xfb => 0x540d, 0xfc => 0x547d,
+    0xfd => 0x8c2c, 0xfe => 0x6478,
+  },
+  0xc4 => {
+    0xa1 => 0x6479, 0xa2 => 0x8611, 0xa3 => 0x6a21, 0xa4 => 0x819c,
+    0xa5 => 0x78e8, 0xa6 => 0x6469, 0xa7 => 0x9b54, 0xa8 => 0x62b9,
+    0xa9 => 0x672b, 0xaa => 0x83ab, 0xab => 0x58a8, 0xac => 0x9ed8,
+    0xad => 0x6cab, 0xae => 0x6f20, 0xaf => 0x5bde, 0xb0 => 0x964c,
+    0xb1 => 0x8c0b, 0xb2 => 0x725f, 0xb3 => 0x67d0, 0xb4 => 0x62c7,
+    0xb5 => 0x7261, 0xb6 => 0x4ea9, 0xb7 => 0x59c6, 0xb8 => 0x6bcd,
+    0xb9 => 0x5893, 0xba => 0x66ae, 0xbb => 0x5e55, 0xbc => 0x52df,
+    0xbd => 0x6155, 0xbe => 0x6728, 0xbf => 0x76ee, 0xc0 => 0x7766,
+    0xc1 => 0x7267, 0xc2 => 0x7a46, 0xc3 => 0x62ff, 0xc4 => 0x54ea,
+    0xc5 => 0x5450, 0xc6 => 0x94a0, 0xc7 => 0x90a3, 0xc8 => 0x5a1c,
+    0xc9 => 0x7eb3, 0xca => 0x6c16, 0xcb => 0x4e43, 0xcc => 0x5976,
+    0xcd => 0x8010, 0xce => 0x5948, 0xcf => 0x5357, 0xd0 => 0x7537,
+    0xd1 => 0x96be, 0xd2 => 0x56ca, 0xd3 => 0x6320, 0xd4 => 0x8111,
+    0xd5 => 0x607c, 0xd6 => 0x95f9, 0xd7 => 0x6dd6, 0xd8 => 0x5462,
+    0xd9 => 0x9981, 0xda => 0x5185, 0xdb => 0x5ae9, 0xdc => 0x80fd,
+    0xdd => 0x59ae, 0xde => 0x9713, 0xdf => 0x502a, 0xe0 => 0x6ce5,
+    0xe1 => 0x5c3c, 0xe2 => 0x62df, 0xe3 => 0x4f60, 0xe4 => 0x533f,
+    0xe5 => 0x817b, 0xe6 => 0x9006, 0xe7 => 0x6eba, 0xe8 => 0x852b,
+    0xe9 => 0x62c8, 0xea => 0x5e74, 0xeb => 0x78be, 0xec => 0x64b5,
+    0xed => 0x637b, 0xee => 0x5ff5, 0xef => 0x5a18, 0xf0 => 0x917f,
+    0xf1 => 0x9e1f, 0xf2 => 0x5c3f, 0xf3 => 0x634f, 0xf4 => 0x8042,
+    0xf5 => 0x5b7d, 0xf6 => 0x556e, 0xf7 => 0x954a, 0xf8 => 0x954d,
+    0xf9 => 0x6d85, 0xfa => 0x60a8, 0xfb => 0x67e0, 0xfc => 0x72de,
+    0xfd => 0x51dd, 0xfe => 0x5b81,
+  },
+  0xc5 => {
+    0xa1 => 0x62e7, 0xa2 => 0x6cde, 0xa3 => 0x725b, 0xa4 => 0x626d,
+    0xa5 => 0x94ae, 0xa6 => 0x7ebd, 0xa7 => 0x8113, 0xa8 => 0x6d53,
+    0xa9 => 0x519c, 0xaa => 0x5f04, 0xab => 0x5974, 0xac => 0x52aa,
+    0xad => 0x6012, 0xae => 0x5973, 0xaf => 0x6696, 0xb0 => 0x8650,
+    0xb1 => 0x759f, 0xb2 => 0x632a, 0xb3 => 0x61e6, 0xb4 => 0x7cef,
+    0xb5 => 0x8bfa, 0xb6 => 0x54e6, 0xb7 => 0x6b27, 0xb8 => 0x9e25,
+    0xb9 => 0x6bb4, 0xba => 0x85d5, 0xbb => 0x5455, 0xbc => 0x5076,
+    0xbd => 0x6ca4, 0xbe => 0x556a, 0xbf => 0x8db4, 0xc0 => 0x722c,
+    0xc1 => 0x5e15, 0xc2 => 0x6015, 0xc3 => 0x7436, 0xc4 => 0x62cd,
+    0xc5 => 0x6392, 0xc6 => 0x724c, 0xc7 => 0x5f98, 0xc8 => 0x6e43,
+    0xc9 => 0x6d3e, 0xca => 0x6500, 0xcb => 0x6f58, 0xcc => 0x76d8,
+    0xcd => 0x78d0, 0xce => 0x76fc, 0xcf => 0x7554, 0xd0 => 0x5224,
+    0xd1 => 0x53db, 0xd2 => 0x4e53, 0xd3 => 0x5e9e, 0xd4 => 0x65c1,
+    0xd5 => 0x802a, 0xd6 => 0x80d6, 0xd7 => 0x629b, 0xd8 => 0x5486,
+    0xd9 => 0x5228, 0xda => 0x70ae, 0xdb => 0x888d, 0xdc => 0x8dd1,
+    0xdd => 0x6ce1, 0xde => 0x5478, 0xdf => 0x80da, 0xe0 => 0x57f9,
+    0xe1 => 0x88f4, 0xe2 => 0x8d54, 0xe3 => 0x966a, 0xe4 => 0x914d,
+    0xe5 => 0x4f69, 0xe6 => 0x6c9b, 0xe7 => 0x55b7, 0xe8 => 0x76c6,
+    0xe9 => 0x7830, 0xea => 0x62a8, 0xeb => 0x70f9, 0xec => 0x6f8e,
+    0xed => 0x5f6d, 0xee => 0x84ec, 0xef => 0x68da, 0xf0 => 0x787c,
+    0xf1 => 0x7bf7, 0xf2 => 0x81a8, 0xf3 => 0x670b, 0xf4 => 0x9e4f,
+    0xf5 => 0x6367, 0xf6 => 0x78b0, 0xf7 => 0x576f, 0xf8 => 0x7812,
+    0xf9 => 0x9739, 0xfa => 0x6279, 0xfb => 0x62ab, 0xfc => 0x5288,
+    0xfd => 0x7435, 0xfe => 0x6bd7,
+  },
+  0xc6 => {
+    0xa1 => 0x5564, 0xa2 => 0x813e, 0xa3 => 0x75b2, 0xa4 => 0x76ae,
+    0xa5 => 0x5339, 0xa6 => 0x75de, 0xa7 => 0x50fb, 0xa8 => 0x5c41,
+    0xa9 => 0x8b6c, 0xaa => 0x7bc7, 0xab => 0x504f, 0xac => 0x7247,
+    0xad => 0x9a97, 0xae => 0x98d8, 0xaf => 0x6f02, 0xb0 => 0x74e2,
+    0xb1 => 0x7968, 0xb2 => 0x6487, 0xb3 => 0x77a5, 0xb4 => 0x62fc,
+    0xb5 => 0x9891, 0xb6 => 0x8d2b, 0xb7 => 0x54c1, 0xb8 => 0x8058,
+    0xb9 => 0x4e52, 0xba => 0x576a, 0xbb => 0x82f9, 0xbc => 0x840d,
+    0xbd => 0x5e73, 0xbe => 0x51ed, 0xbf => 0x74f6, 0xc0 => 0x8bc4,
+    0xc1 => 0x5c4f, 0xc2 => 0x5761, 0xc3 => 0x6cfc, 0xc4 => 0x9887,
+    0xc5 => 0x5a46, 0xc6 => 0x7834, 0xc7 => 0x9b44, 0xc8 => 0x8feb,
+    0xc9 => 0x7c95, 0xca => 0x5256, 0xcb => 0x6251, 0xcc => 0x94fa,
+    0xcd => 0x4ec6, 0xce => 0x8386, 0xcf => 0x8461, 0xd0 => 0x83e9,
+    0xd1 => 0x84b2, 0xd2 => 0x57d4, 0xd3 => 0x6734, 0xd4 => 0x5703,
+    0xd5 => 0x666e, 0xd6 => 0x6d66, 0xd7 => 0x8c31, 0xd8 => 0x66dd,
+    0xd9 => 0x7011, 0xda => 0x671f, 0xdb => 0x6b3a, 0xdc => 0x6816,
+    0xdd => 0x621a, 0xde => 0x59bb, 0xdf => 0x4e03, 0xe0 => 0x51c4,
+    0xe1 => 0x6f06, 0xe2 => 0x67d2, 0xe3 => 0x6c8f, 0xe4 => 0x5176,
+    0xe5 => 0x68cb, 0xe6 => 0x5947, 0xe7 => 0x6b67, 0xe8 => 0x7566,
+    0xe9 => 0x5d0e, 0xea => 0x8110, 0xeb => 0x9f50, 0xec => 0x65d7,
+    0xed => 0x7948, 0xee => 0x7941, 0xef => 0x9a91, 0xf0 => 0x8d77,
+    0xf1 => 0x5c82, 0xf2 => 0x4e5e, 0xf3 => 0x4f01, 0xf4 => 0x542f,
+    0xf5 => 0x5951, 0xf6 => 0x780c, 0xf7 => 0x5668, 0xf8 => 0x6c14,
+    0xf9 => 0x8fc4, 0xfa => 0x5f03, 0xfb => 0x6c7d, 0xfc => 0x6ce3,
+    0xfd => 0x8bab, 0xfe => 0x6390,
+  },
+  0xc7 => {
+    0xa1 => 0x6070, 0xa2 => 0x6d3d, 0xa3 => 0x7275, 0xa4 => 0x6266,
+    0xa5 => 0x948e, 0xa6 => 0x94c5, 0xa7 => 0x5343, 0xa8 => 0x8fc1,
+    0xa9 => 0x7b7e, 0xaa => 0x4edf, 0xab => 0x8c26, 0xac => 0x4e7e,
+    0xad => 0x9ed4, 0xae => 0x94b1, 0xaf => 0x94b3, 0xb0 => 0x524d,
+    0xb1 => 0x6f5c, 0xb2 => 0x9063, 0xb3 => 0x6d45, 0xb4 => 0x8c34,
+    0xb5 => 0x5811, 0xb6 => 0x5d4c, 0xb7 => 0x6b20, 0xb8 => 0x6b49,
+    0xb9 => 0x67aa, 0xba => 0x545b, 0xbb => 0x8154, 0xbc => 0x7f8c,
+    0xbd => 0x5899, 0xbe => 0x8537, 0xbf => 0x5f3a, 0xc0 => 0x62a2,
+    0xc1 => 0x6a47, 0xc2 => 0x9539, 0xc3 => 0x6572, 0xc4 => 0x6084,
+    0xc5 => 0x6865, 0xc6 => 0x77a7, 0xc7 => 0x4e54, 0xc8 => 0x4fa8,
+    0xc9 => 0x5de7, 0xca => 0x9798, 0xcb => 0x64ac, 0xcc => 0x7fd8,
+    0xcd => 0x5ced, 0xce => 0x4fcf, 0xcf => 0x7a8d, 0xd0 => 0x5207,
+    0xd1 => 0x8304, 0xd2 => 0x4e14, 0xd3 => 0x602f, 0xd4 => 0x7a83,
+    0xd5 => 0x94a6, 0xd6 => 0x4fb5, 0xd7 => 0x4eb2, 0xd8 => 0x79e6,
+    0xd9 => 0x7434, 0xda => 0x52e4, 0xdb => 0x82b9, 0xdc => 0x64d2,
+    0xdd => 0x79bd, 0xde => 0x5bdd, 0xdf => 0x6c81, 0xe0 => 0x9752,
+    0xe1 => 0x8f7b, 0xe2 => 0x6c22, 0xe3 => 0x503e, 0xe4 => 0x537f,
+    0xe5 => 0x6e05, 0xe6 => 0x64ce, 0xe7 => 0x6674, 0xe8 => 0x6c30,
+    0xe9 => 0x60c5, 0xea => 0x9877, 0xeb => 0x8bf7, 0xec => 0x5e86,
+    0xed => 0x743c, 0xee => 0x7a77, 0xef => 0x79cb, 0xf0 => 0x4e18,
+    0xf1 => 0x90b1, 0xf2 => 0x7403, 0xf3 => 0x6c42, 0xf4 => 0x56da,
+    0xf5 => 0x914b, 0xf6 => 0x6cc5, 0xf7 => 0x8d8b, 0xf8 => 0x533a,
+    0xf9 => 0x86c6, 0xfa => 0x66f2, 0xfb => 0x8eaf, 0xfc => 0x5c48,
+    0xfd => 0x9a71, 0xfe => 0x6e20,
+  },
+  0xc8 => {
+    0xa1 => 0x53d6, 0xa2 => 0x5a36, 0xa3 => 0x9f8b, 0xa4 => 0x8da3,
+    0xa5 => 0x53bb, 0xa6 => 0x5708, 0xa7 => 0x98a7, 0xa8 => 0x6743,
+    0xa9 => 0x919b, 0xaa => 0x6cc9, 0xab => 0x5168, 0xac => 0x75ca,
+    0xad => 0x62f3, 0xae => 0x72ac, 0xaf => 0x5238, 0xb0 => 0x529d,
+    0xb1 => 0x7f3a, 0xb2 => 0x7094, 0xb3 => 0x7638, 0xb4 => 0x5374,
+    0xb5 => 0x9e4a, 0xb6 => 0x69b7, 0xb7 => 0x786e, 0xb8 => 0x96c0,
+    0xb9 => 0x88d9, 0xba => 0x7fa4, 0xbb => 0x7136, 0xbc => 0x71c3,
+    0xbd => 0x5189, 0xbe => 0x67d3, 0xbf => 0x74e4, 0xc0 => 0x58e4,
+    0xc1 => 0x6518, 0xc2 => 0x56b7, 0xc3 => 0x8ba9, 0xc4 => 0x9976,
+    0xc5 => 0x6270, 0xc6 => 0x7ed5, 0xc7 => 0x60f9, 0xc8 => 0x70ed,
+    0xc9 => 0x58ec, 0xca => 0x4ec1, 0xcb => 0x4eba, 0xcc => 0x5fcd,
+    0xcd => 0x97e7, 0xce => 0x4efb, 0xcf => 0x8ba4, 0xd0 => 0x5203,
+    0xd1 => 0x598a, 0xd2 => 0x7eab, 0xd3 => 0x6254, 0xd4 => 0x4ecd,
+    0xd5 => 0x65e5, 0xd6 => 0x620e, 0xd7 => 0x8338, 0xd8 => 0x84c9,
+    0xd9 => 0x8363, 0xda => 0x878d, 0xdb => 0x7194, 0xdc => 0x6eb6,
+    0xdd => 0x5bb9, 0xde => 0x7ed2, 0xdf => 0x5197, 0xe0 => 0x63c9,
+    0xe1 => 0x67d4, 0xe2 => 0x8089, 0xe3 => 0x8339, 0xe4 => 0x8815,
+    0xe5 => 0x5112, 0xe6 => 0x5b7a, 0xe7 => 0x5982, 0xe8 => 0x8fb1,
+    0xe9 => 0x4e73, 0xea => 0x6c5d, 0xeb => 0x5165, 0xec => 0x8925,
+    0xed => 0x8f6f, 0xee => 0x962e, 0xef => 0x854a, 0xf0 => 0x745e,
+    0xf1 => 0x9510, 0xf2 => 0x95f0, 0xf3 => 0x6da6, 0xf4 => 0x82e5,
+    0xf5 => 0x5f31, 0xf6 => 0x6492, 0xf7 => 0x6d12, 0xf8 => 0x8428,
+    0xf9 => 0x816e, 0xfa => 0x9cc3, 0xfb => 0x585e, 0xfc => 0x8d5b,
+    0xfd => 0x4e09, 0xfe => 0x53c1,
+  },
+  0xc9 => {
+    0xa1 => 0x4f1e, 0xa2 => 0x6563, 0xa3 => 0x6851, 0xa4 => 0x55d3,
+    0xa5 => 0x4e27, 0xa6 => 0x6414, 0xa7 => 0x9a9a, 0xa8 => 0x626b,
+    0xa9 => 0x5ac2, 0xaa => 0x745f, 0xab => 0x8272, 0xac => 0x6da9,
+    0xad => 0x68ee, 0xae => 0x50e7, 0xaf => 0x838e, 0xb0 => 0x7802,
+    0xb1 => 0x6740, 0xb2 => 0x5239, 0xb3 => 0x6c99, 0xb4 => 0x7eb1,
+    0xb5 => 0x50bb, 0xb6 => 0x5565, 0xb7 => 0x715e, 0xb8 => 0x7b5b,
+    0xb9 => 0x6652, 0xba => 0x73ca, 0xbb => 0x82eb, 0xbc => 0x6749,
+    0xbd => 0x5c71, 0xbe => 0x5220, 0xbf => 0x717d, 0xc0 => 0x886b,
+    0xc1 => 0x95ea, 0xc2 => 0x9655, 0xc3 => 0x64c5, 0xc4 => 0x8d61,
+    0xc5 => 0x81b3, 0xc6 => 0x5584, 0xc7 => 0x6c55, 0xc8 => 0x6247,
+    0xc9 => 0x7f2e, 0xca => 0x5892, 0xcb => 0x4f24, 0xcc => 0x5546,
+    0xcd => 0x8d4f, 0xce => 0x664c, 0xcf => 0x4e0a, 0xd0 => 0x5c1a,
+    0xd1 => 0x88f3, 0xd2 => 0x68a2, 0xd3 => 0x634e, 0xd4 => 0x7a0d,
+    0xd5 => 0x70e7, 0xd6 => 0x828d, 0xd7 => 0x52fa, 0xd8 => 0x97f6,
+    0xd9 => 0x5c11, 0xda => 0x54e8, 0xdb => 0x90b5, 0xdc => 0x7ecd,
+    0xdd => 0x5962, 0xde => 0x8d4a, 0xdf => 0x86c7, 0xe0 => 0x820c,
+    0xe1 => 0x820d, 0xe2 => 0x8d66, 0xe3 => 0x6444, 0xe4 => 0x5c04,
+    0xe5 => 0x6151, 0xe6 => 0x6d89, 0xe7 => 0x793e, 0xe8 => 0x8bbe,
+    0xe9 => 0x7837, 0xea => 0x7533, 0xeb => 0x547b, 0xec => 0x4f38,
+    0xed => 0x8eab, 0xee => 0x6df1, 0xef => 0x5a20, 0xf0 => 0x7ec5,
+    0xf1 => 0x795e, 0xf2 => 0x6c88, 0xf3 => 0x5ba1, 0xf4 => 0x5a76,
+    0xf5 => 0x751a, 0xf6 => 0x80be, 0xf7 => 0x614e, 0xf8 => 0x6e17,
+    0xf9 => 0x58f0, 0xfa => 0x751f, 0xfb => 0x7525, 0xfc => 0x7272,
+    0xfd => 0x5347, 0xfe => 0x7ef3,
+  },
+  0xca => {
+    0xa1 => 0x7701, 0xa2 => 0x76db, 0xa3 => 0x5269, 0xa4 => 0x80dc,
+    0xa5 => 0x5723, 0xa6 => 0x5e08, 0xa7 => 0x5931, 0xa8 => 0x72ee,
+    0xa9 => 0x65bd, 0xaa => 0x6e7f, 0xab => 0x8bd7, 0xac => 0x5c38,
+    0xad => 0x8671, 0xae => 0x5341, 0xaf => 0x77f3, 0xb0 => 0x62fe,
+    0xb1 => 0x65f6, 0xb2 => 0x4ec0, 0xb3 => 0x98df, 0xb4 => 0x8680,
+    0xb5 => 0x5b9e, 0xb6 => 0x8bc6, 0xb7 => 0x53f2, 0xb8 => 0x77e2,
+    0xb9 => 0x4f7f, 0xba => 0x5c4e, 0xbb => 0x9a76, 0xbc => 0x59cb,
+    0xbd => 0x5f0f, 0xbe => 0x793a, 0xbf => 0x58eb, 0xc0 => 0x4e16,
+    0xc1 => 0x67ff, 0xc2 => 0x4e8b, 0xc3 => 0x62ed, 0xc4 => 0x8a93,
+    0xc5 => 0x901d, 0xc6 => 0x52bf, 0xc7 => 0x662f, 0xc8 => 0x55dc,
+    0xc9 => 0x566c, 0xca => 0x9002, 0xcb => 0x4ed5, 0xcc => 0x4f8d,
+    0xcd => 0x91ca, 0xce => 0x9970, 0xcf => 0x6c0f, 0xd0 => 0x5e02,
+    0xd1 => 0x6043, 0xd2 => 0x5ba4, 0xd3 => 0x89c6, 0xd4 => 0x8bd5,
+    0xd5 => 0x6536, 0xd6 => 0x624b, 0xd7 => 0x9996, 0xd8 => 0x5b88,
+    0xd9 => 0x5bff, 0xda => 0x6388, 0xdb => 0x552e, 0xdc => 0x53d7,
+    0xdd => 0x7626, 0xde => 0x517d, 0xdf => 0x852c, 0xe0 => 0x67a2,
+    0xe1 => 0x68b3, 0xe2 => 0x6b8a, 0xe3 => 0x6292, 0xe4 => 0x8f93,
+    0xe5 => 0x53d4, 0xe6 => 0x8212, 0xe7 => 0x6dd1, 0xe8 => 0x758f,
+    0xe9 => 0x4e66, 0xea => 0x8d4e, 0xeb => 0x5b70, 0xec => 0x719f,
+    0xed => 0x85af, 0xee => 0x6691, 0xef => 0x66d9, 0xf0 => 0x7f72,
+    0xf1 => 0x8700, 0xf2 => 0x9ecd, 0xf3 => 0x9f20, 0xf4 => 0x5c5e,
+    0xf5 => 0x672f, 0xf6 => 0x8ff0, 0xf7 => 0x6811, 0xf8 => 0x675f,
+    0xf9 => 0x620d, 0xfa => 0x7ad6, 0xfb => 0x5885, 0xfc => 0x5eb6,
+    0xfd => 0x6570, 0xfe => 0x6f31,
+  },
+  0xcb => {
+    0xa1 => 0x6055, 0xa2 => 0x5237, 0xa3 => 0x800d, 0xa4 => 0x6454,
+    0xa5 => 0x8870, 0xa6 => 0x7529, 0xa7 => 0x5e05, 0xa8 => 0x6813,
+    0xa9 => 0x62f4, 0xaa => 0x971c, 0xab => 0x53cc, 0xac => 0x723d,
+    0xad => 0x8c01, 0xae => 0x6c34, 0xaf => 0x7761, 0xb0 => 0x7a0e,
+    0xb1 => 0x542e, 0xb2 => 0x77ac, 0xb3 => 0x987a, 0xb4 => 0x821c,
+    0xb5 => 0x8bf4, 0xb6 => 0x7855, 0xb7 => 0x6714, 0xb8 => 0x70c1,
+    0xb9 => 0x65af, 0xba => 0x6495, 0xbb => 0x5636, 0xbc => 0x601d,
+    0xbd => 0x79c1, 0xbe => 0x53f8, 0xbf => 0x4e1d, 0xc0 => 0x6b7b,
+    0xc1 => 0x8086, 0xc2 => 0x5bfa, 0xc3 => 0x55e3, 0xc4 => 0x56db,
+    0xc5 => 0x4f3a, 0xc6 => 0x4f3c, 0xc7 => 0x9972, 0xc8 => 0x5df3,
+    0xc9 => 0x677e, 0xca => 0x8038, 0xcb => 0x6002, 0xcc => 0x9882,
+    0xcd => 0x9001, 0xce => 0x5b8b, 0xcf => 0x8bbc, 0xd0 => 0x8bf5,
+    0xd1 => 0x641c, 0xd2 => 0x8258, 0xd3 => 0x64de, 0xd4 => 0x55fd,
+    0xd5 => 0x82cf, 0xd6 => 0x9165, 0xd7 => 0x4fd7, 0xd8 => 0x7d20,
+    0xd9 => 0x901f, 0xda => 0x7c9f, 0xdb => 0x50f3, 0xdc => 0x5851,
+    0xdd => 0x6eaf, 0xde => 0x5bbf, 0xdf => 0x8bc9, 0xe0 => 0x8083,
+    0xe1 => 0x9178, 0xe2 => 0x849c, 0xe3 => 0x7b97, 0xe4 => 0x867d,
+    0xe5 => 0x968b, 0xe6 => 0x968f, 0xe7 => 0x7ee5, 0xe8 => 0x9ad3,
+    0xe9 => 0x788e, 0xea => 0x5c81, 0xeb => 0x7a57, 0xec => 0x9042,
+    0xed => 0x96a7, 0xee => 0x795f, 0xef => 0x5b59, 0xf0 => 0x635f,
+    0xf1 => 0x7b0b, 0xf2 => 0x84d1, 0xf3 => 0x68ad, 0xf4 => 0x5506,
+    0xf5 => 0x7f29, 0xf6 => 0x7410, 0xf7 => 0x7d22, 0xf8 => 0x9501,
+    0xf9 => 0x6240, 0xfa => 0x584c, 0xfb => 0x4ed6, 0xfc => 0x5b83,
+    0xfd => 0x5979, 0xfe => 0x5854,
+  },
+  0xcc => {
+    0xa1 => 0x736d, 0xa2 => 0x631e, 0xa3 => 0x8e4b, 0xa4 => 0x8e0f,
+    0xa5 => 0x80ce, 0xa6 => 0x82d4, 0xa7 => 0x62ac, 0xa8 => 0x53f0,
+    0xa9 => 0x6cf0, 0xaa => 0x915e, 0xab => 0x592a, 0xac => 0x6001,
+    0xad => 0x6c70, 0xae => 0x574d, 0xaf => 0x644a, 0xb0 => 0x8d2a,
+    0xb1 => 0x762b, 0xb2 => 0x6ee9, 0xb3 => 0x575b, 0xb4 => 0x6a80,
+    0xb5 => 0x75f0, 0xb6 => 0x6f6d, 0xb7 => 0x8c2d, 0xb8 => 0x8c08,
+    0xb9 => 0x5766, 0xba => 0x6bef, 0xbb => 0x8892, 0xbc => 0x78b3,
+    0xbd => 0x63a2, 0xbe => 0x53f9, 0xbf => 0x70ad, 0xc0 => 0x6c64,
+    0xc1 => 0x5858, 0xc2 => 0x642a, 0xc3 => 0x5802, 0xc4 => 0x68e0,
+    0xc5 => 0x819b, 0xc6 => 0x5510, 0xc7 => 0x7cd6, 0xc8 => 0x5018,
+    0xc9 => 0x8eba, 0xca => 0x6dcc, 0xcb => 0x8d9f, 0xcc => 0x70eb,
+    0xcd => 0x638f, 0xce => 0x6d9b, 0xcf => 0x6ed4, 0xd0 => 0x7ee6,
+    0xd1 => 0x8404, 0xd2 => 0x6843, 0xd3 => 0x9003, 0xd4 => 0x6dd8,
+    0xd5 => 0x9676, 0xd6 => 0x8ba8, 0xd7 => 0x5957, 0xd8 => 0x7279,
+    0xd9 => 0x85e4, 0xda => 0x817e, 0xdb => 0x75bc, 0xdc => 0x8a8a,
+    0xdd => 0x68af, 0xde => 0x5254, 0xdf => 0x8e22, 0xe0 => 0x9511,
+    0xe1 => 0x63d0, 0xe2 => 0x9898, 0xe3 => 0x8e44, 0xe4 => 0x557c,
+    0xe5 => 0x4f53, 0xe6 => 0x66ff, 0xe7 => 0x568f, 0xe8 => 0x60d5,
+    0xe9 => 0x6d95, 0xea => 0x5243, 0xeb => 0x5c49, 0xec => 0x5929,
+    0xed => 0x6dfb, 0xee => 0x586b, 0xef => 0x7530, 0xf0 => 0x751c,
+    0xf1 => 0x606c, 0xf2 => 0x8214, 0xf3 => 0x8146, 0xf4 => 0x6311,
+    0xf5 => 0x6761, 0xf6 => 0x8fe2, 0xf7 => 0x773a, 0xf8 => 0x8df3,
+    0xf9 => 0x8d34, 0xfa => 0x94c1, 0xfb => 0x5e16, 0xfc => 0x5385,
+    0xfd => 0x542c, 0xfe => 0x70c3,
+  },
+  0xcd => {
+    0xa1 => 0x6c40, 0xa2 => 0x5ef7, 0xa3 => 0x505c, 0xa4 => 0x4ead,
+    0xa5 => 0x5ead, 0xa6 => 0x633a, 0xa7 => 0x8247, 0xa8 => 0x901a,
+    0xa9 => 0x6850, 0xaa => 0x916e, 0xab => 0x77b3, 0xac => 0x540c,
+    0xad => 0x94dc, 0xae => 0x5f64, 0xaf => 0x7ae5, 0xb0 => 0x6876,
+    0xb1 => 0x6345, 0xb2 => 0x7b52, 0xb3 => 0x7edf, 0xb4 => 0x75db,
+    0xb5 => 0x5077, 0xb6 => 0x6295, 0xb7 => 0x5934, 0xb8 => 0x900f,
+    0xb9 => 0x51f8, 0xba => 0x79c3, 0xbb => 0x7a81, 0xbc => 0x56fe,
+    0xbd => 0x5f92, 0xbe => 0x9014, 0xbf => 0x6d82, 0xc0 => 0x5c60,
+    0xc1 => 0x571f, 0xc2 => 0x5410, 0xc3 => 0x5154, 0xc4 => 0x6e4d,
+    0xc5 => 0x56e2, 0xc6 => 0x63a8, 0xc7 => 0x9893, 0xc8 => 0x817f,
+    0xc9 => 0x8715, 0xca => 0x892a, 0xcb => 0x9000, 0xcc => 0x541e,
+    0xcd => 0x5c6f, 0xce => 0x81c0, 0xcf => 0x62d6, 0xd0 => 0x6258,
+    0xd1 => 0x8131, 0xd2 => 0x9e35, 0xd3 => 0x9640, 0xd4 => 0x9a6e,
+    0xd5 => 0x9a7c, 0xd6 => 0x692d, 0xd7 => 0x59a5, 0xd8 => 0x62d3,
+    0xd9 => 0x553e, 0xda => 0x6316, 0xdb => 0x54c7, 0xdc => 0x86d9,
+    0xdd => 0x6d3c, 0xde => 0x5a03, 0xdf => 0x74e6, 0xe0 => 0x889c,
+    0xe1 => 0x6b6a, 0xe2 => 0x5916, 0xe3 => 0x8c4c, 0xe4 => 0x5f2f,
+    0xe5 => 0x6e7e, 0xe6 => 0x73a9, 0xe7 => 0x987d, 0xe8 => 0x4e38,
+    0xe9 => 0x70f7, 0xea => 0x5b8c, 0xeb => 0x7897, 0xec => 0x633d,
+    0xed => 0x665a, 0xee => 0x7696, 0xef => 0x60cb, 0xf0 => 0x5b9b,
+    0xf1 => 0x5a49, 0xf2 => 0x4e07, 0xf3 => 0x8155, 0xf4 => 0x6c6a,
+    0xf5 => 0x738b, 0xf6 => 0x4ea1, 0xf7 => 0x6789, 0xf8 => 0x7f51,
+    0xf9 => 0x5f80, 0xfa => 0x65fa, 0xfb => 0x671b, 0xfc => 0x5fd8,
+    0xfd => 0x5984, 0xfe => 0x5a01,
+  },
+  0xce => {
+    0xa1 => 0x5dcd, 0xa2 => 0x5fae, 0xa3 => 0x5371, 0xa4 => 0x97e6,
+    0xa5 => 0x8fdd, 0xa6 => 0x6845, 0xa7 => 0x56f4, 0xa8 => 0x552f,
+    0xa9 => 0x60df, 0xaa => 0x4e3a, 0xab => 0x6f4d, 0xac => 0x7ef4,
+    0xad => 0x82c7, 0xae => 0x840e, 0xaf => 0x59d4, 0xb0 => 0x4f1f,
+    0xb1 => 0x4f2a, 0xb2 => 0x5c3e, 0xb3 => 0x7eac, 0xb4 => 0x672a,
+    0xb5 => 0x851a, 0xb6 => 0x5473, 0xb7 => 0x754f, 0xb8 => 0x80c3,
+    0xb9 => 0x5582, 0xba => 0x9b4f, 0xbb => 0x4f4d, 0xbc => 0x6e2d,
+    0xbd => 0x8c13, 0xbe => 0x5c09, 0xbf => 0x6170, 0xc0 => 0x536b,
+    0xc1 => 0x761f, 0xc2 => 0x6e29, 0xc3 => 0x868a, 0xc4 => 0x6587,
+    0xc5 => 0x95fb, 0xc6 => 0x7eb9, 0xc7 => 0x543b, 0xc8 => 0x7a33,
+    0xc9 => 0x7d0a, 0xca => 0x95ee, 0xcb => 0x55e1, 0xcc => 0x7fc1,
+    0xcd => 0x74ee, 0xce => 0x631d, 0xcf => 0x8717, 0xd0 => 0x6da1,
+    0xd1 => 0x7a9d, 0xd2 => 0x6211, 0xd3 => 0x65a1, 0xd4 => 0x5367,
+    0xd5 => 0x63e1, 0xd6 => 0x6c83, 0xd7 => 0x5deb, 0xd8 => 0x545c,
+    0xd9 => 0x94a8, 0xda => 0x4e4c, 0xdb => 0x6c61, 0xdc => 0x8bec,
+    0xdd => 0x5c4b, 0xde => 0x65e0, 0xdf => 0x829c, 0xe0 => 0x68a7,
+    0xe1 => 0x543e, 0xe2 => 0x5434, 0xe3 => 0x6bcb, 0xe4 => 0x6b66,
+    0xe5 => 0x4e94, 0xe6 => 0x6342, 0xe7 => 0x5348, 0xe8 => 0x821e,
+    0xe9 => 0x4f0d, 0xea => 0x4fae, 0xeb => 0x575e, 0xec => 0x620a,
+    0xed => 0x96fe, 0xee => 0x6664, 0xef => 0x7269, 0xf0 => 0x52ff,
+    0xf1 => 0x52a1, 0xf2 => 0x609f, 0xf3 => 0x8bef, 0xf4 => 0x6614,
+    0xf5 => 0x7199, 0xf6 => 0x6790, 0xf7 => 0x897f, 0xf8 => 0x7852,
+    0xf9 => 0x77fd, 0xfa => 0x6670, 0xfb => 0x563b, 0xfc => 0x5438,
+    0xfd => 0x9521, 0xfe => 0x727a,
+  },
+  0xcf => {
+    0xa1 => 0x7a00, 0xa2 => 0x606f, 0xa3 => 0x5e0c, 0xa4 => 0x6089,
+    0xa5 => 0x819d, 0xa6 => 0x5915, 0xa7 => 0x60dc, 0xa8 => 0x7184,
+    0xa9 => 0x70ef, 0xaa => 0x6eaa, 0xab => 0x6c50, 0xac => 0x7280,
+    0xad => 0x6a84, 0xae => 0x88ad, 0xaf => 0x5e2d, 0xb0 => 0x4e60,
+    0xb1 => 0x5ab3, 0xb2 => 0x559c, 0xb3 => 0x94e3, 0xb4 => 0x6d17,
+    0xb5 => 0x7cfb, 0xb6 => 0x9699, 0xb7 => 0x620f, 0xb8 => 0x7ec6,
+    0xb9 => 0x778e, 0xba => 0x867e, 0xbb => 0x5323, 0xbc => 0x971e,
+    0xbd => 0x8f96, 0xbe => 0x6687, 0xbf => 0x5ce1, 0xc0 => 0x4fa0,
+    0xc1 => 0x72ed, 0xc2 => 0x4e0b, 0xc3 => 0x53a6, 0xc4 => 0x590f,
+    0xc5 => 0x5413, 0xc6 => 0x6380, 0xc7 => 0x9528, 0xc8 => 0x5148,
+    0xc9 => 0x4ed9, 0xca => 0x9c9c, 0xcb => 0x7ea4, 0xcc => 0x54b8,
+    0xcd => 0x8d24, 0xce => 0x8854, 0xcf => 0x8237, 0xd0 => 0x95f2,
+    0xd1 => 0x6d8e, 0xd2 => 0x5f26, 0xd3 => 0x5acc, 0xd4 => 0x663e,
+    0xd5 => 0x9669, 0xd6 => 0x73b0, 0xd7 => 0x732e, 0xd8 => 0x53bf,
+    0xd9 => 0x817a, 0xda => 0x9985, 0xdb => 0x7fa1, 0xdc => 0x5baa,
+    0xdd => 0x9677, 0xde => 0x9650, 0xdf => 0x7ebf, 0xe0 => 0x76f8,
+    0xe1 => 0x53a2, 0xe2 => 0x9576, 0xe3 => 0x9999, 0xe4 => 0x7bb1,
+    0xe5 => 0x8944, 0xe6 => 0x6e58, 0xe7 => 0x4e61, 0xe8 => 0x7fd4,
+    0xe9 => 0x7965, 0xea => 0x8be6, 0xeb => 0x60f3, 0xec => 0x54cd,
+    0xed => 0x4eab, 0xee => 0x9879, 0xef => 0x5df7, 0xf0 => 0x6a61,
+    0xf1 => 0x50cf, 0xf2 => 0x5411, 0xf3 => 0x8c61, 0xf4 => 0x8427,
+    0xf5 => 0x785d, 0xf6 => 0x9704, 0xf7 => 0x524a, 0xf8 => 0x54ee,
+    0xf9 => 0x56a3, 0xfa => 0x9500, 0xfb => 0x6d88, 0xfc => 0x5bb5,
+    0xfd => 0x6dc6, 0xfe => 0x6653,
+  },
+  0xd0 => {
+    0xa1 => 0x5c0f, 0xa2 => 0x5b5d, 0xa3 => 0x6821, 0xa4 => 0x8096,
+    0xa5 => 0x5578, 0xa6 => 0x7b11, 0xa7 => 0x6548, 0xa8 => 0x6954,
+    0xa9 => 0x4e9b, 0xaa => 0x6b47, 0xab => 0x874e, 0xac => 0x978b,
+    0xad => 0x534f, 0xae => 0x631f, 0xaf => 0x643a, 0xb0 => 0x90aa,
+    0xb1 => 0x659c, 0xb2 => 0x80c1, 0xb3 => 0x8c10, 0xb4 => 0x5199,
+    0xb5 => 0x68b0, 0xb6 => 0x5378, 0xb7 => 0x87f9, 0xb8 => 0x61c8,
+    0xb9 => 0x6cc4, 0xba => 0x6cfb, 0xbb => 0x8c22, 0xbc => 0x5c51,
+    0xbd => 0x85aa, 0xbe => 0x82af, 0xbf => 0x950c, 0xc0 => 0x6b23,
+    0xc1 => 0x8f9b, 0xc2 => 0x65b0, 0xc3 => 0x5ffb, 0xc4 => 0x5fc3,
+    0xc5 => 0x4fe1, 0xc6 => 0x8845, 0xc7 => 0x661f, 0xc8 => 0x8165,
+    0xc9 => 0x7329, 0xca => 0x60fa, 0xcb => 0x5174, 0xcc => 0x5211,
+    0xcd => 0x578b, 0xce => 0x5f62, 0xcf => 0x90a2, 0xd0 => 0x884c,
+    0xd1 => 0x9192, 0xd2 => 0x5e78, 0xd3 => 0x674f, 0xd4 => 0x6027,
+    0xd5 => 0x59d3, 0xd6 => 0x5144, 0xd7 => 0x51f6, 0xd8 => 0x80f8,
+    0xd9 => 0x5308, 0xda => 0x6c79, 0xdb => 0x96c4, 0xdc => 0x718a,
+    0xdd => 0x4f11, 0xde => 0x4fee, 0xdf => 0x7f9e, 0xe0 => 0x673d,
+    0xe1 => 0x55c5, 0xe2 => 0x9508, 0xe3 => 0x79c0, 0xe4 => 0x8896,
+    0xe5 => 0x7ee3, 0xe6 => 0x589f, 0xe7 => 0x620c, 0xe8 => 0x9700,
+    0xe9 => 0x865a, 0xea => 0x5618, 0xeb => 0x987b, 0xec => 0x5f90,
+    0xed => 0x8bb8, 0xee => 0x84c4, 0xef => 0x9157, 0xf0 => 0x53d9,
+    0xf1 => 0x65ed, 0xf2 => 0x5e8f, 0xf3 => 0x755c, 0xf4 => 0x6064,
+    0xf5 => 0x7d6e, 0xf6 => 0x5a7f, 0xf7 => 0x7eea, 0xf8 => 0x7eed,
+    0xf9 => 0x8f69, 0xfa => 0x55a7, 0xfb => 0x5ba3, 0xfc => 0x60ac,
+    0xfd => 0x65cb, 0xfe => 0x7384,
+  },
+  0xd1 => {
+    0xa1 => 0x9009, 0xa2 => 0x7663, 0xa3 => 0x7729, 0xa4 => 0x7eda,
+    0xa5 => 0x9774, 0xa6 => 0x859b, 0xa7 => 0x5b66, 0xa8 => 0x7a74,
+    0xa9 => 0x96ea, 0xaa => 0x8840, 0xab => 0x52cb, 0xac => 0x718f,
+    0xad => 0x5faa, 0xae => 0x65ec, 0xaf => 0x8be2, 0xb0 => 0x5bfb,
+    0xb1 => 0x9a6f, 0xb2 => 0x5de1, 0xb3 => 0x6b89, 0xb4 => 0x6c5b,
+    0xb5 => 0x8bad, 0xb6 => 0x8baf, 0xb7 => 0x900a, 0xb8 => 0x8fc5,
+    0xb9 => 0x538b, 0xba => 0x62bc, 0xbb => 0x9e26, 0xbc => 0x9e2d,
+    0xbd => 0x5440, 0xbe => 0x4e2b, 0xbf => 0x82bd, 0xc0 => 0x7259,
+    0xc1 => 0x869c, 0xc2 => 0x5d16, 0xc3 => 0x8859, 0xc4 => 0x6daf,
+    0xc5 => 0x96c5, 0xc6 => 0x54d1, 0xc7 => 0x4e9a, 0xc8 => 0x8bb6,
+    0xc9 => 0x7109, 0xca => 0x54bd, 0xcb => 0x9609, 0xcc => 0x70df,
+    0xcd => 0x6df9, 0xce => 0x76d0, 0xcf => 0x4e25, 0xd0 => 0x7814,
+    0xd1 => 0x8712, 0xd2 => 0x5ca9, 0xd3 => 0x5ef6, 0xd4 => 0x8a00,
+    0xd5 => 0x989c, 0xd6 => 0x960e, 0xd7 => 0x708e, 0xd8 => 0x6cbf,
+    0xd9 => 0x5944, 0xda => 0x63a9, 0xdb => 0x773c, 0xdc => 0x884d,
+    0xdd => 0x6f14, 0xde => 0x8273, 0xdf => 0x5830, 0xe0 => 0x71d5,
+    0xe1 => 0x538c, 0xe2 => 0x781a, 0xe3 => 0x96c1, 0xe4 => 0x5501,
+    0xe5 => 0x5f66, 0xe6 => 0x7130, 0xe7 => 0x5bb4, 0xe8 => 0x8c1a,
+    0xe9 => 0x9a8c, 0xea => 0x6b83, 0xeb => 0x592e, 0xec => 0x9e2f,
+    0xed => 0x79e7, 0xee => 0x6768, 0xef => 0x626c, 0xf0 => 0x4f6f,
+    0xf1 => 0x75a1, 0xf2 => 0x7f8a, 0xf3 => 0x6d0b, 0xf4 => 0x9633,
+    0xf5 => 0x6c27, 0xf6 => 0x4ef0, 0xf7 => 0x75d2, 0xf8 => 0x517b,
+    0xf9 => 0x6837, 0xfa => 0x6f3e, 0xfb => 0x9080, 0xfc => 0x8170,
+    0xfd => 0x5996, 0xfe => 0x7476,
+  },
+  0xd2 => {
+    0xa1 => 0x6447, 0xa2 => 0x5c27, 0xa3 => 0x9065, 0xa4 => 0x7a91,
+    0xa5 => 0x8c23, 0xa6 => 0x59da, 0xa7 => 0x54ac, 0xa8 => 0x8200,
+    0xa9 => 0x836f, 0xaa => 0x8981, 0xab => 0x8000, 0xac => 0x6930,
+    0xad => 0x564e, 0xae => 0x8036, 0xaf => 0x7237, 0xb0 => 0x91ce,
+    0xb1 => 0x51b6, 0xb2 => 0x4e5f, 0xb3 => 0x9875, 0xb4 => 0x6396,
+    0xb5 => 0x4e1a, 0xb6 => 0x53f6, 0xb7 => 0x66f3, 0xb8 => 0x814b,
+    0xb9 => 0x591c, 0xba => 0x6db2, 0xbb => 0x4e00, 0xbc => 0x58f9,
+    0xbd => 0x533b, 0xbe => 0x63d6, 0xbf => 0x94f1, 0xc0 => 0x4f9d,
+    0xc1 => 0x4f0a, 0xc2 => 0x8863, 0xc3 => 0x9890, 0xc4 => 0x5937,
+    0xc5 => 0x9057, 0xc6 => 0x79fb, 0xc7 => 0x4eea, 0xc8 => 0x80f0,
+    0xc9 => 0x7591, 0xca => 0x6c82, 0xcb => 0x5b9c, 0xcc => 0x59e8,
+    0xcd => 0x5f5d, 0xce => 0x6905, 0xcf => 0x8681, 0xd0 => 0x501a,
+    0xd1 => 0x5df2, 0xd2 => 0x4e59, 0xd3 => 0x77e3, 0xd4 => 0x4ee5,
+    0xd5 => 0x827a, 0xd6 => 0x6291, 0xd7 => 0x6613, 0xd8 => 0x9091,
+    0xd9 => 0x5c79, 0xda => 0x4ebf, 0xdb => 0x5f79, 0xdc => 0x81c6,
+    0xdd => 0x9038, 0xde => 0x8084, 0xdf => 0x75ab, 0xe0 => 0x4ea6,
+    0xe1 => 0x88d4, 0xe2 => 0x610f, 0xe3 => 0x6bc5, 0xe4 => 0x5fc6,
+    0xe5 => 0x4e49, 0xe6 => 0x76ca, 0xe7 => 0x6ea2, 0xe8 => 0x8be3,
+    0xe9 => 0x8bae, 0xea => 0x8c0a, 0xeb => 0x8bd1, 0xec => 0x5f02,
+    0xed => 0x7ffc, 0xee => 0x7fcc, 0xef => 0x7ece, 0xf0 => 0x8335,
+    0xf1 => 0x836b, 0xf2 => 0x56e0, 0xf3 => 0x6bb7, 0xf4 => 0x97f3,
+    0xf5 => 0x9634, 0xf6 => 0x59fb, 0xf7 => 0x541f, 0xf8 => 0x94f6,
+    0xf9 => 0x6deb, 0xfa => 0x5bc5, 0xfb => 0x996e, 0xfc => 0x5c39,
+    0xfd => 0x5f15, 0xfe => 0x9690,
+  },
+  0xd3 => {
+    0xa1 => 0x5370, 0xa2 => 0x82f1, 0xa3 => 0x6a31, 0xa4 => 0x5a74,
+    0xa5 => 0x9e70, 0xa6 => 0x5e94, 0xa7 => 0x7f28, 0xa8 => 0x83b9,
+    0xa9 => 0x8424, 0xaa => 0x8425, 0xab => 0x8367, 0xac => 0x8747,
+    0xad => 0x8fce, 0xae => 0x8d62, 0xaf => 0x76c8, 0xb0 => 0x5f71,
+    0xb1 => 0x9896, 0xb2 => 0x786c, 0xb3 => 0x6620, 0xb4 => 0x54df,
+    0xb5 => 0x62e5, 0xb6 => 0x4f63, 0xb7 => 0x81c3, 0xb8 => 0x75c8,
+    0xb9 => 0x5eb8, 0xba => 0x96cd, 0xbb => 0x8e0a, 0xbc => 0x86f9,
+    0xbd => 0x548f, 0xbe => 0x6cf3, 0xbf => 0x6d8c, 0xc0 => 0x6c38,
+    0xc1 => 0x607f, 0xc2 => 0x52c7, 0xc3 => 0x7528, 0xc4 => 0x5e7d,
+    0xc5 => 0x4f18, 0xc6 => 0x60a0, 0xc7 => 0x5fe7, 0xc8 => 0x5c24,
+    0xc9 => 0x7531, 0xca => 0x90ae, 0xcb => 0x94c0, 0xcc => 0x72b9,
+    0xcd => 0x6cb9, 0xce => 0x6e38, 0xcf => 0x9149, 0xd0 => 0x6709,
+    0xd1 => 0x53cb, 0xd2 => 0x53f3, 0xd3 => 0x4f51, 0xd4 => 0x91c9,
+    0xd5 => 0x8bf1, 0xd6 => 0x53c8, 0xd7 => 0x5e7c, 0xd8 => 0x8fc2,
+    0xd9 => 0x6de4, 0xda => 0x4e8e, 0xdb => 0x76c2, 0xdc => 0x6986,
+    0xdd => 0x865e, 0xde => 0x611a, 0xdf => 0x8206, 0xe0 => 0x4f59,
+    0xe1 => 0x4fde, 0xe2 => 0x903e, 0xe3 => 0x9c7c, 0xe4 => 0x6109,
+    0xe5 => 0x6e1d, 0xe6 => 0x6e14, 0xe7 => 0x9685, 0xe8 => 0x4e88,
+    0xe9 => 0x5a31, 0xea => 0x96e8, 0xeb => 0x4e0e, 0xec => 0x5c7f,
+    0xed => 0x79b9, 0xee => 0x5b87, 0xef => 0x8bed, 0xf0 => 0x7fbd,
+    0xf1 => 0x7389, 0xf2 => 0x57df, 0xf3 => 0x828b, 0xf4 => 0x90c1,
+    0xf5 => 0x5401, 0xf6 => 0x9047, 0xf7 => 0x55bb, 0xf8 => 0x5cea,
+    0xf9 => 0x5fa1, 0xfa => 0x6108, 0xfb => 0x6b32, 0xfc => 0x72f1,
+    0xfd => 0x80b2, 0xfe => 0x8a89,
+  },
+  0xd4 => {
+    0xa1 => 0x6d74, 0xa2 => 0x5bd3, 0xa3 => 0x88d5, 0xa4 => 0x9884,
+    0xa5 => 0x8c6b, 0xa6 => 0x9a6d, 0xa7 => 0x9e33, 0xa8 => 0x6e0a,
+    0xa9 => 0x51a4, 0xaa => 0x5143, 0xab => 0x57a3, 0xac => 0x8881,
+    0xad => 0x539f, 0xae => 0x63f4, 0xaf => 0x8f95, 0xb0 => 0x56ed,
+    0xb1 => 0x5458, 0xb2 => 0x5706, 0xb3 => 0x733f, 0xb4 => 0x6e90,
+    0xb5 => 0x7f18, 0xb6 => 0x8fdc, 0xb7 => 0x82d1, 0xb8 => 0x613f,
+    0xb9 => 0x6028, 0xba => 0x9662, 0xbb => 0x66f0, 0xbc => 0x7ea6,
+    0xbd => 0x8d8a, 0xbe => 0x8dc3, 0xbf => 0x94a5, 0xc0 => 0x5cb3,
+    0xc1 => 0x7ca4, 0xc2 => 0x6708, 0xc3 => 0x60a6, 0xc4 => 0x9605,
+    0xc5 => 0x8018, 0xc6 => 0x4e91, 0xc7 => 0x90e7, 0xc8 => 0x5300,
+    0xc9 => 0x9668, 0xca => 0x5141, 0xcb => 0x8fd0, 0xcc => 0x8574,
+    0xcd => 0x915d, 0xce => 0x6655, 0xcf => 0x97f5, 0xd0 => 0x5b55,
+    0xd1 => 0x531d, 0xd2 => 0x7838, 0xd3 => 0x6742, 0xd4 => 0x683d,
+    0xd5 => 0x54c9, 0xd6 => 0x707e, 0xd7 => 0x5bb0, 0xd8 => 0x8f7d,
+    0xd9 => 0x518d, 0xda => 0x5728, 0xdb => 0x54b1, 0xdc => 0x6512,
+    0xdd => 0x6682, 0xde => 0x8d5e, 0xdf => 0x8d43, 0xe0 => 0x810f,
+    0xe1 => 0x846c, 0xe2 => 0x906d, 0xe3 => 0x7cdf, 0xe4 => 0x51ff,
+    0xe5 => 0x85fb, 0xe6 => 0x67a3, 0xe7 => 0x65e9, 0xe8 => 0x6fa1,
+    0xe9 => 0x86a4, 0xea => 0x8e81, 0xeb => 0x566a, 0xec => 0x9020,
+    0xed => 0x7682, 0xee => 0x7076, 0xef => 0x71e5, 0xf0 => 0x8d23,
+    0xf1 => 0x62e9, 0xf2 => 0x5219, 0xf3 => 0x6cfd, 0xf4 => 0x8d3c,
+    0xf5 => 0x600e, 0xf6 => 0x589e, 0xf7 => 0x618e, 0xf8 => 0x66fe,
+    0xf9 => 0x8d60, 0xfa => 0x624e, 0xfb => 0x55b3, 0xfc => 0x6e23,
+    0xfd => 0x672d, 0xfe => 0x8f67,
+  },
+  0xd5 => {
+    0xa1 => 0x94e1, 0xa2 => 0x95f8, 0xa3 => 0x7728, 0xa4 => 0x6805,
+    0xa5 => 0x69a8, 0xa6 => 0x548b, 0xa7 => 0x4e4d, 0xa8 => 0x70b8,
+    0xa9 => 0x8bc8, 0xaa => 0x6458, 0xab => 0x658b, 0xac => 0x5b85,
+    0xad => 0x7a84, 0xae => 0x503a, 0xaf => 0x5be8, 0xb0 => 0x77bb,
+    0xb1 => 0x6be1, 0xb2 => 0x8a79, 0xb3 => 0x7c98, 0xb4 => 0x6cbe,
+    0xb5 => 0x76cf, 0xb6 => 0x65a9, 0xb7 => 0x8f97, 0xb8 => 0x5d2d,
+    0xb9 => 0x5c55, 0xba => 0x8638, 0xbb => 0x6808, 0xbc => 0x5360,
+    0xbd => 0x6218, 0xbe => 0x7ad9, 0xbf => 0x6e5b, 0xc0 => 0x7efd,
+    0xc1 => 0x6a1f, 0xc2 => 0x7ae0, 0xc3 => 0x5f70, 0xc4 => 0x6f33,
+    0xc5 => 0x5f20, 0xc6 => 0x638c, 0xc7 => 0x6da8, 0xc8 => 0x6756,
+    0xc9 => 0x4e08, 0xca => 0x5e10, 0xcb => 0x8d26, 0xcc => 0x4ed7,
+    0xcd => 0x80c0, 0xce => 0x7634, 0xcf => 0x969c, 0xd0 => 0x62db,
+    0xd1 => 0x662d, 0xd2 => 0x627e, 0xd3 => 0x6cbc, 0xd4 => 0x8d75,
+    0xd5 => 0x7167, 0xd6 => 0x7f69, 0xd7 => 0x5146, 0xd8 => 0x8087,
+    0xd9 => 0x53ec, 0xda => 0x906e, 0xdb => 0x6298, 0xdc => 0x54f2,
+    0xdd => 0x86f0, 0xde => 0x8f99, 0xdf => 0x8005, 0xe0 => 0x9517,
+    0xe1 => 0x8517, 0xe2 => 0x8fd9, 0xe3 => 0x6d59, 0xe4 => 0x73cd,
+    0xe5 => 0x659f, 0xe6 => 0x771f, 0xe7 => 0x7504, 0xe8 => 0x7827,
+    0xe9 => 0x81fb, 0xea => 0x8d1e, 0xeb => 0x9488, 0xec => 0x4fa6,
+    0xed => 0x6795, 0xee => 0x75b9, 0xef => 0x8bca, 0xf0 => 0x9707,
+    0xf1 => 0x632f, 0xf2 => 0x9547, 0xf3 => 0x9635, 0xf4 => 0x84b8,
+    0xf5 => 0x6323, 0xf6 => 0x7741, 0xf7 => 0x5f81, 0xf8 => 0x72f0,
+    0xf9 => 0x4e89, 0xfa => 0x6014, 0xfb => 0x6574, 0xfc => 0x62ef,
+    0xfd => 0x6b63, 0xfe => 0x653f,
+  },
+  0xd6 => {
+    0xa1 => 0x5e27, 0xa2 => 0x75c7, 0xa3 => 0x90d1, 0xa4 => 0x8bc1,
+    0xa5 => 0x829d, 0xa6 => 0x679d, 0xa7 => 0x652f, 0xa8 => 0x5431,
+    0xa9 => 0x8718, 0xaa => 0x77e5, 0xab => 0x80a2, 0xac => 0x8102,
+    0xad => 0x6c41, 0xae => 0x4e4b, 0xaf => 0x7ec7, 0xb0 => 0x804c,
+    0xb1 => 0x76f4, 0xb2 => 0x690d, 0xb3 => 0x6b96, 0xb4 => 0x6267,
+    0xb5 => 0x503c, 0xb6 => 0x4f84, 0xb7 => 0x5740, 0xb8 => 0x6307,
+    0xb9 => 0x6b62, 0xba => 0x8dbe, 0xbb => 0x53ea, 0xbc => 0x65e8,
+    0xbd => 0x7eb8, 0xbe => 0x5fd7, 0xbf => 0x631a, 0xc0 => 0x63b7,
+    0xc1 => 0x81f3, 0xc2 => 0x81f4, 0xc3 => 0x7f6e, 0xc4 => 0x5e1c,
+    0xc5 => 0x5cd9, 0xc6 => 0x5236, 0xc7 => 0x667a, 0xc8 => 0x79e9,
+    0xc9 => 0x7a1a, 0xca => 0x8d28, 0xcb => 0x7099, 0xcc => 0x75d4,
+    0xcd => 0x6ede, 0xce => 0x6cbb, 0xcf => 0x7a92, 0xd0 => 0x4e2d,
+    0xd1 => 0x76c5, 0xd2 => 0x5fe0, 0xd3 => 0x949f, 0xd4 => 0x8877,
+    0xd5 => 0x7ec8, 0xd6 => 0x79cd, 0xd7 => 0x80bf, 0xd8 => 0x91cd,
+    0xd9 => 0x4ef2, 0xda => 0x4f17, 0xdb => 0x821f, 0xdc => 0x5468,
+    0xdd => 0x5dde, 0xde => 0x6d32, 0xdf => 0x8bcc, 0xe0 => 0x7ca5,
+    0xe1 => 0x8f74, 0xe2 => 0x8098, 0xe3 => 0x5e1a, 0xe4 => 0x5492,
+    0xe5 => 0x76b1, 0xe6 => 0x5b99, 0xe7 => 0x663c, 0xe8 => 0x9aa4,
+    0xe9 => 0x73e0, 0xea => 0x682a, 0xeb => 0x86db, 0xec => 0x6731,
+    0xed => 0x732a, 0xee => 0x8bf8, 0xef => 0x8bdb, 0xf0 => 0x9010,
+    0xf1 => 0x7af9, 0xf2 => 0x70db, 0xf3 => 0x716e, 0xf4 => 0x62c4,
+    0xf5 => 0x77a9, 0xf6 => 0x5631, 0xf7 => 0x4e3b, 0xf8 => 0x8457,
+    0xf9 => 0x67f1, 0xfa => 0x52a9, 0xfb => 0x86c0, 0xfc => 0x8d2e,
+    0xfd => 0x94f8, 0xfe => 0x7b51,
+  },
+  0xd7 => {
+    0xa1 => 0x4f4f, 0xa2 => 0x6ce8, 0xa3 => 0x795d, 0xa4 => 0x9a7b,
+    0xa5 => 0x6293, 0xa6 => 0x722a, 0xa7 => 0x62fd, 0xa8 => 0x4e13,
+    0xa9 => 0x7816, 0xaa => 0x8f6c, 0xab => 0x64b0, 0xac => 0x8d5a,
+    0xad => 0x7bc6, 0xae => 0x6869, 0xaf => 0x5e84, 0xb0 => 0x88c5,
+    0xb1 => 0x5986, 0xb2 => 0x649e, 0xb3 => 0x58ee, 0xb4 => 0x72b6,
+    0xb5 => 0x690e, 0xb6 => 0x9525, 0xb7 => 0x8ffd, 0xb8 => 0x8d58,
+    0xb9 => 0x5760, 0xba => 0x7f00, 0xbb => 0x8c06, 0xbc => 0x51c6,
+    0xbd => 0x6349, 0xbe => 0x62d9, 0xbf => 0x5353, 0xc0 => 0x684c,
+    0xc1 => 0x7422, 0xc2 => 0x8301, 0xc3 => 0x914c, 0xc4 => 0x5544,
+    0xc5 => 0x7740, 0xc6 => 0x707c, 0xc7 => 0x6d4a, 0xc8 => 0x5179,
+    0xc9 => 0x54a8, 0xca => 0x8d44, 0xcb => 0x59ff, 0xcc => 0x6ecb,
+    0xcd => 0x6dc4, 0xce => 0x5b5c, 0xcf => 0x7d2b, 0xd0 => 0x4ed4,
+    0xd1 => 0x7c7d, 0xd2 => 0x6ed3, 0xd3 => 0x5b50, 0xd4 => 0x81ea,
+    0xd5 => 0x6e0d, 0xd6 => 0x5b57, 0xd7 => 0x9b03, 0xd8 => 0x68d5,
+    0xd9 => 0x8e2a, 0xda => 0x5b97, 0xdb => 0x7efc, 0xdc => 0x603b,
+    0xdd => 0x7eb5, 0xde => 0x90b9, 0xdf => 0x8d70, 0xe0 => 0x594f,
+    0xe1 => 0x63cd, 0xe2 => 0x79df, 0xe3 => 0x8db3, 0xe4 => 0x5352,
+    0xe5 => 0x65cf, 0xe6 => 0x7956, 0xe7 => 0x8bc5, 0xe8 => 0x963b,
+    0xe9 => 0x7ec4, 0xea => 0x94bb, 0xeb => 0x7e82, 0xec => 0x5634,
+    0xed => 0x9189, 0xee => 0x6700, 0xef => 0x7f6a, 0xf0 => 0x5c0a,
+    0xf1 => 0x9075, 0xf2 => 0x6628, 0xf3 => 0x5de6, 0xf4 => 0x4f50,
+    0xf5 => 0x67de, 0xf6 => 0x505a, 0xf7 => 0x4f5c, 0xf8 => 0x5750,
+    0xf9 => 0x5ea7,
+  },
+  0xd8 => {
+    0xa1 => 0x4e8d, 0xa2 => 0x4e0c, 0xa3 => 0x5140, 0xa4 => 0x4e10,
+    0xa5 => 0x5eff, 0xa6 => 0x5345, 0xa7 => 0x4e15, 0xa8 => 0x4e98,
+    0xa9 => 0x4e1e, 0xaa => 0x9b32, 0xab => 0x5b6c, 0xac => 0x5669,
+    0xad => 0x4e28, 0xae => 0x79ba, 0xaf => 0x4e3f, 0xb0 => 0x5315,
+    0xb1 => 0x4e47, 0xb2 => 0x592d, 0xb3 => 0x723b, 0xb4 => 0x536e,
+    0xb5 => 0x6c10, 0xb6 => 0x56df, 0xb7 => 0x80e4, 0xb8 => 0x9997,
+    0xb9 => 0x6bd3, 0xba => 0x777e, 0xbb => 0x9f17, 0xbc => 0x4e36,
+    0xbd => 0x4e9f, 0xbe => 0x9f10, 0xbf => 0x4e5c, 0xc0 => 0x4e69,
+    0xc1 => 0x4e93, 0xc2 => 0x8288, 0xc3 => 0x5b5b, 0xc4 => 0x556c,
+    0xc5 => 0x560f, 0xc6 => 0x4ec4, 0xc7 => 0x538d, 0xc8 => 0x539d,
+    0xc9 => 0x53a3, 0xca => 0x53a5, 0xcb => 0x53ae, 0xcc => 0x9765,
+    0xcd => 0x8d5d, 0xce => 0x531a, 0xcf => 0x53f5, 0xd0 => 0x5326,
+    0xd1 => 0x532e, 0xd2 => 0x533e, 0xd3 => 0x8d5c, 0xd4 => 0x5366,
+    0xd5 => 0x5363, 0xd6 => 0x5202, 0xd7 => 0x5208, 0xd8 => 0x520e,
+    0xd9 => 0x522d, 0xda => 0x5233, 0xdb => 0x523f, 0xdc => 0x5240,
+    0xdd => 0x524c, 0xde => 0x525e, 0xdf => 0x5261, 0xe0 => 0x525c,
+    0xe1 => 0x84af, 0xe2 => 0x527d, 0xe3 => 0x5282, 0xe4 => 0x5281,
+    0xe5 => 0x5290, 0xe6 => 0x5293, 0xe7 => 0x5182, 0xe8 => 0x7f54,
+    0xe9 => 0x4ebb, 0xea => 0x4ec3, 0xeb => 0x4ec9, 0xec => 0x4ec2,
+    0xed => 0x4ee8, 0xee => 0x4ee1, 0xef => 0x4eeb, 0xf0 => 0x4ede,
+    0xf1 => 0x4f1b, 0xf2 => 0x4ef3, 0xf3 => 0x4f22, 0xf4 => 0x4f64,
+    0xf5 => 0x4ef5, 0xf6 => 0x4f25, 0xf7 => 0x4f27, 0xf8 => 0x4f09,
+    0xf9 => 0x4f2b, 0xfa => 0x4f5e, 0xfb => 0x4f67, 0xfc => 0x6538,
+    0xfd => 0x4f5a, 0xfe => 0x4f5d,
+  },
+  0xd9 => {
+    0xa1 => 0x4f5f, 0xa2 => 0x4f57, 0xa3 => 0x4f32, 0xa4 => 0x4f3d,
+    0xa5 => 0x4f76, 0xa6 => 0x4f74, 0xa7 => 0x4f91, 0xa8 => 0x4f89,
+    0xa9 => 0x4f83, 0xaa => 0x4f8f, 0xab => 0x4f7e, 0xac => 0x4f7b,
+    0xad => 0x4faa, 0xae => 0x4f7c, 0xaf => 0x4fac, 0xb0 => 0x4f94,
+    0xb1 => 0x4fe6, 0xb2 => 0x4fe8, 0xb3 => 0x4fea, 0xb4 => 0x4fc5,
+    0xb5 => 0x4fda, 0xb6 => 0x4fe3, 0xb7 => 0x4fdc, 0xb8 => 0x4fd1,
+    0xb9 => 0x4fdf, 0xba => 0x4ff8, 0xbb => 0x5029, 0xbc => 0x504c,
+    0xbd => 0x4ff3, 0xbe => 0x502c, 0xbf => 0x500f, 0xc0 => 0x502e,
+    0xc1 => 0x502d, 0xc2 => 0x4ffe, 0xc3 => 0x501c, 0xc4 => 0x500c,
+    0xc5 => 0x5025, 0xc6 => 0x5028, 0xc7 => 0x507e, 0xc8 => 0x5043,
+    0xc9 => 0x5055, 0xca => 0x5048, 0xcb => 0x504e, 0xcc => 0x506c,
+    0xcd => 0x507b, 0xce => 0x50a5, 0xcf => 0x50a7, 0xd0 => 0x50a9,
+    0xd1 => 0x50ba, 0xd2 => 0x50d6, 0xd3 => 0x5106, 0xd4 => 0x50ed,
+    0xd5 => 0x50ec, 0xd6 => 0x50e6, 0xd7 => 0x50ee, 0xd8 => 0x5107,
+    0xd9 => 0x510b, 0xda => 0x4edd, 0xdb => 0x6c3d, 0xdc => 0x4f58,
+    0xdd => 0x4f65, 0xde => 0x4fce, 0xdf => 0x9fa0, 0xe0 => 0x6c46,
+    0xe1 => 0x7c74, 0xe2 => 0x516e, 0xe3 => 0x5dfd, 0xe4 => 0x9ec9,
+    0xe5 => 0x9998, 0xe6 => 0x5181, 0xe7 => 0x5914, 0xe8 => 0x52f9,
+    0xe9 => 0x530d, 0xea => 0x8a07, 0xeb => 0x5310, 0xec => 0x51eb,
+    0xed => 0x5919, 0xee => 0x5155, 0xef => 0x4ea0, 0xf0 => 0x5156,
+    0xf1 => 0x4eb3, 0xf2 => 0x886e, 0xf3 => 0x88a4, 0xf4 => 0x4eb5,
+    0xf5 => 0x8114, 0xf6 => 0x88d2, 0xf7 => 0x7980, 0xf8 => 0x5b34,
+    0xf9 => 0x8803, 0xfa => 0x7fb8, 0xfb => 0x51ab, 0xfc => 0x51b1,
+    0xfd => 0x51bd, 0xfe => 0x51bc,
+  },
+  0xda => {
+    0xa1 => 0x51c7, 0xa2 => 0x5196, 0xa3 => 0x51a2, 0xa4 => 0x51a5,
+    0xa5 => 0x8ba0, 0xa6 => 0x8ba6, 0xa7 => 0x8ba7, 0xa8 => 0x8baa,
+    0xa9 => 0x8bb4, 0xaa => 0x8bb5, 0xab => 0x8bb7, 0xac => 0x8bc2,
+    0xad => 0x8bc3, 0xae => 0x8bcb, 0xaf => 0x8bcf, 0xb0 => 0x8bce,
+    0xb1 => 0x8bd2, 0xb2 => 0x8bd3, 0xb3 => 0x8bd4, 0xb4 => 0x8bd6,
+    0xb5 => 0x8bd8, 0xb6 => 0x8bd9, 0xb7 => 0x8bdc, 0xb8 => 0x8bdf,
+    0xb9 => 0x8be0, 0xba => 0x8be4, 0xbb => 0x8be8, 0xbc => 0x8be9,
+    0xbd => 0x8bee, 0xbe => 0x8bf0, 0xbf => 0x8bf3, 0xc0 => 0x8bf6,
+    0xc1 => 0x8bf9, 0xc2 => 0x8bfc, 0xc3 => 0x8bff, 0xc4 => 0x8c00,
+    0xc5 => 0x8c02, 0xc6 => 0x8c04, 0xc7 => 0x8c07, 0xc8 => 0x8c0c,
+    0xc9 => 0x8c0f, 0xca => 0x8c11, 0xcb => 0x8c12, 0xcc => 0x8c14,
+    0xcd => 0x8c15, 0xce => 0x8c16, 0xcf => 0x8c19, 0xd0 => 0x8c1b,
+    0xd1 => 0x8c18, 0xd2 => 0x8c1d, 0xd3 => 0x8c1f, 0xd4 => 0x8c20,
+    0xd5 => 0x8c21, 0xd6 => 0x8c25, 0xd7 => 0x8c27, 0xd8 => 0x8c2a,
+    0xd9 => 0x8c2b, 0xda => 0x8c2e, 0xdb => 0x8c2f, 0xdc => 0x8c32,
+    0xdd => 0x8c33, 0xde => 0x8c35, 0xdf => 0x8c36, 0xe0 => 0x5369,
+    0xe1 => 0x537a, 0xe2 => 0x961d, 0xe3 => 0x9622, 0xe4 => 0x9621,
+    0xe5 => 0x9631, 0xe6 => 0x962a, 0xe7 => 0x963d, 0xe8 => 0x963c,
+    0xe9 => 0x9642, 0xea => 0x9649, 0xeb => 0x9654, 0xec => 0x965f,
+    0xed => 0x9667, 0xee => 0x966c, 0xef => 0x9672, 0xf0 => 0x9674,
+    0xf1 => 0x9688, 0xf2 => 0x968d, 0xf3 => 0x9697, 0xf4 => 0x96b0,
+    0xf5 => 0x9097, 0xf6 => 0x909b, 0xf7 => 0x909d, 0xf8 => 0x9099,
+    0xf9 => 0x90ac, 0xfa => 0x90a1, 0xfb => 0x90b4, 0xfc => 0x90b3,
+    0xfd => 0x90b6, 0xfe => 0x90ba,
+  },
+  0xdb => {
+    0xa1 => 0x90b8, 0xa2 => 0x90b0, 0xa3 => 0x90cf, 0xa4 => 0x90c5,
+    0xa5 => 0x90be, 0xa6 => 0x90d0, 0xa7 => 0x90c4, 0xa8 => 0x90c7,
+    0xa9 => 0x90d3, 0xaa => 0x90e6, 0xab => 0x90e2, 0xac => 0x90dc,
+    0xad => 0x90d7, 0xae => 0x90db, 0xaf => 0x90eb, 0xb0 => 0x90ef,
+    0xb1 => 0x90fe, 0xb2 => 0x9104, 0xb3 => 0x9122, 0xb4 => 0x911e,
+    0xb5 => 0x9123, 0xb6 => 0x9131, 0xb7 => 0x912f, 0xb8 => 0x9139,
+    0xb9 => 0x9143, 0xba => 0x9146, 0xbb => 0x520d, 0xbc => 0x5942,
+    0xbd => 0x52a2, 0xbe => 0x52ac, 0xbf => 0x52ad, 0xc0 => 0x52be,
+    0xc1 => 0x54ff, 0xc2 => 0x52d0, 0xc3 => 0x52d6, 0xc4 => 0x52f0,
+    0xc5 => 0x53df, 0xc6 => 0x71ee, 0xc7 => 0x77cd, 0xc8 => 0x5ef4,
+    0xc9 => 0x51f5, 0xca => 0x51fc, 0xcb => 0x9b2f, 0xcc => 0x53b6,
+    0xcd => 0x5f01, 0xce => 0x755a, 0xcf => 0x5def, 0xd0 => 0x574c,
+    0xd1 => 0x57a9, 0xd2 => 0x57a1, 0xd3 => 0x587e, 0xd4 => 0x58bc,
+    0xd5 => 0x58c5, 0xd6 => 0x58d1, 0xd7 => 0x5729, 0xd8 => 0x572c,
+    0xd9 => 0x572a, 0xda => 0x5733, 0xdb => 0x5739, 0xdc => 0x572e,
+    0xdd => 0x572f, 0xde => 0x575c, 0xdf => 0x573b, 0xe0 => 0x5742,
+    0xe1 => 0x5769, 0xe2 => 0x5785, 0xe3 => 0x576b, 0xe4 => 0x5786,
+    0xe5 => 0x577c, 0xe6 => 0x577b, 0xe7 => 0x5768, 0xe8 => 0x576d,
+    0xe9 => 0x5776, 0xea => 0x5773, 0xeb => 0x57ad, 0xec => 0x57a4,
+    0xed => 0x578c, 0xee => 0x57b2, 0xef => 0x57cf, 0xf0 => 0x57a7,
+    0xf1 => 0x57b4, 0xf2 => 0x5793, 0xf3 => 0x57a0, 0xf4 => 0x57d5,
+    0xf5 => 0x57d8, 0xf6 => 0x57da, 0xf7 => 0x57d9, 0xf8 => 0x57d2,
+    0xf9 => 0x57b8, 0xfa => 0x57f4, 0xfb => 0x57ef, 0xfc => 0x57f8,
+    0xfd => 0x57e4, 0xfe => 0x57dd,
+  },
+  0xdc => {
+    0xa1 => 0x580b, 0xa2 => 0x580d, 0xa3 => 0x57fd, 0xa4 => 0x57ed,
+    0xa5 => 0x5800, 0xa6 => 0x581e, 0xa7 => 0x5819, 0xa8 => 0x5844,
+    0xa9 => 0x5820, 0xaa => 0x5865, 0xab => 0x586c, 0xac => 0x5881,
+    0xad => 0x5889, 0xae => 0x589a, 0xaf => 0x5880, 0xb0 => 0x99a8,
+    0xb1 => 0x9f19, 0xb2 => 0x61ff, 0xb3 => 0x8279, 0xb4 => 0x827d,
+    0xb5 => 0x827f, 0xb6 => 0x828f, 0xb7 => 0x828a, 0xb8 => 0x82a8,
+    0xb9 => 0x8284, 0xba => 0x828e, 0xbb => 0x8291, 0xbc => 0x8297,
+    0xbd => 0x8299, 0xbe => 0x82ab, 0xbf => 0x82b8, 0xc0 => 0x82be,
+    0xc1 => 0x82b0, 0xc2 => 0x82c8, 0xc3 => 0x82ca, 0xc4 => 0x82e3,
+    0xc5 => 0x8298, 0xc6 => 0x82b7, 0xc7 => 0x82ae, 0xc8 => 0x82cb,
+    0xc9 => 0x82cc, 0xca => 0x82c1, 0xcb => 0x82a9, 0xcc => 0x82b4,
+    0xcd => 0x82a1, 0xce => 0x82aa, 0xcf => 0x829f, 0xd0 => 0x82c4,
+    0xd1 => 0x82ce, 0xd2 => 0x82a4, 0xd3 => 0x82e1, 0xd4 => 0x8309,
+    0xd5 => 0x82f7, 0xd6 => 0x82e4, 0xd7 => 0x830f, 0xd8 => 0x8307,
+    0xd9 => 0x82dc, 0xda => 0x82f4, 0xdb => 0x82d2, 0xdc => 0x82d8,
+    0xdd => 0x830c, 0xde => 0x82fb, 0xdf => 0x82d3, 0xe0 => 0x8311,
+    0xe1 => 0x831a, 0xe2 => 0x8306, 0xe3 => 0x8314, 0xe4 => 0x8315,
+    0xe5 => 0x82e0, 0xe6 => 0x82d5, 0xe7 => 0x831c, 0xe8 => 0x8351,
+    0xe9 => 0x835b, 0xea => 0x835c, 0xeb => 0x8308, 0xec => 0x8392,
+    0xed => 0x833c, 0xee => 0x8334, 0xef => 0x8331, 0xf0 => 0x839b,
+    0xf1 => 0x835e, 0xf2 => 0x832f, 0xf3 => 0x834f, 0xf4 => 0x8347,
+    0xf5 => 0x8343, 0xf6 => 0x835f, 0xf7 => 0x8340, 0xf8 => 0x8317,
+    0xf9 => 0x8360, 0xfa => 0x832d, 0xfb => 0x833a, 0xfc => 0x8333,
+    0xfd => 0x8366, 0xfe => 0x8365,
+  },
+  0xdd => {
+    0xa1 => 0x8368, 0xa2 => 0x831b, 0xa3 => 0x8369, 0xa4 => 0x836c,
+    0xa5 => 0x836a, 0xa6 => 0x836d, 0xa7 => 0x836e, 0xa8 => 0x83b0,
+    0xa9 => 0x8378, 0xaa => 0x83b3, 0xab => 0x83b4, 0xac => 0x83a0,
+    0xad => 0x83aa, 0xae => 0x8393, 0xaf => 0x839c, 0xb0 => 0x8385,
+    0xb1 => 0x837c, 0xb2 => 0x83b6, 0xb3 => 0x83a9, 0xb4 => 0x837d,
+    0xb5 => 0x83b8, 0xb6 => 0x837b, 0xb7 => 0x8398, 0xb8 => 0x839e,
+    0xb9 => 0x83a8, 0xba => 0x83ba, 0xbb => 0x83bc, 0xbc => 0x83c1,
+    0xbd => 0x8401, 0xbe => 0x83e5, 0xbf => 0x83d8, 0xc0 => 0x5807,
+    0xc1 => 0x8418, 0xc2 => 0x840b, 0xc3 => 0x83dd, 0xc4 => 0x83fd,
+    0xc5 => 0x83d6, 0xc6 => 0x841c, 0xc7 => 0x8438, 0xc8 => 0x8411,
+    0xc9 => 0x8406, 0xca => 0x83d4, 0xcb => 0x83df, 0xcc => 0x840f,
+    0xcd => 0x8403, 0xce => 0x83f8, 0xcf => 0x83f9, 0xd0 => 0x83ea,
+    0xd1 => 0x83c5, 0xd2 => 0x83c0, 0xd3 => 0x8426, 0xd4 => 0x83f0,
+    0xd5 => 0x83e1, 0xd6 => 0x845c, 0xd7 => 0x8451, 0xd8 => 0x845a,
+    0xd9 => 0x8459, 0xda => 0x8473, 0xdb => 0x8487, 0xdc => 0x8488,
+    0xdd => 0x847a, 0xde => 0x8489, 0xdf => 0x8478, 0xe0 => 0x843c,
+    0xe1 => 0x8446, 0xe2 => 0x8469, 0xe3 => 0x8476, 0xe4 => 0x848c,
+    0xe5 => 0x848e, 0xe6 => 0x8431, 0xe7 => 0x846d, 0xe8 => 0x84c1,
+    0xe9 => 0x84cd, 0xea => 0x84d0, 0xeb => 0x84e6, 0xec => 0x84bd,
+    0xed => 0x84d3, 0xee => 0x84ca, 0xef => 0x84bf, 0xf0 => 0x84ba,
+    0xf1 => 0x84e0, 0xf2 => 0x84a1, 0xf3 => 0x84b9, 0xf4 => 0x84b4,
+    0xf5 => 0x8497, 0xf6 => 0x84e5, 0xf7 => 0x84e3, 0xf8 => 0x850c,
+    0xf9 => 0x750d, 0xfa => 0x8538, 0xfb => 0x84f0, 0xfc => 0x8539,
+    0xfd => 0x851f, 0xfe => 0x853a,
+  },
+  0xde => {
+    0xa1 => 0x8556, 0xa2 => 0x853b, 0xa3 => 0x84ff, 0xa4 => 0x84fc,
+    0xa5 => 0x8559, 0xa6 => 0x8548, 0xa7 => 0x8568, 0xa8 => 0x8564,
+    0xa9 => 0x855e, 0xaa => 0x857a, 0xab => 0x77a2, 0xac => 0x8543,
+    0xad => 0x8572, 0xae => 0x857b, 0xaf => 0x85a4, 0xb0 => 0x85a8,
+    0xb1 => 0x8587, 0xb2 => 0x858f, 0xb3 => 0x8579, 0xb4 => 0x85ae,
+    0xb5 => 0x859c, 0xb6 => 0x8585, 0xb7 => 0x85b9, 0xb8 => 0x85b7,
+    0xb9 => 0x85b0, 0xba => 0x85d3, 0xbb => 0x85c1, 0xbc => 0x85dc,
+    0xbd => 0x85ff, 0xbe => 0x8627, 0xbf => 0x8605, 0xc0 => 0x8629,
+    0xc1 => 0x8616, 0xc2 => 0x863c, 0xc3 => 0x5efe, 0xc4 => 0x5f08,
+    0xc5 => 0x593c, 0xc6 => 0x5941, 0xc7 => 0x8037, 0xc8 => 0x5955,
+    0xc9 => 0x595a, 0xca => 0x5958, 0xcb => 0x530f, 0xcc => 0x5c22,
+    0xcd => 0x5c25, 0xce => 0x5c2c, 0xcf => 0x5c34, 0xd0 => 0x624c,
+    0xd1 => 0x626a, 0xd2 => 0x629f, 0xd3 => 0x62bb, 0xd4 => 0x62ca,
+    0xd5 => 0x62da, 0xd6 => 0x62d7, 0xd7 => 0x62ee, 0xd8 => 0x6322,
+    0xd9 => 0x62f6, 0xda => 0x6339, 0xdb => 0x634b, 0xdc => 0x6343,
+    0xdd => 0x63ad, 0xde => 0x63f6, 0xdf => 0x6371, 0xe0 => 0x637a,
+    0xe1 => 0x638e, 0xe2 => 0x63b4, 0xe3 => 0x636d, 0xe4 => 0x63ac,
+    0xe5 => 0x638a, 0xe6 => 0x6369, 0xe7 => 0x63ae, 0xe8 => 0x63bc,
+    0xe9 => 0x63f2, 0xea => 0x63f8, 0xeb => 0x63e0, 0xec => 0x63ff,
+    0xed => 0x63c4, 0xee => 0x63de, 0xef => 0x63ce, 0xf0 => 0x6452,
+    0xf1 => 0x63c6, 0xf2 => 0x63be, 0xf3 => 0x6445, 0xf4 => 0x6441,
+    0xf5 => 0x640b, 0xf6 => 0x641b, 0xf7 => 0x6420, 0xf8 => 0x640c,
+    0xf9 => 0x6426, 0xfa => 0x6421, 0xfb => 0x645e, 0xfc => 0x6484,
+    0xfd => 0x646d, 0xfe => 0x6496,
+  },
+  0xdf => {
+    0xa1 => 0x647a, 0xa2 => 0x64b7, 0xa3 => 0x64b8, 0xa4 => 0x6499,
+    0xa5 => 0x64ba, 0xa6 => 0x64c0, 0xa7 => 0x64d0, 0xa8 => 0x64d7,
+    0xa9 => 0x64e4, 0xaa => 0x64e2, 0xab => 0x6509, 0xac => 0x6525,
+    0xad => 0x652e, 0xae => 0x5f0b, 0xaf => 0x5fd2, 0xb0 => 0x7519,
+    0xb1 => 0x5f11, 0xb2 => 0x535f, 0xb3 => 0x53f1, 0xb4 => 0x53fd,
+    0xb5 => 0x53e9, 0xb6 => 0x53e8, 0xb7 => 0x53fb, 0xb8 => 0x5412,
+    0xb9 => 0x5416, 0xba => 0x5406, 0xbb => 0x544b, 0xbc => 0x5452,
+    0xbd => 0x5453, 0xbe => 0x5454, 0xbf => 0x5456, 0xc0 => 0x5443,
+    0xc1 => 0x5421, 0xc2 => 0x5457, 0xc3 => 0x5459, 0xc4 => 0x5423,
+    0xc5 => 0x5432, 0xc6 => 0x5482, 0xc7 => 0x5494, 0xc8 => 0x5477,
+    0xc9 => 0x5471, 0xca => 0x5464, 0xcb => 0x549a, 0xcc => 0x549b,
+    0xcd => 0x5484, 0xce => 0x5476, 0xcf => 0x5466, 0xd0 => 0x549d,
+    0xd1 => 0x54d0, 0xd2 => 0x54ad, 0xd3 => 0x54c2, 0xd4 => 0x54b4,
+    0xd5 => 0x54d2, 0xd6 => 0x54a7, 0xd7 => 0x54a6, 0xd8 => 0x54d3,
+    0xd9 => 0x54d4, 0xda => 0x5472, 0xdb => 0x54a3, 0xdc => 0x54d5,
+    0xdd => 0x54bb, 0xde => 0x54bf, 0xdf => 0x54cc, 0xe0 => 0x54d9,
+    0xe1 => 0x54da, 0xe2 => 0x54dc, 0xe3 => 0x54a9, 0xe4 => 0x54aa,
+    0xe5 => 0x54a4, 0xe6 => 0x54dd, 0xe7 => 0x54cf, 0xe8 => 0x54de,
+    0xe9 => 0x551b, 0xea => 0x54e7, 0xeb => 0x5520, 0xec => 0x54fd,
+    0xed => 0x5514, 0xee => 0x54f3, 0xef => 0x5522, 0xf0 => 0x5523,
+    0xf1 => 0x550f, 0xf2 => 0x5511, 0xf3 => 0x5527, 0xf4 => 0x552a,
+    0xf5 => 0x5567, 0xf6 => 0x558f, 0xf7 => 0x55b5, 0xf8 => 0x5549,
+    0xf9 => 0x556d, 0xfa => 0x5541, 0xfb => 0x5555, 0xfc => 0x553f,
+    0xfd => 0x5550, 0xfe => 0x553c,
+  },
+  0xe0 => {
+    0xa1 => 0x5537, 0xa2 => 0x5556, 0xa3 => 0x5575, 0xa4 => 0x5576,
+    0xa5 => 0x5577, 0xa6 => 0x5533, 0xa7 => 0x5530, 0xa8 => 0x555c,
+    0xa9 => 0x558b, 0xaa => 0x55d2, 0xab => 0x5583, 0xac => 0x55b1,
+    0xad => 0x55b9, 0xae => 0x5588, 0xaf => 0x5581, 0xb0 => 0x559f,
+    0xb1 => 0x557e, 0xb2 => 0x55d6, 0xb3 => 0x5591, 0xb4 => 0x557b,
+    0xb5 => 0x55df, 0xb6 => 0x55bd, 0xb7 => 0x55be, 0xb8 => 0x5594,
+    0xb9 => 0x5599, 0xba => 0x55ea, 0xbb => 0x55f7, 0xbc => 0x55c9,
+    0xbd => 0x561f, 0xbe => 0x55d1, 0xbf => 0x55eb, 0xc0 => 0x55ec,
+    0xc1 => 0x55d4, 0xc2 => 0x55e6, 0xc3 => 0x55dd, 0xc4 => 0x55c4,
+    0xc5 => 0x55ef, 0xc6 => 0x55e5, 0xc7 => 0x55f2, 0xc8 => 0x55f3,
+    0xc9 => 0x55cc, 0xca => 0x55cd, 0xcb => 0x55e8, 0xcc => 0x55f5,
+    0xcd => 0x55e4, 0xce => 0x8f94, 0xcf => 0x561e, 0xd0 => 0x5608,
+    0xd1 => 0x560c, 0xd2 => 0x5601, 0xd3 => 0x5624, 0xd4 => 0x5623,
+    0xd5 => 0x55fe, 0xd6 => 0x5600, 0xd7 => 0x5627, 0xd8 => 0x562d,
+    0xd9 => 0x5658, 0xda => 0x5639, 0xdb => 0x5657, 0xdc => 0x562c,
+    0xdd => 0x564d, 0xde => 0x5662, 0xdf => 0x5659, 0xe0 => 0x565c,
+    0xe1 => 0x564c, 0xe2 => 0x5654, 0xe3 => 0x5686, 0xe4 => 0x5664,
+    0xe5 => 0x5671, 0xe6 => 0x566b, 0xe7 => 0x567b, 0xe8 => 0x567c,
+    0xe9 => 0x5685, 0xea => 0x5693, 0xeb => 0x56af, 0xec => 0x56d4,
+    0xed => 0x56d7, 0xee => 0x56dd, 0xef => 0x56e1, 0xf0 => 0x56f5,
+    0xf1 => 0x56eb, 0xf2 => 0x56f9, 0xf3 => 0x56ff, 0xf4 => 0x5704,
+    0xf5 => 0x570a, 0xf6 => 0x5709, 0xf7 => 0x571c, 0xf8 => 0x5e0f,
+    0xf9 => 0x5e19, 0xfa => 0x5e14, 0xfb => 0x5e11, 0xfc => 0x5e31,
+    0xfd => 0x5e3b, 0xfe => 0x5e3c,
+  },
+  0xe1 => {
+    0xa1 => 0x5e37, 0xa2 => 0x5e44, 0xa3 => 0x5e54, 0xa4 => 0x5e5b,
+    0xa5 => 0x5e5e, 0xa6 => 0x5e61, 0xa7 => 0x5c8c, 0xa8 => 0x5c7a,
+    0xa9 => 0x5c8d, 0xaa => 0x5c90, 0xab => 0x5c96, 0xac => 0x5c88,
+    0xad => 0x5c98, 0xae => 0x5c99, 0xaf => 0x5c91, 0xb0 => 0x5c9a,
+    0xb1 => 0x5c9c, 0xb2 => 0x5cb5, 0xb3 => 0x5ca2, 0xb4 => 0x5cbd,
+    0xb5 => 0x5cac, 0xb6 => 0x5cab, 0xb7 => 0x5cb1, 0xb8 => 0x5ca3,
+    0xb9 => 0x5cc1, 0xba => 0x5cb7, 0xbb => 0x5cc4, 0xbc => 0x5cd2,
+    0xbd => 0x5ce4, 0xbe => 0x5ccb, 0xbf => 0x5ce5, 0xc0 => 0x5d02,
+    0xc1 => 0x5d03, 0xc2 => 0x5d27, 0xc3 => 0x5d26, 0xc4 => 0x5d2e,
+    0xc5 => 0x5d24, 0xc6 => 0x5d1e, 0xc7 => 0x5d06, 0xc8 => 0x5d1b,
+    0xc9 => 0x5d58, 0xca => 0x5d3e, 0xcb => 0x5d34, 0xcc => 0x5d3d,
+    0xcd => 0x5d6c, 0xce => 0x5d5b, 0xcf => 0x5d6f, 0xd0 => 0x5d5d,
+    0xd1 => 0x5d6b, 0xd2 => 0x5d4b, 0xd3 => 0x5d4a, 0xd4 => 0x5d69,
+    0xd5 => 0x5d74, 0xd6 => 0x5d82, 0xd7 => 0x5d99, 0xd8 => 0x5d9d,
+    0xd9 => 0x8c73, 0xda => 0x5db7, 0xdb => 0x5dc5, 0xdc => 0x5f73,
+    0xdd => 0x5f77, 0xde => 0x5f82, 0xdf => 0x5f87, 0xe0 => 0x5f89,
+    0xe1 => 0x5f8c, 0xe2 => 0x5f95, 0xe3 => 0x5f99, 0xe4 => 0x5f9c,
+    0xe5 => 0x5fa8, 0xe6 => 0x5fad, 0xe7 => 0x5fb5, 0xe8 => 0x5fbc,
+    0xe9 => 0x8862, 0xea => 0x5f61, 0xeb => 0x72ad, 0xec => 0x72b0,
+    0xed => 0x72b4, 0xee => 0x72b7, 0xef => 0x72b8, 0xf0 => 0x72c3,
+    0xf1 => 0x72c1, 0xf2 => 0x72ce, 0xf3 => 0x72cd, 0xf4 => 0x72d2,
+    0xf5 => 0x72e8, 0xf6 => 0x72ef, 0xf7 => 0x72e9, 0xf8 => 0x72f2,
+    0xf9 => 0x72f4, 0xfa => 0x72f7, 0xfb => 0x7301, 0xfc => 0x72f3,
+    0xfd => 0x7303, 0xfe => 0x72fa,
+  },
+  0xe2 => {
+    0xa1 => 0x72fb, 0xa2 => 0x7317, 0xa3 => 0x7313, 0xa4 => 0x7321,
+    0xa5 => 0x730a, 0xa6 => 0x731e, 0xa7 => 0x731d, 0xa8 => 0x7315,
+    0xa9 => 0x7322, 0xaa => 0x7339, 0xab => 0x7325, 0xac => 0x732c,
+    0xad => 0x7338, 0xae => 0x7331, 0xaf => 0x7350, 0xb0 => 0x734d,
+    0xb1 => 0x7357, 0xb2 => 0x7360, 0xb3 => 0x736c, 0xb4 => 0x736f,
+    0xb5 => 0x737e, 0xb6 => 0x821b, 0xb7 => 0x5925, 0xb8 => 0x98e7,
+    0xb9 => 0x5924, 0xba => 0x5902, 0xbb => 0x9963, 0xbc => 0x9967,
+    0xbd => 0x9968, 0xbe => 0x9969, 0xbf => 0x996a, 0xc0 => 0x996b,
+    0xc1 => 0x996c, 0xc2 => 0x9974, 0xc3 => 0x9977, 0xc4 => 0x997d,
+    0xc5 => 0x9980, 0xc6 => 0x9984, 0xc7 => 0x9987, 0xc8 => 0x998a,
+    0xc9 => 0x998d, 0xca => 0x9990, 0xcb => 0x9991, 0xcc => 0x9993,
+    0xcd => 0x9994, 0xce => 0x9995, 0xcf => 0x5e80, 0xd0 => 0x5e91,
+    0xd1 => 0x5e8b, 0xd2 => 0x5e96, 0xd3 => 0x5ea5, 0xd4 => 0x5ea0,
+    0xd5 => 0x5eb9, 0xd6 => 0x5eb5, 0xd7 => 0x5ebe, 0xd8 => 0x5eb3,
+    0xd9 => 0x8d53, 0xda => 0x5ed2, 0xdb => 0x5ed1, 0xdc => 0x5edb,
+    0xdd => 0x5ee8, 0xde => 0x5eea, 0xdf => 0x81ba, 0xe0 => 0x5fc4,
+    0xe1 => 0x5fc9, 0xe2 => 0x5fd6, 0xe3 => 0x5fcf, 0xe4 => 0x6003,
+    0xe5 => 0x5fee, 0xe6 => 0x6004, 0xe7 => 0x5fe1, 0xe8 => 0x5fe4,
+    0xe9 => 0x5ffe, 0xea => 0x6005, 0xeb => 0x6006, 0xec => 0x5fea,
+    0xed => 0x5fed, 0xee => 0x5ff8, 0xef => 0x6019, 0xf0 => 0x6035,
+    0xf1 => 0x6026, 0xf2 => 0x601b, 0xf3 => 0x600f, 0xf4 => 0x600d,
+    0xf5 => 0x6029, 0xf6 => 0x602b, 0xf7 => 0x600a, 0xf8 => 0x603f,
+    0xf9 => 0x6021, 0xfa => 0x6078, 0xfb => 0x6079, 0xfc => 0x607b,
+    0xfd => 0x607a, 0xfe => 0x6042,
+  },
+  0xe3 => {
+    0xa1 => 0x606a, 0xa2 => 0x607d, 0xa3 => 0x6096, 0xa4 => 0x609a,
+    0xa5 => 0x60ad, 0xa6 => 0x609d, 0xa7 => 0x6083, 0xa8 => 0x6092,
+    0xa9 => 0x608c, 0xaa => 0x609b, 0xab => 0x60ec, 0xac => 0x60bb,
+    0xad => 0x60b1, 0xae => 0x60dd, 0xaf => 0x60d8, 0xb0 => 0x60c6,
+    0xb1 => 0x60da, 0xb2 => 0x60b4, 0xb3 => 0x6120, 0xb4 => 0x6126,
+    0xb5 => 0x6115, 0xb6 => 0x6123, 0xb7 => 0x60f4, 0xb8 => 0x6100,
+    0xb9 => 0x610e, 0xba => 0x612b, 0xbb => 0x614a, 0xbc => 0x6175,
+    0xbd => 0x61ac, 0xbe => 0x6194, 0xbf => 0x61a7, 0xc0 => 0x61b7,
+    0xc1 => 0x61d4, 0xc2 => 0x61f5, 0xc3 => 0x5fdd, 0xc4 => 0x96b3,
+    0xc5 => 0x95e9, 0xc6 => 0x95eb, 0xc7 => 0x95f1, 0xc8 => 0x95f3,
+    0xc9 => 0x95f5, 0xca => 0x95f6, 0xcb => 0x95fc, 0xcc => 0x95fe,
+    0xcd => 0x9603, 0xce => 0x9604, 0xcf => 0x9606, 0xd0 => 0x9608,
+    0xd1 => 0x960a, 0xd2 => 0x960b, 0xd3 => 0x960c, 0xd4 => 0x960d,
+    0xd5 => 0x960f, 0xd6 => 0x9612, 0xd7 => 0x9615, 0xd8 => 0x9616,
+    0xd9 => 0x9617, 0xda => 0x9619, 0xdb => 0x961a, 0xdc => 0x4e2c,
+    0xdd => 0x723f, 0xde => 0x6215, 0xdf => 0x6c35, 0xe0 => 0x6c54,
+    0xe1 => 0x6c5c, 0xe2 => 0x6c4a, 0xe3 => 0x6ca3, 0xe4 => 0x6c85,
+    0xe5 => 0x6c90, 0xe6 => 0x6c94, 0xe7 => 0x6c8c, 0xe8 => 0x6c68,
+    0xe9 => 0x6c69, 0xea => 0x6c74, 0xeb => 0x6c76, 0xec => 0x6c86,
+    0xed => 0x6ca9, 0xee => 0x6cd0, 0xef => 0x6cd4, 0xf0 => 0x6cad,
+    0xf1 => 0x6cf7, 0xf2 => 0x6cf8, 0xf3 => 0x6cf1, 0xf4 => 0x6cd7,
+    0xf5 => 0x6cb2, 0xf6 => 0x6ce0, 0xf7 => 0x6cd6, 0xf8 => 0x6cfa,
+    0xf9 => 0x6ceb, 0xfa => 0x6cee, 0xfb => 0x6cb1, 0xfc => 0x6cd3,
+    0xfd => 0x6cef, 0xfe => 0x6cfe,
+  },
+  0xe4 => {
+    0xa1 => 0x6d39, 0xa2 => 0x6d27, 0xa3 => 0x6d0c, 0xa4 => 0x6d43,
+    0xa5 => 0x6d48, 0xa6 => 0x6d07, 0xa7 => 0x6d04, 0xa8 => 0x6d19,
+    0xa9 => 0x6d0e, 0xaa => 0x6d2b, 0xab => 0x6d4d, 0xac => 0x6d2e,
+    0xad => 0x6d35, 0xae => 0x6d1a, 0xaf => 0x6d4f, 0xb0 => 0x6d52,
+    0xb1 => 0x6d54, 0xb2 => 0x6d33, 0xb3 => 0x6d91, 0xb4 => 0x6d6f,
+    0xb5 => 0x6d9e, 0xb6 => 0x6da0, 0xb7 => 0x6d5e, 0xb8 => 0x6d93,
+    0xb9 => 0x6d94, 0xba => 0x6d5c, 0xbb => 0x6d60, 0xbc => 0x6d7c,
+    0xbd => 0x6d63, 0xbe => 0x6e1a, 0xbf => 0x6dc7, 0xc0 => 0x6dc5,
+    0xc1 => 0x6dde, 0xc2 => 0x6e0e, 0xc3 => 0x6dbf, 0xc4 => 0x6de0,
+    0xc5 => 0x6e11, 0xc6 => 0x6de6, 0xc7 => 0x6ddd, 0xc8 => 0x6dd9,
+    0xc9 => 0x6e16, 0xca => 0x6dab, 0xcb => 0x6e0c, 0xcc => 0x6dae,
+    0xcd => 0x6e2b, 0xce => 0x6e6e, 0xcf => 0x6e4e, 0xd0 => 0x6e6b,
+    0xd1 => 0x6eb2, 0xd2 => 0x6e5f, 0xd3 => 0x6e86, 0xd4 => 0x6e53,
+    0xd5 => 0x6e54, 0xd6 => 0x6e32, 0xd7 => 0x6e25, 0xd8 => 0x6e44,
+    0xd9 => 0x6edf, 0xda => 0x6eb1, 0xdb => 0x6e98, 0xdc => 0x6ee0,
+    0xdd => 0x6f2d, 0xde => 0x6ee2, 0xdf => 0x6ea5, 0xe0 => 0x6ea7,
+    0xe1 => 0x6ebd, 0xe2 => 0x6ebb, 0xe3 => 0x6eb7, 0xe4 => 0x6ed7,
+    0xe5 => 0x6eb4, 0xe6 => 0x6ecf, 0xe7 => 0x6e8f, 0xe8 => 0x6ec2,
+    0xe9 => 0x6e9f, 0xea => 0x6f62, 0xeb => 0x6f46, 0xec => 0x6f47,
+    0xed => 0x6f24, 0xee => 0x6f15, 0xef => 0x6ef9, 0xf0 => 0x6f2f,
+    0xf1 => 0x6f36, 0xf2 => 0x6f4b, 0xf3 => 0x6f74, 0xf4 => 0x6f2a,
+    0xf5 => 0x6f09, 0xf6 => 0x6f29, 0xf7 => 0x6f89, 0xf8 => 0x6f8d,
+    0xf9 => 0x6f8c, 0xfa => 0x6f78, 0xfb => 0x6f72, 0xfc => 0x6f7c,
+    0xfd => 0x6f7a, 0xfe => 0x6fd1,
+  },
+  0xe5 => {
+    0xa1 => 0x6fc9, 0xa2 => 0x6fa7, 0xa3 => 0x6fb9, 0xa4 => 0x6fb6,
+    0xa5 => 0x6fc2, 0xa6 => 0x6fe1, 0xa7 => 0x6fee, 0xa8 => 0x6fde,
+    0xa9 => 0x6fe0, 0xaa => 0x6fef, 0xab => 0x701a, 0xac => 0x7023,
+    0xad => 0x701b, 0xae => 0x7039, 0xaf => 0x7035, 0xb0 => 0x704f,
+    0xb1 => 0x705e, 0xb2 => 0x5b80, 0xb3 => 0x5b84, 0xb4 => 0x5b95,
+    0xb5 => 0x5b93, 0xb6 => 0x5ba5, 0xb7 => 0x5bb8, 0xb8 => 0x752f,
+    0xb9 => 0x9a9e, 0xba => 0x6434, 0xbb => 0x5be4, 0xbc => 0x5bee,
+    0xbd => 0x8930, 0xbe => 0x5bf0, 0xbf => 0x8e47, 0xc0 => 0x8b07,
+    0xc1 => 0x8fb6, 0xc2 => 0x8fd3, 0xc3 => 0x8fd5, 0xc4 => 0x8fe5,
+    0xc5 => 0x8fee, 0xc6 => 0x8fe4, 0xc7 => 0x8fe9, 0xc8 => 0x8fe6,
+    0xc9 => 0x8ff3, 0xca => 0x8fe8, 0xcb => 0x9005, 0xcc => 0x9004,
+    0xcd => 0x900b, 0xce => 0x9026, 0xcf => 0x9011, 0xd0 => 0x900d,
+    0xd1 => 0x9016, 0xd2 => 0x9021, 0xd3 => 0x9035, 0xd4 => 0x9036,
+    0xd5 => 0x902d, 0xd6 => 0x902f, 0xd7 => 0x9044, 0xd8 => 0x9051,
+    0xd9 => 0x9052, 0xda => 0x9050, 0xdb => 0x9068, 0xdc => 0x9058,
+    0xdd => 0x9062, 0xde => 0x905b, 0xdf => 0x66b9, 0xe0 => 0x9074,
+    0xe1 => 0x907d, 0xe2 => 0x9082, 0xe3 => 0x9088, 0xe4 => 0x9083,
+    0xe5 => 0x908b, 0xe6 => 0x5f50, 0xe7 => 0x5f57, 0xe8 => 0x5f56,
+    0xe9 => 0x5f58, 0xea => 0x5c3b, 0xeb => 0x54ab, 0xec => 0x5c50,
+    0xed => 0x5c59, 0xee => 0x5b71, 0xef => 0x5c63, 0xf0 => 0x5c66,
+    0xf1 => 0x7fbc, 0xf2 => 0x5f2a, 0xf3 => 0x5f29, 0xf4 => 0x5f2d,
+    0xf5 => 0x8274, 0xf6 => 0x5f3c, 0xf7 => 0x9b3b, 0xf8 => 0x5c6e,
+    0xf9 => 0x5981, 0xfa => 0x5983, 0xfb => 0x598d, 0xfc => 0x59a9,
+    0xfd => 0x59aa, 0xfe => 0x59a3,
+  },
+  0xe6 => {
+    0xa1 => 0x5997, 0xa2 => 0x59ca, 0xa3 => 0x59ab, 0xa4 => 0x599e,
+    0xa5 => 0x59a4, 0xa6 => 0x59d2, 0xa7 => 0x59b2, 0xa8 => 0x59af,
+    0xa9 => 0x59d7, 0xaa => 0x59be, 0xab => 0x5a05, 0xac => 0x5a06,
+    0xad => 0x59dd, 0xae => 0x5a08, 0xaf => 0x59e3, 0xb0 => 0x59d8,
+    0xb1 => 0x59f9, 0xb2 => 0x5a0c, 0xb3 => 0x5a09, 0xb4 => 0x5a32,
+    0xb5 => 0x5a34, 0xb6 => 0x5a11, 0xb7 => 0x5a23, 0xb8 => 0x5a13,
+    0xb9 => 0x5a40, 0xba => 0x5a67, 0xbb => 0x5a4a, 0xbc => 0x5a55,
+    0xbd => 0x5a3c, 0xbe => 0x5a62, 0xbf => 0x5a75, 0xc0 => 0x80ec,
+    0xc1 => 0x5aaa, 0xc2 => 0x5a9b, 0xc3 => 0x5a77, 0xc4 => 0x5a7a,
+    0xc5 => 0x5abe, 0xc6 => 0x5aeb, 0xc7 => 0x5ab2, 0xc8 => 0x5ad2,
+    0xc9 => 0x5ad4, 0xca => 0x5ab8, 0xcb => 0x5ae0, 0xcc => 0x5ae3,
+    0xcd => 0x5af1, 0xce => 0x5ad6, 0xcf => 0x5ae6, 0xd0 => 0x5ad8,
+    0xd1 => 0x5adc, 0xd2 => 0x5b09, 0xd3 => 0x5b17, 0xd4 => 0x5b16,
+    0xd5 => 0x5b32, 0xd6 => 0x5b37, 0xd7 => 0x5b40, 0xd8 => 0x5c15,
+    0xd9 => 0x5c1c, 0xda => 0x5b5a, 0xdb => 0x5b65, 0xdc => 0x5b73,
+    0xdd => 0x5b51, 0xde => 0x5b53, 0xdf => 0x5b62, 0xe0 => 0x9a75,
+    0xe1 => 0x9a77, 0xe2 => 0x9a78, 0xe3 => 0x9a7a, 0xe4 => 0x9a7f,
+    0xe5 => 0x9a7d, 0xe6 => 0x9a80, 0xe7 => 0x9a81, 0xe8 => 0x9a85,
+    0xe9 => 0x9a88, 0xea => 0x9a8a, 0xeb => 0x9a90, 0xec => 0x9a92,
+    0xed => 0x9a93, 0xee => 0x9a96, 0xef => 0x9a98, 0xf0 => 0x9a9b,
+    0xf1 => 0x9a9c, 0xf2 => 0x9a9d, 0xf3 => 0x9a9f, 0xf4 => 0x9aa0,
+    0xf5 => 0x9aa2, 0xf6 => 0x9aa3, 0xf7 => 0x9aa5, 0xf8 => 0x9aa7,
+    0xf9 => 0x7e9f, 0xfa => 0x7ea1, 0xfb => 0x7ea3, 0xfc => 0x7ea5,
+    0xfd => 0x7ea8, 0xfe => 0x7ea9,
+  },
+  0xe7 => {
+    0xa1 => 0x7ead, 0xa2 => 0x7eb0, 0xa3 => 0x7ebe, 0xa4 => 0x7ec0,
+    0xa5 => 0x7ec1, 0xa6 => 0x7ec2, 0xa7 => 0x7ec9, 0xa8 => 0x7ecb,
+    0xa9 => 0x7ecc, 0xaa => 0x7ed0, 0xab => 0x7ed4, 0xac => 0x7ed7,
+    0xad => 0x7edb, 0xae => 0x7ee0, 0xaf => 0x7ee1, 0xb0 => 0x7ee8,
+    0xb1 => 0x7eeb, 0xb2 => 0x7eee, 0xb3 => 0x7eef, 0xb4 => 0x7ef1,
+    0xb5 => 0x7ef2, 0xb6 => 0x7f0d, 0xb7 => 0x7ef6, 0xb8 => 0x7efa,
+    0xb9 => 0x7efb, 0xba => 0x7efe, 0xbb => 0x7f01, 0xbc => 0x7f02,
+    0xbd => 0x7f03, 0xbe => 0x7f07, 0xbf => 0x7f08, 0xc0 => 0x7f0b,
+    0xc1 => 0x7f0c, 0xc2 => 0x7f0f, 0xc3 => 0x7f11, 0xc4 => 0x7f12,
+    0xc5 => 0x7f17, 0xc6 => 0x7f19, 0xc7 => 0x7f1c, 0xc8 => 0x7f1b,
+    0xc9 => 0x7f1f, 0xca => 0x7f21, 0xcb => 0x7f22, 0xcc => 0x7f23,
+    0xcd => 0x7f24, 0xce => 0x7f25, 0xcf => 0x7f26, 0xd0 => 0x7f27,
+    0xd1 => 0x7f2a, 0xd2 => 0x7f2b, 0xd3 => 0x7f2c, 0xd4 => 0x7f2d,
+    0xd5 => 0x7f2f, 0xd6 => 0x7f30, 0xd7 => 0x7f31, 0xd8 => 0x7f32,
+    0xd9 => 0x7f33, 0xda => 0x7f35, 0xdb => 0x5e7a, 0xdc => 0x757f,
+    0xdd => 0x5ddb, 0xde => 0x753e, 0xdf => 0x9095, 0xe0 => 0x738e,
+    0xe1 => 0x7391, 0xe2 => 0x73ae, 0xe3 => 0x73a2, 0xe4 => 0x739f,
+    0xe5 => 0x73cf, 0xe6 => 0x73c2, 0xe7 => 0x73d1, 0xe8 => 0x73b7,
+    0xe9 => 0x73b3, 0xea => 0x73c0, 0xeb => 0x73c9, 0xec => 0x73c8,
+    0xed => 0x73e5, 0xee => 0x73d9, 0xef => 0x987c, 0xf0 => 0x740a,
+    0xf1 => 0x73e9, 0xf2 => 0x73e7, 0xf3 => 0x73de, 0xf4 => 0x73ba,
+    0xf5 => 0x73f2, 0xf6 => 0x740f, 0xf7 => 0x742a, 0xf8 => 0x745b,
+    0xf9 => 0x7426, 0xfa => 0x7425, 0xfb => 0x7428, 0xfc => 0x7430,
+    0xfd => 0x742e, 0xfe => 0x742c,
+  },
+  0xe8 => {
+    0xa1 => 0x741b, 0xa2 => 0x741a, 0xa3 => 0x7441, 0xa4 => 0x745c,
+    0xa5 => 0x7457, 0xa6 => 0x7455, 0xa7 => 0x7459, 0xa8 => 0x7477,
+    0xa9 => 0x746d, 0xaa => 0x747e, 0xab => 0x749c, 0xac => 0x748e,
+    0xad => 0x7480, 0xae => 0x7481, 0xaf => 0x7487, 0xb0 => 0x748b,
+    0xb1 => 0x749e, 0xb2 => 0x74a8, 0xb3 => 0x74a9, 0xb4 => 0x7490,
+    0xb5 => 0x74a7, 0xb6 => 0x74d2, 0xb7 => 0x74ba, 0xb8 => 0x97ea,
+    0xb9 => 0x97eb, 0xba => 0x97ec, 0xbb => 0x674c, 0xbc => 0x6753,
+    0xbd => 0x675e, 0xbe => 0x6748, 0xbf => 0x6769, 0xc0 => 0x67a5,
+    0xc1 => 0x6787, 0xc2 => 0x676a, 0xc3 => 0x6773, 0xc4 => 0x6798,
+    0xc5 => 0x67a7, 0xc6 => 0x6775, 0xc7 => 0x67a8, 0xc8 => 0x679e,
+    0xc9 => 0x67ad, 0xca => 0x678b, 0xcb => 0x6777, 0xcc => 0x677c,
+    0xcd => 0x67f0, 0xce => 0x6809, 0xcf => 0x67d8, 0xd0 => 0x680a,
+    0xd1 => 0x67e9, 0xd2 => 0x67b0, 0xd3 => 0x680c, 0xd4 => 0x67d9,
+    0xd5 => 0x67b5, 0xd6 => 0x67da, 0xd7 => 0x67b3, 0xd8 => 0x67dd,
+    0xd9 => 0x6800, 0xda => 0x67c3, 0xdb => 0x67b8, 0xdc => 0x67e2,
+    0xdd => 0x680e, 0xde => 0x67c1, 0xdf => 0x67fd, 0xe0 => 0x6832,
+    0xe1 => 0x6833, 0xe2 => 0x6860, 0xe3 => 0x6861, 0xe4 => 0x684e,
+    0xe5 => 0x6862, 0xe6 => 0x6844, 0xe7 => 0x6864, 0xe8 => 0x6883,
+    0xe9 => 0x681d, 0xea => 0x6855, 0xeb => 0x6866, 0xec => 0x6841,
+    0xed => 0x6867, 0xee => 0x6840, 0xef => 0x683e, 0xf0 => 0x684a,
+    0xf1 => 0x6849, 0xf2 => 0x6829, 0xf3 => 0x68b5, 0xf4 => 0x688f,
+    0xf5 => 0x6874, 0xf6 => 0x6877, 0xf7 => 0x6893, 0xf8 => 0x686b,
+    0xf9 => 0x68c2, 0xfa => 0x696e, 0xfb => 0x68fc, 0xfc => 0x691f,
+    0xfd => 0x6920, 0xfe => 0x68f9,
+  },
+  0xe9 => {
+    0xa1 => 0x6924, 0xa2 => 0x68f0, 0xa3 => 0x690b, 0xa4 => 0x6901,
+    0xa5 => 0x6957, 0xa6 => 0x68e3, 0xa7 => 0x6910, 0xa8 => 0x6971,
+    0xa9 => 0x6939, 0xaa => 0x6960, 0xab => 0x6942, 0xac => 0x695d,
+    0xad => 0x6984, 0xae => 0x696b, 0xaf => 0x6980, 0xb0 => 0x6998,
+    0xb1 => 0x6978, 0xb2 => 0x6934, 0xb3 => 0x69cc, 0xb4 => 0x6987,
+    0xb5 => 0x6988, 0xb6 => 0x69ce, 0xb7 => 0x6989, 0xb8 => 0x6966,
+    0xb9 => 0x6963, 0xba => 0x6979, 0xbb => 0x699b, 0xbc => 0x69a7,
+    0xbd => 0x69bb, 0xbe => 0x69ab, 0xbf => 0x69ad, 0xc0 => 0x69d4,
+    0xc1 => 0x69b1, 0xc2 => 0x69c1, 0xc3 => 0x69ca, 0xc4 => 0x69df,
+    0xc5 => 0x6995, 0xc6 => 0x69e0, 0xc7 => 0x698d, 0xc8 => 0x69ff,
+    0xc9 => 0x6a2f, 0xca => 0x69ed, 0xcb => 0x6a17, 0xcc => 0x6a18,
+    0xcd => 0x6a65, 0xce => 0x69f2, 0xcf => 0x6a44, 0xd0 => 0x6a3e,
+    0xd1 => 0x6aa0, 0xd2 => 0x6a50, 0xd3 => 0x6a5b, 0xd4 => 0x6a35,
+    0xd5 => 0x6a8e, 0xd6 => 0x6a79, 0xd7 => 0x6a3d, 0xd8 => 0x6a28,
+    0xd9 => 0x6a58, 0xda => 0x6a7c, 0xdb => 0x6a91, 0xdc => 0x6a90,
+    0xdd => 0x6aa9, 0xde => 0x6a97, 0xdf => 0x6aab, 0xe0 => 0x7337,
+    0xe1 => 0x7352, 0xe2 => 0x6b81, 0xe3 => 0x6b82, 0xe4 => 0x6b87,
+    0xe5 => 0x6b84, 0xe6 => 0x6b92, 0xe7 => 0x6b93, 0xe8 => 0x6b8d,
+    0xe9 => 0x6b9a, 0xea => 0x6b9b, 0xeb => 0x6ba1, 0xec => 0x6baa,
+    0xed => 0x8f6b, 0xee => 0x8f6d, 0xef => 0x8f71, 0xf0 => 0x8f72,
+    0xf1 => 0x8f73, 0xf2 => 0x8f75, 0xf3 => 0x8f76, 0xf4 => 0x8f78,
+    0xf5 => 0x8f77, 0xf6 => 0x8f79, 0xf7 => 0x8f7a, 0xf8 => 0x8f7c,
+    0xf9 => 0x8f7e, 0xfa => 0x8f81, 0xfb => 0x8f82, 0xfc => 0x8f84,
+    0xfd => 0x8f87, 0xfe => 0x8f8b,
+  },
+  0xea => {
+    0xa1 => 0x8f8d, 0xa2 => 0x8f8e, 0xa3 => 0x8f8f, 0xa4 => 0x8f98,
+    0xa5 => 0x8f9a, 0xa6 => 0x8ece, 0xa7 => 0x620b, 0xa8 => 0x6217,
+    0xa9 => 0x621b, 0xaa => 0x621f, 0xab => 0x6222, 0xac => 0x6221,
+    0xad => 0x6225, 0xae => 0x6224, 0xaf => 0x622c, 0xb0 => 0x81e7,
+    0xb1 => 0x74ef, 0xb2 => 0x74f4, 0xb3 => 0x74ff, 0xb4 => 0x750f,
+    0xb5 => 0x7511, 0xb6 => 0x7513, 0xb7 => 0x6534, 0xb8 => 0x65ee,
+    0xb9 => 0x65ef, 0xba => 0x65f0, 0xbb => 0x660a, 0xbc => 0x6619,
+    0xbd => 0x6772, 0xbe => 0x6603, 0xbf => 0x6615, 0xc0 => 0x6600,
+    0xc1 => 0x7085, 0xc2 => 0x66f7, 0xc3 => 0x661d, 0xc4 => 0x6634,
+    0xc5 => 0x6631, 0xc6 => 0x6636, 0xc7 => 0x6635, 0xc8 => 0x8006,
+    0xc9 => 0x665f, 0xca => 0x6654, 0xcb => 0x6641, 0xcc => 0x664f,
+    0xcd => 0x6656, 0xce => 0x6661, 0xcf => 0x6657, 0xd0 => 0x6677,
+    0xd1 => 0x6684, 0xd2 => 0x668c, 0xd3 => 0x66a7, 0xd4 => 0x669d,
+    0xd5 => 0x66be, 0xd6 => 0x66db, 0xd7 => 0x66dc, 0xd8 => 0x66e6,
+    0xd9 => 0x66e9, 0xda => 0x8d32, 0xdb => 0x8d33, 0xdc => 0x8d36,
+    0xdd => 0x8d3b, 0xde => 0x8d3d, 0xdf => 0x8d40, 0xe0 => 0x8d45,
+    0xe1 => 0x8d46, 0xe2 => 0x8d48, 0xe3 => 0x8d49, 0xe4 => 0x8d47,
+    0xe5 => 0x8d4d, 0xe6 => 0x8d55, 0xe7 => 0x8d59, 0xe8 => 0x89c7,
+    0xe9 => 0x89ca, 0xea => 0x89cb, 0xeb => 0x89cc, 0xec => 0x89ce,
+    0xed => 0x89cf, 0xee => 0x89d0, 0xef => 0x89d1, 0xf0 => 0x726e,
+    0xf1 => 0x729f, 0xf2 => 0x725d, 0xf3 => 0x7266, 0xf4 => 0x726f,
+    0xf5 => 0x727e, 0xf6 => 0x727f, 0xf7 => 0x7284, 0xf8 => 0x728b,
+    0xf9 => 0x728d, 0xfa => 0x728f, 0xfb => 0x7292, 0xfc => 0x6308,
+    0xfd => 0x6332, 0xfe => 0x63b0,
+  },
+  0xeb => {
+    0xa1 => 0x643f, 0xa2 => 0x64d8, 0xa3 => 0x8004, 0xa4 => 0x6bea,
+    0xa5 => 0x6bf3, 0xa6 => 0x6bfd, 0xa7 => 0x6bf5, 0xa8 => 0x6bf9,
+    0xa9 => 0x6c05, 0xaa => 0x6c07, 0xab => 0x6c06, 0xac => 0x6c0d,
+    0xad => 0x6c15, 0xae => 0x6c18, 0xaf => 0x6c19, 0xb0 => 0x6c1a,
+    0xb1 => 0x6c21, 0xb2 => 0x6c29, 0xb3 => 0x6c24, 0xb4 => 0x6c2a,
+    0xb5 => 0x6c32, 0xb6 => 0x6535, 0xb7 => 0x6555, 0xb8 => 0x656b,
+    0xb9 => 0x724d, 0xba => 0x7252, 0xbb => 0x7256, 0xbc => 0x7230,
+    0xbd => 0x8662, 0xbe => 0x5216, 0xbf => 0x809f, 0xc0 => 0x809c,
+    0xc1 => 0x8093, 0xc2 => 0x80bc, 0xc3 => 0x670a, 0xc4 => 0x80bd,
+    0xc5 => 0x80b1, 0xc6 => 0x80ab, 0xc7 => 0x80ad, 0xc8 => 0x80b4,
+    0xc9 => 0x80b7, 0xca => 0x80e7, 0xcb => 0x80e8, 0xcc => 0x80e9,
+    0xcd => 0x80ea, 0xce => 0x80db, 0xcf => 0x80c2, 0xd0 => 0x80c4,
+    0xd1 => 0x80d9, 0xd2 => 0x80cd, 0xd3 => 0x80d7, 0xd4 => 0x6710,
+    0xd5 => 0x80dd, 0xd6 => 0x80eb, 0xd7 => 0x80f1, 0xd8 => 0x80f4,
+    0xd9 => 0x80ed, 0xda => 0x810d, 0xdb => 0x810e, 0xdc => 0x80f2,
+    0xdd => 0x80fc, 0xde => 0x6715, 0xdf => 0x8112, 0xe0 => 0x8c5a,
+    0xe1 => 0x8136, 0xe2 => 0x811e, 0xe3 => 0x812c, 0xe4 => 0x8118,
+    0xe5 => 0x8132, 0xe6 => 0x8148, 0xe7 => 0x814c, 0xe8 => 0x8153,
+    0xe9 => 0x8174, 0xea => 0x8159, 0xeb => 0x815a, 0xec => 0x8171,
+    0xed => 0x8160, 0xee => 0x8169, 0xef => 0x817c, 0xf0 => 0x817d,
+    0xf1 => 0x816d, 0xf2 => 0x8167, 0xf3 => 0x584d, 0xf4 => 0x5ab5,
+    0xf5 => 0x8188, 0xf6 => 0x8182, 0xf7 => 0x8191, 0xf8 => 0x6ed5,
+    0xf9 => 0x81a3, 0xfa => 0x81aa, 0xfb => 0x81cc, 0xfc => 0x6726,
+    0xfd => 0x81ca, 0xfe => 0x81bb,
+  },
+  0xec => {
+    0xa1 => 0x81c1, 0xa2 => 0x81a6, 0xa3 => 0x6b24, 0xa4 => 0x6b37,
+    0xa5 => 0x6b39, 0xa6 => 0x6b43, 0xa7 => 0x6b46, 0xa8 => 0x6b59,
+    0xa9 => 0x98d1, 0xaa => 0x98d2, 0xab => 0x98d3, 0xac => 0x98d5,
+    0xad => 0x98d9, 0xae => 0x98da, 0xaf => 0x6bb3, 0xb0 => 0x5f40,
+    0xb1 => 0x6bc2, 0xb2 => 0x89f3, 0xb3 => 0x6590, 0xb4 => 0x9f51,
+    0xb5 => 0x6593, 0xb6 => 0x65bc, 0xb7 => 0x65c6, 0xb8 => 0x65c4,
+    0xb9 => 0x65c3, 0xba => 0x65cc, 0xbb => 0x65ce, 0xbc => 0x65d2,
+    0xbd => 0x65d6, 0xbe => 0x7080, 0xbf => 0x709c, 0xc0 => 0x7096,
+    0xc1 => 0x709d, 0xc2 => 0x70bb, 0xc3 => 0x70c0, 0xc4 => 0x70b7,
+    0xc5 => 0x70ab, 0xc6 => 0x70b1, 0xc7 => 0x70e8, 0xc8 => 0x70ca,
+    0xc9 => 0x7110, 0xca => 0x7113, 0xcb => 0x7116, 0xcc => 0x712f,
+    0xcd => 0x7131, 0xce => 0x7173, 0xcf => 0x715c, 0xd0 => 0x7168,
+    0xd1 => 0x7145, 0xd2 => 0x7172, 0xd3 => 0x714a, 0xd4 => 0x7178,
+    0xd5 => 0x717a, 0xd6 => 0x7198, 0xd7 => 0x71b3, 0xd8 => 0x71b5,
+    0xd9 => 0x71a8, 0xda => 0x71a0, 0xdb => 0x71e0, 0xdc => 0x71d4,
+    0xdd => 0x71e7, 0xde => 0x71f9, 0xdf => 0x721d, 0xe0 => 0x7228,
+    0xe1 => 0x706c, 0xe2 => 0x7118, 0xe3 => 0x7166, 0xe4 => 0x71b9,
+    0xe5 => 0x623e, 0xe6 => 0x623d, 0xe7 => 0x6243, 0xe8 => 0x6248,
+    0xe9 => 0x6249, 0xea => 0x793b, 0xeb => 0x7940, 0xec => 0x7946,
+    0xed => 0x7949, 0xee => 0x795b, 0xef => 0x795c, 0xf0 => 0x7953,
+    0xf1 => 0x795a, 0xf2 => 0x7962, 0xf3 => 0x7957, 0xf4 => 0x7960,
+    0xf5 => 0x796f, 0xf6 => 0x7967, 0xf7 => 0x797a, 0xf8 => 0x7985,
+    0xf9 => 0x798a, 0xfa => 0x799a, 0xfb => 0x79a7, 0xfc => 0x79b3,
+    0xfd => 0x5fd1, 0xfe => 0x5fd0,
+  },
+  0xed => {
+    0xa1 => 0x603c, 0xa2 => 0x605d, 0xa3 => 0x605a, 0xa4 => 0x6067,
+    0xa5 => 0x6041, 0xa6 => 0x6059, 0xa7 => 0x6063, 0xa8 => 0x60ab,
+    0xa9 => 0x6106, 0xaa => 0x610d, 0xab => 0x615d, 0xac => 0x61a9,
+    0xad => 0x619d, 0xae => 0x61cb, 0xaf => 0x61d1, 0xb0 => 0x6206,
+    0xb1 => 0x8080, 0xb2 => 0x807f, 0xb3 => 0x6c93, 0xb4 => 0x6cf6,
+    0xb5 => 0x6dfc, 0xb6 => 0x77f6, 0xb7 => 0x77f8, 0xb8 => 0x7800,
+    0xb9 => 0x7809, 0xba => 0x7817, 0xbb => 0x7818, 0xbc => 0x7811,
+    0xbd => 0x65ab, 0xbe => 0x782d, 0xbf => 0x781c, 0xc0 => 0x781d,
+    0xc1 => 0x7839, 0xc2 => 0x783a, 0xc3 => 0x783b, 0xc4 => 0x781f,
+    0xc5 => 0x783c, 0xc6 => 0x7825, 0xc7 => 0x782c, 0xc8 => 0x7823,
+    0xc9 => 0x7829, 0xca => 0x784e, 0xcb => 0x786d, 0xcc => 0x7856,
+    0xcd => 0x7857, 0xce => 0x7826, 0xcf => 0x7850, 0xd0 => 0x7847,
+    0xd1 => 0x784c, 0xd2 => 0x786a, 0xd3 => 0x789b, 0xd4 => 0x7893,
+    0xd5 => 0x789a, 0xd6 => 0x7887, 0xd7 => 0x789c, 0xd8 => 0x78a1,
+    0xd9 => 0x78a3, 0xda => 0x78b2, 0xdb => 0x78b9, 0xdc => 0x78a5,
+    0xdd => 0x78d4, 0xde => 0x78d9, 0xdf => 0x78c9, 0xe0 => 0x78ec,
+    0xe1 => 0x78f2, 0xe2 => 0x7905, 0xe3 => 0x78f4, 0xe4 => 0x7913,
+    0xe5 => 0x7924, 0xe6 => 0x791e, 0xe7 => 0x7934, 0xe8 => 0x9f9b,
+    0xe9 => 0x9ef9, 0xea => 0x9efb, 0xeb => 0x9efc, 0xec => 0x76f1,
+    0xed => 0x7704, 0xee => 0x770d, 0xef => 0x76f9, 0xf0 => 0x7707,
+    0xf1 => 0x7708, 0xf2 => 0x771a, 0xf3 => 0x7722, 0xf4 => 0x7719,
+    0xf5 => 0x772d, 0xf6 => 0x7726, 0xf7 => 0x7735, 0xf8 => 0x7738,
+    0xf9 => 0x7750, 0xfa => 0x7751, 0xfb => 0x7747, 0xfc => 0x7743,
+    0xfd => 0x775a, 0xfe => 0x7768,
+  },
+  0xee => {
+    0xa1 => 0x7762, 0xa2 => 0x7765, 0xa3 => 0x777f, 0xa4 => 0x778d,
+    0xa5 => 0x777d, 0xa6 => 0x7780, 0xa7 => 0x778c, 0xa8 => 0x7791,
+    0xa9 => 0x779f, 0xaa => 0x77a0, 0xab => 0x77b0, 0xac => 0x77b5,
+    0xad => 0x77bd, 0xae => 0x753a, 0xaf => 0x7540, 0xb0 => 0x754e,
+    0xb1 => 0x754b, 0xb2 => 0x7548, 0xb3 => 0x755b, 0xb4 => 0x7572,
+    0xb5 => 0x7579, 0xb6 => 0x7583, 0xb7 => 0x7f58, 0xb8 => 0x7f61,
+    0xb9 => 0x7f5f, 0xba => 0x8a48, 0xbb => 0x7f68, 0xbc => 0x7f74,
+    0xbd => 0x7f71, 0xbe => 0x7f79, 0xbf => 0x7f81, 0xc0 => 0x7f7e,
+    0xc1 => 0x76cd, 0xc2 => 0x76e5, 0xc3 => 0x8832, 0xc4 => 0x9485,
+    0xc5 => 0x9486, 0xc6 => 0x9487, 0xc7 => 0x948b, 0xc8 => 0x948a,
+    0xc9 => 0x948c, 0xca => 0x948d, 0xcb => 0x948f, 0xcc => 0x9490,
+    0xcd => 0x9494, 0xce => 0x9497, 0xcf => 0x9495, 0xd0 => 0x949a,
+    0xd1 => 0x949b, 0xd2 => 0x949c, 0xd3 => 0x94a3, 0xd4 => 0x94a4,
+    0xd5 => 0x94ab, 0xd6 => 0x94aa, 0xd7 => 0x94ad, 0xd8 => 0x94ac,
+    0xd9 => 0x94af, 0xda => 0x94b0, 0xdb => 0x94b2, 0xdc => 0x94b4,
+    0xdd => 0x94b6, 0xde => 0x94b7, 0xdf => 0x94b8, 0xe0 => 0x94b9,
+    0xe1 => 0x94ba, 0xe2 => 0x94bc, 0xe3 => 0x94bd, 0xe4 => 0x94bf,
+    0xe5 => 0x94c4, 0xe6 => 0x94c8, 0xe7 => 0x94c9, 0xe8 => 0x94ca,
+    0xe9 => 0x94cb, 0xea => 0x94cc, 0xeb => 0x94cd, 0xec => 0x94ce,
+    0xed => 0x94d0, 0xee => 0x94d1, 0xef => 0x94d2, 0xf0 => 0x94d5,
+    0xf1 => 0x94d6, 0xf2 => 0x94d7, 0xf3 => 0x94d9, 0xf4 => 0x94d8,
+    0xf5 => 0x94db, 0xf6 => 0x94de, 0xf7 => 0x94df, 0xf8 => 0x94e0,
+    0xf9 => 0x94e2, 0xfa => 0x94e4, 0xfb => 0x94e5, 0xfc => 0x94e7,
+    0xfd => 0x94e8, 0xfe => 0x94ea,
+  },
+  0xef => {
+    0xa1 => 0x94e9, 0xa2 => 0x94eb, 0xa3 => 0x94ee, 0xa4 => 0x94ef,
+    0xa5 => 0x94f3, 0xa6 => 0x94f4, 0xa7 => 0x94f5, 0xa8 => 0x94f7,
+    0xa9 => 0x94f9, 0xaa => 0x94fc, 0xab => 0x94fd, 0xac => 0x94ff,
+    0xad => 0x9503, 0xae => 0x9502, 0xaf => 0x9506, 0xb0 => 0x9507,
+    0xb1 => 0x9509, 0xb2 => 0x950a, 0xb3 => 0x950d, 0xb4 => 0x950e,
+    0xb5 => 0x950f, 0xb6 => 0x9512, 0xb7 => 0x9513, 0xb8 => 0x9514,
+    0xb9 => 0x9515, 0xba => 0x9516, 0xbb => 0x9518, 0xbc => 0x951b,
+    0xbd => 0x951d, 0xbe => 0x951e, 0xbf => 0x951f, 0xc0 => 0x9522,
+    0xc1 => 0x952a, 0xc2 => 0x952b, 0xc3 => 0x9529, 0xc4 => 0x952c,
+    0xc5 => 0x9531, 0xc6 => 0x9532, 0xc7 => 0x9534, 0xc8 => 0x9536,
+    0xc9 => 0x9537, 0xca => 0x9538, 0xcb => 0x953c, 0xcc => 0x953e,
+    0xcd => 0x953f, 0xce => 0x9542, 0xcf => 0x9535, 0xd0 => 0x9544,
+    0xd1 => 0x9545, 0xd2 => 0x9546, 0xd3 => 0x9549, 0xd4 => 0x954c,
+    0xd5 => 0x954e, 0xd6 => 0x954f, 0xd7 => 0x9552, 0xd8 => 0x9553,
+    0xd9 => 0x9554, 0xda => 0x9556, 0xdb => 0x9557, 0xdc => 0x9558,
+    0xdd => 0x9559, 0xde => 0x955b, 0xdf => 0x955e, 0xe0 => 0x955f,
+    0xe1 => 0x955d, 0xe2 => 0x9561, 0xe3 => 0x9562, 0xe4 => 0x9564,
+    0xe5 => 0x9565, 0xe6 => 0x9566, 0xe7 => 0x9567, 0xe8 => 0x9568,
+    0xe9 => 0x9569, 0xea => 0x956a, 0xeb => 0x956b, 0xec => 0x956c,
+    0xed => 0x956f, 0xee => 0x9571, 0xef => 0x9572, 0xf0 => 0x9573,
+    0xf1 => 0x953a, 0xf2 => 0x77e7, 0xf3 => 0x77ec, 0xf4 => 0x96c9,
+    0xf5 => 0x79d5, 0xf6 => 0x79ed, 0xf7 => 0x79e3, 0xf8 => 0x79eb,
+    0xf9 => 0x7a06, 0xfa => 0x5d47, 0xfb => 0x7a03, 0xfc => 0x7a02,
+    0xfd => 0x7a1e, 0xfe => 0x7a14,
+  },
+  0xf0 => {
+    0xa1 => 0x7a39, 0xa2 => 0x7a37, 0xa3 => 0x7a51, 0xa4 => 0x9ecf,
+    0xa5 => 0x99a5, 0xa6 => 0x7a70, 0xa7 => 0x7688, 0xa8 => 0x768e,
+    0xa9 => 0x7693, 0xaa => 0x7699, 0xab => 0x76a4, 0xac => 0x74de,
+    0xad => 0x74e0, 0xae => 0x752c, 0xaf => 0x9e20, 0xb0 => 0x9e22,
+    0xb1 => 0x9e28, 0xb2 => 0x9e29, 0xb3 => 0x9e2a, 0xb4 => 0x9e2b,
+    0xb5 => 0x9e2c, 0xb6 => 0x9e32, 0xb7 => 0x9e31, 0xb8 => 0x9e36,
+    0xb9 => 0x9e38, 0xba => 0x9e37, 0xbb => 0x9e39, 0xbc => 0x9e3a,
+    0xbd => 0x9e3e, 0xbe => 0x9e41, 0xbf => 0x9e42, 0xc0 => 0x9e44,
+    0xc1 => 0x9e46, 0xc2 => 0x9e47, 0xc3 => 0x9e48, 0xc4 => 0x9e49,
+    0xc5 => 0x9e4b, 0xc6 => 0x9e4c, 0xc7 => 0x9e4e, 0xc8 => 0x9e51,
+    0xc9 => 0x9e55, 0xca => 0x9e57, 0xcb => 0x9e5a, 0xcc => 0x9e5b,
+    0xcd => 0x9e5c, 0xce => 0x9e5e, 0xcf => 0x9e63, 0xd0 => 0x9e66,
+    0xd1 => 0x9e67, 0xd2 => 0x9e68, 0xd3 => 0x9e69, 0xd4 => 0x9e6a,
+    0xd5 => 0x9e6b, 0xd6 => 0x9e6c, 0xd7 => 0x9e71, 0xd8 => 0x9e6d,
+    0xd9 => 0x9e73, 0xda => 0x7592, 0xdb => 0x7594, 0xdc => 0x7596,
+    0xdd => 0x75a0, 0xde => 0x759d, 0xdf => 0x75ac, 0xe0 => 0x75a3,
+    0xe1 => 0x75b3, 0xe2 => 0x75b4, 0xe3 => 0x75b8, 0xe4 => 0x75c4,
+    0xe5 => 0x75b1, 0xe6 => 0x75b0, 0xe7 => 0x75c3, 0xe8 => 0x75c2,
+    0xe9 => 0x75d6, 0xea => 0x75cd, 0xeb => 0x75e3, 0xec => 0x75e8,
+    0xed => 0x75e6, 0xee => 0x75e4, 0xef => 0x75eb, 0xf0 => 0x75e7,
+    0xf1 => 0x7603, 0xf2 => 0x75f1, 0xf3 => 0x75fc, 0xf4 => 0x75ff,
+    0xf5 => 0x7610, 0xf6 => 0x7600, 0xf7 => 0x7605, 0xf8 => 0x760c,
+    0xf9 => 0x7617, 0xfa => 0x760a, 0xfb => 0x7625, 0xfc => 0x7618,
+    0xfd => 0x7615, 0xfe => 0x7619,
+  },
+  0xf1 => {
+    0xa1 => 0x761b, 0xa2 => 0x763c, 0xa3 => 0x7622, 0xa4 => 0x7620,
+    0xa5 => 0x7640, 0xa6 => 0x762d, 0xa7 => 0x7630, 0xa8 => 0x763f,
+    0xa9 => 0x7635, 0xaa => 0x7643, 0xab => 0x763e, 0xac => 0x7633,
+    0xad => 0x764d, 0xae => 0x765e, 0xaf => 0x7654, 0xb0 => 0x765c,
+    0xb1 => 0x7656, 0xb2 => 0x766b, 0xb3 => 0x766f, 0xb4 => 0x7fca,
+    0xb5 => 0x7ae6, 0xb6 => 0x7a78, 0xb7 => 0x7a79, 0xb8 => 0x7a80,
+    0xb9 => 0x7a86, 0xba => 0x7a88, 0xbb => 0x7a95, 0xbc => 0x7aa6,
+    0xbd => 0x7aa0, 0xbe => 0x7aac, 0xbf => 0x7aa8, 0xc0 => 0x7aad,
+    0xc1 => 0x7ab3, 0xc2 => 0x8864, 0xc3 => 0x8869, 0xc4 => 0x8872,
+    0xc5 => 0x887d, 0xc6 => 0x887f, 0xc7 => 0x8882, 0xc8 => 0x88a2,
+    0xc9 => 0x88c6, 0xca => 0x88b7, 0xcb => 0x88bc, 0xcc => 0x88c9,
+    0xcd => 0x88e2, 0xce => 0x88ce, 0xcf => 0x88e3, 0xd0 => 0x88e5,
+    0xd1 => 0x88f1, 0xd2 => 0x891a, 0xd3 => 0x88fc, 0xd4 => 0x88e8,
+    0xd5 => 0x88fe, 0xd6 => 0x88f0, 0xd7 => 0x8921, 0xd8 => 0x8919,
+    0xd9 => 0x8913, 0xda => 0x891b, 0xdb => 0x890a, 0xdc => 0x8934,
+    0xdd => 0x892b, 0xde => 0x8936, 0xdf => 0x8941, 0xe0 => 0x8966,
+    0xe1 => 0x897b, 0xe2 => 0x758b, 0xe3 => 0x80e5, 0xe4 => 0x76b2,
+    0xe5 => 0x76b4, 0xe6 => 0x77dc, 0xe7 => 0x8012, 0xe8 => 0x8014,
+    0xe9 => 0x8016, 0xea => 0x801c, 0xeb => 0x8020, 0xec => 0x8022,
+    0xed => 0x8025, 0xee => 0x8026, 0xef => 0x8027, 0xf0 => 0x8029,
+    0xf1 => 0x8028, 0xf2 => 0x8031, 0xf3 => 0x800b, 0xf4 => 0x8035,
+    0xf5 => 0x8043, 0xf6 => 0x8046, 0xf7 => 0x804d, 0xf8 => 0x8052,
+    0xf9 => 0x8069, 0xfa => 0x8071, 0xfb => 0x8983, 0xfc => 0x9878,
+    0xfd => 0x9880, 0xfe => 0x9883,
+  },
+  0xf2 => {
+    0xa1 => 0x9889, 0xa2 => 0x988c, 0xa3 => 0x988d, 0xa4 => 0x988f,
+    0xa5 => 0x9894, 0xa6 => 0x989a, 0xa7 => 0x989b, 0xa8 => 0x989e,
+    0xa9 => 0x989f, 0xaa => 0x98a1, 0xab => 0x98a2, 0xac => 0x98a5,
+    0xad => 0x98a6, 0xae => 0x864d, 0xaf => 0x8654, 0xb0 => 0x866c,
+    0xb1 => 0x866e, 0xb2 => 0x867f, 0xb3 => 0x867a, 0xb4 => 0x867c,
+    0xb5 => 0x867b, 0xb6 => 0x86a8, 0xb7 => 0x868d, 0xb8 => 0x868b,
+    0xb9 => 0x86ac, 0xba => 0x869d, 0xbb => 0x86a7, 0xbc => 0x86a3,
+    0xbd => 0x86aa, 0xbe => 0x8693, 0xbf => 0x86a9, 0xc0 => 0x86b6,
+    0xc1 => 0x86c4, 0xc2 => 0x86b5, 0xc3 => 0x86ce, 0xc4 => 0x86b0,
+    0xc5 => 0x86ba, 0xc6 => 0x86b1, 0xc7 => 0x86af, 0xc8 => 0x86c9,
+    0xc9 => 0x86cf, 0xca => 0x86b4, 0xcb => 0x86e9, 0xcc => 0x86f1,
+    0xcd => 0x86f2, 0xce => 0x86ed, 0xcf => 0x86f3, 0xd0 => 0x86d0,
+    0xd1 => 0x8713, 0xd2 => 0x86de, 0xd3 => 0x86f4, 0xd4 => 0x86df,
+    0xd5 => 0x86d8, 0xd6 => 0x86d1, 0xd7 => 0x8703, 0xd8 => 0x8707,
+    0xd9 => 0x86f8, 0xda => 0x8708, 0xdb => 0x870a, 0xdc => 0x870d,
+    0xdd => 0x8709, 0xde => 0x8723, 0xdf => 0x873b, 0xe0 => 0x871e,
+    0xe1 => 0x8725, 0xe2 => 0x872e, 0xe3 => 0x871a, 0xe4 => 0x873e,
+    0xe5 => 0x8748, 0xe6 => 0x8734, 0xe7 => 0x8731, 0xe8 => 0x8729,
+    0xe9 => 0x8737, 0xea => 0x873f, 0xeb => 0x8782, 0xec => 0x8722,
+    0xed => 0x877d, 0xee => 0x877e, 0xef => 0x877b, 0xf0 => 0x8760,
+    0xf1 => 0x8770, 0xf2 => 0x874c, 0xf3 => 0x876e, 0xf4 => 0x878b,
+    0xf5 => 0x8753, 0xf6 => 0x8763, 0xf7 => 0x877c, 0xf8 => 0x8764,
+    0xf9 => 0x8759, 0xfa => 0x8765, 0xfb => 0x8793, 0xfc => 0x87af,
+    0xfd => 0x87a8, 0xfe => 0x87d2,
+  },
+  0xf3 => {
+    0xa1 => 0x87c6, 0xa2 => 0x8788, 0xa3 => 0x8785, 0xa4 => 0x87ad,
+    0xa5 => 0x8797, 0xa6 => 0x8783, 0xa7 => 0x87ab, 0xa8 => 0x87e5,
+    0xa9 => 0x87ac, 0xaa => 0x87b5, 0xab => 0x87b3, 0xac => 0x87cb,
+    0xad => 0x87d3, 0xae => 0x87bd, 0xaf => 0x87d1, 0xb0 => 0x87c0,
+    0xb1 => 0x87ca, 0xb2 => 0x87db, 0xb3 => 0x87ea, 0xb4 => 0x87e0,
+    0xb5 => 0x87ee, 0xb6 => 0x8816, 0xb7 => 0x8813, 0xb8 => 0x87fe,
+    0xb9 => 0x880a, 0xba => 0x881b, 0xbb => 0x8821, 0xbc => 0x8839,
+    0xbd => 0x883c, 0xbe => 0x7f36, 0xbf => 0x7f42, 0xc0 => 0x7f44,
+    0xc1 => 0x7f45, 0xc2 => 0x8210, 0xc3 => 0x7afa, 0xc4 => 0x7afd,
+    0xc5 => 0x7b08, 0xc6 => 0x7b03, 0xc7 => 0x7b04, 0xc8 => 0x7b15,
+    0xc9 => 0x7b0a, 0xca => 0x7b2b, 0xcb => 0x7b0f, 0xcc => 0x7b47,
+    0xcd => 0x7b38, 0xce => 0x7b2a, 0xcf => 0x7b19, 0xd0 => 0x7b2e,
+    0xd1 => 0x7b31, 0xd2 => 0x7b20, 0xd3 => 0x7b25, 0xd4 => 0x7b24,
+    0xd5 => 0x7b33, 0xd6 => 0x7b3e, 0xd7 => 0x7b1e, 0xd8 => 0x7b58,
+    0xd9 => 0x7b5a, 0xda => 0x7b45, 0xdb => 0x7b75, 0xdc => 0x7b4c,
+    0xdd => 0x7b5d, 0xde => 0x7b60, 0xdf => 0x7b6e, 0xe0 => 0x7b7b,
+    0xe1 => 0x7b62, 0xe2 => 0x7b72, 0xe3 => 0x7b71, 0xe4 => 0x7b90,
+    0xe5 => 0x7ba6, 0xe6 => 0x7ba7, 0xe7 => 0x7bb8, 0xe8 => 0x7bac,
+    0xe9 => 0x7b9d, 0xea => 0x7ba8, 0xeb => 0x7b85, 0xec => 0x7baa,
+    0xed => 0x7b9c, 0xee => 0x7ba2, 0xef => 0x7bab, 0xf0 => 0x7bb4,
+    0xf1 => 0x7bd1, 0xf2 => 0x7bc1, 0xf3 => 0x7bcc, 0xf4 => 0x7bdd,
+    0xf5 => 0x7bda, 0xf6 => 0x7be5, 0xf7 => 0x7be6, 0xf8 => 0x7bea,
+    0xf9 => 0x7c0c, 0xfa => 0x7bfe, 0xfb => 0x7bfc, 0xfc => 0x7c0f,
+    0xfd => 0x7c16, 0xfe => 0x7c0b,
+  },
+  0xf4 => {
+    0xa1 => 0x7c1f, 0xa2 => 0x7c2a, 0xa3 => 0x7c26, 0xa4 => 0x7c38,
+    0xa5 => 0x7c41, 0xa6 => 0x7c40, 0xa7 => 0x81fe, 0xa8 => 0x8201,
+    0xa9 => 0x8202, 0xaa => 0x8204, 0xab => 0x81ec, 0xac => 0x8844,
+    0xad => 0x8221, 0xae => 0x8222, 0xaf => 0x8223, 0xb0 => 0x822d,
+    0xb1 => 0x822f, 0xb2 => 0x8228, 0xb3 => 0x822b, 0xb4 => 0x8238,
+    0xb5 => 0x823b, 0xb6 => 0x8233, 0xb7 => 0x8234, 0xb8 => 0x823e,
+    0xb9 => 0x8244, 0xba => 0x8249, 0xbb => 0x824b, 0xbc => 0x824f,
+    0xbd => 0x825a, 0xbe => 0x825f, 0xbf => 0x8268, 0xc0 => 0x887e,
+    0xc1 => 0x8885, 0xc2 => 0x8888, 0xc3 => 0x88d8, 0xc4 => 0x88df,
+    0xc5 => 0x895e, 0xc6 => 0x7f9d, 0xc7 => 0x7f9f, 0xc8 => 0x7fa7,
+    0xc9 => 0x7faf, 0xca => 0x7fb0, 0xcb => 0x7fb2, 0xcc => 0x7c7c,
+    0xcd => 0x6549, 0xce => 0x7c91, 0xcf => 0x7c9d, 0xd0 => 0x7c9c,
+    0xd1 => 0x7c9e, 0xd2 => 0x7ca2, 0xd3 => 0x7cb2, 0xd4 => 0x7cbc,
+    0xd5 => 0x7cbd, 0xd6 => 0x7cc1, 0xd7 => 0x7cc7, 0xd8 => 0x7ccc,
+    0xd9 => 0x7ccd, 0xda => 0x7cc8, 0xdb => 0x7cc5, 0xdc => 0x7cd7,
+    0xdd => 0x7ce8, 0xde => 0x826e, 0xdf => 0x66a8, 0xe0 => 0x7fbf,
+    0xe1 => 0x7fce, 0xe2 => 0x7fd5, 0xe3 => 0x7fe5, 0xe4 => 0x7fe1,
+    0xe5 => 0x7fe6, 0xe6 => 0x7fe9, 0xe7 => 0x7fee, 0xe8 => 0x7ff3,
+    0xe9 => 0x7cf8, 0xea => 0x7d77, 0xeb => 0x7da6, 0xec => 0x7dae,
+    0xed => 0x7e47, 0xee => 0x7e9b, 0xef => 0x9eb8, 0xf0 => 0x9eb4,
+    0xf1 => 0x8d73, 0xf2 => 0x8d84, 0xf3 => 0x8d94, 0xf4 => 0x8d91,
+    0xf5 => 0x8db1, 0xf6 => 0x8d67, 0xf7 => 0x8d6d, 0xf8 => 0x8c47,
+    0xf9 => 0x8c49, 0xfa => 0x914a, 0xfb => 0x9150, 0xfc => 0x914e,
+    0xfd => 0x914f, 0xfe => 0x9164,
+  },
+  0xf5 => {
+    0xa1 => 0x9162, 0xa2 => 0x9161, 0xa3 => 0x9170, 0xa4 => 0x9169,
+    0xa5 => 0x916f, 0xa6 => 0x917d, 0xa7 => 0x917e, 0xa8 => 0x9172,
+    0xa9 => 0x9174, 0xaa => 0x9179, 0xab => 0x918c, 0xac => 0x9185,
+    0xad => 0x9190, 0xae => 0x918d, 0xaf => 0x9191, 0xb0 => 0x91a2,
+    0xb1 => 0x91a3, 0xb2 => 0x91aa, 0xb3 => 0x91ad, 0xb4 => 0x91ae,
+    0xb5 => 0x91af, 0xb6 => 0x91b5, 0xb7 => 0x91b4, 0xb8 => 0x91ba,
+    0xb9 => 0x8c55, 0xba => 0x9e7e, 0xbb => 0x8db8, 0xbc => 0x8deb,
+    0xbd => 0x8e05, 0xbe => 0x8e59, 0xbf => 0x8e69, 0xc0 => 0x8db5,
+    0xc1 => 0x8dbf, 0xc2 => 0x8dbc, 0xc3 => 0x8dba, 0xc4 => 0x8dc4,
+    0xc5 => 0x8dd6, 0xc6 => 0x8dd7, 0xc7 => 0x8dda, 0xc8 => 0x8dde,
+    0xc9 => 0x8dce, 0xca => 0x8dcf, 0xcb => 0x8ddb, 0xcc => 0x8dc6,
+    0xcd => 0x8dec, 0xce => 0x8df7, 0xcf => 0x8df8, 0xd0 => 0x8de3,
+    0xd1 => 0x8df9, 0xd2 => 0x8dfb, 0xd3 => 0x8de4, 0xd4 => 0x8e09,
+    0xd5 => 0x8dfd, 0xd6 => 0x8e14, 0xd7 => 0x8e1d, 0xd8 => 0x8e1f,
+    0xd9 => 0x8e2c, 0xda => 0x8e2e, 0xdb => 0x8e23, 0xdc => 0x8e2f,
+    0xdd => 0x8e3a, 0xde => 0x8e40, 0xdf => 0x8e39, 0xe0 => 0x8e35,
+    0xe1 => 0x8e3d, 0xe2 => 0x8e31, 0xe3 => 0x8e49, 0xe4 => 0x8e41,
+    0xe5 => 0x8e42, 0xe6 => 0x8e51, 0xe7 => 0x8e52, 0xe8 => 0x8e4a,
+    0xe9 => 0x8e70, 0xea => 0x8e76, 0xeb => 0x8e7c, 0xec => 0x8e6f,
+    0xed => 0x8e74, 0xee => 0x8e85, 0xef => 0x8e8f, 0xf0 => 0x8e94,
+    0xf1 => 0x8e90, 0xf2 => 0x8e9c, 0xf3 => 0x8e9e, 0xf4 => 0x8c78,
+    0xf5 => 0x8c82, 0xf6 => 0x8c8a, 0xf7 => 0x8c85, 0xf8 => 0x8c98,
+    0xf9 => 0x8c94, 0xfa => 0x659b, 0xfb => 0x89d6, 0xfc => 0x89de,
+    0xfd => 0x89da, 0xfe => 0x89dc,
+  },
+  0xf6 => {
+    0xa1 => 0x89e5, 0xa2 => 0x89eb, 0xa3 => 0x89ef, 0xa4 => 0x8a3e,
+    0xa5 => 0x8b26, 0xa6 => 0x9753, 0xa7 => 0x96e9, 0xa8 => 0x96f3,
+    0xa9 => 0x96ef, 0xaa => 0x9706, 0xab => 0x9701, 0xac => 0x9708,
+    0xad => 0x970f, 0xae => 0x970e, 0xaf => 0x972a, 0xb0 => 0x972d,
+    0xb1 => 0x9730, 0xb2 => 0x973e, 0xb3 => 0x9f80, 0xb4 => 0x9f83,
+    0xb5 => 0x9f85, 0xb6 => 0x9f86, 0xb7 => 0x9f87, 0xb8 => 0x9f88,
+    0xb9 => 0x9f89, 0xba => 0x9f8a, 0xbb => 0x9f8c, 0xbc => 0x9efe,
+    0xbd => 0x9f0b, 0xbe => 0x9f0d, 0xbf => 0x96b9, 0xc0 => 0x96bc,
+    0xc1 => 0x96bd, 0xc2 => 0x96ce, 0xc3 => 0x96d2, 0xc4 => 0x77bf,
+    0xc5 => 0x96e0, 0xc6 => 0x928e, 0xc7 => 0x92ae, 0xc8 => 0x92c8,
+    0xc9 => 0x933e, 0xca => 0x936a, 0xcb => 0x93ca, 0xcc => 0x938f,
+    0xcd => 0x943e, 0xce => 0x946b, 0xcf => 0x9c7f, 0xd0 => 0x9c82,
+    0xd1 => 0x9c85, 0xd2 => 0x9c86, 0xd3 => 0x9c87, 0xd4 => 0x9c88,
+    0xd5 => 0x7a23, 0xd6 => 0x9c8b, 0xd7 => 0x9c8e, 0xd8 => 0x9c90,
+    0xd9 => 0x9c91, 0xda => 0x9c92, 0xdb => 0x9c94, 0xdc => 0x9c95,
+    0xdd => 0x9c9a, 0xde => 0x9c9b, 0xdf => 0x9c9e, 0xe0 => 0x9c9f,
+    0xe1 => 0x9ca0, 0xe2 => 0x9ca1, 0xe3 => 0x9ca2, 0xe4 => 0x9ca3,
+    0xe5 => 0x9ca5, 0xe6 => 0x9ca6, 0xe7 => 0x9ca7, 0xe8 => 0x9ca8,
+    0xe9 => 0x9ca9, 0xea => 0x9cab, 0xeb => 0x9cad, 0xec => 0x9cae,
+    0xed => 0x9cb0, 0xee => 0x9cb1, 0xef => 0x9cb2, 0xf0 => 0x9cb3,
+    0xf1 => 0x9cb4, 0xf2 => 0x9cb5, 0xf3 => 0x9cb6, 0xf4 => 0x9cb7,
+    0xf5 => 0x9cba, 0xf6 => 0x9cbb, 0xf7 => 0x9cbc, 0xf8 => 0x9cbd,
+    0xf9 => 0x9cc4, 0xfa => 0x9cc5, 0xfb => 0x9cc6, 0xfc => 0x9cc7,
+    0xfd => 0x9cca, 0xfe => 0x9ccb,
+  },
+  0xf7 => {
+    0xa1 => 0x9ccc, 0xa2 => 0x9ccd, 0xa3 => 0x9cce, 0xa4 => 0x9ccf,
+    0xa5 => 0x9cd0, 0xa6 => 0x9cd3, 0xa7 => 0x9cd4, 0xa8 => 0x9cd5,
+    0xa9 => 0x9cd7, 0xaa => 0x9cd8, 0xab => 0x9cd9, 0xac => 0x9cdc,
+    0xad => 0x9cdd, 0xae => 0x9cdf, 0xaf => 0x9ce2, 0xb0 => 0x977c,
+    0xb1 => 0x9785, 0xb2 => 0x9791, 0xb3 => 0x9792, 0xb4 => 0x9794,
+    0xb5 => 0x97af, 0xb6 => 0x97ab, 0xb7 => 0x97a3, 0xb8 => 0x97b2,
+    0xb9 => 0x97b4, 0xba => 0x9ab1, 0xbb => 0x9ab0, 0xbc => 0x9ab7,
+    0xbd => 0x9e58, 0xbe => 0x9ab6, 0xbf => 0x9aba, 0xc0 => 0x9abc,
+    0xc1 => 0x9ac1, 0xc2 => 0x9ac0, 0xc3 => 0x9ac5, 0xc4 => 0x9ac2,
+    0xc5 => 0x9acb, 0xc6 => 0x9acc, 0xc7 => 0x9ad1, 0xc8 => 0x9b45,
+    0xc9 => 0x9b43, 0xca => 0x9b47, 0xcb => 0x9b49, 0xcc => 0x9b48,
+    0xcd => 0x9b4d, 0xce => 0x9b51, 0xcf => 0x98e8, 0xd0 => 0x990d,
+    0xd1 => 0x992e, 0xd2 => 0x9955, 0xd3 => 0x9954, 0xd4 => 0x9adf,
+    0xd5 => 0x9ae1, 0xd6 => 0x9ae6, 0xd7 => 0x9aef, 0xd8 => 0x9aeb,
+    0xd9 => 0x9afb, 0xda => 0x9aed, 0xdb => 0x9af9, 0xdc => 0x9b08,
+    0xdd => 0x9b0f, 0xde => 0x9b13, 0xdf => 0x9b1f, 0xe0 => 0x9b23,
+    0xe1 => 0x9ebd, 0xe2 => 0x9ebe, 0xe3 => 0x7e3b, 0xe4 => 0x9e82,
+    0xe5 => 0x9e87, 0xe6 => 0x9e88, 0xe7 => 0x9e8b, 0xe8 => 0x9e92,
+    0xe9 => 0x93d6, 0xea => 0x9e9d, 0xeb => 0x9e9f, 0xec => 0x9edb,
+    0xed => 0x9edc, 0xee => 0x9edd, 0xef => 0x9ee0, 0xf0 => 0x9edf,
+    0xf1 => 0x9ee2, 0xf2 => 0x9ee9, 0xf3 => 0x9ee7, 0xf4 => 0x9ee5,
+    0xf5 => 0x9eea, 0xf6 => 0x9eef, 0xf7 => 0x9f22, 0xf8 => 0x9f2c,
+    0xf9 => 0x9f2f, 0xfa => 0x9f39, 0xfb => 0x9f37, 0xfc => 0x9f3d,
+    0xfd => 0x9f3e, 0xfe => 0x9f44,
+  },
+  0xf8 => 0xf8f8, 0xf9 => 0xf8f9, 0xfa => 0xf8fa, 0xfb => 0xf8fb,
+  0xfc => 0xf8fc, 0xfd => 0xf8fd, 0xfe => 0xf8fe, 0xff => 0xf8ff,
+);
+
+1; # end
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacRoman.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacRoman.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacRoman.pm	(revision 24799)
@@ -0,0 +1,42 @@
+#------------------------------------------------------------------------------
+# File:         MacRoman.pm
+#
+# Description:  Mac Roman to Unicode
+#
+# Revisions:    2010/01/20 - P. Harvey created
+#
+# References:   1) http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/ROMAN.TXT
+#
+# Notes:        The table omits 1-byte characters with the same values as Unicode
+#------------------------------------------------------------------------------
+use strict;
+
+%Image::ExifTool::Charset::MacRoman = (
+  0x80 => 0xc4, 0x81 => 0xc5, 0x82 => 0xc7, 0x83 => 0xc9, 0x84 => 0xd1,
+  0x85 => 0xd6, 0x86 => 0xdc, 0x87 => 0xe1, 0x88 => 0xe0, 0x89 => 0xe2,
+  0x8a => 0xe4, 0x8b => 0xe3, 0x8c => 0xe5, 0x8d => 0xe7, 0x8e => 0xe9,
+  0x8f => 0xe8, 0x90 => 0xea, 0x91 => 0xeb, 0x92 => 0xed, 0x93 => 0xec,
+  0x94 => 0xee, 0x95 => 0xef, 0x96 => 0xf1, 0x97 => 0xf3, 0x98 => 0xf2,
+  0x99 => 0xf4, 0x9a => 0xf6, 0x9b => 0xf5, 0x9c => 0xfa, 0x9d => 0xf9,
+  0x9e => 0xfb, 0x9f => 0xfc, 0xa0 => 0x2020, 0xa1 => 0xb0, 0xa4 => 0xa7,
+  0xa5 => 0x2022, 0xa6 => 0xb6, 0xa7 => 0xdf, 0xa8 => 0xae, 0xaa => 0x2122,
+  0xab => 0xb4, 0xac => 0xa8, 0xad => 0x2260, 0xae => 0xc6, 0xaf => 0xd8,
+  0xb0 => 0x221e, 0xb2 => 0x2264, 0xb3 => 0x2265, 0xb4 => 0xa5, 0xb6 => 0x2202,
+  0xb7 => 0x2211, 0xb8 => 0x220f, 0xb9 => 0x03c0, 0xba => 0x222b, 0xbb => 0xaa,
+  0xbc => 0xba, 0xbd => 0x03a9, 0xbe => 0xe6, 0xbf => 0xf8, 0xc0 => 0xbf,
+  0xc1 => 0xa1, 0xc2 => 0xac, 0xc3 => 0x221a, 0xc4 => 0x0192, 0xc5 => 0x2248,
+  0xc6 => 0x2206, 0xc7 => 0xab, 0xc8 => 0xbb, 0xc9 => 0x2026, 0xca => 0xa0,
+  0xcb => 0xc0, 0xcc => 0xc3, 0xcd => 0xd5, 0xce => 0x0152, 0xcf => 0x0153,
+  0xd0 => 0x2013, 0xd1 => 0x2014, 0xd2 => 0x201c, 0xd3 => 0x201d,
+  0xd4 => 0x2018, 0xd5 => 0x2019, 0xd6 => 0xf7, 0xd7 => 0x25ca, 0xd8 => 0xff,
+  0xd9 => 0x0178, 0xda => 0x2044, 0xdb => 0x20ac, 0xdc => 0x2039,
+  0xdd => 0x203a, 0xde => 0xfb01, 0xdf => 0xfb02, 0xe0 => 0x2021, 0xe1 => 0xb7,
+  0xe2 => 0x201a, 0xe3 => 0x201e, 0xe4 => 0x2030, 0xe5 => 0xc2, 0xe6 => 0xca,
+  0xe7 => 0xc1, 0xe8 => 0xcb, 0xe9 => 0xc8, 0xea => 0xcd, 0xeb => 0xce,
+  0xec => 0xcf, 0xed => 0xcc, 0xee => 0xd3, 0xef => 0xd4, 0xf0 => 0xf8ff,
+  0xf1 => 0xd2, 0xf2 => 0xda, 0xf3 => 0xdb, 0xf4 => 0xd9, 0xf5 => 0x0131,
+  0xf6 => 0x02c6, 0xf7 => 0x02dc, 0xf8 => 0xaf, 0xf9 => 0x02d8, 0xfa => 0x02d9,
+  0xfb => 0x02da, 0xfc => 0xb8, 0xfd => 0x02dd, 0xfe => 0x02db, 0xff => 0x02c7,
+);
+
+1; # end
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacRomanian.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacRomanian.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacRomanian.pm	(revision 24799)
@@ -0,0 +1,42 @@
+#------------------------------------------------------------------------------
+# File:         MacRomanian.pm
+#
+# Description:  Mac Romanian to Unicode
+#
+# Revisions:    2010/01/20 - P. Harvey created
+#
+# References:   1) http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/ROMANIAN.TXT
+#
+# Notes:        The table omits 1-byte characters with the same values as Unicode
+#------------------------------------------------------------------------------
+use strict;
+
+%Image::ExifTool::Charset::MacRomanian = (
+  0x80 => 0xc4, 0x81 => 0xc5, 0x82 => 0xc7, 0x83 => 0xc9, 0x84 => 0xd1,
+  0x85 => 0xd6, 0x86 => 0xdc, 0x87 => 0xe1, 0x88 => 0xe0, 0x89 => 0xe2,
+  0x8a => 0xe4, 0x8b => 0xe3, 0x8c => 0xe5, 0x8d => 0xe7, 0x8e => 0xe9,
+  0x8f => 0xe8, 0x90 => 0xea, 0x91 => 0xeb, 0x92 => 0xed, 0x93 => 0xec,
+  0x94 => 0xee, 0x95 => 0xef, 0x96 => 0xf1, 0x97 => 0xf3, 0x98 => 0xf2,
+  0x99 => 0xf4, 0x9a => 0xf6, 0x9b => 0xf5, 0x9c => 0xfa, 0x9d => 0xf9,
+  0x9e => 0xfb, 0x9f => 0xfc, 0xa0 => 0x2020, 0xa1 => 0xb0, 0xa4 => 0xa7,
+  0xa5 => 0x2022, 0xa6 => 0xb6, 0xa7 => 0xdf, 0xa8 => 0xae, 0xaa => 0x2122,
+  0xab => 0xb4, 0xac => 0xa8, 0xad => 0x2260, 0xae => 0x0102, 0xaf => 0x0218,
+  0xb0 => 0x221e, 0xb2 => 0x2264, 0xb3 => 0x2265, 0xb4 => 0xa5, 0xb6 => 0x2202,
+  0xb7 => 0x2211, 0xb8 => 0x220f, 0xb9 => 0x03c0, 0xba => 0x222b, 0xbb => 0xaa,
+  0xbc => 0xba, 0xbd => 0x03a9, 0xbe => 0x0103, 0xbf => 0x0219, 0xc0 => 0xbf,
+  0xc1 => 0xa1, 0xc2 => 0xac, 0xc3 => 0x221a, 0xc4 => 0x0192, 0xc5 => 0x2248,
+  0xc6 => 0x2206, 0xc7 => 0xab, 0xc8 => 0xbb, 0xc9 => 0x2026, 0xca => 0xa0,
+  0xcb => 0xc0, 0xcc => 0xc3, 0xcd => 0xd5, 0xce => 0x0152, 0xcf => 0x0153,
+  0xd0 => 0x2013, 0xd1 => 0x2014, 0xd2 => 0x201c, 0xd3 => 0x201d,
+  0xd4 => 0x2018, 0xd5 => 0x2019, 0xd6 => 0xf7, 0xd7 => 0x25ca, 0xd8 => 0xff,
+  0xd9 => 0x0178, 0xda => 0x2044, 0xdb => 0x20ac, 0xdc => 0x2039,
+  0xdd => 0x203a, 0xde => 0x021a, 0xdf => 0x021b, 0xe0 => 0x2021, 0xe1 => 0xb7,
+  0xe2 => 0x201a, 0xe3 => 0x201e, 0xe4 => 0x2030, 0xe5 => 0xc2, 0xe6 => 0xca,
+  0xe7 => 0xc1, 0xe8 => 0xcb, 0xe9 => 0xc8, 0xea => 0xcd, 0xeb => 0xce,
+  0xec => 0xcf, 0xed => 0xcc, 0xee => 0xd3, 0xef => 0xd4, 0xf0 => 0xf8ff,
+  0xf1 => 0xd2, 0xf2 => 0xda, 0xf3 => 0xdb, 0xf4 => 0xd9, 0xf5 => 0x0131,
+  0xf6 => 0x02c6, 0xf7 => 0x02dc, 0xf8 => 0xaf, 0xf9 => 0x02d8, 0xfa => 0x02d9,
+  0xfb => 0x02da, 0xfc => 0xb8, 0xfd => 0x02dd, 0xfe => 0x02db, 0xff => 0x02c7,
+);
+
+1; # end
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacThai.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacThai.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacThai.pm	(revision 24799)
@@ -0,0 +1,49 @@
+#------------------------------------------------------------------------------
+# File:         MacThai.pm
+#
+# Description:  Mac Thai to Unicode
+#
+# Revisions:    2010/01/20 - P. Harvey created
+#
+# References:   1) http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/THAI.TXT
+#
+# Notes:        The table omits 1-byte characters with the same values as Unicode
+#------------------------------------------------------------------------------
+use strict;
+
+%Image::ExifTool::Charset::MacThai = (
+  0x80 => 0xab, 0x81 => 0xbb, 0x82 => 0x2026, 0x83 => [0x0e48,0xf875],
+  0x84 => [0x0e49,0xf875], 0x85 => [0x0e4a,0xf875], 0x86 => [0x0e4b,0xf875],
+  0x87 => [0x0e4c,0xf875], 0x88 => [0x0e48,0xf873], 0x89 => [0x0e49,0xf873],
+  0x8a => [0x0e4a,0xf873], 0x8b => [0x0e4b,0xf873], 0x8c => [0x0e4c,0xf873],
+  0x8d => 0x201c, 0x8e => 0x201d, 0x8f => [0x0e4d,0xf874], 0x91 => 0x2022,
+  0x92 => [0x0e31,0xf874], 0x93 => [0x0e47,0xf874], 0x94 => [0x0e34,0xf874],
+  0x95 => [0x0e35,0xf874], 0x96 => [0x0e36,0xf874], 0x97 => [0x0e37,0xf874],
+  0x98 => [0x0e48,0xf874], 0x99 => [0x0e49,0xf874], 0x9a => [0x0e4a,0xf874],
+  0x9b => [0x0e4b,0xf874], 0x9c => [0x0e4c,0xf874], 0x9d => 0x2018,
+  0x9e => 0x2019, 0xa1 => 0x0e01, 0xa2 => 0x0e02, 0xa3 => 0x0e03,
+  0xa4 => 0x0e04, 0xa5 => 0x0e05, 0xa6 => 0x0e06, 0xa7 => 0x0e07,
+  0xa8 => 0x0e08, 0xa9 => 0x0e09, 0xaa => 0x0e0a, 0xab => 0x0e0b,
+  0xac => 0x0e0c, 0xad => 0x0e0d, 0xae => 0x0e0e, 0xaf => 0x0e0f,
+  0xb0 => 0x0e10, 0xb1 => 0x0e11, 0xb2 => 0x0e12, 0xb3 => 0x0e13,
+  0xb4 => 0x0e14, 0xb5 => 0x0e15, 0xb6 => 0x0e16, 0xb7 => 0x0e17,
+  0xb8 => 0x0e18, 0xb9 => 0x0e19, 0xba => 0x0e1a, 0xbb => 0x0e1b,
+  0xbc => 0x0e1c, 0xbd => 0x0e1d, 0xbe => 0x0e1e, 0xbf => 0x0e1f,
+  0xc0 => 0x0e20, 0xc1 => 0x0e21, 0xc2 => 0x0e22, 0xc3 => 0x0e23,
+  0xc4 => 0x0e24, 0xc5 => 0x0e25, 0xc6 => 0x0e26, 0xc7 => 0x0e27,
+  0xc8 => 0x0e28, 0xc9 => 0x0e29, 0xca => 0x0e2a, 0xcb => 0x0e2b,
+  0xcc => 0x0e2c, 0xcd => 0x0e2d, 0xce => 0x0e2e, 0xcf => 0x0e2f,
+  0xd0 => 0x0e30, 0xd1 => 0x0e31, 0xd2 => 0x0e32, 0xd3 => 0x0e33,
+  0xd4 => 0x0e34, 0xd5 => 0x0e35, 0xd6 => 0x0e36, 0xd7 => 0x0e37,
+  0xd8 => 0x0e38, 0xd9 => 0x0e39, 0xda => 0x0e3a, 0xdb => 0x2060,
+  0xdc => 0x200b, 0xdd => 0x2013, 0xde => 0x2014, 0xdf => 0x0e3f,
+  0xe0 => 0x0e40, 0xe1 => 0x0e41, 0xe2 => 0x0e42, 0xe3 => 0x0e43,
+  0xe4 => 0x0e44, 0xe5 => 0x0e45, 0xe6 => 0x0e46, 0xe7 => 0x0e47,
+  0xe8 => 0x0e48, 0xe9 => 0x0e49, 0xea => 0x0e4a, 0xeb => 0x0e4b,
+  0xec => 0x0e4c, 0xed => 0x0e4d, 0xee => 0x2122, 0xef => 0x0e4f,
+  0xf0 => 0x0e50, 0xf1 => 0x0e51, 0xf2 => 0x0e52, 0xf3 => 0x0e53,
+  0xf4 => 0x0e54, 0xf5 => 0x0e55, 0xf6 => 0x0e56, 0xf7 => 0x0e57,
+  0xf8 => 0x0e58, 0xf9 => 0x0e59, 0xfa => 0xae, 0xfb => 0xa9,
+);
+
+1; # end
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacTurkish.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacTurkish.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/MacTurkish.pm	(revision 24799)
@@ -0,0 +1,42 @@
+#------------------------------------------------------------------------------
+# File:         MacTurkish.pm
+#
+# Description:  Mac Turkish to Unicode
+#
+# Revisions:    2010/01/20 - P. Harvey created
+#
+# References:   1) http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/TURKISH.TXT
+#
+# Notes:        The table omits 1-byte characters with the same values as Unicode
+#------------------------------------------------------------------------------
+use strict;
+
+%Image::ExifTool::Charset::MacTurkish = (
+  0x80 => 0xc4, 0x81 => 0xc5, 0x82 => 0xc7, 0x83 => 0xc9, 0x84 => 0xd1,
+  0x85 => 0xd6, 0x86 => 0xdc, 0x87 => 0xe1, 0x88 => 0xe0, 0x89 => 0xe2,
+  0x8a => 0xe4, 0x8b => 0xe3, 0x8c => 0xe5, 0x8d => 0xe7, 0x8e => 0xe9,
+  0x8f => 0xe8, 0x90 => 0xea, 0x91 => 0xeb, 0x92 => 0xed, 0x93 => 0xec,
+  0x94 => 0xee, 0x95 => 0xef, 0x96 => 0xf1, 0x97 => 0xf3, 0x98 => 0xf2,
+  0x99 => 0xf4, 0x9a => 0xf6, 0x9b => 0xf5, 0x9c => 0xfa, 0x9d => 0xf9,
+  0x9e => 0xfb, 0x9f => 0xfc, 0xa0 => 0x2020, 0xa1 => 0xb0, 0xa4 => 0xa7,
+  0xa5 => 0x2022, 0xa6 => 0xb6, 0xa7 => 0xdf, 0xa8 => 0xae, 0xaa => 0x2122,
+  0xab => 0xb4, 0xac => 0xa8, 0xad => 0x2260, 0xae => 0xc6, 0xaf => 0xd8,
+  0xb0 => 0x221e, 0xb2 => 0x2264, 0xb3 => 0x2265, 0xb4 => 0xa5, 0xb6 => 0x2202,
+  0xb7 => 0x2211, 0xb8 => 0x220f, 0xb9 => 0x03c0, 0xba => 0x222b, 0xbb => 0xaa,
+  0xbc => 0xba, 0xbd => 0x03a9, 0xbe => 0xe6, 0xbf => 0xf8, 0xc0 => 0xbf,
+  0xc1 => 0xa1, 0xc2 => 0xac, 0xc3 => 0x221a, 0xc4 => 0x0192, 0xc5 => 0x2248,
+  0xc6 => 0x2206, 0xc7 => 0xab, 0xc8 => 0xbb, 0xc9 => 0x2026, 0xca => 0xa0,
+  0xcb => 0xc0, 0xcc => 0xc3, 0xcd => 0xd5, 0xce => 0x0152, 0xcf => 0x0153,
+  0xd0 => 0x2013, 0xd1 => 0x2014, 0xd2 => 0x201c, 0xd3 => 0x201d,
+  0xd4 => 0x2018, 0xd5 => 0x2019, 0xd6 => 0xf7, 0xd7 => 0x25ca, 0xd8 => 0xff,
+  0xd9 => 0x0178, 0xda => 0x011e, 0xdb => 0x011f, 0xdc => 0x0130,
+  0xdd => 0x0131, 0xde => 0x015e, 0xdf => 0x015f, 0xe0 => 0x2021, 0xe1 => 0xb7,
+  0xe2 => 0x201a, 0xe3 => 0x201e, 0xe4 => 0x2030, 0xe5 => 0xc2, 0xe6 => 0xca,
+  0xe7 => 0xc1, 0xe8 => 0xcb, 0xe9 => 0xc8, 0xea => 0xcd, 0xeb => 0xce,
+  0xec => 0xcf, 0xed => 0xcc, 0xee => 0xd3, 0xef => 0xd4, 0xf0 => 0xf8ff,
+  0xf1 => 0xd2, 0xf2 => 0xda, 0xf3 => 0xdb, 0xf4 => 0xd9, 0xf5 => 0xf8a0,
+  0xf6 => 0x02c6, 0xf7 => 0x02dc, 0xf8 => 0xaf, 0xf9 => 0x02d8, 0xfa => 0x02d9,
+  0xfb => 0x02da, 0xfc => 0xb8, 0xfd => 0x02dd, 0xfe => 0x02db, 0xff => 0x02c7,
+);
+
+1; # end
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/PDFDoc.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/PDFDoc.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/PDFDoc.pm	(revision 24799)
@@ -0,0 +1,28 @@
+#------------------------------------------------------------------------------
+# File:         PDFDoc.pm
+#
+# Description:  PDFDocEncoding to Unicode
+#
+# Revisions:    2010/10/16 - P. Harvey created
+#
+# References:   1) http://www.adobe.com/devnet/pdf/pdf_reference.html
+#
+# Notes:        The table omits 1-byte characters with the same values as Unicode
+#               This set re-maps characters with codepoints less than 0x80
+#------------------------------------------------------------------------------
+use strict;
+
+%Image::ExifTool::Charset::PDFDoc = (
+  0x18 => 0x02d8,  0x82 => 0x2021,  0x8c => 0x201e,  0x96 => 0x0152,
+  0x19 => 0x02c7,  0x83 => 0x2026,  0x8d => 0x201c,  0x97 => 0x0160,
+  0x1a => 0x02c6,  0x84 => 0x2014,  0x8e => 0x201d,  0x98 => 0x0178,
+  0x1b => 0x02d9,  0x85 => 0x2013,  0x8f => 0x2018,  0x99 => 0x017d,
+  0x1c => 0x02dd,  0x86 => 0x0192,  0x90 => 0x2019,  0x9a => 0x0131,
+  0x1d => 0x02db,  0x87 => 0x2044,  0x91 => 0x201a,  0x9b => 0x0142,
+  0x1e => 0x02da,  0x88 => 0x2039,  0x92 => 0x2122,  0x9c => 0x0153,
+  0x1f => 0x02dc,  0x89 => 0x203a,  0x93 => 0xfb01,  0x9d => 0x0161,
+  0x80 => 0x2022,  0x8a => 0x2212,  0x94 => 0xfb02,  0x9e => 0x017e,
+  0x81 => 0x2020,  0x8b => 0x2030,  0x95 => 0x0141,  0xa0 => 0x20ac,
+);
+
+1; # end
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/ShiftJIS.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/ShiftJIS.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/ShiftJIS.pm	(revision 24799)
@@ -0,0 +1,1835 @@
+#------------------------------------------------------------------------------
+# File:         ShiftJIS.pm
+#
+# Description:  Shift-JIS to Unicode
+#
+# Revisions:    2010/01/20 - P. Harvey created
+#               2010/07/30 - P. Harvey fixed to use variable-width characters
+#
+# References:   1) http://unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/SHIFTJIS.TXT
+#
+# Notes:        The table omits 1-byte characters with the same values as Unicode
+#------------------------------------------------------------------------------
+use strict;
+
+%Image::ExifTool::Charset::ShiftJIS = (
+  0x5c => 0xa5, 0x7e => 0x203e,
+  0x81 => {
+    0x40 => 0x3000, 0x41 => 0x3001, 0x42 => 0x3002, 0x43 => 0xff0c,
+    0x44 => 0xff0e, 0x45 => 0x30fb, 0x46 => 0xff1a, 0x47 => 0xff1b,
+    0x48 => 0xff1f, 0x49 => 0xff01, 0x4a => 0x309b, 0x4b => 0x309c,
+    0x4c => 0xb4, 0x4d => 0xff40, 0x4e => 0xa8, 0x4f => 0xff3e, 0x50 => 0xffe3,
+    0x51 => 0xff3f, 0x52 => 0x30fd, 0x53 => 0x30fe, 0x54 => 0x309d,
+    0x55 => 0x309e, 0x56 => 0x3003, 0x57 => 0x4edd, 0x58 => 0x3005,
+    0x59 => 0x3006, 0x5a => 0x3007, 0x5b => 0x30fc, 0x5c => 0x2015,
+    0x5d => 0x2010, 0x5e => 0xff0f, 0x5f => 0x5c, 0x60 => 0x301c,
+    0x61 => 0x2016, 0x62 => 0xff5c, 0x63 => 0x2026, 0x64 => 0x2025,
+    0x65 => 0x2018, 0x66 => 0x2019, 0x67 => 0x201c, 0x68 => 0x201d,
+    0x69 => 0xff08, 0x6a => 0xff09, 0x6b => 0x3014, 0x6c => 0x3015,
+    0x6d => 0xff3b, 0x6e => 0xff3d, 0x6f => 0xff5b, 0x70 => 0xff5d,
+    0x71 => 0x3008, 0x72 => 0x3009, 0x73 => 0x300a, 0x74 => 0x300b,
+    0x75 => 0x300c, 0x76 => 0x300d, 0x77 => 0x300e, 0x78 => 0x300f,
+    0x79 => 0x3010, 0x7a => 0x3011, 0x7b => 0xff0b, 0x7c => 0x2212,
+    0x7d => 0xb1, 0x7e => 0xd7, 0x80 => 0xf7, 0x81 => 0xff1d, 0x82 => 0x2260,
+    0x83 => 0xff1c, 0x84 => 0xff1e, 0x85 => 0x2266, 0x86 => 0x2267,
+    0x87 => 0x221e, 0x88 => 0x2234, 0x89 => 0x2642, 0x8a => 0x2640,
+    0x8b => 0xb0, 0x8c => 0x2032, 0x8d => 0x2033, 0x8e => 0x2103,
+    0x8f => 0xffe5, 0x90 => 0xff04, 0x91 => 0xa2, 0x92 => 0xa3, 0x93 => 0xff05,
+    0x94 => 0xff03, 0x95 => 0xff06, 0x96 => 0xff0a, 0x97 => 0xff20,
+    0x98 => 0xa7, 0x99 => 0x2606, 0x9a => 0x2605, 0x9b => 0x25cb,
+    0x9c => 0x25cf, 0x9d => 0x25ce, 0x9e => 0x25c7, 0x9f => 0x25c6,
+    0xa0 => 0x25a1, 0xa1 => 0x25a0, 0xa2 => 0x25b3, 0xa3 => 0x25b2,
+    0xa4 => 0x25bd, 0xa5 => 0x25bc, 0xa6 => 0x203b, 0xa7 => 0x3012,
+    0xa8 => 0x2192, 0xa9 => 0x2190, 0xaa => 0x2191, 0xab => 0x2193,
+    0xac => 0x3013, 0xb8 => 0x2208, 0xb9 => 0x220b, 0xba => 0x2286,
+    0xbb => 0x2287, 0xbc => 0x2282, 0xbd => 0x2283, 0xbe => 0x222a,
+    0xbf => 0x2229, 0xc8 => 0x2227, 0xc9 => 0x2228, 0xca => 0xac,
+    0xcb => 0x21d2, 0xcc => 0x21d4, 0xcd => 0x2200, 0xce => 0x2203,
+    0xda => 0x2220, 0xdb => 0x22a5, 0xdc => 0x2312, 0xdd => 0x2202,
+    0xde => 0x2207, 0xdf => 0x2261, 0xe0 => 0x2252, 0xe1 => 0x226a,
+    0xe2 => 0x226b, 0xe3 => 0x221a, 0xe4 => 0x223d, 0xe5 => 0x221d,
+    0xe6 => 0x2235, 0xe7 => 0x222b, 0xe8 => 0x222c, 0xf0 => 0x212b,
+    0xf1 => 0x2030, 0xf2 => 0x266f, 0xf3 => 0x266d, 0xf4 => 0x266a,
+    0xf5 => 0x2020, 0xf6 => 0x2021, 0xf7 => 0xb6, 0xfc => 0x25ef,
+  },
+  0x82 => {
+    0x4f => 0xff10, 0x50 => 0xff11, 0x51 => 0xff12, 0x52 => 0xff13,
+    0x53 => 0xff14, 0x54 => 0xff15, 0x55 => 0xff16, 0x56 => 0xff17,
+    0x57 => 0xff18, 0x58 => 0xff19, 0x60 => 0xff21, 0x61 => 0xff22,
+    0x62 => 0xff23, 0x63 => 0xff24, 0x64 => 0xff25, 0x65 => 0xff26,
+    0x66 => 0xff27, 0x67 => 0xff28, 0x68 => 0xff29, 0x69 => 0xff2a,
+    0x6a => 0xff2b, 0x6b => 0xff2c, 0x6c => 0xff2d, 0x6d => 0xff2e,
+    0x6e => 0xff2f, 0x6f => 0xff30, 0x70 => 0xff31, 0x71 => 0xff32,
+    0x72 => 0xff33, 0x73 => 0xff34, 0x74 => 0xff35, 0x75 => 0xff36,
+    0x76 => 0xff37, 0x77 => 0xff38, 0x78 => 0xff39, 0x79 => 0xff3a,
+    0x81 => 0xff41, 0x82 => 0xff42, 0x83 => 0xff43, 0x84 => 0xff44,
+    0x85 => 0xff45, 0x86 => 0xff46, 0x87 => 0xff47, 0x88 => 0xff48,
+    0x89 => 0xff49, 0x8a => 0xff4a, 0x8b => 0xff4b, 0x8c => 0xff4c,
+    0x8d => 0xff4d, 0x8e => 0xff4e, 0x8f => 0xff4f, 0x90 => 0xff50,
+    0x91 => 0xff51, 0x92 => 0xff52, 0x93 => 0xff53, 0x94 => 0xff54,
+    0x95 => 0xff55, 0x96 => 0xff56, 0x97 => 0xff57, 0x98 => 0xff58,
+    0x99 => 0xff59, 0x9a => 0xff5a, 0x9f => 0x3041, 0xa0 => 0x3042,
+    0xa1 => 0x3043, 0xa2 => 0x3044, 0xa3 => 0x3045, 0xa4 => 0x3046,
+    0xa5 => 0x3047, 0xa6 => 0x3048, 0xa7 => 0x3049, 0xa8 => 0x304a,
+    0xa9 => 0x304b, 0xaa => 0x304c, 0xab => 0x304d, 0xac => 0x304e,
+    0xad => 0x304f, 0xae => 0x3050, 0xaf => 0x3051, 0xb0 => 0x3052,
+    0xb1 => 0x3053, 0xb2 => 0x3054, 0xb3 => 0x3055, 0xb4 => 0x3056,
+    0xb5 => 0x3057, 0xb6 => 0x3058, 0xb7 => 0x3059, 0xb8 => 0x305a,
+    0xb9 => 0x305b, 0xba => 0x305c, 0xbb => 0x305d, 0xbc => 0x305e,
+    0xbd => 0x305f, 0xbe => 0x3060, 0xbf => 0x3061, 0xc0 => 0x3062,
+    0xc1 => 0x3063, 0xc2 => 0x3064, 0xc3 => 0x3065, 0xc4 => 0x3066,
+    0xc5 => 0x3067, 0xc6 => 0x3068, 0xc7 => 0x3069, 0xc8 => 0x306a,
+    0xc9 => 0x306b, 0xca => 0x306c, 0xcb => 0x306d, 0xcc => 0x306e,
+    0xcd => 0x306f, 0xce => 0x3070, 0xcf => 0x3071, 0xd0 => 0x3072,
+    0xd1 => 0x3073, 0xd2 => 0x3074, 0xd3 => 0x3075, 0xd4 => 0x3076,
+    0xd5 => 0x3077, 0xd6 => 0x3078, 0xd7 => 0x3079, 0xd8 => 0x307a,
+    0xd9 => 0x307b, 0xda => 0x307c, 0xdb => 0x307d, 0xdc => 0x307e,
+    0xdd => 0x307f, 0xde => 0x3080, 0xdf => 0x3081, 0xe0 => 0x3082,
+    0xe1 => 0x3083, 0xe2 => 0x3084, 0xe3 => 0x3085, 0xe4 => 0x3086,
+    0xe5 => 0x3087, 0xe6 => 0x3088, 0xe7 => 0x3089, 0xe8 => 0x308a,
+    0xe9 => 0x308b, 0xea => 0x308c, 0xeb => 0x308d, 0xec => 0x308e,
+    0xed => 0x308f, 0xee => 0x3090, 0xef => 0x3091, 0xf0 => 0x3092,
+    0xf1 => 0x3093,
+  },
+  0x83 => {
+    0x40 => 0x30a1, 0x41 => 0x30a2, 0x42 => 0x30a3, 0x43 => 0x30a4,
+    0x44 => 0x30a5, 0x45 => 0x30a6, 0x46 => 0x30a7, 0x47 => 0x30a8,
+    0x48 => 0x30a9, 0x49 => 0x30aa, 0x4a => 0x30ab, 0x4b => 0x30ac,
+    0x4c => 0x30ad, 0x4d => 0x30ae, 0x4e => 0x30af, 0x4f => 0x30b0,
+    0x50 => 0x30b1, 0x51 => 0x30b2, 0x52 => 0x30b3, 0x53 => 0x30b4,
+    0x54 => 0x30b5, 0x55 => 0x30b6, 0x56 => 0x30b7, 0x57 => 0x30b8,
+    0x58 => 0x30b9, 0x59 => 0x30ba, 0x5a => 0x30bb, 0x5b => 0x30bc,
+    0x5c => 0x30bd, 0x5d => 0x30be, 0x5e => 0x30bf, 0x5f => 0x30c0,
+    0x60 => 0x30c1, 0x61 => 0x30c2, 0x62 => 0x30c3, 0x63 => 0x30c4,
+    0x64 => 0x30c5, 0x65 => 0x30c6, 0x66 => 0x30c7, 0x67 => 0x30c8,
+    0x68 => 0x30c9, 0x69 => 0x30ca, 0x6a => 0x30cb, 0x6b => 0x30cc,
+    0x6c => 0x30cd, 0x6d => 0x30ce, 0x6e => 0x30cf, 0x6f => 0x30d0,
+    0x70 => 0x30d1, 0x71 => 0x30d2, 0x72 => 0x30d3, 0x73 => 0x30d4,
+    0x74 => 0x30d5, 0x75 => 0x30d6, 0x76 => 0x30d7, 0x77 => 0x30d8,
+    0x78 => 0x30d9, 0x79 => 0x30da, 0x7a => 0x30db, 0x7b => 0x30dc,
+    0x7c => 0x30dd, 0x7d => 0x30de, 0x7e => 0x30df, 0x80 => 0x30e0,
+    0x81 => 0x30e1, 0x82 => 0x30e2, 0x83 => 0x30e3, 0x84 => 0x30e4,
+    0x85 => 0x30e5, 0x86 => 0x30e6, 0x87 => 0x30e7, 0x88 => 0x30e8,
+    0x89 => 0x30e9, 0x8a => 0x30ea, 0x8b => 0x30eb, 0x8c => 0x30ec,
+    0x8d => 0x30ed, 0x8e => 0x30ee, 0x8f => 0x30ef, 0x90 => 0x30f0,
+    0x91 => 0x30f1, 0x92 => 0x30f2, 0x93 => 0x30f3, 0x94 => 0x30f4,
+    0x95 => 0x30f5, 0x96 => 0x30f6, 0x9f => 0x0391, 0xa0 => 0x0392,
+    0xa1 => 0x0393, 0xa2 => 0x0394, 0xa3 => 0x0395, 0xa4 => 0x0396,
+    0xa5 => 0x0397, 0xa6 => 0x0398, 0xa7 => 0x0399, 0xa8 => 0x039a,
+    0xa9 => 0x039b, 0xaa => 0x039c, 0xab => 0x039d, 0xac => 0x039e,
+    0xad => 0x039f, 0xae => 0x03a0, 0xaf => 0x03a1, 0xb0 => 0x03a3,
+    0xb1 => 0x03a4, 0xb2 => 0x03a5, 0xb3 => 0x03a6, 0xb4 => 0x03a7,
+    0xb5 => 0x03a8, 0xb6 => 0x03a9, 0xbf => 0x03b1, 0xc0 => 0x03b2,
+    0xc1 => 0x03b3, 0xc2 => 0x03b4, 0xc3 => 0x03b5, 0xc4 => 0x03b6,
+    0xc5 => 0x03b7, 0xc6 => 0x03b8, 0xc7 => 0x03b9, 0xc8 => 0x03ba,
+    0xc9 => 0x03bb, 0xca => 0x03bc, 0xcb => 0x03bd, 0xcc => 0x03be,
+    0xcd => 0x03bf, 0xce => 0x03c0, 0xcf => 0x03c1, 0xd0 => 0x03c3,
+    0xd1 => 0x03c4, 0xd2 => 0x03c5, 0xd3 => 0x03c6, 0xd4 => 0x03c7,
+    0xd5 => 0x03c8, 0xd6 => 0x03c9,
+  },
+  0x84 => {
+    0x40 => 0x0410, 0x41 => 0x0411, 0x42 => 0x0412, 0x43 => 0x0413,
+    0x44 => 0x0414, 0x45 => 0x0415, 0x46 => 0x0401, 0x47 => 0x0416,
+    0x48 => 0x0417, 0x49 => 0x0418, 0x4a => 0x0419, 0x4b => 0x041a,
+    0x4c => 0x041b, 0x4d => 0x041c, 0x4e => 0x041d, 0x4f => 0x041e,
+    0x50 => 0x041f, 0x51 => 0x0420, 0x52 => 0x0421, 0x53 => 0x0422,
+    0x54 => 0x0423, 0x55 => 0x0424, 0x56 => 0x0425, 0x57 => 0x0426,
+    0x58 => 0x0427, 0x59 => 0x0428, 0x5a => 0x0429, 0x5b => 0x042a,
+    0x5c => 0x042b, 0x5d => 0x042c, 0x5e => 0x042d, 0x5f => 0x042e,
+    0x60 => 0x042f, 0x70 => 0x0430, 0x71 => 0x0431, 0x72 => 0x0432,
+    0x73 => 0x0433, 0x74 => 0x0434, 0x75 => 0x0435, 0x76 => 0x0451,
+    0x77 => 0x0436, 0x78 => 0x0437, 0x79 => 0x0438, 0x7a => 0x0439,
+    0x7b => 0x043a, 0x7c => 0x043b, 0x7d => 0x043c, 0x7e => 0x043d,
+    0x80 => 0x043e, 0x81 => 0x043f, 0x82 => 0x0440, 0x83 => 0x0441,
+    0x84 => 0x0442, 0x85 => 0x0443, 0x86 => 0x0444, 0x87 => 0x0445,
+    0x88 => 0x0446, 0x89 => 0x0447, 0x8a => 0x0448, 0x8b => 0x0449,
+    0x8c => 0x044a, 0x8d => 0x044b, 0x8e => 0x044c, 0x8f => 0x044d,
+    0x90 => 0x044e, 0x91 => 0x044f, 0x9f => 0x2500, 0xa0 => 0x2502,
+    0xa1 => 0x250c, 0xa2 => 0x2510, 0xa3 => 0x2518, 0xa4 => 0x2514,
+    0xa5 => 0x251c, 0xa6 => 0x252c, 0xa7 => 0x2524, 0xa8 => 0x2534,
+    0xa9 => 0x253c, 0xaa => 0x2501, 0xab => 0x2503, 0xac => 0x250f,
+    0xad => 0x2513, 0xae => 0x251b, 0xaf => 0x2517, 0xb0 => 0x2523,
+    0xb1 => 0x2533, 0xb2 => 0x252b, 0xb3 => 0x253b, 0xb4 => 0x254b,
+    0xb5 => 0x2520, 0xb6 => 0x252f, 0xb7 => 0x2528, 0xb8 => 0x2537,
+    0xb9 => 0x253f, 0xba => 0x251d, 0xbb => 0x2530, 0xbc => 0x2525,
+    0xbd => 0x2538, 0xbe => 0x2542,
+  },
+  0x88 => {
+    0x9f => 0x4e9c, 0xa0 => 0x5516, 0xa1 => 0x5a03, 0xa2 => 0x963f,
+    0xa3 => 0x54c0, 0xa4 => 0x611b, 0xa5 => 0x6328, 0xa6 => 0x59f6,
+    0xa7 => 0x9022, 0xa8 => 0x8475, 0xa9 => 0x831c, 0xaa => 0x7a50,
+    0xab => 0x60aa, 0xac => 0x63e1, 0xad => 0x6e25, 0xae => 0x65ed,
+    0xaf => 0x8466, 0xb0 => 0x82a6, 0xb1 => 0x9bf5, 0xb2 => 0x6893,
+    0xb3 => 0x5727, 0xb4 => 0x65a1, 0xb5 => 0x6271, 0xb6 => 0x5b9b,
+    0xb7 => 0x59d0, 0xb8 => 0x867b, 0xb9 => 0x98f4, 0xba => 0x7d62,
+    0xbb => 0x7dbe, 0xbc => 0x9b8e, 0xbd => 0x6216, 0xbe => 0x7c9f,
+    0xbf => 0x88b7, 0xc0 => 0x5b89, 0xc1 => 0x5eb5, 0xc2 => 0x6309,
+    0xc3 => 0x6697, 0xc4 => 0x6848, 0xc5 => 0x95c7, 0xc6 => 0x978d,
+    0xc7 => 0x674f, 0xc8 => 0x4ee5, 0xc9 => 0x4f0a, 0xca => 0x4f4d,
+    0xcb => 0x4f9d, 0xcc => 0x5049, 0xcd => 0x56f2, 0xce => 0x5937,
+    0xcf => 0x59d4, 0xd0 => 0x5a01, 0xd1 => 0x5c09, 0xd2 => 0x60df,
+    0xd3 => 0x610f, 0xd4 => 0x6170, 0xd5 => 0x6613, 0xd6 => 0x6905,
+    0xd7 => 0x70ba, 0xd8 => 0x754f, 0xd9 => 0x7570, 0xda => 0x79fb,
+    0xdb => 0x7dad, 0xdc => 0x7def, 0xdd => 0x80c3, 0xde => 0x840e,
+    0xdf => 0x8863, 0xe0 => 0x8b02, 0xe1 => 0x9055, 0xe2 => 0x907a,
+    0xe3 => 0x533b, 0xe4 => 0x4e95, 0xe5 => 0x4ea5, 0xe6 => 0x57df,
+    0xe7 => 0x80b2, 0xe8 => 0x90c1, 0xe9 => 0x78ef, 0xea => 0x4e00,
+    0xeb => 0x58f1, 0xec => 0x6ea2, 0xed => 0x9038, 0xee => 0x7a32,
+    0xef => 0x8328, 0xf0 => 0x828b, 0xf1 => 0x9c2f, 0xf2 => 0x5141,
+    0xf3 => 0x5370, 0xf4 => 0x54bd, 0xf5 => 0x54e1, 0xf6 => 0x56e0,
+    0xf7 => 0x59fb, 0xf8 => 0x5f15, 0xf9 => 0x98f2, 0xfa => 0x6deb,
+    0xfb => 0x80e4, 0xfc => 0x852d,
+  },
+  0x89 => {
+    0x40 => 0x9662, 0x41 => 0x9670, 0x42 => 0x96a0, 0x43 => 0x97fb,
+    0x44 => 0x540b, 0x45 => 0x53f3, 0x46 => 0x5b87, 0x47 => 0x70cf,
+    0x48 => 0x7fbd, 0x49 => 0x8fc2, 0x4a => 0x96e8, 0x4b => 0x536f,
+    0x4c => 0x9d5c, 0x4d => 0x7aba, 0x4e => 0x4e11, 0x4f => 0x7893,
+    0x50 => 0x81fc, 0x51 => 0x6e26, 0x52 => 0x5618, 0x53 => 0x5504,
+    0x54 => 0x6b1d, 0x55 => 0x851a, 0x56 => 0x9c3b, 0x57 => 0x59e5,
+    0x58 => 0x53a9, 0x59 => 0x6d66, 0x5a => 0x74dc, 0x5b => 0x958f,
+    0x5c => 0x5642, 0x5d => 0x4e91, 0x5e => 0x904b, 0x5f => 0x96f2,
+    0x60 => 0x834f, 0x61 => 0x990c, 0x62 => 0x53e1, 0x63 => 0x55b6,
+    0x64 => 0x5b30, 0x65 => 0x5f71, 0x66 => 0x6620, 0x67 => 0x66f3,
+    0x68 => 0x6804, 0x69 => 0x6c38, 0x6a => 0x6cf3, 0x6b => 0x6d29,
+    0x6c => 0x745b, 0x6d => 0x76c8, 0x6e => 0x7a4e, 0x6f => 0x9834,
+    0x70 => 0x82f1, 0x71 => 0x885b, 0x72 => 0x8a60, 0x73 => 0x92ed,
+    0x74 => 0x6db2, 0x75 => 0x75ab, 0x76 => 0x76ca, 0x77 => 0x99c5,
+    0x78 => 0x60a6, 0x79 => 0x8b01, 0x7a => 0x8d8a, 0x7b => 0x95b2,
+    0x7c => 0x698e, 0x7d => 0x53ad, 0x7e => 0x5186, 0x80 => 0x5712,
+    0x81 => 0x5830, 0x82 => 0x5944, 0x83 => 0x5bb4, 0x84 => 0x5ef6,
+    0x85 => 0x6028, 0x86 => 0x63a9, 0x87 => 0x63f4, 0x88 => 0x6cbf,
+    0x89 => 0x6f14, 0x8a => 0x708e, 0x8b => 0x7114, 0x8c => 0x7159,
+    0x8d => 0x71d5, 0x8e => 0x733f, 0x8f => 0x7e01, 0x90 => 0x8276,
+    0x91 => 0x82d1, 0x92 => 0x8597, 0x93 => 0x9060, 0x94 => 0x925b,
+    0x95 => 0x9d1b, 0x96 => 0x5869, 0x97 => 0x65bc, 0x98 => 0x6c5a,
+    0x99 => 0x7525, 0x9a => 0x51f9, 0x9b => 0x592e, 0x9c => 0x5965,
+    0x9d => 0x5f80, 0x9e => 0x5fdc, 0x9f => 0x62bc, 0xa0 => 0x65fa,
+    0xa1 => 0x6a2a, 0xa2 => 0x6b27, 0xa3 => 0x6bb4, 0xa4 => 0x738b,
+    0xa5 => 0x7fc1, 0xa6 => 0x8956, 0xa7 => 0x9d2c, 0xa8 => 0x9d0e,
+    0xa9 => 0x9ec4, 0xaa => 0x5ca1, 0xab => 0x6c96, 0xac => 0x837b,
+    0xad => 0x5104, 0xae => 0x5c4b, 0xaf => 0x61b6, 0xb0 => 0x81c6,
+    0xb1 => 0x6876, 0xb2 => 0x7261, 0xb3 => 0x4e59, 0xb4 => 0x4ffa,
+    0xb5 => 0x5378, 0xb6 => 0x6069, 0xb7 => 0x6e29, 0xb8 => 0x7a4f,
+    0xb9 => 0x97f3, 0xba => 0x4e0b, 0xbb => 0x5316, 0xbc => 0x4eee,
+    0xbd => 0x4f55, 0xbe => 0x4f3d, 0xbf => 0x4fa1, 0xc0 => 0x4f73,
+    0xc1 => 0x52a0, 0xc2 => 0x53ef, 0xc3 => 0x5609, 0xc4 => 0x590f,
+    0xc5 => 0x5ac1, 0xc6 => 0x5bb6, 0xc7 => 0x5be1, 0xc8 => 0x79d1,
+    0xc9 => 0x6687, 0xca => 0x679c, 0xcb => 0x67b6, 0xcc => 0x6b4c,
+    0xcd => 0x6cb3, 0xce => 0x706b, 0xcf => 0x73c2, 0xd0 => 0x798d,
+    0xd1 => 0x79be, 0xd2 => 0x7a3c, 0xd3 => 0x7b87, 0xd4 => 0x82b1,
+    0xd5 => 0x82db, 0xd6 => 0x8304, 0xd7 => 0x8377, 0xd8 => 0x83ef,
+    0xd9 => 0x83d3, 0xda => 0x8766, 0xdb => 0x8ab2, 0xdc => 0x5629,
+    0xdd => 0x8ca8, 0xde => 0x8fe6, 0xdf => 0x904e, 0xe0 => 0x971e,
+    0xe1 => 0x868a, 0xe2 => 0x4fc4, 0xe3 => 0x5ce8, 0xe4 => 0x6211,
+    0xe5 => 0x7259, 0xe6 => 0x753b, 0xe7 => 0x81e5, 0xe8 => 0x82bd,
+    0xe9 => 0x86fe, 0xea => 0x8cc0, 0xeb => 0x96c5, 0xec => 0x9913,
+    0xed => 0x99d5, 0xee => 0x4ecb, 0xef => 0x4f1a, 0xf0 => 0x89e3,
+    0xf1 => 0x56de, 0xf2 => 0x584a, 0xf3 => 0x58ca, 0xf4 => 0x5efb,
+    0xf5 => 0x5feb, 0xf6 => 0x602a, 0xf7 => 0x6094, 0xf8 => 0x6062,
+    0xf9 => 0x61d0, 0xfa => 0x6212, 0xfb => 0x62d0, 0xfc => 0x6539,
+  },
+  0x8a => {
+    0x40 => 0x9b41, 0x41 => 0x6666, 0x42 => 0x68b0, 0x43 => 0x6d77,
+    0x44 => 0x7070, 0x45 => 0x754c, 0x46 => 0x7686, 0x47 => 0x7d75,
+    0x48 => 0x82a5, 0x49 => 0x87f9, 0x4a => 0x958b, 0x4b => 0x968e,
+    0x4c => 0x8c9d, 0x4d => 0x51f1, 0x4e => 0x52be, 0x4f => 0x5916,
+    0x50 => 0x54b3, 0x51 => 0x5bb3, 0x52 => 0x5d16, 0x53 => 0x6168,
+    0x54 => 0x6982, 0x55 => 0x6daf, 0x56 => 0x788d, 0x57 => 0x84cb,
+    0x58 => 0x8857, 0x59 => 0x8a72, 0x5a => 0x93a7, 0x5b => 0x9ab8,
+    0x5c => 0x6d6c, 0x5d => 0x99a8, 0x5e => 0x86d9, 0x5f => 0x57a3,
+    0x60 => 0x67ff, 0x61 => 0x86ce, 0x62 => 0x920e, 0x63 => 0x5283,
+    0x64 => 0x5687, 0x65 => 0x5404, 0x66 => 0x5ed3, 0x67 => 0x62e1,
+    0x68 => 0x64b9, 0x69 => 0x683c, 0x6a => 0x6838, 0x6b => 0x6bbb,
+    0x6c => 0x7372, 0x6d => 0x78ba, 0x6e => 0x7a6b, 0x6f => 0x899a,
+    0x70 => 0x89d2, 0x71 => 0x8d6b, 0x72 => 0x8f03, 0x73 => 0x90ed,
+    0x74 => 0x95a3, 0x75 => 0x9694, 0x76 => 0x9769, 0x77 => 0x5b66,
+    0x78 => 0x5cb3, 0x79 => 0x697d, 0x7a => 0x984d, 0x7b => 0x984e,
+    0x7c => 0x639b, 0x7d => 0x7b20, 0x7e => 0x6a2b, 0x80 => 0x6a7f,
+    0x81 => 0x68b6, 0x82 => 0x9c0d, 0x83 => 0x6f5f, 0x84 => 0x5272,
+    0x85 => 0x559d, 0x86 => 0x6070, 0x87 => 0x62ec, 0x88 => 0x6d3b,
+    0x89 => 0x6e07, 0x8a => 0x6ed1, 0x8b => 0x845b, 0x8c => 0x8910,
+    0x8d => 0x8f44, 0x8e => 0x4e14, 0x8f => 0x9c39, 0x90 => 0x53f6,
+    0x91 => 0x691b, 0x92 => 0x6a3a, 0x93 => 0x9784, 0x94 => 0x682a,
+    0x95 => 0x515c, 0x96 => 0x7ac3, 0x97 => 0x84b2, 0x98 => 0x91dc,
+    0x99 => 0x938c, 0x9a => 0x565b, 0x9b => 0x9d28, 0x9c => 0x6822,
+    0x9d => 0x8305, 0x9e => 0x8431, 0x9f => 0x7ca5, 0xa0 => 0x5208,
+    0xa1 => 0x82c5, 0xa2 => 0x74e6, 0xa3 => 0x4e7e, 0xa4 => 0x4f83,
+    0xa5 => 0x51a0, 0xa6 => 0x5bd2, 0xa7 => 0x520a, 0xa8 => 0x52d8,
+    0xa9 => 0x52e7, 0xaa => 0x5dfb, 0xab => 0x559a, 0xac => 0x582a,
+    0xad => 0x59e6, 0xae => 0x5b8c, 0xaf => 0x5b98, 0xb0 => 0x5bdb,
+    0xb1 => 0x5e72, 0xb2 => 0x5e79, 0xb3 => 0x60a3, 0xb4 => 0x611f,
+    0xb5 => 0x6163, 0xb6 => 0x61be, 0xb7 => 0x63db, 0xb8 => 0x6562,
+    0xb9 => 0x67d1, 0xba => 0x6853, 0xbb => 0x68fa, 0xbc => 0x6b3e,
+    0xbd => 0x6b53, 0xbe => 0x6c57, 0xbf => 0x6f22, 0xc0 => 0x6f97,
+    0xc1 => 0x6f45, 0xc2 => 0x74b0, 0xc3 => 0x7518, 0xc4 => 0x76e3,
+    0xc5 => 0x770b, 0xc6 => 0x7aff, 0xc7 => 0x7ba1, 0xc8 => 0x7c21,
+    0xc9 => 0x7de9, 0xca => 0x7f36, 0xcb => 0x7ff0, 0xcc => 0x809d,
+    0xcd => 0x8266, 0xce => 0x839e, 0xcf => 0x89b3, 0xd0 => 0x8acc,
+    0xd1 => 0x8cab, 0xd2 => 0x9084, 0xd3 => 0x9451, 0xd4 => 0x9593,
+    0xd5 => 0x9591, 0xd6 => 0x95a2, 0xd7 => 0x9665, 0xd8 => 0x97d3,
+    0xd9 => 0x9928, 0xda => 0x8218, 0xdb => 0x4e38, 0xdc => 0x542b,
+    0xdd => 0x5cb8, 0xde => 0x5dcc, 0xdf => 0x73a9, 0xe0 => 0x764c,
+    0xe1 => 0x773c, 0xe2 => 0x5ca9, 0xe3 => 0x7feb, 0xe4 => 0x8d0b,
+    0xe5 => 0x96c1, 0xe6 => 0x9811, 0xe7 => 0x9854, 0xe8 => 0x9858,
+    0xe9 => 0x4f01, 0xea => 0x4f0e, 0xeb => 0x5371, 0xec => 0x559c,
+    0xed => 0x5668, 0xee => 0x57fa, 0xef => 0x5947, 0xf0 => 0x5b09,
+    0xf1 => 0x5bc4, 0xf2 => 0x5c90, 0xf3 => 0x5e0c, 0xf4 => 0x5e7e,
+    0xf5 => 0x5fcc, 0xf6 => 0x63ee, 0xf7 => 0x673a, 0xf8 => 0x65d7,
+    0xf9 => 0x65e2, 0xfa => 0x671f, 0xfb => 0x68cb, 0xfc => 0x68c4,
+  },
+  0x8b => {
+    0x40 => 0x6a5f, 0x41 => 0x5e30, 0x42 => 0x6bc5, 0x43 => 0x6c17,
+    0x44 => 0x6c7d, 0x45 => 0x757f, 0x46 => 0x7948, 0x47 => 0x5b63,
+    0x48 => 0x7a00, 0x49 => 0x7d00, 0x4a => 0x5fbd, 0x4b => 0x898f,
+    0x4c => 0x8a18, 0x4d => 0x8cb4, 0x4e => 0x8d77, 0x4f => 0x8ecc,
+    0x50 => 0x8f1d, 0x51 => 0x98e2, 0x52 => 0x9a0e, 0x53 => 0x9b3c,
+    0x54 => 0x4e80, 0x55 => 0x507d, 0x56 => 0x5100, 0x57 => 0x5993,
+    0x58 => 0x5b9c, 0x59 => 0x622f, 0x5a => 0x6280, 0x5b => 0x64ec,
+    0x5c => 0x6b3a, 0x5d => 0x72a0, 0x5e => 0x7591, 0x5f => 0x7947,
+    0x60 => 0x7fa9, 0x61 => 0x87fb, 0x62 => 0x8abc, 0x63 => 0x8b70,
+    0x64 => 0x63ac, 0x65 => 0x83ca, 0x66 => 0x97a0, 0x67 => 0x5409,
+    0x68 => 0x5403, 0x69 => 0x55ab, 0x6a => 0x6854, 0x6b => 0x6a58,
+    0x6c => 0x8a70, 0x6d => 0x7827, 0x6e => 0x6775, 0x6f => 0x9ecd,
+    0x70 => 0x5374, 0x71 => 0x5ba2, 0x72 => 0x811a, 0x73 => 0x8650,
+    0x74 => 0x9006, 0x75 => 0x4e18, 0x76 => 0x4e45, 0x77 => 0x4ec7,
+    0x78 => 0x4f11, 0x79 => 0x53ca, 0x7a => 0x5438, 0x7b => 0x5bae,
+    0x7c => 0x5f13, 0x7d => 0x6025, 0x7e => 0x6551, 0x80 => 0x673d,
+    0x81 => 0x6c42, 0x82 => 0x6c72, 0x83 => 0x6ce3, 0x84 => 0x7078,
+    0x85 => 0x7403, 0x86 => 0x7a76, 0x87 => 0x7aae, 0x88 => 0x7b08,
+    0x89 => 0x7d1a, 0x8a => 0x7cfe, 0x8b => 0x7d66, 0x8c => 0x65e7,
+    0x8d => 0x725b, 0x8e => 0x53bb, 0x8f => 0x5c45, 0x90 => 0x5de8,
+    0x91 => 0x62d2, 0x92 => 0x62e0, 0x93 => 0x6319, 0x94 => 0x6e20,
+    0x95 => 0x865a, 0x96 => 0x8a31, 0x97 => 0x8ddd, 0x98 => 0x92f8,
+    0x99 => 0x6f01, 0x9a => 0x79a6, 0x9b => 0x9b5a, 0x9c => 0x4ea8,
+    0x9d => 0x4eab, 0x9e => 0x4eac, 0x9f => 0x4f9b, 0xa0 => 0x4fa0,
+    0xa1 => 0x50d1, 0xa2 => 0x5147, 0xa3 => 0x7af6, 0xa4 => 0x5171,
+    0xa5 => 0x51f6, 0xa6 => 0x5354, 0xa7 => 0x5321, 0xa8 => 0x537f,
+    0xa9 => 0x53eb, 0xaa => 0x55ac, 0xab => 0x5883, 0xac => 0x5ce1,
+    0xad => 0x5f37, 0xae => 0x5f4a, 0xaf => 0x602f, 0xb0 => 0x6050,
+    0xb1 => 0x606d, 0xb2 => 0x631f, 0xb3 => 0x6559, 0xb4 => 0x6a4b,
+    0xb5 => 0x6cc1, 0xb6 => 0x72c2, 0xb7 => 0x72ed, 0xb8 => 0x77ef,
+    0xb9 => 0x80f8, 0xba => 0x8105, 0xbb => 0x8208, 0xbc => 0x854e,
+    0xbd => 0x90f7, 0xbe => 0x93e1, 0xbf => 0x97ff, 0xc0 => 0x9957,
+    0xc1 => 0x9a5a, 0xc2 => 0x4ef0, 0xc3 => 0x51dd, 0xc4 => 0x5c2d,
+    0xc5 => 0x6681, 0xc6 => 0x696d, 0xc7 => 0x5c40, 0xc8 => 0x66f2,
+    0xc9 => 0x6975, 0xca => 0x7389, 0xcb => 0x6850, 0xcc => 0x7c81,
+    0xcd => 0x50c5, 0xce => 0x52e4, 0xcf => 0x5747, 0xd0 => 0x5dfe,
+    0xd1 => 0x9326, 0xd2 => 0x65a4, 0xd3 => 0x6b23, 0xd4 => 0x6b3d,
+    0xd5 => 0x7434, 0xd6 => 0x7981, 0xd7 => 0x79bd, 0xd8 => 0x7b4b,
+    0xd9 => 0x7dca, 0xda => 0x82b9, 0xdb => 0x83cc, 0xdc => 0x887f,
+    0xdd => 0x895f, 0xde => 0x8b39, 0xdf => 0x8fd1, 0xe0 => 0x91d1,
+    0xe1 => 0x541f, 0xe2 => 0x9280, 0xe3 => 0x4e5d, 0xe4 => 0x5036,
+    0xe5 => 0x53e5, 0xe6 => 0x533a, 0xe7 => 0x72d7, 0xe8 => 0x7396,
+    0xe9 => 0x77e9, 0xea => 0x82e6, 0xeb => 0x8eaf, 0xec => 0x99c6,
+    0xed => 0x99c8, 0xee => 0x99d2, 0xef => 0x5177, 0xf0 => 0x611a,
+    0xf1 => 0x865e, 0xf2 => 0x55b0, 0xf3 => 0x7a7a, 0xf4 => 0x5076,
+    0xf5 => 0x5bd3, 0xf6 => 0x9047, 0xf7 => 0x9685, 0xf8 => 0x4e32,
+    0xf9 => 0x6adb, 0xfa => 0x91e7, 0xfb => 0x5c51, 0xfc => 0x5c48,
+  },
+  0x8c => {
+    0x40 => 0x6398, 0x41 => 0x7a9f, 0x42 => 0x6c93, 0x43 => 0x9774,
+    0x44 => 0x8f61, 0x45 => 0x7aaa, 0x46 => 0x718a, 0x47 => 0x9688,
+    0x48 => 0x7c82, 0x49 => 0x6817, 0x4a => 0x7e70, 0x4b => 0x6851,
+    0x4c => 0x936c, 0x4d => 0x52f2, 0x4e => 0x541b, 0x4f => 0x85ab,
+    0x50 => 0x8a13, 0x51 => 0x7fa4, 0x52 => 0x8ecd, 0x53 => 0x90e1,
+    0x54 => 0x5366, 0x55 => 0x8888, 0x56 => 0x7941, 0x57 => 0x4fc2,
+    0x58 => 0x50be, 0x59 => 0x5211, 0x5a => 0x5144, 0x5b => 0x5553,
+    0x5c => 0x572d, 0x5d => 0x73ea, 0x5e => 0x578b, 0x5f => 0x5951,
+    0x60 => 0x5f62, 0x61 => 0x5f84, 0x62 => 0x6075, 0x63 => 0x6176,
+    0x64 => 0x6167, 0x65 => 0x61a9, 0x66 => 0x63b2, 0x67 => 0x643a,
+    0x68 => 0x656c, 0x69 => 0x666f, 0x6a => 0x6842, 0x6b => 0x6e13,
+    0x6c => 0x7566, 0x6d => 0x7a3d, 0x6e => 0x7cfb, 0x6f => 0x7d4c,
+    0x70 => 0x7d99, 0x71 => 0x7e4b, 0x72 => 0x7f6b, 0x73 => 0x830e,
+    0x74 => 0x834a, 0x75 => 0x86cd, 0x76 => 0x8a08, 0x77 => 0x8a63,
+    0x78 => 0x8b66, 0x79 => 0x8efd, 0x7a => 0x981a, 0x7b => 0x9d8f,
+    0x7c => 0x82b8, 0x7d => 0x8fce, 0x7e => 0x9be8, 0x80 => 0x5287,
+    0x81 => 0x621f, 0x82 => 0x6483, 0x83 => 0x6fc0, 0x84 => 0x9699,
+    0x85 => 0x6841, 0x86 => 0x5091, 0x87 => 0x6b20, 0x88 => 0x6c7a,
+    0x89 => 0x6f54, 0x8a => 0x7a74, 0x8b => 0x7d50, 0x8c => 0x8840,
+    0x8d => 0x8a23, 0x8e => 0x6708, 0x8f => 0x4ef6, 0x90 => 0x5039,
+    0x91 => 0x5026, 0x92 => 0x5065, 0x93 => 0x517c, 0x94 => 0x5238,
+    0x95 => 0x5263, 0x96 => 0x55a7, 0x97 => 0x570f, 0x98 => 0x5805,
+    0x99 => 0x5acc, 0x9a => 0x5efa, 0x9b => 0x61b2, 0x9c => 0x61f8,
+    0x9d => 0x62f3, 0x9e => 0x6372, 0x9f => 0x691c, 0xa0 => 0x6a29,
+    0xa1 => 0x727d, 0xa2 => 0x72ac, 0xa3 => 0x732e, 0xa4 => 0x7814,
+    0xa5 => 0x786f, 0xa6 => 0x7d79, 0xa7 => 0x770c, 0xa8 => 0x80a9,
+    0xa9 => 0x898b, 0xaa => 0x8b19, 0xab => 0x8ce2, 0xac => 0x8ed2,
+    0xad => 0x9063, 0xae => 0x9375, 0xaf => 0x967a, 0xb0 => 0x9855,
+    0xb1 => 0x9a13, 0xb2 => 0x9e78, 0xb3 => 0x5143, 0xb4 => 0x539f,
+    0xb5 => 0x53b3, 0xb6 => 0x5e7b, 0xb7 => 0x5f26, 0xb8 => 0x6e1b,
+    0xb9 => 0x6e90, 0xba => 0x7384, 0xbb => 0x73fe, 0xbc => 0x7d43,
+    0xbd => 0x8237, 0xbe => 0x8a00, 0xbf => 0x8afa, 0xc0 => 0x9650,
+    0xc1 => 0x4e4e, 0xc2 => 0x500b, 0xc3 => 0x53e4, 0xc4 => 0x547c,
+    0xc5 => 0x56fa, 0xc6 => 0x59d1, 0xc7 => 0x5b64, 0xc8 => 0x5df1,
+    0xc9 => 0x5eab, 0xca => 0x5f27, 0xcb => 0x6238, 0xcc => 0x6545,
+    0xcd => 0x67af, 0xce => 0x6e56, 0xcf => 0x72d0, 0xd0 => 0x7cca,
+    0xd1 => 0x88b4, 0xd2 => 0x80a1, 0xd3 => 0x80e1, 0xd4 => 0x83f0,
+    0xd5 => 0x864e, 0xd6 => 0x8a87, 0xd7 => 0x8de8, 0xd8 => 0x9237,
+    0xd9 => 0x96c7, 0xda => 0x9867, 0xdb => 0x9f13, 0xdc => 0x4e94,
+    0xdd => 0x4e92, 0xde => 0x4f0d, 0xdf => 0x5348, 0xe0 => 0x5449,
+    0xe1 => 0x543e, 0xe2 => 0x5a2f, 0xe3 => 0x5f8c, 0xe4 => 0x5fa1,
+    0xe5 => 0x609f, 0xe6 => 0x68a7, 0xe7 => 0x6a8e, 0xe8 => 0x745a,
+    0xe9 => 0x7881, 0xea => 0x8a9e, 0xeb => 0x8aa4, 0xec => 0x8b77,
+    0xed => 0x9190, 0xee => 0x4e5e, 0xef => 0x9bc9, 0xf0 => 0x4ea4,
+    0xf1 => 0x4f7c, 0xf2 => 0x4faf, 0xf3 => 0x5019, 0xf4 => 0x5016,
+    0xf5 => 0x5149, 0xf6 => 0x516c, 0xf7 => 0x529f, 0xf8 => 0x52b9,
+    0xf9 => 0x52fe, 0xfa => 0x539a, 0xfb => 0x53e3, 0xfc => 0x5411,
+  },
+  0x8d => {
+    0x40 => 0x540e, 0x41 => 0x5589, 0x42 => 0x5751, 0x43 => 0x57a2,
+    0x44 => 0x597d, 0x45 => 0x5b54, 0x46 => 0x5b5d, 0x47 => 0x5b8f,
+    0x48 => 0x5de5, 0x49 => 0x5de7, 0x4a => 0x5df7, 0x4b => 0x5e78,
+    0x4c => 0x5e83, 0x4d => 0x5e9a, 0x4e => 0x5eb7, 0x4f => 0x5f18,
+    0x50 => 0x6052, 0x51 => 0x614c, 0x52 => 0x6297, 0x53 => 0x62d8,
+    0x54 => 0x63a7, 0x55 => 0x653b, 0x56 => 0x6602, 0x57 => 0x6643,
+    0x58 => 0x66f4, 0x59 => 0x676d, 0x5a => 0x6821, 0x5b => 0x6897,
+    0x5c => 0x69cb, 0x5d => 0x6c5f, 0x5e => 0x6d2a, 0x5f => 0x6d69,
+    0x60 => 0x6e2f, 0x61 => 0x6e9d, 0x62 => 0x7532, 0x63 => 0x7687,
+    0x64 => 0x786c, 0x65 => 0x7a3f, 0x66 => 0x7ce0, 0x67 => 0x7d05,
+    0x68 => 0x7d18, 0x69 => 0x7d5e, 0x6a => 0x7db1, 0x6b => 0x8015,
+    0x6c => 0x8003, 0x6d => 0x80af, 0x6e => 0x80b1, 0x6f => 0x8154,
+    0x70 => 0x818f, 0x71 => 0x822a, 0x72 => 0x8352, 0x73 => 0x884c,
+    0x74 => 0x8861, 0x75 => 0x8b1b, 0x76 => 0x8ca2, 0x77 => 0x8cfc,
+    0x78 => 0x90ca, 0x79 => 0x9175, 0x7a => 0x9271, 0x7b => 0x783f,
+    0x7c => 0x92fc, 0x7d => 0x95a4, 0x7e => 0x964d, 0x80 => 0x9805,
+    0x81 => 0x9999, 0x82 => 0x9ad8, 0x83 => 0x9d3b, 0x84 => 0x525b,
+    0x85 => 0x52ab, 0x86 => 0x53f7, 0x87 => 0x5408, 0x88 => 0x58d5,
+    0x89 => 0x62f7, 0x8a => 0x6fe0, 0x8b => 0x8c6a, 0x8c => 0x8f5f,
+    0x8d => 0x9eb9, 0x8e => 0x514b, 0x8f => 0x523b, 0x90 => 0x544a,
+    0x91 => 0x56fd, 0x92 => 0x7a40, 0x93 => 0x9177, 0x94 => 0x9d60,
+    0x95 => 0x9ed2, 0x96 => 0x7344, 0x97 => 0x6f09, 0x98 => 0x8170,
+    0x99 => 0x7511, 0x9a => 0x5ffd, 0x9b => 0x60da, 0x9c => 0x9aa8,
+    0x9d => 0x72db, 0x9e => 0x8fbc, 0x9f => 0x6b64, 0xa0 => 0x9803,
+    0xa1 => 0x4eca, 0xa2 => 0x56f0, 0xa3 => 0x5764, 0xa4 => 0x58be,
+    0xa5 => 0x5a5a, 0xa6 => 0x6068, 0xa7 => 0x61c7, 0xa8 => 0x660f,
+    0xa9 => 0x6606, 0xaa => 0x6839, 0xab => 0x68b1, 0xac => 0x6df7,
+    0xad => 0x75d5, 0xae => 0x7d3a, 0xaf => 0x826e, 0xb0 => 0x9b42,
+    0xb1 => 0x4e9b, 0xb2 => 0x4f50, 0xb3 => 0x53c9, 0xb4 => 0x5506,
+    0xb5 => 0x5d6f, 0xb6 => 0x5de6, 0xb7 => 0x5dee, 0xb8 => 0x67fb,
+    0xb9 => 0x6c99, 0xba => 0x7473, 0xbb => 0x7802, 0xbc => 0x8a50,
+    0xbd => 0x9396, 0xbe => 0x88df, 0xbf => 0x5750, 0xc0 => 0x5ea7,
+    0xc1 => 0x632b, 0xc2 => 0x50b5, 0xc3 => 0x50ac, 0xc4 => 0x518d,
+    0xc5 => 0x6700, 0xc6 => 0x54c9, 0xc7 => 0x585e, 0xc8 => 0x59bb,
+    0xc9 => 0x5bb0, 0xca => 0x5f69, 0xcb => 0x624d, 0xcc => 0x63a1,
+    0xcd => 0x683d, 0xce => 0x6b73, 0xcf => 0x6e08, 0xd0 => 0x707d,
+    0xd1 => 0x91c7, 0xd2 => 0x7280, 0xd3 => 0x7815, 0xd4 => 0x7826,
+    0xd5 => 0x796d, 0xd6 => 0x658e, 0xd7 => 0x7d30, 0xd8 => 0x83dc,
+    0xd9 => 0x88c1, 0xda => 0x8f09, 0xdb => 0x969b, 0xdc => 0x5264,
+    0xdd => 0x5728, 0xde => 0x6750, 0xdf => 0x7f6a, 0xe0 => 0x8ca1,
+    0xe1 => 0x51b4, 0xe2 => 0x5742, 0xe3 => 0x962a, 0xe4 => 0x583a,
+    0xe5 => 0x698a, 0xe6 => 0x80b4, 0xe7 => 0x54b2, 0xe8 => 0x5d0e,
+    0xe9 => 0x57fc, 0xea => 0x7895, 0xeb => 0x9dfa, 0xec => 0x4f5c,
+    0xed => 0x524a, 0xee => 0x548b, 0xef => 0x643e, 0xf0 => 0x6628,
+    0xf1 => 0x6714, 0xf2 => 0x67f5, 0xf3 => 0x7a84, 0xf4 => 0x7b56,
+    0xf5 => 0x7d22, 0xf6 => 0x932f, 0xf7 => 0x685c, 0xf8 => 0x9bad,
+    0xf9 => 0x7b39, 0xfa => 0x5319, 0xfb => 0x518a, 0xfc => 0x5237,
+  },
+  0x8e => {
+    0x40 => 0x5bdf, 0x41 => 0x62f6, 0x42 => 0x64ae, 0x43 => 0x64e6,
+    0x44 => 0x672d, 0x45 => 0x6bba, 0x46 => 0x85a9, 0x47 => 0x96d1,
+    0x48 => 0x7690, 0x49 => 0x9bd6, 0x4a => 0x634c, 0x4b => 0x9306,
+    0x4c => 0x9bab, 0x4d => 0x76bf, 0x4e => 0x6652, 0x4f => 0x4e09,
+    0x50 => 0x5098, 0x51 => 0x53c2, 0x52 => 0x5c71, 0x53 => 0x60e8,
+    0x54 => 0x6492, 0x55 => 0x6563, 0x56 => 0x685f, 0x57 => 0x71e6,
+    0x58 => 0x73ca, 0x59 => 0x7523, 0x5a => 0x7b97, 0x5b => 0x7e82,
+    0x5c => 0x8695, 0x5d => 0x8b83, 0x5e => 0x8cdb, 0x5f => 0x9178,
+    0x60 => 0x9910, 0x61 => 0x65ac, 0x62 => 0x66ab, 0x63 => 0x6b8b,
+    0x64 => 0x4ed5, 0x65 => 0x4ed4, 0x66 => 0x4f3a, 0x67 => 0x4f7f,
+    0x68 => 0x523a, 0x69 => 0x53f8, 0x6a => 0x53f2, 0x6b => 0x55e3,
+    0x6c => 0x56db, 0x6d => 0x58eb, 0x6e => 0x59cb, 0x6f => 0x59c9,
+    0x70 => 0x59ff, 0x71 => 0x5b50, 0x72 => 0x5c4d, 0x73 => 0x5e02,
+    0x74 => 0x5e2b, 0x75 => 0x5fd7, 0x76 => 0x601d, 0x77 => 0x6307,
+    0x78 => 0x652f, 0x79 => 0x5b5c, 0x7a => 0x65af, 0x7b => 0x65bd,
+    0x7c => 0x65e8, 0x7d => 0x679d, 0x7e => 0x6b62, 0x80 => 0x6b7b,
+    0x81 => 0x6c0f, 0x82 => 0x7345, 0x83 => 0x7949, 0x84 => 0x79c1,
+    0x85 => 0x7cf8, 0x86 => 0x7d19, 0x87 => 0x7d2b, 0x88 => 0x80a2,
+    0x89 => 0x8102, 0x8a => 0x81f3, 0x8b => 0x8996, 0x8c => 0x8a5e,
+    0x8d => 0x8a69, 0x8e => 0x8a66, 0x8f => 0x8a8c, 0x90 => 0x8aee,
+    0x91 => 0x8cc7, 0x92 => 0x8cdc, 0x93 => 0x96cc, 0x94 => 0x98fc,
+    0x95 => 0x6b6f, 0x96 => 0x4e8b, 0x97 => 0x4f3c, 0x98 => 0x4f8d,
+    0x99 => 0x5150, 0x9a => 0x5b57, 0x9b => 0x5bfa, 0x9c => 0x6148,
+    0x9d => 0x6301, 0x9e => 0x6642, 0x9f => 0x6b21, 0xa0 => 0x6ecb,
+    0xa1 => 0x6cbb, 0xa2 => 0x723e, 0xa3 => 0x74bd, 0xa4 => 0x75d4,
+    0xa5 => 0x78c1, 0xa6 => 0x793a, 0xa7 => 0x800c, 0xa8 => 0x8033,
+    0xa9 => 0x81ea, 0xaa => 0x8494, 0xab => 0x8f9e, 0xac => 0x6c50,
+    0xad => 0x9e7f, 0xae => 0x5f0f, 0xaf => 0x8b58, 0xb0 => 0x9d2b,
+    0xb1 => 0x7afa, 0xb2 => 0x8ef8, 0xb3 => 0x5b8d, 0xb4 => 0x96eb,
+    0xb5 => 0x4e03, 0xb6 => 0x53f1, 0xb7 => 0x57f7, 0xb8 => 0x5931,
+    0xb9 => 0x5ac9, 0xba => 0x5ba4, 0xbb => 0x6089, 0xbc => 0x6e7f,
+    0xbd => 0x6f06, 0xbe => 0x75be, 0xbf => 0x8cea, 0xc0 => 0x5b9f,
+    0xc1 => 0x8500, 0xc2 => 0x7be0, 0xc3 => 0x5072, 0xc4 => 0x67f4,
+    0xc5 => 0x829d, 0xc6 => 0x5c61, 0xc7 => 0x854a, 0xc8 => 0x7e1e,
+    0xc9 => 0x820e, 0xca => 0x5199, 0xcb => 0x5c04, 0xcc => 0x6368,
+    0xcd => 0x8d66, 0xce => 0x659c, 0xcf => 0x716e, 0xd0 => 0x793e,
+    0xd1 => 0x7d17, 0xd2 => 0x8005, 0xd3 => 0x8b1d, 0xd4 => 0x8eca,
+    0xd5 => 0x906e, 0xd6 => 0x86c7, 0xd7 => 0x90aa, 0xd8 => 0x501f,
+    0xd9 => 0x52fa, 0xda => 0x5c3a, 0xdb => 0x6753, 0xdc => 0x707c,
+    0xdd => 0x7235, 0xde => 0x914c, 0xdf => 0x91c8, 0xe0 => 0x932b,
+    0xe1 => 0x82e5, 0xe2 => 0x5bc2, 0xe3 => 0x5f31, 0xe4 => 0x60f9,
+    0xe5 => 0x4e3b, 0xe6 => 0x53d6, 0xe7 => 0x5b88, 0xe8 => 0x624b,
+    0xe9 => 0x6731, 0xea => 0x6b8a, 0xeb => 0x72e9, 0xec => 0x73e0,
+    0xed => 0x7a2e, 0xee => 0x816b, 0xef => 0x8da3, 0xf0 => 0x9152,
+    0xf1 => 0x9996, 0xf2 => 0x5112, 0xf3 => 0x53d7, 0xf4 => 0x546a,
+    0xf5 => 0x5bff, 0xf6 => 0x6388, 0xf7 => 0x6a39, 0xf8 => 0x7dac,
+    0xf9 => 0x9700, 0xfa => 0x56da, 0xfb => 0x53ce, 0xfc => 0x5468,
+  },
+  0x8f => {
+    0x40 => 0x5b97, 0x41 => 0x5c31, 0x42 => 0x5dde, 0x43 => 0x4fee,
+    0x44 => 0x6101, 0x45 => 0x62fe, 0x46 => 0x6d32, 0x47 => 0x79c0,
+    0x48 => 0x79cb, 0x49 => 0x7d42, 0x4a => 0x7e4d, 0x4b => 0x7fd2,
+    0x4c => 0x81ed, 0x4d => 0x821f, 0x4e => 0x8490, 0x4f => 0x8846,
+    0x50 => 0x8972, 0x51 => 0x8b90, 0x52 => 0x8e74, 0x53 => 0x8f2f,
+    0x54 => 0x9031, 0x55 => 0x914b, 0x56 => 0x916c, 0x57 => 0x96c6,
+    0x58 => 0x919c, 0x59 => 0x4ec0, 0x5a => 0x4f4f, 0x5b => 0x5145,
+    0x5c => 0x5341, 0x5d => 0x5f93, 0x5e => 0x620e, 0x5f => 0x67d4,
+    0x60 => 0x6c41, 0x61 => 0x6e0b, 0x62 => 0x7363, 0x63 => 0x7e26,
+    0x64 => 0x91cd, 0x65 => 0x9283, 0x66 => 0x53d4, 0x67 => 0x5919,
+    0x68 => 0x5bbf, 0x69 => 0x6dd1, 0x6a => 0x795d, 0x6b => 0x7e2e,
+    0x6c => 0x7c9b, 0x6d => 0x587e, 0x6e => 0x719f, 0x6f => 0x51fa,
+    0x70 => 0x8853, 0x71 => 0x8ff0, 0x72 => 0x4fca, 0x73 => 0x5cfb,
+    0x74 => 0x6625, 0x75 => 0x77ac, 0x76 => 0x7ae3, 0x77 => 0x821c,
+    0x78 => 0x99ff, 0x79 => 0x51c6, 0x7a => 0x5faa, 0x7b => 0x65ec,
+    0x7c => 0x696f, 0x7d => 0x6b89, 0x7e => 0x6df3, 0x80 => 0x6e96,
+    0x81 => 0x6f64, 0x82 => 0x76fe, 0x83 => 0x7d14, 0x84 => 0x5de1,
+    0x85 => 0x9075, 0x86 => 0x9187, 0x87 => 0x9806, 0x88 => 0x51e6,
+    0x89 => 0x521d, 0x8a => 0x6240, 0x8b => 0x6691, 0x8c => 0x66d9,
+    0x8d => 0x6e1a, 0x8e => 0x5eb6, 0x8f => 0x7dd2, 0x90 => 0x7f72,
+    0x91 => 0x66f8, 0x92 => 0x85af, 0x93 => 0x85f7, 0x94 => 0x8af8,
+    0x95 => 0x52a9, 0x96 => 0x53d9, 0x97 => 0x5973, 0x98 => 0x5e8f,
+    0x99 => 0x5f90, 0x9a => 0x6055, 0x9b => 0x92e4, 0x9c => 0x9664,
+    0x9d => 0x50b7, 0x9e => 0x511f, 0x9f => 0x52dd, 0xa0 => 0x5320,
+    0xa1 => 0x5347, 0xa2 => 0x53ec, 0xa3 => 0x54e8, 0xa4 => 0x5546,
+    0xa5 => 0x5531, 0xa6 => 0x5617, 0xa7 => 0x5968, 0xa8 => 0x59be,
+    0xa9 => 0x5a3c, 0xaa => 0x5bb5, 0xab => 0x5c06, 0xac => 0x5c0f,
+    0xad => 0x5c11, 0xae => 0x5c1a, 0xaf => 0x5e84, 0xb0 => 0x5e8a,
+    0xb1 => 0x5ee0, 0xb2 => 0x5f70, 0xb3 => 0x627f, 0xb4 => 0x6284,
+    0xb5 => 0x62db, 0xb6 => 0x638c, 0xb7 => 0x6377, 0xb8 => 0x6607,
+    0xb9 => 0x660c, 0xba => 0x662d, 0xbb => 0x6676, 0xbc => 0x677e,
+    0xbd => 0x68a2, 0xbe => 0x6a1f, 0xbf => 0x6a35, 0xc0 => 0x6cbc,
+    0xc1 => 0x6d88, 0xc2 => 0x6e09, 0xc3 => 0x6e58, 0xc4 => 0x713c,
+    0xc5 => 0x7126, 0xc6 => 0x7167, 0xc7 => 0x75c7, 0xc8 => 0x7701,
+    0xc9 => 0x785d, 0xca => 0x7901, 0xcb => 0x7965, 0xcc => 0x79f0,
+    0xcd => 0x7ae0, 0xce => 0x7b11, 0xcf => 0x7ca7, 0xd0 => 0x7d39,
+    0xd1 => 0x8096, 0xd2 => 0x83d6, 0xd3 => 0x848b, 0xd4 => 0x8549,
+    0xd5 => 0x885d, 0xd6 => 0x88f3, 0xd7 => 0x8a1f, 0xd8 => 0x8a3c,
+    0xd9 => 0x8a54, 0xda => 0x8a73, 0xdb => 0x8c61, 0xdc => 0x8cde,
+    0xdd => 0x91a4, 0xde => 0x9266, 0xdf => 0x937e, 0xe0 => 0x9418,
+    0xe1 => 0x969c, 0xe2 => 0x9798, 0xe3 => 0x4e0a, 0xe4 => 0x4e08,
+    0xe5 => 0x4e1e, 0xe6 => 0x4e57, 0xe7 => 0x5197, 0xe8 => 0x5270,
+    0xe9 => 0x57ce, 0xea => 0x5834, 0xeb => 0x58cc, 0xec => 0x5b22,
+    0xed => 0x5e38, 0xee => 0x60c5, 0xef => 0x64fe, 0xf0 => 0x6761,
+    0xf1 => 0x6756, 0xf2 => 0x6d44, 0xf3 => 0x72b6, 0xf4 => 0x7573,
+    0xf5 => 0x7a63, 0xf6 => 0x84b8, 0xf7 => 0x8b72, 0xf8 => 0x91b8,
+    0xf9 => 0x9320, 0xfa => 0x5631, 0xfb => 0x57f4, 0xfc => 0x98fe,
+  },
+  0x90 => {
+    0x40 => 0x62ed, 0x41 => 0x690d, 0x42 => 0x6b96, 0x43 => 0x71ed,
+    0x44 => 0x7e54, 0x45 => 0x8077, 0x46 => 0x8272, 0x47 => 0x89e6,
+    0x48 => 0x98df, 0x49 => 0x8755, 0x4a => 0x8fb1, 0x4b => 0x5c3b,
+    0x4c => 0x4f38, 0x4d => 0x4fe1, 0x4e => 0x4fb5, 0x4f => 0x5507,
+    0x50 => 0x5a20, 0x51 => 0x5bdd, 0x52 => 0x5be9, 0x53 => 0x5fc3,
+    0x54 => 0x614e, 0x55 => 0x632f, 0x56 => 0x65b0, 0x57 => 0x664b,
+    0x58 => 0x68ee, 0x59 => 0x699b, 0x5a => 0x6d78, 0x5b => 0x6df1,
+    0x5c => 0x7533, 0x5d => 0x75b9, 0x5e => 0x771f, 0x5f => 0x795e,
+    0x60 => 0x79e6, 0x61 => 0x7d33, 0x62 => 0x81e3, 0x63 => 0x82af,
+    0x64 => 0x85aa, 0x65 => 0x89aa, 0x66 => 0x8a3a, 0x67 => 0x8eab,
+    0x68 => 0x8f9b, 0x69 => 0x9032, 0x6a => 0x91dd, 0x6b => 0x9707,
+    0x6c => 0x4eba, 0x6d => 0x4ec1, 0x6e => 0x5203, 0x6f => 0x5875,
+    0x70 => 0x58ec, 0x71 => 0x5c0b, 0x72 => 0x751a, 0x73 => 0x5c3d,
+    0x74 => 0x814e, 0x75 => 0x8a0a, 0x76 => 0x8fc5, 0x77 => 0x9663,
+    0x78 => 0x976d, 0x79 => 0x7b25, 0x7a => 0x8acf, 0x7b => 0x9808,
+    0x7c => 0x9162, 0x7d => 0x56f3, 0x7e => 0x53a8, 0x80 => 0x9017,
+    0x81 => 0x5439, 0x82 => 0x5782, 0x83 => 0x5e25, 0x84 => 0x63a8,
+    0x85 => 0x6c34, 0x86 => 0x708a, 0x87 => 0x7761, 0x88 => 0x7c8b,
+    0x89 => 0x7fe0, 0x8a => 0x8870, 0x8b => 0x9042, 0x8c => 0x9154,
+    0x8d => 0x9310, 0x8e => 0x9318, 0x8f => 0x968f, 0x90 => 0x745e,
+    0x91 => 0x9ac4, 0x92 => 0x5d07, 0x93 => 0x5d69, 0x94 => 0x6570,
+    0x95 => 0x67a2, 0x96 => 0x8da8, 0x97 => 0x96db, 0x98 => 0x636e,
+    0x99 => 0x6749, 0x9a => 0x6919, 0x9b => 0x83c5, 0x9c => 0x9817,
+    0x9d => 0x96c0, 0x9e => 0x88fe, 0x9f => 0x6f84, 0xa0 => 0x647a,
+    0xa1 => 0x5bf8, 0xa2 => 0x4e16, 0xa3 => 0x702c, 0xa4 => 0x755d,
+    0xa5 => 0x662f, 0xa6 => 0x51c4, 0xa7 => 0x5236, 0xa8 => 0x52e2,
+    0xa9 => 0x59d3, 0xaa => 0x5f81, 0xab => 0x6027, 0xac => 0x6210,
+    0xad => 0x653f, 0xae => 0x6574, 0xaf => 0x661f, 0xb0 => 0x6674,
+    0xb1 => 0x68f2, 0xb2 => 0x6816, 0xb3 => 0x6b63, 0xb4 => 0x6e05,
+    0xb5 => 0x7272, 0xb6 => 0x751f, 0xb7 => 0x76db, 0xb8 => 0x7cbe,
+    0xb9 => 0x8056, 0xba => 0x58f0, 0xbb => 0x88fd, 0xbc => 0x897f,
+    0xbd => 0x8aa0, 0xbe => 0x8a93, 0xbf => 0x8acb, 0xc0 => 0x901d,
+    0xc1 => 0x9192, 0xc2 => 0x9752, 0xc3 => 0x9759, 0xc4 => 0x6589,
+    0xc5 => 0x7a0e, 0xc6 => 0x8106, 0xc7 => 0x96bb, 0xc8 => 0x5e2d,
+    0xc9 => 0x60dc, 0xca => 0x621a, 0xcb => 0x65a5, 0xcc => 0x6614,
+    0xcd => 0x6790, 0xce => 0x77f3, 0xcf => 0x7a4d, 0xd0 => 0x7c4d,
+    0xd1 => 0x7e3e, 0xd2 => 0x810a, 0xd3 => 0x8cac, 0xd4 => 0x8d64,
+    0xd5 => 0x8de1, 0xd6 => 0x8e5f, 0xd7 => 0x78a9, 0xd8 => 0x5207,
+    0xd9 => 0x62d9, 0xda => 0x63a5, 0xdb => 0x6442, 0xdc => 0x6298,
+    0xdd => 0x8a2d, 0xde => 0x7a83, 0xdf => 0x7bc0, 0xe0 => 0x8aac,
+    0xe1 => 0x96ea, 0xe2 => 0x7d76, 0xe3 => 0x820c, 0xe4 => 0x8749,
+    0xe5 => 0x4ed9, 0xe6 => 0x5148, 0xe7 => 0x5343, 0xe8 => 0x5360,
+    0xe9 => 0x5ba3, 0xea => 0x5c02, 0xeb => 0x5c16, 0xec => 0x5ddd,
+    0xed => 0x6226, 0xee => 0x6247, 0xef => 0x64b0, 0xf0 => 0x6813,
+    0xf1 => 0x6834, 0xf2 => 0x6cc9, 0xf3 => 0x6d45, 0xf4 => 0x6d17,
+    0xf5 => 0x67d3, 0xf6 => 0x6f5c, 0xf7 => 0x714e, 0xf8 => 0x717d,
+    0xf9 => 0x65cb, 0xfa => 0x7a7f, 0xfb => 0x7bad, 0xfc => 0x7dda,
+  },
+  0x91 => {
+    0x40 => 0x7e4a, 0x41 => 0x7fa8, 0x42 => 0x817a, 0x43 => 0x821b,
+    0x44 => 0x8239, 0x45 => 0x85a6, 0x46 => 0x8a6e, 0x47 => 0x8cce,
+    0x48 => 0x8df5, 0x49 => 0x9078, 0x4a => 0x9077, 0x4b => 0x92ad,
+    0x4c => 0x9291, 0x4d => 0x9583, 0x4e => 0x9bae, 0x4f => 0x524d,
+    0x50 => 0x5584, 0x51 => 0x6f38, 0x52 => 0x7136, 0x53 => 0x5168,
+    0x54 => 0x7985, 0x55 => 0x7e55, 0x56 => 0x81b3, 0x57 => 0x7cce,
+    0x58 => 0x564c, 0x59 => 0x5851, 0x5a => 0x5ca8, 0x5b => 0x63aa,
+    0x5c => 0x66fe, 0x5d => 0x66fd, 0x5e => 0x695a, 0x5f => 0x72d9,
+    0x60 => 0x758f, 0x61 => 0x758e, 0x62 => 0x790e, 0x63 => 0x7956,
+    0x64 => 0x79df, 0x65 => 0x7c97, 0x66 => 0x7d20, 0x67 => 0x7d44,
+    0x68 => 0x8607, 0x69 => 0x8a34, 0x6a => 0x963b, 0x6b => 0x9061,
+    0x6c => 0x9f20, 0x6d => 0x50e7, 0x6e => 0x5275, 0x6f => 0x53cc,
+    0x70 => 0x53e2, 0x71 => 0x5009, 0x72 => 0x55aa, 0x73 => 0x58ee,
+    0x74 => 0x594f, 0x75 => 0x723d, 0x76 => 0x5b8b, 0x77 => 0x5c64,
+    0x78 => 0x531d, 0x79 => 0x60e3, 0x7a => 0x60f3, 0x7b => 0x635c,
+    0x7c => 0x6383, 0x7d => 0x633f, 0x7e => 0x63bb, 0x80 => 0x64cd,
+    0x81 => 0x65e9, 0x82 => 0x66f9, 0x83 => 0x5de3, 0x84 => 0x69cd,
+    0x85 => 0x69fd, 0x86 => 0x6f15, 0x87 => 0x71e5, 0x88 => 0x4e89,
+    0x89 => 0x75e9, 0x8a => 0x76f8, 0x8b => 0x7a93, 0x8c => 0x7cdf,
+    0x8d => 0x7dcf, 0x8e => 0x7d9c, 0x8f => 0x8061, 0x90 => 0x8349,
+    0x91 => 0x8358, 0x92 => 0x846c, 0x93 => 0x84bc, 0x94 => 0x85fb,
+    0x95 => 0x88c5, 0x96 => 0x8d70, 0x97 => 0x9001, 0x98 => 0x906d,
+    0x99 => 0x9397, 0x9a => 0x971c, 0x9b => 0x9a12, 0x9c => 0x50cf,
+    0x9d => 0x5897, 0x9e => 0x618e, 0x9f => 0x81d3, 0xa0 => 0x8535,
+    0xa1 => 0x8d08, 0xa2 => 0x9020, 0xa3 => 0x4fc3, 0xa4 => 0x5074,
+    0xa5 => 0x5247, 0xa6 => 0x5373, 0xa7 => 0x606f, 0xa8 => 0x6349,
+    0xa9 => 0x675f, 0xaa => 0x6e2c, 0xab => 0x8db3, 0xac => 0x901f,
+    0xad => 0x4fd7, 0xae => 0x5c5e, 0xaf => 0x8cca, 0xb0 => 0x65cf,
+    0xb1 => 0x7d9a, 0xb2 => 0x5352, 0xb3 => 0x8896, 0xb4 => 0x5176,
+    0xb5 => 0x63c3, 0xb6 => 0x5b58, 0xb7 => 0x5b6b, 0xb8 => 0x5c0a,
+    0xb9 => 0x640d, 0xba => 0x6751, 0xbb => 0x905c, 0xbc => 0x4ed6,
+    0xbd => 0x591a, 0xbe => 0x592a, 0xbf => 0x6c70, 0xc0 => 0x8a51,
+    0xc1 => 0x553e, 0xc2 => 0x5815, 0xc3 => 0x59a5, 0xc4 => 0x60f0,
+    0xc5 => 0x6253, 0xc6 => 0x67c1, 0xc7 => 0x8235, 0xc8 => 0x6955,
+    0xc9 => 0x9640, 0xca => 0x99c4, 0xcb => 0x9a28, 0xcc => 0x4f53,
+    0xcd => 0x5806, 0xce => 0x5bfe, 0xcf => 0x8010, 0xd0 => 0x5cb1,
+    0xd1 => 0x5e2f, 0xd2 => 0x5f85, 0xd3 => 0x6020, 0xd4 => 0x614b,
+    0xd5 => 0x6234, 0xd6 => 0x66ff, 0xd7 => 0x6cf0, 0xd8 => 0x6ede,
+    0xd9 => 0x80ce, 0xda => 0x817f, 0xdb => 0x82d4, 0xdc => 0x888b,
+    0xdd => 0x8cb8, 0xde => 0x9000, 0xdf => 0x902e, 0xe0 => 0x968a,
+    0xe1 => 0x9edb, 0xe2 => 0x9bdb, 0xe3 => 0x4ee3, 0xe4 => 0x53f0,
+    0xe5 => 0x5927, 0xe6 => 0x7b2c, 0xe7 => 0x918d, 0xe8 => 0x984c,
+    0xe9 => 0x9df9, 0xea => 0x6edd, 0xeb => 0x7027, 0xec => 0x5353,
+    0xed => 0x5544, 0xee => 0x5b85, 0xef => 0x6258, 0xf0 => 0x629e,
+    0xf1 => 0x62d3, 0xf2 => 0x6ca2, 0xf3 => 0x6fef, 0xf4 => 0x7422,
+    0xf5 => 0x8a17, 0xf6 => 0x9438, 0xf7 => 0x6fc1, 0xf8 => 0x8afe,
+    0xf9 => 0x8338, 0xfa => 0x51e7, 0xfb => 0x86f8, 0xfc => 0x53ea,
+  },
+  0x92 => {
+    0x40 => 0x53e9, 0x41 => 0x4f46, 0x42 => 0x9054, 0x43 => 0x8fb0,
+    0x44 => 0x596a, 0x45 => 0x8131, 0x46 => 0x5dfd, 0x47 => 0x7aea,
+    0x48 => 0x8fbf, 0x49 => 0x68da, 0x4a => 0x8c37, 0x4b => 0x72f8,
+    0x4c => 0x9c48, 0x4d => 0x6a3d, 0x4e => 0x8ab0, 0x4f => 0x4e39,
+    0x50 => 0x5358, 0x51 => 0x5606, 0x52 => 0x5766, 0x53 => 0x62c5,
+    0x54 => 0x63a2, 0x55 => 0x65e6, 0x56 => 0x6b4e, 0x57 => 0x6de1,
+    0x58 => 0x6e5b, 0x59 => 0x70ad, 0x5a => 0x77ed, 0x5b => 0x7aef,
+    0x5c => 0x7baa, 0x5d => 0x7dbb, 0x5e => 0x803d, 0x5f => 0x80c6,
+    0x60 => 0x86cb, 0x61 => 0x8a95, 0x62 => 0x935b, 0x63 => 0x56e3,
+    0x64 => 0x58c7, 0x65 => 0x5f3e, 0x66 => 0x65ad, 0x67 => 0x6696,
+    0x68 => 0x6a80, 0x69 => 0x6bb5, 0x6a => 0x7537, 0x6b => 0x8ac7,
+    0x6c => 0x5024, 0x6d => 0x77e5, 0x6e => 0x5730, 0x6f => 0x5f1b,
+    0x70 => 0x6065, 0x71 => 0x667a, 0x72 => 0x6c60, 0x73 => 0x75f4,
+    0x74 => 0x7a1a, 0x75 => 0x7f6e, 0x76 => 0x81f4, 0x77 => 0x8718,
+    0x78 => 0x9045, 0x79 => 0x99b3, 0x7a => 0x7bc9, 0x7b => 0x755c,
+    0x7c => 0x7af9, 0x7d => 0x7b51, 0x7e => 0x84c4, 0x80 => 0x9010,
+    0x81 => 0x79e9, 0x82 => 0x7a92, 0x83 => 0x8336, 0x84 => 0x5ae1,
+    0x85 => 0x7740, 0x86 => 0x4e2d, 0x87 => 0x4ef2, 0x88 => 0x5b99,
+    0x89 => 0x5fe0, 0x8a => 0x62bd, 0x8b => 0x663c, 0x8c => 0x67f1,
+    0x8d => 0x6ce8, 0x8e => 0x866b, 0x8f => 0x8877, 0x90 => 0x8a3b,
+    0x91 => 0x914e, 0x92 => 0x92f3, 0x93 => 0x99d0, 0x94 => 0x6a17,
+    0x95 => 0x7026, 0x96 => 0x732a, 0x97 => 0x82e7, 0x98 => 0x8457,
+    0x99 => 0x8caf, 0x9a => 0x4e01, 0x9b => 0x5146, 0x9c => 0x51cb,
+    0x9d => 0x558b, 0x9e => 0x5bf5, 0x9f => 0x5e16, 0xa0 => 0x5e33,
+    0xa1 => 0x5e81, 0xa2 => 0x5f14, 0xa3 => 0x5f35, 0xa4 => 0x5f6b,
+    0xa5 => 0x5fb4, 0xa6 => 0x61f2, 0xa7 => 0x6311, 0xa8 => 0x66a2,
+    0xa9 => 0x671d, 0xaa => 0x6f6e, 0xab => 0x7252, 0xac => 0x753a,
+    0xad => 0x773a, 0xae => 0x8074, 0xaf => 0x8139, 0xb0 => 0x8178,
+    0xb1 => 0x8776, 0xb2 => 0x8abf, 0xb3 => 0x8adc, 0xb4 => 0x8d85,
+    0xb5 => 0x8df3, 0xb6 => 0x929a, 0xb7 => 0x9577, 0xb8 => 0x9802,
+    0xb9 => 0x9ce5, 0xba => 0x52c5, 0xbb => 0x6357, 0xbc => 0x76f4,
+    0xbd => 0x6715, 0xbe => 0x6c88, 0xbf => 0x73cd, 0xc0 => 0x8cc3,
+    0xc1 => 0x93ae, 0xc2 => 0x9673, 0xc3 => 0x6d25, 0xc4 => 0x589c,
+    0xc5 => 0x690e, 0xc6 => 0x69cc, 0xc7 => 0x8ffd, 0xc8 => 0x939a,
+    0xc9 => 0x75db, 0xca => 0x901a, 0xcb => 0x585a, 0xcc => 0x6802,
+    0xcd => 0x63b4, 0xce => 0x69fb, 0xcf => 0x4f43, 0xd0 => 0x6f2c,
+    0xd1 => 0x67d8, 0xd2 => 0x8fbb, 0xd3 => 0x8526, 0xd4 => 0x7db4,
+    0xd5 => 0x9354, 0xd6 => 0x693f, 0xd7 => 0x6f70, 0xd8 => 0x576a,
+    0xd9 => 0x58f7, 0xda => 0x5b2c, 0xdb => 0x7d2c, 0xdc => 0x722a,
+    0xdd => 0x540a, 0xde => 0x91e3, 0xdf => 0x9db4, 0xe0 => 0x4ead,
+    0xe1 => 0x4f4e, 0xe2 => 0x505c, 0xe3 => 0x5075, 0xe4 => 0x5243,
+    0xe5 => 0x8c9e, 0xe6 => 0x5448, 0xe7 => 0x5824, 0xe8 => 0x5b9a,
+    0xe9 => 0x5e1d, 0xea => 0x5e95, 0xeb => 0x5ead, 0xec => 0x5ef7,
+    0xed => 0x5f1f, 0xee => 0x608c, 0xef => 0x62b5, 0xf0 => 0x633a,
+    0xf1 => 0x63d0, 0xf2 => 0x68af, 0xf3 => 0x6c40, 0xf4 => 0x7887,
+    0xf5 => 0x798e, 0xf6 => 0x7a0b, 0xf7 => 0x7de0, 0xf8 => 0x8247,
+    0xf9 => 0x8a02, 0xfa => 0x8ae6, 0xfb => 0x8e44, 0xfc => 0x9013,
+  },
+  0x93 => {
+    0x40 => 0x90b8, 0x41 => 0x912d, 0x42 => 0x91d8, 0x43 => 0x9f0e,
+    0x44 => 0x6ce5, 0x45 => 0x6458, 0x46 => 0x64e2, 0x47 => 0x6575,
+    0x48 => 0x6ef4, 0x49 => 0x7684, 0x4a => 0x7b1b, 0x4b => 0x9069,
+    0x4c => 0x93d1, 0x4d => 0x6eba, 0x4e => 0x54f2, 0x4f => 0x5fb9,
+    0x50 => 0x64a4, 0x51 => 0x8f4d, 0x52 => 0x8fed, 0x53 => 0x9244,
+    0x54 => 0x5178, 0x55 => 0x586b, 0x56 => 0x5929, 0x57 => 0x5c55,
+    0x58 => 0x5e97, 0x59 => 0x6dfb, 0x5a => 0x7e8f, 0x5b => 0x751c,
+    0x5c => 0x8cbc, 0x5d => 0x8ee2, 0x5e => 0x985b, 0x5f => 0x70b9,
+    0x60 => 0x4f1d, 0x61 => 0x6bbf, 0x62 => 0x6fb1, 0x63 => 0x7530,
+    0x64 => 0x96fb, 0x65 => 0x514e, 0x66 => 0x5410, 0x67 => 0x5835,
+    0x68 => 0x5857, 0x69 => 0x59ac, 0x6a => 0x5c60, 0x6b => 0x5f92,
+    0x6c => 0x6597, 0x6d => 0x675c, 0x6e => 0x6e21, 0x6f => 0x767b,
+    0x70 => 0x83df, 0x71 => 0x8ced, 0x72 => 0x9014, 0x73 => 0x90fd,
+    0x74 => 0x934d, 0x75 => 0x7825, 0x76 => 0x783a, 0x77 => 0x52aa,
+    0x78 => 0x5ea6, 0x79 => 0x571f, 0x7a => 0x5974, 0x7b => 0x6012,
+    0x7c => 0x5012, 0x7d => 0x515a, 0x7e => 0x51ac, 0x80 => 0x51cd,
+    0x81 => 0x5200, 0x82 => 0x5510, 0x83 => 0x5854, 0x84 => 0x5858,
+    0x85 => 0x5957, 0x86 => 0x5b95, 0x87 => 0x5cf6, 0x88 => 0x5d8b,
+    0x89 => 0x60bc, 0x8a => 0x6295, 0x8b => 0x642d, 0x8c => 0x6771,
+    0x8d => 0x6843, 0x8e => 0x68bc, 0x8f => 0x68df, 0x90 => 0x76d7,
+    0x91 => 0x6dd8, 0x92 => 0x6e6f, 0x93 => 0x6d9b, 0x94 => 0x706f,
+    0x95 => 0x71c8, 0x96 => 0x5f53, 0x97 => 0x75d8, 0x98 => 0x7977,
+    0x99 => 0x7b49, 0x9a => 0x7b54, 0x9b => 0x7b52, 0x9c => 0x7cd6,
+    0x9d => 0x7d71, 0x9e => 0x5230, 0x9f => 0x8463, 0xa0 => 0x8569,
+    0xa1 => 0x85e4, 0xa2 => 0x8a0e, 0xa3 => 0x8b04, 0xa4 => 0x8c46,
+    0xa5 => 0x8e0f, 0xa6 => 0x9003, 0xa7 => 0x900f, 0xa8 => 0x9419,
+    0xa9 => 0x9676, 0xaa => 0x982d, 0xab => 0x9a30, 0xac => 0x95d8,
+    0xad => 0x50cd, 0xae => 0x52d5, 0xaf => 0x540c, 0xb0 => 0x5802,
+    0xb1 => 0x5c0e, 0xb2 => 0x61a7, 0xb3 => 0x649e, 0xb4 => 0x6d1e,
+    0xb5 => 0x77b3, 0xb6 => 0x7ae5, 0xb7 => 0x80f4, 0xb8 => 0x8404,
+    0xb9 => 0x9053, 0xba => 0x9285, 0xbb => 0x5ce0, 0xbc => 0x9d07,
+    0xbd => 0x533f, 0xbe => 0x5f97, 0xbf => 0x5fb3, 0xc0 => 0x6d9c,
+    0xc1 => 0x7279, 0xc2 => 0x7763, 0xc3 => 0x79bf, 0xc4 => 0x7be4,
+    0xc5 => 0x6bd2, 0xc6 => 0x72ec, 0xc7 => 0x8aad, 0xc8 => 0x6803,
+    0xc9 => 0x6a61, 0xca => 0x51f8, 0xcb => 0x7a81, 0xcc => 0x6934,
+    0xcd => 0x5c4a, 0xce => 0x9cf6, 0xcf => 0x82eb, 0xd0 => 0x5bc5,
+    0xd1 => 0x9149, 0xd2 => 0x701e, 0xd3 => 0x5678, 0xd4 => 0x5c6f,
+    0xd5 => 0x60c7, 0xd6 => 0x6566, 0xd7 => 0x6c8c, 0xd8 => 0x8c5a,
+    0xd9 => 0x9041, 0xda => 0x9813, 0xdb => 0x5451, 0xdc => 0x66c7,
+    0xdd => 0x920d, 0xde => 0x5948, 0xdf => 0x90a3, 0xe0 => 0x5185,
+    0xe1 => 0x4e4d, 0xe2 => 0x51ea, 0xe3 => 0x8599, 0xe4 => 0x8b0e,
+    0xe5 => 0x7058, 0xe6 => 0x637a, 0xe7 => 0x934b, 0xe8 => 0x6962,
+    0xe9 => 0x99b4, 0xea => 0x7e04, 0xeb => 0x7577, 0xec => 0x5357,
+    0xed => 0x6960, 0xee => 0x8edf, 0xef => 0x96e3, 0xf0 => 0x6c5d,
+    0xf1 => 0x4e8c, 0xf2 => 0x5c3c, 0xf3 => 0x5f10, 0xf4 => 0x8fe9,
+    0xf5 => 0x5302, 0xf6 => 0x8cd1, 0xf7 => 0x8089, 0xf8 => 0x8679,
+    0xf9 => 0x5eff, 0xfa => 0x65e5, 0xfb => 0x4e73, 0xfc => 0x5165,
+  },
+  0x94 => {
+    0x40 => 0x5982, 0x41 => 0x5c3f, 0x42 => 0x97ee, 0x43 => 0x4efb,
+    0x44 => 0x598a, 0x45 => 0x5fcd, 0x46 => 0x8a8d, 0x47 => 0x6fe1,
+    0x48 => 0x79b0, 0x49 => 0x7962, 0x4a => 0x5be7, 0x4b => 0x8471,
+    0x4c => 0x732b, 0x4d => 0x71b1, 0x4e => 0x5e74, 0x4f => 0x5ff5,
+    0x50 => 0x637b, 0x51 => 0x649a, 0x52 => 0x71c3, 0x53 => 0x7c98,
+    0x54 => 0x4e43, 0x55 => 0x5efc, 0x56 => 0x4e4b, 0x57 => 0x57dc,
+    0x58 => 0x56a2, 0x59 => 0x60a9, 0x5a => 0x6fc3, 0x5b => 0x7d0d,
+    0x5c => 0x80fd, 0x5d => 0x8133, 0x5e => 0x81bf, 0x5f => 0x8fb2,
+    0x60 => 0x8997, 0x61 => 0x86a4, 0x62 => 0x5df4, 0x63 => 0x628a,
+    0x64 => 0x64ad, 0x65 => 0x8987, 0x66 => 0x6777, 0x67 => 0x6ce2,
+    0x68 => 0x6d3e, 0x69 => 0x7436, 0x6a => 0x7834, 0x6b => 0x5a46,
+    0x6c => 0x7f75, 0x6d => 0x82ad, 0x6e => 0x99ac, 0x6f => 0x4ff3,
+    0x70 => 0x5ec3, 0x71 => 0x62dd, 0x72 => 0x6392, 0x73 => 0x6557,
+    0x74 => 0x676f, 0x75 => 0x76c3, 0x76 => 0x724c, 0x77 => 0x80cc,
+    0x78 => 0x80ba, 0x79 => 0x8f29, 0x7a => 0x914d, 0x7b => 0x500d,
+    0x7c => 0x57f9, 0x7d => 0x5a92, 0x7e => 0x6885, 0x80 => 0x6973,
+    0x81 => 0x7164, 0x82 => 0x72fd, 0x83 => 0x8cb7, 0x84 => 0x58f2,
+    0x85 => 0x8ce0, 0x86 => 0x966a, 0x87 => 0x9019, 0x88 => 0x877f,
+    0x89 => 0x79e4, 0x8a => 0x77e7, 0x8b => 0x8429, 0x8c => 0x4f2f,
+    0x8d => 0x5265, 0x8e => 0x535a, 0x8f => 0x62cd, 0x90 => 0x67cf,
+    0x91 => 0x6cca, 0x92 => 0x767d, 0x93 => 0x7b94, 0x94 => 0x7c95,
+    0x95 => 0x8236, 0x96 => 0x8584, 0x97 => 0x8feb, 0x98 => 0x66dd,
+    0x99 => 0x6f20, 0x9a => 0x7206, 0x9b => 0x7e1b, 0x9c => 0x83ab,
+    0x9d => 0x99c1, 0x9e => 0x9ea6, 0x9f => 0x51fd, 0xa0 => 0x7bb1,
+    0xa1 => 0x7872, 0xa2 => 0x7bb8, 0xa3 => 0x8087, 0xa4 => 0x7b48,
+    0xa5 => 0x6ae8, 0xa6 => 0x5e61, 0xa7 => 0x808c, 0xa8 => 0x7551,
+    0xa9 => 0x7560, 0xaa => 0x516b, 0xab => 0x9262, 0xac => 0x6e8c,
+    0xad => 0x767a, 0xae => 0x9197, 0xaf => 0x9aea, 0xb0 => 0x4f10,
+    0xb1 => 0x7f70, 0xb2 => 0x629c, 0xb3 => 0x7b4f, 0xb4 => 0x95a5,
+    0xb5 => 0x9ce9, 0xb6 => 0x567a, 0xb7 => 0x5859, 0xb8 => 0x86e4,
+    0xb9 => 0x96bc, 0xba => 0x4f34, 0xbb => 0x5224, 0xbc => 0x534a,
+    0xbd => 0x53cd, 0xbe => 0x53db, 0xbf => 0x5e06, 0xc0 => 0x642c,
+    0xc1 => 0x6591, 0xc2 => 0x677f, 0xc3 => 0x6c3e, 0xc4 => 0x6c4e,
+    0xc5 => 0x7248, 0xc6 => 0x72af, 0xc7 => 0x73ed, 0xc8 => 0x7554,
+    0xc9 => 0x7e41, 0xca => 0x822c, 0xcb => 0x85e9, 0xcc => 0x8ca9,
+    0xcd => 0x7bc4, 0xce => 0x91c6, 0xcf => 0x7169, 0xd0 => 0x9812,
+    0xd1 => 0x98ef, 0xd2 => 0x633d, 0xd3 => 0x6669, 0xd4 => 0x756a,
+    0xd5 => 0x76e4, 0xd6 => 0x78d0, 0xd7 => 0x8543, 0xd8 => 0x86ee,
+    0xd9 => 0x532a, 0xda => 0x5351, 0xdb => 0x5426, 0xdc => 0x5983,
+    0xdd => 0x5e87, 0xde => 0x5f7c, 0xdf => 0x60b2, 0xe0 => 0x6249,
+    0xe1 => 0x6279, 0xe2 => 0x62ab, 0xe3 => 0x6590, 0xe4 => 0x6bd4,
+    0xe5 => 0x6ccc, 0xe6 => 0x75b2, 0xe7 => 0x76ae, 0xe8 => 0x7891,
+    0xe9 => 0x79d8, 0xea => 0x7dcb, 0xeb => 0x7f77, 0xec => 0x80a5,
+    0xed => 0x88ab, 0xee => 0x8ab9, 0xef => 0x8cbb, 0xf0 => 0x907f,
+    0xf1 => 0x975e, 0xf2 => 0x98db, 0xf3 => 0x6a0b, 0xf4 => 0x7c38,
+    0xf5 => 0x5099, 0xf6 => 0x5c3e, 0xf7 => 0x5fae, 0xf8 => 0x6787,
+    0xf9 => 0x6bd8, 0xfa => 0x7435, 0xfb => 0x7709, 0xfc => 0x7f8e,
+  },
+  0x95 => {
+    0x40 => 0x9f3b, 0x41 => 0x67ca, 0x42 => 0x7a17, 0x43 => 0x5339,
+    0x44 => 0x758b, 0x45 => 0x9aed, 0x46 => 0x5f66, 0x47 => 0x819d,
+    0x48 => 0x83f1, 0x49 => 0x8098, 0x4a => 0x5f3c, 0x4b => 0x5fc5,
+    0x4c => 0x7562, 0x4d => 0x7b46, 0x4e => 0x903c, 0x4f => 0x6867,
+    0x50 => 0x59eb, 0x51 => 0x5a9b, 0x52 => 0x7d10, 0x53 => 0x767e,
+    0x54 => 0x8b2c, 0x55 => 0x4ff5, 0x56 => 0x5f6a, 0x57 => 0x6a19,
+    0x58 => 0x6c37, 0x59 => 0x6f02, 0x5a => 0x74e2, 0x5b => 0x7968,
+    0x5c => 0x8868, 0x5d => 0x8a55, 0x5e => 0x8c79, 0x5f => 0x5edf,
+    0x60 => 0x63cf, 0x61 => 0x75c5, 0x62 => 0x79d2, 0x63 => 0x82d7,
+    0x64 => 0x9328, 0x65 => 0x92f2, 0x66 => 0x849c, 0x67 => 0x86ed,
+    0x68 => 0x9c2d, 0x69 => 0x54c1, 0x6a => 0x5f6c, 0x6b => 0x658c,
+    0x6c => 0x6d5c, 0x6d => 0x7015, 0x6e => 0x8ca7, 0x6f => 0x8cd3,
+    0x70 => 0x983b, 0x71 => 0x654f, 0x72 => 0x74f6, 0x73 => 0x4e0d,
+    0x74 => 0x4ed8, 0x75 => 0x57e0, 0x76 => 0x592b, 0x77 => 0x5a66,
+    0x78 => 0x5bcc, 0x79 => 0x51a8, 0x7a => 0x5e03, 0x7b => 0x5e9c,
+    0x7c => 0x6016, 0x7d => 0x6276, 0x7e => 0x6577, 0x80 => 0x65a7,
+    0x81 => 0x666e, 0x82 => 0x6d6e, 0x83 => 0x7236, 0x84 => 0x7b26,
+    0x85 => 0x8150, 0x86 => 0x819a, 0x87 => 0x8299, 0x88 => 0x8b5c,
+    0x89 => 0x8ca0, 0x8a => 0x8ce6, 0x8b => 0x8d74, 0x8c => 0x961c,
+    0x8d => 0x9644, 0x8e => 0x4fae, 0x8f => 0x64ab, 0x90 => 0x6b66,
+    0x91 => 0x821e, 0x92 => 0x8461, 0x93 => 0x856a, 0x94 => 0x90e8,
+    0x95 => 0x5c01, 0x96 => 0x6953, 0x97 => 0x98a8, 0x98 => 0x847a,
+    0x99 => 0x8557, 0x9a => 0x4f0f, 0x9b => 0x526f, 0x9c => 0x5fa9,
+    0x9d => 0x5e45, 0x9e => 0x670d, 0x9f => 0x798f, 0xa0 => 0x8179,
+    0xa1 => 0x8907, 0xa2 => 0x8986, 0xa3 => 0x6df5, 0xa4 => 0x5f17,
+    0xa5 => 0x6255, 0xa6 => 0x6cb8, 0xa7 => 0x4ecf, 0xa8 => 0x7269,
+    0xa9 => 0x9b92, 0xaa => 0x5206, 0xab => 0x543b, 0xac => 0x5674,
+    0xad => 0x58b3, 0xae => 0x61a4, 0xaf => 0x626e, 0xb0 => 0x711a,
+    0xb1 => 0x596e, 0xb2 => 0x7c89, 0xb3 => 0x7cde, 0xb4 => 0x7d1b,
+    0xb5 => 0x96f0, 0xb6 => 0x6587, 0xb7 => 0x805e, 0xb8 => 0x4e19,
+    0xb9 => 0x4f75, 0xba => 0x5175, 0xbb => 0x5840, 0xbc => 0x5e63,
+    0xbd => 0x5e73, 0xbe => 0x5f0a, 0xbf => 0x67c4, 0xc0 => 0x4e26,
+    0xc1 => 0x853d, 0xc2 => 0x9589, 0xc3 => 0x965b, 0xc4 => 0x7c73,
+    0xc5 => 0x9801, 0xc6 => 0x50fb, 0xc7 => 0x58c1, 0xc8 => 0x7656,
+    0xc9 => 0x78a7, 0xca => 0x5225, 0xcb => 0x77a5, 0xcc => 0x8511,
+    0xcd => 0x7b86, 0xce => 0x504f, 0xcf => 0x5909, 0xd0 => 0x7247,
+    0xd1 => 0x7bc7, 0xd2 => 0x7de8, 0xd3 => 0x8fba, 0xd4 => 0x8fd4,
+    0xd5 => 0x904d, 0xd6 => 0x4fbf, 0xd7 => 0x52c9, 0xd8 => 0x5a29,
+    0xd9 => 0x5f01, 0xda => 0x97ad, 0xdb => 0x4fdd, 0xdc => 0x8217,
+    0xdd => 0x92ea, 0xde => 0x5703, 0xdf => 0x6355, 0xe0 => 0x6b69,
+    0xe1 => 0x752b, 0xe2 => 0x88dc, 0xe3 => 0x8f14, 0xe4 => 0x7a42,
+    0xe5 => 0x52df, 0xe6 => 0x5893, 0xe7 => 0x6155, 0xe8 => 0x620a,
+    0xe9 => 0x66ae, 0xea => 0x6bcd, 0xeb => 0x7c3f, 0xec => 0x83e9,
+    0xed => 0x5023, 0xee => 0x4ff8, 0xef => 0x5305, 0xf0 => 0x5446,
+    0xf1 => 0x5831, 0xf2 => 0x5949, 0xf3 => 0x5b9d, 0xf4 => 0x5cf0,
+    0xf5 => 0x5cef, 0xf6 => 0x5d29, 0xf7 => 0x5e96, 0xf8 => 0x62b1,
+    0xf9 => 0x6367, 0xfa => 0x653e, 0xfb => 0x65b9, 0xfc => 0x670b,
+  },
+  0x96 => {
+    0x40 => 0x6cd5, 0x41 => 0x6ce1, 0x42 => 0x70f9, 0x43 => 0x7832,
+    0x44 => 0x7e2b, 0x45 => 0x80de, 0x46 => 0x82b3, 0x47 => 0x840c,
+    0x48 => 0x84ec, 0x49 => 0x8702, 0x4a => 0x8912, 0x4b => 0x8a2a,
+    0x4c => 0x8c4a, 0x4d => 0x90a6, 0x4e => 0x92d2, 0x4f => 0x98fd,
+    0x50 => 0x9cf3, 0x51 => 0x9d6c, 0x52 => 0x4e4f, 0x53 => 0x4ea1,
+    0x54 => 0x508d, 0x55 => 0x5256, 0x56 => 0x574a, 0x57 => 0x59a8,
+    0x58 => 0x5e3d, 0x59 => 0x5fd8, 0x5a => 0x5fd9, 0x5b => 0x623f,
+    0x5c => 0x66b4, 0x5d => 0x671b, 0x5e => 0x67d0, 0x5f => 0x68d2,
+    0x60 => 0x5192, 0x61 => 0x7d21, 0x62 => 0x80aa, 0x63 => 0x81a8,
+    0x64 => 0x8b00, 0x65 => 0x8c8c, 0x66 => 0x8cbf, 0x67 => 0x927e,
+    0x68 => 0x9632, 0x69 => 0x5420, 0x6a => 0x982c, 0x6b => 0x5317,
+    0x6c => 0x50d5, 0x6d => 0x535c, 0x6e => 0x58a8, 0x6f => 0x64b2,
+    0x70 => 0x6734, 0x71 => 0x7267, 0x72 => 0x7766, 0x73 => 0x7a46,
+    0x74 => 0x91e6, 0x75 => 0x52c3, 0x76 => 0x6ca1, 0x77 => 0x6b86,
+    0x78 => 0x5800, 0x79 => 0x5e4c, 0x7a => 0x5954, 0x7b => 0x672c,
+    0x7c => 0x7ffb, 0x7d => 0x51e1, 0x7e => 0x76c6, 0x80 => 0x6469,
+    0x81 => 0x78e8, 0x82 => 0x9b54, 0x83 => 0x9ebb, 0x84 => 0x57cb,
+    0x85 => 0x59b9, 0x86 => 0x6627, 0x87 => 0x679a, 0x88 => 0x6bce,
+    0x89 => 0x54e9, 0x8a => 0x69d9, 0x8b => 0x5e55, 0x8c => 0x819c,
+    0x8d => 0x6795, 0x8e => 0x9baa, 0x8f => 0x67fe, 0x90 => 0x9c52,
+    0x91 => 0x685d, 0x92 => 0x4ea6, 0x93 => 0x4fe3, 0x94 => 0x53c8,
+    0x95 => 0x62b9, 0x96 => 0x672b, 0x97 => 0x6cab, 0x98 => 0x8fc4,
+    0x99 => 0x4fad, 0x9a => 0x7e6d, 0x9b => 0x9ebf, 0x9c => 0x4e07,
+    0x9d => 0x6162, 0x9e => 0x6e80, 0x9f => 0x6f2b, 0xa0 => 0x8513,
+    0xa1 => 0x5473, 0xa2 => 0x672a, 0xa3 => 0x9b45, 0xa4 => 0x5df3,
+    0xa5 => 0x7b95, 0xa6 => 0x5cac, 0xa7 => 0x5bc6, 0xa8 => 0x871c,
+    0xa9 => 0x6e4a, 0xaa => 0x84d1, 0xab => 0x7a14, 0xac => 0x8108,
+    0xad => 0x5999, 0xae => 0x7c8d, 0xaf => 0x6c11, 0xb0 => 0x7720,
+    0xb1 => 0x52d9, 0xb2 => 0x5922, 0xb3 => 0x7121, 0xb4 => 0x725f,
+    0xb5 => 0x77db, 0xb6 => 0x9727, 0xb7 => 0x9d61, 0xb8 => 0x690b,
+    0xb9 => 0x5a7f, 0xba => 0x5a18, 0xbb => 0x51a5, 0xbc => 0x540d,
+    0xbd => 0x547d, 0xbe => 0x660e, 0xbf => 0x76df, 0xc0 => 0x8ff7,
+    0xc1 => 0x9298, 0xc2 => 0x9cf4, 0xc3 => 0x59ea, 0xc4 => 0x725d,
+    0xc5 => 0x6ec5, 0xc6 => 0x514d, 0xc7 => 0x68c9, 0xc8 => 0x7dbf,
+    0xc9 => 0x7dec, 0xca => 0x9762, 0xcb => 0x9eba, 0xcc => 0x6478,
+    0xcd => 0x6a21, 0xce => 0x8302, 0xcf => 0x5984, 0xd0 => 0x5b5f,
+    0xd1 => 0x6bdb, 0xd2 => 0x731b, 0xd3 => 0x76f2, 0xd4 => 0x7db2,
+    0xd5 => 0x8017, 0xd6 => 0x8499, 0xd7 => 0x5132, 0xd8 => 0x6728,
+    0xd9 => 0x9ed9, 0xda => 0x76ee, 0xdb => 0x6762, 0xdc => 0x52ff,
+    0xdd => 0x9905, 0xde => 0x5c24, 0xdf => 0x623b, 0xe0 => 0x7c7e,
+    0xe1 => 0x8cb0, 0xe2 => 0x554f, 0xe3 => 0x60b6, 0xe4 => 0x7d0b,
+    0xe5 => 0x9580, 0xe6 => 0x5301, 0xe7 => 0x4e5f, 0xe8 => 0x51b6,
+    0xe9 => 0x591c, 0xea => 0x723a, 0xeb => 0x8036, 0xec => 0x91ce,
+    0xed => 0x5f25, 0xee => 0x77e2, 0xef => 0x5384, 0xf0 => 0x5f79,
+    0xf1 => 0x7d04, 0xf2 => 0x85ac, 0xf3 => 0x8a33, 0xf4 => 0x8e8d,
+    0xf5 => 0x9756, 0xf6 => 0x67f3, 0xf7 => 0x85ae, 0xf8 => 0x9453,
+    0xf9 => 0x6109, 0xfa => 0x6108, 0xfb => 0x6cb9, 0xfc => 0x7652,
+  },
+  0x97 => {
+    0x40 => 0x8aed, 0x41 => 0x8f38, 0x42 => 0x552f, 0x43 => 0x4f51,
+    0x44 => 0x512a, 0x45 => 0x52c7, 0x46 => 0x53cb, 0x47 => 0x5ba5,
+    0x48 => 0x5e7d, 0x49 => 0x60a0, 0x4a => 0x6182, 0x4b => 0x63d6,
+    0x4c => 0x6709, 0x4d => 0x67da, 0x4e => 0x6e67, 0x4f => 0x6d8c,
+    0x50 => 0x7336, 0x51 => 0x7337, 0x52 => 0x7531, 0x53 => 0x7950,
+    0x54 => 0x88d5, 0x55 => 0x8a98, 0x56 => 0x904a, 0x57 => 0x9091,
+    0x58 => 0x90f5, 0x59 => 0x96c4, 0x5a => 0x878d, 0x5b => 0x5915,
+    0x5c => 0x4e88, 0x5d => 0x4f59, 0x5e => 0x4e0e, 0x5f => 0x8a89,
+    0x60 => 0x8f3f, 0x61 => 0x9810, 0x62 => 0x50ad, 0x63 => 0x5e7c,
+    0x64 => 0x5996, 0x65 => 0x5bb9, 0x66 => 0x5eb8, 0x67 => 0x63da,
+    0x68 => 0x63fa, 0x69 => 0x64c1, 0x6a => 0x66dc, 0x6b => 0x694a,
+    0x6c => 0x69d8, 0x6d => 0x6d0b, 0x6e => 0x6eb6, 0x6f => 0x7194,
+    0x70 => 0x7528, 0x71 => 0x7aaf, 0x72 => 0x7f8a, 0x73 => 0x8000,
+    0x74 => 0x8449, 0x75 => 0x84c9, 0x76 => 0x8981, 0x77 => 0x8b21,
+    0x78 => 0x8e0a, 0x79 => 0x9065, 0x7a => 0x967d, 0x7b => 0x990a,
+    0x7c => 0x617e, 0x7d => 0x6291, 0x7e => 0x6b32, 0x80 => 0x6c83,
+    0x81 => 0x6d74, 0x82 => 0x7fcc, 0x83 => 0x7ffc, 0x84 => 0x6dc0,
+    0x85 => 0x7f85, 0x86 => 0x87ba, 0x87 => 0x88f8, 0x88 => 0x6765,
+    0x89 => 0x83b1, 0x8a => 0x983c, 0x8b => 0x96f7, 0x8c => 0x6d1b,
+    0x8d => 0x7d61, 0x8e => 0x843d, 0x8f => 0x916a, 0x90 => 0x4e71,
+    0x91 => 0x5375, 0x92 => 0x5d50, 0x93 => 0x6b04, 0x94 => 0x6feb,
+    0x95 => 0x85cd, 0x96 => 0x862d, 0x97 => 0x89a7, 0x98 => 0x5229,
+    0x99 => 0x540f, 0x9a => 0x5c65, 0x9b => 0x674e, 0x9c => 0x68a8,
+    0x9d => 0x7406, 0x9e => 0x7483, 0x9f => 0x75e2, 0xa0 => 0x88cf,
+    0xa1 => 0x88e1, 0xa2 => 0x91cc, 0xa3 => 0x96e2, 0xa4 => 0x9678,
+    0xa5 => 0x5f8b, 0xa6 => 0x7387, 0xa7 => 0x7acb, 0xa8 => 0x844e,
+    0xa9 => 0x63a0, 0xaa => 0x7565, 0xab => 0x5289, 0xac => 0x6d41,
+    0xad => 0x6e9c, 0xae => 0x7409, 0xaf => 0x7559, 0xb0 => 0x786b,
+    0xb1 => 0x7c92, 0xb2 => 0x9686, 0xb3 => 0x7adc, 0xb4 => 0x9f8d,
+    0xb5 => 0x4fb6, 0xb6 => 0x616e, 0xb7 => 0x65c5, 0xb8 => 0x865c,
+    0xb9 => 0x4e86, 0xba => 0x4eae, 0xbb => 0x50da, 0xbc => 0x4e21,
+    0xbd => 0x51cc, 0xbe => 0x5bee, 0xbf => 0x6599, 0xc0 => 0x6881,
+    0xc1 => 0x6dbc, 0xc2 => 0x731f, 0xc3 => 0x7642, 0xc4 => 0x77ad,
+    0xc5 => 0x7a1c, 0xc6 => 0x7ce7, 0xc7 => 0x826f, 0xc8 => 0x8ad2,
+    0xc9 => 0x907c, 0xca => 0x91cf, 0xcb => 0x9675, 0xcc => 0x9818,
+    0xcd => 0x529b, 0xce => 0x7dd1, 0xcf => 0x502b, 0xd0 => 0x5398,
+    0xd1 => 0x6797, 0xd2 => 0x6dcb, 0xd3 => 0x71d0, 0xd4 => 0x7433,
+    0xd5 => 0x81e8, 0xd6 => 0x8f2a, 0xd7 => 0x96a3, 0xd8 => 0x9c57,
+    0xd9 => 0x9e9f, 0xda => 0x7460, 0xdb => 0x5841, 0xdc => 0x6d99,
+    0xdd => 0x7d2f, 0xde => 0x985e, 0xdf => 0x4ee4, 0xe0 => 0x4f36,
+    0xe1 => 0x4f8b, 0xe2 => 0x51b7, 0xe3 => 0x52b1, 0xe4 => 0x5dba,
+    0xe5 => 0x601c, 0xe6 => 0x73b2, 0xe7 => 0x793c, 0xe8 => 0x82d3,
+    0xe9 => 0x9234, 0xea => 0x96b7, 0xeb => 0x96f6, 0xec => 0x970a,
+    0xed => 0x9e97, 0xee => 0x9f62, 0xef => 0x66a6, 0xf0 => 0x6b74,
+    0xf1 => 0x5217, 0xf2 => 0x52a3, 0xf3 => 0x70c8, 0xf4 => 0x88c2,
+    0xf5 => 0x5ec9, 0xf6 => 0x604b, 0xf7 => 0x6190, 0xf8 => 0x6f23,
+    0xf9 => 0x7149, 0xfa => 0x7c3e, 0xfb => 0x7df4, 0xfc => 0x806f,
+  },
+  0x98 => {
+    0x40 => 0x84ee, 0x41 => 0x9023, 0x42 => 0x932c, 0x43 => 0x5442,
+    0x44 => 0x9b6f, 0x45 => 0x6ad3, 0x46 => 0x7089, 0x47 => 0x8cc2,
+    0x48 => 0x8def, 0x49 => 0x9732, 0x4a => 0x52b4, 0x4b => 0x5a41,
+    0x4c => 0x5eca, 0x4d => 0x5f04, 0x4e => 0x6717, 0x4f => 0x697c,
+    0x50 => 0x6994, 0x51 => 0x6d6a, 0x52 => 0x6f0f, 0x53 => 0x7262,
+    0x54 => 0x72fc, 0x55 => 0x7bed, 0x56 => 0x8001, 0x57 => 0x807e,
+    0x58 => 0x874b, 0x59 => 0x90ce, 0x5a => 0x516d, 0x5b => 0x9e93,
+    0x5c => 0x7984, 0x5d => 0x808b, 0x5e => 0x9332, 0x5f => 0x8ad6,
+    0x60 => 0x502d, 0x61 => 0x548c, 0x62 => 0x8a71, 0x63 => 0x6b6a,
+    0x64 => 0x8cc4, 0x65 => 0x8107, 0x66 => 0x60d1, 0x67 => 0x67a0,
+    0x68 => 0x9df2, 0x69 => 0x4e99, 0x6a => 0x4e98, 0x6b => 0x9c10,
+    0x6c => 0x8a6b, 0x6d => 0x85c1, 0x6e => 0x8568, 0x6f => 0x6900,
+    0x70 => 0x6e7e, 0x71 => 0x7897, 0x72 => 0x8155, 0x9f => 0x5f0c,
+    0xa0 => 0x4e10, 0xa1 => 0x4e15, 0xa2 => 0x4e2a, 0xa3 => 0x4e31,
+    0xa4 => 0x4e36, 0xa5 => 0x4e3c, 0xa6 => 0x4e3f, 0xa7 => 0x4e42,
+    0xa8 => 0x4e56, 0xa9 => 0x4e58, 0xaa => 0x4e82, 0xab => 0x4e85,
+    0xac => 0x8c6b, 0xad => 0x4e8a, 0xae => 0x8212, 0xaf => 0x5f0d,
+    0xb0 => 0x4e8e, 0xb1 => 0x4e9e, 0xb2 => 0x4e9f, 0xb3 => 0x4ea0,
+    0xb4 => 0x4ea2, 0xb5 => 0x4eb0, 0xb6 => 0x4eb3, 0xb7 => 0x4eb6,
+    0xb8 => 0x4ece, 0xb9 => 0x4ecd, 0xba => 0x4ec4, 0xbb => 0x4ec6,
+    0xbc => 0x4ec2, 0xbd => 0x4ed7, 0xbe => 0x4ede, 0xbf => 0x4eed,
+    0xc0 => 0x4edf, 0xc1 => 0x4ef7, 0xc2 => 0x4f09, 0xc3 => 0x4f5a,
+    0xc4 => 0x4f30, 0xc5 => 0x4f5b, 0xc6 => 0x4f5d, 0xc7 => 0x4f57,
+    0xc8 => 0x4f47, 0xc9 => 0x4f76, 0xca => 0x4f88, 0xcb => 0x4f8f,
+    0xcc => 0x4f98, 0xcd => 0x4f7b, 0xce => 0x4f69, 0xcf => 0x4f70,
+    0xd0 => 0x4f91, 0xd1 => 0x4f6f, 0xd2 => 0x4f86, 0xd3 => 0x4f96,
+    0xd4 => 0x5118, 0xd5 => 0x4fd4, 0xd6 => 0x4fdf, 0xd7 => 0x4fce,
+    0xd8 => 0x4fd8, 0xd9 => 0x4fdb, 0xda => 0x4fd1, 0xdb => 0x4fda,
+    0xdc => 0x4fd0, 0xdd => 0x4fe4, 0xde => 0x4fe5, 0xdf => 0x501a,
+    0xe0 => 0x5028, 0xe1 => 0x5014, 0xe2 => 0x502a, 0xe3 => 0x5025,
+    0xe4 => 0x5005, 0xe5 => 0x4f1c, 0xe6 => 0x4ff6, 0xe7 => 0x5021,
+    0xe8 => 0x5029, 0xe9 => 0x502c, 0xea => 0x4ffe, 0xeb => 0x4fef,
+    0xec => 0x5011, 0xed => 0x5006, 0xee => 0x5043, 0xef => 0x5047,
+    0xf0 => 0x6703, 0xf1 => 0x5055, 0xf2 => 0x5050, 0xf3 => 0x5048,
+    0xf4 => 0x505a, 0xf5 => 0x5056, 0xf6 => 0x506c, 0xf7 => 0x5078,
+    0xf8 => 0x5080, 0xf9 => 0x509a, 0xfa => 0x5085, 0xfb => 0x50b4,
+    0xfc => 0x50b2,
+  },
+  0x99 => {
+    0x40 => 0x50c9, 0x41 => 0x50ca, 0x42 => 0x50b3, 0x43 => 0x50c2,
+    0x44 => 0x50d6, 0x45 => 0x50de, 0x46 => 0x50e5, 0x47 => 0x50ed,
+    0x48 => 0x50e3, 0x49 => 0x50ee, 0x4a => 0x50f9, 0x4b => 0x50f5,
+    0x4c => 0x5109, 0x4d => 0x5101, 0x4e => 0x5102, 0x4f => 0x5116,
+    0x50 => 0x5115, 0x51 => 0x5114, 0x52 => 0x511a, 0x53 => 0x5121,
+    0x54 => 0x513a, 0x55 => 0x5137, 0x56 => 0x513c, 0x57 => 0x513b,
+    0x58 => 0x513f, 0x59 => 0x5140, 0x5a => 0x5152, 0x5b => 0x514c,
+    0x5c => 0x5154, 0x5d => 0x5162, 0x5e => 0x7af8, 0x5f => 0x5169,
+    0x60 => 0x516a, 0x61 => 0x516e, 0x62 => 0x5180, 0x63 => 0x5182,
+    0x64 => 0x56d8, 0x65 => 0x518c, 0x66 => 0x5189, 0x67 => 0x518f,
+    0x68 => 0x5191, 0x69 => 0x5193, 0x6a => 0x5195, 0x6b => 0x5196,
+    0x6c => 0x51a4, 0x6d => 0x51a6, 0x6e => 0x51a2, 0x6f => 0x51a9,
+    0x70 => 0x51aa, 0x71 => 0x51ab, 0x72 => 0x51b3, 0x73 => 0x51b1,
+    0x74 => 0x51b2, 0x75 => 0x51b0, 0x76 => 0x51b5, 0x77 => 0x51bd,
+    0x78 => 0x51c5, 0x79 => 0x51c9, 0x7a => 0x51db, 0x7b => 0x51e0,
+    0x7c => 0x8655, 0x7d => 0x51e9, 0x7e => 0x51ed, 0x80 => 0x51f0,
+    0x81 => 0x51f5, 0x82 => 0x51fe, 0x83 => 0x5204, 0x84 => 0x520b,
+    0x85 => 0x5214, 0x86 => 0x520e, 0x87 => 0x5227, 0x88 => 0x522a,
+    0x89 => 0x522e, 0x8a => 0x5233, 0x8b => 0x5239, 0x8c => 0x524f,
+    0x8d => 0x5244, 0x8e => 0x524b, 0x8f => 0x524c, 0x90 => 0x525e,
+    0x91 => 0x5254, 0x92 => 0x526a, 0x93 => 0x5274, 0x94 => 0x5269,
+    0x95 => 0x5273, 0x96 => 0x527f, 0x97 => 0x527d, 0x98 => 0x528d,
+    0x99 => 0x5294, 0x9a => 0x5292, 0x9b => 0x5271, 0x9c => 0x5288,
+    0x9d => 0x5291, 0x9e => 0x8fa8, 0x9f => 0x8fa7, 0xa0 => 0x52ac,
+    0xa1 => 0x52ad, 0xa2 => 0x52bc, 0xa3 => 0x52b5, 0xa4 => 0x52c1,
+    0xa5 => 0x52cd, 0xa6 => 0x52d7, 0xa7 => 0x52de, 0xa8 => 0x52e3,
+    0xa9 => 0x52e6, 0xaa => 0x98ed, 0xab => 0x52e0, 0xac => 0x52f3,
+    0xad => 0x52f5, 0xae => 0x52f8, 0xaf => 0x52f9, 0xb0 => 0x5306,
+    0xb1 => 0x5308, 0xb2 => 0x7538, 0xb3 => 0x530d, 0xb4 => 0x5310,
+    0xb5 => 0x530f, 0xb6 => 0x5315, 0xb7 => 0x531a, 0xb8 => 0x5323,
+    0xb9 => 0x532f, 0xba => 0x5331, 0xbb => 0x5333, 0xbc => 0x5338,
+    0xbd => 0x5340, 0xbe => 0x5346, 0xbf => 0x5345, 0xc0 => 0x4e17,
+    0xc1 => 0x5349, 0xc2 => 0x534d, 0xc3 => 0x51d6, 0xc4 => 0x535e,
+    0xc5 => 0x5369, 0xc6 => 0x536e, 0xc7 => 0x5918, 0xc8 => 0x537b,
+    0xc9 => 0x5377, 0xca => 0x5382, 0xcb => 0x5396, 0xcc => 0x53a0,
+    0xcd => 0x53a6, 0xce => 0x53a5, 0xcf => 0x53ae, 0xd0 => 0x53b0,
+    0xd1 => 0x53b6, 0xd2 => 0x53c3, 0xd3 => 0x7c12, 0xd4 => 0x96d9,
+    0xd5 => 0x53df, 0xd6 => 0x66fc, 0xd7 => 0x71ee, 0xd8 => 0x53ee,
+    0xd9 => 0x53e8, 0xda => 0x53ed, 0xdb => 0x53fa, 0xdc => 0x5401,
+    0xdd => 0x543d, 0xde => 0x5440, 0xdf => 0x542c, 0xe0 => 0x542d,
+    0xe1 => 0x543c, 0xe2 => 0x542e, 0xe3 => 0x5436, 0xe4 => 0x5429,
+    0xe5 => 0x541d, 0xe6 => 0x544e, 0xe7 => 0x548f, 0xe8 => 0x5475,
+    0xe9 => 0x548e, 0xea => 0x545f, 0xeb => 0x5471, 0xec => 0x5477,
+    0xed => 0x5470, 0xee => 0x5492, 0xef => 0x547b, 0xf0 => 0x5480,
+    0xf1 => 0x5476, 0xf2 => 0x5484, 0xf3 => 0x5490, 0xf4 => 0x5486,
+    0xf5 => 0x54c7, 0xf6 => 0x54a2, 0xf7 => 0x54b8, 0xf8 => 0x54a5,
+    0xf9 => 0x54ac, 0xfa => 0x54c4, 0xfb => 0x54c8, 0xfc => 0x54a8,
+  },
+  0x9a => {
+    0x40 => 0x54ab, 0x41 => 0x54c2, 0x42 => 0x54a4, 0x43 => 0x54be,
+    0x44 => 0x54bc, 0x45 => 0x54d8, 0x46 => 0x54e5, 0x47 => 0x54e6,
+    0x48 => 0x550f, 0x49 => 0x5514, 0x4a => 0x54fd, 0x4b => 0x54ee,
+    0x4c => 0x54ed, 0x4d => 0x54fa, 0x4e => 0x54e2, 0x4f => 0x5539,
+    0x50 => 0x5540, 0x51 => 0x5563, 0x52 => 0x554c, 0x53 => 0x552e,
+    0x54 => 0x555c, 0x55 => 0x5545, 0x56 => 0x5556, 0x57 => 0x5557,
+    0x58 => 0x5538, 0x59 => 0x5533, 0x5a => 0x555d, 0x5b => 0x5599,
+    0x5c => 0x5580, 0x5d => 0x54af, 0x5e => 0x558a, 0x5f => 0x559f,
+    0x60 => 0x557b, 0x61 => 0x557e, 0x62 => 0x5598, 0x63 => 0x559e,
+    0x64 => 0x55ae, 0x65 => 0x557c, 0x66 => 0x5583, 0x67 => 0x55a9,
+    0x68 => 0x5587, 0x69 => 0x55a8, 0x6a => 0x55da, 0x6b => 0x55c5,
+    0x6c => 0x55df, 0x6d => 0x55c4, 0x6e => 0x55dc, 0x6f => 0x55e4,
+    0x70 => 0x55d4, 0x71 => 0x5614, 0x72 => 0x55f7, 0x73 => 0x5616,
+    0x74 => 0x55fe, 0x75 => 0x55fd, 0x76 => 0x561b, 0x77 => 0x55f9,
+    0x78 => 0x564e, 0x79 => 0x5650, 0x7a => 0x71df, 0x7b => 0x5634,
+    0x7c => 0x5636, 0x7d => 0x5632, 0x7e => 0x5638, 0x80 => 0x566b,
+    0x81 => 0x5664, 0x82 => 0x562f, 0x83 => 0x566c, 0x84 => 0x566a,
+    0x85 => 0x5686, 0x86 => 0x5680, 0x87 => 0x568a, 0x88 => 0x56a0,
+    0x89 => 0x5694, 0x8a => 0x568f, 0x8b => 0x56a5, 0x8c => 0x56ae,
+    0x8d => 0x56b6, 0x8e => 0x56b4, 0x8f => 0x56c2, 0x90 => 0x56bc,
+    0x91 => 0x56c1, 0x92 => 0x56c3, 0x93 => 0x56c0, 0x94 => 0x56c8,
+    0x95 => 0x56ce, 0x96 => 0x56d1, 0x97 => 0x56d3, 0x98 => 0x56d7,
+    0x99 => 0x56ee, 0x9a => 0x56f9, 0x9b => 0x5700, 0x9c => 0x56ff,
+    0x9d => 0x5704, 0x9e => 0x5709, 0x9f => 0x5708, 0xa0 => 0x570b,
+    0xa1 => 0x570d, 0xa2 => 0x5713, 0xa3 => 0x5718, 0xa4 => 0x5716,
+    0xa5 => 0x55c7, 0xa6 => 0x571c, 0xa7 => 0x5726, 0xa8 => 0x5737,
+    0xa9 => 0x5738, 0xaa => 0x574e, 0xab => 0x573b, 0xac => 0x5740,
+    0xad => 0x574f, 0xae => 0x5769, 0xaf => 0x57c0, 0xb0 => 0x5788,
+    0xb1 => 0x5761, 0xb2 => 0x577f, 0xb3 => 0x5789, 0xb4 => 0x5793,
+    0xb5 => 0x57a0, 0xb6 => 0x57b3, 0xb7 => 0x57a4, 0xb8 => 0x57aa,
+    0xb9 => 0x57b0, 0xba => 0x57c3, 0xbb => 0x57c6, 0xbc => 0x57d4,
+    0xbd => 0x57d2, 0xbe => 0x57d3, 0xbf => 0x580a, 0xc0 => 0x57d6,
+    0xc1 => 0x57e3, 0xc2 => 0x580b, 0xc3 => 0x5819, 0xc4 => 0x581d,
+    0xc5 => 0x5872, 0xc6 => 0x5821, 0xc7 => 0x5862, 0xc8 => 0x584b,
+    0xc9 => 0x5870, 0xca => 0x6bc0, 0xcb => 0x5852, 0xcc => 0x583d,
+    0xcd => 0x5879, 0xce => 0x5885, 0xcf => 0x58b9, 0xd0 => 0x589f,
+    0xd1 => 0x58ab, 0xd2 => 0x58ba, 0xd3 => 0x58de, 0xd4 => 0x58bb,
+    0xd5 => 0x58b8, 0xd6 => 0x58ae, 0xd7 => 0x58c5, 0xd8 => 0x58d3,
+    0xd9 => 0x58d1, 0xda => 0x58d7, 0xdb => 0x58d9, 0xdc => 0x58d8,
+    0xdd => 0x58e5, 0xde => 0x58dc, 0xdf => 0x58e4, 0xe0 => 0x58df,
+    0xe1 => 0x58ef, 0xe2 => 0x58fa, 0xe3 => 0x58f9, 0xe4 => 0x58fb,
+    0xe5 => 0x58fc, 0xe6 => 0x58fd, 0xe7 => 0x5902, 0xe8 => 0x590a,
+    0xe9 => 0x5910, 0xea => 0x591b, 0xeb => 0x68a6, 0xec => 0x5925,
+    0xed => 0x592c, 0xee => 0x592d, 0xef => 0x5932, 0xf0 => 0x5938,
+    0xf1 => 0x593e, 0xf2 => 0x7ad2, 0xf3 => 0x5955, 0xf4 => 0x5950,
+    0xf5 => 0x594e, 0xf6 => 0x595a, 0xf7 => 0x5958, 0xf8 => 0x5962,
+    0xf9 => 0x5960, 0xfa => 0x5967, 0xfb => 0x596c, 0xfc => 0x5969,
+  },
+  0x9b => {
+    0x40 => 0x5978, 0x41 => 0x5981, 0x42 => 0x599d, 0x43 => 0x4f5e,
+    0x44 => 0x4fab, 0x45 => 0x59a3, 0x46 => 0x59b2, 0x47 => 0x59c6,
+    0x48 => 0x59e8, 0x49 => 0x59dc, 0x4a => 0x598d, 0x4b => 0x59d9,
+    0x4c => 0x59da, 0x4d => 0x5a25, 0x4e => 0x5a1f, 0x4f => 0x5a11,
+    0x50 => 0x5a1c, 0x51 => 0x5a09, 0x52 => 0x5a1a, 0x53 => 0x5a40,
+    0x54 => 0x5a6c, 0x55 => 0x5a49, 0x56 => 0x5a35, 0x57 => 0x5a36,
+    0x58 => 0x5a62, 0x59 => 0x5a6a, 0x5a => 0x5a9a, 0x5b => 0x5abc,
+    0x5c => 0x5abe, 0x5d => 0x5acb, 0x5e => 0x5ac2, 0x5f => 0x5abd,
+    0x60 => 0x5ae3, 0x61 => 0x5ad7, 0x62 => 0x5ae6, 0x63 => 0x5ae9,
+    0x64 => 0x5ad6, 0x65 => 0x5afa, 0x66 => 0x5afb, 0x67 => 0x5b0c,
+    0x68 => 0x5b0b, 0x69 => 0x5b16, 0x6a => 0x5b32, 0x6b => 0x5ad0,
+    0x6c => 0x5b2a, 0x6d => 0x5b36, 0x6e => 0x5b3e, 0x6f => 0x5b43,
+    0x70 => 0x5b45, 0x71 => 0x5b40, 0x72 => 0x5b51, 0x73 => 0x5b55,
+    0x74 => 0x5b5a, 0x75 => 0x5b5b, 0x76 => 0x5b65, 0x77 => 0x5b69,
+    0x78 => 0x5b70, 0x79 => 0x5b73, 0x7a => 0x5b75, 0x7b => 0x5b78,
+    0x7c => 0x6588, 0x7d => 0x5b7a, 0x7e => 0x5b80, 0x80 => 0x5b83,
+    0x81 => 0x5ba6, 0x82 => 0x5bb8, 0x83 => 0x5bc3, 0x84 => 0x5bc7,
+    0x85 => 0x5bc9, 0x86 => 0x5bd4, 0x87 => 0x5bd0, 0x88 => 0x5be4,
+    0x89 => 0x5be6, 0x8a => 0x5be2, 0x8b => 0x5bde, 0x8c => 0x5be5,
+    0x8d => 0x5beb, 0x8e => 0x5bf0, 0x8f => 0x5bf6, 0x90 => 0x5bf3,
+    0x91 => 0x5c05, 0x92 => 0x5c07, 0x93 => 0x5c08, 0x94 => 0x5c0d,
+    0x95 => 0x5c13, 0x96 => 0x5c20, 0x97 => 0x5c22, 0x98 => 0x5c28,
+    0x99 => 0x5c38, 0x9a => 0x5c39, 0x9b => 0x5c41, 0x9c => 0x5c46,
+    0x9d => 0x5c4e, 0x9e => 0x5c53, 0x9f => 0x5c50, 0xa0 => 0x5c4f,
+    0xa1 => 0x5b71, 0xa2 => 0x5c6c, 0xa3 => 0x5c6e, 0xa4 => 0x4e62,
+    0xa5 => 0x5c76, 0xa6 => 0x5c79, 0xa7 => 0x5c8c, 0xa8 => 0x5c91,
+    0xa9 => 0x5c94, 0xaa => 0x599b, 0xab => 0x5cab, 0xac => 0x5cbb,
+    0xad => 0x5cb6, 0xae => 0x5cbc, 0xaf => 0x5cb7, 0xb0 => 0x5cc5,
+    0xb1 => 0x5cbe, 0xb2 => 0x5cc7, 0xb3 => 0x5cd9, 0xb4 => 0x5ce9,
+    0xb5 => 0x5cfd, 0xb6 => 0x5cfa, 0xb7 => 0x5ced, 0xb8 => 0x5d8c,
+    0xb9 => 0x5cea, 0xba => 0x5d0b, 0xbb => 0x5d15, 0xbc => 0x5d17,
+    0xbd => 0x5d5c, 0xbe => 0x5d1f, 0xbf => 0x5d1b, 0xc0 => 0x5d11,
+    0xc1 => 0x5d14, 0xc2 => 0x5d22, 0xc3 => 0x5d1a, 0xc4 => 0x5d19,
+    0xc5 => 0x5d18, 0xc6 => 0x5d4c, 0xc7 => 0x5d52, 0xc8 => 0x5d4e,
+    0xc9 => 0x5d4b, 0xca => 0x5d6c, 0xcb => 0x5d73, 0xcc => 0x5d76,
+    0xcd => 0x5d87, 0xce => 0x5d84, 0xcf => 0x5d82, 0xd0 => 0x5da2,
+    0xd1 => 0x5d9d, 0xd2 => 0x5dac, 0xd3 => 0x5dae, 0xd4 => 0x5dbd,
+    0xd5 => 0x5d90, 0xd6 => 0x5db7, 0xd7 => 0x5dbc, 0xd8 => 0x5dc9,
+    0xd9 => 0x5dcd, 0xda => 0x5dd3, 0xdb => 0x5dd2, 0xdc => 0x5dd6,
+    0xdd => 0x5ddb, 0xde => 0x5deb, 0xdf => 0x5df2, 0xe0 => 0x5df5,
+    0xe1 => 0x5e0b, 0xe2 => 0x5e1a, 0xe3 => 0x5e19, 0xe4 => 0x5e11,
+    0xe5 => 0x5e1b, 0xe6 => 0x5e36, 0xe7 => 0x5e37, 0xe8 => 0x5e44,
+    0xe9 => 0x5e43, 0xea => 0x5e40, 0xeb => 0x5e4e, 0xec => 0x5e57,
+    0xed => 0x5e54, 0xee => 0x5e5f, 0xef => 0x5e62, 0xf0 => 0x5e64,
+    0xf1 => 0x5e47, 0xf2 => 0x5e75, 0xf3 => 0x5e76, 0xf4 => 0x5e7a,
+    0xf5 => 0x9ebc, 0xf6 => 0x5e7f, 0xf7 => 0x5ea0, 0xf8 => 0x5ec1,
+    0xf9 => 0x5ec2, 0xfa => 0x5ec8, 0xfb => 0x5ed0, 0xfc => 0x5ecf,
+  },
+  0x9c => {
+    0x40 => 0x5ed6, 0x41 => 0x5ee3, 0x42 => 0x5edd, 0x43 => 0x5eda,
+    0x44 => 0x5edb, 0x45 => 0x5ee2, 0x46 => 0x5ee1, 0x47 => 0x5ee8,
+    0x48 => 0x5ee9, 0x49 => 0x5eec, 0x4a => 0x5ef1, 0x4b => 0x5ef3,
+    0x4c => 0x5ef0, 0x4d => 0x5ef4, 0x4e => 0x5ef8, 0x4f => 0x5efe,
+    0x50 => 0x5f03, 0x51 => 0x5f09, 0x52 => 0x5f5d, 0x53 => 0x5f5c,
+    0x54 => 0x5f0b, 0x55 => 0x5f11, 0x56 => 0x5f16, 0x57 => 0x5f29,
+    0x58 => 0x5f2d, 0x59 => 0x5f38, 0x5a => 0x5f41, 0x5b => 0x5f48,
+    0x5c => 0x5f4c, 0x5d => 0x5f4e, 0x5e => 0x5f2f, 0x5f => 0x5f51,
+    0x60 => 0x5f56, 0x61 => 0x5f57, 0x62 => 0x5f59, 0x63 => 0x5f61,
+    0x64 => 0x5f6d, 0x65 => 0x5f73, 0x66 => 0x5f77, 0x67 => 0x5f83,
+    0x68 => 0x5f82, 0x69 => 0x5f7f, 0x6a => 0x5f8a, 0x6b => 0x5f88,
+    0x6c => 0x5f91, 0x6d => 0x5f87, 0x6e => 0x5f9e, 0x6f => 0x5f99,
+    0x70 => 0x5f98, 0x71 => 0x5fa0, 0x72 => 0x5fa8, 0x73 => 0x5fad,
+    0x74 => 0x5fbc, 0x75 => 0x5fd6, 0x76 => 0x5ffb, 0x77 => 0x5fe4,
+    0x78 => 0x5ff8, 0x79 => 0x5ff1, 0x7a => 0x5fdd, 0x7b => 0x60b3,
+    0x7c => 0x5fff, 0x7d => 0x6021, 0x7e => 0x6060, 0x80 => 0x6019,
+    0x81 => 0x6010, 0x82 => 0x6029, 0x83 => 0x600e, 0x84 => 0x6031,
+    0x85 => 0x601b, 0x86 => 0x6015, 0x87 => 0x602b, 0x88 => 0x6026,
+    0x89 => 0x600f, 0x8a => 0x603a, 0x8b => 0x605a, 0x8c => 0x6041,
+    0x8d => 0x606a, 0x8e => 0x6077, 0x8f => 0x605f, 0x90 => 0x604a,
+    0x91 => 0x6046, 0x92 => 0x604d, 0x93 => 0x6063, 0x94 => 0x6043,
+    0x95 => 0x6064, 0x96 => 0x6042, 0x97 => 0x606c, 0x98 => 0x606b,
+    0x99 => 0x6059, 0x9a => 0x6081, 0x9b => 0x608d, 0x9c => 0x60e7,
+    0x9d => 0x6083, 0x9e => 0x609a, 0x9f => 0x6084, 0xa0 => 0x609b,
+    0xa1 => 0x6096, 0xa2 => 0x6097, 0xa3 => 0x6092, 0xa4 => 0x60a7,
+    0xa5 => 0x608b, 0xa6 => 0x60e1, 0xa7 => 0x60b8, 0xa8 => 0x60e0,
+    0xa9 => 0x60d3, 0xaa => 0x60b4, 0xab => 0x5ff0, 0xac => 0x60bd,
+    0xad => 0x60c6, 0xae => 0x60b5, 0xaf => 0x60d8, 0xb0 => 0x614d,
+    0xb1 => 0x6115, 0xb2 => 0x6106, 0xb3 => 0x60f6, 0xb4 => 0x60f7,
+    0xb5 => 0x6100, 0xb6 => 0x60f4, 0xb7 => 0x60fa, 0xb8 => 0x6103,
+    0xb9 => 0x6121, 0xba => 0x60fb, 0xbb => 0x60f1, 0xbc => 0x610d,
+    0xbd => 0x610e, 0xbe => 0x6147, 0xbf => 0x613e, 0xc0 => 0x6128,
+    0xc1 => 0x6127, 0xc2 => 0x614a, 0xc3 => 0x613f, 0xc4 => 0x613c,
+    0xc5 => 0x612c, 0xc6 => 0x6134, 0xc7 => 0x613d, 0xc8 => 0x6142,
+    0xc9 => 0x6144, 0xca => 0x6173, 0xcb => 0x6177, 0xcc => 0x6158,
+    0xcd => 0x6159, 0xce => 0x615a, 0xcf => 0x616b, 0xd0 => 0x6174,
+    0xd1 => 0x616f, 0xd2 => 0x6165, 0xd3 => 0x6171, 0xd4 => 0x615f,
+    0xd5 => 0x615d, 0xd6 => 0x6153, 0xd7 => 0x6175, 0xd8 => 0x6199,
+    0xd9 => 0x6196, 0xda => 0x6187, 0xdb => 0x61ac, 0xdc => 0x6194,
+    0xdd => 0x619a, 0xde => 0x618a, 0xdf => 0x6191, 0xe0 => 0x61ab,
+    0xe1 => 0x61ae, 0xe2 => 0x61cc, 0xe3 => 0x61ca, 0xe4 => 0x61c9,
+    0xe5 => 0x61f7, 0xe6 => 0x61c8, 0xe7 => 0x61c3, 0xe8 => 0x61c6,
+    0xe9 => 0x61ba, 0xea => 0x61cb, 0xeb => 0x7f79, 0xec => 0x61cd,
+    0xed => 0x61e6, 0xee => 0x61e3, 0xef => 0x61f6, 0xf0 => 0x61fa,
+    0xf1 => 0x61f4, 0xf2 => 0x61ff, 0xf3 => 0x61fd, 0xf4 => 0x61fc,
+    0xf5 => 0x61fe, 0xf6 => 0x6200, 0xf7 => 0x6208, 0xf8 => 0x6209,
+    0xf9 => 0x620d, 0xfa => 0x620c, 0xfb => 0x6214, 0xfc => 0x621b,
+  },
+  0x9d => {
+    0x40 => 0x621e, 0x41 => 0x6221, 0x42 => 0x622a, 0x43 => 0x622e,
+    0x44 => 0x6230, 0x45 => 0x6232, 0x46 => 0x6233, 0x47 => 0x6241,
+    0x48 => 0x624e, 0x49 => 0x625e, 0x4a => 0x6263, 0x4b => 0x625b,
+    0x4c => 0x6260, 0x4d => 0x6268, 0x4e => 0x627c, 0x4f => 0x6282,
+    0x50 => 0x6289, 0x51 => 0x627e, 0x52 => 0x6292, 0x53 => 0x6293,
+    0x54 => 0x6296, 0x55 => 0x62d4, 0x56 => 0x6283, 0x57 => 0x6294,
+    0x58 => 0x62d7, 0x59 => 0x62d1, 0x5a => 0x62bb, 0x5b => 0x62cf,
+    0x5c => 0x62ff, 0x5d => 0x62c6, 0x5e => 0x64d4, 0x5f => 0x62c8,
+    0x60 => 0x62dc, 0x61 => 0x62cc, 0x62 => 0x62ca, 0x63 => 0x62c2,
+    0x64 => 0x62c7, 0x65 => 0x629b, 0x66 => 0x62c9, 0x67 => 0x630c,
+    0x68 => 0x62ee, 0x69 => 0x62f1, 0x6a => 0x6327, 0x6b => 0x6302,
+    0x6c => 0x6308, 0x6d => 0x62ef, 0x6e => 0x62f5, 0x6f => 0x6350,
+    0x70 => 0x633e, 0x71 => 0x634d, 0x72 => 0x641c, 0x73 => 0x634f,
+    0x74 => 0x6396, 0x75 => 0x638e, 0x76 => 0x6380, 0x77 => 0x63ab,
+    0x78 => 0x6376, 0x79 => 0x63a3, 0x7a => 0x638f, 0x7b => 0x6389,
+    0x7c => 0x639f, 0x7d => 0x63b5, 0x7e => 0x636b, 0x80 => 0x6369,
+    0x81 => 0x63be, 0x82 => 0x63e9, 0x83 => 0x63c0, 0x84 => 0x63c6,
+    0x85 => 0x63e3, 0x86 => 0x63c9, 0x87 => 0x63d2, 0x88 => 0x63f6,
+    0x89 => 0x63c4, 0x8a => 0x6416, 0x8b => 0x6434, 0x8c => 0x6406,
+    0x8d => 0x6413, 0x8e => 0x6426, 0x8f => 0x6436, 0x90 => 0x651d,
+    0x91 => 0x6417, 0x92 => 0x6428, 0x93 => 0x640f, 0x94 => 0x6467,
+    0x95 => 0x646f, 0x96 => 0x6476, 0x97 => 0x644e, 0x98 => 0x652a,
+    0x99 => 0x6495, 0x9a => 0x6493, 0x9b => 0x64a5, 0x9c => 0x64a9,
+    0x9d => 0x6488, 0x9e => 0x64bc, 0x9f => 0x64da, 0xa0 => 0x64d2,
+    0xa1 => 0x64c5, 0xa2 => 0x64c7, 0xa3 => 0x64bb, 0xa4 => 0x64d8,
+    0xa5 => 0x64c2, 0xa6 => 0x64f1, 0xa7 => 0x64e7, 0xa8 => 0x8209,
+    0xa9 => 0x64e0, 0xaa => 0x64e1, 0xab => 0x62ac, 0xac => 0x64e3,
+    0xad => 0x64ef, 0xae => 0x652c, 0xaf => 0x64f6, 0xb0 => 0x64f4,
+    0xb1 => 0x64f2, 0xb2 => 0x64fa, 0xb3 => 0x6500, 0xb4 => 0x64fd,
+    0xb5 => 0x6518, 0xb6 => 0x651c, 0xb7 => 0x6505, 0xb8 => 0x6524,
+    0xb9 => 0x6523, 0xba => 0x652b, 0xbb => 0x6534, 0xbc => 0x6535,
+    0xbd => 0x6537, 0xbe => 0x6536, 0xbf => 0x6538, 0xc0 => 0x754b,
+    0xc1 => 0x6548, 0xc2 => 0x6556, 0xc3 => 0x6555, 0xc4 => 0x654d,
+    0xc5 => 0x6558, 0xc6 => 0x655e, 0xc7 => 0x655d, 0xc8 => 0x6572,
+    0xc9 => 0x6578, 0xca => 0x6582, 0xcb => 0x6583, 0xcc => 0x8b8a,
+    0xcd => 0x659b, 0xce => 0x659f, 0xcf => 0x65ab, 0xd0 => 0x65b7,
+    0xd1 => 0x65c3, 0xd2 => 0x65c6, 0xd3 => 0x65c1, 0xd4 => 0x65c4,
+    0xd5 => 0x65cc, 0xd6 => 0x65d2, 0xd7 => 0x65db, 0xd8 => 0x65d9,
+    0xd9 => 0x65e0, 0xda => 0x65e1, 0xdb => 0x65f1, 0xdc => 0x6772,
+    0xdd => 0x660a, 0xde => 0x6603, 0xdf => 0x65fb, 0xe0 => 0x6773,
+    0xe1 => 0x6635, 0xe2 => 0x6636, 0xe3 => 0x6634, 0xe4 => 0x661c,
+    0xe5 => 0x664f, 0xe6 => 0x6644, 0xe7 => 0x6649, 0xe8 => 0x6641,
+    0xe9 => 0x665e, 0xea => 0x665d, 0xeb => 0x6664, 0xec => 0x6667,
+    0xed => 0x6668, 0xee => 0x665f, 0xef => 0x6662, 0xf0 => 0x6670,
+    0xf1 => 0x6683, 0xf2 => 0x6688, 0xf3 => 0x668e, 0xf4 => 0x6689,
+    0xf5 => 0x6684, 0xf6 => 0x6698, 0xf7 => 0x669d, 0xf8 => 0x66c1,
+    0xf9 => 0x66b9, 0xfa => 0x66c9, 0xfb => 0x66be, 0xfc => 0x66bc,
+  },
+  0x9e => {
+    0x40 => 0x66c4, 0x41 => 0x66b8, 0x42 => 0x66d6, 0x43 => 0x66da,
+    0x44 => 0x66e0, 0x45 => 0x663f, 0x46 => 0x66e6, 0x47 => 0x66e9,
+    0x48 => 0x66f0, 0x49 => 0x66f5, 0x4a => 0x66f7, 0x4b => 0x670f,
+    0x4c => 0x6716, 0x4d => 0x671e, 0x4e => 0x6726, 0x4f => 0x6727,
+    0x50 => 0x9738, 0x51 => 0x672e, 0x52 => 0x673f, 0x53 => 0x6736,
+    0x54 => 0x6741, 0x55 => 0x6738, 0x56 => 0x6737, 0x57 => 0x6746,
+    0x58 => 0x675e, 0x59 => 0x6760, 0x5a => 0x6759, 0x5b => 0x6763,
+    0x5c => 0x6764, 0x5d => 0x6789, 0x5e => 0x6770, 0x5f => 0x67a9,
+    0x60 => 0x677c, 0x61 => 0x676a, 0x62 => 0x678c, 0x63 => 0x678b,
+    0x64 => 0x67a6, 0x65 => 0x67a1, 0x66 => 0x6785, 0x67 => 0x67b7,
+    0x68 => 0x67ef, 0x69 => 0x67b4, 0x6a => 0x67ec, 0x6b => 0x67b3,
+    0x6c => 0x67e9, 0x6d => 0x67b8, 0x6e => 0x67e4, 0x6f => 0x67de,
+    0x70 => 0x67dd, 0x71 => 0x67e2, 0x72 => 0x67ee, 0x73 => 0x67b9,
+    0x74 => 0x67ce, 0x75 => 0x67c6, 0x76 => 0x67e7, 0x77 => 0x6a9c,
+    0x78 => 0x681e, 0x79 => 0x6846, 0x7a => 0x6829, 0x7b => 0x6840,
+    0x7c => 0x684d, 0x7d => 0x6832, 0x7e => 0x684e, 0x80 => 0x68b3,
+    0x81 => 0x682b, 0x82 => 0x6859, 0x83 => 0x6863, 0x84 => 0x6877,
+    0x85 => 0x687f, 0x86 => 0x689f, 0x87 => 0x688f, 0x88 => 0x68ad,
+    0x89 => 0x6894, 0x8a => 0x689d, 0x8b => 0x689b, 0x8c => 0x6883,
+    0x8d => 0x6aae, 0x8e => 0x68b9, 0x8f => 0x6874, 0x90 => 0x68b5,
+    0x91 => 0x68a0, 0x92 => 0x68ba, 0x93 => 0x690f, 0x94 => 0x688d,
+    0x95 => 0x687e, 0x96 => 0x6901, 0x97 => 0x68ca, 0x98 => 0x6908,
+    0x99 => 0x68d8, 0x9a => 0x6922, 0x9b => 0x6926, 0x9c => 0x68e1,
+    0x9d => 0x690c, 0x9e => 0x68cd, 0x9f => 0x68d4, 0xa0 => 0x68e7,
+    0xa1 => 0x68d5, 0xa2 => 0x6936, 0xa3 => 0x6912, 0xa4 => 0x6904,
+    0xa5 => 0x68d7, 0xa6 => 0x68e3, 0xa7 => 0x6925, 0xa8 => 0x68f9,
+    0xa9 => 0x68e0, 0xaa => 0x68ef, 0xab => 0x6928, 0xac => 0x692a,
+    0xad => 0x691a, 0xae => 0x6923, 0xaf => 0x6921, 0xb0 => 0x68c6,
+    0xb1 => 0x6979, 0xb2 => 0x6977, 0xb3 => 0x695c, 0xb4 => 0x6978,
+    0xb5 => 0x696b, 0xb6 => 0x6954, 0xb7 => 0x697e, 0xb8 => 0x696e,
+    0xb9 => 0x6939, 0xba => 0x6974, 0xbb => 0x693d, 0xbc => 0x6959,
+    0xbd => 0x6930, 0xbe => 0x6961, 0xbf => 0x695e, 0xc0 => 0x695d,
+    0xc1 => 0x6981, 0xc2 => 0x696a, 0xc3 => 0x69b2, 0xc4 => 0x69ae,
+    0xc5 => 0x69d0, 0xc6 => 0x69bf, 0xc7 => 0x69c1, 0xc8 => 0x69d3,
+    0xc9 => 0x69be, 0xca => 0x69ce, 0xcb => 0x5be8, 0xcc => 0x69ca,
+    0xcd => 0x69dd, 0xce => 0x69bb, 0xcf => 0x69c3, 0xd0 => 0x69a7,
+    0xd1 => 0x6a2e, 0xd2 => 0x6991, 0xd3 => 0x69a0, 0xd4 => 0x699c,
+    0xd5 => 0x6995, 0xd6 => 0x69b4, 0xd7 => 0x69de, 0xd8 => 0x69e8,
+    0xd9 => 0x6a02, 0xda => 0x6a1b, 0xdb => 0x69ff, 0xdc => 0x6b0a,
+    0xdd => 0x69f9, 0xde => 0x69f2, 0xdf => 0x69e7, 0xe0 => 0x6a05,
+    0xe1 => 0x69b1, 0xe2 => 0x6a1e, 0xe3 => 0x69ed, 0xe4 => 0x6a14,
+    0xe5 => 0x69eb, 0xe6 => 0x6a0a, 0xe7 => 0x6a12, 0xe8 => 0x6ac1,
+    0xe9 => 0x6a23, 0xea => 0x6a13, 0xeb => 0x6a44, 0xec => 0x6a0c,
+    0xed => 0x6a72, 0xee => 0x6a36, 0xef => 0x6a78, 0xf0 => 0x6a47,
+    0xf1 => 0x6a62, 0xf2 => 0x6a59, 0xf3 => 0x6a66, 0xf4 => 0x6a48,
+    0xf5 => 0x6a38, 0xf6 => 0x6a22, 0xf7 => 0x6a90, 0xf8 => 0x6a8d,
+    0xf9 => 0x6aa0, 0xfa => 0x6a84, 0xfb => 0x6aa2, 0xfc => 0x6aa3,
+  },
+  0x9f => {
+    0x40 => 0x6a97, 0x41 => 0x8617, 0x42 => 0x6abb, 0x43 => 0x6ac3,
+    0x44 => 0x6ac2, 0x45 => 0x6ab8, 0x46 => 0x6ab3, 0x47 => 0x6aac,
+    0x48 => 0x6ade, 0x49 => 0x6ad1, 0x4a => 0x6adf, 0x4b => 0x6aaa,
+    0x4c => 0x6ada, 0x4d => 0x6aea, 0x4e => 0x6afb, 0x4f => 0x6b05,
+    0x50 => 0x8616, 0x51 => 0x6afa, 0x52 => 0x6b12, 0x53 => 0x6b16,
+    0x54 => 0x9b31, 0x55 => 0x6b1f, 0x56 => 0x6b38, 0x57 => 0x6b37,
+    0x58 => 0x76dc, 0x59 => 0x6b39, 0x5a => 0x98ee, 0x5b => 0x6b47,
+    0x5c => 0x6b43, 0x5d => 0x6b49, 0x5e => 0x6b50, 0x5f => 0x6b59,
+    0x60 => 0x6b54, 0x61 => 0x6b5b, 0x62 => 0x6b5f, 0x63 => 0x6b61,
+    0x64 => 0x6b78, 0x65 => 0x6b79, 0x66 => 0x6b7f, 0x67 => 0x6b80,
+    0x68 => 0x6b84, 0x69 => 0x6b83, 0x6a => 0x6b8d, 0x6b => 0x6b98,
+    0x6c => 0x6b95, 0x6d => 0x6b9e, 0x6e => 0x6ba4, 0x6f => 0x6baa,
+    0x70 => 0x6bab, 0x71 => 0x6baf, 0x72 => 0x6bb2, 0x73 => 0x6bb1,
+    0x74 => 0x6bb3, 0x75 => 0x6bb7, 0x76 => 0x6bbc, 0x77 => 0x6bc6,
+    0x78 => 0x6bcb, 0x79 => 0x6bd3, 0x7a => 0x6bdf, 0x7b => 0x6bec,
+    0x7c => 0x6beb, 0x7d => 0x6bf3, 0x7e => 0x6bef, 0x80 => 0x9ebe,
+    0x81 => 0x6c08, 0x82 => 0x6c13, 0x83 => 0x6c14, 0x84 => 0x6c1b,
+    0x85 => 0x6c24, 0x86 => 0x6c23, 0x87 => 0x6c5e, 0x88 => 0x6c55,
+    0x89 => 0x6c62, 0x8a => 0x6c6a, 0x8b => 0x6c82, 0x8c => 0x6c8d,
+    0x8d => 0x6c9a, 0x8e => 0x6c81, 0x8f => 0x6c9b, 0x90 => 0x6c7e,
+    0x91 => 0x6c68, 0x92 => 0x6c73, 0x93 => 0x6c92, 0x94 => 0x6c90,
+    0x95 => 0x6cc4, 0x96 => 0x6cf1, 0x97 => 0x6cd3, 0x98 => 0x6cbd,
+    0x99 => 0x6cd7, 0x9a => 0x6cc5, 0x9b => 0x6cdd, 0x9c => 0x6cae,
+    0x9d => 0x6cb1, 0x9e => 0x6cbe, 0x9f => 0x6cba, 0xa0 => 0x6cdb,
+    0xa1 => 0x6cef, 0xa2 => 0x6cd9, 0xa3 => 0x6cea, 0xa4 => 0x6d1f,
+    0xa5 => 0x884d, 0xa6 => 0x6d36, 0xa7 => 0x6d2b, 0xa8 => 0x6d3d,
+    0xa9 => 0x6d38, 0xaa => 0x6d19, 0xab => 0x6d35, 0xac => 0x6d33,
+    0xad => 0x6d12, 0xae => 0x6d0c, 0xaf => 0x6d63, 0xb0 => 0x6d93,
+    0xb1 => 0x6d64, 0xb2 => 0x6d5a, 0xb3 => 0x6d79, 0xb4 => 0x6d59,
+    0xb5 => 0x6d8e, 0xb6 => 0x6d95, 0xb7 => 0x6fe4, 0xb8 => 0x6d85,
+    0xb9 => 0x6df9, 0xba => 0x6e15, 0xbb => 0x6e0a, 0xbc => 0x6db5,
+    0xbd => 0x6dc7, 0xbe => 0x6de6, 0xbf => 0x6db8, 0xc0 => 0x6dc6,
+    0xc1 => 0x6dec, 0xc2 => 0x6dde, 0xc3 => 0x6dcc, 0xc4 => 0x6de8,
+    0xc5 => 0x6dd2, 0xc6 => 0x6dc5, 0xc7 => 0x6dfa, 0xc8 => 0x6dd9,
+    0xc9 => 0x6de4, 0xca => 0x6dd5, 0xcb => 0x6dea, 0xcc => 0x6dee,
+    0xcd => 0x6e2d, 0xce => 0x6e6e, 0xcf => 0x6e2e, 0xd0 => 0x6e19,
+    0xd1 => 0x6e72, 0xd2 => 0x6e5f, 0xd3 => 0x6e3e, 0xd4 => 0x6e23,
+    0xd5 => 0x6e6b, 0xd6 => 0x6e2b, 0xd7 => 0x6e76, 0xd8 => 0x6e4d,
+    0xd9 => 0x6e1f, 0xda => 0x6e43, 0xdb => 0x6e3a, 0xdc => 0x6e4e,
+    0xdd => 0x6e24, 0xde => 0x6eff, 0xdf => 0x6e1d, 0xe0 => 0x6e38,
+    0xe1 => 0x6e82, 0xe2 => 0x6eaa, 0xe3 => 0x6e98, 0xe4 => 0x6ec9,
+    0xe5 => 0x6eb7, 0xe6 => 0x6ed3, 0xe7 => 0x6ebd, 0xe8 => 0x6eaf,
+    0xe9 => 0x6ec4, 0xea => 0x6eb2, 0xeb => 0x6ed4, 0xec => 0x6ed5,
+    0xed => 0x6e8f, 0xee => 0x6ea5, 0xef => 0x6ec2, 0xf0 => 0x6e9f,
+    0xf1 => 0x6f41, 0xf2 => 0x6f11, 0xf3 => 0x704c, 0xf4 => 0x6eec,
+    0xf5 => 0x6ef8, 0xf6 => 0x6efe, 0xf7 => 0x6f3f, 0xf8 => 0x6ef2,
+    0xf9 => 0x6f31, 0xfa => 0x6eef, 0xfb => 0x6f32, 0xfc => 0x6ecc,
+  },
+  0xa1 => 0xff61, 0xa2 => 0xff62, 0xa3 => 0xff63, 0xa4 => 0xff64,
+  0xa5 => 0xff65, 0xa6 => 0xff66, 0xa7 => 0xff67, 0xa8 => 0xff68,
+  0xa9 => 0xff69, 0xaa => 0xff6a, 0xab => 0xff6b, 0xac => 0xff6c,
+  0xad => 0xff6d, 0xae => 0xff6e, 0xaf => 0xff6f, 0xb0 => 0xff70,
+  0xb1 => 0xff71, 0xb2 => 0xff72, 0xb3 => 0xff73, 0xb4 => 0xff74,
+  0xb5 => 0xff75, 0xb6 => 0xff76, 0xb7 => 0xff77, 0xb8 => 0xff78,
+  0xb9 => 0xff79, 0xba => 0xff7a, 0xbb => 0xff7b, 0xbc => 0xff7c,
+  0xbd => 0xff7d, 0xbe => 0xff7e, 0xbf => 0xff7f, 0xc0 => 0xff80,
+  0xc1 => 0xff81, 0xc2 => 0xff82, 0xc3 => 0xff83, 0xc4 => 0xff84,
+  0xc5 => 0xff85, 0xc6 => 0xff86, 0xc7 => 0xff87, 0xc8 => 0xff88,
+  0xc9 => 0xff89, 0xca => 0xff8a, 0xcb => 0xff8b, 0xcc => 0xff8c,
+  0xcd => 0xff8d, 0xce => 0xff8e, 0xcf => 0xff8f, 0xd0 => 0xff90,
+  0xd1 => 0xff91, 0xd2 => 0xff92, 0xd3 => 0xff93, 0xd4 => 0xff94,
+  0xd5 => 0xff95, 0xd6 => 0xff96, 0xd7 => 0xff97, 0xd8 => 0xff98,
+  0xd9 => 0xff99, 0xda => 0xff9a, 0xdb => 0xff9b, 0xdc => 0xff9c,
+  0xdd => 0xff9d, 0xde => 0xff9e, 0xdf => 0xff9f,
+  0xe0 => {
+    0x40 => 0x6f3e, 0x41 => 0x6f13, 0x42 => 0x6ef7, 0x43 => 0x6f86,
+    0x44 => 0x6f7a, 0x45 => 0x6f78, 0x46 => 0x6f81, 0x47 => 0x6f80,
+    0x48 => 0x6f6f, 0x49 => 0x6f5b, 0x4a => 0x6ff3, 0x4b => 0x6f6d,
+    0x4c => 0x6f82, 0x4d => 0x6f7c, 0x4e => 0x6f58, 0x4f => 0x6f8e,
+    0x50 => 0x6f91, 0x51 => 0x6fc2, 0x52 => 0x6f66, 0x53 => 0x6fb3,
+    0x54 => 0x6fa3, 0x55 => 0x6fa1, 0x56 => 0x6fa4, 0x57 => 0x6fb9,
+    0x58 => 0x6fc6, 0x59 => 0x6faa, 0x5a => 0x6fdf, 0x5b => 0x6fd5,
+    0x5c => 0x6fec, 0x5d => 0x6fd4, 0x5e => 0x6fd8, 0x5f => 0x6ff1,
+    0x60 => 0x6fee, 0x61 => 0x6fdb, 0x62 => 0x7009, 0x63 => 0x700b,
+    0x64 => 0x6ffa, 0x65 => 0x7011, 0x66 => 0x7001, 0x67 => 0x700f,
+    0x68 => 0x6ffe, 0x69 => 0x701b, 0x6a => 0x701a, 0x6b => 0x6f74,
+    0x6c => 0x701d, 0x6d => 0x7018, 0x6e => 0x701f, 0x6f => 0x7030,
+    0x70 => 0x703e, 0x71 => 0x7032, 0x72 => 0x7051, 0x73 => 0x7063,
+    0x74 => 0x7099, 0x75 => 0x7092, 0x76 => 0x70af, 0x77 => 0x70f1,
+    0x78 => 0x70ac, 0x79 => 0x70b8, 0x7a => 0x70b3, 0x7b => 0x70ae,
+    0x7c => 0x70df, 0x7d => 0x70cb, 0x7e => 0x70dd, 0x80 => 0x70d9,
+    0x81 => 0x7109, 0x82 => 0x70fd, 0x83 => 0x711c, 0x84 => 0x7119,
+    0x85 => 0x7165, 0x86 => 0x7155, 0x87 => 0x7188, 0x88 => 0x7166,
+    0x89 => 0x7162, 0x8a => 0x714c, 0x8b => 0x7156, 0x8c => 0x716c,
+    0x8d => 0x718f, 0x8e => 0x71fb, 0x8f => 0x7184, 0x90 => 0x7195,
+    0x91 => 0x71a8, 0x92 => 0x71ac, 0x93 => 0x71d7, 0x94 => 0x71b9,
+    0x95 => 0x71be, 0x96 => 0x71d2, 0x97 => 0x71c9, 0x98 => 0x71d4,
+    0x99 => 0x71ce, 0x9a => 0x71e0, 0x9b => 0x71ec, 0x9c => 0x71e7,
+    0x9d => 0x71f5, 0x9e => 0x71fc, 0x9f => 0x71f9, 0xa0 => 0x71ff,
+    0xa1 => 0x720d, 0xa2 => 0x7210, 0xa3 => 0x721b, 0xa4 => 0x7228,
+    0xa5 => 0x722d, 0xa6 => 0x722c, 0xa7 => 0x7230, 0xa8 => 0x7232,
+    0xa9 => 0x723b, 0xaa => 0x723c, 0xab => 0x723f, 0xac => 0x7240,
+    0xad => 0x7246, 0xae => 0x724b, 0xaf => 0x7258, 0xb0 => 0x7274,
+    0xb1 => 0x727e, 0xb2 => 0x7282, 0xb3 => 0x7281, 0xb4 => 0x7287,
+    0xb5 => 0x7292, 0xb6 => 0x7296, 0xb7 => 0x72a2, 0xb8 => 0x72a7,
+    0xb9 => 0x72b9, 0xba => 0x72b2, 0xbb => 0x72c3, 0xbc => 0x72c6,
+    0xbd => 0x72c4, 0xbe => 0x72ce, 0xbf => 0x72d2, 0xc0 => 0x72e2,
+    0xc1 => 0x72e0, 0xc2 => 0x72e1, 0xc3 => 0x72f9, 0xc4 => 0x72f7,
+    0xc5 => 0x500f, 0xc6 => 0x7317, 0xc7 => 0x730a, 0xc8 => 0x731c,
+    0xc9 => 0x7316, 0xca => 0x731d, 0xcb => 0x7334, 0xcc => 0x732f,
+    0xcd => 0x7329, 0xce => 0x7325, 0xcf => 0x733e, 0xd0 => 0x734e,
+    0xd1 => 0x734f, 0xd2 => 0x9ed8, 0xd3 => 0x7357, 0xd4 => 0x736a,
+    0xd5 => 0x7368, 0xd6 => 0x7370, 0xd7 => 0x7378, 0xd8 => 0x7375,
+    0xd9 => 0x737b, 0xda => 0x737a, 0xdb => 0x73c8, 0xdc => 0x73b3,
+    0xdd => 0x73ce, 0xde => 0x73bb, 0xdf => 0x73c0, 0xe0 => 0x73e5,
+    0xe1 => 0x73ee, 0xe2 => 0x73de, 0xe3 => 0x74a2, 0xe4 => 0x7405,
+    0xe5 => 0x746f, 0xe6 => 0x7425, 0xe7 => 0x73f8, 0xe8 => 0x7432,
+    0xe9 => 0x743a, 0xea => 0x7455, 0xeb => 0x743f, 0xec => 0x745f,
+    0xed => 0x7459, 0xee => 0x7441, 0xef => 0x745c, 0xf0 => 0x7469,
+    0xf1 => 0x7470, 0xf2 => 0x7463, 0xf3 => 0x746a, 0xf4 => 0x7476,
+    0xf5 => 0x747e, 0xf6 => 0x748b, 0xf7 => 0x749e, 0xf8 => 0x74a7,
+    0xf9 => 0x74ca, 0xfa => 0x74cf, 0xfb => 0x74d4, 0xfc => 0x73f1,
+  },
+  0xe1 => {
+    0x40 => 0x74e0, 0x41 => 0x74e3, 0x42 => 0x74e7, 0x43 => 0x74e9,
+    0x44 => 0x74ee, 0x45 => 0x74f2, 0x46 => 0x74f0, 0x47 => 0x74f1,
+    0x48 => 0x74f8, 0x49 => 0x74f7, 0x4a => 0x7504, 0x4b => 0x7503,
+    0x4c => 0x7505, 0x4d => 0x750c, 0x4e => 0x750e, 0x4f => 0x750d,
+    0x50 => 0x7515, 0x51 => 0x7513, 0x52 => 0x751e, 0x53 => 0x7526,
+    0x54 => 0x752c, 0x55 => 0x753c, 0x56 => 0x7544, 0x57 => 0x754d,
+    0x58 => 0x754a, 0x59 => 0x7549, 0x5a => 0x755b, 0x5b => 0x7546,
+    0x5c => 0x755a, 0x5d => 0x7569, 0x5e => 0x7564, 0x5f => 0x7567,
+    0x60 => 0x756b, 0x61 => 0x756d, 0x62 => 0x7578, 0x63 => 0x7576,
+    0x64 => 0x7586, 0x65 => 0x7587, 0x66 => 0x7574, 0x67 => 0x758a,
+    0x68 => 0x7589, 0x69 => 0x7582, 0x6a => 0x7594, 0x6b => 0x759a,
+    0x6c => 0x759d, 0x6d => 0x75a5, 0x6e => 0x75a3, 0x6f => 0x75c2,
+    0x70 => 0x75b3, 0x71 => 0x75c3, 0x72 => 0x75b5, 0x73 => 0x75bd,
+    0x74 => 0x75b8, 0x75 => 0x75bc, 0x76 => 0x75b1, 0x77 => 0x75cd,
+    0x78 => 0x75ca, 0x79 => 0x75d2, 0x7a => 0x75d9, 0x7b => 0x75e3,
+    0x7c => 0x75de, 0x7d => 0x75fe, 0x7e => 0x75ff, 0x80 => 0x75fc,
+    0x81 => 0x7601, 0x82 => 0x75f0, 0x83 => 0x75fa, 0x84 => 0x75f2,
+    0x85 => 0x75f3, 0x86 => 0x760b, 0x87 => 0x760d, 0x88 => 0x7609,
+    0x89 => 0x761f, 0x8a => 0x7627, 0x8b => 0x7620, 0x8c => 0x7621,
+    0x8d => 0x7622, 0x8e => 0x7624, 0x8f => 0x7634, 0x90 => 0x7630,
+    0x91 => 0x763b, 0x92 => 0x7647, 0x93 => 0x7648, 0x94 => 0x7646,
+    0x95 => 0x765c, 0x96 => 0x7658, 0x97 => 0x7661, 0x98 => 0x7662,
+    0x99 => 0x7668, 0x9a => 0x7669, 0x9b => 0x766a, 0x9c => 0x7667,
+    0x9d => 0x766c, 0x9e => 0x7670, 0x9f => 0x7672, 0xa0 => 0x7676,
+    0xa1 => 0x7678, 0xa2 => 0x767c, 0xa3 => 0x7680, 0xa4 => 0x7683,
+    0xa5 => 0x7688, 0xa6 => 0x768b, 0xa7 => 0x768e, 0xa8 => 0x7696,
+    0xa9 => 0x7693, 0xaa => 0x7699, 0xab => 0x769a, 0xac => 0x76b0,
+    0xad => 0x76b4, 0xae => 0x76b8, 0xaf => 0x76b9, 0xb0 => 0x76ba,
+    0xb1 => 0x76c2, 0xb2 => 0x76cd, 0xb3 => 0x76d6, 0xb4 => 0x76d2,
+    0xb5 => 0x76de, 0xb6 => 0x76e1, 0xb7 => 0x76e5, 0xb8 => 0x76e7,
+    0xb9 => 0x76ea, 0xba => 0x862f, 0xbb => 0x76fb, 0xbc => 0x7708,
+    0xbd => 0x7707, 0xbe => 0x7704, 0xbf => 0x7729, 0xc0 => 0x7724,
+    0xc1 => 0x771e, 0xc2 => 0x7725, 0xc3 => 0x7726, 0xc4 => 0x771b,
+    0xc5 => 0x7737, 0xc6 => 0x7738, 0xc7 => 0x7747, 0xc8 => 0x775a,
+    0xc9 => 0x7768, 0xca => 0x776b, 0xcb => 0x775b, 0xcc => 0x7765,
+    0xcd => 0x777f, 0xce => 0x777e, 0xcf => 0x7779, 0xd0 => 0x778e,
+    0xd1 => 0x778b, 0xd2 => 0x7791, 0xd3 => 0x77a0, 0xd4 => 0x779e,
+    0xd5 => 0x77b0, 0xd6 => 0x77b6, 0xd7 => 0x77b9, 0xd8 => 0x77bf,
+    0xd9 => 0x77bc, 0xda => 0x77bd, 0xdb => 0x77bb, 0xdc => 0x77c7,
+    0xdd => 0x77cd, 0xde => 0x77d7, 0xdf => 0x77da, 0xe0 => 0x77dc,
+    0xe1 => 0x77e3, 0xe2 => 0x77ee, 0xe3 => 0x77fc, 0xe4 => 0x780c,
+    0xe5 => 0x7812, 0xe6 => 0x7926, 0xe7 => 0x7820, 0xe8 => 0x792a,
+    0xe9 => 0x7845, 0xea => 0x788e, 0xeb => 0x7874, 0xec => 0x7886,
+    0xed => 0x787c, 0xee => 0x789a, 0xef => 0x788c, 0xf0 => 0x78a3,
+    0xf1 => 0x78b5, 0xf2 => 0x78aa, 0xf3 => 0x78af, 0xf4 => 0x78d1,
+    0xf5 => 0x78c6, 0xf6 => 0x78cb, 0xf7 => 0x78d4, 0xf8 => 0x78be,
+    0xf9 => 0x78bc, 0xfa => 0x78c5, 0xfb => 0x78ca, 0xfc => 0x78ec,
+  },
+  0xe2 => {
+    0x40 => 0x78e7, 0x41 => 0x78da, 0x42 => 0x78fd, 0x43 => 0x78f4,
+    0x44 => 0x7907, 0x45 => 0x7912, 0x46 => 0x7911, 0x47 => 0x7919,
+    0x48 => 0x792c, 0x49 => 0x792b, 0x4a => 0x7940, 0x4b => 0x7960,
+    0x4c => 0x7957, 0x4d => 0x795f, 0x4e => 0x795a, 0x4f => 0x7955,
+    0x50 => 0x7953, 0x51 => 0x797a, 0x52 => 0x797f, 0x53 => 0x798a,
+    0x54 => 0x799d, 0x55 => 0x79a7, 0x56 => 0x9f4b, 0x57 => 0x79aa,
+    0x58 => 0x79ae, 0x59 => 0x79b3, 0x5a => 0x79b9, 0x5b => 0x79ba,
+    0x5c => 0x79c9, 0x5d => 0x79d5, 0x5e => 0x79e7, 0x5f => 0x79ec,
+    0x60 => 0x79e1, 0x61 => 0x79e3, 0x62 => 0x7a08, 0x63 => 0x7a0d,
+    0x64 => 0x7a18, 0x65 => 0x7a19, 0x66 => 0x7a20, 0x67 => 0x7a1f,
+    0x68 => 0x7980, 0x69 => 0x7a31, 0x6a => 0x7a3b, 0x6b => 0x7a3e,
+    0x6c => 0x7a37, 0x6d => 0x7a43, 0x6e => 0x7a57, 0x6f => 0x7a49,
+    0x70 => 0x7a61, 0x71 => 0x7a62, 0x72 => 0x7a69, 0x73 => 0x9f9d,
+    0x74 => 0x7a70, 0x75 => 0x7a79, 0x76 => 0x7a7d, 0x77 => 0x7a88,
+    0x78 => 0x7a97, 0x79 => 0x7a95, 0x7a => 0x7a98, 0x7b => 0x7a96,
+    0x7c => 0x7aa9, 0x7d => 0x7ac8, 0x7e => 0x7ab0, 0x80 => 0x7ab6,
+    0x81 => 0x7ac5, 0x82 => 0x7ac4, 0x83 => 0x7abf, 0x84 => 0x9083,
+    0x85 => 0x7ac7, 0x86 => 0x7aca, 0x87 => 0x7acd, 0x88 => 0x7acf,
+    0x89 => 0x7ad5, 0x8a => 0x7ad3, 0x8b => 0x7ad9, 0x8c => 0x7ada,
+    0x8d => 0x7add, 0x8e => 0x7ae1, 0x8f => 0x7ae2, 0x90 => 0x7ae6,
+    0x91 => 0x7aed, 0x92 => 0x7af0, 0x93 => 0x7b02, 0x94 => 0x7b0f,
+    0x95 => 0x7b0a, 0x96 => 0x7b06, 0x97 => 0x7b33, 0x98 => 0x7b18,
+    0x99 => 0x7b19, 0x9a => 0x7b1e, 0x9b => 0x7b35, 0x9c => 0x7b28,
+    0x9d => 0x7b36, 0x9e => 0x7b50, 0x9f => 0x7b7a, 0xa0 => 0x7b04,
+    0xa1 => 0x7b4d, 0xa2 => 0x7b0b, 0xa3 => 0x7b4c, 0xa4 => 0x7b45,
+    0xa5 => 0x7b75, 0xa6 => 0x7b65, 0xa7 => 0x7b74, 0xa8 => 0x7b67,
+    0xa9 => 0x7b70, 0xaa => 0x7b71, 0xab => 0x7b6c, 0xac => 0x7b6e,
+    0xad => 0x7b9d, 0xae => 0x7b98, 0xaf => 0x7b9f, 0xb0 => 0x7b8d,
+    0xb1 => 0x7b9c, 0xb2 => 0x7b9a, 0xb3 => 0x7b8b, 0xb4 => 0x7b92,
+    0xb5 => 0x7b8f, 0xb6 => 0x7b5d, 0xb7 => 0x7b99, 0xb8 => 0x7bcb,
+    0xb9 => 0x7bc1, 0xba => 0x7bcc, 0xbb => 0x7bcf, 0xbc => 0x7bb4,
+    0xbd => 0x7bc6, 0xbe => 0x7bdd, 0xbf => 0x7be9, 0xc0 => 0x7c11,
+    0xc1 => 0x7c14, 0xc2 => 0x7be6, 0xc3 => 0x7be5, 0xc4 => 0x7c60,
+    0xc5 => 0x7c00, 0xc6 => 0x7c07, 0xc7 => 0x7c13, 0xc8 => 0x7bf3,
+    0xc9 => 0x7bf7, 0xca => 0x7c17, 0xcb => 0x7c0d, 0xcc => 0x7bf6,
+    0xcd => 0x7c23, 0xce => 0x7c27, 0xcf => 0x7c2a, 0xd0 => 0x7c1f,
+    0xd1 => 0x7c37, 0xd2 => 0x7c2b, 0xd3 => 0x7c3d, 0xd4 => 0x7c4c,
+    0xd5 => 0x7c43, 0xd6 => 0x7c54, 0xd7 => 0x7c4f, 0xd8 => 0x7c40,
+    0xd9 => 0x7c50, 0xda => 0x7c58, 0xdb => 0x7c5f, 0xdc => 0x7c64,
+    0xdd => 0x7c56, 0xde => 0x7c65, 0xdf => 0x7c6c, 0xe0 => 0x7c75,
+    0xe1 => 0x7c83, 0xe2 => 0x7c90, 0xe3 => 0x7ca4, 0xe4 => 0x7cad,
+    0xe5 => 0x7ca2, 0xe6 => 0x7cab, 0xe7 => 0x7ca1, 0xe8 => 0x7ca8,
+    0xe9 => 0x7cb3, 0xea => 0x7cb2, 0xeb => 0x7cb1, 0xec => 0x7cae,
+    0xed => 0x7cb9, 0xee => 0x7cbd, 0xef => 0x7cc0, 0xf0 => 0x7cc5,
+    0xf1 => 0x7cc2, 0xf2 => 0x7cd8, 0xf3 => 0x7cd2, 0xf4 => 0x7cdc,
+    0xf5 => 0x7ce2, 0xf6 => 0x9b3b, 0xf7 => 0x7cef, 0xf8 => 0x7cf2,
+    0xf9 => 0x7cf4, 0xfa => 0x7cf6, 0xfb => 0x7cfa, 0xfc => 0x7d06,
+  },
+  0xe3 => {
+    0x40 => 0x7d02, 0x41 => 0x7d1c, 0x42 => 0x7d15, 0x43 => 0x7d0a,
+    0x44 => 0x7d45, 0x45 => 0x7d4b, 0x46 => 0x7d2e, 0x47 => 0x7d32,
+    0x48 => 0x7d3f, 0x49 => 0x7d35, 0x4a => 0x7d46, 0x4b => 0x7d73,
+    0x4c => 0x7d56, 0x4d => 0x7d4e, 0x4e => 0x7d72, 0x4f => 0x7d68,
+    0x50 => 0x7d6e, 0x51 => 0x7d4f, 0x52 => 0x7d63, 0x53 => 0x7d93,
+    0x54 => 0x7d89, 0x55 => 0x7d5b, 0x56 => 0x7d8f, 0x57 => 0x7d7d,
+    0x58 => 0x7d9b, 0x59 => 0x7dba, 0x5a => 0x7dae, 0x5b => 0x7da3,
+    0x5c => 0x7db5, 0x5d => 0x7dc7, 0x5e => 0x7dbd, 0x5f => 0x7dab,
+    0x60 => 0x7e3d, 0x61 => 0x7da2, 0x62 => 0x7daf, 0x63 => 0x7ddc,
+    0x64 => 0x7db8, 0x65 => 0x7d9f, 0x66 => 0x7db0, 0x67 => 0x7dd8,
+    0x68 => 0x7ddd, 0x69 => 0x7de4, 0x6a => 0x7dde, 0x6b => 0x7dfb,
+    0x6c => 0x7df2, 0x6d => 0x7de1, 0x6e => 0x7e05, 0x6f => 0x7e0a,
+    0x70 => 0x7e23, 0x71 => 0x7e21, 0x72 => 0x7e12, 0x73 => 0x7e31,
+    0x74 => 0x7e1f, 0x75 => 0x7e09, 0x76 => 0x7e0b, 0x77 => 0x7e22,
+    0x78 => 0x7e46, 0x79 => 0x7e66, 0x7a => 0x7e3b, 0x7b => 0x7e35,
+    0x7c => 0x7e39, 0x7d => 0x7e43, 0x7e => 0x7e37, 0x80 => 0x7e32,
+    0x81 => 0x7e3a, 0x82 => 0x7e67, 0x83 => 0x7e5d, 0x84 => 0x7e56,
+    0x85 => 0x7e5e, 0x86 => 0x7e59, 0x87 => 0x7e5a, 0x88 => 0x7e79,
+    0x89 => 0x7e6a, 0x8a => 0x7e69, 0x8b => 0x7e7c, 0x8c => 0x7e7b,
+    0x8d => 0x7e83, 0x8e => 0x7dd5, 0x8f => 0x7e7d, 0x90 => 0x8fae,
+    0x91 => 0x7e7f, 0x92 => 0x7e88, 0x93 => 0x7e89, 0x94 => 0x7e8c,
+    0x95 => 0x7e92, 0x96 => 0x7e90, 0x97 => 0x7e93, 0x98 => 0x7e94,
+    0x99 => 0x7e96, 0x9a => 0x7e8e, 0x9b => 0x7e9b, 0x9c => 0x7e9c,
+    0x9d => 0x7f38, 0x9e => 0x7f3a, 0x9f => 0x7f45, 0xa0 => 0x7f4c,
+    0xa1 => 0x7f4d, 0xa2 => 0x7f4e, 0xa3 => 0x7f50, 0xa4 => 0x7f51,
+    0xa5 => 0x7f55, 0xa6 => 0x7f54, 0xa7 => 0x7f58, 0xa8 => 0x7f5f,
+    0xa9 => 0x7f60, 0xaa => 0x7f68, 0xab => 0x7f69, 0xac => 0x7f67,
+    0xad => 0x7f78, 0xae => 0x7f82, 0xaf => 0x7f86, 0xb0 => 0x7f83,
+    0xb1 => 0x7f88, 0xb2 => 0x7f87, 0xb3 => 0x7f8c, 0xb4 => 0x7f94,
+    0xb5 => 0x7f9e, 0xb6 => 0x7f9d, 0xb7 => 0x7f9a, 0xb8 => 0x7fa3,
+    0xb9 => 0x7faf, 0xba => 0x7fb2, 0xbb => 0x7fb9, 0xbc => 0x7fae,
+    0xbd => 0x7fb6, 0xbe => 0x7fb8, 0xbf => 0x8b71, 0xc0 => 0x7fc5,
+    0xc1 => 0x7fc6, 0xc2 => 0x7fca, 0xc3 => 0x7fd5, 0xc4 => 0x7fd4,
+    0xc5 => 0x7fe1, 0xc6 => 0x7fe6, 0xc7 => 0x7fe9, 0xc8 => 0x7ff3,
+    0xc9 => 0x7ff9, 0xca => 0x98dc, 0xcb => 0x8006, 0xcc => 0x8004,
+    0xcd => 0x800b, 0xce => 0x8012, 0xcf => 0x8018, 0xd0 => 0x8019,
+    0xd1 => 0x801c, 0xd2 => 0x8021, 0xd3 => 0x8028, 0xd4 => 0x803f,
+    0xd5 => 0x803b, 0xd6 => 0x804a, 0xd7 => 0x8046, 0xd8 => 0x8052,
+    0xd9 => 0x8058, 0xda => 0x805a, 0xdb => 0x805f, 0xdc => 0x8062,
+    0xdd => 0x8068, 0xde => 0x8073, 0xdf => 0x8072, 0xe0 => 0x8070,
+    0xe1 => 0x8076, 0xe2 => 0x8079, 0xe3 => 0x807d, 0xe4 => 0x807f,
+    0xe5 => 0x8084, 0xe6 => 0x8086, 0xe7 => 0x8085, 0xe8 => 0x809b,
+    0xe9 => 0x8093, 0xea => 0x809a, 0xeb => 0x80ad, 0xec => 0x5190,
+    0xed => 0x80ac, 0xee => 0x80db, 0xef => 0x80e5, 0xf0 => 0x80d9,
+    0xf1 => 0x80dd, 0xf2 => 0x80c4, 0xf3 => 0x80da, 0xf4 => 0x80d6,
+    0xf5 => 0x8109, 0xf6 => 0x80ef, 0xf7 => 0x80f1, 0xf8 => 0x811b,
+    0xf9 => 0x8129, 0xfa => 0x8123, 0xfb => 0x812f, 0xfc => 0x814b,
+  },
+  0xe4 => {
+    0x40 => 0x968b, 0x41 => 0x8146, 0x42 => 0x813e, 0x43 => 0x8153,
+    0x44 => 0x8151, 0x45 => 0x80fc, 0x46 => 0x8171, 0x47 => 0x816e,
+    0x48 => 0x8165, 0x49 => 0x8166, 0x4a => 0x8174, 0x4b => 0x8183,
+    0x4c => 0x8188, 0x4d => 0x818a, 0x4e => 0x8180, 0x4f => 0x8182,
+    0x50 => 0x81a0, 0x51 => 0x8195, 0x52 => 0x81a4, 0x53 => 0x81a3,
+    0x54 => 0x815f, 0x55 => 0x8193, 0x56 => 0x81a9, 0x57 => 0x81b0,
+    0x58 => 0x81b5, 0x59 => 0x81be, 0x5a => 0x81b8, 0x5b => 0x81bd,
+    0x5c => 0x81c0, 0x5d => 0x81c2, 0x5e => 0x81ba, 0x5f => 0x81c9,
+    0x60 => 0x81cd, 0x61 => 0x81d1, 0x62 => 0x81d9, 0x63 => 0x81d8,
+    0x64 => 0x81c8, 0x65 => 0x81da, 0x66 => 0x81df, 0x67 => 0x81e0,
+    0x68 => 0x81e7, 0x69 => 0x81fa, 0x6a => 0x81fb, 0x6b => 0x81fe,
+    0x6c => 0x8201, 0x6d => 0x8202, 0x6e => 0x8205, 0x6f => 0x8207,
+    0x70 => 0x820a, 0x71 => 0x820d, 0x72 => 0x8210, 0x73 => 0x8216,
+    0x74 => 0x8229, 0x75 => 0x822b, 0x76 => 0x8238, 0x77 => 0x8233,
+    0x78 => 0x8240, 0x79 => 0x8259, 0x7a => 0x8258, 0x7b => 0x825d,
+    0x7c => 0x825a, 0x7d => 0x825f, 0x7e => 0x8264, 0x80 => 0x8262,
+    0x81 => 0x8268, 0x82 => 0x826a, 0x83 => 0x826b, 0x84 => 0x822e,
+    0x85 => 0x8271, 0x86 => 0x8277, 0x87 => 0x8278, 0x88 => 0x827e,
+    0x89 => 0x828d, 0x8a => 0x8292, 0x8b => 0x82ab, 0x8c => 0x829f,
+    0x8d => 0x82bb, 0x8e => 0x82ac, 0x8f => 0x82e1, 0x90 => 0x82e3,
+    0x91 => 0x82df, 0x92 => 0x82d2, 0x93 => 0x82f4, 0x94 => 0x82f3,
+    0x95 => 0x82fa, 0x96 => 0x8393, 0x97 => 0x8303, 0x98 => 0x82fb,
+    0x99 => 0x82f9, 0x9a => 0x82de, 0x9b => 0x8306, 0x9c => 0x82dc,
+    0x9d => 0x8309, 0x9e => 0x82d9, 0x9f => 0x8335, 0xa0 => 0x8334,
+    0xa1 => 0x8316, 0xa2 => 0x8332, 0xa3 => 0x8331, 0xa4 => 0x8340,
+    0xa5 => 0x8339, 0xa6 => 0x8350, 0xa7 => 0x8345, 0xa8 => 0x832f,
+    0xa9 => 0x832b, 0xaa => 0x8317, 0xab => 0x8318, 0xac => 0x8385,
+    0xad => 0x839a, 0xae => 0x83aa, 0xaf => 0x839f, 0xb0 => 0x83a2,
+    0xb1 => 0x8396, 0xb2 => 0x8323, 0xb3 => 0x838e, 0xb4 => 0x8387,
+    0xb5 => 0x838a, 0xb6 => 0x837c, 0xb7 => 0x83b5, 0xb8 => 0x8373,
+    0xb9 => 0x8375, 0xba => 0x83a0, 0xbb => 0x8389, 0xbc => 0x83a8,
+    0xbd => 0x83f4, 0xbe => 0x8413, 0xbf => 0x83eb, 0xc0 => 0x83ce,
+    0xc1 => 0x83fd, 0xc2 => 0x8403, 0xc3 => 0x83d8, 0xc4 => 0x840b,
+    0xc5 => 0x83c1, 0xc6 => 0x83f7, 0xc7 => 0x8407, 0xc8 => 0x83e0,
+    0xc9 => 0x83f2, 0xca => 0x840d, 0xcb => 0x8422, 0xcc => 0x8420,
+    0xcd => 0x83bd, 0xce => 0x8438, 0xcf => 0x8506, 0xd0 => 0x83fb,
+    0xd1 => 0x846d, 0xd2 => 0x842a, 0xd3 => 0x843c, 0xd4 => 0x855a,
+    0xd5 => 0x8484, 0xd6 => 0x8477, 0xd7 => 0x846b, 0xd8 => 0x84ad,
+    0xd9 => 0x846e, 0xda => 0x8482, 0xdb => 0x8469, 0xdc => 0x8446,
+    0xdd => 0x842c, 0xde => 0x846f, 0xdf => 0x8479, 0xe0 => 0x8435,
+    0xe1 => 0x84ca, 0xe2 => 0x8462, 0xe3 => 0x84b9, 0xe4 => 0x84bf,
+    0xe5 => 0x849f, 0xe6 => 0x84d9, 0xe7 => 0x84cd, 0xe8 => 0x84bb,
+    0xe9 => 0x84da, 0xea => 0x84d0, 0xeb => 0x84c1, 0xec => 0x84c6,
+    0xed => 0x84d6, 0xee => 0x84a1, 0xef => 0x8521, 0xf0 => 0x84ff,
+    0xf1 => 0x84f4, 0xf2 => 0x8517, 0xf3 => 0x8518, 0xf4 => 0x852c,
+    0xf5 => 0x851f, 0xf6 => 0x8515, 0xf7 => 0x8514, 0xf8 => 0x84fc,
+    0xf9 => 0x8540, 0xfa => 0x8563, 0xfb => 0x8558, 0xfc => 0x8548,
+  },
+  0xe5 => {
+    0x40 => 0x8541, 0x41 => 0x8602, 0x42 => 0x854b, 0x43 => 0x8555,
+    0x44 => 0x8580, 0x45 => 0x85a4, 0x46 => 0x8588, 0x47 => 0x8591,
+    0x48 => 0x858a, 0x49 => 0x85a8, 0x4a => 0x856d, 0x4b => 0x8594,
+    0x4c => 0x859b, 0x4d => 0x85ea, 0x4e => 0x8587, 0x4f => 0x859c,
+    0x50 => 0x8577, 0x51 => 0x857e, 0x52 => 0x8590, 0x53 => 0x85c9,
+    0x54 => 0x85ba, 0x55 => 0x85cf, 0x56 => 0x85b9, 0x57 => 0x85d0,
+    0x58 => 0x85d5, 0x59 => 0x85dd, 0x5a => 0x85e5, 0x5b => 0x85dc,
+    0x5c => 0x85f9, 0x5d => 0x860a, 0x5e => 0x8613, 0x5f => 0x860b,
+    0x60 => 0x85fe, 0x61 => 0x85fa, 0x62 => 0x8606, 0x63 => 0x8622,
+    0x64 => 0x861a, 0x65 => 0x8630, 0x66 => 0x863f, 0x67 => 0x864d,
+    0x68 => 0x4e55, 0x69 => 0x8654, 0x6a => 0x865f, 0x6b => 0x8667,
+    0x6c => 0x8671, 0x6d => 0x8693, 0x6e => 0x86a3, 0x6f => 0x86a9,
+    0x70 => 0x86aa, 0x71 => 0x868b, 0x72 => 0x868c, 0x73 => 0x86b6,
+    0x74 => 0x86af, 0x75 => 0x86c4, 0x76 => 0x86c6, 0x77 => 0x86b0,
+    0x78 => 0x86c9, 0x79 => 0x8823, 0x7a => 0x86ab, 0x7b => 0x86d4,
+    0x7c => 0x86de, 0x7d => 0x86e9, 0x7e => 0x86ec, 0x80 => 0x86df,
+    0x81 => 0x86db, 0x82 => 0x86ef, 0x83 => 0x8712, 0x84 => 0x8706,
+    0x85 => 0x8708, 0x86 => 0x8700, 0x87 => 0x8703, 0x88 => 0x86fb,
+    0x89 => 0x8711, 0x8a => 0x8709, 0x8b => 0x870d, 0x8c => 0x86f9,
+    0x8d => 0x870a, 0x8e => 0x8734, 0x8f => 0x873f, 0x90 => 0x8737,
+    0x91 => 0x873b, 0x92 => 0x8725, 0x93 => 0x8729, 0x94 => 0x871a,
+    0x95 => 0x8760, 0x96 => 0x875f, 0x97 => 0x8778, 0x98 => 0x874c,
+    0x99 => 0x874e, 0x9a => 0x8774, 0x9b => 0x8757, 0x9c => 0x8768,
+    0x9d => 0x876e, 0x9e => 0x8759, 0x9f => 0x8753, 0xa0 => 0x8763,
+    0xa1 => 0x876a, 0xa2 => 0x8805, 0xa3 => 0x87a2, 0xa4 => 0x879f,
+    0xa5 => 0x8782, 0xa6 => 0x87af, 0xa7 => 0x87cb, 0xa8 => 0x87bd,
+    0xa9 => 0x87c0, 0xaa => 0x87d0, 0xab => 0x96d6, 0xac => 0x87ab,
+    0xad => 0x87c4, 0xae => 0x87b3, 0xaf => 0x87c7, 0xb0 => 0x87c6,
+    0xb1 => 0x87bb, 0xb2 => 0x87ef, 0xb3 => 0x87f2, 0xb4 => 0x87e0,
+    0xb5 => 0x880f, 0xb6 => 0x880d, 0xb7 => 0x87fe, 0xb8 => 0x87f6,
+    0xb9 => 0x87f7, 0xba => 0x880e, 0xbb => 0x87d2, 0xbc => 0x8811,
+    0xbd => 0x8816, 0xbe => 0x8815, 0xbf => 0x8822, 0xc0 => 0x8821,
+    0xc1 => 0x8831, 0xc2 => 0x8836, 0xc3 => 0x8839, 0xc4 => 0x8827,
+    0xc5 => 0x883b, 0xc6 => 0x8844, 0xc7 => 0x8842, 0xc8 => 0x8852,
+    0xc9 => 0x8859, 0xca => 0x885e, 0xcb => 0x8862, 0xcc => 0x886b,
+    0xcd => 0x8881, 0xce => 0x887e, 0xcf => 0x889e, 0xd0 => 0x8875,
+    0xd1 => 0x887d, 0xd2 => 0x88b5, 0xd3 => 0x8872, 0xd4 => 0x8882,
+    0xd5 => 0x8897, 0xd6 => 0x8892, 0xd7 => 0x88ae, 0xd8 => 0x8899,
+    0xd9 => 0x88a2, 0xda => 0x888d, 0xdb => 0x88a4, 0xdc => 0x88b0,
+    0xdd => 0x88bf, 0xde => 0x88b1, 0xdf => 0x88c3, 0xe0 => 0x88c4,
+    0xe1 => 0x88d4, 0xe2 => 0x88d8, 0xe3 => 0x88d9, 0xe4 => 0x88dd,
+    0xe5 => 0x88f9, 0xe6 => 0x8902, 0xe7 => 0x88fc, 0xe8 => 0x88f4,
+    0xe9 => 0x88e8, 0xea => 0x88f2, 0xeb => 0x8904, 0xec => 0x890c,
+    0xed => 0x890a, 0xee => 0x8913, 0xef => 0x8943, 0xf0 => 0x891e,
+    0xf1 => 0x8925, 0xf2 => 0x892a, 0xf3 => 0x892b, 0xf4 => 0x8941,
+    0xf5 => 0x8944, 0xf6 => 0x893b, 0xf7 => 0x8936, 0xf8 => 0x8938,
+    0xf9 => 0x894c, 0xfa => 0x891d, 0xfb => 0x8960, 0xfc => 0x895e,
+  },
+  0xe6 => {
+    0x40 => 0x8966, 0x41 => 0x8964, 0x42 => 0x896d, 0x43 => 0x896a,
+    0x44 => 0x896f, 0x45 => 0x8974, 0x46 => 0x8977, 0x47 => 0x897e,
+    0x48 => 0x8983, 0x49 => 0x8988, 0x4a => 0x898a, 0x4b => 0x8993,
+    0x4c => 0x8998, 0x4d => 0x89a1, 0x4e => 0x89a9, 0x4f => 0x89a6,
+    0x50 => 0x89ac, 0x51 => 0x89af, 0x52 => 0x89b2, 0x53 => 0x89ba,
+    0x54 => 0x89bd, 0x55 => 0x89bf, 0x56 => 0x89c0, 0x57 => 0x89da,
+    0x58 => 0x89dc, 0x59 => 0x89dd, 0x5a => 0x89e7, 0x5b => 0x89f4,
+    0x5c => 0x89f8, 0x5d => 0x8a03, 0x5e => 0x8a16, 0x5f => 0x8a10,
+    0x60 => 0x8a0c, 0x61 => 0x8a1b, 0x62 => 0x8a1d, 0x63 => 0x8a25,
+    0x64 => 0x8a36, 0x65 => 0x8a41, 0x66 => 0x8a5b, 0x67 => 0x8a52,
+    0x68 => 0x8a46, 0x69 => 0x8a48, 0x6a => 0x8a7c, 0x6b => 0x8a6d,
+    0x6c => 0x8a6c, 0x6d => 0x8a62, 0x6e => 0x8a85, 0x6f => 0x8a82,
+    0x70 => 0x8a84, 0x71 => 0x8aa8, 0x72 => 0x8aa1, 0x73 => 0x8a91,
+    0x74 => 0x8aa5, 0x75 => 0x8aa6, 0x76 => 0x8a9a, 0x77 => 0x8aa3,
+    0x78 => 0x8ac4, 0x79 => 0x8acd, 0x7a => 0x8ac2, 0x7b => 0x8ada,
+    0x7c => 0x8aeb, 0x7d => 0x8af3, 0x7e => 0x8ae7, 0x80 => 0x8ae4,
+    0x81 => 0x8af1, 0x82 => 0x8b14, 0x83 => 0x8ae0, 0x84 => 0x8ae2,
+    0x85 => 0x8af7, 0x86 => 0x8ade, 0x87 => 0x8adb, 0x88 => 0x8b0c,
+    0x89 => 0x8b07, 0x8a => 0x8b1a, 0x8b => 0x8ae1, 0x8c => 0x8b16,
+    0x8d => 0x8b10, 0x8e => 0x8b17, 0x8f => 0x8b20, 0x90 => 0x8b33,
+    0x91 => 0x97ab, 0x92 => 0x8b26, 0x93 => 0x8b2b, 0x94 => 0x8b3e,
+    0x95 => 0x8b28, 0x96 => 0x8b41, 0x97 => 0x8b4c, 0x98 => 0x8b4f,
+    0x99 => 0x8b4e, 0x9a => 0x8b49, 0x9b => 0x8b56, 0x9c => 0x8b5b,
+    0x9d => 0x8b5a, 0x9e => 0x8b6b, 0x9f => 0x8b5f, 0xa0 => 0x8b6c,
+    0xa1 => 0x8b6f, 0xa2 => 0x8b74, 0xa3 => 0x8b7d, 0xa4 => 0x8b80,
+    0xa5 => 0x8b8c, 0xa6 => 0x8b8e, 0xa7 => 0x8b92, 0xa8 => 0x8b93,
+    0xa9 => 0x8b96, 0xaa => 0x8b99, 0xab => 0x8b9a, 0xac => 0x8c3a,
+    0xad => 0x8c41, 0xae => 0x8c3f, 0xaf => 0x8c48, 0xb0 => 0x8c4c,
+    0xb1 => 0x8c4e, 0xb2 => 0x8c50, 0xb3 => 0x8c55, 0xb4 => 0x8c62,
+    0xb5 => 0x8c6c, 0xb6 => 0x8c78, 0xb7 => 0x8c7a, 0xb8 => 0x8c82,
+    0xb9 => 0x8c89, 0xba => 0x8c85, 0xbb => 0x8c8a, 0xbc => 0x8c8d,
+    0xbd => 0x8c8e, 0xbe => 0x8c94, 0xbf => 0x8c7c, 0xc0 => 0x8c98,
+    0xc1 => 0x621d, 0xc2 => 0x8cad, 0xc3 => 0x8caa, 0xc4 => 0x8cbd,
+    0xc5 => 0x8cb2, 0xc6 => 0x8cb3, 0xc7 => 0x8cae, 0xc8 => 0x8cb6,
+    0xc9 => 0x8cc8, 0xca => 0x8cc1, 0xcb => 0x8ce4, 0xcc => 0x8ce3,
+    0xcd => 0x8cda, 0xce => 0x8cfd, 0xcf => 0x8cfa, 0xd0 => 0x8cfb,
+    0xd1 => 0x8d04, 0xd2 => 0x8d05, 0xd3 => 0x8d0a, 0xd4 => 0x8d07,
+    0xd5 => 0x8d0f, 0xd6 => 0x8d0d, 0xd7 => 0x8d10, 0xd8 => 0x9f4e,
+    0xd9 => 0x8d13, 0xda => 0x8ccd, 0xdb => 0x8d14, 0xdc => 0x8d16,
+    0xdd => 0x8d67, 0xde => 0x8d6d, 0xdf => 0x8d71, 0xe0 => 0x8d73,
+    0xe1 => 0x8d81, 0xe2 => 0x8d99, 0xe3 => 0x8dc2, 0xe4 => 0x8dbe,
+    0xe5 => 0x8dba, 0xe6 => 0x8dcf, 0xe7 => 0x8dda, 0xe8 => 0x8dd6,
+    0xe9 => 0x8dcc, 0xea => 0x8ddb, 0xeb => 0x8dcb, 0xec => 0x8dea,
+    0xed => 0x8deb, 0xee => 0x8ddf, 0xef => 0x8de3, 0xf0 => 0x8dfc,
+    0xf1 => 0x8e08, 0xf2 => 0x8e09, 0xf3 => 0x8dff, 0xf4 => 0x8e1d,
+    0xf5 => 0x8e1e, 0xf6 => 0x8e10, 0xf7 => 0x8e1f, 0xf8 => 0x8e42,
+    0xf9 => 0x8e35, 0xfa => 0x8e30, 0xfb => 0x8e34, 0xfc => 0x8e4a,
+  },
+  0xe7 => {
+    0x40 => 0x8e47, 0x41 => 0x8e49, 0x42 => 0x8e4c, 0x43 => 0x8e50,
+    0x44 => 0x8e48, 0x45 => 0x8e59, 0x46 => 0x8e64, 0x47 => 0x8e60,
+    0x48 => 0x8e2a, 0x49 => 0x8e63, 0x4a => 0x8e55, 0x4b => 0x8e76,
+    0x4c => 0x8e72, 0x4d => 0x8e7c, 0x4e => 0x8e81, 0x4f => 0x8e87,
+    0x50 => 0x8e85, 0x51 => 0x8e84, 0x52 => 0x8e8b, 0x53 => 0x8e8a,
+    0x54 => 0x8e93, 0x55 => 0x8e91, 0x56 => 0x8e94, 0x57 => 0x8e99,
+    0x58 => 0x8eaa, 0x59 => 0x8ea1, 0x5a => 0x8eac, 0x5b => 0x8eb0,
+    0x5c => 0x8ec6, 0x5d => 0x8eb1, 0x5e => 0x8ebe, 0x5f => 0x8ec5,
+    0x60 => 0x8ec8, 0x61 => 0x8ecb, 0x62 => 0x8edb, 0x63 => 0x8ee3,
+    0x64 => 0x8efc, 0x65 => 0x8efb, 0x66 => 0x8eeb, 0x67 => 0x8efe,
+    0x68 => 0x8f0a, 0x69 => 0x8f05, 0x6a => 0x8f15, 0x6b => 0x8f12,
+    0x6c => 0x8f19, 0x6d => 0x8f13, 0x6e => 0x8f1c, 0x6f => 0x8f1f,
+    0x70 => 0x8f1b, 0x71 => 0x8f0c, 0x72 => 0x8f26, 0x73 => 0x8f33,
+    0x74 => 0x8f3b, 0x75 => 0x8f39, 0x76 => 0x8f45, 0x77 => 0x8f42,
+    0x78 => 0x8f3e, 0x79 => 0x8f4c, 0x7a => 0x8f49, 0x7b => 0x8f46,
+    0x7c => 0x8f4e, 0x7d => 0x8f57, 0x7e => 0x8f5c, 0x80 => 0x8f62,
+    0x81 => 0x8f63, 0x82 => 0x8f64, 0x83 => 0x8f9c, 0x84 => 0x8f9f,
+    0x85 => 0x8fa3, 0x86 => 0x8fad, 0x87 => 0x8faf, 0x88 => 0x8fb7,
+    0x89 => 0x8fda, 0x8a => 0x8fe5, 0x8b => 0x8fe2, 0x8c => 0x8fea,
+    0x8d => 0x8fef, 0x8e => 0x9087, 0x8f => 0x8ff4, 0x90 => 0x9005,
+    0x91 => 0x8ff9, 0x92 => 0x8ffa, 0x93 => 0x9011, 0x94 => 0x9015,
+    0x95 => 0x9021, 0x96 => 0x900d, 0x97 => 0x901e, 0x98 => 0x9016,
+    0x99 => 0x900b, 0x9a => 0x9027, 0x9b => 0x9036, 0x9c => 0x9035,
+    0x9d => 0x9039, 0x9e => 0x8ff8, 0x9f => 0x904f, 0xa0 => 0x9050,
+    0xa1 => 0x9051, 0xa2 => 0x9052, 0xa3 => 0x900e, 0xa4 => 0x9049,
+    0xa5 => 0x903e, 0xa6 => 0x9056, 0xa7 => 0x9058, 0xa8 => 0x905e,
+    0xa9 => 0x9068, 0xaa => 0x906f, 0xab => 0x9076, 0xac => 0x96a8,
+    0xad => 0x9072, 0xae => 0x9082, 0xaf => 0x907d, 0xb0 => 0x9081,
+    0xb1 => 0x9080, 0xb2 => 0x908a, 0xb3 => 0x9089, 0xb4 => 0x908f,
+    0xb5 => 0x90a8, 0xb6 => 0x90af, 0xb7 => 0x90b1, 0xb8 => 0x90b5,
+    0xb9 => 0x90e2, 0xba => 0x90e4, 0xbb => 0x6248, 0xbc => 0x90db,
+    0xbd => 0x9102, 0xbe => 0x9112, 0xbf => 0x9119, 0xc0 => 0x9132,
+    0xc1 => 0x9130, 0xc2 => 0x914a, 0xc3 => 0x9156, 0xc4 => 0x9158,
+    0xc5 => 0x9163, 0xc6 => 0x9165, 0xc7 => 0x9169, 0xc8 => 0x9173,
+    0xc9 => 0x9172, 0xca => 0x918b, 0xcb => 0x9189, 0xcc => 0x9182,
+    0xcd => 0x91a2, 0xce => 0x91ab, 0xcf => 0x91af, 0xd0 => 0x91aa,
+    0xd1 => 0x91b5, 0xd2 => 0x91b4, 0xd3 => 0x91ba, 0xd4 => 0x91c0,
+    0xd5 => 0x91c1, 0xd6 => 0x91c9, 0xd7 => 0x91cb, 0xd8 => 0x91d0,
+    0xd9 => 0x91d6, 0xda => 0x91df, 0xdb => 0x91e1, 0xdc => 0x91db,
+    0xdd => 0x91fc, 0xde => 0x91f5, 0xdf => 0x91f6, 0xe0 => 0x921e,
+    0xe1 => 0x91ff, 0xe2 => 0x9214, 0xe3 => 0x922c, 0xe4 => 0x9215,
+    0xe5 => 0x9211, 0xe6 => 0x925e, 0xe7 => 0x9257, 0xe8 => 0x9245,
+    0xe9 => 0x9249, 0xea => 0x9264, 0xeb => 0x9248, 0xec => 0x9295,
+    0xed => 0x923f, 0xee => 0x924b, 0xef => 0x9250, 0xf0 => 0x929c,
+    0xf1 => 0x9296, 0xf2 => 0x9293, 0xf3 => 0x929b, 0xf4 => 0x925a,
+    0xf5 => 0x92cf, 0xf6 => 0x92b9, 0xf7 => 0x92b7, 0xf8 => 0x92e9,
+    0xf9 => 0x930f, 0xfa => 0x92fa, 0xfb => 0x9344, 0xfc => 0x932e,
+  },
+  0xe8 => {
+    0x40 => 0x9319, 0x41 => 0x9322, 0x42 => 0x931a, 0x43 => 0x9323,
+    0x44 => 0x933a, 0x45 => 0x9335, 0x46 => 0x933b, 0x47 => 0x935c,
+    0x48 => 0x9360, 0x49 => 0x937c, 0x4a => 0x936e, 0x4b => 0x9356,
+    0x4c => 0x93b0, 0x4d => 0x93ac, 0x4e => 0x93ad, 0x4f => 0x9394,
+    0x50 => 0x93b9, 0x51 => 0x93d6, 0x52 => 0x93d7, 0x53 => 0x93e8,
+    0x54 => 0x93e5, 0x55 => 0x93d8, 0x56 => 0x93c3, 0x57 => 0x93dd,
+    0x58 => 0x93d0, 0x59 => 0x93c8, 0x5a => 0x93e4, 0x5b => 0x941a,
+    0x5c => 0x9414, 0x5d => 0x9413, 0x5e => 0x9403, 0x5f => 0x9407,
+    0x60 => 0x9410, 0x61 => 0x9436, 0x62 => 0x942b, 0x63 => 0x9435,
+    0x64 => 0x9421, 0x65 => 0x943a, 0x66 => 0x9441, 0x67 => 0x9452,
+    0x68 => 0x9444, 0x69 => 0x945b, 0x6a => 0x9460, 0x6b => 0x9462,
+    0x6c => 0x945e, 0x6d => 0x946a, 0x6e => 0x9229, 0x6f => 0x9470,
+    0x70 => 0x9475, 0x71 => 0x9477, 0x72 => 0x947d, 0x73 => 0x945a,
+    0x74 => 0x947c, 0x75 => 0x947e, 0x76 => 0x9481, 0x77 => 0x947f,
+    0x78 => 0x9582, 0x79 => 0x9587, 0x7a => 0x958a, 0x7b => 0x9594,
+    0x7c => 0x9596, 0x7d => 0x9598, 0x7e => 0x9599, 0x80 => 0x95a0,
+    0x81 => 0x95a8, 0x82 => 0x95a7, 0x83 => 0x95ad, 0x84 => 0x95bc,
+    0x85 => 0x95bb, 0x86 => 0x95b9, 0x87 => 0x95be, 0x88 => 0x95ca,
+    0x89 => 0x6ff6, 0x8a => 0x95c3, 0x8b => 0x95cd, 0x8c => 0x95cc,
+    0x8d => 0x95d5, 0x8e => 0x95d4, 0x8f => 0x95d6, 0x90 => 0x95dc,
+    0x91 => 0x95e1, 0x92 => 0x95e5, 0x93 => 0x95e2, 0x94 => 0x9621,
+    0x95 => 0x9628, 0x96 => 0x962e, 0x97 => 0x962f, 0x98 => 0x9642,
+    0x99 => 0x964c, 0x9a => 0x964f, 0x9b => 0x964b, 0x9c => 0x9677,
+    0x9d => 0x965c, 0x9e => 0x965e, 0x9f => 0x965d, 0xa0 => 0x965f,
+    0xa1 => 0x9666, 0xa2 => 0x9672, 0xa3 => 0x966c, 0xa4 => 0x968d,
+    0xa5 => 0x9698, 0xa6 => 0x9695, 0xa7 => 0x9697, 0xa8 => 0x96aa,
+    0xa9 => 0x96a7, 0xaa => 0x96b1, 0xab => 0x96b2, 0xac => 0x96b0,
+    0xad => 0x96b4, 0xae => 0x96b6, 0xaf => 0x96b8, 0xb0 => 0x96b9,
+    0xb1 => 0x96ce, 0xb2 => 0x96cb, 0xb3 => 0x96c9, 0xb4 => 0x96cd,
+    0xb5 => 0x894d, 0xb6 => 0x96dc, 0xb7 => 0x970d, 0xb8 => 0x96d5,
+    0xb9 => 0x96f9, 0xba => 0x9704, 0xbb => 0x9706, 0xbc => 0x9708,
+    0xbd => 0x9713, 0xbe => 0x970e, 0xbf => 0x9711, 0xc0 => 0x970f,
+    0xc1 => 0x9716, 0xc2 => 0x9719, 0xc3 => 0x9724, 0xc4 => 0x972a,
+    0xc5 => 0x9730, 0xc6 => 0x9739, 0xc7 => 0x973d, 0xc8 => 0x973e,
+    0xc9 => 0x9744, 0xca => 0x9746, 0xcb => 0x9748, 0xcc => 0x9742,
+    0xcd => 0x9749, 0xce => 0x975c, 0xcf => 0x9760, 0xd0 => 0x9764,
+    0xd1 => 0x9766, 0xd2 => 0x9768, 0xd3 => 0x52d2, 0xd4 => 0x976b,
+    0xd5 => 0x9771, 0xd6 => 0x9779, 0xd7 => 0x9785, 0xd8 => 0x977c,
+    0xd9 => 0x9781, 0xda => 0x977a, 0xdb => 0x9786, 0xdc => 0x978b,
+    0xdd => 0x978f, 0xde => 0x9790, 0xdf => 0x979c, 0xe0 => 0x97a8,
+    0xe1 => 0x97a6, 0xe2 => 0x97a3, 0xe3 => 0x97b3, 0xe4 => 0x97b4,
+    0xe5 => 0x97c3, 0xe6 => 0x97c6, 0xe7 => 0x97c8, 0xe8 => 0x97cb,
+    0xe9 => 0x97dc, 0xea => 0x97ed, 0xeb => 0x9f4f, 0xec => 0x97f2,
+    0xed => 0x7adf, 0xee => 0x97f6, 0xef => 0x97f5, 0xf0 => 0x980f,
+    0xf1 => 0x980c, 0xf2 => 0x9838, 0xf3 => 0x9824, 0xf4 => 0x9821,
+    0xf5 => 0x9837, 0xf6 => 0x983d, 0xf7 => 0x9846, 0xf8 => 0x984f,
+    0xf9 => 0x984b, 0xfa => 0x986b, 0xfb => 0x986f, 0xfc => 0x9870,
+  },
+  0xe9 => {
+    0x40 => 0x9871, 0x41 => 0x9874, 0x42 => 0x9873, 0x43 => 0x98aa,
+    0x44 => 0x98af, 0x45 => 0x98b1, 0x46 => 0x98b6, 0x47 => 0x98c4,
+    0x48 => 0x98c3, 0x49 => 0x98c6, 0x4a => 0x98e9, 0x4b => 0x98eb,
+    0x4c => 0x9903, 0x4d => 0x9909, 0x4e => 0x9912, 0x4f => 0x9914,
+    0x50 => 0x9918, 0x51 => 0x9921, 0x52 => 0x991d, 0x53 => 0x991e,
+    0x54 => 0x9924, 0x55 => 0x9920, 0x56 => 0x992c, 0x57 => 0x992e,
+    0x58 => 0x993d, 0x59 => 0x993e, 0x5a => 0x9942, 0x5b => 0x9949,
+    0x5c => 0x9945, 0x5d => 0x9950, 0x5e => 0x994b, 0x5f => 0x9951,
+    0x60 => 0x9952, 0x61 => 0x994c, 0x62 => 0x9955, 0x63 => 0x9997,
+    0x64 => 0x9998, 0x65 => 0x99a5, 0x66 => 0x99ad, 0x67 => 0x99ae,
+    0x68 => 0x99bc, 0x69 => 0x99df, 0x6a => 0x99db, 0x6b => 0x99dd,
+    0x6c => 0x99d8, 0x6d => 0x99d1, 0x6e => 0x99ed, 0x6f => 0x99ee,
+    0x70 => 0x99f1, 0x71 => 0x99f2, 0x72 => 0x99fb, 0x73 => 0x99f8,
+    0x74 => 0x9a01, 0x75 => 0x9a0f, 0x76 => 0x9a05, 0x77 => 0x99e2,
+    0x78 => 0x9a19, 0x79 => 0x9a2b, 0x7a => 0x9a37, 0x7b => 0x9a45,
+    0x7c => 0x9a42, 0x7d => 0x9a40, 0x7e => 0x9a43, 0x80 => 0x9a3e,
+    0x81 => 0x9a55, 0x82 => 0x9a4d, 0x83 => 0x9a5b, 0x84 => 0x9a57,
+    0x85 => 0x9a5f, 0x86 => 0x9a62, 0x87 => 0x9a65, 0x88 => 0x9a64,
+    0x89 => 0x9a69, 0x8a => 0x9a6b, 0x8b => 0x9a6a, 0x8c => 0x9aad,
+    0x8d => 0x9ab0, 0x8e => 0x9abc, 0x8f => 0x9ac0, 0x90 => 0x9acf,
+    0x91 => 0x9ad1, 0x92 => 0x9ad3, 0x93 => 0x9ad4, 0x94 => 0x9ade,
+    0x95 => 0x9adf, 0x96 => 0x9ae2, 0x97 => 0x9ae3, 0x98 => 0x9ae6,
+    0x99 => 0x9aef, 0x9a => 0x9aeb, 0x9b => 0x9aee, 0x9c => 0x9af4,
+    0x9d => 0x9af1, 0x9e => 0x9af7, 0x9f => 0x9afb, 0xa0 => 0x9b06,
+    0xa1 => 0x9b18, 0xa2 => 0x9b1a, 0xa3 => 0x9b1f, 0xa4 => 0x9b22,
+    0xa5 => 0x9b23, 0xa6 => 0x9b25, 0xa7 => 0x9b27, 0xa8 => 0x9b28,
+    0xa9 => 0x9b29, 0xaa => 0x9b2a, 0xab => 0x9b2e, 0xac => 0x9b2f,
+    0xad => 0x9b32, 0xae => 0x9b44, 0xaf => 0x9b43, 0xb0 => 0x9b4f,
+    0xb1 => 0x9b4d, 0xb2 => 0x9b4e, 0xb3 => 0x9b51, 0xb4 => 0x9b58,
+    0xb5 => 0x9b74, 0xb6 => 0x9b93, 0xb7 => 0x9b83, 0xb8 => 0x9b91,
+    0xb9 => 0x9b96, 0xba => 0x9b97, 0xbb => 0x9b9f, 0xbc => 0x9ba0,
+    0xbd => 0x9ba8, 0xbe => 0x9bb4, 0xbf => 0x9bc0, 0xc0 => 0x9bca,
+    0xc1 => 0x9bb9, 0xc2 => 0x9bc6, 0xc3 => 0x9bcf, 0xc4 => 0x9bd1,
+    0xc5 => 0x9bd2, 0xc6 => 0x9be3, 0xc7 => 0x9be2, 0xc8 => 0x9be4,
+    0xc9 => 0x9bd4, 0xca => 0x9be1, 0xcb => 0x9c3a, 0xcc => 0x9bf2,
+    0xcd => 0x9bf1, 0xce => 0x9bf0, 0xcf => 0x9c15, 0xd0 => 0x9c14,
+    0xd1 => 0x9c09, 0xd2 => 0x9c13, 0xd3 => 0x9c0c, 0xd4 => 0x9c06,
+    0xd5 => 0x9c08, 0xd6 => 0x9c12, 0xd7 => 0x9c0a, 0xd8 => 0x9c04,
+    0xd9 => 0x9c2e, 0xda => 0x9c1b, 0xdb => 0x9c25, 0xdc => 0x9c24,
+    0xdd => 0x9c21, 0xde => 0x9c30, 0xdf => 0x9c47, 0xe0 => 0x9c32,
+    0xe1 => 0x9c46, 0xe2 => 0x9c3e, 0xe3 => 0x9c5a, 0xe4 => 0x9c60,
+    0xe5 => 0x9c67, 0xe6 => 0x9c76, 0xe7 => 0x9c78, 0xe8 => 0x9ce7,
+    0xe9 => 0x9cec, 0xea => 0x9cf0, 0xeb => 0x9d09, 0xec => 0x9d08,
+    0xed => 0x9ceb, 0xee => 0x9d03, 0xef => 0x9d06, 0xf0 => 0x9d2a,
+    0xf1 => 0x9d26, 0xf2 => 0x9daf, 0xf3 => 0x9d23, 0xf4 => 0x9d1f,
+    0xf5 => 0x9d44, 0xf6 => 0x9d15, 0xf7 => 0x9d12, 0xf8 => 0x9d41,
+    0xf9 => 0x9d3f, 0xfa => 0x9d3e, 0xfb => 0x9d46, 0xfc => 0x9d48,
+  },
+  0xea => {
+    0x40 => 0x9d5d, 0x41 => 0x9d5e, 0x42 => 0x9d64, 0x43 => 0x9d51,
+    0x44 => 0x9d50, 0x45 => 0x9d59, 0x46 => 0x9d72, 0x47 => 0x9d89,
+    0x48 => 0x9d87, 0x49 => 0x9dab, 0x4a => 0x9d6f, 0x4b => 0x9d7a,
+    0x4c => 0x9d9a, 0x4d => 0x9da4, 0x4e => 0x9da9, 0x4f => 0x9db2,
+    0x50 => 0x9dc4, 0x51 => 0x9dc1, 0x52 => 0x9dbb, 0x53 => 0x9db8,
+    0x54 => 0x9dba, 0x55 => 0x9dc6, 0x56 => 0x9dcf, 0x57 => 0x9dc2,
+    0x58 => 0x9dd9, 0x59 => 0x9dd3, 0x5a => 0x9df8, 0x5b => 0x9de6,
+    0x5c => 0x9ded, 0x5d => 0x9def, 0x5e => 0x9dfd, 0x5f => 0x9e1a,
+    0x60 => 0x9e1b, 0x61 => 0x9e1e, 0x62 => 0x9e75, 0x63 => 0x9e79,
+    0x64 => 0x9e7d, 0x65 => 0x9e81, 0x66 => 0x9e88, 0x67 => 0x9e8b,
+    0x68 => 0x9e8c, 0x69 => 0x9e92, 0x6a => 0x9e95, 0x6b => 0x9e91,
+    0x6c => 0x9e9d, 0x6d => 0x9ea5, 0x6e => 0x9ea9, 0x6f => 0x9eb8,
+    0x70 => 0x9eaa, 0x71 => 0x9ead, 0x72 => 0x9761, 0x73 => 0x9ecc,
+    0x74 => 0x9ece, 0x75 => 0x9ecf, 0x76 => 0x9ed0, 0x77 => 0x9ed4,
+    0x78 => 0x9edc, 0x79 => 0x9ede, 0x7a => 0x9edd, 0x7b => 0x9ee0,
+    0x7c => 0x9ee5, 0x7d => 0x9ee8, 0x7e => 0x9eef, 0x80 => 0x9ef4,
+    0x81 => 0x9ef6, 0x82 => 0x9ef7, 0x83 => 0x9ef9, 0x84 => 0x9efb,
+    0x85 => 0x9efc, 0x86 => 0x9efd, 0x87 => 0x9f07, 0x88 => 0x9f08,
+    0x89 => 0x76b7, 0x8a => 0x9f15, 0x8b => 0x9f21, 0x8c => 0x9f2c,
+    0x8d => 0x9f3e, 0x8e => 0x9f4a, 0x8f => 0x9f52, 0x90 => 0x9f54,
+    0x91 => 0x9f63, 0x92 => 0x9f5f, 0x93 => 0x9f60, 0x94 => 0x9f61,
+    0x95 => 0x9f66, 0x96 => 0x9f67, 0x97 => 0x9f6c, 0x98 => 0x9f6a,
+    0x99 => 0x9f77, 0x9a => 0x9f72, 0x9b => 0x9f76, 0x9c => 0x9f95,
+    0x9d => 0x9f9c, 0x9e => 0x9fa0, 0x9f => 0x582f, 0xa0 => 0x69c7,
+    0xa1 => 0x9059, 0xa2 => 0x7464, 0xa3 => 0x51dc, 0xa4 => 0x7199,
+  },
+);
+
+1; # end
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/Symbol.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/Symbol.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/Symbol.pm	(revision 24799)
@@ -0,0 +1,54 @@
+#------------------------------------------------------------------------------
+# File:         Symbol.pm
+#
+# Description:  Symbol to Unicode
+#
+# Revisions:    2010/01/20 - P. Harvey created
+#
+# References:   1) http://blogs.msdn.com/michkap/archive/2005/11/08/490495.aspx
+#
+# Notes:        The table omits 1-byte characters with the same values as Unicode.
+#               This set re-maps characters with codepoints less than 0x80
+#               (Although all bytes >= 0x20 should be mapped according to the
+#               reference, I didn't map chars below 0x80 because I have some
+#               samples where these are regular ASCII characters, even though
+#               I think the encoding is probably incorrect for these samples)
+#------------------------------------------------------------------------------
+use strict;
+
+%Image::ExifTool::Charset::Symbol = (
+  0x80 => 0xf080, 0x81 => 0xf081, 0x82 => 0xf082, 0x83 => 0xf083,
+  0x84 => 0xf084, 0x85 => 0xf085, 0x86 => 0xf086, 0x87 => 0xf087,
+  0x88 => 0xf088, 0x89 => 0xf089, 0x8a => 0xf08a, 0x8b => 0xf08b,
+  0x8c => 0xf08c, 0x8d => 0xf08d, 0x8e => 0xf08e, 0x8f => 0xf08f,
+  0x90 => 0xf090, 0x91 => 0xf091, 0x92 => 0xf092, 0x93 => 0xf093,
+  0x94 => 0xf094, 0x95 => 0xf095, 0x96 => 0xf096, 0x97 => 0xf097,
+  0x98 => 0xf098, 0x99 => 0xf099, 0x9a => 0xf09a, 0x9b => 0xf09b,
+  0x9c => 0xf09c, 0x9d => 0xf09d, 0x9e => 0xf09e, 0x9f => 0xf09f,
+  0xa0 => 0xf0a0, 0xa1 => 0xf0a1, 0xa2 => 0xf0a2, 0xa3 => 0xf0a3,
+  0xa4 => 0xf0a4, 0xa5 => 0xf0a5, 0xa6 => 0xf0a6, 0xa7 => 0xf0a7,
+  0xa8 => 0xf0a8, 0xa9 => 0xf0a9, 0xaa => 0xf0aa, 0xab => 0xf0ab,
+  0xac => 0xf0ac, 0xad => 0xf0ad, 0xae => 0xf0ae, 0xaf => 0xf0af,
+  0xb0 => 0xf0b0, 0xb1 => 0xf0b1, 0xb2 => 0xf0b2, 0xb3 => 0xf0b3,
+  0xb4 => 0xf0b4, 0xb5 => 0xf0b5, 0xb6 => 0xf0b6, 0xb7 => 0xf0b7,
+  0xb8 => 0xf0b8, 0xb9 => 0xf0b9, 0xba => 0xf0ba, 0xbb => 0xf0bb,
+  0xbc => 0xf0bc, 0xbd => 0xf0bd, 0xbe => 0xf0be, 0xbf => 0xf0bf,
+  0xc0 => 0xf0c0, 0xc1 => 0xf0c1, 0xc2 => 0xf0c2, 0xc3 => 0xf0c3,
+  0xc4 => 0xf0c4, 0xc5 => 0xf0c5, 0xc6 => 0xf0c6, 0xc7 => 0xf0c7,
+  0xc8 => 0xf0c8, 0xc9 => 0xf0c9, 0xca => 0xf0ca, 0xcb => 0xf0cb,
+  0xcc => 0xf0cc, 0xcd => 0xf0cd, 0xce => 0xf0ce, 0xcf => 0xf0cf,
+  0xd0 => 0xf0d0, 0xd1 => 0xf0d1, 0xd2 => 0xf0d2, 0xd3 => 0xf0d3,
+  0xd4 => 0xf0d4, 0xd5 => 0xf0d5, 0xd6 => 0xf0d6, 0xd7 => 0xf0d7,
+  0xd8 => 0xf0d8, 0xd9 => 0xf0d9, 0xda => 0xf0da, 0xdb => 0xf0db,
+  0xdc => 0xf0dc, 0xdd => 0xf0dd, 0xde => 0xf0de, 0xdf => 0xf0df,
+  0xe0 => 0xf0e0, 0xe1 => 0xf0e1, 0xe2 => 0xf0e2, 0xe3 => 0xf0e3,
+  0xe4 => 0xf0e4, 0xe5 => 0xf0e5, 0xe6 => 0xf0e6, 0xe7 => 0xf0e7,
+  0xe8 => 0xf0e8, 0xe9 => 0xf0e9, 0xea => 0xf0ea, 0xeb => 0xf0eb,
+  0xec => 0xf0ec, 0xed => 0xf0ed, 0xee => 0xf0ee, 0xef => 0xf0ef,
+  0xf0 => 0xf0f0, 0xf1 => 0xf0f1, 0xf2 => 0xf0f2, 0xf3 => 0xf0f3,
+  0xf4 => 0xf0f4, 0xf5 => 0xf0f5, 0xf6 => 0xf0f6, 0xf7 => 0xf0f7,
+  0xf8 => 0xf0f8, 0xf9 => 0xf0f9, 0xfa => 0xf0fa, 0xfb => 0xf0fb,
+  0xfc => 0xf0fc, 0xfd => 0xf0fd, 0xfe => 0xf0fe, 0xff => 0xf0ff,
+);
+
+1; # end
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/Thai.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/Thai.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/Thai.pm	(revision 24799)
@@ -0,0 +1,41 @@
+#------------------------------------------------------------------------------
+# File:         Thai.pm
+#
+# Description:  cp874 to Unicode
+#
+# Revisions:    2010/01/20 - P. Harvey created
+#
+# References:   1) http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP874.TXT
+#
+# Notes:        The table omits 1-byte characters with the same values as Unicode
+#------------------------------------------------------------------------------
+use strict;
+
+%Image::ExifTool::Charset::Thai = (
+  0x80 => 0x20ac, 0x85 => 0x2026, 0x91 => 0x2018, 0x92 => 0x2019,
+  0x93 => 0x201c, 0x94 => 0x201d, 0x95 => 0x2022, 0x96 => 0x2013,
+  0x97 => 0x2014, 0xa1 => 0x0e01, 0xa2 => 0x0e02, 0xa3 => 0x0e03,
+  0xa4 => 0x0e04, 0xa5 => 0x0e05, 0xa6 => 0x0e06, 0xa7 => 0x0e07,
+  0xa8 => 0x0e08, 0xa9 => 0x0e09, 0xaa => 0x0e0a, 0xab => 0x0e0b,
+  0xac => 0x0e0c, 0xad => 0x0e0d, 0xae => 0x0e0e, 0xaf => 0x0e0f,
+  0xb0 => 0x0e10, 0xb1 => 0x0e11, 0xb2 => 0x0e12, 0xb3 => 0x0e13,
+  0xb4 => 0x0e14, 0xb5 => 0x0e15, 0xb6 => 0x0e16, 0xb7 => 0x0e17,
+  0xb8 => 0x0e18, 0xb9 => 0x0e19, 0xba => 0x0e1a, 0xbb => 0x0e1b,
+  0xbc => 0x0e1c, 0xbd => 0x0e1d, 0xbe => 0x0e1e, 0xbf => 0x0e1f,
+  0xc0 => 0x0e20, 0xc1 => 0x0e21, 0xc2 => 0x0e22, 0xc3 => 0x0e23,
+  0xc4 => 0x0e24, 0xc5 => 0x0e25, 0xc6 => 0x0e26, 0xc7 => 0x0e27,
+  0xc8 => 0x0e28, 0xc9 => 0x0e29, 0xca => 0x0e2a, 0xcb => 0x0e2b,
+  0xcc => 0x0e2c, 0xcd => 0x0e2d, 0xce => 0x0e2e, 0xcf => 0x0e2f,
+  0xd0 => 0x0e30, 0xd1 => 0x0e31, 0xd2 => 0x0e32, 0xd3 => 0x0e33,
+  0xd4 => 0x0e34, 0xd5 => 0x0e35, 0xd6 => 0x0e36, 0xd7 => 0x0e37,
+  0xd8 => 0x0e38, 0xd9 => 0x0e39, 0xda => 0x0e3a, 0xdf => 0x0e3f,
+  0xe0 => 0x0e40, 0xe1 => 0x0e41, 0xe2 => 0x0e42, 0xe3 => 0x0e43,
+  0xe4 => 0x0e44, 0xe5 => 0x0e45, 0xe6 => 0x0e46, 0xe7 => 0x0e47,
+  0xe8 => 0x0e48, 0xe9 => 0x0e49, 0xea => 0x0e4a, 0xeb => 0x0e4b,
+  0xec => 0x0e4c, 0xed => 0x0e4d, 0xee => 0x0e4e, 0xef => 0x0e4f,
+  0xf0 => 0x0e50, 0xf1 => 0x0e51, 0xf2 => 0x0e52, 0xf3 => 0x0e53,
+  0xf4 => 0x0e54, 0xf5 => 0x0e55, 0xf6 => 0x0e56, 0xf7 => 0x0e57,
+  0xf8 => 0x0e58, 0xf9 => 0x0e59, 0xfa => 0x0e5a, 0xfb => 0x0e5b,
+);
+
+1; # end
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/Turkish.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/Turkish.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/Turkish.pm	(revision 24799)
@@ -0,0 +1,25 @@
+#------------------------------------------------------------------------------
+# File:         Turkish.pm
+#
+# Description:  cp1254 to Unicode
+#
+# Revisions:    2010/01/20 - P. Harvey created
+#
+# References:   1) http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1254.TXT
+#
+# Notes:        The table omits 1-byte characters with the same values as Unicode
+#------------------------------------------------------------------------------
+use strict;
+
+%Image::ExifTool::Charset::Turkish = (
+  0x80 => 0x20ac, 0x82 => 0x201a, 0x83 => 0x0192, 0x84 => 0x201e,
+  0x85 => 0x2026, 0x86 => 0x2020, 0x87 => 0x2021, 0x88 => 0x02c6,
+  0x89 => 0x2030, 0x8a => 0x0160, 0x8b => 0x2039, 0x8c => 0x0152,
+  0x91 => 0x2018, 0x92 => 0x2019, 0x93 => 0x201c, 0x94 => 0x201d,
+  0x95 => 0x2022, 0x96 => 0x2013, 0x97 => 0x2014, 0x98 => 0x02dc,
+  0x99 => 0x2122, 0x9a => 0x0161, 0x9b => 0x203a, 0x9c => 0x0153,
+  0x9f => 0x0178, 0xd0 => 0x011e, 0xdd => 0x0130, 0xde => 0x015e,
+  0xf0 => 0x011f, 0xfd => 0x0131, 0xfe => 0x015f,
+);
+
+1; # end
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/Vietnam.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/Vietnam.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Charset/Vietnam.pm	(revision 24799)
@@ -0,0 +1,27 @@
+#------------------------------------------------------------------------------
+# File:         Vietnam.pm
+#
+# Description:  cp1258 to Unicode
+#
+# Revisions:    2010/01/20 - P. Harvey created
+#
+# References:   1) http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1258.TXT
+#
+# Notes:        The table omits 1-byte characters with the same values as Unicode
+#------------------------------------------------------------------------------
+use strict;
+
+%Image::ExifTool::Charset::Vietnam = (
+  0x80 => 0x20ac, 0x82 => 0x201a, 0x83 => 0x0192, 0x84 => 0x201e,
+  0x85 => 0x2026, 0x86 => 0x2020, 0x87 => 0x2021, 0x88 => 0x02c6,
+  0x89 => 0x2030, 0x8b => 0x2039, 0x8c => 0x0152, 0x91 => 0x2018,
+  0x92 => 0x2019, 0x93 => 0x201c, 0x94 => 0x201d, 0x95 => 0x2022,
+  0x96 => 0x2013, 0x97 => 0x2014, 0x98 => 0x02dc, 0x99 => 0x2122,
+  0x9b => 0x203a, 0x9c => 0x0153, 0x9f => 0x0178, 0xc3 => 0x0102,
+  0xcc => 0x0300, 0xd0 => 0x0110, 0xd2 => 0x0309, 0xd5 => 0x01a0,
+  0xdd => 0x01af, 0xde => 0x0303, 0xe3 => 0x0103, 0xec => 0x0301,
+  0xf0 => 0x0111, 0xf2 => 0x0323, 0xf5 => 0x01a1, 0xfd => 0x01b0,
+  0xfe => 0x20ab,
+);
+
+1; # end
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/DICOM.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/DICOM.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/DICOM.pm	(revision 24799)
@@ -0,0 +1,3831 @@
+#------------------------------------------------------------------------------
+# File:         DICOM.pm
+#
+# Description:  Read DICOM and ACR-NEMA medical images
+#
+# Revisions:    2005/11/09 - P. Harvey Created
+#               2009/11/19 - P. Harvey Added private GE tags from ref 4
+#               2009/12/11 - P. Harvey Updated to DICOM 2008 spec
+#               2010/04/08 - P. Harvey Updated to DICOM 2009 spec
+#
+# References:   1) http://medical.nema.org/
+#               2) http://www.sph.sc.edu/comd/rorden/dicom.html
+#               3) http://www.dclunie.com/
+#               4) http://www.gehealthcare.com/usen/interoperability/dicom/docs/2258357r3.pdf
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::DICOM;
+
+use strict;
+use vars qw($VERSION %uid);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.11';
+
+# DICOM VR (Value Representation) format conversions
+my %dicomFormat = (
+    FD => 'double',
+    FL => 'float',
+    OB => 'int8u',
+    OF => 'float',
+    OW => 'int16u',
+    SL => 'int32s',
+    SS => 'int16s',
+    UL => 'int32u',
+    US => 'int16u',
+);
+
+# VR elements with 32-bit length in explicit VR syntax
+my %vr32 = ( OB=>1, OW=>1, OF=>1, SQ=>1, UT=>1, UN=>1 );
+
+# data elements with implicit VR regardless of syntax
+my %implicitVR = (
+    'FFFE,E000' => 1,
+    'FFFE,E00D' => 1,
+    'FFFE,E0DD' => 1,
+);
+
+# DICOM tags
+# Note: "XxxGroupLength" tags are generated automatically if they don't exist
+%Image::ExifTool::DICOM::Main = (
+    GROUPS => { 2 => 'Image' },
+    PROCESS_PROC => 0,  # set this to zero to omit tags from lookup (way too many!)
+    NOTES => q{
+        The DICOM format is based on the ACR-NEMA specification, but adds a file
+        header and a number of new tags.  ExifTool will extract information from
+        either type of file.  The Tag ID's in the following table are the tag group
+        and element numbers in hexadecimal, as given in the DICOM specification (see
+        L<http://medical.nema.org/>).  The table below contains tags from the DICOM
+        2009 and earlier specifications plus some vendor-specific private tags.
+    },
+    # file meta information group (names end with VR)
+    '0002,0000' => { VR => 'UL', Name => 'FileMetaInfoGroupLength' },
+    '0002,0001' => { VR => 'OB', Name => 'FileMetaInfoVersion' },
+    '0002,0002' => { VR => 'UI', Name => 'MediaStorageSOPClassUID' },
+    '0002,0003' => { VR => 'UI', Name => 'MediaStorageSOPInstanceUID' },
+    '0002,0010' => { VR => 'UI', Name => 'TransferSyntaxUID' },
+    '0002,0012' => { VR => 'UI', Name => 'ImplementationClassUID' },
+    '0002,0013' => { VR => 'SH', Name => 'ImplementationVersionName' },
+    '0002,0016' => { VR => 'AE', Name => 'SourceApplicationEntityTitle' },
+    '0002,0100' => { VR => 'UI', Name => 'PrivateInformationCreatorUID' },
+    '0002,0102' => { VR => 'OB', Name => 'PrivateInformation' },
+    # directory structuring group
+    '0004,1130' => { VR => 'CS', Name => 'FileSetID' },
+    '0004,1141' => { VR => 'CS', Name => 'FileSetDescriptorFileID' },
+    '0004,1142' => { VR => 'CS', Name => 'SpecificCharacterSetOfFile' },
+    '0004,1200' => { VR => 'UL', Name => 'FirstDirectoryRecordOffset' },
+    '0004,1202' => { VR => 'UL', Name => 'LastDirectoryRecordOffset' },
+    '0004,1212' => { VR => 'US', Name => 'FileSetConsistencyFlag' },
+    '0004,1220' => { VR => 'SQ', Name => 'DirectoryRecordSequence' },
+    '0004,1400' => { VR => 'UL', Name => 'OffsetOfNextDirectoryRecord' },
+    '0004,1410' => { VR => 'US', Name => 'RecordInUseFlag' },
+    '0004,1420' => { VR => 'UL', Name => 'LowerLevelDirectoryEntityOffset' },
+    '0004,1430' => { VR => 'CS', Name => 'DirectoryRecordType' },
+    '0004,1432' => { VR => 'UI', Name => 'PrivateRecordUID' },
+    '0004,1500' => { VR => 'CS', Name => 'ReferencedFileID' },
+    '0004,1504' => { VR => 'UL', Name => 'MRDRDirectoryRecordOffset' },
+    '0004,1510' => { VR => 'UI', Name => 'ReferencedSOPClassUIDInFile' },
+    '0004,1511' => { VR => 'UI', Name => 'ReferencedSOPInstanceUIDInFile' },
+    '0004,1512' => { VR => 'UI', Name => 'ReferencedTransferSyntaxUIDInFile' },
+    '0004,151A' => { VR => 'UI', Name => 'ReferencedRelatedSOPClassUIDInFile' },
+    '0004,1600' => { VR => 'UL', Name => 'NumberOfReferences' },
+    # identifying group
+    '0008,0000' => { VR => 'UL', Name => 'IdentifyingGroupLength' },
+    '0008,0001' => { VR => 'UL', Name => 'LengthToEnd' },
+    '0008,0005' => { VR => 'CS', Name => 'SpecificCharacterSet' },
+    '0008,0006' => { VR => 'SQ', Name => 'LanguageCodeSequence' },
+    '0008,0008' => { VR => 'CS', Name => 'ImageType' },
+    '0008,0010' => { VR => 'CS', Name => 'RecognitionCode' },
+    '0008,0012' => { VR => 'DA', Name => 'InstanceCreationDate' },
+    '0008,0013' => { VR => 'TM', Name => 'InstanceCreationTime' },
+    '0008,0014' => { VR => 'UI', Name => 'InstanceCreatorUID' },
+    '0008,0016' => { VR => 'UI', Name => 'SOPClassUID' },
+    '0008,0018' => { VR => 'UI', Name => 'SOPInstanceUID' },
+    '0008,001A' => { VR => 'UI', Name => 'RelatedGeneralSOPClassUID' },
+    '0008,001B' => { VR => 'UI', Name => 'OriginalSpecializedSOPClassUID' },
+    '0008,0020' => { VR => 'DA', Name => 'StudyDate' },
+    '0008,0021' => { VR => 'DA', Name => 'SeriesDate' },
+    '0008,0022' => { VR => 'DA', Name => 'AcquisitionDate' },
+    '0008,0023' => { VR => 'DA', Name => 'ContentDate' },
+    '0008,0024' => { VR => 'DA', Name => 'OverlayDate' },
+    '0008,0025' => { VR => 'DA', Name => 'CurveDate' },
+    '0008,002A' => { VR => 'DT', Name => 'AcquisitionDateTime' },
+    '0008,0030' => { VR => 'TM', Name => 'StudyTime' },
+    '0008,0031' => { VR => 'TM', Name => 'SeriesTime' },
+    '0008,0032' => { VR => 'TM', Name => 'AcquisitionTime' },
+    '0008,0033' => { VR => 'TM', Name => 'ContentTime' },
+    '0008,0034' => { VR => 'TM', Name => 'OverlayTime' },
+    '0008,0035' => { VR => 'TM', Name => 'CurveTime' },
+    '0008,0040' => { VR => 'US', Name => 'DataSetType' },
+    '0008,0041' => { VR => 'LO', Name => 'DataSetSubtype' },
+    '0008,0042' => { VR => 'CS', Name => 'NuclearMedicineSeriesType' },
+    '0008,0050' => { VR => 'SH', Name => 'AccessionNumber' },
+    '0008,0052' => { VR => 'CS', Name => 'QueryRetrieveLevel' },
+    '0008,0054' => { VR => 'AE', Name => 'RetrieveAETitle' },
+    '0008,0056' => { VR => 'CS', Name => 'InstanceAvailability' },
+    '0008,0058' => { VR => 'UI', Name => 'FailedSOPInstanceUIDList' },
+    '0008,0060' => { VR => 'CS', Name => 'Modality' },
+    '0008,0061' => { VR => 'CS', Name => 'ModalitiesInStudy' },
+    '0008,0062' => { VR => 'UI', Name => 'SOPClassesInStudy' },
+    '0008,0064' => { VR => 'CS', Name => 'ConversionType' },
+    '0008,0068' => { VR => 'CS', Name => 'PresentationIntentType' },
+    '0008,0070' => { VR => 'LO', Name => 'Manufacturer' },
+    '0008,0080' => { VR => 'LO', Name => 'InstitutionName' },
+    '0008,0081' => { VR => 'ST', Name => 'InstitutionAddress' },
+    '0008,0082' => { VR => 'SQ', Name => 'InstitutionCodeSequence' },
+    '0008,0090' => { VR => 'PN', Name => 'ReferringPhysicianName' },
+    '0008,0092' => { VR => 'ST', Name => 'ReferringPhysicianAddress' },
+    '0008,0094' => { VR => 'SH', Name => 'ReferringPhysicianTelephoneNumber' },
+    '0008,0096' => { VR => 'SQ', Name => 'ReferringPhysicianIDSequence' },
+    '0008,0100' => { VR => 'SH', Name => 'CodeValue' },
+    '0008,0102' => { VR => 'SH', Name => 'CodingSchemeDesignator' },
+    '0008,0103' => { VR => 'SH', Name => 'CodingSchemeVersion' },
+    '0008,0104' => { VR => 'LO', Name => 'CodeMeaning' },
+    '0008,0105' => { VR => 'CS', Name => 'MappingResource' },
+    '0008,0106' => { VR => 'DT', Name => 'ContextGroupVersion' },
+    '0008,0107' => { VR => 'DT', Name => 'ContextGroupLocalVersion' },
+    '0008,010B' => { VR => 'CS', Name => 'ContextGroupExtensionFlag' },
+    '0008,010C' => { VR => 'UI', Name => 'CodingSchemeUID' },
+    '0008,010D' => { VR => 'UI', Name => 'ContextGroupExtensionCreatorUID' },
+    '0008,010F' => { VR => 'CS', Name => 'ContextIdentifier' },
+    '0008,0110' => { VR => 'SQ', Name => 'CodingSchemeIDSequence' },
+    '0008,0112' => { VR => 'LO', Name => 'CodingSchemeRegistry' },
+    '0008,0114' => { VR => 'ST', Name => 'CodingSchemeExternalID' },
+    '0008,0115' => { VR => 'ST', Name => 'CodingSchemeName' },
+    '0008,0116' => { VR => 'ST', Name => 'ResponsibleOrganization' },
+    '0008,0117' => { VR => 'UI', Name => 'ContextUID' },
+    '0008,0201' => { VR => 'SH', Name => 'TimezoneOffsetFromUTC' },
+    '0008,1000' => { VR => 'AE', Name => 'NetworkID' },
+    '0008,1010' => { VR => 'SH', Name => 'StationName' },
+    '0008,1030' => { VR => 'LO', Name => 'StudyDescription' },
+    '0008,1032' => { VR => 'SQ', Name => 'ProcedureCodeSequence' },
+    '0008,103E' => { VR => 'LO', Name => 'SeriesDescription' },
+    '0008,1040' => { VR => 'LO', Name => 'InstitutionalDepartmentName' },
+    '0008,1048' => { VR => 'PN', Name => 'PhysiciansOfRecord' },
+    '0008,1049' => { VR => 'SQ', Name => 'PhysiciansOfRecordIDSequence' },
+    '0008,1050' => { VR => 'PN', Name => 'PerformingPhysicianName' },
+    '0008,1052' => { VR => 'SQ', Name => 'PerformingPhysicianIDSequence' },
+    '0008,1060' => { VR => 'PN', Name => 'NameOfPhysicianReadingStudy' },
+    '0008,1062' => { VR => 'SQ', Name => 'PhysicianReadingStudyIDSequence' },
+    '0008,1070' => { VR => 'PN', Name => 'OperatorsName' },
+    '0008,1072' => { VR => 'SQ', Name => 'OperatorIDSequence' },
+    '0008,1080' => { VR => 'LO', Name => 'AdmittingDiagnosesDescription' },
+    '0008,1084' => { VR => 'SQ', Name => 'AdmittingDiagnosesCodeSequence' },
+    '0008,1090' => { VR => 'LO', Name => 'ManufacturersModelName' },
+    '0008,1100' => { VR => 'SQ', Name => 'ReferencedResultsSequence' },
+    '0008,1110' => { VR => 'SQ', Name => 'ReferencedStudySequence' },
+    '0008,1111' => { VR => 'SQ', Name => 'ReferencedProcedureStepSequence' },
+    '0008,1115' => { VR => 'SQ', Name => 'ReferencedSeriesSequence' },
+    '0008,1120' => { VR => 'SQ', Name => 'ReferencedPatientSequence' },
+    '0008,1125' => { VR => 'SQ', Name => 'ReferencedVisitSequence' },
+    '0008,1130' => { VR => 'SQ', Name => 'ReferencedOverlaySequence' },
+    '0008,113A' => { VR => 'SQ', Name => 'ReferencedWaveformSequence' },
+    '0008,1140' => { VR => 'SQ', Name => 'ReferencedImageSequence' },
+    '0008,1145' => { VR => 'SQ', Name => 'ReferencedCurveSequence' },
+    '0008,114A' => { VR => 'SQ', Name => 'ReferencedInstanceSequence' },
+    '0008,1150' => { VR => 'UI', Name => 'ReferencedSOPClassUID' },
+    '0008,1155' => { VR => 'UI', Name => 'ReferencedSOPInstanceUID' },
+    '0008,115A' => { VR => 'UI', Name => 'SOPClassesSupported' },
+    '0008,1160' => { VR => 'IS', Name => 'ReferencedFrameNumber' },
+    '0008,1161' => { VR => 'UL', Name => 'SimpleFrameList' },
+    '0008,1162' => { VR => 'UL', Name => 'CalculatedFrameList' },
+    '0008,1163' => { VR => 'FD', Name => 'TimeRange' },
+    '0008,1164' => { VR => 'SQ', Name => 'FrameExtractionSequence' },
+    '0008,1195' => { VR => 'UI', Name => 'TransactionUID' },
+    '0008,1197' => { VR => 'US', Name => 'FailureReason' },
+    '0008,1198' => { VR => 'SQ', Name => 'FailedSOPSequence' },
+    '0008,1199' => { VR => 'SQ', Name => 'ReferencedSOPSequence' },
+    '0008,1200' => { VR => 'SQ', Name => 'OtherReferencedStudiesSequence' },
+    '0008,1250' => { VR => 'SQ', Name => 'RelatedSeriesSequence' },
+    '0008,2110' => { VR => 'CS', Name => 'LossyImageCompression' },
+    '0008,2111' => { VR => 'ST', Name => 'DerivationDescription' },
+    '0008,2112' => { VR => 'SQ', Name => 'SourceImageSequence' },
+    '0008,2120' => { VR => 'SH', Name => 'StageName' },
+    '0008,2122' => { VR => 'IS', Name => 'StageNumber' },
+    '0008,2124' => { VR => 'IS', Name => 'NumberOfStages' },
+    '0008,2127' => { VR => 'SH', Name => 'ViewName' },
+    '0008,2128' => { VR => 'IS', Name => 'ViewNumber' },
+    '0008,2129' => { VR => 'IS', Name => 'NumberOfEventTimers' },
+    '0008,212A' => { VR => 'IS', Name => 'NumberOfViewsInStage' },
+    '0008,2130' => { VR => 'DS', Name => 'EventElapsedTimes' },
+    '0008,2132' => { VR => 'LO', Name => 'EventTimerNames' },
+    '0008,2133' => { VR => 'SQ', Name => 'EventTimerSequence' },
+    '0008,2134' => { VR => 'FD', Name => 'EventTimeOffset' },
+    '0008,2135' => { VR => 'SQ', Name => 'EventCodeSequence' },
+    '0008,2142' => { VR => 'IS', Name => 'StartTrim' },
+    '0008,2143' => { VR => 'IS', Name => 'StopTrim' },
+    '0008,2144' => { VR => 'IS', Name => 'RecommendedDisplayFrameRate' },
+    '0008,2200' => { VR => 'CS', Name => 'TransducerPosition' },
+    '0008,2204' => { VR => 'CS', Name => 'TransducerOrientation' },
+    '0008,2208' => { VR => 'CS', Name => 'AnatomicStructure' },
+    '0008,2218' => { VR => 'SQ', Name => 'AnatomicRegionSequence' },
+    '0008,2220' => { VR => 'SQ', Name => 'AnatomicRegionModifierSequence' },
+    '0008,2228' => { VR => 'SQ', Name => 'PrimaryAnatomicStructureSequence' },
+    '0008,2229' => { VR => 'SQ', Name => 'AnatomicStructureOrRegionSequence' },
+    '0008,2230' => { VR => 'SQ', Name => 'AnatomicStructureModifierSequence' },
+    '0008,2240' => { VR => 'SQ', Name => 'TransducerPositionSequence' },
+    '0008,2242' => { VR => 'SQ', Name => 'TransducerPositionModifierSequence' },
+    '0008,2244' => { VR => 'SQ', Name => 'TransducerOrientationSequence' },
+    '0008,2246' => { VR => 'SQ', Name => 'TransducerOrientationModifierSeq' },
+    '0008,2253' => { VR => 'SQ', Name => 'AnatomicEntrancePortalCodeSeqTrial' },
+    '0008,2255' => { VR => 'SQ', Name => 'AnatomicApproachDirCodeSeqTrial' },
+    '0008,2256' => { VR => 'ST', Name => 'AnatomicPerspectiveDescrTrial' },
+    '0008,2257' => { VR => 'SQ', Name => 'AnatomicPerspectiveCodeSeqTrial' },
+    '0008,3001' => { VR => 'SQ', Name => 'AlternateRepresentationSequence' },
+    '0008,3010' => { VR => 'UI', Name => 'IrradiationEventUID' },
+    '0008,4000' => { VR => 'LT', Name => 'IdentifyingComments' },
+    '0008,9007' => { VR => 'CS', Name => 'FrameType' },
+    '0008,9092' => { VR => 'SQ', Name => 'ReferencedImageEvidenceSequence' },
+    '0008,9121' => { VR => 'SQ', Name => 'ReferencedRawDataSequence' },
+    '0008,9123' => { VR => 'UI', Name => 'CreatorVersionUID' },
+    '0008,9124' => { VR => 'SQ', Name => 'DerivationImageSequence' },
+    '0008,9154' => { VR => 'SQ', Name => 'SourceImageEvidenceSequence' },
+    '0008,9205' => { VR => 'CS', Name => 'PixelPresentation' },
+    '0008,9206' => { VR => 'CS', Name => 'VolumetricProperties' },
+    '0008,9207' => { VR => 'CS', Name => 'VolumeBasedCalculationTechnique' },
+    '0008,9208' => { VR => 'CS', Name => 'ComplexImageComponent' },
+    '0008,9209' => { VR => 'CS', Name => 'AcquisitionContrast' },
+    '0008,9215' => { VR => 'SQ', Name => 'DerivationCodeSequence' },
+    '0008,9237' => { VR => 'SQ', Name => 'GrayscalePresentationStateSequence' },
+    '0008,9410' => { VR => 'SQ', Name => 'ReferencedOtherPlaneSequence' },
+    '0008,9458' => { VR => 'SQ', Name => 'FrameDisplaySequence' },
+    '0008,9459' => { VR => 'FL', Name => 'RecommendedDisplayFrameRateInFloat' },
+    '0008,9460' => { VR => 'CS', Name => 'SkipFrameRangeFlag' },
+    # GEMS_IDEN_01 (ref 4)
+    '0009,1001' => { VR => 'LO', Name => 'FullFidelity' },
+    '0009,1002' => { VR => 'SH', Name => 'SuiteID' },
+    '0009,1004' => { VR => 'SH', Name => 'ProductID' },
+    '0009,1027' => { VR => 'SL', Name => 'ImageActualDate' },
+    '0009,1030' => { VR => 'SH', Name => 'ServiceID' },
+    '0009,1031' => { VR => 'SH', Name => 'MobileLocationNumber' },
+    '0009,10E3' => { VR => 'UI', Name => 'EquipmentUID' },
+    '0009,10E6' => { VR => 'SH', Name => 'GenesisVersionNow' },
+    '0009,10E7' => { VR => 'UL', Name => 'ExamRecordChecksum' },
+    '0009,10E9' => { VR => 'SL', Name => 'ActualSeriesDataTimeStamp' },
+    # patient group
+    '0010,0000' => { VR => 'UL', Name => 'PatientGroupLength' },
+    '0010,0010' => { VR => 'PN', Name => 'PatientName' },
+    '0010,0020' => { VR => 'LO', Name => 'PatientID' },
+    '0010,0021' => { VR => 'LO', Name => 'IssuerOfPatientID' },
+    '0010,0022' => { VR => 'CS', Name => 'TypeOfPatientID' },
+    '0010,0030' => { VR => 'DA', Name => 'PatientBirthDate' },
+    '0010,0032' => { VR => 'TM', Name => 'PatientBirthTime' },
+    '0010,0040' => { VR => 'CS', Name => 'PatientSex' },
+    '0010,0050' => { VR => 'SQ', Name => 'PatientInsurancePlanCodeSequence' },
+    '0010,0101' => { VR => 'SQ', Name => 'PatientPrimaryLanguageCodeSeq' },
+    '0010,0102' => { VR => 'SQ', Name => 'PatientPrimaryLanguageCodeModSeq' },
+    '0010,1000' => { VR => 'LO', Name => 'OtherPatientIDs' },
+    '0010,1001' => { VR => 'PN', Name => 'OtherPatientNames' },
+    '0010,1002' => { VR => 'SQ', Name => 'OtherPatientIDsSequence' },
+    '0010,1005' => { VR => 'PN', Name => 'PatientBirthName' },
+    '0010,1010' => { VR => 'AS', Name => 'PatientAge' },
+    '0010,1020' => { VR => 'DS', Name => 'PatientSize' },
+    '0010,1030' => { VR => 'DS', Name => 'PatientWeight' },
+    '0010,1040' => { VR => 'LO', Name => 'PatientAddress' },
+    '0010,1050' => { VR => 'LO', Name => 'InsurancePlanIdentification' },
+    '0010,1060' => { VR => 'PN', Name => 'PatientMotherBirthName' },
+    '0010,1080' => { VR => 'LO', Name => 'MilitaryRank' },
+    '0010,1081' => { VR => 'LO', Name => 'BranchOfService' },
+    '0010,1090' => { VR => 'LO', Name => 'MedicalRecordLocator' },
+    '0010,2000' => { VR => 'LO', Name => 'MedicalAlerts' },
+    '0010,2110' => { VR => 'LO', Name => 'Allergies' },
+    '0010,2150' => { VR => 'LO', Name => 'CountryOfResidence' },
+    '0010,2152' => { VR => 'LO', Name => 'RegionOfResidence' },
+    '0010,2154' => { VR => 'SH', Name => 'PatientTelephoneNumbers' },
+    '0010,2160' => { VR => 'SH', Name => 'EthnicGroup' },
+    '0010,2180' => { VR => 'SH', Name => 'Occupation' },
+    '0010,21A0' => { VR => 'CS', Name => 'SmokingStatus' },
+    '0010,21B0' => { VR => 'LT', Name => 'AdditionalPatientHistory' },
+    '0010,21C0' => { VR => 'US', Name => 'PregnancyStatus' },
+    '0010,21D0' => { VR => 'DA', Name => 'LastMenstrualDate' },
+    '0010,21F0' => { VR => 'LO', Name => 'PatientReligiousPreference' },
+    '0010,2201' => { VR => 'LO', Name => 'PatientSpeciesDescription' },
+    '0010,2202' => { VR => 'SQ', Name => 'PatientSpeciesCodeSequence' },
+    '0010,2203' => { VR => 'CS', Name => 'PatientSexNeutered' },
+    '0010,2210' => { VR => 'CS', Name => 'AnatomicalOrientationType' },
+    '0010,2292' => { VR => 'LO', Name => 'PatientBreedDescription' },
+    '0010,2293' => { VR => 'SQ', Name => 'PatientBreedCodeSequence' },
+    '0010,2294' => { VR => 'SQ', Name => 'BreedRegistrationSequence' },
+    '0010,2295' => { VR => 'LO', Name => 'BreedRegistrationNumber' },
+    '0010,2296' => { VR => 'SQ', Name => 'BreedRegistryCodeSequence' },
+    '0010,2297' => { VR => 'PN', Name => 'ResponsiblePerson' },
+    '0010,2298' => { VR => 'CS', Name => 'ResponsiblePersonRole' },
+    '0010,2299' => { VR => 'LO', Name => 'ResponsibleOrganization' },
+    '0010,4000' => { VR => 'LT', Name => 'PatientComments' },
+    '0010,9431' => { VR => 'FL', Name => 'ExaminedBodyThickness' },
+    # GEMS_PATI_01 (ref 4)
+    '0011,1010' => { VR => 'SS', Name => 'PatientStatus' },
+    # clinical trial group
+    '0012,0010' => { VR => 'LO', Name => 'ClinicalTrialSponsorName' },
+    '0012,0020' => { VR => 'LO', Name => 'ClinicalTrialProtocolID' },
+    '0012,0021' => { VR => 'LO', Name => 'ClinicalTrialProtocolName' },
+    '0012,0030' => { VR => 'LO', Name => 'ClinicalTrialSiteID' },
+    '0012,0031' => { VR => 'LO', Name => 'ClinicalTrialSiteName' },
+    '0012,0040' => { VR => 'LO', Name => 'ClinicalTrialSubjectID' },
+    '0012,0042' => { VR => 'LO', Name => 'ClinicalTrialSubjectReadingID' },
+    '0012,0050' => { VR => 'LO', Name => 'ClinicalTrialTimePointID' },
+    '0012,0051' => { VR => 'ST', Name => 'ClinicalTrialTimePointDescription' },
+    '0012,0060' => { VR => 'LO', Name => 'ClinicalTrialCoordinatingCenter' },
+    '0012,0062' => { VR => 'CS', Name => 'PatientIdentityRemoved' },
+    '0012,0063' => { VR => 'LO', Name => 'DeidentificationMethod' },
+    '0012,0064' => { VR => 'SQ', Name => 'DeidentificationMethodCodeSequence' },
+    '0012,0071' => { VR => 'LO', Name => 'ClinicalTrialSeriesID' },
+    '0012,0072' => { VR => 'LO', Name => 'ClinicalTrialSeriesDescription' },
+    '0012,0084' => { VR => 'CS', Name => 'DistributionType' },
+    '0012,0085' => { VR => 'CS', Name => 'ConsentForDistributionFlag' },
+    # acquisition group
+    '0018,0000' => { VR => 'UL', Name => 'AcquisitionGroupLength' },
+    '0018,0010' => { VR => 'LO', Name => 'ContrastBolusAgent' },
+    '0018,0012' => { VR => 'SQ', Name => 'ContrastBolusAgentSequence' },
+    '0018,0014' => { VR => 'SQ', Name => 'ContrastBolusAdministrationRoute' },
+    '0018,0015' => { VR => 'CS', Name => 'BodyPartExamined' },
+    '0018,0020' => { VR => 'CS', Name => 'ScanningSequence' },
+    '0018,0021' => { VR => 'CS', Name => 'SequenceVariant' },
+    '0018,0022' => { VR => 'CS', Name => 'ScanOptions' },
+    '0018,0023' => { VR => 'CS', Name => 'MRAcquisitionType' },
+    '0018,0024' => { VR => 'SH', Name => 'SequenceName' },
+    '0018,0025' => { VR => 'CS', Name => 'AngioFlag' },
+    '0018,0026' => { VR => 'SQ', Name => 'InterventionDrugInformationSeq' },
+    '0018,0027' => { VR => 'TM', Name => 'InterventionDrugStopTime' },
+    '0018,0028' => { VR => 'DS', Name => 'InterventionDrugDose' },
+    '0018,0029' => { VR => 'SQ', Name => 'InterventionDrugSequence' },
+    '0018,002A' => { VR => 'SQ', Name => 'AdditionalDrugSequence' },
+    '0018,0030' => { VR => 'LO', Name => 'Radionuclide' },
+    '0018,0031' => { VR => 'LO', Name => 'Radiopharmaceutical' },
+    '0018,0032' => { VR => 'DS', Name => 'EnergyWindowCenterline' },
+    '0018,0033' => { VR => 'DS', Name => 'EnergyWindowTotalWidth' },
+    '0018,0034' => { VR => 'LO', Name => 'InterventionDrugName' },
+    '0018,0035' => { VR => 'TM', Name => 'InterventionDrugStartTime' },
+    '0018,0036' => { VR => 'SQ', Name => 'InterventionSequence' },
+    '0018,0037' => { VR => 'CS', Name => 'TherapyType' },
+    '0018,0038' => { VR => 'CS', Name => 'InterventionStatus' },
+    '0018,0039' => { VR => 'CS', Name => 'TherapyDescription' },
+    '0018,003A' => { VR => 'ST', Name => 'InterventionDescription' },
+    '0018,0040' => { VR => 'IS', Name => 'CineRate' },
+    '0018,0042' => { VR => 'CS', Name => 'InitialCineRunState' },
+    '0018,0050' => { VR => 'DS', Name => 'SliceThickness' },
+    '0018,0060' => { VR => 'DS', Name => 'KVP' },
+    '0018,0070' => { VR => 'IS', Name => 'CountsAccumulated' },
+    '0018,0071' => { VR => 'CS', Name => 'AcquisitionTerminationCondition' },
+    '0018,0072' => { VR => 'DS', Name => 'EffectiveDuration' },
+    '0018,0073' => { VR => 'CS', Name => 'AcquisitionStartCondition' },
+    '0018,0074' => { VR => 'IS', Name => 'AcquisitionStartConditionData' },
+    '0018,0075' => { VR => 'IS', Name => 'AcquisitionEndConditionData' },
+    '0018,0080' => { VR => 'DS', Name => 'RepetitionTime' },
+    '0018,0081' => { VR => 'DS', Name => 'EchoTime' },
+    '0018,0082' => { VR => 'DS', Name => 'InversionTime' },
+    '0018,0083' => { VR => 'DS', Name => 'NumberOfAverages' },
+    '0018,0084' => { VR => 'DS', Name => 'ImagingFrequency' },
+    '0018,0085' => { VR => 'SH', Name => 'ImagedNucleus' },
+    '0018,0086' => { VR => 'IS', Name => 'EchoNumber' },
+    '0018,0087' => { VR => 'DS', Name => 'MagneticFieldStrength' },
+    '0018,0088' => { VR => 'DS', Name => 'SpacingBetweenSlices' },
+    '0018,0089' => { VR => 'IS', Name => 'NumberOfPhaseEncodingSteps' },
+    '0018,0090' => { VR => 'DS', Name => 'DataCollectionDiameter' },
+    '0018,0091' => { VR => 'IS', Name => 'EchoTrainLength' },
+    '0018,0093' => { VR => 'DS', Name => 'PercentSampling' },
+    '0018,0094' => { VR => 'DS', Name => 'PercentPhaseFieldOfView' },
+    '0018,0095' => { VR => 'DS', Name => 'PixelBandwidth' },
+    '0018,1000' => { VR => 'LO', Name => 'DeviceSerialNumber' },
+    '0018,1002' => { VR => 'UI', Name => 'DeviceUID' },
+    '0018,1003' => { VR => 'LO', Name => 'DeviceID' },
+    '0018,1004' => { VR => 'LO', Name => 'PlateID' },
+    '0018,1005' => { VR => 'LO', Name => 'GeneratorID' },
+    '0018,1006' => { VR => 'LO', Name => 'GridID' },
+    '0018,1007' => { VR => 'LO', Name => 'CassetteID' },
+    '0018,1008' => { VR => 'LO', Name => 'GantryID' },
+    '0018,1010' => { VR => 'LO', Name => 'SecondaryCaptureDeviceID' },
+    '0018,1011' => { VR => 'LO', Name => 'HardcopyCreationDeviceID' },
+    '0018,1012' => { VR => 'DA', Name => 'DateOfSecondaryCapture' },
+    '0018,1014' => { VR => 'TM', Name => 'TimeOfSecondaryCapture' },
+    '0018,1016' => { VR => 'LO', Name => 'SecondaryCaptureDeviceManufacturer' },
+    '0018,1017' => { VR => 'LO', Name => 'HardcopyDeviceManufacturer' },
+    '0018,1018' => { VR => 'LO', Name => 'SecondaryCaptureDeviceModelName' },
+    '0018,1019' => { VR => 'LO', Name => 'SecondaryCaptureDeviceSoftwareVers' },
+    '0018,101A' => { VR => 'LO', Name => 'HardcopyDeviceSoftwareVersion' },
+    '0018,101B' => { VR => 'LO', Name => 'HardcopyDeviceModelName' },
+    '0018,1020' => { VR => 'LO', Name => 'SoftwareVersion' },
+    '0018,1022' => { VR => 'SH', Name => 'VideoImageFormatAcquired' },
+    '0018,1023' => { VR => 'LO', Name => 'DigitalImageFormatAcquired' },
+    '0018,1030' => { VR => 'LO', Name => 'ProtocolName' },
+    '0018,1040' => { VR => 'LO', Name => 'ContrastBolusRoute' },
+    '0018,1041' => { VR => 'DS', Name => 'ContrastBolusVolume' },
+    '0018,1042' => { VR => 'TM', Name => 'ContrastBolusStartTime' },
+    '0018,1043' => { VR => 'TM', Name => 'ContrastBolusStopTime' },
+    '0018,1044' => { VR => 'DS', Name => 'ContrastBolusTotalDose' },
+    '0018,1045' => { VR => 'IS', Name => 'SyringeCounts' },
+    '0018,1046' => { VR => 'DS', Name => 'ContrastFlowRate' },
+    '0018,1047' => { VR => 'DS', Name => 'ContrastFlowDuration' },
+    '0018,1048' => { VR => 'CS', Name => 'ContrastBolusIngredient' },
+    '0018,1049' => { VR => 'DS', Name => 'ContrastBolusConcentration' },
+    '0018,1050' => { VR => 'DS', Name => 'SpatialResolution' },
+    '0018,1060' => { VR => 'DS', Name => 'TriggerTime' },
+    '0018,1061' => { VR => 'LO', Name => 'TriggerSourceOrType' },
+    '0018,1062' => { VR => 'IS', Name => 'NominalInterval' },
+    '0018,1063' => { VR => 'DS', Name => 'FrameTime' },
+    '0018,1064' => { VR => 'LO', Name => 'CardiacFramingType' },
+    '0018,1065' => { VR => 'DS', Name => 'FrameTimeVector' },
+    '0018,1066' => { VR => 'DS', Name => 'FrameDelay' },
+    '0018,1067' => { VR => 'DS', Name => 'ImageTriggerDelay' },
+    '0018,1068' => { VR => 'DS', Name => 'MultiplexGroupTimeOffset' },
+    '0018,1069' => { VR => 'DS', Name => 'TriggerTimeOffset' },
+    '0018,106A' => { VR => 'CS', Name => 'SynchronizationTrigger' },
+    '0018,106C' => { VR => 'US', Name => 'SynchronizationChannel' },
+    '0018,106E' => { VR => 'UL', Name => 'TriggerSamplePosition' },
+    '0018,1070' => { VR => 'LO', Name => 'RadiopharmaceuticalRoute' },
+    '0018,1071' => { VR => 'DS', Name => 'RadiopharmaceuticalVolume' },
+    '0018,1072' => { VR => 'TM', Name => 'RadiopharmaceuticalStartTime' },
+    '0018,1073' => { VR => 'TM', Name => 'RadiopharmaceuticalStopTime' },
+    '0018,1074' => { VR => 'DS', Name => 'RadionuclideTotalDose' },
+    '0018,1075' => { VR => 'DS', Name => 'RadionuclideHalfLife' },
+    '0018,1076' => { VR => 'DS', Name => 'RadionuclidePositronFraction' },
+    '0018,1077' => { VR => 'DS', Name => 'RadiopharmaceuticalSpecActivity' },
+    '0018,1078' => { VR => 'DT', Name => 'RadiopharmaceuticalStartDateTime' },
+    '0018,1079' => { VR => 'DT', Name => 'RadiopharmaceuticalStopDateTime' },
+    '0018,1080' => { VR => 'CS', Name => 'BeatRejectionFlag' },
+    '0018,1081' => { VR => 'IS', Name => 'LowRRValue' },
+    '0018,1082' => { VR => 'IS', Name => 'HighRRValue' },
+    '0018,1083' => { VR => 'IS', Name => 'IntervalsAcquired' },
+    '0018,1084' => { VR => 'IS', Name => 'IntervalsRejected' },
+    '0018,1085' => { VR => 'LO', Name => 'PVCRejection' },
+    '0018,1086' => { VR => 'IS', Name => 'SkipBeats' },
+    '0018,1088' => { VR => 'IS', Name => 'HeartRate' },
+    '0018,1090' => { VR => 'IS', Name => 'CardiacNumberOfImages' },
+    '0018,1094' => { VR => 'IS', Name => 'TriggerWindow' },
+    '0018,1100' => { VR => 'DS', Name => 'ReconstructionDiameter' },
+    '0018,1110' => { VR => 'DS', Name => 'DistanceSourceToDetector' },
+    '0018,1111' => { VR => 'DS', Name => 'DistanceSourceToPatient' },
+    '0018,1114' => { VR => 'DS', Name => 'EstimatedRadiographicMagnification' },
+    '0018,1120' => { VR => 'DS', Name => 'GantryDetectorTilt' },
+    '0018,1121' => { VR => 'DS', Name => 'GantryDetectorSlew' },
+    '0018,1130' => { VR => 'DS', Name => 'TableHeight' },
+    '0018,1131' => { VR => 'DS', Name => 'TableTraverse' },
+    '0018,1134' => { VR => 'CS', Name => 'TableMotion' },
+    '0018,1135' => { VR => 'DS', Name => 'TableVerticalIncrement' },
+    '0018,1136' => { VR => 'DS', Name => 'TableLateralIncrement' },
+    '0018,1137' => { VR => 'DS', Name => 'TableLongitudinalIncrement' },
+    '0018,1138' => { VR => 'DS', Name => 'TableAngle' },
+    '0018,113A' => { VR => 'CS', Name => 'TableType' },
+    '0018,1140' => { VR => 'CS', Name => 'RotationDirection' },
+    '0018,1141' => { VR => 'DS', Name => 'AngularPosition' },
+    '0018,1142' => { VR => 'DS', Name => 'RadialPosition' },
+    '0018,1143' => { VR => 'DS', Name => 'ScanArc' },
+    '0018,1144' => { VR => 'DS', Name => 'AngularStep' },
+    '0018,1145' => { VR => 'DS', Name => 'CenterOfRotationOffset' },
+    '0018,1146' => { VR => 'DS', Name => 'RotationOffset' },
+    '0018,1147' => { VR => 'CS', Name => 'FieldOfViewShape' },
+    '0018,1149' => { VR => 'IS', Name => 'FieldOfViewDimensions' },
+    '0018,1150' => { VR => 'IS', Name => 'ExposureTime' },
+    '0018,1151' => { VR => 'IS', Name => 'XRayTubeCurrent' },
+    '0018,1152' => { VR => 'IS', Name => 'Exposure' },
+    '0018,1153' => { VR => 'IS', Name => 'ExposureInMicroAmpSec' },
+    '0018,1154' => { VR => 'DS', Name => 'AveragePulseWidth' },
+    '0018,1155' => { VR => 'CS', Name => 'RadiationSetting' },
+    '0018,1156' => { VR => 'CS', Name => 'RectificationType' },
+    '0018,115A' => { VR => 'CS', Name => 'RadiationMode' },
+    '0018,115E' => { VR => 'DS', Name => 'ImageAreaDoseProduct' },
+    '0018,1160' => { VR => 'SH', Name => 'FilterType' },
+    '0018,1161' => { VR => 'LO', Name => 'TypeOfFilters' },
+    '0018,1162' => { VR => 'DS', Name => 'IntensifierSize' },
+    '0018,1164' => { VR => 'DS', Name => 'ImagerPixelSpacing' },
+    '0018,1166' => { VR => 'CS', Name => 'Grid' },
+    '0018,1170' => { VR => 'IS', Name => 'GeneratorPower' },
+    '0018,1180' => { VR => 'SH', Name => 'CollimatorGridName' },
+    '0018,1181' => { VR => 'CS', Name => 'CollimatorType' },
+    '0018,1182' => { VR => 'IS', Name => 'FocalDistance' },
+    '0018,1183' => { VR => 'DS', Name => 'XFocusCenter' },
+    '0018,1184' => { VR => 'DS', Name => 'YFocusCenter' },
+    '0018,1190' => { VR => 'DS', Name => 'FocalSpots' },
+    '0018,1191' => { VR => 'CS', Name => 'AnodeTargetMaterial' },
+    '0018,11A0' => { VR => 'DS', Name => 'BodyPartThickness' },
+    '0018,11A2' => { VR => 'DS', Name => 'CompressionForce' },
+    '0018,1200' => { VR => 'DA', Name => 'DateOfLastCalibration' },
+    '0018,1201' => { VR => 'TM', Name => 'TimeOfLastCalibration' },
+    '0018,1210' => { VR => 'SH', Name => 'ConvolutionKernel' },
+    '0018,1240' => { VR => 'IS', Name => 'UpperLowerPixelValues' },
+    '0018,1242' => { VR => 'IS', Name => 'ActualFrameDuration' },
+    '0018,1243' => { VR => 'IS', Name => 'CountRate' },
+    '0018,1244' => { VR => 'US', Name => 'PreferredPlaybackSequencing' },
+    '0018,1250' => { VR => 'SH', Name => 'ReceiveCoilName' },
+    '0018,1251' => { VR => 'SH', Name => 'TransmitCoilName' },
+    '0018,1260' => { VR => 'SH', Name => 'PlateType' },
+    '0018,1261' => { VR => 'LO', Name => 'PhosphorType' },
+    '0018,1300' => { VR => 'DS', Name => 'ScanVelocity' },
+    '0018,1301' => { VR => 'CS', Name => 'WholeBodyTechnique' },
+    '0018,1302' => { VR => 'IS', Name => 'ScanLength' },
+    '0018,1310' => { VR => 'US', Name => 'AcquisitionMatrix' },
+    '0018,1312' => { VR => 'CS', Name => 'InPlanePhaseEncodingDirection' },
+    '0018,1314' => { VR => 'DS', Name => 'FlipAngle' },
+    '0018,1315' => { VR => 'CS', Name => 'VariableFlipAngleFlag' },
+    '0018,1316' => { VR => 'DS', Name => 'SAR' },
+    '0018,1318' => { VR => 'DS', Name => 'DB-Dt' },
+    '0018,1400' => { VR => 'LO', Name => 'AcquisitionDeviceProcessingDescr' },
+    '0018,1401' => { VR => 'LO', Name => 'AcquisitionDeviceProcessingCode' },
+    '0018,1402' => { VR => 'CS', Name => 'CassetteOrientation' },
+    '0018,1403' => { VR => 'CS', Name => 'CassetteSize' },
+    '0018,1404' => { VR => 'US', Name => 'ExposuresOnPlate' },
+    '0018,1405' => { VR => 'IS', Name => 'RelativeXRayExposure' },
+    '0018,1450' => { VR => 'DS', Name => 'ColumnAngulation' },
+    '0018,1460' => { VR => 'DS', Name => 'TomoLayerHeight' },
+    '0018,1470' => { VR => 'DS', Name => 'TomoAngle' },
+    '0018,1480' => { VR => 'DS', Name => 'TomoTime' },
+    '0018,1490' => { VR => 'CS', Name => 'TomoType' },
+    '0018,1491' => { VR => 'CS', Name => 'TomoClass' },
+    '0018,1495' => { VR => 'IS', Name => 'NumberOfTomosynthesisSourceImages' },
+    '0018,1500' => { VR => 'CS', Name => 'PositionerMotion' },
+    '0018,1508' => { VR => 'CS', Name => 'PositionerType' },
+    '0018,1510' => { VR => 'DS', Name => 'PositionerPrimaryAngle' },
+    '0018,1511' => { VR => 'DS', Name => 'PositionerSecondaryAngle' },
+    '0018,1520' => { VR => 'DS', Name => 'PositionerPrimaryAngleIncrement' },
+    '0018,1521' => { VR => 'DS', Name => 'PositionerSecondaryAngleIncrement' },
+    '0018,1530' => { VR => 'DS', Name => 'DetectorPrimaryAngle' },
+    '0018,1531' => { VR => 'DS', Name => 'DetectorSecondaryAngle' },
+    '0018,1600' => { VR => 'CS', Name => 'ShutterShape' },
+    '0018,1602' => { VR => 'IS', Name => 'ShutterLeftVerticalEdge' },
+    '0018,1604' => { VR => 'IS', Name => 'ShutterRightVerticalEdge' },
+    '0018,1606' => { VR => 'IS', Name => 'ShutterUpperHorizontalEdge' },
+    '0018,1608' => { VR => 'IS', Name => 'ShutterLowerHorizontalEdge' },
+    '0018,1610' => { VR => 'IS', Name => 'CenterOfCircularShutter' },
+    '0018,1612' => { VR => 'IS', Name => 'RadiusOfCircularShutter' },
+    '0018,1620' => { VR => 'IS', Name => 'VerticesOfPolygonalShutter' },
+    '0018,1622' => { VR => 'US', Name => 'ShutterPresentationValue' },
+    '0018,1623' => { VR => 'US', Name => 'ShutterOverlayGroup' },
+    '0018,1624' => { VR => 'US', Name => 'ShutterPresentationColorCIELabVal' },
+    '0018,1700' => { VR => 'CS', Name => 'CollimatorShape' },
+    '0018,1702' => { VR => 'IS', Name => 'CollimatorLeftVerticalEdge' },
+    '0018,1704' => { VR => 'IS', Name => 'CollimatorRightVerticalEdge' },
+    '0018,1706' => { VR => 'IS', Name => 'CollimatorUpperHorizontalEdge' },
+    '0018,1708' => { VR => 'IS', Name => 'CollimatorLowerHorizontalEdge' },
+    '0018,1710' => { VR => 'IS', Name => 'CenterOfCircularCollimator' },
+    '0018,1712' => { VR => 'IS', Name => 'RadiusOfCircularCollimator' },
+    '0018,1720' => { VR => 'IS', Name => 'VerticesOfPolygonalCollimator' },
+    '0018,1800' => { VR => 'CS', Name => 'AcquisitionTimeSynchronized' },
+    '0018,1801' => { VR => 'SH', Name => 'TimeSource' },
+    '0018,1802' => { VR => 'CS', Name => 'TimeDistributionProtocol' },
+    '0018,1803' => { VR => 'LO', Name => 'NTPSourceAddress' },
+    '0018,2001' => { VR => 'IS', Name => 'PageNumberVector' },
+    '0018,2002' => { VR => 'SH', Name => 'FrameLabelVector' },
+    '0018,2003' => { VR => 'DS', Name => 'FramePrimaryAngleVector' },
+    '0018,2004' => { VR => 'DS', Name => 'FrameSecondaryAngleVector' },
+    '0018,2005' => { VR => 'DS', Name => 'SliceLocationVector' },
+    '0018,2006' => { VR => 'SH', Name => 'DisplayWindowLabelVector' },
+    '0018,2010' => { VR => 'DS', Name => 'NominalScannedPixelSpacing' },
+    '0018,2020' => { VR => 'CS', Name => 'DigitizingDeviceTransportDirection' },
+    '0018,2030' => { VR => 'DS', Name => 'RotationOfScannedFilm' },
+    '0018,3100' => { VR => 'CS', Name => 'IVUSAcquisition' },
+    '0018,3101' => { VR => 'DS', Name => 'IVUSPullbackRate' },
+    '0018,3102' => { VR => 'DS', Name => 'IVUSGatedRate' },
+    '0018,3103' => { VR => 'IS', Name => 'IVUSPullbackStartFrameNumber' },
+    '0018,3104' => { VR => 'IS', Name => 'IVUSPullbackStopFrameNumber' },
+    '0018,3105' => { VR => 'IS', Name => 'LesionNumber' },
+    '0018,4000' => { VR => 'LT', Name => 'AcquisitionComments' },
+    '0018,5000' => { VR => 'SH', Name => 'OutputPower' },
+    '0018,5010' => { VR => 'LO', Name => 'TransducerData' },
+    '0018,5012' => { VR => 'DS', Name => 'FocusDepth' },
+    '0018,5020' => { VR => 'LO', Name => 'ProcessingFunction' },
+    '0018,5021' => { VR => 'LO', Name => 'PostprocessingFunction' },
+    '0018,5022' => { VR => 'DS', Name => 'MechanicalIndex' },
+    '0018,5024' => { VR => 'DS', Name => 'BoneThermalIndex' },
+    '0018,5026' => { VR => 'DS', Name => 'CranialThermalIndex' },
+    '0018,5027' => { VR => 'DS', Name => 'SoftTissueThermalIndex' },
+    '0018,5028' => { VR => 'DS', Name => 'SoftTissueFocusThermalIndex' },
+    '0018,5029' => { VR => 'DS', Name => 'SoftTissueSurfaceThermalIndex' },
+    '0018,5030' => { VR => 'DS', Name => 'DynamicRange' },
+    '0018,5040' => { VR => 'DS', Name => 'TotalGain' },
+    '0018,5050' => { VR => 'IS', Name => 'DepthOfScanField' },
+    '0018,5100' => { VR => 'CS', Name => 'PatientPosition' },
+    '0018,5101' => { VR => 'CS', Name => 'ViewPosition' },
+    '0018,5104' => { VR => 'SQ', Name => 'ProjectionEponymousNameCodeSeq' },
+    '0018,5210' => { VR => 'DS', Name => 'ImageTransformationMatrix' },
+    '0018,5212' => { VR => 'DS', Name => 'ImageTranslationVector' },
+    '0018,6000' => { VR => 'DS', Name => 'Sensitivity' },
+    '0018,6011' => { VR => 'SQ', Name => 'SequenceOfUltrasoundRegions' },
+    '0018,6012' => { VR => 'US', Name => 'RegionSpatialFormat' },
+    '0018,6014' => { VR => 'US', Name => 'RegionDataType' },
+    '0018,6016' => { VR => 'UL', Name => 'RegionFlags' },
+    '0018,6018' => { VR => 'UL', Name => 'RegionLocationMinX0' },
+    '0018,601A' => { VR => 'UL', Name => 'RegionLocationMinY0' },
+    '0018,601C' => { VR => 'UL', Name => 'RegionLocationMaxX1' },
+    '0018,601E' => { VR => 'UL', Name => 'RegionLocationMaxY1' },
+    '0018,6020' => { VR => 'SL', Name => 'ReferencePixelX0' },
+    '0018,6022' => { VR => 'SL', Name => 'ReferencePixelY0' },
+    '0018,6024' => { VR => 'US', Name => 'PhysicalUnitsXDirection' },
+    '0018,6026' => { VR => 'US', Name => 'PhysicalUnitsYDirection' },
+    '0018,6028' => { VR => 'FD', Name => 'ReferencePixelPhysicalValueX' },
+    '0018,602A' => { VR => 'FD', Name => 'ReferencePixelPhysicalValueY' },
+    '0018,602C' => { VR => 'FD', Name => 'PhysicalDeltaX' },
+    '0018,602E' => { VR => 'FD', Name => 'PhysicalDeltaY' },
+    '0018,6030' => { VR => 'UL', Name => 'TransducerFrequency' },
+    '0018,6031' => { VR => 'CS', Name => 'TransducerType' },
+    '0018,6032' => { VR => 'UL', Name => 'PulseRepetitionFrequency' },
+    '0018,6034' => { VR => 'FD', Name => 'DopplerCorrectionAngle' },
+    '0018,6036' => { VR => 'FD', Name => 'SteeringAngle' },
+    '0018,6038' => { VR => 'UL', Name => 'DopplerSampleVolumeXPosRetired' },
+    '0018,6039' => { VR => 'SL', Name => 'DopplerSampleVolumeXPosition' },
+    '0018,603A' => { VR => 'UL', Name => 'DopplerSampleVolumeYPosRetired' },
+    '0018,603B' => { VR => 'SL', Name => 'DopplerSampleVolumeYPosition' },
+    '0018,603C' => { VR => 'UL', Name => 'TMLinePositionX0Retired' },
+    '0018,603D' => { VR => 'SL', Name => 'TMLinePositionX0' },
+    '0018,603E' => { VR => 'UL', Name => 'TMLinePositionY0Retired' },
+    '0018,603F' => { VR => 'SL', Name => 'TMLinePositionY0' },
+    '0018,6040' => { VR => 'UL', Name => 'TMLinePositionX1Retired' },
+    '0018,6041' => { VR => 'SL', Name => 'TMLinePositionX1' },
+    '0018,6042' => { VR => 'UL', Name => 'TMLinePositionY1Retired' },
+    '0018,6043' => { VR => 'SL', Name => 'TMLinePositionY1' },
+    '0018,6044' => { VR => 'US', Name => 'PixelComponentOrganization' },
+    '0018,6046' => { VR => 'UL', Name => 'PixelComponentMask' },
+    '0018,6048' => { VR => 'UL', Name => 'PixelComponentRangeStart' },
+    '0018,604A' => { VR => 'UL', Name => 'PixelComponentRangeStop' },
+    '0018,604C' => { VR => 'US', Name => 'PixelComponentPhysicalUnits' },
+    '0018,604E' => { VR => 'US', Name => 'PixelComponentDataType' },
+    '0018,6050' => { VR => 'UL', Name => 'NumberOfTableBreakPoints' },
+    '0018,6052' => { VR => 'UL', Name => 'TableOfXBreakPoints' },
+    '0018,6054' => { VR => 'FD', Name => 'TableOfYBreakPoints' },
+    '0018,6056' => { VR => 'UL', Name => 'NumberOfTableEntries' },
+    '0018,6058' => { VR => 'UL', Name => 'TableOfPixelValues' },
+    '0018,605A' => { VR => 'FL', Name => 'TableOfParameterValues' },
+    '0018,6060' => { VR => 'FL', Name => 'RWaveTimeVector' },
+    '0018,7000' => { VR => 'CS', Name => 'DetectorConditionsNominalFlag' },
+    '0018,7001' => { VR => 'DS', Name => 'DetectorTemperature' },
+    '0018,7004' => { VR => 'CS', Name => 'DetectorType' },
+    '0018,7005' => { VR => 'CS', Name => 'DetectorConfiguration' },
+    '0018,7006' => { VR => 'LT', Name => 'DetectorDescription' },
+    '0018,7008' => { VR => 'LT', Name => 'DetectorMode' },
+    '0018,700A' => { VR => 'SH', Name => 'DetectorID' },
+    '0018,700C' => { VR => 'DA', Name => 'DateOfLastDetectorCalibration' },
+    '0018,700E' => { VR => 'TM', Name => 'TimeOfLastDetectorCalibration' },
+    '0018,7010' => { VR => 'IS', Name => 'DetectorExposuresSinceCalibration' },
+    '0018,7011' => { VR => 'IS', Name => 'DetectorExposuresSinceManufactured' },
+    '0018,7012' => { VR => 'DS', Name => 'DetectorTimeSinceLastExposure' },
+    '0018,7014' => { VR => 'DS', Name => 'DetectorActiveTime' },
+    '0018,7016' => { VR => 'DS', Name => 'DetectorActiveOffsetFromExposure' },
+    '0018,701A' => { VR => 'DS', Name => 'DetectorBinning' },
+    '0018,7020' => { VR => 'DS', Name => 'DetectorElementPhysicalSize' },
+    '0018,7022' => { VR => 'DS', Name => 'DetectorElementSpacing' },
+    '0018,7024' => { VR => 'CS', Name => 'DetectorActiveShape' },
+    '0018,7026' => { VR => 'DS', Name => 'DetectorActiveDimensions' },
+    '0018,7028' => { VR => 'DS', Name => 'DetectorActiveOrigin' },
+    '0018,702A' => { VR => 'LO', Name => 'DetectorManufacturerName' },
+    '0018,702B' => { VR => 'LO', Name => 'DetectorManufacturersModelName' },
+    '0018,7030' => { VR => 'DS', Name => 'FieldOfViewOrigin' },
+    '0018,7032' => { VR => 'DS', Name => 'FieldOfViewRotation' },
+    '0018,7034' => { VR => 'CS', Name => 'FieldOfViewHorizontalFlip' },
+    '0018,7040' => { VR => 'LT', Name => 'GridAbsorbingMaterial' },
+    '0018,7041' => { VR => 'LT', Name => 'GridSpacingMaterial' },
+    '0018,7042' => { VR => 'DS', Name => 'GridThickness' },
+    '0018,7044' => { VR => 'DS', Name => 'GridPitch' },
+    '0018,7046' => { VR => 'IS', Name => 'GridAspectRatio' },
+    '0018,7048' => { VR => 'DS', Name => 'GridPeriod' },
+    '0018,704C' => { VR => 'DS', Name => 'GridFocalDistance' },
+    '0018,7050' => { VR => 'CS', Name => 'FilterMaterial' },
+    '0018,7052' => { VR => 'DS', Name => 'FilterThicknessMinimum' },
+    '0018,7054' => { VR => 'DS', Name => 'FilterThicknessMaximum' },
+    '0018,7060' => { VR => 'CS', Name => 'ExposureControlMode' },
+    '0018,7062' => { VR => 'LT', Name => 'ExposureControlModeDescription' },
+    '0018,7064' => { VR => 'CS', Name => 'ExposureStatus' },
+    '0018,7065' => { VR => 'DS', Name => 'PhototimerSetting' },
+    '0018,8150' => { VR => 'DS', Name => 'ExposureTimeInMicroSec' },
+    '0018,8151' => { VR => 'DS', Name => 'XRayTubeCurrentInMicroAmps' },
+    '0018,9004' => { VR => 'CS', Name => 'ContentQualification' },
+    '0018,9005' => { VR => 'SH', Name => 'PulseSequenceName' },
+    '0018,9006' => { VR => 'SQ', Name => 'MRImagingModifierSequence' },
+    '0018,9008' => { VR => 'CS', Name => 'EchoPulseSequence' },
+    '0018,9009' => { VR => 'CS', Name => 'InversionRecovery' },
+    '0018,9010' => { VR => 'CS', Name => 'FlowCompensation' },
+    '0018,9011' => { VR => 'CS', Name => 'MultipleSpinEcho' },
+    '0018,9012' => { VR => 'CS', Name => 'MultiPlanarExcitation' },
+    '0018,9014' => { VR => 'CS', Name => 'PhaseContrast' },
+    '0018,9015' => { VR => 'CS', Name => 'TimeOfFlightContrast' },
+    '0018,9016' => { VR => 'CS', Name => 'Spoiling' },
+    '0018,9017' => { VR => 'CS', Name => 'SteadyStatePulseSequence' },
+    '0018,9018' => { VR => 'CS', Name => 'EchoPlanarPulseSequence' },
+    '0018,9019' => { VR => 'FD', Name => 'TagAngleFirstAxis' },
+    '0018,9020' => { VR => 'CS', Name => 'MagnetizationTransfer' },
+    '0018,9021' => { VR => 'CS', Name => 'T2Preparation' },
+    '0018,9022' => { VR => 'CS', Name => 'BloodSignalNulling' },
+    '0018,9022' => { VR => 'CS', Name => 'BloodSignalNulling' },
+    '0018,9024' => { VR => 'CS', Name => 'SaturationRecovery' },
+    '0018,9025' => { VR => 'CS', Name => 'SpectrallySelectedSuppression' },
+    '0018,9026' => { VR => 'CS', Name => 'SpectrallySelectedExcitation' },
+    '0018,9027' => { VR => 'CS', Name => 'SpatialPresaturation' },
+    '0018,9028' => { VR => 'CS', Name => 'Tagging' },
+    '0018,9029' => { VR => 'CS', Name => 'OversamplingPhase' },
+    '0018,9030' => { VR => 'FD', Name => 'TagSpacingFirstDimension' },
+    '0018,9032' => { VR => 'CS', Name => 'GeometryOfKSpaceTraversal' },
+    '0018,9033' => { VR => 'CS', Name => 'SegmentedKSpaceTraversal' },
+    '0018,9034' => { VR => 'CS', Name => 'RectilinearPhaseEncodeReordering' },
+    '0018,9035' => { VR => 'FD', Name => 'TagThickness' },
+    '0018,9036' => { VR => 'CS', Name => 'PartialFourierDirection' },
+    '0018,9037' => { VR => 'CS', Name => 'CardiacSynchronizationTechnique' },
+    '0018,9041' => { VR => 'LO', Name => 'ReceiveCoilManufacturerName' },
+    '0018,9042' => { VR => 'SQ', Name => 'MRReceiveCoilSequence' },
+    '0018,9043' => { VR => 'CS', Name => 'ReceiveCoilType' },
+    '0018,9044' => { VR => 'CS', Name => 'QuadratureReceiveCoil' },
+    '0018,9045' => { VR => 'SQ', Name => 'MultiCoilDefinitionSequence' },
+    '0018,9046' => { VR => 'LO', Name => 'MultiCoilConfiguration' },
+    '0018,9047' => { VR => 'SH', Name => 'MultiCoilElementName' },
+    '0018,9048' => { VR => 'CS', Name => 'MultiCoilElementUsed' },
+    '0018,9049' => { VR => 'SQ', Name => 'MRTransmitCoilSequence' },
+    '0018,9050' => { VR => 'LO', Name => 'TransmitCoilManufacturerName' },
+    '0018,9051' => { VR => 'CS', Name => 'TransmitCoilType' },
+    '0018,9052' => { VR => 'FD', Name => 'SpectralWidth' },
+    '0018,9053' => { VR => 'FD', Name => 'ChemicalShiftReference' },
+    '0018,9054' => { VR => 'CS', Name => 'VolumeLocalizationTechnique' },
+    '0018,9058' => { VR => 'US', Name => 'MRAcquisitionFrequencyEncodeSteps' },
+    '0018,9059' => { VR => 'CS', Name => 'Decoupling' },
+    '0018,9060' => { VR => 'CS', Name => 'DecoupledNucleus' },
+    '0018,9061' => { VR => 'FD', Name => 'DecouplingFrequency' },
+    '0018,9062' => { VR => 'CS', Name => 'DecouplingMethod' },
+    '0018,9063' => { VR => 'FD', Name => 'DecouplingChemicalShiftReference' },
+    '0018,9064' => { VR => 'CS', Name => 'KSpaceFiltering' },
+    '0018,9065' => { VR => 'CS', Name => 'TimeDomainFiltering' },
+    '0018,9066' => { VR => 'US', Name => 'NumberOfZeroFills' },
+    '0018,9067' => { VR => 'CS', Name => 'BaselineCorrection' },
+    '0018,9069' => { VR => 'FD', Name => 'ParallelReductionFactorInPlane' },
+    '0018,9070' => { VR => 'FD', Name => 'CardiacRRIntervalSpecified' },
+    '0018,9073' => { VR => 'FD', Name => 'AcquisitionDuration' },
+    '0018,9074' => { VR => 'DT', Name => 'FrameAcquisitionDateTime' },
+    '0018,9075' => { VR => 'CS', Name => 'DiffusionDirectionality' },
+    '0018,9076' => { VR => 'SQ', Name => 'DiffusionGradientDirectionSequence' },
+    '0018,9077' => { VR => 'CS', Name => 'ParallelAcquisition' },
+    '0018,9078' => { VR => 'CS', Name => 'ParallelAcquisitionTechnique' },
+    '0018,9079' => { VR => 'FD', Name => 'InversionTimes' },
+    '0018,9080' => { VR => 'ST', Name => 'MetaboliteMapDescription' },
+    '0018,9081' => { VR => 'CS', Name => 'PartialFourier' },
+    '0018,9082' => { VR => 'FD', Name => 'EffectiveEchoTime' },
+    '0018,9083' => { VR => 'SQ', Name => 'MetaboliteMapCodeSequence' },
+    '0018,9084' => { VR => 'SQ', Name => 'ChemicalShiftSequence' },
+    '0018,9085' => { VR => 'CS', Name => 'CardiacSignalSource' },
+    '0018,9087' => { VR => 'FD', Name => 'DiffusionBValue' },
+    '0018,9089' => { VR => 'FD', Name => 'DiffusionGradientOrientation' },
+    '0018,9090' => { VR => 'FD', Name => 'VelocityEncodingDirection' },
+    '0018,9091' => { VR => 'FD', Name => 'VelocityEncodingMinimumValue' },
+    '0018,9093' => { VR => 'US', Name => 'NumberOfKSpaceTrajectories' },
+    '0018,9094' => { VR => 'CS', Name => 'CoverageOfKSpace' },
+    '0018,9095' => { VR => 'UL', Name => 'SpectroscopyAcquisitionPhaseRows' },
+    '0018,9096' => { VR => 'FD', Name => 'ParallelReductFactorInPlaneRetired' },
+    '0018,9098' => { VR => 'FD', Name => 'TransmitterFrequency' },
+    '0018,9100' => { VR => 'CS', Name => 'ResonantNucleus' },
+    '0018,9101' => { VR => 'CS', Name => 'FrequencyCorrection' },
+    '0018,9103' => { VR => 'SQ', Name => 'MRSpectroscopyFOV-GeometrySequence' },
+    '0018,9104' => { VR => 'FD', Name => 'SlabThickness' },
+    '0018,9105' => { VR => 'FD', Name => 'SlabOrientation' },
+    '0018,9106' => { VR => 'FD', Name => 'MidSlabPosition' },
+    '0018,9107' => { VR => 'SQ', Name => 'MRSpatialSaturationSequence' },
+    '0018,9112' => { VR => 'SQ', Name => 'MRTimingAndRelatedParametersSeq' },
+    '0018,9114' => { VR => 'SQ', Name => 'MREchoSequence' },
+    '0018,9115' => { VR => 'SQ', Name => 'MRModifierSequence' },
+    '0018,9117' => { VR => 'SQ', Name => 'MRDiffusionSequence' },
+    '0018,9118' => { VR => 'SQ', Name => 'CardiacTriggerSequence' },
+    '0018,9119' => { VR => 'SQ', Name => 'MRAveragesSequence' },
+    '0018,9125' => { VR => 'SQ', Name => 'MRFOV-GeometrySequence' },
+    '0018,9126' => { VR => 'SQ', Name => 'VolumeLocalizationSequence' },
+    '0018,9127' => { VR => 'UL', Name => 'SpectroscopyAcquisitionDataColumns' },
+    '0018,9147' => { VR => 'CS', Name => 'DiffusionAnisotropyType' },
+    '0018,9151' => { VR => 'DT', Name => 'FrameReferenceDateTime' },
+    '0018,9152' => { VR => 'SQ', Name => 'MRMetaboliteMapSequence' },
+    '0018,9155' => { VR => 'FD', Name => 'ParallelReductionFactorOutOfPlane' },
+    '0018,9159' => { VR => 'UL', Name => 'SpectroscopyOutOfPlanePhaseSteps' },
+    '0018,9166' => { VR => 'CS', Name => 'BulkMotionStatus' },
+    '0018,9168' => { VR => 'FD', Name => 'ParallelReductionFactSecondInPlane' },
+    '0018,9169' => { VR => 'CS', Name => 'CardiacBeatRejectionTechnique' },
+    '0018,9170' => { VR => 'CS', Name => 'RespiratoryMotionCompTechnique' },
+    '0018,9171' => { VR => 'CS', Name => 'RespiratorySignalSource' },
+    '0018,9172' => { VR => 'CS', Name => 'BulkMotionCompensationTechnique' },
+    '0018,9173' => { VR => 'CS', Name => 'BulkMotionSignalSource' },
+    '0018,9174' => { VR => 'CS', Name => 'ApplicableSafetyStandardAgency' },
+    '0018,9175' => { VR => 'LO', Name => 'ApplicableSafetyStandardDescr' },
+    '0018,9176' => { VR => 'SQ', Name => 'OperatingModeSequence' },
+    '0018,9177' => { VR => 'CS', Name => 'OperatingModeType' },
+    '0018,9178' => { VR => 'CS', Name => 'OperatingMode' },
+    '0018,9179' => { VR => 'CS', Name => 'SpecificAbsorptionRateDefinition' },
+    '0018,9180' => { VR => 'CS', Name => 'GradientOutputType' },
+    '0018,9181' => { VR => 'FD', Name => 'SpecificAbsorptionRateValue' },
+    '0018,9182' => { VR => 'FD', Name => 'GradientOutput' },
+    '0018,9183' => { VR => 'CS', Name => 'FlowCompensationDirection' },
+    '0018,9184' => { VR => 'FD', Name => 'TaggingDelay' },
+    '0018,9185' => { VR => 'ST', Name => 'RespiratoryMotionCompTechDescr' },
+    '0018,9186' => { VR => 'SH', Name => 'RespiratorySignalSourceID' },
+    '0018,9195' => { VR => 'FD', Name => 'ChemicalShiftsMinIntegrateLimitHz' },
+    '0018,9196' => { VR => 'FD', Name => 'ChemicalShiftsMaxIntegrateLimitHz' },
+    '0018,9197' => { VR => 'SQ', Name => 'MRVelocityEncodingSequence' },
+    '0018,9198' => { VR => 'CS', Name => 'FirstOrderPhaseCorrection' },
+    '0018,9199' => { VR => 'CS', Name => 'WaterReferencedPhaseCorrection' },
+    '0018,9200' => { VR => 'CS', Name => 'MRSpectroscopyAcquisitionType' },
+    '0018,9214' => { VR => 'CS', Name => 'RespiratoryCyclePosition' },
+    '0018,9217' => { VR => 'FD', Name => 'VelocityEncodingMaximumValue' },
+    '0018,9218' => { VR => 'FD', Name => 'TagSpacingSecondDimension' },
+    '0018,9219' => { VR => 'SS', Name => 'TagAngleSecondAxis' },
+    '0018,9220' => { VR => 'FD', Name => 'FrameAcquisitionDuration' },
+    '0018,9226' => { VR => 'SQ', Name => 'MRImageFrameTypeSequence' },
+    '0018,9227' => { VR => 'SQ', Name => 'MRSpectroscopyFrameTypeSequence' },
+    '0018,9231' => { VR => 'US', Name => 'MRAcqPhaseEncodingStepsInPlane' },
+    '0018,9232' => { VR => 'US', Name => 'MRAcqPhaseEncodingStepsOutOfPlane' },
+    '0018,9234' => { VR => 'UL', Name => 'SpectroscopyAcqPhaseColumns' },
+    '0018,9236' => { VR => 'CS', Name => 'CardiacCyclePosition' },
+    '0018,9239' => { VR => 'SQ', Name => 'SpecificAbsorptionRateSequence' },
+    '0018,9240' => { VR => 'US', Name => 'RFEchoTrainLength' },
+    '0018,9241' => { VR => 'US', Name => 'GradientEchoTrainLength' },
+    '0018,9295' => { VR => 'FD', Name => 'ChemicalShiftsMinIntegrateLimitPPM' },
+    '0018,9296' => { VR => 'FD', Name => 'ChemicalShiftsMaxIntegrateLimitPPM' },
+    '0018,9301' => { VR => 'SQ', Name => 'CTAcquisitionTypeSequence' },
+    '0018,9302' => { VR => 'CS', Name => 'AcquisitionType' },
+    '0018,9303' => { VR => 'FD', Name => 'TubeAngle' },
+    '0018,9304' => { VR => 'SQ', Name => 'CTAcquisitionDetailsSequence' },
+    '0018,9305' => { VR => 'FD', Name => 'RevolutionTime' },
+    '0018,9306' => { VR => 'FD', Name => 'SingleCollimationWidth' },
+    '0018,9307' => { VR => 'FD', Name => 'TotalCollimationWidth' },
+    '0018,9308' => { VR => 'SQ', Name => 'CTTableDynamicsSequence' },
+    '0018,9309' => { VR => 'FD', Name => 'TableSpeed' },
+    '0018,9310' => { VR => 'FD', Name => 'TableFeedPerRotation' },
+    '0018,9311' => { VR => 'FD', Name => 'SpiralPitchFactor' },
+    '0018,9312' => { VR => 'SQ', Name => 'CTGeometrySequence' },
+    '0018,9313' => { VR => 'FD', Name => 'DataCollectionCenterPatient' },
+    '0018,9314' => { VR => 'SQ', Name => 'CTReconstructionSequence' },
+    '0018,9315' => { VR => 'CS', Name => 'ReconstructionAlgorithm' },
+    '0018,9316' => { VR => 'CS', Name => 'ConvolutionKernelGroup' },
+    '0018,9317' => { VR => 'FD', Name => 'ReconstructionFieldOfView' },
+    '0018,9318' => { VR => 'FD', Name => 'ReconstructionTargetCenterPatient' },
+    '0018,9319' => { VR => 'FD', Name => 'ReconstructionAngle' },
+    '0018,9320' => { VR => 'SH', Name => 'ImageFilter' },
+    '0018,9321' => { VR => 'SQ', Name => 'CTExposureSequence' },
+    '0018,9322' => { VR => 'FD', Name => 'ReconstructionPixelSpacing' },
+    '0018,9323' => { VR => 'CS', Name => 'ExposureModulationType' },
+    '0018,9324' => { VR => 'FD', Name => 'EstimatedDoseSaving' },
+    '0018,9325' => { VR => 'SQ', Name => 'CTXRayDetailsSequence' },
+    '0018,9326' => { VR => 'SQ', Name => 'CTPositionSequence' },
+    '0018,9327' => { VR => 'FD', Name => 'TablePosition' },
+    '0018,9328' => { VR => 'FD', Name => 'ExposureTimeInMilliSec' },
+    '0018,9329' => { VR => 'SQ', Name => 'CTImageFrameTypeSequence' },
+    '0018,9330' => { VR => 'FD', Name => 'XRayTubeCurrentInMilliAmps' },
+    '0018,9332' => { VR => 'FD', Name => 'ExposureInMilliAmpSec' },
+    '0018,9333' => { VR => 'CS', Name => 'ConstantVolumeFlag' },
+    '0018,9334' => { VR => 'CS', Name => 'FluoroscopyFlag' },
+    '0018,9335' => { VR => 'FD', Name => 'SourceToDataCollectionCenterDist' },
+    '0018,9337' => { VR => 'US', Name => 'ContrastBolusAgentNumber' },
+    '0018,9338' => { VR => 'SQ', Name => 'ContrastBolusIngredientCodeSeq' },
+    '0018,9340' => { VR => 'SQ', Name => 'ContrastAdministrationProfileSeq' },
+    '0018,9341' => { VR => 'SQ', Name => 'ContrastBolusUsageSequence' },
+    '0018,9342' => { VR => 'CS', Name => 'ContrastBolusAgentAdministered' },
+    '0018,9343' => { VR => 'CS', Name => 'ContrastBolusAgentDetected' },
+    '0018,9344' => { VR => 'CS', Name => 'ContrastBolusAgentPhase' },
+    '0018,9345' => { VR => 'FD', Name => 'CTDIvol' },
+    '0018,9346' => { VR => 'SQ', Name => 'CTDIPhantomTypeCodeSequence' },
+    '0018,9351' => { VR => 'FL', Name => 'CalciumScoringMassFactorPatient' },
+    '0018,9352' => { VR => 'FL', Name => 'CalciumScoringMassFactorDevice' },
+    '0018,9353' => { VR => 'FL', Name => 'EnergyWeightingFactor' },
+    '0018,9360' => { VR => 'SQ', Name => 'CTAdditionalXRaySourceSequence' },
+    '0018,9401' => { VR => 'SQ', Name => 'ProjectionPixelCalibrationSequence' },
+    '0018,9402' => { VR => 'FL', Name => 'DistanceSourceToIsocenter' },
+    '0018,9403' => { VR => 'FL', Name => 'DistanceObjectToTableTop' },
+    '0018,9404' => { VR => 'FL', Name => 'ObjectPixelSpacingInCenterOfBeam' },
+    '0018,9405' => { VR => 'SQ', Name => 'PositionerPositionSequence' },
+    '0018,9406' => { VR => 'SQ', Name => 'TablePositionSequence' },
+    '0018,9407' => { VR => 'SQ', Name => 'CollimatorShapeSequence' },
+    '0018,9412' => { VR => 'SQ', Name => 'XA-XRFFrameCharacteristicsSequence' },
+    '0018,9417' => { VR => 'SQ', Name => 'FrameAcquisitionSequence' },
+    '0018,9420' => { VR => 'CS', Name => 'XRayReceptorType' },
+    '0018,9423' => { VR => 'LO', Name => 'AcquisitionProtocolName' },
+    '0018,9424' => { VR => 'LT', Name => 'AcquisitionProtocolDescription' },
+    '0018,9425' => { VR => 'CS', Name => 'ContrastBolusIngredientOpaque' },
+    '0018,9426' => { VR => 'FL', Name => 'DistanceReceptorPlaneToDetHousing' },
+    '0018,9427' => { VR => 'CS', Name => 'IntensifierActiveShape' },
+    '0018,9428' => { VR => 'FL', Name => 'IntensifierActiveDimensions' },
+    '0018,9429' => { VR => 'FL', Name => 'PhysicalDetectorSize' },
+    '0018,9430' => { VR => 'US', Name => 'PositionOfIsocenterProjection' },
+    '0018,9432' => { VR => 'SQ', Name => 'FieldOfViewSequence' },
+    '0018,9433' => { VR => 'LO', Name => 'FieldOfViewDescription' },
+    '0018,9434' => { VR => 'SQ', Name => 'ExposureControlSensingRegionsSeq' },
+    '0018,9435' => { VR => 'CS', Name => 'ExposureControlSensingRegionShape' },
+    '0018,9436' => { VR => 'SS', Name => 'ExposureControlSensRegionLeftEdge' },
+    '0018,9437' => { VR => 'SS', Name => 'ExposureControlSensRegionRightEdge' },
+    '0018,9440' => { VR => 'SS', Name => 'CenterOfCircExposControlSensRegion' },
+    '0018,9441' => { VR => 'US', Name => 'RadiusOfCircExposControlSensRegion' },
+    '0018,9447' => { VR => 'FL', Name => 'ColumnAngulationPatient' },
+    '0018,9449' => { VR => 'FL', Name => 'BeamAngle' },
+    '0018,9451' => { VR => 'SQ', Name => 'FrameDetectorParametersSequence' },
+    '0018,9452' => { VR => 'FL', Name => 'CalculatedAnatomyThickness' },
+    '0018,9455' => { VR => 'SQ', Name => 'CalibrationSequence' },
+    '0018,9456' => { VR => 'SQ', Name => 'ObjectThicknessSequence' },
+    '0018,9457' => { VR => 'CS', Name => 'PlaneIdentification' },
+    '0018,9461' => { VR => 'FL', Name => 'FieldOfViewDimensionsInFloat' },
+    '0018,9462' => { VR => 'SQ', Name => 'IsocenterReferenceSystemSequence' },
+    '0018,9463' => { VR => 'FL', Name => 'PositionerIsocenterPrimaryAngle' },
+    '0018,9464' => { VR => 'FL', Name => 'PositionerIsocenterSecondaryAngle' },
+    '0018,9465' => { VR => 'FL', Name => 'PositionerIsocenterDetRotAngle' },
+    '0018,9466' => { VR => 'FL', Name => 'TableXPositionToIsocenter' },
+    '0018,9467' => { VR => 'FL', Name => 'TableYPositionToIsocenter' },
+    '0018,9468' => { VR => 'FL', Name => 'TableZPositionToIsocenter' },
+    '0018,9469' => { VR => 'FL', Name => 'TableHorizontalRotationAngle' },
+    '0018,9470' => { VR => 'FL', Name => 'TableHeadTiltAngle' },
+    '0018,9471' => { VR => 'FL', Name => 'TableCradleTiltAngle' },
+    '0018,9472' => { VR => 'SQ', Name => 'FrameDisplayShutterSequence' },
+    '0018,9473' => { VR => 'FL', Name => 'AcquiredImageAreaDoseProduct' },
+    '0018,9474' => { VR => 'CS', Name => 'CArmPositionerTabletopRelationship' },
+    '0018,9476' => { VR => 'SQ', Name => 'XRayGeometrySequence' },
+    '0018,9477' => { VR => 'SQ', Name => 'IrradiationEventIDSequence' },
+    '0018,9504' => { VR => 'SQ', Name => 'XRay3DFrameTypeSequence' },
+    '0018,9506' => { VR => 'SQ', Name => 'ContributingSourcesSequence' },
+    '0018,9507' => { VR => 'SQ', Name => 'XRay3DAcquisitionSequence' },
+    '0018,9508' => { VR => 'FL', Name => 'PrimaryPositionerScanArc' },
+    '0018,9509' => { VR => 'FL', Name => 'SecondaryPositionerScanArc' },
+    '0018,9510' => { VR => 'FL', Name => 'PrimaryPositionerScanStartAngle' },
+    '0018,9511' => { VR => 'FL', Name => 'SecondaryPositionerScanStartAngle' },
+    '0018,9514' => { VR => 'FL', Name => 'PrimaryPositionerIncrement' },
+    '0018,9515' => { VR => 'FL', Name => 'SecondaryPositionerIncrement' },
+    '0018,9516' => { VR => 'DT', Name => 'StartAcquisitionDateTime' },
+    '0018,9517' => { VR => 'DT', Name => 'EndAcquisitionDateTime' },
+    '0018,9524' => { VR => 'LO', Name => 'ApplicationName' },
+    '0018,9525' => { VR => 'LO', Name => 'ApplicationVersion' },
+    '0018,9526' => { VR => 'LO', Name => 'ApplicationManufacturer' },
+    '0018,9527' => { VR => 'CS', Name => 'AlgorithmType' },
+    '0018,9528' => { VR => 'LO', Name => 'AlgorithmDescription' },
+    '0018,9530' => { VR => 'SQ', Name => 'XRay3DReconstructionSequence' },
+    '0018,9531' => { VR => 'LO', Name => 'ReconstructionDescription' },
+    '0018,9538' => { VR => 'SQ', Name => 'PerProjectionAcquisitionSequence' },
+    '0018,9601' => { VR => 'SQ', Name => 'DiffusionBMatrixSequence' },
+    '0018,9602' => { VR => 'FD', Name => 'DiffusionBValueXX' },
+    '0018,9603' => { VR => 'FD', Name => 'DiffusionBValueXY' },
+    '0018,9604' => { VR => 'FD', Name => 'DiffusionBValueXZ' },
+    '0018,9605' => { VR => 'FD', Name => 'DiffusionBValueYY' },
+    '0018,9606' => { VR => 'FD', Name => 'DiffusionBValueYZ' },
+    '0018,9607' => { VR => 'FD', Name => 'DiffusionBValueZZ' },
+    '0018,9701' => { VR => 'DT', Name => 'DecayCorrectionDateTime' },
+    '0018,9715' => { VR => 'FD', Name => 'StartDensityThreshold' },
+    '0018,9722' => { VR => 'FD', Name => 'TerminationTimeThreshold' },
+    '0018,9725' => { VR => 'CS', Name => 'DetectorGeometry' },
+    '0018,9727' => { VR => 'FD', Name => 'AxialDetectorDimension' },
+    '0018,9735' => { VR => 'SQ', Name => 'PETPositionSequence' },
+    '0018,9739' => { VR => 'US', Name => 'NumberOfIterations' },
+    '0018,9740' => { VR => 'US', Name => 'NumberOfSubsets' },
+    '0018,9751' => { VR => 'SQ', Name => 'PETFrameTypeSequence' },
+    '0018,9756' => { VR => 'CS', Name => 'ReconstructionType' },
+    '0018,9758' => { VR => 'CS', Name => 'DecayCorrected' },
+    '0018,9759' => { VR => 'CS', Name => 'AttenuationCorrected' },
+    '0018,9760' => { VR => 'CS', Name => 'ScatterCorrected' },
+    '0018,9761' => { VR => 'CS', Name => 'DeadTimeCorrected' },
+    '0018,9762' => { VR => 'CS', Name => 'GantryMotionCorrected' },
+    '0018,9763' => { VR => 'CS', Name => 'PatientMotionCorrected' },
+    '0018,9765' => { VR => 'CS', Name => 'RandomsCorrected' },
+    '0018,9767' => { VR => 'CS', Name => 'SensitivityCalibrated' },
+    '0018,9801' => { VR => 'FD', Name => 'DepthsOfFocus' },
+    '0018,9804' => { VR => 'DT', Name => 'ExclusionStartDatetime' },
+    '0018,9805' => { VR => 'FD', Name => 'ExclusionDuration' },
+    '0018,9807' => { VR => 'SQ', Name => 'ImageDataTypeSequence' },
+    '0018,9808' => { VR => 'CS', Name => 'DataType' },
+    '0018,980B' => { VR => 'CS', Name => 'AliasedDataType' },
+    '0018,A001' => { VR => 'SQ', Name => 'ContributingEquipmentSequence' },
+    '0018,A002' => { VR => 'DT', Name => 'ContributionDateTime' },
+    '0018,A003' => { VR => 'ST', Name => 'ContributionDescription' },
+    # GEMS_ACQU_01 (ref 4)
+    '0019,1002' => { VR => 'SL', Name => 'NumberOfCellsIInDetector' },
+    '0019,1003' => { VR => 'DS', Name => 'CellNumberAtTheta' },
+    '0019,1004' => { VR => 'DS', Name => 'CellSpacing' },
+    '0019,100F' => { VR => 'DS', Name => 'HorizFrameOfRef' },
+    '0019,1011' => { VR => 'SS', Name => 'SeriesContrast' },
+    '0019,1012' => { VR => 'SS', Name => 'LastPseq' },
+    '0019,1013' => { VR => 'SS', Name => 'StartNumberForBaseline' },
+    '0019,1014' => { VR => 'SS', Name => 'EndNumberForBaseline' },
+    '0019,1015' => { VR => 'SS', Name => 'StartNumberForEnhancedScans' },
+    '0019,1016' => { VR => 'SS', Name => 'EndNumberForEnhancedScans' },
+    '0019,1017' => { VR => 'SS', Name => 'SeriesPlane' },
+    '0019,1018' => { VR => 'LO', Name => 'FirstScanRas' },
+    '0019,1019' => { VR => 'DS', Name => 'FirstScanLocation' },
+    '0019,101A' => { VR => 'LO', Name => 'LastScanRas' },
+    '0019,101B' => { VR => 'DS', Name => 'LastScanLoc' },
+    '0019,101E' => { VR => 'DS', Name => 'DisplayFieldOfView' },
+    '0019,1023' => { VR => 'DS', Name => 'TableSpeed' },
+    '0019,1024' => { VR => 'DS', Name => 'MidScanTime' },
+    '0019,1025' => { VR => 'SS', Name => 'MidScanFlag' },
+    '0019,1026' => { VR => 'SL', Name => 'DegreesOfAzimuth' },
+    '0019,1027' => { VR => 'DS', Name => 'GantryPeriod' },
+    '0019,102A' => { VR => 'DS', Name => 'XRayOnPosition' },
+    '0019,102B' => { VR => 'DS', Name => 'XRayOffPosition' },
+    '0019,102C' => { VR => 'SL', Name => 'NumberOfTriggers' },
+    '0019,102E' => { VR => 'DS', Name => 'AngleOfFirstView' },
+    '0019,102F' => { VR => 'DS', Name => 'TriggerFrequency' },
+    '0019,1039' => { VR => 'SS', Name => 'ScanFOVType' },
+    '0019,1040' => { VR => 'SS', Name => 'StatReconFlag' },
+    '0019,1041' => { VR => 'SS', Name => 'ComputeType' },
+    '0019,1042' => { VR => 'SS', Name => 'SegmentNumber' },
+    '0019,1043' => { VR => 'SS', Name => 'TotalSegmentsRequested' },
+    '0019,1044' => { VR => 'DS', Name => 'InterscanDelay' },
+    '0019,1047' => { VR => 'SS', Name => 'ViewCompressionFactor' },
+    '0019,104A' => { VR => 'SS', Name => 'TotalNoOfRefChannels' },
+    '0019,104B' => { VR => 'SL', Name => 'DataSizeForScanData' },
+    '0019,1052' => { VR => 'SS', Name => 'ReconPostProcflag' },
+    '0019,1057' => { VR => 'SS', Name => 'CTWaterNumber' },
+    '0019,1058' => { VR => 'SS', Name => 'CTBoneNumber' },
+    '0019,105A' => { VR => 'FL', Name => 'AcquisitionDuration' },
+    '0019,105E' => { VR => 'SL', Name => 'NumberOfChannels' },
+    '0019,105F' => { VR => 'SL', Name => 'IncrementBetweenChannels' },
+    '0019,1060' => { VR => 'SL', Name => 'StartingView' },
+    '0019,1061' => { VR => 'SL', Name => 'NumberOfViews' },
+    '0019,1062' => { VR => 'SL', Name => 'IncrementBetweenViews' },
+    '0019,106A' => { VR => 'SS', Name => 'DependantOnNoViewsProcessed' },
+    '0019,106B' => { VR => 'SS', Name => 'FieldOfViewInDetectorCells' },
+    '0019,1070' => { VR => 'SS', Name => 'ValueOfBackProjectionButton' },
+    '0019,1071' => { VR => 'SS', Name => 'SetIfFatqEstimatesWereUsed' },
+    '0019,1072' => { VR => 'DS', Name => 'ZChanAvgOverViews' },
+    '0019,1073' => { VR => 'DS', Name => 'AvgOfLeftRefChansOverViews' },
+    '0019,1074' => { VR => 'DS', Name => 'MaxLeftChanOverViews' },
+    '0019,1075' => { VR => 'DS', Name => 'AvgOfRightRefChansOverViews' },
+    '0019,1076' => { VR => 'DS', Name => 'MaxRightChanOverViews' },
+    '0019,107D' => { VR => 'DS', Name => 'SecondEcho' },
+    '0019,107E' => { VR => 'SS', Name => 'NumberOfEchoes' },
+    '0019,107F' => { VR => 'DS', Name => 'TableDelta' },
+    '0019,1081' => { VR => 'SS', Name => 'Contiguous' },
+    '0019,1084' => { VR => 'DS', Name => 'PeakSAR' },
+    '0019,1085' => { VR => 'SS', Name => 'MonitorSAR' },
+    '0019,1087' => { VR => 'DS', Name => 'CardiacRepetitionTime' },
+    '0019,1088' => { VR => 'SS', Name => 'ImagesPerCardiacCycle' },
+    '0019,108A' => { VR => 'SS', Name => 'ActualReceiveGainAnalog' },
+    '0019,108B' => { VR => 'SS', Name => 'ActualReceiveGainDigital' },
+    '0019,108D' => { VR => 'DS', Name => 'DelayAfterTrigger' },
+    '0019,108F' => { VR => 'SS', Name => 'Swappf' },
+    '0019,1090' => { VR => 'SS', Name => 'PauseInterval' },
+    '0019,1091' => { VR => 'DS', Name => 'PulseTime' },
+    '0019,1092' => { VR => 'SL', Name => 'SliceOffsetOnFreqAxis' },
+    '0019,1093' => { VR => 'DS', Name => 'CenterFrequency' },
+    '0019,1094' => { VR => 'SS', Name => 'TransmitGain' },
+    '0019,1095' => { VR => 'SS', Name => 'AnalogReceiverGain' },
+    '0019,1096' => { VR => 'SS', Name => 'DigitalReceiverGain' },
+    '0019,1097' => { VR => 'SL', Name => 'BitmapDefiningCVs' },
+    '0019,1098' => { VR => 'SS', Name => 'CenterFreqMethod' },
+    '0019,109B' => { VR => 'SS', Name => 'PulseSeqMode' },
+    '0019,109C' => { VR => 'LO', Name => 'PulseSeqName' },
+    '0019,109D' => { VR => 'DT', Name => 'PulseSeqDate' },
+    '0019,109E' => { VR => 'LO', Name => 'InternalPulseSeqName' },
+    '0019,109F' => { VR => 'SS', Name => 'TransmittingCoil' },
+    '0019,10A0' => { VR => 'SS', Name => 'SurfaceCoilType' },
+    '0019,10A1' => { VR => 'SS', Name => 'ExtremityCoilFlag' },
+    '0019,10A2' => { VR => 'SL', Name => 'RawDataRunNumber' },
+    '0019,10A3' => { VR => 'UL', Name => 'CalibratedFieldStrength' },
+    '0019,10A4' => { VR => 'SS', Name => 'SATFatWaterBone' },
+    '0019,10A5' => { VR => 'DS', Name => 'ReceiveBandwidth' },
+    '0019,10A7' => { VR => 'DS', Name => 'UserData01' },
+    '0019,10A8' => { VR => 'DS', Name => 'UserData02' },
+    '0019,10A9' => { VR => 'DS', Name => 'UserData03' },
+    '0019,10AA' => { VR => 'DS', Name => 'UserData04' },
+    '0019,10AB' => { VR => 'DS', Name => 'UserData05' },
+    '0019,10AC' => { VR => 'DS', Name => 'UserData06' },
+    '0019,10AD' => { VR => 'DS', Name => 'UserData07' },
+    '0019,10AE' => { VR => 'DS', Name => 'UserData08' },
+    '0019,10AF' => { VR => 'DS', Name => 'UserData09' },
+    '0019,10B0' => { VR => 'DS', Name => 'UserData10' },
+    '0019,10B1' => { VR => 'DS', Name => 'UserData11' },
+    '0019,10B2' => { VR => 'DS', Name => 'UserData12' },
+    '0019,10B3' => { VR => 'DS', Name => 'UserData13' },
+    '0019,10B4' => { VR => 'DS', Name => 'UserData14' },
+    '0019,10B5' => { VR => 'DS', Name => 'UserData15' },
+    '0019,10B6' => { VR => 'DS', Name => 'UserData16' },
+    '0019,10B7' => { VR => 'DS', Name => 'UserData17' },
+    '0019,10B8' => { VR => 'DS', Name => 'UserData18' },
+    '0019,10B9' => { VR => 'DS', Name => 'UserData19' },
+    '0019,10BA' => { VR => 'DS', Name => 'UserData20' },
+    '0019,10BB' => { VR => 'DS', Name => 'UserData21' },
+    '0019,10BC' => { VR => 'DS', Name => 'UserData22' },
+    '0019,10BD' => { VR => 'DS', Name => 'UserData23' },
+    '0019,10BE' => { VR => 'DS', Name => 'ProjectionAngle' },
+    '0019,10C0' => { VR => 'SS', Name => 'SaturationPlanes' },
+    '0019,10C1' => { VR => 'SS', Name => 'SurfaceCoilIntensity' },
+    '0019,10C2' => { VR => 'SS', Name => 'SATLocationR' },
+    '0019,10C3' => { VR => 'SS', Name => 'SATLocationL' },
+    '0019,10C4' => { VR => 'SS', Name => 'SATLocationA' },
+    '0019,10C5' => { VR => 'SS', Name => 'SATLocationP' },
+    '0019,10C6' => { VR => 'SS', Name => 'SATLocationH' },
+    '0019,10C7' => { VR => 'SS', Name => 'SATLocationF' },
+    '0019,10C8' => { VR => 'SS', Name => 'SATThicknessR-L' },
+    '0019,10C9' => { VR => 'SS', Name => 'SATThicknessA-P' },
+    '0019,10CA' => { VR => 'SS', Name => 'SATThicknessH-F' },
+    '0019,10CB' => { VR => 'SS', Name => 'PrescribedFlowAxis' },
+    '0019,10CC' => { VR => 'SS', Name => 'VelocityEncoding' },
+    '0019,10CD' => { VR => 'SS', Name => 'ThicknessDisclaimer' },
+    '0019,10CE' => { VR => 'SS', Name => 'PrescanType' },
+    '0019,10CF' => { VR => 'SS', Name => 'PrescanStatus' },
+    '0019,10D0' => { VR => 'SH', Name => 'RawDataType' },
+    '0019,10D2' => { VR => 'SS', Name => 'ProjectionAlgorithm' },
+    '0019,10D3' => { VR => 'SH', Name => 'ProjectionAlgorithm' },
+    '0019,10D5' => { VR => 'SS', Name => 'FractionalEcho' },
+    '0019,10D6' => { VR => 'SS', Name => 'PrepPulse' },
+    '0019,10D7' => { VR => 'SS', Name => 'CardiacPhases' },
+    '0019,10D8' => { VR => 'SS', Name => 'VariableEchoflag' },
+    '0019,10D9' => { VR => 'DS', Name => 'ConcatenatedSAT' },
+    '0019,10DA' => { VR => 'SS', Name => 'ReferenceChannelUsed' },
+    '0019,10DB' => { VR => 'DS', Name => 'BackProjectorCoefficient' },
+    '0019,10DC' => { VR => 'SS', Name => 'PrimarySpeedCorrectionUsed' },
+    '0019,10DD' => { VR => 'SS', Name => 'OverrangeCorrectionUsed' },
+    '0019,10DE' => { VR => 'DS', Name => 'DynamicZAlphaValue' },
+    '0019,10DF' => { VR => 'DS', Name => 'UserData' },
+    '0019,10E0' => { VR => 'DS', Name => 'UserData' },
+    '0019,10E2' => { VR => 'DS', Name => 'VelocityEncodeScale' },
+    '0019,10F2' => { VR => 'SS', Name => 'FastPhases' },
+    '0019,10F9' => { VR => 'DS', Name => 'TransmissionGain' },
+    # relationship group
+    '0020,0000' => { VR => 'UL', Name => 'RelationshipGroupLength' },
+    '0020,000D' => { VR => 'UI', Name => 'StudyInstanceUID' },
+    '0020,000E' => { VR => 'UI', Name => 'SeriesInstanceUID' },
+    '0020,0010' => { VR => 'SH', Name => 'StudyID' },
+    '0020,0011' => { VR => 'IS', Name => 'SeriesNumber' },
+    '0020,0012' => { VR => 'IS', Name => 'AcquisitionNumber' },
+    '0020,0013' => { VR => 'IS', Name => 'InstanceNumber' },
+    '0020,0014' => { VR => 'IS', Name => 'IsotopeNumber' },
+    '0020,0015' => { VR => 'IS', Name => 'PhaseNumber' },
+    '0020,0016' => { VR => 'IS', Name => 'IntervalNumber' },
+    '0020,0017' => { VR => 'IS', Name => 'TimeSlotNumber' },
+    '0020,0018' => { VR => 'IS', Name => 'AngleNumber' },
+    '0020,0019' => { VR => 'IS', Name => 'ItemNumber' },
+    '0020,0020' => { VR => 'CS', Name => 'PatientOrientation' },
+    '0020,0022' => { VR => 'IS', Name => 'OverlayNumber' },
+    '0020,0024' => { VR => 'IS', Name => 'CurveNumber' },
+    '0020,0026' => { VR => 'IS', Name => 'LookupTableNumber' },
+    '0020,0030' => { VR => 'DS', Name => 'ImagePosition' },
+    '0020,0032' => { VR => 'DS', Name => 'ImagePositionPatient' },
+    '0020,0035' => { VR => 'DS', Name => 'ImageOrientation' },
+    '0020,0037' => { VR => 'DS', Name => 'ImageOrientationPatient' },
+    '0020,0050' => { VR => 'DS', Name => 'Location' },
+    '0020,0052' => { VR => 'UI', Name => 'FrameOfReferenceUID' },
+    '0020,0060' => { VR => 'CS', Name => 'Laterality' },
+    '0020,0062' => { VR => 'CS', Name => 'ImageLaterality' },
+    '0020,0070' => { VR => 'LO', Name => 'ImageGeometryType' },
+    '0020,0080' => { VR => 'CS', Name => 'MaskingImage' },
+    '0020,0100' => { VR => 'IS', Name => 'TemporalPositionIdentifier' },
+    '0020,0105' => { VR => 'IS', Name => 'NumberOfTemporalPositions' },
+    '0020,0110' => { VR => 'DS', Name => 'TemporalResolution' },
+    '0020,0200' => { VR => 'UI', Name => 'SynchronizationFrameOfReferenceUID' },
+    '0020,1000' => { VR => 'IS', Name => 'SeriesInStudy' },
+    '0020,1001' => { VR => 'IS', Name => 'AcquisitionsInSeries' },
+    '0020,1002' => { VR => 'IS', Name => 'ImagesInAcquisition' },
+    '0020,1003' => { VR => 'IS', Name => 'ImagesInSeries' },
+    '0020,1004' => { VR => 'IS', Name => 'AcquisitionsInStudy' },
+    '0020,1005' => { VR => 'IS', Name => 'ImagesInStudy' },
+    '0020,1020' => { VR => 'CS', Name => 'Reference' },
+    '0020,1040' => { VR => 'LO', Name => 'PositionReferenceIndicator' },
+    '0020,1041' => { VR => 'DS', Name => 'SliceLocation' },
+    '0020,1070' => { VR => 'IS', Name => 'OtherStudyNumbers' },
+    '0020,1200' => { VR => 'IS', Name => 'NumberOfPatientRelatedStudies' },
+    '0020,1202' => { VR => 'IS', Name => 'NumberOfPatientRelatedSeries' },
+    '0020,1204' => { VR => 'IS', Name => 'NumberOfPatientRelatedInstances' },
+    '0020,1206' => { VR => 'IS', Name => 'NumberOfStudyRelatedSeries' },
+    '0020,1208' => { VR => 'IS', Name => 'NumberOfStudyRelatedInstances' },
+    '0020,1209' => { VR => 'IS', Name => 'NumberOfSeriesRelatedInstances' },
+    '0020,31xx' => { VR => 'CS', Name => 'SourceImageIDs' },
+    '0020,3401' => { VR => 'CS', Name => 'ModifyingDeviceID' },
+    '0020,3402' => { VR => 'CS', Name => 'ModifiedImageID' },
+    '0020,3403' => { VR => 'DA', Name => 'ModifiedImageDate' },
+    '0020,3404' => { VR => 'LO', Name => 'ModifyingDeviceManufacturer' },
+    '0020,3405' => { VR => 'TM', Name => 'ModifiedImageTime' },
+    '0020,3406' => { VR => 'LO', Name => 'ModifiedImageDescription' },
+    '0020,4000' => { VR => 'LT', Name => 'ImageComments' },
+    '0020,5000' => { VR => 'AT', Name => 'OriginalImageIdentification' },
+    '0020,5002' => { VR => 'CS', Name => 'OriginalImageIdentNomenclature' },
+    '0020,9056' => { VR => 'SH', Name => 'StackID' },
+    '0020,9057' => { VR => 'UL', Name => 'InStackPositionNumber' },
+    '0020,9071' => { VR => 'SQ', Name => 'FrameAnatomySequence' },
+    '0020,9072' => { VR => 'CS', Name => 'FrameLaterality' },
+    '0020,9111' => { VR => 'SQ', Name => 'FrameContentSequence' },
+    '0020,9113' => { VR => 'SQ', Name => 'PlanePositionSequence' },
+    '0020,9116' => { VR => 'SQ', Name => 'PlaneOrientationSequence' },
+    '0020,9128' => { VR => 'UL', Name => 'TemporalPositionIndex' },
+    '0020,9153' => { VR => 'FD', Name => 'TriggerDelayTime' },
+    '0020,9156' => { VR => 'US', Name => 'FrameAcquisitionNumber' },
+    '0020,9157' => { VR => 'UL', Name => 'DimensionIndexValues' },
+    '0020,9158' => { VR => 'LT', Name => 'FrameComments' },
+    '0020,9161' => { VR => 'UI', Name => 'ConcatenationUID' },
+    '0020,9162' => { VR => 'US', Name => 'InConcatenationNumber' },
+    '0020,9163' => { VR => 'US', Name => 'InConcatenationTotalNumber' },
+    '0020,9164' => { VR => 'UI', Name => 'DimensionOrganizationUID' },
+    '0020,9165' => { VR => 'AT', Name => 'DimensionIndexPointer' },
+    '0020,9167' => { VR => 'AT', Name => 'FunctionalGroupPointer' },
+    '0020,9213' => { VR => 'LO', Name => 'DimensionIndexPrivateCreator' },
+    '0020,9221' => { VR => 'SQ', Name => 'DimensionOrganizationSequence' },
+    '0020,9222' => { VR => 'SQ', Name => 'DimensionIndexSequence' },
+    '0020,9228' => { VR => 'UL', Name => 'ConcatenationFrameOffsetNumber' },
+    '0020,9238' => { VR => 'LO', Name => 'FunctionalGroupPrivateCreator' },
+    '0020,9241' => { VR => 'FL', Name => 'NominalPercentageOfCardiacPhase' },
+    '0020,9245' => { VR => 'FL', Name => 'NominalPercentOfRespiratoryPhase' },
+    '0020,9246' => { VR => 'FL', Name => 'StartingRespiratoryAmplitude' },
+    '0020,9247' => { VR => 'CS', Name => 'StartingRespiratoryPhase' },
+    '0020,9248' => { VR => 'FL', Name => 'EndingRespiratoryAmplitude' },
+    '0020,9249' => { VR => 'CS', Name => 'EndingRespiratoryPhase' },
+    '0020,9250' => { VR => 'CS', Name => 'RespiratoryTriggerType' },
+    '0020,9251' => { VR => 'FD', Name => 'RRIntervalTimeNominal' },
+    '0020,9252' => { VR => 'FD', Name => 'ActualCardiacTriggerDelayTime' },
+    '0020,9253' => { VR => 'SQ', Name => 'RespiratorySynchronizationSequence' },
+    '0020,9254' => { VR => 'FD', Name => 'RespiratoryIntervalTime' },
+    '0020,9255' => { VR => 'FD', Name => 'NominalRespiratoryTriggerDelayTime' },
+    '0020,9256' => { VR => 'FD', Name => 'RespiratoryTriggerDelayThreshold' },
+    '0020,9257' => { VR => 'FD', Name => 'ActualRespiratoryTriggerDelayTime' },
+    '0020,9301' => { VR => 'FD', Name => 'ImagePositionVolume' },
+    '0020,9302' => { VR => 'FD', Name => 'ImageOrientationVolume' },
+    '0020,9308' => { VR => 'FD', Name => 'ApexPosition' },
+    '0020,9421' => { VR => 'LO', Name => 'DimensionDescriptionLabel' },
+    '0020,9450' => { VR => 'SQ', Name => 'PatientOrientationInFrameSequence' },
+    '0020,9453' => { VR => 'LO', Name => 'FrameLabel' },
+    '0020,9518' => { VR => 'US', Name => 'AcquisitionIndex' },
+    '0020,9529' => { VR => 'SQ', Name => 'ContributingSOPInstancesRefSeq' },
+    '0020,9536' => { VR => 'US', Name => 'ReconstructionIndex' },
+    # GEMS_RELA_01 (ref 4)
+    '0021,1003' => { VR => 'SS', Name => 'SeriesFromWhichPrescribed' },
+    '0021,1005' => { VR => 'SH', Name => 'GenesisVersionNow' },
+    '0021,1005' => { VR => 'SH', Name => 'GenesisVersionNow' },
+    '0021,1007' => { VR => 'UL', Name => 'SeriesRecordChecksum' },
+    '0021,1018' => { VR => 'SH', Name => 'GenesisVersionNow' },
+    '0021,1018' => { VR => 'SH', Name => 'GenesisVersionNow' },
+    '0021,1019' => { VR => 'UL', Name => 'AcqReconRecordChecksum' },
+    '0021,1019' => { VR => 'UL', Name => 'AcqreconRecordChecksum' },
+    '0021,1020' => { VR => 'DS', Name => 'TableStartLocation' },
+    '0021,1035' => { VR => 'SS', Name => 'SeriesFromWhichPrescribed' },
+    '0021,1036' => { VR => 'SS', Name => 'ImageFromWhichPrescribed' },
+    '0021,1037' => { VR => 'SS', Name => 'ScreenFormat' },
+    '0021,104A' => { VR => 'LO', Name => 'AnatomicalReferenceForScout' },
+    '0021,104F' => { VR => 'SS', Name => 'LocationsInAcquisition' },
+    '0021,1050' => { VR => 'SS', Name => 'GraphicallyPrescribed' },
+    '0021,1051' => { VR => 'DS', Name => 'RotationFromSourceXRot' },
+    '0021,1052' => { VR => 'DS', Name => 'RotationFromSourceYRot' },
+    '0021,1053' => { VR => 'DS', Name => 'RotationFromSourceZRot' },
+    '0021,1054' => { VR => 'SH', Name => 'ImagePosition' },
+    '0021,1055' => { VR => 'SH', Name => 'ImageOrientation' },
+    '0021,1056' => { VR => 'SL', Name => 'IntegerSlop' },
+    '0021,1057' => { VR => 'SL', Name => 'IntegerSlop' },
+    '0021,1058' => { VR => 'SL', Name => 'IntegerSlop' },
+    '0021,1059' => { VR => 'SL', Name => 'IntegerSlop' },
+    '0021,105A' => { VR => 'SL', Name => 'IntegerSlop' },
+    '0021,105B' => { VR => 'DS', Name => 'FloatSlop' },
+    '0021,105C' => { VR => 'DS', Name => 'FloatSlop' },
+    '0021,105D' => { VR => 'DS', Name => 'FloatSlop' },
+    '0021,105E' => { VR => 'DS', Name => 'FloatSlop' },
+    '0021,105F' => { VR => 'DS', Name => 'FloatSlop' },
+    '0021,1081' => { VR => 'DS', Name => 'AutoWindowLevelAlpha' },
+    '0021,1082' => { VR => 'DS', Name => 'AutoWindowLevelBeta' },
+    '0021,1083' => { VR => 'DS', Name => 'AutoWindowLevelWindow' },
+    '0021,1084' => { VR => 'DS', Name => 'ToWindowLevelLevel' },
+    '0021,1090' => { VR => 'SS', Name => 'TubeFocalSpotPosition' },
+    '0021,1091' => { VR => 'SS', Name => 'BiopsyPosition' },
+    '0021,1092' => { VR => 'FL', Name => 'BiopsyTLocation' },
+    '0021,1093' => { VR => 'FL', Name => 'BiopsyRefLocation' },
+    # ?
+    '0022,0001' => { VR => 'US', Name => 'LightPathFilterPassThroughWavelen' },
+    '0022,0002' => { VR => 'US', Name => 'LightPathFilterPassBand' },
+    '0022,0003' => { VR => 'US', Name => 'ImagePathFilterPassThroughWavelen' },
+    '0022,0004' => { VR => 'US', Name => 'ImagePathFilterPassBand' },
+    '0022,0005' => { VR => 'CS', Name => 'PatientEyeMovementCommanded' },
+    '0022,0006' => { VR => 'SQ', Name => 'PatientEyeMovementCommandCodeSeq' },
+    '0022,0007' => { VR => 'FL', Name => 'SphericalLensPower' },
+    '0022,0008' => { VR => 'FL', Name => 'CylinderLensPower' },
+    '0022,0009' => { VR => 'FL', Name => 'CylinderAxis' },
+    '0022,000A' => { VR => 'FL', Name => 'EmmetropicMagnification' },
+    '0022,000B' => { VR => 'FL', Name => 'IntraOcularPressure' },
+    '0022,000C' => { VR => 'FL', Name => 'HorizontalFieldOfView' },
+    '0022,000D' => { VR => 'CS', Name => 'PupilDilated' },
+    '0022,000E' => { VR => 'FL', Name => 'DegreeOfDilation' },
+    '0022,0010' => { VR => 'FL', Name => 'StereoBaselineAngle' },
+    '0022,0011' => { VR => 'FL', Name => 'StereoBaselineDisplacement' },
+    '0022,0012' => { VR => 'FL', Name => 'StereoHorizontalPixelOffset' },
+    '0022,0013' => { VR => 'FL', Name => 'StereoVerticalPixelOffset' },
+    '0022,0014' => { VR => 'FL', Name => 'StereoRotation' },
+    '0022,0015' => { VR => 'SQ', Name => 'AcquisitionDeviceTypeCodeSequence' },
+    '0022,0016' => { VR => 'SQ', Name => 'IlluminationTypeCodeSequence' },
+    '0022,0017' => { VR => 'SQ', Name => 'LightPathFilterTypeStackCodeSeq' },
+    '0022,0018' => { VR => 'SQ', Name => 'ImagePathFilterTypeStackCodeSeq' },
+    '0022,0019' => { VR => 'SQ', Name => 'LensesCodeSequence' },
+    '0022,001A' => { VR => 'SQ', Name => 'ChannelDescriptionCodeSequence' },
+    '0022,001B' => { VR => 'SQ', Name => 'RefractiveStateSequence' },
+    '0022,001C' => { VR => 'SQ', Name => 'MydriaticAgentCodeSequence' },
+    '0022,001D' => { VR => 'SQ', Name => 'RelativeImagePositionCodeSequence' },
+    '0022,0020' => { VR => 'SQ', Name => 'StereoPairsSequence' },
+    '0022,0021' => { VR => 'SQ', Name => 'LeftImageSequence' },
+    '0022,0022' => { VR => 'SQ', Name => 'RightImageSequence' },
+    '0022,0030' => { VR => 'FL', Name => 'AxialLengthOfTheEye' },
+    '0022,0031' => { VR => 'SQ', Name => 'OphthalmicFrameLocationSequence' },
+    '0022,0032' => { VR => 'FL', Name => 'ReferenceCoordinates' },
+    '0022,0035' => { VR => 'FL', Name => 'DepthSpatialResolution' },
+    '0022,0036' => { VR => 'FL', Name => 'MaximumDepthDistortion' },
+    '0022,0037' => { VR => 'FL', Name => 'AlongScanSpatialResolution' },
+    '0022,0038' => { VR => 'FL', Name => 'MaximumAlongScanDistortion' },
+    '0022,0039' => { VR => 'CS', Name => 'OphthalmicImageOrientation' },
+    '0022,0041' => { VR => 'FL', Name => 'DepthOfTransverseImage' },
+    '0022,0042' => { VR => 'SQ', Name => 'MydriaticAgentConcUnitsSeq' },
+    '0022,0048' => { VR => 'FL', Name => 'AcrossScanSpatialResolution' },
+    '0022,0049' => { VR => 'FL', Name => 'MaximumAcrossScanDistortion' },
+    '0022,004E' => { VR => 'DS', Name => 'MydriaticAgentConcentration' },
+    '0022,0055' => { VR => 'FL', Name => 'IlluminationWaveLength' },
+    '0022,0056' => { VR => 'FL', Name => 'IlluminationPower' },
+    '0022,0057' => { VR => 'FL', Name => 'IlluminationBandwidth' },
+    '0022,0058' => { VR => 'SQ', Name => 'MydriaticAgentSequence' },
+    # GEMS_STDY_01 (ref 4)
+    '0023,1001' => { VR => 'SL', Name => 'NumberOfSeriesInStudy' },
+    '0023,1002' => { VR => 'SL', Name => 'NumberOfUnarchivedSeries' },
+    '0023,1010' => { VR => 'SS', Name => 'ReferenceImageField' },
+    '0023,1050' => { VR => 'SS', Name => 'SummaryImage' },
+    '0023,1070' => { VR => 'FD', Name => 'StartTimeSecsInFirstAxial' },
+    '0023,1074' => { VR => 'SL', Name => 'NoofUpdatesToHeader' },
+    '0023,107D' => { VR => 'SS', Name => 'IndicatesIfStudyHasCompleteInfo' },
+    '0023,107D' => { VR => 'SS', Name => 'IndicatesIfTheStudyHasCompleteInfo' },
+    # GEMS_SERS_01 (ref 4)
+    '0025,1006' => { VR => 'SS', Name => 'LastPulseSequenceUsed' },
+    '0025,1007' => { VR => 'SL', Name => 'ImagesInSeries' },
+    '0025,1010' => { VR => 'SL', Name => 'LandmarkCounter' },
+    '0025,1011' => { VR => 'SS', Name => 'NumberOfAcquisitions' },
+    '0025,1014' => { VR => 'SL', Name => 'IndicatesNoofUpdatesToHeader' },
+    '0025,1017' => { VR => 'SL', Name => 'SeriesCompleteFlag' },
+    '0025,1018' => { VR => 'SL', Name => 'NumberOfImagesArchived' },
+    '0025,1019' => { VR => 'SL', Name => 'LastImageNumberUsed' },
+    '0025,101A' => { VR => 'SH', Name => 'PrimaryReceiverSuiteAndHost' },
+    # GEMS_IMAG_01 (ref 4)
+    '0027,1006' => { VR => 'SL', Name => 'ImageArchiveFlag' },
+    '0027,1010' => { VR => 'SS', Name => 'ScoutType' },
+    '0027,101C' => { VR => 'SL', Name => 'VmaMamp' },
+    '0027,101D' => { VR => 'SS', Name => 'VmaPhase' },
+    '0027,101E' => { VR => 'SL', Name => 'VmaMod' },
+    '0027,101F' => { VR => 'SL', Name => 'VmaClip' },
+    '0027,1020' => { VR => 'SS', Name => 'SmartScanOnOffFlag' },
+    '0027,1030' => { VR => 'SH', Name => 'ForeignImageRevision' },
+    '0027,1031' => { VR => 'SS', Name => 'ImagingMode' },
+    '0027,1032' => { VR => 'SS', Name => 'PulseSequence' },
+    '0027,1033' => { VR => 'SL', Name => 'ImagingOptions' },
+    '0027,1035' => { VR => 'SS', Name => 'PlaneType' },
+    '0027,1036' => { VR => 'SL', Name => 'ObliquePlane' },
+    '0027,1040' => { VR => 'SH', Name => 'RASLetterOfImageLocation' },
+    '0027,1041' => { VR => 'FL', Name => 'ImageLocation' },
+    '0027,1042' => { VR => 'FL', Name => 'CenterRCoordOfPlaneImage' },
+    '0027,1043' => { VR => 'FL', Name => 'CenterACoordOfPlaneImage' },
+    '0027,1044' => { VR => 'FL', Name => 'CenterSCoordOfPlaneImage' },
+    '0027,1045' => { VR => 'FL', Name => 'NormalRCoord' },
+    '0027,1046' => { VR => 'FL', Name => 'NormalACoord' },
+    '0027,1047' => { VR => 'FL', Name => 'NormalSCoord' },
+    '0027,1048' => { VR => 'FL', Name => 'RCoordOfTopRightCorner' },
+    '0027,1049' => { VR => 'FL', Name => 'ACoordOfTopRightCorner' },
+    '0027,104A' => { VR => 'FL', Name => 'SCoordOfTopRightCorner' },
+    '0027,104B' => { VR => 'FL', Name => 'RCoordOfBottomRightCorner' },
+    '0027,104C' => { VR => 'FL', Name => 'ACoordOfBottomRightCorner' },
+    '0027,104D' => { VR => 'FL', Name => 'SCoordOfBottomRightCorner' },
+    '0027,1050' => { VR => 'FL', Name => 'TableStartLocation' },
+    '0027,1051' => { VR => 'FL', Name => 'TableEndLocation' },
+    '0027,1052' => { VR => 'SH', Name => 'RASLetterForSideOfImage' },
+    '0027,1053' => { VR => 'SH', Name => 'RASLetterForAnteriorPosterior' },
+    '0027,1054' => { VR => 'SH', Name => 'RASLetterForScoutStartLoc' },
+    '0027,1055' => { VR => 'SH', Name => 'RASLetterForScoutEndLoc' },
+    '0027,1060' => { VR => 'FL', Name => 'ImageDimensionX' },
+    '0027,1061' => { VR => 'FL', Name => 'ImageDimensionY' },
+    '0027,1062' => { VR => 'FL', Name => 'NumberOfExcitations' },
+    # image presentation group
+    '0028,0000' => { VR => 'UL', Name => 'ImagePresentationGroupLength' },
+    '0028,0002' => { VR => 'US', Name => 'SamplesPerPixel' },
+    '0028,0003' => { VR => 'US', Name => 'SamplesPerPixelUsed' },
+    '0028,0004' => { VR => 'CS', Name => 'PhotometricInterpretation' },
+    '0028,0005' => { VR => 'US', Name => 'ImageDimensions' },
+    '0028,0006' => { VR => 'US', Name => 'PlanarConfiguration' },
+    '0028,0008' => { VR => 'IS', Name => 'NumberOfFrames' },
+    '0028,0009' => { VR => 'AT', Name => 'FrameIncrementPointer' },
+    '0028,000A' => { VR => 'AT', Name => 'FrameDimensionPointer' },
+    '0028,0010' => { VR => 'US', Name => 'Rows' },
+    '0028,0011' => { VR => 'US', Name => 'Columns' },
+    '0028,0012' => { VR => 'US', Name => 'Planes' },
+    '0028,0014' => { VR => 'US', Name => 'UltrasoundColorDataPresent' },
+    '0028,0030' => { VR => 'DS', Name => 'PixelSpacing' },
+    '0028,0031' => { VR => 'DS', Name => 'ZoomFactor' },
+    '0028,0032' => { VR => 'DS', Name => 'ZoomCenter' },
+    '0028,0034' => { VR => 'IS', Name => 'PixelAspectRatio' },
+    '0028,0040' => { VR => 'CS', Name => 'ImageFormat' },
+    '0028,0050' => { VR => 'LO', Name => 'ManipulatedImage' },
+    '0028,0051' => { VR => 'CS', Name => 'CorrectedImage' },
+    '0028,005F' => { VR => 'LO', Name => 'CompressionRecognitionCode' },
+    '0028,0060' => { VR => 'CS', Name => 'CompressionCode' },
+    '0028,0061' => { VR => 'SH', Name => 'CompressionOriginator' },
+    '0028,0062' => { VR => 'LO', Name => 'CompressionLabel' },
+    '0028,0063' => { VR => 'SH', Name => 'CompressionDescription' },
+    '0028,0065' => { VR => 'CS', Name => 'CompressionSequence' },
+    '0028,0066' => { VR => 'AT', Name => 'CompressionStepPointers' },
+    '0028,0068' => { VR => 'US', Name => 'RepeatInterval' },
+    '0028,0069' => { VR => 'US', Name => 'BitsGrouped' },
+    '0028,0070' => { VR => 'US', Name => 'PerimeterTable' },
+    '0028,0071' => { VR => 'US', Name => 'PerimeterValue' },
+    '0028,0080' => { VR => 'US', Name => 'PredictorRows' },
+    '0028,0081' => { VR => 'US', Name => 'PredictorColumns' },
+    '0028,0082' => { VR => 'US', Name => 'PredictorConstants' },
+    '0028,0090' => { VR => 'CS', Name => 'BlockedPixels' },
+    '0028,0091' => { VR => 'US', Name => 'BlockRows' },
+    '0028,0092' => { VR => 'US', Name => 'BlockColumns' },
+    '0028,0093' => { VR => 'US', Name => 'RowOverlap' },
+    '0028,0094' => { VR => 'US', Name => 'ColumnOverlap' },
+    '0028,0100' => { VR => 'US', Name => 'BitsAllocated' },
+    '0028,0101' => { VR => 'US', Name => 'BitsStored' },
+    '0028,0102' => { VR => 'US', Name => 'HighBit' },
+    '0028,0103' => { VR => 'US', Name => 'PixelRepresentation', PrintConv => { 0 => 'Unsigned', 1 => 'Signed' } },
+    '0028,0104' => { VR => 'US', Name => 'SmallestValidPixelValue' },
+    '0028,0105' => { VR => 'US', Name => 'LargestValidPixelValue' },
+    '0028,0106' => { VR => 'US', Name => 'SmallestImagePixelValue' },
+    '0028,0107' => { VR => 'US', Name => 'LargestImagePixelValue' },
+    '0028,0108' => { VR => 'US', Name => 'SmallestPixelValueInSeries' },
+    '0028,0109' => { VR => 'US', Name => 'LargestPixelValueInSeries' },
+    '0028,0110' => { VR => 'US', Name => 'SmallestImagePixelValueInPlane' },
+    '0028,0111' => { VR => 'US', Name => 'LargestImagePixelValueInPlane' },
+    '0028,0120' => { VR => 'US', Name => 'PixelPaddingValue' },
+    '0028,0121' => { VR => 'US', Name => 'PixelPaddingRangeLimit' },
+    '0028,0200' => { VR => 'US', Name => 'ImageLocation' },
+    '0028,0300' => { VR => 'CS', Name => 'QualityControlImage' },
+    '0028,0301' => { VR => 'CS', Name => 'BurnedInAnnotation' },
+    '0028,0400' => { VR => 'LO', Name => 'TransformLabel' },
+    '0028,0401' => { VR => 'LO', Name => 'TransformVersionNumber' },
+    '0028,0402' => { VR => 'US', Name => 'NumberOfTransformSteps' },
+    '0028,0403' => { VR => 'LO', Name => 'SequenceOfCompressedData' },
+    '0028,0404' => { VR => 'AT', Name => 'DetailsOfCoefficients' },
+    '0028,04x2' => { VR => 'LO', Name => 'CoefficientCoding' },
+    '0028,04x3' => { VR => 'AT', Name => 'CoefficientCodingPointers' },
+    '0028,0700' => { VR => 'LO', Name => 'DCTLabel' },
+    '0028,0701' => { VR => 'CS', Name => 'DataBlockDescription' },
+    '0028,0702' => { VR => 'AT', Name => 'DataBlock' },
+    '0028,0710' => { VR => 'US', Name => 'NormalizationFactorFormat' },
+    '0028,0720' => { VR => 'US', Name => 'ZonalMapNumberFormat' },
+    '0028,0721' => { VR => 'AT', Name => 'ZonalMapLocation' },
+    '0028,0722' => { VR => 'US', Name => 'ZonalMapFormat' },
+    '0028,0730' => { VR => 'US', Name => 'AdaptiveMapFormat' },
+    '0028,0740' => { VR => 'US', Name => 'CodeNumberFormat' },
+    '0028,08x0' => { VR => 'CS', Name => 'CodeLabel' },
+    '0028,08x2' => { VR => 'US', Name => 'NumberOfTables' },
+    '0028,08x3' => { VR => 'AT', Name => 'CodeTableLocation' },
+    '0028,08x4' => { VR => 'US', Name => 'BitsForCodeWord' },
+    '0028,08x8' => { VR => 'AT', Name => 'ImageDataLocation' },
+    '0028,1040' => { VR => 'CS', Name => 'PixelIntensityRelationship' },
+    '0028,0A02' => { VR => 'CS', Name => 'PixelSpacingCalibrationType' },
+    '0028,0A04' => { VR => 'LO', Name => 'PixelSpacingCalibrationDescription' },
+    '0028,1040' => { VR => 'CS', Name => 'PixelIntensityRelationship' },
+    '0028,1041' => { VR => 'SS', Name => 'PixelIntensityRelationshipSign' },
+    '0028,1050' => { VR => 'DS', Name => 'WindowCenter' },
+    '0028,1051' => { VR => 'DS', Name => 'WindowWidth' },
+    '0028,1052' => { VR => 'DS', Name => 'RescaleIntercept' },
+    '0028,1053' => { VR => 'DS', Name => 'RescaleSlope' },
+    '0028,1054' => { VR => 'LO', Name => 'RescaleType' },
+    '0028,1055' => { VR => 'LO', Name => 'WindowCenterAndWidthExplanation' },
+    '0028,1056' => { VR => 'CS', Name => 'VOI_LUTFunction' },
+    '0028,1080' => { VR => 'CS', Name => 'GrayScale' },
+    '0028,1090' => { VR => 'CS', Name => 'RecommendedViewingMode' },
+    '0028,1100' => { VR => 'SS', Name => 'GrayLookupTableDescriptor' },
+    '0028,1101' => { VR => 'SS', Name => 'RedPaletteColorTableDescriptor' },
+    '0028,1102' => { VR => 'SS', Name => 'GreenPaletteColorTableDescriptor' },
+    '0028,1103' => { VR => 'SS', Name => 'BluePaletteColorTableDescriptor' },
+    '0028,1111' => { VR => 'SS', Name => 'LargeRedPaletteColorTableDescr' },
+    '0028,1112' => { VR => 'SS', Name => 'LargeGreenPaletteColorTableDescr' },
+    '0028,1113' => { VR => 'SS', Name => 'LargeBluePaletteColorTableDescr' },
+    '0028,1199' => { VR => 'UI', Name => 'PaletteColorTableUID' },
+    '0028,1200' => { VR => 'US', Name => 'GrayLookupTableData' },
+    '0028,1201' => { VR => 'OW', Name => 'RedPaletteColorTableData' },
+    '0028,1202' => { VR => 'OW', Name => 'GreenPaletteColorTableData' },
+    '0028,1203' => { VR => 'OW', Name => 'BluePaletteColorTableData' },
+    '0028,1211' => { VR => 'OW', Name => 'LargeRedPaletteColorTableData', Binary => 1 },
+    '0028,1212' => { VR => 'OW', Name => 'LargeGreenPaletteColorTableData', Binary => 1 },
+    '0028,1213' => { VR => 'OW', Name => 'LargeBluePaletteColorTableData', Binary => 1 },
+    '0028,1214' => { VR => 'UI', Name => 'LargePaletteColorLookupTableUID' },
+    '0028,1221' => { VR => 'OW', Name => 'SegmentedRedColorTableData' },
+    '0028,1222' => { VR => 'OW', Name => 'SegmentedGreenColorTableData' },
+    '0028,1223' => { VR => 'OW', Name => 'SegmentedBlueColorTableData' },
+    '0028,1300' => { VR => 'CS', Name => 'BreastImplantPresent' },
+    '0028,1350' => { VR => 'CS', Name => 'PartialView' },
+    '0028,1351' => { VR => 'ST', Name => 'PartialViewDescription' },
+    '0028,1352' => { VR => 'SQ', Name => 'PartialViewCodeSequence' },
+    '0028,135A' => { VR => 'CS', Name => 'SpatialLocationsPreserved' },
+    '0028,1402' => { VR => 'CS', Name => 'DataPathAssignment' },
+    '0028,1404' => { VR => 'SQ', Name => 'BlendingLUT1Sequence' },
+    '0028,1406' => { VR => 'FD', Name => 'BlendingWeightConstant' },
+    '0028,1408' => { VR => 'OW', Name => 'BlendingLookupTableData' },
+    '0028,140C' => { VR => 'SQ', Name => 'BlendingLUT2Sequence' },
+    '0028,140E' => { VR => 'CS', Name => 'DataPathID' },
+    '0028,140F' => { VR => 'CS', Name => 'RGBLUTTransferFunction' },
+    '0028,1410' => { VR => 'CS', Name => 'AlphaLUTTransferFunction' },
+    '0028,2000' => { VR => 'OB', Name => 'ICCProfile' },
+    '0028,2110' => { VR => 'CS', Name => 'LossyImageCompression' },
+    '0028,2112' => { VR => 'DS', Name => 'LossyImageCompressionRatio' },
+    '0028,2114' => { VR => 'CS', Name => 'LossyImageCompressionMethod' },
+    '0028,3000' => { VR => 'SQ', Name => 'ModalityLUTSequence' },
+    '0028,3002' => { VR => 'US', Name => 'LUTDescriptor' },
+    '0028,3003' => { VR => 'LO', Name => 'LUTExplanation' },
+    '0028,3004' => { VR => 'LO', Name => 'ModalityLUTType' },
+    '0028,3006' => { VR => 'SS', Name => 'LUTData' },
+    '0028,3010' => { VR => 'SQ', Name => 'VOILUTSequence' },
+    '0028,3110' => { VR => 'SQ', Name => 'SoftcopyVOILUTSequence' },
+    '0028,4000' => { VR => 'LT', Name => 'ImagePresentationComments' },
+    '0028,5000' => { VR => 'SQ', Name => 'BiPlaneAcquisitionSequence' },
+    '0028,6010' => { VR => 'US', Name => 'RepresentativeFrameNumber' },
+    '0028,6020' => { VR => 'US', Name => 'FrameNumbersOfInterest' },
+    '0028,6022' => { VR => 'LO', Name => 'FrameOfInterestDescription' },
+    '0028,6023' => { VR => 'CS', Name => 'FrameOfInterestType' },
+    '0028,6030' => { VR => 'US', Name => 'MaskPointers' },
+    '0028,6040' => { VR => 'US', Name => 'RWavePointer' },
+    '0028,6100' => { VR => 'SQ', Name => 'MaskSubtractionSequence' },
+    '0028,6101' => { VR => 'CS', Name => 'MaskOperation' },
+    '0028,6102' => { VR => 'US', Name => 'ApplicableFrameRange' },
+    '0028,6110' => { VR => 'US', Name => 'MaskFrameNumbers' },
+    '0028,6112' => { VR => 'US', Name => 'ContrastFrameAveraging' },
+    '0028,6114' => { VR => 'FL', Name => 'MaskSubPixelShift' },
+    '0028,6120' => { VR => 'SS', Name => 'TIDOffset' },
+    '0028,6190' => { VR => 'ST', Name => 'MaskOperationExplanation' },
+    '0028,7FE0' => { VR => 'UT', Name => 'PixelDataProviderURL' },
+    '0028,9001' => { VR => 'UL', Name => 'DataPointRows' },
+    '0028,9002' => { VR => 'UL', Name => 'DataPointColumns' },
+    '0028,9003' => { VR => 'CS', Name => 'SignalDomainColumns' },
+    '0028,9099' => { VR => 'US', Name => 'LargestMonochromePixelValue' },
+    '0028,9108' => { VR => 'CS', Name => 'DataRepresentation' },
+    '0028,9110' => { VR => 'SQ', Name => 'PixelMeasuresSequence' },
+    '0028,9132' => { VR => 'SQ', Name => 'FrameVOILUTSequence' },
+    '0028,9145' => { VR => 'SQ', Name => 'PixelValueTransformationSequence' },
+    '0028,9235' => { VR => 'CS', Name => 'SignalDomainRows' },
+    '0028,9411' => { VR => 'FL', Name => 'DisplayFilterPercentage' },
+    '0028,9415' => { VR => 'SQ', Name => 'FramePixelShiftSequence' },
+    '0028,9416' => { VR => 'US', Name => 'SubtractionItemID' },
+    '0028,9422' => { VR => 'SQ', Name => 'PixelIntensityRelationshipLUTSeq' },
+    '0028,9443' => { VR => 'SQ', Name => 'FramePixelDataPropertiesSequence' },
+    '0028,9444' => { VR => 'CS', Name => 'GeometricalProperties' },
+    '0028,9445' => { VR => 'FL', Name => 'GeometricMaximumDistortion' },
+    '0028,9446' => { VR => 'CS', Name => 'ImageProcessingApplied' },
+    '0028,9454' => { VR => 'CS', Name => 'MaskSelectionMode' },
+    '0028,9474' => { VR => 'CS', Name => 'LUTFunction' },
+    '0028,9478' => { VR => 'FL', Name => 'MaskVisibilityPercentage' },
+    '0028,9501' => { VR => 'SQ', Name => 'PixelShiftSequence' },
+    '0028,9502' => { VR => 'SQ', Name => 'RegionPixelShiftSequence' },
+    '0028,9503' => { VR => 'SS', Name => 'VerticesOfTheRegion' },
+    '0028,9506' => { VR => 'US', Name => 'PixelShiftFrameRange' },
+    '0028,9507' => { VR => 'US', Name => 'LUTFrameRange' },
+    '0028,9520' => { VR => 'DS', Name => 'ImageToEquipmentMappingMatrix' },
+    '0028,9537' => { VR => 'CS', Name => 'EquipmentCoordinateSystemID' },
+    # GEMS_IMPS_01 (ref 4)
+    '0029,1004' => { VR => 'SL', Name => 'LowerRangeOfPixels1a' },
+    '0029,1005' => { VR => 'DS', Name => 'LowerRangeOfPixels1b' },
+    '0029,1006' => { VR => 'DS', Name => 'LowerRangeOfPixels1c' },
+    '0029,1007' => { VR => 'SL', Name => 'LowerRangeOfPixels1d' },
+    '0029,1008' => { VR => 'SH', Name => 'LowerRangeOfPixels1e' },
+    '0029,1009' => { VR => 'SH', Name => 'LowerRangeOfPixels1f' },
+    '0029,100A' => { VR => 'SS', Name => 'LowerRangeOfPixels1g' },
+    '0029,1015' => { VR => 'SL', Name => 'LowerRangeOfPixels1h' },
+    '0029,1016' => { VR => 'SL', Name => 'LowerRangeOfPixels1i' },
+    '0029,1017' => { VR => 'SL', Name => 'LowerRangeOfPixels2' },
+    '0029,1018' => { VR => 'SL', Name => 'UpperRangeOfPixels2' },
+    '0029,101A' => { VR => 'SL', Name => 'LenOfTotHdrInBytes' },
+    '0029,1026' => { VR => 'SS', Name => 'VersionOfTheHdrStruct' },
+    '0029,1034' => { VR => 'SL', Name => 'AdvantageCompOverflow' },
+    '0029,1035' => { VR => 'SL', Name => 'AdvantageCompUnderflow' },
+    # study group
+    '0032,0000' => { VR => 'UL', Name => 'StudyGroupLength' },
+    '0032,000A' => { VR => 'CS', Name => 'StudyStatusID' },
+    '0032,000C' => { VR => 'CS', Name => 'StudyPriorityID' },
+    '0032,0012' => { VR => 'LO', Name => 'StudyIDIssuer' },
+    '0032,0032' => { VR => 'DA', Name => 'StudyVerifiedDate' },
+    '0032,0033' => { VR => 'TM', Name => 'StudyVerifiedTime' },
+    '0032,0034' => { VR => 'DA', Name => 'StudyReadDate' },
+    '0032,0035' => { VR => 'TM', Name => 'StudyReadTime' },
+    '0032,1000' => { VR => 'DA', Name => 'ScheduledStudyStartDate' },
+    '0032,1001' => { VR => 'TM', Name => 'ScheduledStudyStartTime' },
+    '0032,1010' => { VR => 'DA', Name => 'ScheduledStudyStopDate' },
+    '0032,1011' => { VR => 'TM', Name => 'ScheduledStudyStopTime' },
+    '0032,1020' => { VR => 'LO', Name => 'ScheduledStudyLocation' },
+    '0032,1021' => { VR => 'AE', Name => 'ScheduledStudyLocationAETitle' },
+    '0032,1030' => { VR => 'LO', Name => 'ReasonForStudy' },
+    '0032,1031' => { VR => 'SQ', Name => 'RequestingPhysicianIDSequence' },
+    '0032,1032' => { VR => 'PN', Name => 'RequestingPhysician' },
+    '0032,1033' => { VR => 'LO', Name => 'RequestingService' },
+    '0032,1040' => { VR => 'DA', Name => 'StudyArrivalDate' },
+    '0032,1041' => { VR => 'TM', Name => 'StudyArrivalTime' },
+    '0032,1050' => { VR => 'DA', Name => 'StudyCompletionDate' },
+    '0032,1051' => { VR => 'TM', Name => 'StudyCompletionTime' },
+    '0032,1055' => { VR => 'CS', Name => 'StudyComponentStatusID' },
+    '0032,1060' => { VR => 'LO', Name => 'RequestedProcedureDescription' },
+    '0032,1064' => { VR => 'SQ', Name => 'RequestedProcedureCodeSequence' },
+    '0032,1070' => { VR => 'LO', Name => 'RequestedContrastAgent' },
+    '0032,4000' => { VR => 'LT', Name => 'StudyComments' },
+    # visit group
+    '0038,0004' => { VR => 'SQ', Name => 'ReferencedPatientAliasSequence' },
+    '0038,0008' => { VR => 'CS', Name => 'VisitStatusID' },
+    '0038,0010' => { VR => 'LO', Name => 'AdmissionID' },
+    '0038,0011' => { VR => 'LO', Name => 'IssuerOfAdmissionID' },
+    '0038,0016' => { VR => 'LO', Name => 'RouteOfAdmissions' },
+    '0038,001A' => { VR => 'DA', Name => 'ScheduledAdmissionDate' },
+    '0038,001B' => { VR => 'TM', Name => 'ScheduledAdmissionTime' },
+    '0038,001C' => { VR => 'DA', Name => 'ScheduledDischargeDate' },
+    '0038,001D' => { VR => 'TM', Name => 'ScheduledDischargeTime' },
+    '0038,001E' => { VR => 'LO', Name => 'ScheduledPatientInstitResidence' },
+    '0038,0020' => { VR => 'DA', Name => 'AdmittingDate' },
+    '0038,0021' => { VR => 'TM', Name => 'AdmittingTime' },
+    '0038,0030' => { VR => 'DA', Name => 'DischargeDate' },
+    '0038,0032' => { VR => 'TM', Name => 'DischargeTime' },
+    '0038,0040' => { VR => 'LO', Name => 'DischargeDiagnosisDescription' },
+    '0038,0044' => { VR => 'SQ', Name => 'DischargeDiagnosisCodeSequence' },
+    '0038,0050' => { VR => 'LO', Name => 'SpecialNeeds' },
+    '0038,0060' => { VR => 'LO', Name => 'ServiceEpisodeID' },
+    '0038,0061' => { VR => 'LO', Name => 'IssuerOfServiceEpisodeID' },
+    '0038,0062' => { VR => 'LO', Name => 'ServiceEpisodeDescription' },
+    '0038,0100' => { VR => 'SQ', Name => 'PertinentDocumentsSequence' },
+    '0038,0300' => { VR => 'LO', Name => 'CurrentPatientLocation' },
+    '0038,0400' => { VR => 'LO', Name => 'PatientInstitutionResidence' },
+    '0038,0500' => { VR => 'LO', Name => 'PatientState' },
+    '0038,0502' => { VR => 'SQ', Name => 'PatientClinicalTrialParticipSeq' },
+    '0038,4000' => { VR => 'LT', Name => 'VisitComments' },
+    '003A,0004' => { VR => 'CS', Name => 'WaveformOriginality' },
+    '003A,0005' => { VR => 'US', Name => 'NumberOfWaveformChannels' },
+    '003A,0010' => { VR => 'UL', Name => 'NumberOfWaveformSamples' },
+    '003A,001A' => { VR => 'DS', Name => 'SamplingFrequency' },
+    '003A,0020' => { VR => 'SH', Name => 'MultiplexGroupLabel' },
+    '003A,0200' => { VR => 'SQ', Name => 'ChannelDefinitionSequence' },
+    '003A,0202' => { VR => 'IS', Name => 'WaveformChannelNumber' },
+    '003A,0203' => { VR => 'SH', Name => 'ChannelLabel' },
+    '003A,0205' => { VR => 'CS', Name => 'ChannelStatus' },
+    '003A,0208' => { VR => 'SQ', Name => 'ChannelSourceSequence' },
+    '003A,0209' => { VR => 'SQ', Name => 'ChannelSourceModifiersSequence' },
+    '003A,020A' => { VR => 'SQ', Name => 'SourceWaveformSequence' },
+    '003A,020C' => { VR => 'LO', Name => 'ChannelDerivationDescription' },
+    '003A,0210' => { VR => 'DS', Name => 'ChannelSensitivity' },
+    '003A,0211' => { VR => 'SQ', Name => 'ChannelSensitivityUnitsSequence' },
+    '003A,0212' => { VR => 'DS', Name => 'ChannelSensitivityCorrectionFactor' },
+    '003A,0213' => { VR => 'DS', Name => 'ChannelBaseline' },
+    '003A,0214' => { VR => 'DS', Name => 'ChannelTimeSkew' },
+    '003A,0215' => { VR => 'DS', Name => 'ChannelSampleSkew' },
+    '003A,0218' => { VR => 'DS', Name => 'ChannelOffset' },
+    '003A,021A' => { VR => 'US', Name => 'WaveformBitsStored' },
+    '003A,0220' => { VR => 'DS', Name => 'FilterLowFrequency' },
+    '003A,0221' => { VR => 'DS', Name => 'FilterHighFrequency' },
+    '003A,0222' => { VR => 'DS', Name => 'NotchFilterFrequency' },
+    '003A,0223' => { VR => 'DS', Name => 'NotchFilterBandwidth' },
+    '003A,0230' => { VR => 'FL', Name => 'WaveformDataDisplayScale' },
+    '003A,0231' => { VR => 'US', Name => 'WaveformDisplayBkgCIELabValue' },
+    '003A,0240' => { VR => 'SQ', Name => 'WaveformPresentationGroupSequence' },
+    '003A,0241' => { VR => 'US', Name => 'PresentationGroupNumber' },
+    '003A,0242' => { VR => 'SQ', Name => 'ChannelDisplaySequence' },
+    '003A,0244' => { VR => 'US', Name => 'ChannelRecommendDisplayCIELabValue' },
+    '003A,0245' => { VR => 'FL', Name => 'ChannelPosition' },
+    '003A,0246' => { VR => 'CS', Name => 'DisplayShadingFlag' },
+    '003A,0247' => { VR => 'FL', Name => 'FractionalChannelDisplayScale' },
+    '003A,0248' => { VR => 'FL', Name => 'AbsoluteChannelDisplayScale' },
+    '003A,0300' => { VR => 'SQ', Name => 'MultiplexAudioChannelsDescrCodeSeq' },
+    '003A,0301' => { VR => 'IS', Name => 'ChannelIdentificationCode' },
+    '003A,0302' => { VR => 'CS', Name => 'ChannelMode' },
+    '0040,0001' => { VR => 'AE', Name => 'ScheduledStationAETitle' },
+    '0040,0002' => { VR => 'DA', Name => 'ScheduledProcedureStepStartDate' },
+    '0040,0003' => { VR => 'TM', Name => 'ScheduledProcedureStepStartTime' },
+    '0040,0004' => { VR => 'DA', Name => 'ScheduledProcedureStepEndDate' },
+    '0040,0005' => { VR => 'TM', Name => 'ScheduledProcedureStepEndTime' },
+    '0040,0006' => { VR => 'PN', Name => 'ScheduledPerformingPhysiciansName' },
+    '0040,0007' => { VR => 'LO', Name => 'ScheduledProcedureStepDescription' },
+    '0040,0008' => { VR => 'SQ', Name => 'ScheduledProtocolCodeSequence' },
+    '0040,0009' => { VR => 'SH', Name => 'ScheduledProcedureStepID' },
+    '0040,000A' => { VR => 'SQ', Name => 'StageCodeSequence' },
+    '0040,000B' => { VR => 'SQ', Name => 'ScheduledPerformingPhysicianIDSeq' },
+    '0040,0010' => { VR => 'SH', Name => 'ScheduledStationName' },
+    '0040,0011' => { VR => 'SH', Name => 'ScheduledProcedureStepLocation' },
+    '0040,0012' => { VR => 'LO', Name => 'PreMedication' },
+    '0040,0020' => { VR => 'CS', Name => 'ScheduledProcedureStepStatus' },
+    '0040,0031' => { VR => 'UT', Name => 'LocalNamespaceEntityID' },
+    '0040,0032' => { VR => 'UT', Name => 'UniversalEntityID' },
+    '0040,0033' => { VR => 'CS', Name => 'UniversalEntityIDType' },
+    '0040,0035' => { VR => 'CS', Name => 'IdentifierTypeCode' },
+    '0040,0036' => { VR => 'SQ', Name => 'AssigningFacilitySequence' },
+    '0040,0100' => { VR => 'SQ', Name => 'ScheduledProcedureStepSequence' },
+    '0040,0220' => { VR => 'SQ', Name => 'ReferencedNonImageCompositeSOPSeq' },
+    '0040,0241' => { VR => 'AE', Name => 'PerformedStationAETitle' },
+    '0040,0242' => { VR => 'SH', Name => 'PerformedStationName' },
+    '0040,0243' => { VR => 'SH', Name => 'PerformedLocation' },
+    '0040,0244' => { VR => 'DA', Name => 'PerformedProcedureStepStartDate' },
+    '0040,0245' => { VR => 'TM', Name => 'PerformedProcedureStepStartTime' },
+    '0040,0250' => { VR => 'DA', Name => 'PerformedProcedureStepEndDate' },
+    '0040,0251' => { VR => 'TM', Name => 'PerformedProcedureStepEndTime' },
+    '0040,0252' => { VR => 'CS', Name => 'PerformedProcedureStepStatus' },
+    '0040,0253' => { VR => 'SH', Name => 'PerformedProcedureStepID' },
+    '0040,0254' => { VR => 'LO', Name => 'PerformedProcedureStepDescription' },
+    '0040,0255' => { VR => 'LO', Name => 'PerformedProcedureTypeDescription' },
+    '0040,0260' => { VR => 'SQ', Name => 'PerformedProtocolCodeSequence' },
+    '0040,0261' => { VR => 'CS', Name => 'PerformedProtocolType' },
+    '0040,0270' => { VR => 'SQ', Name => 'ScheduledStepAttributesSequence' },
+    '0040,0275' => { VR => 'SQ', Name => 'RequestAttributesSequence' },
+    '0040,0280' => { VR => 'ST', Name => 'CommentsOnPerformedProcedureStep' },
+    '0040,0281' => { VR => 'SQ', Name => 'ProcStepDiscontinueReasonCodeSeq' },
+    '0040,0293' => { VR => 'SQ', Name => 'QuantitySequence' },
+    '0040,0294' => { VR => 'DS', Name => 'Quantity' },
+    '0040,0295' => { VR => 'SQ', Name => 'MeasuringUnitsSequence' },
+    '0040,0296' => { VR => 'SQ', Name => 'BillingItemSequence' },
+    '0040,0300' => { VR => 'US', Name => 'TotalTimeOfFluoroscopy' },
+    '0040,0301' => { VR => 'US', Name => 'TotalNumberOfExposures' },
+    '0040,0302' => { VR => 'US', Name => 'EntranceDose' },
+    '0040,0303' => { VR => 'US', Name => 'ExposedArea' },
+    '0040,0306' => { VR => 'DS', Name => 'DistanceSourceToEntrance' },
+    '0040,0307' => { VR => 'DS', Name => 'DistanceSourceToSupport' },
+    '0040,030E' => { VR => 'SQ', Name => 'ExposureDoseSequence' },
+    '0040,0310' => { VR => 'ST', Name => 'CommentsOnRadiationDose' },
+    '0040,0312' => { VR => 'DS', Name => 'XRayOutput' },
+    '0040,0314' => { VR => 'DS', Name => 'HalfValueLayer' },
+    '0040,0316' => { VR => 'DS', Name => 'OrganDose' },
+    '0040,0318' => { VR => 'CS', Name => 'OrganExposed' },
+    '0040,0320' => { VR => 'SQ', Name => 'BillingProcedureStepSequence' },
+    '0040,0321' => { VR => 'SQ', Name => 'FilmConsumptionSequence' },
+    '0040,0324' => { VR => 'SQ', Name => 'BillingSuppliesAndDevicesSequence' },
+    '0040,0330' => { VR => 'SQ', Name => 'ReferencedProcedureStepSequence' },
+    '0040,0340' => { VR => 'SQ', Name => 'PerformedSeriesSequence' },
+    '0040,0400' => { VR => 'LT', Name => 'CommentsOnScheduledProcedureStep' },
+    '0040,0440' => { VR => 'SQ', Name => 'ProtocolContextSequence' },
+    '0040,0441' => { VR => 'SQ', Name => 'ContentItemModifierSequence' },
+    '0040,050A' => { VR => 'LO', Name => 'SpecimenAccessionNumber' },
+    '0040,0512' => { VR => 'LO', Name => 'ContainerIdentifier' },
+    '0040,051A' => { VR => 'LO', Name => 'ContainerDescription' },
+    '0040,0550' => { VR => 'SQ', Name => 'SpecimenSequence' },
+    '0040,0551' => { VR => 'LO', Name => 'SpecimenIdentifier' },
+    '0040,0552' => { VR => 'SQ', Name => 'SpecimenDescriptionSequenceTrial' },
+    '0040,0553' => { VR => 'ST', Name => 'SpecimenDescriptionTrial' },
+    '0040,0554' => { VR => 'UI', Name => 'SpecimenUID' },
+    '0040,0555' => { VR => 'SQ', Name => 'AcquisitionContextSequence' },
+    '0040,0556' => { VR => 'ST', Name => 'AcquisitionContextDescription' },
+    '0040,059A' => { VR => 'SQ', Name => 'SpecimenTypeCodeSequence' },
+    '0040,0600' => { VR => 'LO', Name => 'SpecimenShortDescription' },
+    '0040,06FA' => { VR => 'LO', Name => 'SlideIdentifier' },
+    '0040,071A' => { VR => 'SQ', Name => 'ImageCenterPointCoordinatesSeq' },
+    '0040,072A' => { VR => 'DS', Name => 'XOffsetInSlideCoordinateSystem' },
+    '0040,073A' => { VR => 'DS', Name => 'YOffsetInSlideCoordinateSystem' },
+    '0040,074A' => { VR => 'DS', Name => 'ZOffsetInSlideCoordinateSystem' },
+    '0040,08D8' => { VR => 'SQ', Name => 'PixelSpacingSequence' },
+    '0040,08DA' => { VR => 'SQ', Name => 'CoordinateSystemAxisCodeSequence' },
+    '0040,08EA' => { VR => 'SQ', Name => 'MeasurementUnitsCodeSequence' },
+    '0040,09F8' => { VR => 'SQ', Name => 'VitalStainCodeSequenceTrial' },
+    '0040,1001' => { VR => 'SH', Name => 'RequestedProcedureID' },
+    '0040,1002' => { VR => 'LO', Name => 'ReasonForRequestedProcedure' },
+    '0040,1003' => { VR => 'SH', Name => 'RequestedProcedurePriority' },
+    '0040,1004' => { VR => 'LO', Name => 'PatientTransportArrangements' },
+    '0040,1005' => { VR => 'LO', Name => 'RequestedProcedureLocation' },
+    '0040,1006' => { VR => 'SH', Name => 'PlacerOrderNumber-Procedure' },
+    '0040,1007' => { VR => 'SH', Name => 'FillerOrderNumber-Procedure' },
+    '0040,1008' => { VR => 'LO', Name => 'ConfidentialityCode' },
+    '0040,1009' => { VR => 'SH', Name => 'ReportingPriority' },
+    '0040,100A' => { VR => 'SQ', Name => 'ReasonForRequestedProcedureCodeSeq' },
+    '0040,1010' => { VR => 'PN', Name => 'NamesOfIntendedRecipientsOfResults' },
+    '0040,1011' => { VR => 'SQ', Name => 'IntendedRecipientsOfResultsIDSeq' },
+    '0040,1101' => { VR => 'SQ', Name => 'PersonIdentificationCodeSequence' },
+    '0040,1102' => { VR => 'ST', Name => 'PersonAddress' },
+    '0040,1103' => { VR => 'LO', Name => 'PersonTelephoneNumbers' },
+    '0040,1400' => { VR => 'LT', Name => 'RequestedProcedureComments' },
+    '0040,2001' => { VR => 'LO', Name => 'ReasonForImagingServiceRequest' },
+    '0040,2004' => { VR => 'DA', Name => 'IssueDateOfImagingServiceRequest' },
+    '0040,2005' => { VR => 'TM', Name => 'IssueTimeOfImagingServiceRequest' },
+    '0040,2006' => { VR => 'SH', Name => 'PlacerOrderNum-ImagingServiceReq' },
+    '0040,2007' => { VR => 'SH', Name => 'FillerOrderNum-ImagingServiceReq' },
+    '0040,2008' => { VR => 'PN', Name => 'OrderEnteredBy' },
+    '0040,2009' => { VR => 'SH', Name => 'OrderEntererLocation' },
+    '0040,2010' => { VR => 'SH', Name => 'OrderCallbackPhoneNumber' },
+    '0040,2016' => { VR => 'LO', Name => 'PlacerOrderNum-ImagingServiceReq' },
+    '0040,2017' => { VR => 'LO', Name => 'FillerOrderNum-ImagingServiceReq' },
+    '0040,2400' => { VR => 'LT', Name => 'ImagingServiceRequestComments' },
+    '0040,3001' => { VR => 'LO', Name => 'ConfidentialityOnPatientDataDescr' },
+    '0040,4001' => { VR => 'CS', Name => 'GenPurposeScheduledProcStepStatus' },
+    '0040,4002' => { VR => 'CS', Name => 'GenPurposePerformedProcStepStatus' },
+    '0040,4003' => { VR => 'CS', Name => 'GenPurposeSchedProcStepPriority' },
+    '0040,4004' => { VR => 'SQ', Name => 'SchedProcessingApplicationsCodeSeq' },
+    '0040,4005' => { VR => 'DT', Name => 'SchedProcedureStepStartDateAndTime' },
+    '0040,4006' => { VR => 'CS', Name => 'MultipleCopiesFlag' },
+    '0040,4007' => { VR => 'SQ', Name => 'PerformedProcessingAppsCodeSeq' },
+    '0040,4009' => { VR => 'SQ', Name => 'HumanPerformerCodeSequence' },
+    '0040,4010' => { VR => 'DT', Name => 'SchedProcStepModificationDateTime' },
+    '0040,4011' => { VR => 'DT', Name => 'ExpectedCompletionDateAndTime' },
+    '0040,4015' => { VR => 'SQ', Name => 'ResultingGenPurposePerfProcStepSeq' },
+    '0040,4016' => { VR => 'SQ', Name => 'RefGenPurposeSchedProcStepSeq' },
+    '0040,4018' => { VR => 'SQ', Name => 'ScheduledWorkitemCodeSequence' },
+    '0040,4019' => { VR => 'SQ', Name => 'PerformedWorkitemCodeSequence' },
+    '0040,4020' => { VR => 'CS', Name => 'InputAvailabilityFlag' },
+    '0040,4021' => { VR => 'SQ', Name => 'InputInformationSequence' },
+    '0040,4022' => { VR => 'SQ', Name => 'RelevantInformationSequence' },
+    '0040,4023' => { VR => 'UI', Name => 'RefGenPurSchedProcStepTransUID' },
+    '0040,4025' => { VR => 'SQ', Name => 'ScheduledStationNameCodeSequence' },
+    '0040,4026' => { VR => 'SQ', Name => 'ScheduledStationClassCodeSequence' },
+    '0040,4027' => { VR => 'SQ', Name => 'SchedStationGeographicLocCodeSeq' },
+    '0040,4028' => { VR => 'SQ', Name => 'PerformedStationNameCodeSequence' },
+    '0040,4029' => { VR => 'SQ', Name => 'PerformedStationClassCodeSequence' },
+    '0040,4030' => { VR => 'SQ', Name => 'PerformedStationGeogLocCodeSeq' },
+    '0040,4031' => { VR => 'SQ', Name => 'RequestedSubsequentWorkItemCodeSeq' },
+    '0040,4032' => { VR => 'SQ', Name => 'NonDICOMOutputCodeSequence' },
+    '0040,4033' => { VR => 'SQ', Name => 'OutputInformationSequence' },
+    '0040,4034' => { VR => 'SQ', Name => 'ScheduledHumanPerformersSequence' },
+    '0040,4035' => { VR => 'SQ', Name => 'ActualHumanPerformersSequence' },
+    '0040,4036' => { VR => 'LO', Name => 'HumanPerformersOrganization' },
+    '0040,4037' => { VR => 'PN', Name => 'HumanPerformerName' },
+    '0040,4040' => { VR => 'CS', Name => 'RawDataHandling' },
+    '0040,8302' => { VR => 'DS', Name => 'EntranceDoseInMilliGy' },
+    '0040,9094' => { VR => 'SQ', Name => 'RefImageRealWorldValueMappingSeq' },
+    '0040,9096' => { VR => 'SQ', Name => 'RealWorldValueMappingSequence' },
+    '0040,9098' => { VR => 'SQ', Name => 'PixelValueMappingCodeSequence' },
+    '0040,9210' => { VR => 'SH', Name => 'LUTLabel' },
+    '0040,9211' => { VR => 'SS', Name => 'RealWorldValueLastValueMapped' },
+    '0040,9212' => { VR => 'FD', Name => 'RealWorldValueLUTData' },
+    '0040,9216' => { VR => 'SS', Name => 'RealWorldValueFirstValueMapped' },
+    '0040,9224' => { VR => 'FD', Name => 'RealWorldValueIntercept' },
+    '0040,9225' => { VR => 'FD', Name => 'RealWorldValueSlope' },
+    '0040,A010' => { VR => 'CS', Name => 'RelationshipType' },
+    '0040,A027' => { VR => 'LO', Name => 'VerifyingOrganization' },
+    '0040,A030' => { VR => 'DT', Name => 'VerificationDateTime' },
+    '0040,A032' => { VR => 'DT', Name => 'ObservationDateTime' },
+    '0040,A040' => { VR => 'CS', Name => 'ValueType' },
+    '0040,A043' => { VR => 'SQ', Name => 'ConceptNameCodeSequence' },
+    '0040,A050' => { VR => 'CS', Name => 'ContinuityOfContent' },
+    '0040,A073' => { VR => 'SQ', Name => 'VerifyingObserverSequence' },
+    '0040,A075' => { VR => 'PN', Name => 'VerifyingObserverName' },
+    '0040,A078' => { VR => 'SQ', Name => 'AuthorObserverSequence' },
+    '0040,A07A' => { VR => 'SQ', Name => 'ParticipantSequence' },
+    '0040,A07C' => { VR => 'SQ', Name => 'CustodialOrganizationSequence' },
+    '0040,A080' => { VR => 'CS', Name => 'ParticipationType' },
+    '0040,A082' => { VR => 'DT', Name => 'ParticipationDateTime' },
+    '0040,A084' => { VR => 'CS', Name => 'ObserverType' },
+    '0040,A088' => { VR => 'SQ', Name => 'VerifyingObserverIdentCodeSequence' },
+    '0040,A090' => { VR => 'SQ', Name => 'EquivalentCDADocumentSequence' },
+    '0040,A0B0' => { VR => 'US', Name => 'ReferencedWaveformChannels' },
+    '0040,A120' => { VR => 'DT', Name => 'DateTime' },
+    '0040,A121' => { VR => 'DA', Name => 'Date' },
+    '0040,A122' => { VR => 'TM', Name => 'Time' },
+    '0040,A123' => { VR => 'PN', Name => 'PersonName' },
+    '0040,A124' => { VR => 'UI', Name => 'UID' },
+    '0040,A130' => { VR => 'CS', Name => 'TemporalRangeType' },
+    '0040,A132' => { VR => 'UL', Name => 'ReferencedSamplePositions' },
+    '0040,A136' => { VR => 'US', Name => 'ReferencedFrameNumbers' },
+    '0040,A138' => { VR => 'DS', Name => 'ReferencedTimeOffsets' },
+    '0040,A13A' => { VR => 'DT', Name => 'ReferencedDateTime' },
+    '0040,A160' => { VR => 'UT', Name => 'TextValue' },
+    '0040,A168' => { VR => 'SQ', Name => 'ConceptCodeSequence' },
+    '0040,A170' => { VR => 'SQ', Name => 'PurposeOfReferenceCodeSequence' },
+    '0040,A180' => { VR => 'US', Name => 'AnnotationGroupNumber' },
+    '0040,A195' => { VR => 'SQ', Name => 'ModifierCodeSequence' },
+    '0040,A300' => { VR => 'SQ', Name => 'MeasuredValueSequence' },
+    '0040,A301' => { VR => 'SQ', Name => 'NumericValueQualifierCodeSequence' },
+    '0040,A30A' => { VR => 'DS', Name => 'NumericValue' },
+    '0040,A353' => { VR => 'ST', Name => 'AddressTrial' },
+    '0040,A354' => { VR => 'LO', Name => 'TelephoneNumberTrial' },
+    '0040,A360' => { VR => 'SQ', Name => 'PredecessorDocumentsSequence' },
+    '0040,A370' => { VR => 'SQ', Name => 'ReferencedRequestSequence' },
+    '0040,A372' => { VR => 'SQ', Name => 'PerformedProcedureCodeSequence' },
+    '0040,A375' => { VR => 'SQ', Name => 'CurrentRequestedProcEvidenceSeq' },
+    '0040,A385' => { VR => 'SQ', Name => 'PertinentOtherEvidenceSequence' },
+    '0040,A390' => { VR => 'SQ', Name => 'HL7StructuredDocumentRefSeq' },
+    '0040,A491' => { VR => 'CS', Name => 'CompletionFlag' },
+    '0040,A492' => { VR => 'LO', Name => 'CompletionFlagDescription' },
+    '0040,A493' => { VR => 'CS', Name => 'VerificationFlag' },
+    '0040,A494' => { VR => 'CS', Name => 'ArchiveRequested' },
+    '0040,A496' => { VR => 'CS', Name => 'PreliminaryFlag' },
+    '0040,A504' => { VR => 'SQ', Name => 'ContentTemplateSequence' },
+    '0040,A525' => { VR => 'SQ', Name => 'IdenticalDocumentsSequence' },
+    '0040,A730' => { VR => 'SQ', Name => 'ContentSequence' },
+    '0040,B020' => { VR => 'SQ', Name => 'AnnotationSequence' },
+    '0040,DB00' => { VR => 'CS', Name => 'TemplateIdentifier' },
+    '0040,DB06' => { VR => 'DT', Name => 'TemplateVersion' },
+    '0040,DB07' => { VR => 'DT', Name => 'TemplateLocalVersion' },
+    '0040,DB0B' => { VR => 'CS', Name => 'TemplateExtensionFlag' },
+    '0040,DB0C' => { VR => 'UI', Name => 'TemplateExtensionOrganizationUID' },
+    '0040,DB0D' => { VR => 'UI', Name => 'TemplateExtensionCreatorUID' },
+    '0040,DB73' => { VR => 'UL', Name => 'ReferencedContentItemIdentifier' },
+    '0040,E001' => { VR => 'ST', Name => 'HL7InstanceIdentifier' },
+    '0040,E004' => { VR => 'DT', Name => 'HL7DocumentEffectiveTime' },
+    '0040,E006' => { VR => 'SQ', Name => 'HL7DocumentTypeCodeSequence' },
+    '0040,E010' => { VR => 'UT', Name => 'RetrieveURI' },
+    '0040,E011' => { VR => 'UI', Name => 'RetrieveLocationUID' },
+    '0042,0010' => { VR => 'ST', Name => 'DocumentTitle' },
+    '0042,0011' => { VR => 'OB', Name => 'EncapsulatedDocument' },
+    '0042,0012' => { VR => 'LO', Name => 'MIMETypeOfEncapsulatedDocument' },
+    '0042,0013' => { VR => 'SQ', Name => 'SourceInstanceSequence' },
+    '0042,0014' => { VR => 'LO', Name => 'ListOfMIMETypes' },
+    # GEMS_PARM_01 (ref 4)
+    '0043,1001' => { VR => 'SS', Name => 'BitmapOfPrescanOptions' },
+    '0043,1002' => { VR => 'SS', Name => 'GradientOffsetInX' },
+    '0043,1003' => { VR => 'SS', Name => 'GradientOffsetInY' },
+    '0043,1004' => { VR => 'SS', Name => 'GradientOffsetInZ' },
+    '0043,1005' => { VR => 'SS', Name => 'ImgIsOriginalOrUnoriginal' },
+    '0043,1006' => { VR => 'SS', Name => 'NumberOfEPIShots' },
+    '0043,1007' => { VR => 'SS', Name => 'ViewsPerSegment' },
+    '0043,1008' => { VR => 'SS', Name => 'RespiratoryRateBpm' },
+    '0043,1009' => { VR => 'SS', Name => 'RespiratoryTriggerPoint' },
+    '0043,100A' => { VR => 'SS', Name => 'TypeOfReceiverUsed' },
+    '0043,100B' => { VR => 'DS', Name => 'PeakRateOfChangeOfGradientField' },
+    '0043,100C' => { VR => 'DS', Name => 'LimitsInUnitsOfPercent' },
+    '0043,100D' => { VR => 'DS', Name => 'PSDEstimatedLimit' },
+    '0043,100E' => { VR => 'DS', Name => 'PSDEstimatedLimitInTeslaPerSecond' },
+    '0043,100F' => { VR => 'DS', Name => 'Saravghead' },
+    '0043,1010' => { VR => 'US', Name => 'WindowValue' },
+    '0043,1011' => { VR => 'US', Name => 'TotalInputViews' },
+    '0043,1012' => { VR => 'SS', Name => 'X-RayChain' },
+    '0043,1013' => { VR => 'SS', Name => 'DeconKernelParameters' },
+    '0043,1014' => { VR => 'SS', Name => 'CalibrationParameters' },
+    '0043,1015' => { VR => 'SS', Name => 'TotalOutputViews' },
+    '0043,1016' => { VR => 'SS', Name => 'NumberOfOverranges' },
+    '0043,1017' => { VR => 'DS', Name => 'IBHImageScaleFactors' },
+    '0043,1018' => { VR => 'DS', Name => 'BBHCoefficients' },
+    '0043,1019' => { VR => 'SS', Name => 'NumberOfBBHChainsToBlend' },
+    '0043,101A' => { VR => 'SL', Name => 'StartingChannelNumber' },
+    '0043,101B' => { VR => 'SS', Name => 'PpscanParameters' },
+    '0043,101C' => { VR => 'SS', Name => 'GEImageIntegrity' },
+    '0043,101D' => { VR => 'SS', Name => 'LevelValue' },
+    '0043,101E' => { VR => 'DS', Name => 'DeltaStartTime' },
+    '0043,101F' => { VR => 'SL', Name => 'MaxOverrangesInAView' },
+    '0043,1020' => { VR => 'DS', Name => 'AvgOverrangesAllViews' },
+    '0043,1021' => { VR => 'SS', Name => 'CorrectedAfterGlowTerms' },
+    '0043,1025' => { VR => 'SS', Name => 'ReferenceChannels' },
+    '0043,1026' => { VR => 'US', Name => 'NoViewsRefChansBlocked' },
+    '0043,1027' => { VR => 'SH', Name => 'ScanPitchRatio' },
+    '0043,1028' => { VR => 'OB', Name => 'UniqueImageIden' },
+    '0043,1029' => { VR => 'OB', Name => 'HistogramTables' },
+    '0043,102A' => { VR => 'OB', Name => 'UserDefinedData' },
+    '0043,102B' => { VR => 'SS', Name => 'PrivateScanOptions' },
+    '0043,102C' => { VR => 'SS', Name => 'EffectiveEchoSpacing' },
+    '0043,102D' => { VR => 'SH', Name => 'StringSlopField1' },
+    '0043,102E' => { VR => 'SH', Name => 'StringSlopField2' },
+    '0043,102F' => { VR => 'SS', Name => 'RawDataType' },
+    '0043,1030' => { VR => 'SS', Name => 'RawDataType' },
+    '0043,1031' => { VR => 'DS', Name => 'RACordOfTargetReconCenter' },
+    '0043,1032' => { VR => 'SS', Name => 'RawDataType' },
+    '0043,1033' => { VR => 'FL', Name => 'NegScanspacing' },
+    '0043,1034' => { VR => 'IS', Name => 'OffsetFrequency' },
+    '0043,1035' => { VR => 'UL', Name => 'UserUsageTag' },
+    '0043,1036' => { VR => 'UL', Name => 'UserFillMapMSW' },
+    '0043,1037' => { VR => 'UL', Name => 'UserFillMapLSW' },
+    '0043,1038' => { VR => 'FL', Name => 'User25-48' },
+    '0043,1039' => { VR => 'IS', Name => 'SlopInt6-9' },
+    '0043,1040' => { VR => 'FL', Name => 'TriggerOnPosition' },
+    '0043,1041' => { VR => 'FL', Name => 'DegreeOfRotation' },
+    '0043,1042' => { VR => 'SL', Name => 'DASTriggerSource' },
+    '0043,1043' => { VR => 'SL', Name => 'DASFpaGain' },
+    '0043,1044' => { VR => 'SL', Name => 'DASOutputSource' },
+    '0043,1045' => { VR => 'SL', Name => 'DASAdInput' },
+    '0043,1046' => { VR => 'SL', Name => 'DASCalMode' },
+    '0043,1047' => { VR => 'SL', Name => 'DASCalFrequency' },
+    '0043,1048' => { VR => 'SL', Name => 'DASRegXm' },
+    '0043,1049' => { VR => 'SL', Name => 'DASAutoZero' },
+    '0043,104A' => { VR => 'SS', Name => 'StartingChannelOfView' },
+    '0043,104B' => { VR => 'SL', Name => 'DASXmPattern' },
+    '0043,104C' => { VR => 'SS', Name => 'TGGCTriggerMode' },
+    '0043,104D' => { VR => 'FL', Name => 'StartScanToXrayOnDelay' },
+    '0043,104E' => { VR => 'FL', Name => 'DurationOfXrayOn' },
+    '0043,1060' => { VR => 'IS', Name => 'SlopInt10-17' },
+    '0043,1061' => { VR => 'UI', Name => 'ScannerStudyEntityUID' },
+    '0043,1062' => { VR => 'SH', Name => 'ScannerStudyID' },
+    '0043,106f' => { VR => 'DS', Name => 'ScannerTableEntry' },
+    # ?
+    '0044,0001' => { VR => 'ST', Name => 'ProductPackageIdentifier' },
+    '0044,0002' => { VR => 'CS', Name => 'SubstanceAdministrationApproval' },
+    '0044,0003' => { VR => 'LT', Name => 'ApprovalStatusFurtherDescription' },
+    '0044,0004' => { VR => 'DT', Name => 'ApprovalStatusDateTime' },
+    '0044,0007' => { VR => 'SQ', Name => 'ProductTypeCodeSequence' },
+    '0044,0008' => { VR => 'LO', Name => 'ProductName' },
+    '0044,0009' => { VR => 'LT', Name => 'ProductDescription' },
+    '0044,000A' => { VR => 'LO', Name => 'ProductLotIdentifier' },
+    '0044,000B' => { VR => 'DT', Name => 'ProductExpirationDateTime' },
+    '0044,0010' => { VR => 'DT', Name => 'SubstanceAdministrationDateTime' },
+    '0044,0011' => { VR => 'LO', Name => 'SubstanceAdministrationNotes' },
+    '0044,0012' => { VR => 'LO', Name => 'SubstanceAdministrationDeviceID' },
+    '0044,0013' => { VR => 'SQ', Name => 'ProductParameterSequence' },
+    '0044,0019' => { VR => 'SQ', Name => 'SubstanceAdminParameterSeq' },
+    # GEMS_HELIOS_01 (ref 4)
+    '0045,1001' => { VR => 'LO', Name => 'NumberOfMacroRowsInDetector' },
+    '0045,1002' => { VR => 'FL', Name => 'MacroWidthAtISOCenter' },
+    '0045,1003' => { VR => 'SS', Name => 'DASType' },
+    '0045,1004' => { VR => 'SS', Name => 'DASGain' },
+    '0045,1005' => { VR => 'SS', Name => 'DASTemperature' },
+    '0045,1006' => { VR => 'CS', Name => 'TableDirectionInOrOut' },
+    '0045,1007' => { VR => 'FL', Name => 'ZSmoothingFactor' },
+    '0045,1008' => { VR => 'SS', Name => 'ViewWeightingMode' },
+    '0045,1009' => { VR => 'SS', Name => 'SigmaRowNumberWhichRowsWereUsed' },
+    '0045,100A' => { VR => 'FL', Name => 'MinimumDasValueFoundInTheScanData' },
+    '0045,100B' => { VR => 'FL', Name => 'MaximumOffsetShiftValueUsed' },
+    '0045,100C' => { VR => 'SS', Name => 'NumberOfViewsShifted' },
+    '0045,100D' => { VR => 'SS', Name => 'ZTrackingFlag' },
+    '0045,100E' => { VR => 'FL', Name => 'MeanZError' },
+    '0045,100F' => { VR => 'FL', Name => 'ZTrackingMaximumError' },
+    '0045,1010' => { VR => 'SS', Name => 'StartingViewForRow2a' },
+    '0045,1011' => { VR => 'SS', Name => 'NumberOfViewsInRow2a' },
+    '0045,1012' => { VR => 'SS', Name => 'StartingViewForRow1a' },
+    '0045,1013' => { VR => 'SS', Name => 'SigmaMode' },
+    '0045,1014' => { VR => 'SS', Name => 'NumberOfViewsInRow1a' },
+    '0045,1015' => { VR => 'SS', Name => 'StartingViewForRow2b' },
+    '0045,1016' => { VR => 'SS', Name => 'NumberOfViewsInRow2b' },
+    '0045,1017' => { VR => 'SS', Name => 'StartingViewForRow1b' },
+    '0045,1018' => { VR => 'SS', Name => 'NumberOfViewsInRow1b' },
+    '0045,1019' => { VR => 'SS', Name => 'AirFilterCalibrationDate' },
+    '0045,101A' => { VR => 'SS', Name => 'AirFilterCalibrationTime' },
+    '0045,101B' => { VR => 'SS', Name => 'PhantomCalibrationDate' },
+    '0045,101C' => { VR => 'SS', Name => 'PhantomCalibrationTime' },
+    '0045,101D' => { VR => 'SS', Name => 'ZSlopeCalibrationDate' },
+    '0045,101E' => { VR => 'SS', Name => 'ZSlopeCalibrationTime' },
+    '0045,101F' => { VR => 'SS', Name => 'CrosstalkCalibrationDate' },
+    '0045,1020' => { VR => 'SS', Name => 'CrosstalkCalibrationTime' },
+    '0045,1021' => { VR => 'SS', Name => 'IterboneOptionFlag' },
+    '0045,1022' => { VR => 'SS', Name => 'PeristalticFlagOption' },
+    '0046,0012' => { VR => 'LO', Name => 'LensDescription' },
+    '0046,0014' => { VR => 'SQ', Name => 'RightLensSequence' },
+    '0046,0015' => { VR => 'SQ', Name => 'LeftLensSequence' },
+    '0046,0018' => { VR => 'SQ', Name => 'CylinderSequence' },
+    '0046,0028' => { VR => 'SQ', Name => 'PrismSequence' },
+    '0046,0030' => { VR => 'FD', Name => 'HorizontalPrismPower' },
+    '0046,0032' => { VR => 'CS', Name => 'HorizontalPrismBase' },
+    '0046,0034' => { VR => 'FD', Name => 'VerticalPrismPower' },
+    '0046,0036' => { VR => 'CS', Name => 'VerticalPrismBase' },
+    '0046,0038' => { VR => 'CS', Name => 'LensSegmentType' },
+    '0046,0040' => { VR => 'FD', Name => 'OpticalTransmittance' },
+    '0046,0042' => { VR => 'FD', Name => 'ChannelWidth' },
+    '0046,0044' => { VR => 'FD', Name => 'PupilSize' },
+    '0046,0046' => { VR => 'FD', Name => 'CornealSize' },
+    '0046,0060' => { VR => 'FD', Name => 'DistancePupillaryDistance' },
+    '0046,0062' => { VR => 'FD', Name => 'NearPupillaryDistance' },
+    '0046,0064' => { VR => 'FD', Name => 'OtherPupillaryDistance' },
+    '0046,0075' => { VR => 'FD', Name => 'RadiusOfCurvature' },
+    '0046,0076' => { VR => 'FD', Name => 'KeratometricPower' },
+    '0046,0077' => { VR => 'FD', Name => 'KeratometricAxis' },
+    '0046,0092' => { VR => 'CS', Name => 'BackgroundColor' },
+    '0046,0094' => { VR => 'CS', Name => 'Optotype' },
+    '0046,0095' => { VR => 'CS', Name => 'OptotypePresentation' },
+    '0046,0100' => { VR => 'SQ', Name => 'AddNearSequence' },
+    '0046,0101' => { VR => 'SQ', Name => 'AddIntermediateSequence' },
+    '0046,0102' => { VR => 'SQ', Name => 'AddOtherSequence' },
+    '0046,0104' => { VR => 'FD', Name => 'AddPower' },
+    '0046,0106' => { VR => 'FD', Name => 'ViewingDistance' },
+    '0046,0125' => { VR => 'CS', Name => 'ViewingDistanceType' },
+    '0046,0135' => { VR => 'SS', Name => 'VisualAcuityModifiers' },
+    '0046,0137' => { VR => 'FD', Name => 'DecimalVisualAcuity' },
+    '0046,0139' => { VR => 'LO', Name => 'OptotypeDetailedDefinition' },
+    '0046,0146' => { VR => 'FD', Name => 'SpherePower' },
+    '0046,0147' => { VR => 'FD', Name => 'CylinderPower' },
+    # calibration group
+    '0050,0004' => { VR => 'CS', Name => 'CalibrationImage' },
+    '0050,0010' => { VR => 'SQ', Name => 'DeviceSequence' },
+    '0050,0014' => { VR => 'DS', Name => 'DeviceLength' },
+    '0050,0015' => { VR => 'FD', Name => 'ContainerComponentWidth' },
+    '0050,0016' => { VR => 'DS', Name => 'DeviceDiameter' },
+    '0050,0017' => { VR => 'CS', Name => 'DeviceDiameterUnits' },
+    '0050,0018' => { VR => 'DS', Name => 'DeviceVolume' },
+    '0050,0019' => { VR => 'DS', Name => 'InterMarkerDistance' },
+    '0050,001B' => { VR => 'LO', Name => 'ContainerComponentID' },
+    '0050,0020' => { VR => 'LO', Name => 'DeviceDescription' },
+    # nuclear acquisition group
+    '0054,0010' => { VR => 'US', Name => 'EnergyWindowVector' },
+    '0054,0011' => { VR => 'US', Name => 'NumberOfEnergyWindows' },
+    '0054,0012' => { VR => 'SQ', Name => 'EnergyWindowInformationSequence' },
+    '0054,0013' => { VR => 'SQ', Name => 'EnergyWindowRangeSequence' },
+    '0054,0014' => { VR => 'DS', Name => 'EnergyWindowLowerLimit' },
+    '0054,0015' => { VR => 'DS', Name => 'EnergyWindowUpperLimit' },
+    '0054,0016' => { VR => 'SQ', Name => 'RadiopharmaceuticalInformationSeq' },
+    '0054,0017' => { VR => 'IS', Name => 'ResidualSyringeCounts' },
+    '0054,0018' => { VR => 'SH', Name => 'EnergyWindowName' },
+    '0054,0020' => { VR => 'US', Name => 'DetectorVector' },
+    '0054,0021' => { VR => 'US', Name => 'NumberOfDetectors' },
+    '0054,0022' => { VR => 'SQ', Name => 'DetectorInformationSequence' },
+    '0054,0030' => { VR => 'US', Name => 'PhaseVector' },
+    '0054,0031' => { VR => 'US', Name => 'NumberOfPhases' },
+    '0054,0032' => { VR => 'SQ', Name => 'PhaseInformationSequence' },
+    '0054,0033' => { VR => 'US', Name => 'NumberOfFramesInPhase' },
+    '0054,0036' => { VR => 'IS', Name => 'PhaseDelay' },
+    '0054,0038' => { VR => 'IS', Name => 'PauseBetweenFrames' },
+    '0054,0039' => { VR => 'CS', Name => 'PhaseDescription' },
+    '0054,0050' => { VR => 'US', Name => 'RotationVector' },
+    '0054,0051' => { VR => 'US', Name => 'NumberOfRotations' },
+    '0054,0052' => { VR => 'SQ', Name => 'RotationInformationSequence' },
+    '0054,0053' => { VR => 'US', Name => 'NumberOfFramesInRotation' },
+    '0054,0060' => { VR => 'US', Name => 'RRIntervalVector' },
+    '0054,0061' => { VR => 'US', Name => 'NumberOfRRIntervals' },
+    '0054,0062' => { VR => 'SQ', Name => 'GatedInformationSequence' },
+    '0054,0063' => { VR => 'SQ', Name => 'DataInformationSequence' },
+    '0054,0070' => { VR => 'US', Name => 'TimeSlotVector' },
+    '0054,0071' => { VR => 'US', Name => 'NumberOfTimeSlots' },
+    '0054,0072' => { VR => 'SQ', Name => 'TimeSlotInformationSequence' },
+    '0054,0073' => { VR => 'DS', Name => 'TimeSlotTime' },
+    '0054,0080' => { VR => 'US', Name => 'SliceVector' },
+    '0054,0081' => { VR => 'US', Name => 'NumberOfSlices' },
+    '0054,0090' => { VR => 'US', Name => 'AngularViewVector' },
+    '0054,0100' => { VR => 'US', Name => 'TimeSliceVector' },
+    '0054,0101' => { VR => 'US', Name => 'NumberOfTimeSlices' },
+    '0054,0200' => { VR => 'DS', Name => 'StartAngle' },
+    '0054,0202' => { VR => 'CS', Name => 'TypeOfDetectorMotion' },
+    '0054,0210' => { VR => 'IS', Name => 'TriggerVector' },
+    '0054,0211' => { VR => 'US', Name => 'NumberOfTriggersInPhase' },
+    '0054,0220' => { VR => 'SQ', Name => 'ViewCodeSequence' },
+    '0054,0222' => { VR => 'SQ', Name => 'ViewModifierCodeSequence' },
+    '0054,0300' => { VR => 'SQ', Name => 'RadionuclideCodeSequence' },
+    '0054,0302' => { VR => 'SQ', Name => 'AdministrationRouteCodeSequence' },
+    '0054,0304' => { VR => 'SQ', Name => 'RadiopharmaceuticalCodeSequence' },
+    '0054,0306' => { VR => 'SQ', Name => 'CalibrationDataSequence' },
+    '0054,0308' => { VR => 'US', Name => 'EnergyWindowNumber' },
+    '0054,0400' => { VR => 'SH', Name => 'ImageID' },
+    '0054,0410' => { VR => 'SQ', Name => 'PatientOrientationCodeSequence' },
+    '0054,0412' => { VR => 'SQ', Name => 'PatientOrientationModifierCodeSeq' },
+    '0054,0414' => { VR => 'SQ', Name => 'PatientGantryRelationshipCodeSeq' },
+    '0054,0500' => { VR => 'CS', Name => 'SliceProgressionDirection' },
+    '0054,1000' => { VR => 'CS', Name => 'SeriesType' },
+    '0054,1001' => { VR => 'CS', Name => 'Units' },
+    '0054,1002' => { VR => 'CS', Name => 'CountsSource' },
+    '0054,1004' => { VR => 'CS', Name => 'ReprojectionMethod' },
+    '0054,1100' => { VR => 'CS', Name => 'RandomsCorrectionMethod' },
+    '0054,1101' => { VR => 'LO', Name => 'AttenuationCorrectionMethod' },
+    '0054,1102' => { VR => 'CS', Name => 'DecayCorrection' },
+    '0054,1103' => { VR => 'LO', Name => 'ReconstructionMethod' },
+    '0054,1104' => { VR => 'LO', Name => 'DetectorLinesOfResponseUsed' },
+    '0054,1105' => { VR => 'LO', Name => 'ScatterCorrectionMethod' },
+    '0054,1200' => { VR => 'DS', Name => 'AxialAcceptance' },
+    '0054,1201' => { VR => 'IS', Name => 'AxialMash' },
+    '0054,1202' => { VR => 'IS', Name => 'TransverseMash' },
+    '0054,1203' => { VR => 'DS', Name => 'DetectorElementSize' },
+    '0054,1210' => { VR => 'DS', Name => 'CoincidenceWindowWidth' },
+    '0054,1220' => { VR => 'CS', Name => 'SecondaryCountsType' },
+    '0054,1300' => { VR => 'DS', Name => 'FrameReferenceTime' },
+    '0054,1310' => { VR => 'IS', Name => 'PrimaryCountsAccumulated' },
+    '0054,1311' => { VR => 'IS', Name => 'SecondaryCountsAccumulated' },
+    '0054,1320' => { VR => 'DS', Name => 'SliceSensitivityFactor' },
+    '0054,1321' => { VR => 'DS', Name => 'DecayFactor' },
+    '0054,1322' => { VR => 'DS', Name => 'DoseCalibrationFactor' },
+    '0054,1323' => { VR => 'DS', Name => 'ScatterFractionFactor' },
+    '0054,1324' => { VR => 'DS', Name => 'DeadTimeFactor' },
+    '0054,1330' => { VR => 'US', Name => 'ImageIndex' },
+    '0054,1400' => { VR => 'CS', Name => 'CountsIncluded' },
+    '0054,1401' => { VR => 'CS', Name => 'DeadTimeCorrectionFlag' },
+    '0060,3000' => { VR => 'SQ', Name => 'HistogramSequence' },
+    '0060,3002' => { VR => 'US', Name => 'HistogramNumberOfBins' },
+    '0060,3004' => { VR => 'US', Name => 'HistogramFirstBinValue' },
+    '0060,3006' => { VR => 'US', Name => 'HistogramLastBinValue' },
+    '0060,3008' => { VR => 'US', Name => 'HistogramBinWidth' },
+    '0060,3010' => { VR => 'LO', Name => 'HistogramExplanation' },
+    '0060,3020' => { VR => 'UL', Name => 'HistogramData' },
+    '0062,0001' => { VR => 'CS', Name => 'SegmentationType' },
+    '0062,0002' => { VR => 'SQ', Name => 'SegmentSequence' },
+    '0062,0003' => { VR => 'SQ', Name => 'SegmentedPropertyCategoryCodeSeq' },
+    '0062,0004' => { VR => 'US', Name => 'SegmentNumber' },
+    '0062,0005' => { VR => 'LO', Name => 'SegmentLabel' },
+    '0062,0006' => { VR => 'ST', Name => 'SegmentDescription' },
+    '0062,0008' => { VR => 'CS', Name => 'SegmentAlgorithmType' },
+    '0062,0009' => { VR => 'LO', Name => 'SegmentAlgorithmName' },
+    '0062,000A' => { VR => 'SQ', Name => 'SegmentIdentificationSequence' },
+    '0062,000B' => { VR => 'US', Name => 'ReferencedSegmentNumber' },
+    '0062,000C' => { VR => 'US', Name => 'RecommendedDisplayGrayscaleValue' },
+    '0062,000D' => { VR => 'US', Name => 'RecommendedDisplayCIELabValue' },
+    '0062,000E' => { VR => 'US', Name => 'MaximumFractionalValue' },
+    '0062,000F' => { VR => 'SQ', Name => 'SegmentedPropertyTypeCodeSequence' },
+    '0062,0010' => { VR => 'CS', Name => 'SegmentationFractionalType' },
+    '0064,0002' => { VR => 'SQ', Name => 'DeformableRegistrationSequence' },
+    '0064,0003' => { VR => 'UI', Name => 'SourceFrameOfReferenceUID' },
+    '0064,0005' => { VR => 'SQ', Name => 'DeformableRegistrationGridSequence' },
+    '0064,0007' => { VR => 'UL', Name => 'GridDimensions' },
+    '0064,0008' => { VR => 'FD', Name => 'GridResolution' },
+    '0064,0009' => { VR => 'OF', Name => 'VectorGridData' },
+    '0064,000F' => { VR => 'SQ', Name => 'PreDeformationMatrixRegistSeq' },
+    '0064,0010' => { VR => 'SQ', Name => 'PostDeformationMatrixRegistSeq' },
+    '0066,0001' => { VR => 'UL', Name => 'NumberOfSurfaces' },
+    '0066,0002' => { VR => 'SQ', Name => 'SurfaceSequence' },
+    '0066,0003' => { VR => 'UL', Name => 'SurfaceNumber' },
+    '0066,0004' => { VR => 'LT', Name => 'SurfaceComments' },
+    '0066,0009' => { VR => 'CS', Name => 'SurfaceProcessing' },
+    '0066,000A' => { VR => 'FL', Name => 'SurfaceProcessingRatio' },
+    '0066,000E' => { VR => 'CS', Name => 'FiniteVolume' },
+    '0066,0010' => { VR => 'CS', Name => 'Manifold' },
+    '0066,0011' => { VR => 'SQ', Name => 'SurfacePointsSequence' },
+    '0066,0015' => { VR => 'UL', Name => 'NumberOfSurfacePoints' },
+    '0066,0016' => { VR => 'OF', Name => 'PointCoordinatesData' },
+    '0066,0017' => { VR => 'FL', Name => 'PointPositionAccuracy' },
+    '0066,0018' => { VR => 'FL', Name => 'MeanPointDistance' },
+    '0066,0019' => { VR => 'FL', Name => 'MaximumPointDistance' },
+    '0066,001B' => { VR => 'FL', Name => 'AxisOfRotation' },
+    '0066,001C' => { VR => 'FL', Name => 'CenterOfRotation' },
+    '0066,001E' => { VR => 'UL', Name => 'NumberOfVectors' },
+    '0066,001F' => { VR => 'US', Name => 'VectorDimensionality' },
+    '0066,0020' => { VR => 'FL', Name => 'VectorAccuracy' },
+    '0066,0021' => { VR => 'OF', Name => 'VectorCoordinateData' },
+    '0066,0023' => { VR => 'OW', Name => 'TrianglePointIndexList' },
+    '0066,0024' => { VR => 'OW', Name => 'EdgePointIndexList' },
+    '0066,0025' => { VR => 'OW', Name => 'VertexPointIndexList' },
+    '0066,0026' => { VR => 'SQ', Name => 'TriangleStripSequence' },
+    '0066,0027' => { VR => 'SQ', Name => 'TriangleFanSequence' },
+    '0066,0028' => { VR => 'SQ', Name => 'LineSequence' },
+    '0066,0029' => { VR => 'OW', Name => 'PrimitivePointIndexList' },
+    '0066,002A' => { VR => 'UL', Name => 'SurfaceCount' },
+    '0066,002F' => { VR => 'SQ', Name => 'AlgorithmFamilyCodeSequ' },
+    '0066,0031' => { VR => 'LO', Name => 'AlgorithmVersion' },
+    '0066,0032' => { VR => 'LT', Name => 'AlgorithmParameters' },
+    '0066,0034' => { VR => 'SQ', Name => 'FacetSequence' },
+    '0066,0036' => { VR => 'LO', Name => 'AlgorithmName' },
+    '0070,0001' => { VR => 'SQ', Name => 'GraphicAnnotationSequence' },
+    '0070,0002' => { VR => 'CS', Name => 'GraphicLayer' },
+    '0070,0003' => { VR => 'CS', Name => 'BoundingBoxAnnotationUnits' },
+    '0070,0004' => { VR => 'CS', Name => 'AnchorPointAnnotationUnits' },
+    '0070,0005' => { VR => 'CS', Name => 'GraphicAnnotationUnits' },
+    '0070,0006' => { VR => 'ST', Name => 'UnformattedTextValue' },
+    '0070,0008' => { VR => 'SQ', Name => 'TextObjectSequence' },
+    '0070,0009' => { VR => 'SQ', Name => 'GraphicObjectSequence' },
+    '0070,0010' => { VR => 'FL', Name => 'BoundingBoxTopLeftHandCorner' },
+    '0070,0011' => { VR => 'FL', Name => 'BoundingBoxBottomRightHandCorner' },
+    '0070,0012' => { VR => 'CS', Name => 'BoundingBoxTextHorizJustification' },
+    '0070,0014' => { VR => 'FL', Name => 'AnchorPoint' },
+    '0070,0015' => { VR => 'CS', Name => 'AnchorPointVisibility' },
+    '0070,0020' => { VR => 'US', Name => 'GraphicDimensions' },
+    '0070,0021' => { VR => 'US', Name => 'NumberOfGraphicPoints' },
+    '0070,0022' => { VR => 'FL', Name => 'GraphicData' },
+    '0070,0023' => { VR => 'CS', Name => 'GraphicType' },
+    '0070,0024' => { VR => 'CS', Name => 'GraphicFilled' },
+    '0070,0040' => { VR => 'IS', Name => 'ImageRotationRetired' },
+    '0070,0041' => { VR => 'CS', Name => 'ImageHorizontalFlip' },
+    '0070,0042' => { VR => 'US', Name => 'ImageRotation' },
+    '0070,0050' => { VR => 'US', Name => 'DisplayedAreaTopLeftTrial' },
+    '0070,0051' => { VR => 'US', Name => 'DisplayedAreaBottomRightTrial' },
+    '0070,0052' => { VR => 'SL', Name => 'DisplayedAreaTopLeft' },
+    '0070,0053' => { VR => 'SL', Name => 'DisplayedAreaBottomRight' },
+    '0070,005A' => { VR => 'SQ', Name => 'DisplayedAreaSelectionSequence' },
+    '0070,0060' => { VR => 'SQ', Name => 'GraphicLayerSequence' },
+    '0070,0062' => { VR => 'IS', Name => 'GraphicLayerOrder' },
+    '0070,0066' => { VR => 'US', Name => 'GraphicLayerRecDisplayGraysclValue' },
+    '0070,0067' => { VR => 'US', Name => 'GraphicLayerRecDisplayRGBValue' },
+    '0070,0068' => { VR => 'LO', Name => 'GraphicLayerDescription' },
+    '0070,0080' => { VR => 'CS', Name => 'ContentLabel' },
+    '0070,0081' => { VR => 'LO', Name => 'ContentDescription' },
+    '0070,0082' => { VR => 'DA', Name => 'PresentationCreationDate' },
+    '0070,0083' => { VR => 'TM', Name => 'PresentationCreationTime' },
+    '0070,0084' => { VR => 'PN', Name => 'ContentCreatorName' },
+    '0070,0086' => { VR => 'SQ', Name => 'ContentCreatorIDCodeSequence' },
+    '0070,0100' => { VR => 'CS', Name => 'PresentationSizeMode' },
+    '0070,0101' => { VR => 'DS', Name => 'PresentationPixelSpacing' },
+    '0070,0102' => { VR => 'IS', Name => 'PresentationPixelAspectRatio' },
+    '0070,0103' => { VR => 'FL', Name => 'PresentationPixelMagRatio' },
+    '0070,0306' => { VR => 'CS', Name => 'ShapeType' },
+    '0070,0308' => { VR => 'SQ', Name => 'RegistrationSequence' },
+    '0070,0309' => { VR => 'SQ', Name => 'MatrixRegistrationSequence' },
+    '0070,030A' => { VR => 'SQ', Name => 'MatrixSequence' },
+    '0070,030C' => { VR => 'CS', Name => 'FrameOfRefTransformationMatrixType' },
+    '0070,030D' => { VR => 'SQ', Name => 'RegistrationTypeCodeSequence' },
+    '0070,030F' => { VR => 'ST', Name => 'FiducialDescription' },
+    '0070,0310' => { VR => 'SH', Name => 'FiducialIdentifier' },
+    '0070,0311' => { VR => 'SQ', Name => 'FiducialIdentifierCodeSequence' },
+    '0070,0312' => { VR => 'FD', Name => 'ContourUncertaintyRadius' },
+    '0070,0314' => { VR => 'SQ', Name => 'UsedFiducialsSequence' },
+    '0070,0318' => { VR => 'SQ', Name => 'GraphicCoordinatesDataSequence' },
+    '0070,031A' => { VR => 'UI', Name => 'FiducialUID' },
+    '0070,031C' => { VR => 'SQ', Name => 'FiducialSetSequence' },
+    '0070,031E' => { VR => 'SQ', Name => 'FiducialSequence' },
+    '0070,0401' => { VR => 'US', Name => 'GraphicLayerRecomDisplayCIELabVal' },
+    '0070,0402' => { VR => 'SQ', Name => 'BlendingSequence' },
+    '0070,0403' => { VR => 'FL', Name => 'RelativeOpacity' },
+    '0070,0404' => { VR => 'SQ', Name => 'ReferencedSpatialRegistrationSeq' },
+    '0070,0405' => { VR => 'CS', Name => 'BlendingPosition' },
+    '0072,0002' => { VR => 'SH', Name => 'HangingProtocolName' },
+    '0072,0004' => { VR => 'LO', Name => 'HangingProtocolDescription' },
+    '0072,0006' => { VR => 'CS', Name => 'HangingProtocolLevel' },
+    '0072,0008' => { VR => 'LO', Name => 'HangingProtocolCreator' },
+    '0072,000A' => { VR => 'DT', Name => 'HangingProtocolCreationDateTime' },
+    '0072,000C' => { VR => 'SQ', Name => 'HangingProtocolDefinitionSequence' },
+    '0072,000E' => { VR => 'SQ', Name => 'HangingProtocolUserIDCodeSequence' },
+    '0072,0010' => { VR => 'LO', Name => 'HangingProtocolUserGroupName' },
+    '0072,0012' => { VR => 'SQ', Name => 'SourceHangingProtocolSequence' },
+    '0072,0014' => { VR => 'US', Name => 'NumberOfPriorsReferenced' },
+    '0072,0020' => { VR => 'SQ', Name => 'ImageSetsSequence' },
+    '0072,0022' => { VR => 'SQ', Name => 'ImageSetSelectorSequence' },
+    '0072,0024' => { VR => 'CS', Name => 'ImageSetSelectorUsageFlag' },
+    '0072,0026' => { VR => 'AT', Name => 'SelectorAttribute' },
+    '0072,0028' => { VR => 'US', Name => 'SelectorValueNumber' },
+    '0072,0030' => { VR => 'SQ', Name => 'TimeBasedImageSetsSequence' },
+    '0072,0032' => { VR => 'US', Name => 'ImageSetNumber' },
+    '0072,0034' => { VR => 'CS', Name => 'ImageSetSelectorCategory' },
+    '0072,0038' => { VR => 'US', Name => 'RelativeTime' },
+    '0072,003A' => { VR => 'CS', Name => 'RelativeTimeUnits' },
+    '0072,003C' => { VR => 'SS', Name => 'AbstractPriorValue' },
+    '0072,003E' => { VR => 'SQ', Name => 'AbstractPriorCodeSequence' },
+    '0072,0040' => { VR => 'LO', Name => 'ImageSetLabel' },
+    '0072,0050' => { VR => 'CS', Name => 'SelectorAttributeVR' },
+    '0072,0052' => { VR => 'AT', Name => 'SelectorSequencePointer' },
+    '0072,0054' => { VR => 'LO', Name => 'SelectorSeqPointerPrivateCreator' },
+    '0072,0056' => { VR => 'LO', Name => 'SelectorAttributePrivateCreator' },
+    '0072,0060' => { VR => 'AT', Name => 'SelectorATValue' },
+    '0072,0062' => { VR => 'CS', Name => 'SelectorCSValue' },
+    '0072,0064' => { VR => 'IS', Name => 'SelectorISValue' },
+    '0072,0066' => { VR => 'LO', Name => 'SelectorLOValue' },
+    '0072,0068' => { VR => 'LT', Name => 'SelectorLTValue' },
+    '0072,006A' => { VR => 'PN', Name => 'SelectorPNValue' },
+    '0072,006C' => { VR => 'SH', Name => 'SelectorSHValue' },
+    '0072,006E' => { VR => 'ST', Name => 'SelectorSTValue' },
+    '0072,0070' => { VR => 'UT', Name => 'SelectorUTValue' },
+    '0072,0072' => { VR => 'DS', Name => 'SelectorDSValue' },
+    '0072,0074' => { VR => 'FD', Name => 'SelectorFDValue' },
+    '0072,0076' => { VR => 'FL', Name => 'SelectorFLValue' },
+    '0072,0078' => { VR => 'UL', Name => 'SelectorULValue' },
+    '0072,007A' => { VR => 'US', Name => 'SelectorUSValue' },
+    '0072,007C' => { VR => 'SL', Name => 'SelectorSLValue' },
+    '0072,007E' => { VR => 'SS', Name => 'SelectorSSValue' },
+    '0072,0080' => { VR => 'SQ', Name => 'SelectorCodeSequenceValue' },
+    '0072,0100' => { VR => 'US', Name => 'NumberOfScreens' },
+    '0072,0102' => { VR => 'SQ', Name => 'NominalScreenDefinitionSequence' },
+    '0072,0104' => { VR => 'US', Name => 'NumberOfVerticalPixels' },
+    '0072,0106' => { VR => 'US', Name => 'NumberOfHorizontalPixels' },
+    '0072,0108' => { VR => 'FD', Name => 'DisplayEnvironmentSpatialPosition' },
+    '0072,010A' => { VR => 'US', Name => 'ScreenMinimumGrayscaleBitDepth' },
+    '0072,010C' => { VR => 'US', Name => 'ScreenMinimumColorBitDepth' },
+    '0072,010E' => { VR => 'US', Name => 'ApplicationMaximumRepaintTime' },
+    '0072,0200' => { VR => 'SQ', Name => 'DisplaySetsSequence' },
+    '0072,0202' => { VR => 'US', Name => 'DisplaySetNumber' },
+    '0072,0203' => { VR => 'LO', Name => 'DisplaySetLabel' },
+    '0072,0204' => { VR => 'US', Name => 'DisplaySetPresentationGroup' },
+    '0072,0206' => { VR => 'LO', Name => 'DisplaySetPresentationGroupDescr' },
+    '0072,0208' => { VR => 'CS', Name => 'PartialDataDisplayHandling' },
+    '0072,0210' => { VR => 'SQ', Name => 'SynchronizedScrollingSequence' },
+    '0072,0212' => { VR => 'US', Name => 'DisplaySetScrollingGroup' },
+    '0072,0214' => { VR => 'SQ', Name => 'NavigationIndicatorSequence' },
+    '0072,0216' => { VR => 'US', Name => 'NavigationDisplaySet' },
+    '0072,0218' => { VR => 'US', Name => 'ReferenceDisplaySets' },
+    '0072,0300' => { VR => 'SQ', Name => 'ImageBoxesSequence' },
+    '0072,0302' => { VR => 'US', Name => 'ImageBoxNumber' },
+    '0072,0304' => { VR => 'CS', Name => 'ImageBoxLayoutType' },
+    '0072,0306' => { VR => 'US', Name => 'ImageBoxTileHorizontalDimension' },
+    '0072,0308' => { VR => 'US', Name => 'ImageBoxTileVerticalDimension' },
+    '0072,0310' => { VR => 'CS', Name => 'ImageBoxScrollDirection' },
+    '0072,0312' => { VR => 'CS', Name => 'ImageBoxSmallScrollType' },
+    '0072,0314' => { VR => 'US', Name => 'ImageBoxSmallScrollAmount' },
+    '0072,0316' => { VR => 'CS', Name => 'ImageBoxLargeScrollType' },
+    '0072,0318' => { VR => 'US', Name => 'ImageBoxLargeScrollAmount' },
+    '0072,0320' => { VR => 'US', Name => 'ImageBoxOverlapPriority' },
+    '0072,0330' => { VR => 'FD', Name => 'CineRelativeToRealTime' },
+    '0072,0400' => { VR => 'SQ', Name => 'FilterOperationsSequence' },
+    '0072,0402' => { VR => 'CS', Name => 'FilterByCategory' },
+    '0072,0404' => { VR => 'CS', Name => 'FilterByAttributePresence' },
+    '0072,0406' => { VR => 'CS', Name => 'FilterByOperator' },
+    '0072,0432' => { VR => 'US', Name => 'SynchronizedImageBoxList' },
+    '0072,0434' => { VR => 'CS', Name => 'TypeOfSynchronization' },
+    '0072,0500' => { VR => 'CS', Name => 'BlendingOperationType' },
+    '0072,0510' => { VR => 'CS', Name => 'ReformattingOperationType' },
+    '0072,0512' => { VR => 'FD', Name => 'ReformattingThickness' },
+    '0072,0514' => { VR => 'FD', Name => 'ReformattingInterval' },
+    '0072,0516' => { VR => 'CS', Name => 'ReformattingOpInitialViewDir' },
+    '0072,0520' => { VR => 'CS', Name => '3DRenderingType' },
+    '0072,0600' => { VR => 'SQ', Name => 'SortingOperationsSequence' },
+    '0072,0602' => { VR => 'CS', Name => 'SortByCategory' },
+    '0072,0604' => { VR => 'CS', Name => 'SortingDirection' },
+    '0072,0700' => { VR => 'CS', Name => 'DisplaySetPatientOrientation' },
+    '0072,0702' => { VR => 'CS', Name => 'VOIType' },
+    '0072,0704' => { VR => 'CS', Name => 'PseudoColorType' },
+    '0072,0706' => { VR => 'CS', Name => 'ShowGrayscaleInverted' },
+    '0072,0710' => { VR => 'CS', Name => 'ShowImageTrueSizeFlag' },
+    '0072,0712' => { VR => 'CS', Name => 'ShowGraphicAnnotationFlag' },
+    '0072,0714' => { VR => 'CS', Name => 'ShowPatientDemographicsFlag' },
+    '0072,0716' => { VR => 'CS', Name => 'ShowAcquisitionTechniquesFlag' },
+    '0072,0717' => { VR => 'CS', Name => 'DisplaySetHorizontalJustification' },
+    '0072,0718' => { VR => 'CS', Name => 'DisplaySetVerticalJustification' },
+    '0074,1000' => { VR => 'CS', Name => 'UnifiedProcedureStepState' },
+    '0074,1002' => { VR => 'SQ', Name => 'UPSProgressInformationSequence' },
+    '0074,1004' => { VR => 'DS', Name => 'UnifiedProcedureStepProgress' },
+    '0074,1006' => { VR => 'ST', Name => 'UnifiedProcedureStepProgressDescr' },
+    '0074,1008' => { VR => 'SQ', Name => 'UnifiedProcedureStepComURISeq' },
+    '0074,100a' => { VR => 'ST', Name => 'ContactURI' },
+    '0074,100c' => { VR => 'LO', Name => 'ContactDisplayName' },
+    '0074,1020' => { VR => 'SQ', Name => 'BeamTaskSequence' },
+    '0074,1022' => { VR => 'CS', Name => 'BeamTaskType' },
+    '0074,1024' => { VR => 'IS', Name => 'BeamOrderIndex' },
+    '0074,1030' => { VR => 'SQ', Name => 'DeliveryVerificationImageSequence' },
+    '0074,1032' => { VR => 'CS', Name => 'VerificationImageTiming' },
+    '0074,1034' => { VR => 'CS', Name => 'DoubleExposureFlag' },
+    '0074,1036' => { VR => 'CS', Name => 'DoubleExposureOrdering' },
+    '0074,1038' => { VR => 'DS', Name => 'DoubleExposureMeterset' },
+    '0074,103A' => { VR => 'DS', Name => 'DoubleExposureFieldDelta' },
+    '0074,1040' => { VR => 'SQ', Name => 'RelatedReferenceRTImageSequence' },
+    '0074,1042' => { VR => 'SQ', Name => 'GeneralMachineVerificationSequence' },
+    '0074,1044' => { VR => 'SQ', Name => 'ConventionalMachineVerificationSeq' },
+    '0074,1046' => { VR => 'SQ', Name => 'IonMachineVerificationSequence' },
+    '0074,1048' => { VR => 'SQ', Name => 'FailedAttributesSequence' },
+    '0074,104A' => { VR => 'SQ', Name => 'OverriddenAttributesSequence' },
+    '0074,104C' => { VR => 'SQ', Name => 'ConventionalControlPointVerifySeq' },
+    '0074,104E' => { VR => 'SQ', Name => 'IonControlPointVerificationSeq' },
+    '0074,1050' => { VR => 'SQ', Name => 'AttributeOccurrenceSequence' },
+    '0074,1052' => { VR => 'AT', Name => 'AttributeOccurrencePointer' },
+    '0074,1054' => { VR => 'UL', Name => 'AttributeItemSelector' },
+    '0074,1056' => { VR => 'LO', Name => 'AttributeOccurrencePrivateCreator' },
+    '0074,1200' => { VR => 'CS', Name => 'ScheduledProcedureStepPriority' },
+    '0074,1202' => { VR => 'LO', Name => 'WorklistLabel' },
+    '0074,1204' => { VR => 'LO', Name => 'ProcedureStepLabel' },
+    '0074,1210' => { VR => 'SQ', Name => 'ScheduledProcessingParametersSeq' },
+    '0074,1212' => { VR => 'SQ', Name => 'PerformedProcessingParametersSeq' },
+    '0074,1216' => { VR => 'SQ', Name => 'UPSPerformedProcedureSequence' },
+    '0074,1220' => { VR => 'SQ', Name => 'RelatedProcedureStepSequence' },
+    '0074,1222' => { VR => 'LO', Name => 'ProcedureStepRelationshipType' },
+    '0074,1230' => { VR => 'LO', Name => 'DeletionLock' },
+    '0074,1234' => { VR => 'AE', Name => 'ReceivingAE' },
+    '0074,1236' => { VR => 'AE', Name => 'RequestingAE' },
+    '0074,1238' => { VR => 'LT', Name => 'ReasonForCancellation' },
+    '0074,1242' => { VR => 'CS', Name => 'SCPStatus' },
+    '0074,1244' => { VR => 'CS', Name => 'SubscriptionListStatus' },
+    '0074,1246' => { VR => 'CS', Name => 'UPSListStatus' },
+    # storage group
+    '0088,0130' => { VR => 'SH', Name => 'StorageMediaFileSetID' },
+    '0088,0140' => { VR => 'UI', Name => 'StorageMediaFileSetUID' },
+    '0088,0200' => { VR => 'SQ', Name => 'IconImageSequence' },
+    '0088,0904' => { VR => 'LO', Name => 'TopicTitle' },
+    '0088,0906' => { VR => 'ST', Name => 'TopicSubject' },
+    '0088,0910' => { VR => 'LO', Name => 'TopicAuthor' },
+    '0088,0912' => { VR => 'LO', Name => 'TopicKeywords' },
+    '0100,0410' => { VR => 'CS', Name => 'SOPInstanceStatus' },
+    '0100,0420' => { VR => 'DT', Name => 'SOPAuthorizationDateAndTime' },
+    '0100,0424' => { VR => 'LT', Name => 'SOPAuthorizationComment' },
+    '0100,0426' => { VR => 'LO', Name => 'AuthorizationEquipmentCertNumber' },
+    '0400,0005' => { VR => 'US', Name => 'MACIDNumber' },
+    '0400,0010' => { VR => 'UI', Name => 'MACCalculationTransferSyntaxUID' },
+    '0400,0015' => { VR => 'CS', Name => 'MACAlgorithm' },
+    '0400,0020' => { VR => 'AT', Name => 'DataElementsSigned' },
+    '0400,0100' => { VR => 'UI', Name => 'DigitalSignatureUID' },
+    '0400,0105' => { VR => 'DT', Name => 'DigitalSignatureDateTime' },
+    '0400,0110' => { VR => 'CS', Name => 'CertificateType' },
+    '0400,0115' => { VR => 'OB', Name => 'CertificateOfSigner' },
+    '0400,0120' => { VR => 'OB', Name => 'Signature' },
+    '0400,0305' => { VR => 'CS', Name => 'CertifiedTimestampType' },
+    '0400,0310' => { VR => 'OB', Name => 'CertifiedTimestamp' },
+    '0400,0401' => { VR => 'SQ', Name => 'DigitalSignaturePurposeCodeSeq' },
+    '0400,0402' => { VR => 'SQ', Name => 'ReferencedDigitalSignatureSeq' },
+    '0400,0403' => { VR => 'SQ', Name => 'ReferencedSOPInstanceMACSeq' },
+    '0400,0404' => { VR => 'OB', Name => 'MAC' },
+    '0400,0500' => { VR => 'SQ', Name => 'EncryptedAttributesSequence' },
+    '0400,0510' => { VR => 'UI', Name => 'EncryptedContentTransferSyntaxUID' },
+    '0400,0520' => { VR => 'OB', Name => 'EncryptedContent' },
+    '0400,0550' => { VR => 'SQ', Name => 'ModifiedAttributesSequence' },
+    '0400,0561' => { VR => 'SQ', Name => 'OriginalAttributesSequence' },
+    '0400,0562' => { VR => 'DT', Name => 'AttributeModificationDateTime' },
+    '0400,0563' => { VR => 'LO', Name => 'ModifyingSystem' },
+    '0400,0564' => { VR => 'LO', Name => 'SourceOfPreviousValues' },
+    '0400,0565' => { VR => 'CS', Name => 'ReasonForTheAttributeModification' },
+    '1000,xxx0' => { VR => 'US', Name => 'EscapeTriplet' },
+    '1000,xxx1' => { VR => 'US', Name => 'RunLengthTriplet' },
+    '1000,xxx2' => { VR => 'US', Name => 'HuffmanTableSize' },
+    '1000,xxx3' => { VR => 'US', Name => 'HuffmanTableTriplet' },
+    '1000,xxx4' => { VR => 'US', Name => 'ShiftTableSize' },
+    '1000,xxx5' => { VR => 'US', Name => 'ShiftTableTriplet' },
+    '1010,xxxx' => { VR => 'US', Name => 'ZonalMap' },
+    '2000,0010' => { VR => 'IS', Name => 'NumberOfCopies' },
+    '2000,001E' => { VR => 'SQ', Name => 'PrinterConfigurationSequence' },
+    '2000,0020' => { VR => 'CS', Name => 'PrintPriority' },
+    '2000,0030' => { VR => 'CS', Name => 'MediumType' },
+    '2000,0040' => { VR => 'CS', Name => 'FilmDestination' },
+    '2000,0050' => { VR => 'LO', Name => 'FilmSessionLabel' },
+    '2000,0060' => { VR => 'IS', Name => 'MemoryAllocation' },
+    '2000,0061' => { VR => 'IS', Name => 'MaximumMemoryAllocation' },
+    '2000,0062' => { VR => 'CS', Name => 'ColorImagePrintingFlag' },
+    '2000,0063' => { VR => 'CS', Name => 'CollationFlag' },
+    '2000,0065' => { VR => 'CS', Name => 'AnnotationFlag' },
+    '2000,0067' => { VR => 'CS', Name => 'ImageOverlayFlag' },
+    '2000,0069' => { VR => 'CS', Name => 'PresentationLUTFlag' },
+    '2000,006A' => { VR => 'CS', Name => 'ImageBoxPresentationLUTFlag' },
+    '2000,00A0' => { VR => 'US', Name => 'MemoryBitDepth' },
+    '2000,00A1' => { VR => 'US', Name => 'PrintingBitDepth' },
+    '2000,00A2' => { VR => 'SQ', Name => 'MediaInstalledSequence' },
+    '2000,00A4' => { VR => 'SQ', Name => 'OtherMediaAvailableSequence' },
+    '2000,00A8' => { VR => 'SQ', Name => 'SupportedImageDisplayFormatSeq' },
+    '2000,0500' => { VR => 'SQ', Name => 'ReferencedFilmBoxSequence' },
+    '2000,0510' => { VR => 'SQ', Name => 'ReferencedStoredPrintSequence' },
+    # film box group
+    '2010,0010' => { VR => 'ST', Name => 'ImageDisplayFormat' },
+    '2010,0030' => { VR => 'CS', Name => 'AnnotationDisplayFormatID' },
+    '2010,0040' => { VR => 'CS', Name => 'FilmOrientation' },
+    '2010,0050' => { VR => 'CS', Name => 'FilmSizeID' },
+    '2010,0052' => { VR => 'CS', Name => 'PrinterResolutionID' },
+    '2010,0054' => { VR => 'CS', Name => 'DefaultPrinterResolutionID' },
+    '2010,0060' => { VR => 'CS', Name => 'MagnificationType' },
+    '2010,0080' => { VR => 'CS', Name => 'SmoothingType' },
+    '2010,00A6' => { VR => 'CS', Name => 'DefaultMagnificationType' },
+    '2010,00A7' => { VR => 'CS', Name => 'OtherMagnificationTypesAvailable' },
+    '2010,00A8' => { VR => 'CS', Name => 'DefaultSmoothingType' },
+    '2010,00A9' => { VR => 'CS', Name => 'OtherSmoothingTypesAvailable' },
+    '2010,0100' => { VR => 'CS', Name => 'BorderDensity' },
+    '2010,0110' => { VR => 'CS', Name => 'EmptyImageDensity' },
+    '2010,0120' => { VR => 'US', Name => 'MinDensity' },
+    '2010,0130' => { VR => 'US', Name => 'MaxDensity' },
+    '2010,0140' => { VR => 'CS', Name => 'Trim' },
+    '2010,0150' => { VR => 'ST', Name => 'ConfigurationInformation' },
+    '2010,0152' => { VR => 'LT', Name => 'ConfigurationInformationDescr' },
+    '2010,0154' => { VR => 'IS', Name => 'MaximumCollatedFilms' },
+    '2010,015E' => { VR => 'US', Name => 'Illumination' },
+    '2010,0160' => { VR => 'US', Name => 'ReflectedAmbientLight' },
+    '2010,0376' => { VR => 'DS', Name => 'PrinterPixelSpacing' },
+    '2010,0500' => { VR => 'SQ', Name => 'ReferencedFilmSessionSequence' },
+    '2010,0510' => { VR => 'SQ', Name => 'ReferencedImageBoxSequence' },
+    '2010,0520' => { VR => 'SQ', Name => 'ReferencedBasicAnnotationBoxSeq' },
+    # image box group
+    '2020,0010' => { VR => 'US', Name => 'ImageBoxPosition' },
+    '2020,0020' => { VR => 'CS', Name => 'Polarity' },
+    '2020,0030' => { VR => 'DS', Name => 'RequestedImageSize' },
+    '2020,0040' => { VR => 'CS', Name => 'RequestedDecimate-CropBehavior' },
+    '2020,0050' => { VR => 'CS', Name => 'RequestedResolutionID' },
+    '2020,00A0' => { VR => 'CS', Name => 'RequestedImageSizeFlag' },
+    '2020,00A2' => { VR => 'CS', Name => 'DecimateCropResult' },
+    '2020,0110' => { VR => 'SQ', Name => 'BasicGrayscaleImageSequence' },
+    '2020,0111' => { VR => 'SQ', Name => 'BasicColorImageSequence' },
+    '2020,0130' => { VR => 'SQ', Name => 'ReferencedImageOverlayBoxSequence' },
+    '2020,0140' => { VR => 'SQ', Name => 'ReferencedVOILUTBoxSequence' },
+    # annotation group
+    '2030,0010' => { VR => 'US', Name => 'AnnotationPosition' },
+    '2030,0020' => { VR => 'LO', Name => 'TextString' },
+    # overlay box group
+    '2040,0010' => { VR => 'SQ', Name => 'ReferencedOverlayPlaneSequence' },
+    '2040,0011' => { VR => 'US', Name => 'ReferencedOverlayPlaneGroups' },
+    '2040,0020' => { VR => 'SQ', Name => 'OverlayPixelDataSequence' },
+    '2040,0060' => { VR => 'CS', Name => 'OverlayMagnificationType' },
+    '2040,0070' => { VR => 'CS', Name => 'OverlaySmoothingType' },
+    '2040,0072' => { VR => 'CS', Name => 'OverlayOrImageMagnification' },
+    '2040,0074' => { VR => 'US', Name => 'MagnifyToNumberOfColumns' },
+    '2040,0080' => { VR => 'CS', Name => 'OverlayForegroundDensity' },
+    '2040,0082' => { VR => 'CS', Name => 'OverlayBackgroundDensity' },
+    '2040,0090' => { VR => 'CS', Name => 'OverlayMode' },
+    '2040,0100' => { VR => 'CS', Name => 'ThresholdDensity' },
+    '2040,0500' => { VR => 'SQ', Name => 'ReferencedImageBoxSequence' },
+    '2050,0010' => { VR => 'SQ', Name => 'PresentationLUTSequence' },
+    '2050,0020' => { VR => 'CS', Name => 'PresentationLUTShape' },
+    '2050,0500' => { VR => 'SQ', Name => 'ReferencedPresentationLUTSequence' },
+    '2100,0010' => { VR => 'SH', Name => 'PrintJobID' },
+    '2100,0020' => { VR => 'CS', Name => 'ExecutionStatus' },
+    '2100,0030' => { VR => 'CS', Name => 'ExecutionStatusInfo' },
+    '2100,0040' => { VR => 'DA', Name => 'CreationDate' },
+    '2100,0050' => { VR => 'TM', Name => 'CreationTime' },
+    '2100,0070' => { VR => 'AE', Name => 'Originator' },
+    '2100,0140' => { VR => 'AE', Name => 'DestinationAE' },
+    '2100,0160' => { VR => 'SH', Name => 'OwnerID' },
+    '2100,0170' => { VR => 'IS', Name => 'NumberOfFilms' },
+    '2100,0500' => { VR => 'SQ', Name => 'ReferencedPrintJobSequence' },
+    # printer group
+    '2110,0010' => { VR => 'CS', Name => 'PrinterStatus' },
+    '2110,0020' => { VR => 'CS', Name => 'PrinterStatusInfo' },
+    '2110,0030' => { VR => 'LO', Name => 'PrinterName' },
+    '2110,0099' => { VR => 'SH', Name => 'PrintQueueID' },
+    '2120,0010' => { VR => 'CS', Name => 'QueueStatus' },
+    # print job group
+    '2120,0050' => { VR => 'SQ', Name => 'PrintJobDescriptionSequence' },
+    '2120,0070' => { VR => 'SQ', Name => 'ReferencedPrintJobSequence' },
+    '2130,0010' => { VR => 'SQ', Name => 'PrintManagementCapabilitiesSeq' },
+    '2130,0015' => { VR => 'SQ', Name => 'PrinterCharacteristicsSequence' },
+    '2130,0030' => { VR => 'SQ', Name => 'FilmBoxContentSequence' },
+    '2130,0040' => { VR => 'SQ', Name => 'ImageBoxContentSequence' },
+    '2130,0050' => { VR => 'SQ', Name => 'AnnotationContentSequence' },
+    '2130,0060' => { VR => 'SQ', Name => 'ImageOverlayBoxContentSequence' },
+    '2130,0080' => { VR => 'SQ', Name => 'PresentationLUTContentSequence' },
+    '2130,00A0' => { VR => 'SQ', Name => 'ProposedStudySequence' },
+    '2130,00C0' => { VR => 'SQ', Name => 'OriginalImageSequence' },
+    '2200,0001' => { VR => 'CS', Name => 'LabelFromInfoExtractedFromInstance' },
+    '2200,0002' => { VR => 'UT', Name => 'LabelText' },
+    '2200,0003' => { VR => 'CS', Name => 'LabelStyleSelection' },
+    '2200,0004' => { VR => 'LT', Name => 'MediaDisposition' },
+    '2200,0005' => { VR => 'LT', Name => 'BarcodeValue' },
+    '2200,0006' => { VR => 'CS', Name => 'BarcodeSymbology' },
+    '2200,0007' => { VR => 'CS', Name => 'AllowMediaSplitting' },
+    '2200,0008' => { VR => 'CS', Name => 'IncludeNonDICOMObjects' },
+    '2200,0009' => { VR => 'CS', Name => 'IncludeDisplayApplication' },
+    '2200,000A' => { VR => 'CS', Name => 'SaveCompInstancesAfterMediaCreate' },
+    '2200,000B' => { VR => 'US', Name => 'TotalNumberMediaPiecesCreated' },
+    '2200,000C' => { VR => 'LO', Name => 'RequestedMediaApplicationProfile' },
+    '2200,000D' => { VR => 'SQ', Name => 'ReferencedStorageMediaSequence' },
+    '2200,000E' => { VR => 'AT', Name => 'FailureAttributes' },
+    '2200,000F' => { VR => 'CS', Name => 'AllowLossyCompression' },
+    '2200,0020' => { VR => 'CS', Name => 'RequestPriority' },
+    '3002,0002' => { VR => 'SH', Name => 'RTImageLabel' },
+    '3002,0003' => { VR => 'LO', Name => 'RTImageName' },
+    '3002,0004' => { VR => 'ST', Name => 'RTImageDescription' },
+    '3002,000A' => { VR => 'CS', Name => 'ReportedValuesOrigin' },
+    '3002,000C' => { VR => 'CS', Name => 'RTImagePlane' },
+    '3002,000D' => { VR => 'DS', Name => 'XRayImageReceptorTranslation' },
+    '3002,000E' => { VR => 'DS', Name => 'XRayImageReceptorAngle' },
+    '3002,0010' => { VR => 'DS', Name => 'RTImageOrientation' },
+    '3002,0011' => { VR => 'DS', Name => 'ImagePlanePixelSpacing' },
+    '3002,0012' => { VR => 'DS', Name => 'RTImagePosition' },
+    '3002,0020' => { VR => 'SH', Name => 'RadiationMachineName' },
+    '3002,0022' => { VR => 'DS', Name => 'RadiationMachineSAD' },
+    '3002,0024' => { VR => 'DS', Name => 'RadiationMachineSSD' },
+    '3002,0026' => { VR => 'DS', Name => 'RTImageSID' },
+    '3002,0028' => { VR => 'DS', Name => 'SourceToReferenceObjectDistance' },
+    '3002,0029' => { VR => 'IS', Name => 'FractionNumber' },
+    '3002,0030' => { VR => 'SQ', Name => 'ExposureSequence' },
+    '3002,0032' => { VR => 'DS', Name => 'MetersetExposure' },
+    '3002,0034' => { VR => 'DS', Name => 'DiaphragmPosition' },
+    '3002,0040' => { VR => 'SQ', Name => 'FluenceMapSequence' },
+    '3002,0041' => { VR => 'CS', Name => 'FluenceDataSource' },
+    '3002,0042' => { VR => 'DS', Name => 'FluenceDataScale' },
+    '3002,0051' => { VR => 'CS', Name => 'FluenceMode' },
+    '3002,0052' => { VR => 'SH', Name => 'FluenceModeID' },
+    '3004,0001' => { VR => 'CS', Name => 'DVHType' },
+    '3004,0002' => { VR => 'CS', Name => 'DoseUnits' },
+    '3004,0004' => { VR => 'CS', Name => 'DoseType' },
+    '3004,0006' => { VR => 'LO', Name => 'DoseComment' },
+    '3004,0008' => { VR => 'DS', Name => 'NormalizationPoint' },
+    '3004,000A' => { VR => 'CS', Name => 'DoseSummationType' },
+    '3004,000C' => { VR => 'DS', Name => 'GridFrameOffsetVector' },
+    '3004,000E' => { VR => 'DS', Name => 'DoseGridScaling' },
+    '3004,0010' => { VR => 'SQ', Name => 'RTDoseROISequence' },
+    '3004,0012' => { VR => 'DS', Name => 'DoseValue' },
+    '3004,0014' => { VR => 'CS', Name => 'TissueHeterogeneityCorrection' },
+    '3004,0040' => { VR => 'DS', Name => 'DVHNormalizationPoint' },
+    '3004,0042' => { VR => 'DS', Name => 'DVHNormalizationDoseValue' },
+    '3004,0050' => { VR => 'SQ', Name => 'DVHSequence' },
+    '3004,0052' => { VR => 'DS', Name => 'DVHDoseScaling' },
+    '3004,0054' => { VR => 'CS', Name => 'DVHVolumeUnits' },
+    '3004,0056' => { VR => 'IS', Name => 'DVHNumberOfBins' },
+    '3004,0058' => { VR => 'DS', Name => 'DVHData' },
+    '3004,0060' => { VR => 'SQ', Name => 'DVHReferencedROISequence' },
+    '3004,0062' => { VR => 'CS', Name => 'DVHROIContributionType' },
+    '3004,0070' => { VR => 'DS', Name => 'DVHMinimumDose' },
+    '3004,0072' => { VR => 'DS', Name => 'DVHMaximumDose' },
+    '3004,0074' => { VR => 'DS', Name => 'DVHMeanDose' },
+    '3006,0002' => { VR => 'SH', Name => 'StructureSetLabel' },
+    '3006,0004' => { VR => 'LO', Name => 'StructureSetName' },
+    '3006,0006' => { VR => 'ST', Name => 'StructureSetDescription' },
+    '3006,0008' => { VR => 'DA', Name => 'StructureSetDate' },
+    '3006,0009' => { VR => 'TM', Name => 'StructureSetTime' },
+    '3006,0010' => { VR => 'SQ', Name => 'ReferencedFrameOfReferenceSequence' },
+    '3006,0012' => { VR => 'SQ', Name => 'RTReferencedStudySequence' },
+    '3006,0014' => { VR => 'SQ', Name => 'RTReferencedSeriesSequence' },
+    '3006,0016' => { VR => 'SQ', Name => 'ContourImageSequence' },
+    '3006,0020' => { VR => 'SQ', Name => 'StructureSetROISequence' },
+    '3006,0022' => { VR => 'IS', Name => 'ROINumber' },
+    '3006,0024' => { VR => 'UI', Name => 'ReferencedFrameOfReferenceUID' },
+    '3006,0026' => { VR => 'LO', Name => 'ROIName' },
+    '3006,0028' => { VR => 'ST', Name => 'ROIDescription' },
+    '3006,002A' => { VR => 'IS', Name => 'ROIDisplayColor' },
+    '3006,002C' => { VR => 'DS', Name => 'ROIVolume' },
+    '3006,0030' => { VR => 'SQ', Name => 'RTRelatedROISequence' },
+    '3006,0033' => { VR => 'CS', Name => 'RTROIRelationship' },
+    '3006,0036' => { VR => 'CS', Name => 'ROIGenerationAlgorithm' },
+    '3006,0038' => { VR => 'LO', Name => 'ROIGenerationDescription' },
+    '3006,0039' => { VR => 'SQ', Name => 'ROIContourSequence' },
+    '3006,0040' => { VR => 'SQ', Name => 'ContourSequence' },
+    '3006,0042' => { VR => 'CS', Name => 'ContourGeometricType' },
+    '3006,0044' => { VR => 'DS', Name => 'ContourSlabThickness' },
+    '3006,0045' => { VR => 'DS', Name => 'ContourOffsetVector' },
+    '3006,0046' => { VR => 'IS', Name => 'NumberOfContourPoints' },
+    '3006,0048' => { VR => 'IS', Name => 'ContourNumber' },
+    '3006,0049' => { VR => 'IS', Name => 'AttachedContours' },
+    '3006,0050' => { VR => 'DS', Name => 'ContourData' },
+    '3006,0080' => { VR => 'SQ', Name => 'RTROIObservationsSequence' },
+    '3006,0082' => { VR => 'IS', Name => 'ObservationNumber' },
+    '3006,0084' => { VR => 'IS', Name => 'ReferencedROINumber' },
+    '3006,0085' => { VR => 'SH', Name => 'ROIObservationLabel' },
+    '3006,0086' => { VR => 'SQ', Name => 'RTROIIdentificationCodeSequence' },
+    '3006,0088' => { VR => 'ST', Name => 'ROIObservationDescription' },
+    '3006,00A0' => { VR => 'SQ', Name => 'RelatedRTROIObservationsSequence' },
+    '3006,00A4' => { VR => 'CS', Name => 'RTROIInterpretedType' },
+    '3006,00A6' => { VR => 'PN', Name => 'ROIInterpreter' },
+    '3006,00B0' => { VR => 'SQ', Name => 'ROIPhysicalPropertiesSequence' },
+    '3006,00B2' => { VR => 'CS', Name => 'ROIPhysicalProperty' },
+    '3006,00B4' => { VR => 'DS', Name => 'ROIPhysicalPropertyValue' },
+    '3006,00B6' => { VR => 'SQ', Name => 'ROIElementalCompositionSequence' },
+    '3006,00B7' => { VR => 'US', Name => 'ROIElementalCompAtomicNumber' },
+    '3006,00B8' => { VR => 'FL', Name => 'ROIElementalCompAtomicMassFraction' },
+    '3006,00C0' => { VR => 'SQ', Name => 'FrameOfReferenceRelationshipSeq' },
+    '3006,00C2' => { VR => 'UI', Name => 'RelatedFrameOfReferenceUID' },
+    '3006,00C4' => { VR => 'CS', Name => 'FrameOfReferenceTransformType' },
+    '3006,00C6' => { VR => 'DS', Name => 'FrameOfReferenceTransformMatrix' },
+    '3006,00C8' => { VR => 'LO', Name => 'FrameOfReferenceTransformComment' },
+    '3008,0010' => { VR => 'SQ', Name => 'MeasuredDoseReferenceSequence' },
+    '3008,0012' => { VR => 'ST', Name => 'MeasuredDoseDescription' },
+    '3008,0014' => { VR => 'CS', Name => 'MeasuredDoseType' },
+    '3008,0016' => { VR => 'DS', Name => 'MeasuredDoseValue' },
+    '3008,0020' => { VR => 'SQ', Name => 'TreatmentSessionBeamSequence' },
+    '3008,0021' => { VR => 'SQ', Name => 'TreatmentSessionIonBeamSequence' },
+    '3008,0022' => { VR => 'IS', Name => 'CurrentFractionNumber' },
+    '3008,0024' => { VR => 'DA', Name => 'TreatmentControlPointDate' },
+    '3008,0025' => { VR => 'TM', Name => 'TreatmentControlPointTime' },
+    '3008,002A' => { VR => 'CS', Name => 'TreatmentTerminationStatus' },
+    '3008,002B' => { VR => 'SH', Name => 'TreatmentTerminationCode' },
+    '3008,002C' => { VR => 'CS', Name => 'TreatmentVerificationStatus' },
+    '3008,0030' => { VR => 'SQ', Name => 'ReferencedTreatmentRecordSequence' },
+    '3008,0032' => { VR => 'DS', Name => 'SpecifiedPrimaryMeterset' },
+    '3008,0033' => { VR => 'DS', Name => 'SpecifiedSecondaryMeterset' },
+    '3008,0036' => { VR => 'DS', Name => 'DeliveredPrimaryMeterset' },
+    '3008,0037' => { VR => 'DS', Name => 'DeliveredSecondaryMeterset' },
+    '3008,003A' => { VR => 'DS', Name => 'SpecifiedTreatmentTime' },
+    '3008,003B' => { VR => 'DS', Name => 'DeliveredTreatmentTime' },
+    '3008,0040' => { VR => 'SQ', Name => 'ControlPointDeliverySequence' },
+    '3008,0041' => { VR => 'SQ', Name => 'IonControlPointDeliverySequence' },
+    '3008,0042' => { VR => 'DS', Name => 'SpecifiedMeterset' },
+    '3008,0044' => { VR => 'DS', Name => 'DeliveredMeterset' },
+    '3008,0045' => { VR => 'FL', Name => 'MetersetRateSet' },
+    '3008,0046' => { VR => 'FL', Name => 'MetersetRateDelivered' },
+    '3008,0047' => { VR => 'FL', Name => 'ScanSpotMetersetsDelivered' },
+    '3008,0048' => { VR => 'DS', Name => 'DoseRateDelivered' },
+    '3008,0050' => { VR => 'SQ', Name => 'TreatmentSummaryCalcDoseRefSeq' },
+    '3008,0052' => { VR => 'DS', Name => 'CumulativeDoseToDoseReference' },
+    '3008,0054' => { VR => 'DA', Name => 'FirstTreatmentDate' },
+    '3008,0056' => { VR => 'DA', Name => 'MostRecentTreatmentDate' },
+    '3008,005A' => { VR => 'IS', Name => 'NumberOfFractionsDelivered' },
+    '3008,0060' => { VR => 'SQ', Name => 'OverrideSequence' },
+    '3008,0061' => { VR => 'AT', Name => 'ParameterSequencePointer' },
+    '3008,0062' => { VR => 'AT', Name => 'OverrideParameterPointer' },
+    '3008,0063' => { VR => 'IS', Name => 'ParameterItemIndex' },
+    '3008,0064' => { VR => 'IS', Name => 'MeasuredDoseReferenceNumber' },
+    '3008,0065' => { VR => 'AT', Name => 'ParameterPointer' },
+    '3008,0066' => { VR => 'ST', Name => 'OverrideReason' },
+    '3008,0068' => { VR => 'SQ', Name => 'CorrectedParameterSequence' },
+    '3008,006A' => { VR => 'FL', Name => 'CorrectionValue' },
+    '3008,0070' => { VR => 'SQ', Name => 'CalculatedDoseReferenceSequence' },
+    '3008,0072' => { VR => 'IS', Name => 'CalculatedDoseReferenceNumber' },
+    '3008,0074' => { VR => 'ST', Name => 'CalculatedDoseReferenceDescription' },
+    '3008,0076' => { VR => 'DS', Name => 'CalculatedDoseReferenceDoseValue' },
+    '3008,0078' => { VR => 'DS', Name => 'StartMeterset' },
+    '3008,007A' => { VR => 'DS', Name => 'EndMeterset' },
+    '3008,0080' => { VR => 'SQ', Name => 'ReferencedMeasuredDoseReferenceSeq' },
+    '3008,0082' => { VR => 'IS', Name => 'ReferencedMeasuredDoseReferenceNum' },
+    '3008,0090' => { VR => 'SQ', Name => 'ReferencedCalculatedDoseRefSeq' },
+    '3008,0092' => { VR => 'IS', Name => 'ReferencedCalculatedDoseRefNumber' },
+    '3008,00A0' => { VR => 'SQ', Name => 'BeamLimitingDeviceLeafPairsSeq' },
+    '3008,00B0' => { VR => 'SQ', Name => 'RecordedWedgeSequence' },
+    '3008,00C0' => { VR => 'SQ', Name => 'RecordedCompensatorSequence' },
+    '3008,00D0' => { VR => 'SQ', Name => 'RecordedBlockSequence' },
+    '3008,00E0' => { VR => 'SQ', Name => 'TreatmentSummaryMeasuredDoseRefSeq' },
+    '3008,00F0' => { VR => 'SQ', Name => 'RecordedSnoutSequence' },
+    '3008,00F2' => { VR => 'SQ', Name => 'RecordedRangeShifterSequence' },
+    '3008,00F4' => { VR => 'SQ', Name => 'RecordedLateralSpreadingDeviceSeq' },
+    '3008,00F6' => { VR => 'SQ', Name => 'RecordedRangeModulatorSequence' },
+    '3008,0100' => { VR => 'SQ', Name => 'RecordedSourceSequence' },
+    '3008,0105' => { VR => 'LO', Name => 'SourceSerialNumber' },
+    '3008,0110' => { VR => 'SQ', Name => 'TreatmentSessionAppSetupSeq' },
+    '3008,0116' => { VR => 'CS', Name => 'ApplicationSetupCheck' },
+    '3008,0120' => { VR => 'SQ', Name => 'RecordedBrachyAccessoryDeviceSeq' },
+    '3008,0122' => { VR => 'IS', Name => 'ReferencedBrachyAccessoryDeviceNum' },
+    '3008,0130' => { VR => 'SQ', Name => 'RecordedChannelSequence' },
+    '3008,0132' => { VR => 'DS', Name => 'SpecifiedChannelTotalTime' },
+    '3008,0134' => { VR => 'DS', Name => 'DeliveredChannelTotalTime' },
+    '3008,0136' => { VR => 'IS', Name => 'SpecifiedNumberOfPulses' },
+    '3008,0138' => { VR => 'IS', Name => 'DeliveredNumberOfPulses' },
+    '3008,013A' => { VR => 'DS', Name => 'SpecifiedPulseRepetitionInterval' },
+    '3008,013C' => { VR => 'DS', Name => 'DeliveredPulseRepetitionInterval' },
+    '3008,0140' => { VR => 'SQ', Name => 'RecordedSourceApplicatorSequence' },
+    '3008,0142' => { VR => 'IS', Name => 'ReferencedSourceApplicatorNumber' },
+    '3008,0150' => { VR => 'SQ', Name => 'RecordedChannelShieldSequence' },
+    '3008,0152' => { VR => 'IS', Name => 'ReferencedChannelShieldNumber' },
+    '3008,0160' => { VR => 'SQ', Name => 'BrachyControlPointDeliveredSeq' },
+    '3008,0162' => { VR => 'DA', Name => 'SafePositionExitDate' },
+    '3008,0164' => { VR => 'TM', Name => 'SafePositionExitTime' },
+    '3008,0166' => { VR => 'DA', Name => 'SafePositionReturnDate' },
+    '3008,0168' => { VR => 'TM', Name => 'SafePositionReturnTime' },
+    '3008,0200' => { VR => 'CS', Name => 'CurrentTreatmentStatus' },
+    '3008,0202' => { VR => 'ST', Name => 'TreatmentStatusComment' },
+    '3008,0220' => { VR => 'SQ', Name => 'FractionGroupSummarySequence' },
+    '3008,0223' => { VR => 'IS', Name => 'ReferencedFractionNumber' },
+    '3008,0224' => { VR => 'CS', Name => 'FractionGroupType' },
+    '3008,0230' => { VR => 'CS', Name => 'BeamStopperPosition' },
+    '3008,0240' => { VR => 'SQ', Name => 'FractionStatusSummarySequence' },
+    '3008,0250' => { VR => 'DA', Name => 'TreatmentDate' },
+    '3008,0251' => { VR => 'TM', Name => 'TreatmentTime' },
+    '300A,0002' => { VR => 'SH', Name => 'RTPlanLabel' },
+    '300A,0003' => { VR => 'LO', Name => 'RTPlanName' },
+    '300A,0004' => { VR => 'ST', Name => 'RTPlanDescription' },
+    '300A,0006' => { VR => 'DA', Name => 'RTPlanDate' },
+    '300A,0007' => { VR => 'TM', Name => 'RTPlanTime' },
+    '300A,0009' => { VR => 'LO', Name => 'TreatmentProtocols' },
+    '300A,000A' => { VR => 'CS', Name => 'PlanIntent' },
+    '300A,000B' => { VR => 'LO', Name => 'TreatmentSites' },
+    '300A,000C' => { VR => 'CS', Name => 'RTPlanGeometry' },
+    '300A,000E' => { VR => 'ST', Name => 'PrescriptionDescription' },
+    '300A,0010' => { VR => 'SQ', Name => 'DoseReferenceSequence' },
+    '300A,0012' => { VR => 'IS', Name => 'DoseReferenceNumber' },
+    '300A,0013' => { VR => 'UI', Name => 'DoseReferenceUID' },
+    '300A,0014' => { VR => 'CS', Name => 'DoseReferenceStructureType' },
+    '300A,0015' => { VR => 'CS', Name => 'NominalBeamEnergyUnit' },
+    '300A,0016' => { VR => 'LO', Name => 'DoseReferenceDescription' },
+    '300A,0018' => { VR => 'DS', Name => 'DoseReferencePointCoordinates' },
+    '300A,001A' => { VR => 'DS', Name => 'NominalPriorDose' },
+    '300A,0020' => { VR => 'CS', Name => 'DoseReferenceType' },
+    '300A,0021' => { VR => 'DS', Name => 'ConstraintWeight' },
+    '300A,0022' => { VR => 'DS', Name => 'DeliveryWarningDose' },
+    '300A,0023' => { VR => 'DS', Name => 'DeliveryMaximumDose' },
+    '300A,0025' => { VR => 'DS', Name => 'TargetMinimumDose' },
+    '300A,0026' => { VR => 'DS', Name => 'TargetPrescriptionDose' },
+    '300A,0027' => { VR => 'DS', Name => 'TargetMaximumDose' },
+    '300A,0028' => { VR => 'DS', Name => 'TargetUnderdoseVolumeFraction' },
+    '300A,002A' => { VR => 'DS', Name => 'OrganAtRiskFullVolumeDose' },
+    '300A,002B' => { VR => 'DS', Name => 'OrganAtRiskLimitDose' },
+    '300A,002C' => { VR => 'DS', Name => 'OrganAtRiskMaximumDose' },
+    '300A,002D' => { VR => 'DS', Name => 'OrganAtRiskOverdoseVolumeFraction' },
+    '300A,0040' => { VR => 'SQ', Name => 'ToleranceTableSequence' },
+    '300A,0042' => { VR => 'IS', Name => 'ToleranceTableNumber' },
+    '300A,0043' => { VR => 'SH', Name => 'ToleranceTableLabel' },
+    '300A,0044' => { VR => 'DS', Name => 'GantryAngleTolerance' },
+    '300A,0046' => { VR => 'DS', Name => 'BeamLimitingDeviceAngleTolerance' },
+    '300A,0048' => { VR => 'SQ', Name => 'BeamLimitingDeviceToleranceSeq' },
+    '300A,004A' => { VR => 'DS', Name => 'BeamLimitingDevicePositionTol' },
+    '300A,004B' => { VR => 'FL', Name => 'SnoutPositionTolerance' },
+    '300A,004C' => { VR => 'DS', Name => 'PatientSupportAngleTolerance' },
+    '300A,004E' => { VR => 'DS', Name => 'TableTopEccentricAngleTolerance' },
+    '300A,004F' => { VR => 'FL', Name => 'TableTopPitchAngleTolerance' },
+    '300A,0050' => { VR => 'FL', Name => 'TableTopRollAngleTolerance' },
+    '300A,0051' => { VR => 'DS', Name => 'TableTopVerticalPositionTolerance' },
+    '300A,0052' => { VR => 'DS', Name => 'TableTopLongitudinalPositionTol' },
+    '300A,0053' => { VR => 'DS', Name => 'TableTopLateralPositionTolerance' },
+    '300A,0055' => { VR => 'CS', Name => 'RTPlanRelationship' },
+    '300A,0070' => { VR => 'SQ', Name => 'FractionGroupSequence' },
+    '300A,0071' => { VR => 'IS', Name => 'FractionGroupNumber' },
+    '300A,0072' => { VR => 'LO', Name => 'FractionGroupDescription' },
+    '300A,0078' => { VR => 'IS', Name => 'NumberOfFractionsPlanned' },
+    '300A,0079' => { VR => 'IS', Name => 'NumberFractionPatternDigitsPerDay' },
+    '300A,007A' => { VR => 'IS', Name => 'RepeatFractionCycleLength' },
+    '300A,007B' => { VR => 'LT', Name => 'FractionPattern' },
+    '300A,0080' => { VR => 'IS', Name => 'NumberOfBeams' },
+    '300A,0082' => { VR => 'DS', Name => 'BeamDoseSpecificationPoint' },
+    '300A,0084' => { VR => 'DS', Name => 'BeamDose' },
+    '300A,0086' => { VR => 'DS', Name => 'BeamMeterset' },
+    '300A,0088' => { VR => 'FL', Name => 'BeamDosePointDepth' },
+    '300A,0089' => { VR => 'FL', Name => 'BeamDosePointEquivalentDepth' },
+    '300A,008A' => { VR => 'FL', Name => 'BeamDosePointSSD' },
+    '300A,00A0' => { VR => 'IS', Name => 'NumberOfBrachyApplicationSetups' },
+    '300A,00A2' => { VR => 'DS', Name => 'BrachyAppSetupDoseSpecPoint' },
+    '300A,00A4' => { VR => 'DS', Name => 'BrachyApplicationSetupDose' },
+    '300A,00B0' => { VR => 'SQ', Name => 'BeamSequence' },
+    '300A,00B2' => { VR => 'SH', Name => 'TreatmentMachineName' },
+    '300A,00B3' => { VR => 'CS', Name => 'PrimaryDosimeterUnit' },
+    '300A,00B4' => { VR => 'DS', Name => 'SourceAxisDistance' },
+    '300A,00B6' => { VR => 'SQ', Name => 'BeamLimitingDeviceSequence' },
+    '300A,00B8' => { VR => 'CS', Name => 'RTBeamLimitingDeviceType' },
+    '300A,00BA' => { VR => 'DS', Name => 'SourceToBeamLimitingDeviceDistance' },
+    '300A,00BB' => { VR => 'FL', Name => 'IsocenterToBeamLimitingDeviceDist' },
+    '300A,00BC' => { VR => 'IS', Name => 'NumberOfLeafJawPairs' },
+    '300A,00BE' => { VR => 'DS', Name => 'LeafPositionBoundaries' },
+    '300A,00C0' => { VR => 'IS', Name => 'BeamNumber' },
+    '300A,00C2' => { VR => 'LO', Name => 'BeamName' },
+    '300A,00C3' => { VR => 'ST', Name => 'BeamDescription' },
+    '300A,00C4' => { VR => 'CS', Name => 'BeamType' },
+    '300A,00C6' => { VR => 'CS', Name => 'RadiationType' },
+    '300A,00C7' => { VR => 'CS', Name => 'HighDoseTechniqueType' },
+    '300A,00C8' => { VR => 'IS', Name => 'ReferenceImageNumber' },
+    '300A,00CA' => { VR => 'SQ', Name => 'PlannedVerificationImageSequence' },
+    '300A,00CC' => { VR => 'LO', Name => 'ImagingDeviceSpecificAcqParams' },
+    '300A,00CE' => { VR => 'CS', Name => 'TreatmentDeliveryType' },
+    '300A,00D0' => { VR => 'IS', Name => 'NumberOfWedges' },
+    '300A,00D1' => { VR => 'SQ', Name => 'WedgeSequence' },
+    '300A,00D2' => { VR => 'IS', Name => 'WedgeNumber' },
+    '300A,00D3' => { VR => 'CS', Name => 'WedgeType' },
+    '300A,00D4' => { VR => 'SH', Name => 'WedgeID' },
+    '300A,00D5' => { VR => 'IS', Name => 'WedgeAngle' },
+    '300A,00D6' => { VR => 'DS', Name => 'WedgeFactor' },
+    '300A,00D7' => { VR => 'FL', Name => 'TotalWedgeTrayWaterEquivThickness' },
+    '300A,00D8' => { VR => 'DS', Name => 'WedgeOrientation' },
+    '300A,00D9' => { VR => 'FL', Name => 'IsocenterToWedgeTrayDistance' },
+    '300A,00DA' => { VR => 'DS', Name => 'SourceToWedgeTrayDistance' },
+    '300A,00DB' => { VR => 'FL', Name => 'WedgeThinEdgePosition' },
+    '300A,00DC' => { VR => 'SH', Name => 'BolusID' },
+    '300A,00DD' => { VR => 'ST', Name => 'BolusDescription' },
+    '300A,00E0' => { VR => 'IS', Name => 'NumberOfCompensators' },
+    '300A,00E1' => { VR => 'SH', Name => 'MaterialID' },
+    '300A,00E2' => { VR => 'DS', Name => 'TotalCompensatorTrayFactor' },
+    '300A,00E3' => { VR => 'SQ', Name => 'CompensatorSequence' },
+    '300A,00E4' => { VR => 'IS', Name => 'CompensatorNumber' },
+    '300A,00E5' => { VR => 'SH', Name => 'CompensatorID' },
+    '300A,00E6' => { VR => 'DS', Name => 'SourceToCompensatorTrayDistance' },
+    '300A,00E7' => { VR => 'IS', Name => 'CompensatorRows' },
+    '300A,00E8' => { VR => 'IS', Name => 'CompensatorColumns' },
+    '300A,00E9' => { VR => 'DS', Name => 'CompensatorPixelSpacing' },
+    '300A,00EA' => { VR => 'DS', Name => 'CompensatorPosition' },
+    '300A,00EB' => { VR => 'DS', Name => 'CompensatorTransmissionData' },
+    '300A,00EC' => { VR => 'DS', Name => 'CompensatorThicknessData' },
+    '300A,00ED' => { VR => 'IS', Name => 'NumberOfBoli' },
+    '300A,00EE' => { VR => 'CS', Name => 'CompensatorType' },
+    '300A,00F0' => { VR => 'IS', Name => 'NumberOfBlocks' },
+    '300A,00F2' => { VR => 'DS', Name => 'TotalBlockTrayFactor' },
+    '300A,00F3' => { VR => 'FL', Name => 'TotalBlockTrayWaterEquivThickness' },
+    '300A,00F4' => { VR => 'SQ', Name => 'BlockSequence' },
+    '300A,00F5' => { VR => 'SH', Name => 'BlockTrayID' },
+    '300A,00F6' => { VR => 'DS', Name => 'SourceToBlockTrayDistance' },
+    '300A,00F7' => { VR => 'FL', Name => 'IsocenterToBlockTrayDistance' },
+    '300A,00F8' => { VR => 'CS', Name => 'BlockType' },
+    '300A,00F9' => { VR => 'LO', Name => 'AccessoryCode' },
+    '300A,00FA' => { VR => 'CS', Name => 'BlockDivergence' },
+    '300A,00FB' => { VR => 'CS', Name => 'BlockMountingPosition' },
+    '300A,00FC' => { VR => 'IS', Name => 'BlockNumber' },
+    '300A,00FE' => { VR => 'LO', Name => 'BlockName' },
+    '300A,0100' => { VR => 'DS', Name => 'BlockThickness' },
+    '300A,0102' => { VR => 'DS', Name => 'BlockTransmission' },
+    '300A,0104' => { VR => 'IS', Name => 'BlockNumberOfPoints' },
+    '300A,0106' => { VR => 'DS', Name => 'BlockData' },
+    '300A,0107' => { VR => 'SQ', Name => 'ApplicatorSequence' },
+    '300A,0108' => { VR => 'SH', Name => 'ApplicatorID' },
+    '300A,0109' => { VR => 'CS', Name => 'ApplicatorType' },
+    '300A,010A' => { VR => 'LO', Name => 'ApplicatorDescription' },
+    '300A,010C' => { VR => 'DS', Name => 'CumulativeDoseReferenceCoefficient' },
+    '300A,010E' => { VR => 'DS', Name => 'FinalCumulativeMetersetWeight' },
+    '300A,0110' => { VR => 'IS', Name => 'NumberOfControlPoints' },
+    '300A,0111' => { VR => 'SQ', Name => 'ControlPointSequence' },
+    '300A,0112' => { VR => 'IS', Name => 'ControlPointIndex' },
+    '300A,0114' => { VR => 'DS', Name => 'NominalBeamEnergy' },
+    '300A,0115' => { VR => 'DS', Name => 'DoseRateSet' },
+    '300A,0116' => { VR => 'SQ', Name => 'WedgePositionSequence' },
+    '300A,0118' => { VR => 'CS', Name => 'WedgePosition' },
+    '300A,011A' => { VR => 'SQ', Name => 'BeamLimitingDevicePositionSequence' },
+    '300A,011C' => { VR => 'DS', Name => 'LeafJawPositions' },
+    '300A,011E' => { VR => 'DS', Name => 'GantryAngle' },
+    '300A,011F' => { VR => 'CS', Name => 'GantryRotationDirection' },
+    '300A,0120' => { VR => 'DS', Name => 'BeamLimitingDeviceAngle' },
+    '300A,0121' => { VR => 'CS', Name => 'BeamLimitingDeviceRotateDirection' },
+    '300A,0122' => { VR => 'DS', Name => 'PatientSupportAngle' },
+    '300A,0123' => { VR => 'CS', Name => 'PatientSupportRotationDirection' },
+    '300A,0124' => { VR => 'DS', Name => 'TableTopEccentricAxisDistance' },
+    '300A,0125' => { VR => 'DS', Name => 'TableTopEccentricAngle' },
+    '300A,0126' => { VR => 'CS', Name => 'TableTopEccentricRotateDirection' },
+    '300A,0128' => { VR => 'DS', Name => 'TableTopVerticalPosition' },
+    '300A,0129' => { VR => 'DS', Name => 'TableTopLongitudinalPosition' },
+    '300A,012A' => { VR => 'DS', Name => 'TableTopLateralPosition' },
+    '300A,012C' => { VR => 'DS', Name => 'IsocenterPosition' },
+    '300A,012E' => { VR => 'DS', Name => 'SurfaceEntryPoint' },
+    '300A,0130' => { VR => 'DS', Name => 'SourceToSurfaceDistance' },
+    '300A,0134' => { VR => 'DS', Name => 'CumulativeMetersetWeight' },
+    '300A,0140' => { VR => 'FL', Name => 'TableTopPitchAngle' },
+    '300A,0142' => { VR => 'CS', Name => 'TableTopPitchRotationDirection' },
+    '300A,0144' => { VR => 'FL', Name => 'TableTopRollAngle' },
+    '300A,0146' => { VR => 'CS', Name => 'TableTopRollRotationDirection' },
+    '300A,0148' => { VR => 'FL', Name => 'HeadFixationAngle' },
+    '300A,014A' => { VR => 'FL', Name => 'GantryPitchAngle' },
+    '300A,014C' => { VR => 'CS', Name => 'GantryPitchRotationDirection' },
+    '300A,014E' => { VR => 'FL', Name => 'GantryPitchAngleTolerance' },
+    '300A,0180' => { VR => 'SQ', Name => 'PatientSetupSequence' },
+    '300A,0182' => { VR => 'IS', Name => 'PatientSetupNumber' },
+    '300A,0183' => { VR => 'LO', Name => 'PatientSetupLabel' },
+    '300A,0184' => { VR => 'LO', Name => 'PatientAdditionalPosition' },
+    '300A,0190' => { VR => 'SQ', Name => 'FixationDeviceSequence' },
+    '300A,0192' => { VR => 'CS', Name => 'FixationDeviceType' },
+    '300A,0194' => { VR => 'SH', Name => 'FixationDeviceLabel' },
+    '300A,0196' => { VR => 'ST', Name => 'FixationDeviceDescription' },
+    '300A,0198' => { VR => 'SH', Name => 'FixationDevicePosition' },
+    '300A,0199' => { VR => 'FL', Name => 'FixationDevicePitchAngle' },
+    '300A,019A' => { VR => 'FL', Name => 'FixationDeviceRollAngle' },
+    '300A,01A0' => { VR => 'SQ', Name => 'ShieldingDeviceSequence' },
+    '300A,01A2' => { VR => 'CS', Name => 'ShieldingDeviceType' },
+    '300A,01A4' => { VR => 'SH', Name => 'ShieldingDeviceLabel' },
+    '300A,01A6' => { VR => 'ST', Name => 'ShieldingDeviceDescription' },
+    '300A,01A8' => { VR => 'SH', Name => 'ShieldingDevicePosition' },
+    '300A,01B0' => { VR => 'CS', Name => 'SetupTechnique' },
+    '300A,01B2' => { VR => 'ST', Name => 'SetupTechniqueDescription' },
+    '300A,01B4' => { VR => 'SQ', Name => 'SetupDeviceSequence' },
+    '300A,01B6' => { VR => 'CS', Name => 'SetupDeviceType' },
+    '300A,01B8' => { VR => 'SH', Name => 'SetupDeviceLabel' },
+    '300A,01BA' => { VR => 'ST', Name => 'SetupDeviceDescription' },
+    '300A,01BC' => { VR => 'DS', Name => 'SetupDeviceParameter' },
+    '300A,01D0' => { VR => 'ST', Name => 'SetupReferenceDescription' },
+    '300A,01D2' => { VR => 'DS', Name => 'TableTopVerticalSetupDisplacement' },
+    '300A,01D4' => { VR => 'DS', Name => 'TableTopLongitudinalSetupDisplace' },
+    '300A,01D6' => { VR => 'DS', Name => 'TableTopLateralSetupDisplacement' },
+    '300A,0200' => { VR => 'CS', Name => 'BrachyTreatmentTechnique' },
+    '300A,0202' => { VR => 'CS', Name => 'BrachyTreatmentType' },
+    '300A,0206' => { VR => 'SQ', Name => 'TreatmentMachineSequence' },
+    '300A,0210' => { VR => 'SQ', Name => 'SourceSequence' },
+    '300A,0212' => { VR => 'IS', Name => 'SourceNumber' },
+    '300A,0214' => { VR => 'CS', Name => 'SourceType' },
+    '300A,0216' => { VR => 'LO', Name => 'SourceManufacturer' },
+    '300A,0218' => { VR => 'DS', Name => 'ActiveSourceDiameter' },
+    '300A,021A' => { VR => 'DS', Name => 'ActiveSourceLength' },
+    '300A,0222' => { VR => 'DS', Name => 'SourceEncapsulationNomThickness' },
+    '300A,0224' => { VR => 'DS', Name => 'SourceEncapsulationNomTransmission' },
+    '300A,0226' => { VR => 'LO', Name => 'SourceIsotopeName' },
+    '300A,0228' => { VR => 'DS', Name => 'SourceIsotopeHalfLife' },
+    '300A,0229' => { VR => 'CS', Name => 'SourceStrengthUnits' },
+    '300A,022A' => { VR => 'DS', Name => 'ReferenceAirKermaRate' },
+    '300A,022B' => { VR => 'DS', Name => 'SourceStrength' },
+    '300A,022C' => { VR => 'DA', Name => 'SourceStrengthReferenceDate' },
+    '300A,022E' => { VR => 'TM', Name => 'SourceStrengthReferenceTime' },
+    '300A,0230' => { VR => 'SQ', Name => 'ApplicationSetupSequence' },
+    '300A,0232' => { VR => 'CS', Name => 'ApplicationSetupType' },
+    '300A,0234' => { VR => 'IS', Name => 'ApplicationSetupNumber' },
+    '300A,0236' => { VR => 'LO', Name => 'ApplicationSetupName' },
+    '300A,0238' => { VR => 'LO', Name => 'ApplicationSetupManufacturer' },
+    '300A,0240' => { VR => 'IS', Name => 'TemplateNumber' },
+    '300A,0242' => { VR => 'SH', Name => 'TemplateType' },
+    '300A,0244' => { VR => 'LO', Name => 'TemplateName' },
+    '300A,0250' => { VR => 'DS', Name => 'TotalReferenceAirKerma' },
+    '300A,0260' => { VR => 'SQ', Name => 'BrachyAccessoryDeviceSequence' },
+    '300A,0262' => { VR => 'IS', Name => 'BrachyAccessoryDeviceNumber' },
+    '300A,0263' => { VR => 'SH', Name => 'BrachyAccessoryDeviceID' },
+    '300A,0264' => { VR => 'CS', Name => 'BrachyAccessoryDeviceType' },
+    '300A,0266' => { VR => 'LO', Name => 'BrachyAccessoryDeviceName' },
+    '300A,026A' => { VR => 'DS', Name => 'BrachyAccessoryDeviceNomThickness' },
+    '300A,026C' => { VR => 'DS', Name => 'BrachyAccessoryDevNomTransmission' },
+    '300A,0280' => { VR => 'SQ', Name => 'ChannelSequence' },
+    '300A,0282' => { VR => 'IS', Name => 'ChannelNumber' },
+    '300A,0284' => { VR => 'DS', Name => 'ChannelLength' },
+    '300A,0286' => { VR => 'DS', Name => 'ChannelTotalTime' },
+    '300A,0288' => { VR => 'CS', Name => 'SourceMovementType' },
+    '300A,028A' => { VR => 'IS', Name => 'NumberOfPulses' },
+    '300A,028C' => { VR => 'DS', Name => 'PulseRepetitionInterval' },
+    '300A,0290' => { VR => 'IS', Name => 'SourceApplicatorNumber' },
+    '300A,0291' => { VR => 'SH', Name => 'SourceApplicatorID' },
+    '300A,0292' => { VR => 'CS', Name => 'SourceApplicatorType' },
+    '300A,0294' => { VR => 'LO', Name => 'SourceApplicatorName' },
+    '300A,0296' => { VR => 'DS', Name => 'SourceApplicatorLength' },
+    '300A,0298' => { VR => 'LO', Name => 'SourceApplicatorManufacturer' },
+    '300A,029C' => { VR => 'DS', Name => 'SourceApplicatorWallNomThickness' },
+    '300A,029E' => { VR => 'DS', Name => 'SourceApplicatorWallNomTrans' },
+    '300A,02A0' => { VR => 'DS', Name => 'SourceApplicatorStepSize' },
+    '300A,02A2' => { VR => 'IS', Name => 'TransferTubeNumber' },
+    '300A,02A4' => { VR => 'DS', Name => 'TransferTubeLength' },
+    '300A,02B0' => { VR => 'SQ', Name => 'ChannelShieldSequence' },
+    '300A,02B2' => { VR => 'IS', Name => 'ChannelShieldNumber' },
+    '300A,02B3' => { VR => 'SH', Name => 'ChannelShieldID' },
+    '300A,02B4' => { VR => 'LO', Name => 'ChannelShieldName' },
+    '300A,02B8' => { VR => 'DS', Name => 'ChannelShieldNominalThickness' },
+    '300A,02BA' => { VR => 'DS', Name => 'ChannelShieldNominalTransmission' },
+    '300A,02C8' => { VR => 'DS', Name => 'FinalCumulativeTimeWeight' },
+    '300A,02D0' => { VR => 'SQ', Name => 'BrachyControlPointSequence' },
+    '300A,02D2' => { VR => 'DS', Name => 'ControlPointRelativePosition' },
+    '300A,02D4' => { VR => 'DS', Name => 'ControlPoint3DPosition' },
+    '300A,02D6' => { VR => 'DS', Name => 'CumulativeTimeWeight' },
+    '300A,02E0' => { VR => 'CS', Name => 'CompensatorDivergence' },
+    '300A,02E1' => { VR => 'CS', Name => 'CompensatorMountingPosition' },
+    '300A,02E2' => { VR => 'DS', Name => 'SourceToCompensatorDistance' },
+    '300A,02E3' => { VR => 'FL', Name => 'TotalCompTrayWaterEquivThickness' },
+    '300A,02E4' => { VR => 'FL', Name => 'IsocenterToCompensatorTrayDistance' },
+    '300A,02E5' => { VR => 'FL', Name => 'CompensatorColumnOffset' },
+    '300A,02E6' => { VR => 'FL', Name => 'IsocenterToCompensatorDistances' },
+    '300A,02E7' => { VR => 'FL', Name => 'CompensatorRelStoppingPowerRatio' },
+    '300A,02E8' => { VR => 'FL', Name => 'CompensatorMillingToolDiameter' },
+    '300A,02EA' => { VR => 'SQ', Name => 'IonRangeCompensatorSequence' },
+    '300A,02EB' => { VR => 'LT', Name => 'CompensatorDescription' },
+    '300A,0302' => { VR => 'IS', Name => 'RadiationMassNumber' },
+    '300A,0304' => { VR => 'IS', Name => 'RadiationAtomicNumber' },
+    '300A,0306' => { VR => 'SS', Name => 'RadiationChargeState' },
+    '300A,0308' => { VR => 'CS', Name => 'ScanMode' },
+    '300A,030A' => { VR => 'FL', Name => 'VirtualSourceAxisDistances' },
+    '300A,030C' => { VR => 'SQ', Name => 'SnoutSequence' },
+    '300A,030D' => { VR => 'FL', Name => 'SnoutPosition' },
+    '300A,030F' => { VR => 'SH', Name => 'SnoutID' },
+    '300A,0312' => { VR => 'IS', Name => 'NumberOfRangeShifters' },
+    '300A,0314' => { VR => 'SQ', Name => 'RangeShifterSequence' },
+    '300A,0316' => { VR => 'IS', Name => 'RangeShifterNumber' },
+    '300A,0318' => { VR => 'SH', Name => 'RangeShifterID' },
+    '300A,0320' => { VR => 'CS', Name => 'RangeShifterType' },
+    '300A,0322' => { VR => 'LO', Name => 'RangeShifterDescription' },
+    '300A,0330' => { VR => 'IS', Name => 'NumberOfLateralSpreadingDevices' },
+    '300A,0332' => { VR => 'SQ', Name => 'LateralSpreadingDeviceSequence' },
+    '300A,0334' => { VR => 'IS', Name => 'LateralSpreadingDeviceNumber' },
+    '300A,0336' => { VR => 'SH', Name => 'LateralSpreadingDeviceID' },
+    '300A,0338' => { VR => 'CS', Name => 'LateralSpreadingDeviceType' },
+    '300A,033A' => { VR => 'LO', Name => 'LateralSpreadingDeviceDescription' },
+    '300A,033C' => { VR => 'FL', Name => 'LateralSpreadingDevWaterEquivThick' },
+    '300A,0340' => { VR => 'IS', Name => 'NumberOfRangeModulators' },
+    '300A,0342' => { VR => 'SQ', Name => 'RangeModulatorSequence' },
+    '300A,0344' => { VR => 'IS', Name => 'RangeModulatorNumber' },
+    '300A,0346' => { VR => 'SH', Name => 'RangeModulatorID' },
+    '300A,0348' => { VR => 'CS', Name => 'RangeModulatorType' },
+    '300A,034A' => { VR => 'LO', Name => 'RangeModulatorDescription' },
+    '300A,034C' => { VR => 'SH', Name => 'BeamCurrentModulationID' },
+    '300A,0350' => { VR => 'CS', Name => 'PatientSupportType' },
+    '300A,0352' => { VR => 'SH', Name => 'PatientSupportID' },
+    '300A,0354' => { VR => 'LO', Name => 'PatientSupportAccessoryCode' },
+    '300A,0356' => { VR => 'FL', Name => 'FixationLightAzimuthalAngle' },
+    '300A,0358' => { VR => 'FL', Name => 'FixationLightPolarAngle' },
+    '300A,035A' => { VR => 'FL', Name => 'MetersetRate' },
+    '300A,0360' => { VR => 'SQ', Name => 'RangeShifterSettingsSequence' },
+    '300A,0362' => { VR => 'LO', Name => 'RangeShifterSetting' },
+    '300A,0364' => { VR => 'FL', Name => 'IsocenterToRangeShifterDistance' },
+    '300A,0366' => { VR => 'FL', Name => 'RangeShifterWaterEquivThickness' },
+    '300A,0370' => { VR => 'SQ', Name => 'LateralSpreadingDeviceSettingsSeq' },
+    '300A,0372' => { VR => 'LO', Name => 'LateralSpreadingDeviceSetting' },
+    '300A,0374' => { VR => 'FL', Name => 'IsocenterToLateralSpreadingDevDist' },
+    '300A,0380' => { VR => 'SQ', Name => 'RangeModulatorSettingsSequence' },
+    '300A,0382' => { VR => 'FL', Name => 'RangeModulatorGatingStartValue' },
+    '300A,0384' => { VR => 'FL', Name => 'RangeModulatorGatingStopValue' },
+    '300A,038A' => { VR => 'FL', Name => 'IsocenterToRangeModulatorDistance' },
+    '300A,0390' => { VR => 'SH', Name => 'ScanSpotTuneID' },
+    '300A,0392' => { VR => 'IS', Name => 'NumberOfScanSpotPositions' },
+    '300A,0394' => { VR => 'FL', Name => 'ScanSpotPositionMap' },
+    '300A,0396' => { VR => 'FL', Name => 'ScanSpotMetersetWeights' },
+    '300A,0398' => { VR => 'FL', Name => 'ScanningSpotSize' },
+    '300A,039A' => { VR => 'IS', Name => 'NumberOfPaintings' },
+    '300A,03A0' => { VR => 'SQ', Name => 'IonToleranceTableSequence' },
+    '300A,03A2' => { VR => 'SQ', Name => 'IonBeamSequence' },
+    '300A,03A4' => { VR => 'SQ', Name => 'IonBeamLimitingDeviceSequence' },
+    '300A,03A6' => { VR => 'SQ', Name => 'IonBlockSequence' },
+    '300A,03A8' => { VR => 'SQ', Name => 'IonControlPointSequence' },
+    '300A,03AA' => { VR => 'SQ', Name => 'IonWedgeSequence' },
+    '300A,03AC' => { VR => 'SQ', Name => 'IonWedgePositionSequence' },
+    '300A,0401' => { VR => 'SQ', Name => 'ReferencedSetupImageSequence' },
+    '300A,0402' => { VR => 'ST', Name => 'SetupImageComment' },
+    '300A,0410' => { VR => 'SQ', Name => 'MotionSynchronizationSequence' },
+    '300A,0412' => { VR => 'FL', Name => 'ControlPointOrientation' },
+    '300A,0420' => { VR => 'SQ', Name => 'GeneralAccessorySequence' },
+    '300A,0421' => { VR => 'SH', Name => 'GeneralAccessoryID' },
+    '300A,0422' => { VR => 'ST', Name => 'GeneralAccessoryDescription' },
+    '300A,0423' => { VR => 'CS', Name => 'GeneralAccessoryType' },
+    '300A,0424' => { VR => 'IS', Name => 'GeneralAccessoryNumber' },
+    '300C,0002' => { VR => 'SQ', Name => 'ReferencedRTPlanSequence' },
+    '300C,0004' => { VR => 'SQ', Name => 'ReferencedBeamSequence' },
+    '300C,0006' => { VR => 'IS', Name => 'ReferencedBeamNumber' },
+    '300C,0007' => { VR => 'IS', Name => 'ReferencedReferenceImageNumber' },
+    '300C,0008' => { VR => 'DS', Name => 'StartCumulativeMetersetWeight' },
+    '300C,0009' => { VR => 'DS', Name => 'EndCumulativeMetersetWeight' },
+    '300C,000A' => { VR => 'SQ', Name => 'ReferencedBrachyAppSetupSeq' },
+    '300C,000C' => { VR => 'IS', Name => 'ReferencedBrachyAppSetupNumber' },
+    '300C,000E' => { VR => 'IS', Name => 'ReferencedSourceNumber' },
+    '300C,0020' => { VR => 'SQ', Name => 'ReferencedFractionGroupSequence' },
+    '300C,0022' => { VR => 'IS', Name => 'ReferencedFractionGroupNumber' },
+    '300C,0040' => { VR => 'SQ', Name => 'ReferencedVerificationImageSeq' },
+    '300C,0042' => { VR => 'SQ', Name => 'ReferencedReferenceImageSequence' },
+    '300C,0050' => { VR => 'SQ', Name => 'ReferencedDoseReferenceSequence' },
+    '300C,0051' => { VR => 'IS', Name => 'ReferencedDoseReferenceNumber' },
+    '300C,0055' => { VR => 'SQ', Name => 'BrachyReferencedDoseReferenceSeq' },
+    '300C,0060' => { VR => 'SQ', Name => 'ReferencedStructureSetSequence' },
+    '300C,006A' => { VR => 'IS', Name => 'ReferencedPatientSetupNumber' },
+    '300C,0080' => { VR => 'SQ', Name => 'ReferencedDoseSequence' },
+    '300C,00A0' => { VR => 'IS', Name => 'ReferencedToleranceTableNumber' },
+    '300C,00B0' => { VR => 'SQ', Name => 'ReferencedBolusSequence' },
+    '300C,00C0' => { VR => 'IS', Name => 'ReferencedWedgeNumber' },
+    '300C,00D0' => { VR => 'IS', Name => 'ReferencedCompensatorNumber' },
+    '300C,00E0' => { VR => 'IS', Name => 'ReferencedBlockNumber' },
+    '300C,00F0' => { VR => 'IS', Name => 'ReferencedControlPointIndex' },
+    '300C,00F2' => { VR => 'SQ', Name => 'ReferencedControlPointSequence' },
+    '300C,00F4' => { VR => 'IS', Name => 'ReferencedStartControlPointIndex' },
+    '300C,00F6' => { VR => 'IS', Name => 'ReferencedStopControlPointIndex' },
+    '300C,0100' => { VR => 'IS', Name => 'ReferencedRangeShifterNumber' },
+    '300C,0102' => { VR => 'IS', Name => 'ReferencedLateralSpreadingDevNum' },
+    '300C,0104' => { VR => 'IS', Name => 'ReferencedRangeModulatorNumber' },
+    '300E,0002' => { VR => 'CS', Name => 'ApprovalStatus' },
+    '300E,0004' => { VR => 'DA', Name => 'ReviewDate' },
+    '300E,0005' => { VR => 'TM', Name => 'ReviewTime' },
+    '300E,0008' => { VR => 'PN', Name => 'ReviewerName' },
+    # text group
+    '4000,0000' => { VR => 'UL', Name => 'TextGroupLength' },
+    '4000,0010' => { VR => 'LT', Name => 'Arbitrary' },
+    '4000,4000' => { VR => 'LT', Name => 'TextComments' },
+    # results group
+    '4008,0040' => { VR => 'SH', Name => 'ResultsID' },
+    '4008,0042' => { VR => 'LO', Name => 'ResultsIDIssuer' },
+    '4008,0050' => { VR => 'SQ', Name => 'ReferencedInterpretationSequence' },
+    '4008,0100' => { VR => 'DA', Name => 'InterpretationRecordedDate' },
+    '4008,0101' => { VR => 'TM', Name => 'InterpretationRecordedTime' },
+    '4008,0102' => { VR => 'PN', Name => 'InterpretationRecorder' },
+    '4008,0103' => { VR => 'LO', Name => 'ReferenceToRecordedSound' },
+    '4008,0108' => { VR => 'DA', Name => 'InterpretationTranscriptionDate' },
+    '4008,0109' => { VR => 'TM', Name => 'InterpretationTranscriptionTime' },
+    '4008,010A' => { VR => 'PN', Name => 'InterpretationTranscriber' },
+    '4008,010B' => { VR => 'ST', Name => 'InterpretationText' },
+    '4008,010C' => { VR => 'PN', Name => 'InterpretationAuthor' },
+    '4008,0111' => { VR => 'SQ', Name => 'InterpretationApproverSequence' },
+    '4008,0112' => { VR => 'DA', Name => 'InterpretationApprovalDate' },
+    '4008,0113' => { VR => 'TM', Name => 'InterpretationApprovalTime' },
+    '4008,0114' => { VR => 'PN', Name => 'PhysicianApprovingInterpretation' },
+    '4008,0115' => { VR => 'LT', Name => 'InterpretationDiagnosisDescription' },
+    '4008,0117' => { VR => 'SQ', Name => 'InterpretationDiagnosisCodeSeq' },
+    '4008,0118' => { VR => 'SQ', Name => 'ResultsDistributionListSequence' },
+    '4008,0119' => { VR => 'PN', Name => 'DistributionName' },
+    '4008,011A' => { VR => 'LO', Name => 'DistributionAddress' },
+    '4008,0200' => { VR => 'SH', Name => 'InterpretationID' },
+    '4008,0202' => { VR => 'LO', Name => 'InterpretationIDIssuer' },
+    '4008,0210' => { VR => 'CS', Name => 'InterpretationTypeID' },
+    '4008,0212' => { VR => 'CS', Name => 'InterpretationStatusID' },
+    '4008,0300' => { VR => 'ST', Name => 'Impressions' },
+    '4008,4000' => { VR => 'ST', Name => 'ResultsComments' },
+    '4FFE,0001' => { VR => 'SQ', Name => 'MACParametersSequence' },
+    # curve group
+    '50xx,0005' => { VR => 'US', Name => 'CurveDimensions' },
+    '50xx,0010' => { VR => 'US', Name => 'NumberOfPoints' },
+    '50xx,0020' => { VR => 'CS', Name => 'TypeOfData' },
+    '50xx,0022' => { VR => 'LO', Name => 'CurveDescription' },
+    '50xx,0030' => { VR => 'SH', Name => 'AxisUnits' },
+    '50xx,0040' => { VR => 'SH', Name => 'AxisLabels' },
+    '50xx,0103' => { VR => 'US', Name => 'DataValueRepresentation' },
+    '50xx,0104' => { VR => 'US', Name => 'MinimumCoordinateValue' },
+    '50xx,0105' => { VR => 'US', Name => 'MaximumCoordinateValue' },
+    '50xx,0106' => { VR => 'SH', Name => 'CurveRange' },
+    '50xx,0110' => { VR => 'US', Name => 'CurveDataDescriptor' },
+    '50xx,0112' => { VR => 'US', Name => 'CoordinateStartValue' },
+    '50xx,0114' => { VR => 'US', Name => 'CoordinateStepValue' },
+    '50xx,1001' => { VR => 'CS', Name => 'CurveActivationLayer' },
+    '50xx,2000' => { VR => 'US', Name => 'AudioType' },
+    '50xx,2002' => { VR => 'US', Name => 'AudioSampleFormat' },
+    '50xx,2004' => { VR => 'US', Name => 'NumberOfChannels' },
+    '50xx,2006' => { VR => 'UL', Name => 'NumberOfSamples' },
+    '50xx,2008' => { VR => 'UL', Name => 'SampleRate' },
+    '50xx,200A' => { VR => 'UL', Name => 'TotalTime' },
+    '50xx,200C' => { VR => 'OW', Name => 'AudioSampleData' },
+    '50xx,200E' => { VR => 'LT', Name => 'AudioComments' },
+    '50xx,2500' => { VR => 'LO', Name => 'CurveLabel' },
+    '50xx,2600' => { VR => 'SQ', Name => 'ReferencedOverlaySequence' },
+    '50xx,2610' => { VR => 'US', Name => 'ReferencedOverlayGroup' },
+    '50xx,3000' => { VR => 'OW', Name => 'CurveData' },
+    '5200,9229' => { VR => 'SQ', Name => 'SharedFunctionalGroupsSequence' },
+    '5200,9230' => { VR => 'SQ', Name => 'PerFrameFunctionalGroupsSequence' },
+    '5400,0100' => { VR => 'SQ', Name => 'WaveformSequence' },
+    '5400,0110' => { VR => 'OB', Name => 'ChannelMinimumValue' },
+    '5400,0112' => { VR => 'OB', Name => 'ChannelMaximumValue' },
+    '5400,1004' => { VR => 'US', Name => 'WaveformBitsAllocated' },
+    '5400,1006' => { VR => 'CS', Name => 'WaveformSampleInterpretation' },
+    '5400,100A' => { VR => 'OB', Name => 'WaveformPaddingValue' },
+    '5400,1010' => { VR => 'OB', Name => 'WaveformData' },
+    '5600,0010' => { VR => 'OF', Name => 'FirstOrderPhaseCorrectionAngle' },
+    '5600,0020' => { VR => 'OF', Name => 'SpectroscopyData' },
+    # overlay group
+    '6000,0000' => { VR => 'UL', Name => 'OverlayGroupLength' },
+    '60xx,0010' => { VR => 'US', Name => 'OverlayRows' },
+    '60xx,0011' => { VR => 'US', Name => 'OverlayColumns' },
+    '60xx,0012' => { VR => 'US', Name => 'OverlayPlanes' },
+    '60xx,0015' => { VR => 'IS', Name => 'NumberOfFramesInOverlay' },
+    '60xx,0022' => { VR => 'LO', Name => 'OverlayDescription' },
+    '60xx,0040' => { VR => 'CS', Name => 'OverlayType' },
+    '60xx,0045' => { VR => 'LO', Name => 'OverlaySubtype' },
+    '60xx,0050' => { VR => 'SS', Name => 'OverlayOrigin' },
+    '60xx,0051' => { VR => 'US', Name => 'ImageFrameOrigin' },
+    '60xx,0052' => { VR => 'US', Name => 'OverlayPlaneOrigin' },
+    '60xx,0060' => { VR => 'CS', Name => 'OverlayCompressionCode' },
+    '60xx,0061' => { VR => 'SH', Name => 'OverlayCompressionOriginator' },
+    '60xx,0062' => { VR => 'SH', Name => 'OverlayCompressionLabel' },
+    '60xx,0063' => { VR => 'CS', Name => 'OverlayCompressionDescription' },
+    '60xx,0066' => { VR => 'AT', Name => 'OverlayCompressionStepPointers' },
+    '60xx,0068' => { VR => 'US', Name => 'OverlayRepeatInterval' },
+    '60xx,0069' => { VR => 'US', Name => 'OverlayBitsGrouped' },
+    '60xx,0100' => { VR => 'US', Name => 'OverlayBitsAllocated' },
+    '60xx,0102' => { VR => 'US', Name => 'OverlayBitPosition' },
+    '60xx,0110' => { VR => 'CS', Name => 'OverlayFormat' },
+    '60xx,0200' => { VR => 'US', Name => 'OverlayLocation' },
+    '60xx,0800' => { VR => 'CS', Name => 'OverlayCodeLabel' },
+    '60xx,0802' => { VR => 'US', Name => 'OverlayNumberOfTables' },
+    '60xx,0803' => { VR => 'AT', Name => 'OverlayCodeTableLocation' },
+    '60xx,0804' => { VR => 'US', Name => 'OverlayBitsForCodeWord' },
+    '60xx,1001' => { VR => 'CS', Name => 'OverlayActivationLayer' },
+    '60xx,1100' => { VR => 'US', Name => 'OverlayDescriptorGray' },
+    '60xx,1101' => { VR => 'US', Name => 'OverlayDescriptorRed' },
+    '60xx,1102' => { VR => 'US', Name => 'OverlayDescriptorGreen' },
+    '60xx,1103' => { VR => 'US', Name => 'OverlayDescriptorBlue' },
+    '60xx,1200' => { VR => 'US', Name => 'OverlaysGray' },
+    '60xx,1201' => { VR => 'US', Name => 'OverlaysRed' },
+    '60xx,1202' => { VR => 'US', Name => 'OverlaysGreen' },
+    '60xx,1203' => { VR => 'US', Name => 'OverlaysBlue' },
+    '60xx,1301' => { VR => 'IS', Name => 'ROIArea' },
+    '60xx,1302' => { VR => 'DS', Name => 'ROIMean' },
+    '60xx,1303' => { VR => 'DS', Name => 'ROIStandardDeviation' },
+    '60xx,1500' => { VR => 'LO', Name => 'OverlayLabel' },
+    '60xx,3000' => { VR => 'OB', Name => 'OverlayData' },
+    '60xx,4000' => { VR => 'LT',Name => 'OverlayComments' },
+    # pixel data group
+    '7Fxx,0000' => { VR => 'UL', Name => 'PixelDataGroupLength' },
+    '7Fxx,0010' => { VR => 'OB', Name => 'PixelData', Binary => 1 },
+    '7Fxx,0011' => { VR => 'US', Name => 'VariableNextDataGroup' },
+    '7Fxx,0020' => { VR => 'OW', Name => 'VariableCoefficientsSDVN' },
+    '7Fxx,0030' => { VR => 'OW', Name => 'VariableCoefficientsSDHN' },
+    '7Fxx,0040' => { VR => 'OW', Name => 'VariableCoefficientsSDDN' },
+    'FFFA,FFFA' => { VR => 'SQ', Name => 'DigitalSignaturesSequence' },
+    'FFFC,FFFC' => { VR => 'OB', Name => 'DataSetTrailingPadding', Binary => 1 },
+    # the sequence delimiters have no VR:
+    'FFFE,E000' => 'StartOfItem',
+    'FFFE,E00D' => 'EndOfItems',
+    'FFFE,E0DD' => 'EndOfSequence',
+);
+
+# table to translate registered UID values to readable strings
+# (the PrintConv is added dynamically when a 'UI' format tag is extracted)
+%uid = (
+    '1.2.840.10008.1.1' => 'Verification SOP Class',
+    '1.2.840.10008.1.2' => 'Implicit VR Little Endian',
+    '1.2.840.10008.1.2.1' => 'Explicit VR Little Endian',
+    '1.2.840.10008.1.2.1.99' => 'Deflated Explicit VR Little Endian',
+    '1.2.840.10008.1.2.2' => 'Explicit VR Big Endian',
+    '1.2.840.10008.1.2.4.50' => 'JPEG Baseline (Process 1)',
+    '1.2.840.10008.1.2.4.51' => 'JPEG Extended (Process 2 & 4)',
+    '1.2.840.10008.1.2.4.52' => 'JPEG Extended (Process 3 & 5)',
+    '1.2.840.10008.1.2.4.53' => 'JPEG Spectral Selection, Non-Hierarchical (Process 6 & 8)',
+    '1.2.840.10008.1.2.4.54' => 'JPEG Spectral Selection, Non-Hierarchical (Process 7 & 9)',
+    '1.2.840.10008.1.2.4.55' => 'JPEG Full Progression, Non-Hierarchical (Process 10 & 12)',
+    '1.2.840.10008.1.2.4.56' => 'JPEG Full Progression, Non-Hierarchical (Process 11 & 13)',
+    '1.2.840.10008.1.2.4.57' => 'JPEG Lossless, Non-Hierarchical (Process 14)',
+    '1.2.840.10008.1.2.4.58' => 'JPEG Lossless, Non-Hierarchical (Process 15) ',
+    '1.2.840.10008.1.2.4.59' => 'JPEG Extended, Hierarchical (Process 16 & 18) ',
+    '1.2.840.10008.1.2.4.60' => 'JPEG Extended, Hierarchical (Process 17 & 19) ',
+    '1.2.840.10008.1.2.4.61' => 'JPEG Spectral Selection, Hierarchical (Process 20 & 22)',
+    '1.2.840.10008.1.2.4.62' => 'JPEG Spectral Selection, Hierarchical (Process 21 & 23)',
+    '1.2.840.10008.1.2.4.63' => 'JPEG Full Progression, Hierarchical (Process 24 & 26)',
+    '1.2.840.10008.1.2.4.64' => 'JPEG Full Progression, Hierarchical (Process 25 & 27)',
+    '1.2.840.10008.1.2.4.65' => 'JPEG Lossless, Hierarchical (Process 28) ',
+    '1.2.840.10008.1.2.4.66' => 'JPEG Lossless, Hierarchical (Process 29) ',
+    '1.2.840.10008.1.2.4.70' => 'JPEG Lossless, Non-Hierarchical, First-Order Prediction (Process 14-1)',
+    '1.2.840.10008.1.2.4.80' => 'JPEG-LS Lossless Image Compression',
+    '1.2.840.10008.1.2.4.81' => 'JPEG-LS Lossy (Near-Lossless) Image Compression',
+    '1.2.840.10008.1.2.4.90' => 'JPEG 2000 Image Compression (Lossless Only)',
+    '1.2.840.10008.1.2.4.91' => 'JPEG 2000 Image Compression',
+    '1.2.840.10008.1.2.4.92' => 'JPEG 2000 Part 2 Multi-component Image Compression (Lossless Only)',
+    '1.2.840.10008.1.2.4.93' => 'JPEG 2000 Part 2 Multi-component Image Compression',
+    '1.2.840.10008.1.2.4.94' => 'JPIP Referenced',
+    '1.2.840.10008.1.2.4.95' => 'JPIP Referenced Deflate',
+    '1.2.840.10008.1.2.4.100' => 'MPEG2 Main Profile @ Main Level',
+    '1.2.840.10008.1.2.5' => 'RLE Lossless',
+    '1.2.840.10008.1.2.6.1' => 'RFC 2557 MIME encapsulation',
+    '1.2.840.10008.1.2.6.2' => 'XML Encoding',
+    '1.2.840.10008.1.3.10' => 'Media Storage Directory Storage',
+    '1.2.840.10008.1.4.1.1' => 'Talairach Brain Atlas Frame of Reference',
+    '1.2.840.10008.1.4.1.2' => 'SPM2 T1 Frame of Reference',
+    '1.2.840.10008.1.4.1.3' => 'SPM2 T2 Frame of Reference',
+    '1.2.840.10008.1.4.1.4' => 'SPM2 PD Frame of Reference',
+    '1.2.840.10008.1.4.1.5' => 'SPM2 EPI Frame of Reference',
+    '1.2.840.10008.1.4.1.6' => 'SPM2 FIL T1 Frame of Reference',
+    '1.2.840.10008.1.4.1.7' => 'SPM2 PET Frame of Reference',
+    '1.2.840.10008.1.4.1.8' => 'SPM2 TRANSM Frame of Reference',
+    '1.2.840.10008.1.4.1.9' => 'SPM2 SPECT Frame of Reference',
+    '1.2.840.10008.1.4.1.10' => 'SPM2 GRAY Frame of Reference',
+    '1.2.840.10008.1.4.1.11' => 'SPM2 WHITE Frame of Reference',
+    '1.2.840.10008.1.4.1.12' => 'SPM2 CSF Frame of Reference',
+    '1.2.840.10008.1.4.1.13' => 'SPM2 BRAINMASK Frame of Reference',
+    '1.2.840.10008.1.4.1.14' => 'SPM2 AVG305T1 Frame of Reference',
+    '1.2.840.10008.1.4.1.15' => 'SPM2 AVG152T1 Frame of Reference',
+    '1.2.840.10008.1.4.1.16' => 'SPM2 AVG152T2 Frame of Reference',
+    '1.2.840.10008.1.4.1.17' => 'SPM2 AVG152PD Frame of Reference',
+    '1.2.840.10008.1.4.1.18' => 'SPM2 SINGLESUBJT1 Frame of Reference',
+    '1.2.840.10008.1.4.2.1' => 'ICBM 452 T1 Frame of Reference',
+    '1.2.840.10008.1.4.2.2' => 'ICBM Single Subject MRI Frame of Reference',
+    '1.2.840.10008.1.9' => 'Basic Study Content Notification SOP Class',
+    '1.2.840.10008.1.20.1' => 'Storage Commitment Push Model SOP Class',
+    '1.2.840.10008.1.20.1.1' => 'Storage Commitment Push Model SOP Instance',
+    '1.2.840.10008.1.20.2' => 'Storage Commitment Pull Model SOP Class ',
+    '1.2.840.10008.1.20.2.1' => 'Storage Commitment Pull Model SOP Instance ',
+    '1.2.840.10008.1.40' => 'Procedural Event Logging SOP Class',
+    '1.2.840.10008.1.40.1' => 'Procedural Event Logging SOP Instance',
+    '1.2.840.10008.1.42' => 'Substance Administration Logging SOP Class',
+    '1.2.840.10008.1.42.1' => 'Substance Administration Logging SOP Instance',
+    '1.2.840.10008.2.6.1' => 'DICOM UID Registry',
+    '1.2.840.10008.2.16.4' => 'DICOM Controlled Terminology',
+    '1.2.840.10008.3.1.1.1' => 'DICOM Application Context Name',
+    '1.2.840.10008.3.1.2.1.1' => 'Detached Patient Management SOP Class',
+    '1.2.840.10008.3.1.2.1.4' => 'Detached Patient Management Meta SOP Class',
+    '1.2.840.10008.3.1.2.2.1' => 'Detached Visit Management SOP Class',
+    '1.2.840.10008.3.1.2.3.1' => 'Detached Study Management SOP Class',
+    '1.2.840.10008.3.1.2.3.2' => 'Study Component Management SOP Class',
+    '1.2.840.10008.3.1.2.3.3' => 'Modality Performed Procedure Step SOP Class',
+    '1.2.840.10008.3.1.2.3.4' => 'Modality Performed Procedure Step Retrieve SOP Class',
+    '1.2.840.10008.3.1.2.3.5' => 'Modality Performed Procedure Step Notification SOP Class',
+    '1.2.840.10008.3.1.2.5.1' => 'Detached Results Management SOP Class',
+    '1.2.840.10008.3.1.2.5.4' => 'Detached Results Management Meta SOP Class',
+    '1.2.840.10008.3.1.2.5.5' => 'Detached Study Management Meta SOP Class',
+    '1.2.840.10008.3.1.2.6.1' => 'Detached Interpretation Management SOP Class',
+    '1.2.840.10008.4.2' => 'Storage Service Class Service Class PS 3.4',
+    '1.2.840.10008.5.1.1.1' => 'Basic Film Session SOP Class',
+    '1.2.840.10008.5.1.1.2' => 'Basic Film Box SOP Class',
+    '1.2.840.10008.5.1.1.4' => 'Basic Grayscale Image Box SOP Class',
+    '1.2.840.10008.5.1.1.4.1' => 'Basic Color Image Box SOP Class',
+    '1.2.840.10008.5.1.1.4.2' => 'Referenced Image Box SOP Class',
+    '1.2.840.10008.5.1.1.9' => 'Basic Grayscale Print ManagementMeta SOP Class',
+    '1.2.840.10008.5.1.1.9.1' => 'Referenced Grayscale Print Management Meta SOP Class',
+    '1.2.840.10008.5.1.1.14' => 'Print Job SOP Class',
+    '1.2.840.10008.5.1.1.15' => 'Basic Annotation Box SOP Class',
+    '1.2.840.10008.5.1.1.16' => 'Printer SOP Class',
+    '1.2.840.10008.5.1.1.16.376' => 'Printer Configuration Retrieval SOP Class',
+    '1.2.840.10008.5.1.1.17' => 'Printer SOP Instance',
+    '1.2.840.10008.5.1.1.17.376' => 'Printer Configuration RetrievalSOP Instance',
+    '1.2.840.10008.5.1.1.18' => 'Basic Color Print Management Meta SOP Class',
+    '1.2.840.10008.5.1.1.18.1' => 'Referenced Color Print Management Meta SOP Class',
+    '1.2.840.10008.5.1.1.22' => 'VOI LUT Box SOP Class',
+    '1.2.840.10008.5.1.1.23' => 'Presentation LUT SOP Class',
+    '1.2.840.10008.5.1.1.24' => 'Image Overlay Box SOP Class',
+    '1.2.840.10008.5.1.1.24.1' => 'Basic Print Image Overlay Box SOP Class',
+    '1.2.840.10008.5.1.1.25' => 'Print Queue SOP Instance',
+    '1.2.840.10008.5.1.1.26' => 'Print Queue Management SOP Class',
+    '1.2.840.10008.5.1.1.27' => 'Stored Print Storage SOP Class',
+    '1.2.840.10008.5.1.1.29' => 'Hardcopy Grayscale Image',
+    '1.2.840.10008.5.1.1.30' => 'Hardcopy Color Image Storage SOP Class',
+    '1.2.840.10008.5.1.1.31' => 'Pull Print Request SOP Class',
+    '1.2.840.10008.5.1.1.32' => 'Pull Stored Print Management Meta SOP Class',
+    '1.2.840.10008.5.1.1.33' => 'Media Creation Management SOP Class',
+    '1.2.840.10008.5.1.4.1.1.1' => 'Computed Radiography Image Storage',
+    '1.2.840.10008.5.1.4.1.1.1.1' => 'Digital X-Ray Image Storage - For Presentation',
+    '1.2.840.10008.5.1.4.1.1.1.1.1' => 'Digital X-Ray Image Storage - For Processing',
+    '1.2.840.10008.5.1.4.1.1.1.2' => 'Digital Mammography X-Ray Image Storage - For Presentation',
+    '1.2.840.10008.5.1.4.1.1.1.2.1' => 'Digital Mammography X-Ray Image Storage - For Processing',
+    '1.2.840.10008.5.1.4.1.1.1.3' => 'Digital Intra-oral X-Ray Image Storage - For Presentation',
+    '1.2.840.10008.5.1.4.1.1.1.3.1' => 'Digital Intra-oral X-Ray Image Storage - For Processing',
+    '1.2.840.10008.5.1.4.1.1.2' => 'CT Image Storage',
+    '1.2.840.10008.5.1.4.1.1.2.1' => 'Enhanced CT Image Storage',
+    '1.2.840.10008.5.1.4.1.1.3' => 'Ultrasound Multi-frame Image Storage ',
+    '1.2.840.10008.5.1.4.1.1.3.1' => 'Ultrasound Multi-frame Image Storage',
+    '1.2.840.10008.5.1.4.1.1.4' => 'MR Image Storage',
+    '1.2.840.10008.5.1.4.1.1.4.1' => 'Enhanced MR Image Storage',
+    '1.2.840.10008.5.1.4.1.1.4.2' => 'MR Spectroscopy Storage',
+    '1.2.840.10008.5.1.4.1.1.5' => 'Nuclear Medicine Image Storage',
+    '1.2.840.10008.5.1.4.1.1.6' => 'Ultrasound Image Storage',
+    '1.2.840.10008.5.1.4.1.1.6.1' => 'Ultrasound Image Storage',
+    '1.2.840.10008.5.1.4.1.1.7' => 'Secondary Capture Image Storage',
+    '1.2.840.10008.5.1.4.1.1.7.1' => 'Multi-frame Single Bit Secondary',
+    '1.2.840.10008.5.1.4.1.1.7.2' => 'Multi-frame Grayscale Byte Secondary Capture Image Storage',
+    '1.2.840.10008.5.1.4.1.1.7.3' => 'Multi-frame Grayscale Word Secondary Capture Image Storage',
+    '1.2.840.10008.5.1.4.1.1.7.4' => 'Multi-frame True Color Secondary Capture Image Storage',
+    '1.2.840.10008.5.1.4.1.1.8' => 'Standalone Overlay Storage',
+    '1.2.840.10008.5.1.4.1.1.9' => 'Standalone Curve Storage',
+    '1.2.840.10008.5.1.4.1.1.9.1' => 'Waveform Storage - Trial (Retired)',
+    '1.2.840.10008.5.1.4.1.1.9.1.1' => '12-lead ECG Waveform Storage',
+    '1.2.840.10008.5.1.4.1.1.9.1.2' => 'General ECG Waveform Storage',
+    '1.2.840.10008.5.1.4.1.1.9.1.3' => 'Ambulatory ECG Waveform Storage',
+    '1.2.840.10008.5.1.4.1.1.9.2.1' => 'Hemodynamic Waveform Storage',
+    '1.2.840.10008.5.1.4.1.1.9.3.1' => 'Cardiac Electrophysiology Waveform Storage',
+    '1.2.840.10008.5.1.4.1.1.9.4.1' => 'Basic Voice Audio Waveform Storage',
+    '1.2.840.10008.5.1.4.1.1.10' => 'Standalone Modality LUT Storage',
+    '1.2.840.10008.5.1.4.1.1.11' => 'Standalone VOI LUT Storage',
+    '1.2.840.10008.5.1.4.1.1.11.1' => 'Grayscale Softcopy Presentation State Storage SOP Class',
+    '1.2.840.10008.5.1.4.1.1.11.2' => 'Color Softcopy Presentation State Storage SOP Class',
+    '1.2.840.10008.5.1.4.1.1.11.3' => 'Pseudo-Color Softcopy Presentation State Storage SOP Class',
+    '1.2.840.10008.5.1.4.1.1.11.4' => 'Blending Softcopy Presentation State Storage SOP Class',
+    '1.2.840.10008.5.1.4.1.1.12.1' => 'X-Ray Angiographic Image Storage',
+    '1.2.840.10008.5.1.4.1.1.12.1.1' => 'Enhanced XA Image Storage',
+    '1.2.840.10008.5.1.4.1.1.12.2' => 'X-Ray Radiofluoroscopic Image Storage',
+    '1.2.840.10008.5.1.4.1.1.12.2.1' => 'Enhanced XRF Image Storage',
+    '1.2.840.10008.5.1.4.1.1.12.3' => 'X-Ray Angiographic Bi-Plane Image Storage ',
+    '1.2.840.10008.5.1.4.1.1.13.1.1' => 'X-Ray 3D Angiographic Image Storage',
+    '1.2.840.10008.5.1.4.1.1.13.1.2' => 'X-Ray 3D Craniofacial Image Storage',
+    '1.2.840.10008.5.1.4.1.1.20' => 'Nuclear Medicine Image Storage',
+    '1.2.840.10008.5.1.4.1.1.66' => 'Raw Data Storage',
+    '1.2.840.10008.5.1.4.1.1.66.1' => 'Spatial Registration Storage',
+    '1.2.840.10008.5.1.4.1.1.66.2' => 'Spatial Fiducials Storage',
+    '1.2.840.10008.5.1.4.1.1.66.3' => 'Deformable Spatial Registration Storage',
+    '1.2.840.10008.5.1.4.1.1.66.4' => 'Segmentation Storage',
+    '1.2.840.10008.5.1.4.1.1.67' => 'Real World Value Mapping Storage',
+    '1.2.840.10008.5.1.4.1.1.77.1' => 'VL Image Storage ',
+    '1.2.840.10008.5.1.4.1.1.77.2' => 'VL Multi-frame Image Storage',
+    '1.2.840.10008.5.1.4.1.1.77.1.1' => 'VL Endoscopic Image Storage',
+    '1.2.840.10008.5.1.4.1.1.77.1.1.1' => 'Video Endoscopic Image Storage',
+    '1.2.840.10008.5.1.4.1.1.77.1.2' => 'VL Microscopic Image Storage',
+    '1.2.840.10008.5.1.4.1.1.77.1.2.1' => 'Video Microscopic Image Storage',
+    '1.2.840.10008.5.1.4.1.1.77.1.3' => 'VL Slide-Coordinates Microscopic Image Storage',
+    '1.2.840.10008.5.1.4.1.1.77.1.4' => 'VL Photographic Image Storage',
+    '1.2.840.10008.5.1.4.1.1.77.1.4.1' => 'Video Photographic Image Storage',
+    '1.2.840.10008.5.1.4.1.1.77.1.5.1' => 'Ophthalmic Photography 8 Bit Image Storage',
+    '1.2.840.10008.5.1.4.1.1.77.1.5.2' => 'Ophthalmic Photography 16 Bit Image Storage',
+    '1.2.840.10008.5.1.4.1.1.77.1.5.3' => 'Stereometric Relationship Storage',
+    '1.2.840.10008.5.1.4.1.1.77.1.5.4' => 'Ophthalmic Tomography Image Storage',
+    '1.2.840.10008.5.1.4.1.1.88.1' => 'Text SR Storage - Trial (Retired)',
+    '1.2.840.10008.5.1.4.1.1.88.2' => 'Audio SR Storage - Trial (Retired)',
+    '1.2.840.10008.5.1.4.1.1.88.3' => 'Detail SR Storage - Trial (Retired)',
+    '1.2.840.10008.5.1.4.1.1.88.4' => 'Comprehensive SR Storage - Trial (Retired)',
+    '1.2.840.10008.5.1.4.1.1.88.11' => 'Basic Text SR',
+    '1.2.840.10008.5.1.4.1.1.88.22' => 'Enhanced SR',
+    '1.2.840.10008.5.1.4.1.1.88.33' => 'Comprehensive SR',
+    '1.2.840.10008.5.1.4.1.1.88.40' => 'Procedure Log Storage',
+    '1.2.840.10008.5.1.4.1.1.88.50' => 'Mammography CAD SR',
+    '1.2.840.10008.5.1.4.1.1.88.59' => 'Key Object Selection Document',
+    '1.2.840.10008.5.1.4.1.1.88.65' => 'Chest CAD SR',
+    '1.2.840.10008.5.1.4.1.1.88.67' => 'X-Ray Radiation Dose SR Storage',
+    '1.2.840.10008.5.1.4.1.1.104.1' => 'Encapsulated PDF Storage',
+    '1.2.840.10008.5.1.4.1.1.104.2' => 'Encapsulated CDA Storage',
+    '1.2.840.10008.5.1.4.1.1.128' => 'Positron Emission Tomography Image Storage',
+    '1.2.840.10008.5.1.4.1.1.129' => 'Standalone PET Curve Storage',
+    '1.2.840.10008.5.1.4.1.1.481.1' => 'RT Image Storage',
+    '1.2.840.10008.5.1.4.1.1.481.2' => 'RT Dose Storage',
+    '1.2.840.10008.5.1.4.1.1.481.3' => 'RT Structure Set Storage',
+    '1.2.840.10008.5.1.4.1.1.481.4' => 'RT Beams Treatment Record Storage',
+    '1.2.840.10008.5.1.4.1.1.481.5' => 'RT Plan Storage',
+    '1.2.840.10008.5.1.4.1.1.481.6' => 'RT Brachy Treatment Record Storage',
+    '1.2.840.10008.5.1.4.1.1.481.7' => 'RT Treatment Summary Record Storage',
+    '1.2.840.10008.5.1.4.1.1.481.8' => 'RT Ion Plan Storage',
+    '1.2.840.10008.5.1.4.1.1.481.9' => 'RT Ion Beams Treatment Record Storage',
+    '1.2.840.10008.5.1.4.1.2.1.1' => 'Patient Root Query/Retrieve Information Model - FIND',
+    '1.2.840.10008.5.1.4.1.2.1.2' => 'Patient Root Query/Retrieve Information Model - MOVE',
+    '1.2.840.10008.5.1.4.1.2.1.3' => 'Patient Root Query/Retrieve Information Model - GET',
+    '1.2.840.10008.5.1.4.1.2.2.1' => 'Study Root Query/Retrieve Information Model - FIND',
+    '1.2.840.10008.5.1.4.1.2.2.2' => 'Study Root Query/Retrieve Information Model - MOVE',
+    '1.2.840.10008.5.1.4.1.2.2.3' => 'Study Root Query/Retrieve Information Model - GET',
+    '1.2.840.10008.5.1.4.1.2.3.1' => 'Patient/Study Only Query/Retrieve Information Model - FIND',
+    '1.2.840.10008.5.1.4.1.2.3.2' => 'Patient/Study Only Query/Retrieve Information Model - MOVE',
+    '1.2.840.10008.5.1.4.1.2.3.3' => 'Patient/Study Only Query/Retrieve Information Model - GET',
+    '1.2.840.10008.5.1.4.31' => 'Modality Worklist Information Model - FIND',
+    '1.2.840.10008.5.1.4.32.1' => 'General Purpose Worklist Information Model - FIND',
+    '1.2.840.10008.5.1.4.32.2' => 'General Purpose Scheduled Procedure Step SOP Class',
+    '1.2.840.10008.5.1.4.32.3' => 'General Purpose Performed Procedure Step SOP Class',
+    '1.2.840.10008.5.1.4.32' => 'General Purpose Worklist Management Meta SOP Class',
+    '1.2.840.10008.5.1.4.33' => 'Instance Availability Notification SOP Class',
+    '1.2.840.10008.5.1.4.34.1' => 'RT Beams Delivery Instruction Storage',
+    '1.2.840.10008.5.1.4.34.2' => 'RT Conventional Machine Verification',
+    '1.2.840.10008.5.1.4.34.3' => 'RT Ion Machine Verification',
+    '1.2.840.10008.5.1.4.34.4' => 'Unified Worklist and Procedure Step Service Class',
+    '1.2.840.10008.5.1.4.34.4.1' => 'Unified Procedure Step - Push SOP Class',
+    '1.2.840.10008.5.1.4.34.4.2' => 'Unified Procedure Step - Watch SOP Class',
+    '1.2.840.10008.5.1.4.34.4.3' => 'Unified Procedure Step - Pull SOP Class',
+    '1.2.840.10008.5.1.4.34.4.4' => 'Unified Procedure Step - Event SOP Class',
+    '1.2.840.10008.5.1.4.34.5' => 'Unified Worklist and Procedure Step SOP Instance',
+    '1.2.840.10008.5.1.4.37.1' => 'General Relevant Patient Information Query',
+    '1.2.840.10008.5.1.4.37.2' => 'Breast Imaging Relevant Patient Information Query',
+    '1.2.840.10008.5.1.4.37.3' => 'Cardiac Relevant Patient Information Query',
+    '1.2.840.10008.5.1.4.38.1' => 'Hanging Protocol Storage',
+    '1.2.840.10008.5.1.4.38.2' => 'Hanging Protocol Information Model - FIND',
+    '1.2.840.10008.5.1.4.38.3' => 'Hanging Protocol Information Model - MOVE',
+    '1.2.840.10008.5.1.4.41' => 'Product Characteristics Query SOP Class',
+    '1.2.840.10008.5.1.4.42' => 'Substance Approval Query SOP Class',
+    '1.2.840.10008.15.0.3.1' => 'dicomDeviceName',
+    '1.2.840.10008.15.0.3.2' => 'dicomDescription',
+    '1.2.840.10008.15.0.3.3' => 'dicomManufacturer',
+    '1.2.840.10008.15.0.3.4' => 'dicomManufacturerModelName',
+    '1.2.840.10008.15.0.3.5' => 'dicomSoftwareVersion',
+    '1.2.840.10008.15.0.3.6' => 'dicomVendorData',
+    '1.2.840.10008.15.0.3.7' => 'dicomAETitle',
+    '1.2.840.10008.15.0.3.8' => 'dicomNetworkConnectionReference',
+    '1.2.840.10008.15.0.3.9' => 'dicomApplicationCluster',
+    '1.2.840.10008.15.0.3.10' => 'dicomAssociationInitiator',
+    '1.2.840.10008.15.0.3.11' => 'dicomAssociationAcceptor',
+    '1.2.840.10008.15.0.3.12' => 'dicomHostname',
+    '1.2.840.10008.15.0.3.13' => 'dicomPort',
+    '1.2.840.10008.15.0.3.14' => 'dicomSOPClass',
+    '1.2.840.10008.15.0.3.15' => 'dicomTransferRole',
+    '1.2.840.10008.15.0.3.16' => 'dicomTransferSyntax',
+    '1.2.840.10008.15.0.3.17' => 'dicomPrimaryDeviceType',
+    '1.2.840.10008.15.0.3.18' => 'dicomRelatedDeviceReference',
+    '1.2.840.10008.15.0.3.19' => 'dicomPreferredCalledAETitle',
+    '1.2.840.10008.15.0.3.20' => 'dicomTLSCyphersuite',
+    '1.2.840.10008.15.0.3.21' => 'dicomAuthorizedNodeCertificateReference',
+    '1.2.840.10008.15.0.3.22' => 'dicomThisNodeCertificateReference',
+    '1.2.840.10008.15.0.3.23' => 'dicomInstalled',
+    '1.2.840.10008.15.0.3.24' => 'dicomStationName',
+    '1.2.840.10008.15.0.3.25' => 'dicomDeviceSerialNumber',
+    '1.2.840.10008.15.0.3.26' => 'dicomInstitutionName',
+    '1.2.840.10008.15.0.3.27' => 'dicomInstitutionAddress',
+    '1.2.840.10008.15.0.3.28' => 'dicomInstitutionDepartmentName',
+    '1.2.840.10008.15.0.3.29' => 'dicomIssuerOfPatientID',
+    '1.2.840.10008.15.0.3.30' => 'dicomPreferredCallingAETitle',
+    '1.2.840.10008.15.0.3.31' => 'dicomSupportedCharacterSet',
+    '1.2.840.10008.15.0.4.1' => 'dicomConfigurationRoot',
+    '1.2.840.10008.15.0.4.2' => 'dicomDevicesRoot',
+    '1.2.840.10008.15.0.4.3' => 'dicomUniqueAETitlesRegistryRoot',
+    '1.2.840.10008.15.0.4.4' => 'dicomDevice',
+    '1.2.840.10008.15.0.4.5' => 'dicomNetworkAE',
+    '1.2.840.10008.15.0.4.6' => 'dicomNetworkConnection',
+    '1.2.840.10008.15.0.4.7' => 'dicomUniqueAETitle',
+    '1.2.840.10008.15.0.4.8' => 'dicomTransferCapability',
+);
+
+#------------------------------------------------------------------------------
+# Extract information from a DICOM (DCM) image
+# Inputs: 0) ExifTool object reference, 1) DirInfo reference
+# Returns: 1 on success, 0 if this wasn't a valid DICOM file
+sub ProcessDICM($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my $unknown = $exifTool->Options('Unknown');
+    my $verbose = $exifTool->Options('Verbose');
+    my ($hdr, $buff, $implicit, $vr, $len);
+#
+# identify the DICOM or ACR-NEMA file
+#
+    $raf->Read($hdr, 12) == 12 or return 0; # save for ACR identification later
+    $raf->Seek(128, 0) or return 0;         # skip to end of DICM header
+    $raf->Read($buff, 4) == 4 or return 0;  # read signature
+    if ($buff eq 'DICM') {
+        # file meta information transfer syntax is explicit little endian
+        SetByteOrder('II');
+        $exifTool->SetFileType('DICOM');
+    } else {
+        # test for a RAW DCM image (ACR-NEMA format, ie. no header)
+        foreach ('II','MM','') {
+            return 0 unless $_; # no luck identifying the syntax
+            SetByteOrder($_);
+            my $g = Get16u(\$hdr, 0);
+            # expect group number to be small and even
+            next if $g < 2 or $g > 8 or $g & 0x01;
+            my $e = Get16u(\$hdr, 2);
+            next if $e > 0x20;          # expect a low element number at start
+            $vr = substr($hdr, 4, 2);   # look for explicit VR
+            if ($vr =~ /^[A-Z]{2}$/) {
+                $implicit = 0;
+                if ($vr32{$vr}) {
+                    next unless Get16u(\$hdr, 6) == 0;  # must be 2 zero bytes
+                    $len = Get32u(\$hdr, 8);
+                } else {
+                    next if $e == 0 and $vr ne 'UL';    # group length must be UL
+                    $len = Get16u(\$hdr, 6);
+                }
+            } else {
+                $implicit = 1;
+                $len = Get32u(\$hdr, 4);
+            }
+            next if $e == 0 and $len != 4;  # group length value must be 4 bytes
+            next if $len > 64;      # first element shouldn't be too long
+            last;   # success!
+        }
+        $raf->Seek(0, 0) or return 0;   # rewind to start of file
+        $exifTool->SetFileType('ACR');
+    }
+#
+# process the meta information
+#
+    my $tagTablePtr = GetTagTable('Image::ExifTool::DICOM::Main');
+    my $pos = $raf->Tell();
+    my $err = 1;
+    my ($transferSyntax, $group2end);
+    for (;;) {
+        $raf->Read($buff, 8) == 8 or $err = 0, last;
+        $pos += 8;
+        my $group = Get16u(\$buff, 0);
+        # implement the transfer syntax at the end of the group 2 data
+        if ($transferSyntax and ($group != 0x0002 or
+            ($group2end and $pos > $group2end)))
+        {
+            # 1.2.840.10008.1.2   = implicit VR little endian
+            # 1.2.840.10008.1.2.2 = explicit VR big endian
+            # 1.2.840.10008.1.2.x = explicit VR little endian
+            # 1.2.840.10008.1.2.1.99 = deflated
+            unless ($transferSyntax =~ /^1\.2\.840\.10008\.1\.2(\.\d+)?(\.\d+)?/) {
+                $exifTool->Warn("Unrecognized transfer syntax $transferSyntax");
+                last;
+            }
+            if (not $1) {
+                $implicit = 1;
+            } elsif ($1 eq '.2') {
+                SetByteOrder('MM');
+                $group = Get16u(\$buff, 0); # must get group again
+            } elsif ($1 eq '.1' and $2 and $2 eq '.99') {
+                # inflate compressed data stream
+                if (eval 'require Compress::Zlib') {
+                    # must use undocumented zlib feature to disable zlib header information
+                    # because DICOM deflated data doesn't have the zlib header (ref 3)
+                    my $wbits = -Compress::Zlib::MAX_WBITS();
+                    my $inflate = Compress::Zlib::inflateInit(-WindowBits => $wbits);
+                    if ($inflate) {
+                        $raf->Seek(-8, 1) or last;
+                        my $data = '';
+                        while ($raf->Read($buff, 65536)) {
+                            my ($buf, $stat) = $inflate->inflate($buff);
+                            if ($stat == Compress::Zlib::Z_OK() or
+                                $stat == Compress::Zlib::Z_STREAM_END())
+                            {
+                                $data .= $buf;
+                                last if $stat == Compress::Zlib::Z_STREAM_END();
+                            } else {
+                                $exifTool->Warn('Error inflating compressed data stream');
+                                return 1;
+                            }
+                        }
+                        last if length $data < 8;
+                        # create new RAF object from inflated data stream
+                        $raf = new File::RandomAccess(\$data);
+                        # re-read start of stream (now decompressed)
+                        $raf->Read($buff, 8) == 8 or last;
+                        $group = Get16u(\$buff, 0);
+                    } else {
+                        $exifTool->Warn('Error initializing inflation');
+                        return 1;
+                    }
+                } else {
+                    $exifTool->Warn('Install Compress::Zlib to decode compressed data stream');
+                    return 1;
+                }
+            }
+            undef $transferSyntax;
+        }
+        my $element = Get16u(\$buff,2);
+        my $tag = sprintf('%.4X,%.4X', $group, $element);
+
+        if ($implicit or $implicitVR{$tag}) {
+            # treat everything as string if implicit VR because it
+            # isn't worth it to generate the necessary VR lookup tables
+            # for the thousands of defined data elements
+            $vr = '';       # no VR (treat everything as string)
+            $len = Get32u(\$buff, 4);
+        } else {
+            $vr = substr($buff,4,2);
+            last unless $vr =~ /^[A-Z]{2}$/;
+            if ($vr32{$vr}) {
+                $raf->Read($buff, 4) == 4 or last;
+                $pos += 4;
+                $len = Get32u(\$buff, 0);
+                $len = 0 if $vr eq 'SQ';    # just recurse into sequences
+            } else {
+                $len = Get16u(\$buff, 6);
+            }
+        }
+        if ($len == 0xffffffff) {
+            $len = 0;   # don't read value if undefined length
+            if ($verbose) {
+                # start list of items in verbose output
+                $exifTool->VPrint(0, "$exifTool->{INDENT}+ [List of items]\n");
+                $exifTool->{INDENT} .= '| ';
+            }
+        }
+        # read the element value
+        if ($len) {
+            $raf->Read($buff, $len) == $len or last;
+            $pos += $len;
+        } else {
+            $buff = '';
+        }
+
+        # handle tags not found in the table
+        my $tagInfo = $$tagTablePtr{$tag};
+        unless ($tagInfo) {
+            # accept tag ID's with "x" for a wildcard in the following patterns:
+            # '60xx,1203', '0020,31xx', '0028,04x2', '1000,xxx0', '1010,xxxx'
+            my $xx;
+            if ((($xx = $tag) =~ s/^(..)../$1xx/  and $$tagTablePtr{$xx}) or
+                (($xx = $tag) =~ s/..$/xx/        and $$tagTablePtr{$xx}) or
+                (($xx = $tag) =~ s/.(.)$/x$1/     and $$tagTablePtr{$xx}) or
+                (($xx = $tag) =~ s/...(.)$/xxx$1/ and $$tagTablePtr{$xx}) or
+                (($xx = $tag) =~ s/....$/xxxx/    and $$tagTablePtr{$xx}))
+            {
+                $tag = $xx;
+                $tagInfo = $$tagTablePtr{$xx};
+            } elsif ($unknown) {
+                # create tag info hash for unknown elements
+                if ($element == 0) {    # element zero is group length
+                    $tagInfo = {
+                        Name => sprintf("Group%.4X_Length", $group),
+                        Description => sprintf("Group %.4X Length", $group),
+                    };
+                } else {
+                    $tagInfo = {
+                        Name => sprintf("DICOM_%.4X_%.4X", $group, $element),
+                        Description => sprintf("DICOM %.4X,%.4X", $group, $element),
+                    };
+                }
+                $$tagInfo{Unknown} = 1;
+                Image::ExifTool::AddTagToTable($tagTablePtr, $tag, $tagInfo);
+            }
+        }
+        # get VR from our tag information if implicit
+        $vr = $$tagInfo{VR} || '  ' if $tagInfo and not $vr;
+
+        if ($element == 0) {
+            $vr = 'UL'; # group length element is always unsigned long
+        }
+        my $val;
+        my $format = $dicomFormat{$vr};
+        if ($len > 1024) {
+            # treat large data elements as binary data
+            my $binData;
+            if ($exifTool->Options('Binary') or ($tagInfo and
+                $exifTool->{REQ_TAG_LOOKUP}->{lc($$tagInfo{Name})}))
+            {
+                $binData = $buff;   # must make a copy
+            } else {
+                $binData = "Binary data $len bytes";
+            }
+            $val = \$binData;
+        } elsif ($format) {
+            $val = ReadValue(\$buff, 0, $format, undef, $len);
+        } else {
+            $val = $buff;
+            $format = 'string';
+            if ($vr eq 'DA') {
+                # format date values
+                $val =~ s/^(\d{4})(\d{2})(\d{2})/$1:$2:$3/;
+            } elsif ($vr eq 'TM') {
+                # format time values
+                $val =~ s/^(\d{2})(\d{2})(\d{2}.*)/$1:$2:$3/;
+            } elsif ($vr eq 'DT') {
+                # format date/time values
+                $val =~ s/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2}.*)/$1:$2:$3 $4:$5:$6/;
+            } elsif ($vr eq 'AT' and $len == 4) {
+                # convert attribute tag ID to hex format
+                my ($g, $e) = (Get16u(\$buff,0), Get16u(\$buff,2));
+                $val = sprintf('%.4X,%.4X', $g, $e);
+            } elsif ($vr eq 'UI') {
+                # add PrintConv to translate registered UID's
+                $val =~ s/\0.*//; # truncate at null
+                $$tagInfo{PrintConv} = \%uid if $uid{$val} and $tagInfo;
+            }
+        }
+        # save the group 2 end position and transfer syntax
+        if ($group == 0x0002) {
+            $element == 0x0000 and $group2end = $pos + $val;
+            $element == 0x0010 and $transferSyntax = $val;
+        }
+
+        # handle the new tag information
+        $exifTool->HandleTag($tagTablePtr, $tag, $val,
+            DataPt => \$buff,
+            DataPos => $pos - $len,
+            Format => $format,
+            Start => 0,
+            Size => $len,
+            Extra => " ($vr)",
+        );
+
+        # stop indenting for list if we reached EndOfItems tag
+        $exifTool->{INDENT} =~ s/..$// if $verbose and $tag eq 'FFFE,E00D';
+    }
+    $err and $exifTool->Warn('Error reading DICOM file (corrupted?)');
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::DICOM - Read DICOM and ACR-NEMA medical images
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains routines required by Image::ExifTool to extract meta
+information from DICOM (Digital Imaging and Communications in Medicine) DCM
+and ACR-NEMA (American College of Radiology - National Electrical
+Manufacturer's Association) ACR medical images.
+
+=head1 NOTES
+
+Images compressed using the DICOM deflated transfer syntax will be decoded
+if Compress::Zlib is installed.
+
+No translation of special characters sets is done.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://medical.nema.org/>
+
+=item L<http://www.sph.sc.edu/comd/rorden/dicom.html>
+
+=item L<http://www.dclunie.com/>
+
+=item L<http://www.gehealthcare.com/usen/interoperability/dicom/docs/2258357r3.pdf>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/DICOM Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/DNG.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/DNG.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/DNG.pm	(revision 24799)
@@ -0,0 +1,832 @@
+#------------------------------------------------------------------------------
+# File:         DNG.pm
+#
+# Description:  Read DNG-specific information
+#
+# Revisions:    01/09/2006 - P. Harvey Created
+#
+# References:   1) http://www.adobe.com/products/dng/
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::DNG;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::Exif;
+use Image::ExifTool::MakerNotes;
+use Image::ExifTool::CanonRaw;
+
+$VERSION = '1.15';
+
+sub ProcessOriginalRaw($$$);
+sub ProcessAdobeData($$$);
+sub ProcessAdobeMakN($$$);
+sub ProcessAdobeCRW($$$);
+sub ProcessAdobeRAF($$$);
+sub ProcessAdobeMRW($$$);
+sub ProcessAdobeSR2($$$);
+sub ProcessAdobeIFD($$$);
+sub WriteAdobeStuff($$$);
+
+# data in OriginalRawFileData
+%Image::ExifTool::DNG::OriginalRaw = (
+    GROUPS => { 2 => 'Image' },
+    PROCESS_PROC => \&ProcessOriginalRaw,
+    NOTES => q{
+        This table defines tags extracted from the DNG OriginalRawFileData
+        information.
+    },
+    0 => { Name => 'OriginalRawImage',    Binary => 1 },
+    1 => { Name => 'OriginalRawResource', Binary => 1 },
+    2 => 'OriginalRawFileType',
+    3 => 'OriginalRawCreator',
+    4 => { Name => 'OriginalTHMImage',    Binary => 1 },
+    5 => { Name => 'OriginalTHMResource', Binary => 1 },
+    6 => 'OriginalTHMFileType',
+    7 => 'OriginalTHMCreator',
+);
+
+%Image::ExifTool::DNG::AdobeData = ( #PH
+    GROUPS => { 0 => 'MakerNotes', 1 => 'Adobe', 2 => 'Image' },
+    PROCESS_PROC => \&ProcessAdobeData,
+    WRITE_PROC => \&WriteAdobeStuff,
+    NOTES => q{
+        This information is found in the "Adobe" DNGPrivateData.
+
+        The maker notes ('MakN') are processed by ExifTool, but some information may
+        have been lost by the Adobe DNG Converter.  This is because the Adobe DNG
+        Converter (as of version 6.3) doesn't properly handle information referenced
+        from inside the maker notes that lies outside the original maker notes
+        block.  This information is lost when only the maker note block is copied to
+        the DNG image.   While this doesn't effect all makes of cameras, it is a
+        problem for some major brands such as Olympus and Sony.
+
+        Other entries in this table represent proprietary information that is
+        extracted from the original RAW image and restructured to a different (but
+        still proprietary) Adobe format.
+    },
+    MakN  => [ ],   # (filled in later)
+   'CRW ' => {
+        Name => 'AdobeCRW',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::CanonRaw::Main',
+            ProcessProc => \&ProcessAdobeCRW,
+            WriteProc => \&WriteAdobeStuff,
+        },
+    },
+   'MRW ' => {
+        Name => 'AdobeMRW',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::MinoltaRaw::Main',
+            ProcessProc => \&ProcessAdobeMRW,
+            WriteProc => \&WriteAdobeStuff,
+        },
+    },
+   'SR2 ' => {
+        Name => 'AdobeSR2',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Sony::SR2Private',
+            ProcessProc => \&ProcessAdobeSR2,
+        },
+    },
+   'RAF ' => {
+        Name => 'AdobeRAF',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::FujiFilm::RAF',
+            ProcessProc => \&ProcessAdobeRAF,
+        },
+    },
+    'Pano' => {
+        Name => 'AdobePano',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::PanasonicRaw::Main',
+            ProcessProc => \&ProcessAdobeIFD,
+        },
+    },
+    'Koda' => {
+        Name => 'AdobeKoda',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::IFD',
+            ProcessProc => \&ProcessAdobeIFD,
+        },
+    },
+    'Leaf' => {
+        Name => 'AdobeLeaf',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Leaf::SubIFD',
+            ProcessProc => \&ProcessAdobeIFD,
+        },
+    },
+);
+
+# fill in maker notes
+{
+    my $tagInfo;
+    my $list = $Image::ExifTool::DNG::AdobeData{MakN};
+    foreach $tagInfo (@Image::ExifTool::MakerNotes::Main) {
+        unless (ref $tagInfo eq 'HASH') {
+            push @$list, $tagInfo;
+            next;
+        }
+        my %copy = %$tagInfo;
+        delete $copy{Groups};
+        delete $copy{GotGroups};
+        delete $copy{Table};
+        push @$list, \%copy;
+    }
+}
+
+#------------------------------------------------------------------------------
+# Process DNG OriginalRawFileData information
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success, otherwise returns 0 and sets a Warning
+sub ProcessOriginalRaw($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $start = $$dirInfo{DirStart};
+    my $end = $start + $$dirInfo{DirLen};
+    my $pos = $start;
+    my ($index, $err);
+
+    SetByteOrder('MM'); # pointers are always big-endian in this structure
+    for ($index=0; $index<8; ++$index) {
+        last if $pos + 4 > $end;
+        my $val = Get32u($dataPt, $pos);
+        $val or $pos += 4, next; # ignore zero values
+        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $index);
+        $tagInfo or $err = "Missing DNG tag $index", last;
+        if ($index & 0x02) {
+            # extract a simple file type (tags 2, 3, 6 and 7)
+            $val = substr($$dataPt, $pos, 4);
+            $pos += 4;
+        } else {
+            # extract a compressed data block (tags 0, 1, 4 and 5)
+            my $n = int(($val + 65535) / 65536);
+            my $hdrLen = 4 * ($n + 2);
+            $pos + $hdrLen > $end and $err = '', last;
+            my $tag = $$tagInfo{Name};
+            # only extract this information if requested (because it takes time)
+            if ($exifTool->{OPTIONS}->{Binary} or
+                $exifTool->{REQ_TAG_LOOKUP}->{lc($tag)})
+            {
+                unless (eval 'require Compress::Zlib') {
+                    $err = 'Install Compress::Zlib to extract compressed images';
+                    last;
+                }
+                my $i;
+                $val = '';
+                my $p2 = $pos + Get32u($dataPt, $pos + 4);
+                for ($i=0; $i<$n; ++$i) {
+                    # inflate this compressed block
+                    my $p1 = $p2;
+                    $p2 = $pos + Get32u($dataPt, $pos + ($i + 2) * 4);
+                    if ($p1 >= $p2 or $p2 > $end) {
+                        $err = 'Bad compressed RAW image';
+                        last;
+                    }
+                    my $buff = substr($$dataPt, $p1, $p2 - $p1);
+                    my ($v2, $stat);
+                    my $inflate = Compress::Zlib::inflateInit();
+                    $inflate and ($v2, $stat) = $inflate->inflate($buff);
+                    if ($inflate and $stat == Compress::Zlib::Z_STREAM_END()) {
+                        $val .= $v2;
+                    } else {
+                        $err = 'Error inflating compressed RAW image';
+                        last;
+                    }
+                }
+                $pos = $p2;
+            } else {
+                $pos + $hdrLen > $end and $err = '', last;
+                my $len = Get32u($dataPt, $pos + $hdrLen - 4);
+                $pos + $len > $end and $err = '', last;
+                $val = substr($$dataPt, $pos + $hdrLen, $len - $hdrLen);
+                $val = "Binary data $len bytes";
+                $pos += $len;   # skip over this block
+            }
+        }
+        $exifTool->FoundTag($tagInfo, $val);
+    }
+    $exifTool->Warn($err || 'Bad OriginalRawFileData') if defined $err;
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Process Adobe DNGPrivateData directory
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessAdobeData($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dataPos = $$dirInfo{DataPos};
+    my $pos = $$dirInfo{DirStart};
+    my $end = $$dirInfo{DirLen} + $pos;
+    my $outfile = $$dirInfo{OutFile};
+    my $verbose = $exifTool->Options('Verbose');
+    my $htmlDump = $exifTool->Options('HtmlDump');
+
+    return 0 unless $$dataPt =~ /^Adobe\0/;
+    unless ($outfile) {
+        $exifTool->VerboseDir($dirInfo);
+        # don't parse makernotes if FastScan > 1
+        my $fast = $exifTool->Options('FastScan');
+        return 1 if $fast and $fast > 1;
+    }
+    $htmlDump and $exifTool->HDump($dataPos, 6, 'Adobe DNGPrivateData header');
+    SetByteOrder('MM'); # always big endian
+    $pos += 6;
+    while ($pos + 8 <= $end) {
+        my ($tag, $size) = unpack("x${pos}a4N", $$dataPt);
+        $pos += 8;
+        last if $pos + $size > $end;
+        my $tagInfo = $$tagTablePtr{$tag};
+        if ($htmlDump) {
+            my $name = "Adobe$tag";
+            $name =~ tr/ //d;
+            $exifTool->HDump($dataPos + $pos - 8, 8, "$name header", "Data Size: $size bytes");
+            # dump non-EXIF format data
+            unless ($tag =~ /^(MakN|SR2 )$/) {
+                $exifTool->HDump($dataPos + $pos, $size, "$name data");
+            }
+        }
+        if ($verbose and not $outfile) {
+            $tagInfo or $exifTool->VPrint(0, "$$exifTool{INDENT}Unsupported DNGAdobeData record: ($tag)\n");
+            $exifTool->VerboseInfo($tag,
+                ref $tagInfo eq 'HASH' ? $tagInfo : undef,
+                DataPt => $dataPt,
+                DataPos => $dataPos,
+                Start => $pos,
+                Size => $size,
+            );
+        }
+        my $value;
+        while ($tagInfo) {
+            my ($subTable, $subName, $processProc);
+            if (ref $tagInfo eq 'HASH') {
+                unless ($$tagInfo{SubDirectory}) {
+                    if ($outfile) {
+                        # copy value across to outfile
+                        $value = substr($$dataPt, $pos, $size);
+                    } else {
+                        $exifTool->HandleTag($tagTablePtr, $tag, substr($$dataPt, $pos, $size));
+                    }
+                    last;
+                }
+                $subTable = GetTagTable($tagInfo->{SubDirectory}->{TagTable});
+                $subName = $$tagInfo{Name};
+                $processProc = $tagInfo->{SubDirectory}->{ProcessProc};
+            } else {
+                $subTable = $tagTablePtr;
+                $subName = 'AdobeMakN';
+                $processProc = \&ProcessAdobeMakN;
+            }
+            my %dirInfo = (
+                Base     => $$dirInfo{Base},
+                DataPt   => $dataPt,
+                DataPos  => $dataPos,
+                DataLen  => $$dirInfo{DataLen},
+                DirStart => $pos,
+                DirLen   => $size,
+                DirName  => $subName,
+            );
+            if ($outfile) {
+                $dirInfo{Proc} = $processProc;  # WriteAdobeStuff() calls this to do the actual writing
+                $value = $exifTool->WriteDirectory(\%dirInfo, $subTable, \&WriteAdobeStuff);
+                # use old directory if an error occurred
+                defined $value or $value = substr($$dataPt, $pos, $size);
+            } else {
+                # override process proc for MakN
+                $exifTool->ProcessDirectory(\%dirInfo, $subTable, $processProc);
+            }
+            last;
+        }
+        if (defined $value and length $value) {
+            # add "Adobe" header if necessary
+            $$outfile = "Adobe\0" unless $$outfile and length $$outfile;
+            $$outfile .= $tag . pack('N', length $value) . $value;
+            $$outfile .= "\0" if length($value) & 0x01; # pad if necessary
+        }
+        $pos += $size;
+        ++$pos if $size & 0x01; # (darn padding)
+    }
+    $pos == $end or $exifTool->Warn("$pos $end Adobe private data is corrupt");
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Process Adobe CRW directory
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success, otherwise returns 0 and sets a Warning
+# Notes: data has 4 byte header (2 for byte order and 2 for entry count)
+# - this routine would be as simple as ProcessAdobeMRW() below if Adobe hadn't
+#   pulled the bonehead move of reformatting the CRW information
+sub ProcessAdobeCRW($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $start = $$dirInfo{DirStart};
+    my $end = $start + $$dirInfo{DirLen};
+    my $verbose = $exifTool->Options('Verbose');
+    my $buildMakerNotes = $exifTool->Options('MakerNotes');
+    my $outfile = $$dirInfo{OutFile};
+    my ($newTags, $oldChanged);
+
+    SetByteOrder('MM'); # always big endian
+    return 0 if $$dirInfo{DirLen} < 4;
+    my $byteOrder = substr($$dataPt, $start, 2);
+    return 0 unless $byteOrder =~ /^(II|MM)$/;
+
+    # initialize maker note data if building maker notes
+    $buildMakerNotes and Image::ExifTool::CanonRaw::InitMakerNotes($exifTool);
+
+    my $entries = Get16u($dataPt, $start + 2);
+    my $pos = $start + 4;
+    $exifTool->VerboseDir($dirInfo, $entries) unless $outfile;
+    if ($outfile) {
+        # get hash of new tags
+        $newTags = $exifTool->GetNewTagInfoHash($tagTablePtr);
+        $$outfile = substr($$dataPt, $start, 4);
+        $oldChanged = $exifTool->{CHANGED};
+    }
+    # loop through entries in Adobe CRW information
+    my $index;
+    for ($index=0; $index<$entries; ++$index) {
+        last if $pos + 6 > $end;
+        my $tag = Get16u($dataPt, $pos);
+        my $size = Get32u($dataPt, $pos + 2);
+        $pos += 6;
+        last if $pos + $size > $end;
+        my $value = substr($$dataPt, $pos, $size);
+        my $tagID = $tag & 0x3fff;
+        my $tagType = ($tag >> 8) & 0x38;   # get tag type
+        my $format = $Image::ExifTool::CanonRaw::crwTagFormat{$tagType};
+        my $count;
+        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tagID, \$value);
+        if ($tagInfo) {
+            $format = $$tagInfo{Format} if $$tagInfo{Format};
+            $count = $$tagInfo{Count};
+        }
+        # set count to 1 by default for values that were in the directory entry
+        if (not defined $count and $tag & 0x4000 and $format and $format ne 'string') {
+            $count = 1;
+        }
+        # set count from tagInfo count if necessary
+        if ($format and not $count) {
+            # set count according to format and size
+            my $fnum = $Image::ExifTool::Exif::formatNumber{$format};
+            my $fsiz = $Image::ExifTool::Exif::formatSize[$fnum];
+            $count = int($size / $fsiz);
+        }
+        $format or $format = 'undef';
+        SetByteOrder($byteOrder);
+        my $val = ReadValue(\$value, 0, $format, $count, $size);
+        if ($outfile) {
+            if ($tagInfo) {
+                my $subdir = $$tagInfo{SubDirectory};
+                if ($subdir and $$subdir{TagTable}) {
+                    my $name = $$tagInfo{Name};
+                    my $newTagTable = GetTagTable($$subdir{TagTable});
+                    return 0 unless $newTagTable;
+                    my $subdirStart = 0;
+                    #### eval Start ()
+                    $subdirStart = eval $$subdir{Start} if $$subdir{Start};
+                    my $dirData = \$value;
+                    my %subdirInfo = (
+                        Name     => $name,
+                        DataPt   => $dirData,
+                        DataLen  => $size,
+                        DirStart => $subdirStart,
+                        DirLen   => $size - $subdirStart,
+                        Parent   => $$dirInfo{DirName},
+                    );
+                    #### eval Validate ($dirData, $subdirStart, $size)
+                    if (defined $$subdir{Validate} and not eval $$subdir{Validate}) {
+                        $exifTool->Warn("Invalid $name data");
+                    } else {
+                        $subdir = $exifTool->WriteDirectory(\%subdirInfo, $newTagTable);
+                        if (defined $subdir and length $subdir) {
+                            if ($subdirStart) {
+                                # add header before data directory
+                                $value = substr($value, 0, $subdirStart) . $subdir;
+                            } else {
+                                $value = $subdir;
+                            }
+                        }
+                    }
+                } elsif ($$newTags{$tagID}) {
+                    my $nvHash = $exifTool->GetNewValueHash($tagInfo);
+                    if (Image::ExifTool::IsOverwriting($nvHash, $val)) {
+                        my $newVal = Image::ExifTool::GetNewValues($nvHash);
+                        my $verboseVal;
+                        $verboseVal = $newVal if $verbose > 1;
+                        # convert to specified format if necessary
+                        if (defined $newVal and $format) {
+                            $newVal = WriteValue($newVal, $format, $count);
+                        }
+                        if (defined $newVal) {
+                            $exifTool->VerboseValue("- CanonRaw:$$tagInfo{Name}", $value);
+                            $exifTool->VerboseValue("+ CanonRaw:$$tagInfo{Name}", $verboseVal);
+                            $value = $newVal;
+                            ++$exifTool->{CHANGED};
+                        }
+                    }
+                }
+            }
+            # write out new value (always big-endian)
+            SetByteOrder('MM');
+            # (verified that there is no padding here)
+            $$outfile .= Set16u($tag) . Set32u(length($value)) . $value;
+        } else {
+            $exifTool->HandleTag($tagTablePtr, $tagID, $val,
+                Index   => $index,
+                DataPt  => $dataPt,
+                DataPos => $$dirInfo{DataPos},
+                Start   => $pos,
+                Size    => $size,
+                TagInfo => $tagInfo,
+            );
+            if ($buildMakerNotes) {
+                # build maker notes information if requested
+                Image::ExifTool::CanonRaw::BuildMakerNotes($exifTool, $tagID, $tagInfo,
+                                                           \$value, $format, $count);
+            }
+        }
+        # (we lost the directory structure, but the second tag 0x0805
+        # should be in the ImageDescription directory)
+        $exifTool->{DIR_NAME} = 'ImageDescription' if $tagID == 0x0805;
+        SetByteOrder('MM');
+        $pos += $size;
+    }
+    if ($outfile and (not defined $$outfile or $index != $entries or
+        $exifTool->{CHANGED} ==  $oldChanged))
+    {
+        $exifTool->{CHANGED} = $oldChanged; # nothing changed
+        undef $$outfile;    # rewrite old directory
+    }
+    if ($index != $entries) {
+        $exifTool->Warn('Truncated CRW notes');
+    } elsif ($pos < $end) {
+        $exifTool->Warn($end-$pos . ' extra bytes at end of CRW notes');
+    }
+    # finish building maker notes if necessary
+    if ($buildMakerNotes) {
+        SetByteOrder($byteOrder);
+        Image::ExifTool::CanonRaw::SaveMakerNotes($exifTool);
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Process Adobe MRW directory
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success, otherwise returns 0 and sets a Warning
+# Notes: data has 4 byte header (2 for byte order and 2 for entry count)
+sub ProcessAdobeMRW($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dirLen = $$dirInfo{DirLen};
+    my $dirStart = $$dirInfo{DirStart};
+    my $outfile = $$dirInfo{OutFile};
+
+    # construct fake MRW file
+    my $buff = "\0MRM" . pack('N', $dirLen - 4);
+    # ignore leading byte order and directory count words
+    $buff .= substr($$dataPt, $dirStart + 4, $dirLen - 4);
+    my $raf = new File::RandomAccess(\$buff);
+    my %dirInfo = ( RAF => $raf, OutFile => $outfile );
+    my $rtnVal = Image::ExifTool::MinoltaRaw::ProcessMRW($exifTool, \%dirInfo);
+    if ($outfile and defined $$outfile and length $$outfile) {
+        # remove MRW header and add Adobe header
+        $$outfile = substr($$dataPt, $dirStart, 4) . substr($$outfile, 8);
+    }
+    return $rtnVal;
+}
+
+#------------------------------------------------------------------------------
+# Process Adobe RAF directory
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success, otherwise returns 0 and sets a Warning
+sub ProcessAdobeRAF($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    return 0 if $$dirInfo{OutFile}; # (can't write this yet)
+    my $dataPt = $$dirInfo{DataPt};
+    my $pos = $$dirInfo{DirStart};
+    my $dirEnd = $$dirInfo{DirLen} + $pos;
+    my ($readIt, $warn);
+
+    # set byte order according to first 2 bytes of Adobe RAF data
+    if ($pos + 2 <= $dirEnd and SetByteOrder(substr($$dataPt, $pos, 2))) {
+        $pos += 2;
+    } else {
+        $exifTool->Warn('Invalid DNG RAF data');
+        return 0;
+    }
+    $exifTool->VerboseDir($dirInfo);
+    # make fake RAF object for processing (same acronym, different meaning)
+    my $raf = new File::RandomAccess($dataPt);
+    my $num = '';
+    # loop through all records in Adobe RAF data:
+    # 0 - RAF table (not processed)
+    # 1 - first RAF directory
+    # 2 - second RAF directory (if available)
+    for (;;) {
+        last if $pos + 4 > $dirEnd;
+        my $len = Get32u($dataPt, $pos);
+        $pos += 4 + $len;   # step to next entry in Adobe RAF record
+        $len or last;       # ends with an empty entry
+        $readIt or $readIt = 1, next;   # ignore first entry (RAF table)
+        my %dirInfo = (
+            RAF      => $raf,
+            DirStart => $pos - $len,
+        );
+        $$exifTool{SET_GROUP1} = "RAF$num";
+        $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr) or $warn = 1;
+        delete $$exifTool{SET_GROUP1};
+        $num = ($num || 1) + 1;
+    }
+    $warn and $exifTool->Warn('Possibly corrupt RAF information');
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Process Adobe SR2 directory
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success, otherwise returns 0 and sets a Warning
+# Notes: data has 6 byte header (2 for byte order and 4 for original offset)
+sub ProcessAdobeSR2($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    return 0 if $$dirInfo{OutFile}; # (can't write this yet)
+    my $dataPt = $$dirInfo{DataPt};
+    my $start = $$dirInfo{DirStart};
+    my $len = $$dirInfo{DirLen};
+
+    return 0 if $len < 6;
+    SetByteOrder('MM');
+    my $originalPos = Get32u($dataPt, $start + 2);
+    return 0 unless SetByteOrder(substr($$dataPt, $start, 2));
+
+    $exifTool->VerboseDir($dirInfo);
+    my $dataPos = $$dirInfo{DataPos};
+    my $dirStart = $start + 6;  # pointer to maker note directory
+    my $dirLen = $len - 6;
+
+    # initialize subdirectory information
+    my $fix = $dataPos + $dirStart - $originalPos;
+    my %subdirInfo = (
+        DirName   => 'AdobeSR2',
+        Base      => $$dirInfo{Base} + $fix,
+        DataPt    => $dataPt,
+        DataPos   => $dataPos - $fix,
+        DataLen   => $$dirInfo{DataLen},
+        DirStart  => $dirStart,
+        DirLen    => $dirLen,
+        Parent    => $$dirInfo{DirName},
+    );
+    if ($exifTool->Options('HtmlDump')) {
+        $exifTool->HDump($dataPos + $start, 6, 'Adobe SR2 data');
+    }
+    # parse the SR2 directory
+    $exifTool->ProcessDirectory(\%subdirInfo, $tagTablePtr);
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Process Adobe-mutilated IFD directory
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success, otherwise returns 0 and sets a Warning
+# Notes: data has 2 byte header (byte order of the data)
+sub ProcessAdobeIFD($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    return 0 if $$dirInfo{OutFile}; # (can't write this yet)
+    my $dataPt = $$dirInfo{DataPt};
+    my $pos = $$dirInfo{DirStart};
+    my $dataPos = $$dirInfo{DataPos};
+
+    return 0 if $$dirInfo{DirLen} < 4;
+    my $dataOrder = substr($$dataPt, $pos, 2);
+    return 0 unless SetByteOrder($dataOrder);   # validate byte order of data
+
+    # parse the mutilated IFD.  This is similar to a TIFF IFD, except:
+    # - data follows directly after Count entry in IFD
+    # - byte order of IFD entires is always big-endian, but byte order of data changes
+    SetByteOrder('MM');     # IFD structure is always big-endian
+    my $entries = Get16u($dataPt, $pos + 2);
+    $exifTool->VerboseDir($dirInfo, $entries);
+    $pos += 4;
+
+    my $end = $pos + $$dirInfo{DirLen};
+    my $index;
+    for ($index=0; $index<$entries; ++$index) {
+        last if $pos + 8 > $end;
+        SetByteOrder('MM'); # directory entries always big-endian (doh!)
+        my $tagID = Get16u($dataPt, $pos);
+        my $format = Get16u($dataPt, $pos+2);
+        my $count = Get32u($dataPt, $pos+4);
+        if ($format < 1 or $format > 13) {
+            # warn unless the IFD was just padded with zeros
+            $format and $exifTool->Warn(
+                sprintf("Unknown format ($format) for $$dirInfo{DirName} tag 0x%x",$tagID));
+            return 0; # must be corrupted
+        }
+        my $size = $Image::ExifTool::Exif::formatSize[$format] * $count;
+        last if $pos + 8 + $size > $end;
+        my $formatStr = $Image::ExifTool::Exif::formatName[$format];
+        SetByteOrder($dataOrder);   # data stored in native order
+        my $val = ReadValue($dataPt, $pos + 8, $formatStr, $count, $size);
+        $exifTool->HandleTag($tagTablePtr, $tagID, $val,
+            Index   => $index,
+            DataPt  => $dataPt,
+            DataPos => $dataPos,
+            Start   => $pos + 8,
+            Size    => $size
+        );
+        $pos += 8 + $size;
+    }
+    if ($index < $entries) {
+        $exifTool->Warn("Truncated $$dirInfo{DirName} directory");
+        return 0;
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Process Adobe MakerNotes directory
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success, otherwise returns 0 and sets a Warning
+# Notes: data has 6 byte header (2 for byte order and 4 for original offset)
+sub ProcessAdobeMakN($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $start = $$dirInfo{DirStart};
+    my $len = $$dirInfo{DirLen};
+    my $outfile = $$dirInfo{OutFile};
+
+    return 0 if $len < 6;
+    SetByteOrder('MM');
+    my $originalPos = Get32u($dataPt, $start + 2);
+    return 0 unless SetByteOrder(substr($$dataPt, $start, 2));
+
+    $exifTool->VerboseDir($dirInfo) unless $outfile;
+    my $dataPos = $$dirInfo{DataPos};
+    my $dirStart = $start + 6;  # pointer to maker note directory
+    my $dirLen = $len - 6;
+
+    my $hdr = substr($$dataPt, $dirStart, $dirLen < 48 ? $dirLen : 48);
+    my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, 'MakN', \$hdr);
+    return 0 unless $tagInfo and $$tagInfo{SubDirectory};
+    my $subdir = $$tagInfo{SubDirectory};
+    my $subTable = GetTagTable($$subdir{TagTable});
+    # initialize subdirectory information
+    my %subdirInfo = (
+        DirName   => 'MakerNotes',
+        Name      => $$tagInfo{Name},   # needed for maker notes verbose dump
+        Base      => $$dirInfo{Base},
+        DataPt    => $dataPt,
+        DataPos   => $dataPos,
+        DataLen   => $$dirInfo{DataLen},
+        DirStart  => $dirStart,
+        DirLen    => $dirLen,
+        TagInfo   => $tagInfo,
+        FixBase   => $$subdir{FixBase},
+        EntryBased=> $$subdir{EntryBased},
+        Parent    => $$dirInfo{DirName},
+    );
+    # look for start of maker notes IFD
+    my $loc = Image::ExifTool::MakerNotes::LocateIFD($exifTool,\%subdirInfo);
+    unless (defined $loc) {
+        $exifTool->Warn('Maker notes could not be parsed');
+        return 0;
+    }
+    if ($exifTool->Options('HtmlDump')) {
+        $exifTool->HDump($dataPos + $start, 6, 'Adobe MakN data');
+        $exifTool->HDump($dataPos + $dirStart, $loc, "$$tagInfo{Name} header") if $loc;
+    }
+
+    my $fix = 0;
+    unless ($$subdir{Base}) {
+        # adjust base offset for current maker note position
+        $fix = $dataPos + $dirStart - $originalPos;
+        $subdirInfo{Base} += $fix;
+        $subdirInfo{DataPos} -= $fix;
+    }
+    if ($outfile) {
+        # rewrite the maker notes directory
+        my $fixup = $subdirInfo{Fixup} = new Image::ExifTool::Fixup;
+        my $oldChanged = $$exifTool{CHANGED};
+        my $buff = $exifTool->WriteDirectory(\%subdirInfo, $subTable);
+        # nothing to do if error writing directory or nothing changed
+        unless (defined $buff and $exifTool->{CHANGED} != $oldChanged) {
+            $exifTool->{CHANGED} = $oldChanged;
+            return 1;
+        }
+        # deleting maker notes if directory is empty
+        unless (length $buff) {
+            $$outfile = '';
+            return 1;
+        }
+        # apply a one-time fixup to offsets
+        if ($subdirInfo{Relative}) {
+            # shift all offsets to be relative to new base
+            my $baseShift = $dataPos + $dirStart + $$dirInfo{Base} - $subdirInfo{Base};
+            $fixup->{Shift} += $baseShift;
+        } else {
+            # shift offsets to position of original maker notes
+            $fixup->{Shift} += $originalPos;
+        }
+        # if we wrote the directory as a block the header is already included
+        $loc = 0 if $subdirInfo{BlockWrite};
+        $fixup->{Shift} += $loc;    # adjust for makernotes header
+        $fixup->ApplyFixup(\$buff); # fix up pointer offsets
+        # get copy of original Adobe header (6) and makernotes header ($loc)
+        my $header = substr($$dataPt, $start, 6 + $loc);
+        # add Adobe and makernotes headers to new directory
+        $$outfile = $header . $buff;
+    } else {
+        # parse the maker notes directory
+        $exifTool->ProcessDirectory(\%subdirInfo, $subTable, $$subdir{ProcessProc});
+        # extract maker notes as a block if specified
+        if ($exifTool->Options('MakerNotes') or
+            $exifTool->{REQ_TAG_LOOKUP}->{lc($$tagInfo{Name})})
+        {
+            my $val;
+            if ($$tagInfo{MakerNotes}) {
+                $subdirInfo{Base}     = $$dirInfo{Base} + $fix;
+                $subdirInfo{DataPos}  = $dataPos - $fix;
+                $subdirInfo{DirStart} = $dirStart;
+                $subdirInfo{DirLen}   = $dirLen;
+                # rebuild the maker notes to identify all offsets that require fixing up
+                $val = Image::ExifTool::Exif::RebuildMakerNotes($exifTool, $subTable, \%subdirInfo);
+                defined $val or $exifTool->Warn('Error rebuilding maker notes (may be corrupt)');
+            } else {
+                # extract this directory as a block if specified
+                return 1 unless $$tagInfo{Writable};
+            }
+            $val = substr($$dataPt, 20) unless defined $val;
+            $exifTool->FoundTag($tagInfo, $val);
+        }
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Write Adobe information (calls appropriate ProcessProc to do the actual work)
+# Inputs: 0) ExifTool object ref, 1) source dirInfo ref, 2) tag table ref
+# Returns: new data block (may be empty if directory is deleted) or undef on error
+sub WriteAdobeStuff($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    $exifTool or return 1;    # allow dummy access
+    my $proc = $$dirInfo{Proc} || \&ProcessAdobeData;
+    my $buff;
+    $$dirInfo{OutFile} = \$buff;
+    &$proc($exifTool, $dirInfo, $tagTablePtr) or undef $buff;
+    return $buff;
+}
+
+1; # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::DNG.pm - Read DNG-specific information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains routines required by Image::ExifTool to process
+information in DNG (Digital Negative) images.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.adobe.com/products/dng/>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/DNG Tags>,
+L<Image::ExifTool::TagNames/EXIF Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/DV.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/DV.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/DV.pm	(revision 24799)
@@ -0,0 +1,319 @@
+#------------------------------------------------------------------------------
+# File:         DV.pm
+#
+# Description:  Read DV meta information
+#
+# Revisions:    2010/12/24 - P. Harvey Created
+#
+# References:   1) http://www.ffmpeg.org/
+#               2) http://dvswitch.alioth.debian.org/wiki/DV_format/
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::DV;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.00';
+
+# DV profiles (ref 1)
+my @dvProfiles = (
+    {
+        DSF => 0,
+        VideoSType => 0x0,
+        FrameSize => 120000,
+        VideoFormat => 'IEC 61834, SMPTE-314M - 525/60 (NTSC)',
+        VideoScanType => 'Progressive',
+        Colorimetry => '4:1:1',
+        FrameRate => 30000/1001,
+        ImageHeight => 480,
+        ImageWidth => 720,
+    },{
+        DSF => 1,
+        VideoSType => 0x0,
+        FrameSize => 144000,
+        VideoFormat => 'IEC 61834 - 625/50 (PAL)',
+        VideoScanType => 'Progressive',
+        Colorimetry => '4:2:0',
+        FrameRate => 25/1,
+        ImageHeight => 576,
+        ImageWidth => 720,
+    },{
+        DSF => 1,
+        VideoSType => 0x0,
+        FrameSize => 144000,
+        VideoFormat => 'SMPTE-314M - 625/50 (PAL)',
+        VideoScanType => 'Progressive',
+        Colorimetry => '4:1:1',
+        FrameRate => 25/1,
+        ImageHeight => 576,
+        ImageWidth => 720,
+    },{
+        DSF => 0,
+        VideoSType => 0x4,
+        FrameSize => 240000,
+        VideoFormat => 'DVCPRO50: SMPTE-314M - 525/60 (NTSC) 50 Mbps',
+        VideoScanType => 'Progressive',
+        Colorimetry => '4:2:2',
+        FrameRate => 30000/1001,
+        ImageHeight => 480,
+        ImageWidth => 720,
+    },{
+        DSF => 1,
+        VideoSType => 0x4,
+        FrameSize => 288000,
+        VideoFormat => 'DVCPRO50: SMPTE-314M - 625/50 (PAL) 50 Mbps',
+        VideoScanType => 'Progressive',
+        Colorimetry => '4:2:2',
+        FrameRate => 25/1,
+        ImageHeight => 576,
+        ImageWidth => 720,
+    },{
+        DSF => 0,
+        VideoSType => 0x14,
+        FrameSize => 480000,
+        VideoFormat => 'DVCPRO HD: SMPTE-370M - 1080i60 100 Mbps',
+        VideoScanType => 'Interlaced',
+        Colorimetry => '4:2:2',
+        FrameRate => 30000/1001,
+        ImageHeight => 1080,
+        ImageWidth => 1280,
+    },{
+        DSF => 1,
+        VideoSType => 0x14,
+        FrameSize => 576000,
+        VideoFormat => 'DVCPRO HD: SMPTE-370M - 1080i50 100 Mbps',
+        VideoScanType => 'Interlaced',
+        Colorimetry => '4:2:2',
+        FrameRate => 25/1,
+        ImageHeight => 1080,
+        ImageWidth => 1440,
+    },{
+        DSF => 0,
+        VideoSType => 0x18,
+        FrameSize => 240000,
+        VideoFormat => 'DVCPRO HD: SMPTE-370M - 720p60 100 Mbps',
+        VideoScanType => 'Progressive',
+        Colorimetry => '4:2:2',
+        FrameRate => 60000/1001,
+        ImageHeight => 720,
+        ImageWidth => 960,
+    },{
+        DSF => 1,
+        VideoSType => 0x18,
+        FrameSize => 288000,
+        VideoFormat => 'DVCPRO HD: SMPTE-370M - 720p50 100 Mbps',
+        VideoScanType => 'Progressive',
+        Colorimetry => '4:2:2',
+        FrameRate => 50/1,
+        ImageHeight => 720,
+        ImageWidth => 960,
+    },{
+        DSF => 1,
+        VideoSType => 0x1,
+        FrameSize => 144000,
+        VideoFormat => 'IEC 61883-5 - 625/50 (PAL)',
+        VideoScanType => 'Progressive',
+        Colorimetry => '4:2:0',
+        FrameRate => 25/1,
+        ImageHeight => 576,
+        ImageWidth => 720,
+    },
+);
+
+# tags to extract, in the order we want to extract them
+my @dvTags = (
+    'DateTimeOriginal', 'ImageWidth',  'ImageHeight',   'Duration',
+    'TotalBitrate',     'VideoFormat', 'VideoScanType', 'FrameRate',
+    'AspectRatio',      'Colorimetry', 'AudioChannels', 'AudioSampleRate',
+    'AudioBitsPerSample',
+);
+
+# DV tags
+%Image::ExifTool::DV::Main = (
+    GROUPS => { 2 => 'Video' },
+    VARS => { NO_ID => 1 },
+    NOTES => 'The following tags are extracted from DV videos.',
+    DateTimeOriginal => {
+        Groups => { 2 => 'Time' },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    ImageWidth         => { },
+    ImageHeight        => { },
+    Duration           => { PrintConv => 'ConvertDuration($val)' },
+    TotalBitrate       => { PrintConv => 'ConvertBitrate($val)' },
+    VideoFormat        => { },
+    VideoScanType      => { },
+    FrameRate          => { PrintConv => 'int($val * 1000 + 0.5) / 1000' },
+    AspectRatio        => { },
+    Colorimetry        => { },
+    AudioChannels      => { Groups => { 2 => 'Audio' } },
+    AudioSampleRate    => { Groups => { 2 => 'Audio' } },
+    AudioBitsPerSample => { Groups => { 2 => 'Audio' } },
+);
+
+#------------------------------------------------------------------------------
+# Read information in a DV file (ref 1)
+# Inputs: 0) ExifTool ref, 1) dirInfo ref
+# Returns: 1 on success, 0 if this wasn't a valid DV file
+sub ProcessDV($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    local $_;
+    my $raf = $$dirInfo{RAF};
+    my ($buff, $start, $profile, $tag, $i, $j);
+
+    $raf->Read($buff, 12000) or return 0;
+    if ($buff =~ /\x1f\x07\0[\x3f\xbf]/sg) {
+        $start = pos($buff) - 4;
+    } else {
+        while ($buff =~ /[\0\xff]\x3f\x07\0.{76}\xff\x3f\x07\x01/sg) {
+            next if pos($buff) - 163 < 0;
+            $start = pos($buff) - 163;
+            last;
+        }
+        return 0 unless defined $start;
+    }
+    my $len = length $buff;
+    # must at least have a full DIF header
+    return 0 if $start + 80 * 6 > $len;
+
+    $exifTool->SetFileType();
+
+    my $pos = $start;
+    my $dsf = Get8u(\$buff, $pos + 3) & 0x80 >> 7;
+    my $stype = Get8u(\$buff, $pos + 80*5 + 48 + 3) & 0x1f;
+
+    # 576i50 25Mbps 4:1:1 is a special case
+    if ($dsf == 1 && $stype == 0 && Get8u(\$buff, 4) & 0x07) {
+        $profile = $dvProfiles[2];
+    } else {
+        foreach (@dvProfiles) {
+            next unless $dsf == $$_{DSF} and $stype == $$_{VideoSType};
+            $profile = $_;
+            last;
+        }
+        $profile or $exifTool->Warn("Unrecognized DV profile"), return 1;
+    }
+    my $tagTablePtr = GetTagTable('Image::ExifTool::DV::Main');
+
+    # calculate total bit rate and duration
+    my $byteRate = $$profile{FrameSize} * $$profile{FrameRate};
+    my $fileSize = $$exifTool{VALUE}{FileSize};
+    $$profile{TotalBitrate} = 8 * $byteRate;
+    $$profile{Duration} = $fileSize / $byteRate if defined $fileSize;
+
+    # read DVPack metadata from the VAUX DIF's to extract video tags
+    delete $$profile{DateTimeOriginal};
+    delete $$profile{AspectRatio};
+    my ($date, $time, $is16_9);
+    for ($i=1; $i<6; ++$i) {
+        $pos += 80;
+        my $type = Get8u(\$buff, $pos);
+        next unless ($type & 0xf0) == 0x50;   # look for VAUX types
+        for ($j=0; $j<15; ++$j) {
+            my $p = $pos + $j * 5 + 3;
+            $type = Get8u(\$buff, $p);
+            if ($type == 0x61) { # video control
+                my $apt = Get8u(\$buff, $start + 4) & 0x07;
+                my $t = Get8u(\$buff, $p + 2);
+                $is16_9 = (($t & 0x07) == 0x02 or (not $apt and ($t & 0x07) == 0x07));
+            } elsif ($type == 0x62) { # date
+                # mask off unused bits
+                my @d = unpack('C*', substr($buff, $p + 1, 4));
+                # (ignore timezone in byte 0 until we can test this properly - see ref 2)
+                $date = sprintf('%.2x:%.2x:%.2x', $d[3], $d[2] & 0x1f, $d[1] & 0x3f);
+                if ($date =~ /[a-f]/) {
+                    undef $date;    # invalid date
+                } else {
+                    # add century (this will work until 2089)
+                    $date = ($date lt '9' ? '20' : '19') . $date;
+                }
+                undef $time;
+            } elsif ($type == 0x63 and $date) { # time
+                # (ignore frames past second in byte 0 for now - see ref 2)
+                my $val = Get32u(\$buff, $p + 1) & 0x007f7f3f;
+                my @t = unpack('C*', substr($buff, $p + 1, 4));
+                $time = sprintf('%.2x:%.2x:%.2x', $t[3] & 0x3f, $t[2] & 0x7f, $t[1] & 0x7f);
+                last;
+            } else {
+                undef $time;    # must be consecutive
+            }
+        }
+    }
+    if ($date and $time) {
+        $$profile{DateTimeOriginal} = "$date $time";
+        $$profile{AspectRatio} = $is16_9 ? '16:9' : '5:4' if defined $is16_9;
+    }
+
+    # read audio tags if available
+    delete $$profile{AudioSampleRate};
+    delete $$profile{AudioBitsPerSample};
+    delete $$profile{AudioChannels};
+    $pos = $start + 80*6 + 80*16*3 + 3;
+    if ($pos + 4 < $len and Get8u(\$buff, $pos) == 0x50) {
+        my $smpls = Get8u(\$buff, $pos + 1);
+        my $freq = (Get8u(\$buff, $pos + 4) >> 3) & 0x07;
+        my $stype = Get8u(\$buff, $pos + 3) & 0x1f;
+        my $quant = Get8u(\$buff, $pos + 4) & 0x07;
+        if ($freq < 3) {
+            $$profile{AudioSampleRate} = {0=>48000, 1=>44100, 2=>32000}->{$freq};
+        }
+        if ($stype < 3) {
+            $stype = 2 if $stype == 0 and $quant and $freq == 2;
+            $$profile{AudioChannels} = {0=>2, 1=>0, 2=>4, 3=>8}->{$stype};
+        }
+        $$profile{AudioBitsPerSample} = $quant ? 12 : 16;
+    }
+
+    # save our metadata
+    foreach $tag (@dvTags) {
+        next unless defined $$profile{$tag};
+        $exifTool->HandleTag($tagTablePtr, $tag, $$profile{$tag});
+    }
+
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::DV - Read DV meta information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to read meta
+information from DV (raw Digital Video) files.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://ffmpeg.org/>
+
+=item L<http://dvswitch.alioth.debian.org/wiki/DV_format/>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/DV Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/DjVu.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/DjVu.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/DjVu.pm	(revision 24799)
@@ -0,0 +1,373 @@
+#------------------------------------------------------------------------------
+# File:         DjVu.pm
+#
+# Description:  Read DjVu archive meta information
+#
+# Revisions:    09/25/2008 - P. Harvey Created
+#
+# References:   1) http://djvu.sourceforge.net/ (DjVu v3 specification, Nov 2005)
+#               2) http://www.djvu.org/
+#
+# Notes:        DjVu files are recognized and the IFF structure is processed
+#               by Image::ExifTool::AIFF
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::DjVu;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.03';
+
+sub ParseAnt($);
+sub ProcessAnt($$$);
+sub ProcessMeta($$$);
+sub ProcessBZZ($$$);
+
+# DjVu chunks that we parse (ref 4)
+%Image::ExifTool::DjVu::Main = (
+    GROUPS => { 2 => 'Image' },
+    NOTES => 'Information is extracted from the following chunks in DjVu images.',
+    INFO => {
+        SubDirectory => { TagTable => 'Image::ExifTool::DjVu::Info' },
+    },
+    FORM => {
+        TypeOnly => 1,  # extract chunk type only, then descend into chunk
+        SubDirectory => { TagTable => 'Image::ExifTool::DjVu::Form' },
+    },
+    ANTa => {
+        SubDirectory => { TagTable => 'Image::ExifTool::DjVu::Ant' },
+    },
+    ANTz => {
+        Name => 'CompressedAnnotation',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::DjVu::Ant',
+            ProcessProc => \&ProcessBZZ,
+        }
+    },
+    INCL => 'IncludedFileID',
+);
+
+# information in the DjVu INFO chunk
+%Image::ExifTool::DjVu::Info = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    FORMAT => 'int8u',
+    PRIORITY => 0, # first INFO block takes priority
+    0 => {
+        Name => 'ImageWidth',
+        Format => 'int16u',
+    },
+    2 => {
+        Name => 'ImageHeight',
+        Format => 'int16u',
+    },
+    4 => {
+        Name => 'DjVuVersion',
+        Description => 'DjVu Version',
+        Format => 'int8u[2]',
+        # (this may be just one byte as with version 0.16)
+        ValueConv => '$val=~/(\d+) (\d+)/ ? "$2.$1" : "0.$val"',
+    },
+    6 => {
+        Name => 'SpatialResolution',
+        Format => 'int16u',
+        ValueConv => '(($val & 0xff)<<8) + ($val>>8)', # (little-endian!)
+    },
+    8 => {
+        Name => 'Gamma',
+        ValueConv => '$val / 10',
+    },
+    9 => {
+        Name => 'Orientation',
+        Mask => 0x07, # (upper 5 bits reserved)
+        PrintConv => {
+            1 => 'Horizontal (normal)',
+            2 => 'Rotate 180',
+            5 => 'Rotate 90 CW',
+            6 => 'Rotate 270 CW',
+        },
+    },
+);
+
+# information in the DjVu FORM chunk
+%Image::ExifTool::DjVu::Form = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    0 => {
+        Name => 'SubfileType',
+        Format => 'undef[4]',
+        Priority => 0,
+        PrintConv => {
+            DJVU => 'Single-page image',
+            DJVM => 'Multi-page document',
+            PM44 => 'Color IW44',
+            BM44 => 'Grayscale IW44',
+            DJVI => 'Shared component',
+            THUM => 'Thumbnail image',
+        },
+    },
+);
+
+# tags found in the DjVu annotation chunk (ANTz or ANTa)
+%Image::ExifTool::DjVu::Ant = (
+    PROCESS_PROC => \&Image::ExifTool::DjVu::ProcessAnt,
+    GROUPS => { 2 => 'Image' },
+    NOTES => 'Information extracted from annotation chunks.',
+    # Note: For speed, ProcessAnt() pre-scans for known tag ID's, so if any
+    # new tags are added here they must also be added to the pre-scan check
+    metadata => {
+        SubDirectory => { TagTable => 'Image::ExifTool::DjVu::Meta' }
+    },
+    xmp => {
+        Name => 'XMP',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' }
+    },
+);
+
+# tags found in the DjVu annotation metadata
+%Image::ExifTool::DjVu::Meta = (
+    PROCESS_PROC => \&Image::ExifTool::DjVu::ProcessMeta,
+    GROUPS => { 1 => 'DjVu-Meta', 2 => 'Image' },
+    NOTES => q{
+        This table lists the standard DjVu metadata tags, but ExifTool will extract
+        any tags that exist even if they don't appear here.  The DjVu v3
+        documentation endorses tags borrowed from two standards: 1) BibTeX
+        bibliography system tags (all lowercase Tag ID's in the table below), and 2)
+        PDF DocInfo tags (uppercase Tag ID's).
+    },
+    # BibTeX tags (ref http://en.wikipedia.org/wiki/BibTeX)
+    address     => { Groups => { 2 => 'Location' } },
+    annote      => { Name => 'Annotation' },
+    author      => { Groups => { 2 => 'Author' } },
+    booktitle   => { Name => 'BookTitle' },
+    chapter     => { },
+    crossref    => { Name => 'CrossRef' },
+    edition     => { },
+    eprint      => { Name => 'EPrint' },
+    howpublished=> { Name => 'HowPublished' },
+    institution => { },
+    journal     => { },
+    key         => { },
+    month       => { Groups => { 2 => 'Time' } },
+    note        => { },
+    number      => { },
+    organization=> { },
+    pages       => { },
+    publisher   => { },
+    school      => { },
+    series      => { },
+    title       => { },
+    type        => { },
+    url         => { Name => 'URL' },
+    volume      => { },
+    year        => { Groups => { 2 => 'Time' } },
+    # PDF tags (same as Image::ExifTool::PDF::Info)
+    Title       => { },
+    Author      => { Groups => { 2 => 'Author' } },
+    Subject     => { },
+    Keywords    => { },
+    Creator     => { },
+    Producer    => { },
+    CreationDate => {
+        Name => 'CreateDate',
+        Groups => { 2 => 'Time' },
+        # RFC 3339 date/time format
+        ValueConv => 'require Image::ExifTool::XMP; Image::ExifTool::XMP::ConvertXMPDate($val)',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    ModDate => {
+        Name => 'ModifyDate',
+        Groups => { 2 => 'Time' },
+        ValueConv => 'require Image::ExifTool::XMP; Image::ExifTool::XMP::ConvertXMPDate($val)',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    Trapped => {
+        # remove leading '/' from '/True' or '/False'
+        ValueConv => '$val=~s{^/}{}; $val',
+    },
+);
+
+#------------------------------------------------------------------------------
+# Parse DjVu annotation "s-expression" syntax (recursively)
+# Inputs: 0) data ref (with pos($$dataPt) set to start of annotation)
+# Returns: reference to list of tokens/references, or undef if no tokens,
+#          and the position in $$dataPt is set to end of last token
+# Notes: The DjVu annotation syntax is not well documented, so I make
+#        a number of assumptions here!
+sub ParseAnt($)
+{
+    my $dataPt = shift;
+    my (@toks, $tok, $more);
+    # (the DjVu annotation syntax really sucks, and requires that every
+    # single token be parsed in order to properly scan through the items)
+Tok: for (;;) {
+        # find the next token
+        last unless $$dataPt =~ /(\S)/sg;   # get next non-space character
+        if ($1 eq '(') {       # start of list
+            $tok = ParseAnt($dataPt);
+        } elsif ($1 eq ')') {  # end of list
+            $more = 1;
+            last;
+        } elsif ($1 eq '"') {  # quoted string
+            $tok = '';
+            for (;;) {
+                # get string up to the next quotation mark
+                # this doesn't work in perl 5.6.2! grrrr
+                # last Tok unless $$dataPt =~ /(.*?)"/sg;
+                # $tok .= $1;
+                my $pos = pos($$dataPt);
+                last Tok unless $$dataPt =~ /"/sg;
+                $tok .= substr($$dataPt, $pos, pos($$dataPt)-1-$pos);
+                # we're good unless quote was escaped by odd number of backslashes
+                last unless $tok =~ /(\\+)$/ and length($1) & 0x01;
+                $tok .= '"';    # quote is part of the string
+            }
+            # convert C escape sequences (allowed in quoted text)
+            $tok = eval qq{"$tok"};
+        } else {                # key name
+            pos($$dataPt) = pos($$dataPt) - 1;
+            # allow anything in key but whitespace, braces and double quotes
+            # (this is one of those assumptions I mentioned)
+            $$dataPt =~ /([^\s()"]+)/sg;
+            $tok = $1;
+        }
+        push @toks, $tok if defined $tok;
+    }
+    # prevent further parsing unless more after this
+    pos($$dataPt) = length $$dataPt unless $more;
+    return @toks ? \@toks : undef;
+}
+
+#------------------------------------------------------------------------------
+# Process DjVu annotation chunk (ANTa or decoded ANTz)
+# Inputs: 0) ExifTool object reference, 1) DirInfo reference, 2) tag table ref
+# Returns: 1 on success
+sub ProcessAnt($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+
+    # quick pre-scan to check for metadata or XMP
+    return 1 unless $$dataPt =~ /\(\s*(metadata|xmp)[\s("]/s;
+
+    # parse annotations into a tree structure
+    pos($$dataPt) = 0;
+    my $toks = ParseAnt($dataPt) or return 0;
+
+    # process annotations individually
+    my $ant;
+    foreach $ant (@$toks) {
+        next unless ref $ant eq 'ARRAY' and @$ant >= 2;
+        my $tag = shift @$ant;
+        next if ref $tag or not defined $$tagTablePtr{$tag};
+        if ($tag eq 'metadata') {
+            # ProcessMeta() takes array reference
+            $exifTool->HandleTag($tagTablePtr, $tag, $ant);
+        } else {
+            next if ref $$ant[0];   # only process simple values
+            $exifTool->HandleTag($tagTablePtr, $tag, $$ant[0]);
+        }
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Process DjVu metadata
+# Inputs: 0) ExifTool object reference, 1) DirInfo reference, 2) tag table ref
+# Returns: 1 on success
+# Notes: input dirInfo DataPt is a reference to a list of pre-parsed metadata entries
+sub ProcessMeta($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    return 0 unless ref $$dataPt eq 'ARRAY';
+    $exifTool->VerboseDir('Metadata', scalar @$$dataPt);
+    my ($item, $err);
+    foreach $item (@$$dataPt) {
+        # make sure item is a simple tag/value pair
+        $err=1, next unless ref $item eq 'ARRAY' and @$item >= 2 and
+                            not ref $$item[0] and not ref $$item[1];
+        # add any new tags to the table
+        unless ($$tagTablePtr{$$item[0]}) {
+            my $name = $$item[0];
+            $name =~ tr/-_a-zA-Z0-9//dc; # remove illegal characters
+            length $name or $err = 1, next;
+            Image::ExifTool::AddTagToTable($tagTablePtr, $$item[0], { Name => ucfirst($name) });
+        }
+        $exifTool->HandleTag($tagTablePtr, $$item[0], $$item[1]);
+    }
+    $err and $exifTool->Warn('Ignored invalid metadata entry(s)');
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Process BZZ-compressed data (in DjVu images)
+# Inputs: 0) ExifTool object reference, 1) DirInfo reference, 2) tag table ref
+# Returns: 1 on success
+sub ProcessBZZ($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    require Image::ExifTool::BZZ;
+    my $buff = Image::ExifTool::BZZ::Decode($$dirInfo{DataPt});
+    unless (defined $buff) {
+        $exifTool->Warn("Error decoding $$dirInfo{DirName}");
+        return 0;
+    }
+    my $verbose = $exifTool->Options('Verbose');
+    if ($verbose >= 3) {
+        # dump the decoded data in very verbose mode
+        $exifTool->VerboseDir("Decoded $$dirInfo{DirName}", 0, length $buff);
+        $exifTool->VerboseDump(\$buff);
+    }
+    $$dirInfo{DataPt} = \$buff;
+    $$dirInfo{DataLen} = $$dirInfo{DirLen} = length $buff;
+    # process the data using the default process proc for this table
+    my $processProc = $$tagTablePtr{PROCESS_PROC} or return 0;
+    return &$processProc($exifTool, $dirInfo, $tagTablePtr);
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::DjVu - Read DjVu meta information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to extract meta
+information from DjVu images.  Parsing of the DjVu IFF structure is done by
+Image::ExifTool::AIFF.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://djvu.sourceforge.net/>
+
+=item L<http://www.djvu.org/>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/DjVu Tags>,
+L<Image::ExifTool::AIFF(3pm)|Image::ExifTool::AIFF>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/EXE.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/EXE.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/EXE.pm	(revision 24799)
@@ -0,0 +1,1186 @@
+#------------------------------------------------------------------------------
+# File:         EXE.pm
+#
+# Description:  Read meta information of various executable file formats
+#
+# Revisions:    2008/08/28 - P. Harvey Created
+#
+# References:   1) http://www.openwatcom.org/ftp/devel/docs/pecoff.pdf
+#               2) http://support.microsoft.com/kb/65122
+#               3) http://www.opensource.apple.com
+#               4) http://www.skyfree.org/linux/references/ELF_Format.pdf
+#               5) http://msdn.microsoft.com/en-us/library/ms809762.aspx
+#               6) http://code.google.com/p/pefile/
+#               7) http://www.codeproject.com/KB/DLL/showver.aspx
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::EXE;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.04';
+
+sub ProcessPEResources($$);
+sub ProcessPEVersion($$);
+
+# PE file resource types (ref 6)
+my %resourceType = (
+    1 => 'Cursor',
+    2 => 'Bitmap',
+    3 => 'Icon',
+    4 => 'Menu',
+    5 => 'Dialog',
+    6 => 'String',
+    7 => 'Font Dir',
+    8 => 'Font',
+    9 => 'Accelerator',
+    10 => 'RC Data',
+    11 => 'Message Table',
+    12 => 'Group Cursor',
+    14 => 'Group Icon',
+    16 => 'Version',
+    17 => 'Dialog Include',
+    19 => 'Plug-n-Play',
+    20 => 'VxD',
+    21 => 'Animated Cursor',
+    22 => 'Animated Icon',
+    23 => 'HTML',
+    24 => 'Manifest',
+);
+
+# Information extracted from PE COFF (Windows EXE) file header
+%Image::ExifTool::EXE::Main = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Other' },
+    FORMAT => 'int16u',
+    NOTES => q{
+        This module extracts information from various types of Windows, MacOS and
+        Unix executable and library files.  The first table below lists information
+        extracted from the header of Windows PE (Portable Executable) EXE files and
+        DLL libraries.
+    },
+    0 => {
+        Name => 'MachineType',
+        PrintHex => 1,
+        PrintConv => {
+            0x014c => 'Intel 386 or later, and compatibles',
+            0x014d => 'Intel i860', #5
+            0x0162 => 'MIPS R3000',
+            0x0166 => 'MIPS little endian (R4000)',
+            0x0168 => 'MIPS R10000',
+            0x0169 => 'MIPS little endian WCI v2',
+            0x0183 => 'Alpha AXP (old)', #5
+            0x0184 => 'Alpha AXP',
+            0x01a2 => 'Hitachi SH3',
+            0x01a3 => 'Hitachi SH3 DSP',
+            0x01a6 => 'Hitachi SH4',
+            0x01a8 => 'Hitachi SH5',
+            0x01c0 => 'ARM little endian',
+            0x01c2 => 'Thumb',
+            0x01d3 => 'Matsushita AM33',
+            0x01f0 => 'PowerPC little endian',
+            0x01f1 => 'PowerPC with floating point support',
+            0x0200 => 'Intel IA64',
+            0x0266 => 'MIPS16',
+            0x0268 => 'Motorola 68000 series',
+            0x0284 => 'Alpha AXP 64-bit',
+            0x0366 => 'MIPS with FPU',
+            0x0466 => 'MIPS16 with FPU',
+            0x0ebc => 'EFI Byte Code',
+            0x8664 => 'AMD AMD64',
+            0x9041 => 'Mitsubishi M32R little endian',
+            0xc0ee => 'clr pure MSIL',
+        },
+    },
+    2 => {
+        Name => 'TimeStamp',
+        Format => 'int32u',
+        Groups => { 2 => 'Time' },
+        ValueConv => 'ConvertUnixTime($val,1)',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    10 => {
+        Name => 'PEType',
+        PrintHex => 1,
+        PrintConv => {
+            0x10b => 'PE32',
+            0x20b => 'PE32+',
+        },
+    },
+    11 => {
+        Name => 'LinkerVersion',
+        Format => 'int8u[2]',
+        ValueConv => '$val=~tr/ /./; $val',
+    },
+    12 => {
+        Name => 'CodeSize',
+        Format => 'int32u',
+    },
+    14 => {
+        Name => 'InitializedDataSize',
+        Format => 'int32u',
+    },
+    16 => {
+        Name => 'UninitializedDataSize',
+        Format => 'int32u',
+    },
+    18 => {
+        Name => 'EntryPoint',
+        Format => 'int32u',
+        PrintConv => 'sprintf("0x%.4x", $val)',
+    },
+    30 => {
+        Name => 'OSVersion',
+        Format => 'int16u[2]',
+        ValueConv => '$val=~tr/ /./; $val',
+    },
+    32 => {
+        Name => 'ImageVersion',
+        Format => 'int16u[2]',
+        ValueConv => '$val=~tr/ /./; $val',
+    },
+    34 => {
+        Name => 'SubsystemVersion',
+        Format => 'int16u[2]',
+        ValueConv => '$val=~tr/ /./; $val',
+    },
+    44 => {
+        Name => 'Subsystem',
+        PrintConv => {
+            0 => 'Unknown',
+            1 => 'Native',
+            2 => 'Windows GUI',
+            3 => 'Windows command line',
+            5 => 'OS/2 Command line', #5
+            7 => 'POSIX command line',
+            9 => 'Windows CE GUI',
+            10 => 'EFI application',
+            11 => 'EFI boot service',
+            12 => 'EFI runtime driver',
+            13 => 'EFI ROM', #6
+            14 => 'XBOX', #6
+        },
+    },
+);
+
+# PE file version information (ref 6)
+%Image::ExifTool::EXE::PEVersion = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Other' },
+    FORMAT => 'int32u',
+    NOTES => q{
+        Information extracted from the VS_VERSION_INFO structure of Windows PE
+        files.
+    },
+    # (boring -- always 0xfeef04bd)
+    #0 => {
+    #    Name => 'Signature',
+    #    PrintConv => 'sprintf("0x%.4x",$val)',
+    #},
+    # (boring -- always 1.0)
+    #1 => {
+    #    Name => 'StructVersion',
+    #    Format => 'int16u[2]',
+    #    ValueConv => 'my @a=split(" ",$val); "$a[1].$a[0]"',
+    #},
+    2 => {
+        Name => 'FileVersionNumber',
+        Format => 'int16u[4]',
+        ValueConv => 'my @a=split(" ",$val); "$a[1].$a[0].$a[3].$a[2]"',
+    },
+    4 => {
+        Name => 'ProductVersionNumber',
+        Format => 'int16u[4]',
+        ValueConv => 'my @a=split(" ",$val); "$a[1].$a[0].$a[3].$a[2]"',
+    },
+    6 => {
+        Name => 'FileFlagsMask',
+        PrintConv => 'sprintf("0x%.4x",$val)',
+    },
+    7 => { # ref Cygwin /usr/include/w32api/winver.h
+        Name => 'FileFlags',
+        PrintConv => { BITMASK => {
+            0 => 'Debug',
+            1 => 'Pre-release',
+            2 => 'Patched',
+            3 => 'Private build',
+            4 => 'Info inferred',
+            5 => 'Special build',
+        }},
+    },
+    8 => {
+        Name => 'FileOS',
+        PrintHex => 1,
+        PrintConv => { # ref Cygwin /usr/include/w32api/winver.h
+            0x00001 => 'Win16',
+            0x00002 => 'PM-16',
+            0x00003 => 'PM-32',
+            0x00004 => 'Win32',
+            0x10000 => 'DOS',
+            0x20000 => 'OS/2 16-bit',
+            0x30000 => 'OS/2 32-bit',
+            0x40000 => 'Windows NT',
+            0x10001 => 'Windows 16-bit',
+            0x10004 => 'Windows 32-bit',
+            0x20002 => 'OS/2 16-bit PM-16',
+            0x30003 => 'OS/2 32-bit PM-32',
+            0x40004 => 'Windows NT 32-bit',
+        },
+    },
+    9 => { # ref Cygwin /usr/include/w32api/winver.h
+        Name => 'ObjectFileType',
+        PrintConv => {
+            0 => 'Unknown',
+            1 => 'Executable application',
+            2 => 'Dynamic link library',
+            3 => 'Driver',
+            4 => 'Font',
+            5 => 'VxD',
+            7 => 'Static library',
+        },
+    },
+    10 => 'FileSubtype',
+    # (these are usually zero, so ignore them)
+    # 11 => 'FileDateMS',
+    # 12 => 'FileDateLS',
+);
+
+# Windows PE StringFileInfo resource strings
+# (see http://msdn.microsoft.com/en-us/library/aa381049.aspx)
+%Image::ExifTool::EXE::PEString = (
+    GROUPS => { 2 => 'Other' },
+    VARS => { NO_ID => 1 },
+    NOTES => q{
+        Resource strings found in Windows PE files.  The B<TagID>'s are not shown
+        because they are the same as the B<Tag Name>.  ExifTool will extract any
+        existing StringFileInfo tags even if not listed in this table.
+    },
+    LanguageCode => {
+        Notes => 'extracted from the StringFileInfo value',
+        # ref http://techsupt.winbatch.com/TS/T000001050F49.html
+        # (also see http://support.bigfix.com/fixlet/documents/WinInspectors-2006-08-10.pdf)
+        # (also see ftp://ftp.dyu.edu.tw/pub/cpatch/faq/tech/tech_nlsnt.txt)
+        # (not a complete set)
+        PrintString => 1,
+        PrintConv => {
+            '0000' => 'Neutral',
+            '007F' => 'Invariant',
+            '0400' => 'Process default',
+            '0401' => 'Arabic',
+            '0402' => 'Bulgarian',
+            '0403' => 'Catalan',
+            '0404' => 'Chinese (Traditional)',
+            '0405' => 'Czech',
+            '0406' => 'Danish',
+            '0407' => 'German',
+            '0408' => 'Greek',
+            '0409' => 'English (U.S.)',
+            '040A' => 'Spanish (Castilian)',
+            '040B' => 'Finnish',
+            '040C' => 'French',
+            '040D' => 'Hebrew',
+            '040E' => 'Hungarian',
+            '040F' => 'Icelandic',
+            '0410' => 'Italian',
+            '0411' => 'Japanese',
+            '0412' => 'Korean',
+            '0413' => 'Dutch',
+            '0414' => 'Norwegian (Bokml)',
+            '0415' => 'Polish',
+            '0416' => 'Portuguese (Brazilian)',
+            '0417' => 'Rhaeto-Romanic',
+            '0418' => 'Romanian',
+            '0419' => 'Russian',
+            '041A' => 'Croato-Serbian (Latin)',
+            '041B' => 'Slovak',
+            '041C' => 'Albanian',
+            '041D' => 'Swedish',
+            '041E' => 'Thai',
+            '041F' => 'Turkish',
+            '0420' => 'Urdu',
+            # 0421-0493 ref 6
+            '0421' => 'Indonesian',
+            '0422' => 'Ukrainian',
+            '0423' => 'Belarusian',
+            '0424' => 'Slovenian',
+            '0425' => 'Estonian',
+            '0426' => 'Latvian',
+            '0427' => 'Lithuanian',
+            '0428' => 'Maori',
+            '0429' => 'Farsi',
+            '042a' => 'Vietnamese',
+            '042b' => 'Armenian',
+            '042c' => 'Azeri',
+            '042d' => 'Basque',
+            '042e' => 'Sorbian',
+            '042f' => 'Macedonian',
+            '0430' => 'Sutu',
+            '0431' => 'Tsonga',
+            '0432' => 'Tswana',
+            '0433' => 'Venda',
+            '0434' => 'Xhosa',
+            '0435' => 'Zulu',
+            '0436' => 'Afrikaans',
+            '0437' => 'Georgian',
+            '0438' => 'Faeroese',
+            '0439' => 'Hindi',
+            '043a' => 'Maltese',
+            '043b' => 'Saami',
+            '043c' => 'Gaelic',
+            '043e' => 'Malay',
+            '043f' => 'Kazak',
+            '0440' => 'Kyrgyz',
+            '0441' => 'Swahili',
+            '0443' => 'Uzbek',
+            '0444' => 'Tatar',
+            '0445' => 'Bengali',
+            '0446' => 'Punjabi',
+            '0447' => 'Gujarati',
+            '0448' => 'Oriya',
+            '0449' => 'Tamil',
+            '044a' => 'Telugu',
+            '044b' => 'Kannada',
+            '044c' => 'Malayalam',
+            '044d' => 'Assamese',
+            '044e' => 'Marathi',
+            '044f' => 'Sanskrit',
+            '0450' => 'Mongolian',
+            '0456' => 'Galician',
+            '0457' => 'Konkani',
+            '0458' => 'Manipuri',
+            '0459' => 'Sindhi',
+            '045a' => 'Syriac',
+            '0460' => 'Kashmiri',
+            '0461' => 'Nepali',
+            '0465' => 'Divehi',
+            '047f' => 'Invariant',
+            '048f' => 'Esperanto',
+            '0490' => 'Walon',
+            '0491' => 'Cornish',
+            '0492' => 'Welsh',
+            '0493' => 'Breton',
+            '0800' => 'Neutral 2',
+            '0804' => 'Chinese (Simplified)',
+            '0807' => 'German (Swiss)',
+            '0809' => 'English (British)',
+            '080A' => 'Spanish (Mexican)',
+            '080C' => 'French (Belgian)',
+            '0810' => 'Italian (Swiss)',
+            '0813' => 'Dutch (Belgian)',
+            '0814' => 'Norwegian (Nynorsk)',
+            '0816' => 'Portuguese',
+            '081A' => 'Serbo-Croatian (Cyrillic)',
+            '0C07' => 'German (Austrian)',
+            '0C09' => 'English (Australian)',
+            '0C0A' => 'Spanish (Modern)',
+            '0C0C' => 'French (Canadian)',
+            '1009' => 'English (Canadian)',
+            '100C' => 'French (Swiss)',
+        },
+    },
+    CharacterSet => {
+        Notes => 'extracted from the StringFileInfo value',
+        # ref http://techsupt.winbatch.com/TS/T000001050F49.html
+        # (also see http://blog.chinaunix.net/u1/41189/showart_345768.html)
+        PrintString => 1,
+        PrintConv => {
+            '0000' => 'ASCII',
+            '03A4' => 'Windows, Japan (Shift - JIS X-0208)', # cp932
+            '03A8' => 'Windows, Chinese (Simplified)', # cp936
+            '03B5' => 'Windows, Korea (Shift - KSC 5601)', # cp949
+            '03B6' => 'Windows, Taiwan (Big5)', # cp950
+            '04B0' => 'Unicode', # UCS-2
+            '04E2' => 'Windows, Latin2 (Eastern European)',
+            '04E3' => 'Windows, Cyrillic',
+            '04E4' => 'Windows, Latin1',
+            '04E5' => 'Windows, Greek',
+            '04E6' => 'Windows, Turkish',
+            '04E7' => 'Windows, Hebrew',
+            '04E8' => 'Windows, Arabic',
+        },
+    },
+    BuildDate       => { Groups => { 2 => 'Time' } }, # (non-standard)
+    BuildVersion    => { }, # (non-standard)
+    Comments        => { },
+    CompanyName     => { },
+    Copyright       => { }, # (non-standard)
+    FileDescription => { },
+    FileVersion     => { },
+    InternalName    => { },
+    LegalCopyright  => { },
+    LegalTrademarks => { },
+    OriginalFilename=> { },
+    PrivateBuild    => { },
+    ProductName     => { },
+    ProductVersion  => { },
+    SpecialBuild    => { },
+);
+
+# Information extracted from Mach-O (Mac OS X) file header
+%Image::ExifTool::EXE::MachO = (
+    GROUPS => { 2 => 'Other' },
+    VARS => { ID_LABEL => 'Index' },
+    NOTES => q{
+        Information extracted from Mach-O (Mac OS X) executable files and DYLIB
+        libraries.
+    },
+    # ref http://www.opensource.apple.com/darwinsource/DevToolsOct2007/cctools-622.9/include/mach/machine.h
+    0 => 'CPUArchitecture',
+    1 => 'CPUByteOrder',
+    2 => 'CPUCount',
+    # ref /System/Library/Frameworks/Kernel.framework/Versions/A/Headers/mach/machine.h
+    3 => {
+        Name => 'CPUType',
+        List => 1,
+        PrintConv => {
+            # handle 64-bit flag (0x1000000)
+            OTHER => sub {
+                my ($val, $inv, $conv) = @_;
+                my $v = $val & 0xfeffffff;
+                return $$conv{$v} ? "$$conv{$v} 64-bit" : "Unknown ($val)";
+            },
+            -1 => 'Any',
+            1 => 'VAX',
+            2 => 'ROMP',
+            4 => 'NS32032',
+            5 => 'NS32332',
+            6 => 'MC680x0',
+            7 => 'x86',
+            8 => 'MIPS',
+            9 => 'NS32532',
+            10 => 'MC98000',
+            11 => 'HPPA',
+            12 => 'ARM',
+            13 => 'MC88000',
+            14 => 'SPARC',
+            15 => 'i860 big endian',
+            16 => 'i860 little endian',
+            17 => 'RS6000',
+            18 => 'PowerPC',
+            255 => 'VEO',
+        },
+    },
+    # ref /System/Library/Frameworks/Kernel.framework/Versions/A/Headers/mach/machine.h
+    4 => {
+        Name => 'CPUSubtype',
+        List => 1,
+        PrintConv => {
+            # handle 64-bit flags on CPUType (0x1000000) and CPUSubtype (0x80000000)
+            OTHER => sub {
+                my ($val, $inv, $conv) = @_;
+                my @v = split ' ', $val;
+                my $v = ($v[0] & 0xfeffffff) . ' ' . ($v[1] & 0x7fffffff);
+                return $$conv{$v} ? "$$conv{$v} 64-bit" : "Unknown ($val)";
+            },
+            # in theory, subtype can be -1 for multiple CPU types,
+            # but in practice I'm not sure anyone uses this - PH
+            '1 0' => 'VAX (all)',
+            '1 1' => 'VAX780',
+            '1 2' => 'VAX785',
+            '1 3' => 'VAX750',
+            '1 4' => 'VAX730',
+            '1 5' => 'UVAXI',
+            '1 6' => 'UVAXII',
+            '1 7' => 'VAX8200',
+            '1 8' => 'VAX8500',
+            '1 9' => 'VAX8600',
+            '1 10' => 'VAX8650',
+            '1 11' => 'VAX8800',
+            '1 12' => 'UVAXIII',
+            '2 0' => 'RT (all)',
+            '2 1' => 'RT PC',
+            '2 2' => 'RT APC',
+            '2 3' => 'RT 135',
+            # 32032/32332/32532 subtypes.
+            '4 0' => 'NS32032 (all)',
+            '4 1' => 'NS32032 DPC (032 CPU)',
+            '4 2' => 'NS32032 SQT',
+            '4 3' => 'NS32032 APC FPU (32081)',
+            '4 4' => 'NS32032 APC FPA (Weitek)',
+            '4 5' => 'NS32032 XPC (532)',
+            '5 0' => 'NS32332 (all)',
+            '5 1' => 'NS32332 DPC (032 CPU)',
+            '5 2' => 'NS32332 SQT',
+            '5 3' => 'NS32332 APC FPU (32081)',
+            '5 4' => 'NS32332 APC FPA (Weitek)',
+            '5 5' => 'NS32332 XPC (532)',
+            '6 1' => 'MC680x0 (all)',
+            '6 2' => 'MC68040',
+            '6 3' => 'MC68030',
+            '7 3' => 'i386 (all)',
+            '7 4' => 'i486',
+            '7 132' => 'i486SX',
+            '7 5' => 'i586',
+            '7 22' => 'Pentium Pro',
+            '7 54' => 'Pentium II M3',
+            '7 86' => 'Pentium II M5',
+            '7 103' => 'Celeron',
+            '7 119' => 'Celeron Mobile',
+            '7 8' => 'Pentium III',
+            '7 24' => 'Pentium III M',
+            '7 40' => 'Pentium III Xeon',
+            '7 9' => 'Pentium M',
+            '7 10' => 'Pentium 4',
+            '7 26' => 'Pentium 4 M',
+            '7 11' => 'Itanium',
+            '7 27' => 'Itanium 2',
+            '7 12' => 'Xeon',
+            '7 28' => 'Xeon MP',
+            '8 0' => 'MIPS (all)',
+            '8 1' => 'MIPS R2300',
+            '8 2' => 'MIPS R2600',
+            '8 3' => 'MIPS R2800',
+            '8 4' => 'MIPS R2000a',
+            '8 5' => 'MIPS R2000',
+            '8 6' => 'MIPS R3000a',
+            '8 7' => 'MIPS R3000',
+            '10 0' => 'MC98000 (all)',
+            '10 1' => 'MC98601',
+            '11 0' => 'HPPA (all)',
+            '11 1' => 'HPPA 7100LC',
+            '12 0' => 'ARM (all)',
+            '12 1' => 'ARM A500 ARCH',
+            '12 2' => 'ARM A500',
+            '12 3' => 'ARM A440',
+            '12 4' => 'ARM M4',
+            '12 5' => 'ARM A680/V4T',
+            '12 6' => 'ARM V6',
+            '12 7' => 'ARM V5TEJ',
+            '12 8' => 'ARM XSCALE',
+            '12 9' => 'ARM V7',
+            '13 0' => 'MC88000 (all)',
+            '13 1' => 'MC88100',
+            '13 2' => 'MC88110',
+            '14 0' => 'SPARC (all)',
+            '14 1' => 'SUN 4/260',
+            '14 2' => 'SUN 4/110',
+            '15 0' => 'i860 (all)',
+            '15 1' => 'i860 860',
+            '16 0' => 'i860 little (all)',
+            '16 1' => 'i860 little',
+            '17 0' => 'RS6000 (all)',
+            '17 1' => 'RS6000',
+            '18 0' => 'PowerPC (all)',
+            '18 1' => 'PowerPC 601',
+            '18 2' => 'PowerPC 602',
+            '18 3' => 'PowerPC 603',
+            '18 4' => 'PowerPC 603e',
+            '18 5' => 'PowerPC 603ev',
+            '18 6' => 'PowerPC 604',
+            '18 7' => 'PowerPC 604e',
+            '18 8' => 'PowerPC 620',
+            '18 9' => 'PowerPC 750',
+            '18 10' => 'PowerPC 7400',
+            '18 11' => 'PowerPC 7450',
+            '18 100' => 'PowerPC 970',
+            '255 1' => 'VEO 1',
+            '255 2' => 'VEO 2',
+        },
+    },
+    5 => {
+        Name => 'ObjectFileType',
+        PrintHex => 1,
+        # ref https://svn.red-bean.com/pyobjc/branches/pyobjc-20x-branch/macholib/macholib/mach_o.py
+        PrintConv => {
+           -1 => 'Static library', #PH (internal use only)
+            1 => 'Relocatable object',
+            2 => 'Demand paged executable',
+            3 => 'Fixed VM shared library',
+            4 => 'Core',
+            5 => 'Preloaded executable',
+            6 => 'Dynamically bound shared library',
+            7 => 'Dynamic link editor',
+            8 => 'Dynamically bound bundle',
+            9 => 'Shared library stub for static linking',
+        },
+    },
+);
+
+# Information extracted from PEF (Classic MacOS executable) file header
+%Image::ExifTool::EXE::PEF = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Other' },
+    NOTES => q{
+        Information extracted from PEF (Classic MacOS) executable files and
+        libraries.
+    },
+    FORMAT => 'int32u',
+    2 => {
+        Name => 'CPUArchitecture',
+        Format => 'undef[4]',
+        PrintConv => {
+            pwpc => 'PowerPC',
+            m68k => '68000',
+        },
+    },
+    3 => 'PEFVersion',
+    4 => {
+        Name => 'TimeStamp',
+        Groups => { 2 => 'Time' },
+        # timestamp is relative to Jan 1, 1904
+        ValueConv => 'ConvertUnixTime($val - ((66 * 365 + 17) * 24 * 3600))',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    #5 => 'OldDefVersion',
+    #6 => 'OldImpVersion',
+    #7 => 'CurrentVersion',
+);
+
+# Information extracted from ELF (Unix executable) file header
+%Image::ExifTool::EXE::ELF = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Other' },
+    NOTES => q{
+        Information extracted from ELF (Unix) executable files and SO libraries.
+    },
+    4 => {
+        Name => 'CPUArchitecture',
+        PrintConv => {
+            1 => '32 bit',
+            2 => '64 bit',
+        },
+    },
+    5 => {
+        Name => 'CPUByteOrder',
+        PrintConv => {
+            1 => 'Little endian',
+            2 => 'Big endian',
+        },
+    },
+    16 => {
+        Name => 'ObjectFileType',
+        Format => 'int16u',
+        PrintConv => {
+            0 => 'None',
+            1 => 'Relocatable file',
+            2 => 'Executable file',
+            3 => 'Shared object file',
+            4 => 'Core file',
+        },
+    },
+    18 => {
+        Name => 'CPUType',
+        Format => 'int16u',
+        # ref /usr/include/linux/elf-em.h
+        PrintConv => {
+            0 => 'None',
+            1 => 'AT&T WE 32100',
+            2 => 'SPARC',
+            3 => 'i386',
+            4 => 'Motorola 68000',
+            5 => 'Motorola 88000',
+            6 => 'i486',
+            7 => 'i860',
+            8 => 'MIPS R3000',
+            10 => 'MIPS R4000',
+            15 => 'HPPA',
+            18 => 'Sun v8plus',
+            20 => 'PowerPC',
+            21 => 'PowerPC 64-bit',
+            22 => 'IBM S/390',
+            23 => 'Cell BE SPU',
+            42 => 'SuperH',
+            43 => 'SPARC v9 64-bit',
+            46 => 'Renesas H8/300,300H,H8S',
+            50 => 'HP/Intel IA-64',
+            62 => 'AMD x86-64',
+            76 => 'Axis Communications 32-bit embedded processor',
+            87 => 'NEC v850',
+            88 => 'Renesas M32R',
+            0x5441 => 'Fujitsu FR-V',
+            0x9026 => 'Alpha', # (interim value)
+            0x9041 => 'm32r (old)',
+            0x9080 => 'v850 (old)',
+            0xa390 => 'S/390 (old)',
+        },
+    },
+);
+
+#------------------------------------------------------------------------------
+# Read Unicode string (null terminated) from resource
+# Inputs: 0) data ref, 1) start offset, 2) optional ExifTool object ref
+# Returns: 0) Unicode string translated to UTF8, or current CharSet with ExifTool ref
+#          1) end pos (rounded up to nearest 4 bytes)
+sub ReadUnicodeStr($$;$)
+{
+    my ($dataPt, $pos, $exifTool) = @_;
+    my $len = length $$dataPt;
+    my $str = '';
+    while ($pos + 2 <= $len) {
+        my $ch = substr($$dataPt, $pos, 2);
+        $pos += 2;
+        last if $ch eq "\0\0";
+        $str .= $ch;
+    }
+    $pos += 2 if $pos & 0x03;
+    my $to = $exifTool ? $exifTool->Options('Charset') : 'UTF8';
+    return (Image::ExifTool::Decode(undef,$str,'UCS2','II',$to), $pos);
+}
+
+#------------------------------------------------------------------------------
+# Process Windows PE Version Resource
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref
+# Returns: true on success
+sub ProcessPEVersion($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $pos = $$dirInfo{DirStart};
+    my $end = $pos + $$dirInfo{DirLen};
+    my ($index, $len, $valLen, $type, $string, $strEnd);
+
+    # get VS_VERSION_INFO
+    for ($index = 0; ; ++$index) {
+        $pos = ($pos + 3) & 0xfffffffc;  # align on a 4-byte boundary
+        last if $pos + 6 > $end;
+        $len = Get16u($dataPt, $pos);
+        $valLen = Get16u($dataPt, $pos + 2);
+        $type = Get16u($dataPt, $pos + 4);
+        return 0 unless $len or $valLen;  # prevent possible infinite loop
+        ($string, $strEnd) = ReadUnicodeStr($dataPt, $pos + 6);
+        return 0 if $strEnd + $valLen > $end;
+        unless ($index or $string eq 'VS_VERSION_INFO') {
+            $exifTool->Warn('Invalid Version Info block');
+            return 0;
+        }
+        if ($string eq 'VS_VERSION_INFO') {
+            # parse the fixed version info
+            $$dirInfo{DirStart} = $strEnd;
+            $$dirInfo{DirLen} = $valLen;
+            my $subTablePtr = GetTagTable('Image::ExifTool::EXE::PEVersion');
+            $exifTool->ProcessDirectory($dirInfo, $subTablePtr);
+            $pos = $strEnd + $valLen;
+        } elsif ($string eq 'StringFileInfo' and $valLen == 0) {
+            $pos += $len;
+            my $pt = $strEnd;
+            # parse string table
+            my $tagTablePtr = GetTagTable('Image::ExifTool::EXE::PEString');
+            for ($index = 0; $pt + 6 < $pos; ++$index) {
+                $len = Get16u($dataPt, $pt);
+                $valLen = Get16u($dataPt, $pt + 2);
+                # $type = Get16u($dataPt, $pt + 4);
+                # get tag ID (converted to UTF8)
+                ($string, $pt) = ReadUnicodeStr($dataPt, $pt + 6);
+                unless ($index) {
+                    # separate the language code and character set
+                    # (not sure what the CharacterSet tag is for, but the string
+                    # values stored here are UCS-2 in all my files even if the
+                    # CharacterSet is otherwise)
+                    my $char;
+                    if (length($string) > 4) {
+                        $char = substr($string, 4);
+                        $string = substr($string, 0, 4);
+                    }
+                    $exifTool->HandleTag($tagTablePtr, 'LanguageCode', uc $string);
+                    $exifTool->HandleTag($tagTablePtr, 'CharacterSet', uc $char) if $char;
+                    next;
+                }
+                my $tag = $string;
+                # create entry in tag table if it doesn't already exist
+                unless ($$tagTablePtr{$tag}) {
+                    my $name = $tag;
+                    $name =~ tr/-_a-zA-Z0-9//dc; # remove illegal characters
+                    next unless length $name;
+                    Image::ExifTool::AddTagToTable($tagTablePtr, $tag, { Name => $name });
+                }
+                # get tag value (converted to current Charset)
+                if ($valLen) {
+                    ($string, $pt) = ReadUnicodeStr($dataPt, $pt, $exifTool);
+                } else {
+                    $string = '';
+                }
+                $exifTool->HandleTag($tagTablePtr, $tag, $string);
+            }
+        } else {
+            $pos += $len + $valLen;
+            # ignore other information (for now)
+        }
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Process Windows PE Resources
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref
+# Returns: true on success
+sub ProcessPEResources($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my $base = $$dirInfo{Base};
+    my $dirStart = $$dirInfo{DirStart} + $base;
+    my $level = $$dirInfo{Level} || 0;
+    my $verbose = $exifTool->Options('Verbose');
+    my ($buff, $buf2, $item);
+
+    return 0 if $level > 10;    # protect against deep recursion
+    # read the resource header
+    $raf->Seek($dirStart, 0) and $raf->Read($buff, 16) == 16 or return 0;
+    my $nameEntries = Get16u(\$buff, 12);
+    my $idEntries = Get16u(\$buff, 14);
+    my $count = $nameEntries + $idEntries;
+    $raf->Read($buff, $count * 8) == $count * 8 or return 0;
+    # loop through all resource entries
+    for ($item=0; $item<$count; ++$item) {
+        my $pos = $item * 8;
+        my $name = Get32u(\$buff, $pos);
+        my $entryPos = Get32u(\$buff, $pos + 4);
+        unless ($level) {
+            # set resource type if this is the 0th level directory
+            my $resType = $resourceType{$name} || sprintf('Unknown (0x%x)', $name);
+            # ignore everything but the Version resource unless verbose
+            if ($verbose) {
+                $exifTool->VPrint(0, "$resType resource:\n");
+            } else {
+                next unless $resType eq 'Version';
+            }
+            $$dirInfo{ResType} = $resType;
+        }
+        if ($entryPos & 0x80000000) { # is this a directory?
+            # descend into next directory level
+            $$dirInfo{DirStart} = $entryPos & 0x7fffffff;
+            $$dirInfo{Level} = $level + 1;
+            ProcessPEResources($exifTool, $dirInfo) or return 0;
+            --$$dirInfo{Level};
+        } elsif ($$dirInfo{ResType} eq 'Version' and $level == 2 and
+            not $$dirInfo{GotVersion}) # (only process first Version resource)
+        {
+            # get position of this resource in the file
+            my $buf2;
+            $raf->Seek($entryPos + $base, 0) and $raf->Read($buf2, 16) == 16 or return 0;
+            my $off = Get32u(\$buf2, 0);
+            my $len = Get32u(\$buf2, 4);
+            # determine which section this is in so we can convert the virtual address
+            my ($section, $filePos);
+            foreach $section (@{$$dirInfo{Sections}}) {
+                next unless $off >= $$section{VirtualAddress} and
+                            $off <  $$section{VirtualAddress} + $$section{Size};
+                $filePos = $off + $$section{Base} - $$section{VirtualAddress};
+                last;
+            }
+            return 0 unless $filePos;
+            $raf->Seek($filePos, 0) and $raf->Read($buf2, $len) == $len or return 0;
+            ProcessPEVersion($exifTool, {
+                DataPt   => \$buf2,
+                DataLen  => $len,
+                DirStart => 0,
+                DirLen   => $len,
+            }) or $exifTool->Warn('Possibly corrupt Version resource');
+            $$dirInfo{GotVersion} = 1;  # set flag so we don't do this again
+        }
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Process Windows PE file data dictionary
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref
+# Returns: true on success
+sub ProcessPEDict($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my $dataPt = $$dirInfo{DataPt};
+    my $dirLen = length($$dataPt);
+    my ($pos, @sections, %dirInfo);
+
+    # loop through all sections
+    for ($pos=0; $pos+40<=$dirLen; $pos+=40) {
+        my $name = substr($$dataPt, $pos, 8);
+        my $va = Get32u($dataPt, $pos + 12);
+        my $size = Get32u($dataPt, $pos + 16);
+        my $offset = Get32u($dataPt, $pos + 20);
+        # remember the section offsets for the VirtualAddress lookup later
+        push @sections, { Base => $offset, Size => $size, VirtualAddress => $va };
+        # save details of the first resource section
+        %dirInfo = (
+            RAF      => $raf,
+            Base     => $offset,
+            DirStart => 0,   # (relative to Base)
+            DirLen   => $size,
+            Sections => \@sections,
+        ) if $name eq ".rsrc\0\0\0" and not %dirInfo;
+    }
+    # process the first resource section
+    ProcessPEResources($exifTool, \%dirInfo) or return 0 if %dirInfo;
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Extract information from an EXE file
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 on success, 0 if this wasn't a valid EXE file
+sub ProcessEXE($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my ($buff, $buf2, $type, $tagTablePtr, %dirInfo);
+
+    my $size = $raf->Read($buff, 0x40) or return 0;
+#
+# DOS and Windows EXE
+#
+    if ($buff =~ /^MZ/ and $size == 0x40) {
+        # DOS/Windows executable
+        # validate DOS header
+        # (ref http://www.delphidabbler.com/articles?article=8&part=2)
+        #   0  magic   : int16u    # Magic number ("MZ")
+        #   2  cblp    : int16u    # Bytes on last page of file
+        #   4  cp      : int16u    # Pages in file
+        #   6  crlc    : int16u    # Relocations
+        #   8  cparhdr : int16u    # Size of header in paragraphs
+        #  10  minalloc: int16u    # Minimum extra paragraphs needed
+        #  12  maxalloc: int16u    # Maximum extra paragraphs needed
+        #  14  ss      : int16u    # Initial (relative) SS value
+        #  16  sp      : int16u    # Initial SP value
+        #  18  csum    : int16u    # Checksum
+        #  20  ip      : int16u    # Initial IP value
+        #  22  cs      : int16u    # Initial (relative) CS value
+        #  24  lfarlc  : int16u    # Address of relocation table
+        #  26  ovno    : int16u    # Overlay number
+        #  28  res     : int16u[4] # Reserved words
+        #  36  oemid   : int16u    # OEM identifier (for oeminfo)
+        #  38  oeminfo : int16u    # OEM info; oemid specific
+        #  40  res2    : int16u[10]# Reserved words
+        #  60  lfanew  : int32u;   # File address of new exe header
+        SetByteOrder('II');
+        my ($cblp, $cp, $lfarlc, $lfanew) = unpack('x2v2x18vx34V', $buff);
+        my $fileSize = ($cp - ($cblp ? 1 : 0)) * 512 + $cblp;
+        return 0 if $fileSize < 0x40 or $fileSize < $lfarlc;
+        # read the Windows PE header
+        if ($lfarlc == 0x40 and $fileSize > $lfanew + 2 and
+            # read the Windows NE, PE or LE (virtual device driver) header
+            $raf->Seek($lfanew, 0) and $raf->Read($buff, 0x40) and
+            $buff =~ /^(NE|PE|LE)/)
+        {
+            if ($1 eq 'NE') {
+                if ($size >= 0x40) { # NE header is 64 bytes (ref 2)
+                    # check for DLL
+                    my $appFlags = Get16u(\$buff, 0x0c);
+                    $type = 'Win16 ' . ($appFlags & 0x80 ? 'DLL' : 'EXE');
+                    # offset 0x02 is 2 bytes with linker version and revision numbers
+                    # offset 0x36 is executable type (2 = Windows)
+                }
+            } elsif ($1 eq 'PE') {
+                # PE header comes at byte 4 in buff:
+                #   4 int16u Machine
+                #   6 int16u NumberOfSections
+                #   8 int32u TimeDateStamp
+                #  12 int32u PointerToSymbolTable
+                #  16 int32u NumberOfSymbols
+                #  20 int16u SizeOfOptionalHeader
+                #  22 int16u Characteristics
+                if ($size >= 24) {  # PE header is 24 bytes (plus optional header)
+                    my $flags = Get16u(\$buff, 22);
+                    $exifTool->SetFileType('Win32 ' . ($flags & 0x2000 ? 'DLL' : 'EXE'));
+                    # read the rest of the optional header if necessary
+                    my $optSize = Get16u(\$buff, 20);
+                    my $more = $optSize + 24 - $size;
+                    if ($more > 0) {
+                        if ($raf->Read($buf2, $more) == $more) {
+                            $buff .= $buf2;
+                            $size += $more;
+                            my $magic = Get16u(\$buff, 24);
+                            # verify PE32/PE32+ magic number
+                            unless ($magic == 0x10b or $magic == 0x20b) {
+                                $exifTool->Warn('Unknown PE magic number');
+                                return 1;
+                            }
+                        } else {
+                            $exifTool->Warn('Error reading optional header');
+                        }
+                    }
+                    # process PE COFF file header
+                    $tagTablePtr = GetTagTable('Image::ExifTool::EXE::Main');
+                    %dirInfo = (
+                        DataPt => \$buff,
+                        DataPos => $raf->Tell() - $size,
+                        DataLen => $size,
+                        DirStart => 4,
+                        DirLen => $size,
+                    );
+                    $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+                    # process data dictionary
+                    my $num = Get16u(\$buff, 6);    # NumberOfSections
+                    if ($raf->Read($buff, 40 * $num) == 40 * $num) {
+                        %dirInfo = (
+                            RAF => $raf,
+                            DataPt => \$buff,
+                        );
+                        ProcessPEDict($exifTool, \%dirInfo) or $exifTool->Warn('Error processing PE data dictionary');
+                    }
+                    return 1;
+                }
+            } else {
+                $type = 'Virtual Device Driver';
+            }
+        } else {
+            $type = 'DOS EXE';
+        }
+#
+# Mach-O (Mac OS X)
+#
+    } elsif ($buff =~ /^(\xca\xfe\xba\xbe|\xfe\xed\xfa(\xce|\xcf)|(\xce|\xcf)\xfa\xed\xfe)/ and $size > 12) {
+        # Mach-O executable
+        # (ref http://developer.apple.com/documentation/DeveloperTools/Conceptual/MachORuntime/Reference/reference.html)
+        $tagTablePtr = GetTagTable('Image::ExifTool::EXE::MachO');
+        if ($1 eq "\xca\xfe\xba\xbe") {
+            SetByteOrder('MM');
+            $exifTool->SetFileType('Mach-O fat binary executable');
+            my $count = Get32u(\$buff, 4);  # get architecture count
+            my $more = $count * 20 - ($size - 8);
+            if ($more > 0) {
+                unless ($raf->Read($buf2, $more) == $more) {
+                    $exifTool->Warn('Error reading fat-arch headers');
+                    return 1;
+                }
+                $buff .= $buf2;
+                $size += $more;
+            }
+            $exifTool->HandleTag($tagTablePtr, 2, $count);
+            my $i;
+            for ($i=0; $i<$count; ++$i) {
+                my $cpuType = Get32s(\$buff, 8 + $i * 20);
+                my $cpuSubtype = Get32u(\$buff, 12 + $i * 20);
+                $exifTool->HandleTag($tagTablePtr, 3, $cpuType);
+                $exifTool->HandleTag($tagTablePtr, 4, "$cpuType $cpuSubtype");
+            }
+            # load first Mach-O header to get the object file type
+            my $offset = Get32u(\$buff, 16);
+            if ($raf->Seek($offset, 0) and $raf->Read($buf2, 16) == 16) {
+                if ($buf2 =~ /^(\xfe\xed\xfa(\xce|\xcf)|(\xce|\xcf)\xfa\xed\xfe)/) {
+                    SetByteOrder($buf2 =~ /^\xfe\xed/ ? 'MM' : 'II');
+                    my $objType = Get32s(\$buf2, 12);
+                    $exifTool->HandleTag($tagTablePtr, 5, $objType);
+                } elsif ($buf2 =~ /^!<arch>\x0a/) {
+                    # .a libraries use this magic number
+                    $exifTool->HandleTag($tagTablePtr, 5, -1);
+                } else {
+                    $exifTool->Warn('Unrecognized object file type');
+                }
+            } else {
+                $exifTool->Warn('Error reading file');
+            }
+       } elsif ($size >= 16) {
+            $exifTool->SetFileType('Mach-O executable');
+            my $info = {
+                "\xfe\xed\xfa\xce" => ['32 bit', 'Big endian'],
+                "\xce\xfa\xed\xfe" => ['32 bit', 'Little endian'],
+                "\xfe\xed\xfa\xcf" => ['64 bit', 'Big endian'],
+                "\xcf\xfa\xed\xfe" => ['64 bit', 'Little endian'],
+            }->{substr($buff, 0, 4)};
+            my $byteOrder = ($buff =~ /^\xfe/) ? 'MM' : 'II';
+            SetByteOrder($byteOrder);
+            my $cpuType = Get32s(\$buff, 4);
+            my $cpuSubtype = Get32s(\$buff, 8);
+            my $objType = Get32s(\$buff, 12);
+            $exifTool->HandleTag($tagTablePtr, 0, $$info[0]);
+            $exifTool->HandleTag($tagTablePtr, 1, $$info[1]);
+            $exifTool->HandleTag($tagTablePtr, 3, $cpuType);
+            $exifTool->HandleTag($tagTablePtr, 4, "$cpuType $cpuSubtype");
+            $exifTool->HandleTag($tagTablePtr, 5, $objType);
+        }
+        return 1;
+#
+# PEF (classic MacOS)
+#
+    } elsif ($buff =~ /^Joy!peff/ and $size > 12) {
+        # ref http://developer.apple.com/documentation/mac/pdf/MacOS_RT_Architectures.pdf
+        $exifTool->SetFileType('Classic MacOS executable');
+        SetByteOrder('MM');
+        $tagTablePtr = GetTagTable('Image::ExifTool::EXE::PEF');
+        %dirInfo = (
+            DataPt => \$buff,
+            DataPos => 0,
+            DataLen => $size,
+            DirStart => 0,
+            DirLen => $size,
+        );
+        $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+        return 1;
+#
+# ELF (Unix)
+#
+    } elsif ($buff =~ /^\x7fELF/ and $size >= 16) {
+        $exifTool->SetFileType("ELF executable");
+        SetByteOrder(Get8u(\$buff,5) == 1 ? 'II' : 'MM');
+        $tagTablePtr = GetTagTable('Image::ExifTool::EXE::ELF');
+        %dirInfo = (
+            DataPt => \$buff,
+            DataPos => 0,
+            DataLen => $size,
+            DirStart => 0,
+            DirLen => $size,
+        );
+        $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+        return 1;
+#
+# various scripts (perl, sh, etc...)
+#
+    } elsif ($buff =~ m{^#!\s*/\S*bin/(\w+)}) {
+        $type = "$1 script";
+#
+# .a libraries
+#
+    } elsif ($buff =~ /^!<arch>\x0a/) {
+        $type = 'Static library',
+    }
+    return 0 unless $type;
+    $exifTool->SetFileType($type);
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::EXE - Read executable file meta information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to extract meta
+information from various types of Windows, MacOS and Unix executable and
+library files.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.openwatcom.org/ftp/devel/docs/pecoff.pdf>
+
+=item L<http://support.microsoft.com/kb/65122>
+
+=item L<http://www.opensource.apple.com>
+
+=item L<http://www.skyfree.org/linux/references/ELF_Format.pdf>
+
+=item L<http://msdn.microsoft.com/en-us/library/ms809762.aspx>
+
+=item L<http://code.google.com/p/pefile/>
+
+=item L<http://www.codeproject.com/KB/DLL/showver.aspx>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/EXE Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Exif.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Exif.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Exif.pm	(revision 24799)
@@ -0,0 +1,4199 @@
+#------------------------------------------------------------------------------
+# File:         Exif.pm
+#
+# Description:  Read EXIF/TIFF meta information
+#
+# Revisions:    11/25/2003 - P. Harvey Created
+#               02/06/2004 - P. Harvey Moved processing functions from ExifTool
+#               03/19/2004 - P. Harvey Check PreviewImage for validity
+#               11/11/2004 - P. Harvey Split off maker notes into MakerNotes.pm
+#               12/13/2004 - P. Harvey Added AUTOLOAD to load write routines
+#
+# References:   0) http://www.exif.org/Exif2-2.PDF
+#               1) http://partners.adobe.com/asn/developer/pdfs/tn/TIFF6.pdf
+#               2) http://www.adobe.com/products/dng/pdfs/dng_spec_1_3_0_0.pdf
+#               3) http://www.awaresystems.be/imaging/tiff/tifftags.html
+#               4) http://www.remotesensing.org/libtiff/TIFFTechNote2.html
+#               5) http://www.exif.org/dcf.PDF
+#               6) http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html
+#               7) http://www.fine-view.com/jp/lab/doc/ps6ffspecsv2.pdf
+#               8) http://www.ozhiker.com/electronics/pjmt/jpeg_info/meta.html
+#               9) http://hul.harvard.edu/jhove/tiff-tags.html
+#              10) http://partners.adobe.com/public/developer/en/tiff/TIFFPM6.pdf
+#              11) Robert Mucke private communication
+#              12) http://www.broomscloset.com/closet/photo/exif/TAG2000-22_DIS12234-2.PDF
+#              13) http://www.microsoft.com/whdc/xps/wmphoto.mspx
+#              14) http://www.asmail.be/msg0054681802.html
+#              15) http://crousseau.free.fr/imgfmt_raw.htm
+#              16) http://www.cybercom.net/~dcoffin/dcraw/
+#              17) http://www.digitalpreservation.gov/formats/content/tiff_tags.shtml
+#              18) http://www.asmail.be/msg0055568584.html
+#              19) http://libpsd.graphest.com/files/Photoshop%20File%20Formats.pdf
+#              20) http://tiki-lounge.com/~raf/tiff/fields.html
+#              21) http://community.roxen.com/developers/idocs/rfc/rfc3949.html
+#              22) http://tools.ietf.org/html/draft-ietf-fax-tiff-fx-extension1-01
+#              23) MetaMorph Stack (STK) Image File Format:
+#                  --> ftp://ftp.meta.moleculardevices.com/support/stack/STK.doc
+#              24) http://www.cipa.jp/english/hyoujunka/kikaku/pdf/DC-008-2010_E.pdf (Exif 2.3)
+#              25) Vesa Kivisto private communication (7D)
+#              26) Jeremy Brown private communication
+#              JD) Jens Duttke private communication
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Exif;
+
+use strict;
+use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber %intFormat
+            %lightSource %flash %compression %photometricInterpretation %orientation
+            %subfileType);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::MakerNotes;
+
+$VERSION = '3.21';
+
+sub ProcessExif($$$);
+sub WriteExif($$$);
+sub CheckExif($$$);
+sub RebuildMakerNotes($$$);
+sub EncodeExifText($$);
+sub ValidateIFD($;$);
+sub ProcessTiffIFD($$$);
+sub PrintParameter($$$);
+sub GetOffList($$$$$);
+sub PrintLensInfo($);
+sub ConvertLensInfo($);
+
+# size limit for loading binary data block into memory
+sub BINARY_DATA_LIMIT { return 10 * 1024 * 1024; }
+
+# byte sizes for the various EXIF format types below
+@formatSize = (undef,1,1,2,4,8,1,1,2,4,8,4,8,4,2,8,8,8,8);
+
+@formatName = (
+    undef, 'int8u', 'string', 'int16u',
+    'int32u', 'rational64u', 'int8s', 'undef',
+    'int16s', 'int32s', 'rational64s', 'float',
+    'double', 'ifd', 'unicode', 'complex',
+    'int64u', 'int64s', 'ifd64', # (new BigTIFF formats)
+);
+
+# hash to look up EXIF format numbers by name
+# (format types are all lower case)
+%formatNumber = (
+    'int8u'       => 1,  # BYTE
+    'string'      => 2,  # ASCII
+    'int16u'      => 3,  # SHORT
+    'int32u'      => 4,  # LONG
+    'rational64u' => 5,  # RATIONAL
+    'int8s'       => 6,  # SBYTE
+    'undef'       => 7,  # UNDEFINED
+    'binary'      => 7,  # (treat binary data as undef)
+    'int16s'      => 8,  # SSHORT
+    'int32s'      => 9,  # SLONG
+    'rational64s' => 10, # SRATIONAL
+    'float'       => 11, # FLOAT
+    'double'      => 12, # DOUBLE
+    'ifd'         => 13, # IFD (with int32u format)
+    'unicode'     => 14, # UNICODE [see Note below]
+    'complex'     => 15, # COMPLEX [see Note below]
+    'int64u'      => 16, # LONG8 [BigTIFF]
+    'int64s'      => 17, # SLONG8 [BigTIFF]
+    'ifd64'       => 18, # IFD8 (with int64u format) [BigTIFF]
+    # Note: unicode and complex types are not yet properly supported by ExifTool.
+    # These are types which have been observed in the Adobe DNG SDK code, but
+    # aren't fully supported there either.  We know the sizes, but that's about it.
+    # We don't know if the unicode is null terminated, or the format for complex
+    # (although I suspect it would be two 4-byte floats, real and imaginary).
+);
+
+# lookup for integer format strings
+%intFormat = (
+    'int8u'  => 1,
+    'int16u' => 3,
+    'int32u' => 4,
+    'int8s'  => 6,
+    'int16s' => 8,
+    'int32s' => 9,
+    'ifd'    => 13,
+    'int64u' => 16,
+    'int64s' => 17,
+    'ifd64'  => 18,
+);
+
+# EXIF LightSource PrintConv values
+%lightSource = (
+    0 => 'Unknown',
+    1 => 'Daylight',
+    2 => 'Fluorescent',
+    3 => 'Tungsten (Incandescent)',
+    4 => 'Flash',
+    9 => 'Fine Weather',
+    10 => 'Cloudy',
+    11 => 'Shade',
+    12 => 'Daylight Fluorescent',   # (D 5700 - 7100K)
+    13 => 'Day White Fluorescent',  # (N 4600 - 5500K)
+    14 => 'Cool White Fluorescent', # (W 3800 - 4500K)
+    15 => 'White Fluorescent',      # (WW 3250 - 3800K)
+    16 => 'Warm White Fluorescent', # (L 2600 - 3250K)
+    17 => 'Standard Light A',
+    18 => 'Standard Light B',
+    19 => 'Standard Light C',
+    20 => 'D55',
+    21 => 'D65',
+    22 => 'D75',
+    23 => 'D50',
+    24 => 'ISO Studio Tungsten',
+    255 => 'Other',
+);
+
+# EXIF Flash values
+%flash = (
+    OTHER => sub {
+        # translate "Off" and "On" when writing
+        my ($val, $inv) = @_;
+        return undef unless $inv and $val =~ /^(off|on)$/i;
+        return lc $val eq 'off' ? 0x00 : 0x01;
+    },
+    0x00 => 'No Flash',
+    0x01 => 'Fired',
+    0x05 => 'Fired, Return not detected',
+    0x07 => 'Fired, Return detected',
+    0x08 => 'On, Did not fire', # not charged up?
+    0x09 => 'On, Fired',
+    0x0d => 'On, Return not detected',
+    0x0f => 'On, Return detected',
+    0x10 => 'Off, Did not fire',
+    0x14 => 'Off, Did not fire, Return not detected',
+    0x18 => 'Auto, Did not fire',
+    0x19 => 'Auto, Fired',
+    0x1d => 'Auto, Fired, Return not detected',
+    0x1f => 'Auto, Fired, Return detected',
+    0x20 => 'No flash function',
+    0x30 => 'Off, No flash function',
+    0x41 => 'Fired, Red-eye reduction',
+    0x45 => 'Fired, Red-eye reduction, Return not detected',
+    0x47 => 'Fired, Red-eye reduction, Return detected',
+    0x49 => 'On, Red-eye reduction',
+    0x4d => 'On, Red-eye reduction, Return not detected',
+    0x4f => 'On, Red-eye reduction, Return detected',
+    0x50 => 'Off, Red-eye reduction',
+    0x58 => 'Auto, Did not fire, Red-eye reduction',
+    0x59 => 'Auto, Fired, Red-eye reduction',
+    0x5d => 'Auto, Fired, Red-eye reduction, Return not detected',
+    0x5f => 'Auto, Fired, Red-eye reduction, Return detected',
+);
+
+# TIFF Compression values
+# (values with format "Xxxxx XXX Compressed" are used to identify RAW file types)
+%compression = (
+    1 => 'Uncompressed',
+    2 => 'CCITT 1D',
+    3 => 'T4/Group 3 Fax',
+    4 => 'T6/Group 4 Fax',
+    5 => 'LZW',
+    6 => 'JPEG (old-style)', #3
+    7 => 'JPEG', #4
+    8 => 'Adobe Deflate', #3
+    9 => 'JBIG B&W', #3
+    10 => 'JBIG Color', #3
+    99 => 'JPEG', #16
+    262 => 'Kodak 262', #16
+    32766 => 'Next', #3
+    32767 => 'Sony ARW Compressed', #16
+    32769 => 'Packed RAW', #PH (used by Epson, Nikon, Samsung)
+    32770 => 'Samsung SRW Compressed', #PH
+    32771 => 'CCIRLEW', #3
+    32773 => 'PackBits',
+    32809 => 'Thunderscan', #3
+    32867 => 'Kodak KDC Compressed', #PH
+    32895 => 'IT8CTPAD', #3
+    32896 => 'IT8LW', #3
+    32897 => 'IT8MP', #3
+    32898 => 'IT8BL', #3
+    32908 => 'PixarFilm', #3
+    32909 => 'PixarLog', #3
+    32946 => 'Deflate', #3
+    32947 => 'DCS', #3
+    34661 => 'JBIG', #3
+    34676 => 'SGILog', #3
+    34677 => 'SGILog24', #3
+    34712 => 'JPEG 2000', #3
+    34713 => 'Nikon NEF Compressed', #PH
+    34715 => 'JBIG2 TIFF FX', #20
+    34718 => 'Microsoft Document Imaging (MDI) Binary Level Codec', #18
+    34719 => 'Microsoft Document Imaging (MDI) Progressive Transform Codec', #18
+    34720 => 'Microsoft Document Imaging (MDI) Vector', #18
+    65000 => 'Kodak DCR Compressed', #PH
+    65535 => 'Pentax PEF Compressed', #Jens
+);
+
+%photometricInterpretation = (
+    0 => 'WhiteIsZero',
+    1 => 'BlackIsZero',
+    2 => 'RGB',
+    3 => 'RGB Palette',
+    4 => 'Transparency Mask',
+    5 => 'CMYK',
+    6 => 'YCbCr',
+    8 => 'CIELab',
+    9 => 'ICCLab', #3
+    10 => 'ITULab', #3
+    32803 => 'Color Filter Array', #2
+    32844 => 'Pixar LogL', #3
+    32845 => 'Pixar LogLuv', #3
+    34892 => 'Linear Raw', #2
+);
+
+%orientation = (
+    1 => 'Horizontal (normal)',
+    2 => 'Mirror horizontal',
+    3 => 'Rotate 180',
+    4 => 'Mirror vertical',
+    5 => 'Mirror horizontal and rotate 270 CW',
+    6 => 'Rotate 90 CW',
+    7 => 'Mirror horizontal and rotate 90 CW',
+    8 => 'Rotate 270 CW',
+);
+
+%subfileType = (
+    0 => 'Full-resolution Image',
+    1 => 'Reduced-resolution image',
+    2 => 'Single page of multi-page image',
+    3 => 'Single page of multi-page reduced-resolution image',
+    4 => 'Transparency mask',
+    5 => 'Transparency mask of reduced-resolution image',
+    6 => 'Transparency mask of multi-page image',
+    7 => 'Transparency mask of reduced-resolution multi-page image',
+    0xffffffff => 'invalid', #(found in E5700 NEF's)
+    BITMASK => {
+        0 => 'Reduced resolution',
+        1 => 'Single page',
+        2 => 'Transparency mask',
+        3 => 'TIFF/IT final page', #20
+        4 => 'TIFF-FX mixed raster content', #20
+    },
+);
+
+# PrintConv for parameter tags
+%Image::ExifTool::Exif::printParameter = (
+    PrintConv => {
+        0 => 'Normal',
+        OTHER => \&Image::ExifTool::Exif::PrintParameter,
+    },
+);
+
+# ValueConv that makes long values binary type
+my %longBin = (
+    ValueConv => 'length($val) > 64 ? \$val : $val',
+    ValueConvInv => '$val',
+);
+
+# PrintConv for SampleFormat (0x153)
+my %sampleFormat = (
+    1 => 'Unsigned',        # unsigned integer
+    2 => 'Signed',          # two's complement signed integer
+    3 => 'Float',           # IEEE floating point
+    4 => 'Undefined',
+    5 => 'Complex int',     # complex integer (ref 3)
+    6 => 'Complex float',   # complex IEEE floating point (ref 3)
+);
+
+# main EXIF tag table
+%Image::ExifTool::Exif::Main = (
+    GROUPS => { 0 => 'EXIF', 1 => 'IFD0', 2 => 'Image'},
+    WRITE_PROC => \&WriteExif,
+    WRITE_GROUP => 'ExifIFD',   # default write group
+    SET_GROUP1 => 1, # set group1 name to directory name for all tags in table
+    0x1 => {
+        Name => 'InteropIndex',
+        Description => 'Interoperability Index',
+        PrintConv => {
+            R98 => 'R98 - DCF basic file (sRGB)',
+            R03 => 'R03 - DCF option file (Adobe RGB)',
+            THM => 'THM - DCF thumbnail file',
+        },
+    },
+    0x2 => { #5
+        Name => 'InteropVersion',
+        Description => 'Interoperability Version',
+        RawConv => '$val=~s/\0+$//; $val',  # (some idiots add null terminators)
+    },
+    0x0b => { #PH
+        Name => 'ProcessingSoftware',
+        Notes => 'used by ACD Systems Digital Imaging',
+    },
+    0xfe => {
+        Name => 'SubfileType',
+        # set priority directory if this is the full resolution image
+        DataMember => 'SubfileType',
+        RawConv => '$self->SetPriorityDir() if $val eq "0"; $$self{SubfileType} = $val',
+        PrintConv => \%subfileType,
+    },
+    0xff => {
+        Name => 'OldSubfileType',
+        # set priority directory if this is the full resolution image
+        RawConv => '$self->SetPriorityDir() if $val eq "1"; $val',
+        PrintConv => {
+            1 => 'Full-resolution image',
+            2 => 'Reduced-resolution image',
+            3 => 'Single page of multi-page image',
+        },
+    },
+    0x100 => {
+        Name => 'ImageWidth',
+        # even though Group 1 is set dynamically we need to register IFD1 once
+        # so it will show up in the group lists
+        Groups => { 1 => 'IFD1' },
+        # Note: priority 0 tags automatically have their priority increased for the
+        # priority direcory (the directory with a SubfileType of "Full-resolution image")
+        Priority => 0,
+    },
+    0x101 => {
+        Name => 'ImageHeight',
+        Notes => 'called ImageLength by the EXIF spec.',
+        Priority => 0,
+    },
+    0x102 => {
+        Name => 'BitsPerSample',
+        Priority => 0,
+    },
+    0x103 => {
+        Name => 'Compression',
+        DataMember => 'Compression',
+        SeparateTable => 'Compression',
+        RawConv => q{
+            Image::ExifTool::Exif::IdentifyRawFile($self, $val);
+            return $$self{Compression} = $val;
+        },
+        PrintConv => \%compression,
+        Priority => 0,
+    },
+    0x106 => {
+        Name => 'PhotometricInterpretation',
+        PrintConv => \%photometricInterpretation,
+        Priority => 0,
+    },
+    0x107 => {
+        Name => 'Thresholding',
+        PrintConv => {
+            1 => 'No dithering or halftoning',
+            2 => 'Ordered dither or halftone',
+            3 => 'Randomized dither',
+        },
+    },
+    0x108 => 'CellWidth',
+    0x109 => 'CellLength',
+    0x10a => {
+        Name => 'FillOrder',
+        PrintConv => {
+            1 => 'Normal',
+            2 => 'Reversed',
+        },
+    },
+    0x10d => 'DocumentName',
+    0x10e => {
+        Name => 'ImageDescription',
+        Priority => 0,
+    },
+    0x10f => {
+        Name => 'Make',
+        Groups => { 2 => 'Camera' },
+        DataMember => 'Make',
+        # remove trailing blanks and save as an ExifTool member variable
+        RawConv => '$val =~ s/\s+$//; $$self{Make} = $val',
+        # NOTE: trailing "blanks" (spaces) are removed from all EXIF tags which
+        # may be "unknown" (filled with spaces) according to the EXIF spec.
+        # This allows conditional replacement with "exiftool -TAG-= -TAG=VALUE".
+        # - also removed are any other trailing whitespace characters
+    },
+    0x110 => {
+        Name => 'Model',
+        Description => 'Camera Model Name',
+        Groups => { 2 => 'Camera' },
+        DataMember => 'Model',
+        # remove trailing blanks and save as an ExifTool member variable
+        RawConv => '$val =~ s/\s+$//; $$self{Model} = $val',
+    },
+    0x111 => [
+        {
+            Condition => q[
+                $$self{TIFF_TYPE} eq 'MRW' and $$self{DIR_NAME} eq 'IFD0' and
+                $$self{Model} =~ /^DiMAGE A200/
+            ],
+            Name => 'StripOffsets',
+            IsOffset => 1,
+            OffsetPair => 0x117,  # point to associated byte counts
+            # A200 stores this information in the wrong byte order!!
+            ValueConv => '$val=join(" ",unpack("N*",pack("V*",split(" ",$val))));\$val',
+            ByteOrder => 'LittleEndian',
+        },
+        {
+            Condition => q[
+                ($$self{TIFF_TYPE} ne 'CR2' or $$self{DIR_NAME} ne 'IFD0') and
+                ($$self{TIFF_TYPE} ne 'DNG' or $$self{DIR_NAME} !~ /^SubIFD[12]$/)
+            ],
+            Name => 'StripOffsets',
+            IsOffset => 1,
+            OffsetPair => 0x117,  # point to associated byte counts
+            ValueConv => 'length($val) > 32 ? \$val : $val',
+        },
+        {
+            Condition => '$$self{DIR_NAME} eq "IFD0"',
+            Name => 'PreviewImageStart',
+            IsOffset => 1,
+            OffsetPair => 0x117,
+            Notes => q{
+                PreviewImageStart in IFD0 of CR2 images and SubIFD1 of DNG images, and
+                JpgFromRawStart in SubIFD2 of DNG images
+            },
+            DataTag => 'PreviewImage',
+            Writable => 'int32u',
+            WriteGroup => 'IFD0',
+            WriteCondition => '$$self{TIFF_TYPE} eq "CR2"',
+            Protected => 2,
+        },
+        {
+            Condition => '$$self{DIR_NAME} eq "SubIFD1"',
+            Name => 'PreviewImageStart',
+            IsOffset => 1,
+            OffsetPair => 0x117,
+            DataTag => 'PreviewImage',
+            Writable => 'int32u',
+            WriteGroup => 'SubIFD1',
+            WriteCondition => '$$self{TIFF_TYPE} eq "DNG"',
+            Protected => 2,
+        },
+        {
+            Name => 'JpgFromRawStart',
+            IsOffset => 1,
+            OffsetPair => 0x117,
+            DataTag => 'JpgFromRaw',
+            Writable => 'int32u',
+            WriteGroup => 'SubIFD2',
+            WriteCondition => '$$self{TIFF_TYPE} eq "DNG"',
+            Protected => 2,
+        },
+    ],
+    0x112 => {
+        Name => 'Orientation',
+        PrintConv => \%orientation,
+        Priority => 0,  # so PRIORITY_DIR takes precedence
+    },
+    0x115 => {
+        Name => 'SamplesPerPixel',
+        Priority => 0,
+    },
+    0x116 => {
+        Name => 'RowsPerStrip',
+        Priority => 0,
+    },
+    0x117 => [
+        {
+            Condition => q[
+                $$self{TIFF_TYPE} eq 'MRW' and $$self{DIR_NAME} eq 'IFD0' and
+                $$self{Model} =~ /^DiMAGE A200/
+            ],
+            Name => 'StripByteCounts',
+            OffsetPair => 0x111,   # point to associated offset
+            # A200 stores this information in the wrong byte order!!
+            ValueConv => '$val=join(" ",unpack("N*",pack("V*",split(" ",$val))));\$val',
+            ByteOrder => 'LittleEndian',
+        },
+        {
+            Condition => q[
+                ($$self{TIFF_TYPE} ne 'CR2' or $$self{DIR_NAME} ne 'IFD0') and
+                ($$self{TIFF_TYPE} ne 'DNG' or $$self{DIR_NAME} !~ /^SubIFD[12]$/)
+            ],
+            Name => 'StripByteCounts',
+            OffsetPair => 0x111,   # point to associated offset
+            ValueConv => 'length($val) > 32 ? \$val : $val',
+        },
+        {
+            Condition => '$$self{DIR_NAME} eq "IFD0"',
+            Name => 'PreviewImageLength',
+            OffsetPair => 0x111,
+            Notes => q{
+                PreviewImageLength in IFD0 of CR2 images and SubIFD1 of DNG images, and
+                JpgFromRawLength in SubIFD2 of DNG images
+            },
+            DataTag => 'PreviewImage',
+            Writable => 'int32u',
+            WriteGroup => 'IFD0',
+            WriteCondition => '$$self{TIFF_TYPE} eq "CR2"',
+            Protected => 2,
+        },
+        {
+            Condition => '$$self{DIR_NAME} eq "SubIFD1"',
+            Name => 'PreviewImageLength',
+            OffsetPair => 0x111,
+            DataTag => 'PreviewImage',
+            Writable => 'int32u',
+            WriteGroup => 'SubIFD1',
+            WriteCondition => '$$self{TIFF_TYPE} eq "DNG"',
+            Protected => 2,
+        },
+        {
+            Name => 'JpgFromRawLength',
+            OffsetPair => 0x111,
+            DataTag => 'JpgFromRaw',
+            Writable => 'int32u',
+            WriteGroup => 'SubIFD2',
+            WriteCondition => '$$self{TIFF_TYPE} eq "DNG"',
+            Protected => 2,
+        },
+    ],
+    0x118 => 'MinSampleValue',
+    0x119 => 'MaxSampleValue',
+    0x11a => {
+        Name => 'XResolution',
+        Priority => 0,  # so PRIORITY_DIR takes precedence
+    },
+    0x11b => {
+        Name => 'YResolution',
+        Priority => 0,
+    },
+    0x11c => {
+        Name => 'PlanarConfiguration',
+        PrintConv => {
+            1 => 'Chunky',
+            2 => 'Planar',
+        },
+        Priority => 0,
+    },
+    0x11d => 'PageName',
+    0x11e => 'XPosition',
+    0x11f => 'YPosition',
+    0x120 => {
+        Name => 'FreeOffsets',
+        IsOffset => 1,
+        OffsetPair => 0x121,
+        ValueConv => 'length($val) > 32 ? \$val : $val',
+    },
+    0x121 => {
+        Name => 'FreeByteCounts',
+        OffsetPair => 0x120,
+        ValueConv => 'length($val) > 32 ? \$val : $val',
+    },
+    0x122 => {
+        Name => 'GrayResponseUnit',
+        PrintConv => { #3
+            1 => 0.1,
+            2 => 0.001,
+            3 => 0.0001,
+            4 => 0.00001,
+            5 => 0.000001,
+        },
+    },
+    0x123 => {
+        Name => 'GrayResponseCurve',
+        Binary => 1,
+    },
+    0x124 => {
+        Name => 'T4Options',
+        PrintConv => { BITMASK => {
+            0 => '2-Dimensional encoding',
+            1 => 'Uncompressed',
+            2 => 'Fill bits added',
+        } }, #3
+    },
+    0x125 => {
+        Name => 'T6Options',
+        PrintConv => { BITMASK => {
+            1 => 'Uncompressed',
+        } }, #3
+    },
+    0x128 => {
+        Name => 'ResolutionUnit',
+        Notes => 'the value 1 is not standard EXIF',
+        PrintConv => {
+            1 => 'None',
+            2 => 'inches',
+            3 => 'cm',
+        },
+        Priority => 0,
+    },
+    0x129 => 'PageNumber',
+    0x12c => 'ColorResponseUnit', #9
+    0x12d => {
+        Name => 'TransferFunction',
+        Binary => 1,
+    },
+    0x131 => {
+        Name => 'Software',
+        RawConv => '$val =~ s/\s+$//; $val', # trim trailing blanks
+    },
+    0x132 => {
+        Name => 'ModifyDate',
+        Groups => { 2 => 'Time' },
+        Notes => 'called DateTime by the EXIF spec.',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    0x13b => {
+        Name => 'Artist',
+        Groups => { 2 => 'Author' },
+        Notes => 'becomes a list-type tag when the MWG module is loaded',
+        RawConv => '$val =~ s/\s+$//; $val', # trim trailing blanks
+    },
+    0x13c => 'HostComputer',
+    0x13d => {
+        Name => 'Predictor',
+        PrintConv => {
+            1 => 'None',
+            2 => 'Horizontal differencing',
+        },
+    },
+    0x13e => {
+        Name => 'WhitePoint',
+        Groups => { 2 => 'Camera' },
+    },
+    0x13f => {
+        Name => 'PrimaryChromaticities',
+        Priority => 0,
+    },
+    0x140 => {
+        Name => 'ColorMap',
+        Format => 'binary',
+        Binary => 1,
+    },
+    0x141 => 'HalftoneHints',
+    0x142 => 'TileWidth',
+    0x143 => 'TileLength',
+    0x144 => {
+        Name => 'TileOffsets',
+        IsOffset => 1,
+        OffsetPair => 0x145,
+        ValueConv => 'length($val) > 32 ? \$val : $val',
+    },
+    0x145 => {
+        Name => 'TileByteCounts',
+        OffsetPair => 0x144,
+        ValueConv => 'length($val) > 32 ? \$val : $val',
+    },
+    0x146 => 'BadFaxLines', #3
+    0x147 => { #3
+        Name => 'CleanFaxData',
+        PrintConv => {
+            0 => 'Clean',
+            1 => 'Regenerated',
+            2 => 'Unclean',
+        },
+    },
+    0x148 => 'ConsecutiveBadFaxLines', #3
+    0x14a => [
+        {
+            Name => 'SubIFD',
+            # use this opportunity to identify an ARW image, and if so we
+            # must decide if this is a SubIFD or the A100 raw data
+            # (use SubfileType, Compression and FILE_TYPE to identify ARW/SR2,
+            # then call SetARW to finish the job)
+            Condition => q{
+                $$self{DIR_NAME} ne 'IFD0' or $$self{FILE_TYPE} ne 'TIFF' or
+                $$self{Make} !~ /^SONY/ or
+                not $$self{SubfileType} or $$self{SubfileType} != 1 or
+                not $$self{Compression} or $$self{Compression} != 6 or
+                not require Image::ExifTool::Sony or
+                Image::ExifTool::Sony::SetARW($self, $valPt)
+            },
+            Groups => { 1 => 'SubIFD' },
+            Flags => 'SubIFD',
+            SubDirectory => {
+                Start => '$val',
+                MaxSubdirs => 3,
+            },
+        },
+        { #16
+            Name => 'A100DataOffset',
+            Notes => 'the data offset in original Sony DSLR-A100 ARW images',
+            DataMember => 'A100DataOffset',
+            RawConv => '$$self{A100DataOffset} = $val',
+            IsOffset => 1,
+        },
+    ],
+    0x14c => {
+        Name => 'InkSet',
+        PrintConv => { #3
+            1 => 'CMYK',
+            2 => 'Not CMYK',
+        },
+    },
+    0x14d => 'InkNames', #3
+    0x14e => 'NumberofInks', #3
+    0x150 => 'DotRange',
+    0x151 => 'TargetPrinter',
+    0x152 => {
+        Name => 'ExtraSamples',
+        PrintConv => { #20
+            0 => 'Unspecified',
+            1 => 'Associated Alpha',
+            2 => 'Unassociated Alpha',
+        },
+    },
+    0x153 => {
+        Name => 'SampleFormat',
+        Notes => 'SamplesPerPixel values',
+        PrintConvColumns => 2,
+        PrintConv => [ \%sampleFormat, \%sampleFormat, \%sampleFormat, \%sampleFormat ],
+    },
+    0x154 => 'SMinSampleValue',
+    0x155 => 'SMaxSampleValue',
+    0x156 => 'TransferRange',
+    0x157 => 'ClipPath', #3
+    0x158 => 'XClipPathUnits', #3
+    0x159 => 'YClipPathUnits', #3
+    0x15a => { #3
+        Name => 'Indexed',
+        PrintConv => { 0 => 'Not indexed', 1 => 'Indexed' },
+    },
+    0x15b => {
+        Name => 'JPEGTables',
+        Binary => 1,
+    },
+    0x15f => { #10
+        Name => 'OPIProxy',
+        PrintConv => {
+            0 => 'Higher resolution image does not exist',
+            1 => 'Higher resolution image exists',
+        },
+    },
+    # 0x181 => 'Decode', #20 (typo! - should be 0x1b1, ref 21)
+    # 0x182 => 'DefaultImageColor', #20 (typo! - should be 0x1b2, ref 21)
+    0x190 => { #3
+        Name => 'GlobalParametersIFD',
+        Groups => { 1 => 'GlobParamIFD' },
+        Flags => 'SubIFD',
+        SubDirectory => {
+            DirName => 'GlobParamIFD',
+            Start => '$val',
+        },
+    },
+    0x191 => { #3
+        Name => 'ProfileType',
+        PrintConv => { 0 => 'Unspecified', 1 => 'Group 3 FAX' },
+    },
+    0x192 => { #3
+        Name => 'FaxProfile',
+        PrintConv => {
+            0 => 'Unknown',
+            1 => 'Minimal B&W lossless, S',
+            2 => 'Extended B&W lossless, F',
+            3 => 'Lossless JBIG B&W, J',
+            4 => 'Lossy color and grayscale, C',
+            5 => 'Lossless color and grayscale, L',
+            6 => 'Mixed raster content, M',
+            7 => 'Profile T', #20
+            255 => 'Multi Profiles', #20
+        },
+    },
+    0x193 => { #3
+        Name => 'CodingMethods',
+        PrintConv => { BITMASK => {
+            0 => 'Unspecified compression',
+            1 => 'Modified Huffman',
+            2 => 'Modified Read',
+            3 => 'Modified MR',
+            4 => 'JBIG',
+            5 => 'Baseline JPEG',
+            6 => 'JBIG color',
+        } },
+    },
+    0x194 => 'VersionYear', #3
+    0x195 => 'ModeNumber', #3
+    0x1b1 => 'Decode', #3
+    0x1b2 => 'DefaultImageColor', #3 (changed to ImageBaseColor, ref 21)
+    0x1b3 => 'T82Options', #20
+    0x1b5 => { #19
+        Name => 'JPEGTables',
+        Binary => 1,
+    },
+    0x200 => {
+        Name => 'JPEGProc',
+        PrintConv => {
+            1 => 'Baseline',
+            14 => 'Lossless',
+        },
+    },
+    0x201 => [
+        {
+            Name => 'ThumbnailOffset',
+            Notes => q{
+                ThumbnailOffset in IFD1 of JPEG and some TIFF-based images, IFD0 of MRW
+                images and AVI videos, and the SubIFD in IFD1 of SRW images;
+                PreviewImageStart in MakerNotes and IFD0 of ARW and SR2 images;
+                JpgFromRawStart in SubIFD of NEF images and IFD2 of PEF images; and
+                OtherImageStart in everything else
+            },
+            # thumbnail is found in IFD1 of JPEG and TIFF images, and
+            # IFD0 of EXIF information in FujiFilm AVI (RIFF) videos
+            Condition => q{
+                $$self{DIR_NAME} eq 'IFD1' or
+                ($$self{FILE_TYPE} eq 'RIFF' and $$self{DIR_NAME} eq 'IFD0')
+            },
+            IsOffset => 1,
+            OffsetPair => 0x202,
+            DataTag => 'ThumbnailImage',
+            Writable => 'int32u',
+            WriteGroup => 'IFD1',
+            # according to the EXIF spec. a JPEG-compressed thumbnail image may not
+            # be stored in a TIFF file, but these TIFF-based RAW image formats
+            # use IFD1 for a JPEG-compressed thumbnail:  CR2, ARW, SR2 and PEF.
+            # (SRF also stores a JPEG image in IFD1, but it is actually a preview
+            # and we don't yet write SRF anyway) 
+            WriteCondition => q{
+                $$self{FILE_TYPE} ne "TIFF" or
+                $$self{TIFF_TYPE} =~ /^(CR2|ARW|SR2|PEF)$/
+            },
+            Protected => 2,
+        },
+        {
+            Name => 'ThumbnailOffset',
+            # thumbnail in IFD0 of MRW images (Minolta A200)
+            Condition => '$$self{DIR_NAME} eq "IFD0" and $$self{TIFF_TYPE} eq "MRW"',
+            IsOffset => 1,
+            OffsetPair => 0x202,
+            # A200 uses the wrong base offset for this pointer!!
+            WrongBase => '$$self{Model} =~ /^DiMAGE A200/ ? $$self{MRW_WrongBase} : undef',
+            DataTag => 'ThumbnailImage',
+            Writable => 'int32u',
+            WriteGroup => 'IFD0',
+            WriteCondition => '$$self{FILE_TYPE} eq "MRW"',
+            Protected => 2,
+        },
+        {
+            Name => 'ThumbnailOffset',
+            # in SubIFD of IFD1 in Samsung SRW images
+            Condition => q{
+                $$self{TIFF_TYPE} eq 'SRW' and $$self{DIR_NAME} eq 'SubIFD' and
+                $$self{PATH}[-2] eq 'IFD1'
+            },
+            IsOffset => 1,
+            OffsetPair => 0x202,
+            DataTag => 'ThumbnailImage',
+            Writable => 'int32u',
+            WriteGroup => 'SubIFD',
+            WriteCondition => '$$self{TIFF_TYPE} eq "SRW"',
+            Protected => 2,
+        },
+        {
+            Name => 'PreviewImageStart',
+            Condition => '$$self{DIR_NAME} eq "MakerNotes"',
+            IsOffset => 1,
+            OffsetPair => 0x202,
+            DataTag => 'PreviewImage',
+            Writable => 'int32u',
+            WriteGroup => 'MakerNotes',
+            # (no WriteCondition necessary because MakerNotes won't be created)
+            Protected => 2,
+        },
+        {
+            Name => 'PreviewImageStart',
+            # PreviewImage in IFD0 of ARW and SR2 files for all models
+            Condition => '$$self{DIR_NAME} eq "IFD0" and $$self{TIFF_TYPE} =~ /^(ARW|SR2)$/',
+            IsOffset => 1,
+            OffsetPair => 0x202,
+            DataTag => 'PreviewImage',
+            Writable => 'int32u',
+            WriteGroup => 'IFD0',
+            WriteCondition => '$$self{TIFF_TYPE} =~ /^(ARW|SR2)$/',
+            Protected => 2,
+        },
+        {
+            Name => 'JpgFromRawStart',
+            Condition => '$$self{DIR_NAME} eq "SubIFD"',
+            IsOffset => 1,
+            OffsetPair => 0x202,
+            DataTag => 'JpgFromRaw',
+            Writable => 'int32u',
+            WriteGroup => 'SubIFD',
+            # JpgFromRaw is in SubIFD of NEF, NRW and SRW files
+            WriteCondition => '$$self{TIFF_TYPE} =~ /^(NEF|NRW|SRW)$/',
+            Protected => 2,
+        },
+        {
+            Name => 'JpgFromRawStart',
+            Condition => '$$self{DIR_NAME} eq "IFD2"',
+            IsOffset => 1,
+            OffsetPair => 0x202,
+            DataTag => 'JpgFromRaw',
+            Writable => 'int32u',
+            WriteGroup => 'IFD2',
+            # JpgFromRaw is in IFD2 of PEF files
+            WriteCondition => '$$self{TIFF_TYPE} eq "PEF"',
+            Protected => 2,
+        },
+        {
+            Name => 'OtherImageStart',
+            IsOffset => 1,
+            OffsetPair => 0x202,
+        },
+    ],
+    0x202 => [
+        {
+            Name => 'ThumbnailLength',
+            Notes => q{
+                ThumbnailLength in IFD1 of JPEG and some TIFF-based images, IFD0 of MRW
+                images and AVI videos, and the SubIFD in IFD1 of SRW images;
+                PreviewImageLength in MakerNotes and IFD0 of ARW and SR2 images;
+                JpgFromRawLength in SubIFD of NEF images, and IFD2 of PEF images; and
+                OtherImageLength in everything else
+            },
+            Condition => q{
+                $$self{DIR_NAME} eq 'IFD1' or
+                ($$self{FILE_TYPE} eq 'RIFF' and $$self{DIR_NAME} eq 'IFD0')
+            },
+            OffsetPair => 0x201,
+            DataTag => 'ThumbnailImage',
+            Writable => 'int32u',
+            WriteGroup => 'IFD1',
+            WriteCondition => q{
+                $$self{FILE_TYPE} ne "TIFF" or
+                $$self{TIFF_TYPE} =~ /^(CR2|ARW|SR2|PEF)$/
+            },
+            Protected => 2,
+        },
+        {
+            Name => 'ThumbnailLength',
+            # thumbnail in IFD0 of MRW images (Minolta A200)
+            Condition => '$$self{DIR_NAME} eq "IFD0" and $$self{TIFF_TYPE} eq "MRW"',
+            OffsetPair => 0x201,
+            DataTag => 'ThumbnailImage',
+            Writable => 'int32u',
+            WriteGroup => 'IFD0',
+            WriteCondition => '$$self{FILE_TYPE} eq "MRW"',
+            Protected => 2,
+        },
+        {
+            Name => 'ThumbnailLength',
+            # in SubIFD of IFD1 in Samsung SRW images
+            Condition => q{
+                $$self{TIFF_TYPE} eq 'SRW' and $$self{DIR_NAME} eq 'SubIFD' and
+                $$self{PATH}[-2] eq 'IFD1'
+            },
+            OffsetPair => 0x201,
+            DataTag => 'ThumbnailImage',
+            Writable => 'int32u',
+            WriteGroup => 'SubIFD',
+            WriteCondition => '$$self{TIFF_TYPE} eq "SRW"',
+            Protected => 2,
+        },
+        {
+            Name => 'PreviewImageLength',
+            Condition => '$$self{DIR_NAME} eq "MakerNotes"',
+            OffsetPair => 0x201,
+            DataTag => 'PreviewImage',
+            Writable => 'int32u',
+            WriteGroup => 'MakerNotes',
+            # (no WriteCondition necessary because MakerNotes won't be created)
+            Protected => 2,
+        },
+        {
+            Name => 'PreviewImageLength',
+            # PreviewImage in IFD0 of ARW and SR2 files for all models
+            Condition => '$$self{DIR_NAME} eq "IFD0" and $$self{TIFF_TYPE} =~ /^(ARW|SR2)$/',
+            OffsetPair => 0x201,
+            DataTag => 'PreviewImage',
+            Writable => 'int32u',
+            WriteGroup => 'IFD0',
+            WriteCondition => '$$self{TIFF_TYPE} =~ /^(ARW|SR2)$/',
+            Protected => 2,
+        },
+        {
+            Name => 'JpgFromRawLength',
+            Condition => '$$self{DIR_NAME} eq "SubIFD"',
+            OffsetPair => 0x201,
+            DataTag => 'JpgFromRaw',
+            Writable => 'int32u',
+            WriteGroup => 'SubIFD',
+            WriteCondition => '$$self{TIFF_TYPE} =~ /^(NEF|NRW|SRW)$/',
+            Protected => 2,
+        },
+        {
+            Name => 'JpgFromRawLength',
+            Condition => '$$self{DIR_NAME} eq "IFD2"',
+            OffsetPair => 0x201,
+            DataTag => 'JpgFromRaw',
+            Writable => 'int32u',
+            WriteGroup => 'IFD2',
+            WriteCondition => '$$self{TIFF_TYPE} eq "PEF"',
+            Protected => 2,
+        },
+        {
+            Name => 'OtherImageLength',
+            OffsetPair => 0x201,
+        },
+    ],
+    0x203 => 'JPEGRestartInterval',
+    0x205 => 'JPEGLosslessPredictors',
+    0x206 => 'JPEGPointTransforms',
+    0x207 => {
+        Name => 'JPEGQTables',
+        IsOffset => 1,
+        # this tag is not supported for writing, so define an
+        # invalid offset pair to cause a "No size tag" error to be
+        # generated if we try to write a file containing this tag
+        OffsetPair => -1,
+    },
+    0x208 => {
+        Name => 'JPEGDCTables',
+        IsOffset => 1,
+        OffsetPair => -1, # (see comment for JPEGQTables)
+    },
+    0x209 => {
+        Name => 'JPEGACTables',
+        IsOffset => 1,
+        OffsetPair => -1, # (see comment for JPEGQTables)
+    },
+    0x211 => {
+        Name => 'YCbCrCoefficients',
+        Priority => 0,
+    },
+    0x212 => {
+        Name => 'YCbCrSubSampling',
+        PrintConvColumns => 2,
+        PrintConv => \%Image::ExifTool::JPEG::yCbCrSubSampling,
+        Priority => 0,
+    },
+    0x213 => {
+        Name => 'YCbCrPositioning',
+        PrintConv => {
+            1 => 'Centered',
+            2 => 'Co-sited',
+        },
+        Priority => 0,
+    },
+    0x214 => {
+        Name => 'ReferenceBlackWhite',
+        Priority => 0,
+    },
+    0x22f => 'StripRowCounts',
+    0x2bc => {
+        Name => 'ApplicationNotes', # (writable directory!)
+        Writable => 'int8u',
+        Format => 'undef',
+        Flags => [ 'Binary', 'Protected' ],
+        # this could be an XMP block
+        SubDirectory => {
+            DirName => 'XMP',
+            TagTable => 'Image::ExifTool::XMP::Main',
+        },
+    },
+    0x3e7 => 'USPTOMiscellaneous', #20
+    0x1000 => 'RelatedImageFileFormat', #5
+    0x1001 => 'RelatedImageWidth', #5
+    0x1002 => { #5
+        Name => 'RelatedImageHeight',
+        Notes => 'called RelatedImageLength by the DCF spec.',
+    },
+    # (0x474x tags written by MicrosoftPhoto)
+    0x4746 => 'Rating', #PH
+    0x4747 => { # (written by Digital Image Pro)
+        Name => 'XP_DIP_XML',
+        Format => 'undef',
+        # the following reference indicates this is Unicode:
+        # http://social.msdn.microsoft.com/Forums/en-US/isvvba/thread/ce6edcbb-8fc2-40c6-ad98-85f5d835ddfb
+        ValueConv => '$self->Decode($val,"UCS2","II")',
+    }, 
+    0x4748 => {
+        Name => 'StitchInfo',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Microsoft::Stitch',
+            ByteOrder => 'LittleEndian', #PH (NC)
+        },
+    },
+    0x4749 => 'RatingPercent', #PH
+    0x800d => 'ImageID', #10
+    0x80a3 => { Name => 'WangTag1', Binary => 1 }, #20
+    0x80a4 => { Name => 'WangAnnotation', Binary => 1 },
+    0x80a5 => { Name => 'WangTag3', Binary => 1 }, #20
+    0x80a6 => { #20
+        Name => 'WangTag4',
+        PrintConv => 'length($val) <= 64 ? $val : \$val',
+    },
+    0x80e3 => 'Matteing', #9
+    0x80e4 => 'DataType', #9
+    0x80e5 => 'ImageDepth', #9
+    0x80e6 => 'TileDepth', #9
+    0x827d => 'Model2',
+    0x828d => 'CFARepeatPatternDim', #12
+    0x828e => {
+        Name => 'CFAPattern2', #12
+        Format => 'int8u',  # (written incorrectly as 'undef' in Nikon NRW images)
+    },
+    0x828f => { #12
+        Name => 'BatteryLevel',
+        Groups => { 2 => 'Camera' },
+    },
+    0x8290 => {
+        Name => 'KodakIFD',
+        Groups => { 1 => 'KodakIFD' },
+        Flags => 'SubIFD',
+        Notes => 'used in various types of Kodak images',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::IFD',
+            DirName => 'KodakIFD',
+            Start => '$val',
+        },
+    },
+    0x8298 => {
+        Name => 'Copyright',
+        Groups => { 2 => 'Author' },
+        Format => 'undef',
+        Notes => q{
+            may contain copyright notices for photographer and editor, separated by a
+            newline in ExifTool
+        },
+        # internally the strings are separated by a null character in this format:
+        # Photographer only: photographer + NULL
+        # Both:              photographer + NULL + editor + NULL
+        # Editor only:       SPACE + NULL + editor + NULL
+        # 1) translate first NULL to a newline, removing trailing blanks
+        # 2) truncate at second NULL and remove trailing blanks
+        # 3) remove trailing newline if it exists
+        # (this is done as a RawConv so conditional replaces will work properly)
+        RawConv => '$_=$val; s/ *\0/\n/; s/ *\0.*//s; s/\n$//; $_',
+    },
+    0x829a => {
+        Name => 'ExposureTime',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+    },
+    0x829d => {
+        Name => 'FNumber',
+        PrintConv => 'sprintf("%.1f",$val)',
+    },
+    0x82a5 => { #3
+        Name => 'MDFileTag',
+        Notes => 'tags 0x82a5-0x82ac are used in Molecular Dynamics GEL files',
+    },
+    0x82a6 => 'MDScalePixel', #3
+    0x82a7 => 'MDColorTable', #3
+    0x82a8 => 'MDLabName', #3
+    0x82a9 => 'MDSampleInfo', #3
+    0x82aa => 'MDPrepDate', #3
+    0x82ab => 'MDPrepTime', #3
+    0x82ac => 'MDFileUnits', #3
+    0x830e => 'PixelScale',
+    0x8335 => 'AdventScale', #20
+    0x8336 => 'AdventRevision', #20
+    0x835c => 'UIC1Tag', #23
+    0x835d => 'UIC2Tag', #23
+    0x835e => 'UIC3Tag', #23
+    0x835f => 'UIC4Tag', #23
+    0x83bb => { #12
+        Name => 'IPTC-NAA', # (writable directory!)
+        # this should actually be written as 'undef' (see
+        # http://www.awaresystems.be/imaging/tiff/tifftags/iptc.html),
+        # but Photoshop writes it as int32u and Nikon Capture won't read
+        # anything else, so we do the same thing here...  Doh!
+        Format => 'undef',      # convert binary values as undef
+        Writable => 'int32u',   # but write int32u format code in IFD
+        WriteGroup => 'IFD0',
+        Flags => [ 'Binary', 'Protected' ],
+        SubDirectory => {
+            DirName => 'IPTC',
+            TagTable => 'Image::ExifTool::IPTC::Main',
+        },
+    },
+    0x847e => 'IntergraphPacketData', #3
+    0x847f => 'IntergraphFlagRegisters', #3
+    0x8480 => 'IntergraphMatrix',
+    0x8481 => 'INGRReserved', #20
+    0x8482 => {
+        Name => 'ModelTiePoint',
+        Groups => { 2 => 'Location' },
+    },
+    0x84e0 => 'Site', #9
+    0x84e1 => 'ColorSequence', #9
+    0x84e2 => 'IT8Header', #9
+    0x84e3 => { #9
+        Name => 'RasterPadding',
+        PrintConv => { #20
+            0 => 'Byte',
+            1 => 'Word',
+            2 => 'Long Word',
+            9 => 'Sector',
+            10 => 'Long Sector',
+        },
+    },
+    0x84e4 => 'BitsPerRunLength', #9
+    0x84e5 => 'BitsPerExtendedRunLength', #9
+    0x84e6 => 'ColorTable', #9
+    0x84e7 => { #9
+        Name => 'ImageColorIndicator',
+        PrintConv => { #20
+            0 => 'Unspecified Image Color',
+            1 => 'Specified Image Color',
+        },
+    },
+    0x84e8 => { #9
+        Name => 'BackgroundColorIndicator',
+        PrintConv => { #20
+            0 => 'Unspecified Background Color',
+            1 => 'Specified Background Color',
+        },
+    },
+    0x84e9 => 'ImageColorValue', #9
+    0x84ea => 'BackgroundColorValue', #9
+    0x84eb => 'PixelIntensityRange', #9
+    0x84ec => 'TransparencyIndicator', #9
+    0x84ed => 'ColorCharacterization', #9
+    0x84ee => { #9
+        Name => 'HCUsage',
+        PrintConv => { #20
+            0 => 'CT',
+            1 => 'Line Art',
+            2 => 'Trap',
+        },
+    },
+    0x84ef => 'TrapIndicator', #17
+    0x84f0 => 'CMYKEquivalent', #17
+    0x8546 => { #11
+        Name => 'SEMInfo',
+        Notes => 'found in some scanning electron microscope images',
+    },
+    0x8568 => {
+        Name => 'AFCP_IPTC',
+        SubDirectory => {
+            # must change directory name so we don't create this directory
+            DirName => 'AFCP_IPTC',
+            TagTable => 'Image::ExifTool::IPTC::Main',
+        },
+    },
+    0x85b8 => 'PixelMagicJBIGOptions', #20
+    0x85d8 => {
+        Name => 'ModelTransform',
+        Groups => { 2 => 'Location' },
+    },
+    0x8602 => { #16
+        Name => 'WB_GRGBLevels',
+        Notes => 'found in IFD0 of Leaf MOS images',
+    },
+    # 0x8603 - Leaf CatchLight color matrix (ref 16)
+    0x8606 => {
+        Name => 'LeafData',
+        Format => 'undef',    # avoid converting huge block to string of int8u's!
+        SubDirectory => {
+            DirName => 'LeafIFD',
+            TagTable => 'Image::ExifTool::Leaf::Main',
+        },
+    },
+    0x8649 => { #19
+        Name => 'PhotoshopSettings',
+        Format => 'binary',
+        SubDirectory => {
+            DirName => 'Photoshop',
+            TagTable => 'Image::ExifTool::Photoshop::Main',
+        },
+    },
+    0x8769 => {
+        Name => 'ExifOffset',
+        Groups => { 1 => 'ExifIFD' },
+        SubIFD => 2,
+        SubDirectory => {
+            DirName => 'ExifIFD',
+            Start => '$val',
+        },
+    },
+    0x8773 => {
+        Name => 'ICC_Profile',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::ICC_Profile::Main',
+        },
+    },
+    0x877f => { #20
+        Name => 'TIFF_FXExtensions',
+        PrintConv => { BITMASK => {
+            0 => 'Resolution/Image Width',
+            1 => 'N Layer Profile M',
+            2 => 'Shared Data',
+            3 => 'B&W JBIG2',
+            4 => 'JBIG2 Profile M',
+        }},
+    },
+    0x8780 => { #20
+        Name => 'MultiProfiles',
+        PrintConv => { BITMASK => {
+            0 => 'Profile S',
+            1 => 'Profile F',
+            2 => 'Profile J',
+            3 => 'Profile C',
+            4 => 'Profile L',
+            5 => 'Profile M',
+            6 => 'Profile T',
+            7 => 'Resolution/Image Width',
+            8 => 'N Layer Profile M',
+            9 => 'Shared Data',
+            10 => 'JBIG2 Profile M',
+        }},
+    },
+    0x8781 => { #22
+        Name => 'SharedData',
+        IsOffset => 1,
+        # this tag is not supported for writing, so define an
+        # invalid offset pair to cause a "No size tag" error to be
+        # generated if we try to write a file containing this tag
+        OffsetPair => -1,
+    },
+    0x8782 => 'T88Options', #20
+    0x87ac => 'ImageLayer',
+    0x87af => {
+        Name => 'GeoTiffDirectory',
+        Format => 'binary',
+        Binary => 1,
+    },
+    0x87b0 => {
+        Name => 'GeoTiffDoubleParams',
+        Format => 'binary',
+        Binary => 1,
+    },
+    0x87b1 => {
+        Name => 'GeoTiffAsciiParams',
+        Binary => 1,
+    },
+    0x8822 => {
+        Name => 'ExposureProgram',
+        Groups => { 2 => 'Camera' },
+        Notes => 'the value of 9 is not standard EXIF, but is used by the Canon EOS 7D',
+        PrintConv => {
+            0 => 'Not Defined',
+            1 => 'Manual',
+            2 => 'Program AE',
+            3 => 'Aperture-priority AE',
+            4 => 'Shutter speed priority AE',
+            5 => 'Creative (Slow speed)',
+            6 => 'Action (High speed)',
+            7 => 'Portrait',
+            8 => 'Landscape',
+            9 => 'Bulb', #25
+        },
+    },
+    0x8824 => {
+        Name => 'SpectralSensitivity',
+        Groups => { 2 => 'Camera' },
+    },
+    0x8825 => {
+        Name => 'GPSInfo',
+        Groups => { 1 => 'GPS' },
+        Flags => 'SubIFD',
+        SubDirectory => {
+            DirName => 'GPS',
+            TagTable => 'Image::ExifTool::GPS::Main',
+            Start => '$val',
+        },
+    },
+    0x8827 => {
+        Name => 'ISO',
+        Notes => q{
+            called ISOSpeedRatings by EXIF 2.2, then PhotographicSensitivity by the EXIF
+            2.3 spec.
+        },
+        PrintConv => '$val=~s/\s+/, /g; $val',
+    },
+    0x8828 => {
+        Name => 'Opto-ElectricConvFactor',
+        Notes => 'called OECF by the EXIF spec.',
+        Binary => 1,
+    },
+    0x8829 => 'Interlace', #12
+    0x882a => 'TimeZoneOffset', #12
+    0x882b => 'SelfTimerMode', #12
+    0x8830 => { #24
+        Name => 'SensitivityType',
+        Notes => 'applies to EXIF:ISO tag',
+        PrintConv => {
+            0 => 'Unknown',
+            1 => 'Standard Output Sensitivity',
+            2 => 'Recommended Exposure Index',
+            3 => 'ISO Speed',
+            4 => 'Standard Output Sensitivity and Recommended Exposure Index',
+            5 => 'Standard Output Sensitivity and ISO Speed',
+            6 => 'Recommended Exposure Index and ISO Speed',
+            7 => 'Standard Output Sensitivity, Recommended Exposure Index and ISO Speed',
+        },
+    },
+    0x8831 => 'StandardOutputSensitivity', #24
+    0x8832 => 'RecommendedExposureIndex', #24
+    0x8833 => 'ISOSpeed', #24
+    0x8834 => { #24
+        Name => 'ISOSpeedLatitudeyyy',
+        Description => 'ISO Speed Latitude yyy',
+    },
+    0x8835 => { #24
+        Name => 'ISOSpeedLatitudezzz',
+        Description => 'ISO Speed Latitude zzz',
+    },
+    0x885c => 'FaxRecvParams', #9
+    0x885d => 'FaxSubAddress', #9
+    0x885e => 'FaxRecvTime', #9
+    0x888a => { #PH
+        Name => 'LeafSubIFD',
+        Format => 'int32u',     # Leaf incorrectly uses 'undef' format!
+        Groups => { 1 => 'LeafSubIFD' },
+        Flags => 'SubIFD',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Leaf::SubIFD',
+            Start => '$val',
+        },
+    },
+    0x9000 => {
+        Name => 'ExifVersion',
+        RawConv => '$val=~s/\0+$//; $val',  # (some idiots add null terminators)
+    },
+    0x9003 => {
+        Name => 'DateTimeOriginal',
+        Description => 'Date/Time Original',
+        Groups => { 2 => 'Time' },
+        Notes => 'date/time when original image was taken',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    0x9004 => {
+        Name => 'CreateDate',
+        Groups => { 2 => 'Time' },
+        Notes => 'called DateTimeDigitized by the EXIF spec.',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    0x9101 => {
+        Name => 'ComponentsConfiguration',
+        Format => 'int8u',
+        PrintConvColumns => 2,
+        PrintConv => {
+            0 => '-',
+            1 => 'Y',
+            2 => 'Cb',
+            3 => 'Cr',
+            4 => 'R',
+            5 => 'G',
+            6 => 'B',
+            OTHER => sub {
+                my ($val, $inv, $conv) = @_;
+                my @a = split /,?\s+/, $val;
+                if ($inv) {
+                    my %invConv;
+                    $invConv{lc $$conv{$_}} = $_ foreach keys %$conv;
+                    # strings like "YCbCr" and "RGB" still work for writing
+                    @a = $a[0] =~ /(Y|Cb|Cr|R|G|B)/g if @a == 1;
+                    foreach (@a) {
+                        $_ = $invConv{lc $_};
+                        return undef unless defined $_;
+                    }
+                    push @a, 0 while @a < 4;
+                } else {
+                    foreach (@a) {
+                        $_ = $$conv{$_} || "Err ($_)";
+                    }
+                }
+                return join ', ', @a;
+            },
+        },
+    },
+    0x9102 => 'CompressedBitsPerPixel',
+    0x9201 => {
+        Name => 'ShutterSpeedValue',
+        Format => 'rational64s', # Leica M8 patch (incorrectly written as rational64u)
+        ValueConv => 'abs($val)<100 ? 2**(-$val) : 0',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+    },
+    0x9202 => {
+        Name => 'ApertureValue',
+        ValueConv => '2 ** ($val / 2)',
+        PrintConv => 'sprintf("%.1f",$val)',
+    },
+    0x9203 => 'BrightnessValue',
+    0x9204 => {
+        Name => 'ExposureCompensation',
+        Format => 'rational64s', # Leica M8 patch (incorrectly written as rational64u)
+        Notes => 'called ExposureBiasValue by the EXIF spec.',
+        PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
+    },
+    0x9205 => {
+        Name => 'MaxApertureValue',
+        Groups => { 2 => 'Camera' },
+        ValueConv => '2 ** ($val / 2)',
+        PrintConv => 'sprintf("%.1f",$val)',
+    },
+    0x9206 => {
+        Name => 'SubjectDistance',
+        Groups => { 2 => 'Camera' },
+        PrintConv => '$val =~ /^(inf|undef)$/ ? $val : "${val} m"',
+    },
+    0x9207 => {
+        Name => 'MeteringMode',
+        Groups => { 2 => 'Camera' },
+        PrintConv => {
+            0 => 'Unknown',
+            1 => 'Average',
+            2 => 'Center-weighted average',
+            3 => 'Spot',
+            4 => 'Multi-spot',
+            5 => 'Multi-segment',
+            6 => 'Partial',
+            255 => 'Other',
+        },
+    },
+    0x9208 => {
+        Name => 'LightSource',
+        Groups => { 2 => 'Camera' },
+        SeparateTable => 'LightSource',
+        PrintConv => \%lightSource,
+    },
+    0x9209 => {
+        Name => 'Flash',
+        Groups => { 2 => 'Camera' },
+        Flags => 'PrintHex',
+        SeparateTable => 'Flash',
+        PrintConv => \%flash,
+    },
+    0x920a => {
+        Name => 'FocalLength',
+        Groups => { 2 => 'Camera' },
+        PrintConv => 'sprintf("%.1f mm",$val)',
+    },
+    # Note: tags 0x920b-0x9217 are duplicates of 0xa20b-0xa217
+    # (The TIFF standard uses 0xa2xx, but you'll find both in images)
+    0x920b => { #12
+        Name => 'FlashEnergy',
+        Groups => { 2 => 'Camera' },
+    },
+    0x920c => 'SpatialFrequencyResponse', #12 (not in Fuji images - PH)
+    0x920d => 'Noise', #12
+    0x920e => 'FocalPlaneXResolution', #12
+    0x920f => 'FocalPlaneYResolution', #12
+    0x9210 => { #12
+        Name => 'FocalPlaneResolutionUnit',
+        Groups => { 2 => 'Camera' },
+        PrintConv => {
+            1 => 'None',
+            2 => 'inches',
+            3 => 'cm',
+            4 => 'mm',
+            5 => 'um',
+        },
+    },
+    0x9211 => 'ImageNumber', #12
+    0x9212 => { #12
+        Name => 'SecurityClassification',
+        PrintConv => {
+            T => 'Top Secret',
+            S => 'Secret',
+            C => 'Confidential',
+            R => 'Restricted',
+            U => 'Unclassified',
+        },
+    },
+    0x9213 => 'ImageHistory', #12
+    0x9214 => {
+        Name => 'SubjectArea',
+        Groups => { 2 => 'Camera' },
+    },
+    0x9215 => 'ExposureIndex', #12
+    0x9216 => 'TIFF-EPStandardID', #12
+    0x9217 => { #12
+        Name => 'SensingMethod',
+        Groups => { 2 => 'Camera' },
+        Notes => 'values 1 and 6 are not standard EXIF',
+        PrintConv => {
+            1 => 'Monochrome area', #12 (not standard EXIF)
+            2 => 'One-chip color area',
+            3 => 'Two-chip color area',
+            4 => 'Three-chip color area',
+            5 => 'Color sequential area',
+            6 => 'Monochrome linear', #12 (not standard EXIF)
+            7 => 'Trilinear',
+            8 => 'Color sequential linear',
+        },
+    },
+    0x9213 => 'ImageHistory',
+    0x923a => 'CIP3DataFile', #20
+    0x923b => 'CIP3Sheet', #20
+    0x923c => 'CIP3Side', #20
+    0x923f => 'StoNits', #9
+    # handle maker notes as a conditional list
+    0x927c => \@Image::ExifTool::MakerNotes::Main,
+    0x9286 => {
+        Name => 'UserComment',
+        # may consider forcing a Format of 'undef' for this tag because I have
+        # seen other applications write it incorrectly as 'string' or 'int8u'
+        RawConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val)',
+    },
+    0x9290 => {
+        Name => 'SubSecTime',
+        Groups => { 2 => 'Time' },
+        ValueConv => '$val=~s/ +$//; $val', # trim trailing blanks
+    },
+    0x9291 => {
+        Name => 'SubSecTimeOriginal',
+        Groups => { 2 => 'Time' },
+        ValueConv => '$val=~s/ +$//; $val', # trim trailing blanks
+    },
+    0x9292 => {
+        Name => 'SubSecTimeDigitized',
+        Groups => { 2 => 'Time' },
+        ValueConv => '$val=~s/ +$//; $val', # trim trailing blanks
+    },
+    # The following 3 tags are found in MSOffice TIFF images
+    # References:
+    # http://social.msdn.microsoft.com/Forums/en-US/os_standocs/thread/03086d55-294a-49d5-967a-5303d34c40f8/
+    # http://blogs.msdn.com/openspecification/archive/2009/12/08/details-of-three-tiff-tag-extensions-that-microsoft-office-document-imaging-modi-software-may-write-into-the-tiff-files-it-generates.aspx
+    # http://www.microsoft.com/downloads/details.aspx?FamilyID=0dbc435d-3544-4f4b-9092-2f2643d64a39&displaylang=en#filelist
+    0x932f => 'MSDocumentText',
+    0x9330 => {
+        Name => 'MSPropertySetStorage',
+        Binary => 1,
+    },
+    0x9331 => {
+        Name => 'MSDocumentTextPosition',
+        Binary => 1, # (just in case -- don't know what format this is)
+    },
+    0x935c => { #3/19
+        Name => 'ImageSourceData',
+        Binary => 1,
+    },
+    0x9c9b => {
+        Name => 'XPTitle',
+        Format => 'undef',
+        ValueConv => '$self->Decode($val,"UCS2","II")',
+    },
+    0x9c9c => {
+        Name => 'XPComment',
+        Format => 'undef',
+        ValueConv => '$self->Decode($val,"UCS2","II")',
+    },
+    0x9c9d => {
+        Name => 'XPAuthor',
+        Groups => { 2 => 'Author' },
+        Format => 'undef',
+        ValueConv => '$self->Decode($val,"UCS2","II")',
+    },
+    0x9c9e => {
+        Name => 'XPKeywords',
+        Format => 'undef',
+        ValueConv => '$self->Decode($val,"UCS2","II")',
+    },
+    0x9c9f => {
+        Name => 'XPSubject',
+        Format => 'undef',
+        ValueConv => '$self->Decode($val,"UCS2","II")',
+    },
+    0xa000 => {
+        Name => 'FlashpixVersion',
+        RawConv => '$val=~s/\0+$//; $val',  # (some idiots add null terminators)
+    },
+    0xa001 => {
+        Name => 'ColorSpace',
+        Notes => q{
+            the value of 0x2 is not standard EXIF.  Instead, an Adobe RGB image is
+            indicated by "Uncalibrated" with an InteropIndex of "R03".  The values
+            0xfffd and 0xfffe are also non-standard, and are used by some Sony cameras
+        },
+        PrintHex => 1,
+        PrintConv => {
+            1 => 'sRGB',
+            2 => 'Adobe RGB',
+            0xffff => 'Uncalibrated',
+            # Sony uses these definitions: (ref JD)
+            # 0xffff => 'Adobe RGB', (conflicts with Uncalibrated)
+            0xfffe => 'ICC Profile',
+            0xfffd => 'Wide Gamut RGB',
+        },
+    },
+    0xa002 => {
+        Name => 'ExifImageWidth',
+        Notes => 'called PixelXDimension by the EXIF spec.',
+    },
+    0xa003 => {
+        Name => 'ExifImageHeight',
+        Notes => 'called PixelYDimension by the EXIF spec.',
+    },
+    0xa004 => 'RelatedSoundFile',
+    0xa005 => {
+        Name => 'InteropOffset',
+        Groups => { 1 => 'InteropIFD' },
+        Flags => 'SubIFD',
+        Description => 'Interoperability Offset',
+        SubDirectory => {
+            DirName => 'InteropIFD',
+            Start => '$val',
+        },
+    },
+    0xa20b => {
+        Name => 'FlashEnergy',
+        Groups => { 2 => 'Camera' },
+    },
+    0xa20c => {
+        Name => 'SpatialFrequencyResponse',
+        PrintConv => 'Image::ExifTool::Exif::PrintSFR($val)',
+    },
+    0xa20d => 'Noise',
+    0xa20e => { Name => 'FocalPlaneXResolution', Groups => { 2 => 'Camera' } },
+    0xa20f => { Name => 'FocalPlaneYResolution', Groups => { 2 => 'Camera' } },
+    0xa210 => {
+        Name => 'FocalPlaneResolutionUnit',
+        Groups => { 2 => 'Camera' },
+        Notes => 'values 1, 4 and 5 are not standard EXIF',
+        PrintConv => {
+            1 => 'None', # (not standard EXIF)
+            2 => 'inches',
+            3 => 'cm',
+            4 => 'mm',   # (not standard EXIF)
+            5 => 'um',   # (not standard EXIF)
+        },
+    },
+    0xa211 => 'ImageNumber',
+    0xa212 => 'SecurityClassification',
+    0xa213 => 'ImageHistory',
+    0xa214 => {
+        Name => 'SubjectLocation',
+        Groups => { 2 => 'Camera' },
+    },
+    0xa215 => 'ExposureIndex',
+    0xa216 => 'TIFF-EPStandardID',
+    0xa217 => {
+        Name => 'SensingMethod',
+        Groups => { 2 => 'Camera' },
+        PrintConv => {
+            1 => 'Not defined',
+            2 => 'One-chip color area',
+            3 => 'Two-chip color area',
+            4 => 'Three-chip color area',
+            5 => 'Color sequential area',
+            7 => 'Trilinear',
+            8 => 'Color sequential linear',
+        },
+    },
+    0xa300 => {
+        Name => 'FileSource',
+        PrintConv => {
+            1 => 'Film Scanner',
+            2 => 'Reflection Print Scanner',
+            3 => 'Digital Camera',
+            # handle the case where Sigma incorrectly gives this tag a count of 4
+            "\3\0\0\0" => 'Sigma Digital Camera',
+        },
+    },
+    0xa301 => {
+        Name => 'SceneType',
+        PrintConv => {
+            1 => 'Directly photographed',
+        },
+    },
+    0xa302 => {
+        Name => 'CFAPattern',
+        PrintConv => 'Image::ExifTool::Exif::PrintCFAPattern($val)',
+    },
+    0xa401 => {
+        Name => 'CustomRendered',
+        PrintConv => {
+            0 => 'Normal',
+            1 => 'Custom',
+        },
+    },
+    0xa402 => {
+        Name => 'ExposureMode',
+        Groups => { 2 => 'Camera' },
+        PrintConv => {
+            0 => 'Auto',
+            1 => 'Manual',
+            2 => 'Auto bracket',
+            # have seen 3 for Samsung EX1 images - PH
+        },
+    },
+    0xa403 => {
+        Name => 'WhiteBalance',
+        Groups => { 2 => 'Camera' },
+        # set Priority to zero to keep this WhiteBalance from overriding the
+        # MakerNotes WhiteBalance, since the MakerNotes WhiteBalance and is more
+        # accurate and contains more information (if it exists)
+        Priority => 0,
+        PrintConv => {
+            0 => 'Auto',
+            1 => 'Manual',
+        },
+    },
+    0xa404 => {
+        Name => 'DigitalZoomRatio',
+        Groups => { 2 => 'Camera' },
+    },
+    0xa405 => {
+        Name => 'FocalLengthIn35mmFormat',
+        Notes => 'called FocalLengthIn35mmFilm by the EXIF spec.',
+        Groups => { 2 => 'Camera' },
+        PrintConv => '"$val mm"',
+    },
+    0xa406 => {
+        Name => 'SceneCaptureType',
+        Groups => { 2 => 'Camera' },
+        PrintConv => {
+            0 => 'Standard',
+            1 => 'Landscape',
+            2 => 'Portrait',
+            3 => 'Night',
+        },
+    },
+    0xa407 => {
+        Name => 'GainControl',
+        Groups => { 2 => 'Camera' },
+        PrintConv => {
+            0 => 'None',
+            1 => 'Low gain up',
+            2 => 'High gain up',
+            3 => 'Low gain down',
+            4 => 'High gain down',
+        },
+    },
+    0xa408 => {
+        Name => 'Contrast',
+        Groups => { 2 => 'Camera' },
+        PrintConv => {
+            0 => 'Normal',
+            1 => 'Low',
+            2 => 'High',
+        },
+    },
+    0xa409 => {
+        Name => 'Saturation',
+        Groups => { 2 => 'Camera' },
+        PrintConv => {
+            0 => 'Normal',
+            1 => 'Low',
+            2 => 'High',
+        },
+    },
+    0xa40a => {
+        Name => 'Sharpness',
+        Groups => { 2 => 'Camera' },
+        PrintConv => {
+            0 => 'Normal',
+            1 => 'Soft',
+            2 => 'Hard',
+        },
+    },
+    0xa40b => {
+        Name => 'DeviceSettingDescription',
+        Groups => { 2 => 'Camera' },
+        Binary => 1,
+    },
+    0xa40c => {
+        Name => 'SubjectDistanceRange',
+        Groups => { 2 => 'Camera' },
+        PrintConv => {
+            0 => 'Unknown',
+            1 => 'Macro',
+            2 => 'Close',
+            3 => 'Distant',
+        },
+    },
+    # 0xa40d - int16u: 0 (GE E1486 TW)
+    # 0xa40e - int16u: 1 (GE E1486 TW)
+    0xa420 => 'ImageUniqueID',
+    0xa430 => { #24
+        Name => 'OwnerName',
+        Notes => 'called CameraOwnerName by the EXIF spec.',
+    },
+    0xa431 => { #24
+        Name => 'SerialNumber',
+        Notes => 'called BodySerialNumber by the EXIF spec.',
+    },
+    0xa432 => { #24
+        Name => 'LensInfo',
+        Notes => q{
+            4 rational values giving focal and aperture ranges, called LensSpecification
+            by the EXIF spec.
+        },
+        # convert to the form "12-20mm f/3.8-4.5" or "50mm f/1.4"
+        PrintConv => \&Image::ExifTool::Exif::PrintLensInfo,
+    },
+    0xa433 => 'LensMake', #24
+    0xa434 => 'LensModel', #24
+    0xa435 => 'LensSerialNumber', #24
+    0xa480 => 'GDALMetadata', #3
+    0xa481 => 'GDALNoData', #3
+    0xa500 => 'Gamma',
+    0xafc0 => 'ExpandSoftware', #JD (Opanda)
+    0xafc1 => 'ExpandLens', #JD (Opanda)
+    0xafc2 => 'ExpandFilm', #JD (Opanda)
+    0xafc3 => 'ExpandFilterLens', #JD (Opanda)
+    0xafc4 => 'ExpandScanner', #JD (Opanda)
+    0xafc5 => 'ExpandFlashLamp', #JD (Opanda)
+#
+# Windows Media Photo / HD Photo (WDP/HDP) tags
+#
+    0xbc01 => { #13
+        Name => 'PixelFormat',
+        PrintHex => 1,
+        Format => 'undef',
+        Notes => q{
+            tags 0xbc** are used in Windows HD Photo (HDP and WDP) images. The actual
+            PixelFormat values are 16-byte GUID's but the leading 15 bytes,
+            '6fddc324-4e03-4bfe-b1853-d77768dc9', have been removed below to avoid
+            unnecessary clutter
+        },
+        ValueConv => q{
+            require Image::ExifTool::ASF;
+            $val = Image::ExifTool::ASF::GetGUID($val);
+            # GUID's are too long, so remove redundant information
+            $val =~ s/^6fddc324-4e03-4bfe-b185-3d77768dc9//i and $val = hex($val);
+            return $val;
+        },
+        PrintConv => {
+            0x0d => '24-bit RGB',
+            0x0c => '24-bit BGR',
+            0x0e => '32-bit BGR',
+            0x15 => '48-bit RGB',
+            0x12 => '48-bit RGB Fixed Point',
+            0x3b => '48-bit RGB Half',
+            0x18 => '96-bit RGB Fixed Point',
+            0x1b => '128-bit RGB Float',
+            0x0f => '32-bit BGRA',
+            0x16 => '64-bit RGBA',
+            0x1d => '64-bit RGBA Fixed Point',
+            0x3a => '64-bit RGBA Half',
+            0x1e => '128-bit RGBA Fixed Point',
+            0x19 => '128-bit RGBA Float',
+            0x10 => '32-bit PBGRA',
+            0x17 => '64-bit PRGBA',
+            0x1a => '128-bit PRGBA Float',
+            0x1c => '32-bit CMYK',
+            0x2c => '40-bit CMYK Alpha',
+            0x1f => '64-bit CMYK',
+            0x2d => '80-bit CMYK Alpha',
+            0x20 => '24-bit 3 Channels',
+            0x21 => '32-bit 4 Channels',
+            0x22 => '40-bit 5 Channels',
+            0x23 => '48-bit 6 Channels',
+            0x24 => '56-bit 7 Channels',
+            0x25 => '64-bit 8 Channels',
+            0x2e => '32-bit 3 Channels Alpha',
+            0x2f => '40-bit 4 Channels Alpha',
+            0x30 => '48-bit 5 Channels Alpha',
+            0x31 => '56-bit 6 Channels Alpha',
+            0x32 => '64-bit 7 Channels Alpha',
+            0x33 => '72-bit 8 Channels Alpha',
+            0x26 => '48-bit 3 Channels',
+            0x27 => '64-bit 4 Channels',
+            0x28 => '80-bit 5 Channels',
+            0x29 => '96-bit 6 Channels',
+            0x2a => '112-bit 7 Channels',
+            0x2b => '128-bit 8 Channels',
+            0x34 => '64-bit 3 Channels Alpha',
+            0x35 => '80-bit 4 Channels Alpha',
+            0x36 => '96-bit 5 Channels Alpha',
+            0x37 => '112-bit 6 Channels Alpha',
+            0x38 => '128-bit 7 Channels Alpha',
+            0x39 => '144-bit 8 Channels Alpha',
+            0x08 => '8-bit Gray',
+            0x0b => '16-bit Gray',
+            0x13 => '16-bit Gray Fixed Point',
+            0x3e => '16-bit Gray Half',
+            0x3f => '32-bit Gray Fixed Point',
+            0x11 => '32-bit Gray Float',
+            0x05 => 'Black & White',
+            0x09 => '16-bit BGR555',
+            0x0a => '16-bit BGR565',
+            0x13 => '32-bit BGR101010',
+            0x3d => '32-bit RGBE',
+        },
+    },
+    0xbc02 => { #13
+        Name => 'Transformation',
+        PrintConv => {
+            0 => 'Horizontal (normal)',
+            1 => 'Mirror vertical',
+            2 => 'Mirror horizontal',
+            3 => 'Rotate 180',
+            4 => 'Rotate 90 CW',
+            5 => 'Mirror horizontal and rotate 90 CW',
+            6 => 'Mirror horizontal and rotate 270 CW',
+            7 => 'Rotate 270 CW',
+        },
+    },
+    0xbc03 => { #13
+        Name => 'Uncompressed',
+        PrintConv => { 0 => 'No', 1 => 'Yes' },
+    },
+    0xbc04 => { #13
+        Name => 'ImageType',
+        PrintConv => { BITMASK => {
+            0 => 'Preview',
+            1 => 'Page',
+        } },
+    },
+    0xbc80 => 'ImageWidth', #13
+    0xbc81 => 'ImageHeight', #13
+    0xbc82 => 'WidthResolution', #13
+    0xbc83 => 'HeightResolution', #13
+    0xbcc0 => { #13
+        Name => 'ImageOffset',
+        IsOffset => 1,
+        OffsetPair => 0xbcc1,  # point to associated byte count
+    },
+    0xbcc1 => { #13
+        Name => 'ImageByteCount',
+        OffsetPair => 0xbcc0,  # point to associated offset
+    },
+    0xbcc2 => { #13
+        Name => 'AlphaOffset',
+        IsOffset => 1,
+        OffsetPair => 0xbcc3,  # point to associated byte count
+    },
+    0xbcc3 => { #13
+        Name => 'AlphaByteCount',
+        OffsetPair => 0xbcc2,  # point to associated offset
+    },
+    0xbcc4 => { #13
+        Name => 'ImageDataDiscard',
+        PrintConv => {
+            0 => 'Full Resolution',
+            1 => 'Flexbits Discarded',
+            2 => 'HighPass Frequency Data Discarded',
+            3 => 'Highpass and LowPass Frequency Data Discarded',
+        },
+    },
+    0xbcc5 => { #13
+        Name => 'AlphaDataDiscard',
+        PrintConv => {
+            0 => 'Full Resolution',
+            1 => 'Flexbits Discarded',
+            2 => 'HighPass Frequency Data Discarded',
+            3 => 'Highpass and LowPass Frequency Data Discarded',
+        },
+    },
+#
+    0xc427 => 'OceScanjobDesc', #3
+    0xc428 => 'OceApplicationSelector', #3
+    0xc429 => 'OceIDNumber', #3
+    0xc42a => 'OceImageLogic', #3
+    0xc44f => { Name => 'Annotations', Binary => 1 }, #7/19
+    0xc4a5 => {
+        Name => 'PrintIM', # (writable directory!)
+        # must set Writable here so this tag will be saved with MakerNotes option
+        Writable => 'undef',
+        WriteGroup => 'IFD0',
+        Description => 'Print Image Matching',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::PrintIM::Main',
+        },
+    },
+    0xc580 => { #20
+        Name => 'USPTOOriginalContentType',
+        PrintConv => {
+            0 => 'Text or Drawing',
+            1 => 'Grayscale',
+            2 => 'Color',
+        },
+    },
+#
+# DNG tags 0xc6XX and 0xc7XX (ref 2 unless otherwise stated)
+#
+    0xc612 => {
+        Name => 'DNGVersion',
+        Notes => 'tags 0xc612-0xc761 are used in DNG images unless otherwise noted',
+        DataMember => 'DNGVersion',
+        RawConv => '$$self{DNGVersion} = $val',
+        PrintConv => '$val =~ tr/ /./; $val',
+    },
+    0xc613 => 'DNGBackwardVersion',
+    0xc614 => 'UniqueCameraModel',
+    0xc615 => {
+        Name => 'LocalizedCameraModel',
+        Format => 'string',
+        PrintConv => '$self->Printable($val, 0)',
+    },
+    0xc616 => {
+        Name => 'CFAPlaneColor',
+        PrintConv => q{
+            my @cols = qw(Red Green Blue Cyan Magenta Yellow White);
+            my @vals = map { $cols[$_] || "Unknown($_)" } split(' ', $val);
+            return join(',', @vals);
+        },
+    },
+    0xc617 => {
+        Name => 'CFALayout',
+        PrintConv => {
+            1 => 'Rectangular',
+            2 => 'Even columns offset down 1/2 row',
+            3 => 'Even columns offset up 1/2 row',
+            4 => 'Even rows offset right 1/2 column',
+            5 => 'Even rows offset left 1/2 column',
+            # the following are new for DNG 1.3:
+            6 => 'Even rows offset up by 1/2 row, even columns offset left by 1/2 column',
+            7 => 'Even rows offset up by 1/2 row, even columns offset right by 1/2 column',
+            8 => 'Even rows offset down by 1/2 row, even columns offset left by 1/2 column',
+            9 => 'Even rows offset down by 1/2 row, even columns offset right by 1/2 column',
+        },
+    },
+    0xc618 => { Name => 'LinearizationTable', Binary => 1 },
+    0xc619 => 'BlackLevelRepeatDim',
+    0xc61a => 'BlackLevel',
+    0xc61b => { Name => 'BlackLevelDeltaH', %longBin },
+    0xc61c => { Name => 'BlackLevelDeltaV', %longBin },
+    0xc61d => 'WhiteLevel',
+    0xc61e => 'DefaultScale',
+    0xc61f => 'DefaultCropOrigin',
+    0xc620 => 'DefaultCropSize',
+    0xc621 => 'ColorMatrix1',
+    0xc622 => 'ColorMatrix2',
+    0xc623 => 'CameraCalibration1',
+    0xc624 => 'CameraCalibration2',
+    0xc625 => 'ReductionMatrix1',
+    0xc626 => 'ReductionMatrix2',
+    0xc627 => 'AnalogBalance',
+    0xc628 => 'AsShotNeutral',
+    0xc629 => 'AsShotWhiteXY',
+    0xc62a => 'BaselineExposure',
+    0xc62b => 'BaselineNoise',
+    0xc62c => 'BaselineSharpness',
+    0xc62d => 'BayerGreenSplit',
+    0xc62e => 'LinearResponseLimit',
+    0xc62f => {
+        Name => 'CameraSerialNumber',
+        Groups => { 2 => 'Camera' },
+    },
+    0xc630 => {
+        Name => 'DNGLensInfo',
+        Groups => { 2 => 'Camera' },
+        PrintConv =>\&PrintLensInfo,
+    },
+    0xc631 => 'ChromaBlurRadius',
+    0xc632 => 'AntiAliasStrength',
+    0xc633 => 'ShadowScale',
+    0xc634 => [
+        {
+            Condition => '$$self{TIFF_TYPE} =~ /^(ARW|SR2)$/',
+            Name => 'SR2Private',
+            Groups => { 1 => 'SR2' },
+            Flags => 'SubIFD',
+            Format => 'int32u',
+            # some utilites have problems unless this is int8u format:
+            # - Adobe Camera Raw 5.3 gives an error
+            # - Apple Preview 10.5.8 gets the wrong white balance
+            FixFormat => 'int8u', # (stupid Sony)
+            SubDirectory => {
+                DirName => 'SR2Private',
+                TagTable => 'Image::ExifTool::Sony::SR2Private',
+                Start => '$val',
+            },
+        },
+        {
+            Condition => '$$valPt =~ /^Adobe\0/',
+            Name => 'DNGAdobeData',
+            NestedHtmlDump => 1,
+            SubDirectory => { TagTable => 'Image::ExifTool::DNG::AdobeData' },
+            Format => 'undef',  # written incorrectly as int8u (change to undef for speed)
+        },
+        {
+            Condition => '$$valPt =~ /^(PENTAX |SAMSUNG)\0/',
+            Name => 'MakerNotePentax',
+            MakerNotes => 1,    # (causes "MakerNotes header" to be identified in HtmlDump output)
+            Binary => 1,
+            # Note: Don't make this block-writable for a few reasons:
+            # 1) It would be dangerous (possibly confusing Pentax software)
+            # 2) It is a different format from the JPEG version of MakerNotePentax
+            # 3) It is converted to JPEG format by RebuildMakerNotes() when copying
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Pentax::Main',
+                Start => '$valuePtr + 10',
+                Base => '$start - 10',
+                ByteOrder => 'Unknown', # easier to do this than read byteorder word
+            },
+            Format => 'undef',  # written incorrectly as int8u (change to undef for speed)
+        },
+        {
+            Name => 'DNGPrivateData',
+            Binary => 1,
+            Format => 'undef',
+        },
+    ],
+    0xc635 => {
+        Name => 'MakerNoteSafety',
+        PrintConv => {
+            0 => 'Unsafe',
+            1 => 'Safe',
+        },
+    },
+    0xc640 => { #15
+        Name => 'RawImageSegmentation',
+        # (int16u[3], not writable)
+        Notes => q{
+            used in segmented Canon CR2 images.  3 numbers: 1. Number of segments minus
+            one; 2. Pixel width of segments except last; 3. Pixel width of last segment
+        },
+    },
+    0xc65a => {
+        Name => 'CalibrationIlluminant1',
+        SeparateTable => 'LightSource',
+        PrintConv => \%lightSource,
+    },
+    0xc65b => {
+        Name => 'CalibrationIlluminant2',
+        SeparateTable => 'LightSource',
+        PrintConv => \%lightSource,
+    },
+    0xc65c => 'BestQualityScale',
+    0xc65d => {
+        Name => 'RawDataUniqueID',
+        Format => 'undef',
+        ValueConv => 'uc(unpack("H*",$val))',
+    },
+    0xc660 => { #3
+        Name => 'AliasLayerMetadata',
+        Notes => 'used by Alias Sketchbook Pro',
+    },
+    0xc68b => {
+        Name => 'OriginalRawFileName',
+        Format => 'string', # sometimes written as int8u
+    },
+    0xc68c => {
+        Name => 'OriginalRawFileData', # (writable directory!)
+        Writable => 'undef', # must be defined here so tag will be extracted if specified
+        WriteGroup => 'IFD0',
+        Flags => [ 'Binary', 'Protected' ],
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::DNG::OriginalRaw',
+        },
+    },
+    0xc68d => 'ActiveArea',
+    0xc68e => 'MaskedAreas',
+    0xc68f => {
+        Name => 'AsShotICCProfile',
+        Binary => 1,
+        Writable => 'undef', # must be defined here so tag will be extracted if specified
+        SubDirectory => {
+            DirName => 'AsShotICCProfile',
+            TagTable => 'Image::ExifTool::ICC_Profile::Main',
+        },
+    },
+    0xc690 => 'AsShotPreProfileMatrix',
+    0xc691 => {
+        Name => 'CurrentICCProfile',
+        Binary => 1,
+        Writable => 'undef', # must be defined here so tag will be extracted if specified
+        SubDirectory => {
+            DirName => 'CurrentICCProfile',
+            TagTable => 'Image::ExifTool::ICC_Profile::Main',
+        },
+    },
+    0xc692 => 'CurrentPreProfileMatrix',
+    0xc6bf => 'ColorimetricReference',
+    0xc6d2 => { #JD (Panasonic DMC-TZ5)
+        # this text is UTF-8 encoded (hooray!) - PH (TZ5)
+        Name => 'PanasonicTitle',
+        Format => 'string', # written incorrectly as 'undef'
+        Notes => 'proprietary Panasonic tag used for baby/pet name, etc',
+        # panasonic always records this tag (64 zero bytes),
+        # so ignore it unless it contains valid information
+        RawConv => 'length($val) ? $val : undef',
+        ValueConv => '$self->Decode($val, "UTF8")',
+    },
+    0xc6d3 => { #PH (Panasonic DMC-FS7)
+        Name => 'PanasonicTitle2',
+        Format => 'string', # written incorrectly as 'undef'
+        Notes => 'proprietary Panasonic tag used for baby/pet name with age',
+        # panasonic always records this tag (128 zero bytes),
+        # so ignore it unless it contains valid information
+        RawConv => 'length($val) ? $val : undef',
+        ValueConv => '$self->Decode($val, "UTF8")',
+    },
+    0xc6f3 => 'CameraCalibrationSig',
+    0xc6f4 => 'ProfileCalibrationSig',
+    0xc6f5 => {
+        Name => 'ProfileIFD', # (ExtraCameraProfiles)
+        Groups => { 1 => 'ProfileIFD' },
+        Flags => 'SubIFD',
+        SubDirectory => {
+            ProcessProc => \&ProcessTiffIFD,
+            WriteProc => \&ProcessTiffIFD,
+            DirName => 'ProfileIFD',
+            Start => '$val',
+            Base => '$start',   # offsets relative to start of TIFF-like header
+            MaxSubdirs => 10,
+            Magic => 0x4352,    # magic number for TIFF-like header
+        },
+    },
+    0xc6f6 => 'AsShotProfileName',
+    0xc6f7 => 'NoiseReductionApplied',
+    0xc6f8 => 'ProfileName',
+    0xc6f9 => 'ProfileHueSatMapDims',
+    0xc6fa => 'ProfileHueSatMapData1',
+    0xc6fb => 'ProfileHueSatMapData2',
+    0xc6fc => {
+        Name => 'ProfileToneCurve',
+        Binary => 1,
+    },
+    0xc6fd => {
+        Name => 'ProfileEmbedPolicy',
+        PrintConv => {
+            0 => 'Allow Copying',
+            1 => 'Embed if Used',
+            2 => 'Never Embed',
+            3 => 'No Restrictions',
+        },
+    },
+    0xc6fe => 'ProfileCopyright',
+    0xc714 => 'ForwardMatrix1',
+    0xc715 => 'ForwardMatrix2',
+    0xc716 => 'PreviewApplicationName',
+    0xc717 => 'PreviewApplicationVersion',
+    0xc718 => 'PreviewSettingsName',
+    0xc719 => {
+        Name => 'PreviewSettingsDigest',
+        Format => 'undef',
+        ValueConv => 'unpack("H*", $val)',
+    },
+    0xc71a => 'PreviewColorSpace',
+    0xc71b => {
+        Name => 'PreviewDateTime',
+        Groups => { 2 => 'Time' },
+        ValueConv => q{
+            require Image::ExifTool::XMP;
+            return Image::ExifTool::XMP::ConvertXMPDate($val);
+        },
+    },
+    0xc71c => {
+        Name => 'RawImageDigest',
+        Format => 'undef',
+        ValueConv => 'unpack("H*", $val)',
+    },
+    0xc71d => {
+        Name => 'OriginalRawFileDigest',
+        Format => 'undef',
+        ValueConv => 'unpack("H*", $val)',
+    },
+    0xc71e => 'SubTileBlockSize',
+    0xc71f => 'RowInterleaveFactor',
+    0xc725 => 'ProfileLookTableDims',
+    0xc726 => {
+        Name => 'ProfileLookTableData',
+        Binary => 1,
+    },
+    0xc740 => { # DNG 1.3
+        Name => 'OpcodeList1',
+        Binary => 1,
+        # opcodes:
+        # 1 => 'WarpRectilinear',
+        # 2 => 'WarpFisheye',
+        # 3 => 'FixVignetteRadial',
+        # 4 => 'FixBadPixelsConstant',
+        # 5 => 'FixBadPixelsList',
+        # 6 => 'TrimBounds',
+        # 7 => 'MapTable',
+        # 8 => 'MapPolynomial',
+        # 9 => 'GainMap',
+        # 10 => 'DeltaPerRow',
+        # 11 => 'DeltaPerColumn',
+        # 12 => 'ScalePerRow',
+        # 13 => 'ScalePerColumn',
+    },
+    0xc741 => { # DNG 1.3
+        Name => 'OpcodeList2',
+        Binary => 1,
+    },
+    0xc74e => { # DNG 1.3
+        Name => 'OpcodeList3',
+        Binary => 1,
+    },
+    0xc761 => 'NoiseProfile', # DNG 1.3
+    0xea1c => { #13
+        Name => 'Padding',
+        Binary => 1,
+        Writable => 'undef',
+        # must start with 0x1c 0xea by the WM Photo specification
+        # (not sure what should happen if padding is only 1 byte)
+        # (why does MicrosoftPhoto write "1c ea 00 00 00 08"?)
+        RawConvInv => '$val=~s/^../\x1c\xea/s; $val',
+    },
+    0xea1d => {
+        Name => 'OffsetSchema',
+        Notes => "Microsoft's ill-conceived maker note offset difference",
+        # From the Microsoft documentation:
+        #
+        #     Any time the "Maker Note" is relocated by Windows, the Exif MakerNote
+        #     tag (37500) is updated automatically to reference the new location. In
+        #     addition, Windows records the offset (or difference) between the old and
+        #     new locations in the Exif OffsetSchema tag (59933). If the "Maker Note"
+        #     contains relative references, the developer can add the value in
+        #     OffsetSchema to the original references to find the correct information.
+        #
+        # My recommendation is for other developers to ignore this tag because the
+        # information it contains is unreliable. It will be wrong if the image has
+        # been subsequently edited by another application that doesn't recognize the
+        # new Microsoft tag.
+        #
+        # The new tag unfortunately only gives the difference between the new maker
+        # note offset and the original offset. Instead, it should have been designed
+        # to store the original offset. The new offset may change if the image is
+        # edited, which will invalidate the tag as currently written. If instead the
+        # original offset had been stored, the new difference could be easily
+        # calculated because the new maker note offset is known.
+        #
+        # I exchanged emails with a Microsoft technical representative, pointing out
+        # this problem shortly after they released the update (Feb 2007), but so far
+        # they have taken no steps to address this.
+    },
+
+    # tags in the range 0xfde8-0xfe58 have been observed in PS7 files
+    # generated from RAW images.  They are all strings with the
+    # tag name at the start of the string.  To accomodate these types
+    # of tags, all tags with values above 0xf000 are handled specially
+    # by ProcessExif().
+
+    0xfe00 => {
+        Name => 'KDC_IFD',
+        Groups => { 1 => 'KDC_IFD' },
+        Flags => 'SubIFD',
+        Notes => 'used in some Kodak KDC images',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::KDC_IFD',
+            DirName => 'KDC_IFD',
+            Start => '$val',
+        },
+    },
+);
+
+# EXIF Composite tags (plus other more general Composite tags)
+%Image::ExifTool::Exif::Composite = (
+    GROUPS => { 2 => 'Image' },
+    ImageSize => {
+        Require => {
+            0 => 'ImageWidth',
+            1 => 'ImageHeight',
+        },
+        Desire => {
+            2 => 'ExifImageWidth',
+            3 => 'ExifImageHeight',
+        },
+        # use ExifImageWidth/Height only for Canon and Phase One TIFF-base RAW images
+        ValueConv => q{
+            return "$val[2]x$val[3]" if $val[2] and $val[3] and
+                    $$self{TIFF_TYPE} =~ /^(CR2|Canon 1D RAW|IIQ|EIP)$/;
+            return "$val[0]x$val[1]";
+        },
+    },
+    # pick the best shutter speed value
+    ShutterSpeed => {
+        Desire => {
+            0 => 'ExposureTime',
+            1 => 'ShutterSpeedValue',
+            2 => 'BulbDuration',
+        },
+        ValueConv => '($val[2] and $val[2]>0) ? $val[2] : (defined($val[0]) ? $val[0] : $val[1])',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+    },
+    Aperture => {
+        Desire => {
+            0 => 'FNumber',
+            1 => 'ApertureValue',
+        },
+        RawConv => '($val[0] || $val[1]) ? $val : undef',
+        ValueConv => '$val[0] || $val[1]',
+        PrintConv => 'sprintf("%.1f", $val)',
+    },
+    LightValue => {
+        Notes => 'calculated LV -- similar to exposure value but includes ISO speed',
+        Require => {
+            0 => 'Aperture',
+            1 => 'ShutterSpeed',
+            2 => 'ISO',
+        },
+        ValueConv => 'Image::ExifTool::Exif::CalculateLV($val[0],$val[1],$prt[2])',
+        PrintConv => 'sprintf("%.1f",$val)',
+    },
+    FocalLength35efl => { #26/PH
+        Description => 'Focal Length',
+        Notes => 'this value may be incorrect if the image has been resized',
+        Groups => { 2 => 'Camera' },
+        Require => {
+            0 => 'FocalLength',
+        },
+        Desire => {
+            1 => 'ScaleFactor35efl',
+        },
+        ValueConv => 'ToFloat(@val); ($val[0] || 0) * ($val[1] || 1)',
+        PrintConv => '$val[1] ? sprintf("%.1f mm (35 mm equivalent: %.1f mm)", $val[0], $val) : sprintf("%.1f mm", $val)',
+    },
+    ScaleFactor35efl => { #26/PH
+        Description => 'Scale Factor To 35 mm Equivalent',
+        Notes => 'this value and any derived values may be incorrect if image has been resized',
+        Groups => { 2 => 'Camera' },
+        Desire => {
+            0 => 'FocalLength',
+            1 => 'FocalLengthIn35mmFormat',
+            2 => 'Composite:DigitalZoom',
+            3 => 'FocalPlaneDiagonal',
+            4 => 'FocalPlaneXSize',
+            5 => 'FocalPlaneYSize',
+            6 => 'FocalPlaneResolutionUnit',
+            7 => 'FocalPlaneXResolution',
+            8 => 'FocalPlaneYResolution',
+            9 => 'ExifImageWidth',
+           10 => 'ExifImageHeight',
+           11 => 'CanonImageWidth',
+           12 => 'CanonImageHeight',
+           13 => 'ImageWidth',
+           14 => 'ImageHeight',
+        },
+        ValueConv => 'Image::ExifTool::Exif::CalcScaleFactor35efl(@val)',
+        PrintConv => 'sprintf("%.1f", $val)',
+    },
+    CircleOfConfusion => {
+        Notes => q{
+            this value may be incorrect if the image has been resized.  Calculated as
+            D/1440, where D is the focal plane diagonal in mm
+        },
+        Groups => { 2 => 'Camera' },
+        Require => 'ScaleFactor35efl',
+        ValueConv => 'sqrt(24*24+36*36) / ($val * 1440)',
+        PrintConv => 'sprintf("%.3f mm",$val)',
+    },
+    HyperfocalDistance => {
+        Notes => 'this value may be incorrect if the image has been resized',
+        Groups => { 2 => 'Camera' },
+        Require => {
+            0 => 'FocalLength',
+            1 => 'Aperture',
+            2 => 'CircleOfConfusion',
+        },
+        ValueConv => q{
+            ToFloat(@val);
+            return 'inf' unless $val[1] and $val[2];
+            return $val[0] * $val[0] / ($val[1] * $val[2] * 1000);
+        },
+        PrintConv => 'sprintf("%.2f m", $val)',
+    },
+    DOF => {
+        Description => 'Depth Of Field',
+        Notes => 'this value may be incorrect if the image has been resized',
+        Require => {
+            0 => 'FocalLength',
+            1 => 'Aperture',
+            2 => 'CircleOfConfusion',
+        },
+        Desire => {
+            3 => 'FocusDistance',   # focus distance in metres (0 is infinity)
+            4 => 'SubjectDistance',
+            5 => 'ObjectDistance',
+        },
+        ValueConv => q{
+            ToFloat(@val);
+            my ($d, $f) = ($val[3], $val[0]);
+            if (defined $d) {
+                $d or $d = 1e10;    # (use large number for infinity)
+            } else {
+                $d = $val[4] || $val[5];
+                return undef unless defined $d;
+            }
+            return 0 unless $f and $val[2];
+            my $t = $val[1] * $val[2] * ($d * 1000 - $f) / ($f * $f);
+            my @v = ($d / (1 + $t), $d / (1 - $t));
+            $v[1] < 0 and $v[1] = 0; # 0 means 'inf'
+            return join(' ',@v);
+        },
+        PrintConv => q{
+            $val =~ tr/,/./;    # in case locale is whacky
+            my @v = split ' ', $val;
+            $v[1] or return sprintf("inf (%.2f m - inf)", $v[0]);
+            return sprintf("%.2f m (%.2f - %.2f)",$v[1]-$v[0],$v[0],$v[1]);
+        },
+    },
+    FOV => {
+        Description => 'Field Of View',
+        Notes => q{
+            calculated for the long image dimension, this value may be incorrect for
+            fisheye lenses, or if the image has been resized
+        },
+        Require => {
+            0 => 'FocalLength',
+            1 => 'ScaleFactor35efl',
+        },
+        Desire => {
+            2 => 'FocusDistance', # (multiply by 1000 to convert to mm)
+        },
+        # ref http://www.bobatkins.com/photography/technical/field_of_view.html
+        # (calculations below apply to rectilinear lenses only, not fisheye)
+        ValueConv => q{
+            ToFloat(@val);
+            return undef unless $val[0] and $val[1];
+            my $corr = 1;
+            if ($val[2]) {
+                my $d = 1000 * $val[2] - $val[0];
+                $corr += $val[0]/$d if $d > 0;
+            }
+            my $fd2 = atan2(36, 2*$val[0]*$val[1]*$corr);
+            my @fov = ( $fd2 * 360 / 3.14159 );
+            if ($val[2] and $val[2] > 0 and $val[2] < 10000) {
+                push @fov, 2 * $val[2] * sin($fd2) / cos($fd2);
+            }
+            return join(' ', @fov);
+        },
+        PrintConv => q{
+            my @v = split(' ',$val);
+            my $str = sprintf("%.1f deg", $v[0]);
+            $str .= sprintf(" (%.2f m)", $v[1]) if $v[1];
+            return $str;
+        },
+    },
+    # generate DateTimeOriginal from Date and Time Created if not extracted already
+    DateTimeOriginal => {
+        Condition => 'not defined $$self{VALUE}{DateTimeOriginal}',
+        Description => 'Date/Time Original',
+        Groups => { 2 => 'Time' },
+        Desire => {
+            0 => 'DateTimeCreated',
+            1 => 'DateCreated',
+            2 => 'TimeCreated',
+        },
+        ValueConv => q{
+            return $val[0] if $val[0] and $val[0]=~/ /;
+            return undef unless $val[1] and $val[2];
+            return "$val[1] $val[2]";
+        },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    ThumbnailImage => {
+        Writable => 1,
+        WriteCheck => '$self->CheckImage(\$val)',
+        WriteAlso => {
+            # (the 0xfeedfeed values are translated in the Exif write routine)
+            ThumbnailOffset => 'defined $val ? 0xfeedfeed : undef',
+            ThumbnailLength => 'defined $val ? 0xfeedfeed : undef',
+        },
+        Require => {
+            0 => 'ThumbnailOffset',
+            1 => 'ThumbnailLength',
+        },
+        # retrieve the thumbnail from our EXIF data
+        RawConv => 'Image::ExifTool::Exif::ExtractImage($self,$val[0],$val[1],"ThumbnailImage")',
+    },
+    PreviewImage => {
+        Writable => 1,
+        WriteCheck => '$self->CheckImage(\$val)',
+        DelCheck => '$val = ""; return undef', # can't delete, so set to empty string
+        WriteAlso => {
+            PreviewImageStart  => 'defined $val ? 0xfeedfeed : undef',
+            PreviewImageLength => 'defined $val ? 0xfeedfeed : undef',
+            PreviewImageValid  => 'defined $val and length $val ? 1 : 0',
+        },
+        Require => {
+            0 => 'PreviewImageStart',
+            1 => 'PreviewImageLength',
+        },
+        Desire => {
+            2 => 'PreviewImageValid',
+            # (DNG and A100 ARW may be have 2 preview images)
+            3 => 'PreviewImageStart (1)',
+            4 => 'PreviewImageLength (1)',
+        },
+        # note: extract 2nd preview, but ignore double-referenced preview
+        # (in A100 ARW images, the 2nd PreviewImageLength from IFD0 may be wrong anyway)
+        RawConv => q{
+            if ($val[3] and $val[4] and $val[0] ne $val[3]) {
+                my %val = (
+                    0 => 'PreviewImageStart (1)',
+                    1 => 'PreviewImageLength (1)',
+                    2 => 'PreviewImageValid',
+                );
+                $self->FoundTag($tagInfo, \%val);
+            }
+            return undef if defined $val[2] and not $val[2];
+            return Image::ExifTool::Exif::ExtractImage($self,$val[0],$val[1],'PreviewImage');
+        },
+    },
+    JpgFromRaw => {
+        Writable => 1,
+        WriteCheck => '$self->CheckImage(\$val)',
+        WriteAlso => {
+            JpgFromRawStart  => 'defined $val ? 0xfeedfeed : undef',
+            JpgFromRawLength => 'defined $val ? 0xfeedfeed : undef',
+        },
+        Require => {
+            0 => 'JpgFromRawStart',
+            1 => 'JpgFromRawLength',
+        },
+        RawConv => 'Image::ExifTool::Exif::ExtractImage($self,$val[0],$val[1],"JpgFromRaw")',
+    },
+    OtherImage => {
+        Require => {
+            0 => 'OtherImageStart',
+            1 => 'OtherImageLength',
+        },
+        # retrieve the thumbnail from our EXIF data
+        RawConv => 'Image::ExifTool::Exif::ExtractImage($self,$val[0],$val[1],"OtherImage")',
+    },
+    PreviewImageSize => {
+        Require => {
+            0 => 'PreviewImageWidth',
+            1 => 'PreviewImageHeight',
+        },
+        ValueConv => '"$val[0]x$val[1]"',
+    },
+    SubSecDateTimeOriginal => {
+        Description => 'Date/Time Original',
+        Groups => { 2 => 'Time' },
+        Require => {
+            0 => 'EXIF:DateTimeOriginal',
+            1 => 'SubSecTimeOriginal',
+        },
+        # be careful here just in case there is a timezone following the seconds
+        ValueConv => q{
+            return undef if $val[1] eq '';
+            $_ = $val[0]; s/( \d{2}:\d{2}:\d{2})/$1\.$val[1]/; $_;
+        },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    SubSecCreateDate => {
+        Description => 'Create Date',
+        Groups => { 2 => 'Time' },
+        Require => {
+            0 => 'EXIF:CreateDate',
+            1 => 'SubSecTimeDigitized',
+        },
+        ValueConv => q{
+            return undef if $val[1] eq '';
+            $_ = $val[0]; s/( \d{2}:\d{2}:\d{2})/$1\.$val[1]/; $_;
+        },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    SubSecModifyDate => {
+        Description => 'Modify Date',
+        Groups => { 2 => 'Time' },
+        Require => {
+            0 => 'EXIF:ModifyDate',
+            1 => 'SubSecTime',
+        },
+        ValueConv => q{
+            return undef if $val[1] eq '';
+            $_ = $val[0]; s/( \d{2}:\d{2}:\d{2})/$1\.$val[1]/; $_;
+        },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    CFAPattern => {
+        Require => {
+            0 => 'CFARepeatPatternDim',
+            1 => 'CFAPattern2',
+        },
+        # generate CFAPattern
+        ValueConv => q{
+            my @a = split / /, $val[0];
+            my @b = split / /, $val[1];
+            return '?' unless @a==2 and @b==$a[0]*$a[1];
+            return Set16u($a[0]) . Set16u($a[1]) . pack('C*', @b);
+        },
+        PrintConv => 'Image::ExifTool::Exif::PrintCFAPattern($val)',
+    },
+    RedBalance => {
+        Groups => { 2 => 'Camera' },
+        Desire => {
+            0 => 'WB_RGGBLevels',
+            1 => 'WB_RGBGLevels',
+            2 => 'WB_RBGGLevels',
+            3 => 'WB_GRBGLevels',
+            4 => 'WB_GRGBLevels',
+            5 => 'WB_GBRGLevels',
+            6 => 'WB_RGBLevels',
+            7 => 'WB_RBLevels',
+            8 => 'WBRedLevel', # red
+            9 => 'WBGreenLevel',
+        },
+        ValueConv => 'Image::ExifTool::Exif::RedBlueBalance(0,@val)',
+        PrintConv => 'int($val * 1e6 + 0.5) * 1e-6',
+    },
+    BlueBalance => {
+        Groups => { 2 => 'Camera' },
+        Desire => {
+            0 => 'WB_RGGBLevels',
+            1 => 'WB_RGBGLevels',
+            2 => 'WB_RBGGLevels',
+            3 => 'WB_GRBGLevels',
+            4 => 'WB_GRGBLevels',
+            5 => 'WB_GBRGLevels',
+            6 => 'WB_RGBLevels',
+            7 => 'WB_RBLevels',
+            8 => 'WBBlueLevel', # blue
+            9 => 'WBGreenLevel',
+        },
+        ValueConv => 'Image::ExifTool::Exif::RedBlueBalance(1,@val)',
+        PrintConv => 'int($val * 1e6 + 0.5) * 1e-6',
+    },
+    GPSPosition => {
+        Groups => { 2 => 'Location' },
+        Require => {
+            0 => 'GPSLatitude',
+            1 => 'GPSLongitude',
+        },
+        ValueConv => '"$val[0] $val[1]"',
+        PrintConv => '"$prt[0], $prt[1]"',
+    },
+    LensID => {
+        Groups => { 2 => 'Camera' },
+        Require => {
+            0 => 'LensType',
+        },
+        Desire => {
+            1 => 'FocalLength',
+            2 => 'MaxAperture',
+            3 => 'MaxApertureValue',
+            4 => 'ShortFocal',
+            5 => 'LongFocal',
+            6 => 'LensModel',
+            7 => 'LensFocalRange',
+        },
+        Notes => q{
+            attempt to identify the actual lens from all lenses with a given LensType.
+            Applies only to LensType values with a lookup table.  May be configured
+            by adding user-defined lenses
+        },
+        # this LensID is only valid if the LensType has a PrintConv or is a model name
+        ValueConv => q{
+            return $val[0] if ref $$self{TAG_INFO}{LensType}{PrintConv} eq "HASH" or
+                              $prt[0] =~ /(mm|\d\/F)/;
+            return undef;
+        },
+        PrintConv => 'Image::ExifTool::Exif::PrintLensID($self, $prt[0], @val)',
+    },
+);
+
+# table for unknown IFD entries
+%Image::ExifTool::Exif::Unknown = (
+    GROUPS => { 0 => 'EXIF', 1 => 'UnknownIFD', 2 => 'Image'},
+    WRITE_PROC => \&WriteExif,
+);
+
+# add our composite tags
+Image::ExifTool::AddCompositeTags('Image::ExifTool::Exif');
+
+
+#------------------------------------------------------------------------------
+# AutoLoad our writer routines when necessary
+#
+sub AUTOLOAD
+{
+    return Image::ExifTool::DoAutoLoad($AUTOLOAD, @_);
+}
+
+#------------------------------------------------------------------------------
+# Identify RAW file type for some TIFF-based formats using Compression value
+# Inputs: 0) ExifTool object reference, 1) Compression value
+# - sets TIFF_TYPE and FileType if identified
+sub IdentifyRawFile($$)
+{
+    my ($exifTool, $comp) = @_;
+    if ($$exifTool{FILE_TYPE} eq 'TIFF' and not $$exifTool{IdentifiedRawFile}) {
+        if ($compression{$comp} and $compression{$comp} =~ /^\w+ ([A-Z]{3}) Compressed$/) {
+            $exifTool->OverrideFileType($$exifTool{TIFF_TYPE} = $1);
+            $$exifTool{IdentifiedRawFile} = 1;
+        }
+    }
+}
+
+#------------------------------------------------------------------------------
+# Calculate LV (Light Value)
+# Inputs: 0) Aperture, 1) ShutterSpeed, 2) ISO
+# Returns: LV value (and converts input values to floating point if necessary)
+sub CalculateLV($$$)
+{
+    local $_;
+    # do validity checks on arguments
+    return undef unless @_ >= 3;
+    foreach (@_) {
+        return undef unless $_ and /([+-]?(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?)/ and $1 > 0;
+        $_ = $1;    # extract float from any other garbage
+    }
+    # (A light value of 0 is defined as f/1.0 at 1 second with ISO 100)
+    return (2*log($_[0]) - log($_[1]) - log($_[2]/100)) / log(2);
+}
+
+#------------------------------------------------------------------------------
+# Calculate scale factor for 35mm effective focal length (ref 26/PH)
+# Inputs: 0) Focal length
+#         1) Focal length in 35mm format
+#         2) Canon digital zoom factor
+#         3) Focal plane diagonal size (in mm)
+#         4/5) Focal plane X/Y size (in mm)
+#         6) focal plane resolution units (1=None,2=inches,3=cm,4=mm,5=um)
+#         7/8) Focal plane X/Y resolution
+#         9/10,11/12...) Image width/height in order of precedence (first valid pair is used)
+# Returns: 35mm conversion factor (or undefined if it can't be calculated)
+sub CalcScaleFactor35efl
+{
+    my $res = $_[6];    # save resolution units (in case they have been converted to string)
+    Image::ExifTool::ToFloat(@_);
+    my $focal = shift;
+    my $foc35 = shift;
+
+    return $foc35 / $focal if $focal and $foc35;
+
+    my $digz = shift || 1;
+    my $diag = shift;
+    unless ($diag and Image::ExifTool::IsFloat($diag)) {
+        undef $diag;
+        my $xsize = shift;
+        my $ysize = shift;
+        if ($xsize and $ysize) {
+            # validate by checking aspect ratio because FocalPlaneX/YSize is not reliable
+            my $a = $xsize / $ysize;
+            if (abs($a-1.3333) < .1 or abs($a-1.5) < .1) {
+                $diag = sqrt($xsize * $xsize + $ysize * $ysize);
+            }
+        }
+        unless ($diag) {
+            # get number of mm in units (assume inches unless otherwise specified)
+            my %lkup = ( 3=>10, 4=>1, 5=>0.001 , cm=>10, mm=>1, um=>0.001 );
+            my $units = $lkup{ shift() || $res || '' } || 25.4;
+            my $x_res = shift || return undef;
+            my $y_res = shift || return undef;
+            Image::ExifTool::IsFloat($x_res) and $x_res != 0 or return undef;
+            Image::ExifTool::IsFloat($y_res) and $y_res != 0 or return undef;
+            my ($w, $h);
+            for (;;) {
+                @_ < 2 and return undef;
+                $w = shift;
+                $h = shift;
+                next unless $w and $h;
+                my $a = $w / $h;
+                last if $a > 0.5 and $a < 2; # stop if we get a reasonable value
+            }
+            # calculate focal plane size in mm
+            $w *= $units / $x_res;
+            $h *= $units / $y_res;
+            $diag = sqrt($w*$w+$h*$h);
+            # make sure size is reasonable
+            return undef unless $diag > 1 and $diag < 100;
+        }
+    }
+    return sqrt(36*36+24*24) * $digz / $diag;
+}
+
+#------------------------------------------------------------------------------
+# Print exposure compensation fraction
+sub PrintFraction($)
+{
+    my $val = shift;
+    my $str;
+    if (defined $val) {
+        $val *= 1.00001;    # avoid round-off errors
+        if (not $val) {
+            $str = '0';
+        } elsif (int($val)/$val > 0.999) {
+            $str = sprintf("%+d", int($val));
+        } elsif ((int($val*2))/($val*2) > 0.999) {
+            $str = sprintf("%+d/2", int($val * 2));
+        } elsif ((int($val*3))/($val*3) > 0.999) {
+            $str = sprintf("%+d/3", int($val * 3));
+        } else {
+            $str = sprintf("%+.3g", $val);
+        }
+    }
+    return $str;
+}
+
+#------------------------------------------------------------------------------
+# Convert fraction or number to floating point value (or 'undef' or 'inf')
+sub ConvertFraction($)
+{
+    my $val = shift;
+    if ($val =~ m{([-+]?\d+)/(\d+)}) {
+        $val = $2 ? $1 / $2 : ($1 ? 'inf' : 'undef');
+    }
+    return $val;
+}
+
+#------------------------------------------------------------------------------
+# Convert EXIF text to something readable
+# Inputs: 0) ExifTool object reference, 1) EXIF text
+# Returns: text encoded according to Charset option (with trailing spaces removed)
+sub ConvertExifText($$)
+{
+    my ($exifTool, $val) = @_;
+    return $val if length($val) < 8;
+    my $id = substr($val, 0, 8);
+    my $str = substr($val, 8);
+    # Note: allow spaces instead of nulls in the ID codes because
+    # it is fairly common for camera manufacturers to get this wrong
+    if ($id =~ /^(ASCII)?[\0 ]+$/) {
+        # truncate at null terminator (shouldn't have a null based on the
+        # EXIF spec, but it seems that few people actually read the spec)
+        $str =~ s/\0.*//s;
+    # by the EXIF spec, the following string should be "UNICODE\0", but
+    # apparently Kodak sometimes uses "Unicode\0" in the APP3 "Meta" information.
+    # However, unfortunately Ricoh uses "Unicode\0" in the RR30 EXIF UserComment
+    # when the text is actually ASCII, so only recognize uppercase "UNICODE\0".
+    } elsif ($id =~ /^UNICODE[\0 ]$/) {
+        # MicrosoftPhoto writes as little-endian even in big-endian EXIF,
+        # so we must guess at the true byte ordering
+        $str = $exifTool->Decode($str, 'UCS2', 'Unknown');
+    } elsif ($id =~ /^JIS[\0 ]{5}$/) {
+        $str = $exifTool->Decode($str, 'JIS', 'Unknown');
+    } else {
+        $exifTool->Warn("Invalid EXIF text encoding");
+        $str = $id . $str;
+    }
+    $str =~ s/ +$//;    # trim trailing blanks
+    return $str;
+}
+
+#------------------------------------------------------------------------------
+# Print conversion for SpatialFrequencyResponse
+sub PrintSFR($)
+{
+    my $val = shift;
+    return $val unless length $val > 4;
+    my ($n, $m) = (Get16u(\$val, 0), Get16u(\$val, 2));
+    my @cols = split /\0/, substr($val, 4), $n+1;
+    my $pos = length($val) - 8 * $n * $m;
+    return $val unless @cols == $n+1 and $pos >= 4;
+    pop @cols;
+    my ($i, $j);
+    for ($i=0; $i<$n; ++$i) {
+        my @rows;
+        for ($j=0; $j<$m; ++$j) {
+            push @rows, Image::ExifTool::GetRational64u(\$val, $pos + 8*($i+$j*$n));
+        }
+        $cols[$i] .= '=' . join(',',@rows) . '';
+    }
+    return join '; ', @cols;
+}
+
+#------------------------------------------------------------------------------
+# Print numerical parameter value (with sign, or 'Normal' for zero)
+# Inputs: 0) value, 1) flag for inverse conversion, 2) conversion hash reference
+sub PrintParameter($$$)
+{
+    my ($val, $inv, $conv) = @_;
+    return $val if $inv;
+    if ($val > 0) {
+        if ($val > 0xfff0) {    # a negative value in disguise?
+            $val = $val - 0x10000;
+        } else {
+            $val = "+$val";
+        }
+    }
+    return $val;
+}
+
+#------------------------------------------------------------------------------
+# Convert parameter back to standard EXIF value
+#   0,0.00,etc or "Normal" => 0
+#   -1,-2,etc or "Soft" or "Low" => 1
+#   +1,+2,1,2,etc or "Hard" or "High" => 2
+sub ConvertParameter($)
+{
+    my $val = shift;
+    my $isFloat = Image::ExifTool::IsFloat($val);
+    # normal is a value of zero
+    return 0 if $val =~ /\bn/i or ($isFloat and $val == 0);
+    # "soft", "low" or any negative number is a value of 1
+    return 1 if $val =~ /\b(s|l)/i or ($isFloat and $val < 0);
+    # "hard", "high" or any positive number is a value of 2
+    return 2 if $val =~ /\bh/i or $isFloat;
+    return undef;
+}
+
+#------------------------------------------------------------------------------
+# Calculate Red/BlueBalance
+# Inputs: 0) 0=red, 1=blue, 1-7) WB_RGGB/RGBG/RBGG/GRBG/GRGB/RGB/RBLevels,
+#         8) red or blue level, 9) green level
+my @rggbLookup = (
+    # indices for R, G, G and B components in input value
+    [ 0, 1, 2, 3 ], # 0 RGGB
+    [ 0, 1, 3, 2 ], # 1 RGBG
+    [ 0, 2, 3, 1 ], # 2 RBGG
+    [ 1, 0, 3, 2 ], # 3 GRBG
+    [ 1, 0, 2, 3 ], # 4 GRGB
+    [ 2, 3, 0, 1 ], # 5 GBRG
+    [ 0, 1, 1, 2 ], # 6 RGB
+    [ 0, 256, 256, 1 ], # 7 RB (green level is 256)
+);
+sub RedBlueBalance($@)
+{
+    my $blue = shift;
+    my ($i, $val, $levels);
+    for ($i=0; $i<@rggbLookup; ++$i) {
+        $levels = shift or next;
+        my @levels = split ' ', $levels;
+        next if @levels < 2;
+        my $lookup = $rggbLookup[$i];
+        my $g = $$lookup[1];    # get green level or index
+        if ($g < 4) {
+            next if @levels < 3;
+            $g = ($levels[$g] + $levels[$$lookup[2]]) / 2 or next;
+        } elsif ($levels[$$lookup[$blue * 3]] < 4) {
+            $g = 1; # Some Nikon cameras use a scaling factor of 1 (E5700)
+        }
+        $val = $levels[$$lookup[$blue * 3]] / $g;
+        last;
+    }
+    $val = $_[0] / $_[1] if not defined $val and ($_[0] and $_[1]);
+    return $val;
+}
+
+#------------------------------------------------------------------------------
+# Print exposure time as a fraction
+sub PrintExposureTime($)
+{
+    my $secs = shift;
+    if ($secs < 0.25001 and $secs > 0) {
+        return sprintf("1/%d",int(0.5 + 1/$secs));
+    }
+    $_ = sprintf("%.1f",$secs);
+    s/\.0$//;
+    return $_;
+}
+
+#------------------------------------------------------------------------------
+# Print CFA Pattern
+sub PrintCFAPattern($)
+{
+    my $val = shift;
+    return '<truncated data>' unless length $val > 4;
+    # some panasonic cameras (SV-AS3, SV-AS30) write this in ascii (very odd)
+    $val =~ /^[0-6]+$/ and $val =~ tr/0-6/\x00-\x06/;
+    my ($nx, $ny) = (Get16u(\$val, 0), Get16u(\$val, 2));
+    return '<zero pattern size>' unless $nx and $ny;
+    my $end = 4 + $nx * $ny;
+    if ($end > length $val) {
+        # try swapping byte order (I have seen this order different than in EXIF)
+        ($nx, $ny) = unpack('n2',pack('v2',$nx,$ny));
+        $end = 4 + $nx * $ny;
+        return '<invalid pattern size>' if $end > length $val;
+    }
+    my @cfaColor = qw(Red Green Blue Cyan Magenta Yellow White);
+    my ($pos, $rtnVal) = (4, '[');
+    for (;;) {
+        $rtnVal .= $cfaColor[Get8u(\$val,$pos)] || 'Unknown';
+        last if ++$pos >= $end;
+        ($pos - 4) % $ny and $rtnVal .= ',', next;
+        $rtnVal .= '][';
+    }
+    return $rtnVal . ']';
+}
+
+#------------------------------------------------------------------------------
+# Print conversion for lens info
+# Inputs: 0) string of values (min focal, max focal, min F, max F)
+# Returns: string in the form "12-20mm f/3.8-4.5" or "50mm f/1.4"
+sub PrintLensInfo($)
+{
+    my $val = shift;
+    my @vals = split ' ', $val;
+    return $val unless @vals == 4;
+    my $c = 0;
+    foreach (@vals) {
+        Image::ExifTool::IsFloat($_) and ++$c, next;
+        $_ eq 'inf' and $_ = '?', ++$c, next;
+        $_ eq 'undef' and $_ = '?', ++$c, next;
+    }
+    return $val unless $c == 4;
+    $val = "$vals[1]mm f/$vals[2]";
+    $val = "$vals[0]-$val" if $vals[0] ne $vals[1];
+    $val .= "-$vals[3]" if $vals[3] ne $vals[2];
+    return $val;
+}
+
+#------------------------------------------------------------------------------
+# Get lens info from lens model string
+# Inputs: 0) lens string, 1) flag to allow unknown "?" values
+# Returns: 0) min focal, 1) max focal, 2) min aperture, 3) max aperture
+# Notes: returns empty list if lens string could not be parsed
+sub GetLensInfo($;$)
+{
+    my ($lens, $unk) = @_;
+    # extract focal length and aperture ranges for this lens
+    my $pat = '\\d+(?:\\.\\d+)?';
+    $pat .= '|\\?' if $unk;
+    return () unless $lens =~ /($pat)(?:-($pat))?\s*mm.*?(?:[fF]\/?\s*)($pat)(?:-($pat))?/;
+    # ($1=short focal, $2=long focal, $3=max aperture wide, $4=max aperture tele)
+    my @a = ($1, $2, $3, $4);
+    $a[1] or $a[1] = $a[0];
+    $a[3] or $a[3] = $a[2];
+    if ($unk) {
+        local $_;
+        $_ eq '?' and $_ = 'undef' foreach @a;
+    }
+    return @a;
+}
+
+#------------------------------------------------------------------------------
+# Attempt to identify the specific lens if multiple lenses have the same LensType
+# Inputs: 0) ExifTool object ref, 1) LensType string, 2) LensType value,
+#         3) FocalLength, 4) MaxAperture, 5) MaxApertureValue, 6) ShortFocal,
+#         7) LongFocal, 8) LensModel, 9) LensFocalRange
+sub PrintLensID($$@)
+{
+    my ($exifTool, $lensTypePrt, $lensType, $focalLength, $maxAperture,
+        $maxApertureValue, $shortFocal, $longFocal, $lensModel, $lensFocalRange) = @_;
+    # the rest of the logic relies on the LensType lookup:
+    return undef unless defined $lensType;
+    my $printConv = $exifTool->{TAG_INFO}{LensType}{PrintConv};
+    # just copy LensType PrintConv value if it was a lens name
+    # (Olympus or Panasonic -- just exclude things like Nikon and Leaf LensType)
+    unless (ref $printConv eq 'HASH') {
+        return $lensTypePrt if $lensTypePrt =~ /mm/;
+        return $lensTypePrt if $lensTypePrt =~ s/(\d)\/F/$1mm F/;
+        return undef;
+    }
+    # use MaxApertureValue if MaxAperture is not available
+    $maxAperture = $maxApertureValue unless $maxAperture;
+    if ($lensFocalRange and $lensFocalRange =~ /^(\d+)(?: to (\d+))?$/) {
+        ($shortFocal, $longFocal) = ($1, $2 || $1);
+    }
+    if ($shortFocal and $longFocal) {
+        # Canon includes makernote information which allows better lens identification
+        require Image::ExifTool::Canon;
+        return Image::ExifTool::Canon::PrintLensID($printConv, $lensType,
+                    $shortFocal, $longFocal, $maxAperture, $lensModel);
+    }
+    my $lens = $$printConv{$lensType};
+    return ($lensModel || $lensTypePrt) unless $lens;
+    return $lens unless $$printConv{"$lensType.1"};
+    $lens =~ s/ or .*//s;    # remove everything after "or"
+    # make list of all possible matching lenses
+    my @lenses = ( $lens );
+    my $i;
+    for ($i=1; $$printConv{"$lensType.$i"}; ++$i) {
+        push @lenses, $$printConv{"$lensType.$i"};
+    }
+    # attempt to determine actual lens
+    my (@matches, @best, @user, $diff);
+    foreach $lens (@lenses) {
+        if ($Image::ExifTool::userLens{$lens}) {
+            push @user, $lens;
+            next;
+        }
+        my ($sf, $lf, $sa, $la) = GetLensInfo($lens);
+        next unless $sf;
+        # see if we can rule out this lens using FocalLength and MaxAperture
+        if ($focalLength) {
+            next if $focalLength < $sf - 0.5;
+            next if $focalLength > $lf + 0.5;
+        }
+        if ($maxAperture) {
+            # it seems that most manufacturers set MaxAperture and MaxApertureValue
+            # to the maximum aperture (smallest F number) for the current focal length
+            # of the lens, so assume that MaxAperture varies with focal length and find
+            # the closest match (this is somewhat contrary to the EXIF specification which
+            # states "The smallest F number of the lens", without mention of focal length)
+            next if $maxAperture < $sa - 0.15;  # (0.15 is arbitrary)
+            next if $maxAperture > $la + 0.15;
+            # now determine the best match for this aperture
+            my $aa; # approximate maximum aperture at this focal length
+            if ($sf == $lf or $sa == $la) {
+                $aa = $sa;
+            } else {
+                # assume a log-log variation of max aperture with focal length
+                # (see http://regex.info/blog/2006-10-05/263)
+                $aa = exp(log($sa) + (log($la)-log($sa)) / (log($lf)-log($sf)) *
+                                     (log($focalLength)-log($sf)));
+            }
+            my $d = abs($maxAperture - $aa);
+            if (defined $diff) {
+                $d > $diff + 0.15 and next;     # (0.15 is arbitrary)
+                $d < $diff - 0.15 and undef @best;
+            }
+            $diff = $d;
+            push @best, $lens;
+        }
+        push @matches, $lens;
+    }
+    return join(' or ', @user) if @user;
+    return join(' or ', @best) if @best;
+    return join(' or ', @matches) if @matches;
+    return $$printConv{$lensType};
+}
+
+#------------------------------------------------------------------------------
+# translate date into standard EXIF format
+# Inputs: 0) date
+# Returns: date in format '2003:10:22'
+# - bad formats recognized: '2003-10-22','2003/10/22','2003 10 22','20031022'
+# - removes null terminator if it exists
+sub ExifDate($)
+{
+    my $date = shift;
+    $date =~ s/\0$//;       # remove any null terminator
+    # separate year:month:day with colons (instead of -, /, space or nothing)
+    $date =~ s/(\d{4})[- \/:]*(\d{2})[- \/:]*(\d{2})$/$1:$2:$3/;
+    return $date;
+}
+
+#------------------------------------------------------------------------------
+# translate time into standard EXIF format
+# Inputs: 0) time
+# Returns: time in format '10:30:55'
+# - bad formats recognized: '10 30 55', '103055', '103055+0500'
+# - removes null terminator if it exists
+# - leaves time zone intact if specified (ie. '10:30:55+05:00')
+sub ExifTime($)
+{
+    my $time = shift;
+    $time =~ tr/ /:/;   # use ':' (not ' ') as a separator
+    $time =~ s/\0$//;   # remove any null terminator
+    # add separators if they don't exist
+    $time =~ s/^(\d{2})(\d{2})(\d{2})/$1:$2:$3/;
+    $time =~ s/([+-]\d{2})(\d{2})\s*$/$1:$2/;   # to timezone too
+    return $time;
+}
+
+#------------------------------------------------------------------------------
+# extract image from file
+# Inputs: 0) ExifTool object reference, 1) data offset (in file), 2) data length
+#         3) [optional] tag name
+# Returns: Reference to Image if specifically requested or "Binary data" message
+#          Returns undef if there was an error loading the image
+sub ExtractImage($$$$)
+{
+    my ($exifTool, $offset, $len, $tag) = @_;
+    my $dataPt = \$exifTool->{EXIF_DATA};
+    my $dataPos = $exifTool->{EXIF_POS};
+    my $image;
+
+    # no image if length is zero, and don't try to extract binary from XMP file
+    return undef if not $len or $$exifTool{FILE_TYPE} eq 'XMP';
+
+    # take data from EXIF block if possible
+    if (defined $dataPos and $offset>=$dataPos and $offset+$len<=$dataPos+length($$dataPt)) {
+        $image = substr($$dataPt, $offset-$dataPos, $len);
+    } else {
+        $image = $exifTool->ExtractBinary($offset, $len, $tag);
+        return undef unless defined $image;
+        # patch for incorrect ThumbnailOffset in some Sony DSLR-A100 ARW images
+        if ($tag and $tag eq 'ThumbnailImage' and $$exifTool{TIFF_TYPE} eq 'ARW' and
+            $$exifTool{Model} eq 'DSLR-A100' and $offset < 0x10000 and
+            $image !~ /^(Binary data|\xff\xd8\xff)/)
+        {
+            my $try = $exifTool->ExtractBinary($offset + 0x10000, $len, $tag);
+            if (defined $try and $try =~ /^\xff\xd8\xff/) {
+                $image = $try;
+                $exifTool->{VALUE}->{ThumbnailOffset} += 0x10000;
+                $exifTool->Warn('Adjusted incorrect A100 ThumbnailOffset', 1);
+            }
+        }
+    }
+    return $exifTool->ValidateImage(\$image, $tag);
+}
+
+#------------------------------------------------------------------------------
+# Process EXIF directory
+# Inputs: 0) ExifTool object reference
+#         1) Reference to directory information hash
+#         2) Pointer to tag table for this directory
+# Returns: 1 on success, otherwise returns 0 and sets a Warning
+sub ProcessExif($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dataPos = $$dirInfo{DataPos} || 0;
+    my $dataLen = $$dirInfo{DataLen};
+    my $dirStart = $$dirInfo{DirStart} || 0;
+    my $dirLen = $$dirInfo{DirLen} || $dataLen - $dirStart;
+    my $dirName = $$dirInfo{DirName};
+    my $base = $$dirInfo{Base} || 0;
+    my $firstBase = $base;
+    my $raf = $$dirInfo{RAF};
+    my $verbose = $exifTool->Options('Verbose');
+    my $htmlDump = $exifTool->{HTML_DUMP};
+    my $success = 1;
+    my ($tagKey, $dirSize, $makerAddr);
+    my $inMakerNotes = $tagTablePtr->{GROUPS}{0} eq 'MakerNotes';
+
+    # ignore non-standard EXIF while in strict MWG compatibility mode
+    if ($Image::ExifTool::MWG::strict and $dirName eq 'IFD0' and
+        $tagTablePtr eq \%Image::ExifTool::Exif::Main and
+        $$exifTool{FILE_TYPE} =~ /^(JPEG|TIFF|PSD)$/)
+    {
+        my $path = $exifTool->MetadataPath();
+        unless ($path =~ /^(JPEG-APP1-IFD0|TIFF-IFD0|PSD-EXIFInfo-IFD0)$/) {
+            $exifTool->Warn("Ignored non-standard EXIF at $path");
+            return 1;
+        }
+    }
+    $verbose = -1 if $htmlDump; # mix htmlDump into verbose so we can test for both at once
+    $dirName eq 'EXIF' and $dirName = $$dirInfo{DirName} = 'IFD0';
+    $$dirInfo{Multi} = 1 if $dirName =~ /^(IFD0|SubIFD)$/ and not defined $$dirInfo{Multi};
+    # get a more descriptive name for MakerNote sub-directories
+    my $name = $$dirInfo{Name};
+    $name = $dirName unless $name and $inMakerNotes and $name !~ /^MakerNote/;
+
+    my ($numEntries, $dirEnd);
+    if ($dirStart >= 0 and $dirStart <= $dataLen-2) {
+        # make sure data is large enough (patches bug in Olympus subdirectory lengths)
+        $numEntries = Get16u($dataPt, $dirStart);
+        $dirSize = 2 + 12 * $numEntries;
+        $dirEnd = $dirStart + $dirSize;
+        if ($dirSize > $dirLen) {
+            if ($verbose > 0 and not $$dirInfo{SubIFD}) {
+                my $short = $dirSize - $dirLen;
+                $exifTool->Warn("Short directory size (missing $short bytes)");
+            }
+            undef $dirSize if $dirEnd > $dataLen; # read from file if necessary
+        }
+    }
+    # read IFD from file if necessary
+    unless ($dirSize) {
+        $success = 0;
+        if ($raf) {
+            # read the count of entries in this IFD
+            my $offset = $dirStart + $dataPos;
+            my ($buff, $buf2);
+            if ($raf->Seek($offset + $base, 0) and $raf->Read($buff,2) == 2) {
+                my $len = 12 * Get16u(\$buff,0);
+                # also read next IFD pointer if available
+                if ($raf->Read($buf2, $len+4) >= $len) {
+                    $buff .= $buf2;
+                    # make copy of dirInfo since we're going to modify it
+                    my %newDirInfo = %$dirInfo;
+                    $dirInfo = \%newDirInfo;
+                    # update directory parameters for the newly loaded IFD
+                    $dataPt = $$dirInfo{DataPt} = \$buff;
+                    $dataPos = $$dirInfo{DataPos} = $offset;
+                    $dataLen = $$dirInfo{DataLen} = length $buff;
+                    $dirStart = $$dirInfo{DirStart} = 0;
+                    $dirLen = $$dirInfo{DirLen} = length $buff;
+                    $success = 1;
+                }
+            }
+        }
+        unless ($success) {
+            $exifTool->Warn("Bad $name directory");
+            return 0;
+        }
+        $numEntries = Get16u($dataPt, $dirStart);
+        $dirSize = 2 + 12 * $numEntries;
+        $dirEnd = $dirStart + $dirSize;
+    }
+    $verbose > 0 and $exifTool->VerboseDir($dirName, $numEntries);
+    my $bytesFromEnd = $dataLen - $dirEnd;
+    if ($bytesFromEnd < 4) {
+        unless ($bytesFromEnd==2 or $bytesFromEnd==0) {
+            $exifTool->Warn(sprintf"Illegal $name directory size (0x%x entries)",$numEntries);
+            return 0;
+        }
+    }
+    # fix base offset for maker notes if necessary
+    if (defined $$dirInfo{MakerNoteAddr}) {
+        $makerAddr = $$dirInfo{MakerNoteAddr};
+        delete $$dirInfo{MakerNoteAddr};
+        if (Image::ExifTool::MakerNotes::FixBase($exifTool, $dirInfo)) {
+            $base = $$dirInfo{Base};
+            $dataPos = $$dirInfo{DataPos};
+        }
+    }
+    if ($htmlDump) {
+        my $longName = $name eq 'MakerNotes' ? ($$dirInfo{Name} || $name) : $name;
+        if (defined $makerAddr) {
+            my $hdrLen = $dirStart + $dataPos + $base - $makerAddr;
+            $exifTool->HDump($makerAddr, $hdrLen, "MakerNotes header", $longName) if $hdrLen > 0;
+        }
+        $exifTool->HDump($dirStart + $dataPos + $base, 2, "$longName entries",
+                 "Entry count: $numEntries");
+        my $tip;
+        if ($bytesFromEnd >= 4) {
+            my $nxt = ($name =~ /^(.*?)(\d+)$/) ? $1 . ($2 + 1) : 'Next IFD';
+            $tip = sprintf("$nxt offset: 0x%.4x", Get32u($dataPt, $dirEnd));
+        }
+        $exifTool->HDump($dirEnd + $dataPos + $base, 4, "Next IFD", $tip, 0);
+    }
+
+    # patch for Canon EOS 40D firmware 1.0.4 bug (incorrect directory counts)
+    # (must do this before parsing directory or CameraSettings offset will be suspicious)
+    if ($inMakerNotes and $$exifTool{Model} eq 'Canon EOS 40D') {
+        my $entry = $dirStart + 2 + 12 * ($numEntries - 1);
+        my $fmt = Get16u($dataPt, $entry + 2);
+        if ($fmt < 1 or $fmt > 13) {
+            $exifTool->HDump($entry+$dataPos+$base,12,"[invalid IFD entry]",
+                     "Bad format type: $fmt", 1);
+            # adjust the number of directory entries
+            --$numEntries;
+            $dirEnd -= 12;
+        }
+    }
+
+    # loop through all entries in an EXIF directory (IFD)
+    my ($index, $valEnd, $offList, $offHash);
+    my $warnCount = 0;
+    for ($index=0; $index<$numEntries; ++$index) {
+        if ($warnCount > 10) {
+            $exifTool->Warn("Too many warnings -- $name parsing aborted", 1) and return 0;
+        }
+        my $entry = $dirStart + 2 + 12 * $index;
+        my $tagID = Get16u($dataPt, $entry);
+        my $format = Get16u($dataPt, $entry+2);
+        my $count = Get32u($dataPt, $entry+4);
+        if ($format < 1 or $format > 13) {
+            $exifTool->HDump($entry+$dataPos+$base,12,"[invalid IFD entry]",
+                     "Bad format type: $format", 1);
+            # warn unless the IFD was just padded with zeros
+            if ($format) {
+                $exifTool->Warn(sprintf("Unknown format ($format) for $name tag 0x%x",$tagID));
+                ++$warnCount;
+            }
+            return 0 unless $index; # assume corrupted IFD if this is our first entry
+            next;
+        }
+        my $formatStr = $formatName[$format];   # get name of this format
+        my $valueDataPt = $dataPt;
+        my $valueDataPos = $dataPos;
+        my $valueDataLen = $dataLen;
+        my $valuePtr = $entry + 8;      # pointer to value within $$dataPt
+        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tagID);
+        my $origFormStr;
+        # hack to patch incorrect count in Kodak SubIFD3 tags
+        if ($count < 2 and ref $$tagTablePtr{$tagID} eq 'HASH' and $$tagTablePtr{$tagID}{FixCount}) {
+            $offList or ($offList, $offHash) = GetOffList($dataPt, $dirStart, $dataPos,
+                                                          $numEntries, $tagTablePtr);
+            my $i = $$offHash{Get32u($dataPt, $valuePtr)};
+            if (defined $i and $i < $#$offList) {
+                my $oldCount = $count;
+                $count = int(($$offList[$i+1] - $$offList[$i]) / $formatSize[$format]);
+                $origFormStr = $formatName[$format] . '[' . $oldCount . ']' if $oldCount != $count;
+            }
+        }
+        my $size = $count * $formatSize[$format];
+        my $readSize = $size;
+        if ($size > 4) {
+            if ($size > 0x7fffffff) {
+                $exifTool->Warn(sprintf("Invalid size ($size) for $name tag 0x%x",$tagID));
+                ++$warnCount;
+                next;
+            }
+            $valuePtr = Get32u($dataPt, $valuePtr);
+            # fix valuePtr if necessary
+            if ($$dirInfo{FixOffsets}) {
+                my $wFlag;
+                $valEnd or $valEnd = $dataPos + $dirEnd + 4;
+                #### eval FixOffsets ($valuePtr, $valEnd, $size, $tagID, $wFlag)
+                eval $$dirInfo{FixOffsets};
+            }
+            my $suspect;
+            # offset shouldn't point into TIFF header
+            $valuePtr < 8 and $suspect = $warnCount;
+            # convert offset to pointer in $$dataPt
+            if ($$dirInfo{EntryBased} or (ref $$tagTablePtr{$tagID} eq 'HASH' and
+                $tagTablePtr->{$tagID}{EntryBased}))
+            {
+                $valuePtr += $entry;
+            } else {
+                $valuePtr -= $dataPos;
+            }
+            # value shouldn't overlap our directory
+            $suspect = $warnCount if $valuePtr < $dirEnd and $valuePtr+$size > $dirStart;
+            # load value from file if necessary
+            if ($valuePtr < 0 or $valuePtr+$size > $dataLen) {
+                # get value by seeking in file if we are allowed
+                my $buff;
+                if ($raf) {
+                    # avoid loading large binary data unless necessary
+                    # (ie. ImageSourceData -- layers in Photoshop TIFF image)
+                    while ($size > BINARY_DATA_LIMIT) {
+                        if ($tagInfo) {
+                            # make large unknown blocks binary data
+                            $$tagInfo{Binary} = 1 if $$tagInfo{Unknown};
+                            last unless $$tagInfo{Binary};      # must read non-binary data
+                            last if $$tagInfo{SubDirectory};    # must read SubDirectory data
+                            if ($exifTool->{OPTIONS}{Binary}) {
+                                # read binary data if specified unless tagsFromFile won't use it
+                                last unless $$exifTool{TAGS_FROM_FILE} and $$tagInfo{Protected};
+                            }
+                            # must read if tag is specified by name
+                            last if $exifTool->{REQ_TAG_LOOKUP}{lc($$tagInfo{Name})};
+                        } else {
+                            # must read value if needed for a condition
+                            last if defined $tagInfo;
+                        }
+                        # (note: changing the value without changing $size will cause
+                        # a warning in the verbose output, but we need to maintain the
+                        # proper size for the htmlDump, so we can't change this)
+                        $buff = "Binary data $size bytes";
+                        $readSize = length $buff;
+                        last;
+                    }
+                    # read from file if necessary
+                    unless (defined $buff or
+                            ($raf->Seek($base + $valuePtr + $dataPos,0) and
+                             $raf->Read($buff,$size) == $size))
+                    {
+                        $exifTool->Warn("Error reading value for $name entry $index", $inMakerNotes);
+                        return 0 unless $inMakerNotes;
+                        ++$warnCount;
+                        $buff = '' unless defined $buff;
+                        $readSize = length $buff;
+                    }
+                    $valueDataPt = \$buff;
+                    $valueDataPos = $valuePtr + $dataPos;
+                    $valueDataLen = length $buff;
+                    $valuePtr = 0;
+                } else {
+                    my ($tagStr, $tmpInfo);
+                    if ($tagInfo) {
+                        $tagStr = $$tagInfo{Name};
+                    } elsif (defined $tagInfo) {
+                        $tmpInfo = $exifTool->GetTagInfo($tagTablePtr, $tagID, \ '', $formatStr, $count);
+                        $tagStr = $$tmpInfo{Name} if $tmpInfo;
+                    }
+                    if ($tagInfo and $$tagInfo{ChangeBase}) {
+                        # adjust base offset for this tag only
+                        #### eval ChangeBase ($dirStart,$dataPos)
+                        my $newBase = eval $$tagInfo{ChangeBase};
+                        $valuePtr += $newBase;
+                    }
+                    $tagStr or $tagStr = sprintf("tag 0x%x",$tagID);
+                    # allow PreviewImage to run outside EXIF data
+                    if ($tagStr eq 'PreviewImage' and $exifTool->{RAF}) {
+                        my $pos = $exifTool->{RAF}->Tell();
+                        $buff = $exifTool->ExtractBinary($base + $valuePtr + $dataPos, $size, 'PreviewImage');
+                        $exifTool->{RAF}->Seek($pos, 0);
+                        $valueDataPt = \$buff;
+                        $valueDataPos = $valuePtr + $dataPos;
+                        $valueDataLen = $size;
+                        $valuePtr = 0;
+                    } elsif ($tagStr eq 'MakerNoteLeica6' and $exifTool->{RAF}) {
+                        if ($verbose > 0) {
+                            $exifTool->VPrint(0, "$$exifTool{INDENT}$index) $tagStr --> (outside APP1 segment)\n");
+                        }
+                        if ($exifTool->Options('FastScan')) {
+                            $exifTool->Warn('Ignored Leica MakerNote trailer');
+                        } else {
+                            $$exifTool{LeicaTrailer} = {
+                                TagInfo => $tagInfo || $tmpInfo,
+                                Offset  => $base + $valuePtr + $dataPos,
+                                Size    => $size,
+                            };
+                        }
+                    } else {
+                        $exifTool->Warn("Bad $name offset for $tagStr");
+                        ++$warnCount;
+                    }
+                    unless (defined $buff) {
+                        next unless $htmlDump and $size < 1000000;
+                        $valueDataPt = \ (' ' x $size);
+                        $valueDataPos = $valuePtr + $dataPos;
+                        $valueDataLen = -1; # flag the bad pointer
+                        $valuePtr = 0;
+                    }
+                }
+            }
+            # warn about suspect offsets if they didn't already cause another warning
+            if (defined $suspect and $suspect == $warnCount) {
+                my $tagStr = $tagInfo ? $$tagInfo{Name} : sprintf('tag 0x%.4x', $tagID);
+                if ($exifTool->Warn("Suspicious $name offset for $tagStr", $inMakerNotes)) {
+                    ++$warnCount;
+                    next unless $verbose;
+                }
+            }
+        }
+        # treat single unknown byte as int8u
+        $formatStr = 'int8u' if $format == 7 and $count == 1;
+
+        my ($val, $subdir, $wrongFormat);
+        if ($tagID > 0xf000 and $tagTablePtr eq \%Image::ExifTool::Exif::Main) {
+            my $oldInfo = $$tagTablePtr{$tagID};
+            if (not $oldInfo or (ref $oldInfo eq 'HASH' and $$oldInfo{Condition})) {
+                # handle special case of Photoshop RAW tags (0xfde8-0xfe58)
+                # --> generate tags from the value if possible
+                $val = ReadValue($valueDataPt,$valuePtr,$formatStr,$count,$readSize);
+                if (defined $val and $val =~ /(.*): (.*)/) {
+                    my $tag = $1;
+                    $val = $2;
+                    $tag =~ s/'s//; # remove 's (so "Owner's Name" becomes "OwnerName")
+                    $tag =~ tr/a-zA-Z0-9_//cd; # remove unknown characters
+                    if ($tag) {
+                        $tagInfo = {
+                            Name => $tag,
+                            ValueConv => '$_=$val;s/.*: //;$_', # remove descr
+                        };
+                        Image::ExifTool::AddTagToTable($tagTablePtr, $tagID, $tagInfo);
+                        # generate conditional list if a conditional tag already existed
+                        $$tagTablePtr{$tagID} = [ $oldInfo, $tagInfo ] if $oldInfo;
+                    }
+                }
+            }
+        }
+        if (defined $tagInfo and not $tagInfo) {
+            # GetTagInfo() required the value for a Condition
+            my $tmpVal = substr($$valueDataPt, $valuePtr, $readSize < 128 ? $readSize : 128);
+            # (use original format name in this call -- $formatStr may have been changed to int8u)
+            $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tagID, \$tmpVal,
+                                             $formatName[$format], $count);
+        }
+        # make sure we are handling the 'ifd' format properly
+        if (($format == 13 or $format == 18) and (not $tagInfo or not $$tagInfo{SubIFD})) {
+            my $str = sprintf('%s tag 0x%.4x IFD format not handled', $dirName, $tagID);
+            $exifTool->Warn($str, $inMakerNotes);
+        }
+        if (defined $tagInfo) {
+            $subdir = $$tagInfo{SubDirectory};
+            # override EXIF format if specified
+            if ($$tagInfo{Format}) {
+                $formatStr = $$tagInfo{Format};
+                my $newNum = $formatNumber{$formatStr};
+                if ($newNum and $newNum != $format) {
+                    $origFormStr = $formatName[$format] . '[' . $count . ']';
+                    $format = $newNum;
+                    # adjust number of items for new format size
+                    $count = int($size / $formatSize[$format]);
+                }
+            }
+            # verify that offset-type values are integral
+            if (($$tagInfo{IsOffset} or $$tagInfo{SubIFD}) and not $intFormat{$formatStr}) {
+                $exifTool->Warn("Wrong format ($formatStr) for $name $$tagInfo{Name}");
+                next unless $verbose;
+                $wrongFormat = 1;
+            }
+        } else {
+            next unless $verbose;
+        }
+        # convert according to specified format
+        $val = ReadValue($valueDataPt,$valuePtr,$formatStr,$count,$readSize);
+
+        if ($verbose) {
+            my $tval = $val;
+            if ($formatStr =~ /^rational64([su])$/ and defined $tval) {
+                # show numerator/denominator separately
+                my $f = ReadValue($valueDataPt,$valuePtr,"int32$1",$count*2,$readSize);
+                $f =~ s/(-?\d+) (-?\d+)/$1\/$2/g;
+                $tval .= " ($f)";
+            }
+            if ($htmlDump) {
+                my ($tagName, $colName);
+                if ($tagID == 0x927c and $dirName eq 'ExifIFD') {
+                    $tagName = 'MakerNotes';
+                } elsif ($tagInfo) {
+                    $tagName = $$tagInfo{Name};
+                } else {
+                    $tagName = sprintf("Tag 0x%.4x",$tagID);
+                }
+                my $dname = sprintf("${name}-%.2d", $index);
+                # build our tool tip
+                $size < 0 and $size = $count * $formatSize[$format];
+                my $fstr = "$formatName[$format]\[$count]";
+                $fstr = "$origFormStr read as $fstr" if $origFormStr and $origFormStr ne $fstr;
+                $fstr .= ' <-- WRONG' if $wrongFormat;
+                my $tip = sprintf("Tag ID: 0x%.4x\n", $tagID) .
+                          "Format: $fstr\nSize: $size bytes\n";
+                if ($size > 4) {
+                    my $offPt = Get32u($dataPt,$entry+8);
+                    my $actPt = $valuePtr + $valueDataPos + $base - ($$exifTool{EXIF_POS} || 0);
+                    $tip .= sprintf("Value offset: 0x%.4x\n", $offPt);
+                    # highlight tag name (red for bad size)
+                    my $style = ($valueDataLen < 0 or not defined $tval) ? 'V' : 'H';
+                    if ($actPt != $offPt) {
+                        $tip .= sprintf("Actual offset: 0x%.4x\n", $actPt);
+                        my $sign = $actPt < $offPt ? '-' : '';
+                        $tip .= sprintf("Offset base: ${sign}0x%.4x\n", abs($actPt - $offPt));
+                        $style = 'F' if $style eq 'H';  # purple for different offsets
+                    }
+                    $colName = "<span class=$style>$tagName</span>";
+                    $colName .= ' <span class=V>(odd)</span>' if $offPt & 0x01;
+                } else {
+                    $colName = $tagName;
+                }
+                $colName .= ' <span class=V>(err)</span>' if $wrongFormat;
+                if ($valueDataLen < 0 or not defined $tval) {
+                    $tval = '<bad offset>';
+                } else {
+                    $tval = substr($tval,0,28) . '[...]' if length($tval) > 32;
+                    if ($formatStr =~ /^(string|undef|binary)/) {
+                        # translate non-printable characters
+                        $tval =~ tr/\x00-\x1f\x7f-\xff/./;
+                    } elsif ($tagInfo and Image::ExifTool::IsInt($tval)) {
+                        if ($$tagInfo{IsOffset} or $$tagInfo{SubIFD}) {
+                            $tval = sprintf('0x%.4x', $tval);
+                            my $actPt = $val + $base - ($$exifTool{EXIF_POS} || 0);
+                            if ($actPt != $val) {
+                                $tval .= sprintf("\nActual offset: 0x%.4x", $actPt);
+                                my $sign = $actPt < $val ? '-' : '';
+                                $tval .= sprintf("\nOffset base: ${sign}0x%.4x", abs($actPt - $val));
+                            }
+                        } elsif ($$tagInfo{PrintHex}) {
+                            $tval = sprintf('0x%x', $tval);
+                        }
+                    }
+                }
+                $tip .= "Value: $tval";
+                $exifTool->HDump($entry+$dataPos+$base, 12, "$dname $colName", $tip, 1);
+                next if $valueDataLen < 0;  # don't process bad pointer entry
+                if ($size > 4) {
+                    my $exifDumpPos = $valuePtr + $valueDataPos + $base;
+                    my $flag = 0;
+                    if ($subdir) {
+                        if ($$tagInfo{MakerNotes}) {
+                            $flag = 0x04;
+                        } elsif ($$tagInfo{NestedHtmlDump}) {
+                            $flag = $$tagInfo{NestedHtmlDump} == 2 ? 0x10 : 0x04;
+                        }
+                    }
+                    # add value data block (underlining maker notes data)
+                    $exifTool->HDump($exifDumpPos,$size,"$tagName value",'SAME', $flag);
+                }
+            } else {
+                my $fstr = $formatName[$format];
+                $fstr = "$origFormStr read as $fstr" if $origFormStr;
+                $exifTool->VerboseInfo($tagID, $tagInfo,
+                    Table   => $tagTablePtr,
+                    Index   => $index,
+                    Value   => $tval,
+                    DataPt  => $valueDataPt,
+                    DataPos => $valueDataPos + $base,
+                    Size    => $size,
+                    Start   => $valuePtr,
+                    Format  => $fstr,
+                    Count   => $count,
+                );
+            }
+            next if not $tagInfo or $wrongFormat;
+        }
+        next unless defined $val;
+#..............................................................................
+# Handle SubDirectory tag types
+#
+        if ($subdir) {
+            # don't process empty subdirectories
+            unless ($size) {
+                unless ($$tagInfo{MakerNotes} or $inMakerNotes) {
+                    $exifTool->Warn("Empty $$tagInfo{Name} data", 1);
+                }
+                next;
+            }
+            my (@values, $newTagTable, $dirNum, $newByteOrder, $invalid);
+            my $tagStr = $$tagInfo{Name};
+            if ($$subdir{MaxSubdirs}) {
+                @values = split ' ', $val;
+                # limit the number of subdirectories we parse
+                my $over = @values - $$subdir{MaxSubdirs};
+                if ($over > 0) {
+                    $exifTool->Warn("Ignoring $over $tagStr directories");
+                    pop @values while $over--;
+                }
+                $val = shift @values;
+            }
+            if ($$subdir{TagTable}) {
+                $newTagTable = GetTagTable($$subdir{TagTable});
+                $newTagTable or warn("Unknown tag table $$subdir{TagTable}"), next;
+            } else {
+                $newTagTable = $tagTablePtr;    # use existing table
+            }
+            # loop through all sub-directories specified by this tag
+            for ($dirNum=0; ; ++$dirNum) {
+                my $subdirBase = $base;
+                my $subdirDataPt = $valueDataPt;
+                my $subdirDataPos = $valueDataPos;
+                my $subdirDataLen = $valueDataLen;
+                my $subdirStart = $valuePtr;
+                if (defined $$subdir{Start}) {
+                    # set local $valuePtr relative to file $base for eval
+                    my $valuePtr = $subdirStart + $subdirDataPos;
+                    #### eval Start ($valuePtr, $val)
+                    my $newStart = eval($$subdir{Start});
+                    unless (Image::ExifTool::IsInt($newStart)) {
+                        $exifTool->Warn("Bad value for $tagStr");
+                        last;
+                    }
+                    # convert back to relative to $subdirDataPt
+                    $newStart -= $subdirDataPos;
+                    # must adjust directory size if start changed
+                    $size -= $newStart - $subdirStart unless $$subdir{BadOffset};
+                    $subdirStart = $newStart;
+                }
+                # this is a pain, but some maker notes are always a specific
+                # byte order, regardless of the byte order of the file
+                my $oldByteOrder = GetByteOrder();
+                $newByteOrder = $$subdir{ByteOrder};
+                if ($newByteOrder) {
+                    if ($newByteOrder =~ /^Little/i) {
+                        $newByteOrder = 'II';
+                    } elsif ($newByteOrder =~ /^Big/i) {
+                        $newByteOrder = 'MM';
+                    } elsif ($$subdir{OffsetPt}) {
+                        undef $newByteOrder;
+                        warn "Can't have variable byte ordering for SubDirectories using OffsetPt";
+                        last;
+                    } elsif ($subdirStart + 2 <= $subdirDataLen) {
+                        # attempt to determine the byte ordering by checking
+                        # at the number of directory entries.  This is an int16u
+                        # that should be a reasonable value.
+                        my $num = Get16u($subdirDataPt, $subdirStart);
+                        if ($num & 0xff00 and ($num>>8) > ($num&0xff)) {
+                            # This looks wrong, we shouldn't have this many entries
+                            my %otherOrder = ( II=>'MM', MM=>'II' );
+                            $newByteOrder = $otherOrder{$oldByteOrder};
+                        } else {
+                            $newByteOrder = $oldByteOrder;
+                        }
+                    }
+                } else {
+                    $newByteOrder = $oldByteOrder;
+                }
+                # set base offset if necessary
+                if ($$subdir{Base}) {
+                    # calculate subdirectory start relative to $base for eval
+                    my $start = $subdirStart + $subdirDataPos;
+                    #### eval Base ($start,$base)
+                    $subdirBase = eval($$subdir{Base}) + $base;
+                }
+                # add offset to the start of the directory if necessary
+                if ($$subdir{OffsetPt}) {
+                    #### eval OffsetPt ($valuePtr)
+                    my $pos = eval $$subdir{OffsetPt};
+                    if ($pos + 4 > $subdirDataLen) {
+                        $exifTool->Warn("Bad $tagStr OffsetPt");
+                        last;
+                    }
+                    SetByteOrder($newByteOrder);
+                    $subdirStart += Get32u($subdirDataPt, $pos);
+                    SetByteOrder($oldByteOrder);
+                }
+                if ($subdirStart < 0 or $subdirStart + 2 > $subdirDataLen) {
+                    # convert $subdirStart back to a file offset
+                    if ($raf) {
+                        # reset SubDirectory buffer (we will load it later)
+                        my $buff = '';
+                        $subdirDataPt = \$buff;
+                        $subdirDataLen = $size = length $buff;
+                    } else {
+                        my $msg = "Bad $tagStr SubDirectory start";
+                        if ($verbose > 0) {
+                            if ($subdirStart < 0) {
+                                $msg .= " (directory start $subdirStart is before EXIF start)";
+                            } else {
+                                my $end = $subdirStart + $size;
+                                $msg .= " (directory end is $end but EXIF size is only $subdirDataLen)";
+                            }
+                        }
+                        $exifTool->Warn($msg);
+                        last;
+                    }
+                }
+
+                # must update subdirDataPos if $base changes for this subdirectory
+                $subdirDataPos += $base - $subdirBase;
+
+                # build information hash for new directory
+                my %subdirInfo = (
+                    Name       => $tagStr,
+                    Base       => $subdirBase,
+                    DataPt     => $subdirDataPt,
+                    DataPos    => $subdirDataPos,
+                    DataLen    => $subdirDataLen,
+                    DirStart   => $subdirStart,
+                    DirLen     => $size,
+                    RAF        => $raf,
+                    Parent     => $dirName,
+                    DirName    => $$subdir{DirName},
+                    FixBase    => $$subdir{FixBase},
+                    FixOffsets => $$subdir{FixOffsets},
+                    EntryBased => $$subdir{EntryBased},
+                    TagInfo    => $tagInfo,
+                    SubIFD     => $$tagInfo{SubIFD},
+                    Subdir     => $subdir,
+                );
+                # (remember: some cameras incorrectly write maker notes in IFD0)
+                if ($$tagInfo{MakerNotes}) {
+                    # don't parse makernotes if FastScan > 1
+                    my $fast = $exifTool->Options('FastScan');
+                    last if $fast and $fast > 1;
+                    $subdirInfo{MakerNoteAddr} = $valuePtr + $valueDataPos + $base;
+                    $subdirInfo{NoFixBase} = 1 if defined $$subdir{Base};
+                }
+                # set directory IFD name from group name of family 1 if it exists,
+                # unless the tag is extracted as a block in which case group 1 may
+                # have been set automatically if the block was previously extracted
+                if ($$tagInfo{Groups} and not $$tagInfo{BlockExtract}) {
+                    $subdirInfo{DirName} = $tagInfo->{Groups}{1};
+                    # number multiple subdirectories
+                    $subdirInfo{DirName} =~ s/\d*$/$dirNum/ if $dirNum;
+                }
+                SetByteOrder($newByteOrder);    # set byte order for this subdir
+                # validate the subdirectory if necessary
+                my $dirData = $subdirDataPt;    # set data pointer to be used in eval
+                #### eval Validate ($val, $dirData, $subdirStart, $size)
+                my $ok = 0;
+                if (defined $$subdir{Validate} and not eval $$subdir{Validate}) {
+                    $exifTool->Warn("Invalid $tagStr data");
+                    $invalid = 1;
+                } else {
+                    # process the subdirectory
+                    $ok = $exifTool->ProcessDirectory(\%subdirInfo, $newTagTable, $$subdir{ProcessProc});
+                }
+                # print debugging information if there were errors
+                if (not $ok and $verbose > 1 and $subdirStart != $valuePtr) {
+                    my $out = $exifTool->Options('TextOut');
+                    printf $out "%s    (SubDirectory start = 0x%x)\n", $exifTool->{INDENT}, $subdirStart;
+                }
+                SetByteOrder($oldByteOrder);    # restore original byte swapping
+
+                @values or last;
+                $val = shift @values;           # continue with next subdir
+            }
+            my $doMaker = $exifTool->Options('MakerNotes');
+            next unless $doMaker or $exifTool->{REQ_TAG_LOOKUP}{lc($tagStr)} or
+                        $$tagInfo{BlockExtract};
+            # extract as a block if specified
+            if ($$tagInfo{MakerNotes}) {
+                # save maker note byte order (if it was significant and valid)
+                if ($$subdir{ByteOrder} and not $invalid) {
+                    $exifTool->{MAKER_NOTE_BYTE_ORDER} =
+                        defined ($exifTool->{UnknownByteOrder}) ?
+                                 $exifTool->{UnknownByteOrder} : $newByteOrder;
+                }
+                if ($doMaker and $doMaker eq '2') {
+                    # extract maker notes without rebuilding (no fixup information)
+                    delete $exifTool->{MAKER_NOTE_FIXUP};
+                } elsif (not $$tagInfo{NotIFD}) {
+                    # this is a pain, but we must rebuild EXIF-typemaker notes to
+                    # include all the value data if data was outside the maker notes
+                    my %makerDirInfo = (
+                        Name       => $tagStr,
+                        Base       => $base,
+                        DataPt     => $valueDataPt,
+                        DataPos    => $valueDataPos,
+                        DataLen    => $valueDataLen,
+                        DirStart   => $valuePtr,
+                        DirLen     => $size,
+                        RAF        => $raf,
+                        Parent     => $dirName,
+                        DirName    => 'MakerNotes',
+                        FixOffsets => $$subdir{FixOffsets},
+                        TagInfo    => $tagInfo,
+                    );
+                    $makerDirInfo{FixBase} = 1 if $$subdir{FixBase};
+                    # rebuild maker notes (creates $exifTool->{MAKER_NOTE_FIXUP})
+                    my $val2 = RebuildMakerNotes($exifTool, $newTagTable, \%makerDirInfo);
+                    if (defined $val2) {
+                        $val = $val2;
+                    } else {
+                        $exifTool->Warn('Error rebuilding maker notes (may be corrupt)');
+                    }
+                }
+            } else {
+                # extract this directory as a block if specified
+                next unless $$tagInfo{Writable};
+            }
+        }
+ #..............................................................................
+        # convert to absolute offsets if this tag is an offset
+        #### eval IsOffset ($val, $exifTool)
+        if ($$tagInfo{IsOffset} and eval $$tagInfo{IsOffset}) {
+            my $offsetBase = $$tagInfo{IsOffset} eq '2' ? $firstBase : $base;
+            $offsetBase += $$exifTool{BASE};
+            # handle offsets which use a wrong base (Minolta A200)
+            if ($$tagInfo{WrongBase}) {
+                my $self = $exifTool;
+                #### eval WrongBase ($self)
+                $offsetBase += eval $$tagInfo{WrongBase} || 0;
+            }
+            my @vals = split(' ',$val);
+            foreach $val (@vals) {
+                $val += $offsetBase;
+            }
+            $val = join(' ', @vals);
+        }
+        # save the value of this tag
+        $tagKey = $exifTool->FoundTag($tagInfo, $val);
+        # set the group 1 name for tags in specified tables
+        if (defined $tagKey and $$tagTablePtr{SET_GROUP1}) {
+            $exifTool->SetGroup($tagKey, $dirName);
+        }
+    }
+
+    # scan for subsequent IFD's if specified
+    if ($$dirInfo{Multi} and $bytesFromEnd >= 4) {
+        my $offset = Get32u($dataPt, $dirEnd);
+        if ($offset) {
+            my $subdirStart = $offset - $dataPos;
+            # use same directory information for trailing directory,
+            # but change the start location (ProcessDirectory will
+            # test to make sure we don't reprocess the same dir twice)
+            my %newDirInfo = %$dirInfo;
+            $newDirInfo{DirStart} = $subdirStart;
+            # increment IFD number
+            my $ifdNum = $newDirInfo{DirName} =~ s/(\d+)$// ? $1 : 0;
+            $newDirInfo{DirName} .= $ifdNum + 1;
+            # must validate SubIFD1 because the nextIFD pointer is invalid for some RAW formats
+            if ($newDirInfo{DirName} ne 'SubIFD1' or ValidateIFD(\%newDirInfo)) {
+                $exifTool->{INDENT} =~ s/..$//; # keep indent the same
+                my $cur = pop @{$$exifTool{PATH}};
+                $exifTool->ProcessDirectory(\%newDirInfo, $tagTablePtr) or $success = 0;
+                push @{$$exifTool{PATH}}, $cur;
+            } elsif ($verbose or $exifTool->{TIFF_TYPE} eq 'TIFF') {
+                $exifTool->Warn('Ignored bad IFD linked from SubIFD');
+            }
+        }
+    }
+    return $success;
+}
+
+1; # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Exif - Read EXIF/TIFF meta information
+
+=head1 SYNOPSIS
+
+This module is required by Image::ExifTool.
+
+=head1 DESCRIPTION
+
+This module contains routines required by Image::ExifTool for processing
+EXIF and TIFF meta information.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.exif.org/Exif2-2.PDF>
+
+=item L<http://www.cipa.jp/english/hyoujunka/kikaku/pdf/DC-008-2010_E.pdf>
+
+=item L<http://partners.adobe.com/asn/developer/pdfs/tn/TIFF6.pdf>
+
+=item L<http://partners.adobe.com/public/developer/en/tiff/TIFFPM6.pdf>
+
+=item L<http://www.adobe.com/products/dng/pdfs/dng_spec.pdf>
+
+=item L<http://www.awaresystems.be/imaging/tiff/tifftags.html>
+
+=item L<http://www.remotesensing.org/libtiff/TIFFTechNote2.html>
+
+=item L<http://www.exif.org/dcf.PDF>
+
+=item L<http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html>
+
+=item L<http://www.fine-view.com/jp/lab/doc/ps6ffspecsv2.pdf>
+
+=item L<http://www.ozhiker.com/electronics/pjmt/jpeg_info/meta.html>
+
+=item L<http://hul.harvard.edu/jhove/tiff-tags.html>
+
+=item L<http://www.microsoft.com/whdc/xps/wmphoto.mspx>
+
+=item L<http://www.asmail.be/msg0054681802.html>
+
+=item L<http://crousseau.free.fr/imgfmt_raw.htm>
+
+=item L<http://www.cybercom.net/~dcoffin/dcraw/>
+
+=item L<http://www.digitalpreservation.gov/formats/content/tiff_tags.shtml>
+
+=item L<http://community.roxen.com/developers/idocs/rfc/rfc3949.html>
+
+=item L<http://tools.ietf.org/html/draft-ietf-fax-tiff-fx-extension1-01>
+
+=back
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Jeremy Brown for the 35efl tags, and Matt Madrid for his help with
+the XP character code conversions.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/EXIF Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/FLAC.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/FLAC.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/FLAC.pm	(revision 24799)
@@ -0,0 +1,289 @@
+#------------------------------------------------------------------------------
+# File:         FLAC.pm
+#
+# Description:  Read Free Lossless Audio Codec information
+#
+# Revisions:    11/13/2006 - P. Harvey Created
+#
+# References:   1) http://flac.sourceforge.net/
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::FLAC;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.03';
+
+sub ProcessBitStream($$$);
+
+# FLAC metadata blocks
+%Image::ExifTool::FLAC::Main = (
+    NOTES => q{
+        Free Lossless Audio Codec (FLAC) meta information.  ExifTool also extracts
+        ID3 information from these files.
+    },
+    0 => {
+        Name => 'StreamInfo',
+        SubDirectory => { TagTable => 'Image::ExifTool::FLAC::StreamInfo' },
+    },
+    4 => {
+        Name => 'VorbisComment',
+        SubDirectory => { TagTable => 'Image::ExifTool::Vorbis::Comments' },
+    },
+    6 => {
+        Name => 'Picture',
+        SubDirectory => { TagTable => 'Image::ExifTool::FLAC::Picture' },
+    },
+);
+
+%Image::ExifTool::FLAC::StreamInfo = (
+    PROCESS_PROC => \&ProcessBitStream,
+    NOTES => 'FLAC is big-endian, so bit 0 is the high-order bit in this table.',
+    GROUPS => { 2 => 'Audio' },
+    'Bit000-015' => 'BlockSizeMin',
+    'Bit016-031' => 'BlockSizeMax',
+    'Bit032-055' => 'FrameSizeMin',
+    'Bit056-079' => 'FrameSizeMax',
+    'Bit080-099' => 'SampleRate',
+    'Bit100-102' => {
+        Name => 'Channels',
+        ValueConv => '$val + 1',
+    },
+    'Bit103-107' => {
+        Name => 'BitsPerSample',
+        ValueConv => '$val + 1',
+    },
+    'Bit108-143' => 'TotalSamples',
+);
+
+%Image::ExifTool::FLAC::Picture = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    FORMAT => 'int32u',
+    0 => {
+        Name => 'PictureType',
+        PrintConv => { # (Note: Duplicated in ID3, ASF and FLAC modules!)
+            0 => 'Other',
+            1 => '32x32 PNG Icon',
+            2 => 'Other Icon',
+            3 => 'Front Cover',
+            4 => 'Back Cover',
+            5 => 'Leaflet',
+            6 => 'Media',
+            7 => 'Lead Artist',
+            8 => 'Artist',
+            9 => 'Conductor',
+            10 => 'Band',
+            11 => 'Composer',
+            12 => 'Lyricist',
+            13 => 'Recording Studio or Location',
+            14 => 'Recording Session',
+            15 => 'Performance',
+            16 => 'Capture from Movie or Video',
+            17 => 'Bright(ly) Colored Fish',
+            18 => 'Illustration',
+            19 => 'Band Logo',
+            20 => 'Publisher Logo',
+        },
+    },
+    1 => {
+        Name => 'PictureMIMEType',
+        Format => 'var_pstr32',
+    },
+    2 => {
+        Name => 'PictureDescription',
+        Format => 'var_pstr32',
+        ValueConv => '$self->Decode($val, "UTF8")',
+    },
+    3 => 'PictureWidth',
+    4 => 'PictureHeight',
+    5 => 'PictureBitsPerPixel',
+    6 => 'PictureIndexedColors',
+    7 => 'PictureLength',
+    8 => {
+        Name => 'Picture',
+        Format => 'undef[$val{7}]',
+        Binary => 1,
+    },
+);
+
+# FLAC composite tags
+%Image::ExifTool::FLAC::Composite = (
+    Duration => {
+        Require => {
+            0 => 'FLAC:SampleRate',
+            1 => 'FLAC:TotalSamples',
+        },
+        ValueConv => '$val[0] and $val[1] ? $val[1] / $val[0] : undef',
+        PrintConv => 'ConvertDuration($val)',
+    },
+);
+
+# add our composite tags
+Image::ExifTool::AddCompositeTags('Image::ExifTool::FLAC');
+
+
+#------------------------------------------------------------------------------
+# Process information in a bit stream
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Notes: Byte order is used to determine the ordering of bits in the stream:
+# 'MM' = bit 0 is most significant, 'II' = bit 0 is least significant
+# - can handle arbitrarily wide values (ie. 8-byte or larger integers)
+sub ProcessBitStream($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt   = $$dirInfo{DataPt};
+    my $dataPos  = $$dirInfo{DataPos};
+    my $dirStart = $$dirInfo{DirStart} || 0;
+    my $dirLen   = $$dirInfo{DirLen} || (length($$dataPt) - $dirStart);
+    my $verbose  = $exifTool->Options('Verbose');
+    my $byteOrder = GetByteOrder();
+    my $tag;
+
+    if ($verbose) {
+        $exifTool->VPrint(0, "  + [BitStream directory, $dirLen bytes, '$byteOrder' order]\n");
+    }
+    foreach $tag (sort keys %$tagTablePtr) {
+        next unless $tag =~ /^Bit(\d+)-?(\d+)?/;
+        my ($b1, $b2) = ($1, $2 || $1);     # start/end bit numbers in stream
+        my ($i1, $i2) = (int($b1 / 8), int($b2 / 8)); # start/end byte numbers
+        my ($f1, $f2) = ($b1 % 8, $b2 % 8); # start/end bit numbers within each byte
+        last if $i2 >= $dirLen;
+        my $val = 0;
+        my ($i, $mask, $extra);
+        $extra = ', Mask=0x' if $verbose and ($f1 != 0 or $f2 != 7);
+        if ($byteOrder eq 'MM') {
+            # loop from high byte to low byte
+            for ($i=$i1; $i<=$i2; ++$i) {
+                $mask = 0xff;
+                if ($i == $i1 and $f1) {
+                    # mask off high bits in first word (0 is high bit)
+                    foreach ((8-$f1) .. 7) { $mask ^= (1 << $_) }
+                }
+                if ($i == $i2 and $f2 < 7) {
+                    # mask off low bits in last word (7 is low bit)
+                    foreach (0 .. (6-$f2)) { $mask ^= (1 << $_) }
+                }
+                $val = $val * 256 + ($mask & Get8u($dataPt, $i + $dirStart));
+                $extra .= sprintf('%.2x', $mask) if $extra;
+            }
+        } else {
+            # (FLAC is big-endian, but support little-endian bit streams
+            #  so this routine can be used by other modules)
+            # loop from high byte to low byte
+            for ($i=$i2; $i>=$i1; --$i) {
+                $mask = 0xff;
+                if ($i == $i1 and $f1) {
+                    # mask off low bits in first word (0 is low bit)
+                    foreach (0 .. ($f1-1)) { $mask ^= (1 << $_) }
+                }
+                if ($i == $i2 and $f2 < 7) {
+                    # mask off high bits in last word (7 is high bit)
+                    foreach (($f2+1) .. 7) { $mask ^= (1 << $_) }
+                }
+                $val = $val * 256 + ($mask & Get8u($dataPt, $i + $dirStart));
+                $extra .= sprintf('%.2x', $mask) if $extra;
+            }
+        }
+        # shift word down until low bit is in position 0
+        until ($mask & 0x01) {
+            $val /= 2;
+            $mask >>= 1;
+        }
+        $exifTool->HandleTag($tagTablePtr, $tag, $val,
+            DataPt  => $dataPt,
+            DataPos => $dataPos,
+            Start   => $dirStart + $i1,
+            Size    => $i2 - $i1 + 1,
+            Extra   => $extra,
+        );
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Extract information from an Ogg FLAC file
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 on success, 0 if this wasn't a valid Ogg FLAC file
+sub ProcessFLAC($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+
+    # must first check for leading/trailing ID3 information
+    unless ($exifTool->{DoneID3}) {
+        require Image::ExifTool::ID3;
+        Image::ExifTool::ID3::ProcessID3($exifTool, $dirInfo) and return 1;
+    }
+    my $raf = $$dirInfo{RAF};
+    my $verbose = $exifTool->Options('Verbose');
+    my $out = $exifTool->Options('TextOut');
+    my ($buff, $err);
+
+    # check FLAC signature
+    $raf->Read($buff, 4) == 4 and $buff eq 'fLaC' or return 0;
+    $exifTool->SetFileType();
+    SetByteOrder('MM');
+    my $tagTablePtr = GetTagTable('Image::ExifTool::FLAC::Main');
+    for (;;) {
+        # read next metadata block header
+        $raf->Read($buff, 4) == 4 or last;
+        my $flag = unpack('C', $buff);
+        my $size = unpack('N', $buff) & 0x00ffffff;
+        $raf->Read($buff, $size) == $size or $err = 1, last;
+        my $last = $flag & 0x80;    # last-metadata-block flag
+        my $tag  = $flag & 0x7f;    # tag bits
+        if ($verbose) {
+            print $out "FLAC metadata block, type $tag:\n";
+            $exifTool->VerboseDump(\$buff, DataPos => $raf->Tell() - $size);
+        }
+        $exifTool->HandleTag($tagTablePtr, $tag, undef,
+            DataPt  => \$buff,
+            DataPos => $raf->Tell() - $size,
+        );
+        last if $last;   # all done if  is set
+    }
+    $err and $exifTool->Warn('Format error in FLAC file');
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::FLAC - Read Free Lossless Audio Codec information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to extract meta
+information from Free Lossless Audio Codec (FLAC) audio files.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://flac.sourceforge.net/>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/FLAC Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Fixup.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Fixup.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Fixup.pm	(revision 24799)
@@ -0,0 +1,333 @@
+#------------------------------------------------------------------------------
+# File:         Fixup.pm
+#
+# Description:  Utility to handle pointer fixups
+#
+# Revisions:    01/19/2005 - P. Harvey Created
+#               04/11/2005 - P. Harvey Allow fixups to be tagged with a marker,
+#                            and add new marker-related routines
+#               06/21/2006 - P. Harvey Patch to work with negative offsets
+#               07/07/2006 - P. Harvey Added support for 16-bit pointers
+#
+# Data Members:
+#
+#   Start     - Position in data where a zero pointer points to.
+#   Shift     - Amount to shift offsets (relative to Start).
+#   Fixups    - List of Fixup object references to to shift relative to this Fixup.
+#   Pointers  - Hash of references to fixup pointer arrays, keyed by ByteOrder
+#               string (with "2" added if pointer is 16-bit [default is 32-bit],
+#               plus "_$marker" suffix if tagged with a marker name).
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Fixup;
+
+use strict;
+use Image::ExifTool qw(GetByteOrder SetByteOrder Get32u Get32s Set32u
+                       Get16u Get16s Set16u);
+use vars qw($VERSION);
+
+$VERSION = '1.04';
+
+sub AddFixup($$;$$);
+sub ApplyFixup($$);
+sub Dump($;$);
+
+#------------------------------------------------------------------------------
+# New - create new Fixup object
+# Inputs: 0) reference to Fixup object or Fixup class name
+sub new
+{
+    local $_;
+    my $that = shift;
+    my $class = ref($that) || $that || 'Image::ExifTool::Fixup';
+    my $self = bless {}, $class;
+
+    # initialize required members
+    $self->{Start} = 0;
+    $self->{Shift} = 0;
+
+    return $self;
+}
+
+#------------------------------------------------------------------------------
+# Clone this object
+# Inputs: 0) reference to Fixup object or Fixup class name
+# Returns: reference to new Fixup object
+sub Clone($)
+{
+    my $self = shift;
+    my $clone = new Image::ExifTool::Fixup;
+    $clone->{Start} = $self->{Start};
+    $clone->{Shift} = $self->{Shift};
+    my $phash = $self->{Pointers};
+    if ($phash) {
+        $clone->{Pointers} = { };
+        my $byteOrder;
+        foreach $byteOrder (keys %$phash) {
+            my @pointers = @{$phash->{$byteOrder}};
+            $clone->{Pointers}->{$byteOrder} = \@pointers;
+        }
+    }
+    if ($self->{Fixups}) {
+        $clone->{Fixups} = [ ];
+        my $subFixup;
+        foreach $subFixup (@{$self->{Fixups}}) {
+            push @{$clone->{Fixups}}, $subFixup->Clone();
+        }
+    }
+    return $clone;
+}
+
+#------------------------------------------------------------------------------
+# Add fixup pointer or another fixup object below this one
+# Inputs: 0) Fixup object reference
+#         1) Scalar for pointer offset, or reference to Fixup object
+#         2) Optional marker name for the pointer
+#         3) Optional pointer format ('int16u' or 'int32u', defaults to 'int32u')
+# Notes: Byte ordering must be set properly for the pointer being added (must keep
+# track of the byte order of each offset since MakerNotes may have different byte order!)
+sub AddFixup($$;$$)
+{
+    my ($self, $pointer, $marker, $format) = @_;
+    if (ref $pointer) {
+        $self->{Fixups} or $self->{Fixups} = [ ];
+        push @{$self->{Fixups}}, $pointer;
+    } else {
+        my $byteOrder = GetByteOrder();
+        if (defined $format) {
+            if ($format eq 'int16u') {
+                $byteOrder .= '2';
+            } elsif ($format ne 'int32u') {
+                warn "Bad Fixup pointer format $format\n";
+            }
+        }
+        $byteOrder .= "_$marker" if defined $marker;
+        my $phash = $self->{Pointers};
+        $phash or $phash = $self->{Pointers} = { };
+        $phash->{$byteOrder} or $phash->{$byteOrder} = [ ];
+        push @{$phash->{$byteOrder}}, $pointer;
+    }
+}
+
+#------------------------------------------------------------------------------
+# fix up pointer offsets
+# Inputs: 0) Fixup object reference, 1) data reference
+# Outputs: Collapses fixup hierarchy into linear lists of fixup pointers
+sub ApplyFixup($$)
+{
+    my ($self, $dataPt) = @_;
+
+    my $start = $self->{Start};
+    my $shift = $self->{Shift} + $start;   # make shift relative to start
+    my $phash = $self->{Pointers};
+
+    # fix up pointers in this fixup
+    if ($phash and ($start or $shift)) {
+        my $saveOrder = GetByteOrder(); # save original byte ordering
+        my ($byteOrder, $ptr);
+        foreach $byteOrder (keys %$phash) {
+            SetByteOrder(substr($byteOrder,0,2));
+            # apply the fixup offset shift (must get as signed integer
+            # to avoid overflow in case it was negative before)
+            my ($get, $set) = ($byteOrder =~ /^(II2|MM2)/) ?
+                              (\&Get16s, \&Set16u) : (\&Get32s, \&Set32u);
+            foreach $ptr (@{$phash->{$byteOrder}}) {
+                $ptr += $start;         # update pointer to new start location
+                next unless $shift;
+                &$set(&$get($dataPt, $ptr) + $shift, $dataPt, $ptr);
+            }
+        }
+        SetByteOrder($saveOrder);       # restore original byte ordering
+    }
+    # recurse into contained fixups
+    if ($self->{Fixups}) {
+        # create our pointer hash if it doesn't exist
+        $phash or $phash = $self->{Pointers} = { };
+        # loop through all contained fixups
+        my $subFixup;
+        foreach $subFixup (@{$self->{Fixups}}) {
+            # adjust the subfixup start and shift
+            $subFixup->{Start} += $start;
+            $subFixup->{Shift} += $shift - $start;
+            # recursively apply contained fixups
+            ApplyFixup($subFixup, $dataPt);
+            my $shash = $subFixup->{Pointers} or next;
+            # add all pointers to our collapsed lists
+            my $byteOrder;
+            foreach $byteOrder (keys %$shash) {
+                $phash->{$byteOrder} or $phash->{$byteOrder} = [ ];
+                push @{$phash->{$byteOrder}}, @{$shash->{$byteOrder}};
+                delete $shash->{$byteOrder};
+            }
+            delete $subFixup->{Pointers};
+        }
+        delete $self->{Fixups};    # remove our contained fixups
+    }
+    # reset our Start/Shift for the collapsed fixup
+    $self->{Start} = $self->{Shift} = 0;
+}
+
+#------------------------------------------------------------------------------
+# Does specified marker exist?
+# Inputs: 0) Fixup object reference, 1) marker name
+# Returns: True if fixup contains specified marker name
+sub HasMarker($$)
+{
+    my ($self, $marker) = @_;
+    my $phash = $self->{Pointers};
+    return 0 unless $phash;
+    return 1 if grep /_$marker$/, keys %$phash;
+    return 0 unless $self->{Fixups};
+    my $subFixup;
+    foreach $subFixup (@{$self->{Fixups}}) {
+        return 1 if $subFixup->HasMarker($marker);
+    }
+    return 0;
+}
+
+#------------------------------------------------------------------------------
+# Set all marker pointers to specified value
+# Inputs: 0) Fixup object reference, 1) data reference
+#         2) marker name, 3) pointer value, 4) offset to start of data
+sub SetMarkerPointers($$$$;$)
+{
+    my ($self, $dataPt, $marker, $value, $startOffset) = @_;
+    my $start = $self->{Start} + ($startOffset || 0);
+    my $phash = $self->{Pointers};
+
+    if ($phash) {
+        my $saveOrder = GetByteOrder(); # save original byte ordering
+        my ($byteOrder, $ptr);
+        foreach $byteOrder (keys %$phash) {
+            next unless $byteOrder =~ /^(II|MM)(2?)_$marker$/;
+            SetByteOrder($1);
+            my $set = $2 ? \&Set16u : \&Set32u;
+            foreach $ptr (@{$phash->{$byteOrder}}) {
+                &$set($value, $dataPt, $ptr + $start);
+            }
+        }
+        SetByteOrder($saveOrder);       # restore original byte ordering
+    }
+    if ($self->{Fixups}) {
+        my $subFixup;
+        foreach $subFixup (@{$self->{Fixups}}) {
+            $subFixup->SetMarkerPointers($dataPt, $marker, $value, $start);
+        }
+    }
+}
+
+#------------------------------------------------------------------------------
+# Get pointer values for specified marker
+# Inputs: 0) Fixup object reference, 1) data reference,
+#         2) marker name, 3) offset to start of data
+# Returns: List of marker pointers in list context, or first marker pointer otherwise
+sub GetMarkerPointers($$$;$)
+{
+    my ($self, $dataPt, $marker, $startOffset) = @_;
+    my $start = $self->{Start} + ($startOffset || 0);
+    my $phash = $self->{Pointers};
+    my @pointers;
+
+    if ($phash) {
+        my $saveOrder = GetByteOrder();
+        my ($byteOrder, $ptr);
+        foreach $byteOrder (grep /_$marker$/, keys %$phash) {
+            SetByteOrder(substr($byteOrder,0,2));
+            my $get = ($byteOrder =~ /^(II2|MM2)/) ? \&Get16u : \&Get32u;
+            foreach $ptr (@{$phash->{$byteOrder}}) {
+                push @pointers, &$get($dataPt, $ptr + $start);
+            }
+        }
+        SetByteOrder($saveOrder);       # restore original byte ordering
+    }
+    if ($self->{Fixups}) {
+        my $subFixup;
+        foreach $subFixup (@{$self->{Fixups}}) {
+            push @pointers, $subFixup->GetMarkerPointers($dataPt, $marker, $start);
+        }
+    }
+    return @pointers if wantarray;
+    return $pointers[0];
+}
+
+#------------------------------------------------------------------------------
+# Dump fixup to console for debugging
+# Inputs: 0) Fixup object reference, 1) optional initial indent string
+sub Dump($;$)
+{
+    my ($self, $indent) = @_;
+    $indent or $indent = '';
+    printf "${indent}Fixup start=0x%x shift=0x%x\n", $self->{Start}, $self->{Shift};
+    my $phash = $self->{Pointers};
+    if ($phash) {
+        my $byteOrder;
+        foreach $byteOrder (sort keys %$phash) {
+            print "$indent  $byteOrder: ", join(' ',@{$phash->{$byteOrder}}),"\n";
+        }
+    }
+    if ($self->{Fixups}) {
+        my $subFixup;
+        foreach $subFixup (@{$self->{Fixups}}) {
+            Dump($subFixup, $indent . '  ');
+        }
+    }
+}
+
+
+1; # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Fixup - Utility to handle pointer fixups
+
+=head1 SYNOPSIS
+
+    use Image::ExifTool::Fixup;
+
+    $fixup = new Image::ExifTool::Fixup;
+
+    # add a new fixup to a pointer at the specified offset in data
+    $fixup->AddFixup($offset);
+
+    # add a new Fixup object to the tree
+    $fixup->AddFixup($subFixup);
+
+    $fixup->{Start} += $shift1;   # shift pointer offsets and values
+
+    $fixup->{Shift} += $shift2;   # shift pointer values only
+
+    # recursively apply fixups to the specified data
+    $fixup->ApplyFixups(\$data);
+
+    $fixup->Dump();               # dump debugging information
+
+=head1 DESCRIPTION
+
+This module contains the code to keep track of pointers in memory and to
+shift these pointers as required.  It is used by ExifTool to maintain the
+pointers in image file directories (IFD's).
+
+=head1 NOTES
+
+Keeps track of pointers with different byte ordering, and relies on
+Image::ExifTool::GetByteOrder() to determine the current byte ordering
+when adding new pointers to a fixup.
+
+Maintains a hierarchical list of fixups so that the whole hierarchy can
+be shifted by a simple shift at the base.  Hierarchy is collapsed to a
+linear list when ApplyFixups() is called.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Flash.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Flash.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Flash.pm	(revision 24799)
@@ -0,0 +1,755 @@
+#------------------------------------------------------------------------------
+# File:         Flash.pm
+#
+# Description:  Read Shockwave Flash meta information
+#
+# Revisions:    05/16/2006 - P. Harvey Created
+#               06/07/2007 - PH Added support for FLV (Flash Video) files
+#               10/23/2008 - PH Added support for XMP in FLV and SWF
+#
+# References:   1) http://www.the-labs.com/MacromediaFlash/SWF-Spec/SWFfileformat.html
+#               2) http://sswf.sourceforge.net/SWFalexref.html
+#               3) http://osflash.org/flv/
+#               4) http://www.irisa.fr/texmex/people/dufouil/ffmpegdoxy/flv_8h.html
+#               5) http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart3.pdf (Oct 2008)
+#               6) http://www.adobe.com/devnet/swf/pdf/swf_file_format_spec_v9.pdf
+#               7) http://help.adobe.com/en_US/FlashMediaServer/3.5_Deving/WS5b3ccc516d4fbf351e63e3d11a0773d56e-7ff6.html
+#               8) http://www.adobe.com/devnet/flv/pdf/video_file_format_spec_v10.pdf
+#
+# Notes:        I'll add AMF3 support if someone sends me a FLV with AMF3 data
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Flash;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::FLAC;
+
+$VERSION = '1.09';
+
+sub ProcessMeta($$$;$);
+
+# Meta packets that we process
+my %processMetaPacket = ( onMetaData => 1, onXMPData => 1 );
+
+# information extracted from SWF header
+%Image::ExifTool::Flash::Main = (
+    GROUPS => { 2 => 'Video' },
+    VARS => { ALPHA_FIRST => 1 },
+    NOTES => q{
+        The information below is extracted from SWF (Shockwave Flash) files.  Tags
+        with string ID's represent information extracted from the file header.
+    },
+    FlashVersion => { },
+    Compressed   => { PrintConv => { 0 => 'False', 1 => 'True' } },
+    ImageWidth   => { },
+    ImageHeight  => { },
+    FrameRate    => { },
+    FrameCount   => { },
+    Duration => {
+        Notes => 'calculated from FrameRate and FrameCount',
+        PrintConv => 'ConvertDuration($val)',
+    },
+    69 => {
+        Name => 'FileAttributes',
+        PrintConv => { BITMASK => {
+            0 => 'UseNetwork',
+            3 => 'ActionScript3',
+            4 => 'HasMetadata',
+        } },
+    },
+    77 => {
+        Name => 'XMP',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' },
+    },
+);
+
+# packets in Flash Video files
+%Image::ExifTool::Flash::FLV = (
+    NOTES => q{
+        Information is extracted from the following packets in FLV (Flash Video)
+        files.
+    },
+    0x08 => {
+        Name => 'Audio',
+        BitMask => 0x04,
+        SubDirectory => { TagTable => 'Image::ExifTool::Flash::Audio' },
+    },
+    0x09 => {
+        Name => 'Video',
+        BitMask => 0x01,
+        SubDirectory => { TagTable => 'Image::ExifTool::Flash::Video' },
+    },
+    0x12 => {
+        Name => 'Meta',
+        SubDirectory => { TagTable => 'Image::ExifTool::Flash::Meta' },
+    },
+);
+
+# tags in Flash Video packet header
+%Image::ExifTool::Flash::Audio = (
+    PROCESS_PROC => \&Image::ExifTool::FLAC::ProcessBitStream,
+    GROUPS => { 2 => 'Audio' },
+    NOTES => 'Information extracted from the Flash Audio header.',
+    'Bit0-3' => {
+        Name => 'AudioEncoding',
+        PrintConv => {
+            0 => 'PCM-BE (uncompressed)', # PCM-BE according to ref 4
+            1 => 'ADPCM',
+            2 => 'MP3',
+            3 => 'PCM-LE (uncompressed)', #4
+            4 => 'Nellymoser 16kHz Mono', #8
+            5 => 'Nellymoser 8kHz Mono',
+            6 => 'Nellymoser',
+            7 => 'G.711 A-law logarithmic PCM', #8
+            8 => 'G.711 mu-law logarithmic PCM', #8
+            # (9 is reserved, ref 8)
+            10 => 'AAC', #8
+            11 => 'Speex', #8
+            13 => 'MP3 8-Khz', #8
+            15 => 'Device-specific sound', #8
+        },
+    },
+    'Bit4-5' => {
+        Name => 'AudioSampleRate',
+        ValueConv => {
+            0 => 5512,
+            1 => 11025,
+            2 => 22050,
+            3 => 44100,
+        },
+    },
+    'Bit6' => {
+        Name => 'AudioBitsPerSample',
+        ValueConv => '8 * ($val + 1)',
+    },
+    'Bit7' => {
+        Name => 'AudioChannels',
+        ValueConv => '$val + 1',
+        PrintConv => {
+            1 => '1 (mono)',
+            2 => '2 (stereo)',
+        },
+    },
+);
+
+# tags in Flash Video packet header
+%Image::ExifTool::Flash::Video = (
+    PROCESS_PROC => \&Image::ExifTool::FLAC::ProcessBitStream,
+    GROUPS => { 2 => 'Video' },
+    NOTES => 'Information extracted from the Flash Video header.',
+    'Bit4-7' => {
+        Name => 'VideoEncoding',
+        PrintConv => {
+            1 => 'JPEG', #8
+            2 => 'Sorensen H.263',
+            3 => 'Screen Video',
+            4 => 'On2 VP6',
+            5 => 'On2 VP6 Alpha', #3
+            6 => 'Screen Video 2', #3
+            7 => 'H.264', #7 (called "AVC" by ref 8)
+        },
+    },
+);
+
+# tags in Flash META packet (in ActionScript Message Format)
+%Image::ExifTool::Flash::Meta = (
+    PROCESS_PROC => \&ProcessMeta,
+    GROUPS => { 2 => 'Video' },
+    NOTES => q{
+        Below are a few observed FLV Meta tags, but ExifTool will attempt to extract
+        information from any tag found.
+    },
+    'audiocodecid'  => { Name => 'AudioCodecID',    Groups => { 2 => 'Audio' } },
+    'audiodatarate' => {
+        Name => 'AudioBitrate',
+        Groups => { 2 => 'Audio' },
+        ValueConv => '$val * 1000',
+        PrintConv => 'ConvertBitrate($val)',
+    },
+    'audiodelay'    => { Name => 'AudioDelay',      Groups => { 2 => 'Audio' } },
+    'audiosamplerate'=>{ Name => 'AudioSampleRate', Groups => { 2 => 'Audio' } },
+    'audiosamplesize'=>{ Name => 'AudioSampleSize', Groups => { 2 => 'Audio' } },
+    'audiosize'     => { Name => 'AudioSize',       Groups => { 2 => 'Audio' } },
+    'bytelength'    => 'ByteLength', # (youtube)
+    'canseekontime' => 'CanSeekOnTime', # (youtube)
+    'canSeekToEnd'  => 'CanSeekToEnd',
+    'creationdate'  => {
+        # (not an AMF date type in my sample)
+        Name => 'CreateDate',
+        Groups => { 2 => 'Time' },
+        ValueConv => '$val=~s/\s+$//; $val',    # trim trailing whitespace
+    },
+    'createdby'     => 'CreatedBy', #7
+    'cuePoints'     => {
+        Name => 'CuePoint',
+        SubDirectory => { TagTable => 'Image::ExifTool::Flash::CuePoint' },
+    },
+    'datasize'      => 'DataSize',
+    'duration' => {
+        Name => 'Duration',
+        PrintConv => 'ConvertDuration($val)',
+    },
+    'filesize'      => 'FileSizeBytes',
+    'framerate'     => {
+        Name => 'FrameRate',
+        PrintConv => 'int($val * 1000 + 0.5) / 1000',
+    },
+    'hasAudio'      => { Name => 'HasAudio',        Groups => { 2 => 'Audio' } },
+    'hasCuePoints'  => 'HasCuePoints',
+    'hasKeyframes'  => 'HasKeyFrames',
+    'hasMetadata'   => 'HasMetadata',
+    'hasVideo'      => 'HasVideo',
+    'height'        => 'ImageHeight',
+    'httphostheader'=> 'HTTPHostHeader', # (youtube)
+    'keyframesTimes'=> 'KeyFramesTimes',
+    'keyframesFilepositions' => 'KeyFramePositions',
+    'lasttimestamp' => 'LastTimeStamp',
+    'lastkeyframetimestamp' => 'LastKeyFrameTime',
+    'metadatacreator'=>'MetadataCreator',
+    'metadatadate'  => {
+        Name => 'MetadataDate',
+        Groups => { 2 => 'Time' },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    'purl'          => 'URL', # (youtube) (what does P mean?)
+    'pmsg'          => 'Message', # (youtube) (what does P mean?)
+    'sourcedata'    => 'SourceData', # (youtube)
+    'starttime'     => { # (youtube)
+        Name => 'StartTime',
+        PrintConv => 'ConvertDuration($val)',
+    },
+    'stereo'        => { Name => 'Stereo',          Groups => { 2 => 'Audio' } },
+    'totalduration' => { # (youtube)
+        Name => 'TotalDuration',
+        PrintConv => 'ConvertDuration($val)',
+    },
+    'totaldatarate' => { # (youtube)
+        Name => 'TotalDataRate',
+        ValueConv => '$val * 1000',
+        PrintConv => 'int($val + 0.5)',
+    },
+    'totalduration' => 'TotalDuration',
+    'videocodecid'  => 'VideoCodecID',
+    'videodatarate' => {
+        Name => 'VideoBitrate',
+        ValueConv => '$val * 1000',
+        PrintConv => 'ConvertBitrate($val)',
+    },
+    'videosize'     => 'VideoSize',
+    'width'         => 'ImageWidth',
+    # tags in 'onXMPData' packets
+    'liveXML'       => { #5
+        Name => 'XMP',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' },
+    },
+);
+
+# tags in Flash META CuePoint structure
+%Image::ExifTool::Flash::CuePoint = (
+    PROCESS_PROC => \&ProcessMeta,
+    GROUPS => { 2 => 'Video' },
+    NOTES => q{
+        These tag names are added to the CuePoint name to generate complete tag
+        names like "CuePoint0Name".
+    },
+    'name' => 'Name',
+    'type' => 'Type',
+    'time' => 'Time',
+    'parameters' => {
+        Name => 'Parameter',
+        SubDirectory => { TagTable => 'Image::ExifTool::Flash::Parameter' },
+    },
+);
+
+# tags in Flash META CuePoint Parameter structure
+%Image::ExifTool::Flash::Parameter = (
+    PROCESS_PROC => \&ProcessMeta,
+    GROUPS => { 2 => 'Video' },
+    NOTES => q{
+        There are no pre-defined parameter tags, but ExifTool will extract any
+        existing parameters, with tag names like "CuePoint0ParameterXxx".
+    },
+);
+
+# name lookup for known AMF data types
+my @amfType = qw(double boolean string object movieClip null undefined reference
+                 mixedArray objectEnd array date longString unsupported recordSet
+                 XML typedObject AMF3data);
+
+# test for AMF structure types (object, mixed array or typed object)
+my %isStruct = ( 0x03 => 1, 0x08 => 1, 0x10 => 1 );
+
+#------------------------------------------------------------------------------
+# Process Flash Video AMF Meta packet (ref 3)
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+#         3) Set to extract single type/value only
+# Returns: 1 on success, (or type/value if extracting single value)
+# Notes: Updates DataPos in dirInfo if extracting single value
+sub ProcessMeta($$$;$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr, $single) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dataPos = $$dirInfo{DataPos};
+    my $dirLen = $$dirInfo{DirLen} || length($$dataPt);
+    my $pos = $$dirInfo{Pos} || 0;
+    my ($type, $val, $rec);
+
+    $exifTool->VerboseDir('Meta') unless $single;
+
+Record: for ($rec=0; ; ++$rec) {
+        last if $pos >= $dirLen;
+        $type = ord(substr($$dataPt, $pos));
+        ++$pos;
+        if ($type == 0x00 or $type == 0x0b) {   # double or date
+            last if $pos + 8 > $dirLen;
+            $val = GetDouble($dataPt, $pos);
+            $pos += 8;
+            if ($type == 0x0b) {    # date
+                $val /= 1000;       # convert to seconds
+                my $frac = $val - int($val);    # fractional seconds
+                # get time zone
+                last if $pos + 2 > $dirLen;
+                my $tz = Get16s($dataPt, $pos);
+                $pos += 2;
+                # construct date/time string
+                $val = Image::ExifTool::ConvertUnixTime(int($val));
+                if ($frac) {
+                    $frac = sprintf('%.6f', $frac);
+                    $frac =~ s/(^0|0+$)//g;
+                    $val .= $frac;
+                }
+                # add timezone
+                if ($tz < 0) {
+                    $val .= '-';
+                    $tz *= -1;
+                } else {
+                    $val .= '+';
+                }
+                $val .= sprintf('%.2d:%.2d', int($tz/60), $tz%60);
+            }
+        } elsif ($type == 0x01) {   # boolean
+            last if $pos + 1 > $dirLen;
+            $val = Get8u($dataPt, $pos);
+            $val = { 0 => 'No', 1 => 'Yes' }->{$val} if $val < 2;
+            ++$pos;
+        } elsif ($type == 0x02) {   # string
+            last if $pos + 2 > $dirLen;
+            my $len = Get16u($dataPt, $pos);
+            last if $pos + 2 + $len > $dirLen;
+            $val = substr($$dataPt, $pos + 2, $len);
+            $pos += 2 + $len;
+        } elsif ($isStruct{$type}) {   # object, mixed array or typed object
+            $exifTool->VPrint(1, "  + [$amfType[$type]]\n");
+            my $getName;
+            $val = '';  # dummy value
+            if ($type == 0x08) {        # mixed array
+                # skip last array index for mixed array
+                last if $pos + 4 > $dirLen;
+                $pos += 4;
+            } elsif ($type == 0x10) {   # typed object
+                $getName = 1;
+            }
+            for (;;) {
+                # get tag ID (or typed object name)
+                last Record if $pos + 2 > $dirLen;
+                my $len = Get16u($dataPt, $pos);
+                if ($pos + 2 + $len > $dirLen) {
+                    $exifTool->Warn("Truncated $amfType[$type] record");
+                    last Record;
+                }
+                my $tag = substr($$dataPt, $pos + 2, $len);
+                $pos += 2 + $len;
+                # first string of a typed object is the object name
+                if ($getName) {
+                    $exifTool->VPrint(1,"  | (object name '$tag')\n");
+                    undef $getName;
+                    next; # (ignore name for now)
+                }
+                my $subTablePtr = $tagTablePtr;
+                my $tagInfo = $$subTablePtr{$tag};
+                # switch to subdirectory table if necessary
+                if ($tagInfo and $$tagInfo{SubDirectory}) {
+                    my $subTable = $tagInfo->{SubDirectory}->{TagTable};
+                    # descend into Flash SubDirectory
+                    if ($subTable =~ /^Image::ExifTool::Flash::/) {
+                        $tag = $$tagInfo{Name}; # use our name for the tag
+                        $subTablePtr = GetTagTable($subTable);
+                    }
+                }
+                # get object value
+                my $valPos = $pos + 1;
+                $$dirInfo{Pos} = $pos;
+                my $structName = $$dirInfo{StructName};
+                # add structure name to start of tag name
+                $tag = $structName . ucfirst($tag) if defined $structName;
+                $$dirInfo{StructName} = $tag;       # set new structure name
+                my ($t, $v) = ProcessMeta($exifTool, $dirInfo, $subTablePtr, 1);
+                $$dirInfo{StructName} = $structName;# restore original structure name
+                $pos = $$dirInfo{Pos};  # update to new position in packet
+                # all done if this value contained tags
+                last Record unless defined $t and defined $v;
+                next if $isStruct{$t};  # already handled tags in sub-structures
+                next if ref($v) eq 'ARRAY' and not @$v; # ignore empty arrays
+                last if $t == 0x09; # (end of object)
+                if (not $$subTablePtr{$tag} and $tag =~ /^\w+$/) {
+                    Image::ExifTool::AddTagToTable($subTablePtr, $tag, { Name => ucfirst($tag) });
+                    $exifTool->VPrint(1, "  | (adding $tag)\n");
+                }
+                $exifTool->HandleTag($subTablePtr, $tag, $v,
+                    DataPt  => $dataPt,
+                    DataPos => $dataPos,
+                    Start   => $valPos,
+                    Size    => $pos - $valPos,
+                    Format  => $amfType[$t] || sprintf('0x%x',$t),
+                );
+            }
+      # } elsif ($type == 0x04) {   # movie clip (not supported)
+        } elsif ($type == 0x05 or $type == 0x06 or $type == 0x09 or $type == 0x0d) {
+            # null, undefined, dirLen of object, or unsupported
+            $val = '';
+        } elsif ($type == 0x07) {   # reference
+            last if $pos + 2 > $dirLen;
+            $val = Get16u($dataPt, $pos);
+            $pos += 2;
+        } elsif ($type == 0x0a) {   # array
+            last if $pos + 4 > $dirLen;
+            my $num = Get32u($dataPt, $pos);
+            $$dirInfo{Pos} = $pos + 4;
+            my ($i, @vals);
+            # add array index to compount tag name
+            my $structName = $$dirInfo{StructName};
+            for ($i=0; $i<$num; ++$i) {
+                $$dirInfo{StructName} = $structName . $i if defined $structName;
+                my ($t, $v) = ProcessMeta($exifTool, $dirInfo, $tagTablePtr, 1);
+                last Record unless defined $v;
+                # save value unless contained in a sub-structure
+                push @vals, $v unless $isStruct{$t};
+            }
+            $$dirInfo{StructName} = $structName;
+            $pos = $$dirInfo{Pos};
+            $val = \@vals;
+        } elsif ($type == 0x0c or $type == 0x0f) {  # long string or XML
+            last if $pos + 4 > $dirLen;
+            my $len = Get32u($dataPt, $pos);
+            last if $pos + 4 + $len > $dirLen;
+            $val = substr($$dataPt, $pos + 4, $len);
+            $pos += 4 + $len;
+      # } elsif ($type == 0x0e) {   # record set (not supported)
+      # } elsif ($type == 0x11) {   # AMF3 data (can't add support for this without a test sample)
+        } else {
+            my $t = $amfType[$type] || sprintf('type 0x%x',$type);
+            $exifTool->Warn("AMF $t record not yet supported");
+            undef $type;    # (so we don't print another warning)
+            last;           # can't continue
+        }
+        last if $single;        # all done if extracting single value
+        unless ($isStruct{$type}) {
+            # only process certain Meta packets
+            if ($type == 0x02 and not $rec) {
+                my $verb = $processMetaPacket{$val} ? 'processing' : 'ignoring';
+                $exifTool->VPrint(0, "  | ($verb $val information)\n");
+                last unless $processMetaPacket{$val};
+            } else {
+                # give verbose indication if we ignore a lone value
+                my $t = $amfType[$type] || sprintf('type 0x%x',$type);
+                $exifTool->VPrint(1, "  | (ignored lone $t value '$val')\n");
+            }
+        }
+    }
+    if (not defined $val and defined $type) {
+        $exifTool->Warn(sprintf("Truncated AMF record 0x%x",$type));
+    }
+    return 1 unless $single;    # all done
+    $$dirInfo{Pos} = $pos;      # update position
+    return($type,$val);         # return single type/value pair
+}
+
+#------------------------------------------------------------------------------
+# Read information frame a Flash Video file
+# Inputs: 0) ExifTool object reference, 1) Directory information reference
+# Returns: 1 on success, 0 if this wasn't a valid Flash Video file
+sub ProcessFLV($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $verbose = $exifTool->Options('Verbose');
+    my $raf = $$dirInfo{RAF};
+    my $buff;
+
+    $raf->Read($buff, 9) == 9 or return 0;
+    $buff =~ /^FLV\x01/ or return 0;
+    SetByteOrder('MM');
+    $exifTool->SetFileType();
+    my ($flags, $offset) = unpack('x4CN', $buff);
+    $raf->Seek($offset-9, 1) or return 1 if $offset > 9;
+    $flags &= 0x05; # only look for audio/video
+    my $found = 0;
+    my $tagTablePtr = GetTagTable('Image::ExifTool::Flash::FLV');
+    for (;;) {
+        $raf->Read($buff, 15) == 15 or last;
+        my $len = unpack('x4N', $buff);
+        my $type = $len >> 24;
+        $len &= 0x00ffffff;
+        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $type);
+        if ($verbose > 1) {
+            my $name = $tagInfo ? $$tagInfo{Name} : "type $type";
+            $exifTool->VPrint(1, "FLV $name packet, len $len\n");
+        }
+        undef $buff;
+        if ($tagInfo and $$tagInfo{SubDirectory}) {
+            my $mask = $$tagInfo{BitMask};
+            if ($mask) {
+                # handle audio or video packet
+                unless ($found & $mask) {
+                    $found |= $mask;
+                    $flags &= ~$mask;
+                    if ($len>=1 and $raf->Read($buff, 1) == 1) {
+                        $len -= 1;
+                    } else {
+                        $exifTool->Warn("Bad $$tagInfo{Name} packet");
+                        last;
+                    }
+                }
+            } elsif ($raf->Read($buff, $len) == $len) {
+                $len = 0;
+            } else {
+                $exifTool->Warn('Truncated Meta packet');
+                last;
+            }
+        }
+        if (defined $buff) {
+            $exifTool->HandleTag($tagTablePtr, $type, undef,
+                DataPt  => \$buff,
+                DataPos => $raf->Tell() - length($buff),
+            );
+        }
+        last unless $flags;
+        $raf->Seek($len, 1) or last if $len;
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Found a Flash tag
+# Inputs: 0) ExifTool object ref, 1) tag name, 2) tag value
+sub FoundFlashTag($$$)
+{
+    my ($exifTool, $tag, $val) = @_;
+    $exifTool->HandleTag(\%Image::ExifTool::Flash::Main, $tag, $val);
+}
+
+#------------------------------------------------------------------------------
+# Read data from possibly compressed file
+# Inputs: 0) RAF reference, 1) data buffer, 2) bytes to read, 2) compressed flag
+# Returns: number of bytes read (may be greater than requested bytes if compressed)
+# - concatenates data to current buffer
+# - updates compressed flag with reference to inflate object for future calls
+#   (or sets to error message and returns zero on error)
+sub ReadCompressed($$$$)
+{
+    my ($raf, $len, $inflate) = ($_[0], $_[2], $_[3]);
+    my $buff;
+    unless ($raf->Read($buff, $len)) {
+        $_[3] = 'Error reading file';
+        return 0;
+    }
+    # uncompress if necessary
+    if ($inflate) {
+        unless (ref $inflate) {
+            unless (eval 'require Compress::Zlib') {
+                $_[3] = 'Install Compress::Zlib to extract compressed information';
+                return 0;
+            }
+            $inflate = Compress::Zlib::inflateInit();
+            unless ($inflate) {
+                $_[3] = 'Error initializing inflate for Flash data';
+                return 0;
+            }
+            $_[3] = $inflate;   # pass inflate object back to caller
+        }
+        my $tmp = $buff;
+        $buff = '';
+        # read 64 more bytes at a time and inflate until we get enough uncompressed data
+        for (;;) {
+            my ($dat, $stat) = $inflate->inflate($tmp);
+            if ($stat == Compress::Zlib::Z_STREAM_END() or
+                $stat == Compress::Zlib::Z_OK())
+            {
+                $buff .= $dat;  # add inflated data to buffer
+                last if length $buff >= $len or $stat == Compress::Zlib::Z_STREAM_END();
+                $raf->Read($tmp,64) or last;    # must read a bit more data
+            } else {
+                $buff = '';
+                last;
+            }
+        }
+        $_[3] = 'Error inflating compressed Flash data' unless length $buff;
+    }
+    $_[1] = defined $_[1] ? $_[1] . $buff : $buff;
+    return length $buff;
+}
+
+#------------------------------------------------------------------------------
+# Read information frame a Flash file
+# Inputs: 0) ExifTool object reference, 1) Directory information reference
+# Returns: 1 on success, 0 if this wasn't a valid Flash file
+sub ProcessSWF($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my ($buff, $hasMeta);
+
+    $raf->Read($buff, 8) == 8 or return 0;
+    $buff =~ /^(F|C)WS([^\0])/ or return 0;
+    my ($compressed, $vers) = ($1 eq 'C' ? 1 : 0, ord($2));
+
+    SetByteOrder('II');
+    $exifTool->SetFileType();
+    GetTagTable('Image::ExifTool::Flash::Main');  # make sure table is initialized
+
+    FoundFlashTag($exifTool, FlashVersion => $vers);
+    FoundFlashTag($exifTool, Compressed => $compressed);
+
+    # read the next 64 bytes of the file (and inflate if necessary)
+    $buff = '';
+    unless (ReadCompressed($raf, $buff, 64, $compressed)) {
+        $exifTool->Warn($compressed) if $compressed;
+        return 1;
+    }
+
+    # unpack elements of bit-packed Flash Rect structure
+    my $nBits = unpack('C', $buff) >> 3;    # bits in x1,x2,y1,y2 elements
+    my $totBits = 5 + $nBits * 4;           # total bits in Rect structure
+    my $nBytes = int(($totBits + 7) / 8);   # byte length of Rect structure
+    if (length $buff < $nBytes + 4) {
+        $exifTool->Warn('Truncated Flash file');
+        return 1;
+    }
+    my $bits = unpack("B$totBits", $buff);
+    # isolate Rect elements and convert from ASCII bit strings to integers
+    my @vals = unpack('x5' . "a$nBits" x 4, $bits);
+    # (do conversion the hard way because oct("0b$val") requires Perl 5.6)
+    map { $_ = unpack('N', pack('B32', '0' x (32 - length $_) . $_)) } @vals;
+
+    # calculate and store ImageWidth/Height
+    FoundFlashTag($exifTool, ImageWidth  => ($vals[1] - $vals[0]) / 20);
+    FoundFlashTag($exifTool, ImageHeight => ($vals[3] - $vals[2]) / 20);
+
+    # get frame rate and count
+    @vals = unpack("x${nBytes}v2", $buff);
+    FoundFlashTag($exifTool, FrameRate => $vals[0] / 256);
+    FoundFlashTag($exifTool, FrameCount => $vals[1]);
+    FoundFlashTag($exifTool, Duration => $vals[1] * 256 / $vals[0]) if $vals[0];
+
+    # scan through the tags to find FileAttributes and XMP
+    $buff = substr($buff, $nBytes + 4);
+    for (;;) {
+        my $buffLen = length $buff;
+        last if $buffLen < 2;
+        my $code = Get16u(\$buff, 0);
+        my $pos = 2;
+        my $tag = $code >> 6;
+        my $size = $code & 0x3f;
+        $exifTool->VPrint(1, "SWF tag $tag ($size bytes):\n");
+        last unless $tag == 69 or $tag == 77 or $hasMeta;
+        # read enough to get a complete short record
+        if ($pos + $size > $buffLen) {
+            # (read 2 extra bytes if available to get next tag word)
+            unless (ReadCompressed($raf, $buff, $size + 2, $compressed)) {
+                $exifTool->Warn($compressed) if $compressed;
+                return 1;
+            }
+            $buffLen = length $buff;
+            last if $pos + $size > $buffLen;
+        }
+        # read extended record if necessary
+        if ($size == 0x3f) {
+            last if $pos + 4 > $buffLen;
+            $size = Get32u(\$buff, $pos);
+            $pos += 4;
+            last if $size > 1000000; # don't read anything huge
+            if ($pos + $size > $buffLen) {
+                unless (ReadCompressed($raf, $buff, $size + 2, $compressed)) {
+                    $exifTool->Warn($compressed) if $compressed;
+                    return 1;
+                }
+                $buffLen = length $buff;
+                last if $pos + $size > $buffLen;
+            }
+            $exifTool->VPrint(1, "  [extended size $size bytes]\n");
+        }
+        if ($tag == 69) {       # FileAttributes
+            last unless $size;
+            my $flags = Get8u(\$buff, $pos);
+            FoundFlashTag($exifTool, $tag => $flags);
+            last unless $flags & 0x10;  # only continue if we have metadata (XMP)
+            $hasMeta = 1;
+        } elsif ($tag == 77) {  # Metadata
+            my $val = substr($buff, $pos, $size);
+            FoundFlashTag($exifTool, $tag => $val);
+            last;
+        }
+        last if $pos + 2 > $buffLen;
+        $buff = substr($buff, $pos);    # remove everything before the next tag
+    }
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Flash - Read Shockwave Flash meta information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to read SWF
+(Shockwave Flash) and FLV (Flash Video) files.
+
+=head1 NOTES
+
+Flash Video AMF3 support has not yet been added because I haven't yet found
+a FLV file containing AMF3 information.  If someone sends me a sample then I
+will add AMF3 support.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.the-labs.com/MacromediaFlash/SWF-Spec/SWFfileformat.html>
+
+=item L<http://sswf.sourceforge.net/SWFalexref.html>
+
+=item L<http://osflash.org/flv/>
+
+=item L<http://www.irisa.fr/texmex/people/dufouil/ffmpegdoxy/flv_8h.html>
+
+=item L<http://help.adobe.com/en_US/FlashMediaServer/3.5_Deving/WS5b3ccc516d4fbf351e63e3d11a0773d56e-7ff6.html>
+
+=item L<http://www.adobe.com/devnet/swf/pdf/swf_file_format_spec_v9.pdf>
+
+=item L<http://www.adobe.com/devnet/flv/pdf/video_file_format_spec_v10.pdf>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/Flash Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/FlashPix.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/FlashPix.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/FlashPix.pm	(revision 24799)
@@ -0,0 +1,1882 @@
+#------------------------------------------------------------------------------
+# File:         FlashPix.pm
+#
+# Description:  Read FlashPix meta information
+#
+# Revisions:    05/29/2006 - P. Harvey Created
+#
+# References:   1) http://www.exif.org/Exif2-2.PDF
+#               2) http://www.graphcomp.com/info/specs/livepicture/fpx.pdf
+#               3) http://search.cpan.org/~jdb/libwin32/
+#               4) http://msdn.microsoft.com/en-us/library/aa380374.aspx
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::FlashPix;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::Exif;
+use Image::ExifTool::ASF;   # for GetGUID()
+
+$VERSION = '1.19';
+
+sub ProcessFPX($$);
+sub ProcessFPXR($$$);
+sub ProcessProperties($$$);
+sub ReadFPXValue($$$$$;$$);
+sub ProcessHyperlinks($$);
+sub ProcessContents($$$);
+sub SetDocNum($$;$$$);
+
+# sector type constants
+sub HDR_SIZE           () { 512; }
+sub DIF_SECT           () { 0xfffffffc; }
+sub FAT_SECT           () { 0xfffffffd; }
+sub END_OF_CHAIN       () { 0xfffffffe; }
+sub FREE_SECT          () { 0xffffffff; }
+
+# format flags
+sub VT_VECTOR          () { 0x1000; }
+sub VT_ARRAY           () { 0x2000; }
+sub VT_BYREF           () { 0x4000; }
+sub VT_RESERVED        () { 0x8000; }
+
+# other constants
+sub VT_VARIANT         () { 12; }
+sub VT_LPSTR           () { 30; }
+
+# list of OLE format codes (unsupported codes commented out)
+my %oleFormat = (
+    0  => undef,        # VT_EMPTY
+    1  => undef,        # VT_NULL
+    2  => 'int16s',     # VT_I2
+    3  => 'int32s',     # VT_I4
+    4  => 'float',      # VT_R4
+    5  => 'double',     # VT_R8
+    6  => undef,        # VT_CY
+    7  => 'VT_DATE',    # VT_DATE (double, number of days since Dec 30, 1899)
+    8  => 'VT_BSTR',    # VT_BSTR (int32u count, followed by binary string)
+#   9  => 'VT_DISPATCH',
+    10 => 'int32s',     # VT_ERROR
+    11 => 'int16s',     # VT_BOOL
+    12 => 'VT_VARIANT', # VT_VARIANT
+#   13 => 'VT_UNKNOWN',
+#   14 => 'VT_DECIMAL',
+    16 => 'int8s',      # VT_I1
+    17 => 'int8u',      # VT_UI1
+    18 => 'int16u',     # VT_UI2
+    19 => 'int32u',     # VT_UI4
+    20 => 'int64s',     # VT_I8
+    21 => 'int64u',     # VT_UI8
+#   22 => 'VT_INT',
+#   23 => 'VT_UINT',
+#   24 => 'VT_VOID',
+#   25 => 'VT_HRESULT',
+#   26 => 'VT_PTR',
+#   27 => 'VT_SAFEARRAY',
+#   28 => 'VT_CARRAY',
+#   29 => 'VT_USERDEFINED',
+    30 => 'VT_LPSTR',   # VT_LPSTR (int32u count, followed by string)
+    31 => 'VT_LPWSTR',  # VT_LPWSTR (int32u word count, followed by Unicode string)
+    64 => 'VT_FILETIME',# VT_FILETIME (int64u, number of nanoseconds since Jan 1, 1601)
+    65 => 'VT_BLOB',    # VT_BLOB
+#   66 => 'VT_STREAM',
+#   67 => 'VT_STORAGE',
+#   68 => 'VT_STREAMED_OBJECT',
+#   69 => 'VT_STORED_OBJECT',
+#   70 => 'VT_BLOB_OBJECT',
+    71 => 'VT_CF',      # VT_CF
+    72 => 'VT_CLSID',   # VT_CLSID
+);
+
+# OLE flag codes (high nibble of property type)
+my %oleFlags = (
+    0x1000 => 'VT_VECTOR',
+    0x2000 => 'VT_ARRAY',   # not yet supported
+    0x4000 => 'VT_BYREF',   # ditto
+    0x8000 => 'VT_RESERVED',
+);
+
+# byte sizes for supported VT_* format and flag types
+my %oleFormatSize = (
+    VT_DATE     => 8,
+    VT_BSTR     => 4,   # (+ string length)
+    VT_VARIANT  => 4,   # (+ data length)
+    VT_LPSTR    => 4,   # (+ string length)
+    VT_LPWSTR   => 4,   # (+ string character length)
+    VT_FILETIME => 8,
+    VT_BLOB     => 4,   # (+ data length)
+    VT_CF       => 4,   # (+ data length)
+    VT_CLSID    => 16,
+    VT_VECTOR   => 4,   # (+ vector elements)
+);
+
+# names for each type of directory entry
+my @dirEntryType = qw(INVALID STORAGE STREAM LOCKBYTES PROPERTY ROOT);
+
+# list of code pages used by Microsoft
+# (ref http://msdn.microsoft.com/en-us/library/dd317756(VS.85).aspx)
+my %codePage = (
+    037 => 'IBM EBCDIC US-Canada',
+    437 => 'DOS United States',
+    500 => 'IBM EBCDIC International',
+    708 => 'Arabic (ASMO 708)',
+    709 => 'Arabic (ASMO-449+, BCON V4)',
+    710 => 'Arabic - Transparent Arabic',
+    720 => 'DOS Arabic (Transparent ASMO)',
+    737 => 'DOS Greek (formerly 437G)',
+    775 => 'DOS Baltic',
+    850 => 'DOS Latin 1 (Western European)',
+    852 => 'DOS Latin 2 (Central European)',
+    855 => 'DOS Cyrillic (primarily Russian)',
+    857 => 'DOS Turkish',
+    858 => 'DOS Multilingual Latin 1 with Euro',
+    860 => 'DOS Portuguese',
+    861 => 'DOS Icelandic',
+    862 => 'DOS Hebrew',
+    863 => 'DOS French Canadian',
+    864 => 'DOS Arabic',
+    865 => 'DOS Nordic',
+    866 => 'DOS Russian (Cyrillic)',
+    869 => 'DOS Modern Greek',
+    870 => 'IBM EBCDIC Multilingual/ROECE (Latin 2)',
+    874 => 'Windows Thai (same as 28605, ISO 8859-15)',
+    875 => 'IBM EBCDIC Greek Modern',
+    932 => 'Windows Japanese (Shift-JIS)',
+    936 => 'Windows Simplified Chinese (PRC, Singapore)',
+    949 => 'Windows Korean (Unified Hangul Code)',
+    950 => 'Windows Traditional Chinese (Taiwan)',
+    1026 => 'IBM EBCDIC Turkish (Latin 5)',
+    1047 => 'IBM EBCDIC Latin 1/Open System',
+    1140 => 'IBM EBCDIC US-Canada with Euro',
+    1141 => 'IBM EBCDIC Germany with Euro',
+    1142 => 'IBM EBCDIC Denmark-Norway with Euro',
+    1143 => 'IBM EBCDIC Finland-Sweden with Euro',
+    1144 => 'IBM EBCDIC Italy with Euro',
+    1145 => 'IBM EBCDIC Latin America-Spain with Euro',
+    1146 => 'IBM EBCDIC United Kingdom with Euro',
+    1147 => 'IBM EBCDIC France with Euro',
+    1148 => 'IBM EBCDIC International with Euro',
+    1149 => 'IBM EBCDIC Icelandic with Euro',
+    1200 => 'Unicode UTF-16, little endian',
+    1201 => 'Unicode UTF-16, big endian',
+    1250 => 'Windows Latin 2 (Central European)',
+    1251 => 'Windows Cyrillic',
+    1252 => 'Windows Latin 1 (Western European)',
+    1253 => 'Windows Greek',
+    1254 => 'Windows Turkish',
+    1255 => 'Windows Hebrew',
+    1256 => 'Windows Arabic',
+    1257 => 'Windows Baltic',
+    1258 => 'Windows Vietnamese',
+    1361 => 'Korean (Johab)',
+    10000 => 'Mac Roman (Western European)',
+    10001 => 'Mac Japanese',
+    10002 => 'Mac Traditional Chinese',
+    10003 => 'Mac Korean',
+    10004 => 'Mac Arabic',
+    10005 => 'Mac Hebrew',
+    10006 => 'Mac Greek',
+    10007 => 'Mac Cyrillic',
+    10008 => 'Mac Simplified Chinese',
+    10010 => 'Mac Romanian',
+    10017 => 'Mac Ukrainian',
+    10021 => 'Mac Thai',
+    10029 => 'Mac Latin 2 (Central European)',
+    10079 => 'Mac Icelandic',
+    10081 => 'Mac Turkish',
+    10082 => 'Mac Croatian',
+    12000 => 'Unicode UTF-32, little endian',
+    12001 => 'Unicode UTF-32, big endian',
+    20000 => 'CNS Taiwan',
+    20001 => 'TCA Taiwan',
+    20002 => 'Eten Taiwan',
+    20003 => 'IBM5550 Taiwan',
+    20004 => 'TeleText Taiwan',
+    20005 => 'Wang Taiwan',
+    20105 => 'IA5 (IRV International Alphabet No. 5, 7-bit)',
+    20106 => 'IA5 German (7-bit)',
+    20107 => 'IA5 Swedish (7-bit)',
+    20108 => 'IA5 Norwegian (7-bit)',
+    20127 => 'US-ASCII (7-bit)',
+    20261 => 'T.61',
+    20269 => 'ISO 6937 Non-Spacing Accent',
+    20273 => 'IBM EBCDIC Germany',
+    20277 => 'IBM EBCDIC Denmark-Norway',
+    20278 => 'IBM EBCDIC Finland-Sweden',
+    20280 => 'IBM EBCDIC Italy',
+    20284 => 'IBM EBCDIC Latin America-Spain',
+    20285 => 'IBM EBCDIC United Kingdom',
+    20290 => 'IBM EBCDIC Japanese Katakana Extended',
+    20297 => 'IBM EBCDIC France',
+    20420 => 'IBM EBCDIC Arabic',
+    20423 => 'IBM EBCDIC Greek',
+    20424 => 'IBM EBCDIC Hebrew',
+    20833 => 'IBM EBCDIC Korean Extended',
+    20838 => 'IBM EBCDIC Thai',
+    20866 => 'Russian/Cyrillic (KOI8-R)',
+    20871 => 'IBM EBCDIC Icelandic',
+    20880 => 'IBM EBCDIC Cyrillic Russian',
+    20905 => 'IBM EBCDIC Turkish',
+    20924 => 'IBM EBCDIC Latin 1/Open System with Euro',
+    20932 => 'Japanese (JIS 0208-1990 and 0121-1990)',
+    20936 => 'Simplified Chinese (GB2312)',
+    20949 => 'Korean Wansung',
+    21025 => 'IBM EBCDIC Cyrillic Serbian-Bulgarian',
+    21027 => 'Extended Alpha Lowercase (deprecated)',
+    21866 => 'Ukrainian/Cyrillic (KOI8-U)',
+    28591 => 'ISO 8859-1 Latin 1 (Western European)',
+    28592 => 'ISO 8859-2 (Central European)',
+    28593 => 'ISO 8859-3 Latin 3',
+    28594 => 'ISO 8859-4 Baltic',
+    28595 => 'ISO 8859-5 Cyrillic',
+    28596 => 'ISO 8859-6 Arabic',
+    28597 => 'ISO 8859-7 Greek',
+    28598 => 'ISO 8859-8 Hebrew (Visual)',
+    28599 => 'ISO 8859-9 Turkish',
+    28603 => 'ISO 8859-13 Estonian',
+    28605 => 'ISO 8859-15 Latin 9',
+    29001 => 'Europa 3',
+    38598 => 'ISO 8859-8 Hebrew (Logical)',
+    50220 => 'ISO 2022 Japanese with no halfwidth Katakana (JIS)',
+    50221 => 'ISO 2022 Japanese with halfwidth Katakana (JIS-Allow 1 byte Kana)',
+    50222 => 'ISO 2022 Japanese JIS X 0201-1989 (JIS-Allow 1 byte Kana - SO/SI)',
+    50225 => 'ISO 2022 Korean',
+    50227 => 'ISO 2022 Simplified Chinese',
+    50229 => 'ISO 2022 Traditional Chinese',
+    50930 => 'EBCDIC Japanese (Katakana) Extended',
+    50931 => 'EBCDIC US-Canada and Japanese',
+    50933 => 'EBCDIC Korean Extended and Korean',
+    50935 => 'EBCDIC Simplified Chinese Extended and Simplified Chinese',
+    50936 => 'EBCDIC Simplified Chinese',
+    50937 => 'EBCDIC US-Canada and Traditional Chinese',
+    50939 => 'EBCDIC Japanese (Latin) Extended and Japanese',
+    51932 => 'EUC Japanese',
+    51936 => 'EUC Simplified Chinese',
+    51949 => 'EUC Korean',
+    51950 => 'EUC Traditional Chinese',
+    52936 => 'HZ-GB2312 Simplified Chinese',
+    54936 => 'Windows XP and later: GB18030 Simplified Chinese (4 byte)',
+    57002 => 'ISCII Devanagari',
+    57003 => 'ISCII Bengali',
+    57004 => 'ISCII Tamil',
+    57005 => 'ISCII Telugu',
+    57006 => 'ISCII Assamese',
+    57007 => 'ISCII Oriya',
+    57008 => 'ISCII Kannada',
+    57009 => 'ISCII Malayalam',
+    57010 => 'ISCII Gujarati',
+    57011 => 'ISCII Punjabi',
+    65000 => 'Unicode (UTF-7)',
+    65001 => 'Unicode (UTF-8)',
+);
+
+# test for file extensions which may be variants of the FPX format
+# (have seen one password-protected DOCX file that is FPX-like, so assume
+#  that all the rest could be as well)
+my %fpxFileType = (
+    DOC => 1,  DOCX => 1,  DOCM => 1,
+    DOT => 1,  DOTX => 1,  DOTM => 1,
+    POT => 1,  POTX => 1,  POTM => 1,
+    PPS => 1,  PPSX => 1,  PPSM => 1,
+    PPT => 1,  PPTX => 1,  PPTM => 1,  THMX => 1,
+    XLA => 1,  XLAM => 1,
+    XLS => 1,  XLSX => 1,  XLSM => 1,  XLSB => 1,
+    XLT => 1,  XLTX => 1,  XLTM => 1,
+    # non MSOffice types
+    FLA => 1,  VSD  => 1,
+);
+
+%Image::ExifTool::FlashPix::Main = (
+    PROCESS_PROC => \&ProcessFPXR,
+    GROUPS => { 2 => 'Image' },
+    NOTES => q{
+        The FlashPix file format, introduced in 1996, was developed by Kodak,
+        Hewlett-Packard and Microsoft.  Internally the FPX file structure mimics
+        that of an old DOS disk with fixed-sized "sectors" (usually 512 bytes) and a
+        "file allocation table" (FAT).  No wonder this image format never became
+        popular.  However, some of the structures used in FlashPix streams are part
+        of the EXIF specification, and are still being used in the APP2 FPXR segment
+        of JPEG images by some Kodak and Hewlett-Packard digital cameras.
+
+        ExifTool extracts FlashPix information from both FPX images and the APP2
+        FPXR segment of JPEG images.  As well, FlashPix information is extracted
+        from DOC, PPT, XLS (Microsoft Word, PowerPoint and Excel) documents, VSD
+        (Microsoft Visio) drawings, and FLA (Macromedia/Adobe Flash project) files
+        since these are based on the same file format as FlashPix (the Windows
+        Compound Binary File format).  See
+        L<http://graphcomp.com/info/specs/livepicture/fpx.pdf> for the FlashPix
+        specification.
+    },
+    "\x05SummaryInformation" => {
+        Name => 'SummaryInfo',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::FlashPix::SummaryInfo',
+        },
+    },
+    "\x05DocumentSummaryInformation" => {
+        Name => 'DocumentInfo',
+        Multi => 1, # flag to process UserDefined information after this
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::FlashPix::DocumentInfo',
+        },
+    },
+    "\x01CompObj" => {
+        Name => 'CompObj',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::FlashPix::CompObj',
+            DirStart => 0x1c,   # skip stream header
+        },
+    },
+    "\x05Image Info" => {
+        Name => 'ImageInfo',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::FlashPix::ImageInfo',
+        },
+    },
+    "\x05Image Contents" => {
+        Name => 'Image',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::FlashPix::Image',
+        },
+    },
+    "Contents" => {
+        Name => 'Contents',
+        Notes => 'found in FLA files; may contain XMP',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::XMP::Main',
+            ProcessProc => \&ProcessContents,
+        },
+    },
+    "ICC Profile 0001" => {
+        Name => 'ICC_Profile',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::ICC_Profile::Main',
+            DirStart => 0x1c,   # skip stream header
+        },
+    },
+    "\x05Extension List" => {
+        Name => 'Extensions',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::FlashPix::Extensions',
+        },
+    },
+    'Subimage 0000 Header' => {
+        Name => 'SubimageHdr',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::FlashPix::SubimageHdr',
+            DirStart => 0x1c,   # skip stream header
+        },
+    },
+#   'Subimage 0000 Data'
+    "\x05Data Object" => {  # plus instance number (ie. " 000000")
+        Name => 'DataObject',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::FlashPix::DataObject',
+        },
+    },
+#   "\x05Data Object Store" => { # plus instance number (ie. " 000000")
+    "\x05Transform" => {    # plus instance number (ie. " 000000")
+        Name => 'Transform',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::FlashPix::Transform',
+        },
+    },
+    "\x05Operation" => {    # plus instance number (ie. " 000000")
+        Name => 'Operation',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::FlashPix::Operation',
+        },
+    },
+    "\x05Global Info" => {
+        Name => 'GlobalInfo',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::FlashPix::GlobalInfo',
+        },
+    },
+    "\x05Screen Nail" => { # plus class ID (ie. "_bd0100609719a180")
+        Name => 'ScreenNail',
+        Groups => { 2 => 'Other' },
+        # strip off stream header
+        ValueConv => 'length($val) > 0x1c and $val = substr($val, 0x1c); \$val',
+    },
+    "\x05Audio Info" => {
+        Name => 'AudioInfo',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::FlashPix::AudioInfo',
+        },
+    },
+    'Audio Stream' => { # plus instance number (ie. " 000000")
+        Name => 'AudioStream',
+        Groups => { 2 => 'Audio' },
+        # strip off stream header
+        ValueConv => 'length($val) > 0x1c and $val = substr($val, 0x1c); \$val',
+    },
+    'Current User' => { #PH
+        Name => 'CurrentUser',
+        # not sure what the rest of this data is, but extract ASCII name from it - PH
+        ValueConv => q{
+            return undef if length $val < 12;
+            my ($size,$pos) = unpack('x4VV', $val);
+            my $len = $size - $pos - 4;
+            return undef if $len < 0 or length $val < $size + 8;
+            return substr($val, 8 + $pos, $len);
+        },
+    },
+);
+
+# Summary Information properties
+%Image::ExifTool::FlashPix::SummaryInfo = (
+    PROCESS_PROC => \&ProcessProperties,
+    GROUPS => { 2 => 'Document' },
+    NOTES => q{
+        The Dictionary, CodePage and LocalIndicator tags are common to all FlashPix
+        property tables, even though they are only listed in the SummaryInfo table.
+    },
+    0x00 => { Name => 'Dictionary',     Groups => { 2 => 'Other' }, Binary => 1 },
+    0x01 => {
+        Name => 'CodePage',
+        Groups => { 2 => 'Other' },
+        PrintConv => \%codePage,
+    },
+    0x02 => 'Title',
+    0x03 => 'Subject',
+    0x04 => { Name => 'Author',         Groups => { 2 => 'Author' } },
+    0x05 => 'Keywords',
+    0x06 => 'Comments',
+    0x07 => 'Template',
+    0x08 => { Name => 'LastModifiedBy', Groups => { 2 => 'Author' } },
+    0x09 => 'RevisionNumber',
+    0x0a => { Name => 'TotalEditTime',  PrintConv => 'ConvertTimeSpan($val)' }, # (in sec)
+    0x0b => { Name => 'LastPrinted',    Groups => { 2 => 'Time' } },
+    0x0c => {
+        Name => 'CreateDate',
+        Groups => { 2 => 'Time' },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    0x0d => {
+        Name => 'ModifyDate',
+        Groups => { 2 => 'Time' },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    0x0e => 'Pages',
+    0x0f => 'Words',
+    0x10 => 'Characters',
+    0x11 => { Name => 'ThumbnailClip',  Binary => 1 },
+    0x12 => {
+        Name => 'Software',
+        RawConv => '$$self{Software} = $val', # (use to determine file type)
+    },
+    0x13 => {
+        Name => 'Security',
+        # see http://msdn.microsoft.com/en-us/library/aa379255(VS.85).aspx
+        PrintConv => {
+            0 => 'None',
+            1 => 'Password protected',
+            2 => 'Read-only recommended',
+            4 => 'Read-only enforced',
+            8 => 'Locked for annotations',
+        },
+    },
+    0x80000000 => { Name => 'LocaleIndicator', Groups => { 2 => 'Other' } },
+);
+
+# Document Summary Information properties (ref 4)
+%Image::ExifTool::FlashPix::DocumentInfo = (
+    PROCESS_PROC => \&ProcessProperties,
+    GROUPS => { 2 => 'Document' },
+    NOTES => q{
+        The DocumentSummaryInformation property set includes a UserDefined property
+        set for which only the Hyperlinks and HyperlinkBase tags are pre-defined.
+        However, ExifTool will also extract any other information found in the
+        UserDefined properties.
+    },
+    0x02 => 'Category',
+    0x03 => 'PresentationTarget',
+    0x04 => 'Bytes',
+    0x05 => 'Lines',
+    0x06 => 'Paragraphs',
+    0x07 => 'Slides',
+    0x08 => 'Notes',
+    0x09 => 'HiddenSlides',
+    0x0a => 'MMClips',
+    0x0b => {
+        Name => 'ScaleCrop',
+        PrintConv => { 0 => 'No', 1 => 'Yes' },
+    },
+    0x0c => 'HeadingPairs',
+    0x0d => 'TitleOfParts',
+    0x0e => 'Manager',
+    0x0f => 'Company',
+    0x10 => {
+        Name => 'LinksUpToDate',
+        PrintConv => { 0 => 'No', 1 => 'Yes' },
+    },
+    0x11 => 'CharCountWithSpaces',
+  # 0x12 ?
+    0x13 => { #PH (unconfirmed)
+        Name => 'SharedDoc',
+        PrintConv => { 0 => 'No', 1 => 'Yes' },
+    },
+  # 0x14 ?
+  # 0x15 ?
+    0x16 => {
+        Name => 'HyperlinksChanged',
+        PrintConv => { 0 => 'No', 1 => 'Yes' },
+    },
+    0x17 => { #PH (unconfirmed handling of lower 16 bits)
+        Name => 'AppVersion',
+        ValueConv => 'sprintf("%d.%.4d",$val >> 16, $val & 0xffff)',
+    },
+   '_PID_LINKBASE' => {
+        Name => 'HyperlinkBase',
+        ValueConv => '$self->Decode($val, "UCS2","II")',
+    },
+   '_PID_HLINKS' => {
+        Name => 'Hyperlinks',
+        RawConv => \&ProcessHyperlinks,
+    },
+);
+
+# Image Information properties
+%Image::ExifTool::FlashPix::ImageInfo = (
+    PROCESS_PROC => \&ProcessProperties,
+    GROUPS => { 2 => 'Image' },
+    0x21000000 => {
+        Name => 'FileSource',
+        PrintConv => {
+            1 => 'Film Scanner',
+            2 => 'Reflection Print Scanner',
+            3 => 'Digital Camera',
+            4 => 'Video Capture',
+            5 => 'Computer Graphics',
+        },
+    },
+    0x21000001 => {
+        Name => 'SceneType',
+        PrintConv => {
+            1 => 'Original Scene',
+            2 => 'Second Generation Scene',
+            3 => 'Digital Scene Generation',
+        },
+    },
+    0x21000002 => 'CreationPathVector',
+    0x21000003 => 'SoftwareRelease',
+    0x21000004 => 'UserDefinedID',
+    0x21000005 => 'SharpnessApproximation',
+    0x22000000 => { Name => 'Copyright',                 Groups => { 2 => 'Author' } },
+    0x22000001 => { Name => 'OriginalImageBroker',       Groups => { 2 => 'Author' } },
+    0x22000002 => { Name => 'DigitalImageBroker',        Groups => { 2 => 'Author' } },
+    0x22000003 => { Name => 'Authorship',                Groups => { 2 => 'Author' } },
+    0x22000004 => { Name => 'IntellectualPropertyNotes', Groups => { 2 => 'Author' } },
+    0x23000000 => {
+        Name => 'TestTarget',
+        PrintConv => {
+            1 => 'Color Chart',
+            2 => 'Gray Card',
+            3 => 'Grayscale',
+            4 => 'Resolution Chart',
+            5 => 'Inch Scale',
+            6 => 'Centimeter Scale',
+            7 => 'Millimeter Scale',
+            8 => 'Micrometer Scale',
+        },
+    },
+    0x23000002 => 'GroupCaption',
+    0x23000003 => 'CaptionText',
+    0x23000004 => 'People',
+    0x23000007 => 'Things',
+    0x2300000A => {
+        Name => 'DateTimeOriginal',
+        Description => 'Date/Time Original',
+        Groups => { 2 => 'Time' },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    0x2300000B => 'Events',
+    0x2300000C => 'Places',
+    0x2300000F => 'ContentDescriptionNotes',
+    0x24000000 => { Name => 'Make',             Groups => { 2 => 'Camera' } },
+    0x24000001 => {
+        Name => 'Model',
+        Description => 'Camera Model Name',
+        Groups => { 2 => 'Camera' },
+    },
+    0x24000002 => { Name => 'SerialNumber',     Groups => { 2 => 'Camera' } },
+    0x25000000 => {
+        Name => 'CreateDate',
+        Groups => { 2 => 'Time' },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    0x25000001 => {
+        Name => 'ExposureTime',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+    },
+    0x25000002 => {
+        Name => 'FNumber',
+        PrintConv => 'sprintf("%.1f",$val)',
+    },
+    0x25000003 => {
+        Name => 'ExposureProgram',
+        Groups => { 2 => 'Camera' },
+        # use PrintConv of corresponding EXIF tag
+        PrintConv => $Image::ExifTool::Exif::Main{0x8822}->{PrintConv},
+    },
+    0x25000004 => 'BrightnessValue',
+    0x25000005 => 'ExposureCompensation',
+    0x25000006 => {
+        Name => 'SubjectDistance',
+        Groups => { 2 => 'Camera' },
+        PrintConv => 'sprintf("%.3f m", $val)',
+    },
+    0x25000007 => {
+        Name => 'MeteringMode',
+        Groups => { 2 => 'Camera' },
+        PrintConv => $Image::ExifTool::Exif::Main{0x9207}->{PrintConv},
+    },
+    0x25000008 => {
+        Name => 'LightSource',
+        Groups => { 2 => 'Camera' },
+        PrintConv => $Image::ExifTool::Exif::Main{0x9208}->{PrintConv},
+    },
+    0x25000009 => {
+        Name => 'FocalLength',
+        Groups => { 2 => 'Camera' },
+        PrintConv => 'sprintf("%.1f mm",$val)',
+    },
+    0x2500000A => {
+        Name => 'MaxApertureValue',
+        Groups => { 2 => 'Camera' },
+        ValueConv => '2 ** ($val / 2)',
+        PrintConv => 'sprintf("%.1f",$val)',
+    },
+    0x2500000B => {
+        Name => 'Flash',
+        Groups => { 2 => 'Camera' },
+        PrintConv => {
+            1 => 'No Flash',
+            2 => 'Flash Fired',
+        },
+    },
+    0x2500000C => {
+        Name => 'FlashEnergy',
+        Groups => { 2 => 'Camera' },
+    },
+    0x2500000D => {
+        Name => 'FlashReturn',
+        Groups => { 2 => 'Camera' },
+        PrintConv => {
+            1 => 'Subject Outside Flash Range',
+            2 => 'Subject Inside Flash Range',
+        },
+    },
+    0x2500000E => {
+        Name => 'BackLight',
+        PrintConv => {
+            1 => 'Front Lit',
+            2 => 'Back Lit 1',
+            3 => 'Back Lit 2',
+        },
+    },
+    0x2500000F => { Name => 'SubjectLocation', Groups => { 2 => 'Camera' } },
+    0x25000010 => 'ExposureIndex',
+    0x25000011 => {
+        Name => 'SpecialEffectsOpticalFilter',
+        PrintConv => {
+            1 => 'None',
+            2 => 'Colored',
+            3 => 'Diffusion',
+            4 => 'Multi-image',
+            5 => 'Polarizing',
+            6 => 'Split-field',
+            7 => 'Star',
+        },
+    },
+    0x25000012 => 'PerPictureNotes',
+    0x26000000 => {
+        Name => 'SensingMethod',
+        Groups => { 2 => 'Camera' },
+        PrintConv => $Image::ExifTool::Exif::Main{0x9217}->{PrintConv},
+    },
+    0x26000001 => { Name => 'FocalPlaneXResolution', Groups => { 2 => 'Camera' } },
+    0x26000002 => { Name => 'FocalPlaneYResolution', Groups => { 2 => 'Camera' } },
+    0x26000003 => {
+        Name => 'FocalPlaneResolutionUnit',
+        Groups => { 2 => 'Camera' },
+        PrintConv => $Image::ExifTool::Exif::Main{0xa210}->{PrintConv},
+    },
+    0x26000004 => 'SpatialFrequencyResponse',
+    0x26000005 => 'CFAPattern',
+    0x27000001 => {
+        Name => 'FilmCategory',
+        PrintConv => {
+            1 => 'Negative B&W',
+            2 => 'Negative Color',
+            3 => 'Reversal B&W',
+            4 => 'Reversal Color',
+            5 => 'Chromagenic',
+            6 => 'Internegative B&W',
+            7 => 'Internegative Color',
+        },
+    },
+    0x26000007 => 'ISO',
+    0x26000008 => 'Opto-ElectricConvFactor',
+    0x27000000 => 'FilmBrand',
+    0x27000001 => 'FilmCategory',
+    0x27000002 => 'FilmSize',
+    0x27000003 => 'FilmRollNumber',
+    0x27000004 => 'FilmFrameNumber',
+    0x29000000 => 'OriginalScannedImageSize',
+    0x29000001 => 'OriginalDocumentSize',
+    0x29000002 => {
+        Name => 'OriginalMedium',
+        PrintConv => {
+            1 => 'Continuous Tone Image',
+            2 => 'Halftone Image',
+            3 => 'Line Art',
+        },
+    },
+    0x29000003 => {
+        Name => 'TypeOfOriginal',
+        PrintConv => {
+            1 => 'B&W Print',
+            2 => 'Color Print',
+            3 => 'B&W Document',
+            4 => 'Color Document',
+        },
+    },
+    0x28000000 => 'ScannerMake',
+    0x28000001 => 'ScannerModel',
+    0x28000002 => 'ScannerSerialNumber',
+    0x28000003 => 'ScanSoftware',
+    0x28000004 => { Name => 'ScanSoftwareRevisionDate', Groups => { 2 => 'Time' } },
+    0x28000005 => 'ServiceOrganizationName',
+    0x28000006 => 'ScanOperatorID',
+    0x28000008 => {
+        Name => 'ScanDate',
+        Groups => { 2 => 'Time' },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    0x28000009 => {
+        Name => 'ModifyDate',
+        Groups => { 2 => 'Time' },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    0x2800000A => 'ScannerPixelSize',
+);
+
+# Image Contents properties
+%Image::ExifTool::FlashPix::Image = (
+    PROCESS_PROC => \&ProcessProperties,
+    GROUPS => { 2 => 'Image' },
+    # VARS storage is used as a hash lookup for tagID's which aren't constant.
+    # The key is a mask for significant bits of the tagID, and the value
+    # is a lookup for tagID's for which this mask is valid.
+    VARS => {
+        # ID's are different for each subimage
+        0xff00ffff => {
+            0x02000000=>1, 0x02000001=>1, 0x02000002=>1, 0x02000003=>1,
+            0x02000004=>1, 0x02000005=>1, 0x02000006=>1, 0x02000007=>1,
+            0x03000001=>1,
+        },
+    },
+    0x01000000 => 'NumberOfResolutions',
+    0x01000002 => 'ImageWidth',     # width of highest resolution image
+    0x01000003 => 'ImageHeight',
+    0x01000004 => 'DefaultDisplayHeight',
+    0x01000005 => 'DefaultDisplayWidth',
+    0x01000006 => {
+        Name => 'DisplayUnits',
+        PrintConv => {
+            0 => 'inches',
+            1 => 'meters',
+            2 => 'cm',
+            3 => 'mm',
+        },
+    },
+    0x02000000 => 'SubimageWidth',
+    0x02000001 => 'SubimageHeight',
+    0x02000002 => {
+        Name => 'SubimageColor',
+        # decode only component count and color space of first component
+        ValueConv => 'sprintf("%.2x %.4x", unpack("x4vx4v",$val))',
+        PrintConv => {
+            '01 0000' => 'Opacity Only',
+            '01 8000' => 'Opacity Only (uncalibrated)',
+            '01 0001' => 'Monochrome',
+            '01 8001' => 'Monochrome (uncalibrated)',
+            '03 0002' => 'YCbCr',
+            '03 8002' => 'YCbCr (uncalibrated)',
+            '03 0003' => 'RGB',
+            '03 8003' => 'RGB (uncalibrated)',
+            '04 0002' => 'YCbCr with Opacity',
+            '04 8002' => 'YCbCr with Opacity (uncalibrated)',
+            '04 0003' => 'RGB with Opacity',
+            '04 8003' => 'RGB with Opacity (uncalibrated)',
+        },
+    },
+    0x02000003 => {
+        Name => 'SubimageNumericalFormat',
+        PrintConv => {
+            17 => '8-bit, Unsigned',
+            18 => '16-bit, Unsigned',
+            19 => '32-bit, Unsigned',
+        },
+    },
+    0x02000004 => {
+        Name => 'DecimationMethod',
+        PrintConv => {
+            0 => 'None (Full-sized Image)',
+            8 => '8-point Prefilter',
+        },
+    },
+    0x02000005 => 'DecimationPrefilterWidth',
+    0x02000007 => 'SubimageICC_Profile',
+    0x03000001 => { Name => 'JPEGTables', Binary => 1 },
+    0x03000002 => 'MaxJPEGTableIndex',
+);
+
+# Extension List properties
+%Image::ExifTool::FlashPix::Extensions = (
+    PROCESS_PROC => \&ProcessProperties,
+    GROUPS => { 2 => 'Other' },
+    VARS => {
+        # ID's are different for each extension type
+        0x0000ffff => {
+            0x0001=>1, 0x0002=>1, 0x0003=>1, 0x0004=>1,
+            0x0005=>1, 0x0006=>1, 0x0007=>1, 0x1000=>1,
+            0x2000=>1, 0x2001=>1, 0x3000=>1, 0x4000=>1,
+        },
+        0x0000f00f => { 0x3001=>1, 0x3002=>1 },
+    },
+    0x10000000 => 'UsedExtensionNumbers',
+    0x0001 => 'ExtensionName',
+    0x0002 => 'ExtensionClassID',
+    0x0003 => {
+        Name => 'ExtensionPersistence',
+        PrintConv => {
+            0 => 'Always Valid',
+            1 => 'Invalidated By Modification',
+            2 => 'Potentially Invalidated By Modification',
+        },
+    },
+    0x0004 => { Name => 'ExtensionCreateDate', Groups => { 2 => 'Time' } },
+    0x0005 => { Name => 'ExtensionModifyDate', Groups => { 2 => 'Time' } },
+    0x0006 => 'CreatingApplication',
+    0x0007 => 'ExtensionDescription',
+    0x1000 => 'Storage-StreamPathname',
+    0x2000 => 'FlashPixStreamPathname',
+    0x2001 => 'FlashPixStreamFieldOffset',
+    0x3000 => 'PropertySetPathname',
+    0x3001 => 'PropertySetIDCodes',
+    0x3002 => 'PropertyVectorElements',
+    0x4000 => 'SubimageResolutions',
+);
+
+# Subimage Header tags
+%Image::ExifTool::FlashPix::SubimageHdr = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    FORMAT => 'int32u',
+#   0 => 'HeaderLength',
+    1 => 'SubimageWidth',
+    2 => 'SubimageHeight',
+    3 => 'SubimageTileCount',
+    4 => 'SubimageTileWidth',
+    5 => 'SubimageTileHeight',
+    6 => 'NumChannels',
+#   7 => 'TileHeaderOffset',
+#   8 => 'TileHeaderLength',
+    # ... followed by tile header table
+);
+
+# Data Object properties
+%Image::ExifTool::FlashPix::DataObject = (
+    PROCESS_PROC => \&ProcessProperties,
+    GROUPS => { 2 => 'Other' },
+    0x00010000 => 'DataObjectID',
+    0x00010002 => 'LockedPropertyList',
+    0x00010003 => 'DataObjectTitle',
+    0x00010004 => 'LastModifier',
+    0x00010005 => 'RevisionNumber',
+    0x00010006 => { Name => 'DataCreateDate', Groups => { 2 => 'Time' } },
+    0x00010007 => { Name => 'DataModifyDate', Groups => { 2 => 'Time' } },
+    0x00010008 => 'CreatingApplication',
+    0x00010100 => {
+        Name => 'DataObjectStatus',
+        PrintConv => q{
+            ($val & 0x0000ffff ? 'Exists' : 'Does Not Exist') .
+            ', ' . ($val & 0xffff0000 ? 'Not ' : '') . 'Purgeable'
+        },
+    },
+    0x00010101 => {
+        Name => 'CreatingTransform',
+        PrintConv => '$val ? $val :  "Source Image"',
+    },
+    0x00010102 => 'UsingTransforms',
+    0x10000000 => 'CachedImageHeight',
+    0x10000001 => 'CachedImageWidth',
+);
+
+# Transform properties
+%Image::ExifTool::FlashPix::Transform = (
+    PROCESS_PROC => \&ProcessProperties,
+    GROUPS => { 2 => 'Other' },
+    0x00010000 => 'TransformNodeID',
+    0x00010001 => 'OperationClassID',
+    0x00010002 => 'LockedPropertyList',
+    0x00010003 => 'TransformTitle',
+    0x00010004 => 'LastModifier',
+    0x00010005 => 'RevisionNumber',
+    0x00010006 => { Name => 'TransformCreateDate', Groups => { 2 => 'Time' } },
+    0x00010007 => { Name => 'TransformModifyDate', Groups => { 2 => 'Time' } },
+    0x00010008 => 'CreatingApplication',
+    0x00010100 => 'InputDataObjectList',
+    0x00010101 => 'OutputDataObjectList',
+    0x00010102 => 'OperationNumber',
+    0x10000000 => 'ResultAspectRatio',
+    0x10000001 => 'RectangleOfInterest',
+    0x10000002 => 'Filtering',
+    0x10000003 => 'SpatialOrientation',
+    0x10000004 => 'ColorTwistMatrix',
+    0x10000005 => 'ContrastAdjustment',
+);
+
+# Operation properties
+%Image::ExifTool::FlashPix::Operation = (
+    PROCESS_PROC => \&ProcessProperties,
+    0x00010000 => 'OperationID',
+);
+
+# Global Info properties
+%Image::ExifTool::FlashPix::GlobalInfo = (
+    PROCESS_PROC => \&ProcessProperties,
+    0x00010002 => 'LockedPropertyList',
+    0x00010003 => 'TransformedImageTitle',
+    0x00010004 => 'LastModifier',
+    0x00010100 => 'VisibleOutputs',
+    0x00010101 => 'MaximumImageIndex',
+    0x00010102 => 'MaximumTransformIndex',
+    0x00010103 => 'MaximumOperationIndex',
+);
+
+# Audio Info properties
+%Image::ExifTool::FlashPix::AudioInfo = (
+    PROCESS_PROC => \&ProcessProperties,
+    GROUPS => { 2 => 'Audio' },
+);
+
+# MacroMedia flash contents
+%Image::ExifTool::FlashPix::Contents = (
+    PROCESS_PROC => \&ProcessProperties,
+    GROUPS => { 2 => 'Image' },
+);
+
+# CompObj tags
+%Image::ExifTool::FlashPix::CompObj = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Other' },
+    FORMAT => 'int32u',
+    0 => { Name => 'CompObjUserTypeLen' },
+    1 => {
+        Name => 'CompObjUserType',
+        Format => 'string[$val{0}]',
+        RawConv => '$$self{CompObjUserType} = $val', # (use to determine file type)
+    },
+);
+
+# composite FlashPix tags
+%Image::ExifTool::FlashPix::Composite = (
+    GROUPS => { 2 => 'Image' },
+    PreviewImage => {
+        # extract JPEG preview from ScreenNail if possible
+        Require => {
+            0 => 'ScreenNail',
+        },
+        Binary => 1,
+        RawConv => q{
+            return undef unless $val[0] =~ /\xff\xd8\xff/g;
+            return substr($val[0], pos($val[0])-3);
+        },
+    },
+);
+
+# add our composite tags
+Image::ExifTool::AddCompositeTags('Image::ExifTool::FlashPix');
+
+#------------------------------------------------------------------------------
+# Process hyperlinks from PID_HYPERLINKS array
+# (ref http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/dnaro97ta/html/msdn_hyper97.asp)
+# Inputs: 0) value, 1) ExifTool ref
+# Returns: list of hyperlinks
+sub ProcessHyperlinks($$)
+{
+    my ($val, $exifTool) = @_;
+
+    # process as an array of VT_VARIANT's
+    my $dirEnd = length $val;
+    return undef if $dirEnd < 4;
+    my $num = Get32u(\$val, 0);
+    my $valPos = 4;
+    my ($i, @vals);
+    for ($i=0; $i<$num; ++$i) {
+        # read VT_BLOB entries as an array of VT_VARIANT's
+        my $value = ReadFPXValue($exifTool, \$val, $valPos, VT_VARIANT, $dirEnd);
+        last unless defined $value;
+        push @vals, $value;
+    }
+    # filter values to extract only the links
+    my @links;
+    for ($i=0; $i<@vals; $i+=6) {
+        push @links, $vals[$i+4];    # get address
+        $links[-1] .= '#' . $vals[$i+5] if length $vals[$i+5]; # add subaddress
+    }
+    return \@links;
+}
+
+#------------------------------------------------------------------------------
+# Read FlashPix value
+# Inputs: 0) ExifTool ref, 1) data ref, 2) value offset, 3) FPX format number,
+#         4) end offset, 5) flag for no padding, 6) code page
+# Returns: converted value (or list of values in list context) and updates
+#          value offset to end of value if successful, or returns undef on error
+sub ReadFPXValue($$$$$;$$)
+{
+    my ($exifTool, $dataPt, $valPos, $type, $dirEnd, $noPad, $codePage) = @_;
+    my @vals;
+
+    my $format = $oleFormat{$type & 0x0fff};
+    while ($format) {
+        my $count = 1;
+        # handle VT_VECTOR types
+        my $flags = $type & 0xf000;
+        if ($flags) {
+            if ($flags == VT_VECTOR) {
+                $noPad = 1;     # values don't seem to be padded inside vectors
+                my $size = $oleFormatSize{VT_VECTOR};
+                last if $valPos + $size > $dirEnd;
+                $count = Get32u($dataPt, $valPos);
+                push @vals, '' if $count == 0;  # allow zero-element vector
+                $valPos += 4;
+            } else {
+                # can't yet handle this property flag
+                last;
+            }
+        }
+        unless ($format =~ /^VT_/) {
+            my $size = Image::ExifTool::FormatSize($format) * $count;
+            last if $valPos + $size > $dirEnd;
+            @vals = ReadValue($dataPt, $valPos, $format, $count, $size);
+            # update position to end of value plus padding
+            $valPos += ($count * $size + 3) & 0xfffffffc;
+            last;
+        }
+        my $size = $oleFormatSize{$format};
+        my ($item, $val);
+        for ($item=0; $item<$count; ++$item) {
+            last if $valPos + $size > $dirEnd;
+            if ($format eq 'VT_VARIANT') {
+                my $subType = Get32u($dataPt, $valPos);
+                $valPos += $size;
+                $val = ReadFPXValue($exifTool, $dataPt, $valPos, $subType, $dirEnd, $noPad, $codePage);
+                last unless defined $val;
+                push @vals, $val;
+                next;   # avoid adding $size to $valPos again
+            } elsif ($format eq 'VT_FILETIME') {
+                # get time in seconds
+                $val = 1e-7 * Image::ExifTool::Get64u($dataPt, $valPos);
+                # print as date/time if value is greater than one year (PH hack)
+                if ($val > 365 * 24 * 3600) {
+                    # shift from Jan 1, 1601 to Jan 1, 1970
+                    $val -= 134774 * 24 * 3600 if $val != 0;
+                    $val = Image::ExifTool::ConvertUnixTime($val);
+                }
+            } elsif ($format eq 'VT_DATE') {
+                $val = Image::ExifTool::GetDouble($dataPt, $valPos);
+                # shift zero from Dec 30, 1899 to Jan 1, 1970 and convert to secs
+                $val = ($val - 25569) * 24 * 3600 if $val != 0;
+                $val = Image::ExifTool::ConvertUnixTime($val);
+            } elsif ($format =~ /STR$/) {
+                my $len = Get32u($dataPt, $valPos);
+                $len *= 2 if $format eq 'VT_LPWSTR';    # convert to byte count
+                last if $valPos + $len + 4 > $dirEnd;
+                $val = substr($$dataPt, $valPos + 4, $len);
+                if ($format eq 'VT_LPWSTR') {
+                    # convert wide string from Unicode
+                    $val = $exifTool->Decode($val, 'UCS2');
+                } elsif ($codePage) {
+                    my $charset = $Image::ExifTool::charsetName{"cp$codePage"};
+                    if ($charset) {
+                        $val = $exifTool->Decode($val, $charset);
+                    } elsif ($codePage eq 1200) {   # UTF-16, little endian
+                        $val = $exifTool->Decode(undef, 'UCS2', 'II');
+                    }
+                }
+                $val =~ s/\0.*//s;  # truncate at null terminator
+                # update position for string length
+                # (the spec states that strings should be padded to align
+                #  on even 32-bit boundaries, but this isn't always the case)
+                $valPos += $noPad ? $len : ($len + 3) & 0xfffffffc;
+            } elsif ($format eq 'VT_BLOB' or $format eq 'VT_CF') {
+                my $len = Get32u($dataPt, $valPos);
+                last if $valPos + $len + 4 > $dirEnd;
+                $val = substr($$dataPt, $valPos + 4, $len);
+                # update position for data length plus padding
+                # (does this padding disappear in arrays too?)
+                $valPos += ($len + 3) & 0xfffffffc;
+            } elsif ($format eq 'VT_CLSID') {
+                $val = Image::ExifTool::ASF::GetGUID(substr($$dataPt, $valPos, $size));
+            }
+            $valPos += $size;   # update value pointer to end of value
+            push @vals, $val;
+        }
+        # join VT_ values with commas unless we want an array
+        @vals = ( join $exifTool->Options('ListSep'), @vals ) if @vals > 1 and not wantarray;
+        last;   # didn't really want to loop
+    }
+    $_[2] = $valPos;    # return updated value position
+
+    if (wantarray) {
+        return @vals;
+    } elsif (@vals > 1) {
+        return join(' ', @vals);
+    } else {
+        return $vals[0];
+    }
+}
+
+#------------------------------------------------------------------------------
+# Scan for XMP in FLA Contents (ref PH)
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+# Notes: FLA format is proprietary and I couldn't find any documentation,
+#        so this routine is entirely based on observations from sample files
+sub ProcessContents($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $isFLA;
+
+    # all of my FLA samples contain "Contents" data, an no other FPX-like samples have
+    # this, but check the data for a familiar pattern to be sure this is FLA: the
+    # Contents of all of my FLA samples start with two bytes (0x29,0x38,0x3f,0x43 or 0x47,
+    # then 0x01) followed by a number of zero bytes (from 0x18 to 0x26 of them, related
+    # somehow to the value of the first byte), followed by the string "DocumentPage"
+    $isFLA = 1 if $$dataPt =~ /^..\0+\xff\xff\x01\0\x0d\0CDocumentPage/;
+    
+    # do a brute-force scan of the "Contents" for UTF-16 XMP
+    # (this may always be little-endian, but allow for either endianness)
+    if ($$dataPt =~ /<\0\?\0x\0p\0a\0c\0k\0e\0t\0 \0b\0e\0g\0i\0n\0=\0['"](\0\xff\xfe|\xfe\xff)/g) {
+        $$dirInfo{DirStart} = pos($$dataPt) - 36;
+        if ($$dataPt =~ /<\0\?\0x\0p\0a\0c\0k\0e\0t\0 \0e\0n\0d\0=\0['"]\0[wr]\0['"]\0\?\0>\0?/g) {
+            $$dirInfo{DirLen} = pos($$dataPt) - $$dirInfo{DirStart};
+            Image::ExifTool::XMP::ProcessXMP($exifTool, $dirInfo, $tagTablePtr);
+            # override format if not already FLA but XMP-dc:Format indicates it is
+            $isFLA = 1 if $$exifTool{FILE_TYPE} ne 'FLA' and $$exifTool{VALUE}{Format} and
+                          $$exifTool{VALUE}{Format} eq 'application/vnd.adobe.fla';
+        }
+    }
+    $exifTool->OverrideFileType('FLA') if $isFLA;
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Check FPX byte order mark (BOM) and set byte order appropriately
+# Inputs: 0) data ref, 1) offset to BOM
+# Returns: true on success
+sub CheckBOM($$)
+{
+    my ($dataPt, $pos) = @_;
+    my $bom = Get16u($dataPt, $pos);
+    return 1 if $bom == 0xfffe;
+    return 0 unless $bom == 0xfeff;
+    ToggleByteOrder();
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Process FlashPix properties
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessProperties($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $pos = $$dirInfo{DirStart} || 0;
+    my $dirLen = $$dirInfo{DirLen} || length($$dataPt) - $pos;
+    my $dirEnd = $pos + $dirLen;
+    my $verbose = $exifTool->Options('Verbose');
+    my $n;
+
+    if ($dirLen < 48) {
+        $exifTool->Warn('Truncated FPX properties');
+        return 0;
+    }
+    # check and set our byte order if necessary
+    unless (CheckBOM($dataPt, $pos)) {
+        $exifTool->Warn('Bad FPX property byte order mark');
+        return 0;
+    }
+    # get position of start of section
+    $pos = Get32u($dataPt, $pos + 44);
+    if ($pos < 48) {
+        $exifTool->Warn('Bad FPX property section offset');
+        return 0;
+    }
+    for ($n=0; $n<2; ++$n) {
+        my %dictionary;     # dictionary to translate user-defined properties
+        my $codePage;
+        last if $pos + 8 > $dirEnd;
+        # read property section header
+        my $size = Get32u($dataPt, $pos);
+        last unless $size;
+        my $numEntries = Get32u($dataPt, $pos + 4);
+        $verbose and $exifTool->VerboseDir('Property Info', $numEntries, $size);
+        if ($pos + 8 + 8 * $numEntries > $dirEnd) {
+            $exifTool->Warn('Truncated property list');
+            last;
+        }
+        my $index;
+        for ($index=0; $index<$numEntries; ++$index) {
+            my $entry = $pos + 8 + 8 * $index;
+            my $tag = Get32u($dataPt, $entry);
+            my $offset = Get32u($dataPt, $entry + 4);
+            my $valStart = $pos + 4 + $offset;
+            last if $valStart >= $dirEnd;
+            my $valPos = $valStart;
+            my $type = Get32u($dataPt, $pos + $offset);
+            if ($tag == 0) {
+                # read dictionary to get tag name lookup for this property set
+                my $i;
+                for ($i=0; $i<$type; ++$i) {
+                    last if $valPos + 8 > $dirEnd;
+                    $tag = Get32u($dataPt, $valPos);
+                    my $len = Get32u($dataPt, $valPos + 4);
+                    $valPos += 8 + $len;
+                    last if $valPos > $dirEnd;
+                    my $name = substr($$dataPt, $valPos - $len, $len);
+                    $name =~ s/\0.*//s;
+                    next unless length $name;
+                    $dictionary{$tag} = $name;
+                    next if $$tagTablePtr{$name};
+                    $tag = $name;
+                    $name =~ s/(^| )([a-z])/\U$2/g; # start with uppercase
+                    $name =~ tr/-_a-zA-Z0-9//dc;    # remove illegal characters
+                    next unless length $name;
+                    $exifTool->VPrint(0, "$$exifTool{INDENT}\[adding $name]\n") if $verbose;
+                    Image::ExifTool::AddTagToTable($tagTablePtr, $tag, { Name => $name });
+                }
+                next;
+            }
+            # use tag name from dictionary if available
+            my ($custom, $val);
+            if (defined $dictionary{$tag}) {
+                $tag = $dictionary{$tag};
+                $custom = 1;
+            }
+            my @vals = ReadFPXValue($exifTool, $dataPt, $valPos, $type, $dirEnd, undef, $codePage);
+            @vals or $exifTool->Warn('Error reading property value');
+            $val = @vals > 1 ? \@vals : $vals[0];
+            my $format = $type & 0x0fff;
+            my $flags = $type & 0xf000;
+            my $formStr = $oleFormat{$format} || "Type $format";
+            $formStr .= '|' . ($oleFlags{$flags} || sprintf("0x%x",$flags)) if $flags;
+            my $tagInfo;
+            # check for common tag ID's: Dictionary, CodePage and LocaleIndicator
+            # (must be done before masking because masked tags may overlap these ID's)
+            if (not $custom and ($tag == 1 or $tag == 0x80000000)) {
+                # get tagInfo from SummaryInfo table
+                my $summaryTable = GetTagTable('Image::ExifTool::FlashPix::SummaryInfo');
+                $tagInfo = $exifTool->GetTagInfo($summaryTable, $tag);
+                if ($tag == 1) {
+                    $val += 0x10000 if $val < 0; # (may be incorrectly stored as int16s)
+                    $codePage = $val;            # save code page for translating values
+                }
+            } elsif ($$tagTablePtr{$tag}) {
+                $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+            } elsif ($$tagTablePtr{VARS} and not $custom) {
+                # mask off insignificant bits of tag ID if necessary
+                my $masked = $$tagTablePtr{VARS};
+                my $mask;
+                foreach $mask (keys %$masked) {
+                    if ($masked->{$mask}->{$tag & $mask}) {
+                        $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag & $mask);
+                        last;
+                    }
+                }
+            }
+            $exifTool->HandleTag($tagTablePtr, $tag, $val,
+                DataPt  => $dataPt,
+                Start   => $valStart,
+                Size    => $valPos - $valStart,
+                Format  => $formStr,
+                Index   => $index,
+                TagInfo => $tagInfo,
+                Extra   => ", type=$type",
+            );
+        }
+        # issue warning if we hit end of property section prematurely
+        $exifTool->Warn('Truncated property data') if $index < $numEntries;
+        last unless $$dirInfo{Multi};
+        $pos += $size;
+    }
+
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Load chain of sectors from file
+# Inputs: 0) RAF ref, 1) first sector number, 2) FAT ref, 3) sector size, 4) header size
+sub LoadChain($$$$$)
+{
+    my ($raf, $sect, $fatPt, $sectSize, $hdrSize) = @_;
+    return undef unless $raf;
+    my $chain = '';
+    my ($buff, %loadedSect);
+    for (;;) {
+        last if $sect >= END_OF_CHAIN;
+        return undef if $loadedSect{$sect}; # avoid infinite loop
+        $loadedSect{$sect} = 1;
+        my $offset = $sect * $sectSize + $hdrSize;
+        return undef unless ($offset <= 0x7fffffff or $$raf{LargeFileSupport}) and
+                            $raf->Seek($offset, 0) and
+                            $raf->Read($buff, $sectSize) == $sectSize;
+        $chain .= $buff;
+        # step to next sector in chain
+        return undef if $sect * 4 > length($$fatPt) - 4;
+        $sect = Get32u($fatPt, $sect * 4);
+    }
+    return $chain;
+}
+
+#------------------------------------------------------------------------------
+# Extract information from a JPEG APP2 FPXR segment
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessFPXR($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dirStart = $$dirInfo{DirStart};
+    my $dirLen = $$dirInfo{DirLen};
+    my $verbose = $exifTool->Options('Verbose');
+
+    if ($dirLen < 13) {
+        $exifTool->Warn('FPXR segment to small');
+        return 0;
+    }
+
+    # get version and segment type (version is 0 in all my samples)
+    my ($vers, $type) = unpack('x5C2', $$dataPt);
+
+    if ($type == 1) {   # a "Contents List" segment
+
+        $vers != 0 and $exifTool->Warn("Untested FPXR version $vers");
+        if ($$exifTool{FPXR}) {
+            $exifTool->Warn('Multiple FPXR contents lists');
+            delete $$exifTool{FPXR};
+        }
+        my $numEntries = unpack('x7n', $$dataPt);
+        my @contents;
+        $verbose and $exifTool->VerboseDir('Contents List', $numEntries);
+        my $pos = 9;
+        my $entry;
+        for ($entry = 0; $entry < $numEntries; ++$entry) {
+            if ($pos + 4 > $dirLen) {
+                $exifTool->Warn('Truncated FPXR contents');
+                return 0;
+            }
+            my ($size, $default) = unpack("x${pos}Na", $$dataPt);
+            pos($$dataPt) = $pos + 5;
+            # according to the spec, this string is little-endian
+            # (very odd, since the size word is big-endian),
+            # and the first char must be '/'
+            unless ($$dataPt =~ m{\G(/\0(..)*?)\0\0}sg) {
+                $exifTool->Warn('Invalid FPXR stream name');
+                return 0;
+            }
+            # convert stream pathname to ascii
+            my $name = Image::ExifTool::Decode(undef, $1, 'UCS2', 'II', 'Latin');
+            if ($verbose) {
+                my $psize = ($size == 0xffffffff) ? 'storage' : "$size bytes";
+                $exifTool->VPrint(0,"  |  $entry) Name: '$name' [$psize]\n");
+            }
+            # remove directory specification
+            $name =~ s{.*/}{}s;
+            # read storage class ID if necessary
+            my $classID;
+            if ($size == 0xffffffff) {
+                unless ($$dataPt =~ m{(.{16})}sg) {
+                    $exifTool->Warn('Truncated FPXR storage class ID');
+                    return 0;
+                }
+                # unpack class ID in case we want to use it sometime
+                $classID = Image::ExifTool::ASF::GetGUID($1);
+            }
+            # update position in list
+            $pos = pos($$dataPt);
+            # add to our contents list
+            push @contents, {
+                Name => $name,
+                Size => $size,
+                Default => $default,
+                ClassID => $classID,
+            };
+        }
+        # save contents list as $exifTool member variable
+        # (must do this last so we don't save list on error)
+        $$exifTool{FPXR} = \@contents;
+
+    } elsif ($type == 2) {  # a "Stream Data" segment
+
+        # get the contents list index and stream data offset
+        my ($index, $offset) = unpack('x7nN', $$dataPt);
+        my $fpxr = $$exifTool{FPXR};
+        if ($fpxr and $$fpxr[$index]) {
+            my $obj = $$fpxr[$index];
+            # extract stream data (after 13-byte header)
+            if (not defined $$obj{Stream}) {
+                # ignore offset for first segment of this type
+                # (in my sample images, this isn't always zero as one would expect)
+                $$obj{Stream} = substr($$dataPt, $dirStart+13);
+            } else {
+                # add data to the stream at the proper offset
+                my $pad = $offset - length($$obj{Stream});
+                if ($pad >= 0) {
+                    if ($pad) {
+                        if ($pad > 0x10000) {
+                            $exifTool->Warn("Bad FPXR stream offset ($offset)");
+                        } else {
+                            # pad with default value to specified offset
+                            $exifTool->Warn("Padding FPXR stream with $pad default bytes",1);
+                            $$obj{Stream} .= ($$obj{Default} x $pad);
+                        }
+                    }
+                    # concatenate data with this stream
+                    $$obj{Stream} .= substr($$dataPt, $dirStart+13);
+                } else {
+                    $exifTool->Warn("Duplicate FPXR stream data at offset $offset");
+                    substr($$obj{Stream}, $offset, -$pad) = substr($$dataPt, $dirStart+13);
+                }
+            }
+            # save value for this tag if stream is complete
+            my $len = length $$obj{Stream};
+            if ($len >= $$obj{Size}) {
+                if ($verbose) {
+                    $exifTool->VPrint(0, "  + [FPXR stream, Contents index $index, $len bytes]\n");
+                }
+                if ($len > $$obj{Size}) {
+                    $exifTool->Warn('Extra data in FPXR segment (truncated)');
+                    $$obj{Stream} = substr($$obj{Stream}, 0, $$obj{Size});
+                }
+                my $tag = $$obj{Name};
+                my $tagInfo;
+                unless ($$tagTablePtr{$tag}) {
+                    # remove instance number or class ID from tag if necessary
+                    $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $1) if
+                        ($tag =~ /(.*) \d{6}$/s and $$tagTablePtr{$1}) or
+                        ($tag =~ /(.*)_[0-9a-f]{16}$/s and $$tagTablePtr{$1});
+                }
+                # save the data for this tag
+                $exifTool->HandleTag($tagTablePtr, $tag, $$obj{Stream},
+                    DataPt => \$$obj{Stream},
+                    TagInfo => $tagInfo,
+                );
+                delete $$obj{Stream}; # done with this stream
+            }
+        # hack for improperly stored FujiFilm PreviewImage (stored with no contents list)
+        } elsif ($index == 512 and $dirLen > 60 and ($$exifTool{FujiPreview} or
+            ($dirLen > 64 and substr($$dataPt, $dirStart+60, 4) eq "\xff\xd8\xff\xdb")))
+        {
+            # recombine PreviewImage, skipping unknown 60 byte header
+            if ($$exifTool{FujiPreview}) {
+                $$exifTool{FujiPreview} .= substr($$dataPt, $dirStart+60);
+            } else {
+                $$exifTool{FujiPreview} = substr($$dataPt, $dirStart+60);
+            }
+        } else {
+            # (Kodak uses index 255 for a free segment in images from some cameras)
+            $exifTool->Warn("Unlisted FPXR segment (index $index)") if $index != 255;
+        }
+
+    } elsif ($type ne 3) {  # not a "Reserved" segment
+
+        $exifTool->Warn("Unknown FPXR segment (type $type)");
+
+    }
+
+    # clean up if this was the last FPXR segment
+    if ($$dirInfo{LastFPXR}) {
+        if ($$exifTool{FPXR}) {
+            my $obj;
+            my $i = 0;
+            foreach $obj (@{$$exifTool{FPXR}}) {
+                $exifTool->Warn("Missing stream for FPXR object $i") if defined $$obj{Stream};
+                ++$i;
+            }
+            delete $$exifTool{FPXR};    # delete our temporary variables
+        }
+        if ($$exifTool{FujiPreview}) {
+            $exifTool->FoundTag('PreviewImage', $$exifTool{FujiPreview});
+            delete $$exifTool{FujiPreview};
+        }
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Set document number for objects
+# Inputs: 0) object hierarchy hash ref, 1) object index, 2) doc number list ref,
+#         3) doc numbers used at each level, 4) flag set for metadata levels
+sub SetDocNum($$;$$$)
+{
+    my ($hier, $index, $doc, $used, $meta) = @_;
+    my $obj = $$hier{$index} or return;
+    return if exists $$obj{DocNum};
+    $$obj{DocNum} = $doc;
+    SetDocNum($hier, $$obj{Left}, $doc, $used, $meta) if $$obj{Left};
+    SetDocNum($hier, $$obj{Right}, $doc, $used, $meta) if $$obj{Right};
+    if (defined $$obj{Child}) {
+        $used or $used = [ ];
+        my @subDoc;
+        push @subDoc, @$doc if $doc;
+        # we must dive down 2 levels for each sub-document, so use the
+        # $meta flag to add a sub-document level only for every 2nd generation
+        if ($meta) {
+            my $subNum = ($$used[scalar @subDoc] || 0);
+            $$used[scalar @subDoc] = $subNum;
+            push @subDoc, $subNum;
+        } elsif (@subDoc) {
+            $subDoc[-1] = ++$$used[$#subDoc];
+        }
+        SetDocNum($hier, $$obj{Child}, \@subDoc, $used, not $meta) 
+    }
+}
+
+#------------------------------------------------------------------------------
+# Extract information from a FlashPix (FPX) file
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref
+# Returns: 1 on success, 0 if this wasn't a valid FPX-format file
+sub ProcessFPX($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my ($buff, $out, %dumpParms, $oldIndent, $miniStreamBuff);
+    my ($tag, %hier, %objIndex);
+
+    # read header
+    return 0 unless $raf->Read($buff,HDR_SIZE) == HDR_SIZE;
+    # check signature
+    return 0 unless $buff =~ /^\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1/;
+
+    # set FileType initially based on file extension (we may override this later)
+    my $fileType = $exifTool->{FILE_EXT};
+    $fileType = 'FPX' unless $fileType and $fpxFileType{$fileType};
+    $exifTool->SetFileType($fileType);
+    SetByteOrder(substr($buff, 0x1c, 2) eq "\xff\xfe" ? 'MM' : 'II');
+    my $tagTablePtr = GetTagTable('Image::ExifTool::FlashPix::Main');
+    my $verbose = $exifTool->Options('Verbose');
+    # copy LargeFileSupport option to RAF for use in LoadChain
+    $$raf{LargeFileSupport} = $exifTool->Options('LargeFileSupport');
+
+    my $sectSize = 1 << Get16u(\$buff, 0x1e);
+    my $miniSize = 1 << Get16u(\$buff, 0x20);
+    my $fatCount   = Get32u(\$buff, 0x2c);  # number of FAT sectors
+    my $dirStart   = Get32u(\$buff, 0x30);  # first directory sector
+    my $miniCutoff = Get32u(\$buff, 0x38);  # minimum size for big-FAT streams
+    my $miniStart  = Get32u(\$buff, 0x3c);  # first sector of mini-FAT
+    my $miniCount  = Get32u(\$buff, 0x40);  # number of mini-FAT sectors
+    my $difStart   = Get32u(\$buff, 0x44);  # first sector of DIF chain
+    my $difCount   = Get32u(\$buff, 0x48);  # number of DIF sectors
+
+    if ($verbose) {
+        $out = $exifTool->Options('TextOut');
+        $dumpParms{Out} = $out;
+        $dumpParms{MaxLen} = 96 if $verbose == 3;
+        print $out "  Sector size=$sectSize\n  FAT: Count=$fatCount\n";
+        print $out "  DIR: Start=$dirStart\n";
+        print $out "  MiniFAT: Mini-sector size=$miniSize Start=$miniStart Count=$miniCount Cutoff=$miniCutoff\n";
+        print $out "  DIF FAT: Start=$difStart Count=$difCount\n";
+    }
+#
+# load the FAT
+#
+    my $pos = 0x4c;
+    my $endPos = length($buff);
+    my $fat = '';
+    my $fatCountCheck = 0;
+    for (;;) {
+        while ($pos <= $endPos - 4) {
+            my $sect = Get32u(\$buff, $pos);
+            $pos += 4;
+            next if $sect == FREE_SECT;
+            my $offset = $sect * $sectSize + HDR_SIZE;
+            my $fatSect;
+            unless ($raf->Seek($offset, 0) and
+                    $raf->Read($fatSect, $sectSize) == $sectSize)
+            {
+                $exifTool->Error("Error reading FAT from sector $sect");
+                return 1;
+            }
+            $fat .= $fatSect;
+            ++$fatCountCheck;
+        }
+        last if $difStart >= END_OF_CHAIN;
+        # read next DIF (Dual Indirect FAT) sector
+        my $offset = $difStart * $sectSize + HDR_SIZE;
+        unless ($raf->Seek($offset, 0) and $raf->Read($buff, $sectSize) == $sectSize) {
+            $exifTool->Error("Error reading DIF sector $difStart");
+            return 1;
+        }
+        # set end of sector information in this DIF
+        $pos = 0;
+        $endPos = $sectSize - 4;
+        # next time around we want to read next DIF in chain
+        $difStart = Get32u(\$buff, $endPos);
+    }
+    if ($fatCountCheck != $fatCount) {
+        $exifTool->Warn("Bad number of FAT sectors (expected $fatCount but found $fatCountCheck)");
+    }
+#
+# load the mini-FAT and the directory
+#
+    my $miniFat = LoadChain($raf, $miniStart, \$fat, $sectSize, HDR_SIZE);
+    my $dir = LoadChain($raf, $dirStart, \$fat, $sectSize, HDR_SIZE);
+    unless (defined $miniFat and defined $dir) {
+        $exifTool->Error('Error reading mini-FAT or directory stream');
+        return 1;
+    }
+    if ($verbose) {
+        print $out "  FAT [",length($fat)," bytes]:\n";
+        Image::ExifTool::HexDump(\$fat, undef, %dumpParms) if $verbose > 2;
+        print $out "  Mini-FAT [",length($miniFat)," bytes]:\n";
+        Image::ExifTool::HexDump(\$miniFat, undef, %dumpParms) if $verbose > 2;
+        print $out "  Directory [",length($dir)," bytes]:\n";
+        Image::ExifTool::HexDump(\$dir, undef, %dumpParms) if $verbose > 2;
+    }
+#
+# process the directory
+#
+    if ($verbose) {
+        $oldIndent = $exifTool->{INDENT};
+        $exifTool->{INDENT} .= '| ';
+        $exifTool->VerboseDir('FPX', undef, length $dir);
+    }
+    my $miniStream;
+    $endPos = length($dir);
+    my $index = 0;
+
+    for ($pos=0; $pos<=$endPos-128; $pos+=128, ++$index) {
+
+        # get directory entry type
+        # (0=invalid, 1=storage, 2=stream, 3=lockbytes, 4=property, 5=root)
+        my $type = Get8u(\$dir, $pos + 0x42);
+        next if $type == 0; # skip invalid entries
+        if ($type > 5) {
+            $exifTool->Warn("Invalid directory entry type $type");
+            last;   # rest of directory is probably garbage
+        }
+        # get entry name (note: this is supposed to be length in 2-byte
+        # characters but this isn't what is done in my sample FPX file, so
+        # be very tolerant of this count -- it's null terminated anyway)
+        my $len = Get16u(\$dir, $pos + 0x40);
+        $len > 32 and $len = 32;
+        $tag = Image::ExifTool::Decode(undef, substr($dir,$pos,$len*2), 'UCS2', 'II', 'Latin');
+        $tag =~ s/\0.*//s;  # truncate at null (in case length was wrong)
+
+        my $sect = Get32u(\$dir, $pos + 0x74);  # start sector number
+        my $size = Get32u(\$dir, $pos + 0x78);  # stream length
+
+        # load Ministream (referenced from first directory entry)
+        unless ($miniStream) {
+            $miniStreamBuff = LoadChain($raf, $sect, \$fat, $sectSize, HDR_SIZE);
+            unless (defined $miniStreamBuff) {
+                $exifTool->Warn('Error loading Mini-FAT stream');
+                last;
+            }
+            $miniStream = new File::RandomAccess(\$miniStreamBuff);
+        }
+
+        my $tagInfo;
+        if ($$tagTablePtr{$tag}) {
+            $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        } else {
+            # remove instance number or class ID from tag if necessary
+            $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $1) if
+                ($tag =~ /(.*) \d{6}$/s and $$tagTablePtr{$1}) or
+                ($tag =~ /(.*)_[0-9a-f]{16}$/s and $$tagTablePtr{$1});
+        }
+
+        my $lSib = Get32u(\$dir, $pos + 0x44);  # left sibling
+        my $rSib = Get32u(\$dir, $pos + 0x48);  # right sibling
+        my $chld = Get32u(\$dir, $pos + 0x4c);  # child directory
+
+        # save information about object hierachy
+        my ($obj, $sub);
+        $obj = $hier{$index} or $obj = $hier{$index} = { };
+        $$obj{Left} = $lSib unless $lSib == FREE_SECT;
+        $$obj{Right} = $rSib unless $rSib == FREE_SECT;
+        unless ($chld == FREE_SECT) {
+            $$obj{Child} = $chld;
+            $sub = $hier{$chld} or $sub = $hier{$chld} = { };
+            $$sub{Parent} = $index;
+        }
+
+        next unless $tagInfo or $verbose;
+
+        # load the data for stream types
+        my $extra = '';
+        my $typeStr = $dirEntryType[$type] || $type;
+        if ($typeStr eq 'STREAM') {
+            if ($size >= $miniCutoff) {
+                # stream is in the main FAT
+                $buff = LoadChain($raf, $sect, \$fat, $sectSize, HDR_SIZE);
+            } elsif ($size) {
+                # stream is in the mini-FAT
+                $buff = LoadChain($miniStream, $sect, \$miniFat, $miniSize, 0);
+            } else {
+                $buff = ''; # an empty stream
+            }
+            unless (defined $buff) {
+                my $name = $tagInfo ? $$tagInfo{Name} : 'unknown';
+                $exifTool->Warn("Error reading $name stream");
+                $buff = '';
+            }
+        } elsif ($typeStr eq 'ROOT') {
+            $buff = $miniStreamBuff;
+            $extra .= ' (Ministream)';
+        } else {
+            $buff = '';
+            undef $size;
+        }
+        if ($verbose) {
+            my $flags = Get8u(\$dir, $pos + 0x43);  # 0=red, 1=black
+            my $col = { 0 => 'Red', 1 => 'Black' }->{$flags} || $flags;
+            $extra .= " Type=$typeStr Flags=$col";
+            $extra .= " Left=$lSib" unless $lSib == FREE_SECT;
+            $extra .= " Right=$rSib" unless $rSib == FREE_SECT;
+            $extra .= " Child=$chld" unless $chld == FREE_SECT;
+            $exifTool->VerboseInfo($tag, $tagInfo,
+                Index  => $index,
+                Value  => $buff,
+                DataPt => \$buff,
+                Extra  => $extra,
+                Size   => $size,
+            );
+        }
+        if ($tagInfo and $buff) {
+            my $num = $$exifTool{NUM_FOUND};
+            my $subdir = $$tagInfo{SubDirectory};
+            if ($subdir) {
+                my %dirInfo = (
+                    DataPt   => \$buff,
+                    DirStart => $$subdir{DirStart},
+                    DirLen   => length $buff,
+                    Multi    => $$tagInfo{Multi},
+                );
+                my $subTablePtr = GetTagTable($$subdir{TagTable});
+                $exifTool->ProcessDirectory(\%dirInfo, $subTablePtr,  $$subdir{ProcessProc});
+            } else {
+                $exifTool->FoundTag($tagInfo, $buff);
+            }
+            # save object index number for all found tags
+            my $num2 = $$exifTool{NUM_FOUND};
+            $objIndex{++$num} = $index while $num < $num2;
+        }
+    }
+    # set document numbers for tags extracted from embedded documents
+    unless ($$exifTool{DOC_NUM}) {
+        # initialize document number for all objects, beginning at root (index 0)
+        SetDocNum(\%hier, 0);
+        # set family 3 group name for all tags in embedded documents
+        my $order = $$exifTool{FILE_ORDER};
+        my (@pri, $copy, $member);
+        foreach $tag (keys %$order) {
+            my $num = $$order{$tag};
+            next unless defined $num and $objIndex{$num};
+            my $obj = $hier{$objIndex{$num}} or next;
+            my $docNums = $$obj{DocNum};
+            next unless $docNums and @$docNums;
+            $$exifTool{TAG_EXTRA}{$tag}{G3} = join '-', @$docNums;
+            push @pri, $tag unless $tag =~ / /; # save keys for priority sub-doc tags
+        }
+        # swap priority sub-document tags with main document tags if they exist
+        foreach $tag (@pri) {
+            for ($copy=1; ;++$copy) {
+                my $key = "$tag ($copy)";
+                last unless defined $$exifTool{VALUE}{$key};
+                my $extra = $$exifTool{TAG_EXTRA}{$key};
+                next if $extra and $$extra{G3}; # not Main if family 3 group is set
+                foreach $member ('PRIORITY','VALUE','FILE_ORDER','TAG_INFO','TAG_EXTRA') {
+                    my $pHash = $$exifTool{$member};
+                    my $t = $$pHash{$tag};
+                    $$pHash{$tag} = $$pHash{$key};
+                    $$pHash{$key} = $t;
+                }
+                last;
+            }
+        }
+    }
+    $exifTool->{INDENT} = $oldIndent if $verbose;
+    # try to better identify the file type
+    if ($$exifTool{VALUE}{FileType} eq 'FPX') {
+        my $val = $$exifTool{CompObjUserType} || $$exifTool{Software};
+        if ($val) {
+            my %type = ( Word => 'DOC', PowerPoint => 'PPT', Excel => 'XLS' );
+            my $pat;
+            foreach $pat (sort keys %type) {
+                next unless $val =~ /$pat/;
+                $exifTool->OverrideFileType($type{$pat});
+                last;
+            }
+        }
+    }
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::FlashPix - Read FlashPix meta information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains routines required by Image::ExifTool to extract
+FlashPix meta information from FPX images, and from the APP2 FPXR segment of
+JPEG images.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.exif.org/Exif2-2.PDF>
+
+=item L<http://www.graphcomp.com/info/specs/livepicture/fpx.pdf>
+
+=item L<http://search.cpan.org/~jdb/libwin32/>
+
+=item L<http://msdn.microsoft.com/en-us/library/aa380374.aspx>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/FlashPix Tags>,
+L<Image::ExifTool::TagNames/OOXML Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Font.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Font.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Font.pm	(revision 24799)
@@ -0,0 +1,643 @@
+#------------------------------------------------------------------------------
+# File:         Font.pm
+#
+# Description:  Read meta information from font files
+#
+# Revisions:    2010/01/15 - P. Harvey Created
+#
+# References:   1) http://developer.apple.com/textfonts/TTRefMan/RM06/Chap6.html
+#               2) http://www.microsoft.com/typography/otspec/otff.htm
+#               3) http://partners.adobe.com/public/developer/opentype/index_font_file.html
+#               4) http://partners.adobe.com/public/developer/en/font/5178.PFM.pdf
+#               5) http://opensource.adobe.com/svn/opensource/flex/sdk/trunk/modules/compiler/src/java/flex2/compiler/util/MimeMappings.java
+#               6) http://www.adobe.com/devnet/font/pdfs/5004.AFM_Spec.pdf
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Font;
+
+use strict;
+use vars qw($VERSION %ttLang);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.05';
+
+sub ProcessOTF($$);
+
+# TrueType 'name' platform codes
+my %ttPlatform = (
+    0 => 'Unicode',
+    1 => 'Macintosh',
+    2 => 'ISO',
+    3 => 'Windows',
+    4 => 'Custom',
+);
+
+# convert TrueType 'name' character encoding to ExifTool Charset (ref 1/2)
+my %ttCharset = (
+  Macintosh => {
+    0 => 'MacRoman',      17 => 'MacMalayalam',
+    1 => 'MacJapanese',   18 => 'MacSinhalese',
+    2 => 'MacChineseTW',  19 => 'MacBurmese',
+    3 => 'MacKorean',     20 => 'MacKhmer',
+    4 => 'MacArabic',     21 => 'MacThai',
+    5 => 'MacHebrew',     22 => 'MacLaotian',
+    6 => 'MacGreek',      23 => 'MacGeorgian',
+    7 => 'MacCyrillic',   24 => 'MacArmenian', # 7=Russian
+    8 => 'MacRSymbol',    25 => 'MacChineseCN',
+    9 => 'MacDevanagari', 26 => 'MacTibetan',
+   10 => 'MacGurmukhi',   27 => 'MacMongolian',
+   11 => 'MacGujarati',   28 => 'MacGeez',
+   12 => 'MacOriya',      29 => 'MacCyrillic', # 29=Slavic
+   13 => 'MacBengali',    30 => 'MacVietnam',
+   14 => 'MacTamil',      31 => 'MacSindhi',
+   15 => 'MacTelugu',     32 => '', # 32=uninterpreted
+   16 => 'MacKannada',
+  },
+  Windows => {
+    0 => 'Symbol',         4 => 'Big5',
+    1 => 'UCS2',           5 => 'Wansung',
+    2 => 'ShiftJIS',       6 => 'Johab',
+    3 => 'PRC',           10 => 'UCS4',
+  },
+  Unicode => {
+    # (we don't currently handle the various Unicode flavours)
+    0 => 'UCS2', # Unicode 1.0 semantics
+    1 => 'UCS2', # Unicode 1.1 semantics
+    2 => 'UCS2', # ISO 10646 semantics
+    3 => 'UCS2', # Unicode 2.0 and onwards semantics, Unicode BMP only.
+    4 => 'UCS2', # Unicode 2.0 and onwards semantics, Unicode full repertoire.
+    # 5 => Unicode Variation Sequences (not used in Naming table)
+  },
+  ISO => { # (deprecated)
+    0 => 'UTF8',  # (7-bit ASCII)
+    1 => 'UCS2',  # ISO 10646
+    2 => 'Latin', # ISO 8859-1
+  },
+  Custom => { },
+);
+
+# convert TrueType 'name' language code to ExifTool language code
+%ttLang = (
+  # Macintosh language codes (also used by QuickTime.pm)
+  # oddities:
+  #   49 - Cyrllic version    83 - Roman
+  #   50 - Arabic version     84 - Arabic
+  #  146 - with dot above
+  Macintosh => {
+    0 => 'en',     24 => 'lt',    48 => 'kk',    72 => 'ml',    129 => 'eu',
+    1 => 'fr',     25 => 'pl',    49 => 'az',    73 => 'kn',    130 => 'ca',
+    2 => 'de',     26 => 'hu',    50 => 'az',    74 => 'ta',    131 => 'la',
+    3 => 'it',     27 => 'et',    51 => 'hy',    75 => 'te',    132 => 'qu',
+    4 => 'nl',     28 => 'lv',    52 => 'ka',    76 => 'si',    133 => 'gn',
+    5 => 'sv',     29 => 'smi',   53 => 'ro',    77 => 'my',    134 => 'ay',
+    6 => 'es',     30 => 'fo',    54 => 'ky',    78 => 'km',    135 => 'tt',
+    7 => 'da',     31 => 'fa',    55 => 'tg',    79 => 'lo',    136 => 'ug',
+    8 => 'pt',     32 => 'ru',    56 => 'tk',    80 => 'vi',    137 => 'dz',
+    9 => 'no',     33 => 'zh-CN', 57 => 'mn-MN', 81 => 'id',    138 => 'jv',
+    10 => 'he',    34 => 'nl',    58 => 'mn-CN', 82 => 'tl',    139 => 'su',
+    11 => 'ja',    35 => 'ga',    59 => 'ps',    83 => 'ms-MY', 140 => 'gl',
+    12 => 'ar',    36 => 'sq',    60 => 'ku',    84 => 'ms-BN', 141 => 'af',
+    13 => 'fi',    37 => 'ro',    61 => 'ks',    85 => 'am',    142 => 'br',
+    14 => 'iu',    38 => 'cs',    62 => 'sd',    86 => 'ti',    144 => 'gd',
+    15 => 'is',    39 => 'sk',    63 => 'bo',    87 => 'om',    145 => 'vg',
+    16 => 'mt',    40 => 'sl',    64 => 'ne',    88 => 'so',    146 => 'ga',
+    17 => 'tr',    41 => 'yi',    65 => 'sa',    89 => 'sw',    147 => 'rar',
+    18 => 'hr',    42 => 'sr',    66 => 'mr',    90 => 'rw',    148 => 'el',
+    19 => 'zh-TW', 43 => 'mk',    67 => 'bn',    91 => 'rn',    149 => 'kl',
+    20 => 'ur',    44 => 'bg',    68 => 'as',    92 => 'ny',    150 => 'az',
+    21 => 'hi',    45 => 'uk',    69 => 'gu',    93 => 'mg',
+    22 => 'th',    46 => 'be',    70 => 'pa',    94 => 'eo',
+    23 => 'ko',    47 => 'uz',    71 => 'or',   128 => 'cy',
+  },
+  # Windows language codes (http://msdn.microsoft.com/en-us/library/0h88fahh(VS.85).aspx)
+  # Notes: This isn't an exact science.  The reference above gives language codes
+  # which are different from some ISO 639-1 numbers.  Also, some Windows language
+  # codes don't appear to have ISO 639-1 equivalents.
+  #  0x0428 - fa by ref above
+  #  0x048c - no ISO equivalent
+  #  0x081a/0x83c - sr-SP
+  #  0x0c0a - modern?
+  #  0x2409 - Carribean country code not found in ISO 3166-1
+  Windows => {
+    0x0401 => 'ar-SA', 0x0438 => 'fo',    0x0481 => 'mi',    0x1409 => 'en-NZ',
+    0x0402 => 'bg',    0x0439 => 'hi',    0x0482 => 'oc',    0x140a => 'es-CR',
+    0x0403 => 'ca',    0x043a => 'mt',    0x0483 => 'co',    0x140c => 'fr-LU',
+    0x0404 => 'zh-TW', 0x043b => 'se-NO', 0x0484 => 'gsw',   0x141a => 'bs-BA',
+    0x0405 => 'cs',    0x043c => 'gd',    0x0485 => 'sah',   0x143b => 'smj-SE',
+    0x0406 => 'da',    0x043d => 'yi',    0x0486 => 'ny',    0x1801 => 'ar-MA',
+    0x0407 => 'de-DE', 0x043e => 'ms-MY', 0x0487 => 'rw',    0x1809 => 'en-IE',
+    0x0408 => 'el',    0x043f => 'kk',    0x048c => 'Dari',  0x180a => 'es-PA',
+    0x0409 => 'en-US', 0x0440 => 'ky',    0x0801 => 'ar-IQ', 0x180c => 'fr-MC',
+    0x040a => 'es-ES', 0x0441 => 'sw',    0x0804 => 'zh-CN', 0x181a => 'sr-BA',
+    0x040b => 'fi',    0x0442 => 'tk',    0x0807 => 'de-CH', 0x183b => 'sma-NO',
+    0x040c => 'fr-FR', 0x0443 => 'uz-UZ', 0x0809 => 'en-GB', 0x1c01 => 'ar-TN',
+    0x040d => 'he',    0x0444 => 'tt',    0x080a => 'es-MX', 0x1c09 => 'en-ZA',
+    0x040e => 'hu',    0x0445 => 'bn-IN', 0x080c => 'fr-BE', 0x1c0a => 'es-DO',
+    0x040f => 'is',    0x0446 => 'pa',    0x0810 => 'it-CH', 0x1c1a => 'sr-BA',
+    0x0410 => 'it-IT', 0x0447 => 'gu',    0x0813 => 'nl-BE', 0x1c3b => 'sma-SE',
+    0x0411 => 'ja',    0x0448 => 'wo',    0x0814 => 'nn',    0x2001 => 'ar-OM',
+    0x0412 => 'ko',    0x0449 => 'ta',    0x0816 => 'pt-PT', 0x2009 => 'en-JM',
+    0x0413 => 'nl-NL', 0x044a => 'te',    0x0818 => 'ro-MO', 0x200a => 'es-VE',
+    0x0414 => 'no-NO', 0x044b => 'kn',    0x0819 => 'ru-MO', 0x201a => 'bs-BA',
+    0x0415 => 'pl',    0x044c => 'ml',    0x081a => 'sr-RS', 0x203b => 'sms',
+    0x0416 => 'pt-BR', 0x044d => 'as',    0x081d => 'sv-FI', 0x2401 => 'ar-YE',
+    0x0417 => 'rm',    0x044e => 'mr',    0x082c => 'az-AZ', 0x2409 => 'en-CB',
+    0x0418 => 'ro',    0x044f => 'sa',    0x082e => 'dsb',   0x240a => 'es-CO',
+    0x0419 => 'ru',    0x0450 => 'mn-MN', 0x083b => 'se-SE', 0x243b => 'smn',
+    0x041a => 'hr',    0x0451 => 'bo',    0x083c => 'ga',    0x2801 => 'ar-SY',
+    0x041b => 'sk',    0x0452 => 'cy',    0x083e => 'ms-BN', 0x2809 => 'en-BZ',
+    0x041c => 'sq',    0x0453 => 'km',    0x0843 => 'uz-UZ', 0x280a => 'es-PE',
+    0x041d => 'sv-SE', 0x0454 => 'lo',    0x0845 => 'bn-BD', 0x2c01 => 'ar-JO',
+    0x041e => 'th',    0x0456 => 'gl',    0x0850 => 'mn-CN', 0x2c09 => 'en-TT',
+    0x041f => 'tr',    0x0457 => 'kok',   0x085d => 'iu-CA', 0x2c0a => 'es-AR',
+    0x0420 => 'ur',    0x045a => 'syr',   0x085f => 'tmh',   0x3001 => 'ar-LB',
+    0x0421 => 'id',    0x045b => 'si',    0x086b => 'qu-EC', 0x3009 => 'en-ZW',
+    0x0422 => 'uk',    0x045d => 'iu-CA', 0x0c01 => 'ar-EG', 0x300a => 'es-EC',
+    0x0423 => 'be',    0x045e => 'am',    0x0c04 => 'zh-HK', 0x3401 => 'ar-KW',
+    0x0424 => 'sl',    0x0461 => 'ne',    0x0c07 => 'de-AT', 0x3409 => 'en-PH',
+    0x0425 => 'et',    0x0462 => 'fy',    0x0c09 => 'en-AU', 0x340a => 'es-CL',
+    0x0426 => 'lv',    0x0463 => 'ps',    0x0c0a => 'es-ES', 0x3801 => 'ar-AE',
+    0x0427 => 'lt',    0x0464 => 'fil',   0x0c0c => 'fr-CA', 0x380a => 'es-UY',
+    0x0428 => 'tg',    0x0465 => 'dv',    0x0c1a => 'sr-RS', 0x3c01 => 'ar-BH',
+    0x042a => 'vi',    0x0468 => 'ha',    0x0c3b => 'se-FI', 0x3c0a => 'es-PY',
+    0x042b => 'hy',    0x046a => 'yo',    0x0c6b => 'qu-PE', 0x4001 => 'ar-QA',
+    0x042c => 'az-AZ', 0x046b => 'qu-BO', 0x1001 => 'ar-LY', 0x4009 => 'en-IN',
+    0x042d => 'eu',    0x046c => 'st',    0x1004 => 'zh-SG', 0x400a => 'es-BO',
+    0x042e => 'hsb',   0x046d => 'ba',    0x1007 => 'de-LU', 0x4409 => 'en-MY',
+    0x042f => 'mk',    0x046e => 'lb',    0x1009 => 'en-CA', 0x440a => 'es-SV',
+    0x0430 => 'st',    0x046f => 'kl',    0x100a => 'es-GT', 0x4809 => 'en-SG',
+    0x0431 => 'ts',    0x0470 => 'ig',    0x100c => 'fr-CH', 0x480a => 'es-HN',
+    0x0432 => 'tn',    0x0478 => 'yi',    0x101a => 'hr-BA', 0x4c0a => 'es-NI',
+    0x0434 => 'xh',    0x047a => 'arn',   0x103b => 'smj-NO',0x500a => 'es-PR',
+    0x0435 => 'zu',    0x047c => 'moh',   0x1401 => 'ar-DZ', 0x540a => 'es-US',
+    0x0436 => 'af',    0x047e => 'br',    0x1404 => 'zh-MO',
+    0x0437 => 'ka',    0x0480 => 'ug',    0x1407 => 'de-LI',
+  },
+  Unicode => { },
+  ISO     => { },
+  Custom  => { },
+);
+
+# eclectic table of tags for various format font files
+%Image::ExifTool::Font::Main = (
+    GROUPS => { 2 => 'Document' },
+    NOTES => q{
+        This table contains a collection of tags found in font files of various
+        formats.  ExifTool current recognizes OTF, TTF, TTC, DFONT, PFA, PFB, PFM,
+        AFM, ACFM and AMFM font files.
+    },
+    name => {
+        SubDirectory => { TagTable => 'Image::ExifTool::Font::Name' },
+    },
+    PFM  => {
+        Name => 'PFMHeader',
+        SubDirectory => { TagTable => 'Image::ExifTool::Font::PFM' },
+    },
+    PSInfo => {
+        Name => 'PSFontInfo',
+        SubDirectory => { TagTable => 'Image::ExifTool::Font::PSInfo' },
+    },
+    AFM => {
+        Name => 'AFM',
+        SubDirectory => { TagTable => 'Image::ExifTool::Font::AFM' },
+    },
+    numfonts => 'NumFonts',
+    fontname => 'FontName',
+    postfont => {
+        Name => 'PostScriptFontName',
+        Description => 'PostScript Font Name',
+    },
+);
+
+# TrueType name tags (ref 1/2)
+%Image::ExifTool::Font::Name = (
+    GROUPS => { 2 => 'Document' },
+    NOTES => q{
+        The following tags are extracted from the TrueType font "name" table found
+        in OTF, TTF, TTC and DFONT files.  These tags support localized languages by
+        adding a hyphen followed by a language code to the end of the tag name (ie.
+        "Copyright-fr" or "Licence-en-US").  Tags with no language code use the
+        default language of "en".
+    },
+    0 => { Name => 'Copyright', Groups => { 2 => 'Author' } },
+    1 => 'FontFamily',
+    2 => 'FontSubfamily',
+    3 => 'FontSubfamilyID',
+    4 => 'FontName', # full name
+    5 => 'NameTableVersion',
+    6 => { Name => 'PostScriptFontName', Description => 'PostScript Font Name' },
+    7 => 'Trademark',
+    8 => 'Manufacturer',
+    9 => 'Designer',
+    10 => 'Description',
+    11 => 'VendorURL',
+    12 => 'DesignerURL',
+    13 => 'License',
+    14 => 'LicenseInfoURL',
+    16 => 'PreferredFamily',
+    17 => 'PreferredSubfamily',
+    18 => 'CompatibleFontName',
+    19 => 'SampleText',
+    20 => {
+        Name => 'PostScriptFontName',
+        Description => 'PostScript Font Name',
+    },
+    21 => 'WWSFamilyName',
+    22 => 'WWSSubfamilyName',
+);
+
+# PostScript Font Metric file header (ref 4)
+%Image::ExifTool::Font::PFM = (
+    GROUPS => { 2 => 'Document' },
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    NOTES => 'Tags extracted from the PFM file header.',
+    0 => {
+        Name => 'PFMVersion',
+        Format => 'int16u',
+        PrintConv => 'sprintf("%x.%.2x",$val>>8,$val&0xff)',
+    },
+    6  => { Name => 'Copyright',       Format => 'string[60]', Groups => { 2 => 'Author' } },
+    66 => { Name => 'FontType',        Format => 'int16u' },
+    68 => { Name => 'PointSize',       Format => 'int16u' },
+    70 => { Name => 'YResolution',     Format => 'int16u' },
+    72 => { Name => 'XResolution',     Format => 'int16u' },
+    74 => { Name => 'Ascent',          Format => 'int16u' },
+    76 => { Name => 'InternalLeading', Format => 'int16u' },
+    78 => { Name => 'ExternalLeading', Format => 'int16u' },
+    80 => { Name => 'Italic' },
+    81 => { Name => 'Underline' },
+    82 => { Name => 'Strikeout' },
+    83 => { Name => 'Weight',          Format => 'int16u' },
+    85 => { Name => 'CharacterSet' },
+    86 => { Name => 'PixWidth',        Format => 'int16u' },
+    88 => { Name => 'PixHeight',       Format => 'int16u' },
+    90 => { Name => 'PitchAndFamily' },
+    91 => { Name => 'AvgWidth',        Format => 'int16u' },
+    93 => { Name => 'MaxWidth',        Format => 'int16u' },
+    95 => { Name => 'FirstChar' },
+    96 => { Name => 'LastChar' },
+    97 => { Name => 'DefaultChar' },
+    98 => { Name => 'BreakChar' },
+    99 => { Name => 'WidthBytes',      Format => 'int16u' },
+   # 101 => { Name => 'DeviceTypeOffset', Format => 'int32u' },
+   # 105 => { Name => 'FontNameOffset',   Format => 'int32u' },
+   # 109 => { Name => 'BitsPointer',      Format => 'int32u' },
+   # 113 => { Name => 'BitsOffset',       Format => 'int32u' },
+);
+
+# PostScript FontInfo attributes (PFA, PFB) (ref PH)
+%Image::ExifTool::Font::PSInfo = (
+    GROUPS => { 2 => 'Document' },
+    NOTES => 'Tags extracted from PostScript font files (PFA and PFB).',
+    FullName    => { },
+    FamilyName  => { Name => 'FontFamily' },
+    Weight      => { },
+    ItalicAngle => { },
+    isFixedPitch=> { },
+    UnderlinePosition  => { },
+    UnderlineThickness => { },
+    Copyright   => { Groups => { 2 => 'Author' } },
+    Notice      => { Groups => { 2 => 'Author' } },
+    version     => { },
+    FontName    => { },
+    FontType    => { },
+    FSType      => { },
+);
+
+# Adobe Font Metrics tags (AFM) (ref 6)
+%Image::ExifTool::Font::AFM = (
+    GROUPS => { 2 => 'Document' },
+    NOTES => 'Tags extracted from Adobe Font Metrics files (AFM, ACFM and AMFM).',
+   'Creation Date' => { Name => 'CreateDate', Groups => { 2 => 'Time' } },
+    FontName    => { },
+    FullName    => { },
+    FamilyName => { Name => 'FontFamily' },
+    Weight      => { },
+    Version     => { },
+    Notice      => { Groups => { 2 => 'Author' } },
+    EncodingScheme => { },
+    MappingScheme  => { },
+    EscChar     => { },
+    CharacterSet=> { },
+    Characters  => { },
+    IsBaseFont  => { },
+   # VVector     => { },
+    IsFixedV    => { },
+    CapHeight   => { },
+    XHeight     => { },
+    Ascender    => { },
+    Descender   => { },
+);
+
+#------------------------------------------------------------------------------
+# Read information from a TrueType font collection (TTC) (refs 2,3)
+# Inputs: 0) ExifTool ref, 1) dirInfo ref
+# Returns: 1 on success, 0 if this wasn't a valid TrueType font collection
+sub ProcessTTC($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my ($buff, $i);
+
+    return 0 unless $raf->Read($buff, 12) == 12;
+    return 0 unless $buff =~ /^ttcf\0[\x01\x02]\0\0/;
+    SetByteOrder('MM');
+    my $num = Get32u(\$buff, 8);
+    # might as well put a limit on the number of fonts we will parse (< 256)
+    return 0 unless $num < 0x100 and $raf->Read($buff, $num * 4) == $num * 4;
+    $exifTool->SetFileType('TTC');
+    my $tagTablePtr = GetTagTable('Image::ExifTool::Font::Main');
+    $exifTool->HandleTag($tagTablePtr, 'numfonts', $num);
+    # loop through all fonts in the collection
+    for ($i=0; $i<$num; ++$i) {
+        my $n = $i + 1;
+        $exifTool->VPrint(0, "Font $n:\n");
+        $$exifTool{SET_GROUP1} = "+$n";
+        my $offset = Get32u(\$buff, $i * 4);
+        $raf->Seek($offset, 0) or last;
+        ProcessOTF($exifTool, $dirInfo) or last;
+    }
+    delete $$exifTool{SET_GROUP1};
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Read information from a TrueType font file (OTF or TTF) (refs 1,2)
+# Inputs: 0) ExifTool ref, 1) dirInfo ref
+# Returns: 1 on success, 0 if this wasn't a valid TrueType font file
+sub ProcessOTF($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my ($tbl, $buff, $pos, $i);
+    my $base = $$dirInfo{Base} || 0;
+
+    return 0 unless $raf->Read($buff, 12) == 12;
+    return 0 unless $buff =~ /^(\0\x01\0\0|OTTO|true|typ1)[\0\x01]/;
+
+    $exifTool->SetFileType($1 eq 'OTTO' ? 'OTF' : 'TTF');
+    SetByteOrder('MM');
+    my $numTables = Get16u(\$buff, 4);
+    return 0 unless $numTables > 0 and $numTables < 0x200;
+    my $len = $numTables * 16;
+    return 0 unless $raf->Read($tbl, $len) == $len;
+
+    my $verbose = $exifTool->Options('Verbose');
+    my $oldIndent = $$exifTool{INDENT};
+    $$exifTool{INDENT} .= '| ';
+    $exifTool->VerboseDir('TrueType', $numTables) if $verbose;
+
+    for ($pos=0; $pos<$len; $pos+=16) {
+        # look for 'name' table
+        my $tag = substr($tbl, $pos, 4);
+        next unless $tag eq 'name' or $verbose;
+        my $offset = Get32u(\$tbl, $pos + 8);
+        my $size   = Get32u(\$tbl, $pos + 12);
+        unless ($raf->Seek($offset+$base, 0) and $raf->Read($buff, $size) == $size) {
+            $exifTool->Warn("Error reading '$tag' data");
+            next;
+        }
+        if ($verbose) {
+            $tag =~ s/([\0-\x1f\x80-\xff])/sprintf('\x%.2x',ord $1)/ge;
+            my $str = sprintf("%s%d) Tag '%s' (offset 0x%.4x, %d bytes)\n",
+                              $$exifTool{INDENT}, $pos/16, $tag, $offset, $size);
+            $exifTool->VPrint(0, $str);
+            $exifTool->VerboseDump(\$buff, Addr => $offset) if $verbose > 2;
+            next unless $tag eq 'name';
+        }
+        next unless $size >= 8;
+        my $entries = Get16u(\$buff, 2);
+        my $recEnd = 6 + $entries * 12;
+        if ($recEnd > $size) {
+            $exifTool->Warn('Truncated name record');
+            last;
+        }
+        my $strStart = Get16u(\$buff, 4);
+        if ($strStart < $recEnd or $strStart > $size) {
+            $exifTool->Warn('Invalid string offset');
+            last;
+        }
+        # parse language-tag record (in format 1 Naming table only) (ref 2)
+        my %langTag;
+        if (Get16u(\$buff, 0) == 1 and $recEnd + 2 <= $size) {
+            my $langTags = Get16u(\$buff, $recEnd);
+            if ($langTags and $recEnd + 2 + $langTags * 4 < $size) {
+                for ($i=0; $i<$langTags; ++$i) {
+                    my $pt = $recEnd + 2 + $i * 4;
+                    my $langLen = Get16u(\$buff, $pt);
+                    # make sure the language string length is reasonable (UTF-16BE)
+                    last if $langLen == 0 or $langLen & 0x01 or $langLen > 40;
+                    my $langPt = Get16u(\$buff, $pt + 2) + $strStart;
+                    last if $langPt + $langLen > $size;
+                    my $lang = substr($buff, $langPt, $langLen);
+                    $lang = $exifTool->Decode($lang,'UCS2','MM','UTF8');
+                    $lang =~ tr/-_a-zA-Z0-9//dc;    # remove naughty characters
+                    $langTag{$i + 0x8000} = $lang;
+                }
+            }
+        }
+        my $tagTablePtr = GetTagTable('Image::ExifTool::Font::Name');
+        $$exifTool{INDENT} .= '| ';
+        $exifTool->VerboseDir('Name', $entries) if $verbose;
+        for ($i=0; $i<$entries; ++$i) {
+            my $pt = 6 + $i * 12;
+            my $platform = Get16u(\$buff, $pt);
+            my $encoding = Get16u(\$buff, $pt + 2);
+            my $langID   = Get16u(\$buff, $pt + 4);
+            my $nameID   = Get16u(\$buff, $pt + 6);
+            my $strLen   = Get16u(\$buff, $pt + 8);
+            my $strPt    = Get16u(\$buff, $pt + 10) + $strStart;
+            if ($strPt + $strLen <= $size) {
+                my $val = substr($buff, $strPt, $strLen);
+                my ($lang, $charset, $extra);
+                my $sys = $ttPlatform{$platform};
+                # translate from specified encoding
+                if ($sys) {
+                    $lang = $ttLang{$sys}{$langID} || $langTag{$langID};
+                    $charset = $ttCharset{$sys}{$encoding};
+                    if (not $charset) {
+                        if (not defined $charset and not $$exifTool{FontWarn}) {
+                            $exifTool->Warn("Unknown $sys character set ($encoding)");
+                            $$exifTool{FontWarn} = 1;
+                        }
+                    } else {
+                        # translate to ExifTool character set
+                        $val = $exifTool->Decode($val, $charset);
+                    }
+                } else {
+                    $exifTool->Warn("Unknown platform ($platform) for name $nameID");
+                }
+                # get the tagInfo for our specific language (use 'en' for default)
+                my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $nameID);
+                if ($tagInfo and $lang and $lang ne 'en') {
+                    my $langInfo = Image::ExifTool::GetLangInfo($tagInfo, $lang);
+                    $tagInfo = $langInfo if $langInfo;
+                }
+                if ($verbose) {
+                	$langID > 0x400 and $langID = sprintf('0x%x', $langID);
+                    $extra = ", Plat=$platform/" . ($sys || 'Unknown') . ', ' .
+                               "Enc=$encoding/" . ($charset || 'Unknown') . ', ' .
+                               "Lang=$langID/" . ($lang || 'Unknown');
+                }
+                $exifTool->HandleTag($tagTablePtr, $nameID, $val,
+                    TagInfo => $tagInfo,
+                    DataPt  => \$buff,
+                    DataPos => $offset,
+                    Start   => $strPt,
+                    Size    => $strLen,
+                    Index   => $i,
+                    Extra   => $extra,
+                );
+            }
+        }
+        $$exifTool{INDENT} = $oldIndent . '| ';
+        last unless $verbose;
+    }
+    $$exifTool{INDENT} = $oldIndent;
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Read information from an Adobe Font Metrics file (AFM, ACFM, AMFM) (ref 6)
+# Inputs: 0) ExifTool ref, 1) dirInfo ref
+# Returns: 1 on success, 0 if this wasn't a recognized AFM-type file
+sub ProcessAFM($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my ($buff, $comment);
+
+    require Image::ExifTool::PostScript;
+    local $/ = Image::ExifTool::PostScript::GetInputRecordSeparator($raf);
+    $raf->ReadLine($buff);
+    return 0 unless $buff =~ /^Start(Comp|Master)?FontMetrics\s+\d+/;
+    my $ftyp = $1 ? ($1 eq 'Comp' ? 'ACFM' : 'AMFM') : 'AFM';
+    $exifTool->SetFileType($ftyp, 'application/x-font-afm');
+    my $tagTablePtr = GetTagTable('Image::ExifTool::Font::AFM');
+
+    for (;;) {
+        $raf->ReadLine($buff) or last;
+        if (defined $comment and $buff !~ /^Comment\s/) {
+            $exifTool->FoundTag('Comment', $comment);
+            undef $comment;
+        }
+        $buff =~ /^(\w+)\s+(.*?)[\x0d\x0a]/ or next;
+        my ($tag, $val) = ($1, $2);
+        if ($tag eq 'Comment' and $val =~ /^(Creation Date):\s+(.*)/) {
+            ($tag, $val) = ($1, $2);
+        }
+        $val =~ s/^\((.*)\)$/$1/;   # (some values may be in brackets)
+        if ($tag eq 'Comment') {
+            # concatinate all comments into a single value
+            $comment = defined($comment) ? "$comment\n$val" : $val;
+            next;
+        }
+        unless ($exifTool->HandleTag($tagTablePtr, $tag, $val)) {
+            # end parsing if we start any subsection
+            last if $tag =~ /^Start/ and $tag ne 'StartDirection';
+        }
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Read information from various format font files
+# Inputs: 0) ExifTool ref, 1) dirInfo ref
+# Returns: 1 on success, 0 if this wasn't a recognized Font file
+sub ProcessFont($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my ($buff, $buf2, $rtnVal);
+    return 0 unless $raf->Read($buff, 24) and $raf->Seek(0,0);
+    if ($buff =~ /^(\0\x01\0\0|OTTO|true|typ1)[\0\x01]/) {        # OTF, TTF
+        $rtnVal = ProcessOTF($exifTool, $dirInfo);
+    } elsif ($buff =~ /^ttcf\0[\x01\x02]\0\0/) {                  # TTC
+        $rtnVal = ProcessTTC($exifTool, $dirInfo);
+    } elsif ($buff =~ /^Start(Comp|Master)?FontMetrics\s+\d+/s) { # AFM
+        $rtnVal = ProcessAFM($exifTool, $dirInfo);
+    } elsif ($buff =~ /^(.{6})?%!(PS-(AdobeFont-|Bitstream )|FontType1-)/s) {# PFA, PFB
+        $raf->Seek(6,0) and $exifTool->SetFileType('PFB') if $1;
+        require Image::ExifTool::PostScript;
+        $rtnVal = Image::ExifTool::PostScript::ProcessPS($exifTool, $dirInfo);
+    } elsif ($buff =~ /^\0[\x01\x02]/ and $raf->Seek(0, 2) and    # PFM
+             # validate file size
+             $raf->Tell() > 117 and $raf->Tell() == unpack('x2V',$buff) and
+             # read PFM header
+             $raf->Seek(0,0) and $raf->Read($buff,117) == 117 and
+             # validate "DeviceType" string (must be "PostScript\0")
+             SetByteOrder('II') and $raf->Seek(Get32u(\$buff, 101), 0) and
+             # the DeviceType should be "PostScript\0", but FontForge
+             # incorrectly writes "Postscript\0", so ignore case
+             $raf->Read($buf2, 11) == 11 and lc($buf2) eq "postscript\0")
+    {
+        $exifTool->SetFileType('PFM');
+        SetByteOrder('II');
+        my $tagTablePtr = GetTagTable('Image::ExifTool::Font::Main');
+        # process the PFM header
+        $exifTool->HandleTag($tagTablePtr, 'PFM', $buff);
+        # extract the font names
+        my $nameOff = Get32u(\$buff, 105);
+        if ($raf->Seek($nameOff, 0) and $raf->Read($buff, 256) and
+            $buff =~ /^([\x20-\xff]+)\0([\x20-\xff]+)\0/)
+        {
+            $exifTool->HandleTag($tagTablePtr, 'fontname', $1);
+            $exifTool->HandleTag($tagTablePtr, 'postfont', $2);
+        }
+        $rtnVal = 1;
+    } else {
+        $rtnVal = 0;
+    }
+    return $rtnVal;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Font - Read meta information from font files
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains the routines required by Image::ExifTool to read meta
+information from various format font files.  Currently recognized font file
+types are OTF, TTF, TTC, DFONT, PFA, PFB, PFM, AFM, ACFM and AMFM.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://developer.apple.com/textfonts/TTRefMan/RM06/Chap6.html>
+
+=item L<http://www.microsoft.com/typography/otspec/otff.htm>
+
+=item L<http://partners.adobe.com/public/developer/opentype/index_font_file.html>
+
+=item L<http://partners.adobe.com/public/developer/en/font/5178.PFM.pdf>
+
+=item L<http://opensource.adobe.com/svn/opensource/flex/sdk/trunk/modules/compiler/src/java/flex2/compiler/util/MimeMappings.java>
+
+=item L<http://www.adobe.com/devnet/font/pdfs/5004.AFM_Spec.pdf>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/Font Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/FotoStation.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/FotoStation.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/FotoStation.pm	(revision 24799)
@@ -0,0 +1,258 @@
+#------------------------------------------------------------------------------
+# File:         FotoStation.pm
+#
+# Description:  Read/write FotoWare FotoStation trailer
+#
+# Revisions:    10/28/2006 - P. Harvey Created
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::FotoStation;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.00';
+
+sub ProcessFotoStation($$);
+
+%Image::ExifTool::FotoStation::Main = (
+    PROCESS_PROC => \&ProcessFotoStation,
+    WRITE_PROC => \&ProcessFotoStation,
+    GROUPS => { 2 => 'Image' },
+    NOTES => q{
+        The following tables define information found in the FotoWare FotoStation
+        trailer.
+    },
+    0x01 => {
+        Name => 'IPTC',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::IPTC::Main',
+        },
+    },
+    0x02 => {
+        Name => 'SoftEdit',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::FotoStation::SoftEdit',
+        },
+    },
+    0x03 => {
+        Name => 'ThumbnailImage',
+        Writable => 1,
+        RawConv => '$self->ValidateImage(\$val,$tag)',
+    },
+    0x04 => {
+        Name => 'PreviewImage',
+        Writable => 1,
+        RawConv => '$self->ValidateImage(\$val,$tag)',
+    },
+);
+
+# crop coordinate conversions
+my %cropConv = (
+    ValueConv => '$val / 1000',
+    ValueConvInv => '$val * 1000',
+    PrintConv => '"$val%"',
+    PrintConvInv => '$val=~tr/ %//d; $val',
+);
+
+# soft crop record
+%Image::ExifTool::FotoStation::SoftEdit = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FORMAT => 'int32s',
+    FIRST_ENTRY => 0,
+    GROUPS => { 2 => 'Image' },
+    0 => {
+        Name => 'OriginalImageWidth',
+    },
+    1 => 'OriginalImageHeight',
+    2 => 'ColorPlanes',
+    3 => {
+        Name => 'XYResolution',
+        ValueConv => '$val / 1000',
+        ValueConvInv => '$val * 1000',
+    },
+    4 => {
+        Name => 'Rotation',
+        Notes => q{
+            rotations are stored as degrees CCW * 100, but converted to degrees CW by
+            ExifTool
+        },
+        # raw value is 0, 9000, 18000 or 27000
+        ValueConv => '$val ? 360 - $val / 100 : 0',
+        ValueConvInv => '$val ? (360 - $val) * 100 : 0',
+    },
+    # 5 Validity Check (0x11222211)
+    6 => {
+        Name => 'CropLeft',
+        %cropConv,
+    },
+    7 => {
+        Name => 'CropTop',
+        %cropConv,
+    },
+    8 => {
+        Name => 'CropRight',
+        %cropConv,
+    },
+    9 => {
+        Name => 'CropBottom',
+        %cropConv,
+    },
+    11 => {
+        Name => 'CropRotation',
+        # raw value in the range -4500 to 4500
+        ValueConv => '-$val / 100',
+        ValueConvInv => '-$val * 100',
+    },
+);
+
+#------------------------------------------------------------------------------
+# Read/write FotoStation information in a file
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 on success, 0 if this file didn't contain FotoStation information
+# - updates DataPos to point to start of FotoStation information
+# - updates DirLen to trailer length
+sub ProcessFotoStation($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    $exifTool or return 1;    # allow dummy access to autoload this package
+    my ($buff, $footer, $dirBuff, $tagTablePtr);
+    my $raf = $$dirInfo{RAF};
+    my $outfile = $$dirInfo{OutFile};
+    my $offset = $$dirInfo{Offset} || 0;
+    my $verbose = $exifTool->Options('Verbose');
+    my $out = $exifTool->Options('TextOut');
+    my $rtnVal = 0;
+
+    $$dirInfo{DirLen} = 0;      # initialize returned trailer length
+    $raf->Seek(-$offset, 2);    # seek to specified offset from end of file
+
+    # loop through FotoStation records
+    for (;;) {
+        # look for trailer signature
+        last unless $raf->Seek(-10, 1) and $raf->Read($footer, 10) == 10;
+        my ($tag, $size, $sig) = unpack('nNN', $footer);
+        last unless $sig == 0xa1b2c3d4 and $size >= 10 and $raf->Seek(-$size, 1);
+        $size -= 10; # size of data only
+        last unless $raf->Read($buff, $size) == $size;
+        $raf->Seek(-$size, 1);
+        # set variables returned in dirInfo hash
+        $$dirInfo{DataPos} = $raf->Tell();
+        $$dirInfo{DirLen} += $size + 10;
+
+        unless ($tagTablePtr) {
+            $tagTablePtr = GetTagTable('Image::ExifTool::FotoStation::Main');
+            SetByteOrder('MM'); # necessary for the binary data
+            $rtnVal = 1;        # we found a valid FotoStation trailer
+        }
+        unless ($outfile) {
+            # print verbose trailer information
+            if ($verbose or $exifTool->{HTML_DUMP}) {
+                $exifTool->DumpTrailer({
+                    RAF => $raf,
+                    DataPos => $$dirInfo{DataPos},
+                    DirLen => $size + 10,
+                    DirName => "FotoStation_$tag",
+                });
+            }
+            # extract information for this tag
+            $exifTool->HandleTag($tagTablePtr, $tag, $buff,
+                                 DataPt => \$buff,
+                                 Start => 0,
+                                 Size => $size,
+                                 DataPos => $$dirInfo{DataPos});
+            next;
+        }
+        if ($exifTool->{DEL_GROUP}->{FotoStation}) {
+            $verbose and printf $out "  Deleting FotoStation trailer\n";
+            $verbose = 0;   # no more verbose messages after this
+            ++$exifTool->{CHANGED};
+            next;
+        }
+        # rewrite this information
+        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        if ($tagInfo) {
+            my $newVal;
+            my $tagName = $$tagInfo{Name};
+            if ($$tagInfo{SubDirectory}) {
+                my %subdirInfo = (
+                    DataPt => \$buff,
+                    DirStart => 0,
+                    DirLen => $size,
+                    DataPos => $$dirInfo{DataPos},
+                    DirName => $tagName,
+                    Parent => 'FotoStation',
+                );
+                my $subTable = GetTagTable($tagInfo->{SubDirectory}->{TagTable});
+                $newVal = $exifTool->WriteDirectory(\%subdirInfo, $subTable);
+            } else {
+                my $nvHash = $exifTool->GetNewValueHash($tagInfo);
+                if (Image::ExifTool::IsOverwriting($nvHash) > 0) {
+                    $newVal = Image::ExifTool::GetNewValues($nvHash);
+                    $newVal = '' unless defined $newVal;
+                    if ($verbose > 1) {
+                        my $n = length $newVal;
+                        print $out "    - FotoStation:$tagName ($size bytes)\n" if $size;
+                        print $out "    + FotoStation:$tagName ($n bytes)\n" if $n;
+                    }
+                    ++$exifTool->{CHANGED};
+                }
+            }
+            if (defined $newVal) {
+                # note: length may be 0 here, but we write the empty record anyway
+                $buff = $newVal;
+                $size = length($newVal) + 10;
+                $footer = pack('nNN', $tag, $size, $sig);
+            }
+        }
+        if (defined $dirBuff) {
+            # maintain original record order
+            $dirBuff = $buff . $footer . $dirBuff;
+        } else {
+            $dirBuff = $buff . $footer;
+        }
+    }
+    # write the modified FotoStation trailer
+    Write($outfile, $dirBuff) or $rtnVal = -1 if $dirBuff;
+    return $rtnVal;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::FotoStation - Read/write FotoWare FotoStation trailer
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to read and
+write information from the FotoWare FotoStation trailer.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Mark Tate for information about the FotoStation data format.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/FotoStation Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/FujiFilm.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/FujiFilm.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/FujiFilm.pm	(revision 24799)
@@ -0,0 +1,877 @@
+#------------------------------------------------------------------------------
+# File:         FujiFilm.pm
+#
+# Description:  Read/write FujiFilm maker notes and RAF images
+#
+# Revisions:    11/25/2003 - P. Harvey Created
+#               11/14/2007 - PH Added abilty to write RAF images
+#
+# References:   1) http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html
+#               2) http://homepage3.nifty.com/kamisaka/makernote/makernote_fuji.htm (2007/09/11)
+#               3) Michael Meissner private communication
+#               4) Paul Samuelson private communication (S5)
+#               5) http://www.cybercom.net/~dcoffin/dcraw/
+#               6) http://forums.dpreview.com/forums/readflat.asp?forum=1012&thread=31350384
+#                  and http://forum.photome.de/viewtopic.php?f=2&t=353&p=742#p740
+#               JD) Jens Duttke private communication
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::FujiFilm;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::Exif;
+
+$VERSION = '1.31';
+
+sub ProcessFujiDir($$$);
+sub ProcessFaceRec($$$);
+
+# the following RAF version numbers have been tested for writing:
+my %testedRAF = (
+    '0100' => 'E550, E900, S5600, S6000fd, S6500fd, HS10/HS11, S200EXR, X100 (all Ver1.00)',
+    '0102' => 'S100FS Ver1.02',
+    '0104' => 'S5Pro Ver1.04',
+    '0106' => 'S5Pro Ver1.06',
+    '0111' => 'S5Pro Ver1.11',
+    '0114' => 'S9600 Ver1.00',
+    '0159' => 'S2Pro Ver1.00',
+    '0212' => 'S3Pro Ver2.12',
+    '0216' => 'S3Pro Ver2.16', # (NC)
+    '0218' => 'S3Pro Ver2.18',
+    '0264' => 'F700  Ver2.00',
+    '0266' => 'S9500 Ver1.01',
+    '0269' => 'S9500 Ver1.02',
+    '0271' => 'S3Pro Ver2.71', # UV/IR model?
+    '0712' => 'S5000 Ver3.00',
+    '0716' => 'S5000 Ver3.00', # (yes, 2 RAF versions with the same firmware version)
+);
+
+my %faceCategories = (
+    Format => 'int8u',
+    PrintConv => { BITMASK => {
+        1 => 'Partner',
+        2 => 'Family',
+        3 => 'Friend',
+    }},
+);
+
+# FujiFilm MakerNotes tags
+%Image::ExifTool::FujiFilm::Main = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    WRITABLE => 1,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0x0 => {
+        Name => 'Version',
+        Writable => 'undef',
+    },
+    0x0010 => { #PH (how does this compare to actual serial number?)
+        Name => 'InternalSerialNumber',
+        Writable => 'string',
+        Notes => q{
+            this number is unique, and contains the date of manufacture, but doesn't
+            necessarily correspond to the camera body number -- this needs to be checked
+        },
+        # ie)  "FPX20017035 592D31313034060427796060110384"
+        # "FPX 20495643     592D313335310701318AD010110047" (F40fd)
+        #                               yymmdd
+        PrintConv => q{
+            return $val unless $val=~/^(.*)(\d{2})(\d{2})(\d{2})(.{12})$/;
+            my $yr = $2 + ($2 < 70 ? 2000 : 1900);
+            return "$1 $yr:$3:$4 $5";
+        },
+        PrintConvInv => '$_=$val; s/ (19|20)(\d{2}):(\d{2}):(\d{2}) /$2$3$4/; $_',
+    },
+    0x1000 => {
+        Name => 'Quality',
+        Writable => 'string',
+    },
+    0x1001 => {
+        Name => 'Sharpness',
+        Flags => 'PrintHex',
+        Writable => 'int16u',
+        PrintConv => {
+            0x01 => 'Soft',
+            0x02 => 'Soft2',
+            0x03 => 'Normal',
+            0x04 => 'Hard',
+            0x05 => 'Hard2',
+            0x82 => 'Medium Soft', #2
+            0x84 => 'Medium Hard', #2
+            0x8000 => 'Film Simulation', #2
+            0xffff => 'n/a', #2
+        },
+    },
+    0x1002 => {
+        Name => 'WhiteBalance',
+        Flags => 'PrintHex',
+        Writable => 'int16u',
+        PrintConv => {
+            0x0   => 'Auto',
+            0x100 => 'Daylight',
+            0x200 => 'Cloudy',
+            0x300 => 'Daylight Fluorescent',
+            0x301 => 'Day White Fluorescent',
+            0x302 => 'White Fluorescent',
+            0x303 => 'Warm White Fluorescent', #2/PH (S5)
+            0x304 => 'Living Room Warm White Fluorescent', #2/PH (S5)
+            0x400 => 'Incandescent',
+            0x500 => 'Flash', #4
+            0xf00 => 'Custom',
+            0xf01 => 'Custom2', #2
+            0xf02 => 'Custom3', #2
+            0xf03 => 'Custom4', #2
+            0xf04 => 'Custom5', #2
+            # 0xfe0 => 'Gray Point?', #2
+            0xff0 => 'Kelvin', #4
+        },
+    },
+    0x1003 => {
+        Name => 'Saturation',
+        Flags => 'PrintHex',
+        Writable => 'int16u',
+        PrintConv => {
+            0x0   => 'Normal',
+            0x080 => 'Medium High', #2
+            0x100 => 'High',
+            0x180 => 'Medium Low', #2
+            0x200 => 'Low',
+            0x300 => 'None (B&W)', #2
+            0x301 => 'B&W Green Filter', #PH (X100)
+            0x302 => 'B&W Yellow Filter', #PH (X100)
+            0x303 => 'B&W Blue Filter', #PH (X100)
+            0x310 => 'B&W Sepia', #PH (X100)
+            0x8000 => 'Film Simulation', #2
+        },
+    },
+    0x1004 => {
+        Name => 'Contrast',
+        Flags => 'PrintHex',
+        Writable => 'int16u',
+        PrintConv => {
+            0x0   => 'Normal',
+            0x080 => 'Medium High', #2
+            0x100 => 'High',
+            0x180 => 'Medium Low', #2
+            0x200 => 'Low',
+            0x8000 => 'Film Simulation', #2
+        },
+    },
+    0x1005 => { #4
+        Name => 'ColorTemperature',
+        Writable => 'int16u',
+    },
+    0x1006 => { #JD
+        Name => 'Contrast',
+        Flags => 'PrintHex',
+        Writable => 'int16u',
+        PrintConv => {
+            0x0   => 'Normal',
+            0x100 => 'High',
+            0x300 => 'Low',
+        },
+    },
+    0x100a => { #2
+        Name => 'WhiteBalanceFineTune',
+        Writable => 'int32s',
+        Count => 2,
+        PrintConv => 'sprintf("Red %+d, Blue %+d", split(" ", $val))',
+        PrintConvInv => 'my @v=($val=~/-?\d+/g);"@v"',
+    },
+    0x100b => { #2
+        Name => 'NoiseReduction',
+        Flags => 'PrintHex',
+        Writable => 'int16u',
+        PrintConv => {
+            0x40 => 'Low',
+            0x80 => 'Normal',
+            0x100 => 'n/a', #PH (NC) (all X100 samples)
+        },
+    },
+    0x100e => { #PH (X100)
+        Name => 'HighISONoiseReduction',
+        Flags => 'PrintHex',
+        Writable => 'int16u',
+        PrintConv => {
+            0x000 => 'Normal',
+            0x100 => 'Strong',
+            0x200 => 'Weak',
+        },
+    },
+    0x1010 => {
+        Name => 'FujiFlashMode',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Auto',
+            1 => 'On',
+            2 => 'Off',
+            3 => 'Red-eye reduction',
+            4 => 'External', #JD
+        },
+    },
+    0x1011 => {
+        Name => 'FlashExposureComp', #JD
+        Writable => 'rational64s',
+    },
+    0x1020 => {
+        Name => 'Macro',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'On',
+        },
+    },
+    0x1021 => {
+        Name => 'FocusMode',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Auto',
+            1 => 'Manual',
+        },
+    },
+    0x1023 => { #2
+        Name => 'FocusPixel',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x1030 => {
+        Name => 'SlowSync',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'On',
+        },
+    },
+    0x1031 => {
+        Name => 'PictureMode',
+        Flags => 'PrintHex',
+        Writable => 'int16u',
+        PrintConv => {
+            0x0 => 'Auto',
+            0x1 => 'Portrait',
+            0x2 => 'Landscape',
+            0x3 => 'Macro', #JD
+            0x4 => 'Sports',
+            0x5 => 'Night Scene',
+            0x6 => 'Program AE',
+            0x7 => 'Natural Light', #3
+            0x8 => 'Anti-blur', #3
+            0x9 => 'Beach & Snow', #JD
+            0xa => 'Sunset', #3
+            0xb => 'Museum', #3
+            0xc => 'Party', #3
+            0xd => 'Flower', #3
+            0xe => 'Text', #3
+            0xf => 'Natural Light & Flash', #3
+            0x10 => 'Beach', #3
+            0x11 => 'Snow', #3
+            0x12 => 'Fireworks', #3
+            0x13 => 'Underwater', #3
+            0x16 => 'Panorama', #PH (X100)
+            0x100 => 'Aperture-priority AE',
+            0x200 => 'Shutter speed priority AE',
+            0x300 => 'Manual',
+        },
+    },
+# this usually has a value of 1
+#    0x1032 => { #2
+#        Name => 'ShutterCount',
+#        Writable => 'int16u',
+#    },
+    0x1033 => { #6
+        Name => 'EXRAuto',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Auto',
+            1 => 'Manual',
+        },
+    },
+    0x1034 => { #6
+        Name => 'EXRMode',
+        Writable => 'int16u',
+        PrintHex => 1,
+        PrintConv => {
+            0x100 => 'HR (High Resolution)',
+            0x200 => 'SN (Signal to Noise priority)',
+            0x300 => 'DR (Dynamic Range priority)',
+        },
+    },
+    0x1100 => {
+        Name => 'AutoBracketing',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'On',
+            2 => 'No flash & flash', #3
+        },
+    },
+    0x1101 => {
+        Name => 'SequenceNumber',
+        Writable => 'int16u',
+    },
+    0x1210 => { #2
+        Name => 'ColorMode',
+        Writable => 'int16u',
+        PrintHex => 1,
+        PrintConv => {
+            0x00 => 'Standard',
+            0x10 => 'Chrome',
+            0x30 => 'B & W',
+        },
+    },
+    0x1300 => {
+        Name => 'BlurWarning',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'None',
+            1 => 'Blur Warning',
+        },
+    },
+    0x1301 => {
+        Name => 'FocusWarning',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Good',
+            1 => 'Out of focus',
+        },
+    },
+    0x1302 => {
+        Name => 'ExposureWarning',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Good',
+            1 => 'Bad exposure',
+        },
+    },
+    0x1304 => { #PH
+        Name => 'GEImageSize',
+        Condition => '$$self{Make} =~ /^GENERAL IMAGING/',
+        Format => 'string',
+        Notes => 'GE models only',
+    },
+    0x1400 => { #2
+        Name => 'DynamicRange',
+        Writable => 'int16u',
+        PrintConv => {
+            1 => 'Standard',
+            3 => 'Wide',
+            # the S5Pro has 100%(STD),130%,170%,230%(W1),300%,400%(W2) - PH
+        },
+    },
+    0x1401 => { #2 (this doesn't seem to work for the X100 - PH)
+        Name => 'FilmMode',
+        Writable => 'int16u',
+        PrintHex => 1,
+        PrintConv => {
+            0x000 => 'F0/Standard',
+            0x100 => 'F1/Studio Portrait',
+            0x110 => 'F1a/Studio Portrait Enhanced Saturation',
+            0x120 => 'F1b/Studio Portrait Smooth Skin Tone',
+            0x130 => 'F1c/Studio Portrait Increased Sharpness',
+            0x200 => 'F2/Fujichrome',
+            0x300 => 'F3/Studio Portrait Ex',
+            0x400 => 'F4/Velvia',
+        },
+    },
+    0x1402 => { #2
+        Name => 'DynamicRangeSetting',
+        Writable => 'int16u',
+        PrintHex => 1,
+        PrintConv => {
+            0x000 => 'Auto (100-400%)',
+            0x001 => 'Manual', #(ref http://forum.photome.de/viewtopic.php?f=2&t=353)
+            0x100 => 'Standard (100%)',
+            0x200 => 'Wide1 (230%)',
+            0x201 => 'Wide2 (400%)',
+            0x8000 => 'Film Simulation',
+        },
+    },
+    0x1403 => { #2 (only valid for manual DR, ref 6)
+        Name => 'DevelopmentDynamicRange',
+        Writable => 'int16u',
+    },
+    0x1404 => { #2
+        Name => 'MinFocalLength',
+        Writable => 'rational64s',
+    },
+    0x1405 => { #2
+        Name => 'MaxFocalLength',
+        Writable => 'rational64s',
+    },
+    0x1406 => { #2
+        Name => 'MaxApertureAtMinFocal',
+        Writable => 'rational64s',
+    },
+    0x1407 => { #2
+        Name => 'MaxApertureAtMaxFocal',
+        Writable => 'rational64s',
+    },
+    # 0x1408 - values: '0100', 'S100', 'VQ10'
+    # 0x1409 - values: same as 0x1408
+    # 0x140a - values: 0, 1, 3, 5, 7
+    0x140b => { #6
+        Name => 'AutoDynamicRange',
+        Writable => 'int16u',
+        PrintConv => '"$val%"',
+        PrintConvInv => '$val=~s/\s*\%$//; $val',
+    },
+    # 0x140b - DR value for AutoDR???? (ref 6) - values: 100
+    # 0x3820 - int16u video frame rate? - PH (HS20EXR)
+    # 0x3821 - int16u video frame width? - PH (HS20EXR)
+    # 0x3822 - int16u video frame height? - PH (HS20EXR)
+    0x4100 => { #PH
+        Name => 'FacesDetected',
+        Writable => 'int16u',
+    },
+    0x4103 => { #PH
+        Name => 'FacePositions',
+        Writable => 'int16u',
+        Count => -1,
+        Notes => q{
+            left, top, right and bottom coordinates in full-sized image for each face
+            detected
+        },
+    },
+    # 0x4104 - also related to face detection (same number of entries as FacePositions)
+    # 0x4203 - same as 0x4103
+    # 0x4204 - same as 0x4104
+    0x4282 => { #PH
+        Name => 'FaceRecInfo',
+        SubDirectory => { TagTable => 'Image::ExifTool::FujiFilm::FaceRecInfo' },
+    },
+    0x8000 => { #2
+        Name => 'FileSource',
+        Writable => 'string',
+    },
+    0x8002 => { #2
+        Name => 'OrderNumber',
+        Writable => 'int32u',
+    },
+    0x8003 => { #2
+        Name => 'FrameNumber',
+        Writable => 'int16u',
+    },
+    0xb211 => { #PH
+        Name => 'Parallax',
+        # (value set in camera is -0.5 times this value in MPImage2... why?)
+        Writable => 'rational64s',
+        Notes => 'only found in MPImage2 of .MPO images',
+    },
+    # 0xb212 - also found in MPIMage2 images - PH
+);
+
+# Face recognition information from FinePix F550EXR (ref PH)
+%Image::ExifTool::FujiFilm::FaceRecInfo = (
+    PROCESS_PROC => \&ProcessFaceRec,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    VARS => { NO_ID => 1 },
+    NOTES => 'Face recognition information.',
+    Face1Name => { },
+    Face2Name => { },
+    Face3Name => { },
+    Face4Name => { },
+    Face5Name => { },
+    Face6Name => { },
+    Face7Name => { },
+    Face8Name => { },
+    Face1Category => { %faceCategories },
+    Face2Category => { %faceCategories },
+    Face3Category => { %faceCategories },
+    Face4Category => { %faceCategories },
+    Face5Category => { %faceCategories },
+    Face6Category => { %faceCategories },
+    Face7Category => { %faceCategories },
+    Face8Category => { %faceCategories },
+    Face1Birthday => { },
+    Face2Birthday => { },
+    Face3Birthday => { },
+    Face4Birthday => { },
+    Face5Birthday => { },
+    Face6Birthday => { },
+    Face7Birthday => { },
+    Face8Birthday => { },
+);
+
+# tags in RAF images (ref 5)
+%Image::ExifTool::FujiFilm::RAF = (
+    PROCESS_PROC => \&ProcessFujiDir,
+    GROUPS => { 0 => 'RAF', 1 => 'RAF', 2 => 'Image' },
+    PRIORITY => 0, # so the first RAF directory takes precedence
+    NOTES => q{
+        FujiFilm RAF images contain meta information stored in a proprietary
+        FujiFilm RAF format, as well as EXIF information stored inside an embedded
+        JPEG preview image.  The table below lists tags currently decoded from the
+        RAF-format information.
+    },
+    0x100 => {
+        Name => 'RawImageFullSize',
+        Format => 'int16u',
+        Groups => { 1 => 'RAF2' }, # (so RAF2 shows up in family 1 list)
+        Count => 2,
+        Notes => 'including borders',
+        ValueConv => 'my @v=reverse split(" ",$val);"@v"',
+        PrintConv => '$val=~tr/ /x/; $val',
+    },
+    0x121 => [
+        {
+            Name => 'RawImageSize',
+            Condition => '$$self{Model} eq "FinePixS2Pro"',
+            Format => 'int16u',
+            Count => 2,
+            ValueConv => q{
+                my @v=split(" ",$val);
+                $v[0]*=2, $v[1]/=2;
+                return "@v";
+            },
+            PrintConv => '$val=~tr/ /x/; $val',
+        },
+        {
+            Name => 'RawImageSize',
+            Format => 'int16u',
+            Count => 2,
+            # values are height then width, adjusted for the layout
+            ValueConv => q{
+                my @v=reverse split(" ",$val);
+                $$self{FujiLayout} and $v[0]/=2, $v[1]*=2;
+                return "@v";
+            },
+            PrintConv => '$val=~tr/ /x/; $val',
+        },
+    ],
+    0x130 => {
+        Name => 'FujiLayout',
+        Format => 'int8u',
+        RawConv => q{
+            my ($v) = split ' ', $val;
+            $$self{FujiLayout} = $v & 0x80 ? 1 : 0;
+            return $val;
+        },
+    },
+    0x2ff0 => {
+        Name => 'WB_GRGBLevels',
+        Format => 'int16u',
+        Count => 4,
+    },
+);
+
+# information found in FFMV atom of MOV videos
+%Image::ExifTool::FujiFilm::FFMV = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    FIRST_ENTRY => 0,
+    NOTES => 'Information found in the FFMV atom of MOV videos.',
+    0 => {
+        Name => 'MovieStreamName',
+        Format => 'string[34]',
+    },
+);
+
+#------------------------------------------------------------------------------
+# decode information from FujiFilm face recognition information
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference, 2) tag table ref
+# Returns: 1
+sub ProcessFaceRec($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dataPos = $$dirInfo{DataPos} + ($$dirInfo{Base} || 0);
+    my $dirStart = $$dirInfo{DirStart};
+    my $dirLen = $$dirInfo{DirLen};
+    my $pos = $dirStart;
+    my $end = $dirStart + $dirLen;
+    my ($i, $n, $p, $val);
+    $exifTool->VerboseDir('FaceRecInfo');
+    for ($i=1; ; ++$i) {
+        last if $pos + 8 > $end;
+        my $off = Get32u($dataPt, $pos) + $dirStart;
+        my $len = Get32u($dataPt, $pos + 4);
+        last if $len==0 or $off>$end or $off+$len>$end or $len < 62;
+        # values observed for each offset (always zero if not listed):
+        # 0=5; 3=1; 4=4; 6=1; 10-13=numbers(constant for a given registered face)
+        # 15=16; 16=3; 18=1; 22=nameLen; 26=1; 27=16; 28=7; 30-33=nameLen(int32u)
+        # 34-37=nameOffset(int32u); 38=32; 39=16; 40=4; 42=1; 46=0,2,4,8(category)
+        # 50=33; 51=16; 52=7; 54-57=dateLen(int32u); 58-61=dateOffset(int32u)
+        $n = Get32u($dataPt, $off + 30);
+        $p = Get32u($dataPt, $off + 34) + $dirStart;
+        last if $p < $dirStart or $p + $n > $end;
+        $val = substr($$dataPt, $p, $n);
+        $exifTool->HandleTag($tagTablePtr, "Face${i}Name", $val,
+            DataPt  => $dataPt,
+            DataPos => $dataPos,
+            Start   => $p,
+            Size    => $n,
+        );
+        $n = Get32u($dataPt, $off + 54);
+        $p = Get32u($dataPt, $off + 58) + $dirStart;
+        last if $p < $dirStart or $p + $n > $end;
+        $val = substr($$dataPt, $p, $n);
+        $val =~ s/(\d{4})(\d{2})(\d{2})/$1:$2:$2/;
+        $exifTool->HandleTag($tagTablePtr, "Face${i}Birthday", $val,
+            DataPt  => $dataPt,
+            DataPos => $dataPos,
+            Start   => $p,
+            Size    => $n,
+        );
+        $exifTool->HandleTag($tagTablePtr, "Face${i}Category", undef,
+            DataPt  => $dataPt,
+            DataPos => $dataPos,
+            Start   => $off + 46,
+            Size    => 1,
+        );
+        $pos += 8;
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# get information from FujiFilm RAF directory
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference, 2) tag table ref
+# Returns: 1 if this was a valid FujiFilm directory
+sub ProcessFujiDir($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $raf = $$dirInfo{RAF};
+    my $offset = $$dirInfo{DirStart};
+    $raf->Seek($offset, 0) or return 0;
+    my ($buff, $index);
+    $raf->Read($buff, 4) or return 0;
+    my $entries = unpack 'N', $buff;
+    $entries < 256 or return 0;
+    $exifTool->Options('Verbose') and $exifTool->VerboseDir('Fuji', $entries);
+    SetByteOrder('MM');
+    my $pos = $offset + 4;
+    for ($index=0; $index<$entries; ++$index) {
+        $raf->Read($buff,4) or return 0;
+        $pos += 4;
+        my ($tag, $len) = unpack 'nn', $buff;
+        my ($val, $vbuf);
+        $raf->Read($vbuf, $len) or return 0;
+        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        if ($tagInfo and $$tagInfo{Format}) {
+            $val = ReadValue(\$vbuf, 0, $$tagInfo{Format}, $$tagInfo{Count}, $len);
+            next unless defined $val;
+        } elsif ($len == 4) {
+            # interpret unknown 4-byte values as int32u
+            $val = Get32u(\$vbuf, 0);
+        } else {
+            # treat other unknown values as binary data
+            $val = \$vbuf;
+        }
+        $exifTool->HandleTag($tagTablePtr, $tag, $val,
+            Index   => $index,
+            DataPt  => \$vbuf,
+            DataPos => $pos,
+            Size    => $len,
+            TagInfo => $tagInfo,
+        );
+        $pos += $len;
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# write information to FujiFilm RAW file (RAF)
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 on success, 0 if this wasn't a valid RAF file, or -1 on write error
+sub WriteRAF($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my ($hdr, $jpeg, $outJpeg, $offset, $err, $buff);
+
+    $raf->Read($hdr,0x94) == 0x94  or return 0;
+    $hdr =~ /^FUJIFILM/            or return 0;
+    my $ver = substr($hdr, 0x3c, 4);
+    $ver =~ /^\d{4}$/              or return 0;
+
+    # get the position and size of embedded JPEG
+    my ($jpos, $jlen) = unpack('x84NN', $hdr);
+    # check to be sure the JPEG starts in the expected location
+    if ($jpos > 0x94 or $jpos < 0x68 or $jpos & 0x03) {
+        $exifTool->Error("Unsupported or corrupted RAF image (version $ver)");
+        return 1;
+    }
+    # check to make sure this version of RAF has been tested
+    unless ($testedRAF{$ver}) {
+        $exifTool->Error("RAF version $ver not yet tested", 1) and return 1;
+    }
+    # read the embedded JPEG
+    unless ($raf->Seek($jpos, 0) and $raf->Read($jpeg, $jlen) == $jlen) {
+        $exifTool->Error('Error reading RAF meta information');
+        return 1;
+    }
+    # use same write directories as JPEG
+    $exifTool->InitWriteDirs('JPEG');
+    # rewrite the embedded JPEG in memory
+    my %jpegInfo = (
+        Parent  => 'RAF',
+        RAF     => new File::RandomAccess(\$jpeg),
+        OutFile => \$outJpeg,
+    );
+    $$exifTool{FILE_TYPE} = 'JPEG';
+    my $success = $exifTool->WriteJPEG(\%jpegInfo);
+    $$exifTool{FILE_TYPE} = 'RAF';
+    unless ($success and $outJpeg) {
+        $exifTool->Error("Invalid RAF format");
+        return 1;
+    }
+    return -1 if $success < 0;
+
+    # rewrite the RAF image
+    SetByteOrder('MM');
+    my $jpegLen = length $outJpeg;
+    # pad JPEG to an even 4 bytes (ALWAYS use padding as Fuji does)
+    my $pad = "\0" x (4 - ($jpegLen % 4));
+    # update JPEG size in header (size without padding)
+    Set32u(length($outJpeg), \$hdr, 0x58);
+    # get pointer to start of the next RAF block
+    my $nextPtr = Get32u(\$hdr, 0x5c);
+    # determine the length of padding at the end of the original JPEG
+    my $oldPadLen = $nextPtr - ($jpos + $jlen);
+    if ($oldPadLen) {
+        if ($oldPadLen > 1000000 or $oldPadLen < 0 or
+            not $raf->Seek($jpos+$jlen, 0) or
+            $raf->Read($buff, $oldPadLen) != $oldPadLen)
+        {
+            $exifTool->Error('Bad RAF pointer at 0x5c');
+            return 1;
+        }
+        # make sure padding is only zero bytes (can be >100k for HS10)
+        if ($buff =~ /[^\0]/) {
+            $exifTool->Error('Non-null bytes found in padding');
+            return 1;
+        }
+    }
+    # calculate offset difference due to change in JPEG size
+    my $ptrDiff = length($outJpeg) + length($pad) - ($jlen + $oldPadLen);
+    # update necessary pointers in header
+    foreach $offset (0x5c, 0x64, 0x78, 0x80) {
+        last if $offset >= $jpos;    # some versions have a short header
+        my $oldPtr = Get32u(\$hdr, $offset);
+        next unless $oldPtr;        # don't update if pointer is zero
+        Set32u($oldPtr + $ptrDiff, \$hdr, $offset);
+    }
+    # write the new header
+    my $outfile = $$dirInfo{OutFile};
+    Write($outfile, substr($hdr, 0, $jpos)) or $err = 1;
+    # write the updated JPEG plus padding
+    Write($outfile, $outJpeg, $pad) or $err = 1;
+    # copy over the rest of the RAF image
+    unless ($raf->Seek($nextPtr, 0)) {
+        $exifTool->Error('Error reading RAF image');
+        return 1;
+    }
+    while ($raf->Read($buff, 65536)) {
+        Write($outfile, $buff) or $err = 1, last;
+    }
+    return $err ? -1 : 1;
+}
+
+#------------------------------------------------------------------------------
+# get information from FujiFilm RAW file (RAF)
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 if this was a valid RAF file
+sub ProcessRAF($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my ($buff, $jpeg, $warn, $offset);
+
+    my $raf = $$dirInfo{RAF};
+    $raf->Read($buff,0x5c) == 0x5c    or return 0;
+    $buff =~ /^FUJIFILM/              or return 0;
+    my ($jpos, $jlen) = unpack('x84NN', $buff);
+    $jpos & 0x8000                   and return 0;
+    $raf->Seek($jpos, 0)              or return 0;
+    $raf->Read($jpeg, $jlen) == $jlen or return 0;
+
+    $exifTool->FoundTag('RAFVersion', substr($buff, 0x3c, 4));
+
+    # extract information from embedded JPEG
+    my %dirInfo = (
+        Parent => 'RAF',
+        RAF    => new File::RandomAccess(\$jpeg),
+    );
+    $$exifTool{BASE} += $jpos;
+    my $rtnVal = $exifTool->ProcessJPEG(\%dirInfo);
+    $$exifTool{BASE} -= $jpos;
+    $exifTool->FoundTag('PreviewImage', \$jpeg) if $rtnVal;
+
+    # extract information from Fuji RAF directories
+    my $num = '';
+    foreach $offset (0x5c, 0x78) {
+        last if $offset >= $jpos;
+        unless ($raf->Seek($offset, 0) and $raf->Read($buff, 4)) {
+            $warn = 1;
+            last;
+        }
+        my $start = unpack('N',$buff);
+        next unless $start;
+
+        %dirInfo = (
+            RAF      => $raf,
+            DirStart => $start,
+        );
+        $$exifTool{SET_GROUP1} = "RAF$num";
+        my $tagTablePtr = GetTagTable('Image::ExifTool::FujiFilm::RAF');
+        $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr) or $warn = 1;
+        delete $$exifTool{SET_GROUP1};
+
+        $num = ($num || 1) + 1;
+    }
+    $warn and $exifTool->Warn('Possibly corrupt RAF information');
+
+    return $rtnVal;
+}
+
+1; # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::FujiFilm - Read/write FujiFilm maker notes and RAF images
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to interpret
+FujiFilm maker notes in EXIF information, and to read/write FujiFilm RAW
+(RAF) images.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html>
+
+=item L<http://homepage3.nifty.com/kamisaka/makernote/makernote_fuji.htm>
+
+=item L<http://www.cybercom.net/~dcoffin/dcraw/>
+
+=item (...plus testing with my own FinePix 2400 Zoom)
+
+=back
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Michael Meissner, Paul Samuelson and Jens Duttke for help decoding
+some FujiFilm information.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/FujiFilm Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/GE.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/GE.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/GE.pm	(revision 24799)
@@ -0,0 +1,80 @@
+#------------------------------------------------------------------------------
+# File:         GE.pm
+#
+# Description:  General Imaging maker notes tags
+#
+# Revisions:    2010-12-14 - P. Harvey Created
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::GE;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::Exif;
+
+$VERSION = '1.00';
+
+sub ProcessGE2($$$);
+
+# GE type 1 maker notes (ref PH)
+%Image::ExifTool::GE::Main = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    WRITABLE => 1,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => q{
+        This table lists tags found in the maker notes of some General Imaging
+        camera models.
+    },
+    # 0x0104 - int32u
+    # 0x0200 - int32u[3] (with invalid offset of 0)
+    0x0202 => {
+        Name => 'Macro',
+        Writable => 'int16u',
+        PrintConv => { 0 => 'Off', 1 => 'On' },
+    },
+    # 0x0203 - int16u: 0
+    # 0x0204 - rational64u: 10/10
+    # 0x0205 - rational64u: 7.249,7.34,9.47 (changes with camera model)
+    # 0x0206 - int16u[6] (with invalid offset of 0)
+    0x0207 => {
+        Name => 'GEModel',
+        Format => 'string',
+    },
+    0x0300 => {
+        Name => 'GEMake',
+        Format => 'string',
+    },
+    # 0x0500 - int16u: 0
+    # 0x0600 - int32u: 0
+);
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::GE - General Imaging maker notes tags
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to interpret
+General Imaging maker notes.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/GE Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/GIF.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/GIF.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/GIF.pm	(revision 24799)
@@ -0,0 +1,440 @@
+#------------------------------------------------------------------------------
+# File:         GIF.pm
+#
+# Description:  Read and write GIF meta information
+#
+# Revisions:    10/18/2005 - P. Harvey Separated from ExifTool.pm
+#
+# References:   1) http://www.w3.org/Graphics/GIF/spec-gif89a.txt
+#               2) http://www.adobe.com/devnet/xmp/
+#               3) http://graphcomp.com/info/specs/ani_gif.html
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::GIF;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.06';
+
+# road map of directory locations in GIF images
+my %gifMap = (
+    XMP => 'GIF',
+);
+
+%Image::ExifTool::GIF::Main = (
+    GROUPS => { 2 => 'Image' },
+    VARS => { NO_ID => 1 },
+    NOTES => q{
+        This table lists information extracted from GIF images. See
+        L<http://www.w3.org/Graphics/GIF/spec-gif89a.txt> for the official GIF89a
+        specification.
+    },
+    GIFVersion => { },
+    FrameCount => { Notes => 'number of animated images' },
+    Text       => { Notes => 'text displayed in image' },
+    Comment    => {
+        # for documentation only -- flag as writable for the docs, but
+        # it won't appear in the TagLookup because there is no WRITE_PROC
+        Writable => 1,
+    },
+    Duration   => {
+        Notes => 'duration of a single animation iteration',
+        PrintConv => 'sprintf("%.2f s",$val)',
+    },
+    ScreenDescriptor => {
+        SubDirectory => { TagTable => 'Image::ExifTool::GIF::Screen' },
+    },
+    AnimationExtension => {
+        SubDirectory => { TagTable => 'Image::ExifTool::GIF::Animate' },
+    },
+    XMPExtension => { # (for documentation only)
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' },
+    },
+);
+
+# GIF locical screen descriptor
+%Image::ExifTool::GIF::Screen = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    NOTES => 'Information extracted from the GIF logical screen descriptor.',
+    0 => {
+        Name => 'ImageWidth',
+        Format => 'int16u',
+    },
+    2 => {
+        Name => 'ImageHeight',
+        Format => 'int16u',
+    },
+    4.1 => {
+        Name => 'HasColorMap',
+        Mask => 0x80,
+        PrintConv => { 0x00 => 'No', 0x80 => 'Yes' },
+    },
+    4.2 => {
+        Name => 'ColorResolutionDepth',
+        Mask => 0x70,
+        ValueConv => '($val >> 4) + 1',
+    },
+    4.3 => {
+        Name => 'BitsPerPixel',
+        Mask => 0x07,
+        ValueConv => '$val + 1',
+    },
+    5 => 'BackgroundColor',
+);
+
+# GIF Netscape 2.0 animation extension
+%Image::ExifTool::GIF::Animate = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    NOTES => 'Information extracted from the "NETSCAPE2.0" animation extension.',
+    2 => {
+        Name => 'AnimationIterations',
+        Format => 'int16u',
+        PrintConv => '$val ? $val : "Infinite"',
+    },
+);
+
+#------------------------------------------------------------------------------
+# Process meta information in GIF image
+# Inputs: 0) ExifTool object reference, 1) Directory information ref
+# Returns: 1 on success, 0 if this wasn't a valid GIF file, or -1 if
+#          an output file was specified and a write error occurred
+sub ProcessGIF($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $outfile = $$dirInfo{OutFile};
+    my $raf = $$dirInfo{RAF};
+    my $verbose = $exifTool->Options('Verbose');
+    my $out = $exifTool->Options('TextOut');
+    my ($a, $s, $ch, $length, $buff, $comment);
+    my ($err, $newComment, $setComment);
+    my ($addDirs, %doneDir);
+    my ($frameCount, $delayTime) = (0, 0);
+
+    # verify this is a valid GIF file
+    return 0 unless $raf->Read($buff, 6) == 6
+        and $buff =~ /^GIF(8[79]a)$/
+        and $raf->Read($s, 7) == 7;
+
+    my $ver = $1;
+    my $rtnVal = 0;
+    my $tagTablePtr = GetTagTable('Image::ExifTool::GIF::Main');
+    SetByteOrder('II');
+
+    if ($outfile) {
+        $exifTool->InitWriteDirs(\%gifMap, 'XMP'); # make XMP the preferred group for GIF
+        $addDirs = $exifTool->{ADD_DIRS};
+        # determine if we are editing the File:Comment tag
+        my $delGroup = $exifTool->{DEL_GROUP};
+        if ($$delGroup{File}) {
+            $setComment = 1;
+            if ($$delGroup{File} == 2) {
+                $newComment = $exifTool->GetNewValues('Comment');
+            }
+        } else {
+            my $nvHash;
+            $newComment = $exifTool->GetNewValues('Comment', \$nvHash);
+            $setComment = 1 if $nvHash;
+        }
+        # change to GIF 89a if adding comment or XMP
+        $buff = 'GIF89a' if $$addDirs{XMP} or defined $newComment;
+        Write($outfile, $buff, $s) or $err = 1;
+    } else {
+        $exifTool->SetFileType();   # set file type
+        $exifTool->HandleTag($tagTablePtr, 'GIFVersion', $ver);
+        $exifTool->HandleTag($tagTablePtr, 'ScreenDescriptor', $s);
+    }
+    my $flags = Get8u(\$s, 4);
+    if ($flags & 0x80) { # does this image contain a color table?
+        # calculate color table size
+        $length = 3 * (2 << ($flags & 0x07));
+        $raf->Read($buff, $length) == $length or return 0; # skip color table
+        Write($outfile, $buff) or $err = 1 if $outfile;
+    }
+    # write the comment first if necessary
+    if ($outfile and defined $newComment) {
+        # write comment marker
+        Write($outfile, "\x21\xfe") or $err = 1;
+        $verbose and print $out "  + Comment = $newComment\n";
+        my $len = length($newComment);
+        # write out the comment in 255-byte chunks, each
+        # chunk beginning with a length byte
+        my $n;
+        for ($n=0; $n<$len; $n+=255) {
+            my $size = $len - $n;
+            $size > 255 and $size = 255;
+            my $str = substr($newComment,$n,$size);
+            Write($outfile, pack('C',$size), $str) or $err = 1;
+        }
+        Write($outfile, "\0") or $err = 1;  # empty chunk as terminator
+        undef $newComment;
+        ++$exifTool->{CHANGED};     # increment file changed flag
+    }
+#
+# loop through GIF blocks
+#
+Block:
+    for (;;) {
+        last unless $raf->Read($ch, 1);
+        if ($outfile and ord($ch) != 0x21) {
+            # add application extension containing XMP block if necessary
+            # (this will place XMP before the first non-extension block)
+            if (exists $$addDirs{XMP} and not defined $doneDir{XMP}) {
+                $doneDir{XMP} = 1;
+                # write new XMP data
+                my $xmpTable = GetTagTable('Image::ExifTool::XMP::Main');
+                my %dirInfo = ( Parent => 'GIF' );
+                $verbose and print $out "Creating XMP application extension block:\n";
+                $buff = $exifTool->WriteDirectory(\%dirInfo, $xmpTable);
+                if (defined $buff and length $buff) {
+                    my $lz = pack('C*',1,reverse(0..255),0);
+                    Write($outfile, "\x21\xff\x0bXMP DataXMP", $buff, $lz) or $err = 1;
+                    ++$doneDir{XMP};    # set to 2 to indicate we added XMP
+                } else {
+                    $verbose and print $out "  -> no XMP to add\n";
+                }
+            }
+        }
+        if (ord($ch) == 0x2c) {
+            ++$frameCount;
+            Write($outfile, $ch) or $err = 1 if $outfile;
+            # image descriptor
+            last unless $raf->Read($buff, 8) == 8 and $raf->Read($ch, 1);
+            Write($outfile, $buff, $ch) or $err = 1 if $outfile;
+            if ($verbose) {
+                my ($left, $top, $w, $h) = unpack('v*', $buff);
+                print $out "Image: left=$left top=$top width=$w height=$h\n";
+            }
+            if (ord($ch) & 0x80) { # does color table exist?
+                $length = 3 * (2 << (ord($ch) & 0x07));
+                # skip the color table
+                last unless $raf->Read($buff, $length) == $length;
+                Write($outfile, $buff) or $err = 1 if $outfile;
+            }
+            # skip "LZW Minimum Code Size" byte
+            last unless $raf->Read($buff, 1);
+            Write($outfile,$buff) or $err = 1 if $outfile;
+            # skip image blocks
+            for (;;) {
+                last unless $raf->Read($ch, 1);
+                Write($outfile, $ch) or $err = 1 if $outfile;
+                last unless ord($ch);
+                last unless $raf->Read($buff, ord($ch));
+                Write($outfile,$buff) or $err = 1 if $outfile;
+            }
+            next;  # continue with next field
+        }
+#               last if ord($ch) == 0x3b;  # normal end of GIF marker
+        unless (ord($ch) == 0x21) {
+            if ($outfile) {
+                Write($outfile, $ch) or $err = 1;
+                # copy the rest of the file
+                while ($raf->Read($buff, 65536)) {
+                    Write($outfile, $buff) or $err = 1;
+                }
+            }
+            $rtnVal = 1;
+            last;
+        }
+        # get extension block type/size
+        last unless $raf->Read($s, 2) == 2;
+        # get marker and block size
+        ($a,$length) = unpack("C"x2, $s);
+
+        if ($a == 0xfe) {                           # comment extension
+
+            if ($setComment) {
+                ++$exifTool->{CHANGED}; # increment the changed flag
+            } else {
+                Write($outfile, $ch, $s) or $err = 1 if $outfile;
+            }
+            while ($length) {
+                last unless $raf->Read($buff, $length) == $length;
+                if ($verbose > 2 and not $outfile) {
+                    Image::ExifTool::HexDump(\$buff, undef, Out => $out);
+                }
+                # add buffer to comment string
+                $comment = defined $comment ? $comment . $buff : $buff;
+                last unless $raf->Read($ch, 1);  # read next block header
+                $length = ord($ch);  # get next block size
+
+                # write or delete comment
+                next unless $outfile;
+                if ($setComment) {
+                    $verbose and print $out "  - Comment = $buff\n";
+                } else {
+                    Write($outfile, $buff, $ch) or $err = 1;
+                }
+            }
+            last if $length;    # was a read error if length isn't zero
+            unless ($outfile) {
+                $rtnVal = 1;
+                $exifTool->FoundTag('Comment', $comment) if $comment;
+                undef $comment;
+                # assume no more than one comment in FastScan mode
+                last if $exifTool->Options('FastScan');
+            }
+            next;
+
+        } elsif ($a == 0xff and $length == 0x0b) {  # application extension
+
+            last unless $raf->Read($buff, $length) == $length;
+            if ($verbose) {
+                my @a = unpack('a8a3', $buff);
+                s/\0.*//s foreach @a;
+                print $out "Application Extension: @a\n";
+            }
+            if ($buff eq 'XMP DataXMP') {   # XMP data (ref 2)
+                my $hdr = "$ch$s$buff";
+                # read XMP data
+                my $xmp = '';
+                for (;;) {
+                    $raf->Read($ch, 1) or last Block;   # read next block header
+                    $length = ord($ch) or last;         # get next block size
+                    $raf->Read($buff, $length) == $length or last Block;
+                    $xmp .= $ch . $buff;
+                }
+                # get length of XMP without landing zone data
+                # (note that LZ data may not be exactly the same as what we use)
+                my $xmpLen;
+                if ($xmp =~ /<\?xpacket end=['"][wr]['"]\?>/g) {
+                    $xmpLen = pos($xmp);
+                } else {
+                    $xmpLen = length($xmp);
+                }
+                my %dirInfo = (
+                    DataPt  => \$xmp,
+                    DataLen => length $xmp,
+                    DirLen  => $xmpLen,
+                    Parent  => 'GIF',
+                );
+                my $xmpTable = GetTagTable('Image::ExifTool::XMP::Main');
+                if ($outfile) {
+                    if ($doneDir{XMP} and $doneDir{XMP} > 1) {
+                        $exifTool->Warn('Duplicate XMP block created');
+                    }
+                    my $newXMP = $exifTool->WriteDirectory(\%dirInfo, $xmpTable);
+                    if (not defined $newXMP) {
+                        Write($outfile, $hdr, $xmp) or $err = 1;  # write original XMP
+                        $doneDir{XMP} = 1;
+                    } elsif (length $newXMP) {
+                        if ($newXMP =~ /\0/) { # (check just to be safe)
+                            $exifTool->Error('XMP contained NULL character');
+                        } else {
+                            # write new XMP and landing zone
+                            my $lz = pack('C*',1,reverse(0..255),0);
+                            Write($outfile, $hdr, $newXMP, $lz) or $err = 1;
+                        }
+                        $doneDir{XMP} = 1;
+                    } # else we are deleting the XMP
+                } else {
+                    $exifTool->ProcessDirectory(\%dirInfo, $xmpTable);
+                }
+                next;
+            } elsif ($buff eq 'NETSCAPE2.0') {      # animated GIF extension (ref 3)
+                $raf->Read($buff, 5) == 5 or last;
+                # make sure this contains the expected data
+                if ($buff =~ /^\x03\x01(..)\0$/) {
+                    $exifTool->HandleTag($tagTablePtr, 'AnimationExtension', $buff);
+                }
+                $raf->Seek(-$length-5, 1) or last;  # seek back to start of block
+            } else {
+                $raf->Seek(-$length, 1) or last;
+            }
+
+        } elsif ($a == 0xf9 and $length == 4) {     # graphic control extension
+
+            last unless $raf->Read($buff, $length) == $length;
+            # sum the indivual delay times
+            my $delay = Get16u(\$buff, 1);
+            $delayTime += $delay;
+            $verbose and printf $out "Graphic Control: delay=%.2f\n", $delay / 100;
+            $raf->Seek(-$length, 1) or last;
+
+        } elsif ($a == 0x01 and $length == 12) {    # plain text extension
+
+            last unless $raf->Read($buff, $length) == $length;
+            Write($outfile, $ch, $s, $buff) or $err = 1 if $outfile;
+            if ($verbose) {
+                my ($left, $top, $w, $h) = unpack('v4', $buff);
+                print $out "Text: left=$left top=$top width=$w height=$h\n";
+            }
+            my $text = '';
+            for (;;) {
+                last unless $raf->Read($ch, 1);
+                $length = ord($ch) or last;
+                last unless $raf->Read($buff, $length) == $length;
+                Write($outfile, $ch, $buff) or $err = 1 if $outfile; # write block
+                $text .= $buff;
+            }
+            Write($outfile, "\0") or $err = 1 if $outfile;  # write terminator block
+            $exifTool->HandleTag($tagTablePtr, 'Text', $text);
+            next;
+        }
+        Write($outfile, $ch, $s) or $err = 1 if $outfile;
+        # skip the block
+        while ($length) {
+            last unless $raf->Read($buff, $length) == $length;
+            Write($outfile, $buff) or $err = 1 if $outfile;
+            last unless $raf->Read($ch, 1);  # read next block header
+            Write($outfile, $ch) or $err = 1 if $outfile;
+            $length = ord($ch);  # get next block size
+        }
+    }
+    unless ($outfile) {
+        $exifTool->HandleTag($tagTablePtr, 'FrameCount', $frameCount) if $frameCount > 1;
+        $exifTool->HandleTag($tagTablePtr, 'Duration', $delayTime/100) if $delayTime;
+        # for historical reasons, the GIF Comment tag is in the Extra table
+        $exifTool->FoundTag('Comment', $comment) if $comment;
+    }
+
+    # set return value to -1 if we only had a write error
+    $rtnVal = -1 if $rtnVal and $err;
+    return $rtnVal;
+}
+
+
+1;  #end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::GIF - Read and write GIF meta information
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to read and
+write GIF meta information.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.w3.org/Graphics/GIF/spec-gif89a.txt>
+
+=item L<http://www.adobe.com/devnet/xmp/>
+
+=item L<http://graphcomp.com/info/specs/ani_gif.html>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/GIMP.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/GIMP.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/GIMP.pm	(revision 24799)
@@ -0,0 +1,258 @@
+#------------------------------------------------------------------------------
+# File:         GIMP.pm
+#
+# Description:  Read meta information from GIMP XCF images
+#
+# Revisions:    2010/10/05 - P. Harvey Created
+#
+# References:   1) GIMP source code
+#               2) http://svn.gnome.org/viewvc/gimp/trunk/devel-docs/xcf.txt?view=markup
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::GIMP;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.01';
+
+sub ProcessParasites($$$);
+
+# GIMP XCF properties (ref 2)
+%Image::ExifTool::GIMP::Main = (
+    GROUPS => { 2 => 'Image' },
+    VARS => { ALPHA_FIRST => 1 },
+    NOTES => q{
+        The GNU Image Manipulation Program (GIMP) writes these tags in its native
+        XCF (eXperimental Computing Facilty) images.
+    },
+    header => { SubDirectory => { TagTable => 'Image::ExifTool::GIMP::Header' } },
+    17 => {
+        Name => 'Compression',
+        Format => 'int8u',
+        PrintConv => {
+            0 => 'None',
+            1 => 'RLE Encoding',
+            2 => 'Zlib',
+            3 => 'Fractal',
+        },
+    },
+    19 => {
+        Name => 'Resolution',
+        SubDirectory => { TagTable => 'Image::ExifTool::GIMP::Resolution' },
+    },
+    21 => {
+        Name => 'Parasites',
+        SubDirectory => { TagTable => 'Image::ExifTool::GIMP::Parasite' },
+    },
+);
+
+# information extracted from the XCF file header (ref 2)
+%Image::ExifTool::GIMP::Header = (
+    GROUPS => { 2 => 'Image' },
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    9 => {
+        Name => 'XCFVersion',
+        Format => 'string[5]',
+        PrintConv => {
+            'file' => '0',
+            'v001' => '1',
+            'v002' => '2',
+        },
+    },
+    14 => { Name => 'ImageWidth',  Format => 'int32u' },
+    18 => { Name => 'ImageHeight', Format => 'int32u' },
+    22 => {
+        Name => 'ColorMode',
+        Format => 'int32u',
+        PrintConv => {
+            0 => 'RGB Color',
+            1 => 'Grayscale',
+            2 => 'Indexed Color',
+        },
+    },
+);
+
+# XCF resolution data (property type 19) (ref 2)
+%Image::ExifTool::GIMP::Resolution = (
+    GROUPS => { 2 => 'Image' },
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    FORMAT => 'float',
+    0 => 'XResolution',
+    1 => 'YResolution',
+);
+
+# XCF "Parasite" data (property type 21) (ref 1/PH)
+%Image::ExifTool::GIMP::Parasite = (
+    GROUPS => { 2 => 'Image' },
+    PROCESS_PROC => \&ProcessParasites,
+    'gimp-comment' => {
+        Name => 'Comment',
+        Format => 'string',
+    },
+    'exif-data' => {
+        Name => 'ExifData',
+        SubDirectory => {
+            TagTable    => 'Image::ExifTool::Exif::Main',
+            ProcessProc => \&Image::ExifTool::ProcessTIFF,
+            Start       => 6, # starts after "Exif\0\0" header
+        },
+    },
+    'jpeg-exif-data' => { # (deprecated, untested)
+        Name => 'JPEGExifData',
+        SubDirectory => {
+            TagTable    => 'Image::ExifTool::Exif::Main',
+            ProcessProc => \&Image::ExifTool::ProcessTIFF,
+            Start       => 6,
+        },
+    },
+    'iptc-data' => { # (untested)
+        Name => 'IPTCData',
+        SubDirectory => { TagTable => 'Image::ExifTool::IPTC::Main' },
+    },
+    'icc-profile' => {
+        Name => 'ICC_Profile',
+        SubDirectory => { TagTable => 'Image::ExifTool::ICC_Profile::Main' },
+    },
+    'icc-profile-name' => {
+        Name => 'ICCProfileName',
+        Format => 'string',
+    },
+    'gimp-metadata' => {
+        Name => 'XMP',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::XMP::Main',
+            Start => 10, # starts after "GIMP_XMP_1" header
+        },
+    },
+);
+
+#------------------------------------------------------------------------------
+# Read information in a GIMP XCF parasite data (ref PH)
+# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessParasites($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $unknown = $exifTool->Options('Unknown') || $exifTool->Options('Verbose');
+    my $dataPt = $$dirInfo{DataPt};
+    my $pos = $$dirInfo{DirStart} || 0;
+    my $end = length $$dataPt;
+    $exifTool->VerboseDir('Parasites', undef, $end);
+    for (;;) {
+        last if $pos + 4 > $end;
+        my $size = Get32u($dataPt, $pos);   # length of tag string
+        $pos += 4;
+        last if $pos + $size + 8 > $end;
+        my $tag = substr($$dataPt, $pos, $size);
+        $pos += $size;
+        $tag =~ s/\0.*//s;                  # trim at null terminator
+        # my $flags = Get32u($dataPt, $pos);  (ignore flags)
+        $size = Get32u($dataPt, $pos + 4);  # length of data
+        $pos += 8;
+        last if $pos + $size > $end;
+        if (not $$tagTablePtr{$tag} and $unknown) {
+            my $name = $tag;
+            $name =~ tr/-_A-Za-z0-9//dc;
+            $name =~ s/^gimp-//;
+            next unless length $name;
+            $name = ucfirst $name;
+            $name =~ s/([a-z])-([a-z])/$1\u$2/g;
+            $name = "GIMP-$name" unless length($name) > 1;
+            Image::ExifTool::AddTagToTable($tagTablePtr, $tag, { Name => $name, Unknown => 1 });
+        }
+        $exifTool->HandleTag($tagTablePtr, $tag, undef,
+            DataPt => $dataPt,
+            Start  => $pos,
+            Size   => $size,
+        );
+        $pos += $size;
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Read information in a GIMP XCF document
+# Inputs: 0) ExifTool ref, 1) dirInfo ref
+# Returns: 1 on success, 0 if this wasn't a valid XCF file
+sub ProcessXCF($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my $buff;
+
+    return 0 unless $raf->Read($buff, 26) == 26;
+    return 0 unless $buff =~ /^gimp xcf /;
+
+    my $tagTablePtr = GetTagTable('Image::ExifTool::GIMP::Main');
+    my $verbose = $exifTool->Options('Verbose');
+    $exifTool->SetFileType();
+    SetByteOrder('MM');
+
+    # process the XCF header
+    $exifTool->HandleTag($tagTablePtr, 'header', $buff);
+
+    # loop through image properties
+    for (;;) {
+        $raf->Read($buff, 8) == 8 or last;
+        my $tag  = Get32u(\$buff, 0) or last;
+        my $size = Get32u(\$buff, 4);
+        $verbose and $exifTool->VPrint(0, "XCF property $tag ($size bytes):\n");
+        unless ($$tagTablePtr{$tag}) {
+            $raf->Seek($size, 1);
+            next;
+        }
+        $raf->Read($buff, $size) == $size or last;
+        $exifTool->HandleTag($tagTablePtr, $tag, undef,
+            DataPt  => \$buff,
+            DataPos => $raf->Tell() - $size,
+            Size    => $size,
+        );
+    }
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::GIMP - Read meta information from GIMP XCF images
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to read meta
+information from GIMP (GNU Image Manipulation Program) XCF (eXperimental
+Computing Facility) images.  This is the native image format used by the
+GIMP software.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<GIMP source code>
+
+=item L<http://svn.gnome.org/viewvc/gimp/trunk/devel-docs/xcf.txt?view=markup>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/GIMP Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/GPS.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/GPS.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/GPS.pm	(revision 24799)
@@ -0,0 +1,500 @@
+#------------------------------------------------------------------------------
+# File:         GPS.pm
+#
+# Description:  EXIF GPS meta information tags
+#
+# Revisions:    12/09/2003  - P. Harvey Created
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::GPS;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool::Exif;
+
+$VERSION = '1.34';
+
+my %coordConv = (
+    ValueConv    => 'Image::ExifTool::GPS::ToDegrees($val)',
+    ValueConvInv => 'Image::ExifTool::GPS::ToDMS($self, $val)',
+    PrintConv    => 'Image::ExifTool::GPS::ToDMS($self, $val, 1)',
+    PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val)',
+);
+
+%Image::ExifTool::GPS::Main = (
+    GROUPS => { 0 => 'EXIF', 1 => 'GPS', 2 => 'Location' },
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    WRITABLE => 1,
+    WRITE_GROUP => 'GPS',
+    0x0000 => {
+        Name => 'GPSVersionID',
+        Writable => 'int8u',
+        Mandatory => 1,
+        Count => 4,
+        PrintConv => '$val =~ tr/ /./; $val',
+        PrintConvInv => '$val =~ tr/./ /; $val',
+    },
+    0x0001 => {
+        Name => 'GPSLatitudeRef',
+        Writable => 'string',
+        Count => 2,
+        PrintConv => {
+            # extract N/S if written from Composite:GPSLatitude
+            # (also allow writing from a signed number)
+            OTHER => sub {
+                my ($val, $inv) = @_;
+                return undef unless $inv;
+                return uc $1 if $val =~ /\b([NS])$/i;
+                return $1 eq '-' ? 'S' : 'N' if $val =~ /^([-+]?)\d+(\.\d*)?$/;
+                return undef;
+            },
+            N => 'North',
+            S => 'South',
+        },
+    },
+    0x0002 => {
+        Name => 'GPSLatitude',
+        Writable => 'rational64u',
+        Count => 3,
+        %coordConv,
+    },
+    0x0003 => {
+        Name => 'GPSLongitudeRef',
+        Writable => 'string',
+        Count => 2,
+        PrintConv => {
+            # extract E/W if written from Composite:GPSLongitude
+            # (also allow writing from a signed number)
+            OTHER => sub {
+                my ($val, $inv) = @_;
+                return undef unless $inv;
+                return uc $1 if $val =~ /\b([EW])$/i;
+                return $1 eq '-' ? 'W' : 'E' if $val =~ /^([-+]?)\d+(\.\d*)?$/;
+                return undef;
+            },
+            E => 'East',
+            W => 'West',
+        },
+    },
+    0x0004 => {
+        Name => 'GPSLongitude',
+        Writable => 'rational64u',
+        Count => 3,
+        %coordConv,
+    },
+    0x0005 => {
+        Name => 'GPSAltitudeRef',
+        Writable => 'int8u',
+        PrintConv => {
+            0 => 'Above Sea Level',
+            1 => 'Below Sea Level',
+        },
+    },
+    0x0006 => {
+        Name => 'GPSAltitude',
+        Writable => 'rational64u',
+        # extricate unsigned decimal number from string
+        ValueConvInv => '$val=~/((?=\d|\.\d)\d*(?:\.\d*)?)/ ? $1 : undef',
+        PrintConv => '$val =~ /^(inf|undef)$/ ? $val : "$val m"',
+        PrintConvInv => '$val=~s/\s*m$//;$val',
+    },
+    0x0007 => {
+        Name => 'GPSTimeStamp',
+        Groups => { 2 => 'Time' },
+        Writable => 'rational64u',
+        Count => 3,
+        Shift => 'Time',
+        Notes => q{
+            when writing, date is stripped off if present, and time is adjusted to UTC
+            if it includes a timezone
+        },
+        ValueConv => 'Image::ExifTool::GPS::ConvertTimeStamp($val)',
+        ValueConvInv => '$val=~tr/:/ /;$val',
+        # pull time out of any format date/time string
+        # (converting to UTC if a timezone is given)
+        PrintConvInv => sub {
+            my $v = shift;
+            my @tz;
+            if ($v =~ s/([-+])(.*)//s) {    # remove timezone
+                my $s = $1 eq '-' ? 1 : -1; # opposite sign to convert back to UTC
+                my $t = $2;
+                @tz = ($s*$1, $s*$2) if $t =~ /^(\d{2}):?(\d{2})\s*$/;
+            }
+            my @a = ($v =~ /((?=\d|\.\d)\d*(?:\.\d*)?)/g);
+            push @a, '00' while @a < 3;
+            if (@tz) {
+                # adjust to UTC
+                $a[-2] += $tz[1];
+                $a[-3] += $tz[0];
+                while ($a[-2] >= 60) { $a[-2] -= 60; ++$a[-3] }
+                while ($a[-2] < 0)   { $a[-2] += 60; --$a[-3] }
+                $a[-3] = ($a[-3] + 24) % 24;
+            }
+            return "$a[-3]:$a[-2]:$a[-1]";
+        },
+    },
+    0x0008 => {
+        Name => 'GPSSatellites',
+        Writable => 'string',
+    },
+    0x0009 => {
+        Name => 'GPSStatus',
+        Writable => 'string',
+        Count => 2,
+        PrintConv => {
+            A => 'Measurement Active', # Exif2.2 "Measurement in progress"
+            V => 'Measurement Void',   # Exif2.2 "Measurement Interoperability" (WTF?)
+            # (meaning for 'V' taken from status code in NMEA GLL and RMC sentences)
+        },
+    },
+    0x000a => {
+        Name => 'GPSMeasureMode',
+        Writable => 'string',
+        Count => 2,
+        PrintConv => {
+            2 => '2-Dimensional Measurement',
+            3 => '3-Dimensional Measurement',
+        },
+    },
+    0x000b => {
+        Name => 'GPSDOP',
+        Description => 'GPS Dilution Of Precision',
+        Writable => 'rational64u',
+    },
+    0x000c => {
+        Name => 'GPSSpeedRef',
+        Writable => 'string',
+        Count => 2,
+        PrintConv => {
+            K => 'km/h',
+            M => 'mph',
+            N => 'knots',
+        },
+    },
+    0x000d => {
+        Name => 'GPSSpeed',
+        Writable => 'rational64u',
+    },
+    0x000e => {
+        Name => 'GPSTrackRef',
+        Writable => 'string',
+        Count => 2,
+        PrintConv => {
+            M => 'Magnetic North',
+            T => 'True North',
+        },
+    },
+    0x000f => {
+        Name => 'GPSTrack',
+        Writable => 'rational64u',
+    },
+    0x0010 => {
+        Name => 'GPSImgDirectionRef',
+        Writable => 'string',
+        Count => 2,
+        PrintConv => {
+            M => 'Magnetic North',
+            T => 'True North',
+        },
+    },
+    0x0011 => {
+        Name => 'GPSImgDirection',
+        Writable => 'rational64u',
+    },
+    0x0012 => {
+        Name => 'GPSMapDatum',
+        Writable => 'string',
+    },
+    0x0013 => {
+        Name => 'GPSDestLatitudeRef',
+        Writable => 'string',
+        Count => 2,
+        PrintConv => {
+            N => 'North',
+            S => 'South',
+        },
+    },
+    0x0014 => {
+        Name => 'GPSDestLatitude',
+        Writable => 'rational64u',
+        Count => 3,
+        %coordConv,
+    },
+    0x0015 => {
+        Name => 'GPSDestLongitudeRef',
+        Writable => 'string',
+        Count => 2,
+        PrintConv => {
+            E => 'East',
+            W => 'West',
+        },
+    },
+    0x0016 => {
+        Name => 'GPSDestLongitude',
+        Writable => 'rational64u',
+        Count => 3,
+        %coordConv,
+    },
+    0x0017 => {
+        Name => 'GPSDestBearingRef',
+        Writable => 'string',
+        Count => 2,
+        PrintConv => {
+            M => 'Magnetic North',
+            T => 'True North',
+        },
+    },
+    0x0018 => {
+        Name => 'GPSDestBearing',
+        Writable => 'rational64u',
+    },
+    0x0019 => {
+        Name => 'GPSDestDistanceRef',
+        Writable => 'string',
+        Count => 2,
+        PrintConv => {
+            K => 'Kilometers',
+            M => 'Miles',
+            N => 'Nautical Miles',
+        },
+    },
+    0x001a => {
+        Name => 'GPSDestDistance',
+        Writable => 'rational64u',
+    },
+    0x001b => {
+        Name => 'GPSProcessingMethod',
+        Writable => 'undef',
+        Notes => 'values of "GPS", "CELLID", "WLAN" or "MANUAL" by the EXIF spec.',
+        RawConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val)',
+        RawConvInv => 'Image::ExifTool::Exif::EncodeExifText($self,$val)',
+    },
+    0x001c => {
+        Name => 'GPSAreaInformation',
+        Writable => 'undef',
+        RawConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val)',
+        RawConvInv => 'Image::ExifTool::Exif::EncodeExifText($self,$val)',
+    },
+    0x001d => {
+        Name => 'GPSDateStamp',
+        Groups => { 2 => 'Time' },
+        Writable => 'string',
+        Notes => 'YYYY:mm:dd',
+        Count => 11,
+        Shift => 'Time',
+        Notes => q{
+            when writing, time is stripped off if present, after adjusting date/time to
+            UTC if time includes a timezone
+        },
+        ValueConv => 'Image::ExifTool::Exif::ExifDate($val)',
+        ValueConvInv => '$val',
+        # pull date out of any format date/time string
+        # (and adjust to UTC if this is a full date/time/timezone value)
+        PrintConvInv => q{
+            my $secs;
+            if ($val =~ /[-+]/ and ($secs = Image::ExifTool::GetUnixTime($val, 1))) {
+                $val = Image::ExifTool::ConvertUnixTime($secs);
+            }
+            return $val =~ /(\d{4}).*?(\d{2}).*?(\d{2})/ ? "$1:$2:$3" : undef;
+        },
+    },
+    0x001e => {
+        Name => 'GPSDifferential',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'No Correction',
+            1 => 'Differential Corrected',
+        },
+    },
+    0x001f => {
+        Name => 'GPSHPositioningError',
+        Description => 'GPS Horizontal Positioning Error',
+        PrintConv => '"$val m"',
+        PrintConvInv => '$val=~s/\s*m$//; $val',
+        Writable => 'rational64u',
+    },
+);
+
+# Composite GPS tags
+%Image::ExifTool::GPS::Composite = (
+    GROUPS => { 2 => 'Location' },
+    GPSDateTime => {
+        Description => 'GPS Date/Time',
+        Groups => { 2 => 'Time' },
+        SubDoc => 1,    # generate for all sub-documents
+        Require => {
+            0 => 'GPS:GPSDateStamp',
+            1 => 'GPS:GPSTimeStamp',
+        },
+        ValueConv => '"$val[0] $val[1]Z"',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    # Note: The following tags are used by other modules
+    # which must therefore require this module as necessary
+    GPSLatitude => {
+        SubDoc => 1,    # generate for all sub-documents
+        Require => {
+            0 => 'GPS:GPSLatitude',
+            1 => 'GPS:GPSLatitudeRef',
+        },
+        ValueConv => '$val[1] =~ /^S/i ? -$val[0] : $val[0]',
+        PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")',
+    },
+    GPSLongitude => {
+        SubDoc => 1,    # generate for all sub-documents
+        Require => {
+            0 => 'GPS:GPSLongitude',
+            1 => 'GPS:GPSLongitudeRef',
+        },
+        ValueConv => '$val[1] =~ /^W/i ? -$val[0] : $val[0]',
+        PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
+    },
+    GPSAltitude => {
+        SubDoc => 1,    # generate for all sub-documents
+        Desire => {
+            0 => 'GPS:GPSAltitude',
+            1 => 'GPS:GPSAltitudeRef',
+            2 => 'XMP:GPSAltitude',
+            3 => 'XMP:GPSAltitudeRef',
+        },
+        # Require either GPS:GPSAltitudeRef or XMP:GPSAltitudeRef
+        RawConv => '(defined $val[1] or defined $val[3]) ? $val : undef',
+        ValueConv => q{
+            my $alt = $val[0];
+            $alt = $val[2] unless defined $alt;
+            return undef unless defined $alt;
+            return ($val[1] || $val[3]) ? -$alt : $alt;
+        },
+        PrintConv => q{
+            $val = int($val * 10) / 10;
+            return ($val =~ s/^-// ? "$val m Below" : "$val m Above") . " Sea Level";
+        },
+    },
+);
+
+# add our composite tags
+Image::ExifTool::AddCompositeTags('Image::ExifTool::GPS');
+
+#------------------------------------------------------------------------------
+# Convert GPS timestamp value
+# Inputs: 0) raw timestamp value string
+# Returns: EXIF-formatted time string
+sub ConvertTimeStamp($)
+{
+    my $val = shift;
+    my ($h,$m,$s) = split ' ', $val;
+    my $f = (($h || 0) * 60 + ($m || 0)) * 60 + ($s || 0);
+    $h = int($f / 3600); $f -= $h * 3600;
+    $m = int($f / 60);   $f -= $m * 60;
+    $s = int($f);        $f -= $s;
+    $f = int($f * 1000000 + 0.5);
+    if ($f) {
+        ($f = sprintf(".%.6d", $f)) =~ s/0+$//;
+    } else {
+        $f = ''
+    }
+    return sprintf("%.2d:%.2d:%.2d$f",$h,$m,$s);
+}
+
+#------------------------------------------------------------------------------
+# Convert degrees to DMS, or whatever the current settings are
+# Inputs: 0) ExifTool reference, 1) Value in degrees,
+#         2) format code (0=no format, 1=CoordFormat, 2=XMP format)
+#         3) 'N' or 'E' if sign is significant and N/S/E/W should be added
+# Returns: DMS string
+sub ToDMS($$;$$)
+{
+    my ($exifTool, $val, $doPrintConv, $ref) = @_;
+    my ($fmt, $num);
+
+    if ($ref) {
+        if ($val < 0) {
+            $val = -$val;
+            $ref = {N => 'S', E => 'W'}->{$ref};
+        }
+        $ref = " $ref" unless $doPrintConv and $doPrintConv eq '2';
+    } else {
+        $val = abs($val);
+        $ref = '';
+    }
+    if ($doPrintConv) {
+        if ($doPrintConv eq '1') {
+            $fmt = ($exifTool->Options('CoordFormat') || q{%d deg %d' %.2f"}) . $ref;
+        } else {
+            $fmt = "%d,%.6f$ref";   # use XMP standard format
+        }
+        # count the number of format specifiers
+        $num = ($fmt =~ tr/%/%/);
+    } else {
+        $num = 3;
+    }
+    my ($d, $m, $s);
+    $d = $val;
+    if ($num > 1) {
+        $d = int($d);
+        $m = ($val - $d) * 60;
+        if ($num > 2) {
+            $m = int($m);
+            $s = ($val - $d - $m / 60) * 3600;
+        }
+    }
+    return $doPrintConv ? sprintf($fmt, $d, $m, $s) : "$d $m $s$ref";
+}
+
+#------------------------------------------------------------------------------
+# Convert to decimal degrees
+# Inputs: 0) a string containing 1-3 decimal numbers and any amount of other garbage
+#         1) true if value should be negative if coordinate ends in 'S' or 'W'
+# Returns: Coordinate in degrees
+sub ToDegrees($;$)
+{
+    my ($val, $doSign) = @_;
+    # extract decimal or floating point values out of any other garbage
+    my ($d, $m, $s) = ($val =~ /((?:[+-]?)(?=\d|\.\d)\d*(?:\.\d*)?(?:[Ee][+-]\d+)?)/g);
+    my $deg = ($d || 0) + (($m || 0) + ($s || 0)/60) / 60;
+    # make negative if S or W coordinate
+    $deg = -$deg if $doSign ? $val =~ /[^A-Z](S|W)$/i : $deg < 0;
+    return $deg;
+}
+
+
+1;  #end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::GPS - EXIF GPS meta information tags
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to interpret
+GPS (Global Positioning System) meta information in EXIF data.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<Image::Info|Image::Info>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/GPS Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>,
+L<Image::Info(3pm)|Image::Info>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/GeoTiff.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/GeoTiff.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/GeoTiff.pm	(revision 24799)
@@ -0,0 +1,2187 @@
+#------------------------------------------------------------------------------
+# File:         GeoTiff.pm
+#
+# Description:  Read GeoTiff meta information
+#
+# Revisions:    02/23/2004 - P. Harvey Created
+#               02/25/2004 - P. Harvey Added new codes from libgeotiff-1.2.1
+#               02/01/2007 - P. Harvey Added new codes from libgeotiff-1.2.3
+#
+# Reference:    ftp://ftp.remotesensing.org/geotiff/libgeotiff/libgeotiff-1.1.4.tar.gz
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::GeoTiff;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.07';
+
+# format codes for geoTiff directory entries
+my %geoTiffFormat = (
+    0      => 'int16u',
+    0x87b0 => 'double',
+    0x87b1 => 'string',
+);
+
+my %epsg_units = (
+    9001 => 'Linear Meter',
+    9002 => 'Linear Foot',
+    9003 => 'Linear Foot US Survey',
+    9004 => 'Linear Foot Modified American',
+    9005 => 'Linear Foot Clarke',
+    9006 => 'Linear Foot Indian',
+    9007 => 'Linear Link',
+    9008 => 'Linear Link Benoit',
+    9009 => 'Linear Link Sears',
+    9010 => 'Linear Chain Benoit',
+    9011 => 'Linear Chain Sears',
+    9012 => 'Linear Yard Sears',
+    9013 => 'Linear Yard Indian',
+    9014 => 'Linear Fathom',
+    9015 => 'Linear Mile International Nautical',
+    9101 => 'Angular Radian',
+    9102 => 'Angular Degree',
+    9103 => 'Angular Arc Minute',
+    9104 => 'Angular Arc Second',
+    9105 => 'Angular Grad',
+    9106 => 'Angular Gon',
+    9107 => 'Angular DMS',
+    9108 => 'Angular DMS Hemisphere',
+    32767 => 'User Defined',
+);
+
+%Image::ExifTool::GeoTiff::Main = (
+    GROUPS => { 2 => 'Location' },
+    1 => {
+        # this isn't a real GeoTiff key, but put it here
+        # so it will appear in tag lists since we generate it below
+        Name => 'GeoTiffVersion',
+    },
+    1024 => {
+        Name => 'GTModelType',
+        PrintConv => {
+            1 => 'Projected',
+            2 => 'Geographic',
+            3 => 'Geocentric',
+            32767 => 'User Defined',
+        },
+    },
+    1025 => {
+        Name => 'GTRasterType',
+        PrintConv => {
+            1 => 'Pixel Is Area',
+            2 => 'Pixel Is Point',
+            32767 => 'User Defined',
+        },
+    },
+    1026 => 'GTCitation',
+    2048 => {
+        Name => 'GeographicType',
+        PrintConv => {
+            # epsg_gcs
+            4001 => 'Airy 1830',
+            4002 => 'Airy Modified 1849',
+            4003 => 'Australian National Spheroid',
+            4004 => 'Bessel 1841',
+            4005 => 'Bessel Modified',
+            4006 => 'Bessel Namibia',
+            4007 => 'Clarke 1858',
+            4008 => 'Clarke 1866',
+            4009 => 'Clarke 1866 Michigan',
+            4010 => 'Clarke 1880 Benoit',
+            4011 => 'Clarke 1880 IGN',
+            4012 => 'Clarke 1880 RGS',
+            4013 => 'Clarke 1880 Arc',
+            4014 => 'Clarke 1880 SGA 1922',
+            4015 => 'Everest 1830 1937 Adjustment',
+            4016 => 'Everest 1830 1967 Definition',
+            4017 => 'Everest 1830 1975 Definition',
+            4018 => 'Everest 1830 Modified',
+            4019 => 'GRS 1980',
+            4020 => 'Helmert 1906',
+            4021 => 'Indonesian National Spheroid',
+            4022 => 'International 1924',
+            4023 => 'International 1967',
+            4024 => 'Krassowsky 1940',
+            4025 => 'NWL9D',
+            4026 => 'NWL10D',
+            4027 => 'Plessis 1817',
+            4028 => 'Struve 1860',
+            4029 => 'War Office',
+            4030 => 'WGS84',
+            4031 => 'GEM10C',
+            4032 => 'OSU86F',
+            4033 => 'OSU91A',
+            4034 => 'Clarke 1880',
+            4035 => 'Sphere',
+            4120 => 'Greek',
+            4121 => 'GGRS87',
+            4123 => 'KKJ',
+            4124 => 'RT90',
+            4133 => 'EST92',
+            4815 => 'Greek Athens',
+            4201 => 'Adindan',
+            4202 => 'AGD66',
+            4203 => 'AGD84',
+            4204 => 'Ain el Abd',
+            4205 => 'Afgooye',
+            4206 => 'Agadez',
+            4207 => 'Lisbon',
+            4208 => 'Aratu',
+            4209 => 'Arc 1950',
+            4210 => 'Arc 1960',
+            4211 => 'Batavia',
+            4212 => 'Barbados',
+            4213 => 'Beduaram',
+            4214 => 'Beijing 1954',
+            4215 => 'Belge 1950',
+            4216 => 'Bermuda 1957',
+            4217 => 'Bern 1898',
+            4218 => 'Bogota',
+            4219 => 'Bukit Rimpah',
+            4220 => 'Camacupa',
+            4221 => 'Campo Inchauspe',
+            4222 => 'Cape',
+            4223 => 'Carthage',
+            4224 => 'Chua',
+            4225 => 'Corrego Alegre',
+            4226 => 'Cote d Ivoire',
+            4227 => 'Deir ez Zor',
+            4228 => 'Douala',
+            4229 => 'Egypt 1907',
+            4230 => 'ED50',
+            4231 => 'ED87',
+            4232 => 'Fahud',
+            4233 => 'Gandajika 1970',
+            4234 => 'Garoua',
+            4235 => 'Guyane Francaise',
+            4236 => 'Hu Tzu Shan',
+            4237 => 'HD72',
+            4238 => 'ID74',
+            4239 => 'Indian 1954',
+            4240 => 'Indian 1975',
+            4241 => 'Jamaica 1875',
+            4242 => 'JAD69',
+            4243 => 'Kalianpur',
+            4244 => 'Kandawala',
+            4245 => 'Kertau',
+            4246 => 'KOC',
+            4247 => 'La Canoa',
+            4248 => 'PSAD56',
+            4249 => 'Lake',
+            4250 => 'Leigon',
+            4251 => 'Liberia 1964',
+            4252 => 'Lome',
+            4253 => 'Luzon 1911',
+            4254 => 'Hito XVIII 1963',
+            4255 => 'Herat North',
+            4256 => 'Mahe 1971',
+            4257 => 'Makassar',
+            4258 => 'EUREF89',
+            4259 => 'Malongo 1987',
+            4260 => 'Manoca',
+            4261 => 'Merchich',
+            4262 => 'Massawa',
+            4263 => 'Minna',
+            4264 => 'Mhast',
+            4265 => 'Monte Mario',
+            4266 => 'M poraloko',
+            4267 => 'NAD27',
+            4268 => 'NAD Michigan',
+            4269 => 'NAD83',
+            4270 => 'Nahrwan 1967',
+            4271 => 'Naparima 1972',
+            4272 => 'GD49',
+            4273 => 'NGO 1948',
+            4274 => '73',
+            4275 => 'NTF',
+            4276 => 'NSWC 9Z 2',
+            4277 => 'OSGB 1936',
+            4278 => 'OSGB70',
+            4279 => 'OS SN80',
+            4280 => 'Padang',
+            4281 => 'Palestine 1923',
+            4282 => 'Pointe Noire',
+            4283 => 'GDA94',
+            4284 => 'Pulkovo 1942',
+            4285 => 'Qatar',
+            4286 => 'Qatar 1948',
+            4287 => 'Qornoq',
+            4288 => 'Loma Quintana',
+            4289 => 'Amersfoort',
+            4290 => 'RT38',
+            4291 => 'SAD69',
+            4292 => 'Sapper Hill 1943',
+            4293 => 'Schwarzeck',
+            4294 => 'Segora',
+            4295 => 'Serindung',
+            4296 => 'Sudan',
+            4297 => 'Tananarive',
+            4298 => 'Timbalai 1948',
+            4299 => 'TM65',
+            4300 => 'TM75',
+            4301 => 'Tokyo',
+            4302 => 'Trinidad 1903',
+            4303 => 'TC 1948',
+            4304 => 'Voirol 1875',
+            4305 => 'Voirol Unifie',
+            4306 => 'Bern 1938',
+            4307 => 'Nord Sahara 1959',
+            4308 => 'Stockholm 1938',
+            4309 => 'Yacare',
+            4310 => 'Yoff',
+            4311 => 'Zanderij',
+            4312 => 'MGI',
+            4313 => 'Belge 1972',
+            4314 => 'DHDN',
+            4315 => 'Conakry 1905',
+            4317 => 'Dealul Piscului 1970',
+            4322 => 'WGS 72',
+            4324 => 'WGS 72BE',
+            4326 => 'WGS 84',
+            4801 => 'Bern 1898 Bern',
+            4802 => 'Bogota Bogota',
+            4803 => 'Lisbon Lisbon',
+            4804 => 'Makassar Jakarta',
+            4805 => 'MGI Ferro',
+            4806 => 'Monte Mario Rome',
+            4807 => 'NTF Paris',
+            4808 => 'Padang Jakarta',
+            4809 => 'Belge 1950 Brussels',
+            4810 => 'Tananarive Paris',
+            4811 => 'Voirol 1875 Paris',
+            4812 => 'Voirol Unifie Paris',
+            4813 => 'Batavia Jakarta',
+            4901 => 'ATF Paris',
+            4902 => 'NDG Paris',
+            32767 => 'User Defined',
+        },
+    },
+    2049 => 'GeogCitation',
+    2050 => {
+        Name => 'GeogGeodeticDatum',
+        PrintConv => {
+            # epsg_datum,
+            6001 => 'Airy 1830',
+            6002 => 'Airy Modified 1849',
+            6003 => 'Australian National Spheroid',
+            6004 => 'Bessel 1841',
+            6005 => 'Bessel Modified',
+            6006 => 'Bessel Namibia',
+            6007 => 'Clarke 1858',
+            6008 => 'Clarke 1866',
+            6009 => 'Clarke 1866 Michigan',
+            6010 => 'Clarke 1880 Benoit',
+            6011 => 'Clarke 1880 IGN',
+            6012 => 'Clarke 1880 RGS',
+            6013 => 'Clarke 1880 Arc',
+            6014 => 'Clarke 1880 SGA 1922',
+            6015 => 'Everest 1830 1937 Adjustment',
+            6016 => 'Everest 1830 1967 Definition',
+            6017 => 'Everest 1830 1975 Definition',
+            6018 => 'Everest 1830 Modified',
+            6019 => 'GRS 1980',
+            6020 => 'Helmert 1906',
+            6021 => 'Indonesian National Spheroid',
+            6022 => 'International 1924',
+            6023 => 'International 1967',
+            6024 => 'Krassowsky 1960',
+            6025 => 'NWL9D',
+            6026 => 'NWL10D',
+            6027 => 'Plessis 1817',
+            6028 => 'Struve 1860',
+            6029 => 'War Office',
+            6030 => 'WGS84',
+            6031 => 'GEM10C',
+            6032 => 'OSU86F',
+            6033 => 'OSU91A',
+            6034 => 'Clarke 1880',
+            6035 => 'Sphere',
+            6201 => 'Adindan',
+            6202 => 'Australian Geodetic Datum 1966',
+            6203 => 'Australian Geodetic Datum 1984',
+            6204 => 'Ain el Abd 1970',
+            6205 => 'Afgooye',
+            6206 => 'Agadez',
+            6207 => 'Lisbon',
+            6208 => 'Aratu',
+            6209 => 'Arc 1950',
+            6210 => 'Arc 1960',
+            6211 => 'Batavia',
+            6212 => 'Barbados',
+            6213 => 'Beduaram',
+            6214 => 'Beijing 1954',
+            6215 => 'Reseau National Belge 1950',
+            6216 => 'Bermuda 1957',
+            6217 => 'Bern 1898',
+            6218 => 'Bogota',
+            6219 => 'Bukit Rimpah',
+            6220 => 'Camacupa',
+            6221 => 'Campo Inchauspe',
+            6222 => 'Cape',
+            6223 => 'Carthage',
+            6224 => 'Chua',
+            6225 => 'Corrego Alegre',
+            6226 => 'Cote d Ivoire',
+            6227 => 'Deir ez Zor',
+            6228 => 'Douala',
+            6229 => 'Egypt 1907',
+            6230 => 'European Datum 1950',
+            6231 => 'European Datum 1987',
+            6232 => 'Fahud',
+            6233 => 'Gandajika 1970',
+            6234 => 'Garoua',
+            6235 => 'Guyane Francaise',
+            6236 => 'Hu Tzu Shan',
+            6237 => 'Hungarian Datum 1972',
+            6238 => 'Indonesian Datum 1974',
+            6239 => 'Indian 1954',
+            6240 => 'Indian 1975',
+            6241 => 'Jamaica 1875',
+            6242 => 'Jamaica 1969',
+            6243 => 'Kalianpur',
+            6244 => 'Kandawala',
+            6245 => 'Kertau',
+            6246 => 'Kuwait Oil Company',
+            6247 => 'La Canoa',
+            6248 => 'Provisional S American Datum 1956',
+            6249 => 'Lake',
+            6250 => 'Leigon',
+            6251 => 'Liberia 1964',
+            6252 => 'Lome',
+            6253 => 'Luzon 1911',
+            6254 => 'Hito XVIII 1963',
+            6255 => 'Herat North',
+            6256 => 'Mahe 1971',
+            6257 => 'Makassar',
+            6258 => 'European Reference System 1989',
+            6259 => 'Malongo 1987',
+            6260 => 'Manoca',
+            6261 => 'Merchich',
+            6262 => 'Massawa',
+            6263 => 'Minna',
+            6264 => 'Mhast',
+            6265 => 'Monte Mario',
+            6266 => 'M poraloko',
+            6267 => 'North American Datum 1927',
+            6268 => 'NAD Michigan',
+            6269 => 'North American Datum 1983',
+            6270 => 'Nahrwan 1967',
+            6271 => 'Naparima 1972',
+            6272 => 'New Zealand Geodetic Datum 1949',
+            6273 => 'NGO 1948',
+            6274 => 'Datum 73',
+            6275 => 'Nouvelle Triangulation Francaise',
+            6276 => 'NSWC 9Z 2',
+            6277 => 'OSGB 1936',
+            6278 => 'OSGB 1970 SN',
+            6279 => 'OS SN 1980',
+            6280 => 'Padang 1884',
+            6281 => 'Palestine 1923',
+            6282 => 'Pointe Noire',
+            6283 => 'Geocentric Datum of Australia 1994',
+            6284 => 'Pulkovo 1942',
+            6285 => 'Qatar',
+            6286 => 'Qatar 1948',
+            6287 => 'Qornoq',
+            6288 => 'Loma Quintana',
+            6289 => 'Amersfoort',
+            6290 => 'RT38',
+            6291 => 'South American Datum 1969',
+            6292 => 'Sapper Hill 1943',
+            6293 => 'Schwarzeck',
+            6294 => 'Segora',
+            6295 => 'Serindung',
+            6296 => 'Sudan',
+            6297 => 'Tananarive 1925',
+            6298 => 'Timbalai 1948',
+            6299 => 'TM65',
+            6300 => 'TM75',
+            6301 => 'Tokyo',
+            6302 => 'Trinidad 1903',
+            6303 => 'Trucial Coast 1948',
+            6304 => 'Voirol 1875',
+            6305 => 'Voirol Unifie 1960',
+            6306 => 'Bern 1938',
+            6307 => 'Nord Sahara 1959',
+            6308 => 'Stockholm 1938',
+            6309 => 'Yacare',
+            6310 => 'Yoff',
+            6311 => 'Zanderij',
+            6312 => 'Militar Geographische Institut',
+            6313 => 'Reseau National Belge 1972',
+            6314 => 'Deutsche Hauptdreiecksnetz',
+            6315 => 'Conakry 1905',
+            6317 => 'Dealul Piscului 1970',
+            6322 => 'WGS72',
+            6324 => 'WGS72 Transit Broadcast Ephemeris',
+            6326 => 'WGS84',
+            6901 => 'Ancienne Triangulation Francaise',
+            6902 => 'Nord de Guerre',
+            32767 => 'User Defined',
+        },
+    },
+    2051 => {
+        Name => 'GeogPrimeMeridian',
+        PrintConv => {
+            # epsg_pm
+            8901 => 'Greenwich',
+            8902 => 'Lisbon',
+            8903 => 'Paris',
+            8904 => 'Bogota',
+            8905 => 'Madrid',
+            8906 => 'Rome',
+            8907 => 'Bern',
+            8908 => 'Jakarta',
+            8909 => 'Ferro',
+            8910 => 'Brussels',
+            8911 => 'Stockholm',
+            32767 => 'User Defined',
+        },
+    },
+    2052 => {
+        Name => 'GeogLinearUnits',
+        SeparateTable => 'Units',
+        PrintConv => \%epsg_units,
+    },
+    2053 => 'GeogLinearUnitSize',
+    2054 => {
+        Name => 'GeogAngularUnits',
+        SeparateTable => 'Units',
+        PrintConv => \%epsg_units,
+    },
+    2055 => 'GeogAngularUnitSize',
+    2056 => {
+        Name => 'GeogEllipsoid',
+        PrintConv => {
+            # epsg_ellipse
+            7001 => 'Airy 1830',
+            7002 => 'Airy Modified 1849',
+            7003 => 'Australian National Spheroid',
+            7004 => 'Bessel 1841',
+            7005 => 'Bessel Modified',
+            7006 => 'Bessel Namibia',
+            7007 => 'Clarke 1858',
+            7008 => 'Clarke 1866',
+            7009 => 'Clarke 1866 Michigan',
+            7010 => 'Clarke 1880 Benoit',
+            7011 => 'Clarke 1880 IGN',
+            7012 => 'Clarke 1880 RGS',
+            7013 => 'Clarke 1880 Arc',
+            7014 => 'Clarke 1880 SGA 1922',
+            7015 => 'Everest 1830 1937 Adjustment',
+            7016 => 'Everest 1830 1967 Definition',
+            7017 => 'Everest 1830 1975 Definition',
+            7018 => 'Everest 1830 Modified',
+            7019 => 'GRS 1980',
+            7020 => 'Helmert 1906',
+            7021 => 'Indonesian National Spheroid',
+            7022 => 'International 1924',
+            7023 => 'International 1967',
+            7024 => 'Krassowsky 1940',
+            7025 => 'NWL 9D',
+            7026 => 'NWL 10D',
+            7027 => 'Plessis 1817',
+            7028 => 'Struve 1860',
+            7029 => 'War Office',
+            7030 => 'WGS 84',
+            7031 => 'GEM 10C',
+            7032 => 'OSU86F',
+            7033 => 'OSU91A',
+            7034 => 'Clarke 1880',
+            7035 => 'Sphere',
+            32767 => 'User Defined',
+        },
+    },
+    2057 => 'GeogSemiMajorAxis',
+    2058 => 'GeogSemiMinorAxis',
+    2059 => 'GeogInvFlattening',
+    2060 => {
+        Name => 'GeogAzimuthUnits',
+        SeparateTable => 'Units',
+        PrintConv => \%epsg_units,
+    },
+    2061 => 'GeogPrimeMeridianLong',
+    3072 => {
+        Name => 'ProjectedCSType',
+        PrintConv => {
+            # epsg_pcs
+            2100 => 'GGRS87 Greek Grid',
+            2176 => 'ETRS89 Poland CS2000 zone 5',
+            2177 => 'ETRS89 Poland CS2000 zone 6',
+            2177 => 'ETRS89 Poland CS2000 zone 7',
+            2178 => 'ETRS89 Poland CS2000 zone 8',
+            2180 => 'ETRS89 Poland CS92',
+            2204 => 'NAD27 Tennessee',
+            2205 => 'NAD83 Kentucky North',
+            2391 => 'KKJ Finland zone 1',
+            2392 => 'KKJ Finland zone 2',
+            2393 => 'KKJ Finland zone 3',
+            2394 => 'KKJ Finland zone 4',
+            2400 => 'RT90 2 5 gon W',
+            2600 => 'Lietuvos Koordinoei Sistema 1994',
+            3053 => 'Hjorsey 1955 Lambert',
+            3057 => 'ISN93 Lambert 1993',
+            3300 => 'Estonian Coordinate System of 1992',
+            20137 => 'Adindan UTM zone 37N',
+            20138 => 'Adindan UTM zone 38N',
+            20248 => 'AGD66 AMG zone 48',
+            20249 => 'AGD66 AMG zone 49',
+            20250 => 'AGD66 AMG zone 50',
+            20251 => 'AGD66 AMG zone 51',
+            20252 => 'AGD66 AMG zone 52',
+            20253 => 'AGD66 AMG zone 53',
+            20254 => 'AGD66 AMG zone 54',
+            20255 => 'AGD66 AMG zone 55',
+            20256 => 'AGD66 AMG zone 56',
+            20257 => 'AGD66 AMG zone 57',
+            20258 => 'AGD66 AMG zone 58',
+            20348 => 'AGD84 AMG zone 48',
+            20349 => 'AGD84 AMG zone 49',
+            20350 => 'AGD84 AMG zone 50',
+            20351 => 'AGD84 AMG zone 51',
+            20352 => 'AGD84 AMG zone 52',
+            20353 => 'AGD84 AMG zone 53',
+            20354 => 'AGD84 AMG zone 54',
+            20355 => 'AGD84 AMG zone 55',
+            20356 => 'AGD84 AMG zone 56',
+            20357 => 'AGD84 AMG zone 57',
+            20358 => 'AGD84 AMG zone 58',
+            20437 => 'Ain el Abd UTM zone 37N',
+            20438 => 'Ain el Abd UTM zone 38N',
+            20439 => 'Ain el Abd UTM zone 39N',
+            20499 => 'Ain el Abd Bahrain Grid',
+            20538 => 'Afgooye UTM zone 38N',
+            20539 => 'Afgooye UTM zone 39N',
+            20700 => 'Lisbon Portugese Grid',
+            20822 => 'Aratu UTM zone 22S',
+            20823 => 'Aratu UTM zone 23S',
+            20824 => 'Aratu UTM zone 24S',
+            20973 => 'Arc 1950 Lo13',
+            20975 => 'Arc 1950 Lo15',
+            20977 => 'Arc 1950 Lo17',
+            20979 => 'Arc 1950 Lo19',
+            20981 => 'Arc 1950 Lo21',
+            20983 => 'Arc 1950 Lo23',
+            20985 => 'Arc 1950 Lo25',
+            20987 => 'Arc 1950 Lo27',
+            20989 => 'Arc 1950 Lo29',
+            20991 => 'Arc 1950 Lo31',
+            20993 => 'Arc 1950 Lo33',
+            20995 => 'Arc 1950 Lo35',
+            21100 => 'Batavia NEIEZ',
+            21148 => 'Batavia UTM zone 48S',
+            21149 => 'Batavia UTM zone 49S',
+            21150 => 'Batavia UTM zone 50S',
+            21413 => 'Beijing Gauss zone 13',
+            21414 => 'Beijing Gauss zone 14',
+            21415 => 'Beijing Gauss zone 15',
+            21416 => 'Beijing Gauss zone 16',
+            21417 => 'Beijing Gauss zone 17',
+            21418 => 'Beijing Gauss zone 18',
+            21419 => 'Beijing Gauss zone 19',
+            21420 => 'Beijing Gauss zone 20',
+            21421 => 'Beijing Gauss zone 21',
+            21422 => 'Beijing Gauss zone 22',
+            21423 => 'Beijing Gauss zone 23',
+            21473 => 'Beijing Gauss 13N',
+            21474 => 'Beijing Gauss 14N',
+            21475 => 'Beijing Gauss 15N',
+            21476 => 'Beijing Gauss 16N',
+            21477 => 'Beijing Gauss 17N',
+            21478 => 'Beijing Gauss 18N',
+            21479 => 'Beijing Gauss 19N',
+            21480 => 'Beijing Gauss 20N',
+            21481 => 'Beijing Gauss 21N',
+            21482 => 'Beijing Gauss 22N',
+            21483 => 'Beijing Gauss 23N',
+            21500 => 'Belge Lambert 50',
+            21790 => 'Bern 1898 Swiss Old',
+            21817 => 'Bogota UTM zone 17N',
+            21818 => 'Bogota UTM zone 18N',
+            21891 => 'Bogota Colombia 3W',
+            21892 => 'Bogota Colombia Bogota',
+            21893 => 'Bogota Colombia 3E',
+            21894 => 'Bogota Colombia 6E',
+            22032 => 'Camacupa UTM 32S',
+            22033 => 'Camacupa UTM 33S',
+            22191 => 'C Inchauspe Argentina 1',
+            22192 => 'C Inchauspe Argentina 2',
+            22193 => 'C Inchauspe Argentina 3',
+            22194 => 'C Inchauspe Argentina 4',
+            22195 => 'C Inchauspe Argentina 5',
+            22196 => 'C Inchauspe Argentina 6',
+            22197 => 'C Inchauspe Argentina 7',
+            22332 => 'Carthage UTM zone 32N',
+            22391 => 'Carthage Nord Tunisie',
+            22392 => 'Carthage Sud Tunisie',
+            22523 => 'Corrego Alegre UTM 23S',
+            22524 => 'Corrego Alegre UTM 24S',
+            22832 => 'Douala UTM zone 32N',
+            22992 => 'Egypt 1907 Red Belt',
+            22993 => 'Egypt 1907 Purple Belt',
+            22994 => 'Egypt 1907 Ext Purple',
+            23028 => 'ED50 UTM zone 28N',
+            23029 => 'ED50 UTM zone 29N',
+            23030 => 'ED50 UTM zone 30N',
+            23031 => 'ED50 UTM zone 31N',
+            23032 => 'ED50 UTM zone 32N',
+            23033 => 'ED50 UTM zone 33N',
+            23034 => 'ED50 UTM zone 34N',
+            23035 => 'ED50 UTM zone 35N',
+            23036 => 'ED50 UTM zone 36N',
+            23037 => 'ED50 UTM zone 37N',
+            23038 => 'ED50 UTM zone 38N',
+            23239 => 'Fahud UTM zone 39N',
+            23240 => 'Fahud UTM zone 40N',
+            23433 => 'Garoua UTM zone 33N',
+            23700 => 'HD72 EOV',
+            23846 => 'ID74 UTM zone 46N',
+            23847 => 'ID74 UTM zone 47N',
+            23848 => 'ID74 UTM zone 48N',
+            23849 => 'ID74 UTM zone 49N',
+            23850 => 'ID74 UTM zone 50N',
+            23851 => 'ID74 UTM zone 51N',
+            23852 => 'ID74 UTM zone 52N',
+            23853 => 'ID74 UTM zone 53N',
+            23886 => 'ID74 UTM zone 46S',
+            23887 => 'ID74 UTM zone 47S',
+            23888 => 'ID74 UTM zone 48S',
+            23889 => 'ID74 UTM zone 49S',
+            23890 => 'ID74 UTM zone 50S',
+            23891 => 'ID74 UTM zone 51S',
+            23892 => 'ID74 UTM zone 52S',
+            23893 => 'ID74 UTM zone 53S',
+            23894 => 'ID74 UTM zone 54S',
+            23947 => 'Indian 1954 UTM 47N',
+            23948 => 'Indian 1954 UTM 48N',
+            24047 => 'Indian 1975 UTM 47N',
+            24048 => 'Indian 1975 UTM 48N',
+            24100 => 'Jamaica 1875 Old Grid',
+            24200 => 'JAD69 Jamaica Grid',
+            24370 => 'Kalianpur India 0',
+            24371 => 'Kalianpur India I',
+            24372 => 'Kalianpur India IIa',
+            24373 => 'Kalianpur India IIIa',
+            24374 => 'Kalianpur India IVa',
+            24382 => 'Kalianpur India IIb',
+            24383 => 'Kalianpur India IIIb',
+            24384 => 'Kalianpur India IVb',
+            24500 => 'Kertau Singapore Grid',
+            24547 => 'Kertau UTM zone 47N',
+            24548 => 'Kertau UTM zone 48N',
+            24720 => 'La Canoa UTM zone 20N',
+            24721 => 'La Canoa UTM zone 21N',
+            24818 => 'PSAD56 UTM zone 18N',
+            24819 => 'PSAD56 UTM zone 19N',
+            24820 => 'PSAD56 UTM zone 20N',
+            24821 => 'PSAD56 UTM zone 21N',
+            24877 => 'PSAD56 UTM zone 17S',
+            24878 => 'PSAD56 UTM zone 18S',
+            24879 => 'PSAD56 UTM zone 19S',
+            24880 => 'PSAD56 UTM zone 20S',
+            24891 => 'PSAD56 Peru west zone',
+            24892 => 'PSAD56 Peru central',
+            24893 => 'PSAD56 Peru east zone',
+            25000 => 'Leigon Ghana Grid',
+            25231 => 'Lome UTM zone 31N',
+            25391 => 'Luzon Philippines I',
+            25392 => 'Luzon Philippines II',
+            25393 => 'Luzon Philippines III',
+            25394 => 'Luzon Philippines IV',
+            25395 => 'Luzon Philippines V',
+            25700 => 'Makassar NEIEZ',
+            25932 => 'Malongo 1987 UTM 32S',
+            26191 => 'Merchich Nord Maroc',
+            26192 => 'Merchich Sud Maroc',
+            26193 => 'Merchich Sahara',
+            26237 => 'Massawa UTM zone 37N',
+            26331 => 'Minna UTM zone 31N',
+            26332 => 'Minna UTM zone 32N',
+            26391 => 'Minna Nigeria West',
+            26392 => 'Minna Nigeria Mid Belt',
+            26393 => 'Minna Nigeria East',
+            26432 => 'Mhast UTM zone 32S',
+            26591 => 'Monte Mario Italy 1',
+            26592 => 'Monte Mario Italy 2',
+            26632 => 'M poraloko UTM 32N',
+            26692 => 'M poraloko UTM 32S',
+            26703 => 'NAD27 UTM zone 3N',
+            26704 => 'NAD27 UTM zone 4N',
+            26705 => 'NAD27 UTM zone 5N',
+            26706 => 'NAD27 UTM zone 6N',
+            26707 => 'NAD27 UTM zone 7N',
+            26708 => 'NAD27 UTM zone 8N',
+            26709 => 'NAD27 UTM zone 9N',
+            26710 => 'NAD27 UTM zone 10N',
+            26711 => 'NAD27 UTM zone 11N',
+            26712 => 'NAD27 UTM zone 12N',
+            26713 => 'NAD27 UTM zone 13N',
+            26714 => 'NAD27 UTM zone 14N',
+            26715 => 'NAD27 UTM zone 15N',
+            26716 => 'NAD27 UTM zone 16N',
+            26717 => 'NAD27 UTM zone 17N',
+            26718 => 'NAD27 UTM zone 18N',
+            26719 => 'NAD27 UTM zone 19N',
+            26720 => 'NAD27 UTM zone 20N',
+            26721 => 'NAD27 UTM zone 21N',
+            26722 => 'NAD27 UTM zone 22N',
+            26729 => 'NAD27 Alabama East',
+            26730 => 'NAD27 Alabama West',
+            26731 => 'NAD27 Alaska zone 1',
+            26732 => 'NAD27 Alaska zone 2',
+            26733 => 'NAD27 Alaska zone 3',
+            26734 => 'NAD27 Alaska zone 4',
+            26735 => 'NAD27 Alaska zone 5',
+            26736 => 'NAD27 Alaska zone 6',
+            26737 => 'NAD27 Alaska zone 7',
+            26738 => 'NAD27 Alaska zone 8',
+            26739 => 'NAD27 Alaska zone 9',
+            26740 => 'NAD27 Alaska zone 10',
+            26741 => 'NAD27 California I',
+            26742 => 'NAD27 California II',
+            26743 => 'NAD27 California III',
+            26744 => 'NAD27 California IV',
+            26745 => 'NAD27 California V',
+            26746 => 'NAD27 California VI',
+            26747 => 'NAD27 California VII',
+            26748 => 'NAD27 Arizona East',
+            26749 => 'NAD27 Arizona Central',
+            26750 => 'NAD27 Arizona West',
+            26751 => 'NAD27 Arkansas North',
+            26752 => 'NAD27 Arkansas South',
+            26753 => 'NAD27 Colorado North',
+            26754 => 'NAD27 Colorado Central',
+            26755 => 'NAD27 Colorado South',
+            26756 => 'NAD27 Connecticut',
+            26757 => 'NAD27 Delaware',
+            26758 => 'NAD27 Florida East',
+            26759 => 'NAD27 Florida West',
+            26760 => 'NAD27 Florida North',
+            26761 => 'NAD27 Hawaii zone 1',
+            26762 => 'NAD27 Hawaii zone 2',
+            26763 => 'NAD27 Hawaii zone 3',
+            26764 => 'NAD27 Hawaii zone 4',
+            26765 => 'NAD27 Hawaii zone 5',
+            26766 => 'NAD27 Georgia East',
+            26767 => 'NAD27 Georgia West',
+            26768 => 'NAD27 Idaho East',
+            26769 => 'NAD27 Idaho Central',
+            26770 => 'NAD27 Idaho West',
+            26771 => 'NAD27 Illinois East',
+            26772 => 'NAD27 Illinois West',
+            26773 => 'NAD27 Indiana East',
+            26774 => 'NAD27 BLM 14N feet',
+            26774 => 'NAD27 Indiana West',
+            26775 => 'NAD27 BLM 15N feet',
+            26775 => 'NAD27 Iowa North',
+            26776 => 'NAD27 BLM 16N feet',
+            26776 => 'NAD27 Iowa South',
+            26777 => 'NAD27 BLM 17N feet',
+            26777 => 'NAD27 Kansas North',
+            26778 => 'NAD27 Kansas South',
+            26779 => 'NAD27 Kentucky North',
+            26780 => 'NAD27 Kentucky South',
+            26781 => 'NAD27 Louisiana North',
+            26782 => 'NAD27 Louisiana South',
+            26783 => 'NAD27 Maine East',
+            26784 => 'NAD27 Maine West',
+            26785 => 'NAD27 Maryland',
+            26786 => 'NAD27 Massachusetts',
+            26787 => 'NAD27 Massachusetts Is',
+            26788 => 'NAD27 Michigan North',
+            26789 => 'NAD27 Michigan Central',
+            26790 => 'NAD27 Michigan South',
+            26791 => 'NAD27 Minnesota North',
+            26792 => 'NAD27 Minnesota Cent',
+            26793 => 'NAD27 Minnesota South',
+            26794 => 'NAD27 Mississippi East',
+            26795 => 'NAD27 Mississippi West',
+            26796 => 'NAD27 Missouri East',
+            26797 => 'NAD27 Missouri Central',
+            26798 => 'NAD27 Missouri West',
+            26801 => 'NAD Michigan Michigan East',
+            26802 => 'NAD Michigan Michigan Old Central',
+            26803 => 'NAD Michigan Michigan West',
+            26903 => 'NAD83 UTM zone 3N',
+            26904 => 'NAD83 UTM zone 4N',
+            26905 => 'NAD83 UTM zone 5N',
+            26906 => 'NAD83 UTM zone 6N',
+            26907 => 'NAD83 UTM zone 7N',
+            26908 => 'NAD83 UTM zone 8N',
+            26909 => 'NAD83 UTM zone 9N',
+            26910 => 'NAD83 UTM zone 10N',
+            26911 => 'NAD83 UTM zone 11N',
+            26912 => 'NAD83 UTM zone 12N',
+            26913 => 'NAD83 UTM zone 13N',
+            26914 => 'NAD83 UTM zone 14N',
+            26915 => 'NAD83 UTM zone 15N',
+            26916 => 'NAD83 UTM zone 16N',
+            26917 => 'NAD83 UTM zone 17N',
+            26918 => 'NAD83 UTM zone 18N',
+            26919 => 'NAD83 UTM zone 19N',
+            26920 => 'NAD83 UTM zone 20N',
+            26921 => 'NAD83 UTM zone 21N',
+            26922 => 'NAD83 UTM zone 22N',
+            26923 => 'NAD83 UTM zone 23N',
+            26929 => 'NAD83 Alabama East',
+            26930 => 'NAD83 Alabama West',
+            26931 => 'NAD83 Alaska zone 1',
+            26932 => 'NAD83 Alaska zone 2',
+            26933 => 'NAD83 Alaska zone 3',
+            26934 => 'NAD83 Alaska zone 4',
+            26935 => 'NAD83 Alaska zone 5',
+            26936 => 'NAD83 Alaska zone 6',
+            26937 => 'NAD83 Alaska zone 7',
+            26938 => 'NAD83 Alaska zone 8',
+            26939 => 'NAD83 Alaska zone 9',
+            26940 => 'NAD83 Alaska zone 10',
+            26941 => 'NAD83 California 1',
+            26942 => 'NAD83 California 2',
+            26943 => 'NAD83 California 3',
+            26944 => 'NAD83 California 4',
+            26945 => 'NAD83 California 5',
+            26946 => 'NAD83 California 6',
+            26948 => 'NAD83 Arizona East',
+            26949 => 'NAD83 Arizona Central',
+            26950 => 'NAD83 Arizona West',
+            26951 => 'NAD83 Arkansas North',
+            26952 => 'NAD83 Arkansas South',
+            26953 => 'NAD83 Colorado North',
+            26954 => 'NAD83 Colorado Central',
+            26955 => 'NAD83 Colorado South',
+            26956 => 'NAD83 Connecticut',
+            26957 => 'NAD83 Delaware',
+            26958 => 'NAD83 Florida East',
+            26959 => 'NAD83 Florida West',
+            26960 => 'NAD83 Florida North',
+            26961 => 'NAD83 Hawaii zone 1',
+            26962 => 'NAD83 Hawaii zone 2',
+            26963 => 'NAD83 Hawaii zone 3',
+            26964 => 'NAD83 Hawaii zone 4',
+            26965 => 'NAD83 Hawaii zone 5',
+            26966 => 'NAD83 Georgia East',
+            26967 => 'NAD83 Georgia West',
+            26968 => 'NAD83 Idaho East',
+            26969 => 'NAD83 Idaho Central',
+            26970 => 'NAD83 Idaho West',
+            26971 => 'NAD83 Illinois East',
+            26972 => 'NAD83 Illinois West',
+            26973 => 'NAD83 Indiana East',
+            26974 => 'NAD83 Indiana West',
+            26975 => 'NAD83 Iowa North',
+            26976 => 'NAD83 Iowa South',
+            26977 => 'NAD83 Kansas North',
+            26978 => 'NAD83 Kansas South',
+            26979 => 'NAD83 Kentucky North',
+            26980 => 'NAD83 Kentucky South',
+            26981 => 'NAD83 Louisiana North',
+            26982 => 'NAD83 Louisiana South',
+            26983 => 'NAD83 Maine East',
+            26984 => 'NAD83 Maine West',
+            26985 => 'NAD83 Maryland',
+            26986 => 'NAD83 Massachusetts',
+            26987 => 'NAD83 Massachusetts Is',
+            26988 => 'NAD83 Michigan North',
+            26989 => 'NAD83 Michigan Central',
+            26990 => 'NAD83 Michigan South',
+            26991 => 'NAD83 Minnesota North',
+            26992 => 'NAD83 Minnesota Cent',
+            26993 => 'NAD83 Minnesota South',
+            26994 => 'NAD83 Mississippi East',
+            26995 => 'NAD83 Mississippi West',
+            26996 => 'NAD83 Missouri East',
+            26997 => 'NAD83 Missouri Central',
+            26998 => 'NAD83 Missouri West',
+            27038 => 'Nahrwan 1967 UTM 38N',
+            27039 => 'Nahrwan 1967 UTM 39N',
+            27040 => 'Nahrwan 1967 UTM 40N',
+            27120 => 'Naparima UTM 20N',
+            27200 => 'GD49 NZ Map Grid',
+            27291 => 'GD49 North Island Grid',
+            27292 => 'GD49 South Island Grid',
+            27429 => 'Datum 73 UTM zone 29N',
+            27500 => 'ATF Nord de Guerre',
+            27581 => 'NTF France I',
+            27582 => 'NTF France II',
+            27583 => 'NTF France III',
+            27591 => 'NTF Nord France',
+            27592 => 'NTF Centre France',
+            27593 => 'NTF Sud France',
+            27700 => 'British National Grid',
+            28232 => 'Point Noire UTM 32S',
+            28348 => 'GDA94 MGA zone 48',
+            28349 => 'GDA94 MGA zone 49',
+            28350 => 'GDA94 MGA zone 50',
+            28351 => 'GDA94 MGA zone 51',
+            28352 => 'GDA94 MGA zone 52',
+            28353 => 'GDA94 MGA zone 53',
+            28354 => 'GDA94 MGA zone 54',
+            28355 => 'GDA94 MGA zone 55',
+            28356 => 'GDA94 MGA zone 56',
+            28357 => 'GDA94 MGA zone 57',
+            28358 => 'GDA94 MGA zone 58',
+            28404 => 'Pulkovo Gauss zone 4',
+            28405 => 'Pulkovo Gauss zone 5',
+            28406 => 'Pulkovo Gauss zone 6',
+            28407 => 'Pulkovo Gauss zone 7',
+            28408 => 'Pulkovo Gauss zone 8',
+            28409 => 'Pulkovo Gauss zone 9',
+            28410 => 'Pulkovo Gauss zone 10',
+            28411 => 'Pulkovo Gauss zone 11',
+            28412 => 'Pulkovo Gauss zone 12',
+            28413 => 'Pulkovo Gauss zone 13',
+            28414 => 'Pulkovo Gauss zone 14',
+            28415 => 'Pulkovo Gauss zone 15',
+            28416 => 'Pulkovo Gauss zone 16',
+            28417 => 'Pulkovo Gauss zone 17',
+            28418 => 'Pulkovo Gauss zone 18',
+            28419 => 'Pulkovo Gauss zone 19',
+            28420 => 'Pulkovo Gauss zone 20',
+            28421 => 'Pulkovo Gauss zone 21',
+            28422 => 'Pulkovo Gauss zone 22',
+            28423 => 'Pulkovo Gauss zone 23',
+            28424 => 'Pulkovo Gauss zone 24',
+            28425 => 'Pulkovo Gauss zone 25',
+            28426 => 'Pulkovo Gauss zone 26',
+            28427 => 'Pulkovo Gauss zone 27',
+            28428 => 'Pulkovo Gauss zone 28',
+            28429 => 'Pulkovo Gauss zone 29',
+            28430 => 'Pulkovo Gauss zone 30',
+            28431 => 'Pulkovo Gauss zone 31',
+            28432 => 'Pulkovo Gauss zone 32',
+            28464 => 'Pulkovo Gauss 4N',
+            28465 => 'Pulkovo Gauss 5N',
+            28466 => 'Pulkovo Gauss 6N',
+            28467 => 'Pulkovo Gauss 7N',
+            28468 => 'Pulkovo Gauss 8N',
+            28469 => 'Pulkovo Gauss 9N',
+            28470 => 'Pulkovo Gauss 10N',
+            28471 => 'Pulkovo Gauss 11N',
+            28472 => 'Pulkovo Gauss 12N',
+            28473 => 'Pulkovo Gauss 13N',
+            28474 => 'Pulkovo Gauss 14N',
+            28475 => 'Pulkovo Gauss 15N',
+            28476 => 'Pulkovo Gauss 16N',
+            28477 => 'Pulkovo Gauss 17N',
+            28478 => 'Pulkovo Gauss 18N',
+            28479 => 'Pulkovo Gauss 19N',
+            28480 => 'Pulkovo Gauss 20N',
+            28481 => 'Pulkovo Gauss 21N',
+            28482 => 'Pulkovo Gauss 22N',
+            28483 => 'Pulkovo Gauss 23N',
+            28484 => 'Pulkovo Gauss 24N',
+            28485 => 'Pulkovo Gauss 25N',
+            28486 => 'Pulkovo Gauss 26N',
+            28487 => 'Pulkovo Gauss 27N',
+            28488 => 'Pulkovo Gauss 28N',
+            28489 => 'Pulkovo Gauss 29N',
+            28490 => 'Pulkovo Gauss 30N',
+            28491 => 'Pulkovo Gauss 31N',
+            28492 => 'Pulkovo Gauss 32N',
+            28600 => 'Qatar National Grid',
+            28991 => 'RD Netherlands Old',
+            28992 => 'RD Netherlands New',
+            29118 => 'SAD69 UTM zone 18N',
+            29119 => 'SAD69 UTM zone 19N',
+            29120 => 'SAD69 UTM zone 20N',
+            29121 => 'SAD69 UTM zone 21N',
+            29122 => 'SAD69 UTM zone 22N',
+            29177 => 'SAD69 UTM zone 17S',
+            29178 => 'SAD69 UTM zone 18S',
+            29179 => 'SAD69 UTM zone 19S',
+            29180 => 'SAD69 UTM zone 20S',
+            29181 => 'SAD69 UTM zone 21S',
+            29182 => 'SAD69 UTM zone 22S',
+            29183 => 'SAD69 UTM zone 23S',
+            29184 => 'SAD69 UTM zone 24S',
+            29185 => 'SAD69 UTM zone 25S',
+            29220 => 'Sapper Hill UTM 20S',
+            29221 => 'Sapper Hill UTM 21S',
+            29333 => 'Schwarzeck UTM 33S',
+            29635 => 'Sudan UTM zone 35N',
+            29636 => 'Sudan UTM zone 36N',
+            29700 => 'Tananarive Laborde',
+            29738 => 'Tananarive UTM 38S',
+            29739 => 'Tananarive UTM 39S',
+            29800 => 'Timbalai 1948 Borneo',
+            29849 => 'Timbalai 1948 UTM 49N',
+            29850 => 'Timbalai 1948 UTM 50N',
+            29900 => 'TM65 Irish Nat Grid',
+            30200 => 'Trinidad 1903 Trinidad',
+            30339 => 'TC 1948 UTM zone 39N',
+            30340 => 'TC 1948 UTM zone 40N',
+            30491 => 'Voirol N Algerie ancien',
+            30492 => 'Voirol S Algerie ancien',
+            30591 => 'Voirol Unifie N Algerie',
+            30592 => 'Voirol Unifie S Algerie',
+            30600 => 'Bern 1938 Swiss New',
+            30729 => 'Nord Sahara UTM 29N',
+            30730 => 'Nord Sahara UTM 30N',
+            30731 => 'Nord Sahara UTM 31N',
+            30732 => 'Nord Sahara UTM 32N',
+            31028 => 'Yoff UTM zone 28N',
+            31121 => 'Zanderij UTM zone 21N',
+            31291 => 'MGI Austria West',
+            31292 => 'MGI Austria Central',
+            31293 => 'MGI Austria East',
+            31300 => 'Belge Lambert 72',
+            31491 => 'DHDN Germany zone 1',
+            31492 => 'DHDN Germany zone 2',
+            31493 => 'DHDN Germany zone 3',
+            31494 => 'DHDN Germany zone 4',
+            31495 => 'DHDN Germany zone 5',
+            31700 => 'Dealul Piscului 1970 Stereo 70',
+            32001 => 'NAD27 Montana North',
+            32002 => 'NAD27 Montana Central',
+            32003 => 'NAD27 Montana South',
+            32005 => 'NAD27 Nebraska North',
+            32006 => 'NAD27 Nebraska South',
+            32007 => 'NAD27 Nevada East',
+            32008 => 'NAD27 Nevada Central',
+            32009 => 'NAD27 Nevada West',
+            32010 => 'NAD27 New Hampshire',
+            32011 => 'NAD27 New Jersey',
+            32012 => 'NAD27 New Mexico East',
+            32013 => 'NAD27 New Mexico Cent',
+            32014 => 'NAD27 New Mexico West',
+            32015 => 'NAD27 New York East',
+            32016 => 'NAD27 New York Central',
+            32017 => 'NAD27 New York West',
+            32018 => 'NAD27 New York Long Is',
+            32019 => 'NAD27 North Carolina',
+            32020 => 'NAD27 North Dakota N',
+            32021 => 'NAD27 North Dakota S',
+            32022 => 'NAD27 Ohio North',
+            32023 => 'NAD27 Ohio South',
+            32024 => 'NAD27 Oklahoma North',
+            32025 => 'NAD27 Oklahoma South',
+            32026 => 'NAD27 Oregon North',
+            32027 => 'NAD27 Oregon South',
+            32028 => 'NAD27 Pennsylvania N',
+            32029 => 'NAD27 Pennsylvania S',
+            32030 => 'NAD27 Rhode Island',
+            32031 => 'NAD27 South Carolina N',
+            32033 => 'NAD27 South Carolina S',
+            32034 => 'NAD27 South Dakota N',
+            32035 => 'NAD27 South Dakota S',
+            32036 => 'NAD27 Tennessee',
+            32037 => 'NAD27 Texas North',
+            32038 => 'NAD27 Texas North Cen',
+            32039 => 'NAD27 Texas Central',
+            32040 => 'NAD27 Texas South Cen',
+            32041 => 'NAD27 Texas South',
+            32042 => 'NAD27 Utah North',
+            32043 => 'NAD27 Utah Central',
+            32044 => 'NAD27 Utah South',
+            32045 => 'NAD27 Vermont',
+            32046 => 'NAD27 Virginia North',
+            32047 => 'NAD27 Virginia South',
+            32048 => 'NAD27 Washington North',
+            32049 => 'NAD27 Washington South',
+            32050 => 'NAD27 West Virginia N',
+            32051 => 'NAD27 West Virginia S',
+            32052 => 'NAD27 Wisconsin North',
+            32053 => 'NAD27 Wisconsin Cen',
+            32054 => 'NAD27 Wisconsin South',
+            32055 => 'NAD27 Wyoming East',
+            32056 => 'NAD27 Wyoming E Cen',
+            32057 => 'NAD27 Wyoming W Cen',
+            32058 => 'NAD27 Wyoming West',
+            32059 => 'NAD27 Puerto Rico',
+            32060 => 'NAD27 St Croix',
+            32100 => 'NAD83 Montana',
+            32104 => 'NAD83 Nebraska',
+            32107 => 'NAD83 Nevada East',
+            32108 => 'NAD83 Nevada Central',
+            32109 => 'NAD83 Nevada West',
+            32110 => 'NAD83 New Hampshire',
+            32111 => 'NAD83 New Jersey',
+            32112 => 'NAD83 New Mexico East',
+            32113 => 'NAD83 New Mexico Cent',
+            32114 => 'NAD83 New Mexico West',
+            32115 => 'NAD83 New York East',
+            32116 => 'NAD83 New York Central',
+            32117 => 'NAD83 New York West',
+            32118 => 'NAD83 New York Long Is',
+            32119 => 'NAD83 North Carolina',
+            32120 => 'NAD83 North Dakota N',
+            32121 => 'NAD83 North Dakota S',
+            32122 => 'NAD83 Ohio North',
+            32123 => 'NAD83 Ohio South',
+            32124 => 'NAD83 Oklahoma North',
+            32125 => 'NAD83 Oklahoma South',
+            32126 => 'NAD83 Oregon North',
+            32127 => 'NAD83 Oregon South',
+            32128 => 'NAD83 Pennsylvania N',
+            32129 => 'NAD83 Pennsylvania S',
+            32130 => 'NAD83 Rhode Island',
+            32133 => 'NAD83 South Carolina',
+            32134 => 'NAD83 South Dakota N',
+            32135 => 'NAD83 South Dakota S',
+            32136 => 'NAD83 Tennessee',
+            32137 => 'NAD83 Texas North',
+            32138 => 'NAD83 Texas North Cen',
+            32139 => 'NAD83 Texas Central',
+            32140 => 'NAD83 Texas South Cen',
+            32141 => 'NAD83 Texas South',
+            32142 => 'NAD83 Utah North',
+            32143 => 'NAD83 Utah Central',
+            32144 => 'NAD83 Utah South',
+            32145 => 'NAD83 Vermont',
+            32146 => 'NAD83 Virginia North',
+            32147 => 'NAD83 Virginia South',
+            32148 => 'NAD83 Washington North',
+            32149 => 'NAD83 Washington South',
+            32150 => 'NAD83 West Virginia N',
+            32151 => 'NAD83 West Virginia S',
+            32152 => 'NAD83 Wisconsin North',
+            32153 => 'NAD83 Wisconsin Cen',
+            32154 => 'NAD83 Wisconsin South',
+            32155 => 'NAD83 Wyoming East',
+            32156 => 'NAD83 Wyoming E Cen',
+            32157 => 'NAD83 Wyoming W Cen',
+            32158 => 'NAD83 Wyoming West',
+            32161 => 'NAD83 Puerto Rico Virgin Is',
+            32201 => 'WGS72 UTM zone 1N',
+            32202 => 'WGS72 UTM zone 2N',
+            32203 => 'WGS72 UTM zone 3N',
+            32204 => 'WGS72 UTM zone 4N',
+            32205 => 'WGS72 UTM zone 5N',
+            32206 => 'WGS72 UTM zone 6N',
+            32207 => 'WGS72 UTM zone 7N',
+            32208 => 'WGS72 UTM zone 8N',
+            32209 => 'WGS72 UTM zone 9N',
+            32210 => 'WGS72 UTM zone 10N',
+            32211 => 'WGS72 UTM zone 11N',
+            32212 => 'WGS72 UTM zone 12N',
+            32213 => 'WGS72 UTM zone 13N',
+            32214 => 'WGS72 UTM zone 14N',
+            32215 => 'WGS72 UTM zone 15N',
+            32216 => 'WGS72 UTM zone 16N',
+            32217 => 'WGS72 UTM zone 17N',
+            32218 => 'WGS72 UTM zone 18N',
+            32219 => 'WGS72 UTM zone 19N',
+            32220 => 'WGS72 UTM zone 20N',
+            32221 => 'WGS72 UTM zone 21N',
+            32222 => 'WGS72 UTM zone 22N',
+            32223 => 'WGS72 UTM zone 23N',
+            32224 => 'WGS72 UTM zone 24N',
+            32225 => 'WGS72 UTM zone 25N',
+            32226 => 'WGS72 UTM zone 26N',
+            32227 => 'WGS72 UTM zone 27N',
+            32228 => 'WGS72 UTM zone 28N',
+            32229 => 'WGS72 UTM zone 29N',
+            32230 => 'WGS72 UTM zone 30N',
+            32231 => 'WGS72 UTM zone 31N',
+            32232 => 'WGS72 UTM zone 32N',
+            32233 => 'WGS72 UTM zone 33N',
+            32234 => 'WGS72 UTM zone 34N',
+            32235 => 'WGS72 UTM zone 35N',
+            32236 => 'WGS72 UTM zone 36N',
+            32237 => 'WGS72 UTM zone 37N',
+            32238 => 'WGS72 UTM zone 38N',
+            32239 => 'WGS72 UTM zone 39N',
+            32240 => 'WGS72 UTM zone 40N',
+            32241 => 'WGS72 UTM zone 41N',
+            32242 => 'WGS72 UTM zone 42N',
+            32243 => 'WGS72 UTM zone 43N',
+            32244 => 'WGS72 UTM zone 44N',
+            32245 => 'WGS72 UTM zone 45N',
+            32246 => 'WGS72 UTM zone 46N',
+            32247 => 'WGS72 UTM zone 47N',
+            32248 => 'WGS72 UTM zone 48N',
+            32249 => 'WGS72 UTM zone 49N',
+            32250 => 'WGS72 UTM zone 50N',
+            32251 => 'WGS72 UTM zone 51N',
+            32252 => 'WGS72 UTM zone 52N',
+            32253 => 'WGS72 UTM zone 53N',
+            32254 => 'WGS72 UTM zone 54N',
+            32255 => 'WGS72 UTM zone 55N',
+            32256 => 'WGS72 UTM zone 56N',
+            32257 => 'WGS72 UTM zone 57N',
+            32258 => 'WGS72 UTM zone 58N',
+            32259 => 'WGS72 UTM zone 59N',
+            32260 => 'WGS72 UTM zone 60N',
+            32301 => 'WGS72 UTM zone 1S',
+            32302 => 'WGS72 UTM zone 2S',
+            32303 => 'WGS72 UTM zone 3S',
+            32304 => 'WGS72 UTM zone 4S',
+            32305 => 'WGS72 UTM zone 5S',
+            32306 => 'WGS72 UTM zone 6S',
+            32307 => 'WGS72 UTM zone 7S',
+            32308 => 'WGS72 UTM zone 8S',
+            32309 => 'WGS72 UTM zone 9S',
+            32310 => 'WGS72 UTM zone 10S',
+            32311 => 'WGS72 UTM zone 11S',
+            32312 => 'WGS72 UTM zone 12S',
+            32313 => 'WGS72 UTM zone 13S',
+            32314 => 'WGS72 UTM zone 14S',
+            32315 => 'WGS72 UTM zone 15S',
+            32316 => 'WGS72 UTM zone 16S',
+            32317 => 'WGS72 UTM zone 17S',
+            32318 => 'WGS72 UTM zone 18S',
+            32319 => 'WGS72 UTM zone 19S',
+            32320 => 'WGS72 UTM zone 20S',
+            32321 => 'WGS72 UTM zone 21S',
+            32322 => 'WGS72 UTM zone 22S',
+            32323 => 'WGS72 UTM zone 23S',
+            32324 => 'WGS72 UTM zone 24S',
+            32325 => 'WGS72 UTM zone 25S',
+            32326 => 'WGS72 UTM zone 26S',
+            32327 => 'WGS72 UTM zone 27S',
+            32328 => 'WGS72 UTM zone 28S',
+            32329 => 'WGS72 UTM zone 29S',
+            32330 => 'WGS72 UTM zone 30S',
+            32331 => 'WGS72 UTM zone 31S',
+            32332 => 'WGS72 UTM zone 32S',
+            32333 => 'WGS72 UTM zone 33S',
+            32334 => 'WGS72 UTM zone 34S',
+            32335 => 'WGS72 UTM zone 35S',
+            32336 => 'WGS72 UTM zone 36S',
+            32337 => 'WGS72 UTM zone 37S',
+            32338 => 'WGS72 UTM zone 38S',
+            32339 => 'WGS72 UTM zone 39S',
+            32340 => 'WGS72 UTM zone 40S',
+            32341 => 'WGS72 UTM zone 41S',
+            32342 => 'WGS72 UTM zone 42S',
+            32343 => 'WGS72 UTM zone 43S',
+            32344 => 'WGS72 UTM zone 44S',
+            32345 => 'WGS72 UTM zone 45S',
+            32346 => 'WGS72 UTM zone 46S',
+            32347 => 'WGS72 UTM zone 47S',
+            32348 => 'WGS72 UTM zone 48S',
+            32349 => 'WGS72 UTM zone 49S',
+            32350 => 'WGS72 UTM zone 50S',
+            32351 => 'WGS72 UTM zone 51S',
+            32352 => 'WGS72 UTM zone 52S',
+            32353 => 'WGS72 UTM zone 53S',
+            32354 => 'WGS72 UTM zone 54S',
+            32355 => 'WGS72 UTM zone 55S',
+            32356 => 'WGS72 UTM zone 56S',
+            32357 => 'WGS72 UTM zone 57S',
+            32358 => 'WGS72 UTM zone 58S',
+            32359 => 'WGS72 UTM zone 59S',
+            32360 => 'WGS72 UTM zone 60S',
+            32401 => 'WGS72BE UTM zone 1N',
+            32402 => 'WGS72BE UTM zone 2N',
+            32403 => 'WGS72BE UTM zone 3N',
+            32404 => 'WGS72BE UTM zone 4N',
+            32405 => 'WGS72BE UTM zone 5N',
+            32406 => 'WGS72BE UTM zone 6N',
+            32407 => 'WGS72BE UTM zone 7N',
+            32408 => 'WGS72BE UTM zone 8N',
+            32409 => 'WGS72BE UTM zone 9N',
+            32410 => 'WGS72BE UTM zone 10N',
+            32411 => 'WGS72BE UTM zone 11N',
+            32412 => 'WGS72BE UTM zone 12N',
+            32413 => 'WGS72BE UTM zone 13N',
+            32414 => 'WGS72BE UTM zone 14N',
+            32415 => 'WGS72BE UTM zone 15N',
+            32416 => 'WGS72BE UTM zone 16N',
+            32417 => 'WGS72BE UTM zone 17N',
+            32418 => 'WGS72BE UTM zone 18N',
+            32419 => 'WGS72BE UTM zone 19N',
+            32420 => 'WGS72BE UTM zone 20N',
+            32421 => 'WGS72BE UTM zone 21N',
+            32422 => 'WGS72BE UTM zone 22N',
+            32423 => 'WGS72BE UTM zone 23N',
+            32424 => 'WGS72BE UTM zone 24N',
+            32425 => 'WGS72BE UTM zone 25N',
+            32426 => 'WGS72BE UTM zone 26N',
+            32427 => 'WGS72BE UTM zone 27N',
+            32428 => 'WGS72BE UTM zone 28N',
+            32429 => 'WGS72BE UTM zone 29N',
+            32430 => 'WGS72BE UTM zone 30N',
+            32431 => 'WGS72BE UTM zone 31N',
+            32432 => 'WGS72BE UTM zone 32N',
+            32433 => 'WGS72BE UTM zone 33N',
+            32434 => 'WGS72BE UTM zone 34N',
+            32435 => 'WGS72BE UTM zone 35N',
+            32436 => 'WGS72BE UTM zone 36N',
+            32437 => 'WGS72BE UTM zone 37N',
+            32438 => 'WGS72BE UTM zone 38N',
+            32439 => 'WGS72BE UTM zone 39N',
+            32440 => 'WGS72BE UTM zone 40N',
+            32441 => 'WGS72BE UTM zone 41N',
+            32442 => 'WGS72BE UTM zone 42N',
+            32443 => 'WGS72BE UTM zone 43N',
+            32444 => 'WGS72BE UTM zone 44N',
+            32445 => 'WGS72BE UTM zone 45N',
+            32446 => 'WGS72BE UTM zone 46N',
+            32447 => 'WGS72BE UTM zone 47N',
+            32448 => 'WGS72BE UTM zone 48N',
+            32449 => 'WGS72BE UTM zone 49N',
+            32450 => 'WGS72BE UTM zone 50N',
+            32451 => 'WGS72BE UTM zone 51N',
+            32452 => 'WGS72BE UTM zone 52N',
+            32453 => 'WGS72BE UTM zone 53N',
+            32454 => 'WGS72BE UTM zone 54N',
+            32455 => 'WGS72BE UTM zone 55N',
+            32456 => 'WGS72BE UTM zone 56N',
+            32457 => 'WGS72BE UTM zone 57N',
+            32458 => 'WGS72BE UTM zone 58N',
+            32459 => 'WGS72BE UTM zone 59N',
+            32460 => 'WGS72BE UTM zone 60N',
+            32501 => 'WGS72BE UTM zone 1S',
+            32502 => 'WGS72BE UTM zone 2S',
+            32503 => 'WGS72BE UTM zone 3S',
+            32504 => 'WGS72BE UTM zone 4S',
+            32505 => 'WGS72BE UTM zone 5S',
+            32506 => 'WGS72BE UTM zone 6S',
+            32507 => 'WGS72BE UTM zone 7S',
+            32508 => 'WGS72BE UTM zone 8S',
+            32509 => 'WGS72BE UTM zone 9S',
+            32510 => 'WGS72BE UTM zone 10S',
+            32511 => 'WGS72BE UTM zone 11S',
+            32512 => 'WGS72BE UTM zone 12S',
+            32513 => 'WGS72BE UTM zone 13S',
+            32514 => 'WGS72BE UTM zone 14S',
+            32515 => 'WGS72BE UTM zone 15S',
+            32516 => 'WGS72BE UTM zone 16S',
+            32517 => 'WGS72BE UTM zone 17S',
+            32518 => 'WGS72BE UTM zone 18S',
+            32519 => 'WGS72BE UTM zone 19S',
+            32520 => 'WGS72BE UTM zone 20S',
+            32521 => 'WGS72BE UTM zone 21S',
+            32522 => 'WGS72BE UTM zone 22S',
+            32523 => 'WGS72BE UTM zone 23S',
+            32524 => 'WGS72BE UTM zone 24S',
+            32525 => 'WGS72BE UTM zone 25S',
+            32526 => 'WGS72BE UTM zone 26S',
+            32527 => 'WGS72BE UTM zone 27S',
+            32528 => 'WGS72BE UTM zone 28S',
+            32529 => 'WGS72BE UTM zone 29S',
+            32530 => 'WGS72BE UTM zone 30S',
+            32531 => 'WGS72BE UTM zone 31S',
+            32532 => 'WGS72BE UTM zone 32S',
+            32533 => 'WGS72BE UTM zone 33S',
+            32534 => 'WGS72BE UTM zone 34S',
+            32535 => 'WGS72BE UTM zone 35S',
+            32536 => 'WGS72BE UTM zone 36S',
+            32537 => 'WGS72BE UTM zone 37S',
+            32538 => 'WGS72BE UTM zone 38S',
+            32539 => 'WGS72BE UTM zone 39S',
+            32540 => 'WGS72BE UTM zone 40S',
+            32541 => 'WGS72BE UTM zone 41S',
+            32542 => 'WGS72BE UTM zone 42S',
+            32543 => 'WGS72BE UTM zone 43S',
+            32544 => 'WGS72BE UTM zone 44S',
+            32545 => 'WGS72BE UTM zone 45S',
+            32546 => 'WGS72BE UTM zone 46S',
+            32547 => 'WGS72BE UTM zone 47S',
+            32548 => 'WGS72BE UTM zone 48S',
+            32549 => 'WGS72BE UTM zone 49S',
+            32550 => 'WGS72BE UTM zone 50S',
+            32551 => 'WGS72BE UTM zone 51S',
+            32552 => 'WGS72BE UTM zone 52S',
+            32553 => 'WGS72BE UTM zone 53S',
+            32554 => 'WGS72BE UTM zone 54S',
+            32555 => 'WGS72BE UTM zone 55S',
+            32556 => 'WGS72BE UTM zone 56S',
+            32557 => 'WGS72BE UTM zone 57S',
+            32558 => 'WGS72BE UTM zone 58S',
+            32559 => 'WGS72BE UTM zone 59S',
+            32560 => 'WGS72BE UTM zone 60S',
+            32601 => 'WGS84 UTM zone 1N',
+            32602 => 'WGS84 UTM zone 2N',
+            32603 => 'WGS84 UTM zone 3N',
+            32604 => 'WGS84 UTM zone 4N',
+            32605 => 'WGS84 UTM zone 5N',
+            32606 => 'WGS84 UTM zone 6N',
+            32607 => 'WGS84 UTM zone 7N',
+            32608 => 'WGS84 UTM zone 8N',
+            32609 => 'WGS84 UTM zone 9N',
+            32610 => 'WGS84 UTM zone 10N',
+            32611 => 'WGS84 UTM zone 11N',
+            32612 => 'WGS84 UTM zone 12N',
+            32613 => 'WGS84 UTM zone 13N',
+            32614 => 'WGS84 UTM zone 14N',
+            32615 => 'WGS84 UTM zone 15N',
+            32616 => 'WGS84 UTM zone 16N',
+            32617 => 'WGS84 UTM zone 17N',
+            32618 => 'WGS84 UTM zone 18N',
+            32619 => 'WGS84 UTM zone 19N',
+            32620 => 'WGS84 UTM zone 20N',
+            32621 => 'WGS84 UTM zone 21N',
+            32622 => 'WGS84 UTM zone 22N',
+            32623 => 'WGS84 UTM zone 23N',
+            32624 => 'WGS84 UTM zone 24N',
+            32625 => 'WGS84 UTM zone 25N',
+            32626 => 'WGS84 UTM zone 26N',
+            32627 => 'WGS84 UTM zone 27N',
+            32628 => 'WGS84 UTM zone 28N',
+            32629 => 'WGS84 UTM zone 29N',
+            32630 => 'WGS84 UTM zone 30N',
+            32631 => 'WGS84 UTM zone 31N',
+            32632 => 'WGS84 UTM zone 32N',
+            32633 => 'WGS84 UTM zone 33N',
+            32634 => 'WGS84 UTM zone 34N',
+            32635 => 'WGS84 UTM zone 35N',
+            32636 => 'WGS84 UTM zone 36N',
+            32637 => 'WGS84 UTM zone 37N',
+            32638 => 'WGS84 UTM zone 38N',
+            32639 => 'WGS84 UTM zone 39N',
+            32640 => 'WGS84 UTM zone 40N',
+            32641 => 'WGS84 UTM zone 41N',
+            32642 => 'WGS84 UTM zone 42N',
+            32643 => 'WGS84 UTM zone 43N',
+            32644 => 'WGS84 UTM zone 44N',
+            32645 => 'WGS84 UTM zone 45N',
+            32646 => 'WGS84 UTM zone 46N',
+            32647 => 'WGS84 UTM zone 47N',
+            32648 => 'WGS84 UTM zone 48N',
+            32649 => 'WGS84 UTM zone 49N',
+            32650 => 'WGS84 UTM zone 50N',
+            32651 => 'WGS84 UTM zone 51N',
+            32652 => 'WGS84 UTM zone 52N',
+            32653 => 'WGS84 UTM zone 53N',
+            32654 => 'WGS84 UTM zone 54N',
+            32655 => 'WGS84 UTM zone 55N',
+            32656 => 'WGS84 UTM zone 56N',
+            32657 => 'WGS84 UTM zone 57N',
+            32658 => 'WGS84 UTM zone 58N',
+            32659 => 'WGS84 UTM zone 59N',
+            32660 => 'WGS84 UTM zone 60N',
+            32701 => 'WGS84 UTM zone 1S',
+            32702 => 'WGS84 UTM zone 2S',
+            32703 => 'WGS84 UTM zone 3S',
+            32704 => 'WGS84 UTM zone 4S',
+            32705 => 'WGS84 UTM zone 5S',
+            32706 => 'WGS84 UTM zone 6S',
+            32707 => 'WGS84 UTM zone 7S',
+            32708 => 'WGS84 UTM zone 8S',
+            32709 => 'WGS84 UTM zone 9S',
+            32710 => 'WGS84 UTM zone 10S',
+            32711 => 'WGS84 UTM zone 11S',
+            32712 => 'WGS84 UTM zone 12S',
+            32713 => 'WGS84 UTM zone 13S',
+            32714 => 'WGS84 UTM zone 14S',
+            32715 => 'WGS84 UTM zone 15S',
+            32716 => 'WGS84 UTM zone 16S',
+            32717 => 'WGS84 UTM zone 17S',
+            32718 => 'WGS84 UTM zone 18S',
+            32719 => 'WGS84 UTM zone 19S',
+            32720 => 'WGS84 UTM zone 20S',
+            32721 => 'WGS84 UTM zone 21S',
+            32722 => 'WGS84 UTM zone 22S',
+            32723 => 'WGS84 UTM zone 23S',
+            32724 => 'WGS84 UTM zone 24S',
+            32725 => 'WGS84 UTM zone 25S',
+            32726 => 'WGS84 UTM zone 26S',
+            32727 => 'WGS84 UTM zone 27S',
+            32728 => 'WGS84 UTM zone 28S',
+            32729 => 'WGS84 UTM zone 29S',
+            32730 => 'WGS84 UTM zone 30S',
+            32731 => 'WGS84 UTM zone 31S',
+            32732 => 'WGS84 UTM zone 32S',
+            32733 => 'WGS84 UTM zone 33S',
+            32734 => 'WGS84 UTM zone 34S',
+            32735 => 'WGS84 UTM zone 35S',
+            32736 => 'WGS84 UTM zone 36S',
+            32737 => 'WGS84 UTM zone 37S',
+            32738 => 'WGS84 UTM zone 38S',
+            32739 => 'WGS84 UTM zone 39S',
+            32740 => 'WGS84 UTM zone 40S',
+            32741 => 'WGS84 UTM zone 41S',
+            32742 => 'WGS84 UTM zone 42S',
+            32743 => 'WGS84 UTM zone 43S',
+            32744 => 'WGS84 UTM zone 44S',
+            32745 => 'WGS84 UTM zone 45S',
+            32746 => 'WGS84 UTM zone 46S',
+            32747 => 'WGS84 UTM zone 47S',
+            32748 => 'WGS84 UTM zone 48S',
+            32749 => 'WGS84 UTM zone 49S',
+            32750 => 'WGS84 UTM zone 50S',
+            32751 => 'WGS84 UTM zone 51S',
+            32752 => 'WGS84 UTM zone 52S',
+            32753 => 'WGS84 UTM zone 53S',
+            32754 => 'WGS84 UTM zone 54S',
+            32755 => 'WGS84 UTM zone 55S',
+            32756 => 'WGS84 UTM zone 56S',
+            32757 => 'WGS84 UTM zone 57S',
+            32758 => 'WGS84 UTM zone 58S',
+            32759 => 'WGS84 UTM zone 59S',
+            32760 => 'WGS84 UTM zone 60S',
+            32767 => 'User Defined',
+        },
+    },
+    3073 => 'PCSCitation',
+    3074 => {
+        Name => 'Projection',
+        PrintConv => {
+            # epsg_proj
+            10101 => 'Alabama CS27 East',
+            10102 => 'Alabama CS27 West',
+            10131 => 'Alabama CS83 East',
+            10132 => 'Alabama CS83 West',
+            10201 => 'Arizona Coordinate System east',
+            10202 => 'Arizona Coordinate System Central',
+            10203 => 'Arizona Coordinate System west',
+            10231 => 'Arizona CS83 east',
+            10232 => 'Arizona CS83 Central',
+            10233 => 'Arizona CS83 west',
+            10301 => 'Arkansas CS27 North',
+            10302 => 'Arkansas CS27 South',
+            10331 => 'Arkansas CS83 North',
+            10332 => 'Arkansas CS83 South',
+            10401 => 'California CS27 I',
+            10402 => 'California CS27 II',
+            10403 => 'California CS27 III',
+            10404 => 'California CS27 IV',
+            10405 => 'California CS27 V',
+            10406 => 'California CS27 VI',
+            10407 => 'California CS27 VII',
+            10431 => 'California CS83 1',
+            10432 => 'California CS83 2',
+            10433 => 'California CS83 3',
+            10434 => 'California CS83 4',
+            10435 => 'California CS83 5',
+            10436 => 'California CS83 6',
+            10501 => 'Colorado CS27 North',
+            10502 => 'Colorado CS27 Central',
+            10503 => 'Colorado CS27 South',
+            10531 => 'Colorado CS83 North',
+            10532 => 'Colorado CS83 Central',
+            10533 => 'Colorado CS83 South',
+            10600 => 'Connecticut CS27',
+            10630 => 'Connecticut CS83',
+            10700 => 'Delaware CS27',
+            10730 => 'Delaware CS83',
+            10901 => 'Florida CS27 East',
+            10902 => 'Florida CS27 West',
+            10903 => 'Florida CS27 North',
+            10931 => 'Florida CS83 East',
+            10932 => 'Florida CS83 West',
+            10933 => 'Florida CS83 North',
+            11001 => 'Georgia CS27 East',
+            11002 => 'Georgia CS27 West',
+            11031 => 'Georgia CS83 East',
+            11032 => 'Georgia CS83 West',
+            11101 => 'Idaho CS27 East',
+            11102 => 'Idaho CS27 Central',
+            11103 => 'Idaho CS27 West',
+            11131 => 'Idaho CS83 East',
+            11132 => 'Idaho CS83 Central',
+            11133 => 'Idaho CS83 West',
+            11201 => 'Illinois CS27 East',
+            11202 => 'Illinois CS27 West',
+            11231 => 'Illinois CS83 East',
+            11232 => 'Illinois CS83 West',
+            11301 => 'Indiana CS27 East',
+            11302 => 'Indiana CS27 West',
+            11331 => 'Indiana CS83 East',
+            11332 => 'Indiana CS83 West',
+            11401 => 'Iowa CS27 North',
+            11402 => 'Iowa CS27 South',
+            11431 => 'Iowa CS83 North',
+            11432 => 'Iowa CS83 South',
+            11501 => 'Kansas CS27 North',
+            11502 => 'Kansas CS27 South',
+            11531 => 'Kansas CS83 North',
+            11532 => 'Kansas CS83 South',
+            11601 => 'Kentucky CS27 North',
+            11602 => 'Kentucky CS27 South',
+            11631 => 'Kentucky CS83 North',
+            11632 => 'Kentucky CS83 South',
+            11701 => 'Louisiana CS27 North',
+            11702 => 'Louisiana CS27 South',
+            11731 => 'Louisiana CS83 North',
+            11732 => 'Louisiana CS83 South',
+            11801 => 'Maine CS27 East',
+            11802 => 'Maine CS27 West',
+            11831 => 'Maine CS83 East',
+            11832 => 'Maine CS83 West',
+            11900 => 'Maryland CS27',
+            11930 => 'Maryland CS83',
+            12001 => 'Massachusetts CS27 Mainland',
+            12002 => 'Massachusetts CS27 Island',
+            12031 => 'Massachusetts CS83 Mainland',
+            12032 => 'Massachusetts CS83 Island',
+            12101 => 'Michigan State Plane East',
+            12102 => 'Michigan State Plane Old Central',
+            12103 => 'Michigan State Plane West',
+            12111 => 'Michigan CS27 North',
+            12112 => 'Michigan CS27 Central',
+            12113 => 'Michigan CS27 South',
+            12141 => 'Michigan CS83 North',
+            12142 => 'Michigan CS83 Central',
+            12143 => 'Michigan CS83 South',
+            12201 => 'Minnesota CS27 North',
+            12202 => 'Minnesota CS27 Central',
+            12203 => 'Minnesota CS27 South',
+            12231 => 'Minnesota CS83 North',
+            12232 => 'Minnesota CS83 Central',
+            12233 => 'Minnesota CS83 South',
+            12301 => 'Mississippi CS27 East',
+            12302 => 'Mississippi CS27 West',
+            12331 => 'Mississippi CS83 East',
+            12332 => 'Mississippi CS83 West',
+            12401 => 'Missouri CS27 East',
+            12402 => 'Missouri CS27 Central',
+            12403 => 'Missouri CS27 West',
+            12431 => 'Missouri CS83 East',
+            12432 => 'Missouri CS83 Central',
+            12433 => 'Missouri CS83 West',
+            12501 => 'Montana CS27 North',
+            12502 => 'Montana CS27 Central',
+            12503 => 'Montana CS27 South',
+            12530 => 'Montana CS83',
+            12601 => 'Nebraska CS27 North',
+            12602 => 'Nebraska CS27 South',
+            12630 => 'Nebraska CS83',
+            12701 => 'Nevada CS27 East',
+            12702 => 'Nevada CS27 Central',
+            12703 => 'Nevada CS27 West',
+            12731 => 'Nevada CS83 East',
+            12732 => 'Nevada CS83 Central',
+            12733 => 'Nevada CS83 West',
+            12800 => 'New Hampshire CS27',
+            12830 => 'New Hampshire CS83',
+            12900 => 'New Jersey CS27',
+            12930 => 'New Jersey CS83',
+            13001 => 'New Mexico CS27 East',
+            13002 => 'New Mexico CS27 Central',
+            13003 => 'New Mexico CS27 West',
+            13031 => 'New Mexico CS83 East',
+            13032 => 'New Mexico CS83 Central',
+            13033 => 'New Mexico CS83 West',
+            13101 => 'New York CS27 East',
+            13102 => 'New York CS27 Central',
+            13103 => 'New York CS27 West',
+            13104 => 'New York CS27 Long Island',
+            13131 => 'New York CS83 East',
+            13132 => 'New York CS83 Central',
+            13133 => 'New York CS83 West',
+            13134 => 'New York CS83 Long Island',
+            13200 => 'North Carolina CS27',
+            13230 => 'North Carolina CS83',
+            13301 => 'North Dakota CS27 North',
+            13302 => 'North Dakota CS27 South',
+            13331 => 'North Dakota CS83 North',
+            13332 => 'North Dakota CS83 South',
+            13401 => 'Ohio CS27 North',
+            13402 => 'Ohio CS27 South',
+            13431 => 'Ohio CS83 North',
+            13432 => 'Ohio CS83 South',
+            13501 => 'Oklahoma CS27 North',
+            13502 => 'Oklahoma CS27 South',
+            13531 => 'Oklahoma CS83 North',
+            13532 => 'Oklahoma CS83 South',
+            13601 => 'Oregon CS27 North',
+            13602 => 'Oregon CS27 South',
+            13631 => 'Oregon CS83 North',
+            13632 => 'Oregon CS83 South',
+            13701 => 'Pennsylvania CS27 North',
+            13702 => 'Pennsylvania CS27 South',
+            13731 => 'Pennsylvania CS83 North',
+            13732 => 'Pennsylvania CS83 South',
+            13800 => 'Rhode Island CS27',
+            13830 => 'Rhode Island CS83',
+            13901 => 'South Carolina CS27 North',
+            13902 => 'South Carolina CS27 South',
+            13930 => 'South Carolina CS83',
+            14001 => 'South Dakota CS27 North',
+            14002 => 'South Dakota CS27 South',
+            14031 => 'South Dakota CS83 North',
+            14032 => 'South Dakota CS83 South',
+            14100 => 'Tennessee CS27',
+            14130 => 'Tennessee CS83',
+            14201 => 'Texas CS27 North',
+            14202 => 'Texas CS27 North Central',
+            14203 => 'Texas CS27 Central',
+            14204 => 'Texas CS27 South Central',
+            14205 => 'Texas CS27 South',
+            14231 => 'Texas CS83 North',
+            14232 => 'Texas CS83 North Central',
+            14233 => 'Texas CS83 Central',
+            14234 => 'Texas CS83 South Central',
+            14235 => 'Texas CS83 South',
+            14301 => 'Utah CS27 North',
+            14302 => 'Utah CS27 Central',
+            14303 => 'Utah CS27 South',
+            14331 => 'Utah CS83 North',
+            14332 => 'Utah CS83 Central',
+            14333 => 'Utah CS83 South',
+            14400 => 'Vermont CS27',
+            14430 => 'Vermont CS83',
+            14501 => 'Virginia CS27 North',
+            14502 => 'Virginia CS27 South',
+            14531 => 'Virginia CS83 North',
+            14532 => 'Virginia CS83 South',
+            14601 => 'Washington CS27 North',
+            14602 => 'Washington CS27 South',
+            14631 => 'Washington CS83 North',
+            14632 => 'Washington CS83 South',
+            14701 => 'West Virginia CS27 North',
+            14702 => 'West Virginia CS27 South',
+            14731 => 'West Virginia CS83 North',
+            14732 => 'West Virginia CS83 South',
+            14801 => 'Wisconsin CS27 North',
+            14802 => 'Wisconsin CS27 Central',
+            14803 => 'Wisconsin CS27 South',
+            14831 => 'Wisconsin CS83 North',
+            14832 => 'Wisconsin CS83 Central',
+            14833 => 'Wisconsin CS83 South',
+            14901 => 'Wyoming CS27 East',
+            14902 => 'Wyoming CS27 East Central',
+            14903 => 'Wyoming CS27 West Central',
+            14904 => 'Wyoming CS27 West',
+            14931 => 'Wyoming CS83 East',
+            14932 => 'Wyoming CS83 East Central',
+            14933 => 'Wyoming CS83 West Central',
+            14934 => 'Wyoming CS83 West',
+            15001 => 'Alaska CS27 1',
+            15002 => 'Alaska CS27 2',
+            15003 => 'Alaska CS27 3',
+            15004 => 'Alaska CS27 4',
+            15005 => 'Alaska CS27 5',
+            15006 => 'Alaska CS27 6',
+            15007 => 'Alaska CS27 7',
+            15008 => 'Alaska CS27 8',
+            15009 => 'Alaska CS27 9',
+            15010 => 'Alaska CS27 10',
+            15031 => 'Alaska CS83 1',
+            15032 => 'Alaska CS83 2',
+            15033 => 'Alaska CS83 3',
+            15034 => 'Alaska CS83 4',
+            15035 => 'Alaska CS83 5',
+            15036 => 'Alaska CS83 6',
+            15037 => 'Alaska CS83 7',
+            15038 => 'Alaska CS83 8',
+            15039 => 'Alaska CS83 9',
+            15040 => 'Alaska CS83 10',
+            15101 => 'Hawaii CS27 1',
+            15102 => 'Hawaii CS27 2',
+            15103 => 'Hawaii CS27 3',
+            15104 => 'Hawaii CS27 4',
+            15105 => 'Hawaii CS27 5',
+            15131 => 'Hawaii CS83 1',
+            15132 => 'Hawaii CS83 2',
+            15133 => 'Hawaii CS83 3',
+            15134 => 'Hawaii CS83 4',
+            15135 => 'Hawaii CS83 5',
+            15201 => 'Puerto Rico CS27',
+            15202 => 'St Croix',
+            15230 => 'Puerto Rico Virgin Is',
+            15302 => 'Kentucky CS27',
+            15303 => 'Kentucky CS83 North',
+            15914 => 'BLM 14N feet',
+            15915 => 'BLM 15N feet',
+            15916 => 'BLM 16N feet',
+            15917 => 'BLM 17N feet',
+            16001 => 'UTM zone 1N',
+            16002 => 'UTM zone 2N',
+            16003 => 'UTM zone 3N',
+            16004 => 'UTM zone 4N',
+            16005 => 'UTM zone 5N',
+            16006 => 'UTM zone 6N',
+            16007 => 'UTM zone 7N',
+            16008 => 'UTM zone 8N',
+            16009 => 'UTM zone 9N',
+            16010 => 'UTM zone 10N',
+            16011 => 'UTM zone 11N',
+            16012 => 'UTM zone 12N',
+            16013 => 'UTM zone 13N',
+            16014 => 'UTM zone 14N',
+            16015 => 'UTM zone 15N',
+            16016 => 'UTM zone 16N',
+            16017 => 'UTM zone 17N',
+            16018 => 'UTM zone 18N',
+            16019 => 'UTM zone 19N',
+            16020 => 'UTM zone 20N',
+            16021 => 'UTM zone 21N',
+            16022 => 'UTM zone 22N',
+            16023 => 'UTM zone 23N',
+            16024 => 'UTM zone 24N',
+            16025 => 'UTM zone 25N',
+            16026 => 'UTM zone 26N',
+            16027 => 'UTM zone 27N',
+            16028 => 'UTM zone 28N',
+            16029 => 'UTM zone 29N',
+            16030 => 'UTM zone 30N',
+            16031 => 'UTM zone 31N',
+            16032 => 'UTM zone 32N',
+            16033 => 'UTM zone 33N',
+            16034 => 'UTM zone 34N',
+            16035 => 'UTM zone 35N',
+            16036 => 'UTM zone 36N',
+            16037 => 'UTM zone 37N',
+            16038 => 'UTM zone 38N',
+            16039 => 'UTM zone 39N',
+            16040 => 'UTM zone 40N',
+            16041 => 'UTM zone 41N',
+            16042 => 'UTM zone 42N',
+            16043 => 'UTM zone 43N',
+            16044 => 'UTM zone 44N',
+            16045 => 'UTM zone 45N',
+            16046 => 'UTM zone 46N',
+            16047 => 'UTM zone 47N',
+            16048 => 'UTM zone 48N',
+            16049 => 'UTM zone 49N',
+            16050 => 'UTM zone 50N',
+            16051 => 'UTM zone 51N',
+            16052 => 'UTM zone 52N',
+            16053 => 'UTM zone 53N',
+            16054 => 'UTM zone 54N',
+            16055 => 'UTM zone 55N',
+            16056 => 'UTM zone 56N',
+            16057 => 'UTM zone 57N',
+            16058 => 'UTM zone 58N',
+            16059 => 'UTM zone 59N',
+            16060 => 'UTM zone 60N',
+            16101 => 'UTM zone 1S',
+            16102 => 'UTM zone 2S',
+            16103 => 'UTM zone 3S',
+            16104 => 'UTM zone 4S',
+            16105 => 'UTM zone 5S',
+            16106 => 'UTM zone 6S',
+            16107 => 'UTM zone 7S',
+            16108 => 'UTM zone 8S',
+            16109 => 'UTM zone 9S',
+            16110 => 'UTM zone 10S',
+            16111 => 'UTM zone 11S',
+            16112 => 'UTM zone 12S',
+            16113 => 'UTM zone 13S',
+            16114 => 'UTM zone 14S',
+            16115 => 'UTM zone 15S',
+            16116 => 'UTM zone 16S',
+            16117 => 'UTM zone 17S',
+            16118 => 'UTM zone 18S',
+            16119 => 'UTM zone 19S',
+            16120 => 'UTM zone 20S',
+            16121 => 'UTM zone 21S',
+            16122 => 'UTM zone 22S',
+            16123 => 'UTM zone 23S',
+            16124 => 'UTM zone 24S',
+            16125 => 'UTM zone 25S',
+            16126 => 'UTM zone 26S',
+            16127 => 'UTM zone 27S',
+            16128 => 'UTM zone 28S',
+            16129 => 'UTM zone 29S',
+            16130 => 'UTM zone 30S',
+            16131 => 'UTM zone 31S',
+            16132 => 'UTM zone 32S',
+            16133 => 'UTM zone 33S',
+            16134 => 'UTM zone 34S',
+            16135 => 'UTM zone 35S',
+            16136 => 'UTM zone 36S',
+            16137 => 'UTM zone 37S',
+            16138 => 'UTM zone 38S',
+            16139 => 'UTM zone 39S',
+            16140 => 'UTM zone 40S',
+            16141 => 'UTM zone 41S',
+            16142 => 'UTM zone 42S',
+            16143 => 'UTM zone 43S',
+            16144 => 'UTM zone 44S',
+            16145 => 'UTM zone 45S',
+            16146 => 'UTM zone 46S',
+            16147 => 'UTM zone 47S',
+            16148 => 'UTM zone 48S',
+            16149 => 'UTM zone 49S',
+            16150 => 'UTM zone 50S',
+            16151 => 'UTM zone 51S',
+            16152 => 'UTM zone 52S',
+            16153 => 'UTM zone 53S',
+            16154 => 'UTM zone 54S',
+            16155 => 'UTM zone 55S',
+            16156 => 'UTM zone 56S',
+            16157 => 'UTM zone 57S',
+            16158 => 'UTM zone 58S',
+            16159 => 'UTM zone 59S',
+            16160 => 'UTM zone 60S',
+            16200 => 'Gauss Kruger zone 0',
+            16201 => 'Gauss Kruger zone 1',
+            16202 => 'Gauss Kruger zone 2',
+            16203 => 'Gauss Kruger zone 3',
+            16204 => 'Gauss Kruger zone 4',
+            16205 => 'Gauss Kruger zone 5',
+            17348 => 'Map Grid of Australia 48',
+            17349 => 'Map Grid of Australia 49',
+            17350 => 'Map Grid of Australia 50',
+            17351 => 'Map Grid of Australia 51',
+            17352 => 'Map Grid of Australia 52',
+            17353 => 'Map Grid of Australia 53',
+            17354 => 'Map Grid of Australia 54',
+            17355 => 'Map Grid of Australia 55',
+            17356 => 'Map Grid of Australia 56',
+            17357 => 'Map Grid of Australia 57',
+            17358 => 'Map Grid of Australia 58',
+            17448 => 'Australian Map Grid 48',
+            17449 => 'Australian Map Grid 49',
+            17450 => 'Australian Map Grid 50',
+            17451 => 'Australian Map Grid 51',
+            17452 => 'Australian Map Grid 52',
+            17453 => 'Australian Map Grid 53',
+            17454 => 'Australian Map Grid 54',
+            17455 => 'Australian Map Grid 55',
+            17456 => 'Australian Map Grid 56',
+            17457 => 'Australian Map Grid 57',
+            17458 => 'Australian Map Grid 58',
+            18031 => 'Argentina 1',
+            18032 => 'Argentina 2',
+            18033 => 'Argentina 3',
+            18034 => 'Argentina 4',
+            18035 => 'Argentina 5',
+            18036 => 'Argentina 6',
+            18037 => 'Argentina 7',
+            18051 => 'Colombia 3W',
+            18052 => 'Colombia Bogota',
+            18053 => 'Colombia 3E',
+            18054 => 'Colombia 6E',
+            18072 => 'Egypt Red Belt',
+            18073 => 'Egypt Purple Belt',
+            18074 => 'Extended Purple Belt',
+            18141 => 'New Zealand North Island Nat Grid',
+            18142 => 'New Zealand South Island Nat Grid',
+            19900 => 'Bahrain Grid',
+            19905 => 'Netherlands E Indies Equatorial',
+            19912 => 'RSO Borneo',
+            19926 => 'Stereo 70',
+            32767 => 'User Defined',
+        },
+    },
+    3075 => {
+        Name => 'ProjCoordTrans',
+        PrintConv => {
+            # geo_ctrans
+            1 => 'Transverse Mercator',
+            2 => 'Transverse Mercator Modified Alaska',
+            3 => 'Oblique Mercator',
+            4 => 'Oblique Mercator Laborde',
+            5 => 'Oblique Mercator Rosenmund',
+            6 => 'Oblique Mercator Spherical',   # not advisable
+            7 => 'Mercator',
+            8 => 'Lambert Conf Conic 2SP',
+            9 => 'Lambert Conf Conic 1SP',
+            10 => 'Lambert Azim Equal Area',
+            11 => 'Albers Equal Area',
+            12 => 'Azimuthal Equidistant',
+            13 => 'Equidistant Conic',
+            14 => 'Stereographic',
+            15 => 'Polar Stereographic',
+            16 => 'Oblique Stereographic',   # not advisable
+            17 => 'Equirectangular',
+            18 => 'Cassini Soldner',
+            19 => 'Gnomonic',
+            20 => 'Miller Cylindrical',
+            21 => 'Orthographic',
+            22 => 'Polyconic',
+            23 => 'Robinson',
+            24 => 'Sinusoidal',
+            25 => 'VanDerGrinten',
+            26 => 'New Zealand Map Grid',
+            27 => 'Transverse Mercator South Orientated',
+            28 => 'Cylindrical Equal Area',
+            32767 => 'User Defined',
+        },
+    },
+    3076 => {
+        Name => 'ProjLinearUnits',
+        SeparateTable => 'Units',
+        PrintConv => \%epsg_units,
+    },
+    3077 => 'ProjLinearUnitSize',
+    3078 => 'ProjStdParallel1',
+    3079 => 'ProjStdParallel2',
+    3080 => 'ProjNatOriginLong',
+    3081 => 'ProjNatOriginLat',
+    3082 => 'ProjFalseEasting',
+    3083 => 'ProjFalseNorthing',
+    3084 => 'ProjFalseOriginLong',
+    3085 => 'ProjFalseOriginLat',
+    3086 => 'ProjFalseOriginEasting',
+    3087 => 'ProjFalseOriginNorthing',
+    3088 => 'ProjCenterLong',
+    3089 => 'ProjCenterLat',
+    3090 => 'ProjCenterEasting',
+    3091 => 'ProjCenterNorthing',
+    3092 => 'ProjScaleAtNatOrigin',
+    3093 => 'ProjScaleAtCenter',
+    3094 => 'ProjAzimuthAngle',
+    3095 => 'ProjStraightVertPoleLong',
+    3096 => 'ProjRectifiedGridAngle',
+    4096 => {
+        Name => 'VerticalCSType',
+        PrintConv => {
+            # epsg_vertcs
+            5001 => 'Airy 1830 ellipsoid',
+            5002 => 'Airy Modified 1849 ellipsoid',
+            5003 => 'ANS ellipsoid',
+            5004 => 'Bessel 1841 ellipsoid',
+            5005 => 'Bessel Modified ellipsoid',
+            5006 => 'Bessel Namibia ellipsoid',
+            5007 => 'Clarke 1858 ellipsoid',
+            5008 => 'Clarke 1866 ellipsoid',
+            5010 => 'Clarke 1880 Benoit ellipsoid',
+            5011 => 'Clarke 1880 IGN ellipsoid',
+            5012 => 'Clarke 1880 RGS ellipsoid',
+            5013 => 'Clarke 1880 Arc ellipsoid',
+            5014 => 'Clarke 1880 SGA 1922 ellipsoid',
+            5015 => 'Everest 1830 1937 Adjustment ellipsoid',
+            5016 => 'Everest 1830 1967 Definition ellipsoid',
+            5017 => 'Everest 1830 1975 Definition ellipsoid',
+            5018 => 'Everest 1830 Modified ellipsoid',
+            5019 => 'GRS 1980 ellipsoid',
+            5020 => 'Helmert 1906 ellipsoid',
+            5021 => 'INS ellipsoid',
+            5022 => 'International 1924 ellipsoid',
+            5023 => 'International 1967 ellipsoid',
+            5024 => 'Krassowsky 1940 ellipsoid',
+            5025 => 'NWL 9D ellipsoid',
+            5026 => 'NWL 10D ellipsoid',
+            5027 => 'Plessis 1817 ellipsoid',
+            5028 => 'Struve 1860 ellipsoid',
+            5029 => 'War Office ellipsoid',
+            5030 => 'WGS 84 ellipsoid',
+            5031 => 'GEM 10C ellipsoid',
+            5032 => 'OSU86F ellipsoid',
+            5033 => 'OSU91A ellipsoid',
+            5101 => 'Newlyn',
+            5102 => 'North American Vertical Datum 1929',
+            5103 => 'North American Vertical Datum 1988',
+            5104 => 'Yellow Sea 1956',
+            5105 => 'Baltic Sea',
+            5106 => 'Caspian Sea',
+            32767 => 'User Defined',
+        },
+    },
+    4097 => 'VerticalCitation',
+    4098 => {
+        Name => 'VerticalDatum',
+        PrintConv => {
+            1 => 'Vertical Datum Base',
+            32767 => 'User Defined',
+        },
+    },
+    4099 => {
+        Name => 'VerticalUnits',
+        SeparateTable => 'Units',
+        PrintConv => \%epsg_units,
+    },
+);
+
+#------------------------------------------------------------------------------
+# Inputs: 0) ExifTool object ref
+# Notes: byte order must be set before calling this routine
+sub ProcessGeoTiff($)
+{
+    my $exifTool = shift;
+    my $dirData = $exifTool->GetValue('GeoTiffDirectory', 'ValueConv') or return;
+    my $doubleData = $exifTool->GetValue('GeoTiffDoubleParams', 'ValueConv');
+    my $asciiData = $exifTool->GetValue('GeoTiffAsciiParams', 'ValueConv');
+    my $verbose = $exifTool->Options('Verbose');
+
+    # restore or original EXIF byte order setting
+    if (length($$dirData) >= 8 and
+        length($$dirData) >= 8 * (Get16u($dirData,6) + 1))
+    {
+        my $version    = Get16u($dirData,0);
+        my $revision   = Get16u($dirData,2);
+        my $minorRev   = Get16u($dirData,4);
+        my $numEntries = Get16u($dirData,6);
+
+        if ($verbose) {
+            $exifTool->{INDENT} .= '| ';
+            $exifTool->VerboseDir('GeoTiff',$numEntries);
+        }
+        # generate version number tag (not a real GeoTiff tag)
+        my $tagTable = GetTagTable("Image::ExifTool::GeoTiff::Main");
+        my $tagInfo = $exifTool->GetTagInfo($tagTable, 1);
+        $tagInfo and $exifTool->FoundTag($tagInfo,"$version.$revision.$minorRev");
+
+        my $i;
+        for ($i=0; $i<$numEntries; ++$i) {
+            my $pt = 8 * ($i + 1);
+            my $tag    = Get16u($dirData, $pt);
+            $tagInfo   = $exifTool->GetTagInfo($tagTable, $tag) or next;
+            my $loc    = Get16u($dirData, $pt+2);
+            my $count  = Get16u($dirData, $pt+4);
+            my $offset = Get16u($dirData, $pt+6);
+            my $format = $geoTiffFormat{$loc};
+            my ($val, $dataPt);
+            if ($format eq 'double') {          # in the double parms
+                $dataPt = $doubleData;
+                $offset *= 8;
+                $val = Image::ExifTool::ReadValue($dataPt, $offset, $format,
+                                                  $count, length($$doubleData)-$offset);
+            } elsif ($format eq 'string') {     # in the ASCII parms
+                $dataPt = $asciiData;
+                $val = substr($$dataPt, $offset, $count);
+                $val =~ s/(\0|\|)$//;   # remove trailing terminator (NULL or '|')
+            } elsif ($format eq 'int16u') {     # use the offset as the value
+                $dataPt = $dirData;
+                $val = $offset;
+                $offset = $pt+6;
+            } else {
+                $exifTool->Warn("Unknown GeoTiff location: $loc");
+                next;
+            }
+            $verbose and $exifTool->VerboseInfo($tag, $tagInfo,
+                'Table'  => $tagTable,
+                'Index'  => $i,
+                'Value'  => $val,
+                'DataPt' => $dataPt,
+                'Start'  => $offset,
+                'Format' => $format,
+                'Count'  => $count,
+                'Size'   => $count * Image::ExifTool::FormatSize($format),
+            );
+            $exifTool->FoundTag($tagInfo, $val);
+        }
+        if ($verbose) {
+            $exifTool->{INDENT} =~ s/..$//;
+        }
+    } else {
+        $exifTool->Warn('Bad GeoTIFF directory');
+    }
+    # must delete these tags once we've processed this information
+    # (to avoid re-processing if another EXIF directory is found)
+    $exifTool->DeleteTag('GeoTiffDirectory');
+    $exifTool->DeleteTag('GeoTiffDoubleParams');
+    $exifTool->DeleteTag('GeoTiffAsciiParams');
+}
+
+
+1;  #end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::GeoTiff - Read GeoTiff meta information
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to interpret
+GeoTiff meta information.  GeoTiff information is used in images to specify
+exact geometric mappings used to transform the image to real world
+coordinates.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item ftp://ftp.remotesensing.org/geotiff/libgeotiff/libgeotiff-1.1.4.tar.gz
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/GeoTiff Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Geotag.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Geotag.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Geotag.pm	(revision 24799)
@@ -0,0 +1,914 @@
+#------------------------------------------------------------------------------
+# File:         Geotag.pm
+#
+# Description:  Geotagging utility routines
+#
+# Revisions:    2009/04/01 - P. Harvey Created
+#               2009/09/27 - PH Added Geosync feature
+#
+# References:   1) http://www.topografix.com/GPX/1/1/
+#               2) http://www.gpsinformation.org/dale/nmea.htm#GSA
+#               3) http://code.google.com/apis/kml/documentation/kmlreference.html
+#               4) http://www.fai.org/gliding/system/files/tech_spec_gnss.pdf
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Geotag;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:Public);
+
+$VERSION = '1.24';
+
+sub SetGeoValues($$;$);
+
+# XML tags that we recognize (keys are forced to lower case)
+my %xmlTag = (
+    lat         => 'lat',       # GPX
+    latitude    => 'lat',       # Garmin
+    latitudedegrees => 'lat',   # Garmin TCX
+    lon         => 'lon',       # GPX
+    longitude   => 'lon',       # Garmin
+    longitudedegrees => 'lon',  # Garmin TCX
+    ele         => 'alt',       # GPX
+    elevation   => 'alt',       # PH
+    alt         => 'alt',       # PH
+    altitude    => 'alt',       # Garmin
+    altitudemeters => 'alt',    # Garmin TCX
+   'time'       => 'time',      # GPX/Garmin
+    fix         => 'fixtype',   # GPX
+    hdop        => 'hdop',      # GPX
+    vdop        => 'vdop',      # GPX
+    pdop        => 'pdop',      # GPX
+    sat         => 'nsats',     # GPX
+    when        => 'time',      # KML
+    coordinates => 'coords',    # KML
+    # XML containers (fix is reset at the opening tag of these properties)
+    wpt         => '',          # GPX
+    trkpt       => '',          # GPX
+    rtept       => '',          # GPX
+    trackpoint  => '',          # Garmin
+    placemark   => '',          # KML
+);
+
+my $secPerDay = 24 * 3600;      # a useful constant
+
+#------------------------------------------------------------------------------
+# Load GPS track log file
+# Inputs: 0) ExifTool ref, 1) track log data or file name
+# Returns: geotag hash data reference or error string
+# - the geotag hash has the following members:
+#       Points - hash of GPS fix information hashes keyed by Unix time
+#       Times  - list of sorted Unix times (keys of Points hash)
+#       NoDate - flag if some points have no date (ie. referenced to 1970:01:01)
+#       IsDate - flag if some points have date
+# - the fix information hash may contain:
+#       lat    - signed latitude (required)
+#       lon    - signed longitude (required)
+#       alt    - signed altitude
+#       time   - fix time in UTC as XML string
+#       fixtype- type of fix ('none'|'2d'|'3d'|'dgps'|'pps')
+#       pdop   - dilution of precision
+#       hdop   - horizontal DOP
+#       vdop   - vertical DOP
+#       sats   - comma-separated list of active satellites
+#       nsats  - number of active satellites
+#       first  - flag set for first fix of track
+# - concatenates new data with existing track data stored in ExifTool NEW_VALUE
+#   for the Geotag tag
+sub LoadTrackLog($$;$)
+{
+    local ($_, $/, *EXIFTOOL_TRKFILE);
+    my ($exifTool, $val) = @_;
+    my ($raf, $from, $time, $isDate, $noDate, $noDateChanged, $lastDate, $dateFlarm);
+    my ($nmeaStart, $fixSecs, @fixTimes, $canCut, $cutPDOP, $cutHDOP, $cutSats, $lastFix);
+
+    unless (eval 'require Time::Local') {
+        return 'Geotag feature requires Time::Local installed';
+    }
+    # add data to existing track
+    my $geotag = $exifTool->GetNewValues('Geotag') || { };
+    my $format = '';
+    # is $val track log data?
+    if ($val =~ /^(\xef\xbb\xbf)?<(\?xml|gpx)\s/) {
+        $format = 'XML';
+        $/ = '>';   # set input record separator to '>' for XML/GPX data
+    } elsif ($val =~ /(\x0d\x0a|\x0d|\x0a)/) {
+        $/ = $1;
+    } else {
+        # $val is track file name
+        open EXIFTOOL_TRKFILE, $val or return "Error opening GPS file '$val'";
+        $raf = new File::RandomAccess(\*EXIFTOOL_TRKFILE);
+        unless ($raf->Read($_, 256)) {
+            close EXIFTOOL_TRKFILE;
+            return "Empty track file '$val'";
+        }
+        # look for XML or GPX header (might as well allow UTF-8 BOM)
+        if (/^(\xef\xbb\xbf)?<(\?xml|gpx)\s/) {
+            $format = 'XML';
+            $/ = '>';   # set input record separator to '>' for XML/GPX data
+        } elsif (/(\x0d\x0a|\x0d|\x0a)/) {
+            $/ = $1;
+        } else {
+            close EXIFTOOL_TRKFILE;
+            return "Invalid track file '$val'";
+        }
+        $raf->Seek(0,0);
+        $from = "file '$val'";
+    }
+    unless ($from) {
+        # set up RAF for reading log file in memory
+        $raf = new File::RandomAccess(\$val);
+        $from = 'data';
+    }
+    # initialize track points lookup
+    my $points = $$geotag{Points};
+    $points or $points = $$geotag{Points} = { };
+
+    # initialize cuts
+    my $maxHDOP = $exifTool->Options('GeoMaxHDOP');
+    my $maxPDOP = $exifTool->Options('GeoMaxPDOP');
+    my $minSats = $exifTool->Options('GeoMinSats');
+    my $isCut = $maxHDOP || $maxPDOP || $minSats;
+
+    my $numPoints = 0;
+    my $skipped = 0;
+    my $lastSecs = 0;
+    my $fix = { };
+    for (;;) {
+        $raf->ReadLine($_) or last;
+        # determine file format
+        if (not $format) {
+            if (/^<(\?xml|gpx)\s/) { # look for XML or GPX header
+                $format = 'XML';
+            } elsif (/^\$(PMGNTRK|GP(RMC|GGA|GLL|GSA)),/) {
+                $format = 'NMEA';
+                $nmeaStart = $2 || $1;    # save type of first sentence
+            } elsif (/^A(FLA|XSY|FIL)/) {
+                # (don't set format yet because we want to read HFDTE first)
+                $nmeaStart = 'B' ;
+                next;
+            } elsif (/^HFDTE(\d{2})(\d{2})(\d{2})/) {
+                my $year = $3 + ($3 >= 70 ? 1900 : 2000);
+                $dateFlarm = Time::Local::timegm(0,0,0,$1,$2-1,$year-1900);
+                $nmeaStart = 'B' ;
+                $format = 'IGC';
+                next;
+            } elsif ($nmeaStart and /^B/) {
+                # parse IGC fixes without a date
+                $format = 'IGC';                
+            } else {
+                # search only first 50 lines of file for a valid fix
+                last if ++$skipped > 50;
+                next;
+            }
+        }
+#
+# XML format (GPX, KML, Garmin XML/TCX etc)
+#
+        if ($format eq 'XML') {
+            my ($arg, $tok, $td);
+            s/\s*=\s*(['"])\s*/=$1/g;  # remove unnecessary white space in attributes
+            foreach $arg (split) {
+                # parse attributes (ie. GPX 'lat' and 'lon')
+                # (note: ignore namespace prefixes if they exist)
+                if ($arg =~ /^(\w+:)?(\w+)=(['"])(.*?)\3/g) {
+                    my $tag = $xmlTag{lc $2};
+                    $$fix{$tag} = $4 if $tag;
+                }
+                # loop through XML elements
+                while ($arg =~ m{([^<>]*)<(/)?(\w+:)?(\w+)(>|$)}g) {
+                    my $tag = $xmlTag{$tok = lc $4};
+                    # parse as a simple property if this element has a value
+                    if (defined $tag and not $tag) {
+                        # a containing property was opened or closed
+                        if (not $2) {
+                            # opened: start a new fix
+                            $lastFix = $fix = { };
+                            next;
+                        } elsif ($fix and $lastFix and %$fix) {
+                            # closed: transfer additional tags from current fix
+                            foreach (keys %$fix) {
+                                $$lastFix{$_} = $$fix{$_} unless defined $$lastFix{$_};
+                            }
+                            undef $lastFix;
+                        }
+                    }
+                    if (length $1) {
+                        if ($tag) {
+                            if ($tag eq 'coords') {
+                                # read KML "Point" coordinates
+                                @$fix{'lon','lat','alt'} = split ',', $1;
+                            } else {
+                                $$fix{$tag} = $1;
+                            }
+                        }
+                        next;
+                    } elsif ($tok eq 'td') {
+                        $td = 1;
+                    }
+                    # validate and store GPS fix
+                    if (defined $$fix{lat} and defined $$fix{lon} and $$fix{'time'} and
+                        $$fix{lat} =~ /^[+-]?\d+\.?\d*/ and
+                        $$fix{lon} =~ /^[+-]?\d+\.?\d*/ and
+                        $$fix{'time'} =~ /^(\d{4})-(\d+)-(\d+)T(\d+):(\d+):(\d+)(\.\d+)?(.*)/)
+                    {
+                        $time = Time::Local::timegm($6,$5,$4,$3,$2-1,$1-1900);
+                        $time += $7 if $7;  # add fractional seconds
+                        my $tz = $8;
+                        # adjust for time zone (otherwise assume UTC)
+                        # - allow timezone of +-HH:MM, +-H:MM, +-HHMM or +-HH since
+                        #   the spec is unclear about timezone format
+                        if ($tz =~ /^([-+])(\d+):(\d{2})\b/ or $tz =~ /^([-+])(\d{2})(\d{2})?\b/) {
+                            $tz = ($2 * 60 + ($3 || 0)) * 60;
+                            $tz *= -1 if $1 eq '+'; # opposite sign to change back to UTC
+                            $time += $tz;
+                        }
+                        # validate altitude
+                        undef $$fix{alt} if defined $$fix{alt} and $$fix{alt} !~ /^[+-]?\d+\.?\d*/;
+                        $isDate = 1;
+                        $canCut= 1 if defined $$fix{pdop} or defined $$fix{hdop} or defined $$fix{nsats};
+                        $$points{$time} = $fix;
+                        push @fixTimes, $time;  # save times of all fixes in order
+                        $fix = { };
+                        ++$numPoints;
+                    }
+                }
+            }
+            # last ditch check KML description for timestamp (assume it is UTC)
+            $$fix{'time'} = "$1T$2Z" if $td and not $$fix{'time'} and
+                /[\s>](\d{4}-\d{2}-\d{2})[T ](\d{2}:\d{2}:\d{2}(\.\d+)?)/;
+            next;
+        }
+        my (%fix, $secs, $date, $nmea);
+        if ($format eq 'NMEA') {
+            # ignore unrecognized NMEA sentences
+            next unless /^\$(PMGNTRK|GP(RMC|GGA|GLL|GSA)),/;
+            $nmea = $2 || $1;
+        }
+#
+# IGC (flarm) (ref 4)
+#
+        if ( $format eq 'IGC' ) {
+            # B0939564531208N00557021EA007670089100207
+            # BHHMMSSDDMMmmmNDDDMMmmmEAaaaaaAAAAAxxyy
+            #    HH     MM     SS     DD     MM     mmm          DDD    MM     mmm                aaaaa AAAAA
+            #    1      2      3      4      5      6      7     8      9      10     11    12    13    14
+            /^B(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{3})([NS])(\d{3})(\d{2})(\d{3})([EW])([AV])(\d{5})(\d{5})/ or next;
+            $fix{lat} = ($4 + ($5 + $6/1000)/60) * ($7  eq 'N' ? 1 : -1);
+            $fix{lon} = ($8 + ($9 +$10/1000)/60) * ($11 eq 'E' ? 1 : -1);
+            $fix{alt} = $12 eq 'A' ? $14 : undef;
+            $secs = (($1 * 60) + $2) * 60 + $3;
+            # wrap to next day if necessary
+            if ($dateFlarm) {
+                $dateFlarm += $secPerDay if $secs < $lastSecs;
+                $date = $dateFlarm;
+            }
+            $nmea = 'B';
+#
+# Magellan eXplorist NMEA-like PMGNTRK sentence (optionally contains date)
+#
+        } elsif ($nmea eq 'PMGNTRK') {
+            # $PMGNTRK,4415.026,N,07631.091,W,00092,M,185031.06,A,,020409*65
+            # $PMGNTRK,ddmm.mmm,N/S,dddmm.mmm,E/W,alt,F/M,hhmmss.ss,A/V,trkname,DDMMYY*cs
+            /^\$PMGNTRK,(\d+)(\d{2}\.\d+),([NS]),(\d+)(\d{2}\.\d+),([EW]),(-?\d+\.?\d*),([MF]),(\d{2})(\d{2})(\d+)(\.\d+)?,A,(?:[^,]*,(\d{2})(\d{2})(\d+))?/ or next;
+            $fix{lat} = ($1 + $2/60) * ($3 eq 'N' ? 1 : -1);
+            $fix{lon} = ($4 + $5/60) * ($6 eq 'E' ? 1 : -1);
+            $fix{alt} = $8 eq 'M' ? $7 : $7 * 12 * 0.0254;
+            $secs = (($9 * 60) + $10) * 60 + $11;
+            $secs += $12 if $12;    # add fractional seconds
+            if (defined $15) {
+                # optional date is available in PMGNTRK sentence
+                my $year = $15 + ($15 >= 70 ? 1900 : 2000);
+                $date = Time::Local::timegm(0,0,0,$13,$14-1,$year-1900);
+            }
+#
+# NMEA RMC sentence (contains date)
+#
+        } elsif ($nmea eq 'RMC') {
+            #  $GPRMC,092204.999,A,4250.5589,S,14718.5084,E,0.00,89.68,211200,,*25
+            #  $GPRMC,hhmmss.sss,A/V,ddmm.mmmm,N/S,ddmmm.mmmm,E/W,spd(knots),dir(deg),DDMMYY,,*cs
+            /^\$GPRMC,(\d{2})(\d{2})(\d+)(\.\d+)?,A,(\d+)(\d{2}\.\d+),([NS]),(\d+)(\d{2}\.\d+),([EW]),[^,]*,[^,]*,(\d{2})(\d{2})(\d+)/ or next;
+            $fix{lat} = ($5 + $6/60) * ($7 eq 'N' ? 1 : -1);
+            $fix{lon} = ($8 + $9/60) * ($10 eq 'E' ? 1 : -1);
+            my $year = $13 + ($13 >= 70 ? 1900 : 2000);
+            $secs = (($1 * 60) + $2) * 60 + $3;
+            $secs += $4 if $4;      # add fractional seconds
+            $date = Time::Local::timegm(0,0,0,$11,$12-1,$year-1900);
+#
+# NMEA GGA sentence (no date)
+#
+        } elsif ($nmea eq 'GGA') {
+            #  $GPGGA,092204.999,4250.5589,S,14718.5084,E,1,04,24.4,19.7,M,,,,0000*1F
+            #  $GPGGA,hhmmss.sss,ddmm.mmmm,N/S,dddmm.mmmm,E/W,0=invalid,sats,hdop,alt,M,...
+            /^\$GPGGA,(\d{2})(\d{2})(\d+)(\.\d+)?,(\d+)(\d{2}\.\d+),([NS]),(\d+)(\d{2}\.\d+),([EW]),[1-6],(\d+)?,(\.\d+|\d+\.?\d*)?,(-?\d+\.?\d*)?,M?,/ or next;
+            $fix{lat} = ($5 + $6/60) * ($7 eq 'N' ? 1 : -1);
+            $fix{lon} = ($8 + $9/60) * ($10 eq 'E' ? 1 : -1);
+            $fix{nsats} = $11;
+            $fix{hdop} = $12;
+            $fix{alt} = $13;
+            $secs = (($1 * 60) + $2) * 60 + $3;
+            $secs += $4 if $4;      # add fractional seconds
+            $canCut = 1;
+#
+# NMEA GLL sentence (no date)
+#
+        } elsif ($nmea eq 'GLL') {
+            #  $GPGLL,4250.5589,S,14718.5084,E,092204.999,A*2D
+            #  $GPGLL,ddmm.mmmm,N/S,dddmm.mmmm,E/W,hhmmss.sss,A/V*cs
+            /^\$GPGLL,(\d+)(\d{2}\.\d+),([NS]),(\d+)(\d{2}\.\d+),([EW]),(\d{2})(\d{2})(\d+)(\.\d+),A/ or next;
+            $fix{lat} = ($1 + $2/60) * ($3 eq 'N' ? 1 : -1);
+            $fix{lon} = ($4 + $5/60) * ($6 eq 'E' ? 1 : -1);
+            $secs = (($7 * 60) + $8) * 60 + $9;
+            $secs += $10 if $10;    # add fractional seconds
+#
+# NMEA GSA sentence (satellite status, no date)
+#
+        } elsif ($nmea eq 'GSA') {
+            # $GPGSA,A,3,04,05,,,,,,,,,,,pdop,hdop,vdop*HH
+            /^\$GPGSA,[AM],([23]),((?:\d*,){11}(?:\d*)),(\d+\.?\d*|\.\d+)?,(\d+\.?\d*|\.\d+)?,(\d+\.?\d*|\.\d+)?\*/ or next;
+            @fix{qw(fixtype sats pdop hdop vdop)} = ($1.'d',$2,$3,$4,$5);
+            # count the number of acquired satellites
+            my @a = ($fix{sats} =~ /\d+/g);
+            $fix{nsats} = scalar @a;
+            $canCut = 1;
+
+        } else {
+            next;   # this shouldn't happen
+        }
+        # use last date if necessary (and appropriate)
+        if (defined $secs and not defined $date and defined $lastDate) {
+            # wrap to next day if necessary
+            if ($secs < $lastSecs) {
+                $lastSecs -= $secPerDay;
+                $lastDate += $secPerDay;
+            }
+            # use earlier date only if we are within 10 seconds
+            if ($secs - $lastSecs < 10) {
+                # last date is close, use it for this fix
+                $date = $lastDate;
+            } else {
+                # last date is old, discard it
+                undef $lastDate;
+                undef $lastSecs;
+            }
+        }
+        # save our last date/time
+        if (defined $date) {
+            $lastDate = $date;
+            $lastSecs = $secs;
+        }
+#
+# Add NMEA fix to our lookup
+# (this is much more complicated than it needs to be because
+#  the stupid NMEA format provides no end-of-fix indication)
+#
+        # assumptions for each NMEA sentence:
+        # - we only parse a time if we get a lat/lon
+        # - we always get a time if we have a date
+        if ($nmea eq $nmeaStart or (defined $secs and (not defined $fixSecs or
+            # don't combine sentences that are outside 10 seconds apart
+            ($secs >= $fixSecs and $secs - $fixSecs >= 10) or
+            ($secs <  $fixSecs and $secs + $secPerDay - $fixSecs >= 10))))
+        {
+            # start a new fix
+            $fix = \%fix;
+            $fixSecs = $secs;
+            undef $noDateChanged;
+            # does this fix have a date/time or time stamp?
+            if (defined $date) {
+                $fix{isDate} = $isDate = 1;
+                $time = $date + $secs;
+            } elsif (defined $secs) {
+                $time = $secs;
+                $noDate = $noDateChanged = 1;
+            } else {
+                next;   # wait until we have a time before adding to lookup
+            }
+        } else {
+            # add new data to existing fix (but don't overwrite earlier values to
+            # keep the coordinates in sync with the fix time)
+            foreach (keys %fix) {
+                $$fix{$_} = $fix{$_} unless defined $$fix{$_};
+            }
+            if (defined $date) {
+                next if $$fix{isDate};
+                # move this fix to the proper date
+                if (defined $fixSecs) {
+                    delete $$points{$fixSecs};
+                    pop @fixTimes if @fixTimes and $fixTimes[-1] == $fixSecs;
+                    --$numPoints;
+                    # if we wrapped to the next day since the start of this fix,
+                    # we must shift the date back to the day of $fixSecs
+                    $date -= $secPerDay if $secs < $fixSecs;
+                } else {
+                    $fixSecs = $secs;
+                }
+                $time = $date + $fixSecs;
+                $$fix{isDate} = $isDate = 1;
+                # revert noDate flag if it was set for this fix
+                $noDate = 0 if $noDateChanged;
+            } elsif (defined $secs and not defined $fixSecs) {
+                $time = $fixSecs = $secs;
+                $noDate = $noDateChanged = 1;
+            } else {
+                next;   # wait until we have a time
+            }
+        }
+        # add fix to our lookup
+        $$points{$time} = $fix;
+        push @fixTimes, $time;  # save time of all fixes in order
+        ++$numPoints;
+    }
+    $raf->Close();
+
+    # set date flags
+    if ($noDate and not $$geotag{NoDate}) {
+        if ($isDate) {
+            $exifTool->Warn('Fixes are date-less -- will use time-only interpolation');
+        } else {
+            $exifTool->Warn('Some fixes are date-less -- may use time-only interpolation');
+        }
+        $$geotag{NoDate} = 1;
+    }
+    $$geotag{IsDate} = 1 if $isDate;
+
+    # cut bad fixes if necessary
+    if ($isCut and $canCut) {
+        $cutPDOP = $cutHDOP = $cutSats = 0;
+        my @goodTimes;
+        foreach (@fixTimes) {
+            $fix = $$points{$_} or next;
+            if ($maxPDOP and $$fix{pdop} and $$fix{pdop} > $maxPDOP) {
+                delete $$points{$_};
+                ++$cutPDOP;
+            } elsif ($maxHDOP and $$fix{hdop} and $$fix{hdop} > $maxHDOP) {
+                delete $$points{$_};
+                ++$cutHDOP;
+            } elsif ($minSats and defined $$fix{nsats} and $$fix{nsats} ne '' and
+                $$fix{nsats} < $minSats)
+            {
+                delete $$points{$_};
+                ++$cutSats;
+            } else {
+                push @goodTimes, $_;
+            }
+        }
+        @fixTimes = @goodTimes; # update fix times
+        $numPoints -= $cutPDOP;
+        $numPoints -= $cutHDOP;
+        $numPoints -= $cutSats;
+    }
+    # mark first fix of the track
+    while (@fixTimes) {
+        $fix = $$points{$fixTimes[0]} or shift(@fixTimes), next;
+        $$fix{first} = 1;
+        last;
+    }
+    my $verbose = $exifTool->Options('Verbose');
+    if ($verbose) {
+        my $out = $exifTool->Options('TextOut');
+        print $out "Loaded $numPoints points from GPS track log $from\n";
+        print $out "Ignored $cutPDOP points due to GeoMaxPDOP cut\n" if $cutPDOP;
+        print $out "Ignored $cutHDOP points due to GeoMaxHDOP cut\n" if $cutHDOP;
+        print $out "Ignored $cutSats points due to GeoMinSats cut\n" if $cutSats;
+        if ($numPoints and $verbose > 1) {
+            print $out '  GPS track start: ' . Image::ExifTool::ConvertUnixTime($fixTimes[0]) . " UTC\n";
+            if ($verbose > 3) {
+                foreach $time (@fixTimes) {
+                    $fix = $$points{$time} or next;
+                    print $out '    ',Image::ExifTool::ConvertUnixTime($time),' UTC -';
+                    foreach (sort keys %$fix) {
+                        print $out " $_=$$fix{$_}" unless $_ eq 'time';
+                    }
+                    print $out "\n";
+                }
+            }
+            print $out '  GPS track end:   ' . Image::ExifTool::ConvertUnixTime($fixTimes[-1]) . " UTC\n";
+        }
+    }
+    if ($numPoints) {
+        # reset timestamp list to force it to be regenerated
+        delete $$geotag{Times};
+        return $geotag;     # success!
+    }
+    return "No track points found in GPS $from";
+}
+
+#------------------------------------------------------------------------------
+# Apply Geosync time correction
+# Inputs: 0) ExifTool ref, 1) Unix UTC time value
+# Returns: sync time difference (and updates input time), or undef if no sync
+sub ApplySyncCorr($$)
+{
+    my ($exifTool, $time) = @_;
+    my $sync = $exifTool->GetNewValues('Geosync');
+    if (ref $sync eq 'HASH') {
+        my $syncTimes = $$sync{Times};
+        if ($syncTimes) {
+            # find the nearest 2 sync points
+            my ($i0, $i1) = (0, scalar(@$syncTimes) - 1);
+            while ($i1 > $i0 + 1) {
+                my $pt = int(($i0 + $i1) / 2);
+                if ($time < $$syncTimes[$pt]) {
+                    $i1 = $pt;
+                } else {
+                    $i0 = $pt;
+                }
+            }
+            my ($t0, $t1) = ($$syncTimes[$i0], $$syncTimes[$i1]);
+            # interpolate/extrapolate to account for linear camera clock drift
+            my $syncPoints = $$sync{Points};
+            my $f = $t1 == $t0 ? 0 : ($time - $t0) / ($t1 - $t0);
+            $sync = $$syncPoints{$t1} * $f + $$syncPoints{$t0} * (1 - $f);
+        } else {
+            $sync = $$sync{Offset}; # use fixed time offset
+        }
+        $_[1] += $sync;
+    } else {
+        undef $sync;
+    }
+    return $sync;
+}
+
+#------------------------------------------------------------------------------
+# Set new geotagging values according to date/time
+# Inputs: 0) ExifTool object ref, 1) date/time value (or undef to delete tags)
+#         2) optional write group
+# Returns: error string, or '' on success
+# Notes: Uses track data stored in ExifTool NEW_VALUE for Geotag tag
+sub SetGeoValues($$;$)
+{
+    local $_;
+    my ($exifTool, $val, $writeGroup) = @_;
+    my $geotag = $exifTool->GetNewValues('Geotag');
+    my ($fix, $time, $fsec, $noDate, $secondTry);
+
+    # remove date if none of our fixes had date information
+    $val =~ s/^\S+\s+// if $val and $geotag and not $$geotag{IsDate};
+
+    # maximum time (sec) from nearest GPS fix when position is still considered valid
+    my $geoMaxIntSecs = $exifTool->Options('GeoMaxIntSecs');
+    my $geoMaxExtSecs = $exifTool->Options('GeoMaxExtSecs');
+    # use 30 minutes for a default
+    defined $geoMaxIntSecs or $geoMaxIntSecs = 1800;
+    defined $geoMaxExtSecs or $geoMaxExtSecs = 1800;
+
+    my $points = $$geotag{Points};
+    my $err = '';
+    # loop to try date/time value first, then time-only value
+    while (defined $val) {
+        unless (defined $geotag) {
+            $err = 'No GPS track loaded';
+            last;
+        }
+        my $times = $$geotag{Times};
+        unless ($times) {
+            # generate sorted timestamp list for binary search
+            my @times = sort { $a <=> $b } keys %$points;
+            $times = $$geotag{Times} = \@times;
+        }
+        unless ($times and @$times) {
+            $err = 'GPS track is empty';
+            last;
+        }
+        unless (eval 'require Time::Local') {
+            $err = 'Geotag feature requires Time::Local installed';
+            last;
+        }
+        # convert date/time to UTC
+        my ($year,$mon,$day,$hr,$min,$sec,$fs,$tz,$t0,$t1,$t2);
+        if ($val =~ /^(\d{4}):(\d+):(\d+)\s+(\d+):(\d+):(\d+)(\.\d*)?(Z|([-+])(\d+):(\d+))?/) {
+            # valid date/time value
+            ($year,$mon,$day,$hr,$min,$sec,$fs,$tz,$t0,$t1,$t2) = ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11);
+        } elsif ($val =~ /^(\d{2}):(\d+):(\d+)(\.\d*)?(Z|([-+])(\d+):(\d+))?/) {
+            # valid time-only value
+            ($hr,$min,$sec,$fs,$tz,$t0,$t1,$t2) = ($1,$2,$3,$4,$5,$6,$7,$8);
+            # use Jan. 2 to avoid going negative after tz adjustment
+            ($year,$mon,$day) = (1970,1,2);
+            $noDate = 1;
+        } else {
+            $err = 'Invalid date/time (use YYYY:mm:dd HH:MM:SS[.ss][+/-HH:MM|Z])';
+            last;
+        }
+        if ($tz) {
+            $time = Time::Local::timegm($sec,$min,$hr,$day,$mon-1,$year-1900);
+            # use timezone from date/time value
+            if ($tz ne 'Z') {
+                my $tzmin = $t1 * 60 + $t2;
+                $time -= ($t0 eq '-' ? -$tzmin : $tzmin) * 60;
+            }
+        } else {
+            # assume local timezone
+            $time = Image::ExifTool::TimeLocal($sec,$min,$hr,$day,$mon-1,$year-1900);
+        }
+        # add fractional seconds
+        $time += $fs if $fs and $fs ne '.';
+
+        # bring UTC time back to Jan. 1 if no date is given
+        $time %= $secPerDay if $noDate;
+
+        # apply time synchronization if available
+        my $sync = ApplySyncCorr($exifTool, $time);
+
+        # save fractional seconds string
+        $fsec = ($time =~ /(\.\d+)$/) ? $1 : '';
+
+        if ($exifTool->Options('Verbose') > 1 and not $secondTry) {
+            my $out = $exifTool->Options('TextOut');
+            my $str = "$fsec UTC";
+            $str .= sprintf(" (incl. Geosync offset of %+.3f sec)", $sync) if defined $sync;
+            print $out '  Geotime value:   ' . Image::ExifTool::ConvertUnixTime(int $time) . "$str\n";
+        }
+        # interpolate GPS track at $time
+        if ($time < $$times[0]) {
+            if ($time < $$times[0] - $geoMaxExtSecs) {
+                $err or $err = 'Time is too far before track';
+            } else {
+                $fix = $$points{$$times[0]};
+            }
+        } elsif ($time > $$times[-1]) {
+            if ($time > $$times[-1] + $geoMaxExtSecs) {
+                $err or $err = 'Time is too far beyond track';
+            } else {
+                $fix = $$points{$$times[-1]};
+            }
+        } else {
+            # find nearest 2 points in time
+            my ($i0, $i1) = (0, scalar(@$times) - 1);
+            while ($i1 > $i0 + 1) {
+                my $pt = int(($i0 + $i1) / 2);
+                if ($time < $$times[$pt]) {
+                    $i1 = $pt;
+                } else {
+                    $i0 = $pt;
+                }
+            }
+            # do linear interpolation for position
+            my $t0 = $$times[$i0];
+            my $t1 = $$times[$i1];
+            my $p1 = $$points{$t1};
+            # check to see if we are extrapolating before the first entry in a track
+            my $maxSecs = $$p1{first} ? $geoMaxExtSecs : $geoMaxIntSecs;
+            # don't interpolate if fixes are too far apart
+            if ($t1 - $t0 > $maxSecs) {
+                # treat as an extrapolation -- use nearest fix if close enough
+                my $tn = ($time - $t0 < $t1 - $time) ? $t0 : $t1;
+                if (abs($time - $tn) > $geoMaxExtSecs) {
+                    $err or $err = 'Time is too far from nearest GPS fix';
+                } else {
+                    $fix = $$points{$tn};
+                }
+            } else {
+                my $f = $t1 == $t0 ? 0 : ($time - $t0) / ($t1 - $t0);
+                my $p0 = $$points{$t0};
+                $fix = { };
+                # loop through latitude, longitude, and altitude if available
+                foreach (qw(lat lon alt)) {
+                    next unless defined $$p0{$_} and defined $$p1{$_};
+                    $$fix{$_} = $$p1{$_} * $f + $$p0{$_} * (1 - $f);
+                }
+            }
+        }
+        if ($fix) {
+            $err = '';  # success!
+        } elsif ($$geotag{NoDate} and not $noDate and $val =~ s/^\S+\s+//) {
+            # try again with no date since some of our track points are date-less
+            $secondTry = 1;
+            next;
+        }
+        last;
+    }
+    if ($fix) {
+        my ($gpsDate, $gpsAlt, $gpsAltRef);
+        my @t = gmtime(int $time);
+        my $gpsTime = sprintf('%.2d:%.2d:%.2d', $t[2], $t[1], $t[0]) . $fsec;
+        # write GPSDateStamp if date included in track log, otherwise delete it
+        $gpsDate = sprintf('%.2d:%.2d:%.2d', $t[5]+1900, $t[4]+1, $t[3]) unless $noDate;
+        # write GPSAltitude tags if altitude included in track log, otherwise delete them
+        if (defined $$fix{alt}) {
+            $gpsAlt = abs $$fix{alt};
+            $gpsAltRef = ($$fix{alt} < 0 ? 1 : 0);
+        }
+        # set new GPS tag values (EXIF, or XMP if write group is 'xmp')
+        my ($xmp, $exif, @r);
+        my %opts = ( Type => 'ValueConv' ); # write ValueConv values
+        if ($writeGroup) {
+            $opts{Group} = $writeGroup;
+            $xmp = ($writeGroup =~ /xmp/i);
+            $exif = ($writeGroup =~ /^(exif|gps)$/i);
+        }
+        # (capture error messages by calling SetNewValue in list context)
+        @r = $exifTool->SetNewValue(GPSLatitude => $$fix{lat}, %opts);
+        @r = $exifTool->SetNewValue(GPSLongitude => $$fix{lon}, %opts);
+        @r = $exifTool->SetNewValue(GPSAltitude => $gpsAlt, %opts);
+        @r = $exifTool->SetNewValue(GPSAltitudeRef => $gpsAltRef, %opts);
+        unless ($xmp) {
+            @r = $exifTool->SetNewValue(GPSLatitudeRef => ($$fix{lat} > 0 ? 'N' : 'S'), %opts);
+            @r = $exifTool->SetNewValue(GPSLongitudeRef => ($$fix{lon} > 0 ? 'E' : 'W'), %opts);
+            @r = $exifTool->SetNewValue(GPSDateStamp => $gpsDate, %opts);
+            @r = $exifTool->SetNewValue(GPSTimeStamp => $gpsTime, %opts);
+            # set options to edit XMP:GPSDateTime only if it already exists
+            $opts{EditOnly} = 1;
+            $opts{Group} = 'XMP';
+        }
+        unless ($exif) {
+            @r = $exifTool->SetNewValue(GPSDateTime => "$gpsDate $gpsTime", %opts);
+        }
+    } else {
+        my %opts;
+        $opts{Replace} = 2 if defined $val; # remove existing new values
+        $opts{Group} = $writeGroup if $writeGroup;
+        # reset any GPS values we might have already set
+        foreach (qw(GPSLatitude GPSLatitudeRef GPSLongitude GPSLongitudeRef
+                    GPSAltitude GPSAltitudeRef GPSDateStamp GPSTimeStamp GPSDateTime))
+        {
+            my @r = $exifTool->SetNewValue($_, undef, %opts);
+        }
+    }
+    return $err;
+}
+
+#------------------------------------------------------------------------------
+# Convert Geotagging time synchronization value
+# Inputs: 0) exiftool object ref,
+#         1) time difference string ("[+-]DD MM:HH:SS.ss"), geosync'd file name,
+#            "GPSTIME@IMAGETIME", or "GPSTIME@FILENAME"
+# Returns: geosync hash
+# Notes: calling this routine with more than one geosync'd file causes time drift
+#        correction to be implemented
+sub ConvertGeosync($$)
+{
+    my ($exifTool, $val) = @_;
+    my $sync = $exifTool->GetNewValues('Geosync') || { };
+    my ($syncFile, $gpsTime, $imgTime);
+
+    if ($val =~ /(.*?)\@(.*)/) {
+        $gpsTime = $1;
+        if (-f $2) {
+            $syncFile = $2;
+        } else {
+            $imgTime = $2;
+        }
+    # (take care because "-f '1:30'" crashes ActivePerl 5.10)
+    } elsif ($val !~ /^\d/ or $val !~ /:/) {
+        $syncFile = $val if -f $val;
+    }
+    if ($gpsTime or defined $syncFile) {
+        # (this is a time synchronization vector)
+        if (defined $syncFile) {
+            # check the following tags in order to obtain the image timestamp
+            my @timeTags = qw(SubSecDateTimeOriginal SubSecCreateDate SubSecModifyDate
+                              DateTimeOriginal CreateDate ModifyDate FileModifyDate);
+            my $info = ImageInfo($syncFile, { PrintConv => 0 }, @timeTags,
+                                 'GPSDateTime', 'GPSTimeStamp');
+            $$info{Error} and warn("$$info{Err}\n"), return undef;
+            $gpsTime or $gpsTime = $$info{GPSDateTime} || $$info{GPSTimeStamp};
+            my $tag;
+            foreach $tag (@timeTags) {
+                if ($$info{$tag}) {
+                    $imgTime = $$info{$tag};
+                    $exifTool->VPrint(2, "Geosyncing with $tag from '$syncFile'\n");
+                    last;
+                }
+            }
+            $gpsTime or warn("No GPSTimeStamp in '$syncFile\n"), return undef;
+            $imgTime or warn("No image timestamp in '$syncFile'\n"), return undef;
+        }
+        # add date to date-less timestamps
+        my ($imgDateTime, $gpsDateTime, $noDate);
+        if ($imgTime =~ /^(\d+:\d+:\d+)\s+\d+/) {
+            $imgDateTime = $imgTime;
+            my $date = $1;
+            if ($gpsTime =~ /^\d+:\d+:\d+\s+\d+/) {
+                $gpsDateTime = $gpsTime;
+            } else {
+                $gpsDateTime = "$date $gpsTime";
+            }
+        } elsif ($gpsTime =~ /^(\d+:\d+:\d+)\s+\d+/) {
+            $imgDateTime = "$1 $imgTime";
+            $gpsDateTime = $gpsTime;
+        } else {
+            # use a today's date (so hopefully the DST setting will be intuitive)
+            my @tm = localtime;
+            my $date = sprintf('%.4d:%.2d:%.2d', $tm[5]+1900, $tm[4]+1, $tm[3]);
+            $gpsDateTime = "$date $gpsTime";
+            $imgDateTime = "$date $imgTime";
+            $noDate = 1;
+        }
+        # calculate Unix seconds since the epoch
+        my $imgSecs = Image::ExifTool::GetUnixTime($imgDateTime, 1);
+        defined $imgSecs or warn("Invalid image time '$imgTime'\n"), return undef;
+        my $gpsSecs = Image::ExifTool::GetUnixTime($gpsDateTime, 1);
+        defined $gpsSecs or warn("Invalid GPS time '$gpsTime'\n"), return undef;
+        # add fractional seconds
+        $gpsSecs += $1 if $gpsTime =~ /(\.\d+)/;
+        $imgSecs += $1 if $imgTime =~ /(\.\d+)/;
+        # shift dates within 12 hours of each other if either timestamp was date-less
+        if ($gpsDateTime ne $gpsTime or $imgDateTime ne $imgTime) {
+            my $diff = ($imgSecs - $gpsSecs) % (24 * 3600);
+            $diff -= 24 * 3600 if $diff > 12 * 3600;
+            $diff += 24 * 3600 if $diff < -12 * 3600;
+            if ($gpsDateTime ne $gpsTime) {
+                $gpsSecs = $imgSecs - $diff;
+            } else {
+                $imgSecs = $gpsSecs + $diff;
+            }
+        }
+        # save the synchronization offset
+        $$sync{Offset} = $gpsSecs - $imgSecs;
+        # save this synchronization point if either timestamp had a date
+        unless ($noDate) {
+            $$sync{Points} or $$sync{Points} = { };
+            $$sync{Points}{$imgSecs} = $$sync{Offset};
+            # print verbose output
+            if ($exifTool->Options('Verbose') > 1) {
+                # print GPS and image timestamps in UTC
+                my $gps = Image::ExifTool::ConvertUnixTime($gpsSecs);
+                my $img = Image::ExifTool::ConvertUnixTime($imgSecs);
+                $gps .= $1 if $gpsTime =~ /(\.\d+)/;
+                $img .= $1 if $imgTime =~ /(\.\d+)/;
+                $exifTool->VPrint(1, "Added Geosync point:\n",
+                                     "  GPS time stamp:  $gps UTC\n",
+                                     "  Image date/time: $img UTC\n");
+            }
+            # save sorted list of image sync times if we have more than one
+            my @times = keys %{$$sync{Points}};
+            if (@times > 1) {
+                @times = sort { $a <=> $b } @times;
+                $$sync{Times} = \@times;
+            }
+        }
+    } else {
+        # (this is a simple time difference)
+        my @vals = $val =~ /(?=\d|\.\d)\d*(?:\.\d*)?/g; # (allow decimal values too)
+        @vals or warn("Invalid value (please refer to geotag documentation)\n"), return undef;
+        my $secs = 0;
+        my $mult;
+        foreach $mult (1, 60, 3600, $secPerDay) {
+            $secs += $mult * pop(@vals);
+            last unless @vals;
+        }
+        # set constant sync offset
+        $$sync{Offset} = $val =~ /^\s*-/ ? -$secs : $secs;
+    }
+    return $sync;
+}
+
+#------------------------------------------------------------------------------
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Geotag - Geotagging utility routines
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module loads GPS track logs, interpolates to determine position based
+on time, and sets new GPS values for geotagging images.  Currently supported
+formats are GPX, NMEA RMC/GGA/GLL, KML, IGC, Garmin XML and TCX, and
+Magellan PMGNTRK.
+
+Methods in this module should not be called directly.  Instead, the Geotag
+feature is accessed by writing the values of the ExifTool Geotag, Geosync
+and Geotime tags (see the L<Extra Tags|Image::ExifTool::TagNames/Extra Tags>
+in the tag name documentation).
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.topografix.com/GPX/1/1/>
+
+=item L<http://www.gpsinformation.org/dale/nmea.htm#GSA>
+
+=item L<http://code.google.com/apis/kml/documentation/kmlreference.html>
+
+=item L<http://www.fai.org/gliding/system/files/tech_spec_gnss.pdf>
+
+=back
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Lionel Genet for the ability to read IGC format track logs.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/Extra Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/H264.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/H264.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/H264.pm	(revision 24799)
@@ -0,0 +1,1091 @@
+#------------------------------------------------------------------------------
+# File:         H264.pm
+#
+# Description:  Read meta information from H.264 video
+#
+# Revisions:    2010/01/31 - P. Harvey Created
+#
+# References:   1) http://www.itu.int/rec/T-REC-H.264/e (T-REC-H.264-200305-S!!PDF-E.pdf)
+#               2) http://miffteevee.co.uk/documentation/development/H264Parser_8cpp-source.html
+#               3) http://ffmpeg.org/
+#               4) US Patent 2009/0052875 A1
+#               5) European Patent (EP2 051 528A1) application no. 07792522.0 filed 08.08.2007
+#               6) Dave Nicholson private communication
+#               7) http://www.freepatentsonline.com/20050076039.pdf
+#
+# Glossary:     RBSP = Raw Byte Sequence Payload
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::H264;
+
+use strict;
+use vars qw($VERSION %convMake);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::Exif;
+
+$VERSION = '1.06';
+
+sub ProcessSEI($$);
+
+my $parsePictureTiming; # flag to enable parsing of picture timing information (test only)
+
+# lookup for camera manufacturer name
+%convMake = (
+    0x0103 => 'Panasonic',
+    0x0108 => 'Sony',
+    0x1011 => 'Canon',
+);
+
+# information extracted from H.264 video streams
+%Image::ExifTool::H264::Main = (
+    GROUPS => { 2 => 'Video' },
+    VARS => { NO_ID => 1 },
+    NOTES => q{
+        Tags extracted from H.264 video streams.  The metadata for AVCHD videos is
+        stored in this stream.
+    },
+    ImageWidth => { },
+    ImageHeight => { },
+    MDPM => { SubDirectory => { TagTable => 'Image::ExifTool::H264::MDPM' } },
+);
+
+# H.264 Supplemental Enhancement Information User Data (ref PH/4)
+%Image::ExifTool::H264::MDPM = (
+    GROUPS => { 2 => 'Camera' },
+    PROCESS_PROC => \&ProcessSEI,
+    TAG_PREFIX => 'MDPM',
+    NOTES => q{
+        The following tags are decoded from the Modified Digital Video Pack Metadata
+        (MDPM) of the unregistered user data with UUID
+        17ee8c60f84d11d98cd60800200c9a66 in the H.264 Supplemental Enhancement
+        Information (SEI).  I<[Yes, this description is confusing, but nothing
+        compared to the challenge of actually decoding the data!]>  This information
+        may exist at regular intervals through the entire video, but only the first
+        occurrence is extracted unless the ExtractEmbedded (-ee) option is used (in
+        which case subsequent occurrences are extracted as sub-documents).
+    },
+    # (Note: all these are explained in IEC 61834-4, but it costs money so it is useless to me)
+    # 0x00 - ControlCassetteID (ref 7)
+    # 0x01 - ControlTapeLength (ref 7)
+    # 0x02 - ControlTimerActDate (ref 7)
+    # 0x03 - ControlTimerACS_S_S (ref 7)
+    # 0x04-0x05 - ControlPR_StartPoint (ref 7)
+    # 0x06 - ControlTagIDNoGenre (ref 7)
+    # 0x07 - ControlTopicPageHeader (ref 7)
+    # 0x08 - ControlTextHeader (ref 7)
+    # 0x09 - ControlText (ref 7)
+    # 0x0a-0x0b - ControlTag (ref 7)
+    # 0x0c - ControlTeletextInfo (ref 7)
+    # 0x0d - ControlKey (ref 7)
+    # 0x0e-0x0f - ControlZoneEnd (ref 7)
+    # 0x10 - TitleTotalTime (ref 7)
+    # 0x11 - TitleRemainTime (ref 7)
+    # 0x12 - TitleChapterTotalNo (ref 7)
+    # 0x13 - TitleTimecode
+    # 0x14 - TitleBinaryGroup
+    # 0x15 - TitleCassetteNo (ref 7)
+    # 0x16-0x17 - TitleSoftID (ref 7)
+    # (0x18,0x19 listed as TitleTextHeader/TitleText by ref 7)
+    0x18 => {
+        Name => 'DateTimeOriginal',
+        Description => 'Date/Time Original',
+        Groups => { 2 => 'Time' },
+        Notes => 'combined with tag 0x19',
+        Combine => 1,   # the next tag (0x19) contains the rest of the date
+        # first byte is timezone information:
+        #   0x80 - unused
+        #   0x40 - DST flag (not currently decoded)
+        #   0x20 - TimeZoneSign
+        #   0x1e - TimeZoneValue
+        #   0x01 - half-hour flag
+        ValueConv => q{
+            my ($tz, @a) = unpack('C*',$val);
+            return sprintf('%.2x%.2x:%.2x:%.2x %.2x:%.2x:%.2x%s%.2d:%s', @a,
+                           $tz & 0x20 ? '-' : '+', ($tz >> 1) & 0x0f,
+                           $tz & 0x01 ? '30' : '00');
+        },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    # 0x1a-0x1b - TitleStart (ref 7)
+    # 0x1c-0x1d - TitleReelID (ref 7)
+    # 0x1e-0x1f - TitleEnd (ref 7)
+    # 0x20 - ChapterTotalTime (ref 7)
+    # 0x42 - ProgramRecDTime (ref 7)
+    # 0x50/0x60 - (AAUX/VAUX)Source (ref 7)
+    # 0x51/0x61 - (AAUX/VAUX)SourceControl (ref 7)
+    # 0x52/0x62 - (AAUX/VAUX)RecDate (ref 7)
+    # 0x53/0x63 - (AAUX/VAUX)RecTime (ref 7)
+    # 0x54/0x64 - (AAUX/VAUX)BinaryGroup (ref 7)
+    # 0x55/0x65 - (AAUX/VAUX)ClosedCaption (ref 7)
+    # 0x56/0x66 - (AAUX/VAUX)TR (ref 7)
+    0x70 => { # ConsumerCamera1
+        Name => 'Camera1',
+        SubDirectory => { TagTable => 'Image::ExifTool::H264::Camera1' },
+    },
+    0x71 => { # ConsumerCamera2
+        Name => 'Camera2',
+        SubDirectory => { TagTable => 'Image::ExifTool::H264::Camera2' },
+    },
+    # 0x73 Lens - val: 0x75ffffd3,0x0effffd3,0x59ffffd3,0x79ffffd3,0xffffffd3...
+    # 0x74 Gain
+    # 0x75 Pedestal
+    # 0x76 Gamma
+    # 0x77 Detail
+    # 0x7b CameraPreset
+    # 0x7c Flare
+    # 0x7d Shading
+    # 0x7e Knee
+    0x7f => { # Shutter
+        Name => 'Shutter',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::H264::Shutter',
+            ByteOrder => 'LittleEndian', # weird
+        },
+    },
+    0xa0 => {
+        Name => 'ExposureTime',
+        Format => 'rational32u',
+        Groups => { 2 => 'Image' },
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+    },
+    0xa1 => {
+        Name => 'FNumber',
+        Format => 'rational32u',
+        Groups => { 2 => 'Image' },
+    },
+    0xa2 => {
+        Name => 'ExposureProgram',
+        Format => 'int32u', # (guess)
+        PrintConv => {
+            0 => 'Not Defined',
+            1 => 'Manual',
+            2 => 'Program AE',
+            3 => 'Aperture-priority AE',
+            4 => 'Shutter speed priority AE',
+            5 => 'Creative (Slow speed)',
+            6 => 'Action (High speed)',
+            7 => 'Portrait',
+            8 => 'Landscape',
+        },
+    },
+    0xa3 => {
+        Name => 'BrightnessValue',
+        Format => 'rational32s',
+        Groups => { 2 => 'Image' },
+    },
+    0xa4 => {
+        Name => 'ExposureCompensation',
+        Format => 'rational32s',
+        Groups => { 2 => 'Image' },
+        PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
+    },
+    0xa5 => {
+        Name => 'MaxApertureValue',
+        Format => 'rational32u',
+        ValueConv => '2 ** ($val / 2)',
+        PrintConv => 'sprintf("%.1f",$val)',
+    },
+    0xa6 => {
+        Name => 'Flash',
+        Format => 'int32u', # (guess)
+        Flags => 'PrintHex',
+        SeparateTable => 'EXIF Flash',
+        PrintConv =>  \%Image::ExifTool::Exif::flash,
+    },
+    0xa7 => {
+        Name => 'CustomRendered',
+        Format => 'int32u', # (guess)
+        Groups => { 2 => 'Image' },
+        PrintConv => {
+            0 => 'Normal',
+            1 => 'Custom',
+        },
+    },
+    0xa8 => {
+        Name => 'WhiteBalance',
+        Format => 'int32u', # (guess)
+        Priority => 0,
+        PrintConv => {
+            0 => 'Auto',
+            1 => 'Manual',
+        },
+    },
+    0xa9 => {
+        Name => 'FocalLengthIn35mmFormat',
+        Format => 'rational32u',
+        PrintConv => '"$val mm"',
+    },
+    0xaa => {
+        Name => 'SceneCaptureType',
+        Format => 'int32u', # (guess)
+        PrintConv => {
+            0 => 'Standard',
+            1 => 'Landscape',
+            2 => 'Portrait',
+            3 => 'Night',
+        },
+    },
+    # 0xab-0xaf ExifOption
+    0xb0 => {
+        Name => 'GPSVersionID',
+        Format => 'int8u',
+        Count => 4,
+        Groups => { 1 => 'GPS', 2 => 'Location' },
+        PrintConv => '$val =~ tr/ /./; $val',
+    },
+    0xb1 => {
+        Name => 'GPSLatitudeRef',
+        Format => 'string',
+        Groups => { 1 => 'GPS', 2 => 'Location' },
+        PrintConv => {
+            N => 'North',
+            S => 'South',
+        },
+    },
+    0xb2 => {
+        Name => 'GPSLatitude',
+        Format => 'rational32u',
+        Groups => { 1 => 'GPS', 2 => 'Location' },
+        Notes => 'combined with tags 0xb3 and 0xb4',
+        Combine => 2,   # combine the next 2 tags (0xb2=deg, 0xb3=min, 0xb4=sec)
+        ValueConv => 'Image::ExifTool::GPS::ToDegrees($val)',
+        PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1)',
+    },
+    0xb5 => {
+        Name => 'GPSLongitudeRef',
+        Format => 'string',
+        Groups => { 1 => 'GPS', 2 => 'Location' },
+        PrintConv => {
+            E => 'East',
+            W => 'West',
+        },
+    },
+    0xb6 => {
+        Name => 'GPSLongitude',
+        Format => 'rational32u',
+        Groups => { 1 => 'GPS', 2 => 'Location' },
+        Combine => 2,   # combine the next 2 tags (0xb6=deg, 0xb7=min, 0xb8=sec)
+        Notes => 'combined with tags 0xb7 and 0xb8',
+        ValueConv => 'Image::ExifTool::GPS::ToDegrees($val)',
+        PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1)',
+    },
+    0xb9 => {
+        Name => 'GPSAltitudeRef',
+        Format => 'int32u', # (guess)
+        Groups => { 1 => 'GPS', 2 => 'Location' },
+        ValueConv => '$val ? 1 : 0', # because I'm not sure about the Format
+        PrintConv => {
+            0 => 'Above Sea Level',
+            1 => 'Below Sea Level',
+        },
+    },
+    0xba => {
+        Name => 'GPSAltitude',
+        Format => 'rational32u',
+        Groups => { 1 => 'GPS', 2 => 'Location' },
+    },
+    0xbb => {
+        Name => 'GPSTimeStamp',
+        Format => 'rational32u',
+        Groups => { 1 => 'GPS', 2 => 'Time' },
+        Combine => 2,    # the next tags (0xbc/0xbd) contain the minutes/seconds
+        Notes => 'combined with tags 0xbc and 0xbd',
+        ValueConv => 'Image::ExifTool::GPS::ConvertTimeStamp($val)',
+    },
+    0xbe => {
+        Name => 'GPSStatus',
+        Format => 'string',
+        Groups => { 1 => 'GPS', 2 => 'Location' },
+        PrintConv => {
+            A => 'Measurement Active',
+            V => 'Measurement Void',
+        },
+    },
+    0xbf => {
+        Name => 'GPSMeasureMode',
+        Format => 'string',
+        Groups => { 1 => 'GPS', 2 => 'Location' },
+        PrintConv => {
+            2 => '2-Dimensional Measurement',
+            3 => '3-Dimensional Measurement',
+        },
+    },
+    0xc0 => {
+        Name => 'GPSDOP',
+        Description => 'GPS Dilution Of Precision',
+        Format => 'rational32u',
+        Groups => { 1 => 'GPS', 2 => 'Location' },
+    },
+    0xc1 => {
+        Name => 'GPSSpeedRef',
+        Format => 'string',
+        Groups => { 1 => 'GPS', 2 => 'Location' },
+        PrintConv => {
+            K => 'km/h',
+            M => 'mph',
+            N => 'knots',
+        },
+    },
+    0xc2 => {
+        Name => 'GPSSpeed',
+        Format => 'rational32u',
+        Groups => { 1 => 'GPS', 2 => 'Location' },
+    },
+    0xc3 => {
+        Name => 'GPSTrackRef',
+        Format => 'string',
+        Groups => { 1 => 'GPS', 2 => 'Location' },
+        PrintConv => {
+            M => 'Magnetic North',
+            T => 'True North',
+        },
+    },
+    0xc4 => {
+        Name => 'GPSTrack',
+        Format => 'rational32u',
+        Groups => { 1 => 'GPS', 2 => 'Location' },
+    },
+    0xc5 => {
+        Name => 'GPSImgDirectionRef',
+        Format => 'string',
+        Groups => { 1 => 'GPS', 2 => 'Location' },
+        PrintConv => {
+            M => 'Magnetic North',
+            T => 'True North',
+        },
+    },
+    0xc6 => {
+        Name => 'GPSImgDirection',
+        Format => 'rational32u',
+        Groups => { 1 => 'GPS', 2 => 'Location' },
+    },
+    0xc7 => {
+        Name => 'GPSMapDatum',
+        Format => 'string',
+        Groups => { 1 => 'GPS', 2 => 'Location' },
+        Combine => 1,    # the next tag (0xc8) contains the rest of the string
+        Notes => 'combined with tag 0xc8',
+    },
+    # 0xc9-0xcf - GPSOption
+    0xe0 => {
+        Name => 'MakeModel',
+        SubDirectory => { TagTable => 'Image::ExifTool::H264::MakeModel' },
+    },
+    # 0xe1-0xef - MakerOption
+    # 0xe1 - val: 0x01000670,0x01000678,0x06ffffff,0x01ffffff,0x01000020,0x01000400...
+    # 0xe2-0xe8 - val: 0x00000000 in many samples
+    0xe1 => { #6
+        Name => 'RecInfo',
+        Condition => '$$self{Make} eq "Canon"',
+        Notes => 'Canon only',
+        SubDirectory => { TagTable => 'Image::ExifTool::H264::RecInfo' },
+    },
+    0xe4 => { #PH
+        Name => 'Model',
+        Condition => '$$self{Make} eq "Sony"',
+        Description => 'Camera Model Name',
+        Notes => 'Sony cameras only, combined with tags 0xe5 and 0xe6',
+        Format => 'string',
+        Combine => 2, # (not sure about 0xe6, but include it just in case)
+        RawConv => '$val eq "" ? undef : $val',
+    },
+    0xee => { #6 (HFS200)
+        Name => 'FrameInfo',
+        Condition => '$$self{Make} eq "Canon"',
+        Notes => 'Canon only',
+        SubDirectory => { TagTable => 'Image::ExifTool::H264::FrameInfo' },
+    },
+);
+
+# ConsumerCamera1 information (ref PH)
+%Image::ExifTool::H264::Camera1 = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Camera' },
+    TAG_PREFIX => 'Camera1',
+    PRINT_CONV => 'sprintf("0x%.2x",$val)',
+    FIRST_ENTRY => 0,
+    0 => {
+        Name => 'ApertureSetting',
+        PrintHex => 1,
+        PrintConv => {
+            0xff => 'Auto',
+            0xfe => 'Closed',
+            OTHER => sub { sprintf('%.1f', 2 ** (($_[0] & 0x3f) / 8)) },
+        },
+    },
+    1 => {
+        Name => 'Gain',
+        Mask => 0x0f,
+        ValueConv => '($val - 1) * 3',
+        PrintConv => '"$val dB"',
+    },
+    1.1 => {
+        Name => 'ExposureProgram',
+        Mask => 0xf0,
+        ValueConv => '$val == 0xf0 ? undef : $val',
+        PrintConv => {
+            0x00 => 'Program AE',
+            0x10 => 'Gain', #?
+            0x20 => 'Shutter speed priority AE',
+            0x30 => 'Aperture-priority AE',
+            0x40 => 'Manual',
+        },
+    },
+    2.1 => {
+        Name => 'WhiteBalance',
+        Mask => 0xe0,
+        ValueConv => '$val == 0xe0 ? undef : $val',
+        PrintConv => {
+            0x00 => 'Auto',
+            0x20 => 'Hold',
+            0x40 => '1-Push',
+            0x60 => 'Daylight',
+        },
+    },
+    3 => {
+        Name => 'Focus',
+        ValueConv => '$val == 0xff ? undef : $val',
+        PrintConv => q{
+            my $foc = ($val & 0x7e) / (($val & 0x01) ? 40 : 400);
+            return ($val & 0x80 ? 'Manual' : 'Auto') . " ($foc)";
+        },
+    },
+);
+
+# ConsumerCamera2 information (ref PH)
+%Image::ExifTool::H264::Camera2 = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Camera' },
+    TAG_PREFIX => 'Camera2',
+    PRINT_CONV => 'sprintf("0x%.2x",$val)',
+    FIRST_ENTRY => 0,
+    1 => {
+        Name => 'ImageStabilization',
+        PrintConv => {
+            0 => 'Off',
+            0xff => 'n/a',
+            OTHER => sub {
+                my $val = shift;
+                sprintf("%s (0x%.2x)", $val & 0x10 ? "On" : "Off", $val);
+            },
+        },
+    },
+);
+
+# camera info 0x7f (ref PH)
+%Image::ExifTool::H264::Shutter = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    TAG_PREFIX => 'Shutter',
+    PRINT_CONV => 'sprintf("0x%.2x",$val)',
+    FIRST_ENTRY => 0,
+    FORMAT => 'int16u',
+    1.1 => { #6
+        Name => 'ExposureTime',
+        Mask => 0x7fff, # (what is bit 0x8000 for?)
+        RawConv => '$val == 0x7fff ? undef : $val', #7
+        ValueConv => '$val / 33640', #PH (conversion factor determined empirically)
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+    },
+);
+
+# camera info 0xe0 (ref PH)
+%Image::ExifTool::H264::MakeModel = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Camera' },
+    FORMAT => 'int16u',
+    FIRST_ENTRY => 0,
+    0 => {
+        Name => 'Make',
+        PrintHex => 1,
+        RawConv => '$$self{Make} = ($Image::ExifTool::H264::convMake{$val} || "Unknown"); $val',
+        PrintConv => \%convMake,
+    },
+    # 1 => ModelIDCode according to ref 4/5 (I think not)
+    # vals: 0x3001 - Sony HDR-CX105E/TG3E/XR500V
+    #       0x1000 - Sony HDR-UX1
+    #       0x3000 - Canon HF100 (30p)
+    #       0x2000 - Canon HF100 (60i)
+    #       0x3101 - Canon HFM300 (PH, all qualities and frame rates)
+);
+
+# camera info 0xe1 (ref 6)
+%Image::ExifTool::H264::RecInfo = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Camera' },
+    FORMAT => 'int8u',
+    NOTES => 'Recording information stored by some Canon video cameras.',
+    FIRST_ENTRY => 0,
+    0 => {
+        Name => 'RecordingMode',
+        PrintConv => {
+            0x02 => 'XP+', # High Quality 12 Mbps
+            0x04 => 'SP',  # Standard Play 7 Mbps
+            0x05 => 'LP',  # Long Play 5 Mbps
+            0x06 => 'FXP', # High Quality 17 Mbps
+            0x07 => 'MXP', # High Quality 24 Mbps
+        },
+    },
+);
+
+# camera info 0xee (ref 6)
+%Image::ExifTool::H264::FrameInfo = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Video' },
+    FORMAT => 'int8u',
+    NOTES => 'Frame rate information stored by some Canon video cameras.',
+    FIRST_ENTRY => 0,
+    0 => 'CaptureFrameRate',
+    1 => 'VideoFrameRate',
+    # 2 - 8=60i, 10=PF30, 74=PF24 (PH, HFM300)
+);
+
+#==============================================================================
+# Bitstream functions (used for H264 video)
+#
+# Member variables:
+#   Mask    = mask for next bit to read (0 when all data has been read)
+#   Pos     = byte offset of next word to read
+#   Word    = current data word
+#   Len     = total data length in bytes
+#   DataPt  = data pointer
+#..............................................................................
+
+#------------------------------------------------------------------------------
+# Read next word from bitstream
+# Inputs: 0) BitStream ref
+# Returns: true if there is more data (and updates
+#          Mask, Pos and Word for first bit in next word)
+sub ReadNextWord($)
+{
+    my $bstr = shift;
+    my $pos = $$bstr{Pos};
+    if ($pos + 4 <= $$bstr{Len}) {
+        $$bstr{Word} = unpack("x$pos N", ${$$bstr{DataPt}});
+        $$bstr{Mask} = 0x80000000;
+        $$bstr{Pos} += 4;
+    } elsif ($pos < $$bstr{Len}) {
+        my @bytes = unpack("x$pos C*", ${$$bstr{DataPt}});
+        my ($word, $mask) = (shift(@bytes), 0x80);
+        while (@bytes) {
+            $word = ($word << 8) | shift(@bytes);
+            $mask <<= 8;
+        }
+        $$bstr{Word} = $word;
+        $$bstr{Mask} = $mask;
+        $$bstr{Pos} = $$bstr{Len};
+    } else {
+        return 0;
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Create a new BitStream object
+# Inputs: 0) data ref
+# Returns: BitStream ref, or null if data is empty
+sub NewBitStream($)
+{
+    my $dataPt = shift;
+    my $bstr = {
+        DataPt => $dataPt,
+        Len    => length($$dataPt),
+        Pos    => 0,
+        Mask   => 0,
+    };
+    ReadNextWord($bstr) or undef $bstr;
+    return $bstr;
+}
+
+#------------------------------------------------------------------------------
+# Get number of bits remaining in bit stream
+# Inputs: 0) BitStream ref
+# Returns: number of bits remaining
+sub BitsLeft($)
+{
+    my $bstr = shift;
+    my $bits = 0;
+    my $mask = $$bstr{Mask};
+    while ($mask) {
+        ++$bits;
+        $mask >>= 1;
+    }
+    return $bits + 8 * ($$bstr{Len} - $$bstr{Pos});
+}
+
+#------------------------------------------------------------------------------
+# Get integer from bitstream
+# Inputs: 0) BitStream ref, 1) number of bits
+# Returns: integer (and increments position in bitstream)
+sub GetIntN($$)
+{
+    my ($bstr, $bits) = @_;
+    my $val = 0;
+    while ($bits--) {
+        $val <<= 1;
+        ++$val if $$bstr{Mask} & $$bstr{Word};
+        $$bstr{Mask} >>= 1 and next;
+        ReadNextWord($bstr) or last;
+    }
+    return $val;
+}
+
+#------------------------------------------------------------------------------
+# Get Exp-Golomb integer from bitstream
+# Inputs: 0) BitStream ref
+# Returns: integer (and increments position in bitstream)
+sub GetGolomb($)
+{
+    my $bstr = shift;
+    # first, count the number of zero bits to get the integer bit width
+    my $count = 0;
+    until ($$bstr{Mask} & $$bstr{Word}) {
+        ++$count;
+        $$bstr{Mask} >>= 1 and next;
+        ReadNextWord($bstr) or last;
+    }
+    # then return the adjusted integer
+    return GetIntN($bstr, $count + 1) - 1;
+}
+
+#------------------------------------------------------------------------------
+# Get signed Exp-Golomb integer from bitstream
+# Inputs: 0) BitStream ref
+# Returns: integer (and increments position in bitstream)
+sub GetGolombS($)
+{
+    my $bstr = shift;
+    my $val = GetGolomb($bstr) + 1;
+    return ($val & 1) ? -($val >> 1) : ($val >> 1);
+}
+
+# end bitstream functions
+#==============================================================================
+
+#------------------------------------------------------------------------------
+# Decode H.264 scaling matrices
+# Inputs: 0) BitStream ref
+# Reference: http://ffmpeg.org/
+sub DecodeScalingMatrices($)
+{
+    my $bstr = shift;
+    if (GetIntN($bstr, 1)) {
+        my ($i, $j);
+        for ($i=0; $i<8; ++$i) {
+            my $size = $i<6 ? 16 : 64;
+            next unless GetIntN($bstr, 1);
+            my ($last, $next) = (8, 8);
+            for ($j=0; $j<$size; ++$j) {
+                $next = ($last + GetGolombS($bstr)) & 0xff if $next;
+                last unless $j or $next;
+            }
+        }
+    }
+}
+
+#------------------------------------------------------------------------------
+# Parse H.264 sequence parameter set RBSP (ref 1)
+# Inputs) 0) ExifTool ref, 1) tag table ref, 2) data ref
+sub ParseSeqParamSet($$$)
+{
+    my ($exifTool, $tagTablePtr, $dataPt) = @_;
+    # initialize our bitstream object
+    my $bstr = NewBitStream($dataPt) or return;
+    my ($t, $i, $j, $n);
+    # the messy nature of H.264 encoding makes it difficult to use
+    # data-driven structure parsing, so I code it explicitely (yuck!)
+    $t = GetIntN($bstr, 8);         # profile_idc
+    GetIntN($bstr, 16);             # constraints and level_idc
+    GetGolomb($bstr);               # seq_parameter_set_id
+    if ($t >= 100) { # (ref b)
+        $t = GetGolomb($bstr);      # chroma_format_idc
+        if ($t == 3) {
+            GetIntN($bstr, 1);      # separate_colour_plane_flag
+            $n = 12;
+        } else {
+            $n = 8;
+        }
+        GetGolomb($bstr);           # bit_depth_luma_minus8
+        GetGolomb($bstr);           # bit_depth_chroma_minus8
+        GetIntN($bstr, 1);          # qpprime_y_zero_transform_bypass_flag
+        DecodeScalingMatrices($bstr);
+    }
+    GetGolomb($bstr);               # log2_max_frame_num_minus4
+    $t = GetGolomb($bstr);          # pic_order_cnt_type
+    if ($t == 0) {
+        GetGolomb($bstr);           # log2_max_pic_order_cnt_lsb_minus4
+    } elsif ($t == 1) {
+        GetIntN($bstr, 1);          # delta_pic_order_always_zero_flag
+        GetGolomb($bstr);           # offset_for_non_ref_pic
+        GetGolomb($bstr);           # offset_for_top_to_bottom_field
+        $n = GetGolomb($bstr);      # num_ref_frames_in_pic_order_cnt_cycle
+        for ($i=0; $i<$n; ++$i) {
+            GetGolomb($bstr);       # offset_for_ref_frame[i]
+        }
+    }
+    GetGolomb($bstr);               # num_ref_frames
+    GetIntN($bstr, 1);              # gaps_in_frame_num_value_allowed_flag
+    my $w = GetGolomb($bstr);       # pic_width_in_mbs_minus1
+    my $h = GetGolomb($bstr);       # pic_height_in_map_units_minus1
+    my $f = GetIntN($bstr, 1);      # frame_mbs_only_flag
+    $f or GetIntN($bstr, 1);        # mb_adaptive_frame_field_flag
+    GetIntN($bstr, 1);              # direct_8x8_inference_flag
+    # convert image size to pixels
+    $w = ($w + 1) * 16;
+    $h = (2 - $f) * ($h + 1) * 16;
+    # account for cropping (if any)
+    $t = GetIntN($bstr, 1);         # frame_cropping_flag
+    if ($t) {
+        my $m = 4 - $f * 2;
+        $w -=  4 * GetGolomb($bstr);# frame_crop_left_offset
+        $w -=  4 * GetGolomb($bstr);# frame_crop_right_offset
+        $h -= $m * GetGolomb($bstr);# frame_crop_top_offset
+        $h -= $m * GetGolomb($bstr);# frame_crop_bottom_offset
+    }
+    # quick validity checks (just in case)
+    return unless $$bstr{Mask};
+    if ($w>=160 and $w<=4096 and $h>=120 and $h<=3072) {
+        $exifTool->HandleTag($tagTablePtr, ImageWidth => $w);
+        $exifTool->HandleTag($tagTablePtr, ImageHeight => $h);
+        # (whew! -- so much work just to get ImageSize!!)
+    }
+    # return now unless interested in picture timing information
+    return unless $parsePictureTiming;
+
+    # parse vui parameters if they exist
+    GetIntN($bstr, 1) or return;    # vui_parameters_present_flag
+    $t = GetIntN($bstr, 1);         # aspect_ratio_info_present_flag
+    if ($t) {
+        $t = GetIntN($bstr, 8);     # aspect_ratio_idc
+        if ($t == 255) {            # Extended_SAR ?
+            GetIntN($bstr, 32);     # sar_width/sar_height
+        }
+    }
+    $t = GetIntN($bstr, 1);         # overscan_info_present_flag
+    GetIntN($bstr, 1) if $t;        # overscan_appropriate_flag
+    $t = GetIntN($bstr, 1);         # video_signal_type_present_flag
+    if ($t) {
+        GetIntN($bstr, 4);          # video_format/video_full_range_flag
+        $t = GetIntN($bstr, 1);     # colour_description_present_flag
+        GetIntN($bstr, 24) if $t;   # colour_primaries/transfer_characteristics/matrix_coefficients
+    }
+    $t = GetIntN($bstr, 1);         # chroma_loc_info_present_flag
+    if ($t) {
+        GetGolomb($bstr);           # chroma_sample_loc_type_top_field
+        GetGolomb($bstr);           # chroma_sample_loc_type_bottom_field
+    }
+    $t = GetIntN($bstr, 1);         # timing_info_present_flag
+    if ($t) {
+        return if BitsLeft($bstr) < 65;
+        $$exifTool{VUI_units} = GetIntN($bstr, 32); # num_units_in_tick
+        $$exifTool{VUI_scale} = GetIntN($bstr, 32); # time_scale
+        GetIntN($bstr, 1);          # fixed_frame_rate_flag
+    }
+    my $hard;
+    for ($j=0; $j<2; ++$j) {
+        $t = GetIntN($bstr, 1);     # nal_/vcl_hrd_parameters_present_flag
+        if ($t) {
+            $$exifTool{VUI_hard} = 1;
+            $hard = 1;
+            $n = GetGolomb($bstr);  # cpb_cnt_minus1
+            GetIntN($bstr, 8);      # bit_rate_scale/cpb_size_scale
+            for ($i=0; $i<=$n; ++$i) {
+                GetGolomb($bstr);   # bit_rate_value_minus1[SchedSelIdx]
+                GetGolomb($bstr);   # cpb_size_value_minus1[SchedSelIdx]
+                GetIntN($bstr, 1);  # cbr_flag[SchedSelIdx]
+            }
+            GetIntN($bstr, 5);      # initial_cpb_removal_delay_length_minus1
+            $$exifTool{VUI_clen} = GetIntN($bstr, 5); # cpb_removal_delay_length_minus1
+            $$exifTool{VUI_dlen} = GetIntN($bstr, 5); # dpb_output_delay_length_minus1
+            $$exifTool{VUI_toff} = GetIntN($bstr, 5); # time_offset_length
+        }
+    }
+    GetIntN($bstr, 1) if $hard;     # low_delay_hrd_flag
+    $$exifTool{VUI_pic} = GetIntN($bstr, 1);    # pic_struct_present_flag
+    # (don't yet decode the rest of the vui data)
+}
+
+#------------------------------------------------------------------------------
+# Parse H.264 picture timing SEI message (payload type 1) (ref 1)
+# Inputs) 0) ExifTool ref, 1) data ref
+sub ParsePictureTiming($$)
+{
+    my ($exifTool, $dataPt) = @_;
+    my $bstr = NewBitStream($dataPt) or return;
+    my ($i, $t, $n);
+    # the specification is very odd on this point: the following delays
+    # exist if the VUI hardware parameters are present, or if
+    # "determined by the application, by some means not specified" -- WTF??
+    if ($$exifTool{VUI_hard}) {
+        GetIntN($bstr, $$exifTool{VUI_clen} + 1);   # cpb_removal_delay
+        GetIntN($bstr, $$exifTool{VUI_dlen} + 1);   # dpb_output_delay
+    }
+    if ($$exifTool{VUI_pic}) {
+        $t = GetIntN($bstr, 4);     # pic_struct
+        # determine NumClockTS ($n)
+        $n = { 0=>1, 1=>1, 2=>1, 3=>2, 4=>2, 5=>3, 6=>3, 7=>2, 8=>3 }->{$t};
+        $n or return;
+        for ($i=0; $i<$n; ++$i) {
+            $t = GetIntN($bstr, 1); # clock_timestamp_flag[i]
+            next unless $t;
+            my ($nu, $s, $m, $h, $o);
+            GetIntN($bstr, 2);      # ct_type
+            $nu = GetIntN($bstr, 1);# nuit_field_based_flag
+            GetIntN($bstr, 5);      # counting_type
+            $t = GetIntN($bstr, 1); # full_timestamp_flag
+            GetIntN($bstr, 1);      # discontinuity_flag
+            GetIntN($bstr, 1);      # cnt_dropped_flag
+            GetIntN($bstr, 8);      # n_frames
+            if ($t) {
+                $s = GetIntN($bstr, 6); # seconds_value
+                $m = GetIntN($bstr, 6); # minutes_value
+                $h = GetIntN($bstr, 5); # hours_value
+            } else {
+                $t = GetIntN($bstr, 1); # seconds_flag
+                if ($t) {
+                    $s = GetIntN($bstr, 6); # seconds_value
+                    $t = GetIntN($bstr, 1); # minutes_flag
+                    if ($t) {
+                        $m = GetIntN($bstr, 6); # minutes_value
+                        $t = GetIntN($bstr, 1); # hours_flag
+                        $h = GetIntN($bstr, 5) if $t;   # hours_value
+                    }
+                }
+            }
+            if ($$exifTool{VUI_toff}) {
+                $o = GetIntN($bstr, $$exifTool{VUI_toff});  # time_offset
+            }
+            last;   # only parse the first clock timestamp found
+        }
+    }
+}
+
+#------------------------------------------------------------------------------
+# Process H.264 Supplementary Enhancement Information (ref 1/PH)
+# Inputs: 0) Exiftool ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 if we processed payload type 5
+sub ProcessSEI($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $end = length($$dataPt);
+    my $pos = 0;
+    my ($type, $size, $index, $t);
+
+    # scan through SEI payload for type 5 (the unregistered user data)
+    for (;;) {
+        $type = 0;
+        for (;;) {
+            return 0 if $pos >= $end;
+            $t = Get8u($dataPt, $pos++);    # payload type
+            $type += $t;
+            last unless $t == 255;
+        }
+        return 0 if $type == 0x80;  # terminator (ref PH - maybe byte alignment bits?)
+        $size = 0;
+        for (;;) {
+            return 0 if $pos >= $end;
+            $t = Get8u($dataPt, $pos++);    # payload data length
+            $size += $t;
+            last unless $t == 255;
+        }
+        return 0 if $pos + $size > $end;
+        if ($type == 1) {                   # picture timing information
+            if ($parsePictureTiming) {
+                my $buff = substr($$dataPt, $pos, $size);
+                ParsePictureTiming($exifTool, $dataPt);
+            }
+        } elsif ($type == 5) {              # unregistered user data
+            last; # exit loop to process user data now
+        }
+        $pos += $size;
+    }
+
+    # look for our 16-byte UUID
+    # - plus "MDPM" for "ModifiedDVPackMeta"
+    # - plus "GA94" for closed-caption data (not currently decoded)
+    return 0 unless $size > 20 and substr($$dataPt, $pos, 20) eq
+        "\x17\xee\x8c\x60\xf8\x4d\x11\xd9\x8c\xd6\x08\0\x20\x0c\x9a\x66MDPM";
+
+    # load the GPS module because it contains conversion routines and
+    # Composite tags needed for a number of tags we may be extracting
+    require Image::ExifTool::GPS;
+#
+# parse the MDPM records in the UUID 17ee8c60f84d11d98cd60800200c9a66
+# unregistered user data payload (ref PH)
+#
+    my $tagTablePtr = GetTagTable('Image::ExifTool::H264::MDPM');
+    my $oldIndent = $$exifTool{INDENT};
+    $$exifTool{INDENT} .= '| ';
+    $end = $pos + $size;    # end of payload
+    $pos += 20;             # skip UUID + "MDPM"
+    my $num = Get8u($dataPt, $pos++);   # get entry count
+    my $lastTag = 0;
+    $exifTool->VerboseDir('MDPM', $num) if $exifTool->Options('Verbose');
+    # walk through entries in the MDPM payload
+    for ($index=0; $index<$num and $pos<$end; ++$index) {
+        my $tag = Get8u($dataPt, $pos);
+        if ($tag <= $lastTag) { # should be in numerical order (PH)
+            $exifTool->Warn('Entries in MDPM directory are out of sequence');
+            last;
+        }
+        $lastTag = $tag;
+        my $buff = substr($$dataPt, $pos + 1, 4);
+        my $from;
+        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        if ($tagInfo) {
+            # use our own print conversion for Unknown tags
+            if ($$tagInfo{Unknown} and not $$tagInfo{SetPrintConv}) {
+                $$tagInfo{PrintConv} = 'sprintf("0x%.8x", unpack("N", $val))';
+                $$tagInfo{SetPrintConv} = 1;
+            }
+            # combine with next value(s) if necessary
+            my $combine = $$tagTablePtr{$tag}{Combine};
+            while ($combine) {
+                last if $pos + 5 >= $end;
+                my $t =  Get8u($dataPt, $pos + 5);
+                last if $t != $lastTag + 1; # must be consecutive tag ID's
+                $pos += 5;
+                $buff .= substr($$dataPt, $pos + 1, 4);
+                $from = $index unless defined $from;
+                ++$index;
+                ++$lastTag;
+                --$combine;
+            }
+            $exifTool->HandleTag($tagTablePtr, $tag, undef,
+                TagInfo => $tagInfo,
+                DataPt  => \$buff,
+                Size    => length($buff),
+                Index   => defined $from ? "$from-$index" : $index,
+            );
+        }
+        $pos += 5;
+    }
+    $$exifTool{INDENT} = $oldIndent;
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Extract information from H.264 video stream
+# Inputs: 0) ExifTool ref, 1) data ref
+# Returns: 0 = done parsing, 1 = we want to parse more of these
+sub ParseH264Video($$)
+{
+    my ($exifTool, $dataPt) = @_;
+    my $verbose = $exifTool->Options('Verbose');
+    my $out = $exifTool->Options('TextOut');
+    my $tagTablePtr = GetTagTable('Image::ExifTool::H264::Main');
+    my %parseNalUnit = ( 0x06 => 1, 0x07 => 1 );    # NAL unit types to parse
+    my $foundUserData;
+    my $len = length $$dataPt;
+    my $pos = 0;
+    while ($pos < $len) {
+        my ($nextPos, $end);
+        # find start of next NAL unit
+        if ($$dataPt =~ /(\0{2,3}\x01)/g) {
+            $nextPos = pos $$dataPt;
+            $end = $nextPos - length $1;
+            $pos or $pos = $nextPos, next;
+        } else {
+            last unless $pos;
+            $nextPos = $end = $len;
+        }
+        last if $pos >= $len;
+        # parse NAL unit from $pos to $end
+        my $nal_unit_type = Get8u($dataPt, $pos);
+        ++$pos;
+        # check forbidden_zero_bit
+        $nal_unit_type & 0x80 and $exifTool->Warn('H264 forbidden bit error'), last;
+        $nal_unit_type &= 0x1f;
+        # ignore this NAL unit unless we will parse it
+        $parseNalUnit{$nal_unit_type} or $verbose or $pos = $nextPos, next;
+        # read NAL unit (and convert all 0x000003's to 0x0000 as per spec.)
+        my $buff = '';
+        pos($$dataPt) = $pos + 1;
+        while ($$dataPt =~ /\0\0\x03/g) {
+            last if pos $$dataPt > $end;
+            $buff .= substr($$dataPt, $pos, pos($$dataPt)-1-$pos);
+            $pos = pos $$dataPt;
+        }
+        $buff .= substr($$dataPt, $pos, $end - $pos);
+        if ($verbose > 1) {
+            printf $out "  NAL Unit Type: 0x%x (%d bytes)\n",$nal_unit_type, length $buff;
+            my %parms = ( Out => $out );
+            $parms{MaxLen} = 96 if $verbose < 4;
+            Image::ExifTool::HexDump(\$buff, undef, %parms) if $verbose > 2;
+        }
+        pos($$dataPt) = $pos = $nextPos;
+
+        if ($nal_unit_type == 0x06) {       # sei_rbsp (supplemental enhancement info)
+
+            if ($$exifTool{GotNAL06}) {
+                # process only the first SEI unless ExtractEmbedded is set
+                next unless $exifTool->Options('ExtractEmbedded');
+                $$exifTool{DOC_NUM} = $$exifTool{GotNAL06};
+            }
+            $foundUserData = ProcessSEI($exifTool, { DataPt => \$buff } );
+            delete $$exifTool{DOC_NUM};
+            # keep parsing SEI's until we find the user data
+            next unless $foundUserData;
+            $$exifTool{GotNAL06} = ($$exifTool{GotNAL06} || 0) + 1;
+
+        } elsif ($nal_unit_type == 0x07) {  # sequence_parameter_set_rbsp
+
+            # process this NAL unit type only once
+            next if $$exifTool{GotNAL07};
+            $$exifTool{GotNAL07} = 1;
+            ParseSeqParamSet($exifTool, $tagTablePtr, \$buff);
+        }
+        # we were successful, so don't parse this NAL unit type again
+        delete $parseNalUnit{$nal_unit_type};
+    }
+    # parse one extra H264 frame if we didn't find the user data in this one
+    # (Panasonic cameras don't put the SEI in the first frame)
+    return 0 if $foundUserData or $$exifTool{ParsedH264};
+    $$exifTool{ParsedH264} = 1;
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::H264 - Read meta information from H.264 video
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains routines required by Image::ExifTool to extract
+information from H.264 video streams.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.itu.int/rec/T-REC-H.264/e>
+
+=item L<http://miffteevee.co.uk/documentation/development/H264Parser_8cpp-source.html>
+
+=item L<http://ffmpeg.org/>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/H264 Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/HP.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/HP.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/HP.pm	(revision 24799)
@@ -0,0 +1,262 @@
+#------------------------------------------------------------------------------
+# File:         HP.pm
+#
+# Description:  Hewlett-Packard maker notes tags
+#
+# Revisions:    2007-05-03 - P. Harvey Created
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::HP;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.02';
+
+sub ProcessHP($$$);
+sub ProcessTDHD($$$);
+
+# HP EXIF-format maker notes (or is it Vivitar?)
+%Image::ExifTool::HP::Main = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => q{
+        These tables list tags found in the maker notes of some Hewlett-Packard
+        camera models.
+
+        The first table lists tags found in the EXIF-format maker notes of the
+        PhotoSmart 720 (also used by the Vivitar ViviCam 3705, 3705B and 3715).
+    },
+    0x0e00 => {
+        Name => 'PrintIM',
+        Description => 'Print Image Matching',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::PrintIM::Main',
+        },
+    },
+);
+
+# other types of HP maker notes
+%Image::ExifTool::HP::Type2 = (
+    PROCESS_PROC => \&ProcessHP,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'These tags are used by the PhotoSmart E427.',
+   'PreviewImage' => {
+        Name => 'PreviewImage',
+        RawConv => '$self->ValidateImage(\$val,$tag)',
+    },
+   'Serial Number' => 'SerialNumber',
+   'Lens Shading'  => 'LensShading',
+);
+
+%Image::ExifTool::HP::Type4 = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'These tags are used by the PhotoSmart M627.',
+    0x0c => {
+        Name => 'MaxAperture',
+        Format => 'int16u',
+        ValueConv => '$val / 10',
+    },
+    0x10 => {
+        Name => 'ExposureTime',
+        Format => 'int32u',
+        ValueConv => '$val / 1e6',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+    },
+    0x14 => {
+        Name => 'CameraDateTime',
+        Groups => { 2 => 'Time' },
+        Format => 'string[20]',
+    },
+    0x34 => {
+        Name => 'ISO',
+        Format => 'int16u',
+    },
+    0x5c => {
+        Name => 'SerialNumber',
+        Format => 'string[26]',
+        RawConv => '$val =~ s/^SERIAL NUMBER:// ? $val : undef',
+    },
+);
+
+%Image::ExifTool::HP::Type6 = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'These tags are used by the PhotoSmart M425, M525 and M527.',
+    0x0c => {
+        Name => 'FNumber',
+        Format => 'int16u',
+        ValueConv => '$val / 10',
+    },
+    0x10 => {
+        Name => 'ExposureTime',
+        Format => 'int32u',
+        ValueConv => '$val / 1e6',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+    },
+    0x14 => {
+        Name => 'CameraDateTime',
+        Groups => { 2 => 'Time' },
+        Format => 'string[20]',
+    },
+    0x34 => {
+        Name => 'ISO',
+        Format => 'int16u',
+    },
+    0x58 => {
+        Name => 'SerialNumber',
+        Format => 'string[26]',
+        RawConv => '$val =~ s/^SERIAL NUMBER:// ? $val : undef',
+    },
+);
+
+# proprietary format TDHD data written by Photosmart R837 (ref PH)
+%Image::ExifTool::HP::TDHD = (
+    PROCESS_PROC => \&ProcessTDHD,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => q{
+        These tags are extracted from the APP6 "TDHD" segment of Photosmart R837
+        JPEG images.  Many other unknown tags exist in is data, and can be seen with
+        the Unknown (-u) option.
+    },
+    # (all subdirectories except TDHD and LSLV are automatically recognized
+    # by their "type" word of 0x10001)
+    TDHD => {
+        Name => 'TDHD',
+        SubDirectory => { TagTable => 'Image::ExifTool::HP::TDHD' },
+    },
+    LSLV => {
+        Name => 'LSLV',
+        SubDirectory => { TagTable => 'Image::ExifTool::HP::TDHD' },
+    },
+    FWRV => 'FirmwareVersion',
+    CMSN => 'SerialNumber', # (unverified)
+    # LTEM - some temperature?
+);
+
+#------------------------------------------------------------------------------
+# Process HP APP6 TDHD metadata (ref PH)
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessTDHD($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dataPos = $$dirInfo{DataPos};
+    my $pos = $$dirInfo{DirStart};
+    my $dirEnd = $pos + $$dirInfo{DirLen};
+    my $unknown = $exifTool->Options('Unknown') || $exifTool->Options('Verbose');
+    $exifTool->VerboseDir('TDHD', undef, $$dirInfo{DirLen});
+    SetByteOrder('II');
+    while ($pos + 12 < $dirEnd) {
+        my $tag = substr($$dataPt, $pos, 4);
+        my $type = Get32u($dataPt, $pos + 4);
+        my $size = Get32u($dataPt, $pos + 8);
+        $pos += 12;
+        last if $size < 0 or $pos + $size > $dirEnd;
+        if ($type == 0x10001) {
+            # this is a subdirectory containing more tags
+            my %dirInfo = (
+                DataPt   => $dataPt,
+                DataPos  => $dataPos,
+                DirStart => $pos,
+                DirLen   => $size,
+            );
+            $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+        } else {
+            if (not $$tagTablePtr{$tag} and $unknown) {
+                my $name = $tag;
+                $name =~ tr/-_A-Za-z0-9//dc;    # remove invalid characters
+                my %tagInfo = (
+                    Name => "HP_TDHD_$name",
+                    Unknown => 1,
+                );
+                # guess format based on data size
+                if ($size == 1) {
+                    $tagInfo{Format} = 'int8u';
+                } elsif ($size == 2) {
+                    $tagInfo{Format} = 'int16u';
+                } elsif ($size == 4) {
+                    $tagInfo{Format} = 'int32s';
+                } elsif ($size > 80) {
+                    $tagInfo{Binary} = 1;
+                }
+                Image::ExifTool::AddTagToTable($tagTablePtr, $tag, \%tagInfo);
+            }
+            $exifTool->HandleTag($tagTablePtr, $tag, undef,
+                DataPt  => $dataPt,
+                DataPos => $dataPos,
+                Start   => $pos,
+                Size    => $size,
+            );
+        }
+        $pos += $size;
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Process HP maker notes
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success, otherwise returns 0 and sets a Warning
+sub ProcessHP($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dataLen = $$dirInfo{DataLen};
+    my $dirStart = $$dirInfo{DirStart} || 0;
+    my $dirLen = $$dirInfo{DirLen} || $dataLen - $dirStart;
+
+    # look for known text-type tags
+    if ($dirStart or $dirLen != length($$dataPt)) {
+        my $buff = substr($$dataPt, $dirStart, $dirLen);
+        $dataPt = \$buff;
+    }
+    my $tagID;
+    # brute-force scan for PreviewImage
+    if ($$tagTablePtr{PreviewImage} and $$dataPt =~ /(\xff\xd8\xff\xdb.*\xff\xd9)/gs) {
+        $exifTool->HandleTag($tagTablePtr, 'PreviewImage', $1);
+        # truncate preview to speed subsequent tag scans
+        my $buff = substr($$dataPt, 0, pos($$dataPt)-length($1));
+        $dataPt = \$buff;
+    }
+    # scan for other tag ID's
+    foreach $tagID (sort(TagTableKeys($tagTablePtr))) {
+        next if $tagID eq 'PreviewImage';
+        next unless $$dataPt =~ /$tagID:\s*([\x20-\x7f]+)/i;
+        $exifTool->HandleTag($tagTablePtr, $tagID, $1);
+    }
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::HP - Hewlett-Packard maker notes tags
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to interpret
+Hewlett-Packard maker notes.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/HP Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/HTML.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/HTML.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/HTML.pm	(revision 24799)
@@ -0,0 +1,566 @@
+#------------------------------------------------------------------------------
+# File:         HTML.pm
+#
+# Description:  Read HTML meta information
+#
+# Revisions:    01/30/2007 - P. Harvey Created
+#
+# References:   1) http://www.w3.org/TR/html4/
+#               2) http://www.daisy.org/publications/specifications/daisy_202.html
+#               3) http://vancouver-webpages.com/META/metatags.detail.html
+#               4) http://www.html-reference.com/META.htm
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::HTML;
+
+use strict;
+use vars qw($VERSION @ISA @EXPORT_OK);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::PostScript;
+use Image::ExifTool::XMP qw(EscapeXML UnescapeXML);
+require Exporter;
+
+$VERSION = '1.11';
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(EscapeHTML UnescapeHTML);
+
+sub SetHTMLCharset($$);
+
+# convert HTML charset (lower case) to ExifTool Charset name
+my %htmlCharset = (
+    macintosh     => 'MacRoman',
+   'iso-8859-1'   => 'Latin',
+   'utf-8'        => 'UTF8',
+   'windows-1252' => 'Latin',
+);
+
+# HTML 4 character entity references
+my %entityNum = (
+    'quot'   => 34,   'eth'    => 240,  'lsquo'  => 8216,
+    'amp'    => 38,   'ntilde' => 241,  'rsquo'  => 8217,
+    'apos'   => 39,   'ograve' => 242,  'sbquo'  => 8218,
+    'lt'     => 60,   'oacute' => 243,  'ldquo'  => 8220,
+    'gt'     => 62,   'ocirc'  => 244,  'rdquo'  => 8221,
+    'nbsp'   => 160,  'otilde' => 245,  'bdquo'  => 8222,
+    'iexcl'  => 161,  'ouml'   => 246,  'dagger' => 8224,
+    'cent'   => 162,  'divide' => 247,  'Dagger' => 8225,
+    'pound'  => 163,  'oslash' => 248,  'bull'   => 8226,
+    'curren' => 164,  'ugrave' => 249,  'hellip' => 8230,
+    'yen'    => 165,  'uacute' => 250,  'permil' => 8240,
+    'brvbar' => 166,  'ucirc'  => 251,  'prime'  => 8242,
+    'sect'   => 167,  'uuml'   => 252,  'Prime'  => 8243,
+    'uml'    => 168,  'yacute' => 253,  'lsaquo' => 8249,
+    'copy'   => 169,  'thorn'  => 254,  'rsaquo' => 8250,
+    'ordf'   => 170,  'yuml'   => 255,  'oline'  => 8254,
+    'laquo'  => 171,  'OElig'  => 338,  'frasl'  => 8260,
+    'not'    => 172,  'oelig'  => 339,  'euro'   => 8364,
+    'shy'    => 173,  'Scaron' => 352,  'image'  => 8465,
+    'reg'    => 174,  'scaron' => 353,  'weierp' => 8472,
+    'macr'   => 175,  'Yuml'   => 376,  'real'   => 8476,
+    'deg'    => 176,  'fnof'   => 402,  'trade'  => 8482,
+    'plusmn' => 177,  'circ'   => 710,  'alefsym'=> 8501,
+    'sup2'   => 178,  'tilde'  => 732,  'larr'   => 8592,
+    'sup3'   => 179,  'Alpha'  => 913,  'uarr'   => 8593,
+    'acute'  => 180,  'Beta'   => 914,  'rarr'   => 8594,
+    'micro'  => 181,  'Gamma'  => 915,  'darr'   => 8595,
+    'para'   => 182,  'Delta'  => 916,  'harr'   => 8596,
+    'middot' => 183,  'Epsilon'=> 917,  'crarr'  => 8629,
+    'cedil'  => 184,  'Zeta'   => 918,  'lArr'   => 8656,
+    'sup1'   => 185,  'Eta'    => 919,  'uArr'   => 8657,
+    'ordm'   => 186,  'Theta'  => 920,  'rArr'   => 8658,
+    'raquo'  => 187,  'Iota'   => 921,  'dArr'   => 8659,
+    'frac14' => 188,  'Kappa'  => 922,  'hArr'   => 8660,
+    'frac12' => 189,  'Lambda' => 923,  'forall' => 8704,
+    'frac34' => 190,  'Mu'     => 924,  'part'   => 8706,
+    'iquest' => 191,  'Nu'     => 925,  'exist'  => 8707,
+    'Agrave' => 192,  'Xi'     => 926,  'empty'  => 8709,
+    'Aacute' => 193,  'Omicron'=> 927,  'nabla'  => 8711,
+    'Acirc'  => 194,  'Pi'     => 928,  'isin'   => 8712,
+    'Atilde' => 195,  'Rho'    => 929,  'notin'  => 8713,
+    'Auml'   => 196,  'Sigma'  => 931,  'ni'     => 8715,
+    'Aring'  => 197,  'Tau'    => 932,  'prod'   => 8719,
+    'AElig'  => 198,  'Upsilon'=> 933,  'sum'    => 8721,
+    'Ccedil' => 199,  'Phi'    => 934,  'minus'  => 8722,
+    'Egrave' => 200,  'Chi'    => 935,  'lowast' => 8727,
+    'Eacute' => 201,  'Psi'    => 936,  'radic'  => 8730,
+    'Ecirc'  => 202,  'Omega'  => 937,  'prop'   => 8733,
+    'Euml'   => 203,  'alpha'  => 945,  'infin'  => 8734,
+    'Igrave' => 204,  'beta'   => 946,  'ang'    => 8736,
+    'Iacute' => 205,  'gamma'  => 947,  'and'    => 8743,
+    'Icirc'  => 206,  'delta'  => 948,  'or'     => 8744,
+    'Iuml'   => 207,  'epsilon'=> 949,  'cap'    => 8745,
+    'ETH'    => 208,  'zeta'   => 950,  'cup'    => 8746,
+    'Ntilde' => 209,  'eta'    => 951,  'int'    => 8747,
+    'Ograve' => 210,  'theta'  => 952,  'there4' => 8756,
+    'Oacute' => 211,  'iota'   => 953,  'sim'    => 8764,
+    'Ocirc'  => 212,  'kappa'  => 954,  'cong'   => 8773,
+    'Otilde' => 213,  'lambda' => 955,  'asymp'  => 8776,
+    'Ouml'   => 214,  'mu'     => 956,  'ne'     => 8800,
+    'times'  => 215,  'nu'     => 957,  'equiv'  => 8801,
+    'Oslash' => 216,  'xi'     => 958,  'le'     => 8804,
+    'Ugrave' => 217,  'omicron'=> 959,  'ge'     => 8805,
+    'Uacute' => 218,  'pi'     => 960,  'sub'    => 8834,
+    'Ucirc'  => 219,  'rho'    => 961,  'sup'    => 8835,
+    'Uuml'   => 220,  'sigmaf' => 962,  'nsub'   => 8836,
+    'Yacute' => 221,  'sigma'  => 963,  'sube'   => 8838,
+    'THORN'  => 222,  'tau'    => 964,  'supe'   => 8839,
+    'szlig'  => 223,  'upsilon'=> 965,  'oplus'  => 8853,
+    'agrave' => 224,  'phi'    => 966,  'otimes' => 8855,
+    'aacute' => 225,  'chi'    => 967,  'perp'   => 8869,
+    'acirc'  => 226,  'psi'    => 968,  'sdot'   => 8901,
+    'atilde' => 227,  'omega'  => 969,  'lceil'  => 8968,
+    'auml'   => 228,  'thetasym'=>977,  'rceil'  => 8969,
+    'aring'  => 229,  'upsih'  => 978,  'lfloor' => 8970,
+    'aelig'  => 230,  'piv'    => 982,  'rfloor' => 8971,
+    'ccedil' => 231,  'ensp'   => 8194, 'lang'   => 9001,
+    'egrave' => 232,  'emsp'   => 8195, 'rang'   => 9002,
+    'eacute' => 233,  'thinsp' => 8201, 'loz'    => 9674,
+    'ecirc'  => 234,  'zwnj'   => 8204, 'spades' => 9824,
+    'euml'   => 235,  'zwj'    => 8205, 'clubs'  => 9827,
+    'igrave' => 236,  'lrm'    => 8206, 'hearts' => 9829,
+    'iacute' => 237,  'rlm'    => 8207, 'diams'  => 9830,
+    'icirc'  => 238,  'ndash'  => 8211,
+    'iuml'   => 239,  'mdash'  => 8212,
+);
+my %entityName; # look up entity names by number (built as necessary)
+
+# HTML info
+# (tag ID's are case insensitive and must be all lower case in tables)
+%Image::ExifTool::HTML::Main = (
+    GROUPS => { 2 => 'Document' },
+    NOTES => q{
+        Meta information extracted from the header of HTML and XHTML files.  This is
+        a mix of information found in the C<META> elements, C<XML> element, and the
+        C<TITLE> element.
+    },
+    dc => {
+        Name => 'DC',
+        SubDirectory => { TagTable => 'Image::ExifTool::HTML::dc' },
+    },
+    ncc => {
+        Name => 'NCC',
+        SubDirectory => { TagTable => 'Image::ExifTool::HTML::ncc' },
+    },
+    prod => {
+        Name => 'Prod',
+        SubDirectory => { TagTable => 'Image::ExifTool::HTML::prod' },
+    },
+    vw96 => {
+        Name => 'VW96',
+        SubDirectory => { TagTable => 'Image::ExifTool::HTML::vw96' },
+    },
+   'http-equiv' => {
+        Name => 'HTTP-equiv',
+        SubDirectory => { TagTable => 'Image::ExifTool::HTML::equiv' },
+    },
+    o => {
+        Name => 'Office',
+        SubDirectory => { TagTable => 'Image::ExifTool::HTML::Office' },
+    },
+    abstract        => { },
+    author          => { },
+    classification  => { },
+    copyright       => { },
+    description     => { },
+    distribution    => { },
+   'doc-class'      => { Name => 'DocClass' },
+   'doc-rights'     => { Name => 'DocRights' },
+   'doc-type'       => { Name => 'DocType' },
+    formatter       => { },
+    generator       => { },
+    googlebot       => { Name => 'GoogleBot' },
+    keywords        => { List => 1 },
+    mssmarttagspreventparsing => { Name => 'NoMSSmartTags' },
+    originator      => { },
+    owner           => { },
+    progid          => { Name => 'ProgID' },
+    rating          => { },
+    refresh         => { },
+   'resource-type'  => { Name => 'ResourceType' },
+   'revisit-after'  => { Name => 'RevisitAfter' },
+    robots          => { List => 1 },
+    title           => { Notes => "the only extracted tag which isn't from an HTML META element" },
+);
+
+# ref 2
+%Image::ExifTool::HTML::dc = (
+    GROUPS => { 1 => 'HTML-dc', 2 => 'Document' },
+    NOTES => 'Dublin Core schema tags (also used in XMP).',
+    contributor => { Groups => { 2 => 'Author' }, List => 'Bag' },
+    coverage    => { },
+    creator     => { Groups => { 2 => 'Author' }, List => 'Seq' },
+    date        => {
+        Groups => { 2 => 'Time'   },
+        List => 'Seq',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    description => { },
+   'format'     => { },
+    identifier  => { },
+    language    => { List => 'Bag' },
+    publisher   => { Groups => { 2 => 'Author' }, List => 'Bag' },
+    relation    => { List => 'Bag' },
+    rights      => { Groups => { 2 => 'Author' } },
+    source      => { Groups => { 2 => 'Author' } },
+    subject     => { List => 'Bag' },
+    title       => { },
+    type        => { List => 'Bag' },
+);
+
+# ref 2
+%Image::ExifTool::HTML::ncc = (
+    GROUPS => { 1 => 'HTML-ncc', 2 => 'Document' },
+    charset         => { Name => 'CharacterSet' }, # name changed to avoid conflict with -charset option
+    depth           => { },
+    files           => { },
+    footnotes       => { },
+    generator       => { },
+    kbytesize       => { Name => 'KByteSize' },
+    maxpagenormal   => { Name => 'MaxPageNormal' },
+    multimediatype  => { Name => 'MultimediaType' },
+    narrator        => { },
+    pagefront       => { Name => 'PageFront' },
+    pagenormal      => { Name => 'PageNormal' },
+    pagespecial     => { Name => 'PageSpecial' },
+    prodnotes       => { Name => 'ProdNotes' },
+    producer        => { },
+    produceddate    => { Name => 'ProducedDate', Groups => { 2 => 'Time' } }, # YYYY-mm-dd
+    revision        => { },
+    revisiondate    => { Name => 'RevisionDate', Groups => { 2 => 'Time' } },
+    setinfo         => { Name => 'SetInfo' },
+    sidebars        => { },
+    sourcedate      => { Name => 'SourceDate', Groups => { 2 => 'Time' } },
+    sourceedition   => { Name => 'SourceEdition' },
+    sourcepublisher => { Name => 'SourcePublisher' },
+    sourcerights    => { Name => 'SourceRights' },
+    sourcetitle     => { Name => 'SourceTitle' },
+    tocitems        => { Name => 'TOCItems' },
+    totaltime       => { Name => 'Duration' }, # HH:MM:SS
+);
+
+# ref 3
+%Image::ExifTool::HTML::vw96 = (
+    GROUPS => { 1 => 'HTML-vw96', 2 => 'Document' },
+    objecttype      => { Name => 'ObjectType' },
+);
+
+# ref 2
+%Image::ExifTool::HTML::prod = (
+    GROUPS => { 1 => 'HTML-prod', 2 => 'Document' },
+    reclocation     => { Name => 'RecLocation' },
+    recengineer     => { Name => 'RecEngineer' },
+);
+
+# ref 3/4
+%Image::ExifTool::HTML::equiv = (
+    GROUPS => { 1 => 'HTTP-equiv', 2 => 'Document' },
+    NOTES => 'These tags have a family 1 group name of "HTTP-equiv".',
+   'cache-control'       => { Name => 'CacheControl' },
+   'content-disposition' => { Name => 'ContentDisposition' },
+   'content-language'    => { Name => 'ContentLanguage' },
+   'content-script-type' => { Name => 'ContentScriptType' },
+   'content-style-type'  => { Name => 'ContentStyleType' },
+    # note: setting the HTMLCharset like this will miss any tags which come earlier
+   'content-type'        => { Name => 'ContentType', RawConv => \&SetHTMLCharset },
+   'default-style'       => { Name => 'DefaultStyle' },
+    expires              => { },
+   'ext-cache'           => { Name => 'ExtCache' },
+    imagetoolbar         => { Name => 'ImageToolbar' },
+    lotus                => { },
+   'page-enter'          => { Name => 'PageEnter' },
+   'page-exit'           => { Name => 'PageExit' },
+   'pics-label'          => { Name => 'PicsLabel' },
+    pragma               => { },
+    refresh              => { },
+   'reply-to'            => { Name => 'ReplyTo' },
+   'set-cookie'          => { Name => 'SetCookie' },
+   'site-enter'          => { Name => 'SiteEnter' },
+   'site-exit'           => { Name => 'SiteExit' },
+    vary                 => { },
+   'window-target'       => { Name => 'WindowTarget' },
+);
+
+# MS Office namespace (ref PH)
+%Image::ExifTool::HTML::Office = (
+    GROUPS => { 1 => 'HTML-office', 2 => 'Document' },
+    NOTES => 'Tags written by Microsoft Office applications.',
+    Subject     => { },
+    Author      => { Groups => { 2 => 'Author' } },
+    Keywords    => { },
+    Description => { },
+    Template    => { },
+    LastAuthor  => { Groups => { 2 => 'Author' } },
+    Revision    => { Name => 'RevisionNumber' },
+    TotalTime   => { Name => 'TotalEditTime',   PrintConv => 'ConvertTimeSpan($val, 60)' },
+    Created     => {
+        Name => 'CreateDate',
+        Groups => { 2 => 'Time' },
+        ValueConv => 'Image::ExifTool::XMP::ConvertXMPDate($val)',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    LastSaved   => {
+        Name => 'ModifyDate',
+        Groups => { 2 => 'Time' },
+        ValueConv => 'Image::ExifTool::XMP::ConvertXMPDate($val)',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    LastSaved   => {
+        Name => 'ModifyDate',
+        Groups => { 2 => 'Time' },
+        ValueConv => 'Image::ExifTool::XMP::ConvertXMPDate($val)',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    LastPrinted => {
+        Name => 'LastPrinted',
+        Groups => { 2 => 'Time' },
+        ValueConv => 'Image::ExifTool::XMP::ConvertXMPDate($val)',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    Pages       => { },
+    Words       => { },
+    Characters  => { },
+    Category    => { },
+    Manager     => { },
+    Company     => { },
+    Lines       => { },
+    Paragraphs  => { },
+    CharactersWithSpaces => { },
+    Version     => { Name => 'RevisionNumber' },
+);
+
+#------------------------------------------------------------------------------
+# Set HTMLCharset member based on content type
+# Inputs: 0) content type string, 1) ExifTool ref
+# Returns: original string
+sub SetHTMLCharset($$)
+{
+    my ($val, $exifTool) = @_;
+    $$exifTool{HTMLCharset} = $htmlCharset{lc $1} if $val =~ /charset=['"]?([-\w]+)/;
+    return $val;
+}
+
+#------------------------------------------------------------------------------
+# Convert single UTF-8 character to HTML character reference
+# Inputs: 0) UTF-8 character sequence
+# Returns: HTML character reference (ie. "&quot;");
+# Note: Must be called via EscapeHTML to load name lookup
+sub EscapeChar($)
+{
+    my $ch = shift;
+    my $val;
+    if ($] < 5.006001) {
+        ($val) = Image::ExifTool::UnpackUTF8($ch);
+    } else {
+        # the meaning of "U0" is reversed as of Perl 5.10.0!
+        ($val) = unpack($] < 5.010000 ? 'U0U' : 'C0U', $ch);
+    }
+    return '?' unless defined $val;
+    return "&$entityName{$val};" if $entityName{$val};
+    return sprintf('&#x%x;',$val);
+}
+
+#------------------------------------------------------------------------------
+# Escape any special characters for HTML
+# Inputs: 0) UTF-8 string to be escaped
+# Returns: escaped string
+sub EscapeHTML($)
+{
+    my $str = shift;
+    # escape XML characters
+    $str = EscapeXML($str);
+    # escape other special characters if they exist
+    if ($str =~ /[\x80-\xff]/) {
+        # generate entity name lookup if necessary
+        unless (%entityName) {
+            local $_;
+            foreach (keys %entityNum) {
+                $entityName{$entityNum{$_}} = $_;
+            }
+            delete $entityName{39};  # 'apos' is not valid HTML
+        }
+        # suppress warnings
+        local $SIG{'__WARN__'} = sub { 1 };
+        # escape any non-ascii characters for HTML
+        $str =~ s/([\xc2-\xf7][\x80-\xbf]+)/EscapeChar($1)/sge;
+    }
+    return $str;
+}
+
+#------------------------------------------------------------------------------
+# Unescape all HTML character references
+# Inputs: 0) string to be unescaped
+# Returns: unescaped string
+sub UnescapeHTML($)
+{
+    return UnescapeXML(shift, \%entityNum);
+}
+
+#------------------------------------------------------------------------------
+# Extract information from a HTML file
+# Inputs: 0) ExifTool object reference, 1) DirInfo reference
+# Returns: 1 on success, 0 if this wasn't a valid HTML file
+sub ProcessHTML($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my $buff;
+
+    # validate HTML or XHTML file
+    $raf->Read($buff, 256) or return 0;
+    $buff =~ /^<(!DOCTYPE\s+HTML|HTML|\?xml)/i or return 0;
+    $buff =~ /<(!DOCTYPE\s+)?HTML/i or return 0 if $1 eq '?xml';
+    $exifTool->SetFileType();
+
+    $raf->Seek(0,0) or $exifTool->Warn('Seek error'), return 1;
+
+    local $/ = Image::ExifTool::PostScript::GetInputRecordSeparator($raf);
+    $/ or $exifTool->Warn('Invalid HTML data'), return 1;
+
+    # extract header information
+    my $doc;
+    while ($raf->ReadLine($buff)) {
+        if (not defined $doc) {
+            # look for 'head' element
+            next unless $buff =~ /<head\b/ig;
+            $doc = substr($buff, pos($buff));
+            next;
+        }
+        $doc .= $buff;
+        last if $buff =~ m{</head>}i;
+    }
+    return 1 unless defined $doc;
+
+    # process all elements in header
+    my $tagTablePtr = GetTagTable('Image::ExifTool::HTML::Main');
+    for (;;) {
+        last unless $doc =~ m{<([\w:.-]+)(.*?)>}sg;
+        my ($tagName, $attrs) = ($1, $2);
+        my $tag = lc($tagName);
+        my ($val, $grp);
+        unless ($attrs =~ m{/$}) {  # self-contained XHTML tags end in '/>'
+            # look for element close
+            my $pos = pos($doc);
+            my $close = "</$tagName>";
+            # the following doesn't work on Solaris Perl 5.6.1 due to Perl bug:
+            # if ($doc =~ m{(.*?)</$tagName>}sg) {
+            #     $val = $1;
+            if ($doc =~ m{$close}sg) {
+                $val = substr($doc, $pos, pos($doc)-$pos-length($close));
+            } else {
+                pos($doc) = $pos;
+                next unless $tag eq 'meta'; # META tags don't need to be closed
+            }
+        }
+        my $table = $tagTablePtr;
+        if ($tag eq 'meta') {
+            # parse HTML META element
+            undef $tag;
+            # tag name is in NAME or HTTP-EQUIV attribute
+            if ($attrs =~ /name=['"]?([\w:.-]+)/si) {
+                $tagName = $1;
+            } elsif ($attrs =~ /http-equiv=['"]?([\w:.-]+)/si) {
+                $tagName = "HTTP-equiv.$1";
+            } else {
+                next;   # no name
+            }
+            $tag = lc($tagName);
+            # tag value is in CONTENT attribute
+            $val = $2 if $attrs =~ /content=(['"])(.*?)\1/si;
+            next unless $tag and defined $val;
+            # isolate group name (separator is '.' in HTML, but ':' in ref 2)
+            if ($tag =~ /^([\w-]+)[:.]([\w-]+)/) {
+                ($grp, $tag) = ($1, $2);
+                my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $grp);
+                if ($tagInfo and $$tagInfo{SubDirectory}) {
+                    $table = GetTagTable($tagInfo->{SubDirectory}->{TagTable});
+                } else {
+                    $tag = "$grp.$tag";
+                }
+            }
+        } elsif ($tag eq 'xml') {
+            $exifTool->VPrint(0, "Parsing XML\n");
+            # parse XML tags (quick-and-dirty)
+            my $xml = $val;
+            while ($xml =~ /<([\w-]+):([\w-]+)(\s.*?)?>([^<]*?)<\/\1:\2>/g) {
+                ($grp, $tag, $val) = ($1, $2, $4);
+                my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $grp);
+                next unless $tagInfo and $$tagInfo{SubDirectory};
+                $table = GetTagTable($tagInfo->{SubDirectory}->{TagTable});
+                unless ($$table{$tag}) {
+                    my $name = ucfirst $tag;
+                    $name =~ s/_x([0-9a-f]{4})_/chr(hex($1))/gie; # convert hex codes
+                    $name =~ s/\s(.)/\U$1/g;     # capitalize all words in tag name
+                    $name =~ tr/-_a-zA-Z0-9//dc; # remove illegal characters (also hex code wide chars)
+                    Image::ExifTool::AddTagToTable($table, $tag, { Name => $name });
+                    $exifTool->VPrint(0, "  [adding $tag '$name']\n");
+                }
+                $val = $exifTool->Decode($val, $$exifTool{HTMLCharset}) if $$exifTool{HTMLCharset};
+                $exifTool->HandleTag($table, $tag, UnescapeXML($val));
+            }
+            next;
+        } else {
+            # the only other element we process is TITLE
+            next unless $tag eq 'title';
+        }
+        unless ($$table{$tag}) {
+            my $name = $tagName;
+            $name =~ s/\W+(\w)/\u$1/sg;
+            my $info = { Name => $name, Groups => { 0 => 'HTML' } };
+            $info->{Groups}->{1} = ($grp eq 'http-equiv' ? 'HTTP-equiv' : "HTML-$grp") if $grp;
+            Image::ExifTool::AddTagToTable($table, $tag, $info);
+            $exifTool->VPrint(0, "  [adding $tag '$tagName']\n");
+        }
+        # recode if necessary
+        $val = $exifTool->Decode($val, $$exifTool{HTMLCharset}) if $$exifTool{HTMLCharset};
+        $val =~ s{\s*$/\s*}{ }sg;   # replace linefeeds and indenting spaces
+        $val = UnescapeHTML($val);  # unescape HTML character references
+        $exifTool->HandleTag($table, $tag, $val);
+    }
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::HTML - Read HTML meta information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains routines required by Image::ExifTool to extract
+meta information from HTML documents.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.w3.org/TR/html4/>
+
+=item L<http://www.daisy.org/publications/specifications/daisy_202.html>
+
+=item L<http://vancouver-webpages.com/META/metatags.detail.html>
+
+=item L<http://www.html-reference.com/META.htm>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/HTML Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/HtmlDump.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/HtmlDump.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/HtmlDump.pm	(revision 24799)
@@ -0,0 +1,886 @@
+#------------------------------------------------------------------------------
+# File:         HtmlDump.pm
+#
+# Description:  Dump information in hex to HTML page
+#
+# Revisions:    12/05/2005 - P. Harvey Created
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::HtmlDump;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool;    # only for FinishTiffDump()
+use Image::ExifTool::HTML qw(EscapeHTML);
+
+$VERSION = '1.30';
+
+sub DumpTable($$$;$$$$$);
+sub Open($$$;@);
+sub Write($@);
+
+my ($bkgStart, $bkgEnd, @bkgSpan);
+
+my $htmlHeader1 = <<_END_PART_1_;
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
+ "http://www.w3.org/TR/1998/REC-html40-19980424/loose.dtd">
+<html>
+<head>
+<title>
+_END_PART_1_
+
+# Note: Don't change font-weight style because it can affect line height
+my $htmlHeader2 = <<_END_PART_2_;
+</title>
+<style type="text/css">
+<!--
+/* character style ID's */
+.D { color: #000000 } /* default color */
+.V { color: #ff0000 } /* duplicate block 1 */
+.W { color: #004400 } /* normal block 1 */
+.X { color: #ff4488 } /* duplicate block 2 */
+.Y { color: #448844 } /* normal block 2 */
+.U { color: #cc8844 } /* unused data block */
+.H { color: #0000ff } /* highlighted tag name */
+.F { color: #aa00dd } /* actual offset differs */
+.M { text-decoration: underline } /* maker notes data */
+.tt { /* tooltip text */
+    visibility: hidden;
+    position: absolute;
+    white-space: nowrap;
+    top: 0;
+    left: 0;
+    font-family: Verdana, sans-serif;
+    font-size: .7em;
+    padding: 2px 4px;
+    border: 1px solid gray;
+    z-index: 3;
+}
+.tb { /* tooltip background */
+    visibility: hidden;
+    position: absolute;
+    background: #ffffdd;
+    opacity: 0.8;
+    -moz-opacity: 0.8;
+    filter: alpha(opacity=80);
+    -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=80)';
+    z-index: 2;
+}
+/* table styles */
+table.dump {
+  border-top: 1px solid gray;
+  border-bottom: 1px solid gray;
+}
+table.dump td { padding: .2em .3em }
+td.c2 {
+  border-left: 1px solid gray;
+  border-right: 1px solid gray;
+}
+pre   { margin: 0 }
+table { font-size: .9em }
+body  { color: black; background: white }
+-->
+</style>
+<script language="JavaScript" type="text/JavaScript">
+<!-- Begin
+// tooltip positioning constants
+var TMAR = 4;   // top/left margins
+var BMAR = 16;  // bottom/right margins (scrollbars may overhang inner dimensions)
+var XOFF = 10;  // x offset from cursor
+var YOFF = 40;  // y offset
+var YMIN = 10;  // minimum y offset
+var YTOP = 20;  // y offset when above cursor
+// common variables
+var safari1 = navigator.userAgent.indexOf("Safari/312.6") >= 0;
+var ie6 = navigator.userAgent.toLowerCase().indexOf('msie 6') >= 0;
+var mspan = new Array;
+var hlist, tt, tb;
+
+function GetElementsByClass(classname, tagname) {
+  var found = new Array();
+  var list = document.getElementsByTagName(tagname);
+  var len = list.length;
+  for (var i=0, j=0; i<len; ++i) {
+    var classes = list[i].className.split(' ');
+    for (var k=0; k<classes.length; ++k) {
+      if (classes[k] == classname) {
+        found[j++] = list[i];
+        break;
+      }
+    }
+  }
+  delete list;
+  return found;
+}
+
+// move tooltip
+function move(e)
+{
+  if (!tt) return;
+  if (ie6 && (tt.style.top  == '' || tt.style.top  == 0) &&
+             (tt.style.left == '' || tt.style.left == 0))
+  {
+    tt.style.width  = tt.offsetWidth  + 'px';
+    tt.style.height = tt.offsetHeight + 'px';
+  }
+  var w, h;
+  // browser inconsistencies make getting window size more complex than it should be,
+  // and even then we don't know if it is smaller due to scrollbar width
+  if (typeof(window.innerWidth) == 'number') {
+    w = window.innerWidth;
+    h = window.innerHeight;
+  } else if (document.documentElement && document.documentElement.clientWidth) {
+    w = document.documentElement.clientWidth;
+    h = document.documentElement.clientHeight;
+  } else {
+    w = document.body.clientWidth;
+    h = document.body.clientHeight;
+  }
+  var x = e.clientX + XOFF;
+  var y = e.clientY + YOFF;
+  if (safari1) { // patch for people still using OS X 10.3.9
+    x -= document.body.scrollLeft + document.documentElement.scrollLeft;
+    y -= document.body.scrollTop  + document.documentElement.scrollTop;
+  }
+  var mx = w - BMAR - tt.offsetWidth;
+  var my = h - BMAR - tt.offsetHeight;
+  if (y > my + YOFF - YMIN) y = e.clientY - YTOP - tt.offsetHeight;
+  if (x > mx) x = mx;
+  if (y > my) y = my;
+  if (x < TMAR) x = TMAR;
+  if (y < TMAR) y = TMAR;
+  x += document.body.scrollLeft + document.documentElement.scrollLeft;
+  y += document.body.scrollTop  + document.documentElement.scrollTop;
+  tb.style.width  = tt.offsetWidth  + 'px';
+  tb.style.height = tt.offsetHeight + 'px';
+  tt.style.top  = tb.style.top  = y + 'px';
+  tt.style.left = tb.style.left = x + 'px';
+  tt.style.visibility = tb.style.visibility = 'visible';
+}
+
+// highlight/unhighlight text
+function high(e,on) {
+  var targ;
+  if (e.target) targ = e.target;
+  else if (e.srcElement) targ = e.srcElement;
+  if (targ.nodeType == 3) targ = targ.parentNode; // defeat Safari bug
+  if (!targ.name) targ = targ.parentNode; // go up another level if necessary
+  if (targ.name && document.getElementsByName) {
+    // un-highlight current objects
+    if (hlist) {
+      for (var i=0; i<hlist.length; ++i) {
+        hlist[i].style.background = 'transparent';
+      }
+      hlist = null;
+    }
+    if (tt) {
+      // hide old tooltip
+      tt.style.visibility = tb.style.visibility = 'hidden';
+      tt = null;
+    }
+    if (on) {
+      if (targ.name.substring(0,1) == 't') {
+        // show our tooltip (ID is different than name to avoid confusing IE)
+        tt = document.getElementById('p' + targ.name.substring(1));
+        if (tt) {
+          tb = document.getElementById('tb');
+          move(e);
+        }
+      }
+      // highlight anchor elements with the same name
+      hlist = document.getElementsByName(targ.name);
+      // use class name to highlight span elements if necessary
+      for (var i=0; i<mspan.length; ++i) {
+        if (mspan[i] != targ.name) continue;
+        var slist = GetElementsByClass(targ.name, 'span');
+        // add elements from hlist collection to our array
+        for (var j=0; j<hlist.length; ++j) {
+            slist[slist.length] = hlist[j];
+        }
+        hlist = slist;
+        break;
+      }
+      for (var j=0; j<hlist.length; ++j) {
+        hlist[j].style.background = '#ffcc99';
+      }
+    }
+  }
+}
+_END_PART_2_
+
+my $htmlHeader3 = q[
+// End --->
+</script></head>
+<body><noscript><b class=V>--&gt;
+Enable JavaScript for active highlighting and information tool tips!
+</b></noscript>
+<table class=dump cellspacing=0 cellpadding=2>
+<tr><td valign='top'><pre>];
+
+my $preMouse = q(<pre onmouseover="high(event,1)" onmouseout="high(event,0)" onmousemove="move(event)">);
+
+#------------------------------------------------------------------------------
+# New - create new HtmlDump object
+# Inputs: 0) reference to HtmlDump object or HtmlDump class name
+sub new
+{
+    local $_;
+    my $that = shift;
+    my $class = ref($that) || $that || 'Image::ExifTool::HtmlDump';
+    return bless { Block => {}, TipNum => 0 }, $class;
+}
+
+#------------------------------------------------------------------------------
+# Add information to dump
+# Inputs: 0) HTML dump hash ref, 1) absolute offset in file, 2) data size,
+#         3) comment string, 4) tool tip (or SAME to use previous tip),
+#         5) bit flags (see below)
+# Bits: 0x01 - print at start of line
+#       0x02 - print red address
+#       0x04 - maker notes data ('M'-class span)
+#       0x08 - limit block length
+#       0x10 - allow double references
+#       0x100 - (reserved)
+# Notes: Block will be shown in 'unused' color if comment string begins with '['
+sub Add($$$$;$)
+{
+    my ($self, $start, $size, $msg, $tip, $flag) = @_;
+    my $block = $$self{Block};
+    $$block{$start} or $$block{$start} = [ ];
+    my $htip;
+    if ($tip and $tip eq 'SAME') {
+        $htip = '';
+    } else {
+        # use message as first line of tip, and make bold unless in brackets
+        $htip = ($msg =~ /^[[(]/) ? $msg : "<b>$msg</b>";
+        if (defined $tip) {
+            ($tip = EscapeHTML($tip)) =~ s/\n/<br>/g;   # HTML-ize tooltip text
+            $htip .= '<br>' . $tip;
+        }
+        # add size if not already done
+        $htip .= "<br>($size bytes)" unless $htip =~ /<br>Size:/;
+        ++$self->{TipNum};
+    }
+    push @{$$block{$start}}, [ $size, $msg, $htip, $flag, $self->{TipNum} ];
+}
+
+#------------------------------------------------------------------------------
+# Print dump information to HTML page
+# Inputs: 0) Dump information hash reference, 1) source file RAF reference,
+#         2) data pointer, 3) data position, 4) output file or scalar reference,
+#         5) limit level (1-3), 6) title
+# Returns: non-zero if useful output was generated,
+#          or -1 on error loading data and "ERROR" is set to offending data name
+# Note: The "Error" member may be set externally to print a specific error
+#       message instead of doing the dump.
+sub Print($$;$$$$$)
+{
+    local $_;
+    my ($self, $raf, $dataPt, $dataPos, $outfile, $level, $title) = @_;
+    my ($i, $buff, $rtnVal, $limit, $err);
+    my $block = $$self{Block};
+    $dataPos = 0 unless $dataPos;
+    $outfile = \*STDOUT unless ref $outfile;
+    $title = 'HtmlDump' unless $title;
+    $level or $level = 0;
+    my $tell = $raf->Tell();
+    my $pos = 0;
+    my $dataEnd = $dataPos + ($dataPt ? length($$dataPt) : 0);
+    # initialize member variables
+    $$self{Open} = [];
+    $$self{Closed} = [];
+    $$self{TipList} = [];
+    $$self{MSpanList} = [];
+    $$self{Cols} = [ '', '', '', '' ];  # text columns
+    # set dump size limits (limits are 4x smaller if bit 0x08 set in flags)
+    if ($level <= 1) {
+        $limit = 1024;
+    } elsif ($level <= 2) {
+        $limit = 16384;
+    } else {
+        $limit = 256 * 1024 * 1024; # never dump bigger than 256 MB
+    }
+    $$self{Limit} = $limit;
+    # pre-initialize open/closed hashes for all columns
+    for ($i=0; $i<4; ++$i) {
+        $self->{Open}->[$i] = { ID => [ ], Element => { } };
+        $self->{Closed}->[$i] = { ID => [ ], Element => { } };
+    }
+    $bkgStart = $bkgEnd = 0;
+    undef @bkgSpan;
+    my $index = 0;  # initialize tooltip index
+    my (@names, $wasUnused, @starts);
+    # only do dump if we didn't have a serious error
+    @starts = sort { $a <=> $b } keys %$block unless $$self{Error};
+    for ($i=0; $i<@starts; ++$i) {
+        my $start = $starts[$i];
+        my $parmList = $$block{$start};
+        my $len = $start - $pos;
+        if ($len > 0 and not $wasUnused) {
+            # we have an unused bytes before this data block
+            --$i;           # dump the data block next time around
+            # split unused data into 2 blocks if it spans end of a bkg block
+            my ($nextBkgEnd, $bkg);
+            if (not defined $wasUnused and $bkgEnd) {
+                foreach $bkg (@bkgSpan) {
+                    next if $pos >= $$bkg{End} + $dataPos or $pos + $len <= $$bkg{End} + $dataPos;
+                    $nextBkgEnd = $$bkg{End} unless $nextBkgEnd and $nextBkgEnd < $$bkg{End};
+                }
+            }
+            if ($nextBkgEnd) {
+                $start = $pos;
+                $len = $nextBkgEnd + $dataPos - $pos;
+                $wasUnused = 0;
+            } else {
+                $start = $pos;  # dump the unused bytes now
+                $wasUnused = 1; # avoid re-dumping unused bytes if we get a read error
+            }
+            my $str = ($len > 1) ? "unused $len bytes" : 'pad byte';
+            $parmList = [ [ $len, "[$str]", undef, 0x108 ] ];
+        } else {
+            undef $wasUnused;
+        }
+        my $parms;
+        foreach $parms (@$parmList) {
+            my ($len, $msg, $tip, $flag, $tipNum) = @$parms;
+            next unless $len > 0;
+            $flag = 0 unless defined $flag;
+            # generate same name for all blocks indexed by this tooltip
+            my $name;
+            $name = $names[$tipNum] if defined $tipNum;
+            my $idx = $index;
+            if ($name) {
+                # get index from existing ID
+                $idx = substr($name, 1);
+            } else {
+                $name = "t$index";
+                $names[$tipNum] = $name if defined $tipNum;
+                ++$index;
+            }
+            if ($flag & 0x14) {
+                my %bkg = (
+                    Class => $flag & 0x04 ? "$name M" : $name,
+                    Start => $start - $dataPos,
+                    End   => $start - $dataPos + $len,
+                );
+                push @bkgSpan, \%bkg;
+                $bkgStart = $bkg{Start} unless $bkgStart and $bkgStart < $bkg{Start};
+                $bkgEnd = $bkg{End} unless $bkgEnd and $bkgEnd > $bkg{End};
+                push @{$self->{MSpanList}}, $name;
+                next;
+            }
+            # loop until we read the value properly
+            my ($end, $try);
+            for ($try=0; $try<2; ++$try) {
+                $end = $start + $len;
+                # only load as much of the block as we are going to dump
+                my $size = ($len > $limit) ? $limit / 2 : $len;
+                if ($start >= $dataPos and $end <= $dataEnd) {
+                    $buff = substr($$dataPt, $start-$dataPos, $size);
+                    if ($len != $size) {
+                        $buff .= substr($$dataPt, $start-$dataPos+$len-$size, $size);
+                    }
+                } else {
+                    $buff = '';
+                    if ($raf->Seek($start, 0) and $raf->Read($buff, $size) == $size) {
+                        # read end of block
+                        if ($len != $size) {
+                            my $buf2 = '';
+                            unless ($raf->Seek($start+$len-$size, 0) and
+                                    $raf->Read($buf2, $size) == $size)
+                            {
+                                $err = $msg;
+                                # reset $len to the actual length of available data
+                                $raf->Seek(0, 2);
+                                $len = $raf->Tell() - $start;
+                                $tip .= "<br>Error: Only $len bytes available!" if $tip;
+                                next;
+                            }
+                            $buff .= $buf2;
+                            undef $buf2;
+                        }
+                    } else {
+                        $err = $msg;
+                        $len = length $buff;
+                        $tip .= "<br>Error: Only $len bytes available!" if $tip;
+                    }
+                }
+                last;
+            }
+            $tip and $self->{TipList}->[$idx] = $tip;
+            next unless length $buff;
+            # set flag to continue this line if next block is contiguous
+            if ($i+1 < @starts and $parms eq $$parmList[-1] and
+                ($end == $starts[$i+1] or ($end < $starts[$i+1] and $end >= $pos)))
+            {
+                my $nextFlag = $block->{$starts[$i+1]}->[0]->[3] || 0;
+                $flag |= 0x100 unless $flag & 0x01 or $nextFlag & 0x01;
+            }
+            $self->DumpTable($start-$dataPos, \$buff, $msg, $name,
+                             $flag, $len, $pos-$dataPos);
+            undef $buff;
+            $pos = $end if $pos < $end;
+        }
+    }
+    $self->Open('','');     # close all open elements
+    $raf->Seek($tell,0);
+
+    # write output HTML file
+    Write($outfile, $htmlHeader1, $title);
+    if ($self->{Cols}->[0]) {
+        Write($outfile, $htmlHeader2);
+        my $mspan = \@{$$self{MSpanList}};
+        for ($i=0; $i<@$mspan; ++$i) {
+            Write($outfile, qq(mspan[$i] = "$$mspan[$i]";\n));
+        }
+        Write($outfile, $htmlHeader3, $self->{Cols}->[0]);
+        Write($outfile, '</pre></td><td valign="top">',
+                        $preMouse, $self->{Cols}->[1]);
+        Write($outfile, '</pre></td><td class=c2 valign="top">',
+                        $preMouse, $self->{Cols}->[2]);
+        Write($outfile, '</pre></td><td valign="top">',
+                        $preMouse, $self->{Cols}->[3]);
+        Write($outfile, "</pre></td></tr></table>\n<div id=tb class=tb> </div>\n");
+        my $tips = \@{$$self{TipList}};
+        for ($i=0; $i<@$tips; ++$i) {
+            my $tip = $$tips[$i];
+            Write($outfile, "<div id=p$i class=tt>$tip</div>\n") if defined $tip;
+        }
+        delete $$self{TipList};
+        $rtnVal = 1;
+    } else {
+        my $err = $$self{Error} || 'No EXIF or TIFF information found in image';
+        Write($outfile, "$title</title></head><body>\n$err\n");
+        $rtnVal = 0;
+    }
+    Write($outfile, "</body></html>\n");
+    for ($i=0; $i<4; ++$i) {
+        $self->{Cols}->[$i] = '';   # free memory
+    }
+    if ($err) {
+        $err =~ tr/()//d;
+        $$self{ERROR} = $err;
+        return -1;
+    }
+    return $rtnVal;
+}
+
+#------------------------------------------------------------------------------
+# Open or close a specified html element
+# Inputs: 0) HtmlDump object ref, 1) element id, 2) element string,
+#         3-N) list of column numbers (empty for all columns)
+# - element id may be '' to close all elements
+# - element string may be '' to close element by ID (or 0 to close without reopening)
+# - element id and string may both be 1 to reopen temporarily closed elements
+sub Open($$$;@)
+{
+    my ($self, $id, $element, @colNums) = @_;
+
+    # loop through specified columns
+    @colNums or @colNums = (0 .. $#{$self->{Open}});
+    my $col;
+    foreach $col (@colNums) {
+        # get information about open elements in this column
+        my $opHash = $self->{Open}->[$col];
+        my $opElem = $$opHash{Element};
+        if ($element) {
+            # next if already open
+            next if $$opElem{$id} and $$opElem{$id} eq $element;
+        } elsif ($id and not $$opElem{$id}) {
+            # next if already closed and nothing to reopen
+            next unless $element eq '' and @{$self->{Closed}->[$col]->{ID}};
+        }
+        my $opID = $$opHash{ID};
+        my $clHash = $self->{Closed}->[$col];
+        my $clID = $$clHash{ID};
+        my $clElem = $$clHash{Element};
+        # get reference to output column list (use temp list if available)
+        my $cols = $$self{TmpCols} || $$self{Cols};
+        # close everything down to this element if necessary
+        if ($$opElem{$id} or not $id) {
+            while (@$opID) {
+                my $tid = pop @$opID;
+                my $e = $$opElem{$tid};
+                $e =~ s/^<(\S+).*/<\/$1>/s;
+                $$cols[$col] .= $e;
+                if ($id eq $tid or not $id) {
+                    delete $$opElem{$tid};
+                    last if $id;
+                    next;
+                }
+                # add this to the temporarily closed list
+                # (because we really didn't want to close it)
+                push @$clID, $tid;
+                $$clElem{$tid} = $$opElem{$tid};
+                delete $$opElem{$tid};
+            }
+            unless ($id) {
+                # forget all temporarily closed elements
+                $clID = $$clHash{ID} = [ ];
+                $clElem = $$clHash{Element} = { };
+            }
+        } elsif ($$clElem{$id}) {
+            # delete from the list of temporarily closed elements
+            delete $$clElem{$id};
+            @$clID = grep !/^$id$/, @$clID;
+        }
+        next if $element eq '0'; # 0 = don't reopen temporarily closed elements
+
+        # re-open temporarily closed elements
+        while (@$clID) {
+            my $tid = pop @$clID;
+            $$cols[$col] .= $$clElem{$tid};
+            push @$opID, $tid;
+            $$opElem{$tid} = $$clElem{$tid};
+            delete $$clElem{$tid};
+        }
+        # open specified element
+        if ($element and $element ne '1') {
+            $$cols[$col] .= $element;
+            push @$opID, $id;
+            $$opElem{$id} = $element;
+        }
+    }
+}
+
+#------------------------------------------------------------------------------
+# Dump a block of data in HTML table form
+# Inputs: 0) HtmlDump object ref, 1) data position, 2) block pointer,
+#         3) message, 4) object name, 5) flag, 6) full block length (actual
+#         data may be shorter), 7) data end position
+sub DumpTable($$$;$$$$$)
+{
+    my ($self, $pos, $blockPt, $msg, $name, $flag, $len, $endPos) = @_;
+    $len = length $$blockPt unless defined $len;
+    $endPos = 0 unless $endPos;
+    my ($f0, $dblRef, $id);
+    my $skipped = 0;
+    if (($endPos and $pos < $endPos) or $flag & 0x02) {
+        # display double-reference addresses in red
+        $f0 = "<span class=V>";
+        $dblRef = 1 if $endPos and $pos < $endPos;
+    } else {
+        $f0 = '';
+    }
+    my @c = ('','','','');
+    $$self{TmpCols} = \@c;
+    if ($name) {
+        if ($msg and $msg =~ /^\[/) {
+            $id = 'U';
+        } else {
+            if ($$self{A}) {
+                $id = 'X';
+                $$self{A} = 0;
+            } else {
+                $id = 'V';
+                $$self{A} = 1;
+            }
+            ++$id unless $dblRef;
+        }
+        $name = "<a name=$name class=$id>";
+        $msg and $msg = "$name$msg</a>";
+    } else {
+        $name = '';
+    }
+    # use base-relative offsets from now on
+    my $cols = 0;
+    my $p = $pos;
+    if ($$self{Cont}) {
+        $cols = $pos & 0x0f;
+        $c[1] .= ($cols == 8) ? '  ' : ' ';
+    } else {
+        my $addr = $pos < 0 ? sprintf("-%.4x",-$pos) : sprintf("%5.4x",$pos);
+        $self->Open('fgd', $f0, 0);
+        $self->Open('fgd', '', 3);
+        $c[0] .= "$addr";
+        $p -= $pos & 0x0f unless $flag & 0x01;
+        if ($p < $pos) {
+            $self->Open('bkg', '', 1, 2); # don't underline white space
+            $cols = $pos - $p;
+            my $n = 3 * $cols;
+            ++$n if $cols > 7;
+            $c[1] .= ' ' x $n;
+            $c[2] .= ' ' x $cols;
+            $p = $pos;
+        }
+    }
+    # loop through each column of hex numbers
+    for (;;) {
+        my (@spanClass, @spanCont, $spanClose, $bkg);
+        if ($p >= $bkgStart and $p < $bkgEnd) {
+            foreach $bkg (@bkgSpan) {
+                next unless $p >= $$bkg{Start} and $p < $$bkg{End};
+                push @spanClass, $$bkg{Class};
+                if ($p + 1 == $$bkg{End}) {
+                    $spanClose = 1;
+                } else {
+                    push @spanCont, $$bkg{Class};   # this span continues
+                }
+            }
+            $self->Open('bkg', @spanClass ? "<span class='@spanClass'>" : '', 1, 2);
+        } else {
+            $self->Open('bkg', '', 1, 2);
+        }
+        $self->Open('a', $name, 1, 2);
+        my $ch = substr($$blockPt,$p-$pos-$skipped,1);
+        $c[1] .= sprintf("%.2x", ord($ch));
+        # make the character HTML-friendly
+        $ch =~ tr/\x00-\x1f\x7f-\xff/./;
+        $ch =~ s/&/&amp;/g;
+        $ch =~ s/>/&gt;/g;
+        $ch =~ s/</&lt;/g;
+        $c[2] .= $ch;
+        ++$p;
+        ++$cols;
+        # close necessary elements
+        if ($spanClose) {
+            my $spanCont = @spanCont ? "<span class='@spanCont'>" : '';
+            # close without reopening if closing anchor later
+            my $arg = ($p - $pos >= $len) ? 0 : $spanCont;
+            $self->Open('bkg', $arg, 1, 2);
+        }
+        if ($dblRef and $p >= $endPos) {
+            $dblRef = 0;
+            ++$id;
+            $name =~ s/class=\w\b/class=$id/;
+            $f0 = '';
+            $self->Open('fgd', $f0, 0);
+        }
+        if ($p - $pos >= $len) {
+            $self->Open('a', '', 1, 2);     # close our anchor
+            last;
+        }
+        if ($cols < 16) {
+            $c[1] .= ($cols == 8 ? '  ' : ' ');
+            next;
+        } elsif ($flag & 0x01 and $cols < $len) {
+            $c[1] .= ' ';
+            next;   # put it all on one line
+        }
+        unless ($$self{Msg}) {
+            $c[3] .= $msg;
+            $msg = '';
+        }
+        $_ .= "\n" foreach @c;  # add CR to all lines
+        $$self{Msg} = 0;
+        # limit data length if specified
+        if ($$self{Limit}) {
+            my $div = ($flag & 0x08) ? 4 : 1;
+            my $lim = $$self{Limit} / (2 * $div) - 16;
+            if ($p - $pos > $lim and $len - $p + $pos > $lim) {
+                my $n = ($len - $p + $pos - $lim) & ~0x0f;
+                if ($n > 16) { # (no use just cutting out one line)
+                    $self->Open('bkg', '', 1, 2); # no underline
+                    my $note = sprintf "[snip %d lines]", $n / 16;
+                    $note = (' ' x (24-length($note)/2)) . $note;
+                    $c[0] .= "  ...\n";
+                    $c[1] .= $note . (' ' x (48-length($note))) . "\n";
+                    $c[2] .= "     [snip]     \n";
+                    $c[3] .= "\n";
+                    $p += $n;
+                    $skipped += $len - length $$blockPt;
+                }
+            }
+        }
+        $c[0] .= ($p < 0 ? sprintf("-%.4x",-$p) : sprintf("%5.4x",$p));
+        $cols = 0;
+    }
+    if ($msg) {
+        $msg = " $msg" if $$self{Msg};
+        $c[3] .= $msg;
+    }
+    if ($flag & 0x100 and $cols < 16) {    # continue on same line?
+        $$self{Cont} = 1;
+        $$self{Msg} = 1 if $msg;
+    } else {
+        $_ .= "\n" foreach @c;
+        $$self{Msg} = 0;
+        $$self{Cont} = 0;
+    }
+    # add temporary column data to our real columns
+    my $i;
+    for ($i=0; $i<4; ++$i) {
+        $self->{Cols}->[$i] .= $c[$i];
+    }
+    delete $$self{TmpCols};
+}
+
+#------------------------------------------------------------------------------
+# Finish dumping of TIFF image data
+# Inputs: 0) HtmlDump object ref, 1) ExifTool object ref, 2) length of file
+# (this really belongs in Image::ExifTool::Exif, but is placed here so it
+#  is only compiled when needed)
+sub FinishTiffDump($$$)
+{
+    my ($self, $exifTool, $size) = @_;
+    my ($tag, $key, $start, $blockInfo, $i);
+
+    # list of all indirectly referenced TIFF data tags
+    my %offsetPair = (
+        StripOffsets      => 'StripByteCounts',
+        TileOffsets       => 'TileByteCounts',
+        FreeOffsets       => 'FreeByteCounts',
+        ThumbnailOffset   => 'ThumbnailLength',
+        PreviewImageStart => 'PreviewImageLength',
+        JpgFromRawStart   => 'JpgFromRawLength',
+        OtherImageStart   => 'OtherImageLength',
+        ImageOffset       => 'ImageByteCount',
+        AlphaOffset       => 'AlphaByteCount',
+        MPImageStart      => 'MPImageLength',
+        IDCPreviewStart   => 'IDCPreviewLength',
+    );
+
+    # add TIFF data to html dump
+    foreach $tag (keys %offsetPair) {
+        my $info = $exifTool->GetInfo($tag);
+        next unless %$info;
+        # Panasonic hack: StripOffsets is not valid for Panasonic RW2 files,
+        # and StripRowBytes is not valid for some RAW images
+        if ($tag eq 'StripOffsets' and $exifTool->{TAG_INFO}{$tag}{PanasonicHack}) {
+            # use RawDataOffset instead if available since it is valid in RW2
+            my $info2 = $exifTool->GetInfo('RawDataOffset');
+            $info2 = $info unless %$info2;
+            my @keys = keys %$info2;
+            my $offset = $$info2{$keys[0]};
+            my $raf = $$exifTool{RAF};
+            # ignore StripByteCounts and assume raw data runs to the end of file
+            if (@keys == 1 and $offset =~ /^\d+$/ and $raf) {
+                my $pos = $raf->Tell();
+                $raf->Seek(0, 2);   # seek to end
+                my $len = $raf->Tell() - $offset;
+                $raf->Seek($pos, 0);
+                if ($len > 0) {
+                    $self->Add($offset, $len, "(Panasonic raw data)", "Size: $len bytes", 0x08);
+                    next;
+                }
+            }
+        }
+        # loop through all offsets tags
+        foreach $key (keys %$info) {
+            my $name = Image::ExifTool::GetTagName($key);
+            my $grp1 = $exifTool->GetGroup($key, 1);
+            my $info2 = $exifTool->GetInfo($offsetPair{$tag}, { Group1 => $grp1 });
+            my $key2 = $offsetPair{$tag};
+            $key2 .= $1 if $key =~ /( .*)/; # use same instance number as $tag
+            next unless $$info2{$key2};
+            my $offsets = $$info{$key};
+            my $byteCounts = $$info2{$key2};
+            # ignore primary MPImage (this is the whole JPEG)
+            next if $tag eq 'MPImageStart' and $offsets eq '0';
+            # (long lists may be SCALAR references)
+            my @offsets = split ' ', (ref $offsets ? $$offsets : $offsets);
+            my @byteCounts = split ' ', (ref $byteCounts ? $$byteCounts : $byteCounts);
+            my $num = scalar @offsets;
+            my $li = 0;
+            my $padBytes = 0;
+            for ($i=0; @offsets and @byteCounts; ++$i) {
+                my $offset = shift @offsets;
+                my $byteCount = shift @byteCounts;
+                my $end = $offset + $byteCount;
+                if (@offsets and @byteCounts) {
+                    # show data as contiguous if only normal pad bytes between blocks
+                    if ($end & 0x01 and $end + 1 == $offsets[0]) {
+                        $end += 1;
+                        ++$padBytes;    # count them
+                    }
+                    if ($end == $offsets[0]) {
+                        # combine these two blocks
+                        $byteCounts[0] += $offsets[0] - $offset;
+                        $offsets[0] = $offset;
+                        next;
+                    }
+                }
+                my $msg = $exifTool->GetGroup($key, 1) . ':' . $tag;
+                $msg =~ s/(Offsets?|Start)$/ /;
+                if ($num > 1) {
+                    $msg .= "$li-" if $li != $i;
+                    $msg .= "$i ";
+                    $li = $i + 1;
+                }
+                $msg .= "data";
+                my $tip = "Size: $byteCount bytes";
+                $tip .= ", incl. $padBytes pad bytes" if $padBytes;
+                $self->Add($offset, $byteCount, "($msg)", $tip, 0x08);
+            }
+        }
+    }
+    # find offset of last dumped information, and dump any unknown trailer
+    my $last = 0;
+    my $block = $$self{Block};
+    foreach $start (keys %$block) {
+        foreach $blockInfo (@{$$block{$start}}) {
+            my $end = $start + $$blockInfo[0];
+            $last = $end if $last < $end;
+        }
+    }
+    my $diff = $size - $last;
+    if ($diff > 0 and ($last or $exifTool->Options('Unknown'))) {
+        if ($diff > 1 or $size & 0x01) {
+            $self->Add($last, $diff, "[unknown data]", "Size: $diff bytes", 0x08);
+        } else {
+            $self->Add($last, $diff, "[trailing pad byte]", undef, 0x08);
+        }
+    }
+}
+
+#------------------------------------------------------------------------------
+# utility routine to write to file or memory
+# Inputs: 0) file or scalar reference, 1-N) list of stuff to write
+# Returns: true on success
+sub Write($@)
+{
+    my $outfile = shift;
+    if (UNIVERSAL::isa($outfile,'GLOB')) {
+        return print $outfile @_;
+    } elsif (ref $outfile eq 'SCALAR') {
+        $$outfile .= join('', @_);
+        return 1;
+    }
+    return 0;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::HtmlDump - Dump information in hex to HTML page
+
+=head1 SYNOPSIS
+
+    use Image::ExifTool::HtmlDump;
+    my $dump = new Image::ExifTool::HtmlDump;
+    $dump->Add($start, $size, $comment);
+    $dump->Print($dumpInfo, $raf, $dataPt, $dataPos, $outfile);
+
+=head1 DESCRIPTION
+
+This module contains code used to generate an HTML-based hex dump of
+information for debugging purposes.  This is code is called when the
+ExifTool 'HtmlDump' option is used.
+
+Currently, only EXIF/TIFF and JPEG information is dumped.
+
+=head1 BUGS
+
+Due to a memory allocation bug in ActivePerl 5.8.x for Windows, this code
+may run extremely slowly when processing large files with this version of
+Perl.
+
+An HTML 4 compliant browser is needed to properly display the generated HTML
+page.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/ICC_Profile.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/ICC_Profile.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/ICC_Profile.pm	(revision 24799)
@@ -0,0 +1,996 @@
+#------------------------------------------------------------------------------
+# File:         ICC_Profile.pm
+#
+# Description:  Read ICC Profile meta information
+#
+# Revisions:    11/16/2004 - P. Harvey Created
+#
+# References:   1) http://www.color.org/icc_specs2.html (ICC.1:2003-09)
+#               2) http://www.color.org/icc_specs2.html (ICC.1:2001-04)
+#               3) http://developer.apple.com/documentation/GraphicsImaging/Reference/ColorSync_Manager/ColorSync_Manager.pdf
+#               4) http://www.color.org/privatetag2007-01.pdf
+#               5) http://www.color.org/icc_specs2.xalter (approved revisions, 2010-07-16)
+#
+# Notes:        The ICC profile information is different: the format of each
+#               tag is embedded in the information instead of in the directory
+#               structure. This makes things a bit more complex because I need
+#               an extra level of logic to decode the variable-format tags.
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::ICC_Profile;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.22';
+
+sub ProcessICC($$);
+sub ProcessICC_Profile($$$);
+sub WriteICC_Profile($$;$);
+sub ProcessMetadata($$$);
+sub ValidateICC($);
+
+# illuminant type definitions
+my %illuminantType = (
+    1 => 'D50',
+    2 => 'D65',
+    3 => 'D93',
+    4 => 'F2',
+    5 => 'D55',
+    6 => 'A',
+    7 => 'Equi-Power (E)',
+    8 => 'F8',
+);
+my %profileClass = (
+    scnr => 'Input Device Profile',
+    mntr => 'Display Device Profile',
+    prtr => 'Output Device Profile',
+   'link'=> 'DeviceLink Profile',
+    spac => 'ColorSpace Conversion Profile',
+    abst => 'Abstract Profile',
+    nmcl => 'NamedColor Profile',
+    nkpf => 'Nikon Input Device Profile (NON-STANDARD!)', # (written by Nikon utilities)
+);
+
+# ICC_Profile tag table
+%Image::ExifTool::ICC_Profile::Main = (
+    GROUPS => { 2 => 'Image' },
+    PROCESS_PROC => \&ProcessICC_Profile,
+    WRITE_PROC => \&WriteICC_Profile,
+    NOTES => q{
+        ICC profile information is used in many different file types including JPEG,
+        TIFF, PDF, PostScript, Photoshop, PNG, MIFF, PICT, QuickTime, XCF and some
+        RAW formats.  While the tags listed below are not individually writable, the
+        entire profile itself can be accessed via the extra 'ICC_Profile' tag, but
+        this tag is neither extracted nor written unless specified explicitly.  See
+        L<http://www.color.org/icc_specs2.xalter> for the official ICC
+        specification.
+    },
+    A2B0 => 'AToB0',
+    A2B1 => 'AToB1',
+    A2B2 => 'AToB2',
+    bXYZ => 'BlueMatrixColumn', # (called BlueColorant in ref 2)
+    bTRC => {
+        Name => 'BlueTRC',
+        Description => 'Blue Tone Reproduction Curve',
+    },
+    B2A0 => 'BToA0',
+    B2A1 => 'BToA1',
+    B2A2 => 'BToA2',
+    calt => {
+        Name => 'CalibrationDateTime',
+        Groups => { 2 => 'Time' },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    targ => {
+        Name => 'CharTarget',
+        ValueConv => 'length $val > 128 ? \$val : $val',
+    },
+    chad => 'ChromaticAdaptation',
+    chrm => {
+        Name => 'Chromaticity',
+        Groups => { 1 => 'ICC_Profile#' }, #(just for the group list)
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::ICC_Profile::Chromaticity',
+            Validate => '$type eq "chrm"',
+        },
+    },
+    clro => 'ColorantOrder',
+    clrt => {
+        Name => 'ColorantTable',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::ICC_Profile::ColorantTable',
+            Validate => '$type eq "clrt"',
+        },
+    },
+    clot => { # new in version 4.2
+        Name => 'ColorantTableOut',
+        Binary => 1,
+    },
+    cprt => {
+        Name => 'ProfileCopyright',
+        ValueConv => '$val=~s/\0.*//; $val', # may be null terminated
+    },
+    crdi => 'CRDInfo', #2
+    dmnd => {
+        Name => 'DeviceMfgDesc',
+        Groups => { 2 => 'Camera' },
+    },
+    dmdd => {
+        Name => 'DeviceModelDesc',
+        Groups => { 2 => 'Camera' },
+    },
+    devs => {
+        Name => 'DeviceSettings', #2
+        Groups => { 2 => 'Camera' },
+    },
+    gamt => 'Gamut',
+    kTRC => {
+        Name => 'GrayTRC',
+        Description => 'Gray Tone Reproduction Curve',
+    },
+    gXYZ => 'GreenMatrixColumn', # (called GreenColorant in ref 2)
+    gTRC => {
+        Name => 'GreenTRC',
+        Description => 'Green Tone Reproduction Curve',
+    },
+    lumi => 'Luminance',
+    meas => {
+        Name => 'Measurement',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::ICC_Profile::Measurement',
+            Validate => '$type eq "meas"',
+        },
+    },
+    bkpt => 'MediaBlackPoint',
+    wtpt => 'MediaWhitePoint',
+    ncol => 'NamedColor', #2
+    ncl2 => 'NamedColor2',
+    resp => 'OutputResponse',
+    pre0 => 'Preview0',
+    pre1 => 'Preview1',
+    pre2 => 'Preview2',
+    desc => 'ProfileDescription',
+    pseq => 'ProfileSequenceDesc',
+    psd0 => 'PostScript2CRD0', #2
+    psd1 => 'PostScript2CRD1', #2
+    psd2 => 'PostScript2CRD2', #2
+    ps2s => 'PostScript2CSA', #2
+    ps2i => 'PS2RenderingIntent', #2
+    rXYZ => 'RedMatrixColumn', # (called RedColorant in ref 2)
+    rTRC => {
+        Name => 'RedTRC',
+        Description => 'Red Tone Reproduction Curve',
+    },
+    scrd => 'ScreeningDesc',
+    scrn => 'Screening',
+   'bfd '=> {
+        Name => 'UCRBG',
+        Description => 'Under Color Removal and Black Gen.',
+    },
+    tech => {
+        Name => 'Technology',
+        PrintConv => {
+            fscn => 'Film Scanner',
+            dcam => 'Digital Camera',
+            rscn => 'Reflective Scanner',
+            ijet => 'Ink Jet Printer',
+            twax => 'Thermal Wax Printer',
+            epho => 'Electrophotographic Printer',
+            esta => 'Electrostatic Printer',
+            dsub => 'Dye Sublimation Printer',
+            rpho => 'Photographic Paper Printer',
+            fprn => 'Film Writer',
+            vidm => 'Video Monitor',
+            vidc => 'Video Camera',
+            pjtv => 'Projection Television',
+           'CRT '=> 'Cathode Ray Tube Display',
+           'PMD '=> 'Passive Matrix Display',
+           'AMD '=> 'Active Matrix Display',
+            KPCD => 'Photo CD',
+            imgs => 'Photo Image Setter',
+            grav => 'Gravure',
+            offs => 'Offset Lithography',
+            silk => 'Silkscreen',
+            flex => 'Flexography',
+            mpfs => 'Motion Picture Film Scanner', #5
+            mpfr => 'Motion Picture Film Recorder', #5
+            dmpc => 'Digital Motion Picture Camera', #5
+            dcpj => 'Digital Cinema Projector', #5
+        },
+    },
+    vued => 'ViewingCondDesc',
+    view => {
+        Name => 'ViewingConditions',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::ICC_Profile::ViewingConditions',
+            Validate => '$type eq "view"',
+        },
+    },
+    ciis => 'ColorimetricIntentImageState', #5
+    scoe => 'SceneColorimetryEstimates', #5
+    sape => 'SceneAppearanceEstimates', #5
+    fpce => 'FocalPlaneColorimetryEstimates', #5
+    rhoc => 'ReflectionHardcopyOrigColorimetry', #5
+    rpoc => 'ReflectionPrintOutputColorimetry', #5
+    psid => { #5
+        Name => 'ProfileSequenceIdentifier',
+        Binary => 1,
+    },
+    B2D0 => { Name => 'BToD0', Binary => 1 }, #5
+    B2D1 => { Name => 'BToD1', Binary => 1 }, #5
+    B2D2 => { Name => 'BToD2', Binary => 1 }, #5
+    B2D3 => { Name => 'BToD3', Binary => 1 }, #5
+    D2B0 => { Name => 'DToB0', Binary => 1 }, #5
+    D2B1 => { Name => 'DToB1', Binary => 1 }, #5
+    D2B2 => { Name => 'DToB2', Binary => 1 }, #5
+    D2B3 => { Name => 'DToB3', Binary => 1 }, #5
+    rig0 => { #5
+        Name => 'PerceptualRenderingIntentGamut',
+        PrintConv => {
+            prmg => 'Perceptual Reference Medium Gamut',
+        },
+    },
+    rig2 => { #5
+        Name => 'SaturationRenderingIntentGamut',
+        PrintConv => {
+            prmg => 'Perceptual Reference Medium Gamut',
+        },
+    },
+    meta => { #5 (EVENTUALLY DECODE THIS ONCE WE HAVE A SAMPLE!!)
+        Name => 'Metadata',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::ICC_Profile::Metadata',
+            Validate => '$type eq "meta"',
+        },
+    },
+
+    # ColorSync custom tags (ref 3)
+    psvm => 'PS2CRDVMSize',
+    vcgt => 'VideoCardGamma',
+    mmod => 'MakeAndModel',
+    dscm => 'ProfileDescriptionML',
+    ndin => 'NativeDisplayInfo',
+
+    # Microsoft custom tags (ref http://msdn2.microsoft.com/en-us/library/ms536870.aspx)
+    MS00 => 'WCSProfiles',
+
+    # the following entry represents the ICC profile header, and doesn't
+    # exist as a tag in the directory.  It is only in this table to provide
+    # a link so ExifTool can locate the header tags
+    Header => {
+        Name => 'ProfileHeader',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::ICC_Profile::Header',
+        },
+    },
+);
+
+# ICC profile header definition
+%Image::ExifTool::ICC_Profile::Header = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'ICC_Profile', 1 => 'ICC-header', 2 => 'Image' },
+    4 => {
+        Name => 'ProfileCMMType',
+        Format => 'string[4]',
+    },
+    8 => {
+        Name => 'ProfileVersion',
+        Format => 'int16s',
+        PrintConv => '($val >> 8).".".(($val & 0xf0)>>4).".".($val & 0x0f)',
+    },
+    12 => {
+        Name => 'ProfileClass',
+        Format => 'string[4]',
+        PrintConv => \%profileClass,
+    },
+    16 => {
+        Name => 'ColorSpaceData',
+        Format => 'string[4]',
+    },
+    20 => {
+        Name => 'ProfileConnectionSpace',
+        Format => 'string[4]',
+    },
+    24 => {
+        Name => 'ProfileDateTime',
+        Groups => { 2 => 'Time' },
+        Format => 'int16u[6]',
+        ValueConv => 'sprintf("%.4d:%.2d:%.2d %.2d:%.2d:%.2d",split(" ",$val));',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    36 => {
+        Name => 'ProfileFileSignature',
+        Format => 'string[4]',
+    },
+    40 => {
+        Name => 'PrimaryPlatform',
+        Format => 'string[4]',
+        PrintConv => {
+            'APPL' => 'Apple Computer Inc.',
+            'MSFT' => 'Microsoft Corporation',
+            'SGI ' => 'Silicon Graphics Inc.',
+            'SUNW' => 'Sun Microsystems Inc.',
+            'TGNT' => 'Taligent Inc.',
+        },
+    },
+    44 => {
+        Name => 'CMMFlags',
+        Format => 'int32u',
+        PrintConv => q[
+            ($val & 0x01 ? "Embedded, " : "Not Embedded, ") .
+            ($val & 0x02 ? "Not Independent" : "Independent")
+        ],
+    },
+    48 => {
+        Name => 'DeviceManufacturer',
+        Format => 'string[4]',
+        # KODA = Kodak
+    },
+    52 => {
+        Name => 'DeviceModel',
+        Format => 'string[4]',
+        # ROMM = Refrence Output Medium Metric
+    },
+    56 => {
+        Name => 'DeviceAttributes',
+        Format => 'int32u[2]',
+        PrintConv => q[
+            my @v = split ' ', $val;
+            ($v[1] & 0x01 ? "Transparency, " : "Reflective, ") .
+            ($v[1] & 0x02 ? "Matte, " : "Glossy, ") .
+            ($v[1] & 0x04 ? "Negative, " : "Positive, ") .
+            ($v[1] & 0x08 ? "B&W" : "Color");
+        ],
+    },
+    64 => {
+        Name => 'RenderingIntent',
+        Format => 'int32u',
+        PrintConv => {
+            0 => 'Perceptual',
+            1 => 'Media-Relative Colorimetric',
+            2 => 'Saturation',
+            3 => 'ICC-Absolute Colorimetric',
+        },
+    },
+    68 => {
+        Name => 'ConnectionSpaceIlluminant',
+        Format => 'fixed32s[3]',  # xyz
+    },
+    80 => {
+        Name => 'ProfileCreator',
+        Format => 'string[4]',
+        # KODA = Kodak
+    },
+    84 => {
+        Name => 'ProfileID',
+        Format => 'int8u[16]',
+        PrintConv => 'Image::ExifTool::ICC_Profile::HexID($val)',
+    },
+);
+
+# viewingConditionsType (view) definition
+%Image::ExifTool::ICC_Profile::ViewingConditions = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'ICC_Profile', 1 => 'ICC-view', 2 => 'Image' },
+    8 => {
+        Name => 'ViewingCondIlluminant',
+        Format => 'fixed32s[3]',   # xyz
+    },
+    20 => {
+        Name => 'ViewingCondSurround',
+        Format => 'fixed32s[3]',   # xyz
+    },
+    32 => {
+        Name => 'ViewingCondIlluminantType',
+        Format => 'int32u',
+        PrintConv => \%illuminantType,
+    },
+);
+
+# measurementType (meas) definition
+%Image::ExifTool::ICC_Profile::Measurement = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'ICC_Profile', 1 => 'ICC-meas', 2 => 'Image' },
+    8 => {
+        Name => 'MeasurementObserver',
+        Format => 'int32u',
+        PrintConv => {
+            1 => 'CIE 1931',
+            2 => 'CIE 1964',
+        },
+    },
+    12 => {
+        Name => 'MeasurementBacking',
+        Format => 'fixed32s[3]',   # xyz
+    },
+    24 => {
+        Name => 'MeasurementGeometry',
+        Format => 'int32u',
+        PrintConv => {
+            1 => '0/45 or 45/0',
+            2 => '0/d or d/0',
+        },
+    },
+    28 => {
+        Name => 'MeasurementFlare',
+        Format => 'fixed32u',
+        PrintConv => '$val*100 . "%"',  # change into a percent
+    },
+    32 => {
+        Name => 'MeasurementIlluminant',
+        Format => 'int32u',
+        PrintConv => \%illuminantType,
+    },
+);
+
+# chromaticity (chrm) definition
+%Image::ExifTool::ICC_Profile::Chromaticity = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'ICC_Profile', 1 => 'ICC-chrm', 2 => 'Image' },
+    8 => {
+        Name => 'ChromaticityChannels',
+        Format => 'int16u',
+    },
+    10 => {
+        Name => 'ChromaticityColorant',
+        Format => 'int16u',
+        PrintConv => {
+            1 => 'ITU-R BT.709',
+            2 => 'SMPTE RP145-1994',
+            3 => 'EBU Tech.3213-E',
+            4 => 'P22',
+        },
+    },
+    # include definitions for 4 channels -- if there are
+    # fewer then the ProcessBinaryData logic won't print them.
+    # If there are more, oh well.
+    12 => {
+        Name => 'ChromaticityChannel1',
+        Format => 'fixed32u[2]',
+    },
+    20 => {
+        Name => 'ChromaticityChannel2',
+        Format => 'fixed32u[2]',
+    },
+    28 => {
+        Name => 'ChromaticityChannel3',
+        Format => 'fixed32u[2]',
+    },
+    36 => {
+        Name => 'ChromaticityChannel4',
+        Format => 'fixed32u[2]',
+    },
+);
+
+# colorantTable (clrt) definition
+%Image::ExifTool::ICC_Profile::ColorantTable = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'ICC_Profile', 1 => 'ICC-clrt', 2 => 'Image' },
+    8 => {
+        Name => 'ColorantCount',
+        Format => 'int32u',
+    },
+    # include definitions for 3 colorants -- if there are
+    # fewer then the ProcessBinaryData logic won't print them.
+    # If there are more, oh well.
+    12 => {
+        Name => 'Colorant1Name',
+        Format => 'string[32]',
+    },
+    44 => {
+        Name => 'Colorant1Coordinates',
+        Format => 'int16u[3]',
+    },
+    50 => {
+        Name => 'Colorant2Name',
+        Format => 'string[32]',
+    },
+    82 => {
+        Name => 'Colorant2Coordinates',
+        Format => 'int16u[3]',
+    },
+    88 => {
+        Name => 'Colorant3Name',
+        Format => 'string[32]',
+    },
+    120 => {
+        Name => 'Colorant3Coordinates',
+        Format => 'int16u[3]',
+    },
+);
+
+# metadata (meta) tags
+%Image::ExifTool::ICC_Profile::Metadata = (
+    PROCESS_PROC => \&ProcessMetadata,
+    GROUPS => { 0 => 'ICC_Profile', 1 => 'ICC-meta', 2 => 'Image' },
+    VARS => { NO_ID => 1 },
+    NOTES => q{
+        Only these few tags have been pre-defined, but ExifTool will extract any
+        Metadata tags that exist.
+    },
+    ManufacturerName => { },
+    MediaColor       => { },
+    MediaWeight      => { },
+);
+
+#------------------------------------------------------------------------------
+# print ICC Profile ID in hex
+# Inputs: 1) string of numbers
+# Returns: string of hex digits
+sub HexID($)
+{
+    my $val = shift;
+    my @vals = split(' ', $val);
+    # return a simple zero if no MD5 done
+    return 0 unless grep(!/^0/, @vals);
+    $val = '';
+    foreach (@vals) { $val .= sprintf("%.2x",$_); }
+    return $val;
+}
+
+#------------------------------------------------------------------------------
+# get formatted value from ICC tag (which has the type embedded)
+# Inputs: 0) data reference, 1) offset to tag data, 2) tag data size
+# Returns: Formatted value or undefined if format not supported
+# Notes: The following types are handled by BinaryTables:
+#  chromaticityType, colorantTableType, measurementType, viewingConditionsType
+# The following types are not currently handled (most are large tables):
+#  curveType, lut16Type, lut8Type, lutAtoBType, lutBtoAType, namedColor2Type,
+#  parametricCurveType, profileSeqDescType, responseCurveSet16Type
+# The multiLocalizedUnicodeType must be handled by the calling routine.
+sub FormatICCTag($$$)
+{
+    my ($dataPt, $offset, $size) = @_;
+
+    my $type;
+    if ($size >= 8) {
+        # get data type from start of tag data
+        $type = substr($$dataPt, $offset, 4);
+    } else {
+        $type = 'err';
+    }
+    # colorantOrderType
+    if ($type eq 'clro' and $size >= 12) {
+        my $num = Get32u($dataPt, $offset+8);
+        if ($size >= $num + 12) {
+            my $pos = $offset + 12;
+            return join(' ',unpack("x$pos c$num", $$dataPt));
+        }
+    }
+    # dataType
+    if ($type eq 'data' and $size >= 12) {
+        my $form = Get32u($dataPt, $offset+8);
+        # format 0 is ASCII data
+        $form == 0 and return substr($$dataPt, $offset+12, $size-12);
+        # binary data and other data types treat as binary (ie. don't format)
+    }
+    # dateTimeType
+    if ($type eq 'dtim' and $size >= 20) {
+        return sprintf("%.4d:%.2d:%.2d %.2d:%.2d:%.2d",
+               Get16u($dataPt, $offset+8),  Get16u($dataPt, $offset+10),
+               Get16u($dataPt, $offset+12), Get16u($dataPt, $offset+14),
+               Get16u($dataPt, $offset+16), Get16u($dataPt, $offset+18));
+    }
+    # s15Fixed16ArrayType
+    if ($type eq 'sf32') {
+        return ReadValue($dataPt,$offset+8,'fixed32s',($size-8)/4,$size-8);
+    }
+    # signatureType
+    if ($type eq 'sig ' and $size >= 12) {
+        return substr($$dataPt, $offset+8, 4);
+    }
+    # textType
+    $type eq 'text' and return substr($$dataPt, $offset+8, $size-8);
+    # textDescriptionType (ref 2, replaced by multiLocalizedUnicodeType)
+    if ($type eq 'desc' and $size >= 12) {
+        my $len = Get32u($dataPt, $offset+8);
+        if ($size >= $len + 12) {
+            my $str = substr($$dataPt, $offset+12, $len);
+            $str =~ s/\0.*//s;   # truncate at null terminator
+            return $str;
+        }
+    }
+    # u16Fixed16ArrayType
+    if ($type eq 'uf32') {
+        return ReadValue($dataPt,$offset+8,'fixed32u',($size-8)/4,$size-8);
+    }
+    # uInt32ArrayType
+    if ($type eq 'ui32') {
+        return ReadValue($dataPt,$offset+8,'int32u',($size-8)/4,$size-8);
+    }
+    # uInt64ArrayType
+    if ($type eq 'ui64') {
+        return ReadValue($dataPt,$offset+8,'int64u',($size-8)/8,$size-8);
+    }
+    # uInt8ArrayType
+    if ($type eq 'ui08') {
+        return ReadValue($dataPt,$offset+8,'int8u',$size-8,$size-8);
+    }
+    # XYZType
+    if ($type eq 'XYZ ') {
+        my $str = '';
+        my $pos;
+        for ($pos=8; $pos+12<=$size; $pos+=12) {
+            $str and $str .= ', ';
+            $str .= ReadValue($dataPt,$offset+$pos,'fixed32s',3,$size-$pos);
+        }
+        return $str;
+    }
+    return undef;   # data type is not supported
+}
+
+#------------------------------------------------------------------------------
+# Process ICC metadata record (ref 5) (UNTESTED!)
+# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessMetadata($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dirStart = $$dirInfo{DirStart};
+    my $dirLen = $$dirInfo{DirLen};
+    my $dirEnd = $dirStart + $dirLen;
+    
+    if ($dirLen < 16 or substr($$dataPt, $dirStart, 4) ne 'dict') {
+        $exifTool->Warn('Invalid ICC meta dictionary');
+        return 0;
+    }
+    my $num = Get32u($dataPt, $dirStart + 8);
+    $exifTool->VerboseDir('Metadata', $num);
+    my $size = Get32u($dataPt, $dirStart + 12);
+    $size < 16 and $exifTool->Warn('Invalid ICC meta record size'), return 0;
+    # NOTE: In the example the minimum offset is 20,
+    # but this doesn't jive with the table (both in ref 5)
+    my $minPtr = 16 + $size * $num;
+    my $index;
+    for ($index=0; $index<$num; ++$index) {
+        my $entry = $dirStart + 16 + $size * $index;
+        if ($entry + $size > $dirEnd) {
+            $exifTool->Warn('Truncated ICC meta dictionary');
+            last;
+        }
+        my $namePtr = Get32u($dataPt, $entry);
+        my $nameLen = Get32u($dataPt, $entry + 4);
+        my $valuePtr = Get32u($dataPt, $entry + 8);
+        my $valueLen = Get32u($dataPt, $entry + 16);
+        next unless $namePtr and $valuePtr;   # ignore if offsets are zero
+        if ($namePtr < $minPtr or $namePtr + $nameLen > $dirLen or
+            $valuePtr < $minPtr or $valuePtr + $valueLen > $dirLen)
+        {
+            $exifTool->Warn('Corrupted ICC meta dictionary');
+            last;
+        }
+        my $tag = substr($dataPt, $dirStart + $namePtr, $nameLen);
+        my $val = substr($dataPt, $dirStart + $valuePtr, $valueLen);
+        $tag = $exifTool->Decode($tag, 'UTF16', 'MM', 'UTF8');
+        $val = $exifTool->Decode($val, 'UTF16', 'MM');
+        # generate tagInfo if it doesn't exist
+        unless ($$tagTablePtr{$tag}) {
+            my $name = ucfirst $tag;
+            $name =~ s/\s+(.)/\u$1/g;
+            $name =~ tr/-_a-zA-Z0-9//dc;
+            next unless length $name;
+            Image::ExifTool::AddTagToTable($tagTablePtr, $tag, { Name => $name });
+        }
+        $exifTool->HandleTag($tagTablePtr, $tag, $val);
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Write ICC profile file
+# Inputs: 0) ExifTool object reference, 1) Reference to directory information
+# Returns: 1 on success, 0 if this wasn't a valid ICC file,
+#          or -1 if a write error occurred
+sub WriteICC($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    # first make sure this is a valid ICC file (or no file at all)
+    my $raf = $$dirInfo{RAF};
+    my $buff;
+    return 0 if $raf->Read($buff, 24) and ValidateICC(\$buff);
+    # now write the new ICC
+    $buff = WriteICC_Profile($exifTool, $dirInfo);
+    if (defined $buff and length $buff) {
+        Write($$dirInfo{OutFile}, $buff) or return -1;
+    } else {
+        $exifTool->Error('No ICC information to write');
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Write ICC data as a block
+# Inputs: 0) ExifTool object reference, 1) source dirInfo reference,
+#         2) tag table reference
+# Returns: ICC data block (may be empty if no ICC data)
+# Notes: Increments ExifTool CHANGED flag if changed
+sub WriteICC_Profile($$;$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    $exifTool or return 1;    # allow dummy access
+    my $dirName = $$dirInfo{DirName} || 'ICC_Profile';
+    # (don't write AsShotICCProfile or CurrentICCProfile here)
+    return undef unless $dirName eq 'ICC_Profile';
+    my $nvHash = $exifTool->GetNewValueHash($Image::ExifTool::Extra{$dirName});
+    return undef unless Image::ExifTool::IsOverwriting($nvHash);
+    my $val = Image::ExifTool::GetNewValues($nvHash);
+    $val = '' unless defined $val;
+    ++$exifTool->{CHANGED};
+    return $val;
+}
+
+#------------------------------------------------------------------------------
+# Validate ICC data
+# Inputs: 0) ICC data reference
+# Returns: error string or undef on success
+sub ValidateICC($)
+{
+    my $valPtr = shift;
+    my $err;
+    length($$valPtr) < 24 and return 'Invalid ICC profile';
+    $profileClass{substr($$valPtr, 12, 4)} or $err = 'profile class';
+    my $col = substr($$valPtr, 16, 4); # ColorSpaceData
+    my $con = substr($$valPtr, 20, 4); # ConnectionSpace
+    my $match = '(XYZ |Lab |Luv |YCbr|Yxy |RGB |GRAY|HSV |HLS |CMYK|CMY |[2-9A-F]CLR)';
+    $col =~ /$match/ or $err = 'color space';
+    $con =~ /$match/ or $err = 'connection space';
+    return $err ? "Invalid ICC profile (bad $err)" : undef;
+}
+
+#------------------------------------------------------------------------------
+# Process ICC profile file
+# Inputs: 0) ExifTool object reference, 1) Reference to directory information
+# Returns: 1 if this was an ICC file
+sub ProcessICC($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my $buff;
+    $raf->Read($buff, 24) == 24 or return 0;
+    # check to see if this is a valid ICC profile file
+    return 0 if ValidateICC(\$buff);
+    $exifTool->SetFileType();
+    # read the profile
+    my $size = unpack('N', $buff);
+    if ($size < 128 or $size & 0x80000000) {
+        $exifTool->Error("Bad ICC Profile length ($size)");
+        return 1;
+    }
+    $raf->Seek(0, 0);
+    unless ($raf->Read($buff, $size)) {
+        $exifTool->Error('Truncated ICC profile');
+        return 1;
+    }
+    my %dirInfo = (
+        DataPt => \$buff,
+        DataLen => $size,
+        DirStart => 0,
+        DirLen => $size,
+    );
+    my $tagTablePtr = GetTagTable('Image::ExifTool::ICC_Profile::Main');
+    return ProcessICC_Profile($exifTool, \%dirInfo, $tagTablePtr);
+}
+
+#------------------------------------------------------------------------------
+# Process ICC_Profile APP13 record
+# Inputs: 0) ExifTool object reference, 1) Reference to directory information
+#         2) Tag table reference (undefined to read ICC file)
+# Returns: 1 on success
+sub ProcessICC_Profile($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dirStart = $$dirInfo{DirStart};
+    my $dirLen = $$dirInfo{DirLen};
+    my $verbose = $exifTool->Options('Verbose');
+
+    return 0 if $dirLen < 4;
+
+    # extract binary ICC_Profile data block if binary mode or requested
+    if ($exifTool->{OPTIONS}->{Binary} or $exifTool->{REQ_TAG_LOOKUP}->{icc_profile} and
+        # (don't extract from AsShotICCProfile or CurrentICCProfile)
+        (not $$dirInfo{Name} or $$dirInfo{Name} eq 'ICC_Profile'))
+    {
+        $exifTool->FoundTag('ICC_Profile', substr($$dataPt, $dirStart, $dirLen));
+    }
+
+    SetByteOrder('MM');     # ICC_Profile is always big-endian
+
+    # check length of table
+    my $len = Get32u($dataPt, $dirStart);
+    if ($len != $dirLen or $len < 128) {
+        $exifTool->Warn("Bad length ICC_Profile (length $len)");
+        return 0 if $len < 128 or $dirLen < $len;
+    }
+    my $pos = $dirStart + 128;  # position at start of table
+    my $numEntries = Get32u($dataPt, $pos);
+    if ($numEntries < 1 or $numEntries >= 0x100
+        or $numEntries * 12 + 132 > $dirLen)
+    {
+        $exifTool->Warn("Bad ICC_Profile table ($numEntries entries)");
+        return 0;
+    }
+
+    if ($verbose) {
+        $exifTool->VerboseDir('ICC_Profile', $numEntries, $dirLen);
+        my $fakeInfo = { Name=>'ProfileHeader', SubDirectory => { } };
+        $exifTool->VerboseInfo(undef, $fakeInfo);
+    }
+    # increment ICC dir count
+    my $dirCount = $exifTool->{DIR_COUNT}->{ICC} = ($exifTool->{DIR_COUNT}->{ICC} || 0) + 1;
+    $exifTool->{SET_GROUP1} = '+' . $dirCount if $dirCount > 1;
+    # process the header block
+    my %subdirInfo = (
+        Name     => 'ProfileHeader',
+        DataPt   => $dataPt,
+        DataLen  => $$dirInfo{DataLen},
+        DirStart => $dirStart,
+        DirLen   => 128,
+        Parent   => $$dirInfo{DirName},
+    );
+    my $newTagTable = GetTagTable('Image::ExifTool::ICC_Profile::Header');
+    $exifTool->ProcessDirectory(\%subdirInfo, $newTagTable);
+
+    $pos += 4;    # skip item count
+    my $index;
+    for ($index=0; $index<$numEntries; ++$index) {
+        my $tagID  = substr($$dataPt, $pos, 4);
+        my $offset = Get32u($dataPt, $pos + 4);
+        my $size   = Get32u($dataPt, $pos + 8);
+        $pos += 12;
+        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tagID);
+        # unknown tags aren't generated automatically by GetTagInfo()
+        # if the tagID's aren't numeric, so we must do this manually:
+        if (not $tagInfo and $exifTool->{OPTIONS}->{Unknown}) {
+            $tagInfo = { Unknown => 1 };
+            Image::ExifTool::AddTagToTable($tagTablePtr, $tagID, $tagInfo);
+        }
+        next unless defined $tagInfo;
+
+        if ($offset + $size > $dirLen) {
+            $exifTool->Warn("Bad ICC_Profile table (truncated)");
+            last;
+        }
+        my $valuePtr = $dirStart + $offset;
+
+        my $subdir = $$tagInfo{SubDirectory};
+        # format the value unless this is a subdirectory
+        my ($value, $fmt);
+        if ($size > 4) {
+            $fmt = substr($$dataPt, $valuePtr, 4);
+            # handle multiLocalizedUnicodeType
+            if ($fmt eq 'mluc' and not $subdir) {
+                next if $size < 28;
+                my $count = Get32u($dataPt, $valuePtr + 8);
+                my $recLen = Get32u($dataPt, $valuePtr + 12);
+                next if $recLen < 12;
+                my $i;
+                for ($i=0; $i<$count; ++$i) {
+                    my $recPos = $valuePtr + 16 + $i * $recLen;
+                    last if $recPos + $recLen > $valuePtr + $size;
+                    my $lang = substr($$dataPt, $recPos, 4);
+                    my $langInfo;
+                    # validate language code and change to standard case (just in case)
+                    if ($lang =~ s/^([a-z]{2})([A-Z]{2})$/\L$1-\U$2/i and $lang ne 'en-US') {
+                        $langInfo = Image::ExifTool::GetLangInfo($tagInfo, $lang);
+                    }
+                    my $strLen = Get32u($dataPt, $recPos + 4);
+                    my $strPos = Get32u($dataPt, $recPos + 8);
+                    last if $strPos + $strLen > $size; 
+                    my $str = substr($$dataPt, $valuePtr + $strPos, $strLen);
+                    $str = $exifTool->Decode($str, 'UTF16');
+                    $exifTool->HandleTag($tagTablePtr, $tagID, $str,
+                        TagInfo => $langInfo || $tagInfo,
+                        Table  => $tagTablePtr,
+                        Index  => $index,
+                        Value  => $str,
+                        DataPt => $dataPt,
+                        Size   => $strLen,
+                        Start  => $valuePtr + $strPos,
+                        Format => "type '$fmt'",
+                    );
+                }
+                $exifTool->Warn("Corrupted $$tagInfo{Name} data") if $i < $count;
+                next;
+            }
+        } else {
+            $fmt = 'err ';
+        }
+        $value = FormatICCTag($dataPt, $valuePtr, $size) unless $subdir;
+        $verbose and $exifTool->VerboseInfo($tagID, $tagInfo,
+            Table  => $tagTablePtr,
+            Index  => $index,
+            Value  => $value,
+            DataPt => $dataPt,
+            Size   => $size,
+            Start  => $valuePtr,
+            Format => "type '$fmt'",
+        );
+        if ($subdir) {
+            my $name = $$tagInfo{Name};
+            undef $newTagTable;
+            if ($$subdir{TagTable}) {
+                $newTagTable = GetTagTable($$subdir{TagTable});
+                unless ($newTagTable) {
+                    warn "Unknown tag table $$subdir{TagTable}\n";
+                    next;
+                }
+            } else {
+                warn "Must specify TagTable for SubDirectory $name\n";
+                next;
+            }
+            %subdirInfo = (
+                Name     => $name,
+                DataPt   => $dataPt,
+                DataPos  => $$dirInfo{DataPos},
+                DataLen  => $$dirInfo{DataLen},
+                DirStart => $valuePtr,
+                DirLen   => $size,
+                Parent   => $$dirInfo{DirName},
+            );
+            my $type = substr($$dataPt, $valuePtr, 4);
+            #### eval Validate ($type)
+            if (defined $$subdir{Validate} and not eval $$subdir{Validate}) {
+                $exifTool->Warn("Invalid $name data");
+            } else {
+                $exifTool->ProcessDirectory(\%subdirInfo, $newTagTable, $$subdir{ProcessProc});
+            }
+        } elsif (defined $value) {
+            $exifTool->FoundTag($tagInfo, $value);
+        } else {
+            $value = substr($$dataPt, $valuePtr, $size);
+            # treat unsupported formats as binary data
+            $$tagInfo{ValueConv} = '\$val' unless defined $$tagInfo{ValueConv};
+            $exifTool->FoundTag($tagInfo, $value);
+        }
+    }
+    delete $exifTool->{SET_GROUP1};
+    return 1;
+}
+
+
+1; # end
+
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::ICC_Profile - Read ICC Profile meta information
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This module contains the definitions to read information from ICC profiles.
+ICC (International Color Consortium) profiles are used to translate color
+data created on one device into another device's native color space.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.color.org/icc_specs2.html>
+
+=item L<http://developer.apple.com/documentation/GraphicsImaging/Reference/ColorSync_Manager/ColorSync_Manager.pdf>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/ICC_Profile Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/ID3.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/ID3.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/ID3.pm	(revision 24799)
@@ -0,0 +1,1211 @@
+#------------------------------------------------------------------------------
+# File:         ID3.pm
+#
+# Description:  Read ID3 meta information
+#
+# Revisions:    09/12/2005 - P. Harvey Created
+#
+# References:   1) http://www.id3.org/
+#               2) http://www.mp3-tech.org/
+#               3) http://www.fortunecity.com/underworld/sonic/3/id3tag.html
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::ID3;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.28';
+
+sub ProcessID3v2($$$);
+sub ProcessPrivate($$$);
+sub ConvertID3v1Text($$);
+
+# audio formats that we process after an ID3v2 header (in order)
+my @audioFormats = qw(APE MPC FLAC OGG MP3);
+
+# audio formats where the processing proc is in a different module
+my %audioModule = (
+    MP3 => 'ID3',
+    OGG => 'Vorbis',
+);
+
+# picture types for 'PIC' and 'APIC' tags
+# (Note: Duplicated in ID3, ASF and FLAC modules!)
+my %pictureType = (
+    0 => 'Other',
+    1 => '32x32 PNG Icon',
+    2 => 'Other Icon',
+    3 => 'Front Cover',
+    4 => 'Back Cover',
+    5 => 'Leaflet',
+    6 => 'Media',
+    7 => 'Lead Artist',
+    8 => 'Artist',
+    9 => 'Conductor',
+    10 => 'Band',
+    11 => 'Composer',
+    12 => 'Lyricist',
+    13 => 'Recording Studio or Location',
+    14 => 'Recording Session',
+    15 => 'Performance',
+    16 => 'Capture from Movie or Video',
+    17 => 'Bright(ly) Colored Fish',
+    18 => 'Illustration',
+    19 => 'Band Logo',
+    20 => 'Publisher Logo',
+);
+
+my %dateTimeConv = (
+    ValueConv => 'require Image::ExifTool::XMP; Image::ExifTool::XMP::ConvertXMPDate($val)',
+    PrintConv => '$self->ConvertDateTime($val)',
+);
+
+# This table is just for documentation purposes
+%Image::ExifTool::ID3::Main = (
+    VARS => { NO_ID => 1 },
+    NOTES => q{
+        ExifTool extracts ID3 information from MP3, MPEG, AIFF, OGG, FLAC, APE and
+        RealAudio files.  ID3v2 tags which support multiple languages (ie. Comment
+        and Lyrics) are extracted by specifying the tag name, followed by a dash
+        ('-'), then a 3-character
+        ISO 639-2
+        language code (ie. "Comment-spa"). See L<http://www.id3.org/> for the
+        official ID3 specification and
+        L<http://www.loc.gov/standards/iso639-2/php/code_list.php> for a list of ISO
+        639-2 language codes.
+    },
+    ID3v1 => {
+        Name => 'ID3v1',
+        SubDirectory => { TagTable => 'Image::ExifTool::ID3::v1' },
+    },
+    ID3v1Enh => {
+        Name => 'ID3v1_Enh',
+        SubDirectory => { TagTable => 'Image::ExifTool::ID3::v1_Enh' },
+    },
+    ID3v22 => {
+        Name => 'ID3v2_2',
+        SubDirectory => { TagTable => 'Image::ExifTool::ID3::v2_2' },
+    },
+    ID3v23 => {
+        Name => 'ID3v2_3',
+        SubDirectory => { TagTable => 'Image::ExifTool::ID3::v2_3' },
+    },
+    ID3v24 => {
+        Name => 'ID3v2_4',
+        SubDirectory => { TagTable => 'Image::ExifTool::ID3::v2_4' },
+    },
+);
+
+# Mapping for ID3v1 Genre numbers
+my %genre = (
+      0 => 'Blues',
+      1 => 'Classic Rock',
+      2 => 'Country',
+      3 => 'Dance',
+      4 => 'Disco',
+      5 => 'Funk',
+      6 => 'Grunge',
+      7 => 'Hip-Hop',
+      8 => 'Jazz',
+      9 => 'Metal',
+     10 => 'New Age',
+     11 => 'Oldies',
+     12 => 'Other',
+     13 => 'Pop',
+     14 => 'R&B',
+     15 => 'Rap',
+     16 => 'Reggae',
+     17 => 'Rock',
+     18 => 'Techno',
+     19 => 'Industrial',
+     20 => 'Alternative',
+     21 => 'Ska',
+     22 => 'Death Metal',
+     23 => 'Pranks',
+     24 => 'Soundtrack',
+     25 => 'Euro-Techno',
+     26 => 'Ambient',
+     27 => 'Trip-Hop',
+     28 => 'Vocal',
+     29 => 'Jazz+Funk',
+     30 => 'Fusion',
+     31 => 'Trance',
+     32 => 'Classical',
+     33 => 'Instrumental',
+     34 => 'Acid',
+     35 => 'House',
+     36 => 'Game',
+     37 => 'Sound Clip',
+     38 => 'Gospel',
+     39 => 'Noise',
+     40 => 'AlternRock',
+     41 => 'Bass',
+     42 => 'Soul',
+     43 => 'Punk',
+     44 => 'Space',
+     45 => 'Meditative',
+     46 => 'Instrumental Pop',
+     47 => 'Instrumental Rock',
+     48 => 'Ethnic',
+     49 => 'Gothic',
+     50 => 'Darkwave',
+     51 => 'Techno-Industrial',
+     52 => 'Electronic',
+     53 => 'Pop-Folk',
+     54 => 'Eurodance',
+     55 => 'Dream',
+     56 => 'Southern Rock',
+     57 => 'Comedy',
+     58 => 'Cult',
+     59 => 'Gangsta',
+     60 => 'Top 40',
+     61 => 'Christian Rap',
+     62 => 'Pop/Funk',
+     63 => 'Jungle',
+     64 => 'Native American',
+     65 => 'Cabaret',
+     66 => 'New Wave',
+     67 => 'Psychadelic',
+     68 => 'Rave',
+     69 => 'Showtunes',
+     70 => 'Trailer',
+     71 => 'Lo-Fi',
+     72 => 'Tribal',
+     73 => 'Acid Punk',
+     74 => 'Acid Jazz',
+     75 => 'Polka',
+     76 => 'Retro',
+     77 => 'Musical',
+     78 => 'Rock & Roll',
+     79 => 'Hard Rock',
+     # The following genres are Winamp extensions
+     80 => 'Folk',
+     81 => 'Folk-Rock',
+     82 => 'National Folk',
+     83 => 'Swing',
+     84 => 'Fast Fusion',
+     85 => 'Bebob',
+     86 => 'Latin',
+     87 => 'Revival',
+     88 => 'Celtic',
+     89 => 'Bluegrass',
+     90 => 'Avantgarde',
+     91 => 'Gothic Rock',
+     92 => 'Progressive Rock',
+     93 => 'Psychedelic Rock',
+     94 => 'Symphonic Rock',
+     95 => 'Slow Rock',
+     96 => 'Big Band',
+     97 => 'Chorus',
+     98 => 'Easy Listening',
+     99 => 'Acoustic',
+    100 => 'Humour',
+    101 => 'Speech',
+    102 => 'Chanson',
+    103 => 'Opera',
+    104 => 'Chamber Music',
+    105 => 'Sonata',
+    106 => 'Symphony',
+    107 => 'Booty Bass',
+    108 => 'Primus',
+    109 => 'Porn Groove',
+    110 => 'Satire',
+    111 => 'Slow Jam',
+    112 => 'Club',
+    113 => 'Tango',
+    114 => 'Samba',
+    115 => 'Folklore',
+    116 => 'Ballad',
+    117 => 'Power Ballad',
+    118 => 'Rhythmic Soul',
+    119 => 'Freestyle',
+    120 => 'Duet',
+    121 => 'Punk Rock',
+    122 => 'Drum Solo',
+    123 => 'Acapella',
+    124 => 'Euro-House',
+    125 => 'Dance Hall',
+    # ref http://yar.hole.ru/MP3Tech/lamedoc/id3.html
+    126 => 'Goa',
+    127 => 'Drum & Bass',
+    128 => 'Club-House',
+    129 => 'Hardcore',
+    130 => 'Terror',
+    131 => 'Indie',
+    132 => 'BritPop',
+    133 => 'Negerpunk',
+    134 => 'Polsk Punk',
+    135 => 'Beat',
+    136 => 'Christian Gangsta',
+    137 => 'Heavy Metal',
+    138 => 'Black Metal',
+    139 => 'Crossover',
+    140 => 'Contemporary C',
+    141 => 'Christian Rock',
+    142 => 'Merengue',
+    143 => 'Salsa',
+    144 => 'Thrash Metal',
+    145 => 'Anime',
+    146 => 'JPop',
+    147 => 'SynthPop',
+    255 => 'None',
+    # ID3v2 adds some text short forms...
+    CR  => 'Cover',
+    RX  => 'Remix',
+);
+
+# Tags for ID3v1
+%Image::ExifTool::ID3::v1 = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 1 => 'ID3v1', 2 => 'Audio' },
+    PRIORITY => 0,  # let ID3v2 tags replace these if they come later
+    3 => {
+        Name => 'Title',
+        Format => 'string[30]',
+        ValueConv => 'Image::ExifTool::ID3::ConvertID3v1Text($self,$val)',
+    },
+    33 => {
+        Name => 'Artist',
+        Groups => { 2 => 'Author' },
+        Format => 'string[30]',
+        ValueConv => 'Image::ExifTool::ID3::ConvertID3v1Text($self,$val)',
+    },
+    63 => {
+        Name => 'Album',
+        Format => 'string[30]',
+        ValueConv => 'Image::ExifTool::ID3::ConvertID3v1Text($self,$val)',
+    },
+    93 => {
+        Name => 'Year',
+        Groups => { 2 => 'Time' },
+        Format => 'string[4]',
+    },
+    97 => {
+        Name => 'Comment',
+        Format => 'string[30]',
+        ValueConv => 'Image::ExifTool::ID3::ConvertID3v1Text($self,$val)',
+    },
+    125 => { # ID3v1.1 (ref http://en.wikipedia.org/wiki/ID3#Layout)
+        Name => 'Track',
+        Format => 'int8u[2]',
+        Notes => 'v1.1 addition -- last 2 bytes of v1.0 Comment field',
+        RawConv => '($val =~ s/^0 // and $val) ? $val : undef',
+    },
+    127 => {
+        Name => 'Genre',
+        Notes => 'CR and RX are ID3v2 only',
+        Format => 'int8u',
+        PrintConv => \%genre,
+        PrintConvColumns => 3,
+    },
+);
+
+# ID3v1 "Enhanced TAG" information (ref 3)
+%Image::ExifTool::ID3::v1_Enh = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 1 => 'ID3v1_Enh', 2 => 'Audio' },
+    NOTES => 'ID3 version 1 "Enhanced TAG" information (not part of the official spec).',
+    PRIORITY => 0,  # let ID3v2 tags replace these if they come later
+    4 => {
+        Name => 'Title2',
+        Format => 'string[60]',
+        ValueConv => 'Image::ExifTool::ID3::ConvertID3v1Text($self,$val)',
+    },
+    64 => {
+        Name => 'Artist2',
+        Groups => { 2 => 'Author' },
+        Format => 'string[60]',
+        ValueConv => 'Image::ExifTool::ID3::ConvertID3v1Text($self,$val)',
+    },
+    124 => {
+        Name => 'Album2',
+        Format => 'string[60]',
+        ValueConv => 'Image::ExifTool::ID3::ConvertID3v1Text($self,$val)',
+    },
+    184 => {
+        Name => 'Speed',
+        Format => 'int8u',
+        PrintConv => {
+            1 => 'Slow',
+            2 => 'Medium',
+            3 => 'Fast',
+            4 => 'Hardcore',
+        },
+    },
+    185 => {
+        Name => 'Genre',
+        Format => 'string[30]',
+        ValueConv => 'Image::ExifTool::ID3::ConvertID3v1Text($self,$val)',
+    },
+    215 => {
+        Name => 'StartTime',
+        Format => 'string[6]',
+    },
+    221 => {
+        Name => 'EndTime',
+        Format => 'string[6]',
+    },
+);
+
+# Tags for ID2v2.2
+%Image::ExifTool::ID3::v2_2 = (
+    PROCESS_PROC => \&Image::ExifTool::ID3::ProcessID3v2,
+    GROUPS => { 1 => 'ID3v2_2', 2 => 'Audio' },
+    NOTES => q{
+        ExifTool extracts mainly text-based tags from ID3v2 information.  The tags
+        in the tables below are those extracted by ExifTool, and don't represent a
+        complete list of available ID3v2 tags.
+        
+        ID3 version 2.2 tags.  (These are the tags written by iTunes 5.0.)
+    },
+    CNT => 'PlayCounter',
+    COM => 'Comment',
+    IPL => 'InvolvedPeople',
+    PIC => {
+        Name => 'Picture',
+        Groups => { 2 => 'Image' },
+        Binary => 1,
+        Notes => 'the 3 tags below are also extracted from this PIC frame',
+    },
+    'PIC-1' => { Name => 'PictureFormat',      Groups => { 2 => 'Image' } },
+    'PIC-2' => {
+        Name => 'PictureType',
+        Groups => { 2 => 'Image' },
+        PrintConv => \%pictureType,
+        SeparateTable => 1,
+    },
+    'PIC-3' => { Name => 'PictureDescription', Groups => { 2 => 'Image' } },
+  # POP => 'Popularimeter',
+    SLT => {
+        Name => 'SynchronizedLyricText',
+        Binary => 1,
+    },
+    TAL => 'Album',
+    TBP => 'BeatsPerMinute',
+    TCM => 'Composer',
+    TCO =>{
+        Name => 'Genre',
+        Notes => 'uses same lookup table as ID3v1 Genre',
+        PrintConv => 'Image::ExifTool::ID3::PrintGenre($val)',
+    },
+    TCP => 'Compilation', # not part of spec, but used by iTunes
+    TCR => { Name => 'Copyright', Groups => { 2 => 'Author' } },
+    TDA => { Name => 'Date', Groups => { 2 => 'Time' } },
+    TDY => 'PlaylistDelay',
+    TEN => 'EncodedBy',
+    TFT => 'FileType',
+    TIM => { Name => 'Time', Groups => { 2 => 'Time' } },
+    TKE => 'InitialKey',
+    TLA => 'Language',
+    TLE => 'Length',
+    TMT => 'Media',
+    TOA => { Name => 'OriginalArtist', Groups => { 2 => 'Author' } },
+    TOF => 'OriginalFilename',
+    TOL => 'OriginalLyricist',
+    TOR => 'OriginalReleaseYear',
+    TOT => 'OriginalAlbum',
+    TP1 => { Name => 'Artist', Groups => { 2 => 'Author' } },
+    TP2 => 'Band',
+    TP3 => 'Conductor',
+    TP4 => 'InterpretedBy',
+    TPA => 'PartOfSet',
+    TPB => 'Publisher',
+    TRC => 'ISRC', # (international standard recording code)
+    TRD => 'RecordingDates',
+    TRK => 'Track',
+    TSI => 'Size',
+    TSS => 'EncoderSettings',
+    TT1 => 'Grouping',
+    TT2 => 'Title',
+    TT3 => 'Subtitle',
+    TXT => 'Lyricist',
+    TXX => 'UserDefinedText',
+    TYE => { Name => 'Year', Groups => { 2 => 'Time' } },
+    ULT => 'Lyrics',
+    WAF => 'FileURL',
+    WAR => { Name => 'ArtistURL', Groups => { 2 => 'Author' } },
+    WAS => 'SourceURL',
+    WCM => 'CommercialURL',
+    WCP => { Name => 'CopyrightURL', Groups => { 2 => 'Author' } },
+    WPB => 'PublisherURL',
+    WXX => 'UserDefinedURL',
+);
+
+# tags common to ID3v2.3 and ID3v2.4
+my %id3v2_common = (
+  # AENC => 'AudioEncryption', # Owner, preview start, preview length, encr data
+    APIC => {
+        Name => 'Picture',
+        Groups => { 2 => 'Image' },
+        Binary => 1,
+        Notes => 'the 3 tags below are also extracted from this PIC frame',
+    },
+    'APIC-1' => { Name => 'PictureMimeType',    Groups => { 2 => 'Image' } },
+    'APIC-2' => {
+        Name => 'PictureType',
+        Groups => { 2 => 'Image' },
+        PrintConv => \%pictureType,
+        SeparateTable => 1,
+    },
+    'APIC-3' => { Name => 'PictureDescription', Groups => { 2 => 'Image' } },
+    COMM => 'Comment',
+  # COMR => 'Commercial',
+  # ENCR => 'EncryptionMethod',
+  # ETCO => 'EventTimingCodes',
+  # GEOB => 'GeneralEncapsulatedObject',
+  # GRID => 'GroupIdentification',
+  # LINK => 'LinkedInformation',
+    MCDI => { Name => 'MusicCDIdentifier', Binary => 1 },
+  # MLLT => 'MPEGLocationLookupTable',
+  # OWNE => 'Ownership', # enc(1), _price, 00, _date(8), Seller
+    PCNT => 'PlayCounter',
+  # POPM => 'Popularimeter', # _email, 00, rating(1), counter(4-N)
+  # POSS => 'PostSynchronization',
+    PRIV => {
+        Name => 'Private',
+        SubDirectory => { TagTable => 'Image::ExifTool::ID3::Private' },
+    },
+  # RBUF => 'RecommendedBufferSize',
+  # RVRB => 'Reverb',
+    SYLT => {
+        Name => 'SynchronizedLyricText',
+        Binary => 1,
+    },
+  # SYTC => 'SynchronizedTempoCodes',
+    TALB => 'Album',
+    TBPM => 'BeatsPerMinute',
+    TCMP => { Name => 'Compilation', PrintConv => { 0 => 'No', 1 => 'Yes' } }, #PH (iTunes)
+    TCOM => 'Composer',
+    TCON =>{
+        Name => 'Genre',
+        Notes => 'uses same lookup table as ID3v1 Genre',
+        PrintConv => 'Image::ExifTool::ID3::PrintGenre($val)',
+    },
+    TCOP => { Name => 'Copyright', Groups => { 2 => 'Author' } },
+    TDLY => 'PlaylistDelay',
+    TENC => 'EncodedBy',
+    TEXT => 'Lyricist',
+    TFLT => 'FileType',
+    TIT1 => 'Grouping',
+    TIT2 => 'Title',
+    TIT3 => 'Subtitle',
+    TKEY => 'InitialKey',
+    TLAN => 'Language',
+    TLEN => {
+        Name => 'Length',
+        ValueConv => '$val / 1000',
+        PrintConv => '"$val s"',
+    },
+    TMED => 'Media',
+    TOAL => 'OriginalAlbum',
+    TOFN => 'OriginalFilename',
+    TOLY => 'OriginalLyricist',
+    TOPE => { Name => 'OriginalArtist', Groups => { 2 => 'Author' } },
+    TOWN => 'FileOwner',
+    TPE1 => { Name => 'Artist', Groups => { 2 => 'Author' } },
+    TPE2 => 'Band',
+    TPE3 => 'Conductor',
+    TPE4 => 'InterpretedBy',
+    TPOS => 'PartOfSet',
+    TPUB => 'Publisher',
+    TRCK => 'Track',
+    TRSN => 'InternetRadioStationName',
+    TRSO => 'InternetRadioStationOwner',
+    TSRC => 'ISRC', # (international standard recording code)
+    TSSE => 'EncoderSettings',
+    TXXX => 'UserDefinedText',
+  # UFID => 'UniqueFileID',
+    USER => 'TermsOfUse',
+    USLT => 'Lyrics',
+    WCOM => 'CommercialURL',
+    WCOP => 'CopyrightURL',
+    WOAF => 'FileURL',
+    WOAR => { Name => 'ArtistURL', Groups => { 2 => 'Author' } },
+    WOAS => 'SourceURL',
+    WORS => 'InternetRadioStationURL',
+    WPAY => 'PaymentURL',
+    WPUB => 'PublisherURL',
+    WXXX => 'UserDefinedURL',
+);
+
+# Tags for ID3v2.3 (http://www.id3.org/id3v2.3.0)
+%Image::ExifTool::ID3::v2_3 = (
+    PROCESS_PROC => \&Image::ExifTool::ID3::ProcessID3v2,
+    GROUPS => { 1 => 'ID3v2_3', 2 => 'Audio' },
+    NOTES => 'ID3 version 2.3 tags',
+    %id3v2_common,  # include common tags
+  # EQUA => 'Equalization',
+    IPLS => 'InvolvedPeople',
+  # RVAD => 'RelativeVolumeAdjustment',
+    TDAT => { Name => 'Date', Groups => { 2 => 'Time' } },
+    TIME => { Name => 'Time', Groups => { 2 => 'Time' } },
+    TORY => 'OriginalReleaseYear',
+    TRDA => 'RecordingDates',
+    TSIZ => 'Size',
+    TYER => { Name => 'Year', Groups => { 2 => 'Time' } },
+);
+
+# Tags for ID3v2.4 (http://www.id3.org/id3v2.4.0-frames)
+%Image::ExifTool::ID3::v2_4 = (
+    PROCESS_PROC => \&Image::ExifTool::ID3::ProcessID3v2,
+    GROUPS => { 1 => 'ID3v2_4', 2 => 'Audio' },
+    NOTES => 'ID3 version 2.4 tags',
+    %id3v2_common,  # include common tags
+  # EQU2 => 'Equalization',
+  # RVA2 => 'RelativeVolumeAdjustment',
+  # SEEK => 'Seek',
+  # SIGN => 'Signature',
+    TDEN => { Name => 'EncodingTime',       Groups => { 2 => 'Time' }, %dateTimeConv },
+    TDOR => { Name => 'OriginalReleaseTime',Groups => { 2 => 'Time' }, %dateTimeConv },
+    TDRC => { Name => 'RecordingTime',      Groups => { 2 => 'Time' }, %dateTimeConv },
+    TDRL => { Name => 'ReleaseTime',        Groups => { 2 => 'Time' }, %dateTimeConv },
+    TDTG => { Name => 'TaggingTime',        Groups => { 2 => 'Time' }, %dateTimeConv },
+    TIPL => 'InvolvedPeople',
+    TMCL => 'MusicianCredits',
+    TMOO => 'Mood',
+    TPRO => 'ProducedNotice',
+    TSOA => 'AlbumSortOrder',
+    TSOP => 'PerformerSortOrder',
+    TSOT => 'TitleSortOrder',
+    TSST => 'SetSubtitle',
+);
+
+# ID3 PRIV tags (ref PH)
+%Image::ExifTool::ID3::Private = (
+    PROCESS_PROC => \&Image::ExifTool::ID3::ProcessPrivate,
+    GROUPS => { 1 => 'ID3', 2 => 'Audio' },
+    NOTES => 'ID3 private (PRIV) tags.',
+    XMP => {
+        SubDirectory => {
+            DirName => 'XMP',
+            TagTable => 'Image::ExifTool::XMP::Main',
+        },
+    },
+    PeakValue => {
+        ValueConv => 'length($val)==4 ? unpack("V",$val) : \$val',
+    },
+    AverageLevel => {
+        ValueConv => 'length($val)==4 ? unpack("V",$val) : \$val',
+    },
+);
+
+# ID3 Composite tags
+%Image::ExifTool::ID3::Composite = (
+    GROUPS => { 2 => 'Image' },
+    DateTimeOriginal => {
+        Description => 'Date/Time Original',
+        Groups => { 2 => 'Time' },
+        Priority => 0,
+        Desire => {
+            0 => 'ID3:RecordingTime',
+            1 => 'ID3:Year',
+            2 => 'ID3:Date',
+            3 => 'ID3:Time',
+        },
+        ValueConv => q{
+            return $val[0] if $val[0];
+            return undef unless $val[1];
+            return $val[1] unless $val[2] and $val[2] =~ /^(\d{2})(\d{2})$/;
+            $val[1] .= ":$1:$2";
+            return $val[1] unless $val[3] and $val[3] =~ /^(\d{2})(\d{2})$/;
+            return "$val[1] $1:$2";
+        },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+);
+
+# add our composite tags
+Image::ExifTool::AddCompositeTags('Image::ExifTool::ID3');
+
+# can't share tagInfo hashes between two tables, so we must make
+# copies of the necessary hashes
+{
+    my $tag;
+    foreach $tag (keys %id3v2_common) {
+        next unless ref $id3v2_common{$tag} eq 'HASH';
+        my %tagInfo = %{$id3v2_common{$tag}};
+        # must also copy Groups hash if it exists
+        my $groups = $tagInfo{Groups};
+        $tagInfo{Groups} = { %$groups } if $groups;
+        $Image::ExifTool::ID3::v2_4{$tag} = \%tagInfo;
+    }
+}
+
+#------------------------------------------------------------------------------
+# Convert ID3v1 text to exiftool character set
+# Inputs: 0) ExifTool object ref, 1) text string
+# Returns: converted text
+sub ConvertID3v1Text($$)
+{
+    my ($exifTool, $val) = @_;
+    return $exifTool->Decode($val, $exifTool->Options('CharsetID3'));
+}
+
+#------------------------------------------------------------------------------
+# Process ID3 PRIV data
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+sub ProcessPrivate($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my ($tag, $start);
+    if ($$dataPt =~ /^(.*?)\0/) {
+        $tag = $1;
+        $start = length($tag) + 1;
+    } else {
+        $tag = '';
+        $start = 0;
+    }
+    unless ($$tagTablePtr{$tag}) {
+        $tag =~ tr{/ }{_}d; # translate '/' to '_' and remove spaces
+        $tag = 'private' unless $tag =~ /^[-\w]{1,24}$/;
+        unless ($$tagTablePtr{$tag}) {
+            Image::ExifTool::AddTagToTable($tagTablePtr, $tag,
+                { Name => ucfirst($tag), Binary => 1 });
+        }
+    }
+    my $key = $exifTool->HandleTag($tagTablePtr, $tag, undef,
+        Size  => length($$dataPt) - $start,
+        Start => $start,
+        DataPt => $dataPt,
+    );
+    # set group1 name
+    $exifTool->SetGroup($key, $$exifTool{ID3_Ver}) if $key;
+}
+
+#------------------------------------------------------------------------------
+# Print ID3v2 Genre
+# Inputs: TCON or TCO frame data
+# Returns: Content type with decoded genre numbers
+sub PrintGenre($)
+{
+    my $val = shift;
+    # make sure that %genre has an entry for all numbers we are interested in
+    # (genre numbers are in brackets for ID3v2.2 and v2.3)
+    while ($val =~ /\((\d+)\)/g) {
+        $genre{$1} or $genre{$1} = "Unknown ($1)";
+    }
+    # (genre numbers are separated by nulls in ID3v2.4,
+    #  but nulls are converted to '/' by DecodeString())
+    while ($val =~ /(?:^|\/)(\d+)/g) {
+        $genre{$1} or $genre{$1} = "Unknown ($1)";
+    }
+    $val =~ s/\((\d+)\)/\($genre{$1}\)/g;
+    $val =~ s/(^|\/)(\d+)/$1$genre{$2}/g;
+    $val =~ s/^\(([^)]+)\)\1?$/$1/; # clean up by removing brackets and duplicates
+    return $val;
+}
+
+#------------------------------------------------------------------------------
+# Decode ID3 string
+# Inputs: 0) ExifTool object reference
+#         1) string beginning with encoding byte unless specified as argument
+#         2) optional encoding (0=ISO-8859-1, 1=UTF-16 BOM, 2=UTF-16BE, 3=UTF-8)
+# Returns: Decoded string in scalar context, or list of strings in list context
+sub DecodeString($$;$)
+{
+    my ($exifTool, $val, $enc) = @_;
+    return '' unless length $val;
+    unless (defined $enc) {
+        $enc = unpack('C', $val);
+        $val = substr($val, 1); # remove encoding byte
+    }
+    my @vals;
+    if ($enc == 0 or $enc == 3) { # ISO 8859-1 or UTF-8
+        $val =~ s/\0+$//;   # remove any null padding
+        # (must split before converting because conversion routines truncate at null)
+        @vals = split "\0", $val;
+        foreach $val (@vals) {
+            $val = $exifTool->Decode($val, $enc ? 'UTF8' : 'Latin');
+        }
+    } elsif ($enc == 1 or $enc == 2) {  # UTF-16 with BOM, or UTF-16BE
+        my $bom = "\xfe\xff";
+        my %order = ( "\xfe\xff" => 'MM', "\xff\xfe", => 'II' );
+        for (;;) {
+            my $v;
+            # split string at null terminators on word boundaries
+            if ($val =~ s/((..)*?)\0\0//) {
+                $v = $1;
+            } else {
+                last unless length $val > 1;
+                $v = $val;
+                $val = '';
+            }
+            $bom = $1 if $v =~ s/^(\xfe\xff|\xff\xfe)//;
+            push @vals, $exifTool->Decode($v, 'UCS2', $order{$bom});
+        }
+    } else {
+        $val =~ s/\0+$//;
+        return "<Unknown encoding $enc> $val";
+    }
+    return @vals if wantarray;
+    return join('/',@vals);
+}
+
+#------------------------------------------------------------------------------
+# Convert sync-safe integer to a number we can use
+# Inputs: 0) int32u sync-safe value
+# Returns: actual number or undef on invalid value
+sub UnSyncSafe($)
+{
+    my $val = shift;
+    return undef if $val & 0x80808080;
+    return ($val & 0x0000007f) |
+          (($val & 0x00007f00) >> 1) |
+          (($val & 0x007f0000) >> 2) |
+          (($val & 0x7f000000) >> 3);
+}
+
+#------------------------------------------------------------------------------
+# Process ID3v2 information
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+sub ProcessID3v2($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt  = $$dirInfo{DataPt};
+    my $offset  = $$dirInfo{DirStart};
+    my $size    = $$dirInfo{DirLen};
+    my $vers    = $$dirInfo{Version};
+    my $verbose = $exifTool->Options('Verbose');
+    my $len;    # frame data length
+
+    $verbose and $exifTool->VerboseDir($tagTablePtr->{GROUPS}->{1}, 0, $size);
+
+    for (;;$offset+=$len) {
+        my ($id, $flags, $hi);
+        if ($vers < 0x0300) {
+            # version 2.2 frame header is 6 bytes
+            last if $offset + 6 > $size;
+            ($id, $hi, $len) = unpack("x${offset}a3Cn",$$dataPt);
+            last if $id eq "\0\0\0";
+            $len += $hi << 16;
+            $offset += 6;
+        } else {
+            # version 2.3/2.4 frame header is 10 bytes
+            last if $offset + 10 > $size;
+            ($id, $len, $flags) = unpack("x${offset}a4Nn",$$dataPt);
+            last if $id eq "\0\0\0\0";
+            $offset += 10;
+            # length is a "sync-safe" integer by the ID3v2.4 specification, but
+            # reportedly some versions of iTunes write this as a normal integer
+            # (ref http://www.id3.org/iTunes)
+            while ($vers >= 0x0400 and $len > 0x7f and not $len & 0x80808080) {
+                my $oldLen = $len;
+                $len =  UnSyncSafe($len);
+                if (not defined $len or $offset + $len + 10 > $size) {
+                    $exifTool->Warn('Invalid ID3 frame size');
+                    last;
+                }
+                # check next ID to see if it makes sense
+                my $nextID = substr($$dataPt, $offset + $len, 4);
+                last if $$tagTablePtr{$nextID};
+                # try again with the incorrect length word (patch for iTunes bug)
+                last if $offset + $oldLen + 10 > $size;
+                $nextID = substr($$dataPt, $offset + $len, 4);
+                $len = $oldLen if $$tagTablePtr{$nextID};
+                last; # yes, "while" was really a "goto" in disguise
+            }
+        }
+        last if $offset + $len > $size;
+        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $id);
+        unless ($tagInfo) {
+            next unless $verbose or $exifTool->Options('Unknown');
+            $id =~ tr/-A-Za-z0-9_//dc;
+            $id = 'unknown' unless length $id;
+            unless ($$tagTablePtr{$id}) {
+                $tagInfo = { Name => "ID3_$id", Binary => 1 };
+                Image::ExifTool::AddTagToTable($tagTablePtr, $id, $tagInfo);
+            }
+        }
+        # decode v2.3 and v2.4 flags
+        my %flags;
+        if ($flags) {
+            if ($vers < 0x0400) {
+                # version 2.3 flags
+                $flags & 0x80 and $flags{Compress} = 1;
+                $flags & 0x40 and $flags{Encrypt}  = 1;
+                $flags & 0x20 and $flags{GroupID}  = 1;
+            } else {
+                # version 2.4 flags
+                $flags & 0x40 and $flags{GroupID}  = 1;
+                $flags & 0x08 and $flags{Compress} = 1;
+                $flags & 0x04 and $flags{Encrypt}  = 1;
+                $flags & 0x02 and $flags{Unsync}   = 1;
+                $flags & 0x01 and $flags{DataLen}  = 1;
+            }
+        }
+        if ($flags{Encrypt}) {
+            $exifTool->WarnOnce('Encrypted frames currently not supported');
+            next;
+        }
+        # extract the value
+        my $val = substr($$dataPt, $offset, $len);
+
+        # reverse the unsynchronization
+        $val =~ s/\xff\x00/\xff/g if $flags{Unsync};
+
+        # read grouping identity
+        if ($flags{GroupID}) {
+            length($val) >= 1 or $exifTool->Warn("Short $id frame"), next;
+            $val = substr($val, 1); # (ignore it)
+        }
+        # read data length
+        my $dataLen;
+        if ($flags{DataLen} or $flags{Compress}) {
+            length($val) >= 4 or $exifTool->Warn("Short $id frame"), next;
+            $dataLen = unpack('N', $val);   # save the data length word
+            $val = substr($val, 4);
+        }
+        # uncompress data
+        if ($flags{Compress}) {
+            if (eval 'require Compress::Zlib') {
+                my $inflate = Compress::Zlib::inflateInit();
+                my ($buff, $stat);
+                $inflate and ($buff, $stat) = $inflate->inflate($val);
+                if ($inflate and $stat == Compress::Zlib::Z_STREAM_END()) {
+                    $val = $buff;
+                } else {
+                    $exifTool->Warn("Error inflating $id frame");
+                    next;
+                }
+            } else {
+                $exifTool->WarnOnce('Install Compress::Zlib to decode compressed frames');
+                next;
+            }
+        }
+        # validate data length
+        if (defined $dataLen) {
+            $dataLen = UnSyncSafe($dataLen);
+            defined $dataLen or $exifTool->Warn("Invalid length for $id frame"), next;
+            $dataLen == length($val) or $exifTool->Warn("Wrong length for $id frame"), next;
+        }
+        $verbose and $exifTool->VerboseInfo($id, $tagInfo,
+            Table   => $tagTablePtr,
+            Value   => $val,
+            DataPt  => $dataPt,
+            DataPos => $$dirInfo{DataPos},
+            Size    => $len,
+            Start   => $offset,
+        );
+        next unless $tagInfo;
+#
+# decode data in this frame
+#
+        my $lang;
+        my $valLen = length($val);  # actual value length (after decompression, etc)
+        if ($id =~ /^(TXX|TXXX)$/) {
+            # two encoded strings separated by a null
+            my @vals = DecodeString($exifTool, $val);
+            foreach (0..1) { $vals[$_] = '' unless defined $vals[$_]; }
+            ($val = "($vals[0]) $vals[1]") =~ s/^\(\) //;
+        } elsif ($id =~ /^T/ or $id =~ /^(IPL|IPLS)$/) {
+            $val = DecodeString($exifTool, $val);
+        } elsif ($id =~ /^(WXX|WXXX)$/) {
+            # one encoded string and one Latin string separated by a null
+            my $enc = unpack('C', $val);
+            my $url;
+            if ($enc == 1 or $enc == 2) {
+                ($val, $url) = ($val =~ /^(.(?:..)*?)\0\0(.*)/);
+            } else {
+                ($val, $url) = ($val =~ /^(..*?)\0(.*)/);
+            }
+            unless (defined $val and defined $url) {
+                $exifTool->Warn("Invalid $id frame value");
+                next;
+            }
+            $val = DecodeString($exifTool, $val);
+            $url =~ s/\0.*//;
+            $val = length($val) ? "($val) $url" : $url;
+        } elsif ($id =~ /^W/) {
+            $val =~ s/\0.*//;   # truncate at null
+        } elsif ($id =~ /^(COM|COMM|ULT|USLT)$/) {
+            $valLen > 4 or $exifTool->Warn("Short $id frame"), next;
+            $lang = substr($val,1,3);
+            my @vals = DecodeString($exifTool, substr($val,4), Get8u(\$val,0));
+            foreach (0..1) { $vals[$_] = '' unless defined $vals[$_]; }
+            $val = length($vals[0]) ? "($vals[0]) $vals[1]" : $vals[1];
+        } elsif ($id eq 'USER') {
+            $valLen > 4 or $exifTool->Warn('Short USER frame'), next;
+            $lang = substr($val,1,3);
+            $val = DecodeString($exifTool, substr($val,4), Get8u(\$val,0));
+        } elsif ($id =~ /^(CNT|PCNT)$/) {
+            $valLen >= 4 or $exifTool->Warn("Short $id frame"), next;
+            my $cnt = unpack('N', $val);
+            my $i;
+            for ($i=4; $i<$valLen; ++$i) {
+                $cnt = $cnt * 256 + unpack("x${i}C", $val);
+            }
+            $val = $cnt;
+        } elsif ($id =~ /^(PIC|APIC)$/) {
+            $valLen >= 4 or $exifTool->Warn("Short $id frame"), next;
+            my ($hdr, $attr);
+            my $enc = unpack('C', $val);
+            if ($enc == 1 or $enc == 2) {
+                $hdr = ($id eq 'PIC') ? ".(...)(.)((?:..)*?)\0\0" : ".(.*?)\0(.)((?:..)*?)\0\0";
+            } else {
+                $hdr = ($id eq 'PIC') ? ".(...)(.)(.*?)\0"        : ".(.*?)\0(.)(.*?)\0";
+            }
+            # remove header (encoding, image format or MIME type, picture type, description)
+            $val =~ s/^$hdr//s or $exifTool->Warn("Invalid $id frame"), next;
+            my @attrs = ($1, ord($2), DecodeString($exifTool, $3, $enc));
+            my $i = 1;
+            foreach $attr (@attrs) {
+                # must store descriptions even if they are empty to maintain
+                # sync between copy numbers when multiple images
+                $exifTool->HandleTag($tagTablePtr, "$id-$i", $attr);
+                ++$i;
+            }
+        } elsif ($id eq 'PRIV') {
+            # save version number to set group1 name for tag later
+            $exifTool->{ID3_Ver} = $tagTablePtr->{GROUPS}->{1};
+            $exifTool->HandleTag($tagTablePtr, $id, $val);
+            next;
+        } elsif (not $$tagInfo{Binary}) {
+            $exifTool->Warn("Don't know how to handle $id frame");
+            next;
+        }
+        if ($lang and $lang =~ /^[a-z]{3}$/i and $lang ne 'eng') {
+            $tagInfo = Image::ExifTool::GetLangInfo($tagInfo, lc $lang);
+        }
+        $exifTool->FoundTag($tagInfo, $val);
+    }
+}
+
+#------------------------------------------------------------------------------
+# Extract ID3 information from an audio file
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 on success, 0 if this file didn't contain ID3 information
+# - also processes audio data if any ID3 information was found
+# - sets ExifTool DoneID3 to 1 when called, or to 2 if an ID3v1 trailer exists
+sub ProcessID3($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+
+    return 0 if $exifTool->{DoneID3};  # avoid infinite recursion
+    $exifTool->{DoneID3} = 1;
+
+    # allow this to be called with either RAF or DataPt
+    my $raf = $$dirInfo{RAF} || new File::RandomAccess($$dirInfo{DataPt});
+    my ($buff, %id3Header, %id3Trailer, $hBuff, $tBuff, $eBuff, $tagTablePtr);
+    my $rtnVal = 0;
+    my $hdrEnd = 0;
+    my $id3Len = 0;
+
+    # read first 3 bytes of file
+    $raf->Seek(0, 0);
+    return 0 unless $raf->Read($buff, 3) == 3;
+#
+# identify ID3v2 header
+#
+    while ($buff =~ /^ID3/) {
+        $rtnVal = 1;
+        $raf->Read($hBuff, 7) == 7 or $exifTool->Warn('Short ID3 header'), last;
+        my ($vers, $flags, $size) = unpack('nCN', $hBuff);
+        $size = UnSyncSafe($size);
+        defined $size or $exifTool->Warn('Invalid ID3 header'), last;
+        my $verStr = sprintf("2.%d.%d", $vers >> 8, $vers & 0xff);
+        if ($vers >= 0x0500) {
+            $exifTool->Warn("Unsupported ID3 version: $verStr");
+            last;
+        }
+        unless ($raf->Read($hBuff, $size) == $size) {
+            $exifTool->Warn('Truncated ID3 data');
+            last;
+        }
+        # this flag only indicates use of unsynchronized frames in ID3v2.4
+        if ($flags & 0x80 and $vers < 0x0400) {
+            # reverse the unsynchronization
+            $hBuff =~ s/\xff\x00/\xff/g;
+        }
+        my $pos = 10;
+        if ($flags & 0x40) {
+            # skip the extended header
+            $size >= 4 or $exifTool->Warn('Bad ID3 extended header'), last;
+            my $len = unpack('N', $hBuff);
+            if ($len > length($hBuff) - 4) {
+                $exifTool->Warn('Truncated ID3 extended header');
+                last;
+            }
+            $hBuff = substr($hBuff, $len + 4);
+            $pos += $len + 4;
+        }
+        if ($flags & 0x10) {
+            # ignore v2.4 footer (10 bytes long)
+            $raf->Seek(10, 1);
+        }
+        %id3Header = (
+            DataPt   => \$hBuff,
+            DataPos  => $pos,
+            DirStart => 0,
+            DirLen   => length($hBuff),
+            Version  => $vers,
+            DirName  => "ID3v$verStr",
+        );
+        $id3Len += length($hBuff) + 10;
+        if ($vers >= 0x0400) {
+            $tagTablePtr = GetTagTable('Image::ExifTool::ID3::v2_4');
+        } elsif ($vers >= 0x0300) {
+            $tagTablePtr = GetTagTable('Image::ExifTool::ID3::v2_3');
+        } else {
+            $tagTablePtr = GetTagTable('Image::ExifTool::ID3::v2_2');
+        }
+        $hdrEnd = $raf->Tell();
+        last;
+    }
+#
+# read ID3v1 trailer if it exists
+#
+    if ($raf->Seek(-128, 2) and $raf->Read($tBuff, 128) == 128 and $tBuff =~ /^TAG/) {
+        $exifTool->{DoneID3} = 2;  # set to 2 as flag that trailer exists
+        %id3Trailer = (
+            DataPt   => \$tBuff,
+            DataPos  => $raf->Tell() - 128,
+            DirStart => 0,
+            DirLen   => length($tBuff),
+        );
+        $id3Len += length($tBuff);
+        $rtnVal = 1;
+        # load 'Enhanced TAG' information if available
+        if ($raf->Seek(-355, 2) and $raf->Read($eBuff, 227) == 227 and $eBuff =~ /^TAG+/) {
+            $id3Trailer{EnhancedTAG} = \$eBuff;
+        }
+    }
+#
+# process the the information
+#
+    if ($rtnVal) {
+        # first process audio data if it exists
+        if ($$dirInfo{RAF}) {
+            my $oldType = $exifTool->{FILE_TYPE};   # save file type
+            # check current file type first
+            my @types = grep /^$oldType$/, @audioFormats;
+            push @types, grep(!/^$oldType$/, @audioFormats);
+            my $type;
+            foreach $type (@types) {
+                # seek to end of ID3 header
+                $raf->Seek($hdrEnd, 0);
+                # set type for this file if we are successful
+                $exifTool->{FILE_TYPE} = $type;
+                my $module = $audioModule{$type} || $type;
+                require "Image/ExifTool/$module.pm" or next;
+                my $func = "Image::ExifTool::${module}::Process$type";
+                # process the file
+                no strict 'refs';
+                &$func($exifTool, $dirInfo) and last;
+                use strict 'refs';
+            }
+            $exifTool->{FILE_TYPE} = $oldType;      # restore original file type
+        }
+        # set file type to MP3 if we didn't find audio data
+        $exifTool->SetFileType('MP3');
+        # record the size if the ID3 metadata
+        $exifTool->FoundTag('ID3Size', $id3Len);
+        # process ID3v2 header if it exists
+        if (%id3Header) {
+            $exifTool->VPrint(0, "$id3Header{DirName}:\n");
+            $exifTool->ProcessDirectory(\%id3Header, $tagTablePtr);
+        }
+        # process ID3v1 trailer if it exists
+        if (%id3Trailer) {
+            $exifTool->VPrint(0, "ID3v1:\n");
+            SetByteOrder('MM');
+            $tagTablePtr = GetTagTable('Image::ExifTool::ID3::v1');
+            $exifTool->ProcessDirectory(\%id3Trailer, $tagTablePtr);
+            # process "Enhanced TAG" information if available
+            if ($id3Trailer{EnhancedTAG}) {
+                $exifTool->VPrint(0, "ID3v1 Enhanced TAG:\n");
+                $tagTablePtr = GetTagTable('Image::ExifTool::ID3::v1_Enh');
+                $id3Trailer{DataPt} = $id3Trailer{EnhancedTAG};
+                $id3Trailer{DataPos} -= 227; # (227 = length of Enhanced TAG block)
+                $id3Trailer{DirLen} = 227;
+                $exifTool->ProcessDirectory(\%id3Trailer, $tagTablePtr);
+            }
+        }
+    }
+    # return file pointer to start of file to read audio data if necessary
+    $raf->Seek(0, 0);
+    return $rtnVal;
+}
+
+#------------------------------------------------------------------------------
+# Extract ID3 information from an MP3 audio file
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 on success, 0 if this wasn't a valid MP3 file
+sub ProcessMP3($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+
+    # must first check for leading/trailing ID3 information
+    unless ($exifTool->{DoneID3}) {
+        ProcessID3($exifTool, $dirInfo) and return 1;
+    }
+    my $raf = $$dirInfo{RAF};
+    my $rtnVal = 0;
+    my $buff;
+#
+# extract information from first audio/video frame headers
+# (if found in the first $scanLen bytes)
+#
+    # scan further into a file that should be an MP3
+    my $scanLen = ($$exifTool{FILE_EXT} and $$exifTool{FILE_EXT} eq 'MP3') ? 8192 : 256;
+    if ($raf->Read($buff, $scanLen)) {
+        require Image::ExifTool::MPEG;
+        if ($buff =~ /\0\0\x01(\xb3|\xc0)/) {
+            # look for A/V headers in first 64kB
+            my $buf2;
+            $raf->Read($buf2, 0x10000 - $scanLen) and $buff .= $buf2;
+            $rtnVal = 1 if Image::ExifTool::MPEG::ParseMPEGAudioVideo($exifTool, \$buff);
+        } else {
+            # look for audio frame sync in first $scanLen bytes
+            $rtnVal = 1 if Image::ExifTool::MPEG::ParseMPEGAudio($exifTool, \$buff);
+        }
+    }
+    return $rtnVal;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::ID3 - Read ID3 meta information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to extract ID3
+information from audio files.  ID3 information is found in MP3 and various
+other types of audio files.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.id3.org/>
+
+=item L<http://www.mp3-tech.org/>
+
+=item L<http://www.fortunecity.com/underworld/sonic/3/id3tag.html>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/ID3 Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/IPTC.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/IPTC.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/IPTC.pm	(revision 24799)
@@ -0,0 +1,1210 @@
+#------------------------------------------------------------------------------
+# File:         IPTC.pm
+#
+# Description:  Read IPTC meta information
+#
+# Revisions:    Jan. 08/2003 - P. Harvey Created
+#               Feb. 05/2004 - P. Harvey Added support for records other than 2
+#
+# References:   1) http://www.iptc.org/IIM/
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::IPTC;
+
+use strict;
+use vars qw($VERSION $AUTOLOAD %iptcCharset);
+
+$VERSION = '1.42';
+
+%iptcCharset = (
+    "\x1b%G"  => 'UTF8',
+   # don't translate these (at least until we handle ISO 2022 shift codes)
+   # because the sets are only designated and not invoked
+   # "\x1b,A"  => 'Latin',  # G0 = ISO 8859-1 (similar to Latin1, but codes 0x80-0x9f are missing)
+   # "\x1b-A"  => 'Latin',  # G1     "
+   # "\x1b.A"  => 'Latin',  # G2
+   # "\x1b/A"  => 'Latin',  # G3
+);
+
+sub ProcessIPTC($$$);
+sub WriteIPTC($$$);
+sub CheckIPTC($$$);
+sub PrintCodedCharset($);
+sub PrintInvCodedCharset($);
+
+my %fileFormat = (
+    0 => 'No ObjectData',
+    1 => 'IPTC-NAA Digital Newsphoto Parameter Record',
+    2 => 'IPTC7901 Recommended Message Format',
+    3 => 'Tagged Image File Format (Adobe/Aldus Image data)',
+    4 => 'Illustrator (Adobe Graphics data)',
+    5 => 'AppleSingle (Apple Computer Inc)',
+    6 => 'NAA 89-3 (ANPA 1312)',
+    7 => 'MacBinary II',
+    8 => 'IPTC Unstructured Character Oriented File Format (UCOFF)',
+    9 => 'United Press International ANPA 1312 variant',
+    10 => 'United Press International Down-Load Message',
+    11 => 'JPEG File Interchange (JFIF)',
+    12 => 'Photo-CD Image-Pac (Eastman Kodak)',
+    13 => 'Bit Mapped Graphics File [.BMP] (Microsoft)',
+    14 => 'Digital Audio File [.WAV] (Microsoft & Creative Labs)',
+    15 => 'Audio plus Moving Video [.AVI] (Microsoft)',
+    16 => 'PC DOS/Windows Executable Files [.COM][.EXE]',
+    17 => 'Compressed Binary File [.ZIP] (PKWare Inc)',
+    18 => 'Audio Interchange File Format AIFF (Apple Computer Inc)',
+    19 => 'RIFF Wave (Microsoft Corporation)',
+    20 => 'Freehand (Macromedia/Aldus)',
+    21 => 'Hypertext Markup Language [.HTML] (The Internet Society)',
+    22 => 'MPEG 2 Audio Layer 2 (Musicom), ISO/IEC',
+    23 => 'MPEG 2 Audio Layer 3, ISO/IEC',
+    24 => 'Portable Document File [.PDF] Adobe',
+    25 => 'News Industry Text Format (NITF)',
+    26 => 'Tape Archive [.TAR]',
+    27 => 'Tidningarnas Telegrambyra NITF version (TTNITF DTD)',
+    28 => 'Ritzaus Bureau NITF version (RBNITF DTD)',
+    29 => 'Corel Draw [.CDR]',
+);
+
+# main IPTC tag table
+# Note: ALL entries in main IPTC table (except PROCESS_PROC) must be SubDirectory
+# entries, each specifying a TagTable.
+%Image::ExifTool::IPTC::Main = (
+    GROUPS => { 2 => 'Image' },
+    PROCESS_PROC => \&ProcessIPTC,
+    WRITE_PROC => \&WriteIPTC,
+    1 => {
+        Name => 'IPTCEnvelope',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::IPTC::EnvelopeRecord',
+        },
+    },
+    2 => {
+        Name => 'IPTCApplication',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::IPTC::ApplicationRecord',
+        },
+    },
+    3 => {
+        Name => 'IPTCNewsPhoto',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::IPTC::NewsPhoto',
+        },
+    },
+    7 => {
+        Name => 'IPTCPreObjectData',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::IPTC::PreObjectData',
+        },
+    },
+    8 => {
+        Name => 'IPTCObjectData',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::IPTC::ObjectData',
+        },
+    },
+    9 => {
+        Name => 'IPTCPostObjectData',
+        Groups => { 1 => 'IPTC#' }, #(just so this shows up in group list)
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::IPTC::PostObjectData',
+        },
+    },
+    240 => {
+        Name => 'IPTCFotoStation',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::IPTC::FotoStation',
+        },
+    },
+);
+
+# Record 1 -- EnvelopeRecord
+%Image::ExifTool::IPTC::EnvelopeRecord = (
+    GROUPS => { 2 => 'Other' },
+    WRITE_PROC => \&WriteIPTC,
+    CHECK_PROC => \&CheckIPTC,
+    WRITABLE => 1,
+    0 => {
+        Name => 'EnvelopeRecordVersion',
+        Format => 'int16u',
+        Mandatory => 1,
+    },
+    5 => {
+        Name => 'Destination',
+        Flags => 'List',
+        Groups => { 2 => 'Location' },
+        Format => 'string[0,1024]',
+    },
+    20 => {
+        Name => 'FileFormat',
+        Groups => { 2 => 'Image' },
+        Format => 'int16u',
+        PrintConv => \%fileFormat,
+    },
+    22 => {
+        Name => 'FileVersion',
+        Groups => { 2 => 'Image' },
+        Format => 'int16u',
+    },
+    30 => {
+        Name => 'ServiceIdentifier',
+        Format => 'string[0,10]',
+    },
+    40 => {
+        Name => 'EnvelopeNumber',
+        Format => 'digits[8]',
+    },
+    50 => {
+        Name => 'ProductID',
+        Flags => 'List',
+        Format => 'string[0,32]',
+    },
+    60 => {
+        Name => 'EnvelopePriority',
+        Format => 'digits[1]',
+        PrintConv => {
+            0 => '0 (reserved)',
+            1 => '1 (most urgent)',
+            2 => 2,
+            3 => 3,
+            4 => 4,
+            5 => '5 (normal urgency)',
+            6 => 6,
+            7 => 7,
+            8 => '8 (least urgent)',
+            9 => '9 (user-defined priority)',
+        },
+    },
+    70 => {
+        Name => 'DateSent',
+        Groups => { 2 => 'Time' },
+        Format => 'digits[8]',
+        Shift => 'Time',
+        ValueConv => 'Image::ExifTool::Exif::ExifDate($val)',
+        ValueConvInv => 'Image::ExifTool::IPTC::IptcDate($val)',
+    },
+    80 => {
+        Name => 'TimeSent',
+        Groups => { 2 => 'Time' },
+        Format => 'string[11]',
+        Shift => 'Time',
+        ValueConv => 'Image::ExifTool::Exif::ExifTime($val)',
+        ValueConvInv => 'Image::ExifTool::IPTC::IptcTime($val)',
+    },
+    90 => {
+        Name => 'CodedCharacterSet',
+        Notes => q{
+            values are entered in the form "ESC X Y[, ...]".  The escape sequence for
+            UTF-8 character coding is "ESC % G", but this is displayed as "UTF8" for
+            convenience.  Either string may be used when writing.  The value of this tag
+            affects the decoding of string values in the Application and NewsPhoto
+            records.  This tag is marked as "unsafe" to prevent it from being copied by
+            default in a group operation because existing tags in the destination image
+            may use a different encoding.  When creating a new IPTC record from scratch,
+            it is suggested that this be set to "UTF8" if special characters are a
+            possibility
+        },
+        Protected => 1,
+        Format => 'string[0,32]',
+        # convert ISO 2022 escape sequences to a more readable format
+        PrintConv => \&PrintCodedCharset,
+        PrintConvInv => \&PrintInvCodedCharset,
+    },
+    100 => {
+        Name => 'UniqueObjectName',
+        Format => 'string[14,80]',
+    },
+    120 => {
+        Name => 'ARMIdentifier',
+        Format => 'int16u',
+    },
+    122 => {
+        Name => 'ARMVersion',
+        Format => 'int16u',
+    },
+);
+
+# Record 2 -- ApplicationRecord
+%Image::ExifTool::IPTC::ApplicationRecord = (
+    GROUPS => { 2 => 'Other' },
+    WRITE_PROC => \&WriteIPTC,
+    CHECK_PROC => \&CheckIPTC,
+    WRITABLE => 1,
+    0 => {
+        Name => 'ApplicationRecordVersion',
+        Format => 'int16u',
+        Mandatory => 1,
+    },
+    3 => {
+        Name => 'ObjectTypeReference',
+        Format => 'string[3,67]',
+    },
+    4 => {
+        Name => 'ObjectAttributeReference',
+        Flags => 'List',
+        Format => 'string[4,68]',
+    },
+    5 => {
+        Name => 'ObjectName',
+        Format => 'string[0,64]',
+    },
+    7 => {
+        Name => 'EditStatus',
+        Format => 'string[0,64]',
+    },
+    8 => {
+        Name => 'EditorialUpdate',
+        Format => 'digits[2]',
+        PrintConv => {
+            '01' => 'Additional language',
+        },
+    },
+    10 => {
+        Name => 'Urgency',
+        Format => 'digits[1]',
+        PrintConv => {
+            0 => '0 (reserved)',
+            1 => '1 (most urgent)',
+            2 => 2,
+            3 => 3,
+            4 => 4,
+            5 => '5 (normal urgency)',
+            6 => 6,
+            7 => 7,
+            8 => '8 (least urgent)',
+            9 => '9 (user-defined priority)',
+        },
+    },
+    12 => {
+        Name => 'SubjectReference',
+        Flags => 'List',
+        Format => 'string[13,236]',
+    },
+    15 => {
+        Name => 'Category',
+        Format => 'string[0,3]',
+    },
+    20 => {
+        Name => 'SupplementalCategories',
+        Flags => 'List',
+        Format => 'string[0,32]',
+    },
+    22 => {
+        Name => 'FixtureIdentifier',
+        Format => 'string[0,32]',
+    },
+    25 => {
+        Name => 'Keywords',
+        Flags => 'List',
+        Format => 'string[0,64]',
+    },
+    26 => {
+        Name => 'ContentLocationCode',
+        Flags => 'List',
+        Groups => { 2 => 'Location' },
+        Format => 'string[3]',
+    },
+    27 => {
+        Name => 'ContentLocationName',
+        Flags => 'List',
+        Groups => { 2 => 'Location' },
+        Format => 'string[0,64]',
+    },
+    30 => {
+        Name => 'ReleaseDate',
+        Groups => { 2 => 'Time' },
+        Format => 'digits[8]',
+        Shift => 'Time',
+        ValueConv => 'Image::ExifTool::Exif::ExifDate($val)',
+        ValueConvInv => 'Image::ExifTool::IPTC::IptcDate($val)',
+    },
+    35 => {
+        Name => 'ReleaseTime',
+        Groups => { 2 => 'Time' },
+        Format => 'string[11]',
+        Shift => 'Time',
+        ValueConv => 'Image::ExifTool::Exif::ExifTime($val)',
+        ValueConvInv => 'Image::ExifTool::IPTC::IptcTime($val)',
+    },
+    37 => {
+        Name => 'ExpirationDate',
+        Groups => { 2 => 'Time' },
+        Format => 'digits[8]',
+        Shift => 'Time',
+        ValueConv => 'Image::ExifTool::Exif::ExifDate($val)',
+        ValueConvInv => 'Image::ExifTool::IPTC::IptcDate($val)',
+    },
+    38 => {
+        Name => 'ExpirationTime',
+        Groups => { 2 => 'Time' },
+        Format => 'string[11]',
+        Shift => 'Time',
+        ValueConv => 'Image::ExifTool::Exif::ExifTime($val)',
+        ValueConvInv => 'Image::ExifTool::IPTC::IptcTime($val)',
+    },
+    40 => {
+        Name => 'SpecialInstructions',
+        Format => 'string[0,256]',
+    },
+    42 => {
+        Name => 'ActionAdvised',
+        Format => 'digits[2]',
+        PrintConv => {
+            '' => '',
+            '01' => 'Object Kill',
+            '02' => 'Object Replace',
+            '03' => 'Ojbect Append',
+            '04' => 'Object Reference',
+        },
+    },
+    45 => {
+        Name => 'ReferenceService',
+        Flags => 'List',
+        Format => 'string[0,10]',
+    },
+    47 => {
+        Name => 'ReferenceDate',
+        Groups => { 2 => 'Time' },
+        Flags => 'List',
+        Format => 'digits[8]',
+        Shift => 'Time',
+        ValueConv => 'Image::ExifTool::Exif::ExifDate($val)',
+        ValueConvInv => 'Image::ExifTool::IPTC::IptcDate($val)',
+    },
+    50 => {
+        Name => 'ReferenceNumber',
+        Flags => 'List',
+        Format => 'digits[8]',
+    },
+    55 => {
+        Name => 'DateCreated',
+        Groups => { 2 => 'Time' },
+        Format => 'digits[8]',
+        Shift => 'Time',
+        ValueConv => 'Image::ExifTool::Exif::ExifDate($val)',
+        ValueConvInv => 'Image::ExifTool::IPTC::IptcDate($val)',
+    },
+    60 => {
+        Name => 'TimeCreated',
+        Groups => { 2 => 'Time' },
+        Format => 'string[11]',
+        Shift => 'Time',
+        ValueConv => 'Image::ExifTool::Exif::ExifTime($val)',
+        ValueConvInv => 'Image::ExifTool::IPTC::IptcTime($val)',
+    },
+    62 => {
+        Name => 'DigitalCreationDate',
+        Groups => { 2 => 'Time' },
+        Format => 'digits[8]',
+        Shift => 'Time',
+        ValueConv => 'Image::ExifTool::Exif::ExifDate($val)',
+        ValueConvInv => 'Image::ExifTool::IPTC::IptcDate($val)',
+    },
+    63 => {
+        Name => 'DigitalCreationTime',
+        Groups => { 2 => 'Time' },
+        Format => 'string[11]',
+        Shift => 'Time',
+        ValueConv => 'Image::ExifTool::Exif::ExifTime($val)',
+        ValueConvInv => 'Image::ExifTool::IPTC::IptcTime($val)',
+    },
+    65 => {
+        Name => 'OriginatingProgram',
+        Format => 'string[0,32]',
+    },
+    70 => {
+        Name => 'ProgramVersion',
+        Format => 'string[0,10]',
+    },
+    75 => {
+        Name => 'ObjectCycle',
+        Format => 'string[1]',
+        PrintConv => {
+            'a' => 'Morning',
+            'p' => 'Evening',
+            'b' => 'Both Morning and Evening',
+        },
+    },
+    80 => {
+        Name => 'By-line',
+        Flags => 'List',
+        Format => 'string[0,32]',
+        Groups => { 2 => 'Author' },
+    },
+    85 => {
+        Name => 'By-lineTitle',
+        Flags => 'List',
+        Format => 'string[0,32]',
+        Groups => { 2 => 'Author' },
+    },
+    90 => {
+        Name => 'City',
+        Format => 'string[0,32]',
+        Groups => { 2 => 'Location' },
+    },
+    92 => {
+        Name => 'Sub-location',
+        Format => 'string[0,32]',
+        Groups => { 2 => 'Location' },
+    },
+    95 => {
+        Name => 'Province-State',
+        Format => 'string[0,32]',
+        Groups => { 2 => 'Location' },
+    },
+    100 => {
+        Name => 'Country-PrimaryLocationCode',
+        Format => 'string[3]',
+        Groups => { 2 => 'Location' },
+    },
+    101 => {
+        Name => 'Country-PrimaryLocationName',
+        Format => 'string[0,64]',
+        Groups => { 2 => 'Location' },
+    },
+    103 => {
+        Name => 'OriginalTransmissionReference',
+        Format => 'string[0,32]',
+    },
+    105 => {
+        Name => 'Headline',
+        Format => 'string[0,256]',
+    },
+    110 => {
+        Name => 'Credit',
+        Groups => { 2 => 'Author' },
+        Format => 'string[0,32]',
+    },
+    115 => {
+        Name => 'Source',
+        Groups => { 2 => 'Author' },
+        Format => 'string[0,32]',
+    },
+    116 => {
+        Name => 'CopyrightNotice',
+        Groups => { 2 => 'Author' },
+        Format => 'string[0,128]',
+    },
+    118 => {
+        Name => 'Contact',
+        Flags => 'List',
+        Groups => { 2 => 'Author' },
+        Format => 'string[0,128]',
+    },
+    120 => {
+        Name => 'Caption-Abstract',
+        Format => 'string[0,2000]',
+    },
+    121 => {
+        Name => 'LocalCaption',
+        Format => 'string[0,256]', # (guess)
+        Notes => q{
+            I haven't found a reference for the format of tags 121, 184-188 and
+            225-232, so I have just make them writable as strings with
+            reasonable length.  Beware that if this is wrong, other utilities
+            won't be able to read these tags as written by ExifTool
+        },
+    },
+    122 => {
+        Name => 'Writer-Editor',
+        Flags => 'List',
+        Groups => { 2 => 'Author' },
+        Format => 'string[0,32]',
+    },
+    125 => {
+        Name => 'RasterizedCaption',
+        Format => 'undef[7360]',
+        Binary => 1,
+    },
+    130 => {
+        Name => 'ImageType',
+        Groups => { 2 => 'Image' },
+        Format => 'string[2]',
+    },
+    131 => {
+        Name => 'ImageOrientation',
+        Groups => { 2 => 'Image' },
+        Format => 'string[1]',
+        PrintConv => {
+            P => 'Portrait',
+            L => 'Landscape',
+            S => 'Square',
+        },
+    },
+    135 => {
+        Name => 'LanguageIdentifier',
+        Format => 'string[2,3]',
+    },
+    150 => {
+        Name => 'AudioType',
+        Format => 'string[2]',
+        PrintConv => {
+            '1A' => 'Mono Actuality',
+            '2A' => 'Stereo Actuality',
+            '1C' => 'Mono Question and Answer Session',
+            '2C' => 'Stereo Question and Answer Session',
+            '1M' => 'Mono Music',
+            '2M' => 'Stereo Music',
+            '1Q' => 'Mono Response to a Question',
+            '2Q' => 'Stereo Response to a Question',
+            '1R' => 'Mono Raw Sound',
+            '2R' => 'Stereo Raw Sound',
+            '1S' => 'Mono Scener',
+            '2S' => 'Stereo Scener',
+            '0T' => 'Text Only',
+            '1V' => 'Mono Voicer',
+            '2V' => 'Stereo Voicer',
+            '1W' => 'Mono Wrap',
+            '2W' => 'Stereo Wrap',
+        },
+    },
+    151 => {
+        Name => 'AudioSamplingRate',
+        Format => 'digits[6]',
+    },
+    152 => {
+        Name => 'AudioSamplingResolution',
+        Format => 'digits[2]',
+    },
+    153 => {
+        Name => 'AudioDuration',
+        Format => 'digits[6]',
+    },
+    154 => {
+        Name => 'AudioOutcue',
+        Format => 'string[0,64]',
+    },
+    184 => {
+        Name => 'JobID',
+        Format => 'string[0,64]', # (guess)
+    },
+    185 => {
+        Name => 'MasterDocumentID',
+        Format => 'string[0,256]', # (guess)
+    },
+    186 => {
+        Name => 'ShortDocumentID',
+        Format => 'string[0,64]', # (guess)
+    },
+    187 => {
+        Name => 'UniqueDocumentID',
+        Format => 'string[0,128]', # (guess)
+    },
+    188 => {
+        Name => 'OwnerID',
+        Format => 'string[0,128]', # (guess)
+    },
+    200 => {
+        Name => 'ObjectPreviewFileFormat',
+        Groups => { 2 => 'Image' },
+        Format => 'int16u',
+        PrintConv => \%fileFormat,
+    },
+    201 => {
+        Name => 'ObjectPreviewFileVersion',
+        Groups => { 2 => 'Image' },
+        Format => 'int16u',
+    },
+    202 => {
+        Name => 'ObjectPreviewData',
+        Groups => { 2 => 'Image' },
+        Format => 'undef[0,256000]',
+        Binary => 1,
+    },
+    221 => {
+        Name => 'Prefs',
+        Groups => { 2 => 'Image' },
+        Format => 'string[0,64]',
+        Notes => 'PhotoMechanic preferences',
+        PrintConv => q{
+            $val =~ s[\s*(\d+):\s*(\d+):\s*(\d+):\s*(\S*)]
+                     [Tagged:$1, ColorClass:$2, Rating:$3, FrameNum:$4];
+            return $val;
+        },
+        PrintConvInv => q{
+            $val =~ s[Tagged:\s*(\d+).*ColorClass:\s*(\d+).*Rating:\s*(\d+).*FrameNum:\s*(\S*)]
+                     [$1:$2:$3:$4]is;
+            return $val;
+        },
+    },
+    225 => {
+        Name => 'ClassifyState',
+        Format => 'string[0,64]', # (guess)
+    },
+    228 => {
+        Name => 'SimilarityIndex',
+        Format => 'string[0,32]', # (guess)
+    },
+    230 => {
+        Name => 'DocumentNotes',
+        Format => 'string[0,1024]', # (guess)
+    },
+    231 => {
+        Name => 'DocumentHistory',
+        Format => 'string[0,256]', # (guess)
+    },
+    232 => {
+        Name => 'ExifCameraInfo',
+        Format => 'string[0,4096]', # (guess)
+    },
+    255 => { #PH
+        Name => 'CatalogSets',
+        List => 1,
+        Format => 'string[0,256]', # (guess)
+        Notes => 'written by iView MediaPro',
+    },
+);
+
+# Record 3 -- News photo
+%Image::ExifTool::IPTC::NewsPhoto = (
+    GROUPS => { 2 => 'Image' },
+    WRITE_PROC => \&WriteIPTC,
+    CHECK_PROC => \&CheckIPTC,
+    WRITABLE => 1,
+    0 => {
+        Name => 'NewsPhotoVersion',
+        Format => 'int16u',
+        Mandatory => 1,
+    },
+    10 => {
+        Name => 'IPTCPictureNumber',
+        Format => 'string[16]',
+        Notes => '4 numbers: 1-Manufacturer ID, 2-Equipment ID, 3-Date, 4-Sequence',
+        PrintConv => 'Image::ExifTool::IPTC::ConvertPictureNumber($val)',
+        PrintConvInv => 'Image::ExifTool::IPTC::InvConvertPictureNumber($val)',
+    },
+    20 => {
+        Name => 'IPTCImageWidth',
+        Format => 'int16u',
+    },
+    30 => {
+        Name => 'IPTCImageHeight',
+        Format => 'int16u',
+    },
+    40 => {
+        Name => 'IPTCPixelWidth',
+        Format => 'int16u',
+    },
+    50 => {
+        Name => 'IPTCPixelHeight',
+        Format => 'int16u',
+    },
+    55 => {
+        Name => 'SupplementalType',
+        Format => 'int8u',
+        PrintConv => {
+            0 => 'Main Image',
+            1 => 'Reduced Resolution Image',
+            2 => 'Logo',
+            3 => 'Rasterized Caption',
+        },
+    },
+    60 => {
+        Name => 'ColorRepresentation',
+        Format => 'int16u',
+        PrintHex => 1,
+        PrintConv => {
+            0x000 => 'No Image, Single Frame',
+            0x100 => 'Monochrome, Single Frame',
+            0x300 => '3 Components, Single Frame',
+            0x301 => '3 Components, Frame Sequential in Multiple Objects',
+            0x302 => '3 Components, Frame Sequential in One Object',
+            0x303 => '3 Components, Line Sequential',
+            0x304 => '3 Components, Pixel Sequential',
+            0x305 => '3 Components, Special Interleaving',
+            0x400 => '4 Components, Single Frame',
+            0x401 => '4 Components, Frame Sequential in Multiple Objects',
+            0x402 => '4 Components, Frame Sequential in One Object',
+            0x403 => '4 Components, Line Sequential',
+            0x404 => '4 Components, Pixel Sequential',
+            0x405 => '4 Components, Special Interleaving',
+        },
+    },
+    64 => {
+        Name => 'InterchangeColorSpace',
+        Format => 'int8u',
+        PrintConv => {
+            1 => 'X,Y,Z CIE',
+            2 => 'RGB SMPTE',
+            3 => 'Y,U,V (K) (D65)',
+            4 => 'RGB Device Dependent',
+            5 => 'CMY (K) Device Dependent',
+            6 => 'Lab (K) CIE',
+            7 => 'YCbCr',
+            8 => 'sRGB',
+        },
+    },
+    65 => {
+        Name => 'ColorSequence',
+        Format => 'int8u',
+    },
+    66 => {
+        Name => 'ICC_Profile',
+        # ...could add SubDirectory support to read into this (if anybody cares)
+        Writable => 0,
+        Binary => 1,
+    },
+    70 => {
+        Name => 'ColorCalibrationMatrix',
+        Writable => 0,
+        Binary => 1,
+    },
+    80 => {
+        Name => 'LookupTable',
+        Writable => 0,
+        Binary => 1,
+    },
+    84 => {
+        Name => 'NumIndexEntries',
+        Format => 'int16u',
+    },
+    85 => {
+        Name => 'ColorPalette',
+        Writable => 0,
+        Binary => 1,
+    },
+    86 => {
+        Name => 'IPTCBitsPerSample',
+        Format => 'int8u',
+    },
+    90 => {
+        Name => 'SampleStructure',
+        Format => 'int8u',
+        PrintConv => {
+            0 => 'OrthogonalConstangSampling',
+            1 => 'Orthogonal4-2-2Sampling',
+            2 => 'CompressionDependent',
+        },
+    },
+    100 => {
+        Name => 'ScanningDirection',
+        Format => 'int8u',
+        PrintConv => {
+            0 => 'L-R, Top-Bottom',
+            1 => 'R-L, Top-Bottom',
+            2 => 'L-R, Bottom-Top',
+            3 => 'R-L, Bottom-Top',
+            4 => 'Top-Bottom, L-R',
+            5 => 'Bottom-Top, L-R',
+            6 => 'Top-Bottom, R-L',
+            7 => 'Bottom-Top, R-L',
+        },
+    },
+    102 => {
+        Name => 'IPTCImageRotation',
+        Format => 'int8u',
+        PrintConv => {
+            0 => 0,
+            1 => 90,
+            2 => 180,
+            3 => 270,
+        },
+    },
+    110 => {
+        Name => 'DataCompressionMethod',
+        Format => 'int32u',
+    },
+    120 => {
+        Name => 'QuantizationMethod',
+        Format => 'int8u',
+        PrintConv => {
+            0 => 'Linear Reflectance/Transmittance',
+            1 => 'Linear Density',
+            2 => 'IPTC Ref B',
+            3 => 'Linear Dot Percent',
+            4 => 'AP Domestic Analogue',
+            5 => 'Compression Method Specific',
+            6 => 'Color Space Specific',
+            7 => 'Gamma Compensated',
+        },
+    },
+    125 => {
+        Name => 'EndPoints',
+        Writable => 0,
+        Binary => 1,
+    },
+    130 => {
+        Name => 'ExcursionTolerance',
+        Format => 'int8u',
+        PrintConv => {
+            0 => 'Not Allowed',
+            1 => 'Allowed',
+        },
+    },
+    135 => {
+        Name => 'BitsPerComponent',
+        Format => 'int8u',
+    },
+    140 => {
+        Name => 'MaximumDensityRange',
+        Format => 'int16u',
+    },
+    145 => {
+        Name => 'GammaCompensatedValue',
+        Format => 'int16u',
+    },
+);
+
+# Record 7 -- Pre-object Data
+%Image::ExifTool::IPTC::PreObjectData = (
+    # (not actually writable, but used in BuildTagLookup to recognize IPTC tables)
+    WRITE_PROC => \&WriteIPTC,
+    10 => {
+        Name => 'SizeMode',
+        Format => 'int8u',
+        PrintConv => {
+            0 => 'Size Not Known',
+            1 => 'Size Known',
+        },
+    },
+    20 => {
+        Name => 'MaxSubfileSize',
+        Format => 'int32u',
+    },
+    90 => {
+        Name => 'ObjectSizeAnnounced',
+        Format => 'int32u',
+    },
+    95 => {
+        Name => 'MaximumObjectSize',
+        Format => 'int32u',
+    },
+);
+
+# Record 8 -- ObjectData
+%Image::ExifTool::IPTC::ObjectData = (
+    WRITE_PROC => \&WriteIPTC,
+    10 => {
+        Name => 'SubFile',
+        Flags => 'List',
+        Binary => 1,
+    },
+);
+
+# Record 9 -- PostObjectData
+%Image::ExifTool::IPTC::PostObjectData = (
+    WRITE_PROC => \&WriteIPTC,
+    10 => {
+        Name => 'ConfirmedObjectSize',
+        Format => 'int32u',
+    },
+);
+
+# Record 240 -- FotoStation proprietary data (ref PH)
+%Image::ExifTool::IPTC::FotoStation = (
+    GROUPS => { 2 => 'Other' },
+    WRITE_PROC => \&WriteIPTC,
+    CHECK_PROC => \&CheckIPTC,
+    WRITABLE => 1,
+);
+
+# IPTC Composite tags
+%Image::ExifTool::IPTC::Composite = (
+    GROUPS => { 2 => 'Image' },
+    DateTimeCreated => {
+        Description => 'Date/Time Created',
+        Groups => { 2 => 'Time' },
+        Require => {
+            0 => 'IPTC:DateCreated',
+            1 => 'IPTC:TimeCreated',
+        },
+        ValueConv => '"$val[0] $val[1]"',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    DigitalCreationDateTime => {
+        Description => 'Digital Creation Date/Time',
+        Groups => { 2 => 'Time' },
+        Require => {
+            0 => 'IPTC:DigitalCreationDate',
+            1 => 'IPTC:DigitalCreationTime',
+        },
+        ValueConv => '"$val[0] $val[1]"',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+);
+
+# add our composite tags
+Image::ExifTool::AddCompositeTags('Image::ExifTool::IPTC');
+
+
+#------------------------------------------------------------------------------
+# AutoLoad our writer routines when necessary
+#
+sub AUTOLOAD
+{
+    return Image::ExifTool::DoAutoLoad($AUTOLOAD, @_);
+}
+
+#------------------------------------------------------------------------------
+# Print conversion for CodedCharacterSet
+# Inputs: 0) value
+sub PrintCodedCharset($)
+{
+    my $val = shift;
+    return $iptcCharset{$val} if $iptcCharset{$val};
+    $val =~ s/(.)/ $1/g;
+    $val =~ s/ \x1b/, ESC/g;
+    $val =~ s/^,? //;
+    return $val;
+}
+
+#------------------------------------------------------------------------------
+# Handle CodedCharacterSet
+# Inputs: 0) ExifTool ref, 1) CodedCharacterSet value
+# Returns: IPTC character set if translation required (or 'bad' if unknown)
+sub HandleCodedCharset($$)
+{
+    my ($exifTool, $val) = @_;
+    my $xlat = $iptcCharset{$val};
+    unless ($xlat) {
+        if ($val =~ /^\x1b\x25/) {
+            # some unknown character set invoked
+            $xlat = 'bad';  # flag unsupported coding
+        } else {
+            $xlat = $exifTool->Options('CharsetIPTC');
+        }
+    }
+    # no need to translate if Charset is the same
+    undef $xlat if $xlat eq $exifTool->Options('Charset');
+    return $xlat;
+}
+
+#------------------------------------------------------------------------------
+# Encode or decode coded string
+# Inputs: 0) ExifTool ref, 1) value ptr, 2) IPTC charset (or 'bad') ref
+#         3) flag set to decode (read) value from IPTC
+# Updates value on return
+sub TranslateCodedString($$$$)
+{
+    my ($exifTool, $valPtr, $xlatPtr, $read) = @_;
+    if ($$xlatPtr eq 'bad') {
+        $exifTool->Warn('Some IPTC characters not converted (unsupported CodedCharacterSet)');
+        undef $$xlatPtr;
+    } elsif (not $read) {
+        $$valPtr = $exifTool->Decode($$valPtr, undef, undef, $$xlatPtr);
+    } elsif ($$valPtr !~ /[\x14\x15\x1b]/) {
+        $$valPtr = $exifTool->Decode($$valPtr, $$xlatPtr);
+    } else {
+        # don't yet support reading ISO 2022 shifted character sets
+        $exifTool->WarnOnce('Some IPTC characters not converted (ISO 2022 shifting not supported)');
+    }
+}
+
+#------------------------------------------------------------------------------
+# Is this IPTC in a standard location?
+# Inputs: 0) Current metadata path string
+# Returns: true if path is standard
+sub IsStandardIPTC($)
+{
+    my $path = shift;
+    return $path =~ /^(JPEG-APP13-Photoshop-IPTC|TIFF-IFD0-IPTC|PSD-IPTC|MIE-IPTC)$/
+}
+
+#------------------------------------------------------------------------------
+# get IPTC info
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+#         2) reference to tag table
+# Returns: 1 on success, 0 otherwise
+sub ProcessIPTC($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $pos = $$dirInfo{DirStart} || 0;
+    my $dirLen = $$dirInfo{DirLen} || 0;
+    my $dirEnd = $pos + $dirLen;
+    my $verbose = $exifTool->Options('Verbose');
+    my $success = 0;
+    my ($lastRec, $recordPtr, $recordName);
+
+    $verbose and $dirInfo and $exifTool->VerboseDir('IPTC', 0, $$dirInfo{DirLen});
+
+    if ($tagTablePtr eq \%Image::ExifTool::IPTC::Main) {
+        # calculate MD5 if Digest::MD5 is available (for standard IPTC only)
+        my $path = $exifTool->MetadataPath();
+        if (IsStandardIPTC($path)) {
+            my $md5;
+            if (eval 'require Digest::MD5') {
+                if ($pos or $dirLen != length($$dataPt)) {
+                    $md5 = Digest::MD5::md5(substr $$dataPt, $pos, $dirLen);
+                } else {
+                    $md5 = Digest::MD5::md5($$dataPt);
+                }
+            } else {
+                # a zero digest indicates IPTC exists but we don't have Digest::MD5
+                $md5 = "\0" x 16;
+            }
+            $exifTool->FoundTag('CurrentIPTCDigest', $md5);
+        } elsif ($Image::ExifTool::MWG::strict and $$exifTool{FILE_TYPE} =~ /^(JPEG|TIFF|PSD)$/) {
+            # ignore non-standard IPTC while in strict MWG compatibility mode
+            $exifTool->Warn("Ignored non-standard IPTC at $path");
+            return 1;
+        }
+        # set family 1 group name if multiple IPTC directories
+        my $dirCount = ($exifTool->{DIR_COUNT}->{IPTC} || 0) + 1;
+        $exifTool->{DIR_COUNT}->{IPTC} = $dirCount;
+        $exifTool->{SET_GROUP1} = '+' . $dirCount if $dirCount > 1;
+    }
+    # begin by assuming default IPTC encoding
+    my $xlat = $exifTool->Options('CharsetIPTC');
+    undef $xlat if $xlat eq $exifTool->Options('Charset');
+
+    # quick check for improperly byte-swapped IPTC
+    if ($dirLen >= 4 and substr($$dataPt, $pos, 1) ne "\x1c" and
+                         substr($$dataPt, $pos + 3, 1) eq "\x1c")
+    {
+        $exifTool->Warn('IPTC data was improperly byte-swapped');
+        my $newData = pack('N*', unpack('V*', substr($$dataPt, $pos, $dirLen) . "\0\0\0"));
+        $dataPt = \$newData;
+        $pos = 0;
+        $dirEnd = $pos + $dirLen;
+        # NOTE: MUST NOT access $dirInfo DataPt, DirStart or DataLen after this!
+    }
+    while ($pos + 5 <= $dirEnd) {
+        my $buff = substr($$dataPt, $pos, 5);
+        my ($id, $rec, $tag, $len) = unpack("CCCn", $buff);
+        unless ($id == 0x1c) {
+            unless ($id) {
+                # scan the rest of the data an give warning unless all zeros
+                # (iMatch pads the IPTC block with nulls for some reason)
+                my $remaining = substr($$dataPt, $pos, $dirEnd - $pos);
+                last unless $remaining =~ /[^\0]/;
+            }
+            $exifTool->Warn(sprintf('Bad IPTC data tag (marker 0x%x)',$id));
+            last;
+        }
+        if (not defined $lastRec or $lastRec != $rec) {
+            my $tableInfo = $tagTablePtr->{$rec};
+            unless ($tableInfo) {
+                $exifTool->Warn("Unrecognized IPTC record $rec, subsequent records ignored");
+                last;   # stop now because we're probably reading garbage
+            }
+            my $tableName = $tableInfo->{SubDirectory}->{TagTable};
+            unless ($tableName) {
+                $exifTool->Warn("No table for IPTC record $rec!");
+                last;   # this shouldn't happen
+            }
+            $recordName = $$tableInfo{Name};
+            $recordPtr = Image::ExifTool::GetTagTable($tableName);
+            $exifTool->VPrint(0,$$exifTool{INDENT},"-- $recordName record --\n");
+            $lastRec = $rec;
+        }
+        $pos += 5;      # step to after field header
+        # handle extended IPTC entry if necessary
+        if ($len & 0x8000) {
+            my $n = $len & 0x7fff; # get num bytes in length field
+            if ($pos + $n > $dirEnd or $n > 8) {
+                $exifTool->VPrint(0, "Invalid extended IPTC entry (tag $tag)\n");
+                $success = 0;
+                last;
+            }
+            # determine length (a big-endian, variable sized int)
+            for ($len = 0; $n; ++$pos, --$n) {
+                $len = $len * 256 + ord(substr($$dataPt, $pos, 1));
+            }
+        }
+        if ($pos + $len > $dirEnd) {
+            $exifTool->VPrint(0, "Invalid IPTC entry (tag $tag, len $len)\n");
+            $success = 0;
+            last;
+        }
+        my $val = substr($$dataPt, $pos, $len);
+
+        # add tagInfo for all unknown tags:
+        unless ($$recordPtr{$tag}) {
+            # - no Format so format is auto-detected
+            # - no Name so name is generated automatically with decimal tag number
+            Image::ExifTool::AddTagToTable($recordPtr, $tag, { Unknown => 1 });
+        }
+
+        my $tagInfo = $exifTool->GetTagInfo($recordPtr, $tag);
+        my $format;
+        # (could use $$recordPtr{FORMAT} if no Format below, but don't do this to
+        #  be backward compatible with improperly written PhotoMechanic tags)
+        $format = $$tagInfo{Format} if $tagInfo;
+        # use logic to determine format if not specified
+        unless ($format) {
+            $format = 'int' if $len <= 4 and $len != 3 and $val =~ /[\0-\x08]/;
+        }
+        if ($format) {
+            if ($format =~ /^int/) {
+                if ($len <= 8) {    # limit integer conversion to 8 bytes long
+                    $val = 0;
+                    my $i;
+                    for ($i=0; $i<$len; ++$i) {
+                        $val = $val * 256 + ord(substr($$dataPt, $pos+$i, 1));
+                    }
+                }
+            } elsif ($format =~ /^string/) {
+                $val =~ s/\0+$//;   # some braindead softwares add null terminators
+                if ($rec == 1) {
+                    # handle CodedCharacterSet tag
+                    $xlat = HandleCodedCharset($exifTool, $val) if $tag == 90;
+                # translate characters if necessary and special characters exist
+                } elsif ($xlat and $rec < 7 and $val =~ /[\x80-\xff]/) {
+                    # translate to specified character set
+                    TranslateCodedString($exifTool, \$val, \$xlat, 1);
+                }
+            } elsif ($format =~ /^digits/) {
+                $val =~ s/\0+$//;
+            } elsif ($format !~ /^undef/) {
+                warn("Invalid IPTC format: $format");
+            }
+        }
+        $verbose and $exifTool->VerboseInfo($tag, $tagInfo,
+            Table   => $tagTablePtr,
+            Value   => $val,
+            DataPt  => $dataPt,
+            DataPos => $$dirInfo{DataPos},
+            Size    => $len,
+            Start   => $pos,
+            Extra   => ", $recordName record",
+            Format  => $format,
+        );
+        $exifTool->FoundTag($tagInfo, $val) if $tagInfo;
+        $success = 1;
+
+        $pos += $len;   # increment to next field
+    }
+    delete $exifTool->{SET_GROUP1};
+    return $success;
+}
+
+1; # end
+
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::IPTC - Read IPTC meta information
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to interpret
+IPTC (International Press Telecommunications Council) meta information in
+image files.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.iptc.org/IIM/>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/IPTC Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/ITC.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/ITC.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/ITC.pm	(revision 24799)
@@ -0,0 +1,215 @@
+#------------------------------------------------------------------------------
+# File:         ITC.pm
+#
+# Description:  Read iTunes Cover Flow meta information
+#
+# Revisions:    01/12/2008 - P. Harvey Created
+#
+# References:   1) http://www.waldoland.com/dev/Articles/ITCFileFormat.aspx
+#               2) http://www.falsecognate.org/2007/01/deciphering_the_itunes_itc_fil/
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::ITC;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.00';
+
+sub ProcessITC($$);
+
+# tags used in ITC files
+%Image::ExifTool::ITC::Main = (
+    NOTES => 'This information is found in iTunes Cover Flow data files.',
+    itch => { SubDirectory => { TagTable => 'Image::ExifTool::ITC::Header' } },
+    item => { SubDirectory => { TagTable => 'Image::ExifTool::ITC::Item' } },
+    data => {
+        Name => 'ImageData',
+        Notes => 'embedded JPEG or PNG image, depending on ImageType',
+    },
+);
+
+# ITC header information
+%Image::ExifTool::ITC::Header = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    0x10 => {
+        Name => 'DataType',
+        Format => 'undef[4]',
+        PrintConv => { artw => 'Artwork' },
+    },
+);
+
+# ITC item information
+%Image::ExifTool::ITC::Item = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    FORMAT => 'int32u',
+    FIRST_ENTRY => 0,
+    0 => {
+        Name => 'LibraryID',
+        Format => 'undef[8]',
+        ValueConv => 'uc unpack "H*", $val',
+    },
+    2 => {
+        Name => 'TrackID',
+        Format => 'undef[8]',
+        ValueConv => 'uc unpack "H*", $val',
+    },
+    4 => {
+        Name => 'DataLocation',
+        Format => 'undef[4]',
+        PrintConv => {
+            down => 'Downloaded Separately',
+            locl => 'Local Music File',
+        },
+    },
+    5 => {
+        Name => 'ImageType',
+        Format => 'undef[4]',
+        PrintConv => {
+            'PNGf' => 'PNG',
+            "\0\0\0\x0d" => 'JPEG',
+        },
+    },
+    7 => 'ImageWidth',
+    8 => 'ImageHeight',
+);
+
+#------------------------------------------------------------------------------
+# Process an iTunes Cover Flow (ITC) file
+# Inputs: 0) ExifTool object reference, 1) Directory information reference
+# Returns: 1 on success, 0 if this wasn't a valid ITC file
+sub ProcessITC($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my $rtnVal = 0;
+    my ($buff, $err, $pos, $tagTablePtr, %dirInfo);
+
+    # loop through all blocks in this image
+    for (;;) {
+        # read the block header
+        my $n = $raf->Read($buff, 8);
+        unless ($n == 8) {
+            # no error if we reached the EOF normally
+            undef $err unless $n;
+            last;
+        }
+        my ($size, $tag) = unpack('Na4', $buff);
+        if ($rtnVal) {
+            last unless $size >= 8 and $size < 0x80000000;
+        } else {
+            # check to be sure this is a valid ITC image
+            # (first block must be 'itch')
+            last unless $tag eq 'itch';
+            last unless $size >= 0x1c and $size < 0x10000;
+            $exifTool->SetFileType();
+            SetByteOrder('MM');
+            $rtnVal = 1;    # this is an ITC file
+            $err = 1;       # format error unless we read to EOF
+        }
+        if ($tag eq 'itch') {
+            $pos = $raf->Tell();
+            $size -= 8; # size of remaining data in block
+            $raf->Read($buff,$size) == $size or last;
+            # extract header information
+            %dirInfo = (
+                DirName => 'ITC Header',
+                DataPt  => \$buff,
+                DataPos => $pos,
+            );
+            my $tagTablePtr = GetTagTable('Image::ExifTool::ITC::Header');
+            $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+        } elsif ($tag eq 'item') {
+            # don't want to read the entire item data (includes image)
+            $size > 12 or last;
+            $raf->Read($buff, 4) == 4 or last;
+            my $len = unpack('N', $buff);
+            $len >= 0xd0 and $len <= $size or last;
+            $size -= $len;  # size of data after item header
+            $len -= 12;     # length of remaining item header
+            # read in 4-byte blocks until we find the null terminator
+            # (this is just a guess about how to parse this variable-length part)
+            while ($len >= 4) {
+                $raf->Read($buff, 4) == 4 or last;
+                $len -= 4;
+                last if $buff eq "\0\0\0\0";
+            }
+            last if $len < 4;
+            $pos = $raf->Tell();
+            $raf->Read($buff, $len) == $len or last;
+            unless ($len >= 0xb4 and substr($buff, 0xb0, 4) eq 'data') {
+                $exifTool->Warn('Parsing error. Please submit this ITC file for testing');
+                last;
+            }
+            %dirInfo = (
+                DirName => 'ITC Item',
+                DataPt  => \$buff,
+                DataPos => $pos,
+            );
+            $tagTablePtr = GetTagTable('Image::ExifTool::ITC::Item');
+            $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+            # extract embedded image
+            $pos += $len;
+            if ($size > 0) {
+                $tagTablePtr = GetTagTable('Image::ExifTool::ITC::Main');
+                my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, 'data');
+                my $image = $exifTool->ExtractBinary($pos, $size, $$tagInfo{Name});
+                $exifTool->FoundTag($tagInfo, \$image);
+                # skip the rest of the block if necessary
+                $raf->Seek($pos+$size, 0) or last
+            } elsif ($size < 0) {
+                last;
+            }
+        } else {
+            $exifTool->VPrint(0, "Unknown $tag block ($size bytes)\n");
+            $raf->Seek($size-8, 1) or last;
+        }
+    }
+    $err and $exifTool->Warn('ITC file format error');
+    return $rtnVal;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::ITC - Read iTunes Cover Flow meta information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains the routines required by Image::ExifTool to read meta
+information (including artwork images) from iTunes Cover Flow files.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.waldoland.com/dev/Articles/ITCFileFormat.aspx>
+
+=item L<http://www.falsecognate.org/2007/01/deciphering_the_itunes_itc_fil/>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/ITC Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Import.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Import.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Import.pm	(revision 24799)
@@ -0,0 +1,300 @@
+#------------------------------------------------------------------------------
+# File:         Import.pm
+#
+# Description:  Import CSV and JSON database files
+#
+# Revisions:    2011-03-05 - P. Harvey Created
+#------------------------------------------------------------------------------
+package Image::ExifTool::Import;
+
+use strict;
+require Exporter;
+
+use vars qw($VERSION @ISA @EXPORT_OK);
+
+$VERSION = '1.00';
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(ReadCSV ReadJSON);
+
+sub ReadJSONObject($;$);
+
+my %unescapeJSON = ( 't'=>"\t", 'n'=>"\n", 'r'=>"\r" );
+my $charset;
+
+#------------------------------------------------------------------------------
+# Read CSV file
+# Inputs: 0) CSV file name, 1) database hash ref, 2) flag to delete "-" tags
+# Returns: undef on success, or error string
+# Notes: There are various flavours of CSV, but here we assume that only
+#        double quotes are escaped, and they are escaped by doubling them
+sub ReadCSV($$;$)
+{
+    local ($_, $/);
+    my ($file, $database, $delDash) = @_;
+    my ($buff, @tags, $found, $err);
+
+    open CSVFILE, $file or return "Error opening CSV file '$file'";
+    binmode CSVFILE;
+    my $raf = new File::RandomAccess(\*CSVFILE);
+    # set input record separator by first newline found in the file
+    # (safe because first line should contain only tag names)
+    while ($raf->Read($buff, 65536)) {
+        $buff =~ /(\x0d\x0a|\x0d|\x0a)/ and $/ = $1, last;
+    }
+    $raf->Seek(0,0);
+    while ($raf->ReadLine($buff)) {
+        my (@vals, $v, $i, %fileInfo);
+        my @toks = split ',', $buff;
+        while (@toks) {
+            ($v = shift @toks) =~ s/^ +//;  # remove leading spaces
+            if ($v =~ s/^"//) {
+                # quoted value must end in an odd number of quotes
+                while ($v !~ /("+)\s*$/ or not length($1) & 1) {
+                    if (@toks) {
+                        $v .= ',' . shift @toks;
+                    } else {
+                        # read another line from the file
+                        $raf->ReadLine($buff) or last;
+                        @toks = split ',', $buff;
+                        last unless @toks;
+                        $v .= shift @toks;
+                    }
+                }
+                $v =~ s/"\s*$//;    # remove trailing quote and whitespace
+                $v =~ s/""/"/g;     # un-escape quotes
+            } else {
+                $v =~ s/[ \n\r]+$//;# remove trailing spaces/newlines
+            }
+            push @vals, $v;
+        }
+        if (@tags) {
+            # save values for each tag
+            for ($i=0; $i<@vals and $i<@tags; ++$i) {
+                next unless length $vals[$i];   # ignore empty entries
+                # delete tag if value (set value to undef) is '-' and -f option is used
+                $fileInfo{$tags[$i]} = ($vals[$i] eq '-' and $delDash) ? undef : $vals[$i];
+            }
+            # figure out the file name to use
+            if ($fileInfo{SourceFile}) {
+                $$database{$fileInfo{SourceFile}} = \%fileInfo;
+                $found = 1;
+            }
+        } else {
+            # the first row should be the tag names
+            foreach (@vals) {
+                /^[-\w]+(:[-\w+]+)?#?$/ or $err = "Invalid tag name '$_'", last;
+                push(@tags, $_);
+            }
+            last if $err;
+            @tags or $err = 'No tags found', last;
+        }
+    }
+    close CSVFILE;
+    undef $raf;
+    $err = 'No SourceFile column' unless $found or $err;
+    return $err ? "$err in $file" : undef;
+}
+
+#------------------------------------------------------------------------------
+# Convert unicode code point to UTF-8
+# Inputs: 0) integer Unicode character
+# Returns: UTF-8 bytes
+sub ToUTF8($)
+{
+    require Image::ExifTool::Charset;
+    return Image::ExifTool::Charset::Recompose(undef, [$_[0]], $charset);
+}
+
+#------------------------------------------------------------------------------
+# Read JSON object from file
+# Inputs: 0) JSON file handle, 1) optional file buffer reference
+# Returns: JSON object (scalar, hash ref, or array ref), or undef on EOF or
+#          empty object or array (and sets $$buffPt to empty string on EOF)
+# Notes: position in buffer is significant
+sub ReadJSONObject($;$)
+{
+    my ($fp, $buffPt) = @_;
+    # initialize buffer if necessary
+    my ($pos, $readMore, $rtnVal, $tok, $key);
+    if ($buffPt) {
+        $pos = pos $$buffPt;
+    } else {
+        my $buff = '';
+        $buffPt = \$buff;
+        $pos = 0;
+    }
+Tok: for (;;) {
+        if ($pos >= length $$buffPt or $readMore) {
+            # read another 64kB and add to unparsed data
+            my $offset = length($$buffPt) - $pos;
+            $$buffPt = substr($$buffPt, $pos) if $offset;
+            read $fp, $$buffPt, 65536, $offset or $$buffPt = '', last;
+            $pos = pos($$buffPt) = 0;
+            $readMore = 0;
+        }
+        unless ($tok) {
+            # skip white space and find next character
+            $$buffPt =~ /(\S)/g or $pos = length($$buffPt), next;
+            $tok = $1;
+            $pos = pos $$buffPt;
+        }
+        # see what type of object this is
+        if ($tok eq '{') {      # object (hash)
+            $rtnVal = { } unless defined $rtnVal;
+            for (;;) {
+                # read "KEY":"VALUE" pairs
+                unless (defined $key) {
+                    $key = ReadJSONObject($fp, $buffPt);
+                    $pos = pos $$buffPt;
+                }
+                # ($key may be undef for empty JSON object)
+                if (defined $key) {
+                    # scan to delimiting ':'
+                    $$buffPt =~ /(\S)/g or $readMore = 1, next Tok;
+                    $1 eq ':' or return undef;  # error if not a colon
+                    my $val = ReadJSONObject($fp, $buffPt);
+                    $pos = pos $$buffPt;
+                    return undef unless defined $val;
+                    $$rtnVal{$key} = $val;
+                    undef $key;
+                }
+                # scan to delimiting ',' or bounding '}'
+                $$buffPt =~ /(\S)/g or $readMore = 1, next Tok;
+                last if $1 eq '}';          # check for end of object
+                $1 eq ',' or return undef;  # error if not a comma
+            }
+        } elsif ($tok eq '[') { # array
+            $rtnVal = [ ] unless defined $rtnVal;
+            for (;;) {
+                my $item = ReadJSONObject($fp, $buffPt);
+                $pos = pos $$buffPt;
+                # ($item may be undef for empty array)
+                push @$rtnVal, $item if defined $item;
+                # scan to delimiting ',' or bounding ']'
+                $$buffPt =~ /(\S)/g or $readMore = 1, next Tok;
+                last if $1 eq ']';          # check for end of array
+                $1 eq ',' or return undef;  # error if not a comma
+            }
+        } elsif ($tok eq '"') { # quoted string
+            for (;;) {
+                $$buffPt =~ /(\\*)"/g or $readMore = 1, next Tok;
+                last unless length($1) & 1; # check for escaped quote
+            }
+            $rtnVal = substr($$buffPt, $pos, pos($$buffPt)-$pos-1);
+            # unescape characters
+            $rtnVal =~ s/\\u([0-9a-f]{4})/ToUTF8(hex $1)/ige;
+            $rtnVal =~ s/\\(.)/$unescapeJSON{$1}||$1/sge;
+        } elsif ($tok eq ']' or $tok eq '}' or $tok eq ',') {
+            # return undef for empty object, array, or list item
+            # (empty list item actually not valid JSON)
+            pos($$buffPt) = pos($$buffPt) - 1;
+        } else {                # number, 'true', 'false', 'null'
+            $$buffPt =~ /([\s:,\}\]])/g or $readMore = 1, next;
+            pos($$buffPt) = pos($$buffPt) - 1;
+            $rtnVal = $tok . substr($$buffPt, $pos, pos($$buffPt)-$pos);
+        }
+        last;
+    }
+    return $rtnVal;
+}
+
+#------------------------------------------------------------------------------
+# Read JSON file
+# Inputs: 0) JSON file name, 1) database hash ref, 2) flag to delete "-" tags
+#         2) character set
+# Returns: undef on success, or error string
+sub ReadJSON($$;$$)
+{
+    local $_;
+    my ($file, $database, $delDash, $chset) = @_;
+
+    # initialize character set for converting "\uHHHH" chars
+    $charset = $chset || 'UTF8';
+    open JSONFILE, $file or return "Error opening JSON file '$file'";
+    binmode JSONFILE;
+    my $obj = ReadJSONObject(\*JSONFILE);
+    close JSONFILE;
+    unless (ref $obj eq 'ARRAY') {
+        ref $obj eq 'HASH' or return "Format error in JSON file '$file'";
+        $obj = [ $obj ];
+    }
+    my ($info, $found);
+    foreach $info (@$obj) {
+        next unless ref $info eq 'HASH' and $$info{SourceFile};
+        if ($delDash) {
+            $$info{$_} eq '-' and $$info{$_} = undef foreach keys %$info;
+        }
+        $$database{$$info{SourceFile}} = $info;
+        $found = 1;
+    }
+    return $found ? undef : "No SourceFile entries in '$file'";
+}
+
+
+1; # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Import - Import CSV and JSON database files
+
+=head1 SYNOPSIS
+
+    use Image::ExifTool::Import qw(ReadCSV ReadJSON);
+
+    $err = ReadCSV($csvFile, \%database);
+
+    $err = ReadJSON($jsonfile, \%database);
+
+=head1 DESCRIPTION
+
+This module contains routines for importing tag information from CSV (Comma
+Separated Value) and JSON (JavaScript Object Notation) database files.
+
+=head1 EXPORTS
+
+Exports nothing by default, but ReadCSV and ReadJSON may be exported.
+
+=head1 METHODS
+
+=head2 ReadCSV / ReadJSON
+
+Read CSV or JSON file into a database hash.
+
+=over 4
+
+=item Inputs:
+
+0) CSV file name.
+
+1) Hash reference for database object.
+
+2) Optional flag to set '-' values to undef in the database.  (Used for
+deleting tags.)
+
+3) [ReadJSON only] Optional character set for converting Unicode escape
+sequences in strings.  Defaults to "UTF8".  See the ExifTool Charset option
+for a list of valid settings.
+
+=item Return Value:
+
+These functions return an error string, or undef on success and populate the
+database hash with entries from the CSV or JSON file.  Entries are keyed
+based on the SourceFile column of the CSV or JSON information, and are
+stored as hash lookups of tag name/value for each SourceFile.
+
+=back
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/InDesign.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/InDesign.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/InDesign.pm	(revision 24799)
@@ -0,0 +1,261 @@
+#------------------------------------------------------------------------------
+# File:         InDesign.pm
+#
+# Description:  Read/write meta information in Adobe InDesign files
+#
+# Revisions:    2009-06-17 - P. Harvey Created
+#
+# References:   1) http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart3.pdf
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::InDesign;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.02';
+
+# map for writing metadata to InDesign files (currently only write XMP)
+my %indMap = (
+    XMP => 'IND',
+);
+
+# GUID's used in InDesign files
+my $masterPageGUID    = "\x06\x06\xed\xf5\xd8\x1d\x46\xe5\xbd\x31\xef\xe7\xfe\x74\xb7\x1d";
+my $objectHeaderGUID  = "\xde\x39\x39\x79\x51\x88\x4b\x6c\x8E\x63\xee\xf8\xae\xe0\xdd\x38";
+my $objectTrailerGUID = "\xfd\xce\xdb\x70\xf7\x86\x4b\x4f\xa4\xd3\xc7\x28\xb3\x41\x71\x06";
+
+#------------------------------------------------------------------------------
+# Read or write meta information in an InDesign file
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 on success, 0 if this wasn't a valid InDesign file, or -1 on write error
+sub ProcessIND($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my $outfile = $$dirInfo{OutFile};
+    my ($hdr, $buff, $buf2, $err, $writeLen, $foundXMP);
+
+    # validate the InDesign file
+    return 0 unless $raf->Read($hdr, 16) == 16;
+    return 0 unless $hdr eq $masterPageGUID;
+    return 0 unless $raf->Read($buff, 8) == 8;
+    $exifTool->SetFileType($buff eq 'DOCUMENT' ? 'INDD' : 'IND');   # set the FileType tag
+
+    # read the master pages
+    $raf->Seek(0, 0) or $err = 'Seek error', goto DONE;
+    unless ($raf->Read($buff, 4096) == 4096 and
+            $raf->Read($buf2, 4096) == 4096)
+    {
+        $err = 'Unexpected end of file';
+        goto DONE; # (goto's can be our friend)
+    }
+    SetByteOrder('II');
+    unless ($buf2 =~ /^\Q$masterPageGUID/) {
+        $err = 'Second master page is invalid';
+        goto DONE;
+    }
+    my $seq1 = Get64u(\$buff, 264);
+    my $seq2 = Get64u(\$buf2, 264);
+    # take the most current master page
+    my $curPage = $seq2 > $seq1 ? \$buf2 : \$buff;
+    # byte order of stream data may be different than headers
+    my $streamInt32u = Get8u($curPage, 24);
+    if ($streamInt32u == 1) {
+        $streamInt32u = 'V'; # little-endian int32u
+    } elsif ($streamInt32u == 2) {
+        $streamInt32u = 'N'; # big-endian int32u
+    } else {
+        $err = 'Invalid stream byte order';
+        goto DONE;
+    }
+    my $pages = Get32u($curPage, 280);
+    $pages < 2 and $err = 'Invalid page count', goto DONE;
+    my $pos = $pages * 4096;
+    if ($pos > 0x7fffffff and not $exifTool->Options('LargeFileSupport')) {
+        $err = 'InDesign files larger than 2 GB not supported (LargeFileSupport not set)';
+        goto DONE;
+    }
+    if ($outfile) {
+        # make XMP the preferred group for writing
+        $exifTool->InitWriteDirs(\%indMap, 'XMP');
+
+        Write($outfile, $buff, $buf2) or $err = 1, goto DONE;
+        my $result = Image::ExifTool::CopyBlock($raf, $outfile, $pos - 8192);
+        unless ($result) {
+            $err = defined $result ? 'Error reading InDesign database' : 1;
+            goto DONE;
+        }
+        $writeLen = 0;
+    } else {
+        $raf->Seek($pos, 0) or $err = 'Seek error', goto DONE;
+    }
+    # scan through the contiguous objects for XMP
+    my $verbose = $exifTool->Options('Verbose');
+    my $out = $exifTool->Options('TextOut');
+    for (;;) {
+        $raf->Read($hdr, 32) or last;
+        unless (length($hdr) == 32 and $hdr =~ /^\Q$objectHeaderGUID/) {
+            # this must be null padding or we have an error
+            $hdr =~ /^\0+$/ or $err = 'Corrupt file or unsupported InDesign version';
+            last;
+        }
+        my $len = Get32u(\$hdr, 24);
+        if ($verbose) {
+            printf $out "Contiguous object at offset 0x%x (%d bytes):\n", $raf->Tell(), $len;
+            if ($verbose > 2) {
+                my %parms = (Addr => $raf->Tell());
+                $parms{MaxLen} = $verbose > 3 ? 1024 : 96 if $verbose < 5;
+                $raf->Seek(-$raf->Read($buff, $len), 1) or $err = 1;
+                Image::ExifTool::HexDump(\$buff, undef, %parms);
+            }
+        }
+        # check for XMP if stream data is long enough
+        # (56 bytes is just enough for XMP header)
+        if ($len > 56) {
+            $raf->Read($buff, 56) == 56 or $err = 'Unexpected end of file', last;
+            if ($buff =~ /^(....)<\?xpacket begin=(['"])\xef\xbb\xbf\2 id=(['"])W5M0MpCehiHzreSzNTczkc9d\3/s) {
+                my $lenWord = $1;   # save length word for writing later
+                $len -= 4;          # get length of XMP only
+                # load and parse the XMP data
+                unless ($raf->Seek(-52, 1) and $raf->Read($buff, $len) == $len) {
+                    $err = 'Error reading XMP stream';
+                    last;
+                }
+                $foundXMP = 1;
+                my %dirInfo = (
+                    DataPt  => \$buff,
+                    Parent  => 'IND',
+                    NoDelete => 1, # do not allow this to be deleted when writing
+                );
+                my $tagTablePtr = GetTagTable('Image::ExifTool::XMP::Main');
+                if ($outfile) {
+                    # validate xmp data length (should be same as length in header - 4)
+                    my $xmpLen = unpack($streamInt32u, $lenWord);
+                    unless ($xmpLen == $len) {
+                        $err = "Incorrect XMP stream length ($xmpLen should be $len)";
+                        last;
+                    }
+                    # make sure that XMP is writable
+                    my $classID = Get32u(\$hdr, 20);
+                    $classID & 0x40000000 or $err = 'XMP stream is not writable', last;
+                    my $xmp = $exifTool->WriteDirectory(\%dirInfo, $tagTablePtr);
+                    if ($xmp and length $xmp) {
+                        # write new xmp with leading length word
+                        $buff = pack($streamInt32u, length $xmp) . $xmp;
+                        # update header with new length and invalid checksum
+                        Set32u(length($buff), \$hdr, 24);
+                        Set32u(0xffffffff, \$hdr, 28);
+                    } else {
+                        $$exifTool{CHANGED} = 0;    # didn't change anything
+                        $exifTool->Warn("Can't delete XMP as a block from InDesign file") if defined $xmp;
+                        # put length word back at start of stream
+                        $buff = $lenWord . $buff;
+                    }
+                } else {
+                    $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+                }
+                $len = 0;   # we got the full stream (nothing left to read)
+            } else {
+                $len -= 56; # we got 56 bytes of the stream
+            }
+        } else {
+            $buff = '';     # must reset this for writing later
+        }
+        if ($outfile) {
+            # write object header and data
+            Write($outfile, $hdr, $buff) or $err = 1, last;
+            my $result = Image::ExifTool::CopyBlock($raf, $outfile, $len);
+            unless ($result) {
+                $err = defined $result ? 'Truncated stream data' : 1;
+                last;
+            }
+            $writeLen += 32 + length($buff) + $len;
+        } elsif ($len) {
+            # skip over remaining stream data
+            $raf->Seek($len, 1) or $err = 'Seek error', last;
+        }
+        $raf->Read($buff, 32) == 32 or $err = 'Unexpected end of file', last;
+        unless ($buff =~ /^\Q$objectTrailerGUID/) {
+            $err = 'Invalid object trailer';
+            last;
+        }
+        if ($outfile) {
+            # make sure object UID and ClassID are the same in the trailer
+            substr($hdr,16,8) eq substr($buff,16,8) or $err = 'Non-matching object trailer', last;
+            # write object trailer
+            Write($outfile, $objectTrailerGUID, substr($hdr,16)) or $err = 1, last;
+            $writeLen += 32;
+        }
+    }
+    if ($outfile) {
+        # write null padding if necessary
+        # (InDesign files must be an even number of 4096-byte blocks)
+        my $part = $writeLen % 4096;
+        Write($outfile, "\0" x (4096 - $part)) or $err = 1 if $part;
+    }
+DONE:
+    if (not $err) {
+        $exifTool->Warn('No XMP stream to edit') if $outfile and not $foundXMP;
+        return 1;       # success!
+    } elsif (not $outfile) {
+        # issue warning on read error
+        $exifTool->Warn($err) unless $err eq '1';
+    } elsif ($err ne '1') {
+        # set error and return success code
+        $exifTool->Error($err);
+    } else {
+        return -1;      # write error
+    }
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::InDesign - Read/write meta information in Adobe InDesign files
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains routines required by Image::ExifTool to read XMP
+meta information from Adobe InDesign (.IND, .INDD and .INDT) files.
+
+=head1 LIMITATIONS
+
+1) Only XMP meta information is processed.
+
+2) A new XMP stream may not be created, so XMP tags may only be written to
+InDesign files which previously contained XMP.
+
+3) File sizes of greater than 2 GB and are not currently supported because
+the ability to handle large files like this is system dependent.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart3.pdf>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/JPEG.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/JPEG.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/JPEG.pm	(revision 24799)
@@ -0,0 +1,569 @@
+#------------------------------------------------------------------------------
+# File:         JPEG.pm
+#
+# Description:  Definitions for uncommon JPEG segments
+#
+# Revisions:    10/06/2006 - P. Harvey Created
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::JPEG;
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.13';
+
+sub ProcessScalado($$$);
+sub ProcessOcad($$$);
+
+# (this main JPEG table is for documentation purposes only)
+%Image::ExifTool::JPEG::Main = (
+    NOTES => 'This table lists information extracted by ExifTool from JPEG images.',
+    APP0 => [{
+        Name => 'JFIF',
+        Condition => '$$valPt =~ /^JFIF\0/',
+        SubDirectory => { TagTable => 'Image::ExifTool::JFIF::Main' },
+      }, {
+        Name => 'JFXX',
+        Condition => '$$valPt =~ /^JFXX\0\x10/',
+        SubDirectory => { TagTable => 'Image::ExifTool::JFIF::Extension' },
+      }, {
+        Name => 'CIFF',
+        Condition => '$$valPt =~ /^(II|MM).{4}HEAPJPGM/s',
+        SubDirectory => { TagTable => 'Image::ExifTool::CanonRaw::Main' },
+      }, {
+        Name => 'AVI1',
+        Condition => '$$valPt =~ /^AVI1/',
+        SubDirectory => { TagTable => 'Image::ExifTool::JPEG::AVI1' },
+      }, {
+        Name => 'Ocad',
+        Condition => '$$valPt =~ /^Ocad/',
+        SubDirectory => { TagTable => 'Image::ExifTool::JPEG::Ocad' },
+    }],
+    APP1 => [{
+        Name => 'EXIF',
+        Condition => '$$valPt =~ /^Exif\0/',
+        SubDirectory => { TagTable => 'Image::ExifTool::Exif::Main' },
+      }, {
+        Name => 'ExtendedXMP',
+        Condition => '$$valPt =~ m{^http://ns.adobe.com/xmp/extension/\0}',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' },
+      }, {
+        Name => 'XMP',
+        Condition => '$$valPt =~ /^http/ or $$valPt =~ /<exif:/',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' },
+      }, {
+        Name => 'QVCI',
+        Condition => '$$valPt =~ /^QVCI\0/',
+        SubDirectory => { TagTable => 'Image::ExifTool::Casio::QVCI' },
+    }],
+    APP2 => [{
+        Name => 'ICC_Profile',
+        Condition => '$$valPt =~ /^ICC_PROFILE\0/',
+        SubDirectory => { TagTable => 'Image::ExifTool::ICC_Profile::Main' },
+      }, {
+        Name => 'FPXR',
+        Condition => '$$valPt =~ /^FPXR\0/',
+        SubDirectory => { TagTable => 'Image::ExifTool::FlashPix::Main' },
+      }, {
+        Name => 'MPF',
+        Condition => '$$valPt =~ /^MPF\0/',
+        SubDirectory => { TagTable => 'Image::ExifTool::MPF::Main' },
+      }, {
+        Name => 'PreviewImage',
+        Condition => '$$valPt =~ /^\xff\xd8\xff\xdb/',
+        Notes => 'Samsung large preview',
+    }],
+    APP3 => [{
+        Name => 'Meta',
+        Condition => '$$valPt =~ /^(Meta|META|Exif)\0\0/',
+        SubDirectory => { TagTable => 'Image::ExifTool::Kodak::Meta' },
+      }, {
+        Name => 'Stim',
+        Condition => '$$valPt =~ /^Stim\0/',
+        SubDirectory => { TagTable => 'Image::ExifTool::Stim::Main' },
+      }, {
+        Name => 'PreviewImage', # (written by HP R837 and Samsung S1060)
+        Condition => '$$valPt =~ /^\xff\xd8\xff\xdb/',
+        Notes => 'Hewlett-Packard or Samsung preview image',
+    }],
+    APP4 => [{
+        Name => 'Scalado',
+        Condition => '$$valPt =~ /^SCALADO\0/',
+        SubDirectory => { TagTable => 'Image::ExifTool::JPEG::Scalado' },
+      }, {
+        Name => 'FPXR', # (non-standard location written by some HP models)
+        Condition => '$$valPt =~ /^FPXR\0/',
+        SubDirectory => { TagTable => 'Image::ExifTool::FlashPix::Main' },
+      }, {
+        Name => 'PreviewImage', # (written by S1060)
+        Notes => 'Continued Samsung preview from APP3',
+    }],
+    APP5 => {
+        Name => 'RMETA',
+        Condition => '$$valPt =~ /^RMETA\0/',
+        SubDirectory => { TagTable => 'Image::ExifTool::Ricoh::RMETA' },
+    },
+    APP6 => [{
+        Name => 'EPPIM',
+        Condition => '$$valPt =~ /^EPPIM\0/',
+        SubDirectory => { TagTable => 'Image::ExifTool::JPEG::EPPIM' },
+      }, {
+        Name => 'NITF',
+        Condition => '$$valPt =~ /^NTIF\0/',
+        SubDirectory => { TagTable => 'Image::ExifTool::JPEG::NITF' },
+      }, {
+        Name => 'HP_TDHD', # (written by R837)
+        Condition => '$$valPt =~ /^TDHD\x01\0\0\0/',
+        SubDirectory => { TagTable => 'Image::ExifTool::HP::TDHD' },
+    }],
+    APP8 => {
+        Name => 'SPIFF',
+        Condition => '$$valPt =~ /^SPIFF\0/',
+        SubDirectory => { TagTable => 'Image::ExifTool::JPEG::SPIFF' },
+    },
+    APP10 => {
+        Name => 'Comment',
+        Condition => '$$valPt =~ /^UNICODE\0/',
+        Notes => 'PhotoStudio Unicode comment',
+    },
+    APP12 => [{
+        Name => 'PictureInfo',
+        Condition => '$$valPt =~ /(\[picture info\]|Type=)/',
+        SubDirectory => { TagTable => 'Image::ExifTool::APP12::PictureInfo' },
+      }, {
+        Name => 'Ducky',
+        Condition => '$$valPt =~ /^Ducky/',
+        SubDirectory => { TagTable => 'Image::ExifTool::APP12::Ducky' },
+    }],
+    APP13 => [{
+        Name => 'Photoshop',
+        Condition => '$$valPt =~ /^(Photoshop 3.0\0|Adobe_Photoshop2.5)/',
+        SubDirectory => { TagTable => 'Image::ExifTool::Photoshop::Main' },
+    }, {
+        Name => 'Adobe_CM',
+        Condition => '$$valPt =~ /^Adobe_CM/',
+        SubDirectory => { TagTable => 'Image::ExifTool::JPEG::AdobeCM' },
+    }],
+    APP14 => {
+        Name => 'Adobe',
+        Condition => '$$valPt =~ /^Adobe/',
+        SubDirectory => { TagTable => 'Image::ExifTool::JPEG::Adobe' },
+    },
+    APP15 => {
+        Name => 'GraphicConverter',
+        Condition => '$$valPt =~ /^Q\s*(\d+)/',
+        SubDirectory => { TagTable => 'Image::ExifTool::JPEG::GraphConv' },
+    },
+    COM => {
+        Name => 'Comment',
+        # note: flag as writable for documentation, but it won't show up
+        # in the TagLookup as writable because there is no WRITE_PROC
+        Writable => 1,
+    },
+    SOF => {
+        Name => 'StartOfFrame',
+        SubDirectory => { TagTable => 'Image::ExifTool::JPEG::SOF' },
+    },
+    DQT => {
+        Name => 'DefineQuantizationTable',
+        Notes => 'used to calculate the Extra:JPEGDigest tag value',
+    },
+    Trailer => [{
+        Name => 'AFCP',
+        Condition => '$$valPt =~ /AXS(!|\*).{8}$/s',
+        SubDirectory => { TagTable => 'Image::ExifTool::AFCP::Main' },
+      }, {
+        Name => 'CanonVRD',
+        Condition => '$$valPt =~ /CANON OPTIONAL DATA\0.{44}$/s',
+        SubDirectory => { TagTable => 'Image::ExifTool::CanonVRD::Main' },
+      }, {
+        Name => 'FotoStation',
+        Condition => '$$valPt =~ /\xa1\xb2\xc3\xd4$/',
+        SubDirectory => { TagTable => 'Image::ExifTool::FotoStation::Main' },
+      }, {
+        Name => 'PhotoMechanic',
+        Condition => '$$valPt =~ /cbipcbbl$/',
+        SubDirectory => { TagTable => 'Image::ExifTool::PhotoMechanic::Main' },
+      }, {
+        Name => 'MIE',
+        Condition => q{
+            $$valPt =~ /~\0\x04\0zmie~\0\0\x06.{4}[\x10\x18]\x04$/s or
+            $$valPt =~ /~\0\x04\0zmie~\0\0\x0a.{8}[\x10\x18]\x08$/s
+        },
+        SubDirectory => { TagTable => 'Image::ExifTool::MIE::Main' },
+      }, {
+        Name => 'PreviewImage',
+        Condition => '$$valPt =~ /^\xff\xd8\xff/',
+        Writable => 1,  # (for docs only)
+    }],
+);
+
+# EPPIM APP6 (Toshiba PrintIM) segment (ref PH, from PDR-M700 samples)
+%Image::ExifTool::JPEG::EPPIM = (
+    GROUPS => { 0 => 'APP6', 1 => 'EPPIM', 2 => 'Image' },
+    NOTES => q{
+        APP6 is used in by the Toshiba PDR-M700 to store a TIFF structure containing
+        PrintIM information.
+    },
+    0xc4a5 => {
+        Name => 'PrintIM',
+        # must set Writable here so this tag will be saved with MakerNotes option
+        Writable => 'undef',
+        Description => 'Print Image Matching',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::PrintIM::Main',
+        },
+    },
+);
+
+# SPIFF APP8 segment.  Refs:
+# 1) http://www.fileformat.info/format/spiff/
+# 2) http://www.jpeg.org/public/spiff.pdf
+%Image::ExifTool::JPEG::SPIFF = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'APP8', 1 => 'SPIFF', 2 => 'Image' },
+    NOTES => q{
+        This information is found in APP8 of SPIFF-style JPEG images (the "official"
+        yet rarely used JPEG file format standard: Still Picture Interchange File
+        Format).  See L<http://www.jpeg.org/public/spiff.pdf> for the official
+        specification.
+    },
+    0 => {
+        Name => 'SPIFFVersion',
+        Format => 'int8u[2]',
+        PrintConv => '$val =~ tr/ /./; $val',
+    },
+    2 => {
+        Name => 'ProfileID',
+        PrintConv => {
+            0 => 'Not Specified',
+            1 => 'Continuous-tone Base',
+            2 => 'Continuous-tone Progressive',
+            3 => 'Bi-level Facsimile',
+            4 => 'Continuous-tone Facsimile',
+        },
+    },
+    3 => 'ColorComponents',
+    6 => {
+        Name => 'ImageHeight',
+        Notes => q{
+            at index 4 in specification, but there are 2 extra bytes here in my only
+            SPIFF sample, version 1.2
+        },
+        Format => 'int32u',
+    },
+    10 => {
+        Name => 'ImageWidth',
+        Format => 'int32u',
+    },
+    14 => {
+        Name => 'ColorSpace',
+        PrintConv => {
+            0 => 'Bi-level',
+            1 => 'YCbCr, ITU-R BT 709, video',
+            2 => 'No color space specified',
+            3 => 'YCbCr, ITU-R BT 601-1, RGB',
+            4 => 'YCbCr, ITU-R BT 601-1, video',
+            8 => 'Gray-scale',
+            9 => 'PhotoYCC',
+            10 => 'RGB',
+            11 => 'CMY',
+            12 => 'CMYK',
+            13 => 'YCCK',
+            14 => 'CIELab',
+        },
+    },
+    15 => 'BitsPerSample',
+    16 => {
+        Name => 'Compression',
+        PrintConv => {
+            0 => 'Uncompressed, interleaved, 8 bits per sample',
+            1 => 'Modified Huffman',
+            2 => 'Modified READ',
+            3 => 'Modified Modified READ',
+            4 => 'JBIG',
+            5 => 'JPEG',
+        },
+    },
+    17 => {
+        Name => 'ResolutionUnit',
+        PrintConv => {
+            0 => 'None',
+            1 => 'inches',
+            2 => 'cm',
+        },
+    },
+    18 => {
+        Name => 'YResolution',
+        Format => 'int32u',
+    },
+    22 => {
+        Name => 'XResolution',
+        Format => 'int32u',
+    },
+);
+
+# AdobeCM APP13 (no references)
+%Image::ExifTool::JPEG::AdobeCM = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'APP13', 1 => 'AdobeCM', 2 => 'Image' },
+    NOTES => q{
+        The "Adobe_CM" APP13 segment presumably contains color management
+        information, but the meaning of the data is currently unknown.  If anyone
+        has an idea about what this means, please let me know.
+    },
+    FORMAT => 'int16u',
+    0 => 'AdobeCMType',
+);
+
+# Adobe APP14 refs:
+# http://partners.adobe.com/public/developer/en/ps/sdk/5116.DCT_Filter.pdf
+# http://java.sun.com/j2se/1.5.0/docs/api/javax/imageio/metadata/doc-files/jpeg_metadata.html#color
+%Image::ExifTool::JPEG::Adobe = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'APP14', 1 => 'Adobe', 2 => 'Image' },
+    NOTES => 'The "Adobe" APP14 segment stores image encoding information for DCT filters.',
+    FORMAT => 'int16u',
+    0 => 'DCTEncodeVersion',
+    1 => {
+        Name => 'APP14Flags0',
+        PrintConv => { BITMASK => {
+            15 => 'Encoded with Blend=1 downsampling'
+        } },
+    },
+    2 => {
+        Name => 'APP14Flags1',
+        PrintConv => { BITMASK => { } },
+    },
+    3 => {
+        Name => 'ColorTransform',
+        Format => 'int8u',
+        PrintConv => {
+            0 => 'Unknown (RGB or CMYK)',
+            1 => 'YCbCr',
+            2 => 'YCCK',
+        },
+    },
+);
+
+# GraphicConverter APP15 (ref PH)
+%Image::ExifTool::JPEG::GraphConv = (
+    GROUPS => { 0 => 'APP15', 1 => 'GraphConv', 2 => 'Image' },
+    NOTES => 'APP15 is used by GraphicConverter to store JPEG quality.',
+    'Q' => 'Quality',
+);
+
+# AVI1 APP0 segment (ref http://www.schnarff.com/file-formats/bmp/BMPDIB.TXT)
+%Image::ExifTool::JPEG::AVI1 = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'APP0', 1 => 'AVI1', 2 => 'Image' },
+    NOTES => 'This information may be found in APP0 of JPEG image data from AVI videos.',
+    FIRST_ENTRY => 0,
+    0 => {
+        Name => 'InterleavedField',
+        PrintConv => {
+            0 => 'Not Interleaved',
+            1 => 'Odd',
+            2 => 'Even',
+        },
+    },    
+);
+
+# Ocad APP0 segment (ref PH)
+%Image::ExifTool::JPEG::Ocad = (
+    PROCESS_PROC => \&ProcessOcad,
+    GROUPS => { 0 => 'APP0', 1 => 'Ocad', 2 => 'Image' },
+    FIRST_ENTRY => 0,
+    NOTES => q{
+        Tags extracted from the JPEG APP0 "Ocad" segment (found in Photobucket
+        images).
+    },
+    Rev => {
+        Name => 'OcadRevision',
+        Format => 'string[6]',
+    }
+);
+
+# NITF APP6 segment (National Imagery Transmission Format)
+# ref http://www.gwg.nga.mil/ntb/baseline/docs/n010697/bwcguide25aug98.pdf
+%Image::ExifTool::JPEG::NITF = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'APP6', 1 => 'NITF', 2 => 'Image' },
+    NOTES => q{
+        Information in APP6 used by the National Imagery Transmission Format.  See
+        L<http://www.gwg.nga.mil/ntb/baseline/docs/n010697/bwcguide25aug98.pdf> for
+        the official specification.
+    },
+    0 => {
+        Name => 'NITFVersion',
+        Format => 'int8u[2]',
+        ValueConv => 'sprintf("%d.%.2d", split(" ",$val))',
+    },
+    2 => {
+        Name => 'ImageFormat',
+        ValueConv => 'chr($val)',
+        PrintConv => { B => 'IMode B' },
+    },
+    3 => {
+        Name => 'BlocksPerRow',
+        Format => 'int16u',
+    },
+    5 => {
+        Name => 'BlocksPerColumn',
+        Format => 'int16u',
+    },
+    7 => {
+        Name => 'ImageColor',
+        PrintConv => { 0 => 'Monochrome' },
+    },
+    8 => 'BitDepth',
+    9 => {
+        Name => 'ImageClass',
+        PrintConv => {
+            0 => 'General Purpose',
+            4 => 'Tactical Imagery',
+        },
+    },
+    10 => {
+        Name => 'JPEGProcess',
+        PrintConv => {
+            1 => 'Baseline sequential DCT, Huffman coding, 8-bit samples',
+            4 => 'Extended sequential DCT, Huffman coding, 12-bit samples',
+        },
+    },
+    11 => 'Quality',
+    12 => {
+        Name => 'StreamColor',
+        PrintConv => { 0 => 'Monochrome' },
+    },
+    13 => 'StreamBitDepth',
+    14 => {
+        Name => 'Flags',
+        Format => 'int32u',
+        PrintConv => 'sprintf("0x%x", $val)',
+    },
+);
+
+# information written by Scalado software (PhotoFusion maybe?)
+%Image::ExifTool::JPEG::Scalado = (
+    GROUPS => { 0 => 'APP4', 1 => 'Scalado', 2 => 'Image' },
+    PROCESS_PROC => \&ProcessScalado,
+    TAG_PREFIX => 'Scalado',
+    FORMAT => 'int32s',
+    # I presume this was written by 
+    NOTES => q{
+        Tags extracted from the JPEG APP4 "SCALADO" segment (presumably written by
+        Scalado mobile software, L<http://www.scalado.com/>).
+    },
+    SPMO => {
+        Name => 'DataLength',
+        Unkown => 1,
+    },
+    WDTH => {
+        Name => 'PreviewImageWidth',
+        ValueConv => '$val ? abs($val) : undef',
+    },
+    HGHT => {
+        Name => 'PreviewImageHeight',
+        ValueConv => '$val ? abs($val) : undef',
+    },
+    QUAL => {
+        Name => 'PreviewQuality',
+        ValueConv => '$val ? abs($val) : undef',
+    },
+    # tags not yet decoded with observed values:
+    # CHKH: 0, -9010
+    # CHKL: -2664, -12852
+    # CLEN: -1024
+    # CSPC: -2232593
+    # DATA: (+ve data length)
+    # HDEC: 0
+    # MAIN: 0
+    # SCI0: (+ve data length)
+    # SCX1: (+ve data length)
+    # WDEC: 0
+);
+
+#------------------------------------------------------------------------------
+# Extract information from the JPEG APP0 Ocad segment
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessOcad($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    $exifTool->VerboseDir('APP0 Ocad', undef, length $$dataPt);
+    for (;;) {
+        last unless $$dataPt =~ /\$(\w+):([^\0\$]+)/g;
+        my ($tag, $val) = ($1, $2);
+        $val =~ s/(^\s+|\s+$)//g;   # remove leading/trailing spaces
+        unless ($$tagTablePtr{$tag}) {
+            Image::ExifTool::AddTagToTable($tagTablePtr, $tag, { Name => "Ocad_$tag" });
+        }
+        $exifTool->HandleTag($tagTablePtr, $tag, $val);
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Extract information from the JPEG APP4 SCALADO segment
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessScalado($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $pos = 0;
+    my $end = length $$dataPt;
+    SetByteOrder('MM');
+    $exifTool->VerboseDir('APP4 SCALADO', undef, $end);
+    for (;;) {
+        last if $pos + 12 > $end;
+        my $tag = substr($$dataPt, $pos, 4);
+        my $unk = Get32u($dataPt, $pos + 4); # (what is this?)
+        $exifTool->HandleTag($tagTablePtr, $tag, undef,
+            DataPt  => $dataPt,
+            Start   => $pos + 8,
+            Size    => 4,
+            Extra   => ", unk $unk",
+        );
+        # shorten directory size by length of SPMO
+        $end -= Get32u($dataPt, $pos + 8) if $tag eq 'SPMO';
+        $pos += 12;
+    }
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::JPEG - Definitions for uncommon JPEG segments
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool for some
+uncommon JPEG segments.  For speed reasons, definitions for more common JPEG
+segments are included in the Image::ExifTool module itself.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/JPEG Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/JPEGDigest.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/JPEGDigest.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/JPEGDigest.pm	(revision 24799)
@@ -0,0 +1,2511 @@
+#------------------------------------------------------------------------------
+# File:         JPEGDigest.pm
+#
+# Description:  Lookup for JPEGDigest values
+#
+# Revisions:    2008/09/15 - P. Harvey Created
+#
+# References:   JD) Jens Duttke
+#               2) Franz Buchinger private communication
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::JPEGDigest;
+use strict;
+use vars qw($VERSION);
+
+$VERSION = '1.02';
+
+# the print conversion for the JPEGDigest tag
+my %PrintConv = ( #JD
+    # No DQT defined
+    'd41d8cd98f00b204e9800998ecf8427e' => 'No DQT defined',
+
+    # Tested with:
+    # - Independent JPEG Group library (used by many applications) X3 (Win)
+    #   - Different subsamplings possible
+    # - Dynamic Photo HDR 3.0 (Win)
+    #   - Fixed to quality 92?
+    #   - Fixed subsampling of 111111?
+    # - FixFoto (Win)
+    #   - These DQTs are only used for the Quality settings 24 to 100
+    #   - Different subsamplings possible
+    #   - Subsampling of 221111 is default
+    # - GraphicConverter 4.4.4 (Mac)
+    #   - Using the JPEG 6.0 library
+    #   - Fixed subsampling to 221111
+    # - IrfanView 4.10 (Win)
+    #   - Subsampling 111111 with option "Disable subsampling", otherwise 221111
+    #   - Quality mode 0 doesn't exist here
+    # - Jasc Paint Shop Pro Version 5.01 (Win)
+    #   - Fixed subsampling of 221111
+    #   - Use reversed Quality values (0 or 1 = 99; 2 = 98; 3 = 97 etc.)
+    # - Microsoft GDI+ Version 5.1.3102.2180 (Win)
+    #   - Fixed subsampling of 221111 (or is that just the default subsampling?)
+    # - Photomatix pro 3.0 (Win)
+    #   - Fixed subsampling to 221111
+
+    # IJG library
+    'f83c5bc303fa1f74265863c2c6844edf' => 'Independent JPEG Group library (used by many applications), Quality 0 or 1',
+    '1e81ee25c96cdf46f44a9b930780f8c0' => 'Independent JPEG Group library (used by many applications), Quality 2',
+    '205d4a597e68f2da78137e52f39d2728' => 'Independent JPEG Group library (used by many applications), Quality 3',
+    '81a936d8371a7d59da428fcfc349850f' => 'Independent JPEG Group library (used by many applications), Quality 4',
+    '610772f3cf75c2fd89214fafbd7617a6' => 'Independent JPEG Group library (used by many applications), Quality 5',
+    '577ec8895d884612d064771e84cf231f' => 'Independent JPEG Group library (used by many applications), Quality 6',
+    '7dc25cc528116e25dd1aeb590dd7cb66' => 'Independent JPEG Group library (used by many applications), Quality 7',
+    'e3cc8a85db1a32e81650b9668b98644a' => 'Independent JPEG Group library (used by many applications), Quality 8',
+    'e2408846813c1f5c7f5ce3cf69e741c4' => 'Independent JPEG Group library (used by many applications), Quality 9',
+    'e800426d2ef8d3cda13a0b41f1b2cc5a' => 'Independent JPEG Group library (used by many applications), Quality 10',
+    '8ef467e72e5006d1b48209e7b5d94541' => 'Independent JPEG Group library (used by many applications), Quality 11',
+    'af6a08d0742aa8ed6bae2f1c374e7931' => 'Independent JPEG Group library (used by many applications), Quality 12',
+    'e002d9728c73f60e4d0509e1cea9af43' => 'Independent JPEG Group library (used by many applications), Quality 13',
+    '1eb8b98bef8b062e4bc10cffea2d8372' => 'Independent JPEG Group library (used by many applications), Quality 14',
+    '99d933a8a9ece6f2ee65757aa81ef5bd' => 'Independent JPEG Group library (used by many applications), Quality 15',
+    'c7d0f7dee5631d01bc55b7c598805d98' => 'Independent JPEG Group library (used by many applications), Quality 16',
+    '71555bee8d64c9dfca3cefa9dd332472' => 'Independent JPEG Group library (used by many applications), Quality 17',
+    '5009778c2a1df1deeb040c85fb9d0db2' => 'Independent JPEG Group library (used by many applications), Quality 18',
+    '81339d89e8294729c69fc096f1a448f3' => 'Independent JPEG Group library (used by many applications), Quality 19',
+    '82028a770d9e45d64d6aa26faee97e72' => 'Independent JPEG Group library (used by many applications), Quality 20',
+    '3ebb7aa9113b3e1628f55732de7dae7f' => 'Independent JPEG Group library (used by many applications), Quality 21',
+    '704c1868fe865f1038aa2bd0697f71a0' => 'Independent JPEG Group library (used by many applications), Quality 22',
+    '555fd108ab97e641fcfefee4bda6a306' => 'Independent JPEG Group library (used by many applications), Quality 23',
+    'f1d9a0410c5ea11613569783625f5cf3' => 'Independent JPEG Group library (used by many applications), Quality 24',
+    'ce378a14d52ee5752ded23b5a444f75e' => 'Independent JPEG Group library (used by many applications), Quality 25',
+    '3f243aacd371617b69f1e1eacadbbe2e' => 'Independent JPEG Group library (used by many applications), Quality 26',
+    'c70a1df73760a88deb890003cdab3bfe' => 'Independent JPEG Group library (used by many applications), Quality 27',
+    'aa5e05f96c53f6bc498f5016b1113651' => 'Independent JPEG Group library (used by many applications), Quality 28',
+    '740d4a06f4d0f774c6aac95719673793' => 'Independent JPEG Group library (used by many applications), Quality 29',
+    '1426dd9c1c8098936f395e201f1eb56d' => 'Independent JPEG Group library (used by many applications), Quality 30',
+    '891a53bb6a5261a2c076cf8931c3660e' => 'Independent JPEG Group library (used by many applications), Quality 31',
+    '1c87cb13f4b7a5ed45b09fc4f0e52d68' => 'Independent JPEG Group library (used by many applications), Quality 32',
+    '2457f78378c5efdac8e1ef619a4285cd' => 'Independent JPEG Group library (used by many applications), Quality 33',
+    '20f79a557d4edb1917d243d00a7a9ba8' => 'Independent JPEG Group library (used by many applications), Quality 34',
+    'e06d44ffef23792c88f215a5b2ed9478' => 'Independent JPEG Group library (used by many applications), Quality 35',
+    'df1b50991b82b66c82dc856cf82383da' => 'Independent JPEG Group library (used by many applications), Quality 36',
+    'ffd6e30af6d99997d38ec3e303687e25' => 'Independent JPEG Group library (used by many applications), Quality 37',
+    'ed923fdb1e5009215a49c0d92061c3b0' => 'Independent JPEG Group library (used by many applications), Quality 38',
+    'aaf1ebc6949569327f95cf7da78ee7bc' => 'Independent JPEG Group library (used by many applications), Quality 39',
+    '0fe5225afaf055efd8453426c00e81e1' => 'Independent JPEG Group library (used by many applications), Quality 40',
+    'a79e66299883be78b02ceaaf9159c320' => 'Independent JPEG Group library (used by many applications), Quality 41',
+    'c9f10fb6d352cc8a8967e7e96a64862c' => 'Independent JPEG Group library (used by many applications), Quality 42',
+    '6dc3abbdd52b2f26b790ddb33b82099a' => 'Independent JPEG Group library (used by many applications), Quality 43',
+    '29572be1991c210fabacaeb658a74844' => 'Independent JPEG Group library (used by many applications), Quality 44',
+    '0c9f89a3728234e0e85645c968d1d84a' => 'Independent JPEG Group library (used by many applications), Quality 45',
+    'a5e5355ae60c569dec306eb971a49276' => 'Independent JPEG Group library (used by many applications), Quality 46',
+    '4a2605b7c5b1bc99b6715342de7b6562' => 'Independent JPEG Group library (used by many applications), Quality 47',
+    '6af4053465275c1b1b2d5c97f4d841aa' => 'Independent JPEG Group library (used by many applications), Quality 48',
+    '905a0b1688644902f6a65d872d68a9db' => 'Independent JPEG Group library (used by many applications), Quality 49',
+    'ffcd5eab8daeced571d59d4cdcc002c4' => 'Independent JPEG Group library (used by many applications), Quality 50',
+    '76806382fa57818da2e406a0dc23ce20' => 'Independent JPEG Group library (used by many applications), Quality 51',
+    '7c71a5eb9408b93be3ea6cf9be1d31ea' => 'Independent JPEG Group library (used by many applications), Quality 52',
+    'ccf3f63196092667f97c2ff723481a21' => 'Independent JPEG Group library (used by many applications), Quality 53',
+    'acc5e596cc4eb156b83eb89190b289a7' => 'Independent JPEG Group library (used by many applications), Quality 54',
+    'a16e53aa41aa66124557c0b976d73734' => 'Independent JPEG Group library (used by many applications), Quality 55',
+    '2101fdf5c6f6e92943bc16ccf8aa46a8' => 'Independent JPEG Group library (used by many applications), Quality 56',
+    'aaa2026d750590e466d9198f20b888e4' => 'Independent JPEG Group library (used by many applications), Quality 57',
+    'fcd8c97cf6004230444ce21dab8a167f' => 'Independent JPEG Group library (used by many applications), Quality 58',
+    '318081abf5329c90d984c2214d69f097' => 'Independent JPEG Group library (used by many applications), Quality 59',
+    '95348adff2bf5a88f3967e9237fc571e' => 'Independent JPEG Group library (used by many applications), Quality 60; Pentax Better',
+    'e22b26930415798b7ecf2b060c1cdc2a' => 'Independent JPEG Group library (used by many applications), Quality 61',
+    '3e646bfadb62d25ae8404b179e93e74e' => 'Independent JPEG Group library (used by many applications), Quality 62',
+    '34bf5c46342f2a514f8ae562e520ece0' => 'Independent JPEG Group library (used by many applications), Quality 63',
+    'fc9f2bd278075ea89d482e1f9e66738f' => 'Independent JPEG Group library (used by many applications), Quality 64',
+    'b55f27c368f119f25957c8e0036b27f8' => 'Independent JPEG Group library (used by many applications), Quality 65',
+    '5f7b9af6d66eaf12874aa680e7b0d31b' => 'Independent JPEG Group library (used by many applications), Quality 66',
+    'a78fd0f1183b268b2fdfa23308c3ad44' => 'Independent JPEG Group library (used by many applications), Quality 67',
+    '61814a2eca233e10b0ba26881551fb50' => 'Independent JPEG Group library (used by many applications), Quality 68',
+    'ce0f36a3d870b24f9816634000ea2d2e' => 'Independent JPEG Group library (used by many applications), Quality 69',
+    'f7cba1affebd362a322abd45ce580e56' => 'Independent JPEG Group library (used by many applications), Quality 70',
+    '7b85fffdf97680de53e49788712c50de' => 'Independent JPEG Group library (used by many applications), Quality 71',
+    '4abd7dbca7735c987eb899b0f8646ce4' => 'Independent JPEG Group library (used by many applications), Quality 72',
+    '167959a11aff7940df84ed9f3379ed0a' => 'Independent JPEG Group library (used by many applications), Quality 73',
+    'd61807da54a72c4651466049c9f67541' => 'Independent JPEG Group library (used by many applications), Quality 74',
+    '2851eea5e15f1b977c1496a77c884b4f' => 'Independent JPEG Group library (used by many applications), Quality 75',
+    'b095631a0665a515d9aa290639f6672b' => 'Independent JPEG Group library (used by many applications), Quality 76',
+    '0ee4ea4687d3c57d060e3afd2559b7bb' => 'Independent JPEG Group library (used by many applications), Quality 77',
+    '37e999828e5bc43ee4a470bf29ea97b7' => 'Independent JPEG Group library (used by many applications), Quality 78',
+    'dd9b9d09a624deab730d9bd5b8825baa' => 'Independent JPEG Group library (used by many applications), Quality 79',
+    '5319a82dc93c1ee5c8d2265e4f1fb60e' => 'Independent JPEG Group library (used by many applications), Quality 80',
+    '6fa04ba1184e986c4da3df8141e05a42' => 'Independent JPEG Group library (used by many applications), Quality 81',
+    '1d099901cfe37674e4aeb2cdbddf0703' => 'Independent JPEG Group library (used by many applications), Quality 82',
+    '8cc04e05813c028683e3cb8e6eab79eb' => 'Independent JPEG Group library (used by many applications), Quality 83',
+    '3eafbf05c0dd233b385856065e456c11' => 'Independent JPEG Group library (used by many applications), Quality 84',
+    '98dec36fe95ed7c1772d9ed67a67e260' => 'Independent JPEG Group library (used by many applications), Quality 85',
+    'a1ee06d19dcb62c7467768d1ba73cf12' => 'Independent JPEG Group library (used by many applications), Quality 86',
+    '643ad95753c261eacc5ea3f4c9e4d469' => 'Independent JPEG Group library (used by many applications), Quality 87',
+    '2557828257dd798ad636df350c685a26' => 'Independent JPEG Group library (used by many applications), Quality 88',
+    'a5b4bbf018828a3d00e54ab72a175fdc' => 'Independent JPEG Group library (used by many applications), Quality 89',
+    '50325a7b6e0a9b7f9aea8f5a6f7f31aa' => 'Independent JPEG Group library (used by many applications), Quality 90',
+    'c0cf6b0c508a35a13acd8c912548a269' => 'Independent JPEG Group library (used by many applications), Quality 91',
+    'ff0aa07a220cd8973a4b86f3ecd4325b' => 'Independent JPEG Group library (used by many applications), Quality 92',
+    'f251d4554524d22f94a34668ab17957c' => 'Independent JPEG Group library (used by many applications), Quality 93',
+    'cd993be55bad60bb539df0cc2d7f9f6f' => 'Independent JPEG Group library (used by many applications), Quality 94',
+    'adf507352f9ce218a4605700459d597f' => 'Independent JPEG Group library (used by many applications), Quality 95',
+    '9e9e3e22af4e41ea4ec1b8f656f28f42' => 'Independent JPEG Group library (used by many applications), Quality 96',
+    'b9f5c003ef62cbd8fc93be6679c1c3bc' => 'Independent JPEG Group library (used by many applications), Quality 97',
+    '95b6a316836182441b12039279872ec3' => 'Independent JPEG Group library (used by many applications), Quality 98',
+    'b9b1ce23552e2f82b95b48de20065ed3' => 'Independent JPEG Group library (used by many applications), Quality 99',
+    'a97591462e9b2339efd4f88ca97bb471' => 'Independent JPEG Group library (used by many applications), Quality 100',
+
+    # Independent JPEG Group library (Grayscale)
+    #
+    # Tested with:
+    # - Corel PhotoImpact X3 (Win)
+    # - IrfanView (Win)
+    #   - Quality mode 0 doesn't exist here
+    '185893c53196f6156d458a84e1135c43:11' => 'Independent JPEG Group library (used by many applications), Quality 0 or 1 (Grayscale)',
+    'b41ccbe66e41a05de5e68832c07969a7:11' => 'Independent JPEG Group library (used by many applications), Quality 2 (Grayscale)',
+    'efa024d741ecc5204e7edd4f590a7a25:11' => 'Independent JPEG Group library (used by many applications), Quality 3 (Grayscale)',
+    '3396344724a1868ada2330ebaeb9448e:11' => 'Independent JPEG Group library (used by many applications), Quality 4 (Grayscale)',
+    '14276fffb98deb42b7dbce30abb8425f:11' => 'Independent JPEG Group library (used by many applications), Quality 5 (Grayscale)',
+    'a99e2826c10d0922ce8942c5437f53a6:11' => 'Independent JPEG Group library (used by many applications), Quality 6 (Grayscale)',
+    '0d3de456aa5cbb8a2578208250aa9b88:11' => 'Independent JPEG Group library (used by many applications), Quality 7 (Grayscale)',
+    'fa987940fdedbe883cc0e9fcc907f89e:11' => 'Independent JPEG Group library (used by many applications), Quality 8 (Grayscale)',
+    '1c9bb67190ee64e82d3c67f7943bf4a4:11' => 'Independent JPEG Group library (used by many applications), Quality 9 (Grayscale)',
+    '57d20578d190b04c7667b10d3df241bb:11' => 'Independent JPEG Group library (used by many applications), Quality 10 (Grayscale)',
+    '619fd49197f0403ce13d86cffec46419:11' => 'Independent JPEG Group library (used by many applications), Quality 11 (Grayscale)',
+    '327f47dd8f999b2bbb3bb25c43cf5be5:11' => 'Independent JPEG Group library (used by many applications), Quality 12 (Grayscale)',
+    'e4e5bc705c40cfaffff6565f16fe98a9:11' => 'Independent JPEG Group library (used by many applications), Quality 13 (Grayscale)',
+    '6c64fa9ad302624a826f04ecc80459be:11' => 'Independent JPEG Group library (used by many applications), Quality 14 (Grayscale)',
+    '039a3f0e101f1bcdb6bb81478cf7ae6b:11' => 'Independent JPEG Group library (used by many applications), Quality 15 (Grayscale)',
+    'c23b08c94d7537c9447691d54ae1080c:11' => 'Independent JPEG Group library (used by many applications), Quality 16 (Grayscale)',
+    '200107bc0174104bbf1d4653c4b05058:11' => 'Independent JPEG Group library (used by many applications), Quality 17 (Grayscale)',
+    '72abfdc6e65b32ded2cd7ac77a04f447:11' => 'Independent JPEG Group library (used by many applications), Quality 18 (Grayscale)',
+    '1799a236c36da0b30729d9005ca7c7f9:11' => 'Independent JPEG Group library (used by many applications), Quality 19 (Grayscale)',
+    'c33a667bff7f590655d196010c5e39f3:11' => 'Independent JPEG Group library (used by many applications), Quality 20 (Grayscale)',
+    'b1dc98f6a2f8828f8432872da43e7d94:11' => 'Independent JPEG Group library (used by many applications), Quality 21 (Grayscale)',
+    '07318a0acfebe9086f0e04a4c4f5398a:11' => 'Independent JPEG Group library (used by many applications), Quality 22 (Grayscale)',
+    'a295b7163305f327a5a45ae177a0a19c:11' => 'Independent JPEG Group library (used by many applications), Quality 23 (Grayscale)',
+    'c741c1b134cf81ab69acc81f15a67137:11' => 'Independent JPEG Group library (used by many applications), Quality 24 (Grayscale)',
+    'a68893776502a591548c7b5bece13e1b:11' => 'Independent JPEG Group library (used by many applications), Quality 25 (Grayscale)',
+    '111848d9e41f6f408ef70841f90c0519:11' => 'Independent JPEG Group library (used by many applications), Quality 26 (Grayscale)',
+    '886374ceebcfd4dfed200b0b34b4baca:11' => 'Independent JPEG Group library (used by many applications), Quality 27 (Grayscale)',
+    '666dd95fd0e20f5c20bc44d78d528869:11' => 'Independent JPEG Group library (used by many applications), Quality 28 (Grayscale)',
+    '1aa58cb85dda84de2ddf436667124dcd:11' => 'Independent JPEG Group library (used by many applications), Quality 29 (Grayscale)',
+    '9d321ab2bdda6f3cb76d2d88838aa8c3:11' => 'Independent JPEG Group library (used by many applications), Quality 30 (Grayscale)',
+    '6ad87d648101c268f83fa379d4c773f2:11' => 'Independent JPEG Group library (used by many applications), Quality 31 (Grayscale)',
+    'cdf8e921300f27a4af7661a2de16e91a:11' => 'Independent JPEG Group library (used by many applications), Quality 32 (Grayscale)',
+    '3f48672e37b6dd2e571b222e4b7ff97d:11' => 'Independent JPEG Group library (used by many applications), Quality 33 (Grayscale)',
+    'a53a7d4cc86d01f4c1b867270c9c078f:11' => 'Independent JPEG Group library (used by many applications), Quality 34 (Grayscale)',
+    '09ec03f5096df106c692123f3fd34296:11' => 'Independent JPEG Group library (used by many applications), Quality 35 (Grayscale)',
+    'a946498fd1902c9de87a1f5182966742:11' => 'Independent JPEG Group library (used by many applications), Quality 36 (Grayscale)',
+    '5d650a1d38108fd79d4f336ba8e254c2:11' => 'Independent JPEG Group library (used by many applications), Quality 37 (Grayscale)',
+    '81d620f1b470fd535b26544b4ea20643:11' => 'Independent JPEG Group library (used by many applications), Quality 38 (Grayscale)',
+    '892788bdf8cbef5c6fbd7019a079bf8e:11' => 'Independent JPEG Group library (used by many applications), Quality 39 (Grayscale)',
+    'cf3929fd4c1e5c28b7f137f982178ad1:11' => 'Independent JPEG Group library (used by many applications), Quality 40 (Grayscale)',
+    '31f288945896ed839f1d936bff06fb03:11' => 'Independent JPEG Group library (used by many applications), Quality 41 (Grayscale)',
+    'e0c38f0c5e6562445d4e92bae51713be:11' => 'Independent JPEG Group library (used by many applications), Quality 42 (Grayscale)',
+    '18fa29d1164984883a6af76377b60d5a:11' => 'Independent JPEG Group library (used by many applications), Quality 43 (Grayscale)',
+    'eff737b226fbce48c42625c5bf9dabb6:11' => 'Independent JPEG Group library (used by many applications), Quality 44 (Grayscale)',
+    'b900f91ee8697255d5daebce858caaeb:11' => 'Independent JPEG Group library (used by many applications), Quality 45 (Grayscale)',
+    'ab2f8513823067af242f7e3c04a88a9c:11' => 'Independent JPEG Group library (used by many applications), Quality 46 (Grayscale)',
+    '60b682c4d412f5255efbaa32787c46ca:11' => 'Independent JPEG Group library (used by many applications), Quality 47 (Grayscale)',
+    'ea50813e06203c2ad1165252bcb99a1d:11' => 'Independent JPEG Group library (used by many applications), Quality 48 (Grayscale)',
+    'f6308a717437d3653b0751ebf511db0f:11' => 'Independent JPEG Group library (used by many applications), Quality 49 (Grayscale)',
+    '7c8242581553e818ef243fc680879a19:11' => 'Independent JPEG Group library (used by many applications), Quality 50 (Grayscale)',
+    'fc41ab8251718977bc6676f502f457e0:11' => 'Independent JPEG Group library (used by many applications), Quality 51 (Grayscale)',
+    '606c4c78c0226646bf4d3c5a5898fb17:11' => 'Independent JPEG Group library (used by many applications), Quality 52 (Grayscale)',
+    '0e6c6a5440d33d25f1c25836a45cfa69:11' => 'Independent JPEG Group library (used by many applications), Quality 53 (Grayscale)',
+    '7464b2361e5b5f5a9ba74a87475dda91:11' => 'Independent JPEG Group library (used by many applications), Quality 54 (Grayscale)',
+    'aeaa2ca48eabb3088ebb713b3c4e1a67:11' => 'Independent JPEG Group library (used by many applications), Quality 55 (Grayscale)',
+    '3f36450b0ba074578391e77f7340cef0:11' => 'Independent JPEG Group library (used by many applications), Quality 56 (Grayscale)',
+    'be232444027e83db6f8d8b79d078442e:11' => 'Independent JPEG Group library (used by many applications), Quality 57 (Grayscale)',
+    '712c145d6472a2b315b2ecfb916d1590:11' => 'Independent JPEG Group library (used by many applications), Quality 58 (Grayscale)',
+    'ae3dd4568cc71c47d068cf831c66b59d:11' => 'Independent JPEG Group library (used by many applications), Quality 59 (Grayscale)',
+    'b290e52c21a435fede4586636ef5e287:11' => 'Independent JPEG Group library (used by many applications), Quality 60 (Grayscale)',
+    'a09ca4c4391e0221396a08f229a65f9d:11' => 'Independent JPEG Group library (used by many applications), Quality 61 (Grayscale)',
+    '0818578fc5fc571b4f8d5ffefc9dc0d8:11' => 'Independent JPEG Group library (used by many applications), Quality 62 (Grayscale)',
+    '7c685e2916555eda34cb37a1e71adc6a:11' => 'Independent JPEG Group library (used by many applications), Quality 63 (Grayscale)',
+    '69c6b9440342adfc0db89a6c91aba332:11' => 'Independent JPEG Group library (used by many applications), Quality 64 (Grayscale)',
+    'd5d484b68e25b44288e67e699829695c:11' => 'Independent JPEG Group library (used by many applications), Quality 65 (Grayscale)',
+    'de8310d09116a7a62965f3e0e43ef525:11' => 'Independent JPEG Group library (used by many applications), Quality 66 (Grayscale)',
+    'e4735f63e88baf04599afc034e690845:11' => 'Independent JPEG Group library (used by many applications), Quality 67 (Grayscale)',
+    'b4ef810b14dee9c6d6d8cace98f799a6:11' => 'Independent JPEG Group library (used by many applications), Quality 68 (Grayscale)',
+    '52886ef80147c9a136e20b2bc3b76f52:11' => 'Independent JPEG Group library (used by many applications), Quality 69 (Grayscale)',
+    '9c62dbc848be82ef91219ba9843998be:11' => 'Independent JPEG Group library (used by many applications), Quality 70 (Grayscale)',
+    'bfe8c1c73eea84b85673487a82f67627:11' => 'Independent JPEG Group library (used by many applications), Quality 71 (Grayscale)',
+    'ea445840d29c51009a2a8cd49b96ccee:11' => 'Independent JPEG Group library (used by many applications), Quality 72 (Grayscale)',
+    '71c1a56890fff9b0a095fa5a1c96132b:11' => 'Independent JPEG Group library (used by many applications), Quality 73 (Grayscale)',
+    'f080b02331ac8adf03de2281042d2b49:11' => 'Independent JPEG Group library (used by many applications), Quality 74 (Grayscale)',
+    'd0eaa368737f17f6037757d393a22599:11' => 'Independent JPEG Group library (used by many applications), Quality 75 (Grayscale)',
+    '303663905d055b77bb547fe0b0beb9c5:11' => 'Independent JPEG Group library (used by many applications), Quality 76 (Grayscale)',
+    '5cdf1d5bbe19375ad5c7237273dddede:11' => 'Independent JPEG Group library (used by many applications), Quality 77 (Grayscale)',
+    'd64e7ff8292fd77131932864d3c9ce7c:11' => 'Independent JPEG Group library (used by many applications), Quality 78 (Grayscale)',
+    '12b4cc13891c5aef3dadb3405b6fa65d:11' => 'Independent JPEG Group library (used by many applications), Quality 79 (Grayscale)',
+    'b008cd63591f8fd366f77d2b224b9c9c:11' => 'Independent JPEG Group library (used by many applications), Quality 80 (Grayscale)',
+    '49b6e472c7d5ecead593c6009768e765:11' => 'Independent JPEG Group library (used by many applications), Quality 81 (Grayscale)',
+    'bce6fa61623ad4f65ff3fec1528cb026:11' => 'Independent JPEG Group library (used by many applications), Quality 82 (Grayscale)',
+    'c2b037bf9f5e5baba804d7bbbb2dc73b:11' => 'Independent JPEG Group library (used by many applications), Quality 83 (Grayscale)',
+    '7fe7b339c6ffc62b984eeab4b0df9168:11' => 'Independent JPEG Group library (used by many applications), Quality 84 (Grayscale)',
+    '274bbeb0ac3939f90c578ebb1f5a9eef:11' => 'Independent JPEG Group library (used by many applications), Quality 85 (Grayscale)',
+    '0a0268c655d616b0e4af2851533aa3af:11' => 'Independent JPEG Group library (used by many applications), Quality 86 (Grayscale)',
+    '52318e260c0d6b3dbee85c87f9b94e63:11' => 'Independent JPEG Group library (used by many applications), Quality 87 (Grayscale)',
+    'b64cc19a0f81a506ed5bcfb9c131c8fe:11' => 'Independent JPEG Group library (used by many applications), Quality 88 (Grayscale)',
+    'd8c54333eb475b8db9f32f11fe96337e:11' => 'Independent JPEG Group library (used by many applications), Quality 89 (Grayscale)',
+    '12fe6b9bfd20f4d7f0ac2a221c566c45:11' => 'Independent JPEG Group library (used by many applications), Quality 90 (Grayscale)',
+    '12aefbf7689633c83da714c9f0e90e05:11' => 'Independent JPEG Group library (used by many applications), Quality 91 (Grayscale)',
+    'a3a96add050fc51a2b3ce59a9a491034:11' => 'Independent JPEG Group library (used by many applications), Quality 92 (Grayscale)',
+    '7b0242bd9aaeab4962f5d5b39b9a4027:11' => 'Independent JPEG Group library (used by many applications), Quality 93 (Grayscale)',
+    '12fc29c1d8940c93a47ee9d927a17561:11' => 'Independent JPEG Group library (used by many applications), Quality 94 (Grayscale)',
+    'e1fedef5184beeb7b0f5c055c7ae1d31:11' => 'Independent JPEG Group library (used by many applications), Quality 95 (Grayscale)',
+    'ae9202355f603776794d3e62c43578d6:11' => 'Independent JPEG Group library (used by many applications), Quality 96 (Grayscale)',
+    '36da00bae6cd81d1f97e32748c07e33f:11' => 'Independent JPEG Group library (used by many applications), Quality 97 (Grayscale)',
+    '54dc50b16e7cc9bc383eb9e73e85e199:11' => 'Independent JPEG Group library (used by many applications), Quality 98 (Grayscale)',
+    '23a59c4f9ec045faf9f8379b3ca302bb:11' => 'Independent JPEG Group library (used by many applications), Quality 99 (Grayscale)',
+    'bbd2dbcfe20b59e981e9a42cd1eb6ece:11' => 'Independent JPEG Group library (used by many applications), Quality 100 (Grayscale)',
+
+    # Tested with Adobe Photoshop Lightroom 1.4.1 (Win) - "Export"
+    '683506a889c78d9bc230a0c7ee5f62f3:221111' => 'Adobe Lightroom, Quality 0% - 7%',
+    'bc490651af6592cd1dbbbc4fa2cfa1fb:221111' => 'Adobe Lightroom, Quality 8% - 15%',
+    'ce4286d9f07999524c3c7472b065c5ab:221111' => 'Adobe Lightroom, Quality 16% - 23%',
+    'cbfbfef12aead8841585ef605c789b9f:221111' => 'Adobe Lightroom, Quality 24% - 30%',
+    'a0772e73dec2bdc4057c27da47bff376:221111' => 'Adobe Lightroom, Quality 31% - 38%',
+    '7ef06dbde538346b8b01c6b538ca70c6:221111' => 'Adobe Lightroom, Quality 39% - 46%',
+    '0ff225f58a214f79d1d85d78f6f5dab8:221111' => 'Adobe Lightroom, Quality 47% - 53%',
+    '8a8603650fa5ae5fdcf4b2eaf0b23638:111111' => 'Adobe Lightroom, Quality 54% - 61%',
+    '44f583ed6b65cb8ba915ec5df051616c:111111' => 'Adobe Lightroom, Quality 62% - 69%',
+    'de94c5591bafc7456ccaef430271b907:111111' => 'Adobe Lightroom, Quality 70% - 76%',
+    'a6841b35e9ffefa5d83a0445dddd2621:111111' => 'Adobe Lightroom, Quality 77% - 84%',
+    '6e3f6a3a5a1eae6155331d42d6f968dd:111111' => 'Adobe Lightroom, Quality 85% - 92%',
+    '5379e0133d4439b6f7c7039fc7f7734f:111111' => 'Adobe Lightroom, Quality 93% - 100%',
+
+    # Adobe Photoshop Lightroom 2.1 (Win) - "Export"
+    # (0-23% equal to Lightroom 1.4.1)
+    '8453391d3adf377c46a1a0cee08c35c3:221111' => 'Adobe Lightroom, Quality 24% - 30%',
+    'f8ede291b1272576d1580e333d30103e:221111' => 'Adobe Lightroom, Quality 31% - 38%',
+    'de0fb6d13e12e8df26140dd74691bf0f:221111' => 'Adobe Lightroom, Quality 39% - 46%',
+    '0d5b0af72561f68c671731f22d9e41e2:221111' => 'Adobe Lightroom, Quality 47% - 53%',
+    'b9fd15fd52408af5ea2a5045227233d8:111111' => 'Adobe Lightroom, Quality 54% - 61%',
+    '27472e3714251402d5509438505611c3:111111' => 'Adobe Lightroom, Quality 62% - 69%',
+    '34a599dff2b6aaed12143938b7374f2f:111111' => 'Adobe Lightroom, Quality 70% - 76%',
+    '5c508e529d045b6f0c800e29ba2d6ab5:111111' => 'Adobe Lightroom, Quality 77% - 84%',
+    '42bfe52476bf07f1ed0e6451903cc9ee:111111' => 'Adobe Lightroom, Quality 85% - 92%',
+    '4c3c425b4024b68c0de03904a825bc35:111111' => 'Adobe Lightroom, Quality 93% - 100%',
+
+    # Tested with Adobe Photoshop CS2 Version 9.0.2 (Win) - "Save as..." (RGB/CYMK)
+    '683506a889c78d9bc230a0c7ee5f62f3:221111' => 'Adobe Photoshop, Quality 0',
+    'bc490651af6592cd1dbbbc4fa2cfa1fb:221111' => 'Adobe Photoshop, Quality 1',
+    'ce4286d9f07999524c3c7472b065c5ab:221111' => 'Adobe Photoshop, Quality 2',
+    'cbfbfef12aead8841585ef605c789b9f:221111' => 'Adobe Photoshop, Quality 3',
+    'a0772e73dec2bdc4057c27da47bff376:221111' => 'Adobe Photoshop, Quality 4',
+    '7ef06dbde538346b8b01c6b538ca70c6:221111' => 'Adobe Photoshop, Quality 5',
+    '0ff225f58a214f79d1d85d78f6f5dab8:221111' => 'Adobe Photoshop, Quality 6',
+    '8a8603650fa5ae5fdcf4b2eaf0b23638:111111' => 'Adobe Photoshop, Quality 7',
+    '44f583ed6b65cb8ba915ec5df051616c:111111' => 'Adobe Photoshop, Quality 8',
+    'de94c5591bafc7456ccaef430271b907:111111' => 'Adobe Photoshop, Quality 9',
+    'a6841b35e9ffefa5d83a0445dddd2621:111111' => 'Adobe Photoshop, Quality 10',
+    '6e3f6a3a5a1eae6155331d42d6f968dd:111111' => 'Adobe Photoshop, Quality 11',
+    '5379e0133d4439b6f7c7039fc7f7734f:111111' => 'Adobe Photoshop, Quality 12',
+
+    # Tested with Adobe Photoshop CS2 Version 9.0.2 (Win) - "Save as..." (Grayscale)
+    '3b0b5975a0e1c9d732c93e1b37a6978b:11' => 'Adobe Photoshop, Quality 0',
+    'f4d19ed563e2d0519d6a547088771ddb:11' => 'Adobe Photoshop, Quality 1',
+    'e9ef286567fd84a1f479b35ca00db43c:11' => 'Adobe Photoshop, Quality 2',
+    'b39cafdb459a42749be3f6459a596677:11' => 'Adobe Photoshop, Quality 3',
+    'b3f215deea48e982e205619af279205f:11' => 'Adobe Photoshop, Quality 4',
+    'fccd63ce166e198065eaae05c8d78407:11' => 'Adobe Photoshop, Quality 5',
+    '0a50266ad8d1dff11c90cd1480c0a2be:11' => 'Adobe Photoshop, Quality 6',
+    '6579941db0216f41f0a20de9b626538a:11' => 'Adobe Photoshop, Quality 7',
+    '57aa47876e10c6b4f35ecb8889e55ad9:11' => 'Adobe Photoshop, Quality 8',
+    '076598d43c5186f6d7a1020b64b93625:11' => 'Adobe Photoshop, Quality 9',
+    '37132e8ea81137fdf26ce30926ab8100:11' => 'Adobe Photoshop, Quality 10',
+    '46f55ee294723cee9faa816549b3cfa7:11' => 'Adobe Photoshop, Quality 11',
+    '7b83284f61decf47ab3f8f7361c18943:11' => 'Adobe Photoshop, Quality 12',
+
+    # Tested with Adobe Photoshop CS2 Version 9.0.2 (Win) - "Save for web..."
+    '9ac881c536e509675e5cf3795a85d9de:221111' => 'Adobe Photoshop, Save for web, Quality 0',
+    '3521d793fd9d2d9aac85dc4f0be40290:221111' => 'Adobe Photoshop, Save for web, Quality 1',
+    '041c9e3cf0d34a8b89539e3115bca31b:221111' => 'Adobe Photoshop, Save for web, Quality 2',
+    '029b3a6f0b92af6786d753788eafabfe:221111' => 'Adobe Photoshop, Save for web, Quality 3',
+    '6cdd3762e346b16a59af4bddb213b07a:221111' => 'Adobe Photoshop, Save for web, Quality 4',
+    '84a69c0b43505dd0cbc25d640873b5b9:221111' => 'Adobe Photoshop, Save for web, Quality 5',
+    '7254c012821f2bc866d7d6dd7906c92d:221111' => 'Adobe Photoshop, Save for web, Quality 6',
+    '428ba2c747ea4e495ff3c7ff44a988d2:221111' => 'Adobe Photoshop, Save for web, Quality 7',
+    '42cb001aea7e24d239f6c2fcbd861862:221111' => 'Adobe Photoshop, Save for web, Quality 8',
+    'a3698813ce90772a30b6eb9a7deb3f4a:221111' => 'Adobe Photoshop, Save for web, Quality 9',
+    '301158b292e3232856a765486da26fa6:221111' => 'Adobe Photoshop, Save for web, Quality 10',
+    '8d9edea9287aa919e433b620f61468dc:221111' => 'Adobe Photoshop, Save for web, Quality 11',
+    'c1e0554d8a6ed003eb98e068429b56b9:221111' => 'Adobe Photoshop, Save for web, Quality 12',
+    '0e0a151e0a52097cbd7683c9385e3a7c:221111' => 'Adobe Photoshop, Save for web, Quality 13',
+    '911e66f21fe242cc74e0a5738b0330bd:221111' => 'Adobe Photoshop, Save for web, Quality 14',
+    '028fafd94aa66ee269f58d800c89d838:221111' => 'Adobe Photoshop, Save for web, Quality 15',
+    '866b8adb1ce7c9dc0e58b7c1e013280f:221111' => 'Adobe Photoshop, Save for web, Quality 16',
+    '7f712aecf513621f635a007aadda61af:221111' => 'Adobe Photoshop, Save for web, Quality 17',
+    '38f26622a54ba22accac05f7c0a3b307:221111' => 'Adobe Photoshop, Save for web, Quality 18',
+    'd241d5165e64e98024b47dfbf76be88c:221111' => 'Adobe Photoshop, Save for web, Quality 19',
+    'afb31cfed194d4e125bde8fd4755bb8a:221111' => 'Adobe Photoshop, Save for web, Quality 20',
+    '0d501a036c984d2caf49fd298b2d0d16:221111' => 'Adobe Photoshop, Save for web, Quality 21',
+    '9e992f35767c4aa023b8afd243b247bf:221111' => 'Adobe Photoshop, Save for web, Quality 22',
+    '0a80e5bf01a9c5650384dfe1a428f61d:221111' => 'Adobe Photoshop, Save for web, Quality 23',
+    '2501aad23cdf94b25c6df0ab6984b6e0:221111' => 'Adobe Photoshop, Save for web, Quality 24',
+    '09c168d2e075070d3a2535e7f2e455df:221111' => 'Adobe Photoshop, Save for web, Quality 25',
+    '63190207beeb805306f7d0bcc3898cb3:221111' => 'Adobe Photoshop, Save for web, Quality 26',
+    'e47902bc7ba3037921010c568648c8c3:221111' => 'Adobe Photoshop, Save for web, Quality 27',
+    '410ed63b6e5225d8b99da6272fd6069b:221111' => 'Adobe Photoshop, Save for web, Quality 28',
+    'b40f3f3c46d70a560e2033fadd8c7bb5:221111' => 'Adobe Photoshop, Save for web, Quality 29',
+    '45148ae63b12ccaa6fb5a487ca7620e9:221111' => 'Adobe Photoshop, Save for web, Quality 30',
+    '5180e51bd58432c7b51a305ed0c24d1b:221111' => 'Adobe Photoshop, Save for web, Quality 31',
+    'c5c472d899462bbe31da9aa8c072c0bc:221111' => 'Adobe Photoshop, Save for web, Quality 32',
+    '28cdbc95898e02dd0ffc45ba48596ca7:221111' => 'Adobe Photoshop, Save for web, Quality 33',
+    '42cd88e0eb3c14a705b952550ec2eacd:221111' => 'Adobe Photoshop, Save for web, Quality 34',
+    '78a2a442aac5cca7fa2ef5a8bd96219e:221111' => 'Adobe Photoshop, Save for web, Quality 35',
+    '96bce854134a2fccfcb68dca6687cd51:221111' => 'Adobe Photoshop, Save for web, Quality 36',
+    'fefd00ec4610895e4294de690f5977e9:221111' => 'Adobe Photoshop, Save for web, Quality 37',
+    'd71c8ddb9117920304d83a6f8b7832a4:221111' => 'Adobe Photoshop, Save for web, Quality 38',
+    '1727e720300403e5f315b5e17ef84d3f:221111' => 'Adobe Photoshop, Save for web, Quality 39',
+    '8fb05e3c3b0a7404ff6ca54f952d2a5e:221111' => 'Adobe Photoshop, Save for web, Quality 40',
+    '328ab751ea48f5a8bc7c4b8628138ce0:221111' => 'Adobe Photoshop, Save for web, Quality 41',
+    'd9653333a3af8842dd4b72856ac4ef4e:221111' => 'Adobe Photoshop, Save for web, Quality 42',
+    '276da99e50e1b39134e13826789d655e:221111' => 'Adobe Photoshop, Save for web, Quality 43',
+    '23f2bd2d96ec531815609503dae4a2b0:221111' => 'Adobe Photoshop, Save for web, Quality 44',
+    'bafe2a89809f23bc7367e9a819570728:221111' => 'Adobe Photoshop, Save for web, Quality 45',
+    '6bfdcd36327406f801be86d0e8ca6b60:221111' => 'Adobe Photoshop, Save for web, Quality 46',
+    'eb8e5c42d31b916737ac21dffd6f012b:221111' => 'Adobe Photoshop, Save for web, Quality 47',
+    'e57a9878be74473990343573c6585f79:221111' => 'Adobe Photoshop, Save for web, Quality 48',
+    '91dfacd928ce717cb135c6da03afd907:221111' => 'Adobe Photoshop, Save for web, Quality 49',
+    '16c443478b9417d44893f8748d49b790:221111' => 'Adobe Photoshop, Save for web, Quality 50',
+    '84de345dcf710f937a39a0b631b87fc4:111111' => 'Adobe Photoshop, Save for web, Quality 51',
+    'bdd6043e7f5a5f1512b99b2394a075e2:111111' => 'Adobe Photoshop, Save for web, Quality 52',
+    'c7614d3d384a02630721be335062ef75:111111' => 'Adobe Photoshop, Save for web, Quality 53',
+    '42d6f71aace3de2ccfdd8348b0198704:111111' => 'Adobe Photoshop, Save for web, Quality 54',
+    '84d5f059ce3e1b78d91355e1e86e2d1a:111111' => 'Adobe Photoshop, Save for web, Quality 55',
+    '5881004f575752d77ee00e767d848e51:111111' => 'Adobe Photoshop, Save for web, Quality 56',
+    '0cb697537acde3d2e85078377461a8e0:111111' => 'Adobe Photoshop, Save for web, Quality 57',
+    'b2762ffa5c0a1799fb2e9ad6dfd2171a:111111' => 'Adobe Photoshop, Save for web, Quality 58',
+    '2b7a6a83259aa9967e098d3e70f1ee09:111111' => 'Adobe Photoshop, Save for web, Quality 59',
+    '6123a3685e1012af5a0d024de1ce0304:111111' => 'Adobe Photoshop, Save for web, Quality 60',
+    'd08c8435de33f2c186aa2dd9cba3e874:111111' => 'Adobe Photoshop, Save for web, Quality 61',
+    'e69be2174dbbfb952e54576fbdfe6c14:111111' => 'Adobe Photoshop, Save for web, Quality 62',
+    '2ec2d5c10641952fce5c435b331b8872:111111' => 'Adobe Photoshop, Save for web, Quality 63',
+    '98201e1185b7069f1247ac3cdc56c824:111111' => 'Adobe Photoshop, Save for web, Quality 64',
+    '8fc0325d05c9199bc1e2dec417c3a55e:111111' => 'Adobe Photoshop, Save for web, Quality 65',
+    '016600f44a61cc5a5673c9bad85e23a3:111111' => 'Adobe Photoshop, Save for web, Quality 66',
+    '91d7b4300c98c726aff7b19cbe098a3e:111111' => 'Adobe Photoshop, Save for web, Quality 67',
+    'f9b83ba21b86a3d4ddb507e3edce490c:111111' => 'Adobe Photoshop, Save for web, Quality 68',
+    'd312a23c8ecb3bf59bc11bbe17d79e55:111111' => 'Adobe Photoshop, Save for web, Quality 69',
+    '240fffe5f8e2d8f3345b8175f9cb0a40:111111' => 'Adobe Photoshop, Save for web, Quality 70',
+    'ba60a642bfb1a184c11e5561581d7115:111111' => 'Adobe Photoshop, Save for web, Quality 71',
+    'c901580e589f58d309f8b50590cfe214:111111' => 'Adobe Photoshop, Save for web, Quality 72',
+    'c244f94d84a016840c6ef06250c58ade:111111' => 'Adobe Photoshop, Save for web, Quality 73',
+    '3589227bdd85f880f3337b492e895c5d:111111' => 'Adobe Photoshop, Save for web, Quality 74',
+    'cae6fd91a423ff181d50bb9c26a0d392:111111' => 'Adobe Photoshop, Save for web, Quality 75',
+    '7d8ee11ca66d2c22ff9ed1f778b5dbac:111111' => 'Adobe Photoshop, Save for web, Quality 76',
+    'a16371762ce48953d42dfb5b77d1bfc6:111111' => 'Adobe Photoshop, Save for web, Quality 77',
+    '204b111d4aaa85b430e86273a63fd004:111111' => 'Adobe Photoshop, Save for web, Quality 78',
+    '6a243ac0b8575c2ed962070cd7d39e04:111111' => 'Adobe Photoshop, Save for web, Quality 79',
+    '51879d6e5178d2282d5e8276ed4e2439:111111' => 'Adobe Photoshop, Save for web, Quality 80',
+    'ca683ab6caaa3132bf661a0ebf32ef4e:111111' => 'Adobe Photoshop, Save for web, Quality 81',
+    '5399adc3f21ecb30c96d6a94b38ab74c:111111' => 'Adobe Photoshop, Save for web, Quality 82',
+    '43eb3b161279ccc1fb4f9cbe7b92398f:111111' => 'Adobe Photoshop, Save for web, Quality 83',
+    '2d387641f4e94b6986908b3770fb762e:111111' => 'Adobe Photoshop, Save for web, Quality 84',
+    '75ee5a0fd61559c6bf8e6ebc920c93b0:111111' => 'Adobe Photoshop, Save for web, Quality 85',
+    '60d17e041a23d47b96c5aac86180a022:111111' => 'Adobe Photoshop, Save for web, Quality 86',
+    '8e5290b1d12832ad259de92a53e1ef4e:111111' => 'Adobe Photoshop, Save for web, Quality 87',
+    'dc19a48af9051bbdc54cf7e88c03f13e:111111' => 'Adobe Photoshop, Save for web, Quality 88',
+    'c3fbc85c803ddc81c8882c03330b5b15:111111' => 'Adobe Photoshop, Save for web, Quality 89',
+    '5e016a2d28f8ad3e7e27e4e2981031d2:111111' => 'Adobe Photoshop, Save for web, Quality 90',
+    'ef4fa43f4d548e0687c4d4151a0bf1bd:111111' => 'Adobe Photoshop, Save for web, Quality 91',
+    '00f03e367cd316b71de360c6e7af0e6b:111111' => 'Adobe Photoshop, Save for web, Quality 92',
+    '982fc46fd167df238fbf23494a1ce761:111111' => 'Adobe Photoshop, Save for web, Quality 93',
+    '6fd7b56ac6b58dc861e6021815fb5704:111111' => 'Adobe Photoshop, Save for web, Quality 94',
+    'c6d9120293c8435cf6b40574b45756bb:111111' => 'Adobe Photoshop, Save for web, Quality 95',
+    '1e133f4bf9f7c7c1e0accf44c0b1107d:111111' => 'Adobe Photoshop, Save for web, Quality 96',
+    'fb91d6a8a1b72388d68130f551698865:111111' => 'Adobe Photoshop, Save for web, Quality 97',
+    '4ea4e07900e04a3bd7572d4b59aa7a74:111111' => 'Adobe Photoshop, Save for web, Quality 98',
+    '15e1d2321b96b355d4ad109a8d2fe882:111111' => 'Adobe Photoshop, Save for web, Quality 99',
+    '234d8f310d75effc9f77beb1d3847f49:111111' => 'Adobe Photoshop, Save for web, Quality 100',
+
+    # Adobe Photoshop Express (Release build number: 481589)
+    'aeb34eb083acc888770d65e691497bcf:111111' => 'Adobe Photoshop Express, Original Size',
+
+    # Apple QuickTime (Color)
+    #
+    # Tested with:
+    # - QuickTime 7.5.0 (Win)
+    # - QuickTime 7.5.0 (Mac)
+    # - QuickTime 7.4.1 (Mac)
+    # - GraphicConverter 4.4.4 (Mac)
+    #   - Using the QuickTime library
+    #   - Fixed subsampling to 221111
+    #   - Use a subset of 101 of the 1024 values
+    'dbdc6a6f3c9ffff19e67cfad2cc51ae4:221111' => 'Apple QuickTime, Quality 0-63 (0-6%)',
+    '23bd5edb6224e03e2f7c282e04986553:221111' => 'Apple QuickTime, Quality 64-80 (6-8%)',
+    '69747272d4079b78c2ee2ef0f5e63f30:221111' => 'Apple QuickTime, Quality 81-92 (8-9%)',
+    '4f50903ec9314f739e460c79552a20c5:221111' => 'Apple QuickTime, Quality 93-101 (9-10%)',
+    '2535e621267a9ff2e2d09148643e3389:221111' => 'Apple QuickTime, Quality 102-109 (10-11%)',
+    '46a125048b572576eed271816b2cbad2:221111' => 'Apple QuickTime, Quality 110-116 (11%)',
+    'ce05e4b45c53a6e321d9cf1061c62128:221111' => 'Apple QuickTime, Quality 117-122 (11-12%)',
+    'c3b80241282d06ac5114f2750089589a:221111' => 'Apple QuickTime, Quality 123-127 (12%)',
+    '9d91481900305fb9ad09339f0924f690:221111' => 'Apple QuickTime, Quality 128-133 (13%)',
+    '348f4874d57ae6aae04ef96132374913:221111' => 'Apple QuickTime, Quality 134-137 (13%)',
+    '4e3daadebe0517955b1c86fb1fbc1dc1:221111' => 'Apple QuickTime, Quality 138-142 (13-14%)',
+    '599b6ad93f32b9d5ce67e1622338c379:221111' => 'Apple QuickTime, Quality 143-146 (14%)',
+    '66aeb0f03343673eeed6462e0ce9e1aa:221111' => 'Apple QuickTime, Quality 147-150 (14-15%)',
+    '13570e05da917fe51235ef66a295bc78:221111' => 'Apple QuickTime, Quality 151-154 (15%)',
+    '25e399a9cf70fe7a13867b40ac2c3416:221111' => 'Apple QuickTime, Quality 155-157 (15%)',
+    '25eb3d27e65659435a89e401edfab65f:221111' => 'Apple QuickTime, Quality 158-161 (15-16%)',
+    'c3bb3c557e70b56a890b07236348518b:221111' => 'Apple QuickTime, Quality 162-164 (16%)',
+    '792e93c41ac63451068b887b11ad0c2e:221111' => 'Apple QuickTime, Quality 165-167 (16%)',
+    '35af99d11406974cf2ffa6676801b10c:221111' => 'Apple QuickTime, Quality 168-170 (16-17%)',
+    '606e5652fc33c6a02328f0bd23ee9751:221111' => 'Apple QuickTime, Quality 171-173 (17%)',
+    '9b62a9e4544cbc1033c67732ea0bbb08:221111' => 'Apple QuickTime, Quality 174-176 (17%)',
+    '93ef48999d5659763a33c45a2a0fa784:221111' => 'Apple QuickTime, Quality 177-179 (17%)',
+    '01b48291bfeccf2fadab996816225b9b:221111' => 'Apple QuickTime, Quality 180-182 (18%)',
+    '613ef896fc4af5baad36e2680968a7ba:221111' => 'Apple QuickTime, Quality 183-184 (18%)',
+    '758d37a9d3b91c0ba383d23f5a080d8f:221111' => 'Apple QuickTime, Quality 185-187 (18%)',
+    '34457d32b9531f04696a52969e02dc1a:221111' => 'Apple QuickTime, Quality 188-189 (18%)',
+    '6634cdad61e7a8e6fb3a4ba1a0416256:221111' => 'Apple QuickTime, Quality 190-191 (19%)',
+    'e5b0739f8e02c6d481e0cdafe7326ae2:221111' => 'Apple QuickTime, Quality 192-194 (19%)',
+    'fca91c73d4275748587f97b472b59280:221111' => 'Apple QuickTime, Quality 195-196 (19%)',
+    '7dc9316230c4f197fb5d1b36f09cd883:221111' => 'Apple QuickTime, Quality 197-198 (19%)',
+    '13d6536913342860ab993be8b141f644:221111' => 'Apple QuickTime, Quality 199-201 (19-20%)',
+    'd835580b2be669d4aa6c68ead27c0c2f:221111' => 'Apple QuickTime, Quality 202-203 (20%)',
+    '1e91365abfe1d9f7a008c363c834a66e:221111' => 'Apple QuickTime, Quality 204-205 (20%)',
+    '6f7825365b673f9eb2ac050d27a21d1b:221111' => 'Apple QuickTime, Quality 206-207 (20%)',
+    '2a98c0b884281080eefcdf98dd33fd6b:221111' => 'Apple QuickTime, Quality 208-209 (20%)',
+    '0ffe7e9fc17393a338b95c345052b7c5:221111' => 'Apple QuickTime, Quality 210-211 (21%)',
+    '9dd5c9717d0fd45486af4d26e59ebb35:221111' => 'Apple QuickTime, Quality 212-213 (21%)',
+    '0ef85155f08194f8fed3f4e7197126e6:221111' => 'Apple QuickTime, Quality 214-215 (21%)',
+    '35886289b5c8921f7932f895d7f1855d:221111' => 'Apple QuickTime, Quality 216-217 (21%)',
+    '1d7ac617d70b1880be9c7ba16f96a3ec:221111' => 'Apple QuickTime, Quality 218 (21%)',
+    'b26a53dce1477ac3970335df110bb240:221111' => 'Apple QuickTime, Quality 219-220 (21%)',
+    'a333be9f2b13b53bfdf64bf5665f8e55:221111' => 'Apple QuickTime, Quality 221-222 (22%)',
+    'f1e8d9b3d66fa34ec9a51a987b48a159:221111' => 'Apple QuickTime, Quality 223-224 (22%)',
+    '20f37f34a9fd18089aa58fe77493a7b7:221111' => 'Apple QuickTime, Quality 225 (22%)',
+    'b80e56d3ed0c4a8e1c6bb0c5a1d45ca9:221111' => 'Apple QuickTime, Quality 226-227 (22%)',
+    'd14411ab659ac68209ee8c75b941cb48:221111' => 'Apple QuickTime, Quality 228-229 (22%)',
+    'a5da49ac5bfe27aafda44bae107ae1c5:221111' => 'Apple QuickTime, Quality 230 (22%)',
+    '9aa9359126240c0712610121371f870c:221111' => 'Apple QuickTime, Quality 231-232 (23%)',
+    '5975500a23ab9a547ba149bf1aaa1893:221111' => 'Apple QuickTime, Quality 233-234 (23%)',
+    'd03a4790dd96a862113b1a2408103ad6:221111' => 'Apple QuickTime, Quality 235 (23%)',
+    '44d2a7baaf1e3f8c3d45e4e6272a39b1:221111' => 'Apple QuickTime, Quality 236-237 (23%)',
+    '7755ba223679105c184be0ada8c99f92:221111' => 'Apple QuickTime, Quality 238 (23%)',
+    '1ea3f373d0adf989e8416ecb11c38608:221111' => 'Apple QuickTime, Quality 239-240 (23%)',
+    '12196a46c697fbb88d8bef279b52b106:221111' => 'Apple QuickTime, Quality 241 (24%)',
+    '2183a6f77fe72f5c70726244dcabc963:221111' => 'Apple QuickTime, Quality 242-243 (24%)',
+    'd1ca3a3723c1385d2989b199a7a30557:221111' => 'Apple QuickTime, Quality 244 (24%)',
+    'd83207842d60965f9d194d89f3281ccd:221111' => 'Apple QuickTime, Quality 245-246 (24%)',
+    '6ae041573525edd42e800e1b61d4313c:221111' => 'Apple QuickTime, Quality 247 (24%)',
+    '6c42d12564d1c5706653a8ddb5375192:221111' => 'Apple QuickTime, Quality 248-249 (24%)',
+    '671a071a1b17f49a774da3893f7199c7:221111' => 'Apple QuickTime, Quality 250 (24%)',
+    'fb3c0cc15ad21b6c19576dd8d7d29a0e:221111' => 'Apple QuickTime, Quality 251 (25%)',
+    'c9ce3dc3d0567f631e463cc3ff1b2e30:221111' => 'Apple QuickTime, Quality 252-253 (25%)',
+    'b309a0dc90b16ac01f0798a04c3127e8:221111' => 'Apple QuickTime, Quality 254 (25%)',
+    'cd15038a76bd8752c3afd14669816c2e:221111' => 'Apple QuickTime, Quality 255 (25%)',
+    'd275e9aebd39cf411496caf6e54d0c5f:221111' => 'Apple QuickTime, Quality 256-257 (25%)',
+    '5e75328df5dadca132bb83e0883ce522:221111' => 'Apple QuickTime, Quality 258 (25%)',
+    'b04cbc1812939770d59461982cd9d32d:221111' => 'Apple QuickTime, Quality 259 (25%)',
+    'ddf1f3b922ea51f6f4ca3cb6863eeae0:221111' => 'Apple QuickTime, Quality 260-261 (25%)',
+    '5532e398abb0a455b528659e59c7cfd7:221111' => 'Apple QuickTime, Quality 262 (26%)',
+    'f9bff3eeb4e94fb9ab4820184b0b6058:221111' => 'Apple QuickTime, Quality 263 (26%)',
+    '081da80ed314194b571ff9880a7c11d3:221111' => 'Apple QuickTime, Quality 264-265 (26%)',
+    '178aa0138d7a08be081aeff794956a71:221111' => 'Apple QuickTime, Quality 266 (26%)',
+    '78bb04e3ced3eee51c78e94b421ecc26:221111' => 'Apple QuickTime, Quality 267 (26%)',
+    '17782e930dc2cba42da909d95278fe9b:221111' => 'Apple QuickTime, Quality 268 (26%)',
+    '093b011ce21ae794d3eca7c64eecf5b6:221111' => 'Apple QuickTime, Quality 269 (26%)',
+    '4bf515768d1a06e4c529ebae3e03b4b5:221111' => 'Apple QuickTime, Quality 270-271 (26%)',
+    '3dd79429ada0455422ff6605c1727456:221111' => 'Apple QuickTime, Quality 272 (27%)',
+    '4be1504b9732d1d9f6265d0616bad21b:221111' => 'Apple QuickTime, Quality 273 (27%)',
+    'b2118dc8e8b1762cc634e135a2a1893c:221111' => 'Apple QuickTime, Quality 274 (27%)',
+    '70d843457698f46db30181ac616deb75:221111' => 'Apple QuickTime, Quality 275 (27%)',
+    'f3c42f077883313db21c72bd240de05f:221111' => 'Apple QuickTime, Quality 276 (27%)',
+    '56e9a02eb25508a9f71ad1a7cb9f9f4d:221111' => 'Apple QuickTime, Quality 277-278 (27%)',
+    '1d956197da5eb19ffe8855a0e2a52c98:221111' => 'Apple QuickTime, Quality 279 (27%)',
+    '3e37de5c00962684feba769939fce685:221111' => 'Apple QuickTime, Quality 280 (27%)',
+    '5628aeb29bb04d9c5073bc1caf371f01:221111' => 'Apple QuickTime, Quality 281 (27%)',
+    'a2e7b219d18177294378485759215f72:221111' => 'Apple QuickTime, Quality 282 (28%)',
+    '537f40d0aae588fbce4cde9ba148604d:221111' => 'Apple QuickTime, Quality 283 (28%)',
+    '14b7d58b539ad8d6f1c4f8fd82c91358:221111' => 'Apple QuickTime, Quality 284 (28%)',
+    '58b302794024b9842657bbe7cb667577:221111' => 'Apple QuickTime, Quality 285 (28%)',
+    '4be64c2782cbb36b757cdcadd756498a:221111' => 'Apple QuickTime, Quality 286 (28%)',
+    '6c947f09bc02f87b257a26f9f5c77a77:221111' => 'Apple QuickTime, Quality 287 (28%)',
+    '663b8a9dbd00efa78281f5028b35c503:221111' => 'Apple QuickTime, Quality 288 (28%)',
+    'e5deb190a5e17492a01e8136afdfd6c1:221111' => 'Apple QuickTime, Quality 289 (28%)',
+    'ba36e1298ce7fed908ee3e02b83ae7c3:221111' => 'Apple QuickTime, Quality 290 (28%)',
+    'bc4abc4600f2efc0bdead1e4be78801b:221111' => 'Apple QuickTime, Quality 291-292 (28-29%)',
+    '43887ad276efb9ca8e8110498b38d814:221111' => 'Apple QuickTime, Quality 293 (29%)',
+    '3050624718ce9acc06f85c2fa0208cc7:221111' => 'Apple QuickTime, Quality 294 (29%)',
+    'f6d9c8699e54823040b66c4b8e1361aa:221111' => 'Apple QuickTime, Quality 295 (29%)',
+    'a9b2875fc3c21e7b998969c57f74fa7a:221111' => 'Apple QuickTime, Quality 296 (29%)',
+    'b9be740b8a374a52808ad5ef6db2bfe7:221111' => 'Apple QuickTime, Quality 297 (29%)',
+    '63f9786c6a9b8ef87c791818ddaba058:221111' => 'Apple QuickTime, Quality 298 (29%)',
+    'a65113fd3b66ef137f9b1144367f731b:221111' => 'Apple QuickTime, Quality 299 (29%)',
+    'ee58773aa7b774040d650365937cf173:221111' => 'Apple QuickTime, Quality 300 (29%)',
+    '29a9ee0cae41784d90fa74d7cd240a3e:221111' => 'Apple QuickTime, Quality 301 (29%)',
+    '369e1cfc338b45a239cb7db09778037e:221111' => 'Apple QuickTime, Quality 302 (29%)',
+    '131ddd6eec5f51e825cf7afd9c7ab3b2:221111' => 'Apple QuickTime, Quality 303 (30%)',
+    '88a2772be7b74a5a9b7ebbea28ddde47:221111' => 'Apple QuickTime, Quality 304 (30%)',
+    '83e206dafb515f20a4b9a0c16f770940:221111' => 'Apple QuickTime, Quality 305 (30%)',
+    'dddc3adae44a64457b05416affc2502e:221111' => 'Apple QuickTime, Quality 306 (30%)',
+    'ff0758d87a0cbdb323fb93bf9ed1fdff:221111' => 'Apple QuickTime, Quality 307 (30%)',
+    'b1b1a08ebaf13142b731c95771d97226:221111' => 'Apple QuickTime, Quality 308 (30%)',
+    'd6e206f8224d6a3582fb1066b511437b:221111' => 'Apple QuickTime, Quality 309 (30%)',
+    '2926d6bf5a27174bd9057bd6198413cd:221111' => 'Apple QuickTime, Quality 310 (30%)',
+    '5d1b5e80f9777a636d1d5cb402fcfc32:221111' => 'Apple QuickTime, Quality 311 (30%)',
+    'ae39c8775a10e34accdf2bba3bffc483:221111' => 'Apple QuickTime, Quality 312 (30%)',
+    'bc6d3a9f349a97c5cde3f8fa4e1b5beb:221111' => 'Apple QuickTime, Quality 313 (31%)',
+    '91bd468ca96fe548a7df9646b51880d1:221111' => 'Apple QuickTime, Quality 314 (31%)',
+    '104c3b63e4ca667a4ee2e4250340052c:221111' => 'Apple QuickTime, Quality 315 (31%)',
+    '64b80be38604eaecc99236b1f74a99f8:221111' => 'Apple QuickTime, Quality 316 (31%)',
+    '284efada45882694778e65969f761478:221111' => 'Apple QuickTime, Quality 317 (31%)',
+    'd8bd88390c27b2b05a0784eafd4b31ef:221111' => 'Apple QuickTime, Quality 318 (31%)',
+    '99bf8158a4060d354b521f3d6f5648ac:221111' => 'Apple QuickTime, Quality 319 (31%)',
+    '96c9e3cd827097ec03edc458fc1053e4:221111' => 'Apple QuickTime, Quality 320 (31%)',
+    '272b5b12f7701be4cceba51e9d5dbf13:221111' => 'Apple QuickTime, Quality 321 (31%)',
+    'dcc3ffcda228ab283d53e1dc2cb739ef:221111' => 'Apple QuickTime, Quality 322-324 (31-32%)',
+    'c44701e8185306f5e6d09be16a2b0fbd:221111' => 'Apple QuickTime, Quality 325 (32%)',
+    '476a1ebd043ed59e56d18dd6d08777d7:221111' => 'Apple QuickTime, Quality 326 (32%)',
+    '26831dfc8d0dc1d202d50d6cf7b4f4a4:221111' => 'Apple QuickTime, Quality 327 (32%)',
+    '00f929d549fdd9f89fbb10303445cc2c:221111' => 'Apple QuickTime, Quality 328 (32%)',
+    '030736cda242f0583a7064cb60cc026e:221111' => 'Apple QuickTime, Quality 329 (32%)',
+    '825fb58744c6c2432d232f5fb83a9597:221111' => 'Apple QuickTime, Quality 330 (32%)',
+    '0bac94d5b6ef090da7875e294a7f8040:221111' => 'Apple QuickTime, Quality 331 (32%)',
+    '16de07616490b8439576d837c74aefbe:221111' => 'Apple QuickTime, Quality 332 (32%)',
+    '8190e844832ee8ea97492b509c728de4:221111' => 'Apple QuickTime, Quality 333 (33%)',
+    '0bb6bf7365676f75d285bb38a40b8e3f:221111' => 'Apple QuickTime, Quality 334 (33%)',
+    '04710d4ba5233b4f82bd260263f9e992:221111' => 'Apple QuickTime, Quality 335 (33%)',
+    'fcb49e821b83f8436d450b03f1b1f182:221111' => 'Apple QuickTime, Quality 336 (33%)',
+    '1bca645051a125cd2c3af262074f70e7:221111' => 'Apple QuickTime, Quality 337 (33%)',
+    '7a5c04b63f9fe6af176efef387ba1f03:221111' => 'Apple QuickTime, Quality 338 (33%)',
+    '24fff8dcfdc8640225fff020ad869c18:221111' => 'Apple QuickTime, Quality 339 (33%)',
+    '08549fa433585b86d6eab75b6dcb1fe3:221111' => 'Apple QuickTime, Quality 340 (33%)',
+    'caabe462a50217592c74902def037c07:221111' => 'Apple QuickTime, Quality 341 (33%)',
+    '757e97f3490ebc5b74fd63792fb23992:221111' => 'Apple QuickTime, Quality 342 (33%)',
+    'aa6072a632f7bae361c8d371aa022c57:221111' => 'Apple QuickTime, Quality 343 (33%)',
+    '03809d08372d3a9fd86ff254854f45b7:221111' => 'Apple QuickTime, Quality 344 (34%)',
+    'bdebcafc7b5f6b7fea114943e042df5e:221111' => 'Apple QuickTime, Quality 345 (34%)',
+    '555dc90fb10df448f37c67ee7ec31bc2:221111' => 'Apple QuickTime, Quality 346 (34%)',
+    'a2f2a404cd1c2278ef65f2a27c0365e0:221111' => 'Apple QuickTime, Quality 347 (34%)',
+    'aee867276d6dc4ed4b682a454815acd1:221111' => 'Apple QuickTime, Quality 348 (34%)',
+    '8f2f9e8433104cedb50c3e54577fcd00:221111' => 'Apple QuickTime, Quality 349 (34%)',
+    '84c2067991afbb6851204f21f5d132ea:221111' => 'Apple QuickTime, Quality 350 (34%)',
+    '2d2a77bf6078ab4f07261c76b637b597:221111' => 'Apple QuickTime, Quality 351 (34%)',
+    'fc9d0f82571701e8b4cf764125ac0d2e:221111' => 'Apple QuickTime, Quality 352 (34%)',
+    '75d4ffdc6c10675cb1b5bd002d4e0e41:221111' => 'Apple QuickTime, Quality 353 (34%)',
+    '4b96c3457701c201f90d56af1a82d43b:221111' => 'Apple QuickTime, Quality 354 (35%)',
+    'a56edeb9e571dc790a429c26ebc59976:221111' => 'Apple QuickTime, Quality 355 (35%)',
+    '3673ce9ec4f6f916009d39282ff3a8d7:221111' => 'Apple QuickTime, Quality 356 (35%)',
+    'b7279ade733ff1c88073971cebe6edd8:221111' => 'Apple QuickTime, Quality 357 (35%)',
+    'b35f3358027aa4d2cca0c64425aa8f1b:221111' => 'Apple QuickTime, Quality 358 (35%)',
+    '854d2e536bc92a9e2e3db3ff2c18e138:221111' => 'Apple QuickTime, Quality 359 (35%)',
+    '48b6aa4f0258162cceb9d43e19c96043:221111' => 'Apple QuickTime, Quality 360 (35%)',
+    '1dfb48b5955cf2a50011f52b9a05f1a4:221111' => 'Apple QuickTime, Quality 361 (35%)',
+    'd67da3fcbac8975acffe7f1ab088f646:221111' => 'Apple QuickTime, Quality 362 (35%)',
+    '7be7bded72d0ade6f907e3adcf62b391:221111' => 'Apple QuickTime, Quality 363 (35%)',
+    '02c0554e4a004ceaddd0d7772e68a38b:221111' => 'Apple QuickTime, Quality 364 (36%)',
+    'e7b9303f785f78a2cb27f83616c18726:221111' => 'Apple QuickTime, Quality 365 (36%)',
+    '4a4a154781db3f5f500e8cf177a4b446:221111' => 'Apple QuickTime, Quality 366 (36%)',
+    '7e4b44f2900a405e7b85090af7d40298:221111' => 'Apple QuickTime, Quality 367 (36%)',
+    '76aa290370382de8a3516f73389f9350:221111' => 'Apple QuickTime, Quality 368 (36%)',
+    '912779b5b7c935f2b533af0f400402f3:221111' => 'Apple QuickTime, Quality 369 (36%)',
+    '91c7f694fbf07321037a838c3a4d6e7d:221111' => 'Apple QuickTime, Quality 370 (36%)',
+    'f98a4286abf1cbe8bf46fba1e78cec61:221111' => 'Apple QuickTime, Quality 371 (36%)',
+    '2fbbcce5a035d6215e4851a0ae63481f:221111' => 'Apple QuickTime, Quality 372 (36%)',
+    '8d8fab3b6b7386a4e81f10c15a7abaa5:221111' => 'Apple QuickTime, Quality 373 (36%)',
+    '82e672854d7e00d47a988855b95d2f7f:221111' => 'Apple QuickTime, Quality 374 (37%)',
+    '9fffe6b2fbbce23598c19e6cd177adb0:221111' => 'Apple QuickTime, Quality 375 (37%)',
+    '3f69293a4abeb2201004e7241fe22c75:221111' => 'Apple QuickTime, Quality 376 (37%)',
+    'a01d3a7766c7c593a79ff6c63433860a:221111' => 'Apple QuickTime, Quality 377 (37%)',
+    '787ed74c3d5570c03f98804bc9d0c448:221111' => 'Apple QuickTime, Quality 378 (37%)',
+    '12239aa16bb4091d8f873f9536e40371:221111' => 'Apple QuickTime, Quality 379 (37%)',
+    'f45d495d3b470eadba70bcca888042b3:221111' => 'Apple QuickTime, Quality 380 (37%)',
+    '97346edee67c3afea7823c72e57cb6c5:221111' => 'Apple QuickTime, Quality 381 (37%)',
+    '5b35e4bc9cbbc353b8e4b73132324088:221111' => 'Apple QuickTime, Quality 382 (37%)',
+    'a43b370edaaee853bb16e46ee4a002e8:221111' => 'Apple QuickTime, Quality 383 (37%)',
+    '7f3d110973a4d7d5824724c4e577b407:221111' => 'Apple QuickTime, Quality 384 (38%)',
+    '0e36104efe90a5a77e9b686d0a6528ab:221111' => 'Apple QuickTime, Quality 385 (38%)',
+    '0bc0941c2a59d9a12b66d1d34117cfd7:221111' => 'Apple QuickTime, Quality 386 (38%)',
+    '342e3bddb81140ea9df00400a46461d7:221111' => 'Apple QuickTime, Quality 387 (38%)',
+    'ad8bbd6b23b87950d1b76278fbb7de87:221111' => 'Apple QuickTime, Quality 388 (38%)',
+    'd58f5d339b69e1296911a3387cc664a4:221111' => 'Apple QuickTime, Quality 389 (38%)',
+    'c740804ef8493bb467744e1cdb8882c1:221111' => 'Apple QuickTime, Quality 390 (38%)',
+    'ab975404bdb713bb6a58ac560330aaf1:221111' => 'Apple QuickTime, Quality 391 (38%)',
+    'eb68a0ff9c83267e5fb5e998365b4480:221111' => 'Apple QuickTime, Quality 392 (38%)',
+    '9c1865e7fdc0289dc5fe8f4c1f65577e:221111' => 'Apple QuickTime, Quality 393 (38%)',
+    '21db4122ad8183006542018e53e0c653:221111' => 'Apple QuickTime, Quality 394 (38%)',
+    '734255167cbd052200fb4c474f05bcd9:221111' => 'Apple QuickTime, Quality 395 (39%)',
+    'e5dcd017a9734f9f0e18b515c7fa1787:221111' => 'Apple QuickTime, Quality 396 (39%)',
+    'c58a47c2e3dc737b9591420812b9cc27:221111' => 'Apple QuickTime, Quality 397 (39%)',
+    'ea25d0beaa91434a14348fb60f5cff31:221111' => 'Apple QuickTime, Quality 398 (39%)',
+    '21f8a4a67742edcde0ac854522028c9f:221111' => 'Apple QuickTime, Quality 399 (39%)',
+    '8b8dc34912d8b18742a7670be4b1c867:221111' => 'Apple QuickTime, Quality 400 (39%)',
+    'f7adac1fb54bb1fc566b66822122a9c6:221111' => 'Apple QuickTime, Quality 401 (39%)',
+    '0fe0c7e65c0696d9e76ad819d61e44ae:221111' => 'Apple QuickTime, Quality 402 (39%)',
+    '6dabf05ddc213b650ff08aa9a8cb9f50:221111' => 'Apple QuickTime, Quality 403 (39%)',
+    '226788e417078cdcc5aa989379b9e824:221111' => 'Apple QuickTime, Quality 404 (39%)',
+    '9366dde6c37f4cac36a8e8cea4d5f51c:221111' => 'Apple QuickTime, Quality 405 (40%)',
+    '3ce5057aaf0ff155ee69d66591c8290d:221111' => 'Apple QuickTime, Quality 406 (40%)',
+    '58fe81014a9ee26a7bd393c8e31f4011:221111' => 'Apple QuickTime, Quality 407 (40%)',
+    '41e44bae14ab49d1b0f06438d34cb316:221111' => 'Apple QuickTime, Quality 408 (40%)',
+    '80ccbe5645cc62ebd4ae7b2128b42d91:221111' => 'Apple QuickTime, Quality 409 (40%)',
+    'b08af3cffd1904e8a8cfbbba71077069:221111' => 'Apple QuickTime, Quality 410 (40%)',
+    'abb56efe234d4b8fdf50016a19c63684:221111' => 'Apple QuickTime, Quality 411 (40%)',
+    'e41806d0928fbb5552225e10db7b55d0:221111' => 'Apple QuickTime, Quality 412 (40%)',
+    'ae9de0a8343d730e2e6a358849c29a4e:221111' => 'Apple QuickTime, Quality 413 (40%)',
+    'b83146f54d17b2c8e242f7f36dc36f19:221111' => 'Apple QuickTime, Quality 414 (40%)',
+    'a748fdfe8d6dc9493253908410e517eb:221111' => 'Apple QuickTime, Quality 415 (41%)',
+    'd4bb4c59b5284630a4c716a0290d9091:221111' => 'Apple QuickTime, Quality 416 (41%)',
+    'de93dd8ab7918b25f191923f4a43a5c2:221111' => 'Apple QuickTime, Quality 417 (41%)',
+    '0807f8b3b41b01054509858fa74dcf4d:221111' => 'Apple QuickTime, Quality 418 (41%)',
+    'efd780e10dcd0ab8ca0a0f4f3cb215d3:221111' => 'Apple QuickTime, Quality 419 (41%)',
+    '2ec3d0ec37690e40f009b7a9f9b17c49:221111' => 'Apple QuickTime, Quality 420 (41%)',
+    'a4680e71907e5c6f7b18e20e46286412:221111' => 'Apple QuickTime, Quality 421 (41%)',
+    '8e54abf2320cca661b6dd67b7658c9f3:221111' => 'Apple QuickTime, Quality 422 (41%)',
+    '00f76480eafd05aa5267053aec3aa122:221111' => 'Apple QuickTime, Quality 423 (41%)',
+    '849bce1254b14d44e24a6b419c385597:221111' => 'Apple QuickTime, Quality 424 (41%)',
+    '8a91452f2df82874183be50601242106:221111' => 'Apple QuickTime, Quality 425 (42%)',
+    'a670182cd48f37dd16652db878791a7a:221111' => 'Apple QuickTime, Quality 426 (42%)',
+    'c2afe9aca67de0276a6fb507861c3e80:221111' => 'Apple QuickTime, Quality 427 (42%)',
+    '18836b72e5399e2a19cd6420562ab1ff:221111' => 'Apple QuickTime, Quality 428 (42%)',
+    'cb207af75faf8ee1ef0ca3caa593bb69:221111' => 'Apple QuickTime, Quality 429 (42%)',
+    '7a318965f27e3c09d11f53cbb10a872b:221111' => 'Apple QuickTime, Quality 430 (42%)',
+    'b0a501129cb83e54f97006610ec9ed64:221111' => 'Apple QuickTime, Quality 431 (42%)',
+    'f1a8af8c0abe4b3423d5ac8c6273a7ca:221111' => 'Apple QuickTime, Quality 432 (42%)',
+    '56224ea0ac2fccb92cbe9702896f9796:221111' => 'Apple QuickTime, Quality 433 (42%)',
+    '2f2101a8450c617a09ccad472c275b88:221111' => 'Apple QuickTime, Quality 434 (42%)',
+    '13e218420429e2c94d4b9474ab03f8e4:221111' => 'Apple QuickTime, Quality 435 (42%)',
+    '41061e1cdb97926ed5bded3da11af209:221111' => 'Apple QuickTime, Quality 436 (43%)',
+    'cc3e4dc4e190d00a12bd03199efdcc6d:221111' => 'Apple QuickTime, Quality 437 (43%)',
+    '36b2371ec6df13143af12d600232c2ab:221111' => 'Apple QuickTime, Quality 438 (43%)',
+    '71d0e3444a4c82cf39048ba8cf7b1d5f:221111' => 'Apple QuickTime, Quality 439 (43%)',
+    '9f48e71f610caa47b94d3e474608cb3d:221111' => 'Apple QuickTime, Quality 440 (43%)',
+    'dcecd4f366d521e118e94d87ef915caa:221111' => 'Apple QuickTime, Quality 441 (43%)',
+    'cf0a070dc9b4a8983b50f8e3f105b857:221111' => 'Apple QuickTime, Quality 442 (43%)',
+    '5504a428191bc87e5c1ba4b5e9984a37:221111' => 'Apple QuickTime, Quality 443 (43%)',
+    'de6a322383022ee8d966e848a2df4f28:221111' => 'Apple QuickTime, Quality 444 (43%)',
+    '163be99e863436e9b3d32615785ec8e1:221111' => 'Apple QuickTime, Quality 445 (43%)',
+    '958185c48000065b5b8d03b0f975d95b:221111' => 'Apple QuickTime, Quality 446 (44%)',
+    '2d719cb263e284fc8621bbec1fe52cd5:221111' => 'Apple QuickTime, Quality 447 (44%)',
+    '8f0f54955cf19689f38df36715908b76:221111' => 'Apple QuickTime, Quality 448 (44%)',
+    '737c61e006222488645fa2e007f83f3c:221111' => 'Apple QuickTime, Quality 449 (44%)',
+    'bb342113b57cf66ce0cf3a09fae5fd16:221111' => 'Apple QuickTime, Quality 450 (44%)',
+    'cd3ed5b396580d8e9f0cb7b78baed8b8:221111' => 'Apple QuickTime, Quality 451 (44%)',
+    'e7914fbf6c9b2a127af3676726e6bd8b:221111' => 'Apple QuickTime, Quality 452 (44%)',
+    '377a7b50c2d7484255bbbf537bf9fa86:221111' => 'Apple QuickTime, Quality 453 (44%)',
+    '09f9009406d2fe8dfa1b35236f8b1bdb:221111' => 'Apple QuickTime, Quality 454 (44%)',
+    '78b0e590ea36cb11c495097049022d2e:221111' => 'Apple QuickTime, Quality 455 (44%)',
+    '984c0f34636e6197b508265f17cbd6c9:221111' => 'Apple QuickTime, Quality 456 (45%)',
+    '7fca22065811c0efe6599a15ca38f05e:221111' => 'Apple QuickTime, Quality 457 (45%)',
+    'd55d9744065708d7b6fa7fb6e8eb2453:221111' => 'Apple QuickTime, Quality 458 (45%)',
+    '63ef900bf59d41003a0e0602baa60681:221111' => 'Apple QuickTime, Quality 459 (45%)',
+    'e8b31dbd18c91229a3c40356efeb2622:221111' => 'Apple QuickTime, Quality 460 (45%)',
+    '8cb1bb16c6fa524199dad5513386d225:221111' => 'Apple QuickTime, Quality 461 (45%)',
+    'c53438ece0552cedb1ec0d50ad2d5dbe:221111' => 'Apple QuickTime, Quality 462 (45%)',
+    '5db6302d7e68c1a274139033681b8fcc:221111' => 'Apple QuickTime, Quality 463 (45%)',
+    'acd1d5ec1787c9d346d87c281a7b6da0:221111' => 'Apple QuickTime, Quality 464-465 (45%)',
+    'e66c03f97b19213f385136f014c78ac1:221111' => 'Apple QuickTime, Quality 466-467 (46%)',
+    '23816ed847127a41e3c7f52e04072e41:221111' => 'Apple QuickTime, Quality 468 (46%)',
+    'ebce337e9ef5a07775cebe40d7623862:221111' => 'Apple QuickTime, Quality 469 (46%)',
+    '09563e47ab174b05fb19f722e9aa43c3:221111' => 'Apple QuickTime, Quality 470 (46%)',
+    '545e14e832fb81f032526a9efcbf2450:221111' => 'Apple QuickTime, Quality 471 (46%)',
+    'edda5d6ae456d4cdccec80e390ac9279:221111' => 'Apple QuickTime, Quality 472 (46%)',
+    '9a43fc0aa6223673c32a49fb76d6525c:221111' => 'Apple QuickTime, Quality 473 (46%)',
+    'bdaf3e68c2925cbaad3864359fdbbb77:221111' => 'Apple QuickTime, Quality 474 (46%)',
+    '4f83a1a8338a8e6e70eaa58cd236f62a:221111' => 'Apple QuickTime, Quality 475 (46%)',
+    '879b320cfd6e27b2e283b573483bda81:221111' => 'Apple QuickTime, Quality 476 (46%)',
+    '2748fa249a86361b1b5f0662a88abdb3:221111' => 'Apple QuickTime, Quality 477 (47%)',
+    '32eb803f68d72719267a1313548e7180:221111' => 'Apple QuickTime, Quality 478 (47%)',
+    '771eeb43856b1821a271b0aa8398a243:221111' => 'Apple QuickTime, Quality 479 (47%)',
+    '653c5006512bb3aaa1e6a4e77078b630:221111' => 'Apple QuickTime, Quality 480 (47%)',
+    'c5c102ba5f004d49656f424d89e9773c:221111' => 'Apple QuickTime, Quality 481 (47%)',
+    'd5220fcfa99764e440684fbac6273cff:221111' => 'Apple QuickTime, Quality 482 (47%)',
+    'd300f18258f46060d89c994dbc370131:221111' => 'Apple QuickTime, Quality 483 (47%)',
+    '60258dcc1e3a81858d176080ef774730:221111' => 'Apple QuickTime, Quality 484 (47%)',
+    '8bda9fb1ed75249ac5b2feaad7b51d2f:221111' => 'Apple QuickTime, Quality 485 (47%)',
+    '9e334af92d75ab7d4ea1a9816840ea73:221111' => 'Apple QuickTime, Quality 486 (47%)',
+    'c40a38c96832a6042c6ddfc9754c1d6d:221111' => 'Apple QuickTime, Quality 487 (48%)',
+    '30be130aa27d0b91d6f55ed9b1cd6c84:221111' => 'Apple QuickTime, Quality 488 (48%)',
+    '3601e95d6cd507065d46b3f058229d91:221111' => 'Apple QuickTime, Quality 489 (48%)',
+    '9127f8ddd20e583523bc848e99061126:221111' => 'Apple QuickTime, Quality 490 (48%)',
+    '0d605d279c48a74ef71a24e89ca426a8:221111' => 'Apple QuickTime, Quality 491 (48%)',
+    'a5cd2d8592e1c45b67cfb3009d07fb49:221111' => 'Apple QuickTime, Quality 492 (48%)',
+    'e346ce6e3bee6abff16420f5ba95ceb9:221111' => 'Apple QuickTime, Quality 493 (48%)',
+    '03295b26893cab9c7dea4ec15ed56d08:221111' => 'Apple QuickTime, Quality 494 (48%)',
+    '76af24fe94edf8f3992e38c1dd6eebce:221111' => 'Apple QuickTime, Quality 495 (48%)',
+    '3c58e82299d87346d37023ea015f3e80:221111' => 'Apple QuickTime, Quality 496 (48%)',
+    'aa8940194463b7adc14f20dbee9c6a75:221111' => 'Apple QuickTime, Quality 497 (49%)',
+    '68a808b23bfa8096e04006171926b72c:221111' => 'Apple QuickTime, Quality 498 (49%)',
+    '34c0043b98d09193beda0cf5d1ada274:221111' => 'Apple QuickTime, Quality 499 (49%)',
+    '5881bb3c6e7e2ac43983b4b1e947a6c3:221111' => 'Apple QuickTime, Quality 500 (49%)',
+    'a0a7061bc100f051a3c5470559661138:221111' => 'Apple QuickTime, Quality 501 (49%)',
+    '62e6812d1f7935adddd1a69227cdf626:221111' => 'Apple QuickTime, Quality 502 (49%)',
+    '94f6dbd754fb4ba3c92698d5f08084f9:221111' => 'Apple QuickTime, Quality 503 (49%)',
+    'b7257ba67e4b38b7ccdca2a65d60c970:221111' => 'Apple QuickTime, Quality 504 (49%)',
+    '5a19d6130b03080dfedef45b6415f4f8:221111' => 'Apple QuickTime, Quality 505 (49%)',
+    '2b3262e10b1563600a5f0738fec342ed:221111' => 'Apple QuickTime, Quality 506 (49%)',
+    '295cb1e2772312ba5cd546966d1aa70d:221111' => 'Apple QuickTime, Quality 507 (50%)',
+    'c910bcb7b9e8967b87cfa08229d9ca34:221111' => 'Apple QuickTime, Quality 508 (50%)',
+    '61c8506b490d5e596151b951ffa7a14f:221111' => 'Apple QuickTime, Quality 509 (50%)',
+    'ae15629cecc940fef9f24ad9f207fa10:221111' => 'Apple QuickTime, Quality 510 (50%)',
+    'c8ef3c50ca99c44ea13f1692ac1190dc:221111' => 'Apple QuickTime, Quality 511 (50%)',
+    '50500b1272433ef5c9c96f16069fbdf1:221111' => 'Apple QuickTime, Quality 512 (50%)',
+    'e41e5416e21dbfb5a41f006b3485f5bb:221111' => 'Apple QuickTime, Quality 513 (50%)',
+    'd606add3e7590885ac8978af6d09a2aa:221111' => 'Apple QuickTime, Quality 514 (50%)',
+    'cc3936c39c298ef67d9196d0254b0c19:221111' => 'Apple QuickTime, Quality 515 (50%)',
+    'e83f8505dc3f5f46b37e22b590f71b98:221111' => 'Apple QuickTime, Quality 516 (50%)',
+    '2a8e27e03b6e1555335c91231c452bba:221111' => 'Apple QuickTime, Quality 517 (50%)',
+    '52ab880d25db7b36137e2a3c04987c9a:221111' => 'Apple QuickTime, Quality 518 (51%)',
+    'ce2335cc1f8289deda620877f50fd90d:221111' => 'Apple QuickTime, Quality 519 (51%)',
+    'bbad0e19b252268530df19c563aa9176:221111' => 'Apple QuickTime, Quality 520 (51%)',
+    '3184b71ca26bfe0c80811cf10423fa92:221111' => 'Apple QuickTime, Quality 521 (51%)',
+    '37802f44dab089a35e03b94a298b19da:221111' => 'Apple QuickTime, Quality 522 (51%)',
+    '5e528bd6778792490c6cf292cf9ba8df:221111' => 'Apple QuickTime, Quality 523 (51%)',
+    'fbe0f5b89f266ff382f2b14c70a83097:221111' => 'Apple QuickTime, Quality 524 (51%)',
+    'a4bfd80e0c8b9ae7a1114d79a7b63ad6:221111' => 'Apple QuickTime, Quality 525 (51%)',
+    'abdf532dc2005805db7d8d0214227146:221111' => 'Apple QuickTime, Quality 526 (51%)',
+    '2a7ec778642b15b8bce238f7b63ef537:221111' => 'Apple QuickTime, Quality 527 (51%)',
+    '70073f02f04ee893510bceb09e411d53:221111' => 'Apple QuickTime, Quality 528 (52%)',
+    '345d210b180a45bd23b0c7931c59c263:221111' => 'Apple QuickTime, Quality 529 (52%)',
+    'ddbc4e6566bbcc74b6205526393ef468:221111' => 'Apple QuickTime, Quality 530 (52%)',
+    '420af34c4f718cc0a10de5285140b6e0:221111' => 'Apple QuickTime, Quality 531 (52%)',
+    '16b6c2d8688113b1a28afbbc57f46f80:221111' => 'Apple QuickTime, Quality 532-533 (52%)',
+    '4a2a0e381fed49e5d5ba074998652561:221111' => 'Apple QuickTime, Quality 534 (52%)',
+    '50f1255f2424b2de5b930751ddf24842:221111' => 'Apple QuickTime, Quality 535 (52%)',
+    '80f2c05e2ad3524f18dd55bac10ee2e3:221111' => 'Apple QuickTime, Quality 536 (52%)',
+    '6c0916ab5aa02602cc682bcdbc22369e:221111' => 'Apple QuickTime, Quality 537 (52%)',
+    'f7e5656e1f2cf036e9a57a6c02373398:221111' => 'Apple QuickTime, Quality 538 (53%)',
+    '92044affd220e31ee953aff021144b29:221111' => 'Apple QuickTime, Quality 539 (53%)',
+    '2bafe4b75b8a105d72e981b21fe3b6cf:221111' => 'Apple QuickTime, Quality 540 (53%)',
+    'ca0e84028714f19cf20cb868d1cd346c:221111' => 'Apple QuickTime, Quality 541 (53%)',
+    'db1ae392a31d30cd5564dc7bbea24019:221111' => 'Apple QuickTime, Quality 542 (53%)',
+    '4417e739b9244781987769c2177abc6f:221111' => 'Apple QuickTime, Quality 543 (53%)',
+    'f1de58c1c6a48dc36ce7e8c69636539c:221111' => 'Apple QuickTime, Quality 544 (53%)',
+    '10c931d7bff7bfcc20e37f0868887228:221111' => 'Apple QuickTime, Quality 545 (53%)',
+    'e082971717023e667f3d922bbccf089b:221111' => 'Apple QuickTime, Quality 546 (53%)',
+    '5a285190351b16fee0eb14778280d74f:221111' => 'Apple QuickTime, Quality 547 (53%)',
+    'aad0e2cd42c5adaec41080a05be4ffdc:221111' => 'Apple QuickTime, Quality 548 (54%)',
+    'de802b8c64d7f854081c7df6ed345b43:221111' => 'Apple QuickTime, Quality 549 (54%)',
+    '82f45d11d651d93a67995965b94aa649:221111' => 'Apple QuickTime, Quality 550 (54%)',
+    '617c4c853344ef079f4a1f1062672e8c:221111' => 'Apple QuickTime, Quality 551-552 (54%)',
+    '90d96923be1883e6ee15a9d0d32a114c:221111' => 'Apple QuickTime, Quality 553 (54%)',
+    '307c47179fdad179b5f962228c115db8:221111' => 'Apple QuickTime, Quality 554 (54%)',
+    'a4683813bdf6e2bd429c4c5676128384:221111' => 'Apple QuickTime, Quality 555 (54%)',
+    '8e3cfc2fc9cfbba0f6aed9850504ebb6:221111' => 'Apple QuickTime, Quality 556 (54%)',
+    'a8f8928c72b69049e1da7639e977c9c7:221111' => 'Apple QuickTime, Quality 557 (54%)',
+    '1fb4c8af2d70cdeecab3fd9fc882e0ce:221111' => 'Apple QuickTime, Quality 558 (54%)',
+    '98ddda3b0ada32ce919b9af9df4054dd:221111' => 'Apple QuickTime, Quality 559 (55%)',
+    'b43ab5c404469c416e853e52497b3f0d:221111' => 'Apple QuickTime, Quality 560 (55%)',
+    'd9696efa02b9de813caf8d684b06346f:221111' => 'Apple QuickTime, Quality 561 (55%)',
+    'be63c4e967eff819bd8a052a561a4576:221111' => 'Apple QuickTime, Quality 562 (55%)',
+    'f984581f90913e44f3898fffd8fce8b0:221111' => 'Apple QuickTime, Quality 563 (55%)',
+    '082779cf55f6b922036f11b74df54110:221111' => 'Apple QuickTime, Quality 564 (55%)',
+    '066fd6cb3a5dd994fc6159987afde581:221111' => 'Apple QuickTime, Quality 565 (55%)',
+    '133351a0f39427f1199312585cd6c997:221111' => 'Apple QuickTime, Quality 566 (55%)',
+    '6c23da63c864f1433ec198ae202e56f0:221111' => 'Apple QuickTime, Quality 567 (55%)',
+    '7d1819ccce2756fcf6dfbb67565c2552:221111' => 'Apple QuickTime, Quality 568 (55%)',
+    'd9794fa54e2ef47be48b972cdca910c2:221111' => 'Apple QuickTime, Quality 569 (56%)',
+    '085db73bd47194c8fdf567fc619c3b62:221111' => 'Apple QuickTime, Quality 570 (56%)',
+    '9866add6e1d251e1d4c40793f4300dce:221111' => 'Apple QuickTime, Quality 571 (56%)',
+    '1b9e7e39831b05b058025ae0a7482d44:221111' => 'Apple QuickTime, Quality 572 (56%)',
+    'a8b52e666bd3d81404c0f8915ac18b43:221111' => 'Apple QuickTime, Quality 573 (56%)',
+    'e34d11f979458a87492b57eabfd4f4ea:221111' => 'Apple QuickTime, Quality 574 (56%)',
+    '4295c1330dec60585760cbb05b79662d:221111' => 'Apple QuickTime, Quality 575 (56%)',
+    '9205cc28769d94d6d00c25804ac70a88:221111' => 'Apple QuickTime, Quality 576 (56%)',
+    'b5648f13228d20fd7ae81965394f7515:221111' => 'Apple QuickTime, Quality 577 (56%)',
+    'c8f02bf550c40daa39b28911a4ef5a69:221111' => 'Apple QuickTime, Quality 578 (56%)',
+    'c2b23a91d377ce2d99ac4109f2740069:221111' => 'Apple QuickTime, Quality 579 (57%)',
+    'c0cecb47363aff00a2764a915f95cd35:221111' => 'Apple QuickTime, Quality 580 (57%)',
+    'fc0d8f17be060220464fe7bc0a2d754e:221111' => 'Apple QuickTime, Quality 581 (57%)',
+    '63b59904874e5e427ddecb37e12f90c7:221111' => 'Apple QuickTime, Quality 582 (57%)',
+    'df6535865562ce7cbf08e9368e991a95:221111' => 'Apple QuickTime, Quality 583 (57%)',
+    '74523ad3424dcff6aa697c3ce433ad4e:221111' => 'Apple QuickTime, Quality 584 (57%)',
+    'cbdec670ec6d9105277434b304226920:221111' => 'Apple QuickTime, Quality 585 (57%)',
+    '68783ed0a7956cf0b7a1b2787e756213:221111' => 'Apple QuickTime, Quality 586 (57%)',
+    'a431976a61e281e7b9d808f094b74d2e:221111' => 'Apple QuickTime, Quality 587 (57%)',
+    '8e2a66454fb149552d4538d53ec033aa:221111' => 'Apple QuickTime, Quality 588 (57%)',
+    '49222c4a3be01e93baad695bba63b254:221111' => 'Apple QuickTime, Quality 589 (58%)',
+    'ab8fe796c87f9f61cedbfa64af9f5dec:221111' => 'Apple QuickTime, Quality 590 (58%)',
+    '9bfe788e7ae4bc9cbe76d36f9a2b1b5e:221111' => 'Apple QuickTime, Quality 591 (58%)',
+    '22b5f11b635ea5484469708cd7e6e3d9:221111' => 'Apple QuickTime, Quality 592 (58%)',
+    '44e36eb25c6f9e313ef2a8f4c520c335:221111' => 'Apple QuickTime, Quality 593 (58%)',
+    'c71aa81fb12b378dd31a1ca128942f76:221111' => 'Apple QuickTime, Quality 594 (58%)',
+    'e56ca8f4da20395ec1f87d380198fa0a:221111' => 'Apple QuickTime, Quality 595 (58%)',
+    '38f4d508dcf9c82d9488b42a2487b191:221111' => 'Apple QuickTime, Quality 596 (58%)',
+    '3da1e7270e0900a17a0a4ff8d3c9a488:221111' => 'Apple QuickTime, Quality 597 (58%)',
+    '900fee18a5f6d1dc3fd856d3d92f5414:221111' => 'Apple QuickTime, Quality 598 (58%)',
+    '3c724d4b5d8cbe203ebbf92ea8e22808:221111' => 'Apple QuickTime, Quality 599 (58%)',
+    'e7e7befa282a985a0532634f360df7db:221111' => 'Apple QuickTime, Quality 600 (59%)',
+    '1f21bf5b7e0e79c229ef4d06fc9d3cc8:221111' => 'Apple QuickTime, Quality 601 (59%)',
+    '3bb09b202acd618286d26a33f688f7c7:221111' => 'Apple QuickTime, Quality 602 (59%)',
+    '9717c5a17cbffdfaa2e5d3769b87fbc5:221111' => 'Apple QuickTime, Quality 603 (59%)',
+    'ffa7874d293c62ecc55c098b8f305ae1:221111' => 'Apple QuickTime, Quality 604 (59%)',
+    'e68841bf28d33d749d0031bfe3a5219c:221111' => 'Apple QuickTime, Quality 605 (59%)',
+    '5862c8c2b241a9760f6804d970eefd66:221111' => 'Apple QuickTime, Quality 606 (59%)',
+    '1d069604250e871bd92a4a24c7be2bd5:221111' => 'Apple QuickTime, Quality 607 (59%)',
+    '3806bcbefd350e8791be95dfc62bab27:221111' => 'Apple QuickTime, Quality 608 (59%)',
+    '490b035a665ef80c7b48804461d55b7f:221111' => 'Apple QuickTime, Quality 609 (59%)',
+    'bd6943a8c92a14e74d2b24052a19400a:221111' => 'Apple QuickTime, Quality 610 (60%)',
+    '93e725418f46b2a70723523bef0979fe:221111' => 'Apple QuickTime, Quality 611 (60%)',
+    '5b66fa5c0c1ba746289747229193cfb0:221111' => 'Apple QuickTime, Quality 612 (60%)',
+    '1bdac971e8cddd198ad3123849370037:221111' => 'Apple QuickTime, Quality 613 (60%)',
+    '20f7b70185f4b324a8451ac4657c1d66:221111' => 'Apple QuickTime, Quality 614 (60%)',
+    '86ab18d6c1359a424f303fcfd0930df2:221111' => 'Apple QuickTime, Quality 615 (60%)',
+    '0d70031c9962dba7c39da59ada2f1660:221111' => 'Apple QuickTime, Quality 616-617 (60%)',
+    '9cb9a256b6deb481cf13e5230fe87dbb:221111' => 'Apple QuickTime, Quality 618-619 (60%)',
+    'cb34e1a0e18a4dd7ffe823f9c92b3622:221111' => 'Apple QuickTime, Quality 620 (61%)',
+    'ac015afc1d80314edd832aebfb495d25:221111' => 'Apple QuickTime, Quality 621 (61%)',
+    '4974cc7044768888244b324449a238ab:221111' => 'Apple QuickTime, Quality 622 (61%)',
+    'bc4541f5bc4d58b99b53d24f3f520b32:221111' => 'Apple QuickTime, Quality 623 (61%)',
+    'ec2fd56a50df0e42498018d441a3aa75:221111' => 'Apple QuickTime, Quality 624 (61%)',
+    '153a6f0994d16003aa4f1112e6757467:221111' => 'Apple QuickTime, Quality 625 (61%)',
+    'ed6b90ca62ed648d1102e1c506a0af26:221111' => 'Apple QuickTime, Quality 626 (61%)',
+    '18593e50c21c8ad521b30933ef7479b1:221111' => 'Apple QuickTime, Quality 627 (61%)',
+    '6f96ed52a987d67e8d950b2627d3fbc2:221111' => 'Apple QuickTime, Quality 628 (61%)',
+    'e76d86e8de4f0bf9e58cd389e0a8c117:221111' => 'Apple QuickTime, Quality 629 (61%)',
+    '4fa27c83741226576ac6359cd4f6248e:221111' => 'Apple QuickTime, Quality 630 (62%)',
+    'be010732a7783ee345548a1eb95d024a:221111' => 'Apple QuickTime, Quality 631 (62%)',
+    '6700663d4ebaeb394bfd3c85597347b5:221111' => 'Apple QuickTime, Quality 632 (62%)',
+    '34dba33043aa5ee317b7649242e702b1:221111' => 'Apple QuickTime, Quality 633 (62%)',
+    '821d7e59bcf756171b7644ec5736266e:221111' => 'Apple QuickTime, Quality 634 (62%)',
+    'd81683c0458d9ad72751530d6fbc1389:221111' => 'Apple QuickTime, Quality 635 (62%)',
+    '4c04d6fe904a4b6ff8b25c9f0e9f0a16:221111' => 'Apple QuickTime, Quality 636 (62%)',
+    '8efda55d6186d9867189c5cb572c5413:221111' => 'Apple QuickTime, Quality 637 (62%)',
+    '25497c83113bd738e89d91bd48d7086c:221111' => 'Apple QuickTime, Quality 638 (62%)',
+    '84c8e142e6d27734b126f76653b9199d:221111' => 'Apple QuickTime, Quality 639 (62%)',
+    'bdaf13038b56b5701f60300528f8a89c:221111' => 'Apple QuickTime, Quality 640-641 (63%)',
+    'b015ada43293b8d5bd2a8f288f8fb928:221111' => 'Apple QuickTime, Quality 642 (63%)',
+    '8134ff0c4713cc1ef4a25ff60b49ac54:221111' => 'Apple QuickTime, Quality 643 (63%)',
+    '967fc5c3ece2b69662257c76397416c9:221111' => 'Apple QuickTime, Quality 644 (63%)',
+    'd01a38e0f568d2a7b6b71f8fa63b8bcc:221111' => 'Apple QuickTime, Quality 645 (63%)',
+    '5229288e448311401bb284133ac7d48c:221111' => 'Apple QuickTime, Quality 646 (63%)',
+    '76d22de881d1b95b491689b589743b7a:221111' => 'Apple QuickTime, Quality 647 (63%)',
+    'c81b03b0291d2277461a551ed6861252:221111' => 'Apple QuickTime, Quality 648-649 (63%)',
+    'ebb774b4e106d1a9df5824958d4e5a95:221111' => 'Apple QuickTime, Quality 650 (63%)',
+    '9ed53fb5bc8e397daf9409251c0a0a6c:221111' => 'Apple QuickTime, Quality 651 (64%)',
+    '87d40f2e4dad34fa435c62af6817dc18:221111' => 'Apple QuickTime, Quality 652 (64%)',
+    '0b933cf90e62682da926267d6356ac2b:221111' => 'Apple QuickTime, Quality 653 (64%)',
+    '2c4a4cb841ee92aa3a2b4c93467ba7a8:221111' => 'Apple QuickTime, Quality 654 (64%)',
+    '8a6ba56597670b7adb70901eca278049:221111' => 'Apple QuickTime, Quality 655 (64%)',
+    'd1ef25928fd4eefe131ffcfc249b9f8a:221111' => 'Apple QuickTime, Quality 656 (64%)',
+    '8c85462b5a01db09bcbf304d7be1d543:221111' => 'Apple QuickTime, Quality 657 (64%)',
+    '19c03533b9b2e3304a0b02d9b1054497:221111' => 'Apple QuickTime, Quality 658 (64%)',
+    'd2baa8fbc56f0970f820c376c6065d41:221111' => 'Apple QuickTime, Quality 659 (64%)',
+    'e6a0a679a13a99de16e13c6ea2829deb:221111' => 'Apple QuickTime, Quality 660-661 (64-65%)',
+    '8e4f695afcf2a06254561e5e22b7a80b:221111' => 'Apple QuickTime, Quality 662 (65%)',
+    'd053fd2c67ce96b0ecf9ffc4b7f7775d:221111' => 'Apple QuickTime, Quality 663 (65%)',
+    '326c33f64f96592487d2bfdd198738bf:221111' => 'Apple QuickTime, Quality 664 (65%)',
+    '1ff8f5ff33353a3ee0b6dc8fbb6321a0:221111' => 'Apple QuickTime, Quality 665 (65%)',
+    '14a5534e4216458662a43101d56d84c8:221111' => 'Apple QuickTime, Quality 666 (65%)',
+    '0643b87475939754c8d56825cd96242f:221111' => 'Apple QuickTime, Quality 667 (65%)',
+    '45c46a02a434d8ea759742907bfa0ee5:221111' => 'Apple QuickTime, Quality 668 (65%)',
+    '2916d9453b885ee4123e6e3ee94ccbc7:221111' => 'Apple QuickTime, Quality 669-671 (65-66%)',
+    'b8fca611f92cbc459fe21e11f0214328:221111' => 'Apple QuickTime, Quality 672-673 (66%)',
+    'f40fb322c4bde68a2902c86c613af841:221111' => 'Apple QuickTime, Quality 674 (66%)',
+    '1cbd419717a2916b53f9f504ec1167ca:221111' => 'Apple QuickTime, Quality 675 (66%)',
+    '79f546689b548868a904f50214928aa1:221111' => 'Apple QuickTime, Quality 676 (66%)',
+    '8ff6f2d4369155b0474417b00c3c4ac9:221111' => 'Apple QuickTime, Quality 677 (66%)',
+    'c60dbbefd4f215b9359dd004f4fb0fd3:221111' => 'Apple QuickTime, Quality 678 (66%)',
+    'c192d5847d1146a31db621263a9ce2f5:221111' => 'Apple QuickTime, Quality 679 (66%)',
+    '4a2361c48a583f6df779d1e6088ed83c:221111' => 'Apple QuickTime, Quality 680 (66%)',
+    '6c6260b84a3a588614d65133430289ea:221111' => 'Apple QuickTime, Quality 681 (67%)',
+    '6773f3db56ae831012dbe43c1650571a:221111' => 'Apple QuickTime, Quality 682 (67%)',
+    '813b89236cfe429fe534361f28ace015:221111' => 'Apple QuickTime, Quality 683 (67%)',
+    '363b54d38094e5f2e2d63c50870ae76c:221111' => 'Apple QuickTime, Quality 684 (67%)',
+    '7b17607b9954c37e525b1fbc35271553:221111' => 'Apple QuickTime, Quality 685 (67%)',
+    '8b1138e2d88033d42698a386a2e8605b:221111' => 'Apple QuickTime, Quality 686 (67%)',
+    'c029b8a48e3c93f7c0367f2a149491c7:221111' => 'Apple QuickTime, Quality 687 (67%)',
+    'a36199f5a090de94b10a32fbe05f2916:221111' => 'Apple QuickTime, Quality 688-689 (67%)',
+    'a873e49b871c32bcaf8e3c6622744e70:221111' => 'Apple QuickTime, Quality 690 (67%)',
+    'b9d16f36087d4cca70eef1512c4be569:221111' => 'Apple QuickTime, Quality 691 (67%)',
+    'd5994dbe056ea3544b3256a7a6b53749:221111' => 'Apple QuickTime, Quality 692 (68%)',
+    '0106cf02dcf4109cc6f02fa4ec0e2700:221111' => 'Apple QuickTime, Quality 693 (68%)',
+    '7d71776416a8771d10e3c2e6dc6a5f21:221111' => 'Apple QuickTime, Quality 694-695 (68%)',
+    'c1557f789acc622c8858be4dfbc53c31:221111' => 'Apple QuickTime, Quality 696 (68%)',
+    '5a54f085c1780cadb13a7dea8347c7c6:221111' => 'Apple QuickTime, Quality 697 (68%)',
+    '04a5bb959bc203221e72e6575ff39602:221111' => 'Apple QuickTime, Quality 698 (68%)',
+    '116e3d5fee4e3a695c0f79c09c89ff84:221111' => 'Apple QuickTime, Quality 699 (68%)',
+    '145bfd5481e99e18c4c3707228557fa5:221111' => 'Apple QuickTime, Quality 700 (68%)',
+    '19ceef79e864691318beea6502ddc3e1:221111' => 'Apple QuickTime, Quality 701 (68%)',
+    'dd0a023941d7bfd118d272f4f925e6e2:221111' => 'Apple QuickTime, Quality 702 (69%)',
+    '81f039d6a0ded8227dc51273d153b295:221111' => 'Apple QuickTime, Quality 703-704 (69%)',
+    '9a7ebf265afce16abaa6ca2fbb550b63:221111' => 'Apple QuickTime, Quality 705 (69%)',
+    '8d0fed09156984328f90f9f19fb5a079:221111' => 'Apple QuickTime, Quality 706 (69%)',
+    'be7c72e09c46622b0d2b93e170a03e17:221111' => 'Apple QuickTime, Quality 707 (69%)',
+    '50a510968effffab80bed1d08c6c5ccc:221111' => 'Apple QuickTime, Quality 708 (69%)',
+    'da2501a6f59b2256adb0833b58b504f2:221111' => 'Apple QuickTime, Quality 709 (69%)',
+    '2a1b83345108443a090cdab4c83143fb:221111' => 'Apple QuickTime, Quality 710 (69%)',
+    'e7f293f640878b53fe95a7cb0b1dcc83:221111' => 'Apple QuickTime, Quality 711-712 (69-70%)',
+    'd9e0a4c08ef5d7f72eecce74c94c054d:221111' => 'Apple QuickTime, Quality 713 (70%)',
+    'c5774ffb4573926fd03d4175818c0e5d:221111' => 'Apple QuickTime, Quality 714 (70%)',
+    'e2b368a164b67e15598683f9f184bd77:221111' => 'Apple QuickTime, Quality 715 (70%)',
+    'f30792e8fad278c3e1677b5f5b74c682:221111' => 'Apple QuickTime, Quality 716-717 (70%)',
+    '6f6bfc10750e6717cc3791a9ea1d7569:221111' => 'Apple QuickTime, Quality 718-719 (70%)',
+    '5e3981a937c61480451d5bdc253e5472:221111' => 'Apple QuickTime, Quality 720 (70%)',
+    'c4fb82f47a7b002d5cab421592ae4972:221111' => 'Apple QuickTime, Quality 721 (70%)',
+    'a6c4a173169d168e003839e51f035661:221111' => 'Apple QuickTime, Quality 722 (71%)',
+    '72df283a5c07671eba341500a3fc18f1:221111' => 'Apple QuickTime, Quality 723 (71%)',
+    'dfb203555c34fe146c526350e11309eb:221111' => 'Apple QuickTime, Quality 724 (71%)',
+    '033472a8a855fab8cd8f6a5788dd07c8:221111' => 'Apple QuickTime, Quality 725 (71%)',
+    '5b8a79eec9b7eb7755deb7f2c189e94a:221111' => 'Apple QuickTime, Quality 726 (71%)',
+    'ad3aad027e3829959ebeb6288bfab268:221111' => 'Apple QuickTime, Quality 727 (71%)',
+    '2234156f0550a047700c2a08459c8242:221111' => 'Apple QuickTime, Quality 728 (71%)',
+    '0c0351c3a444b851cd105dd5cc4db59c:221111' => 'Apple QuickTime, Quality 729 (71%)',
+    'c10fca5e6f66238ab09f7e8105f54e39:221111' => 'Apple QuickTime, Quality 730 (71%)',
+    '74cc07bbb7049d59aff0c4965d4d5084:221111' => 'Apple QuickTime, Quality 731 (71%)',
+    'ce9ad8466ffd84b91039326e8688c44a:221111' => 'Apple QuickTime, Quality 732-733 (71-72%)',
+    'e4b0c56d41f4af9e10971876ad7ad56d:221111' => 'Apple QuickTime, Quality 734 (72%)',
+    '96076425ecc546ec028d0eab48332756:221111' => 'Apple QuickTime, Quality 735 (72%)',
+    'ba49b0656894f3c76d852223721b3b1f:221111' => 'Apple QuickTime, Quality 736 (72%)',
+    'ae5c6eab0d57249acbcb8b1990b2602f:221111' => 'Apple QuickTime, Quality 737-738 (72%)',
+    '72f08842473a6c504469d341259e5cd7:221111' => 'Apple QuickTime, Quality 739-740 (72%)',
+    'c9f953acdfc1f5afdbb9e9f74692d23e:221111' => 'Apple QuickTime, Quality 741 (72%)',
+    '5a1b57a2583acf5c2428cd62fe24b773:221111' => 'Apple QuickTime, Quality 742 (72%)',
+    '6a9ead8b2339567482a172a581e86c15:221111' => 'Apple QuickTime, Quality 743-744 (73%)',
+    '513d9e9dabbb480eb60f7ef76b1d755e:221111' => 'Apple QuickTime, Quality 745 (73%)',
+    'b99bdcd0145833d52b916e71f2c20a04:221111' => 'Apple QuickTime, Quality 746 (73%)',
+    'ff084566430a3ed4733cd59aec26a55d:221111' => 'Apple QuickTime, Quality 747 (73%)',
+    '76bcc27918d8f12b343e6e5a41108781:221111' => 'Apple QuickTime, Quality 748 (73%)',
+    '7bf7022a7c12b3b7ea085b46158253e6:221111' => 'Apple QuickTime, Quality 749 (73%)',
+    '4baf3b1df2426fbdac3d0aaa0503ee94:221111' => 'Apple QuickTime, Quality 750 (73%)',
+    'bb0180b9eda074c3f913c8ada3d4c1ad:221111' => 'Apple QuickTime, Quality 751 (73%)',
+    'c5fcb1748f616ac97794d34b1b93616e:221111' => 'Apple QuickTime, Quality 752-753 (73-74%)',
+    '0da77ccec22a9cff9a049a47e86d3502:221111' => 'Apple QuickTime, Quality 754 (74%)',
+    'c31f71de437dc301d34f847d95267d9e:221111' => 'Apple QuickTime, Quality 755 (74%)',
+    '01137dc7ef90f0aee15362c221f7b1d3:221111' => 'Apple QuickTime, Quality 756-758 (74%)',
+    '026780f2172c289bc1ff73a34c6aee57:221111' => 'Apple QuickTime, Quality 759-760 (74%)',
+    '3fab8f2b141f95a989fc4b046ad825cb:221111' => 'Apple QuickTime, Quality 761 (74%)',
+    'cd091eeb9d27d9dc7cdb5bff73572679:221111' => 'Apple QuickTime, Quality 762 (74%)',
+    'ad2221ee8bb94a3558ed16766efaec4f:221111' => 'Apple QuickTime, Quality 763 (75%)',
+    '8a4ff70dce3efc9312ff7239e79b6bc9:221111' => 'Apple QuickTime, Quality 764 (75%)',
+    'b8d1fcda3a19d00788c2be73fd4c2c8e:221111' => 'Apple QuickTime, Quality 765-766 (75%)',
+    '3af16b87c33bb2e48152e249beb9147b:221111' => 'Apple QuickTime, Quality 767 (75%)',
+    '3af16b87c33bb2e48152e249beb9147b:211111' => 'Apple QuickTime, Quality 768 (75%)',
+    '683270dbffdc5cd2d4e6cb841f17b206:211111' => 'Apple QuickTime, Quality 769 (75%)',
+    '285bdd58fac87b174a22d2a93d69cd7c:211111' => 'Apple QuickTime, Quality 770 (75%)',
+    '312e047b5d9076cd1e126f3dbce928e5:211111' => 'Apple QuickTime, Quality 771 (75%)',
+    '99458d7a01a39fe126592d9afb1402ce:211111' => 'Apple QuickTime, Quality 772 (75%)',
+    'b4633256b0e0d5e2a5021f01ebabc105:211111' => 'Apple QuickTime, Quality 773 (75%)',
+    '90d39fd222f9114f613a315a894283ca:211111' => 'Apple QuickTime, Quality 774 (76%)',
+    '61b1d4a02498b7467f2c8e8cfebdfae9:211111' => 'Apple QuickTime, Quality 775-776 (76%)',
+    '987ebcbd20b633b40241fcd30266e986:211111' => 'Apple QuickTime, Quality 777 (76%)',
+    '31e214243395b008048469d4bc4dc780:211111' => 'Apple QuickTime, Quality 778 (76%)',
+    'db5b3a078a942131b5d86bc189baac24:211111' => 'Apple QuickTime, Quality 779 (76%)',
+    'ec440a2ffcbce8895beb663b36975073:211111' => 'Apple QuickTime, Quality 780-781 (76%)',
+    '93d7ac97a931be74c7fe849edc482ea1:211111' => 'Apple QuickTime, Quality 782 (76%)',
+    '3974d72e6831171ec970bbb09b9cc506:211111' => 'Apple QuickTime, Quality 783 (76%)',
+    '07bd22218437079a86ce0b93ffa9cc90:211111' => 'Apple QuickTime, Quality 784 (77%)',
+    '32757023bb5e7f703acf737a5a29c9d6:211111' => 'Apple QuickTime, Quality 785-786 (77%)',
+    '6096eb584b99a587f5527e20473aa9d1:211111' => 'Apple QuickTime, Quality 787 (77%)',
+    'c6d134475eb85bd454f2ee5153366c51:211111' => 'Apple QuickTime, Quality 788 (77%)',
+    'a3ba20f325ff36f874d633919185f92d:211111' => 'Apple QuickTime, Quality 789 (77%)',
+    'af10133169e143a2b3634c48dede9440:211111' => 'Apple QuickTime, Quality 790 (77%)',
+    '9dbb8223620e7f25ca3292849f7aa025:211111' => 'Apple QuickTime, Quality 791-792 (77%)',
+    '5071640a38c5898dd5d2043346fd23e1:211111' => 'Apple QuickTime, Quality 793-795 (77-78%)',
+    '60a0ca27f3e7289d97c033ca217899cc:211111' => 'Apple QuickTime, Quality 796-798 (78%)',
+    'f7a5ea485a254cba0d39cdeaf89ad344:211111' => 'Apple QuickTime, Quality 799 (78%)',
+    'd8cd0ca367d9afaf9a1aca0415da5361:211111' => 'Apple QuickTime, Quality 800 (78%)',
+    '87fb3c7402ba4edcda34b71696d2b0e3:211111' => 'Apple QuickTime, Quality 801 (78%)',
+    'f8df76525f7f97d2e89173989e6786af:211111' => 'Apple QuickTime, Quality 802-804 (78-79%)',
+    '64677161baed1c47d2fdd6eefd779583:211111' => 'Apple QuickTime, Quality 805 (79%)',
+    'ca39dde8e9b4ccd6261b28e089181639:211111' => 'Apple QuickTime, Quality 806-807 (79%)',
+    'e6c99d520b86fd6f5eb513d1a084324e:211111' => 'Apple QuickTime, Quality 808 (79%)',
+    '9e048c787b12b9ab47d6166e81bc8bda:211111' => 'Apple QuickTime, Quality 809 (79%)',
+    '03c035b39889356e0b10805d8549a1f7:211111' => 'Apple QuickTime, Quality 810 (79%)',
+    '15de51ede231cfbe123daa42a1a46070:211111' => 'Apple QuickTime, Quality 811-813 (79%)',
+    '725bcc59a6f5a1436dfa0dfd96cdcf44:211111' => 'Apple QuickTime, Quality 814 (79%)',
+    'd00103d50108e8be370a78d47f51aba0:211111' => 'Apple QuickTime, Quality 815 (80%)',
+    '1c4c74ccc581b11050cfe18792246e5e:211111' => 'Apple QuickTime, Quality 816 (80%)',
+    'b63e97c56859f2476ed3f15f40775fb5:211111' => 'Apple QuickTime, Quality 817 (80%)',
+    'aac2510e3cd617eb2cd60e7dc6f5d252:211111' => 'Apple QuickTime, Quality 818 (80%)',
+    '028caa124d0837dd9b1a64028e4f2965:211111' => 'Apple QuickTime, Quality 819 (80%)',
+    '0440231d1a4a1187bffaa5b5576827f9:211111' => 'Apple QuickTime, Quality 820 (80%)',
+    '6f879b2b5642ee3d01faf3410a721e2d:211111' => 'Apple QuickTime, Quality 821 (80%)',
+    '4642245b427d5dd5c1c3766c323204ac:211111' => 'Apple QuickTime, Quality 822-824 (80%)',
+    '8bd486eb557ae8f39948775aba222731:211111' => 'Apple QuickTime, Quality 825 (81%)',
+    '8bc4e4bec8e9b193c11ad90c7f8bfaf3:211111' => 'Apple QuickTime, Quality 826 (81%)',
+    'f54c2ea8437408238f6c181a355af6cb:211111' => 'Apple QuickTime, Quality 827-829 (81%)',
+    '0f58458f2b9959dbc57b4868200c0432:211111' => 'Apple QuickTime, Quality 830-832 (81%)',
+    '24f95056dce30d11bad39b33ab271262:211111' => 'Apple QuickTime, Quality 833-834 (81%)',
+    'bad6fdd8761fb9d0921384013acf783f:211111' => 'Apple QuickTime, Quality 835 (82%)',
+    '8c482fe6aef2a59a94cb779e6795e512:211111' => 'Apple QuickTime, Quality 836 (82%)',
+    '50b309f18bcf477742aa491ea55af777:211111' => 'Apple QuickTime, Quality 837 (82%)',
+    '92a9e0d027a1b2e5f7e49f7ffd96277e:211111' => 'Apple QuickTime, Quality 838-839 (82%)',
+    'a6df2748a4972d4323f0386820ce35a4:211111' => 'Apple QuickTime, Quality 840 (82%)',
+    '9ffb80389e2eed2301e6b07860c2fbd7:211111' => 'Apple QuickTime, Quality 841 (82%)',
+    '6042038094d7f4ad72c61c2a2e7a467f:211111' => 'Apple QuickTime, Quality 842 (82%)',
+    '78d004490e822405acded09846135e50:211111' => 'Apple QuickTime, Quality 843 (82%)',
+    'a589d880de576ed888c57814ccea47a0:211111' => 'Apple QuickTime, Quality 844 (82%)',
+    'beee113eea5950b8211cdc49e5a04099:211111' => 'Apple QuickTime, Quality 845 (83%)',
+    'f04fed79cdc47709d649187cfcc7e342:211111' => 'Apple QuickTime, Quality 846-849 (83%)',
+    'edb0be7fcce943c28d02ff78ae600afb:211111' => 'Apple QuickTime, Quality 850 (83%)',
+    '0e9648c1f28b99a377dcf7deec6450e6:211111' => 'Apple QuickTime, Quality 851-852 (83%)',
+    '2dffe433bbb9c81b05e569afd3d9b585:211111' => 'Apple QuickTime, Quality 853 (83%)',
+    '0ef4f8fa922f87f1be646fccaa0ef42e:211111' => 'Apple QuickTime, Quality 854 (83%)',
+    '4b799df6fc9476102f890343080e66f5:211111' => 'Apple QuickTime, Quality 855-856 (83-84%)',
+    '53a66cb32deb83c855f36b26527f4c10:211111' => 'Apple QuickTime, Quality 857 (84%)',
+    '151d7cd5a95929d45c6790beb87705fe:211111' => 'Apple QuickTime, Quality 858 (84%)',
+    'bc2afe0a9c7c68b8d84bd231209be3e2:211111' => 'Apple QuickTime, Quality 859-860 (84%)',
+    'b9d66564ab9c4bb0910eb228aa9a48e1:211111' => 'Apple QuickTime, Quality 861-863 (84%)',
+    '6808ca55a29fcb9c15db1925a84370c3:211111' => 'Apple QuickTime, Quality 864 (84%)',
+    'ee5b4ed7f04821d1e3a509d7565cb10d:211111' => 'Apple QuickTime, Quality 865 (84%)',
+    'd38be79f7c8c6c27a3268275b144add6:211111' => 'Apple QuickTime, Quality 866 (85%)',
+    '59eedef87f255db058b5ba0b1d3a4ce8:211111' => 'Apple QuickTime, Quality 867 (85%)',
+    '5e5530c45def7006a7f672ce5778513d:211111' => 'Apple QuickTime, Quality 868 (85%)',
+    'b09abfa40fc6607dc26d8b5df48c72fc:211111' => 'Apple QuickTime, Quality 869 (85%)',
+    'cfc78404529f2b81b16d3f25fc96e8f4:211111' => 'Apple QuickTime, Quality 870 (85%)',
+    '14c62682032efe8dc2de80c9330c6206:211111' => 'Apple QuickTime, Quality 871-872 (85%)',
+    'ffadac945c3420537e21e67ab3a843d6:211111' => 'Apple QuickTime, Quality 873-875 (85%)',
+    'e67a8a7e92a9f03413e9a67b99624b8b:211111' => 'Apple QuickTime, Quality 876-877 (86%)',
+    'ba4af3bb30dda0a7be4c04ff1ebbd9ef:211111' => 'Apple QuickTime, Quality 878-880 (86%)',
+    '3eedb8a357141ff5ae765fd3be2b232f:211111' => 'Apple QuickTime, Quality 881-886 (86-87%)',
+    '127b0599fc6804909a33832be7a9dd36:211111' => 'Apple QuickTime, Quality 887 (87%)',
+    'b697448eec21ef07f3111b62d592c423:211111' => 'Apple QuickTime, Quality 888-890 (87%)',
+    'a08a6b6535f292518b5ff6d0d05ae187:211111' => 'Apple QuickTime, Quality 891-893 (87%)',
+    'a439b365c2d0cf1fbaad2e42d331d759:211111' => 'Apple QuickTime, Quality 894 (87%)',
+    'bf0c20b20af6473b7c4a338ba57d1a96:211111' => 'Apple QuickTime, Quality 895 (87%)',
+    '09cf94311753aa9796ffd720749c51f7:211111' => 'Apple QuickTime, Quality 896 (88%)',
+    'a60bbd6538af00192c411020d7494a1d:211111' => 'Apple QuickTime, Quality 897-898 (88%)',
+    'df8ea903695e76e4b1466bdd3a3480c7:211111' => 'Apple QuickTime, Quality 899 (88%)',
+    'eb4eb617beaa4f23acf41167742806fc:211111' => 'Apple QuickTime, Quality 900-901 (88%)',
+    '591c923a44c635c33769704c9cfa6ab7:211111' => 'Apple QuickTime, Quality 902 (88%)',
+    '960caf85ef273541ac2e76c9554dc860:211111' => 'Apple QuickTime, Quality 903 (88%)',
+    '22c77ec6f4e8f75d48f98473abe62e59:211111' => 'Apple QuickTime, Quality 904-905 (88%)',
+    'fc8d384969030e7bc0255d34a7a5c0b0:211111' => 'Apple QuickTime, Quality 906 (88%)',
+    '42e7323506b113685e82e6d42664626f:211111' => 'Apple QuickTime, Quality 907-908 (89%)',
+    '7163b345b90553e246296a48b46cc0b3:211111' => 'Apple QuickTime, Quality 909-910 (89%)',
+    '52f25cf8c4d610dffcc45681def8fb49:211111' => 'Apple QuickTime, Quality 911-914 (89%)',
+    '5554cfd817a2713a690b957145b088ed:211111' => 'Apple QuickTime, Quality 915-917 (89-90%)',
+    '6ef0b71a5676c4645a3166b9c34744fa:211111' => 'Apple QuickTime, Quality 918-920 (90%)',
+    '1228da2b97793a88a41542ddcfca7ad2:211111' => 'Apple QuickTime, Quality 921-922 (90%)',
+    '9060906039e9ff37171ba48d908f6ad5:211111' => 'Apple QuickTime, Quality 923-924 (90%)',
+    '6eb301fb89e7d625129b77a53fe30dcc:211111' => 'Apple QuickTime, Quality 925-926 (90%)',
+    'ad5399708089baad5891319303ba92df:211111' => 'Apple QuickTime, Quality 927 (91%)',
+    'afd16e145464c7c5a3cd703017b4ef7a:211111' => 'Apple QuickTime, Quality 928 (91%)',
+    '4271405c840705072a102d7e18b374d9:211111' => 'Apple QuickTime, Quality 929 (91%)',
+    '72a91837a63fa7444416bc00a05d988b:211111' => 'Apple QuickTime, Quality 930 (91%)',
+    '8fe3845bafb06ee4de1a6f75c2a42e9b:211111' => 'Apple QuickTime, Quality 931 (91%)',
+    '8d3b678651ec71f27e3727718123f354:211111' => 'Apple QuickTime, Quality 932-933 (91%)',
+    '36d42b031eea0c9f626f15533e72162a:211111' => 'Apple QuickTime, Quality 934-936 (91%)',
+    '789076781ff1e18154091f2460c1bab5:211111' => 'Apple QuickTime, Quality 937-938 (92%)',
+    '07464723ecfd8e5ed8fd6904e9d15a23:211111' => 'Apple QuickTime, Quality 939 (92%)',
+    '0efd0d9423b440cfc8efacf2e4dfcb7f:211111' => 'Apple QuickTime, Quality 940 (92%)',
+    '80409b38f84336548b62e337a850e9cb:211111' => 'Apple QuickTime, Quality 941-943 (92%)',
+    '5fa6bb26309d43ca6c89d6cc776a68a4:211111' => 'Apple QuickTime, Quality 944-946 (92%)',
+    '705064f644ac4b24884500a40ad0f7cf:211111' => 'Apple QuickTime, Quality 947-948 (92-93%)',
+    'c181c79bc41cf5fe11e6f253242ce2c4:211111' => 'Apple QuickTime, Quality 949-951 (93%)',
+    '1a7da03994ee019a30dbd37117761467:211111' => 'Apple QuickTime, Quality 952-954 (93%)',
+    '070620a25578b4a38ed0c09d6d512de8:211111' => 'Apple QuickTime, Quality 955 (93%)',
+    '6a092d8fd56ca0e852d74bd86cfc4f47:211111' => 'Apple QuickTime, Quality 956-957 (93%)',
+    '66e85870faf72f4f3fe25486409b286a:211111' => 'Apple QuickTime, Quality 958 (94%)',
+    '31365833a4d7d0ef2c1db9b90e515f7f:211111' => 'Apple QuickTime, Quality 959-961 (94%)',
+    '2edccd94198ab5a459a8396d9a0be4aa:211111' => 'Apple QuickTime, Quality 962 (94%)',
+    'ca0bf66c467278f9d5ca5301840e7a7f:211111' => 'Apple QuickTime, Quality 963-967 (94%)',
+    '261bdba7fe6d8bca5302e4e93b52c1fb:211111' => 'Apple QuickTime, Quality 968-970 (95%)',
+    '762f9501e83d58307d1e102ddb343207:211111' => 'Apple QuickTime, Quality 971 (95%)',
+    'ba18a8f4175bdedfea7af9bf5fe8dd9c:211111' => 'Apple QuickTime, Quality 972-973 (95%)',
+    'd1a8052e7152e0c35d167e9e56418eb7:211111' => 'Apple QuickTime, Quality 974 (95%)',
+    '32682ece28c3bee7754fde6fec109b47:211111' => 'Apple QuickTime, Quality 975-977 (95%)',
+    'a8780d0f85eef638c6a448e57b157378:211111' => 'Apple QuickTime, Quality 978-979 (96%)',
+    'b79ff1a16807a48a31d457ad7e0b94f2:211111' => 'Apple QuickTime, Quality 980-984 (96%)',
+    '2bf80ea6a878f7ecb88ea827b58c98f8:211111' => 'Apple QuickTime, Quality 985-987 (96%)',
+    'add779ad00786bd2ccb9dcc226386b1a:211111' => 'Apple QuickTime, Quality 988-991 (96-97%)',
+    '56c4efb597cc30275229486199e60f70:211111' => 'Apple QuickTime, Quality 992-993 (97%)',
+    'c2df556e8ede9fb199b9a16e01279c6b:211111' => 'Apple QuickTime, Quality 994-996 (97%)',
+    '6af868a0eececd267495f749a38b4f95:211111' => 'Apple QuickTime, Quality 997-998 (97%)',
+    'c92c755320e7ce8f46f644b90b7907e8:211111' => 'Apple QuickTime, Quality 999-1000 (98%)',
+    '6fcbaaa11108d1712bad5410b3db5b91:211111' => 'Apple QuickTime, Quality 1001-1002 (98%)',
+    'f7d803e16f0c66df7d46747715b1ae24:211111' => 'Apple QuickTime, Quality 1003 (98%)',
+    '7f51ebf21174bcd3b027ae3cc77c4459:211111' => 'Apple QuickTime, Quality 1004 (98%)',
+    'f2423a8ae68a49cc6191a2ec80367893:211111' => 'Apple QuickTime, Quality 1005-1006 (98%)',
+    'f97cd4c7b1125556dc3eb57fc494e6b5:211111' => 'Apple QuickTime, Quality 1007-1009 (98-99%)',
+    '389e1ca056b1bd05dd29ecaecae5b4ae:211111' => 'Apple QuickTime, Quality 1010-1013 (99%)',
+    '43f9929d00af93968662983b891364d8:211111' => 'Apple QuickTime, Quality 1014-1016 (99%)',
+    '7e1453eec55a8c40166b2d8985ad6bdc:211111' => 'Apple QuickTime, Quality 1017 (99%)',
+    '31697e4b294a13e35ab8d55d3a9612ca:211111' => 'Apple QuickTime, Quality 1018-1020 (99-100%)',
+    'ec76274ff22c07e53299ad34633ba88f:211111' => 'Apple QuickTime, Quality 1021-1023 (100%)',
+    '7f8b33a26e7f35a6eaf2e95df81e1cca:111111' => 'Apple QuickTime, Quality 1024 (Lossless)',
+
+    # Apple QuickTime (Grayscale)
+    #
+    # Tested with:
+    # - QuickTime 7.5.0 (Win)
+    '7e6246d9be5273b979beb680b284e7b8:11' => 'Apple QuickTime, Quality 0-63 (0-6%)',
+    'caf33ddc94762bf60a8c5e5024550b21:11' => 'Apple QuickTime, Quality 64-80 (6-8%)',
+    '042ae0dbef2b1e91c4eb36e66a39b5b9:11' => 'Apple QuickTime, Quality 81-92 (8-9%)',
+    'bdcc7abca09941326c079bb3bc30de4d:11' => 'Apple QuickTime, Quality 93-101 (9-10%)',
+    '8edf0677ca6be750511593fad835bbb5:11' => 'Apple QuickTime, Quality 102-109 (10-11%)',
+    'dd54b4e3d8801f3a7969be542d165c6b:11' => 'Apple QuickTime, Quality 110-116 (11%)',
+    'c00374dece11c3cab5f2c3bf9621d365:11' => 'Apple QuickTime, Quality 117-122 (11-12%)',
+    'a2e3baa02454492ef811619ac18c65da:11' => 'Apple QuickTime, Quality 123-127 (12%)',
+    '8f699e4439175f5f0cf0f903040fb3c5:11' => 'Apple QuickTime, Quality 128-133 (13%)',
+    '50f9224c87a32486851bdbd3e686fd5b:11' => 'Apple QuickTime, Quality 134-137 (13%)',
+    'cccd5f36920fbe8ad77da2214f8ab6ed:11' => 'Apple QuickTime, Quality 138-142 (13-14%)',
+    '8bc7e3b8f24507e284075ebeb272c3f4:11' => 'Apple QuickTime, Quality 143-146 (14%)',
+    'bc156b933365b88e5ba9f1bd4b2fee4e:11' => 'Apple QuickTime, Quality 147-150 (14-15%)',
+    'a50ff29c6c2a7e73f742ca94678956ba:11' => 'Apple QuickTime, Quality 151-154 (15%)',
+    'd0a67359275cf9e2e8f35de79d2e28ae:11' => 'Apple QuickTime, Quality 155-157 (15%)',
+    '37914b5d31e7f0f13066e5292c07c305:11' => 'Apple QuickTime, Quality 158-161 (15-16%)',
+    '340aeb15b2b6c05968bb2c6e3d85cbed:11' => 'Apple QuickTime, Quality 162-164 (16%)',
+    'bc93228921ec863e90850325cfd90dd2:11' => 'Apple QuickTime, Quality 165-167 (16%)',
+    'd5c95455812515ad4855ed725d5bf2d9:11' => 'Apple QuickTime, Quality 168-170 (16-17%)',
+    'd018c811df2390446b43cc702888864c:11' => 'Apple QuickTime, Quality 171-173 (17%)',
+    '824a9788f50aad6ca26ada301cae5c72:11' => 'Apple QuickTime, Quality 174-176 (17%)',
+    'd35254d58224b1b6babda94d7f1a5ffe:11' => 'Apple QuickTime, Quality 177-179 (17%)',
+    '4177be1c82543b32bf6578dc3a78d49d:11' => 'Apple QuickTime, Quality 180-182 (18%)',
+    '88b94edfd7a6c7aadac520905e6cfa0a:11' => 'Apple QuickTime, Quality 183-184 (18%)',
+    '589b1ef8cc8bece150218e4646d9dfd6:11' => 'Apple QuickTime, Quality 185-187 (18%)',
+    'a6c15a75ab70e28c78e6084f909523bf:11' => 'Apple QuickTime, Quality 188-189 (18%)',
+    'd052e48078f986c715e68f502d371ccc:11' => 'Apple QuickTime, Quality 190-191 (19%)',
+    '7d4205e3d4e0b6c7071a418c9b5840cb:11' => 'Apple QuickTime, Quality 192-194 (19%)',
+    '2200d1873e51bf812bdcb57c10c6c14b:11' => 'Apple QuickTime, Quality 195-196 (19%)',
+    '395ef59782311cd2081887c78c40c4bc:11' => 'Apple QuickTime, Quality 197-198 (19%)',
+    'd33d12dc779097bee959fefac6de9a3e:11' => 'Apple QuickTime, Quality 199-201 (19-20%)',
+    '64ff54dc33f610e3705cae31428ce43d:11' => 'Apple QuickTime, Quality 202-203 (20%)',
+    'dbee605b07dfe30c992622877dffb049:11' => 'Apple QuickTime, Quality 204-205 (20%)',
+    'aa5a427657696f05da789e1516b8c2ff:11' => 'Apple QuickTime, Quality 206-207 (20%)',
+    'cf8fce0d4bde00a2feb680bb52667c8f:11' => 'Apple QuickTime, Quality 208-209 (20%)',
+    '81ac42cc63416f7c66cd2a51a8801cbd:11' => 'Apple QuickTime, Quality 210-211 (21%)',
+    '5e55cc3328e61e88b9f2a49af4ec2268:11' => 'Apple QuickTime, Quality 212-213 (21%)',
+    'ef938a0533502fe19f311d46c43fa86c:11' => 'Apple QuickTime, Quality 214-215 (21%)',
+    'f841cbd6a77d64924ab19845219f3399:11' => 'Apple QuickTime, Quality 216-217 (21%)',
+    '98b684f30055c84ba5734e29f7b98b5f:11' => 'Apple QuickTime, Quality 218 (21%)',
+    '8d4f697b3a2baaecc8765f31f54a76ae:11' => 'Apple QuickTime, Quality 219-220 (21%)',
+    '6fc283989bb3a8c91f6c4384df2fa25d:11' => 'Apple QuickTime, Quality 221-222 (22%)',
+    'dccca51d261b315120f069697872377d:11' => 'Apple QuickTime, Quality 223-224 (22%)',
+    '5869e4a9592a7900e740b09fe19261a1:11' => 'Apple QuickTime, Quality 225 (22%)',
+    'ebd575cf069eb906d2f2b2e202f67247:11' => 'Apple QuickTime, Quality 226-227 (22%)',
+    '7ed52852c280b97fd44def8434d84051:11' => 'Apple QuickTime, Quality 228-229 (22%)',
+    '984d291debac8a0caeaccccea5fbfbdf:11' => 'Apple QuickTime, Quality 230 (22%)',
+    '9b2247e0f55b4485e7c55a04ee6a801c:11' => 'Apple QuickTime, Quality 231-232 (23%)',
+    'd2a1887cf45aecd63d838e585dbb5794:11' => 'Apple QuickTime, Quality 233-234 (23%)',
+    '6bb5ab15f80beebcb73fae0ef089fa61:11' => 'Apple QuickTime, Quality 235 (23%)',
+    '281f65a19e5de33d9ff5f3afeda06973:11' => 'Apple QuickTime, Quality 236-237 (23%)',
+    '563f732877b2c654d571c269bbb36a40:11' => 'Apple QuickTime, Quality 238 (23%)',
+    'fa11118bb9f90b1464e34c785d0da357:11' => 'Apple QuickTime, Quality 239-240 (23%)',
+    '8dc4cff27c3c5196b4bc8905ef32f119:11' => 'Apple QuickTime, Quality 241 (24%)',
+    '2ac28889e4ad4724d49f8b4c36b0cece:11' => 'Apple QuickTime, Quality 242-243 (24%)',
+    '5cbeb8f83a47b6a5e8711fe0ea7c42d7:11' => 'Apple QuickTime, Quality 244 (24%)',
+    'd5d329f5687d154e4ceeb48697b848ba:11' => 'Apple QuickTime, Quality 245-246 (24%)',
+    'd3eaad34ae4fc8a3ac6330c1c9dceb28:11' => 'Apple QuickTime, Quality 247 (24%)',
+    '29b74834ce7570b9c175d0200e75316e:11' => 'Apple QuickTime, Quality 248-249 (24%)',
+    '850f2b2aaa99ad390bc9443be1b587dc:11' => 'Apple QuickTime, Quality 250 (24%)',
+    '036d2395718f99bf916486e1af42cb92:11' => 'Apple QuickTime, Quality 251 (25%)',
+    'e9275719ef4cb335f9dfed63c3737f0e:11' => 'Apple QuickTime, Quality 252-253 (25%)',
+    'dfcbd3df5c6b96106e6348b77f89c56a:11' => 'Apple QuickTime, Quality 254 (25%)',
+    'f9ef906cd67c9f9b62514a6ac1f8bd3f:11' => 'Apple QuickTime, Quality 255 (25%)',
+    '469d14cef27dbb7c1f6f49324c077852:11' => 'Apple QuickTime, Quality 256-257 (25%)',
+    '65d7471a913f6cc87e9dc65ea594606b:11' => 'Apple QuickTime, Quality 258 (25%)',
+    '6b590185b5d6ecbc1d79c2624a0d5319:11' => 'Apple QuickTime, Quality 259 (25%)',
+    'fbf3d8d87f68077aa95e5e40047c1607:11' => 'Apple QuickTime, Quality 260-261 (25%)',
+    '7e3999424de8a8f6bb84e3cfc07628e8:11' => 'Apple QuickTime, Quality 262 (26%)',
+    '6c0476ba4b3fcc4675cfab20d3c96368:11' => 'Apple QuickTime, Quality 263 (26%)',
+    '0bb76dd0e08175a90343a9c7dab48bfa:11' => 'Apple QuickTime, Quality 264-265 (26%)',
+    '83c8ceab43dedde06d8068e5b8ccdc2b:11' => 'Apple QuickTime, Quality 266 (26%)',
+    '5aee693372b77c9721dba9d3596e371c:11' => 'Apple QuickTime, Quality 267 (26%)',
+    '1312bc5c7456856400f43749d407fb9f:11' => 'Apple QuickTime, Quality 268 (26%)',
+    '3f01645e33791ef09fbeb6c0e63db6a9:11' => 'Apple QuickTime, Quality 269 (26%)',
+    '785c36a6aa2bedd207cb1fa450a5e6d4:11' => 'Apple QuickTime, Quality 270-271 (26%)',
+    '84788c494352a07ab54f360f4a2a3d34:11' => 'Apple QuickTime, Quality 272 (27%)',
+    'bf29abfdf0086437452e2ca220e69cae:11' => 'Apple QuickTime, Quality 273 (27%)',
+    'c7da2e951711b8b1314a7c531e09cbdc:11' => 'Apple QuickTime, Quality 274 (27%)',
+    'fb549f21b7ad3b556bc91165b3067a77:11' => 'Apple QuickTime, Quality 275 (27%)',
+    '0a7497e67acef345c655f79fd00b26de:11' => 'Apple QuickTime, Quality 276 (27%)',
+    '1e2be0dde2c5d2216bca879a3f89c565:11' => 'Apple QuickTime, Quality 277-278 (27%)',
+    'd09f78b68290ff6b470720ead4d79b15:11' => 'Apple QuickTime, Quality 279 (27%)',
+    '5b54396a8a725e49e9bd4c9883b151df:11' => 'Apple QuickTime, Quality 280 (27%)',
+    'f60d4afe566a641f0187a42ca6462560:11' => 'Apple QuickTime, Quality 281 (27%)',
+    'b69090d1ab951e6355ab193b1f20bf48:11' => 'Apple QuickTime, Quality 282 (28%)',
+    '7ce7d00283cada911c3ebc347680bc7d:11' => 'Apple QuickTime, Quality 283 (28%)',
+    '2502314c1b957a0e4f911d17db770a01:11' => 'Apple QuickTime, Quality 284 (28%)',
+    '100f3392aa8292fb78548513a619671a:11' => 'Apple QuickTime, Quality 285 (28%)',
+    'af683de3118ab595c41b5796b57a9540:11' => 'Apple QuickTime, Quality 286 (28%)',
+    '1228f1572d76b53658f4042bda8e99a2:11' => 'Apple QuickTime, Quality 287 (28%)',
+    'e9c647b8bf2d7535d259eed6fbabe206:11' => 'Apple QuickTime, Quality 288 (28%)',
+    '9ab0afefad0e6bb7c3c1a8bca0c3f987:11' => 'Apple QuickTime, Quality 289 (28%)',
+    'b6900aafebce0e59136abb701eacb1e5:11' => 'Apple QuickTime, Quality 290 (28%)',
+    'a3c40b635e584c8f49d6b6b110846fee:11' => 'Apple QuickTime, Quality 291-292 (28-29%)',
+    '80175a9dbb871d045c738fdeb6fcbdc7:11' => 'Apple QuickTime, Quality 293 (29%)',
+    'c79231716eff96853fe03a26c1c38120:11' => 'Apple QuickTime, Quality 294 (29%)',
+    '8f96a0f2af7f1f1b0b2d4895bced1326:11' => 'Apple QuickTime, Quality 295 (29%)',
+    'ba3c103d00719e795b093ac7a75e6fac:11' => 'Apple QuickTime, Quality 296 (29%)',
+    '42fd2864197991a38b3f80374a69d4e9:11' => 'Apple QuickTime, Quality 297 (29%)',
+    '76bc1d777c94b680683610218732eb11:11' => 'Apple QuickTime, Quality 298 (29%)',
+    '8b9e19fe69d7c7e1989018aca76c0aea:11' => 'Apple QuickTime, Quality 299 (29%)',
+    'd3c0e7437c630f3bed0867737c5f1921:11' => 'Apple QuickTime, Quality 300 (29%)',
+    'a8ecf55a88fd0e1b29646207aff8c36f:11' => 'Apple QuickTime, Quality 301 (29%)',
+    'eaffe0714878be5fb67a914f5bb79fef:11' => 'Apple QuickTime, Quality 302 (29%)',
+    'a6a49ea0300157ecb401ce45d7f1f850:11' => 'Apple QuickTime, Quality 303 (30%)',
+    'fc28ca358af7cd55dc78853e4288f26d:11' => 'Apple QuickTime, Quality 304 (30%)',
+    '61cb5e93e3e69f6929d97653824733b0:11' => 'Apple QuickTime, Quality 305 (30%)',
+    '2cba6ba1aede8c791ada1acaba8c162e:11' => 'Apple QuickTime, Quality 306 (30%)',
+    'c1bcc3db9f417dc52595f2bb224e30d7:11' => 'Apple QuickTime, Quality 307 (30%)',
+    '2273274a8d695da4bebff145cbcbafcc:11' => 'Apple QuickTime, Quality 308 (30%)',
+    'e8bdbff8c7908e36c51e1344c0e99746:11' => 'Apple QuickTime, Quality 309 (30%)',
+    'ffb8ea8efdb22c5c8256cc4e4008f11c:11' => 'Apple QuickTime, Quality 310 (30%)',
+    'a1a8f92dc00c42877eb9a1d7462f8408:11' => 'Apple QuickTime, Quality 311 (30%)',
+    '723c2a2de195391f2db06456e9345c5b:11' => 'Apple QuickTime, Quality 312 (30%)',
+    '916225049ab8d411a5e0138ea9087e37:11' => 'Apple QuickTime, Quality 313 (31%)',
+    '3b0315316de45b649bd8ba5b5471ab81:11' => 'Apple QuickTime, Quality 314 (31%)',
+    '6cf948e65c9d32279c757394a4f5b77e:11' => 'Apple QuickTime, Quality 315 (31%)',
+    '4c4b7fc28e54a2bbdccd90d3618f01e8:11' => 'Apple QuickTime, Quality 316 (31%)',
+    '767c20d7d54970b0974f205c790d7d04:11' => 'Apple QuickTime, Quality 317 (31%)',
+    '81c1ce1c7d15394d95eaf2d6bd1495e3:11' => 'Apple QuickTime, Quality 318 (31%)',
+    '6547daee398d39f773742be92ef2d0d0:11' => 'Apple QuickTime, Quality 319 (31%)',
+    '65edf81f975f01a7b3ad1c16a1af64cb:11' => 'Apple QuickTime, Quality 320 (31%)',
+    'f8948967aeda9fb6ca1637a082ed04db:11' => 'Apple QuickTime, Quality 321 (31%)',
+    '2444e1c407a9965fb5ea2dafd269911f:11' => 'Apple QuickTime, Quality 322-324 (31-32%)',
+    '7c8242581553e818ef243fc680879a19:11' => 'Apple QuickTime, Quality 325 (32%)',
+    'e2fe91d57078586f15b09e3b9c8cd3fa:11' => 'Apple QuickTime, Quality 326 (32%)',
+    '0740db8af7951c1363f2c8d75462d378:11' => 'Apple QuickTime, Quality 327 (32%)',
+    '3c1ff7ebab192163b4578e7dfcf63ce6:11' => 'Apple QuickTime, Quality 328 (32%)',
+    '705ae76b905302bd9f3b78cc8d1cb28f:11' => 'Apple QuickTime, Quality 329 (32%)',
+    '9438633929a283aac168f415d8ca44d6:11' => 'Apple QuickTime, Quality 330 (32%)',
+    '68799ccfa08e2f55b5be79264d3ca58a:11' => 'Apple QuickTime, Quality 331 (32%)',
+    '9bda57f21c56ea0dc971164b8dc56394:11' => 'Apple QuickTime, Quality 332 (32%)',
+    'f9988c61ae580fcfc8bf929134b07c2e:11' => 'Apple QuickTime, Quality 333 (33%)',
+    '59faa8c6fb70d4cf42765a92c1c7afc1:11' => 'Apple QuickTime, Quality 334 (33%)',
+    '277982593a55786fe424c80a17224cd7:11' => 'Apple QuickTime, Quality 335 (33%)',
+    'c2a8a67d050b22a0673ee9ad6685a540:11' => 'Apple QuickTime, Quality 336 (33%)',
+    '040e09f495355470a44c580bca654693:11' => 'Apple QuickTime, Quality 337 (33%)',
+    '93173762094b6b506aa495e022ced65f:11' => 'Apple QuickTime, Quality 338 (33%)',
+    '281c39340554f672ff62c65e0bf1036b:11' => 'Apple QuickTime, Quality 339 (33%)',
+    '82d40afcb23ac10dba01bbab101da176:11' => 'Apple QuickTime, Quality 340 (33%)',
+    'f56a4679494e5af4692381caa63b9062:11' => 'Apple QuickTime, Quality 341 (33%)',
+    '78787c9f0aae4ab8d15ab47eaea5035c:11' => 'Apple QuickTime, Quality 342 (33%)',
+    'a1664b510ce4c6aa3588cdbc327a6f57:11' => 'Apple QuickTime, Quality 343 (33%)',
+    'f6150beda200179d9744527637e52baa:11' => 'Apple QuickTime, Quality 344 (34%)',
+    '620244f053fef313466fbcb232077aca:11' => 'Apple QuickTime, Quality 345 (34%)',
+    '91c1b36d4411306ba3afaea0658f1ad8:11' => 'Apple QuickTime, Quality 346 (34%)',
+    '0381b4e34e700adecd618afdcfb5513e:11' => 'Apple QuickTime, Quality 347 (34%)',
+    '4d8f909ee8cb53e0386eb09c1591099b:11' => 'Apple QuickTime, Quality 348 (34%)',
+    'f7425d5d0a0207e6dfaa0ee7c35d4ec6:11' => 'Apple QuickTime, Quality 349 (34%)',
+    '8d0663f8149a308365e18bdeb8c867e8:11' => 'Apple QuickTime, Quality 350 (34%)',
+    '4fa58542b5953534072b6dc1085deadf:11' => 'Apple QuickTime, Quality 351 (34%)',
+    '2358594d2a85b48dc0bd03e024dec9bd:11' => 'Apple QuickTime, Quality 352 (34%)',
+    'b9594c8100236f288cdc01e6488cbc41:11' => 'Apple QuickTime, Quality 353 (34%)',
+    '3542444d51fa859ed5af78a1f5fc4f36:11' => 'Apple QuickTime, Quality 354 (35%)',
+    '7c95c94440f652232530fe4c411be1a2:11' => 'Apple QuickTime, Quality 355 (35%)',
+    '8361a9dbb5d93ad098a0ce2091b0bdf5:11' => 'Apple QuickTime, Quality 356 (35%)',
+    '44c8e4d0d7678034cb206609652ffeef:11' => 'Apple QuickTime, Quality 357 (35%)',
+    '4694896b11fb898106e30fd4ed50cded:11' => 'Apple QuickTime, Quality 358 (35%)',
+    '9ddc6134fe65ea64048fdfd27c82bed7:11' => 'Apple QuickTime, Quality 359 (35%)',
+    'c60f75f7e09f0454db9cc48392a7eeed:11' => 'Apple QuickTime, Quality 360 (35%)',
+    '151731e5cd38be847f4dad794c023a69:11' => 'Apple QuickTime, Quality 361 (35%)',
+    '0468ecbf6fc1303467adfdcab8edfe6d:11' => 'Apple QuickTime, Quality 362 (35%)',
+    'debd5adf671e3b907c10155cc910dcc1:11' => 'Apple QuickTime, Quality 363 (35%)',
+    '6385ee79b090ea430190dbe1ee93ddca:11' => 'Apple QuickTime, Quality 364 (36%)',
+    '67ed20f2fe283549dae4ba40860c3777:11' => 'Apple QuickTime, Quality 365 (36%)',
+    'e168523157ee45551ba30378d597dfd6:11' => 'Apple QuickTime, Quality 366 (36%)',
+    'd0cbe6c7372724a802d0183c6de66f8b:11' => 'Apple QuickTime, Quality 367 (36%)',
+    '38a1f9d86241eb3b96d5d42bc6587598:11' => 'Apple QuickTime, Quality 368 (36%)',
+    '4dc4b433113acbde9d77a4cbad69bb14:11' => 'Apple QuickTime, Quality 369 (36%)',
+    '186948d91ea43a64f874ebb9dee44564:11' => 'Apple QuickTime, Quality 370 (36%)',
+    '786aa4e46172ac65e10b230f3dcaadb2:11' => 'Apple QuickTime, Quality 371 (36%)',
+    'ac76c6ebb64c843736fc765a03674d94:11' => 'Apple QuickTime, Quality 372 (36%)',
+    '38a60cdb8033a9f90027895eab0c40ba:11' => 'Apple QuickTime, Quality 373 (36%)',
+    'ce48f7fb2ba9edee46c3f4839b40ef60:11' => 'Apple QuickTime, Quality 374 (37%)',
+    '7b3058792db9876a86c65ec44c0261b3:11' => 'Apple QuickTime, Quality 375 (37%)',
+    '5e983407295808e244f6bdece469c8be:11' => 'Apple QuickTime, Quality 376 (37%)',
+    '68ff8bfc0e15c93586ef6b4cf347469c:11' => 'Apple QuickTime, Quality 377 (37%)',
+    '9d4a8c44917390e56bca2352a8a4b1be:11' => 'Apple QuickTime, Quality 378 (37%)',
+    '36e7560256c5ffd285a1ca0f6d4bf97d:11' => 'Apple QuickTime, Quality 379 (37%)',
+    'a88bad671d80cf6a70bd6e37be9c95c9:11' => 'Apple QuickTime, Quality 380 (37%)',
+    '23ab27876006666358e95d9c1104bcd0:11' => 'Apple QuickTime, Quality 381 (37%)',
+    'b87750acf49940bf1f01f6a134a600b1:11' => 'Apple QuickTime, Quality 382 (37%)',
+    '731fa7404c090db157030e40804604b6:11' => 'Apple QuickTime, Quality 383 (37%)',
+    '442c2664c07af1ec15d86581f43aab0b:11' => 'Apple QuickTime, Quality 384 (38%)',
+    '145c52a48a9b2e954e785c3f8df5c27e:11' => 'Apple QuickTime, Quality 385 (38%)',
+    '55d37ee1e3c8d12a70e67206fa1c9b0c:11' => 'Apple QuickTime, Quality 386 (38%)',
+    '60880ff1f7bfe6a85cd80c2d4582395b:11' => 'Apple QuickTime, Quality 387 (38%)',
+    '85fc5daf51e6cbb04352016c817e5714:11' => 'Apple QuickTime, Quality 388 (38%)',
+    'd7c835210eec5a8bedb3a18d32cbe066:11' => 'Apple QuickTime, Quality 389 (38%)',
+    '315e7fee22864b37b1b7670957f259fe:11' => 'Apple QuickTime, Quality 390 (38%)',
+    '46dd3917c1473ed0f8fc3f1e6f08416d:11' => 'Apple QuickTime, Quality 391 (38%)',
+    '1e93645e6163af46937c35a18b55c601:11' => 'Apple QuickTime, Quality 392 (38%)',
+    'ba1a32697c0ae4e76a78f4b5624a8ce0:11' => 'Apple QuickTime, Quality 393 (38%)',
+    '68a0d6250be9df2c05556ff59988c499:11' => 'Apple QuickTime, Quality 394 (38%)',
+    '13b1310840627eddaf435e9feffebebe:11' => 'Apple QuickTime, Quality 395 (39%)',
+    '2e420a34dcf01dab91fd8509d4dbaab5:11' => 'Apple QuickTime, Quality 396 (39%)',
+    'eef3afec34329517513541a8509b7aab:11' => 'Apple QuickTime, Quality 397 (39%)',
+    '80bdd75a2fc87b5288bc77763481df83:11' => 'Apple QuickTime, Quality 398 (39%)',
+    'e230e3ac7c740f3e8fe6bc74fff72c10:11' => 'Apple QuickTime, Quality 399 (39%)',
+    '68b07a219cda4b9fc9a8507b788d8230:11' => 'Apple QuickTime, Quality 400 (39%)',
+    'f1c23475d19d9e950dbc4086902365a3:11' => 'Apple QuickTime, Quality 401 (39%)',
+    'dc2af4340202aa481491b86539888720:11' => 'Apple QuickTime, Quality 402 (39%)',
+    '495aeee0f43a596938c98c5364feb2ee:11' => 'Apple QuickTime, Quality 403 (39%)',
+    '8319dfe3caedea6988e5024b0196d317:11' => 'Apple QuickTime, Quality 404 (39%)',
+    'd62cd17e8e04ebd568a8f5abc38cad4a:11' => 'Apple QuickTime, Quality 405 (40%)',
+    '047e1711c44262f352034452d0b0d07b:11' => 'Apple QuickTime, Quality 406 (40%)',
+    '552bf986ae119444955ded5f485d5dc4:11' => 'Apple QuickTime, Quality 407 (40%)',
+    'd39329b38fdcabe9e1ae5f1b205c825a:11' => 'Apple QuickTime, Quality 408 (40%)',
+    'bf2904a3e3870a2b4d060e0863530d92:11' => 'Apple QuickTime, Quality 409 (40%)',
+    '1acceb7ae4f9edbb835006d97ca30094:11' => 'Apple QuickTime, Quality 410 (40%)',
+    '5de50c687a6e885634bf16adfd75e6bc:11' => 'Apple QuickTime, Quality 411 (40%)',
+    'd92c5bba7cfd1bfbb8c662c1a27ca413:11' => 'Apple QuickTime, Quality 412 (40%)',
+    'cea44b5645cd1dbf469c8ae5600e4ff5:11' => 'Apple QuickTime, Quality 413 (40%)',
+    '5caf3989a757842c716220e4e426bde2:11' => 'Apple QuickTime, Quality 414 (40%)',
+    'fd2f7a6518c12848a9ecdb1c3beb1fa8:11' => 'Apple QuickTime, Quality 415 (41%)',
+    'de0547c872fed9c9c75c8fec2fe010e6:11' => 'Apple QuickTime, Quality 416 (41%)',
+    '6cf4dfbe3df89d9728e0f34b7b145223:11' => 'Apple QuickTime, Quality 417 (41%)',
+    'd94d79b70686d3e2568d61d07e5819eb:11' => 'Apple QuickTime, Quality 418 (41%)',
+    '9ec82f50503769a9bb17e876594833b6:11' => 'Apple QuickTime, Quality 419 (41%)',
+    '4a39b0ae55f0eaa5672f00015cae2d40:11' => 'Apple QuickTime, Quality 420 (41%)',
+    '42bae7ef4a41562b2e98d74248f4f22e:11' => 'Apple QuickTime, Quality 421 (41%)',
+    '8c0ea132cfacf212c518ad297229be34:11' => 'Apple QuickTime, Quality 422 (41%)',
+    'c1af7f1a3716bef087124306b068605c:11' => 'Apple QuickTime, Quality 423 (41%)',
+    'd3ea3c519f92dd870fed03f63cabf05e:11' => 'Apple QuickTime, Quality 424 (41%)',
+    '0442196d850319833f27df632e92f064:11' => 'Apple QuickTime, Quality 425 (42%)',
+    '8c372e99fa96d2598e431f8137e47da6:11' => 'Apple QuickTime, Quality 426 (42%)',
+    '9bade640c3fcb807ed1322479f9e7f1c:11' => 'Apple QuickTime, Quality 427 (42%)',
+    '8015ad9fa22d6565ca61ce9979f3663f:11' => 'Apple QuickTime, Quality 428 (42%)',
+    '09a13f94022839a24065b82d5f4ffdbd:11' => 'Apple QuickTime, Quality 429 (42%)',
+    '0e570bc627acaee0962472a1a646816b:11' => 'Apple QuickTime, Quality 430 (42%)',
+    'be7e7114f08e1775ca9676d2feeeccca:11' => 'Apple QuickTime, Quality 431 (42%)',
+    '44be972c54cd64be7524a133a7395401:11' => 'Apple QuickTime, Quality 432 (42%)',
+    'b2f7b5e3007387aa22df74e82e916195:11' => 'Apple QuickTime, Quality 433 (42%)',
+    '5c13c8db3a0b590f4fa3ec462b8890c3:11' => 'Apple QuickTime, Quality 434 (42%)',
+    '2733a3cb2e0a2313b74d686437fa3ae2:11' => 'Apple QuickTime, Quality 435 (42%)',
+    '66309175abaa59d6246237a77ce9eb76:11' => 'Apple QuickTime, Quality 436 (43%)',
+    '6a2eb9f07f3c96365a06d91da171e673:11' => 'Apple QuickTime, Quality 437 (43%)',
+    'e395118c42b6492dd4d9d30754f0a697:11' => 'Apple QuickTime, Quality 438 (43%)',
+    '7a75abc5c5ec8cc0fa43f239ab048c08:11' => 'Apple QuickTime, Quality 439 (43%)',
+    'c558f3407dc549c902efad68c54920de:11' => 'Apple QuickTime, Quality 440 (43%)',
+    '49cd1849b501868260d8a3b1e96d8625:11' => 'Apple QuickTime, Quality 441 (43%)',
+    'f7d70cfab7ff888c97078d277fa01307:11' => 'Apple QuickTime, Quality 442 (43%)',
+    'f06ddea698cebe653bdd0c208c3d8c95:11' => 'Apple QuickTime, Quality 443 (43%)',
+    '73478bb7714d1d2342bbf22c5fdc04d6:11' => 'Apple QuickTime, Quality 444 (43%)',
+    '24406aee81b89ea50881ae71f878d0ec:11' => 'Apple QuickTime, Quality 445 (43%)',
+    'e3e88302627b6743725cace74ddb17f9:11' => 'Apple QuickTime, Quality 446 (44%)',
+    '3fb9c046dff30dcb4128df984532d6ba:11' => 'Apple QuickTime, Quality 447 (44%)',
+    'c9a4b04bc8e580608014b6f3111322d7:11' => 'Apple QuickTime, Quality 448 (44%)',
+    '7749ec06b1f1b1be30aa58dbef838d49:11' => 'Apple QuickTime, Quality 449 (44%)',
+    'c0a54e87a2ef1c163311bcc1abf85214:11' => 'Apple QuickTime, Quality 450 (44%)',
+    'f20a253d2513f4d8f2cfeea980852820:11' => 'Apple QuickTime, Quality 451 (44%)',
+    '6538fc6f5f1744b40c0b8b5bc7179983:11' => 'Apple QuickTime, Quality 452 (44%)',
+    '68a4a67af696f82bbbb7db15a16c0c46:11' => 'Apple QuickTime, Quality 453 (44%)',
+    'e477932560b308940ac7439eed9f63da:11' => 'Apple QuickTime, Quality 454 (44%)',
+    'fd732b0493e7ff16da4bde7faa88e22d:11' => 'Apple QuickTime, Quality 455 (44%)',
+    '61884dc8b93e63c07bb487a6e29d6fb7:11' => 'Apple QuickTime, Quality 456 (45%)',
+    '67515a725833d40535a54b4ef9551e05:11' => 'Apple QuickTime, Quality 457 (45%)',
+    'cc6bb734b742b0631ab6562a329e1603:11' => 'Apple QuickTime, Quality 458 (45%)',
+    '1801686a97836f690ce3d5523ffcfa9a:11' => 'Apple QuickTime, Quality 459 (45%)',
+    'f73f690cacd5d4e247f59964ad0f43b9:11' => 'Apple QuickTime, Quality 460 (45%)',
+    '853946ede6a624136546ec5b68ecdc49:11' => 'Apple QuickTime, Quality 461 (45%)',
+    'f05c48d79edbefdb4d260dc23cf258e6:11' => 'Apple QuickTime, Quality 462 (45%)',
+    '8dc8361e94137f5466c8dd1f9aa06781:11' => 'Apple QuickTime, Quality 463 (45%)',
+    '6c121faf4784a5a93fbf7fff4470dea4:11' => 'Apple QuickTime, Quality 464-465 (45%)',
+    'd0eaa368737f17f6037757d393a22599:11' => 'Apple QuickTime, Quality 466-467 (46%)',
+    '9c6f5faa1009cafe8bc3060fe18d4b60:11' => 'Apple QuickTime, Quality 468 (46%)',
+    'ac47d493602dddace7844a9bc962e5ed:11' => 'Apple QuickTime, Quality 469 (46%)',
+    '24784b5651e1790242c01de522a6e05b:11' => 'Apple QuickTime, Quality 470 (46%)',
+    'adbb56f1f0e0392392f9c7a38351a9ec:11' => 'Apple QuickTime, Quality 471 (46%)',
+    '6e0952a44c37bc2d98dbede4ec429c99:11' => 'Apple QuickTime, Quality 472 (46%)',
+    '20c7942ddec30475a182cb281f12bc03:11' => 'Apple QuickTime, Quality 473 (46%)',
+    '4080277d75b20871d00ebc01ffbdb848:11' => 'Apple QuickTime, Quality 474 (46%)',
+    '4f15f7e4c56e7a75c0fe5454ab7e8f72:11' => 'Apple QuickTime, Quality 475 (46%)',
+    'ff82adb92189413246aee9a992eb2013:11' => 'Apple QuickTime, Quality 476 (46%)',
+    '16df79eb7c5f062aeebde385fbce1553:11' => 'Apple QuickTime, Quality 477 (47%)',
+    'df02b0ea9dab7d291950b6cfc65c4bb1:11' => 'Apple QuickTime, Quality 478 (47%)',
+    '4ca8ec2a0c651e0508aab3b153cfee23:11' => 'Apple QuickTime, Quality 479 (47%)',
+    'bbbae155e558e9d37686ec34bd065a53:11' => 'Apple QuickTime, Quality 480 (47%)',
+    '9bf86a5ec6e5382f214e07364a62b1b3:11' => 'Apple QuickTime, Quality 481 (47%)',
+    '41d873034f29b298d899b48cd321c93f:11' => 'Apple QuickTime, Quality 482 (47%)',
+    '52092035b4e3fd45de3298c4d641385a:11' => 'Apple QuickTime, Quality 483 (47%)',
+    '70e5babe9507bae6725e401a36903070:11' => 'Apple QuickTime, Quality 484 (47%)',
+    '3cfa966dde2536c83c921aa250b978b3:11' => 'Apple QuickTime, Quality 485 (47%)',
+    'b0144b1d2671d145d29812ebcebd863d:11' => 'Apple QuickTime, Quality 486 (47%)',
+    '2a6a136faaf1f13c2b80dcb4786d90b2:11' => 'Apple QuickTime, Quality 487 (48%)',
+    '3a6eac793d818f378e7b24826c9115cc:11' => 'Apple QuickTime, Quality 488 (48%)',
+    '4a78c6570fc84378e3334bfcd8a5680f:11' => 'Apple QuickTime, Quality 489 (48%)',
+    '0709c0afc0eae932a50903e56ec95ad2:11' => 'Apple QuickTime, Quality 490 (48%)',
+    'b013b5c9b7bafc9dcad9a1e87fc629ff:11' => 'Apple QuickTime, Quality 491 (48%)',
+    '7cb380e582317b8387037450cc68db5e:11' => 'Apple QuickTime, Quality 492 (48%)',
+    'f94618c1a011209cb3b060887c7e244e:11' => 'Apple QuickTime, Quality 493 (48%)',
+    '649a90949cab8f45d3ecef78068165d1:11' => 'Apple QuickTime, Quality 494 (48%)',
+    '70e105a22b036f7c1ce0b5d02fa1c34e:11' => 'Apple QuickTime, Quality 495 (48%)',
+    '18c10ea6fe5918e09daf1a3a7a74e678:11' => 'Apple QuickTime, Quality 496 (48%)',
+    '23822cafcc61ce2a52691f1fc963ff18:11' => 'Apple QuickTime, Quality 497 (49%)',
+    '5bb2cf3e6721c2dd8eb3341f9bff4159:11' => 'Apple QuickTime, Quality 498 (49%)',
+    'e55b5345d9668d1b11b657537f707072:11' => 'Apple QuickTime, Quality 499 (49%)',
+    '4cbebcb06d1003e29429e9d5c9445919:11' => 'Apple QuickTime, Quality 500 (49%)',
+    '916b16f020b2b21e4c8114da8c05d584:11' => 'Apple QuickTime, Quality 501 (49%)',
+    '98abef3366c7f451e44f5c2799e2be6d:11' => 'Apple QuickTime, Quality 502 (49%)',
+    'f8e99ed03828752f16c51bb8c9887e9e:11' => 'Apple QuickTime, Quality 503 (49%)',
+    'eef05c558c1aba5cf2891fb13ee07167:11' => 'Apple QuickTime, Quality 504 (49%)',
+    'cb5fc7927d88ac99f556b2dd7985eaf9:11' => 'Apple QuickTime, Quality 505 (49%)',
+    'f0e3f635bbcf96654812e8c78b227701:11' => 'Apple QuickTime, Quality 506 (49%)',
+    '234c9cf6d7fe671b52c3ec5a20046ec8:11' => 'Apple QuickTime, Quality 507 (50%)',
+    '9dfcc9ae3baee4bb4ad63abf2f740275:11' => 'Apple QuickTime, Quality 508 (50%)',
+    'b1f1b6519991ac7696b233dd9b9de6b5:11' => 'Apple QuickTime, Quality 509 (50%)',
+    'dba2f5203ffecada66a8bf9b1272f1eb:11' => 'Apple QuickTime, Quality 510 (50%)',
+    '367b3d63cddc0cd27e58030c2b8f1aaa:11' => 'Apple QuickTime, Quality 511 (50%)',
+    'c28ab3fd6480c92028327957228c0a11:11' => 'Apple QuickTime, Quality 512 (50%)',
+    '6bc9ebaf9f3ed62ec8818076f6f81c7f:11' => 'Apple QuickTime, Quality 513 (50%)',
+    '3bbfcd817441d2267a49bf76b48c5f47:11' => 'Apple QuickTime, Quality 514 (50%)',
+    '27e6ed2cecfebe31eb3d66128c926562:11' => 'Apple QuickTime, Quality 515 (50%)',
+    '3cf112c5843f98410599ea2a197e5cf6:11' => 'Apple QuickTime, Quality 516 (50%)',
+    '2821aae8108df4bd98e5eaa451a351d2:11' => 'Apple QuickTime, Quality 517 (50%)',
+    '798f48b6dbe3f1cd7b40b03fae8d2611:11' => 'Apple QuickTime, Quality 518 (51%)',
+    '67a7c8896d03a030b56130e1f9c5caad:11' => 'Apple QuickTime, Quality 519 (51%)',
+    '4bf1b53c292dec3f7cf3c020a3a9d911:11' => 'Apple QuickTime, Quality 520 (51%)',
+    '2bfe0ace876b80be6f601a1703187d94:11' => 'Apple QuickTime, Quality 521 (51%)',
+    '7590bc1a40090163a101bfd28daa3fc2:11' => 'Apple QuickTime, Quality 522 (51%)',
+    '118c7b118b1df404c90cfb1d10cf2a77:11' => 'Apple QuickTime, Quality 523 (51%)',
+    '86cfac24ca9f4ab254f882ad399ea758:11' => 'Apple QuickTime, Quality 524 (51%)',
+    '0268c3e9e3e1c3e6eb25fe0d31940c7f:11' => 'Apple QuickTime, Quality 525 (51%)',
+    '9beb1b7c55129a34c850c359d7263457:11' => 'Apple QuickTime, Quality 526 (51%)',
+    '0cec2c8f96c092bd6e7cf0f7ea294c99:11' => 'Apple QuickTime, Quality 527 (51%)',
+    'd8c5179c2419775f43e9a7899bacddd7:11' => 'Apple QuickTime, Quality 528 (52%)',
+    '9ce50f6e0b00d2e601f2fcc151abc4d8:11' => 'Apple QuickTime, Quality 529 (52%)',
+    '80db52b1671d32d8bd3126bf1d7db8ec:11' => 'Apple QuickTime, Quality 530 (52%)',
+    'f3ef06f90579eaf1008e07b94e818a40:11' => 'Apple QuickTime, Quality 531 (52%)',
+    '3c85026793f58eb45141847a27854fe2:11' => 'Apple QuickTime, Quality 532-533 (52%)',
+    'e3042cbd43d2067ae92e1a8ce3f2c5a1:11' => 'Apple QuickTime, Quality 534 (52%)',
+    'dd71fdab3d46341a9b6ca0b6c6929d23:11' => 'Apple QuickTime, Quality 535 (52%)',
+    'a451c79ccddcd543a80e1ce0449dcb0d:11' => 'Apple QuickTime, Quality 536 (52%)',
+    '2da67fe5f0bb3c8b10403295895fb154:11' => 'Apple QuickTime, Quality 537 (52%)',
+    '4f72f3cdc82d433e7f749be8036d4ce0:11' => 'Apple QuickTime, Quality 538 (53%)',
+    'da29cc9a4d5fd7e0dc36a2dd0c70e84f:11' => 'Apple QuickTime, Quality 539 (53%)',
+    '63f61a0d3c4f1ace8ebe5b6ae23e3f25:11' => 'Apple QuickTime, Quality 540 (53%)',
+    'fde14219617069bbf6b26dcb42036de7:11' => 'Apple QuickTime, Quality 541 (53%)',
+    'c84313bc621c6d05999510fa57c56d05:11' => 'Apple QuickTime, Quality 542 (53%)',
+    '92658d4c879d6e48bfda1a6e9f49ef8d:11' => 'Apple QuickTime, Quality 543 (53%)',
+    '3deffd01a1c03929873dddd86a5339f1:11' => 'Apple QuickTime, Quality 544 (53%)',
+    'e76c1b26bbd196efe2e793e27727704d:11' => 'Apple QuickTime, Quality 545 (53%)',
+    '9f3289994c790a10ecb2d93021677840:11' => 'Apple QuickTime, Quality 546 (53%)',
+    'f7493b01895b7880c651841c73678d33:11' => 'Apple QuickTime, Quality 547 (53%)',
+    '3c9d094741c995c2c0ac9daf14c4e683:11' => 'Apple QuickTime, Quality 548 (54%)',
+    '8c0e1d4cd6138817963af6ca149cb5d5:11' => 'Apple QuickTime, Quality 549 (54%)',
+    'd781cc6f686fc7c7b9b6eef90fab4d87:11' => 'Apple QuickTime, Quality 550 (54%)',
+    '7dd6377a907070b1ca7e05f770ca2aab:11' => 'Apple QuickTime, Quality 551-552 (54%)',
+    'c2d5e2e93ec191015d8181c9e25387d8:11' => 'Apple QuickTime, Quality 553 (54%)',
+    '65d20361f4ba0725cf150c7ae2033776:11' => 'Apple QuickTime, Quality 554 (54%)',
+    '2d7eb8eb9df9f4831a843626f4fc7e19:11' => 'Apple QuickTime, Quality 555 (54%)',
+    'ce0e14187fec73f57242becd633a89a3:11' => 'Apple QuickTime, Quality 556 (54%)',
+    '140cc5a99ef865e318a217ea069aa84d:11' => 'Apple QuickTime, Quality 557 (54%)',
+    '0db59bd18beb49f9beb901f3435e22a5:11' => 'Apple QuickTime, Quality 558 (54%)',
+    '78d19da8de8095644aa31fb409033fe7:11' => 'Apple QuickTime, Quality 559 (55%)',
+    '00687c4e4852ed1cd446c09a3764e505:11' => 'Apple QuickTime, Quality 560 (55%)',
+    'f3795398903c82e1beababf95d3a8413:11' => 'Apple QuickTime, Quality 561 (55%)',
+    'b749b90354443bf17da7a67a5ad53397:11' => 'Apple QuickTime, Quality 562 (55%)',
+    'c722656df4bb0651821cd90880953a20:11' => 'Apple QuickTime, Quality 563 (55%)',
+    '4d17c873e65b9d398f27735b0020c777:11' => 'Apple QuickTime, Quality 564 (55%)',
+    '067a76c2e5386ae85f9187e3e2134621:11' => 'Apple QuickTime, Quality 565 (55%)',
+    '09b689f7d0c1d4bb0d96d06c02b8dcf8:11' => 'Apple QuickTime, Quality 566 (55%)',
+    'ffc0192eb5a182370a641cffe9b1d71f:11' => 'Apple QuickTime, Quality 567 (55%)',
+    '3af2163438180050bbcf123d4f4587d3:11' => 'Apple QuickTime, Quality 568 (55%)',
+    '3bdb097a9791f3ce6d7bbc4d6a194aa4:11' => 'Apple QuickTime, Quality 569 (56%)',
+    '8c1fead15819016583650eff5a4f5bda:11' => 'Apple QuickTime, Quality 570 (56%)',
+    '967aeb5bc4d75a0d5c0998bbfb282982:11' => 'Apple QuickTime, Quality 571 (56%)',
+    'cdd7bd689f14d5f7c3ea790f6f09ae64:11' => 'Apple QuickTime, Quality 572 (56%)',
+    '6a20041beb5b67d38525bb7507ffeb49:11' => 'Apple QuickTime, Quality 573 (56%)',
+    '2bf57fbe54370c4d917f259631af033e:11' => 'Apple QuickTime, Quality 574 (56%)',
+    'd2e983c44eae2983f48f526992fbbfb4:11' => 'Apple QuickTime, Quality 575 (56%)',
+    'c5bb48d86e26ac496bb4b4bc888cc06a:11' => 'Apple QuickTime, Quality 576 (56%)',
+    'a595c40b5dbd45557c3c8d23ebee5e24:11' => 'Apple QuickTime, Quality 577 (56%)',
+    'f2d84e1114ef85682818b96720d439b5:11' => 'Apple QuickTime, Quality 578 (56%)',
+    '332d9c49c5b32ae2addbb06a1e32fd49:11' => 'Apple QuickTime, Quality 579 (57%)',
+    '19c5c7c0270bd36c49f695475a62c293:11' => 'Apple QuickTime, Quality 580 (57%)',
+    '6516e60b3995e21b6750ebca1ddcfee5:11' => 'Apple QuickTime, Quality 581 (57%)',
+    '8daf4a87b28106876529a549cf1040b8:11' => 'Apple QuickTime, Quality 582 (57%)',
+    '6b37d6acc52259bf972a41e84dea7754:11' => 'Apple QuickTime, Quality 583 (57%)',
+    '588666e111892f10ca3f17bc362d9276:11' => 'Apple QuickTime, Quality 584 (57%)',
+    '9ec2859c370f557783903608748e7fb1:11' => 'Apple QuickTime, Quality 585 (57%)',
+    '18e3ac85da74fe92ab5da3d5f7614e09:11' => 'Apple QuickTime, Quality 586 (57%)',
+    'da4c88f145393972fbe9d3f40838cab9:11' => 'Apple QuickTime, Quality 587 (57%)',
+    '8ae7d2b569c437904a20a10bbd21fe89:11' => 'Apple QuickTime, Quality 588 (57%)',
+    'fc6dfb9669566b249cb03228aeb020c3:11' => 'Apple QuickTime, Quality 589 (58%)',
+    '198f3a32e4036d7c37fbc0c343d883af:11' => 'Apple QuickTime, Quality 590 (58%)',
+    '876ec039f82e49b925b232843b4703d4:11' => 'Apple QuickTime, Quality 591 (58%)',
+    '673b05962b8255cbc9bdbbc48965b4b7:11' => 'Apple QuickTime, Quality 592 (58%)',
+    '02e9a58edf45d75be000dee144316c66:11' => 'Apple QuickTime, Quality 593 (58%)',
+    '2abebf7a61009c5c1aa9516539b9084e:11' => 'Apple QuickTime, Quality 594 (58%)',
+    'fe44d8625d6242f4b5deb82be8ccaacf:11' => 'Apple QuickTime, Quality 595 (58%)',
+    '66529cc8ef9694e6a37e8787d0f160fd:11' => 'Apple QuickTime, Quality 596 (58%)',
+    '2129ee2bff47bfa8a8bb79ea9fb67b92:11' => 'Apple QuickTime, Quality 597 (58%)',
+    'ccb55ec1549a51212859495e104c626b:11' => 'Apple QuickTime, Quality 598 (58%)',
+    '05e53fb216ba4a1734eefaccd249d8e2:11' => 'Apple QuickTime, Quality 599 (58%)',
+    'f4923d7b7dedd365646169e720eee427:11' => 'Apple QuickTime, Quality 600 (59%)',
+    'c0f2265630bdf5f29e8c95df25c89edb:11' => 'Apple QuickTime, Quality 601 (59%)',
+    '0fdd23e8274090da3c925a3db7303adf:11' => 'Apple QuickTime, Quality 602 (59%)',
+    'a5bcbd80472fdf697db770ac78d6a4e3:11' => 'Apple QuickTime, Quality 603 (59%)',
+    'b157c4aabba2816f391c8f76ca3d4072:11' => 'Apple QuickTime, Quality 604 (59%)',
+    'b8ef26dabc2d81a8ba13b1f49ea711d3:11' => 'Apple QuickTime, Quality 605 (59%)',
+    '8a983844f9b0aec26fc8ac75a258e3ac:11' => 'Apple QuickTime, Quality 606 (59%)',
+    '44ced96f11e3a410201beed353a864cf:11' => 'Apple QuickTime, Quality 607 (59%)',
+    '4a14a3e37c89e5a7570f672b1970ca55:11' => 'Apple QuickTime, Quality 608 (59%)',
+    'e5ec78e112e3ba6463de24b3518347eb:11' => 'Apple QuickTime, Quality 609 (59%)',
+    '29b7cdc7a570b950457d20541c22c4ce:11' => 'Apple QuickTime, Quality 610 (60%)',
+    '470c0c761e2bb5e314a7112f3d64b277:11' => 'Apple QuickTime, Quality 611 (60%)',
+    'ced483058f2abf19df0f7935dafd217a:11' => 'Apple QuickTime, Quality 612 (60%)',
+    '8a202c89c57e77f50e1df27a3be7d5b7:11' => 'Apple QuickTime, Quality 613 (60%)',
+    '7eb9fe0338a7b802860a60e0088418fd:11' => 'Apple QuickTime, Quality 614 (60%)',
+    'ac25112c596d62f95518af109457975c:11' => 'Apple QuickTime, Quality 615 (60%)',
+    'f57e9a5f1d8dea7fd83a1b5840243686:11' => 'Apple QuickTime, Quality 616-617 (60%)',
+    '0eef5c6ff8ba65ff799081a9c96a2297:11' => 'Apple QuickTime, Quality 618-619 (60%)',
+    '05f98e12bfa14ba6347fb43f2241ba43:11' => 'Apple QuickTime, Quality 620 (61%)',
+    '91885755c780ebe16b1278a0359eda83:11' => 'Apple QuickTime, Quality 621 (61%)',
+    'b44cb1ca15fc9e3a27420df2ddae5879:11' => 'Apple QuickTime, Quality 622 (61%)',
+    'ae6c2112dd560530b7bacc8bfa9fb7f6:11' => 'Apple QuickTime, Quality 623 (61%)',
+    'd3b05f3cd78e0ac3ab37a02152e22831:11' => 'Apple QuickTime, Quality 624 (61%)',
+    'b0c2c3f76d848ee2e8f47a9a90131a21:11' => 'Apple QuickTime, Quality 625 (61%)',
+    '752fbc15f77a8c2149f5ae6bf49204b8:11' => 'Apple QuickTime, Quality 626 (61%)',
+    '9c34d3dedfe47d95edabdcbc5568a2a8:11' => 'Apple QuickTime, Quality 627 (61%)',
+    '252ba8a31aeb601e23b3a70f9af7abc1:11' => 'Apple QuickTime, Quality 628 (61%)',
+    '359038cd7c45242e96e176e91210922d:11' => 'Apple QuickTime, Quality 629 (61%)',
+    '8ab83dc2e7ca8b9db1f3b0ab500f3aca:11' => 'Apple QuickTime, Quality 630 (62%)',
+    '21c9f9a0ff71d4528ef7a19d2cfd0b6c:11' => 'Apple QuickTime, Quality 631 (62%)',
+    'a62fb887c209e0fab99fcb7ac81137a2:11' => 'Apple QuickTime, Quality 632 (62%)',
+    'e454ca92aca849d59b873d9be817baea:11' => 'Apple QuickTime, Quality 633 (62%)',
+    '9ad6008e7b4f8478043bfa54e1d9e48e:11' => 'Apple QuickTime, Quality 634 (62%)',
+    '45b20f0b0d7d88d8330354212af2e087:11' => 'Apple QuickTime, Quality 635 (62%)',
+    'b0a00ffee2e55457cd999bba2d07f63e:11' => 'Apple QuickTime, Quality 636 (62%)',
+    '5dfcb96d9a1186f662c6adb38bb9520a:11' => 'Apple QuickTime, Quality 637 (62%)',
+    'd973f38c501796adff40c4f70cbd8885:11' => 'Apple QuickTime, Quality 638 (62%)',
+    'dcfe5898ec101a8b2bf98330445dd1bf:11' => 'Apple QuickTime, Quality 639 (62%)',
+    '2b81eecf0fecd33679adac27e79ef3f4:11' => 'Apple QuickTime, Quality 640-641 (63%)',
+    '5aad44c55bf4f6dc538eaca006cafac2:11' => 'Apple QuickTime, Quality 642 (63%)',
+    '7079c2d71ff33e7c4e8efdece23c307b:11' => 'Apple QuickTime, Quality 643 (63%)',
+    'a5f724e9d7148f1a84ee597f45c33141:11' => 'Apple QuickTime, Quality 644 (63%)',
+    '3ae705fae9e895eda345d482525215e3:11' => 'Apple QuickTime, Quality 645 (63%)',
+    '7cbd635e5fee8bbd290b0d383b03da5a:11' => 'Apple QuickTime, Quality 646 (63%)',
+    '0f125e2c5ee6b123cf67b586ea23d422:11' => 'Apple QuickTime, Quality 647 (63%)',
+    '87eac5c1375cca9aa16eba0704616a7b:11' => 'Apple QuickTime, Quality 648-649 (63%)',
+    'aa83fd556c569ddcd81e0cc1ba866373:11' => 'Apple QuickTime, Quality 650 (63%)',
+    'dab4fa97da49aa37889185c5b43917c1:11' => 'Apple QuickTime, Quality 651 (64%)',
+    '51ad55cb254f36748123ca83f43556f4:11' => 'Apple QuickTime, Quality 652 (64%)',
+    '86e707c017682fe08213216d064b1b51:11' => 'Apple QuickTime, Quality 653 (64%)',
+    '3730182602996b4a1d540eb3fd970072:11' => 'Apple QuickTime, Quality 654 (64%)',
+    '1bf7a5d7477ad75b9c7b281de622d53b:11' => 'Apple QuickTime, Quality 655 (64%)',
+    '82b4bc7c4a832b620e810311a33c9771:11' => 'Apple QuickTime, Quality 656 (64%)',
+    '6502d634e5bf3f849e9d382886fc32fe:11' => 'Apple QuickTime, Quality 657 (64%)',
+    'a10e87fa030f8177a4f59f8d16a20afd:11' => 'Apple QuickTime, Quality 658 (64%)',
+    '338a78a7658ff3c1de33d88aa0ab7c74:11' => 'Apple QuickTime, Quality 659 (64%)',
+    '4c30c4399ef4bb2920601d940ed404eb:11' => 'Apple QuickTime, Quality 660-661 (64-65%)',
+    'ab7cfb73667875854893982a8cfcfab9:11' => 'Apple QuickTime, Quality 662 (65%)',
+    '7bff346b97abf46ca005af4e74b560fa:11' => 'Apple QuickTime, Quality 663 (65%)',
+    '2eae93ed601a50284ee31c20651584cb:11' => 'Apple QuickTime, Quality 664 (65%)',
+    'e566eaef7eacd6c7161feebf4cec79e8:11' => 'Apple QuickTime, Quality 665 (65%)',
+    'a9f461d3bca42dfab57c834fa5f34419:11' => 'Apple QuickTime, Quality 666 (65%)',
+    '2b394105d4dd418e79b32e66496679d4:11' => 'Apple QuickTime, Quality 667 (65%)',
+    'c65677d79e37baf57767e10d7b7f1ce8:11' => 'Apple QuickTime, Quality 668 (65%)',
+    '688c7dca6b12c22a21e0caf1a0336c80:11' => 'Apple QuickTime, Quality 669-671 (65-66%)',
+    '20d4b3c9e3c292c68181974704fe5048:11' => 'Apple QuickTime, Quality 672-673 (66%)',
+    '3bc3948025869f25b143aa517b2154ac:11' => 'Apple QuickTime, Quality 674 (66%)',
+    '8a2ae82991917070de49cc48d104446f:11' => 'Apple QuickTime, Quality 675 (66%)',
+    'b5424d9dce37dd5c9e0e38bcc775f48e:11' => 'Apple QuickTime, Quality 676 (66%)',
+    '28f718af4edb0069a1fdab00f6ea978d:11' => 'Apple QuickTime, Quality 677 (66%)',
+    '910416483a49503202cbe3ecee33afc9:11' => 'Apple QuickTime, Quality 678 (66%)',
+    '153196d4f99569f9bbd3fe0e96d2909c:11' => 'Apple QuickTime, Quality 679 (66%)',
+    '919a38ebb9fc0bcba388643a9b3ef27c:11' => 'Apple QuickTime, Quality 680 (66%)',
+    'ef511ac2c9d7153c16e3e1846325b727:11' => 'Apple QuickTime, Quality 681 (67%)',
+    'e8b4ef8f94d89c59c855758a73ec451f:11' => 'Apple QuickTime, Quality 682 (67%)',
+    'a09fe2e60a7ff12e1e5ca00afa9719ef:11' => 'Apple QuickTime, Quality 683 (67%)',
+    'e56cf84423c16869a9a4fd6605b15ba4:11' => 'Apple QuickTime, Quality 684 (67%)',
+    'f64d88456f97a65fe562eb69e619782a:11' => 'Apple QuickTime, Quality 685 (67%)',
+    '8cbf6cda8ae0249fb91c1ff5ab788a04:11' => 'Apple QuickTime, Quality 686 (67%)',
+    'f0ebdd8d44ac1a80727041a087553847:11' => 'Apple QuickTime, Quality 687 (67%)',
+    'c8f917220d6285cda6428a2cf6a9a1b3:11' => 'Apple QuickTime, Quality 688-689 (67%)',
+    '83ff61ebceff5f888b9615b250aa7b76:11' => 'Apple QuickTime, Quality 690 (67%)',
+    'a2d1de53a0882047287a954f86bc783d:11' => 'Apple QuickTime, Quality 691 (67%)',
+    'c78717ac2705274888912f349eeb2c8e:11' => 'Apple QuickTime, Quality 692 (68%)',
+    'e032225ecdcf1d91d85626df59a2d0c6:11' => 'Apple QuickTime, Quality 693 (68%)',
+    'ebf82c50697d66a6913727095299f192:11' => 'Apple QuickTime, Quality 694-695 (68%)',
+    'bcc29022955cc7532b08640ab118259c:11' => 'Apple QuickTime, Quality 696 (68%)',
+    '6a87dd29703c2b3ef80f1b5d2cc8d26a:11' => 'Apple QuickTime, Quality 697 (68%)',
+    '91c9d96e11d96e10b328a5f18960247b:11' => 'Apple QuickTime, Quality 698 (68%)',
+    '6eeaaacec8edc933b68602b01d16204e:11' => 'Apple QuickTime, Quality 699 (68%)',
+    'c638d9151dc650993b56f4effc0fe19c:11' => 'Apple QuickTime, Quality 700 (68%)',
+    'c67d246229fcc0dd1b974f7df556d247:11' => 'Apple QuickTime, Quality 701 (68%)',
+    '7a52e3960831057d58e9b1ba03b87cf3:11' => 'Apple QuickTime, Quality 702 (69%)',
+    '907e599e3c462b498e936dfc35b20bb9:11' => 'Apple QuickTime, Quality 703-704 (69%)',
+    '65bf1ddc176fe4002a7a2ecaac60e58c:11' => 'Apple QuickTime, Quality 705 (69%)',
+    '40e59fdb430180502ceacf7b4034eff8:11' => 'Apple QuickTime, Quality 706 (69%)',
+    '4205aec34791d70be03b90ab1e54ef8c:11' => 'Apple QuickTime, Quality 707 (69%)',
+    '5c0a83e613d3bdd9ec7e86983f75b5be:11' => 'Apple QuickTime, Quality 708 (69%)',
+    'b3ebdf0376c9c48cca51ea8b550f6c51:11' => 'Apple QuickTime, Quality 709 (69%)',
+    '72161116404ed3cb449674760d0e4776:11' => 'Apple QuickTime, Quality 710 (69%)',
+    '35b3697c265e35185e9463aac6ce9b2d:11' => 'Apple QuickTime, Quality 711-712 (69-70%)',
+    '85adcc8c52c25334a9e7ea9d79433f8d:11' => 'Apple QuickTime, Quality 713 (70%)',
+    '8f72f67948f264bdbd33107c33b1e0a0:11' => 'Apple QuickTime, Quality 714 (70%)',
+    'c25ed5069735a3f9677ee494108a52bc:11' => 'Apple QuickTime, Quality 715 (70%)',
+    'fd3167b1cdcfa1bdd37a4841d37b1624:11' => 'Apple QuickTime, Quality 716-717 (70%)',
+    'a02b6b8286cf6d036961911e98bd8f89:11' => 'Apple QuickTime, Quality 718-719 (70%)',
+    'd876e8934da14a985abda0ebe722bbee:11' => 'Apple QuickTime, Quality 720 (70%)',
+    '31852b7659883eade6e273ac61ef0262:11' => 'Apple QuickTime, Quality 721 (70%)',
+    'de3aa6ed96eaf3ed3cd3ea70a2f75002:11' => 'Apple QuickTime, Quality 722 (71%)',
+    'f178977e9e0133711f395943816d26aa:11' => 'Apple QuickTime, Quality 723 (71%)',
+    '18fce3103e312ce26252ec4af6cd1350:11' => 'Apple QuickTime, Quality 724 (71%)',
+    'fdf6b04a2d8ac06d3fe64d1dceba4cd9:11' => 'Apple QuickTime, Quality 725 (71%)',
+    '6a37c2572bb47dff514aa4b343c104b5:11' => 'Apple QuickTime, Quality 726 (71%)',
+    'fdbe851f6e559bc17ce3610b91e7fead:11' => 'Apple QuickTime, Quality 727 (71%)',
+    '9fee7fc42e670d6e30a5e9fcf696241d:11' => 'Apple QuickTime, Quality 728 (71%)',
+    '5aedf3816a813ed63b0521b0c384a677:11' => 'Apple QuickTime, Quality 729 (71%)',
+    'c1278992838bdd62e71bf41c20126a5f:11' => 'Apple QuickTime, Quality 730 (71%)',
+    '791e3897f6ac92fb5e708b28dbd361b1:11' => 'Apple QuickTime, Quality 731 (71%)',
+    'd5b2902ae3fcd87e1521da86585e7b3a:11' => 'Apple QuickTime, Quality 732-733 (71-72%)',
+    'a99810db58e835fe4b213d707dc0b754:11' => 'Apple QuickTime, Quality 734 (72%)',
+    'e8032085aa55f664f7f74201ac10bb99:11' => 'Apple QuickTime, Quality 735 (72%)',
+    '488e5d04f779b15c53f76e67cccdb2ed:11' => 'Apple QuickTime, Quality 736 (72%)',
+    '548a841c0a8c3b2beeb134c6c3b922fc:11' => 'Apple QuickTime, Quality 737-738 (72%)',
+    'cfe4549eb2dd81684920aa32b598260c:11' => 'Apple QuickTime, Quality 739-740 (72%)',
+    'b6ff9215f87e4b053aaee36381f59005:11' => 'Apple QuickTime, Quality 741 (72%)',
+    'd1c8c1e1fc2bfb776d2ee1aace3fc6f9:11' => 'Apple QuickTime, Quality 742 (72%)',
+    '365693ebd558aebc31a79a1abff9709d:11' => 'Apple QuickTime, Quality 743-744 (73%)',
+    '0233ba670d2891e75da3ce5e7664cb67:11' => 'Apple QuickTime, Quality 745 (73%)',
+    'a91f5f8e8d743e52169d965992c5021e:11' => 'Apple QuickTime, Quality 746 (73%)',
+    '1a0487e7e1a8f4ade97b2e8a4cab46ec:11' => 'Apple QuickTime, Quality 747 (73%)',
+    '5a2311c438c7183f6cd1f45c10e5783a:11' => 'Apple QuickTime, Quality 748 (73%)',
+    '2750f3df7a97d6007d6a17f5dd27790a:11' => 'Apple QuickTime, Quality 749 (73%)',
+    '74fddf6faaf251b28a00b4d0cd9e5621:11' => 'Apple QuickTime, Quality 750 (73%)',
+    'ea65bdd87f78f7507fe6098473cbe0c9:11' => 'Apple QuickTime, Quality 751 (73%)',
+    '26d087368a13e3aca9ca13a54bcc648f:11' => 'Apple QuickTime, Quality 752-753 (73-74%)',
+    '5664c6ca557bc75526f59bea6aebde51:11' => 'Apple QuickTime, Quality 754 (74%)',
+    'ff7a6007b6aab26f3c72c715ce487d72:11' => 'Apple QuickTime, Quality 755 (74%)',
+    '912804912a3914f0b470b29495810d8c:11' => 'Apple QuickTime, Quality 756-758 (74%)',
+    '6537be61d21f1b6ded3253fdd84f599b:11' => 'Apple QuickTime, Quality 759-760 (74%)',
+    '72d947637340246a35ff3ee969fd613f:11' => 'Apple QuickTime, Quality 761 (74%)',
+    '8c5c788bd53945222fc98f1a6155004c:11' => 'Apple QuickTime, Quality 762 (74%)',
+    '9fa9c3d1041911322544aef0298695ba:11' => 'Apple QuickTime, Quality 763 (75%)',
+    '33113dc71a90e8db06b43dadfe36b020:11' => 'Apple QuickTime, Quality 764 (75%)',
+    '55e0cf02a898abf8e224e2e9cf6e6ca5:11' => 'Apple QuickTime, Quality 765-766 (75%)',
+    '4f00127e7931d668a7b472c8a669925a:11' => 'Apple QuickTime, Quality 767-768 (75%)',
+    '32aa33dc6de46b7c5c5948b0ae06cb0e:11' => 'Apple QuickTime, Quality 769 (75%)',
+    'a2b6067d9e5731be8029e17c00d7e043:11' => 'Apple QuickTime, Quality 770 (75%)',
+    'cb6bc96131c4a5f762b5e5f79e7c4b66:11' => 'Apple QuickTime, Quality 771 (75%)',
+    'e582a5f93f66cf34facfba5918a1d9e2:11' => 'Apple QuickTime, Quality 772 (75%)',
+    '54ab2e8fbd7c4ecac9eba5fb02a5ccd9:11' => 'Apple QuickTime, Quality 773 (75%)',
+    'c71131cb485b59faf920d11982f7d454:11' => 'Apple QuickTime, Quality 774 (76%)',
+    'c18239304e22bd19e3c8a21f9875ba39:11' => 'Apple QuickTime, Quality 775-776 (76%)',
+    '8278e4f14c7bf6efd2a847ef40f392e3:11' => 'Apple QuickTime, Quality 777 (76%)',
+    '6c0e396c705a59ec610a22f11466621b:11' => 'Apple QuickTime, Quality 778 (76%)',
+    'a0c4d0114c04c89c879d9dc03463b347:11' => 'Apple QuickTime, Quality 779 (76%)',
+    'c804929d3963c7427fa143e0d1e8c94e:11' => 'Apple QuickTime, Quality 780-781 (76%)',
+    'e331a0dd2c53616c2881bb381fc4c1e2:11' => 'Apple QuickTime, Quality 782 (76%)',
+    '24ec8f0996e5e8d4dd7019d2b6063290:11' => 'Apple QuickTime, Quality 783 (76%)',
+    '36e9cb02d3ef245a3e15272c5071b0ee:11' => 'Apple QuickTime, Quality 784 (77%)',
+    'b691578c1d6b16687fe2df12843d0642:11' => 'Apple QuickTime, Quality 785-786 (77%)',
+    'ecbf939a145939d5aa48fc3c9e19cfe8:11' => 'Apple QuickTime, Quality 787 (77%)',
+    '9440b11ee5eb970a3ea6de9353099761:11' => 'Apple QuickTime, Quality 788 (77%)',
+    '282914c43bab6e5c62f3caaf549f1510:11' => 'Apple QuickTime, Quality 789-790 (77%)',
+    '040c8ed8b19485d8677b964b03bc9929:11' => 'Apple QuickTime, Quality 791-792 (77%)',
+    'd9e503dc2dd4f6493be988ecb0f44f2c:11' => 'Apple QuickTime, Quality 793-795 (77-78%)',
+    '64d056c9e5e558d6c04d07d9d21aa7a3:11' => 'Apple QuickTime, Quality 796-798 (78%)',
+    '498f446de17202060a4752434df1ed7b:11' => 'Apple QuickTime, Quality 799 (78%)',
+    '5519e1c07692f51d0ee421ede78fb907:11' => 'Apple QuickTime, Quality 800 (78%)',
+    '511c5bddc18566a2544732291920caf3:11' => 'Apple QuickTime, Quality 801 (78%)',
+    '659f7466f80a8034f74a00ba07b8c3fb:11' => 'Apple QuickTime, Quality 802-804 (78-79%)',
+    'fb64b35fe4021c34f16cf5bb1e59c0e8:11' => 'Apple QuickTime, Quality 805 (79%)',
+    '54fcb6649f5ba51c32c68970797e41ea:11' => 'Apple QuickTime, Quality 806-807 (79%)',
+    '80ef22ca4475af1bbb8963ac511144d7:11' => 'Apple QuickTime, Quality 808 (79%)',
+    'ccdf1a403ec068ad21ee78686a86dd10:11' => 'Apple QuickTime, Quality 809 (79%)',
+    '1487f0cfc64949393aee2eab71b6b72c:11' => 'Apple QuickTime, Quality 810 (79%)',
+    'a8be3b3791e958d092b3e37286802e0c:11' => 'Apple QuickTime, Quality 811-813 (79%)',
+    'f9176b3ef0b4038c6c52b30ba033eb7f:11' => 'Apple QuickTime, Quality 814 (79%)',
+    '60264e35250325032bf7866ca8beaf58:11' => 'Apple QuickTime, Quality 815 (80%)',
+    '5efe038d405e029badcea4c8ee2bfc88:11' => 'Apple QuickTime, Quality 816 (80%)',
+    '717cbe19ae1dc9f72c86ef518aefea16:11' => 'Apple QuickTime, Quality 817 (80%)',
+    '9f490145dcc00db3e57014d41d2f99f2:11' => 'Apple QuickTime, Quality 818 (80%)',
+    '120b93a6ab4a1e8c78578e86e3ef837f:11' => 'Apple QuickTime, Quality 819 (80%)',
+    '9d765f3947408b2c6f26163d7b072895:11' => 'Apple QuickTime, Quality 820 (80%)',
+    'a9c018e06868989776a81650300bcfce:11' => 'Apple QuickTime, Quality 821 (80%)',
+    '2c6581e20fa5393b3dd4d58f0df01957:11' => 'Apple QuickTime, Quality 822-824 (80%)',
+    '925b6581f0ae2f288530b00168152b80:11' => 'Apple QuickTime, Quality 825 (81%)',
+    'c94e09eec2df4a41b2806c23d9939cb6:11' => 'Apple QuickTime, Quality 826 (81%)',
+    '68d5ce8ce1a9e337ee9630dadad0650e:11' => 'Apple QuickTime, Quality 827-829 (81%)',
+    'f73704219e174961963f0fcd832b09a8:11' => 'Apple QuickTime, Quality 830-832 (81%)',
+    'b783df92ec8a787b1eae4e05888b184b:11' => 'Apple QuickTime, Quality 833-834 (81%)',
+    '55cd2cad99821382b1bd78355980b1d1:11' => 'Apple QuickTime, Quality 835 (82%)',
+    '9ebd96ea70c2bcf4f377a175c71baf2c:11' => 'Apple QuickTime, Quality 836 (82%)',
+    '12d303b2e6a467b4f20a34e695f9da7e:11' => 'Apple QuickTime, Quality 837 (82%)',
+    '8711d6e1c56049c0e643bc6cf19a735c:11' => 'Apple QuickTime, Quality 838-839 (82%)',
+    '88558d6e9a513ff713945bd60ed19cc7:11' => 'Apple QuickTime, Quality 840 (82%)',
+    '25b45d6c1668613a61b81c6b60fa158a:11' => 'Apple QuickTime, Quality 841 (82%)',
+    'b2f95d6a0eec4de39e0964a3b7303e9f:11' => 'Apple QuickTime, Quality 842 (82%)',
+    '631548841b70e871ee16009737dd4b9c:11' => 'Apple QuickTime, Quality 843-844 (82%)',
+    '7fac641c5b795e68ca8cfae4466a19c7:11' => 'Apple QuickTime, Quality 845 (83%)',
+    'a15a74418a924874c5f3d2ca20e7af90:11' => 'Apple QuickTime, Quality 846-849 (83%)',
+    'e4d76c3cd4d36b72537a2234a3597933:11' => 'Apple QuickTime, Quality 850 (83%)',
+    '36f1ec430bae8e5c72af6388e2a4d807:11' => 'Apple QuickTime, Quality 851-852 (83%)',
+    'b558f097ed59f547d2b370a73145caf9:11' => 'Apple QuickTime, Quality 853 (83%)',
+    'ceecacb651d0e01e9b1c78cde2d7835a:11' => 'Apple QuickTime, Quality 854 (83%)',
+    '82a9cce34fb9c7c3c0ab908533a9a9bf:11' => 'Apple QuickTime, Quality 855-856 (83-84%)',
+    'e93244fdb14bb27a2c30ee133b3e9f5e:11' => 'Apple QuickTime, Quality 857 (84%)',
+    '7a12ccd01bfdd2cf3b8ee2df498b8ae0:11' => 'Apple QuickTime, Quality 858 (84%)',
+    'd0d6f781130c0fecd985df78c15c5c16:11' => 'Apple QuickTime, Quality 859-860 (84%)',
+    '1c19e4fde384a33f208074c73775d990:11' => 'Apple QuickTime, Quality 861-863 (84%)',
+    '8fb281fcf4d481e59e1c15ed51ef8f19:11' => 'Apple QuickTime, Quality 864 (84%)',
+    'c3f615274e58eb887a2aa75acad436ff:11' => 'Apple QuickTime, Quality 865 (84%)',
+    '9146c5df73615b0f2a470521bab7e4c4:11' => 'Apple QuickTime, Quality 866 (85%)',
+    'ac2d99dd3ff609760c207419312e7b30:11' => 'Apple QuickTime, Quality 867 (85%)',
+    '7c7d225760bce3b4e479aca8bcd2b850:11' => 'Apple QuickTime, Quality 868 (85%)',
+    '9da4a7e310cb44578b009e78458d3b19:11' => 'Apple QuickTime, Quality 869 (85%)',
+    '1ae782c12797f5e5c9b083099148e43a:11' => 'Apple QuickTime, Quality 870 (85%)',
+    '193ace8d9e274bb9188b1a9a7bdee777:11' => 'Apple QuickTime, Quality 871-872 (85%)',
+    '9160a8eeb898a05dcb02206603a45a65:11' => 'Apple QuickTime, Quality 873-877 (85-86%)',
+    '0443da2c934e95fca0df8a0a1433eea4:11' => 'Apple QuickTime, Quality 878-880 (86%)',
+    'fa99ff1ecc29c5caa95fa62189fca670:11' => 'Apple QuickTime, Quality 881-886 (86-87%)',
+    'd9a914baea5468bb52c09d1d0b5bd131:11' => 'Apple QuickTime, Quality 887 (87%)',
+    '6c0ac535ec30285b609e0b8ca18e4dc0:11' => 'Apple QuickTime, Quality 888-890 (87%)',
+    'dffb0a244fa54783569693edf84d1cda:11' => 'Apple QuickTime, Quality 891-893 (87%)',
+    '507b49a59dce17c02dc16fcb329352eb:11' => 'Apple QuickTime, Quality 894 (87%)',
+    'dd757185a44c3d6222e9d16a0c2ee890:11' => 'Apple QuickTime, Quality 895 (87%)',
+    'f3526abe33de71ad0eb728c9d446b545:11' => 'Apple QuickTime, Quality 896 (88%)',
+    '34466385e7bf9b2708adf19be1eb3c2d:11' => 'Apple QuickTime, Quality 897-898 (88%)',
+    'e43438348a912a2210261472d1a747ab:11' => 'Apple QuickTime, Quality 899 (88%)',
+    '184d01e77f6239f63fd6ab6d36761e64:11' => 'Apple QuickTime, Quality 900-901 (88%)',
+    '26005cdf9397dcce883660aeecb0426b:11' => 'Apple QuickTime, Quality 902 (88%)',
+    '09321d810a54503da7ad7b8e883227ea:11' => 'Apple QuickTime, Quality 903 (88%)',
+    'd6438ea5a93b6d4d0ba26de7c56f2634:11' => 'Apple QuickTime, Quality 904-905 (88%)',
+    'ddc90333cb2279aa533a339710bd81ef:11' => 'Apple QuickTime, Quality 906 (88%)',
+    '14a352b80a350e2df6b2bc444ccc74f6:11' => 'Apple QuickTime, Quality 907-908 (89%)',
+    '91a7f0747ed633f481918a83b1a7c77c:11' => 'Apple QuickTime, Quality 909-914 (89%)',
+    'a3bb9728b3dfa7002364659db0c420fc:11' => 'Apple QuickTime, Quality 915-917 (89-90%)',
+    '9df94f927ffc1f3345923232691fab3b:11' => 'Apple QuickTime, Quality 918-920 (90%)',
+    '259764d950c1f1e399cdb27e159c8985:11' => 'Apple QuickTime, Quality 921-922 (90%)',
+    '73313d816524749545292ed2284c804c:11' => 'Apple QuickTime, Quality 923-924 (90%)',
+    '449ed4370a849e0f736b57ee7ccab942:11' => 'Apple QuickTime, Quality 925-926 (90%)',
+    'bd1f81bd50cf9859eb0ae6d2dbf75d09:11' => 'Apple QuickTime, Quality 927 (91%)',
+    '820db98d1ee91bb648e7a05498a340b0:11' => 'Apple QuickTime, Quality 928 (91%)',
+    '93c1ba0af1f50d889cb5e2364be3a056:11' => 'Apple QuickTime, Quality 929 (91%)',
+    'cc96e1c8906353c4023bc7e6b72bb684:11' => 'Apple QuickTime, Quality 930 (91%)',
+    'eb728dc3105ddb5a0597384b54ed948c:11' => 'Apple QuickTime, Quality 931 (91%)',
+    'dc0278d78fa5c8daf84f8c2672f582c6:11' => 'Apple QuickTime, Quality 932-933 (91%)',
+    '1a603cba63dbba0d0815fc7319271b93:11' => 'Apple QuickTime, Quality 934-936 (91%)',
+    '3d8f4957eab9756993a78efe08ba3798:11' => 'Apple QuickTime, Quality 937-938 (92%)',
+    'cef5a49e1834c316a4a9e7dca8d69157:11' => 'Apple QuickTime, Quality 939 (92%)',
+    'ca21386b17f3866a235fca4b6e72b124:11' => 'Apple QuickTime, Quality 940 (92%)',
+    'ec662935c494c5abd6f6c907f77be65c:11' => 'Apple QuickTime, Quality 941-943 (92%)',
+    '190a54eb1127ee87231795bc3d661b5a:11' => 'Apple QuickTime, Quality 944-946 (92%)',
+    'e78229129afca214a07ad978262c545e:11' => 'Apple QuickTime, Quality 947-951 (92-93%)',
+    'c31cb63954b137b62c5fe35379235e2e:11' => 'Apple QuickTime, Quality 952-954 (93%)',
+    '25ca43baa972ad9c82128606cd383805:11' => 'Apple QuickTime, Quality 955 (93%)',
+    '334c67d739adf957d1620201cb7a521c:11' => 'Apple QuickTime, Quality 956-957 (93-93%)',
+    '29c42d951dc84d62bd134bec71bf731b:11' => 'Apple QuickTime, Quality 958 (94%)',
+    'fa6f80883480ab3ddea8ee2f6796a14b:11' => 'Apple QuickTime, Quality 959-961 (94%)',
+    'e40f6a9a3daf4bfc42aedcb9107076ea:11' => 'Apple QuickTime, Quality 962 (94%)',
+    'd26a06f6114d83714e3b64b6dbe97e6f:11' => 'Apple QuickTime, Quality 963-967 (94%)',
+    'c40848be9d1d1018747630cdac2d7294:11' => 'Apple QuickTime, Quality 968-970 (95%)',
+    'ab2b6d0624f294bf4e53e34208caeaa6:11' => 'Apple QuickTime, Quality 971 (95%)',
+    'b6ea2f838fa1942a21e41f6bba417782:11' => 'Apple QuickTime, Quality 972-973 (95%)',
+    'ff765e75c06c9db34f66ae7ee0202d05:11' => 'Apple QuickTime, Quality 974 (95%)',
+    'c33573208ef877f1bc9a64f595e00c4d:11' => 'Apple QuickTime, Quality 975-977 (95%)',
+    '6528da6df208ce35fd84dccabc81d4da:11' => 'Apple QuickTime, Quality 978-979 (96%)',
+    '420d094d00a4a8aec94c5667254d2053:11' => 'Apple QuickTime, Quality 980-984 (96%)',
+    '427271dd1e2a3d7a7ce54af73d9e6c77:11' => 'Apple QuickTime, Quality 985-987 (96%)',
+    '99589fb7d66a29f15d9ff0f37235e7a2:11' => 'Apple QuickTime, Quality 988-991 (96-97%)',
+    '98fddd9e5862e06385b46a016597c02f:11' => 'Apple QuickTime, Quality 992-993 (97%)',
+    '381d1ca1d61986f28cfd6da0fca348da:11' => 'Apple QuickTime, Quality 994-996 (97%)',
+    '11a232fa9de634fadde1869007baab9c:11' => 'Apple QuickTime, Quality 997-998 (97%)',
+    '02374d6405239e8fe5ab939b92f4fd03:11' => 'Apple QuickTime, Quality 999-1000 (98%)',
+    'f91cfb708c99c2fef0f7148976514f44:11' => 'Apple QuickTime, Quality 1001-1002 (98%)',
+    '83f3452abc7906930b228c29a4320089:11' => 'Apple QuickTime, Quality 1003 (98%)',
+    '4379016ba81dc331ffd5f9a8ab5b6399:11' => 'Apple QuickTime, Quality 1004 (98%)',
+    'e2cccecebc01c7d8a4fca2dab682ba8f:11' => 'Apple QuickTime, Quality 1005-1009 (98-99%)',
+    '8d4b2a14a176d63e509684aa4246dabb:11' => 'Apple QuickTime, Quality 1010-1013 (99%)',
+    '40a7c1d8f58612f4470c2531768d93b5:11' => 'Apple QuickTime, Quality 1014-1016 (99%)',
+    '8392742f8f5971ed08c7520d0e9c81f3:11' => 'Apple QuickTime, Quality 1017 (99%)',
+    '14040c7711b6fa62383da3edc9ade1b7:11' => 'Apple QuickTime, Quality 1018-1020 (99-100%)',
+    '22ccf9c976b36da34f48385a09b1951b:11' => 'Apple QuickTime, Quality 1021-1023 (100%)',
+    '4aa632db3be6b6e85565c1fe66cb22d1:11' => 'Apple QuickTime, Quality 1024 (lossless)',
+
+    # Apple Aperture 2.1.3 (ref 2)
+    '60cb2afa0cfa7395635a9360fc690b46:221111' => 'Apple Aperture Quality 0',
+    '6b9be09d6ec6491a20c2827dbeb678c0:221111' => 'Apple Aperture Quality 1',
+    'dbb17a02e661f2475411fc1dc37902ef:221111' => 'Apple Aperture Quality 2',
+    '8a5df2b5337bf8251c3f66f6adbb5262:221111' => 'Apple Aperture Quality 3',
+    '3841f0f3be30520a1a57f41c449588ee:221111' => 'Apple Aperture Quality 4',
+    '2b1dba266c728a9f46d06e6e5c247953:221111' => 'Apple Aperture Quality 5',
+  # 'Independent JPEG Group library (used by many applications), Quality 91' => 'Apple Aperture Quality 6',
+    '93818f3a0e6d491500cb62e1f683da22:221111' => 'Apple Aperture Quality 7',
+    '8c0c36696a99fd889e0f0c7d64824f3c:221111' => 'Apple Aperture Quality 8',
+    '043645382c79035b6f2afc62d373a37f:221111' => 'Apple Aperture Quality 9',
+    '558d017ce6d5b5282ce76727fe99b91e:221111' => 'Apple Aperture Quality 10',
+    '0b52b82694040193aee10e8074cd7ad5:221111' => 'Apple Aperture Quality 11',
+  # 'Independent JPEG Group library (used by many applications), Quality 100' => 'Apple Aperture Quality 12',
+
+    # Tested with Corel Paint Shop Pro PHOTO X2 (Win) - Different subsamplings possible
+    '1c78c0daaa0bbfd4a1678b5569b0fa13' => 'Corel Paint Shop Pro PHOTO, Quality 1',
+    '5ffdd2e918ec293efc79083703737290' => 'Corel Paint Shop Pro PHOTO, Quality 2',
+    '4ed4751d772933938600c4e7560bf19c' => 'Corel Paint Shop Pro PHOTO, Quality 3',
+    'f647f0fb4320c61f52e2a79d12bbc8cc' => 'Corel Paint Shop Pro PHOTO, Quality 4',
+    '6194167174dfcb4a769cf26f5c7a018d' => 'Corel Paint Shop Pro PHOTO, Quality 5',
+    '6120ded86d4cc42cd7ca2131b1f51fad' => 'Corel Paint Shop Pro PHOTO, Quality 6',
+    'c07a6430e56ef16a0526673398e87ac6' => 'Corel Paint Shop Pro PHOTO, Quality 7',
+    '507cc511e561916efa3b49228ffc8c9a' => 'Corel Paint Shop Pro PHOTO, Quality 8',
+    '612941a50f2c0992938bc13106caf228' => 'Corel Paint Shop Pro PHOTO, Quality 9',
+    '7624f08396d811fdb6f1ead575e67e58' => 'Corel Paint Shop Pro PHOTO, Quality 10',
+    'e215df38e258b3d8bceb57aa64388d26' => 'Corel Paint Shop Pro PHOTO, Quality 11',
+    '78f66ee0bc442950808e25daa02a2b02' => 'Corel Paint Shop Pro PHOTO, Quality 12',
+    '14efb0bb5124910a37bcbd5f06de9aa9' => 'Corel Paint Shop Pro PHOTO, Quality 13',
+    'd61168238621bd221ef1eb3dcbe270a3' => 'Corel Paint Shop Pro PHOTO, Quality 14',
+    'e2d2755891b4e4bc5f7c8d76dcbb0d53' => 'Corel Paint Shop Pro PHOTO, Quality 15',
+    'f6c4502144a2e5c82c07994d3cd01665' => 'Corel Paint Shop Pro PHOTO, Quality 16',
+    '78801638505e95827c2f7cc0c7ef78f4' => 'Corel Paint Shop Pro PHOTO, Quality 17',
+    'e8ff3d165b4c028c18ec8a8f940a12a1' => 'Corel Paint Shop Pro PHOTO, Quality 18',
+    '984c359b9fbcc4d6f805946aa23ae708' => 'Corel Paint Shop Pro PHOTO, Quality 19',
+    'd1dc48d911055bc533779d6e086f7242' => 'Corel Paint Shop Pro PHOTO, Quality 20',
+    'd7437a18e86ac2832d73204acd82aa89' => 'Corel Paint Shop Pro PHOTO, Quality 21',
+    'bceaee6c1a150006b3643de6942ccfa3' => 'Corel Paint Shop Pro PHOTO, Quality 22',
+    'c448e6817efa9acdad225e60ed0013f9' => 'Corel Paint Shop Pro PHOTO, Quality 23',
+    '904f231c98f390400ba7ae17c252813f' => 'Corel Paint Shop Pro PHOTO, Quality 24',
+    'ccd6708ca1dbd66a23d40cee635a0f76' => 'Corel Paint Shop Pro PHOTO, Quality 25',
+    '10d87624d888b75b29e156be8dad35f4' => 'Corel Paint Shop Pro PHOTO, Quality 26',
+    '8558c6d41f03db192198dceefbd1e89b' => 'Corel Paint Shop Pro PHOTO, Quality 27',
+    '058fc759cff9d615f91d9ffb4b46436a' => 'Corel Paint Shop Pro PHOTO, Quality 28',
+    '5c606e0f7168a78fd8d0c91646c801a3' => 'Corel Paint Shop Pro PHOTO, Quality 29',
+    'e9555e593a6fd9aeee399de16080cd61' => 'Corel Paint Shop Pro PHOTO, Quality 30',
+    '2c2726484978a15d3d756d43b0baa290' => 'Corel Paint Shop Pro PHOTO, Quality 31',
+    '8b1d11d31bc9445278cf9af55b0c156b' => 'Corel Paint Shop Pro PHOTO, Quality 32',
+    'aa4a5528ae18ecd36ec052014b91f651' => 'Corel Paint Shop Pro PHOTO, Quality 33',
+    '9a26194b114b7db253601ff80b03da9a' => 'Corel Paint Shop Pro PHOTO, Quality 34',
+    '3fa780a3dff1d787f7d883585a46dcfb' => 'Corel Paint Shop Pro PHOTO, Quality 35',
+    '0a899361ed0d51e224dc535ceb02f9a1' => 'Corel Paint Shop Pro PHOTO, Quality 36',
+    '3a2ab96a6ad9612e1377ddc822f02ddd' => 'Corel Paint Shop Pro PHOTO, Quality 37',
+    '315f4faadd967e72d730155091c4912f' => 'Corel Paint Shop Pro PHOTO, Quality 38',
+    '5f6e3a66672d6e4c41b1689996ca57d3' => 'Corel Paint Shop Pro PHOTO, Quality 39',
+    '9503a86793e86d1fca3d8797548fa243' => 'Corel Paint Shop Pro PHOTO, Quality 40',
+    '3b95f11bd77cb8af977c09d5851131f8' => 'Corel Paint Shop Pro PHOTO, Quality 41',
+    'ececf8dfa473110534b506db58d98f15' => 'Corel Paint Shop Pro PHOTO, Quality 42',
+    'cfe3144d4f8048a0507269a9d8a85993' => 'Corel Paint Shop Pro PHOTO, Quality 43',
+    'eb9d48d135b2c61c51fc3f23b0001b4d' => 'Corel Paint Shop Pro PHOTO, Quality 44',
+    'b08313a6919d308e50b806f138a8a2a1' => 'Corel Paint Shop Pro PHOTO, Quality 45',
+    '7c34e6e7fe2cc760fa5c3ed812a8b74c' => 'Corel Paint Shop Pro PHOTO, Quality 46',
+    '90ece7123e8d614d9aab55eaba6dd7da' => 'Corel Paint Shop Pro PHOTO, Quality 47',
+    '6d79fe623c4c5320bdbe4d3026f4e71a' => 'Corel Paint Shop Pro PHOTO, Quality 48',
+    'a7e85552c3e5e40288891d225f308590' => 'Corel Paint Shop Pro PHOTO, Quality 49',
+    '67b9a678d9f669167c5b4bf12422ad50' => 'Corel Paint Shop Pro PHOTO, Quality 50',
+    '1fab112b17e94f53e94a9208e9091b7b' => 'Corel Paint Shop Pro PHOTO, Quality 51',
+    '4971237e046795a030a99a0e8d2c5acb' => 'Corel Paint Shop Pro PHOTO, Quality 52',
+    'f3e1672b93ff159231c51b1b157e45fd' => 'Corel Paint Shop Pro PHOTO, Quality 53',
+    '6e9cfb8131373c3d1873e3f497e46b64' => 'Corel Paint Shop Pro PHOTO, Quality 54',
+    '9155c8acf8322e8af898272c694fa1d6' => 'Corel Paint Shop Pro PHOTO, Quality 55',
+    '52b20edc779f206f2aed50610971f181' => 'Corel Paint Shop Pro PHOTO, Quality 56',
+    'ad801813f822ef9774801ab4d9145a61' => 'Corel Paint Shop Pro PHOTO, Quality 57',
+    '07259679e2a842478df97c7f0ddd4df3' => 'Corel Paint Shop Pro PHOTO, Quality 58',
+    '67db25c57803c34b065736f46f6afadb' => 'Corel Paint Shop Pro PHOTO, Quality 59',
+    'c7498fc4b3802b290a452631dd1e1b63' => 'Corel Paint Shop Pro PHOTO, Quality 60',
+    '3f7b04c7952f96d2624813ed9896f128' => 'Corel Paint Shop Pro PHOTO, Quality 61',
+    'd5ec901d20f3887007d0f4cfb7d1460d' => 'Corel Paint Shop Pro PHOTO, Quality 62',
+    '61bb38e23040b6a8b0e8721e6d6eff66' => 'Corel Paint Shop Pro PHOTO, Quality 63',
+    '48fac53d9d168eab3ce9b6edc4b9fcb1' => 'Corel Paint Shop Pro PHOTO, Quality 64',
+    '8cb101a5ae986e45cc31a9e19a35535d' => 'Corel Paint Shop Pro PHOTO, Quality 65',
+    '0e08dc629e883530cb2ae78c90f125b3' => 'Corel Paint Shop Pro PHOTO, Quality 66',
+    '5134762d2d4baac8711a52e76730591c' => 'Corel Paint Shop Pro PHOTO, Quality 67',
+    '14b57dc6d5381fd0a743c7bd8b28bed1' => 'Corel Paint Shop Pro PHOTO, Quality 68',
+    '9d398f1b1f40b7aaec1bd9cdb6922530' => 'Corel Paint Shop Pro PHOTO, Quality 69',
+    'c7e68d88bee5c2ee4b61a11bc2e68c80' => 'Corel Paint Shop Pro PHOTO, Quality 70',
+    '917fe67f6ded5decac1820642239622c' => 'Corel Paint Shop Pro PHOTO, Quality 71',
+    '362c3e0c08f6951018cde7b412cd513f' => 'Corel Paint Shop Pro PHOTO, Quality 72',
+    'd91cd4a2dcd1a29e6ef652ebcfdd58d7' => 'Corel Paint Shop Pro PHOTO, Quality 73',
+    '11f5fbd5e74e5c5e305b95dbbc4356a8' => 'Corel Paint Shop Pro PHOTO, Quality 74',
+    'bf010771f909049fc5fceedcaa0f917c' => 'Corel Paint Shop Pro PHOTO, Quality 75',
+    'a455a3149812ba6951a016ee6114f9da' => 'Corel Paint Shop Pro PHOTO, Quality 76',
+    '42e0c4082ec4d026c77d19a053a983f4' => 'Corel Paint Shop Pro PHOTO, Quality 77',
+    '326bd5938e2db7de9250a9fb0efc6692' => 'Corel Paint Shop Pro PHOTO, Quality 78',
+    'a3e2cc4ea95cda49501bc73c494e9420' => 'Corel Paint Shop Pro PHOTO, Quality 79',
+    '8c89043f00678bb5c68ee90390c1b43b' => 'Corel Paint Shop Pro PHOTO, Quality 80',
+    'fc5812ad9a4cd0122eb1c63f0ac3b5a3' => 'Corel Paint Shop Pro PHOTO, Quality 81',
+    '84dbe33962674aab86e03681ac3bd35f' => 'Corel Paint Shop Pro PHOTO, Quality 82',
+    'b6b80a78472dca05c9135702e96fdad9' => 'Corel Paint Shop Pro PHOTO, Quality 83',
+    '01f997907a4c1dfd1e6b00aca9ff5d80' => 'Corel Paint Shop Pro PHOTO, Quality 84',
+    '8431e86434062b325c519fd836353cd0' => 'Corel Paint Shop Pro PHOTO, Quality 85',
+    '15f375a620952738ff21ff4aa496b8f7' => 'Corel Paint Shop Pro PHOTO, Quality 86',
+    '7b0f02aa96271376d3f81658d98fb1df' => 'Corel Paint Shop Pro PHOTO, Quality 87',
+    '86e7666b05bd1fc130fbf4b48f854288' => 'Corel Paint Shop Pro PHOTO, Quality 88',
+    '6af05d547e8911fe2d1f2b4d968a477e' => 'Corel Paint Shop Pro PHOTO, Quality 89',
+    '8baa876790518bf509dd09093759331d' => 'Corel Paint Shop Pro PHOTO, Quality 90',
+    'eb7d90d291044d1bd8f40ca1b3ce0ddf' => 'Corel Paint Shop Pro PHOTO, Quality 91',
+    '6f338385a8f2cd2dd3420a4f6138a206' => 'Corel Paint Shop Pro PHOTO, Quality 92',
+    'b0a0fd1ec2dd366ad00d3e83d6dedec2' => 'Corel Paint Shop Pro PHOTO, Quality 93',
+    'e09026128c9880b44ac71224f477cd3b' => 'Corel Paint Shop Pro PHOTO, Quality 94',
+    'd0a8f50ff547da69a57eeb892e194cff' => 'Corel Paint Shop Pro PHOTO, Quality 95',
+    '7849ba902d96273b5ac7b6eb98f4d009' => 'Corel Paint Shop Pro PHOTO, Quality 96',
+    '379f9f196d4190298a732ab9a7031001' => 'Corel Paint Shop Pro PHOTO, Quality 97',
+    'c3d1601f84ec3adfbc8ca17883ef6378' => 'Corel Paint Shop Pro PHOTO, Quality 98',
+    '1f5e87bec674bdd7dff166c2ea9ca004' => 'Corel Paint Shop Pro PHOTO, Quality 99',
+
+    # Tested with FixFoto Version 2.90 Build 136 (Win) - different subsamplings possible
+    '866dd04cb0fe2e00cda7395162480117' => 'FixFoto, Quality 0 or 1',
+    '1e400ba25fa835e2771772bbfb15b94b' => 'FixFoto, Quality 2',
+    '302ff1ad1a50d0f01a82cc88f286c649' => 'FixFoto, Quality 3',
+    '1343a117f5fab26d556a3e7558366591' => 'FixFoto, Quality 4',
+    '8fbb8cc5368224625689df80bf4d2a04' => 'FixFoto, Quality 5',
+    'a371d1ffc8d85d502854a356f3b0ea74' => 'FixFoto, Quality 6',
+    'a9a0a5000cd6fb322960a4c45cf1d032' => 'FixFoto, Quality 7',
+    'aaac84043224d33e1d3a1723b653b0cd' => 'FixFoto, Quality 8',
+    '701e4820f6d0b68e67b6a2b90a7baa0c' => 'FixFoto, Quality 9',
+    '877d03a5abf5b6c4ad03c39afd97f4a2' => 'FixFoto, Quality 10',
+    'b3d9bdc2090200537fb42f4d69631150' => 'FixFoto, Quality 11',
+    '3cf156d54120b53057f56e9f38ee2896' => 'FixFoto, Quality 12',
+    '69fe5c29b9d5e4c823f8a082ab7b3285' => 'FixFoto, Quality 13',
+    'cf8573af40ced1793dcbc2346f969240' => 'FixFoto, Quality 14',
+    '22944c3bc03d6adea8d6819f914452c3' => 'FixFoto, Quality 15',
+    'd768df38fb51c4b9977e5d7185f97a6c' => 'FixFoto, Quality 16',
+    '7ef2cd2b66d51fe80d94d5db427ee9ef' => 'FixFoto, Quality 17',
+    'ed3d3b9ff9faf0009e44b9803f6295d7' => 'FixFoto, Quality 18',
+    '70a0b15e2e5f97e0a9333a2011afe5cd' => 'FixFoto, Quality 19',
+    'd798b707a6b83eb54664abe0833b46aa' => 'FixFoto, Quality 20',
+    'bf68d1866b75cea8f99cf2fc46f9d686' => 'FixFoto, Quality 21',
+    'b98b8adb8f1f78b65800efe6c329ceab' => 'FixFoto, Quality 22',
+    'c063344185079018af9fcf161a3fdf98' => 'FixFoto, Quality 23',
+
+    # Tested with Nikon Capture NX Version 2.0.0 (Win)
+    '0ef9d9f62ab68807eedf6cb8c2ec120b:221111' => 'Nikon Capture NX, Quality 0',
+    'efbc50df45bc1d1fbbbd29c3e5de04b2:221111' => 'Nikon Capture NX, Quality 1',
+    'cbde745c78fd546d6e83dd7512ebe863:221111' => 'Nikon Capture NX, Quality 2',
+    '33731f743fc28e9d81e542f0ed7cdfba:221111' => 'Nikon Capture NX, Quality 3',
+    '866fcb1296d7da02b4ad31afb242f25f:221111' => 'Nikon Capture NX, Quality 4',
+    'cfbe44397240092d3a67241a23342528:221111' => 'Nikon Capture NX, Quality 5',
+    'a4b8b3408ae302ae81f125e972901131:221111' => 'Nikon Capture NX, Quality 6',
+    '3a6cefd4f43c513fdf0858f26afeab5a:221111' => 'Nikon Capture NX, Quality 7',
+    '1e861ce223babf95bc795e18cbdb49d1:221111' => 'Nikon Capture NX, Quality 8',
+    '4d5b512d8bc173f14e6a3cf8574f670a:221111' => 'Nikon Capture NX, Quality 9',
+    '9b1e6d379d3030dfa313bcaedc1ef3c7:221111' => 'Nikon Capture NX, Quality 10',
+    'e39b60fcecf3221d14c62dc13ddf4726:221111' => 'Nikon Capture NX, Quality 11',
+    '3654bbf4a45e0c0758a82a075b3f77cc:221111' => 'Nikon Capture NX, Quality 12',
+    '4f5889173779409ec604622a1894ab4a:221111' => 'Nikon Capture NX, Quality 13',
+    '738685b86b80ff0e8b562102d1b58f71:221111' => 'Nikon Capture NX, Quality 14',
+    '48a53035374c08e6490893d8113ed6b3:221111' => 'Nikon Capture NX, Quality 15',
+    '03651ac1d15043f77949a63ac3762584:221111' => 'Nikon Capture NX, Quality 16',
+    '27811b28d02bd417857904f0a9e1ed58:221111' => 'Nikon Capture NX, Quality 17',
+    '03201bd5642a451d99b99bfd10fc42df:221111' => 'Nikon Capture NX, Quality 18',
+    '67d5eb5f55c9a5baa0a67d42a841d77b:221111' => 'Nikon Capture NX, Quality 19',
+    '18392b08bf8cf788a579f376297c3334:221111' => 'Nikon Capture NX, Quality 20',
+    'de0c784b75953851dc370f4daecfa1a9:221111' => 'Nikon Capture NX, Quality 21',
+    '75f260644b87a9779188126da8709e7f:221111' => 'Nikon Capture NX, Quality 22',
+    'c44701e8185306f5e6d09be16a2b0fbd:221111' => 'Nikon Capture NX, Quality 23',
+    '086e5ce1149e14efd9e424956734fe05:221111' => 'Nikon Capture NX, Quality 24',
+    'aad1109d9c49b8170feac125148b2a50:221111' => 'Nikon Capture NX, Quality 25',
+    'c97965ce5392623f668a386b30e41cee:221111' => 'Nikon Capture NX, Quality 26',
+    'd9dadfb6f0a25765abe00e69857c5520:221111' => 'Nikon Capture NX, Quality 27',
+    '0ee9ca02a1fe8a17b6e50a2e86d19a7c:221111' => 'Nikon Capture NX, Quality 28',
+    '88b1726a20759f29eecfa2b129773127:221111' => 'Nikon Capture NX, Quality 29',
+    '70a311935ed066da954897fad5079377:221111' => 'Nikon Capture NX, Quality 30',
+    'aa2d374bbab2a30e00c1863264588a42:221111' => 'Nikon Capture NX, Quality 31',
+    '097b684846696b3a8bbdf2bd2f9ded9c:221111' => 'Nikon Capture NX, Quality 32',
+    'bb313d5398065376c7765092fc8ea0f0:221111' => 'Nikon Capture NX, Quality 33',
+    'aa049fdc1387851a664143df0408f55c:221111' => 'Nikon Capture NX, Quality 34',
+    '087c1c1a368adc82900d83235f432d3f:221111' => 'Nikon Capture NX, Quality 35',
+    '7dec6568dbad7a70622c994a326957e2:221111' => 'Nikon Capture NX, Quality 36',
+    'd2e14d8ba7d38f7544b569eea7221255:221111' => 'Nikon Capture NX, Quality 37',
+    'ce6bcb98c5f9358594f5934e64b4ecc3:221111' => 'Nikon Capture NX, Quality 38',
+    '4785aafc8471873402819e423b8969a9:221111' => 'Nikon Capture NX, Quality 39',
+    '66ae78a749b520b35d4daf4531df8ae5:221111' => 'Nikon Capture NX, Quality 40',
+    '946d9f9346a0c65eec478945ad3d6143:221111' => 'Nikon Capture NX, Quality 41',
+    'f46e96afa026233c1662c9114feb61e9:221111' => 'Nikon Capture NX, Quality 42',
+    '96a267e050b6d8a13439f8a9bb89722c:221111' => 'Nikon Capture NX, Quality 43',
+    '27c301566e155f700b01906a43473ffe:221111' => 'Nikon Capture NX, Quality 44',
+    'ceff136f6dd88242500bfd639cb0c003:221111' => 'Nikon Capture NX, Quality 45',
+    '939b804eefc95158a934bb48e3f3b545:221111' => 'Nikon Capture NX, Quality 46',
+    '06186292fe0ccaaeb5999319a366c4b4:221111' => 'Nikon Capture NX, Quality 47',
+    'e456c998dc126c1efad013eb7b0186c1:221111' => 'Nikon Capture NX, Quality 48',
+    'ef0cd1902fb1afe284468a67eaffd078:221111' => 'Nikon Capture NX, Quality 49',
+    'f4693035f8db19e0788f41255c3c052e:221111' => 'Nikon Capture NX, Quality 50',
+    '40c6f2886cdca8f19a654ce321ea993e:221111' => 'Nikon Capture NX, Quality 51',
+    'e9387b4065bba8570375d6535ab2124b:221111' => 'Nikon Capture NX, Quality 52',
+    'f3a55e422a4ab829b2c1f5a1784ce9f6:221111' => 'Nikon Capture NX, Quality 53',
+    '2fff3c6e48247992d1543d9e5c679759:221111' => 'Nikon Capture NX, Quality 54',
+    '5a1849b49122ff09949f1d355b4f9eaa:221111' => 'Nikon Capture NX, Quality 55',
+    'a582968bb1890620ffbae916ebafcb64:221111' => 'Nikon Capture NX, Quality 56',
+    '81597eb992e32e186d2b5565bbe4ae3a:221111' => 'Nikon Capture NX, Quality 57',
+    '7364416ce4f2a9282efdbe052574527b:221111' => 'Nikon Capture NX, Quality 58',
+    '5301c2bcae09fd4305e47ffc56b2c8a7:221111' => 'Nikon Capture NX, Quality 59',
+    '5a1849b49122ff09949f1d355b4f9eaa:211111' => 'Nikon Capture NX, Quality 60',
+    '9be2446f168941ff42d9fc7441f2429b:211111' => 'Nikon Capture NX, Quality 61',
+    'bbba80e58afae43278e287021d4f1499:211111' => 'Nikon Capture NX, Quality 62',
+    '2a9ae394dc32a418960522cbe9c6df24:211111' => 'Nikon Capture NX, Quality 63',
+    '67fbe0dce139b6db1813e30bbbceccf3:211111' => 'Nikon Capture NX, Quality 64',
+    '17bce376f588ebf2b3e9002a337c239d:211111' => 'Nikon Capture NX, Quality 65',
+    'cd2c6c01d8eb8d985086b54e2269278a:211111' => 'Nikon Capture NX, Quality 66',
+    '34b25782fc089616807bbbe7f7cd8413:211111' => 'Nikon Capture NX, Quality 67',
+    '37b8bbab382a228eabb0dc64c0edcb0f:211111' => 'Nikon Capture NX, Quality 68',
+    'b163f35baed567d70aa2536695558724:211111' => 'Nikon Capture NX, Quality 69',
+    '251eb2d7903f63b168348ec483ba499a:211111' => 'Nikon Capture NX, Quality 70',
+    '42e7cdf33b9067a7124dd27020704f9a:211111' => 'Nikon Capture NX, Quality 71',
+    '032678d9de74e5530896c28079f666af:211111' => 'Nikon Capture NX, Quality 72',
+    '30d7b6db02954dfc4ce47a089d0f40d9:211111' => 'Nikon Capture NX, Quality 73',
+    '5c1a40094128ac76eab0405dcb4ae3c7:211111' => 'Nikon Capture NX, Quality 74',
+    '2706b8b0cf6686148e285b6d3e44dd72:211111' => 'Nikon Capture NX, Quality 75',
+    '6ca4a27cb36f35ab84b0e2df06bb32f4:211111' => 'Nikon Capture NX, Quality 76',
+    '6f9cae52d3f47f514f7c927314455a5a:211111' => 'Nikon Capture NX, Quality 77',
+    'c0204862b8aafa2c286c7b58d755c31f:211111' => 'Nikon Capture NX, Quality 78',
+    'd8ef40736b072f09bead5f73f5ec1372:211111' => 'Nikon Capture NX, Quality 79',
+    '8c389c29eca238b3b331f65f7e124a27:111111' => 'Nikon Capture NX, Quality 80',
+    '6f9cae52d3f47f514f7c927314455a5a:111111' => 'Nikon Capture NX, Quality 81',
+    '8e1ceace8fafe31282393d8677e76994:111111' => 'Nikon Capture NX, Quality 82',
+    '60f75a915647ed50d1724179d50a35d2:111111' => 'Nikon Capture NX, Quality 83',
+    'df54eb20ec90f41f1e6c37e241ee381c:111111' => 'Nikon Capture NX, Quality 84',
+    '5522213c915e2af3ad01ee2ec27ee3ed:111111' => 'Nikon Capture NX, Quality 85',
+    '08c063f0997262d9977df4b44e682d82:111111' => 'Nikon Capture NX, Quality 86',
+    'd2e34c70872ac119dda6bdeeb36bf229:111111' => 'Nikon Capture NX, Quality 87',
+    'e5abf48ce0cc2b4a3db7eca3a1112b7a:111111' => 'Nikon Capture NX, Quality 88',
+    'b69dcb672088f296323d891219464ad8:111111' => 'Nikon Capture NX, Quality 89',
+    'b6d1c6efb27ea721577888b5f981ad7b:111111' => 'Nikon Capture NX, Quality 90',
+    'b023f424f81c8cbbab20119c06163dce:111111' => 'Nikon Capture NX, Quality 91',
+    '77f680490d08697cb0f11ff3fe76b7e8:111111' => 'Nikon Capture NX, Quality 92',
+    '1860106097672532e7ebc2026d7f9681:111111' => 'Nikon Capture NX, Quality 93',
+    '0c7d4861b3bee5d766a93f2d34027bfa:111111' => 'Nikon Capture NX, Quality 94',
+    '3adf9a0b85a4000243bbf833cd8e6966:111111' => 'Nikon Capture NX, Quality 95',
+    '9530dfffc5574606841a597212ec25b4:111111' => 'Nikon Capture NX, Quality 96',
+    'c7294290fe26155147072f9041705cfb:111111' => 'Nikon Capture NX, Quality 97',
+    'c24c44a4dadd77c15e0b4c741a2d4bd5:111111' => 'Nikon Capture NX, Quality 98',
+    '36016cd5527c505ef3bbba8b3e22f9db:111111' => 'Nikon Capture NX, Quality 99',
+    'c9309ab058680151be5f97e6c54dc687:111111' => 'Nikon Capture NX, Quality 100',
+
+    # Tested with ACDsee PhotoEditor 4.0.208c-de (Win)
+    '2ab2f6a116ca6fc0bbf188b19b9de967' => 'ACD Systems Digital Imaging, Quality 0 or 1',
+    'f4f9d5c07c78e8700a6f3def0782a18e' => 'ACD Systems Digital Imaging, Quality 2',
+    '66fc410ab8f71a7fdef86fd70b742dc1' => 'ACD Systems Digital Imaging, Quality 3',
+    '8e763b5b9255df1f4cb7b9732e99c210' => 'ACD Systems Digital Imaging, Quality 4',
+    'fd3eed19f6667ab0bedfa3263390ce25' => 'ACD Systems Digital Imaging, Quality 5 or 6',
+    'dc0dc92085037072e27247f64af0f22d' => 'ACD Systems Digital Imaging, Quality 7',
+    '233ed690eb7e9008c20ed16e79aa3eb5' => 'ACD Systems Digital Imaging, Quality 8',
+    '684649f6c1590f5a912a827a6d8bfc6b' => 'ACD Systems Digital Imaging, Quality 9',
+    'ed6aec096e8776b483b2c2b3d7e15d76' => 'ACD Systems Digital Imaging, Quality 10 or 11',
+    '9cd85933ddb1101d9b859a19e9a30334' => 'ACD Systems Digital Imaging, Quality 12',
+    '222a8769205a592ec834b6f5fc654a21' => 'ACD Systems Digital Imaging, Quality 13',
+    '29f957e2a0af0f44d271c3c4e27eec4b' => 'ACD Systems Digital Imaging, Quality 14',
+    'c46c764191f9c3db2bfe8d134512bcd8' => 'ACD Systems Digital Imaging, Quality 15 or 16',
+    '56caa684ce7eb0b1cf662e1c88ed1614' => 'ACD Systems Digital Imaging, Quality 17',
+    'cedc5208c6e1cbffd8be0e47bfd76698' => 'ACD Systems Digital Imaging, Quality 18',
+    'dec0717305bae8309a934e1d6a251d88' => 'ACD Systems Digital Imaging, Quality 19',
+    '8c85e0e8f41257e2cd739a5b158ec218' => 'ACD Systems Digital Imaging, Quality 20 or 21',
+    '6ae7ab4e6d5e0e67006cca59c70f843c' => 'ACD Systems Digital Imaging, Quality 22',
+    '840be626ed18db6cdef3c5c357e24d34' => 'ACD Systems Digital Imaging, Quality 23',
+    'd48c2b9e514e25fcc4b3f2408d168d72' => 'ACD Systems Digital Imaging, Quality 24',
+    'b9eb63b89c80c71f4eac8c6e27d272f1' => 'ACD Systems Digital Imaging, Quality 25 or 26',
+    'bcd4d36a9db91a51d1a571f71f8230d4' => 'ACD Systems Digital Imaging, Quality 27',
+    'ac2f66ab2559019fcf021b9a32b049ab' => 'ACD Systems Digital Imaging, Quality 28',
+    '4208fca702ec702bd5d41c8231883057' => 'ACD Systems Digital Imaging, Quality 29',
+    'fa620c67ab09a4c0d1c5b8e65ade361e' => 'ACD Systems Digital Imaging, Quality 30 or 31',
+    '679dea81c8d4563e07efac4fab6b89ca' => 'ACD Systems Digital Imaging, Quality 32',
+    '43ceb0c1a5d94d55ee20dc3a168498b2' => 'ACD Systems Digital Imaging, Quality 33',
+    'a9cc8a19ae25bc024c3d92d84c13c7a5' => 'ACD Systems Digital Imaging, Quality 34',
+    'e3e7280c8a9e82d31e22d24d5b733580' => 'ACD Systems Digital Imaging, Quality 35 or 36',
+    'a06d250213e349005897bd6fa5bebca8' => 'ACD Systems Digital Imaging, Quality 37',
+    '40d08b823fa60b838dd9998d1e2b550a' => 'ACD Systems Digital Imaging, Quality 38',
+    '4998abefc838e35cf0180395309e2e33' => 'ACD Systems Digital Imaging, Quality 39',
+    '280205c47c8d3706c2f36b1986e9b149' => 'ACD Systems Digital Imaging, Quality 40 or 41',
+    '8534b67f8115ddc0296623a1ed3fc8ec' => 'ACD Systems Digital Imaging, Quality 42',
+    '292b83b37765408b65f496cddd3f96ea' => 'ACD Systems Digital Imaging, Quality 43',
+    'cae0c8eb9a11a1f6eb7eca9651d8dbc0' => 'ACD Systems Digital Imaging, Quality 44',
+    '078db0d0bffafa44def2e8b85eec26f6' => 'ACD Systems Digital Imaging, Quality 45 or 46',
+    '6a26a11cc28df00e01d5979e2e0fb4f7' => 'ACD Systems Digital Imaging, Quality 47',
+    'b41b3d226ba21244b8070ba719ec721a' => 'ACD Systems Digital Imaging, Quality 48',
+    '9a8a54328e297faa0a546c46145c9aa8' => 'ACD Systems Digital Imaging, Quality 49',
+    '256e617be51dade18503fcbbe87cd4a6' => 'ACD Systems Digital Imaging, Quality 50 or 51',
+    '064f160a8504465551738c9071f3850f' => 'ACD Systems Digital Imaging, Quality 52',
+    '5aef4c0bc6a5c8f1baded29946a56310' => 'ACD Systems Digital Imaging, Quality 53',
+    'c20f4841a1ff7e393af8f6ea4124403c' => 'ACD Systems Digital Imaging, Quality 54',
+    '14afe9b58e0eacef42db61e1d7fdd09c' => 'ACD Systems Digital Imaging, Quality 55 or 56',
+    '147598404233439485574200e253f88e' => 'ACD Systems Digital Imaging, Quality 57',
+    '17479c1e73d2c062872c871db80d949b' => 'ACD Systems Digital Imaging, Quality 58',
+    'd237b1202f88ba8183bc1cb69dd4be66' => 'ACD Systems Digital Imaging, Quality 59',
+    'fc923f2d38e0e549134e1ec86f58149a' => 'ACD Systems Digital Imaging, Quality 60 or 61',
+    '93b4929d4a3b955f4996ab7e3b6fbe53' => 'ACD Systems Digital Imaging, Quality 62',
+    '054f418c24a6a733186a27aa739dc93a' => 'ACD Systems Digital Imaging, Quality 63',
+    '0df2be705ae86e5de1e508db95efb182' => 'ACD Systems Digital Imaging, Quality 64',
+    'c1978a445de1173b5039b0cf8d8a91fe' => 'ACD Systems Digital Imaging, Quality 65 or 66',
+    '3d8e25b74d0d9be662f26ec5fed6fe94' => 'ACD Systems Digital Imaging, Quality 67',
+    '8887b718c97e0d80ed8d9a198387e2eb' => 'ACD Systems Digital Imaging, Quality 68',
+    '8cdb9100cfbb246d440d469e72ce37a6' => 'ACD Systems Digital Imaging, Quality 69',
+    '379efafa6e71a90ccfcb57073d0bc5c8' => 'ACD Systems Digital Imaging, Quality 70 or 71',
+    'e1e122ebb2733a5ccdb5ff1cdce86d4d' => 'ACD Systems Digital Imaging, Quality 72',
+    '41dd47887a2b87e22ad3bbacc022374e' => 'ACD Systems Digital Imaging, Quality 73',
+    'a0a30c816d5d47a91c66e5645eb5fdb8' => 'ACD Systems Digital Imaging, Quality 74',
+    '731f7ffedba80407d039c1db5a785f95' => 'ACD Systems Digital Imaging, Quality 75 or 76',
+    '7cfd092a41a0e1c029e82467cb4c034f' => 'ACD Systems Digital Imaging, Quality 77',
+    'f1b005980104aac41b49973beed9c8c2' => 'ACD Systems Digital Imaging, Quality 78',
+    'ba12dbfbd652c9cde69822996bdb2139' => 'ACD Systems Digital Imaging, Quality 79',
+    'd3784280d08a8df51e607bde8c8b5ead' => 'ACD Systems Digital Imaging, Quality 80 or 81',
+    '7ed560efea0b44168d910a73fab9204c' => 'ACD Systems Digital Imaging, Quality 82',
+    'deaa8bbd7c5414b93d8029aa14a76d3a' => 'ACD Systems Digital Imaging, Quality 83',
+    '9ae3a57ce98290176c4700baaff5661f' => 'ACD Systems Digital Imaging, Quality 84',
+    'cb99b9bd30ae36929755fee9208ab36b' => 'ACD Systems Digital Imaging, Quality 85 or 86',
+    '75ff62bbf17aa1762dd15677e961ce67' => 'ACD Systems Digital Imaging, Quality 87',
+    'd4f1922c71a6c96a530a9a8268fbc63b' => 'ACD Systems Digital Imaging, Quality 88',
+    'ec994ef421efd6bc78671858b9f942ad' => 'ACD Systems Digital Imaging, Quality 89',
+    '5ca52e1ffe2c84660d7377c33c88ad53' => 'ACD Systems Digital Imaging, Quality 90 or 91',
+    '5522213c915e2af3ad01ee2ec27ee3ed' => 'ACD Systems Digital Imaging, Quality 92',
+    '21aa1a0036251eecfffd24e37d7ce3dd' => 'ACD Systems Digital Imaging, Quality 93',
+    '3233b63fc39fbbaa9af364e8a33862ff' => 'ACD Systems Digital Imaging, Quality 94',
+    '1860106097672532e7ebc2026d7f9681' => 'ACD Systems Digital Imaging, Quality 95 or 96',
+    '0c7d4861b3bee5d766a93f2d34027bfa' => 'ACD Systems Digital Imaging, Quality 97',
+    'c9309ab058680151be5f97e6c54dc687' => 'ACD Systems Digital Imaging, Quality 98',
+    'ffe6bb565b2c9008ab917c57ba94cd67' => 'ACD Systems Digital Imaging, Quality 99',
+    'd6390cc36d2f03c1d2dd13d6910ca46b' => 'ACD Systems Digital Imaging, Quality 100; Pentax K20D/OptioE60 Premium',
+
+    # StereoPhoto Maker Version 3.25 - Option "No compression ghosting" activated
+    '185893c53196f6156d458a84e1135c43:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 1',
+    'b41ccbe66e41a05de5e68832c07969a7:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 2',
+    'efa024d741ecc5204e7edd4f590a7a25:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 3',
+    '3396344724a1868ada2330ebaeb9448e:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 4',
+    '14276fffb98deb42b7dbce30abb8425f:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 5',
+    'a99e2826c10d0922ce8942c5437f53a6:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 6',
+    '0d3de456aa5cbb8a2578208250aa9b88:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 7',
+    'fa987940fdedbe883cc0e9fcc907f89e:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 8',
+    '1c9bb67190ee64e82d3c67f7943bf4a4:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 9',
+    '57d20578d190b04c7667b10d3df241bb:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 10',
+    '619fd49197f0403ce13d86cffec46419:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 11',
+    '327f47dd8f999b2bbb3bb25c43cf5be5:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 12',
+    'e4e5bc705c40cfaffff6565f16fe98a9:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 13',
+    '6c64fa9ad302624a826f04ecc80459be:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 14',
+    '039a3f0e101f1bcdb6bb81478cf7ae6b:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 15',
+    'c23b08c94d7537c9447691d54ae1080c:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 16',
+    '200107bc0174104bbf1d4653c4b05058:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 17',
+    '72abfdc6e65b32ded2cd7ac77a04f447:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 18',
+    '1799a236c36da0b30729d9005ca7c7f9:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 19',
+    'c33a667bff7f590655d196010c5e39f3:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 20',
+    'b1dc98f6a2f8828f8432872da43e7d94:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 21',
+    '07318a0acfebe9086f0e04a4c4f5398a:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 22',
+    'a295b7163305f327a5a45ae177a0a19c:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 23',
+    'c741c1b134cf81ab69acc81f15a67137:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 24',
+    'a68893776502a591548c7b5bece13e1b:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 25',
+    '111848d9e41f6f408ef70841f90c0519:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 26',
+    '886374ceebcfd4dfed200b0b34b4baca:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 27',
+    '666dd95fd0e20f5c20bc44d78d528869:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 28',
+    '1aa58cb85dda84de2ddf436667124dcd:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 29',
+    '9d321ab2bdda6f3cb76d2d88838aa8c3:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 30',
+    '6ad87d648101c268f83fa379d4c773f2:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 31',
+    'cdf8e921300f27a4af7661a2de16e91a:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 32',
+    '3f48672e37b6dd2e571b222e4b7ff97d:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 33',
+    'a53a7d4cc86d01f4c1b867270c9c078f:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 34',
+    '09ec03f5096df106c692123f3fd34296:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 35',
+    'a946498fd1902c9de87a1f5182966742:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 36',
+    '5d650a1d38108fd79d4f336ba8e254c2:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 37',
+    '81d620f1b470fd535b26544b4ea20643:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 38',
+    '892788bdf8cbef5c6fbd7019a079bf8e:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 39',
+    'cf3929fd4c1e5c28b7f137f982178ad1:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 40',
+    '31f288945896ed839f1d936bff06fb03:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 41',
+    'e0c38f0c5e6562445d4e92bae51713be:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 42',
+    '18fa29d1164984883a6af76377b60d5a:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 43',
+    'eff737b226fbce48c42625c5bf9dabb6:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 44',
+    'b900f91ee8697255d5daebce858caaeb:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 45',
+    'ab2f8513823067af242f7e3c04a88a9c:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 46',
+    '60b682c4d412f5255efbaa32787c46ca:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 47',
+    'ea50813e06203c2ad1165252bcb99a1d:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 48',
+    'f6308a717437d3653b0751ebf511db0f:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 49',
+    '7c8242581553e818ef243fc680879a19:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 50',
+    'fc41ab8251718977bc6676f502f457e0:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 51',
+    '606c4c78c0226646bf4d3c5a5898fb17:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 52',
+    '0e6c6a5440d33d25f1c25836a45cfa69:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 53',
+    '7464b2361e5b5f5a9ba74a87475dda91:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 54',
+    'aeaa2ca48eabb3088ebb713b3c4e1a67:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 55',
+    '3f36450b0ba074578391e77f7340cef0:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 56',
+    'be232444027e83db6f8d8b79d078442e:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 57',
+    '712c145d6472a2b315b2ecfb916d1590:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 58',
+    'ae3dd4568cc71c47d068cf831c66b59d:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 59',
+    'b290e52c21a435fede4586636ef5e287:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 60',
+    'a09ca4c4391e0221396a08f229a65f9d:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 61',
+    '0818578fc5fc571b4f8d5ffefc9dc0d8:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 62',
+    '7c685e2916555eda34cb37a1e71adc6a:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 63',
+    '69c6b9440342adfc0db89a6c91aba332:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 64',
+    'd5d484b68e25b44288e67e699829695c:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 65',
+    'de8310d09116a7a62965f3e0e43ef525:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 66',
+    'e4735f63e88baf04599afc034e690845:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 67',
+    'b4ef810b14dee9c6d6d8cace98f799a6:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 68',
+    '52886ef80147c9a136e20b2bc3b76f52:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 69',
+    '9c62dbc848be82ef91219ba9843998be:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 70',
+    'bfe8c1c73eea84b85673487a82f67627:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 71',
+    'ea445840d29c51009a2a8cd49b96ccee:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 72',
+    '71c1a56890fff9b0a095fa5a1c96132b:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 73',
+    'f080b02331ac8adf03de2281042d2b49:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 74',
+    'd0eaa368737f17f6037757d393a22599:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 75',
+    '303663905d055b77bb547fe0b0beb9c5:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 76',
+    '5cdf1d5bbe19375ad5c7237273dddede:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 77',
+    'd64e7ff8292fd77131932864d3c9ce7c:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 78',
+    '12b4cc13891c5aef3dadb3405b6fa65d:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 79',
+    'b008cd63591f8fd366f77d2b224b9c9c:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 80',
+    '49b6e472c7d5ecead593c6009768e765:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 81',
+    'bce6fa61623ad4f65ff3fec1528cb026:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 82',
+    'c2b037bf9f5e5baba804d7bbbb2dc73b:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 83',
+    '7fe7b339c6ffc62b984eeab4b0df9168:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 84',
+    '274bbeb0ac3939f90c578ebb1f5a9eef:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 85',
+    '0a0268c655d616b0e4af2851533aa3af:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 86',
+    '52318e260c0d6b3dbee85c87f9b94e63:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 87',
+    'b64cc19a0f81a506ed5bcfb9c131c8fe:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 88',
+    'd8c54333eb475b8db9f32f11fe96337e:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 89',
+    '12fe6b9bfd20f4d7f0ac2a221c566c45:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 90',
+    '12aefbf7689633c83da714c9f0e90e05:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 91',
+    'a3a96add050fc51a2b3ce59a9a491034:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 92',
+    '7b0242bd9aaeab4962f5d5b39b9a4027:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 93',
+    '12fc29c1d8940c93a47ee9d927a17561:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 94',
+    'e1fedef5184beeb7b0f5c055c7ae1d31:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 95',
+    'ae9202355f603776794d3e62c43578d6:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 96',
+    '36da00bae6cd81d1f97e32748c07e33f:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 97',
+
+    # Tested with FujiFilm FinePixViewer Ver 5.4.11G (Win)
+    '3a8a34631e388e39d13616d003f05957:211111' => 'FinePixViewer, Basic',
+    'b6a2598792fd87b7eb0c094cbd52862f:211111' => 'FinePixViewer, Fine',
+    '4ee61c39b97558a273f310e085d0bdd2:211111' => 'FinePixViewer, Normal',
+
+    # Tested with Canon Digital Photo Professional Version 3.4.1.1 (Win)
+    '252482232ff1c8cf77db4f0c6402f858:211111' => 'Canon Digital Photo Professional, Quality 1',
+    'ec6c55677b94970bc09f70265f1d5b55:211111' => 'Canon Digital Photo Professional, Quality 2',
+    'a1085c167f1cd610258fe38c8a84a8b9:211111' => 'Canon Digital Photo Professional, Quality 3',
+    '8ab1119f4ed4941736cb8ec1796f5674:211111' => 'Canon Digital Photo Professional, Quality 4',
+    'e66c03f97b19213f385136f014c78ac1:211111' => 'Canon Digital Photo Professional, Quality 5',
+    'a2f4b6ac52f87791380bdfe38ae333e1:211111' => 'Canon Digital Photo Professional, Quality 6',
+    'fe85b802c5779dcf45ea4bb7749ee886:211111' => 'Canon Digital Photo Professional, Quality 7',
+    '35686967efa5fb333fb8f4844efc33a3:211111' => 'Canon Digital Photo Professional, Quality 8',
+    'a5894172d7ec5f0c1550934c9e9385c9:211111' => 'Canon Digital Photo Professional, Quality 9',
+    'd6390cc36d2f03c1d2dd13d6910ca46b:211111' => 'Canon Digital Photo Professional, Quality 10',
+
+    # Tested with Canon ZoomBrowser EX 6.1.1.21 (Win)
+    'e66c03f97b19213f385136f014c78ac1:211111' => 'Canon ZoomBrowser, Low',
+    'bf72e4d4aacbdaeb86fd3f67c8df2667:211111' => 'Canon ZoomBrowser, Medium',
+    'd6390cc36d2f03c1d2dd13d6910ca46b:211111' => 'Canon ZoomBrowser, Highest',
+    'aeb34eb083acc888770d65e691497bcf:211111' => 'Canon ZoomBrowser, High',
+
+    # Tested with PENTAX PHOTO Laboratory 3.51 (Win)
+    '76d958276bf2cac3c36b7d9a677094a7:211111' => 'PENTAX PHOTO Laboratory, Highest compression',
+    'bf72e4d4aacbdaeb86fd3f67c8df2667:211111' => 'PENTAX PHOTO Laboratory, High compression',
+    'fa8720d025f2a164542b6a8e31112991:211111' => 'PENTAX PHOTO Laboratory, Medium quality',
+    'f3235a7d187d083b7b7ead949653f730:211111' => 'PENTAX PHOTO Laboratory, High quality',
+    'd6390cc36d2f03c1d2dd13d6910ca46b:211111' => 'PENTAX PHOTO Laboratory, Highest quality',
+
+    # Tested with Sony Image Data Converter SR Version 2.0.00.08150 (Win)
+    'd6390cc36d2f03c1d2dd13d6910ca46b:211111' => 'Sony Image Data Suite, Quality 1 (high quality)',
+    'aeb34eb083acc888770d65e691497bcf:211111' => 'Sony Image Data Suite, Quality 2',
+    '524742ca0cff64ecc0c7d7413e7d4b8d:211111' => 'Sony Image Data Suite, Quality 3',
+    'c44701e8185306f5e6d09be16a2b0fbd:211111' => 'Sony Image Data Suite, Quality 4 (high compression)',
+
+    # Devices
+
+    # Canon
+    '0147c5088beb16642f9754f8671f13b3:211111' => 'Canon PowerShot, Fine',
+    '586b40c7d4b95e11309636703e81fbe9:211111' => 'Canon EOS 20D, Fine',
+    '6640ae3bb6f646013769b182c74931b5:211111' => 'Canon PowerShot, Normal',
+    '83d6d7dd7ace56feeeb65b88accae1bc:211111' => 'Canon PowerShot, Normal Small',
+    'b8548a302585d78a0c269b54bff86541:211111' => 'Canon PowerShot, Fine Small',
+    '9d125046484461bbc155d8eff6d4e8f0:211111' => 'Canon PowerShot, Superfine (A430/A460)',
+    '0e618a0e79b4d540da1f6e07fcdce354:211111' => 'Canon PowerShot, Superfine Small',
+    'd255f70a910a2d0039f4e792d2c01210:211111' => 'Canon PowerShot, Superfine Medium2',
+    '8bc267b04a54c02fdee1f4fdf0bcce83:211111' => 'Canon EOS 1DmkIII/5DmkII/40D/1000D, Fine',
+    '17cb779485969589a5c7eb07a5d53247:211111' => 'Canon EOS 1DmkIII, Fine (pre-production)',
+    'ee1c033afaf4cd5263ff2b1c1ff8966c:211111' => 'Canon PowerShot, Superfine',
+    'a92912eb3c81e5c873d49433264af842:211111' => 'Canon EOS 30D/40D/50D/300D, Normal',
+    '0cec88a0cd8fe35720e78cdcdbdadef6:121111' => 'Canon EOS 1DmkII, Fine (A)',
+    '72cdcc91e3ddc2c3d17c20173b75c5ef:211111' => 'Canon EOS 1DmkII, Fine (B)',
+    '483b5288e4256aa8ff96d6ccb96eba43:211111' => 'Canon EOS 1DmkII, Fine (C)',
+    'ea2f997a0261bab501bf122b04cbc859:211111' => 'Canon EOS 1DSmkII, Fine',
+    '98af13526b7e4bbf73a9fb11a8fa789d:121111' => 'Canon EOS 1DSmkII, Fine (vertical)',
+    '9e6abfb26d3b95b8cd2f710e78def947:121111' => 'Canon EOS 300D, Fine (vertical)',
+    '4d6b36e81fe30c67dd53edb4d7c05422:121111' => 'Canon EOS 40D, Fine (vertical)',
+    '92c1557deaa14f1cdaf92cf0531487f1:121111' => 'Canon EOS 1D/1DS, Fine',
+    'db8d4df12405d0d69eb25f06a963ac5b:211111' => 'Canon DV',
+    'eaead98bbdfde35210f48286662e8ad2:211111' => 'Canon DV Hi-Res',
+    '74f0ef9476707be45f06951ca9a809ba:211111' => 'Canon DV/Optura/Elura, Superfine',
+
+    # HTC
+    'bf72e4d4aacbdaeb86fd3f67c8df2667:221111' => 'HTC Touch Diamond P3700, Quality Unknown',
+
+    # Konica/Minolta
+    'b5c213a3785c4c62b25d8f8c30758593:211111' => 'Konica/Minolta DYNAX 7D, Fine',
+
+    # Nikon
+    '118a60a90c56bcb363fdd93b911a3371:211111' => 'Nikon D50 / D80, Fine',
+    '457b05fd0787a8e29bd43cd65911d6ca:211111' => 'Nikon D80, Basic',
+    '5701582a0da2e9e8dcd923a5cf877494:211111' => 'Nikon D50, Fine',
+    '662bd7fb9dff6426e310f9261a3703d0:211111' => 'Nikon D50, Fine',
+    'e06eb7848ec8766239ff014aa8b62e49:211111' => 'Nikon D80, Normal',
+    '9e201a496a3700a77d9102c0dd0f8dbf:211111' => 'Nikon D300, Basic',
+
+    # Panasonic
+    '07d3cd227395b060a132411cbfc22593:211111' => 'Panasonic DMC-FZ50, High (A)',
+    '118a60a90c56bcb363fdd93b911a3371:211111' => 'Panasonic DMC-FZ50/TZ3, High (A)',
+    '1b8d04b1d56a4c0c811a0d3a68e86d06:211111' => 'Panasonic DMC-FZ50, High (B)',
+    '1e619cbdee1f8ff196d34dad9140876f:211111' => 'Panasonic DMC-FZ50, High (C)',
+    '493abc7f4b392a0341bfcac091edb8f8:211111' => 'Panasonic DMC-FZ30, High (B)',
+    '4aa883c43840de7f0d090284120c69bc:211111' => 'Panasonic DMC-FZ50, High (D)',
+    '7eafb9874384d391836e64911e912295:211111' => 'Panasonic DMC-FZ50, High (E)',
+    '82b56237e4eccde035edff4a5abdba44:211111' => 'Panasonic DMC-FZ50, High (F)',
+    '8335023e5a1ee8df80d52327b0556c44:211111' => 'Panasonic DMC-FZ30, High (C)',
+    '8c105b3669931607853fa5ba4fffb839:211111' => 'Panasonic DMC-FZ30, High (D)',
+    '8ecfb959bc76e5d6703f3f3bba2c5529:211111' => 'Panasonic DMC-FZ30, High (E)',
+    '96eda111b2153648b3f27d6c1a9ec48f:211111' => 'Panasonic DMC-FZ50/TZ3, High (B)',
+    '99f76923cfbd774febea883b603b8103:211111' => 'Panasonic DMC-FZ30, High (F)',
+    '9b3475b865b9d31e433538460b75a588:211111' => 'Panasonic DMC-FZ10, High',
+    '9eb7cdfd07099c1bb8e2c6c04b20b8ba:211111' => 'Panasonic DMC-FZ30, High (G)',
+    '9fc030294fa5c4044dbb0cb461b0cf93:211111' => 'Panasonic DMC-TZ5, High (A)',
+    'a8779af4cb8afa2def1d346a9b16e81a:211111' => 'Panasonic DMC-TZ5, High (B)',
+    'bebd334aca511e2a2b6c60f43f9e6cf1:211111' => 'Panasonic DMC-FZ30, High (H)',
+    'c871ce0851d4647f226b2dcfd49fe9a9:211111' => 'Panasonic DMC-L1, Very High',
+    'eb625c64e32314f51dc4286564a71f7b:211111' => 'Panasonic DMC-FZ10, High',
+
+    # Pentax
+    # (K10D uses same DQT tables for different qualities)
+    '1027a4af6a2a07e58bbd6df5b197d44e:211111' => 'Pentax K10D (A)',
+    '17a77c2574ff5b72b3284f57977187f3:211111' => 'Pentax K10D (B)',
+    '1aee684c7eb75320d988f6296c4c16ea:211111' => 'Pentax K10D (C)',
+    '32386501afff88b45432b23fe41593e8:211111' => 'Pentax K10D (D)',
+    '35ad02c3d8237a074b67423c39d3d61c:211111' => 'Pentax K10D (E)',
+    '39d929c095f37a90e7d083db40e8642d:211111' => 'Pentax K10D (F)',
+    '4127433151f74654762b1ef3293781f4:211111' => 'Pentax K10D (G)',
+    '599a7794c32b9d60e80426909ed40a09:211111' => 'Pentax K10D (H)',
+    '641812174c82d5b62ec86c33bd852204:211111' => 'Pentax K10D (I)',
+    '76d958276bf2cac3c36b7d9a677094a7:211111' => 'Pentax K10D (J)',
+    '79b07131be4827795315bf42c65212f2:211111' => 'Pentax K10D (K)',
+    '836448ef538366adb50202927b53808a:211111' => 'Pentax K10D (L)',
+    '8f70e4a31ad4584043ddc655eca17e89:211111' => 'Pentax K10D (M)',
+    '90d3c964eaf6e4bd12cf5ca791a7d753:211111' => 'Pentax K10D (N)',
+    '994a9f2060976d95719ca7064be3a99c:211111' => 'Pentax K10D (0)',
+    '994a9f2060976d95719ca7064be3a99c:211111' => 'Pentax K10D/K20D (P)',
+    '9971f02a466c47d640e8f20a2e4b55b9:211111' => 'Pentax K10D (Q)',
+    'a16626c285e5a2290d331f99f4eec774:211111' => 'Pentax K10D (R)',
+    'a64569d6387a118992e44e41aaeac27e:211111' => 'Pentax K10D (S)',
+    'a8055a53fda7f9a0e387026c81960aa4:211111' => 'Pentax K10D (T)',
+    'ab50a9f53a44ffecc54efe1cb7c6620a:211111' => 'Pentax K10D (U)',
+    'aeb34eb083acc888770d65e691497bcf:211111' => 'Pentax K10D (V)',
+    'af2a112c30fa29213a402dbd3c2b2d3a:211111' => 'Pentax K10D (W)',
+    'bb4475a9e14464eb4682fd81cceb1f91:211111' => 'Pentax K10D (X)',
+    'bf72e4d4aacbdaeb86fd3f67c8df2667:211111' => 'Pentax K10D (Y)',
+    '0a953ba56b59fa0bbbdac0162ea1c96b:211111' => 'Pentax K10D (Z)',
+    '387354b46b9726f33da5c0c1a0c383a0:211111' => 'Pentax K10D/K20D (AA)',
+    '4e7f4e5cd15f4fc089ab25890619dc60:211111' => 'Pentax K10D (AB)',
+    '6518270228fd20730740a08cc8a171f6:211111' => 'Pentax K10D (AC)',
+    '72bce7df55635509eb6468fc6406941d:211111' => 'Pentax K10D (AD)',
+    '7cafc25f204fc4ddf39d86e2f0f07b62:211111' => 'Pentax K10D (AE)',
+    '811e5b0229f0e8baf4b40cd2d8777550:211111' => 'Pentax K10D (AF)',
+    '9282a1cec6bbd1232b3673091164d43d:211111' => 'Pentax K10D (AG)',
+    'c59a4cf0beedbfd1b102dc3d3c8e73ac:211111' => 'Pentax K10D (AH)',
+    'd97b27b45fdbe82a79364e0939adbf90:121111' => 'Pentax K10D (AI)',
+    'db87a4c5c1d4e03dc6645bcf0535a930:211111' => 'Pentax K10D (AJ)',
+    'f9a93cb70da7bbe87e35cd9980a5fd47:211111' => 'Pentax K10D (AK)',
+    'ff6a158f803e42bfbf9f702c016b84b3:211111' => 'Pentax K10D (AL)',
+    'ff6d4a4a60a1c5e032e7fb7d9c91f817:211111' => 'Pentax K10D (AM)',
+    'dca5476d81d0ceca97f480fecd09b23c:211111' => 'Pentax K10D (AN)',
+    'efbe7634221900639b3c072395c61bef:211111' => 'Pentax K10D (AO)',
+    'f4dba22dd251350a21f8122f2777e7b0:211111' => 'Pentax K10D (AP)',
+    'f90135fcff0e1720dda86e9ad718c0c0:211111' => 'Pentax K10D (AQ)',
+    'fa3d7753be7b329ab9961657cbc65386:211111' => 'Pentax K10D (AR)',
+    'fa8720d025f2a164542b6a8e31112991:211111' => 'Pentax K10D (AS)',
+    '2941d12ef34511d96b659ba30d682cd1:211111' => 'Pentax K10D (AT)',
+    '2aa82b6717f1cdfe6b6d60a4486b5671:211111' => 'Pentax K10D (AU)',
+    '2aa82b6717f1cdfe6b6d60a4486b5671:211111' => 'Pentax K10D (AV)',
+    '3527616df6f26a3ab36b80a8d885fc07:211111' => 'Pentax K10D (AW)',
+    '3527616df6f26a3ab36b80a8d885fc07:211111' => 'Pentax K10D (AX)',
+    '3527616df6f26a3ab36b80a8d885fc07:211111' => 'Pentax K10D (AY)',
+    '5ea9e766888399a41f3f1a3c5c15cd90:211111' => 'Pentax K10D (AZ)',
+    'f83d978290d0699054eabb0a7811c7a4:211111' => 'Pentax K10D (BA)',
+    'f83d978290d0699054eabb0a7811c7a4:211111' => 'Pentax K10D (BB)',
+    'fa8720d025f2a164542b6a8e31112991:211111' => 'Pentax K10D/K100D',
+    '586b40c7d4b95e11309636703e81fbe9:211111' => 'Pentax K20D/K200D/Optio 230, Best; Canon EOS 10D/300D/350D, Fine',
+    'b73481179da895f3b9ecea1737054a9c:211111' => 'Pentax K20D, Best (B)',
+    'b8fce00f93108e7db57a012c51fad341:211111' => 'Pentax K20D, Best (C)',
+    '5ee766b90badc8fed5a5386e78a80783:211111' => 'Pentax *istDS, Good (edit in camera)',
+    'd528fac9b63536ff52041745945dcb09:211111' => 'Pentax *istDS, Better (edit in camera)',
+    'd6390cc36d2f03c1d2dd13d6910ca46b:211111' => 'Pentax *istDS, Best (edit in camera)',
+    'dc149d41f08d16cb9d52a5bdd487a67e:121111' => 'Pentax *istD/K100Dsuper/Optio300GS, Best',
+    'e10030f09a14acdd647eff13c0bf333a:211111' => 'Pentax *istD/DS/DS2/K100D/Optio330GS/33L, Best',
+    'ef0cd1902fb1afe284468a67eaffd078:211111' => 'Pentax *istDS/K100D/K100Dsuper, Good',
+    'f1262dfcada6e6c2cd4b9fa7e881233b:211111' => 'Pentax *istDL/DS, Better',
+    'f3235a7d187d083b7b7ead949653f730:211111' => 'Pentax K20D/K200D, Best (D)',
+    '6686cddc46088f0987e7476861fbfb47:211111' => 'Pentax K2000, Best (A)',
+    '5910b8431fdd8ab93ce258f366c4b867:211111' => 'Pentax K2000, Best (B)',
+    'c8bfcc60aeec937300405f59373be4ef:211111' => 'Pentax K2000, Best (C)',
+    '689a0e3511f2aea75637f46e6af9fd9f:211111' => 'Pentax Optio A40, Best (edit in camera)',
+    '8d14598ae9cc1b7f5357424a19d05a71:211111' => 'Pentax Optio A30/A40, Good',
+    'a4cb8a3a000484b37c4373cde1170091:211111' => 'Pentax Optio A30/A40/S10/S12, Best',
+    '0ac5cb651c496369d0e924ae070b7c53:211111' => 'Pentax Optio A40, Better (edit in camera)',
+    '1068be028c278941bd8abf3b0021655e:211111' => 'Pentax Optio A40, Good (edit in camera)',
+    '336eeeb78e386bf66fe6325b4a0fcfa6:211111' => 'Pentax Optio A40, Better',
+    'ae2efaf1a96a4fdcfa9003b9aa963ae4:221111' => 'Pentax Optio 330, Best (vertical)',
+    '3803d7f6b7aed64c658c21dbb2bc0797:221111' => 'Pentax Optio 330, Best',
+    '353bf09900feb764885329e7bebfd95e:211111' => 'Pentax Optio 330GS, Good',
+    '6c2bc41a4b6ad1e20655ffcc0dfd2c41:221111' => 'Pentax Optio 330RS, Fine',
+    'e9206045838e9f5f9bd207744254e96d:221111' => 'Pentax Optio 430, Best',
+    '759fb7011e13fa5f975bb668f5b94d8b:211111' => 'Pentax Optio 550/750Z/M60/X, Best',
+    '637103ef9d8e84f8345f8218f158fc3c:211111' => 'Pentax Optio 550/M10/T30/W30, Best',
+    '23f2a5970523c5f7fd2ab7fa3b09dff9:211111' => 'Pentax Optio 550/555/M20/M30/W10/W20, Best',
+    '8d2f02a07bad6b5cec48466036fef319:121111' => 'Pentax Optio 550, Better',
+    '27297008a89ee49804f0859ea6435878:211111' => 'Pentax Optio MX, Best',
+    '6cfe3833aadd87487afc11129d8cb2aa:221111' => 'Pentax Optio S, Better',
+    'fcef35c97674aeb26c67e539b726057f:221111' => 'Pentax Optio S, Best (A)',
+    '13b2644cdad6f75767667e8ea5c218a3:221111' => 'Pentax Optio S, Best (B)',
+    '310b70bc4fac884f64a07040a4b87468:221111' => 'Pentax Optio S, Best (C)',
+    'aa05fbe795d86a1063c55865e8613536:221111' => 'Pentax Optio S, Best (D)',
+    'd57ac6956e4fe86c386f0eef00a5e021:221111' => 'Pentax Optio S, Best (E)',
+    '28782f5ee24fe983fe90b9438b39ae2e:221111' => 'Pentax Optio S4, Best',
+    '804bd63907214e005f01fb65a2bb00e6:221111' => 'Pentax Optio S4i, Best',
+    '84285f5b3248884488e5142b8c7210e2:211111' => 'Pentax Optio S6, Good',
+    'e97694f0093de13987a335e131b30eb0:221111' => 'Pentax Optio SVi, Best',
+    '037d043c8a8d5332c28d59f71a0dcfd2:211111' => 'Pentax Optio E35',
+    'dd8ad8ce688c4248f924022c38d3228c:211111' => 'Pentax Optio 43WR, Good',
+    'e55e0c1adbbca8b9d100881248050eb5:211111' => 'Pentax Optio 43WR, Better',
+    '7770d784d852b3333f9213713e481125:211111' => 'Pentax Optio 450, Best',
+    '61d311bde22762ae0e88b768e835eced:211111' => 'Pentax Optio 33WR/M50, Best',
+    'bc066ff3fbea8a290c6f9882687945e0:221111' => 'Pentax Optio 430RS, Fine',
+    'b6bd9f956309a20e3a56294077536391:211111' => 'Pentax Optio A10/S7, Best',
+    'a4ecd6b77f06671530942783c3595aca:211111' => 'Pentax Optio A20, Best',
+    '40f66b0a209f24716320636b776dda94:211111' => 'Pentax Optio E30/E40, Best',
+    '59a868b3d11d9cdc87859c02757e13bb:211111' => 'Pentax Optio E50, Best',
+    '9570584f017ed2c4f0fb91782b51faa9:211111' => 'Pentax Optio M40/Z10, Best',
+    '5a74f09fb2586fa000c42e98e3b9f2d8:211111' => 'Pentax Optio T10',
+    '0867bdf854d1fbb141411de518a66ba6:211111' => 'Pentax Optio T20 (A)',
+    'f74b3853185743c111ccb13e6febdc21:211111' => 'Pentax Optio T20 (B)',
+    'b6640d3879f9922708d23e6adb3d61c9:211111' => 'Pentax Optio V10, Best',
+    '253467dc35dfbb32cb3d619fc635d689:211111' => 'Pentax Optio V20/W60, Best',
+
+    # Sony
+    '6bd350bf5df27ed1b5bf1d83fa9d021f:211111' => 'Sony DSLR-A700, Fine',
+);
+
+#------------------------------------------------------------------------------
+# Calculate JPEGDigest
+# Inputs: 0) ExifTool object ref, 1) DQT segments array ref, 2) subsampling string
+sub Calculate($$$)
+{
+    my ($exifTool, $dqtList, $subSampling) = @_;
+
+    unless (eval 'require Digest::MD5') {
+        $exifTool->Warn('Digest::MD5 must be installed to calculate JPEGDigest');
+        return;
+    }
+    # create a string of DQT tables (in indexed order), separated by zero bytes
+    my $dqt = '';
+    my $dat;
+    foreach $dat (@$dqtList) {
+        next unless $dat;
+        $dqt .= "\0" if $dqt;
+        $dqt .= $dat;
+    }
+    # generate ASCII-hex string of DQT MD5 digest
+    my $md5 = unpack 'H*', Digest::MD5::md5($dqt);
+
+    # add sub-sampling string unless we get a match without it
+    $md5 .= ':' . $subSampling unless $PrintConv{$md5};
+
+    # add print conversion for JPEGDigest dynamically so it doesn't
+    # bulk up the documentation and slow down loading unnecessarily
+    $Image::ExifTool::Extra{JPEGDigest}{PrintConv} = \%PrintConv;
+    $exifTool->FoundTag('JPEGDigest', $md5);
+}
+
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::JPEGDigest - Lookup for JPEGDigest values
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains a lookup for values of the JPEG DQT digest, allowing
+some image identification from JPEG data alone.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Jens Duttke for most of the work that went into this module, and
+to Franz Buchinger for the values he added.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/JPEG Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/JVC.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/JVC.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/JVC.pm	(revision 24799)
@@ -0,0 +1,129 @@
+#------------------------------------------------------------------------------
+# File:         JVC.pm
+#
+# Description:  JVC EXIF maker notes tags
+#
+# Revisions:    12/21/2005  - P. Harvey Created
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::JVC;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool::Exif;
+
+$VERSION = '1.02';
+
+sub ProcessJVCText($$$);
+
+# JVC EXIF-based maker notes
+%Image::ExifTool::JVC::Main = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'JVC EXIF maker note tags.',
+    #0x0001 - almost always '2', but '3' for GR-DV700 samples
+    0x0002 => { #PH
+        Name => 'CPUVersions',
+        # remove trailing nulls/spaces and split at remaining nulls/spaces
+        ValueConv => '$_=$val; s/(\s*\0)+$//; s/(\s*\0)+/, /g; $_',
+    },
+    0x0003 => { #PH
+        Name => 'Quality',
+        PrintConv => {
+            0 => 'Low',
+            1 => 'Normal',
+            2 => 'Fine',
+        },
+    },
+);
+
+# JVC text-based maker notes
+%Image::ExifTool::JVC::Text = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    PROCESS_PROC => \&ProcessJVCText,
+    NOTES => 'JVC/Victor text-based maker note tags.',
+    VER => 'MakerNoteVersion', #PH
+    QTY => { #PH
+        Name => 'Quality',
+        PrintConv => {
+            STND => 'Normal',
+            STD  => 'Normal',
+            FINE => 'Fine',
+        },
+    },
+);
+
+#------------------------------------------------------------------------------
+# Process JVC text-based maker notes
+# Inputs: 0) ExifTool object reference
+#         1) Reference to directory information hash
+#         2) Pointer to tag table for this directory
+# Returns: 1 on success, otherwise returns 0 and sets a Warning
+sub ProcessJVCText($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dirStart = $$dirInfo{DirStart} || 0;
+    my $dataLen = $$dirInfo{DataLen};
+    my $dirLen = $$dirInfo{DirLen} || $dataLen - $dirStart;
+    my $verbose = $exifTool->Options('Verbose');
+
+    my $data = substr($$dataPt, $dirStart, $dirLen);
+    # validate text maker notes
+    unless ($data =~ /^VER:/) {
+        $exifTool->Warn('Bad JVC text maker notes');
+        return 0;
+    }
+    while ($data =~ m/([A-Z]+):(.{3,4})/sg) {
+        my ($tag, $val) = ($1, $2);
+        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        $exifTool->VerboseInfo($tag, $tagInfo,
+            Table  => $tagTablePtr,
+            Value  => $val,
+        ) if $verbose;
+        unless ($tagInfo) {
+            next unless $exifTool->{OPTIONS}->{Unknown};
+            $tagInfo = {
+                Name => "JVC_Text_$tag",
+                Unknown => 1,
+                PrintConv => 'length($val) > 60 ? substr($val,0,55) . "[...]" : $val',
+            };
+            # add tag information to table
+            Image::ExifTool::AddTagToTable($tagTablePtr, $tag, $tagInfo);
+        }
+        $exifTool->FoundTag($tagInfo, $val);
+    }
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::JVC - JVC EXIF maker notes tags
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This module contains routines used by Image::ExifTool to interpret JVC maker
+notes.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/JVC Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Jpeg2000.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Jpeg2000.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Jpeg2000.pm	(revision 24799)
@@ -0,0 +1,665 @@
+#------------------------------------------------------------------------------
+# File:         Jpeg2000.pm
+#
+# Description:  Read JPEG 2000 meta information
+#
+# Revisions:    02/11/2005 - P. Harvey Created
+#               06/22/2007 - PH Added write support (EXIF, IPTC and XMP only)
+#
+# References:   1) http://www.jpeg.org/public/fcd15444-2.pdf
+#               2) ftp://ftp.remotesensing.org/jpeg2000/fcd15444-1.pdf
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Jpeg2000;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.16';
+
+sub ProcessJpeg2000Box($$$);
+
+my %resolutionUnit = (
+    -3 => 'km',
+    -2 => '100 m',
+    -1 => '10 m',
+     0 => 'm',
+     1 => '10 cm',
+     2 => 'cm',
+     3 => 'mm',
+     4 => '0.1 mm',
+     5 => '0.01 mm',
+     6 => 'um',
+);
+
+# map of where information is written in JPEG2000 image
+my %jp2Map = (
+    IPTC         => 'UUID-IPTC',
+    IFD0         => 'UUID-EXIF',
+    XMP          => 'UUID-XMP',
+   'UUID-IPTC'   => 'JP2',
+   'UUID-EXIF'   => 'JP2',
+   'UUID-XMP'    => 'JP2',
+  # jp2h         => 'JP2',  (not yet functional)
+  # ICC_Profile  => 'jp2h', (not yet functional)
+    IFD1         => 'IFD0',
+    EXIF         => 'IFD0', # to write EXIF as a block
+    ExifIFD      => 'IFD0',
+    GPS          => 'IFD0',
+    SubIFD       => 'IFD0',
+    GlobParamIFD => 'IFD0',
+    PrintIM      => 'IFD0',
+    InteropIFD   => 'ExifIFD',
+    MakerNotes   => 'ExifIFD',
+);
+
+# UUID's for writable UUID directories (by tag name)
+my %uuid = (
+    'UUID-EXIF'   => 'JpgTiffExif->JP2',
+    'UUID-IPTC'   => "\x33\xc7\xa4\xd2\xb8\x1d\x47\x23\xa0\xba\xf1\xa3\xe0\x97\xad\x38",
+    'UUID-XMP'    => "\xbe\x7a\xcf\xcb\x97\xa9\x42\xe8\x9c\x71\x99\x94\x91\xe3\xaf\xac",
+  # (can't yet write GeoJP2 information)
+  # 'UUID-GeoJP2' => "\xb1\x4b\xf8\xbd\x08\x3d\x4b\x43\xa5\xae\x8c\xd7\xd5\xa6\xce\x03",
+);
+
+# JPEG 2000 "box" (ie. atom) names
+%Image::ExifTool::Jpeg2000::Main = (
+    GROUPS => { 2 => 'Image' },
+    PROCESS_PROC => \&ProcessJpeg2000Box,
+    WRITE_PROC => \&ProcessJpeg2000Box,
+    NOTES => q{
+        The tags below are extracted from JPEG 2000 images, however ExifTool
+        currently writes only EXIF, IPTC and XMP tags in these images.
+    },
+   'jP  ' => 'JP2Signature', # (ref 1)
+   "jP\x1a\x1a" => 'JP2Signature', # (ref 2)
+    prfl => 'Profile',
+    ftyp => {
+        Name => 'FileType',
+        SubDirectory => { TagTable => 'Image::ExifTool::Jpeg2000::FileType' },
+    },
+    rreq => 'ReaderRequirements',
+    jp2h => {
+        Name => 'JP2Header',
+        SubDirectory => { },
+    },
+        # JP2Header sub boxes...
+        ihdr => {
+            Name => 'ImageHeader',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Jpeg2000::ImageHeader',
+            },
+        },
+        bpcc => 'BitsPerComponent',
+        colr => [
+            {
+                Name => 'ICC_Profile',
+                Condition => '$$valPt =~ /^(\x02|\x03)/',
+                SubDirectory => {
+                    TagTable => 'Image::ExifTool::ICC_Profile::Main',
+                    Start => '$valuePtr + 3',
+                },
+            },
+            {
+                Name => 'Colorspace',
+                Condition => '$$valPt =~ /^\x01/',
+                Format => 'binary',
+                ValueConv => 'unpack("x3N", $val)',
+                PrintConv => {
+                    16 => 'sRGB',
+                    17 => 'Grayscale',
+                    18 => 'sYCC',
+                },
+            },
+            {
+                Name => 'ColorSpecification',
+                Binary => 1,
+            },
+        ],
+        pclr => 'Palette',
+        cdef => 'ComponentDefinition',
+       'res '=> {
+            Name => 'Resolution',
+            SubDirectory => { },
+        },
+            # Resolution sub boxes...
+            resc => {
+                Name => 'CaptureResolution',
+                SubDirectory => {
+                    TagTable => 'Image::ExifTool::Jpeg2000::CaptureResolution',
+                },
+            },
+            resd => {
+                Name => 'DisplayResolution',
+                SubDirectory => {
+                    TagTable => 'Image::ExifTool::Jpeg2000::DisplayResolution',
+                },
+            },
+    jpch => {
+        Name => 'CodestreamHeader',
+        SubDirectory => { },
+    },
+        # CodestreamHeader sub boxes...
+       'lbl '=> {
+            Name => 'Label',
+            Format => 'string',
+        },
+        cmap => 'ComponentMapping',
+        roid => 'ROIDescription',
+    jplh => {
+        Name => 'CompositingLayerHeader',
+        SubDirectory => { },
+    },
+        # CompositingLayerHeader sub boxes...
+        cgrp => 'ColorGroup',
+        opct => 'Opacity',
+        creg => 'CodestreamRegistration',
+    dtbl => 'DataReference',
+    ftbl => {
+        Name => 'FragmentTable',
+        Subdirectory => { },
+    },
+        # FragmentTable sub boxes...
+        flst => 'FragmentList',
+    cref => 'Cross-Reference',
+    mdat => 'MediaData',
+    comp => 'Composition',
+    copt => 'CompositionOptions',
+    inst => 'InstructionSet',
+    asoc => 'Association',
+    nlst => 'NumberList',
+    bfil => 'BinaryFilter',
+    drep => 'DesiredReproductions',
+        # DesiredReproductions sub boxes...
+        gtso => 'GraphicsTechnologyStandardOutput',
+    chck => 'DigitalSignature',
+    mp7b => 'MPEG7Binary',
+    free => 'Free',
+    jp2c => 'ContiguousCodestream',
+    jp2i => {
+        Name => 'IntellectualProperty',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::XMP::Main',
+        },
+    },
+   'xml '=> {
+        Name => 'XML',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::XMP::Main',
+        },
+    },
+    uuid => [
+        {
+            Name => 'UUID-EXIF',
+            Condition => '$$valPt=~/^JpgTiffExif->JP2/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Exif::Main',
+                ProcessProc => \&Image::ExifTool::ProcessTIFF,
+                WriteProc => \&Image::ExifTool::WriteTIFF,
+                DirName => 'EXIF',
+                Start => '$valuePtr + 16',
+            },
+        },
+        {
+            Name => 'UUID-IPTC',
+            Condition => '$$valPt=~/^\x33\xc7\xa4\xd2\xb8\x1d\x47\x23\xa0\xba\xf1\xa3\xe0\x97\xad\x38/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::IPTC::Main',
+                Start => '$valuePtr + 16',
+            },
+        },
+        {
+            Name => 'UUID-XMP',
+            # ref http://www.adobe.com/products/xmp/pdfs/xmpspec.pdf
+            Condition => '$$valPt=~/^\xbe\x7a\xcf\xcb\x97\xa9\x42\xe8\x9c\x71\x99\x94\x91\xe3\xaf\xac/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::XMP::Main',
+                Start => '$valuePtr + 16',
+            },
+        },
+        {
+            Name => 'UUID-GeoJP2',
+            # ref http://www.remotesensing.org/jpeg2000/
+            Condition => '$$valPt=~/^\xb1\x4b\xf8\xbd\x08\x3d\x4b\x43\xa5\xae\x8c\xd7\xd5\xa6\xce\x03/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Exif::Main',
+                ProcessProc => \&Image::ExifTool::ProcessTIFF,
+                Start => '$valuePtr + 16',
+            },
+        },
+        {
+            Name => 'UUID-Unknown',
+        },
+    ],
+    uinf => {
+        Name => 'UUIDInfo',
+        SubDirectory => { },
+    },
+        # UUIDInfo sub boxes...
+        ulst => 'UUIDList',
+       'url '=> {
+            Name => 'URL',
+            Format => 'string',
+        },
+);
+
+%Image::ExifTool::Jpeg2000::ImageHeader = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    0 => {
+        Name => 'ImageHeight',
+        Format => 'int32u',
+    },
+    4 => {
+        Name => 'ImageWidth',
+        Format => 'int32u',
+    },
+    8 => {
+        Name => 'NumberOfComponents',
+        Format => 'int16u',
+    },
+    10 => {
+        Name => 'BitsPerComponent',
+        PrintConv => q{
+            $val == 0xff and return 'Variable';
+            my $sign = ($val & 0x80) ? 'Signed' : 'Unsigned';
+            return (($val & 0x7f) + 1) . " Bits, $sign";
+        },
+    },
+    11 => {
+        Name => 'Compression',
+        PrintConv => {
+            0 => 'Uncompressed',
+            1 => 'Modified Huffman',
+            2 => 'Modified READ',
+            3 => 'Modified Modified READ',
+            4 => 'JBIG',
+            5 => 'JPEG',
+            6 => 'JPEG-LS',
+            7 => 'JPEG 2000',
+            8 => 'JBIG2',
+        },
+    },
+);
+
+# (ref fcd15444-1/2/6.pdf)
+# (also see http://developer.apple.com/mac/library/documentation/QuickTime/QTFF/QTFFChap1/qtff1.html)
+%Image::ExifTool::Jpeg2000::FileType = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Video' },
+    FORMAT => 'int32u',
+    0 => {
+        Name => 'MajorBrand',
+        Format => 'undef[4]',
+        PrintConv => {
+            'jp2 ' => 'JPEG 2000 Image (.JP2)',           # image/jp2
+            'jpm ' => 'JPEG 2000 Compound Image (.JPM)',  # image/jpm
+            'jpx ' => 'JPEG 2000 with extensions (.JPX)', # image/jpx
+        },
+    },
+    1 => {
+        Name => 'MinorVersion',
+        Format => 'undef[4]',
+        ValueConv => 'sprintf("%x.%x.%x", unpack("nCC", $val))',
+    },
+    2 => {
+        Name => 'CompatibleBrands',
+        Format => 'undef[$size-8]',
+        # ignore any entry with a null, and return others as a list
+        ValueConv => 'my @a=($val=~/.{4}/sg); @a=grep(!/\0/,@a); \@a', 
+    },
+);
+
+%Image::ExifTool::Jpeg2000::CaptureResolution = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    FORMAT => 'int8s',
+    0 => {
+        Name => 'CaptureYResolution',
+        Format => 'rational32u',
+    },
+    4 => {
+        Name => 'CaptureXResolution',
+        Format => 'rational32u',
+    },
+    8 => {
+        Name => 'CaptureYResolutionUnit',
+        SeparateTable => 'ResolutionUnit',
+        PrintConv => \%resolutionUnit,
+    },
+    9 => {
+        Name => 'CaptureXResolutionUnit',
+        SeparateTable => 'ResolutionUnit',
+        PrintConv => \%resolutionUnit,
+    },
+);
+
+%Image::ExifTool::Jpeg2000::DisplayResolution = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    FORMAT => 'int8s',
+    0 => {
+        Name => 'DisplayYResolution',
+        Format => 'rational32u',
+    },
+    4 => {
+        Name => 'DisplayXResolution',
+        Format => 'rational32u',
+    },
+    8 => {
+        Name => 'DisplayYResolutionUnit',
+        SeparateTable => 'ResolutionUnit',
+        PrintConv => \%resolutionUnit,
+    },
+    9 => {
+        Name => 'DisplayXResolutionUnit',
+        SeparateTable => 'ResolutionUnit',
+        PrintConv => \%resolutionUnit,
+    },
+);
+
+#------------------------------------------------------------------------------
+# Create new JPEG 2000 boxes when writing
+# (Currently only supports adding certain UUID boxes)
+# Inputs: 0) ExifTool object ref, 1) Output file or scalar ref
+# Returns: 1 on success
+sub CreateNewBoxes($$)
+{
+    my ($exifTool, $outfile) = @_;
+    my $addDirs = $$exifTool{AddJp2Dirs};
+    delete $$exifTool{AddJp2Dirs};
+    my $dirName;
+    foreach $dirName (sort keys %$addDirs) {
+        next unless $uuid{$dirName};
+        my $tagInfo;
+        foreach $tagInfo (@{$Image::ExifTool::Jpeg2000::Main{uuid}}) {
+            next unless $$tagInfo{Name} eq $dirName;
+            my $subdir = $$tagInfo{SubDirectory};
+            my $tagTable = GetTagTable($$subdir{TagTable});
+            my %dirInfo = (
+                DirName => $$subdir{DirName} || $dirName,
+                Parent => 'JP2',
+            );
+            my $newdir = $exifTool->WriteDirectory(\%dirInfo, $tagTable, $$subdir{WriteProc});
+            if (defined $newdir and length $newdir) {
+                my $boxhdr = pack('N', length($newdir) + 24) . 'uuid' . $uuid{$dirName};
+                Write($outfile, $boxhdr, $newdir) or return 0;
+                last;
+            }
+        }
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Process JPEG 2000 box
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference, 2) Pointer to tag table
+# Returns: 1 on success when reading, or -1 on write error
+#          (or JP2 box or undef when writing from buffer)
+sub ProcessJpeg2000Box($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dataLen = $$dirInfo{DataLen};
+    my $dataPos = $$dirInfo{DataPos};
+    my $dirLen = $$dirInfo{DirLen} || 0;
+    my $dirStart = $$dirInfo{DirStart} || 0;
+    my $raf = $$dirInfo{RAF};
+    my $outfile = $$dirInfo{OutFile};
+    my $dirEnd = $dirStart + $dirLen;
+    my ($err, $outBuff, $verbose);
+
+    if ($outfile) {
+        unless ($raf) {
+            # buffer output to be used for return value
+            $outBuff = '';
+            $outfile = \$outBuff;
+        }
+    } else {
+        # (must not set verbose flag when writing!)
+        $verbose = $exifTool->{OPTIONS}->{Verbose};
+    }
+    # loop through all contained boxes
+    my ($pos, $boxLen);
+    for ($pos=$dirStart; ; $pos+=$boxLen) {
+        my ($boxID, $buff, $valuePtr);
+        if ($raf) {
+            $dataPos = $raf->Tell();
+            my $n = $raf->Read($buff,8);
+            unless ($n == 8) {
+                $n and $err = '', last;
+                if ($outfile) {
+                    CreateNewBoxes($exifTool, $outfile) or $err = 1;
+                }
+                last;
+            }
+            $dataPt = \$buff;
+            $dirLen = 8;
+            $pos = 0;
+        } elsif ($pos >= $dirEnd - 8) {
+            $err = '' unless $pos == $dirEnd;
+            last;
+        }
+        $boxLen = unpack("x$pos N",$$dataPt);
+        $boxID = substr($$dataPt, $pos+4, 4);
+        $pos += 8;
+        if ($boxLen == 1) {
+            if (not $raf and $pos < $dirLen - 8) {
+                $err = 'JPEG 2000 format error';
+            } else {
+                $err = "Can't currently handle huge JPEG 2000 boxes";
+            }
+            last;
+        } elsif ($boxLen == 0) {
+            if ($raf) {
+                if ($outfile) {
+                    CreateNewBoxes($exifTool, $outfile) or $err = 1;
+                    # copy over the rest of the file
+                    Write($outfile, $$dataPt) or $err = 1;
+                    while ($raf->Read($buff, 65536)) {
+                        Write($outfile, $buff) or $err = 1;
+                    }
+                }
+                last;   # (ignore the rest of the file when reading)
+            }
+            $boxLen = $dirLen - $pos;
+        } else {
+            $boxLen -= 8;
+        }
+        $boxLen < 0 and $err = 'Invalid JPEG 2000 box length', last;
+        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $boxID);
+        unless (defined $tagInfo or $verbose) {
+            # no need to process this box
+            if ($raf) {
+                if ($outfile) {
+                    Write($outfile, $$dataPt) or $err = 1;
+                    $raf->Read($buff,$boxLen) == $boxLen or $err = '', last;
+                    Write($outfile, $buff) or $err = 1;
+                } else {
+                    $raf->Seek($boxLen, 1) or $err = 'Seek error', last;
+                }
+            } elsif ($outfile) {
+                Write($outfile, substr($$dataPt, $pos-8, $boxLen+8)) or $err = '', last;
+            }
+            next;
+        }
+        if ($raf) {
+            # read the box data
+            $dataPos = $raf->Tell();
+            $raf->Read($buff,$boxLen) == $boxLen or $err = '', last;
+            $valuePtr = 0;
+            $dataLen = $boxLen;
+        } elsif ($boxLen + $pos > $dirStart + $dirLen) {
+            $err = '';
+            last;
+        } else {
+            $valuePtr = $pos;
+        }
+        if (defined $tagInfo and not $tagInfo) {
+            # GetTagInfo() required the value for a Condition
+            my $tmpVal = substr($$dataPt, $valuePtr, $boxLen < 128 ? $boxLen : 128);
+            $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $boxID, \$tmpVal);
+        }
+        # delete all UUID boxes if deleting all information
+        if ($outfile and $boxID eq 'uuid' and $exifTool->{DEL_GROUP}->{'*'}) {
+            $exifTool->VPrint(0, "  Deleting $$tagInfo{Name}\n");
+            ++$exifTool->{CHANGED};
+            next;
+        }
+        if ($verbose) {
+            $exifTool->VerboseInfo($boxID, $tagInfo,
+                Table  => $tagTablePtr,
+                DataPt => $dataPt,
+                Size   => $boxLen,
+                Start  => $valuePtr,
+            );
+            next unless $tagInfo;
+        }
+        if ($$tagInfo{SubDirectory}) {
+            my $subdir = $$tagInfo{SubDirectory};
+            my $subdirStart = $valuePtr;
+            if (defined $$subdir{Start}) {
+                #### eval Start ($valuePtr)
+                $subdirStart = eval($$subdir{Start});
+            }
+            my $subdirLen = $boxLen - ($subdirStart - $valuePtr);
+            my %subdirInfo = (
+                Parent => 'JP2',
+                DataPt => $dataPt,
+                DataPos => $dataPos,
+                DataLen => $dataLen,
+                DirStart => $subdirStart,
+                DirLen => $subdirLen,
+                DirName => $$subdir{DirName} || $$tagInfo{Name},
+                OutFile => $outfile,
+                Base => $dataPos + $subdirStart,
+            );
+            my $subTable = GetTagTable($$subdir{TagTable}) || $tagTablePtr;
+            if ($outfile) {
+                # remove this directory from our create list
+                delete $exifTool->{AddJp2Dirs}->{$$tagInfo{Name}};
+                my $newdir;
+                # only edit writable UUID boxes
+                if ($uuid{$$tagInfo{Name}}) {
+                    $newdir = $exifTool->WriteDirectory(\%subdirInfo, $subTable, $$subdir{WriteProc});
+                    next if defined $newdir and not length $newdir; # next if deleting the box
+                }
+                # use old box data if not changed
+                defined $newdir or $newdir = substr($$dataPt, $subdirStart, $subdirLen);
+                my $prefixLen = $subdirStart - $valuePtr;
+                my $boxhdr = pack('N', length($newdir) + 8 + $prefixLen) . $boxID;
+                $boxhdr .= substr($$dataPt, $valuePtr, $prefixLen) if $prefixLen;
+                Write($outfile, $boxhdr, $newdir) or $err = 1;
+            } elsif (not $exifTool->ProcessDirectory(\%subdirInfo, $subTable, $$subdir{ProcessProc})) {
+                if ($subTable eq $tagTablePtr) {
+                    $err = 'JPEG 2000 format error';
+                } else {
+                    $err = "Unrecognized $$tagInfo{Name} box";
+                }
+                last;
+            }
+        } elsif ($$tagInfo{Format} and not $outfile) {
+            # only save tag values if Format was specified
+            my $val = ReadValue($dataPt, $valuePtr, $$tagInfo{Format}, undef, $boxLen);
+            $exifTool->FoundTag($tagInfo, $val) if defined $val;
+        } elsif ($outfile) {
+            my $boxhdr = pack('N', $boxLen + 8) . $boxID;
+            Write($outfile, $boxhdr, substr($$dataPt, $valuePtr, $boxLen)) or $err = 1;
+        }
+    }
+    if (defined $err) {
+        $err or $err = 'Truncated JPEG 2000 box';
+        if ($outfile) {
+            $exifTool->Error($err) unless $err eq '1';
+            return $raf ? -1 : undef;
+        }
+        $exifTool->Warn($err);
+    }
+    return $outBuff if $outfile and not $raf;
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Read/write meta information from a JPEG 2000 image
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 on success, 0 if this wasn't a valid JPEG 2000 file, or -1 on write error
+sub ProcessJP2($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my $outfile = $$dirInfo{OutFile};
+    my $hdr;
+
+    # check to be sure this is a valid JPG2000 file
+    return 0 unless $raf->Read($hdr,12) == 12;
+    return 0 unless $hdr eq "\x00\x00\x00\x0cjP  \x0d\x0a\x87\x0a" or     # (ref 1)
+                    $hdr eq "\x00\x00\x00\x0cjP\x1a\x1a\x0d\x0a\x87\x0a"; # (ref 2)
+
+    if ($outfile) {
+        Write($outfile, $hdr) or return -1;
+        $exifTool->InitWriteDirs(\%jp2Map);
+        # save list of directories to create
+        my %addDirs = %{$$exifTool{ADD_DIRS}};
+        $$exifTool{AddJp2Dirs} = \%addDirs;
+    } else {
+        my ($buff, $fileType);
+        # recognize JPX and JPM as unique types of JP2
+        if ($raf->Read($buff, 12) == 12 and $buff =~ /^.{4}ftyp(.{4})/s) {
+            $fileType = 'JPX' if $1 eq 'jpx ';
+            $fileType = 'JPM' if $1 eq 'jpm ';
+        }
+        $raf->Seek(-length($buff), 1) if defined $buff;
+        $exifTool->SetFileType($fileType);
+    }
+    SetByteOrder('MM'); # JPEG 2000 files are big-endian
+    my %dirInfo = (
+        RAF => $raf,
+        DirName => 'JP2',
+        OutFile => $$dirInfo{OutFile},
+    );
+    my $tagTablePtr = GetTagTable('Image::ExifTool::Jpeg2000::Main');
+    return $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Jpeg2000 - Read JPEG 2000 meta information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains routines required by Image::ExifTool to read JPEG 2000
+files.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.jpeg.org/public/fcd15444-2.pdf>
+
+=item L<ftp://ftp.remotesensing.org/jpeg2000/fcd15444-1.pdf>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/Jpeg2000 Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Kodak.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Kodak.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Kodak.pm	(revision 24799)
@@ -0,0 +1,1858 @@
+#------------------------------------------------------------------------------
+# File:         Kodak.pm
+#
+# Description:  Kodak EXIF maker notes and APP3 "Meta" tags
+#
+# Revisions:    03/28/2005  - P. Harvey Created
+#
+# References:   1) http://search.cpan.org/dist/Image-MetaData-JPEG/
+#               2) http://www.ozhiker.com/electronics/pjmt/jpeg_info/meta.html
+#               3) http://www.cybercom.net/~dcoffin/dcraw/
+#
+# Notes:        There really isn't much public information about Kodak formats.
+#               The only source I could find was Image::MetaData::JPEG, which
+#               didn't provide information about decoding the tag values.  So
+#               this module represents a lot of work downloading sample images
+#               (about 100MB worth!), and testing with my daughter's CX4200.
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Kodak;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool::Exif;
+
+$VERSION = '1.27';
+
+sub ProcessKodakIFD($$$);
+sub ProcessKodakText($$$);
+sub WriteKodakIFD($$$);
+
+# Kodak type 1 maker notes (ref 1)
+%Image::ExifTool::Kodak::Main = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    NOTES => q{
+        The table below contains the most common set of Kodak tags.  The following
+        Kodak camera models have been tested and found to use these tags: C360,
+        C663, C875, CX6330, CX6445, CX7330, CX7430, CX7525, CX7530, DC4800, DC4900,
+        DX3500, DX3600, DX3900, DX4330, DX4530, DX4900, DX6340, DX6440, DX6490,
+        DX7440, DX7590, DX7630, EasyShare-One, LS420, LS443, LS633, LS743, LS753,
+        V530, V550, V570, V603, V610, V705, Z650, Z700, Z710, Z730, Z740, Z760 and
+        Z7590.
+    },
+    WRITABLE => 1,
+    FIRST_ENTRY => 8,
+    0x00 => {
+        Name => 'KodakModel',
+        Format => 'string[8]',
+    },
+    0x09 => {
+        Name => 'Quality',
+        PrintConv => { #PH
+            1 => 'Fine',
+            2 => 'Normal',
+        },
+    },
+    0x0a => {
+        Name => 'BurstMode',
+        PrintConv => { 0 => 'Off', 1 => 'On' },
+    },
+    0x0c => {
+        Name => 'KodakImageWidth',
+        Format => 'int16u',
+    },
+    0x0e => {
+        Name => 'KodakImageHeight',
+        Format => 'int16u',
+    },
+    0x10 => {
+        Name => 'YearCreated',
+        Groups => { 2 => 'Time' },
+        Format => 'int16u',
+    },
+    0x12 => {
+        Name => 'MonthDayCreated',
+        Groups => { 2 => 'Time' },
+        Format => 'int8u[2]',
+        ValueConv => 'sprintf("%.2d:%.2d",split(" ", $val))',
+        ValueConvInv => '$val=~tr/:./ /;$val',
+    },
+    0x14 => {
+        Name => 'TimeCreated',
+        Groups => { 2 => 'Time' },
+        Format => 'int8u[4]',
+        Shift => 'Time',
+        ValueConv => 'sprintf("%.2d:%.2d:%.2d.%.2d",split(" ", $val))',
+        ValueConvInv => '$val=~tr/:./ /;$val',
+    },
+    0x18 => {
+        Name => 'BurstMode2',
+        Format => 'int16u',
+        Unknown => 1, # not sure about this tag (or other 'Unknown' tags)
+    },
+    0x1b => {
+        Name => 'ShutterMode',
+        PrintConv => { #PH
+            0 => 'Auto',
+            8 => 'Aperture Priority',
+            32 => 'Manual?',
+        },
+    },
+    0x1c => {
+        Name => 'MeteringMode',
+        PrintConv => { #PH
+            0 => 'Multi-segment',
+            1 => 'Center-weighted average',
+            2 => 'Spot',
+        },
+    },
+    0x1d => 'SequenceNumber',
+    0x1e => {
+        Name => 'FNumber',
+        Format => 'int16u',
+        ValueConv => '$val / 100',
+        ValueConvInv => 'int($val * 100 + 0.5)',
+    },
+    0x20 => {
+        Name => 'ExposureTime',
+        Format => 'int32u',
+        ValueConv => '$val / 1e5',
+        ValueConvInv => '$val * 1e5',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    0x24 => {
+        Name => 'ExposureCompensation',
+        Format => 'int16s',
+        ValueConv => '$val / 1000',
+        ValueConvInv => '$val * 1000',
+        PrintConv => '$val > 0 ? "+$val" : $val',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    0x26 => {
+        Name => 'VariousModes',
+        Format => 'int16u',
+        Unknown => 1,
+    },
+    0x28 => {
+        Name => 'Distance1',
+        Format => 'int32u',
+        Unknown => 1,
+    },
+    0x2c => {
+        Name => 'Distance2',
+        Format => 'int32u',
+        Unknown => 1,
+    },
+    0x30 => {
+        Name => 'Distance3',
+        Format => 'int32u',
+        Unknown => 1,
+    },
+    0x34 => {
+        Name => 'Distance4',
+        Format => 'int32u',
+        Unknown => 1,
+    },
+    0x38 => {
+        Name => 'FocusMode',
+        PrintConv => {
+            0 => 'Normal',
+            2 => 'Macro',
+        },
+    },
+    0x3a => {
+        Name => 'VariousModes2',
+        Format => 'int16u',
+        Unknown => 1,
+    },
+    0x3c => {
+        Name => 'PanoramaMode',
+        Format => 'int16u',
+        Unknown => 1,
+    },
+    0x3e => {
+        Name => 'SubjectDistance',
+        Format => 'int16u',
+        Unknown => 1,
+    },
+    0x40 => {
+        Name => 'WhiteBalance',
+        Priority => 0,
+        PrintConv => { #PH
+            0 => 'Auto',
+            1 => 'Flash?',
+            2 => 'Tungsten',
+            3 => 'Daylight',
+        },
+    },
+    0x5c => {
+        Name => 'FlashMode',
+        Flags => 'PrintHex',
+        # various models express this number differently
+        PrintConv => { #PH
+            0x00 => 'Auto',
+            0x01 => 'Fill Flash',
+            0x02 => 'Off',
+            0x03 => 'Red-Eye',
+            0x10 => 'Fill Flash',
+            0x20 => 'Off',
+            0x40 => 'Red-Eye?',
+        },
+    },
+    0x5d => {
+        Name => 'FlashFired',
+        PrintConv => { 0 => 'No', 1 => 'Yes' },
+    },
+    0x5e => {
+        Name => 'ISOSetting',
+        Format => 'int16u',
+        PrintConv => '$val ? $val : "Auto"',
+        PrintConvInv => '$val=~/^\d+$/ ? $val : 0',
+    },
+    0x60 => {
+        Name => 'ISO',
+        Format => 'int16u',
+    },
+    0x62 => {
+        Name => 'TotalZoom',
+        Format => 'int16u',
+        ValueConv => '$val / 100',
+        ValueConvInv => '$val * 100',
+    },
+    0x64 => {
+        Name => 'DateTimeStamp',
+        Format => 'int16u',
+        PrintConv => '$val ? "Mode $val" : "Off"',
+        PrintConvInv => '$val=~tr/0-9//dc; $val ? $val : 0',
+    },
+    0x66 => {
+        Name => 'ColorMode',
+        Format => 'int16u',
+        Flags => 'PrintHex',
+        # various models express this number differently
+        PrintConv => { #PH
+            0x01 => 'B&W',
+            0x02 => 'Sepia',
+            0x03 => 'B&W Yellow Filter',
+            0x04 => 'B&W Red Filter',
+            0x20 => 'Saturated Color',
+            0x40 => 'Neutral Color',
+            0x100 => 'Saturated Color',
+            0x200 => 'Neutral Color',
+            0x2000 => 'B&W',
+            0x4000 => 'Sepia',
+        },
+    },
+    0x68 => {
+        Name => 'DigitalZoom',
+        Format => 'int16u',
+        ValueConv => '$val / 100',
+        ValueConvInv => '$val * 100',
+    },
+    0x6b => {
+        Name => 'Sharpness',
+        Format => 'int8s',
+        %Image::ExifTool::Exif::printParameter,
+    },
+);
+
+# Kodak type 2 maker notes (ref PH)
+%Image::ExifTool::Kodak::Type2 = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    NOTES => q{
+        These tags are used by the Kodak DC220, DC260, DC265 and DC290,
+        Hewlett-Packard PhotoSmart 618, C500 and C912, Pentax EI-200 and EI-2000,
+        and Minolta EX1500Z.
+    },
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    0x08 => {
+        Name => 'KodakMaker',
+        Format => 'string[32]',
+    },
+    0x28 => {
+        Name => 'KodakModel',
+        Format => 'string[32]',
+    },
+    0x6c => {
+        Name => 'KodakImageWidth',
+        Format => 'int32u',
+    },
+    0x70 => {
+        Name => 'KodakImageHeight',
+        Format => 'int32u',
+    },
+);
+
+# Kodak type 3 maker notes (ref PH)
+%Image::ExifTool::Kodak::Type3 = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    NOTES => 'These tags are used by the DC240, DC280, DC3400 and DC5000.',
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    0x0c => {
+        Name => 'YearCreated',
+        Groups => { 2 => 'Time' },
+        Format => 'int16u',
+    },
+    0x0e => {
+        Name => 'MonthDayCreated',
+        Groups => { 2 => 'Time' },
+        Format => 'int8u[2]',
+        ValueConv => 'sprintf("%.2d:%.2d",split(" ", $val))',
+        ValueConvInv => '$val=~tr/:./ /;$val',
+    },
+    0x10 => {
+        Name => 'TimeCreated',
+        Groups => { 2 => 'Time' },
+        Format => 'int8u[4]',
+        Shift => 'Time',
+        ValueConv => 'sprintf("%2d:%.2d:%.2d.%.2d",split(" ", $val))',
+        ValueConvInv => '$val=~tr/:./ /;$val',
+    },
+    0x1e => {
+        Name => 'OpticalZoom',
+        Format => 'int16u',
+        ValueConv => '$val / 100',
+        ValueConvInv => '$val * 100',
+    },
+    0x37 => {
+        Name => 'Sharpness',
+        Format => 'int8s',
+        %Image::ExifTool::Exif::printParameter,
+    },
+    0x38 => {
+        Name => 'ExposureTime',
+        Format => 'int32u',
+        ValueConv => '$val / 1e5',
+        ValueConvInv => '$val * 1e5',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    0x3c => {
+        Name => 'FNumber',
+        Format => 'int16u',
+        ValueConv => '$val / 100',
+        ValueConvInv => 'int($val * 100 + 0.5)',
+    },
+    0x4e => {
+        Name => 'ISO',
+        Format => 'int16u',
+    },
+);
+
+# Kodak type 4 maker notes (ref PH)
+%Image::ExifTool::Kodak::Type4 = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    NOTES => 'These tags are used by the DC200 and DC215.',
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    0x20 => {
+        Name => 'OriginalFileName',
+        Format => 'string[12]',
+    },
+);
+
+# Kodak type 5 maker notes (ref PH)
+%Image::ExifTool::Kodak::Type5 = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    NOTES => q{
+        These tags are used by the CX4200, CX4210, CX4230, CX4300, CX4310, CX6200
+        and CX6230.
+    },
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    0x14 => {
+        Name => 'ExposureTime',
+        Format => 'int32u',
+        ValueConv => '$val / 1e5',
+        ValueConvInv => '$val * 1e5',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    0x1a => {
+        Name => 'WhiteBalance',
+        PrintConv => {
+            1 => 'Daylight',
+            2 => 'Flash',
+            3 => 'Tungsten',
+        },
+    },
+    0x1c => {
+        Name => 'FNumber',
+        Format => 'int16u',
+        ValueConv => '$val / 100',
+        ValueConvInv => 'int($val * 100 + 0.5)',
+    },
+    0x1e => {
+        Name => 'ISO',
+        Format => 'int16u',
+    },
+    0x20 => {
+        Name => 'OpticalZoom',
+        Format => 'int16u',
+        ValueConv => '$val / 100',
+        ValueConvInv => '$val * 100',
+    },
+    0x22 => {
+        Name => 'DigitalZoom',
+        Format => 'int16u',
+        ValueConv => '$val / 100',
+        ValueConvInv => '$val * 100',
+    },
+    0x27 => {
+        Name => 'FlashMode',
+        PrintConv => {
+            0 => 'Auto',
+            1 => 'On',
+            2 => 'Off',
+            3 => 'Red-Eye',
+        },
+    },
+    0x2a => {
+        Name => 'ImageRotated',
+        PrintConv => { 0 => 'No', 1 => 'Yes' },
+    },
+    0x2b => {
+        Name => 'Macro',
+        PrintConv => { 0 => 'On', 1 => 'Off' },
+    },
+);
+
+# Kodak type 6 maker notes (ref PH)
+%Image::ExifTool::Kodak::Type6 = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    NOTES => 'These tags are used by the DX3215 and DX3700.',
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    0x10 => {
+        Name => 'ExposureTime',
+        Format => 'int32u',
+        ValueConv => '$val / 1e5',
+        ValueConvInv => '$val * 1e5',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    0x14 => {
+        Name => 'ISOSetting',
+        Format => 'int32u',
+        Unknown => 1,
+    },
+    0x18 => {
+        Name => 'FNumber',
+        Format => 'int16u',
+        ValueConv => '$val / 100',
+        ValueConvInv => 'int($val * 100 + 0.5)',
+    },
+    0x1a => {
+        Name => 'ISO',
+        Format => 'int16u',
+    },
+    0x1c => {
+        Name => 'OpticalZoom',
+        Format => 'int16u',
+        ValueConv => '$val / 100',
+        ValueConvInv => '$val * 100',
+    },
+    0x1e => {
+        Name => 'DigitalZoom',
+        Format => 'int16u',
+        ValueConv => '$val / 100',
+        ValueConvInv => '$val * 100',
+    },
+    0x22 => {
+        Name => 'Flash',
+        Format => 'int16u',
+        PrintConv => {
+            0 => 'No Flash',
+            1 => 'Fired',
+        },
+    },
+);
+
+# Kodak type 7 maker notes (ref PH)
+%Image::ExifTool::Kodak::Type7 = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    NOTES => q{
+        The maker notes of models such as the C340, C433, CC533, LS755, V803 and
+        V1003 seem to start with the camera serial number.  The C310, C315, C330,
+        C643, C743, CD33, CD43, CX7220 and CX7300 maker notes are also decoded using
+        this table, although the strings for these cameras don't conform to the
+        usual Kodak serial number format, and instead have the model name followed
+        by 8 digits.
+    },
+    0 => { # (not confirmed)
+        Name => 'SerialNumber',
+        Format => 'string[16]',
+        ValueConv => '$val=~s/\s+$//; $val', # remove trailing whitespace
+        ValueConvInv => '$val',
+    },
+);
+
+# Kodak IFD-format maker notes (ref PH)
+%Image::ExifTool::Kodak::Type8 = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => q{
+        Kodak models such as the ZD710, P712, P850, P880, V1233, V1253, V1275,
+        V1285, Z612, Z712, Z812, Z885 use standard TIFF IFD format for the maker
+        notes.  In keeping with Kodak's strategy of inconsistent makernotes, models
+        such as the M380, M1033, M1093, V1073, V1273, Z1012, Z1085 and Z8612
+        also use these tags, but these makernotes begin with a TIFF header instead
+        of an IFD entry count and use relative instead of absolute offsets.  There
+        is a large amount of information stored in these maker notes (apparently
+        with much duplication), but relatively few tags have so far been decoded.
+    },
+    0xfc00 => [{
+        Name => 'SubIFD0',
+        Condition => '$format eq "undef"',
+        Groups => { 1 => 'MakerNotes' },        # SubIFD needs group 1 set
+        NestedHtmlDump => 2, # (so HtmlDump doesn't show these as double-referenced)
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::SubIFD0',
+            Base => '$start',
+            ProcessProc => \&ProcessKodakIFD,
+            WriteProc => \&WriteKodakIFD,
+        },
+    },{
+        Name => 'SubIFD0',
+        Groups => { 1 => 'MakerNotes' },        # SubIFD needs group 1 set
+        Flags => 'SubIFD',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::SubIFD0',
+            Start => '$val',
+            # (odd but true: the Base for this SubIFD is different than 0xfc01-0xfc06)
+        },
+    }],
+    # SubIFD1 and higher data is preceded by a TIFF byte order mark to indicate
+    # the byte ordering used.  Beginning with the M580, these subdirectories are
+    # stored as 'undef' data rather than as a standard EXIF SubIFD.
+    0xfc01 => [{
+        Name => 'SubIFD1',
+        Condition => '$format eq "undef"',
+        Groups => { 1 => 'MakerNotes' },        # SubIFD needs group 1 set
+        NestedHtmlDump => 2,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::SubIFD1',
+            Base => '$start',
+        },
+    },{
+        Name => 'SubIFD1',
+        Condition => '$$valPt ne "\0\0\0\0"',   # may be zero if dir doesn't exist
+        Groups => { 1 => 'MakerNotes' },        # SubIFD needs group 1 set
+        Flags => 'SubIFD',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::SubIFD1',
+            Start => '$val',
+            Base => '$start',
+        },
+    }],
+    0xfc02 => [{
+        Name => 'SubIFD2',
+        Condition => '$format eq "undef"',
+        Groups => { 1 => 'MakerNotes' },        # SubIFD needs group 1 set
+        NestedHtmlDump => 2,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::SubIFD2',
+            Base => '$start',
+        },
+    },{
+        Name => 'SubIFD2',
+        Condition => '$$valPt ne "\0\0\0\0"',   # may be zero if dir doesn't exist
+        Groups => { 1 => 'MakerNotes' },        # SubIFD needs group 1 set
+        Flags => 'SubIFD',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::SubIFD2',
+            Start => '$val',
+            Base => '$start',
+        },
+    }],
+    0xfc03 => [{
+        Name => 'SubIFD3',
+        Condition => '$format eq "undef"',
+        Groups => { 1 => 'MakerNotes' },        # SubIFD needs group 1 set
+        NestedHtmlDump => 2,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::SubIFD3',
+            Base => '$start',
+        },
+    },{
+        Name => 'SubIFD3',
+        Condition => '$$valPt ne "\0\0\0\0"',   # may be zero if dir doesn't exist
+        Groups => { 1 => 'MakerNotes' },        # SubIFD needs group 1 set
+        Flags => 'SubIFD',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::SubIFD3',
+            Start => '$val',
+            Base => '$start',
+        },
+    }],
+    # (SubIFD4 has the pointer zeroed in my samples, but support it
+    # in case it is used by future models -- ignored if pointer is zero)
+    0xfc04 => [{
+        Name => 'SubIFD4',
+        Condition => '$format eq "undef"',
+        Groups => { 1 => 'MakerNotes' },        # SubIFD needs group 1 set
+        NestedHtmlDump => 2,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::SubIFD4',
+            Base => '$start',
+        },
+    },{
+        Name => 'SubIFD4',
+        Condition => '$$valPt ne "\0\0\0\0"',   # may be zero if dir doesn't exist
+        Groups => { 1 => 'MakerNotes' },        # SubIFD needs group 1 set
+        Flags => 'SubIFD',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::SubIFD4',
+            Start => '$val',
+            Base => '$start',
+        },
+    }],
+    0xfc05 => [{
+        Name => 'SubIFD5',
+        Condition => '$format eq "undef"',
+        Groups => { 1 => 'MakerNotes' },        # SubIFD needs group 1 set
+        NestedHtmlDump => 2,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::SubIFD5',
+            Base => '$start',
+        },
+    },{
+        Name => 'SubIFD5',
+        Condition => '$$valPt ne "\0\0\0\0"',   # may be zero if dir doesn't exist
+        Groups => { 1 => 'MakerNotes' },        # SubIFD needs group 1 set
+        Flags => 'SubIFD',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::SubIFD5',
+            Start => '$val',
+            Base => '$start',
+        },
+    }],
+    0xfc06 => [{ # new for the M580
+        Name => 'SubIFD6',
+        Condition => '$format eq "undef"',
+        Groups => { 1 => 'MakerNotes' },        # SubIFD needs group 1 set
+        NestedHtmlDump => 2,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::SubIFD6',
+            Base => '$start',
+        },
+    },{
+        Name => 'SubIFD6',
+        Condition => '$$valPt ne "\0\0\0\0"',   # may be zero if dir doesn't exist
+        Groups => { 1 => 'MakerNotes' },        # SubIFD needs group 1 set
+        Flags => 'SubIFD',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::SubIFD6',
+            Start => '$val',
+            Base => '$start',
+        },
+    }],
+    0xfcff => {
+        Name => 'SubIFD255',
+        Condition => '$format eq "undef"',
+        Groups => { 1 => 'MakerNotes' },        # SubIFD needs group 1 set
+        NestedHtmlDump => 2,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::SubIFD0',
+            # (uses the same Base as the main MakerNote IFD)
+        },
+    },
+    0xff00 => {
+        Name => 'CameraInfo',
+        Condition => '$$valPt ne "\0\0\0\0"',   # may be zero if dir doesn't exist
+        Groups => { 1 => 'MakerNotes' },        # SubIFD needs group 1 set
+        Flags => 'SubIFD',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::CameraInfo',
+            Start => '$val',
+            # (uses the same Base as the main MakerNote IFD)
+        },
+    },
+);
+
+# Kodak type 9 maker notes (ref PH)
+%Image::ExifTool::Kodak::Type9 = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    NOTES => q{
+        These tags are used by the Kodak C140, C180, C913, C1013, M320, M340 and
+        M550, as well as various cameras marketed by other manufacturers.
+    },
+    0x0c => [
+        {
+            Name => 'FNumber',
+            Condition => '$$self{Make} =~ /Kodak/i',
+            Format => 'int16u',
+            ValueConv => '$val / 100',
+            ValueConvInv => 'int($val * 100 + 0.5)',
+        },{
+            Name => 'FNumber',
+            Format => 'int16u',
+            ValueConv => '$val / 10',
+            ValueConvInv => 'int($val * 10 + 0.5)',
+        },
+    ],
+    0x10 => {
+        Name => 'ExposureTime',
+        Format => 'int32u',
+        ValueConv => '$val / 1e6',
+        ValueConvInv => '$val * 1e6',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    0x14 => {
+        Name => 'DateTimeOriginal',
+        Description => 'Date/Time Original',
+        Groups => { 2 => 'Time' },
+        Format => 'string[20]',
+        Shift => 'Time',
+        ValueConv => '$val=~s{/}{:}g; $val',
+        ValueConvInv => '$val=~s{^(\d{4}):(\d{2}):}{$1/$2/}; $val',
+        PrintConv => '$self->ConvertDateTime($val)',
+        PrintConvInv => '$self->InverseDateTime($val,0)',
+    },
+    0x34 => {
+        Name => 'ISO',
+        Format => 'int16u',
+    },
+    0x57 => {
+        Name => 'FirmwareVersion',
+        Condition => '$$self{Make} =~ /Kodak/i',
+        Format => 'string[16]',
+        Notes => 'Kodak only',
+    },
+    0xa8 => { # (not confirmed)
+        Name => 'SerialNumber',
+        Condition => '$$self{Make} =~ /Kodak/i',
+        Format => 'string[12]',
+        Notes => 'Kodak only',
+    },
+);
+
+# more Kodak IFD-format maker notes (ref PH)
+%Image::ExifTool::Kodak::Type10 = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    PRIORITY => 0,
+    NOTES => q{
+        Another variation of the IFD-format type, this time with just a byte order
+        indicator instead of a full TIFF header.  These tags are used by the Z980.
+    },
+    # 0x01 int16u - always 0
+    0x02 => {
+        Name => 'PreviewImageSize',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    # 0x03 int32u - ranges from about 33940 to 40680
+    # 0x04 int32u - always 18493
+    # 0x06 undef[4] - 07 d9 04 11
+    # 0x07 undef[3] - varies
+    # 0x08 int16u - 1 (mostly), 2
+    # 0x09 int16u - 255
+    # 0x0b int16u[2] - '0 0' (mostly), '20 0', '21 0', '1 0'
+    # 0x0c int16u - 1 (mostly), 3, 259, 260
+    # 0x0d int16u - 0
+    # 0x0e int16u - 0, 1, 2 (MeteringMode? 0=Partial, 1,2=Multi)
+    # 0x0f int16u - 0, 5 (MeteringMode? 0=Multi, 5=Partial)
+    # 0x10 int16u - ranges from about 902 to 2308
+    0x12 => {
+        Name => 'ExposureTime',
+        Writable => 'int32u',
+        ValueConv => '$val / 1e5',
+        ValueConvInv => '$val * 1e5',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    0x13 => {
+        Name => 'FNumber',
+        Writable => 'int16u',
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+    },
+    0x14 => {
+        Name => 'ISO',
+        Writable => 'int16u',
+        ValueConv => 'exp($val/3*log(2))*25',
+        ValueConvInv => '3*log($val/25)/log(2)',
+        PrintConv => 'int($val + 0.5)',
+        PrintConvInv => '$val',
+    },
+    # 0x15 int16u - 18-25 (SceneMode? 21=auto, 24=Aperture Priority, 19=high speed)
+    # 0x16 int16u - 50
+    # 0x17 int16u - 0, 65535 (MeteringMode? 0=Multi, 65535=Partial)
+    # 0x19 int16u - 0, 4 (WhiteBalance? 0=Auto, 4=Manual)
+    # 0x1a int16u - 0, 65535
+    # 0x1b int16u - 416-696
+    # 0x1c int16u - 251-439 (low when 0x1b is high)
+    0x1d => {
+        Name => 'FocalLength',
+        Writable => 'int32u',
+        ValueConv => '$val / 100',
+        ValueConvInv => '$val * 100',
+        PrintConv => '"$val mm"',
+        PrintConvInv => '$val=~s/\s*mm//;$val',
+    },
+    # 0x1e int16u - 100
+    # 0x1f int16u - 0, 1
+    # 0x20,0x21 int16u - 1
+    # 0x27 undef[4] - fe ff ff ff
+    # 0x32 undef[4] - 00 00 00 00
+    # 0x61 int32u[2] - '0 0' or '34050 0'
+    # 0x62 int8u - 0, 1
+    # 0x63 int8u - 1
+    # 0x64,0x65 int8u - 0, 1, 2
+    # 0x66 int32u - 0
+    # 0x67 int32u - 3
+    # 0x68 int32u - 0
+    # 0x3fe undef[2540]
+);
+
+# Kodak SubIFD0 tags (ref PH)
+%Image::ExifTool::Kodak::SubIFD0 = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'SubIFD0 through SubIFD5 tags are written a number of newer Kodak models.',
+    0xfa02 => {
+        Name => 'SceneMode',
+        Writable => 'int16u',
+        Notes => 'may not be valid for some models', # ie. M580?
+        PrintConv => {
+            1 => 'Sport',
+            3 => 'Portrait',
+            4 => 'Landscape',
+            6 => 'Beach',
+            7 => 'Night Portrait',
+            8 => 'Night Landscape',
+            9 => 'Snow',
+            10 => 'Text',
+            11 => 'Fireworks',
+            12 => 'Macro',
+            13 => 'Museum',
+            16 => 'Children',
+            17 => 'Program',
+            18 => 'Aperture Priority',
+            19 => 'Shutter Priority',
+            20 => 'Manual',
+            25 => 'Back Light',
+            28 => 'Candlelight',
+            29 => 'Sunset',
+            31 => 'Panorama Left-Right',
+            32 => 'Panorama Right-Left',
+            33 => 'Smart Scene',
+            34 => 'High ISO',
+        },
+    },
+    # 0xfa04 - values: 0 (normally), 2 (panorama shots)
+    # 0xfa0f - values: 0 (normally), 1 (macro?)
+    # 0xfa11 - some sort of FNumber (x 100)
+    0xfa19 => {
+        Name => 'SerialNumber', # (verified with Z712 - PH)
+        Writable => 'string',
+    },
+    0xfa1d => {
+        Name => 'KodakImageWidth',
+        Writable => 'int16u',
+    },
+    0xfa1e => {
+        Name => 'KodakImageHeight',
+        Writable => 'int16u',
+    },
+    0xfa20 => {
+        Name => 'SensorWidth',
+        Writable => 'int16u',
+    },
+    0xfa21 => {
+        Name => 'SensorHeight',
+        Writable => 'int16u',
+    },
+    0xfa23 => {
+        Name => 'FNumber',
+        Writable => 'int16u',
+        Priority => 0,
+        ValueConv => '$val / 100',
+        ValueConvInv => '$val * 100',
+    },
+    0xfa24 => {
+        Name => 'ExposureTime',
+        Writable => 'int32u',
+        Priority => 0,
+        ValueConv => '$val / 1e5',
+        ValueConvInv => '$val * 1e5',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    0xfa2e => {
+        Name => 'ISO',
+        Writable => 'int16u',
+        Priority => 0,
+    },
+    0xfa3d => {
+        Name => 'OpticalZoom',
+        Writable => 'int16u',
+        ValueConv => '$val / 100',
+        ValueConvInv => '$val * 100',
+        PrintConv => 'sprintf("%.2f",$val)',
+        PrintConvInv => '$val=~s/ ?x//; $val',
+    },
+    0xfa46 => {
+        Name => 'ISO',
+        Writable => 'int16u',
+        Priority => 0,
+    },
+    # 0xfa4c - related to focal length (1=wide, 32=full zoom)
+    0xfa51 => {
+        Name => 'KodakImageWidth',
+        Writable => 'int16u',
+    },
+    0xfa52 => {
+        Name => 'KodakImageHeight',
+        Writable => 'int16u',
+    },
+    0xfa54 => {
+        Name => 'ThumbnailWidth',
+        Writable => 'int16u',
+    },
+    0xfa55 => {
+        Name => 'ThumbnailHeight',
+        Writable => 'int16u',
+    },
+    0xfa57 => {
+        Name => 'PreviewWidth',
+        Writable => 'int16u',
+    },
+    0xfa58 => {
+        Name => 'PreviewHeight',
+        Writable => 'int16u',
+    },
+);
+
+# Kodak SubIFD1 tags (ref PH)
+%Image::ExifTool::Kodak::SubIFD1 = (
+    PROCESS_PROC => \&ProcessKodakIFD,
+    WRITE_PROC => \&WriteKodakIFD,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0x0027 => {
+        Name => 'ISO',
+        Writable => 'int16u',
+        Priority => 0,
+    },
+    0x0028 => {
+        Name => 'ISO',
+        Writable => 'int16u',
+        Priority => 0,
+    },
+);
+
+my %sceneModeUsed = (
+    0 => 'Program',
+    2 => 'Aperture Priority',
+    3 => 'Shutter Priority',
+    4 => 'Manual',
+    5 => 'Portrait',
+    6 => 'Sport',
+    7 => 'Children',
+    8 => 'Museum',
+    10 => 'High ISO',
+    11 => 'Text',
+    12 => 'Macro',
+    13 => 'Back Light',
+    16 => 'Landscape',
+    17 => 'Night Landscape',
+    18 => 'Night Portrait',
+    19 => 'Snow',
+    20 => 'Beach',
+    21 => 'Fireworks',
+    22 => 'Sunset',
+    23 => 'Candlelight',
+    28 => 'Panorama',
+);
+
+# Kodak SubIFD2 tags (ref PH)
+%Image::ExifTool::Kodak::SubIFD2 = (
+    PROCESS_PROC => \&ProcessKodakIFD,
+    WRITE_PROC => \&WriteKodakIFD,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0x6002 => {
+        Name => 'SceneModeUsed',
+        Writable => 'int32u',
+        PrintConv => \%sceneModeUsed,
+    },
+    0x6006 => {
+        Name => 'OpticalZoom',
+        Writable => 'int32u',
+        ValueConv => '$val / 100',
+        ValueConvInv => '$val * 100',
+        PrintConv => 'sprintf("%.2f",$val)',
+        PrintConvInv => '$val=~s/ ?x//; $val',
+    },
+    # 0x6009 - some sort of FNumber (x 100)
+    0x6103 => {
+        Name => 'MaxAperture',
+        Writable => 'int32u',
+        ValueConv => '$val / 100',
+        ValueConvInv => '$val * 100',
+    },
+    0xf002 => {
+        Name => 'SceneModeUsed',
+        Writable => 'int32u',
+        PrintConv => \%sceneModeUsed,
+    },
+    0xf006 => {
+        Name => 'OpticalZoom',
+        Writable => 'int32u',
+        ValueConv => '$val / 100',
+        ValueConvInv => '$val * 100',
+        PrintConv => 'sprintf("%.2f",$val)',
+        PrintConvInv => '$val=~s/ ?x//; $val',
+    },
+    # 0xf009 - some sort of FNumber (x 100)
+    0xf103 => {
+        Name => 'FNumber',
+        Writable => 'int32u',
+        Priority => 0,
+        ValueConv => '$val / 100',
+        ValueConvInv => '$val * 100',
+    },
+    0xf104 => {
+        Name => 'ExposureTime',
+        Writable => 'int32u',
+        Priority => 0,
+        ValueConv => '$val / 1e6',
+        ValueConvInv => '$val * 1e6',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    0xf105 => {
+        Name => 'ISO',
+        Writable => 'int32u',
+        Priority => 0,
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+    },
+);
+
+# Kodak SubIFD3 tags (ref PH)
+%Image::ExifTool::Kodak::SubIFD3 = (
+    PROCESS_PROC => \&ProcessKodakIFD,
+    WRITE_PROC => \&WriteKodakIFD,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0x1000 => {
+        Name => 'OpticalZoom',
+        Writable => 'int16u',
+        ValueConv => '$val / 100',
+        ValueConvInv => '$val * 100',
+        PrintConv => 'sprintf("%.2f",$val)',
+        PrintConvInv => '$val=~s/ ?x//; $val',
+    },
+    # 0x1002 - related to focal length (1=wide, 32=full zoom)
+    # 0x1006 - pictures remaining? (gradually decreases as pictures are taken)
+#
+# the following unknown Kodak tags in subIFD3 may store an IFD count of 0 or 1 instead
+# of the correct value (which changes from model to model).  This bad count is fixed
+# with the "FixCount" patch.  Models known to have this problem include:
+# M380, M1033, M1093IS, V1073, V1233, V1253, V1273, V1275, V1285, Z612, Z712,
+# Z812, Z885, Z915, Z950, Z1012IS, Z1085IS, ZD710
+#
+    0x2007 => {
+        Name => 'Kodak_SubIFD3_0x2007',
+        Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
+    },
+    0x2008 => {
+        Name => 'Kodak_SubIFD3_0x2008',
+        Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
+    },
+    0x2009 => {
+        Name => 'Kodak_SubIFD3_0x2009',
+        Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
+    },
+    0x200a => {
+        Name => 'Kodak_SubIFD3_0x200a',
+        Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
+    },
+    0x200b => {
+        Name => 'Kodak_SubIFD3_0x200b',
+        Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
+    },
+    0x3020 => {
+        Name => 'Kodak_SubIFD3_0x3020',
+        Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
+    },
+    0x3030 => {
+        Name => 'Kodak_SubIFD3_0x3030',
+        Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
+    },
+    0x3040 => {
+        Name => 'Kodak_SubIFD3_0x3040',
+        Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
+    },
+    0x3050 => {
+        Name => 'Kodak_SubIFD3_0x3050',
+        Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
+    },
+    0x3060 => {
+        Name => 'Kodak_SubIFD3_0x3060',
+        Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
+    },
+    0x8001 => {
+        Name => 'Kodak_SubIFD3_0x8001',
+        Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
+    },
+    0x8002 => {
+        Name => 'Kodak_SubIFD3_0x8002',
+        Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
+    },
+    0x8003 => {
+        Name => 'Kodak_SubIFD3_0x8003',
+        Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
+    },
+    0x8004 => {
+        Name => 'Kodak_SubIFD3_0x8004',
+        Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
+    },
+    0x8005 => {
+        Name => 'Kodak_SubIFD3_0x8005',
+        Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
+    },
+    0x8006 => {
+        Name => 'Kodak_SubIFD3_0x8006',
+        Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
+    },
+    0x8007 => {
+        Name => 'Kodak_SubIFD3_0x8007',
+        Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
+    },
+    0x8008 => {
+        Name => 'Kodak_SubIFD3_0x8008',
+        Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
+    },
+    0x8009 => {
+        Name => 'Kodak_SubIFD3_0x8009',
+        Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
+    },
+    0x800a => {
+        Name => 'Kodak_SubIFD3_0x800a',
+        Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
+    },
+    0x800b => {
+        Name => 'Kodak_SubIFD3_0x800b',
+        Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
+    },
+    0x800c => {
+        Name => 'Kodak_SubIFD3_0x800c',
+        Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
+    },
+);
+
+# Kodak SubIFD4 tags (ref PH)
+%Image::ExifTool::Kodak::SubIFD4 = (
+    PROCESS_PROC => \&ProcessKodakIFD,
+    WRITE_PROC => \&WriteKodakIFD,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+);
+
+# Kodak SubIFD5 tags (ref PH)
+%Image::ExifTool::Kodak::SubIFD5 = (
+    PROCESS_PROC => \&ProcessKodakIFD,
+    WRITE_PROC => \&WriteKodakIFD,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0x000f => {
+        Name => 'OpticalZoom',
+        Writable => 'int16u',
+        ValueConv => '$val / 100',
+        ValueConvInv => '$val * 100',
+        PrintConv => 'sprintf("%.2f",$val)',
+        PrintConvInv => '$val=~s/ ?x//; $val',
+    },
+);
+
+# Kodak SubIFD6 tags (ref PH)
+%Image::ExifTool::Kodak::SubIFD6 = (
+    PROCESS_PROC => \&ProcessKodakIFD,
+    WRITE_PROC => \&WriteKodakIFD,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'SubIFD6 is written by the M580.',
+);
+
+# Decoded from P712, P850 and P880 samples (ref PH)
+%Image::ExifTool::Kodak::CameraInfo = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'These tags are used by the  P712, P850 and P880.',
+    0xf900 => {
+        Name => 'SensorWidth',
+        Writable => 'int16u',
+        Notes => 'effective sensor size',
+    },
+    0xf901 => {
+        Name => 'SensorHeight',
+        Writable => 'int16u',
+    },
+    0xf902 => {
+        Name => 'BayerPattern',
+        Writable => 'string',
+    },
+    0xf903 => {
+        Name => 'SensorFullWidth',
+        Writable => 'int16u',
+        Notes => 'includes black border?',
+    },
+    0xf904 => {
+        Name => 'SensorFullHeight',
+        Writable => 'int16u',
+    },
+    0xf907 => {
+        Name => 'KodakImageWidth',
+        Writable => 'int16u',
+    },
+    0xf908 => {
+        Name => 'KodakImageHeight',
+        Writable => 'int16u',
+    },
+    0xfa00 => {
+        Name => 'KodakInfoType',
+        Writable => 'string',
+    },
+    0xfa04 => {
+        Name => 'SerialNumber', # (unverified)
+        Writable => 'string',
+    },
+    0xfd04 => {
+        Name => 'FNumber',
+        Writable => 'int16u',
+        Priority => 0,
+        ValueConv => '$val / 100',
+        ValueConvInv => '$val * 100',
+    },
+    0xfd05 => {
+        Name => 'ExposureTime',
+        Writable => 'int32u',
+        Priority => 0,
+        ValueConv => '$val / 1e6',
+        ValueConvInv => '$val * 1e6',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    0xfd06 => {
+        Name => 'ISO',
+        Writable => 'int16u',
+        Priority => 0,
+    },
+);
+
+# treat unknown maker notes as binary data (allows viewing with -U)
+%Image::ExifTool::Kodak::Unknown = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    FIRST_ENTRY => 0,
+);
+
+# tags found in the KodakIFD (in IFD0 of KDC, DCR, TIFF and JPEG images) (ref PH)
+%Image::ExifTool::Kodak::IFD = (
+    GROUPS => { 0 => 'MakerNotes', 1 => 'KodakIFD', 2 => 'Image'},
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    WRITE_GROUP => 'KodakIFD',
+    SET_GROUP1 => 1,
+    NOTES => q{
+        These tags are found in a separate IFD of JPEG, TIFF, DCR and KDC images
+        from some older Kodak models such as the DC50, DC120, DCS760C, DCS Pro 14N,
+        14nx, SLR/n, Pro Back and Canon EOS D2000.
+    },
+    # 0x0000: int8u[4]    - values: "1 0 0 0" (DC50), "1 1 0 0" (DC120)
+    0x0001 => {
+        # (related to EV but exact meaning unknown)
+        Name => 'UnknownEV',
+        Writable => 'rational64u',
+        Unknown => 1,
+    },
+    # 0x0002: int8u       - values: 0
+    0x0003 => {
+        Name => 'ExposureValue',
+        Writable => 'rational64u',
+    },
+    # 0x0004: rational64u - values: 2.875,3.375,3.625,4,4.125,7.25
+    # 0x0005: int8u       - values: 0
+    # 0x0006: int32u[12]  - ?
+    # 0x0007: int32u[3]   - values: "65536 67932 69256"
+    0x03e9 => { Name => 'OriginalFileName', Writable => 'string' },
+    0x03eb => 'SensorLeftBorder',
+    0x03ec => 'SensorTopBorder',
+    0x03ed => 'SensorImageWidth',
+    0x03ee => 'SensorImageHeight',
+    0x03f1 => {
+        Name => 'TextualInfo',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::TextualInfo',
+        },
+    },
+    0x03fc => { #3
+        Name => 'WhiteBalance',
+        Writable => 'int16u',
+        Priority => 0,
+        PrintConv => { },   # no values yet known
+    },
+    0x03fd => { #3
+        Name => 'Processing',
+        Condition => '$count == 72',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::Processing',
+        },
+    },
+    0x0401 => {
+        Name => 'Time',
+        Groups => { 2 => 'Time' },
+        Writable => 'string',
+    },
+    0x0414 => { Name => 'NCDFileInfo',      Writable => 'string' },
+    0x0846 => { #3
+        Name => 'ColorTemperature',
+        Writable => 'int16u',
+    },
+    0x0852 => 'WB_RGBMul0', #3
+    0x0853 => 'WB_RGBMul1', #3
+    0x0854 => 'WB_RGBMul2', #3
+    0x0855 => 'WB_RGBMul3', #3
+    0x085c => { Name => 'WB_RGBCoeffs0', Binary => 1 }, #3
+    0x085d => { Name => 'WB_RGBCoeffs1', Binary => 1 }, #3
+    0x085e => { Name => 'WB_RGBCoeffs2', Binary => 1 }, #3
+    0x085f => { Name => 'WB_RGBCoeffs3', Binary => 1 }, #3
+    # 0x090d: linear table (ref 3)
+    # 0x0c81: some sort of date (manufacture date?) - PH
+    0x0ce5 => { Name => 'FirmwareVersion',  Writable => 'string' },
+    # 0x1390: value: "DCSProSLRn" (tone curve name?) - PH
+    0x1391 => { Name => 'ToneCurveFileName',Writable => 'string' },
+    0x1784 => { Name => 'ISO',              Writable => 'int32u' }, #3
+);
+
+# contains WB adjust set in software (ref 3)
+%Image::ExifTool::Kodak::Processing = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    FORMAT => 'int16u',
+    FIRST_ENTRY => 0,
+    20 => {
+        Name => 'WB_RGBLevels',
+        Format => 'int16u[3]',
+        ValueConv => q{
+            my @a = split ' ',$val;
+            foreach (@a) {
+                $_ = 2048 / $_ if $_;
+            }
+            return join ' ', @a;
+        }
+    },
+);
+
+# tags found in the Kodak KDC_IFD (in IFD0 of KDC images) (ref 3)
+%Image::ExifTool::Kodak::KDC_IFD = (
+    GROUPS => { 0 => 'MakerNotes', 1 => 'KDC_IFD', 2 => 'Image'},
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    WRITE_GROUP => 'KDC_IFD',
+    SET_GROUP1 => 1,
+    NOTES => q{
+        These tags are found in a separate IFD of KDC images from some newer Kodak
+        models such as the P880 and Z1015IS.
+    },
+    0xfa00 => {
+        Name => 'SerialNumber', #PH (unverified)
+        Writable => 'string',
+    },
+    0xfa0d => {
+        Name => 'WhiteBalance',
+        Writable => 'int8u',
+        PrintConv => { #PH
+            0 => 'Auto',
+            1 => 'Fluorescent', # (NC)
+            2 => 'Tungsten', # (NC)
+            3 => 'Daylight', # (NC)
+            6 => 'Shade', # (NC, called "Open Shade" by Kodak)
+        },
+    },
+    # the following tags are numbered for use in the Composite tag lookup
+    0xfa25 => 'WB_RGBLevelsAuto',
+    0xfa27 => 'WB_RGBLevelsTungsten', # (NC)
+    0xfa28 => 'WB_RGBLevelsFluorescent', # (NC)
+    0xfa29 => 'WB_RGBLevelsDaylight', # (NC)
+    0xfa2a => 'WB_RGBLevelsShade', # (NC)
+);
+
+# textual-based Kodak TextualInfo tags (not found in KDC images) (ref PH)
+%Image::ExifTool::Kodak::TextualInfo = (
+    GROUPS => { 0 => 'MakerNotes', 1 => 'Kodak', 2 => 'Image'},
+    PROCESS_PROC => \&ProcessKodakText,
+    NOTES => q{
+        Below is a list of tags which have been observed in the Kodak TextualInfo
+        data, however ExifTool will extract information from any tags found here.
+    },
+    'Actual Compensation' => 'ActualCompensation',
+    'AF Function'   => 'AFMode', # values: "S" (=Single?, then maybe C for Continuous, M for Manual?) - PH
+    'Aperture'      => {
+        Name => 'Aperture',
+        ValueConv => '$val=~s/^f//i; $val',
+    },
+    'Auto Bracket'  => 'AutoBracket',
+    'Brightness Value' => 'BrightnessValue',
+    'Camera'        => 'CameraModel',
+    'Camera body'   => 'CameraBody',
+    'Compensation'  => 'ExposureCompensation',
+    'Date'          => {
+        Name => 'Date',
+        Groups => { 2 => 'Time' },
+    },
+    'Exposure Bias' => 'ExposureBias',
+    'Exposure Mode' => {
+        Name => 'ExposureMode',
+        PrintConv => {
+            'M' => 'Manual',
+            'A' => 'Aperture Priority', #(NC -- I suppose this could be "Auto" too)
+            'S' => 'Shutter Priority', #(NC)
+            'P' => 'Program', #(NC)
+            'B' => 'Bulb', #(NC)
+            # have seen "Manual (M)" written by DCS760C - PH
+        },
+    },
+    'Firmware Version' => 'FirmwareVersion',
+    'Flash Compensation' => 'FlashExposureComp',
+    'Flash Fired'   => 'FlashFired',
+    'Flash Sync Mode' => 'FlashSyncMode',
+    'Focal Length'  => {
+        Name => 'FocalLength',
+        PrintConv => '"$val mm"',
+    },
+    'Height'        => 'KodakImageHeight',
+    'Image Number'  => 'ImageNumber',
+    'ISO'           => 'ISO',
+    'ISO Speed'     => 'ISO',
+    'Max Aperture'  => {
+        Name => 'MaxAperture',
+        ValueConv => '$val=~s/^f//i; $val',
+    },
+    'Meter Mode'    => 'MeterMode',
+    'Min Aperture'  => {
+        Name => 'MinAperture',
+        ValueConv => '$val=~s/^f//i; $val',
+    },
+    'Popup Flash'   => 'PopupFlash',
+    'Serial Number' => 'SerialNumber',
+    'Shooting Mode' => 'ShootingMode',
+    'Shutter'       => 'ShutterSpeed',
+    'Temperature'   => 'Temperature', # with a value of 15653, what could this be? - PH
+    'Time'          => {
+        Name => 'Time',
+        Groups => { 2 => 'Time' },
+    },
+    'White balance' => 'WhiteBalance',
+    'Width'         => 'KodakImageWidth',
+    '_other_info'   => {
+        Name => 'OtherInfo',
+        Notes => 'any other information without a tag name',
+    },
+);
+
+# Kodak APP3 "Meta" tags (ref 2)
+%Image::ExifTool::Kodak::Meta = (
+    GROUPS => { 0 => 'Meta', 1 => 'MetaIFD', 2 => 'Image'},
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    WRITE_GROUP => 'MetaIFD',   # default write group
+    NOTES => q{
+        These tags are found in the APP3 "Meta" segment of JPEG images from Kodak
+        cameras such as the DC280, DC3400, DC5000, MC3, M580, Z950 and Z981.  The
+        structure of this segment is similar to the APP1 "Exif" segment, but a
+        different set of tags is used.
+    },
+    0xc350 => 'FilmProductCode',
+    0xc351 => 'ImageSourceEK',
+    0xc352 => 'CaptureConditionsPAR',
+    0xc353 => {
+        Name => 'CameraOwner',
+        Writable => 'undef',
+        RawConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val)',
+        RawConvInv => 'Image::ExifTool::Exif::EncodeExifText($self,$val)',
+    },
+    0xc354 => {
+        Name => 'SerialNumber',
+        Writable => 'undef',
+        Groups => { 2 => 'Camera' },
+        RawConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val)', #PH
+        RawConvInv => 'Image::ExifTool::Exif::EncodeExifText($self,$val)',
+    },
+    0xc355 => 'UserSelectGroupTitle',
+    0xc356 => 'DealerIDNumber',
+    0xc357 => 'CaptureDeviceFID',
+    0xc358 => 'EnvelopeNumber',
+    0xc359 => 'FrameNumber',
+    0xc35a => 'FilmCategory',
+    0xc35b => 'FilmGencode',
+    0xc35c => 'ModelAndVersion',
+    0xc35d => 'FilmSize',
+    0xc35e => 'SBA_RGBShifts',
+    0xc35f => 'SBAInputImageColorspace',
+    0xc360 => 'SBAInputImageBitDepth',
+    0xc361 => {
+        Name => 'SBAExposureRecord',
+        Binary => 1,
+    },
+    0xc362 => {
+        Name => 'UserAdjSBA_RGBShifts',
+        Binary => 1,
+    },
+    0xc363 => 'ImageRotationStatus',
+    0xc364 => 'RollGuidElements',
+    0xc365 => 'MetadataNumber',
+    0xc366 => 'EditTagArray',
+    0xc367 => 'Magnification',
+    0xc36c => 'NativeXResolution',
+    0xc36d => 'NativeYResolution',
+    0xc36e => {
+        Name => 'KodakEffectsIFD',
+        Flags => 'SubIFD',
+        Groups => { 1 => 'KodakEffectsIFD' },
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::SpecialEffects',
+            Start => '$val',
+        },
+    },
+    0xc36f => {
+        Name => 'KodakBordersIFD',
+        Flags => 'SubIFD',
+        Groups => { 1 => 'KodakBordersIFD' },
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::Borders',
+            Start => '$val',
+        },
+    },
+    0xc37a => 'NativeResolutionUnit',
+    0xc418 => 'SourceImageDirectory',
+    0xc419 => 'SourceImageFileName',
+    0xc41a => 'SourceImageVolumeName',
+    0xc46c => 'PrintQuality',
+    0xc46e => 'ImagePrintStatus',
+);
+
+# Kodak APP3 "Meta" Special Effects sub-IFD (ref 2)
+%Image::ExifTool::Kodak::SpecialEffects = (
+    GROUPS => { 0 => 'Meta', 1 => 'KodakEffectsIFD', 2 => 'Image'},
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    0 => 'DigitalEffectsVersion',
+    1 => {
+        Name => 'DigitalEffectsName',
+        PrintConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val)',
+    },
+    2 => 'DigitalEffectsType',
+);
+
+# Kodak APP3 "Meta" Borders sub-IFD (ref 2)
+%Image::ExifTool::Kodak::Borders = (
+    GROUPS => { 0 => 'Meta', 1 => 'KodakBordersIFD', 2 => 'Image'},
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    0 => 'BordersVersion',
+    1 => {
+        Name => 'BorderName',
+        PrintConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val)',
+    },
+    2 => 'BorderID',
+    3 => 'BorderLocation',
+    4 => 'BorderType',
+    8 => 'WatermarkType',
+);
+
+# tags in Kodak MOV videos (ref PH)
+# (similar information in Kodak,Minolta,Nikon,Olympus,Pentax and Sanyo videos)
+%Image::ExifTool::Kodak::MOV = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    FIRST_ENTRY => 0,
+    NOTES => 'This information is found in Kodak MOV videos from models such as the P880.',
+    0 => {
+        Name => 'Make',
+        Format => 'string[21]',
+    },
+    0x16 => {
+        Name => 'Model',
+        Format => 'string[42]',
+    },
+    0x40 => {
+        Name => 'ModelType',
+        Format => 'string[8]',
+    },
+    # (01 00 at offset 0x48)
+    0x4e => {
+        Name => 'ExposureTime',
+        Format => 'int32u',
+        ValueConv => '$val ? 10 / $val : 0',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+    },
+    0x52 => {
+        Name => 'FNumber',
+        Format => 'rational64u',
+        PrintConv => 'sprintf("%.1f",$val)',
+    },
+    0x5a => {
+        Name => 'ExposureCompensation',
+        Format => 'rational64s',
+        PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
+    },
+    # 0x6c => 'WhiteBalance', ?
+    0x70 => {
+        Name => 'FocalLength',
+        Format => 'rational64u',
+        PrintConv => 'sprintf("%.1f mm",$val)',
+    },
+);
+
+# Kodak composite tags
+%Image::ExifTool::Kodak::Composite = (
+    GROUPS => { 2 => 'Camera' },
+    DateCreated => {
+        Groups => { 2 => 'Time' },
+        Require => {
+            0 => 'Kodak:YearCreated',
+            1 => 'Kodak:MonthDayCreated',
+        },
+        ValueConv => '"$val[0]:$val[1]"',
+    },
+    WB_RGBLevels => {
+        Require => {
+            0 => 'KDC_IFD:WhiteBalance',
+        },
+        # indices of the following entries are KDC_IFD:WhiteBalance + 1
+        Desire => {
+            1 => 'WB_RGBLevelsAuto',
+            2 => 'WB_RGBLevelsFluorescent',
+            3 => 'WB_RGBLevelsTungsten',
+            4 => 'WB_RGBLevelsDaylight',
+            5 => 'WB_RGBLevels4',
+            6 => 'WB_RGBLevels5',
+            7 => 'WB_RGBLevelsShade',
+        },
+        ValueConv => '$val[$val[0] + 1]',
+    },
+    WB_RGBLevels2 => {
+        Name => 'WB_RGBLevels',
+        Require => {
+            0 => 'KodakIFD:WhiteBalance',
+            1 => 'WB_RGBMul0',
+            2 => 'WB_RGBMul1',
+            3 => 'WB_RGBMul2',
+            4 => 'WB_RGBMul3',
+            5 => 'WB_RGBCoeffs0',
+            6 => 'WB_RGBCoeffs1',
+            7 => 'WB_RGBCoeffs2',
+            8 => 'WB_RGBCoeffs3',
+        },
+        # indices of the following entries are KDC_IFD:WhiteBalance + 1
+        Desire => {
+            9 => 'KodakIFD:ColorTemperature',
+            10 => 'Kodak:WB_RGBLevels',
+        },
+        ValueConv => 'Image::ExifTool::Kodak::CalculateRGBLevels(@val)',
+    },
+);
+
+# add our composite tags
+Image::ExifTool::AddCompositeTags('Image::ExifTool::Kodak');
+
+#------------------------------------------------------------------------------
+# Calculate RGB levels from associated tags (ref 3)
+# Inputs: 0) KodakIFD:WhiteBalance, 1-4) WB_RGBMul0-3, 5-8) WB_RGBCoeffs0-3
+#         9) (optional) KodakIFD:ColorTemperature, 10) (optional) Kodak:WB_RGBLevels
+# Returns: WB_RGBLevels or undef
+sub CalculateRGBLevels(@)
+{
+    return undef if $_[10]; # use existing software levels if they exist
+    my $wbi = $_[0];
+    return undef if $wbi < 0 or $wbi > 3;
+    my @mul = split ' ', $_[$wbi + 1], 13; # (only use the first 12 coeffs)
+    my @coefs = split ' ', ${$_[$wbi + 5]}; # (extra de-reference for Binary data)
+    my $wbtemp100 = ($_[9] || 6500) / 100;
+    return undef unless @mul >= 3 and @coefs >= 12;
+    my ($i, $c, $n, $num, @cam_mul);
+    for ($c=$n=0; $c<3; ++$c) {
+        for ($num=$i=0; $i<4; ++$i) {
+            $num += $coefs[$n++] * ($wbtemp100 ** $i);
+        }
+        $cam_mul[$c] = 2048 / ($num * $mul[$c]);
+    }
+    return join(' ', @cam_mul);
+}
+
+#------------------------------------------------------------------------------
+# Process Kodak textual TextualInfo
+# Inputs: 0) ExifTool object ref, 1) dirInfo hash ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessKodakText($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dirStart = $$dirInfo{DirStart} || 0;
+    my $dirLen = $$dirInfo{DirLen} || length($$dataPt) - $dirStart;
+    my $data = substr($$dataPt, $dirStart, $dirLen);
+    $data =~ s/\0.*//s;     # truncate at null if it exists
+    my @lines = split /[\n\r]+/, $data;
+    my ($line, $success, @other, $tagInfo);
+    $exifTool->VerboseDir('Kodak Text');
+    foreach $line (@lines) {
+        if ($line =~ /(.*?):\s*(.*)/) {
+            my ($tag, $val) = ($1, $2);
+            if ($$tagTablePtr{$tag}) {
+                $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+            } else {
+                my $tagName = $tag;
+                $tagName =~ s/([A-Z])\s+([A-Za-z])/${1}_\U$2/g;
+                $tagName =~ s/([a-z])\s+([A-Za-z0-9])/${1}\U$2/g;
+                $tagName =~ s/\s+//g;
+                $tagName =~ s/[^-\w]+//g;   # delete remaining invalid characters
+                $tagName = 'NoName' unless $tagName;
+                $tagInfo = { Name => $tagName };
+                Image::ExifTool::AddTagToTable($tagTablePtr, $tag, $tagInfo);
+            }
+            $exifTool->HandleTag($tagTablePtr, $tag, $val, TagInfo => $tagInfo);
+            $success = 1;
+        } else {
+            # strip off leading/trailing white space and ignore blank lines
+            push @other, $1 if $line =~ /^\s*(\S.*?)\s*$/;
+        }
+    }
+    if ($success) {
+        if (@other) {
+            $tagInfo = $exifTool->GetTagInfo($tagTablePtr, '_other_info');
+            $exifTool->FoundTag($tagInfo, \@other);
+        }
+    } else {
+        $exifTool->Warn("Can't parse Kodak TextualInfo data", 1);
+    }
+    return $success;
+}
+
+#------------------------------------------------------------------------------
+# Process Kodak IFD (with leading byte order mark)
+# Inputs: 0) ExifTool object ref, 1) dirInfo hash ref, 2) tag table ref
+# Returns: 1 on success, otherwise returns 0 and sets a Warning
+sub ProcessKodakIFD($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dirStart = $$dirInfo{DirStart} || 0;
+    return 1 if $dirStart <= 0 or $dirStart + 2 > $$dirInfo{DataLen};
+    my $byteOrder = substr(${$$dirInfo{DataPt}}, $dirStart, 2);
+    unless (Image::ExifTool::SetByteOrder($byteOrder)) {
+        $exifTool->Warn("Invalid Kodak $$dirInfo{Name} directory");
+        return 1;
+    }
+    $$dirInfo{DirStart} += 2;   # skip byte order mark
+    $$dirInfo{DirLen} -= 2;
+    if ($exifTool->{HTML_DUMP}) {
+        my $base = $$dirInfo{Base} + $$dirInfo{DataPos};
+        $exifTool->HDump($dirStart+$base, 2, "Byte Order Mark");
+    }
+    return Image::ExifTool::Exif::ProcessExif($exifTool, $dirInfo, $tagTablePtr);
+}
+
+#------------------------------------------------------------------------------
+# Write Kodak IFD (with leading byte order mark)
+# Inputs: 0) ExifTool object ref, 1) source dirInfo ref, 2) tag table ref
+# Returns: Exif data block (may be empty if no Exif data) or undef on error
+sub WriteKodakIFD($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dirStart = $$dirInfo{DirStart} || 0;
+    return '' if $dirStart <= 0 or $dirStart + 2 > $$dirInfo{DataLen};
+    my $byteOrder = substr(${$$dirInfo{DataPt}}, $dirStart, 2);
+    return '' unless Image::ExifTool::SetByteOrder($byteOrder);
+    $$dirInfo{DirStart} += 2;   # skip byte order mark
+    $$dirInfo{DirLen} -= 2;
+    my $buff = Image::ExifTool::Exif::WriteExif($exifTool, $dirInfo, $tagTablePtr);
+    return $buff unless defined $buff and length $buff;
+    # apply one-time fixup for length of byte order mark
+    if ($$dirInfo{Fixup}) {
+        $dirInfo->{Fixup}->{Shift} += 2;
+        $$dirInfo{Fixup}->ApplyFixup(\$buff);
+        delete $$dirInfo{Fixup};
+    }
+    return Image::ExifTool::GetByteOrder() . $buff;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Kodak - Kodak EXIF maker notes and APP3 "Meta" tags
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to
+interpret Kodak maker notes EXIF meta information.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<Image::MetaData::JPEG|Image::MetaData::JPEG>
+
+=item L<http://www.ozhiker.com/electronics/pjmt/jpeg_info/meta.html>
+
+=item L<http://www.cybercom.net/~dcoffin/dcraw/>
+
+=item (...plus lots of testing with my daughter's CX4200!)
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/Kodak Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/KyoceraRaw.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/KyoceraRaw.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/KyoceraRaw.pm	(revision 24799)
@@ -0,0 +1,173 @@
+#------------------------------------------------------------------------------
+# File:         KyoceraRaw.pm
+#
+# Description:  Read Kyocera RAW meta information
+#
+# Revisions:    02/17/2006 - P. Harvey Created
+#
+# References:   1) http://www.cybercom.net/~dcoffin/dcraw/
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::KyoceraRaw;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.02';
+
+sub ProcessRAW($$);
+
+# utility to reverse order of characters in a string
+sub ReverseString($) { pack('C*',reverse unpack('C*',shift)) }
+
+# Contax N Digital tags (ref PH)
+%Image::ExifTool::KyoceraRaw::Main = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'Tags for Kyocera Contax N Digital RAW images.',
+    0x01 => {
+        Name => 'FirmwareVersion',
+        Format => 'string[10]',
+        ValueConv => \&ReverseString,
+    },
+    0x0c => {
+        Name => 'Model',
+        Format => 'string[12]',
+        ValueConv => \&ReverseString,
+    },
+    0x19 => { #1
+        Name => 'Make',
+        Format => 'string[7]',
+        ValueConv => \&ReverseString,
+    },
+    0x21 => { #1
+        Name => 'DateTimeOriginal',
+        Description => 'Date/Time Original',
+        Groups => { 2 => 'Time' },
+        Format => 'string[20]',
+        ValueConv => \&ReverseString,
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    0x34 => {
+        Name => 'ISO',
+        Groups => { 2 => 'Image' },
+        Format => 'int32u',
+        PrintConv => {
+            7 => 25,
+            8 => 32,
+            9 => 40,
+            10 => 50,
+            11 => 64,
+            12 => 80,
+            13 => 100,
+            14 => 125,
+            15 => 160,
+            16 => 200,
+            17 => 250,
+            18 => 320,
+            19 => 400,
+        },
+    },
+    0x38 => {
+        Name => 'ExposureTime',
+        Groups => { 2 => 'Image' },
+        Format => 'int32u',
+        ValueConv => '2**($val / 8) / 16000',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+    },
+    0x3c => { #1
+        Name => 'WB_RGGBLevels',
+        Groups => { 2 => 'Image' },
+        Format => 'int32u[4]',
+    },
+    0x58 => {
+        Name => 'FNumber',
+        Groups => { 2 => 'Image' },
+        Format => 'int32u',
+        ValueConv => '2**($val/16)',
+        PrintConv => 'sprintf("%.2g",$val)',
+    },
+    0x68 => {
+        Name => 'MaxAperture',
+        Format => 'int32u',
+        ValueConv => '2**($val/16)',
+        PrintConv => 'sprintf("%.2g",$val)',
+    },
+    0x70 => {
+        Name => 'FocalLength',
+        Format => 'int32u',
+        PrintConv => '"$val mm"',
+    },
+    0x7c => {
+        Name => 'Lens',
+        Format => 'string[32]',
+    },
+);
+
+#------------------------------------------------------------------------------
+# Extract information from Kyocera RAW image
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 if this was a valid Kyocera RAW image
+sub ProcessRAW($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my $size = 156; # size of header
+    my $buff;
+
+    $raf->Read($buff, $size) == $size or return 0;
+    # validate Make string ('KYOCERA' reversed)
+    substr($buff, 0x19, 7) eq 'ARECOYK' or return 0;
+    $exifTool->SetFileType();
+    SetByteOrder('MM');
+    my %dirInfo = (
+        DataPt => \$buff,
+        DataPos => 0,
+        DataLen => $size,
+        DirStart => 0,
+        DirLen => $size,
+    );
+    my $tagTablePtr = GetTagTable('Image::ExifTool::KyoceraRaw::Main');
+    $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::KyoceraRaw - Read Kyocera RAW meta information
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to read
+meta information from Kyocera Contax N Digital RAW images.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.cybercom.net/~dcoffin/dcraw/>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/KyoceraRaw Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/LNK.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/LNK.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/LNK.pm	(revision 24799)
@@ -0,0 +1,722 @@
+#------------------------------------------------------------------------------
+# File:         LNK.pm
+#
+# Description:  Read meta information from MS Shell Link files
+#
+# Revisions:    2009/09/19 - P. Harvey Created
+#
+# References:   1) http://msdn.microsoft.com/en-us/library/dd871305(PROT.10).aspx
+#               2) http://www.i2s-lab.com/Papers/The_Windows_Shortcut_File_Format.pdf
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::LNK;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.03';
+
+sub ProcessItemID($$$);
+sub ProcessLinkInfo($$$);
+
+# Information extracted from LNK (Windows Shortcut) files
+%Image::ExifTool::LNK::Main = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Other' },
+    NOTES => 'Information extracted from MS Shell Link (Windows shortcut) files.',
+    # maybe the Flags aren't very useful to the user (since they are
+    # mainly structural), but extract them anyway for completeness
+    0x14 => {
+        Name => 'Flags',
+        Format => 'int32u',
+        PrintConv => { BITMASK => {
+            0 => 'IDList',
+            1 => 'LinkInfo',
+            2 => 'Description',
+            3 => 'RelativePath',
+            4 => 'WorkingDir',
+            5 => 'CommandArgs',
+            6 => 'IconFile',
+            7 => 'Unicode',
+            8 => 'NoLinkInfo',
+            9 => 'ExpString',
+            10 => 'SeparateProc',
+            12 => 'DarwinID',
+            13 => 'RunAsUser',
+            14 => 'ExpIcon',
+            15 => 'NoPidAlias',
+            17 => 'RunWithShim',
+            18 => 'NoLinkTrack',
+            19 => 'TargetMetadata',
+            20 => 'NoLinkPathTracking',
+            21 => 'NoKnownFolderTracking',
+            22 => 'NoKnownFolderAlias',
+            23 => 'LinkToLink',
+            24 => 'UnaliasOnSave',
+            25 => 'PreferEnvPath',
+            26 => 'KeepLocalIDList',
+        }},
+    },
+    0x18 => {
+        Name => 'FileAttributes',
+        Format => 'int32u',
+        PrintConv => { BITMASK => {
+            0 => 'Read-only',
+            1 => 'Hidden',
+            2 => 'System',
+            3 => 'Volume', #(not used)
+            4 => 'Directory',
+            5 => 'Archive',
+            6 => 'Encrypted?', #(ref 2, not used in XP)
+            7 => 'Normal',
+            8 => 'Temporary',
+            9 => 'Sparse',
+            10 => 'Reparse point',
+            11 => 'Compressed',
+            12 => 'Offline',
+            13 => 'Not indexed',
+            14 => 'Encrypted',
+        }},
+    },
+    0x1c => {
+        Name => 'CreateDate',
+        Format => 'int64u',
+        Groups => { 2 => 'Time' },
+        # convert time from 100-ns intervals since Jan 1, 1601
+        RawConv => '$val ? $val : undef',
+        ValueConv => '$val=$val/1e7-11644473600; ConvertUnixTime($val,1)',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    0x24 => {
+        Name => 'AccessDate',
+        Format => 'int64u',
+        Groups => { 2 => 'Time' },
+        RawConv => '$val ? $val : undef',
+        ValueConv => '$val=$val/1e7-11644473600; ConvertUnixTime($val,1)',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    0x2c => {
+        Name => 'ModifyDate',
+        Format => 'int64u',
+        Groups => { 2 => 'Time' },
+        RawConv => '$val ? $val : undef',
+        ValueConv => '$val=$val/1e7-11644473600; ConvertUnixTime($val,1)',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    0x34 => {
+        Name => 'TargetFileSize',
+        Format => 'int32u',
+    },
+    0x38 => {
+        Name => 'IconIndex',
+        Format => 'int32u',
+        PrintConv => '$val ? $val : "(none)"',
+    },
+    0x3c => {
+        Name => 'RunWindow',
+        Format => 'int32u',
+        PrintConv => {
+            0 => 'Hide',
+            1 => 'Normal',
+            2 => 'Show Minimized',
+            3 => 'Show Maximized',
+            4 => 'Show No Activate',
+            5 => 'Show',
+            6 => 'Minimized',
+            7 => 'Show Minimized No Activate',
+            8 => 'Show NA',
+            9 => 'Restore',
+            10 => 'Show Default',
+        },
+    },
+    0x40 => {
+        Name => 'HotKey',
+        Format => 'int32u',
+        PrintHex => 1,
+        PrintConv => {
+            OTHER => sub {
+                my $val = shift;
+                my $ch = $val & 0xff;
+                if (chr $ch =~ /^[A-Z0-9]$/) {
+                    $ch = chr $ch;
+                } elsif ($ch >= 0x70 and $ch <= 0x87) {
+                    $ch = 'F' . ($ch - 0x6f);
+                } elsif ($ch == 0x90) {
+                    $ch = 'Num Lock';
+                } elsif ($ch == 0x91) {
+                    $ch = 'Scroll Lock';
+                } else {
+                    $ch = sprintf('Unknown (0x%x)', $ch);
+                }
+                $ch = "Alt-$ch" if $val & 0x400;
+                $ch = "Control-$ch" if $val & 0x200;
+                $ch = "Shift-$ch" if $val & 0x100;
+                return $ch;
+            },
+            0x00 => '(none)',
+            # these entries really only for documentation
+            0x90 => 'Num Lock',
+            0x91 => 'Scroll Lock',
+           "0x30'-'0x39" => "0-9",
+           "0x41'-'0x5a" => "A-Z",
+           "0x70'-'0x87" => "F1-F24",
+           0x100 => 'Shift',
+           0x200 => 'Control',
+           0x400 => 'Alt',
+        },
+    },
+    # note: tags 0x10xx are synthesized tag ID's
+    0x10000 => {
+        Name => 'ItemID',
+        SubDirectory => { TagTable => 'Image::ExifTool::LNK::ItemID' },
+    },
+    0x20000 => {
+        Name => 'LinkInfo',
+        SubDirectory => { TagTable => 'Image::ExifTool::LNK::LinkInfo' },
+    },
+    0x30004 => 'Description',
+    0x30008 => 'RelativePath',
+    0x30010 => 'WorkingDirectory',
+    0x30020 => 'CommandLineArguments',
+    0x30040 => 'IconFileName',
+    # note: tags 0xa000000x are actually ID's (not indices)
+    0xa0000000 => {
+        Name => 'UnknownData',
+        SubDirectory => { TagTable => 'Image::ExifTool::LNK::UnknownData' },
+    },
+    0xa0000001 => {
+        Name => 'EnvVarData',
+        SubDirectory => { TagTable => 'Image::ExifTool::LNK::UnknownData' },
+    },
+    0xa0000002 => {
+        Name => 'ConsoleData',
+        SubDirectory => { TagTable => 'Image::ExifTool::LNK::ConsoleData' },
+    },
+    0xa0000003 => {
+        Name => 'TrackerData',
+        SubDirectory => { TagTable => 'Image::ExifTool::LNK::TrackerData' },
+    },
+    0xa0000004 => {
+        Name => 'ConsoleFEData',
+        SubDirectory => { TagTable => 'Image::ExifTool::LNK::ConsoleFEData' },
+    },
+    0xa0000005 => {
+        Name => 'SpecialFolderData',
+        SubDirectory => { TagTable => 'Image::ExifTool::LNK::UnknownData' },
+    },
+    0xa0000006 => {
+        Name => 'DarwinData',
+        SubDirectory => { TagTable => 'Image::ExifTool::LNK::UnknownData' },
+    },
+    0xa0000007 => {
+        Name => 'IconEnvData',
+        SubDirectory => { TagTable => 'Image::ExifTool::LNK::UnknownData' },
+    },
+    0xa0000008 => {
+        Name => 'ShimData',
+        SubDirectory => { TagTable => 'Image::ExifTool::LNK::UnknownData' },
+    },
+    0xa0000009 => {
+        Name => 'PropertyStoreData',
+        SubDirectory => { TagTable => 'Image::ExifTool::LNK::UnknownData' },
+    },
+    0xa000000b => {
+        Name => 'KnownFolderData',
+        SubDirectory => { TagTable => 'Image::ExifTool::LNK::UnknownData' },
+    },
+    0xa000000c => {
+        Name => 'VistaIDListData',
+        SubDirectory => { TagTable => 'Image::ExifTool::LNK::UnknownData' },
+    },
+);
+
+%Image::ExifTool::LNK::ItemID = (
+    GROUPS => { 2 => 'Other' },
+    PROCESS_PROC => \&ProcessItemID,
+    # (can't find any documentation on these items)
+    0x0032 => { 
+        Name => 'Item0032',
+        SubDirectory => { TagTable => 'Image::ExifTool::LNK::Item0032' },
+    },
+);
+
+%Image::ExifTool::LNK::Item0032 = (
+    GROUPS => { 2 => 'Other' },
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    0x0e => {
+        Name => 'TargetFileDOSName',
+        Format => 'var_string',
+    },
+    #not at a fixed offset -- offset is given by last 2 bytes of the item + 0x14
+    #0x22 => {
+    #    Name => 'TargetFileName',
+    #    Format => 'var_ustring',
+    #},
+);
+
+%Image::ExifTool::LNK::LinkInfo = (
+    GROUPS => { 2 => 'Other' },
+    PROCESS_PROC => \&ProcessLinkInfo,
+    FORMAT => 'int32u',
+    VARS => { NO_ID => 1 },
+    VolumeID => { },
+    DriveType => {
+        PrintConv => {
+            0 => 'Unknown',
+            1 => 'Invalid Root Path',
+            2 => 'Removable Media',
+            3 => 'Fixed Disk',
+            4 => 'Remote Drive',
+            5 => 'CD-ROM',
+            6 => 'Ram Disk',
+        },
+    },
+    DriveSerialNumber => { },
+    VolumeLabel => { },
+    LocalBasePath => { },
+    CommonNetworkRelLink => { },
+    CommonPathSuffix => { },
+    NetName => { },
+    DeviceName => { },
+    NetProviderType => {
+        PrintHex => 1,
+        PrintConv => {
+            0x1a0000 => 'AVID',
+            0x1b0000 => 'DOCUSPACE',
+            0x1c0000 => 'MANGOSOFT',
+            0x1d0000 => 'SERNET',
+            0x1e0000 => 'RIVERFRONT1',
+            0x1f0000 => 'RIVERFRONT2',
+            0x200000 => 'DECORB',
+            0x210000 => 'PROTSTOR',
+            0x220000 => 'FJ_REDIR',
+            0x230000 => 'DISTINCT',
+            0x240000 => 'TWINS',
+            0x250000 => 'RDR2SAMPLE',
+            0x260000 => 'CSC',
+            0x270000 => '3IN1',
+            0x290000 => 'EXTENDNET',
+            0x2a0000 => 'STAC',
+            0x2b0000 => 'FOXBAT',
+            0x2c0000 => 'YAHOO',
+            0x2d0000 => 'EXIFS',
+            0x2e0000 => 'DAV',
+            0x2f0000 => 'KNOWARE',
+            0x300000 => 'OBJECT_DIRE',
+            0x310000 => 'MASFAX',
+            0x320000 => 'HOB_NFS',
+            0x330000 => 'SHIVA',
+            0x340000 => 'IBMAL',
+            0x350000 => 'LOCK',
+            0x360000 => 'TERMSRV',
+            0x370000 => 'SRT',
+            0x380000 => 'QUINCY',
+            0x390000 => 'OPENAFS',
+            0x3a0000 => 'AVID1',
+            0x3b0000 => 'DFS',
+        },
+    },
+);
+
+%Image::ExifTool::LNK::UnknownData = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Other' },
+);
+
+%Image::ExifTool::LNK::ConsoleData = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Other' },
+    0x08 => {
+        Name => 'FillAttributes',
+        Format => 'int16u',
+        PrintConv => 'sprintf("0x%.2x", $val)',
+    },
+    0x0a => {
+        Name => 'PopupFillAttributes',
+        Format => 'int16u',
+        PrintConv => 'sprintf("0x%.2x", $val)',
+    },
+    0x0c => {
+        Name => 'ScreenBufferSize',
+        Format => 'int16u[2]',
+        PrintConv => '$val=~s/ / x /; $val',
+    },
+    0x10 => {
+        Name => 'WindowSize',
+        Format => 'int16u[2]',
+        PrintConv => '$val=~s/ / x /; $val',
+    },
+    0x14 => {
+        Name => 'WindowOrigin',
+        Format => 'int16u[2]',
+        PrintConv => '$val=~s/ / x /; $val',
+    },
+    0x20 => {
+        Name => 'FontSize',
+        Format => 'int16u[2]',
+        PrintConv => '$val=~s/ / x /; $val',
+    },
+    0x24 => {
+        Name => 'FontFamily',
+        Format => 'int32u',
+        PrintHex => 1,
+        PrintConv => {
+            0 => "Don't Care",
+            0x10 => 'Roman',
+            0x20 => 'Swiss',
+            0x30 => 'Modern',
+            0x40 => 'Script',
+            0x50 => 'Decorative',
+        },
+    },
+    0x28 => {
+        Name => 'FontWeight',
+        Format => 'int32u',
+    },
+    0x2c => {
+        Name => 'FontName',
+        Format => 'undef[64]',
+        RawConv => q{
+            $val = $self->Decode($val, 'UCS2');
+            $val =~ s/\0.*//;
+            return length($val) ? $val : undef;
+        },
+    },
+    0x6c => {
+        Name => 'CursorSize',
+        Format => 'int32u',
+    },
+    0x70 => {
+        Name => 'FullScreen',
+        Format => 'int32u',
+        PrintConv => '$val ? "Yes" : "No"',
+    },
+    0x74 => { #PH (MISSING FROM MS DOCUMENTATION! -- screws up subsequent offsets)
+        Name => 'QuickEdit',
+        Format => 'int32u',
+        PrintConv => '$val ? "Yes" : "No"',
+    },
+    0x78 => {
+        Name => 'InsertMode',
+        Format => 'int32u',
+        PrintConv => '$val ? "Yes" : "No"',
+    },
+    0x7c => {
+        Name => 'WindowOriginAuto',
+        Format => 'int32u',
+        PrintConv => '$val ? "Yes" : "No"',
+    },
+    0x80 => {
+        Name => 'HistoryBufferSize',
+        Format => 'int32u',
+    },
+    0x84 => {
+        Name => 'NumHistoryBuffers',
+        Format => 'int32u',
+    },
+    0x88 => {
+        Name => 'RemoveHistoryDuplicates',
+        Format => 'int32u',
+        PrintConv => '$val ? "Yes" : "No"',
+    },
+);
+
+%Image::ExifTool::LNK::TrackerData = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Other' },
+    0x10 => {
+        Name => 'MachineID',
+        Format => 'var_string',
+    },
+);
+
+%Image::ExifTool::LNK::ConsoleFEData = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Other' },
+    0x08 => {
+        Name => 'CodePage',
+        Format => 'int32u',
+    },
+);
+
+#------------------------------------------------------------------------------
+# Extract null-terminated ASCII or Unicode string from buffer
+# Inputs: 0) buffer ref, 1) start position, 2) flag for unicode string
+# Return: string or undef if start position is outside bounds
+sub GetString($$;$)
+{
+    my ($dataPt, $pos, $unicode) = @_;
+    return undef if $pos >= length($$dataPt);
+    pos($$dataPt) = $pos;
+    return $1 if ($unicode ? $$dataPt=~/\G((?:..)*?)\0\0/sg : $$dataPt=~/\G(.*?)\0/sg);
+    return substr($$dataPt, $pos);
+}
+
+#------------------------------------------------------------------------------
+# Process item ID data
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference, 2) tag table ref
+# Returns: 1 on success
+sub ProcessItemID($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dataLen = length $$dataPt;
+    my $pos = 0;
+    my %opts = (
+        DataPt  => $dataPt,
+        DataPos => $$dirInfo{DataPos},
+    );
+    $exifTool->VerboseDir('ItemID', undef, $dataLen);
+    for (;;) {
+        last if $pos + 4 >= $dataLen;
+        my $size = Get16u($dataPt, $pos);
+        last if $size < 2 or $pos + $size > $dataLen;
+        my $tag = Get16u($dataPt, $pos+2); # (just a guess -- may not be a tag at all)
+        Image::ExifTool::AddTagToTable($tagTablePtr, $tag, {
+            Name => sprintf('Item%.4x', $tag),
+            SubDirectory => { TagTable => 'Image::ExifTool::LNK::UnknownData' },
+        }) unless $$tagTablePtr{$tag};
+        $exifTool->HandleTag($tagTablePtr, $tag, undef, %opts, Start => $pos, Size => $size);
+        $pos += $size;
+    }
+}
+
+#------------------------------------------------------------------------------
+# Process link information data
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference, 2) tag table ref
+# Returns: 1 on success
+sub ProcessLinkInfo($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dataLen = length $$dataPt;
+    return 0 if $dataLen < 0x20;
+    my $hdrLen = Get32u($dataPt, 4);
+    my $lif = Get32u($dataPt, 8);   # link info flags
+    my %opts = (
+        DataPt  => $dataPt,
+        DataPos => $$dirInfo{DataPos},
+        Size    => 4, # (typical value size)
+    );
+    my ($off, $unicode, $pos, $val, $size);
+    $exifTool->VerboseDir('LinkInfo', undef, $dataLen);
+    if ($lif & 0x01) {
+        # read Volume ID
+        $off = Get32u($dataPt, 0x0c);
+        if ($off + 0x20 <= $dataLen) {
+            # my $len = Get32u($dataPt, $off);
+            $exifTool->HandleTag($tagTablePtr, 'DriveType', undef, %opts, Start=>$off+4);
+            $pos = Get32u($dataPt, $off + 0x0c);
+            if ($pos == 0x14) {
+                # use VolumeLabelOffsetUnicode instead
+                $pos = Get32u($dataPt, $off + 0x10);
+                $unicode = 1;
+            }
+            $pos += $off;
+            $val = GetString($dataPt, $pos, $unicode);
+            if (defined $val) {
+                $size = length $val;
+                $val = $exifTool->Decode($val, 'UCS2') if $unicode;
+                $exifTool->HandleTag($tagTablePtr, 'VolumeLabel', $val, %opts, Start=>$pos, Size=>$size);
+            }
+        }
+        # read local base path
+        if ($hdrLen >= 0x24) {
+            $pos = Get32u($dataPt, 0x1c);
+            $unicode = 1;
+        } else {
+            $pos = Get32u($dataPt, 0x10);
+            undef $unicode;
+        }
+        $val = GetString($dataPt, $pos, $unicode);
+        if (defined $val) {
+            $size = length $val;
+            $val = $exifTool->Decode($val, 'UCS2') if $unicode;
+            $exifTool->HandleTag($tagTablePtr, 'LocalBasePath', $val, %opts, Start=>$pos, Size=>$size);
+        }
+    }
+    if ($lif & 0x02) {
+        # read common network relative link
+        $off = Get32u($dataPt, 0x14);
+        if ($off and $off + 0x14 <= $dataLen) {
+            my $siz = Get32u($dataPt, $off);
+            $pos = Get32u($dataPt, $off + 0x08);
+            if ($pos > 0x14 and $siz >= 0x18) {
+                $pos = Get32u($dataPt, $off + 0x14);
+                $unicode = 1;
+            } else {
+                undef $unicode;
+            }
+            $val = GetString($dataPt, $pos, $unicode);
+            if (defined $val) {
+                $size = length $val;
+                $val = $exifTool->Decode($val, 'UCS2') if $unicode;
+                $exifTool->HandleTag($tagTablePtr, 'NetName', $val, %opts, Start=>$pos, Size=>$size);
+            }
+            my $flg = Get32u($dataPt, $off + 0x04);
+            if ($flg & 0x01) {
+                $pos = Get32u($dataPt, $off + 0x0c);
+                if ($pos > 0x14 and $siz >= 0x1c) {
+                    $pos = Get32u($dataPt, $off + 0x18);
+                    $unicode = 1;
+                } else {
+                    undef $unicode;
+                }
+                $val = GetString($dataPt, $pos, $unicode);
+                if (defined $val) {
+                    $size = length $val;
+                    $val = $exifTool->Decode($val, 'UCS2') if $unicode;
+                    $exifTool->HandleTag($tagTablePtr, 'DeviceName', $val, %opts, Start=>$pos, Size=>$size);
+                }
+            }
+            if ($flg & 0x02) {
+                $val = Get32u($dataPt, $off + 0x10);
+                $exifTool->HandleTag($tagTablePtr, 'NetProviderType', $val, %opts, Start=>$off + 0x10);
+            }
+        }
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Extract information from a MS Shell Link (Windows shortcut) file
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 on success, 0 if this wasn't a valid LNK file
+sub ProcessLNK($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my ($buff, $buf2, $len, $i);
+
+    # read LNK file header
+    $raf->Read($buff, 0x4c) == 0x4c or return 0;
+    $buff =~ /^.{4}\x01\x14\x02\0{5}\xc0\0{6}\x46/s or return 0;
+    $len = unpack('V', $buff);
+    $len >= 0x4c or return 0;
+    if ($len > 0x4c) {
+        $raf->Read($buf2, $len - 0x4c) == $len - 0x4c or return 0;
+        $buff .= $buf2;
+    }
+    $exifTool->SetFileType('Windows Shortcut');
+    SetByteOrder('II');
+
+    my $tagTablePtr = GetTagTable('Image::ExifTool::LNK::Main');
+    my %dirInfo = (
+        DataPt => \$buff,
+        DataPos => 0,
+        DataLen => length $buff,
+        DirLen => length $buff,
+    );
+    $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+
+    my $flags = Get32u(\$buff, 0x14);
+
+    # read link target ID list
+    if ($flags & 0x01) {
+        $raf->Read($buff, 2) or return 1;
+        $len = unpack('v', $buff);
+        $raf->Read($buff, $len) == $len or return 1;
+        $exifTool->HandleTag($tagTablePtr, 0x10000, undef,
+            DataPt  => \$buff,
+            DataPos => $raf->Tell() - $len,
+            Size    => $len,
+        );
+    }
+
+    # read link information
+    if ($flags & 0x02) {
+        $raf->Read($buff, 4) or return 1;
+        $len = unpack('V', $buff);
+        return 1 if $len < 4;
+        $raf->Read($buf2, $len - 4) == $len - 4 or return 1;
+        $buff .= $buf2;
+        $exifTool->HandleTag($tagTablePtr, 0x20000, undef,
+            DataPt  => \$buff,
+            DataPos => $raf->Tell() - $len,
+            Size    => $len,
+        );
+    }
+
+    # read string data
+    my @strings = qw(Description RelativePath WorkingDirectory
+                     CommandLineArguments IconFileName);
+    for ($i=0; $i<@strings; ++$i) {
+        my $mask = 0x04 << $i;
+        next unless $flags & $mask;
+        $raf->Read($buff, 2) or return 1;
+        $len = unpack('v', $buff);
+        $len *= 2 if $flags & 0x80;  # characters are 2 bytes if Unicode flag is set   
+        $raf->Read($buff, $len) or return 1;
+        my $val;
+        $val = $exifTool->Decode($buff, 'UCS2') if $flags & 0x80;
+        $exifTool->HandleTag($tagTablePtr, 0x30000 | $mask, $val,
+            DataPt  => \$buff,
+            DataPos => $raf->Tell() - $len,
+            Size    => $len,
+        );
+    }
+
+    # read extra data
+    while ($raf->Read($buff, 4) == 4) {
+        $len = unpack('V', $buff);
+        last if $len < 4;
+        $len -= 4;
+        $raf->Read($buf2, $len) == $len or last;
+        next unless $len > 4;
+        $buff .= $buf2;
+        my $tag = Get32u(\$buff, 4);
+        my $tagInfo = $$tagTablePtr{$tag};
+        unless (ref $tagInfo eq 'HASH' and $$tagInfo{SubDirectory}) {
+            $tagInfo = $$tagTablePtr{0xa0000000};
+        }
+        $exifTool->HandleTag($tagTablePtr, $tag, undef,
+            DataPt  => \$buff,
+            DataPos => $raf->Tell() - $len - 4,
+            TagInfo => $tagInfo,
+        );
+    }
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::LNK - Read MS Shell Link (.LNK) meta information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to extract meta
+information MS Shell Link (Windows shortcut) files.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://msdn.microsoft.com/en-us/library/dd871305(PROT.10).aspx>
+
+=item L<http://www.i2s-lab.com/Papers/The_Windows_Shortcut_File_Format.pdf>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/LNK Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/cs.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/cs.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/cs.pm	(revision 24799)
@@ -0,0 +1,1570 @@
+#------------------------------------------------------------------------------
+# File:         cs.pm
+#
+# Description:  ExifTool Czech language translations
+#
+# Notes:        This file generated automatically by Image::ExifTool::TagInfoXML
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Lang::cs;
+
+use strict;
+use vars qw($VERSION);
+
+$VERSION = '1.04';
+
+%Image::ExifTool::Lang::cs::Translate = (
+   'AEMeteringMode' => {
+      PrintConv => {
+        'Multi-segment' => 'Multi segment',
+      },
+    },
+   'AEProgramMode' => {
+      PrintConv => {
+        'Landscape' => 'Krajina',
+        'Macro' => 'Makro',
+        'Portrait' => 'PortrÃ©t',
+      },
+    },
+   'AFPoint' => {
+      PrintConv => {
+        'None' => 'ÅœÃ¡dnÃ¡',
+      },
+    },
+   'AFPointBrightness' => {
+      PrintConv => {
+        'Normal' => 'NormÃ¡lnÃ­',
+      },
+    },
+   'AFPointSelectionMethod' => {
+      PrintConv => {
+        'Normal' => 'NormÃ¡lnÃ­',
+      },
+    },
+   'AFPointsInFocus' => {
+      PrintConv => {
+        'None' => 'ÅœÃ¡dnÃ¡',
+      },
+    },
+   'APEVersion' => 'APE verze',
+   'ActiveD-Lighting' => {
+      PrintConv => {
+        'Low' => 'MÃ©nÄ',
+        'Normal' => 'NormÃ¡lnÃ­',
+      },
+    },
+   'ActiveD-LightingMode' => {
+      PrintConv => {
+        'Low' => 'MÃ©nÄ',
+        'Normal' => 'NormÃ¡lnÃ­',
+      },
+    },
+   'AdultContentWarning' => {
+      PrintConv => {
+        'Unknown' => 'NeznÃ¡mÃœ',
+      },
+    },
+   'Annotations' => 'PoznÃ¡mky Photoshop',
+   'Aperture' => 'Clona',
+   'ApertureValue' => 'Clona',
+   'Artist' => 'Autor',
+   'AssistButtonFunction' => {
+      PrintConv => {
+        'Normal' => 'NormÃ¡lnÃ­',
+      },
+    },
+   'Author' => 'Autor',
+   'AuthorsPosition' => 'Pozice autora',
+   'AutoLightingOptimizer' => {
+      PrintConv => {
+        'Low' => 'MÃ©nÄ',
+      },
+    },
+   'AutoRotate' => {
+      PrintConv => {
+        'None' => 'ÅœÃ¡dnÃ¡',
+        'Rotate 180' => '180Â° (dolÅ¯/vpravo)',
+        'Rotate 270 CW' => '90Â° po smÄru HR (vlevo/dolÅ¯)',
+        'Rotate 90 CW' => '90Â° ptoti smÄru HR (vpravo/nahoru)',
+        'n/a' => 'NeznÃ¡mÃœ',
+      },
+    },
+   'BadFaxLines' => 'Å patnÃ© faxovÃ© ÅÃ¡dky',
+   'BannerImageType' => {
+      PrintConv => {
+        'None' => 'ÅœÃ¡dnÃ¡',
+      },
+    },
+   'BatteryLevel' => 'Stav baterie',
+   'BitsPerSample' => 'PoÄet bitÅ¯ na sloÅŸku',
+   'BlurWarning' => {
+      PrintConv => {
+        'None' => 'ÅœÃ¡dnÃ¡',
+      },
+    },
+   'Brightness' => 'Jas',
+   'BrightnessValue' => 'Jas',
+   'By-line' => 'Autor',
+   'CFAPattern' => 'CFA matrice',
+   'CFAPattern2' => 'CFA matice 2',
+   'CFARepeatPatternDim' => 'Velikost berevnÃ© matice CFA',
+   'CPUType' => {
+      PrintConv => {
+        'None' => 'ÅœÃ¡dnÃ¡',
+      },
+    },
+   'CalibrationIlluminant1' => {
+      PrintConv => {
+        'Cloudy' => 'ZataÅŸeno',
+        'Cool White Fluorescent' => 'StudenÃ¡ zÃ¡Åivka',
+        'Day White Fluorescent' => 'DennÃ­ zÃ¡Åivka',
+        'Daylight' => 'DennÃ­ svÄtlo',
+        'Daylight Fluorescent' => 'DennÃ­ svÄtlo',
+        'Fine Weather' => 'SluneÄno',
+        'Flash' => 'Blesk',
+        'Fluorescent' => 'ÅœÃ¡rovka',
+        'ISO Studio Tungsten' => 'StudiovÃ¡ svÄtla',
+        'Other' => 'JinÃ© osvÄtlenÃ­',
+        'Shade' => 'StÃ­ny',
+        'Standard Light A' => 'StandardnÃ­ svÄtlo A',
+        'Standard Light B' => 'StandardnÃ­ svÄtlo B',
+        'Standard Light C' => 'StandardnÃ­ svÄtlo C',
+        'Tungsten (Incandescent)' => 'ZÃ¡Åivka',
+        'Unknown' => 'NeznÃ¡mÃœ',
+        'White Fluorescent' => 'BÃ­lÃ¡ zÃ¡Åivka',
+      },
+    },
+   'CalibrationIlluminant2' => {
+      PrintConv => {
+        'Cloudy' => 'ZataÅŸeno',
+        'Cool White Fluorescent' => 'StudenÃ¡ zÃ¡Åivka',
+        'Day White Fluorescent' => 'DennÃ­ zÃ¡Åivka',
+        'Daylight' => 'DennÃ­ svÄtlo',
+        'Daylight Fluorescent' => 'DennÃ­ svÄtlo',
+        'Fine Weather' => 'SluneÄno',
+        'Flash' => 'Blesk',
+        'Fluorescent' => 'ÅœÃ¡rovka',
+        'ISO Studio Tungsten' => 'StudiovÃ¡ svÄtla',
+        'Other' => 'JinÃ© osvÄtlenÃ­',
+        'Shade' => 'StÃ­ny',
+        'Standard Light A' => 'StandardnÃ­ svÄtlo A',
+        'Standard Light B' => 'StandardnÃ­ svÄtlo B',
+        'Standard Light C' => 'StandardnÃ­ svÄtlo C',
+        'Tungsten (Incandescent)' => 'ZÃ¡Åivka',
+        'Unknown' => 'NeznÃ¡mÃœ',
+        'White Fluorescent' => 'BÃ­lÃ¡ zÃ¡Åivka',
+      },
+    },
+   'CameraOrientation' => {
+      Description => 'Orientace',
+      PrintConv => {
+        'Horizontal (normal)' => '0Â° (nahoru/vlevo)',
+        'Rotate 270 CW' => '90Â° po smÄru HR (vlevo/dolÅ¯)',
+        'Rotate 90 CW' => '90Â° ptoti smÄru HR (vpravo/nahoru)',
+      },
+    },
+   'CanonExposureMode' => {
+      PrintConv => {
+        'Aperture-priority AE' => 'Priorita clony',
+        'Manual' => 'ManuÃ¡lnÃ­',
+        'Shutter speed priority AE' => 'Priorita Äasu',
+      },
+    },
+   'Caption-Abstract' => 'Popisek',
+   'CaptionWriter' => 'Autor popisku',
+   'CaptureXResolutionUnit' => {
+      PrintConv => {
+        'um' => 'Âµm (mikrometr)',
+      },
+    },
+   'CaptureYResolutionUnit' => {
+      PrintConv => {
+        'um' => 'Âµm (mikrometr)',
+      },
+    },
+   'Categories' => 'Kategorie',
+   'Category' => 'Kategorie',
+   'CellLength' => 'DÃ©lka buÅky',
+   'CellWidth' => 'Å Ã­Åka buÅky',
+   'CenterWeightedAreaSize' => {
+      PrintConv => {
+        'Average' => 'PrÅ¯mÄr',
+      },
+    },
+   'ChrominanceNR_TIFF_JPEG' => {
+      PrintConv => {
+        'Low' => 'MÃ©nÄ',
+      },
+    },
+   'ChrominanceNoiseReduction' => {
+      PrintConv => {
+        'Low' => 'MÃ©nÄ',
+      },
+    },
+   'City' => 'MÄsto',
+   'CleanFaxData' => 'ÄistÃ¡ fax data',
+   'ColorEffect' => {
+      PrintConv => {
+        'Sepia' => 'SÃ©pie',
+      },
+    },
+   'ColorFilter' => 'BarevnÃœ filtr',
+   'ColorMap' => 'BarevnÃ¡ mapa',
+   'ColorMode' => {
+      PrintConv => {
+        'Landscape' => 'Krajina',
+        'Normal' => 'NormÃ¡lnÃ­',
+        'Portrait' => 'PortrÃ©t',
+      },
+    },
+   'ColorMoireReductionMode' => {
+      PrintConv => {
+        'Low' => 'MÃ©nÄ',
+      },
+    },
+   'ColorResponseUnit' => 'OdpovÃ­dajÃ­cÃ­ barevnÃ¡ jednotka',
+   'ColorSpace' => {
+      Description => 'BarevnÃœ prostor',
+      PrintConv => {
+        'Uncalibrated' => 'NekalibrovÃ¡n',
+      },
+    },
+   'ColorTemperature' => 'Teplota barev',
+   'ColorTone' => {
+      PrintConv => {
+        'Normal' => 'NormÃ¡lnÃ­',
+      },
+    },
+   'CommanderGroupAMode' => {
+      PrintConv => {
+        'Manual' => 'ManuÃ¡lnÃ­',
+      },
+    },
+   'CommanderGroupBMode' => {
+      PrintConv => {
+        'Manual' => 'ManuÃ¡lnÃ­',
+      },
+    },
+   'CommanderInternalFlash' => {
+      PrintConv => {
+        'Manual' => 'ManuÃ¡lnÃ­',
+      },
+    },
+   'Comment' => 'KomentÃ¡Å',
+   'ComponentsConfiguration' => 'UrÄenÃ­ sloÅŸek',
+   'CompressedBitsPerPixel' => 'KomprimaÄnÃ­ mod',
+   'Compression' => {
+      Description => 'KompresnÃ­ algoritmus',
+      PrintConv => {
+        'JPEG' => 'JPEG komprese',
+        'JPEG (old-style)' => 'JPEG (pÅ¯v. verze)',
+        'Kodak DCR Compressed' => 'Kodak DCR komprese',
+        'Kodak KDC Compressed' => 'Kodak KDC komprese',
+        'Next' => 'KÃ³dovÃ¡nÃ­ NeXT 2-bit',
+        'Nikon NEF Compressed' => 'Nikon NEF komprese',
+        'None' => 'ÅœÃ¡dnÃ¡',
+        'Pentax PEF Compressed' => 'Pentax PEF komprese',
+        'SGILog' => 'KÃ³dovÃ¡nÃ­ SGI 32-bit Log Luminance',
+        'SGILog24' => 'KÃ³dovÃ¡nÃ­ SGI 24-bit Log Luminance',
+        'Sony ARW Compressed' => 'Sony ARW komprese',
+        'Thunderscan' => 'KÃ³dovÃ¡nÃ­ ThunderScan 4-bit',
+        'Uncompressed' => 'Bez komprese',
+      },
+    },
+   'CompressionType' => {
+      PrintConv => {
+        'None' => 'ÅœÃ¡dnÃ¡',
+      },
+    },
+   'ConsecutiveBadFaxLines' => 'Sekvence vadnÃœch faxovÃœch ÅÃ¡dkÅ¯',
+   'Contrast' => {
+      Description => 'Kontrast',
+      PrintConv => {
+        'High' => 'VÃ­ce',
+        'Low' => 'MÃ©nÄ',
+        'Normal' => 'NormÃ¡lnÃ­',
+      },
+    },
+   'ConversionLens' => {
+      PrintConv => {
+        'Macro' => 'Makro',
+      },
+    },
+   'Copyright' => 'DrÅŸitel prÃ¡v',
+   'CopyrightNotice' => 'OznÃ¡menÃ­ o autorskÃœch prÃ¡vech',
+   'CopyrightStatus' => {
+      PrintConv => {
+        'Unknown' => 'NeznÃ¡mÃœ',
+      },
+    },
+   'Country' => 'ZemÄ',
+   'Country-PrimaryLocationName' => 'ZemÄ',
+   'CreateDate' => 'Datum a Äas generovÃ¡nÃ­ digitÃ¡lnÃ­ch dat',
+   'CreationDate' => 'Datum vytvoÅenÃ­',
+   'Credit' => 'Kredit',
+   'CropUnit' => {
+      PrintConv => {
+        'inches' => 'Palce',
+      },
+    },
+   'CropUnits' => {
+      PrintConv => {
+        'inches' => 'Palce',
+      },
+    },
+   'CustomRendered' => {
+      Description => 'ZpracovÃ¡nÃ­ obrazu',
+      PrintConv => {
+        'Custom' => 'UÅŸivatelskÃ© zpracovÃ¡nÃ­',
+        'Normal' => 'NormÃ¡lnÃ­ proces',
+      },
+    },
+   'DataImprint' => {
+      PrintConv => {
+        'None' => 'ÅœÃ¡dnÃ¡',
+      },
+    },
+   'DateCreated' => 'Datum vytvoÅenÃ­',
+   'DateTime' => 'Datum a Äas zmÄny souboru',
+   'DateTimeOriginal' => 'Datum a Äas vzniku originÃ¡lnÃ­ch dat',
+   'Description' => 'Popis',
+   'DeviceSettingDescription' => 'Popis nastavenÃ­ zaÅÃ­zenÃ­',
+   'DialDirectionTvAv' => {
+      PrintConv => {
+        'Normal' => 'NormÃ¡lnÃ­',
+      },
+    },
+   'DigitalZoom' => {
+      Description => 'DigitÃ¡lnÃ­ pÅiblÃ­ÅŸenÃ­',
+      PrintConv => {
+        'None' => 'ÅœÃ¡dnÃ¡',
+      },
+    },
+   'DigitalZoomRatio' => 'DigitÃ¡lnÃ­ zoom',
+   'Directory' => 'UmÃ­stÄnÃ­ souboru',
+   'DisplaySize' => {
+      PrintConv => {
+        'Normal' => 'NormÃ¡lnÃ­',
+      },
+    },
+   'DisplayUnits' => {
+      PrintConv => {
+        'inches' => 'Palce',
+      },
+    },
+   'DisplayXResolutionUnit' => {
+      PrintConv => {
+        'um' => 'Âµm (mikrometr)',
+      },
+    },
+   'DisplayYResolutionUnit' => {
+      PrintConv => {
+        'um' => 'Âµm (mikrometr)',
+      },
+    },
+   'DisplayedUnitsX' => {
+      PrintConv => {
+        'inches' => 'Palce',
+      },
+    },
+   'DisplayedUnitsY' => {
+      PrintConv => {
+        'inches' => 'Palce',
+      },
+    },
+   'DjVuVersion' => 'DjVu verze',
+   'DocumentName' => 'JmÃ©no dokumentu',
+   'DotRange' => 'BodovÃ¡ rozteÄ',
+   'DriveMode' => 'ReÅŸim spouÅ¡tÄ',
+   'ETTLII' => {
+      PrintConv => {
+        'Average' => 'PrÅ¯mÄr',
+      },
+    },
+   'EasyMode' => {
+      PrintConv => {
+        'Landscape' => 'Krajina',
+        'Macro' => 'Makro',
+        'Manual' => 'ManuÃ¡lnÃ­',
+        'Night' => 'NoÄnÃ­ foto',
+        'Portrait' => 'PortrÃ©t',
+      },
+    },
+   'Emphasis' => {
+      PrintConv => {
+        'None' => 'ÅœÃ¡dnÃ¡',
+      },
+    },
+   'ExifImageHeight' => 'VÃœÅ¡ka',
+   'ExifImageWidth' => 'Å Ã­Åka',
+   'ExifOffset' => 'Ukazatel Exif IFD',
+   'ExifToolVersion' => 'ExifTool verze',
+   'ExifVersion' => 'Exif verze',
+   'ExpandFilm' => 'Ext. film',
+   'ExpandFilterLens' => 'Ext. filtr objektivu',
+   'ExpandFlashLamp' => 'Ext. svÄtlo blesku',
+   'ExpandLens' => 'Ext. objektiv',
+   'ExpandScanner' => 'Ext. skener',
+   'ExpandSoftware' => 'Ext. Software',
+   'ExposureCompensation' => 'Korekce expozice',
+   'ExposureIndex' => 'Index expozice',
+   'ExposureMode' => {
+      Description => 'MÃ³d expozice',
+      PrintConv => {
+        'Aperture Priority' => 'Priorita clony',
+        'Aperture-priority AE' => 'Priorita clony',
+        'Auto' => 'AutomatickÃ¡ expozice',
+        'Auto bracket' => 'Auto braketing',
+        'Landscape' => 'Krajina',
+        'Manual' => 'ManuÃ¡lnÃ­ expozice',
+        'Portrait' => 'PortrÃ©t',
+        'Shutter Priority' => 'Priorita Äasu',
+        'Shutter speed priority AE' => 'Priorita Äasu',
+      },
+    },
+   'ExposureModeInManual' => {
+      PrintConv => {
+        'Center-weighted average' => 'ZvÃœraznÄnÃœ stÅed',
+        'Partial metering' => 'BlokovÃ©',
+        'Spot metering' => 'StÅedovÃœ bod',
+      },
+    },
+   'ExposureProgram' => {
+      Description => 'ExpoziÄnÃ­ mod',
+      PrintConv => {
+        'Action (High speed)' => 'AkÄnÃ­ program (ovlivnÄnÃœ Äas zÃ¡vÄrky)',
+        'Aperture Priority' => 'Priorita clony',
+        'Aperture-priority AE' => 'Priorita clony',
+        'Bulb' => 'ÅœÃ¡rovka',
+        'Creative (Slow speed)' => 'KreativnÃ­ program (ovlivnÄnÃ¡ hloubka ostrosti)',
+        'Landscape' => 'Krajina',
+        'Manual' => 'ManuÃ¡lnÃ­',
+        'Not Defined' => 'NedefinovanÃœ',
+        'Portrait' => 'PortrÃ©t',
+        'Program AE' => 'NormÃ¡lnÃ­ program',
+        'Shutter Priority' => 'Priorita Äasu',
+        'Shutter speed priority AE' => 'Priorita Äasu',
+      },
+    },
+   'ExposureTime' => 'ExpoziÄnÃ­ Äas',
+   'ExposureTime2' => 'ExpoziÄnÃ­ Äas 2',
+   'FNumber' => 'F hodnota',
+   'FaxProfile' => {
+      PrintConv => {
+        'Unknown' => 'NeznÃ¡mÃœ',
+      },
+    },
+   'FaxRecvParams' => 'Parametry pÅÃ­jemce faxu',
+   'FaxRecvTime' => 'Äas pÅÃ­jmu faxu',
+   'FaxSubAddress' => 'Sub adresa faxu',
+   'FileFormat' => 'FormÃ¡t',
+   'FileModifyDate' => 'Datum Ãºpravy',
+   'FileName' => 'JmÃ©no',
+   'FileSize' => 'Velikost',
+   'FileSource' => {
+      Description => 'Zdroj dat',
+      PrintConv => {
+        'Digital Camera' => 'DigitÃ¡lnÃ­ fotoaparÃ¡t',
+        'Film Scanner' => 'FilmovÃœ skener',
+        'Reflection Print Scanner' => 'Skener',
+      },
+    },
+   'FileType' => 'Typ',
+   'FillOrder' => {
+      Description => 'PoÅadÃ­ vÃœplnÄ',
+      PrintConv => {
+        'Normal' => 'NormÃ¡lnÃ­',
+      },
+    },
+   'FilterEffect' => {
+      PrintConv => {
+        'None' => 'ÅœÃ¡dnÃ¡',
+      },
+    },
+   'FilterEffectMonochrome' => {
+      PrintConv => {
+        'None' => 'ÅœÃ¡dnÃ¡',
+      },
+    },
+   'Flash' => {
+      Description => 'Blesk',
+      PrintConv => {
+        'Auto, Did not fire' => 'Blesk nepouÅŸit, auto mod',
+        'Auto, Did not fire, Red-eye reduction' => 'Auto mod, nepouÅŸit, redukce ÄervenÃœch oÄÃ­',
+        'Auto, Fired' => 'Blesk pouÅŸit, auto mod',
+        'Auto, Fired, Red-eye reduction' => 'Blesk pouÅŸit, auto mod, redukce ÄervenÃœch oÄÃ­',
+        'Auto, Fired, Red-eye reduction, Return detected' => 'Blesk pouÅŸit, auto mod, redukce ÄervenÃœch oÄÃ­, odraz detekovÃ¡n',
+        'Auto, Fired, Red-eye reduction, Return not detected' => 'Blesk pouÅŸit, auto mod, redukce ÄervenÃœch oÄÃ­, odraz nezjiÅ¡tÄn',
+        'Auto, Fired, Return detected' => 'Blesk pouÅŸit, auto mod, odraz detekovÃ¡n',
+        'Auto, Fired, Return not detected' => 'Blesk pouÅŸit, auto mod, odraz nedetekovÃ¡n',
+        'Did not fire' => 'Blesk ne',
+        'Fired' => 'Blesk ano',
+        'Fired, Red-eye reduction' => 'Blesk pouÅŸit, redukce ÄervenÃœch oÄÃ­',
+        'Fired, Red-eye reduction, Return detected' => 'Blesk pouÅŸit, redukce ÄervenÃœch oÄÃ­, odraz detekovÃ¡n',
+        'Fired, Red-eye reduction, Return not detected' => 'Blesk pouÅŸit, redukce ÄervenÃœch oÄÃ­, odraz nezjiÅ¡tÄn',
+        'Fired, Return detected' => 'Odraz strobozÃ¡bleskÅ¯ detekovÃ¡n',
+        'Fired, Return not detected' => 'Odraz strobozÃ¡bleskÅ¯ nezjiÅ¡tÄn',
+        'No Flash' => 'Blesk ne',
+        'No flash function' => 'Blesk nezjiÅ¡tÄn',
+        'Off' => 'Blesk nepouÅŸit, vynucenÃœ mod',
+        'Off, Did not fire' => 'Blesk nepouÅŸit, vynucenÃœ mod',
+        'Off, Did not fire, Return not detected' => 'Blesk vypnut, bez zÃ¡blesku, odraz nezachycen',
+        'Off, No flash function' => 'NeaktivnÃ­, bez funkce blesku',
+        'Off, Red-eye reduction' => 'NeaktivnÃ­, redukce ÄervenÃœch oÄÃ­',
+        'On' => 'Blesk pouÅŸit, vynucenÃœ mod',
+        'On, Did not fire' => 'Blesk zapnut, nepouÅŸit',
+        'On, Fired' => 'Blesk pouÅŸit, vynucenÃœ mod',
+        'On, Red-eye reduction' => 'Blesk pouÅŸit, vynucenÃœ mod, redukce ÄervenÃœch oÄÃ­',
+        'On, Red-eye reduction, Return detected' => 'Blesk pouÅŸit, vynucenÃœ mod, redukce ÄervenÃœch oÄÃ­, odraz detekovÃ¡n',
+        'On, Red-eye reduction, Return not detected' => 'Blesk pouÅŸit, vynucenÃœ mod, redukce ÄervenÃœch oÄÃ­, odraz nezjiÅ¡tÄn',
+        'On, Return detected' => 'Blesk pouÅŸit, vynucenÃœ mod, odraz detekovÃ¡n',
+        'On, Return not detected' => 'Blesk pouÅŸit, vynucenÃœ mod, odraz nezjiÅ¡tÄn',
+      },
+    },
+   'FlashControlMode' => {
+      PrintConv => {
+        'Manual' => 'ManuÃ¡lnÃ­',
+      },
+    },
+   'FlashDevice' => {
+      PrintConv => {
+        'None' => 'ÅœÃ¡dnÃ¡',
+      },
+    },
+   'FlashEnergy' => 'SÃ­la zÃ¡blesku',
+   'FlashExposureComp' => 'Kompenzace blesku',
+   'FlashGroupAControlMode' => {
+      PrintConv => {
+        'Manual' => 'ManuÃ¡lnÃ­',
+      },
+    },
+   'FlashGroupBControlMode' => {
+      PrintConv => {
+        'Manual' => 'ManuÃ¡lnÃ­',
+      },
+    },
+   'FlashGroupCControlMode' => {
+      PrintConv => {
+        'Manual' => 'ManuÃ¡lnÃ­',
+      },
+    },
+   'FlashIntensity' => {
+      PrintConv => {
+        'Normal' => 'NormÃ¡lnÃ­',
+      },
+    },
+   'FlashMode' => {
+      PrintConv => {
+        'Normal' => 'NormÃ¡lnÃ­',
+        'Unknown' => 'NeznÃ¡mÃœ',
+      },
+    },
+   'FlashModel' => {
+      PrintConv => {
+        'None' => 'ÅœÃ¡dnÃ¡',
+      },
+    },
+   'FlashOptions' => {
+      PrintConv => {
+        'Normal' => 'NormÃ¡lnÃ­',
+      },
+    },
+   'FlashOptions2' => {
+      PrintConv => {
+        'Normal' => 'NormÃ¡lnÃ­',
+      },
+    },
+   'FlashType' => {
+      PrintConv => {
+        'None' => 'ÅœÃ¡dnÃ¡',
+      },
+    },
+   'FlashpixVersion' => 'PodporovanÃ¡ verze Flashpix',
+   'FocalLength' => 'OhniskovÃ¡ vzdÃ¡lenost',
+   'FocalLength35efl' => 'OhniskovÃ¡ vzdÃ¡lenost',
+   'FocalLengthIn35mmFormat' => 'PÅepoÄtenÃ¡ ohniskovÃ¡ vzdÃ¡lenost (35mm)',
+   'FocalPlaneResolutionUnit' => {
+      Description => 'Jednotka rozliÅ¡enÃ­ senzoru',
+      PrintConv => {
+        'None' => 'ÅœÃ¡dnÃ¡',
+        'inches' => 'Palce',
+        'um' => 'Âµm (mikrometr)',
+      },
+    },
+   'FocalPlaneXResolution' => 'HorizontÃ¡lnÃ­ rozliÅ¡enÃ­ senzoru',
+   'FocalPlaneYResolution' => 'VertikÃ¡lnÃ­ rozliÅ¡enÃ­ senzoru',
+   'Focus' => {
+      PrintConv => {
+        'Manual' => 'ManuÃ¡lnÃ­',
+      },
+    },
+   'FocusContinuous' => {
+      PrintConv => {
+        'Manual' => 'ManuÃ¡lnÃ­',
+      },
+    },
+   'FocusMode' => {
+      Description => 'OstÅenÃ­',
+      PrintConv => {
+        'Macro' => 'Makro',
+        'Manual' => 'ManuÃ¡lnÃ­',
+        'Normal' => 'NormÃ¡lnÃ­',
+      },
+    },
+   'FocusMode2' => {
+      PrintConv => {
+        'Manual' => 'ManuÃ¡lnÃ­',
+      },
+    },
+   'FocusModeSetting' => {
+      PrintConv => {
+        'Manual' => 'ManuÃ¡lnÃ­',
+      },
+    },
+   'FocusRange' => {
+      PrintConv => {
+        'Macro' => 'Makro',
+        'Manual' => 'ManuÃ¡lnÃ­',
+        'Normal' => 'NormÃ¡lnÃ­',
+      },
+    },
+   'FocusTrackingLockOn' => {
+      PrintConv => {
+        'Normal' => 'NormÃ¡lnÃ­',
+      },
+    },
+   'FrameRate' => 'SnÃ­mkovacÃ­ frekvence',
+   'FrameSize' => 'Velikost snÃ­mku',
+   'FreeByteCounts' => 'PoÄet volnÃœch bytÅ¯',
+   'FreeOffsets' => 'VolnÃ¡ datovÃ¡ pozice',
+   'GIFVersion' => 'GIF verze',
+   'GPSAltitude' => 'NadmoÅskÃ¡ vÃœÅ¡ka',
+   'GPSAltitudeRef' => {
+      Description => 'NadmoÅskÃ¡ vÃœÅ¡ka',
+      PrintConv => {
+        'Above Sea Level' => 'NadmoÅskÃ¡ vÃœÅ¡ka',
+        'Below Sea Level' => 'NadmoÅskÃ¡ vÃœÅ¡ka (zÃ¡pornÃ¡ hodnota)',
+      },
+    },
+   'GPSAreaInformation' => 'NÃ¡zev GPS oblasti',
+   'GPSDOP' => 'PÅesnost mÄÅenÃ­',
+   'GPSDateStamp' => 'GPS Datum',
+   'GPSDateTime' => 'GPS Äas (atomovÃœ Äas)',
+   'GPSDestBearing' => 'Azimut cÃ­le',
+   'GPSDestBearingRef' => {
+      Description => 'Reference azimutu cÃ­le.',
+      PrintConv => {
+        'Magnetic North' => 'MagnetickÃœ smÄr',
+        'True North' => 'GeografickÃœ smÄr',
+      },
+    },
+   'GPSDestDistance' => 'VzdÃ¡lenost k cÃ­li',
+   'GPSDestDistanceRef' => {
+      Description => 'Reference vzdÃ¡lenosti cÃ­le',
+      PrintConv => {
+        'Kilometers' => 'Kilometry',
+        'Miles' => 'MÃ­le',
+        'Nautical Miles' => 'Uzle',
+      },
+    },
+   'GPSDestLatitude' => 'ZemÄpisnÃ¡ Å¡Ã­Åka cÃ­le',
+   'GPSDestLatitudeRef' => {
+      Description => 'Reference pro zemÄpisnou Å¡Ã­Åku cÃ­le',
+      PrintConv => {
+        'North' => 'SevernÃ­ Å¡Ã­Åka',
+        'South' => 'JiÅŸnÃ­ Å¡Ã­Åka',
+      },
+    },
+   'GPSDestLongitude' => 'ZemÄpisnÃ¡ dÃ©lka cÃ­le',
+   'GPSDestLongitudeRef' => {
+      Description => 'Reference pro zemÄpisnou dÃ©lku cÃ­le',
+      PrintConv => {
+        'East' => 'VÃœchodnÃ­ dÃ©lka',
+        'West' => 'ZÃ¡padnÃ­ dÃ©lka',
+      },
+    },
+   'GPSDifferential' => {
+      Description => 'GPS rozdÃ­lovÃ¡ korekce',
+      PrintConv => {
+        'Differential Corrected' => 'ZapoÄÃ­tanÃ¡ rozdÃ­lovÃ¡ korekce',
+        'No Correction' => 'MÄÅenÃ­ bez korekce',
+      },
+    },
+   'GPSImgDirection' => 'Orientace obrÃ¡zku',
+   'GPSImgDirectionRef' => {
+      Description => 'Reference k orientaci obrÃ¡zku',
+      PrintConv => {
+        'Magnetic North' => 'MagnetickÃœ smÄr',
+        'True North' => 'GeografickÃœ smÄr',
+      },
+    },
+   'GPSInfo' => 'IFD ukazatel v GPS informacÃ­ch',
+   'GPSLatitude' => 'ZemÄpisnÃ¡ Å¡Ã­Åka',
+   'GPSLatitudeRef' => {
+      Description => 'SevernÃ­ nebo JiÅŸnÃ­ Å¡Ã­Åka',
+      PrintConv => {
+        'North' => 'SevernÃ­ Å¡Ã­Åka',
+        'South' => 'JiÅŸnÃ­ Å¡Ã­Åka',
+      },
+    },
+   'GPSLongitude' => 'ZemÄpisnÃ¡ dÃ©lka',
+   'GPSLongitudeRef' => {
+      Description => 'VÃœchodnÃ­ nebo zÃ¡padnÃ­ dÃ©lka',
+      PrintConv => {
+        'East' => 'VÃœchodnÃ­ dÃ©lka',
+        'West' => 'ZÃ¡padnÃ­ dÃ©lka',
+      },
+    },
+   'GPSMapDatum' => 'GeodetickÃ¡ data',
+   'GPSMeasureMode' => {
+      Description => 'Mod GPS',
+      PrintConv => {
+        '2-D' => '2-dimenzionÃ¡lnÃ­ mÄÅenÃ­',
+        '2-Dimensional' => '2-dimenzionÃ¡lnÃ­ mÄÅenÃ­',
+        '2-Dimensional Measurement' => '2-dimenzionÃ¡lnÃ­ mÄÅenÃ­',
+        '3-D' => '3-dimenzionÃ¡lnÃ­ mÄÅenÃ­',
+        '3-Dimensional' => '3-dimenzionÃ¡lnÃ­ mÄÅenÃ­',
+        '3-Dimensional Measurement' => '3-dimenzionÃ¡lnÃ­ mÄÅenÃ­',
+      },
+    },
+   'GPSProcessingMethod' => 'NÃ¡zev procesnÃ­ metody GPS',
+   'GPSSatellites' => 'GPS satelity vyuÅŸitÃ© pÅi mÄÅenÃ­',
+   'GPSSpeed' => 'Rychlost GPS pÅijÃ­maÄe',
+   'GPSSpeedRef' => {
+      Description => 'Jednotka rychlosti',
+      PrintConv => {
+        'km/h' => 'Kilometry za hodinu',
+        'knots' => 'Uzle',
+        'mph' => 'MÃ­le za hodinu',
+      },
+    },
+   'GPSStatus' => {
+      Description => 'Stav GPS pÅijÃ­maÄe',
+      PrintConv => {
+        'Measurement Active' => 'ProbÃ­hÃ¡ mÄÅenÃ­',
+        'Measurement Void' => 'VzÃ¡jemnÃ© mÄÅenÃ­',
+      },
+    },
+   'GPSTimeStamp' => 'GPS Äas (atomovÃœ Äas)',
+   'GPSTrack' => 'SmÄr pohybu',
+   'GPSTrackRef' => {
+      Description => 'Reference pro smÄr pohybu',
+      PrintConv => {
+        'Magnetic North' => 'MagnetickÃœ smÄr',
+        'True North' => 'GeografickÃœ smÄr',
+      },
+    },
+   'GPSVersionID' => 'Verze GPS TAGu',
+   'GainControl' => {
+      Description => 'MÃ­ra jasu',
+      PrintConv => {
+        'High gain down' => 'SilnÃ© zeslabenÃ­',
+        'High gain up' => 'SilnÃ© zesÃ­lenÃ­',
+        'Low gain down' => 'SlabÃ© zeslabenÃ­',
+        'Low gain up' => 'SlabÃ© zesÃ­lenÃ­',
+        'None' => 'ÅœÃ¡dnÃ¡',
+      },
+    },
+   'Gradation' => 'Pusobivy',
+   'GrayResponseCurve' => 'Å edÃ¡ referenÄnÃ­ kÅivka',
+   'GrayResponseUnit' => {
+      Description => 'Jednotka odezvy Å¡edÃ©',
+      PrintConv => {
+        '0.0001' => 'ÄÃ­slo udÃ¡vajÃ­cÃ­ tisÃ­ce jednotek',
+        '0.001' => 'ÄÃ­slo udÃ¡vajÃ­cÃ­ stovky jednotek',
+        '0.1' => 'ÄÃ­slo udÃ¡vajÃ­cÃ­ desÃ­tky jednotek',
+        '1e-05' => 'ÄÃ­slo udÃ¡vajÃ­cÃ­ desetitisÃ­ce jednotek',
+        '1e-06' => 'ÄÃ­slo udÃ¡vajÃ­cÃ­ statisÃ­ce jednotek',
+      },
+    },
+   'HalftoneHints' => 'PÅ¯ltÃ³ny',
+   'Headline' => 'Titulek',
+   'HighISONoiseReduction' => {
+      PrintConv => {
+        'Low' => 'MÃ©nÄ',
+        'Normal' => 'NormÃ¡lnÃ­',
+      },
+    },
+   'HostComputer' => 'Host',
+   'Hue' => 'OdstÃ­n',
+   'IPTC-NAA' => 'IPTC-NAA metadata',
+   'ISO' => 'Citlivost ISO',
+   'ISOSetting' => {
+      PrintConv => {
+        'Manual' => 'ManuÃ¡lnÃ­',
+      },
+    },
+   'ImageDescription' => 'Popis obrÃ¡zku',
+   'ImageHeight' => 'VÃœÅ¡ka',
+   'ImageHistory' => 'Historie obrÃ¡zku',
+   'ImageNumber' => 'ÄÃ­slo obrÃ¡zku',
+   'ImageOrientation' => {
+      PrintConv => {
+        'Portrait' => 'PortrÃ©t',
+      },
+    },
+   'ImageQuality' => {
+      PrintConv => {
+        'Normal' => 'NormÃ¡lnÃ­',
+      },
+    },
+   'ImageSize' => 'Velikost snÃ­mku',
+   'ImageSourceData' => 'ZdrojovÃ¡ data obrÃ¡zku',
+   'ImageTone' => {
+      PrintConv => {
+        'Landscape' => 'Krajina',
+        'Portrait' => 'PortrÃ©t',
+      },
+    },
+   'ImageUniqueID' => 'JedineÄnÃ© ID obrÃ¡zku',
+   'ImageWidth' => 'Å Ã­Åka',
+   'Index' => 'NÃ¡povÄda',
+   'InkNames' => 'NÃ¡zev nÃ¡plnÄ',
+   'InkSet' => 'InkoustovÃ¡ sada',
+   'Instructions' => 'Pokyny',
+   'InternalFlash' => {
+      PrintConv => {
+        'Fired' => 'Blesk ano',
+        'Manual' => 'ManuÃ¡lnÃ­',
+        'No' => 'Blesk ne',
+      },
+    },
+   'InteropIndex' => {
+      Description => 'Identifikace',
+      PrintConv => {
+        'R03 - DCF option file (Adobe RGB)' => 'R03: DCF option file (Adobe RGB)',
+        'R98 - DCF basic file (sRGB)' => 'R98: DCF basic file (sRGB)',
+        'THM - DCF thumbnail file' => 'THM: DCF thumbnail file',
+      },
+    },
+   'InteropOffset' => 'ZnaÄka souÄinnosti',
+   'InteropVersion' => 'Verze kompatibility',
+   'JFIFVersion' => 'JFIF verze',
+   'Keyword' => 'KlÃ­ÄovÃ¡ slova',
+   'Keywords' => 'KlÃ­ÄovÃ¡ slova',
+   'LeafData' => 'Leaf data',
+   'Lens' => 'Objektiv',
+   'LensInfo' => 'Informace o optice',
+   'LicenseType' => {
+      PrintConv => {
+        'Unknown' => 'NeznÃ¡mÃœ',
+      },
+    },
+   'LightSource' => {
+      Description => 'Zdroj svÄtla',
+      PrintConv => {
+        'Cloudy' => 'ZataÅŸeno',
+        'Cool White Fluorescent' => 'StudenÃ¡ zÃ¡Åivka',
+        'Day White Fluorescent' => 'DennÃ­ zÃ¡Åivka',
+        'Daylight' => 'DennÃ­ svÄtlo',
+        'Daylight Fluorescent' => 'DennÃ­ svÄtlo',
+        'Fine Weather' => 'SluneÄno',
+        'Flash' => 'Blesk',
+        'Fluorescent' => 'ÅœÃ¡rovka',
+        'ISO Studio Tungsten' => 'StudiovÃ¡ svÄtla',
+        'Other' => 'JinÃ© osvÄtlenÃ­',
+        'Shade' => 'StÃ­ny',
+        'Standard Light A' => 'StandardnÃ­ svÄtlo A',
+        'Standard Light B' => 'StandardnÃ­ svÄtlo B',
+        'Standard Light C' => 'StandardnÃ­ svÄtlo C',
+        'Tungsten (Incandescent)' => 'ZÃ¡Åivka',
+        'Unknown' => 'NeznÃ¡mÃœ',
+        'White Fluorescent' => 'BÃ­lÃ¡ zÃ¡Åivka',
+      },
+    },
+   'Lightness' => 'Jas',
+   'Location' => 'Lokalita',
+   'LoopStyle' => {
+      PrintConv => {
+        'Normal' => 'NormÃ¡lnÃ­',
+      },
+    },
+   'LuminanceNoiseReduction' => {
+      PrintConv => {
+        'Low' => 'MÃ©nÄ',
+      },
+    },
+   'MIEVersion' => 'MIE verze',
+   'Macro' => {
+      PrintConv => {
+        'Macro' => 'Makro',
+        'Manual' => 'ManuÃ¡lnÃ­',
+        'Normal' => 'NormÃ¡lnÃ­',
+      },
+    },
+   'MacroMode' => {
+      PrintConv => {
+        'Macro' => 'Makro',
+        'Normal' => 'NormÃ¡lnÃ­',
+      },
+    },
+   'Make' => 'VÃœrobce',
+   'MakerNote' => 'PrivÃ¡tnÃ­ data vÃœrobce',
+   'MakerNotes' => 'PoznÃ¡mka vÃœrobce',
+   'ManualFlashOutput' => {
+      PrintConv => {
+        'Low' => 'MÃ©nÄ',
+      },
+    },
+   'MaxAperture' => 'MaximÃ¡lnÃ­ clona+C1233 objektivu',
+   'MaxApertureValue' => 'Max clona objektivu',
+   'MaxSampleValue' => 'Max. hodnota vzorku',
+   'MediaType' => {
+      PrintConv => {
+        'Normal' => 'NormÃ¡lnÃ­',
+      },
+    },
+   'Metering' => {
+      PrintConv => {
+        'Spot' => 'StÅedovÃœ bod',
+      },
+    },
+   'MeteringMode' => {
+      Description => 'ReÅŸim mÄÅenÃ­ expozice',
+      PrintConv => {
+        'Average' => 'PrÅ¯mÄr',
+        'Center-weighted average' => 'ZvÃœraznÄnÃœ stÅed',
+        'Multi-segment' => 'Multi segment',
+        'Multi-spot' => 'VÃ­cebodovÃ©',
+        'Other' => 'JinÃ©',
+        'Partial' => 'BlokovÃ©',
+        'Spot' => 'StÅedovÃœ bod',
+        'Unknown' => 'NeznÃ¡mÃœ',
+      },
+    },
+   'MeteringMode2' => {
+      PrintConv => {
+        'Multi-segment' => 'Multi segment',
+      },
+    },
+   'MeteringMode3' => {
+      PrintConv => {
+        'Multi-segment' => 'Multi segment',
+      },
+    },
+   'MinSampleValue' => 'Min. hodnota vzorku',
+   'MinoltaQuality' => {
+      PrintConv => {
+        'Normal' => 'NormÃ¡lnÃ­',
+      },
+    },
+   'Model' => 'Typ fotoaparÃ¡tu',
+   'Model2' => 'Typ zaÅÃ­zenÃ­ (2)',
+   'ModifiedPictureStyle' => {
+      PrintConv => {
+        'Landscape' => 'Krajina',
+        'None' => 'ÅœÃ¡dnÃ¡',
+        'Portrait' => 'PortrÃ©t',
+      },
+    },
+   'ModifiedSharpnessFreq' => {
+      PrintConv => {
+        'Low' => 'MÃ©nÄ',
+      },
+    },
+   'ModifiedToneCurve' => {
+      PrintConv => {
+        'Manual' => 'ManuÃ¡lnÃ­',
+      },
+    },
+   'ModifiedWhiteBalance' => {
+      PrintConv => {
+        'Cloudy' => 'ZataÅŸeno',
+        'Daylight' => 'DennÃ­ svÄtlo',
+        'Daylight Fluorescent' => 'DennÃ­ svÄtlo',
+        'Flash' => 'Blesk',
+        'Fluorescent' => 'ÅœÃ¡rovka',
+        'Shade' => 'StÃ­ny',
+        'Tungsten' => 'ZÃ¡Åivka',
+      },
+    },
+   'ModifyDate' => 'Datum a Äas zmÄny souboru',
+   'MonochromeFilterEffect' => {
+      PrintConv => {
+        'None' => 'ÅœÃ¡dnÃ¡',
+      },
+    },
+   'MonochromeToningEffect' => {
+      PrintConv => {
+        'None' => 'ÅœÃ¡dnÃ¡',
+      },
+    },
+   'NEFCompression' => {
+      PrintConv => {
+        'Uncompressed' => 'Bez komprese',
+      },
+    },
+   'Noise' => 'Å um',
+   'NoiseFilter' => {
+      PrintConv => {
+        'Low' => 'MÃ©nÄ',
+      },
+    },
+   'NoiseReduction' => {
+      Description => 'PotlaÄenÃ­ Å¡umu',
+      PrintConv => {
+        'Normal' => 'NormÃ¡lnÃ­',
+      },
+    },
+   'NumberofInks' => 'ÄÃ­slo nÃ¡plnÄ',
+   'ObjectFileType' => {
+      PrintConv => {
+        'None' => 'ÅœÃ¡dnÃ¡',
+        'Unknown' => 'NeznÃ¡mÃœ',
+      },
+    },
+   'OldSubfileType' => 'Typ podsekce',
+   'Opto-ElectricConvFactor' => 'Optoel. konverznÃ­ faktor (OECF)',
+   'Orientation' => {
+      Description => 'Orientace',
+      PrintConv => {
+        'Horizontal (normal)' => '0Â° (nahoru/vlevo)',
+        'Mirror horizontal' => '0Â° (nahoru/vpravo)',
+        'Mirror horizontal and rotate 270 CW' => '90Â° po smÄru HR (vlevo/nahoru)',
+        'Mirror horizontal and rotate 90 CW' => '90Â° ptoti smÄru HR (vpravo/dolÅ¯)',
+        'Mirror vertical' => '180Â° (dolÅ¯/vlevo)',
+        'Rotate 180' => '180Â° (dolÅ¯/vpravo)',
+        'Rotate 270 CW' => '90Â° po smÄru HR (vlevo/dolÅ¯)',
+        'Rotate 90 CW' => '90Â° ptoti smÄru HR (vpravo/nahoru)',
+      },
+    },
+   'PEFVersion' => 'PEF verze',
+   'Padding' => 'NÃ¡hradnÃ­ znaky',
+   'PageName' => 'JmÃ©no strÃ¡nky',
+   'PageNumber' => 'ÄÃ­slo strÃ¡nky',
+   'PhotoEffectsType' => {
+      PrintConv => {
+        'None' => 'ÅœÃ¡dnÃ¡',
+      },
+    },
+   'PhotometricInterpretation' => {
+      Description => 'PixelovÃ© schÃ©ma',
+      PrintConv => {
+        'BlackIsZero' => 'ÄernÃ¡ je nula',
+        'Color Filter Array' => 'CFA (Color Filter Matrix)',
+        'Pixar LogL' => 'CIE Log2(L) (Log luminance)',
+        'Pixar LogLuv' => 'CIE Log2(L)(u\',v\') (Log luminance and chrominance)',
+        'RGB Palette' => 'BarevnÃ© schema',
+        'Transparency Mask' => 'PrÅ¯hlednost',
+        'WhiteIsZero' => 'BÃ­lÃ¡ je nula',
+      },
+    },
+   'PhotoshopAnnotations' => 'PoznÃ¡mky Photoshop',
+   'PictureFinish' => {
+      PrintConv => {
+        'Portrait' => 'PortrÃ©t',
+      },
+    },
+   'PictureMode' => {
+      PrintConv => {
+        'Aperture-priority AE' => 'Priorita clony',
+        'Landscape' => 'Krajina',
+        'Macro' => 'Makro',
+        'Manual' => 'ManuÃ¡lnÃ­',
+        'Portrait' => 'PortrÃ©t',
+        'Shutter speed priority AE' => 'Priorita Äasu',
+      },
+    },
+   'PictureMode2' => {
+      PrintConv => {
+        'Aperture Priority' => 'Priorita clony',
+        'Manual' => 'ManuÃ¡lnÃ­',
+        'Shutter Speed Priority' => 'Priorita Äasu',
+      },
+    },
+   'PictureStyle' => {
+      PrintConv => {
+        'Landscape' => 'Krajina',
+        'None' => 'ÅœÃ¡dnÃ¡',
+        'Portrait' => 'PortrÃ©t',
+      },
+    },
+   'PixelUnits' => {
+      PrintConv => {
+        'Unknown' => 'NeznÃ¡mÃœ',
+      },
+    },
+   'PlanarConfiguration' => {
+      Description => 'UspoÅÃ¡dÃ¡nÃ­ obrazovÃœch dat',
+      PrintConv => {
+        'Chunky' => 'Chunky Format (proklÃ¡danÃœ)',
+        'Planar' => 'PlanÃ¡rnÃ­ (dvojrozmÄrnÃœ)',
+      },
+    },
+   'Predictor' => {
+      Description => 'Predikce',
+      PrintConv => {
+        'Horizontal differencing' => 'HorizontÃ¡lnÃ­ diferenciace',
+        'None' => 'Bez predikce',
+      },
+    },
+   'PreviewColorSpace' => {
+      PrintConv => {
+        'Unknown' => 'NeznÃ¡mÃœ',
+      },
+    },
+   'PreviewImage' => 'NÃ¡hled',
+   'PreviewQuality' => {
+      PrintConv => {
+        'Normal' => 'NormÃ¡lnÃ­',
+      },
+    },
+   'PrimaryChromaticities' => 'ChromatiÄnost primÃ¡rnÃ­ch barev',
+   'ProgramLine' => {
+      PrintConv => {
+        'Normal' => 'NormÃ¡lnÃ­',
+      },
+    },
+   'ProgramMode' => {
+      PrintConv => {
+        'None' => 'ÅœÃ¡dnÃ¡',
+        'Portrait' => 'PortrÃ©t',
+      },
+    },
+   'Province-State' => 'StÃ¡t/provincie',
+   'Quality' => {
+      PrintConv => {
+        'Low' => 'MÃ©nÄ',
+        'Normal' => 'NormÃ¡lnÃ­',
+      },
+    },
+   'QualityMode' => {
+      PrintConv => {
+        'Normal' => 'NormÃ¡lnÃ­',
+      },
+    },
+   'RAFVersion' => 'RAF verze',
+   'Rating' => 'HodnocenÃ­',
+   'RatingPercent' => 'HodnocenÃ­ v procentech',
+   'RawJpgQuality' => {
+      PrintConv => {
+        'Normal' => 'NormÃ¡lnÃ­',
+      },
+    },
+   'RecordMode' => {
+      Description => 'ReÅŸim zÃ¡znamu',
+      PrintConv => {
+        'Aperture Priority' => 'Priorita clony',
+        'Manual' => 'ManuÃ¡lnÃ­',
+        'Shutter Priority' => 'Priorita Äasu',
+      },
+    },
+   'RecordingMode' => {
+      PrintConv => {
+        'Landscape' => 'Krajina',
+        'Manual' => 'ManuÃ¡lnÃ­',
+        'Portrait' => 'PortrÃ©t',
+      },
+    },
+   'ReferenceBlackWhite' => 'ÄernÃœ a bÃ­lÃœ referenÄnÃ­ bod',
+   'RelatedImageFileFormat' => 'ObrazovÃœ formÃ¡t',
+   'RelatedImageHeight' => 'VÃœÅ¡ka obrÃ¡zku',
+   'RelatedImageWidth' => 'Å Ã­Åka obrÃ¡zku',
+   'RelatedSoundFile' => 'Audio soubor',
+   'ResampleParamsQuality' => {
+      PrintConv => {
+        'Low' => 'MÃ©nÄ',
+      },
+    },
+   'ResolutionUnit' => {
+      Description => 'Jednotka X a Y rozliÅ¡enÃ­',
+      PrintConv => {
+        'None' => 'ÅœÃ¡dnÃ¡',
+        'cm' => 'pixely/cm',
+        'inches' => 'Palce',
+      },
+    },
+   'RetouchHistory' => {
+      PrintConv => {
+        'None' => 'ÅœÃ¡dnÃ¡',
+      },
+    },
+   'Rotation' => {
+      PrintConv => {
+        'Horizontal' => '0Â° (nahoru/vlevo)',
+        'Horizontal (Normal)' => '0Â° (nahoru/vlevo)',
+        'Horizontal (normal)' => '0Â° (nahoru/vlevo)',
+        'Rotate 180' => '180Â° (dolÅ¯/vpravo)',
+        'Rotate 270 CW' => '90Â° po smÄru HR (vlevo/dolÅ¯)',
+        'Rotate 90 CW' => '90Â° ptoti smÄru HR (vpravo/nahoru)',
+        'Rotated 180' => '180Â° (dolÅ¯/vpravo)',
+        'Rotated 270 CW' => '90Â° po smÄru HR (vlevo/dolÅ¯)',
+        'Rotated 90 CW' => '90Â° ptoti smÄru HR (vpravo/nahoru)',
+      },
+    },
+   'RowsPerStrip' => 'PoÄet ÅÃ¡dek v ÄÃ¡sti',
+   'SPIFFVersion' => 'SPIFF verze',
+   'SVGVersion' => 'SVG verze',
+   'SampleFormat' => {
+      Description => 'FormÃ¡t vzorku',
+      PrintConv => {
+        'Complex int' => 'KomplexnÃ­ ÄÃ­slo',
+        'Float' => 'DesetinnÃ¡ ÄÃ¡rka',
+        'Signed' => 'ZÃ¡pornÃ© ÄÃ­slo',
+        'Undefined' => 'NedefinovanÃ©',
+        'Unsigned' => 'KladnÃ© ÄÃ­slo',
+      },
+    },
+   'SamplesPerPixel' => 'PoÄet sloÅŸek',
+   'Saturation' => {
+      Description => 'Saturace',
+      PrintConv => {
+        'High' => 'VysokÃ¡',
+        'Low' => 'NÃ­zkÃ¡',
+        'Normal' => 'NormÃ¡lnÃ­',
+      },
+    },
+   'SceneCaptureType' => {
+      Description => 'Typ scÃ©ny',
+      PrintConv => {
+        'Landscape' => 'Krajina',
+        'Night' => 'NoÄnÃ­ foto',
+        'Portrait' => 'PortrÃ©t',
+      },
+    },
+   'SceneMode' => {
+      PrintConv => {
+        'Aperture Priority' => 'Priorita clony',
+        'Landscape' => 'Krajina',
+        'Macro' => 'Makro',
+        'Manual' => 'ManuÃ¡lnÃ­',
+        'Normal' => 'NormÃ¡lnÃ­',
+        'Portrait' => 'PortrÃ©t',
+        'Shutter Priority' => 'Priorita Äasu',
+        'Spot' => 'StÅedovÃœ bod',
+        'Sunset' => 'ZÃ¡pad',
+      },
+    },
+   'SceneModeUsed' => {
+      PrintConv => {
+        'Aperture Priority' => 'Priorita clony',
+        'Landscape' => 'Krajina',
+        'Macro' => 'Makro',
+        'Manual' => 'ManuÃ¡lnÃ­',
+        'Portrait' => 'PortrÃ©t',
+        'Shutter Priority' => 'Priorita Äasu',
+      },
+    },
+   'SceneSelect' => {
+      PrintConv => {
+        'Night' => 'NoÄnÃ­ foto',
+      },
+    },
+   'SceneType' => {
+      Description => 'Typ scÃ©ny',
+      PrintConv => {
+        'Directly photographed' => 'PÅÃ­mo poÅÃ­zenÃœ snÃ­mek',
+      },
+    },
+   'SecurityClassification' => {
+      Description => 'BezpeÄnostnÃ­ klasifikace',
+      PrintConv => {
+        'Confidential' => 'DÅ¯vÄrnÃœ',
+        'Restricted' => 'VyhrazenÃœ',
+        'Secret' => 'TajnÃœ',
+        'Top Secret' => 'Velmi tajnÃœ',
+        'Unclassified' => 'NeurÄeno',
+      },
+    },
+   'SelfTimerMode' => 'SamospouÅ¡Å¥',
+   'SensingMethod' => {
+      Description => 'Metoda mÄÅenÃ­',
+      PrintConv => {
+        'Color sequential area' => 'BarevnÃœ sekvenÄnÃ­ ploÅ¡nÃœ sensor',
+        'Color sequential linear' => 'BarevnÃœ sekvenÄnÃ©-lineÃ¡rnÃ­ senzor',
+        'Monochrome area' => 'MonochromatickÃœ senzor',
+        'Monochrome linear' => 'MonochromatickÃœ lineÃ¡rnÃ­ senzor',
+        'Not defined' => 'NedefinovanÃœ',
+        'One-chip color area' => 'JednoÄipovÃœ barevnÃœ senzor',
+        'Three-chip color area' => 'TÅÃ­ÄipovÃœ barevnÃœ senzor',
+        'Trilinear' => 'TÅÃ­lineÃ¡rnÃ­ senzor',
+        'Two-chip color area' => 'DvouÄipovÃœ barevnÃœ senzor',
+      },
+    },
+   'SequentialShot' => {
+      PrintConv => {
+        'None' => 'ÅœÃ¡dnÃ¡',
+      },
+    },
+   'SerialNumber' => 'ID fotoaparÃ¡tu',
+   'SetButtonCrossKeysFunc' => {
+      PrintConv => {
+        'Normal' => 'NormÃ¡lnÃ­',
+      },
+    },
+   'ShadingCompensation' => 'Kompenzace stÃ­novÃ¡nÃ­',
+   'Sharpness' => {
+      Description => 'DoostÅenÃ­',
+      PrintConv => {
+        'Hard' => 'SilnÃ©',
+        'Normal' => 'NormÃ¡lnÃ­',
+        'Soft' => 'LehkÃ©',
+      },
+    },
+   'SharpnessFrequency' => {
+      PrintConv => {
+        'Low' => 'MÃ©nÄ',
+      },
+    },
+   'ShootingMode' => {
+      Description => 'ReÅŸim focenÃ­',
+      PrintConv => {
+        'Aperture Priority' => 'Priorita clony',
+        'Macro' => 'Makro',
+        'Manual' => 'ManuÃ¡lnÃ­',
+        'Normal' => 'NormÃ¡lnÃ­',
+        'Portrait' => 'PortrÃ©t',
+        'Shutter Priority' => 'Priorita Äasu',
+        'Spot' => 'StÅedovÃœ bod',
+      },
+    },
+   'ShutterMode' => {
+      PrintConv => {
+        'Aperture Priority' => 'Priorita clony',
+      },
+    },
+   'ShutterSpeed' => 'ExpoziÄnÃ­ Äas',
+   'ShutterSpeedValue' => 'Äas zÃ¡vÄrky',
+   'SlowShutter' => {
+      PrintConv => {
+        'None' => 'ÅœÃ¡dnÃ¡',
+      },
+    },
+   'Software' => 'PouÅŸitÃœ software',
+   'Source' => 'Zdroj',
+   'SpatialFrequencyResponse' => 'Spatial frequency response',
+   'SpecialEffectsOpticalFilter' => {
+      PrintConv => {
+        'None' => 'ÅœÃ¡dnÃ¡',
+      },
+    },
+   'SpectralSensitivity' => 'SpektrÃ¡lnÃ­ citlivost',
+   'State' => 'StÃ¡t',
+   'StripByteCounts' => 'BytÅ¯ na komprimovanou ÄÃ¡st',
+   'StripOffsets' => 'Pozice obrazovÃœch dat',
+   'SubSecCreateDate' => 'Datum a Äas generovÃ¡nÃ­ digitÃ¡lnÃ­ch dat',
+   'SubSecDateTimeOriginal' => 'Datum a Äas vzniku originÃ¡lnÃ­ch dat',
+   'SubSecModifyDate' => 'Datum a Äas zmÄny souboru',
+   'SubSecTime' => 'DateTime 1/100 sekundy',
+   'SubSecTimeDigitized' => 'DateTimeDigitized 1/100 sekund',
+   'SubSecTimeOriginal' => 'DateTimeOriginal 1/100 sekund',
+   'SubfileType' => 'NovÃœ typ podsekce',
+   'Subject' => 'Popis',
+   'SubjectArea' => 'Pozice hlavnÃ­ho objektu',
+   'SubjectDistance' => 'VzdÃ¡lenost objektu',
+   'SubjectDistanceRange' => {
+      Description => 'Rozsah vzdÃ¡lenosti objektu',
+      PrintConv => {
+        'Close' => 'BlÃ­zkÃœ',
+        'Distant' => 'VzdÃ¡lenÃœ',
+        'Macro' => 'Makro',
+        'Unknown' => 'NeznÃ¡mÃœ',
+      },
+    },
+   'SubjectLocation' => 'Pozice hlavnÃ­ho objektu',
+   'SubjectProgram' => {
+      PrintConv => {
+        'None' => 'ÅœÃ¡dnÃ¡',
+        'Portrait' => 'PortrÃ©t',
+      },
+    },
+   'Subsystem' => {
+      PrintConv => {
+        'Unknown' => 'NeznÃ¡mÃœ',
+      },
+    },
+   'SupplementalCategories' => 'DoplÅkovÃ© kategorie',
+   'T4Options' => 'PlnÃ© bity',
+   'T6Options' => 'Volby T6',
+   'TargetPrinter' => 'CÃ­lovÃ¡ tiskÃ¡rna',
+   'Teleconverter' => {
+      PrintConv => {
+        'None' => 'ÅœÃ¡dnÃ¡',
+      },
+    },
+   'Thresholding' => 'PrÃ¡h',
+   'ThumbnailImage' => 'NÃ¡hled',
+   'ThumbnailImageSize' => 'Velkost nÃ¡hledu',
+   'TileByteCounts' => 'PoÄet bytÅ¯ prvku',
+   'TileLength' => 'DÃ©lka prvku',
+   'TileOffsets' => 'Offset prvku',
+   'TileWidth' => 'Å Ã­Åka prvku',
+   'TimeScaleParamsQuality' => {
+      PrintConv => {
+        'Low' => 'MÃ©nÄ',
+      },
+    },
+   'Title' => 'NÃ¡zev',
+   'ToneCurve' => {
+      PrintConv => {
+        'Manual' => 'ManuÃ¡lnÃ­',
+      },
+    },
+   'ToningEffect' => {
+      PrintConv => {
+        'None' => 'ÅœÃ¡dnÃ¡',
+      },
+    },
+   'ToningEffectMonochrome' => {
+      PrintConv => {
+        'None' => 'ÅœÃ¡dnÃ¡',
+      },
+    },
+   'TransferFunction' => 'Transfer funkce',
+   'Transformation' => {
+      PrintConv => {
+        'Horizontal (normal)' => '0Â° (nahoru/vlevo)',
+        'Mirror horizontal' => '0Â° (nahoru/vpravo)',
+        'Mirror horizontal and rotate 270 CW' => '90Â° po smÄru HR (vlevo/nahoru)',
+        'Mirror horizontal and rotate 90 CW' => '90Â° ptoti smÄru HR (vpravo/dolÅ¯)',
+        'Mirror vertical' => '180Â° (dolÅ¯/vlevo)',
+        'Rotate 180' => '180Â° (dolÅ¯/vpravo)',
+        'Rotate 270 CW' => '90Â° po smÄru HR (vlevo/dolÅ¯)',
+        'Rotate 90 CW' => '90Â° ptoti smÄru HR (vpravo/nahoru)',
+      },
+    },
+   'TransmissionReference' => 'Reference pÅenosu',
+   'Trapped' => {
+      PrintConv => {
+        'Unknown' => 'NeznÃ¡mÃœ',
+      },
+    },
+   'Urgency' => 'NalÃ©havost',
+   'UserComment' => 'KomentÃ¡Å',
+   'UserDef1PictureStyle' => {
+      PrintConv => {
+        'Landscape' => 'Krajina',
+        'Portrait' => 'PortrÃ©t',
+      },
+    },
+   'UserDef2PictureStyle' => {
+      PrintConv => {
+        'Landscape' => 'Krajina',
+        'Portrait' => 'PortrÃ©t',
+      },
+    },
+   'UserDef3PictureStyle' => {
+      PrintConv => {
+        'Landscape' => 'Krajina',
+        'Portrait' => 'PortrÃ©t',
+      },
+    },
+   'VRDVersion' => 'VRD verze',
+   'Version' => 'Verze',
+   'VignetteControl' => {
+      PrintConv => {
+        'Normal' => 'NormÃ¡lnÃ­',
+      },
+    },
+   'WBAdjLighting' => {
+      PrintConv => {
+        'Daylight' => 'DennÃ­ svÄtlo',
+        'Flash' => 'Blesk',
+        'None' => 'ÅœÃ¡dnÃ¡',
+      },
+    },
+   'WhiteBalance' => {
+      Description => 'VyvÃ¡ÅŸenÃ­ bÃ­lÃ©',
+      PrintConv => {
+        'Auto' => 'AutomatickÃ© vyvÃ¡ÅŸenÃ­ bÃ­lÃ©',
+        'Black & White' => 'ÄernobÃ­lÃ© foto',
+        'Cloudy' => 'ZataÅŸeno',
+        'Cool White Fluorescent' => 'ChladnÃ¡ bÃ­lÃ¡ fluorescentnÃ­',
+        'Custom 1' => 'VLASTNÃ1',
+        'Custom 2' => 'VLASTNÃ2',
+        'Custom 3' => 'VLASTNÃ3',
+        'Custom 4' => 'VLASTNÃ4',
+        'Day White Fluorescent' => 'DennÃ­ zÃ¡Åivka',
+        'Daylight' => 'DennÃ­ svÄtlo',
+        'Daylight Fluorescent' => 'DennÃ­ svÄtlo',
+        'Flash' => 'Blesk',
+        'Fluorescent' => 'ÅœÃ¡rovka',
+        'Manual' => 'ManuÃ¡lnÃ­',
+        'Shade' => 'StÃ­ny',
+        'Tungsten' => 'ZÃ¡Åivka',
+        'Unknown' => 'NeznÃ¡mÃœ',
+        'White Fluorescent' => 'BÃ­lÃ¡ zÃ¡Åivka',
+      },
+    },
+   'WhiteBalanceAdj' => {
+      PrintConv => {
+        'Cloudy' => 'ZataÅŸeno',
+        'Daylight' => 'DennÃ­ svÄtlo',
+        'Flash' => 'Blesk',
+        'Fluorescent' => 'ÅœÃ¡rovka',
+        'Shade' => 'StÃ­ny',
+        'Tungsten' => 'ZÃ¡Åivka',
+      },
+    },
+   'WhiteBalanceMode' => {
+      PrintConv => {
+        'Unknown' => 'NeznÃ¡mÃœ',
+      },
+    },
+   'WhiteBalanceSet' => {
+      PrintConv => {
+        'Cloudy' => 'ZataÅŸeno',
+        'Daylight' => 'DennÃ­ svÄtlo',
+        'Daylight Fluorescent' => 'DennÃ­ svÄtlo',
+        'Flash' => 'Blesk',
+        'Manual' => 'ManuÃ¡lnÃ­',
+        'Shade' => 'StÃ­ny',
+        'Tungsten' => 'ZÃ¡Åivka',
+        'White Fluorescent' => 'BÃ­lÃ¡ zÃ¡Åivka',
+      },
+    },
+   'WhitePoint' => 'ChromatiÄnost bÃ­lÃ©ho bodu',
+   'Writer-Editor' => 'Autor popisku',
+   'XMP' => 'XMP metadata',
+   'XPAuthor' => 'Autor',
+   'XPComment' => 'KomentÃ¡Å',
+   'XPKeywords' => 'KlÃ­ÄovÃ¡ slova',
+   'XPSubject' => 'Popis',
+   'XPTitle' => 'NÃ¡zev',
+   'XPosition' => 'X-pozice',
+   'XResolution' => 'RozliÅ¡enÃ­ obrÃ¡zku na Å¡Ã­Åku',
+   'YCbCrCoefficients' => 'Koeficienty transformaÄnÃ­ YCbCr matrice',
+   'YCbCrPositioning' => {
+      Description => 'Y a C pozice',
+      PrintConv => {
+        'Centered' => 'CentrovanÃ©',
+        'Co-sited' => 'Po stranÃ¡ch',
+      },
+    },
+   'YCbCrSubSampling' => 'VzorkovacÃ­ pomÄr Y k C',
+   'YPosition' => 'Y-pozice',
+   'YResolution' => 'RozliÅ¡enÃ­ obrÃ¡zku na vÃœÅ¡ku',
+);
+
+1;  # end
+
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Lang::cs.pm - ExifTool Czech language translations
+
+=head1 DESCRIPTION
+
+This file is used by Image::ExifTool to generate localized tag descriptions
+and values.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Jens Duttke and Petr MichE<aacute>lek for providing this
+translation.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool(3pm)|Image::ExifTool>,
+L<Image::ExifTool::TagInfoXML(3pm)|Image::ExifTool::TagInfoXML>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/de.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/de.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/de.pm	(revision 24799)
@@ -0,0 +1,5478 @@
+#------------------------------------------------------------------------------
+# File:         de.pm
+#
+# Description:  ExifTool German language translations
+#
+# Notes:        This file generated automatically by Image::ExifTool::TagInfoXML
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Lang::de;
+
+use strict;
+use vars qw($VERSION);
+
+$VERSION = '1.21';
+
+%Image::ExifTool::Lang::de::Translate = (
+   'AEAperture' => 'AE-Blende',
+   'AEBAutoCancel' => {
+      Description => 'Automatisches Bracketingende',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'AEBBracketValue' => 'AEB-Korrekturwert',
+   'AEBSequence' => 'Bracketing-Sequenz',
+   'AEBSequenceAutoCancel' => {
+      Description => 'WB-Sequenz/autom. Abschaltung',
+      PrintConv => {
+        '-,0,+/Disabled' => '-,0,+/Aus',
+        '-,0,+/Enabled' => '-,0,+/Ein',
+        '0,-,+/Disabled' => '0,-,+/Aus',
+        '0,-,+/Enabled' => '0,-,+/Ein',
+      },
+    },
+   'AEBShotCount' => 'Anzahl Belichtungsreihenaufnahmen',
+   'AEBXv' => 'AEB-Belichtungskorrektur',
+   'AEExposureTime' => 'AE-Belichtungszeit',
+   'AEExtra' => 'AE-Extra?',
+   'AEInfo' => 'Automatikbelichtungs-Informationen',
+   'AELock' => {
+      Description => 'Belichtungsspeicher',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'AELockButton' => {
+      Description => 'AE-L/AF-L-Taste',
+      PrintConv => {
+        'AE Lock (hold)' => 'Nur Belichtung (halten)',
+        'AE Lock Only' => 'Nur Belichtung',
+        'AE-L/AF Area' => 'Belichtung & Messfeld',
+        'AE-L/AF-L/AF Area' => 'Bel. & Fokus & Messfeld',
+        'AE/AF Lock' => 'Belichtung & Fokus',
+        'AF Lock Only' => 'Nur Fokus',
+        'AF-L/AF Area' => 'Fokus & Messfeld',
+        'AF-ON' => 'AF-Aktivierung',
+        'AF-ON/AF Area' => 'AF-Aktiv. & Messfeld',
+        'FV Lock' => 'FV-Messwertspeicher',
+        'Focus Area Selection' => 'AF-Messfeldauswahl',
+      },
+    },
+   'AEMaxAperture' => 'GrÃ¶Ãte AE-Blende',
+   'AEMaxAperture2' => 'GrÃ¶Ãte AE-Blende (2)',
+   'AEMeteringMode' => {
+      Description => 'AE Belichtungs-Messmethode',
+      PrintConv => {
+        'Center-weighted average' => 'Mittenbetont',
+        'Multi-segment' => 'Multi-Segment',
+      },
+    },
+   'AEMeteringSegments' => 'AE-Messfelder',
+   'AEMicroadjustment' => 'AE Feinabstimmung',
+   'AEMinAperture' => 'Kleinste AE-Blende',
+   'AEMinExposureTime' => 'KÃŒrzeste AE Belichtungszeit',
+   'AEProgramMode' => {
+      Description => 'AE-Programm-Modus',
+      PrintConv => {
+        'Av, B or X' => 'Av, B oder X',
+        'Candlelight' => 'Kerzenlicht',
+        'DOF Program' => 'SchÃ€rfentiefe-PrioritÃ€t',
+        'DOF Program (P-Shift)' => 'SchÃ€rfentiefe-PrioritÃ€t (P Shift)',
+        'Hi-speed Program' => 'HS-PrioritÃ€t',
+        'Hi-speed Program (P-Shift)' => 'HS-PrioritÃ€t (P Shift)',
+        'Kids' => 'Kinder',
+        'Landscape' => 'Landschaft',
+        'M, P or TAv' => 'M, P oder TAv',
+        'MTF Program' => 'MTF-PrioritÃ€t',
+        'MTF Program (P-Shift)' => 'MTF-PrioritÃ€t (P Shift)',
+        'Macro' => 'Makro',
+        'Night Scene' => 'Nachtszene',
+        'Night Scene Portrait' => 'Nacht-PortrÃ€t',
+        'No Flash' => 'Kein Blitz',
+        'Pet' => 'Haustier',
+        'Portrait' => 'PortrÃ€t',
+        'Sunset' => 'Sonnenuntergang',
+        'Surf & Snow' => 'Surf + Schnee',
+        'Sv or Green Mode' => 'Sv oder "GrÃŒnes" AE-Programm',
+      },
+    },
+   'AESetting' => {
+      Description => 'AE-Einstellung',
+      PrintConv => {
+        'Exposure Compensation' => 'Belichtungsausgleich',
+      },
+    },
+   'AEXv' => 'AE-Belichtungskorrektur',
+   'AE_ISO' => 'AE-ISO-Empfindlichkeit',
+   'AF-CPrioritySelection' => {
+      Description => 'PrioritÃ€t bei AF-C',
+      PrintConv => {
+        'Focus' => 'SchÃ€rfeprioritÃ€t',
+        'Release' => 'AuslÃ¶seprioritÃ€t',
+        'Release + Focus' => 'AuslÃ¶seprioritÃ€t & AF',
+      },
+    },
+   'AF-OnForMB-D10' => {
+      Description => 'AF-ON-Taste (MB-D10)',
+      PrintConv => {
+        'AE Lock (hold)' => 'Belichtung speichern ein/aus',
+        'AE Lock (reset on release)' => 'Bel. speichern ein/aus (Reset)',
+        'AE Lock Only' => 'Belichtung speichern',
+        'AE/AF Lock' => 'Belichtung & Fokus speichern',
+        'AF Lock Only' => 'Fokus speichern',
+        'AF-On' => 'Autofokus aktiviert',
+        'Same as FUNC Button' => 'Wie Funktionstaste',
+      },
+    },
+   'AF-SPrioritySelection' => {
+      Description => 'PrioritÃ€t bei AF-S (Einzel-AF)',
+      PrintConv => {
+        'Focus' => 'SchÃ€rfeprioritÃ€t',
+        'Release' => 'AuslÃ¶seprioritÃ€t',
+      },
+    },
+   'AFActivation' => {
+      Description => 'AF-Aktivierung',
+      PrintConv => {
+        'AF-On Only' => 'Nur AF-ON-Taste',
+        'Shutter/AF-On' => 'AF-On-Taste & AuslÃ¶ser',
+      },
+    },
+   'AFAdjustment' => 'AF-Korrektur',
+   'AFAperture' => 'AF-Blende',
+   'AFArea' => 'AF-Feld',
+   'AFAreaHeight' => 'AF-BereichshÃ¶he',
+   'AFAreaHeights' => 'AF-BereichshÃ¶he',
+   'AFAreaIllumination' => {
+      Description => 'Messfeld-LED',
+      PrintConv => {
+        'Auto' => 'Automatisch',
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'AFAreaMode' => {
+      Description => 'Messfeldsteuerung',
+      PrintConv => {
+        'Auto-area' => 'Autom. Messfeldgr.',
+        'Dynamic Area' => 'Dynamisch',
+        'Dynamic Area (closest subject)' => 'Dynamic Messfeldgruppensteuerung (prioritÃ€t der kÃŒrzesten Aufnahmedistanz)',
+        'Dynamic Area (wide)' => 'Dynamische Messfeldsteuerung (groÃ)',
+        'Face Detect AF' => 'Gesichtserkennung AF',
+        'Group Dynamic' => 'Dynamische Messfeldgruppensteuerung',
+        'Multi-point AF or AI AF' => 'Mehrpunkt AF oder AI AF',
+        'Off (Manual Focus)' => 'Aus (Manueller Fokus)',
+        'Single Area' => 'Einzelfeld',
+        'Single Area (wide)' => 'Einzelfeldmessung (groÃ)',
+        'Single-point AF' => 'Einpunkt AF',
+      },
+    },
+   'AFAreaModeSetting' => {
+      Description => 'Messfeldsteuerung',
+      PrintConv => {
+        'Closest Subject' => 'NÃ€chstes Objekt',
+        'Dynamic Area' => 'Dynamisch',
+        'Single Area' => 'Einzelfeld',
+      },
+    },
+   'AFAreaWidth' => 'AF-Bereichsbreite',
+   'AFAreaWidths' => 'AF-Bereichsbreite',
+   'AFAreaXPositions' => 'AF Bereich X Positionen',
+   'AFAreaYPositions' => 'AF Bereich Y Positionen',
+   'AFAreas' => 'AF-Bereiche',
+   'AFAssist' => {
+      Description => 'AF-Hilfslicht',
+      PrintConv => {
+        'Does not emit/Fires' => 'Kein Messlicht/ZÃŒndung',
+        'Emits/Does not fire' => 'Messlicht/keine ZÃŒndung',
+        'Emits/Fires' => 'Messlicht/ZÃŒndung',
+        'Off' => 'Aus',
+        'On' => 'Ein',
+        'Only ext. flash emits/Fires' => 'Nur ext. Messl./ZÃŒndung',
+      },
+    },
+   'AFAssistBeam' => {
+      Description => 'AF-Hilfslicht Aussendung',
+      PrintConv => {
+        'Does not emit' => 'Deaktiv',
+        'Emits' => 'Aktiv',
+        'Only ext. flash emits' => 'Nur bei ext. Blitz aktiv',
+      },
+    },
+   'AFDefocus' => 'AF-Defocus',
+   'AFDuringLiveView' => {
+      Description => 'AF bei Live View-Aufnahmen',
+      PrintConv => {
+        'Disable' => 'Inaktiv',
+        'Enable' => 'Aktiv',
+        'Live mode' => 'LiveModus',
+        'Quick mode' => 'QuickModus',
+      },
+    },
+   'AFFineTune' => 'AF-Feinabstimmung',
+   'AFFineTuneAdj' => 'AF-Feinabstimmung',
+   'AFImageHeight' => 'AF-BildhÃ¶he',
+   'AFImageWidth' => 'AF-Bildbreite',
+   'AFInfo' => 'AF-Modus',
+   'AFInfo2' => 'AF-Informationen',
+   'AFInfo2Version' => 'AF-Info-Version',
+   'AFIntegrationTime' => 'AF-Messzeit',
+   'AFMicroAdjActive' => {
+      PrintConv => {
+        'No' => 'Nein',
+        'Yes' => 'Ja',
+      },
+    },
+   'AFMicroadjustment' => {
+      Description => 'AF Feinabstimmung',
+      PrintConv => {
+        'Adjust all by same amount' => 'Alle auf gleichen Wert',
+        'Adjust by lens' => 'Abstimmung pro Objektiv',
+        'Disable' => 'Deaktivieren',
+      },
+    },
+   'AFMode' => 'AF-Modus',
+   'AFOnAELockButtonSwitch' => {
+      Description => 'AF-ON/AELocktaste- Schalter',
+      PrintConv => {
+        'Disable' => 'Deaktiviert',
+        'Enable' => 'Aktiviert',
+      },
+    },
+   'AFPoint' => {
+      Description => 'GewÃ€hlter AF-Punkt',
+      PrintConv => {
+        'Auto AF point selection' => 'Automatische Wahl des AF-Punktes',
+        'Bottom' => 'Unten',
+        'Center' => 'Mitte',
+        'Center (horizontal)' => 'Mitte (horizontal)',
+        'Center (vertical)' => 'Mitte (vertical)',
+        'Face Detect' => 'Gesichtserkennung',
+        'Far Left' => 'Ganz links',
+        'Far Right' => 'Ganz rechts',
+        'Left' => 'Links',
+        'Lower-left' => 'Unten-Links',
+        'Lower-right' => 'Unten-Rechts',
+        'Manual AF point selection' => 'Manuell gewÃ€hlter AF-Punkt',
+        'Mid-left' => 'Links-Mitte',
+        'Mid-right' => 'Rechts-Mitte',
+        'None' => 'Kein',
+        'None (MF)' => 'Kein (MF)',
+        'Right' => 'Rechts',
+        'Top' => 'Oben',
+        'Upper-left' => 'Oben-Links',
+        'Upper-right' => 'Oben-Rechts',
+      },
+    },
+   'AFPointActivationArea' => 'AF-Messfeld-Aktivierungsbereich',
+   'AFPointAreaExpansion' => {
+      Description => 'AF-Messbereich Ausweitung',
+      PrintConv => {
+        'Disable' => 'Aus',
+        'Enable' => 'An',
+        'Left/right AF points' => 'MÃ¶glich (linkes/rechtes zusÃ€tzliches AF-Messfeld)',
+        'Surrounding AF points' => 'MÃ¶glich (entsprechendes zusÃ€tzliches AF-Messfeld)',
+      },
+    },
+   'AFPointAutoSelection' => {
+      Description => 'Automatische AF-Feldwahl',
+      PrintConv => {
+        'Control-direct:disable/Main:disable' => 'Schnelleinstellrad-Direkt:nicht mÃ¶glich/Haupt-Wahlrad:nein',
+        'Control-direct:disable/Main:enable' => 'Schnelleinstellrad-Direkt:nicht mÃ¶glich/Haupt-Wahlrad:mÃ¶glich',
+        'Control-direct:enable/Main:enable' => 'Schnelleinstellrad-Direkt:mÃ¶glich/Haupt-Wahlrad:mÃ¶glich',
+      },
+    },
+   'AFPointBrightness' => {
+      Description => 'AF-Feld Helligkeit',
+      PrintConv => {
+        'Brighter' => 'Heller',
+      },
+    },
+   'AFPointDisplayDuringFocus' => {
+      Description => 'AF-Feld Anzeige wÃ€hrend Fokus',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+        'On (when focus achieved)' => 'Ein (nach Scharfeinstellung)',
+      },
+    },
+   'AFPointIllumination' => {
+      Description => 'Messfeld-LED',
+      PrintConv => {
+        'Auto' => 'Automatisch',
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'AFPointMode' => {
+      Description => 'AF-Punkt-Modus',
+      PrintConv => {
+        'Auto' => 'Automatisch',
+      },
+    },
+   'AFPointRegistration' => {
+      Description => 'AF-Feld Speicherung',
+      PrintConv => {
+        'Automatic' => 'Automatisch',
+        'Bottom' => 'Unten',
+        'Center' => 'Mitte',
+        'Extreme Left' => 'Ganz links',
+        'Extreme Right' => 'Ganz rechts',
+        'Left' => 'Links',
+        'Right' => 'Rechts',
+        'Top' => 'Oben',
+      },
+    },
+   'AFPointSelected' => {
+      Description => 'GewÃ€hlter AF-Punkt',
+      PrintConv => {
+        'Auto' => 'Automatisch',
+        'Automatic Tracking AF' => 'NachfÃŒhr AF',
+        'Bottom' => 'Unten',
+        'Center' => 'Mitte',
+        'Face Detect AF' => 'Gesichtserkennungs-AF',
+        'Fixed Center' => 'Auf Mitte fixiert',
+        'Left' => 'Links',
+        'Lower-left' => 'Unten-links',
+        'Lower-right' => 'Unten-rechts',
+        'Mid-left' => 'Links-Mitte',
+        'Mid-right' => 'Rechts-Mitte',
+        'Right' => 'Rechts',
+        'Top' => 'Oben',
+        'Upper-left' => 'Oben-links',
+        'Upper-right' => 'Oben-rechts',
+      },
+    },
+   'AFPointSelected2' => {
+      Description => 'GewÃ€hlter AF-Punkt 2',
+      PrintConv => {
+        'Auto' => 'Automatisch',
+      },
+    },
+   'AFPointSelection' => {
+      Description => 'AF-Messfeldauswahl',
+      PrintConv => {
+        '11 Points' => '11 Messfelder',
+        '51 Points' => '51 Messfelder (3D-Tracking)',
+      },
+    },
+   'AFPointSelectionMethod' => {
+      Description => 'Wahlmethode fÃŒr AF-Messfeld',
+      PrintConv => {
+        'Multi-controller direct' => 'Multicontroller',
+        'Quick Control Dial direct' => 'Schnelleinstellrad',
+      },
+    },
+   'AFPointSpotMetering' => 'Anzahl AF-Messff./Spotmsg.',
+   'AFPoints' => 'AF-Punkte',
+   'AFPointsInFocus' => {
+      Description => 'AF-Punkte im Fokus',
+      PrintConv => {
+        'Bottom' => 'Unten',
+        'Bottom, Center' => 'Unten + Mitte',
+        'Bottom-center' => 'Unten-Mitte',
+        'Bottom-left' => 'Unten-links',
+        'Bottom-right' => 'Unten-rechts',
+        'Center' => 'Mitte',
+        'Center (horizontal)' => 'Mitte (horizontal)',
+        'Center (vertical)' => 'Mitte (vertikal)',
+        'Far Left' => 'Ganz links',
+        'Far Right' => 'Ganz rechts',
+        'Fixed Center or Multiple' => 'Auf Mitte fixiert oder mehrere',
+        'Left' => 'Links',
+        'Lower-left' => 'Unten-Links',
+        'Lower-left, Bottom' => 'Unten-links + Unten',
+        'Lower-left, Mid-left' => 'Unten-links + Links-Mitte',
+        'Lower-right' => 'Unten-Rechts',
+        'Lower-right, Bottom' => 'Unten-rechts + Unten',
+        'Lower-right, Mid-right' => 'Unten-rechts + Rechts-Mitte',
+        'Mid-left' => 'Links-Mitte',
+        'Mid-left, Center' => 'Links-Mitte + Mitte',
+        'Mid-right' => 'Rechts-Mitte',
+        'Mid-right, Center' => 'Rechts-Mitte + Mitte',
+        'None' => 'Keiner',
+        'Right' => 'Rechts',
+        'Top' => 'Oben',
+        'Top, Center' => 'Oben + Mitte',
+        'Top-center' => 'Oben-Mitte',
+        'Top-left' => 'Oben-links',
+        'Top-right' => 'Oben-rechts',
+        'Upper-left' => 'Oben-Links',
+        'Upper-left, Mid-left' => 'Oben-links + Links-mitte',
+        'Upper-left, Top' => 'Oben-links + Oben',
+        'Upper-right' => 'Oben-Rechts',
+        'Upper-right, Mid-right' => 'Oben-rechts + Rechts-Mitte',
+        'Upper-right, Top' => 'Oben-rechts + Oben',
+      },
+    },
+   'AFPointsInFocus1D' => 'AF-Punkte im Fokus 1D',
+   'AFPointsInFocus5D' => 'AF-Punkte im Fokus',
+   'AFPointsSelected' => 'GewÃ€hlte AF-Punkte',
+   'AFPointsUnknown1' => {
+      PrintConv => {
+        'All' => 'Alle',
+        'Central 9 points' => 'Alle mittleren 9 Punkte',
+      },
+    },
+   'AFPointsUnknown2' => {
+      Description => 'AF-Punkte Unbekannt 2?',
+      PrintConv => {
+        'Auto' => 'Automatisch',
+      },
+    },
+   'AFPointsUsed' => {
+      Description => 'Verwendete AF-Punkte',
+      PrintConv => {
+        'Bottom' => 'Unten',
+        'Center' => 'Mitte',
+        'Far Left' => 'Ganz links',
+        'Far Right' => 'Ganz rechts',
+        'Lower-left' => 'Unten-Links',
+        'Lower-right' => 'Unten-Rechts',
+        'Mid-left' => 'Links-Mitte',
+        'Mid-right' => 'Rechts-Mitte',
+        'Top' => 'Oben',
+        'Upper-left' => 'Oben-Links',
+        'Upper-right' => 'Oben-Rechts',
+      },
+    },
+   'AFPredictor' => 'AF-PrÃ€diktor',
+   'AFResponse' => 'Verwendeter AF',
+   'AFSearch' => {
+      Description => 'AF Fokussierung',
+      PrintConv => {
+        'Not Ready' => 'Nicht bereit',
+        'Ready' => 'Bereit',
+      },
+    },
+   'AIServoContinuousShooting' => 'AuslÃ¶seprioritÃ€t',
+   'AIServoImagePriority' => {
+      Description => 'AI Servo PrioritÃ€t 1./2. Bild',
+      PrintConv => {
+        '1: AF, 2: Drive speed' => 'AF-PrioritÃ€t/Transportgeschwindigkeit',
+        '1: AF, 2: Tracking' => 'AF-PrioritÃ€t/NachfÃŒhrprioritÃ€t',
+        '1: Release, 2: Drive speed' => 'AuslÃ¶sung/Transportgeschwindigkeit',
+      },
+    },
+   'AIServoTrackingMethod' => {
+      Description => 'AI Servo AF NachfÃŒhrung',
+      PrintConv => {
+        'Continuous AF track priority' => 'AF NachfÃŒhr-PrioritÃ€t',
+        'Main focus point priority' => 'Hauptfokussierungsfeld',
+      },
+    },
+   'AIServoTrackingSensitivity' => {
+      Description => 'AI Servo Empfindlichkeit',
+      PrintConv => {
+        'Fast' => 'Rapide',
+        'Slow' => 'Langsam',
+      },
+    },
+   'APEVersion' => 'APE-Version',
+   'ARMVersion' => 'ARM-Version',
+   'AccessDate' => 'Zugriffsdatum',
+   'ActionAdvised' => 'Aktion empfohlen',
+   'ActiveArea' => 'Aktiver Bereich',
+   'ActiveD-Lighting' => {
+      Description => 'Aktives D-Lighting',
+      PrintConv => {
+        'High' => 'Hoch',
+        'Low' => 'Leicht',
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'ActiveD-LightingMode' => {
+      PrintConv => {
+        'High' => 'Hoch',
+        'Low' => 'Leicht',
+        'Off' => 'Aus',
+      },
+    },
+   'AddAspectRatioInfo' => {
+      Description => 'SeitenverhÃ€ltnisinfo zufÃŒgen',
+      PrintConv => {
+        'Off' => 'Aus',
+      },
+    },
+   'AddOriginalDecisionData' => {
+      Description => 'Originaldaten zufÃŒgen',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'Address' => 'Adresse',
+   'AdultContentWarning' => {
+      PrintConv => {
+        'Unknown' => 'Unbekannt',
+      },
+    },
+   'AdvancedRaw' => {
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'AlphaByteCount' => 'Anzahl Bytes der Alpha-Kanal-Daten',
+   'AlphaChannelsNames' => 'Alpha-Kanal-Namen',
+   'AlphaDataDiscard' => {
+      Description => 'Verworfene Alpha-Kanal-Daten',
+      PrintConv => {
+        'Flexbits Discarded' => 'FlexBits verworfen',
+        'Full Resolution' => 'Volle AuflÃ¶sung',
+        'HighPass Frequency Data Discarded' => 'Hochpass-Frequenz-Daten verworfen',
+        'Highpass and LowPass Frequency Data Discarded' => 'Hochpass- und Tiefpass-Frequenz-Daten verworfen',
+      },
+    },
+   'AlphaOffset' => 'Alpha-Kanal-Datenposition',
+   'AnalogBalance' => 'Analog-Balance',
+   'Annotation' => 'Anmerkung',
+   'Anti-Blur' => {
+      Description => 'Verwacklungsschutz-Modus',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On (Continuous)' => 'Ein (Kontinuierlich)',
+        'On (Shooting)' => 'Ein (Aufnahme)',
+        'n/a' => 'Nicht gesetzt',
+      },
+    },
+   'Aperture' => 'Blende',
+   'ApertureRange' => {
+      Description => 'Einstellung Verschlusszeitenbereich',
+      PrintConv => {
+        'Disable' => 'Nicht mÃ¶glich',
+        'Enable' => 'MÃ¶glich',
+      },
+    },
+   'ApertureRingUse' => {
+      Description => 'Blendenring-Verwendung',
+      PrintConv => {
+        'Permitted' => 'Erlaubt',
+        'Prohibited' => 'Nicht erlaubt',
+      },
+    },
+   'ApertureValue' => 'Blende',
+   'ApplicationRecordVersion' => 'IPTC-Modell-2-Version',
+   'ApplyShootingMeteringMode' => {
+      Description => 'Angewandter Belichtungs-/Messmodus',
+      PrintConv => {
+        'Disable' => 'Nicht mÃ¶glich',
+        'Enable' => 'MÃ¶glich',
+      },
+    },
+   'Artist' => 'KÃŒnstler',
+   'AspectRatio' => 'Bildformat',
+   'AssignFuncButton' => {
+      Description => 'FUNC.-Taste zuordnen',
+      PrintConv => {
+        'Exposure comp./AEB setting' => 'Belichtungskorrektur/AEB-Einstellung',
+        'Image jump with main dial' => 'Bildsprung mit Haupt-Wahlrad',
+        'Image quality' => 'QualitÃ€t Ã€ndern',
+        'LCD brightness' => 'LCD-Helligkeit',
+        'Live view function settings' => 'Livebild Funktionseinstellung',
+      },
+    },
+   'AssistButtonFunction' => {
+      Description => 'Funktion Assist-Taste',
+      PrintConv => {
+        'Av+/- (AF point by QCD)' => 'Av+/- (AF-Feld mit Daumenrad)',
+        'FE lock' => 'FE Blitzmesswertspeicherung',
+        'Select HP (while pressing)' => 'Ausw.G.pos.(Ass-Taste gedr.)',
+        'Select Home Position' => 'Auswahl Grundposition',
+      },
+    },
+   'Audio' => {
+      PrintConv => {
+        'No' => 'Nein',
+        'Yes' => 'Ja',
+      },
+    },
+   'AudioDuration' => 'Audiodauer',
+   'AudioOutcue' => 'Audio-Outcue',
+   'AudioSamplingRate' => 'Audio-Samplingrate',
+   'AudioSamplingResolution' => 'Audio-SamplingauflÃ¶sung',
+   'AudioType' => 'Audiotyp',
+   'Author' => 'Autor',
+   'AuthorsPosition' => 'Autorenposition',
+   'AutoAperture' => {
+      Description => 'Blendenring auf A',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'AutoBracket' => 'Automatische Belichtungsreihe',
+   'AutoBracketModeM' => {
+      Description => 'Belichtungsreihen bei M',
+      PrintConv => {
+        'Flash Only' => 'Nur Blitz',
+        'Flash/Aperture' => 'Blitz & Blende',
+        'Flash/Speed' => 'Blitz & Zeit',
+        'Flash/Speed/Aperture' => 'Blitz, Zeit & Blende',
+      },
+    },
+   'AutoBracketOrder' => 'BKT-Reihenfolge',
+   'AutoBracketSet' => {
+      Description => 'Belichtungsreihen',
+      PrintConv => {
+        'AE & Flash' => 'Belichtung & Blitz',
+        'AE Only' => 'Nur Belichtung',
+        'Flash Only' => 'Nur Blitz',
+        'WB Bracketing' => 'WeiÃabgleichs-Belichtungsreihe',
+      },
+    },
+   'AutoBracketing' => {
+      Description => 'Automatische Belichtungsreihe',
+      PrintConv => {
+        'No flash & flash' => 'Kein Blitz & Blitz',
+        'Off' => 'Aus',
+        'On' => 'An',
+      },
+    },
+   'AutoExposureBracketing' => {
+      Description => 'Auto-Belichtungsreihe',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'AutoFP' => {
+      Description => 'FP-Kurzzeitsynchr.',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'AutoFocus' => {
+      Description => 'Auto-Fokus',
+      PrintConv => {
+        'Off' => 'Deaktiviert',
+        'On' => 'Aktiviert',
+      },
+    },
+   'AutoISO' => {
+      Description => 'ISO-Automatik',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'AutoISOMax' => 'ISO-Automatik Max',
+   'AutoISOMinShutterSpeed' => 'ISO-Automatik LÃ€ngste Belichtungszeit',
+   'AutoLightingOptimizer' => {
+      Description => 'Autom. Belichtungsoptimierung',
+      PrintConv => {
+        'Disable' => 'Inaktiv',
+        'Enable' => 'Aktiv',
+        'Low' => 'Gering',
+        'Off' => 'Aus',
+        'Strong' => 'Stark',
+        'n/a' => 'Nicht gesetzt',
+      },
+    },
+   'AutoLightingOptimizerOn' => {
+      PrintConv => {
+        'No' => 'Nein',
+        'Yes' => 'Ja',
+      },
+    },
+   'AutoRedEye' => {
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'AutoRotate' => {
+      Description => 'Automatische Bilddrehung',
+      PrintConv => {
+        'None' => 'Keine',
+        'Rotate 180' => '180Â° (unten/rechts)',
+        'Rotate 270 CW' => '90Â° im Uhrzeigersinn (links/unten)',
+        'Rotate 90 CW' => '90Â° gegen den Uhrzeigersinn (rechts/oben)',
+        'n/a' => 'Unbekannt',
+      },
+    },
+   'AuxiliaryLens' => 'Vorsatzlinse',
+   'AvApertureSetting' => 'Av Blenden-Einstellung',
+   'AvSettingWithoutLens' => {
+      Description => 'Blendeneinstellung ohne Objektiv',
+      PrintConv => {
+        'Disable' => 'Nicht mÃ¶glich',
+        'Enable' => 'MÃ¶glich',
+      },
+    },
+   'BWFilter' => 'S/W-Filter',
+   'BWMode' => {
+      Description => 'Schwarz-WeiÃ Modus',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'An',
+      },
+    },
+   'BackgroundTiling' => {
+      PrintConv => {
+        'No' => 'Nein',
+        'Yes' => 'Ja',
+      },
+    },
+   'BannerImageType' => {
+      PrintConv => {
+        'None' => 'Keine',
+      },
+    },
+   'BaseExposureCompensation' => 'Basis-Belichtungskorrektur',
+   'BaseISO' => 'Basis-ISO',
+   'BaseURL' => 'Basis URL',
+   'BatteryInfo' => 'Stromquelle',
+   'BatteryLevel' => 'Batteriestatus',
+   'BatteryOrder' => {
+      Description => 'Akkureihenfolge',
+      PrintConv => {
+        'Camera Battery First' => 'Zuerst Akku in der Kamera',
+        'MB-D10 First' => 'Zuerst Akkus im MB-D10',
+      },
+    },
+   'Beep' => {
+      Description => 'Tonsignal',
+      PrintConv => {
+        'High' => 'Hoch',
+        'Low' => 'Tief',
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'BitDepth' => 'Bit-Tiefe',
+   'BitsPerSample' => 'Anzahl der Bits pro Komponente',
+   'BlackPoint' => 'Schwarzpunkt',
+   'BlueBalance' => 'Farbabgleich Blau',
+   'BlueMatrixColumn' => 'Blau-Matrixspalte',
+   'BlueTRC' => 'Blau-Tonwertwiedergabe-Kurve',
+   'BlurWarning' => {
+      Description => 'Verwackelungswarnung',
+      PrintConv => {
+        'Blur Warning' => 'Verwackelungswarnung',
+        'None' => 'Keine',
+      },
+    },
+   'BodyBatteryADLoad' => 'Kamerabatterie A/D unter Last',
+   'BodyBatteryADNoLoad' => 'Kamerabatterie A/D im Leerlauf',
+   'BodyBatteryState' => {
+      Description => 'Kamerabatterie-Status',
+      PrintConv => {
+        'Almost Empty' => 'Fast leer',
+        'Empty or Missing' => 'Leer oder nicht vorhanden',
+        'Full' => 'Voll geladen',
+        'Running Low' => 'Schwach',
+      },
+    },
+   'BodyFirmwareVersion' => 'Kamera-Firmware-Version',
+   'BracketMode' => {
+      Description => 'Belichtungsreihen-Modus',
+      PrintConv => {
+        'Off' => 'Aus',
+      },
+    },
+   'BracketShotNumber' => {
+      Description => 'Belichtungsreihen-Bildnummer',
+      PrintConv => {
+        '1 of 3' => '1 von 3',
+        '1 of 5' => '1 von 5',
+        '2 of 3' => '2 von 3',
+        '2 of 5' => '2 von 5',
+        '3 of 3' => '3 von 3',
+        '3 of 5' => '3 von 5',
+        '4 of 5' => '4 von 5',
+        '5 of 5' => '5 von 5',
+        'n/a' => 'Nicht gesetzt',
+      },
+    },
+   'BracketStep' => {
+      Description => 'Belichtungsreihenschritte',
+      PrintConv => {
+        '1 EV' => '1 LW',
+        '1/3 EV' => '1/3 LW',
+        '2/3 EV' => '2/3 LW',
+      },
+    },
+   'BracketValue' => 'Belichtungsreihen-Wert',
+   'Brightness' => 'Helligkeit',
+   'BrightnessValue' => 'Helligkeit',
+   'BulbDuration' => 'Bulb-Dauer',
+   'BurstMode' => {
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'ButtonFunctionControlOff' => {
+      Description => 'Tastenfunktion wenn Schnelleinstellrad OFF',
+      PrintConv => {
+        'Disable main, Control, Multi-control' => 'Deaktiv Haupt-Wahlrad, Schnelleinstellrad, Multicontroller',
+        'Normal (enable)' => 'Normal (eingeschaltet)',
+      },
+    },
+   'By-line' => 'Ersteller',
+   'By-lineTitle' => 'Beruf des Erstellers',
+   'CFAPattern' => 'Farbfiltermatrix',
+   'CFAPattern2' => 'Farbfiltermatrix 2',
+   'CFARepeatPatternDim' => 'Farbfiltermatrix-GrÃ¶Ãe',
+   'CLModeShootingSpeed' => 'Lowspeed-Bildrate',
+   'CMContrast' => 'CM Kontrast',
+   'CMExposureCompensation' => 'CM Belichtungsausgleich',
+   'CMHue' => 'CM Farbton',
+   'CMMFlags' => 'CMM-Flags',
+   'CMSaturation' => 'CM FarbsÃ€ttigung',
+   'CMSharpness' => 'CM SchÃ€rfe',
+   'CMWhiteBalance' => 'CM WeiÃabgleich',
+   'CMWhiteBalanceComp' => 'CM WeiÃabgleichsausgleich',
+   'CMWhiteBalanceGrayPoint' => 'CM WeiÃabgleich Graupunkt',
+   'CPUArchitecture' => 'CPU Architektur',
+   'CPUCount' => 'Anzahl CPU',
+   'CPUFirmwareVersion' => 'CPU-Firmware-Version',
+   'CPUSubtype' => 'CPU Subtyp',
+   'CPUType' => {
+      Description => 'CPU Typ',
+      PrintConv => {
+        'Any' => 'Unbestimmt',
+        'None' => 'Unbestimmt',
+      },
+    },
+   'CalibrationIlluminant1' => {
+      Description => 'Lichtquellenkalibrierung 1',
+      PrintConv => {
+        'Cloudy' => 'BewÃ¶lkt',
+        'Cool White Fluorescent' => 'Neonlicht kaltweiÃ',
+        'Day White Fluorescent' => 'Neonlicht neutralweiÃ',
+        'Daylight' => 'Tageslicht',
+        'Daylight Fluorescent' => 'Neonlicht tageslichtweiÃ',
+        'Fine Weather' => 'Wolkenlos',
+        'Flash' => 'Blitz',
+        'Fluorescent' => 'Neonlicht',
+        'ISO Studio Tungsten' => 'ISO Studio-Kunstlicht (GlÃŒhbirne)',
+        'Other' => 'Andere Lichtquelle',
+        'Shade' => 'Schatten',
+        'Standard Light A' => 'Standard-Licht A',
+        'Standard Light B' => 'Standard-Licht B',
+        'Standard Light C' => 'Standard-Licht C',
+        'Tungsten (Incandescent)' => 'Kunstlicht (GlÃŒhbirne)',
+        'Unknown' => 'Unbekannt',
+        'Warm White Fluorescent' => 'Neonlicht warmweiÃ',
+        'White Fluorescent' => 'Neonlicht universalweiÃ',
+      },
+    },
+   'CalibrationIlluminant2' => {
+      Description => 'Lichtquellenkalibrierung 2',
+      PrintConv => {
+        'Cloudy' => 'BewÃ¶lkt',
+        'Cool White Fluorescent' => 'Neonlicht kaltweiÃ',
+        'Day White Fluorescent' => 'Neonlicht neutralweiÃ',
+        'Daylight' => 'Tageslicht',
+        'Daylight Fluorescent' => 'Neonlicht tageslichtweiÃ',
+        'Fine Weather' => 'Wolkenlos',
+        'Flash' => 'Blitz',
+        'Fluorescent' => 'Neonlicht',
+        'ISO Studio Tungsten' => 'ISO Studio-Kunstlicht (GlÃŒhbirne)',
+        'Other' => 'Andere Lichtquelle',
+        'Shade' => 'Schatten',
+        'Standard Light A' => 'Standard-Licht A',
+        'Standard Light B' => 'Standard-Licht B',
+        'Standard Light C' => 'Standard-Licht C',
+        'Tungsten (Incandescent)' => 'Kunstlicht (GlÃŒhbirne)',
+        'Unknown' => 'Unbekannt',
+        'Warm White Fluorescent' => 'Neonlicht warmweiÃ',
+        'White Fluorescent' => 'Neonlicht universalweiÃ',
+      },
+    },
+   'CameraBody' => 'Kamera GehÃ€use',
+   'CameraCalibration1' => 'Kamerakalibrierung 1',
+   'CameraCalibration2' => 'Kamerakalibrierung 2',
+   'CameraColorCalibration01' => 'Kamera Farbkalibrierung 01',
+   'CameraColorCalibration02' => 'Kamera Farbkalibrierung 02',
+   'CameraColorCalibration03' => 'Kamera Farbkalibrierung 03',
+   'CameraColorCalibration04' => 'Kamera Farbkalibrierung 04',
+   'CameraColorCalibration05' => 'Kamera Farbkalibrierung 05',
+   'CameraColorCalibration06' => 'Kamera Farbkalibrierung 06',
+   'CameraColorCalibration07' => 'Kamera Farbkalibrierung 07',
+   'CameraColorCalibration08' => 'Kamera Farbkalibrierung 08',
+   'CameraColorCalibration09' => 'Kamera Farbkalibrierung 09',
+   'CameraColorCalibration10' => 'Kamera Farbkalibrierung 10',
+   'CameraColorCalibration11' => 'Kamera Farbkalibrierung 11',
+   'CameraColorCalibration12' => 'Kamera Farbkalibrierung 12',
+   'CameraColorCalibration13' => 'Kamera Farbkalibrierung 13',
+   'CameraColorCalibration14' => 'Kamera Farbkalibrierung 14',
+   'CameraColorCalibration15' => 'Kamera Farbkalibrierung 15',
+   'CameraID' => 'Kamera ID',
+   'CameraISO' => 'Kamera-ISO',
+   'CameraInfo' => 'Pentax-Modell',
+   'CameraModel' => 'Kamera Modell',
+   'CameraOrientation' => {
+      Description => 'Ausrichtung des Bildes',
+      PrintConv => {
+        'Horizontal (normal)' => '0Â° (oben/links)',
+        'Rotate 270 CW' => '90Â° im Uhrzeigersinn (links/unten)',
+        'Rotate 90 CW' => '90Â° gegen den Uhrzeigersinn (rechts/oben)',
+      },
+    },
+   'CameraSerialNumber' => 'Kamera-Seriennummer',
+   'CameraSettings' => 'Kameraeinstellungen',
+   'CameraSettingsVersion' => 'Kameraeinstellungen-Version',
+   'CameraTemperature' => 'Kamera-Temperatur',
+   'CameraType' => 'Kameratyp',
+   'CameraType2' => 'Kameratyp 2',
+   'CanonAFInfo' => 'AF-Info',
+   'CanonAFInfo2' => 'AF-Info (2)',
+   'CanonExposureMode' => {
+      Description => 'Belichtungsmodus',
+      PrintConv => {
+        'Aperture-priority AE' => 'BlendenprioritÃ€t',
+        'Bulb' => 'Bulb-Modus',
+        'Manual' => 'Manuell',
+        'Program AE' => 'Programmautomatik',
+        'Shutter speed priority AE' => 'VerschlussprioritÃ€t',
+      },
+    },
+   'CanonFileInfo' => 'Dateiinformationen',
+   'CanonFileLength' => 'DateilÃ€nge',
+   'CanonFirmwareVersion' => 'Firmware-Version',
+   'CanonFlashMode' => {
+      Description => 'Blitz-Modus',
+      PrintConv => {
+        'Auto' => 'Automatisch',
+        'External flash' => 'Externer Blitz',
+        'Off' => 'Aus',
+        'On' => 'Ein',
+        'Red-eye reduction' => 'Rote-Augen-Reduzierung',
+        'Red-eye reduction (Auto)' => 'Rote-Augen-Reduzierung (Automatisch)',
+        'Red-eye reduction (On)' => 'Rote-Augen-Reduzierung (Ein)',
+      },
+    },
+   'CanonFocalLength' => 'Objektivart',
+   'CanonImageHeight' => 'Canon-BildhÃ¶he',
+   'CanonImageSize' => {
+      Description => 'Canon-BildgrÃ¶Ãe',
+      PrintConv => {
+        'Large' => 'GroÃ',
+        'Medium' => 'MittelgroÃ',
+        'Medium 1' => 'MittelgroÃ 1',
+        'Medium 2' => 'MittelgroÃ 2',
+        'Medium 3' => 'MittelgroÃ 3',
+        'Medium Movie' => 'MittelgroÃer Film',
+        'Postcard' => 'Postkarte',
+        'Small' => 'Klein',
+        'Small 1' => 'Klein 1',
+        'Small 2' => 'Klein 2',
+        'Small 3' => 'Klein 3',
+        'Small Movie' => 'Kleiner Film',
+        'Widescreen' => 'Breitbild',
+      },
+    },
+   'CanonImageType' => 'Canon-Bildtyp',
+   'CanonImageWidth' => 'Canon-Bildbreite',
+   'CanonModelID' => 'Canon-Modell',
+   'Caption-Abstract' => 'Beschreibung/Zusammenfassung',
+   'CaptionWriter' => 'Bildtextautor',
+   'CaptureXResolutionUnit' => {
+      PrintConv => {
+        'um' => 'Âµm (Mikrometer)',
+      },
+    },
+   'CaptureYResolutionUnit' => {
+      PrintConv => {
+        'um' => 'Âµm (Mikrometer)',
+      },
+    },
+   'Categories' => 'Kategorien',
+   'Category' => 'Kategorie',
+   'CenterAFArea' => {
+      Description => 'AF-MessfeldgrÃ¶Ãe',
+      PrintConv => {
+        'Normal Zone' => 'Normal',
+        'Wide Zone' => 'GroÃ',
+      },
+    },
+   'CenterWeightedAreaSize' => {
+      Description => 'MessfeldgrÃ¶Ãe',
+      PrintConv => {
+        'Average' => 'Durchschnitt',
+      },
+    },
+   'Certificate' => 'Zertifikat',
+   'Channels' => 'KanÃ€le',
+   'Chapter' => 'Kapitel',
+   'CharacterSet' => 'Zeichensatz',
+   'Chromaticity' => 'ChromatizitÃ€t',
+   'ChrominanceNR_TIFF_JPEG' => {
+      PrintConv => {
+        'High' => 'Hoch',
+        'Low' => 'Leicht',
+        'Off' => 'Aus',
+      },
+    },
+   'ChrominanceNoiseReduction' => {
+      PrintConv => {
+        'High' => 'Hoch',
+        'Low' => 'Leicht',
+        'Off' => 'Aus',
+      },
+    },
+   'CircleOfConfusion' => 'UnschÃ€rfekreis',
+   'City' => 'Stadt/Ort',
+   'ClassifyState' => 'Klassifizierungs-Status',
+   'ColorAberrationControl' => {
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'ColorAdjustmentMode' => {
+      Description => 'Farbtonkorrektur Modus',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'ColorBalance' => 'Farbabgleich',
+   'ColorBalance1' => 'Farbabgleich 1',
+   'ColorBalanceA' => 'Farbabgleich A',
+   'ColorBalanceAdj' => {
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'ColorBalanceBlue' => 'Farbbalance Blau',
+   'ColorBalanceGreen' => 'Farbbalance GrÃŒn',
+   'ColorBalanceRed' => 'Farbbalance Rot',
+   'ColorBooster' => {
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'ColorComponents' => 'Anzahl der Bildkomponenten',
+   'ColorDataVersion' => 'Farbdaten Version',
+   'ColorEffect' => {
+      PrintConv => {
+        'Black & White' => 'Schwarz/WeiÃ',
+        'Off' => 'Aus',
+      },
+    },
+   'ColorFilter' => {
+      Description => 'Farbfilter',
+      PrintConv => {
+        'Black & White' => 'Schwarz/WeiÃ',
+        'Blue' => 'Blau',
+        'Green' => 'GrÃŒn',
+        'Off' => 'Aus',
+        'Purple' => 'Lila',
+        'Red' => 'Rot',
+        'Yellow' => 'Gelb',
+      },
+    },
+   'ColorHue' => 'Farbwiedergabe',
+   'ColorInfo' => 'Farb-Informationen',
+   'ColorMap' => 'Farbtafel',
+   'ColorMatrix' => 'Farb-Matrix',
+   'ColorMatrix1' => 'Farbmatrix 1',
+   'ColorMatrix2' => 'Farbmatrix 2',
+   'ColorMatrixNumber' => 'Farbmatrix Nummer',
+   'ColorMode' => {
+      Description => 'Farbmodus',
+      PrintConv => {
+        'Autumn Leaves' => 'Herbstlaub',
+        'B & W' => 'S/W',
+        'B&W' => 'Schwarz-WeiÃ',
+        'Black & White' => 'Schwarz/WeiÃ',
+        'Clear' => 'Klar',
+        'Deep' => 'Tief',
+        'Evening' => 'Abends',
+        'Landscape' => 'Landschaft',
+        'Light' => 'Hell',
+        'Natural' => 'NatÃŒrlich',
+        'Natural color' => 'NatÃŒrliche Farben',
+        'Natural sRGB' => 'Neutral sRGB',
+        'Natural+ sRGB' => 'Neutral+ sRGB',
+        'Night Portrait' => 'NachtportrÃ€t',
+        'Night Scene' => 'Nachtszene',
+        'Night View' => 'Abendszene',
+        'Night View/Portrait' => 'Abendszene',
+        'Off' => 'Aus',
+        'Portrait' => 'PortrÃ€t',
+        'Solarization' => 'Solarisation',
+        'Sunset' => 'Sonnenuntergang',
+        'Vivid' => 'Lebhafte Farbe',
+        'Vivid color' => 'Lebhafte Farbe',
+      },
+    },
+   'ColorMoireReduction' => {
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'ColorMoireReductionMode' => {
+      PrintConv => {
+        'High' => 'Hoch',
+        'Low' => 'Leicht',
+        'Off' => 'Aus',
+      },
+    },
+   'ColorProfile' => {
+      Description => 'Farbprofil',
+      PrintConv => {
+        'Embedded' => 'Eingebunden',
+        'Not Embedded' => 'Nicht eingebunden',
+      },
+    },
+   'ColorReproduction' => 'Farbreproduktion',
+   'ColorSpace' => {
+      Description => 'Farbraum',
+      PrintConv => {
+        'ICC Profile' => 'ICC-Profil',
+        'Monochrome' => 'Monochrom',
+        'Natural sRGB' => 'Neutral sRGB',
+        'Natural+ sRGB' => 'Neutral+ sRGB',
+        'Uncalibrated' => 'Nicht festgelegt',
+      },
+    },
+   'ColorSpaceData' => 'Farbraum Daten',
+   'ColorTempAsShot' => 'Farbtemperatur Aufnahme',
+   'ColorTempAuto' => 'Farbtemperatur Auto',
+   'ColorTempCloudy' => 'Farbtemperatur BewÃ¶lkt',
+   'ColorTempCustom' => 'Farbtemperatur Benutzerdefiniert',
+   'ColorTempCustom1' => 'Farbtemperatur Benutzerdefiniert 1',
+   'ColorTempCustom2' => 'Farbtemperatur Benutzerdefiniert 2',
+   'ColorTempDaylight' => 'Farbtemperatur Tageslicht',
+   'ColorTempFlash' => 'Farbtemperatur Blitz',
+   'ColorTempFlashData' => 'Farbtemperatur Blitzdaten',
+   'ColorTempFluorescent' => 'Farbtemperatur Neonlicht',
+   'ColorTempKelvin' => 'Farbtemperatur Kelvin',
+   'ColorTempMeasured' => 'Farbtemperatur Messung',
+   'ColorTempPC1' => 'Farbtemperatur PC1',
+   'ColorTempPC2' => 'Farbtemperatur PC2',
+   'ColorTempPC3' => 'Farbtemperatur PC3',
+   'ColorTempShade' => 'Farbtemperatur Schatten',
+   'ColorTempTungsten' => 'Farbtemperatur GlÃŒhbirne',
+   'ColorTempUnknown' => 'Farbtemperatur Unbekannt',
+   'ColorTempUnknown10' => 'Farbtemperatur Unbekannt 10',
+   'ColorTempUnknown11' => 'Farbtemperatur Unbekannt 11',
+   'ColorTempUnknown12' => 'Farbtemperatur Unbekannt 12',
+   'ColorTempUnknown13' => 'Farbtemperatur Unbekannt 13',
+   'ColorTempUnknown14' => 'Farbtemperatur Unbekannt 14',
+   'ColorTempUnknown15' => 'Farbtemperatur Unbekannt 15',
+   'ColorTempUnknown16' => 'Farbtemperatur Unbekannt 16',
+   'ColorTempUnknown2' => 'Farbtemperatur Unbekannt 2',
+   'ColorTempUnknown3' => 'Farbtemperatur Unbekannt 3',
+   'ColorTempUnknown4' => 'Farbtemperatur Unbekannt 4',
+   'ColorTempUnknown5' => 'Farbtemperatur Unbekannt 5',
+   'ColorTempUnknown6' => 'Farbtemperatur Unbekannt 6',
+   'ColorTempUnknown7' => 'Farbtemperatur Unbekannt 7',
+   'ColorTempUnknown8' => 'Farbtemperatur Unbekannt 8',
+   'ColorTempUnknown9' => 'Farbtemperatur Unbekannt 9',
+   'ColorTemperature' => 'Farbtemperatur',
+   'ColorTone' => {
+      Description => 'Farbton',
+      PrintConv => {
+        'Normal' => 'Standard',
+      },
+    },
+   'ColorimetricReference' => 'Farbmetrische Referenz',
+   'CommandDials' => {
+      Description => 'EinstellrÃ€der',
+      PrintConv => {
+        'Reversed (Main Aperture, Sub Shutter)' => 'Vertauscht',
+        'Standard (Main Shutter, Sub Aperture)' => 'Standard',
+      },
+    },
+   'CommandDialsApertureSetting' => {
+      Description => 'EinstellrÃ€der Blendeneinstellung',
+      PrintConv => {
+        'Aperture Ring' => 'Mit Blendenring',
+        'Sub-command Dial' => 'Mit Einstellrad',
+      },
+    },
+   'CommandDialsChangeMainSub' => {
+      Description => 'EinstellrÃ€der Funktionsbelegung',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'CommandDialsMenuAndPlayback' => {
+      Description => 'EinstellrÃ€der MenÃŒs und Wiedergabe',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'CommandDialsReverseRotation' => {
+      Description => 'EinstellrÃ€der Auswahlrichtung',
+      PrintConv => {
+        'No' => 'Standard',
+        'Yes' => 'Umgekehrt',
+      },
+    },
+   'CommanderChannel' => 'Master-Steuerung Kanal',
+   'CommanderGroupAManualOutput' => 'Master-Steuerung Gruppe A M Korr',
+   'CommanderGroupAMode' => {
+      Description => 'Master-Steuerung Gruppe A Modus',
+      PrintConv => {
+        'Auto Aperture' => 'Blendenautomatik (AA)',
+        'Manual' => 'Manuell',
+        'Off' => 'Aus',
+      },
+    },
+   'CommanderGroupA_TTL-AAComp' => 'Master-Steuerung Gruppe A TTL/AA Korr',
+   'CommanderGroupBManualOutput' => 'Master-Steuerung Gruppe B M Korr',
+   'CommanderGroupBMode' => {
+      Description => 'Master-Steuerung Gruppe B Modus',
+      PrintConv => {
+        'Auto Aperture' => 'Blendenautomatik (AA)',
+        'Manual' => 'Manuell',
+        'Off' => 'Aus',
+      },
+    },
+   'CommanderGroupB_TTL-AAComp' => 'Master-Steuerung Gruppe B TTL/AA Korr',
+   'CommanderInternalFlash' => {
+      Description => 'Master-Steuerung Intgr. Blitz Modus',
+      PrintConv => {
+        'Manual' => 'Manuell',
+        'Off' => 'Aus',
+      },
+    },
+   'CommanderInternalManualOutput' => 'Master-Steuerung Intgr. Blitz M Korr',
+   'CommanderInternalTTLComp' => 'Master-Steuerung Intgr. Blitz TTL Korr',
+   'Comment' => 'Kommentar',
+   'Comments' => 'Kommentare',
+   'Compilation' => {
+      PrintConv => {
+        'No' => 'Nein',
+        'Yes' => 'Ja',
+      },
+    },
+   'ComponentsConfiguration' => 'Bedeutung jeder Komponente',
+   'CompressedBitsPerPixel' => 'Bildkomprimierungsmodus',
+   'CompressedImageSize' => 'Komprimierte BildgrÃ¶Ãe',
+   'Compression' => {
+      Description => 'Komprimierungsschema',
+      PrintConv => {
+        'JPEG' => 'JPEG-Komprimierung',
+        'JPEG (old-style)' => 'JPEG (alte Version)',
+        'Kodak DCR Compressed' => 'Kodak DCR-komprimiert',
+        'Kodak KDC Compressed' => 'Kodak KDC-komprimiert',
+        'Next' => 'NeXT 2-Bit Kodierung',
+        'Nikon NEF Compressed' => 'Nikon NEF-komprimiert',
+        'None' => 'Keine',
+        'Pentax PEF Compressed' => 'Pentax PEF-komprimiert',
+        'SGILog' => 'SGI 32-Bit Log Luminance Kodierung',
+        'SGILog24' => 'SGI 24-Bit Log Luminance Kodierung',
+        'Sony ARW Compressed' => 'Sony ARW-komprimiert',
+        'Thunderscan' => 'ThunderScan 4-Bit Kodierung',
+        'Uncompressed' => 'Nicht komprimiert',
+      },
+    },
+   'CompressionFactor' => 'Kompressionsfaktor',
+   'CompressionRatio' => 'Kompressionsrate',
+   'CompressionType' => {
+      PrintConv => {
+        'None' => 'Keine',
+      },
+    },
+   'ConditionalFEC' => 'Blitzbelichtungsausgleich',
+   'ConnectionSpaceIlluminant' => 'WeiÃpunkt des Verbindungsfarbraums',
+   'Contact' => 'Kontakt',
+   'ContentLocationCode' => 'Inhaltspositionscode',
+   'ContentLocationName' => 'Inhaltspositionsname',
+   'ContinuousDrive' => {
+      Description => 'Aufnahme-Modus',
+      PrintConv => {
+        'Continuous' => 'Serienaufnahme',
+        'Movie' => 'Filmen',
+        'Single' => 'Einzelbild',
+      },
+    },
+   'ContinuousShootingSpeed' => {
+      Description => 'Geschwindigkeit Reihenaufnahmen',
+      PrintConv => {
+        'Disable' => 'Nicht mÃ¶glich',
+        'Enable' => 'MÃ¶glich',
+      },
+    },
+   'ContinuousShotLimit' => {
+      Description => 'Limit Anzahl Reihenaufnahmen',
+      PrintConv => {
+        'Disable' => 'Nicht mÃ¶glich',
+        'Enable' => 'MÃ¶glich',
+      },
+    },
+   'Contrast' => {
+      Description => 'Kontrast',
+      PrintConv => {
+        'Film Simulation' => 'Film-Simulation',
+        'High' => 'Stark',
+        'Low' => 'Leicht',
+        'Med High' => 'Leicht erhÃ¶ht',
+        'Med Low' => 'Leicht verringert',
+        'Medium High' => 'Mittel-Hoch',
+        'Medium Low' => 'Mittel-Gering',
+        'Normal' => 'Standard',
+        'Very High' => 'Sehr hoch',
+        'Very Low' => 'Sehr gering',
+      },
+    },
+   'ContrastAdjustment' => 'Kontrastkorrektur',
+   'ContrastCurve' => 'Kontrast-Kurve',
+   'ContrastSetting' => 'Kontrasteinstellung',
+   'Contributor' => 'Mitwirkender',
+   'Contributors' => 'Mitwirkende',
+   'ControlMode' => {
+      Description => 'Steuerungsmethode',
+      PrintConv => {
+        'n/a' => 'Nicht gesetzt',
+      },
+    },
+   'ConversionLens' => {
+      PrintConv => {
+        'Macro' => 'Makro',
+        'Off' => 'Aus',
+      },
+    },
+   'Converter' => 'Konverter',
+   'Copyright' => 'Urheberrechtsvermerk',
+   'CopyrightNotice' => 'Urheberrechtsvermerk',
+   'CopyrightStatus' => {
+      PrintConv => {
+        'Unknown' => 'Unbekannt',
+      },
+    },
+   'Country' => 'Staat',
+   'Country-PrimaryLocationCode' => 'ISO-Landescode',
+   'Country-PrimaryLocationName' => 'Staat',
+   'CountryCode' => 'LÃ€nderkennzeichen',
+   'CreateDate' => 'Digitalisierungsdatum/-uhrzeit',
+   'CreationDate' => 'Aufnahmedatum',
+   'CreativeStyle' => 'Kreativmodus',
+   'Creator' => 'Ersteller',
+   'CreatorAddress' => 'Ersteller - Adresse',
+   'CreatorCity' => 'Ersteller - Ort',
+   'CreatorCountry' => 'Ersteller - Land',
+   'CreatorPostalCode' => 'Ersteller - PLZ',
+   'CreatorRegion' => 'Ersteller - Staat/Provinz',
+   'CreatorWorkEmail' => 'Ersteller - E-Mail',
+   'CreatorWorkTelephone' => 'Ersteller - Telefon',
+   'CreatorWorkURL' => 'Ersteller - Webseite(n)',
+   'Credit' => 'Anbieter',
+   'CropActive' => {
+      PrintConv => {
+        'No' => 'Nein',
+        'Yes' => 'Ja',
+      },
+    },
+   'CropHiSpeed' => 'Highspeed-Bildformat',
+   'Curves' => {
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'Custom1' => 'Benutzerdefiniert 1',
+   'Custom2' => 'Benutzerdefiniert 2',
+   'CustomRendered' => {
+      Description => 'Benutzerdefinierte Bildverarbeitung',
+      PrintConv => {
+        'Custom' => 'Benutzerdefinierter Prozess',
+        'Normal' => 'Standard-Prozess',
+      },
+    },
+   'D-LightingHQ' => {
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'D-LightingHQSelected' => {
+      PrintConv => {
+        'No' => 'Nein',
+        'Yes' => 'Ja',
+      },
+    },
+   'D-LightingHS' => {
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'DECPosition' => {
+      Description => 'DEC-Position',
+      PrintConv => {
+        'Contrast' => 'Kontrast',
+        'Exposure' => 'Belichtung',
+        'Saturation' => 'SÃ€ttigung',
+      },
+    },
+   'DNGBackwardVersion' => 'DNG VersionskompatibilitÃ€t',
+   'DNGLensInfo' => 'Kleinste Brennweite',
+   'DNGVersion' => 'DNG-Version',
+   'DSPFirmwareVersion' => 'DSP-Firmware-Version',
+   'DataDump' => 'Daten-Dump',
+   'DataDump2' => 'Daten-Dump 2',
+   'DataImprint' => {
+      Description => 'Daten-Einblendung',
+      PrintConv => {
+        'MM/DD/HH:MM' => 'MM/TT/SS:MM',
+        'None' => 'Keine',
+        'YYYY/MM/DD' => 'JJJJ/MM/TT',
+      },
+    },
+   'DataLength' => 'DatenlÃ€nge',
+   'Date' => 'Datum',
+   'DateCreated' => 'Erstellungsdatum',
+   'DateDisplayFormat' => {
+      Description => 'Datumsformat',
+      PrintConv => {
+        'D/M/Y' => 'Tag/Monat/Jahr',
+        'M/D/Y' => 'Monat/Tag/Jahr',
+        'Y/M/D' => 'Jahr/Monat/Tag',
+      },
+    },
+   'DateSent' => 'Absendedatum',
+   'DateStampMode' => {
+      Description => 'Zeitstempel-Modus',
+      PrintConv => {
+        'Date' => 'Datum',
+        'Off' => 'Aus',
+      },
+    },
+   'DateTime' => 'Ãnderungsdatum',
+   'DateTimeCreated' => 'Erstellungsdatum/-uhrzeit',
+   'DateTimeDigitized' => 'Datum/Uhrzeit der Digitalisierung',
+   'DateTimeOriginal' => 'Erstellungsdatum/-uhrzeit',
+   'DateTimeStamp' => 'Datum Uhrzeitangabe',
+   'DaylightSavings' => {
+      Description => 'Sommerzeit',
+      PrintConv => {
+        'No' => 'Aus',
+        'Yes' => 'Ein',
+      },
+    },
+   'Declination' => 'Deklination',
+   'DeletedImageCount' => 'Anzahl gelÃ¶schter Bilder',
+   'Description' => 'Beschreibung',
+   'Destination' => 'Ziel',
+   'DestinationCity' => 'Zielort',
+   'DestinationCityCode' => 'Zielort-Code',
+   'DestinationDST' => {
+      Description => 'Zielort Sommerzeit (DST)',
+      PrintConv => {
+        'No' => 'Deaktiviert',
+        'Yes' => 'Aktiviert',
+      },
+    },
+   'DevelopmentDynamicRange' => 'Dynamikbereich Entwicklung',
+   'DeviceAttributes' => 'GerÃ€te-Eigenschaften',
+   'DeviceManufacturer' => 'GerÃ€te-Hersteller',
+   'DeviceMfgDesc' => 'GerÃ€te-Hersteller-Bezeichnung',
+   'DeviceModel' => 'GerÃ€te-Modell',
+   'DeviceModelDesc' => 'GerÃ€te-Modell-Bezeichnung',
+   'DeviceSettingDescription' => 'GerÃ€teeinstellung',
+   'DialDirectionTvAv' => {
+      Description => 'Drehung WÃ€hlrad bei Tv/Av',
+      PrintConv => {
+        'Reversed' => 'Umgekehrt',
+      },
+    },
+   'DigitalCreationDate' => 'Digitalisierungsdatum',
+   'DigitalCreationDateTime' => 'Digitalisierungsdatum/-uhrzeit',
+   'DigitalCreationTime' => 'Digitalisierungszeit',
+   'DigitalZoom' => {
+      Description => 'Digital-Zoom',
+      PrintConv => {
+        'Electronic magnification' => 'Elektronische VergrÃ¶Ãerung',
+        'None' => 'Kein',
+        'Off' => 'Aus',
+        'Other' => 'Unbekannt',
+      },
+    },
+   'DigitalZoomOn' => {
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'DigitalZoomRatio' => 'Digitaler Zoom-Faktor',
+   'Directory' => 'Verzeichnis',
+   'DirectoryIndex' => 'Verzeichnis-Index',
+   'DirectoryNumber' => 'Ordner-Nummer',
+   'DisplayAperture' => 'Angezeigte Blende',
+   'DisplayXResolutionUnit' => {
+      PrintConv => {
+        'um' => 'Âµm (Mikrometer)',
+      },
+    },
+   'DisplayYResolutionUnit' => {
+      PrintConv => {
+        'um' => 'Âµm (Mikrometer)',
+      },
+    },
+   'DisplayedUnitsX' => {
+      Description => 'Einheit der horiz. AuflÃ¶sung',
+      PrintConv => {
+        'inches' => 'Inch',
+      },
+    },
+   'DisplayedUnitsY' => {
+      Description => 'Einheit der vert. AuflÃ¶sung',
+      PrintConv => {
+        'inches' => 'Inch',
+      },
+    },
+   'DistortionCorrection' => {
+      Description => 'Verzeichnungsausgleich',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'DistortionCorrection2' => {
+      Description => 'Verzeichnungsausgleich 2',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'DjVuVersion' => 'DjVu-Version',
+   'Document' => 'Dokument',
+   'DocumentHistory' => 'Historie des Dokuments',
+   'DocumentName' => 'Dokumentenname',
+   'DocumentNotes' => 'Notizen zum Dokument',
+   'DriveMode' => {
+      Description => 'Aufnahmeart',
+      PrintConv => {
+        'Bracketing' => 'Belichtungsreihe',
+        'Continuous' => 'Serienaufnahme',
+        'Continuous Bracketing' => 'Serienbild-Belichtungsreihe',
+        'Continuous High' => 'Serienaufnahme (Hi)',
+        'Continuous Shooting' => 'Serienaufnahme',
+        'HS continuous' => 'High-Speed Serienbild',
+        'Multiple Exposure' => 'Mehrfachbelichtung',
+        'No Timer' => 'Ohne SelbstauslÃ¶ser',
+        'Off' => 'Aus',
+        'Remote Control' => 'FernauslÃ¶ser',
+        'Remote Control (3 s delay)' => 'FernauslÃ¶ser (3 Sek. VerzÃ¶gerung)',
+        'Self-timer' => 'SelbstauslÃ¶ser',
+        'Self-timer (12 s)' => 'SelbstauslÃ¶ser (12 Sek.)',
+        'Self-timer (2 s)' => 'SelbstauslÃ¶ser (2 Sek.)',
+        'Self-timer Operation' => 'SelbstauslÃ¶ser',
+        'Shutter Button' => 'Kamera-AuslÃ¶ser',
+        'Single' => 'Einzelbild',
+        'Single Exposure' => 'Einzelbelichtung',
+        'Single Frame' => 'Einzelbild',
+        'Single Shot' => 'Einzelbild',
+        'Single-Frame Bracketing' => 'Einzelbild-Belichtungsreihe',
+        'Single-frame' => 'Einzelbild',
+        'Single-frame Shooting' => 'Einzelbild',
+        'UHS continuous' => 'Ultra High-Speed Serienbild',
+        'White Balance Bracketing' => 'WeiÃabgleichs-Belichtungsreihe',
+      },
+    },
+   'DriveMode2' => {
+      Description => 'Mehrfachbelichtung',
+      PrintConv => {
+        'Single-frame' => 'Einzelbildaufnahme',
+      },
+    },
+   'Duration' => 'Dauer',
+   'DynamicAFArea' => {
+      Description => 'Dynamisches AF-Messfeld',
+      PrintConv => {
+        '21 Points' => '21 Messfelder',
+        '51 Points' => '51 Messfelder',
+        '51 Points (3D-tracking)' => '51 Messfelder (3D-Tracking)',
+        '9 Points' => '9 Messfelder',
+      },
+    },
+   'DynamicRange' => {
+      Description => 'Dynamikbereich',
+      PrintConv => {
+        'Wide' => 'Weit',
+      },
+    },
+   'DynamicRangeExpansion' => {
+      Description => 'Dynamikbereich-Erweiterung',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'DynamicRangeOptimizer' => {
+      Description => 'Dynamikbereich-Optimierung',
+      PrintConv => {
+        'Advanced Auto' => 'Erw. Automatik',
+        'Advanced Lv1' => 'Erw. Stufe 1',
+        'Advanced Lv2' => 'Erw. Stufe 2',
+        'Advanced Lv3' => 'Erw. Stufe 3',
+        'Advanced Lv4' => 'Erw. Stufe 4',
+        'Advanced Lv5' => 'Erw. Stufe 5',
+        'Auto' => 'Automatisch',
+        'Off' => 'Aus',
+      },
+    },
+   'DynamicRangeSetting' => {
+      Description => 'Dynamikbereich-Einstellungen',
+      PrintConv => {
+        'Film Simulation' => 'Film-Simulation',
+        'Wide1 (230%)' => 'Weit1 (230%)',
+        'Wide2 (400%)' => 'Weit2 (400%)',
+      },
+    },
+   'E-DialInProgram' => {
+      PrintConv => {
+        'Tv or Av' => 'Tv oder Av',
+      },
+    },
+   'EMail' => 'E-Mail',
+   'ETTLII' => {
+      PrintConv => {
+        'Average' => 'Integralmessung',
+        'Evaluative' => 'Mehrfeldmessung',
+      },
+    },
+   'EVStepInfo' => 'EV-Schritte Information',
+   'EVStepSize' => {
+      Description => 'Belichtungswerte',
+      PrintConv => {
+        '1/2 EV' => '1/2 LW',
+        '1/3 EV' => '1/3 LW',
+      },
+    },
+   'EVSteps' => {
+      Description => 'LW-Schritte',
+      PrintConv => {
+        '1/2 EV Steps' => '1/2 LW-Schritte',
+        '1/3 EV Steps' => '1/3 LW-Schritte',
+      },
+    },
+   'EasyExposureCompensation' => {
+      Description => 'Belichtungskorrektur',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+        'On (auto reset)' => 'Einstellrad (Reset)',
+      },
+    },
+   'EasyMode' => {
+      Description => 'Easy-Modus',
+      PrintConv => {
+        'Beach' => 'Strand',
+        'Black & White' => 'Schwarz/WeiÃ',
+        'Color Accent' => 'Farbton',
+        'Color Swap' => 'Farbwechsel',
+        'Fireworks' => 'Feuerwerk',
+        'Foliage' => 'Laub',
+        'Indoor' => 'Innenaufnahme',
+        'Kids & Pets' => 'Kinder & Tiere',
+        'Landscape' => 'Landschaft',
+        'Macro' => 'Makro',
+        'Manual' => 'Manuell',
+        'Night' => 'Nachtszene',
+        'Night Snapshot' => 'Nacht Schnappschuss',
+        'Pan focus' => 'Pan Fokus',
+        'Portrait' => 'PortrÃ€t',
+        'Snow' => 'Schnee',
+        'Sports' => 'Sport',
+        'Super Macro' => 'Super-Makro',
+        'Underwater' => 'Tauchen',
+      },
+    },
+   'EdgeNoiseReduction' => {
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'EditStatus' => 'Bearbeitungsstatus',
+   'Edition' => 'Ausgabe',
+   'EditorialUpdate' => 'Redaktionelle Ãberarbeitung',
+   'EffectiveLV' => 'Effektiver LW',
+   'EffectiveMaxAperture' => 'Effektiv grÃ¶Ãte Blende',
+   'Emphasis' => {
+      PrintConv => {
+        'None' => 'Keine',
+      },
+    },
+   'EncodingProcess' => 'JPEG-Kodierung Prozess',
+   'Encryption' => 'VerschlÃŒsselung',
+   'EnhanceDarkTones' => {
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'Enhancement' => {
+      PrintConv => {
+        'Blue' => 'Blau',
+        'Green' => 'GrÃŒn',
+        'Off' => 'Aus',
+        'Red' => 'Rot',
+      },
+    },
+   'EnvelopePriority' => {
+      Description => 'PrioritÃ€t',
+      PrintConv => {
+        '0 (reserved)' => '0 (Reserviert fÃŒr zukÃŒnftige Verwendung)',
+        '1 (most urgent)' => '1 (sehr wichtig)',
+        '5 (normal urgency)' => '5 (normale Wichtigkeit)',
+        '8 (least urgent)' => '8 (geringe Wichtigkeit)',
+        '9 (user-defined priority)' => '9 (Benutzerdefinierte PrioritÃ€t)',
+      },
+    },
+   'EnvelopeRecordVersion' => 'IPTC-Modell-1-Version',
+   'EpsonImageHeight' => 'Epson-BildhÃ¶he',
+   'EpsonImageWidth' => 'Epson-Bildbreite',
+   'EquipmentVersion' => 'Equipment-Version',
+   'Error' => 'Fehler',
+   'ExifByteOrder' => 'Exif Byte-Reihenfolge',
+   'ExifCameraInfo' => 'Exif Kamerainformationen',
+   'ExifImageHeight' => 'Exif-BildhÃ¶he',
+   'ExifImageWidth' => 'Exif-Bildbreite',
+   'ExifOffset' => 'Exif IFD-Zeiger',
+   'ExifToolVersion' => 'ExifTool-Version',
+   'ExifUnicodeByteOrder' => 'Exif Unicode Byte-Reihenfolge',
+   'ExifVersion' => 'Exif-Version',
+   'ExitPupilPosition' => 'Austrittspupillenposition',
+   'ExpandFilm' => 'Erweitert Film',
+   'ExpandFilterLens' => 'Erweitert Filterlinse',
+   'ExpandFlashLamp' => 'Erweitert Blitzlicht',
+   'ExpandLens' => 'Erweitert Objektiv',
+   'ExpandScanner' => 'Erweitert Scanner',
+   'ExpandSoftware' => 'Erweitert Software',
+   'ExpirationDate' => 'Ablaufdatum',
+   'ExpirationTime' => 'Ablaufzeit',
+   'Exposure' => 'Belichtung',
+   'ExposureBracketStepSize' => 'Belichtungsreihen-Stufenabstand',
+   'ExposureBracketValue' => 'Belichtungsreihenwert',
+   'ExposureCompStepSize' => {
+      Description => 'Belichtungskorrekturwert',
+      PrintConv => {
+        '1 EV' => '1 LW',
+        '1/2 EV' => '1/2 LW',
+        '1/3 EV' => '1/3 LW',
+      },
+    },
+   'ExposureCompensation' => 'Belichtungskorrektur',
+   'ExposureControlStepSize' => {
+      Description => 'Belichtungswert',
+      PrintConv => {
+        '1 EV' => '1 LW',
+        '1/2 EV' => '1/2 LW',
+        '1/3 EV' => '1/3 LW',
+      },
+    },
+   'ExposureDelayMode' => {
+      Description => 'SpiegelvorauslÃ¶sung',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'ExposureDifference' => 'Belichtungsabweichung',
+   'ExposureIndex' => 'Belichtungsindex',
+   'ExposureLevelIncrements' => {
+      Description => 'Belichtungswert',
+      PrintConv => {
+        '1-stop set, 1/3-stop comp.' => '1-Blende, 1/3-Blendenkompensation',
+        '1/2 Stop' => '1/2 LW',
+        '1/2-stop set, 1/2-stop comp.' => '1/2-Blende, 1/2-Blendenkompensation',
+        '1/3 Stop' => '1/3 LW',
+        '1/3-stop set, 1/3-stop comp.' => '1/3-Blende, 1/3-Blendenkompensation',
+      },
+    },
+   'ExposureMode' => {
+      Description => 'Belichtungsmodus',
+      PrintConv => {
+        'Aperture Priority' => 'BlendenprioritÃ€t',
+        'Aperture-priority AE' => 'BlendenprioritÃ€t',
+        'Auto' => 'Automatische Belichtung',
+        'Auto bracket' => 'Belichtungsreihe',
+        'Auto?' => 'Automatisch?',
+        'Bulb' => 'Bulb-Modus',
+        'Landscape' => 'Landschaft',
+        'Manual' => 'Manuelle Belichtung',
+        'Night Scene / Twilight' => 'Nachtszene',
+        'Portrait' => 'PortrÃ€t',
+        'Program' => 'Programm',
+        'Program-shift' => 'Programm-Shift',
+        'Program-shift A' => 'Programmverschiebung A',
+        'Program-shift S' => 'Programmverschiebung S',
+        'Shutter Priority' => 'VerschlussprioritÃ€t',
+        'Shutter speed priority AE' => 'VerschlussprioritÃ€t',
+      },
+    },
+   'ExposureModeInManual' => {
+      Description => 'Belichtungsmodus bei manueller Belichtung',
+      PrintConv => {
+        'Center-weighted average' => 'Mittenbetont',
+        'Evaluative metering' => 'Mehrfeldmessung',
+        'Partial metering' => 'Teilbild',
+        'Specified metering mode' => 'Spezifizierte Messmethode',
+        'Spot metering' => 'Spotmessung',
+      },
+    },
+   'ExposureProgram' => {
+      Description => 'Belichtungsprogramm',
+      PrintConv => {
+        'Action (High speed)' => 'Kreativ-Programm (ausgerichtet auf schnelle Verschlussgeschwindigkeit)',
+        'Aperture Priority' => 'BlendenprioritÃ€t',
+        'Aperture-priority AE' => 'BlendenprioritÃ€t',
+        'Creative (Slow speed)' => 'Kreativ-Programm (ausgerichtet auf SchÃ€rfentiefe)',
+        'Landscape' => 'Landschaftsmodus',
+        'Manual' => 'Manuell',
+        'Not Defined' => 'Nicht definiert',
+        'Portrait' => 'PortrÃ€t-Modus',
+        'Program' => 'Programm',
+        'Program AE' => 'Normal-Programm',
+        'Shutter Priority' => 'VerschlussprioritÃ€t',
+        'Shutter speed priority AE' => 'VerschlussprioritÃ€t',
+      },
+    },
+   'ExposureTime' => 'Belichtungsdauer',
+   'ExposureTime2' => 'Belichtungsdauer 2',
+   'ExposureValue' => 'Belichtungsdauer',
+   'ExposureWarning' => {
+      Description => 'Belichtungswarnung',
+      PrintConv => {
+        'Bad exposure' => 'Schlechte Belichtung',
+        'Good' => 'OK',
+      },
+    },
+   'ExtendedWBDetect' => {
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'Extender' => {
+      Description => 'Konverter',
+      PrintConv => {
+        'None' => 'Kein',
+      },
+    },
+   'ExtenderFirmwareVersion' => 'Konverter-Firmware-Version',
+   'ExtenderMake' => 'Konverter Hersteller',
+   'ExtenderModel' => 'Konverter-Modell',
+   'ExtenderSerialNumber' => 'Konverter-Seriennummer',
+   'ExternalFlash' => {
+      Description => 'Externer Blitz',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'ExternalFlashBounce' => {
+      Description => 'Externer Blitz - Bounce',
+      PrintConv => {
+        'Bounce' => 'Mit Bounce',
+        'Direct' => 'Direkt',
+        'No' => 'Nein',
+        'Yes' => 'Ja',
+        'n/a' => 'Nicht gesetzt',
+      },
+    },
+   'ExternalFlashExposureComp' => {
+      Description => 'Belichtungskorrektur des externen BlitzgerÃ€ts',
+      PrintConv => {
+        '-0.5' => '-0.5 LW',
+        '-1.0' => '-1.0 LW',
+        '-1.5' => '-1.5 LW',
+        '-2.0' => '-2.0 LW',
+        '-2.5' => '-2.5 LW',
+        '-3.0' => '-3.0 LW',
+        '0.0' => '0.0 LW',
+        '0.5' => '0.5 LW',
+        '1.0' => '1.0 LW',
+        'n/a' => 'Nicht gesetzt (Aus oder Auto-Modi)',
+        'n/a (Manual Mode)' => 'Nicht gesetzt (Manueller Modus)',
+      },
+    },
+   'ExternalFlashFlags' => 'Externer Blitz Flags',
+   'ExternalFlashGuideNumber' => 'Leitzahl des externen BlitzgerÃ€ts',
+   'ExternalFlashMode' => {
+      Description => 'Slave-Blitz-Messfeld 3',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On, Auto' => 'Ein, Auto',
+        'On, Contrast-control Sync' => 'Ein, Kontrast-Steuerungs-Synchronisation',
+        'On, Flash Problem' => 'Ein, Blitzproblem?',
+        'On, High-speed Sync' => 'Ein, High-Speed-Synchronisation',
+        'On, Manual' => 'Ein, Manuell',
+        'On, P-TTL Auto' => 'Ein, P-TTL-Blitzautomatik',
+        'On, Wireless' => 'Ein, Drahtlos',
+        'On, Wireless, High-speed Sync' => 'Ein, Drahtlos, High-Speed-Synchronisation',
+        'n/a - Off-Auto-Aperture' => 'K/A - Blendenring nicht auf A',
+      },
+    },
+   'ExternalFlashZoom' => 'Externer Blitz-Zoom',
+   'ExtraSamples' => 'ZusÃ€tzliche Komponenten',
+   'FEMicroadjustment' => 'FE Feinabstimmung',
+   'FNumber' => 'F-Wert',
+   'FOV' => 'Sichtfeld',
+   'Face0Position' => 'Position, 0. Gesicht',
+   'Face1Position' => 'Position, 1. Gesicht',
+   'Face2Position' => 'Position, 2. Gesicht',
+   'Face3Position' => 'Position, 3. Gesicht',
+   'Face4Position' => 'Position, 4. Gesicht',
+   'Face5Position' => 'Position, 5. Gesicht',
+   'Face6Position' => 'Position, 6. Gesicht',
+   'Face7Position' => 'Position, 7. Gesicht',
+   'Face8Position' => 'Position, 8. Gesicht',
+   'FaceDetect' => {
+      Description => 'Gesichtserkennung',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'FaceDetectArea' => 'Gesichtserkennung Bereich',
+   'FaceDetectFrameSize' => 'BereichsgrÃ¶Ãe',
+   'FacesDetected' => 'Gesichter erkannt',
+   'FastSeek' => {
+      PrintConv => {
+        'No' => 'Nein',
+        'Yes' => 'Ja',
+      },
+    },
+   'FaxProfile' => {
+      PrintConv => {
+        'Unknown' => 'Unbekannt',
+      },
+    },
+   'FaxRecvParams' => 'Fax-Empfangsparameter',
+   'FaxRecvTime' => 'Fax-Empfangszeit',
+   'FaxSubAddress' => 'Fax-Sub-Adresse',
+   'FileDescription' => 'Dateibeschreibung',
+   'FileFormat' => 'Dateiformat',
+   'FileIndex' => 'Datei-Index',
+   'FileInfo' => 'Datei-Informationen',
+   'FileInfoVersion' => 'Datei-Informationen-Version',
+   'FileModifyDate' => 'Datum/Uhrzeit der DateiÃ€nderung',
+   'FileName' => 'Dateiname',
+   'FileNumber' => 'Dateinummer',
+   'FileNumberMemory' => {
+      Description => 'Dateinummernspeicher',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'FileNumberSequence' => {
+      Description => 'Nummernspeicher',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'FilePermissions' => 'Dateiberechtigungen',
+   'FileSize' => 'DateigrÃ¶Ãe',
+   'FileSource' => {
+      Description => 'Dateiquelle',
+      PrintConv => {
+        'Digital Camera' => 'Digital-Kamera',
+        'Film Scanner' => 'Film-Scanner',
+        'Reflection Print Scanner' => 'Scanner',
+      },
+    },
+   'FileType' => 'Dateityp',
+   'FileVersion' => 'Dateiformatversion',
+   'FillFlashAutoReduction' => {
+      Description => 'E-TTL II-Automatikblitz-System',
+      PrintConv => {
+        'Disable' => 'Nicht mÃ¶glich',
+        'Enable' => 'MÃ¶glich',
+      },
+    },
+   'FilmMode' => {
+      Description => 'Film-Modus',
+      PrintConv => {
+        'F1/Studio Portrait' => 'F1/Studio-PortrÃ€t',
+        'F1a/Studio Portrait Enhanced Saturation' => 'F1a/Studio-PortrÃ€t Erweiterte SÃ€ttigung',
+        'F1b/Studio Portrait Smooth Skin Tone' => 'F1b/Studio-PortrÃ€t Weiche HauttÃ¶ne',
+        'F1c/Studio Portrait Increased Sharpness' => 'F1c/Studio-PortrÃ€t ErhÃ¶hte SchÃ€rfe',
+        'F3/Studio Portrait Ex' => 'F3/Studio PortrÃ€t Ex',
+      },
+    },
+   'FilmType' => 'Filmtyp',
+   'FilterEffect' => {
+      Description => 'Filter-Effekt',
+      PrintConv => {
+        'Green' => 'GrÃŒn',
+        'None' => 'Keiner',
+        'Off' => 'Aus',
+        'Red' => 'Rot',
+        'Yellow' => 'Gelb',
+        'n/a' => 'Nicht gesetzt',
+      },
+    },
+   'FilterEffectMonochrome' => {
+      PrintConv => {
+        'Green' => 'GrÃŒn',
+        'None' => 'Keine',
+        'Red' => 'Rot',
+        'Yellow' => 'Gelb',
+      },
+    },
+   'FinderDisplayDuringExposure' => {
+      Description => 'Sucheranzeige bei Belichtung',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'FineTuneOptCenterWeighted' => 'Feinabst. der Bel.Messung Mittenbetonte Messung',
+   'FineTuneOptMatrixMetering' => 'Feinabst. der Bel.Messung Matrixmessung',
+   'FineTuneOptSpotMetering' => 'Feinabst. der Bel.Messung Spotmessung',
+   'FirmwareRevision' => 'Firmware-Revision',
+   'FirmwareVersion' => 'Firmware-Version',
+   'FixtureIdentifier' => 'Kennzeichnung',
+   'Flash' => {
+      Description => 'Blitz',
+      PrintConv => {
+        'Auto, Did not fire' => 'Blitz wurde nicht ausgelÃ¶st, Automodus',
+        'Auto, Did not fire, Red-eye reduction' => 'Blitz wurde nicht ausgelÃ¶st, Rote-Augen-Reduzierung',
+        'Auto, Fired' => 'Blitz wurde ausgelÃ¶st, Automodus',
+        'Auto, Fired, Red-eye reduction' => 'Blitz wurde ausgelÃ¶st, Automodus, Rote-Augen-Reduzierung',
+        'Auto, Fired, Red-eye reduction, Return detected' => 'Blitz wurde ausgelÃ¶st, Automodus, Messblitz-Licht zurÃŒckgeworfen, Rote-Augen-Reduzierung',
+        'Auto, Fired, Red-eye reduction, Return not detected' => 'Blitz wurde ausgelÃ¶st, Automodus, kein Messblitz-Licht zurÃŒckgeworfen, Rote-Augen-Reduzierung',
+        'Auto, Fired, Return detected' => 'Blitz wurde ausgelÃ¶st, Automodus, Messblitz-Licht zurÃŒckgeworfen',
+        'Auto, Fired, Return not detected' => 'Blitz wurde ausgelÃ¶st, Automodus, kein Messblitz-Licht zurÃŒckgeworfen',
+        'Did not fire' => 'Blitz wurde nicht ausgelÃ¶st',
+        'Fired' => 'Blitz wurde ausgelÃ¶st',
+        'Fired, Red-eye reduction' => 'Blitz wurde ausgelÃ¶st, Rote-Augen-Reduzierung',
+        'Fired, Red-eye reduction, Return detected' => 'Blitz wurde ausgelÃ¶st, Rote-Augen-Reduzierung, Messblitz-Licht zurÃŒckgeworfen',
+        'Fired, Red-eye reduction, Return not detected' => 'Blitz wurde ausgelÃ¶st, Rote-Augen-Reduzierung, kein Messblitz-Licht zurÃŒckgeworfen',
+        'Fired, Return detected' => 'Messblitz-Licht zurÃŒckgeworfen',
+        'Fired, Return not detected' => 'Kein Messblitz-Licht zurÃŒckgeworfen',
+        'No Flash' => 'Blitz wurde nicht ausgelÃ¶st',
+        'No flash function' => 'Keine Blitzfunktion',
+        'Off' => 'Aus',
+        'Off, Did not fire' => 'Blitz wurde nicht ausgelÃ¶st, Blitz unterdrÃŒcken-Modus',
+        'Off, Did not fire, Return not detected' => 'Deaktiviert, Blitz wurde nicht ausgelÃ¶st, kein Messblitz-Licht zurÃŒckgeworfen',
+        'Off, No flash function' => 'Deaktiviert, Keine Blitzfunktion',
+        'Off, Red-eye reduction' => 'Deaktiviert, Rote-Augen-Reduzierung',
+        'On' => 'Ein',
+        'On, Did not fire' => 'Ein, Blitz wurde nicht ausgelÃ¶st',
+        'On, Fired' => 'Blitz wurde ausgelÃ¶st, Blitz erzwingen-Modus',
+        'On, Red-eye reduction' => 'Blitz wurde ausgelÃ¶st, Blitz erzwingen-Modus, Rote-Augen-Reduzierung',
+        'On, Red-eye reduction, Return detected' => 'Blitz wurde ausgelÃ¶st, Blitz erzwingen-Modus, Rote-Augen-Reduzierung, Messblitz-Licht zurÃŒckgeworfen',
+        'On, Red-eye reduction, Return not detected' => 'Blitz wurde ausgelÃ¶st, Blitz erzwingen-Modus, Rote-Augen-Reduzierung, kein Messblitz-Licht zurÃŒckgeworfen',
+        'On, Return detected' => 'Blitz wurde ausgelÃ¶st, Blitz erzwingen-Modus, Messblitz-Licht zurÃŒckgeworfen',
+        'On, Return not detected' => 'Blitz wurde ausgelÃ¶st, Blitz erzwingen-Modus, kein Messblitz-Licht zurÃŒckgeworfen',
+      },
+    },
+   'FlashActivity' => 'Blitz-Leistung',
+   'FlashBatteryLevel' => 'Blitz Batteriestatus',
+   'FlashBits' => 'Blitz-Details',
+   'FlashCommanderMode' => {
+      Description => 'Master-Steuerung',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'FlashCompensation' => 'Blitzbelichtungs-Korrektur',
+   'FlashControlMode' => {
+      Description => 'Blitzlichtsteuerungsmodus',
+      PrintConv => {
+        'Auto Aperture' => 'Blendenautomatik (AA)',
+        'Manual' => 'Manuell',
+        'Off' => 'Aus',
+        'Repeating Flash' => 'Stroboskopblitz',
+      },
+    },
+   'FlashDevice' => {
+      Description => 'BlitzgerÃ€t',
+      PrintConv => {
+        'External' => 'Extern',
+        'Internal' => 'Intern',
+        'Internal + External' => 'Intern + Extern',
+        'None' => 'Keins',
+      },
+    },
+   'FlashEnergy' => 'BlitzstÃ€rke',
+   'FlashExposureBracketValue' => 'Blitzbelichtungsreihenwert',
+   'FlashExposureComp' => 'Blitzbelichtungsausgleich',
+   'FlashExposureCompSet' => 'Eingestellte Blitz-Belichtungskorrektur',
+   'FlashExposureLock' => {
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'FlashFired' => {
+      Description => 'Blitz wurde ausgelÃ¶st',
+      PrintConv => {
+        'No' => 'Nein',
+        'Yes' => 'Ja',
+      },
+    },
+   'FlashFiring' => {
+      Description => 'BlitzzÃŒndung',
+      PrintConv => {
+        'Does not fire' => 'UnterdrÃŒckt',
+        'Fires' => 'Aktiv',
+      },
+    },
+   'FlashFirmwareVersion' => 'Blitz-Firmware-Version',
+   'FlashFocalLength' => 'Blitz-Brennweite',
+   'FlashGNDistance' => 'Blitzleitzahl Entfernung',
+   'FlashGroupACompensation' => 'Gruppe A, Blitzbelichtungs-Korrektur',
+   'FlashGroupAControlMode' => {
+      Description => 'Gruppe A, Blitzlichtsteuerungsmodus',
+      PrintConv => {
+        'Auto Aperture' => 'Blendenautomatik (AA)',
+        'Manual' => 'Manuell',
+        'Off' => 'Aus',
+        'Repeating Flash' => 'Stroboskopblitz',
+      },
+    },
+   'FlashGroupAOutput' => 'Gruppe A, Blitz-Leistung',
+   'FlashGroupBCompensation' => 'Gruppe B, Blitzbelichtungs-Korrektur',
+   'FlashGroupBControlMode' => {
+      Description => 'Gruppe B, Blitzlichtsteuerungsmodus',
+      PrintConv => {
+        'Auto Aperture' => 'Blendenautomatik (AA)',
+        'Automatic' => 'Automatik',
+        'Manual' => 'Manuell',
+        'Off' => 'Aus',
+        'Repeating Flash' => 'Stroboskopblitz',
+      },
+    },
+   'FlashGroupBOutput' => 'Gruppe B, Blitz-Leistung',
+   'FlashGroupCCompensation' => 'Gruppe C, Blitzbelichtungs-Korrektur',
+   'FlashGroupCControlMode' => {
+      Description => 'Gruppe C, Blitzlichtsteuerungsmodus',
+      PrintConv => {
+        'Auto Aperture' => 'Blendenautomatik (AA)',
+        'Manual' => 'Manuell',
+        'Off' => 'Aus',
+        'Repeating Flash' => 'Stroboskopblitz',
+      },
+    },
+   'FlashGroupCOutput' => 'Gruppe C, Blitz-Leistung',
+   'FlashGuideNumber' => 'Blitzleitzahl',
+   'FlashInfo' => 'Blitz-Informationen',
+   'FlashInfoVersion' => 'Blitz-Informationen-Version',
+   'FlashIntensity' => {
+      PrintConv => {
+        'High' => 'Hoch',
+        'Strong' => 'Stark',
+      },
+    },
+   'FlashLevel' => 'Blitzbelichtungskorr.',
+   'FlashMake' => 'BlitzgerÃ€t-Hersteller',
+   'FlashMetering' => {
+      Description => 'Blitz-Messung',
+      PrintConv => {
+        'Manual flash control' => 'Manuelle Blitz-Kontrolle',
+        'Pre-flash TTL' => 'Vorblitz TTL',
+      },
+    },
+   'FlashMeteringSegments' => 'Blitz-Messfelder',
+   'FlashMode' => {
+      Description => 'Blitz-Modus',
+      PrintConv => {
+        'Auto' => 'Automatisch',
+        'Auto, Did not fire' => 'Auto, nicht ausgelÃ¶st',
+        'Auto, Did not fire, Red-eye reduction' => 'Auto, nicht ausgelÃ¶st, Rote-Augen-Reduzierung',
+        'Auto, Fired' => 'Auto, ausgelÃ¶st',
+        'Auto, Fired, Red-eye reduction' => 'Auto, ausgelÃ¶st, Rote-Augen-Reduzierung',
+        'Did Not Fire' => 'Nicht ausgelÃ¶st',
+        'External, Auto' => 'Extern, Auto',
+        'External, Contrast-control Sync' => 'Extern, Kontrast-Steuerungs-Synchronisation',
+        'External, Flash Problem' => 'Extern, Blitzproblem?',
+        'External, High-speed Sync' => 'Extern, High-Speed-Synchronisation',
+        'External, Manual' => 'Extern, Manuell',
+        'External, P-TTL Auto' => 'Extern, P-TTL-Blitzautomatik',
+        'External, Wireless' => 'Extern, Drahtlos',
+        'External, Wireless, High-speed Sync' => 'Extern, Drahtlos, High-Speed-Synchronisation',
+        'Fill flash' => 'Aufhellblitz',
+        'Fired, Commander Mode' => 'AusgelÃ¶st, Befehlsmodus',
+        'Fired, External' => 'AusgelÃ¶st, Extern',
+        'Fired, Manual' => 'AusgelÃ¶st, Manuell',
+        'Fired, TTL Mode' => 'AusgelÃ¶st, TTL-Modus',
+        'Internal' => 'Intern',
+        'Off' => 'Aus',
+        'Off, Did not fire' => 'Aus',
+        'Off?' => 'Aus?',
+        'On' => 'Ein',
+        'On, Did not fire' => 'Ein, nicht ausgelÃ¶st',
+        'On, Fired' => 'Ein',
+        'On, Red-eye reduction' => 'Ein, Rote-Augen-Reduzierung',
+        'On, Slow-sync' => 'Ein, Langzeit-Synchronisation',
+        'On, Slow-sync, Red-eye reduction' => 'Ein, Langzeit-Synchronisation, Rote-Augen-Reduzierung',
+        'On, Soft' => 'Ein, Softblitz',
+        'On, Trailing-curtain Sync' => 'Ein, 2. Verschlussvorhang',
+        'On, Wireless (Control)' => 'Ein, Drahtlos (Steuerblitz)',
+        'On, Wireless (Master)' => 'Ein, Drahtlos (Hauptblitz)',
+        'Rear flash sync' => 'Synchronisation auf den zweiten Verschlussvorhang',
+        'Red-eye' => 'Rote Augen',
+        'Red-eye Reduction' => 'Rote-Augen-Reduzierung',
+        'Red-eye reduction' => 'Rote-Augen-Reduzierung',
+        'Unknown' => 'Unbekannt',
+        'Wireless' => 'Drahtlos',
+        'n/a - Off-Auto-Aperture' => 'K/A - Blendenring nicht auf A',
+      },
+    },
+   'FlashModel' => {
+      Description => 'Blitz-Modell',
+      PrintConv => {
+        'None' => 'Keines',
+      },
+    },
+   'FlashOptions' => {
+      Description => 'Blitz-Optionen',
+      PrintConv => {
+        'Auto' => 'Automatisch',
+        'Auto, Red-eye reduction' => 'Auto, Rote-Augen-Reduzierung',
+        'Red-eye reduction' => 'Rote-Augen-Reduzierung',
+        'Slow-sync' => 'Langzeit-Synchronisation',
+        'Slow-sync, Red-eye reduction' => 'Langzeit-Synchronisation, Rote-Augen-Reduzierung',
+        'Trailing-curtain Sync' => '2. Verschlussvorhang',
+        'Wireless (Control)' => 'Drahtlos (Steuerblitz)',
+        'Wireless (Master)' => 'Drahtlos (Hauptblitz)',
+      },
+    },
+   'FlashOptions2' => {
+      Description => 'Blitz-Optionen (2)',
+      PrintConv => {
+        'Auto' => 'Automatisch',
+        'Auto, Red-eye reduction' => 'Auto, Rote-Augen-Reduzierung',
+        'Red-eye reduction' => 'Rote-Augen-Reduzierung',
+        'Slow-sync' => 'Langzeit-Synchronisation',
+        'Slow-sync, Red-eye reduction' => 'Langzeit-Synchronisation, Rote-Augen-Reduzierung',
+        'Trailing-curtain Sync' => '2. Verschlussvorhang',
+        'Wireless (Control)' => 'Drahtlos (Steuerblitz)',
+        'Wireless (Master)' => 'Drahtlos (Hauptblitz)',
+      },
+    },
+   'FlashOutput' => 'BlitzstÃ€rke',
+   'FlashSerialNumber' => 'Blitz-Seriennummer',
+   'FlashSetting' => 'Blitzeinstellung',
+   'FlashShutterSpeed' => 'LÃ€ngste Verschlussz. (Blitz)',
+   'FlashStatus' => {
+      Description => 'Slave-Blitz-Messfeld 1',
+      PrintConv => {
+        'External, Did not fire' => 'Extern, nicht ausgelÃ¶st',
+        'External, Fired' => 'Extern, ausgelÃ¶st',
+        'Internal, Did not fire' => 'Intern, nicht ausgelÃ¶st',
+        'Internal, Fired' => 'Intern, ausgelÃ¶st',
+        'Off' => 'Aus',
+      },
+    },
+   'FlashSyncSpeed' => 'Blitzsynchronzeit',
+   'FlashSyncSpeedAv' => {
+      Description => 'Blitzsynchronzeit bei Av',
+      PrintConv => {
+        '1/200 Fixed' => '1/200 Fest',
+        '1/200-1/60 Auto' => '1/200-1/60 automatisch',
+        '1/250 Fixed' => '1/250 Fest',
+        '1/250-1/60 Auto' => '1/200-1/60 automatisch',
+        '1/300 Fixed' => '1/300 Fest',
+        'Auto' => 'Automatisch',
+      },
+    },
+   'FlashType' => {
+      Description => 'Blitztyp',
+      PrintConv => {
+        'Built-In Flash' => 'Intern',
+        'External' => 'Extern',
+        'None' => 'Keiner',
+      },
+    },
+   'FlashWarning' => {
+      Description => 'Blitzsymbol',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'FlashpixVersion' => 'UnterstÃŒtzte Flashpix-Version',
+   'FlickerReduce' => {
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'FlipHorizontal' => {
+      PrintConv => {
+        'No' => 'Nein',
+        'Yes' => 'Ja',
+      },
+    },
+   'FocalLength' => 'Brennweite',
+   'FocalLength35efl' => 'Brennweite',
+   'FocalLengthIn35mmFormat' => 'Brennweite in 35 mm-Kleinbildformat',
+   'FocalPlaneDiagonal' => 'Diagonale der Fokalebene',
+   'FocalPlaneResolutionUnit' => {
+      Description => 'Einheit der SensorauflÃ¶sung',
+      PrintConv => {
+        'None' => 'Keine',
+        'inches' => 'Inch',
+        'um' => 'Âµm (Mikrometer)',
+      },
+    },
+   'FocalPlaneXResolution' => 'SensorauflÃ¶sung horizontal',
+   'FocalPlaneXSize' => 'Breite der Fokal-Ebene',
+   'FocalPlaneXUnknown' => 'Breite der Fokal-Ebene',
+   'FocalPlaneYResolution' => 'SensorauflÃ¶sung vertikal',
+   'FocalPlaneYSize' => 'HÃ¶he der Fokal-Ebene',
+   'FocalPlaneYUnknown' => 'HÃ¶he der Fokal-Ebene',
+   'FocalType' => {
+      Description => 'Objektivart',
+      PrintConv => {
+        'Fixed' => 'Festbrennweite',
+        'Zoom' => 'Zoom-Objektiv',
+      },
+    },
+   'FocalUnits' => '"focal units" pro mm',
+   'Focus' => {
+      Description => 'SchÃ€rfeprioritÃ€t',
+      PrintConv => {
+        'Manual' => 'Manuell',
+      },
+    },
+   'FocusArea' => {
+      Description => 'Fokus-Bereich',
+      PrintConv => {
+        'Spot Focus' => 'Spot-AF-Messfeld',
+        'Wide Focus (normal)' => 'GroÃes AF-Messfeld (normal)',
+      },
+    },
+   'FocusAreaSelection' => {
+      Description => 'Scrollen bei Messfeldauswahl',
+      PrintConv => {
+        'No Wrap' => 'Am Rand stoppen',
+        'Wrap' => 'Umlaufend',
+      },
+    },
+   'FocusContinuous' => {
+      Description => 'Fortlaufende Fokussierung',
+      PrintConv => {
+        'Continuous' => 'Serienaufnahme',
+        'Manual' => 'Manuell',
+      },
+    },
+   'FocusDistance' => 'Fokus-Distanz',
+   'FocusDistanceLower' => 'Nahe Fokus-Distanz',
+   'FocusDistanceUpper' => 'Entfernte Fokus-Distanz',
+   'FocusMode' => {
+      Description => 'Fokus-Modus',
+      PrintConv => {
+        'AF-C' => 'AF-C (Kontinuierlicher Autofokus)',
+        'AF-S' => 'AF-S (Einzelautofokus)',
+        'AI Focus AF' => 'AI Fokus AF',
+        'Auto' => 'Automatisch',
+        'Continuous' => 'Serienaufnahme',
+        'Custom' => 'Benutzerdefiniert',
+        'Face detect' => 'Gesichtserkennung AF',
+        'Infinity' => 'Unendlich',
+        'Macro' => 'Makro',
+        'Macro (1)' => 'Makro (1)',
+        'Macro (2)' => 'Makro (2)',
+        'Manual' => 'Manuell',
+        'Manual Focus (3)' => 'Manueller Fokus (3)',
+        'Manual Focus (6)' => 'Manueller Fokus (6)',
+        'Multi AF' => 'Mehrpunkt AF',
+        'One-shot AF' => 'One-Shot AF',
+        'Pan Focus' => 'Pan-Fokus',
+        'Single' => 'Einzelbild',
+        'Single AF' => 'Einpunkt AF',
+        'Super Macro' => 'Super-Makro',
+      },
+    },
+   'FocusMode2' => {
+      Description => 'Fokus-Modus 2',
+      PrintConv => {
+        'AF-C' => 'AF-C (Kontinuierlicher Autofokus)',
+        'AF-S' => 'AF-S (Einzelautofokus)',
+        'Manual' => 'Manuell',
+      },
+    },
+   'FocusModeSetting' => {
+      Description => 'Autofokus',
+      PrintConv => {
+        'AF-A' => 'AF-Automatik',
+        'AF-C' => 'AF-C (Kontinuierlicher Autofokus)',
+        'AF-S' => 'AF-S (Einzelautofokus)',
+        'Manual' => 'Manuell',
+      },
+    },
+   'FocusPixel' => 'Fokus-Pixel',
+   'FocusPointWrap' => {
+      Description => 'Scrollen bei Messfeldauswahl',
+      PrintConv => {
+        'No Wrap' => 'Am Rand stoppen',
+        'Wrap' => 'Umlaufend',
+      },
+    },
+   'FocusPosition' => 'Fokus-Distanz',
+   'FocusProcess' => {
+      Description => 'Fokussierung',
+      PrintConv => {
+        'AF Not Used' => 'Ohne AF',
+        'AF Used' => 'Mit AF',
+      },
+    },
+   'FocusRange' => {
+      Description => 'Fokus-Bereich',
+      PrintConv => {
+        'Auto' => 'Automatisch',
+        'Close' => 'Nah',
+        'Far Range' => 'Entfernt',
+        'Infinity' => 'Unendlich',
+        'Macro' => 'Makro',
+        'Manual' => 'Manuell',
+        'Middle Range' => 'Mittlerer Bereich',
+        'Not Known' => 'Nicht bekannt',
+        'Pan Focus' => 'Pan-Fokus',
+        'Super Macro' => 'Super-Makro',
+        'Very Close' => 'Sehr nah',
+      },
+    },
+   'FocusTrackingLockOn' => {
+      Description => 'SchÃ€rfenarchiv. mit Lock-On',
+      PrintConv => {
+        'Long' => 'Lang',
+        'Off' => 'Aus',
+        'Short' => 'Kurz',
+      },
+    },
+   'FocusWarning' => {
+      Description => 'Fokus-Warnung',
+      PrintConv => {
+        'Good' => 'OK',
+        'Out of focus' => 'Ausserhalb des Fokus',
+      },
+    },
+   'FocusingScreen' => 'Mattscheibe',
+   'FolderName' => 'Ordner-Name',
+   'FrameNumber' => 'Bildnummer',
+   'FrameRate' => 'Bildwechselfrequenz',
+   'FrameSize' => 'EinzelbildgrÃ¶Ãe',
+   'FreeByteCounts' => 'Anzahl Bytes des leeren Datenbereiches',
+   'FreeMemoryCardImages' => 'Platz auf Speicherkarten fÃŒr',
+   'FreeOffsets' => 'Leerdatenposition',
+   'FujiFlashMode' => {
+      Description => 'Blitz-Modus',
+      PrintConv => {
+        'Auto' => 'Automatisch',
+        'External' => 'Externer Blitz',
+        'Off' => 'UnterdrÃŒckter Blitz',
+        'On' => 'Erzwungener Blitz',
+        'Red-eye reduction' => 'Rote-Augen-Reduzierung',
+      },
+    },
+   'FunctionButton' => {
+      Description => 'Funktionstaste',
+      PrintConv => {
+        'AF-area Mode' => 'Messfeldsteuerung',
+        'Center AF Area' => 'AF-MessfeldgrÃ¶Ãe',
+        'Center-weighted' => 'Mittenbetont',
+        'FV Lock' => 'FV-Messwertspeicher',
+        'Flash Off' => 'Blitz aus',
+        'Framing Grid' => 'Gitterlinien',
+        'ISO Display' => 'ISO-Anzeige',
+        'Matrix Metering' => 'Matrixmessung',
+        'Spot Metering' => 'Spotmessung',
+      },
+    },
+   'GIFVersion' => 'GIF-Version',
+   'GPSAltitude' => 'HÃ¶he',
+   'GPSAltitudeRef' => {
+      Description => 'BezugshÃ¶he',
+      PrintConv => {
+        'Above Sea Level' => 'HÃ¶he ÃŒber Normal-Null (Meeresspiegel)',
+        'Below Sea Level' => 'HÃ¶he unter Normal-Null (Meeresspiegel)',
+      },
+    },
+   'GPSAreaInformation' => 'Name des GPS-Gebietes',
+   'GPSDOP' => 'Messgenauigkeit',
+   'GPSDateStamp' => 'GPS Datum',
+   'GPSDateTime' => 'GPS-Zeit (Atomuhr)',
+   'GPSDestBearing' => 'Motivrichtung',
+   'GPSDestBearingRef' => {
+      Description => 'Referenz fÃŒr Motivrichtung',
+      PrintConv => {
+        'Magnetic North' => 'Magnetische Ausrichtung',
+        'True North' => 'Geographische Ausrichtung',
+      },
+    },
+   'GPSDestDistance' => 'Distanz zum Ziel',
+   'GPSDestDistanceRef' => {
+      Description => 'Reference for distance to destination',
+      PrintConv => {
+        'Kilometers' => 'Kilometer',
+        'Miles' => 'Meilen',
+        'Nautical Miles' => 'Knoten',
+      },
+    },
+   'GPSDestLatitude' => 'Breite des Zieles',
+   'GPSDestLatitudeRef' => {
+      Description => 'Referenz fÃŒr die Breite des Zieles',
+      PrintConv => {
+        'North' => 'Nordliche Breite',
+        'South' => 'SÃŒdliche Breite',
+      },
+    },
+   'GPSDestLongitude' => 'LÃ€ngengrad des Ziels',
+   'GPSDestLongitudeRef' => {
+      Description => 'Referenz fÃŒr die LÃ€nge des Zieles',
+      PrintConv => {
+        'East' => 'Ãstliche LÃ€nge',
+        'West' => 'Westliche LÃ€nge',
+      },
+    },
+   'GPSDifferential' => {
+      Description => 'GPS-Differentialkorrektur',
+      PrintConv => {
+        'Differential Corrected' => 'Differentialkorrektur angewandt',
+        'No Correction' => 'Messung ohne Differentialkorrektur',
+      },
+    },
+   'GPSImgDirection' => 'Bildrichtung',
+   'GPSImgDirectionRef' => {
+      Description => 'Referenz fÃŒr die Ausrichtung des Bildes',
+      PrintConv => {
+        'Magnetic North' => 'Magnetische Ausrichtung',
+        'True North' => 'Geographische Ausrichtung',
+      },
+    },
+   'GPSInfo' => 'GPS Info IFD-Zeiger',
+   'GPSLatitude' => 'Geografische Breite',
+   'GPSLatitudeRef' => {
+      Description => 'NÃ¶rdl. oder sÃŒdl. Breite',
+      PrintConv => {
+        'North' => 'NÃ¶rdliche Breite',
+        'South' => 'SÃŒdliche Breite',
+      },
+    },
+   'GPSLongitude' => 'Geografische LÃ€nge',
+   'GPSLongitudeRef' => {
+      Description => 'Ã¶stl. oder westl. LÃ€nge',
+      PrintConv => {
+        'East' => 'Ãstliche LÃ€nge',
+        'West' => 'Westliche LÃ€nge',
+      },
+    },
+   'GPSMapDatum' => 'GeodÃ€tisches Datum',
+   'GPSMeasureMode' => {
+      Description => 'GPS-Messverfahren',
+      PrintConv => {
+        '2-D' => '2-Dimensionale Messung',
+        '2-Dimensional' => '2-Dimensionale Messung',
+        '2-Dimensional Measurement' => '2-Dimensionale Messung',
+        '3-D' => '3-Dimensionale Messung',
+        '3-Dimensional' => '3-Dimensionale Messung',
+        '3-Dimensional Measurement' => '3-Dimensionale Messung',
+      },
+    },
+   'GPSProcessingMethod' => 'Name der GPS-Verarbeitungsmethode',
+   'GPSSatellites' => 'FÃŒr die Messung verwendete Satelliten',
+   'GPSSpeed' => 'Geschwindigkeit des GPS-EmpfÃ€ngers',
+   'GPSSpeedRef' => {
+      Description => 'Geschwindigkeitseinheit',
+      PrintConv => {
+        'km/h' => 'Kilometer pro Stunde',
+        'knots' => 'Knoten',
+        'mph' => 'Meilen pro Stunde',
+      },
+    },
+   'GPSStatus' => {
+      Description => 'GPS-EmpfÃ€nger-Status',
+      PrintConv => {
+        'Measurement Active' => 'Messung aktiv',
+        'Measurement Void' => 'Messung ungÃŒltig',
+      },
+    },
+   'GPSTimeStamp' => 'GPS-Zeit (Atomuhr)',
+   'GPSTrack' => 'Bewegungsrichtung',
+   'GPSTrackRef' => {
+      Description => 'Referenz fÃŒr Bewegungsrichtung',
+      PrintConv => {
+        'Magnetic North' => 'Magnetische Ausrichtung',
+        'True North' => 'Geographische Ausrichtung',
+      },
+    },
+   'GPSVersionID' => 'GPS-Tag-Version',
+   'GainControl' => {
+      Description => 'BelichtungsverstÃ€rkung',
+      PrintConv => {
+        'High gain down' => 'Hohe Helligkeitsminderung',
+        'High gain up' => 'Hohe HelligkeitsverstÃ€rkung',
+        'Low gain down' => 'Geringe Helligkeitsminderung',
+        'Low gain up' => 'Geringe HelligkeitsverstÃ€rkung',
+        'None' => 'Keine',
+      },
+    },
+   'Gapless' => {
+      PrintConv => {
+        'No' => 'Nein',
+        'Yes' => 'Ja',
+      },
+    },
+   'GrayResponseUnit' => {
+      PrintConv => {
+        '0.0001' => 'Nummer stellt ein 1000tel einer Einheit dar',
+        '0.001' => 'Nummer stellt ein 100tel einer Einheit dar',
+        '0.1' => 'Nummer stellt ein 10tel einer Einheit dar',
+        '1e-05' => 'Nummer stellt ein 10000tel einer Einheit dar',
+        '1e-06' => 'Nummer stellt ein 100000tel einer Einheit dar',
+      },
+    },
+   'GrayTRC' => 'Grau-Tonwertwiedergabe-Kurve',
+   'GreenMatrixColumn' => 'GrÃŒn-Matrixspalte',
+   'GreenTRC' => 'GrÃŒn-Tonwertwiedergabe-Kurve',
+   'GridDisplay' => {
+      Description => 'Gitterlinien',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'GripBatteryADLoad' => 'Griffbatterie A/D unter Last',
+   'GripBatteryADNoLoad' => 'Griffbatterie A/D im Leerlauf',
+   'GripBatteryState' => {
+      Description => 'Griffbatterie-Status',
+      PrintConv => {
+        'Almost Empty' => 'Fast leer',
+        'Empty or Missing' => 'Leer oder nicht vorhanden',
+        'Full' => 'Voll geladen',
+        'Running Low' => 'Schwach',
+      },
+    },
+   'HDR' => {
+      Description => 'Auto HDR',
+      PrintConv => {
+        'Off' => 'Aus',
+      },
+    },
+   'Headline' => 'Ãberschrift',
+   'HeightResolution' => 'Vertikale BildauflÃ¶sung',
+   'HighISONoiseReduction' => {
+      Description => 'RauschunterdrÃŒckung bei hoher Empfindlichkeit',
+      PrintConv => {
+        'Auto' => 'Automatisch',
+        'High' => 'StÃ€rker',
+        'Low' => 'SchwÃ€cher',
+        'Off' => 'Aus',
+        'On' => 'Ein',
+        'Strong' => 'Stark',
+        'Weak' => 'Gering',
+        'Weakest' => 'Sehr gering',
+      },
+    },
+   'HighlightTonePriority' => {
+      Description => 'Tonwert PrioritÃ€t',
+      PrintConv => {
+        'Disable' => 'Nicht mÃ¶glich',
+        'Enable' => 'MÃ¶glich',
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'HometownCity' => 'Heimatort',
+   'HometownCityCode' => 'Heimatort-Code',
+   'HometownDST' => {
+      Description => 'Heimatort Sommerzeit (DST)',
+      PrintConv => {
+        'No' => 'Deaktiviert',
+        'Yes' => 'Aktiviert',
+      },
+    },
+   'Hue' => 'Farbton',
+   'HueAdjustment' => 'Farbtonkorrektur',
+   'HueSetting' => 'Farbtoneinstellung',
+   'HuffmanTable' => 'Huffman Tabelle',
+   'HyperfocalDistance' => 'Hyperfokale Entfernung',
+   'ICCProfileName' => 'Name des ICC Profils',
+   'IPTC-NAA' => 'IPTC-NAA Metadaten',
+   'IPTCImageHeight' => 'IPTC-BildhÃ¶he',
+   'IPTCImageWidth' => 'IPTC-Bildbreite',
+   'IPTCPictureNumber' => 'IPTC Bildnummer',
+   'IPTCPixelHeight' => 'IPTC-PixelhÃ¶he',
+   'IPTCPixelWidth' => 'IPTC-Pixelbreite',
+   'ISO' => 'ISO-Empfindlichkeit',
+   'ISO2' => 'ISO-Empfindlichkeit (2)',
+   'ISODisplay' => 'ISO-Anzeige',
+   'ISOExpansion' => {
+      Description => 'ISO-Erweiterung',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'ISOExpansion2' => {
+      Description => 'ISO-Erweiterung (2)',
+      PrintConv => {
+        'Off' => 'Aus',
+      },
+    },
+   'ISOFloor' => 'ISO-Untergrenze',
+   'ISOInfo' => 'ISO-Informationen',
+   'ISOSelection' => 'ISO-Auswahl',
+   'ISOSetting' => {
+      Description => 'ISO-Einstellung',
+      PrintConv => {
+        '200 (Zone Matching High)' => '200 (Zonenabgleich High)',
+        '80 (Zone Matching Low)' => '80 (Zonenabgleich Low)',
+        'Auto' => 'Automatisch',
+        'Manual' => 'Manuell',
+      },
+    },
+   'ISOSpeedExpansion' => {
+      PrintConv => {
+        'No' => 'Nein',
+        'Yes' => 'Ja',
+      },
+    },
+   'ISOSpeedIncrements' => {
+      Description => 'ISO-Schrittweite',
+      PrintConv => {
+        '1 Stop' => '1 LW',
+        '1/3 Stop' => '1/3 LW',
+      },
+    },
+   'ISOSpeedRange' => {
+      Description => 'Einstellung ISO-Bereich',
+      PrintConv => {
+        'Disable' => 'Nicht mÃ¶glich',
+        'Enable' => 'MÃ¶glich',
+      },
+    },
+   'ISOStepSize' => {
+      Description => 'ISO-Schrittweite',
+      PrintConv => {
+        '1 EV' => '1 LW',
+        '1/2 EV' => '1/2 LW',
+        '1/3 EV' => '1/3 LW',
+      },
+    },
+   'Illumination' => {
+      Description => 'Displaybeleuchtung',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'ImageAdjustment' => 'Bildanpassung',
+   'ImageAreaOffset' => 'Bildbereichsoffset',
+   'ImageAuthentication' => {
+      Description => 'Bild-Authentifikation',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'An',
+      },
+    },
+   'ImageBoundary' => 'Bildbegrenzung',
+   'ImageByteCount' => 'Anzahl Bytes der Bilddaten',
+   'ImageCount' => 'BildzÃ€hler',
+   'ImageDataDiscard' => {
+      Description => 'Verworfene Bilddaten',
+      PrintConv => {
+        'Flexbits Discarded' => 'FlexBits verworfen',
+        'Full Resolution' => 'Volle AuflÃ¶sung',
+        'HighPass Frequency Data Discarded' => 'Hochpass-Frequenz-Daten verworfen',
+        'Highpass and LowPass Frequency Data Discarded' => 'Hochpass- und Tiefpass-Frequenz-Daten verworfen',
+      },
+    },
+   'ImageDataSize' => 'BilddatengrÃ¶Ãe',
+   'ImageDescription' => 'Bildbeschreibung',
+   'ImageDustOff' => {
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'ImageEditCount' => 'BildverarbeitungszÃ€hler',
+   'ImageEditing' => {
+      Description => 'Bildverarbeitung',
+      PrintConv => {
+        'Cropped' => 'Beschnitten',
+        'Digital Filter' => 'Digitalfilter',
+        'Frame Synthesis?' => 'Rahmen?',
+        'None' => 'Unbearbeitet',
+      },
+    },
+   'ImageHeight' => 'BildhÃ¶he',
+   'ImageHistory' => 'Bild-Historie',
+   'ImageNumber' => 'Bildnummer',
+   'ImageNumber2' => 'Bildnummer (2)',
+   'ImageOffset' => 'Bilddatenposition',
+   'ImageOptimization' => 'Bildoptimierung',
+   'ImageOrientation' => {
+      Description => 'Bildausrichtung',
+      PrintConv => {
+        'Landscape' => 'Querformat',
+        'Portrait' => 'PortrÃ€t',
+        'Square' => 'Quadratisch',
+      },
+    },
+   'ImageProcessingVersion' => 'Bildverarbeitung Version',
+   'ImageQuality' => {
+      Description => 'BildqualitÃ€t',
+      PrintConv => {
+        'High' => 'Hoch',
+      },
+    },
+   'ImageQuality2' => 'BildqualitÃ€t 2',
+   'ImageReview' => {
+      Description => 'Bildkontrolle',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'ImageReviewTime' => 'Ausschaltzeit Bildkontrolle',
+   'ImageRotated' => {
+      PrintConv => {
+        'No' => 'Nein',
+        'Yes' => 'Ja',
+      },
+    },
+   'ImageSize' => 'BildgrÃ¶Ãe',
+   'ImageStabilization' => {
+      Description => 'Bildstabilisierung',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'ImageTone' => {
+      Description => 'Farbdynamik',
+      PrintConv => {
+        'Bright' => 'Leuchtend',
+        'Landscape' => 'Landschaft',
+        'Monochrome' => 'Monochrom',
+        'Natural' => 'NatÃŒrlich',
+        'Portrait' => 'PortrÃ€t',
+      },
+    },
+   'ImageType' => 'Bildtyp',
+   'ImageUniqueID' => 'Eindeutige Bild-ID',
+   'ImageWidth' => 'Bildbreite',
+   'InfoButtonWhenShooting' => {
+      Description => 'INFO-Taste bei Aufnahme',
+      PrintConv => {
+        'Displays camera settings' => 'Anzeige Kameradaten',
+        'Displays shooting functions' => 'Anzeige Aufnahmedaten',
+      },
+    },
+   'InitialZoomSetting' => {
+      Description => 'Erste VergrÃ¶Ãerungsstufe',
+      PrintConv => {
+        'High Magnification' => 'Starke VergrÃ¶Ãerung',
+        'Low Magnification' => 'Geringe VergrÃ¶Ãerung',
+        'Medium Magnification' => 'Mittlere VergrÃ¶Ãerung',
+      },
+    },
+   'Instructions' => 'Anweisungen',
+   'IntellectualGenre' => 'Genre',
+   'IntensityStereo' => {
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'InternalFlash' => {
+      Description => 'Integriertes BlitzgerÃ€t',
+      PrintConv => {
+        'Commander Mode' => 'Master-Steuerung',
+        'Fired' => 'Blitz wurde ausgelÃ¶st',
+        'Manual' => 'Manuell',
+        'No' => 'Blitz wurde nicht ausgelÃ¶st',
+        'Off' => 'Aus',
+        'On' => 'Ein',
+        'Repeating Flash' => 'Stroboskopblitz',
+      },
+    },
+   'InternalFlashMode' => {
+      Description => 'Slave-Blitz-Messfeld 2',
+      PrintConv => {
+        'Did not fire, (Unknown 0xf4)' => 'Aus (Unbekannt 0xF4?)',
+        'Did not fire, Auto' => 'Aus, Auto',
+        'Did not fire, Auto, Red-eye reduction' => 'Aus, Auto, Rote-Augen-Reduzierung',
+        'Did not fire, Normal' => 'Aus, Normal',
+        'Did not fire, Red-eye reduction' => 'Aus, Rote-Augen-Reduzierung',
+        'Did not fire, Slow-sync' => 'Aus, Langzeit-Synchronisation',
+        'Did not fire, Slow-sync, Red-eye reduction' => 'Aus, Langzeit-Synchronisation, Rote-Augen-Reduzierung',
+        'Did not fire, Trailing-curtain Sync' => 'Aus, 2. Verschlussvorhang',
+        'Did not fire, Wireless (Control)' => 'Aus, Drahtlos (Steuerblitz)',
+        'Did not fire, Wireless (Master)' => 'Aus, Drahtlos (Hauptblitz)',
+        'Fired' => 'Ein',
+        'Fired, Auto' => 'Ein, Auto',
+        'Fired, Auto, Red-eye reduction' => 'Ein, Auto, Rote-Augen-Reduzierung',
+        'Fired, Red-eye reduction' => 'Ein, Rote-Augen-Reduzierung',
+        'Fired, Slow-sync' => 'Ein, Langzeit-Synchronisation',
+        'Fired, Slow-sync, Red-eye reduction' => 'Ein, Langzeit-Synchronisation, Rote-Augen-Reduzierung',
+        'Fired, Trailing-curtain Sync' => 'Ein, 2. Verschlussvorhang',
+        'Fired, Wireless (Control)' => 'Ein, Drahtlos (Steuerblitz)',
+        'Fired, Wireless (Master)' => 'Ein, Drahtlos (Hauptblitz)',
+        'n/a - Off-Auto-Aperture' => 'K/A - Blendenring nicht auf A',
+      },
+    },
+   'InternalFlashStrength' => 'Slave-Blitz-Messfeld 4',
+   'InternalName' => 'Interner Name',
+   'InternalSerialNumber' => 'Interne Seriennummer',
+   'InteropIndex' => {
+      Description => 'InteroperabilitÃ€ts-Identifikation',
+      PrintConv => {
+        'R03 - DCF option file (Adobe RGB)' => 'R03: DCF Option-Format (Adobe RGB)',
+        'R98 - DCF basic file (sRGB)' => 'R98: DCF Basic-Format (sRGB)',
+        'THM - DCF thumbnail file' => 'THM: DCF Miniaturbild-Format',
+      },
+    },
+   'InteropOffset' => 'InteroperabilitÃ€ts-Tag',
+   'InteropVersion' => 'InteroperabilitÃ€ts-Version',
+   'IntervalLength' => 'IntervallÃ€nge',
+   'IntervalMode' => {
+      Description => 'Interval-Modus',
+      PrintConv => {
+        'Still Image' => 'Standbild',
+        'Time-lapse Movie' => 'Zeitraffer-Film',
+      },
+    },
+   'IntervalNumber' => 'Intervalnummer',
+   'JFIFVersion' => 'JFIF-Version',
+   'JPEGQuality' => 'JPEG-QualitÃ€t',
+   'JobID' => 'Job-ID',
+   'JpgFromRaw' => 'Jpg From Raw Bild',
+   'JpgFromRawLength' => 'Jpg From Raw DatenlÃ€nge',
+   'JpgFromRawStart' => 'Jpg From Raw Datenposition',
+   'JpgRecordedPixels' => 'JPEG-AuflÃ¶sung',
+   'Key' => 'SchlÃŒssel',
+   'Keyword' => 'StichwÃ¶rter',
+   'Keywords' => 'SchlÃŒsselwort',
+   'KodakImageHeight' => 'Kodak-BildhÃ¶he',
+   'KodakImageWidth' => 'Kodak-Bildbreite',
+   'LC1' => 'Objektiv-Wert',
+   'LC10' => 'Mv\' nv\'-Daten',
+   'LC11' => 'AVC 1/EXP-Wert',
+   'LC12' => 'Mv1 Avminsif-Wert',
+   'LC14' => 'UNT_12 UNT_6-Wert',
+   'LC15' => 'Incorporated Flash Suited END-Wert',
+   'LC2' => 'Entfernungscode',
+   'LC3' => 'K-Wert (LC3)',
+   'LC4' => 'Wert fÃŒr Aberrationskorrektur im Nahbereich',
+   'LC5' => 'Wert fÃŒr Aberrationskorrektur heller Farben',
+   'LC6' => 'Wert fÃŒr Aberrationskorrektur bei offener Blende',
+   'LC7' => 'AF Minimum Actuation Condition-Wert',
+   'LCDDisplayAtPowerOn' => {
+      Description => 'LCD-Display bei Kamera Ein',
+      PrintConv => {
+        'Retain power off status' => 'Aus-Status beibehalten',
+      },
+    },
+   'LCDDisplayReturnToShoot' => {
+      Description => 'LC-Display->ZurÃŒck zur Aufn.',
+      PrintConv => {
+        'Also with * etc.' => 'Auch mit * etc.',
+        'With Shutter Button only' => 'Nur mit AuslÃ¶ser',
+      },
+    },
+   'LCDIllumination' => {
+      Description => 'Displaybeleuchtung',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'LCDIlluminationDuringBulb' => {
+      Description => 'LCD-Beleuchtung bei Langzeitaufnahme',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'LCDPanels' => 'LCD oben/LCD RÃŒckwand',
+   'LCHEditor' => {
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'Label' => 'Bezeichnung',
+   'Language' => 'Sprache',
+   'LanguageCode' => {
+      Description => 'Sprache',
+      PrintConv => {
+        'Process default' => 'Systemeinstellung',
+      },
+    },
+   'LanguageIdentifier' => 'Sprachkennung',
+   'LastFileNumber' => 'Letzte Dateinummer',
+   'LeafData' => 'Leaf Daten',
+   'Lens' => 'Objektiv',
+   'Lens35efl' => 'Objektiv',
+   'LensAFStopButton' => {
+      Description => 'Funktion Objektiv-AF-Stopptaste',
+      PrintConv => {
+        'AE lock' => 'AE-Speicherung',
+        'AE lock while metering' => 'AE-Sperre b. aktiv. Messung',
+        'AF Stop' => 'AF-Stopp',
+        'AF point: M->Auto/Auto->ctr' => 'AF-Messf: M->Aut./Aut.->Ctr',
+        'AF start' => 'AF-Start',
+        'AF stop' => 'AF-Stopp',
+        'IS start' => 'Start Bildstabilisierung',
+        'Switch to registered AF point' => 'Auf gesp. AF-Messf. schalten',
+      },
+    },
+   'LensData' => 'K-Wert',
+   'LensDataVersion' => 'Objektivdaten-Version',
+   'LensDriveNoAF' => {
+      Description => 'SchÃ€rfensuche wenn AF unmÃ¶glich',
+      PrintConv => {
+        'Focus search off' => 'SchÃ€rfensuche aus',
+        'Focus search on' => 'SchÃ€rfensuche ein',
+      },
+    },
+   'LensFStops' => 'Objektiv-Blendenstufen',
+   'LensFirmwareVersion' => 'Objektiv-Firmware-Version',
+   'LensID' => 'Objektiv-ID',
+   'LensIDNumber' => 'Objektivkennnummer',
+   'LensInfo' => 'Objektiv-Informationen',
+   'LensKind' => 'Objektivtyp / Version (LC0)',
+   'LensMake' => 'Objektivhersteller',
+   'LensModel' => 'Objektiv-Typ',
+   'LensProperties' => 'Objektivfunktionen?',
+   'LensSerialNumber' => 'Objektiv-Seriennummer',
+   'LensSpec' => 'Objektiv',
+   'LensType' => 'Objektivtyp',
+   'LicenseType' => {
+      PrintConv => {
+        'Unknown' => 'Unbekannt',
+      },
+    },
+   'LightReading' => 'Helligkeitsauswertung',
+   'LightSource' => {
+      Description => 'Lichtquelle',
+      PrintConv => {
+        'Cloudy' => 'BewÃ¶lkt',
+        'Cool White Fluorescent' => 'Neonlicht kaltweiÃ',
+        'Day White Fluorescent' => 'Neonlicht neutralweiÃ',
+        'Daylight' => 'Tageslicht',
+        'Daylight Fluorescent' => 'Neonlicht tageslichtweiÃ',
+        'Evening Sunlight' => 'Abendstimmung',
+        'Fine Weather' => 'Wolkenlos',
+        'Flash' => 'Blitz',
+        'Fluorescent' => 'Neonlicht',
+        'ISO Studio Tungsten' => 'ISO Studio-Kunstlicht (GlÃŒhbirne)',
+        'One Touch White Balance' => 'Sofort-WeiÃabgleich',
+        'Other' => 'Andere Lichtquelle',
+        'Shade' => 'Schatten',
+        'Standard Light A' => 'Standard-Licht A',
+        'Standard Light B' => 'Standard-Licht B',
+        'Standard Light C' => 'Standard-Licht C',
+        'Tungsten' => 'GlÃŒhbirne',
+        'Tungsten (Incandescent)' => 'Kunstlicht (GlÃŒhbirne)',
+        'Unknown' => 'Unbekannt',
+        'Warm White Fluorescent' => 'Neonlicht warmweiÃ',
+        'White Fluorescent' => 'Neonlicht universalweiÃ',
+      },
+    },
+   'LightSourceSpecial' => {
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'LightValue' => 'Lichtwert(ISO)',
+   'Lightness' => 'Graustufung',
+   'LinearizationTable' => 'Linearisierungstabelle',
+   'Lit' => {
+      PrintConv => {
+        'No' => 'Nein',
+        'Yes' => 'Ja',
+      },
+    },
+   'LiveViewExposureSimulation' => {
+      Description => 'Livebild-Belichtungssimulator',
+      PrintConv => {
+        'Disable (LCD auto adjust)' => 'Inaktiv (automatische LCD-Anzeige)',
+        'Enable (simulates exposure)' => 'Aktiv (simuliert Belichtung)',
+      },
+    },
+   'LiveViewShooting' => {
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'LocalizedCameraModel' => 'Lokalisiertes Kameramodell',
+   'Location' => 'Aufnahmeort',
+   'LockMicrophoneButton' => {
+      Description => 'Mikrofone-Tastenfunktion',
+      PrintConv => {
+        'Protect (hold:record memo)' => 'GeschÃŒtzt (drÃŒcken:Tonaufnahme)',
+        'Record memo (protect:disable)' => 'Tonaufnahme (ungeschÃŒtzt)',
+      },
+    },
+   'LongExposureNoiseReduction' => {
+      Description => 'Langzeit-Rauschminderung',
+      PrintConv => {
+        'Auto' => 'Automatisch',
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'LongFocal' => 'GrÃ¶Ãte Brennweite',
+   'Luminance' => 'Luminanz',
+   'LuminanceNoiseReduction' => {
+      PrintConv => {
+        'High' => 'Hoch',
+        'Low' => 'Leicht',
+        'Off' => 'Aus',
+      },
+    },
+   'MB-D10Batteries' => {
+      Description => 'Akku-/Batterietyp',
+      PrintConv => {
+        'FR6 (AA lithium)' => 'FR6 (Mignon, Lithium)',
+        'HR6 (AA Ni-MH)' => 'HR6 (Mignon, NiMH)',
+        'LR6 (AA alkaline)' => 'LR6 (Mignon, Alkaline)',
+        'ZR6 (AA Ni-Mn)' => 'ZR6 (Mignon, NiMn)',
+      },
+    },
+   'MB-D80Batteries' => {
+      Description => 'Akku-/Batterietyp',
+      PrintConv => {
+        'FR6 (AA Lithium)' => 'FR6 (Mignon-Lithium)',
+        'HR6 (AA Ni-MH)' => 'HR6 (Mignon-Ni-MH)',
+        'LR6 (AA Alkaline)' => 'LR6 (Mignon-Alkaline)',
+        'ZR6 (AA Ni-Mg)' => 'ZR6 (Mignon-Ni-Mg)',
+      },
+    },
+   'MB-D80BatteryType' => 'MB-D80 Batterietyp',
+   'MCUVersion' => 'MCU-Version',
+   'MIEVersion' => 'MIE-Version',
+   'MIMEType' => 'MIME-Typ',
+   'MSStereo' => {
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'Macro' => {
+      Description => 'Makro',
+      PrintConv => {
+        'Macro' => 'Makro',
+        'Manual' => 'Manuell',
+        'Off' => 'Aus',
+        'On' => 'Ein',
+        'Super Macro' => 'Super-Makro',
+      },
+    },
+   'MacroMode' => {
+      Description => 'Makro-Modus',
+      PrintConv => {
+        'Macro' => 'Makro',
+        'Off' => 'Aus',
+        'On' => 'Ein',
+        'Super Macro' => 'Super-Makro',
+      },
+    },
+   'MagnifiedView' => {
+      Description => 'Lupenfunktion',
+      PrintConv => {
+        'Image playback only' => 'Nur bei Bildwiedergabe',
+        'Image review and playback' => 'Sofortbild u. Wiedergabe',
+      },
+    },
+   'MainDialExposureComp' => {
+      Description => 'Main Dial Belichtungskorrektur',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'Make' => 'GerÃ€tehersteller',
+   'MakeAndModel' => 'Hersteller und Modell',
+   'MakerNote' => 'Hersteller-eigene Daten',
+   'MakerNoteSafety' => {
+      Description => 'Sicherheit der Hersteller-Informationsdaten',
+      PrintConv => {
+        'Safe' => 'Sicher',
+        'Unsafe' => 'Unsicher',
+      },
+    },
+   'MakerNoteVersion' => 'MakerNote-Version',
+   'MakerNotes' => 'Hinweise des Herstellers',
+   'ManometerPressure' => 'Gemessener Luft- bzw. Wasserdruck',
+   'ManometerReading' => 'Berechnete HÃ¶he oder Tauchtiefe',
+   'ManualFlash' => 'Manueller Blitz',
+   'ManualFlashOutput' => {
+      Description => 'Manuelle BlitzstÃ€rke',
+      PrintConv => {
+        'Full' => 'Voll',
+        'Low' => 'Gering',
+        'Medium' => 'Mittel',
+        'n/a' => 'Nicht gesetzt',
+      },
+    },
+   'ManualFocusDistance' => 'Manuelle Fokusdistanz',
+   'ManualTv' => {
+      Description => 'Man. Tv/Av-Einst. fÃŒr M. Bel.',
+      PrintConv => {
+        'Tv=Control/Av=Main' => 'Tv=Schnelleinstellrad/Av=Haupt-Wahlrad',
+        'Tv=Main/Av=Control' => 'Tv=Haupt-Wahlrad/Av=Schnelleinstellrad',
+      },
+    },
+   'ManufactureDate' => 'Herstellungsdatum',
+   'Marked' => 'Markiert',
+   'MasterDocumentID' => 'ID des Originaldokuments',
+   'MaxAperture' => 'GrÃ¶Ãte Blende',
+   'MaxApertureAtCurrentFocal' => 'GrÃ¶Ãte Blende bei aktueller Brennweite',
+   'MaxApertureAtMaxFocal' => 'GrÃ¶Ãte Blende bei grÃ¶Ãter Brennweite',
+   'MaxApertureAtMinFocal' => 'GrÃ¶Ãte Blende bei geringster Brennweite',
+   'MaxApertureValue' => 'GrÃ¶ÃtmÃ¶gliche Blende',
+   'MaxContinuousRelease' => 'Max. Bildanzahl pro Serie',
+   'MaxFocalLength' => 'GrÃ¶Ãte Brennweite',
+   'MeasuredEV' => 'Gemessener LW',
+   'MeasurementGeometry' => {
+      PrintConv => {
+        '0/45 or 45/0' => '0/45 oder 45/0',
+        '0/d or d/0' => '0/d oder d/0',
+      },
+    },
+   'MediaBlackPoint' => 'Medium-Schwarzpunkt',
+   'MediaWhitePoint' => 'Medium-WeiÃpunkt',
+   'Medium' => 'MittelgroÃ',
+   'MenuButtonDisplayPosition' => {
+      Description => 'Positionsanzeige Menuetaste',
+      PrintConv => {
+        'Previous' => 'Vorherige Anzeige',
+        'Previous (top if power off)' => 'Vorherige (Anfang nach AUS)',
+        'Top' => 'Anfang',
+      },
+    },
+   'MenuButtonReturn' => {
+      PrintConv => {
+        'Previous' => 'Vorherige Anzeige',
+        'Top' => 'Oben',
+      },
+    },
+   'MetadataDate' => 'Datum der Metadaten',
+   'Metering' => {
+      Description => 'Belichtungsmessung',
+      PrintConv => {
+        'Center-weighted' => 'Mittenbetont',
+        'Matrix' => 'Matrixmessung',
+        'Spot' => 'Spotmessung',
+      },
+    },
+   'MeteringMode' => {
+      Description => 'Belichtungsmessmethode',
+      PrintConv => {
+        'Average' => 'Integralmessung',
+        'Center-weighted Average' => 'Mittenbetont',
+        'Center-weighted average' => 'Mittenbetont',
+        'Evaluative' => 'Mehrfeldmessung',
+        'Multi-segment' => 'Multi-Segment',
+        'Multi-spot' => 'MultiSpot',
+        'Other' => 'Andere',
+        'Partial' => 'Teilbild',
+        'Spot' => 'Spotmessung',
+        'Spot+Highlight control' => 'Spot+Helligkeitsbetont',
+        'Spot+Shadow control' => 'Spot+Schattenbetont',
+        'Unknown' => 'Unbekannt',
+      },
+    },
+   'MeteringMode2' => {
+      Description => 'Belichtungs-Messmethode 2',
+      PrintConv => {
+        'Center-weighted average' => 'Mittenbetont',
+        'Multi-segment' => 'Multi-Segment',
+      },
+    },
+   'MeteringMode3' => {
+      Description => 'Belichtungs-Messmethode (3)',
+      PrintConv => {
+        'Multi-segment' => 'Multi-Segment',
+      },
+    },
+   'MeteringTime' => {
+      Description => 'Ausschaltzeit Belichtungsmesser',
+      PrintConv => {
+        'No Limit' => 'Unbegrenzt',
+      },
+    },
+   'MinAperture' => 'Kleinste Blende',
+   'MinFocalLength' => 'Kleinste Brennweite',
+   'MinoltaCameraSettings2' => 'Kameraeinstellungen 2',
+   'MinoltaCameraSettings5D' => 'Kameraeinstellungen (A100)',
+   'MinoltaCameraSettings7D' => 'Kameraeinstellungen (7D)',
+   'MinoltaDate' => 'Minolta-Datum',
+   'MinoltaImageSize' => {
+      Description => 'Minolta-BildgrÃ¶Ãe',
+      PrintConv => {
+        'Full' => 'Volle GrÃ¶Ãe',
+        'Large' => 'GroÃ',
+        'Medium' => 'MittelgroÃ',
+        'Small' => 'Klein',
+      },
+    },
+   'MinoltaMakerNote' => 'Minolta-Herstellerinformationen',
+   'MinoltaModelID' => 'Minolta-Modell',
+   'MinoltaQuality' => {
+      Description => 'Minolta-BildqualitÃ€t',
+      PrintConv => {
+        'Extra Fine' => 'Extra-Fein',
+        'Fine' => 'Fein',
+        'Super Fine' => 'Super-Fein',
+      },
+    },
+   'MinoltaTime' => 'Minolta-Zeit',
+   'MirrorLockup' => {
+      Description => 'Spiegelverriegelung',
+      PrintConv => {
+        'Disable' => 'Ausgeschaltet',
+        'Enable' => 'Eingeschaltet',
+        'Enable: Down with Set' => 'Eingeschaltet: AbwÃ€rts mit SET (Taste)',
+      },
+    },
+   'Model' => 'Kameramodell',
+   'Model2' => 'Kameramodell (2)',
+   'ModelingFlash' => {
+      Description => 'Einstelllicht',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'ModifiedPictureStyle' => {
+      PrintConv => {
+        'Landscape' => 'Landschaft',
+        'Monochrome' => 'Monochrom',
+        'None' => 'Keine',
+        'Portrait' => 'PortrÃ€t',
+      },
+    },
+   'ModifiedSaturation' => {
+      PrintConv => {
+        'Off' => 'Aus',
+      },
+    },
+   'ModifiedSharpnessFreq' => {
+      PrintConv => {
+        'High' => 'Hoch',
+        'Highest' => 'HÃ¶chste',
+        'Low' => 'Leicht',
+        'n/a' => 'Nicht gesetzt',
+      },
+    },
+   'ModifiedToneCurve' => {
+      PrintConv => {
+        'Custom' => 'Benutzerdefiniert',
+        'Manual' => 'Manuell',
+      },
+    },
+   'ModifiedWhiteBalance' => {
+      PrintConv => {
+        'Auto' => 'Automatisch',
+        'Black & White' => 'Schwarz/WeiÃ',
+        'Cloudy' => 'BewÃ¶lkt',
+        'Custom' => 'Benutzerdefiniert',
+        'Custom 1' => 'Benutzerdefiniert 1',
+        'Custom 2' => 'Benutzerdefiniert 2',
+        'Custom 3' => 'Benutzerdefiniert 3',
+        'Custom 4' => 'Benutzerdefiniert 4',
+        'Daylight' => 'Tageslicht',
+        'Daylight Fluorescent' => 'Neonlicht tageslichtweiÃ',
+        'Flash' => 'Blitz',
+        'Fluorescent' => 'Neonlicht',
+        'Manual Temperature (Kelvin)' => 'Manuelle Temperatur (Kelvin)',
+        'Shade' => 'Schatten',
+        'Tungsten' => 'GlÃŒhbirne',
+        'Underwater' => 'Tauchen',
+      },
+    },
+   'ModifyDate' => 'Ãnderungsdatum',
+   'MoireFilter' => {
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'MonitorOffTime' => 'Ausschaltzeit des Monitors',
+   'MonochromeFilterEffect' => {
+      PrintConv => {
+        'Green' => 'GrÃŒn',
+        'None' => 'Keine',
+        'Red' => 'Rot',
+        'Yellow' => 'Gelb',
+      },
+    },
+   'MonochromeLinear' => {
+      PrintConv => {
+        'No' => 'Nein',
+        'Yes' => 'Ja',
+      },
+    },
+   'MonochromeToningEffect' => {
+      PrintConv => {
+        'Blue' => 'Blau',
+        'Green' => 'GrÃŒn',
+        'None' => 'Keine',
+        'Purple' => 'Lila',
+      },
+    },
+   'Month' => 'Monat',
+   'MultiExposure' => 'Mehrfachbelichtungsdaten',
+   'MultiExposureAutoGain' => {
+      Description => 'Mehrfachbelichtung Automatik',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'MultiExposureMode' => {
+      Description => 'Mehrfachbelichtungsmodus',
+      PrintConv => {
+        'Image Overlay' => 'BildÃŒberlagerung',
+        'Multiple Exposure' => 'Mehrfachbelichtung',
+        'Off' => 'Aus',
+      },
+    },
+   'MultiExposureShots' => 'Mehrfachbelichtung Anzahl Aufnahmen',
+   'MultiExposureVersion' => 'Mehrfachbelichtungsdaten-Version',
+   'MultiFrameNoiseReduction' => {
+      Description => 'Ruisond. Multi Frame',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'An',
+      },
+    },
+   'MultiSelector' => {
+      Description => 'MultifunktionswÃ€hler',
+      PrintConv => {
+        'Do Nothing' => 'Ohne Funktion',
+        'Reset Meter-off Delay' => 'Ruhezustand verzÃ¶gern',
+      },
+    },
+   'MultiSelectorPlaybackMode' => {
+      Description => 'Mitteltaste Bei Wiedergabe',
+      PrintConv => {
+        'Choose Folder' => 'Ordner auswÃ€hlen',
+        'Thumbnail On/Off' => 'Bildindex ein/aus',
+        'View Histograms' => 'Histogramme anzeigen',
+        'Zoom On/Off' => 'Ausschnitt ein/aus',
+      },
+    },
+   'MultiSelectorShootMode' => {
+      Description => 'Mitteltaste Bei Aufnahme',
+      PrintConv => {
+        'Highlight Active Focus Point' => 'AF-Messfeld hervorheben',
+        'Not Used' => 'Ohne Funktion',
+        'Select Center Focus Point' => 'Mittleres AF-Messfeld',
+      },
+    },
+   'MultipleExposureSet' => {
+      Description => 'Mehrfachbelichtung',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'Mute' => {
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'MyColorMode' => {
+      PrintConv => {
+        'B&W' => 'Schwarz-WeiÃ',
+        'Custom' => 'Benutzerdefiniert',
+        'Off' => 'Aus',
+      },
+    },
+   'MyColors' => 'My Color-Modus',
+   'NDFilter' => {
+      Description => 'ND-Filter',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'NEFCompression' => {
+      Description => 'RAW-Komprimierung',
+      PrintConv => {
+        'Lossless' => 'Verlustfrei',
+        'Lossy (type 1)' => 'Verlustbehaftet (Type 1)',
+        'Lossy (type 2)' => 'Verlustbehaftet (Type 2)',
+        'Uncompressed' => 'Nicht komprimiert',
+      },
+    },
+   'NewsPhotoVersion' => 'IPTC-Modell-3-Version',
+   'NikonCaptureData' => 'Nikon Capture-Daten',
+   'NikonCaptureOutput' => 'Nikon Capture-Ausgabe',
+   'NikonCaptureVersion' => 'Nikon Capture-Version',
+   'NikonICCProfile' => 'Nikon ICC-Profil-Zeiger',
+   'NikonImageSize' => {
+      Description => 'BildgrÃ¶Ãe',
+      PrintConv => {
+        'Large (10.0 M)' => 'GroÃ (10.0M)',
+        'Medium (5.6 M)' => 'Mittel (5.6M)',
+        'Small (2.5 M)' => 'Klein (2.5M)',
+      },
+    },
+   'NoMemoryCard' => {
+      Description => 'AuslÃ¶sesperre',
+      PrintConv => {
+        'Enable Release' => 'Aus',
+        'Release Locked' => 'Ein',
+      },
+    },
+   'Noise' => 'Bildrauschen',
+   'NoiseFilter' => {
+      Description => 'Rauschfilter',
+      PrintConv => {
+        'High' => 'Hoch',
+        'Low' => 'Leicht',
+        'Off' => 'Aus',
+      },
+    },
+   'NoiseReduction' => {
+      Description => 'Rauschreduktion',
+      PrintConv => {
+        'Auto' => 'Automatisch',
+        'Low' => 'Gering',
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'NominalMaxAperture' => 'Nominaler AVmin',
+   'NominalMinAperture' => 'Nominaler AVmax',
+   'NumAFPoints' => 'Anzahl der AF-Punkte',
+   'ObjectAttributeReference' => 'Gattung',
+   'ObjectCycle' => {
+      Description => 'Objektzyklus',
+      PrintConv => {
+        'Both Morning and Evening' => 'Beides',
+        'Evening' => 'Abends',
+        'Morning' => 'Morgens',
+      },
+    },
+   'ObjectFileType' => {
+      PrintConv => {
+        'Executable file' => 'AusfÃŒhrbare Datei',
+        'None' => 'Keine',
+        'Unknown' => 'Unbekannt',
+      },
+    },
+   'ObjectName' => 'Titel',
+   'ObjectPreviewData' => 'Objektdatenvorschau',
+   'ObjectPreviewFileFormat' => 'Dateiformat der Objektdatenvorschau',
+   'ObjectPreviewFileVersion' => 'Dateiformatversion der Objektdatenvorschau',
+   'ObjectTypeReference' => 'Objekttypreferenz',
+   'OffsetSchema' => 'Offset-Schema',
+   'OldSubfileType' => 'Unterdatei-Typ',
+   'OlympusImageHeight' => 'Olympus-BildhÃ¶he',
+   'OlympusImageWidth' => 'Olympus-Bildbreite',
+   'OneTouchWB' => {
+      Description => 'Sofort-WeiÃabgleich',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'An',
+        'On (Preset)' => 'An (Preset)',
+      },
+    },
+   'OpticalZoom' => 'Optischer Zoom',
+   'OpticalZoomCode' => 'Optischer Zoom-Code',
+   'OpticalZoomOn' => {
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'Opto-ElectricConvFactor' => 'Optoelektronischer Umrechnungsfaktor',
+   'OrderNumber' => 'Auftragsnummer',
+   'Orientation' => {
+      Description => 'Ausrichtung des Bildes',
+      PrintConv => {
+        'Horizontal (normal)' => '0Â° (oben/links)',
+        'Mirror horizontal' => 'Horizontal gespiegelt',
+        'Mirror horizontal and rotate 270 CW' => 'Horizontal gespiegelt und 90Â° gegen den Uhrzeigersinn gedreht',
+        'Mirror horizontal and rotate 90 CW' => 'Horizontal gespiegelt und 90Â° im Uhrzeigersinn gedreht',
+        'Mirror vertical' => 'Vertikal gespiegelt',
+        'Rotate 180' => '180Â° (unten/rechts)',
+        'Rotate 270 CW' => '90Â° im Uhrzeigersinn (links/unten)',
+        'Rotate 90 CW' => '90Â° gegen den Uhrzeigersinn (rechts/oben)',
+      },
+    },
+   'OriginalFileName' => 'Original Dateiname',
+   'OriginalImageHeight' => 'Bildbreite Original',
+   'OriginalImageWidth' => 'Bildbreite Original',
+   'OriginalRawFileData' => 'Original Raw Daten',
+   'OriginalRawFileName' => 'Original Raw Dateiname',
+   'OriginalTransmissionReference' => 'Jobkennung',
+   'OriginatingProgram' => 'Erstellungsprogramm',
+   'OutputImageHeight' => 'Ausgabe-BildhÃ¶he',
+   'OutputImageWidth' => 'Ausgabe-Bildbreite',
+   'OutputResolution' => 'Ausgabe AuflÃ¶sung',
+   'Owner' => 'Besitzer',
+   'OwnerID' => 'Besitzer-ID',
+   'OwnerName' => 'Name des Besitzers',
+   'PEFVersion' => 'PEF-Version',
+   'Padding' => 'Platzhalter',
+   'PageName' => 'Seitenname',
+   'PageNumber' => 'Seitenummer',
+   'Pages' => 'Seiten',
+   'PanasonicTitle' => 'Titel',
+   'PanoramaDirection' => 'Panorama-Richtung',
+   'PanoramaFrameNumber' => 'Panorama-Bild',
+   'PanoramaMode' => 'Panorama Modus',
+   'PentaxImageSize' => {
+      Description => 'Pentax-BildgrÃ¶Ãe',
+      PrintConv => {
+        '2304x1728 or 2592x1944' => '2304 x 1728 oder 2592 x 1944',
+        '2560x1920 or 2304x1728' => '2560 x 1920 oder 2304 x 1728',
+        '2816x2212 or 2816x2112' => '2816 x 2212 oder 2816 x 2112',
+        '3008x2008 or 3040x2024' => '3008 x 2008 oder 3040 x 2024',
+        'Full' => 'Voll',
+      },
+    },
+   'PentaxModelID' => 'Pentax-Modell',
+   'PentaxVersion' => 'Pentax-Version',
+   'PhaseDetectAF' => {
+      Description => 'Auto-Fokus',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On (11-point)' => 'Ein (11-Punkt)',
+        'On (51-point)' => 'Ein (51-Punkt)',
+      },
+    },
+   'PhoneNumber' => 'Telefonnummer',
+   'PhotoEffect' => {
+      Description => 'Foto-Effekt',
+      PrintConv => {
+        'B&W' => 'Schwarz-WeiÃ',
+        'Custom' => 'Benutzerdefiniert',
+        'Off' => 'Aus',
+      },
+    },
+   'PhotoEffects' => {
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'PhotoEffectsData' => 'Bildeffekt-Daten',
+   'PhotoEffectsType' => {
+      Description => 'Bildeffekt-Methode',
+      PrintConv => {
+        'B&W' => 'Schwarz-WeiÃ',
+        'None' => 'Keine',
+        'Tinted' => 'Getont',
+      },
+    },
+   'PhotoInfoPlayback' => {
+      Description => 'Bildinfos & Wiedergabe',
+      PrintConv => {
+        'Info Left-right, Playback Up-down' => 'Info <> / Wiedergabe',
+        'Info Up-down, Playback Left-right' => 'Info / Wiedergabe <>',
+      },
+    },
+   'PhotometricInterpretation' => {
+      Description => 'Pixel-Schema',
+      PrintConv => {
+        'BlackIsZero' => 'Schwarz ist Null',
+        'Color Filter Array' => 'CFA (Farbfiltermatrix)',
+        'Pixar LogL' => 'CIE Log2(L) (Log Luminanz)',
+        'Pixar LogLuv' => 'CIE Log2(L)(u\',v\') (Log Luminanz und Chrominanz)',
+        'Transparency Mask' => 'Transparenzmaske',
+        'WhiteIsZero' => 'WeiÃ ist Null',
+      },
+    },
+   'PhotoshopBGRThumbnail' => 'Photoshop BGR-Vorschaubild',
+   'PhotoshopFormat' => 'Photoshop-Format',
+   'PhotoshopQuality' => 'Photoshop-QualitÃ€t',
+   'PictureControl' => {
+      Description => 'Bildoptimierung',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'PictureControlActive' => {
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'PictureControlAdjust' => {
+      Description => 'Bildoptimierung-Anpassung',
+      PrintConv => {
+        'Default Settings' => 'Standardeinstellungen',
+        'Full Control' => 'Manuelle Einstellung',
+        'Quick Adjust' => 'Schnelleinstellung',
+      },
+    },
+   'PictureControlBase' => 'Bildoptimierung-Basis',
+   'PictureControlName' => 'Bildoptimierung-Name',
+   'PictureControlQuickAdjust' => 'Bildoptimierung-Schnelleinstellung',
+   'PictureControlVersion' => 'Bildoptimierung-Version',
+   'PictureFinish' => {
+      PrintConv => {
+        'Evening Scene' => 'Abendszene',
+        'Monochrome' => 'Monochrom',
+        'Natural' => 'NatÃŒrlich',
+        'Night Portrait' => 'NachtportrÃ€t',
+        'Night Scene' => 'Nachtszene',
+        'Portrait' => 'PortrÃ€t',
+        'Wind Scene' => 'Windszene',
+      },
+    },
+   'PictureMode' => {
+      Description => 'Motivprogramm',
+      PrintConv => {
+        '1/2 EV steps' => '1/2 LW Schritte',
+        '1/3 EV steps' => '1/3 LW Schitte',
+        'Anti-blur' => 'MotivschÃ€rfe-Modus',
+        'Aperture Priority' => 'Zeitautomatik',
+        'Aperture Priority, Off-Auto-Aperture' => 'Zeitautomatik (Blendenring nicht auf A)',
+        'Aperture-priority AE' => 'BlendenprioritÃ€t',
+        'Auto' => 'Automatisch',
+        'Auto PICT (Landscape)' => 'Auto PICT (Landschaft)',
+        'Auto PICT (Macro)' => 'Auto PICT (Makro)',
+        'Auto PICT (Portrait)' => 'Auto PICT (PortrÃ€t)',
+        'Auto PICT (Sport)' => 'Auto PICT (Motiv in Bewegung)',
+        'Auto PICT (Standard)' => 'Auto PICT (Normal)',
+        'Autumn' => 'Herbst',
+        'Beach' => 'Strand',
+        'Beach & Snow' => 'Strand & Schnee',
+        'Black & White' => 'Schwarz/WeiÃ',
+        'Blue' => 'Blau',
+        'Blur Reduction' => 'Digital SR (UnschÃ€rfereduktion)',
+        'Bulb' => 'Bulb-Modus',
+        'Bulb, Off-Auto-Aperture' => 'Bulb (Blendenring nicht auf A)',
+        'Candlelight' => 'Kerzenlicht',
+        'DOF Program' => 'SchÃ€rfentiefe-PrioritÃ€t',
+        'DOF Program (HyP)' => 'SchÃ€rfentiefe-PrioritÃ€t (Hyper-Programm)',
+        'Dark Pet' => 'Haustier (Dunkel)',
+        'Digital Filter' => 'Digitalfilter',
+        'Fireworks' => 'Feuerwerk',
+        'Flash X-Sync Speed AE' => 'Blitz X-synch. Zeit',
+        'Flower' => 'Blumen',
+        'Food' => 'Lebensmittel',
+        'Frame Composite' => 'Rahmen',
+        'Green' => 'GrÃŒn',
+        'Green Mode' => 'GrÃŒner Modus',
+        'Half-length Portrait' => 'Brustbild',
+        'Hi-speed Program' => 'HS-PrioritÃ€t',
+        'Hi-speed Program (HyP)' => 'HS-PrioritÃ€t (Hyper-Programm)',
+        'Illustrations' => 'Dokument',
+        'Kids' => 'Kinder',
+        'Landscape' => 'Landschaft',
+        'Light Pet' => 'Haustier (Hell)',
+        'MTF Program' => 'MTF-PrioritÃ€t',
+        'MTF Program (HyP)' => 'MTF-PrioritÃ€t (Hyper-Programm)',
+        'Macro' => 'Makro',
+        'Manual' => 'Manuell',
+        'Manual, Off-Auto-Aperture' => 'Manuell (Blendenring nicht auf A)',
+        'Medium Pet' => 'Haustier (Neutrale Helligkeit)',
+        'Natural' => 'Natur',
+        'Natural Light' => 'Umgebungslicht',
+        'Natural Light & Flash' => 'Umgebungslicht & Blitz',
+        'Natural Skin Tone' => 'Nat. Hautton',
+        'Night Scene' => 'Nachtszene',
+        'Night Scene Portrait' => 'Nacht-PortrÃ€t',
+        'No Flash' => 'Kein Blitz',
+        'Pet' => 'Haustier',
+        'Pink' => 'Rosa',
+        'Portrait' => 'PortrÃ€t',
+        'Program' => 'Programm',
+        'Program (HyP)' => 'Programmautomatik (Hyper-Programm)',
+        'Program AE' => 'Programmautomatik',
+        'Program Av Shift' => 'Av Shift-Belichtungsprogramm',
+        'Program Tv Shift' => 'Tv Shift-Belichtungsprogramm',
+        'Purple' => 'Violett',
+        'Red' => 'Rot',
+        'Self Portrait' => 'SelbstportrÃ€t',
+        'Sensitivity Priority AE' => 'Blenden- & Zeitautomatik (Sv, ISO-Vorgabe)',
+        'Shutter & Aperture Priority AE' => 'Empfindlichkeitsautomatik (TAv, Zeit-/Blendenvorgabe)',
+        'Shutter Speed Priority' => 'VerschlussprioritÃ€t',
+        'Shutter speed priority AE' => 'VerschlussprioritÃ€t',
+        'Snow' => 'Schnee',
+        'Soft' => 'Soft (Weichzeichnung)',
+        'Sports' => 'Sport',
+        'Sunset' => 'Sonnenuntergang',
+        'Surf & Snow' => 'Surf + Schnee',
+        'Synchro Sound Record' => 'Synchr. Sprachnotiz',
+        'Underwater' => 'Tauchen',
+        'Yellow' => 'Gelb',
+      },
+    },
+   'PictureMode2' => {
+      Description => 'Motivprogramm 2',
+      PrintConv => {
+        'Aperture Priority' => 'BlendenprioritÃ€t',
+        'Aperture Priority, Off-Auto-Aperture' => 'Zeitautomatik (Blendenring nicht auf A)',
+        'Bulb' => 'Bulb-Modus',
+        'Bulb, Off-Auto-Aperture' => 'Bulb (Blendenring nicht auf A)',
+        'Flash X-Sync Speed AE' => 'Blitz X-synch. Zeit',
+        'Green Mode' => '"GrÃŒnes" AE-Programm',
+        'Manual' => 'Manuell',
+        'Manual, Off-Auto-Aperture' => 'Manuell (Blendenring nicht auf A)',
+        'Program AE' => 'Programmautomatik',
+        'Program Av Shift' => 'Av Shift-Belichtungsprogramm',
+        'Program Tv Shift' => 'Tv Shift-Belichtungsprogramm',
+        'Scene Mode' => 'Motivprogramm',
+        'Sensitivity Priority AE' => 'Blenden- & Zeitautomatik (Sv, ISO-Vorgabe)',
+        'Shutter & Aperture Priority AE' => 'Empfindlichkeitsautomatik (TAv, Zeit-/Blendenvorgabe)',
+        'Shutter Speed Priority' => 'VerschlussprioritÃ€t',
+      },
+    },
+   'PictureModeBWFilter' => {
+      PrintConv => {
+        'Green' => 'GrÃŒn',
+        'Red' => 'Rot',
+        'Yellow' => 'Gelb',
+        'n/a' => 'Nicht gesetzt',
+      },
+    },
+   'PictureModeTone' => {
+      PrintConv => {
+        'Blue' => 'Blau',
+        'Green' => 'GrÃŒn',
+        'Purple' => 'Lila',
+        'n/a' => 'Nicht gesetzt',
+      },
+    },
+   'PictureStyle' => {
+      PrintConv => {
+        'Faithful' => 'NatÃŒrlich',
+        'High Saturation' => 'Hohe FarbsÃ€ttigung',
+        'Landscape' => 'Landschaft',
+        'Low Saturation' => 'Geringe FarbsÃ€ttigung',
+        'Monochrome' => 'Monochrom',
+        'None' => 'Keine',
+        'Portrait' => 'PortrÃ€t',
+      },
+    },
+   'PixelFormat' => {
+      Description => 'Pixel-Format',
+      PrintConv => {
+        'Black & White' => 'Schwarz/WeiÃ',
+      },
+    },
+   'PixelUnits' => {
+      PrintConv => {
+        'Unknown' => 'Unbekannt',
+      },
+    },
+   'PlanarConfiguration' => {
+      Description => 'Bilddatenausrichtung',
+      PrintConv => {
+        'Chunky' => 'Kompaktformat',
+        'Planar' => 'Ebenes Format',
+      },
+    },
+   'PostalCode' => 'Postleitzahl',
+   'PowerSource' => {
+      Description => 'Stromquelle',
+      PrintConv => {
+        'Body Battery' => 'Batterie im GehÃ€use',
+        'External Power Supply' => 'Externe Stromversorgung',
+        'Grip Battery' => 'Batterie im Griff',
+      },
+    },
+   'Predictor' => {
+      Description => 'PrÃ€diktor',
+      PrintConv => {
+        'Horizontal differencing' => 'Horizontale Differenzierung',
+        'None' => 'Kein PrÃ€diktor-Schema in Benutzung',
+      },
+    },
+   'PresetWhiteBalance' => {
+      Description => 'WeiÃabgleich Voreinstellung',
+      PrintConv => {
+        'Cloudy' => 'BewÃ¶lkt',
+        'Daylight' => 'Tageslicht',
+        'Flash' => 'Blitz',
+        'Fluorescent' => 'Neonlicht',
+        'Shade' => 'Schatten',
+        'Tungsten' => 'GlÃŒhbirne',
+      },
+    },
+   'Preview0' => 'Vorschau 0',
+   'Preview1' => 'Vorschau 1',
+   'Preview2' => 'Vorschau 2',
+   'PreviewColorSpace' => {
+      PrintConv => {
+        'Unknown' => 'Unbekannt',
+      },
+    },
+   'PreviewHeight' => 'Vorschaubild-HÃ¶he',
+   'PreviewIFD' => 'Preview-IFD-Zeiger',
+   'PreviewImage' => 'Vorschaubild',
+   'PreviewImageBorders' => 'Vorschaubild-RÃ€nder',
+   'PreviewImageData' => 'Vorschaubild-Daten',
+   'PreviewImageHeight' => 'Vorschaubild-HÃ¶he',
+   'PreviewImageLength' => 'Vorschaubild-DatenlÃ€nge',
+   'PreviewImageName' => 'Vorschaubild-Name',
+   'PreviewImageSize' => 'Vorschaubild-GrÃ¶Ãe',
+   'PreviewImageStart' => 'Vorschaubild-Datenposition',
+   'PreviewImageType' => 'Vorschaubild-Typ',
+   'PreviewImageValid' => {
+      Description => 'Vorschaubild gÃŒltig',
+      PrintConv => {
+        'No' => 'Nein',
+        'Yes' => 'Ja',
+      },
+    },
+   'PreviewImageWidth' => 'Vorschaubild-Breite',
+   'PreviewQuality' => {
+      Description => 'Vorschaubild-QualitÃ€t',
+      PrintConv => {
+        'Fine' => 'Fein',
+        'Superfine' => 'Superfein',
+      },
+    },
+   'PreviewWidth' => 'Vorschaubild-Breite',
+   'PrimaryAFPoint' => {
+      Description => 'PrimÃ€rer AF-Punkt',
+      PrintConv => {
+        '(none)' => '(keiner)',
+        'Bottom' => 'Unten',
+        'C6 (Center)' => 'C6 (Mitte)',
+        'Center' => 'Mitte',
+        'Far Left' => 'Ganz links',
+        'Far Right' => 'Ganz rechts',
+        'Lower-left' => 'Unten-Links',
+        'Lower-right' => 'Unten-Rechts',
+        'Mid-left' => 'Links-Mitte',
+        'Mid-right' => 'Rechts-Mitte',
+        'Top' => 'Oben',
+        'Upper-left' => 'Oben-Links',
+        'Upper-right' => 'Oben-Rechts',
+      },
+    },
+   'PrimaryChromaticities' => 'ChromatizitÃ€t der PrimÃ€rfarben',
+   'PrimaryPlatform' => 'Hauptplattform',
+   'ProcessingInfo' => 'Verarbeitungsinformationen',
+   'ProcessingSoftware' => 'Verarbeitungssoftware',
+   'ProductID' => 'Produkt-ID',
+   'ProductionCode' => 'Herstellungskennzeichen',
+   'ProfileCMMType' => 'Profil CMM-Typ',
+   'ProfileClass' => {
+      Description => 'Profil-Klasse',
+      PrintConv => {
+        'Abstract Profile' => 'Abstract-Profil',
+        'ColorSpace Conversion Profile' => 'Farbraum-Konvertierungsprofile',
+        'DeviceLink Profile' => 'DeviceLink-Profil',
+        'Display Device Profile' => 'Bildschirm-GerÃ€teprofil',
+        'Input Device Profile' => 'Eingabe-GerÃ€teprofil',
+        'NamedColor Profile' => 'Named Color-Profil',
+        'Nikon Input Device Profile (NON-STANDARD!)' => 'Nikon-Profil ("nkpf")',
+        'Output Device Profile' => 'Ausgabe-GerÃ€teprofil',
+      },
+    },
+   'ProfileConnectionSpace' => 'Profil-Verbindungsfarbraum',
+   'ProfileCopyright' => 'Urheberrechtsvermerk',
+   'ProfileCreator' => 'Profil-Ersteller',
+   'ProfileDateTime' => 'Profil-Erstellungszeit',
+   'ProfileDescription' => 'Profil-Beschreibung',
+   'ProfileDescriptionML' => 'Profil-Beschreibung ML',
+   'ProfileFileSignature' => 'Profil-Datei-Signatur',
+   'ProfileID' => 'Profile-ID',
+   'ProfileSequenceDesc' => 'Profilsequenz-Beschreibung',
+   'ProfileVersion' => 'Profil-Version',
+   'ProgramLine' => {
+      Description => 'Belichtungsprogrammtyp',
+      PrintConv => {
+        'Depth' => 'SchÃ€rfentiefe-PrioritÃ€t',
+        'Hi Speed' => 'HS-PrioritÃ€t',
+        'MTF' => 'MTF-PrioritÃ€t',
+      },
+    },
+   'ProgramMode' => {
+      PrintConv => {
+        'Night Portrait' => 'NachtportrÃ€t',
+        'None' => 'Keine',
+        'Portrait' => 'PortrÃ€t',
+        'Sports' => 'Sport',
+        'Sunset' => 'Sonnenuntergang',
+      },
+    },
+   'ProgramShift' => 'Programmverschiebung',
+   'ProgramVersion' => 'Programmversion',
+   'Protect' => 'Schutz',
+   'Province-State' => 'Bundesland/Kanton',
+   'Publisher' => 'Herausgeber',
+   'Quality' => {
+      Description => 'BildqualitÃ€t',
+      PrintConv => {
+        'Best' => 'Optimal',
+        'Better' => 'Besser',
+        'Compressed RAW' => 'Komprimiertes RAW',
+        'Compressed RAW + JPEG' => 'Komprimiertes RAW + JPEG',
+        'Extra Fine' => 'Extra-Fein',
+        'Fine' => 'Fein',
+        'Good' => 'Gut',
+        'High' => 'Hoch',
+        'Low' => 'Leicht',
+        'Normal' => 'StandardqualitÃ€t',
+        'RAW + JPEG' => 'RAW+JPEG',
+        'Super Fine' => 'Super-Fein',
+        'Superfine' => 'Superfein',
+      },
+    },
+   'QualityMode' => {
+      PrintConv => {
+        'Fine' => 'Fein',
+      },
+    },
+   'QuickControlDialInMeter' => {
+      Description => 'Schnelleinstellrad bei Messung',
+      PrintConv => {
+        'AF point selection' => 'Auswahl des AF-Messfelds',
+        'Exposure comp/Aperture' => 'Belichtungskorrektur/Blende',
+        'ISO speed' => 'ISO-Empfindlichkeit',
+      },
+    },
+   'QuickShot' => {
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'RAFVersion' => 'RAF-Version',
+   'RasterizedCaption' => 'Rasterbeschreibung',
+   'Rating' => 'Bewertung',
+   'RatingPercent' => 'Bewertung in Prozent',
+   'RawAndJpgRecording' => {
+      Description => 'Dateiformat und JPEG-QualitÃ€t',
+      PrintConv => {
+        'JPEG (Best)' => 'JPEG (Optimal)',
+        'JPEG (Better)' => 'JPEG (Besser)',
+        'JPEG (Good)' => 'JPEG (Gut)',
+        'RAW (DNG, Best)' => 'RAW (DNG, Optimal)',
+        'RAW (DNG, Better)' => 'RAW (DNG, Besser)',
+        'RAW (DNG, Good)' => 'RAW (DNG, Gut)',
+        'RAW (PEF, Best)' => 'RAW (PEF, Optimal)',
+        'RAW (PEF, Better)' => 'RAW (PEF, Besser)',
+        'RAW (PEF, Good)' => 'RAW (PEF, Gut)',
+        'RAW+JPEG (DNG, Best)' => 'RAW+JPEG (DNG, Optimal)',
+        'RAW+JPEG (DNG, Better)' => 'RAW+JPEG (DNG, Besser)',
+        'RAW+JPEG (DNG, Good)' => 'RAW+JPEG (DNG, Gut)',
+        'RAW+JPEG (PEF, Best)' => 'RAW+JPEG (PEF, Optimal)',
+        'RAW+JPEG (PEF, Better)' => 'RAW+JPEG (PEF, Besser)',
+        'RAW+JPEG (PEF, Good)' => 'RAW+JPEG (PEF, Gut)',
+        'RAW+Large/Fine' => 'RAW+GroÃ/Fein',
+        'RAW+Large/Normal' => 'RAW+GroÃ/Normal',
+        'RAW+Medium/Fine' => 'RAW+Mittel/Fein',
+        'RAW+Medium/Normal' => 'RAW+Mittel/Normal',
+        'RAW+Small/Fine' => 'RAW+Klein/Fein',
+        'RAW+Small/Normal' => 'RAW+Klein/Normal',
+      },
+    },
+   'RawColorAdj' => {
+      PrintConv => {
+        'Custom' => 'Benutzerdefiniert',
+      },
+    },
+   'RawDataLength' => 'RAW DatenlÃ€nge',
+   'RawDataOffset' => 'RAW-Daten-Offset',
+   'RawDevAutoGradation' => {
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'RawDevPMPictureTone' => {
+      PrintConv => {
+        'Blue' => 'Blau',
+        'Green' => 'GrÃŒn',
+        'Purple' => 'Lila',
+      },
+    },
+   'RawDevPM_BWFilter' => {
+      PrintConv => {
+        'Green' => 'GrÃŒn',
+        'Red' => 'Rot',
+        'Yellow' => 'Gelb',
+      },
+    },
+   'RawDevPictureMode' => {
+      PrintConv => {
+        'Natural' => 'NatÃŒrlich',
+      },
+    },
+   'RawDevWhiteBalance' => {
+      PrintConv => {
+        'Color Temperature' => 'Farbtemperatur',
+      },
+    },
+   'RawImageCenter' => 'RAW-Bildmitte',
+   'RawImageSize' => 'RAW-BildgrÃ¶Ãe',
+   'RawJpgQuality' => {
+      Description => 'RAW JPEG-QualitÃ€t',
+      PrintConv => {
+        'Fine' => 'Fein',
+        'Superfine' => 'Superfein',
+      },
+    },
+   'RawJpgSize' => {
+      Description => 'RAW JPEG-GrÃ¶Ãe',
+      PrintConv => {
+        'Large' => 'GroÃ',
+        'Medium' => 'MittelgroÃ',
+        'Medium 1' => 'MittelgroÃ 1',
+        'Medium 2' => 'MittelgroÃ 2',
+        'Medium 3' => 'MittelgroÃ 3',
+        'Medium Movie' => 'MittelgroÃer Film',
+        'Postcard' => 'Postkarte',
+        'Small' => 'Klein',
+        'Small Movie' => 'Kleiner Film',
+        'Widescreen' => 'Breitbild',
+      },
+    },
+   'RawMeasuredRGGB' => 'Raw Messung RGGB',
+   'RecordMode' => {
+      Description => 'Aufzeichnungsmodus',
+      PrintConv => {
+        'Aperture Priority' => 'BlendenprioritÃ€t',
+        'Manual' => 'Manuell',
+        'Shutter Priority' => 'VerschlussprioritÃ€t',
+      },
+    },
+   'RecordingMode' => {
+      PrintConv => {
+        'Auto' => 'Automatisch',
+        'Landscape' => 'Landschaft',
+        'Manual' => 'Manuell',
+        'Night Scene' => 'Nachtszene',
+        'Portrait' => 'PortrÃ€t',
+      },
+    },
+   'RedBalance' => 'Farbabgleich Rot',
+   'RedEyeCorrection' => {
+      PrintConv => {
+        'Automatic' => 'Automatisch',
+        'Off' => 'Aus',
+      },
+    },
+   'RedEyeReduction' => {
+      Description => 'Rote Augen Reduzierung',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'RedMatrixColumn' => 'Rot-Matrixspalte',
+   'RedTRC' => 'Rot-Tonwertwiedergabe-Kurve',
+   'ReductionMatrix1' => 'Reduktionsmatrix 1',
+   'ReductionMatrix2' => 'Reduktionsmatrix 2',
+   'ReferenceBlackWhite' => 'Schwarz/WeiÃ-Referenzpunkte',
+   'ReferenceDate' => 'Referenzdatum',
+   'ReferenceNumber' => 'Referenznummer',
+   'ReferenceService' => 'Referenzdienst',
+   'References' => 'Verweise',
+   'RelatedImageFileFormat' => 'Dateiformat der Bilddaten',
+   'RelatedImageHeight' => 'BildhÃ¶he',
+   'RelatedImageWidth' => 'Bildbreite',
+   'RelatedSoundFile' => 'ZugehÃ¶rige Audio-Datei',
+   'ReleaseButtonToUseDial' => {
+      Description => 'Tastenverhalten',
+      PrintConv => {
+        'No' => 'GedrÃŒckt halten',
+        'Yes' => 'Ein & aus',
+      },
+    },
+   'ReleaseDate' => 'VerÃ¶ffentlichungsdatum',
+   'ReleaseMode' => 'AuslÃ¶semodus',
+   'ReleaseTime' => 'VerÃ¶ffentlichungszeit',
+   'RemoteOnDuration' => 'FernauslÃ¶ser',
+   'RenderingIntent' => {
+      Description => 'Umrechnungsmethode',
+      PrintConv => {
+        'ICC-Absolute Colorimetric' => 'Absolut farbmetrisch',
+        'Media-Relative Colorimetric' => 'Relativ farbmetrisch',
+        'Perceptual' => 'Wahrnehmungsorientiert (perzeptiv, fotografisch)',
+        'Saturation' => 'SÃ€ttigungserhaltend',
+      },
+    },
+   'RepeatingFlashCount' => 'Stroboskopblitz Anzahl',
+   'RepeatingFlashOutput' => 'Stroboskopblitz Leistung',
+   'RepeatingFlashRate' => 'Stroboskopblitz Freq.',
+   'ResampleParamsQuality' => {
+      PrintConv => {
+        'High' => 'Hoch',
+        'Low' => 'Leicht',
+      },
+    },
+   'Resaved' => {
+      PrintConv => {
+        'No' => 'Nein',
+        'Yes' => 'Ja',
+      },
+    },
+   'Resolution' => 'BildauflÃ¶sung',
+   'ResolutionUnit' => {
+      Description => 'Einheit der X- und Y-AuflÃ¶sung',
+      PrintConv => {
+        'None' => 'Keine',
+        'cm' => 'Pixel/cm',
+        'inches' => 'Inch',
+      },
+    },
+   'RetouchHistory' => {
+      Description => 'Bildbearbeitungsschritte',
+      PrintConv => {
+        'B & W' => 'SchwarzweiÃ',
+        'Color Custom' => 'Farbabgleich',
+        'Cyanotype' => 'Blauton',
+        'Image Overlay' => 'Bildmontage',
+        'None' => 'Keine',
+        'Red Eye' => 'Rote-Augen-Korrektur',
+        'Sky Light' => 'Skylight',
+        'Small Picture' => 'Kompaktbild',
+        'Trim' => 'Beschneiden',
+        'Warm Tone' => 'Warmer Farbton',
+      },
+    },
+   'ReverseIndicators' => 'Skalen spiegeln',
+   'RicohDate' => 'Ricoh Datum',
+   'RicohImageHeight' => 'Ricoh-BildhÃ¶he',
+   'RicohImageWidth' => 'Ricoh-Bildbreite',
+   'Rights' => 'Rechte',
+   'Rotation' => {
+      Description => 'Ausrichtung',
+      PrintConv => {
+        'Horizontal' => '0Â° (oben/links)',
+        'Horizontal (Normal)' => '0Â° (oben/links)',
+        'Horizontal (normal)' => '0Â° (oben/links)',
+        'Rotate 180' => '180Â° (unten/rechts)',
+        'Rotate 270 CW' => '90Â° im Uhrzeigersinn (links/unten)',
+        'Rotate 90 CW' => '90Â° gegen den Uhrzeigersinn (rechts/oben)',
+        'Rotated 180' => '180Â° (unten/rechts)',
+        'Rotated 270 CW' => '90Â° im Uhrzeigersinn (links/unten)',
+        'Rotated 90 CW' => '90Â° gegen den Uhrzeigersinn (rechts/oben)',
+      },
+    },
+   'RowsPerStrip' => 'Anzahl der Bild-Zeilen',
+   'SPIFFVersion' => 'SPIFF-Version',
+   'SRAWQuality' => {
+      PrintConv => {
+        'n/a' => 'Nicht gesetzt',
+      },
+    },
+   'SRActive' => {
+      Description => 'Bildstabilisator',
+      PrintConv => {
+        'No' => 'Deaktiviert',
+        'Yes' => 'Aktiviert',
+      },
+    },
+   'SRFocalLength' => 'SR Brennweite',
+   'SRHalfPressTime' => 'AuslÃ¶severzÃ¶gerung',
+   'SRResult' => {
+      Description => 'Bildstabilisator',
+      PrintConv => {
+        'Not stabilized' => 'Nicht stabilisiert',
+      },
+    },
+   'SVGVersion' => 'SVG-Version',
+   'SafetyShift' => {
+      PrintConv => {
+        'Disable' => 'Nicht mÃ¶glich',
+        'Enable (ISO speed)' => 'MÃ¶glich (ISO Empfindlichkeit)',
+        'Enable (Tv/Av)' => 'MÃ¶glich (Tv/Av)',
+      },
+    },
+   'SafetyShiftInAvOrTv' => {
+      Description => 'Safety Shift in AV oder TV',
+      PrintConv => {
+        'Disable' => 'Nicht mÃ¶glich',
+        'Enable' => 'MÃ¶glich',
+      },
+    },
+   'SampleFormat' => {
+      PrintConv => {
+        'Complex int' => 'Komplexer Integer',
+        'Float' => 'FlieÃkommawert',
+        'Signed' => 'Vorzeichenbehafteter Integer',
+        'Undefined' => 'Nicht definiert',
+        'Unsigned' => 'Vorzeichenloser Integer',
+      },
+    },
+   'SamplesPerPixel' => 'Anzahl der Komponenten',
+   'Saturation' => {
+      Description => 'FarbsÃ€ttigung',
+      PrintConv => {
+        'Film Simulation' => 'Film-Simulation',
+        'High' => 'Hohe FarbsÃ€ttigung',
+        'Low' => 'Geringe FarbsÃ€ttigung',
+        'Med High' => 'Leicht erhÃ¶ht',
+        'Med Low' => 'Leicht verringert',
+        'Medium High' => 'Mittel-Hoch',
+        'Medium Low' => 'Mittel-Gering',
+        'None' => 'Nicht gesetzt',
+        'None (B&W)' => 'Keine (S&W)',
+        'Normal' => 'Standard',
+        'Very High' => 'Sehr hoch',
+        'Very Low' => 'Sehr gering',
+      },
+    },
+   'SaturationInfo' => 'FarbsÃ€ttigung',
+   'SaturationSetting' => 'SÃ€ttigungseinstellung',
+   'ScaleFactor35efl' => 'Formatfaktor zu 35 mm',
+   'ScanImageEnhancer' => {
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'Scene' => 'Szene',
+   'SceneAssist' => 'Szenen-Assistent',
+   'SceneCaptureType' => {
+      Description => 'Szenenaufnahmetyp',
+      PrintConv => {
+        'Landscape' => 'Landschaft',
+        'Night' => 'Nachtszene',
+        'Portrait' => 'PortrÃ€t',
+      },
+    },
+   'SceneMode' => {
+      Description => 'Szenen-Modus',
+      PrintConv => {
+        '3D Sweep Panorama' => '3D',
+        'Anti Motion Blur' => 'Anti-bewegingswaas',
+        'Aperture Priority' => 'BlendenprioritÃ€t',
+        'Auto' => 'Automatisch',
+        'Available Light' => 'VerfÃŒgbares Licht',
+        'Beach' => 'Strand',
+        'Beach & Snow' => 'Strand & Schnee',
+        'Behind Glass' => 'Hinterglas',
+        'Candle' => 'Kerzenlicht',
+        'Candlelight' => 'Kerzenlicht',
+        'Children' => 'Kinder',
+        'Cont. Priority AE' => 'Continuvoork. AE',
+        'Documents' => 'Dokumente',
+        'Fireworks' => 'Feuerwerk',
+        'Handheld Night Shot' => 'Nachtopname uit hand',
+        'Indoor' => 'Innenaufnahme',
+        'Landscape' => 'Landschaft',
+        'Landscape+Portrait' => 'Landschaft+PortrÃ€t',
+        'Macro' => 'Makro',
+        'Manual' => 'Manuell',
+        'My Mode' => 'Benutzerdefiniert',
+        'Night Portrait' => 'NachtportrÃ€t',
+        'Night Scene' => 'Nachtszene',
+        'Night View/Portrait' => 'Abendszene/NachtportrÃ€t',
+        'Night+Portrait' => 'Nacht+PortrÃ€t',
+        'Off' => 'Aus',
+        'Portrait' => 'PortrÃ€t',
+        'Program' => 'Programm',
+        'Self Portrait' => 'SelbstportrÃ€t',
+        'Self Portrait+Self Timer' => 'SelbstportrÃ€t+SelbstauslÃ¶ser',
+        'Shutter Priority' => 'VerschlussprioritÃ€t',
+        'Snow' => 'Schnee',
+        'Sports' => 'Sport',
+        'Spot' => 'Spotmessung',
+        'Standard' => '',
+        'Sunset' => 'Sonnenuntergang',
+        'Super Macro' => 'Super-Makro',
+        'Sweep Panorama' => 'Panorama d. beweg.',
+        'Underwater' => 'Tauchen',
+      },
+    },
+   'SceneModeUsed' => {
+      Description => 'Szenen-Modus',
+      PrintConv => {
+        'Aperture Priority' => 'BlendenprioritÃ€t',
+        'Beach' => 'Strand',
+        'Candlelight' => 'Kerzenlicht',
+        'Fireworks' => 'Feuerwerk',
+        'Landscape' => 'Landschaft',
+        'Macro' => 'Makro',
+        'Manual' => 'Manuell',
+        'Night Portrait' => 'NachtportrÃ€t',
+        'Portrait' => 'PortrÃ€t',
+        'Program' => 'Programm',
+        'Shutter Priority' => 'VerschlussprioritÃ€t',
+        'Snow' => 'Schnee',
+        'Sunset' => 'Sonnenuntergang',
+      },
+    },
+   'SceneSelect' => {
+      PrintConv => {
+        'Night' => 'Nachtszene',
+        'Off' => 'Aus',
+      },
+    },
+   'SceneType' => {
+      Description => 'Szenentyp',
+      PrintConv => {
+        'Directly photographed' => 'Direkt aufgenommenes Bild',
+      },
+    },
+   'SecurityClassification' => {
+      Description => 'Sicherheitsklassifizierung',
+      PrintConv => {
+        'Confidential' => 'Vertraulich',
+        'Restricted' => 'EingeschrÃ€nkt',
+        'Secret' => 'Geheim',
+        'Top Secret' => 'Streng geheim',
+        'Unclassified' => 'Nicht klassifiziert',
+      },
+    },
+   'SelectableAFPoint' => {
+      Description => 'WÃ€hlbares AF-Feld',
+      PrintConv => {
+        '11 points' => '11 Felder',
+        '19 points' => '19 Felder',
+        '45 points' => '45 Felder',
+        'Inner 9 points' => 'Innere 9 Felder',
+        'Outer 9 points' => 'ÃuÃere 9 Felder',
+      },
+    },
+   'SelfTimer' => {
+      Description => 'SelbstauslÃ¶ser',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'SelfTimer2' => 'SelbstauslÃ¶ser (2)',
+   'SelfTimerMode' => 'SelbstauslÃ¶sermodus',
+   'SelfTimerTime' => 'SelbstauslÃ¶ser-Vorlaufzeit',
+   'SensingMethod' => {
+      Description => 'Messmethode',
+      PrintConv => {
+        'Color sequential area' => 'Color-Sequential-Area-Sensor',
+        'Color sequential linear' => 'Color-Sequential-Linear-Sensor',
+        'Monochrome area' => 'Monochrom-Sensor',
+        'Monochrome linear' => 'Monochrom-linearer Sensor',
+        'Not defined' => 'Nicht definiert',
+        'One-chip color area' => 'Ein-Chip-Farbsensor',
+        'Three-chip color area' => 'Drei-Chip-Farbsensor',
+        'Trilinear' => 'Trilinearer Sensor',
+        'Two-chip color area' => 'Zwei-Chip-Farbsensor',
+      },
+    },
+   'SensitivityAdjust' => 'ISO-Empfindlichkeitsanpassung',
+   'SensitivitySteps' => {
+      Description => 'Empfindlichkeits-Schritte',
+      PrintConv => {
+        '1 EV Steps' => '1 LW-Schritte',
+        'As EV Steps' => 'Wie LW-Schritte',
+      },
+    },
+   'SensorBlueLevel' => 'Sensor Blau-Level',
+   'SensorBottomBorder' => 'Sensor unterer Rand',
+   'SensorCleaning' => {
+      PrintConv => {
+        'Disable' => 'Nicht mÃ¶glich',
+        'Enable' => 'MÃ¶glich',
+      },
+    },
+   'SensorHeight' => 'Sensor HÃ¶he',
+   'SensorImageHeight' => 'Sensor-BildhÃ¶he',
+   'SensorImageWidth' => 'Sensor-Bildbreite',
+   'SensorLeftBorder' => 'Sensor linker Rand',
+   'SensorPixelSize' => 'Sensor-PixelgrÃ¶Ãe',
+   'SensorRedLevel' => 'Sensor Rot-Level',
+   'SensorRightBorder' => 'Sensor rechter Rand',
+   'SensorSize' => 'SensorgrÃ¶Ãe',
+   'SensorTemperature' => 'Sensor Temperatur',
+   'SensorTopBorder' => 'Sensor oberer Rand',
+   'SensorWidth' => 'Sensor Breite',
+   'SequenceNumber' => 'Bildsequenznummer',
+   'SequentialShot' => {
+      PrintConv => {
+        'None' => 'Keine',
+      },
+    },
+   'SerialNumber' => 'Seriennummer',
+   'SerialNumberFormat' => 'Seriennummer-Format',
+   'ServiceIdentifier' => 'Service-ID',
+   'SetButtonCrossKeysFunc' => {
+      Description => 'SET Taste/Kreuztaste Funkt.',
+      PrintConv => {
+        'Cross keys: AF point select' => 'Kreuztaste:AF Feld Auswahl',
+        'Set: Flash Exposure Comp' => 'SET:Blitzbe. Korr.',
+        'Set: Parameter' => 'SET:Parameter Ã€ndern',
+        'Set: Picture Style' => 'SET:Bildstil',
+        'Set: Playback' => 'SET:Wiedergabe',
+        'Set: Quality' => 'SET:QualitÃ€t',
+      },
+    },
+   'SetButtonFunction' => 'Funktion SET-Taste b. Aufnahme',
+   'SetButtonWhenShooting' => {
+      Description => 'SET-Taste bei Aufnahme',
+      PrintConv => {
+        'Change parameters' => 'Parameter Ã€ndern',
+        'Default (no function)' => 'Normal (gesperrt)',
+        'Disabled' => 'Gesperrt',
+        'Flash exposure compensation' => 'Blitzbelichtungskorrektur',
+        'ISO speed' => 'ISO-Empfindlichkeit',
+        'Image playback' => 'Bildwiedergabe',
+        'Image quality' => 'QualitÃ€t Ã€ndern',
+        'Image size' => 'BildgrÃ¶Ãe',
+        'LCD monitor On/Off' => 'LCD-Monitor Ein/Aus',
+        'Menu display' => 'MenÃŒanzeige',
+        'Normal (disabled)' => 'Normal (gesperrt)',
+        'Picture style' => 'Bildstil',
+        'Quick control screen' => 'Schnelleinstell.bildschirm',
+        'Record func. + media/folder' => 'Aufnahme-Funktion + Medium/Ordner',
+        'Record movie (Live View)' => 'Movie-Aufnahme (Livebild)',
+        'White balance' => 'WeiÃabgleich',
+      },
+    },
+   'SetFunctionWhenShooting' => {
+      Description => 'SET-Taste bei Aufnahme',
+      PrintConv => {
+        'Change Parameters' => 'Parameter Ã€ndern',
+        'Change Picture Style' => 'Bildstil',
+        'Change quality' => 'QualitÃ€t Ã€ndern',
+        'Default (no function)' => 'Normal (gesperrt)',
+        'Image replay' => 'Bildwiedergabe',
+        'Menu display' => 'MenÃŒanzeige',
+      },
+    },
+   'ShadingCompensation' => {
+      Description => 'Schattenaufhellung',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'ShadingCompensation2' => {
+      Description => 'Schattenaufhellung 2',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'Shadows' => 'Schatten',
+   'ShakeReduction' => {
+      Description => 'Bildstabilisator (Einstellung)',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'ShakeReductionInfo' => 'Bildstabilisator',
+   'Sharpness' => {
+      Description => 'SchÃ€rfe',
+      PrintConv => {
+        'Film Simulation' => 'Film-Simulation',
+        'Hard' => 'Stark',
+        'Hard2' => 'Hart2',
+        'Med Hard' => 'Leicht erhÃ¶ht',
+        'Med Soft' => 'Leicht verringert',
+        'Medium Hard' => 'Mittel-Hart',
+        'Medium Soft' => 'Mittel-Weich',
+        'Normal' => 'Standard',
+        'Sharp' => 'Weich',
+        'Soft' => 'Leicht',
+        'Soft2' => 'Weich 2',
+        'Very Hard' => 'Sehr hoch',
+        'Very Soft' => 'Sehr weich',
+        'n/a' => 'Nicht gesetzt',
+      },
+    },
+   'SharpnessFrequency' => {
+      PrintConv => {
+        'High' => 'Hoch',
+        'Highest' => 'HÃ¶chste',
+        'Low' => 'Leicht',
+        'n/a' => 'Nicht gesetzt',
+      },
+    },
+   'SharpnessSetting' => 'SchÃ€rfeeinstellung',
+   'ShootingInfoDisplay' => {
+      Description => 'Aufnahmeinfo-Ansicht',
+      PrintConv => {
+        'Auto' => 'Automatisch',
+        'Manual (dark on light)' => 'Manuell - Dunkel auf Hell',
+        'Manual (light on dark)' => 'Manuell - Hell auf dunkel',
+      },
+    },
+   'ShootingMode' => {
+      Description => 'Aufnahmemodus',
+      PrintConv => {
+        'Aperture Priority' => 'BlendenprioritÃ€t',
+        'Beach' => 'Strand',
+        'Candlelight' => 'Kerzenlicht',
+        'Fireworks' => 'Feuerwerk',
+        'Macro' => 'Makro',
+        'Manual' => 'Manuell',
+        'Night Portrait' => 'NachtportrÃ€t',
+        'Portrait' => 'PortrÃ€t',
+        'Program' => 'Programm',
+        'Shutter Priority' => 'VerschlussprioritÃ€t',
+        'Snow' => 'Schnee',
+        'Sports' => 'Sport',
+        'Spot' => 'Spotmessung',
+        'Sunset' => 'Sonnenuntergang',
+        'Underwater' => 'Tauchen',
+      },
+    },
+   'ShootingModeSetting' => {
+      Description => 'Messfeldsteuerung',
+      PrintConv => {
+        'Continuous' => 'Serienaufnahme',
+        'Delayed Remote' => 'FernauslÃ¶ser m. Vorlauf',
+        'Quick-response Remote' => 'FernauslÃ¶ser',
+        'Self-timer' => 'SelbstauslÃ¶ser',
+        'Single Frame' => 'Einzelbild',
+      },
+    },
+   'ShortDocumentID' => 'Kurze Bild-ID',
+   'ShortFocal' => 'Kleinste Brennweite',
+   'ShortReleaseTimeLag' => {
+      Description => 'VerkÃŒrzte AuslÃ¶severzÃ¶gerung',
+      PrintConv => {
+        'Disable' => 'Ausgeschaltet',
+        'Enable' => 'Eingeschaltet',
+      },
+    },
+   'ShotInfoVersion' => 'Aufnahmeinfo-Version',
+   'Shutter-AELock' => {
+      Description => 'AuslÃ¶ser/AE-Speicherung',
+      PrintConv => {
+        'AE lock/AF' => 'AE-Speicherung/AF',
+        'AE/AF, No AE lock' => 'AE/AF, keine AE-Spei.',
+        'AF/AE lock' => 'AF/AE-Speicherung',
+        'AF/AF lock' => 'AF/AF-Speicherung',
+        'AF/AF lock, No AE lock' => 'AF/AF-Spei.keine AE-Spei.',
+      },
+    },
+   'ShutterAELButton' => 'AuslÃ¶ser/AE-Speichertaste',
+   'ShutterButtonAFOnButton' => {
+      Description => 'AuslÃ¶ser/AF-Starttaste',
+      PrintConv => {
+        'AE lock/Metering + AF start' => 'AESpeicherung/Messung+AFStart',
+        'Metering + AF start' => 'Messung+AFStart',
+        'Metering + AF start/AF stop' => 'Messung+AFStart / AFStopp',
+        'Metering + AF start/disable' => 'Messung+AFStart/Deaktiviert',
+        'Metering start/Meter + AF start' => 'Messung Start/Mess.+AFStart',
+      },
+    },
+   'ShutterCount' => 'Anzahl der AuslÃ¶sungen',
+   'ShutterCurtainSync' => {
+      Description => 'Verschluss-Synchronisation',
+      PrintConv => {
+        '1st-curtain sync' => '1. Verschlussvorhang',
+        '2nd-curtain sync' => '2. Verschlussvorhang',
+      },
+    },
+   'ShutterMode' => {
+      PrintConv => {
+        'Aperture Priority' => 'BlendenprioritÃ€t',
+        'Auto' => 'Automatisch',
+      },
+    },
+   'ShutterReleaseButtonAE-L' => {
+      Description => 'Belichtungsspeicher',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'ShutterReleaseNoCFCard' => {
+      Description => 'Verschlussausl. ohne Karte',
+      PrintConv => {
+        'No' => 'Nein',
+        'Yes' => 'Ja',
+      },
+    },
+   'ShutterSpeed' => 'Belichtungsdauer',
+   'ShutterSpeedRange' => {
+      Description => 'Einstellung Blendenbereich',
+      PrintConv => {
+        'Disable' => 'Nicht mÃ¶glich',
+        'Enable' => 'MÃ¶glich',
+      },
+    },
+   'ShutterSpeedValue' => 'Belichtungszeit',
+   'SimilarityIndex' => 'Bildgleichheits-Index',
+   'SlaveFlashMeteringSegments' => 'Slave-Blitz-Messfeld',
+   'SlideShow' => {
+      PrintConv => {
+        'No' => 'Nein',
+        'Yes' => 'Ja',
+      },
+    },
+   'SlowShutter' => {
+      Description => 'Langzeitbelichtungseinstellung',
+      PrintConv => {
+        'Night Scene' => 'Nachtszene',
+        'None' => 'Keine',
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'SlowSync' => {
+      Description => 'Slow-Synchro',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'An',
+      },
+    },
+   'Source' => 'Quelle',
+   'SpatialFrequencyResponse' => 'Raumfrequenz-Antwort',
+   'SpecialEffectsOpticalFilter' => {
+      PrintConv => {
+        'None' => 'Keine',
+      },
+    },
+   'SpecialInstructions' => 'Anweisungen',
+   'SpectralSensitivity' => 'Spektralempfindlichkeit',
+   'SpotFocusPointX' => 'Spot-Fokuspunkt X',
+   'SpotFocusPointY' => 'Spot-Fokuspunkt Y',
+   'SpotMeterLinkToAFPoint' => {
+      Description => 'Spotmessung AF-Feld verknÃŒpft',
+      PrintConv => {
+        'Disable (use center AF point)' => 'Deaktiviert (zentrales AF-Feld)',
+        'Enable (use active AF point)' => 'Aktiviert (aktives AF-Feld)',
+      },
+    },
+   'SpotMeteringMode' => {
+      Description => 'Spot-Messmethode',
+      PrintConv => {
+        'AF Point' => 'AF-Punkt',
+        'Center' => 'Mitte',
+      },
+    },
+   'State' => 'Bundesland/Kanton',
+   'StripByteCounts' => 'Anzahl Bytes pro komprimiertem Bildabschnitt',
+   'StripOffsets' => 'Bilddatenposition',
+   'Sub-location' => 'Ort des Motivs',
+   'SubSecCreateDate' => 'Digitalisierungsdatum/-uhrzeit',
+   'SubSecDateTimeOriginal' => 'Erstellungsdatum/-uhrzeit',
+   'SubSecModifyDate' => 'Ãnderungsdatum',
+   'SubSecTime' => 'DateTime 1/100 Sekunden',
+   'SubSecTimeDigitized' => 'Digitalisierungsdatum/-uhrzeit 1/100 Sekunden',
+   'SubSecTimeOriginal' => 'Erstellungsdatum/-uhrzeit 1/100 Sekunden',
+   'SubfileType' => {
+      Description => 'Neuer Unterdatei-Typ',
+      PrintConv => {
+        'Thumbnail image' => 'Miniaturbild',
+      },
+    },
+   'SubimageColor' => {
+      PrintConv => {
+        'Monochrome' => 'Monochrom',
+      },
+    },
+   'Subject' => 'Subjekt',
+   'SubjectArea' => 'Hauptobjektposition',
+   'SubjectDistance' => 'Objektentfernung',
+   'SubjectDistanceRange' => {
+      Description => 'Objektdistanzbereich',
+      PrintConv => {
+        'Close' => 'Nahaufnahme',
+        'Distant' => 'Fernaufnahme',
+        'Macro' => 'Makro',
+        'Unknown' => 'Unbekannt',
+      },
+    },
+   'SubjectLocation' => 'Hauptobjektposition',
+   'SubjectProgram' => {
+      Description => 'Szenenauswahl',
+      PrintConv => {
+        'Night portrait' => 'NachtportrÃ€t',
+        'None' => 'Keine',
+        'Portrait' => 'PortrÃ€t',
+        'Sports action' => 'Sportereignis',
+        'Sunset' => 'Sonnenuntergang',
+      },
+    },
+   'SubjectReference' => 'Themencode',
+   'Subsystem' => {
+      PrintConv => {
+        'Unknown' => 'Unbekannt',
+      },
+    },
+   'SuperMacro' => {
+      Description => 'Super Makro',
+      PrintConv => {
+        'Off' => 'Aus',
+      },
+    },
+   'SuperimposedDisplay' => {
+      Description => 'Eingeblendete Anzeige',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'SupplementalCategories' => 'ZusÃ€tzliche Kategorien',
+   'SvISOSetting' => 'Sv ISO-Einstellung',
+   'SwitchToRegisteredAFPoint' => {
+      Description => 'Auf gesp. AF-Messf. schalten',
+      PrintConv => {
+        'Disable' => 'Nicht mÃ¶glich',
+        'Enable' => 'MÃ¶glich',
+      },
+    },
+   'T4Options' => 'FÃŒllbits hinzugefÃŒgt',
+   'T6Options' => 'T6 Optionen',
+   'TTL_DA_ADown' => 'Slave-Blitz-Messfeld 6',
+   'TTL_DA_AUp' => 'Slave-Blitz-Messfeld 5',
+   'TTL_DA_BDown' => 'Slave-Blitz-Messfeld 8',
+   'TTL_DA_BUp' => 'Slave-Blitz-Messfeld 7',
+   'Tagged' => {
+      PrintConv => {
+        'No' => 'Nein',
+        'Yes' => 'Ja',
+      },
+    },
+   'TargetAperture' => 'Zielblendenwert',
+   'TargetExposureTime' => 'Zielbelichtungszeit',
+   'Technology' => {
+      Description => 'Technologie',
+      PrintConv => {
+        'Active Matrix Display' => 'Aktives Matrix-Display',
+        'Cathode Ray Tube Display' => 'KathodenstrahlrÃ¶hrenbildschirm',
+        'Digital Camera' => 'Digitalkamera',
+        'Dye Sublimation Printer' => 'Thermosublimationsdrucker',
+        'Electrophotographic Printer' => 'Laserdrucker',
+        'Electrostatic Printer' => 'Elektrostatischer Drucker',
+        'Film Scanner' => 'Film-Scanner',
+        'Film Writer' => 'Film-Writer',
+        'Flexography' => 'Flexographie',
+        'Gravure' => 'Gravur',
+        'Ink Jet Printer' => 'Tintenstrahldrucker',
+        'Offset Lithography' => 'Offset Lithographie',
+        'Passive Matrix Display' => 'Passives Matrix-Display',
+        'Photo CD' => 'Photo-CD',
+        'Photo Image Setter' => 'Foto-Filmbelichter',
+        'Photographic Paper Printer' => 'Fotopapierdrucker',
+        'Projection Television' => 'ProjektionsfernsehgerÃ€t',
+        'Reflective Scanner' => 'Reflexionsscanner',
+        'Thermal Wax Printer' => 'Thermowachsdrucker',
+        'Video Camera' => 'Videokamera',
+        'Video Monitor' => 'Video-Monitor',
+      },
+    },
+   'Teleconverter' => {
+      PrintConv => {
+        'None' => 'Keine',
+      },
+    },
+   'TextStamp' => {
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'ThumbnailFileName' => 'Miniaturbild-Dateiname',
+   'ThumbnailFormat' => 'Miniaturbild-Format',
+   'ThumbnailHeight' => 'Miniaturbild-HÃ¶he',
+   'ThumbnailImage' => 'Miniaturbild',
+   'ThumbnailImageName' => 'Miniaturbild-Name',
+   'ThumbnailImageSize' => 'Miniaturbild-GrÃ¶Ãe',
+   'ThumbnailImageType' => 'Miniaturbild-Typ',
+   'ThumbnailImageValidArea' => 'GÃŒltiger Bereich des Miniaturbildes',
+   'ThumbnailLength' => 'Miniaturbild-DatenlÃ€nge',
+   'ThumbnailOffset' => 'Miniaturbild-Datenposition',
+   'ThumbnailWidth' => 'Miniaturbild-Breite',
+   'Time' => 'Zeit',
+   'TimeCreated' => 'Erstellungszeit',
+   'TimeScaleParamsQuality' => {
+      PrintConv => {
+        'High' => 'Hoch',
+        'Low' => 'Leicht',
+      },
+    },
+   'TimeSent' => 'Absendezeit',
+   'TimeStamp' => 'Zeitstempel',
+   'TimeStamp1' => 'Zeitstempel (1)',
+   'TimeZoneOffset' => 'Zeitzonen-Offset',
+   'TimerFunctionButton' => {
+      Description => 'Funktionstaste',
+      PrintConv => {
+        'ISO' => 'ISO-Empfindlichkeit',
+        'Image Quality/Size' => 'BildqualitÃ€t/-grÃ¶Ãe',
+        'Self-timer' => 'SelbstauslÃ¶ser',
+        'Shooting Mode' => 'Aufnahmebetriebsart',
+        'White Balance' => 'WeiÃabgleich',
+      },
+    },
+   'TimerLength' => {
+      Description => 'Intervalldauer fÃŒr Timer',
+      PrintConv => {
+        'Disable' => 'Nicht mÃ¶glich',
+        'Enable' => 'MÃ¶glich',
+      },
+    },
+   'Timezone' => 'Zeitzone',
+   'Title' => 'Titel',
+   'ToneComp' => 'Tonwertkorrektur',
+   'ToneCurve' => {
+      Description => 'Ton-Kurve',
+      PrintConv => {
+        'Custom' => 'Benutzerdefiniert',
+        'Manual' => 'Manuell',
+      },
+    },
+   'ToneCurveActive' => {
+      PrintConv => {
+        'No' => 'Nein',
+        'Yes' => 'Ja',
+      },
+    },
+   'ToneCurveName' => {
+      PrintConv => {
+        'Custom' => 'Benutzerdefiniert',
+      },
+    },
+   'ToneCurves' => 'Ton-Kurven',
+   'ToningEffect' => {
+      Description => 'TÃ¶nungs-Effekt',
+      PrintConv => {
+        'B&W' => 'Schwarz-WeiÃ',
+        'Blue' => 'Blau',
+        'Blue-green' => 'Blau-GrÃŒn',
+        'Green' => 'GrÃŒn',
+        'None' => 'Keiner',
+        'Purple' => 'Lila',
+        'Purple-blue' => 'Violett-Blau',
+        'Red' => 'Rot',
+        'Red-purple' => 'Rot-Violett',
+        'Yellow' => 'Gelb',
+        'n/a' => 'Nicht gesetzt',
+      },
+    },
+   'ToningEffectMonochrome' => {
+      PrintConv => {
+        'Blue' => 'Blau',
+        'Green' => 'GrÃŒn',
+        'None' => 'Keine',
+        'Purple' => 'Lila',
+      },
+    },
+   'ToningSaturation' => 'TÃ¶nungssÃ€ttigung',
+   'TotalZoom' => 'Gesamtzoom',
+   'TransferFunction' => 'Transformationsfunktion',
+   'Transformation' => {
+      PrintConv => {
+        'Horizontal (normal)' => '0Â° (oben/links)',
+        'Mirror horizontal' => 'Horizontal gespiegelt',
+        'Mirror horizontal and rotate 270 CW' => 'Horizontal gespiegelt und 90Â° gegen den Uhrzeigersinn gedreht',
+        'Mirror horizontal and rotate 90 CW' => 'Horizontal gespiegelt und 90Â° im Uhrzeigersinn gedreht',
+        'Mirror vertical' => 'Vertikal gespiegelt',
+        'Rotate 180' => '180Â° (unten/rechts)',
+        'Rotate 270 CW' => '90Â° im Uhrzeigersinn (links/unten)',
+        'Rotate 90 CW' => '90Â° gegen den Uhrzeigersinn (rechts/oben)',
+      },
+    },
+   'TransmissionReference' => 'Ãbertragungsbezug',
+   'Trapped' => {
+      PrintConv => {
+        'Unknown' => 'Unbekannt',
+      },
+    },
+   'TvExposureTimeSetting' => 'Tv Belichtungszeit-Einstellung',
+   'USMLensElectronicMF' => {
+      Description => 'USM-Objektiv, elektr. MF',
+      PrintConv => {
+        'Disable after one-shot AF' => 'Nicht mÃ¶gl. nach One-Shot AF',
+        'Disable in AF mode' => 'Nicht mÃ¶glich im AF-Modus',
+        'Enable after one-shot AF' => 'MÃ¶glich nach One-Shot AF',
+      },
+    },
+   'Uncompressed' => {
+      Description => 'Unkomprimiert',
+      PrintConv => {
+        'No' => 'Nein',
+        'Yes' => 'Ja',
+      },
+    },
+   'UniqueCameraModel' => 'Eindeutige Kamerabezeichnung',
+   'UniqueDocumentID' => 'Eindeutige Bild-ID',
+   'Unknown' => 'Unbekannt',
+   'Unsharp1Color' => {
+      PrintConv => {
+        'Blue' => 'Blau',
+        'Green' => 'GrÃŒn',
+        'Red' => 'Rot',
+        'Yellow' => 'Gelb',
+      },
+    },
+   'Unsharp2Color' => {
+      PrintConv => {
+        'Blue' => 'Blau',
+        'Green' => 'GrÃŒn',
+        'Red' => 'Rot',
+        'Yellow' => 'Gelb',
+      },
+    },
+   'Unsharp3Color' => {
+      PrintConv => {
+        'Blue' => 'Blau',
+        'Green' => 'GrÃŒn',
+        'Red' => 'Rot',
+        'Yellow' => 'Gelb',
+      },
+    },
+   'Unsharp4Color' => {
+      PrintConv => {
+        'Blue' => 'Blau',
+        'Green' => 'GrÃŒn',
+        'Red' => 'Rot',
+        'Yellow' => 'Gelb',
+      },
+    },
+   'UnsharpMask' => {
+      Description => 'UnschÃ€rfemaske',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'Urgency' => {
+      Description => 'Dringlichkeit',
+      PrintConv => {
+        '0 (reserved)' => '0 (Reserviert fÃŒr zukÃŒnftige Verwendung)',
+        '1 (most urgent)' => '1 (sehr wichtig)',
+        '5 (normal urgency)' => '5 (normale Wichtigkeit)',
+        '8 (least urgent)' => '8 (geringe Wichtigkeit)',
+        '9 (user-defined priority)' => '9 (Reserviert fÃŒr zukÃŒnftige Verwendung)',
+      },
+    },
+   'UsableMeteringModes' => {
+      Description => 'Wahl nutzbarer Messmethoden',
+      PrintConv => {
+        'Disable' => 'Nicht mÃ¶glich',
+        'Enable' => 'MÃ¶glich',
+      },
+    },
+   'UsableShootingModes' => {
+      Description => 'Wahl nutzbarer Aufnahmemodi',
+      PrintConv => {
+        'Disable' => 'Nicht mÃ¶glich',
+        'Enable' => 'MÃ¶glich',
+      },
+    },
+   'UsageTerms' => 'Verwendungsvorschriften',
+   'UserComment' => 'Benutzerkommentar',
+   'UserDef1PictureStyle' => {
+      PrintConv => {
+        'Landscape' => 'Landschaft',
+        'Monochrome' => 'Monochrom',
+        'Portrait' => 'PortrÃ€t',
+      },
+    },
+   'UserDef2PictureStyle' => {
+      PrintConv => {
+        'Landscape' => 'Landschaft',
+        'Monochrome' => 'Monochrom',
+        'Portrait' => 'PortrÃ€t',
+      },
+    },
+   'UserDef3PictureStyle' => {
+      PrintConv => {
+        'Landscape' => 'Landschaft',
+        'Monochrome' => 'Monochrom',
+        'Portrait' => 'PortrÃ€t',
+      },
+    },
+   'VRDVersion' => 'VRD-Version',
+   'VRInfo' => 'Bildstabilisator-Informationen',
+   'VRInfoVersion' => 'VR-Info-Version',
+   'VR_0x66' => {
+      PrintConv => {
+        'Off' => 'Aus',
+        'On (active)' => 'Ein (Aktiv)',
+        'On (normal)' => 'Ein (Normal)',
+      },
+    },
+   'ValidAFPoints' => 'GÃŒltige AF-Punkte',
+   'VariProgram' => 'Aufnahmeprogramm',
+   'Version' => 'PrintIM Version',
+   'VibrationReduction' => {
+      Description => 'Bildstabilisation',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+        'On (1)' => 'Ein (1)',
+        'On (2)' => 'Ein (2)',
+        'On (3)' => 'Ein (3)',
+        'n/a' => 'Nicht gesetzt',
+      },
+    },
+   'ViewInfoDuringExposure' => {
+      Description => 'Sucherinfo bei Belichtung',
+      PrintConv => {
+        'Disable' => 'Nicht mÃ¶glich',
+        'Enable' => 'MÃ¶glich',
+      },
+    },
+   'ViewfinderWarning' => {
+      Description => 'Warnsymbol im Sucher',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'VignetteControl' => {
+      Description => 'Vignettierungskorrektur',
+      PrintConv => {
+        'High' => 'Hoch',
+        'Low' => 'Schwach',
+        'Normal' => 'Mittel',
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'VignetteControlIntensity' => 'Vignettierungskorrektur StÃ€rke',
+   'VoiceMemo' => {
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'Volume' => 'Band',
+   'WBAdjLighting' => {
+      PrintConv => {
+        'Daylight' => 'Tageslicht',
+        'Flash' => 'Blitz',
+        'Incandescent' => 'GlÃŒhbirne',
+        'None' => 'Keine',
+      },
+    },
+   'WBBlueLevel' => 'Farbabgleich Blau',
+   'WBBracketMode' => {
+      Description => 'WeiÃabgleich Belichtungsreihen-Modus',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On (shift AB)' => 'Ein (AB-Verschiebung)',
+        'On (shift GM)' => 'Ein (GM-Verschiebung)',
+      },
+    },
+   'WBBracketValueAB' => 'WeiÃabgleich AB-Belichtungsreihen-Wert',
+   'WBBracketValueGM' => 'WeiÃabgleich GM-Belichtungsreihen-Wert',
+   'WBFineTuneActive' => {
+      PrintConv => {
+        'No' => 'Nein',
+        'Yes' => 'Ja',
+      },
+    },
+   'WBGreenLevel' => 'Farbabgleich GrÃŒn',
+   'WBMediaImageSizeSetting' => {
+      Description => 'WB+Media/BildgrÃ¶Ãeneinstellung',
+      PrintConv => {
+        'LCD monitor' => 'LCD-Monitor',
+        'Rear LCD panel' => 'Hinteres LCD-Panel',
+      },
+    },
+   'WBMode' => {
+      PrintConv => {
+        'Auto' => 'Automatisch',
+      },
+    },
+   'WBRedLevel' => 'Farbabgleich Rot',
+   'WBShiftAB' => 'WeiÃabgleich AB-Korrektur',
+   'WBShiftGM' => 'WeiÃabgleich GM-Korrektur',
+   'WBShiftMG' => 'WeiÃabgleich GM-Korrektur',
+   'WB_GBRGLevels' => 'WeiÃabgleich GBRG-Farbverteilung',
+   'WB_GLevel' => 'WeiÃabgleich G-Farbverteilung',
+   'WB_GLevel3000K' => 'WeiÃabgleich G-Farbverteilung 3000K',
+   'WB_GLevel3300K' => 'WeiÃabgleich G-Farbverteilung 3300K',
+   'WB_GLevel3600K' => 'WeiÃabgleich G-Farbverteilung 3600K',
+   'WB_GLevel3900K' => 'WeiÃabgleich G-Farbverteilung 3900K',
+   'WB_GLevel4000K' => 'WeiÃabgleich G-Farbverteilung 4000K',
+   'WB_GLevel4300K' => 'WeiÃabgleich G-Farbverteilung 4300K',
+   'WB_GLevel4500K' => 'WeiÃabgleich G-Farbverteilung 4500K',
+   'WB_GLevel4800K' => 'WeiÃabgleich G-Farbverteilung 4800K',
+   'WB_GLevel5300K' => 'WeiÃabgleich G-Farbverteilung 5300K',
+   'WB_GLevel6000K' => 'WeiÃabgleich G-Farbverteilung 6000K',
+   'WB_GLevel6600K' => 'WeiÃabgleich G-Farbverteilung 6600K',
+   'WB_GLevel7500K' => 'WeiÃabgleich G-Farbverteilung 7500K',
+   'WB_GRBGLevels' => 'WeiÃabgleich GRBG-Farbverteilung',
+   'WB_GRGBLevels' => 'WeiÃabgleich GRGB-Farbverteilung',
+   'WB_RBGGLevels' => 'WeiÃabgleich RBGG-Farbverteilung',
+   'WB_RBLevels' => 'WeiÃabgleich RB-Farbverteilung',
+   'WB_RBLevels3000K' => 'WeiÃabgleich RB-Farbverteilung 3000K',
+   'WB_RBLevels3300K' => 'WeiÃabgleich RB-Farbverteilung 3300K',
+   'WB_RBLevels3600K' => 'WeiÃabgleich RB-Farbverteilung 3600K',
+   'WB_RBLevels3900K' => 'WeiÃabgleich RB-Farbverteilung 3800K',
+   'WB_RBLevels4000K' => 'WeiÃabgleich RB-Farbverteilung 4000K',
+   'WB_RBLevels4300K' => 'WeiÃabgleich RB-Farbverteilung 4300K',
+   'WB_RBLevels4500K' => 'WeiÃabgleich RB-Farbverteilung 4500K',
+   'WB_RBLevels4800K' => 'WeiÃabgleich RB-Farbverteilung 4800K',
+   'WB_RBLevels5300K' => 'WeiÃabgleich RB-Farbverteilung 5300K',
+   'WB_RBLevels6000K' => 'WeiÃabgleich RB-Farbverteilung 6000K',
+   'WB_RBLevels6600K' => 'WeiÃabgleich RB-Farbverteilung 6600K',
+   'WB_RBLevels7500K' => 'WeiÃabgleich RB-Farbverteilung 7500K',
+   'WB_RBLevelsCWB1' => 'WeiÃabgleich RB-Farbverteilung CWB1',
+   'WB_RBLevelsCWB2' => 'WeiÃabgleich RB-Farbverteilung CWB2',
+   'WB_RBLevelsCWB3' => 'WeiÃabgleich RB-Farbverteilung CWB3',
+   'WB_RBLevelsCWB4' => 'WeiÃabgleich RB-Farbverteilung CWB4',
+   'WB_RBLevelsCloudy' => 'WeiÃabgleich RB-Farbverteilung BewÃ¶lkt',
+   'WB_RBLevelsCoolWhiteFluor' => 'WeiÃabgleich RB-Farbverteilung Neonlicht kaltweiÃ',
+   'WB_RBLevelsDayWhiteFluor' => 'WeiÃabgleich RB-Farbverteilung Neonlicht neutralweiÃ',
+   'WB_RBLevelsDaylightFluor' => 'WeiÃabgleich RB-Farbverteilung Neonlicht tageslichtweiÃ',
+   'WB_RBLevelsEveningSunlight' => 'WeiÃabgleich RB-Farbverteilung Sonnenuntergang',
+   'WB_RBLevelsFineWeather' => 'WeiÃabgleich RB-Farbverteilung Wolkenlos',
+   'WB_RBLevelsShade' => 'WeiÃabgleich RB-Farbverteilung Schatten',
+   'WB_RBLevelsTungsten' => 'WeiÃabgleich RB-Farbverteilung GlÃŒhbirne',
+   'WB_RBLevelsWhiteFluorescent' => 'WeiÃabgleich RB-Farbverteilung Neonlicht universalweiÃ',
+   'WB_RGBGLevels' => 'WeiÃabgleich RGBG-Farbverteilung',
+   'WB_RGBLevels' => 'WeiÃabgleich RGB-Farbverteilung',
+   'WB_RGBLevelsCloudy' => 'WeiÃabgleich RGB-Farbverteilung BewÃ¶lkt',
+   'WB_RGBLevelsDaylight' => 'WeiÃabgleich RGB-Farbverteilung Tageslicht',
+   'WB_RGBLevelsFlash' => 'WeiÃabgleich RGB-Farbverteilung Blitz',
+   'WB_RGBLevelsFluorescent' => 'WeiÃabgleich RGB-Farbverteilung Neonlicht',
+   'WB_RGBLevelsShade' => 'WeiÃabgleich RGB-Farbverteilung Schatten',
+   'WB_RGBLevelsTungsten' => 'WeiÃabgleich RGB-Farbverteilung GlÃŒhbirne',
+   'WB_RGGBLevels' => 'WeiÃabgleich RGGB-Farbverteilung',
+   'WB_RGGBLevelsAsShot' => 'WeiÃabgleich RGGB-Farbverteilung Aufnahme',
+   'WB_RGGBLevelsAuto' => 'WeiÃabgleich RGGB-Farbverteilung Auto',
+   'WB_RGGBLevelsCloudy' => 'WeiÃabgleich RGGB-Farbverteilung BewÃ¶lkt',
+   'WB_RGGBLevelsCustom' => 'WeiÃabgleich RGGB-Farbverteilung Benutzerdefiniert',
+   'WB_RGGBLevelsCustom1' => 'WeiÃabgleich RGGB-Farbverteilung Benutzerdefiniert 1',
+   'WB_RGGBLevelsCustom2' => 'WeiÃabgleich RGGB-Farbverteilung Benutzerdefiniert 2',
+   'WB_RGGBLevelsDaylight' => 'WeiÃabgleich RGGB-Farbverteilung Tageslicht',
+   'WB_RGGBLevelsFlash' => 'WeiÃabgleich RGGB-Farbverteilung Blitz',
+   'WB_RGGBLevelsFluorescent' => 'WeiÃabgleich RGGB-Farbverteilung Neonlicht',
+   'WB_RGGBLevelsFluorescentD' => 'WeiÃabgleich RGGB-Farbverteilung Neonlicht D',
+   'WB_RGGBLevelsFluorescentN' => 'WeiÃabgleich RGGB-Farbverteilung Neonlicht N',
+   'WB_RGGBLevelsFluorescentW' => 'WeiÃabgleich RGGB-Farbverteilung Neonlicht W',
+   'WB_RGGBLevelsKelvin' => 'WeiÃabgleich RGGB-Farbverteilung Kelvin',
+   'WB_RGGBLevelsMeasured' => 'WeiÃabgleich RGGB-Farbverteilung Messung',
+   'WB_RGGBLevelsPC1' => 'WeiÃabgleich RGGB-Farbverteilung PC1',
+   'WB_RGGBLevelsPC2' => 'WeiÃabgleich RGGB-Farbverteilung PC2',
+   'WB_RGGBLevelsPC3' => 'WeiÃabgleich RGGB-Farbverteilung PC3',
+   'WB_RGGBLevelsShade' => 'WeiÃabgleich RGGB-Farbverteilung Schatten',
+   'WB_RGGBLevelsTungsten' => 'WeiÃabgleich RGGB-Farbverteilung GlÃŒhbirne',
+   'WB_RGGBLevelsUnknown' => 'WeiÃabgleich RGGB-Farbverteilung Unbekannt',
+   'WB_RGGBLevelsUnknown10' => 'WeiÃabgleich RGGB-Farbverteilung Unbekannt 10',
+   'WB_RGGBLevelsUnknown11' => 'WeiÃabgleich RGGB-Farbverteilung Unbekannt 11',
+   'WB_RGGBLevelsUnknown12' => 'WeiÃabgleich RGGB-Farbverteilung Unbekannt 12',
+   'WB_RGGBLevelsUnknown13' => 'WeiÃabgleich RGGB-Farbverteilung Unbekannt 13',
+   'WB_RGGBLevelsUnknown14' => 'WeiÃabgleich RGGB-Farbverteilung Unbekannt 14',
+   'WB_RGGBLevelsUnknown15' => 'WeiÃabgleich RGGB-Farbverteilung Unbekannt 15',
+   'WB_RGGBLevelsUnknown16' => 'WeiÃabgleich RGGB-Farbverteilung Unbekannt 16',
+   'WB_RGGBLevelsUnknown2' => 'WeiÃabgleich RGGB-Farbverteilung Unbekannt 2',
+   'WB_RGGBLevelsUnknown3' => 'WeiÃabgleich RGGB-Farbverteilung Unbekannt 3',
+   'WB_RGGBLevelsUnknown4' => 'WeiÃabgleich RGGB-Farbverteilung Unbekannt 4',
+   'WB_RGGBLevelsUnknown5' => 'WeiÃabgleich RGGB-Farbverteilung Unbekannt 5',
+   'WB_RGGBLevelsUnknown6' => 'WeiÃabgleich RGGB-Farbverteilung Unbekannt 6',
+   'WB_RGGBLevelsUnknown7' => 'WeiÃabgleich RGGB-Farbverteilung Unbekannt 7',
+   'WB_RGGBLevelsUnknown8' => 'WeiÃabgleich RGGB-Farbverteilung Unbekannt 8',
+   'WB_RGGBLevelsUnknown9' => 'WeiÃabgleich RGGB-Farbverteilung Unbekannt 9',
+   'WCSProfiles' => 'Windows Color System-Profil',
+   'Warning' => 'Warnung',
+   'WhiteBalance' => {
+      Description => 'WeiÃabgleich',
+      PrintConv => {
+        'Auto' => 'Automatisch',
+        'Black & White' => 'Schwarz/WeiÃ',
+        'Cloudy' => 'BewÃ¶lkt',
+        'Color Temperature/Color Filter' => 'Farbtemperatur/Farbfilter',
+        'Cool White Fluorescent' => 'Neonlicht kaltweiÃ',
+        'Custom' => 'Benutzerdefiniert',
+        'Custom 1' => 'Benutzerdefiniert 1',
+        'Custom 2' => 'Benutzerdefiniert 2',
+        'Custom 3' => 'Benutzerdefiniert 3',
+        'Custom 4' => 'Benutzerdefiniert 4',
+        'Custom2' => 'Benutzerdefiniert 2',
+        'Custom3' => 'Benutzerdefiniert 3',
+        'Custom4' => 'Benutzerdefiniert 4',
+        'Custom5' => 'Benutzerdefiniert 5',
+        'Day White Fluorescent' => 'Neonlicht neutralweiÃ',
+        'Daylight' => 'Tageslicht',
+        'Daylight Fluorescent' => 'Neonlicht tageslichtweiÃ',
+        'Flash' => 'Blitz',
+        'Fluorescent' => 'Neonlicht',
+        'Incandescent' => 'GlÃŒhbirne',
+        'Living Room Warm White Fluorescent' => 'Neonlicht Wohnzimmer-warmweiÃ)',
+        'Manual' => 'Manuell',
+        'Manual Temperature (Kelvin)' => 'Manuelle Temperatur (Kelvin)',
+        'Shade' => 'Schatten',
+        'Tungsten' => 'GlÃŒhbirne',
+        'Underwater' => 'Tauchen',
+        'Unknown' => 'Unbekannt',
+        'User-Selected' => 'Benutzerdefiniert',
+        'Warm White Fluorescent' => 'Neonlicht warmweiÃ',
+        'White Fluorescent' => 'Neonlicht universalweiÃ',
+      },
+    },
+   'WhiteBalance2' => {
+      Description => 'WeiÃabgleich 2',
+      PrintConv => {
+        '3000K (Tungsten light)' => '3000K (GlÃŒhbirne)',
+        '3600K (Tungsten light-like)' => '3600K (Ã€hnlich GlÃŒhbirne)',
+        '4000K (Cool white fluorescent)' => '4000K (Neonlicht kaltweiÃ)',
+        '4500K (Neutral white fluorescent)' => '4500K (Neonlicht neutralweiÃ)',
+        '5300K (Fine Weather)' => '5300K (Wolkenlos)',
+        '6000K (Cloudy)' => '6000K (BewÃ¶lkt)',
+        '6600K (Daylight fluorescent)' => '6600K (Neonlicht tageslichtweiÃ)',
+        '7500K (Fine Weather with Shade)' => '7500K (Sonne und Schatten)',
+        'Auto' => 'Automatisch',
+      },
+    },
+   'WhiteBalanceAdj' => {
+      PrintConv => {
+        'Auto' => 'Automatisch',
+        'Cloudy' => 'BewÃ¶lkt',
+        'Daylight' => 'Tageslicht',
+        'Flash' => 'Blitz',
+        'Fluorescent' => 'Neonlicht',
+        'Off' => 'Aus',
+        'On' => 'Ein',
+        'Shade' => 'Schatten',
+        'Tungsten' => 'GlÃŒhbirne',
+      },
+    },
+   'WhiteBalanceBias' => 'WeiÃabgleich Bias',
+   'WhiteBalanceBlue' => 'Farbabgleich Blau',
+   'WhiteBalanceBracket' => 'WeiÃabgleichs-Belichtungsreihe',
+   'WhiteBalanceBracketing' => 'WeiÃabgleichs-Belichtungsreihe',
+   'WhiteBalanceFineTune' => 'WeiÃabgleichsfeineinstellung',
+   'WhiteBalanceMode' => {
+      Description => 'WeiÃabgleich-Modus',
+      PrintConv => {
+        'Auto (Cloudy)' => 'Automatisch (BewÃ¶lkt)',
+        'Auto (Day White Fluorescent)' => 'Automatisch (Neonlicht neutralweiÃ)',
+        'Auto (Daylight Fluorescent)' => 'Automatisch (Neonlicht tageslichtweiÃ)',
+        'Auto (Daylight)' => 'Automatisch (Tageslicht)',
+        'Auto (Flash)' => 'Automatisch (Blitz)',
+        'Auto (Shade)' => 'Automatisch (Schatten)',
+        'Auto (Tungsten)' => 'Automatisch (GlÃŒhbirne)',
+        'Auto (White Fluorescent)' => 'Automatisch (Neonlicht universalweiÃ)',
+        'Unknown' => 'Unbekannt',
+        'User-Selected' => 'Benutzerdefiniert',
+      },
+    },
+   'WhiteBalanceRed' => 'Farbabgleich Rot',
+   'WhiteBalanceSet' => {
+      Description => 'Eingestellter WeiÃabgleich',
+      PrintConv => {
+        'Auto' => 'Automatisch',
+        'Cloudy' => 'BewÃ¶lkt',
+        'Day White Fluorescent' => 'Neonlicht neutralweiÃ',
+        'Daylight' => 'Tageslicht',
+        'Daylight Fluorescent' => 'Neonlicht tageslichtweiÃ',
+        'Flash' => 'Blitz',
+        'Manual' => 'Manuell',
+        'Set Color Temperature 1' => 'Farbtemperatur-Einstellung 1',
+        'Set Color Temperature 2' => 'Farbtemperatur-Einstellung 2',
+        'Set Color Temperature 3' => 'Farbtemperatur-Einstellung 3',
+        'Shade' => 'Schatten',
+        'Tungsten' => 'GlÃŒhbirne',
+        'White Fluorescent' => 'Neonlicht universalweiÃ',
+      },
+    },
+   'WhiteBalanceSetting' => 'WeiÃabgleichs-Einstellung',
+   'WhiteBalanceTable' => 'WeiÃabgleich Tabelle',
+   'WhiteBalanceTemperature' => 'WeiÃabgleich Farbtemperatur',
+   'WhiteBoard' => 'Whiteboard Funktion',
+   'WhitePoint' => 'WeiÃpunkt-ChromatizitÃ€t',
+   'WhitePointX' => 'WeiÃpunkt X',
+   'WhitePointY' => 'WeiÃpunkt Y',
+   'Wide' => 'Breit',
+   'WideFocusZone' => {
+      Description => 'Zone des groÃen AF-Messfeldes',
+      PrintConv => {
+        'Center zone (horizontal orientation)' => 'Mittlere Zone (horizontale Ausrichtung)',
+        'Center zone (vertical orientation)' => 'Mittlere Zone (vertikale Ausrichtung)',
+        'Left zone' => 'Linke Zone',
+        'No zone' => 'Keine Zone',
+        'Right zone' => 'Rechte Zone',
+      },
+    },
+   'WideRange' => {
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'WidthResolution' => 'Horizontale BildauflÃ¶sung',
+   'WorldTime' => 'Zeitzone',
+   'WorldTimeLocation' => {
+      Description => 'Weltzeit-Position',
+      PrintConv => {
+        'Destination' => 'Zielort',
+        'Hometown' => 'Heimatort',
+      },
+    },
+   'Writer-Editor' => 'Verfasser der Beschreibung',
+   'XMP' => 'XMP Metadaten',
+   'XPAuthor' => 'Autor',
+   'XPComment' => 'Kommentar',
+   'XPKeywords' => 'StichwÃ¶rter',
+   'XPSubject' => 'Betreff',
+   'XPTitle' => 'Titel',
+   'XResolution' => 'Horizontale BildauflÃ¶sung',
+   'YCbCrCoefficients' => 'YCbCr-Koeffizienten',
+   'YCbCrPositioning' => {
+      Description => 'Y und C Ausrichtung',
+      PrintConv => {
+        'Centered' => 'Zentriert',
+        'Co-sited' => 'Benachbart',
+      },
+    },
+   'YCbCrSubSampling' => 'Subsampling Rate von Y bis C',
+   'YResolution' => 'Vertikale BildauflÃ¶sung',
+   'Year' => 'Jahr',
+   'ZoneMatching' => {
+      Description => 'Zonenabgleich',
+      PrintConv => {
+        'High Key' => 'Hi',
+        'ISO Setting Used' => 'Aus (ISO-Einstellung verwendet)',
+        'Low Key' => 'Lo',
+      },
+    },
+   'ZoneMatchingOn' => {
+      Description => 'Zonenabgleich',
+      PrintConv => {
+        'Off' => 'Aus',
+        'On' => 'Ein',
+      },
+    },
+   'ZoomPos' => 'Zoom Position',
+   'ZoomSourceWidth' => 'VergrÃ¶Ãerungs-UrsprungsgrÃ¶Ãe',
+   'ZoomTargetWidth' => 'VergrÃ¶Ãerungs-EndgrÃ¶Ãe',
+);
+
+1;  # end
+
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Lang::de.pm - ExifTool German language translations
+
+=head1 DESCRIPTION
+
+This file is used by Image::ExifTool to generate localized tag descriptions
+and values.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Jens Duttke and Herbert Kauer for providing this translation.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool(3pm)|Image::ExifTool>,
+L<Image::ExifTool::TagInfoXML(3pm)|Image::ExifTool::TagInfoXML>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/en_ca.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/en_ca.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/en_ca.pm	(revision 24799)
@@ -0,0 +1,557 @@
+#------------------------------------------------------------------------------
+# File:         en_ca.pm
+#
+# Description:  ExifTool Canadian English language translations
+#
+# Notes:        This file generated automatically by Image::ExifTool::TagInfoXML
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Lang::en_ca;
+
+use strict;
+use vars qw($VERSION);
+
+$VERSION = '1.06';
+
+%Image::ExifTool::Lang::en_ca::Translate = (
+   'AlternateDuotoneColors' => 'Alternate Duotone Colours',
+   'AlternateSpotColors' => 'Alternate Spot Colours',
+   'ArtFilter' => {
+      PrintConv => {
+        'Pale & Light Color' => 'Pale & Light Colour',
+      },
+    },
+   'BackgroundColor' => 'Background Colour',
+   'BackgroundColorIndicator' => {
+      Description => 'Background Colour Indicator',
+      PrintConv => {
+        'Specified Background Color' => 'Specified Background Colour',
+        'Unspecified Background Color' => 'Unspecified Background Colour',
+      },
+    },
+   'BackgroundColorValue' => 'Background Colour Value',
+   'BasicColorImageSequence' => 'Basic Colour Image Sequence',
+   'BkColor' => 'Background Colour',
+   'BluePaletteColorTableData' => 'Blue Palette Colour Table Data',
+   'BluePaletteColorTableDescriptor' => 'Blue Palette Colour Table Descriptor',
+   'BorderColor' => 'Border Colour',
+   'CFAPlaneColor' => 'CFA Plane Colour',
+   'CameraColorCalibration01' => 'Camera Colour Calibration 01',
+   'CameraColorCalibration02' => 'Camera Colour Calibration 02',
+   'CameraColorCalibration03' => 'Camera Colour Calibration 03',
+   'CameraColorCalibration04' => 'Camera Colour Calibration 04',
+   'CameraColorCalibration05' => 'Camera Colour Calibration 05',
+   'CameraColorCalibration06' => 'Camera Colour Calibration 06',
+   'CameraColorCalibration07' => 'Camera Colour Calibration 07',
+   'CameraColorCalibration08' => 'Camera Colour Calibration 08',
+   'CameraColorCalibration09' => 'Camera Colour Calibration 09',
+   'CameraColorCalibration10' => 'Camera Colour Calibration 10',
+   'CameraColorCalibration11' => 'Camera Colour Calibration 11',
+   'CameraColorCalibration12' => 'Camera Colour Calibration 12',
+   'CameraColorCalibration13' => 'Camera Colour Calibration 13',
+   'CameraColorCalibration14' => 'Camera Colour Calibration 14',
+   'CameraColorCalibration15' => 'Camera Colour Calibration 15',
+   'CanonColorInfo1' => 'Canon Colour Info 1',
+   'CanonColorInfo2' => 'Canon Colour Info 2',
+   'ChromaticityColorant' => 'Chromaticity Colourant',
+   'Color' => 'Colour',
+   'ColorAberrationControl' => 'Colour Aberration Control',
+   'ColorAdjustment' => 'Colour Adjustment',
+   'ColorAdjustmentMode' => 'Colour Adjustment Mode',
+   'ColorAverages' => 'Colour Averages',
+   'ColorBW' => 'Colour BW',
+   'ColorBalance' => 'Colour Balance',
+   'ColorBalanceAdj' => 'Colour Balance Adj',
+   'ColorBalanceBlue' => 'Colour Balance Blue',
+   'ColorBalanceGreen' => 'Colour Balance Green',
+   'ColorBalanceRed' => 'Colour Balance Red',
+   'ColorBalanceUnknown' => 'Colour Balance Unknown',
+   'ColorBitDepth' => 'Colour Bit Depth',
+   'ColorBlur' => 'Colour Blur',
+   'ColorBoostLevel' => 'Colour Boost Level',
+   'ColorBoostType' => 'Colour Boost Type',
+   'ColorBooster' => 'Colour Booster',
+   'ColorCalibrationMatrix' => 'Colour Calibration Matrix',
+   'ColorCasts' => 'Colour Casts',
+   'ColorCharacterization' => 'Colour Characterization',
+   'ColorClass' => 'Colour Class',
+   'ColorCompensationFilter' => 'Colour Compensation Filter',
+   'ColorComponents' => 'Colour Components',
+   'ColorControl' => 'Colour Control',
+   'ColorCorrection' => 'Colour Correction',
+   'ColorDataVersion' => 'Colour Data Version',
+   'ColorEffect' => 'Colour Effect',
+   'ColorFilter' => 'Colour Filter',
+   'ColorGain' => 'Colour Gain',
+   'ColorGroup' => 'Colour Group',
+   'ColorHalftoningInfo' => 'Colour Halftoning Info',
+   'ColorHue' => 'Colour Hue',
+   'ColorImagePrintingFlag' => 'Colour Image Printing Flag',
+   'ColorMap' => 'Colour Map',
+   'ColorMatrix' => 'Colour Matrix',
+   'ColorMatrix1' => 'Colour Matrix 1',
+   'ColorMatrix2' => 'Colour Matrix 2',
+   'ColorMatrixA' => 'Colour Matrix A',
+   'ColorMatrixB' => 'Colour Matrix B',
+   'ColorMatrixNumber' => 'Colour Matrix Number',
+   'ColorMode' => {
+      Description => 'Colour Mode',
+      PrintConv => {
+        'Natural color' => 'Natural colour',
+        'Neutral Color' => 'Neutral Colour',
+        'Saturated Color' => 'Saturated Colour',
+        'Vivid color' => 'Vivid colour',
+      },
+    },
+   'ColorMoireReduction' => 'Colour Moire Reduction',
+   'ColorMoireReductionMode' => 'Colour Moire Reduction Mode',
+   'ColorNoiseReduction' => 'Colour Noise Reduction',
+   'ColorNoiseReductionIntensity' => 'Colour Noise Reduction Intensity',
+   'ColorNoiseReductionSharpness' => 'Colour Noise Reduction Sharpness',
+   'ColorObjBackType' => 'Colour Obj Back Type',
+   'ColorObjName' => 'Colour Obj Name',
+   'ColorObjType' => 'Colour Obj Type',
+   'ColorObjVersion' => 'Colour Obj Version',
+   'ColorPalette' => 'Colour Palette',
+   'ColorPlanes' => 'Colour Planes',
+   'ColorProfile' => 'Colour Profile',
+   'ColorRepresentation' => 'Colour Representation',
+   'ColorReproduction' => 'Colour Reproduction',
+   'ColorResolutionDepth' => 'Colour Resolution Depth',
+   'ColorResponseUnit' => 'Colour Response Unit',
+   'ColorSamplersResource' => 'Colour Samplers Resource',
+   'ColorSequence' => 'Colour Sequence',
+   'ColorSpace' => {
+      Description => 'Colour Space',
+      PrintConv => {
+        'No color space specified' => 'No colour space specified',
+      },
+    },
+   'ColorSpaceData' => 'Colour Space Data',
+   'ColorSpecification' => 'Colour Specification',
+   'ColorTable' => 'Colour Table',
+   'ColorTempAsShot' => 'Colour Temp As Shot',
+   'ColorTempAuto' => 'Colour Temp Auto',
+   'ColorTempCloudy' => 'Colour Temp Cloudy',
+   'ColorTempCustom' => 'Colour Temp Custom',
+   'ColorTempCustom1' => 'Colour Temp Custom 1',
+   'ColorTempCustom2' => 'Colour Temp Custom 2',
+   'ColorTempDaylight' => 'Colour Temp Daylight',
+   'ColorTempFlash' => 'Colour Temp Flash',
+   'ColorTempFlashData' => 'Colour Temp Flash Data',
+   'ColorTempFluorescent' => 'Colour Temp Fluorescent',
+   'ColorTempKelvin' => 'Colour Temp Kelvin',
+   'ColorTempMeasured' => 'Colour Temp Measured',
+   'ColorTempPC1' => 'Colour Temp PC1',
+   'ColorTempPC2' => 'Colour Temp PC2',
+   'ColorTempPC3' => 'Colour Temp PC3',
+   'ColorTempShade' => 'Colour Temp Shade',
+   'ColorTempTungsten' => 'Colour Temp Tungsten',
+   'ColorTempUnknown' => 'Colour Temp Unknown',
+   'ColorTempUnknown10' => 'Colour Temp Unknown 10',
+   'ColorTempUnknown11' => 'Colour Temp Unknown 11',
+   'ColorTempUnknown12' => 'Colour Temp Unknown 12',
+   'ColorTempUnknown13' => 'Colour Temp Unknown 13',
+   'ColorTempUnknown14' => 'Colour Temp Unknown 14',
+   'ColorTempUnknown15' => 'Colour Temp Unknown 15',
+   'ColorTempUnknown16' => 'Colour Temp Unknown 16',
+   'ColorTempUnknown2' => 'Colour Temp Unknown 2',
+   'ColorTempUnknown3' => 'Colour Temp Unknown 3',
+   'ColorTempUnknown4' => 'Colour Temp Unknown 4',
+   'ColorTempUnknown5' => 'Colour Temp Unknown 5',
+   'ColorTempUnknown6' => 'Colour Temp Unknown 6',
+   'ColorTempUnknown7' => 'Colour Temp Unknown 7',
+   'ColorTempUnknown8' => 'Colour Temp Unknown 8',
+   'ColorTempUnknown9' => 'Colour Temp Unknown 9',
+   'ColorTemperature' => 'Colour Temperature',
+   'ColorTemperatureAdj' => 'Colour Temperature Adj',
+   'ColorTemperatureBG' => 'Colour Temperature BG',
+   'ColorTemperatureRG' => 'Colour Temperature RG',
+   'ColorTemperatureSetting' => {
+      Description => 'Colour Temperature Setting',
+      PrintConv => {
+        'Color Filter' => 'Colour Filter',
+      },
+    },
+   'ColorTone' => 'Colour Tone',
+   'ColorToneAdj' => 'Colour Tone Adj',
+   'ColorToneFaithful' => 'Colour Tone Faithful',
+   'ColorToneLandscape' => 'Colour Tone Landscape',
+   'ColorToneNeutral' => 'Colour Tone Neutral',
+   'ColorTonePortrait' => 'Colour Tone Portrait',
+   'ColorToneStandard' => 'Colour Tone Standard',
+   'ColorToneUserDef1' => 'Colour Tone User Def 1',
+   'ColorToneUserDef2' => 'Colour Tone User Def 2',
+   'ColorToneUserDef3' => 'Colour Tone User Def 3',
+   'ColorTransferFuncs' => 'Colour Transfer Funcs',
+   'ColorTransform' => 'Colour Transform',
+   'ColorTwistMatrix' => 'Colour Twist Matrix',
+   'ColorType' => {
+      Description => 'Colour Type',
+      PrintConv => {
+        'Color' => 'Colour',
+        'Color Alpha' => 'Colour Alpha',
+      },
+    },
+   'Colorant1Coordinates' => 'Colourant 1 Coordinates',
+   'Colorant1Name' => 'Colourant 1 Name',
+   'Colorant2Coordinates' => 'Colourant 2 Coordinates',
+   'Colorant2Name' => 'Colourant 2 Name',
+   'Colorant3Coordinates' => 'Colourant 3 Coordinates',
+   'Colorant3Name' => 'Colourant 3 Name',
+   'ColorantA' => 'Colourant A',
+   'ColorantB' => 'Colourant B',
+   'ColorantBlack' => 'Colourant Black',
+   'ColorantBlue' => 'Colourant Blue',
+   'ColorantCount' => 'Colourant Count',
+   'ColorantCyan' => 'Colourant Cyan',
+   'ColorantGreen' => 'Colourant Green',
+   'ColorantL' => 'Colourant L',
+   'ColorantMagenta' => 'Colourant Magenta',
+   'ColorantMode' => 'Colourant Mode',
+   'ColorantOrder' => 'Colourant Order',
+   'ColorantRed' => 'Colourant Red',
+   'ColorantSwatchName' => 'Colourant Swatch Name',
+   'ColorantTableOut' => 'Colourant Table Out',
+   'ColorantType' => 'Colourant Type',
+   'ColorantYellow' => 'Colourant Yellow',
+   'ColorimetricReference' => 'Colourimetric Reference',
+   'Colors' => 'Colours',
+   'Colorspace' => 'Colourspace',
+   'Compression' => {
+      PrintConv => {
+        'JBIG Color' => 'JBIG Colour',
+      },
+    },
+   'ContrastMode' => {
+      PrintConv => {
+        'Dynamic (Color Film)' => 'Dynamic (Colour Film)',
+        'Dynamic Art (My Color)' => 'Dynamic Art (My Colour)',
+        'Elegant (My Color)' => 'Elegant (My Colour)',
+        'Nature (Color Film)' => 'Nature (Colour Film)',
+        'Nostalgic (Color Film)' => 'Nostalgic (Colour Film)',
+        'Retro (My Color)' => 'Retro (My Colour)',
+        'Smooth (Color Film) or Pure (My Color)' => 'Smooth (Colour Film) or Pure (My Colour)',
+        'Vibrant (Color Film) or Expressive (My Color)' => 'Vibrant (Colour Film) or Expressive (My Colour)',
+      },
+    },
+   'D-LightingHQColorBoost' => 'D-Lighting HQ Colour Boost',
+   'D-LightingHSColorBoost' => 'D-Lighting HS Colour Boost',
+   'DefHilite' => 'Use Default Highlight Colour',
+   'DefaultImageColor' => 'Default Image Colour',
+   'DeltaType' => {
+      PrintConv => {
+        'Color Addition' => 'Colour Addition',
+        'Color Replacement' => 'Colour Replacement',
+      },
+    },
+   'DisplayUnits' => {
+      PrintConv => {
+        'meters' => 'Metres',
+      },
+    },
+   'EasyMode' => {
+      PrintConv => {
+        'Color Accent' => 'Colour Accent',
+        'Color Swap' => 'Colour Swap',
+        'My Colors' => 'My Colours',
+      },
+    },
+   'FaithfulRawColorTone' => 'Faithful Raw Colour Tone',
+   'FaxProfile' => {
+      PrintConv => {
+        'Lossless color and grayscale, L' => 'Lossless colour and grayscale, L',
+        'Lossy color and grayscale, C' => 'Lossy colour and grayscale, C',
+      },
+    },
+   'FgColor' => 'Foreground Colour',
+   'FilmMode' => {
+      PrintConv => {
+        'Dynamic (color)' => 'Dynamic (colour)',
+        'Nature (color)' => 'Nature (colour)',
+        'Smooth (color)' => 'Smooth (colour)',
+        'Standard (color)' => 'Standard (colour)',
+      },
+    },
+   'FlashColorFilter' => 'Flash Colour Filter',
+   'GenOpColor' => 'Gen Op Colour',
+   'GreenPaletteColorTableData' => 'Green Palette Colour Table Data',
+   'GreenPaletteColorTableDescriptor' => 'Green Palette Colour Table Descriptor',
+   'HasColorMap' => 'Has Colour Map',
+   'HighlightColorDistortReduct' => 'Highlight Colour Distort Reduct',
+   'HiliteColor' => 'Highlight Colour',
+   'ImageAlterationConstraints' => {
+      PrintConv => {
+        'No Colorization' => 'No Colourization',
+        'No De-Colorization' => 'No De-Colourization',
+      },
+    },
+   'ImageColor' => 'Image Colour',
+   'ImageColorIndicator' => {
+      Description => 'Image Colour Indicator',
+      PrintConv => {
+        'Specified Image Color' => 'Specified Image Colour',
+        'Unspecified Image Color' => 'Unspecified Image Colour',
+      },
+    },
+   'ImageColorValue' => 'Image Colour Value',
+   'InterchangeColorSpace' => 'Interchange Colour Space',
+   'LandscapeRawColorTone' => 'Landscape Raw Colour Tone',
+   'LargeBluePaletteColorTableData' => 'Large Blue Palette Colour Table Data',
+   'LargeBluePaletteColorTableDescr' => 'Large Blue Palette Colour Table Descr',
+   'LargeGreenPaletteColorTableData' => 'Large Green Palette Colour Table Data',
+   'LargeGreenPaletteColorTableDescr' => 'Large Green Palette Colour Table Descr',
+   'LargePaletteColorLookupTableUID' => 'Large Palette Colour Lookup Table UID',
+   'LargeRedPaletteColorTableData' => 'Large Red Palette Colour Table Data',
+   'LargeRedPaletteColorTableDescr' => 'Large Red Palette Colour Table Descr',
+   'MDColorTable' => 'MD Colour Table',
+   'MagicFilter' => {
+      PrintConv => {
+        'Pale & Light Color' => 'Pale & Light Colour',
+      },
+    },
+   'MandatoryBackground' => {
+      PrintConv => {
+        'Color Advisory, Image Mandatory' => 'Colour Advisory, Image Mandatory',
+        'Color Mandatory, Image Advisory' => 'Colour Mandatory, Image Advisory',
+        'Color and Image Advisory' => 'Colour and Image Advisory',
+        'Color and Image Mandatory' => 'Colour and Image Mandatory',
+      },
+    },
+   'MattColor' => 'Matt Colour',
+   'ModifiedColorTemp' => 'Modified Colour Temp',
+   'MyColorMode' => {
+      Description => 'My Colour Mode',
+      PrintConv => {
+        'Color Accent' => 'Colour Accent',
+        'Color Swap' => 'Colour Swap',
+      },
+    },
+   'NamedColor' => 'Named Colour',
+   'NamedColor2' => 'Named Colour 2',
+   'NeutralRawColorTone' => 'Neutral Raw Colour Tone',
+   'NewColorType' => 'New Colour Type',
+   'NumColors' => 'Num Colours',
+   'NumImportantColors' => 'Num Important Colours',
+   'OpColor' => 'Op Colour',
+   'PF25ColorMatrix' => 'PF25 Colour Matrix',
+   'PaletteColorTableUID' => 'Palette Colour Table UID',
+   'PhotoEffect' => {
+      PrintConv => {
+        'My Color Data' => 'My Colour Data',
+      },
+    },
+   'PhotometricInterpretation' => {
+      PrintConv => {
+        'Color Filter Array' => 'Colour Filter Array',
+      },
+    },
+   'Photoshop2ColorTable' => 'Photoshop 2 Colour Table',
+   'PictureType' => {
+      PrintConv => {
+        'Bright(ly) Colored Fish' => 'Bright(ly) Coloured Fish',
+      },
+    },
+   'PortraitRawColorTone' => 'Portrait Raw Colour Tone',
+   'PresetWhiteBalance' => {
+      PrintConv => {
+        'Color Temperature' => 'Colour Temperature',
+      },
+    },
+   'PreviewColorSpace' => 'Preview Colour Space',
+   'ProfileClass' => {
+      PrintConv => {
+        'ColorSpace Conversion Profile' => 'ColourSpace Conversion Profile',
+        'NamedColor Profile' => 'Named Colour Profile',
+      },
+    },
+   'PseudoColorType' => 'Pseudo Colour Type',
+   'QuantizationMethod' => {
+      PrintConv => {
+        'Color Space Specific' => 'Colour Space Specific',
+      },
+    },
+   'RGBBkCol' => 'Background Colour',
+   'RGBFgCol' => 'Foreground Colour',
+   'ROIDisplayColor' => 'ROI Display Colour',
+   'RawColorAdj' => 'Raw Colour Adj',
+   'RawDevColorSpace' => 'Raw Dev Colour Space',
+   'RawDevMemoryColorEmphasis' => 'Raw Dev Memory Colour Emphasis',
+   'RawDevSettings' => {
+      PrintConv => {
+        'Color Space' => 'Colour Space',
+        'WB Color Temp' => 'WB Colour Temp',
+      },
+    },
+   'RawDevWhiteBalance' => {
+      PrintConv => {
+        'Color Temperature' => 'Colour Temperature',
+      },
+    },
+   'RedPaletteColorTableData' => 'Red Palette Colour Table Data',
+   'RedPaletteColorTableDescriptor' => 'Red Palette Colour Table Descriptor',
+   'RenderingIntent' => {
+      PrintConv => {
+        'ICC-Absolute Colorimetric' => 'ICC-Absolute Colourimetric',
+        'Media-Relative Colorimetric' => 'Media-Relative Colourimetric',
+      },
+    },
+   'RetouchHistory' => {
+      PrintConv => {
+        'Color Custom' => 'Colour Custom',
+        'Color Outline' => 'Colour Outline',
+      },
+    },
+   'SBAInputImageColorspace' => 'SBA Input Image Colourspace',
+   'SRGBRendering' => {
+      PrintConv => {
+        'Absolute Colorimetric' => 'Absolute Colourimetric',
+        'Relative Colorimetric' => 'Relative Colourimetric',
+      },
+    },
+   'SceneMode' => {
+      PrintConv => {
+        'Color Effects' => 'Colour Effects',
+        'My Color' => 'My Colour',
+      },
+    },
+   'ScreenMinimumColorBitDepth' => 'Screen Minimum Colour Bit Depth',
+   'SegmentedBlueColorTableData' => 'Segmented Blue Colour Table Data',
+   'SegmentedGreenColorTableData' => 'Segmented Green Colour Table Data',
+   'SegmentedRedColorTableData' => 'Segmented Red Colour Table Data',
+   'SensingMethod' => {
+      PrintConv => {
+        'Color sequential area' => 'Colour sequential area',
+        'Color sequential linear' => 'Colour sequential linear',
+        'One-chip color area' => 'One-chip colour area',
+        'Three-chip color area' => 'Three-chip colour area',
+        'Two-chip color area' => 'Two-chip colour area',
+      },
+    },
+   'ShootingMode' => {
+      PrintConv => {
+        'Color Effects' => 'Colour Effects',
+        'My Color' => 'My Colour',
+      },
+    },
+   'ShutterPresentationColorCIELabVal' => 'Shutter Presentation Colour CIE Lab Val',
+   'SpecialEffectsOpticalFilter' => {
+      PrintConv => {
+        'Colored' => 'Coloured',
+      },
+    },
+   'StandardRawColorTone' => 'Standard Raw Colour Tone',
+   'StdOutputColorMode' => 'Std Output Colour Mode',
+   'StreamColor' => 'Stream Colour',
+   'SubfileType' => {
+      PrintConv => {
+        'Color IW44' => 'Colour IW44',
+      },
+    },
+   'SubimageColor' => 'Subimage Colour',
+   'TestTarget' => {
+      PrintConv => {
+        'Color Chart' => 'Colour Chart',
+      },
+    },
+   'TypeOfOriginal' => {
+      PrintConv => {
+        'Color Document' => 'Colour Document',
+        'Color Print' => 'Colour Print',
+      },
+    },
+   'UCRBG' => 'Under Colour Removal & Black Gen.',
+   'USPTOOriginalContentType' => {
+      PrintConv => {
+        'Color' => 'Colour',
+      },
+    },
+   'UltrasoundColorDataPresent' => 'Ultrasound Colour Data Present',
+   'Unsharp1Color' => 'Unsharp 1 Colour',
+   'Unsharp2Color' => 'Unsharp 2 Colour',
+   'Unsharp3Color' => 'Unsharp 3 Colour',
+   'Unsharp4Color' => 'Unsharp 4 Colour',
+   'VideoAlphaPremultipleColorA' => 'Video Alpha Premultiple Colour A',
+   'VideoAlphaPremultipleColorB' => 'Video Alpha Premultiple Colour B',
+   'VideoAlphaPremultipleColorBlack' => 'Video Alpha Premultiple Colour Black',
+   'VideoAlphaPremultipleColorBlue' => 'Video Alpha Premultiple Colour Blue',
+   'VideoAlphaPremultipleColorCyan' => 'Video Alpha Premultiple Colour Cyan',
+   'VideoAlphaPremultipleColorGreen' => 'Video Alpha Premultiple Colour Green',
+   'VideoAlphaPremultipleColorL' => 'Video Alpha Premultiple Colour L',
+   'VideoAlphaPremultipleColorMagenta' => 'Video Alpha Premultiple Colour Magenta',
+   'VideoAlphaPremultipleColorMode' => 'Video Alpha Premultiple Colour Mode',
+   'VideoAlphaPremultipleColorRed' => 'Video Alpha Premultiple Colour Red',
+   'VideoAlphaPremultipleColorSwatchName' => 'Video Alpha Premultiple Colour Swatch Name',
+   'VideoAlphaPremultipleColorType' => 'Video Alpha Premultiple Colour Type',
+   'VideoAlphaPremultipleColorYellow' => 'Video Alpha Premultiple Colour Yellow',
+   'VideoColorSpace' => 'Video Colour Space',
+   'WBAdjColorTemp' => 'WB Adj Colour Temp',
+   'WBAdjLighting' => {
+      PrintConv => {
+        'High Color Rendering Fluorescent' => 'High Colour Rendering Fluorescent',
+      },
+    },
+   'WhiteBalance' => {
+      PrintConv => {
+        'Color Temperature/Color Filter' => 'Color Temperature/Colour Filter',
+      },
+    },
+   'WhiteBalanceSet' => {
+      PrintConv => {
+        'Set Color Temperature 1' => 'Set Colour Temperature 1',
+        'Set Color Temperature 2' => 'Set Colour Temperature 2',
+        'Set Color Temperature 3' => 'Set Colour Temperature 3',
+      },
+    },
+   'WhiteBalanceSetting' => {
+      PrintConv => {
+        'Color Temperature/Color Filter' => 'Colour Temperature/Colour Filter',
+      },
+    },
+   'WorkColorSpace' => {
+      Description => 'Work Colour Space',
+      PrintConv => {
+        'ColorMatch RGB' => 'ColourMatch RGB',
+      },
+    },
+   'XMethod' => {
+      PrintConv => {
+        'Color Closest Pixel and Alpha Linear Interpolation' => 'Colour Closest Pixel and Alpha Linear Interpolation',
+        'Color Linear Interpolation and Alpha Closest Pixel' => 'Colour Linear Interpolation and Alpha Closest Pixel',
+      },
+    },
+   'YMethod' => {
+      PrintConv => {
+        'Color Closest Pixel and Alpha Linear Interpolation' => 'Colour Closest Pixel and Alpha Linear Interpolation',
+        'Color Linear Interpolation and Alpha Closest Pixel' => 'Colour Linear Interpolation and Alpha Closest Pixel',
+      },
+    },
+);
+
+1;  # end
+
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Lang::en_ca.pm - ExifTool Canadian English language translations
+
+=head1 DESCRIPTION
+
+This file is used by Image::ExifTool to generate localized tag descriptions
+and values.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool(3pm)|Image::ExifTool>,
+L<Image::ExifTool::TagInfoXML(3pm)|Image::ExifTool::TagInfoXML>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/en_gb.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/en_gb.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/en_gb.pm	(revision 24799)
@@ -0,0 +1,572 @@
+#------------------------------------------------------------------------------
+# File:         en_gb.pm
+#
+# Description:  ExifTool British English language translations
+#
+# Notes:        This file generated automatically by Image::ExifTool::TagInfoXML
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Lang::en_gb;
+
+use strict;
+use vars qw($VERSION);
+
+$VERSION = '1.06';
+
+%Image::ExifTool::Lang::en_gb::Translate = (
+   'AlternateDuotoneColors' => 'Alternate Duotone Colours',
+   'AlternateSpotColors' => 'Alternate Spot Colours',
+   'ArtFilter' => {
+      PrintConv => {
+        'Pale & Light Color' => 'Pale & Light Colour',
+      },
+    },
+   'AutoLightingOptimizer' => 'Auto Lighting Optimiser',
+   'AutoLightingOptimizerOn' => 'Auto Lighting Optimiser On',
+   'BackgroundColor' => 'Background Colour',
+   'BackgroundColorIndicator' => {
+      Description => 'Background Colour Indicator',
+      PrintConv => {
+        'Specified Background Color' => 'Specified Background Colour',
+        'Unspecified Background Color' => 'Unspecified Background Colour',
+      },
+    },
+   'BackgroundColorValue' => 'Background Colour Value',
+   'BasicColorImageSequence' => 'Basic Colour Image Sequence',
+   'BkColor' => 'Background Colour',
+   'BluePaletteColorTableData' => 'Blue Palette Colour Table Data',
+   'BluePaletteColorTableDescriptor' => 'Blue Palette Colour Table Descriptor',
+   'BorderColor' => 'Border Colour',
+   'CFAPlaneColor' => 'CFA Plane Colour',
+   'CameraColorCalibration01' => 'Camera Colour Calibration 01',
+   'CameraColorCalibration02' => 'Camera Colour Calibration 02',
+   'CameraColorCalibration03' => 'Camera Colour Calibration 03',
+   'CameraColorCalibration04' => 'Camera Colour Calibration 04',
+   'CameraColorCalibration05' => 'Camera Colour Calibration 05',
+   'CameraColorCalibration06' => 'Camera Colour Calibration 06',
+   'CameraColorCalibration07' => 'Camera Colour Calibration 07',
+   'CameraColorCalibration08' => 'Camera Colour Calibration 08',
+   'CameraColorCalibration09' => 'Camera Colour Calibration 09',
+   'CameraColorCalibration10' => 'Camera Colour Calibration 10',
+   'CameraColorCalibration11' => 'Camera Colour Calibration 11',
+   'CameraColorCalibration12' => 'Camera Colour Calibration 12',
+   'CameraColorCalibration13' => 'Camera Colour Calibration 13',
+   'CameraColorCalibration14' => 'Camera Colour Calibration 14',
+   'CameraColorCalibration15' => 'Camera Colour Calibration 15',
+   'CanonColorInfo1' => 'Canon Colour Info 1',
+   'CanonColorInfo2' => 'Canon Colour Info 2',
+   'ChromaticityColorant' => 'Chromaticity Colourant',
+   'Color' => 'Colour',
+   'ColorAberrationControl' => 'Colour Aberration Control',
+   'ColorAdjustment' => 'Colour Adjustment',
+   'ColorAdjustmentMode' => 'Colour Adjustment Mode',
+   'ColorAverages' => 'Colour Averages',
+   'ColorBW' => 'Colour BW',
+   'ColorBalance' => 'Colour Balance',
+   'ColorBalanceAdj' => 'Colour Balance Adj',
+   'ColorBalanceBlue' => 'Colour Balance Blue',
+   'ColorBalanceGreen' => 'Colour Balance Green',
+   'ColorBalanceRed' => 'Colour Balance Red',
+   'ColorBalanceUnknown' => 'Colour Balance Unknown',
+   'ColorBitDepth' => 'Colour Bit Depth',
+   'ColorBlur' => 'Colour Blur',
+   'ColorBoostLevel' => 'Colour Boost Level',
+   'ColorBoostType' => 'Colour Boost Type',
+   'ColorBooster' => 'Colour Booster',
+   'ColorCalibrationMatrix' => 'Colour Calibration Matrix',
+   'ColorCasts' => 'Colour Casts',
+   'ColorCharacterization' => 'Colour Characterization',
+   'ColorClass' => 'Colour Class',
+   'ColorCompensationFilter' => 'Colour Compensation Filter',
+   'ColorComponents' => 'Colour Components',
+   'ColorControl' => 'Colour Control',
+   'ColorCorrection' => 'Colour Correction',
+   'ColorDataVersion' => 'Colour Data Version',
+   'ColorEffect' => 'Colour Effect',
+   'ColorFilter' => 'Colour Filter',
+   'ColorGain' => 'Colour Gain',
+   'ColorGroup' => 'Colour Group',
+   'ColorHalftoningInfo' => 'Colour Halftoning Info',
+   'ColorHue' => 'Colour Hue',
+   'ColorImagePrintingFlag' => 'Colour Image Printing Flag',
+   'ColorMap' => 'Colour Map',
+   'ColorMatrix' => 'Colour Matrix',
+   'ColorMatrix1' => 'Colour Matrix 1',
+   'ColorMatrix2' => 'Colour Matrix 2',
+   'ColorMatrixA' => 'Colour Matrix A',
+   'ColorMatrixB' => 'Colour Matrix B',
+   'ColorMatrixNumber' => 'Colour Matrix Number',
+   'ColorMode' => {
+      Description => 'Colour Mode',
+      PrintConv => {
+        'Natural color' => 'Natural colour',
+        'Neutral Color' => 'Neutral Colour',
+        'Saturated Color' => 'Saturated Colour',
+        'Vivid color' => 'Vivid colour',
+      },
+    },
+   'ColorMoireReduction' => 'Colour Moire Reduction',
+   'ColorMoireReductionMode' => 'Colour Moire Reduction Mode',
+   'ColorNoiseReduction' => 'Colour Noise Reduction',
+   'ColorNoiseReductionIntensity' => 'Colour Noise Reduction Intensity',
+   'ColorNoiseReductionSharpness' => 'Colour Noise Reduction Sharpness',
+   'ColorObjBackType' => 'Colour Obj Back Type',
+   'ColorObjName' => 'Colour Obj Name',
+   'ColorObjType' => 'Colour Obj Type',
+   'ColorObjVersion' => 'Colour Obj Version',
+   'ColorPalette' => 'Colour Palette',
+   'ColorPlanes' => 'Colour Planes',
+   'ColorProfile' => 'Colour Profile',
+   'ColorRepresentation' => 'Colour Representation',
+   'ColorReproduction' => 'Colour Reproduction',
+   'ColorResolutionDepth' => 'Colour Resolution Depth',
+   'ColorResponseUnit' => 'Colour Response Unit',
+   'ColorSamplersResource' => 'Colour Samplers Resource',
+   'ColorSequence' => 'Colour Sequence',
+   'ColorSpace' => {
+      Description => 'Colour Space',
+      PrintConv => {
+        'No color space specified' => 'No colour space specified',
+      },
+    },
+   'ColorSpaceData' => 'Colour Space Data',
+   'ColorSpecification' => 'Colour Specification',
+   'ColorTable' => 'Colour Table',
+   'ColorTempAsShot' => 'Colour Temp As Shot',
+   'ColorTempAuto' => 'Colour Temp Auto',
+   'ColorTempCloudy' => 'Colour Temp Cloudy',
+   'ColorTempCustom' => 'Colour Temp Custom',
+   'ColorTempCustom1' => 'Colour Temp Custom 1',
+   'ColorTempCustom2' => 'Colour Temp Custom 2',
+   'ColorTempDaylight' => 'Colour Temp Daylight',
+   'ColorTempFlash' => 'Colour Temp Flash',
+   'ColorTempFlashData' => 'Colour Temp Flash Data',
+   'ColorTempFluorescent' => 'Colour Temp Fluorescent',
+   'ColorTempKelvin' => 'Colour Temp Kelvin',
+   'ColorTempMeasured' => 'Colour Temp Measured',
+   'ColorTempPC1' => 'Colour Temp PC1',
+   'ColorTempPC2' => 'Colour Temp PC2',
+   'ColorTempPC3' => 'Colour Temp PC3',
+   'ColorTempShade' => 'Colour Temp Shade',
+   'ColorTempTungsten' => 'Colour Temp Tungsten',
+   'ColorTempUnknown' => 'Colour Temp Unknown',
+   'ColorTempUnknown10' => 'Colour Temp Unknown 10',
+   'ColorTempUnknown11' => 'Colour Temp Unknown 11',
+   'ColorTempUnknown12' => 'Colour Temp Unknown 12',
+   'ColorTempUnknown13' => 'Colour Temp Unknown 13',
+   'ColorTempUnknown14' => 'Colour Temp Unknown 14',
+   'ColorTempUnknown15' => 'Colour Temp Unknown 15',
+   'ColorTempUnknown16' => 'Colour Temp Unknown 16',
+   'ColorTempUnknown2' => 'Colour Temp Unknown 2',
+   'ColorTempUnknown3' => 'Colour Temp Unknown 3',
+   'ColorTempUnknown4' => 'Colour Temp Unknown 4',
+   'ColorTempUnknown5' => 'Colour Temp Unknown 5',
+   'ColorTempUnknown6' => 'Colour Temp Unknown 6',
+   'ColorTempUnknown7' => 'Colour Temp Unknown 7',
+   'ColorTempUnknown8' => 'Colour Temp Unknown 8',
+   'ColorTempUnknown9' => 'Colour Temp Unknown 9',
+   'ColorTemperature' => 'Colour Temperature',
+   'ColorTemperatureAdj' => 'Colour Temperature Adj',
+   'ColorTemperatureBG' => 'Colour Temperature BG',
+   'ColorTemperatureRG' => 'Colour Temperature RG',
+   'ColorTemperatureSetting' => {
+      Description => 'Colour Temperature Setting',
+      PrintConv => {
+        'Color Filter' => 'Colour Filter',
+      },
+    },
+   'ColorTone' => 'Colour Tone',
+   'ColorToneAdj' => 'Colour Tone Adj',
+   'ColorToneFaithful' => 'Colour Tone Faithful',
+   'ColorToneLandscape' => 'Colour Tone Landscape',
+   'ColorToneNeutral' => 'Colour Tone Neutral',
+   'ColorTonePortrait' => 'Colour Tone Portrait',
+   'ColorToneStandard' => 'Colour Tone Standard',
+   'ColorToneUserDef1' => 'Colour Tone User Def 1',
+   'ColorToneUserDef2' => 'Colour Tone User Def 2',
+   'ColorToneUserDef3' => 'Colour Tone User Def 3',
+   'ColorTransferFuncs' => 'Colour Transfer Funcs',
+   'ColorTransform' => 'Colour Transform',
+   'ColorTwistMatrix' => 'Colour Twist Matrix',
+   'ColorType' => {
+      Description => 'Colour Type',
+      PrintConv => {
+        'Color' => 'Colour',
+        'Color Alpha' => 'Colour Alpha',
+      },
+    },
+   'Colorant1Coordinates' => 'Colourant 1 Coordinates',
+   'Colorant1Name' => 'Colourant 1 Name',
+   'Colorant2Coordinates' => 'Colourant 2 Coordinates',
+   'Colorant2Name' => 'Colourant 2 Name',
+   'Colorant3Coordinates' => 'Colourant 3 Coordinates',
+   'Colorant3Name' => 'Colourant 3 Name',
+   'ColorantA' => 'Colourant A',
+   'ColorantB' => 'Colourant B',
+   'ColorantBlack' => 'Colourant Black',
+   'ColorantBlue' => 'Colourant Blue',
+   'ColorantCount' => 'Colourant Count',
+   'ColorantCyan' => 'Colourant Cyan',
+   'ColorantGreen' => 'Colourant Green',
+   'ColorantL' => 'Colourant L',
+   'ColorantMagenta' => 'Colourant Magenta',
+   'ColorantMode' => 'Colourant Mode',
+   'ColorantOrder' => 'Colourant Order',
+   'ColorantRed' => 'Colourant Red',
+   'ColorantSwatchName' => 'Colourant Swatch Name',
+   'ColorantTableOut' => 'Colourant Table Out',
+   'ColorantType' => 'Colourant Type',
+   'ColorantYellow' => 'Colourant Yellow',
+   'ColorimetricReference' => 'Colourimetric Reference',
+   'Colors' => 'Colours',
+   'Colorspace' => 'Colourspace',
+   'Compression' => {
+      PrintConv => {
+        'JBIG Color' => 'JBIG Colour',
+      },
+    },
+   'ContrastMode' => {
+      PrintConv => {
+        'Dynamic (Color Film)' => 'Dynamic (Colour Film)',
+        'Dynamic Art (My Color)' => 'Dynamic Art (My Colour)',
+        'Elegant (My Color)' => 'Elegant (My Colour)',
+        'Nature (Color Film)' => 'Nature (Colour Film)',
+        'Nostalgic (Color Film)' => 'Nostalgic (Colour Film)',
+        'Retro (My Color)' => 'Retro (My Colour)',
+        'Smooth (Color Film) or Pure (My Color)' => 'Smooth (Colour Film) or Pure (My Colour)',
+        'Vibrant (Color Film) or Expressive (My Color)' => 'Vibrant (Colour Film) or Expressive (My Colour)',
+      },
+    },
+   'D-LightingHQColorBoost' => 'D-Lighting HQ Colour Boost',
+   'D-LightingHSColorBoost' => 'D-Lighting HS Colour Boost',
+   'DateTimeDigitized' => 'Date/Time Digitised',
+   'DefHilite' => 'Use Default Highlight Colour',
+   'DefaultImageColor' => 'Default Image Colour',
+   'DeltaType' => {
+      PrintConv => {
+        'Color Addition' => 'Colour Addition',
+        'Color Replacement' => 'Colour Replacement',
+      },
+    },
+   'DisplayUnits' => {
+      PrintConv => {
+        'meters' => 'Metres',
+      },
+    },
+   'DynamicRangeOptimizer' => 'Dynamic Range Optimiser',
+   'EasyMode' => {
+      PrintConv => {
+        'Color Accent' => 'Colour Accent',
+        'Color Swap' => 'Colour Swap',
+        'My Colors' => 'My Colours',
+      },
+    },
+   'FaithfulRawColorTone' => 'Faithful Raw Colour Tone',
+   'FaxProfile' => {
+      PrintConv => {
+        'Lossless color and grayscale, L' => 'Lossless colour and grayscale, L',
+        'Lossy color and grayscale, C' => 'Lossy colour and grayscale, C',
+      },
+    },
+   'FgColor' => 'Foreground Colour',
+   'FileFormat' => {
+      PrintConv => {
+        'JPEG (lossy/non-quantization toggled)' => 'JPEG (lossy/non-quantisation toggled)',
+        'JPEG (non-quantization)' => 'JPEG (non-quantisation)',
+      },
+    },
+   'FilmMode' => {
+      PrintConv => {
+        'Dynamic (color)' => 'Dynamic (colour)',
+        'Nature (color)' => 'Nature (colour)',
+        'Smooth (color)' => 'Smooth (colour)',
+        'Standard (color)' => 'Standard (colour)',
+      },
+    },
+   'FlashColorFilter' => 'Flash Colour Filter',
+   'GenOpColor' => 'Gen Op Colour',
+   'GreenPaletteColorTableData' => 'Green Palette Colour Table Data',
+   'GreenPaletteColorTableDescriptor' => 'Green Palette Colour Table Descriptor',
+   'HasColorMap' => 'Has Colour Map',
+   'HighlightColorDistortReduct' => 'Highlight Colour Distort Reduct',
+   'HiliteColor' => 'Highlight Colour',
+   'ImageAlterationConstraints' => {
+      PrintConv => {
+        'No Colorization' => 'No Colourization',
+        'No De-Colorization' => 'No De-Colourization',
+      },
+    },
+   'ImageColor' => 'Image Colour',
+   'ImageColorIndicator' => {
+      Description => 'Image Colour Indicator',
+      PrintConv => {
+        'Specified Image Color' => 'Specified Image Colour',
+        'Unspecified Image Color' => 'Unspecified Image Colour',
+      },
+    },
+   'ImageColorValue' => 'Image Colour Value',
+   'ImageOptimization' => 'Image Optimisation',
+   'InitializedDataSize' => 'Initialised Data Size',
+   'InterchangeColorSpace' => 'Interchange Colour Space',
+   'LandscapeRawColorTone' => 'Landscape Raw Colour Tone',
+   'LargeBluePaletteColorTableData' => 'Large Blue Palette Colour Table Data',
+   'LargeBluePaletteColorTableDescr' => 'Large Blue Palette Colour Table Descr',
+   'LargeGreenPaletteColorTableData' => 'Large Green Palette Colour Table Data',
+   'LargeGreenPaletteColorTableDescr' => 'Large Green Palette Colour Table Descr',
+   'LargePaletteColorLookupTableUID' => 'Large Palette Colour Lookup Table UID',
+   'LargeRedPaletteColorTableData' => 'Large Red Palette Colour Table Data',
+   'LargeRedPaletteColorTableDescr' => 'Large Red Palette Colour Table Descr',
+   'MDColorTable' => 'MD Colour Table',
+   'MagicFilter' => {
+      PrintConv => {
+        'Pale & Light Color' => 'Pale & Light Colour',
+      },
+    },
+   'MandatoryBackground' => {
+      PrintConv => {
+        'Color Advisory, Image Mandatory' => 'Colour Advisory, Image Mandatory',
+        'Color Mandatory, Image Advisory' => 'Colour Mandatory, Image Advisory',
+        'Color and Image Advisory' => 'Colour and Image Advisory',
+        'Color and Image Mandatory' => 'Colour and Image Mandatory',
+      },
+    },
+   'MattColor' => 'Matt Colour',
+   'ModifiedColorTemp' => 'Modified Colour Temp',
+   'MyColorMode' => {
+      Description => 'My Colour Mode',
+      PrintConv => {
+        'Color Accent' => 'Colour Accent',
+        'Color Swap' => 'Colour Swap',
+      },
+    },
+   'NamedColor' => 'Named Colour',
+   'NamedColor2' => 'Named Colour 2',
+   'NeutralRawColorTone' => 'Neutral Raw Colour Tone',
+   'NewColorType' => 'New Colour Type',
+   'NumColors' => 'Num Colours',
+   'NumImportantColors' => 'Num Important Colours',
+   'OpColor' => 'Op Colour',
+   'PF25ColorMatrix' => 'PF25 Colour Matrix',
+   'PaletteColorTableUID' => 'Palette Colour Table UID',
+   'PhotoEffect' => {
+      PrintConv => {
+        'My Color Data' => 'My Colour Data',
+      },
+    },
+   'PhotometricInterpretation' => {
+      PrintConv => {
+        'Color Filter Array' => 'Colour Filter Array',
+      },
+    },
+   'Photoshop2ColorTable' => 'Photoshop 2 Colour Table',
+   'PictureType' => {
+      PrintConv => {
+        'Bright(ly) Colored Fish' => 'Bright(ly) Coloured Fish',
+      },
+    },
+   'PortraitRawColorTone' => 'Portrait Raw Colour Tone',
+   'PresetWhiteBalance' => {
+      PrintConv => {
+        'Color Temperature' => 'Colour Temperature',
+      },
+    },
+   'PreviewColorSpace' => 'Preview Colour Space',
+   'ProfileClass' => {
+      PrintConv => {
+        'ColorSpace Conversion Profile' => 'ColourSpace Conversion Profile',
+        'NamedColor Profile' => 'Named Colour Profile',
+      },
+    },
+   'PseudoColorType' => 'Pseudo Colour Type',
+   'QuantizationMethod' => {
+      Description => 'Quantisation Method',
+      PrintConv => {
+        'Color Space Specific' => 'Colour Space Specific',
+      },
+    },
+   'RGBBkCol' => 'Background Colour',
+   'RGBFgCol' => 'Foreground Colour',
+   'ROIDisplayColor' => 'ROI Display Colour',
+   'RawColorAdj' => 'Raw Colour Adj',
+   'RawDevColorSpace' => 'Raw Dev Colour Space',
+   'RawDevMemoryColorEmphasis' => 'Raw Dev Memory Colour Emphasis',
+   'RawDevSettings' => {
+      PrintConv => {
+        'Color Space' => 'Colour Space',
+        'WB Color Temp' => 'WB Colour Temp',
+      },
+    },
+   'RawDevWhiteBalance' => {
+      PrintConv => {
+        'Color Temperature' => 'Colour Temperature',
+      },
+    },
+   'RedPaletteColorTableData' => 'Red Palette Colour Table Data',
+   'RedPaletteColorTableDescriptor' => 'Red Palette Colour Table Descriptor',
+   'RenderingIntent' => {
+      PrintConv => {
+        'ICC-Absolute Colorimetric' => 'ICC-Absolute Colourimetric',
+        'Media-Relative Colorimetric' => 'Media-Relative Colourimetric',
+      },
+    },
+   'RetouchHistory' => {
+      PrintConv => {
+        'Color Custom' => 'Colour Custom',
+        'Color Outline' => 'Colour Outline',
+      },
+    },
+   'SBAInputImageColorspace' => 'SBA Input Image Colourspace',
+   'SRGBRendering' => {
+      PrintConv => {
+        'Absolute Colorimetric' => 'Absolute Colourimetric',
+        'Relative Colorimetric' => 'Relative Colourimetric',
+      },
+    },
+   'SceneMode' => {
+      PrintConv => {
+        'Color Effects' => 'Colour Effects',
+        'My Color' => 'My Colour',
+      },
+    },
+   'ScreenMinimumColorBitDepth' => 'Screen Minimum Colour Bit Depth',
+   'SegmentedBlueColorTableData' => 'Segmented Blue Colour Table Data',
+   'SegmentedGreenColorTableData' => 'Segmented Green Colour Table Data',
+   'SegmentedRedColorTableData' => 'Segmented Red Colour Table Data',
+   'SensingMethod' => {
+      PrintConv => {
+        'Color sequential area' => 'Colour sequential area',
+        'Color sequential linear' => 'Colour sequential linear',
+        'One-chip color area' => 'One-chip colour area',
+        'Three-chip color area' => 'Three-chip colour area',
+        'Two-chip color area' => 'Two-chip colour area',
+      },
+    },
+   'ShootingMode' => {
+      PrintConv => {
+        'Color Effects' => 'Colour Effects',
+        'My Color' => 'My Colour',
+      },
+    },
+   'ShutterPresentationColorCIELabVal' => 'Shutter Presentation Colour CIE Lab Val',
+   'SpecialEffectsOpticalFilter' => {
+      PrintConv => {
+        'Colored' => 'Coloured',
+      },
+    },
+   'StandardRawColorTone' => 'Standard Raw Colour Tone',
+   'StdOutputColorMode' => 'Std Output Colour Mode',
+   'StreamColor' => 'Stream Colour',
+   'SubSecTimeDigitized' => 'Sub Sec Time Digitised',
+   'SubfileType' => {
+      PrintConv => {
+        'Color IW44' => 'Colour IW44',
+      },
+    },
+   'SubimageColor' => 'Subimage Colour',
+   'TestTarget' => {
+      PrintConv => {
+        'Color Chart' => 'Colour Chart',
+      },
+    },
+   'TypeOfOriginal' => {
+      PrintConv => {
+        'Color Document' => 'Colour Document',
+        'Color Print' => 'Colour Print',
+      },
+    },
+   'UCRBG' => 'Under Colour Removal & Black Gen.',
+   'USPTOOriginalContentType' => {
+      PrintConv => {
+        'Color' => 'Colour',
+      },
+    },
+   'UltrasoundColorDataPresent' => 'Ultrasound Colour Data Present',
+   'UninitializedDataSize' => 'Uninitialised Data Size',
+   'Unsharp1Color' => 'Unsharp 1 Colour',
+   'Unsharp2Color' => 'Unsharp 2 Colour',
+   'Unsharp3Color' => 'Unsharp 3 Colour',
+   'Unsharp4Color' => 'Unsharp 4 Colour',
+   'VideoAlphaPremultipleColorA' => 'Video Alpha Premultiple Colour A',
+   'VideoAlphaPremultipleColorB' => 'Video Alpha Premultiple Colour B',
+   'VideoAlphaPremultipleColorBlack' => 'Video Alpha Premultiple Colour Black',
+   'VideoAlphaPremultipleColorBlue' => 'Video Alpha Premultiple Colour Blue',
+   'VideoAlphaPremultipleColorCyan' => 'Video Alpha Premultiple Colour Cyan',
+   'VideoAlphaPremultipleColorGreen' => 'Video Alpha Premultiple Colour Green',
+   'VideoAlphaPremultipleColorL' => 'Video Alpha Premultiple Colour L',
+   'VideoAlphaPremultipleColorMagenta' => 'Video Alpha Premultiple Colour Magenta',
+   'VideoAlphaPremultipleColorMode' => 'Video Alpha Premultiple Colour Mode',
+   'VideoAlphaPremultipleColorRed' => 'Video Alpha Premultiple Colour Red',
+   'VideoAlphaPremultipleColorSwatchName' => 'Video Alpha Premultiple Colour Swatch Name',
+   'VideoAlphaPremultipleColorType' => 'Video Alpha Premultiple Colour Type',
+   'VideoAlphaPremultipleColorYellow' => 'Video Alpha Premultiple Colour Yellow',
+   'VideoColorSpace' => 'Video Colour Space',
+   'WBAdjColorTemp' => 'WB Adj Colour Temp',
+   'WBAdjLighting' => {
+      PrintConv => {
+        'High Color Rendering Fluorescent' => 'High Colour Rendering Fluorescent',
+      },
+    },
+   'WhiteBalance' => {
+      PrintConv => {
+        'Color Temperature/Color Filter' => 'Color Temperature/Colour Filter',
+      },
+    },
+   'WhiteBalanceSet' => {
+      PrintConv => {
+        'Set Color Temperature 1' => 'Set Colour Temperature 1',
+        'Set Color Temperature 2' => 'Set Colour Temperature 2',
+        'Set Color Temperature 3' => 'Set Colour Temperature 3',
+      },
+    },
+   'WhiteBalanceSetting' => {
+      PrintConv => {
+        'Color Temperature/Color Filter' => 'Colour Temperature/Colour Filter',
+      },
+    },
+   'WorkColorSpace' => {
+      Description => 'Work Colour Space',
+      PrintConv => {
+        'ColorMatch RGB' => 'ColourMatch RGB',
+      },
+    },
+   'XMethod' => {
+      PrintConv => {
+        'Color Closest Pixel and Alpha Linear Interpolation' => 'Colour Closest Pixel and Alpha Linear Interpolation',
+        'Color Linear Interpolation and Alpha Closest Pixel' => 'Colour Linear Interpolation and Alpha Closest Pixel',
+      },
+    },
+   'YMethod' => {
+      PrintConv => {
+        'Color Closest Pixel and Alpha Linear Interpolation' => 'Colour Closest Pixel and Alpha Linear Interpolation',
+        'Color Linear Interpolation and Alpha Closest Pixel' => 'Colour Linear Interpolation and Alpha Closest Pixel',
+      },
+    },
+);
+
+1;  # end
+
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Lang::en_gb.pm - ExifTool British English language translations
+
+=head1 DESCRIPTION
+
+This file is used by Image::ExifTool to generate localized tag descriptions
+and values.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool(3pm)|Image::ExifTool>,
+L<Image::ExifTool::TagInfoXML(3pm)|Image::ExifTool::TagInfoXML>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/es.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/es.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/es.pm	(revision 24799)
@@ -0,0 +1,1711 @@
+#------------------------------------------------------------------------------
+# File:         es.pm
+#
+# Description:  ExifTool Spanish language translations
+#
+# Notes:        This file generated automatically by Image::ExifTool::TagInfoXML
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Lang::es;
+
+use strict;
+use vars qw($VERSION);
+
+$VERSION = '1.06';
+
+%Image::ExifTool::Lang::es::Translate = (
+   'AFMicroAdjActive' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'AFMode' => 'Modo AF',
+   'ARMIdentifier' => 'Identificador ARM',
+   'ARMVersion' => 'VersiÃ³n ARM',
+   'AToB0' => 'A a B0',
+   'AToB1' => 'A a B1',
+   'AToB2' => 'A a B2',
+   'ActionAdvised' => {
+      Description => 'AcciÃ³n Aconsejada',
+      PrintConv => {
+        'Object Kill' => 'Destruir Objecto',
+        'Object Reference' => 'Referencia Objecto',
+        'Object Replace' => 'Reemplazar Objecto',
+        'Ojbect Append' => 'AÃ±adir Objeto',
+      },
+    },
+   'ActiveArea' => 'Ãrea Activa',
+   'AdjustmentMode' => 'Modo Ajuste',
+   'Album' => 'Ãlbum',
+   'AlphaByteCount' => 'NÃºmero Byte Alfa',
+   'AlphaDataDiscard' => {
+      Description => 'Datos Alfa Descartados',
+      PrintConv => {
+        'Flexbits Discarded' => 'FlexBits Descartado',
+        'Full Resolution' => 'ResoluciÃ³n Total',
+        'HighPass Frequency Data Discarded' => 'Datos Frecuencia High-Pass Descartados',
+        'Highpass and LowPass Frequency Data Discarded' => 'Dato Frecuencia High-Pass y Low-Pass Descartados',
+      },
+    },
+   'AlphaOffset' => 'Offset Alfa',
+   'AnalogBalance' => 'Balance AnalÃ³gico',
+   'AntiAliasStrength' => 'Potencia Relativa del Filtro Antialiasing',
+   'Aperture' => 'Abertura',
+   'ApertureValue' => 'Abertura',
+   'ApplicationRecordVersion' => 'VersiÃ³n Registro AplicaciÃ³n',
+   'Artist' => 'Persona que CreÃ³ la Imagen',
+   'AsShotICCProfile' => 'Perfil ICC Captura',
+   'AsShotNeutral' => 'Captura Neutral',
+   'AsShotPreProfileMatrix' => 'Matriz Pre Perfil Captura',
+   'AsShotProfileName' => 'Nombre Perfil Captura',
+   'AsShotWhiteXY' => 'Captura Blanco X-Y',
+   'Audio' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'AudioDuration' => 'DuraciÃ³n Audio',
+   'AudioOutcue' => 'Cola Audio',
+   'AudioSamplingRate' => 'Ratio Muestreo Audio',
+   'AudioSamplingResolution' => 'ResoluciÃ³n Muestreo Audio',
+   'AudioType' => {
+      Description => 'Tipo Audio',
+      PrintConv => {
+        'Mono Actuality' => 'Actualidad (audio mono (1 canal))',
+        'Mono Music' => 'MÃºsica transmitida por si misma (audio mono (1 canal))',
+        'Mono Question and Answer Session' => 'SesiÃ³n pregunta y respuesta (audio mono (1 canal))',
+        'Mono Raw Sound' => 'Sonido bruto (audio mono (1 canal))',
+        'Mono Response to a Question' => 'Respuesta a una pregunta (audio mono (1 canal))',
+        'Mono Scener' => 'Escena (audio mono (1 canal))',
+        'Mono Voicer' => 'Voz (audio mono (1 canal))',
+        'Mono Wrap' => 'Envolvente (audio mono (1 canal))',
+        'Stereo Actuality' => 'Actualidad (audio estÃ©reo (2 canales))',
+        'Stereo Music' => 'MÃºsica transmitida por si misma (audio estÃ©reo (2 canales))',
+        'Stereo Question and Answer Session' => 'SesiÃ³n pregunta y respuesta (audio estÃ©reo (2 canales))',
+        'Stereo Raw Sound' => 'Sonido bruto (audio estÃ©reo (2 canales))',
+        'Stereo Response to a Question' => 'Respuesta a una pregunta (audio estÃ©reo (2 canales))',
+        'Stereo Scener' => 'Escena (audio estÃ©reo (2 canales))',
+        'Stereo Voicer' => 'Voz (audio estÃ©reo (2 canales))',
+        'Stereo Wrap' => 'Envolvente (audio estÃ©reo (2 canales))',
+        'Text Only' => 'Solo texto (sin dato de objeto)',
+      },
+    },
+   'Author' => 'Autor',
+   'AuthorsPosition' => 'PosiciÃ³n del Autor',
+   'AutoBracket' => 'Auto-horquillado',
+   'AutoLightingOptimizerOn' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'AutoRotate' => {
+      PrintConv => {
+        'Rotate 180' => 'Rotar 180Â°',
+        'Rotate 270 CW' => 'Rotar 270Â° sentido reloj',
+        'Rotate 90 CW' => 'Rotar 90Â° sentido reloj',
+      },
+    },
+   'BToA0' => 'B a A0',
+   'BToA1' => 'B a A1',
+   'BToA2' => 'B a A2',
+   'BackgroundColorIndicator' => 'Indicador Color Fondo',
+   'BackgroundColorValue' => 'Valor Color Fondo',
+   'BackgroundTiling' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'BadFaxLines' => 'LÃ­neas Fax Malas',
+   'BaselineExposure' => 'ExposiciÃ³n Base',
+   'BaselineNoise' => 'Ruido Base',
+   'BaselineSharpness' => 'Nitidez Base',
+   'BatteryLevel' => 'Nivel BaterÃ­a',
+   'BayerGreenSplit' => 'Mosaico Bayer Verde',
+   'BestQualityScale' => 'Escala Mayor Calidad',
+   'BitsPerComponent' => 'Bits Por Componente',
+   'BitsPerExtendedRunLength' => 'Bits Por "Run Length" Extendido',
+   'BitsPerRunLength' => 'Bits Por "Run Length"',
+   'BitsPerSample' => 'NÃºmero de Bits Por Componente',
+   'BlackLevel' => 'Nivel Negro',
+   'BlackLevelDeltaH' => 'Nivel Negro Delta H',
+   'BlackLevelDeltaV' => 'Nivel Negro Delta V',
+   'BlackLevelRepeatDim' => 'DimensiÃ³n RepeticiÃ³n Nivel Negro',
+   'BlueMatrixColumn' => 'Columna Matriz Azul',
+   'BlueTRC' => 'Curva ReproducciÃ³n Tono Azul',
+   'Brightness' => 'Brillo',
+   'BrightnessValue' => 'Luminosidad',
+   'By-line' => 'Creador',
+   'By-lineTitle' => 'Puesto del Creador',
+   'CFALayout' => {
+      Description => 'DistribuciÃ³n CFA',
+      PrintConv => {
+        'Even columns offset down 1/2 row' => 'DistribuciÃ³n escalonada A: columnas pares son movidas hacia abajo 1/2 fila',
+        'Even columns offset up 1/2 row' => 'DistribuciÃ³n escalonada B: columnas pares son movidas hacia arriba 1/2 fila',
+        'Even rows offset left 1/2 column' => 'DistribuciÃ³n escalonada D: filas pares son movidas a la izquierda 1/2 columna',
+        'Even rows offset right 1/2 column' => 'DistribuciÃ³n escalonada C: filas pares son movidas a la derecha 1/2 columna',
+        'Rectangular' => 'DistribuciÃ³n Rectangular (o cuadrada)',
+      },
+    },
+   'CFAPattern' => 'PatrÃ³n CFA',
+   'CFAPattern2' => 'PatrÃ³n CFA 2',
+   'CFAPlaneColor' => 'Color Plano CFA',
+   'CFARepeatPatternDim' => 'DimensiÃ³n PatrÃ³n RepeticiÃ³n CFA',
+   'CMMFlags' => 'Banderas CMM',
+   'CMYKEquivalent' => 'CMYK Equivalente',
+   'CalibrationDateTime' => 'Fecha y Hora CalibraciÃ³n',
+   'CalibrationIlluminant1' => {
+      Description => 'CalibraciÃ³n IluminaciÃ³n 1',
+      PrintConv => {
+        'Cloudy' => 'Tiempo nuboso',
+        'Cool White Fluorescent' => 'Fluorescente blanco cÃ¡lido (W 3800 - 4500K)',
+        'Day White Fluorescent' => 'Fluorescente blanco dÃ­a (N 4600 - 5500K)',
+        'Daylight' => 'Luz del dÃ­a',
+        'Daylight Fluorescent' => 'Fluorescente luz del dÃ­a (D 5700 - 7100K)',
+        'Fine Weather' => 'Buen tiempo',
+        'Fluorescent' => 'Fluorescente',
+        'ISO Studio Tungsten' => 'Tungsteno estudio ISO',
+        'Other' => 'Otras Fuentes Luz',
+        'Shade' => 'Sombra',
+        'Standard Light A' => 'Luz estandar A',
+        'Standard Light B' => 'Luz estandar B',
+        'Standard Light C' => 'Luz estandar C',
+        'Tungsten (Incandescent)' => 'Tungsteno (luz incandescente)',
+        'Unknown' => 'Desconocido',
+        'Warm White Fluorescent' => 'Fluorescente blanco cÃ¡lido (L 2600 - 3250K)',
+        'White Fluorescent' => 'Fluorescente blanco (WW 3250 - 3800K)',
+      },
+    },
+   'CalibrationIlluminant2' => {
+      Description => 'CalibraciÃ³n IluminaciÃ³n 2',
+      PrintConv => {
+        'Cloudy' => 'Tiempo nuboso',
+        'Cool White Fluorescent' => 'Fluorescente blanco cÃ¡lido (W 3800 - 4500K)',
+        'Day White Fluorescent' => 'Fluorescente blanco dÃ­a (N 4600 - 5500K)',
+        'Daylight' => 'Luz del dÃ­a',
+        'Daylight Fluorescent' => 'Fluorescente luz del dÃ­a (D 5700 - 7100K)',
+        'Fine Weather' => 'Buen tiempo',
+        'Fluorescent' => 'Fluorescente',
+        'ISO Studio Tungsten' => 'Tungsteno estudio ISO',
+        'Other' => 'Otras Fuentes Luz',
+        'Shade' => 'Sombra',
+        'Standard Light A' => 'Luz estandar A',
+        'Standard Light B' => 'Luz estandar B',
+        'Standard Light C' => 'Luz estandar C',
+        'Tungsten (Incandescent)' => 'Tungsteno (luz incandescente)',
+        'Unknown' => 'Desconocido',
+        'Warm White Fluorescent' => 'Fluorescente blanco cÃ¡lido (L 2600 - 3250K)',
+        'White Fluorescent' => 'Fluorescente blanco (WW 3250 - 3800K)',
+      },
+    },
+   'CameraCalibration1' => 'CalibraciÃ³n CÃ¡mara 1',
+   'CameraCalibration2' => 'CalibraciÃ³n CÃ¡mara 2',
+   'CameraCalibrationSig' => 'Firma CalibraciÃ³n CÃ¡mara',
+   'CameraOrientation' => {
+      PrintConv => {
+        'Rotate 270 CW' => 'Rotar 270Â° sentido reloj',
+        'Rotate 90 CW' => 'Rotar 90Â° sentido reloj',
+      },
+    },
+   'CameraSerialNumber' => 'NÃºmero Serie CÃ¡mara',
+   'Caption-Abstract' => 'TÃ­tulo/DescripciÃ³n',
+   'CaptionWriter' => 'Autor del Pie de Foto',
+   'Categories' => 'CategorÃ­as',
+   'Category' => 'CategorÃ­a',
+   'CellLength' => 'Alto Celda',
+   'CellWidth' => 'Ancho Celda',
+   'CharTarget' => 'Objetivo Caracter',
+   'CharacterSet' => 'Conjunto de Caracteres',
+   'ChromaBlurRadius' => 'Radio Mezcla Croma',
+   'ChromaticAdaptation' => 'AdaptaciÃ³n CromÃ¡tica',
+   'Chromaticity' => 'Cromaticidad',
+   'City' => 'Ciudad',
+   'ClassifyState' => 'Clasificar Estado',
+   'CleanFaxData' => 'Datos Fax Claro',
+   'ClipPath' => 'Camino Fragmento',
+   'CodedCharacterSet' => 'Juego Caracteres Codificado',
+   'ColorAdjustment' => 'Ajuste Color',
+   'ColorAdjustmentMode' => {
+      Description => 'Modo Ajuste Color',
+      PrintConv => {
+        'Off' => 'Apagado',
+        'On' => 'Encendido',
+      },
+    },
+   'ColorCalibrationMatrix' => 'Tabla Matriz CalibraciÃ³n Color',
+   'ColorCharacterization' => 'CaracterizaciÃ³n Color',
+   'ColorFilter' => 'Filtro de Color',
+   'ColorMap' => 'Mapa Color',
+   'ColorMatrix1' => 'Matriz Color 1',
+   'ColorMatrix2' => 'Matriz Color 2',
+   'ColorMode' => {
+      Description => 'Estilo.Creativo',
+      PrintConv => {
+        'Autumn Leaves' => 'Hojas de otoÃ±o',
+        'B&W' => 'ByN',
+        'Clear' => 'Claro',
+        'Deep' => 'Profundo',
+        'Evening' => 'Tarde',
+        'Landscape' => 'Paisaje',
+        'Light' => 'Luz',
+        'Night View' => 'Vista nocturna',
+        'Night View/Portrait' => 'Retrato noct.',
+        'Portrait' => 'Retrato',
+        'Standard' => 'EstÃ¡ndar',
+        'Sunset' => 'Puesta sol',
+        'Vivid' => 'Color vÃ­vido',
+      },
+    },
+   'ColorPalette' => 'Paleta Color',
+   'ColorRepresentation' => {
+      Description => 'RepresentaciÃ³n Color',
+      PrintConv => {
+        '3 Components, Frame Sequential in Multiple Objects' => 'Tres componentes, Marco secuencial en mÃºltiples objectos',
+        '3 Components, Frame Sequential in One Object' => 'Tres componentes, Marco secuencial en un Ãºnico objeto',
+        '3 Components, Line Sequential' => 'Tres componentes, LÃ­nea secuencial',
+        '3 Components, Pixel Sequential' => 'Tres componentes, Pixel secuencial',
+        '3 Components, Single Frame' => 'Tres componentes, Marco simple',
+        '3 Components, Special Interleaving' => 'Tres componentes, Entrelazado especial',
+        '4 Components, Frame Sequential in Multiple Objects' => 'Cuatro componentes, Marco secuencial en mÃºltiples objectos',
+        '4 Components, Frame Sequential in One Object' => 'Cuatro componentes, Marco secuencial en un Ãºnico objeto',
+        '4 Components, Line Sequential' => 'Cuatro componentes, LÃ­nea secuencial',
+        '4 Components, Pixel Sequential' => 'Cuatro componentes, Pixel secuencial',
+        '4 Components, Single Frame' => 'Cuatro componentes, Marco simple',
+        '4 Components, Special Interleaving' => 'Cuatro componentes, Entrelazado especial',
+        'Monochrome, Single Frame' => 'Monocromo, Marco simple',
+        'No Image, Single Frame' => 'Sin imagen, Marco simple',
+      },
+    },
+   'ColorResponseUnit' => 'Unidad Respuesta Color',
+   'ColorSequence' => 'RepresentaciÃ³n de Color',
+   'ColorSpace' => {
+      Description => 'Espacio Color',
+      PrintConv => {
+        'ICC Profile' => 'Perfil ICC',
+        'Uncalibrated' => 'Sin calibrar',
+      },
+    },
+   'ColorSpaceData' => 'Espacio Color Datos',
+   'ColorTable' => 'Tabla Color',
+   'ColorTemperature' => 'Temperatura de Color',
+   'ColorantOrder' => 'Orden Colorante',
+   'ColorantTable' => 'Tabla Colorante',
+   'ColorimetricReference' => 'Referencia ColorimÃ©trica',
+   'CommandDialsReverseRotation' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'Comment' => 'Comentario',
+   'Compilation' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'ComponentsConfiguration' => 'Significado de Cada Componente',
+   'CompressedBitsPerPixel' => 'Modo CompresiÃ³n Imagen',
+   'Compression' => {
+      Description => 'Esquema CompresiÃ³n',
+      PrintConv => {
+        'JPEG' => 'CompresiÃ³n JPEG',
+        'JPEG (old-style)' => 'JPEG (estilo antiguo)',
+        'Kodak DCR Compressed' => 'CompresiÃ³n Kodak DCR',
+        'Kodak KDC Compressed' => 'CompresiÃ³n Kodak KDC',
+        'Next' => 'CodificaciÃ³n NeXT 2-bit',
+        'Nikon NEF Compressed' => 'CompresiÃ³n Nikon NEF',
+        'Pentax PEF Compressed' => 'CompresiÃ³n Pentax PEF',
+        'SGILog' => 'CodificaciÃ³n Log Luminancia SGI 32-bit',
+        'SGILog24' => 'CodificaciÃ³n Log Luminancia SGI 24-bit',
+        'Sony ARW Compressed' => 'CompresiÃ³n Sony ARW',
+        'Thunderscan' => 'CodificaciÃ³n ThunderScan 4-bit',
+        'Uncompressed' => 'Sin comprimir',
+      },
+    },
+   'ConnectionSpaceIlluminant' => 'IluminaciÃ³n Espacio ConexiÃ³n',
+   'ConsecutiveBadFaxLines' => 'LÃ­neas Fax Malas Consecutivas',
+   'Contact' => 'Contacto',
+   'ContentLocationCode' => 'CÃ³digo LocalizaciÃ³n Contenido',
+   'ContentLocationName' => 'Nombre LocalizaciÃ³n Contenido',
+   'Contrast' => {
+      Description => 'Contraste',
+      PrintConv => {
+        'High' => 'Fuerte',
+        'Low' => 'Suave',
+        'Normal' => 'EstÃ¡ndar',
+      },
+    },
+   'Copyright' => 'Copyright Perfil',
+   'CopyrightNotice' => 'Aviso Copyright',
+   'Country' => 'PaÃ­s',
+   'Country-PrimaryLocationCode' => 'CÃ³digo PaÃ­s ISO',
+   'Country-PrimaryLocationName' => 'PaÃ­s',
+   'CreateDate' => 'Fecha y Hora de Datos Digital',
+   'CreationDate' => 'Fecha CreaciÃ³n',
+   'Creator' => 'Creador',
+   'CreatorAddress' => 'Creador - DirecciÃ³n',
+   'CreatorCity' => 'Creador - Ciudad',
+   'CreatorCountry' => 'Creador - PaÃ­s',
+   'CreatorPostalCode' => 'Creador - CÃ³digo Postal',
+   'CreatorRegion' => 'Creador - Estado/Provincia',
+   'CreatorWorkEmail' => 'Creador - Email(s)',
+   'CreatorWorkTelephone' => 'Creador - TelÃ©fono(s)',
+   'CreatorWorkURL' => 'Creador - Website(s)',
+   'Credit' => 'Proveedor',
+   'CropActive' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'CurrentICCProfile' => 'Perfil ICC Actual',
+   'CurrentPreProfileMatrix' => 'Matriz Pre Perfil Actual',
+   'CustomRendered' => {
+      Description => 'Proceso Imagen Personalizado',
+      PrintConv => {
+        'Custom' => 'Proceso personalizado',
+        'Normal' => 'Proceso normal',
+      },
+    },
+   'D-LightingHQSelected' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'DNGBackwardVersion' => 'VersiÃ³n Antigua DNG',
+   'DNGLensInfo' => 'Distancia Focal MÃ­nima',
+   'DNGVersion' => 'VersiÃ³n DNG',
+   'DataCompressionMethod' => 'Proveedor/Propietario Algoritmo CompresiÃ³n Datos',
+   'DataType' => 'Tipo Datos',
+   'Date' => 'Fecha',
+   'DateCreated' => 'Fecha CreaciÃ³n',
+   'DateSent' => 'Fecha EnvÃ­o',
+   'DateTimeOriginal' => 'Fecha y Hora de Datos Original',
+   'DaylightSavings' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'DefaultCropOrigin' => 'Origen Corte Defecto',
+   'DefaultCropSize' => 'TamaÃ±o Corte Defecto',
+   'DefaultScale' => 'Escala por Defecto',
+   'Description' => 'DescripciÃ³n',
+   'Destination' => 'Destino',
+   'DestinationDST' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'DeviceAttributes' => 'Atributos Dispositivo',
+   'DeviceManufacturer' => 'Fabricante Dispositivo',
+   'DeviceMfgDesc' => 'DescripciÃ³n Fabricante Dispositivo',
+   'DeviceModel' => 'Modelo Dispositivo',
+   'DeviceModelDesc' => 'DescripciÃ³n Modelo Dispositivo',
+   'DeviceSettingDescription' => 'DescripciÃ³n Ajustes Dispositivo',
+   'DigitalCreationDate' => 'Fecha CreaciÃ³n Digital',
+   'DigitalCreationTime' => 'Hora CreaciÃ³n Digital',
+   'DigitalZoom' => 'Zoom Digital',
+   'DigitalZoomOn' => {
+      Description => 'Zoom Digital Encendido',
+      PrintConv => {
+        'Off' => 'Apagado',
+        'On' => 'Encendido',
+      },
+    },
+   'DigitalZoomRatio' => 'Ratio Zoom Digital',
+   'Directory' => 'UbicaciÃ³n del Fichero',
+   'DocumentHistory' => 'Historial del Documento',
+   'DocumentName' => 'Nombre Documento',
+   'DocumentNotes' => 'Notas del Documento',
+   'DotRange' => 'Intervalo Puntos',
+   'DriveMode' => 'Modo Entrada',
+   'DynamicRangeOptimizer' => {
+      Description => 'Optim.gama dinÃ¡',
+      PrintConv => {
+        'Advanced Auto' => 'Avanzado Autom',
+        'Advanced Lv1' => 'Avanzado Nvl.1',
+        'Advanced Lv2' => 'Avanzado Nvl.2',
+        'Advanced Lv3' => 'Avanzado Nvl.3',
+        'Advanced Lv4' => 'Avanzado Nvl.4',
+        'Advanced Lv5' => 'Avanzado Nvl.5',
+        'Off' => 'Desactivado',
+        'Standard' => 'EstÃ¡ndar',
+      },
+    },
+   'EditStatus' => 'Estado EdiciÃ³n',
+   'EditorialUpdate' => {
+      Description => 'ActualizaciÃ³n Editorial',
+      PrintConv => {
+        'Additional language' => 'Idioma Adicional',
+      },
+    },
+   'EndPoints' => 'Puntos Finales',
+   'EnvelopeNumber' => 'NÃºmero Sobre',
+   'EnvelopePriority' => {
+      Description => 'Prioridad Sobre',
+      PrintConv => {
+        '0 (reserved)' => '0 (reservada para uso futuro)',
+        '1 (most urgent)' => '1 (mÃ¡s urgente)',
+        '5 (normal urgency)' => '5 (urgencia normal)',
+        '8 (least urgent)' => '8 (menos urgente)',
+        '9 (user-defined priority)' => '9 (prioridad definida por el usuario)',
+      },
+    },
+   'EnvelopeRecordVersion' => 'VersiÃ³n Registro Sobre',
+   'ExcursionTolerance' => {
+      Description => 'Tolerancia ExcursiÃ³n',
+      PrintConv => {
+        'Allowed' => 'Puede ocurrir',
+        'Not Allowed' => 'No Permitido (defecto)',
+      },
+    },
+   'ExifCameraInfo' => 'InformaciÃ³n CÃ¡mara Exif',
+   'ExifImageHeight' => 'Alto Imagen',
+   'ExifImageWidth' => 'Ancho Imagen',
+   'ExifOffset' => 'Puntero Exif IFD',
+   'ExifVersion' => 'VersiÃ³n Exif',
+   'ExpandFilm' => 'PelÃ­cula Expandida',
+   'ExpandFilterLens' => 'Filtro Objetivo Expandida',
+   'ExpandFlashLamp' => 'Lampara Flash Expandida',
+   'ExpandLens' => 'Objetivo Expandido',
+   'ExpandScanner' => 'Escaner Expandido',
+   'ExpandSoftware' => 'Software Expandido',
+   'ExpirationDate' => 'Fecha ExpiraciÃ³n',
+   'ExpirationTime' => 'Hora ExpiraciÃ³n',
+   'ExposureCompensation' => 'CompensaciÃ³n ExposiciÃ³n',
+   'ExposureIndex' => 'Ãndice ExposiciÃ³n',
+   'ExposureMode' => {
+      Description => 'Modo ExposiciÃ³n',
+      PrintConv => {
+        'Aperture-priority AE' => 'Prioridad Aberture AE',
+        'Auto' => 'ExposiciÃ³n automÃ¡tica',
+        'Auto bracket' => 'Auto-horquillado',
+        'Manual' => 'ExposiciÃ³n manual',
+        'Program AE' => 'Programa AE',
+        'Shutter speed priority AE' => 'Prioridad velocidad obturador AE',
+      },
+    },
+   'ExposureProgram' => {
+      Description => 'Programa ExposiciÃ³n',
+      PrintConv => {
+        'Action (High speed)' => 'Programa acciÃ³n (orientado a velocidad de obturaciÃ³n rÃ¡pida)',
+        'Aperture-priority AE' => 'Prioridad abertura',
+        'Creative (Slow speed)' => 'Programa creativo (orientado a profundidad de campo)',
+        'Landscape' => 'Modo paisaje (para fotos de paisaje con el fondo en enfoque)',
+        'Manual' => 'ExposiciÃ³n manual',
+        'Not Defined' => 'No definido',
+        'Portrait' => 'Modo retrato (para fotos de cerca con el fondo fuera de enfoque)',
+        'Program AE' => 'Programa normal',
+        'Shutter speed priority AE' => 'Prioridad obturador',
+      },
+    },
+   'ExposureTime' => 'Hora ExposiciÃ³n',
+   'ExposureTime2' => 'Hora ExposiciÃ³n 2',
+   'ExternalFlashBounce' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'ExtraSamples' => 'Muestra Extra',
+   'FNumber' => 'NÃºmero F',
+   'FastSeek' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'FaxRecvParams' => 'ParÃ¡metros RecepciÃ³n Fax',
+   'FaxRecvTime' => 'Hora RecepciÃ³n Fax',
+   'FaxSubAddress' => 'SubdirecciÃ³n Fax',
+   'FileFormat' => 'Formato Archivo',
+   'FileModifyDate' => 'Fecha Actualizada',
+   'FileName' => 'Nombre Archivo',
+   'FileSize' => 'TamaÃ±o Archivo',
+   'FileSource' => {
+      Description => 'Fuente Archivo',
+      PrintConv => {
+        'Digital Camera' => 'CÃ¡mara Digital',
+        'Film Scanner' => 'Escaner PelÃ­cula',
+        'Reflection Print Scanner' => 'Escaner de ReflexiÃ³n',
+      },
+    },
+   'FileType' => 'Tipo Archivo',
+   'FileVersion' => 'VersiÃ³n Formato Archivo',
+   'FillOrder' => 'Orden Rellenado',
+   'FirmwareVersion' => 'VersiÃ³n Firmware',
+   'FixtureIdentifier' => 'Identificador Marca',
+   'Flash' => {
+      PrintConv => {
+        'Auto, Did not fire' => 'Flash no disparado, modo automÃ¡tico',
+        'Auto, Did not fire, Red-eye reduction' => 'Auto, Flash no disparado, modo reducciÃ³n ojos rojos',
+        'Auto, Fired' => 'Flash disparado, modo automÃ¡tico',
+        'Auto, Fired, Red-eye reduction' => 'Flash disparado, modo automÃ¡tico, modo reducciÃ³n ojos rojos',
+        'Auto, Fired, Red-eye reduction, Return detected' => 'Flash disparado, modo automÃ¡tico, retorno luz detectado, modo reducciÃ³n ojos rojos',
+        'Auto, Fired, Red-eye reduction, Return not detected' => 'Flash disparado, modo automÃ¡tico, retorno luz no detectado, modo reducciÃ³n ojos rojos',
+        'Auto, Fired, Return detected' => 'Flash disparado, modo automÃ¡tico, retorno luz detectado',
+        'Auto, Fired, Return not detected' => 'Flash disparado, modo automÃ¡tico, retorno luz no detectado',
+        'Did not fire' => 'No se ha disparado el flash',
+        'Fired' => 'Flash disparado',
+        'Fired, Red-eye reduction' => 'Flash disparado, modo reducciÃ³n ojos rojos',
+        'Fired, Red-eye reduction, Return detected' => 'Flash disparado, modo reducciÃ³n ojos rojos, retorno luz detectado',
+        'Fired, Red-eye reduction, Return not detected' => 'Flash disparado, modo reducciÃ³n ojos rojos, retorno luz no detectado',
+        'Fired, Return detected' => 'Luz devuelta en captador detectada',
+        'Fired, Return not detected' => 'Luz devuelta en captador no detectada',
+        'No Flash' => 'Flash no disparado',
+        'No flash function' => 'Sin funciÃ³n flash',
+        'Off, Did not fire' => 'Flash no disparado, modo flash forzado',
+        'Off, Did not fire, Return not detected' => 'Apagado, flash no disparado, retorno luz no detectado',
+        'Off, No flash function' => 'Apagado, sin funciÃ³n flash',
+        'Off, Red-eye reduction' => 'Apagado, modo reducciÃ³n ojos rojos',
+        'On, Did not fire' => 'Encendido, flash no disparado',
+        'On, Fired' => 'Flash disparado, modo flash forzardo',
+        'On, Red-eye reduction' => 'Flash disparado, modo flash forzado, modo reducciÃ³n ojos rojos',
+        'On, Red-eye reduction, Return detected' => 'Flash disparado, modo flash forzado, modo reducciÃ³n ojos rojos, retorno luz detectado',
+        'On, Red-eye reduction, Return not detected' => 'Flash disparado, modo flash forzado, modo reducciÃ³n ojos rojos, retorno luz no detectado',
+        'On, Return detected' => 'Flash disparado, modo flash forzado, retorno luz detectado',
+        'On, Return not detected' => 'Flash disparado, modo flash forzado, retorno luz no detectado',
+      },
+    },
+   'FlashEnergy' => 'EnergÃ­a Flash',
+   'FlashExposureComp' => 'CompensaciÃ³n ExposiciÃ³n Flash',
+   'FlashFired' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'FlashMode' => {
+      Description => 'Modo Flash',
+      PrintConv => {
+        'Auto' => 'AutomÃ¡tico',
+        'Disabled' => 'Desactivado',
+        'Force' => 'Forzado',
+        'Off' => 'Apagado',
+        'On' => 'Encendido',
+        'Red eye' => 'Ojos rojos',
+      },
+    },
+   'FlashpixVersion' => 'VersiÃ³n Flashpix Soportado',
+   'FlickerReduce' => {
+      Description => 'Reducir Parpadeo',
+      PrintConv => {
+        'Off' => 'Apagado',
+        'On' => 'Encendido',
+      },
+    },
+   'FlipHorizontal' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'FocalLength' => 'Distancia Focal Objetivo',
+   'FocalLength35efl' => 'Longitud Focal (ConversiÃ³n a 35 mm)',
+   'FocalLengthIn35mmFormat' => 'Distancia Focal en PelÃ­cula de 35 mm',
+   'FocalPlaneResolutionUnit' => {
+      Description => 'Unidad ResoluciÃ³n Plano Focal',
+      PrintConv => {
+        'None' => 'Ninguno',
+        'inches' => 'Pulgada',
+        'um' => 'Âµm (Micrometro)',
+      },
+    },
+   'FocalPlaneXResolution' => 'ResoluciÃ³n X Plano Focal',
+   'FocalPlaneYResolution' => 'ResoluciÃ³n Y Plano Focal',
+   'FocusMode' => 'Modo Enfoque',
+   'FocusSetting' => 'Ajuste Enfoque',
+   'ForwardMatrix1' => 'Matriz Avance 1',
+   'ForwardMatrix2' => 'Matriz Avance 2',
+   'FrameRate' => 'Velocidad del Fotograma',
+   'FrameSize' => 'TamaÃ±o del Fotograma',
+   'FreeByteCounts' => 'NÃºmero Bytes Libres',
+   'FreeOffsets' => 'Offsets Libres',
+   'GPSAltitude' => 'Altitud',
+   'GPSAltitudeRef' => {
+      Description => 'Referencia Altitud',
+      PrintConv => {
+        'Above Sea Level' => 'Nivel del Mar',
+        'Below Sea Level' => 'Referencia Nivel del Mar (valor negativo)',
+      },
+    },
+   'GPSAreaInformation' => 'Nombre de Zona GPS',
+   'GPSDOP' => 'PrecisiÃ³n MediciÃ³n',
+   'GPSDateStamp' => 'Fecha GPS',
+   'GPSDestBearing' => 'OrientaciÃ³n de Destino',
+   'GPSDestBearingRef' => {
+      Description => 'Referencia para OrientaciÃ³n de Destino',
+      PrintConv => {
+        'Magnetic North' => 'DirecciÃ³n magnÃ©tica',
+        'True North' => 'DirecciÃ³n real',
+      },
+    },
+   'GPSDestDistance' => 'Distancia a Destino',
+   'GPSDestDistanceRef' => {
+      Description => 'Referencia para Distancia a Destino',
+      PrintConv => {
+        'Kilometers' => 'KilÃ³metros',
+        'Miles' => 'Millas',
+        'Nautical Miles' => 'Nudos',
+      },
+    },
+   'GPSDestLatitude' => 'Latitud de Destino',
+   'GPSDestLatitudeRef' => {
+      Description => 'Referencia para Latitud de Destino',
+      PrintConv => {
+        'North' => 'Latitud norte',
+        'South' => 'Latitud sur',
+      },
+    },
+   'GPSDestLongitude' => 'Longitud de Destino',
+   'GPSDestLongitudeRef' => {
+      Description => 'Referencia para Longitud de Destino',
+      PrintConv => {
+        'East' => 'Longitud este',
+        'West' => 'Longitud oeste',
+      },
+    },
+   'GPSDifferential' => {
+      Description => 'CorrecciÃ³n Diferencial GPS',
+      PrintConv => {
+        'Differential Corrected' => 'CorrecciÃ³n diferencial aplicada',
+        'No Correction' => 'MediciÃ³n sin correcciÃ³n diferencial',
+      },
+    },
+   'GPSImgDirection' => 'DirecciÃ³n de Imagen',
+   'GPSImgDirectionRef' => {
+      Description => 'Referencia para DirecciÃ³n de Imagen',
+      PrintConv => {
+        'Magnetic North' => 'DirecciÃ³n magnÃ©tica',
+        'True North' => 'DirecciÃ³n real',
+      },
+    },
+   'GPSInfo' => 'Puntero IFD de InformaciÃ³n GPS',
+   'GPSLatitude' => 'Latitud',
+   'GPSLatitudeRef' => {
+      Description => 'Latitud Norte o Sur',
+      PrintConv => {
+        'North' => 'Latitud Norte',
+        'South' => 'Latitud Sur',
+      },
+    },
+   'GPSLongitude' => 'Longitud',
+   'GPSLongitudeRef' => {
+      Description => 'Longitud Este u Oeste',
+      PrintConv => {
+        'East' => 'Longitud Este',
+        'West' => 'Longitud Oeste',
+      },
+    },
+   'GPSMapDatum' => 'Dato MediciÃ³n GeodÃ©sica Usado',
+   'GPSMeasureMode' => {
+      Description => 'Modo MediciÃ³n GPS',
+      PrintConv => {
+        '2-Dimensional Measurement' => 'MediciÃ³n bidimensional',
+        '3-Dimensional Measurement' => 'MediciÃ³n tridimensional',
+      },
+    },
+   'GPSProcessingMethod' => 'Nombre del MÃ©todo de Procesado GPS',
+   'GPSSatellites' => 'SatÃ©lites GPS Usados para Medida',
+   'GPSSpeed' => 'Velocidad del Receptor GPS',
+   'GPSSpeedRef' => {
+      Description => 'Unidad Velocidad',
+      PrintConv => {
+        'km/h' => 'KilÃ³metros por hora',
+        'knots' => 'Nudos',
+        'mph' => 'Millas por hora',
+      },
+    },
+   'GPSStatus' => {
+      Description => 'Estado Receptor GPS',
+      PrintConv => {
+        'Measurement Active' => 'MediciÃ³n Activa',
+        'Measurement Void' => 'MediciÃ³n VacÃ­a',
+      },
+    },
+   'GPSTimeStamp' => 'Hora GPS (reloj atÃ³mico)',
+   'GPSTrack' => 'DirecciÃ³n de Movimiento',
+   'GPSTrackRef' => {
+      Description => 'Referencia de DirecciÃ³n de Movimiento',
+      PrintConv => {
+        'Magnetic North' => 'DirecciÃ³n magnÃ©tica',
+        'True North' => 'DirecciÃ³n real',
+      },
+    },
+   'GPSVersionID' => 'VersiÃ³n Etiqueta GPS',
+   'GainControl' => {
+      Description => 'Control Ganancia',
+      PrintConv => {
+        'High gain down' => 'AtenuaciÃ³n alta',
+        'High gain up' => 'Ganancia alta',
+        'Low gain down' => 'AtenuaciÃ³n baja',
+        'Low gain up' => 'Ganancia debil',
+        'None' => 'Ninguna',
+      },
+    },
+   'GammaCompensatedValue' => 'Valor Compensado Gamma',
+   'Gapless' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'GeoTiffAsciiParams' => 'Etiqueta ParÃ¡metros Ascii Geo',
+   'GeoTiffDirectory' => 'Etiqueta Directorio Clave Geo',
+   'GeoTiffDoubleParams' => 'Etiqueta ParÃ¡metros Doble Geo',
+   'Gradation' => 'Impresivo',
+   'GrayResponseCurve' => 'Curva Respuesta Gris',
+   'GrayResponseUnit' => {
+      Description => 'Unidad Respuesta Gris',
+      PrintConv => {
+        '0.0001' => 'NÃºmero representa la milÃ©sima de una unidad',
+        '0.001' => 'NÃºmero representa la centÃ©sima de una unidad',
+        '0.1' => 'NÃºmero representa la dÃ©cima de una unidad',
+        '1e-05' => 'NÃºmero representa la diezmilÃ©sima de una unidad',
+        '1e-06' => 'NÃºmero representa la cienmilÃ©sima de una unidad',
+      },
+    },
+   'GrayTRC' => 'Columna Matriz Gris',
+   'GreenMatrixColumn' => 'Columna Matriz Verde',
+   'GreenTRC' => 'Curva ReproducciÃ³n Tono Verde',
+   'HCUsage' => 'Uso HC',
+   'HDR' => {
+      Description => 'Auto HDR',
+      PrintConv => {
+        'Off' => 'Desactivado',
+      },
+    },
+   'HalftoneHints' => 'IndicaciÃ³n Medio Tono',
+   'Headline' => 'Titular',
+   'HeightResolution' => 'ResoluciÃ³n Imagen Vertical',
+   'HighISONoiseReduction' => {
+      Description => 'RR ISO Alta',
+      PrintConv => {
+        'High' => 'Hi',
+        'Low' => 'Lo',
+        'Off' => 'Desactivado',
+      },
+    },
+   'Highlight' => 'Realce',
+   'HometownDST' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'HostComputer' => 'Ordenador Principal',
+   'Hue' => 'Tono',
+   'ICC_Profile' => 'Perfil Color Entrada ICC',
+   'IPTC-NAA' => 'Metadato IPTC-NAA',
+   'IPTCBitsPerSample' => 'NÃºmero de Bits por Muestra',
+   'IPTCImageHeight' => 'NÃºmero de LÃ­neas',
+   'IPTCImageRotation' => {
+      Description => 'RotaciÃ³n Imagen',
+      PrintConv => {
+        '0' => 'Sin rotaciÃ³n',
+        '180' => 'RotaciÃ³n 180 grados',
+        '270' => 'RotaciÃ³n 270 grados',
+        '90' => 'RotaciÃ³n 90 grados',
+      },
+    },
+   'IPTCImageWidth' => 'Pixels por LÃ­nea',
+   'IPTCPictureNumber' => 'NÃºmero Imagen',
+   'IPTCPixelHeight' => 'TamaÃ±o Pixel Perpendicular a DirecciÃ³n Escaneo',
+   'IPTCPixelWidth' => 'TamaÃ±o Pixel en DirecciÃ³n Escaneo',
+   'ISO' => 'Ratio Velocidad ISO',
+   'ISOSetting' => 'Ajuste ISO',
+   'ISOSpeedExpansion' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'IT8Header' => 'Cabecera IT8',
+   'ImageByteCount' => 'NÃºmero Byte Imagen',
+   'ImageColorIndicator' => 'Indicador Color Imagen',
+   'ImageColorValue' => 'Valor Color Imagen',
+   'ImageDataDiscard' => {
+      Description => 'Datos Imagen Descartado',
+      PrintConv => {
+        'Flexbits Discarded' => 'FlexBits Descartados',
+        'Full Resolution' => 'ResoluciÃ³n Total',
+        'HighPass Frequency Data Discarded' => 'Datos Frecuencia High-Pass Descartados',
+        'Highpass and LowPass Frequency Data Discarded' => 'Dato Frecuencia High-Pass y Low-Pass Descartados',
+      },
+    },
+   'ImageDepth' => 'Ancho Imagen',
+   'ImageDescription' => 'TÃ­tulo Imagen',
+   'ImageHeight' => 'Alto Imagen',
+   'ImageHistory' => 'Historia Imagen',
+   'ImageID' => 'ID Imagen',
+   'ImageInfo' => 'Info Imagen',
+   'ImageLayer' => 'Capa Imagen',
+   'ImageNumber' => 'NÃºmero Imagen',
+   'ImageOffset' => 'Offset Imagen',
+   'ImageOrientation' => {
+      Description => 'OrientaciÃ³n Imagen',
+      PrintConv => {
+        'Landscape' => 'Paisaje',
+        'Portrait' => 'Retrato',
+        'Square' => 'Cuadro',
+      },
+    },
+   'ImageResourceBlocks' => 'Bloques Recursos Imagen',
+   'ImageRotated' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'ImageSize' => 'TamaÃ±o de la Imagen',
+   'ImageSourceData' => 'Datos Fuente Imagen',
+   'ImageType' => 'Tipo Imagen',
+   'ImageUniqueID' => 'ID Ãnico Imagen',
+   'ImageWidth' => 'Ancho Imagen',
+   'Index' => 'Ãndice',
+   'Indexed' => 'Indizado',
+   'InkNames' => 'Nombres Tinta',
+   'InkSet' => 'Conjunto Tinta',
+   'Instructions' => 'Instrucciones',
+   'IntellectualGenre' => 'GÃ©nero Intelectual',
+   'InterchangeColorSpace' => {
+      PrintConv => {
+        'CMY (K) Device Dependent' => 'Dispositivo dependiente CMY(K)',
+        'RGB Device Dependent' => 'Dispositivo dependiente RGB',
+      },
+    },
+   'IntergraphMatrix' => 'Etiqueta Matriz IntergrÃ¡fica',
+   'Interlace' => 'Entrelazado',
+   'InteropIndex' => {
+      Description => 'IdentificaciÃ³n Interoperabilidad',
+      PrintConv => {
+        'R03 - DCF option file (Adobe RGB)' => 'R03: Archivo opciÃ³n DCF (Adobe RGB)',
+        'R98 - DCF basic file (sRGB)' => 'R98: Archivo bÃ¡sico DCF (sRGB)',
+        'THM - DCF thumbnail file' => 'THM: Archivo miniatura DCF',
+      },
+    },
+   'InteropOffset' => 'Etiqueta de Interoperabilidad',
+   'InteropVersion' => 'VersiÃ³n Interoperabilidad',
+   'JPEGACTables' => 'Tablas AC JPEG',
+   'JPEGDCTables' => 'Tablas DC JPEG',
+   'JPEGLosslessPredictors' => 'Predictores Sin Perdidas JPEG',
+   'JPEGPointTransforms' => 'Tranformadores Puntos JPEG',
+   'JPEGProc' => 'Proc JPEG',
+   'JPEGQTables' => 'Tablas Q JPEG',
+   'JPEGRestartInterval' => 'Intervalo Reinicio JPEG',
+   'JPEGTables' => 'Tablas JPEG',
+   'JobID' => 'ID del Trabajo',
+   'Keyword' => 'Palabras Clave',
+   'Keywords' => 'Clave',
+   'LanguageIdentifier' => 'Identificador Idioma',
+   'LeafData' => 'Datos Hoja',
+   'Lens' => 'Objetivo',
+   'LensApertureRange' => 'Intervalo Abertura Objetivo',
+   'LensInfo' => 'InformaciÃ³n del Objetivo',
+   'LightSource' => {
+      Description => 'Fuente Luz',
+      PrintConv => {
+        'Cloudy' => 'Tiempo nuboso',
+        'Cool White Fluorescent' => 'Fluorescente blanco cÃ¡lido (W 3800 - 4500K)',
+        'Day White Fluorescent' => 'Fluorescente blanco dÃ­a (N 4600 - 5500K)',
+        'Daylight' => 'Luz del dÃ­a',
+        'Daylight Fluorescent' => 'Fluorescente luz del dÃ­a (D 5700 - 7100K)',
+        'Fine Weather' => 'Buen tiempo',
+        'Fluorescent' => 'Fluorescente',
+        'ISO Studio Tungsten' => 'Tungsteno estudio ISO',
+        'Other' => 'Otras Fuentes Luz',
+        'Shade' => 'Sombra',
+        'Standard Light A' => 'Luz estandar A',
+        'Standard Light B' => 'Luz estandar B',
+        'Standard Light C' => 'Luz estandar C',
+        'Tungsten (Incandescent)' => 'Tungsteno (luz incandescente)',
+        'Unknown' => 'Desconocido',
+        'Warm White Fluorescent' => 'Fluorescente blanco cÃ¡lido (L 2600 - 3250K)',
+        'White Fluorescent' => 'Fluorescente blanco (WW 3250 - 3800K)',
+      },
+    },
+   'LightSourceSpecial' => {
+      Description => 'Fuente Luz Especial',
+      PrintConv => {
+        'Off' => 'Apagado',
+        'On' => 'Encendido',
+      },
+    },
+   'Lightness' => 'Luminosidad',
+   'LinearResponseLimit' => 'LÃ­mite Respuesta Lineal',
+   'LinearizationTable' => 'Tabla LinearizaciÃ³n',
+   'Lit' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'LocalizedCameraModel' => 'Modelo CÃ¡mara Traducido',
+   'Location' => 'LocalizaciÃ³n',
+   'LongExposureNoiseReduction' => {
+      Description => 'RR Exp.Larga',
+      PrintConv => {
+        'Off' => 'Desactivado',
+        'On' => 'Activado',
+      },
+    },
+   'LookupTable' => 'Tabla de Consulta',
+   'Luminance' => 'Luminancia',
+   'Macro' => {
+      PrintConv => {
+        'Off' => 'Apagado',
+        'On' => 'Encendido',
+        'View' => 'Vista',
+      },
+    },
+   'Make' => 'Marca',
+   'MakeAndModel' => 'Marca y Modelo',
+   'MakerNote' => 'Dato Privado DNG',
+   'MakerNoteOffset' => 'Offset Maker Note',
+   'MakerNoteSafety' => {
+      Description => 'Seguridad Maker Note',
+      PrintConv => {
+        'Safe' => 'Seguro',
+        'Unsafe' => 'No Seguro',
+      },
+    },
+   'MakerNoteType' => 'Tipo Maker Note',
+   'MakerNoteVersion' => 'VersiÃ³n Maker Note',
+   'MakerNotes' => 'Notas del Fabricante',
+   'ManualFocusDistance' => 'Distancia Enfoque Manual',
+   'MaskedAreas' => 'Ãrea Oculta',
+   'MasterDocumentID' => 'ID de Documento Maestro',
+   'Matteing' => 'Mate',
+   'MaxAperture' => 'MÃ¡xima Abertura del Objetivo',
+   'MaxApertureValue' => 'Abertura Lente MÃ¡xima',
+   'MaxSampleValue' => 'Valor Muestra Max',
+   'MaximumDensityRange' => 'Rango Densidad Maxima',
+   'Measurement' => 'Observador de Medida',
+   'MeasurementBacking' => 'Apoyo de Medida',
+   'MeasurementFlare' => 'Llama de Medida',
+   'MeasurementGeometry' => {
+      Description => 'GeometrÃ­a de Medida',
+      PrintConv => {
+        '0/45 or 45/0' => '0/45 o 45/0',
+        '0/d or d/0' => '0/d o d/0',
+      },
+    },
+   'MeasurementIlluminant' => 'IluminaciÃ³n de Medida',
+   'MeasurementObserver' => 'Observador de Medida',
+   'MediaBlackPoint' => 'Punto Negro Medio',
+   'MediaWhitePoint' => 'Punto Blanco Medio',
+   'MeteringMode' => {
+      Description => 'Modo MediciÃ³n',
+      PrintConv => {
+        'Average' => 'Ponderado',
+        'Center-weighted average' => 'Ponderado central',
+        'Multi-segment' => 'Multi-segmento',
+        'Multi-spot' => 'Multi-puntual',
+        'Other' => 'Otro',
+        'Partial' => 'Parcial',
+        'Spot' => 'Puntual',
+        'Unknown' => 'Desconocido',
+      },
+    },
+   'MinSampleValue' => 'Valor Muestra Min',
+   'Model' => 'Modelo',
+   'Model2' => 'Modelo Equipamiento Entrada Imagen (2)',
+   'ModelTiePoint' => 'Etiqueta Modelo Punto Lazo',
+   'ModelTransform' => 'Etiqueta Modelo TransformaciÃ³n',
+   'ModifyDate' => 'Fecha y Hora de Cambio del Archivo',
+   'MonochromeLinear' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'MultiFrameNoiseReduction' => {
+      Description => 'Reduc. ruido varios fotogr.',
+      PrintConv => {
+        'Off' => 'Desactivado',
+        'On' => 'Activado',
+      },
+    },
+   'NamedColor2' => 'Color Llamado 2',
+   'NativeDisplayInfo' => 'InformaciÃ³n Pantalla Nativa',
+   'NewsPhotoVersion' => 'VersiÃ³n Registro Foto Noticias',
+   'Noise' => 'Ruido',
+   'NoiseReduction' => 'ReducciÃ³n Ruido',
+   'NoiseReductionApplied' => 'ReducciÃ³n Ruido Aplicada',
+   'NumIndexEntries' => 'NÃºmero de Entradas de Ãndice',
+   'NumberofInks' => 'NÃºmero de Tintas',
+   'OPIProxy' => 'Proxy OPI',
+   'ObjectAttributeReference' => 'GÃ©nero Intelectual',
+   'ObjectCycle' => {
+      Description => 'Ciclo Objecto',
+      PrintConv => {
+        'Both Morning and Evening' => 'Ambos',
+        'Evening' => 'Tarde',
+        'Morning' => 'MaÃ±ana',
+      },
+    },
+   'ObjectName' => 'TÃ­tulo',
+   'ObjectPreviewData' => 'Datos Previos del Objecto',
+   'ObjectPreviewFileFormat' => 'Formato Archivo Previo de Objecto',
+   'ObjectPreviewFileVersion' => 'VersiÃ³n Formato Archivo Previo del Objecto',
+   'ObjectTypeReference' => 'Referencia Tipo Objeto',
+   'OffsetSchema' => 'Offset Esquema',
+   'OpticalZoomOn' => {
+      Description => 'Zoom Ãptico Encendido',
+      PrintConv => {
+        'Off' => 'Apagado',
+        'On' => 'Encendido',
+      },
+    },
+   'Opto-ElectricConvFactor' => 'Factor ConversiÃ³n OptoelÃ©ctrico',
+   'Orientation' => {
+      Description => 'OrientaciÃ³n de Imagen',
+      PrintConv => {
+        'Horizontal (normal)' => '0Â° (arriba/izquierda)',
+        'Mirror horizontal' => 'Invertir horizontal',
+        'Mirror horizontal and rotate 270 CW' => 'Invertir horizontal y rotar 270Â° sentido reloj',
+        'Mirror horizontal and rotate 90 CW' => 'Invertir horizontal y rotar 90Â° sentido reloj',
+        'Mirror vertical' => 'Invertir vertical',
+        'Rotate 180' => 'Rotar 180Â°',
+        'Rotate 270 CW' => 'Rotar 270Â° sentido reloj',
+        'Rotate 90 CW' => 'Rotar 90Â° sentido reloj',
+      },
+    },
+   'OriginalRawFileData' => 'Dato Archivo Raw Original',
+   'OriginalRawFileDigest' => 'Cifrado Archivo Raw Original',
+   'OriginalRawFileName' => 'Nombre Archivo Raw Original',
+   'OriginalTransmissionReference' => 'Identificador de Trabajo',
+   'OriginatingProgram' => 'Programa Originario',
+   'OutputResponse' => 'Respuesta Salida',
+   'OwnerID' => 'ID del Propietario',
+   'Padding' => 'Margen Inferior',
+   'PageName' => 'Nombre PÃ¡gina',
+   'PageNumber' => 'NÃºmero PÃ¡gina',
+   'PhotometricInterpretation' => {
+      Description => 'Esquema Pixel',
+      PrintConv => {
+        'BlackIsZero' => 'Negro es cero',
+        'Color Filter Array' => 'CFA (Matriz Filtro Color)',
+        'Pixar LogL' => 'CIE Log2(L) (Log luminancia)',
+        'Pixar LogLuv' => 'CIE Log2(L)(u\',v\') (Log luminancia y crominancia)',
+        'RGB Palette' => 'Paleta Color',
+        'Transparency Mask' => 'MÃ¡scara de transparencia',
+        'WhiteIsZero' => 'Blanco es cero',
+      },
+    },
+   'PhotoshopAnnotations' => 'Anotaciones Photoshop',
+   'PictInfo' => 'Info Imagen',
+   'PixelFormat' => 'Formato Pixel',
+   'PixelIntensityRange' => 'Intervalo Intensidad Pixel',
+   'PixelScale' => 'Etiqueta Escala Pixel Modelo',
+   'PlanarConfiguration' => {
+      Description => 'Ajuste Datos Imagen',
+      PrintConv => {
+        'Chunky' => 'Formato \'Chunky\' (Entrelazado)',
+        'Planar' => 'Formato \'Planar\'',
+      },
+    },
+   'Predictor' => {
+      PrintConv => {
+        'Horizontal differencing' => 'DiferenciaciÃ³n Horizontal',
+        'None' => 'No se usa esquema de predicciÃ³n antes de codificar',
+      },
+    },
+   'Preview0' => 'Previa 0',
+   'Preview1' => 'Previa 1',
+   'Preview2' => 'Previa 2',
+   'PreviewApplicationName' => 'Nombre AplicaciÃ³n Previa',
+   'PreviewApplicationVersion' => 'VersiÃ³n AplicaciÃ³n Previa',
+   'PreviewColorSpace' => {
+      Description => 'Espacio Color Previa',
+      PrintConv => {
+        'Unknown' => 'Desconocido',
+      },
+    },
+   'PreviewDateTime' => 'Fecha y Hora Previa',
+   'PreviewImage' => 'Previo',
+   'PreviewImageLength' => 'Longitud Imagen Previa',
+   'PreviewImageSize' => 'TamaÃ±o Imagen Previa',
+   'PreviewImageStart' => 'Inicio Imagen Previa',
+   'PreviewImageValid' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'PreviewSettingsDigest' => 'Cifrado ConfiguraciÃ³n Previa',
+   'PreviewSettingsName' => 'Nombre ConfiguraciÃ³n Previa',
+   'PrimaryChromaticities' => 'Cromaticidades de Colores Primarios',
+   'PrimaryPlatform' => 'Plataforma Primaria',
+   'ProcessingSoftware' => 'Tratamiendo de Software',
+   'ProductID' => 'ID Producto',
+   'ProfileCMMType' => 'Tipo Perfil CMM',
+   'ProfileCalibrationSig' => 'Firma Perfil CalibraciÃ³n',
+   'ProfileClass' => {
+      Description => 'Clase Perfil',
+      PrintConv => {
+        'Abstract Profile' => 'Perfil Abstracto',
+        'ColorSpace Conversion Profile' => 'Perfil ConversiÃ³n Espacio Color',
+        'DeviceLink Profile' => 'Perfil Dispositivo ConexiÃ³n',
+        'Display Device Profile' => 'Perfil Dispositivo Pantalla',
+        'Input Device Profile' => 'Perfil Dispositivo Entrada',
+        'NamedColor Profile' => 'Perfil Color Nombrado',
+        'Nikon Input Device Profile (NON-STANDARD!)' => 'Perfil Nikon ("nkpf")',
+        'Output Device Profile' => 'Perfil Dispositivo Salida',
+      },
+    },
+   'ProfileConnectionSpace' => 'Espacio ConexiÃ³n Perfil',
+   'ProfileCopyright' => 'Copyright Perfil',
+   'ProfileCreator' => 'Creador Perfil',
+   'ProfileDateTime' => 'Fecha y Hora Perfil',
+   'ProfileDescription' => 'DescripciÃ³n Perfil',
+   'ProfileDescriptionML' => 'DescripciÃ³n Perfil ML',
+   'ProfileEmbedPolicy' => {
+      Description => 'Perfil PolÃ­tica Incrustada',
+      PrintConv => {
+        'Allow Copying' => 'Permitir copia',
+        'Embed if Used' => 'Incrustar si se usa',
+        'Never Embed' => 'Incrustado nunca',
+        'No Restrictions' => 'Sin restricciones',
+      },
+    },
+   'ProfileFileSignature' => 'Firma Archivo Perfil',
+   'ProfileHueSatMapData1' => 'Perfil Matiz Sat. Mapa Dato 1',
+   'ProfileHueSatMapData2' => 'Perfil Matiz Sat. Mapa Dato 2',
+   'ProfileHueSatMapDims' => 'Divisiones Matiz',
+   'ProfileID' => 'ID Perfil',
+   'ProfileLookTableData' => 'Perfil Datos Tabla Consulta',
+   'ProfileLookTableDims' => 'Divisiones Matiz',
+   'ProfileName' => 'Nombre Perfil',
+   'ProfileSequenceDesc' => 'DescripciÃ³n Secuencia Perfil',
+   'ProfileToneCurve' => 'Perfil Curva Tono',
+   'ProfileVersion' => 'VersiÃ³n Perfil',
+   'ProgramVersion' => 'VersiÃ³n Programa',
+   'Province-State' => 'Provincia/Estado',
+   'Quality' => {
+      Description => 'Calidad',
+      PrintConv => {
+        'Compressed RAW' => 'cRAW',
+        'Compressed RAW + JPEG' => 'cRAW+JPEG',
+        'Extra Fine' => 'Extrafina',
+        'Fine' => 'Fina',
+        'Low' => 'Calidad baja',
+        'Normal' => 'Calidad estÃ¡ndar',
+        'RAW + JPEG' => 'RAW+JPEG',
+        'Standard' => 'EstÃ¡ndar',
+      },
+    },
+   'QuantizationMethod' => {
+      Description => 'MÃ©todo CuantizaciÃ³n',
+      PrintConv => {
+        'AP Domestic Analogue' => 'AP DomÃ©stico AnÃ¡logo',
+        'Color Space Specific' => 'Espacio Color EspecÃ­fico',
+        'Compression Method Specific' => 'MÃ©todo CompresiÃ³n EspecÃ­fico',
+        'Gamma Compensated' => 'Gamma Compensada',
+        'IPTC Ref B' => 'IPTC ref "B"',
+        'Linear Density' => 'Densidad lineal',
+        'Linear Dot Percent' => 'Porcentaje Punto lineal',
+        'Linear Reflectance/Transmittance' => 'Reflectancia/transmitancia lineal',
+      },
+    },
+   'QuickShot' => {
+      Description => 'Disparo RÃ¡pido',
+      PrintConv => {
+        'Off' => 'Apagado',
+        'On' => 'Encendido',
+      },
+    },
+   'RasterPadding' => 'Relleno Trama',
+   'RasterizedCaption' => 'TÃ­tulo Rasterizado',
+   'Rating' => 'ClasificaciÃ³n',
+   'RatingPercent' => 'ValoraciÃ³n en Porcentaje',
+   'RawDataUniqueID' => 'ID Ãnico Dato Raw',
+   'RawImageDigest' => 'Cifrado Imagen RAW',
+   'RecordMode' => 'Modo de GrabaciÃ³n',
+   'RecordShutterRelease' => {
+      Description => 'Soltar Obturador GrabaciÃ³n',
+      PrintConv => {
+        'Press start, press stop' => 'Pulsa para iniciar, pulsa para parar',
+        'Record while down' => 'Grabar mientras se pulsa',
+      },
+    },
+   'RedMatrixColumn' => 'Columna Matriz Rojo',
+   'RedTRC' => 'Curva ReproducciÃ³n Tono Rojo',
+   'ReductionMatrix1' => 'Matriz ReducciÃ³n 1',
+   'ReductionMatrix2' => 'Matriz ReducciÃ³n 2',
+   'ReferenceBlackWhite' => 'Par de Valores de Referencia Blanco y Negro',
+   'ReferenceDate' => 'Fecha Referencia',
+   'ReferenceNumber' => 'NÃºmero Referencia',
+   'ReferenceService' => 'Servicio Referencia',
+   'RelatedImageFileFormat' => 'Formato Archivo Imagen Relacionado',
+   'RelatedImageHeight' => 'Alto Imagen Relacionada',
+   'RelatedImageWidth' => 'Ancho Imagen Relacionada',
+   'RelatedSoundFile' => 'Archivo Audio Relacionado',
+   'ReleaseButtonToUseDial' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'ReleaseDate' => 'Fecha Lanzamiento',
+   'ReleaseTime' => 'Hora Lanzamiento',
+   'RenderingIntent' => {
+      Description => 'Intento InterpretaciÃ³n',
+      PrintConv => {
+        'ICC-Absolute Colorimetric' => 'ColorimÃ©trica Absoluta',
+        'Media-Relative Colorimetric' => 'ColorimÃ©trica Relativa',
+        'Saturation' => 'SaturaciÃ³n',
+      },
+    },
+   'Resaved' => {
+      Description => 'Regrabado',
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'ResolutionMode' => 'Modo ResoluciÃ³n',
+   'ResolutionUnit' => {
+      Description => 'Unidad de ResoluciÃ³n de X e Y',
+      PrintConv => {
+        'None' => 'Ninguna',
+        'cm' => 'PÃ­xeles/cm',
+        'inches' => 'Pulgada',
+      },
+    },
+   'RevisionNumber' => 'NÃºmero RevisiÃ³n',
+   'Rotation' => {
+      PrintConv => {
+        'Rotate 180' => 'Rotar 180Â°',
+        'Rotate 270 CW' => 'Rotar 270Â° sentido reloj',
+        'Rotate 90 CW' => 'Rotar 90Â° sentido reloj',
+        'Rotated 180' => 'Rotar 180Â°',
+        'Rotated 270 CW' => 'Rotar 270Â° sentido reloj',
+        'Rotated 90 CW' => 'Rotar 90Â° sentido reloj',
+      },
+    },
+   'RowInterleaveFactor' => 'Factor Interpolar Fila',
+   'RowsPerStrip' => 'NÃºmero de Filas por Tira',
+   'SMaxSampleValue' => 'Valor Muestra Max S',
+   'SMinSampleValue' => 'Valor Muestra Min S',
+   'SRActive' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'SampleFormat' => 'Formato Muestra',
+   'SampleStructure' => {
+      Description => 'Estructura Muestreo',
+      PrintConv => {
+        'CompressionDependent' => 'Definido dentro del proceso de compresiÃ³n',
+        'Orthogonal4-2-2Sampling' => 'Ortogonal con las frecuencias de muestreo en el ratio de 4:2:2:(4)',
+        'OrthogonalConstangSampling' => 'Ortogonal con la mismas frecuencias de muestreo relativo en cada componente',
+      },
+    },
+   'SamplesPerPixel' => 'NÃºmero de Componentes',
+   'SanyoQuality' => {
+      Description => 'Calidad Sanyo',
+      PrintConv => {
+        'Fine/High' => 'Fino/Alto',
+        'Fine/Low' => 'Fino/Bajo',
+        'Fine/Medium' => 'Fino/Medio',
+        'Fine/Medium High' => 'Fino/Medio Alto',
+        'Fine/Medium Low' => 'Fino/Medio bajo',
+        'Fine/Super High' => 'Fino/Super Alto',
+        'Fine/Very High' => 'Fino/Muy Alto',
+        'Fine/Very Low' => 'Fino/Muy bajo',
+        'Normal/High' => 'Normal/Alto',
+        'Normal/Low' => 'Normal/Bajo',
+        'Normal/Medium' => 'Normal/Medio',
+        'Normal/Medium High' => 'Normal/Medio Alto',
+        'Normal/Medium Low' => 'Normal/Medio bajo',
+        'Normal/Super High' => 'Normal/Super Alto',
+        'Normal/Very High' => 'Normal/Muy Alto',
+        'Normal/Very Low' => 'Normal/Muy bajo',
+        'Super Fine/High' => 'Super Fino/Alto',
+        'Super Fine/Low' => 'Super Fino/Bajo',
+        'Super Fine/Medium' => 'Super Fino/Medio',
+        'Super Fine/Medium High' => 'Super Fino/Medio Alto',
+        'Super Fine/Medium Low' => 'Super Fino/Medio Bajo',
+        'Super Fine/Super High' => 'Super Fino/Super Alto',
+        'Super Fine/Very High' => 'Super Fino/Muy Alto',
+        'Super Fine/Very Low' => 'Super Fino/Muy Bajo',
+      },
+    },
+   'SanyoThumbnail' => 'Miniatura Sanyo',
+   'Saturation' => {
+      Description => 'SaturaciÃ³n',
+      PrintConv => {
+        'High' => 'Alta',
+        'Low' => 'Baja',
+        'None (B&W)' => 'Ninguna (N&B)',
+        'Normal' => 'EstÃ¡ndar',
+      },
+    },
+   'ScanningDirection' => {
+      Description => 'DirecciÃ³n Escaneo',
+      PrintConv => {
+        'Bottom-Top, L-R' => 'Abajo a arriba, izquierda a derecha',
+        'Bottom-Top, R-L' => 'Abajo a arriba, derecha a izquierda',
+        'L-R, Bottom-Top' => 'Izquierda a derecha, abajo a arriba',
+        'L-R, Top-Bottom' => 'Izquierda a derecha, arriba a abajo',
+        'R-L, Bottom-Top' => 'Derecha a izquierda, abajo a arriba',
+        'R-L, Top-Bottom' => 'Derecha a izquierda, arriba a abajo',
+        'Top-Bottom, L-R' => 'Arriba a abajo, izquierda a derecha',
+        'Top-Bottom, R-L' => 'Arriba a abajo, derecha a izquierda',
+      },
+    },
+   'Scene' => 'Escena',
+   'SceneCaptureType' => {
+      Description => 'Tipo Captura Escena',
+      PrintConv => {
+        'Landscape' => 'Paisaje',
+        'Night' => 'Escena nocturna',
+        'Portrait' => 'Retrato',
+        'Standard' => 'Estandar',
+      },
+    },
+   'SceneMode' => {
+      Description => 'SelecciÃ³n de escena',
+      PrintConv => {
+        '3D Sweep Panorama' => '3D',
+        'Anti Motion Blur' => 'Anti movimiento',
+        'Cont. Priority AE' => 'AE prioridad cont.',
+        'Handheld Night Shot' => 'Toma noct. manual',
+        'Landscape' => 'Paisaje',
+        'Night Portrait' => 'Retrato noct.',
+        'Night Scene' => 'Vista nocturna',
+        'Night View/Portrait' => 'Vista/retrato nocturno',
+        'Portrait' => 'Retrato',
+        'Sports' => 'AcciÃ³n deportiva',
+        'Standard' => '',
+        'Sunset' => 'Puesta sol',
+        'Sweep Panorama' => 'Barrido panorÃ¡mico',
+      },
+    },
+   'SceneSelect' => {
+      Description => 'SelecciÃ³n Escena',
+      PrintConv => {
+        'Lamp' => 'LÃ¡mpara',
+        'Night' => 'Noche',
+        'Off' => 'Apagado',
+        'Sport' => 'Deporte',
+        'User 1' => 'Usuario 1',
+        'User 2' => 'Usuario 2',
+      },
+    },
+   'SceneType' => {
+      Description => 'Tipo Escena',
+      PrintConv => {
+        'Directly photographed' => 'Imagen fotografiada directamente',
+      },
+    },
+   'SecurityClassification' => {
+      Description => 'ClasificaciÃ³n Seguridad',
+      PrintConv => {
+        'Confidential' => 'Confidencial',
+        'Restricted' => 'Restringida',
+        'Secret' => 'Secreta',
+        'Top Secret' => 'Alto secreto',
+        'Unclassified' => 'Sin clasificar',
+      },
+    },
+   'SelfTimer' => {
+      Description => 'Temporizador AutomÃ¡tico',
+      PrintConv => {
+        'Off' => 'Apagado',
+        'On' => 'Encendido',
+      },
+    },
+   'SelfTimerMode' => 'Modo AutomÃ¡tico',
+   'SensingMethod' => {
+      Description => 'MÃ©todo Sensor',
+      PrintConv => {
+        'Color sequential area' => 'Sensor de color secuencial',
+        'Color sequential linear' => 'Sensor lineal de color secuencial',
+        'Monochrome area' => 'Sensor monocromo',
+        'Monochrome linear' => 'Sensor lineal monocromo',
+        'Not defined' => 'No definido',
+        'One-chip color area' => 'Sensor monochip de color',
+        'Three-chip color area' => 'Sensor tres chips de color',
+        'Trilinear' => 'Sensor trilineal',
+        'Two-chip color area' => 'Sensor bichip de color',
+      },
+    },
+   'SequenceShotInterval' => {
+      Description => 'Intervalo Disparo Secuencial',
+      PrintConv => {
+        '10 frames/s' => '10 cuadros/s',
+        '15 frames/s' => '15 cuadros/s',
+        '20 frames/s' => '20 cuadros/s',
+        '5 frames/s' => '5 cuadros/s',
+      },
+    },
+   'SequentialShot' => {
+      Description => 'Disparo Secuencial',
+      PrintConv => {
+        'Adjust Exposure' => 'Ajustar ExposiciÃ³n',
+        'Best' => 'Mejor',
+        'None' => 'Ninguno',
+        'Standard' => 'Estandar',
+      },
+    },
+   'SerialNumber' => 'NÃºmero Serie',
+   'ServiceIdentifier' => 'Identificador Servicio',
+   'ShadingCompensation' => 'CompensaciÃ³n de Sombreado',
+   'Shadow' => 'Sombra',
+   'ShadowScale' => 'Escala Sombra',
+   'Sharpness' => {
+      Description => 'Nitidez',
+      PrintConv => {
+        'Hard' => 'Fuerte',
+        'Normal' => 'EstÃ¡ndar',
+        'Sharp' => 'Nitido',
+        'Soft' => 'Suave',
+      },
+    },
+   'ShootingMode' => 'Modo de Disparo',
+   'ShortDocumentID' => 'ID Corta del Documento',
+   'ShutterReleaseNoCFCard' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'ShutterSpeed' => 'Hora ExposiciÃ³n',
+   'ShutterSpeedValue' => 'Velocidad ObturaciÃ³n',
+   'SimilarityIndex' => 'Ãndice de Similitudes',
+   'Site' => 'Sitio',
+   'SlideShow' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'Software' => 'Programa Utilizado',
+   'SoftwareVersion' => 'VersiÃ³n Software',
+   'Source' => 'Fuente',
+   'SpatialFrequencyResponse' => 'Respuesta Frecuencia Espacial',
+   'SpecialInstructions' => 'Instrucciones',
+   'SpecialMode' => 'Modo Especial',
+   'SpectralSensitivity' => 'Sensibilidad Espectral',
+   'State' => 'Estado',
+   'StripByteCounts' => 'Bytes por Tira Comprimida',
+   'StripOffsets' => 'LocalizaciÃ³n Datos Imagen',
+   'Sub-location' => 'LocalizaciÃ³n',
+   'SubSecTime' => 'Subsegundos DateTime',
+   'SubSecTimeDigitized' => 'Subsegundos DateTimeDigitized',
+   'SubSecTimeOriginal' => 'Subsegundos DateTimeOriginal',
+   'SubTileBlockSize' => 'TamaÃ±o Bloque Submosaico',
+   'SubfileType' => 'Nuevo Tipo Subarchivo',
+   'Subject' => 'Sujeto',
+   'SubjectArea' => 'Zona Sujeto',
+   'SubjectDistance' => 'Distancia Sujeto',
+   'SubjectDistanceRange' => {
+      Description => 'Intervalo Distancia Sujeto',
+      PrintConv => {
+        'Close' => 'Vista cercana',
+        'Distant' => 'Vista alejada',
+        'Unknown' => 'Desconocido',
+      },
+    },
+   'SubjectLocation' => 'LocalizaciÃ³n Sujeto',
+   'SubjectReference' => 'CÃ³digo Sujeto',
+   'SupplementalCategories' => 'CategorÃ­a Suplementaria',
+   'SupplementalType' => {
+      Description => 'Tipo Suplemento',
+      PrintConv => {
+        'Main Image' => 'No Definido',
+        'Rasterized Caption' => 'TÃ­tulo Rasterizado',
+        'Reduced Resolution Image' => 'Imagen resoluciÃ³n reducida',
+      },
+    },
+   'T4Options' => 'Opciones T4',
+   'T6Options' => 'Opciones T6',
+   'TIFF-EPStandardID' => 'ID Estandar TIFF/EP',
+   'Tagged' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'TargetPrinter' => 'Impresora Objetivo',
+   'Technology' => {
+      Description => 'TecnologÃ­a',
+      PrintConv => {
+        'Active Matrix Display' => 'Pantalla Matriz Activa',
+        'Cathode Ray Tube Display' => 'Pantalla Tubo Rayos CatÃ³dicos',
+        'Digital Camera' => 'CÃ¡mara Digital',
+        'Dye Sublimation Printer' => 'Impresora SublimaciÃ³n',
+        'Electrophotographic Printer' => 'Impresora ElectrofotogrÃ¡fica (Laser)',
+        'Electrostatic Printer' => 'Impresora ElectrostÃ¡tica',
+        'Film Scanner' => 'Escaner PelÃ­cula',
+        'Film Writer' => 'Impresora PelÃ­cula',
+        'Flexography' => 'FlexografÃ­a',
+        'Gravure' => 'Grabado',
+        'Ink Jet Printer' => 'Impresora InyecciÃ³n Tinta',
+        'Offset Lithography' => 'LitografÃ­a Offset',
+        'Passive Matrix Display' => 'Pantalla Matriz Pasiva',
+        'Photo Image Setter' => 'Marco Foto',
+        'Photographic Paper Printer' => 'Impresora Papel FotogrÃ¡fico',
+        'Projection Television' => 'TelevisiÃ³n ProyecciÃ³n',
+        'Reflective Scanner' => 'Escaner Reflectivo',
+        'Silkscreen' => 'Pantalla Sedosa',
+        'Thermal Wax Printer' => 'Impresora Cera Termal',
+        'Video Camera' => 'VideocÃ¡mara',
+        'Video Monitor' => 'Monitor Video',
+      },
+    },
+   'Text' => 'Texto',
+   'Thresholding' => 'Umbral',
+   'ThumbnailImage' => 'Miniatura',
+   'ThumbnailImageSize' => 'TamaÃ±o de la Vista en Miniatura',
+   'TileByteCounts' => 'NÃºmero Byte Elemento',
+   'TileDepth' => 'Ancho Elemento',
+   'TileLength' => 'Largo Elemento',
+   'TileOffsets' => 'Offsets Elemento',
+   'TileWidth' => 'Ancho Elemento',
+   'TimeCreated' => 'Hora CreaciÃ³n',
+   'TimeSent' => 'Hora EnvÃ­o',
+   'TimeZoneOffset' => 'Offset Zona Horaria',
+   'Title' => 'TÃ­tulo',
+   'ToneCurveActive' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'TransferFunction' => 'FunciÃ³n Transferencia',
+   'TransferRange' => 'Intervalo Transferencia',
+   'Transformation' => {
+      Description => 'TransformaciÃ³n',
+      PrintConv => {
+        'Mirror horizontal' => 'Invertir horizontal',
+        'Mirror horizontal and rotate 270 CW' => 'Invertir horizontal y rotar 270Â° sentido reloj',
+        'Mirror horizontal and rotate 90 CW' => 'Invertir horizontal y rotar 90Â° sentido reloj',
+        'Mirror vertical' => 'Invertir vertical',
+        'Rotate 180' => 'Rotar 180Â°',
+        'Rotate 270 CW' => 'Rotar 270Â° sentido reloj',
+        'Rotate 90 CW' => 'Rotar 90Â° sentido reloj',
+      },
+    },
+   'TransmissionReference' => 'Referencia de TransmisiÃ³n',
+   'TransparencyIndicator' => 'Indicador Transparencia',
+   'TrapIndicator' => 'Indicador Tampa',
+   'Type' => 'Tipo',
+   'Uncompressed' => {
+      Description => 'Sin Comprimir',
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'UniqueCameraModel' => 'Modelo CÃ¡mara Unico',
+   'UniqueDocumentID' => 'ID de Documento Ãnica',
+   'UniqueObjectName' => 'Nombre Ãnico de Objeto',
+   'Unknown' => 'Desconocido',
+   'Urgency' => {
+      Description => 'Urgencia',
+      PrintConv => {
+        '0 (reserved)' => '0 (reservado para futuro uso)',
+        '1 (most urgent)' => '1 (mÃ¡s urgente)',
+        '5 (normal urgency)' => '5 (urgencia normal)',
+        '8 (least urgent)' => '8 (menos urgente)',
+        '9 (user-defined priority)' => '9 (reservado para futuro uso)',
+      },
+    },
+   'UserComment' => 'Comentarios Usuario',
+   'Version' => 'VersiÃ³n PrintIM',
+   'VideoCardGamma' => 'Tarjeta Video Gamma',
+   'ViewingCondDesc' => 'DescripciÃ³n en Condiciones de VisiÃ³n',
+   'ViewingCondIlluminant' => 'IluminaciÃ³n en Condiciones de VisiÃ³n',
+   'ViewingCondIlluminantType' => 'Tipo IluminaciÃ³n en Condiciones de VisiÃ³n',
+   'ViewingCondSurround' => 'Entorno en Condiciones de VisiÃ³n',
+   'ViewingConditions' => 'IluminaciÃ³n en Condiciones de VisiÃ³n',
+   'VoiceMemo' => {
+      Description => 'Notas Voz',
+      PrintConv => {
+        'Off' => 'Apagado',
+        'On' => 'Encendido',
+      },
+    },
+   'WBFineTuneActive' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'WCSProfiles' => 'Perfil Sistema Color Windows',
+   'WhiteBalance' => {
+      Description => 'Equilibrio Blanco',
+      PrintConv => {
+        'Auto' => 'AutomÃ¡tico',
+        'Black & White' => 'Monocromo',
+        'Cloudy' => 'Nuboso',
+        'Color Temperature/Color Filter' => 'Temperatura de color / Filtro de color',
+        'Cool White Fluorescent' => 'Fluorescente blanco frÃ­o',
+        'Custom' => 'Personalizado',
+        'Custom 1' => 'PERSONAL.1',
+        'Custom 2' => 'PERSONAL.2',
+        'Custom 3' => 'PERSONAL.3',
+        'Custom 4' => 'PERSONAL.4',
+        'Day White Fluorescent' => 'Fluorescente blanco de dÃ­a',
+        'Daylight' => 'Luz de dÃ­a',
+        'Daylight Fluorescent' => 'Fluorescente de luz del dÃ­a',
+        'Fluorescent' => 'Flourescente',
+        'Manual' => 'Equilibrio del blanco manual',
+        'Shade' => 'Sombra',
+        'Tungsten' => 'Tungsteno',
+        'Unknown' => 'Desconocido',
+        'Warm White Fluorescent' => 'Fluorescente blanco cÃ¡lido',
+        'White Fluorescent' => 'Fluorescente blanco',
+      },
+    },
+   'WhiteLevel' => 'Nivel Blanco',
+   'WhitePoint' => 'Cromaticidad Punto Blanco',
+   'WideRange' => {
+      Description => 'Intervalo Extendido',
+      PrintConv => {
+        'Off' => 'Apagado',
+        'On' => 'Encendido',
+      },
+    },
+   'WidthResolution' => 'ResoluciÃ³n Imagen Horizontal',
+   'Writer-Editor' => 'TÃ­tulo/DescripciÃ³n Escritor',
+   'X3FillLight' => 'Luz Relleno X3',
+   'XClipPathUnits' => 'Unidades Camino Fragmento X',
+   'XMP' => 'Metadatos XMP',
+   'XPosition' => 'PosiciÃ³n X',
+   'XResolution' => 'ResoluciÃ³n Imagen Horizontal',
+   'YCbCrCoefficients' => 'Coeficientes de Matriz de TranformaciÃ³n de Espacio de Color',
+   'YCbCrPositioning' => {
+      Description => 'Posicionamiento Y y C',
+      PrintConv => {
+        'Centered' => 'Centrado',
+        'Co-sited' => 'Vecino',
+      },
+    },
+   'YCbCrSubSampling' => 'Ratio Submuestreo de Y a C',
+   'YClipPathUnits' => 'Unidades Camino Fragmento Y',
+   'YPosition' => 'PosiciÃ³n Y',
+   'YResolution' => 'ResoluciÃ³n Imagen Vertical',
+   'ZoneMatching' => {
+      Description => 'Zone matching',
+      PrintConv => {
+        'High Key' => 'Hi',
+        'ISO Setting Used' => 'Desactivado',
+        'Low Key' => 'Lo',
+      },
+    },
+);
+
+1;  # end
+
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Lang::es.pm - ExifTool Spanish language translations
+
+=head1 DESCRIPTION
+
+This file is used by Image::ExifTool to generate localized tag descriptions
+and values.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Jens Duttke and Santiago del BrE<iacute>o GonzE<aacute>lez for
+providing this translation.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool(3pm)|Image::ExifTool>,
+L<Image::ExifTool::TagInfoXML(3pm)|Image::ExifTool::TagInfoXML>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/fr.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/fr.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/fr.pm	(revision 24799)
@@ -0,0 +1,4704 @@
+#------------------------------------------------------------------------------
+# File:         fr.pm
+#
+# Description:  ExifTool French language translations
+#
+# Notes:        This file generated automatically by Image::ExifTool::TagInfoXML
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Lang::fr;
+
+use strict;
+use vars qw($VERSION);
+
+$VERSION = '1.19';
+
+%Image::ExifTool::Lang::fr::Translate = (
+   'AEAperture' => 'Ouverture AE',
+   'AEBAutoCancel' => {
+      Description => 'Annulation bracketing auto',
+      PrintConv => {
+        'Off' => 'ArrÃªt',
+        'On' => 'Marche',
+      },
+    },
+   'AEBSequence' => 'SÃ©quence de bracketing',
+   'AEBSequenceAutoCancel' => {
+      Description => 'SÃ©quence auto AEB/annuler',
+      PrintConv => {
+        '-,0,+/Disabled' => '-,0,+/DÃ©sactivÃ©',
+        '-,0,+/Enabled' => '-,0,+/ActivÃ©',
+        '0,-,+/Disabled' => '0,-,+/DÃ©sactivÃ©',
+        '0,-,+/Enabled' => '0,-,+/ActivÃ©',
+      },
+    },
+   'AEBShotCount' => 'Nombre de vues bracketÃ©es',
+   'AEBXv' => 'Compensation d\'expo. auto en bracketing',
+   'AEExposureTime' => 'Temps d\'exposition AE',
+   'AEExtra' => 'SupplÃ©ments AE',
+   'AEInfo' => 'Info sur l\'exposition auto',
+   'AELock' => {
+      Description => 'Verrouillage AE',
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'AEMaxAperture' => 'Ouverture maxi AE',
+   'AEMaxAperture2' => 'Ouverture maxi AE (2)',
+   'AEMeteringMode' => {
+      Description => 'Mode de mesure AE',
+      PrintConv => {
+        'Multi-segment' => 'Multizone',
+      },
+    },
+   'AEMeteringSegments' => 'Segments de mesure AE',
+   'AEMinAperture' => 'Ouverture mini AE',
+   'AEMinExposureTime' => 'Temps d\'exposition mini AE',
+   'AEProgramMode' => {
+      Description => 'Mode programme AE',
+      PrintConv => {
+        'Av, B or X' => 'Av, B ou X',
+        'Candlelight' => 'Bougie',
+        'DOF Program' => 'Programme PdC',
+        'DOF Program (P-Shift)' => 'Programme PdC (dÃ©calage P)',
+        'Hi-speed Program' => 'Programme grande vitesse',
+        'Hi-speed Program (P-Shift)' => 'Programme grande vitesse (dÃ©calage P)',
+        'Kids' => 'Enfants',
+        'Landscape' => 'Paysage',
+        'M, P or TAv' => 'M, P ou TAv',
+        'MTF Program' => 'Programme FTM',
+        'MTF Program (P-Shift)' => 'Programme FTM (dÃ©calage P)',
+        'Museum' => 'MusÃ©e',
+        'Night Scene' => 'Nocturne',
+        'Night Scene Portrait' => 'Portrait nocturne',
+        'No Flash' => 'Sans flash',
+        'Pet' => 'Animaux de compagnie',
+        'Sunset' => 'Coucher de soleil',
+        'Surf & Snow' => 'Surf et neige',
+        'Sv or Green Mode' => 'Sv ou mode vert',
+        'Text' => 'Texte',
+      },
+    },
+   'AEXv' => 'Compensation d\'exposition auto',
+   'AE_ISO' => 'SensibilitÃ© ISO AE',
+   'AFAdjustment' => 'Ajustement AF',
+   'AFAperture' => 'Ouverture AF',
+   'AFAreaIllumination' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'AFAreaMode' => {
+      Description => 'Mode de zone AF',
+      PrintConv => {
+        '1-area' => 'Mise au point 1 zone',
+        '1-area (high speed)' => 'Mise au point 1 zone (haute vitesse)',
+        '3-area (center)?' => 'Mise au point 3 zones (au centre) ?',
+        '3-area (high speed)' => 'Mise au point 3 zones (haute vitesse)',
+        '3-area (left)?' => 'Mise au point 3 zones (Ã  gauche) ?',
+        '3-area (right)?' => 'Mise au point 3 zones (Ã  droite) ?',
+        '5-area' => 'Mise au point 5 zones',
+        '9-area' => 'Mise au point 9 zones',
+        'Face Detect AF' => 'DÃ©t. visage',
+        'Spot Focusing' => 'Mise au point Spot',
+        'Spot Mode Off' => 'Mode Spot dÃ©sactivÃ©',
+        'Spot Mode On' => 'Mode Spot enclenchÃ©',
+      },
+    },
+   'AFAssist' => {
+      Description => 'Faisceau d\'assistance AF',
+      PrintConv => {
+        'Does not emit/Fires' => 'N\'Ã©met pas/Se dÃ©clenche',
+        'Emits/Does not fire' => 'Emet/Ne se dÃ©clenche pas',
+        'Emits/Fires' => 'Emet/Se dÃ©clenche',
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+        'Only ext. flash emits/Fires' => 'Flash ext Ã©met/Se dÃ©clenche',
+      },
+    },
+   'AFAssistBeam' => {
+      Description => 'Faisceau d\'assistance AF',
+      PrintConv => {
+        'Does not emit' => 'DÃ©sactivÃ©',
+        'Emits' => 'ActivÃ©',
+        'Only ext. flash emits' => 'Uniquement par flash ext.',
+      },
+    },
+   'AFDefocus' => 'DÃ©focalisation AF',
+   'AFDuringLiveView' => {
+      Description => 'AF pendant la visÃ©e directe',
+      PrintConv => {
+        'Disable' => 'DÃ©sactivÃ©',
+        'Enable' => 'ActivÃ©',
+        'Live mode' => 'Mode visÃ©e directe',
+        'Quick mode' => 'Mode rapide',
+      },
+    },
+   'AFInfo' => 'Info autofocus',
+   'AFInfo2' => 'Infos AF',
+   'AFInfo2Version' => 'Version des infos AF',
+   'AFIntegrationTime' => 'Temps d\'intÃ©gration AF',
+   'AFMicroAdjActive' => {
+      PrintConv => {
+        'No' => 'Non',
+        'Yes' => 'Oui',
+      },
+    },
+   'AFMicroadjustment' => {
+      Description => 'Micro-ajustement de l\'AF',
+      PrintConv => {
+        'Adjust all by same amount' => 'Ajuster idem tous obj',
+        'Adjust by lens' => 'Ajuster par objectif',
+        'Disable' => 'DÃ©sactivÃ©',
+      },
+    },
+   'AFMode' => 'Mode AF',
+   'AFOnAELockButtonSwitch' => {
+      Description => 'Permutation touche AF/MÃ©mo',
+      PrintConv => {
+        'Disable' => 'DÃ©sactivÃ©',
+        'Enable' => 'ActivÃ©',
+      },
+    },
+   'AFPoint' => {
+      Description => 'Point AF',
+      PrintConv => {
+        'Bottom' => 'Bas',
+        'Center' => 'Centre',
+        'Far Left' => 'ExtrÃšme-gauche',
+        'Far Right' => 'ExtrÃšme-droit',
+        'Left' => 'Gauche',
+        'Lower-left' => 'Bas-gauche',
+        'Lower-right' => 'Bas-droit',
+        'Mid-left' => 'Milieu gauche',
+        'Mid-right' => 'Milieu droit',
+        'None' => 'Aucune',
+        'Right' => 'Droit',
+        'Top' => 'Haut',
+        'Upper-left' => 'Haut-gauche',
+        'Upper-right' => 'Haut-droit',
+      },
+    },
+   'AFPointActivationArea' => {
+      Description => 'Zone activation collimateurs AF',
+      PrintConv => {
+        'Automatic expanded (max. 13)' => 'Expansion auto (13 max.)',
+        'Expanded (TTL. of 7 AF points)' => 'Expansion (TTL 7 collimat.)',
+        'Single AF point' => 'Un seul collimateur AF',
+      },
+    },
+   'AFPointAreaExpansion' => {
+      Description => 'Extension de la zone AF',
+      PrintConv => {
+        'Disable' => 'DÃ©sactivÃ©',
+        'Enable' => 'ActivÃ©',
+        'Left/right AF points' => 'ActivÃ© (gauche/droite collimateurs autofocus d\'assistance)',
+        'Surrounding AF points' => 'ActivÃ©e (Collimateurs autofocus d\'assistance environnants)',
+      },
+    },
+   'AFPointAutoSelection' => {
+      Description => 'SÃ©lecition des collimateurs automatique',
+      PrintConv => {
+        'Control-direct:disable/Main:disable' => 'ContrÃŽle rapide-Directe:dÃ©sactivÃ©/Principale:dÃ©sactivÃ©',
+        'Control-direct:disable/Main:enable' => 'ContrÃŽle rapide-Directe:dÃ©sactivÃ©/Principale:activÃ©',
+        'Control-direct:enable/Main:enable' => 'ContrÃŽle rapide-Directe:activÃ©/Principale:activÃ©',
+      },
+    },
+   'AFPointBrightness' => {
+      Description => 'IntensitÃ© d\'illumination AF',
+      PrintConv => {
+        'Brighter' => 'Forte',
+        'Normal' => 'Normale',
+      },
+    },
+   'AFPointDisplayDuringFocus' => {
+      Description => 'Affichage de point AF pendant mise au point',
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+        'On (when focus achieved)' => 'ActivÃ© (si mise au point effectuÃ©e)',
+      },
+    },
+   'AFPointIllumination' => {
+      Description => 'Eclairage des collimateurs AF',
+      PrintConv => {
+        'Brighter' => 'Plus brillant',
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+        'On without dimming' => 'ActivÃ© sans attÃ©nuation',
+      },
+    },
+   'AFPointMode' => 'Mode de mise au point AF',
+   'AFPointRegistration' => {
+      Description => 'Validation du point AF',
+      PrintConv => {
+        'Automatic' => 'Auto',
+        'Bottom' => 'Bas',
+        'Center' => 'Centre',
+        'Extreme Left' => 'ExtrÃªme gauche',
+        'Extreme Right' => 'ExtrÃªme droite',
+        'Left' => 'Gauche',
+        'Right' => 'Droit',
+        'Top' => 'Haut',
+      },
+    },
+   'AFPointSelected' => {
+      Description => 'Point AF sÃ©lectionnÃ©',
+      PrintConv => {
+        'Automatic Tracking AF' => 'AF en suivi auto',
+        'Bottom' => 'Bas',
+        'Center' => 'Centre',
+        'Face Detect AF' => 'AF en reconnaissance de visage',
+        'Fixed Center' => 'Fixe au centre',
+        'Left' => 'Gauche',
+        'Lower-left' => 'Bas gauche',
+        'Lower-right' => 'Bas droit',
+        'Mid-left' => 'Milieu gauche',
+        'Mid-right' => 'Milieu droit',
+        'Right' => 'Droit',
+        'Top' => 'Haut',
+        'Upper-left' => 'Haut gauche',
+        'Upper-right' => 'Haut droite',
+      },
+    },
+   'AFPointSelected2' => 'Point AF sÃ©lectionnÃ© 2',
+   'AFPointSelection' => 'MÃ©thode sÃ©lect. collimateurs AF',
+   'AFPointSelectionMethod' => {
+      Description => 'MÃ©thode sÃ©lection collim. AF',
+      PrintConv => {
+        'Multi-controller direct' => 'MulticontrÃŽleur direct',
+        'Normal' => 'Normale',
+        'Quick Control Dial direct' => 'Molette AR directe',
+      },
+    },
+   'AFPointSpotMetering' => {
+      Description => 'Nombre collimateurs/mesure spot',
+      PrintConv => {
+        '11/Active AF point' => '11/collimateur AF actif',
+        '11/Center AF point' => '11/collimateur AF central',
+        '45/Center AF point' => '45/collimateur AF central',
+        '9/Active AF point' => '9/collimateur AF actif',
+      },
+    },
+   'AFPointsInFocus' => {
+      Description => 'Points AF nets',
+      PrintConv => {
+        'All' => 'Tous',
+        'Bottom' => 'Bas',
+        'Bottom, Center' => 'Bas + centre',
+        'Bottom-center' => 'Bas centre',
+        'Bottom-left' => 'Bas gauche',
+        'Bottom-right' => 'Bas droit',
+        'Center' => 'Centre',
+        'Center (horizontal)' => 'Centre (horizontal)',
+        'Center (vertical)' => 'Centre (vertical)',
+        'Center+Right' => 'Centre+droit',
+        'Fixed Center or Multiple' => 'Centre fixe ou multiple',
+        'Left' => 'Gauche',
+        'Left+Center' => 'Gauch+centre',
+        'Left+Right' => 'Gauche+droit',
+        'Lower-left, Bottom' => 'Bas gauche + bas',
+        'Lower-left, Mid-left' => 'Bas gauche + milieu gauche',
+        'Lower-right, Bottom' => 'Bas droit + bas',
+        'Lower-right, Mid-right' => 'Bas droit + milieu droit',
+        'Mid-left' => 'Milieu gauche',
+        'Mid-left, Center' => 'Milieu gauche + centre',
+        'Mid-right' => 'Milieu droit',
+        'Mid-right, Center' => 'Milieu droit + centre',
+        'None' => 'Aucune',
+        'None (MF)' => 'Aucune (MF)',
+        'Right' => 'Droit',
+        'Top' => 'Haut',
+        'Top, Center' => 'Haut + centre',
+        'Top-center' => 'Haut centre',
+        'Top-left' => 'Haut gauche',
+        'Top-right' => 'Haut droit',
+        'Upper-left, Mid-left' => 'Haut gauche + milieu gauche',
+        'Upper-left, Top' => 'Haut gauche + haut',
+        'Upper-right, Mid-right' => 'Haut droit + milieu droit',
+        'Upper-right, Top' => 'Haut droit + haut',
+      },
+    },
+   'AFPointsSelected' => 'Points AF sÃ©lectionnÃ©s',
+   'AFPointsUnknown1' => {
+      PrintConv => {
+        'All' => 'Tous',
+        'Central 9 points' => '9 points centraux',
+      },
+    },
+   'AFPointsUnknown2' => 'Points AF inconnus 2',
+   'AFPointsUsed' => {
+      Description => 'Points AF utilisÃ©s',
+      PrintConv => {
+        'Bottom' => 'Bas',
+        'Center' => 'Centre',
+        'Mid-left' => 'Milieu gauche',
+        'Mid-right' => 'Milieu droit',
+        'Top' => 'Haut',
+      },
+    },
+   'AFPredictor' => 'PrÃ©dicteur AF',
+   'AFResponse' => 'RÃ©ponse AF',
+   'AIServoContinuousShooting' => 'PrioritÃ© vit. mÃ©ca. AI Servo',
+   'AIServoImagePriority' => {
+      Description => '1er Servo Ai/2e prioritÃ© dÃ©clenchement',
+      PrintConv => {
+        '1: AF, 2: Drive speed' => 'PrioritÃ© AF/PrioritÃ© cadence vues',
+        '1: AF, 2: Tracking' => 'PrioritÃ© AF/PrioritÃ© suivi AF',
+        '1: Release, 2: Drive speed' => 'DÃ©clenchement/PrioritÃ© cadence vues',
+      },
+    },
+   'AIServoTrackingMethod' => {
+      Description => 'MÃ©thode de suivi autofocus AI Servo',
+      PrintConv => {
+        'Continuous AF track priority' => 'PrioritÃ© suivi AF en continu',
+        'Main focus point priority' => 'PrioritÃ© point AF principal',
+      },
+    },
+   'AIServoTrackingSensitivity' => {
+      Description => 'Sensibili. de suivi AI Servo',
+      PrintConv => {
+        'Fast' => 'Schnell',
+        'Medium Fast' => 'Moyenne rapide',
+        'Medium Slow' => 'Moyenne lent',
+        'Moderately fast' => 'Moyennement rapide',
+        'Moderately slow' => 'Moyennement lent',
+        'Slow' => 'Lent',
+      },
+    },
+   'APEVersion' => 'Version APE',
+   'ARMIdentifier' => 'Identificateur ARM',
+   'ARMVersion' => 'Version ARM',
+   'AToB0' => 'A Ã  B0',
+   'AToB1' => 'A Ã  B1',
+   'AToB2' => 'A Ã  B2',
+   'AccessoryType' => 'Type d\'accessoire',
+   'ActionAdvised' => {
+      Description => 'Action conseillÃ©e',
+      PrintConv => {
+        'Object Kill' => 'Destruction d\'objet',
+        'Object Reference' => 'RÃ©fÃ©rence d\'objet',
+        'Object Replace' => 'Remplacement d\'objet',
+        'Ojbect Append' => 'Ajout d\'objet',
+      },
+    },
+   'ActiveArea' => 'Zone active',
+   'ActiveD-Lighting' => {
+      PrintConv => {
+        'Low' => 'Bas',
+        'Normal' => 'Normale',
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'ActiveD-LightingMode' => {
+      PrintConv => {
+        'Low' => 'Bas',
+        'Normal' => 'Normale',
+        'Off' => 'DÃ©sactivÃ©',
+      },
+    },
+   'AddAspectRatioInfo' => {
+      Description => 'Ajouter info ratio d\'aspect',
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+      },
+    },
+   'AddOriginalDecisionData' => {
+      Description => 'Aj. donnÃ©es dÃ©cis. origine',
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'AdditionalModelInformation' => 'Modele d\'Information additionnel',
+   'Address' => 'Adresse',
+   'AdultContentWarning' => {
+      PrintConv => {
+        'Unknown' => 'Inconnu',
+      },
+    },
+   'AdvancedRaw' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'Advisory' => 'AdversitÃ©',
+   'AnalogBalance' => 'Balance analogique',
+   'Annotations' => 'Annotations Photoshop',
+   'Anti-Blur' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'n/a' => 'Non Ã©tablie',
+      },
+    },
+   'AntiAliasStrength' => 'Puissance relative du filtre anticrÃ©nelage de l\'appareil',
+   'Aperture' => 'Ouverture',
+   'ApertureRange' => {
+      Description => 'RÃ©gler gamme d\'ouvertures',
+      PrintConv => {
+        'Disable' => 'DÃ©sactivÃ©',
+        'Enable' => 'ActivÃ©e',
+      },
+    },
+   'ApertureRingUse' => {
+      Description => 'Utilisation de la bague de diaphragme',
+      PrintConv => {
+        'Permitted' => 'AutorisÃ©e',
+        'Prohibited' => 'Interdite',
+      },
+    },
+   'ApertureValue' => 'Ouverture',
+   'ApplicationRecordVersion' => 'Version d\'enregistrement',
+   'ApplyShootingMeteringMode' => {
+      Description => 'Appliquer mode de prise de vue/de mesure',
+      PrintConv => {
+        'Disable' => 'DÃ©sactivÃ©',
+        'Enable' => 'ActivÃ©e',
+      },
+    },
+   'Artist' => 'Artiste',
+   'ArtworkCopyrightNotice' => 'Notice copyright de l\'Illustration',
+   'ArtworkCreator' => 'CrÃ©ateur de l\'Illustration',
+   'ArtworkDateCreated' => 'Date de crÃ©ation de l\'Illustration',
+   'ArtworkSource' => 'Source de l\'Illustration',
+   'ArtworkSourceInventoryNo' => 'No d\'Inventaire du source de l\'Illustration',
+   'ArtworkTitle' => 'Titre de l\'Illustration',
+   'AsShotICCProfile' => 'Profil ICC Ã  la prise de vue',
+   'AsShotNeutral' => 'Balance neutre Ã  la prise de vue',
+   'AsShotPreProfileMatrix' => 'Matrice de prÃ©-profil Ã  la prise de vue',
+   'AsShotProfileName' => 'Nom du profil du clichÃ©',
+   'AsShotWhiteXY' => 'Balance blanc X-Y Ã  la prise de vue',
+   'AssignFuncButton' => {
+      Description => 'Changer fonct. touche FUNC.',
+      PrintConv => {
+        'Exposure comp./AEB setting' => 'Correct. expo/rÃ©glage AEB',
+        'Image jump with main dial' => 'Saut image par molette principale',
+        'Image quality' => 'Changer de qualitÃ©',
+        'LCD brightness' => 'LuminositÃ© LCD',
+        'Live view function settings' => 'RÃ©glages VisÃ©e par lâÃ©cran',
+      },
+    },
+   'AssistButtonFunction' => {
+      Description => 'Touche de fonction rapide',
+      PrintConv => {
+        'Av+/- (AF point by QCD)' => 'Av+/- (AF par mol. AR)',
+        'FE lock' => 'MÃ©mo expo. au flash',
+        'Normal' => 'Normale',
+        'Select HP (while pressing)' => 'SÃ©lect. HP (en appuyant)',
+        'Select Home Position' => 'SÃ©lect. position origine',
+      },
+    },
+   'Audio' => {
+      PrintConv => {
+        'No' => 'Non',
+        'Yes' => 'Oui',
+      },
+    },
+   'AudioDuration' => 'DurÃ©e audio',
+   'AudioOutcue' => 'Queue audio',
+   'AudioSamplingRate' => 'Taux d\'Ã©chantillonnage audio',
+   'AudioSamplingResolution' => 'RÃ©solution d\'Ã©chantillonnage audio',
+   'AudioType' => {
+      Description => 'Type audio',
+      PrintConv => {
+        'Mono Actuality' => 'ActualitÃ© (audio mono (1 canal))',
+        'Mono Music' => 'Musique, transmise par elle-mÃªme (audio mono (1 canal))',
+        'Mono Question and Answer Session' => 'Question et rÃ©ponse (audio mono (1 canal))',
+        'Mono Raw Sound' => 'Son brut (audio mono (1 canal))',
+        'Mono Response to a Question' => 'RÃ©ponse Ã  une question (audio mono (1 canal))',
+        'Mono Scener' => 'Scener (audio mono (1 canal))',
+        'Mono Voicer' => 'Voix (audio mono (1 canal))',
+        'Mono Wrap' => 'Wrap (audio mono (1 canal))',
+        'Stereo Actuality' => 'ActualitÃ© (audio stÃ©rÃ©o (2 canaux))',
+        'Stereo Music' => 'Musique, transmise par elle-mÃªme (audio stÃ©rÃ©o (2 canaux))',
+        'Stereo Question and Answer Session' => 'Question et rÃ©ponse (audio stÃ©rÃ©o (2 canaux))',
+        'Stereo Raw Sound' => 'Son brut (audio stÃ©rÃ©o (2 canaux))',
+        'Stereo Response to a Question' => 'RÃ©ponse Ã  une question (audio stÃ©rÃ©o (2 canaux))',
+        'Stereo Scener' => 'Scener (audio stÃ©rÃ©o (2 canaux))',
+        'Stereo Voicer' => 'Voix (audio stÃ©rÃ©o (2 canaux))',
+        'Stereo Wrap' => 'Wrap (audio stÃ©rÃ©o (2 canaux))',
+        'Text Only' => 'Texte seul (pas de donnÃ©es d\'objet)',
+      },
+    },
+   'Author' => 'Auteur',
+   'AuthorsPosition' => 'Titre du crÃ©ateur',
+   'AutoAperture' => {
+      Description => 'Auto-diaph',
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'AutoBracketing' => {
+      Description => 'Bracketing auto',
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'AutoExposureBracketing' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'AutoFP' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'AutoFocus' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'AutoISO' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'AutoLightingOptimizer' => {
+      Description => 'Correction auto de luminositÃ©',
+      PrintConv => {
+        'Disable' => 'DÃ©sactivÃ©',
+        'Enable' => 'Actif',
+        'Low' => 'Faible',
+        'Off' => 'DÃ©sactivÃ©',
+        'Strong' => 'Importante',
+        'n/a' => 'Non Ã©tablie',
+      },
+    },
+   'AutoLightingOptimizerOn' => {
+      PrintConv => {
+        'No' => 'Non',
+        'Yes' => 'Oui',
+      },
+    },
+   'AutoRedEye' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'AutoRotate' => {
+      Description => 'Rotation automatique',
+      PrintConv => {
+        'None' => 'Aucune',
+        'Rotate 180' => '180Â° (bas/droit)',
+        'Rotate 270 CW' => '90Â° sens horaire (gauche/bas)',
+        'Rotate 90 CW' => '90Â° sens antihoraire (droit/haut)',
+        'n/a' => 'Inconnu',
+      },
+    },
+   'AuxiliaryLens' => 'Objectif Auxiliaire',
+   'AvApertureSetting' => 'RÃ©glage d\'ouverture Av',
+   'AvSettingWithoutLens' => {
+      Description => 'RÃ©glage Av sans objectif',
+      PrintConv => {
+        'Disable' => 'DÃ©sactivÃ©',
+        'Enable' => 'ActivÃ©',
+      },
+    },
+   'BToA0' => 'B Ã  A0',
+   'BToA1' => 'B Ã  A1',
+   'BToA2' => 'B Ã  A2',
+   'BWMode' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'BackgroundColorIndicator' => 'Indicateur de couleur d\'arriÃšre-plan',
+   'BackgroundColorValue' => 'Valeur de couleur d\'arriÃšre-plan',
+   'BackgroundTiling' => {
+      PrintConv => {
+        'No' => 'Non',
+        'Yes' => 'Oui',
+      },
+    },
+   'BadFaxLines' => 'Mauvaises lignes de Fax',
+   'BannerImageType' => {
+      PrintConv => {
+        'None' => 'Aucune',
+      },
+    },
+   'BaseExposureCompensation' => 'Compensation d\'exposition de base',
+   'BaseURL' => 'URL de base',
+   'BaselineExposure' => 'Exposition de base',
+   'BaselineNoise' => 'Bruit de base',
+   'BaselineSharpness' => 'Accentuation de base',
+   'BatteryInfo' => 'Source d\'alimentation',
+   'BatteryLevel' => 'Niveau de batterie',
+   'BayerGreenSplit' => 'SÃ©paration de vert Bayer',
+   'Beep' => {
+      PrintConv => {
+        'High' => 'Bruyant',
+        'Low' => 'Calme',
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'BestQualityScale' => 'Echelle de meilleure qualitÃ©',
+   'BitsPerComponent' => 'Bits par composante',
+   'BitsPerExtendedRunLength' => 'Bits par Â« Run Length Â» Ã©tendue',
+   'BitsPerRunLength' => 'Bits par Â« Run Length Â»',
+   'BitsPerSample' => 'Nombre de bits par Ã©chantillon',
+   'BlackLevel' => 'Niveau noir',
+   'BlackLevelDeltaH' => 'Delta H du niveau noir',
+   'BlackLevelDeltaV' => 'Delta V du niveau noir',
+   'BlackLevelRepeatDim' => 'Dimension de rÃ©pÃ©tition du niveau noir',
+   'BlackPoint' => 'Point noir',
+   'BlueBalance' => 'Balance bleue',
+   'BlueMatrixColumn' => 'Colonne de matrice bleue',
+   'BlueTRC' => 'Courbe de reproduction des tons bleus',
+   'BlurWarning' => {
+      PrintConv => {
+        'None' => 'Aucune',
+      },
+    },
+   'BodyBatteryADLoad' => 'Tension accu boÃ®tier en charge',
+   'BodyBatteryADNoLoad' => 'Tension accu boÃ®tier Ã  vide',
+   'BodyBatteryState' => {
+      Description => 'Ãtat de accu boÃ®tier',
+      PrintConv => {
+        'Almost Empty' => 'Presque vide',
+        'Empty or Missing' => 'Vide ou absent',
+        'Full' => 'Plein',
+        'Running Low' => 'En baisse',
+      },
+    },
+   'BracketMode' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+      },
+    },
+   'BracketShotNumber' => {
+      Description => 'NumÃ©ro de clichÃ© en bracketing',
+      PrintConv => {
+        '1 of 3' => '1 sur 3',
+        '1 of 5' => '1 sur 5',
+        '2 of 3' => '2 sur 3',
+        '2 of 5' => '2 sur 5',
+        '3 of 3' => '3 sur 3',
+        '3 of 5' => '3 sur 5',
+        '4 of 5' => '4 sur 5',
+        '5 of 5' => '5 sur 5',
+        'n/a' => 'Non Ã©tablie',
+      },
+    },
+   'Brightness' => 'LuminositÃ©',
+   'BrightnessValue' => 'LuminositÃ©',
+   'BulbDuration' => 'DurÃ©e du pose longue',
+   'BurstMode' => {
+      Description => 'Mode Rafale',
+      PrintConv => {
+        'Infinite' => 'Infini',
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'ButtonFunctionControlOff' => {
+      Description => 'Fonction de touche si ContrÃŽle Rapide OFF',
+      PrintConv => {
+        'Disable main, Control, Multi-control' => 'DÃ©sactivÃ©s principale, ContrÃŽle rapide, MulticontrÃŽleur',
+        'Normal (enable)' => 'Normale (activÃ©e)',
+      },
+    },
+   'By-line' => 'CrÃ©ateur',
+   'By-lineTitle' => 'Fonction du crÃ©ateur',
+   'CFALayout' => {
+      Description => 'Organisation CFA',
+      PrintConv => {
+        'Even columns offset down 1/2 row' => 'Organisation dÃ©calÃ©e A : les colonnes paires sont dÃ©calÃ©es vers le bas d\'une demi-rangÃ©e.',
+        'Even columns offset up 1/2 row' => 'Organisation dÃ©calÃ©e B : les colonnes paires sont dÃ©calÃ©es vers le haut d\'une demi-rangÃ©e.',
+        'Even rows offset left 1/2 column' => 'Organisation dÃ©calÃ©e D : les rangÃ©es paires sont dÃ©calÃ©es vers la gauche d\'une demi-colonne.',
+        'Even rows offset right 1/2 column' => 'Organisation dÃ©calÃ©e C : les rangÃ©es paires sont dÃ©calÃ©es vers la droite d\'une demi-colonne.',
+        'Rectangular' => 'Plan rectangulaire (ou carrÃ©)',
+      },
+    },
+   'CFAPattern' => 'Matrice de filtrage couleur',
+   'CFAPattern2' => 'ModÃšle CFA 2',
+   'CFAPlaneColor' => 'Couleur de plan CFA',
+   'CFARepeatPatternDim' => 'Dimension du modÃšle de rÃ©pÃ©tition CFA',
+   'CMMFlags' => 'Drapeaux CMM',
+   'CMYKEquivalent' => 'Equivalent CMJK',
+   'CPUFirmwareVersion' => 'Version de firmware de CPU',
+   'CPUType' => {
+      PrintConv => {
+        'None' => 'Aucune',
+      },
+    },
+   'CalibrationDateTime' => 'Date et heure de calibration',
+   'CalibrationIlluminant1' => {
+      Description => 'Illuminant de calibration 1',
+      PrintConv => {
+        'Cloudy' => 'Temps nuageux',
+        'Cool White Fluorescent' => 'Fluorescente type soft',
+        'Day White Fluorescent' => 'Fluorescente type blanc',
+        'Daylight' => 'LumiÃšre du jour',
+        'Daylight Fluorescent' => 'Fluorescente type jour',
+        'Fine Weather' => 'Beau temps',
+        'Fluorescent' => 'Fluorescente',
+        'ISO Studio Tungsten' => 'TungstÃšne studio ISO',
+        'Other' => 'Autre source de lumiÃšre',
+        'Shade' => 'Ombre',
+        'Standard Light A' => 'LumiÃšre standard A',
+        'Standard Light B' => 'LumiÃšre standard B',
+        'Standard Light C' => 'LumiÃšre standard C',
+        'Tungsten (Incandescent)' => 'TungstÃšne (lumiÃšre incandescente)',
+        'Unknown' => 'Inconnue',
+        'Warm White Fluorescent' => 'Fluorescent blanc chaud',
+        'White Fluorescent' => 'Fluorescent blanc',
+      },
+    },
+   'CalibrationIlluminant2' => {
+      Description => 'Illuminant de calibration 2',
+      PrintConv => {
+        'Cloudy' => 'Temps nuageux',
+        'Cool White Fluorescent' => 'Fluorescente type soft',
+        'Day White Fluorescent' => 'Fluorescente type blanc',
+        'Daylight' => 'LumiÃšre du jour',
+        'Daylight Fluorescent' => 'Fluorescente type jour',
+        'Fine Weather' => 'Beau temps',
+        'Fluorescent' => 'Fluorescente',
+        'ISO Studio Tungsten' => 'TungstÃšne studio ISO',
+        'Other' => 'Autre source de lumiÃšre',
+        'Shade' => 'Ombre',
+        'Standard Light A' => 'LumiÃšre standard A',
+        'Standard Light B' => 'LumiÃšre standard B',
+        'Standard Light C' => 'LumiÃšre standard C',
+        'Tungsten (Incandescent)' => 'TungstÃšne (lumiÃšre incandescente)',
+        'Unknown' => 'Inconnue',
+        'Warm White Fluorescent' => 'Fluorescent blanc chaud',
+        'White Fluorescent' => 'Fluorescent blanc',
+      },
+    },
+   'CameraCalibration1' => 'Calibration d\'appareil 1',
+   'CameraCalibration2' => 'Calibration d\'appareil 2',
+   'CameraCalibrationSig' => 'Signature de calibration de l\'appareil',
+   'CameraOrientation' => {
+      Description => 'Orientation de l\'image',
+      PrintConv => {
+        'Horizontal (normal)' => '0Â° (haut/gauche)',
+        'Rotate 270 CW' => '90Â° sens horaire (gauche/bas)',
+        'Rotate 90 CW' => '90Â° sens antihoraire (droit/haut)',
+      },
+    },
+   'CameraSerialNumber' => 'NumÃ©ro de sÃ©rie de l\'appareil',
+   'CameraSettings' => 'RÃ©glages de l\'appareil',
+   'CameraTemperature' => 'TempÃ©rature de l\'appareil',
+   'CameraType' => 'Type d\'objectif Pentax',
+   'CanonExposureMode' => {
+      PrintConv => {
+        'Aperture-priority AE' => 'PrioritÃ© ouverture',
+        'Bulb' => 'Pose B',
+        'Manual' => 'Manuelle',
+        'Program AE' => 'Programme d\'exposition automatique',
+        'Shutter speed priority AE' => 'PrioritÃ© vitesse',
+      },
+    },
+   'CanonFirmwareVersion' => 'Version de firmware',
+   'CanonFlashMode' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+        'Red-eye reduction' => 'RÃ©duction yeux rouges',
+      },
+    },
+   'CanonImageSize' => {
+      PrintConv => {
+        'Large' => 'Grande',
+        'Medium' => 'Moyenne',
+        'Medium 1' => 'Moyenne 1',
+        'Medium 2' => 'Moyenne 2',
+        'Medium 3' => 'Moyenne 3',
+        'Small' => 'Petite',
+        'Small 1' => 'Petite 1',
+        'Small 2' => 'Petite 2',
+        'Small 3' => 'Petite 3',
+      },
+    },
+   'Caption-Abstract' => 'LÃ©gende / Description',
+   'CaptionWriter' => 'RÃ©dacteur',
+   'CaptureXResolutionUnit' => {
+      PrintConv => {
+        'um' => 'Âµm (micromÃštre)',
+      },
+    },
+   'CaptureYResolutionUnit' => {
+      PrintConv => {
+        'um' => 'Âµm (micromÃštre)',
+      },
+    },
+   'Categories' => 'CatÃ©gories',
+   'Category' => 'CatÃ©gorie',
+   'CellLength' => 'Longueur de cellule',
+   'CellWidth' => 'Largeur de cellule',
+   'CenterWeightedAreaSize' => {
+      PrintConv => {
+        'Average' => 'Moyenne',
+      },
+    },
+   'Certificate' => 'Certificat',
+   'CharTarget' => 'Cible caractÃšre',
+   'CharacterSet' => 'Jeu de caractÃšres',
+   'ChromaBlurRadius' => 'Rayon de flou de chromatisme',
+   'ChromaticAdaptation' => 'Adaptation chromatique',
+   'Chromaticity' => 'ChromaticitÃ©',
+   'ChrominanceNR_TIFF_JPEG' => {
+      PrintConv => {
+        'Low' => 'Bas',
+        'Off' => 'DÃ©sactivÃ©',
+      },
+    },
+   'ChrominanceNoiseReduction' => {
+      PrintConv => {
+        'Low' => 'Bas',
+        'Off' => 'DÃ©sactivÃ©',
+      },
+    },
+   'CircleOfConfusion' => 'Cercle de confusion',
+   'City' => 'Ville',
+   'ClassifyState' => 'Etat de classification',
+   'CleanFaxData' => 'DonnÃ©es de Fax propres',
+   'ClipPath' => 'Chemin de rognage',
+   'CodedCharacterSet' => 'Jeu de caractÃšres codÃ©',
+   'ColorAberrationControl' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'ColorAdjustmentMode' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'ColorBalance' => 'Balance des couleurs',
+   'ColorBalanceAdj' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'ColorBooster' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'ColorCalibrationMatrix' => 'Table de matrice de calibration de couleur',
+   'ColorCharacterization' => 'CaractÃ©risation de couleur',
+   'ColorComponents' => 'Composants colorimÃ©triques',
+   'ColorEffect' => {
+      Description => 'Effet de couleurs',
+      PrintConv => {
+        'Black & White' => 'Noir et blanc',
+        'Cool' => 'Froide',
+        'Off' => 'DÃ©sactivÃ©',
+        'Sepia' => 'SÃ©pia',
+        'Warm' => 'Chaude',
+      },
+    },
+   'ColorFilter' => {
+      Description => 'Filtre de couleur',
+      PrintConv => {
+        'Blue' => 'Bleu',
+        'Green' => 'Vert',
+        'Off' => 'DÃ©sactivÃ©',
+        'Red' => 'Rouge',
+        'Yellow' => 'Jaune',
+      },
+    },
+   'ColorHue' => 'Teinte de couleur',
+   'ColorInfo' => 'Info couleur',
+   'ColorMap' => 'Charte de couleur',
+   'ColorMatrix1' => 'Matrice de couleur 1',
+   'ColorMatrix2' => 'Matrice de couleur 2',
+   'ColorMode' => {
+      Description => 'Mode colorimÃ©trique',
+      PrintConv => {
+        'Adobe RGB' => 'AdobeRVB',
+        'Autumn Leaves' => 'Feuilles automne',
+        'B&W' => 'Noir & Blanc',
+        'Clear' => 'Lumineux',
+        'Deep' => 'Profond',
+        'Evening' => 'Soir',
+        'Landscape' => 'Paysage',
+        'Light' => 'Pastel',
+        'Natural' => 'Naturel',
+        'Neutral' => 'Neutre',
+        'Night Scene' => 'Nocturne',
+        'Night View' => 'Vision nocturne',
+        'Night View/Portrait' => 'Portrait nocturne',
+        'Normal' => 'Normale',
+        'Off' => 'DÃ©sactivÃ©',
+        'RGB' => 'RVB',
+        'Sunset' => 'Coucher de soleil',
+        'Vivid' => 'Vives',
+      },
+    },
+   'ColorMoireReduction' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'ColorMoireReductionMode' => {
+      PrintConv => {
+        'Low' => 'Bas',
+        'Off' => 'DÃ©sactivÃ©',
+      },
+    },
+   'ColorPalette' => 'Palette de couleur',
+   'ColorRepresentation' => {
+      Description => 'ReprÃ©sentation de couleur',
+      PrintConv => {
+        '3 Components, Frame Sequential in Multiple Objects' => 'Trois composantes, Vue sÃ©quentielle dans diffÃ©rents objets',
+        '3 Components, Frame Sequential in One Object' => 'Trois composantes, Vue sÃ©quentielle dans un objet',
+        '3 Components, Line Sequential' => 'Trois composantes, Ligne sÃ©quentielle',
+        '3 Components, Pixel Sequential' => 'Trois composantes, Pixel sÃ©quentiel',
+        '3 Components, Single Frame' => 'Trois composantes, Vue unique',
+        '3 Components, Special Interleaving' => 'Trois composantes, Entrelacement spÃ©cial',
+        '4 Components, Frame Sequential in Multiple Objects' => 'Quatre composantes, Vue sÃ©quentielle dans diffÃ©rents objets',
+        '4 Components, Frame Sequential in One Object' => 'Quatre composantes, Vue sÃ©quentielle dans un objet',
+        '4 Components, Line Sequential' => 'Quatre composantes, Ligne sÃ©quentielle',
+        '4 Components, Pixel Sequential' => 'Quatre composantes, Pixel sÃ©quentiel',
+        '4 Components, Single Frame' => 'Quatre composantes, Vue unique',
+        '4 Components, Special Interleaving' => 'Quatre composantes, Entrelacement spÃ©cial',
+        'Monochrome, Single Frame' => 'Monochrome, Vue unique',
+        'No Image, Single Frame' => 'Pas d\'image, Vue unique',
+      },
+    },
+   'ColorResponseUnit' => 'UnitÃ© de rÃ©ponse couleur',
+   'ColorSequence' => 'SÃ©quence de couleur',
+   'ColorSpace' => {
+      Description => 'Espace colorimÃ©trique',
+      PrintConv => {
+        'ICC Profile' => 'Profil ICC',
+        'RGB' => 'RVB',
+        'Uncalibrated' => 'Non calibrÃ©',
+        'Wide Gamut RGB' => 'Wide Gamut RVB',
+        'sRGB' => 'sRVB',
+      },
+    },
+   'ColorSpaceData' => 'Espace de couleur de donnÃ©es',
+   'ColorTable' => 'Tableau de couleurs',
+   'ColorTemperature' => 'TempÃ©rature de couleur',
+   'ColorTone' => {
+      Description => 'Teinte couleur',
+      PrintConv => {
+        'Normal' => 'Normale',
+      },
+    },
+   'ColorType' => {
+      PrintConv => {
+        'RGB' => 'RVB',
+      },
+    },
+   'ColorantOrder' => 'Ordre de colorant',
+   'ColorantTable' => 'Table de colorantÃ©',
+   'ColorimetricReference' => 'RÃ©fÃ©rence colorimÃ©trique',
+   'CommandDialsChangeMainSub' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'CommandDialsMenuAndPlayback' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'CommandDialsReverseRotation' => {
+      PrintConv => {
+        'No' => 'Non',
+        'Yes' => 'Oui',
+      },
+    },
+   'CommanderGroupAMode' => {
+      PrintConv => {
+        'Manual' => 'Manuelle',
+        'Off' => 'DÃ©sactivÃ©',
+      },
+    },
+   'CommanderGroupBMode' => {
+      PrintConv => {
+        'Manual' => 'Manuelle',
+        'Off' => 'DÃ©sactivÃ©',
+      },
+    },
+   'CommanderInternalFlash' => {
+      PrintConv => {
+        'Manual' => 'Manuelle',
+        'Off' => 'DÃ©sactivÃ©',
+      },
+    },
+   'Comment' => 'Commentaire',
+   'Comments' => 'Commentaires',
+   'Compilation' => {
+      PrintConv => {
+        'No' => 'Non',
+        'Yes' => 'Oui',
+      },
+    },
+   'ComponentsConfiguration' => 'Signification de chaque composante',
+   'CompressedBitsPerPixel' => 'Mode de compression d\'image',
+   'Compression' => {
+      Description => 'SchÃ©ma de compression',
+      PrintConv => {
+        'JBIG Color' => 'JBIG Couleur',
+        'JPEG' => 'Compression JPEG',
+        'JPEG (old-style)' => 'JPEG (ancien style)',
+        'Kodak DCR Compressed' => 'Compression Kodak DCR',
+        'Kodak KDC Compressed' => 'Compression Kodak KDC',
+        'Next' => 'Encodage NeXT 2 bits',
+        'Nikon NEF Compressed' => 'Compression Nikon NEF',
+        'None' => 'Aucune',
+        'Pentax PEF Compressed' => 'Compression Pentax PEF',
+        'SGILog' => 'Encodage Log luminance SGI 32 bits',
+        'SGILog24' => 'Encodage Log luminance SGI 24 bits',
+        'Sony ARW Compressed' => 'Compression Sony ARW',
+        'Thunderscan' => 'Encodage ThunderScan 4 bits',
+        'Uncompressed' => 'Non compressÃ©',
+      },
+    },
+   'CompressionType' => {
+      PrintConv => {
+        'None' => 'Aucune',
+      },
+    },
+   'ConditionalFEC' => 'Compensation exposition flash',
+   'ConnectionSpaceIlluminant' => 'Illuminant d\'espace de connexion',
+   'ConsecutiveBadFaxLines' => 'Mauvaises lignes de Fax consÃ©cutives',
+   'ContentLocationCode' => 'Code du lieu du contenu',
+   'ContentLocationName' => 'Nom du lieu du contenu',
+   'ContinuousDrive' => {
+      PrintConv => {
+        'Movie' => 'VidÃ©o',
+      },
+    },
+   'ContinuousShootingSpeed' => {
+      Description => 'Vitesse de prise de vues en continu',
+      PrintConv => {
+        'Disable' => 'DÃ©sactivÃ©',
+        'Enable' => 'ActivÃ©e',
+      },
+    },
+   'ContinuousShotLimit' => {
+      Description => 'Limiter nombre de vues en continu',
+      PrintConv => {
+        'Disable' => 'DÃ©sactivÃ©',
+        'Enable' => 'ActivÃ©e',
+      },
+    },
+   'Contrast' => {
+      Description => 'Contraste',
+      PrintConv => {
+        'High' => 'Dur',
+        'Low' => 'Doux',
+        'Med High' => 'Assez fort',
+        'Med Low' => 'Assez faible',
+        'Medium High' => 'Moyen Haut',
+        'Medium Low' => 'Moyen Faible',
+        'Normal' => 'Normale',
+        'Very High' => 'TrÃšs fort',
+        'Very Low' => 'TrÃšs faible',
+      },
+    },
+   'ContrastCurve' => 'Courbe de contraste',
+   'Contributor' => 'Contributeur',
+   'ControlMode' => {
+      PrintConv => {
+        'n/a' => 'Non Ã©tablie',
+      },
+    },
+   'ConversionLens' => {
+      Description => 'ComplÃ©ment Optique',
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'Telephoto' => 'TÃ©lÃ©',
+        'Wide' => 'Grand angulaire',
+      },
+    },
+   'Copyright' => 'PropriÃ©taire du copyright',
+   'CopyrightNotice' => 'Mention de copyright',
+   'CopyrightStatus' => {
+      PrintConv => {
+        'Unknown' => 'Inconnu',
+      },
+    },
+   'Country' => 'Pays',
+   'Country-PrimaryLocationCode' => 'Code de pays ISO',
+   'Country-PrimaryLocationName' => 'Pays',
+   'CountryCode' => 'Code pays',
+   'Coverage' => 'Couverture',
+   'CreateDate' => 'Date de la crÃ©ation des donnÃ©es numÃ©riques',
+   'CreationDate' => 'Date de crÃ©ation',
+   'Creator' => 'CrÃ©ateur',
+   'CreatorAddress' => 'Adresse du crÃ©ateur',
+   'CreatorCity' => 'Lieu d\'Habitation du crÃ©ateur',
+   'CreatorCountry' => 'Pays du crÃ©ateur',
+   'CreatorPostalCode' => 'Code postal du crÃ©ateur',
+   'CreatorRegion' => 'RÃ©gion du crÃ©ateur',
+   'CreatorTool' => 'Outil de crÃ©ation',
+   'CreatorWorkEmail' => 'Courriel professionnel du crÃ©ateur',
+   'CreatorWorkTelephone' => 'TÃ©lÃ©phone professionnel crÃ©ateur',
+   'CreatorWorkURL' => 'URL professionnelle du crÃ©ateur',
+   'Credit' => 'Fournisseur',
+   'CropActive' => {
+      PrintConv => {
+        'No' => 'Non',
+        'Yes' => 'Oui',
+      },
+    },
+   'CropUnit' => {
+      PrintConv => {
+        'inches' => 'Pouce',
+      },
+    },
+   'CropUnits' => {
+      PrintConv => {
+        'inches' => 'Pouce',
+      },
+    },
+   'CurrentICCProfile' => 'Profil ICC actuel',
+   'CurrentIPTCDigest' => 'Sommaire courant IPTC',
+   'CurrentPreProfileMatrix' => 'Matrice de prÃ©-profil actuelle',
+   'Curves' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'CustomRendered' => {
+      Description => 'Traitement d\'image personnalisÃ©',
+      PrintConv => {
+        'Custom' => 'Traitement personnalisÃ©',
+        'Normal' => 'Traitement normal',
+      },
+    },
+   'D-LightingHQ' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'D-LightingHQSelected' => {
+      PrintConv => {
+        'No' => 'Non',
+        'Yes' => 'Oui',
+      },
+    },
+   'D-LightingHS' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'DNGBackwardVersion' => 'Version DNG antÃ©rieure',
+   'DNGLensInfo' => 'Distance focale minimale',
+   'DNGVersion' => 'Version DNG',
+   'DOF' => 'Profondeur de champ',
+   'DSPFirmwareVersion' => 'Version de firmware de DSP',
+   'DataCompressionMethod' => 'Fournisseur/propriÃ©taire de l\'algorithme de compression de donnÃ©es',
+   'DataDump' => 'Vidage donnÃ©es',
+   'DataImprint' => {
+      PrintConv => {
+        'None' => 'Aucune',
+        'Text' => 'Texte',
+      },
+    },
+   'DataType' => 'Type de donnÃ©es',
+   'DateCreated' => 'Date de crÃ©ation',
+   'DateDisplayFormat' => {
+      Description => 'Format date',
+      PrintConv => {
+        'D/M/Y' => 'Jour/Mois/AnnÃ©e',
+        'M/D/Y' => 'Mois/Jour/AnnÃ©e',
+        'Y/M/D' => 'AnnÃ©e/Mois/Jour',
+      },
+    },
+   'DateSent' => 'Date d\'envoi',
+   'DateStampMode' => {
+      PrintConv => {
+        'Date & Time' => 'Date et heure',
+        'Off' => 'DÃ©sactivÃ©',
+      },
+    },
+   'DateTime' => 'Date de modification du fichier',
+   'DateTimeCreated' => 'Date/heure de crÃ©ation',
+   'DateTimeDigitized' => 'Date/heure de la numÃ©risation',
+   'DateTimeOriginal' => 'Date de la crÃ©ation des donnÃ©es originales',
+   'DaylightSavings' => {
+      Description => 'Heure d\'Ã©tÃ©',
+      PrintConv => {
+        'No' => 'Non',
+        'Yes' => 'Oui',
+      },
+    },
+   'DefaultCropOrigin' => 'Origine de rognage par dÃ©faut',
+   'DefaultCropSize' => 'Taille de rognage par dÃ©faut',
+   'DefaultScale' => 'Echelle par dÃ©faut',
+   'DeletedImageCount' => 'Compteur d\'images supprimÃ©es',
+   'DestinationCity' => 'Ville de destination',
+   'DestinationCityCode' => 'Code ville de destination',
+   'DestinationDST' => {
+      Description => 'Heure d\'Ã©tÃ© de destination',
+      PrintConv => {
+        'No' => 'Non',
+        'Yes' => 'Oui',
+      },
+    },
+   'DeviceAttributes' => 'Attributs d\'appareil',
+   'DeviceManufacturer' => 'Fabricant de l\'appareil',
+   'DeviceMfgDesc' => 'Description du fabricant d\'appareil',
+   'DeviceModel' => 'ModÃšle de l\'appareil',
+   'DeviceModelDesc' => 'Description du modÃšle d\'appareil',
+   'DeviceSettingDescription' => 'Description des rÃ©glages du dispositif',
+   'DialDirectionTvAv' => {
+      Description => 'Sens rotation molette Tv/Av',
+      PrintConv => {
+        'Normal' => 'Normale',
+        'Reversed' => 'Sens inversÃ©',
+      },
+    },
+   'DigitalCreationDate' => 'Date de numÃ©risation',
+   'DigitalCreationTime' => 'Heure de numÃ©risation',
+   'DigitalImageGUID' => 'GUID de l\'image numÃ©rique',
+   'DigitalSourceFileType' => 'Type de fichier de la source numÃ©rique',
+   'DigitalZoom' => {
+      Description => 'Zoom numÃ©rique',
+      PrintConv => {
+        'None' => 'Aucune',
+        'Off' => 'DÃ©sactivÃ©',
+      },
+    },
+   'DigitalZoomOn' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'DigitalZoomRatio' => 'Rapport de zoom numÃ©rique',
+   'Directory' => 'Dossier',
+   'DirectoryNumber' => 'NumÃ©ro de dossier',
+   'DisplaySize' => {
+      PrintConv => {
+        'Normal' => 'Normale',
+      },
+    },
+   'DisplayUnits' => {
+      PrintConv => {
+        'inches' => 'Pouce',
+      },
+    },
+   'DisplayXResolutionUnit' => {
+      PrintConv => {
+        'um' => 'Âµm (micromÃštre)',
+      },
+    },
+   'DisplayYResolutionUnit' => {
+      PrintConv => {
+        'um' => 'Âµm (micromÃštre)',
+      },
+    },
+   'DisplayedUnitsX' => {
+      PrintConv => {
+        'inches' => 'Pouce',
+      },
+    },
+   'DisplayedUnitsY' => {
+      PrintConv => {
+        'inches' => 'Pouce',
+      },
+    },
+   'DistortionCorrection' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'DistortionCorrection2' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'DjVuVersion' => 'Version DjVu',
+   'DocumentHistory' => 'Historique du document',
+   'DocumentName' => 'Nom du document',
+   'DocumentNotes' => 'Remarques sur le document',
+   'DotRange' => 'Ãtendue de points',
+   'DriveMode' => {
+      Description => 'Mode de prise de vue',
+      PrintConv => {
+        'Burst' => 'Rafale',
+        'Continuous' => 'Continu',
+        'Continuous High' => 'Continu (ultrarapide)',
+        'Continuous Shooting' => 'Prise de vues en continu',
+        'Multiple Exposure' => 'Exposition multiple',
+        'No Timer' => 'Pas de retardateur',
+        'Off' => 'DÃ©sactivÃ©',
+        'Remote Control' => 'TÃ©lÃ©commande',
+        'Remote Control (3 s delay)' => 'TÃ©lÃ©commande (retard 3 s)',
+        'Self-timer (12 s)' => 'Retardateur (12 s)',
+        'Self-timer (2 s)' => 'Retardateur (2 s)',
+        'Self-timer Operation' => 'Retardateur',
+        'Shutter Button' => 'DÃ©clencheur',
+        'Single Exposure' => 'Exposition unique',
+        'Single-frame' => 'Vue par vue',
+        'Single-frame Shooting' => 'Prise de vue unique',
+      },
+    },
+   'DriveMode2' => {
+      Description => 'Exposition multiple',
+      PrintConv => {
+        'Single-frame' => 'Vue par vue',
+      },
+    },
+   'Duration' => 'DurÃ©e',
+   'DynamicRangeExpansion' => {
+      Description => 'Expansion de la dynamique',
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'DynamicRangeOptimizer' => {
+      Description => 'Optimiseur Dyna',
+      PrintConv => {
+        'Advanced Auto' => 'AvancÃ© Auto',
+        'Advanced Lv1' => 'AvancÃ© Niv1',
+        'Advanced Lv2' => 'AvancÃ© Niv2',
+        'Advanced Lv3' => 'AvancÃ© Niv3',
+        'Advanced Lv4' => 'AvancÃ© Niv4',
+        'Advanced Lv5' => 'AvancÃ© Niv5',
+        'Auto' => 'Auto.',
+        'Off' => 'DÃ©sactivÃ©',
+      },
+    },
+   'E-DialInProgram' => {
+      PrintConv => {
+        'P Shift' => 'DÃ©calage P',
+        'Tv or Av' => 'Tv ou Av',
+      },
+    },
+   'ETTLII' => {
+      PrintConv => {
+        'Average' => 'Moyenne',
+        'Evaluative' => 'Ãvaluative',
+      },
+    },
+   'EVStepInfo' => 'Info de pas IL',
+   'EVSteps' => {
+      Description => 'Pas IL',
+      PrintConv => {
+        '1/2 EV Steps' => 'Pas de 1/2 IL',
+        '1/3 EV Steps' => 'Pas de 1/3 IL',
+      },
+    },
+   'EasyExposureCompensation' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'EasyMode' => {
+      PrintConv => {
+        'Beach' => 'Plage',
+        'Color Accent' => 'Couleur contrastÃ©e',
+        'Color Swap' => 'Permuter couleur',
+        'Fireworks' => 'Feu d\'artifice',
+        'Foliage' => 'Feuillages',
+        'Indoor' => 'IntÃ©rieur',
+        'Kids & Pets' => 'Enfants & animaux',
+        'Landscape' => 'Paysage',
+        'Manual' => 'Manuelle',
+        'Night' => 'ScÃšne de nuit',
+        'Night Snapshot' => 'Mode Nuit',
+        'Snow' => 'Neige',
+        'Sports' => 'Sport',
+        'Super Macro' => 'Super macro',
+        'Underwater' => 'Sous-marin',
+      },
+    },
+   'EdgeNoiseReduction' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'EditStatus' => 'Statut d\'Ã©dition',
+   'EditorialUpdate' => {
+      Description => 'Mise Ã  jour Ã©ditoriale',
+      PrintConv => {
+        'Additional language' => 'Langues supplÃ©mentaires',
+      },
+    },
+   'EffectiveLV' => 'Indice de lumination effectif',
+   'EffectiveMaxAperture' => 'Ouverture effective maxi de l\'Objectif',
+   'Emphasis' => {
+      PrintConv => {
+        'None' => 'Aucune',
+      },
+    },
+   'EncodingProcess' => {
+      Description => 'ProcÃ©dÃ© de codage',
+      PrintConv => {
+        'Baseline DCT, Huffman coding' => 'Baseline DCT, codage Huffman',
+        'Extended sequential DCT, Huffman coding' => 'Extended sequential DCT, codage Huffman',
+        'Extended sequential DCT, arithmetic coding' => 'Extended sequential DCT, codage arithmÃ©tique',
+        'Lossless, Differential Huffman coding' => 'Lossless, codage Huffman diffÃ©rentiel',
+        'Lossless, Huffman coding' => 'Lossless, codage Huffman',
+        'Lossless, arithmetic coding' => 'Lossless, codage arithmÃ©tique',
+        'Lossless, differential arithmetic coding' => 'Lossless, codage arithmÃ©tique diffÃ©rentiel',
+        'Progressive DCT, Huffman coding' => 'Progressive DCT, codage Huffman',
+        'Progressive DCT, arithmetic coding' => 'Progressive DCT, codage arithmÃ©tique',
+        'Progressive DCT, differential Huffman coding' => 'Progressive DCT, codage Huffman diffÃ©rentiel',
+        'Progressive DCT, differential arithmetic coding' => 'Progressive DCT, codage arithmÃ©tique diffÃ©rentiel',
+        'Sequential DCT, differential Huffman coding' => 'Sequential DCT, codage Huffman diffÃ©rentiel',
+        'Sequential DCT, differential arithmetic coding' => 'Sequential DCT, codage arithmÃ©tique diffÃ©rentiel',
+      },
+    },
+   'Encryption' => 'Chiffrage',
+   'EndPoints' => 'Points de terminaison',
+   'EnhanceDarkTones' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'Enhancement' => {
+      PrintConv => {
+        'Blue' => 'Bleu',
+        'Green' => 'Vert',
+        'Off' => 'DÃ©sactivÃ©',
+        'Red' => 'Rouge',
+      },
+    },
+   'EnvelopeNumber' => 'NumÃ©ro d\'enveloppe',
+   'EnvelopePriority' => {
+      Description => 'PrioritÃ© d\'enveloppe',
+      PrintConv => {
+        '0 (reserved)' => '0 (rÃ©servÃ© pour utilisation future)',
+        '1 (most urgent)' => '1 (trÃšs urgent)',
+        '5 (normal urgency)' => '5 (normalement urgent)',
+        '8 (least urgent)' => '8 (moins urgent)',
+        '9 (user-defined priority)' => '9 (prioritÃ© dÃ©finie par l\'utilisateur)',
+      },
+    },
+   'EnvelopeRecordVersion' => 'Version d\'enregistrement',
+   'Error' => 'Erreur',
+   'Event' => 'Evenement',
+   'ExcursionTolerance' => {
+      Description => 'TolÃ©rance d\'excursion ',
+      PrintConv => {
+        'Allowed' => 'Possible',
+        'Not Allowed' => 'Non permis (dÃ©faut)',
+      },
+    },
+   'ExifByteOrder' => 'Indicateur d\'ordre des octets Exif',
+   'ExifCameraInfo' => 'Info d\'appareil photo Exif',
+   'ExifImageHeight' => 'Hauteur d\'image',
+   'ExifImageWidth' => 'Largeur d\'image',
+   'ExifOffset' => 'Pointeur Exif IFD',
+   'ExifToolVersion' => 'Version ExifTool',
+   'ExifUnicodeByteOrder' => 'Indicateur d\'ordre des octets Unicode Exif',
+   'ExifVersion' => 'Version Exif',
+   'ExitPupilPosition' => 'Position de la pupille de sortie',
+   'ExpandFilm' => 'Extension film',
+   'ExpandFilterLens' => 'Extension lentille filtre',
+   'ExpandFlashLamp' => 'Extension lampe flash',
+   'ExpandLens' => 'Extension objectif',
+   'ExpandScanner' => 'Extension Scanner',
+   'ExpandSoftware' => 'Extension logiciel',
+   'ExpirationDate' => 'Date d\'expiration',
+   'ExpirationTime' => 'Heure d\'expiration',
+   'ExposureBracketStepSize' => 'Intervalle de bracketing d\'exposition',
+   'ExposureBracketValue' => 'Valeur Bracketing Expo',
+   'ExposureCompensation' => 'DÃ©calage d\'exposition',
+   'ExposureDelayMode' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'ExposureDifference' => 'Correction d\'exposition',
+   'ExposureIndex' => 'Indice d\'exposition',
+   'ExposureLevelIncrements' => {
+      Description => 'Paliers de rÃ©glage d\'expo',
+      PrintConv => {
+        '1-stop set, 1/3-stop comp.' => 'RÃ©glage 1 valeur, correction 1/3 val.',
+        '1/2 Stop' => 'Palier 1/2',
+        '1/2-stop set, 1/2-stop comp.' => 'RÃ©glage 1/2 valeur, correction 1/2 val.',
+        '1/3 Stop' => 'Palier 1/3',
+        '1/3-stop set, 1/3-stop comp.' => 'RÃ©glage 1/3 valeur, correction 1/3 val.',
+      },
+    },
+   'ExposureMode' => {
+      Description => 'Mode d\'exposition',
+      PrintConv => {
+        'Aperture Priority' => 'PrioritÃ© ouverture',
+        'Aperture-priority AE' => 'PrioritÃ© ouverture',
+        'Auto' => 'Exposition automatique',
+        'Auto bracket' => 'Bracketting auto',
+        'Bulb' => 'Pose B',
+        'Landscape' => 'Paysage',
+        'Manual' => 'Exposition manuelle',
+        'Night Scene / Twilight' => 'Nocturne',
+        'Shutter Priority' => 'PrioritÃ© vitesse',
+        'Shutter speed priority AE' => 'PrioritÃ© vitesse',
+      },
+    },
+   'ExposureModeInManual' => {
+      Description => 'Mode d\'exposition manuelle',
+      PrintConv => {
+        'Center-weighted average' => 'Centrale pondÃ©rÃ©e',
+        'Evaluative metering' => 'Mesure Ã©valuativ',
+        'Partial metering' => 'Partielle',
+        'Specified metering mode' => 'Mode de mesure spÃ©cifiÃ©',
+        'Spot metering' => 'Spot',
+      },
+    },
+   'ExposureProgram' => {
+      Description => 'Programme d\'exposition',
+      PrintConv => {
+        'Action (High speed)' => 'Programme action (orientÃ© grandes vitesses d\'obturation)',
+        'Aperture Priority' => 'PrioritÃ© ouverture',
+        'Aperture-priority AE' => 'PrioritÃ© ouverture',
+        'Creative (Slow speed)' => 'Programme crÃ©atif (orientÃ© profondeur de champ)',
+        'Landscape' => 'Mode paysage',
+        'Manual' => 'Manuel',
+        'Not Defined' => 'Non dÃ©fini',
+        'Portrait' => 'Mode portrait',
+        'Program AE' => 'Programme normal',
+        'Shutter Priority' => 'PrioritÃ© vitesse',
+        'Shutter speed priority AE' => 'PrioritÃ© vitesse',
+      },
+    },
+   'ExposureTime' => 'Temps de pose',
+   'ExposureTime2' => 'Temps de pose 2',
+   'ExtendedWBDetect' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'ExtenderStatus' => {
+      PrintConv => {
+        'Attached' => 'AttachÃ©',
+        'Not attached' => 'Non attachÃ©',
+        'Removed' => 'RetirÃ©',
+      },
+    },
+   'ExternalFlash' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'ExternalFlashBounce' => {
+      Description => 'RÃ©flexion flash externe',
+      PrintConv => {
+        'Bounce' => 'Avec rÃ©flecteur',
+        'No' => 'Non',
+        'Yes' => 'Oui',
+        'n/a' => 'Non Ã©tablie',
+      },
+    },
+   'ExternalFlashExposureComp' => {
+      Description => 'Compensation d\'exposition flash externe',
+      PrintConv => {
+        '-0.5' => '-0.5 IL',
+        '-1.0' => '-1.0 IL',
+        '-1.5' => '-1.5 IL',
+        '-2.0' => '-2.0 IL',
+        '-2.5' => '-2.5 IL',
+        '-3.0' => '-3.0 IL',
+        '0.0' => '0.0 IL',
+        '0.5' => '0.5 IL',
+        '1.0' => '1.0 IL',
+        'n/a' => 'Non Ã©tablie (Ã©teint ou modes auto)',
+        'n/a (Manual Mode)' => 'Non Ã©tablie (mode manuel)',
+      },
+    },
+   'ExternalFlashGuideNumber' => 'Nombre guide flash externe',
+   'ExternalFlashMode' => {
+      Description => 'Segment de mesure flash esclave 3',
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On, Auto' => 'En service, auto',
+        'On, Contrast-control Sync' => 'En service, synchro contrÃŽle des contrastes',
+        'On, Flash Problem' => 'En service, problÃšme de flash',
+        'On, High-speed Sync' => 'En service, synchro haute vitesse',
+        'On, Manual' => 'En service, manuel',
+        'On, P-TTL Auto' => 'En service, auto P-TTL',
+        'On, Wireless' => 'En service, sans cordon',
+        'On, Wireless, High-speed Sync' => 'En service, sans cordon, synchro haute vitesse',
+        'n/a - Off-Auto-Aperture' => 'N/c - auto-diaph hors service',
+      },
+    },
+   'ExtraSamples' => 'Echantillons supplÃ©mentaires',
+   'FNumber' => 'Nombre F',
+   'FOV' => 'Champ de vision',
+   'FastSeek' => {
+      PrintConv => {
+        'No' => 'Non',
+        'Yes' => 'Oui',
+      },
+    },
+   'FaxProfile' => {
+      PrintConv => {
+        'Unknown' => 'Inconnu',
+      },
+    },
+   'FaxRecvParams' => 'ParamÃštres de rÃ©ception Fax',
+   'FaxRecvTime' => 'Temps de rÃ©ception Fax',
+   'FaxSubAddress' => 'Sous-adresse Fax',
+   'FileFormat' => 'Format de fichier',
+   'FileInfo' => 'Infos Fichier',
+   'FileInfoVersion' => 'Version des Infos Fichier',
+   'FileModifyDate' => 'Date/heure de modification du fichier',
+   'FileName' => 'Nom de fichier',
+   'FileNumber' => 'NumÃ©ro de fichier',
+   'FileNumberMemory' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'FileNumberSequence' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'FileSize' => 'Taille du fichier',
+   'FileSource' => {
+      Description => 'Source du fichier',
+      PrintConv => {
+        'Digital Camera' => 'Appareil photo numÃ©rique',
+        'Film Scanner' => 'Scanner de film',
+        'Reflection Print Scanner' => 'Scanner par rÃ©flexion',
+      },
+    },
+   'FileType' => 'Type de fichier',
+   'FileVersion' => 'Version de format de fichier',
+   'FillFlashAutoReduction' => {
+      Description => 'Mesure E-TTL',
+      PrintConv => {
+        'Disable' => 'DÃ©sactivÃ©',
+        'Enable' => 'ActivÃ©',
+      },
+    },
+   'FillOrder' => {
+      Description => 'Ordre de remplissage',
+      PrintConv => {
+        'Normal' => 'Normale',
+      },
+    },
+   'FilmMode' => {
+      Description => 'Mode Film',
+      PrintConv => {
+        'Dynamic (B&W)' => 'Vives (N & BÃ )',
+        'Dynamic (color)' => 'Couleurs vives',
+        'Nature (color)' => 'Couleurs naturelles',
+        'Smooth (B&W)' => 'Pastel (N & B)',
+        'Smooth (color)' => 'Couleurs pastel',
+        'Standard (B&W)' => 'Normales (N & B)',
+        'Standard (color)' => 'Couleurs normales',
+      },
+    },
+   'FilterEffect' => {
+      Description => 'Effet de filtre',
+      PrintConv => {
+        'Green' => 'Vert',
+        'None' => 'Aucune',
+        'Off' => 'DÃ©sactivÃ©',
+        'Red' => 'Rouge',
+        'Yellow' => 'Jaune',
+        'n/a' => 'Non Ã©tablie',
+      },
+    },
+   'FilterEffectMonochrome' => {
+      PrintConv => {
+        'Green' => 'Vert',
+        'None' => 'Aucune',
+        'Red' => 'Rouge',
+        'Yellow' => 'Jaune',
+      },
+    },
+   'FinderDisplayDuringExposure' => {
+      Description => 'Affich. viseur pendant expo.',
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'FirmwareVersion' => 'Version de firmware',
+   'FixtureIdentifier' => 'Identificateur d\'installation',
+   'Flash' => {
+      Description => 'Flash ',
+      PrintConv => {
+        'Auto, Did not fire' => 'Flash non dÃ©clenchÃ©, mode auto',
+        'Auto, Did not fire, Red-eye reduction' => 'Auto, flash non dÃ©clenchÃ©, mode rÃ©duction yeux rouges',
+        'Auto, Fired' => 'Flash dÃ©clenchÃ©, mode auto',
+        'Auto, Fired, Red-eye reduction' => 'Flash dÃ©clenchÃ©, mode auto, mode rÃ©duction yeux rouges, lumiÃšre renvoyÃ©e dÃ©tectÃ©e',
+        'Auto, Fired, Red-eye reduction, Return detected' => 'Flash dÃ©clenchÃ©, mode auto, lumiÃšre renvoyÃ©e dÃ©tectÃ©e, mode rÃ©duction yeux rouges',
+        'Auto, Fired, Red-eye reduction, Return not detected' => 'Flash dÃ©clenchÃ©, mode auto, lumiÃšre renvoyÃ©e non dÃ©tectÃ©e, mode rÃ©duction yeux rouges',
+        'Auto, Fired, Return detected' => 'Flash dÃ©clenchÃ©, mode auto, lumiÃšre renvoyÃ©e dÃ©tectÃ©e',
+        'Auto, Fired, Return not detected' => 'Flash dÃ©clenchÃ©, mode auto, lumiÃšre renvoyÃ©e non dÃ©tectÃ©e',
+        'Did not fire' => 'Flash non dÃ©clenchÃ©',
+        'Fired' => 'Flash dÃ©clenchÃ©',
+        'Fired, Red-eye reduction' => 'Flash dÃ©clenchÃ©, mode rÃ©duction yeux rouges',
+        'Fired, Red-eye reduction, Return detected' => 'Flash dÃ©clenchÃ©, mode rÃ©duction yeux rouges, lumiÃšre renvoyÃ©e dÃ©tectÃ©e',
+        'Fired, Red-eye reduction, Return not detected' => 'Flash dÃ©clenchÃ©, mode rÃ©duction yeux rouges, lumiÃšre renvoyÃ©e non dÃ©tectÃ©e',
+        'Fired, Return detected' => 'LumiÃšre renvoyÃ©e sur le capteur dÃ©tectÃ©e',
+        'Fired, Return not detected' => 'LumiÃšre renvoyÃ©e sur le capteur non dÃ©tectÃ©e',
+        'No Flash' => 'Flash non dÃ©clenchÃ©',
+        'No flash function' => 'Pas de fonction flash',
+        'Off' => 'DÃ©sactivÃ©',
+        'Off, Did not fire' => 'Flash non dÃ©clenchÃ©, mode flash forcÃ©',
+        'Off, Did not fire, Return not detected' => 'Ãteint, flash non dÃ©clenchÃ©, lumiÃšre renvoyÃ©e non dÃ©tectÃ©e',
+        'Off, No flash function' => 'Ãteint, pas de fonction flash',
+        'Off, Red-eye reduction' => 'Ãteint, mode rÃ©duction yeux rouges',
+        'On' => 'ActivÃ©',
+        'On, Did not fire' => 'Hors service, flash non dÃ©clenchÃ©',
+        'On, Fired' => 'Flash dÃ©clenchÃ©, mode flash forcÃ©',
+        'On, Red-eye reduction' => 'Flash dÃ©clenchÃ©, mode forcÃ©, mode rÃ©duction yeux rouges',
+        'On, Red-eye reduction, Return detected' => 'Flash dÃ©clenchÃ©, mode forcÃ©, mode rÃ©duction yeux rouges, lumiÃšre renvoyÃ©e dÃ©tectÃ©e',
+        'On, Red-eye reduction, Return not detected' => 'Flash dÃ©clenchÃ©, mode forcÃ©, mode rÃ©duction yeux rouges, lumiÃšre renvoyÃ©e non dÃ©tectÃ©e',
+        'On, Return detected' => 'Flash dÃ©clenchÃ©, mode flash forcÃ©, lumiÃšre renvoyÃ©e dÃ©tectÃ©e',
+        'On, Return not detected' => 'Flash dÃ©clenchÃ©, mode flash forcÃ©, lumiÃšre renvoyÃ©e non dÃ©tectÃ©e',
+      },
+    },
+   'FlashBias' => 'DÃ©calage Flash',
+   'FlashCommanderMode' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'FlashCompensation' => 'Compensation flash',
+   'FlashControlMode' => {
+      Description => 'Mode de ContrÃŽle du Flash',
+      PrintConv => {
+        'Manual' => 'Manuelle',
+        'Off' => 'DÃ©sactivÃ©',
+      },
+    },
+   'FlashDevice' => {
+      PrintConv => {
+        'None' => 'Aucune',
+      },
+    },
+   'FlashEnergy' => 'Ãnergie du flash',
+   'FlashExposureBracketValue' => 'Valeur Bracketing Flash',
+   'FlashExposureComp' => 'Compensation d\'exposition au flash',
+   'FlashExposureCompSet' => 'RÃ©glage de compensation d\'exposition au flash',
+   'FlashExposureLock' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'FlashFired' => {
+      Description => 'Flash utilisÃ©',
+      PrintConv => {
+        'No' => 'Non',
+        'Yes' => 'Oui',
+      },
+    },
+   'FlashFiring' => {
+      Description => 'Ãmission de l\'Ã©clair',
+      PrintConv => {
+        'Does not fire' => 'DÃ©sactivÃ©',
+        'Fires' => 'ActivÃ©',
+      },
+    },
+   'FlashFocalLength' => 'Focale Flash',
+   'FlashFunction' => 'Fonction flash',
+   'FlashGroupAControlMode' => {
+      PrintConv => {
+        'Manual' => 'Manuelle',
+        'Off' => 'DÃ©sactivÃ©',
+      },
+    },
+   'FlashGroupBControlMode' => {
+      PrintConv => {
+        'Manual' => 'Manuelle',
+        'Off' => 'DÃ©sactivÃ©',
+      },
+    },
+   'FlashGroupCControlMode' => {
+      PrintConv => {
+        'Manual' => 'Manuelle',
+        'Off' => 'DÃ©sactivÃ©',
+      },
+    },
+   'FlashInfo' => 'Information flash',
+   'FlashInfoVersion' => 'Version de l\'info Flash',
+   'FlashIntensity' => {
+      PrintConv => {
+        'High' => 'Haut',
+        'Low' => 'Bas',
+        'Normal' => 'Normale',
+        'Strong' => 'Forte',
+      },
+    },
+   'FlashMeteringSegments' => 'Segments de mesure flash',
+   'FlashMode' => {
+      Description => 'Mode flash',
+      PrintConv => {
+        'Auto, Did not fire' => 'Auto, non dÃ©clenchÃ©',
+        'Auto, Did not fire, Red-eye reduction' => 'Auto, non dÃ©clenchÃ©, rÃ©duction yeux rouges',
+        'Auto, Fired' => 'Auto, dÃ©clenchÃ©',
+        'Auto, Fired, Red-eye reduction' => 'Auto, dÃ©clenchÃ©, rÃ©duction yeux rouges',
+        'Did Not Fire' => 'Eclair non-dÃ©clenchÃ©',
+        'External, Auto' => 'Externe, auto',
+        'External, Contrast-control Sync' => 'Externe, synchro contrÃŽle des contrastes',
+        'External, Flash Problem' => 'Externe, problÃšme de flash ?',
+        'External, High-speed Sync' => 'Externe, synchro haute vitesse',
+        'External, Manual' => 'Externe, manuel',
+        'External, P-TTL Auto' => 'Externe, P-TTL',
+        'External, Wireless' => 'Externe, sans cordon',
+        'External, Wireless, High-speed Sync' => 'Externe, sans cordon, synchro haute vitesse',
+        'Fired, Commander Mode' => 'Eclair dÃ©clenchÃ©, Mode maÃ®tre',
+        'Fired, External' => 'Eclair dÃ©clenchÃ©, Exterieur',
+        'Fired, Manual' => 'Eclair dÃ©clenchÃ©, Manuel',
+        'Fired, TTL Mode' => 'Eclair dÃ©clenchÃ©, Mode TTL',
+        'Internal' => 'Interne',
+        'Normal' => 'Normale',
+        'Off' => 'DÃ©sactivÃ©',
+        'Off, Did not fire' => 'Hors service',
+        'On' => 'ActivÃ©',
+        'On, Did not fire' => 'En service, non dÃ©clenchÃ©',
+        'On, Fired' => 'En service',
+        'On, Red-eye reduction' => 'En service, rÃ©duction yeux rouges',
+        'On, Slow-sync' => 'En service, synchro lente',
+        'On, Slow-sync, Red-eye reduction' => 'En service, synchro lente, rÃ©duction yeux rouges',
+        'On, Soft' => 'En service, doux',
+        'On, Trailing-curtain Sync' => 'En service, synchro 2e rideau',
+        'On, Wireless (Control)' => 'En service, sans cordon (esclave)',
+        'On, Wireless (Master)' => 'En service, sans cordon (maÃ®tre)',
+        'Red-eye Reduction' => 'RÃ©duction yeux rouges',
+        'Red-eye reduction' => 'RÃ©duction yeux rouges',
+        'Unknown' => 'Inconnu',
+        'n/a - Off-Auto-Aperture' => 'N/c - auto-diaph hors service',
+      },
+    },
+   'FlashModel' => {
+      Description => 'ModÃšle de Flash',
+      PrintConv => {
+        'None' => 'Aucune',
+      },
+    },
+   'FlashOptions' => {
+      Description => 'Options de flash',
+      PrintConv => {
+        'Auto, Red-eye reduction' => 'Auto, rÃ©duction yeux rouges',
+        'Normal' => 'Normale',
+        'Red-eye reduction' => 'RÃ©duction yeux rouges',
+        'Slow-sync' => 'Synchro lente',
+        'Slow-sync, Red-eye reduction' => 'Synchro lente, rÃ©duction yeux rouges',
+        'Trailing-curtain Sync' => 'Synchro 2e rideau',
+        'Wireless (Control)' => 'Sans cordon (contrÃŽleur)',
+        'Wireless (Master)' => 'Sans cordon (maÃ®tre)',
+      },
+    },
+   'FlashOptions2' => {
+      Description => 'Options de flash (2)',
+      PrintConv => {
+        'Auto, Red-eye reduction' => 'Auto, rÃ©duction yeux rouges',
+        'Normal' => 'Normale',
+        'Red-eye reduction' => 'RÃ©duction yeux rouges',
+        'Slow-sync' => 'Synchro lente',
+        'Slow-sync, Red-eye reduction' => 'Synchro lente, rÃ©duction yeux rouges',
+        'Trailing-curtain Sync' => 'Synchro 2e rideau',
+        'Wireless (Control)' => 'Sans cordon (contrÃŽleur)',
+        'Wireless (Master)' => 'Sans cordon (maÃ®tre)',
+      },
+    },
+   'FlashOutput' => 'Puissance de l\'Ã©clair',
+   'FlashRedEyeMode' => 'Flash mode anti-yeux rouges',
+   'FlashReturn' => {
+      PrintConv => {
+        'No return detection' => 'Pas de dÃ©tection de retour',
+        'Return detected' => 'Retour dÃ©tectÃ©',
+        'Return not detected' => 'Retour non dÃ©tectÃ©',
+      },
+    },
+   'FlashSetting' => 'RÃ©glages Flash',
+   'FlashStatus' => {
+      Description => 'Segment de mesure flash esclave 1',
+      PrintConv => {
+        'External, Did not fire' => 'Externe, non dÃ©clenchÃ©',
+        'External, Fired' => 'Externe, dÃ©clenchÃ©',
+        'Internal, Did not fire' => 'Interne, non dÃ©clenchÃ©',
+        'Internal, Fired' => 'Interne, dÃ©clenchÃ©',
+        'Off' => 'DÃ©sactivÃ©',
+      },
+    },
+   'FlashSyncSpeedAv' => {
+      Description => 'Vitesse synchro en mode Av',
+      PrintConv => {
+        '1/200 Fixed' => '1/200 fixe',
+        '1/250 Fixed' => '1/250 fixe',
+        '1/300 Fixed' => '1/300 fixe',
+      },
+    },
+   'FlashType' => {
+      Description => 'Type de flash',
+      PrintConv => {
+        'Built-In Flash' => 'IntÃ©grÃ©',
+        'External' => 'Externe',
+        'None' => 'Aucune',
+      },
+    },
+   'FlashWarning' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'FlashpixVersion' => 'Version Flashpix supportÃ©e',
+   'FlickerReduce' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'FlipHorizontal' => {
+      PrintConv => {
+        'No' => 'Non',
+        'Yes' => 'Oui',
+      },
+    },
+   'FocalLength' => 'Focale de l\'objectif',
+   'FocalLength35efl' => 'Focale de l\'objectif',
+   'FocalLengthIn35mmFormat' => 'Distance focale sur film 35 mm',
+   'FocalPlaneResolutionUnit' => {
+      Description => 'UnitÃ© de rÃ©solution de plan focal',
+      PrintConv => {
+        'None' => 'Aucune',
+        'inches' => 'Pouce',
+        'um' => 'Âµm (micromÃštre)',
+      },
+    },
+   'FocalPlaneXResolution' => 'RÃ©solution X du plan focal',
+   'FocalPlaneYResolution' => 'RÃ©solution Y du plan focal',
+   'Focus' => {
+      PrintConv => {
+        'Manual' => 'Manuelle',
+      },
+    },
+   'FocusContinuous' => {
+      PrintConv => {
+        'Manual' => 'Manuelle',
+      },
+    },
+   'FocusDistance' => 'Distance de mise au point',
+   'FocusMode' => {
+      Description => 'Mode mise au point',
+      PrintConv => {
+        'AF-C' => 'AF-C (prise de vue en rafale)',
+        'AF-S' => 'AF-S (prise de vue unique)',
+        'Auto, Continuous' => 'Auto, continue',
+        'Auto, Focus button' => 'Bouton autofocus',
+        'Continuous' => 'Auto, continue',
+        'Infinity' => 'Infini',
+        'Manual' => 'Manuelle',
+        'Normal' => 'Normale',
+        'Pan Focus' => 'Hyperfocale',
+      },
+    },
+   'FocusMode2' => {
+      Description => 'Mode mise au point 2',
+      PrintConv => {
+        'AF-C' => 'AF-C (prise de vue en rafale)',
+        'AF-S' => 'AF-S (prise de vue unique)',
+        'Manual' => 'Manuelle',
+      },
+    },
+   'FocusModeSetting' => {
+      PrintConv => {
+        'AF-C' => 'AF-C (prise de vue en rafale)',
+        'AF-S' => 'AF-S (prise de vue unique)',
+        'Manual' => 'Manuelle',
+      },
+    },
+   'FocusPosition' => 'Distance de mise au point',
+   'FocusRange' => {
+      PrintConv => {
+        'Infinity' => 'Infini',
+        'Manual' => 'Manuelle',
+        'Normal' => 'Normale',
+        'Pan Focus' => 'Hyperfocale',
+        'Super Macro' => 'Super macro',
+      },
+    },
+   'FocusTrackingLockOn' => {
+      PrintConv => {
+        'Normal' => 'Normale',
+        'Off' => 'DÃ©sactivÃ©',
+      },
+    },
+   'FocusingScreen' => 'Verre de visÃ©e',
+   'ForwardMatrix1' => 'Matrice forward 1',
+   'ForwardMatrix2' => 'Matrice forward 2',
+   'FrameNumber' => 'NumÃ©ro de vue',
+   'FrameRate' => 'Vitesse',
+   'FrameSize' => 'Taille du cadre',
+   'FreeByteCounts' => 'Nombre d\'octets libres',
+   'FreeOffsets' => 'Offsets libres',
+   'FujiFlashMode' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+        'Red-eye reduction' => 'RÃ©duction yeux rouges',
+      },
+    },
+   'GIFVersion' => 'Version GIF',
+   'GPSAltitude' => 'Altitude',
+   'GPSAltitudeRef' => {
+      Description => 'RÃ©fÃ©rence d\'altitude',
+      PrintConv => {
+        'Above Sea Level' => 'Au-dessus du niveau de la mer',
+        'Below Sea Level' => 'En-dessous du niveau de la mer',
+      },
+    },
+   'GPSAreaInformation' => 'Nom de la zone GPS',
+   'GPSDOP' => 'PrÃ©cision de mesure',
+   'GPSDateStamp' => 'Date GPS',
+   'GPSDateTime' => 'Heure GPS (horloge atomique)',
+   'GPSDestBearing' => 'Orientation de la destination',
+   'GPSDestBearingRef' => {
+      Description => 'RÃ©fÃ©rence de l\'orientation de la destination',
+      PrintConv => {
+        'Magnetic North' => 'Nord magnÃ©tique',
+        'True North' => 'Direction vraie',
+      },
+    },
+   'GPSDestDistance' => 'Distance Ã  la destination',
+   'GPSDestDistanceRef' => {
+      Description => 'RÃ©fÃ©rence de la distance Ã  la destination',
+      PrintConv => {
+        'Kilometers' => 'KilomÃštres',
+        'Nautical Miles' => 'Noeuds',
+      },
+    },
+   'GPSDestLatitude' => 'Latitude de destination',
+   'GPSDestLatitudeRef' => {
+      Description => 'RÃ©fÃ©rence de la latitude de destination',
+      PrintConv => {
+        'North' => 'Latitude nord',
+        'South' => 'Latitude sud',
+      },
+    },
+   'GPSDestLongitude' => 'Longitude de destination',
+   'GPSDestLongitudeRef' => {
+      Description => 'RÃ©fÃ©rence de la longitude de destination',
+      PrintConv => {
+        'East' => 'Longitude est',
+        'West' => 'Longitude ouest',
+      },
+    },
+   'GPSDifferential' => {
+      Description => 'Correction diffÃ©rentielle GPS',
+      PrintConv => {
+        'Differential Corrected' => 'Correction diffÃ©rentielle appliquÃ©e',
+        'No Correction' => 'Mesure sans correction diffÃ©rentielle',
+      },
+    },
+   'GPSImgDirection' => 'Direction de l\'image',
+   'GPSImgDirectionRef' => {
+      Description => 'RÃ©fÃ©rence pour la direction l\'image',
+      PrintConv => {
+        'Magnetic North' => 'Direction magnÃ©tique',
+        'True North' => 'Direction vraie',
+      },
+    },
+   'GPSInfo' => 'Pointeur IFD d\'informations GPS',
+   'GPSLatitude' => 'Latitude',
+   'GPSLatitudeRef' => {
+      Description => 'Latitude nord ou sud',
+      PrintConv => {
+        'North' => 'Latitude nord',
+        'South' => 'Latitude sud',
+      },
+    },
+   'GPSLongitude' => 'Longitude',
+   'GPSLongitudeRef' => {
+      Description => 'Longitude est ou ouest',
+      PrintConv => {
+        'East' => 'Longitude est',
+        'West' => 'Longitude ouest',
+      },
+    },
+   'GPSMapDatum' => 'DonnÃ©es de surveillance gÃ©odÃ©sique utilisÃ©es',
+   'GPSMeasureMode' => {
+      Description => 'Mode de mesure GPS',
+      PrintConv => {
+        '2-D' => 'Mesure Ã  deux dimensions',
+        '2-Dimensional' => 'Mesure Ã  deux dimensions',
+        '2-Dimensional Measurement' => 'Mesure Ã  deux dimensions',
+        '3-D' => 'Mesure Ã  trois dimensions',
+        '3-Dimensional' => 'Mesure Ã  trois dimensions',
+        '3-Dimensional Measurement' => 'Mesure Ã  trois dimensions',
+      },
+    },
+   'GPSPosition' => 'Position GPS',
+   'GPSProcessingMethod' => 'Nom de la mÃ©thode de traitement GPS',
+   'GPSSatellites' => 'Satellites GPS utilisÃ©s pour la mesure',
+   'GPSSpeed' => 'Vitesse du rÃ©cepteur GPS',
+   'GPSSpeedRef' => {
+      Description => 'UnitÃ© de vitesse',
+      PrintConv => {
+        'km/h' => 'KilomÃštres par heure',
+        'knots' => 'Noeuds',
+        'mph' => 'Miles par heure',
+      },
+    },
+   'GPSStatus' => {
+      Description => 'Ãtat du rÃ©cepteur GPS',
+      PrintConv => {
+        'Measurement Active' => 'Mesure active',
+        'Measurement Void' => 'Mesure vide',
+      },
+    },
+   'GPSTimeStamp' => 'Heure GPS (horloge atomique)',
+   'GPSTrack' => 'Direction de dÃ©placement',
+   'GPSTrackRef' => {
+      Description => 'RÃ©fÃ©rence pour la direction de dÃ©placement',
+      PrintConv => {
+        'Magnetic North' => 'Direction magnÃ©tique',
+        'True North' => 'Direction vraie',
+      },
+    },
+   'GPSVersionID' => 'Version de tag GPS',
+   'GainControl' => {
+      Description => 'ContrÃŽle de gain',
+      PrintConv => {
+        'High gain down' => 'Forte attÃ©nuation',
+        'High gain up' => 'Fort gain',
+        'Low gain down' => 'Faible attÃ©nuation',
+        'Low gain up' => 'Faible gain',
+        'None' => 'Aucune',
+      },
+    },
+   'GammaCompensatedValue' => 'Valeur de compensation gamma',
+   'Gapless' => {
+      PrintConv => {
+        'No' => 'Non',
+        'Yes' => 'Oui',
+      },
+    },
+   'GeoTiffAsciiParams' => 'Tag de paramÃštres Ascii GeoTiff',
+   'GeoTiffDirectory' => 'Tag de rÃ©pertoire de clÃ© GeoTiff',
+   'GeoTiffDoubleParams' => 'Tag de paramÃštres doubles GeoTiff',
+   'Gradation' => 'Luminosite',
+   'GrayResponseCurve' => 'Courbe de rÃ©ponse du gris',
+   'GrayResponseUnit' => {
+      Description => 'UnitÃ© de rÃ©ponse en gris',
+      PrintConv => {
+        '0.0001' => 'Le nombre reprÃ©sente des milliÃšmes d\'unitÃ©',
+        '0.001' => 'Le nombre reprÃ©sente des centiÃšmes d\'unitÃ©',
+        '0.1' => 'Le nombre reprÃ©sente des dixiÃšmes d\'unitÃ©',
+        '1e-05' => 'Le nombre reprÃ©sente des dix-milliÃšmes d\'unitÃ©',
+        '1e-06' => 'Le nombre reprÃ©sente des cent-milliÃšmes d\'unitÃ©',
+      },
+    },
+   'GrayTRC' => 'Courbe de reproduction des tons gris',
+   'GreenMatrixColumn' => 'Colonne de matrice verte',
+   'GreenTRC' => 'Courbe de reproduction des tons verts',
+   'GridDisplay' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'GripBatteryADLoad' => 'Tension accu poignÃ©e en charge',
+   'GripBatteryADNoLoad' => 'Tension accu poignÃ©e Ã  vide',
+   'GripBatteryState' => {
+      Description => 'Ãtat de accu poignÃ©e',
+      PrintConv => {
+        'Almost Empty' => 'Presque vide',
+        'Empty or Missing' => 'Vide ou absent',
+        'Full' => 'Plein',
+        'Running Low' => 'En baisse',
+      },
+    },
+   'HCUsage' => 'Usage HC',
+   'HDR' => {
+      Description => 'HDR auto',
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©e',
+      },
+    },
+   'HalftoneHints' => 'Indications sur les demi-treintes',
+   'Headline' => 'Titre principal',
+   'HighISONoiseReduction' => {
+      Description => 'RÃ©duction du bruit en haute sensibilitÃ© ISO',
+      PrintConv => {
+        'Auto' => 'Auto.',
+        'High' => 'Fort',
+        'Low' => 'Bas',
+        'Normal' => 'Normale',
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+        'Strong' => 'Importante',
+        'Weak' => 'Faible',
+        'Weakest' => 'La plus faible',
+      },
+    },
+   'HighlightTonePriority' => {
+      Description => 'PrioritÃ© hautes lumiÃšres',
+      PrintConv => {
+        'Disable' => 'DÃ©sactivÃ©e',
+        'Enable' => 'ActivÃ©e',
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'History' => 'RÃ©capitulatif',
+   'HometownCity' => 'Ville de rÃ©sidence',
+   'HometownCityCode' => 'Code ville de rÃ©sidence',
+   'HometownDST' => {
+      Description => 'Heure d\'Ã©tÃ© de rÃ©sidence',
+      PrintConv => {
+        'No' => 'Non',
+        'Yes' => 'Oui',
+      },
+    },
+   'HostComputer' => 'Ordinateur hÃŽte',
+   'Hue' => 'Nuance',
+   'HueAdjustment' => 'Teinte',
+   'HyperfocalDistance' => 'Distanace hyperfocale',
+   'ICCProfileName' => 'Nom du profil ICC',
+   'ICC_Profile' => 'Profil de couleur ICC d\'entrÃ©e',
+   'ID3Size' => 'Taille ID3',
+   'IPTC-NAA' => 'MÃ©tadonnÃ©es IPTC-NAA',
+   'IPTCBitsPerSample' => 'Nombre de bits par Ã©chantillon',
+   'IPTCImageHeight' => 'Nombre de lignes',
+   'IPTCImageRotation' => {
+      Description => 'Rotation d\'image',
+      PrintConv => {
+        '0' => 'Pas de rotation',
+        '180' => 'Rotation de 180 degrÃ©s',
+        '270' => 'Rotation de 270 degrÃ©s',
+        '90' => 'Rotation de 90 degrÃ©s',
+      },
+    },
+   'IPTCImageWidth' => 'Pixels par ligne',
+   'IPTCPictureNumber' => 'NumÃ©ro d\'image',
+   'IPTCPixelHeight' => 'Taille de pixel perpendiculairement Ã  la direction de scan',
+   'IPTCPixelWidth' => 'Taille de pixel dans la direction de scan',
+   'ISO' => 'SensibilitÃ© ISO',
+   'ISOExpansion' => {
+      Description => 'Extension sensibilitÃ© ISO',
+      PrintConv => {
+        'Off' => 'ArrÃªt',
+        'On' => 'Marche',
+      },
+    },
+   'ISOExpansion2' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+      },
+    },
+   'ISOFloor' => 'Seuil ISO',
+   'ISOInfo' => 'Info ISO',
+   'ISOSelection' => 'Choix ISO',
+   'ISOSetting' => {
+      Description => 'RÃ©glage ISO',
+      PrintConv => {
+        'Manual' => 'Manuelle',
+      },
+    },
+   'ISOSpeedExpansion' => {
+      Description => 'Extension de sensibilitÃ© ISO',
+      PrintConv => {
+        'No' => 'Non',
+        'Yes' => 'Oui',
+      },
+    },
+   'ISOSpeedIncrements' => {
+      Description => 'IncrÃ©ments de sensibilitÃ© ISO',
+      PrintConv => {
+        '1/3 Stop' => 'Palier 1/3',
+      },
+    },
+   'ISOSpeedRange' => {
+      Description => 'RÃ©gler l\'extension de sensibilitÃ© ISO',
+      PrintConv => {
+        'Disable' => 'DÃ©sactivÃ©',
+        'Enable' => 'ActivÃ©e',
+      },
+    },
+   'IT8Header' => 'En-tÃªte IT8',
+   'Identifier' => 'Identifiant',
+   'Illumination' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'ImageAdjustment' => 'Ajustement Image',
+   'ImageAreaOffset' => 'DÃ©calage de zone d\'image',
+   'ImageAuthentication' => {
+      Description => 'Authentication de l\'image',
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'ImageBoundary' => 'Cadre Image',
+   'ImageColorIndicator' => 'Indicateur de couleur d\'image',
+   'ImageColorValue' => 'Valeur de couleur d\'image',
+   'ImageCount' => 'Compteur d\'images',
+   'ImageDataSize' => 'Taille de l\'image',
+   'ImageDepth' => 'Profondeur d\'image',
+   'ImageDescription' => 'Description d\'image',
+   'ImageDustOff' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'ImageEditCount' => 'Compteur de traitement d\'image',
+   'ImageEditing' => {
+      Description => 'Traitement de l\'image',
+      PrintConv => {
+        'Cropped' => 'RecadrÃ©',
+        'Digital Filter' => 'Filtre numÃ©rique',
+        'Frame Synthesis?' => 'SynthÃšse de vue ?',
+        'None' => 'Aucun',
+      },
+    },
+   'ImageHeight' => 'Hauteur d\'image',
+   'ImageHistory' => 'Historique de l\'image',
+   'ImageID' => 'ID d\'image',
+   'ImageLayer' => 'Couche image',
+   'ImageNumber' => 'NumÃ©ro d\'image',
+   'ImageOptimization' => 'Optimisation d\'image',
+   'ImageOrientation' => {
+      Description => 'Orientation d\'image',
+      PrintConv => {
+        'Landscape' => 'Paysage',
+        'Square' => 'CarrÃ©',
+      },
+    },
+   'ImageQuality' => {
+      PrintConv => {
+        'Normal' => 'Normale',
+      },
+    },
+   'ImageReview' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'ImageRotated' => {
+      PrintConv => {
+        'No' => 'Non',
+        'Yes' => 'Oui',
+      },
+    },
+   'ImageSize' => 'Taille de l\'Image',
+   'ImageSourceData' => 'DonnÃ©es source d\'image',
+   'ImageStabilization' => {
+      Description => 'Stabilisation d\'image',
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+        'On, Mode 1' => 'EnclenchÃ©, Mode 1',
+        'On, Mode 2' => 'EnclenchÃ©, Mode 2',
+      },
+    },
+   'ImageTone' => {
+      Description => 'Ton de l\'image',
+      PrintConv => {
+        'Bright' => 'Brillant',
+        'Landscape' => 'Paysage',
+        'Natural' => 'Naturel',
+      },
+    },
+   'ImageType' => 'Type d\'image',
+   'ImageUniqueID' => 'Identificateur unique d\'image',
+   'ImageWidth' => 'Largeur d\'image',
+   'Indexed' => 'IndexÃ©',
+   'InfoButtonWhenShooting' => {
+      Description => 'Touche INFO au dÃ©clenchement',
+      PrintConv => {
+        'Displays camera settings' => 'Affiche les rÃ©glages en cours',
+        'Displays shooting functions' => 'Affiche les fonctions',
+      },
+    },
+   'InkNames' => 'Nom des encres',
+   'InkSet' => 'Encrage',
+   'IntellectualGenre' => 'Genre intellectuel',
+   'IntensityStereo' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'InterchangeColorSpace' => {
+      PrintConv => {
+        'CMY (K) Device Dependent' => 'CMY(K) dÃ©pendant de l\'appareil',
+        'RGB Device Dependent' => 'RVB dÃ©pendant de l\'appareil',
+      },
+    },
+   'IntergraphMatrix' => 'Tag de matrice intergraphe',
+   'Interlace' => 'Entrelacement',
+   'InternalFlash' => {
+      PrintConv => {
+        'Fired' => 'Flash dÃ©clenchÃ©',
+        'Manual' => 'Manuelle',
+        'No' => 'Flash non dÃ©clenchÃ©',
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'InternalFlashMode' => {
+      Description => 'Segment de mesure flash esclave 2',
+      PrintConv => {
+        'Did not fire, (Unknown 0xf4)' => 'Hors service (inconnue 0xF4)',
+        'Did not fire, Auto' => 'Hors service, auto',
+        'Did not fire, Auto, Red-eye reduction' => 'Hors service, auto, rÃ©duction yeux rouges',
+        'Did not fire, Normal' => 'Hors service, normal',
+        'Did not fire, Red-eye reduction' => 'Hors service, rÃ©duction yeux rouges',
+        'Did not fire, Slow-sync' => 'Hors service, synchro lente',
+        'Did not fire, Slow-sync, Red-eye reduction' => 'Hors service, synchro lente, rÃ©duction yeux rouges',
+        'Did not fire, Trailing-curtain Sync' => 'Hors service, synchro 2e rideau',
+        'Did not fire, Wireless (Control)' => 'Hors service, sans cordon (contrÃŽleur)',
+        'Did not fire, Wireless (Master)' => 'Hors service, sans cordon (maÃ®tre)',
+        'Fired' => 'ActivÃ©',
+        'Fired, Auto' => 'En service, auto',
+        'Fired, Auto, Red-eye reduction' => 'En service, auto, rÃ©duction yeux rouges',
+        'Fired, Red-eye reduction' => 'En service, rÃ©duction yeux rouges',
+        'Fired, Slow-sync' => 'En service, synchro lente',
+        'Fired, Slow-sync, Red-eye reduction' => 'En service, synchro lente, rÃ©duction yeux rouges',
+        'Fired, Trailing-curtain Sync' => 'En service, synchro 2e rideau',
+        'Fired, Wireless (Control)' => 'En service, sans cordon (contrÃŽleur)',
+        'Fired, Wireless (Master)' => 'En service, sans cordon (maÃ®tre)',
+        'n/a - Off-Auto-Aperture' => 'N/c - auto-diaph hors service',
+      },
+    },
+   'InternalFlashStrength' => 'Segment de mesure flash esclave 4',
+   'InternalSerialNumber' => 'NumÃ©ro de sÃ©rie interne',
+   'InteropIndex' => {
+      Description => 'Identification d\'interopÃ©rabilitÃ©',
+      PrintConv => {
+        'R03 - DCF option file (Adobe RGB)' => 'R03: fichier d\'option DCF (Adobe RGB)',
+        'R98 - DCF basic file (sRGB)' => 'R98: fichier de base DCF (sRGB)',
+        'THM - DCF thumbnail file' => 'THM: fichier de vignette DCF',
+      },
+    },
+   'InteropOffset' => 'Indicateur d\'interfonctionnement',
+   'InteropVersion' => 'Version d\'interopÃ©rabilitÃ©',
+   'IptcLastEdited' => 'Derniere edition IPTC',
+   'JFIFVersion' => 'Version JFIF',
+   'JPEGACTables' => 'Tableaux AC JPEG',
+   'JPEGDCTables' => 'Tableaux DC JPEG',
+   'JPEGLosslessPredictors' => 'PrÃ©dicteurs JPEG sans perte',
+   'JPEGPointTransforms' => 'Transformations de point JPEG',
+   'JPEGProc' => 'Proc JPEG',
+   'JPEGQTables' => 'Tableaux Q JPEG',
+   'JPEGRestartInterval' => 'Intervalle de redÃ©marrage JPEG',
+   'JPEGTables' => 'Tableaux JPEG',
+   'JobID' => 'ID de la tÃ¢che',
+   'JpgRecordedPixels' => {
+      Description => 'Pixels enregistrÃ©s JPEG',
+      PrintConv => {
+        '10 MP' => '10 Mpx',
+        '2 MP' => '2 Mpx',
+        '6 MP' => '6 Mpx',
+      },
+    },
+   'Keyword' => 'Mots clÃ©',
+   'Keywords' => 'Mots-clÃ©s',
+   'LC1' => 'DonnÃ©es d\'objectif',
+   'LC10' => 'DonnÃ©es mv\' nv\'',
+   'LC11' => 'DonnÃ©es AVC 1/EXP',
+   'LC12' => 'DonnÃ©es mv1 Avminsif',
+   'LC14' => 'DonnÃ©es UNT_12 UNT_6',
+   'LC15' => 'DonnÃ©es d\'adaptation de flash incorporÃ©',
+   'LC2' => 'Code de distance',
+   'LC3' => 'Valeur K',
+   'LC4' => 'DonnÃ©es de correction d\'aberration Ã  courte distance',
+   'LC5' => 'DonnÃ©es de correction d\'aberration chromatique',
+   'LC6' => 'DonnÃ©es d\'aberration d\'ouverture',
+   'LC7' => 'DonnÃ©es de condition minimale de dÃ©clenchement AF',
+   'LCDDisplayAtPowerOn' => {
+      Description => 'Etat LCD lors de l\'allumage',
+      PrintConv => {
+        'Display' => 'AllumÃ©',
+        'Retain power off status' => 'Etat prÃ©cÃ©dent',
+      },
+    },
+   'LCDDisplayReturnToShoot' => {
+      Description => 'Affich. LCD -> Prise de vues',
+      PrintConv => {
+        'Also with * etc.' => 'Aussi par * etc.',
+        'With Shutter Button only' => 'Par dÃ©clencheur uniq.',
+      },
+    },
+   'LCDIllumination' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'LCDIlluminationDuringBulb' => {
+      Description => 'Ãclairage LCD pendant pose longue',
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'LCDPanels' => {
+      Description => 'Ecran LCD supÃ©rieur/arriÃšre',
+      PrintConv => {
+        'ISO/File no.' => 'ISO/No. fichier',
+        'ISO/Remain. shots' => 'ISO/Vues restantes',
+        'Remain. shots/File no.' => 'Vues restantes/No. fichier',
+        'Shots in folder/Remain. shots' => 'Vues dans dossier/Vues restantes',
+      },
+    },
+   'LCHEditor' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'Language' => 'Langage',
+   'LanguageIdentifier' => 'Identificateur de langue',
+   'LeafData' => 'DonnÃ©es Leaf',
+   'Lens' => 'Objectif ',
+   'LensAFStopButton' => {
+      Description => 'Fonct. touche AF objectif',
+      PrintConv => {
+        'AE lock' => 'Verrouillage AE',
+        'AE lock while metering' => 'Verr. AE posemÃštre actif',
+        'AF Stop' => 'ArrÃªt AF',
+        'AF mode: ONE SHOT <-> AI SERVO' => 'Mode AF: ONE SHOT <-> AI SERVO',
+        'AF point: M -> Auto / Auto -> Ctr.' => 'Colli: M -> Auto / Auto -> Ctr.',
+        'AF point: M->Auto/Auto->ctr' => 'Collim.AF: M->Auto/Auto->ctr',
+        'AF start' => 'Activation AF',
+        'AF stop' => 'ArrÃªt AF',
+        'IS start' => 'Activation stab. image',
+        'Switch to registered AF point' => 'Activer le collimateur autofocus enregistrÃ©',
+      },
+    },
+   'LensData' => 'Valeur K (LC3)',
+   'LensDataVersion' => 'Version des DonnÃ©es Objectif',
+   'LensDriveNoAF' => {
+      Description => 'Pilot. obj. si AF impossible',
+      PrintConv => {
+        'Focus search off' => 'Pas de recherche du point',
+        'Focus search on' => 'Recherche du point',
+      },
+    },
+   'LensFStops' => 'Nombre de diaphs de l\'objectif',
+   'LensID' => 'ID Lens',
+   'LensIDNumber' => 'NumÃ©ro d\'Objectif',
+   'LensInfo' => 'Infos lens',
+   'LensKind' => 'Sorte d\'objectif / version (LC0)',
+   'LensSerialNumber' => 'NumÃ©ro de sÃ©rie objectif',
+   'LensType' => 'Sorte d\'objectif',
+   'LicenseType' => {
+      PrintConv => {
+        'Unknown' => 'Inconnu',
+      },
+    },
+   'LightReading' => 'Lecture de la lumiÃšre',
+   'LightSource' => {
+      Description => 'Source de lumiÃšre',
+      PrintConv => {
+        'Cloudy' => 'Temps nuageux',
+        'Cool White Fluorescent' => 'Fluorescente type soft',
+        'Day White Fluorescent' => 'Fluorescente type blanc',
+        'Daylight' => 'LumiÃšre du jour',
+        'Daylight Fluorescent' => 'Fluorescente type jour',
+        'Fine Weather' => 'Beau temps',
+        'Fluorescent' => 'Fluorescente',
+        'ISO Studio Tungsten' => 'TungstÃšne studio ISO',
+        'Other' => 'Autre source de lumiÃšre',
+        'Shade' => 'Ombre',
+        'Standard Light A' => 'LumiÃšre standard A',
+        'Standard Light B' => 'LumiÃšre standard B',
+        'Standard Light C' => 'LumiÃšre standard C',
+        'Tungsten (Incandescent)' => 'TungstÃšne (lumiÃšre incandescente)',
+        'Unknown' => 'Inconnue',
+        'Warm White Fluorescent' => 'Fluorescent blanc chaud',
+        'White Fluorescent' => 'Fluorescent blanc',
+      },
+    },
+   'LightSourceSpecial' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'LightValue' => 'Luminosite',
+   'Lightness' => 'LuminositÃ©',
+   'LinearResponseLimit' => 'Limite de rÃ©ponse linÃ©aire',
+   'LinearizationTable' => 'Table de linÃ©arisation',
+   'Lit' => {
+      PrintConv => {
+        'No' => 'Non',
+        'Yes' => 'Oui',
+      },
+    },
+   'LiveViewExposureSimulation' => {
+      Description => 'Simulation d\'exposition directe',
+      PrintConv => {
+        'Disable (LCD auto adjust)' => 'DÃ©sactivÃ©e (rÃ©glge Ã©cran auto)',
+        'Enable (simulates exposure)' => 'ActivÃ©e (simulation exposition)',
+      },
+    },
+   'LiveViewShooting' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'LocalizedCameraModel' => 'Nom traduit de modÃšle d\'appareil',
+   'Location' => 'Ligne',
+   'LockMicrophoneButton' => {
+      Description => 'Fonction de touche microphone',
+      PrintConv => {
+        'Protect (hold:record memo)' => 'ProtÃ©ger (maintien: enregistrement sonore)',
+        'Record memo (protect:disable)' => 'Enregistrement sonore (protÃ©ger: dÃ©sactivÃ©e)',
+      },
+    },
+   'LongExposureNoiseReduction' => {
+      Description => 'RÃ©duct. bruit longue expo.',
+      PrintConv => {
+        'Off' => 'ArrÃªt',
+        'On' => 'Marche',
+      },
+    },
+   'LookupTable' => 'Table de correspondance',
+   'LoopStyle' => {
+      PrintConv => {
+        'Normal' => 'Normale',
+      },
+    },
+   'LuminanceNoiseReduction' => {
+      PrintConv => {
+        'Low' => 'Bas',
+        'Off' => 'DÃ©sactivÃ©',
+      },
+    },
+   'MCUVersion' => 'Version MCU',
+   'MIEVersion' => 'Version MIE',
+   'MIMEType' => 'Type MIME',
+   'MSStereo' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'Macro' => {
+      PrintConv => {
+        'Manual' => 'Manuelle',
+        'Normal' => 'Normale',
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+        'Super Macro' => 'Super macro',
+      },
+    },
+   'MacroMode' => {
+      Description => 'Mode Macro',
+      PrintConv => {
+        'Normal' => 'Normale',
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+        'Super Macro' => 'Super macro',
+        'Tele-Macro' => 'Macro en tÃ©lÃ©',
+      },
+    },
+   'MagnifiedView' => {
+      Description => 'Agrandissement en lecture',
+      PrintConv => {
+        'Image playback only' => 'Lecture image uniquement',
+        'Image review and playback' => 'Aff. inst. et lecture',
+      },
+    },
+   'MainDialExposureComp' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'Make' => 'Fabricant',
+   'MakeAndModel' => 'Fabricant et modÃšle',
+   'MakerNote' => 'DonnÃ©es privÃ©es DNG',
+   'MakerNoteSafety' => {
+      Description => 'SÃ©curitÃ© de note de fabricant',
+      PrintConv => {
+        'Safe' => 'SÃ»re',
+        'Unsafe' => 'Pas sÃ»re',
+      },
+    },
+   'MakerNoteVersion' => 'Version des informations spÃ©cifiques fabricant',
+   'MakerNotes' => 'Notes fabricant',
+   'ManualFlashOutput' => {
+      PrintConv => {
+        'Low' => 'Bas',
+        'n/a' => 'Non Ã©tablie',
+      },
+    },
+   'ManualFocusDistance' => 'Distance de Mise-au-point Manuelle',
+   'ManualTv' => {
+      Description => 'RÃ©gl. Tv/Av manuel pour exp. M',
+      PrintConv => {
+        'Tv=Control/Av=Main' => 'Tv=ContrÃŽle rapide/Av=Principale',
+        'Tv=Control/Av=Main w/o lens' => 'Tv=ContrÃŽle rapide/Av=Principale sans objectif',
+        'Tv=Main/Av=Control' => 'Tv=Principale/Av=ContrÃŽle rapide',
+        'Tv=Main/Av=Main w/o lens' => 'Tv=Principale/Av=ContrÃŽle rapide sans objectif',
+      },
+    },
+   'ManufactureDate' => 'Date de fabrication',
+   'Marked' => 'MarquÃ©',
+   'MaskedAreas' => 'Zones masquÃ©es',
+   'MasterDocumentID' => 'ID du document maÃ®tre',
+   'Matteing' => 'MatitÃ©',
+   'MaxAperture' => 'DonnÃ©es Avmin',
+   'MaxApertureAtMaxFocal' => 'Ouverture Ã  la focale maxi',
+   'MaxApertureAtMinFocal' => 'Ouverture Ã  la focale mini',
+   'MaxApertureValue' => 'Ouverture maximale de l\'objectif',
+   'MaxAvailHeight' => 'Hauteur max Disponible',
+   'MaxAvailWidth' => 'Largeur max Disponible',
+   'MaxFocalLength' => 'Focale maxi',
+   'MaxSampleValue' => 'Valeur maxi d\'Ã©chantillon',
+   'MaxVal' => 'Valeur max',
+   'MaximumDensityRange' => 'Etendue maximale de densitÃ©',
+   'Measurement' => 'Observateur de mesure',
+   'MeasurementBacking' => 'Support de mesure',
+   'MeasurementFlare' => 'Flare de mesure',
+   'MeasurementGeometry' => {
+      Description => 'GÃ©omÃ©trie de mesure',
+      PrintConv => {
+        '0/45 or 45/0' => '0/45 ou 45/0',
+        '0/d or d/0' => '0/d ou d/0',
+      },
+    },
+   'MeasurementIlluminant' => 'Illuminant de mesure',
+   'MeasurementObserver' => 'Observateur de mesure',
+   'MediaBlackPoint' => 'Point noir moyen',
+   'MediaType' => {
+      PrintConv => {
+        'Normal' => 'Normale',
+      },
+    },
+   'MediaWhitePoint' => 'Point blanc moyen',
+   'MenuButtonDisplayPosition' => {
+      Description => 'Position dÃ©but touche menu',
+      PrintConv => {
+        'Previous' => 'PrÃ©cÃ©dente',
+        'Previous (top if power off)' => 'PrÃ©cÃ©dente (Haut si dÃ©s.)',
+        'Top' => 'Haut',
+      },
+    },
+   'MenuButtonReturn' => {
+      PrintConv => {
+        'Previous' => 'PrÃ©cÃ©dente',
+        'Top' => 'Haut',
+      },
+    },
+   'MetadataDate' => 'Date des metadonnÃ©es',
+   'MeteringMode' => {
+      Description => 'Mode de mesure',
+      PrintConv => {
+        'Average' => 'Moyenne',
+        'Center-weighted average' => 'Centrale pondÃ©rÃ©e',
+        'Evaluative' => 'Ãvaluative',
+        'Multi-segment' => 'Multizone',
+        'Multi-spot' => 'MultiSpot',
+        'Other' => 'Autre',
+        'Partial' => 'Partielle',
+        'Spot' => 'Grain',
+        'Unknown' => 'Inconnu',
+      },
+    },
+   'MeteringMode2' => {
+      Description => 'Mode de mesure 2',
+      PrintConv => {
+        'Multi-segment' => 'Multizone',
+      },
+    },
+   'MeteringMode3' => {
+      Description => 'Mode de mesure (3)',
+      PrintConv => {
+        'Multi-segment' => 'Multizone',
+      },
+    },
+   'MinAperture' => 'Ouverture mini',
+   'MinFocalLength' => 'Focale mini',
+   'MinSampleValue' => 'Valeur mini d\'Ã©chantillon',
+   'MinoltaQuality' => {
+      Description => 'QualitÃ©',
+      PrintConv => {
+        'Normal' => 'Normale',
+      },
+    },
+   'MirrorLockup' => {
+      Description => 'Verrouillage du miroir',
+      PrintConv => {
+        'Disable' => 'DÃ©sactivÃ©',
+        'Enable' => 'ActivÃ©',
+        'Enable: Down with Set' => 'ActivÃ©: Retour par touche SET',
+      },
+    },
+   'ModDate' => 'Date de modification',
+   'Model' => 'ModÃšle d\'appareil photo',
+   'Model2' => 'ModÃšle d\'Ã©quipement de prise de vue (2)',
+   'ModelAge' => 'Age du modele',
+   'ModelTiePoint' => 'Tag de lien d modÃšle',
+   'ModelTransform' => 'Tag de transformation de modÃšle',
+   'ModelingFlash' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'ModifiedPictureStyle' => {
+      PrintConv => {
+        'Landscape' => 'Paysage',
+        'None' => 'Aucune',
+      },
+    },
+   'ModifiedSaturation' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+      },
+    },
+   'ModifiedSharpnessFreq' => {
+      PrintConv => {
+        'High' => 'Haut',
+        'Highest' => 'Plus haut',
+        'Low' => 'Doux',
+        'n/a' => 'Non Ã©tablie',
+      },
+    },
+   'ModifiedToneCurve' => {
+      PrintConv => {
+        'Manual' => 'Manuelle',
+      },
+    },
+   'ModifiedWhiteBalance' => {
+      PrintConv => {
+        'Cloudy' => 'Temps nuageux',
+        'Daylight' => 'LumiÃšre du jour',
+        'Daylight Fluorescent' => 'Fluorescente type jour',
+        'Fluorescent' => 'Fluorescente',
+        'Shade' => 'Ombre',
+        'Tungsten' => 'TungstÃšne (lumiÃšre incandescente)',
+      },
+    },
+   'ModifyDate' => 'Date de modification de fichier',
+   'MoireFilter' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'MonochromeFilterEffect' => {
+      PrintConv => {
+        'Green' => 'Vert',
+        'None' => 'Aucune',
+        'Red' => 'Rouge',
+        'Yellow' => 'Jaune',
+      },
+    },
+   'MonochromeLinear' => {
+      PrintConv => {
+        'No' => 'Non',
+        'Yes' => 'Oui',
+      },
+    },
+   'MonochromeToningEffect' => {
+      PrintConv => {
+        'Blue' => 'Bleu',
+        'Green' => 'Vert',
+        'None' => 'Aucune',
+      },
+    },
+   'MultiExposure' => 'Infos Surimpression',
+   'MultiExposureAutoGain' => {
+      Description => 'Auto-expo des surimpressions',
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'MultiExposureMode' => {
+      Description => 'Mode de surimpression',
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+      },
+    },
+   'MultiExposureShots' => 'Nombre de prises de vue',
+   'MultiExposureVersion' => 'Version Surimpression',
+   'MultiFrameNoiseReduction' => {
+      Description => 'RÃ©duc. bruit multi-photos',
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©e',
+        'On' => 'ActivÃ©(e)',
+      },
+    },
+   'MultipleExposureSet' => {
+      Description => 'Exposition multiple',
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'Mute' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'MyColorMode' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+      },
+    },
+   'NDFilter' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'NEFCompression' => {
+      PrintConv => {
+        'Uncompressed' => 'Non compressÃ©',
+      },
+    },
+   'Name' => 'Nom',
+   'NamedColor2' => 'Couleur nommÃ©e 2',
+   'NativeDigest' => 'Sommaire natif',
+   'NativeDisplayInfo' => 'Information sur l\'affichage natif',
+   'NewsPhotoVersion' => 'Version d\'enregistrement news photo',
+   'Nickname' => 'Surnom',
+   'NikonCaptureData' => 'DonnÃ©es Nikon Capture',
+   'NikonCaptureVersion' => 'Version Nikon Capture',
+   'Noise' => 'Bruit',
+   'NoiseFilter' => {
+      PrintConv => {
+        'Low' => 'Bas',
+        'Off' => 'DÃ©sactivÃ©',
+      },
+    },
+   'NoiseReduction' => {
+      Description => 'RÃ©duction du bruit',
+      PrintConv => {
+        'High (+1)' => '+1 (haut)',
+        'Highest (+2)' => '+2 (le plus haut)',
+        'Low' => 'Bas',
+        'Low (-1)' => '-1 (bas)',
+        'Lowest (-2)' => '-2 (le plus bas)',
+        'Normal' => 'Normale',
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+        'Standard' => 'Â±0 (normal)',
+      },
+    },
+   'NoiseReductionApplied' => 'RÃ©duction de bruit appliquÃ©e',
+   'NominalMaxAperture' => 'Ouverture maxi nominal',
+   'NominalMinAperture' => 'Ouverture mini nominal',
+   'NumIndexEntries' => 'Nombre d\'entrÃ©es d\'index',
+   'NumberofInks' => 'Nombre d\'encres',
+   'OECFColumns' => 'Colonnes OECF',
+   'OECFNames' => 'Noms OECF',
+   'OECFRows' => 'Lignes OECF',
+   'OECFValues' => 'Valeurs OECF',
+   'OPIProxy' => 'Proxy OPI',
+   'ObjectAttributeReference' => 'Genre intellectuel',
+   'ObjectCycle' => {
+      Description => 'Cycle d\'objet',
+      PrintConv => {
+        'Both Morning and Evening' => 'Les deux',
+        'Evening' => 'Soir',
+        'Morning' => 'Matin',
+      },
+    },
+   'ObjectFileType' => {
+      PrintConv => {
+        'None' => 'Aucune',
+        'Unknown' => 'Inconnu',
+      },
+    },
+   'ObjectName' => 'Titre',
+   'ObjectPreviewData' => 'DonnÃ©es de la miniature de l\'objet',
+   'ObjectPreviewFileFormat' => 'Format de fichier de la miniature de l\'objet',
+   'ObjectPreviewFileVersion' => 'Version de format de fichier de la miniature de l\'objet',
+   'ObjectTypeReference' => 'RÃ©fÃ©rence de type d\'objet',
+   'OffsetSchema' => 'SchÃ©ma de dÃ©calage',
+   'OldSubfileType' => 'Type du sous-fichier',
+   'OneTouchWB' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'OpticalZoomMode' => {
+      Description => 'Mode Zoom optique',
+      PrintConv => {
+        'Extended' => 'Optique EX',
+        'Standard' => 'Normal',
+      },
+    },
+   'OpticalZoomOn' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'Opto-ElectricConvFactor' => 'Facteur de conversion optoÃ©lectrique',
+   'Orientation' => {
+      Description => 'Orientation de l\'image',
+      PrintConv => {
+        'Horizontal (normal)' => '0Â° (haut/gauche)',
+        'Mirror horizontal' => '0Â° (haut/droit)',
+        'Mirror horizontal and rotate 270 CW' => '90Â° sens horaire (gauche/haut)',
+        'Mirror horizontal and rotate 90 CW' => '90Â° sens antihoraire (droit/bas)',
+        'Mirror vertical' => '180Â° (bas/gauche)',
+        'Rotate 180' => '180Â° (bas/droit)',
+        'Rotate 270 CW' => '90Â° sens horaire (gauche/bas)',
+        'Rotate 90 CW' => '90Â° sens antihoraire (droit/haut)',
+      },
+    },
+   'OriginalRawFileData' => 'DonnÃ©es du fichier raw d\'origine',
+   'OriginalRawFileDigest' => 'Digest du fichier raw original',
+   'OriginalRawFileName' => 'Nom du fichier raw d\'origine',
+   'OriginalTransmissionReference' => 'Identificateur de tÃ¢che',
+   'OriginatingProgram' => 'Programme d\'origine',
+   'OtherImage' => 'Autre image',
+   'OutputResponse' => 'RÃ©ponse de sortie',
+   'Owner' => 'Proprietaire',
+   'OwnerID' => 'ID du propriÃ©taire',
+   'OwnerName' => 'Nom du propriÃ©taire',
+   'PDFVersion' => 'Version PDF',
+   'PEFVersion' => 'Version PEF',
+   'Padding' => 'Remplissage',
+   'PageName' => 'Nom de page',
+   'PageNumber' => 'Page numÃ©ro',
+   'PanasonicExifVersion' => 'Version Exif Panasonic',
+   'PanasonicRawVersion' => 'Version Panasonic RAW',
+   'PanasonicTitle' => 'Titre',
+   'PentaxImageSize' => {
+      Description => 'Taille d\'image Pentax',
+      PrintConv => {
+        '2304x1728 or 2592x1944' => '2304 x 1728 ou 2592 x 1944',
+        '2560x1920 or 2304x1728' => '2560 x 1920 ou 2304 x 1728',
+        '2816x2212 or 2816x2112' => '2816 x 2212 ou 2816 x 2112',
+        '3008x2008 or 3040x2024' => '3008 x 2008 ou 3040 x 2024',
+        'Full' => 'Pleine',
+      },
+    },
+   'PentaxModelID' => 'ModÃšle Pentax',
+   'PentaxVersion' => 'Version Pentax',
+   'PeripheralLighting' => {
+      Description => 'Correction Ã©clairage pÃ©riphÃ©rique',
+      PrintConv => {
+        'Off' => 'DÃ©sactiver',
+        'On' => 'Activer',
+      },
+    },
+   'PersonInImage' => 'Personnage sur l\'Image',
+   'PhaseDetectAF' => 'Auto-Focus',
+   'PhotoEffect' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+      },
+    },
+   'PhotoEffects' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'PhotoEffectsType' => {
+      PrintConv => {
+        'None' => 'Aucune',
+      },
+    },
+   'PhotometricInterpretation' => {
+      Description => 'SchÃ©ma de pixel',
+      PrintConv => {
+        'BlackIsZero' => 'ZÃ©ro pour noir',
+        'Color Filter Array' => 'CFA (Matrice de filtre de couleur)',
+        'Pixar LogL' => 'CIE Log2(L) (Log luminance)',
+        'Pixar LogLuv' => 'CIE Log2(L)(u\',v\') (Log luminance et chrominance)',
+        'RGB' => 'RVB',
+        'RGB Palette' => 'Palette RVB',
+        'Transparency Mask' => 'Masque de transparence',
+        'WhiteIsZero' => 'ZÃ©ro pour blanc',
+      },
+    },
+   'PhotoshopAnnotations' => 'Annotations Photoshop',
+   'PictureControl' => {
+      Description => 'Optimisation d\'image',
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'PictureControlActive' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'PictureControlAdjust' => {
+      Description => 'Ajustement de l\'optimisation d\'image',
+      PrintConv => {
+        'Default Settings' => 'ParamÃštres par dÃ©fault',
+        'Full Control' => 'RÃ©glages manuels',
+        'Quick Adjust' => 'RÃ©glages rapides',
+      },
+    },
+   'PictureControlBase' => 'Optimisation d\'image de base',
+   'PictureControlName' => 'Nom de l\'optimisation d\'image',
+   'PictureControlQuickAdjust' => 'Optimisation d\'image - RÃ©glages rapides',
+   'PictureControlVersion' => 'Version de l\'Optimisation d\'image',
+   'PictureFinish' => {
+      PrintConv => {
+        'Natural' => 'Naturel',
+        'Night Scene' => 'Nocturne',
+      },
+    },
+   'PictureMode' => {
+      Description => 'Mode d\'image',
+      PrintConv => {
+        '1/2 EV steps' => 'Pas de 1/2 IL',
+        '1/3 EV steps' => 'Pas de 1/3 IL',
+        'Aperture Priority' => 'PrioritÃ© ouverture',
+        'Aperture Priority, Off-Auto-Aperture' => 'PrioritÃ© ouverture (auto-diaph hors service)',
+        'Aperture-priority AE' => 'PrioritÃ© ouverture',
+        'Auto PICT (Landscape)' => 'Auto PICT (paysage)',
+        'Auto PICT (Macro)' => 'Auto PICT (macro)',
+        'Auto PICT (Portrait)' => 'Auto PICT (portrait)',
+        'Auto PICT (Sport)' => 'Auto PICT (sport)',
+        'Auto PICT (Standard)' => 'Auto PICT (standard)',
+        'Autumn' => 'Automne',
+        'Blur Reduction' => 'RÃ©duction du flou',
+        'Bulb' => 'Pose B',
+        'Bulb, Off-Auto-Aperture' => 'Pose B (auto-diaph hors service)',
+        'Candlelight' => 'Bougie',
+        'DOF Program' => 'Programme PdC',
+        'DOF Program (HyP)' => 'Programme PdC (Hyper-programme)',
+        'Dark Pet' => 'Animal foncÃ©',
+        'Digital Filter' => 'Filtre numÃ©rique',
+        'Fireworks' => 'Feux d\'artifice',
+        'Flash X-Sync Speed AE' => 'Synchro X flash vitesse AE',
+        'Food' => 'Nourriture',
+        'Frame Composite' => 'Vue composite',
+        'Green Mode' => 'Mode vert',
+        'Half-length Portrait' => 'Portrait (buste)',
+        'Hi-speed Program' => 'Programme grande vitesse',
+        'Hi-speed Program (HyP)' => 'Programme grande vitesse (Hyper-programme)',
+        'Kids' => 'Enfants',
+        'Landscape' => 'Paysage',
+        'Light Pet' => 'Animal clair',
+        'MTF Program' => 'Programme FTM',
+        'MTF Program (HyP)' => 'Programme FTM (Hyper-programme)',
+        'Manual' => 'Manuelle',
+        'Manual, Off-Auto-Aperture' => 'Manuel (auto-diaph hors service)',
+        'Medium Pet' => 'Animal demi-teintes',
+        'Museum' => 'MusÃ©e',
+        'Natural Skin Tone' => 'Ton chair naturel',
+        'Night Scene' => 'Nocturne',
+        'Night Scene Portrait' => 'Portrait nocturne',
+        'No Flash' => 'Sans flash',
+        'Pet' => 'Animaux de compagnie',
+        'Program' => 'Programme',
+        'Program (HyP)' => 'Programme AE (Hyper-programme)',
+        'Program AE' => 'PrioritÃ© vitesse',
+        'Program Av Shift' => 'DÃ©calage programme Av',
+        'Program Tv Shift' => 'DÃ©calage programme Tv',
+        'Self Portrait' => 'Autoportrait',
+        'Sensitivity Priority AE' => 'PrioritÃ© sensibilitÃ© AE',
+        'Shutter & Aperture Priority AE' => 'PrioritÃ© vitesse et ouverture AE',
+        'Shutter Speed Priority' => 'PrioritÃ© vitesse',
+        'Shutter speed priority AE' => 'PrioritÃ© vitesse',
+        'Snow' => 'Neige',
+        'Soft' => 'Doux',
+        'Sunset' => 'Coucher de soleil',
+        'Surf & Snow' => 'Surf et neige',
+        'Synchro Sound Record' => 'Enregistrement de son synchro',
+        'Text' => 'Texte',
+        'Underwater' => 'Sous-marine',
+      },
+    },
+   'PictureMode2' => {
+      Description => 'Mode d\'image 2',
+      PrintConv => {
+        'Aperture Priority' => 'PrioritÃ© ouverture',
+        'Aperture Priority, Off-Auto-Aperture' => 'PrioritÃ© ouverture (auto-diaph hors service)',
+        'Auto PICT' => 'Image auto',
+        'Bulb' => 'Pose B',
+        'Bulb, Off-Auto-Aperture' => 'Pose B (auto-diaph hors service)',
+        'Flash X-Sync Speed AE' => 'Expo auto, vitesse de synchro flash X',
+        'Green Mode' => 'Mode vert',
+        'Manual' => 'Manuelle',
+        'Manual, Off-Auto-Aperture' => 'Manuel (auto-diaph hors service)',
+        'Program AE' => 'Programme AE',
+        'Program Av Shift' => 'DÃ©calage programme Av',
+        'Program Tv Shift' => 'DÃ©calage programme Tv',
+        'Scene Mode' => 'Mode scÃšne',
+        'Sensitivity Priority AE' => 'Expo auto, prioritÃ© sensibilitÃ©',
+        'Shutter & Aperture Priority AE' => 'Expo auto, prioritÃ© vitesse et ouverture',
+        'Shutter Speed Priority' => 'PrioritÃ© vitesse',
+      },
+    },
+   'PictureModeBWFilter' => {
+      PrintConv => {
+        'Green' => 'Vert',
+        'Red' => 'Rouge',
+        'Yellow' => 'Jaune',
+        'n/a' => 'Non Ã©tablie',
+      },
+    },
+   'PictureModeTone' => {
+      PrintConv => {
+        'Blue' => 'Bleu',
+        'Green' => 'Vert',
+        'n/a' => 'Non Ã©tablie',
+      },
+    },
+   'PictureStyle' => {
+      Description => 'Style d\'image',
+      PrintConv => {
+        'Faithful' => 'FidÃšle',
+        'High Saturation' => 'Saturation Ã©levÃ©e',
+        'Landscape' => 'Paysage',
+        'Low Saturation' => 'Faible saturation',
+        'Neutral' => 'Neutre',
+        'None' => 'Aucune',
+      },
+    },
+   'PixelIntensityRange' => 'Intervalle d\'intensitÃ© de pixel',
+   'PixelScale' => 'Tag d\'Ã©chelle de pixel modÃšle',
+   'PixelUnits' => {
+      PrintConv => {
+        'Unknown' => 'Inconnu',
+      },
+    },
+   'PlanarConfiguration' => {
+      Description => 'Arrangement des donnÃ©es image',
+      PrintConv => {
+        'Chunky' => 'Format Â« chunky Â» (entrelacÃ©)',
+        'Planar' => 'Format Â« planar Â»',
+      },
+    },
+   'PostalCode' => 'Code Postal',
+   'PowerSource' => {
+      Description => 'Source d\'alimentation',
+      PrintConv => {
+        'Body Battery' => 'Accu boÃ®tier',
+        'External Power Supply' => 'Alimentation externe',
+        'Grip Battery' => 'Accu poignÃ©e',
+      },
+    },
+   'Predictor' => {
+      Description => 'PrÃ©dicteur',
+      PrintConv => {
+        'Horizontal differencing' => 'DiffÃ©rentiation horizontale',
+        'None' => 'Aucun schÃ©ma de prÃ©dicteur utilisÃ© avant l\'encodage',
+      },
+    },
+   'Preview0' => 'AperÃ§u 0',
+   'Preview1' => 'AperÃ§u 1',
+   'Preview2' => 'AperÃ§u 2',
+   'PreviewApplicationName' => 'Nom de l\'application d\'aperÃ§u',
+   'PreviewApplicationVersion' => 'Version de l\'application d\'aperÃ§u',
+   'PreviewColorSpace' => {
+      Description => 'Espace de couleur de l\'aperÃ§u',
+      PrintConv => {
+        'Unknown' => 'Inconnu',
+      },
+    },
+   'PreviewDateTime' => 'Horodatage d\'aperÃ§u',
+   'PreviewImage' => 'AperÃ§u',
+   'PreviewImageBorders' => 'Limites d\'image miniature',
+   'PreviewImageData' => 'DonnÃ©es d\'image miniature',
+   'PreviewImageLength' => 'Longueur d\'image miniature',
+   'PreviewImageSize' => 'Taille d\'image miniature',
+   'PreviewImageStart' => 'DÃ©but d\'image miniature',
+   'PreviewImageValid' => {
+      PrintConv => {
+        'No' => 'Non',
+        'Yes' => 'Oui',
+      },
+    },
+   'PreviewQuality' => {
+      PrintConv => {
+        'Normal' => 'Normale',
+      },
+    },
+   'PreviewSettingsDigest' => 'Digest des rÃ©glages d\'aperÃ§u',
+   'PreviewSettingsName' => 'Nom des rÃ©glages d\'aperÃ§u',
+   'PrimaryAFPoint' => {
+      PrintConv => {
+        'Bottom' => 'Bas',
+        'C6 (Center)' => 'C6 (Centre)',
+        'Center' => 'Centre',
+        'Mid-left' => 'Milieu gauche',
+        'Mid-right' => 'Milieu droit',
+        'Top' => 'Haut',
+      },
+    },
+   'PrimaryChromaticities' => 'ChromaticitÃ© des couleurs primaires',
+   'PrimaryPlatform' => 'Plateforme primaire',
+   'ProcessingSoftware' => 'Logiciel de traitement',
+   'Producer' => 'Producteur',
+   'ProductID' => 'ID de produit',
+   'ProductionCode' => 'L\'appareil est passÃ© en SAV',
+   'ProfileCMMType' => 'Type de profil CMM',
+   'ProfileCalibrationSig' => 'Signature de calibration de profil',
+   'ProfileClass' => {
+      Description => 'Classe de profil',
+      PrintConv => {
+        'Abstract Profile' => 'Profil de rÃ©sumÃ©',
+        'ColorSpace Conversion Profile' => 'Profil de conversion d\'espace de couleur',
+        'DeviceLink Profile' => 'Profil de liaison',
+        'Display Device Profile' => 'Profil d\'appareil d\'affichage',
+        'Input Device Profile' => 'Profil d\'appareil d\'entrÃ©e',
+        'NamedColor Profile' => 'Profil de couleur nommÃ©e',
+        'Nikon Input Device Profile (NON-STANDARD!)' => 'Profil Nikon ("nkpf")',
+        'Output Device Profile' => 'Profil d\'appareil de sortie',
+      },
+    },
+   'ProfileConnectionSpace' => 'Espace de connexion de profil',
+   'ProfileCopyright' => 'Copyright du profil',
+   'ProfileCreator' => 'CrÃ©ateur du profil',
+   'ProfileDateTime' => 'Horodatage du profil',
+   'ProfileDescription' => 'Description du profil',
+   'ProfileDescriptionML' => 'Description de profil ML',
+   'ProfileEmbedPolicy' => {
+      Description => 'RÃšgles d\'usage du profil incluses',
+      PrintConv => {
+        'Allow Copying' => 'Permet la copie',
+        'Embed if Used' => 'Inclus si utilisÃ©',
+        'Never Embed' => 'Jamais inclus',
+        'No Restrictions' => 'Pas de restriction',
+      },
+    },
+   'ProfileFileSignature' => 'Signature de fichier de profil',
+   'ProfileHueSatMapData1' => 'DonnÃ©es de profil teinte sat. 1',
+   'ProfileHueSatMapData2' => 'DonnÃ©es de profil teinte sat. 2',
+   'ProfileHueSatMapDims' => 'Divisions de teinte',
+   'ProfileID' => 'ID du profil',
+   'ProfileLookTableData' => 'DonnÃ©es de table de correspondance de profil',
+   'ProfileLookTableDims' => 'Divisions de teinte',
+   'ProfileName' => 'Nom du profil',
+   'ProfileSequenceDesc' => 'Description de sÃ©quence du profil',
+   'ProfileToneCurve' => 'Courbe de ton du profil',
+   'ProfileVersion' => 'Version de profil',
+   'ProgramISO' => 'Programme ISO',
+   'ProgramLine' => {
+      Description => 'Ligne de programme',
+      PrintConv => {
+        'Depth' => 'PrioritÃ© profondeur de champ',
+        'Hi Speed' => 'PrioritÃ© grande vitesse',
+        'MTF' => 'PrioritÃ© FTM',
+        'Normal' => 'Normale',
+      },
+    },
+   'ProgramMode' => {
+      PrintConv => {
+        'None' => 'Aucune',
+        'Sunset' => 'Coucher de soleil',
+        'Text' => 'Texte',
+      },
+    },
+   'ProgramShift' => 'DÃ©calage Programme',
+   'ProgramVersion' => 'Version du programme',
+   'Protect' => 'ProtÃ©ger',
+   'Province-State' => 'RÃ©gion / DÃ©partement',
+   'Publisher' => 'Editeur',
+   'Quality' => {
+      Description => 'QualitÃ©',
+      PrintConv => {
+        'Best' => 'La meilleure',
+        'Better' => 'Meilleure',
+        'Compressed RAW' => 'cRAW',
+        'Compressed RAW + JPEG' => 'cRAW+JPEG',
+        'Extra Fine' => 'Extra fine',
+        'Good' => 'Bonne',
+        'Low' => 'Bas',
+        'Normal' => 'Normale',
+        'RAW + JPEG' => 'RAW+JPEG',
+      },
+    },
+   'QualityMode' => {
+      Description => 'QualitÃ©',
+      PrintConv => {
+        'Fine' => 'Haute',
+        'Normal' => 'Normale',
+      },
+    },
+   'QuantizationMethod' => {
+      Description => 'MÃ©thode de quantification',
+      PrintConv => {
+        'Color Space Specific' => 'SpÃ©cifique Ã  l\'espace de couleur',
+        'Compression Method Specific' => 'SpÃ©cifique Ã  la mÃ©thode de compression',
+        'Gamma Compensated' => 'CompensÃ©e gamma',
+        'IPTC Ref B' => 'IPTC rÃ©f "B"',
+        'Linear Density' => 'DensitÃ© linÃ©aire',
+        'Linear Dot Percent' => 'Pourcentage de point linÃ©aire',
+        'Linear Reflectance/Transmittance' => 'RÃ©flectance/transmittance linÃ©aire',
+      },
+    },
+   'QuickControlDialInMeter' => {
+      Description => 'Molette de contrÃŽle rapide en mesure',
+      PrintConv => {
+        'AF point selection' => 'SÃ©lection collimateur AF',
+        'Exposure comp/Aperture' => 'Correction exposition/ouverture',
+        'ISO speed' => 'SensibilitÃ© ISO',
+      },
+    },
+   'QuickShot' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'RAFVersion' => 'Version RAF',
+   'RasterPadding' => 'Remplissage raster',
+   'RasterizedCaption' => 'LÃ©gende rastÃ©risÃ©e',
+   'Rating' => 'Ãvaluation',
+   'RatingPercent' => 'Rapport en pourcentage',
+   'RawAndJpgRecording' => {
+      Description => 'Enregistrement RAW et JPEG',
+      PrintConv => {
+        'JPEG (Best)' => 'JPEG (le meilleur)',
+        'JPEG (Better)' => 'JPEG (meilleur)',
+        'JPEG (Good)' => 'JPEG (bon)',
+        'RAW (DNG, Best)' => 'RAW (DNG, le meilleur)',
+        'RAW (DNG, Better)' => 'RAW (DNG, meilleur)',
+        'RAW (DNG, Good)' => 'RAW (DNG, bon)',
+        'RAW (PEF, Best)' => 'RAW (PEF, le meilleur)',
+        'RAW (PEF, Better)' => 'RAW (PEF, meilleur)',
+        'RAW (PEF, Good)' => 'RAW (PEF, bon)',
+        'RAW+JPEG (DNG, Best)' => 'RAW+JPEG (DNG, le meilleur)',
+        'RAW+JPEG (DNG, Better)' => 'RAW+JPEG (DNG, meilleur)',
+        'RAW+JPEG (DNG, Good)' => 'RAW+JPEG (DNG, bon)',
+        'RAW+JPEG (PEF, Best)' => 'RAW+JPEG (PEF, le meilleur)',
+        'RAW+JPEG (PEF, Better)' => 'RAW+JPEG (PEF, meilleur)',
+        'RAW+JPEG (PEF, Good)' => 'RAW+JPEG (PEF, bon)',
+        'RAW+Large/Fine' => 'RAW+grande/fine',
+        'RAW+Large/Normal' => 'RAW+grande/normale',
+        'RAW+Medium/Fine' => 'RAW+moyenne/fine',
+        'RAW+Medium/Normal' => 'RAW+moyenne/normale',
+        'RAW+Small/Fine' => 'RAW+petite/fine',
+        'RAW+Small/Normal' => 'RAW+petite/normale',
+      },
+    },
+   'RawDataOffset' => 'DÃ©calage donnÃ©es Raw',
+   'RawDataUniqueID' => 'ID unique de donnÃ©es brutes',
+   'RawDevAutoGradation' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'RawDevPMPictureTone' => {
+      PrintConv => {
+        'Blue' => 'Bleu',
+        'Green' => 'Vert',
+      },
+    },
+   'RawDevPM_BWFilter' => {
+      PrintConv => {
+        'Green' => 'Vert',
+        'Red' => 'Rouge',
+        'Yellow' => 'Jaune',
+      },
+    },
+   'RawDevPictureMode' => {
+      PrintConv => {
+        'Natural' => 'Naturel',
+      },
+    },
+   'RawDevWhiteBalance' => {
+      PrintConv => {
+        'Color Temperature' => 'TempÃ©rature de couleur',
+      },
+    },
+   'RawImageCenter' => 'Centre Image RAW',
+   'RawImageDigest' => 'Digest d\'image brute',
+   'RawImageSize' => 'Taille d\'image RAW',
+   'RawJpgQuality' => {
+      PrintConv => {
+        'Normal' => 'Normale',
+      },
+    },
+   'RecordMode' => {
+      Description => 'Mode d\'enregistrement',
+      PrintConv => {
+        'Aperture Priority' => 'PrioritÃ© ouverture',
+        'Manual' => 'Manuelle',
+        'Shutter Priority' => 'PrioritÃ© vitesse',
+      },
+    },
+   'RecordingMode' => {
+      PrintConv => {
+        'Landscape' => 'Paysage',
+        'Manual' => 'Manuelle',
+        'Night Scene' => 'Nocturne',
+      },
+    },
+   'RedBalance' => 'Balance rouge',
+   'RedEyeCorrection' => {
+      PrintConv => {
+        'Automatic' => 'Auto',
+        'Off' => 'DÃ©sactivÃ©',
+      },
+    },
+   'RedEyeReduction' => {
+      Description => 'RÃ©duction yeux rouges',
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'RedMatrixColumn' => 'Colonne de matrice rouge',
+   'RedTRC' => 'Courbe de reproduction des tons rouges',
+   'ReductionMatrix1' => 'Matrice de rÃ©duction 1',
+   'ReductionMatrix2' => 'Matrice de rÃ©duction 2',
+   'ReferenceBlackWhite' => 'Paire de valeurs de rÃ©fÃ©rence noir et blanc',
+   'ReferenceDate' => 'Date de rÃ©fÃ©rence',
+   'ReferenceNumber' => 'NumÃ©ro de rÃ©fÃ©rence',
+   'ReferenceService' => 'Service de rÃ©fÃ©rence',
+   'RelatedImageFileFormat' => 'Format de fichier image apparentÃ©',
+   'RelatedImageHeight' => 'Hauteur d\'image apparentÃ©e',
+   'RelatedImageWidth' => 'Largeur d\'image apparentÃ©e',
+   'RelatedSoundFile' => 'Fichier audio apparentÃ©',
+   'ReleaseButtonToUseDial' => {
+      PrintConv => {
+        'No' => 'Non',
+        'Yes' => 'Oui',
+      },
+    },
+   'ReleaseDate' => 'Date de version',
+   'ReleaseTime' => 'Heure de version',
+   'RenderingIntent' => {
+      Description => 'Intention de rendu',
+      PrintConv => {
+        'ICC-Absolute Colorimetric' => 'ColorimÃ©trique absolu',
+        'Media-Relative Colorimetric' => 'ColorimÃ©trique relatif',
+        'Perceptual' => 'Perceptif',
+      },
+    },
+   'ResampleParamsQuality' => {
+      PrintConv => {
+        'Low' => 'Bas',
+      },
+    },
+   'Resaved' => {
+      PrintConv => {
+        'No' => 'Non',
+        'Yes' => 'Oui',
+      },
+    },
+   'Resolution' => 'RÃ©solution d\'image',
+   'ResolutionUnit' => {
+      Description => 'UnitÃ© de rÃ©solution en X et Y',
+      PrintConv => {
+        'None' => 'Aucune',
+        'cm' => 'Pixels/cm',
+        'inches' => 'Pouce',
+      },
+    },
+   'RetouchHistory' => {
+      Description => 'Historique retouche',
+      PrintConv => {
+        'None' => 'Aucune',
+      },
+    },
+   'RevisionNumber' => 'NumÃ©ro de rÃ©vision',
+   'Rights' => 'Droits',
+   'Rotation' => {
+      PrintConv => {
+        'Rotate 270 CW' => 'Rotation Ã  270 Â° - sens antihoraire',
+        'Rotate 90 CW' => 'Rotation 90 Â° - sens horaire',
+      },
+    },
+   'RowInterleaveFactor' => 'Facteur d\'entrelacement des lignes',
+   'RowsPerStrip' => 'Nombre de rangÃ©es par bande',
+   'SMaxSampleValue' => 'Valeur maxi d\'Ã©chantillon S',
+   'SMinSampleValue' => 'Valeur mini d\'Ã©chantillon S',
+   'SPIFFVersion' => 'Version SPIFF',
+   'SRAWQuality' => {
+      PrintConv => {
+        'n/a' => 'Non Ã©tablie',
+      },
+    },
+   'SRActive' => {
+      Description => 'RÃ©duction de bougÃ© active',
+      PrintConv => {
+        'No' => 'Non',
+        'Yes' => 'Oui',
+      },
+    },
+   'SRFocalLength' => 'Focale de rÃ©duction de bougÃ©',
+   'SRHalfPressTime' => 'Temps entre mesure et dÃ©clenchement',
+   'SRResult' => {
+      Description => 'Stabilisation',
+      PrintConv => {
+        'Not stabilized' => 'Non stabilisÃ©',
+      },
+    },
+   'SVGVersion' => 'Version SVG',
+   'SafetyShift' => {
+      Description => 'DÃ©calage de sÃ©curitÃ©',
+      PrintConv => {
+        'Disable' => 'DÃ©sactivÃ©',
+        'Enable (ISO speed)' => 'ActivÃ© (sensibilitÃ© ISO)',
+        'Enable (Tv/Av)' => 'ActivÃ© (Tv/Av)',
+      },
+    },
+   'SafetyShiftInAvOrTv' => {
+      Description => 'DÃ©calage de sÃ©curitÃ© Av ou Tv',
+      PrintConv => {
+        'Disable' => 'DÃ©sactivÃ©',
+        'Enable' => 'ActivÃ©',
+      },
+    },
+   'SampleFormat' => {
+      Description => 'Format d\'Ã©chantillon',
+      PrintConv => {
+        'Complex int' => 'Entier complexe',
+        'Float' => 'RÃ©el Ã  virgule flottante',
+        'Signed' => 'Entier signÃ©',
+        'Undefined' => 'Non dÃ©fini',
+        'Unsigned' => 'Entier non signÃ©',
+      },
+    },
+   'SampleStructure' => {
+      Description => 'Structure d\'Ã©chantillonnage',
+      PrintConv => {
+        'CompressionDependent' => 'DÃ©finie dans le processus de compression',
+        'Orthogonal4-2-2Sampling' => 'Orthogonale, avec les frÃ©quences d\'Ã©chantillonnage dans le rapport 4:2:2:(4)',
+        'OrthogonalConstangSampling' => 'Orthogonale, avec les mÃªmes frÃ©quences d\'Ã©chantillonnage relatives sur chaque composante',
+      },
+    },
+   'SamplesPerPixel' => 'Nombre de composantes',
+   'Saturation' => {
+      PrintConv => {
+        'High' => 'Forte',
+        'Low' => 'Faible',
+        'Med High' => 'Assez forte',
+        'Med Low' => 'Assez faible',
+        'None' => 'Non Ã©tablie',
+        'Normal' => 'Normale',
+        'Very High' => 'TrÃšs forte',
+        'Very Low' => 'TrÃšs faible',
+      },
+    },
+   'ScanImageEnhancer' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'ScanningDirection' => {
+      Description => 'Direction de scannage',
+      PrintConv => {
+        'Bottom-Top, L-R' => 'De bas en haut, de gauche Ã  droite',
+        'Bottom-Top, R-L' => 'De bas en haut, de droite Ã  gauche',
+        'L-R, Bottom-Top' => 'De gauche Ã  droite, de bas en haut',
+        'L-R, Top-Bottom' => 'De gauche Ã  droite, de haut en bas',
+        'R-L, Bottom-Top' => 'De droite Ã  gauche, de bas en haut',
+        'R-L, Top-Bottom' => 'De droite Ã  gauche, de haut en bas',
+        'Top-Bottom, L-R' => 'De haut en bas, de gauche Ã  droite',
+        'Top-Bottom, R-L' => 'De haut en bas, de droite Ã  gauche',
+      },
+    },
+   'Scene' => 'ScÃšne',
+   'SceneAssist' => 'Assistant Scene',
+   'SceneCaptureType' => {
+      Description => 'Type de capture de scÃšne',
+      PrintConv => {
+        'Landscape' => 'Paysage',
+        'Night' => 'ScÃšne de nuit',
+      },
+    },
+   'SceneMode' => {
+      Description => 'Modes scÃšne',
+      PrintConv => {
+        '3D Sweep Panorama' => '3D',
+        'Anti Motion Blur' => 'Anti-flou de mvt',
+        'Aperture Priority' => 'PrioritÃ© ouverture',
+        'Auto' => 'Auto.',
+        'Candlelight' => 'Bougie',
+        'Cont. Priority AE' => 'AE prioritÃ© continue',
+        'Handheld Night Shot' => 'Vue de nuit manuelle',
+        'Landscape' => 'Paysage',
+        'Manual' => 'Manuelle',
+        'Night Portrait' => 'Portrait nocturne',
+        'Night Scene' => 'Nocturne',
+        'Night View/Portrait' => 'Vision/portrait nocturne',
+        'Normal' => 'Normale',
+        'Off' => 'DÃ©sactivÃ©',
+        'Shutter Priority' => 'PrioritÃ© vitesse',
+        'Snow' => 'Neige',
+        'Standard' => '',
+        'Sunset' => 'Coucher de soleil',
+        'Super Macro' => 'Super macro',
+        'Sweep Panorama' => 'Panora. par balayage',
+        'Text' => 'Texte',
+      },
+    },
+   'SceneModeUsed' => {
+      PrintConv => {
+        'Aperture Priority' => 'PrioritÃ© ouverture',
+        'Candlelight' => 'Bougie',
+        'Landscape' => 'Paysage',
+        'Manual' => 'Manuelle',
+        'Shutter Priority' => 'PrioritÃ© vitesse',
+        'Snow' => 'Neige',
+        'Sunset' => 'Coucher de soleil',
+        'Text' => 'Texte',
+      },
+    },
+   'SceneSelect' => {
+      PrintConv => {
+        'Night' => 'ScÃšne de nuit',
+        'Off' => 'DÃ©sactivÃ©',
+      },
+    },
+   'SceneType' => {
+      Description => 'Type de scÃšne',
+      PrintConv => {
+        'Directly photographed' => 'Image photographiÃ©e directement',
+      },
+    },
+   'SecurityClassification' => {
+      Description => 'Classement de sÃ©curitÃ©',
+      PrintConv => {
+        'Confidential' => 'Confidentiel',
+        'Restricted' => 'Restreint',
+        'Top Secret' => 'Top secret',
+        'Unclassified' => 'Non classÃ©',
+      },
+    },
+   'SelectableAFPoint' => {
+      Description => 'Collimateurs AF sÃ©lectionnables',
+      PrintConv => {
+        '11 points' => '11 collimateurs',
+        '19 points' => '19 collimateurs',
+        '45 points' => '45 collimateurs',
+        'Inner 9 points' => '9 collimateurs centraux',
+        'Outer 9 points' => '9 collimateurs pÃ©riphÃ©riques',
+      },
+    },
+   'SelfTimer' => {
+      Description => 'Retardateur',
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'SelfTimer2' => 'Retardateur (2)',
+   'SelfTimerMode' => 'Mode auto-timer',
+   'SensingMethod' => {
+      Description => 'MÃ©thode de capture',
+      PrintConv => {
+        'Color sequential area' => 'Capteur couleur sÃ©quentiel',
+        'Color sequential linear' => 'Capteur couleur sÃ©quentiel linÃ©aire',
+        'Monochrome area' => 'Capteur monochrome',
+        'Monochrome linear' => 'Capteur linÃ©aire monochrome',
+        'Not defined' => 'Non dÃ©finie',
+        'One-chip color area' => 'Capteur monochip couleur',
+        'Three-chip color area' => 'Capteur trois chips couleur',
+        'Trilinear' => 'Capteur trilinÃ©aire',
+        'Two-chip color area' => 'Capteur deux chips couleur',
+      },
+    },
+   'SensitivityAdjust' => 'RÃ©glage de sensibilitÃ©',
+   'SensitivitySteps' => {
+      Description => 'Pas de sensibilitÃ©',
+      PrintConv => {
+        '1 EV Steps' => 'Pas de 1 IL',
+        'As EV Steps' => 'Comme pas IL',
+      },
+    },
+   'SensorCleaning' => {
+      PrintConv => {
+        'Disable' => 'DÃ©sactivÃ©',
+        'Enable' => 'ActivÃ©',
+      },
+    },
+   'SensorHeight' => 'Hauteur du capteur',
+   'SensorPixelSize' => 'Taille des pixels du capteur',
+   'SensorWidth' => 'Largeur du capteur',
+   'SequenceNumber' => 'NumÃ©ro de SÃ©quence',
+   'SequentialShot' => {
+      PrintConv => {
+        'None' => 'Aucune',
+      },
+    },
+   'SerialNumber' => 'NumÃ©ro de sÃ©rie',
+   'ServiceIdentifier' => 'Identificateur de service',
+   'SetButtonCrossKeysFunc' => {
+      Description => 'RÃ©glage touche SET/joypad',
+      PrintConv => {
+        'Cross keys: AF point select' => 'Joypad:SÃ©lec. collim. AF',
+        'Normal' => 'Normale',
+        'Set: Flash Exposure Comp' => 'SET:Cor expo flash',
+        'Set: Parameter' => 'SET:Changer de paramÃštres',
+        'Set: Picture Style' => 'SET:Style dâimage',
+        'Set: Playback' => 'SET:Lecture',
+        'Set: Quality' => 'SET:QualitÃ©',
+      },
+    },
+   'SetButtonWhenShooting' => {
+      Description => 'Touche SET au dÃ©clenchement',
+      PrintConv => {
+        'Change parameters' => 'Changer de paramÃštres',
+        'Default (no function)' => 'Normal (dÃ©sactivÃ©e)',
+        'Disabled' => 'DÃ©sactivÃ©e',
+        'Flash exposure compensation' => 'Correction expo flash',
+        'ISO speed' => 'SensibilitÃ© ISO',
+        'Image playback' => 'Lecture de l\'image',
+        'Image quality' => 'Changer de qualitÃ©',
+        'Image size' => 'Taille d\'image',
+        'LCD monitor On/Off' => 'Ãcran LCD On/Off',
+        'Menu display' => 'Affichage du menu',
+        'Normal (disabled)' => 'Normal (dÃ©sactivÃ©e)',
+        'Picture style' => 'Style d\'image',
+        'Quick control screen' => 'Ãcran de contrÃŽle rapide',
+        'Record func. + media/folder' => 'Fonction enregistrement + mÃ©dia/dossier',
+        'Record movie (Live View)' => 'Enr. vidÃ©o (visÃ©e Ã©cran)',
+        'White balance' => 'Balance des blancs',
+      },
+    },
+   'SetFunctionWhenShooting' => {
+      Description => 'Touche SET au dÃ©clenchement',
+      PrintConv => {
+        'Change Parameters' => 'Changer de paramÃštres',
+        'Change Picture Style' => 'Style d\'image',
+        'Change quality' => 'Changer de qualitÃ©',
+        'Default (no function)' => 'Normal (dÃ©sactivÃ©e)',
+        'Image replay' => 'Lecture de l\'image',
+        'Menu display' => 'Affichage du menu',
+      },
+    },
+   'ShadingCompensation' => {
+      Description => 'Compensation de l\'ombrage',
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'ShadingCompensation2' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'ShadowScale' => 'Echelle d\'ombre',
+   'ShakeReduction' => {
+      Description => 'RÃ©duction du bougÃ© (rÃ©glage)',
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'ShakeReductionInfo' => 'Stabilisation',
+   'Sharpness' => {
+      Description => 'Accentuation',
+      PrintConv => {
+        'Hard' => 'Dure',
+        'Med Hard' => 'Assez dure',
+        'Med Soft' => 'Assez douce',
+        'Normal' => 'Normale',
+        'Soft' => 'Douce',
+        'Very Hard' => 'TrÃšs dure',
+        'Very Soft' => 'TrÃšs douce',
+        'n/a' => 'Non Ã©tablie',
+      },
+    },
+   'SharpnessFrequency' => {
+      PrintConv => {
+        'High' => 'Haut',
+        'Highest' => 'Plus haut',
+        'Low' => 'Doux',
+        'n/a' => 'Non Ã©tablie',
+      },
+    },
+   'ShootingMode' => {
+      Description => 'TÃ©lÃ©commande IR',
+      PrintConv => {
+        'Aerial Photo' => 'Photo aÃ©rienne',
+        'Aperture Priority' => 'PrioritÃ© ouverture',
+        'Baby' => 'BÃ©bÃ©',
+        'Beach' => 'Plage',
+        'Candlelight' => 'Eclairage Bougie',
+        'Color Effects' => 'Effets de couleurs',
+        'Fireworks' => 'Feu d\'artifice',
+        'Food' => 'Nourriture',
+        'High Sensitivity' => 'Haute sensibilitÃ©',
+        'High Speed Continuous Shooting' => 'DÃ©clenchement continu Ã  grande vitesse',
+        'Intelligent Auto' => 'Mode Auto intelligent',
+        'Intelligent ISO' => 'ISO Intelligent',
+        'Manual' => 'Manuel',
+        'Movie Preview' => 'PrÃ©visualisation vidÃ©o',
+        'Night Portrait' => 'Portrait de nuit',
+        'Normal' => 'Normale',
+        'Panning' => 'Panoramique',
+        'Panorama Assist' => 'Assistant Panorama',
+        'Party' => 'FÃªte',
+        'Pet' => 'Animal domestique',
+        'Program' => 'Programme',
+        'Scenery' => 'Paysage',
+        'Shutter Priority' => 'PrioritÃ© vitesse',
+        'Snow' => 'Neige',
+        'Soft Skin' => 'Peau douce',
+        'Starry Night' => 'Nuit Ã©toilÃ©e',
+        'Sunset' => 'Coucher de soleil',
+        'Underwater' => 'Subaquatique',
+      },
+    },
+   'ShortDocumentID' => 'ID court de document',
+   'ShortReleaseTimeLag' => {
+      Description => 'Intertie au dÃ©clenchement rÃ©duite',
+      PrintConv => {
+        'Disable' => 'DÃ©sactivÃ©',
+        'Enable' => 'ActivÃ©',
+      },
+    },
+   'ShotInfoVersion' => 'Version des Infos prise de vue',
+   'Shutter-AELock' => {
+      Description => 'DÃ©clencheur/Touche verr. AE',
+      PrintConv => {
+        'AE lock/AF' => 'Verrouillage AE/autofocus',
+        'AE/AF, No AE lock' => 'AE/AF, pas de verrou. AE',
+        'AF/AE lock' => 'Autofocus/verrouillage AE',
+        'AF/AF lock' => 'Autofocus/verrouillage AF',
+        'AF/AF lock, No AE lock' => 'AF/verr.AF, pas de verr.AE',
+      },
+    },
+   'ShutterAELButton' => {
+      Description => 'DÃ©clencheur/Touche verr. AE',
+      PrintConv => {
+        'AE lock/AF' => 'Verrouillage AE/Autofocus',
+        'AE/AF, No AE lock' => 'AE/AF, pad de verrou. AE',
+        'AF/AE lock stop' => 'Autofocus/Verrouillage AE',
+        'AF/AF lock, No AE lock' => 'AF/ver.AF, pad de verr.AE',
+      },
+    },
+   'ShutterButtonAFOnButton' => {
+      Description => 'DÃ©clencheur/Touche AF',
+      PrintConv => {
+        'AE lock/Metering + AF start' => 'MÃ©mo expo/lct. mesure+AF',
+        'Metering + AF start' => 'Mesure + lancement AF',
+        'Metering + AF start/AF stop' => 'Mesure + lancement/arrÃªt AF',
+        'Metering + AF start/disable' => 'Lct. mesure+AF/dÃ©sactivÃ©e',
+        'Metering start/Meter + AF start' => 'Lct. mesure/lct. mesure+AF',
+      },
+    },
+   'ShutterCount' => 'Comptage des dÃ©clenchements',
+   'ShutterCurtainSync' => {
+      Description => 'Synchronisation du rideau',
+      PrintConv => {
+        '1st-curtain sync' => 'Synchronisation premier rideau',
+        '2nd-curtain sync' => 'Synchronisation deuxiÃšme rideau',
+      },
+    },
+   'ShutterMode' => {
+      PrintConv => {
+        'Aperture Priority' => 'PrioritÃ© ouverture',
+      },
+    },
+   'ShutterReleaseButtonAE-L' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'ShutterReleaseNoCFCard' => {
+      Description => 'DÃ©clench. obtur. sans carte',
+      PrintConv => {
+        'No' => 'Non',
+        'Yes' => 'Oui',
+      },
+    },
+   'ShutterSpeed' => 'Temps de pose',
+   'ShutterSpeedRange' => {
+      Description => 'RÃ©gler gamme de vitesses',
+      PrintConv => {
+        'Disable' => 'DÃ©sactivÃ©',
+        'Enable' => 'ActivÃ©e',
+      },
+    },
+   'ShutterSpeedValue' => 'Vitesse d\'obturation',
+   'SidecarForExtension' => 'Extension',
+   'SimilarityIndex' => 'Indice de similaritÃ©',
+   'SlaveFlashMeteringSegments' => 'Segments de mesure flash esclave',
+   'SlideShow' => {
+      PrintConv => {
+        'No' => 'Non',
+        'Yes' => 'Oui',
+      },
+    },
+   'SlowShutter' => {
+      Description => 'Vitesse d\'obturation lente',
+      PrintConv => {
+        'Night Scene' => 'Nocturne',
+        'None' => 'Aucune',
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'SlowSync' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'Software' => 'Logiciel',
+   'SpatialFrequencyResponse' => 'RÃ©ponse spatiale en frÃ©quence',
+   'SpecialEffectsOpticalFilter' => {
+      PrintConv => {
+        'None' => 'Aucune',
+      },
+    },
+   'SpectralSensitivity' => 'SensibilitÃ© spectrale',
+   'SpotMeterLinkToAFPoint' => {
+      Description => 'Mesure spot liÃ©e au collimateur AF',
+      PrintConv => {
+        'Disable (use center AF point)' => 'DÃ©sactivÃ©e (utiliser collimateur AF central)',
+        'Enable (use active AF point)' => 'ActivÃ© (utiliser collimateur AF actif)',
+      },
+    },
+   'SpotMeteringMode' => {
+      PrintConv => {
+        'Center' => 'Centre',
+      },
+    },
+   'State' => 'Etat',
+   'StreamType' => {
+      PrintConv => {
+        'Text' => 'Texte',
+      },
+    },
+   'StripByteCounts' => 'Octets par bande compressÃ©e',
+   'StripOffsets' => 'Emplacement des donnÃ©es image',
+   'Sub-location' => 'Lieu',
+   'SubSecCreateDate' => 'Date de la crÃ©ation des donnÃ©es numÃ©riques',
+   'SubSecDateTimeOriginal' => 'Date de la crÃ©ation des donnÃ©es originales',
+   'SubSecModifyDate' => 'Date de modification de fichier',
+   'SubSecTime' => 'Fractions de seconde de DateTime',
+   'SubSecTimeDigitized' => 'Fractions de seconde de DateTimeDigitized',
+   'SubSecTimeOriginal' => 'Fractions de seconde de DateTimeOriginal',
+   'SubTileBlockSize' => 'Taille de bloc de sous-tuile',
+   'SubfileType' => 'Type du nouveau sous-fichier',
+   'SubimageColor' => {
+      PrintConv => {
+        'RGB' => 'RVB',
+      },
+    },
+   'Subject' => 'Sujet',
+   'SubjectArea' => 'Zone du sujet',
+   'SubjectCode' => 'Code sujet',
+   'SubjectDistance' => 'Distance du sujet',
+   'SubjectDistanceRange' => {
+      Description => 'Intervalle de distance du sujet',
+      PrintConv => {
+        'Close' => 'Vue rapprochÃ©e',
+        'Distant' => 'Vue distante',
+        'Unknown' => 'Inconnu',
+      },
+    },
+   'SubjectLocation' => 'Zone du sujet',
+   'SubjectProgram' => {
+      PrintConv => {
+        'None' => 'Aucune',
+        'Sunset' => 'Coucher de soleil',
+        'Text' => 'Texte',
+      },
+    },
+   'SubjectReference' => 'Code de sujet',
+   'Subsystem' => {
+      PrintConv => {
+        'Unknown' => 'Inconnu',
+      },
+    },
+   'SuperMacro' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+      },
+    },
+   'SuperimposedDisplay' => {
+      Description => 'Affichage superposÃ©',
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'SupplementalCategories' => 'CatÃ©gorie d\'appoint',
+   'SupplementalType' => {
+      Description => 'Type de supplÃ©ment',
+      PrintConv => {
+        'Main Image' => 'Non Ã©tabli',
+        'Rasterized Caption' => 'Titre rastÃ©risÃ©',
+        'Reduced Resolution Image' => 'Image de rÃ©solution rÃ©duite',
+      },
+    },
+   'SvISOSetting' => 'RÃ©glage ISO Sv',
+   'SwitchToRegisteredAFPoint' => {
+      Description => 'Activer collimateur enregistrÃ©',
+      PrintConv => {
+        'Assist' => 'Touche d\'assistance',
+        'Assist + AF' => 'Touche d\'assistance + touche AF',
+        'Disable' => 'DÃ©sactivÃ©',
+        'Enable' => 'ActivÃ©',
+        'Only while pressing assist' => 'Seulement en appuyant touche d\'assistance',
+      },
+    },
+   'T4Options' => 'Bits de remplissage ajoutÃ©s',
+   'T6Options' => 'Options T6',
+   'TTL_DA_ADown' => 'Segment de mesure flash esclave 6',
+   'TTL_DA_AUp' => 'Segment de mesure flash esclave 5',
+   'TTL_DA_BDown' => 'Segment de mesure flash esclave 8',
+   'TTL_DA_BUp' => 'Segment de mesure flash esclave 7',
+   'Tagged' => {
+      PrintConv => {
+        'No' => 'Non',
+        'Yes' => 'Oui',
+      },
+    },
+   'TargetPrinter' => 'Imprimantte cible',
+   'Technology' => {
+      Description => 'Technologie',
+      PrintConv => {
+        'Active Matrix Display' => 'Afficheur Ã  matrice active',
+        'Cathode Ray Tube Display' => 'Afficheur Ã  tube cathodique',
+        'Digital Camera' => 'Appareil photo numÃ©rique',
+        'Dye Sublimation Printer' => 'Imprimante Ã  sublimation thermique',
+        'Electrophotographic Printer' => 'Imprimante Ã©lectrophotographique',
+        'Electrostatic Printer' => 'Imprimante Ã©lectrostatique',
+        'Film Scanner' => 'Scanner de film',
+        'Flexography' => 'Flexographie',
+        'Ink Jet Printer' => 'Imprimante Ã  jet d\'encre',
+        'Offset Lithography' => 'Lithographie offset',
+        'Passive Matrix Display' => 'Afficheur Ã  matrice passive',
+        'Photo CD' => 'CD photo',
+        'Photo Image Setter' => 'Cadre photo',
+        'Photographic Paper Printer' => 'Imprimante Ã  papier photo',
+        'Projection Television' => 'TÃ©lÃ©viseur Ã  projection',
+        'Reflective Scanner' => 'Scanner Ã  rÃ©flexion',
+        'Silkscreen' => 'Ecran de soie',
+        'Thermal Wax Printer' => 'Imprimante thermique Ã  cire',
+        'Video Camera' => 'CamÃ©ra vidÃ©o',
+        'Video Monitor' => 'Moniteur vidÃ©o',
+      },
+    },
+   'Teleconverter' => {
+      PrintConv => {
+        'None' => 'Aucune',
+      },
+    },
+   'Text' => 'Texte',
+   'TextStamp' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'Thresholding' => 'Seuil',
+   'ThumbnailHeight' => 'Hauteur de la vignette',
+   'ThumbnailImage' => 'Vignette',
+   'ThumbnailImageSize' => 'Taille des miniatures',
+   'ThumbnailWidth' => 'Hauteur de la vignette',
+   'TileByteCounts' => 'Nombre d\'octets d\'Ã©lÃ©ment',
+   'TileDepth' => 'Profondeur d\'Ã©lÃ©ment',
+   'TileLength' => 'Longueur d\'Ã©lÃ©ment',
+   'TileOffsets' => 'DÃ©calages d\'Ã©lÃ©ment',
+   'TileWidth' => 'Largeur d\'Ã©lÃ©ment',
+   'Time' => 'Heure',
+   'TimeCreated' => 'Heure de crÃ©ation',
+   'TimeScaleParamsQuality' => {
+      PrintConv => {
+        'Low' => 'Bas',
+      },
+    },
+   'TimeSent' => 'Heure d\'envoi',
+   'TimeSincePowerOn' => 'Temps Ã©coulÃ© depuis la mise en marche',
+   'TimeZoneOffset' => 'Offset de zone de date',
+   'TimerLength' => {
+      Description => 'DurÃ©e du retardateur',
+      PrintConv => {
+        'Disable' => 'DÃ©sactivÃ©',
+        'Enable' => 'ActivÃ©e',
+      },
+    },
+   'Title' => 'Titre',
+   'ToneComp' => 'Correction de tonalitÃ©',
+   'ToneCurve' => {
+      Description => 'Courbe de ton',
+      PrintConv => {
+        'Manual' => 'Manuelle',
+      },
+    },
+   'ToneCurveActive' => {
+      PrintConv => {
+        'No' => 'Non',
+        'Yes' => 'Oui',
+      },
+    },
+   'ToneCurves' => 'Courbes de ton',
+   'ToningEffect' => {
+      Description => 'Virage',
+      PrintConv => {
+        'Blue' => 'Bleu',
+        'Green' => 'Vert',
+        'None' => 'Aucune',
+        'Red' => 'Rouge',
+        'Yellow' => 'Jaune',
+        'n/a' => 'Non Ã©tablie',
+      },
+    },
+   'ToningEffectMonochrome' => {
+      PrintConv => {
+        'Blue' => 'Bleu',
+        'Green' => 'Vert',
+        'None' => 'Aucune',
+      },
+    },
+   'ToningSaturation' => 'Saturation du virage',
+   'TransferFunction' => 'Fonction de transfert',
+   'TransferRange' => 'Intervalle de transfert',
+   'Transformation' => {
+      PrintConv => {
+        'Horizontal (normal)' => '0Â° (haut/gauche)',
+        'Mirror horizontal' => '0Â° (haut/droit)',
+        'Mirror horizontal and rotate 270 CW' => '90Â° sens horaire (gauche/haut)',
+        'Mirror horizontal and rotate 90 CW' => '90Â° sens antihoraire (droit/bas)',
+        'Mirror vertical' => '180Â° (bas/gauche)',
+        'Rotate 180' => '180Â° (bas/droit)',
+        'Rotate 270 CW' => '90Â° sens horaire (gauche/bas)',
+        'Rotate 90 CW' => '90Â° sens antihoraire (droit/haut)',
+      },
+    },
+   'TransmissionReference' => 'RÃ©fÃ©rence transmission',
+   'TransparencyIndicator' => 'Indicateur de transparence',
+   'TrapIndicator' => 'Indicateur de piÃšge',
+   'Trapped' => {
+      Description => 'PiÃ©gÃ©',
+      PrintConv => {
+        'False' => 'Faux',
+        'True' => 'Vrai',
+        'Unknown' => 'Inconnu',
+      },
+    },
+   'TravelDay' => 'Date du Voyage',
+   'TvExposureTimeSetting' => 'RÃ©glage de temps de pose Tv',
+   'URL' => 'URL ',
+   'USMLensElectronicMF' => {
+      Description => 'MF Ã©lectronique Ã  objectif USM',
+      PrintConv => {
+        'Always turned off' => 'Toujours dÃ©brayÃ©',
+        'Disable after one-shot AF' => 'DÃ©sactivÃ©e aprÃšs One-Shot AF',
+        'Disable in AF mode' => 'DÃ©sactivÃ©e en mode AF',
+        'Enable after one-shot AF' => 'ActivÃ©e aprÃšs AF One-Shot',
+        'Turns off after one-shot AF' => 'DÃ©brayÃ© aprÃ©s One-Shot AF',
+        'Turns on after one-shot AF' => 'ActivÃ© aprÃ©s One-Shot AF',
+      },
+    },
+   'Uncompressed' => {
+      Description => 'Non.comprimÃ©',
+      PrintConv => {
+        'No' => 'Non',
+        'Yes' => 'Oui',
+      },
+    },
+   'UniqueCameraModel' => 'Nom unique de modÃšle d\'appareil',
+   'UniqueDocumentID' => 'ID unique de document',
+   'UniqueObjectName' => 'Nom Unique d\'Objet',
+   'Unknown' => 'Inconnu',
+   'Unsharp1Color' => {
+      PrintConv => {
+        'Blue' => 'Bleu',
+        'Green' => 'Vert',
+        'RGB' => 'RVB',
+        'Red' => 'Rouge',
+        'Yellow' => 'Jaune',
+      },
+    },
+   'Unsharp2Color' => {
+      PrintConv => {
+        'Blue' => 'Bleu',
+        'Green' => 'Vert',
+        'RGB' => 'RVB',
+        'Red' => 'Rouge',
+        'Yellow' => 'Jaune',
+      },
+    },
+   'Unsharp3Color' => {
+      PrintConv => {
+        'Blue' => 'Bleu',
+        'Green' => 'Vert',
+        'RGB' => 'RVB',
+        'Red' => 'Rouge',
+        'Yellow' => 'Jaune',
+      },
+    },
+   'Unsharp4Color' => {
+      PrintConv => {
+        'Blue' => 'Bleu',
+        'Green' => 'Vert',
+        'RGB' => 'RVB',
+        'Red' => 'Rouge',
+        'Yellow' => 'Jaune',
+      },
+    },
+   'UnsharpMask' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'Urgency' => {
+      Description => 'Urgence',
+      PrintConv => {
+        '0 (reserved)' => '0 (rÃ©servÃ© pour utilisation future)',
+        '1 (most urgent)' => '1 (trÃšs urgent)',
+        '5 (normal urgency)' => '5 (normalement urgent)',
+        '8 (least urgent)' => '8 (moins urgent)',
+        '9 (user-defined priority)' => '9 (rÃ©servÃ© pour utilisation future)',
+      },
+    },
+   'UsableMeteringModes' => {
+      Description => 'SÃ©lectionner modes de mesure',
+      PrintConv => {
+        'Disable' => 'DÃ©sactivÃ©',
+        'Enable' => 'ActivÃ©e',
+      },
+    },
+   'UsableShootingModes' => {
+      Description => 'SÃ©lectionner modes de prise de vue',
+      PrintConv => {
+        'Disable' => 'DÃ©sactivÃ©',
+        'Enable' => 'ActivÃ©e',
+      },
+    },
+   'UsageTerms' => 'Conditions d\'Utilisation',
+   'UserComment' => 'Commentaire utilisateur',
+   'UserDef1PictureStyle' => {
+      PrintConv => {
+        'Landscape' => 'Paysage',
+      },
+    },
+   'UserDef2PictureStyle' => {
+      PrintConv => {
+        'Landscape' => 'Paysage',
+      },
+    },
+   'UserDef3PictureStyle' => {
+      PrintConv => {
+        'Landscape' => 'Paysage',
+      },
+    },
+   'VRDVersion' => 'Version VRD',
+   'VRInfo' => 'Information stabilisateur',
+   'VRInfoVersion' => 'Info Version VR',
+   'VR_0x66' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+      },
+    },
+   'VariProgram' => 'Variprogramme',
+   'VibrationReduction' => {
+      Description => 'Reduction des vibrations',
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+        'n/a' => 'Non Ã©tablie',
+      },
+    },
+   'VideoCardGamma' => 'Gamma de la carte vidÃ©o',
+   'ViewInfoDuringExposure' => {
+      Description => 'Infos viseur pendant exposition',
+      PrintConv => {
+        'Disable' => 'DÃ©sactivÃ©',
+        'Enable' => 'ActivÃ©',
+      },
+    },
+   'ViewfinderWarning' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'ViewingCondDesc' => 'Description des conditions de visionnage',
+   'ViewingCondIlluminant' => 'Illuminant des conditions de visionnage',
+   'ViewingCondIlluminantType' => 'Type d\'illuminant des conditions de visionnage',
+   'ViewingCondSurround' => 'Environnement des conditions de visionnage',
+   'VignetteControl' => {
+      Description => 'Controle du vignettage',
+      PrintConv => {
+        'High' => 'Haut',
+        'Low' => 'Bas',
+        'Normal' => 'Normale',
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'VoiceMemo' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'WBAdjLighting' => {
+      PrintConv => {
+        'Daylight' => 'LumiÃšre du jour',
+        'None' => 'Aucune',
+      },
+    },
+   'WBAdjustAB' => 'Ajustement Balance des Blancs bleu/jaune',
+   'WBAdjustGM' => 'Ajustement Balance des Blancs vert/magenta',
+   'WBBlueLevel' => 'Niveau Bleu Balance des Blancs',
+   'WBBracketMode' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+      },
+    },
+   'WBFineTuneActive' => {
+      PrintConv => {
+        'No' => 'Non',
+        'Yes' => 'Oui',
+      },
+    },
+   'WBGreenLevel' => 'Niveau Vert Balance des Blancs',
+   'WBMediaImageSizeSetting' => {
+      Description => 'RÃ©glage de balance des blancs + taille d\'image',
+      PrintConv => {
+        'LCD monitor' => 'Ãcran LCD',
+        'Rear LCD panel' => 'Panneau LCD arriÃšr',
+      },
+    },
+   'WBRedLevel' => 'Niveau Rouge Balance des Blancs',
+   'WBShiftAB' => 'DÃ©calage bal. blancs ambre-bleu',
+   'WBShiftGM' => 'DÃ©calage bal. blancs vert-magenta',
+   'WBShiftMG' => 'DÃ©calage bal. blancs magenta-vert',
+   'WB_GBRGLevels' => 'Niveaux BB VBRV',
+   'WB_GRBGLevels' => 'Niveaux BB VRBV',
+   'WB_GRGBLevels' => 'Niveaux BB VRVB',
+   'WB_RBGGLevels' => 'Niveaux BB RBVV',
+   'WB_RBLevels' => 'Niveaux BB RB',
+   'WB_RBLevels3000K' => 'Niveaux BB RB 3000K',
+   'WB_RBLevels3300K' => 'Niveaux BB RB 3300K',
+   'WB_RBLevels3600K' => 'Niveaux BB RB 3600K',
+   'WB_RBLevels3900K' => 'Niveaux BB RB 3800K',
+   'WB_RBLevels4000K' => 'Niveaux BB RB 4000K',
+   'WB_RBLevels4300K' => 'Niveaux BB RB 4300K',
+   'WB_RBLevels4500K' => 'Niveaux BB RB 4500K',
+   'WB_RBLevels4800K' => 'Niveaux BB RB 4800K',
+   'WB_RBLevels5300K' => 'Niveaux BB RB 5300K',
+   'WB_RBLevels6000K' => 'Niveaux BB RB 6000K',
+   'WB_RBLevels6600K' => 'Niveaux BB RB 6600K',
+   'WB_RBLevels7500K' => 'Niveaux BB RB 7500K',
+   'WB_RBLevelsCloudy' => 'Niveaux BB RB nuageux',
+   'WB_RBLevelsShade' => 'Niveaux BB RB ombre',
+   'WB_RBLevelsTungsten' => 'Niveaux BB RB tungstÃšne',
+   'WB_RGBGLevels' => 'Niveaux BB RVBV',
+   'WB_RGBLevels' => 'Niveaux BB RVB',
+   'WB_RGBLevelsCloudy' => 'Niveaux BB RVB nuageux',
+   'WB_RGBLevelsDaylight' => 'Niveaux BB RVB lumiÃšre jour',
+   'WB_RGBLevelsFlash' => 'Niveaux BB RVB flash',
+   'WB_RGBLevelsFluorescent' => 'Niveaux BB RVB fluorescent',
+   'WB_RGBLevelsShade' => 'Niveaux BB RVB ombre',
+   'WB_RGBLevelsTungsten' => 'Niveaux BB RVB tungstÃšne',
+   'WB_RGGBLevels' => 'Niveaux BB RVVB',
+   'WB_RGGBLevelsCloudy' => 'Niveaux BB RVVB nuageux',
+   'WB_RGGBLevelsDaylight' => 'Niveaux BB RVVB lumiÃšre jour',
+   'WB_RGGBLevelsFlash' => 'Niveaux BB RVVB flash',
+   'WB_RGGBLevelsFluorescent' => 'Niveaux BB RVVB fluorescent',
+   'WB_RGGBLevelsFluorescentD' => 'Niveaux BB RVVB fluorescent',
+   'WB_RGGBLevelsFluorescentN' => 'Niveaux BB RVVB fluo N',
+   'WB_RGGBLevelsFluorescentW' => 'Niveaux BB RVVB fluoÂ W',
+   'WB_RGGBLevelsShade' => 'Niveaux BB RVVB ombre',
+   'WB_RGGBLevelsTungsten' => 'Niveaux BB RVVB tungstÃšne',
+   'WCSProfiles' => 'Profil Windows Color System',
+   'Warning' => 'Attention',
+   'WebStatement' => 'RelevÃ© Web',
+   'WhiteBalance' => {
+      Description => 'Balance des blancs',
+      PrintConv => {
+        'Auto' => 'Equilibrage des blancs automatique',
+        'Black & White' => 'Monochrome',
+        'Cloudy' => 'Temps nuageux',
+        'Color Temperature/Color Filter' => 'Temp.Couleur / Filtre couleur',
+        'Cool White Fluorescent' => 'Fluorescente type soft',
+        'Custom' => 'PersonnalisÃ©e',
+        'Custom 1' => 'PersonnalisÃ©e 1',
+        'Custom 2' => 'PersonnalisÃ©e 2',
+        'Custom 3' => 'PersonnalisÃ©e 3',
+        'Custom 4' => 'PersonnalisÃ©e 4',
+        'Day White Fluorescent' => 'Fluorescente type blanc',
+        'Daylight' => 'LumiÃšre du jour',
+        'Daylight Fluorescent' => 'Fluorescente type jour',
+        'Fluorescent' => 'Fluorescente',
+        'Manual' => 'Manuelle',
+        'Manual Temperature (Kelvin)' => 'TempÃ©rature de couleur (Kelvin)',
+        'Shade' => 'Ombre',
+        'Tungsten' => 'TungstÃšne (lumiÃšre incandescente)',
+        'Unknown' => 'Inconnu',
+        'User-Selected' => 'SÃ©lectionnÃ©e par l\'utilisateur',
+        'Warm White Fluorescent' => 'Fluorescent blanc chaud',
+        'White Fluorescent' => 'Fluorescent blanc',
+      },
+    },
+   'WhiteBalanceAdj' => {
+      PrintConv => {
+        'Cloudy' => 'Temps nuageux',
+        'Daylight' => 'LumiÃšre du jour',
+        'Fluorescent' => 'Fluorescente',
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+        'Shade' => 'Ombre',
+        'Tungsten' => 'TungstÃšne (lumiÃšre incandescente)',
+      },
+    },
+   'WhiteBalanceBias' => 'DÃ©calage de Balance des blancs',
+   'WhiteBalanceFineTune' => 'Balance des blancs - RÃ©glage fin',
+   'WhiteBalanceMode' => {
+      Description => 'Mode de balance des blancs',
+      PrintConv => {
+        'Auto (Cloudy)' => 'Auto (nuageux)',
+        'Auto (Day White Fluorescent)' => 'Auto (fluo jour)',
+        'Auto (Daylight Fluorescent)' => 'Auto (fluo lum. jour)',
+        'Auto (Daylight)' => 'Auto (lumiÃšre du jour)',
+        'Auto (Flash)' => 'Auto (flash)',
+        'Auto (Shade)' => 'Auto (ombre)',
+        'Auto (Tungsten)' => 'Auto (tungstÃšne)',
+        'Auto (White Fluorescent)' => 'Auto (fluo blanc)',
+        'Unknown' => 'Inconnu',
+        'User-Selected' => 'SÃ©lectionnÃ©e par l\'utilisateur',
+      },
+    },
+   'WhiteBalanceSet' => {
+      Description => 'RÃ©glage de balance des blancs',
+      PrintConv => {
+        'Cloudy' => 'Temps nuageux',
+        'Day White Fluorescent' => 'Fluorescent blanc jour',
+        'Daylight' => 'LumiÃšre du jour',
+        'Daylight Fluorescent' => 'Fluorescente type jour',
+        'Manual' => 'Manuelle',
+        'Set Color Temperature 1' => 'TempÃ©rature de couleur dÃ©finie 1',
+        'Set Color Temperature 2' => 'TempÃ©rature de couleur dÃ©finie 2',
+        'Set Color Temperature 3' => 'TempÃ©rature de couleur dÃ©finie 3',
+        'Shade' => 'Ombre',
+        'Tungsten' => 'TungstÃšne (lumiÃšre incandescente)',
+        'White Fluorescent' => 'Fluorescent blanc',
+      },
+    },
+   'WhiteLevel' => 'Niveau blanc',
+   'WhitePoint' => 'ChromaticitÃ© du point blanc',
+   'WideRange' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+   'WorldTime' => 'Fuseau horaire',
+   'WorldTimeLocation' => {
+      Description => 'Position en temps mondial',
+      PrintConv => {
+        'Home' => 'DÃ©part',
+        'Hometown' => 'RÃ©sidence',
+      },
+    },
+   'Writer-Editor' => 'Auteur de la lÃ©gende / description',
+   'XClipPathUnits' => 'UnitÃ©s de chemin de rognage en X',
+   'XMP' => 'MÃ©tadonnÃ©es XMP',
+   'XPAuthor' => 'Auteur',
+   'XPComment' => 'Commentaire',
+   'XPKeywords' => 'Mots clÃ©',
+   'XPSubject' => 'Sujet',
+   'XPTitle' => 'Titre',
+   'XPosition' => 'Position en X',
+   'XResolution' => 'RÃ©solution d\'image horizontale',
+   'YCbCrCoefficients' => 'Coefficients de la matrice de transformation de l\'espace de couleurs',
+   'YCbCrPositioning' => {
+      Description => 'Positionnement Y et C',
+      PrintConv => {
+        'Centered' => 'CentrÃ©',
+        'Co-sited' => 'CÃŽte Ã  cÃŽte',
+      },
+    },
+   'YCbCrSubSampling' => 'Rapport de sous-Ã©chantillonnage Y Ã  C',
+   'YClipPathUnits' => 'UnitÃ©s de chemin de rognage en Y',
+   'YPosition' => 'Position en Y',
+   'YResolution' => 'RÃ©solution d\'image verticale',
+   'Year' => 'AnnÃ©e',
+   'ZoneMatching' => {
+      Description => 'Ajustage de la zone',
+      PrintConv => {
+        'High Key' => 'Hi',
+        'ISO Setting Used' => 'DÃ©sactivÃ©e',
+        'Low Key' => 'Lo',
+      },
+    },
+   'ZoneMatchingOn' => {
+      PrintConv => {
+        'Off' => 'DÃ©sactivÃ©',
+        'On' => 'ActivÃ©',
+      },
+    },
+);
+
+1;  # end
+
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Lang::fr.pm - ExifTool French language translations
+
+=head1 DESCRIPTION
+
+This file is used by Image::ExifTool to generate localized tag descriptions
+and values.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Jens Duttke, Bernard Guillotin, Jean Glasser, Jean Piquemal and
+Harry Nizard for providing this translation.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool(3pm)|Image::ExifTool>,
+L<Image::ExifTool::TagInfoXML(3pm)|Image::ExifTool::TagInfoXML>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/it.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/it.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/it.pm	(revision 24799)
@@ -0,0 +1,2193 @@
+#------------------------------------------------------------------------------
+# File:         it.pm
+#
+# Description:  ExifTool Italian language translations
+#
+# Notes:        This file generated automatically by Image::ExifTool::TagInfoXML
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Lang::it;
+
+use strict;
+use vars qw($VERSION);
+
+$VERSION = '1.07';
+
+%Image::ExifTool::Lang::it::Translate = (
+   'AEMeteringMode' => {
+      PrintConv => {
+        'Multi-segment' => 'Multi zona',
+      },
+    },
+   'AEProgramMode' => {
+      PrintConv => {
+        'Landscape' => 'Orizzontale',
+        'Portrait' => 'Verticale',
+      },
+    },
+   'AFAperture' => 'Diaframma AF',
+   'AFAreaMode' => {
+      Description => 'Modo AF',
+      PrintConv => {
+        'Dynamic Area' => 'Area Dinamica',
+        'Dynamic Area (closest subject)' => 'Area Dinamica piÃ¹ Vicina al Soggetto',
+        'Group Dynamic' => 'Gruppo Dinamico',
+        'Single Area' => 'Area Singola',
+      },
+    },
+   'AFInfo' => 'Modo AF',
+   'AFMicroAdjActive' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'AFPoint' => {
+      Description => 'Punto AF',
+      PrintConv => {
+        'Bottom' => 'Basso',
+        'Center' => 'Centro',
+        'Far Left' => 'Tutto a Sinistra',
+        'Far Right' => 'Tutto a Destra',
+        'Left' => 'Sinistra',
+        'Lower-left' => 'Inferiore Sinistro',
+        'Lower-right' => 'Inferiore Destro',
+        'Mid-left' => 'Sinistra',
+        'Mid-right' => 'Destra',
+        'None' => 'Nessuno',
+        'Right' => 'Destra',
+        'Top' => 'Alto',
+        'Upper-left' => 'Superiore Sinistro',
+        'Upper-right' => 'Superiore Destro',
+      },
+    },
+   'AFPointBrightness' => {
+      PrintConv => {
+        'Normal' => 'Normale',
+      },
+    },
+   'AFPointRegistration' => {
+      PrintConv => {
+        'Bottom' => 'Basso',
+        'Center' => 'Centro',
+        'Extreme Left' => 'Tutto a Sinistra',
+        'Extreme Right' => 'Tutto a Destra',
+        'Left' => 'Sinistra',
+        'Right' => 'Destra',
+        'Top' => 'Alto',
+      },
+    },
+   'AFPointSelected' => {
+      PrintConv => {
+        'Bottom' => 'Basso',
+        'Center' => 'Centro',
+        'Left' => 'Sinistra',
+        'Right' => 'Destra',
+        'Top' => 'Alto',
+      },
+    },
+   'AFPointSelectionMethod' => {
+      PrintConv => {
+        'Normal' => 'Normale',
+      },
+    },
+   'AFPointsInFocus' => {
+      Description => 'Punti a Fuoco',
+      PrintConv => {
+        'Bottom' => 'Basso',
+        'Center' => 'Centro',
+        'Far Left' => 'Tutto a Sinistra',
+        'Far Right' => 'Tutto a Destra',
+        'Left' => 'Sinistra',
+        'Lower-left' => 'Inferiore Sinistro',
+        'Lower-right' => 'Inferiore Destro',
+        'None' => 'Nessuno',
+        'Right' => 'Destra',
+        'Top' => 'Alto',
+        'Upper-left' => 'Superiore Sinistro',
+        'Upper-right' => 'Superiore Destro',
+      },
+    },
+   'AFPointsUsed' => {
+      PrintConv => {
+        'Bottom' => 'Basso',
+        'Center' => 'Centro',
+        'Far Left' => 'Tutto a Sinistra',
+        'Far Right' => 'Tutto a Destra',
+        'Lower-left' => 'Inferiore Sinistro',
+        'Lower-right' => 'Inferiore Destro',
+        'Top' => 'Alto',
+        'Upper-left' => 'Superiore Sinistro',
+        'Upper-right' => 'Superiore Destro',
+      },
+    },
+   'APEVersion' => 'Versione APE',
+   'ARMIdentifier' => 'ID ARM',
+   'ARMVersion' => 'Versione ARM',
+   'ActionAdvised' => {
+      Description => 'Azione consigliata',
+      PrintConv => {
+        'Object Kill' => 'Distruzione oggetto',
+        'Object Reference' => 'Riferimento oggetto',
+        'Object Replace' => 'Sostituzione oggetto',
+        'Ojbect Append' => 'Allega oggetto',
+      },
+    },
+   'ActiveArea' => 'Area Attiva',
+   'ActiveD-Lighting' => {
+      PrintConv => {
+        'Low' => 'Leggero',
+        'Normal' => 'Normale',
+      },
+    },
+   'ActiveD-LightingMode' => {
+      PrintConv => {
+        'Low' => 'Leggero',
+        'Normal' => 'Normale',
+      },
+    },
+   'AdultContentWarning' => {
+      PrintConv => {
+        'Unknown' => 'Sconosciuta',
+      },
+    },
+   'AnalogBalance' => 'Bilanciamento analogico',
+   'Aperture' => 'Diaframma',
+   'ApertureValue' => 'Diaframma',
+   'ApplicationRecordVersion' => 'Versione Registrazione Applicazione',
+   'Artist' => 'Persona che ha creato l\'immagine',
+   'AsShotNeutral' => 'Neutrale Come Scattato',
+   'AsShotProfileName' => 'Nome Profilo Come Scattato',
+   'AsShotWhiteXY' => 'Bilanciamento Bianco X-T Come Scattato',
+   'AssistButtonFunction' => {
+      PrintConv => {
+        'Normal' => 'Normale',
+      },
+    },
+   'Audio' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'AudioType' => 'Tipo Audio',
+   'Author' => 'Autore',
+   'AuthorsPosition' => 'Posizione dell\'autore',
+   'AutoLightingOptimizer' => {
+      PrintConv => {
+        'Low' => 'Leggero',
+      },
+    },
+   'AutoLightingOptimizerOn' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'AutoRotate' => {
+      PrintConv => {
+        'None' => 'Nessuno',
+        'Rotate 180' => '180Â° (basso/destra)',
+        'Rotate 270 CW' => 'Ruota di 270Â° in senso orario',
+        'Rotate 90 CW' => '90Â° senso antiorario (destra/alto)',
+        'n/a' => 'Sconosciuta',
+      },
+    },
+   'AuxiliaryLens' => 'Obiettivo Ausiliario',
+   'BackgroundTiling' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'BannerImageType' => {
+      PrintConv => {
+        'None' => 'Nessuno',
+      },
+    },
+   'BatteryLevel' => 'Livello Batteria',
+   'BestQualityScale' => 'Scala QualitÃ  Migliore',
+   'BitsPerComponent' => 'Bits per componente',
+   'BitsPerSample' => 'Numero di bits per componente',
+   'BlackLevel' => 'Livello Nero',
+   'BlueMatrixColumn' => 'Colonna della Matrice Blu',
+   'BlueTRC' => 'Curva Riproduzione Tono Blu',
+   'BlurWarning' => {
+      PrintConv => {
+        'None' => 'Nessuno',
+      },
+    },
+   'Brightness' => 'LuminositÃ ',
+   'BrightnessValue' => 'LuminositÃ ',
+   'By-line' => 'Creatore',
+   'By-lineTitle' => 'Titolo Creatore',
+   'CFAPattern' => 'Pattern CFA',
+   'CPUType' => {
+      PrintConv => {
+        'None' => 'Nessuno',
+      },
+    },
+   'CalibrationDateTime' => 'Data e Ora della Calibrazione',
+   'CalibrationIlluminant1' => {
+      PrintConv => {
+        'Cloudy' => 'Nuvoloso',
+        'Cool White Fluorescent' => 'Fluorescente a luce calda',
+        'Day White Fluorescent' => 'Fluorescente a luce del giorno bianca',
+        'Daylight' => 'Luce del giorno',
+        'Daylight Fluorescent' => 'Fluorescente a luce del giorno',
+        'Fine Weather' => 'Bel tempo',
+        'Fluorescent' => 'Fluorescente',
+        'ISO Studio Tungsten' => 'Tungsteno studio ISO',
+        'Other' => 'Altra Sorgente di Luce',
+        'Shade' => 'Ombrato',
+        'Standard Light A' => 'Luce standard A',
+        'Standard Light B' => 'Luce standard B',
+        'Standard Light C' => 'Luce standard C',
+        'Tungsten (Incandescent)' => 'Tungsteno (luce incandescente)',
+        'Unknown' => 'Sconosciuta',
+        'Warm White Fluorescent' => 'Luce fluorescente bianca calda',
+        'White Fluorescent' => 'Fluorescente bianca',
+      },
+    },
+   'CalibrationIlluminant2' => {
+      PrintConv => {
+        'Cloudy' => 'Nuvoloso',
+        'Cool White Fluorescent' => 'Fluorescente a luce calda',
+        'Day White Fluorescent' => 'Fluorescente a luce del giorno bianca',
+        'Daylight' => 'Luce del giorno',
+        'Daylight Fluorescent' => 'Fluorescente a luce del giorno',
+        'Fine Weather' => 'Bel tempo',
+        'Fluorescent' => 'Fluorescente',
+        'ISO Studio Tungsten' => 'Tungsteno studio ISO',
+        'Other' => 'Altra Sorgente di Luce',
+        'Shade' => 'Ombrato',
+        'Standard Light A' => 'Luce standard A',
+        'Standard Light B' => 'Luce standard B',
+        'Standard Light C' => 'Luce standard C',
+        'Tungsten (Incandescent)' => 'Tungsteno (luce incandescente)',
+        'Unknown' => 'Sconosciuta',
+        'Warm White Fluorescent' => 'Luce fluorescente bianca calda',
+        'White Fluorescent' => 'Fluorescente bianca',
+      },
+    },
+   'CameraCalibration1' => 'Calibrazione Fotocamera 1',
+   'CameraCalibration2' => 'Calibrazione Fotocamera 2',
+   'CameraOrientation' => {
+      Description => 'Orientamento dell\'immagine',
+      PrintConv => {
+        'Horizontal (normal)' => '0Â° (alto/sinistra)',
+        'Rotate 270 CW' => 'Ruota di 270Â° in senso orario',
+        'Rotate 90 CW' => '90Â° senso antiorario (destra/alto)',
+      },
+    },
+   'CanonExposureMode' => {
+      PrintConv => {
+        'Aperture-priority AE' => 'PrioritÃ  diaframma',
+        'Manual' => 'Manuale',
+        'Shutter speed priority AE' => 'PrioritÃ  otturatore',
+      },
+    },
+   'Caption-Abstract' => 'Didascalia/Descrizione',
+   'CaptionWriter' => 'Autore della didascalia',
+   'Categories' => 'Categorie',
+   'Category' => 'Categoria',
+   'CenterWeightedAreaSize' => {
+      PrintConv => {
+        'Average' => 'Media',
+      },
+    },
+   'CharacterSet' => 'Impostazioni Carattere',
+   'ChromaticAdaptation' => 'Adattamento Cromatico',
+   'Chromaticity' => 'Cromatismo',
+   'ChrominanceNR_TIFF_JPEG' => {
+      PrintConv => {
+        'Low' => 'Leggero',
+      },
+    },
+   'ChrominanceNoiseReduction' => {
+      PrintConv => {
+        'Low' => 'Leggero',
+      },
+    },
+   'City' => 'CittÃ ',
+   'ClassifyState' => 'Stato di Classificazione',
+   'CodedCharacterSet' => 'Impostazione Caratteri Codificati',
+   'ColorBalance' => 'Bilanciamento Colore',
+   'ColorEffect' => {
+      PrintConv => {
+        'Sepia' => 'Viraggio seppia',
+      },
+    },
+   'ColorFilter' => {
+      Description => 'Filtro colori',
+      PrintConv => {
+        'Green' => 'Verde',
+        'Red' => 'Rosso',
+        'Yellow' => 'Giallo',
+      },
+    },
+   'ColorHue' => 'Colore Hue',
+   'ColorMatrix1' => 'Matrice di Colore 1',
+   'ColorMatrix2' => 'Matrice di Colore 2',
+   'ColorMode' => {
+      Description => 'Modo Colore',
+      PrintConv => {
+        'Autumn Leaves' => 'Foglie d\'autunno',
+        'B&W' => 'B/N',
+        'Clear' => 'Trasparente',
+        'Deep' => 'Cupa',
+        'Evening' => 'Sera',
+        'Landscape' => 'Orizzontale',
+        'Light' => 'Chiara',
+        'Neutral' => 'Neutra',
+        'Night View' => 'Visione notturna',
+        'Night View/Portrait' => 'Rit. notturno',
+        'Normal' => 'Normale',
+        'Portrait' => 'Verticale',
+        'Sunset' => 'Tramonto',
+        'Vivid' => 'Vivace',
+      },
+    },
+   'ColorMoireReductionMode' => {
+      PrintConv => {
+        'Low' => 'Leggero',
+      },
+    },
+   'ColorPalette' => 'Palette di Colore',
+   'ColorRepresentation' => 'Rappresentazione del Colore',
+   'ColorSpace' => {
+      Description => 'Spazio colore',
+      PrintConv => {
+        'ICC Profile' => 'Profilo ICC',
+        'Uncalibrated' => 'Non calibrato',
+      },
+    },
+   'ColorSpaceData' => 'Dati Spazio Colore',
+   'ColorTemperature' => 'Temperatura colore',
+   'ColorTone' => {
+      PrintConv => {
+        'Normal' => 'Normale',
+      },
+    },
+   'ColorimetricReference' => 'Riferimento Colorimetrico',
+   'CommandDialsReverseRotation' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'CommanderGroupAMode' => {
+      PrintConv => {
+        'Auto Aperture' => 'Diaframma automatico',
+        'Manual' => 'Manuale',
+      },
+    },
+   'CommanderGroupBMode' => {
+      PrintConv => {
+        'Auto Aperture' => 'Diaframma automatico',
+        'Manual' => 'Manuale',
+      },
+    },
+   'CommanderInternalFlash' => {
+      PrintConv => {
+        'Manual' => 'Manuale',
+      },
+    },
+   'Comment' => 'Commento',
+   'Compilation' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'ComponentsConfiguration' => 'Significato di ogni componente',
+   'CompressedBitsPerPixel' => 'Modo compressione immagine',
+   'Compression' => {
+      Description => 'Schema compressione',
+      PrintConv => {
+        'JPEG' => 'Compressione JPEG',
+        'JPEG (old-style)' => 'JPEG (vecchio stile)',
+        'Kodak DCR Compressed' => 'Kodak DCR Compresso',
+        'Kodak KDC Compressed' => 'Kodak KDC Compresso',
+        'Next' => 'Codifica NeXT 2 bits',
+        'Nikon NEF Compressed' => 'Nikon NEF Compresso',
+        'None' => 'Nessuno',
+        'Pentax PEF Compressed' => 'Pentax PEF Compresso',
+        'Sony ARW Compressed' => 'Sony ARW Compresso',
+        'Uncompressed' => 'Non compresso',
+      },
+    },
+   'CompressionType' => {
+      PrintConv => {
+        'None' => 'Nessuno',
+      },
+    },
+   'ConditionalFEC' => 'Compensazione Esposizione Flash',
+   'Contact' => 'Contatto',
+   'ContentLocationCode' => 'Codice ubicazione contenuto',
+   'ContentLocationName' => 'Nome Ubicazione Contenuto',
+   'Contrast' => {
+      Description => 'Contrasto',
+      PrintConv => {
+        'High' => 'Pesante',
+        'Low' => 'Leggero',
+        'Normal' => 'Normale',
+      },
+    },
+   'ContrastCurve' => 'Curva Contrasto',
+   'Copyright' => 'Titolare del copyright',
+   'CopyrightNotice' => 'Info Copyright',
+   'CopyrightStatus' => {
+      PrintConv => {
+        'Unknown' => 'Sconosciuta',
+      },
+    },
+   'Country' => 'Paese',
+   'Country-PrimaryLocationCode' => 'Codice ISO Nazione',
+   'Country-PrimaryLocationName' => 'Nazione',
+   'CreateDate' => 'Data e ora di creazione dei dati digitali',
+   'CreationDate' => 'Data di creazione',
+   'Creator' => 'Creatore',
+   'CreatorAddress' => 'Autore - Indirizzo',
+   'CreatorCity' => 'Autore - CittÃ ',
+   'CreatorCountry' => 'Autore - Nazione',
+   'CreatorPostalCode' => 'Autore - Codice Postale',
+   'CreatorRegion' => 'Autore - Stato/Provincia',
+   'CreatorWorkEmail' => 'Autore - E.Mail',
+   'CreatorWorkTelephone' => 'Autore - Numero di Telefono',
+   'CreatorWorkURL' => 'Autore - Sito web',
+   'Credit' => 'Fornitore',
+   'CropActive' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'CropUnit' => {
+      PrintConv => {
+        'inches' => 'Pollici',
+      },
+    },
+   'CropUnits' => {
+      PrintConv => {
+        'inches' => 'Pollici',
+      },
+    },
+   'CustomRendered' => {
+      Description => 'Processo immagine personale',
+      PrintConv => {
+        'Custom' => 'Processo personale',
+        'Normal' => 'Processo normale',
+      },
+    },
+   'D-LightingHQSelected' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'DNGBackwardVersion' => 'Versione Precedente DNG',
+   'DNGVersion' => 'Versione DNG',
+   'DataImprint' => {
+      PrintConv => {
+        'None' => 'Nessuno',
+      },
+    },
+   'DataType' => 'Tipo Dati',
+   'DateCreated' => 'Data di Creazione',
+   'DateDisplayFormat' => {
+      Description => 'Formato Data',
+      PrintConv => {
+        'D/M/Y' => 'Giorno/mese/anno',
+        'M/D/Y' => 'Mese/giorno/anno',
+        'Y/M/D' => 'Anno/mese/giorno',
+      },
+    },
+   'DateSent' => 'Data d\'invio',
+   'DateTime' => 'Data e ora di modifica del file',
+   'DateTimeOriginal' => 'Data e ora di creazione dei dati originali',
+   'DaylightSavings' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'DefaultScale' => 'Scala predefinita',
+   'DeletedImageCount' => 'Conteggio Immagini Cancellate',
+   'Description' => 'Descrizione',
+   'Destination' => 'Destinazione',
+   'DestinationDST' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'DeviceAttributes' => 'Attributi Dispositivo',
+   'DeviceManufacturer' => 'Costruttore Dispositivo',
+   'DeviceMfgDesc' => 'Descrizione del Costruttore Dispositivo',
+   'DeviceModel' => 'Modello Dispositivo',
+   'DeviceModelDesc' => 'Descrizione Modello Dispositivo',
+   'DeviceSettingDescription' => 'Descrizione impostazioni dispositivo',
+   'DialDirectionTvAv' => {
+      PrintConv => {
+        'Normal' => 'Normale',
+      },
+    },
+   'DigitalCreationDate' => 'Data di Creazione Digitale',
+   'DigitalCreationTime' => 'Ora di Creazione Digitale',
+   'DigitalZoom' => {
+      Description => 'Zoom Digitale',
+      PrintConv => {
+        'None' => 'Nessuno',
+      },
+    },
+   'DigitalZoomRatio' => 'Rapporto zoom digitale',
+   'Directory' => 'Posizione file',
+   'DisplaySize' => {
+      PrintConv => {
+        'Normal' => 'Normale',
+      },
+    },
+   'DisplayUnits' => {
+      PrintConv => {
+        'inches' => 'Pollici',
+      },
+    },
+   'DisplayedUnitsX' => {
+      PrintConv => {
+        'inches' => 'Pollici',
+      },
+    },
+   'DisplayedUnitsY' => {
+      PrintConv => {
+        'inches' => 'Pollici',
+      },
+    },
+   'DjVuVersion' => 'Versione DjVu',
+   'DocumentHistory' => 'Cronologia Documento',
+   'DocumentName' => 'Nome Documento',
+   'DocumentNotes' => 'Note del Documento',
+   'DriveMode' => 'ModalitÃ  esecuzione',
+   'DynamicRangeOptimizer' => {
+      Description => 'Ott.gamma din.',
+      PrintConv => {
+        'Advanced Auto' => 'Avanz.autom.',
+        'Advanced Lv1' => 'Liv.Avanzato 1',
+        'Advanced Lv2' => 'Liv.Avanzato 2',
+        'Advanced Lv3' => 'Liv.Avanzato 3',
+        'Advanced Lv4' => 'Liv.Avanzato 4',
+        'Advanced Lv5' => 'Liv.Avanzato 5',
+        'Auto' => 'Automatico',
+        'Off' => 'Disattivata',
+      },
+    },
+   'ETTLII' => {
+      PrintConv => {
+        'Average' => 'Media',
+      },
+    },
+   'EasyMode' => {
+      PrintConv => {
+        'Landscape' => 'Orizzontale',
+        'Manual' => 'Manuale',
+        'Night' => 'Scena notturna',
+        'Portrait' => 'Verticale',
+      },
+    },
+   'EditStatus' => 'Modifica Stato',
+   'EditorialUpdate' => {
+      Description => 'Aggiornamento Editoriale',
+      PrintConv => {
+        'Additional language' => 'Linguaggio addizionale',
+      },
+    },
+   'EffectiveMaxAperture' => 'Diaframma Massimo Effettivo',
+   'Emphasis' => {
+      PrintConv => {
+        'None' => 'Nessuno',
+      },
+    },
+   'Enhancement' => {
+      PrintConv => {
+        'Green' => 'Verde',
+        'Red' => 'Rosso',
+      },
+    },
+   'EnvelopePriority' => {
+      PrintConv => {
+        '0 (reserved)' => '0 (riservato per usi futuri)',
+        '1 (most urgent)' => '1 (molto urgente)',
+        '5 (normal urgency)' => '5 (urgenza normale)',
+        '8 (least urgent)' => '8 (meno urgente)',
+        '9 (user-defined priority)' => '9 (prioritÃ  definita dall\'utente)',
+      },
+    },
+   'ExcursionTolerance' => {
+      PrintConv => {
+        'Allowed' => 'Possibile',
+        'Not Allowed' => 'Non permesso (predefinito)',
+      },
+    },
+   'ExifCameraInfo' => 'Info Exif Fotocamera',
+   'ExifImageHeight' => 'Altezza immagine',
+   'ExifImageWidth' => 'Larghezza immagine',
+   'ExifOffset' => 'Puntatore Exif IFD',
+   'ExifToolVersion' => 'Versione ExifTool',
+   'ExifVersion' => 'Versione Exif',
+   'ExitPupilPosition' => 'Posizione pupilla d\'uscita',
+   'ExpirationDate' => 'Data Scadenza',
+   'ExpirationTime' => 'Ora Scadenza',
+   'ExposureBracketValue' => 'Valore Esposizione a Forcella',
+   'ExposureCompensation' => 'Bias esposizione',
+   'ExposureDifference' => 'Differenza Esposizione',
+   'ExposureIndex' => 'Indice di esposizione',
+   'ExposureMode' => {
+      Description => 'Modo esposizione',
+      PrintConv => {
+        'Aperture Priority' => 'PrioritÃ  diaframma',
+        'Aperture-priority AE' => 'PrioritÃ  diaframma',
+        'Auto' => 'Esposizione automatica',
+        'Auto bracket' => 'Esposizione a forcella automatica',
+        'Landscape' => 'Orizzontale',
+        'Manual' => 'Esposizione manuale',
+        'Portrait' => 'Verticale',
+        'Shutter Priority' => 'PrioritÃ  otturatore',
+        'Shutter speed priority AE' => 'PrioritÃ  otturatore',
+      },
+    },
+   'ExposureModeInManual' => {
+      PrintConv => {
+        'Center-weighted average' => 'Media centrale ponderata',
+        'Partial metering' => 'Parziale',
+      },
+    },
+   'ExposureProgram' => {
+      Description => 'Programma esposizione',
+      PrintConv => {
+        'Action (High speed)' => 'Programma di azione',
+        'Aperture Priority' => 'PrioritÃ  diaframma',
+        'Aperture-priority AE' => 'PrioritÃ  diaframma',
+        'Creative (Slow speed)' => 'Programma Creativo (basato sulla profonditÃ  di campo)',
+        'Landscape' => 'Orizzontale',
+        'Manual' => 'Manuale',
+        'Not Defined' => 'Non definito',
+        'Portrait' => 'Verticale',
+        'Program AE' => 'Programma normale',
+        'Shutter Priority' => 'PrioritÃ  otturatore',
+        'Shutter speed priority AE' => 'PrioritÃ  otturatore',
+      },
+    },
+   'ExposureTime' => 'Tempo di esposizione',
+   'ExposureTime2' => 'Tempo di esposizione 2',
+   'ExternalFlashBounce' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'ExternalFlashFlags' => 'Flags Flash Esterno',
+   'ExtraSamples' => 'Campioni Extra',
+   'FNumber' => 'Numero F',
+   'FastSeek' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'FaxProfile' => {
+      PrintConv => {
+        'Unknown' => 'Sconosciuta',
+      },
+    },
+   'FileFormat' => 'Formato File',
+   'FileModifyDate' => 'Data aggiornamento',
+   'FileName' => 'Nome File',
+   'FileSize' => 'Dimensione File',
+   'FileSource' => {
+      Description => 'Origine file',
+      PrintConv => {
+        'Digital Camera' => 'Fotocamera Digitale',
+        'Film Scanner' => 'Scanner per Pellicola',
+        'Reflection Print Scanner' => 'Scanner a riflessione',
+      },
+    },
+   'FileType' => 'Tipo File',
+   'FileVersion' => 'Versione Formato File',
+   'FillOrder' => {
+      PrintConv => {
+        'Normal' => 'Normale',
+      },
+    },
+   'FilterEffect' => {
+      Description => 'Effetto Filtro',
+      PrintConv => {
+        'Green' => 'Verde',
+        'None' => 'Nessuno',
+        'Orange' => 'Arancio',
+        'Red' => 'Rosso',
+        'Yellow' => 'Giallo',
+        'n/a' => 'Non impostato',
+      },
+    },
+   'FilterEffectMonochrome' => {
+      PrintConv => {
+        'Green' => 'Verde',
+        'None' => 'Nessuno',
+        'Orange' => 'Arancio',
+        'Red' => 'Rosso',
+        'Yellow' => 'Giallo',
+      },
+    },
+   'FixtureIdentifier' => 'Identificatore d\'installazione',
+   'Flash' => {
+      PrintConv => {
+        'Auto, Did not fire' => 'Flash non emesso, modo auto',
+        'Auto, Fired' => 'Flash emesso, modo auto',
+        'Auto, Fired, Red-eye reduction' => '"Attivato (flash automatico, riduzione occhi rossi)"',
+        'Auto, Fired, Red-eye reduction, Return detected' => '"Attivato (flash automatico, riduzione occhi rossi, rilevato riflesso)"',
+        'Auto, Fired, Return detected' => 'Flash emesso, modo auto, luce di ritorno rilevata',
+        'Auto, Fired, Return not detected' => 'Flash emesso, modo auto, luce di ritorno non rilevata',
+        'Did not fire' => 'Flash non emesso',
+        'Fired' => 'Flash emesso',
+        'Fired, Red-eye reduction' => 'Flash emesso, modo riduzione occhi rossi',
+        'Fired, Red-eye reduction, Return detected' => 'Flash emesso, modo riduzione occhi rossi, luce di ritorno rilevata',
+        'Fired, Red-eye reduction, Return not detected' => 'Flash emesso, modo riduzione occhi rossi, luce di ritorno non rilevata',
+        'Fired, Return detected' => 'Luce di ritorno rilevata',
+        'Fired, Return not detected' => 'Luce di ritorno non rilevata',
+        'No Flash' => 'Flash non emesso',
+        'No flash function' => 'Nessuna funzione flash',
+        'Off' => 'Flash non emesso, modalitÃ  flash forzata',
+        'Off, Did not fire' => 'Flash non emesso, modalitÃ  flash forzata',
+        'Off, Did not fire, Return not detected' => 'Off, Non emesso. Luce di ritorno non rilevata',
+        'Off, No flash function' => 'Off, Nessuna funzione flash',
+        'On' => 'Flash emesso, modalitÃ  flash forzata',
+        'On, Did not fire' => 'On, flash non emesso',
+        'On, Fired' => 'Flash emesso, modalitÃ  flash forzata',
+        'On, Red-eye reduction' => 'Flash emesso, modalitÃ  forzata, modo riduzione occhi rossi',
+        'On, Red-eye reduction, Return detected' => '"Attivato (flash schiarimento, riduzione occhi rossi, rilevato riflesso)"',
+        'On, Return detected' => 'Flash emesso, modalitÃ  flash forzata, luce di ritorno rilevata',
+        'On, Return not detected' => 'Flash emesso, modalitÃ  flash forzata, luce di ritorno non rilevata',
+      },
+    },
+   'FlashCommanderMode' => 'Modo Commander',
+   'FlashCompensation' => 'Compensazionee Flash',
+   'FlashControlMode' => {
+      Description => 'Modo Controllo Flash',
+      PrintConv => {
+        'Auto Aperture' => 'Diaframma automatico',
+        'Manual' => 'Manuale',
+        'Repeating Flash' => 'Ripetizione Flash',
+      },
+    },
+   'FlashDevice' => {
+      PrintConv => {
+        'None' => 'Nessuno',
+      },
+    },
+   'FlashEnergy' => 'Energia del flash',
+   'FlashExposureBracketValue' => 'Valore Esposizione a Forcella Flash',
+   'FlashExposureComp' => 'Compensazione Esposizione Flash',
+   'FlashFired' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'FlashFocalLength' => 'Lunghezza Focale Flash',
+   'FlashGroupAControlMode' => {
+      Description => 'Gruppo A Modo Controllo Flash',
+      PrintConv => {
+        'Auto Aperture' => 'Diaframma automatico',
+        'Manual' => 'Manuale',
+        'Repeating Flash' => 'Ripetizione Flash',
+      },
+    },
+   'FlashGroupBControlMode' => {
+      Description => 'Gruppo B Modo Controllo Flash',
+      PrintConv => {
+        'Auto Aperture' => 'Diaframma automatico',
+        'Manual' => 'Manuale',
+        'Repeating Flash' => 'Ripetizione Flash',
+      },
+    },
+   'FlashGroupCControlMode' => {
+      Description => 'Gruppo C Modo Controllo Flash',
+      PrintConv => {
+        'Manual' => 'Manuale',
+        'Repeating Flash' => 'Ripetizione Flash',
+      },
+    },
+   'FlashInfoVersion' => 'Info Versione Flash',
+   'FlashIntensity' => {
+      PrintConv => {
+        'Normal' => 'Normale',
+      },
+    },
+   'FlashMode' => {
+      Description => 'Modo Flash',
+      PrintConv => {
+        'Did Not Fire' => 'Non Emesso',
+        'Fired, Commander Mode' => 'Emesso, ModalitÃ  Commander',
+        'Fired, External' => 'Emesso Esterno',
+        'Fired, Manual' => 'Emesso, Manuale',
+        'Fired, TTL Mode' => 'Emesso, ModalitÃ  TTL',
+        'Normal' => 'Normale',
+        'Unknown' => 'Sconosciuta',
+      },
+    },
+   'FlashModel' => {
+      Description => 'Modello Flash',
+      PrintConv => {
+        'None' => 'Nessuno',
+      },
+    },
+   'FlashOptions' => {
+      PrintConv => {
+        'Normal' => 'Normale',
+      },
+    },
+   'FlashOptions2' => {
+      PrintConv => {
+        'Normal' => 'Normale',
+      },
+    },
+   'FlashSetting' => 'Impostazione Flash',
+   'FlashType' => {
+      Description => 'Tipo Flash',
+      PrintConv => {
+        'None' => 'Nessuno',
+      },
+    },
+   'FlashpixVersion' => 'Versione Flashpix supportata',
+   'FlipHorizontal' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'FocalLength' => 'Lunghezza focale obiettivo',
+   'FocalLength35efl' => 'Lunghezza focale obiettivo',
+   'FocalLengthIn35mmFormat' => 'Lunghezza focale in 35 mm',
+   'FocalPlaneResolutionUnit' => {
+      Description => 'UnitÃ  risoluzione piano focale',
+      PrintConv => {
+        'None' => 'Nessuno',
+        'inches' => 'Pollici',
+      },
+    },
+   'FocalPlaneXResolution' => 'Risoluzione X del piano focale',
+   'FocalPlaneYResolution' => 'Risoluzione Y del piano focale',
+   'Focus' => {
+      PrintConv => {
+        'Manual' => 'Manuale',
+      },
+    },
+   'FocusContinuous' => {
+      PrintConv => {
+        'Manual' => 'Manuale',
+      },
+    },
+   'FocusDistance' => 'Distanza Fuoco',
+   'FocusMode' => {
+      Description => 'ModalitÃ  Messa a Fuoco',
+      PrintConv => {
+        'Manual' => 'Manuale',
+        'Normal' => 'Normale',
+      },
+    },
+   'FocusMode2' => {
+      Description => 'ModalitÃ  Messa a Fuoco 2',
+      PrintConv => {
+        'Manual' => 'Manuale',
+      },
+    },
+   'FocusModeSetting' => {
+      PrintConv => {
+        'Manual' => 'Manuale',
+      },
+    },
+   'FocusPosition' => 'Posizione Fuoco',
+   'FocusRange' => {
+      PrintConv => {
+        'Manual' => 'Manuale',
+        'Normal' => 'Normale',
+      },
+    },
+   'FocusTrackingLockOn' => {
+      PrintConv => {
+        'Normal' => 'Normale',
+      },
+    },
+   'FrameRate' => 'Frequenza fotogramma',
+   'FrameSize' => 'Dimensioni fotogrammi',
+   'GIFVersion' => 'Versione GIF',
+   'GPSAltitude' => 'Altitudine',
+   'GPSAltitudeRef' => {
+      Description => 'Riferimento Altitudine',
+      PrintConv => {
+        'Above Sea Level' => 'Livello del mare',
+        'Below Sea Level' => 'Riferimento livello del mare (valore negativo)',
+      },
+    },
+   'GPSAreaInformation' => 'Nome dell\'area GPS',
+   'GPSDOP' => 'Precisione di misurazione',
+   'GPSDateStamp' => 'Data GPS',
+   'GPSDateTime' => 'Ora GPS (orologio atomico)',
+   'GPSDestBearing' => 'Direzione di destinazione',
+   'GPSDestBearingRef' => 'Riferimento per direzione di destinazione',
+   'GPSDestDistance' => 'Distanza di destinazione',
+   'GPSDestDistanceRef' => {
+      Description => 'Riferimento per distanza di destinazione',
+      PrintConv => {
+        'Kilometers' => 'Chilometri',
+        'Miles' => 'Miglia',
+        'Nautical Miles' => 'Nodi',
+      },
+    },
+   'GPSDestLatitude' => 'Latitudine di destinazione',
+   'GPSDestLatitudeRef' => 'Riferimento per latitudine di destinazione',
+   'GPSDestLongitude' => 'Longitudine di destinazione',
+   'GPSDestLongitudeRef' => 'Riferimento per longitudine di destinazione',
+   'GPSDifferential' => {
+      Description => 'Correzione differenziale GPS',
+      PrintConv => {
+        'Differential Corrected' => 'Correzione differenziale applicata',
+        'No Correction' => 'Misurazione senza correzione differenziale',
+      },
+    },
+   'GPSImgDirection' => 'Direzione di immagine',
+   'GPSImgDirectionRef' => 'Riferimento per direzione di immagine',
+   'GPSInfo' => 'Puntatore GPS Info IFD',
+   'GPSLatitude' => 'Latitudine',
+   'GPSLatitudeRef' => {
+      Description => 'Latitudine Nord o Sud',
+      PrintConv => {
+        'North' => 'Latitudine Nord',
+        'South' => 'Latitudine Sud',
+      },
+    },
+   'GPSLongitude' => 'Longitudine',
+   'GPSLongitudeRef' => {
+      Description => 'Longitudine Est o Ovest',
+      PrintConv => {
+        'East' => 'Longitudine Est',
+        'West' => 'Longitudine Ovest',
+      },
+    },
+   'GPSMapDatum' => 'Dati di rilevamento geodetico utilizzati',
+   'GPSMeasureMode' => {
+      Description => 'ModalitÃ  misurazione GPS',
+      PrintConv => {
+        '3-Dimensional Measurement' => 'Misurazione tridimensionale',
+      },
+    },
+   'GPSProcessingMethod' => 'Nome metodo di elaborazione GPS',
+   'GPSSatellites' => 'Satelliti GPS usati per la misurazione',
+   'GPSSpeed' => 'VelocitÃ  ricevitore GPS',
+   'GPSSpeedRef' => {
+      Description => 'UnitÃ  velocitÃ ',
+      PrintConv => {
+        'km/h' => 'Chilometri all\'ora',
+        'knots' => 'Nodi',
+        'mph' => 'Miglie all\'ora',
+      },
+    },
+   'GPSStatus' => {
+      Description => 'Stato ricevitore GPS',
+      PrintConv => {
+        'Measurement Active' => 'Misurazione in corso',
+        'Measurement Void' => 'InteroperativitÃ  misurazione',
+      },
+    },
+   'GPSTimeStamp' => 'Ora GPS (orologio atomico)',
+   'GPSTrack' => 'Direzione di movimento',
+   'GPSTrackRef' => {
+      Description => 'Riferimento per direzione di movimento',
+      PrintConv => {
+        'Magnetic North' => 'Direzione magnetica',
+        'True North' => 'Direzione effettiva',
+      },
+    },
+   'GPSVersionID' => 'Versione tag GPS',
+   'GainControl' => {
+      Description => 'Controllo di Guadagno',
+      PrintConv => {
+        'High gain down' => 'Diminuire il guadagno alto',
+        'High gain up' => 'Aumentare il guadagno alto',
+        'Low gain down' => 'Diminuire il guadagno basso',
+        'Low gain up' => 'Aumentare il guadagno basso',
+        'None' => 'Nessuno',
+      },
+    },
+   'GammaCompensatedValue' => 'Valore di Compensazione Gamma',
+   'Gapless' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'Gradation' => 'Ottimizzaz.',
+   'GrayResponseCurve' => 'Curva di risposta Grigio',
+   'GrayResponseUnit' => 'UnitÃ  di risposta Grigio',
+   'GrayTRC' => 'Curva Riproduzione Tono Grigio',
+   'GreenMatrixColumn' => 'Colonna della Matrice Verde',
+   'GreenTRC' => 'Curva Riproduziozne Tono Verde',
+   'HDR' => {
+      Description => 'HDR auto',
+      PrintConv => {
+        'Off' => 'Disattivata',
+      },
+    },
+   'Headline' => 'Intestazione',
+   'HighISONoiseReduction' => {
+      Description => 'Riduzione Rumore High ISO',
+      PrintConv => {
+        'Auto' => 'Automatico',
+        'High' => 'Hi',
+        'Low' => 'Leggero',
+        'Normal' => 'Normale',
+        'Off' => 'Disattivata',
+      },
+    },
+   'HometownDST' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'Hue' => 'TonalitÃ ',
+   'HueAdjustment' => 'Regolazione Hue',
+   'IPTC-NAA' => 'Metadati IPTC-NAA',
+   'IPTCBitsPerSample' => 'Numero di Bits per Campione',
+   'IPTCImageHeight' => 'Numero di linee',
+   'IPTCImageRotation' => {
+      Description => 'Rotazione Immagine',
+      PrintConv => {
+        '0' => 'Nessuna rotazione',
+        '180' => 'Rotazione di 180 gradi',
+        '270' => 'Rotazione di 270 gradi',
+        '90' => 'Rotazione di 90 gradi',
+      },
+    },
+   'IPTCImageWidth' => 'Pixels per linea',
+   'IPTCPictureNumber' => 'Numero Immagine',
+   'ISO' => 'SensibilitÃ  ISO',
+   'ISOInfo' => 'Info ISO',
+   'ISOSelection' => 'Selezione ISO',
+   'ISOSetting' => {
+      Description => 'Impostazione ISO',
+      PrintConv => {
+        'Manual' => 'Manuale',
+      },
+    },
+   'ISOSpeedExpansion' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'ImageAdjustment' => 'Regolazione Immagine',
+   'ImageCount' => 'Conteggio Immagini',
+   'ImageDataSize' => 'Dimensione Dati Immagine',
+   'ImageDepth' => 'ProfonditÃ  Immagine',
+   'ImageDescription' => 'Descrizione Immagine',
+   'ImageHeight' => 'Altezza immagine',
+   'ImageHistory' => 'Cronologia immagine',
+   'ImageID' => 'ID Immagine',
+   'ImageNumber' => 'Numero immagine',
+   'ImageOptimization' => 'Ottimizzazione Immagine',
+   'ImageOrientation' => {
+      Description => 'Orientamento Immagine',
+      PrintConv => {
+        'Landscape' => 'Orizzontale',
+        'Portrait' => 'Verticale',
+        'Square' => 'Quadrata',
+      },
+    },
+   'ImageQuality' => {
+      Description => 'QualitÃ  Immagine',
+      PrintConv => {
+        'Normal' => 'Normale',
+      },
+    },
+   'ImageRotated' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'ImageSize' => 'Dimensioni immagini',
+   'ImageStabilization' => 'Stabilizzazione Immagine',
+   'ImageTone' => {
+      PrintConv => {
+        'Landscape' => 'Orizzontale',
+        'Portrait' => 'Verticale',
+      },
+    },
+   'ImageType' => 'Tipo Immagine',
+   'ImageUniqueID' => 'ID unico immagine',
+   'ImageWidth' => 'Larghezza immagine',
+   'Index' => 'Indice',
+   'Instructions' => 'Istruzioni',
+   'IntellectualGenre' => 'Genere Intellettuale',
+   'InternalFlash' => {
+      PrintConv => {
+        'Fired' => 'Flash emesso',
+        'Manual' => 'Manuale',
+        'No' => 'Flash non emesso',
+        'Repeating Flash' => 'Ripetizione Flash',
+      },
+    },
+   'InteropIndex' => {
+      Description => 'Identificazione interoperativitÃ ',
+      PrintConv => {
+        'R98 - DCF basic file (sRGB)' => 'R98: File base DCF (sRGB)',
+      },
+    },
+   'InteropOffset' => 'Etichetta interoperativitÃ ',
+   'InteropVersion' => 'Versione interoperativitÃ ',
+   'JFIFVersion' => 'Versione JFIF',
+   'JPEGTables' => 'Tavole JPEG',
+   'JobID' => 'ID Lavoro',
+   'Keyword' => 'Parole Chiave',
+   'Keywords' => 'Parala Chiave',
+   'LanguageIdentifier' => 'ID Linguaggio',
+   'Lens' => 'Obiettivo',
+   'Lens35efl' => 'Obiettivo',
+   'LensDataVersion' => 'Versione Dati Obiettivo',
+   'LensFStops' => 'F-Stops Obiettivo',
+   'LensID' => 'Obiettivo Utilizzato',
+   'LensIDNumber' => 'Numero ID Obiettivo',
+   'LensInfo' => 'Informazioni su lente',
+   'LensSpec' => 'Obiettivo',
+   'LensType' => 'Tipo Obiettivo',
+   'LicenseType' => {
+      PrintConv => {
+        'Unknown' => 'Sconosciuta',
+      },
+    },
+   'LightSource' => {
+      Description => 'Sorgente di luce',
+      PrintConv => {
+        'Cloudy' => 'Nuvoloso',
+        'Cool White Fluorescent' => 'Fluorescente a luce calda',
+        'Day White Fluorescent' => 'Fluorescente a luce del giorno bianca',
+        'Daylight' => 'Luce del giorno',
+        'Daylight Fluorescent' => 'Fluorescente a luce del giorno',
+        'Fine Weather' => 'Bel tempo',
+        'Fluorescent' => 'Fluorescente',
+        'ISO Studio Tungsten' => 'Tungsteno studio ISO',
+        'Other' => 'Altra Sorgente di Luce',
+        'Shade' => 'Ombrato',
+        'Standard Light A' => 'Luce standard A',
+        'Standard Light B' => 'Luce standard B',
+        'Standard Light C' => 'Luce standard C',
+        'Tungsten (Incandescent)' => 'Tungsteno (luce incandescente)',
+        'Unknown' => 'Sconosciuta',
+        'Warm White Fluorescent' => 'Luce fluorescente bianca calda',
+        'White Fluorescent' => 'Fluorescente bianca',
+      },
+    },
+   'Lightness' => 'Luce',
+   'Lit' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'LocalizedCameraModel' => 'Modello Fotocamera Localizzato',
+   'Location' => 'LocalitÃ ',
+   'LongExposureNoiseReduction' => {
+      Description => 'Espos.lunga NR',
+      PrintConv => {
+        'Off' => 'Disattivata',
+        'On' => 'Attivata',
+      },
+    },
+   'LoopStyle' => {
+      PrintConv => {
+        'Normal' => 'Normale',
+      },
+    },
+   'LuminanceNoiseReduction' => {
+      PrintConv => {
+        'Low' => 'Leggero',
+      },
+    },
+   'MCUVersion' => 'Versione MCU',
+   'MIEVersion' => 'Versione MIE',
+   'Macro' => {
+      PrintConv => {
+        'Manual' => 'Manuale',
+        'Normal' => 'Normale',
+      },
+    },
+   'MacroMode' => {
+      PrintConv => {
+        'Normal' => 'Normale',
+      },
+    },
+   'Make' => 'Costruttore',
+   'MakeAndModel' => 'Marca e Modello',
+   'MakerNote' => 'Dati DNG Privati',
+   'MakerNoteVersion' => 'Note Versione Costruttore',
+   'MakerNotes' => 'Note produttore',
+   'ManualFlashOutput' => {
+      PrintConv => {
+        'Low' => 'Leggero',
+      },
+    },
+   'ManualFocusDistance' => 'Messa a Fuoco Manuale',
+   'MasterDocumentID' => 'ID Documento Principale',
+   'MaxAperture' => 'Massima apertura delle lenti',
+   'MaxApertureAtMaxFocal' => 'Diaframma Massimo alla Focale Massima',
+   'MaxApertureAtMinFocal' => 'Diaframma Massimo alla Focale Minima',
+   'MaxApertureValue' => 'Diaframma massimo obiettivo',
+   'MaxFocalLength' => 'Lunghezza Focale Massima',
+   'MediaBlackPoint' => 'Media Punto Nero',
+   'MediaType' => {
+      PrintConv => {
+        'Normal' => 'Normale',
+      },
+    },
+   'MediaWhitePoint' => 'Media Punto Bianco',
+   'MenuButtonDisplayPosition' => {
+      PrintConv => {
+        'Top' => 'Alto',
+      },
+    },
+   'MenuButtonReturn' => {
+      PrintConv => {
+        'Top' => 'Alto',
+      },
+    },
+   'MeteringMode' => {
+      Description => 'ModalitÃ  misurazione esposimetrica',
+      PrintConv => {
+        'Average' => 'Media',
+        'Center-weighted average' => 'Media centrale ponderata',
+        'Multi-segment' => 'Multi zona',
+        'Multi-spot' => 'Multipunto',
+        'Other' => 'Altro',
+        'Partial' => 'Parziale',
+        'Spot' => 'Punto',
+        'Unknown' => 'Sconosciuta',
+      },
+    },
+   'MeteringMode2' => {
+      PrintConv => {
+        'Multi-segment' => 'Multi zona',
+      },
+    },
+   'MeteringMode3' => {
+      PrintConv => {
+        'Multi-segment' => 'Multi zona',
+      },
+    },
+   'MinFocalLength' => 'Lunghezza Focale Minima',
+   'MinoltaQuality' => {
+      Description => 'QualitÃ ',
+      PrintConv => {
+        'Normal' => 'Normale',
+      },
+    },
+   'Model' => 'Modello Fotocamera',
+   'ModifiedPictureStyle' => {
+      PrintConv => {
+        'Landscape' => 'Orizzontale',
+        'None' => 'Nessuno',
+        'Portrait' => 'Verticale',
+      },
+    },
+   'ModifiedSharpnessFreq' => {
+      PrintConv => {
+        'Low' => 'Leggero',
+      },
+    },
+   'ModifiedToneCurve' => {
+      PrintConv => {
+        'Manual' => 'Manuale',
+      },
+    },
+   'ModifiedWhiteBalance' => {
+      PrintConv => {
+        'Cloudy' => 'Nuvoloso',
+        'Daylight' => 'Luce del giorno',
+        'Daylight Fluorescent' => 'Fluorescente a luce del giorno',
+        'Fluorescent' => 'Fluorescente',
+        'Shade' => 'Ombrato',
+        'Tungsten' => 'Tungsteno (luce incandescente)',
+      },
+    },
+   'ModifyDate' => 'Data e ora di modifica del file',
+   'MonochromeFilterEffect' => {
+      PrintConv => {
+        'Green' => 'Verde',
+        'None' => 'Nessuno',
+        'Orange' => 'Arancio',
+        'Red' => 'Rosso',
+        'Yellow' => 'Giallo',
+      },
+    },
+   'MonochromeLinear' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'MonochromeToningEffect' => {
+      PrintConv => {
+        'Green' => 'Verde',
+        'None' => 'Nessuno',
+      },
+    },
+   'MultiExposure' => 'Dati Esposizione Multipla',
+   'MultiExposureAutoGain' => 'Guadagno Automatico Esposizione Multipla',
+   'MultiExposureMode' => 'Modo Esposizione Multipla',
+   'MultiExposureShots' => 'Scatti Esposizione Multipla',
+   'MultiExposureVersion' => 'Versione Dati Esposizione Multipla',
+   'MultiFrameNoiseReduction' => {
+      Description => 'Riduz. distur. su piÃ¹ fotogr.',
+      PrintConv => {
+        'Off' => 'Disattivata',
+        'On' => 'Attivata',
+      },
+    },
+   'NEFCompression' => {
+      Description => 'Compressione RAW',
+      PrintConv => {
+        'Lossless' => 'Senza perdita',
+        'Uncompressed' => 'Non compresso',
+      },
+    },
+   'NamedColor2' => 'Colore Chiamato 2',
+   'NativeDisplayInfo' => 'Info Display Nativo',
+   'NikonCaptureData' => 'Dati Nikon Capture',
+   'NikonCaptureVersion' => 'Versione Nikon Capture',
+   'Noise' => 'Rumore',
+   'NoiseFilter' => {
+      PrintConv => {
+        'Low' => 'Leggero',
+      },
+    },
+   'NoiseReduction' => {
+      Description => 'Riduzione Rumore',
+      PrintConv => {
+        'Normal' => 'Normale',
+      },
+    },
+   'NoiseReductionApplied' => 'Riduzione Rumore Applicata',
+   'ObjectAttributeReference' => 'Genere intellettuale',
+   'ObjectCycle' => {
+      Description => 'Ciclo Oggetto',
+      PrintConv => {
+        'Both Morning and Evening' => 'Entrambi',
+        'Evening' => 'Sera',
+        'Morning' => 'Mattino',
+      },
+    },
+   'ObjectFileType' => {
+      PrintConv => {
+        'None' => 'Nessuno',
+        'Unknown' => 'Sconosciuta',
+      },
+    },
+   'ObjectName' => 'Titolo',
+   'ObjectTypeReference' => 'Riferimento Tipo Oggetto',
+   'OffsetSchema' => 'Schema Offset',
+   'OldSubfileType' => 'Tipo subfile',
+   'Opto-ElectricConvFactor' => 'Fattore di conversione optoelettrica',
+   'Orientation' => {
+      Description => 'Orientamento dell\'immagine',
+      PrintConv => {
+        'Horizontal (normal)' => '0Â° (alto/sinistra)',
+        'Mirror horizontal' => 'Rifletti in orizzontale',
+        'Mirror horizontal and rotate 270 CW' => 'Rifletti in orizzontale e ruota di 270Â° in senso orario',
+        'Mirror horizontal and rotate 90 CW' => 'Rifletti in orizzontale e ruota di 90Â° in senso orario',
+        'Mirror vertical' => 'Rifletti in verticale',
+        'Rotate 180' => '180Â° (basso/destra)',
+        'Rotate 270 CW' => 'Ruota di 270Â° in senso orario',
+        'Rotate 90 CW' => '90Â° senso antiorario (destra/alto)',
+      },
+    },
+   'OriginalTransmissionReference' => 'ID Lavoro',
+   'OriginatingProgram' => 'Programma d\'origine',
+   'OwnerID' => 'ID proprietario',
+   'PEFVersion' => 'Versione PEF',
+   'PageName' => 'Nome Pagina',
+   'PageNumber' => 'Numero Pagina',
+   'PhotoEffectsType' => {
+      PrintConv => {
+        'None' => 'Nessuno',
+      },
+    },
+   'PhotometricInterpretation' => {
+      Description => 'Composizione del pixel',
+      PrintConv => {
+        'BlackIsZero' => 'Nero Ãš zero',
+        'WhiteIsZero' => 'Bianco Ãš zero',
+      },
+    },
+   'PictureControlAdjust' => {
+      PrintConv => {
+        'Default Settings' => 'Impostazioni Predefinite',
+        'Full Control' => 'Controllo Totale',
+        'Quick Adjust' => 'Regolazione Rapida',
+      },
+    },
+   'PictureFinish' => {
+      PrintConv => {
+        'Portrait' => 'Verticale',
+      },
+    },
+   'PictureMode' => {
+      PrintConv => {
+        'Aperture-priority AE' => 'PrioritÃ  diaframma',
+        'Landscape' => 'Orizzontale',
+        'Manual' => 'Manuale',
+        'Portrait' => 'Verticale',
+        'Shutter speed priority AE' => 'PrioritÃ  otturatore',
+      },
+    },
+   'PictureMode2' => {
+      PrintConv => {
+        'Aperture Priority' => 'PrioritÃ  diaframma',
+        'Manual' => 'Manuale',
+        'Shutter Speed Priority' => 'PrioritÃ  otturatore',
+      },
+    },
+   'PictureModeBWFilter' => {
+      PrintConv => {
+        'Green' => 'Verde',
+        'Orange' => 'Arancio',
+        'Red' => 'Rosso',
+        'Yellow' => 'Giallo',
+      },
+    },
+   'PictureModeTone' => {
+      PrintConv => {
+        'Green' => 'Verde',
+      },
+    },
+   'PictureStyle' => {
+      PrintConv => {
+        'Landscape' => 'Orizzontale',
+        'None' => 'Nessuno',
+        'Portrait' => 'Verticale',
+      },
+    },
+   'PixelFormat' => 'Formato-Pixel',
+   'PixelUnits' => {
+      PrintConv => {
+        'Unknown' => 'Sconosciuta',
+      },
+    },
+   'PlanarConfiguration' => {
+      Description => 'Regolazione Dati Immagine',
+      PrintConv => {
+        'Chunky' => 'Formato spezzettato',
+        'Planar' => 'Formato planare',
+      },
+    },
+   'Preview0' => 'Anteprima 0 ',
+   'Preview1' => 'Anteprima 1 ',
+   'Preview2' => 'Anteprima 2',
+   'PreviewApplicationName' => 'Anteprima Nome Applicazione',
+   'PreviewApplicationVersion' => 'Anteprima Versione Applicazione',
+   'PreviewColorSpace' => {
+      Description => 'Anteprima Spazio Colore',
+      PrintConv => {
+        'Unknown' => 'Sconosciuta',
+      },
+    },
+   'PreviewDateTime' => 'Anteprima Data Ora',
+   'PreviewIFD' => 'Anteprima Puntatore IFD',
+   'PreviewImage' => 'Anteprima',
+   'PreviewImageValid' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'PreviewQuality' => {
+      PrintConv => {
+        'Normal' => 'Normale',
+      },
+    },
+   'PreviewSettingsName' => 'Anteprima Nome Impostazioni',
+   'PrimaryAFPoint' => {
+      PrintConv => {
+        'Bottom' => 'Basso',
+        'C6 (Center)' => 'C6 (Centro)',
+        'Center' => 'Centro',
+        'Far Left' => 'Tutto a Sinistra',
+        'Far Right' => 'Tutto a Destra',
+        'Lower-left' => 'Inferiore Sinistro',
+        'Lower-right' => 'Inferiore Destro',
+        'Mid-left' => 'Sinistra',
+        'Mid-right' => 'Destra',
+        'Top' => 'Alto',
+        'Upper-left' => 'Superiore Sinistro',
+        'Upper-right' => 'Superiore Destro',
+      },
+    },
+   'PrimaryChromaticities' => 'Cromatismo dei colori primari',
+   'PrimaryPlatform' => 'Piattaforma primaria',
+   'ProductID' => 'ID Prodotto',
+   'ProfileCMMType' => 'Tipo Profilo CMM',
+   'ProfileClass' => {
+      Description => 'Classe Profilo',
+      PrintConv => {
+        'Abstract Profile' => 'Profilo Astratto',
+        'ColorSpace Conversion Profile' => 'Profilo Conversione Spazio Colore',
+        'DeviceLink Profile' => 'Profilo Dispositivo di Collegamento',
+        'Display Device Profile' => 'Profilo Dispositivo Visualizzazione',
+        'Input Device Profile' => 'Profilo dispositivo di Input',
+        'NamedColor Profile' => 'Profilo Colore Chiamato',
+        'Nikon Input Device Profile (NON-STANDARD!)' => 'Profilo Nikon ("nkpf")',
+        'Output Device Profile' => 'Profilo Dispositivo Output',
+      },
+    },
+   'ProfileConnectionSpace' => 'Profilo Spazio Connessione',
+   'ProfileCopyright' => 'Copyright del Profilo',
+   'ProfileCreator' => 'Autore Profilo',
+   'ProfileDateTime' => 'Data Ora Profilo',
+   'ProfileDescription' => 'Descrizione del Profilo',
+   'ProfileDescriptionML' => 'Descrizione profilo multilinguaggio.',
+   'ProfileEmbedPolicy' => {
+      PrintConv => {
+        'Allow Copying' => 'Permetti la copia',
+        'No Restrictions' => 'Nessuna restrizione',
+      },
+    },
+   'ProfileFileSignature' => 'Firma File Profilo',
+   'ProfileID' => 'ID Profilo',
+   'ProfileName' => 'Nome Profilo',
+   'ProfileSequenceDesc' => 'Descrizione della Sequenza del Profilo',
+   'ProfileVersion' => 'Versione Profilo',
+   'ProgramLine' => {
+      PrintConv => {
+        'Normal' => 'Normale',
+      },
+    },
+   'ProgramMode' => {
+      PrintConv => {
+        'None' => 'Nessuno',
+        'Portrait' => 'Verticale',
+      },
+    },
+   'ProgramVersion' => 'Versione Programma',
+   'Province-State' => 'Provincia/Stato',
+   'Quality' => {
+      Description => 'QualitÃ ',
+      PrintConv => {
+        'Compressed RAW' => 'cRAW',
+        'Compressed RAW + JPEG' => 'cRAW+JPEG',
+        'Extra Fine' => 'Extra fine',
+        'Low' => 'Leggero',
+        'Normal' => 'Normale',
+        'RAW + JPEG' => 'RAW+JPEG',
+      },
+    },
+   'QualityMode' => {
+      PrintConv => {
+        'Normal' => 'Normale',
+      },
+    },
+   'RAFVersion' => 'Versione RAF',
+   'RasterizedCaption' => 'Didascalia Rasterizzata',
+   'Rating' => 'Valutazione',
+   'RatingPercent' => 'Valutazione in percentuale',
+   'RawDevPMPictureTone' => {
+      PrintConv => {
+        'Green' => 'Verde',
+      },
+    },
+   'RawDevPM_BWFilter' => {
+      PrintConv => {
+        'Green' => 'Verde',
+        'Orange' => 'Arancio',
+        'Red' => 'Rosso',
+        'Yellow' => 'Giallo',
+      },
+    },
+   'RawImageCenter' => 'Centro Immagine RAW',
+   'RawJpgQuality' => {
+      PrintConv => {
+        'Normal' => 'Normale',
+      },
+    },
+   'RecordMode' => {
+      Description => 'Modo registrazione',
+      PrintConv => {
+        'Aperture Priority' => 'PrioritÃ  diaframma',
+        'Manual' => 'Manuale',
+        'Shutter Priority' => 'PrioritÃ  otturatore',
+      },
+    },
+   'RecordingMode' => {
+      PrintConv => {
+        'Landscape' => 'Orizzontale',
+        'Manual' => 'Manuale',
+        'Portrait' => 'Verticale',
+      },
+    },
+   'RedMatrixColumn' => 'Colonna della Matrice Rossa',
+   'RedTRC' => 'Curva Riproduzione Tono Rosso',
+   'ReductionMatrix1' => 'Matrice di Riduzione 1',
+   'ReductionMatrix2' => 'Matrice di Riduzione 2',
+   'ReferenceBlackWhite' => 'Coppia valori riferimento di bianco e nero',
+   'ReferenceDate' => 'Data di Riferimento',
+   'ReferenceNumber' => 'Numero di Riferimento',
+   'ReferenceService' => 'Riferimento Servizio',
+   'RelatedImageFileFormat' => 'Formato file immagine correlato',
+   'RelatedImageHeight' => 'Numero delle righe dei dati immagine',
+   'RelatedImageWidth' => 'Larghezza immagine correlata',
+   'RelatedSoundFile' => 'File audio relativo',
+   'ReleaseButtonToUseDial' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'ReleaseDate' => 'Data di Rilascio',
+   'ReleaseTime' => 'Ora di Rilascio',
+   'RenderingIntent' => {
+      PrintConv => {
+        'ICC-Absolute Colorimetric' => 'Colorimetrico Assoluto',
+        'Media-Relative Colorimetric' => 'Colorimetrico Relativo',
+        'Perceptual' => 'Percentuale',
+        'Saturation' => 'Saturazione',
+      },
+    },
+   'ResampleParamsQuality' => {
+      PrintConv => {
+        'Low' => 'Leggero',
+      },
+    },
+   'Resaved' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'ResolutionUnit' => {
+      Description => 'UnitÃ  di risoluzione in X e Y',
+      PrintConv => {
+        'None' => 'Nessuno',
+        'cm' => 'Pixel/cm',
+        'inches' => 'Pollici',
+      },
+    },
+   'RetouchHistory' => {
+      Description => 'Cronologia Ritocco',
+      PrintConv => {
+        'None' => 'Nessuno',
+      },
+    },
+   'RevisionNumber' => 'Numero revisione',
+   'Rotation' => {
+      Description => 'Orientanento Fotocamera',
+      PrintConv => {
+        'Horizontal' => '0Â° (alto/sinistra)',
+        'Horizontal (Normal)' => '0Â° (alto/sinistra)',
+        'Horizontal (normal)' => '0Â° (alto/sinistra)',
+        'Rotate 180' => '180Â° (basso/destra)',
+        'Rotate 270 CW' => 'Ruota di 270Â° in senso orario',
+        'Rotate 90 CW' => '90Â° senso antiorario (destra/alto)',
+        'Rotated 180' => '180Â° (basso/destra)',
+        'Rotated 270 CW' => 'Ruota di 270Â° in senso orario',
+        'Rotated 90 CW' => '90Â° senso antiorario (destra/alto)',
+      },
+    },
+   'RowsPerStrip' => 'Numero righe per striscia',
+   'SPIFFVersion' => 'Versione SPIFF',
+   'SRActive' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'SVGVersion' => 'Versione SVG',
+   'SampleFormat' => {
+      PrintConv => {
+        'Float' => 'Virgola Mobile',
+        'Undefined' => 'Non definito',
+      },
+    },
+   'SamplesPerPixel' => 'Numero dei componenti',
+   'Saturation' => {
+      Description => 'Saturazione',
+      PrintConv => {
+        'High' => 'Saturazione massima',
+        'Low' => 'Saturazione minima',
+        'Normal' => 'Normale',
+      },
+    },
+   'Scene' => 'Scena',
+   'SceneCaptureType' => {
+      Description => 'Tipo di cattura scena',
+      PrintConv => {
+        'Landscape' => 'Orizzontale',
+        'Night' => 'Scena notturna',
+        'Portrait' => 'Verticale',
+      },
+    },
+   'SceneMode' => {
+      Description => 'Modo Scena',
+      PrintConv => {
+        '3D Sweep Panorama' => '3D',
+        'Anti Motion Blur' => 'Riduz. sfocat. movim.',
+        'Aperture Priority' => 'PrioritÃ  diaframma',
+        'Auto' => 'Automatico',
+        'Cont. Priority AE' => 'AE prior. avan.cont.',
+        'Handheld Night Shot' => 'Foto nott. senza trepp.',
+        'Landscape' => 'Orizzontale',
+        'Manual' => 'Manuale',
+        'Night Portrait' => 'Rit. notturno',
+        'Night Scene' => 'Visione notturna',
+        'Night View/Portrait' => 'Visione/Ritratto notturni',
+        'Normal' => 'Normale',
+        'Portrait' => 'Verticale',
+        'Shutter Priority' => 'PrioritÃ  otturatore',
+        'Sports' => 'Evento sportivo',
+        'Standard' => '',
+        'Sunset' => 'Tramonto',
+        'Sweep Panorama' => 'Panoramica ad arco',
+      },
+    },
+   'SceneModeUsed' => {
+      Description => 'Modo Scena',
+      PrintConv => {
+        'Aperture Priority' => 'PrioritÃ  diaframma',
+        'Landscape' => 'Orizzontale',
+        'Manual' => 'Manuale',
+        'Portrait' => 'Verticale',
+        'Shutter Priority' => 'PrioritÃ  otturatore',
+      },
+    },
+   'SceneSelect' => {
+      PrintConv => {
+        'Night' => 'Scena notturna',
+      },
+    },
+   'SceneType' => {
+      Description => 'Tipo scena',
+      PrintConv => {
+        'Directly photographed' => 'Immagine fotografata direttamente',
+      },
+    },
+   'SecurityClassification' => {
+      Description => 'Classificazione die sicurezza',
+      PrintConv => {
+        'Confidential' => 'Confidenziale',
+        'Restricted' => 'Riservato',
+        'Secret' => 'Segreto',
+        'Top Secret' => 'Massima segretezza',
+        'Unclassified' => 'Non classificato',
+      },
+    },
+   'SelfTimerMode' => 'Modo autoscatto',
+   'SensingMethod' => {
+      Description => 'Metodo di misurazione esposimetrica',
+      PrintConv => {
+        'Color sequential area' => 'Sensore area sequenziale a colori',
+        'Color sequential linear' => 'Sensore lineare sequenziale a colori',
+        'Not defined' => 'Non definito',
+        'One-chip color area' => 'Sensore area a colori a un chip',
+        'Three-chip color area' => 'Sensore area a colori a tre chip',
+        'Trilinear' => 'Sensore trilineare',
+        'Two-chip color area' => 'Sensore area a colori a due chip',
+      },
+    },
+   'SensorPixelSize' => 'Dimensione Pixel Sensore',
+   'SequentialShot' => {
+      PrintConv => {
+        'None' => 'Nessuno',
+      },
+    },
+   'SerialNumber' => 'Numero di Serie',
+   'ServiceIdentifier' => 'ID Servizio',
+   'SetButtonCrossKeysFunc' => {
+      PrintConv => {
+        'Normal' => 'Normale',
+      },
+    },
+   'ShadingCompensation' => 'Compensazione ombreggiatura',
+   'Sharpness' => {
+      Description => 'Nitidezza',
+      PrintConv => {
+        'Hard' => 'Pesante',
+        'Normal' => 'Normale',
+        'Soft' => 'Leggera',
+      },
+    },
+   'SharpnessFrequency' => {
+      PrintConv => {
+        'Low' => 'Leggero',
+      },
+    },
+   'ShootingMode' => {
+      Description => 'ModalitÃ  Scatto',
+      PrintConv => {
+        'Aperture Priority' => 'PrioritÃ  diaframma',
+        'Manual' => 'Manuale',
+        'Normal' => 'Normale',
+        'Portrait' => 'Verticale',
+        'Shutter Priority' => 'PrioritÃ  otturatore',
+      },
+    },
+   'ShortDocumentID' => 'ID Documento Breve',
+   'ShotInfoVersion' => 'Info Versione Scatto',
+   'ShutterCount' => 'Conteggio Scatti',
+   'ShutterMode' => {
+      PrintConv => {
+        'Aperture Priority' => 'PrioritÃ  diaframma',
+      },
+    },
+   'ShutterReleaseNoCFCard' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'ShutterSpeed' => 'Tempo di esposizione',
+   'ShutterSpeedValue' => 'VelocitÃ  otturatore',
+   'SimilarityIndex' => 'Indice di Somiglianza',
+   'SlideShow' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'SlowShutter' => {
+      PrintConv => {
+        'None' => 'Nessuno',
+      },
+    },
+   'Software' => 'Software utilizzato',
+   'Source' => 'Origine',
+   'SpatialFrequencyResponse' => 'Risposta in frequenza spaziale',
+   'SpecialEffectsOpticalFilter' => {
+      PrintConv => {
+        'None' => 'Nessuno',
+      },
+    },
+   'SpecialInstructions' => 'Istruzioni',
+   'SpectralSensitivity' => 'SensibilitÃ  spettro',
+   'SpotMeteringMode' => {
+      PrintConv => {
+        'Center' => 'Centro',
+      },
+    },
+   'State' => 'Stato',
+   'StripByteCounts' => 'Byte per striscia compressa',
+   'StripOffsets' => 'Ubicazione dati immagine',
+   'Sub-location' => 'LocalitÃ ',
+   'SubSecCreateDate' => 'Data e ora di creazione dei dati digitali',
+   'SubSecDateTimeOriginal' => 'Data e ora di creazione dei dati originali',
+   'SubSecModifyDate' => 'Data e ora di modifica del file',
+   'SubSecTime' => 'Frazioni di secondo di DataTime',
+   'SubSecTimeDigitized' => 'Sottosecondi DataOraDigitalizzate',
+   'SubSecTimeOriginal' => 'Sottosecondi DataOraOriginali',
+   'SubfileType' => 'Nuovo tipo subfile',
+   'Subject' => 'Soggetto',
+   'SubjectArea' => 'Area soggetto',
+   'SubjectDistance' => 'Distanza dal soggetto',
+   'SubjectDistanceRange' => {
+      Description => 'Rapporto distanza soggetto',
+      PrintConv => {
+        'Close' => 'Distanza ravvicinata',
+        'Distant' => 'Vista da lontano',
+        'Unknown' => 'Sconosciuta',
+      },
+    },
+   'SubjectLocation' => 'Area soggetto',
+   'SubjectProgram' => {
+      PrintConv => {
+        'None' => 'Nessuno',
+        'Portrait' => 'Verticale',
+      },
+    },
+   'SubjectReference' => 'Codice Soggetto',
+   'Subsystem' => {
+      PrintConv => {
+        'Unknown' => 'Sconosciuta',
+      },
+    },
+   'SupplementalCategories' => 'Categoria Supplementare',
+   'SupplementalType' => {
+      PrintConv => {
+        'Main Image' => 'Non impostato',
+        'Rasterized Caption' => 'Didascalia rasterizzata',
+        'Reduced Resolution Image' => 'Risoluzione immagine ridotta',
+      },
+    },
+   'T4Options' => 'Non compresso',
+   'T6Options' => 'Opzioni T6',
+   'Tagged' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'Technology' => {
+      Description => 'Tecnologia',
+      PrintConv => {
+        'Active Matrix Display' => 'Display a matrice attiva',
+        'Cathode Ray Tube Display' => 'Monitor con Tubo a Raggi Catodici',
+        'Digital Camera' => 'Fotocamera Digitale',
+        'Dye Sublimation Printer' => 'Stampante a Sublimazione Termica',
+        'Electrophotographic Printer' => 'Stampante Laser',
+        'Electrostatic Printer' => 'Stampante Elettrostatica',
+        'Film Scanner' => 'Scanner per Pellicola',
+        'Ink Jet Printer' => 'Stampante Ink Jet',
+        'Offset Lithography' => 'LitografÃ­a Offset',
+        'Passive Matrix Display' => 'Display a Matrice passiva',
+        'Photographic Paper Printer' => 'Stampante per Carta Fotografica',
+        'Projection Television' => 'Proiettore Televisivo',
+        'Reflective Scanner' => 'Scanner a Riflessione',
+        'Thermal Wax Printer' => 'Stampante Thermal Wax',
+      },
+    },
+   'Teleconverter' => {
+      PrintConv => {
+        'None' => 'Nessuno',
+      },
+    },
+   'Thresholding' => 'Soglia',
+   'ThumbnailImage' => 'Miniatura',
+   'ThumbnailImageSize' => 'Dimensione delle miniature',
+   'TimeCreated' => 'Ora di Creazione',
+   'TimeScaleParamsQuality' => {
+      PrintConv => {
+        'Low' => 'Leggero',
+      },
+    },
+   'TimeSent' => 'Ora d\'invio',
+   'Title' => 'Titolo',
+   'ToneComp' => 'Compensazione Tono',
+   'ToneCurve' => {
+      PrintConv => {
+        'Manual' => 'Manuale',
+      },
+    },
+   'ToneCurveActive' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'ToningEffect' => {
+      PrintConv => {
+        'Blue-green' => 'Blu-Verde',
+        'Green' => 'Verde',
+        'None' => 'Nessuno',
+        'Purple-blue' => 'Viola-Blu',
+        'Red' => 'Rosso',
+        'Red-purple' => 'Rosso-Viola',
+        'Yellow' => 'Giallo',
+        'n/a' => 'Non impostato',
+      },
+    },
+   'ToningEffectMonochrome' => {
+      PrintConv => {
+        'Green' => 'Verde',
+        'None' => 'Nessuno',
+      },
+    },
+   'TransferFunction' => 'Funzione di trasferimento',
+   'Transformation' => {
+      PrintConv => {
+        'Horizontal (normal)' => '0Â° (alto/sinistra)',
+        'Mirror horizontal' => 'Rifletti in orizzontale',
+        'Mirror horizontal and rotate 270 CW' => 'Rifletti in orizzontale e ruota di 270Â° in senso orario',
+        'Mirror horizontal and rotate 90 CW' => 'Rifletti in orizzontale e ruota di 90Â° in senso orario',
+        'Mirror vertical' => 'Rifletti in verticale',
+        'Rotate 180' => '180Â° (basso/destra)',
+        'Rotate 270 CW' => 'Ruota di 270Â° in senso orario',
+        'Rotate 90 CW' => '90Â° senso antiorario (destra/alto)',
+      },
+    },
+   'TransmissionReference' => 'Riferimento trasmissione',
+   'Trapped' => {
+      PrintConv => {
+        'Unknown' => 'Sconosciuta',
+      },
+    },
+   'Uncompressed' => {
+      Description => 'Non compresso',
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'UniqueCameraModel' => 'Nome Unico Modello Fotocamera',
+   'UniqueDocumentID' => 'ID Unico del Documento',
+   'Unknown' => 'Sconosciuto',
+   'Unsharp1Color' => {
+      PrintConv => {
+        'Green' => 'Verde',
+        'Red' => 'Rosso',
+        'Yellow' => 'Giallo',
+      },
+    },
+   'Unsharp2Color' => {
+      PrintConv => {
+        'Green' => 'Verde',
+        'Red' => 'Rosso',
+        'Yellow' => 'Giallo',
+      },
+    },
+   'Unsharp3Color' => {
+      PrintConv => {
+        'Green' => 'Verde',
+        'Red' => 'Rosso',
+        'Yellow' => 'Giallo',
+      },
+    },
+   'Unsharp4Color' => {
+      PrintConv => {
+        'Green' => 'Verde',
+        'Red' => 'Rosso',
+        'Yellow' => 'Giallo',
+      },
+    },
+   'Urgency' => {
+      Description => 'Urgenza',
+      PrintConv => {
+        '0 (reserved)' => '0 (riservato per usi futuri)',
+        '1 (most urgent)' => '1 (molto urgente)',
+        '5 (normal urgency)' => '5 (urgenza normale)',
+        '8 (least urgent)' => '8 (meno urgent)e',
+        '9 (user-defined priority)' => '9 (riservato per usi futuri)',
+      },
+    },
+   'UserComment' => 'Commento utente',
+   'UserDef1PictureStyle' => {
+      PrintConv => {
+        'Landscape' => 'Orizzontale',
+        'Portrait' => 'Verticale',
+      },
+    },
+   'UserDef2PictureStyle' => {
+      PrintConv => {
+        'Landscape' => 'Orizzontale',
+        'Portrait' => 'Verticale',
+      },
+    },
+   'UserDef3PictureStyle' => {
+      PrintConv => {
+        'Landscape' => 'Orizzontale',
+        'Portrait' => 'Verticale',
+      },
+    },
+   'VRDVersion' => 'Versione VRD',
+   'VRInfo' => 'Info Riduzione Vibrazione',
+   'VRInfoVersion' => 'Info Versione VR',
+   'Version' => 'Versione',
+   'VibrationReduction' => 'Riduzione Vibrazione',
+   'VideoCardGamma' => 'Gamma della Scheda Video',
+   'ViewingCondDesc' => 'Descrizione Condizioni di Visualizzazione',
+   'VignetteControl' => {
+      PrintConv => {
+        'Normal' => 'Normale',
+      },
+    },
+   'WBAdjLighting' => {
+      PrintConv => {
+        'Daylight' => 'Luce del giorno',
+        'None' => 'Nessuno',
+      },
+    },
+   'WBFineTuneActive' => {
+      PrintConv => {
+        'Yes' => 'Si',
+      },
+    },
+   'WCSProfiles' => 'Profilo Windows Color System',
+   'WhiteBalance' => {
+      Description => 'Bilanciamento del Bianco',
+      PrintConv => {
+        'Auto' => 'Equilibrio del bianco automatico',
+        'Black & White' => 'Monocromatico',
+        'Cloudy' => 'Nuvoloso',
+        'Color Temperature/Color Filter' => 'Temperatura colore / Filtro colore',
+        'Cool White Fluorescent' => 'Fluorescente bianca fredda',
+        'Custom' => 'Personalizzato',
+        'Custom 1' => 'PERSONAL.1',
+        'Custom 2' => 'PERSONAL.2',
+        'Custom 3' => 'PERSONAL.3',
+        'Custom 4' => 'PERSONAL.4',
+        'Day White Fluorescent' => 'Fluorescente a luce del giorno bianca',
+        'Daylight' => 'Luce del giorno',
+        'Daylight Fluorescent' => 'Fluorescente a luce del giorno',
+        'Fluorescent' => 'Fluorescente',
+        'Manual' => 'Manuale',
+        'Shade' => 'Ombrato',
+        'Tungsten' => 'Tungsteno (luce incandescente)',
+        'Unknown' => 'Sconosciuta',
+        'Warm White Fluorescent' => 'Luce fluorescente bianca calda',
+        'White Fluorescent' => 'Fluorescente bianca',
+      },
+    },
+   'WhiteBalanceAdj' => {
+      PrintConv => {
+        'Cloudy' => 'Nuvoloso',
+        'Daylight' => 'Luce del giorno',
+        'Fluorescent' => 'Fluorescente',
+        'Shade' => 'Ombrato',
+        'Tungsten' => 'Tungsteno (luce incandescente)',
+      },
+    },
+   'WhiteBalanceFineTune' => 'Regolazione Fine Bilanciamento Bianco',
+   'WhiteBalanceMode' => {
+      PrintConv => {
+        'Unknown' => 'Sconosciuta',
+      },
+    },
+   'WhiteBalanceSet' => {
+      PrintConv => {
+        'Cloudy' => 'Nuvoloso',
+        'Daylight' => 'Luce del giorno',
+        'Daylight Fluorescent' => 'Fluorescente a luce del giorno',
+        'Manual' => 'Manuale',
+        'Shade' => 'Ombrato',
+        'Tungsten' => 'Tungsteno (luce incandescente)',
+        'White Fluorescent' => 'Fluorescente bianca',
+      },
+    },
+   'WhiteLevel' => 'Livello Bianco',
+   'WhitePoint' => 'Cromatismo del punto bianco',
+   'Writer-Editor' => 'Autore Didascalia/Descrizione',
+   'XPAuthor' => 'Autore',
+   'XPComment' => 'Commento',
+   'XPKeywords' => 'Parole Chiave',
+   'XPSubject' => 'Soggetto',
+   'XPTitle' => 'Titolo',
+   'XPosition' => 'Posizione X',
+   'XResolution' => 'Risoluzione orizzontale immagine',
+   'YCbCrCoefficients' => 'Coefficienti matrice trasformazione spazio colori',
+   'YCbCrPositioning' => {
+      Description => 'Posizionamento Y e C',
+      PrintConv => {
+        'Centered' => 'Centrato',
+        'Co-sited' => 'Affiancato',
+      },
+    },
+   'YCbCrSubSampling' => 'Indice sottocampionamento da Y a C',
+   'YPosition' => 'Posizione Y',
+   'YResolution' => 'Risoluzione verticale immagine',
+   'ZoneMatching' => {
+      Description => 'Adeguamento zona',
+      PrintConv => {
+        'High Key' => 'Hi',
+        'ISO Setting Used' => 'Disattivata',
+        'Low Key' => 'Lo',
+      },
+    },
+);
+
+1;  # end
+
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Lang::it.pm - ExifTool Italian language translations
+
+=head1 DESCRIPTION
+
+This file is used by Image::ExifTool to generate localized tag descriptions
+and values.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Jens Duttke, Ferdinando Agovino and Emilio Dati for providing this
+translation.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool(3pm)|Image::ExifTool>,
+L<Image::ExifTool::TagInfoXML(3pm)|Image::ExifTool::TagInfoXML>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/ja.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/ja.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/ja.pm	(revision 24799)
@@ -0,0 +1,6177 @@
+#------------------------------------------------------------------------------
+# File:         ja.pm
+#
+# Description:  ExifTool Japanese language translations
+#
+# Notes:        This file generated automatically by Image::ExifTool::TagInfoXML
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Lang::ja;
+
+use strict;
+use vars qw($VERSION);
+
+$VERSION = '1.17';
+
+%Image::ExifTool::Lang::ja::Translate = (
+   'AEAperture' => 'AEçµã',
+   'AEBAutoCancel' => {
+      Description => 'ãã©ã±ãã£ã³ã°èªåè§£é€',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'AEBBracketValue' => 'AEBãã©ã±ããå€',
+   'AEBSequence' => 'ãã©ã±ãã£ã³ã°é åº',
+   'AEBSequenceAutoCancel' => {
+      Description => 'ãã©ã±ãã£ã³ã°é åº/èªåè§£é€',
+      PrintConv => {
+        '-,0,+/Disabled' => 'ïŒâ0 âïŒ/ããªã',
+        '-,0,+/Enabled' => 'ïŒâ0 âïŒ/ãã',
+        '0,-,+/Disabled' => '0 âïŒâïŒ/ããªã',
+        '0,-,+/Enabled' => '0 âïŒâïŒ/ãã',
+      },
+    },
+   'AEBShotCount' => 'ãã©ã±ãã£ã³ã°æã®æ®åœ±ææ°',
+   'AEBXv' => 'AEãã©ã±ãã é²åºè£æ­£',
+   'AEExposureTime' => 'AEé²åºæé',
+   'AEExtra' => 'AEç¹å¥ïŒ',
+   'AEInfo' => 'èªåé²åºæ
+å ±',
+   'AELock' => {
+      Description => 'AEã­ãã¯',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'AELockButton' => {
+      Description => 'AE-L/AF-L',
+      PrintConv => {
+        'AE-L/AF Area' => 'AE-L/AFãšãªã¢',
+        'AE-L/AF-L/AF Area' => 'AE-L/AF-L/AFãšãªã¢',
+        'AF-L/AF Area' => 'AF-L/AFãšãªã¢',
+        'AF-ON/AF Area' => 'AFãªã³/AFãšãªã¢',
+        'FV Lock' => 'FVã­ãã¯',
+        'Focus Area Selection' => 'ãã©ãŒã«ã¹ãšãªã¢éžæ',
+      },
+    },
+   'AEMaxAperture' => 'AEæå€§çµã',
+   'AEMaxAperture2' => 'AEæå€§çµã(2)',
+   'AEMeteringMode' => {
+      Description => 'AEæž¬å
+ã¢ãŒã',
+      PrintConv => {
+        'Multi-segment' => 'ãã¿ãŒã³',
+      },
+    },
+   'AEMeteringSegments' => 'èªåé²åºæž¬å
+å€',
+   'AEMinAperture' => 'AEæå°çµã',
+   'AEMinExposureTime' => 'AEæå°é²åºæé',
+   'AEProgramMode' => {
+      Description => 'AEãã­ã°ã©ã ã¢ãŒã',
+      PrintConv => {
+        'Av, B or X' => 'Av, BãX',
+        'Candlelight' => 'ã­ã£ã³ãã«ã©ã€ã',
+        'DOF Program' => 'æ·±åºŠåªå
+ãã­ã°ã©ã ',
+        'DOF Program (P-Shift)' => 'æ·±åºŠåªå
+ãã­ã°ã©ã ïŒPã·ããïŒ',
+        'Hi-speed Program' => 'é«éåªå
+ãã­ã°ã©ã ',
+        'Hi-speed Program (P-Shift)' => 'é«éåªå
+ãã­ã°ã©ã ïŒPã·ããïŒ',
+        'Kids' => 'ã­ããº',
+        'Landscape' => 'é¢šæ¯',
+        'M, P or TAv' => 'M, PãTAv',
+        'MTF Program' => 'MTFåªå
+ãã­ã°ã©ã ',
+        'MTF Program (P-Shift)' => 'MTFåªå
+ãã­ã°ã©ã ïŒPã·ããïŒ',
+        'Macro' => 'ãã¯ã­',
+        'Museum' => 'ãã¥ãŒãžã¢ã ',
+        'Night Scene' => 'å€æ¯',
+        'Night Scene Portrait' => 'äººç©ãå€æ¯',
+        'No Flash' => 'ãã©ãã·ã¥ç¡ã',
+        'Pet' => 'ããã',
+        'Portrait' => 'ããŒãã¬ãŒã',
+        'Sport' => 'ã¹ããŒã',
+        'Standard' => 'ã¹ã¿ã³ããŒã',
+        'Sunset' => 'å€æ¥',
+        'Surf & Snow' => 'ãµãŒãïŒã¹ããŒ',
+        'Sv or Green Mode' => 'Svãã°ãªãŒã³ã¢ãŒã',
+        'Text' => 'ãã­ã¹ã',
+      },
+    },
+   'AESetting' => {
+      Description => 'èªåé²åºèš­å®',
+      PrintConv => {
+        'Exposure Compensation' => 'é²åºè£æ­£',
+      },
+    },
+   'AEXv' => 'AE é²åºè£æ­£',
+   'AE_ISO' => 'AE ISOæåºŠ',
+   'AF-CPrioritySelection' => {
+      Description => 'AF-Cãã©ã€ãªãªãã£ãŒéžæ',
+      PrintConv => {
+        'Focus' => 'ãã©ãŒã«ã¹',
+        'Release' => 'ã¬ãªãŒãº',
+        'Release + Focus' => 'ã¬ãªãŒãº+ãã©ãŒã«ã¹',
+      },
+    },
+   'AF-OnForMB-D10' => {
+      Description => 'MB-D10çšAFãªã³',
+      PrintConv => {
+        'AE Lock (hold)' => 'AEã­ãã¯ïŒããŒã«ãïŒ',
+        'AE Lock (reset on release)' => 'AEã­ãã¯ïŒã¬ãªãŒãºæãªã»ããïŒ',
+        'AE Lock Only' => 'AEã­ãã¯ã®ã¿',
+        'AE/AF Lock' => 'AE/AFã­ãã¯',
+        'AF Lock Only' => 'AFã­ãã¯ã®ã¿',
+        'AF-On' => 'AFãªã³',
+        'Same as FUNC Button' => 'ãã¡ã³ã¯ã·ã§ã³ãã¿ã³ãšåäž',
+      },
+    },
+   'AF-SPrioritySelection' => {
+      Description => 'AF-Sãã©ã€ãªãªãã£ãŒéžæ',
+      PrintConv => {
+        'Focus' => 'ãã©ãŒã«ã¹',
+        'Release' => 'ã¬ãªãŒãº',
+      },
+    },
+   'AFActivation' => {
+      Description => 'AFã¢ã¯ãã£ããŒã·ã§ã³',
+      PrintConv => {
+        'AF-On Only' => 'AFãªã³ã®ã¿',
+        'Shutter/AF-On' => 'ã·ã£ãã¿ãŒ/AFãªã³',
+      },
+    },
+   'AFAdjustment' => 'AFåŸ®èª¿æŽ',
+   'AFArea' => 'AFãšãªã¢',
+   'AFAreaHeight' => 'AFãšãªã¢é«ã',
+   'AFAreaHeights' => 'AFãšãªã¢é«ã',
+   'AFAreaIllumination' => {
+      Description => 'AFãšãªã¢ã€ã«ãããŒã·ã§ã³',
+      PrintConv => {
+        'Auto' => 'ãªãŒã',
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'AFAreaMode' => {
+      Description => 'AFãšãªã¢ã¢ãŒã',
+      PrintConv => {
+        '1-area' => 'ïŒç¹',
+        '1-area (high speed)' => 'é«éïŒç¹',
+        '3-area (center)?' => 'ïŒç¹äž­å€®ïŒ',
+        '3-area (left)?' => 'ïŒç¹å·ŠïŒ',
+        '3-area (right)?' => 'ïŒç¹å³ïŒ',
+        '5-area' => 'ïŒç¹',
+        'Auto-area' => 'èªåãšãªã¢AF',
+        'Dynamic Area' => 'ãã€ãããã¯ãšãªã¢',
+        'Dynamic Area (closest subject)' => 'ãã€ãããã¯ïŒéç¹äž»é¡ïŒ',
+        'Dynamic Area (wide)' => 'ãã€ãããã¯ïŒã¯ã€ãïŒ',
+        'Face Detect AF' => 'é¡åªå
+',
+        'Group Dynamic' => 'ã°ã«ãŒããã€ãããã¯',
+        'Normal?' => 'ããŒãã«ïŒ',
+        'Single Area' => 'ã·ã³ã°ã«ãã€ã³ã',
+        'Single Area (wide)' => 'ã·ã³ã°ã«ãã€ã³ãïŒã¯ã€ãïŒ',
+        'Spot Focusing' => 'ã¹ããããã©ãŒã«ã¹',
+        'Spot Mode On' => 'ã¹ãããã¢ãŒããªã³',
+      },
+    },
+   'AFAreaModeSetting' => {
+      Description => 'AFãšãªã¢ã¢ãŒã',
+      PrintConv => {
+        'Closest Subject' => 'ãªãŒããšãªã¢',
+        'Dynamic Area' => 'ãã€ãããã¯ãšãªã¢',
+        'Single Area' => 'ã·ã³ã°ã«ãã€ã³ã',
+      },
+    },
+   'AFAreaWidth' => 'AFãšãªã¢å¹
+',
+   'AFAreaWidths' => 'AFãšãªã¢å¹
+',
+   'AFAreas' => 'AFãšãªã¢',
+   'AFAssist' => {
+      Description => 'AFã¢ã·ã¹ã',
+      PrintConv => {
+        'Does not emit/Fires' => 'ããªã/ãã',
+        'Emits/Does not fire' => 'ãã/ããªã',
+        'Emits/Fires' => 'ãã/ãã',
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+        'Only ext. flash emits/Fires' => 'å€éšã¹ãã­ãã®ã¿ãã/ãã',
+      },
+    },
+   'AFAssistBeam' => {
+      Description => 'AFè£å©å
+ã®æå
+',
+      PrintConv => {
+        'Does not emit' => 'ããªã',
+        'Emits' => 'ãã',
+        'Only ext. flash emits' => 'å€éšã¹ãã­ãã®ã¿ãã',
+      },
+    },
+   'AFDefocus' => 'AFãŒãé',
+   'AFDuringLiveView' => {
+      Description => 'ã©ã€ããã¥ãŒæ®åœ±äž­ã®AF',
+      PrintConv => {
+        'Disable' => 'ããªã',
+        'Enable' => 'ãã',
+        'Live mode' => 'ã©ã€ãã¢ãŒã',
+        'Quick mode' => 'ã¯ã€ãã¯ã¢ãŒã',
+      },
+    },
+   'AFFineTune' => 'AFãã¡ã€ã³ãã¥ãŒã³',
+   'AFFineTuneAdj' => 'AFãã¡ã€ã³ãã¥ãŒã³',
+   'AFImageHeight' => 'AFç»åé«ã',
+   'AFImageWidth' => 'AFç»åå¹
+',
+   'AFInfo' => 'AFã¢ãŒã',
+   'AFInfo2' => 'AFæ
+å ±',
+   'AFInfo2Version' => 'AFæ
+å ±ããŒãžã§ã³',
+   'AFIntegrationTime' => 'AFéç©æé',
+   'AFMicroAdjActive' => {
+      PrintConv => {
+        'No' => 'ããã',
+        'Yes' => 'ã¯ã',
+      },
+    },
+   'AFMicroadjustment' => {
+      Description => 'AFãã€ã¯ã­ã¢ãžã£ã¹ãã¡ã³ã',
+      PrintConv => {
+        'Adjust all by same amount' => 'å
+šã¬ã³ãºäžåŸèª¿æŽ',
+        'Adjust by lens' => 'ã¬ã³ãºããšã«èª¿æŽ',
+        'Disable' => 'ããªã',
+      },
+    },
+   'AFMode' => 'AFã¢ãŒã',
+   'AFOnAELockButtonSwitch' => {
+      Description => 'AF-ON/AEã­ãã¯ãã¿ã³å
+¥æ¿',
+      PrintConv => {
+        'Disable' => 'ããªã',
+        'Enable' => 'ãã',
+      },
+    },
+   'AFPoint' => {
+      Description => 'AFéžæãã€ã³ã',
+      PrintConv => {
+        'Auto AF point selection' => 'ãªãŒãAFãã€ã³ãéžæ',
+        'Bottom' => 'äž',
+        'Center' => 'äž­å€®',
+        'Face Detect' => 'é¡èªè­',
+        'Left' => 'å·Š',
+        'Manual AF point selection' => 'ããã¥ã¢ã«AFãã€ã³ãéžæ',
+        'Mid-left' => 'äž­å€®å·Š',
+        'Mid-right' => 'äž­å€®å³',
+        'None' => 'ç¡ã',
+        'None (MF)' => 'ç¡ãïŒMFïŒ',
+        'Right' => 'å³',
+        'Top' => 'äž',
+      },
+    },
+   'AFPointActivationArea' => {
+      Description => 'AFãã¬ãŒã ã®é åæ¡å€§',
+      PrintConv => {
+        'Standard' => 'ã¹ã¿ã³ããŒã',
+      },
+    },
+   'AFPointAreaExpansion' => {
+      Description => 'ä»»æéžææã®AFãã¬ãŒã é åæ¡å€§',
+      PrintConv => {
+        'Disable' => 'ããªã',
+        'Enable' => 'ãã',
+        'Left/right AF points' => 'ãã(å·Šå³1é åã¢ã·ã¹ãæå¹)',
+        'Surrounding AF points' => 'ãã(åšå²1é åã¢ã·ã¹ãæå¹)',
+      },
+    },
+   'AFPointAutoSelection' => {
+      Description => 'AFãã¬ãŒã èªåéžæã®éžæå¯åŠ',
+      PrintConv => {
+        'Control-direct:disable/Main:disable' => 'ãµãé»å­ãã€ã€ã«çŽæ¥:äžå¯/ã¡ã€ã³é»å­ãã€ã€ã«âäžå¯',
+        'Control-direct:disable/Main:enable' => 'ãµãé»å­ãã€ã€ã«çŽæ¥:äžå¯/ã¡ã€ã³é»å­ãã€ã€ã«âå¯',
+        'Control-direct:enable/Main:enable' => 'ãµãé»å­ãã€ã€ã«çŽæ¥:å¯/ã¡ã€ã³é»å­ãã€ã€ã«âå¯',
+      },
+    },
+   'AFPointBrightness' => {
+      Description => 'AFãã¬ãŒã ç¹ç¯èŒåºŠ',
+      PrintConv => {
+        'Brighter' => 'æãã',
+        'Normal' => 'æšæº',
+      },
+    },
+   'AFPointDisplayDuringFocus' => {
+      Description => 'æž¬è·æã®AFãã¬ãŒã è¡šç€º',
+      PrintConv => {
+        'Off' => 'ããªã',
+        'On' => 'ãã',
+        'On (when focus achieved)' => 'ãã(åçŠæ)',
+      },
+    },
+   'AFPointIllumination' => {
+      Description => 'AFãã€ã³ãã€ã«ãããŒã·ã§ã³',
+      PrintConv => {
+        'Auto' => 'ãªãŒã',
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'AFPointMode' => {
+      Description => 'AFæž¬è·ç¹ã¢ãŒã',
+      PrintConv => {
+        'Auto' => 'ãªãŒã',
+      },
+    },
+   'AFPointRegistration' => {
+      Description => 'AFãã¬ãŒã ã®ç»é²',
+      PrintConv => {
+        'Automatic' => 'ãªãŒã',
+        'Bottom' => 'äž',
+        'Center' => 'äž­å€®',
+        'Extreme Left' => 'å·Šç«¯',
+        'Extreme Right' => 'å³ç«¯',
+        'Left' => 'å·Š',
+        'Right' => 'å³',
+        'Top' => 'äž',
+      },
+    },
+   'AFPointSelected' => {
+      Description => 'AFæž¬è·ç¹',
+      PrintConv => {
+        'Auto' => 'ãªãŒã',
+        'Automatic Tracking AF' => 'èªåè¿œå°Ÿ',
+        'Bottom' => 'äž',
+        'Center' => 'äž­å€®',
+        'Face Detect AF' => 'é¡èªè­',
+        'Fixed Center' => 'äž­å€®åºå®',
+        'Left' => 'å·Š',
+        'Lower-left' => 'å·Šäž',
+        'Lower-right' => 'å³äž',
+        'Mid-left' => 'äž­å€®å·Š',
+        'Mid-right' => 'äž­å€®å³',
+        'Right' => 'å³',
+        'Top' => 'äž',
+        'Upper-left' => 'å·Šäž',
+        'Upper-right' => 'å³äž',
+      },
+    },
+   'AFPointSelected2' => {
+      Description => 'AFæž¬è·ç¹éžæ2',
+      PrintConv => {
+        'Auto' => 'ãªãŒã',
+      },
+    },
+   'AFPointSelection' => {
+      Description => 'AFãã€ã³ãéžæ',
+      PrintConv => {
+        '11 Points' => '11ç¹',
+        '51 Points' => '51ç¹ïŒ3Dãã©ãã­ã³ã°ïŒ',
+      },
+    },
+   'AFPointSelectionMethod' => {
+      Description => 'AFãã¬ãŒã éžææ¹æ³',
+      PrintConv => {
+        'Multi-controller direct' => 'ãã«ãã³ã³ãã­ãŒã©ãŒãã€ã¬ã¯ã',
+        'Normal' => 'æšæº',
+        'Quick Control Dial direct' => 'ãµãé»å­ãã€ã€ã«ãã€ã¬ã¯ã',
+      },
+    },
+   'AFPointSpotMetering' => 'AFãã¬ãŒã æ°ïŒã¹ãããæž¬å
+',
+   'AFPoints' => 'AFãã€ã³ã',
+   'AFPointsInFocus' => {
+      Description => 'AFæž¬è·ç¹',
+      PrintConv => {
+        'All' => 'å
+šãŠ',
+        'Bottom' => 'äž',
+        'Bottom, Center' => 'äž+äž­å€®',
+        'Bottom-center' => 'äž­å€®äž',
+        'Bottom-left' => 'å·Šäž',
+        'Bottom-right' => 'å³äž',
+        'Center' => 'äž­å€®',
+        'Center (horizontal)' => 'äž­å€®ïŒæ°Žå¹³ïŒ',
+        'Center (vertical)' => 'äž­å€®ïŒæ°Žå¹³ïŒ',
+        'Center+Right' => 'äž­å€®+å³',
+        'Fixed Center or Multiple' => 'äž­å€®åºå®ãŸãã¯è€æ°',
+        'Left' => 'å·Š',
+        'Left+Center' => 'å·Š+äž­å€®',
+        'Left+Right' => 'å·Š+å³',
+        'Lower-left, Bottom' => 'å·Šäž+äž',
+        'Lower-left, Mid-left' => 'å·Šäž+äž­å€®å·Š',
+        'Lower-right, Bottom' => 'å³äž+äž',
+        'Lower-right, Mid-right' => 'å³äž+äž­å€®å³',
+        'Mid-left' => 'äž­å€®å·Š',
+        'Mid-left, Center' => 'äž­å€®å·Š+äž­å€®',
+        'Mid-right' => 'äž­å€®å³',
+        'Mid-right, Center' => 'äž­å€®å³+äž­å€®',
+        'None' => 'ç¡ã',
+        'None (MF)' => 'ç¡ãïŒMFïŒ',
+        'Right' => 'å³',
+        'Top' => 'äž',
+        'Top, Center' => 'äž+äž­å€®',
+        'Top-center' => 'äž­å€®äž',
+        'Top-left' => 'å·Šäž',
+        'Top-right' => 'å³äž',
+        'Upper-left, Mid-left' => 'å·Šäž+äž­å€®å·Š',
+        'Upper-left, Top' => 'å·Šäž+äž',
+        'Upper-right, Mid-right' => 'å³äž+äž­å€®å³',
+        'Upper-right, Top' => 'å³äž+äž',
+      },
+    },
+   'AFPointsInFocus1D' => 'AFæž¬è·ç¹(1D)',
+   'AFPointsInFocus5D' => 'AFæž¬è·ç¹',
+   'AFPointsSelected' => 'AFãã€ã³ãéžæ',
+   'AFPointsUnknown2' => {
+      Description => 'AFæž¬è·ç¹ æªç¢ºèª2ïŒ',
+      PrintConv => {
+        'Auto' => 'ãªãŒã',
+      },
+    },
+   'AFPointsUsed' => {
+      Description => 'AFæž¬è·ç¹',
+      PrintConv => {
+        'Bottom' => 'äž',
+        'Center' => 'äž­å€®',
+        'Mid-left' => 'äž­å€®å·Š',
+        'Mid-right' => 'äž­å€®å³',
+        'Top' => 'äž',
+      },
+    },
+   'AFPredictor' => 'AFäºæž¬',
+   'AFResponse' => 'AFã¬ã¹ãã³ã¹',
+   'AFResult' => 'AFçµæ',
+   'AFSearch' => {
+      Description => 'AFãµãŒã',
+      PrintConv => {
+        'Not Ready' => 'æºåãã§ããŠããªã',
+        'Ready' => 'æºåå®äº',
+      },
+    },
+   'AIServoContinuousShooting' => 'AI SERVO é£ç¶æ®åœ±ã»æ®åœ±éåºŠåªå
+',
+   'AIServoImagePriority' => {
+      Description => 'AIãµãŒã1ã³ãç®/2ã³ãç®ä»¥éåäœ',
+      PrintConv => {
+        '1: AF, 2: Drive speed' => 'ãã³ãåªå
+/æ®åœ±éåºŠåªå
+',
+        '1: AF, 2: Tracking' => 'ãã³ãåªå
+/è¢«åäœè¿œåŸåªå
+',
+        '1: Release, 2: Drive speed' => 'ã¬ãªãŒãºåªå
+/æ®åœ±éåºŠæåªå
+',
+      },
+    },
+   'AIServoTrackingMethod' => {
+      Description => 'AIãµãŒãæã®æž¬è·ç¹éžæç¹æ§',
+      PrintConv => {
+        'Continuous AF track priority' => 'æž¬è·é£ç¶æ§åªå
+',
+        'Main focus point priority' => 'æž¬è·äž­å¿åªå
+',
+      },
+    },
+   'AIServoTrackingSensitivity' => {
+      Description => 'AIãµãŒãæã®è¢«åäœè¿œåŸææåºŠ',
+      PrintConv => {
+        'Fast' => 'éã',
+        'Slow' => 'é
+ã',
+        'Standard' => 'ã¹ã¿ã³ããŒã',
+      },
+    },
+   'APEVersion' => 'APEããŒãžã§ã³',
+   'ARMIdentifier' => 'ARMè­å¥å­',
+   'ARMVersion' => 'ARMããŒãžã§ã³',
+   'AToB0' => 'AããB0',
+   'AToB1' => 'AããB1',
+   'AToB2' => 'AããB2',
+   'AccessoryType' => 'ã¢ã¯ã»ãµãªãŒã¿ã€ã',
+   'ActionAdvised' => 'åäœæšå¥š',
+   'ActiveArea' => 'ã¢ã¯ãã£ãé å',
+   'ActiveD-Lighting' => {
+      Description => 'ã¢ã¯ãã£ãDã©ã€ãã£ã³ã°',
+      PrintConv => {
+        'High' => 'é«ã',
+        'Low' => 'ãœãã',
+        'Normal' => 'æšæº',
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'ActiveD-LightingMode' => {
+      PrintConv => {
+        'High' => 'é«ã',
+        'Low' => 'ãœãã',
+        'Normal' => 'æšæº',
+        'Off' => 'ãªã',
+      },
+    },
+   'AddAspectRatioInfo' => {
+      Description => 'ã¢ã¹ãã¯ãæ¯æ
+å ±ã®ä»å ',
+      PrintConv => {
+        'Off' => 'ãªã',
+      },
+    },
+   'AddOriginalDecisionData' => {
+      Description => 'ãªãªãžãã«ç»åå€å®çšããŒã¿ã®ä»å ',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'AdjustmentMode' => 'èª¿æŽã¢ãŒã',
+   'AdultContentWarning' => {
+      PrintConv => {
+        'Unknown' => 'äžæ',
+      },
+    },
+   'AdvancedRaw' => {
+      Description => 'ã¢ããã³ã¹RAW',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'AdvancedSceneMode' => {
+      PrintConv => {
+        'Auto' => 'ã€ã³ããªãžã§ã³ããªãŒã',
+      },
+    },
+   'Album' => 'ã¢ã«ãã ',
+   'AlphaByteCount' => 'ã¢ã«ãã¡ãã€ãæ°',
+   'AlphaDataDiscard' => {
+      Description => 'ã¢ã«ãã¡ããŒã¿ç Žæ£',
+      PrintConv => {
+        'Flexbits Discarded' => 'ãã¬ãã¯ã¹ãããç Žæ£',
+        'Full Resolution' => 'å®å
+šãªè§£ååºŠ',
+        'HighPass Frequency Data Discarded' => 'ãã€ãã¹åšæ³¢æ°ããŒã¿ç Žæ£',
+        'Highpass and LowPass Frequency Data Discarded' => 'ãã€ãã¹ãšã­ãŒãã¹åšæ³¢æ°ããŒã¿ç Žæ£',
+      },
+    },
+   'AlphaOffset' => 'ã¢ã«ãã¡ãªãã»ãã',
+   'AnalogBalance' => 'ã¢ãã­ã°ãã©ã³ã¹',
+   'Annotations' => 'ãã©ãã·ã§ããæ³šé',
+   'Anti-Blur' => {
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On (Continuous)' => 'ãªã³ïŒé£åïŒ',
+        'On (Shooting)' => 'ãªã³ïŒæ®åœ±ïŒ',
+        'n/a' => 'è©²åœç¡ã',
+      },
+    },
+   'AntiAliasStrength' => 'ã«ã¡ã©ã®ã¢ã³ããšã€ãªã¢ã¹ãã£ã«ã¿ã®çžå¯ŸçãªåŒ·åºŠ',
+   'Aperture' => 'çµã',
+   'ApertureRange' => {
+      Description => 'çµãæ°å€ã®å¶åŸ¡ç¯å²ã®èš­å®',
+      PrintConv => {
+        'Disable' => 'ããªã',
+        'Enable' => 'ãã',
+      },
+    },
+   'ApertureRingUse' => {
+      Description => 'çµããªã³ã°ã®äœ¿çš',
+      PrintConv => {
+        'Permitted' => 'èš±å¯',
+        'Prohibited' => 'çŠæ­¢',
+      },
+    },
+   'ApertureValue' => 'çµã',
+   'ApplicationRecordVersion' => 'ã¢ããªã±ãŒã·ã§ã³ã¬ã³ãŒãããŒãžã§ã³',
+   'ApplyShootingMeteringMode' => {
+      Description => 'æ®åœ±ã»æž¬å
+ã¢ãŒãã®åŒåº',
+      PrintConv => {
+        'Disable' => 'ããªã',
+        'Enable' => 'ãã',
+      },
+    },
+   'Artist' => 'ç»åäœæè
+',
+   'AsShotICCProfile' => 'æ®åœ±æICCãã­ãã¡ã€ã«',
+   'AsShotNeutral' => 'ãã¥ãŒãã©ã«ã·ã§ãã',
+   'AsShotPreProfileMatrix' => 'æ®åœ±æãã­ãã¡ã€ã«ãããªãã¯ã¹',
+   'AsShotProfileName' => 'æ®åœ±æãã­ãã£ãŒã«å',
+   'AsShotWhiteXY' => 'ãã¯ã€ãX-Yã·ã§ãã',
+   'AssignFuncButton' => {
+      Description => 'FUNC.ãã¿ã³ã®æ©èœ',
+      PrintConv => {
+        'Exposure comp./AEB setting' => 'é²åºè£æ­£ïŒAEBèš­å®',
+        'Image jump with main dial' => 'ã¡ã€ã³é»å­ãã€ã€ã« ã§ã®ç»åéã',
+        'Image quality' => 'èšé²ç»è³ªéžæ',
+        'LCD brightness' => 'æ¶²æ¶ã®æãã',
+        'Live view function settings' => 'ã©ã€ããã¥ãŒæ©èœèš­å®',
+      },
+    },
+   'AssistButtonFunction' => {
+      Description => 'ã¢ã·ã¹ããã¿ã³ã®æ©èœ',
+      PrintConv => {
+        'Av+/- (AF point by QCD)' => 'AvÂ±ïŒãµãé»å­ïŒAFãã¬ãŒã éžæïŒ',
+        'FE lock' => 'FEã­ãã¯',
+        'Normal' => 'æšæº',
+        'Select HP (while pressing)' => 'HPã«ç§»åïŒæŒããŠããéïŒ',
+        'Select Home Position' => 'HPã«ç§»å',
+      },
+    },
+   'Audio' => {
+      Description => 'é³å£°',
+      PrintConv => {
+        'No' => 'ããã',
+        'Yes' => 'ã¯ã',
+      },
+    },
+   'AudioDuration' => 'ãªãŒãã£ãªæé',
+   'AudioOutcue' => 'ãªãŒãã£ãªçµäºåå³',
+   'AudioSamplingRate' => 'ãªãŒãã£ãªãµã³ããªã³ã°ã¬ãŒã',
+   'AudioSamplingResolution' => 'ãªãŒãã£ãªãµã³ããªã³ã°è§£ååºŠ',
+   'AudioType' => 'ãªãŒãã£ãªã¿ã€ã',
+   'Author' => 'äœè
+',
+   'AuthorsPosition' => 'åœ¹è·å',
+   'AutoAperture' => {
+      Description => 'èªåçµã',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'AutoBracket' => 'ãªãŒããã©ã±ãã',
+   'AutoBracketModeM' => {
+      Description => 'ãªãŒããã©ã±ãã(ã¢ãŒãM)',
+      PrintConv => {
+        'Flash Only' => 'ãã©ãã·ã¥ã®ã¿',
+        'Flash/Aperture' => 'ãã©ãã·ã¥/çµã',
+        'Flash/Speed' => 'ãã©ãã·ã¥/ã·ã£ãã¿ãŒéåºŠ',
+        'Flash/Speed/Aperture' => 'ãã©ãã·ã¥/ã·ã£ãã¿ãŒéåºŠ/çµã',
+      },
+    },
+   'AutoBracketOrder' => 'ãã©ã±ããé ',
+   'AutoBracketSet' => {
+      Description => 'ãªãŒããã©ã±ããèš­å®',
+      PrintConv => {
+        'AE & Flash' => 'èªåé²åºïŒãã©ãã·ã¥',
+        'AE Only' => 'èªåé²åºã®ã¿',
+        'Flash Only' => 'ãã©ãã·ã¥ã®ã¿',
+        'WB Bracketing' => 'ãã¯ã€ããã©ã³ã¹ãã©ã±ãã',
+      },
+    },
+   'AutoBracketing' => {
+      Description => 'ãªãŒããã©ã±ãã',
+      PrintConv => {
+        'No flash & flash' => 'ãã©ãã·ã¥ç¡ãïŒãã©ãã·ã¥æã',
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'AutoExposureBracketing' => {
+      Description => 'ãã©ãã·ã¥ãã€ã¢ã¹',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+        'On (shot 1)' => 'ãªã³ïŒã·ã§ãã1ïŒ',
+        'On (shot 2)' => 'ãªã³ïŒã·ã§ãã2ïŒ',
+        'On (shot 3)' => 'ãªã³ïŒã·ã§ãã3ïŒ',
+      },
+    },
+   'AutoFP' => {
+      Description => 'ãªãŒãFP',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'AutoFocus' => {
+      Description => 'ãªãŒããã©ãŒã«ã¹',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'AutoISO' => {
+      Description => 'ISOãªãŒã',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'AutoISOMax' => 'ISOãªãŒã æå€§æåºŠ',
+   'AutoISOMinShutterSpeed' => 'ISOãªãŒã æå°ã·ã£ãã¿ãŒéåºŠ',
+   'AutoLightingOptimizer' => {
+      Description => 'ãªãŒãã©ã€ãã£ã³ã°ãªããã£ãã€ã¶',
+      PrintConv => {
+        'Disable' => 'ããªã',
+        'Enable' => 'ãã',
+        'Low' => 'ãœãã',
+        'Off' => 'ãªã',
+        'Standard' => 'ã¹ã¿ã³ããŒã',
+        'Strong' => 'åŒ·',
+        'n/a' => 'è©²åœç¡ã',
+      },
+    },
+   'AutoLightingOptimizerOn' => {
+      PrintConv => {
+        'No' => 'ããã',
+        'Yes' => 'ã¯ã',
+      },
+    },
+   'AutoRedEye' => {
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'AutoRotate' => {
+      Description => 'èªååè»¢',
+      PrintConv => {
+        'None' => 'ç¡ã',
+        'Rotate 180' => '180åºŠåè»¢',
+        'Rotate 270 CW' => '270åºŠåè»¢ CW',
+        'Rotate 90 CW' => '90åºŠåè»¢ CW',
+        'n/a' => 'ãœãããŠã§ã¢ã§åè»¢',
+      },
+    },
+   'AuxiliaryLens' => 'è£å©ã¬ã³ãº',
+   'AvApertureSetting' => 'Avçµãèš­å®',
+   'AvSettingWithoutLens' => {
+      Description => 'ã¬ã³ãºæªè£
+çæã®çµãæ°å€èš­å®',
+      PrintConv => {
+        'Disable' => 'äžå¯',
+        'Enable' => 'å¯',
+      },
+    },
+   'BToA0' => 'BããA0',
+   'BToA1' => 'BããA1',
+   'BToA2' => 'BããA2',
+   'BWFilter' => 'çœé»ãã£ã«ã¿ãŒ',
+   'BWMode' => {
+      Description => 'çœé»ã¢ãŒã',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'BabyAge' => 'èµ€ã¡ãã/ãããã®å¹Žéœ¢',
+   'BackgroundColorIndicator' => 'èæ¯è²ææš',
+   'BackgroundColorValue' => 'èæ¯è²å€',
+   'BackgroundTiling' => {
+      PrintConv => {
+        'No' => 'ããã',
+        'Yes' => 'ã¯ã',
+      },
+    },
+   'BadFaxLines' => 'ç²æªãªFAXç·',
+   'BannerImageType' => {
+      PrintConv => {
+        'None' => 'ç¡ã',
+      },
+    },
+   'BaseExposureCompensation' => 'åºæ¬é²åºè£æ­£',
+   'BaseISO' => 'ããŒã¹æåºŠ',
+   'BaselineExposure' => 'ããŒã¹ã©ã€ã³é²åº',
+   'BaselineNoise' => 'ããŒã¹ã©ã€ã³ãã€ãº',
+   'BaselineSharpness' => 'ããŒã¹ã©ã€ã³ã·ã£ãŒããã¹',
+   'BatteryInfo' => 'é»æº',
+   'BatteryLevel' => 'ããããªãŒã¬ãã«',
+   'BatteryOrder' => {
+      Description => 'ããããªãŒé ',
+      PrintConv => {
+        'Camera Battery First' => 'ã«ã¡ã©ã®ããããªãŒãæåã«äœ¿ã',
+        'MB-D10 First' => 'MB-D10ã®ããããªãŒãæåã«äœ¿ã',
+      },
+    },
+   'BayerGreenSplit' => 'ãã€ã€ãŒã°ãªãŒã³åå²',
+   'Beep' => {
+      Description => 'ããŒã',
+      PrintConv => {
+        'High' => 'é«ã',
+        'Low' => 'äœã',
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'BestQualityScale' => 'é«åè³ªã¹ã±ãŒã«',
+   'BestShotMode' => 'ãã¹ãã·ã§ããã¢ãŒã',
+   'BitDepth' => 'ãããæ·±åºŠ',
+   'BitsPerComponent' => 'ã³ã³ããŒãã³ããããããã',
+   'BitsPerExtendedRunLength' => 'æ¡åŒµã©ã³ã¬ã³ã°ã¹ãããã®ããã',
+   'BitsPerRunLength' => 'ã©ã³ã¬ã³ã°ã¹ãããã®ããã',
+   'BitsPerSample' => 'ã³ã³ããŒãã³ãã®ãããæ°',
+   'BlackLevel' => 'é»ã¬ãã«',
+   'BlackLevel2' => 'é»ã¬ãã«2',
+   'BlackLevelDeltaH' => 'é»ã¬ãã«ãã«ã¿H',
+   'BlackLevelDeltaV' => 'é»ã¬ãã«ãã«ã¿V',
+   'BlackLevelRepeatDim' => 'é»ã¬ãã«ååŸ©å€',
+   'BlackPoint' => 'é»ç¹',
+   'BlueBalance' => 'ãã«ãŒãã©ã³ã¹',
+   'BlueMatrixColumn' => 'éè²ãããªãã¯ã¹å',
+   'BlueTRC' => 'éè²èª¿å¢æ®æ²ç·',
+   'BlurWarning' => {
+      Description => 'ææ¯ãè­Šå',
+      PrintConv => {
+        'Blur Warning' => 'ææ¯ãè­Šå',
+        'None' => 'ç¡ã',
+      },
+    },
+   'BodyBatteryADLoad' => 'é»æºA/Dæ¬äœèµ·åæ',
+   'BodyBatteryADNoLoad' => 'é»æºA/Dæ¬äœãªãæ',
+   'BodyBatteryState' => 'é»æºç¶æ
+æ¬äœ',
+   'BodyFirmwareVersion' => 'æ¬äœãã¡ãŒã ãŠã§ã¢ããŒãžã§ã³',
+   'BracketMode' => {
+      Description => 'ãã©ã±ããã¢ãŒã',
+      PrintConv => {
+        'Off' => 'ãªã',
+      },
+    },
+   'BracketSequence' => 'ãã©ã±ããã·ãŒã±ã³ã¹',
+   'BracketShotNumber' => {
+      Description => 'ãã©ã±ããã·ã§ããæ°',
+      PrintConv => {
+        'n/a' => 'è©²åœç¡ã',
+      },
+    },
+   'BracketStep' => {
+      Description => 'ãã©ã±ããã¹ããã',
+      PrintConv => {
+        '1 EV' => '1ã¹ããã',
+        '1/3 EV' => '1/3ã¹ããã',
+        '2/3 EV' => '2/3ã¹ããã',
+      },
+    },
+   'BracketValue' => 'ãã©ã±ããå€',
+   'Brightness' => 'ãã©ã€ããã¹',
+   'BrightnessData' => 'ãã©ã€ããã¹ããŒã¿',
+   'BrightnessValue' => 'ãã©ã€ããã¹',
+   'BulbDuration' => 'ãã«ãæé',
+   'BurstMode' => {
+      Description => 'ãã©ã¹ãã¢ãŒã',
+      PrintConv => {
+        'Infinite' => 'ç¡é',
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'ButtonFunctionControlOff' => {
+      Description => 'ãµãé»å­ãã€ã€ã«ãOFFãæã®ãã¿ã³æäœ',
+      PrintConv => {
+        'Disable main, Control, Multi-control' => 'ã¡ã€ã³é»å­ãã€ã€ã«ããµãé»å­ãã€ã€ã«ããã«ãã³ã³ãã­ãŒã©ãŒã¯ç¡å¹',
+        'Normal (enable)' => 'éåžž(æå¹)',
+      },
+    },
+   'By-line' => 'è£œäœè
+',
+   'By-lineTitle' => 'è£œäœè
+ã®è·çš®',
+   'CCDScanMode' => {
+      Description => 'CCDã¹ã­ã£ã³ã¢ãŒã',
+      PrintConv => {
+        'Interlaced' => 'ã€ã³ã¿ã¬ãŒã¹',
+        'Progressive' => 'ãã­ã°ã¬ãã·ã',
+      },
+    },
+   'CFALayout' => 'CFAã¬ã€ã¢ãŠã',
+   'CFAPattern' => 'CFAãã¿ãŒã³',
+   'CFAPattern2' => 'CFAãã¿ãŒã³2',
+   'CFAPlaneColor' => 'CFAãã¬ãŒã³è²',
+   'CFARepeatPatternDim' => 'CFAååŸ©ãã¿ãŒã³ç¹æ§',
+   'CLModeShootingSpeed' => 'CLã¢ãŒãæ®åœ±éåºŠ',
+   'CMContrast' => 'CMã³ã³ãã©ã¹ã',
+   'CMExposureCompensation' => 'CMé²åºè£æ­£',
+   'CMHue' => 'CMè²çž',
+   'CMMFlags' => 'CMMãã©ã°',
+   'CMSaturation' => 'CMåœ©åºŠ',
+   'CMSharpness' => 'CMã·ã£ãŒããã¹',
+   'CMWhiteBalance' => 'CMãã¯ã€ããã©ã³ã¹',
+   'CMWhiteBalanceComp' => 'CMãã¯ã€ããã©ã³ã¹è£æ­£',
+   'CMWhiteBalanceGrayPoint' => 'CMãã¯ã€ããã©ã³ã¹ã°ã¬ãŒãã€ã³ã',
+   'CMYKEquivalent' => 'CMYKç­äŸ¡ç©',
+   'CPUFirmwareVersion' => 'CPUãã¡ãŒã ãŠãšã¢ããŒãžã§ã³',
+   'CPUType' => {
+      PrintConv => {
+        'None' => 'ç¡ã',
+      },
+    },
+   'CalibrationDateTime' => 'ã­ã£ãªãã¬ãŒã·ã§ã³æ¥æ',
+   'CalibrationIlluminant1' => {
+      Description => 'å
+æºã­ã£ãªãã¬ãŒã·ã§ã³1',
+      PrintConv => {
+        'Cloudy' => 'æã',
+        'Cool White Fluorescent' => 'çœè²èå
+ç¯',
+        'Day White Fluorescent' => 'æŒçœè²èå
+ç¯',
+        'Daylight' => 'æŒå
+',
+        'Daylight Fluorescent' => 'æŒå
+è²èå
+ç¯',
+        'Fine Weather' => 'è¯ãå€©æ°',
+        'Flash' => 'ã¹ãã­ã',
+        'Fluorescent' => 'èå
+ç¯',
+        'ISO Studio Tungsten' => 'ISOã¹ã¿ãžãªã¿ã³ã°ã¹ãã³',
+        'Other' => 'ãã®ä»ã®å
+æº',
+        'Shade' => 'æ¥é°',
+        'Standard Light A' => 'æšæºã©ã€ãA',
+        'Standard Light B' => 'æšæºã©ã€ãB',
+        'Standard Light C' => 'æšæºã©ã€ãC',
+        'Tungsten (Incandescent)' => 'ã¿ã³ã°ã¹ãã³(çœç±ç¯)',
+        'Unknown' => 'äžæ',
+        'Warm White Fluorescent' => 'æçœå
+è²èå
+ç¯',
+        'White Fluorescent' => 'æž©çœè²èå
+ç¯',
+      },
+    },
+   'CalibrationIlluminant2' => {
+      Description => 'å
+æºã­ã£ãªãã¬ãŒã·ã§ã³2',
+      PrintConv => {
+        'Cloudy' => 'æã',
+        'Cool White Fluorescent' => 'çœè²èå
+ç¯',
+        'Day White Fluorescent' => 'æŒçœè²èå
+ç¯',
+        'Daylight' => 'æŒå
+',
+        'Daylight Fluorescent' => 'æŒå
+è²èå
+ç¯',
+        'Fine Weather' => 'è¯ãå€©æ°',
+        'Flash' => 'ã¹ãã­ã',
+        'Fluorescent' => 'èå
+ç¯',
+        'ISO Studio Tungsten' => 'ISOã¹ã¿ãžãªã¿ã³ã°ã¹ãã³',
+        'Other' => 'ãã®ä»ã®å
+æº',
+        'Shade' => 'æ¥é°',
+        'Standard Light A' => 'æšæºã©ã€ãA',
+        'Standard Light B' => 'æšæºã©ã€ãB',
+        'Standard Light C' => 'æšæºã©ã€ãC',
+        'Tungsten (Incandescent)' => 'ã¿ã³ã°ã¹ãã³(çœç±ç¯)',
+        'Unknown' => 'äžæ',
+        'Warm White Fluorescent' => 'æçœå
+è²èå
+ç¯',
+        'White Fluorescent' => 'æž©çœè²èå
+ç¯',
+      },
+    },
+   'CameraCalibration1' => 'ã«ã¡ã©ã­ã£ãªãã¬ãŒã·ã§ã³1',
+   'CameraCalibration2' => 'ã«ã¡ã©ã­ã£ãªãã¬ãŒã·ã§ã³2',
+   'CameraCalibrationSig' => 'ã«ã¡ã©ã­ã£ãªãã¬ãŒã·ã§ã³ãµã€ã³',
+   'CameraID' => 'ã«ã¡ã©ID',
+   'CameraISO' => 'ã«ã¡ã©ISO',
+   'CameraInfo' => 'ãã³ã¿ãã¯ã¹ã¢ãã«',
+   'CameraOrientation' => {
+      Description => 'ç»åã®åã',
+      PrintConv => {
+        'Horizontal (normal)' => 'æ°Žå¹³ïŒæšæºïŒ',
+        'Rotate 270 CW' => '270åºŠåè»¢ CW',
+        'Rotate 90 CW' => '90åºŠåè»¢ CW',
+      },
+    },
+   'CameraParameters' => 'ã«ã¡ã©ãã©ã¡ãŒã¿ãŒ',
+   'CameraSerialNumber' => 'ã«ã¡ã©ã·ãªã¢ã«çªå·',
+   'CameraSettings' => 'ã«ã¡ã©èš­å®',
+   'CameraSettingsVersion' => 'ã«ã¡ã©èš­å®ããŒãžã§ã³',
+   'CameraTemperature' => 'ã«ã¡ã©æž©åºŠ',
+   'CameraType' => {
+      Description => 'ã«ã¡ã©ã¿ã€ã',
+      PrintConv => {
+        'Compact' => 'ã³ã³ãã¯ã',
+        'DV Camera' => 'DVã«ã¡ã©',
+        'EOS High-end' => 'EOSãã€ãšã³ã',
+        'EOS Mid-range' => 'EOSããã«ã¬ã³ãž',
+      },
+    },
+   'CameraType2' => 'ã«ã¡ã©ã¿ã€ã2',
+   'CanonAFInfo' => 'AFæ
+å ±',
+   'CanonAFInfo2' => 'AFæ
+å ±2',
+   'CanonExposureMode' => {
+      Description => 'é²åºã¢ãŒã',
+      PrintConv => {
+        'Aperture-priority AE' => 'çµãåªå
+',
+        'Bulb' => 'ãã«ã',
+        'Depth-of-field AE' => 'è¢«åçæ·±åºŠAE',
+        'Easy' => 'ç°¡å',
+        'Manual' => 'ããã¥ã¢ã«',
+        'Program AE' => 'ãã­ã°ã©ã AE',
+        'Shutter speed priority AE' => 'ã·ã£ãã¿ãŒåªå
+',
+      },
+    },
+   'CanonFileInfo' => 'ãã¡ã€ã«æ
+å ±',
+   'CanonFileLength' => 'ãã¡ã€ã«é·',
+   'CanonFirmwareVersion' => 'ãã¡ãŒã ãŠã§ã¢ããŒãžã§ã³',
+   'CanonFlashMode' => {
+      Description => 'ãã©ãã·ã¥ã¢ãŒã',
+      PrintConv => {
+        'Auto' => 'ãªãŒã',
+        'External flash' => 'å€ä»ãã©ãã·ã¥',
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+        'Red-eye reduction' => 'èµ€ç®è»œæž',
+        'Red-eye reduction (Auto)' => 'èµ€ç®è»œæžïŒãªãŒãïŒ',
+        'Red-eye reduction (On)' => 'èµ€ç®è»œæžïŒãªã³ïŒ',
+        'Slow-sync' => 'ã¹ã­ãŒã·ã³ã¯ã­',
+      },
+    },
+   'CanonFocalLength' => 'ãã©ãŒã«ã¹ã¿ã€ã',
+   'CanonImageHeight' => 'ç»åé«ã',
+   'CanonImageSize' => {
+      Description => 'ã€ã¡ãŒãžãµã€ãº',
+      PrintConv => {
+        'Large' => 'ã©ãŒãž',
+        'Medium' => 'ããã«',
+        'Medium 1' => 'ããã«1',
+        'Medium 2' => 'ããã«2',
+        'Medium 3' => 'ããã«3',
+        'Medium Movie' => 'ããã£ã¢ã åç»',
+        'Postcard' => 'ãã¬ã­',
+        'Small' => 'ã¹ã¢ãŒã«',
+        'Small 1' => 'ã¹ã¢ãŒã«1',
+        'Small 2' => 'ã¹ã¢ãŒã«2',
+        'Small 3' => 'ã¹ã¢ãŒã«3',
+        'Small Movie' => 'ã¹ã¢ãŒã«åç»',
+        'Widescreen' => 'ã¯ã€ãç»é¢',
+      },
+    },
+   'CanonImageType' => 'ã€ã¡ãŒãžã¿ã€ã',
+   'CanonImageWidth' => 'ç»åå¹
+',
+   'CanonModelID' => 'ã¢ãã«ID',
+   'Caption-Abstract' => 'è¡šé¡/èª¬æ',
+   'CaptionWriter' => 'ã­ã£ãã·ã§ã³äœæè
+',
+   'CasioImageSize' => 'ã«ã·ãªã€ã¡ãŒãžãµã€ãº',
+   'Categories' => 'ã«ããŽãªãŒ',
+   'Category' => 'ã«ããŽãªãŒ',
+   'CellLength' => 'ã»ã«é·',
+   'CellWidth' => 'ã»ã«å¹
+',
+   'CenterAFArea' => {
+      Description => 'äž­å€®AFãšãªã¢',
+      PrintConv => {
+        'Normal Zone' => 'ããŒãã«ãŸãŒã³',
+        'Wide Zone' => 'ã¯ã€ããŸãŒã³',
+      },
+    },
+   'CenterWeightedAreaSize' => {
+      Description => 'äž­å€®éç¹ãšãªã¢',
+      PrintConv => {
+        'Average' => 'å¹³å',
+      },
+    },
+   'CharTarget' => 'ç®çæå­',
+   'CharacterSet' => 'ã­ã£ã©ã¯ã¿ãŒã»ãã',
+   'ChromaBlurRadius' => 'åœ©åºŠãŒãååŸ',
+   'ChromaticAdaptation' => 'è²åœ©é å¿å',
+   'Chromaticity' => 'è²åºŠ',
+   'ChrominanceNR_TIFF_JPEG' => {
+      PrintConv => {
+        'High' => 'é«ã',
+        'Low' => 'ãœãã',
+        'Off' => 'ãªã',
+      },
+    },
+   'ChrominanceNoiseReduction' => {
+      PrintConv => {
+        'High' => 'é«ã',
+        'Low' => 'ãœãã',
+        'Off' => 'ãªã',
+      },
+    },
+   'City' => 'éœåž',
+   'ClassifyState' => 'åé¡ç¶æ
+',
+   'CleanFaxData' => 'çŽç²ãªFAXããŒã¿',
+   'ClipPath' => 'ã¯ãªãããã¹',
+   'CodedCharacterSet' => 'ã­ã£ã©ã¯ã¿ã»ããã³ãŒã',
+   'ColorAberrationControl' => {
+      Description => 'è²åå·®ã³ã³ãã­ãŒã«',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'ColorAdjustment' => 'è²èª¿æŽ',
+   'ColorAdjustmentMode' => {
+      Description => 'è²èª¿æŽã¢ãŒã',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'ColorBalance' => 'ã«ã©ãŒãã©ã³ã¹',
+   'ColorBalanceAdj' => {
+      Description => 'ã«ã©ãŒãã©ã³ã¹èª¿æŽ',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'ColorBalanceBlue' => 'ã«ã©ãŒãã©ã³ã¹é',
+   'ColorBalanceGreen' => 'ã«ã©ãŒãã©ã³ã¹ç·',
+   'ColorBalanceRed' => 'ã«ã©ãŒãã©ã³ã¹èµ€',
+   'ColorBoostData' => 'ã«ã©ãŒããŒã¹ãããŒã¿',
+   'ColorBoostLevel' => 'ã«ã©ãŒããŒã¹ãã¬ãã«1',
+   'ColorBoostType' => {
+      Description => 'ã«ã©ãŒããŒã¹ãã¿ã€ã',
+      PrintConv => {
+        'Nature' => 'èªç¶',
+        'People' => 'äººã
+',
+      },
+    },
+   'ColorBooster' => {
+      Description => 'ã«ã©ãŒããŒã¹ã¿ãŒ',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'ColorCalibrationMatrix' => 'ã«ã©ãŒã­ã£ãªãã¬ãŒã·ã§ã³ãããªãã¯ã¹ããŒãã«',
+   'ColorCharacterization' => 'ã«ã©ãŒç¹åŸŽæå',
+   'ColorControl' => 'ã«ã©ãŒã³ã³ãã­ãŒã«',
+   'ColorEffect' => {
+      Description => 'ã«ã©ãŒãšãã§ã¯ã',
+      PrintConv => {
+        'Black & White' => 'çœé»',
+        'Cool' => 'å·è²',
+        'Off' => 'ãªã',
+        'Sepia' => 'ã»ãã¢',
+        'Warm' => 'æè²',
+      },
+    },
+   'ColorFilter' => {
+      Description => 'ã«ã©ãŒãã£ã«ã¿ãŒ',
+      PrintConv => {
+        'Black & White' => 'çœé»',
+        'Blue' => 'é',
+        'Green' => 'ç·',
+        'Off' => 'ãªã',
+        'Pink' => 'ãã³ã¯',
+        'Purple' => 'çŽ«',
+        'Red' => 'èµ€',
+        'Sepia' => 'ã»ãã¢',
+        'Yellow' => 'é»è²',
+      },
+    },
+   'ColorGain' => 'ã«ã©ãŒã²ã€ã³',
+   'ColorHue' => 'è²çž',
+   'ColorInfo' => 'è²æ
+å ±',
+   'ColorMap' => 'ã«ã©ãŒããã',
+   'ColorMatrix' => 'ã«ã©ãŒãããªãã¯ã¹',
+   'ColorMatrix1' => 'ã«ã©ãŒãããªãã¯ã¹1',
+   'ColorMatrix2' => 'ã«ã©ãŒãããªãã¯ã¹2',
+   'ColorMatrixNumber' => 'ã«ã©ãŒãããªãã¯ã¹çªå·',
+   'ColorMode' => {
+      Description => 'ã«ã©ãŒã¢ãŒã',
+      PrintConv => {
+        'Autumn Leaves' => 'çŽ
+è',
+        'B & W' => 'çœé»',
+        'B&W' => 'çœé»',
+        'Black & White' => 'çœé»',
+        'Chrome' => 'ã¯ã­ãŒã ',
+        'Clear' => 'ã¯ãªã¢ãŒ',
+        'Deep' => 'ãã£ãŒã',
+        'Landscape' => 'é¢šæ¯',
+        'Light' => 'ã©ã€ã',
+        'Natural' => 'ããã¥ã©ã«',
+        'Natural color' => 'ããã¥ã©ã«ã«ã©ãŒ',
+        'Neutral' => 'ãã¥ãŒãã©ã«',
+        'Night Portrait' => 'äººç©å€æ¯',
+        'Night Scene' => 'å€æ¯',
+        'Night View' => 'ãã€ããã¥ãŒ',
+        'Night View/Portrait' => 'å€æ¯/å€æ¯ããŒãã¬ãŒã',
+        'Normal' => 'ããŒãã«',
+        'Off' => 'ãªã',
+        'Portrait' => 'ããŒãã¬ãŒã',
+        'Sepia' => 'ã»ãã¢',
+        'Solarization' => 'ãœã©ãªãŒãŒã·ã§ã³',
+        'Standard' => 'ã¹ã¿ã³ããŒã',
+        'Sunset' => 'å€æ¥',
+        'Vivid' => 'ãããã',
+        'Vivid color' => 'ããããã«ã©ãŒ',
+      },
+    },
+   'ColorMoireReduction' => {
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'ColorMoireReductionMode' => {
+      Description => 'è²ã¢ã¢ã¬ãªãã¯ã·ã§ã³',
+      PrintConv => {
+        'High' => 'é«ã',
+        'Low' => 'ãœãã',
+        'Off' => 'ãªã',
+      },
+    },
+   'ColorPalette' => 'ã«ã©ãŒãã¬ãã',
+   'ColorProfile' => {
+      Description => 'ã«ã©ãŒãã­ãã£ãŒã«',
+      PrintConv => {
+        'Embedded' => 'åãèŸŒã¿',
+        'Not Embedded' => 'åãèŸŒã¿ç¡ã',
+      },
+    },
+   'ColorRepresentation' => 'è²è¡šçŸ',
+   'ColorReproduction' => 'è²åçŸ',
+   'ColorResponseUnit' => 'è²å¿ç­åäœ',
+   'ColorSequence' => 'ã«ã©ãŒã·ãŒã±ã³ã¹',
+   'ColorSpace' => {
+      Description => 'è²ç©ºé',
+      PrintConv => {
+        'Monochrome' => 'ã¢ãããŒã³',
+        'Uncalibrated' => 'æªèª¿æŽ',
+      },
+    },
+   'ColorSpaceData' => 'ã«ã©ãŒã¹ããŒã¹ããŒã¿',
+   'ColorTable' => 'ã«ã©ãŒããŒãã«',
+   'ColorTemperature' => 'è²æž©åºŠ',
+   'ColorTone' => {
+      Description => 'ã«ã©ãŒããŒã³',
+      PrintConv => {
+        'Normal' => 'æšæº',
+      },
+    },
+   'ColorToneFaithful' => 'ã«ã©ãŒããŒã³å¿ å®èš­å®',
+   'ColorToneLandscape' => 'ã«ã©ãŒããŒã³é¢šæ¯',
+   'ColorToneNeutral' => 'ã«ã©ãŒããŒã³ãã¥ãŒãã©ã«',
+   'ColorTonePortrait' => 'ã«ã©ãŒããŒã³ããŒãã¬ãŒã',
+   'ColorToneStandard' => 'ã«ã©ãŒããŒã³ã¹ã¿ã³ããŒã',
+   'ColorToneUserDef1' => 'ã«ã©ãŒããŒã³ãŠãŒã¶èš­å®1',
+   'ColorToneUserDef2' => 'ã«ã©ãŒããŒã³ãŠãŒã¶èš­å®2',
+   'ColorToneUserDef3' => 'ã«ã©ãŒããŒã³ãŠãŒã¶èš­å®3',
+   'ColorantOrder' => 'çè²é ',
+   'ColorantTable' => 'çè²ããŒãã«',
+   'ColorimetricReference' => 'æ¯è²åæåç
+§',
+   'CommandDials' => {
+      Description => 'ã³ãã³ããŒãã€ã€ã«',
+      PrintConv => {
+        'Reversed (Main Aperture, Sub Shutter)' => 'ãªããŒã¹',
+        'Standard (Main Shutter, Sub Aperture)' => 'ããã©ã«ã',
+      },
+    },
+   'CommandDialsApertureSetting' => {
+      Description => 'ã³ãã³ããã€ã€ã«ã«ã¹ã¿ãã€ãº çµãèš­å®',
+      PrintConv => {
+        'Aperture Ring' => 'çµããªã³ã°',
+        'Sub-command Dial' => 'ãµãã³ã³ãã­ãŒã«ãã€ã€ã«',
+      },
+    },
+   'CommandDialsChangeMainSub' => {
+      Description => 'ã³ãã³ããã€ã€ã«ã«ã¹ã¿ãã€ãº ã¡ã€ã³/ãµãå€æŽ',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'CommandDialsMenuAndPlayback' => {
+      Description => 'ã³ãã³ããã€ã€ã«ã«ã¹ã¿ãã€ãº ã¡ãã¥ãŒãšåç',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'CommandDialsReverseRotation' => {
+      Description => 'ã³ãã³ããã€ã€ã«ã«ã¹ã¿ãã€ãº åè»¢ä¿æ',
+      PrintConv => {
+        'No' => 'ããã',
+        'Yes' => 'ã¯ã',
+      },
+    },
+   'CommanderChannel' => 'ã³ãã³ããŒã¢ãŒã ãã£ã³ãã«',
+   'CommanderGroupAManualOutput' => 'ã³ãã³ããŒã¢ãŒã ã°ã«ãŒãA M è£æ­£',
+   'CommanderGroupAMode' => {
+      Description => 'ã³ãã³ããŒã¢ãŒã ã°ã«ãŒãA ã¢ãŒã',
+      PrintConv => {
+        'Auto Aperture' => 'èªåçµãïŒAAïŒ',
+        'Manual' => 'ããã¥ã¢ã«',
+        'Off' => 'ãªã',
+      },
+    },
+   'CommanderGroupA_TTL-AAComp' => 'ã³ãã³ããŒã¢ãŒã å
+èµãã©ãã·ã¥ TTL/AA è£æ­£',
+   'CommanderGroupBManualOutput' => 'ã³ãã³ããŒã¢ãŒã ã°ã«ãŒãB M è£æ­£',
+   'CommanderGroupBMode' => {
+      Description => 'ã³ãã³ããŒã¢ãŒã ã°ã«ãŒãB ã¢ãŒã',
+      PrintConv => {
+        'Auto Aperture' => 'èªåçµãïŒAAïŒ',
+        'Manual' => 'ããã¥ã¢ã«',
+        'Off' => 'ãªã',
+      },
+    },
+   'CommanderGroupB_TTL-AAComp' => 'ã³ãã³ããŒã¢ãŒã ã°ã«ãŒãB TTL/AA è£æ­£',
+   'CommanderInternalFlash' => {
+      Description => 'ã³ãã³ããŒã¢ãŒã å
+èµãã©ãã·ã¥ ã¢ãŒã',
+      PrintConv => {
+        'Manual' => 'ããã¥ã¢ã«',
+        'Off' => 'ãªã',
+      },
+    },
+   'CommanderInternalManualOutput' => 'ã³ãã³ããŒã¢ãŒã å
+èµãã©ãã·ã¥ M è£æ­£',
+   'CommanderInternalTTLComp' => 'ã³ãã³ããŒã¢ãŒã å
+èµãã©ãã·ã¥ TTL è£æ­£',
+   'Comment' => 'ã³ã¡ã³ã',
+   'Compilation' => {
+      PrintConv => {
+        'No' => 'ããã',
+        'Yes' => 'ã¯ã',
+      },
+    },
+   'ComponentsConfiguration' => 'åæ§æèŠçŽ ã®æå³',
+   'CompressedBitsPerPixel' => 'ç»åå§çž®ã¢ãŒã',
+   'CompressedImageSize' => 'å§çž®ç»åãµã€ãº',
+   'Compression' => {
+      Description => 'å§çž®èšç»',
+      PrintConv => {
+        'JPEG' => 'JPEGå§çž®ç',
+        'JPEG (old-style)' => 'JPEG(å€ãåœ¢åŒ)',
+        'None' => 'ç¡ã',
+        'Uncompressed' => 'éå§çž®',
+      },
+    },
+   'CompressionRatio' => 'å§çž®ç',
+   'CompressionType' => {
+      PrintConv => {
+        'None' => 'ç¡ã',
+      },
+    },
+   'ConditionalFEC' => 'ãã©ãã·ã¥é²åºè£æ­£',
+   'ConnectionSpaceIlluminant' => 'æ¥ç¶ã¹ããŒã¹å
+æº',
+   'ConsecutiveBadFaxLines' => 'é£ç¶çã«ç²æªãªFAXç·',
+   'Contact' => 'é£çµ¡',
+   'ContentLocationCode' => 'å
+å®¹äœçœ®ã³ãŒã',
+   'ContentLocationName' => 'å
+å®¹äœçœ®å',
+   'ContinuousDrive' => {
+      Description => 'ãã©ã€ãã¢ãŒã',
+      PrintConv => {
+        'Continuous' => 'é£ç¶æ®åœ±',
+        'Continuous, High' => 'é£åïŒHighïŒ',
+        'Continuous, Low' => 'é£åïŒLowïŒ',
+        'Continuous, Speed Priority' => 'é«éé£å',
+        'Movie' => 'åç»',
+        'Single' => 'ïŒã³ãæ®åœ±',
+      },
+    },
+   'ContinuousShootingSpeed' => {
+      Description => 'é£ç¶æ®åœ±éåºŠ',
+      PrintConv => {
+        'Disable' => 'ããªã',
+        'Enable' => 'ãã',
+      },
+    },
+   'ContinuousShotLimit' => {
+      Description => 'é£ç¶æ®åœ±æã®æ®åœ±ææ°å¶é',
+      PrintConv => {
+        'Disable' => 'ããªã',
+        'Enable' => 'ãã',
+      },
+    },
+   'Contrast' => {
+      Description => 'ã³ã³ãã©ã¹ã',
+      PrintConv => {
+        'Film Simulation' => 'ãã£ã«ã ã·ãã¥ã¬ãŒã·ã§ã³',
+        'High' => 'ããŒã',
+        'Low' => 'ãœãã',
+        'Med High' => 'å°ãé«ã',
+        'Med Low' => 'å°ãäœã',
+        'Medium High' => 'å°ãé«ã',
+        'Medium Low' => 'å°ãäœã',
+        'Normal' => 'ã¹ã¿ã³ããŒã',
+        'Very High' => 'ããªãé«ã',
+        'Very Low' => 'ããªãäœã',
+      },
+    },
+   'ContrastCurve' => 'ã³ã³ãã©ã¹ãã«ãŒã',
+   'ContrastFaithful' => 'ã³ã³ãã©ã¹ãå¿ å®èš­å®',
+   'ContrastLandscape' => 'ã³ã³ãã©ã¹ãé¢šæ¯',
+   'ContrastMonochrome' => 'ã³ã³ãã©ã¹ãã¢ãã¯ã­',
+   'ContrastNeutral' => 'ã³ã³ãã©ã¹ããã¥ãŒãã©ã«',
+   'ContrastPortrait' => 'ã³ã³ãã©ã¹ãããŒãã¬ãŒã',
+   'ContrastSetting' => 'ã³ã³ãã©ã¹ãèš­å®',
+   'ContrastStandard' => 'ã³ã³ãã©ã¹ãã¹ã¿ã³ããŒã',
+   'ContrastUserDef1' => 'ã³ã³ãã©ã¹ããŠãŒã¶èš­å®1',
+   'ContrastUserDef2' => 'ã³ã³ãã©ã¹ããŠãŒã¶èš­å®2',
+   'ContrastUserDef3' => 'ã³ã³ãã©ã¹ããŠãŒã¶èš­å®3',
+   'ControlMode' => {
+      Description => 'ã³ã³ãã­ãŒã«ã¢ãŒã',
+      PrintConv => {
+        'Camera Local Control' => 'ã«ã¡ã©ã­ãŒã«ã«ã³ã³ãã­ãŒã«',
+        'Computer Remote Control' => 'ã³ã³ãã¥ãŒã¿ãªã¢ãŒãã³ã³ãã­ãŒã«',
+        'n/a' => 'è©²åœç¡ã',
+      },
+    },
+   'ConversionLens' => {
+      Description => 'ã³ã³ããŒãžã§ã³ã¬ã³ãº',
+      PrintConv => {
+        'Macro' => 'ãã¯ã­',
+        'Off' => 'ãªã',
+        'Telephoto' => 'ãã¬ãã©ã',
+        'Wide' => 'ã¯ã€ã',
+      },
+    },
+   'Converter' => 'ã³ã³ããŒã¿ãŒ',
+   'Copyright' => 'çæš©ææè
+',
+   'CopyrightNotice' => 'èäœæš©è¡šç€º',
+   'CopyrightStatus' => {
+      PrintConv => {
+        'Unknown' => 'äžæ',
+      },
+    },
+   'CoringFilter' => 'ã³ã¢ãªã³ã°ãã£ã«ã¿',
+   'CoringValues' => 'ã³ã¢ãªã³ã°å€',
+   'Country' => 'åœå',
+   'Country-PrimaryLocationCode' => 'ISOåœã³ãŒã',
+   'Country-PrimaryLocationName' => 'åœ',
+   'CreateDate' => 'ããžã¿ã«ããŒã¿äœææ¥æ',
+   'CreationDate' => 'äœææ¥æ',
+   'Creator' => 'è£œäœè
+',
+   'CreatorAddress' => 'ã¯ãªãšãŒã¿ãŒã-ãäœæ',
+   'CreatorCity' => 'ã¯ãªãšãŒã¿ãŒã-ãè¡',
+   'CreatorCountry' => 'ã¯ãªãšãŒã¿ãŒã-ãåœ',
+   'CreatorPostalCode' => 'ã¯ãªãšãŒã¿ãŒã-ãéµäŸ¿çªå·',
+   'CreatorRegion' => 'ã¯ãªãšãŒã¿ãŒã-ãåœ/å·',
+   'CreatorWorkEmail' => 'ã¯ãªãšãŒã¿ãŒã-ãé»å­ã¡ãŒã«',
+   'CreatorWorkTelephone' => 'ã¯ãªãšãŒã¿ãŒã-ãé»è©±çªå·',
+   'CreatorWorkURL' => 'ã¯ãªãšãŒã¿ãŒã-ãWEBãµã€ã',
+   'Credit' => 'ãã­ãã€ããŒ',
+   'CropActive' => {
+      PrintConv => {
+        'No' => 'ããã',
+        'Yes' => 'ã¯ã',
+      },
+    },
+   'CropData' => 'ã¯ã­ããããŒã¿',
+   'CropHeight' => 'æçµé«ã',
+   'CropHiSpeed' => 'ãã€ã¹ããŒãã¯ã­ãã',
+   'CropLeft' => 'éå§ãªãã»ããX',
+   'CropTop' => 'éå§ãªãã»ããY',
+   'CropWidth' => 'æçµå¹
+',
+   'CurrentICCProfile' => 'ã«ã¬ã³ãICCãã­ãã¡ã€ã«',
+   'CurrentPreProfileMatrix' => 'ã«ã¬ã³ããã­ãã¡ã€ã«ãããªãã¯ã¹',
+   'Curves' => {
+      Description => 'ã«ãŒã',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'Custom1' => 'ã«ã¹ã¿ã 1',
+   'Custom2' => 'ã«ã¹ã¿ã 2',
+   'CustomRendered' => {
+      Description => 'ã«ã¹ã¿ã ç»ååŠç',
+      PrintConv => {
+        'Custom' => 'ã«ã¹ã¿ã åŠç',
+        'Normal' => 'æšæºåŠç',
+      },
+    },
+   'CustomSaturation' => 'ã«ã¹ã¿ã åœ©åºŠ',
+   'D-LightingHQ' => {
+      Description => 'Dã©ã€ãã£ã³ã°HQ',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'D-LightingHQColorBoost' => 'Dã©ã€ãã£ã³ã°HQã«ã©ãŒããŒã¹ã',
+   'D-LightingHQHighlight' => 'Dã©ã€ãã£ã³ã°HQãã€ã©ã€ã',
+   'D-LightingHQSelected' => {
+      Description => 'Dã©ã€ãã£ã³ã°HQéžæ',
+      PrintConv => {
+        'No' => 'ããã',
+        'Yes' => 'ã¯ã',
+      },
+    },
+   'D-LightingHQShadow' => 'Dã©ã€ãã£ã³ã°HQã·ã£ããŠ',
+   'D-LightingHS' => {
+      Description => 'Dã©ã€ãã£ã³ã°HS',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'D-LightingHSAdjustment' => 'Dã©ã€ãã£ã³ã°HSèª¿æŽ',
+   'D-LightingHSColorBoost' => 'Dã©ã€ãã£ã³ã°HSã«ã©ãŒããŒã¹ã',
+   'DECPosition' => {
+      Description => 'DECäœçœ®',
+      PrintConv => {
+        'Contrast' => 'ã³ã³ãã©ã¹ã',
+        'Exposure' => 'é²åº',
+        'Filter' => 'ãã£ã«ã¿ãŒ',
+        'Saturation' => 'åœ©åºŠ',
+      },
+    },
+   'DNGBackwardVersion' => 'DNGããã¯ã¯ãŒãããŒãžã§ã³',
+   'DNGLensInfo' => 'ã¬ã³ãºæ
+å ±',
+   'DNGVersion' => 'DNGããŒãžã§ã³',
+   'DSPFirmwareVersion' => 'DSPãã¡ãŒã ãŠãšã¢ããŒãžã§ã³',
+   'DataCompressionMethod' => 'ããŒã¿å§çž®ã¢ã«ãŽãªãºã  ãã­ãã€ããŒ/ãªãŒããŒ',
+   'DataDump' => 'ããŒã¿ãã³ã',
+   'DataImprint' => {
+      Description => 'ããŒã¿ã€ã³ããªã³ã',
+      PrintConv => {
+        'None' => 'ç¡ã',
+        'Text' => 'ãã­ã¹ã',
+      },
+    },
+   'DataType' => 'æ¥ä»å',
+   'Date' => 'æ¥ä»',
+   'DateCreated' => 'äœææ¥ä»',
+   'DateDisplayFormat' => {
+      Description => 'æ¥ä»åœ¢åŒ',
+      PrintConv => {
+        'D/M/Y' => 'æ¥/æ/å¹Ž',
+        'M/D/Y' => 'æ/æ¥/å¹Ž',
+        'Y/M/D' => 'å¹Ž/æ/æ¥',
+      },
+    },
+   'DateSent' => 'çºéæ¥ä»',
+   'DateStampMode' => {
+      Description => 'æ¥ä»ã¹ã¿ã³ãã¢ãŒã',
+      PrintConv => {
+        'Date' => 'æ¥ä»',
+        'Off' => 'ãªã',
+      },
+    },
+   'DateTime' => 'ãã¡ã€ã«äœææ¥æ',
+   'DateTimeOriginal' => 'ãªãªãžãã«ããŒã¿äœææ¥æ',
+   'DaylightSavings' => {
+      Description => 'å€æé',
+      PrintConv => {
+        'No' => 'ãªã',
+        'Yes' => 'ãªã³',
+      },
+    },
+   'DefaultCropOrigin' => 'ããã©ã«ãååãåºç¹',
+   'DefaultCropSize' => 'ããã©ã«ãååããµã€ãº',
+   'DefaultScale' => 'ããã©ã«ãã¹ã±ãŒã«',
+   'DeletedImageCount' => 'åé€ã€ã¡ãŒãžã«ãŠã³ã',
+   'Description' => 'èª¬æ',
+   'Destination' => 'å®å
+',
+   'DestinationCity' => 'ç®çå°',
+   'DestinationCityCode' => 'ç®çå°ã³ãŒã',
+   'DestinationDST' => {
+      Description => 'ç®çå°DST',
+      PrintConv => {
+        'No' => 'ããã',
+        'Yes' => 'ã¯ã',
+      },
+    },
+   'DevelopmentDynamicRange' => 'é²åãã€ãããã¯ã¬ã³ãž',
+   'DeviceAttributes' => 'æ©åšå±æ§',
+   'DeviceManufacturer' => 'æ©åšã¡ãŒã«ãŒ',
+   'DeviceMfgDesc' => 'æ©åšã¡ãŒã«ãŒèª¬æ',
+   'DeviceModel' => 'æ©åšã¢ãã«',
+   'DeviceModelDesc' => 'æ©åšã¢ãã«èª¬æ',
+   'DeviceSettingDescription' => 'ããã€ã¹èš­å®ã®èª¬æ',
+   'DialDirectionTvAv' => {
+      Description => 'Tv/Avå€èš­å®æã®ãã€ã€ã«åè»¢',
+      PrintConv => {
+        'Normal' => 'éåžž',
+        'Reversed' => 'èš­å®æ¹åãåè»¢',
+      },
+    },
+   'DigitalCreationDate' => 'ããžã¿ã«äœææ¥ä»',
+   'DigitalCreationTime' => 'ããžã¿ã«äœææé',
+   'DigitalGEM' => 'ããžã¿ã«GEM',
+   'DigitalICE' => 'ããžã¿ã«ICE',
+   'DigitalROC' => 'ããžã¿ã«ROC',
+   'DigitalZoom' => {
+      Description => 'ããžã¿ã«ãºãŒã ',
+      PrintConv => {
+        'None' => 'ç¡ã',
+        'Off' => 'ãªã',
+        'Other' => 'æªç¢ºèª',
+      },
+    },
+   'DigitalZoomOn' => {
+      Description => 'ããžã¿ã«ãºãŒã ãªã³',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'DigitalZoomRatio' => 'ããžã¿ã«ãºãŒã æ¯ç',
+   'Directory' => 'ãã¡ã€ã«ã®å Žæ',
+   'DirectoryIndex' => 'ãã£ã¬ã¯ããªçŽ¢åŒ',
+   'DirectoryNumber' => 'ãã£ã¬ã¯ããªçªå·',
+   'DisplayAperture' => 'çµãè¡šç€º',
+   'DisplaySize' => {
+      PrintConv => {
+        'Normal' => 'æšæº',
+      },
+    },
+   'DistortionCorrection' => {
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'DistortionCorrection2' => {
+      Description => 'æ­ªæ²è£æ­£ç·šé',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'DjVuVersion' => 'DjVuããŒãžã§ã³',
+   'DocumentHistory' => 'ææžå±¥æ­Ž',
+   'DocumentName' => 'ãã­ã¥ã¡ã³ãå',
+   'DocumentNotes' => 'ææžããŒã',
+   'DotRange' => 'ãããç¯å²',
+   'DriveMode' => {
+      Description => 'ãã©ã€ãã¢ãŒã',
+      PrintConv => {
+        'Bracketing' => 'ãã©ã±ãã',
+        'Burst' => 'é«éé£å°',
+        'Continuous' => 'é£ç¶æ®åœ±',
+        'Continuous High' => 'é£å° (Hi)',
+        'Continuous Shooting' => 'é£ç¶æ®åœ±',
+        'HS continuous' => 'HSé£å',
+        'Interval' => 'ã€ã³ã¿ãŒãã«',
+        'Multiple Exposure' => 'è€æ°ã®é²åº',
+        'No Timer' => 'ã¿ã€ããŒç¡ã',
+        'Off' => 'ãªã',
+        'Remote Control' => 'ãªã¢ã³ã³',
+        'Remote Control (3 s delay)' => 'ãªã¢ã³ã³ (3ç§åŸã¬ãªãŒãº)',
+        'Self-timer' => 'ã»ã«ãã¿ã€ããŒ',
+        'Self-timer (12 s)' => 'ã»ã«ãã¿ã€ããŒ (12ç§)',
+        'Self-timer (2 s)' => 'ã»ã«ãã¿ã€ããŒ (2ç§)',
+        'Self-timer Operation' => 'ã»ã«ãã¿ã€ããŒ',
+        'Shutter Button' => 'ã·ã£ãã¿ãŒãã¿ã³',
+        'Single' => 'ïŒã³ãæ®åœ±',
+        'Single Exposure' => 'ã·ã³ã°ã«é²åº',
+        'Single Frame' => 'ïŒã³ãæ®åœ±',
+        'Single Shot' => 'ïŒã³ãæ®åœ±',
+        'Single-frame' => '1ã³ãæ®åœ±',
+        'Single-frame Shooting' => 'ïŒã³ãæ®åœ±',
+        'UHS continuous' => 'UHSé£å',
+      },
+    },
+   'DriveMode2' => {
+      Description => 'å€éé²å
+',
+      PrintConv => {
+        'Single-frame' => 'ïŒã³ãæ®åœ±',
+      },
+    },
+   'DynamicAFArea' => {
+      Description => 'ãã€ãããã¯AFãšãªã¢',
+      PrintConv => {
+        '21 Points' => '21ç¹',
+        '51 Points' => '51ç¹',
+        '51 Points (3D-tracking)' => '51ç¹ïŒ3Dãã©ãã­ã³ã°ïŒ',
+        '9 Points' => '9ç¹',
+      },
+    },
+   'DynamicRange' => {
+      Description => 'ãã€ãããã¯ã¬ã³ãž',
+      PrintConv => {
+        'Standard' => 'ã¹ã¿ã³ããŒã',
+        'Wide' => 'ã¯ã€ã',
+      },
+    },
+   'DynamicRangeExpansion' => {
+      Description => 'ãã€ãããã¯ã¬ã³ãžæ¡å€§',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'DynamicRangeOptimizer' => {
+      Description => 'Dã¬ã³ãžãªããã£ãã€ã¶ãŒ',
+      PrintConv => {
+        'Advanced Auto' => 'ã¢ããã³ã¹ãªãŒã',
+        'Advanced Lv1' => 'ã¢ããã³ã¹Lv1',
+        'Advanced Lv2' => 'ã¢ããã³ã¹Lv2',
+        'Advanced Lv3' => 'ã¢ããã³ã¹Lv3',
+        'Advanced Lv4' => 'ã¢ããã³ã¹Lv4',
+        'Advanced Lv5' => 'ã¢ããã³ã¹Lv5',
+        'Auto' => 'ãªãŒã',
+        'Off' => 'ãªã',
+        'Standard' => 'ã¹ã¿ã³ããŒã',
+      },
+    },
+   'DynamicRangeSetting' => 'ãã€ãããã¯ã¬ã³ãžèš­å®',
+   'E-DialInProgram' => {
+      Description => 'é»å­ãã€ã€ã«ãã­ã°ã©ã ',
+      PrintConv => {
+        'P Shift' => 'Pã·ãã',
+        'Tv or Av' => 'TvãAv',
+      },
+    },
+   'ETTLII' => {
+      PrintConv => {
+        'Average' => 'å¹³å',
+        'Evaluative' => 'è©äŸ¡',
+      },
+    },
+   'EVStepInfo' => 'EVã¹ãããæ
+å ±',
+   'EVStepSize' => {
+      Description => 'EVã¹ããã',
+      PrintConv => {
+        '1/2 EV' => '1/2ã¹ããã',
+        '1/3 EV' => '1/3ã¹ããã',
+      },
+    },
+   'EVSteps' => {
+      Description => 'é²åºã¹ããã',
+      PrintConv => {
+        '1/2 EV Steps' => '1/2 EVã¹ããã',
+        '1/3 EV Steps' => '1/3 EVã¹ããã',
+      },
+    },
+   'EasyExposureCompensation' => {
+      Description => 'ç°¡åãªé²åºè£æ­£',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+        'On (auto reset)' => 'ãªã³ïŒèªåãªã»ããïŒ',
+      },
+    },
+   'EasyMode' => {
+      Description => 'ç°¡åã¢ãŒã',
+      PrintConv => {
+        'Aquarium' => 'æ°Žæé€š',
+        'Beach' => 'ããŒã',
+        'Black & White' => 'çœé»',
+        'Color Accent' => 'ã«ã©ãŒã¢ã¯ã»ã³ã',
+        'Color Swap' => 'ã¹ã€ããã«ã©ãŒ',
+        'Digital Macro' => 'ããžã¿ã«ãã¯ã­',
+        'Fast shutter' => 'é«éã·ã£ãã¿ãŒ',
+        'Fireworks' => 'è±ç«',
+        'Flash Off' => 'ãã©ãã·ã¥ãªã',
+        'Foliage' => 'è',
+        'Full auto' => 'ãã«ãªãŒã',
+        'Gray Scale' => 'ã°ã¬ãŒã¹ã±ãŒã«',
+        'ISO 3200' => 'ISO3200',
+        'Indoor' => 'å®€å
+',
+        'Kids & Pets' => 'ã­ããºïŒããã',
+        'Landscape' => 'é¢šæ¯',
+        'Long Shutter' => 'é·ç§ã·ã£ãã¿ãŒ',
+        'Macro' => 'ãã¯ã­',
+        'Manual' => 'ããã¥ã¢ã«',
+        'My Colors' => 'ã¯ã³ãã€ã³ãã«ã©ãŒ',
+        'Neutral' => 'ãã¥ãŒãã©ã«',
+        'Night' => 'å€æ¯',
+        'Night Scene' => 'å€æ¯',
+        'Night Snapshot' => 'ãã€ãã¹ããã',
+        'Pan focus' => 'ãã³ãã©ãŒã«ã¹',
+        'Portrait' => 'ããŒãã¬ãŒã',
+        'Sepia' => 'ã»ãã¢',
+        'Slow shutter' => 'ã¹ã­ãŒã·ã£ãã¿ãŒ',
+        'Snow' => 'ã¹ããŒ',
+        'Sports' => 'ã¹ããŒã',
+        'Still Image' => 'éæ­¢ç»å',
+        'Sunset' => 'å€çŒã',
+        'Super Macro' => 'ã¹ãŒããŒãã¯ã­',
+        'Underwater' => 'æ°Žäž­',
+        'Vivid' => 'ãããã',
+      },
+    },
+   'EdgeNoiseReduction' => {
+      Description => 'ãšããžãã€ãºãªãã¯ã·ã§ã³',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'EditStatus' => 'ç·šéç¶æ
+',
+   'EditorialUpdate' => {
+      Description => 'æŽæ°ç·šé',
+      PrintConv => {
+        'Additional language' => 'è¿œå èšèª',
+      },
+    },
+   'EffectiveLV' => 'å¹æã¬ãã«',
+   'Emphasis' => {
+      PrintConv => {
+        'None' => 'ç¡ã',
+      },
+    },
+   'EncodingProcess' => 'JPEGã®ç¬Šå·ååŠç',
+   'EndPoints' => 'æ«ç«¯',
+   'EnhanceDarkTones' => {
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'Enhancement' => {
+      Description => 'åŒ·åºŠ',
+      PrintConv => {
+        'Blue' => 'é',
+        'Flesh Tones' => 'èèª¿',
+        'Green' => 'ç·',
+        'Off' => 'ãªã',
+        'Red' => 'èµ€',
+      },
+    },
+   'Enhancer' => 'å¢å€§å€2',
+   'EnhancerValues' => 'å¢å€§å€',
+   'EnvelopeNumber' => 'ãšã³ãã­ãŒãæ°',
+   'EnvelopePriority' => {
+      Description => 'ãšã³ãã­ãŒãåªå
+åºŠ',
+      PrintConv => {
+        '0 (reserved)' => '0 (å°æ¥æ¡åŒµçš)',
+        '1 (most urgent)' => '1 (é«ãç·æ¥æ§)',
+        '5 (normal urgency)' => '5 (æ®éã®ç·æ¥æ§)',
+        '8 (least urgent)' => '8 (äœãç·æ¥æ§)',
+        '9 (user-defined priority)' => '9 (ãŠãŒã¶å®çŸ©åªå
+åºŠ)',
+      },
+    },
+   'EnvelopeRecordVersion' => 'ãšã³ãã­ãŒãã¬ã³ãŒãããŒãžã§ã³',
+   'EpsonImageHeight' => 'ãšããœã³ç»åé«',
+   'EpsonImageWidth' => 'ãšããœã³ç»åå¹
+',
+   'EpsonSoftware' => 'ãšããœã³ãœãããŠã§ã¢',
+   'EquipmentVersion' => 'ã€ã¯ã€ããã¡ã³ãããŒãžã§ã³',
+   'ExcursionTolerance' => 'æ¯å¹
+èš±å®¹ç¯å²',
+   'ExifCameraInfo' => 'Exifã«ã¡ã©æ
+å ±',
+   'ExifImageHeight' => 'ç»åé«ã',
+   'ExifImageWidth' => 'ç»åå¹
+',
+   'ExifOffset' => 'Exif IFDãžã®ãã€ã³ã¿',
+   'ExifToolVersion' => 'ExifToolããŒãžã§ã³',
+   'ExifVersion' => 'ExifããŒãžã§ã³',
+   'ExpandFilm' => 'æ¡åŒµãã€ã«ã ',
+   'ExpandFilterLens' => 'æ¡åŒµã¬ã³ãºãã£ã«ã¿ãŒ',
+   'ExpandFlashLamp' => 'æ¡åŒµãã©ãã·ã¥ã©ã³ã',
+   'ExpandLens' => 'æ¡åŒµã¬ã³ãº',
+   'ExpandScanner' => 'æ¡åŒµã¹ã­ã£ããŒ',
+   'ExpandSoftware' => 'æ¡åŒµãœãã',
+   'ExpirationDate' => 'æå¹æ¥ä»',
+   'ExpirationTime' => 'æå¹æé',
+   'Exposure' => 'é²åº',
+   'ExposureBracketStepSize' => 'é²åºãã©ã±ããã¹ããããµã€ãº',
+   'ExposureBracketValue' => 'é²åºãã©ã±ããå€',
+   'ExposureCompStepSize' => {
+      Description => 'é²åºè£æ­£/ãã¡ã€ã³ãã¥ãŒã³',
+      PrintConv => {
+        '1 EV' => '1ã¹ããã',
+        '1/2 EV' => '1/2ã¹ããã',
+        '1/3 EV' => '1/3ã¹ããã',
+      },
+    },
+   'ExposureCompensation' => 'é²åºè£æ­£å€',
+   'ExposureControlStepSize' => {
+      Description => 'é²åºå¶åŸ¡ã®EVã¹ããã',
+      PrintConv => {
+        '1 EV' => '1ã¹ããã',
+        '1/2 EV' => '1/2ã¹ããã',
+        '1/3 EV' => '1/3ã¹ããã',
+      },
+    },
+   'ExposureDelayMode' => {
+      Description => 'é²åºé
+å»¶ã¢ãŒã',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'ExposureDifference' => 'é²åºå·®',
+   'ExposureIndex' => 'é²åºææš',
+   'ExposureLevelIncrements' => {
+      Description => 'é²åºå¶åŸ¡ã®EVã¹ããã',
+      PrintConv => {
+        '1-stop set, 1/3-stop comp.' => 'èš­å®1 é²åºè£æ­£1/3',
+        '1/2 Stop' => '1/2ã¹ããã',
+        '1/2-stop set, 1/2-stop comp.' => 'èš­å®1/2 é²åºè£æ­£1/2',
+        '1/3 Stop' => '1/3ã¹ããã',
+        '1/3-stop set, 1/3-stop comp.' => 'èš­å®1/3 é²åºè£æ­£1/3',
+      },
+    },
+   'ExposureMode' => {
+      Description => 'é²å
+ã¢ãŒã',
+      PrintConv => {
+        'Aperture Priority' => 'çµãåªå
+',
+        'Aperture-priority AE' => 'çµãåªå
+',
+        'Auto' => 'èªåé²åº',
+        'Auto bracket' => 'ãªãŒããã©ã±ãã',
+        'Bulb' => 'ãã«ã',
+        'Landscape' => 'é¢šæ¯',
+        'Manual' => 'ããã¥ã¢ã«é²åº',
+        'Night Scene / Twilight' => 'å€æ¯',
+        'Portrait' => 'ããŒãã¬ãŒã',
+        'Program' => 'ãã­ã°ã©ã ',
+        'Program AE' => 'ãã­ã°ã©ã AE',
+        'Program-shift' => 'ãã­ã°ã©ã ã·ãã',
+        'Shutter Priority' => 'ã·ã£ãã¿ãŒåªå
+',
+        'Shutter speed priority AE' => 'ã·ã£ãã¿ãŒåªå
+',
+      },
+    },
+   'ExposureModeInManual' => {
+      Description => 'ããã¥ã¢ã«é²åºæã®æž¬å
+ã¢ãŒã',
+      PrintConv => {
+        'Center-weighted average' => 'äž­å€®éç¹',
+        'Evaluative metering' => 'è©äŸ¡æž¬å
+',
+        'Partial metering' => 'éšå',
+        'Specified metering mode' => 'èš­å®æž¬å
+ã¢ãŒã',
+        'Spot metering' => 'ã¹ããã',
+      },
+    },
+   'ExposureProgram' => {
+      Description => 'é²åºãã­ã°ã©ã ',
+      PrintConv => {
+        'Action (High speed)' => 'ã¹ããŒãã¢ãŒã(é«éã·ã£ãã¿ãŒåªå
+)',
+        'Aperture Priority' => 'çµãåªå
+',
+        'Aperture-priority AE' => 'çµãåªå
+',
+        'Bulb' => 'ãã«ã',
+        'Creative (Slow speed)' => 'ã¯ãªãšã€ãã£ããã­ã°ã©ã (è¢«åçæ·±åºŠåªå
+)',
+        'Landscape' => 'é¢šæ¯ã¢ãŒã',
+        'Manual' => 'ããã¥ã¢ã«',
+        'Not Defined' => 'æªå®çŸ©',
+        'Portrait' => 'ããŒãã¬ãŒãã¢ãŒã',
+        'Program' => 'ãã­ã°ã©ã ',
+        'Program AE' => 'ããŒãã«ãã­ã°ã©ã ',
+        'Shutter Priority' => 'ã·ã£ãã¿ãŒåªå
+',
+        'Shutter speed priority AE' => 'ã·ã£ãã¿ãŒåªå
+',
+      },
+    },
+   'ExposureTime' => 'é²åºæé',
+   'ExposureTime2' => 'é²åºæé 2',
+   'ExposureWarning' => {
+      Description => 'é²åºè­Šå',
+      PrintConv => {
+        'Bad exposure' => 'é²åºå€±æ',
+        'Good' => 'é©æ­£',
+      },
+    },
+   'ExtendedWBDetect' => {
+      Description => 'å»¶é·WBæ€åº',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'Extender' => 'ãšã¯ã¹ãã³ããŒ',
+   'ExtenderFirmwareVersion' => 'ãšã¯ã¹ãã³ããŒãã¡ãŒã ãŠã§ã¢ããŒãžã§ã³',
+   'ExtenderModel' => 'ãšã¯ã¹ãã³ããŒã¢ãã«',
+   'ExtenderSerialNumber' => 'ãšã¯ã¹ãã³ããŒã·ãªã¢ã«çªå·',
+   'ExternalFlash' => {
+      Description => 'å€ä»ãã©ãã·ã¥',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'ExternalFlashAE1' => 'å€ä»ãã©ãã·ã¥AE1ïŒ',
+   'ExternalFlashAE1_0' => 'å€ä»ãã©ãã·ã¥AE1(0)ïŒ',
+   'ExternalFlashAE2' => 'å€ä»ãã©ãã·ã¥AE2ïŒ',
+   'ExternalFlashAE2_0' => 'å€ä»ãã©ãã·ã¥AE2(0)ïŒ',
+   'ExternalFlashBounce' => {
+      Description => 'å€ä»ãã©ãã·ã¥ããŠã³ã¹',
+      PrintConv => {
+        'Bounce' => 'ããŠã³ã¹',
+        'Bounce or Off' => 'ããŠã³ã¹ããªã',
+        'Direct' => 'ãã€ã¬ã¯ã',
+        'No' => 'ããã',
+        'Yes' => 'ã¯ã',
+        'n/a' => 'è©²åœç¡ã',
+      },
+    },
+   'ExternalFlashExposureComp' => {
+      Description => 'å€ä»ã¹ãã­ãé²åºè£æ­£',
+      PrintConv => {
+        'n/a' => 'æªèš­å®ïŒãªãããªãŒãã¢ãŒãïŒ',
+        'n/a (Manual Mode)' => 'æªèš­å®ïŒããã¥ã¢ã«ã¢ãŒãïŒ',
+      },
+    },
+   'ExternalFlashFlags' => 'å€ä»ãã©ãã·ã¥ãã©ã°',
+   'ExternalFlashGuideNumber' => 'å€ä»ãã©ãã·ã¥ã¬ã€ããã³ããŒïŒ',
+   'ExternalFlashMode' => {
+      Description => 'å€ä»ãã©ãã·ã¥ã¢ãŒã',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On, Auto' => 'ãªã³ããªãŒã',
+        'On, Contrast-control Sync' => 'ãªã³ãå
+éæ¯å¶åŸ¡ã·ã³ã¯ã­',
+        'On, Flash Problem' => 'ãªã³ããã©ãã·ã¥ã®åé¡ïŒ',
+        'On, High-speed Sync' => 'ãªã³ããã€ã¹ããŒãã·ã³ã¯ã­',
+        'On, Manual' => 'ãªã³ãããã¥ã¢ã«',
+        'On, P-TTL Auto' => 'ãªã³ãP-TTLãªãŒã',
+        'On, Wireless' => 'ãªã³ãã¯ã€ã€ã¬ã¹',
+        'On, Wireless, High-speed Sync' => 'ãªã³ãã¯ã€ã€ã¬ã¹ããã€ã¹ããŒãã·ã³ã¯ã­',
+        'n/a - Off-Auto-Aperture' => 'è©²åœãªã-èªåçµããªã',
+      },
+    },
+   'ExternalFlashZoom' => 'å€ä»ãã©ãã·ã¥ãºãŒã ',
+   'ExtraSamples' => 'ç¹å¥ãµã³ãã«',
+   'FNumber' => 'Få€',
+   'Face0Position' => 'é¡0äœçœ®',
+   'Face1Position' => 'é¡1äœçœ®',
+   'Face2Position' => 'é¡2äœçœ®',
+   'Face3Position' => 'é¡3äœçœ®',
+   'Face4Position' => 'é¡4äœçœ®',
+   'Face5Position' => 'é¡5äœçœ®',
+   'Face6Position' => 'é¡6äœçœ®',
+   'Face7Position' => 'é¡7äœçœ®',
+   'Face8Position' => 'é¡8äœçœ®',
+   'FaceDetect' => {
+      Description => 'é¡èªè­',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'FaceDetectArea' => 'é¡ãšãªã¢',
+   'FaceDetectFrameSize' => 'ãã¬ãŒã ãµã€ãº',
+   'FacesDetected' => 'é¡èªè­',
+   'FastSeek' => {
+      PrintConv => {
+        'No' => 'ããã',
+        'Yes' => 'ã¯ã',
+      },
+    },
+   'FaxProfile' => {
+      PrintConv => {
+        'Unknown' => 'äžæ',
+      },
+    },
+   'FaxRecvParams' => 'FAXåä¿¡ãã©ã¡ãŒã¿',
+   'FaxRecvTime' => 'FAXåä¿¡æé',
+   'FaxSubAddress' => 'FAXãµãã¢ãã¬ã¹',
+   'FileFormat' => 'ãã¡ã€ã«åœ¢åŒ',
+   'FileIndex' => 'ãã¡ã€ã«çŽ¢åŒ',
+   'FileInfo' => 'ãã¡ã€ã«æ
+å ±',
+   'FileInfoVersion' => 'ãã¡ã€ã«æ
+å ±ããŒãžã§ã³',
+   'FileModifyDate' => 'æŽæ°æ¥æ',
+   'FileName' => 'ãã¡ã€ã«å',
+   'FileNumber' => 'ãã¡ã€ã«çªå·',
+   'FileNumberMemory' => {
+      Description => 'ãã¡ã€ã«çªå·ã¡ã¢ãª',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'FileNumberSequence' => {
+      Description => 'ãã¡ã€ã«çªå·é£çª',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'FileSize' => 'ãã¡ã€ã«ã®ãµã€ãº',
+   'FileSource' => {
+      Description => 'ãã¡ã€ã«ãœãŒã¹',
+      PrintConv => {
+        'Digital Camera' => 'ããžã¿ã«ã«ã¡ã©',
+        'Film Scanner' => 'ãã£ã«ã ã¹ã­ã£ããŒ',
+        'Reflection Print Scanner' => 'åå°å°å·ã¹ã­ã£ããŒ',
+      },
+    },
+   'FileType' => 'ãã¡ã€ã«ã¿ã€ã',
+   'FileVersion' => 'ãã¡ã€ã«åœ¢åŒããŒãžã§ã³',
+   'FillFlashAutoReduction' => {
+      Description => 'æ¥äž­ã·ã³ã¯ã­ã»ã¹ãã­ãé²åºèªåäœæžå¶åŸ¡',
+      PrintConv => {
+        'Disable' => 'ããªã',
+        'Enable' => 'ãã',
+      },
+    },
+   'FillOrder' => {
+      Description => 'ãã«ãªãŒããŒ',
+      PrintConv => {
+        'Normal' => 'æšæº',
+      },
+    },
+   'FilmMode' => {
+      Description => 'ãã£ã«ã ã¢ãŒã',
+      PrintConv => {
+        'Dynamic (B&W)' => 'ãã€ãããã¯ïŒçœé»ïŒ',
+        'Dynamic (color)' => 'ãã€ãããã¯ïŒã«ã©ãŒïŒ',
+        'Nature (color)' => 'ããã¥ã©ã«ïŒã«ã©ãŒïŒ',
+        'Smooth (B&W)' => 'æ»ããïŒçœé»ïŒ',
+        'Smooth (color)' => 'æ»ããïŒã«ã©ãŒïŒ',
+        'Standard (B&W)' => 'ã¹ã¿ã³ããŒãïŒçœé»ïŒ',
+        'Standard (color)' => 'ã¹ã¿ã³ããŒãïŒã«ã©ãŒïŒ',
+      },
+    },
+   'FilmType' => 'ãã£ã«ã ã¿ã€ã',
+   'Filter' => {
+      Description => 'ãã£ã«ã¿ãŒ',
+      PrintConv => {
+        'Off' => 'ãªã',
+      },
+    },
+   'FilterEffect' => {
+      Description => 'ãã£ã«ã¿ãŒå¹æ',
+      PrintConv => {
+        'Green' => 'ç·',
+        'None' => 'ç¡ã',
+        'Off' => 'ãªã',
+        'Orange' => 'ãªã¬ã³ãž',
+        'Red' => 'èµ€',
+        'Yellow' => 'é»è²',
+        'n/a' => 'è©²åœç¡ã',
+      },
+    },
+   'FilterEffectMonochrome' => {
+      Description => 'ã¢ãã¯ã­ãã£ã«ã¿ãŒå¹æ',
+      PrintConv => {
+        'Green' => 'ç·',
+        'None' => 'ç¡ã',
+        'Orange' => 'ãªã¬ã³ãž',
+        'Red' => 'èµ€',
+        'Yellow' => 'é»è²',
+      },
+    },
+   'FinderDisplayDuringExposure' => {
+      Description => 'é²å
+äž­ã®ãã¡ã€ã³ããŒå
+è¡šç€º',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'FineTuneOptCenterWeighted' => 'æé©é²åºåŸ®èª¿æŽ äž­å€®éç¹æž¬å
+',
+   'FineTuneOptMatrixMetering' => 'æé©é²åºåŸ®èª¿æŽ åå²æž¬å
+',
+   'FineTuneOptSpotMetering' => 'æé©é²åºåŸ®èª¿æŽ ã¹ãããæž¬å
+',
+   'Firmware' => 'ãã¡ãŒã ãŠã§ã¢',
+   'FirmwareDate' => 'ãã¡ãŒã ãŠã§ã¢æ¥ä»',
+   'FirmwareRevision' => 'ãã¡ãŒã ãŠã§ã¢ãªããžã§ã³',
+   'FirmwareVersion' => 'ãã¡ãŒã ãŠã§ã¢ããŒãžã§ã³',
+   'FixtureIdentifier' => 'ãã£ã¯ãã£ãŒè­å¥å­',
+   'Flash' => {
+      Description => 'ã¹ãã­ã',
+      PrintConv => {
+        'Auto, Did not fire' => 'ãã©ãã·ã¥æªçºå
+ããªãŒãã¢ãŒã',
+        'Auto, Did not fire, Red-eye reduction' => 'ãªãŒãããã©ãã·ã¥æªçºå
+ãèµ€ç®è»œæžã¢ãŒã',
+        'Auto, Fired' => 'ãã©ãã·ã¥çºå
+ããªãŒãã¢ãŒã',
+        'Auto, Fired, Red-eye reduction' => 'ãã©ãã·ã¥çºå
+ããªãŒãã¢ãŒããèµ€ç®è»œæžã¢ãŒã',
+        'Auto, Fired, Red-eye reduction, Return detected' => 'ãã©ãã·ã¥çºå
+ããªãŒãã¢ãŒããã¹ãã­ãå
+æ€ç¥ãèµ€ç®è»œæžã¢ãŒã',
+        'Auto, Fired, Red-eye reduction, Return not detected' => 'ãã©ãã·ã¥çºå
+ããªãŒãã¢ãŒããã¹ãã­ãå
+æªæ€ç¥ãèµ€ç®è»œæžã¢ãŒã',
+        'Auto, Fired, Return detected' => 'ãã©ãã·ã¥çºå
+ããªãŒãã¢ãŒããã¹ãã­ãå
+æ€ç¥',
+        'Auto, Fired, Return not detected' => 'ãã©ãã·ã¥çºå
+ããªãŒãã¢ãŒããã¹ãã­ãå
+æªæ€ç¥',
+        'Did not fire' => 'ãã©ãã·ã¥æªçºå
+',
+        'Fired' => 'ãã©ãã·ã¥çºå
+',
+        'Fired, Red-eye reduction' => 'ãã©ãã·ã¥çºå
+ãèµ€ç®è»œæžã¢ãŒã',
+        'Fired, Red-eye reduction, Return detected' => 'ãã©ãã·ã¥çºå
+ãèµ€ç®è»œæžã¢ãŒããã¹ãã­ãå
+æ€ç¥',
+        'Fired, Red-eye reduction, Return not detected' => 'ãã©ãã·ã¥çºå
+ãèµ€ç®è»œæžã¢ãŒããã¹ãã­ãå
+æªæ€ç¥',
+        'Fired, Return detected' => 'ã¹ãã­ãå
+æ€ç¥',
+        'Fired, Return not detected' => 'ã¹ãã­ãå
+æªæ€ç¥',
+        'No Flash' => 'ãã©ãã·ã¥æªçºå
+',
+        'No flash function' => 'ãã©ãã·ã¥æ©èœç¡ã',
+        'Off' => 'ãªã',
+        'Off, Did not fire' => 'ãã©ãã·ã¥æªçºå
+ãåŒ·å¶çºå
+ã¢ãŒã',
+        'Off, Did not fire, Return not detected' => 'ãªãããã©ãã·ã¥æªçºå
+ãã¹ãã­ãå
+æªæ€ç¥',
+        'Off, No flash function' => 'ãªãããã©ãã·ã¥æ©èœç¡ã',
+        'Off, Red-eye reduction' => 'ãªããèµ€ç®è»œæžã¢ãŒã',
+        'On' => 'ãªã³',
+        'On, Did not fire' => 'ãªã³ããã©ãã·ã¥æªçºå
+',
+        'On, Fired' => 'ãã©ãã·ã¥çºå
+ãåŒ·å¶çºå
+ã¢ãŒã',
+        'On, Red-eye reduction' => 'ãã©ãã·ã¥çºå
+ãåŒ·å¶çºå
+ã¢ãŒããèµ€ç®è»œæžã¢ãŒã',
+        'On, Red-eye reduction, Return detected' => 'ãã©ãã·ã¥çºå
+ãåŒ·å¶çºå
+ã¢ãŒããèµ€ç®è»œæžã¢ãŒããã¹ãã­ãå
+æ€ç¥',
+        'On, Red-eye reduction, Return not detected' => 'ãã©ãã·ã¥çºå
+ãåŒ·å¶çºå
+ã¢ãŒããèµ€ç®è»œæžã¢ãŒããã¹ãã­ãå
+æªæ€ç¥',
+        'On, Return detected' => 'ãã©ãã·ã¥çºå
+ãåŒ·å¶çºå
+ã¢ãŒããã¹ãã­ãå
+æ€ç¥',
+        'On, Return not detected' => 'ãã©ãã·ã¥çºå
+ãåŒ·å¶çºå
+ã¢ãŒããã¹ãã­ãå
+æªæ€ç¥',
+      },
+    },
+   'FlashActivity' => 'ãã©ãã·ã¥çšŒå',
+   'FlashBias' => 'ãã©ãã·ã¥ãã€ã¢ã¹',
+   'FlashBits' => 'ãã©ãã·ã¥è©³çŽ°',
+   'FlashChargeLevel' => 'ãã©ãã·ã¥ãã£ãŒãžã¬ãã«',
+   'FlashCommanderMode' => {
+      Description => 'ã³ãã³ããŒã¢ãŒã',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'FlashCompensation' => 'ãã©ãã·ã¥è£æ­£',
+   'FlashControlMode' => {
+      Description => 'ãã©ãã·ã¥ã³ã³ãã­ãŒã«ã¢ãŒã',
+      PrintConv => {
+        'Auto Aperture' => 'èªåçµãïŒAAïŒ',
+        'Manual' => 'ããã¥ã¢ã«',
+        'Off' => 'ãªã',
+        'Repeating Flash' => 'ãªããŒãã£ã³ã°ãã©ãã·ã¥',
+      },
+    },
+   'FlashDevice' => {
+      Description => 'ãã©ãã·ã¥ããã€ã¹',
+      PrintConv => {
+        'External' => 'å€ä»ã',
+        'Internal' => 'å
+èµ',
+        'Internal + External' => 'å
+èµ+å€ä»ã',
+        'None' => 'ç¡ã',
+      },
+    },
+   'FlashDistance' => 'ãã©ãã·ã¥åŒ·åºŠ',
+   'FlashEnergy' => 'ãã©ãã·ã¥åŒ·åºŠ',
+   'FlashExposureBracketValue' => 'ãã©ãã·ã¥é²åºãã©ã±ããå€',
+   'FlashExposureComp' => 'ãã©ãã·ã¥é²åºè£æ­£',
+   'FlashExposureCompSet' => 'ã¹ãã­ãé²åºè£æ­£èš­å®',
+   'FlashExposureLock' => {
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'FlashFired' => {
+      Description => 'ãã©ãã·ã¥çºå
+',
+      PrintConv => {
+        'No' => 'ããã',
+        'Yes' => 'ã¯ã',
+      },
+    },
+   'FlashFiring' => {
+      Description => 'ã¹ãã­ãã®çºå
+',
+      PrintConv => {
+        'Does not fire' => 'ããªã',
+        'Fires' => 'ãã',
+      },
+    },
+   'FlashFirmwareVersion' => 'ãã©ãã·ã¥ãã¡ãŒã ãŠã§ã¢ããŒãžã§ã³',
+   'FlashFocalLength' => 'ãã©ãã·ã¥çŠç¹è·é¢',
+   'FlashGroupACompensation' => 'ã°ã«ãŒãAãã©ãã·ã¥è£æ­£',
+   'FlashGroupAControlMode' => {
+      Description => 'ã°ã«ãŒãAãã©ãã·ã¥ã³ã³ãã­ãŒã«ã¢ãŒã',
+      PrintConv => {
+        'Auto Aperture' => 'èªåçµãïŒAAïŒ',
+        'Manual' => 'ããã¥ã¢ã«',
+        'Off' => 'ãªã',
+        'Repeating Flash' => 'ãªããŒãã£ã³ã°ãã©ãã·ã¥',
+      },
+    },
+   'FlashGroupAOutput' => 'ã°ã«ãŒãAãã©ãã·ã¥åºå',
+   'FlashGroupBCompensation' => 'ã°ã«ãŒãBãã©ãã·ã¥è£æ­£',
+   'FlashGroupBControlMode' => {
+      Description => 'ã°ã«ãŒãBãã©ãã·ã¥ã³ã³ãã­ãŒã«ã¢ãŒã',
+      PrintConv => {
+        'Auto Aperture' => 'èªåçµãïŒAAïŒ',
+        'Manual' => 'ããã¥ã¢ã«',
+        'Off' => 'ãªã',
+        'Repeating Flash' => 'ãªããŒãã£ã³ã°ãã©ãã·ã¥',
+      },
+    },
+   'FlashGroupBOutput' => 'ã°ã«ãŒãBãã©ãã·ã¥åºå',
+   'FlashGroupCCompensation' => 'ã°ã«ãŒãCãã©ãã·ã¥è£æ­£',
+   'FlashGroupCControlMode' => {
+      Description => 'ã°ã«ãŒãCãã©ãã·ã¥ã³ã³ãã­ãŒã«ã¢ãŒã',
+      PrintConv => {
+        'Auto Aperture' => 'èªåçµãïŒAAïŒ',
+        'Manual' => 'ããã¥ã¢ã«',
+        'Off' => 'ãªã',
+        'Repeating Flash' => 'ãªããŒãã£ã³ã°ãã©ãã·ã¥',
+      },
+    },
+   'FlashGroupCOutput' => 'ã°ã«ãŒãCãã©ãã·ã¥åºå',
+   'FlashGuideNumber' => 'ãã©ãã·ã¥ã¬ã€ããã³ããŒ',
+   'FlashInfo' => 'ã¹ãã­ãæ
+å ±',
+   'FlashInfoVersion' => 'ãã©ãã·ã¥æ
+å ±ããŒãžã§ã³',
+   'FlashIntensity' => {
+      Description => 'ãã©ãã·ã¥åŒ·åºŠ',
+      PrintConv => {
+        'High' => 'é«ã',
+        'Low' => 'äœã',
+        'Normal' => 'æšæº',
+        'Strong' => 'åŒ·ã',
+        'Weak' => 'åŒ±ã',
+      },
+    },
+   'FlashLevel' => 'ãã©ãã·ã¥è£æ­£',
+   'FlashMetering' => 'ãã©ãã·ã¥èšæž¬',
+   'FlashMeteringSegments' => 'ãã©ãã·ã¥æž¬å
+å€',
+   'FlashMode' => {
+      Description => 'ãã©ãã·ã¥ã¢ãŒã',
+      PrintConv => {
+        'Auto' => 'ãªãŒã',
+        'Auto, Did not fire' => 'ãªãŒããçºå
+ç¡ã',
+        'Auto, Did not fire, Red-eye reduction' => 'ãªãŒããçºå
+ç¡ããèµ€ç®è»œæž',
+        'Auto, Fired' => 'ãªãŒããçºå
+',
+        'Auto, Fired, Red-eye reduction' => 'ãªãŒããçºå
+ãèµ€ç®è»œæž',
+        'Did Not Fire' => 'çºå
+çŠæ­¢',
+        'External, Auto' => 'å€ä»ããªãŒã',
+        'External, Contrast-control Sync' => 'å€ä»ãå
+éæ¯å¶åŸ¡ã·ã³ã¯ã­',
+        'External, Flash Problem' => 'å€ä»ããã©ãã·ã¥ã®åé¡?',
+        'External, High-speed Sync' => 'å€ä»ããã€ã¹ããŒãã·ã³ã¯ã­',
+        'External, Manual' => 'å€ä»ãããã¥ã¢ã«',
+        'External, P-TTL Auto' => 'å€ä»ãP-TTLèªåèª¿å
+',
+        'External, Wireless' => 'å€ä»ãã¯ã€ã€ã¬ã¹',
+        'External, Wireless, High-speed Sync' => 'å€ä»ãã¯ã€ã€ã¬ã¹ããã€ã¹ããŒãã·ã³ã¯ã­',
+        'Fill flash' => 'åŒ·å¶çºå
+',
+        'Fired, Commander Mode' => 'çºå
+ãã³ãã³ããŒã¢ãŒã',
+        'Fired, External' => 'çºå
+ãå€ä»',
+        'Fired, Manual' => 'çºå
+ãããã¥ã¢ã«',
+        'Fired, TTL Mode' => 'çºå
+ãTTLã¢ãŒã',
+        'Internal' => 'å
+èµ',
+        'Normal' => 'æšæº',
+        'Off' => 'ãªã',
+        'Off, Did not fire' => 'ãªã',
+        'Off?' => 'ãªãïŒ',
+        'On' => 'ãªã³',
+        'On, Did not fire' => 'ãªã³ãçºå
+ç¡ã',
+        'On, Fired' => 'ãªã³',
+        'On, Red-eye reduction' => 'ãªã³ãèµ€ç®è»œæž',
+        'On, Slow-sync' => 'ãªã³ãã¹ã­ãŒã·ã³ã¯ã­',
+        'On, Slow-sync, Red-eye reduction' => 'ãªã³ãã¹ã­ãŒã·ã³ã¯ã­ãèµ€ç®è»œæž',
+        'On, Soft' => 'ãªã³ããœãã',
+        'On, Trailing-curtain Sync' => 'ãªã³ãåŸå¹ã·ã³ã¯ã­',
+        'On, Wireless (Control)' => 'ãªã³ãã¯ã€ã€ã¬ã¹ (ã³ã³ãã­ãŒã«)',
+        'On, Wireless (Master)' => 'ãªã³ãã¯ã€ã€ã¬ã¹ (ãã¹ã¿ãŒ)',
+        'Rear flash sync' => 'ãªã¢ãã©ãã·ã¥ã·ã³ã¯ã­',
+        'Red-eye Reduction' => 'èµ€ç®è»œæž',
+        'Red-eye reduction' => 'èµ€ç®è»œæž',
+        'Unknown' => 'äžæ',
+        'Wireless' => 'ã¯ã€ã€ã¬ã¹',
+        'n/a - Off-Auto-Aperture' => 'è©²åœãªã-èªåçµããªã',
+      },
+    },
+   'FlashModel' => {
+      Description => 'ãã©ãã·ã¥ã¢ãã«',
+      PrintConv => {
+        'None' => 'ç¡ã',
+      },
+    },
+   'FlashOptions' => {
+      Description => 'ãã©ãã·ã¥ãªãã·ã§ã³',
+      PrintConv => {
+        'Auto' => 'ãªãŒã',
+        'Auto, Red-eye reduction' => 'ãªãŒããèµ€ç®è»œæž',
+        'Normal' => 'æšæº',
+        'Red-eye reduction' => 'èµ€ç®è»œæž',
+        'Slow-sync' => 'ã¹ã­ãŒã·ã³ã¯ã­',
+        'Slow-sync, Red-eye reduction' => 'ã¹ã­ãŒã·ã³ã¯ã­ãèµ€ç®è»œæž',
+        'Trailing-curtain Sync' => 'åŸå¹ã·ã³ã¯ã­',
+        'Wireless (Control)' => 'ã¯ã€ã€ã¬ã¹ïŒã³ã³ãã­ãŒã«çºå
+ïŒ',
+        'Wireless (Master)' => 'ã¯ã€ã€ã¬ã¹ïŒãã¹ã¿ãŒçºå
+ïŒ',
+      },
+    },
+   'FlashOptions2' => {
+      Description => 'ã¹ãã­ããªãã·ã§ã³(2)',
+      PrintConv => {
+        'Auto' => 'ãªãŒã',
+        'Auto, Red-eye reduction' => 'ãªãŒããèµ€ç®è»œæž',
+        'Normal' => 'æšæº',
+        'Red-eye reduction' => 'èµ€ç®è»œæž',
+        'Slow-sync' => 'ã¹ã­ãŒã·ã³ã¯ã­',
+        'Slow-sync, Red-eye reduction' => 'ã¹ã­ãŒã·ã³ã¯ã­ãèµ€ç®è»œæž',
+        'Trailing-curtain Sync' => 'åŸå¹ã·ã³ã¯ã­',
+        'Wireless (Control)' => 'ã¯ã€ã€ã¬ã¹ïŒã³ã³ãã­ãŒã«çºå
+ïŒ',
+        'Wireless (Master)' => 'ã¯ã€ã€ã¬ã¹ïŒãã¹ã¿ãŒçºå
+ïŒ',
+      },
+    },
+   'FlashOutput' => 'ãã©ãã·ã¥åºå',
+   'FlashSerialNumber' => 'ãã©ãã·ã¥ã·ãªã¢ã«çªå·',
+   'FlashSetting' => 'ãã©ãã·ã¥èš­å®',
+   'FlashShutterSpeed' => 'ãã©ãã·ã¥ã·ã£ãã¿ãŒéåºŠ',
+   'FlashStatus' => {
+      Description => 'ã¹ãã­ãç¶æ
+',
+      PrintConv => {
+        'External, Did not fire' => 'å€ä»ãæªçºå
+',
+        'External, Fired' => 'å€ä»ãçºå
+',
+        'Internal, Did not fire' => 'å
+èµãæªçºå
+',
+        'Internal, Fired' => 'å
+èµãçºå
+',
+        'Off' => 'ãªã',
+      },
+    },
+   'FlashSyncSpeed' => 'ãã©ãã·ã¥åèª¿éåºŠ',
+   'FlashSyncSpeedAv' => {
+      Description => 'Avã¢ãŒãæã®ã¹ãã­ãåèª¿éåºŠ',
+      PrintConv => {
+        '1/200 Fixed' => '1/200ç§åºå®',
+        '1/250 Fixed' => '1/250ç§åºå®',
+        '1/300 Fixed' => '1/300ç§åºå®',
+        'Auto' => 'ãªãŒã',
+      },
+    },
+   'FlashType' => {
+      Description => 'ãã©ãã·ã¥ã¿ã€ã',
+      PrintConv => {
+        'E-System' => 'E-ã·ã¹ãã ',
+        'None' => 'ç¡ã',
+        'Simple E-System' => 'ã·ã³ãã«E-ã·ã¹ãã ',
+      },
+    },
+   'FlashWarning' => {
+      Description => 'ãã©ãã·ã¥è­Šå',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'FlashpixVersion' => 'ãµããŒããã©ãã·ã¥ããã¯ã¹ããŒãžã§ã³',
+   'FlickerReduce' => {
+      Description => 'ããªãã«ãŒè»œæž',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'FlipHorizontal' => {
+      Description => 'æšªããªãã',
+      PrintConv => {
+        'No' => 'ããã',
+        'Yes' => 'ã¯ã',
+      },
+    },
+   'FocalLength' => 'ã¬ã³ãºçŠç¹è·é¢',
+   'FocalLength35efl' => 'ã¬ã³ãºçŠç¹è·é¢',
+   'FocalLengthIn35mmFormat' => '35mmãã€ã«ã æç®çŠç¹è·é¢',
+   'FocalPlaneDiagonal' => 'çŠç¹é¢å¯Ÿè§ç·',
+   'FocalPlaneResolutionUnit' => {
+      Description => 'çŠç¹é¢è§£ååºŠåäœ',
+      PrintConv => {
+        'None' => 'ç¡ã',
+        'inches' => 'ã€ã³ã',
+      },
+    },
+   'FocalPlaneXResolution' => 'çŠç¹é¢Xè§£ååºŠ',
+   'FocalPlaneXSize' => 'çŠç¹é¢Xãµã€ãº',
+   'FocalPlaneXUnknown' => 'çŠç¹é¢Xãµã€ãº',
+   'FocalPlaneYResolution' => 'çŠç¹é¢Yè§£ååºŠ',
+   'FocalPlaneYSize' => 'çŠç¹é¢Yãµã€ãº',
+   'FocalPlaneYUnknown' => 'çŠç¹é¢Yãµã€ãº',
+   'FocalType' => {
+      Description => 'ãã©ãŒã«ã¹ã¿ã€ã',
+      PrintConv => {
+        'Fixed' => 'åºå®',
+        'Zoom' => 'ãºãŒã ',
+      },
+    },
+   'FocalUnits' => 'çŠç¹åäœ/mm',
+   'Focus' => {
+      Description => 'ãã©ãŒã«ã¹',
+      PrintConv => {
+        'Manual' => 'ããã¥ã¢ã«',
+      },
+    },
+   'FocusArea' => 'ãã©ãŒã«ã¹ãšãªã¢',
+   'FocusAreaSelection' => {
+      Description => 'ãã©ãŒã«ã¹ãã€ã³ãã©ããã¢ã©ãŠã³ã',
+      PrintConv => {
+        'No Wrap' => 'ããŒã©ãã',
+        'Wrap' => 'ã©ãã',
+      },
+    },
+   'FocusContinuous' => {
+      Description => 'é£ç¶ãã©ãŒã«ã¹',
+      PrintConv => {
+        'Continuous' => 'é£ç¶',
+        'Manual' => 'ããã¥ã¢ã«',
+        'Single' => 'ã·ã³ã°ã«',
+      },
+    },
+   'FocusDistance' => 'è¢«åäœè·é¢',
+   'FocusDistanceLower' => 'çŠç¹è·é¢äœéšå',
+   'FocusDistanceUpper' => 'çŠç¹è·é¢é«éšå',
+   'FocusMode' => {
+      Description => 'ãã©ãŒã«ã¹ã¢ãŒã',
+      PrintConv => {
+        'AI Focus AF' => 'AIãã©ãŒã«ã¹AF',
+        'AI Servo AF' => 'AIãµãŒãAF',
+        'Auto' => 'ãªãŒã',
+        'Auto, Continuous' => 'ãªãŒããã³ã³ãã£ãã¥ã¢ã¹',
+        'Auto, Focus button' => 'ãªãŒãããã©ãŒã«ã¹ãã¿ã³',
+        'Continuous' => 'é£å',
+        'Continuous AF' => 'ã³ã³ãã£ãã¥ã¢ã¹AF',
+        'Custom' => 'ã«ã¹ã¿ã ',
+        'Infinity' => 'ç¡éé ',
+        'Macro' => 'ãã¯ã­',
+        'Macro (1)' => 'ãã¯ã­(1)',
+        'Macro (2)' => 'ãã¯ã­(2)',
+        'Manual' => 'ããã¥ã¢ã«',
+        'Manual Focus (3)' => 'ããã¥ã¢ã«ãã©ãŒã«ã¹(3)',
+        'Manual Focus (6)' => 'ããã¥ã¢ã«ãã©ãŒã«ã¹(6)',
+        'Multi AF' => 'ãã«ãAF',
+        'Normal' => 'æšæº',
+        'One-shot AF' => 'ã¯ã³ã·ã§ããAF',
+        'Pan Focus' => 'ãã³ãã©ãŒã«ã¹',
+        'Sequential shooting AF' => 'ã·ãŒã±ã³ã·ã£ã«ã·ã¥ãŒãã£ã³ã°AF',
+        'Single' => 'ã·ã³ã°ã«',
+        'Single AF' => 'ã·ã³ã°ã«AF',
+        'Super Macro' => 'ã¹ãŒããŒãã¯ã­',
+      },
+    },
+   'FocusMode2' => 'ãã©ãŒã«ã¹ã¢ãŒã2',
+   'FocusModeSetting' => {
+      Description => 'ãã©ãŒã«ã¹ã¢ãŒã',
+      PrintConv => {
+        'Manual' => 'ããã¥ã¢ã«',
+      },
+    },
+   'FocusPixel' => 'çŠç¹è§£ååºŠ',
+   'FocusPointWrap' => {
+      Description => 'ãã©ãŒã«ã¹ãã€ã³ãã©ããã¢ã©ãŠã³ã',
+      PrintConv => {
+        'No Wrap' => 'ããŒã©ãã',
+        'Wrap' => 'ã©ãã',
+      },
+    },
+   'FocusPosition' => 'ãã©ãŒã«ã¹è·é¢',
+   'FocusProcess' => {
+      Description => 'ãã©ãŒã«ã¹ãã­ã»ã¹',
+      PrintConv => {
+        'AF Not Used' => 'AFæªäœ¿çš',
+        'AF Used' => 'AFäœ¿çš',
+      },
+    },
+   'FocusRange' => {
+      Description => 'ãã©ãŒã«ã¹ã¬ã³ãž',
+      PrintConv => {
+        'Auto' => 'ãªãŒã',
+        'Close' => 'è¿æ¯',
+        'Far Range' => 'é æ¯',
+        'Infinity' => 'ç¡éé ',
+        'Macro' => 'ãã¯ã­',
+        'Manual' => 'ããã¥ã¢ã«',
+        'Middle Range' => 'äž­éç¯å²',
+        'Normal' => 'ããŒãã«',
+        'Not Known' => 'äžæ',
+        'Pan Focus' => 'ãã³ãã©ãŒã«ã¹',
+        'Super Macro' => 'ã¹ãŒããŒãã¯ã­',
+        'Very Close' => 'è¿æ¥',
+      },
+    },
+   'FocusSetting' => 'ãã©ãŒã«ã¹èš­å®',
+   'FocusStepCount' => 'ãã©ãŒã«ã¹ã¹ãããæ°',
+   'FocusStepInfinity' => 'ç¡éã¬ã³ãºã¹ããã',
+   'FocusStepNear' => 'ãã¢ã¹ãããæ°',
+   'FocusTrackingLockOn' => {
+      Description => 'ãã©ãŒã«ã¹ãã©ãã­ã³ã°ãšã­ãã¯ãªã³',
+      PrintConv => {
+        'Long' => 'ã­ã³ã°',
+        'Normal' => 'æšæº',
+        'Off' => 'ãªã',
+        'Short' => 'ã·ã§ãŒã',
+      },
+    },
+   'FocusWarning' => {
+      Description => 'ãã©ãŒã«ã¹è­Šå',
+      PrintConv => {
+        'Good' => 'ãžã£ã¹ãã³',
+        'Out of focus' => 'ãã³ãã±',
+      },
+    },
+   'FocusingScreen' => 'ãã©ãŒã«ã·ã³ã°ã¹ã¯ãªãŒã³',
+   'FolderName' => 'ãã©ã«ãå',
+   'ForwardMatrix1' => 'åè¡å1',
+   'ForwardMatrix2' => 'åè¡å2',
+   'FrameNumber' => 'ãã¬ãŒã çªå·',
+   'FrameRate' => 'ãã¬ãŒã ã¬ãŒã',
+   'FrameSize' => 'ãã¬ãŒã ãµã€ãº',
+   'FreeByteCounts' => 'ããªãŒãã€ãæ°',
+   'FreeMemoryCardImages' => 'ããªãŒã¡ã¢ãªãŒã«ãŒãã€ã¡ãŒãž',
+   'FreeOffsets' => 'ããªãŒãªãã»ãã',
+   'FujiFlashMode' => {
+      Description => 'ãã©ãã·ã¥ã¢ãŒã',
+      PrintConv => {
+        'Auto' => 'ãªãŒã',
+        'External' => 'å€ä»ãã©ãã·ã¥',
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+        'Red-eye reduction' => 'èµ€ç®è»œæž',
+      },
+    },
+   'FunctionButton' => {
+      Description => 'FUNCãã¿ã³',
+      PrintConv => {
+        'AF-area Mode' => 'AFãšãªã¢ã¢ãŒã',
+        'Center AF Area' => 'äž­å€®AFãšãªã¢',
+        'Center-weighted' => 'äž­å€®éç¹æž¬å
+',
+        'FV Lock' => 'FVã­ãã¯',
+        'Flash Off' => 'ãã©ãã·ã¥ãªã',
+        'Framing Grid' => 'ãã¬ãŒãã³ã°ã°ãªãã',
+        'ISO Display' => 'ISOè¡šç€º',
+        'Matrix Metering' => 'åå²æž¬å
+',
+        'Spot Metering' => 'ã¹ãããæž¬å
+',
+      },
+    },
+   'GEMInfo' => 'GEMæ
+å ±',
+   'GIFVersion' => 'GIFããŒãžã§ã³',
+   'GPSAltitude' => 'é«åºŠ',
+   'GPSAltitudeRef' => {
+      Description => 'åç
+§é«åºŠ',
+      PrintConv => {
+        'Above Sea Level' => 'æµ·æ°Žé¢',
+        'Below Sea Level' => 'åç
+§æµ·æ°Žé¢(è² ã®å€)',
+      },
+    },
+   'GPSAreaInformation' => 'GPSãšãªã¢ã®åç§°',
+   'GPSDOP' => 'æž¬å®ç²ŸåºŠ',
+   'GPSDateStamp' => 'GPSããŒã¿',
+   'GPSDateTime' => 'GPSæé(åå­æèš)',
+   'GPSDestBearing' => 'ç®çå°ã®æ¹å',
+   'GPSDestBearingRef' => {
+      Description => 'ç®çå°ã®æ¹åã®åç
+§',
+      PrintConv => {
+        'Magnetic North' => 'ç£æ°ã®æ¹å',
+        'True North' => 'æ­£åžžãªæ¹å',
+      },
+    },
+   'GPSDestDistance' => 'ç®çå°ã®è·é¢',
+   'GPSDestDistanceRef' => {
+      Description => 'ç®çå°ã®è·é¢ã®åç
+§',
+      PrintConv => {
+        'Kilometers' => 'ã­ã­ã¡ãŒãã«',
+        'Miles' => 'ãã€ã«',
+        'Nautical Miles' => 'ããã',
+      },
+    },
+   'GPSDestLatitude' => 'ç®çå°ã®ç·¯åºŠ',
+   'GPSDestLatitudeRef' => {
+      Description => 'ç®çå°ã®ç·¯åºŠã®ããã®åç
+§',
+      PrintConv => {
+        'North' => 'åç·¯',
+        'South' => 'åç·¯',
+      },
+    },
+   'GPSDestLongitude' => 'ç®çå°ã®çµåºŠ',
+   'GPSDestLongitudeRef' => {
+      Description => 'ç®çå°ã®çµåºŠã®ããã®åç
+§',
+      PrintConv => {
+        'East' => 'æ±çµ',
+        'West' => 'è¥¿çµ',
+      },
+    },
+   'GPSDifferential' => {
+      Description => 'GPSèª€å·®ä¿®æ­£',
+      PrintConv => {
+        'Differential Corrected' => 'èª€å·®ä¿®æ­£ãã',
+        'No Correction' => 'èª€å·®ä¿®æ­£ç¡ã',
+      },
+    },
+   'GPSImgDirection' => 'ã€ã¡ãŒãžã®æ¹å',
+   'GPSImgDirectionRef' => {
+      Description => 'ç»åæ¹ååç
+§',
+      PrintConv => {
+        'Magnetic North' => 'ç£æ°ã®æ¹å',
+        'True North' => 'æ¬åœã®æ¹å',
+      },
+    },
+   'GPSInfo' => 'GPS IFDãžã®ãã€ã³ã¿',
+   'GPSLatitude' => 'ç·¯åºŠ',
+   'GPSLatitudeRef' => {
+      Description => 'åç·¯ãŸãã¯åç·¯',
+      PrintConv => {
+        'North' => 'åç·¯',
+        'South' => 'åç·¯',
+      },
+    },
+   'GPSLongitude' => 'çµåºŠ',
+   'GPSLongitudeRef' => {
+      Description => 'æ±çµãŸãã¯è¥¿çµ',
+      PrintConv => {
+        'East' => 'æ±çµ',
+        'West' => 'è¥¿çµ',
+      },
+    },
+   'GPSMapDatum' => 'ããŒã¿ãäœ¿ã£ãæž¬å°æž¬é',
+   'GPSMeasureMode' => {
+      Description => 'GPSæž¬å®ã¢ãŒã',
+      PrintConv => {
+        '2-D' => 'ïŒæ¬¡å
+æž¬å®',
+        '2-Dimensional' => 'ïŒæ¬¡å
+æž¬å®',
+        '2-Dimensional Measurement' => 'ïŒæ¬¡å
+æž¬å®',
+        '3-D' => 'ïŒæ¬¡å
+æž¬å®',
+        '3-Dimensional' => 'ïŒæ¬¡å
+æž¬å®',
+        '3-Dimensional Measurement' => 'ïŒæ¬¡å
+æž¬å®',
+      },
+    },
+   'GPSProcessingMethod' => 'GPSåŠçæ¹æ³ã®åç§°',
+   'GPSSatellites' => 'æž¬å®ã®ããã«äœ¿ãããGPSè¡æ',
+   'GPSSpeed' => 'GPSåä¿¡æ©ã®ã¹ããŒã',
+   'GPSSpeedRef' => {
+      Description => 'ã¹ããŒãåäœ',
+      PrintConv => {
+        'km/h' => 'æé(km)',
+        'knots' => 'ããã',
+        'mph' => 'æé(ãã€ã«)',
+      },
+    },
+   'GPSStatus' => {
+      Description => 'GPSåä¿¡æ©ã¹ããŒã¿ã¹',
+      PrintConv => {
+        'Measurement Active' => 'æž¬å®ã¢ã¯ãã£ã',
+        'Measurement Void' => 'æž¬å®ç¡å¹',
+      },
+    },
+   'GPSTimeStamp' => 'GPSæé(åå­æèš)',
+   'GPSTrack' => 'åäœæ¹å',
+   'GPSTrackRef' => {
+      Description => 'åäœæ¹åã®åç
+§',
+      PrintConv => {
+        'Magnetic North' => 'ç£æ°ã®æ¹å',
+        'True North' => 'æ¬åœã®æ¹å',
+      },
+    },
+   'GPSVersionID' => 'GPSã¿ã°ããŒãžã§ã³',
+   'GainBase' => 'åºæ¬ã²ã€ã³',
+   'GainControl' => {
+      Description => 'ã²ã€ã³ã³ã³ãã­ãŒã«',
+      PrintConv => {
+        'High gain down' => 'é«ãã²ã€ã³ããŠã³',
+        'High gain up' => 'é«ãã²ã€ã³ã¢ãã',
+        'Low gain down' => 'äœãã²ã€ã³ããŠã³',
+        'Low gain up' => 'äœãã²ã€ã³ã¢ãã',
+        'None' => 'ç¡ã',
+      },
+    },
+   'Gamma' => 'ã¬ã³ã',
+   'GammaCompensatedValue' => 'ã¬ã³ãè£åå€',
+   'Gamut' => 'å
+šå',
+   'Gapless' => {
+      PrintConv => {
+        'No' => 'ããã',
+        'Yes' => 'ã¯ã',
+      },
+    },
+   'GeoTiffAsciiParams' => 'ãžãªã¢ã¹ã­ãŒèš­å®ã¿ã°',
+   'GeoTiffDirectory' => 'ãžãªã­ãŒãã£ã¬ã¯ããªã¿ã°',
+   'GeoTiffDoubleParams' => 'ãžãªããã«èš­å®ã¿ã°',
+   'Gradation' => 'ã°ã©ããŒã·ã§ã³',
+   'GrayResponseCurve' => 'ã°ã¬ãŒåå¿æ²ç·',
+   'GrayResponseUnit' => {
+      Description => 'ã°ã¬ãŒåå¿åäœ',
+      PrintConv => {
+        '0.0001' => 'åäœã®æ°ã¯1000ãè¡šã',
+        '0.001' => 'åäœã®æ°ã¯100ãè¡šã',
+        '0.1' => 'åäœã®æ°ã¯10ãè¡šã',
+        '1e-05' => 'åäœã®æ°ã¯10-1000ãè¡šã',
+        '1e-06' => 'åäœã®æ°ã¯100-1000ãè¡šã',
+      },
+    },
+   'GrayTRC' => 'ç°è²èª¿å¢æ®æ²ç·',
+   'GreenMatrixColumn' => 'ç·è²ãããªãã¯ã¹å',
+   'GreenTRC' => 'ç·è²èª¿å¢æ®æ²ç·',
+   'GridDisplay' => {
+      Description => 'ãã¥ãŒãã¡ã€ã³ããŒã°ãªããè¡šç€º',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'GripBatteryADLoad' => 'é»æºA/Dã°ãªããèµ·åæ',
+   'GripBatteryADNoLoad' => 'é»æºA/Dã°ãªãããªãæ',
+   'GripBatteryState' => 'é»æºç¶æ
+ã°ãªãã',
+   'HCUsage' => 'HCäœ¿çš',
+   'HDR' => {
+      Description => 'ãªãŒãHDR',
+      PrintConv => {
+        'Off' => 'å',
+      },
+    },
+   'HalftoneHints' => 'ããŒãããŒã³ãã³ã',
+   'Headline' => 'ãããã©ã€ã³',
+   'HeightResolution' => 'é«ãæ¹åã®ç»åè§£ååºŠ',
+   'HighISONoiseReduction' => {
+      Description => 'é«æåºŠãã€ãºãªãã¯ã·ã§ã³',
+      PrintConv => {
+        'Auto' => 'ãªãŒã',
+        'High' => 'é«ã',
+        'Low' => 'ãœãã',
+        'Minimal' => 'æå°',
+        'Normal' => 'æšæº',
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+        'Standard' => 'ã¹ã¿ã³ããŒã',
+        'Strong' => 'åŒ·',
+        'Weak' => 'åŒ±',
+        'Weakest' => 'åŸ®åŒ±',
+      },
+    },
+   'Highlight' => 'ãã€ã©ã€ã',
+   'HighlightTonePriority' => {
+      Description => 'é«èŒåºŠåŽã»éèª¿åªå
+',
+      PrintConv => {
+        'Disable' => 'ããªã',
+        'Enable' => 'ãã',
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'HometownCity' => 'çŸåšå°',
+   'HometownCityCode' => 'çŸåšå°ã³ãŒã',
+   'HometownDST' => {
+      Description => 'çŸåšå°DST',
+      PrintConv => {
+        'No' => 'ããã',
+        'Yes' => 'ã¯ã',
+      },
+    },
+   'HostComputer' => 'ãã¹ãã³ã³ãã¥ãŒã¿ãŒ',
+   'Hue' => 'è²çž',
+   'HueAdjustment' => 'è²çžèª¿æŽ',
+   'HueSetting' => 'è²çžèš­å®',
+   'ICC_Profile' => 'ICCå
+¥åè²ãã­ãã£ãŒã«',
+   'IPTC-NAA' => 'IPTC-NAAã¡ã¿ããŒã¿',
+   'IPTCBitsPerSample' => 'ãµã³ãã«ããããããæ°',
+   'IPTCData' => 'IPTCããŒã¿',
+   'IPTCImageHeight' => 'ã©ã€ã³æ°',
+   'IPTCImageRotation' => 'ã€ã¡ãŒãžåè»¢',
+   'IPTCImageWidth' => 'ã©ã€ã³ãããã®ãã¯ã»ã«æ°',
+   'IPTCPictureNumber' => 'åççªå·',
+   'IPTCPixelHeight' => 'ã¹ã­ã£ã³æ¹ååçŽãã¯ã»ã«ãµã€ãº',
+   'IPTCPixelWidth' => 'ã¹ã­ã£ã³æ¹åãã¯ã»ã«ãµã€ãº',
+   'ISO' => 'ISOã¹ããŒãã¬ãŒã',
+   'ISO2' => 'ISOïŒ2ïŒ',
+   'ISODisplay' => 'ISOè¡šç€º',
+   'ISOExpansion' => {
+      Description => 'ISOæåºŠæ¡åŒµ',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'ISOExpansion2' => {
+      Description => 'ISOæ¡å€§ïŒ2ïŒ',
+      PrintConv => {
+        'Off' => 'ãªã',
+      },
+    },
+   'ISOFloor' => 'æäœæåºŠ',
+   'ISOInfo' => 'ISOæ
+å ±',
+   'ISOSelection' => 'ISOéžæ',
+   'ISOSetting' => {
+      Description => 'ISOèš­å®',
+      PrintConv => {
+        'Auto' => 'ãªãŒã',
+        'Manual' => 'ããã¥ã¢ã«',
+      },
+    },
+   'ISOSpeedExpansion' => {
+      Description => 'ISOæåºŠæ¡åŒµ',
+      PrintConv => {
+        'No' => 'ããã',
+        'Yes' => 'ã¯ã',
+      },
+    },
+   'ISOSpeedIncrements' => {
+      Description => 'ISOæåºŠã¹ãããå€',
+      PrintConv => {
+        '1 Stop' => '1ã¹ããã',
+        '1/3 Stop' => '1/3ã¹ããã',
+      },
+    },
+   'ISOSpeedRange' => {
+      Description => 'ISOæåºŠã®å¶åŸ¡ç¯å²ã®èš­å®',
+      PrintConv => {
+        'Disable' => 'ããªã',
+        'Enable' => 'ãã',
+      },
+    },
+   'ISOStepSize' => {
+      Description => 'ISOæåºŠã¹ãããå€',
+      PrintConv => {
+        '1 EV' => '1ã¹ããã',
+        '1/2 EV' => '1/2ã¹ããã',
+        '1/3 EV' => '1/3ã¹ããã',
+      },
+    },
+   'ISOValue' => 'ISOæåºŠ',
+   'IT8Header' => 'IT8ããããŒ',
+   'Illumination' => {
+      Description => 'ã€ã«ãããŒã·ã§ã³',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'Image::ExifTool::NikonCapture::RedEyeData' => 'Nikon Capture èµ€ç®ããŒã¿',
+   'ImageAdjustment' => 'ã€ã¡ãŒãžèª¿æŽ',
+   'ImageAreaOffset' => 'ã€ã¡ãŒãžé åãªãã»ãã',
+   'ImageAuthentication' => {
+      Description => 'ã€ã¡ãŒãžèªèšŒ',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'ImageBoundary' => 'ã€ã¡ãŒãžå¢çç·',
+   'ImageByteCount' => 'ç»åãã€ãæ°',
+   'ImageColorIndicator' => 'ç»åè²ææš',
+   'ImageColorValue' => 'ç»åè²å€',
+   'ImageCount' => 'ã€ã¡ãŒãžã«ãŠã³ã',
+   'ImageDataDiscard' => {
+      Description => 'ã€ã¡ãŒãžããŒã¿å»æ£',
+      PrintConv => {
+        'Flexbits Discarded' => 'ãã¬ãã¯ã¹ãããç Žæ£',
+        'Full Resolution' => 'å®å
+šãªè§£ååºŠ',
+        'HighPass Frequency Data Discarded' => 'ãã€ãã¹åšæ³¢æ°ããŒã¿ç Žæ£',
+        'Highpass and LowPass Frequency Data Discarded' => 'ãã€ãã¹ãšã­ãŒãã¹åšæ³¢æ°ããŒã¿ç Žæ£',
+      },
+    },
+   'ImageDataSize' => 'ã€ã¡ãŒãžããŒã¿ãµã€ãº',
+   'ImageDepth' => 'ã€ã¡ãŒãžã®æ·±ã',
+   'ImageDescription' => 'ã€ã¡ãŒãžèª¬æ',
+   'ImageDustOff' => {
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'ImageEditCount' => 'ç»ååŠçã«ãŠã³ã',
+   'ImageEditing' => {
+      Description => 'ã€ã¡ãŒãžåŠç',
+      PrintConv => {
+        'Cropped' => 'ã¯ã­ãã',
+        'Digital Filter' => 'ããžã¿ã«ãã£ã«ã¿ãŒ',
+        'Frame Synthesis?' => 'ãã¬ãŒã åæïŒ',
+        'None' => 'æªåŠç',
+      },
+    },
+   'ImageHeight' => 'ç»åé«ã',
+   'ImageHistory' => 'ç»åå±¥æ­Ž',
+   'ImageID' => 'ã€ã¡ãŒãžID',
+   'ImageInfo' => 'ç»åæ
+å ±',
+   'ImageLayer' => 'ã€ã¡ãŒãžã¬ã€ã€ãŒ',
+   'ImageNumber' => 'ã€ã¡ãŒãžçªå·',
+   'ImageNumber2' => 'ã€ã¡ãŒãžçªå·(2)',
+   'ImageOffset' => 'ã€ã¡ãŒãžãªãã»ãã',
+   'ImageOptimization' => 'ã€ã¡ãŒãžæé©å',
+   'ImageOrientation' => {
+      Description => 'ã€ã¡ãŒãžæ¹å',
+      PrintConv => {
+        'Landscape' => 'ã©ã³ãã¹ã±ãŒã',
+        'Portrait' => 'ããŒãã¬ãŒã',
+        'Square' => 'æ­£æ¹åœ¢',
+      },
+    },
+   'ImageProcessingVersion' => 'ç»ååŠçããŒãžã§ã³',
+   'ImageQuality' => {
+      Description => 'ç»ååè³ª',
+      PrintConv => {
+        'High' => 'é«ã',
+        'Motion Picture' => 'åç»',
+        'Normal' => 'æšæº',
+      },
+    },
+   'ImageQuality2' => 'ã€ã¡ãŒãžåè³ª2',
+   'ImageResourceBlocks' => 'ã€ã¡ãŒãžãªãœãŒã¹ãã­ãã¯',
+   'ImageReview' => {
+      Description => 'ç»åè©äŸ¡',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'ImageReviewTime' => 'èªåãªãã¿ã€ããŒ ç»åè©äŸ¡æé',
+   'ImageRotated' => {
+      PrintConv => {
+        'No' => 'ããã',
+        'Yes' => 'ã¯ã',
+      },
+    },
+   'ImageSize' => 'ã€ã¡ãŒãžãµã€ãº',
+   'ImageSourceData' => 'ã€ã¡ãŒãžãœãŒã¹ããŒã¿',
+   'ImageStabilization' => {
+      Description => 'ã€ã¡ãŒãžã¹ã¿ãã©ã€ã¶ãŒ',
+      PrintConv => {
+        'Best Shot' => 'ãã¹ãã·ã§ãã',
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+        'On, Mode 1' => 'ãªã³ãã¢ãŒãïŒ',
+        'On, Mode 2' => 'ãªã³ãã¢ãŒãïŒ',
+      },
+    },
+   'ImageTone' => {
+      Description => 'ç»åä»äž',
+      PrintConv => {
+        'Bright' => 'é®®ãã',
+        'Landscape' => 'é¢šæ¯',
+        'Monochrome' => 'ã¢ãããŒã³',
+        'Natural' => 'ããã¥ã©ã«',
+        'Portrait' => 'ããŒãã¬ãŒã',
+        'Vibrant' => 'é
+(MIYABI)',
+      },
+    },
+   'ImageType' => 'ããŒãž',
+   'ImageUniqueID' => 'ãŠããŒã¯ãªã€ã¡ãŒãžID',
+   'ImageWidth' => 'ç»åå¹
+',
+   'Index' => 'ç®æ¬¡',
+   'Indexed' => 'ã€ã³ããã¯ã¹',
+   'InfoButtonWhenShooting' => {
+      Description => 'æ®åœ±æã®INFOãã¿ã³',
+      PrintConv => {
+        'Displays camera settings' => 'ã«ã¡ã©èš­å®å
+å®¹ãè¡šç€º',
+        'Displays shooting functions' => 'æ®åœ±æ©èœã®èš­å®ç¶æ
+ãè¡šç€º',
+      },
+    },
+   'InitialZoomSetting' => {
+      Description => 'åæãºãŒã èš­å®',
+      PrintConv => {
+        'High Magnification' => 'é«ãæ¡å€§',
+        'Low Magnification' => 'äœãæ¡å€§',
+        'Medium Magnification' => 'äž­éæ¡å€§',
+      },
+    },
+   'InkNames' => 'ã€ã³ã¯å',
+   'InkSet' => 'ã€ã³ã¯ã»ãã',
+   'Instructions' => 'è©³çŽ°',
+   'IntellectualGenre' => 'ã€ã³ããªãžã£ã³ã«',
+   'IntensityStereo' => {
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'IntergraphMatrix' => 'çžäºã°ã©ããããªãã¯ã¹ã¿ã°',
+   'Interlace' => 'ã€ã³ã¿ã¬ãŒã¹',
+   'InternalFlash' => {
+      Description => 'å
+èµãã©ãã·ã¥ã³ã³ãã­ãŒã«',
+      PrintConv => {
+        'Commander Mode' => 'ã³ãã³ããŒã¢ãŒã',
+        'Fired' => 'ãã©ãã·ã¥çºå
+',
+        'Manual' => 'ããã¥ã¢ã«',
+        'No' => 'ãã©ãã·ã¥æªçºå
+',
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+        'Repeating Flash' => 'ãªããŒãã£ã³ã°ãã©ãã·ã¥',
+      },
+    },
+   'InternalFlashAE1' => 'å
+èµãã©ãã·ã¥AE1ïŒ',
+   'InternalFlashAE1_0' => 'å
+èµãã©ãã·ã¥AE1(0)ïŒ',
+   'InternalFlashAE2' => 'å
+èµãã©ãã·ã¥AE2ïŒ',
+   'InternalFlashAE2_0' => 'å
+èµãã©ãã·ã¥AE2(0)ïŒ',
+   'InternalFlashMode' => {
+      Description => 'å
+èµã¹ãã­ãã¢ãŒã',
+      PrintConv => {
+        'Did not fire, (Unknown 0xf4)' => 'ãªãïŒæªç¢ºèª 0xF4?ïŒ',
+        'Did not fire, Auto' => 'ãªãããªãŒã',
+        'Did not fire, Auto, Red-eye reduction' => 'ãªãããªãŒããèµ€ç®è»œæž',
+        'Did not fire, Normal' => 'ãªããæšæº',
+        'Did not fire, Red-eye reduction' => 'ãªããèµ€ç®è»œæž',
+        'Did not fire, Slow-sync' => 'ãªããã¹ã­ãŒã·ã³ã¯ã­',
+        'Did not fire, Slow-sync, Red-eye reduction' => 'ãªããã¹ã­ãŒã·ã³ã¯ã­ãèµ€ç®è»œæž',
+        'Did not fire, Trailing-curtain Sync' => 'ãªããåŸå¹ã·ã³ã¯ã­',
+        'Did not fire, Wireless (Control)' => 'ãªããã¯ã€ã€ã¬ã¹ïŒã³ã³ãã­ãŒã«çºå
+ïŒ',
+        'Did not fire, Wireless (Master)' => 'ãªããã¯ã€ã€ã¬ã¹ïŒãã¹ã¿ãŒçºå
+ïŒ',
+        'Fired' => 'ãªã³',
+        'Fired, Auto' => 'ãªã³ããªãŒã',
+        'Fired, Auto, Red-eye reduction' => 'ãªã³ããªãŒããèµ€ç®è»œæž',
+        'Fired, Red-eye reduction' => 'ãªã³ãèµ€ç®è»œæž',
+        'Fired, Slow-sync' => 'ãªã³ãã¹ã­ãŒã·ã³ã¯ã­',
+        'Fired, Slow-sync, Red-eye reduction' => 'ãªã³ãã¹ã­ãŒã·ã³ã¯ã­ãèµ€ç®è»œæž',
+        'Fired, Trailing-curtain Sync' => 'ãªã³ãåŸå¹ã·ã³ã¯ã­',
+        'Fired, Wireless (Control)' => 'ãªã³ãã¯ã€ã€ã¬ã¹ïŒã³ã³ãã­ãŒã«çºå
+ïŒ',
+        'Fired, Wireless (Master)' => 'ãªã³ãã¯ã€ã€ã¬ã¹ïŒãã¹ã¿ãŒçºå
+ïŒ',
+        'n/a - Off-Auto-Aperture' => 'è©²åœãªã-èªåçµããªã',
+      },
+    },
+   'InternalFlashStrength' => 'å
+èµãã©ãã·ã¥åŒ·åºŠ',
+   'InternalFlashTable' => 'å
+èµãã©ãã·ã¥ããŒãã«',
+   'InternalSerialNumber' => 'å
+éšã·ãªã¢ã«çªå·',
+   'InteropIndex' => {
+      Description => 'ã€ã³ã¿ãŒãªãã©ããªãã£ID',
+      PrintConv => {
+        'R03 - DCF option file (Adobe RGB)' => 'R03: DCFãªãã·ã§ã³ãã¡ã€ã«(Adobe RGB)',
+        'R98 - DCF basic file (sRGB)' => 'R98: DCFåºæ¬ãã¡ã€ã«(sRGB)',
+        'THM - DCF thumbnail file' => 'THM: DCFãµã ãã€ã«ãã¡ã€ã«',
+      },
+    },
+   'InteropOffset' => 'äºææ§IFDãžã®ãã€ã³ã¿',
+   'InteropVersion' => 'ã€ã³ã¿ãŒãªãã©ããªãã£ããŒãžã§ã³',
+   'IntervalLength' => 'ã€ã³ã¿ãŒãã«é·',
+   'IntervalMode' => 'ã€ã³ã¿ãŒãã«ã¢ãŒã',
+   'IntervalNumber' => 'ã€ã³ã¿ãŒãã«æ°',
+   'JFIFVersion' => 'JFIFããŒãžã§ã³',
+   'JPEGACTables' => 'JPEG AC ããŒãã«',
+   'JPEGDCTables' => 'JPEG DC ããŒãã«',
+   'JPEGLosslessPredictors' => 'JPEGã­ã¹ã¬ã¹äºæž¬',
+   'JPEGPointTransforms' => 'JPEGäœçœ®å€æ',
+   'JPEGProc' => 'JPEGåŠç',
+   'JPEGQTables' => 'JPEG Q ããŒãã«',
+   'JPEGQuality' => 'JPEGãåè³ª',
+   'JPEGRestartInterval' => 'JPEGåééé',
+   'JPEGTables' => 'JPEGããŒãã«',
+   'JobID' => 'ãžã§ãID',
+   'JpgRecordedPixels' => 'JPEGèšé²ãµã€ãº',
+   'Keyword' => 'ã­ãŒã¯ãŒã',
+   'Keywords' => 'ã­ãŒã¯ãŒã',
+   'LC1' => 'ã¬ã³ãºããŒã¿',
+   'LC10' => 'Mv\' nv\' ããŒã¿',
+   'LC11' => 'AVC 1/EXP ããŒã¿',
+   'LC12' => 'Mv1 AvminsifããŒã¿',
+   'LC14' => 'UNT_12 UNT_6 ããŒã¿',
+   'LC15' => 'çµ±åãã©ãã·ã¥æé©ãšã³ãããŒã¿',
+   'LC2' => 'è·é¢ã³ãŒãããŒã¿',
+   'LC3' => 'Kå€(',
+   'LC4' => 'è¿è·é¢åå·®èšæ­£ããŒã¿',
+   'LC5' => 'æè²åå·®èšæ­£ããŒã¿',
+   'LC6' => 'ãªãŒãã³åå·®ããŒã¿',
+   'LC7' => 'AFæäœäœåç¶æ
+ããŒã¿ïŒLC7ïŒ',
+   'LCDDisplayAtPowerOn' => {
+      Description => 'é»æºã¹ã€ãããONãæã®æ¶²æ¶ç¹ç¯',
+      PrintConv => {
+        'Display' => 'ç¹ç¯',
+        'Retain power off status' => 'é»æºãOFFãæã®ç¶æ
+ãä¿æ',
+      },
+    },
+   'LCDDisplayReturnToShoot' => {
+      Description => 'æ¶²æ¶ã¢ãã¿ãŒè¡šç€ºäž­ã®æ®åœ±ç¶æ
+åŸ©åž°',
+      PrintConv => {
+        'Also with * etc.' => '*ãã¿ã³ãªã©ã§ãåŸ©åž°',
+        'With Shutter Button only' => 'ã·ã£ãã¿ãŒãã¿ã³ã§ã®ã¿åŸ©åž°',
+      },
+    },
+   'LCDIllumination' => {
+      Description => 'LCDã€ã«ãããŒã·ã§ã³',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'LCDIlluminationDuringBulb' => {
+      Description => 'ãã«ãæ®åœ±äž­ã®è¡šç€ºããã«ç
+§æ',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'LCDPanels' => 'äžé¢è¡šç€ºããã«ïŒèé¢è¡šç€ºããã«',
+   'LCHEditor' => {
+      Description => 'LCHãšãã£ã¿ãŒ',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'LanguageIdentifier' => 'èšèªè­å¥å­',
+   'LastFileNumber' => 'æçµãã¡ã€ã«çªå·',
+   'LeafData' => 'ãªãŒãããŒã¿',
+   'Lens' => 'ã¬ã³ãº',
+   'Lens35efl' => 'ã¬ã³ãº',
+   'LensAFStopButton' => {
+      Description => 'ã¬ã³ãºã»AFã¹ããããã¿ã³ã®æ©èœ',
+      PrintConv => {
+        'AE lock' => 'AEã­ãã¯',
+        'AE lock while metering' => 'AEã­ãã¯(ã¿ã€ããŒäž­)',
+        'AF Stop' => 'AFã¹ããã',
+        'AF point: M->Auto/Auto->ctr' => 'æž¬è·ç¹ ä»»æâèªå/èªåâäž­å€®',
+        'AF start' => 'AFã¹ã¿ãŒã',
+        'AF stop' => 'AFã¹ããã',
+        'IS start' => 'æãã¬è£æ­£æ©èœäœå',
+        'One Shot <-> AI servo' => 'ã¯ã³ã·ã§ãã/AIãµãŒã',
+        'Switch to registered AF point' => 'ç»é²AFãã¬ãŒã ãžã®åãæã',
+      },
+    },
+   'LensApertureRange' => 'ã¬ã³ãºçµãç¯å²',
+   'LensData' => 'Kå€(LC3)',
+   'LensDistortionParams' => 'ã¬ã³ãºæ­ªæ²ãã©ã¡ãŒã¿',
+   'LensDriveNoAF' => {
+      Description => 'AFæž¬è·äžèœæã®ã¬ã³ãºåäœ',
+      PrintConv => {
+        'Focus search off' => 'é§åããªã',
+        'Focus search on' => 'ãµãŒãé§åãã',
+      },
+    },
+   'LensFStops' => 'ã¬ã³ãºFå€',
+   'LensFirmwareVersion' => 'ã¬ã³ãºãã¡ãŒã ãŠã§ã¢ããŒãžã§ã³',
+   'LensID' => 'ã¬ã³ãºID',
+   'LensInfo' => 'ã¬ã³ãºæ
+å ±',
+   'LensKind' => 'ã¬ã³ãºçš®é¡/ããŒãžã§ã³(LC0)',
+   'LensProperties' => 'ã¬ã³ãºæ©èœïŒ',
+   'LensSerialNumber' => 'ã¬ã³ãºã·ãªã¢ã«çªå·',
+   'LensSpec' => 'ã¬ã³ãº',
+   'LensTemperature' => 'ã¬ã³ãºæž©åºŠ',
+   'LensType' => 'ã¬ã³ãºã¿ã€ã',
+   'LicenseType' => {
+      PrintConv => {
+        'Unknown' => 'äžæ',
+      },
+    },
+   'LightCondition' => 'ã©ã€ãã³ã³ãã£ã·ã§ã³',
+   'LightReading' => 'ã©ã€ããªãŒãã£ã³ã°',
+   'LightSource' => {
+      Description => 'å
+æº',
+      PrintConv => {
+        'Cloudy' => 'æã',
+        'Cool White Fluorescent' => 'çœè²èå
+ç¯',
+        'Custom 1-4' => 'ã«ã¹ã¿ã 1-4',
+        'Day White Fluorescent' => 'æŒçœè²èå
+ç¯',
+        'Daylight' => 'æŒå
+',
+        'Daylight Fluorescent' => 'æŒå
+è²èå
+ç¯',
+        'Fine Weather' => 'è¯ãå€©æ°',
+        'Flash' => 'ã¹ãã­ã',
+        'Fluorescent' => 'èå
+ç¯',
+        'ISO Studio Tungsten' => 'ISOã¹ã¿ãžãªã¿ã³ã°ã¹ãã³',
+        'Other' => 'ãã®ä»ã®å
+æº',
+        'Shade' => 'æ¥é°',
+        'Standard Light A' => 'æšæºã©ã€ãA',
+        'Standard Light B' => 'æšæºã©ã€ãB',
+        'Standard Light C' => 'æšæºã©ã€ãC',
+        'Tungsten (Incandescent)' => 'ã¿ã³ã°ã¹ãã³(çœç±ç¯)',
+        'Unknown' => 'äžæ',
+        'Warm White Fluorescent' => 'æçœå
+è²èå
+ç¯',
+        'White Fluorescent' => 'æž©çœè²èå
+ç¯',
+      },
+    },
+   'LightSourceSpecial' => {
+      Description => 'å
+æºã¹ãã·ã£ã«',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'Lightness' => 'æåºŠ',
+   'LinearResponseLimit' => 'ç·ååå¿éç',
+   'LinearizationTable' => 'ç·åœ¢åããŒãã«',
+   'Lit' => {
+      PrintConv => {
+        'No' => 'ããã',
+        'Yes' => 'ã¯ã',
+      },
+    },
+   'LiveViewExposureSimulation' => {
+      Description => 'ã©ã€ããã¥ãŒé²åºã·ãã¥ã¬ãŒã·ã§ã³',
+      PrintConv => {
+        'Disable (LCD auto adjust)' => 'ããªã(é©æ­£è¡šç€º)',
+        'Enable (simulates exposure)' => 'ãã(æ®åœ±é²åºã€ã¡ãŒãžè¡šç€º)',
+      },
+    },
+   'LiveViewShooting' => {
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'LocalizedCameraModel' => 'éå®ã«ã¡ã©ã¢ãã«',
+   'Location' => 'æ®åœ±å Žæ',
+   'LockMicrophoneButton' => {
+      Description => 'ãã­ãã¯ã/é²é³ãã¿ã³ ã¿ã³ã®æ©èœ',
+      PrintConv => {
+        'Protect (hold:record memo)' => 'ãã­ãã¯ã(é·æŒãã§é²é³)',
+        'Record memo (protect:disable)' => 'é²é³(ãã­ãã¯ãäžå¯)',
+      },
+    },
+   'LongExposureNoiseReduction' => {
+      Description => 'é·ç§é²å
+ãã€ãºãªãã¯ã·ã§ã³',
+      PrintConv => {
+        'Auto' => 'ãªãŒã',
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'LongFocal' => 'æé·çŠç¹',
+   'LookupTable' => 'ã«ãã¯ã¢ããããŒãã«',
+   'LoopStyle' => {
+      PrintConv => {
+        'Normal' => 'æšæº',
+      },
+    },
+   'Luminance' => 'èŒåºŠ',
+   'LuminanceNoiseReduction' => {
+      PrintConv => {
+        'High' => 'é«ã',
+        'Low' => 'ãœãã',
+        'Off' => 'ãªã',
+      },
+    },
+   'MB-D10Batteries' => 'MB-D10é»æºã¿ã€ã',
+   'MB-D80Batteries' => 'MB-D80ããããªãŒ',
+   'MIEVersion' => 'MIEããŒãžã§ã³',
+   'MIMEType' => 'MIMEã¿ã€ã',
+   'MSStereo' => {
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'Macro' => {
+      Description => 'ãã¯ã­',
+      PrintConv => {
+        'Macro' => 'ãã¯ã­',
+        'Manual' => 'ããã¥ã¢ã«',
+        'Normal' => 'æšæº',
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+        'Super Macro' => 'ã¹ãŒããŒãã¯ã­',
+      },
+    },
+   'MacroMode' => {
+      Description => 'ãã¯ã­ã¢ãŒã',
+      PrintConv => {
+        'Macro' => 'ãã¯ã­',
+        'Normal' => 'ããŒãã«',
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+        'Super Macro' => 'ã¹ãŒããŒãã¯ã­',
+        'Tele-Macro' => 'ãã¬ãã¯ã­',
+      },
+    },
+   'MagnifiedView' => {
+      Description => 'æ¡å€§ãºãŒã è¡šç€º',
+      PrintConv => {
+        'Image playback only' => 'åçæã®ã¿',
+        'Image review and playback' => 'æ®åœ±çŽåŸãšåçæ',
+      },
+    },
+   'MainDialExposureComp' => {
+      Description => 'Main Dial é²åºè£æ­£',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'Make' => 'ã¡ãŒã«ãŒ',
+   'MakeAndModel' => 'äœæãšã¢ãã«',
+   'MakerNote' => 'DNGãã©ã€ããŒãããŒã¿',
+   'MakerNoteOffset' => 'ã¡ãŒã«ãŒããŒããªãã»ãã',
+   'MakerNoteSafety' => {
+      Description => 'ã¡ãŒã«ãŒããŒãã»ãŒããã£',
+      PrintConv => {
+        'Safe' => 'å®å
+š',
+        'Unsafe' => 'å±éº',
+      },
+    },
+   'MakerNoteType' => 'ã¡ãŒã«ãŒããŒãã¿ã€ã',
+   'MakerNoteVersion' => 'ã¡ãŒã«ãŒããŒãããŒãžã§ã³',
+   'MakerNotes' => 'ã¡ãŒã«ãŒããŒã',
+   'ManometerPressure' => 'æ°å§èšå§å',
+   'ManometerReading' => 'æ°å§èšé«åºŠ',
+   'ManualFlash' => 'ããã¥ã¢ã«ãã©ãã·ã¥',
+   'ManualFlashOutput' => {
+      Description => 'ããã¥ã¢ã«ãã©ãã·ã¥åºå',
+      PrintConv => {
+        'Low' => 'ãœãã',
+        'n/a' => 'è©²åœç¡ã',
+      },
+    },
+   'ManualFocusDistance' => 'ããã¥ã¢ã«ãã©ãŒã«ã¹è·é¢',
+   'ManualTv' => {
+      Description => 'ããã¥ã¢ã«é²åºæTvãAvå€èš­å®',
+      PrintConv => {
+        'Tv=Control/Av=Main' => 'Två€=ãµãé»å­ãã€ã€ã«/Avå€=ã¡ã€ã³é»å­ãã€ã€ã«',
+        'Tv=Main/Av=Control' => 'Två€=ã¡ã€ã³é»å­ãã€ã€ã«/Avå€=ãµãé»å­ãã€ã€ã«',
+      },
+    },
+   'ManufactureDate' => 'è£œé æ¥ä»ïŒ',
+   'MaskedAreas' => 'ãã¹ã¯é å',
+   'MasterDocumentID' => 'ãã¹ã¿ææžID',
+   'MasterGain' => 'ãã¹ã¿ãŒã²ã€ã³',
+   'Matteing' => 'ãããã³ã°',
+   'MaxAperture' => 'æå€§çµã',
+   'MaxApertureAtCurrentFocal' => 'çŸåšçŠç¹è·é¢ã®æå€§çµã',
+   'MaxApertureAtMaxFocal' => 'æå€§çŠç¹ææå€§çµã',
+   'MaxApertureAtMinFocal' => 'æå°çŠç¹ææå€§çµã',
+   'MaxApertureValue' => 'æå€§ã¬ã³ãºå£åŸ',
+   'MaxContinuousRelease' => 'æå€§é£åã¬ãªãŒãº',
+   'MaxFocalLength' => 'æå€§çŠç¹è·é¢',
+   'MaxSampleValue' => 'æå€§ãµã³ãã«å€',
+   'MaximumDensityRange' => 'æå€§å¯åºŠç¯å²',
+   'MeasuredEV' => 'èšæž¬EV',
+   'Measurement' => 'æž¬å®ãªãã¶ãŒããŒ',
+   'MeasurementBacking' => 'ããã¯æž¬å®',
+   'MeasurementFlare' => 'ãã¬ã¢æž¬å®',
+   'MeasurementGeometry' => 'å¹Ÿäœå­Šæž¬å®',
+   'MeasurementIlluminant' => 'å
+æºæž¬å®',
+   'MeasurementObserver' => 'æž¬å®ãªãã¶ãŒããŒ',
+   'MediaBlackPoint' => 'ã¡ãã£ã¢é»ç¹',
+   'MediaType' => {
+      PrintConv => {
+        'Movie' => 'åç»',
+        'Normal' => 'æšæº',
+      },
+    },
+   'MediaWhitePoint' => 'ã¡ãã£ã¢çœç¹',
+   'Medium' => 'ããã«',
+   'MenuButtonDisplayPosition' => {
+      Description => 'ã¡ãã¥ãŒã®è¡šç€ºäœçœ®',
+      PrintConv => {
+        'Previous' => 'çŽåã®ã¡ãã¥ãŒ',
+        'Previous (top if power off)' => 'çŽåã®ã¡ãã¥ãŒïŒé»æºåã§å
+é ­ïŒ',
+        'Top' => 'ã¡ãã¥ãŒã®å
+é ­',
+      },
+    },
+   'MenuButtonReturn' => {
+      PrintConv => {
+        'Previous' => 'çŽåã®ã¡ãã¥ãŒ',
+        'Top' => 'äž',
+      },
+    },
+   'Metering' => {
+      Description => 'æž¬å
+',
+      PrintConv => {
+        'Center-weighted' => 'äž­å€®éç¹',
+        'Matrix' => 'åå²',
+        'Spot' => 'ã¹ããã',
+      },
+    },
+   'MeteringMode' => {
+      Description => 'æž¬å
+ã¢ãŒã',
+      PrintConv => {
+        'Average' => 'å¹³å',
+        'Center-weighted average' => 'äž­å€®éç¹',
+        'Default' => 'ããã©ã«ã',
+        'Evaluative' => 'è©äŸ¡',
+        'Multi-segment' => 'ãã¿ãŒã³',
+        'Multi-spot' => 'ãã«ãã¹ããã',
+        'Other' => 'ãã®ä»',
+        'Partial' => 'éšå',
+        'Pattern+AF' => 'ãã¿ãŒã³+AF',
+        'Spot' => 'ã¹ããã',
+        'Spot+Highlight control' => 'ã¹ããã+ãã€ã©ã€ãã³ã³ãã­ãŒã«',
+        'Spot+Shadow control' => 'ã¹ããã+ã·ã£ããŠã³ã³ãã­ãŒã«',
+        'Unknown' => 'äžæ',
+      },
+    },
+   'MeteringMode2' => {
+      Description => 'æž¬å
+ã¢ãŒã2',
+      PrintConv => {
+        'Multi-segment' => 'ãã¿ãŒã³',
+      },
+    },
+   'MeteringMode3' => {
+      Description => 'æž¬å
+ã¢ãŒã3',
+      PrintConv => {
+        'Multi-segment' => 'ãã¿ãŒã³',
+      },
+    },
+   'MeteringTime' => 'èªåãªãã¿ã€ããŒ ã¡ãŒã¿ãªãæé',
+   'MinAperture' => 'æå°çµã',
+   'MinFocalLength' => 'æå°çŠç¹è·é¢',
+   'MinSampleValue' => 'æå°ãµã³ãã«å€',
+   'MinoltaCameraSettings2' => 'ã«ã¡ã©èš­å®2',
+   'MinoltaCameraSettings5D' => 'ã«ã¡ã©èš­å®(5D)',
+   'MinoltaCameraSettings7D' => 'ã«ã¡ã©èš­å®(7D)',
+   'MinoltaDate' => 'æ¥ä»',
+   'MinoltaImageSize' => {
+      Description => 'ã€ã¡ãŒãžãµã€ãº',
+      PrintConv => {
+        'Full' => 'ãã«',
+        'Large' => 'ã©ãŒãž',
+        'Medium' => 'ããã«',
+        'Small' => 'ã¹ã¢ãŒã«',
+      },
+    },
+   'MinoltaMakerNote' => 'ããã«ã¿ã¡ãŒã«ãŒããŒã',
+   'MinoltaModelID' => 'ã¢ãã«ID',
+   'MinoltaQuality' => {
+      Description => 'ã€ã¡ãŒãžåè³ª',
+      PrintConv => {
+        'Economy' => 'ãšã³ãããŒ',
+        'Extra Fine' => 'ãšã¯ã¹ãã©ãã¡ã€ã³',
+        'Extra fine' => 'ãšã¯ã¹ãã©ãã¡ã€ã³',
+        'Fine' => 'ãã¡ã€ã³',
+        'Normal' => 'æšæº',
+        'Standard' => 'ã¹ã¿ã³ããŒã',
+        'Super Fine' => 'ã¹ãŒããŒãã¡ã€ã³',
+      },
+    },
+   'MinoltaTime' => 'æé',
+   'MirrorLockup' => {
+      Description => 'ãã©ãŒã¢ããæ®åœ±',
+      PrintConv => {
+        'Disable' => 'ããªã',
+        'Enable' => 'ãã',
+        'Enable: Down with Set' => 'ãã(SETãã¿ã³ã§ããŠã³)',
+      },
+    },
+   'Model' => 'ç»åå
+¥åæ©åšã¢ãã«',
+   'Model2' => 'ç»åå
+¥åæ©åšã¢ãã«(2)',
+   'ModelTiePoint' => 'ã¢ãã«ææãã€ã³ãã¿ã°',
+   'ModelTransform' => 'ã¢ãã«å€åã¿ã°',
+   'ModelingFlash' => {
+      Description => 'ã¢ããªã³ã°ãã©ãã·ã¥',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'ModifiedPictureStyle' => {
+      PrintConv => {
+        'CM Set 1' => 'CMã»ãã1',
+        'CM Set 2' => 'CMã»ãã2',
+        'Faithful' => 'å¿ å®èš­å®',
+        'High Saturation' => 'é«åœ©åºŠ',
+        'Landscape' => 'é¢šæ¯',
+        'Low Saturation' => 'äœåœ©åºŠ',
+        'Monochrome' => 'ã¢ãããŒã³',
+        'Neutral' => 'ãã¥ãŒãã©ã«',
+        'None' => 'ç¡ã',
+        'Portrait' => 'ããŒãã¬ãŒã',
+        'Standard' => 'ã¹ã¿ã³ããŒã',
+        'User Def. 1' => 'ãŠãŒã¶èš­å®1',
+        'User Def. 2' => 'ãŠãŒã¶èš­å®2',
+        'User Def. 3' => 'ãŠãŒã¶èš­å®3',
+      },
+    },
+   'ModifiedSaturation' => {
+      Description => 'åœ©åºŠä¿®æ­£',
+      PrintConv => {
+        'CM1 (Red Enhance)' => 'CM1 (èµ€å¢)',
+        'CM2 (Green Enhance)' => 'CM2 (ç·å¢)',
+        'CM3 (Blue Enhance)' => 'CM3 (éå¢)',
+        'CM4 (Skin Tones)' => 'CM4 (èè²å¢)',
+        'Off' => 'ãªã',
+      },
+    },
+   'ModifiedSharpnessFreq' => {
+      PrintConv => {
+        'High' => 'é«ã',
+        'Low' => 'ãœãã',
+        'Standard' => 'ã¹ã¿ã³ããŒã',
+        'n/a' => 'è©²åœç¡ã',
+      },
+    },
+   'ModifiedToneCurve' => {
+      PrintConv => {
+        'Custom' => 'ã«ã¹ã¿ã ',
+        'Manual' => 'ããã¥ã¢ã«',
+        'Standard' => 'ã¹ã¿ã³ããŒã',
+      },
+    },
+   'ModifiedWhiteBalance' => {
+      PrintConv => {
+        'Auto' => 'ãªãŒã',
+        'Black & White' => 'çœé»',
+        'Cloudy' => 'æã',
+        'Custom' => 'ã«ã¹ã¿ã ',
+        'Custom 1' => 'ã«ã¹ã¿ã 1',
+        'Custom 2' => 'ã«ã¹ã¿ã 2',
+        'Custom 3' => 'ã«ã¹ã¿ã 3',
+        'Custom 4' => 'ã«ã¹ã¿ã 4',
+        'Daylight' => 'æŒå
+',
+        'Daylight Fluorescent' => 'æŒå
+è²èå
+ç¯',
+        'Flash' => 'ã¹ãã­ã',
+        'Fluorescent' => 'èå
+ç¯',
+        'Manual Temperature (Kelvin)' => 'ããã¥ã¢ã«çœç±ç¯ïŒã±ã«ãã³ïŒ',
+        'PC Set1' => 'PCèš­å®1',
+        'PC Set2' => 'PCèš­å®2',
+        'PC Set3' => 'PCèš­å®3',
+        'PC Set4' => 'PCèš­å®4',
+        'PC Set5' => 'PCèš­å®5',
+        'Shade' => 'æ¥é°',
+        'Tungsten' => 'ã¿ã³ã°ã¹ãã³(çœç±ç¯)',
+        'Underwater' => 'æ°Žäž­',
+      },
+    },
+   'ModifyDate' => 'ãã¡ã€ã«äœææ¥æ',
+   'MoireFilter' => {
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'MonitorOffTime' => 'ã¢ãã¿ãŒãªãé
+å»¶æé',
+   'MonochromeFilterEffect' => {
+      PrintConv => {
+        'Green' => 'ç·',
+        'None' => 'ç¡ã',
+        'Orange' => 'ãªã¬ã³ãž',
+        'Red' => 'èµ€',
+        'Yellow' => 'é»è²',
+      },
+    },
+   'MonochromeLinear' => {
+      PrintConv => {
+        'No' => 'ããã',
+        'Yes' => 'ã¯ã',
+      },
+    },
+   'MonochromeToningEffect' => {
+      PrintConv => {
+        'Blue' => 'é',
+        'Green' => 'ç·',
+        'None' => 'ç¡ã',
+        'Purple' => 'çŽ«',
+        'Sepia' => 'ã»ãã¢',
+      },
+    },
+   'MultiExposure' => 'å€éé²åºããŒã¿',
+   'MultiExposureAutoGain' => {
+      Description => 'å€éé²åºèªåã²ã€ã³',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'MultiExposureMode' => {
+      Description => 'å€éé²åºã¢ãŒã',
+      PrintConv => {
+        'Image Overlay' => 'ã€ã¡ãŒãžãªãŒããŒã¬ã€',
+        'Multiple Exposure' => 'å€éé²åº',
+        'Off' => 'ãªã',
+      },
+    },
+   'MultiExposureShots' => 'å€éé²åºã·ã§ãã',
+   'MultiExposureVersion' => 'å€éé²åºããŒã¿ããŒãžã§ã³',
+   'MultiFrameNoiseReduction' => {
+      Description => 'ãã«ãã·ã§ãããã€ãºãªãã¯ã·ã§ã³',
+      PrintConv => {
+        'Off' => 'å',
+        'On' => 'å
+¥',
+      },
+    },
+   'MultiSample' => 'ãã«ããµã³ãã«',
+   'MultiSelector' => {
+      Description => 'ãã«ãéžæ',
+      PrintConv => {
+        'Do Nothing' => 'äœãããªã',
+        'Reset Meter-off Delay' => 'ã¡ãŒã¿ãŒãªãé
+å»¶æéãªã»ãã',
+      },
+    },
+   'MultiSelectorPlaybackMode' => {
+      Description => 'ãã«ãéžæ åçã¢ãŒã',
+      PrintConv => {
+        'Choose Folder' => 'ãã©ã«ããŒéžæ',
+        'Thumbnail On/Off' => 'ãµã ãã€ã«ããªã³/ãªã',
+        'View Histograms' => 'ãã¹ãã°ã©ã è¡šç€º',
+        'Zoom On/Off' => 'ãºãŒã ããªã³/ãªã',
+      },
+    },
+   'MultiSelectorShootMode' => {
+      Description => 'ãã«ãéžæ æ®åœ±ã¢ãŒã',
+      PrintConv => {
+        'Highlight Active Focus Point' => 'ãã€ã©ã€ãã¢ã¯ãã£ããã©ãŒã«ã¹ãã€ã³ã',
+        'Not Used' => 'æªäœ¿çš',
+        'Select Center Focus Point' => 'äž­å€®ãã©ãŒã«ã¹ãã€ã³ãéžæ',
+      },
+    },
+   'MultipleExposureSet' => {
+      Description => 'å€éé²åºèš­å®',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'Mute' => {
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'MyColorMode' => {
+      PrintConv => {
+        'B&W' => 'çœé»',
+        'Color Accent' => 'ã«ã©ãŒã¢ã¯ã»ã³ã',
+        'Color Swap' => 'ã¹ã€ããã«ã©ãŒ',
+        'Custom' => 'ã«ã¹ã¿ã ',
+        'Dark Skin Tone' => 'ããŒã¯ã¹ã­ã³èª¿',
+        'Light Skin Tone' => 'ã©ã€ãã¹ã«ã€èª¿',
+        'Neutral' => 'ãã¥ãŒãã©ã«',
+        'Off' => 'ãªã',
+        'Positive Film' => 'ããžãã£ã«ã ',
+        'Sepia' => 'ã»ãã¢',
+        'Vivid' => 'ãããã',
+        'Vivid Blue' => 'ããããé',
+        'Vivid Green' => 'ããããç·',
+        'Vivid Red' => 'ããããèµ€',
+      },
+    },
+   'MyColors' => 'ãã€ã«ã©ãŒã¢ãŒã',
+   'NDFilter' => {
+      Description => 'NDãã£ã«ã¿ãŒ',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'NEFCompression' => {
+      Description => 'RAWå§çž®',
+      PrintConv => {
+        'Lossless' => 'ã­ã¹ã¬ã¹',
+        'Lossy (type 1)' => 'å§çž®ïŒã¿ã€ãïŒïŒ',
+        'Lossy (type 2)' => 'å§çž®ïŒã¿ã€ãïŒïŒ',
+        'Uncompressed' => 'éå§çž®',
+      },
+    },
+   'NamedColor2' => 'è²åç§°2',
+   'NativeDisplayInfo' => 'ãã€ãã£ããã£ã¹ãã¬ã€æ
+å ±',
+   'NewsPhotoVersion' => 'å ±éåçã¬ã³ãŒãããŒãžã§ã³',
+   'NikonCaptureData' => 'ãã³ã³ã­ã£ããã£ãŒããŒã¿',
+   'NikonCaptureOffsets' => 'ãã³ã³ã­ã£ããã£ãŒãªãã»ãã',
+   'NikonCaptureVersion' => 'ãã³ã³ã­ã£ããã£ãŒããŒãžã§ã³',
+   'NoMemoryCard' => {
+      Description => 'ã¡ã¢ãªãŒã«ãŒãç¡ã',
+      PrintConv => {
+        'Enable Release' => 'ã¬ãªãŒãºå¯èœ',
+        'Release Locked' => 'ã¬ãªãŒãºã­ãã¯',
+      },
+    },
+   'Noise' => 'ãã€ãº',
+   'NoiseFilter' => {
+      Description => 'ãã¯ãã£ãŒã¢ãŒããã€ãºãã£ã«ã¿ãŒ',
+      PrintConv => {
+        'High' => 'é«ã',
+        'Low' => 'ãœãã',
+        'Off' => 'ãªã',
+        'Standard' => 'ã¹ã¿ã³ããŒã',
+      },
+    },
+   'NoiseReduction' => {
+      Description => 'ãã€ãºãªãã¯ã·ã§ã³',
+      PrintConv => {
+        'Auto' => 'ãªãŒã',
+        'Low' => 'äœã',
+        'Normal' => 'æšæº',
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+        'Standard' => 'ã¹ã¿ã³ããŒã',
+      },
+    },
+   'NoiseReduction2' => 'ãã€ãºãªãã¯ã·ã§ã³2',
+   'NoiseReductionApplied' => 'é©çšãã€ãºãªãã¯ã·ã§ã³',
+   'NoiseReductionData' => 'ãã€ãºãªãã¯ã·ã§ã³ããŒã¿',
+   'NoiseReductionIntensity' => 'ãã€ãºãªãã¯ã·ã§ã³åŒ·åºŠ',
+   'NoiseReductionMethod' => 'ãã€ãºãªãã¯ã·ã§ã³æ¹æ³',
+   'NoiseReductionSharpness' => 'ãã€ãºãªãã¯ã·ã§ã³ã·ã£ãŒããã¹',
+   'NominalMaxAperture' => 'æå€§çµã',
+   'NominalMinAperture' => 'æå°çµã',
+   'NumAFPoints' => 'AFãã€ã³ãçªå·',
+   'NumIndexEntries' => 'ã€ã³ããã¯ã¹ãšã³ããªæ°',
+   'NumberofInks' => 'ã€ã³ã¯çªå·',
+   'OPIProxy' => 'OPIãã­ã­ã·ãŒ',
+   'ObjectAttributeReference' => 'ã€ã³ããªãžã£ã³ã«',
+   'ObjectCycle' => 'ãªããžã§ã¯ããµã€ã¯ã«',
+   'ObjectDistance' => 'è¢«åäœãšã®è·é¢',
+   'ObjectFileType' => {
+      PrintConv => {
+        'None' => 'ç¡ã',
+        'Unknown' => 'äžæ',
+      },
+    },
+   'ObjectName' => 'ã¿ã€ãã«',
+   'ObjectPreviewData' => 'ãªããžã§ã¯ãããŒã¿ãã¬ãã¥ãŒããŒã¿',
+   'ObjectPreviewFileFormat' => 'ãªããžã§ã¯ãããŒã¿ãã¬ãã¥ãŒãã¡ã€ã«åœ¢åŒ',
+   'ObjectPreviewFileVersion' => 'ãªããžã§ã¯ãããŒã¿ãã¬ãã¥ãŒãã¡ã€ã«åœ¢åŒããŒãžã§ã³',
+   'ObjectTypeReference' => 'ãªããžã§ã¯ãã¿ã€ãåç
+§',
+   'OffsetSchema' => 'ãªãã»ããã®æŠèŠ',
+   'OlympusImageHeight' => 'ã€ã¡ãŒãžé«',
+   'OlympusImageWidth' => 'ã€ã¡ãŒãžå¹
+',
+   'OneTouchWB' => {
+      Description => 'ã¯ã³ã¿ãããã¯ã€ããã©ã³ã¹',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+        'On (Preset)' => 'ãªã³ïŒããªã»ããïŒ',
+      },
+    },
+   'OpticalZoomCode' => 'å
+å­ŠãºãŒã ã³ãŒã',
+   'OpticalZoomMode' => {
+      Description => 'å
+å­ŠãºãŒã ã¢ãŒã',
+      PrintConv => {
+        'Extended' => 'EXå
+å­Š',
+        'Standard' => 'ã¹ã¿ã³ããŒã',
+      },
+    },
+   'OpticalZoomOn' => {
+      Description => 'å
+å­ŠãºãŒã ãªã³',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'Opto-ElectricConvFactor' => 'å
+é»äº€æé¢æ°',
+   'OrderNumber' => 'ãªãŒããŒçªå·',
+   'Orientation' => {
+      Description => 'ç»åã®åã',
+      PrintConv => {
+        'Horizontal (normal)' => 'æ°Žå¹³ïŒæšæºïŒ',
+        'Rotate 180' => '180åºŠåè»¢',
+        'Rotate 270 CW' => '270åºŠåè»¢ CW',
+        'Rotate 90 CW' => '90åºŠåè»¢ CW',
+      },
+    },
+   'OriginalDecisionDataOffset' => 'ãªãªãžãã«æ±ºå®ããŒã¿ãªãã»ãã',
+   'OriginalRawFileData' => 'ãªãªãžãã«RAWãã¡ã€ã«ããŒã¿',
+   'OriginalRawFileDigest' => 'ãªãªãžãã«RAWãã¡ã€ã«èŠçŽ',
+   'OriginalRawFileName' => 'ãªãªãžãã«RAWãã¡ã€ã«å',
+   'OriginalTransmissionReference' => 'äœæ¥­è­å¥å­',
+   'OriginatingProgram' => 'éå§ãã­ã°ã©ã ',
+   'OutputResponse' => 'åºååå¿',
+   'OwnerID' => 'ãªãŒããŒID',
+   'OwnerName' => 'ãªãŒããŒå',
+   'PEFVersion' => 'PEFããŒãžã§ã³',
+   'Padding' => 'åŒãäŒžã°ã',
+   'PageName' => 'ããŒãžå',
+   'PageNumber' => 'ããŒãžçªå·',
+   'PanasonicExifVersion' => 'ãããœããã¯ExifããŒãžã§ã³',
+   'PanasonicRawVersion' => 'ãããœããã¯RAWããŒãžã§ã³',
+   'PanasonicTitle' => 'ã¿ã€ãã«',
+   'PanoramaDirection' => 'Få€',
+   'PanoramaMode' => 'ããã©ãã¢ãŒã',
+   'PentaxImageSize' => 'ãã³ã¿ãã¯ã¹ã€ã¡ãŒãžãµã€ãº',
+   'PentaxModelID' => 'ãã³ã¿ãã¯ã¹ã¢ãã«',
+   'PentaxVersion' => 'ãã³ã¿ãã¯ã¹ããŒãžã§ã³',
+   'PhaseDetectAF' => {
+      Description => 'ãªãŒããã©ãŒã«ã¹',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On (51-point)' => 'ãªã³',
+      },
+    },
+   'PhotoEffect' => {
+      Description => 'åçå¹æ',
+      PrintConv => {
+        'B&W' => 'çœé»',
+        'Custom' => 'ã«ã¹ã¿ã ',
+        'Neutral' => 'ãã¥ãŒãã©ã«',
+        'Off' => 'ãªã',
+        'Sepia' => 'ã»ãã¢',
+        'Vivid' => 'ãããã',
+      },
+    },
+   'PhotoEffects' => {
+      Description => 'ãã©ããšãã§ã¯ã',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'PhotoEffectsBlue' => 'ãã©ããšãã§ã¯ãé',
+   'PhotoEffectsData' => 'ãã©ããšãã§ã¯ãããŒã¿',
+   'PhotoEffectsGreen' => 'ãã©ããšãã§ã¯ãç·',
+   'PhotoEffectsRed' => 'ãã©ããšãã§ã¯ãèµ€',
+   'PhotoEffectsType' => {
+      Description => 'ãã©ããšãã§ã¯ãã¿ã€ã',
+      PrintConv => {
+        'B&W' => 'çœé»',
+        'None' => 'ç¡ã',
+        'Sepia' => 'ã»ãã¢',
+        'Tinted' => 'æ·¡èª¿',
+      },
+    },
+   'PhotoInfoPlayback' => {
+      Description => 'åçæ
+å ±/åç',
+      PrintConv => {
+        'Info Left-right, Playback Up-down' => 'æ
+å ±<>/åç',
+        'Info Up-down, Playback Left-right' => 'æ
+å ±/åç<>',
+      },
+    },
+   'PhotometricInterpretation' => {
+      Description => 'ãã¯ã»ã«åœ¢åŒ',
+      PrintConv => {
+        'BlackIsZero' => 'é»ã¯ãŒã­',
+        'Color Filter Array' => 'CFA (ã«ã©ãŒãã£ã«ã¿ãŒãããªãã¯ã¹)',
+        'Pixar LogL' => 'CIE Log2(L) (ã­ã°èŒåºŠ)',
+        'Pixar LogLuv' => 'CIE Log2(L)(u\',v\') (ã­ã°èŒåºŠãšåºæºè²)',
+        'RGB Palette' => 'ãã¬ããè²',
+        'Transparency Mask' => 'éæåºŠãã¹ã¯',
+        'WhiteIsZero' => 'çœã¯ãŒã­',
+      },
+    },
+   'PhotoshopAnnotations' => 'ãã©ãã·ã§ããæ³šé',
+   'PhotoshopFormat' => {
+      PrintConv => {
+        'Standard' => 'ã¹ã¿ã³ããŒã',
+      },
+    },
+   'PictInfo' => 'åçæ
+å ±',
+   'PictureControl' => {
+      Description => 'ãã¯ãã£ãŒã³ã³ãã­ãŒã«',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'PictureControlActive' => {
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'PictureControlAdjust' => {
+      Description => 'ãã¯ãã£ãŒã³ã³ãã­ãŒã«èª¿æŽ',
+      PrintConv => {
+        'Default Settings' => 'ããã©ã«ãèš­å®',
+        'Full Control' => 'ãã«ã³ã³ãã­ãŒã«',
+        'Quick Adjust' => 'ã¯ã€ãã¯èª¿æŽ',
+      },
+    },
+   'PictureControlBase' => 'ãã¯ãã£ãŒã³ã³ãã­ãŒã«ããŒã¹',
+   'PictureControlName' => 'ãã¯ãã£ãŒã³ã³ãã­ãŒã«å',
+   'PictureControlQuickAdjust' => 'ãã¯ãã£ãŒã³ã³ãã­ãŒã«ã¯ã€ãã¯èª¿æŽ',
+   'PictureControlVersion' => 'ãã¯ãã£ãŒã³ã³ãã­ãŒã«ããŒãžã§ã³',
+   'PictureFinish' => {
+      Description => 'ãã¯ãã£ãŒãã£ããã·ã¥',
+      PrintConv => {
+        'Monochrome' => 'ã¢ãããŒã³',
+        'Natural' => 'ããã¥ã©ã«',
+        'Night Portrait' => 'äººç©å€æ¯',
+        'Night Scene' => 'å€æ¯',
+        'Portrait' => 'ããŒãã¬ãŒã',
+      },
+    },
+   'PictureMode' => {
+      Description => 'ãã¯ãã£ãŒã¢ãŒã',
+      PrintConv => {
+        '1/2 EV steps' => '1/2 EVã¹ããã',
+        '1/3 EV steps' => '1/3 EVã¹ããã',
+        'Anti-blur' => 'ææ¯ãè£æ­£',
+        'Aperture Priority' => 'çµãåªå
+',
+        'Aperture Priority, Off-Auto-Aperture' => 'çµãåªå
+ïŒèªåçµãOFFïŒ',
+        'Aperture-priority AE' => 'çµãåªå
+',
+        'Auto' => 'ãªãŒã',
+        'Auto PICT (Landscape)' => 'ãªãŒããã¯ãã£ãŒïŒé¢šæ¯ïŒ',
+        'Auto PICT (Macro)' => 'ãªãŒããã¯ãã£ãŒïŒãã¯ã­ïŒ',
+        'Auto PICT (Portrait)' => 'ãªãŒããã¯ãã£ãŒïŒããŒãã¬ãŒãïŒ',
+        'Auto PICT (Sport)' => 'ãªãŒããã¯ãã£ãŒïŒã¹ããŒãïŒ',
+        'Auto PICT (Standard)' => 'ãªãŒããã¯ãã£ãŒïŒæšæºïŒ',
+        'Autumn' => 'ç§',
+        'Beach' => 'ããŒã',
+        'Beach & Snow' => 'ããŒãïŒã¹ããŒ',
+        'Blur Reduction' => 'Digital SR',
+        'Bulb' => 'ãã«ã',
+        'Bulb, Off-Auto-Aperture' => 'ãã«ãïŒèªåçµãOFFïŒ',
+        'Candlelight' => 'ã­ã£ã³ãã«ã©ã€ã',
+        'DOF Program' => 'æ·±åºŠåªå
+ãã­ã°ã©ã ',
+        'DOF Program (HyP)' => 'æ·±åºŠåªå
+ãã­ã°ã©ã ïŒãã€ããŒãã­ã°ã©ã ïŒ',
+        'Dark Pet' => 'ãããé»è²',
+        'Digital Filter' => 'ããžã¿ã«ãã£ã«ã¿ãŒ',
+        'Fireworks' => 'è±ç«',
+        'Flash X-Sync Speed AE' => 'ã¹ãã­ãåèª¿éåºŠAE',
+        'Flower' => 'è±',
+        'Food' => 'æç',
+        'Frame Composite' => 'ãã¬ãŒã åæ',
+        'Green Mode' => 'ã°ãªãŒã³ã¢ãŒã',
+        'Hi-speed Program' => 'é«éåªå
+ãã­ã°ã©ã ',
+        'Hi-speed Program (HyP)' => 'é«éåªå
+ãã­ã°ã©ã ïŒãã€ããŒãã­ã°ã©ã ïŒ',
+        'Illustrations' => 'ã€ã©ã¹ã',
+        'Kids' => 'ã­ããº',
+        'Landscape' => 'é¢šæ¯',
+        'Light Pet' => 'ãããçœè²',
+        'MTF Program' => 'MTFåªå
+ãã­ã°ã©ã ',
+        'MTF Program (HyP)' => 'MTFåªå
+ãã­ã°ã©ã ïŒãã€ããŒãã­ã°ã©ã ïŒ',
+        'Macro' => 'ãã¯ã­',
+        'Manual' => 'ããã¥ã¢ã«',
+        'Manual, Off-Auto-Aperture' => 'ããã¥ã¢ã«ïŒèªåçµãOFFïŒ',
+        'Medium Pet' => 'ãããç°è²',
+        'Monotone' => 'ã¢ãããŒã³',
+        'Museum' => 'çŸè¡é€š',
+        'Muted' => 'åŒ±ãã',
+        'Natural' => 'ããã¥ã©ã«',
+        'Natural Light' => 'ããã¥ã©ã«ãã©ã',
+        'Natural Light & Flash' => 'ããã¥ã©ã«ãã©ãïŒãã©ãã·ã¥',
+        'Natural Skin Tone' => 'çŸè',
+        'Night Scene' => 'å€æ¯',
+        'Night Scene Portrait' => 'äººç©ãå€æ¯',
+        'No Flash' => 'ãã©ãã·ã¥ç¡ã',
+        'Panorama' => 'ããã©ã',
+        'Party' => 'ããŒãã£',
+        'Pet' => 'ããã',
+        'Portrait' => 'ããŒãã¬ãŒã',
+        'Program' => 'ãã­ã°ã©ã ',
+        'Program (HyP)' => 'ãã­ã°ã©ã AEïŒãã€ããŒãã­ã°ã©ã ïŒ',
+        'Program AE' => 'ãã­ã°ã©ã AE',
+        'Program Av Shift' => 'ãã­ã°ã©ã Avã·ãã',
+        'Program Tv Shift' => 'ãã­ã°ã©ã Tvã·ãã',
+        'Self Portrait' => 'èªåæ®ã',
+        'Sensitivity Priority AE' => 'æåºŠåªå
+AE',
+        'Sepia' => 'ã»ãã¢',
+        'Shutter & Aperture Priority AE' => 'ã·ã£ãã¿ãŒïŒçµãåªå
+AE',
+        'Shutter Speed Priority' => 'ã·ã£ãã¿ãŒåªå
+',
+        'Shutter speed priority AE' => 'ã·ã£ãã¿ãŒåªå
+',
+        'Snow' => 'ã¹ããŒ',
+        'Soft' => 'ãœãã',
+        'Sport' => 'ã¹ããŒã',
+        'Sports' => 'ã¹ããŒã',
+        'Standard' => 'ã¹ã¿ã³ããŒã',
+        'Sunset' => 'å€æ¥',
+        'Surf & Snow' => 'ãµãŒãïŒã¹ããŒ',
+        'Synchro Sound Record' => 'ãã€ã¹ã¬ã³ãŒãã£ã³ã°',
+        'Text' => 'ãã­ã¹ã',
+        'Underwater' => 'æ°Žäž­',
+        'Vivid' => 'ãããã',
+      },
+    },
+   'PictureMode2' => {
+      Description => 'ãã¯ãã£ãŒã¢ãŒã 2',
+      PrintConv => {
+        'Aperture Priority' => 'çµãåªå
+',
+        'Aperture Priority, Off-Auto-Aperture' => 'çµãåªå
+ïŒèªåçµããªãïŒ',
+        'Auto PICT' => 'ãªãŒããã¯ãã£',
+        'Bulb' => 'ãã«ã',
+        'Bulb, Off-Auto-Aperture' => 'ãã«ãïŒèªåçµããªãïŒ',
+        'Flash X-Sync Speed AE' => 'ã¹ãã­ãåèª¿éåºŠAE',
+        'Green Mode' => 'ã°ãªãŒã³ã¢ãŒã',
+        'Manual' => 'ããã¥ã¢ã«',
+        'Manual, Off-Auto-Aperture' => 'ããã¥ã¢ã«ïŒèªåçµããªãïŒ',
+        'Program AE' => 'ãã­ã°ã©ã AE',
+        'Program Av Shift' => 'ãã­ã°ã©ã Avã·ãã',
+        'Program Tv Shift' => 'ãã­ã°ã©ã Tvã·ãã',
+        'Scene Mode' => 'ã·ãŒã³ã¢ãŒã',
+        'Sensitivity Priority AE' => 'æåºŠåªå
+AE',
+        'Shutter & Aperture Priority AE' => 'ã·ã£ãã¿ãŒïŒçµãåªå
+AE',
+        'Shutter Speed Priority' => 'ã·ã£ãã¿ãŒåªå
+',
+      },
+    },
+   'PictureModeBWFilter' => {
+      Description => 'ãã¯ãã£ãŒã¢ãŒãBWãã£ã«ã¿ãŒ',
+      PrintConv => {
+        'Green' => 'ç·',
+        'Neutral' => 'ãã¥ãŒãã©ã«',
+        'Orange' => 'ãªã¬ã³ãž',
+        'Red' => 'èµ€',
+        'Yellow' => 'é»è²',
+        'n/a' => 'è©²åœç¡ã',
+      },
+    },
+   'PictureModeContrast' => 'ãã¯ãã£ãŒã¢ãŒãã³ã³ãã©ã¹ã',
+   'PictureModeHue' => 'ãã¯ãã£ãŒã¢ãŒãè²çžïŒ',
+   'PictureModeSaturation' => 'ãã¯ãã£ãŒã¢ãŒãåœ©åºŠ',
+   'PictureModeSharpness' => 'ãã¯ãã£ãŒã¢ãŒãã·ã£ãŒããã¹',
+   'PictureModeTone' => {
+      Description => 'ãã¯ãã£ãŒã¢ãŒãããŒã³',
+      PrintConv => {
+        'Blue' => 'é',
+        'Green' => 'ç·',
+        'Neutral' => 'ãã¥ãŒãã©ã«',
+        'Purple' => 'çŽ«',
+        'Sepia' => 'ã»ãã¢',
+        'n/a' => 'è©²åœç¡ã',
+      },
+    },
+   'PictureStyle' => {
+      Description => 'ãã¯ãã£ãŒã¹ã¿ã€ã«',
+      PrintConv => {
+        'CM Set 1' => 'CMã»ãã1',
+        'CM Set 2' => 'CMã»ãã2',
+        'Faithful' => 'å¿ å®èš­å®',
+        'High Saturation' => 'é«åœ©åºŠ',
+        'Landscape' => 'é¢šæ¯',
+        'Low Saturation' => 'äœåœ©åºŠ',
+        'Monochrome' => 'ã¢ãããŒã³',
+        'Neutral' => 'ãã¥ãŒãã©ã«',
+        'None' => 'ç¡ã',
+        'Portrait' => 'ããŒãã¬ãŒã',
+        'Standard' => 'ã¹ã¿ã³ããŒã',
+        'User Def. 1' => 'ãŠãŒã¶èš­å®1',
+        'User Def. 2' => 'ãŠãŒã¶èš­å®2',
+        'User Def. 3' => 'ãŠãŒã¶èš­å®3',
+      },
+    },
+   'PixelFormat' => {
+      Description => 'ãã¯ã»ã«ãã©ãŒããã',
+      PrintConv => {
+        'Black & White' => 'çœé»',
+      },
+    },
+   'PixelIntensityRange' => 'ãã¯ã»ã«åŒ·åºŠç¯å²',
+   'PixelScale' => 'ã¢ãã«ç»çŽ ã¹ã±ãŒã«ã¿ã°',
+   'PixelUnits' => {
+      PrintConv => {
+        'Unknown' => 'äžæ',
+      },
+    },
+   'PlanarConfiguration' => {
+      Description => 'ç»åããŒã¿ã®äžŠã³',
+      PrintConv => {
+        'Chunky' => 'ç¹é æ¬¡åœ¢åŒ (éã­åãã)',
+        'Planar' => 'å¹³é¢åœ¢åŒ',
+      },
+    },
+   'PowerSource' => {
+      Description => 'é»æº',
+      PrintConv => {
+        'Body Battery' => 'æ¬äœé»æº',
+        'External Power Supply' => 'å€éšé»æº',
+        'Grip Battery' => 'ããããªãŒã°ãªãã',
+      },
+    },
+   'PreCaptureFrames' => 'ãã¬ã­ã£ããã£ãŒãã¬ãŒã ',
+   'Predictor' => 'ææš',
+   'Preview0' => 'ãã¬ãã¥ãŒ0',
+   'Preview1' => 'ãã¬ãã¥ãŒ1',
+   'Preview2' => 'ãã¬ãã¥ãŒ2',
+   'PreviewApplicationName' => 'ãã¬ãã¥ãŒã¢ããªã±ãŒã·ã§ã³å',
+   'PreviewApplicationVersion' => 'ãã¬ãã¥ãŒã¢ããªã±ãŒã·ã§ã³ããŒãžã§ã³',
+   'PreviewColorSpace' => {
+      Description => 'ãã¬ãã¥ãŒè²ç©ºé',
+      PrintConv => {
+        'Unknown' => 'äžæ',
+      },
+    },
+   'PreviewDateTime' => 'ãã¬ãã¥ãŒæ¥æ',
+   'PreviewIFD' => 'ãã¬ãã¥ãŒIFDãã€ã³ã¿ãŒ',
+   'PreviewImage' => 'ãã¬ãã¥ãŒã€ã¡ãŒãž',
+   'PreviewImageBorders' => 'ãã¬ãã¥ãŒç»åå¢ç',
+   'PreviewImageData' => 'ãã¬ãã¥ãŒç»åããŒã¿',
+   'PreviewImageLength' => 'ãã¬ãã¥ãŒã€ã¡ãŒãžå®¹é',
+   'PreviewImageSize' => 'ãã¬ãã¥ãŒã€ã¡ãŒãžãµã€ãº',
+   'PreviewImageStart' => 'ãã¬ãã¥ãŒã€ã¡ãŒãžéå§',
+   'PreviewImageValid' => {
+      Description => 'æå¹ãã¬ãã¥ãŒç»å',
+      PrintConv => {
+        'No' => 'ããã',
+        'Yes' => 'ã¯ã',
+      },
+    },
+   'PreviewQuality' => {
+      PrintConv => {
+        'Economy' => 'ãšã³ãããŒ',
+        'Fine' => 'ãã¡ã€ã³',
+        'Normal' => 'æšæº',
+        'Normal Movie' => 'æšæºåç»',
+        'Superfine' => 'S.ãã¡ã€ã³',
+      },
+    },
+   'PreviewSettingsDigest' => 'ãã¬ãã¥ãŒèš­å®èŠçŽ',
+   'PreviewSettingsName' => 'ãã¬ãã¥ãŒèš­å®å',
+   'PrimaryAFPoint' => {
+      Description => 'ãã©ã€ããªAFãã€ã³ã',
+      PrintConv => {
+        'Bottom' => 'äž',
+        'C6 (Center)' => 'C6 (äž­å€®)',
+        'Center' => 'äž­å€®',
+        'Mid-left' => 'äž­å€®å·Š',
+        'Mid-right' => 'äž­å€®å³',
+        'Top' => 'äž',
+      },
+    },
+   'PrimaryChromaticities' => 'åè²è²åºŠ',
+   'PrimaryPlatform' => 'äž»èŠãã©ãããã©ãŒã ',
+   'PrintIM' => 'ããªã³ãã€ã¡ãŒãžãããã³ã°',
+   'ProcessingSoftware' => 'åŠçãœãããŠã§ã¢',
+   'ProductID' => 'è£œåID',
+   'ProductionCode' => 'ã«ã¡ã©ãä¿®çããããïŒ',
+   'ProfileCMMType' => 'CMMã¿ã€ããã­ãã£ãŒã«',
+   'ProfileCalibrationSig' => 'ãã­ãã£ãŒã«ã­ã£ãªãã¬ãŒã·ã§ã³ãµã€ã³',
+   'ProfileClass' => {
+      Description => 'ãã­ãã£ãŒã«ã¯ã©ã¹',
+      PrintConv => {
+        'Abstract Profile' => 'æç²ãã­ãã£ãŒã«',
+        'ColorSpace Conversion Profile' => 'è²ç©ºéå€æãã­ãã£ãŒã«',
+        'DeviceLink Profile' => 'ããã€ã¹ãªã³ã¯ãã­ãã£ãŒã«',
+        'Display Device Profile' => 'è¡šç€ºè£
+çœ®ãã­ãã£ãŒã«',
+        'Input Device Profile' => 'å
+¥åè£
+çœ®ãã­ãã£ãŒã«',
+        'NamedColor Profile' => 'è²åç§°ãã­ãã£ãŒã«',
+        'Nikon Input Device Profile (NON-STANDARD!)' => 'ãã³ã³ãã­ãã£ãŒã«("nkpf")',
+        'Output Device Profile' => 'åºåè£
+çœ®ãã­ãã£ãŒã«',
+      },
+    },
+   'ProfileConnectionSpace' => 'æ¥ç¶ã¹ããŒã¹ãã­ãã£ãŒã«',
+   'ProfileCopyright' => 'ãã­ãã£ãŒã«èäœæš©',
+   'ProfileCreator' => 'ãã­ãã£ãŒã«è£œäœè
+',
+   'ProfileDateTime' => 'ãã­ãã£ãŒã«æ¥æ',
+   'ProfileDescription' => 'ãã­ãã£ãŒã«èª¬æ',
+   'ProfileDescriptionML' => 'ãã­ãã£ãŒã«èª¬æML',
+   'ProfileEmbedPolicy' => {
+      Description => 'ãã­ãã£ãŒã«åãèŸŒã¿æ¹é',
+      PrintConv => {
+        'Allow Copying' => 'ã³ããŒèš±å¯',
+        'Embed if Used' => 'åãèŸŒã¿äœ¿çš',
+        'Never Embed' => 'åãèŸŒã¿çŠæ­¢',
+        'No Restrictions' => 'ç¡å¶é',
+      },
+    },
+   'ProfileFileSignature' => 'ãã­ãã£ãŒã«ãã¡ã€ã«ã·ã°ããŒãã£',
+   'ProfileHueSatMapData1' => 'è²çžSat.ãããããŒã¿ãã­ãã£ãŒã«1',
+   'ProfileHueSatMapData2' => 'è²çžSat.ãããããŒã¿ãã­ãã£ãŒã«2',
+   'ProfileHueSatMapDims' => 'è²å¢ç',
+   'ProfileID' => 'ãã­ãã£ãŒã«ID',
+   'ProfileLookTableData' => 'è¡šç€ºããŒãã«ããŒã¿ãã­ãã£ãŒã«',
+   'ProfileLookTableDims' => 'è²å¢ç',
+   'ProfileName' => 'ãã­ãã£ãŒã«å',
+   'ProfileSequenceDesc' => 'ãã­ãã£ãŒã«ã·ãŒã±ã³ã¹èª¬æ',
+   'ProfileToneCurve' => 'ããŒã³ã«ãŒããã­ãã£ãŒã«',
+   'ProfileVersion' => 'ãã­ãã£ãŒã«ããŒãžã§ã³',
+   'ProgramISO' => 'ãã­ã°ã©ã ISO',
+   'ProgramLine' => {
+      Description => 'ãã­ã°ã©ã ã©ã€ã³',
+      PrintConv => {
+        'Depth' => 'æ·±åºŠåªå
+',
+        'Hi Speed' => 'é«éåªå
+',
+        'MTF' => 'MTFåªå
+',
+        'Normal' => 'ããŒãã«',
+      },
+    },
+   'ProgramMode' => {
+      PrintConv => {
+        'Night Portrait' => 'äººç©å€æ¯',
+        'None' => 'ç¡ã',
+        'Portrait' => 'ããŒãã¬ãŒã',
+        'Sports' => 'ã¹ããŒã',
+        'Sunset' => 'å€æ¥',
+        'Text' => 'ãã­ã¹ã',
+      },
+    },
+   'ProgramShift' => 'ãã­ã°ã©ã ã·ãã',
+   'ProgramVersion' => 'ãã­ã°ã©ã ããŒãžã§ã³',
+   'Province-State' => 'è¡æ¿åº/å·',
+   'Quality' => {
+      Description => 'åè³ª',
+      PrintConv => {
+        'Best' => 'S.ãã¡ã€ã³',
+        'Better' => 'ãã¡ã€ã³',
+        'Compressed RAW' => 'cRAW',
+        'Compressed RAW + JPEG' => 'cRAW+JPEG',
+        'Economy' => 'ãšã³ãããŒ',
+        'Extra Fine' => 'ãšã¯ã¹ãã©ãã¡ã€ã³',
+        'Fine' => 'ãã¡ã€ã³',
+        'Good' => 'ãšã³ãããŒ',
+        'Low' => 'äœç»è³ª',
+        'Normal' => 'ããŒãã«',
+        'Premium' => 'ãã¬ãã¢ã ',
+        'RAW + JPEG' => 'RAW+JPEG',
+        'Standard' => 'ã¹ã¿ã³ããŒã',
+      },
+    },
+   'QualityMode' => {
+      Description => 'åè³ªã¢ãŒã',
+      PrintConv => {
+        'Economy' => 'ãšã³ãããŒ',
+        'Fine' => 'ãã¡ã€ã³',
+        'Normal' => 'ããŒãã«',
+      },
+    },
+   'QuantizationMethod' => 'éå­åæ¹æ³',
+   'QuickControlDialInMeter' => {
+      Description => 'æž¬å
+ã¿ã€ããŒäž­ã®ãµãé»å­ãã€ã€ã«',
+      PrintConv => {
+        'AF point selection' => 'AFãã¬ãŒã éžæ',
+        'Exposure comp/Aperture' => 'é²åºè£æ­£/çµãæ°å€',
+        'ISO speed' => 'ISOæåºŠ',
+      },
+    },
+   'QuickShot' => {
+      Description => 'ã¯ã€ãã¯ã·ã§ãã',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'RAFVersion' => 'RAFããŒãžã§ã³',
+   'ROCInfo' => 'ROCæ
+å ±',
+   'RasterPadding' => 'ã©ã¹ã¿ããã£ã³ã°',
+   'RasterizedCaption' => 'ã©ã¹ã¿åè¡šé¡',
+   'Rating' => 'æ Œä»ã',
+   'RatingPercent' => 'æ Œä»ã(%)',
+   'RawAndJpgRecording' => {
+      Description => 'RAWãšJPEGèšé²',
+      PrintConv => {
+        'RAW+Large/Fine' => 'RAW+ã©ãŒãžïŒãã¡ã€ã³',
+        'RAW+Large/Normal' => 'RAW+ã©ãŒãžïŒããŒãã«',
+        'RAW+Medium/Fine' => 'RAW+ããã«ïŒãã¡ã€ã³',
+        'RAW+Medium/Normal' => 'RAW+ããã«ïŒããŒãã«',
+        'RAW+Small/Fine' => 'RAW+ã¹ã¢ãŒã«ïŒãã¡ã€ã³',
+        'RAW+Small/Normal' => 'RAW+ã¹ã¢ãŒã«ïŒããŒãã«',
+      },
+    },
+   'RawColorAdj' => {
+      PrintConv => {
+        'Custom' => 'ã«ã¹ã¿ã ',
+        'Faithful' => 'å¿ å®èš­å®',
+      },
+    },
+   'RawDataOffset' => 'RAWããŒã¿ãªãã»ãã',
+   'RawDataUniqueID' => 'RAWããŒã¿ãŠããŒã¯ID',
+   'RawDevAutoGradation' => {
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'RawDevColorSpace' => 'è²ç©ºé',
+   'RawDevContrastValue' => 'ã³ã³ãã©ã¹ãå€',
+   'RawDevEditStatus' => {
+      Description => 'ç·šéç¶æ
+',
+      PrintConv => {
+        'Edited (Landscape)' => 'ã¹ã¿ãžãªïŒé¢šæ¯ïŒ',
+        'Edited (Portrait)' => 'ã¹ã¿ãžãªïŒããŒãã¬ãŒãïŒ',
+        'Original' => 'ãªãªãžãã«',
+      },
+    },
+   'RawDevEngine' => {
+      Description => 'ãšã³ãžã³',
+      PrintConv => {
+        'Advanced High Speed' => 'ã¢ããã³ã¹é«é',
+        'High Function' => 'é«æ©èœ',
+        'High Speed' => 'é«é',
+      },
+    },
+   'RawDevExposureBiasValue' => 'é²åºãã€ã¢ã¹å€',
+   'RawDevGrayPoint' => 'ã°ã¬ãŒãã€ã³ã',
+   'RawDevMemoryColorEmphasis' => 'èšæ¶è²åŒ·èª¿',
+   'RawDevNoiseReduction' => 'ãã€ãºãã£ã«ã¿ãŒïŒå¢æïŒ',
+   'RawDevPMPictureTone' => {
+      PrintConv => {
+        'Blue' => 'é',
+        'Green' => 'ç·',
+        'Neutral' => 'ãã¥ãŒãã©ã«',
+        'Purple' => 'çŽ«',
+        'Sepia' => 'ã»ãã¢',
+      },
+    },
+   'RawDevPM_BWFilter' => {
+      PrintConv => {
+        'Green' => 'ç·',
+        'Neutral' => 'ãã¥ãŒãã©ã«',
+        'Orange' => 'ãªã¬ã³ãž',
+        'Red' => 'èµ€',
+        'Yellow' => 'é»è²',
+      },
+    },
+   'RawDevPictureMode' => {
+      PrintConv => {
+        'Natural' => 'ããã¥ã©ã«',
+        'Sepia' => 'ã»ãã¢',
+        'Vivid' => 'ãããã',
+      },
+    },
+   'RawDevSaturationEmphasis' => 'åœ©åºŠåŒ·èª¿',
+   'RawDevSettings' => 'ãã€ãºãªãã¯ã·ã§ã³',
+   'RawDevSharpnessValue' => 'ã³ã³ãã©ã¹ãå€',
+   'RawDevVersion' => 'RAWå±éããŒãžã§ã³',
+   'RawDevWBFineAdjustment' => 'ãã¯ã€ããã©ã³ã¹åŸ®èª¿æŽ',
+   'RawDevWhiteBalance' => {
+      PrintConv => {
+        'Color Temperature' => 'è²æž©åºŠ',
+      },
+    },
+   'RawDevWhiteBalanceValue' => 'ãã¯ã€ããã©ã³ã¹å€',
+   'RawImageCenter' => 'RAWã€ã¡ãŒãžã»ã³ã¿ãŒ',
+   'RawImageDigest' => 'RAWã€ã¡ãŒãžèŠçŽ',
+   'RawImageSegmentation' => 'RAWã€ã¡ãŒãžéšåçªå·',
+   'RawImageSize' => 'RAWã€ã¡ãŒãžãµã€ãº',
+   'RawInfoVersion' => 'RAWæ
+å ±ããŒãžã§ã³',
+   'RawJpgQuality' => {
+      Description => 'RAW JPEGãåè³ª',
+      PrintConv => {
+        'Economy' => 'ãšã³ãããŒ',
+        'Fine' => 'ãã¡ã€ã³',
+        'Normal' => 'æšæº',
+        'Normal Movie' => 'æšæºåç»',
+        'Superfine' => 'S.ãã¡ã€ã³',
+      },
+    },
+   'RawJpgSize' => {
+      Description => 'RAW JPEG ãµã€ãº',
+      PrintConv => {
+        'Large' => 'ã©ãŒãž',
+        'Medium' => 'ããã«',
+        'Medium 1' => 'ããã«1',
+        'Medium 2' => 'ããã«2',
+        'Medium 3' => 'ããã«3',
+        'Medium Movie' => 'ããã£ã¢ã åç»',
+        'Postcard' => 'ãã¬ã­',
+        'Small' => 'ã¹ã¢ãŒã«',
+        'Small Movie' => 'ã¹ã¢ãŒã«åç»',
+        'Widescreen' => 'ã¯ã€ãç»é¢',
+      },
+    },
+   'RecordMode' => {
+      Description => 'èšé²ã¢ãŒã',
+      PrintConv => {
+        'Aperture Priority' => 'çµãåªå
+',
+        'Best Shot' => 'ãã¹ãã·ã§ãã',
+        'Manual' => 'ããã¥ã¢ã«',
+        'Movie' => 'åç»',
+        'Movie (19)' => 'åç»ïŒ19ïŒ',
+        'Program AE' => 'ãã­ã°ã©ã AE',
+        'Shutter Priority' => 'ã·ã£ãã¿ãŒåªå
+',
+        'YouTube Movie' => 'YouTubeåç»',
+      },
+    },
+   'RecordShutterRelease' => 'ã¬ã³ãŒãã·ã£ãã¿ãŒã¬ãªãŒãº',
+   'RecordingMode' => {
+      Description => 'èšé²ã¢ãŒã',
+      PrintConv => {
+        'Auto' => 'ãªãŒã',
+        'Landscape' => 'é¢šæ¯',
+        'Manual' => 'ããã¥ã¢ã«',
+        'Night Scene' => 'å€æ¯',
+        'Panorama' => 'ããã©ã',
+        'Portrait' => 'ããŒãã¬ãŒã',
+        'Single Shutter' => 'ã·ã³ã°ã«ã·ã£ãã¿ãŒ',
+      },
+    },
+   'RedBalance' => 'ã¬ãããã©ã³ã¹',
+   'RedEyeCorrection' => {
+      PrintConv => {
+        'Automatic' => 'ãªãŒã',
+        'Off' => 'ãªã',
+      },
+    },
+   'RedEyeData' => 'èµ€ç®ããŒã¿',
+   'RedEyeReduction' => {
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'RedMatrixColumn' => 'èµ€è²ãããªãã¯ã¹å',
+   'RedTRC' => 'èµ€è²èª¿å¢æ®æ²ç·',
+   'ReductionMatrix1' => 'çž®å°ãããªãã¯ã¹1',
+   'ReductionMatrix2' => 'çž®å°ãããªãã¯ã¹2',
+   'ReferenceBlackWhite' => 'çœé»ã®åºæºå€ã®äžçµ',
+   'ReferenceDate' => 'åç
+§æ¥ä»',
+   'ReferenceNumber' => 'åç
+§æ°',
+   'ReferenceService' => 'åç
+§ãµãŒãã¹',
+   'RelatedImageFileFormat' => 'é¢é£ã€ã¡ãŒãžãã¡ã€ã«åœ¢åŒ',
+   'RelatedImageHeight' => 'é¢é£ã€ã¡ãŒãžé«',
+   'RelatedImageWidth' => 'é¢é£ã€ã¡ãŒãžå¹
+',
+   'RelatedSoundFile' => 'é¢é£ãªãŒãã£ãªãã¡ã€ã«',
+   'ReleaseButtonToUseDial' => {
+      Description => 'ã¬ãªãŒãºãã¿ã³ããäœ¿çšãã€ã€ã«',
+      PrintConv => {
+        'No' => 'ããã',
+        'Yes' => 'ã¯ã',
+      },
+    },
+   'ReleaseDate' => 'ãªãªãŒã¹æ¥ä»',
+   'ReleaseTime' => 'ãªãªãŒã¹æé',
+   'RemoteOnDuration' => 'ãªã¢ãŒãæç¶æé',
+   'RenderingIntent' => {
+      Description => 'ææè¡šçŸ',
+      PrintConv => {
+        'ICC-Absolute Colorimetric' => 'çµ¶å¯Ÿæ¯è²åæ',
+        'Media-Relative Colorimetric' => 'çžå¯Ÿæ¯è²åæ',
+        'Perceptual' => 'ç¥èŠç',
+        'Saturation' => 'é£œå',
+      },
+    },
+   'RepeatingFlashCount' => 'ãªããŒãã£ã³ã°ãã©ãã·ã¥ æé',
+   'RepeatingFlashOutput' => 'ãªããŒãã£ã³ã°ãã©ãã·ã¥ åºå',
+   'RepeatingFlashRate' => 'ãªããŒãã£ã³ã°ãã©ãã·ã¥ åšæ³¢æ°',
+   'ResampleParamsQuality' => {
+      PrintConv => {
+        'High' => 'é«ã',
+        'Low' => 'ãœãã',
+      },
+    },
+   'Resaved' => {
+      Description => 'äºçŽ',
+      PrintConv => {
+        'No' => 'ããã',
+        'Yes' => 'ã¯ã',
+      },
+    },
+   'ResolutionMode' => 'è§£ååºŠã¢ãŒã',
+   'ResolutionUnit' => {
+      Description => 'XãšYè§£ååºŠåäœ',
+      PrintConv => {
+        'None' => 'ç¡ã',
+        'cm' => 'ãã¯ã»ã«/cm',
+        'inches' => 'ã€ã³ã',
+      },
+    },
+   'RetouchHistory' => {
+      Description => 'ã¬ã¿ããå±¥æ­Ž',
+      PrintConv => {
+        'None' => 'ç¡ã',
+        'Sepia' => 'ã»ãã¢',
+      },
+    },
+   'ReverseIndicators' => 'ææšéè»¢',
+   'Rotation' => {
+      Description => 'åè»¢',
+      PrintConv => {
+        'Horizontal' => 'æ°Žå¹³ïŒæšæºïŒ',
+        'Horizontal (Normal)' => 'æ°Žå¹³ïŒæšæºïŒ',
+        'Horizontal (normal)' => 'æ°Žå¹³ïŒæšæºïŒ',
+        'Rotate 180' => '180åºŠåè»¢',
+        'Rotate 270 CW' => '270åºŠåè»¢ CW',
+        'Rotate 90 CW' => '90åºŠåè»¢ CW',
+        'Rotated 180' => '180åºŠåè»¢',
+        'Rotated 270 CW' => '270åºŠåè»¢ CW',
+        'Rotated 90 CW' => '90åºŠåè»¢ CW',
+      },
+    },
+   'RowInterleaveFactor' => 'åãæãèŠå ',
+   'RowsPerStrip' => '1çã®åæ°',
+   'SMaxSampleValue' => 'S æå€§ãµã³ãã«å€',
+   'SMinSampleValue' => 'S æå°ãµã³ãã«å€',
+   'SPIFFVersion' => 'SPIFFããŒãžã§ã³',
+   'SRAWQuality' => {
+      PrintConv => {
+        'n/a' => 'è©²åœç¡ã',
+      },
+    },
+   'SRActive' => {
+      Description => 'æã¶ãè£æ­£ç¶æ
+',
+      PrintConv => {
+        'No' => 'ãªã',
+        'Yes' => 'ãªã³',
+      },
+    },
+   'SRFocalLength' => 'SRçŠç¹è·é¢',
+   'SRHalfPressTime' => 'ã·ã£ãã¿ãŒåæŒãæé',
+   'SRResult' => {
+      Description => 'SRå¹æ',
+      PrintConv => {
+        'Not stabilized' => 'ãªã',
+      },
+    },
+   'SVGVersion' => 'SVGããŒãžã§ã³',
+   'SafetyShift' => {
+      Description => 'ã»ã€ããã£ã·ãã',
+      PrintConv => {
+        'Disable' => 'ããªã',
+        'Enable (ISO speed)' => 'ãã(ISOæåºŠ)',
+        'Enable (Tv/Av)' => 'ãã(Tv/Avå€)',
+      },
+    },
+   'SafetyShiftInAvOrTv' => {
+      Description => 'ã»ã€ããã£ã·ããã®èš­å®',
+      PrintConv => {
+        'Disable' => 'ããªã',
+        'Enable' => 'ãã',
+      },
+    },
+   'SampleFormat' => 'ãµã³ãã«åœ¢åŒ',
+   'SampleStructure' => 'ãµã³ããªã³ã°æ§é ',
+   'SamplesPerPixel' => 'ã³ã³ããŒãã³ãæ°',
+   'SanyoQuality' => 'ãµã³ãšãŒåè³ª',
+   'SanyoThumbnail' => 'ãµã³ãšãŒãµã ãã€ã«',
+   'Saturation' => {
+      Description => 'åœ©åºŠ',
+      PrintConv => {
+        'Film Simulation' => 'ãã£ã«ã ã·ãã¥ã¬ãŒã·ã§ã³',
+        'High' => 'é«ãåœ©åºŠ',
+        'Low' => 'äœãåœ©åºŠ',
+        'Med High' => 'å°ãé«ã',
+        'Med Low' => 'å°ãäœã',
+        'Medium High' => 'å°ãé«ã',
+        'Medium Low' => 'å°ãäœã',
+        'None' => 'æªèš­å®',
+        'None (B&W)' => 'ç¡ãïŒé»ïŒçœïŒ',
+        'Normal' => 'æšæº',
+        'Very High' => 'ããªãé«ã',
+        'Very Low' => 'ããªãäœã',
+      },
+    },
+   'SaturationFaithful' => 'åœ©åºŠå¿ å®èš­å®',
+   'SaturationLandscape' => 'åœ©åºŠé¢šæ¯',
+   'SaturationNeutral' => 'åœ©åºŠãã¥ãŒãã©ã«',
+   'SaturationPortrait' => 'åœ©åºŠããŒãã¬ãŒã',
+   'SaturationSetting' => 'åœ©åºŠèš­å®',
+   'SaturationStandard' => 'åœ©åºŠã¹ã¿ã³ããŒã',
+   'SaturationUserDef1' => 'åœ©åºŠãŠãŒã¶èš­å®1',
+   'SaturationUserDef2' => 'åœ©åºŠãŠãŒã¶èš­å®2',
+   'SaturationUserDef3' => 'åœ©åºŠãŠãŒã¶èš­å®3',
+   'ScanImageEnhancer' => {
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'ScanningDirection' => 'èµ°æ»æ¹å',
+   'Scene' => 'å Žé¢',
+   'SceneArea' => 'ã·ãŒã³ãšãªã¢ïŒ',
+   'SceneAssist' => 'ã·ãŒã³èª¿æŽ',
+   'SceneCaptureType' => {
+      Description => 'ã·ãŒã³ã­ã£ããã£ã¿ã€ã',
+      PrintConv => {
+        'Landscape' => 'é¢šæ¯',
+        'Night' => 'å€æ¯',
+        'Portrait' => 'ããŒãã¬ãŒã',
+        'Standard' => 'ã¹ã¿ã³ããŒã',
+      },
+    },
+   'SceneDetect' => 'ã·ãŒã³æ€åº',
+   'SceneDetectData' => 'ã·ãŒã³æ€åºããŒã¿ïŒ',
+   'SceneMode' => {
+      Description => 'ã·ãŒã³ã¢ãŒã',
+      PrintConv => {
+        '2 in 1' => '2ã€ã³1',
+        '3D Sweep Panorama' => '3D',
+        'Aerial Photo' => 'ç©ºæ®',
+        'Anti Motion Blur' => 'äººç©ãã¬è»œæž',
+        'Aperture Priority' => 'çµãåªå
+',
+        'Auction' => 'ã¢ã¯ã·ã§ã³',
+        'Auto' => 'ãªãŒã',
+        'Auto+' => 'Auto ã¢ããã³ã¹',
+        'Available Light' => 'èªç¶å
+',
+        'Baby' => 'èµ€ã¡ãã',
+        'Beach' => 'ããŒã',
+        'Beach & Snow' => 'ããŒãïŒã¹ããŒ',
+        'Behind Glass' => 'ã¬ã©ã¹è¶ã',
+        'Candle' => 'ã­ã£ã³ãã«',
+        'Candlelight' => 'ã­ã£ã³ãã«ã©ã€ã',
+        'Children' => 'å­äŸ',
+        'Color Effects' => 'ã«ã©ãŒãšãã§ã¯ã',
+        'Cont. Priority AE' => 'é£ç¶æ®åœ±åªå
+AE',
+        'Cuisine' => 'æç',
+        'Digital Image Stabilization' => 'ããžã¿ã«ææ¯ãè£æ­£',
+        'Documents' => 'ææž',
+        'Face Portrait' => 'å¯é¡',
+        'Fireworks' => 'è±ç«',
+        'Food' => 'æç',
+        'Handheld Night Shot' => 'ææã¡å€æ¯',
+        'High Key' => 'ãã€ã­ãŒ',
+        'High Sensitivity' => 'é«æåºŠ',
+        'High Speed Continuous Shooting' => 'é«éé£å',
+        'Indoor' => 'å±å
+æ®åœ±',
+        'Intelligent Auto' => 'ã€ã³ããªãžã§ã³ããªãŒã',
+        'Intelligent ISO' => 'ã€ã³ããªãžã§ã³ãISO',
+        'Landscape' => 'é¢šæ¯',
+        'Landscape+Portrait' => 'é¢šæ¯+äººç©',
+        'Low Key' => 'ã­ãŒã­ãŒ',
+        'Macro' => 'ãã¯ã­',
+        'Manual' => 'ããã¥ã¢ã«',
+        'Movie' => 'åç»',
+        'Movie Preview' => 'åç»ãã¬ãã¥ãŒ',
+        'Museum' => 'çŸè¡é€š',
+        'My Mode' => 'ãã€ã¢ãŒã',
+        'Nature Macro' => 'èªç¶ãã¯ã­',
+        'Night Portrait' => 'äººç©å€æ¯',
+        'Night Scene' => 'å€æ¯',
+        'Night Scenery' => 'å€æ¯',
+        'Night View/Portrait' => 'ãã€ããã¥ãŒ/ããŒãã¬ã€ã',
+        'Night+Portrait' => 'å€æ¯+äººç©',
+        'Normal' => 'ããŒãã«',
+        'Off' => 'ãªã',
+        'Panning' => 'ãã³ãã³ã°',
+        'Panorama' => 'ããã©ã',
+        'Panorama Assist' => 'ããã©ãã¢ã·ã¹ã',
+        'Party' => 'ããŒãã£',
+        'Pet' => 'ããã',
+        'Portrait' => 'ããŒãã¬ãŒã',
+        'Program' => 'ãã­ã°ã©ã ',
+        'Scenery' => 'é¢šæ¯',
+        'Self Portrait' => 'èªåæ®ã',
+        'Self Portrait+Self Timer' => 'èªåæ®ã+ã»ã«ãã¿ã€ããŒ',
+        'Self Protrait+Timer' => 'èªåæ®ã+ã»ã«ãã¿ã€ããŒ',
+        'Shoot & Select' => 'ã·ã§ããïŒã»ã¬ã¯ã',
+        'Shoot & Select1' => 'ã·ã§ããïŒã»ã¬ã¯ã1',
+        'Shoot & Select2' => 'ã·ã§ããïŒã»ã¬ã¯ã2',
+        'Shooting Guide' => 'æ®åœ±ã¬ã€ã',
+        'Shutter Priority' => 'ã·ã£ãã¿ãŒåªå
+',
+        'Simple' => 'ã·ã³ãã«',
+        'Smile Shot' => 'ã¹ãã€ã«ã·ã§ãã',
+        'Snow' => 'ã¹ããŒ',
+        'Soft Skin' => 'ãœããã¹ã­ã³',
+        'Sport' => 'ã¹ããŒã',
+        'Sports' => 'ã¹ããŒã',
+        'Spot' => 'ã¹ããã',
+        'Standard' => 'ã¹ã¿ã³ããŒã',
+        'Starry Night' => 'æç©º',
+        'Sunset' => 'å€æ¥',
+        'Super Macro' => 'ã¹ãŒããŒãã¯ã­',
+        'Sweep Panorama' => 'ã¹ã€ã³ã°ããã©ã',
+        'Text' => 'ãã­ã¹ã',
+        'Underwater' => 'æ°Žäž­',
+        'Underwater Macro' => 'æ°Žäž­ãã¯ã­',
+        'Underwater Snapshot' => 'æ°Žäž­ã¹ããã',
+        'Underwater Wide1' => 'æ°Žäž­ã¯ã€ã1',
+        'Underwater Wide2' => 'æ°Žäž­ã¯ã€ã2',
+        'Vivid' => 'ãããã',
+      },
+    },
+   'SceneModeUsed' => {
+      Description => 'ã·ãŒã³ã¢ãŒã',
+      PrintConv => {
+        'Aperture Priority' => 'çµãåªå
+',
+        'Beach' => 'ããŒã',
+        'Candlelight' => 'ã­ã£ã³ãã«ã©ã€ã',
+        'Fireworks' => 'è±ç«',
+        'Landscape' => 'é¢šæ¯',
+        'Macro' => 'ãã¯ã­',
+        'Manual' => 'ããã¥ã¢ã«',
+        'Night Portrait' => 'äººç©å€æ¯',
+        'Portrait' => 'ããŒãã¬ãŒã',
+        'Program' => 'ãã­ã°ã©ã ',
+        'Shutter Priority' => 'ã·ã£ãã¿ãŒåªå
+',
+        'Snow' => 'ã¹ããŒ',
+        'Sunset' => 'å€æ¥',
+        'Text' => 'ãã­ã¹ã',
+      },
+    },
+   'SceneSelect' => {
+      Description => 'ã·ãŒã³éžæ',
+      PrintConv => {
+        'Lamp' => 'ã©ã³ã',
+        'Night' => 'å€æ¯',
+        'Off' => 'ãªã',
+        'Sport' => 'ã¹ããŒã',
+        'TV' => 'ãã¬ã',
+        'User 1' => 'ãŠãŒã¶ãŒ1',
+        'User 2' => 'ãŠãŒã¶ãŒ2',
+      },
+    },
+   'SceneType' => {
+      Description => 'ã·ãŒã³ã¿ã€ã',
+      PrintConv => {
+        'Directly photographed' => 'çŽæ¥æ®åœ±ç»å',
+      },
+    },
+   'SecurityClassification' => {
+      Description => 'ã»ã­ã¥ãªãã£åºå',
+      PrintConv => {
+        'Confidential' => 'æ©å¯ææž',
+        'Restricted' => 'éå®',
+        'Secret' => 'ç§å¯',
+        'Top Secret' => 'æé«æ©å¯',
+        'Unclassified' => 'æªåé¡',
+      },
+    },
+   'SelectableAFPoint' => {
+      Description => 'ä»»æéžæå¯èœãªAFãã¬ãŒã ',
+      PrintConv => {
+        '11 points' => '11ç¹',
+        '19 points' => '19ç¹',
+        '45 points' => '45ç¹',
+        'Inner 9 points' => '9ç¹(å
+åŽ)',
+        'Outer 9 points' => '9ç¹(å€åŽ)',
+      },
+    },
+   'SelfTimer' => {
+      Description => 'ã»ã«ãã¿ã€ããŒé·',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'SelfTimer2' => 'ã»ã«ãã¿ã€ããŒ(2)',
+   'SelfTimerMode' => 'ã»ã«ãã¿ã€ããŒã¢ãŒã',
+   'SelfTimerTime' => 'ã»ã«ãã¿ã€ããŒé
+å»¶æé',
+   'SensingMethod' => {
+      Description => 'ã»ã³ãµãŒæ¹åŒ',
+      PrintConv => {
+        'Color sequential area' => 'ã·ãŒã±ã³ã·ã£ã«ã«ã©ãŒã»ã³ãµãŒ',
+        'Color sequential linear' => 'ã·ãŒã±ã³ã·ã£ã«ã«ã©ãŒã©ã€ã³ã»ã³ãµãŒ',
+        'Monochrome area' => 'ã¢ãã¯ã­ãšãªã¢ã»ã³ãµãŒ',
+        'Monochrome linear' => 'ã¢ãã¯ã­ã©ã€ã³ã»ã³ãµãŒ',
+        'Not defined' => 'æªå®çŸ©',
+        'One-chip color area' => 'åæ¿åŒã«ã©ãŒã»ã³ãµãŒ',
+        'Three-chip color area' => 'ïŒæ¿åŒã«ã©ãŒã»ã³ãµãŒ',
+        'Trilinear' => 'ïŒã©ã€ã³ã»ã³ãµãŒ',
+        'Two-chip color area' => 'ïŒæ¿åŒã«ã©ãŒã»ã³ãµãŒ',
+      },
+    },
+   'SensitivityAdjust' => 'æåºŠèª¿ç¯',
+   'SensitivitySteps' => {
+      Description => 'æåºŠã¹ããã',
+      PrintConv => {
+        '1 EV Steps' => '1EVã¹ããã',
+        'As EV Steps' => 'é²åºã¹ãããã«åŸã',
+      },
+    },
+   'SensorCleaning' => {
+      PrintConv => {
+        'Disable' => 'ããªã',
+        'Enable' => 'ãã',
+      },
+    },
+   'SensorHeight' => 'ã»ã³ãµãŒé«ã',
+   'SensorImageHeight' => 'ã»ã³ãµãŒé«ã',
+   'SensorImageWidth' => 'ã»ã³ãµãŒå¹
+',
+   'SensorLeftBorder' => 'ã€ã¡ãŒãžå·Šéš',
+   'SensorPixelSize' => 'ã»ã³ãµãŒãã¯ã»ã«ãµã€ãº',
+   'SensorTemperature' => 'ã»ã³ãµãŒæž©åºŠ',
+   'SensorTopBorder' => 'ã€ã¡ãŒãžäžéš',
+   'SensorWidth' => 'ã»ã³ãµãŒå¹
+',
+   'SequenceNumber' => 'ã·ãŒã±ã³ã¹çªå·',
+   'SequenceShotInterval' => 'ã·ãŒã±ã³ã¹ã·ã§ããã€ã³ã¿ãŒãã«',
+   'SequentialShot' => {
+      Description => 'ã·ãŒã±ã³ã·ã£ã«ã·ã§ãã',
+      PrintConv => {
+        'None' => 'ç¡ã',
+        'Standard' => 'ã¹ã¿ã³ããŒã',
+      },
+    },
+   'SerialNumber' => 'ã·ãªã¢ã«çªå·',
+   'SerialNumberFormat' => 'ã·ãªã¢ã«çªå·åœ¢åŒ',
+   'ServiceIdentifier' => 'ãµãŒãã¹è­å¥å­',
+   'SetButtonCrossKeysFunc' => {
+      Description => 'SETãã¿ã³/åå­ã­ãŒæ©èœ',
+      PrintConv => {
+        'Cross keys: AF point select' => 'åå­ã­ãŒ:AFãã¬ãŒã éžæ',
+        'Normal' => 'æšæº',
+        'Set: Flash Exposure Comp' => 'SET:èª¿å
+è£æ­£',
+        'Set: Parameter' => 'SET:çŸåãã©ã¡ãŒã¿ãŒéžæ',
+        'Set: Picture Style' => 'SET:ãã¯ãã£ãŒã¹ã¿ã€ã«',
+        'Set: Playback' => 'SET:ç»åã®åç',
+        'Set: Quality' => 'SET:èšé²ç»è³ª',
+      },
+    },
+   'SetButtonWhenShooting' => {
+      Description => 'æ®åœ±æã®SETãã¿ã³',
+      PrintConv => {
+        'Change parameters' => 'çŸåãã©ã¡ãŒã¿ãŒéžæ',
+        'Default (no function)' => 'éåžž(ãªã)',
+        'Disabled' => 'ç¡å¹',
+        'Flash exposure compensation' => 'èª¿å
+è£æ­£',
+        'ISO speed' => 'ISOæåºŠ',
+        'Image playback' => 'ç»ååç',
+        'Image quality' => 'èšé²ç»è³ªéžæ',
+        'Image size' => 'ç»åãµã€ãº',
+        'LCD monitor On/Off' => 'æ¶²æ¶ã¢ãã¿ãŒã®å
+¥/å',
+        'Menu display' => 'ã¡ãã¥ãŒè¡šç€º',
+        'Normal (disabled)' => 'éåžž(ç¡å¹)',
+        'Picture style' => 'ãã¯ãã£ãŒã¹ã¿ã€ã«',
+        'Quick control screen' => 'ã¯ã€ãã¯èš­å®ç»é¢',
+        'Record func. + media/folder' => 'èšé²æ©èœãšã¡ãã£ã¢ã»ãã©ã«ã',
+        'Record movie (Live View)' => 'åç»æ®åœ±(ã©ã€ããã¥ãŒ)',
+        'White balance' => 'ãã¯ã€ããã©ã³ã¹',
+      },
+    },
+   'SetFunctionWhenShooting' => {
+      Description => 'æ®åœ±æã®ã»ãããã¿ã³æ©èœ',
+      PrintConv => {
+        'Change Parameters' => 'çŸåãã©ã¡ãŒã¿ãŒéžæ',
+        'Change quality' => 'èšé²ç»è³ªéžæ',
+        'Default (no function)' => 'éåžž(ãªã)',
+        'Image replay' => 'ç»åã®åç',
+        'Menu display' => 'ã¡ãã¥ãŒè¡šç€º',
+      },
+    },
+   'ShadingCompensation' => {
+      Description => 'é°åœ±ä¿®æ­£',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'ShadingCompensation2' => {
+      Description => 'é°åœ±è£æ­£ç·šé',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'Shadow' => 'ã·ã£ããŠ',
+   'ShadowScale' => 'ã·ã£ããŠã¹ã±ãŒã«',
+   'Shadows' => 'ã·ã£ããŠ',
+   'ShakeReduction' => {
+      Description => 'æã¶ãè£æ­£(èš­å®)',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'ShakeReductionInfo' => 'SRå¹æ',
+   'Sharpness' => {
+      Description => 'ã·ã£ãŒããã¹',
+      PrintConv => {
+        'Film Simulation' => 'ãã£ã«ã ã·ãã¥ã¬ãŒã·ã§ã³',
+        'Hard' => 'ããŒã',
+        'Hard2' => 'ããŒã2',
+        'Med Hard' => 'å°ãããŒã',
+        'Med Soft' => 'å°ããœãã',
+        'Medium Hard' => 'ããã«ããŒã',
+        'Medium Soft' => 'ããã«ãœãã',
+        'Normal' => 'ããŒãã«',
+        'Sharp' => 'ã·ã£ãŒã',
+        'Soft' => 'ãœãã',
+        'Soft2' => 'ãœãã2',
+        'Very Hard' => 'ããªãããŒã',
+        'Very Soft' => 'ããªããœãã',
+        'n/a' => 'è©²åœç¡ã',
+      },
+    },
+   'SharpnessFactor' => 'ã·ã£ãŒããã¹èŠå ',
+   'SharpnessFaithful' => 'ã·ã£ãŒããã¹å¿ å®èš­å®',
+   'SharpnessFrequency' => {
+      PrintConv => {
+        'High' => 'é«ã',
+        'Low' => 'ãœãã',
+        'Standard' => 'ã¹ã¿ã³ããŒã',
+        'n/a' => 'è©²åœç¡ã',
+      },
+    },
+   'SharpnessLandscape' => 'ã·ã£ãŒããã¹é¢šæ¯',
+   'SharpnessMonochrome' => 'ã·ã£ãŒããã¹ã¢ãã¯ã­',
+   'SharpnessNeutral' => 'ã·ã£ãŒããã¹ãã¥ãŒãã©ã«',
+   'SharpnessPortrait' => 'ã·ã£ãŒããã¹ããŒãã¬ãŒã',
+   'SharpnessSetting' => 'ã·ã£ãŒããã¹èš­å®',
+   'SharpnessStandard' => 'ã·ã£ãŒããã¹ã¹ã¿ã³ããŒã',
+   'SharpnessUserDef1' => 'ã·ã£ãŒããã¹ãŠãŒã¶èš­å®1',
+   'SharpnessUserDef2' => 'ã·ã£ãŒããã¹ãŠãŒã¶èš­å®2',
+   'SharpnessUserDef3' => 'ã·ã£ãŒããã¹ãŠãŒã¶èš­å®3',
+   'ShootingInfoDisplay' => {
+      Description => 'æ®åœ±æ
+å ±è¡šç€º',
+      PrintConv => {
+        'Auto' => 'ãªãŒã',
+        'Manual (dark on light)' => 'æå-é»å°ã«çœ',
+        'Manual (light on dark)' => 'æå-çœå°ã«é»',
+      },
+    },
+   'ShootingMode' => {
+      Description => 'æ®åœ±ã¢ãŒã',
+      PrintConv => {
+        'Aerial Photo' => 'ç©ºæ®',
+        'Aperture Priority' => 'çµãåªå
+',
+        'Baby' => 'èµ€ã¡ãã',
+        'Beach' => 'ããŒã',
+        'Candlelight' => 'ã­ã£ã³ãã«ã©ã€ã',
+        'Clipboard' => 'ã¡ã¢',
+        'Color Effects' => 'ã«ã©ãŒãšãã§ã¯ã',
+        'Economy' => 'ãšã³ã¢ãŒã',
+        'Fireworks' => 'è±ç«',
+        'Food' => 'æç',
+        'High Sensitivity' => 'é«æåºŠ',
+        'High Speed Continuous Shooting' => 'é«éé£å',
+        'Intelligent Auto' => 'ã€ã³ããªãžã§ã³ããªãŒã',
+        'Intelligent ISO' => 'ã€ã³ããªãžã§ã³ãISO',
+        'Macro' => 'ãã¯ã­',
+        'Manual' => 'ããã¥ã¢ã«',
+        'Movie Preview' => 'åç»ãã¬ãã¥ãŒ',
+        'Night Portrait' => 'äººç©å€æ¯',
+        'Night Scenery' => 'å€æ¯',
+        'Normal' => 'æšæº',
+        'Panning' => 'ãã³ãã³ã°',
+        'Panorama Assist' => 'ããã©ãã¢ã·ã¹ã',
+        'Party' => 'ããŒãã£',
+        'Pet' => 'ããã',
+        'Portrait' => 'ããŒãã¬ãŒã',
+        'Program' => 'ãã­ã°ã©ã ',
+        'Scenery' => 'é¢šæ¯',
+        'Self Portrait' => 'èªåæ®ã',
+        'Shutter Priority' => 'ã·ã£ãã¿ãŒåªå
+',
+        'Simple' => 'ã·ã³ãã«',
+        'Snow' => 'ã¹ããŒ',
+        'Soft Skin' => 'ãœããã¹ã­ã³',
+        'Sports' => 'ã¹ããŒã',
+        'Spot' => 'ã¹ããã',
+        'Starry Night' => 'æç©º',
+        'Sunset' => 'å€æ¥',
+        'Underwater' => 'æ°Žäž­',
+      },
+    },
+   'ShootingModeSetting' => {
+      Description => 'æ®åœ±ã¢ãŒã',
+      PrintConv => {
+        'Continuous' => 'é£ç¶æ®åœ±',
+        'Delayed Remote' => 'é
+å»¶ãªã¢ãŒã',
+        'Quick-response Remote' => 'å³æãªã¢ãŒã',
+        'Self-timer' => 'ã»ã«ãã¿ã€ããŒ',
+        'Single Frame' => 'ïŒã³ãæ®åœ±',
+      },
+    },
+   'ShortDocumentID' => 'ç­ææžID',
+   'ShortFocal' => 'æç­çŠç¹',
+   'ShortOwnerName' => 'ç­ããªãŒããŒå',
+   'ShortReleaseTimeLag' => {
+      Description => 'ã¬ãªãŒãºã¿ã€ã ã©ã°æéå',
+      PrintConv => {
+        'Disable' => 'ããªã',
+        'Enable' => 'ãã',
+      },
+    },
+   'ShotInfoVersion' => 'ã·ã§ããæ
+å ±ããŒãžã§ã³',
+   'Shutter-AELock' => {
+      Description => 'ã·ã£ãã¿ãŒãã¿ã³/AEã­ãã¯ãã¿ã³',
+      PrintConv => {
+        'AE lock/AF' => 'AEã­ãã¯/AF',
+        'AE/AF, No AE lock' => 'AE/AFïŒAEã­ãã¯ãªãïŒ',
+        'AF/AE lock' => 'AF/AEã­ãã¯',
+        'AF/AF lock' => 'AF/AFã­ãã¯',
+        'AF/AF lock, No AE lock' => 'AF/AFã­ãã¯ïŒAEã­ãã¯ãªãïŒ',
+      },
+    },
+   'ShutterAELButton' => 'ã·ã£ãã¿ãŒãã¿ã³ïŒAEã­ãã¯ãã¿ã³',
+   'ShutterButtonAFOnButton' => {
+      Description => 'ã·ã£ãã¿ãŒ/AF-ONãã¿ã³',
+      PrintConv => {
+        'AE lock/Metering + AF start' => 'AEã­ãã¯/æž¬å
+ã»AFéå§',
+        'Metering + AF start' => 'æž¬å
+ã»AFéå§',
+        'Metering + AF start/AF stop' => 'æž¬å
+ã»AFéå§/AFã¹ããã',
+        'Metering + AF start/disable' => 'æž¬å
+ã»AFéå§/ç¡å¹',
+        'Metering start/Meter + AF start' => 'æž¬å
+éå§/æž¬å
+ã»AFéå§',
+      },
+    },
+   'ShutterCount' => 'ã·ã£ãã¿ãŒåæ°',
+   'ShutterCurtainSync' => {
+      Description => 'ã¹ãã­ãã®ã·ã³ã¯ã­ã¿ã€ãã³ã°',
+      PrintConv => {
+        '1st-curtain sync' => 'å
+å¹ã·ã³ã¯ã­',
+        '2nd-curtain sync' => 'åŸå¹ã·ã³ã¯ã­',
+      },
+    },
+   'ShutterMode' => {
+      PrintConv => {
+        'Aperture Priority' => 'çµãåªå
+',
+        'Auto' => 'ãªãŒã',
+      },
+    },
+   'ShutterReleaseButtonAE-L' => {
+      Description => 'ã·ã£ãã¿ãŒã¬ãªãŒãºãã¿ã³ãAE-L',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'ShutterReleaseNoCFCard' => {
+      Description => 'CFã«ãŒãæªè£
+å¡«æã®ã¬ãªãŒãº',
+      PrintConv => {
+        'No' => 'ããã',
+        'Yes' => 'ã¯ã',
+      },
+    },
+   'ShutterSpeed' => 'é²åºæé',
+   'ShutterSpeedRange' => {
+      Description => 'ã·ã£ãã¿ãŒéåºŠã®å¶åŸ¡ç¯å²ã®èš­å®',
+      PrintConv => {
+        'Disable' => 'ããªã',
+        'Enable' => 'ãã',
+      },
+    },
+   'ShutterSpeedValue' => 'ã·ã£ãã¿ãŒã¹ããŒã',
+   'SimilarityIndex' => 'é¡äŒŒã€ã³ããã¯ã¹',
+   'Site' => 'ãµã€ã',
+   'SlaveFlashMeteringSegments' => 'ã¹ã¬ãŒããã©ãã·ã¥æž¬å
+å€',
+   'SlideShow' => {
+      PrintConv => {
+        'No' => 'ããã',
+        'Yes' => 'ã¯ã',
+      },
+    },
+   'SlowShutter' => {
+      Description => 'ã¹ã­ãŒã·ã£ãã¿ãŒ',
+      PrintConv => {
+        'Night Scene' => 'å€æ¯',
+        'None' => 'ç¡ã',
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'SlowSync' => {
+      Description => 'ã¹ã­ãŒã·ã³ã¯ã­',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'Software' => 'ãœãããŠã§ã¢',
+   'SoftwareVersion' => 'ãœãããŠã§ã¢ããŒãžã§ã³',
+   'Source' => 'ãœãŒã¹',
+   'SpatialFrequencyResponse' => 'ç©ºéåšæ³¢æ°ç¹æ§',
+   'SpecialEffectsOpticalFilter' => {
+      PrintConv => {
+        'None' => 'ç¡ã',
+      },
+    },
+   'SpecialInstructions' => 'æé ',
+   'SpecialMode' => 'ã¹ãã·ã£ã«ã¢ãŒã',
+   'SpectralSensitivity' => 'ã¹ãã¯ãã«æåºŠ',
+   'SpotFocusPointX' => 'ã¹ããããã©ãŒã«ã¹ãã€ã³ãX',
+   'SpotFocusPointY' => 'ã¹ããããã©ãŒã«ã¹ãã€ã³ãY',
+   'SpotMeterLinkToAFPoint' => {
+      Description => 'æž¬è·ç¹é£åã¹ãããæž¬å
+',
+      PrintConv => {
+        'Disable (use center AF point)' => 'ããªã(äž­å€®åºå®',
+        'Enable (use active AF point)' => 'ãã(æž¬è·ç¹é£å)',
+      },
+    },
+   'SpotMeteringMode' => {
+      Description => 'ã¹ãããã¡ãŒã¿ãŒã¢ãŒã',
+      PrintConv => {
+        'Center' => 'äž­å€®',
+      },
+    },
+   'State' => 'éœéåºçå',
+   'StoNits' => 'Stoããã',
+   'StraightenAngle' => 'ã¹ãã¬ãŒãã¢ã³ã°ã«',
+   'StreamType' => {
+      PrintConv => {
+        'Text' => 'ãã­ã¹ã',
+      },
+    },
+   'StripByteCounts' => 'å§çž®çã®ãã€ãæ°',
+   'StripOffsets' => 'ç»åããŒã¿äœçœ®',
+   'Sub-location' => 'å Žæ',
+   'SubSecCreateDate' => 'ããžã¿ã«ããŒã¿äœææ¥æ',
+   'SubSecDateTimeOriginal' => 'ãªãªãžãã«ããŒã¿äœææ¥æ',
+   'SubSecModifyDate' => 'ãã¡ã€ã«äœææ¥æ',
+   'SubSecTime' => 'DateTimeãµãç§',
+   'SubSecTimeDigitized' => 'DateTimeDigitizedãµãç§',
+   'SubSecTimeOriginal' => 'DateTimeOriginalãµãç§',
+   'SubTileBlockSize' => 'ãµãã¿ã€ãã«ãã­ãã¯ãµã€ãº',
+   'SubfileType' => 'æ°èŠãµããã¡ã€ã«ã¿ã€ã',
+   'SubimageColor' => {
+      PrintConv => {
+        'Monochrome' => 'ã¢ãããŒã³',
+      },
+    },
+   'Subject' => 'ãµããžã§ã¯ã',
+   'SubjectArea' => 'å¯Ÿè±¡é å',
+   'SubjectDistance' => 'å¯Ÿè±¡è·é¢',
+   'SubjectDistanceRange' => {
+      Description => 'è¢«åäœè·é¢ç¯å²',
+      PrintConv => {
+        'Close' => 'è¿æ¯',
+        'Distant' => 'é æ¯',
+        'Macro' => 'ãã¯ã­',
+        'Unknown' => 'äžæ',
+      },
+    },
+   'SubjectLocation' => 'å¯Ÿè±¡é å',
+   'SubjectProgram' => {
+      Description => 'è¢«åäœãã­ã°ã©ã ',
+      PrintConv => {
+        'Night portrait' => 'äººç©å€æ¯',
+        'None' => 'ç¡ã',
+        'Portrait' => 'ããŒãã¬ãŒã',
+        'Sports action' => 'ã¹ããŒãã¢ã¯ã·ã§ã³',
+        'Sunset' => 'å€æ¥',
+        'Text' => 'ãã­ã¹ã',
+      },
+    },
+   'SubjectReference' => 'ãµããžã§ã¯ãã³ãŒã',
+   'Subsystem' => {
+      PrintConv => {
+        'Unknown' => 'äžæ',
+      },
+    },
+   'SuperMacro' => {
+      Description => 'ã¹ãŒããŒãã¯ã­',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On (1)' => 'ãªã³(1)',
+        'On (2)' => 'ãªã³(2)',
+      },
+    },
+   'SuperimposedDisplay' => {
+      Description => 'ã¹ãŒããŒã€ã³ããŒãºã®è¡šç€º',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'SupplementalCategories' => 'è£è¶³ã«ããŽãªãŒ',
+   'SupplementalType' => 'è£è¶³ã¿ã€ã',
+   'SvISOSetting' => 'SVISOæåºŠèš­å®',
+   'SwitchToRegisteredAFPoint' => {
+      Description => 'ç»é²AFãã¬ãŒã ãžã®åãæã',
+      PrintConv => {
+        'Disable' => 'ããªã',
+        'Enable' => 'ãã',
+      },
+    },
+   'T4Options' => 'T4ãªãã·ã§ã³',
+   'T6Options' => 'T6ãªãã·ã§ã³',
+   'TIFF-EPStandardID' => 'TIFF/EPæšæºID',
+   'TTL_DA_ADown' => 'TTL D/A Aãã£ã³ãã«ãããŠã³',
+   'TTL_DA_AUp' => 'TTL D/A Aãã£ã³ãã« ã¢ãã',
+   'TTL_DA_BDown' => 'TTL D/A Bãã£ã³ãã«ãããŠã³',
+   'TTL_DA_BUp' => 'TTL D/A Bãã£ã³ãã«ãã¢ãã',
+   'Tagged' => {
+      PrintConv => {
+        'No' => 'ããã',
+        'Yes' => 'ã¯ã',
+      },
+    },
+   'TargetAperture' => 'ã¿ãŒã²ããçµã',
+   'TargetExposureTime' => 'ã¿ãŒã²ããé²åºæé',
+   'TargetPrinter' => 'æšçããªã³ã¿',
+   'Technology' => {
+      Description => 'ãã¯ãã­ãžãŒ',
+      PrintConv => {
+        'Active Matrix Display' => 'ã¢ã¯ãã£ããããªã¯ã¹åãã£ã¹ãã¬ã€',
+        'Cathode Ray Tube Display' => 'CRTãã£ã¹ãã¬ã€',
+        'Digital Camera' => 'ããžã¿ã«ã«ã¡ã©',
+        'Dye Sublimation Printer' => 'æè¯åããªã³ã¿ãŒ',
+        'Electrophotographic Printer' => 'éé»èšé²åŒããªã³ã¿ãŒ',
+        'Electrostatic Printer' => 'éé»æ°ããªã³ã¿ãŒ',
+        'Film Scanner' => 'ãã€ã«ã ã¹ã­ã£ããŒ',
+        'Film Writer' => 'ãã£ã«ã ã©ã€ã¿ãŒ',
+        'Flexography' => 'ã¢ããªã³å°å·',
+        'Gravure' => 'ã°ã©ãã¢å°å·',
+        'Ink Jet Printer' => 'ã€ã³ã¯ãžã§ããããªã³ã¿ãŒ',
+        'Offset Lithography' => 'ãªãã»ããå°å·',
+        'Passive Matrix Display' => 'åçŽãããªã¯ã¹åãã£ã¹ãã¬ã€',
+        'Photo CD' => 'ãã©ãCD',
+        'Photo Image Setter' => 'ãã©ãã€ã¡ãŒãžã»ãã¿ãŒ',
+        'Photographic Paper Printer' => 'å°ç»çŽããªã³ã¿ãŒ',
+        'Projection Television' => 'ãã­ãžã§ã¯ã·ã§ã³ãã¬ã',
+        'Reflective Scanner' => 'åå°ã¹ã­ã£ã',
+        'Silkscreen' => 'ã·ã«ã¯ã¹ã¯ãªãŒã³å°å·',
+        'Thermal Wax Printer' => 'ç±è»¢åããªã³ã¿ãŒ',
+        'Video Camera' => 'ãããªã«ã¡ã©',
+        'Video Monitor' => 'ãããªã¢ãã¿ãŒ',
+      },
+    },
+   'Teleconverter' => {
+      PrintConv => {
+        'None' => 'ç¡ã',
+      },
+    },
+   'Text' => 'ãã­ã¹ã',
+   'TextInfo' => 'ãã­ã¹ãæ
+å ±',
+   'TextStamp' => {
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'Thresholding' => 'éŸå€å',
+   'ThumbnailImage' => 'ãµã ãã€ã«ç»å',
+   'ThumbnailImageSize' => 'ãµã ãã€ã«ãµã€ãº',
+   'ThumbnailImageValidArea' => 'ãµã ãã€ã«ç»åæå¹é å',
+   'TileByteCounts' => 'ã¿ã€ã«ã®ãã€ãæ°',
+   'TileDepth' => 'ã¿ã€ã«ã®æ·±ã',
+   'TileLength' => 'ã¿ã€ã«ã®é·ã',
+   'TileOffsets' => 'ã¿ã€ã«ã®ãªãã»ãã',
+   'TileWidth' => 'ã¿ã€ã«ã®å¹
+',
+   'Time' => 'æé',
+   'TimeCreated' => 'äœææé',
+   'TimeScaleParamsQuality' => {
+      PrintConv => {
+        'High' => 'é«ã',
+        'Low' => 'ãœãã',
+      },
+    },
+   'TimeSent' => 'çºéæé',
+   'TimeSincePowerOn' => 'é»æºãªã³çµéæé',
+   'TimeStamp' => 'ã¿ã€ã ã¹ã¿ã³ã',
+   'TimeStamp1' => 'ã¿ã€ã ã¹ã¿ã³ã1',
+   'TimeZoneOffset' => 'ã¿ã€ã ãŸãŒã³ãªãã»ãã',
+   'TimerFunctionButton' => {
+      Description => 'ãã¡ã³ã¯ã·ã§ã³ãã¿ã³',
+      PrintConv => {
+        'ISO' => 'ISOæåºŠ',
+        'Image Quality/Size' => 'ç»ååè³ª/ãµã€ãº',
+        'Self-timer' => 'ã»ã«ãã¿ã€ããŒ',
+        'Shooting Mode' => 'æ®åœ±ã¢ãŒã',
+        'White Balance' => 'ãã¯ã€ããã©ã³ã¹',
+      },
+    },
+   'TimerLength' => {
+      Description => 'åçš®ã¿ã€ããŒä¿ææé',
+      PrintConv => {
+        'Disable' => 'ããªã',
+        'Enable' => 'ãã',
+      },
+    },
+   'Timezone' => 'ã¿ã€ã ãŸãŒã³',
+   'Title' => 'ã¿ã€ãã«',
+   'ToneComp' => 'ããŒã³è£æ­£',
+   'ToneCurve' => {
+      Description => 'ããŒã³ã«ãŒã',
+      PrintConv => {
+        'Custom' => 'ã«ã¹ã¿ã ',
+        'Manual' => 'ããã¥ã¢ã«',
+        'Standard' => 'ã¹ã¿ã³ããŒã',
+      },
+    },
+   'ToneCurveActive' => {
+      PrintConv => {
+        'No' => 'ããã',
+        'Yes' => 'ã¯ã',
+      },
+    },
+   'ToneCurveName' => {
+      PrintConv => {
+        'Custom' => 'ã«ã¹ã¿ã ',
+      },
+    },
+   'ToneCurves' => 'ããŒã³ã«ãŒã(s)',
+   'ToningEffect' => {
+      Description => 'ããŒã³å¹æ',
+      PrintConv => {
+        'B&W' => 'çœé»',
+        'Blue' => 'é',
+        'Blue-green' => 'éç·',
+        'Cyanotype' => 'éåç',
+        'Green' => 'ç·',
+        'None' => 'ç¡ã',
+        'Purple' => 'çŽ«',
+        'Purple-blue' => 'éçŽ«',
+        'Red' => 'èµ€',
+        'Red-purple' => 'èµ€çŽ«',
+        'Sepia' => 'ã»ãã¢',
+        'Yellow' => 'é»è²',
+        'n/a' => 'è©²åœç¡ã',
+      },
+    },
+   'ToningEffectMonochrome' => {
+      Description => 'ã¢ãã¯ã­ããŒã³å¹æ',
+      PrintConv => {
+        'Blue' => 'é',
+        'Green' => 'ç·',
+        'None' => 'ç¡ã',
+        'Purple' => 'çŽ«',
+        'Sepia' => 'ã»ãã¢',
+      },
+    },
+   'ToningSaturation' => 'åœ©åºŠããŒã³',
+   'TransferFunction' => 'è»¢éæ©èœ',
+   'TransferRange' => 'è»¢éç¯å²',
+   'Transformation' => {
+      Description => 'å€åœ¢',
+      PrintConv => {
+        'Horizontal (normal)' => 'æ°Žå¹³ïŒæšæºïŒ',
+        'Rotate 180' => '180åºŠåè»¢',
+        'Rotate 270 CW' => '270åºŠåè»¢ CW',
+        'Rotate 90 CW' => '90åºŠåè»¢ CW',
+      },
+    },
+   'TransmissionReference' => 'éä¿¡å
+èšé²',
+   'TransparencyIndicator' => 'éæåºŠææš',
+   'TrapIndicator' => 'ãã©ããã€ã³ãžã±ãŒã¿ãŒ',
+   'Trapped' => {
+      PrintConv => {
+        'Unknown' => 'äžæ',
+      },
+    },
+   'TravelDay' => 'ãã©ãã«æ¥ä»',
+   'TvExposureTimeSetting' => 'Tvé²åºæéèš­å®',
+   'Type' => 'ã¿ã€ã',
+   'USMLensElectronicMF' => {
+      Description => 'USMã¬ã³ãºã®é»å­åŒæåãã©ãŒã«ã¹',
+      PrintConv => {
+        'Disable after one-shot AF' => 'ã¯ã³ã·ã§ããAFäœååŸã»äžå¯',
+        'Disable in AF mode' => 'AFæãã¹ãŠäžå¯',
+        'Enable after one-shot AF' => 'ã¯ã³ã·ã§ããAFäœååŸã»å¯',
+      },
+    },
+   'Uncompressed' => {
+      Description => 'éå§çž®',
+      PrintConv => {
+        'No' => 'ããã',
+        'Yes' => 'ã¯ã',
+      },
+    },
+   'UniqueCameraModel' => 'ãŠããŒã¯ã«ã¡ã©ã¢ãã«',
+   'UniqueDocumentID' => 'ãŠããŒã¯ææžID',
+   'UniqueObjectName' => 'ãŠããŒã¯ã»ããŒã ã»ãªãã»ãªããžã§ã¯ã',
+   'Unknown' => 'äžæ',
+   'Unsharp1Color' => {
+      Description => 'ã¢ã³ã·ã£ãŒã1ã«ã©ãŒ',
+      PrintConv => {
+        'Blue' => 'é',
+        'Cyan' => 'ã·ã¢ã³',
+        'Green' => 'ç·',
+        'Magenta' => 'ããŒã³ã',
+        'Red' => 'èµ€',
+        'Yellow' => 'é»è²',
+      },
+    },
+   'Unsharp1HaloWidth' => 'ã¢ã³ã·ã£ãŒã1åå
+å¹
+',
+   'Unsharp1Intensity' => 'ã¢ã³ã·ã£ãŒã1åŒ·åºŠ',
+   'Unsharp1Threshold' => 'ã¢ã³ã·ã£ãŒã1èµ·ç¹',
+   'Unsharp2Color' => {
+      Description => 'ã¢ã³ã·ã£ãŒã2ã«ã©ãŒ',
+      PrintConv => {
+        'Blue' => 'é',
+        'Cyan' => 'ã·ã¢ã³',
+        'Green' => 'ç·',
+        'Magenta' => 'ããŒã³ã',
+        'Red' => 'èµ€',
+        'Yellow' => 'é»è²',
+      },
+    },
+   'Unsharp2HaloWidth' => 'ã¢ã³ã·ã£ãŒã2åå
+å¹
+',
+   'Unsharp2Intensity' => 'ã¢ã³ã·ã£ãŒã2åŒ·åºŠ',
+   'Unsharp2Threshold' => 'ã¢ã³ã·ã£ãŒã2èµ·ç¹',
+   'Unsharp3Color' => {
+      Description => 'ã¢ã³ã·ã£ãŒã3ã«ã©ãŒ',
+      PrintConv => {
+        'Blue' => 'é',
+        'Cyan' => 'ã·ã¢ã³',
+        'Green' => 'ç·',
+        'Magenta' => 'ããŒã³ã',
+        'Red' => 'èµ€',
+        'Yellow' => 'é»è²',
+      },
+    },
+   'Unsharp3HaloWidth' => 'ã¢ã³ã·ã£ãŒã3åå
+å¹
+',
+   'Unsharp3Intensity' => 'ã¢ã³ã·ã£ãŒã3åŒ·åºŠ',
+   'Unsharp3Threshold' => 'ã¢ã³ã·ã£ãŒã3èµ·ç¹',
+   'Unsharp4Color' => {
+      Description => 'ã¢ã³ã·ã£ãŒã4ã«ã©ãŒ',
+      PrintConv => {
+        'Blue' => 'é',
+        'Cyan' => 'ã·ã¢ã³',
+        'Green' => 'ç·',
+        'Magenta' => 'ããŒã³ã',
+        'Red' => 'èµ€',
+        'Yellow' => 'é»è²',
+      },
+    },
+   'Unsharp4HaloWidth' => 'ã¢ã³ã·ã£ãŒã4åå
+å¹
+',
+   'Unsharp4Intensity' => 'ã¢ã³ã·ã£ãŒã4åŒ·åºŠ',
+   'Unsharp4Threshold' => 'ã¢ã³ã·ã£ãŒã4èµ·ç¹',
+   'UnsharpCount' => 'ã¢ã³ã·ã£ãŒãã«ãŠã³ã',
+   'UnsharpData' => 'ã¢ã³ã·ã£ãŒãããŒã¿',
+   'UnsharpMask' => {
+      Description => 'ã¢ã³ã·ã£ãŒããã¹ã¯',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'Urgency' => 'ç·æ¥æ§',
+   'UsableMeteringModes' => {
+      Description => 'æž¬å
+ã¢ãŒãã®éå®',
+      PrintConv => {
+        'Disable' => 'ããªã',
+        'Enable' => 'ãã',
+      },
+    },
+   'UsableShootingModes' => {
+      Description => 'æ®åœ±ã¢ãŒãã®éå®',
+      PrintConv => {
+        'Disable' => 'ããªã',
+        'Enable' => 'ãã',
+      },
+    },
+   'UserComment' => 'ãŠãŒã¶ãŒã³ã¡ã³ã',
+   'UserDef1PictureStyle' => {
+      Description => 'ãŠãŒã¶èš­å®1 ãã¯ãã£ãŒã¹ã¿ã€ã«',
+      PrintConv => {
+        'Faithful' => 'å¿ å®èš­å®',
+        'Landscape' => 'é¢šæ¯',
+        'Monochrome' => 'ã¢ãããŒã³',
+        'Neutral' => 'ãã¥ãŒãã©ã«',
+        'Portrait' => 'ããŒãã¬ãŒã',
+        'Standard' => 'ã¹ã¿ã³ããŒã',
+      },
+    },
+   'UserDef2PictureStyle' => {
+      Description => 'ãŠãŒã¶èš­å®2 ãã¯ãã£ãŒã¹ã¿ã€ã«',
+      PrintConv => {
+        'Faithful' => 'å¿ å®èš­å®',
+        'Landscape' => 'é¢šæ¯',
+        'Monochrome' => 'ã¢ãããŒã³',
+        'Neutral' => 'ãã¥ãŒãã©ã«',
+        'Portrait' => 'ããŒãã¬ãŒã',
+        'Standard' => 'ã¹ã¿ã³ããŒã',
+      },
+    },
+   'UserDef3PictureStyle' => {
+      Description => 'ãŠãŒã¶èš­å®3 ãã¯ãã£ãŒã¹ã¿ã€ã«',
+      PrintConv => {
+        'Faithful' => 'å¿ å®èš­å®',
+        'Landscape' => 'é¢šæ¯',
+        'Monochrome' => 'ã¢ãããŒã³',
+        'Neutral' => 'ãã¥ãŒãã©ã«',
+        'Portrait' => 'ããŒãã¬ãŒã',
+        'Standard' => 'ã¹ã¿ã³ããŒã',
+      },
+    },
+   'VRDVersion' => 'VRDããŒãžã§ã³',
+   'VRInfo' => 'VRïŒææ¯ãè£æ­£ïŒæ
+å ±',
+   'VRInfoVersion' => 'VRæ
+å ±ããŒãžã§ã³',
+   'VR_0x66' => {
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On (active)' => 'ãªã³ïŒã¢ã¯ãã£ãïŒ',
+        'On (normal)' => 'ãªã³ïŒããŒãã«ïŒ',
+      },
+    },
+   'ValidAFPoints' => 'æå¹ãªAFãã€ã³ã',
+   'ValidBits' => 'ãã¯ã»ã«ã«ã€ãæå¹ãªããã',
+   'VariProgram' => 'ããªãã­ã°ã©ã ',
+   'Version' => 'ããŒãžã§ã³',
+   'VibrationReduction' => {
+      Description => 'ææ¯ãè£æ­£ïŒVRïŒ',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+        'On (1)' => 'ãªã³ïŒ1ïŒ',
+        'On (2)' => 'ãªã³ïŒ2ïŒ',
+        'On (3)' => 'ãªã³ïŒ3ïŒ',
+        'n/a' => 'è©²åœç¡ã',
+      },
+    },
+   'VideoCardGamma' => 'ãããªã«ãŒãã¬ã³ã',
+   'ViewInfoDuringExposure' => {
+      Description => 'é²å
+äž­ã®ãã¡ã€ã³ããŒå
+è¡šç€º',
+      PrintConv => {
+        'Disable' => 'ããªã',
+        'Enable' => 'ãã',
+      },
+    },
+   'ViewfinderWarning' => {
+      Description => 'ãã¥ãŒãã¡ã€ã³ããŒè­Šåè¡šç€º',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'ViewingCondDesc' => 'èŠèŽç¶æ
+èª¬æ',
+   'ViewingCondIlluminant' => 'èŠèŽç¶æ
+å
+æº',
+   'ViewingCondIlluminantType' => 'èŠèŽç¶æ
+å
+æºã¿ã€ã',
+   'ViewingCondSurround' => 'èŠèŽç¶æ
+åšèŸº',
+   'ViewingConditions' => 'èŠèŽç¶æ
+å
+æº',
+   'VignetteControl' => {
+      Description => 'ããããã³ã³ãã­ãŒã«',
+      PrintConv => {
+        'High' => 'é«ã',
+        'Low' => 'äœã',
+        'Normal' => 'æšæº',
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'VignetteControlIntensity' => 'ããããã³ã³ãã­ãŒã«åŒ·åºŠ',
+   'VoiceMemo' => {
+      Description => 'ãã€ã¹ã¡ã¢',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'WBAdjData' => 'ãã¯ã€ããã©ã³ã¹èª¿æŽããŒã¿',
+   'WBAdjLighting' => {
+      Description => 'ãã¯ã€ããã©ã³ã¹èª¿æŽãã©ã€ãã£ã³ã°',
+      PrintConv => {
+        'Daylight' => 'æŒå
+',
+        'Flash' => 'ã¹ãã­ã',
+        'High Color Rendering Fluorescent' => 'ãã€ã«ã©ãŒã¬ã³ããªã³ã°èå
+ç¯',
+        'Incandescent' => 'é»ç',
+        'None' => 'ç¡ã',
+        'Standard Fluorescent' => 'æšæºèå
+ç¯',
+      },
+    },
+   'WBAdjMode' => {
+      Description => 'ãã¯ã€ããã©ã³ã¹èª¿æŽã¢ãŒã',
+      PrintConv => {
+        'Calculate Automatically' => 'èªåèšç®',
+        'Recorded Value' => 'èšé²å€',
+        'Use Gray Point' => 'ã°ã¬ãŒãã€ã³ãäœ¿çš',
+        'Use Temperature' => 'æž©åºŠäœ¿çš',
+      },
+    },
+   'WBAdjTemperature' => 'ãã¯ã€ããã©ã³ã¹èª¿æŽãè²æž©åºŠ',
+   'WBAdjustAB' => 'ãã¯ã€ããã©ã³ã¹èª¿æŽA/B',
+   'WBAdjustGM' => 'ãã¯ã€ããã©ã³ã¹èª¿æŽG/M',
+   'WBBlueLevel' => 'ãã¯ã€ããã©ã³ã¹éã¬ãã«',
+   'WBBracketMode' => {
+      Description => 'ãã¯ã€ããã©ã³ã¹ãã©ã±ããã¢ãŒã',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On (shift AB)' => 'ãªã³ïŒã·ããABïŒ',
+        'On (shift GM)' => 'ãªã³ïŒã·ããGMïŒ',
+      },
+    },
+   'WBBracketValueAB' => 'ãã¯ã€ããã©ã³ã¹ãã©ã±ããå€AB',
+   'WBBracketValueGM' => 'ãã¯ã€ããã©ã³ã¹ãã©ã±ããå€GM',
+   'WBFineTuneActive' => {
+      PrintConv => {
+        'No' => 'ããã',
+        'Yes' => 'ã¯ã',
+      },
+    },
+   'WBGreenLevel' => 'ãã¯ã€ããã©ã³ã¹ç·ã¬ãã«',
+   'WBMediaImageSizeSetting' => {
+      Description => 'WB/ã¡ãã£ã¢ã»ç»åãµã€ãºã®èš­å®',
+      PrintConv => {
+        'LCD monitor' => 'æ¶²æ¶ã¢ãã¿ãŒ',
+        'Rear LCD panel' => 'èé¢è¡šç€ºããã«',
+      },
+    },
+   'WBMode' => {
+      Description => 'ãã¯ã€ããã©ã³ã¹ã¢ãŒã',
+      PrintConv => {
+        'Auto' => 'ãªãŒã',
+      },
+    },
+   'WBRedLevel' => 'ãã¯ã€ããã©ã³ã¹èµ€ã¬ãã«',
+   'WBShiftAB' => 'WB ABè£æ­£',
+   'WBShiftGM' => 'WB GMè£æ­£',
+   'WBShiftMG' => 'WB GMè£æ­£',
+   'WB_GBRGLevels' => 'WB GBRG ã¬ãã«',
+   'WB_GRBGLevels' => 'WB GRBG ã¬ãã«',
+   'WB_GRGBLevels' => 'WB GRGB ã¬ãã«',
+   'WB_RBGGLevels' => 'WB RBGG ã¬ãã«',
+   'WB_RBLevels' => 'WBãRBã¬ãã«',
+   'WB_RBLevels3000K' => 'WBãRGGB3000Kã¬ãã«',
+   'WB_RBLevels3300K' => 'WBãRGGB3300Kã¬ãã«',
+   'WB_RBLevels3600K' => 'WBãRGGB3600Kã¬ãã«',
+   'WB_RBLevels3900K' => 'WBãRGGB3800Kã¬ãã«',
+   'WB_RBLevels4000K' => 'WBãRGGB4000Kã¬ãã«',
+   'WB_RBLevels4300K' => 'WBãRGGB4300Kã¬ãã«',
+   'WB_RBLevels4500K' => 'WBãRGGB4500Kã¬ãã«',
+   'WB_RBLevels4800K' => 'WBãRGGB4800Kã¬ãã«',
+   'WB_RBLevels5300K' => 'WBãRGGB5300Kã¬ãã«',
+   'WB_RBLevels6000K' => 'WBãRGGB6000Kã¬ãã«',
+   'WB_RBLevels6600K' => 'WBãRGGB6600Kã¬ãã«',
+   'WB_RBLevels7500K' => 'WBãRGGB7500Kã¬ãã«',
+   'WB_RBLevelsAuto' => 'WB RB ã¬ãã« ãªãŒã',
+   'WB_RBLevelsCloudy' => 'WB RB ã¬ãã«ãæå€©',
+   'WB_RBLevelsCoolWhiteFluor' => 'WB RB ã¬ãã«ãå·çœèå
+ç¯',
+   'WB_RBLevelsDayWhiteFluor' => 'WB RB ã¬ãã«ãæŒçœèå
+ç¯',
+   'WB_RBLevelsDaylightFluor' => 'WB RB ã¬ãã«ãæŒå
+èå
+ç¯',
+   'WB_RBLevelsEveningSunlight' => 'WB RB ã¬ãã«ãå€æ¥',
+   'WB_RBLevelsFineWeather' => 'WB RB ã¬ãã«ãæŽå€©',
+   'WB_RBLevelsShade' => 'WB RB ã¬ãã«ãæ¥é°',
+   'WB_RBLevelsTungsten' => 'WB RB ã¬ãã«ãçœç±ç¯',
+   'WB_RBLevelsUsed' => 'WB RB ã¬ãã«äœ¿çš',
+   'WB_RBLevelsWhiteFluorescent' => 'WB RB ã¬ãã«ãçœèå
+ç¯',
+   'WB_RGBGLevels' => 'WB RGBG ã¬ãã«',
+   'WB_RGBLevels' => 'WB RGB ã¬ãã«',
+   'WB_RGBLevelsCloudy' => 'WB RGB ã¬ãã«ãæå€©',
+   'WB_RGBLevelsDaylight' => 'WB RGB ã¬ãã«ãæŒå
+',
+   'WB_RGBLevelsFlash' => 'WB RGB ã¬ãã«ãã¹ãã­ã',
+   'WB_RGBLevelsFluorescent' => 'WB RGGB ã¬ãã«ãèå
+ç¯',
+   'WB_RGBLevelsShade' => 'WB RGB ã¬ãã«ãæ¥é°',
+   'WB_RGBLevelsTungsten' => 'WB RGB ã¬ãã«ãçœç±ç¯',
+   'WB_RGGBLevels' => 'WB RGGB ã¬ãã«',
+   'WB_RGGBLevelsCloudy' => 'WB RGGB ã¬ãã«ãæå€©',
+   'WB_RGGBLevelsDaylight' => 'WB RGGB ã¬ãã«ãæŒå
+',
+   'WB_RGGBLevelsFlash' => 'WB RGGB ã¬ãã«ãã¹ãã­ã',
+   'WB_RGGBLevelsFluorescent' => 'WB RGGB ã¬ãã«ãèå
+ç¯',
+   'WB_RGGBLevelsFluorescentD' => 'WB RGGB ã¬ãã«ãèå
+ç¯(D)',
+   'WB_RGGBLevelsFluorescentN' => 'WB RGGB ã¬ãã«ãèå
+ç¯(N)',
+   'WB_RGGBLevelsFluorescentW' => 'WB RGGB ã¬ãã«ãèå
+ç¯(W)',
+   'WB_RGGBLevelsShade' => 'WB RGGB ã¬ãã«ãæ¥é°',
+   'WB_RGGBLevelsTungsten' => 'WB RGGB ã¬ãã«ãçœç±ç¯',
+   'WCSProfiles' => 'Windowsã«ã©ãŒã·ã¹ãã ãã­ãã£ãŒã«',
+   'WhiteBalance' => {
+      Description => 'ãã¯ã€ããã©ã³ã¹',
+      PrintConv => {
+        'Auto' => 'ãªãŒã',
+        'Black & White' => 'çœé»',
+        'Cloudy' => 'æã',
+        'Color Temperature/Color Filter' => 'è²æž©åºŠããã¥ã¢ã«æå®',
+        'Cool White Fluorescent' => 'çœè²èå
+ç¯',
+        'Custom' => 'ã«ã¹ã¿ã ',
+        'Custom 1' => 'ã«ã¹ã¿ã 1',
+        'Custom 2' => 'ã«ã¹ã¿ã 2',
+        'Custom 3' => 'ã«ã¹ã¿ã 3',
+        'Custom 4' => 'ã«ã¹ã¿ã 4',
+        'Custom2' => 'ã«ã¹ã¿ã 2',
+        'Custom3' => 'ã«ã¹ã¿ã 3',
+        'Custom4' => 'ã«ã¹ã¿ã 4',
+        'Custom5' => 'ã«ã¹ã¿ã 5',
+        'Day White Fluorescent' => 'æŒçœè²èå
+ç¯',
+        'Daylight' => 'æŒå
+',
+        'Daylight Fluorescent' => 'æŒå
+è²èå
+ç¯',
+        'Flash' => 'ã¹ãã­ã',
+        'Fluorescent' => 'èå
+ç¯',
+        'Incandescent' => 'é»ç',
+        'Kelvin' => 'ã±ã«ãã³',
+        'Living Room Warm White Fluorescent' => 'ãªãã³ã°æçœå
+è²èå
+ç¯',
+        'Manual' => 'ããã¥ã¢ã«',
+        'Manual Temperature (Kelvin)' => 'ããã¥ã¢ã«çœç±ç¯ïŒã±ã«ãã³ïŒ',
+        'PC Set1' => 'PCèš­å®1',
+        'PC Set2' => 'PCèš­å®2',
+        'PC Set3' => 'PCèš­å®3',
+        'PC Set4' => 'PCèš­å®4',
+        'PC Set5' => 'PCèš­å®5',
+        'Shade' => 'æ¥é°',
+        'Tungsten' => 'ã¿ã³ã°ã¹ãã³(çœç±ç¯)',
+        'Underwater' => 'æ°Žäž­',
+        'Unknown' => 'äžæ',
+        'User-Selected' => 'ãŠãŒã¶éžæ',
+        'Warm White Fluorescent' => 'æçœå
+è²èå
+ç¯',
+        'White Fluorescent' => 'æž©çœè²èå
+ç¯',
+      },
+    },
+   'WhiteBalance2' => {
+      Description => 'ãã¯ã€ããã©ã³ã¹2',
+      PrintConv => {
+        '3000K (Tungsten light)' => '3000K (çœç±é»ç)',
+        '3600K (Tungsten light-like)' => '3600K (çœç±é»ç-like)',
+        '4000K (Cool white fluorescent)' => '4000K (èå
+ç¯ïŒ)',
+        '4500K (Neutral white fluorescent)' => '4500K (èå
+ç¯ïŒ)',
+        '5300K (Fine Weather)' => '5300K (æŽå€©)',
+        '6000K (Cloudy)' => '6000K (æã)',
+        '6600K (Daylight fluorescent)' => '6600K (èå
+ç¯ïŒ)',
+        '7500K (Fine Weather with Shade)' => '7500K (æŽå€©ãšåœ±)',
+        'Auto' => 'ãªãŒã',
+        'Custom WB 1' => 'ã«ã¹ã¿ã ãã¯ã€ããã©ã³ã¹1',
+        'Custom WB 2' => 'ã«ã¹ã¿ã ãã¯ã€ããã©ã³ã¹2',
+        'Custom WB 2900K' => 'ã«ã¹ã¿ã ãã¯ã€ããã©ã³ã¹2900K',
+        'Custom WB 3' => 'ã«ã¹ã¿ã ãã¯ã€ããã©ã³ã¹3',
+        'Custom WB 4' => 'ã«ã¹ã¿ã ãã¯ã€ããã©ã³ã¹4',
+        'Custom WB 5400K' => 'ã«ã¹ã¿ã ãã¯ã€ããã©ã³ã¹5400K',
+        'Custom WB 8000K' => 'ã«ã¹ã¿ã ãã¯ã€ããã©ã³ã¹8000K',
+      },
+    },
+   'WhiteBalanceAdj' => {
+      Description => 'ãã¯ã€ããã©ã³ã¹èª¿æŽ',
+      PrintConv => {
+        'Auto' => 'ãªãŒã',
+        'Cloudy' => 'æã',
+        'Daylight' => 'æŒå
+',
+        'Flash' => 'ã¹ãã­ã',
+        'Fluorescent' => 'èå
+ç¯',
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+        'Shade' => 'æ¥é°',
+        'Tungsten' => 'ã¿ã³ã°ã¹ãã³(çœç±ç¯)',
+      },
+    },
+   'WhiteBalanceBias' => 'ãã¯ã€ããã©ã³ã¹ãã€ã¢ã¹',
+   'WhiteBalanceBracket' => 'ãã¯ã€ããã©ã³ã¹ãã©ã±ãã',
+   'WhiteBalanceComp' => 'ãã¯ã€ããã©ã³ã¹è£æ­£',
+   'WhiteBalanceFineTune' => 'ãã¯ã€ããã©ã³ã¹ãã¡ã€ã³ãã¥ãŒã³',
+   'WhiteBalanceMode' => {
+      Description => 'ãã¯ã€ããã©ã³ã¹ã¢ãŒã',
+      PrintConv => {
+        'Auto (Cloudy)' => 'ãªãŒãïŒæå€©ïŒ',
+        'Auto (Day White Fluorescent)' => 'ãªãŒãïŒæŒçœè²èå
+ç¯ïŒ',
+        'Auto (Daylight Fluorescent)' => 'ãªãŒãïŒæŒå
+è²èå
+ç¯ïŒ',
+        'Auto (Daylight)' => 'ãªãŒãïŒæŒå
+ïŒ',
+        'Auto (Flash)' => 'ãªãŒãïŒã¹ãã­ãïŒ',
+        'Auto (Shade)' => 'ãªãŒãïŒæ¥é°ïŒ',
+        'Auto (Tungsten)' => 'ãªãŒãïŒçœç±ç¯ïŒ',
+        'Auto (White Fluorescent)' => 'ãªãŒãïŒçœè²èå
+ç¯ïŒ',
+        'Unknown' => 'äžæ',
+        'User-Selected' => 'ãŠãŒã¶ãŒéžæ',
+      },
+    },
+   'WhiteBalanceSet' => {
+      Description => 'ãã¯ã€ããã©ã³ã¹èš­å®',
+      PrintConv => {
+        'Auto' => 'ãªãŒã',
+        'Cloudy' => 'æã',
+        'Day White Fluorescent' => 'æŒçœè²èå
+ç¯',
+        'Daylight' => 'æŒå
+',
+        'Daylight Fluorescent' => 'æŒå
+è²èå
+ç¯',
+        'Flash' => 'ã¹ãã­ã',
+        'Manual' => 'ããã¥ã¢ã«',
+        'Set Color Temperature 1' => 'è²æž©åºŠèš­å®1',
+        'Set Color Temperature 2' => 'è²æž©åºŠèš­å®2',
+        'Set Color Temperature 3' => 'è²æž©åºŠèš­å®3',
+        'Shade' => 'æ¥é°',
+        'Tungsten' => 'ã¿ã³ã°ã¹ãã³(çœç±ç¯)',
+        'White Fluorescent' => 'æž©çœè²èå
+ç¯',
+      },
+    },
+   'WhiteBalanceTemperature' => 'ãã¯ã€ããã©ã³ã¹æž©åºŠ',
+   'WhiteBoard' => 'ãã¯ã€ãããŒã',
+   'WhiteLevel' => 'çœã¬ãã«',
+   'WhitePoint' => 'çœç¹è²åºŠ',
+   'Wide' => 'ã¯ã€ã',
+   'WideFocusZone' => 'ã¯ã€ããã©ãŒã«ã¹ãŸãŒã³',
+   'WideRange' => {
+      Description => 'ã¯ã€ãã¬ã³ãž',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'WidthResolution' => 'å¹
+æ¹åã®ç»åè§£ååºŠ',
+   'WorldTime' => 'ã¿ã€ã ãŸãŒã³',
+   'WorldTimeLocation' => {
+      Description => 'ã¯ãŒã«ãã¿ã€ã äœçœ®',
+      PrintConv => {
+        'Destination' => 'ç®çå°',
+        'Home' => 'èªå®
+',
+        'Hometown' => 'çŸåšå°',
+      },
+    },
+   'Writer-Editor' => 'è¡šé¡/èª¬æã®äœå®¶',
+   'X3FillLight' => 'X3å
+ãæºãã',
+   'XClipPathUnits' => 'Xã¯ãªãããã¹åäœ',
+   'XMP' => 'XMPã¡ã¿ããŒã¿',
+   'XPAuthor' => 'äœè
+',
+   'XPComment' => 'ã³ã¡ã³ã',
+   'XPKeywords' => 'ã­ãŒã¯ãŒã',
+   'XPSubject' => 'ãµããžã§ã¯ã',
+   'XPTitle' => 'ã¿ã€ãã«',
+   'XPosition' => 'Xäœçœ®',
+   'XResolution' => 'ç»åå¹
+ã®è§£ååºŠ',
+   'YCbCrCoefficients' => 'ã«ã©ãŒã¹ããŒã¹å€åãããªãã¯ã¹ä¿æ°',
+   'YCbCrPositioning' => {
+      Description => 'YãšCã®äœçœ®',
+      PrintConv => {
+        'Centered' => 'äž­å€®',
+        'Co-sited' => 'çžäºé
+çœ®',
+      },
+    },
+   'YCbCrSubSampling' => 'YãšCã®ãµããµã³ããªã³ã°æ¯ç',
+   'YClipPathUnits' => 'Yã¯ãªãããã¹åäœ',
+   'YPosition' => 'Yäœçœ®',
+   'YResolution' => 'ç»åé«ãã®è§£ååºŠ',
+   'ZoneMatching' => {
+      Description => 'ãŸãŒã³ãããã³ã°',
+      PrintConv => {
+        'High Key' => 'ãã€ã­ãŒ',
+        'ISO Setting Used' => 'ãªã(ISOèš­å®äœ¿çš)',
+        'Low Key' => 'ã­ãŒã­ãŒ',
+      },
+    },
+   'ZoneMatchingOn' => {
+      Description => 'ãŸãŒã³ãããã³ã°',
+      PrintConv => {
+        'Off' => 'ãªã',
+        'On' => 'ãªã³',
+      },
+    },
+   'ZoomSourceWidth' => 'ãºãŒã ãœãŒã¹å¹
+',
+   'ZoomStepCount' => 'ãºãŒã ã¹ãããæ°',
+   'ZoomTargetWidth' => 'ãºãŒã ã¿ãŒã²ããå¹
+',
+);
+
+1;  # end
+
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Lang::ja.pm - ExifTool Japanese language translations
+
+=head1 DESCRIPTION
+
+This file is used by Image::ExifTool to generate localized tag descriptions
+and values.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Jens Duttke and Kazunari Nishina for providing this translation.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool(3pm)|Image::ExifTool>,
+L<Image::ExifTool::TagInfoXML(3pm)|Image::ExifTool::TagInfoXML>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/ko.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/ko.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/ko.pm	(revision 24799)
@@ -0,0 +1,2463 @@
+#------------------------------------------------------------------------------
+# File:         ko.pm
+#
+# Description:  ExifTool Korean language translations
+#
+# Notes:        This file generated automatically by Image::ExifTool::TagInfoXML
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Lang::ko;
+
+use strict;
+use vars qw($VERSION);
+
+$VERSION = '1.04';
+
+%Image::ExifTool::Lang::ko::Translate = (
+   'AELock' => {
+      Description => 'AE ê³ ì ',
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'AELockButton' => {
+      Description => 'AE-L/AF-L',
+      PrintConv => {
+        'AE Lock (hold)' => 'AE ê³ ì (ì ì§)',
+        'AE Lock Only' => 'AE ê³ ì ',
+        'AE/AF Lock' => 'AE/AF ê³ ì ',
+        'AF Lock Only' => 'AF ê³ ì ',
+      },
+    },
+   'AF-CPrioritySelection' => {
+      Description => 'AF-C ì í ì°ì ',
+      PrintConv => {
+        'Focus' => 'í¬ì»€ì€',
+        'Release' => 'ëŠŽëŠ¬ìŠ',
+        'Release + Focus' => 'ëŠŽëŠ¬ìŠ + í¬ì»€ì€',
+      },
+    },
+   'AF-OnForMB-D10' => {
+      Description => 'MB-D10ìì AF-On',
+      PrintConv => {
+        'AE Lock (hold)' => 'AE ê³ ì  (ì ì§)',
+        'AE Lock (reset on release)' => 'AE ê³ ì  (ëŠŽëŠ¬ìŠë ëŠ¬ì
+)',
+        'AE Lock Only' => 'AE ê³ ì ',
+        'AE/AF Lock' => 'AE/AF ê³ ì ',
+        'AF Lock Only' => 'AF ê³ ì ',
+        'AF-On' => 'AF-ON',
+        'Same as FUNC Button' => 'FUNC ë²íŒê³Œ ê°ì',
+      },
+    },
+   'AF-SPrioritySelection' => {
+      Description => 'AF-S ì í ì°ì ',
+      PrintConv => {
+        'Focus' => 'í¬ì»€ì€',
+        'Release' => 'ëŠŽëŠ¬ìŠ',
+      },
+    },
+   'AFActivation' => {
+      Description => 'AF ìë',
+      PrintConv => {
+        'AF-On Only' => 'AF-ON ê³ ì ',
+        'Shutter/AF-On' => 'ì
+í°/AF-ON',
+      },
+    },
+   'AFAperture' => 'AF ì¡°ëŠ¬ê°',
+   'AFAreaIllumination' => {
+      Description => 'AF í¬ìžíž ì¡°ëª
+',
+      PrintConv => {
+        'Auto' => 'ìë',
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'AFAreaMode' => {
+      Description => 'AF ìì­ ëªšë',
+      PrintConv => {
+        'Auto-area' => 'ìë ìì­ AF',
+        'Dynamic Area' => 'ë€ìŽëŽë¯¹ ìì­',
+        'Dynamic Area (closest subject)' => 'ë€ìŽëŽë¯¹ ìì­ (ì§ê·Œê±°ëŠ¬ ì°ì )',
+        'Dynamic Area (wide)' => 'ë€ìŽëŽë¯¹ ìì­ (ììŽë)',
+        'Group Dynamic' => 'ê·žë£¹ ë€ìŽëŽë¯¹',
+        'Single Area' => 'ì±êž ìì­',
+        'Single Area (wide)' => 'ì±êž ìì­ (ììŽë)',
+      },
+    },
+   'AFAreaModeSetting' => {
+      Description => 'AF ìì­ ëªšë',
+      PrintConv => {
+        'Closest Subject' => 'ì ì¬',
+        'Dynamic Area' => 'ë€ìŽëŽë¯¹ ìì­',
+        'Single Area' => 'ì±êž ìì­',
+      },
+    },
+   'AFAssist' => {
+      Description => 'ëŽì¥ AF ë³Žì¡°êŽ',
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'AFFineTune' => 'AF ë¯žìž ì¡°ì ',
+   'AFFineTuneAdj' => 'AF ë¯žìž ì¡°ì ',
+   'AFInfo' => 'AF ëªšë',
+   'AFInfo2' => 'AF ì ë³Ž',
+   'AFInfo2Version' => 'AF ì ë³Ž ë²ì ',
+   'AFPoint' => {
+      Description => 'AF í¬ìžíž',
+      PrintConv => {
+        'Bottom' => 'íëš',
+        'Center' => 'ì€ì',
+        'Far Left' => 'ë§š ì¢ìž¡',
+        'Far Right' => 'ë§š ì°ìž¡',
+        'Left' => 'ìŒìªœ',
+        'Lower-left' => 'ì¢íëš',
+        'Lower-right' => 'ì°íëš',
+        'Mid-left' => 'ìŒìªœ',
+        'Mid-right' => 'ì€ë¥žìªœ',
+        'Right' => 'ì€ë¥žìªœ',
+        'Top' => 'ìëš',
+        'Upper-left' => 'ì¢ìëš',
+        'Upper-right' => 'ì°ìëš',
+      },
+    },
+   'AFPointIllumination' => {
+      Description => 'AF í¬ìžíž ì¡°ëª
+',
+      PrintConv => {
+        'Auto' => 'ìë',
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'AFPointMode' => {
+      PrintConv => {
+        'Auto' => 'ìë',
+      },
+    },
+   'AFPointSelected' => {
+      PrintConv => {
+        'Auto' => 'ìë',
+      },
+    },
+   'AFPointSelected2' => {
+      PrintConv => {
+        'Auto' => 'ìë',
+      },
+    },
+   'AFPointSelection' => {
+      Description => 'AF í¬ìžíž ì í',
+      PrintConv => {
+        '11 Points' => '11 í¬ìžíž',
+        '51 Points' => '51 í¬ìžíž',
+      },
+    },
+   'AFPointsInFocus' => {
+      Description => 'ìŽì ììì AF í¬ìžíž',
+      PrintConv => {
+        'Far Left' => 'ë§š ì¢ìž¡',
+        'Far Right' => 'ë§š ì°ìž¡',
+        'Lower-left' => 'ì¢íëš',
+        'Lower-right' => 'ì°íëš',
+        'Upper-left' => 'ì¢ìëš',
+        'Upper-right' => 'ì°ìëš',
+      },
+    },
+   'AFPointsUnknown2' => {
+      PrintConv => {
+        'Auto' => 'ìë',
+      },
+    },
+   'AFPointsUsed' => {
+      Description => 'ì¬ì©ë AF í¬ìžíž',
+      PrintConv => {
+        'Bottom' => 'íëš',
+        'Center' => 'ì€ì',
+        'Far Left' => 'ë§š ì¢ìž¡',
+        'Far Right' => 'ë§š ì°ìž¡',
+        'Lower-left' => 'ì¢íëš',
+        'Lower-right' => 'ì°íëš',
+        'Top' => 'ìëš',
+        'Upper-left' => 'ì¢ìëš',
+        'Upper-right' => 'ì°ìëš',
+      },
+    },
+   'AFResponse' => 'AF ë°ì',
+   'ActiveD-Lighting' => {
+      Description => 'ì¡í°ëž D-Lighting',
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'ActiveD-LightingMode' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+      },
+    },
+   'AddAspectRatioInfo' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+      },
+    },
+   'AddOriginalDecisionData' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'AdvancedRaw' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'Album' => 'ìšë²',
+   'Anti-Blur' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+      },
+    },
+   'Aperture' => 'ì¡°ëŠ¬ê°',
+   'ApertureValue' => 'ì¡°ëŠ¬ê°',
+   'ApplicationRecordVersion' => 'ìŽíëŠ¬ìŒìŽì
+ êž°ë¡ ë²ì ',
+   'Artist' => 'ìŽë¯žì§ë¥Œ ë§ë  ì¬ë',
+   'Author' => 'ìì±ì',
+   'AuthorsPosition' => 'ì§ì±
+',
+   'AutoAperture' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'AutoBracketModeM' => {
+      Description => 'ìë ëžëŒìŒí
+ (ëªšë M)',
+      PrintConv => {
+        'Flash Only' => 'íëì',
+        'Flash/Aperture' => 'íëì/ì¡°ëŠ¬ê°',
+        'Flash/Speed' => 'íëì/ì€íŒë',
+        'Flash/Speed/Aperture' => 'íëì/ì€íŒë/ì¡°ëŠ¬ê°',
+      },
+    },
+   'AutoBracketOrder' => 'ëžëŒìŒí
+ ìì',
+   'AutoBracketSet' => {
+      Description => 'ìë ëžëŒìŒí
+ ì€ì ',
+      PrintConv => {
+        'AE & Flash' => 'AE & íëì',
+        'AE Only' => 'AE ëžëŒìŒí
+',
+        'Flash Only' => 'íëì ëžëŒìŒí
+',
+        'WB Bracketing' => 'WB ëžëŒìŒí
+',
+      },
+    },
+   'AutoBracketing' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+      },
+    },
+   'AutoExposureBracketing' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'AutoFP' => {
+      Description => 'ìë FP',
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'AutoFocus' => {
+      Description => 'ì€í í¬ì»€ì€',
+      PrintConv => {
+        'Off' => 'ë¹íì±',
+        'On' => 'íì±',
+      },
+    },
+   'AutoISO' => {
+      Description => 'ìë ISO',
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'AutoISOMax' => 'ìë ISO ìµë ê°ë',
+   'AutoISOMinShutterSpeed' => 'ìë ISO ìµì ì
+í° ìë',
+   'AutoLightingOptimizer' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+      },
+    },
+   'AutoRedEye' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'AuxiliaryLens' => 'ë³Žì¡° ë ìŠ',
+   'BWMode' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+      },
+    },
+   'BatteryLevel' => 'ë² í°ëŠ¬ ë ë²š',
+   'BatteryOrder' => {
+      Description => 'ë°°í°ëŠ¬ ìì',
+      PrintConv => {
+        'Camera Battery First' => 'ì¹Žë©ëŒ ë°°í°ëŠ¬ ì°ì ',
+        'MB-D10 First' => 'MB-D10 ë°°í°ëŠ¬ ì°ì ',
+      },
+    },
+   'Beep' => {
+      Description => 'ì ìì',
+      PrintConv => {
+        'High' => 'í¬ê²',
+        'Low' => 'ìê²',
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'BitsPerSample' => 'ì±ë¶ì ë°ë¥ž ë¹íž ì',
+   'BracketMode' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+      },
+    },
+   'Brightness' => 'ë°êž°',
+   'BrightnessValue' => 'ë°êž°',
+   'BurstMode' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'By-line' => 'ì ìì',
+   'CFAPattern' => 'CFA íšíŽ',
+   'CLModeShootingSpeed' => 'CL ëªšë ìŽ¬ì ìë',
+   'CanonExposureMode' => {
+      PrintConv => {
+        'Manual' => 'ìë',
+      },
+    },
+   'CanonFlashMode' => {
+      PrintConv => {
+        'Auto' => 'ìë',
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'Caption-Abstract' => 'ì ëª©/ì€ëª
+',
+   'CaptionWriter' => 'ìº¡ì
+ ìì±ì',
+   'Categories' => 'ë²ì£Œ',
+   'Category' => 'ë²ì£Œ',
+   'CenterAFArea' => {
+      Description => 'ì€ì ìŽì  ìì­',
+      PrintConv => {
+        'Normal Zone' => 'ìŒë° ìì­',
+        'Wide Zone' => 'ììŽë ìì­',
+      },
+    },
+   'CenterWeightedAreaSize' => 'ì€ì ì€ì  ìì­',
+   'ChrominanceNR_TIFF_JPEG' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+      },
+    },
+   'ChrominanceNoiseReduction' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+      },
+    },
+   'City' => 'ëì',
+   'CalibrationIlluminant1' => {
+      PrintConv => {
+        'Cloudy' => 'íëŠ° ë ìš',
+        'Cool White Fluorescent' => 'ëë°±ì íêŽë± (W 3800 - 4500K)',
+        'Day White Fluorescent' => 'ì£Œë°±ì íêŽë± (N 4600 - 5500K)',
+        'Daylight' => 'ì£ŒêŽ',
+        'Daylight Fluorescent' => 'ì£ŒêŽì íêŽë± (D 5700 - 7100K)',
+        'Fine Weather' => 'ë§ì ë ìš',
+        'Flash' => 'íëì',
+        'Fluorescent' => 'íêŽë±',
+        'ISO Studio Tungsten' => 'ISO ì€íëì€ í
+
+ì€í
+',
+        'Other' => 'êž°í êŽì',
+        'Shade' => 'ê·žë',
+        'Standard Light A' => 'íì€ êŽì A',
+        'Standard Light B' => 'íì€ êŽì B',
+        'Standard Light C' => 'íì€ êŽì C',
+        'Tungsten (Incandescent)' => 'í
+
+ì€í
+ (ë°±ìŽë±)',
+        'Unknown' => 'ì ì ìì',
+        'Warm White Fluorescent' => 'ë°ë»í í°ì íêŽ (L 2600 - 3250K)',
+        'White Fluorescent' => 'ë°±ì íêŽë± (WW 3250 - 3800K)',
+      },
+    },
+   'CalibrationIlluminant2' => {
+      PrintConv => {
+        'Cloudy' => 'íëŠ° ë ìš',
+        'Cool White Fluorescent' => 'ëë°±ì íêŽë± (W 3800 - 4500K)',
+        'Day White Fluorescent' => 'ì£Œë°±ì íêŽë± (N 4600 - 5500K)',
+        'Daylight' => 'ì£ŒêŽ',
+        'Daylight Fluorescent' => 'ì£ŒêŽì íêŽë± (D 5700 - 7100K)',
+        'Fine Weather' => 'ë§ì ë ìš',
+        'Flash' => 'íëì',
+        'Fluorescent' => 'íêŽë±',
+        'ISO Studio Tungsten' => 'ISO ì€íëì€ í
+
+ì€í
+',
+        'Other' => 'êž°í êŽì',
+        'Shade' => 'ê·žë',
+        'Standard Light A' => 'íì€ êŽì A',
+        'Standard Light B' => 'íì€ êŽì B',
+        'Standard Light C' => 'íì€ êŽì C',
+        'Tungsten (Incandescent)' => 'í
+
+ì€í
+ (ë°±ìŽë±)',
+        'Unknown' => 'ì ì ìì',
+        'Warm White Fluorescent' => 'ë°ë»í í°ì íêŽ (L 2600 - 3250K)',
+        'White Fluorescent' => 'ë°±ì íêŽë± (WW 3250 - 3800K)',
+      },
+    },
+   'CodedCharacterSet' => 'ìœëë ìºëŠ­í° ìžíž',
+   'ColorAberrationControl' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'ColorBalance' => 'ì»¬ë¬ ë°žë°ì€',
+   'ColorBalanceAdj' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'ColorBooster' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'ColorEffect' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'Sepia' => 'ìžíŒì',
+      },
+    },
+   'ColorFilter' => {
+      Description => 'ì íí°',
+      PrintConv => {
+        'Green' => 'ë
+¹ì',
+        'Off' => 'êºŒì§',
+        'Red' => 'ë¹šê°',
+        'Yellow' => 'ë
+žë',
+      },
+    },
+   'ColorHue' => 'ìì íì',
+   'ColorMode' => {
+      Description => 'ì»¬ë¬ ëªšë',
+      PrintConv => {
+        'Autumn Leaves' => 'ëší',
+        'B&W' => 'íë°±',
+        'Clear' => 'ë°í¬ëª
+',
+        'Deep' => 'ì§í',
+        'Landscape' => 'íê²œ',
+        'Light' => 'ëŒìŽíž',
+        'Neutral' => 'ëŽížëŽ',
+        'Night View' => 'ìŒê²œ',
+        'Night View/Portrait' => 'ìŒê²œ ìžë¬Œ',
+        'Off' => 'êºŒì§',
+        'Portrait' => 'ìžë¬Œ',
+        'Standard' => 'íì€',
+        'Sunset' => 'ìŒëª°',
+        'Vivid' => 'ììí',
+      },
+    },
+   'ColorMoireReduction' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'ColorMoireReductionMode' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+      },
+    },
+   'ColorSpace' => {
+      Description => 'ìê³µê°',
+      PrintConv => {
+        'ICC Profile' => 'ICC íë¡í',
+        'Uncalibrated' => 'ì¡°ì ëì§ ìì',
+      },
+    },
+   'ColorTemperature' => 'ì ìšë',
+   'CommandDials' => {
+      Description => 'ì»€ë§šë ë€ìŽìŒ',
+      PrintConv => {
+        'Reversed (Main Aperture, Sub Shutter)' => 'ì­ë°©í¥',
+        'Standard (Main Shutter, Sub Aperture)' => 'êž°ë³ž',
+      },
+    },
+   'CommandDialsApertureSetting' => {
+      Description => 'ì»€ë§šë ë€ìŽìŒ ìì  ì¡°ëŠ¬ê° ì€ì ',
+      PrintConv => {
+        'Aperture Ring' => 'ì¡°ëŠ¬ê° ë§',
+        'Sub-command Dial' => 'ìëž ì»€ë§šë ë€ìŽìŒ',
+      },
+    },
+   'CommandDialsChangeMainSub' => {
+      Description => 'ì»€ë§šë ë€ìŽìŒ ìì  ë§€ìž/ìëž êµì²Ž',
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'CommandDialsMenuAndPlayback' => {
+      Description => 'ì»€ë§šë ë€ìŽìŒ ìì  ë§€ëŽì ì¬ì',
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'CommandDialsReverseRotation' => {
+      Description => 'ì»€ë§šë ë€ìŽìŒ ìì  ë°©í¥ ì í',
+      PrintConv => {
+        'No' => 'ìëì€',
+        'Yes' => 'ì',
+      },
+    },
+   'CommanderChannel' => 'ì»€ë§šëëªšë ì±ë',
+   'CommanderGroupAManualOutput' => 'ì»€ë§šëëªšë ê·žë£¹ A M Comp',
+   'CommanderGroupAMode' => {
+      Description => 'ì»€ë§šëëªšë ê·žë£¹ A ëªšë',
+      PrintConv => {
+        'Auto Aperture' => 'ìë ì¡°ëŠ¬ê° (AA)',
+        'Manual' => 'ìë',
+        'Off' => 'êºŒì§',
+      },
+    },
+   'CommanderGroupA_TTL-AAComp' => 'ì»€ë§šëëªšë ê·žë£¹ A TTL/AA Comp',
+   'CommanderGroupBManualOutput' => 'ì»€ë§šëëªšë ê·žë£¹ B M Comp',
+   'CommanderGroupBMode' => {
+      Description => 'ì»€ë§šëëªšë ê·žë£¹ B ëªšë',
+      PrintConv => {
+        'Auto Aperture' => 'ìë ì¡°ëŠ¬ê° (AA)',
+        'Manual' => 'ìë',
+        'Off' => 'êºŒì§',
+      },
+    },
+   'CommanderGroupB_TTL-AAComp' => 'ì»€ë§šëëªšë ê·žë£¹ B TTL/AA Comp',
+   'CommanderInternalFlash' => {
+      Description => 'ì»€ë§šëëªšë ëŽì¥ íëì ëªšë',
+      PrintConv => {
+        'Manual' => 'ìë',
+        'Off' => 'êºŒì§',
+      },
+    },
+   'CommanderInternalManualOutput' => 'ì»€ë§šëëªšë ëŽì¥íëì M Comp.',
+   'CommanderInternalTTLComp' => 'ì»€ë§šëëªšë ëŽì¥íëì TTL Comp',
+   'Comment' => 'ìœë©íž',
+   'ComponentsConfiguration' => 'ê° êµ¬ì± ììì ìë¯ž',
+   'CompressedBitsPerPixel' => 'ìŽë¯žì§ ìì¶ ëªšë',
+   'Compression' => {
+      Description => 'ìì¶ ì€ê³',
+      PrintConv => {
+        'JPEG' => 'JPEG ìì¶',
+        'JPEG (old-style)' => 'JPEG (ìì  ì€íìŒ)',
+        'Kodak DCR Compressed' => 'Kodak DCR ìì¶',
+        'Kodak KDC Compressed' => 'Kodak KDC ìì¶',
+        'Next' => 'NeXT 2-bit ìžìœë©',
+        'Nikon NEF Compressed' => 'Nikon NEF ìì¶',
+        'Pentax PEF Compressed' => 'Pentax PEF ìì¶',
+        'SGILog' => 'SGI 32-bit Log íë ìžìœë©',
+        'SGILog24' => 'SGI 24-bit Log íë ìžìœë©',
+        'Sony ARW Compressed' => 'Sony ARW ìì¶',
+        'Thunderscan' => 'ThunderScan 4-bit ìžìœë©',
+        'Uncompressed' => 'ë¬Žìì¶',
+      },
+    },
+   'Contact' => 'ì°ëœì²',
+   'Contrast' => {
+      Description => 'ëë¹',
+      PrintConv => {
+        'High' => 'ê°íê²',
+        'Low' => 'ìœíê²',
+        'Normal' => 'íì€',
+      },
+    },
+   'ContrastCurve' => 'ëë¹ ì»€ëž',
+   'ConversionLens' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+      },
+    },
+   'Copyright' => 'ì ìê¶ ìì ì',
+   'CopyrightNotice' => 'ì ìê¶ ê³µê³ ',
+   'Country' => 'êµ­ëª
+',
+   'Country-PrimaryLocationName' => 'êµ­ê°',
+   'CreateDate' => 'ëì§íž ë°ìŽí° ìì± ìŒì',
+   'CreationDate' => 'ìŽ¬ì ë ì§',
+   'Credit' => 'ì ë³Ž',
+   'Curves' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'CustomRendered' => {
+      Description => 'ì¬ì©ì ìŽë¯žì§ ì²ëŠ¬',
+      PrintConv => {
+        'Custom' => 'ì¬ì©ì ì²ëŠ¬',
+        'Normal' => 'íì€ ì²ëŠ¬',
+      },
+    },
+   'D-LightingHQ' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'D-LightingHS' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'DataDump' => 'ë°ìŽí° ë€í',
+   'DateCreated' => 'ë§ë€ìŽì§ ë ì§',
+   'DateDisplayFormat' => {
+      Description => 'ë ì§ íì',
+      PrintConv => {
+        'D/M/Y' => 'ìŒ/ì/ë
+',
+        'M/D/Y' => 'ì/ìŒ/ë
+',
+        'Y/M/D' => 'ë
+/ì/ìŒ',
+      },
+    },
+   'DateStampMode' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+      },
+    },
+   'DateTimeOriginal' => 'ìë³ž ë°ìŽí° ìì± ìŒì',
+   'DaylightSavings' => {
+      Description => 'ìŒêŽ ìê° ì ìœ',
+      PrintConv => {
+        'No' => 'êºŒì§',
+        'Yes' => 'ìŒì§',
+      },
+    },
+   'DeletedImageCount' => 'ì­ì ë ìŽë¯žì§ ì¹ŽìŽíž',
+   'DeviceSettingDescription' => 'ì¥ë¹ ì€ì  ì€ëª
+',
+   'DigitalZoom' => {
+      Description => 'ëì§íž ì€',
+      PrintConv => {
+        'Off' => 'êºŒì§',
+      },
+    },
+   'DigitalZoomRatio' => 'ëì§íž ì€ ë¹ìš',
+   'Directory' => 'íìŒìì¹',
+   'DirectoryNumber' => 'ëë í ëŠ¬ ì«ì',
+   'DistortionCorrection' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'DistortionCorrection2' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'DriveMode' => {
+      Description => 'ëëŒìŽëž ëªšë',
+      PrintConv => {
+        'Multiple Exposure' => 'ë€ì€ ë
+žì¶',
+        'Off' => 'êºŒì§',
+      },
+    },
+   'DynamicAFArea' => {
+      Description => 'ë€ìŽëŽë¯¹ AF ìì­',
+      PrintConv => {
+        '21 Points' => '21 í¬ìžíž',
+        '51 Points' => '51 í¬ìžíž',
+        '51 Points (3D-tracking)' => '51í¬ìžíž (3D-ížëí¹)',
+        '9 Points' => '9 í¬ìžíž',
+      },
+    },
+   'DynamicRangeExpansion' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'DynamicRangeOptimizer' => {
+      Description => 'D-ë ìžì§ ìµì í',
+      PrintConv => {
+        'Advanced Auto' => 'ê³ êž ìë',
+        'Advanced Lv1' => 'ê³ êž ë ë²š1',
+        'Advanced Lv2' => 'ê³ êž ë ë²š2',
+        'Advanced Lv3' => 'ê³ êž ë ë²š3',
+        'Advanced Lv4' => 'ê³ êž ë ë²š4',
+        'Advanced Lv5' => 'ê³ êž ë ë²š5',
+        'Auto' => 'ìë',
+        'Off' => 'êºŒì§',
+        'Standard' => 'íì€',
+      },
+    },
+   'EVStepSize' => {
+      Description => 'ë
+žì¶ ì€ì  ê°ê²©',
+      PrintConv => {
+        '1/2 EV' => '1/2 ì€í
+',
+        '1/3 EV' => '1/3 ì€í
+',
+      },
+    },
+   'EasyExposureCompensation' => {
+      Description => 'ì¬ìŽ ë
+žì¶ ë³Žì ',
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+        'On (auto reset)' => 'ìŒì§ (ìë ëŠ¬ì
+)',
+      },
+    },
+   'EasyMode' => {
+      PrintConv => {
+        'Manual' => 'ìë',
+      },
+    },
+   'EdgeNoiseReduction' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'EffectiveMaxAperture' => 'ì íš ìµë ì¡°ëŠ¬ê°',
+   'EnhanceDarkTones' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'Enhancement' => {
+      PrintConv => {
+        'Green' => 'ë
+¹ì',
+        'Off' => 'êºŒì§',
+        'Red' => 'ë¹šê°',
+      },
+    },
+   'EnvelopeRecordVersion' => 'ìì¶ êž°ë¡ ë²ì ',
+   'ExifImageHeight' => 'ìŽë¯žì§ ëìŽ',
+   'ExifImageWidth' => 'ìŽë¯žì§ ëìŽ',
+   'ExifOffset' => 'Exif IFD Pointer',
+   'ExifVersion' => 'Exif ë²ì ',
+   'ExitPupilPosition' => 'ì¶êµ¬ê³µ ìì¹',
+   'ExposureBracketValue' => 'ë
+žì¶ ëžëŒìŒí
+ ê°',
+   'ExposureCompStepSize' => 'ë
+žì¶ë³Žì /ë¯žìžì¡°ì ',
+   'ExposureCompensation' => 'ë
+žì¶ ë³Žì ',
+   'ExposureControlStepSize' => 'ë
+žì¶ ì¡°ì  EV ì€í
+',
+   'ExposureDelayMode' => {
+      Description => 'ë
+žì¶ ëêž° ëªšë',
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'ExposureDifference' => 'ë
+žì¶ ë³Žì ',
+   'ExposureIndex' => 'ë
+žì¶ ìžë±ì€',
+   'ExposureMode' => {
+      Description => 'ë
+žì¶ ëªšë',
+      PrintConv => {
+        'Auto' => 'ìë ë
+žì¶',
+        'Auto bracket' => 'ì€í  ëžëŒìŒì€í
+',
+        'Manual' => 'ìë ë
+žì¶',
+      },
+    },
+   'ExposureProgram' => {
+      Description => 'ë
+žì¶ íë¡ê·žëš',
+      PrintConv => {
+        'Action (High speed)' => 'ì€í¬ìž  ëªšë (ë¹ ë¥ž ì
+í° ì€íŒëì íží¥ëš)',
+        'Aperture-priority AE' => 'ì¡°ëŠ¬ê° ì°ì ',
+        'Bulb' => 'ë²ëž',
+        'Creative (Slow speed)' => 'ë
+ì°œì  íë¡ê·žëš (íŒì¬ê³ì¬ëì íží¥ëš)',
+        'Landscape' => 'íê²œ ëªšë (ë°°ê²œì ìží¬ì»€ì€ê° ìë íê²œ ì¬ì§)',
+        'Manual' => 'ìë',
+        'Not Defined' => 'ì ìëì§ ìì',
+        'Portrait' => 'ìžë¬Œ ëªšë (ë°°ê²œì ììí¬ì»€ì€ê° ìë ê·Œì  ì¬ì§)',
+        'Program AE' => 'ë³Žíµ íë¡ê·žëš',
+        'Shutter speed priority AE' => 'ì
+í° ì°ì ',
+      },
+    },
+   'ExposureTime' => 'ë
+žì¶ ìê°',
+   'ExtendedWBDetect' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'ExternalFlash' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'ExternalFlashFlags' => 'ìžì¥ íëì íëê·ž',
+   'ExternalFlashMode' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+      },
+    },
+   'FNumber' => 'F ì«ì',
+   'FileFormat' => 'íì',
+   'FileInfo' => 'íìŒ ì ë³Ž',
+   'FileInfoVersion' => 'íìŒ ì ë³Ž ë²ì ',
+   'FileModifyDate' => 'ê°±ì  ìŒì',
+   'FileName' => 'íìŒëª
+',
+   'FileNumber' => 'íìŒ ì«ì',
+   'FileNumberMemory' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'FileNumberSequence' => {
+      Description => 'íìŒëª
+ ì°ì ë²íž',
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'FileSize' => 'íìŒí¬êž°',
+   'FileSource' => {
+      Description => 'íìŒ ì¶ì²',
+      PrintConv => {
+        'Digital Camera' => 'ëì§íž ì¹Žë©ëŒ',
+        'Film Scanner' => 'íëŠ ì€ìºë',
+        'Reflection Print Scanner' => 'ë°ì¬ íëŠ°íž ì€ìºë',
+      },
+    },
+   'FileType' => 'íìŒíì',
+   'FilmType' => 'íëŠ íì',
+   'Filter' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+      },
+    },
+   'FilterEffect' => {
+      Description => 'íí° íšê³Œ',
+      PrintConv => {
+        'Green' => 'ë
+¹ì',
+        'Off' => 'êºŒì§',
+        'Orange' => 'ì£Œí©',
+        'Red' => 'ë¹šê°',
+        'Yellow' => 'ë
+žë',
+        'n/a' => 'ì€ì  ìëš',
+      },
+    },
+   'FilterEffectMonochrome' => {
+      PrintConv => {
+        'Green' => 'ë
+¹ì',
+        'Orange' => 'ì£Œí©',
+        'Red' => 'ë¹šê°',
+        'Yellow' => 'ë
+žë',
+      },
+    },
+   'FinderDisplayDuringExposure' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'FineTuneOptCenterWeighted' => 'ìµì  ë
+žì¶ ì¡°ì  ì€ì ì€ì ',
+   'FineTuneOptMatrixMetering' => 'ìµì  ë
+žì¶ ì¡°ì  íê° ìž¡êŽ',
+   'FineTuneOptSpotMetering' => 'ìµì  ë
+žì¶ ì¡°ì  ì€í',
+   'Flash' => {
+      Description => 'íëì',
+      PrintConv => {
+        'Auto, Did not fire' => 'íëì ë°êŽ ìëš, ìëëªšë',
+        'Auto, Did not fire, Red-eye reduction' => 'ìë, ë°êŽìëš, ì ëª©ê°ì',
+        'Auto, Fired' => 'íëì ë°êŽ, ìëëªšë',
+        'Auto, Fired, Red-eye reduction' => 'íëì ë°êŽ, ìëëªšë, ì ëª©ê°ìëªšë',
+        'Auto, Fired, Red-eye reduction, Return detected' => 'íëì ë°êŽ, ìëëªšë, ë³µê·êŽ ê°ì§ëš, ì ëª©ê°ìëªšë',
+        'Auto, Fired, Red-eye reduction, Return not detected' => 'íëì ë°êŽ, ìëëªšë, ë³µê·êŽ ê°ì§ìëš, ì ëª©ê°ìëªšë',
+        'Auto, Fired, Return detected' => 'íëì ë°êŽ, ìëëªšë, ë³µê·êŽ ê°ì§ëš',
+        'Auto, Fired, Return not detected' => 'íëì ë°êŽ, ìëëªšë, ë³µê·êŽ ê°ì§ ìëš',
+        'Did not fire' => 'íëìê° ì ë±íì§ ìììµëë€',
+        'Fired' => 'íëì ë°êŽ',
+        'Fired, Red-eye reduction' => 'íëì ë°êŽ, ì ëª©ê°ìëªšë',
+        'Fired, Red-eye reduction, Return detected' => 'íëì ë°êŽ, ì ëª©ê°ìëªšë, ë³µê·êŽ ê°ì§ëš',
+        'Fired, Red-eye reduction, Return not detected' => 'íëì ë°êŽ, ì ëª©ê°ìëªšë, ë³µê·êŽ ê°ì§ ìëš',
+        'Fired, Return detected' => 'ì€ížë¡ëž ë³µê·êŽ ê°ì§ëš',
+        'Fired, Return not detected' => 'ì€ížë¡ëž ë³µê·êŽ ê°ì§ ìëš',
+        'No Flash' => 'íëì ë°êŽ ìëš',
+        'No flash function' => 'íëì ìë ìì',
+        'Off, Did not fire' => 'íëì ë°êŽ ìëš, ê°ì ë°êŽëªšë',
+        'Off, Did not fire, Return not detected' => 'êºŒì§, ë°êŽ ìëš, ë³µê·êŽ ê°ì§ ìëš',
+        'Off, No flash function' => 'êºŒì§, íëì ìë ìì',
+        'Off, Red-eye reduction' => 'êºŒì§, ì ëª©ê°ì',
+        'On, Did not fire' => 'ìŒì§, íëì ë°êŽ ìëš',
+        'On, Fired' => 'íëì ë°êŽ, ê°ì ë°êŽëªšë',
+        'On, Red-eye reduction' => 'íëì ë°êŽ, ê°ì ë°êŽëªšë, ì ëª©ê°ìëªšë',
+        'On, Red-eye reduction, Return detected' => 'íëì ë°êŽ, ê°ì ë°êŽëªšë, ì ëª©ê°ìëªšë, ë³µê·êŽ ê°ì§ëš',
+        'On, Red-eye reduction, Return not detected' => 'íëì ë°êŽ, ê°ì ë°êŽëªšë, ì ëª©ê°ìëªšë, ë³µê·êŽ ê°ì§ ìëš',
+        'On, Return detected' => 'íëì ë°êŽ, ê°ì ë°êŽëªšë, ë³µê·êŽ ê°ì§ëš',
+        'On, Return not detected' => 'íëì ë°êŽ, ê°ì ë°êŽëªšë, ë³µê·êŽ ê°ì§ ìëš',
+      },
+    },
+   'FlashCommanderMode' => {
+      Description => 'ì»€ë§šë ëªšë',
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'FlashCompensation' => 'íëì ë³Žì ',
+   'FlashControlMode' => {
+      Description => 'íëì ì»šížë¡€ ëªšë',
+      PrintConv => {
+        'Auto Aperture' => 'ìë ì¡°ëŠ¬ê° (AA)',
+        'Manual' => 'ìë',
+        'Off' => 'êºŒì§',
+        'Repeating Flash' => 'ëŠ¬íŒí
+ íëì',
+      },
+    },
+   'FlashEnergy' => 'íëì ìëì§',
+   'FlashExposureBracketValue' => 'íëì ë
+žì¶ ëžëŒìŒí
+ ê°',
+   'FlashExposureComp' => 'íëì ë
+žì¶ ë³Žì ',
+   'FlashExposureLock' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'FlashFired' => 'íëì ë°êŽëš',
+   'FlashFocalLength' => 'íëì ìŽì  êžžìŽ',
+   'FlashGroupACompensation' => 'ê·žë£¹ A íëì ë³Žì ',
+   'FlashGroupAControlMode' => {
+      Description => 'ê·žë£¹ A íëì ëªšë',
+      PrintConv => {
+        'Auto Aperture' => 'ìë ì¡°ëŠ¬ê° (AA)',
+        'Manual' => 'ìë',
+        'Off' => 'êºŒì§',
+        'Repeating Flash' => 'ëŠ¬íŒí
+ íëì',
+      },
+    },
+   'FlashGroupAOutput' => 'ê·žë£¹ A íëì ì¶ë ¥',
+   'FlashGroupBCompensation' => 'ê·žë£¹ B íëì ë³Žì ',
+   'FlashGroupBControlMode' => {
+      Description => 'ê·žë£¹ B íëì ëªšë',
+      PrintConv => {
+        'Auto Aperture' => 'ìë ì¡°ëŠ¬ê° (AA)',
+        'Manual' => 'ìë',
+        'Off' => 'êºŒì§',
+        'Repeating Flash' => 'ëŠ¬íŒí
+ íëì',
+      },
+    },
+   'FlashGroupBOutput' => 'ê·žë£¹ B íëì ì¶ë ¥',
+   'FlashGroupCCompensation' => 'ê·žë£¹ C íëì ë³Žì ',
+   'FlashGroupCControlMode' => {
+      Description => 'ê·žë£¹ C íëì ì»šížë¡€ ëªšë',
+      PrintConv => {
+        'Auto Aperture' => 'ìë ì¡°ëŠ¬ê° (AA)',
+        'Manual' => 'ìë',
+        'Off' => 'êºŒì§',
+        'Repeating Flash' => 'ëŠ¬íŒí
+ íëì',
+      },
+    },
+   'FlashGroupCOutput' => 'ê·žë£¹ C íëì ì¶ë ¥',
+   'FlashInfoVersion' => 'íëì ì ë³Ž ë²ì ',
+   'FlashLevel' => 'íëì ë³Žì ',
+   'FlashMode' => {
+      Description => 'íëì ëªšë',
+      PrintConv => {
+        'Did Not Fire' => 'ë°êŽ ìëš',
+        'Fired, Commander Mode' => 'ë°êŽëš, ì»€ë§šë ëªšë',
+        'Fired, External' => 'ë°êŽëš, ìžì¥',
+        'Fired, Manual' => 'ë°êŽëš, ìë',
+        'Fired, TTL Mode' => 'ë°êŽëš, TTL ëªšë',
+      },
+    },
+   'FlashModel' => 'íëì ëªšëž',
+   'FlashOptions' => {
+      PrintConv => {
+        'Auto' => 'ìë',
+      },
+    },
+   'FlashOptions2' => {
+      PrintConv => {
+        'Auto' => 'ìë',
+      },
+    },
+   'FlashOutput' => 'íëì ì¶ë ¥',
+   'FlashSetting' => 'íëì ì€ì ',
+   'FlashShutterSpeed' => 'íëì ì
+í° ì€íŒë',
+   'FlashStatus' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+      },
+    },
+   'FlashSyncSpeed' => 'íëì ëì¡° ìë',
+   'FlashSyncSpeedAv' => {
+      PrintConv => {
+        'Auto' => 'ìë',
+      },
+    },
+   'FlashType' => 'íëì íì',
+   'FlashWarning' => {
+      Description => 'íëì ê²œê³ ',
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'FlashpixVersion' => 'ì§ìëë Flashpix ë²ì ',
+   'FocalLength' => 'ìŽì  êžžìŽ',
+   'FocalLength35efl' => 'ìŽì ê±°ëŠ¬ (35mm ë³í)',
+   'FocalLengthIn35mmFormat' => '35 mm íëŠ íì° ìŽì êžžìŽ',
+   'FocalPlaneResolutionUnit' => {
+      Description => 'ìŽì ë©Ž íŽìë ëšì',
+      PrintConv => {
+        'None' => 'ìì',
+        'inches' => 'ìžì¹',
+        'um' => 'Âµm (ë§ìŽí¬ë¡ë¯ží°)',
+      },
+    },
+   'FocalPlaneXResolution' => 'ìí íŽìë ìŽì ë©Ž',
+   'FocalPlaneYResolution' => 'ìì§ íŽìë ìŽì ë©Ž',
+   'Focus' => {
+      Description => 'í¬ì»€ì€',
+      PrintConv => {
+        'Manual' => 'ìë',
+      },
+    },
+   'FocusArea' => 'AF í¬ìžíž ìí',
+   'FocusAreaSelection' => {
+      Description => 'AF í¬ìžíž ìí',
+      PrintConv => {
+        'No Wrap' => 'êºŒì§',
+        'Wrap' => 'ìŒì§',
+      },
+    },
+   'FocusContinuous' => {
+      PrintConv => {
+        'Manual' => 'ìë',
+      },
+    },
+   'FocusDistance' => 'ìŽì  ê±°ëŠ¬',
+   'FocusMode' => {
+      Description => 'ìŽì ëªšë',
+      PrintConv => {
+        'Manual' => 'ìë',
+      },
+    },
+   'FocusMode2' => {
+      PrintConv => {
+        'Manual' => 'ìë',
+      },
+    },
+   'FocusModeSetting' => {
+      Description => 'ìŽì  ëªšë',
+      PrintConv => {
+        'AF-A' => 'ìë AF ìë³Ž',
+        'AF-C' => 'ì»ší°ëŽìŽì€ AF ìë³Ž',
+        'AF-S' => 'ì±êž AF ìë³Ž',
+        'Manual' => 'ìë',
+      },
+    },
+   'FocusPointWrap' => {
+      Description => 'ìŽì  í¬ìžíž ìí',
+      PrintConv => {
+        'No Wrap' => 'ìí ìíš',
+        'Wrap' => 'ìí',
+      },
+    },
+   'FocusPosition' => 'ìŽì  ìì¹',
+   'FocusRange' => {
+      PrintConv => {
+        'Auto' => 'ìë',
+        'Manual' => 'ìë',
+      },
+    },
+   'FocusTrackingLockOn' => {
+      Description => 'ìŽì  ížëí¹ Lock-On',
+      PrintConv => {
+        'Long' => 'êžžê²',
+        'Normal' => 'íì€',
+        'Off' => 'êºŒì§',
+        'Short' => 'ì§§ê²',
+      },
+    },
+   'FrameRate' => 'íë ì ë¹ìš',
+   'FrameSize' => 'íë ì í¬êž°',
+   'FujiFlashMode' => {
+      PrintConv => {
+        'Auto' => 'ìë',
+      },
+    },
+   'FunctionButton' => {
+      Description => 'íì
+ ë²íŒ',
+      PrintConv => {
+        'AF-area Mode' => 'AF ìì­ ëªšë ì€ì ',
+        'Center AF Area' => 'ì€ì ìŽì  ìì­',
+        'Center-weighted' => 'ì€ìë¶ ì€ì  ìž¡êŽ',
+        'FV Lock' => 'FV ê³ ì ',
+        'Flash Off' => 'íëì OFF',
+        'Framing Grid' => 'ê²©ìì  íì',
+        'ISO Display' => 'ISO íì',
+        'Matrix Metering' => 'ë©í° íšíŽ ìž¡êŽ',
+        'Spot Metering' => 'ì€í ìž¡êŽ',
+      },
+    },
+   'GPSAltitude' => 'ê³ ë',
+   'GPSAltitudeRef' => {
+      Description => 'ê³ ë ì°žì¡°',
+      PrintConv => {
+        'Above Sea Level' => 'íŽë©Ž',
+        'Below Sea Level' => 'íŽë©Ž ì°žì¡°(ìì ê°)',
+      },
+    },
+   'GPSAreaInformation' => 'GPS ìì­ ìŽëŠ',
+   'GPSDOP' => 'ìž¡ì  ì ë°ë',
+   'GPSDateStamp' => 'GPS ë ì§',
+   'GPSDestBearing' => 'ëª©ì ì§ì ë°©ì',
+   'GPSDestBearingRef' => 'ëª©ì ì§ ë°©ìì êž°ì€',
+   'GPSDestDistance' => 'ëª©ì ì§ê¹ì§ì ê±°ëŠ¬',
+   'GPSDestDistanceRef' => 'ëª©ì ì§ê¹ì§ì ê±°ëŠ¬ ëšì',
+   'GPSDestLatitude' => 'ëª©ì ì§ì ìë',
+   'GPSDestLatitudeRef' => 'ëª©ì ì§ ìëì êž°ì€',
+   'GPSDestLongitude' => 'ëª©ì ì§ì ê²œë',
+   'GPSDestLongitudeRef' => 'ëª©ì ì§ ê²œëì êž°ì€',
+   'GPSDifferential' => {
+      Description => 'GPS ížì°š ë³Žì ',
+      PrintConv => {
+        'Differential Corrected' => 'ížì°š ë³Žì  ì ì©',
+        'No Correction' => 'ížì°š ë³Žì  ììŽ ìž¡ì ',
+      },
+    },
+   'GPSImgDirection' => 'ìŽë¯žì§ ë°©í¥',
+   'GPSImgDirectionRef' => 'ìŽë¯žì§ ë°©í¥ì êž°ì€',
+   'GPSInfo' => 'GPS Info IFD Pointer',
+   'GPSLatitude' => 'ìë',
+   'GPSLatitudeRef' => {
+      Description => 'ë¶ì ëë ëšì',
+      PrintConv => {
+        'North' => 'ë¶ì',
+        'South' => 'ëšì',
+      },
+    },
+   'GPSLongitude' => 'ê²œë',
+   'GPSLongitudeRef' => {
+      Description => 'ëê²œ ëë ìê²œ',
+      PrintConv => {
+        'East' => 'ëê²œ',
+        'West' => 'ìê²œ',
+      },
+    },
+   'GPSMapDatum' => 'ì¬ì©ë ìž¡ì§ ë°ìŽí°',
+   'GPSMeasureMode' => {
+      Description => 'GPS ìž¡ì  ëªšë',
+      PrintConv => {
+        '3-Dimensional Measurement' => '3ì°šì ìž¡ì ',
+      },
+    },
+   'GPSProcessingMethod' => 'GPS ì²ëŠ¬ ë°©ì ìŽëŠ',
+   'GPSSatellites' => 'ìž¡ì ì ì¬ì©ë GPS ìì±',
+   'GPSSpeed' => 'GPS ìì êž° ìë',
+   'GPSSpeedRef' => {
+      Description => 'ìë ëšì',
+      PrintConv => {
+        'km/h' => 'ìê°ë¹ í¬ë¡ë¯ží°',
+        'knots' => 'ë
+žíž',
+        'mph' => 'ìê°ë¹ ë§ìŒ',
+      },
+    },
+   'GPSStatus' => {
+      Description => 'GPS ìì êž° ìí',
+      PrintConv => {
+        'Measurement Active' => 'ì§í ì€ìž ìž¡ì ',
+        'Measurement Void' => 'ìž¡ì  ìíž ìŽì©ì±',
+      },
+    },
+   'GPSTimeStamp' => 'GPS ìê°(ìì ìê³)',
+   'GPSTrack' => 'ìŽë ë°©í¥',
+   'GPSTrackRef' => {
+      Description => 'ìŽë ë°©í¥ì êž°ì€',
+      PrintConv => {
+        'Magnetic North' => 'ìêž° ë°©í¥',
+        'True North' => 'ì€ì  ë°©í¥',
+      },
+    },
+   'GPSVersionID' => 'GPS íê·ž ë²ì ',
+   'GainControl' => {
+      Description => 'ìŽë ì ìŽ',
+      PrintConv => {
+        'High gain down' => 'ëì ìŽë ê°ì',
+        'High gain up' => 'ëì ìŽë ìŠê°',
+        'Low gain down' => 'ì ì ìŽë ê°ì',
+        'Low gain up' => 'ì ì ìŽë ìŠê°',
+        'None' => 'ìì',
+      },
+    },
+   'Gamma' => 'ê°ë§',
+   'Gradation' => 'ê³ì¡°',
+   'GridDisplay' => {
+      Description => 'ê²©ì íì',
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'HDR' => {
+      Description => 'ìë HDR',
+      PrintConv => {
+        'Off' => 'ìì',
+      },
+    },
+   'Headline' => 'í€ëëŒìž',
+   'HighISONoiseReduction' => {
+      Description => 'ê³ ISOìì ë
+žìŽìŠì ê±°',
+      PrintConv => {
+        'Auto' => 'ìë',
+        'High' => 'ê°íš',
+        'Low' => 'ìœíš',
+        'Minimal' => 'ìµì',
+        'Normal' => 'íì€',
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'HighlightTonePriority' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'Hue' => 'ìì',
+   'HueAdjustment' => 'ìì¡°',
+   'ISO' => 'ISO ìë',
+   'ISODisplay' => 'ISO íì',
+   'ISOExpansion' => {
+      Description => 'ISO íì¥',
+      PrintConv => {
+        'Off' => 'êºŒì§',
+      },
+    },
+   'ISOExpansion2' => {
+      Description => 'ISO íì¥ (2)',
+      PrintConv => {
+        'Off' => 'êºŒì§',
+      },
+    },
+   'ISOInfo' => 'ISO ì ë³Ž',
+   'ISOSelection' => 'ISO ì í',
+   'ISOSetting' => {
+      Description => 'ISO ì€ì ',
+      PrintConv => {
+        'Auto' => 'ìë',
+        'Manual' => 'ìë',
+      },
+    },
+   'ISOStepSize' => 'ISO ê°ë ì€í
+ ìì¹',
+   'Illumination' => {
+      Description => 'ì¡°ëª
+',
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'ImageAdjustment' => 'ìŽë¯žì§ ì¡°ì ',
+   'ImageAuthentication' => {
+      Description => 'ìŽë¯žì§ ìžìŠ',
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'ImageBoundary' => 'ìŽë¯žì§ ê²œê³',
+   'ImageCount' => 'ìŽë¯žì§ ì¹ŽìŽíž',
+   'ImageDataSize' => 'ìŽë¯žì§ ë°ìŽí° í¬êž°',
+   'ImageDustOff' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'ImageHeight' => 'ìŽë¯žì§ ëìŽ',
+   'ImageHistory' => 'ìŽë¯žì§ ìŽë ¥',
+   'ImageNumber' => 'ìŽë¯žì§ ì«ì',
+   'ImageOptimization' => 'ìŽë¯žì§ ìµì í',
+   'ImageProcessing' => 'ìŽë¯žì§ ì²ëŠ¬',
+   'ImageQuality' => 'ìŽë¯žì§ íì§',
+   'ImageReview' => {
+      Description => 'ìŽë¯žì§ ë¯žëŠ¬ë³Žêž°',
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'ImageReviewTime' => 'ìŽë¯žì§ ì¬ì ìê°',
+   'ImageSize' => 'ìŽë¯žì§ í¬êž°',
+   'ImageStabilization' => {
+      Description => 'ìëšëŠŒ ë³Žì ',
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'ImageUniqueID' => 'ê³ ì  ìŽë¯žì§ ID',
+   'ImageWidth' => 'ìŽë¯žì§ ëìŽ',
+   'Index' => 'ììž',
+   'InitialZoomSetting' => {
+      Description => 'ìŽëì
+ ì€ ì€ì ',
+      PrintConv => {
+        'High Magnification' => 'í° íë',
+        'Low Magnification' => 'ìì íë',
+        'Medium Magnification' => 'ì€ê° íë',
+      },
+    },
+   'Instructions' => 'ìëŽ',
+   'IntensityStereo' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'InternalFlash' => {
+      Description => 'ëŽì¥íëì ì»šížë¡€',
+      PrintConv => {
+        'Commander Mode' => 'ì»€ë§šë ëªšë',
+        'Manual' => 'ìë',
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+        'Repeating Flash' => 'ëŠ¬íŒí
+ íëì',
+      },
+    },
+   'InternalFlashMode' => {
+      PrintConv => {
+        'On' => 'ìŒì§',
+      },
+    },
+   'InteropIndex' => 'ìížìŽì©ì± ìŠëª
+',
+   'InteropOffset' => 'ìíž ìŽì©ì± íê·ž',
+   'InteropVersion' => 'ìíž ìŽì©ì± ë²ì ',
+   'Keyword' => 'í€ìë',
+   'Keywords' => 'í€ìë',
+   'LCDIllumination' => {
+      Description => 'LCD ì¡°ëª
+',
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'LCDIlluminationDuringBulb' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'LCHEditor' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'Lens' => 'ë ìŠ',
+   'LensDataVersion' => 'ë ìŠ ë°ìŽí° ë²ì ',
+   'LensFStops' => 'ë ìŠ F-ì«ì',
+   'LensID' => 'ì¬ì©ë ë ìŠ',
+   'LensIDNumber' => 'ë ìŠ ID ì«ì',
+   'LensInfo' => 'ë ìŠ ì ë³Ž',
+   'LensType' => 'ë ìŠ íì',
+   'LightSource' => {
+      Description => 'êŽì ì¢
+ë¥',
+      PrintConv => {
+        'Cloudy' => 'íëŠ° ë ìš',
+        'Cool White Fluorescent' => 'ëë°±ì íêŽë± (W 3800 - 4500K)',
+        'Day White Fluorescent' => 'ì£Œë°±ì íêŽë± (N 4600 - 5500K)',
+        'Daylight' => 'ì£ŒêŽ',
+        'Daylight Fluorescent' => 'ì£ŒêŽì íêŽë± (D 5700 - 7100K)',
+        'Fine Weather' => 'ë§ì ë ìš',
+        'Flash' => 'íëì',
+        'Fluorescent' => 'íêŽë±',
+        'ISO Studio Tungsten' => 'ISO ì€íëì€ í
+
+ì€í
+',
+        'Other' => 'êž°í êŽì',
+        'Shade' => 'ê·žë',
+        'Standard Light A' => 'íì€ êŽì A',
+        'Standard Light B' => 'íì€ êŽì B',
+        'Standard Light C' => 'íì€ êŽì C',
+        'Tungsten (Incandescent)' => 'í
+
+ì€í
+ (ë°±ìŽë±)',
+        'Unknown' => 'ì ì ìì',
+        'Warm White Fluorescent' => 'ë°ë»í í°ì íêŽ (L 2600 - 3250K)',
+        'White Fluorescent' => 'ë°±ì íêŽë± (WW 3250 - 3800K)',
+      },
+    },
+   'Lightness' => 'ëª
+ë',
+   'LinearizationTable' => 'ì íëí',
+   'LiveViewShooting' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'Location' => 'ìì¹',
+   'LongExposureNoiseReduction' => {
+      Description => 'ì¥ìê° ë
+žì¶ NR',
+      PrintConv => {
+        'Auto' => 'ìë',
+        'Off' => 'ìì',
+        'On' => 'ìì',
+      },
+    },
+   'LuminanceNoiseReduction' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+      },
+    },
+   'MB-D10Batteries' => 'MB-D10 ë°°í°ëŠ¬ íì',
+   'MB-D80Batteries' => {
+      Description => 'MB-D80 ë°°í°ëŠ¬',
+      PrintConv => {
+        'FR6 (AA Lithium)' => 'FR6 (AA ëŠ¬í¬)',
+        'LR6 (AA Alkaline)' => 'LR6 (AA ìì¹ŽëŒìž)',
+      },
+    },
+   'MCUVersion' => 'MCU ë²ì ',
+   'MSStereo' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'Macro' => {
+      PrintConv => {
+        'Manual' => 'ìë',
+      },
+    },
+   'MacroMode' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'MainDialExposureComp' => {
+      Description => 'ë
+žì¶ ë³Žì ',
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'Make' => 'ë©ìŽì»€',
+   'MakerNote' => 'ì ì¡°ì¬ ë
+žíž',
+   'MakerNoteVersion' => 'ì ì¡°ì¬ë
+žíž ë²ì ',
+   'MakerNotes' => 'ì ì¡°ì
+ì²Ž ì ë³Ž',
+   'ManualFlashOutput' => 'ëŽì¥ íëì ìë ì¶ë ¥',
+   'ManualFocusDistance' => 'ìë ìŽì  ê±°ëŠ¬',
+   'MaxAperture' => 'ìµë ë ìŠ ì¡°ëŠ¬ê°',
+   'MaxApertureAtMaxFocal' => 'ìµë ìŽì êžžìŽìì ìµë ì¡°ëŠ¬ê°',
+   'MaxApertureAtMinFocal' => 'ìµì ìŽì êžžìŽìì ìµë ì¡°ëŠ¬ê°',
+   'MaxApertureValue' => 'ìµë ë ìŠ ì¡°ëŠ¬ê°',
+   'MaxContinuousRelease' => 'ìµë ì°ì¬ ëŠŽëŠ¬ìŠ',
+   'MaxFocalLength' => 'ìµë ìŽì êžžìŽ',
+   'Metering' => {
+      Description => 'ìž¡êŽ',
+      PrintConv => {
+        'Center-weighted' => 'ì€ìë¶ ì€ì ',
+        'Matrix' => 'ë©í°íšíŽ',
+        'Spot' => 'ì€í',
+      },
+    },
+   'MeteringMode' => {
+      Description => 'ìž¡êŽ ëªšë',
+      PrintConv => {
+        'Average' => 'íê· ',
+        'Center-weighted average' => 'ì€ìì€ì  íê· ',
+        'Multi-segment' => 'ë©í° íšíŽ',
+        'Multi-spot' => 'ë©í° ì€í',
+        'Other' => 'êž°í',
+        'Partial' => 'ë¶ë¶',
+        'Spot' => 'ì€í',
+        'Unknown' => 'ì ì ìì',
+      },
+    },
+   'MeteringTime' => {
+      Description => 'ìë ìž¡êŽ êºŒì§ ìê°',
+      PrintConv => {
+        'No Limit' => 'ë¬Žì í',
+      },
+    },
+   'MinFocalLength' => 'ìµì ìŽì êžžìŽ',
+   'Model' => 'ì¹Žë©ëŒ ëªšëž',
+   'ModelingFlash' => {
+      Description => 'ìµë',
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'ModifiedSaturation' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+      },
+    },
+   'ModifiedToneCurve' => {
+      PrintConv => {
+        'Manual' => 'ìë',
+      },
+    },
+   'ModifiedWhiteBalance' => {
+      PrintConv => {
+        'Auto' => 'ìë',
+      },
+    },
+   'ModifyDate' => 'íìŒ ë³ê²œ ë ì§ ë° ìê°',
+   'MoireFilter' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'MonitorOffTime' => 'ëªšëí° êºŒì§ ìê°',
+   'MonochromeFilterEffect' => {
+      PrintConv => {
+        'Green' => 'ë
+¹ì',
+        'Orange' => 'ì£Œí©',
+        'Red' => 'ë¹šê°',
+        'Yellow' => 'ë
+žë',
+      },
+    },
+   'MonochromeToningEffect' => {
+      PrintConv => {
+        'Green' => 'ë
+¹ì',
+      },
+    },
+   'MultiExposure' => 'ë€ì€ ë
+žì¶ ë°ìŽí°',
+   'MultiExposureAutoGain' => {
+      Description => 'ë€ì€ ë
+žì¶ ìë ê²ìž',
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'MultiExposureMode' => {
+      Description => 'ë€ì€ë
+žì¶ ëªšë',
+      PrintConv => {
+        'Image Overlay' => 'ìŽë¯žì§ ì€ë²ë ìŽ',
+        'Multiple Exposure' => 'ë€ì€ ë
+žì¶',
+        'Off' => 'êºŒì§',
+      },
+    },
+   'MultiExposureShots' => 'ë€ì€ ë
+žì¶ ìŽ¬ì',
+   'MultiExposureVersion' => 'ë€ì€ ë
+žì¶ ë°ìŽí° ë²ì ',
+   'MultiFrameNoiseReduction' => {
+      Description => 'ë€ì€ íë ì ë
+žìŽìŠ ê°ì',
+      PrintConv => {
+        'Off' => 'ìì',
+        'On' => 'ìì',
+      },
+    },
+   'MultiSelector' => {
+      Description => 'ë©í°ì
+ë í°',
+      PrintConv => {
+        'Do Nothing' => 'ìë¬Žê²ë ìíš',
+        'Reset Meter-off Delay' => 'ë
+žì¶ê³ êºŒì§ ìê° ìŽêž°í',
+      },
+    },
+   'MultiSelectorPlaybackMode' => {
+      Description => 'ë©í°ì
+ë í° ì¬ì ëªšë',
+      PrintConv => {
+        'Choose Folder' => 'íŽë ì í',
+        'Thumbnail On/Off' => 'ì¬ë€ìŒ on/off',
+        'View Histograms' => 'íì€í ê·žëš íì',
+        'Zoom On/Off' => 'ì€ on/off',
+      },
+    },
+   'MultiSelectorShootMode' => {
+      Description => 'ë©í°ì
+ë í° ìŽ¬ì ëªšë',
+      PrintConv => {
+        'Highlight Active Focus Point' => 'íì± ìŽì  í¬ìžíž íìŽëŒìŽíž',
+        'Not Used' => 'ì¬ì© ìëš',
+        'Select Center Focus Point' => 'ì€ì ìŽì  í¬ìžíž ì í',
+      },
+    },
+   'MultipleExposureSet' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'Mute' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'MyColorMode' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+      },
+    },
+   'NDFilter' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'NEFCompression' => {
+      Description => 'RAW ìì¶',
+      PrintConv => {
+        'Lossless' => 'ìì€ ìì',
+        'Lossy (type 1)' => 'ìì€ëš (íì
+ 1)',
+        'Lossy (type 2)' => 'ìì€ëš (íì
+ 2)',
+        'Uncompressed' => 'ìì¶ëì§ ìì',
+      },
+    },
+   'NikonCaptureData' => 'Nikon Capture ë°ìŽí°',
+   'NikonCaptureVersion' => 'Nikon Capture ë²ì ',
+   'NikonImageSize' => {
+      Description => 'ìŽë¯žì§ í¬êž°',
+      PrintConv => {
+        'Large (10.0 M)' => 'í° (10.0M)',
+        'Medium (5.6 M)' => 'ì€ê° (5.6M)',
+        'Small (2.5 M)' => 'ìì (2.5M)',
+      },
+    },
+   'NoMemoryCard' => {
+      Description => 'ë©ëªšëŠ¬ì¹Žë ìì ê²œì°',
+      PrintConv => {
+        'Enable Release' => 'ëŠŽëŠ¬ìŠ íì©',
+        'Release Locked' => 'ëŠŽëŠ¬ìŠ ì êž',
+      },
+    },
+   'Noise' => 'ë
+žìŽìŠ',
+   'NoiseFilter' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+      },
+    },
+   'NoiseReduction' => {
+      Description => 'ë
+žìŽìŠ ì ê±°',
+      PrintConv => {
+        'Auto' => 'ìë',
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'OneTouchWB' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+      },
+    },
+   'Opto-ElectricConvFactor' => 'êŽì ì ë³í ê³ì',
+   'Orientation' => {
+      Description => 'ìŽë¯žì§ ìì¹',
+      PrintConv => {
+        'Horizontal (normal)' => '0Â° (ììªœ/ì¢ìž¡)',
+        'Mirror horizontal' => '0Â° (ììªœ/ì°ìž¡)',
+        'Mirror horizontal and rotate 270 CW' => '90Â° ìê³ë°©í¥ (ì¢ìž¡/ììªœ)',
+        'Mirror horizontal and rotate 90 CW' => '90Â° ë°ìê³ë°©í¥ (ì°ìž¡/ìë)',
+        'Mirror vertical' => '180Â° (ìë/ì¢ìž¡)',
+        'Rotate 180' => '180Â° (ìë/ì°ìž¡)',
+        'Rotate 270 CW' => '90Â° ìê³ë°©í¥ (ì¢ìž¡/ìë)',
+        'Rotate 90 CW' => '90Â° ë°ìê³ë°©í¥ (ì°ìž¡/ììªœ)',
+      },
+    },
+   'PhaseDetectAF' => {
+      Description => 'ì€í í¬ì»€ì€',
+      PrintConv => {
+        'Off' => 'ë¹íì±',
+        'On (51-point)' => 'íì±',
+      },
+    },
+   'PhotoEffect' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+      },
+    },
+   'PhotoEffects' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'PhotoInfoPlayback' => {
+      Description => 'ì¬ì§ ì ë³Ž/ì¬ì',
+      PrintConv => {
+        'Info Left-right, Playback Up-down' => 'ì ë³Ž <> / ì¬ì',
+        'Info Up-down, Playback Left-right' => 'ì ë³Ž / ì¬ì <>',
+      },
+    },
+   'PhotometricInterpretation' => {
+      Description => 'íœì
+ íì',
+      PrintConv => {
+        'BlackIsZero' => 'ëžëì ì ë¡ì',
+        'RGB Palette' => 'íë íž ì»¬ë¬',
+        'Transparency Mask' => 'í¬ëª
+ ë§ì€í¬',
+        'WhiteIsZero' => 'íìŽížë ì ë¡ì',
+      },
+    },
+   'PictureControl' => {
+      Description => 'íœì³ì»šížë¡€',
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'PictureControlActive' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'PictureControlAdjust' => {
+      Description => 'íœì³ì»šížë¡€ ì¡°ì ',
+      PrintConv => {
+        'Default Settings' => 'êž°ë³ž ì€ì ',
+        'Full Control' => 'ì ì²Ž ì ìŽ',
+        'Quick Adjust' => 'ë¹ ë¥ž ì¡°ì ',
+      },
+    },
+   'PictureControlBase' => 'íœì³ì»šížë¡€ êž°ìŽ',
+   'PictureControlName' => 'íœì³ì»šížë¡€ ìŽëŠ',
+   'PictureControlQuickAdjust' => 'íœì³ì»šížë¡€ ë¹ ë¥ž ì¡°ì ',
+   'PictureControlVersion' => 'íœì³ì»šížë¡€ ë²ì ',
+   'PictureMode' => {
+      PrintConv => {
+        'Auto' => 'ìë',
+        'Manual' => 'ìë',
+      },
+    },
+   'PictureMode2' => {
+      PrintConv => {
+        'Manual' => 'ìë',
+      },
+    },
+   'PictureModeBWFilter' => {
+      PrintConv => {
+        'Green' => 'ë
+¹ì',
+        'Orange' => 'ì£Œí©',
+        'Red' => 'ë¹šê°',
+        'Yellow' => 'ë
+žë',
+      },
+    },
+   'PictureModeTone' => {
+      PrintConv => {
+        'Green' => 'ë
+¹ì',
+      },
+    },
+   'PlanarConfiguration' => {
+      Description => 'ìŽë¯žì§ ë°ìŽí° ì ë ¬',
+      PrintConv => {
+        'Chunky' => 'ì²­í€ íì',
+        'Planar' => 'íë©Ž íì',
+      },
+    },
+   'PreviewIFD' => 'IFD í¬ìží° ë¯žëŠ¬ë³Žêž°',
+   'PrimaryAFPoint' => {
+      PrintConv => {
+        'Bottom' => 'íëš',
+        'C6 (Center)' => 'C6 (ì€ì)',
+        'Center' => 'ì€ì',
+        'Far Left' => 'ë§š ì¢ìž¡',
+        'Far Right' => 'ë§š ì°ìž¡',
+        'Lower-left' => 'ì¢íëš',
+        'Lower-right' => 'ì°íëš',
+        'Mid-left' => 'ìŒìªœ',
+        'Mid-right' => 'ì€ë¥žìªœ',
+        'Top' => 'ìëš',
+        'Upper-left' => 'ì¢ìëš',
+        'Upper-right' => 'ì°ìëš',
+      },
+    },
+   'PrimaryChromaticities' => 'êž°ë³ž ìë',
+   'ProgramShift' => 'íë¡ê·žëš ì¬ííž',
+   'Province-State' => 'ë',
+   'Quality' => {
+      Description => 'íì§',
+      PrintConv => {
+        'Compressed RAW' => 'cRAW',
+        'Compressed RAW + JPEG' => 'cRAW+JPEG',
+        'Extra Fine' => 'ìì€ížëŒ íìž',
+        'Fine' => 'íìž',
+        'Low' => 'ì íì§',
+        'Normal' => 'íì€íì§',
+        'RAW + JPEG' => 'RAW+JPEG',
+        'Standard' => 'íì€',
+      },
+    },
+   'RawDevAutoGradation' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'RawDevPMPictureTone' => {
+      PrintConv => {
+        'Green' => 'ë
+¹ì',
+      },
+    },
+   'RawDevPM_BWFilter' => {
+      PrintConv => {
+        'Green' => 'ë
+¹ì',
+        'Orange' => 'ì£Œí©',
+        'Red' => 'ë¹šê°',
+        'Yellow' => 'ë
+žë',
+      },
+    },
+   'RawImageCenter' => 'RAW ìŽë¯žì§ ì€ì',
+   'RecordMode' => {
+      Description => 'ìŽë¯žì§ íì§ ëªšë',
+      PrintConv => {
+        'Manual' => 'ìë',
+      },
+    },
+   'RecordingMode' => {
+      PrintConv => {
+        'Auto' => 'ìë',
+        'Manual' => 'ìë',
+      },
+    },
+   'RedEyeCorrection' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+      },
+    },
+   'RedEyeReduction' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'ReferenceBlackWhite' => 'íë°± ì°žì¡° ê°ì ì',
+   'RelatedImageFileFormat' => 'êŽë š ìŽë¯žì§ íìŒ íì',
+   'RelatedImageHeight' => 'êŽë š ìŽë¯žì§ êžžìŽ',
+   'RelatedImageWidth' => 'êŽë š ìŽë¯žì§ ëë¹',
+   'RelatedSoundFile' => 'ì°êŽë ì€ëì€ íìŒ',
+   'ReleaseButtonToUseDial' => {
+      Description => 'ë€ìŽìŒë¡ ëŠŽëŠ¬ìŠ ë²íŒ ì¬ì©',
+      PrintConv => {
+        'No' => 'ìëì€',
+        'Yes' => 'ì',
+      },
+    },
+   'RemoteOnDuration' => 'ëŠ¬ëªšì»š ì§ì ìê°',
+   'RepeatingFlashCount' => 'ëŠ¬íŒí
+ íëì ìê°',
+   'RepeatingFlashOutput' => 'ëŠ¬íŒí
+ íëì ì¶ë ¥',
+   'RepeatingFlashRate' => 'ëŠ¬íŒí
+ íëì  ê°ê²©',
+   'ResolutionUnit' => {
+      Description => 'X ì Y íŽìë ëšì',
+      PrintConv => {
+        'None' => 'ìì',
+        'cm' => 'ìŒí°ë¯ží°',
+        'inches' => 'ìžì¹',
+      },
+    },
+   'RetouchHistory' => {
+      Description => 'ëŠ¬í°ì¹ ìŽë ¥',
+      PrintConv => {
+        'B & W' => 'íë°±',
+        'Color Custom' => 'ì»€ì€í
+ ì»¬ë¬',
+        'Cyanotype' => 'ì²­ì¬ì§',
+        'Image Overlay' => 'ìŽë¯žì§ ì€ë²ë ìŽ',
+        'None' => 'ìì',
+        'Sepia' => 'ìžíŒì',
+        'Sky Light' => 'ì€ì¹ŽìŽ ëŒìŽíž',
+        'Small Picture' => 'ì€ëª°',
+        'Trim' => 'ížëŠ¬ë°',
+        'Warm Tone' => 'ë°ë»í í€',
+      },
+    },
+   'ReverseIndicators' => 'ìžëìŒìŽí° ì í',
+   'Rotation' => {
+      Description => 'ì¹Žë©ëŒ íì  ë°©í¥',
+      PrintConv => {
+        'Horizontal' => '0Â° (ìí)',
+        'Rotated 180' => '180Â° (ìíë°ì )',
+        'Rotated 270 CW' => '90Â° ì¢íì ',
+        'Rotated 90 CW' => '90Â° ì°íì ',
+      },
+    },
+   'RowsPerStrip' => 'ì€ížëŠœ ë¹ íì ì',
+   'SamplesPerPixel' => 'êµ¬ì± ìì ì',
+   'Saturation' => {
+      Description => 'ì±ë',
+      PrintConv => {
+        'High' => 'ê³ ì±ë',
+        'Low' => 'ì ì±ë',
+        'Normal' => 'íì€',
+      },
+    },
+   'ScanImageEnhancer' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'SceneAssist' => 'ë³Žì¡° ìŒì',
+   'SceneCaptureType' => {
+      Description => 'ì¥ë©Ž êž°ë¡ íì',
+      PrintConv => {
+        'Landscape' => 'íê²œ',
+        'Night' => 'ìŒê²œ',
+        'Portrait' => 'ìžë¬Œ',
+        'Standard' => 'íì€',
+      },
+    },
+   'SceneMode' => {
+      Description => 'ì¥ë©Ž ëªšë',
+      PrintConv => {
+        '3D Sweep Panorama' => '3D',
+        'Anti Motion Blur' => 'ìžë¬Œ íë€ëŠŒ ë°©ì§',
+        'Auto' => 'ìë',
+        'Cont. Priority AE' => 'ì°ì ìŽ¬ì ì°ì  AE',
+        'Handheld Night Shot' => 'ììŒë¡ ìŒê° ìŽ¬ì',
+        'Landscape' => 'íê²œ',
+        'Macro' => 'ë§€í¬ë¡',
+        'Manual' => 'ìë',
+        'Night Portrait' => 'ìŒê²œ ìžë¬Œ',
+        'Night Scene' => 'ìŒê²œ',
+        'Night View/Portrait' => 'ìŒê²œ/ìžë¬Œ',
+        'Off' => 'êºŒì§',
+        'Portrait' => 'ìžë¬Œ',
+        'Sports' => 'ì€í¬ìž  ì¡ì
+',
+        'Standard' => '',
+        'Sunset' => 'ìììŽ¬ì',
+        'Sweep Panorama' => 'ì€ìí íë
+žëŒë§',
+      },
+    },
+   'SceneModeUsed' => {
+      PrintConv => {
+        'Manual' => 'ìë',
+      },
+    },
+   'SceneType' => {
+      Description => 'ì¥ë©Ž íì',
+      PrintConv => {
+        'Directly photographed' => 'ì§ì  ìŽ¬ìë ìŽë¯žì§',
+      },
+    },
+   'SecurityClassification' => {
+      Description => 'ë³Žì ë¶ë¥',
+      PrintConv => {
+        'Confidential' => 'êž°ë°',
+        'Restricted' => 'ì í',
+        'Secret' => 'ë¹ë°',
+        'Top Secret' => '1êžë¹ë°',
+        'Unclassified' => 'ë¶ë¥ìëš',
+      },
+    },
+   'SelfTimerMode' => 'ì
+í íìŽëšž ëªšë',
+   'SelfTimerTime' => 'ì
+ííìŽëšž',
+   'SensingMethod' => {
+      Description => 'ê²ì¶ ë°©ì',
+      PrintConv => {
+        'Color sequential area' => 'ìì ìì°š ìì­ ìŒì',
+        'Color sequential linear' => 'ìì ìì°š ì í ìŒì',
+        'Monochrome area' => 'ëªšë
+ží¬ë¡¬ ìì­ ìŒì',
+        'Monochrome linear' => 'ëªšë
+ží¬ë¡¬ ì í ìŒì',
+        'Not defined' => 'ì ìëì§ ìì',
+        'One-chip color area' => 'One-chip ìì ìì­ ìŒì',
+        'Three-chip color area' => 'Three-chip ìì ìì­ ìŒì',
+        'Trilinear' => 'Trilinear ìŒì',
+        'Two-chip color area' => 'Two-chip ìì ìì­ ìŒì',
+      },
+    },
+   'SensorPixelSize' => 'ìŒì íœì
+ í¬êž°',
+   'SerialNumber' => 'ìëŠ¬ìŒë²íž',
+   'ShadingCompensation' => {
+      Description => 'ì£Œë³êŽë ë³Žì ',
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'ShadingCompensation2' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'ShakeReduction' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'Sharpness' => {
+      Description => 'ì ëª
+ë',
+      PrintConv => {
+        'Hard' => 'ê°íê²',
+        'Normal' => 'íì€',
+        'Soft' => 'ìœíê²',
+      },
+    },
+   'ShootingInfoDisplay' => {
+      Description => 'ìŽ¬ì ì ë³Ž íì',
+      PrintConv => {
+        'Auto' => 'ìë',
+        'Manual (dark on light)' => 'ìë - ë°ìë°°ê²œì ìŽëì',
+        'Manual (light on dark)' => 'ìë - ìŽëìŽ ë°°ê²œì ë°ì',
+      },
+    },
+   'ShootingMode' => {
+      Description => 'ìê²© ëŠ¬ëªšì»š',
+      PrintConv => {
+        'Manual' => 'ìë',
+      },
+    },
+   'ShootingModeSetting' => {
+      Description => 'ìŽ¬ì ëªšë',
+      PrintConv => {
+        'Continuous' => 'ì°ì¬',
+        'Delayed Remote' => 'ìŽ¬ìëêž° ëŠ¬ëªšì»š',
+        'Quick-response Remote' => 'ìŠììŽ¬ì ëŠ¬ëªšì»š',
+        'Self-timer' => 'ì
+ííìŽëšž',
+        'Single Frame' => 'ì±êž íë ì',
+      },
+    },
+   'ShotInfoVersion' => 'ìŽ¬ì ì ë³Ž ë²ì ',
+   'ShutterCount' => 'ì
+í° ì¹ŽìŽíž',
+   'ShutterMode' => {
+      PrintConv => {
+        'Auto' => 'ìë',
+      },
+    },
+   'ShutterReleaseButtonAE-L' => {
+      Description => 'ì
+í° ëŠŽëŠ¬ìŠ ë²íŒ AE-L',
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'ShutterSpeed' => 'ë
+žì¶ ìê°',
+   'ShutterSpeedValue' => 'ì
+í° ìë',
+   'SlowShutter' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'SlowSync' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+      },
+    },
+   'Software' => 'ìíížìšìŽ',
+   'Source' => 'ìì€',
+   'SpatialFrequencyResponse' => 'ê³µê° ì£Œíì ìëµ',
+   'SpectralSensitivity' => 'ë¶êŽ ê°ë',
+   'State' => 'ë',
+   'StripByteCounts' => 'ìì¶ë ì€ížëŠœ ë¹ ë°ìŽíž',
+   'StripOffsets' => 'ìŽë¯žì§ ë°ìŽí° ìì¹',
+   'SubSecTime' => 'ìŒì 1/100 ìŽ',
+   'SubSecTimeDigitized' => 'ëì§íží ìŒì 1/100 ìŽ',
+   'SubSecTimeOriginal' => 'ìë³žìŒì 1/100 ìŽ',
+   'SubfileType' => 'ìë¡ìŽ ìëžíìŒ íì',
+   'SubjectArea' => 'íŒì¬ì²Ž ìì­',
+   'SubjectDistance' => 'íŒì¬ì²Žì ê±°ëŠ¬',
+   'SubjectDistanceRange' => {
+      Description => 'íŒì¬ì²Ž ê±°ëŠ¬ íê³',
+      PrintConv => {
+        'Close' => 'ê·Œê²œ',
+        'Distant' => 'ìê²œ',
+        'Macro' => 'ë§€í¬ë¡',
+        'Unknown' => 'ì ì ìì',
+      },
+    },
+   'SubjectLocation' => 'íŒì¬ì²Ž ìì¹',
+   'SuperMacro' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+      },
+    },
+   'SuperimposedDisplay' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'SupplementalCategories' => 'ë³Žì¶© ë²ì£Œ',
+   'TextStamp' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'ThumbnailImage' => 'ì¶ì ê·žëŠŒ',
+   'ThumbnailImageSize' => 'ê°€ë¬ëŠ¬ í¬êž°',
+   'TimerFunctionButton' => {
+      Description => 'Fn ë²íŒ',
+      PrintConv => {
+        'ISO' => 'ISO ê°ë',
+        'Image Quality/Size' => 'ìŽë¯žì§ íì§/í¬êž°',
+        'Self-timer' => 'ì
+ííìŽëšž',
+        'Shooting Mode' => 'ìŽ¬ì ëªšë',
+        'White Balance' => 'íìŽíž ë°žë°ì€',
+      },
+    },
+   'Timezone' => 'íì€ ìê°ë',
+   'Title' => 'ì ëª©',
+   'ToneComp' => 'ê³ì¡° ë³Žì ',
+   'ToneCurve' => {
+      PrintConv => {
+        'Manual' => 'ìë',
+      },
+    },
+   'ToningEffect' => {
+      Description => 'ì¡°ì íšê³Œ',
+      PrintConv => {
+        'B&W' => 'íë°±',
+        'Blue' => 'ëžë£š',
+        'Blue-green' => 'ëžë£š-ê·žëŠ°',
+        'Green' => 'ë
+¹ì',
+        'Purple-blue' => 'íŒí-ëžë£š',
+        'Red' => 'ë¹šê°',
+        'Red-purple' => 'ë ë-íŒí',
+        'Yellow' => 'ë
+žë',
+        'n/a' => 'ì€ì  ìëš',
+      },
+    },
+   'ToningEffectMonochrome' => {
+      PrintConv => {
+        'Green' => 'ë
+¹ì',
+      },
+    },
+   'ToningSaturation' => 'ì±ë ì¡°ì ',
+   'TransferFunction' => 'ì ì¡ êž°ë¥',
+   'TransmissionReference' => 'ì ì¡ ì°žì¡°',
+   'Uncompressed' => 'ìì¶ëì§ ìì',
+   'Unsharp1Color' => {
+      PrintConv => {
+        'Green' => 'ë
+¹ì',
+        'Red' => 'ë¹šê°',
+        'Yellow' => 'ë
+žë',
+      },
+    },
+   'Unsharp2Color' => {
+      PrintConv => {
+        'Green' => 'ë
+¹ì',
+        'Red' => 'ë¹šê°',
+        'Yellow' => 'ë
+žë',
+      },
+    },
+   'Unsharp3Color' => {
+      PrintConv => {
+        'Green' => 'ë
+¹ì',
+        'Red' => 'ë¹šê°',
+        'Yellow' => 'ë
+žë',
+      },
+    },
+   'Unsharp4Color' => {
+      PrintConv => {
+        'Green' => 'ë
+¹ì',
+        'Red' => 'ë¹šê°',
+        'Yellow' => 'ë
+žë',
+      },
+    },
+   'UnsharpMask' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'Urgency' => 'ì€ìë',
+   'UserComment' => 'ì¬ì©ì ìœë©íž',
+   'VRInfo' => 'ìëšëŠŒ ë³Žì  ì ë³Ž',
+   'VRInfoVersion' => 'VR ì ë³Ž ë²ì ',
+   'VR_0x66' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+      },
+    },
+   'VariProgram' => 'ë€ì€ íë¡ê·žëš',
+   'VibrationReduction' => {
+      Description => 'ìëšëŠŒ ë³Žì ',
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'ViewfinderWarning' => {
+      Description => 'ë·°íìŒë ê²œê³ ',
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'VignetteControl' => {
+      Description => 'ë¹ë€í
+ ì»šížë¡€',
+      PrintConv => {
+        'High' => 'ëì',
+        'Low' => 'ë®ì',
+        'Normal' => 'íì€',
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'WBBracketMode' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+      },
+    },
+   'WBMode' => {
+      PrintConv => {
+        'Auto' => 'ìë',
+      },
+    },
+   'WhiteBalance' => {
+      Description => 'íìŽížë°žë°ì€',
+      PrintConv => {
+        'Auto' => 'ìë',
+        'Black & White' => 'íë°±',
+        'Cloudy' => 'íëŠ°ë ',
+        'Color Temperature/Color Filter' => 'ì ìšë / ì»¬ë¬ íí°',
+        'Cool White Fluorescent' => 'ì°šê°ìŽ ë°±ì íêŽ',
+        'Custom' => 'ì¬ì©ì ì ì',
+        'Custom 1' => 'ê°ìžì€ì 1',
+        'Custom 2' => 'ê°ìžì€ì 2',
+        'Custom 3' => 'ê°ìžì€ì 3',
+        'Custom 4' => 'ê°ìžì€ì 4',
+        'Day White Fluorescent' => 'ì€ì± ë°±ì íêŽ',
+        'Daylight' => 'ë§ìë ',
+        'Daylight Fluorescent' => 'ìŒêŽ íêŽ',
+        'Flash' => 'íëì',
+        'Fluorescent' => 'íêŽë±',
+        'Manual' => 'ìë',
+        'Shade' => 'ê·žë',
+        'Tungsten' => 'ë°±ìŽë±',
+        'Unknown' => 'ì ì ìì',
+        'Warm White Fluorescent' => 'ë°ë»í í°ì íêŽ',
+        'White Fluorescent' => 'ë°±ì íêŽë±',
+      },
+    },
+   'WhiteBalance2' => {
+      PrintConv => {
+        'Auto' => 'ìë',
+      },
+    },
+   'WhiteBalanceAdj' => {
+      PrintConv => {
+        'Auto' => 'ìë',
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+   'WhiteBalanceFineTune' => 'íìŽížë°žë°ì€ ì¡°ì ',
+   'WhiteBalanceSet' => {
+      PrintConv => {
+        'Auto' => 'ìë',
+        'Manual' => 'ìë',
+      },
+    },
+   'WhitePoint' => 'í°ì ì  ìë',
+   'WorldTime' => 'íì€ ìê°ë',
+   'Writer-Editor' => 'ìº¡ì
+ ìì±ì',
+   'XResolution' => 'ìí íŽìë',
+   'YCbCrCoefficients' => 'ìì ê³µê° ë³í ë§€ížëŠ­ì€ ê³ì',
+   'YCbCrPositioning' => {
+      Description => 'Y and C ìì¹',
+      PrintConv => {
+        'Centered' => 'ì€ì',
+        'Co-sited' => 'ì£Œë³',
+      },
+    },
+   'YCbCrSubSampling' => 'Y->C ìëžìíë§ ë¹ìš',
+   'YResolution' => 'ìì§ íŽìë',
+   'ZoneMatching' => {
+      Description => 'ìì­ ì í',
+      PrintConv => {
+        'High Key' => 'Hi',
+        'ISO Setting Used' => 'ìì',
+        'Low Key' => 'Lo',
+      },
+    },
+   'ZoneMatchingOn' => {
+      PrintConv => {
+        'Off' => 'êºŒì§',
+        'On' => 'ìŒì§',
+      },
+    },
+);
+
+1;  # end
+
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Lang::ko.pm - ExifTool Korean language translations
+
+=head1 DESCRIPTION
+
+This file is used by Image::ExifTool to generate localized tag descriptions
+and values.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Jens Duttke and Jeong Beom Kim for providing this translation.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool(3pm)|Image::ExifTool>,
+L<Image::ExifTool::TagInfoXML(3pm)|Image::ExifTool::TagInfoXML>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/nl.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/nl.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/nl.pm	(revision 24799)
@@ -0,0 +1,3205 @@
+#------------------------------------------------------------------------------
+# File:         nl.pm
+#
+# Description:  ExifTool Dutch language translations
+#
+# Notes:        This file generated automatically by Image::ExifTool::TagInfoXML
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Lang::nl;
+
+use strict;
+use vars qw($VERSION);
+
+$VERSION = '1.07';
+
+%Image::ExifTool::Lang::nl::Translate = (
+   'AEBAutoCancel' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'AELock' => {
+      Description => 'AE-vergrendeling',
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'AELockButton' => {
+      Description => 'AE-L/AF-L',
+      PrintConv => {
+        'AE Lock (hold)' => 'AE-vergrendeling vast',
+        'AE Lock Only' => 'AE-vergrendeling',
+        'AE-L/AF Area' => 'AE-L/AF veld',
+        'AE-L/AF-L/AF Area' => 'AE-L/AF-L/AF veld',
+        'AE/AF Lock' => 'AE/AF-vergrendeling',
+        'AF Lock Only' => 'AF-vergrendeling',
+        'AF-L/AF Area' => 'AF-L/AF veld',
+        'AF-ON/AF Area' => 'AF-ON/AF veld',
+        'FV Lock' => 'FV-vergrendeling',
+        'Focus Area Selection' => 'AF-veld',
+      },
+    },
+   'AEMeteringMode' => {
+      PrintConv => {
+        'Multi-segment' => 'Multi segment',
+      },
+    },
+   'AEProgramMode' => {
+      PrintConv => {
+        'Landscape' => 'Landschap',
+        'Portrait' => 'Portret',
+        'Standard' => 'Standaard',
+      },
+    },
+   'AF-CPrioritySelection' => {
+      Description => 'Selectie AF-C-prioriteit',
+      PrintConv => {
+        'Focus' => 'Scherpstelling',
+        'Release' => 'Ontspannen',
+        'Release + Focus' => 'Ontspannen + scherpstelling',
+      },
+    },
+   'AF-OnForMB-D10' => {
+      Description => 'Functie AF-ON-knop MBD10',
+      PrintConv => {
+        'AE Lock (hold)' => 'AE-vergrendeling (vast)',
+        'AE Lock (reset on release)' => 'AE-vergr. (herstel na ontspan.)',
+        'AE Lock Only' => 'AE-vergrendeling',
+        'AE/AF Lock' => 'AE/AF-vergrendeling',
+        'AF Lock Only' => 'AF-vergrendeling',
+        'AF-On' => 'AF-ON',
+        'Same as FUNC Button' => 'Zelfde als FUNC.-knop',
+      },
+    },
+   'AF-SPrioritySelection' => {
+      Description => 'Selectie AF-S-prioriteit',
+      PrintConv => {
+        'Focus' => 'Scherpstelling',
+        'Release' => 'Ontspannen',
+      },
+    },
+   'AFActivation' => {
+      Description => 'AF activering',
+      PrintConv => {
+        'AF-On Only' => 'Alleen AF-ON',
+        'Shutter/AF-On' => 'Ontspanknop/AF-ON',
+      },
+    },
+   'AFAreaIllumination' => {
+      Description => 'AF-veld verlichting',
+      PrintConv => {
+        'Auto' => 'Automatisch',
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'AFAreaMode' => {
+      Description => 'AF-veldstand',
+      PrintConv => {
+        'Auto-area' => 'Automatischveld AF',
+        'Dynamic Area' => 'Dynamisch veld',
+        'Single Area' => 'Enkelveld',
+      },
+    },
+   'AFAreaModeSetting' => {
+      Description => 'AF-veldstand',
+      PrintConv => {
+        'Closest Subject' => 'Dichtstbz. onderw.',
+        'Dynamic Area' => 'Dynamisch veld',
+        'Single Area' => 'Enkelveld',
+      },
+    },
+   'AFAssist' => {
+      Description => 'AF-hulpverlichting',
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'AFMicroAdjActive' => {
+      PrintConv => {
+        'No' => 'Nee',
+        'Yes' => 'Ja',
+      },
+    },
+   'AFPoint' => {
+      PrintConv => {
+        'None' => 'Geen',
+      },
+    },
+   'AFPointActivationArea' => {
+      PrintConv => {
+        'Standard' => 'Standaard',
+      },
+    },
+   'AFPointBrightness' => {
+      PrintConv => {
+        'Normal' => 'Normaal',
+      },
+    },
+   'AFPointDisplayDuringFocus' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'AFPointIllumination' => {
+      Description => 'Verlichting scherpstelpunt',
+      PrintConv => {
+        'Auto' => 'Automatisch',
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'AFPointMode' => {
+      PrintConv => {
+        'Auto' => 'Automatisch',
+      },
+    },
+   'AFPointRegistration' => {
+      PrintConv => {
+        'Automatic' => 'Automatisch',
+      },
+    },
+   'AFPointSelected' => {
+      PrintConv => {
+        'Auto' => 'Automatisch',
+      },
+    },
+   'AFPointSelected2' => {
+      PrintConv => {
+        'Auto' => 'Automatisch',
+      },
+    },
+   'AFPointSelection' => {
+      Description => 'Selectie scherpstelpunt',
+      PrintConv => {
+        '11 Points' => '11 punten',
+        '51 Points' => '51 punten (3D-tracking)',
+      },
+    },
+   'AFPointSelectionMethod' => {
+      PrintConv => {
+        'Normal' => 'Normaal',
+      },
+    },
+   'AFPointsInFocus' => {
+      PrintConv => {
+        'None' => 'Geen',
+      },
+    },
+   'AFPointsUnknown2' => {
+      PrintConv => {
+        'Auto' => 'Automatisch',
+      },
+    },
+   'AIServoTrackingSensitivity' => {
+      PrintConv => {
+        'Standard' => 'Standaard',
+      },
+    },
+   'APEVersion' => 'APE versie',
+   'ARMIdentifier' => 'ARM herkenningscode',
+   'ARMVersion' => 'ARM versie',
+   'ActionAdvised' => {
+      Description => 'Actie advies',
+      PrintConv => {
+        'Object Kill' => 'Object verwijderen',
+        'Object Reference' => 'Object referentie',
+        'Object Replace' => 'Object vervangen',
+        'Ojbect Append' => 'Object toevoegen',
+      },
+    },
+   'ActiveD-Lighting' => {
+      PrintConv => {
+        'High' => 'Hoog',
+        'Low' => 'Laag',
+        'Normal' => 'Normaal',
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'ActiveD-LightingMode' => {
+      PrintConv => {
+        'High' => 'Hoog',
+        'Low' => 'Laag',
+        'Normal' => 'Normaal',
+        'Off' => 'Uit',
+      },
+    },
+   'AddAspectRatioInfo' => {
+      PrintConv => {
+        'Off' => 'Uit',
+      },
+    },
+   'AddOriginalDecisionData' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'AdultContentWarning' => {
+      PrintConv => {
+        'Unknown' => 'Onbekend',
+      },
+    },
+   'AdvancedRaw' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'AlphaByteCount' => 'Aantal alphagegevens in bytes',
+   'AlphaDataDiscard' => {
+      Description => 'Afgedankte alphagegevens',
+      PrintConv => {
+        'Flexbits Discarded' => 'Afgedankte flexbits',
+        'Full Resolution' => 'Volledige resolutie',
+        'HighPass Frequency Data Discarded' => 'Afgedankte hoogdoorlaat frequentiegegevens',
+        'Highpass and LowPass Frequency Data Discarded' => 'Afgedankte hoogdoorlaat en laagdoorlaat frequentiegegevens',
+      },
+    },
+   'AlphaOffset' => 'Alphaverplaatsing',
+   'Anti-Blur' => {
+      PrintConv => {
+        'Off' => 'Uit',
+      },
+    },
+   'Aperture' => 'Diafragma',
+   'ApertureValue' => 'Diafragma',
+   'ApplicationRecordVersion' => 'Gegevensversie',
+   'Artist' => 'Maker van de afbeelding',
+   'AssistButtonFunction' => {
+      PrintConv => {
+        'Normal' => 'Normaal',
+      },
+    },
+   'Audio' => {
+      PrintConv => {
+        'No' => 'Nee',
+        'Yes' => 'Ja',
+      },
+    },
+   'AudioDuration' => 'Audio duur',
+   'AudioOutcue' => 'Audio eindaftiteling',
+   'AudioSamplingRate' => 'Audio bemonsteringssnelheid',
+   'AudioSamplingResolution' => 'Audio bemonsteringsresolutie',
+   'AudioType' => {
+      Description => 'Type audio',
+      PrintConv => {
+        'Mono Actuality' => 'Actualiteit (mono (1 kanaal) audio)',
+        'Mono Music' => 'Muziek, zelf verstuurd (mono (1 kanaal) audio)',
+        'Mono Question and Answer Session' => 'Vraag en antwoord sessie (mono (1 kanaal) audio)',
+        'Mono Raw Sound' => 'Ruwe geluid (mono (1 kanaal) audio)',
+        'Mono Response to a Question' => 'Beantwoord een vraag (mono (1 kanaal) audio)',
+        'Mono Scener' => 'Toneel (mono (1 kanaal) audio)',
+        'Mono Voicer' => 'Stem (mono (1 kanaals) audio)',
+        'Mono Wrap' => 'Wrap (mono (1 kanaals) audio)',
+        'Stereo Actuality' => 'Actualiteit (stereo (2 kanalen) audio)',
+        'Stereo Music' => 'Muziek, zelf verstuurd (stereo (2 kanalen) audio)',
+        'Stereo Question and Answer Session' => 'Vraag en antwoord sessie (stereo (2 kanalen) audio)',
+        'Stereo Raw Sound' => 'Ruwe geluid (stereo (2 kanalen) audio)',
+        'Stereo Response to a Question' => 'Beantwoord een vraag (stereo (2 kanalen) audio)',
+        'Stereo Scener' => 'Toneel (stereo (2 kanaals) audio)',
+        'Stereo Voicer' => 'Stem (stereo (2 kanaals) audio)',
+        'Stereo Wrap' => 'Wrap (stereo (2 kanaals) audio)',
+        'Text Only' => 'Alleen tekst (geen objectgegevens)',
+      },
+    },
+   'Author' => 'Auteur',
+   'AuthorsPosition' => 'Positie van de auteur',
+   'AutoAperture' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'AutoBracketModeM' => {
+      Description => 'Auto bracketing (M-stand)',
+      PrintConv => {
+        'Flash Only' => 'Alleen flits',
+        'Flash/Aperture' => 'Flits/diafragma',
+        'Flash/Speed' => 'Flits/sluitertijd',
+        'Flash/Speed/Aperture' => 'Flits/sluitertijd/diafragma',
+      },
+    },
+   'AutoBracketOrder' => 'Bracketingvolgorde',
+   'AutoBracketSet' => {
+      Description => 'Inst. voor auto bracketing',
+      PrintConv => {
+        'AE & Flash' => 'AE & flits',
+        'AE Only' => 'Alleen AE',
+        'Flash Only' => 'Alleen flits',
+        'WB Bracketing' => 'Witbalans bracketing',
+      },
+    },
+   'AutoBracketing' => {
+      PrintConv => {
+        'Off' => 'Uit',
+      },
+    },
+   'AutoExposureBracketing' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'AutoFP' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'AutoFocus' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'AutoISO' => {
+      Description => 'ISO auto',
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'AutoISOMax' => 'ISO auto Maximale',
+   'AutoISOMinShutterSpeed' => 'ISO auto Langste sluitertijd',
+   'AutoLightingOptimizer' => {
+      PrintConv => {
+        'Low' => 'Laag',
+        'Off' => 'Uit',
+        'Standard' => 'Standaard',
+      },
+    },
+   'AutoLightingOptimizerOn' => {
+      PrintConv => {
+        'No' => 'Nee',
+        'Yes' => 'Ja',
+      },
+    },
+   'AutoRedEye' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'AutoRotate' => {
+      PrintConv => {
+        'None' => 'Geen',
+        'Rotate 180' => '180Â° (onder/rechts)',
+        'Rotate 270 CW' => 'Draai 270Â° met de klok mee',
+        'Rotate 90 CW' => '90Â° tegen de klok in (rechts/boven)',
+        'n/a' => 'Onbekend',
+      },
+    },
+   'BWMode' => {
+      PrintConv => {
+        'Off' => 'Uit',
+      },
+    },
+   'BackgroundColorIndicator' => 'Achtergrond kleur indicator',
+   'BackgroundColorValue' => 'Achtergrond kleur waarde',
+   'BackgroundTiling' => {
+      PrintConv => {
+        'No' => 'Nee',
+        'Yes' => 'Ja',
+      },
+    },
+   'BannerImageType' => {
+      PrintConv => {
+        'None' => 'Geen',
+      },
+    },
+   'BatteryLevel' => 'Batterij status',
+   'BatteryOrder' => {
+      Description => 'Batterijvolgorde',
+      PrintConv => {
+        'Camera Battery First' => 'Camerabatterij eerst',
+        'MB-D10 First' => 'MB-D10 batterijen eerst',
+      },
+    },
+   'Beep' => {
+      Description => 'Signaal',
+      PrintConv => {
+        'High' => 'Hoog',
+        'Low' => 'Laag',
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'BitsPerSample' => 'Aantal Bits per component',
+   'BlueMatrixColumn' => 'Blauwe matrixkolom',
+   'BlueTRC' => 'Blauwe toon reproductie curve',
+   'BlurWarning' => {
+      PrintConv => {
+        'None' => 'Geen',
+      },
+    },
+   'BracketMode' => {
+      PrintConv => {
+        'Off' => 'Uit',
+      },
+    },
+   'BracketStep' => {
+      PrintConv => {
+        '1 EV' => '1 stop',
+        '1/3 EV' => '1/3 stop',
+        '2/3 EV' => '2/3 stop',
+      },
+    },
+   'Brightness' => 'Helderheid',
+   'BrightnessValue' => 'Helderheid',
+   'BurstMode' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'By-line' => 'Maker',
+   'By-lineTitle' => 'Beroep van de maker',
+   'CFAPattern' => 'Kleur filter matrix',
+   'CFAPattern2' => 'Kleurfiltermatrix 2',
+   'CFARepeatPatternDim' => 'Kleurfiltermatrix grootte',
+   'CLModeShootingSpeed' => 'Opnamesnelheid',
+   'CMMFlags' => 'CMM vlaggen',
+   'CPUType' => {
+      PrintConv => {
+        'None' => 'Geen',
+      },
+    },
+   'CalibrationIlluminant1' => {
+      PrintConv => {
+        'Cloudy' => 'Bewolkt',
+        'Cool White Fluorescent' => 'Koel wit TL-licht',
+        'Day White Fluorescent' => 'Daglicht wit TL-licht',
+        'Daylight' => 'Daglicht',
+        'Daylight Fluorescent' => 'Daglicht TL-licht',
+        'Fine Weather' => 'Onbewolkt',
+        'Flash' => 'Flits',
+        'Fluorescent' => 'Fluoresceren',
+        'ISO Studio Tungsten' => 'ISO studio kunstlicht (gloeilamp)',
+        'Other' => 'Andere lichtbron',
+        'Shade' => 'Schaduw',
+        'Standard Light A' => 'Standaard licht A',
+        'Standard Light B' => 'Standaard licht B',
+        'Standard Light C' => 'Standaard licht C',
+        'Tungsten (Incandescent)' => 'Kunstlicht (gloeilamp)',
+        'Unknown' => 'Onbekend',
+        'Warm White Fluorescent' => 'Warm wit TL-licht',
+        'White Fluorescent' => 'Wit TL-licht',
+      },
+    },
+   'CalibrationIlluminant2' => {
+      PrintConv => {
+        'Cloudy' => 'Bewolkt',
+        'Cool White Fluorescent' => 'Koel wit TL-licht',
+        'Day White Fluorescent' => 'Daglicht wit TL-licht',
+        'Daylight' => 'Daglicht',
+        'Daylight Fluorescent' => 'Daglicht TL-licht',
+        'Fine Weather' => 'Onbewolkt',
+        'Flash' => 'Flits',
+        'Fluorescent' => 'Fluoresceren',
+        'ISO Studio Tungsten' => 'ISO studio kunstlicht (gloeilamp)',
+        'Other' => 'Andere lichtbron',
+        'Shade' => 'Schaduw',
+        'Standard Light A' => 'Standaard licht A',
+        'Standard Light B' => 'Standaard licht B',
+        'Standard Light C' => 'Standaard licht C',
+        'Tungsten (Incandescent)' => 'Kunstlicht (gloeilamp)',
+        'Unknown' => 'Onbekend',
+        'Warm White Fluorescent' => 'Warm wit TL-licht',
+        'White Fluorescent' => 'Wit TL-licht',
+      },
+    },
+   'CameraOrientation' => {
+      Description => 'OriÃ«ntatie van de afbeelding',
+      PrintConv => {
+        'Horizontal (normal)' => '0Â° (boven/links)',
+        'Rotate 270 CW' => 'Draai 270Â° met de klok mee',
+        'Rotate 90 CW' => '90Â° tegen de klok in (rechts/boven)',
+      },
+    },
+   'CanonExposureMode' => {
+      PrintConv => {
+        'Aperture-priority AE' => 'Diafragmaprioriteit',
+        'Manual' => 'Handmatig',
+        'Shutter speed priority AE' => 'Sluiterprioriteit',
+      },
+    },
+   'CanonFlashMode' => {
+      PrintConv => {
+        'Auto' => 'Automatisch',
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'Caption-Abstract' => 'Titel/Beschrijving',
+   'CaptionWriter' => 'Schrijver van het onderschrift',
+   'CaptureXResolutionUnit' => {
+      PrintConv => {
+        'um' => 'Âµm (micrometer)',
+      },
+    },
+   'CaptureYResolutionUnit' => {
+      PrintConv => {
+        'um' => 'Âµm (micrometer)',
+      },
+    },
+   'Categories' => 'CategorieÃ«n',
+   'Category' => 'Categorie',
+   'CellLength' => 'Cel lengte',
+   'CellWidth' => 'Cel breedte',
+   'CenterAFArea' => {
+      Description => 'Centrale AF-veld',
+      PrintConv => {
+        'Normal Zone' => 'Normaal',
+        'Wide Zone' => 'Breed',
+      },
+    },
+   'CenterWeightedAreaSize' => {
+      Description => 'Grootte meetgebied',
+      PrintConv => {
+        'Average' => 'Gemiddeld',
+      },
+    },
+   'CharacterSet' => 'Tekenset',
+   'ChrominanceNR_TIFF_JPEG' => {
+      PrintConv => {
+        'High' => 'Hoog',
+        'Low' => 'Laag',
+        'Off' => 'Uit',
+      },
+    },
+   'ChrominanceNoiseReduction' => {
+      PrintConv => {
+        'High' => 'Hoog',
+        'Low' => 'Laag',
+        'Off' => 'Uit',
+      },
+    },
+   'City' => 'Plaats',
+   'ClassifyState' => 'Rangschik status',
+   'CodedCharacterSet' => 'Gecodeerde character set',
+   'ColorAberrationControl' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'ColorAdjustmentMode' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'ColorBalanceAdj' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'ColorBooster' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'ColorEffect' => {
+      PrintConv => {
+        'Off' => 'Uit',
+      },
+    },
+   'ColorFilter' => {
+      Description => 'Kleurfilter',
+      PrintConv => {
+        'Off' => 'Uit',
+      },
+    },
+   'ColorMode' => {
+      Description => 'Instellingen',
+      PrintConv => {
+        'Autumn Leaves' => 'Herfstbladeren',
+        'B&W' => 'Zwart-wit',
+        'Clear' => 'Doorzichtig',
+        'Deep' => 'Diep',
+        'Evening' => 'Avond',
+        'Landscape' => 'Landschap',
+        'Light' => 'Licht',
+        'Neutral' => 'Neutraal',
+        'Night View' => 'Nacht',
+        'Night View/Portrait' => 'Nachtportret',
+        'Normal' => 'Normaal',
+        'Off' => 'Uit',
+        'Portrait' => 'Portret',
+        'Standard' => 'Standaard',
+        'Sunset' => 'Zonsondergang',
+        'Vivid' => 'Levendige kleuren',
+      },
+    },
+   'ColorMoireReduction' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'ColorMoireReductionMode' => {
+      PrintConv => {
+        'High' => 'Hoog',
+        'Low' => 'Laag',
+        'Off' => 'Uit',
+      },
+    },
+   'ColorSpace' => {
+      Description => 'Kleur ruimte',
+      PrintConv => {
+        'ICC Profile' => 'ICC-profiel',
+        'Uncalibrated' => 'Niet vastgelegd',
+      },
+    },
+   'ColorSpaceData' => 'Gegevenskleurenruimte',
+   'ColorTable' => 'Kleur tabel',
+   'ColorTemperature' => 'Kleurtemperatuur',
+   'ColorTone' => {
+      PrintConv => {
+        'Normal' => 'Normaal',
+      },
+    },
+   'CommandDials' => {
+      Description => 'Instelschijven',
+      PrintConv => {
+        'Reversed (Main Aperture, Sub Shutter)' => 'Verwissel hoofd/sec.',
+        'Standard (Main Shutter, Sub Aperture)' => 'Standaard',
+      },
+    },
+   'CommandDialsApertureSetting' => {
+      Description => 'Functie instelschijven inst. Instellen diafragma',
+      PrintConv => {
+        'Aperture Ring' => 'Diafragmaring',
+        'Sub-command Dial' => 'Secundaire instelschijf',
+      },
+    },
+   'CommandDialsChangeMainSub' => {
+      Description => 'Functie instelschijven inst. Verwissel hoofd/secundair',
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'CommandDialsMenuAndPlayback' => {
+      Description => 'Functie instelschijven inst. Menuâs en weergave',
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'CommandDialsReverseRotation' => {
+      Description => 'Functie instelschijven inst. Rotatie omkeren',
+      PrintConv => {
+        'No' => 'Nee',
+        'Yes' => 'Ja',
+      },
+    },
+   'CommanderChannel' => 'Commanderstand Kanaal',
+   'CommanderGroupAManualOutput' => 'Commanderstand Groep A M Corrct',
+   'CommanderGroupAMode' => {
+      Description => 'Commanderstand Groep A Stand',
+      PrintConv => {
+        'Manual' => 'Handmatig',
+        'Off' => 'Uit',
+        'TTL' => 'DDL',
+      },
+    },
+   'CommanderGroupA_TTL-AAComp' => 'Commanderstand Groep A DDL/AA Corrct',
+   'CommanderGroupBManualOutput' => 'Commanderstand Groep B M Corrct',
+   'CommanderGroupBMode' => {
+      Description => 'Commanderstand Groep B Stand',
+      PrintConv => {
+        'Manual' => 'Handmatig',
+        'Off' => 'Uit',
+        'TTL' => 'DDL',
+      },
+    },
+   'CommanderGroupB_TTL-AAComp' => 'Commanderstand Groep B DDL/AA Corrct',
+   'CommanderInternalFlash' => {
+      Description => 'Commanderstand Ingb. flitsr Stand',
+      PrintConv => {
+        'Manual' => 'Handmatig',
+        'Off' => 'Uit',
+        'TTL' => 'DDL',
+      },
+    },
+   'CommanderInternalManualOutput' => 'Commanderstand Ingb. flitsr M Corrct',
+   'CommanderInternalTTLComp' => 'Commanderstand Ingb. flitsr DDL Corrct',
+   'Comment' => 'Kommentaar',
+   'Compilation' => {
+      PrintConv => {
+        'No' => 'Nee',
+        'Yes' => 'Ja',
+      },
+    },
+   'ComponentsConfiguration' => 'Betekenis van elke component',
+   'CompressedBitsPerPixel' => 'Afbeelding compressie modus',
+   'Compression' => {
+      Description => 'Compressie schema',
+      PrintConv => {
+        'JPEG' => 'JPEG-compressie',
+        'JPEG (old-style)' => 'JPEG (oude versie)',
+        'Kodak DCR Compressed' => 'Kodak DCR gcomprimeerd',
+        'Kodak KDC Compressed' => 'Kodak KDC gecomprimeerd',
+        'Next' => 'NeXT 2-Bit codering',
+        'Nikon NEF Compressed' => 'Nikon NEF gecomprimeerd',
+        'None' => 'Geen',
+        'Pentax PEF Compressed' => 'Pentax PEF gecomprimeerd',
+        'SGILog' => 'SGI 32-Bit Log Luminance gecodeerd',
+        'SGILog24' => 'SGI 24-Bit Log Luminance gecodeerd',
+        'Sony ARW Compressed' => 'Sony ARW gecomprimeerd',
+        'Thunderscan' => 'ThunderScan 4-Bit codering',
+        'Uncompressed' => 'Niet gecomprimeerd',
+      },
+    },
+   'CompressionType' => {
+      PrintConv => {
+        'None' => 'Geen',
+      },
+    },
+   'ConnectionSpaceIlluminant' => 'Witpunt van connectiekleurruimte',
+   'ContentLocationCode' => 'Locatiecode van inhoud',
+   'ContentLocationName' => 'Locatienaam van inhoud',
+   'ContinuousDrive' => {
+      PrintConv => {
+        'Continuous' => 'Continu',
+      },
+    },
+   'Contrast' => {
+      Description => 'Kontrast',
+      PrintConv => {
+        'High' => 'Hoog',
+        'Low' => 'Laag',
+        'Normal' => 'Normaal',
+      },
+    },
+   'ConversionLens' => {
+      PrintConv => {
+        'Off' => 'Uit',
+      },
+    },
+   'Copyright' => 'Copyright houder',
+   'CopyrightNotice' => 'Copyright vermelding',
+   'CopyrightStatus' => {
+      PrintConv => {
+        'Unknown' => 'Onbekend',
+      },
+    },
+   'Country' => 'Land',
+   'Country-PrimaryLocationCode' => 'ISO landcode',
+   'Country-PrimaryLocationName' => 'Land',
+   'CreateDate' => 'Datum van de originele data generatie',
+   'CreationDate' => 'Opname datum',
+   'Creator' => 'Maker',
+   'CreatorAddress' => 'Maker - Adres',
+   'CreatorCity' => 'Maker - Plaats',
+   'CreatorCountry' => 'Maker - Land',
+   'CreatorPostalCode' => 'Maker - Postcode',
+   'CreatorRegion' => 'Maker - Provincie',
+   'CreatorWorkEmail' => 'Maker - E-mail',
+   'CreatorWorkTelephone' => 'Maker - Telefoonnummer',
+   'CreatorWorkURL' => 'Maker - Website(s)',
+   'Credit' => 'Leverancier',
+   'CropActive' => {
+      PrintConv => {
+        'No' => 'Nee',
+        'Yes' => 'Ja',
+      },
+    },
+   'Curves' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'CustomRendered' => {
+      Description => 'Gebruiker gedefineerde beeldverwerking',
+      PrintConv => {
+        'Custom' => 'Gebruiker gedefineerd proces',
+        'Normal' => 'Standaard proces',
+      },
+    },
+   'D-LightingHQ' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'D-LightingHQSelected' => {
+      PrintConv => {
+        'No' => 'Nee',
+        'Yes' => 'Ja',
+      },
+    },
+   'D-LightingHS' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'DataImprint' => {
+      PrintConv => {
+        'None' => 'Geen',
+      },
+    },
+   'DateCreated' => 'Opnamedatum',
+   'DateSent' => 'Datum van zenden',
+   'DateStampMode' => {
+      PrintConv => {
+        'Off' => 'Uit',
+      },
+    },
+   'DateTime' => 'Datum bestand wijziging',
+   'DateTimeOriginal' => 'Datum van de originele data generatie',
+   'DaylightSavings' => {
+      PrintConv => {
+        'No' => 'Nee',
+        'Yes' => 'Ja',
+      },
+    },
+   'Description' => 'Beschrijving',
+   'Destination' => 'Bestemming',
+   'DestinationDST' => {
+      PrintConv => {
+        'No' => 'Nee',
+        'Yes' => 'Ja',
+      },
+    },
+   'DeviceAttributes' => 'Apparaateigenschappen',
+   'DeviceManufacturer' => 'Apparaatproducent',
+   'DeviceMfgDesc' => 'Apparaatproducent kenmerk',
+   'DeviceModel' => 'Apparaatmodel',
+   'DeviceModelDesc' => 'Apparaatmodel kenmerk',
+   'DeviceSettingDescription' => 'Toestelinstellingen',
+   'DialDirectionTvAv' => {
+      PrintConv => {
+        'Normal' => 'Normaal',
+      },
+    },
+   'DigitalCreationDate' => 'Digitale opnamedatum',
+   'DigitalCreationTime' => 'Digitaal opnametijdstip',
+   'DigitalZoom' => {
+      Description => 'Digitaal zoomen',
+      PrintConv => {
+        'None' => 'Geen',
+        'Off' => 'Uit',
+      },
+    },
+   'DigitalZoomOn' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'DigitalZoomRatio' => 'Digitale zoom factor',
+   'Directory' => 'Plaats van het bestand',
+   'DisplaySize' => {
+      PrintConv => {
+        'Normal' => 'Normaal',
+      },
+    },
+   'DisplayXResolutionUnit' => {
+      PrintConv => {
+        'um' => 'Âµm (micrometer)',
+      },
+    },
+   'DisplayYResolutionUnit' => {
+      PrintConv => {
+        'um' => 'Âµm (micrometer)',
+      },
+    },
+   'DistortionCorrection' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'DistortionCorrection2' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'DjVuVersion' => 'DjVu versie',
+   'DocumentHistory' => 'Documentgeschiedenis',
+   'DocumentName' => 'Document naam',
+   'DocumentNotes' => 'Documentopmerkingen',
+   'DriveMode' => {
+      Description => 'Ontspannermodus',
+      PrintConv => {
+        'Continuous' => 'Continu',
+        'Continuous Shooting' => 'Continu',
+        'Off' => 'Uit',
+        'Self-timer' => 'Zelfontspanner',
+        'Self-timer Operation' => 'Zelfontspanner',
+        'Single' => 'Enkel beeld',
+        'Single Frame' => 'Enkel beeld',
+        'Single Shot' => 'Enkel beeld',
+        'Single-frame Shooting' => 'Enkel beeld',
+      },
+    },
+   'DynamicAFArea' => {
+      Description => 'Dynamisch AF-veld',
+      PrintConv => {
+        '21 Points' => '21 punten',
+        '51 Points' => '51 punten',
+        '51 Points (3D-tracking)' => '51 punten (3D-tracking)',
+        '9 Points' => '9 punten',
+      },
+    },
+   'DynamicRange' => {
+      PrintConv => {
+        'Standard' => 'Standaard',
+      },
+    },
+   'DynamicRangeExpansion' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'DynamicRangeOptimizer' => {
+      Description => 'Dyn.-bereikoptim',
+      PrintConv => {
+        'Advanced Auto' => 'Geavancrd Auto',
+        'Advanced Lv1' => 'Geavanceerd-1',
+        'Advanced Lv2' => 'Geavanceerd-2',
+        'Advanced Lv3' => 'Geavanceerd-3',
+        'Advanced Lv4' => 'Geavanceerd-4',
+        'Advanced Lv5' => 'Geavanceerd-5',
+        'Auto' => 'Automatisch',
+        'Off' => 'Uit',
+        'Standard' => 'Standaard',
+      },
+    },
+   'ETTLII' => {
+      PrintConv => {
+        'Average' => 'Gemiddeld',
+      },
+    },
+   'EVStepSize' => {
+      Description => 'LW stapgrootte',
+      PrintConv => {
+        '1/2 EV' => '1/2 stop',
+        '1/3 EV' => '1/3 stop',
+      },
+    },
+   'EasyExposureCompensation' => {
+      Description => 'Eenv. belichtingscorrectie',
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+        'On (auto reset)' => 'Aan (autoherstel)',
+      },
+    },
+   'EasyMode' => {
+      PrintConv => {
+        'Landscape' => 'Landschap',
+        'Manual' => 'Handmatig',
+        'Night' => 'Nachtszene',
+        'Portrait' => 'Portret',
+      },
+    },
+   'EdgeNoiseReduction' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'EditStatus' => 'Bewerkingsstatus',
+   'EditorialUpdate' => {
+      Description => 'Redactionele bewerking',
+      PrintConv => {
+        'Additional language' => 'Extra taal',
+      },
+    },
+   'Emphasis' => {
+      PrintConv => {
+        'None' => 'Geen',
+      },
+    },
+   'EnhanceDarkTones' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'Enhancement' => {
+      PrintConv => {
+        'Off' => 'Uit',
+      },
+    },
+   'EnvelopeNumber' => 'Basisdatanummer',
+   'EnvelopePriority' => {
+      Description => 'Prioriteit',
+      PrintConv => {
+        '0 (reserved)' => '0 (Gereserveerd voor toekomstig gebruik)',
+        '1 (most urgent)' => '1 (Meest belangrijk)',
+        '5 (normal urgency)' => '5 (Normaal)',
+        '8 (least urgent)' => '8 (Minst belangrijk)',
+        '9 (user-defined priority)' => '9 (Door gebruiker aangegeven prioriteit)',
+      },
+    },
+   'EnvelopeRecordVersion' => 'Recordversie',
+   'ExifCameraInfo' => 'Exif Camera-informatie',
+   'ExifImageHeight' => 'Afbeelding hoogte',
+   'ExifImageWidth' => 'Afbeelding breedte',
+   'ExifOffset' => 'Exif IFD-wijzer',
+   'ExifToolVersion' => 'ExifTool versie',
+   'ExifVersion' => 'Exif versie',
+   'ExpandFilm' => 'Breid film uit',
+   'ExpandFilterLens' => 'Breid filterlens uit',
+   'ExpandFlashLamp' => 'Breid flitser uit',
+   'ExpandLens' => 'Breid objectief',
+   'ExpandScanner' => 'Breid scanner uit',
+   'ExpandSoftware' => 'Breid software uit',
+   'ExpirationDate' => 'Verloopdatum',
+   'ExpirationTime' => 'Verlooptijdstip',
+   'ExposureCompStepSize' => {
+      Description => 'Stapgrootte belichtingscorr.',
+      PrintConv => {
+        '1 EV' => '1 stop',
+        '1/2 EV' => '1/2 stop',
+        '1/3 EV' => '1/3 stop',
+      },
+    },
+   'ExposureCompensation' => 'Belichtingscorrectie',
+   'ExposureControlStepSize' => {
+      Description => 'Stapgrootte inst. belichting',
+      PrintConv => {
+        '1 EV' => '1 stop',
+        '1/2 EV' => '1/2 stop',
+        '1/3 EV' => '1/3 stop',
+      },
+    },
+   'ExposureDelayMode' => {
+      Description => 'Spiegelvoorontspanning',
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'ExposureIndex' => 'Belichtingsindex',
+   'ExposureLevelIncrements' => {
+      Description => 'Stapgrootte inst. belichting',
+      PrintConv => {
+        '1/2 Stop' => '1/2 stop',
+        '1/3 Stop' => '1/3 stop',
+      },
+    },
+   'ExposureMode' => {
+      Description => 'Belichting modus',
+      PrintConv => {
+        'Aperture Priority' => 'Diafragmaprioriteit',
+        'Aperture-priority AE' => 'Diafragmaprioriteit',
+        'Auto' => 'Automatische belichting',
+        'Auto bracket' => 'Belichting serie',
+        'Landscape' => 'Landschap',
+        'Manual' => 'Handmatige belichting',
+        'Portrait' => 'Portret',
+        'Shutter Priority' => 'Sluiterprioriteit',
+        'Shutter speed priority AE' => 'Sluiterprioriteit',
+      },
+    },
+   'ExposureModeInManual' => {
+      PrintConv => {
+        'Center-weighted average' => 'Centrum gemiddelde',
+        'Partial metering' => 'Gedeelte',
+      },
+    },
+   'ExposureProgram' => {
+      Description => 'Belichtingsprogramma',
+      PrintConv => {
+        'Action (High speed)' => 'Actie programma (georiÃ«nteerd op snelle sluitertijden)',
+        'Aperture Priority' => 'Diafragmaprioriteit',
+        'Aperture-priority AE' => 'Diafragmaprioriteit',
+        'Creative (Slow speed)' => 'Creatief programma (georiÃ«nteerd op scherptediepte)',
+        'Landscape' => 'Landschap modus',
+        'Manual' => 'Handmatig',
+        'Not Defined' => 'Niet gedefinieerd',
+        'Portrait' => 'Portret modus',
+        'Program AE' => 'Normaal programma',
+        'Shutter Priority' => 'Sluiterprioriteit',
+        'Shutter speed priority AE' => 'Sluiterprioriteit',
+      },
+    },
+   'ExposureTime' => 'Belichtingstijd',
+   'ExposureTime2' => 'Belichtingstijd 2',
+   'ExtendedWBDetect' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'ExternalFlash' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'ExternalFlashBounce' => {
+      PrintConv => {
+        'No' => 'Nee',
+        'Yes' => 'Ja',
+      },
+    },
+   'ExternalFlashMode' => {
+      PrintConv => {
+        'Off' => 'Uit',
+      },
+    },
+   'ExtraSamples' => 'Extra componenten',
+   'FNumber' => 'F waarde',
+   'FastSeek' => {
+      PrintConv => {
+        'No' => 'Nee',
+        'Yes' => 'Ja',
+      },
+    },
+   'FaxProfile' => {
+      PrintConv => {
+        'Unknown' => 'Onbekend',
+      },
+    },
+   'FaxRecvParams' => 'Fax ontvangst parameters',
+   'FaxRecvTime' => 'Fax ontvangst tijd',
+   'FaxSubAddress' => 'Fax sub adres',
+   'FileFormat' => 'Fileformaat',
+   'FileModifyDate' => 'Datum actualisering',
+   'FileName' => 'Bestandnaam',
+   'FileNumberMemory' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'FileNumberSequence' => {
+      Description => 'Opeenvolgende nummering',
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'FileSize' => 'Bestandgrootte',
+   'FileSource' => {
+      Description => 'Bestand bron',
+      PrintConv => {
+        'Digital Camera' => 'Digitale camera',
+        'Film Scanner' => 'Film scanner',
+        'Reflection Print Scanner' => 'Scanner',
+      },
+    },
+   'FileType' => 'Bestandtype',
+   'FileVersion' => 'Fileformaat versie',
+   'FillOrder' => {
+      Description => 'Vul volgorde',
+      PrintConv => {
+        'Normal' => 'Normaal',
+      },
+    },
+   'Filter' => {
+      PrintConv => {
+        'Off' => 'Uit',
+      },
+    },
+   'FilterEffect' => {
+      PrintConv => {
+        'None' => 'Geen',
+        'Off' => 'Uit',
+      },
+    },
+   'FilterEffectMonochrome' => {
+      PrintConv => {
+        'None' => 'Geen',
+      },
+    },
+   'FinderDisplayDuringExposure' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'FineTuneOptCenterWeighted' => 'Fijnafst. voor opt. belichting Centrumgericht',
+   'FineTuneOptMatrixMetering' => 'Fijnafst. voor opt. belichting Matrixmeting',
+   'FineTuneOptSpotMetering' => 'Fijnafst. voor opt. belichting Spotmeting',
+   'FixtureIdentifier' => 'Kenmerk',
+   'Flash' => {
+      Description => 'Flits',
+      PrintConv => {
+        'Auto, Did not fire' => 'Flits werd niet ontstoken, automodus',
+        'Auto, Did not fire, Red-eye reduction' => 'Flits werd niet ontstoken, rode ogen reductie',
+        'Auto, Fired' => 'Flits werd ontstoken, automodus',
+        'Auto, Fired, Red-eye reduction' => 'Flits werd ontstoken, automodus, rode ogen reductie',
+        'Auto, Fired, Red-eye reduction, Return detected' => 'Flits werd ontstoken, automodus, gereflecteerd flitslicht, rode ogen reductie',
+        'Auto, Fired, Red-eye reduction, Return not detected' => 'Flits werd ontstoken, automodus, geen gereflecteerd flitslicht, rode ogen reductie',
+        'Auto, Fired, Return detected' => 'Flits werd ontstoken, automodus, gereflecteerd flitslicht',
+        'Auto, Fired, Return not detected' => 'Flits werd ontstoken, automodus, geen gereflecteerd flitslicht',
+        'Did not fire' => 'Geen flits',
+        'Fired' => 'Flits afgevuurd',
+        'Fired, Red-eye reduction' => 'Flits werd ontstoken, Rode ogen reductie',
+        'Fired, Red-eye reduction, Return detected' => 'Flits werd ontstoken, rode ogen reductie, gereflecteerd flitslicht',
+        'Fired, Red-eye reduction, Return not detected' => 'Flits werd ontstoken, rode oen reductie, geen gereflecteerd flitslicht',
+        'Fired, Return detected' => 'Gereflecteerd flitslicht gedetecteerd',
+        'Fired, Return not detected' => 'Geen gereflecteerd flitslicht gedetecteerd',
+        'No Flash' => 'Geen flits',
+        'No flash function' => 'Geen flits functie',
+        'Off' => 'Uit',
+        'Off, Did not fire' => 'Flits werd niet ontstoken, flits onderdruk modus',
+        'Off, Did not fire, Return not detected' => 'Gedeactiveerd, flits werd niet ontstoken, geen gereflecteerd flitslicht',
+        'Off, No flash function' => 'Gedeactiveerd, geen flits functie',
+        'Off, Red-eye reduction' => 'Gedeactiveerd, rode ogen reductie',
+        'On' => 'Aan',
+        'On, Did not fire' => 'Aan, flits werd niet ontstoken',
+        'On, Fired' => 'Flits werd ontstoken, flits afdwing modus',
+        'On, Red-eye reduction' => 'Flits werd ontstoken, flits afdwing modus, rode ogen reductie',
+        'On, Red-eye reduction, Return detected' => 'Flits werd ontstoken, flits afdwing modus, rode ogen reductie, gereflecteerd flitslicht',
+        'On, Red-eye reduction, Return not detected' => 'Flits werd ontstoken, flits afdwing modus, rode ogen reductie, geen gereflecteerd flitslicht',
+        'On, Return detected' => 'Flits werd ontstoken, flits afdwing modus, gereflecteerd flitslicht gedetecteerd',
+        'On, Return not detected' => 'Flits werd ontstoken, flits afdwing modus, geen gereflecteerd flitslicht gedetecteerd',
+      },
+    },
+   'FlashCommanderMode' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'FlashCompensation' => 'Flitscorrectie',
+   'FlashControlMode' => {
+      PrintConv => {
+        'Manual' => 'Handmatig',
+        'Off' => 'Uit',
+        'Repeating Flash' => 'Stroboscopisch flitsen',
+      },
+    },
+   'FlashDevice' => {
+      PrintConv => {
+        'None' => 'Geen',
+      },
+    },
+   'FlashEnergy' => 'Flits energie',
+   'FlashExposureComp' => 'Flitscompensatie',
+   'FlashExposureLock' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'FlashFired' => {
+      PrintConv => {
+        'No' => 'Nee',
+        'Yes' => 'Ja',
+      },
+    },
+   'FlashGroupAControlMode' => {
+      PrintConv => {
+        'Manual' => 'Handmatig',
+        'Off' => 'Uit',
+        'Repeating Flash' => 'Stroboscopisch flitsen',
+      },
+    },
+   'FlashGroupBControlMode' => {
+      PrintConv => {
+        'Manual' => 'Handmatig',
+        'Off' => 'Uit',
+        'Repeating Flash' => 'Stroboscopisch flitsen',
+      },
+    },
+   'FlashGroupCControlMode' => {
+      PrintConv => {
+        'Manual' => 'Handmatig',
+        'Off' => 'Uit',
+        'Repeating Flash' => 'Stroboscopisch flitsen',
+      },
+    },
+   'FlashIntensity' => {
+      PrintConv => {
+        'High' => 'Hoog',
+        'Normal' => 'Normaal',
+      },
+    },
+   'FlashLevel' => 'Flitscorrectie',
+   'FlashMode' => {
+      PrintConv => {
+        'Auto' => 'Automatisch',
+        'Normal' => 'Normaal',
+        'Off' => 'Uit',
+        'On' => 'Aan',
+        'Unknown' => 'Onbekend',
+      },
+    },
+   'FlashModel' => {
+      PrintConv => {
+        'None' => 'Geen',
+      },
+    },
+   'FlashOptions' => {
+      PrintConv => {
+        'Auto' => 'Automatisch',
+        'Normal' => 'Normaal',
+      },
+    },
+   'FlashOptions2' => {
+      PrintConv => {
+        'Auto' => 'Automatisch',
+        'Normal' => 'Normaal',
+      },
+    },
+   'FlashShutterSpeed' => 'Langste sluitertijd bij flits',
+   'FlashStatus' => {
+      PrintConv => {
+        'Off' => 'Uit',
+      },
+    },
+   'FlashSyncSpeed' => 'Flitssynchronisatie snelheid',
+   'FlashSyncSpeedAv' => {
+      PrintConv => {
+        'Auto' => 'Automatisch',
+      },
+    },
+   'FlashType' => {
+      PrintConv => {
+        'None' => 'Geen',
+      },
+    },
+   'FlashWarning' => {
+      Description => 'Flitswaarschuwing',
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'FlashpixVersion' => 'Ondersteunde Flashpix versie',
+   'FlickerReduce' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'FlipHorizontal' => {
+      PrintConv => {
+        'No' => 'Nee',
+        'Yes' => 'Ja',
+      },
+    },
+   'FocalLength' => 'Brandpuntafstand',
+   'FocalLength35efl' => 'Brandpuntafstand',
+   'FocalLengthIn35mmFormat' => 'Brandpuntafstand in 35 mm kleinbeeld formaat',
+   'FocalPlaneResolutionUnit' => {
+      Description => 'Sensor resolutie eenheid',
+      PrintConv => {
+        'None' => 'Geen',
+        'inches' => 'inch',
+        'um' => 'Âµm (micrometer)',
+      },
+    },
+   'FocalPlaneXResolution' => 'Horizontale sensor resolutie',
+   'FocalPlaneYResolution' => 'Verticale sensor resolutie',
+   'Focus' => {
+      Description => 'Scherpstelling',
+      PrintConv => {
+        'Manual' => 'Handmatig',
+      },
+    },
+   'FocusArea' => 'Scherpstelveld',
+   'FocusAreaSelection' => {
+      Description => 'Doorloop scherpstelpunt',
+      PrintConv => {
+        'No Wrap' => 'Geen doorloop',
+        'Wrap' => 'Doorloop',
+      },
+    },
+   'FocusContinuous' => {
+      PrintConv => {
+        'Continuous' => 'Continu',
+        'Manual' => 'Handmatig',
+      },
+    },
+   'FocusMode' => {
+      Description => 'Focus modus',
+      PrintConv => {
+        'Auto' => 'Automatisch',
+        'Continuous' => 'Continu',
+        'Manual' => 'Handmatig',
+        'Normal' => 'Normaal',
+      },
+    },
+   'FocusMode2' => {
+      PrintConv => {
+        'Manual' => 'Handmatig',
+      },
+    },
+   'FocusModeSetting' => {
+      Description => 'Scherpstelstand',
+      PrintConv => {
+        'AF-A' => 'Automatische AF',
+        'AF-C' => 'Continue AF',
+        'AF-S' => 'Enkelvoudige AF',
+        'Manual' => 'Handmatig',
+      },
+    },
+   'FocusPointWrap' => {
+      Description => 'Doorloop scherpstelpunt',
+      PrintConv => {
+        'No Wrap' => 'Geen doorloop',
+        'Wrap' => 'Doorloop',
+      },
+    },
+   'FocusRange' => {
+      PrintConv => {
+        'Auto' => 'Automatisch',
+        'Manual' => 'Handmatig',
+        'Normal' => 'Normaal',
+      },
+    },
+   'FocusTrackingLockOn' => {
+      Description => 'Focus Tracking met Lock-On',
+      PrintConv => {
+        'Long' => 'Lang',
+        'Normal' => 'Normaal',
+        'Off' => 'Uit',
+        'Short' => 'Kort',
+      },
+    },
+   'FrameRate' => 'Beeldwisselsnelheid',
+   'FrameSize' => 'Beeldformaat',
+   'FreeByteCounts' => 'Aantal bytes van het lege databereik',
+   'FreeOffsets' => 'Vrije data posities',
+   'FujiFlashMode' => {
+      PrintConv => {
+        'Auto' => 'Automatisch',
+      },
+    },
+   'FunctionButton' => {
+      Description => 'FUNC. knop',
+      PrintConv => {
+        'AF-area Mode' => 'AF-veldstand',
+        'Center AF Area' => 'Centrale AF-veld',
+        'Center-weighted' => 'Centrumgericht',
+        'FV Lock' => 'FV-vergrendeling',
+        'Flash Off' => 'Flitser uit',
+        'Framing Grid' => 'Rasterweergave',
+        'ISO Display' => 'ISO-weergave',
+        'Matrix Metering' => 'Matrixmeting',
+        'Spot Metering' => 'Spotmeting',
+      },
+    },
+   'GIFVersion' => 'GIF versie',
+   'GPSAltitude' => 'Hoogte',
+   'GPSAltitudeRef' => {
+      Description => 'Hoogte referentie',
+      PrintConv => {
+        'Above Sea Level' => 'Zee spiegel',
+        'Below Sea Level' => 'Zee spiegel referentie (negatieve waarde)',
+      },
+    },
+   'GPSAreaInformation' => 'Naam van het GPS gebied',
+   'GPSDOP' => 'Meet nauwkeurigheid',
+   'GPSDateStamp' => 'GPS datum',
+   'GPSDateTime' => 'GPS tijd (atoomklok)',
+   'GPSDestBearing' => 'Motiefrichting',
+   'GPSDestBearingRef' => {
+      Description => 'Referentie voor de motiefrichting',
+      PrintConv => {
+        'Magnetic North' => 'Magnetische uitrichting',
+        'True North' => 'Geografische uitrichting',
+      },
+    },
+   'GPSDestDistance' => 'Afstand tot bestemming',
+   'GPSDestDistanceRef' => {
+      Description => 'Referentie voor de afstand tot de bestemming',
+      PrintConv => {
+        'Miles' => 'Meilen',
+        'Nautical Miles' => 'Knopen',
+      },
+    },
+   'GPSDestLatitude' => 'Breedte van het doel',
+   'GPSDestLatitudeRef' => {
+      Description => 'Referentie voor de breedte van het doel',
+      PrintConv => {
+        'North' => 'Nordelijke breedte',
+        'South' => 'Zuidelijke breedte',
+      },
+    },
+   'GPSDestLongitude' => 'Lengtegraad van het doel',
+   'GPSDestLongitudeRef' => {
+      Description => 'Referentie voor de lengte van het doel',
+      PrintConv => {
+        'East' => 'Oostelijke lengte',
+        'West' => 'Westlijke Lengte',
+      },
+    },
+   'GPSDifferential' => {
+      Description => 'GPS differentiaal correctie',
+      PrintConv => {
+        'Differential Corrected' => 'Differentiaal correctie toegepast',
+        'No Correction' => 'Meting zonder differentiaal correctie',
+      },
+    },
+   'GPSImgDirection' => 'Richting van de afbeelding',
+   'GPSImgDirectionRef' => {
+      Description => 'Referentie voor de uitrichting van de afbeelding',
+      PrintConv => {
+        'Magnetic North' => 'Magnetische uitrichting',
+        'True North' => 'Geografische uitrichting',
+      },
+    },
+   'GPSInfo' => 'GPS Info IFD-wijzer',
+   'GPSLatitude' => 'Breedte graad',
+   'GPSLatitudeRef' => {
+      Description => 'Noord. of zuid. breedte',
+      PrintConv => {
+        'North' => 'Noordelijke breedte',
+        'South' => 'Zuidlijke breedte',
+      },
+    },
+   'GPSLongitude' => 'Geografische lengte',
+   'GPSLongitudeRef' => {
+      Description => 'Oost. of west. lengte',
+      PrintConv => {
+        'East' => 'Oostlijke lengte',
+        'West' => 'Westlijke lengte',
+      },
+    },
+   'GPSMapDatum' => 'Geodatische datum',
+   'GPSMeasureMode' => {
+      Description => 'GPS meet methode',
+      PrintConv => {
+        '2-D' => '2 dimensionale meting',
+        '2-Dimensional' => '2 dimensionale meting',
+        '2-Dimensional Measurement' => '2 dimensionale meting',
+        '3-D' => '3 dimensionale meting',
+        '3-Dimensional' => '3 dimensionale meting',
+        '3-Dimensional Measurement' => '3 dimensionale meting',
+      },
+    },
+   'GPSProcessingMethod' => 'Naam van de GPS verwerk methode',
+   'GPSSatellites' => 'Voor de meting gebruikte satellieten',
+   'GPSSpeed' => 'Snelheid van de GPS ontvanger',
+   'GPSSpeedRef' => {
+      Description => 'Snelheids eenheid',
+      PrintConv => {
+        'km/h' => 'Kilometer per uur',
+        'knots' => 'Knopen',
+        'mph' => 'Meilen per uur',
+      },
+    },
+   'GPSStatus' => {
+      Description => 'GPS ontvanger status',
+      PrintConv => {
+        'Measurement Active' => 'Meting loopt',
+        'Measurement Void' => 'Interoperabiliteit voor metingen',
+      },
+    },
+   'GPSTimeStamp' => 'GPS tijd (atoomklok)',
+   'GPSTrack' => 'Bewegingsrichting',
+   'GPSTrackRef' => {
+      Description => 'Referentie voor de bewegingsrichting',
+      PrintConv => {
+        'Magnetic North' => 'Magnetische uitrichting',
+        'True North' => 'Geographische uitrichting',
+      },
+    },
+   'GPSVersionID' => 'GPS tag versie',
+   'GainControl' => {
+      Description => 'Belichtingsversterking',
+      PrintConv => {
+        'High gain down' => 'Hoge helderheidsverminderring',
+        'High gain up' => 'Hoge helderheidsvesterking',
+        'Low gain down' => 'Kleine helderheidsverminderring',
+        'Low gain up' => 'Kleine helderheidsvesterking',
+        'None' => 'Geen',
+      },
+    },
+   'Gapless' => {
+      PrintConv => {
+        'No' => 'Nee',
+        'Yes' => 'Ja',
+      },
+    },
+   'Gradation' => 'Levendig',
+   'GrayResponseUnit' => {
+      PrintConv => {
+        '0.0001' => 'Nummer stelt een 1000ste van een eenheid voor',
+        '0.001' => 'Nummer stelt een 100ste van een eenheid voor',
+        '0.1' => 'Nummer stelt een 10de van een eenheid voor',
+        '1e-05' => 'Nummer stelt een 10000ste van een eenheid voor',
+        '1e-06' => 'Nummer stelt een 100000ste van een eenheid voor',
+      },
+    },
+   'GrayTRC' => 'Grijze toon reproductie curve',
+   'GreenMatrixColumn' => 'Groene matrixkolom',
+   'GreenTRC' => 'Groene toon reproductie curve',
+   'GridDisplay' => {
+      Description => 'Rasterweergave in zoeker',
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'HDR' => {
+      Description => 'Auto HDR',
+      PrintConv => {
+        'Off' => 'Uit',
+      },
+    },
+   'Headline' => 'Opschrift',
+   'HeightResolution' => 'Beeldresolutie verticaal',
+   'HighISONoiseReduction' => {
+      Description => 'NR bij hoge-ISO',
+      PrintConv => {
+        'Auto' => 'Automatisch',
+        'High' => 'Hi',
+        'Low' => 'Laag',
+        'Normal' => 'Normaal',
+        'Off' => 'Uit',
+        'On' => 'Aan',
+        'Standard' => 'Standaard',
+      },
+    },
+   'HighlightTonePriority' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'HometownDST' => {
+      PrintConv => {
+        'No' => 'Nee',
+        'Yes' => 'Ja',
+      },
+    },
+   'Hue' => 'Kleurtoon',
+   'IPTC-NAA' => 'IPTC-NAA metadata',
+   'ISO' => 'ISO gevoeligheid',
+   'ISODisplay' => 'ISO-weergave',
+   'ISOExpansion' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'ISOExpansion2' => {
+      PrintConv => {
+        'Off' => 'Uit',
+      },
+    },
+   'ISOSetting' => {
+      PrintConv => {
+        'Auto' => 'Automatisch',
+        'Manual' => 'Handmatig',
+      },
+    },
+   'ISOSpeedExpansion' => {
+      PrintConv => {
+        'No' => 'Nee',
+        'Yes' => 'Ja',
+      },
+    },
+   'ISOSpeedIncrements' => {
+      Description => 'ISO-stapgrootte',
+      PrintConv => {
+        '1 Stop' => '1 stop',
+        '1/3 Stop' => '1/3 stop',
+      },
+    },
+   'ISOStepSize' => {
+      Description => 'ISO-stapgrootte',
+      PrintConv => {
+        '1 EV' => '1 stop',
+        '1/2 EV' => '1/2 stop',
+        '1/3 EV' => '1/3 stop',
+      },
+    },
+   'Illumination' => {
+      Description => 'Verlichting',
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'ImageAuthentication' => {
+      PrintConv => {
+        'Off' => 'Uit',
+      },
+    },
+   'ImageByteCount' => 'Aantal beeldgegevens in bytes',
+   'ImageColorIndicator' => 'Afbeelding kleur indicator',
+   'ImageColorValue' => 'Afbeelding kleur waarde',
+   'ImageDataDiscard' => {
+      Description => 'Afgedankte beeldgegevens',
+      PrintConv => {
+        'Flexbits Discarded' => 'Afgedankte flexbits',
+        'Full Resolution' => 'Volledige resolutie',
+        'HighPass Frequency Data Discarded' => 'Afgedankte hoogdoorlaat frequentiegegevens',
+        'Highpass and LowPass Frequency Data Discarded' => 'Afgedankte hoogdoorlaat en laagdoorlaat frequentiegegevens',
+      },
+    },
+   'ImageDescription' => 'Afbeelding beschrijving',
+   'ImageDustOff' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'ImageHeight' => 'Afbeeldingshoogte',
+   'ImageHistory' => 'Afbeelding geschiedenis',
+   'ImageNumber' => 'Afbeelding nummer',
+   'ImageOffset' => 'Beeldverplaatsing',
+   'ImageOrientation' => {
+      Description => 'Foto oriÃ«ntatie',
+      PrintConv => {
+        'Landscape' => 'Landschap',
+        'Portrait' => 'Portret',
+        'Square' => 'Vierkant',
+      },
+    },
+   'ImageQuality' => {
+      Description => 'Bldkwaliteit',
+      PrintConv => {
+        'High' => 'Hoog',
+        'Normal' => 'Normaal',
+      },
+    },
+   'ImageQuality2' => 'Bldkwaliteit 2',
+   'ImageReview' => {
+      Description => 'Beeld terugspelen',
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'ImageReviewTime' => 'Timers uit Beeld terugspelen',
+   'ImageRotated' => {
+      PrintConv => {
+        'No' => 'Nee',
+        'Yes' => 'Ja',
+      },
+    },
+   'ImageSize' => 'Beeldformaat',
+   'ImageStabilization' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'ImageTone' => {
+      PrintConv => {
+        'Landscape' => 'Landschap',
+        'Portrait' => 'Portret',
+      },
+    },
+   'ImageType' => 'Beeldtype',
+   'ImageUniqueID' => 'Uniek afbeeldings ID',
+   'ImageWidth' => 'Afbeeldingsbreedte',
+   'InitialZoomSetting' => {
+      Description => 'Aanvankelijke zoominstelling',
+      PrintConv => {
+        'High Magnification' => 'Hoge zoom',
+        'Low Magnification' => 'Lage zoom',
+        'Medium Magnification' => 'Gemiddelde zoom',
+      },
+    },
+   'Instructions' => 'Instructies',
+   'IntellectualGenre' => 'Genre',
+   'IntensityStereo' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'InternalFlash' => {
+      Description => 'Flitssturing ingeb. flitser',
+      PrintConv => {
+        'Commander Mode' => 'Commanderstand',
+        'Fired' => 'Flits afgevuurd',
+        'Manual' => 'Handmatig',
+        'No' => 'Geen flits',
+        'Off' => 'Uit',
+        'On' => 'Aan',
+        'Repeating Flash' => 'Stroboscopisch flitsen',
+        'TTL' => 'DDL',
+      },
+    },
+   'InternalFlashMode' => {
+      PrintConv => {
+        'On' => 'Aan',
+      },
+    },
+   'InteropIndex' => {
+      Description => 'Interoperabiliteits Identificatie',
+      PrintConv => {
+        'R03 - DCF option file (Adobe RGB)' => 'R03: DCF Optie formaat (Adobe RGB)',
+        'R98 - DCF basic file (sRGB)' => 'R98: DCF Basis formaat (sRGB)',
+        'THM - DCF thumbnail file' => 'THM: DCF Miniatuur formaat',
+      },
+    },
+   'InteropOffset' => 'Interoperabiliteit-tag',
+   'InteropVersion' => 'Interoperabiliteits versie',
+   'JFIFVersion' => 'JFIF versie',
+   'JobID' => 'ID van baan',
+   'Keyword' => 'Trefwoorden',
+   'Keywords' => 'Trefwoord',
+   'LCDIllumination' => {
+      Description => 'LCD-verlichting',
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'LCDIlluminationDuringBulb' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'LCHEditor' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'LanguageIdentifier' => 'Taalherkenning',
+   'Lens' => 'Objectief',
+   'LensInfo' => 'Lensgegevens',
+   'LicenseType' => {
+      PrintConv => {
+        'Unknown' => 'Onbekend',
+      },
+    },
+   'LightSource' => {
+      Description => 'Lichtbron',
+      PrintConv => {
+        'Cloudy' => 'Bewolkt',
+        'Cool White Fluorescent' => 'Koel wit TL-licht',
+        'Day White Fluorescent' => 'Daglicht wit TL-licht',
+        'Daylight' => 'Daglicht',
+        'Daylight Fluorescent' => 'Daglicht TL-licht',
+        'Fine Weather' => 'Onbewolkt',
+        'Flash' => 'Flits',
+        'Fluorescent' => 'Fluoresceren',
+        'ISO Studio Tungsten' => 'ISO studio kunstlicht (gloeilamp)',
+        'Other' => 'Andere lichtbron',
+        'Shade' => 'Schaduw',
+        'Standard Light A' => 'Standaard licht A',
+        'Standard Light B' => 'Standaard licht B',
+        'Standard Light C' => 'Standaard licht C',
+        'Tungsten (Incandescent)' => 'Kunstlicht (gloeilamp)',
+        'Unknown' => 'Onbekend',
+        'Warm White Fluorescent' => 'Warm wit TL-licht',
+        'White Fluorescent' => 'Wit TL-licht',
+      },
+    },
+   'LightSourceSpecial' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'Lightness' => 'Helderheid',
+   'Lit' => {
+      PrintConv => {
+        'No' => 'Nee',
+        'Yes' => 'Ja',
+      },
+    },
+   'LiveViewShooting' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'Location' => 'Lokatie',
+   'LongExposureNoiseReduction' => {
+      Description => 'NR lang-belicht',
+      PrintConv => {
+        'Auto' => 'Automatisch',
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'LoopStyle' => {
+      PrintConv => {
+        'Normal' => 'Normaal',
+      },
+    },
+   'LuminanceNoiseReduction' => {
+      PrintConv => {
+        'High' => 'Hoog',
+        'Low' => 'Laag',
+        'Off' => 'Uit',
+      },
+    },
+   'MB-D10Batteries' => 'MB-D10 batterijen',
+   'MB-D80Batteries' => 'MB-D80 batterijen',
+   'MIEVersion' => 'MIE versie',
+   'MSStereo' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'Macro' => {
+      PrintConv => {
+        'Manual' => 'Handmatig',
+        'Normal' => 'Normaal',
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'MacroMode' => {
+      PrintConv => {
+        'Normal' => 'Normaal',
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'MainDialExposureComp' => {
+      Description => 'Main Dial Belichtingscorrectie',
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'Make' => 'Fabrikant',
+   'MakeAndModel' => 'Producent en model',
+   'MakerNote' => 'Fabrikant informatie',
+   'MakerNotes' => 'Wenken van de fabrikant',
+   'ManualFlashOutput' => {
+      Description => 'Ingebouwde flitser Handmatig Sterkte',
+      PrintConv => {
+        'Low' => 'Laag',
+      },
+    },
+   'MasterDocumentID' => 'ID van hoofddocument',
+   'MaxAperture' => 'Maximale lensopening',
+   'MaxApertureValue' => 'Grootste diafragma',
+   'MaxContinuousRelease' => 'Max. aant. continuopnamen',
+   'MaxSampleValue' => 'Max sample waarde',
+   'MediaBlackPoint' => 'Media zwartpunt',
+   'MediaType' => {
+      PrintConv => {
+        'Normal' => 'Normaal',
+      },
+    },
+   'MediaWhitePoint' => 'Media Witpunt',
+   'Metering' => {
+      Description => 'Lichtmeting',
+      PrintConv => {
+        'Center-weighted' => 'Centrumgericht',
+        'Matrix' => 'Matrixmeting',
+      },
+    },
+   'MeteringMode' => {
+      Description => 'Belichting meet methode',
+      PrintConv => {
+        'Average' => 'Gemiddeld',
+        'Center-weighted average' => 'Centrum gemiddelde',
+        'Multi-segment' => 'Multi segment',
+        'Multi-spot' => 'MultiSpot',
+        'Other' => 'Andere',
+        'Partial' => 'Gedeelte',
+        'Unknown' => 'Onbekend',
+      },
+    },
+   'MeteringMode2' => {
+      PrintConv => {
+        'Multi-segment' => 'Multi segment',
+      },
+    },
+   'MeteringMode3' => {
+      PrintConv => {
+        'Multi-segment' => 'Multi segment',
+      },
+    },
+   'MeteringTime' => {
+      Description => 'Timers uit Belichtingsmeters',
+      PrintConv => {
+        'No Limit' => 'Altijd aan',
+      },
+    },
+   'MinSampleValue' => 'Min sample waarde',
+   'MinoltaQuality' => {
+      PrintConv => {
+        'Normal' => 'Normaal',
+        'Standard' => 'Standaard',
+      },
+    },
+   'Model' => 'Camera model',
+   'Model2' => 'Camera model (2)',
+   'ModelingFlash' => {
+      Description => 'Instellicht',
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'ModifiedPictureStyle' => {
+      PrintConv => {
+        'Landscape' => 'Landschap',
+        'None' => 'Geen',
+        'Portrait' => 'Portret',
+        'Standard' => 'Standaard',
+      },
+    },
+   'ModifiedSaturation' => {
+      PrintConv => {
+        'Off' => 'Uit',
+      },
+    },
+   'ModifiedSharpnessFreq' => {
+      PrintConv => {
+        'High' => 'Hoog',
+        'Low' => 'Laag',
+        'Standard' => 'Standaard',
+      },
+    },
+   'ModifiedToneCurve' => {
+      PrintConv => {
+        'Manual' => 'Handmatig',
+        'Standard' => 'Standaard',
+      },
+    },
+   'ModifiedWhiteBalance' => {
+      PrintConv => {
+        'Auto' => 'Automatisch',
+        'Cloudy' => 'Bewolkt',
+        'Daylight' => 'Daglicht',
+        'Daylight Fluorescent' => 'Daglicht TL-licht',
+        'Flash' => 'Flits',
+        'Fluorescent' => 'Fluoresceren',
+        'Shade' => 'Schaduw',
+        'Tungsten' => 'Kunstlicht (gloeilamp)',
+      },
+    },
+   'ModifyDate' => 'Datum bestand wijziging',
+   'MoireFilter' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'MonitorOffTime' => 'Monitor uit',
+   'MonochromeFilterEffect' => {
+      PrintConv => {
+        'None' => 'Geen',
+      },
+    },
+   'MonochromeLinear' => {
+      PrintConv => {
+        'No' => 'Nee',
+        'Yes' => 'Ja',
+      },
+    },
+   'MonochromeToningEffect' => {
+      PrintConv => {
+        'None' => 'Geen',
+      },
+    },
+   'MultiExposureAutoGain' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'MultiExposureMode' => {
+      PrintConv => {
+        'Off' => 'Uit',
+      },
+    },
+   'MultiFrameNoiseReduction' => {
+      Description => 'Ruisond. Multi Frame',
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'MultiSelector' => {
+      Description => 'Multi-selector',
+      PrintConv => {
+        'Do Nothing' => 'Doe niets',
+        'Reset Meter-off Delay' => 'Activeer lichtmeter',
+      },
+    },
+   'MultiSelectorPlaybackMode' => {
+      Description => 'Centrale knop multiselector Weergavestand',
+      PrintConv => {
+        'Choose Folder' => 'Map selecteren',
+        'Thumbnail On/Off' => 'Miniatuur aan/uit',
+        'View Histograms' => 'Histogrammen weergeven',
+        'Zoom On/Off' => 'Zoom aan/uit',
+      },
+    },
+   'MultiSelectorShootMode' => {
+      Description => 'Centrale knop multiselector Opnamestand',
+      PrintConv => {
+        'Highlight Active Focus Point' => 'Actieve AF-punt markeren',
+        'Not Used' => 'Geen functie',
+        'Select Center Focus Point' => 'Middelste AF-punt selecteren',
+      },
+    },
+   'MultipleExposureSet' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'Mute' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'MyColorMode' => {
+      PrintConv => {
+        'Off' => 'Uit',
+      },
+    },
+   'NDFilter' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'NEFCompression' => {
+      PrintConv => {
+        'Uncompressed' => 'Niet gecomprimeerd',
+      },
+    },
+   'NikonImageSize' => 'Beeldformaat',
+   'NoMemoryCard' => {
+      Description => 'Geen geheugenkaart',
+      PrintConv => {
+        'Enable Release' => 'Ontgrendel ontspanknop',
+        'Release Locked' => 'Vergrendel ontspanknop',
+      },
+    },
+   'Noise' => 'Ruis',
+   'NoiseFilter' => {
+      PrintConv => {
+        'High' => 'Hoog',
+        'Low' => 'Laag',
+        'Off' => 'Uit',
+        'Standard' => 'Standaard',
+      },
+    },
+   'NoiseReduction' => {
+      Description => 'Ruisreductie',
+      PrintConv => {
+        'Auto' => 'Automatisch',
+        'Normal' => 'Normaal',
+        'Off' => 'Uit',
+        'On' => 'Aan',
+        'Standard' => 'Standaard',
+      },
+    },
+   'ObjectAttributeReference' => 'Intellectuele genre',
+   'ObjectCycle' => {
+      Description => 'Objectcyclus',
+      PrintConv => {
+        'Both Morning and Evening' => 'Beide',
+        'Evening' => 'Avond',
+        'Morning' => 'Ochtend',
+      },
+    },
+   'ObjectFileType' => {
+      PrintConv => {
+        'None' => 'Geen',
+        'Unknown' => 'Onbekend',
+      },
+    },
+   'ObjectName' => 'Titel',
+   'ObjectPreviewData' => 'Voorvertoning objectgegevens',
+   'ObjectPreviewFileFormat' => 'Voorvertoning objectgegevens bestandsformaat',
+   'ObjectPreviewFileVersion' => 'Voorvertoning objectgegevens bestandsformaatversie',
+   'ObjectTypeReference' => 'Referentie van Object type',
+   'OldSubfileType' => 'Subbestand type',
+   'OneTouchWB' => {
+      PrintConv => {
+        'Off' => 'Uit',
+      },
+    },
+   'OpticalZoomMode' => {
+      PrintConv => {
+        'Standard' => 'Standaard',
+      },
+    },
+   'OpticalZoomOn' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'Opto-ElectricConvFactor' => 'Opto elektronische omreken factor',
+   'Orientation' => {
+      Description => 'OriÃ«ntatie van de afbeelding',
+      PrintConv => {
+        'Horizontal (normal)' => '0Â° (boven/links)',
+        'Mirror horizontal' => 'Horizontaal gespiegeld',
+        'Mirror horizontal and rotate 270 CW' => 'Spiegel horizontaal en draai 270Â° met de klok mee',
+        'Mirror horizontal and rotate 90 CW' => 'Spiegel horizontaal en draai 90Â° met de klok mee',
+        'Mirror vertical' => 'Vertikaal gespiegeld',
+        'Rotate 180' => '180Â° (onder/rechts)',
+        'Rotate 270 CW' => 'Draai 270Â° met de klok mee',
+        'Rotate 90 CW' => '90Â° tegen de klok in (rechts/boven)',
+      },
+    },
+   'OriginalTransmissionReference' => 'Werknummer',
+   'OriginatingProgram' => 'Oorspronkelijk programma',
+   'OwnerID' => 'ID van eigenaar',
+   'PEFVersion' => 'PEF versie',
+   'Padding' => 'Plaatshouder',
+   'PageName' => 'Pagina naam',
+   'PageNumber' => 'Pagina nummer',
+   'PhotoEffect' => {
+      PrintConv => {
+        'Off' => 'Uit',
+      },
+    },
+   'PhotoEffects' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'PhotoEffectsType' => {
+      PrintConv => {
+        'None' => 'Geen',
+      },
+    },
+   'PhotoInfoPlayback' => {
+      Description => 'Functie van multi-selector',
+      PrintConv => {
+        'Info Left-right, Playback Up-down' => 'Info <> / Fotoâs',
+        'Info Up-down, Playback Left-right' => 'Info / Fotoâs <>',
+      },
+    },
+   'PhotometricInterpretation' => {
+      Description => 'Pixel schema',
+      PrintConv => {
+        'BlackIsZero' => 'Zwart is nul',
+        'Color Filter Array' => 'CFA (Kleur Filter Matrix)',
+        'Pixar LogL' => 'CIE Log2(L) (Log Luminantie)',
+        'Pixar LogLuv' => 'CIE Log2(L)(u\',v\') (Log Luminantie en Chrominantie)',
+        'RGB Palette' => 'RGB palet',
+        'Transparency Mask' => 'Transparent masker',
+        'WhiteIsZero' => 'Wit is nul',
+      },
+    },
+   'PhotoshopFormat' => {
+      PrintConv => {
+        'Standard' => 'Standaard',
+      },
+    },
+   'PictureControl' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'PictureControlActive' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'PictureFinish' => {
+      PrintConv => {
+        'Portrait' => 'Portret',
+      },
+    },
+   'PictureMode' => {
+      PrintConv => {
+        'Aperture-priority AE' => 'Diafragmaprioriteit',
+        'Auto' => 'Automatisch',
+        'Landscape' => 'Landschap',
+        'Manual' => 'Handmatig',
+        'Portrait' => 'Portret',
+        'Shutter speed priority AE' => 'Sluiterprioriteit',
+        'Standard' => 'Standaard',
+      },
+    },
+   'PictureMode2' => {
+      PrintConv => {
+        'Aperture Priority' => 'Diafragmaprioriteit',
+        'Manual' => 'Handmatig',
+        'Shutter Speed Priority' => 'Sluiterprioriteit',
+      },
+    },
+   'PictureStyle' => {
+      PrintConv => {
+        'Landscape' => 'Landschap',
+        'None' => 'Geen',
+        'Portrait' => 'Portret',
+        'Standard' => 'Standaard',
+      },
+    },
+   'PixelFormat' => 'Pixelformaat',
+   'PixelUnits' => {
+      PrintConv => {
+        'Unknown' => 'Onbekend',
+      },
+    },
+   'PlanarConfiguration' => {
+      Description => 'Afbeelding data arrangement',
+      PrintConv => {
+        'Chunky' => 'Chunky Formaat (Interleaved)',
+        'Planar' => 'Planar Formaat',
+      },
+    },
+   'Predictor' => {
+      PrintConv => {
+        'Horizontal differencing' => 'Horizontale differencering',
+        'None' => 'Geen prodictor schema in gebruik',
+      },
+    },
+   'PreviewColorSpace' => {
+      PrintConv => {
+        'Unknown' => 'Onbekend',
+      },
+    },
+   'PreviewImage' => 'Voorbeeld',
+   'PreviewImageValid' => {
+      PrintConv => {
+        'No' => 'Nee',
+        'Yes' => 'Ja',
+      },
+    },
+   'PreviewQuality' => {
+      PrintConv => {
+        'Normal' => 'Normaal',
+      },
+    },
+   'PrimaryChromaticities' => 'Chromaticiteit van primaire kleuren',
+   'PrimaryPlatform' => 'Primaire platform',
+   'ProcessingSoftware' => 'Verwerkingssoftware',
+   'ProductID' => 'Produkt ID',
+   'ProfileCMMType' => 'Profiel CMM-type',
+   'ProfileClass' => {
+      Description => 'Profielklasse',
+      PrintConv => {
+        'Abstract Profile' => 'Abstractprofiel',
+        'ColorSpace Conversion Profile' => 'Kleurenruimteprofiel',
+        'DeviceLink Profile' => 'Apparaatverbindingsprofiel',
+        'Display Device Profile' => 'Beeldschermapparaatprofiel',
+        'Input Device Profile' => 'Invoerapparaatprofiel',
+        'NamedColor Profile' => 'Genoemd kleurenprofiel',
+        'Nikon Input Device Profile (NON-STANDARD!)' => 'Nikonprofiel ("nkpf")',
+        'Output Device Profile' => 'Uitvoerapparaatprofiel',
+      },
+    },
+   'ProfileConnectionSpace' => 'Profielconnectieruimte',
+   'ProfileCopyright' => 'Profielcopyright',
+   'ProfileCreator' => 'Profielproducent',
+   'ProfileDateTime' => 'Datum 1e aanmaak profiel',
+   'ProfileDescription' => 'Profielbeschrijving',
+   'ProfileDescriptionML' => 'Profielbeschrijving ML',
+   'ProfileFileSignature' => 'Profiel filekenmerk',
+   'ProfileID' => 'Profiel-ID',
+   'ProfileSequenceDesc' => 'Profielvolgorde beschrijving',
+   'ProfileVersion' => 'Profielversie',
+   'ProgramLine' => {
+      PrintConv => {
+        'Normal' => 'Normaal',
+      },
+    },
+   'ProgramMode' => {
+      PrintConv => {
+        'None' => 'Geen',
+        'Portrait' => 'Portret',
+      },
+    },
+   'ProgramVersion' => 'Programmaversie',
+   'Province-State' => 'Provincie',
+   'Quality' => {
+      Description => 'Beeldkwaliteit',
+      PrintConv => {
+        'Compressed RAW' => 'cRAW',
+        'Compressed RAW + JPEG' => 'cRAW+JPEG',
+        'Extra Fine' => 'Extra fijn',
+        'Fine' => 'Fijn',
+        'High' => 'Hoog',
+        'Low' => 'Laag',
+        'Normal' => 'Normaal',
+        'RAW + JPEG' => 'RAW+JPEG',
+        'Standard' => 'Standaard',
+      },
+    },
+   'QualityMode' => {
+      PrintConv => {
+        'Normal' => 'Normaal',
+      },
+    },
+   'QuickShot' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'RAFVersion' => 'RAF versie',
+   'RasterizedCaption' => 'Gerasterde titel',
+   'Rating' => 'Waardering',
+   'RatingPercent' => 'Waardering in procent',
+   'RawDevAutoGradation' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'RawJpgQuality' => {
+      PrintConv => {
+        'Normal' => 'Normaal',
+      },
+    },
+   'RecordMode' => {
+      Description => 'Opnamemodus',
+      PrintConv => {
+        'Aperture Priority' => 'Diafragmaprioriteit',
+        'Manual' => 'Handmatig',
+        'Shutter Priority' => 'Sluiterprioriteit',
+      },
+    },
+   'RecordingMode' => {
+      PrintConv => {
+        'Auto' => 'Automatisch',
+        'Landscape' => 'Landschap',
+        'Manual' => 'Handmatig',
+        'Portrait' => 'Portret',
+      },
+    },
+   'RedEyeCorrection' => {
+      PrintConv => {
+        'Automatic' => 'Automatisch',
+        'Off' => 'Uit',
+      },
+    },
+   'RedEyeReduction' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'RedMatrixColumn' => 'Rode matrixkolom',
+   'RedTRC' => 'Rode toon reproductie curve',
+   'ReferenceBlackWhite' => 'Zwart/wit referentie punten',
+   'ReferenceDate' => 'Referentiedatum',
+   'ReferenceNumber' => 'Referentienummer',
+   'ReferenceService' => 'Referentieservice',
+   'RelatedImageFileFormat' => 'Bestandsformaat van de afbeelding',
+   'RelatedImageHeight' => 'Afbeeldingshoogte',
+   'RelatedImageWidth' => 'Afbeeldingsbreedte',
+   'RelatedSoundFile' => 'Bijbehorend audio bestand',
+   'ReleaseButtonToUseDial' => {
+      Description => 'Knop loslaten voor instelsch.',
+      PrintConv => {
+        'No' => 'Nee',
+        'Yes' => 'Ja',
+      },
+    },
+   'ReleaseDate' => 'Datum van vrijgave',
+   'ReleaseTime' => 'Tijdstip van vrijgave',
+   'RemoteOnDuration' => 'Afstandsbediening',
+   'RenderingIntent' => {
+      Description => 'Rendermethode',
+      PrintConv => {
+        'ICC-Absolute Colorimetric' => 'Absoluut colorimetrisch',
+        'Media-Relative Colorimetric' => 'Relatieve colorimetrisch',
+        'Perceptual' => 'Waarnemend',
+        'Saturation' => 'Verzadiging',
+      },
+    },
+   'RepeatingFlashCount' => 'Stroboscopisch flitsen Aantal',
+   'RepeatingFlashOutput' => 'Stroboscopisch flitsen Sterkte',
+   'RepeatingFlashRate' => 'Stroboscopisch flitsen Freq.',
+   'ResampleParamsQuality' => {
+      PrintConv => {
+        'High' => 'Hoog',
+        'Low' => 'Laag',
+      },
+    },
+   'Resaved' => {
+      PrintConv => {
+        'No' => 'Nee',
+        'Yes' => 'Ja',
+      },
+    },
+   'ResolutionUnit' => {
+      Description => 'Eenheid van de X und Y resolutie',
+      PrintConv => {
+        'None' => 'Geen',
+        'cm' => 'centimeter',
+      },
+    },
+   'RetouchHistory' => {
+      PrintConv => {
+        'None' => 'Geen',
+      },
+    },
+   'ReverseIndicators' => 'Aanduidingen omkeren',
+   'Rotation' => {
+      PrintConv => {
+        'Horizontal' => '0Â° (boven/links)',
+        'Horizontal (Normal)' => '0Â° (boven/links)',
+        'Horizontal (normal)' => '0Â° (boven/links)',
+        'Rotate 180' => '180Â° (onder/rechts)',
+        'Rotate 270 CW' => 'Draai 270Â° met de klok mee',
+        'Rotate 90 CW' => '90Â° tegen de klok in (rechts/boven)',
+        'Rotated 180' => '180Â° (onder/rechts)',
+        'Rotated 270 CW' => 'Draai 270Â° met de klok mee',
+        'Rotated 90 CW' => '90Â° tegen de klok in (rechts/boven)',
+      },
+    },
+   'RowsPerStrip' => 'Aantal lijnen in de afbeelding',
+   'SPIFFVersion' => 'SPIFF versie',
+   'SRActive' => {
+      PrintConv => {
+        'No' => 'Nee',
+        'Yes' => 'Ja',
+      },
+    },
+   'SVGVersion' => 'SVG versie',
+   'SampleFormat' => {
+      Description => 'Sample Formaat',
+      PrintConv => {
+        'Complex int' => 'Complexe integer',
+        'Float' => 'Drijvende komma waarde',
+        'Signed' => 'Integer met voorteken',
+        'Undefined' => 'Niet gedefinierd',
+        'Unsigned' => 'Integer zonder voorteken',
+      },
+    },
+   'SamplesPerPixel' => 'Aantal van de componenten',
+   'Saturation' => {
+      Description => 'Kleurverzadiging',
+      PrintConv => {
+        'High' => 'Hoge kleurvezadiging',
+        'Low' => 'Lage kleurverzadiging',
+        'Normal' => 'Normaal',
+      },
+    },
+   'ScanImageEnhancer' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'SceneCaptureType' => {
+      Description => 'Scene opname type',
+      PrintConv => {
+        'Landscape' => 'Landschap',
+        'Night' => 'Nachtszene',
+        'Portrait' => 'Portret',
+        'Standard' => 'Standaard',
+      },
+    },
+   'SceneMode' => {
+      Description => 'ScÃšnekeuze',
+      PrintConv => {
+        '3D Sweep Panorama' => '3D',
+        'Anti Motion Blur' => 'Anti-bewegingswaas',
+        'Aperture Priority' => 'Diafragmaprioriteit',
+        'Auto' => 'Automatisch',
+        'Cont. Priority AE' => 'Continuvoork. AE',
+        'Handheld Night Shot' => 'Nachtopname uit hand',
+        'Landscape' => 'Landschap',
+        'Manual' => 'Handmatig',
+        'Night Portrait' => 'Nachtportret',
+        'Night Scene' => 'Nacht',
+        'Night View/Portrait' => 'Nacht/portret',
+        'Normal' => 'Normaal',
+        'Off' => 'Uit',
+        'Portrait' => 'Portret',
+        'Shutter Priority' => 'Sluiterprioriteit',
+        'Sports' => 'Sportactie',
+        'Standard' => 'Standaard',
+        'Sunset' => 'Zonsondergang',
+        'Sweep Panorama' => 'Panorama d. beweg.',
+      },
+    },
+   'SceneModeUsed' => {
+      PrintConv => {
+        'Aperture Priority' => 'Diafragmaprioriteit',
+        'Landscape' => 'Landschap',
+        'Manual' => 'Handmatig',
+        'Portrait' => 'Portret',
+        'Shutter Priority' => 'Sluiterprioriteit',
+      },
+    },
+   'SceneSelect' => {
+      PrintConv => {
+        'Night' => 'Nachtszene',
+        'Off' => 'Uit',
+      },
+    },
+   'SceneType' => {
+      Description => 'Scene type',
+      PrintConv => {
+        'Directly photographed' => 'Direkt opgenomen afbeelding',
+      },
+    },
+   'SecurityClassification' => {
+      Description => 'Veiligheid classificering',
+      PrintConv => {
+        'Confidential' => 'Vertrouwelijk',
+        'Restricted' => 'Begrensd',
+        'Secret' => 'Geheim',
+        'Top Secret' => 'Streng geheim',
+        'Unclassified' => 'Niet geclassificeerd',
+      },
+    },
+   'SelfTimer' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'SelfTimerMode' => 'Zelfontspanner mode',
+   'SelfTimerTime' => 'Vertraging zelfontspanner',
+   'SensingMethod' => {
+      Description => 'Meet methode',
+      PrintConv => {
+        'Color sequential area' => 'Color sequential area sensor',
+        'Color sequential linear' => 'Kleur sequentiÃ«le lineaire sensor',
+        'Monochrome area' => 'Monochrome sensor',
+        'Monochrome linear' => 'Monochrome lineaire sensor',
+        'Not defined' => 'Niet gedefineerd',
+        'One-chip color area' => 'ÃÃ©n chip kleur sensor',
+        'Three-chip color area' => 'Drie chip kleur sensor',
+        'Trilinear' => 'Trilineaire sensor',
+        'Two-chip color area' => 'Twee chip kleur sensor',
+      },
+    },
+   'SequentialShot' => {
+      PrintConv => {
+        'None' => 'Geen',
+        'Standard' => 'Standaard',
+      },
+    },
+   'SerialNumber' => 'Camera-ID',
+   'ServiceIdentifier' => 'Service ID',
+   'SetButtonCrossKeysFunc' => {
+      PrintConv => {
+        'Normal' => 'Normaal',
+      },
+    },
+   'ShadingCompensation' => {
+      Description => 'Schaduwcompensatie',
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'ShadingCompensation2' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'ShakeReduction' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'Sharpness' => {
+      Description => 'Scherpte',
+      PrintConv => {
+        'Hard' => '+',
+        'Normal' => 'Normaal',
+        'Soft' => 'Zacht',
+      },
+    },
+   'SharpnessFrequency' => {
+      PrintConv => {
+        'High' => 'Hoog',
+        'Low' => 'Laag',
+        'Standard' => 'Standaard',
+      },
+    },
+   'ShootingInfoDisplay' => {
+      Description => 'Weergave opname-info',
+      PrintConv => {
+        'Auto' => 'Automatisch',
+        'Manual (dark on light)' => 'Handmatig - Donker op licht',
+        'Manual (light on dark)' => 'Handmatig - Licht op donker',
+      },
+    },
+   'ShootingMode' => {
+      Description => 'Opnamestand',
+      PrintConv => {
+        'Aperture Priority' => 'Diafragmaprioriteit',
+        'Manual' => 'Handmatig',
+        'Normal' => 'Normaal',
+        'Portrait' => 'Portret',
+        'Shutter Priority' => 'Sluiterprioriteit',
+      },
+    },
+   'ShootingModeSetting' => {
+      Description => 'Opnamestand',
+      PrintConv => {
+        'Continuous' => 'Continu',
+        'Delayed Remote' => 'Vertraagd op afstand',
+        'Quick-response Remote' => 'Direct op afstand',
+        'Self-timer' => 'Zelfontspanner',
+        'Single Frame' => 'Enkel beeld',
+      },
+    },
+   'ShortDocumentID' => 'Korte foto ID',
+   'ShutterMode' => {
+      PrintConv => {
+        'Aperture Priority' => 'Diafragmaprioriteit',
+        'Auto' => 'Automatisch',
+      },
+    },
+   'ShutterReleaseButtonAE-L' => {
+      Description => 'AE-vergr. ontspanknop',
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'ShutterReleaseNoCFCard' => {
+      PrintConv => {
+        'No' => 'Nee',
+        'Yes' => 'Ja',
+      },
+    },
+   'ShutterSpeed' => 'Belichtingstijd',
+   'ShutterSpeedValue' => 'Belichtingstijd',
+   'SimilarityIndex' => 'Fotogelijkheidsindex',
+   'SlideShow' => {
+      PrintConv => {
+        'No' => 'Nee',
+        'Yes' => 'Ja',
+      },
+    },
+   'SlowShutter' => {
+      PrintConv => {
+        'None' => 'Geen',
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'SlowSync' => {
+      PrintConv => {
+        'Off' => 'Uit',
+      },
+    },
+   'Software' => 'Gebruikte software',
+   'Source' => 'Bron',
+   'SpatialFrequencyResponse' => 'Spatial frequency response',
+   'SpecialEffectsOpticalFilter' => {
+      PrintConv => {
+        'None' => 'Geen',
+      },
+    },
+   'SpecialInstructions' => 'Instructies',
+   'SpectralSensitivity' => 'Spectrale gevoeligheid',
+   'State' => 'Staat',
+   'StripByteCounts' => 'Aantal bytes per gecomprimeerd afbeelding deel',
+   'StripOffsets' => 'Positie van afbeelding data',
+   'Sub-location' => 'Locatie',
+   'SubSecCreateDate' => 'Datum van de originele data generatie',
+   'SubSecDateTimeOriginal' => 'Datum van de originele data generatie',
+   'SubSecModifyDate' => 'Datum bestand wijziging',
+   'SubSecTime' => 'DateTime 1/100 seconden',
+   'SubSecTimeDigitized' => 'DateTimeDigitized 1/100 seconden',
+   'SubSecTimeOriginal' => 'DateTimeOriginal 1/100 seconden',
+   'SubfileType' => 'Nieuw subbestand type',
+   'Subject' => 'Onderwerp',
+   'SubjectArea' => 'Positie hoofdobject',
+   'SubjectDistance' => 'Object afstand',
+   'SubjectDistanceRange' => {
+      Description => 'Objectief afstandsbereik',
+      PrintConv => {
+        'Close' => 'Dichtbij',
+        'Distant' => 'Verweg',
+        'Unknown' => 'Onbekend',
+      },
+    },
+   'SubjectLocation' => 'Positie hoofdobject',
+   'SubjectProgram' => {
+      PrintConv => {
+        'None' => 'Geen',
+        'Portrait' => 'Portret',
+      },
+    },
+   'SubjectReference' => 'Onderwerp code',
+   'Subsystem' => {
+      PrintConv => {
+        'Unknown' => 'Onbekend',
+      },
+    },
+   'SuperMacro' => {
+      PrintConv => {
+        'Off' => 'Uit',
+      },
+    },
+   'SuperimposedDisplay' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'SupplementalCategories' => 'Aanvullende categorie',
+   'T4Options' => 'Opvul bit toegevoegd',
+   'T6Options' => 'T6 Opties',
+   'Tagged' => {
+      PrintConv => {
+        'No' => 'Nee',
+        'Yes' => 'Ja',
+      },
+    },
+   'TargetPrinter' => 'Doel Printer',
+   'Technology' => {
+      Description => 'Technologie',
+      PrintConv => {
+        'Active Matrix Display' => 'Actieve matrixdisplay',
+        'Cathode Ray Tube Display' => 'CRT-beeldscherm',
+        'Digital Camera' => 'Digitale camera',
+        'Dye Sublimation Printer' => 'Dye sublimation printer',
+        'Electrophotographic Printer' => 'Laserprinter',
+        'Electrostatic Printer' => 'Electrostatische printer',
+        'Film Scanner' => 'Filmscanner',
+        'Film Writer' => 'Filmprinter',
+        'Flexography' => 'Flexografie',
+        'Gravure' => 'Fotogravure - koperdiepdruk',
+        'Ink Jet Printer' => 'Inkjet printer',
+        'Offset Lithography' => 'Offset Lithografie',
+        'Passive Matrix Display' => 'Passieve matrixdisplay',
+        'Photo CD' => 'Photo-CD',
+        'Photo Image Setter' => 'Fotofilmbelichter',
+        'Photographic Paper Printer' => 'Photopapier printer',
+        'Projection Television' => 'Projectietelevisie',
+        'Reflective Scanner' => 'Reflectieve Scanner',
+        'Thermal Wax Printer' => 'Thermische was printer',
+        'Video Camera' => 'Videocamera',
+        'Video Monitor' => 'Videomonitor',
+      },
+    },
+   'Teleconverter' => {
+      PrintConv => {
+        'None' => 'Geen',
+      },
+    },
+   'TextStamp' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'ThumbnailImage' => 'Miniatuur',
+   'ThumbnailImageSize' => 'Thumbnail formaat',
+   'TimeCreated' => 'Opnametijdstip',
+   'TimeScaleParamsQuality' => {
+      PrintConv => {
+        'High' => 'Hoog',
+        'Low' => 'Laag',
+      },
+    },
+   'TimeSent' => 'Tijdstip van zenden',
+   'TimerFunctionButton' => {
+      Description => 'Fn-knop',
+      PrintConv => {
+        'ISO' => 'ISO-gevoeligheid',
+        'Image Quality/Size' => 'Bldkwaliteit/-formaat',
+        'Self-timer' => 'Zelfontspanner',
+        'Shooting Mode' => 'Opnamestand',
+        'White Balance' => 'Witbalans',
+      },
+    },
+   'Title' => 'Titel',
+   'ToneCurve' => {
+      PrintConv => {
+        'Manual' => 'Handmatig',
+        'Standard' => 'Standaard',
+      },
+    },
+   'ToneCurveActive' => {
+      PrintConv => {
+        'No' => 'Nee',
+        'Yes' => 'Ja',
+      },
+    },
+   'ToningEffect' => {
+      PrintConv => {
+        'None' => 'Geen',
+      },
+    },
+   'ToningEffectMonochrome' => {
+      PrintConv => {
+        'None' => 'Geen',
+      },
+    },
+   'TransferFunction' => 'Transformatie functie',
+   'Transformation' => {
+      PrintConv => {
+        'Horizontal (normal)' => '0Â° (boven/links)',
+        'Mirror horizontal' => 'Horizontaal gespiegeld',
+        'Mirror horizontal and rotate 270 CW' => 'Spiegel horizontaal en draai 270Â° met de klok mee',
+        'Mirror horizontal and rotate 90 CW' => 'Spiegel horizontaal en draai 90Â° met de klok mee',
+        'Mirror vertical' => 'Vertikaal gespiegeld',
+        'Rotate 180' => '180Â° (onder/rechts)',
+        'Rotate 270 CW' => 'Draai 270Â° met de klok mee',
+        'Rotate 90 CW' => '90Â° tegen de klok in (rechts/boven)',
+      },
+    },
+   'TransmissionReference' => 'Transmissiereferentie',
+   'Trapped' => {
+      PrintConv => {
+        'Unknown' => 'Onbekend',
+      },
+    },
+   'Uncompressed' => {
+      Description => 'Niet gecomprimeerd',
+      PrintConv => {
+        'No' => 'Nee',
+        'Yes' => 'Ja',
+      },
+    },
+   'UniqueDocumentID' => 'Uniek foto ID',
+   'UniqueObjectName' => 'Unieke Naam van het Object',
+   'Unknown' => 'Onbekend',
+   'UnsharpMask' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'Urgency' => {
+      Description => 'Urgentie',
+      PrintConv => {
+        '0 (reserved)' => '0 (Gereserveerd voor toekomstig gebruik)',
+        '1 (most urgent)' => '1 (zeer dringend)',
+        '5 (normal urgency)' => '5 (dringend)',
+        '8 (least urgent)' => '8 (minst dringend)',
+        '9 (user-defined priority)' => '9 (Gereserveerd voor toekomstig gebruik)',
+      },
+    },
+   'UserComment' => 'Gebruiker kommentaar',
+   'UserDef1PictureStyle' => {
+      PrintConv => {
+        'Landscape' => 'Landschap',
+        'Portrait' => 'Portret',
+        'Standard' => 'Standaard',
+      },
+    },
+   'UserDef2PictureStyle' => {
+      PrintConv => {
+        'Landscape' => 'Landschap',
+        'Portrait' => 'Portret',
+        'Standard' => 'Standaard',
+      },
+    },
+   'UserDef3PictureStyle' => {
+      PrintConv => {
+        'Landscape' => 'Landschap',
+        'Portrait' => 'Portret',
+        'Standard' => 'Standaard',
+      },
+    },
+   'VRDVersion' => 'VRD versie',
+   'VR_0x66' => {
+      PrintConv => {
+        'Off' => 'Uit',
+      },
+    },
+   'Version' => 'Versie',
+   'VibrationReduction' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'ViewfinderWarning' => {
+      Description => 'Zoekerwaarschuwing',
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'VignetteControl' => {
+      PrintConv => {
+        'High' => 'Hoog',
+        'Normal' => 'Normaal',
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'VoiceMemo' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'WBAdjLighting' => {
+      PrintConv => {
+        'Daylight' => 'Daglicht',
+        'Flash' => 'Flits',
+        'None' => 'Geen',
+      },
+    },
+   'WBBracketMode' => {
+      PrintConv => {
+        'Off' => 'Uit',
+      },
+    },
+   'WBFineTuneActive' => {
+      PrintConv => {
+        'No' => 'Nee',
+        'Yes' => 'Ja',
+      },
+    },
+   'WBMode' => {
+      PrintConv => {
+        'Auto' => 'Automatisch',
+      },
+    },
+   'WCSProfiles' => 'Windows kleursysteemprofiel',
+   'WhiteBalance' => {
+      Description => 'Witbalans',
+      PrintConv => {
+        'Auto' => 'Automatisch',
+        'Black & White' => 'Monochroom',
+        'Cloudy' => 'Bewolkt',
+        'Color Temperature/Color Filter' => 'Kleurtemperatuur / Kleurfilter',
+        'Cool White Fluorescent' => 'Koelwit TL-licht',
+        'Custom' => 'Eigen instel.',
+        'Custom 1' => 'VOORKEUR 1',
+        'Custom 2' => 'VOORKEUR 2',
+        'Custom 3' => 'VOORKEUR 3',
+        'Custom 4' => 'VOORKEUR 4',
+        'Day White Fluorescent' => 'Daglicht wit TL-licht',
+        'Daylight' => 'Daglicht',
+        'Daylight Fluorescent' => 'Daglicht TL-licht',
+        'Flash' => 'Flits',
+        'Fluorescent' => 'Fluoresceren',
+        'Manual' => 'Handmatig',
+        'Shade' => 'Schaduw',
+        'Tungsten' => 'Kunstlicht (gloeilamp)',
+        'Unknown' => 'Onbekend',
+        'Warm White Fluorescent' => 'Warm wit TL-licht',
+        'White Fluorescent' => 'Wit TL-licht',
+      },
+    },
+   'WhiteBalance2' => {
+      PrintConv => {
+        'Auto' => 'Automatisch',
+      },
+    },
+   'WhiteBalanceAdj' => {
+      PrintConv => {
+        'Auto' => 'Automatisch',
+        'Cloudy' => 'Bewolkt',
+        'Daylight' => 'Daglicht',
+        'Flash' => 'Flits',
+        'Fluorescent' => 'Fluoresceren',
+        'Off' => 'Uit',
+        'On' => 'Aan',
+        'Shade' => 'Schaduw',
+        'Tungsten' => 'Kunstlicht (gloeilamp)',
+      },
+    },
+   'WhiteBalanceMode' => {
+      PrintConv => {
+        'Unknown' => 'Onbekend',
+      },
+    },
+   'WhiteBalanceSet' => {
+      PrintConv => {
+        'Auto' => 'Automatisch',
+        'Cloudy' => 'Bewolkt',
+        'Daylight' => 'Daglicht',
+        'Daylight Fluorescent' => 'Daglicht TL-licht',
+        'Flash' => 'Flits',
+        'Manual' => 'Handmatig',
+        'Shade' => 'Schaduw',
+        'Tungsten' => 'Kunstlicht (gloeilamp)',
+        'White Fluorescent' => 'Warm wit TL-licht',
+      },
+    },
+   'WhitePoint' => 'Wit punt chromaticiteit',
+   'WideRange' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+   'WidthResolution' => 'Beeldresolutie horizontaal',
+   'Writer-Editor' => 'Titel/Beschrijving auteur',
+   'XMP' => 'XMP metadata',
+   'XPAuthor' => 'Auteur',
+   'XPComment' => 'Kommentaar',
+   'XPKeywords' => 'Trefwoorden',
+   'XPSubject' => 'Onderwerp',
+   'XPTitle' => 'Titel',
+   'XPosition' => 'X positie',
+   'XResolution' => 'Horizontale afbeelding resolutie',
+   'YCbCrCoefficients' => 'YCbCr coÃ«fficiÃ«nt',
+   'YCbCrPositioning' => {
+      Description => 'Y en C positie',
+      PrintConv => {
+        'Centered' => 'Gecentreerd',
+        'Co-sited' => 'Naast liggend',
+      },
+    },
+   'YCbCrSubSampling' => 'Subsampling ratio van Y tot C',
+   'YPosition' => 'Y positie',
+   'YResolution' => 'Vertikale afbeelding resolutie',
+   'ZoneMatching' => {
+      Description => 'Zoneaanpassing',
+      PrintConv => {
+        'High Key' => 'Hi',
+        'ISO Setting Used' => 'Uit',
+        'Low Key' => 'Lo',
+      },
+    },
+   'ZoneMatchingOn' => {
+      PrintConv => {
+        'Off' => 'Uit',
+        'On' => 'Aan',
+      },
+    },
+);
+
+1;  # end
+
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Lang::nl.pm - ExifTool Dutch language translations
+
+=head1 DESCRIPTION
+
+This file is used by Image::ExifTool to generate localized tag descriptions
+and values.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Jens Duttke, Peter Moonen and Herman Beld for providing this
+translation.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool(3pm)|Image::ExifTool>,
+L<Image::ExifTool::TagInfoXML(3pm)|Image::ExifTool::TagInfoXML>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/pl.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/pl.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/pl.pm	(revision 24799)
@@ -0,0 +1,904 @@
+#------------------------------------------------------------------------------
+# File:         pl.pm
+#
+# Description:  ExifTool Polish language translations
+#
+# Notes:        This file generated automatically by Image::ExifTool::TagInfoXML
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Lang::pl;
+
+use strict;
+use vars qw($VERSION);
+
+$VERSION = '1.04';
+
+%Image::ExifTool::Lang::pl::Translate = (
+   'AFPoint' => {
+      PrintConv => {
+        'None' => 'Brak',
+      },
+    },
+   'AFPointsInFocus' => {
+      PrintConv => {
+        'None' => 'Brak',
+      },
+    },
+   'Aperture' => 'PrzysÅona',
+   'ApertureValue' => 'PrzysÅona',
+   'Artist' => 'Artysta',
+   'Author' => 'Autor',
+   'AuthorsPosition' => 'Pozycja autora',
+   'AutoRotate' => {
+      PrintConv => {
+        'None' => 'Brak',
+        'Rotate 180' => '180Â° (dÃ³Å/prawo)',
+        'Rotate 270 CW' => '90Â° CW (lewo/dÃ³Å)',
+        'Rotate 90 CW' => '90Â° CCW (prawo/gÃ³ra)',
+      },
+    },
+   'BannerImageType' => {
+      PrintConv => {
+        'None' => 'Brak',
+      },
+    },
+   'BitsPerSample' => 'Liczba bitÃ³w na skÅadnik',
+   'BlurWarning' => {
+      PrintConv => {
+        'None' => 'Brak',
+      },
+    },
+   'Brightness' => 'JasnoÅÄ',
+   'By-line' => 'Autor',
+   'CFAPattern' => 'Wzorzec CFA',
+   'CMMFlags' => 'Flagi CMM',
+   'CPUType' => {
+      PrintConv => {
+        'None' => 'Brak',
+      },
+    },
+   'CalibrationIlluminant1' => {
+      PrintConv => {
+        'Cloudy' => 'Zachmurzone niebo',
+        'Cool White Fluorescent' => 'Zimna biaÅa jarzeniÃ³wka (W 3800 - 4500K)',
+        'Day White Fluorescent' => 'JarzeniÃ³wka z naturalnym biaÅym ÅwiatÅem (N 4600 - 5500K)',
+        'Daylight' => 'ÅwiatÅo dzienne',
+        'Daylight Fluorescent' => 'JarzeniÃ³wka dajÄ
+ca ÅwiatÅo dzienne (D 5700 - 7100K)',
+        'Fine Weather' => 'Dobra pogoda',
+        'Flash' => 'Lampa bÅyskowa',
+        'Fluorescent' => 'Jarzeniowy',
+        'ISO Studio Tungsten' => 'ISO dla studyjnych lamp ÅŒarowych',
+        'Other' => 'inne ÅºrÃ³dÅo ÅwiatÅa',
+        'Shade' => 'CieÅ',
+        'Standard Light A' => 'Standardowe ÅwiatÅo A',
+        'Standard Light B' => 'Standardowe ÅwiatÅo B',
+        'Standard Light C' => 'Standardowe ÅwiatÅo C',
+        'Tungsten (Incandescent)' => 'ÅwiatÅo ÅŒarowe',
+        'Unknown' => 'Nieznane',
+        'White Fluorescent' => 'BiaÅa jarzeniÃ³wka (WW3250 - 3800K)',
+      },
+    },
+   'CalibrationIlluminant2' => {
+      PrintConv => {
+        'Cloudy' => 'Zachmurzone niebo',
+        'Cool White Fluorescent' => 'Zimna biaÅa jarzeniÃ³wka (W 3800 - 4500K)',
+        'Day White Fluorescent' => 'JarzeniÃ³wka z naturalnym biaÅym ÅwiatÅem (N 4600 - 5500K)',
+        'Daylight' => 'ÅwiatÅo dzienne',
+        'Daylight Fluorescent' => 'JarzeniÃ³wka dajÄ
+ca ÅwiatÅo dzienne (D 5700 - 7100K)',
+        'Fine Weather' => 'Dobra pogoda',
+        'Flash' => 'Lampa bÅyskowa',
+        'Fluorescent' => 'Jarzeniowy',
+        'ISO Studio Tungsten' => 'ISO dla studyjnych lamp ÅŒarowych',
+        'Other' => 'inne ÅºrÃ³dÅo ÅwiatÅa',
+        'Shade' => 'CieÅ',
+        'Standard Light A' => 'Standardowe ÅwiatÅo A',
+        'Standard Light B' => 'Standardowe ÅwiatÅo B',
+        'Standard Light C' => 'Standardowe ÅwiatÅo C',
+        'Tungsten (Incandescent)' => 'ÅwiatÅo ÅŒarowe',
+        'Unknown' => 'Nieznane',
+        'White Fluorescent' => 'BiaÅa jarzeniÃ³wka (WW3250 - 3800K)',
+      },
+    },
+   'CameraOrientation' => {
+      Description => 'Orientacja obrazu',
+      PrintConv => {
+        'Horizontal (normal)' => '0Â° (gÃ³ra/lewo)',
+        'Rotate 270 CW' => '90Â° CW (lewo/dÃ³Å)',
+        'Rotate 90 CW' => '90Â° CCW (prawo/gÃ³ra)',
+      },
+    },
+   'Caption-Abstract' => 'Podpis',
+   'CaptionWriter' => 'Autor podpisu',
+   'Categories' => 'Kategorie',
+   'Category' => 'Kategorie',
+   'City' => 'Miasto',
+   'ColorFilter' => 'Filtr kolorowy',
+   'ColorSpace' => {
+      Description => 'Informacja o przestrzeni barwowej',
+      PrintConv => {
+        'Uncalibrated' => 'Nie skalibrowany',
+      },
+    },
+   'ColorSpaceData' => 'Dane przestrzeni barw',
+   'ColorTemperature' => 'Temperatura barwowa',
+   'Comment' => 'Komentarz',
+   'ComponentsConfiguration' => 'Znaczenie kaÅŒdego komponentu',
+   'CompressedBitsPerPixel' => 'Tryb kompresji obrazu',
+   'Compression' => {
+      Description => 'Algorytm kompresji',
+      PrintConv => {
+        'Epson ERF Compressed' => 'Skompresowany Epson ERF',
+        'JPEG' => 'Kompresja JPEG',
+        'JPEG (old-style)' => 'JPEG (w starym stylu)',
+        'Kodak DCR Compressed' => 'Skompresowany Kodak DCR',
+        'Kodak KDC Compressed' => 'Skompresowany Kodak KDC',
+        'Next' => 'Kodowanie 2-bitowe NeXT',
+        'Nikon NEF Compressed' => 'Skompresowany Nikon NEF',
+        'None' => 'Brak',
+        'Pentax PEF Compressed' => 'Skompresowany Pentax PEF',
+        'SGILog' => 'Kodowanie 32-bitowe SGI Log Luminance',
+        'SGILog24' => 'Kodowanie 24-bitowe SGI Log Luminance',
+        'Sony ARW Compressed' => 'Skompresowany Sony ARW',
+        'Thunderscan' => 'Kodowanie 4-bitowe ThunderScan',
+        'Uncompressed' => 'Bez kompresji',
+      },
+    },
+   'CompressionType' => {
+      PrintConv => {
+        'None' => 'Brak',
+      },
+    },
+   'Contrast' => {
+      Description => 'Kontrast',
+      PrintConv => {
+        'High' => 'Ostre',
+        'Low' => 'MiÄkkie',
+        'Normal' => 'Standard',
+      },
+    },
+   'Copyright' => 'Posiadacz praw autorskich',
+   'CopyrightNotice' => 'Informacja o prawach autorskich',
+   'Country' => 'Kraj',
+   'Country-PrimaryLocationName' => 'Kraj',
+   'CreateDate' => 'Data utworzenia',
+   'CreationDate' => 'Data utworzenia',
+   'Credit' => 'PodziÄkowania',
+   'CropUnit' => {
+      PrintConv => {
+        'inches' => 'Cal',
+      },
+    },
+   'CropUnits' => {
+      PrintConv => {
+        'inches' => 'Cal',
+      },
+    },
+   'CustomRendered' => {
+      Description => 'Przetwarzanie zdjÄÄ wedÅug ustawieÅ wÅasnych',
+      PrintConv => {
+        'Custom' => 'Proces zdefiniowany przez uÅŒytkownika',
+        'Normal' => 'Normalny proces',
+      },
+    },
+   'DNGBackwardVersion' => 'Poprzednia wersja DNG',
+   'DNGVersion' => 'Wersja DNG',
+   'DataImprint' => {
+      PrintConv => {
+        'None' => 'Brak',
+      },
+    },
+   'DateCreated' => 'Data utworzenia',
+   'DateSent' => 'WysÅano datÄ',
+   'DateTimeOriginal' => 'Pierwotna data i godzina',
+   'Description' => 'Opis',
+   'DeviceAttributes' => 'Atrybuty urzÄ
+dzenia',
+   'DeviceManufacturer' => 'Producent urzÄ
+dzenia',
+   'DeviceModel' => 'Model urzÄ
+dzenia',
+   'DeviceSettingDescription' => 'Opis ustawieÅ urzÄ
+dzenia',
+   'DigitalZoom' => 'Cyfrowy zoom',
+   'DigitalZoomRatio' => 'WspÃ³Åczynnik cyfrowego zoomu',
+   'Directory' => 'Lokalizacja pliku',
+   'DisplayUnits' => {
+      PrintConv => {
+        'inches' => 'Cal',
+      },
+    },
+   'DisplayedUnitsX' => {
+      PrintConv => {
+        'inches' => 'Cal',
+      },
+    },
+   'DisplayedUnitsY' => {
+      PrintConv => {
+        'inches' => 'Cal',
+      },
+    },
+   'DriveMode' => 'Tryb przesuwu',
+   'Duration' => 'Czas',
+   'Emphasis' => {
+      PrintConv => {
+        'None' => 'Brak',
+      },
+    },
+   'EnvelopePriority' => {
+      PrintConv => {
+        '0 (reserved)' => '0 (zarezerwowane na przyszÅoÅÄ)',
+        '1 (most urgent)' => '1 (najpilniejszy)',
+        '5 (normal urgency)' => '5 (zwykÅy)',
+        '8 (least urgent)' => '8 (niezbyt pilny)',
+        '9 (user-defined priority)' => '9 (priorytet okreÅlony przez uÅŒytkownika)',
+      },
+    },
+   'ExifImageHeight' => 'WysokoÅÄ obrazu',
+   'ExifImageWidth' => 'SzerokoÅÄ obrazu',
+   'ExifOffset' => 'WskaÅºnik Exif IFD',
+   'ExifVersion' => 'Wersja Exif',
+   'ExposureCompensation' => 'RÃ³ÅŒnica ekspozycji',
+   'ExposureIndex' => 'WskaÅºnik ekspozycji',
+   'ExposureMode' => {
+      Description => 'Tryb ekspozycji',
+      PrintConv => {
+        'Auto' => 'Automatyczna ekspozycja',
+        'Auto bracket' => 'Funkcja Autobracketing',
+        'Manual' => 'Manualna ekspozycja',
+      },
+    },
+   'ExposureProgram' => {
+      Description => 'Program ekspozycji',
+      PrintConv => {
+        'Action (High speed)' => 'Program akcji',
+        'Aperture-priority AE' => 'Priorytet przysÅony',
+        'Creative (Slow speed)' => 'Program kreatywny',
+        'Landscape' => 'Krajobraz',
+        'Manual' => 'Manualna ekspozycja',
+        'Portrait' => 'Portret',
+        'Program AE' => 'Normalny program',
+        'Shutter speed priority AE' => 'Priorytet migawki',
+      },
+    },
+   'ExposureTime' => 'Czas ekspozycji',
+   'FNumber' => 'PrzysÅona',
+   'FileFormat' => 'Format',
+   'FileModifyDate' => 'Data aktualizacji',
+   'FileName' => 'Nazwa pliku',
+   'FileSize' => 'WielkoÅÄ pliku',
+   'FileSource' => {
+      Description => 'Å¹rÃ³dÅo pliku',
+      PrintConv => {
+        'Digital Camera' => 'DSC',
+        'Film Scanner' => 'Skaner do materiaÅÃ³w transparentnych',
+        'Reflection Print Scanner' => 'Skaner do zdjÄÄ',
+      },
+    },
+   'FileType' => 'Typ pliku',
+   'FilterEffectMonochrome' => {
+      PrintConv => {
+        'None' => 'Brak',
+      },
+    },
+   'Flash' => {
+      Description => 'Lampa',
+      PrintConv => {
+        'Auto, Fired' => 'WÅÄ
+czony (Automatyczny bÅysk lampy)',
+        'Auto, Fired, Red-eye reduction' => '"WÅÄ
+czony (BÅysk automatyczny, Redukcja efektu czerwonych oczu)"',
+        'Auto, Fired, Red-eye reduction, Return detected' => '"WÅÄ
+czony (BÅysk automatyczny, Redukcja efektu czerwonych oczu, rejestracja ÅwiatÅa odbitego)"',
+        'Auto, Fired, Return detected' => '"WÅÄ
+czony (Automatyczny bÅysk lampy, rejestracja ÅwiatÅa odbitego)"',
+        'Did not fire' => 'Nie nastÄ
+piÅ bÅysk lampy',
+        'Fired' => 'NastÄ
+piÅ bÅysk lampy',
+        'Fired, Red-eye reduction' => 'WÅÄ
+czony (Redukcja efektu czerwonych oczu)',
+        'Fired, Red-eye reduction, Return detected' => '"WÅÄ
+czony (Redukcja efektu czerwonych oczu, rejestracja ÅwiatÅa odbitego)"',
+        'Fired, Return detected' => 'WÅÄ
+czony (Rejestracja ÅwiatÅa odbitego)',
+        'No Flash' => 'Brak funkcji lampy bÅyskowej',
+        'On, Fired' => 'WÅÄ
+czony (BÅysk dopeÅniajÄ
+cy)',
+        'On, Red-eye reduction' => '"WÅÄ
+czony (BÅysk dopeÅniajÄ
+cy, Redukcja efektu czerwonych oczu)"',
+        'On, Red-eye reduction, Return detected' => '"WÅÄ
+czony (BÅysk dopeÅniajÄ
+cy, Redukcja efektu czerwonych oczu, rejestracja ÅwiatÅa odbitego)"',
+        'On, Return detected' => '"WÅÄ
+czony (BÅysk dopeÅniajÄ
+cy, rejestracja ÅwiatÅa odbitego)"',
+      },
+    },
+   'FlashDevice' => {
+      PrintConv => {
+        'None' => 'Brak',
+      },
+    },
+   'FlashEnergy' => 'SiÅa lampy bÅyskowej',
+   'FlashExposureComp' => 'Kompensacja lampy',
+   'FlashModel' => {
+      PrintConv => {
+        'None' => 'Brak',
+      },
+    },
+   'FlashType' => {
+      PrintConv => {
+        'None' => 'Brak',
+      },
+    },
+   'FlashpixVersion' => 'ObsÅugiwana wersja Flashpix',
+   'FocalLength' => 'Ogniskowa',
+   'FocalLength35efl' => 'DÅugoÅÄ ogniskowej (w wartoÅciach dla formatu maÅoobrazkowego)',
+   'FocalLengthIn35mmFormat' => 'DÅugoÅÄ ogniskowej dla aparatÃ³w maÅoobrazkowych',
+   'FocalPlaneResolutionUnit' => {
+      Description => 'Jednostka rozdzielczoÅci w pÅaszczyÅºnie ogniskowej',
+      PrintConv => {
+        'None' => 'Brak',
+        'inches' => 'Cal',
+        'um' => 'Âµm (mikrometr)',
+      },
+    },
+   'FocalPlaneXResolution' => 'RozdzielczoÅÄ w pÅaszczyÅºnie ogniskowej - oÅ x',
+   'FocalPlaneYResolution' => 'RozdzielczoÅÄ w pÅaszczyÅºnie ogniskowej - oÅ y',
+   'FocusMode' => 'Tryb ostrzenia',
+   'FrameRate' => 'CzÄstotliwoÅÄ zmiany kadrÃ³w',
+   'FrameSize' => 'WielkoÅÄ kadru',
+   'FreeByteCounts' => 'Liczba wolnych bajtÃ³w',
+   'FreeOffsets' => 'Wolne offsety',
+   'GPSAltitude' => 'WysokoÅÄ',
+   'GPSAltitudeRef' => {
+      Description => 'WysokoÅÄ odniesienia',
+      PrintConv => {
+        'Above Sea Level' => 'Poziom morza',
+        'Below Sea Level' => 'WzglÄdem poziomu morza (wartoÅÄ ujemna)',
+      },
+    },
+   'GPSAreaInformation' => 'Nazwa obszaru GPS',
+   'GPSDOP' => 'Precyzja pomiaru',
+   'GPSDateStamp' => 'Dane GPS',
+   'GPSDestBearing' => 'Azymut punktu docelowego',
+   'GPSDestBearingRef' => 'WartoÅÄ odniesienia dla azymutu punktu docelowego.',
+   'GPSDestDistance' => 'OdlegÅoÅÄ do punktu docelowego.',
+   'GPSDestDistanceRef' => 'WartoÅÄ odniesienia dla odlegÅoÅci do punktu docelowego.',
+   'GPSDestLatitude' => 'SzerokoÅÄ geograficzna punktu docelowego',
+   'GPSDestLatitudeRef' => 'WartoÅÄ odniesienia dla szerokoÅci geograficznej punktu docelowego.',
+   'GPSDestLongitude' => 'DÅugoÅÄ geograficzna punktu docelowego',
+   'GPSDestLongitudeRef' => 'WartoÅÄ odniesienia dla dÅugoÅci geograficznej punktu docelowego.',
+   'GPSDifferential' => {
+      Description => 'RÃ³ÅŒnicowa korekcja GPS',
+      PrintConv => {
+        'Differential Corrected' => 'Zastosowanie korekcji rÃ³ÅŒnicowej',
+        'No Correction' => 'Pomiar bez korekcji rÃ³ÅŒnicowej',
+      },
+    },
+   'GPSImgDirection' => 'Kierunek obrazu',
+   'GPSImgDirectionRef' => 'WartoÅÄ odniesienia dla kierunku obrazu',
+   'GPSInfo' => 'WskaÅºnik GPS Info IFD',
+   'GPSLatitude' => 'SzerokoÅÄ geograficzna',
+   'GPSLatitudeRef' => {
+      Description => 'SzerokoÅÄ geograficzna pÃ³Ånocna lub poÅudniowa',
+      PrintConv => {
+        'North' => 'SzerokoÅci pÃ³Ånocnej',
+        'South' => 'SzerokoÅci poÅudniowej',
+      },
+    },
+   'GPSLongitude' => 'DÅugoÅÄ geograficzna',
+   'GPSLongitudeRef' => {
+      Description => 'DÅugoÅÄ geograficzna wschodnia lub zachodnia',
+      PrintConv => {
+        'East' => 'DÅugoÅci wschodniej',
+        'West' => 'DÅugoÅci zachodniej',
+      },
+    },
+   'GPSMapDatum' => 'Wykorzystane dane z badaÅ geodezyjnych',
+   'GPSMeasureMode' => {
+      Description => 'Tryb pomiaru GPS',
+      PrintConv => {
+        '3-Dimensional Measurement' => 'Pomiar 3-wymiarowy',
+      },
+    },
+   'GPSProcessingMethod' => 'Nazwa metody przetwarzania GPS',
+   'GPSSatellites' => 'Satelity GPS uÅŒywane do pomiaru',
+   'GPSSpeed' => 'PrÄdkoÅÄ odbiornika GPS',
+   'GPSSpeedRef' => {
+      Description => 'Jednostka prÄdkoÅci',
+      PrintConv => {
+        'km/h' => 'KilometrÃ³w na godzinÄ',
+        'knots' => 'WÄzÅy',
+        'mph' => 'Mil na godzinÄ',
+      },
+    },
+   'GPSStatus' => {
+      Description => 'Stan odbiornika GPS',
+      PrintConv => {
+        'Measurement Active' => 'Trwa pomiar',
+        'Measurement Void' => 'Wzajemna niesprzecznoÅÄ pomiarÃ³w',
+      },
+    },
+   'GPSTimeStamp' => 'Czas GPS (zegar atomowy)',
+   'GPSTrack' => 'Kierunek przesuniÄcia',
+   'GPSTrackRef' => {
+      Description => 'WartoÅÄ odniesienia dla kierunku ruchu',
+      PrintConv => {
+        'Magnetic North' => 'Kierunek strzaÅki magnetycznej',
+        'True North' => 'Rzeczywisty kierunek',
+      },
+    },
+   'GPSVersionID' => 'Wersja znacznika GPS',
+   'GainControl' => {
+      Description => 'Sterowanie krokiem',
+      PrintConv => {
+        'High gain down' => 'Z duÅŒym krokiem do doÅu',
+        'High gain up' => 'Z duÅŒym krokiem w gÃ³rÄ',
+        'Low gain down' => 'Z maÅym krokiem do doÅu',
+        'Low gain up' => 'Z maÅym krokiem w gÃ³rÄ',
+        'None' => 'Brak',
+      },
+    },
+   'Genre' => 'Gatunek',
+   'Gradation' => 'Gradacja',
+   'Headline' => 'NagÅÃ³wek',
+   'Hue' => 'Barwa',
+   'ISO' => 'CzuÅoÅÄ ISO',
+   'ImageHeight' => 'WysokoÅÄ obrazu',
+   'ImageSize' => 'Rozmiar zdjÄcia',
+   'ImageUniqueID' => 'Unikalny kod ID zdjÄcia',
+   'ImageWidth' => 'SzerokoÅÄ obrazu',
+   'Index' => 'Indeks',
+   'Instructions' => 'Instrukcje',
+   'InteropIndex' => 'Identyfikacja wzajemnej zgodnoÅci',
+   'InteropOffset' => 'Znacznik wzajemnej zgodnoÅci',
+   'InteropVersion' => 'Wersja wzajemnej zgodnoÅci',
+   'Keywords' => 'SÅowa kluczowe',
+   'Lens' => 'Obiektyw',
+   'LensInfo' => 'Informacja o obiektywie',
+   'LightSource' => {
+      Description => 'Å¹rÃ³dÅo ÅwiatÅa',
+      PrintConv => {
+        'Cloudy' => 'Zachmurzone niebo',
+        'Cool White Fluorescent' => 'Zimna biaÅa jarzeniÃ³wka (W 3800 - 4500K)',
+        'Day White Fluorescent' => 'JarzeniÃ³wka z naturalnym biaÅym ÅwiatÅem (N 4600 - 5500K)',
+        'Daylight' => 'ÅwiatÅo dzienne',
+        'Daylight Fluorescent' => 'JarzeniÃ³wka dajÄ
+ca ÅwiatÅo dzienne (D 5700 - 7100K)',
+        'Fine Weather' => 'Dobra pogoda',
+        'Flash' => 'Lampa bÅyskowa',
+        'Fluorescent' => 'Jarzeniowy',
+        'ISO Studio Tungsten' => 'ISO dla studyjnych lamp ÅŒarowych',
+        'Other' => 'inne ÅºrÃ³dÅo ÅwiatÅa',
+        'Shade' => 'CieÅ',
+        'Standard Light A' => 'Standardowe ÅwiatÅo A',
+        'Standard Light B' => 'Standardowe ÅwiatÅo B',
+        'Standard Light C' => 'Standardowe ÅwiatÅo C',
+        'Tungsten (Incandescent)' => 'ÅwiatÅo ÅŒarowe',
+        'Unknown' => 'Nieznane',
+        'White Fluorescent' => 'BiaÅa jarzeniÃ³wka (WW3250 - 3800K)',
+      },
+    },
+   'Lightness' => 'JasnoÅÄ',
+   'LocalizedCameraModel' => 'Lokalizowany model aparatu',
+   'Location' => 'Miejsce',
+   'Luminance' => 'Luminancja',
+   'Make' => 'Producent',
+   'MakeAndModel' => 'Producent i model',
+   'MakerNote' => 'Prywatne dane DNG',
+   'MakerNotes' => 'Dane producenta',
+   'MaxAperture' => 'Maks. przysÅona obiektywu',
+   'MeasurementGeometry' => {
+      Description => 'Geometria pomiaru',
+      PrintConv => {
+        '0/45 or 45/0' => '0/45 lub 45/0',
+        '0/d or d/0' => '0/d lub d/0',
+      },
+    },
+   'MediaBlackPoint' => 'Punkt czerni materiaÅu',
+   'MediaWhitePoint' => 'Punkt bieli materiaÅu',
+   'MeteringMode' => {
+      Description => 'Tryb pomiaru',
+      PrintConv => {
+        'Average' => 'Åredni',
+        'Center-weighted average' => 'Centralnie waÅŒony uÅredniony',
+        'Multi-segment' => 'WzÃ³r',
+        'Multi-spot' => 'Wielopunktowy',
+        'Other' => 'inne',
+        'Partial' => 'CzÄÅciowy',
+        'Spot' => 'Punktowy',
+        'Unknown' => 'Nieznane',
+      },
+    },
+   'Model' => 'Aparat',
+   'ModifiedPictureStyle' => {
+      PrintConv => {
+        'None' => 'Brak',
+      },
+    },
+   'ModifyDate' => 'Data i godzina zmiany pliku',
+   'MonochromeFilterEffect' => {
+      PrintConv => {
+        'None' => 'Brak',
+      },
+    },
+   'MonochromeToningEffect' => {
+      PrintConv => {
+        'None' => 'Brak',
+      },
+    },
+   'NEFCompression' => {
+      PrintConv => {
+        'Uncompressed' => 'Bez kompresji',
+      },
+    },
+   'NativeDisplayInfo' => 'Informacja o natywnym(?) wyÅwietlaczu',
+   'NoiseReduction' => 'Redukcja szumÃ³w',
+   'ObjectFileType' => {
+      PrintConv => {
+        'None' => 'Brak',
+      },
+    },
+   'Opto-ElectricConvFactor' => 'WspÃ³Åczynnik przeksztaÅcenia optyczno-elektrycznego',
+   'Orientation' => {
+      Description => 'Orientacja obrazu',
+      PrintConv => {
+        'Horizontal (normal)' => '0Â° (gÃ³ra/lewo)',
+        'Mirror horizontal' => '0Â° (gÃ³ra/prawo)',
+        'Mirror horizontal and rotate 270 CW' => '90Â° CW (lewo/gÃ³ra)',
+        'Mirror horizontal and rotate 90 CW' => '90Â° CCW (prawo/dÃ³Å)',
+        'Mirror vertical' => '180Â° (dÃ³Å/lewo)',
+        'Rotate 180' => '180Â° (dÃ³Å/prawo)',
+        'Rotate 270 CW' => '90Â° CW (lewo/dÃ³Å)',
+        'Rotate 90 CW' => '90Â° CCW (prawo/gÃ³ra)',
+      },
+    },
+   'PhotoEffectsType' => {
+      PrintConv => {
+        'None' => 'Brak',
+      },
+    },
+   'PhotometricInterpretation' => {
+      Description => 'Schemat pikseli',
+      PrintConv => {
+        'BlackIsZero' => 'Czarny jest zerem',
+        'Color Filter Array' => 'CFA (Filtr kolorÃ³w matrycy)',
+        'Pixar LogL' => 'CIE Log2(L) (Log luminancji)',
+        'Pixar LogLuv' => 'CIE Log2(l)(u\',v\') (Log luminancji i chrominancji)',
+        'RGB Palette' => 'Paleta kolorÃ³w',
+        'Transparency Mask' => 'Maska przeÅºroczystoÅci',
+        'WhiteIsZero' => 'BiaÅy jest zerem',
+      },
+    },
+   'PictureStyle' => {
+      PrintConv => {
+        'None' => 'Brak',
+      },
+    },
+   'PlanarConfiguration' => {
+      Description => 'UkÅad danych obrazu',
+      PrintConv => {
+        'Chunky' => 'Format "chunky" (z przeplotem)',
+        'Planar' => 'Format "planar"',
+      },
+    },
+   'Preview0' => 'PodglÄ
+d 0',
+   'Preview1' => 'PodglÄ
+d 1',
+   'Preview2' => 'PodglÄ
+d 2',
+   'PreviewColorSpace' => {
+      PrintConv => {
+        'Unknown' => 'Nieznany',
+      },
+    },
+   'PreviewImage' => 'PodglÄ
+d',
+   'PrimaryChromaticities' => 'TonalnoÅÄ kolorÃ³w podstawowych',
+   'ProductID' => 'ID produktu',
+   'ProfileCMMType' => 'Typ profilu CMM',
+   'ProfileClass' => {
+      Description => 'Klasa profilu',
+      PrintConv => {
+        'Abstract Profile' => 'Profil abstrakcyjny',
+        'ColorSpace Conversion Profile' => 'Profil konwersji przestrzeni barw',
+        'DeviceLink Profile' => 'Profil DeviceLink',
+        'Display Device Profile' => 'Profil urzÄ
+dzenia wyÅwietlajÄ
+cego',
+        'Input Device Profile' => 'Profil urzÄ
+dzenia wejÅciowego',
+        'NamedColor Profile' => 'Nazwany profil kolorÃ³w',
+        'Nikon Input Device Profile (NON-STANDARD!)' => 'Profil Nikon ("nkpf")',
+        'Output Device Profile' => 'Profil urzÄ
+dzenia wyjÅciowego',
+      },
+    },
+   'ProfileConnectionSpace' => 'Profil Connection Space',
+   'ProfileDateTime' => 'Data i czas profilu',
+   'ProfileDescription' => 'Opis profilu',
+   'ProfileDescriptionML' => 'WielojÄzyczny opis profilu.',
+   'ProfileSequenceDesc' => 'Opis sekwencji profilu',
+   'ProfileVersion' => 'Wersja profilu',
+   'ProgramMode' => {
+      PrintConv => {
+        'None' => 'Brak',
+      },
+    },
+   'Province-State' => 'Region',
+   'Quality' => {
+      PrintConv => {
+        'Low' => 'Niska jakoÅÄ',
+        'Normal' => 'Standardowa jakoÅÄ',
+      },
+    },
+   'RecordMode' => 'Tryb zapisu',
+   'RedMatrixColumn' => 'Kolumna matrycy czerwieni',
+   'RedTRC' => 'Krzywa reprodukcji czerwieni',
+   'ReferenceBlackWhite' => 'Para wartoÅci odniesienia dla czarno-biaÅego obrazu',
+   'RelatedImageFileFormat' => 'Format pliku powiÄ
+zanego zdjÄcia',
+   'RelatedImageHeight' => 'DÅugoÅÄ powiÄ
+zanego zdjÄcia',
+   'RelatedImageWidth' => 'SzerokoÅÄ powiÄ
+zanego zdjÄcia',
+   'RelatedSoundFile' => 'PowiÄ
+zany plik audio',
+   'ResolutionUnit' => {
+      Description => 'Jednostka rozdzielczoÅci X i Y',
+      PrintConv => {
+        'None' => 'Brak',
+        'cm' => 'centymetry',
+        'inches' => 'Cal',
+      },
+    },
+   'RetouchHistory' => {
+      PrintConv => {
+        'None' => 'Brak',
+      },
+    },
+   'Rotation' => {
+      PrintConv => {
+        'Horizontal' => '0Â° (gÃ³ra/lewo)',
+        'Horizontal (Normal)' => '0Â° (gÃ³ra/lewo)',
+        'Horizontal (normal)' => '0Â° (gÃ³ra/lewo)',
+        'Rotate 180' => '180Â° (dÃ³Å/prawo)',
+        'Rotate 270 CW' => '90Â° CW (lewo/dÃ³Å)',
+        'Rotate 90 CW' => '90Â° CCW (prawo/gÃ³ra)',
+        'Rotated 180' => '180Â° (dÃ³Å/prawo)',
+        'Rotated 270 CW' => '90Â° CW (lewo/dÃ³Å)',
+        'Rotated 90 CW' => '90Â° CCW (prawo/gÃ³ra)',
+      },
+    },
+   'RowsPerStrip' => 'Liczba rzÄdÃ³w w pasku',
+   'SamplesPerPixel' => 'Liczba skÅadnikÃ³w',
+   'Saturation' => {
+      Description => 'Nasycenie',
+      PrintConv => {
+        'High' => 'Wysokie nasycenie',
+        'Low' => 'Niskie nasycenie',
+        'Normal' => 'Standardowy',
+      },
+    },
+   'SceneCaptureType' => {
+      Description => 'UjÄcie z programem tematycznym',
+      PrintConv => {
+        'Landscape' => 'Krajobraz',
+        'Night' => 'Sceny nocne',
+        'Portrait' => 'Portret',
+        'Standard' => 'Standardowy',
+      },
+    },
+   'SceneMode' => {
+      PrintConv => {
+        'Sunset' => 'ZachÃ³d sÅoÅca',
+      },
+    },
+   'SceneType' => {
+      Description => 'Rodzaj sceny',
+      PrintConv => {
+        'Directly photographed' => 'ZdjÄcie uzyskane bezpoÅrednio',
+      },
+    },
+   'SensingMethod' => {
+      Description => 'Metoda pomiaru',
+      PrintConv => {
+        'Color sequential area' => 'Sekwencyjny sensor obszaru koloru',
+        'Color sequential linear' => 'Sekwencyjny liniowy sensor koloru',
+        'One-chip color area' => 'Jednoprocesorowy sensor obszaru koloru',
+        'Three-chip color area' => 'TrÃ³jprocesorowy sensor obszaru koloru',
+        'Trilinear' => 'TrÃ³j liniowy sensor',
+        'Two-chip color area' => 'Dwuprocesorowy sensor obszaru koloru',
+      },
+    },
+   'SequentialShot' => {
+      PrintConv => {
+        'None' => 'Brak',
+      },
+    },
+   'SerialNumber' => 'ID aparatu fotograficznego',
+   'ServiceIdentifier' => 'Identyfikator usÅugi',
+   'ShadingCompensation' => 'Kompensacja zacienienia',
+   'Sharpness' => {
+      Description => 'OstroÅÄ',
+      PrintConv => {
+        'Hard' => 'Ostry',
+        'Normal' => 'Standardowy',
+        'Soft' => 'MiÄkki',
+      },
+    },
+   'ShootingMode' => 'Tryb fotografowania',
+   'ShutterSpeed' => 'Czas ekspozycji',
+   'ShutterSpeedValue' => 'PrÄdkoÅÄ migawki',
+   'SlowShutter' => {
+      PrintConv => {
+        'None' => 'Brak',
+      },
+    },
+   'Software' => 'Oprogramowanie',
+   'Source' => 'Å¹rÃ³dÅo',
+   'SpatialFrequencyResponse' => 'Przestrzenno - czÄstotliwoÅciowa charakterystyka',
+   'SpecialEffectsOpticalFilter' => {
+      PrintConv => {
+        'None' => 'Brak',
+      },
+    },
+   'SpectralSensitivity' => 'CzuÅoÅÄ spektralna',
+   'State' => 'Region',
+   'StripByteCounts' => 'BajtÃ³w na skompresowany pasek',
+   'StripOffsets' => 'Lokalizacja danych zdjÄcia',
+   'SubSecTime' => '"Data i godzina, subsekundy"',
+   'SubSecTimeDigitized' => '"Cyfrowa data i godzina, subsekundy"',
+   'SubSecTimeOriginal' => '"Pierwotna data i godzina, sub-sekundy"',
+   'SubjectArea' => 'Obszar obiektu',
+   'SubjectDistance' => 'OdlegÅoÅÄ od obiektu',
+   'SubjectDistanceRange' => {
+      Description => 'Zakres odlegÅoÅci do obiektu',
+      PrintConv => {
+        'Close' => 'ZbliÅŒenie',
+        'Distant' => 'OdlegÅy plan',
+        'Macro' => 'Makro',
+      },
+    },
+   'SubjectLocation' => 'Lokalizacja obiektu',
+   'SubjectProgram' => {
+      PrintConv => {
+        'None' => 'Brak',
+      },
+    },
+   'SupplementalCategories' => 'Kategorie dodatkowe',
+   'Technology' => {
+      Description => 'Technologia',
+      PrintConv => {
+        'Active Matrix Display' => 'WyÅwietlacz z matrycÄ
+ aktywnÄ
+',
+        'Cathode Ray Tube Display' => 'WyÅwietlacz kineskopowy',
+        'Digital Camera' => 'Aparat cyfrowy',
+        'Dye Sublimation Printer' => 'Drukarka termosublimacyjna',
+        'Electrophotographic Printer' => 'Drukarka laserowa',
+        'Film Scanner' => 'Skaner do filmÃ³w',
+        'Film Writer' => 'Zapis na filmie',
+        'Ink Jet Printer' => 'Drukarka atramentowa',
+        'Passive Matrix Display' => 'WyÅwietlacz z matrycÄ
+ pasywnÄ
+',
+        'Photo CD' => 'Foto-CD',
+        'Photographic Paper Printer' => 'Drukarka z papierem fotograficznym',
+        'Projection Television' => 'Projektor telewizyjny',
+        'Reflective Scanner' => 'Skaner',
+        'Video Camera' => 'Kamera wideo',
+        'Video Monitor' => 'Monitor wideo',
+      },
+    },
+   'Teleconverter' => {
+      PrintConv => {
+        'None' => 'Brak',
+      },
+    },
+   'ThumbnailImage' => 'Miniatura',
+   'ThumbnailImageSize' => 'Rozmiar miniaturki',
+   'Title' => 'TytuÅ',
+   'ToningEffectMonochrome' => {
+      PrintConv => {
+        'None' => 'Brak',
+      },
+    },
+   'Track' => 'ÅcieÅŒka',
+   'TransferFunction' => 'Funkcja transferu',
+   'Transformation' => {
+      PrintConv => {
+        'Horizontal (normal)' => '0Â° (gÃ³ra/lewo)',
+        'Mirror horizontal' => '0Â° (gÃ³ra/prawo)',
+        'Mirror horizontal and rotate 270 CW' => '90Â° CW (lewo/gÃ³ra)',
+        'Mirror horizontal and rotate 90 CW' => '90Â° CCW (prawo/dÃ³Å)',
+        'Mirror vertical' => '180Â° (dÃ³Å/lewo)',
+        'Rotate 180' => '180Â° (dÃ³Å/prawo)',
+        'Rotate 270 CW' => '90Â° CW (lewo/dÃ³Å)',
+        'Rotate 90 CW' => '90Â° CCW (prawo/gÃ³ra)',
+      },
+    },
+   'TransmissionReference' => 'OdnoÅnik transmisji',
+   'UniqueCameraModel' => 'Unikatowy model aparatu',
+   'Unknown' => 'Nieznany',
+   'Urgency' => 'Priorytet',
+   'UserComment' => 'Komentarz uÅŒytkownika',
+   'VideoCardGamma' => 'Gamma karty graficznej',
+   'WBAdjLighting' => {
+      PrintConv => {
+        'None' => 'Brak',
+      },
+    },
+   'WhiteBalance' => {
+      Description => 'Balans bieli',
+      PrintConv => {
+        'Auto' => 'Automatyczny balans bieli',
+        'Black & White' => 'Monochromatyczny',
+        'Cloudy' => 'Pochmurna pogoda',
+        'Cool White Fluorescent' => 'JarzeniÃ³wka z zimnym biaÅym ÅwiatÅem',
+        'Custom 1' => 'WÅASNE 1',
+        'Custom 2' => 'WÅASNE 2',
+        'Custom 3' => 'WÅASNE 3',
+        'Custom 4' => 'WÅASNE 4',
+        'Day White Fluorescent' => 'JarzeniÃ³wka z naturalnym biaÅym ÅwiatÅem',
+        'Daylight' => 'ÅwiatÅo dzienne',
+        'Daylight Fluorescent' => 'JarzeniÃ³wka ze ÅwiatÅem dziennym',
+        'Fluorescent' => 'Jarzeniowy',
+        'Manual' => 'Manualny balans bieli',
+        'Shade' => 'CieÅ',
+        'Tungsten' => 'ÅwiatÅo ÅŒarÃ³wek',
+      },
+    },
+   'WhitePoint' => 'ChromatycznoÅÄ biaÅego punktu',
+   'Writer-Editor' => 'Autor podpisu',
+   'XResolution' => 'RozdzielczoÅÄ obrazu w poziomie',
+   'YCbCrCoefficients' => 'WspÃ³Åczynniki matrycy transformacji przestrzeni barwowej',
+   'YCbCrPositioning' => {
+      Description => 'Pozycje Y i C',
+      PrintConv => {
+        'Centered' => 'WyÅrodkowane',
+        'Co-sited' => 'Obok siebie (?)',
+      },
+    },
+   'YCbCrSubSampling' => 'WspÃ³Åczynnik podprÃ³bkowania(?) Y do C',
+   'YResolution' => 'RozdzielczoÅÄ obrazu w pionie',
+   'Year' => 'Rok',
+);
+
+1;  # end
+
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Lang::pl.pm - ExifTool Polish language translations
+
+=head1 DESCRIPTION
+
+This file is used by Image::ExifTool to generate localized tag descriptions
+and values.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Jens Duttke and Przemyslaw Sulek for providing this translation.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool(3pm)|Image::ExifTool>,
+L<Image::ExifTool::TagInfoXML(3pm)|Image::ExifTool::TagInfoXML>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/ru.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/ru.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/ru.pm	(revision 24799)
@@ -0,0 +1,778 @@
+#------------------------------------------------------------------------------
+# File:         ru.pm
+#
+# Description:  ExifTool Russian language translations
+#
+# Notes:        This file generated automatically by Image::ExifTool::TagInfoXML
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Lang::ru;
+
+use strict;
+use vars qw($VERSION);
+
+$VERSION = '1.02';
+
+%Image::ExifTool::Lang::ru::Translate = (
+   'ActiveArea' => 'ÐÐºÑÐžÐ²ÐœÐ°Ñ ÐŸÐ±Ð»Ð°ÑÑÑ',
+   'Album' => 'ÐÐ»ÑÐ±ÐŸÐŒ',
+   'AnalogBalance' => 'ÐÐœÐ°Ð»ÐŸÐ³ÐŸÐ²ÑÐ¹ Ð±Ð°Ð»Ð°ÐœÑ Ð±ÐµÐ»ÐŸÐ³ÐŸ',
+   'AntiAliasStrength' => 'ÐÑÐœÐŸÑÐžÑÐµÐ»ÑÐœÐ°Ñ ÑÐžÐ»Ð° ÑÐ³Ð»Ð°Ð¶ÐžÐ²Ð°ÑÑÐµÐ³ÐŸ ÑÐžÐ»ÑÑÑÐ° ÑÐµÐœÑÐŸÑÐ°',
+   'Aperture' => 'ÐÐžÐ°ÑÑÐ°Ð³ÐŒÐ°',
+   'ApertureValue' => 'ÐÐžÐ°ÑÑÐ°Ð³ÐŒÐ°',
+   'Artist' => 'ÐÑÐ¿ÐŸÐ»ÐœÐžÑÐµÐ»Ñ',
+   'AsShotICCProfile' => 'ICC Ð¿ÑÐŸÑÐžÐ»Ñ ÑÐœÐžÐŒÐºÐ°',
+   'AsShotNeutral' => 'ÐÐµÐ¹ÑÑÐ°Ð»ÑÐœÑÐ¹ ÑÐ²ÐµÑ Ð¿ÑÐž ÑÑÑÐŒÐºÐµ',
+   'AsShotPreProfileMatrix' => 'ÐÑÐµÐŽÐ²Ð°ÑÐžÑÐµÐ»ÑÐœÐ°Ñ ÑÐ²ÐµÑÐŸÐ²Ð°Ñ ÐŒÐ°ÑÑÐžÑÐ° ÑÐœÐžÐŒÐºÐ°',
+   'AsShotProfileName' => 'ÐÐŒÑ Ð¿ÑÐŸÑÐžÐ»Ñ, Ð°ÑÑÐŸÑÐžÐžÑÐŸÐ²Ð°ÐœÐœÐŸÐ³ÐŸ ÑÐŸ ÑÐœÐžÐŒÐºÐŸÐŒ',
+   'AsShotWhiteXY' => 'ÐÐµÐ¹ÑÑÐ°Ð»ÑÐœÑÐ¹ ÑÐ²ÐµÑ x,y',
+   'Author' => 'ÐÐ²ÑÐŸÑ',
+   'AuthorsPosition' => 'ÐÐŸÐ»Ð¶ÐœÐŸÑÑÑ Ð°Ð²ÑÐŸÑÐ°',
+   'BaselineExposure' => 'ÐÐ°Ð·ÐŸÐ²Ð°Ñ ÑÐºÑÐ¿ÐŸÐ·ÐžÑÐžÑ',
+   'BaselineNoise' => 'ÐÐ°Ð·ÐŸÐ²ÑÐ¹ ÑÑÐŒ',
+   'BaselineSharpness' => 'ÐÐ°Ð·ÐŸÐ²Ð°Ñ ÑÑÑÐºÐŸÑÑÑ',
+   'BayerGreenSplit' => 'Ð Ð°Ð·ÐŽÐµÐ»ÐµÐœÐžÐµ Ð·ÐµÐ»ÑÐœÑÑ
+ ÐºÐ°ÐœÐ°Ð»ÐŸÐ² Ð² ÐŒÐ°ÑÑÐžÑÐµ ÐÐ°Ð¹ÐµÑÐ°',
+   'BestQualityScale' => 'ÐÐ°ÑÑÑÐ°Ð± Ñ ÐœÐ°ÐžÐ»ÑÑÑÐžÐŒ ÐºÐ°ÑÐµÑÑÐ²ÐŸÐŒ',
+   'BitsPerSample' => 'ÐÐŸÐ»ÐžÑÐµÑÑÐ²ÐŸ Ð±ÐžÑ ÐœÐ° ÐºÐŸÐŒÐ¿ÐŸÐœÐµÐœÑ',
+   'BlackLevel' => 'Ð£ÑÐŸÐ²ÐµÐœÑ ÑÑÑÐœÐŸÐ³ÐŸ',
+   'BlackLevelDeltaH' => 'ÐÐŸÑÐžÐ·ÐŸÐœÑÐ°Ð»ÑÐœÐŸÐµ ÑÐ°ÑÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐžÐµ ÑÑÐŸÐ²ÐœÑ ÑÑÑÐœÐŸÐ³ÐŸ',
+   'BlackLevelDeltaV' => 'ÐÐµÑÑÐžÐºÐ°Ð»ÑÐœÐŸÐµ ÑÐ°ÑÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐžÐµ ÑÑÐŸÐ²ÐœÑ ÑÑÑÐœÐŸÐ³ÐŸ',
+   'BlackLevelRepeatDim' => 'Ð Ð°Ð·ÐŒÐµÑ ÐŒÐ°ÑÑÐžÑÑ ÑÑÐŸÐ²ÐœÐµÐ¹ ÑÑÑÐœÐŸÐ³ÐŸ',
+   'Brightness' => 'Ð¯ÑÐºÐŸÑÑÑ',
+   'By-line' => 'ÐÐ²ÑÐŸÑ',
+   'CFALayout' => {
+      Description => 'Ð¡ÑÑÑÐºÑÑÑÐ° CFA',
+      PrintConv => {
+        'Even columns offset down 1/2 row' => 'Ð¡ÐŒÐµÑÑÐœÐœÐŸÐµ ÑÐ°ÑÐ¿ÐŸÐ»ÐŸÐ¶ÐµÐœÐžÐµ A: ÑÑÑÐœÑÐµ ÑÑÐŸÐ»Ð±ÑÑ ÑÐŒÐµÑÐµÐœÑ Ð²ÐœÐžÐ· ÐœÐ° Ð¿ÐŸÐ»Ð¿ÐžÐºÑÐµÐ»Ð°',
+        'Even columns offset up 1/2 row' => 'Ð¡ÐŒÐµÑÑÐœÐœÐŸÐµ ÑÐ°ÑÐ¿ÐŸÐ»ÐŸÐ¶ÐµÐœÐžÐµ B: ÑÑÑÐœÑÐµ ÑÑÐŸÐ»Ð±ÑÑ ÑÐŒÐµÑÐµÐœÑ Ð²Ð²ÐµÑÑ
+ ÐœÐ° Ð¿ÐŸÐ»Ð¿ÐžÐºÑÐµÐ»Ð°',
+        'Even rows offset left 1/2 column' => 'Ð¡ÐŒÐµÑÑÐœÐœÐŸÐµ ÑÐ°ÑÐ¿ÐŸÐ»ÐŸÐ¶ÐµÐœÐžÐµ D: ÑÑÑÐœÑÐµ ÑÑÑÐŸÐºÐž ÑÐŒÐµÑÐµÐœÑ Ð²Ð»ÐµÐ²ÐŸ ÐœÐ° Ð¿ÐŸÐ»Ð¿ÐžÐºÑÐµÐ»Ð°',
+        'Even rows offset right 1/2 column' => 'Ð¡ÐŒÐµÑÑÐœÐœÐŸÐµ ÑÐ°ÑÐ¿ÐŸÐ»ÐŸÐ¶ÐµÐœÐžÐµ C: ÑÑÑÐœÑÐµ ÑÑÑÐŸÐºÐž ÑÐŒÐµÑÐµÐœÑ Ð²Ð¿ÑÐ°Ð²ÐŸ ÐœÐ° Ð¿ÐŸÐ»Ð¿ÐžÐºÑÐµÐ»Ð°',
+        'Rectangular' => 'ÐÑÑÐŒÐŸÑÐ³ÐŸÐ»ÑÐœÐŸÐµ (ÐžÐ»Ðž ÐºÐ²Ð°ÐŽÑÐ°ÑÐœÐŸÐµ) ÑÐ°ÑÐ¿ÐŸÐ»ÐŸÐ¶ÐµÐœÐžÐµ ÑÐ»ÐµÐŒÐµÐœÑÐŸÐ²',
+      },
+    },
+   'CFAPattern' => 'CFA ÐºÐ°ÑÑÐ°',
+   'CalibrationIlluminant1' => {
+      Description => 'ÐÐ°Ð»ÐžÐ±ÑÐŸÐ²ÐŸÑÐœÑÐ¹ ÐžÐ»Ð»ÑÐŒÐžÐœÐ°ÐœÑ â1',
+      PrintConv => {
+        'Cloudy' => 'ÐÐ±Ð»Ð°ÑÐœÐŸÑÑÑ',
+        'Cool White Fluorescent' => 'Ð€Ð»ÑÐŸÑÐµÑÑÐµÐœÑÐœÑÐ¹ Ð±ÐµÐ»ÑÐ¹ Ñ
+ÐŸÐ»ÐŸÐŽÐœÑÐ¹ (W 3800 - 4500K)',
+        'Day White Fluorescent' => 'Ð€Ð»ÑÐŸÑÐµÑÑÐµÐœÑÐœÑÐ¹ Ð±ÐµÐ»ÑÐ¹ ÐŽÐœÐµÐ²ÐœÐŸÐ¹',
+        'Daylight' => 'ÐÐœÐµÐ²ÐœÐŸÐ¹ ÑÐ²ÐµÑ',
+        'Daylight Fluorescent' => 'Ð€Ð»ÑÐŸÑÐµÑÑÐµÐœÑÐœÑÐ¹ Ð±ÐµÐ»ÑÐ¹ ÐŽÐœÐµÐ²ÐœÐŸÐ³ÐŸ ÑÐ²ÐµÑÐ° (D 5700 - 7100K)',
+        'Fine Weather' => 'Ð¯ÑÐœÐ°Ñ Ð¿ÐŸÐ³ÐŸÐŽÐ°',
+        'Flash' => 'ÐÑÐ¿ÑÑÐºÐ°',
+        'Fluorescent' => 'Ð€Ð»ÑÐŸÑÐµÑÑÐµÐœÑÐœÑÐ¹',
+        'ISO Studio Tungsten' => 'ISO ÐŽÐ»Ñ ÑÑÑÐŽÐžÐ¹ÐœÑÑ
+ Ð»Ð°ÐŒÐ¿ ÐœÐ°ÐºÐ°Ð»ÐžÐ²Ð°ÐœÐžÑ',
+        'Other' => 'ÐŽÑÑÐ³ÐŸÐ¹ ÐžÑÑÐŸÑÐœÐžÐº ÑÐ²ÐµÑÐ°',
+        'Shade' => 'Ð¢ÐµÐœÑ',
+        'Standard Light A' => 'Ð¡ÑÐ°ÐœÐŽÐ°ÑÑÐœÑÐ¹ ÑÐ²ÐµÑ A',
+        'Standard Light B' => 'Ð¡ÑÐ°ÐœÐŽÐ°ÑÑÐœÑÐ¹ ÑÐ²ÐµÑ B',
+        'Standard Light C' => 'Ð¡ÑÐ°ÐœÐŽÐ°ÑÑÐœÑÐ¹ ÑÐ²ÐµÑ C',
+        'Tungsten (Incandescent)' => 'ÐÐ°ÐŒÐ¿Ð° ÐœÐ°ÐºÐ°Ð»ÐžÐ²Ð°ÐœÐžÑ (ÑÑÐºÐžÐ¹ ÑÐ²ÐµÑ)',
+        'Unknown' => 'ÐœÐµÐžÐ·Ð²ÐµÑÑÐœÐŸ',
+        'Warm White Fluorescent' => 'Ð€Ð»ÑÐŸÑÐµÑÑÐµÐœÑÐœÑÐ¹ ÑÐµÐ¿Ð»ÑÐ¹ Ð±ÐµÐ»ÑÐ¹ (L 2600 - 3250K)',
+        'White Fluorescent' => 'Ð€Ð»ÑÐŸÑÐµÑÑÐµÐœÑÐœÑÐ¹ Ð±ÐµÐ»ÑÐ¹ (WW 3250 - 3800K)',
+      },
+    },
+   'CalibrationIlluminant2' => {
+      Description => 'ÐÐ°Ð»ÐžÐ±ÑÐŸÐ²ÐŸÑÐœÑÐ¹ ÐžÐ»Ð»ÑÐŒÐžÐœÐ°ÐœÑ â2',
+      PrintConv => {
+        'Cloudy' => 'ÐÐ±Ð»Ð°ÑÐœÐŸÑÑÑ',
+        'Cool White Fluorescent' => 'Ð€Ð»ÑÐŸÑÐµÑÑÐµÐœÑÐœÑÐ¹ Ð±ÐµÐ»ÑÐ¹ Ñ
+ÐŸÐ»ÐŸÐŽÐœÑÐ¹ (W 3800 - 4500K)',
+        'Day White Fluorescent' => 'Ð€Ð»ÑÐŸÑÐµÑÑÐµÐœÑÐœÑÐ¹ Ð±ÐµÐ»ÑÐ¹ ÐŽÐœÐµÐ²ÐœÐŸÐ¹',
+        'Daylight' => 'ÐÐœÐµÐ²ÐœÐŸÐ¹ ÑÐ²ÐµÑ',
+        'Daylight Fluorescent' => 'Ð€Ð»ÑÐŸÑÐµÑÑÐµÐœÑÐœÑÐ¹ Ð±ÐµÐ»ÑÐ¹ ÐŽÐœÐµÐ²ÐœÐŸÐ³ÐŸ ÑÐ²ÐµÑÐ° (D 5700 - 7100K)',
+        'Fine Weather' => 'Ð¯ÑÐœÐ°Ñ Ð¿ÐŸÐ³ÐŸÐŽÐ°',
+        'Flash' => 'ÐÑÐ¿ÑÑÐºÐ°',
+        'Fluorescent' => 'Ð€Ð»ÑÐŸÑÐµÑÑÐµÐœÑÐœÑÐ¹',
+        'ISO Studio Tungsten' => 'ISO ÐŽÐ»Ñ ÑÑÑÐŽÐžÐ¹ÐœÑÑ
+ Ð»Ð°ÐŒÐ¿ ÐœÐ°ÐºÐ°Ð»ÐžÐ²Ð°ÐœÐžÑ',
+        'Other' => 'ÐŽÑÑÐ³ÐŸÐ¹ ÐžÑÑÐŸÑÐœÐžÐº ÑÐ²ÐµÑÐ°',
+        'Shade' => 'Ð¢ÐµÐœÑ',
+        'Standard Light A' => 'Ð¡ÑÐ°ÐœÐŽÐ°ÑÑÐœÑÐ¹ ÑÐ²ÐµÑ A',
+        'Standard Light B' => 'Ð¡ÑÐ°ÐœÐŽÐ°ÑÑÐœÑÐ¹ ÑÐ²ÐµÑ B',
+        'Standard Light C' => 'Ð¡ÑÐ°ÐœÐŽÐ°ÑÑÐœÑÐ¹ ÑÐ²ÐµÑ C',
+        'Tungsten (Incandescent)' => 'ÐÐ°ÐŒÐ¿Ð° ÐœÐ°ÐºÐ°Ð»ÐžÐ²Ð°ÐœÐžÑ (ÑÑÐºÐžÐ¹ ÑÐ²ÐµÑ)',
+        'Unknown' => 'ÐœÐµÐžÐ·Ð²ÐµÑÑÐœÐŸ',
+        'Warm White Fluorescent' => 'Ð€Ð»ÑÐŸÑÐµÑÑÐµÐœÑÐœÑÐ¹ ÑÐµÐ¿Ð»ÑÐ¹ Ð±ÐµÐ»ÑÐ¹ (L 2600 - 3250K)',
+        'White Fluorescent' => 'Ð€Ð»ÑÐŸÑÐµÑÑÐµÐœÑÐœÑÐ¹ Ð±ÐµÐ»ÑÐ¹ (WW 3250 - 3800K)',
+      },
+    },
+   'CameraCalibration1' => 'ÐÐ°Ð»ÐžÐ±ÑÐŸÐ²ÐŸÑÐœÐ°Ñ ÐŒÐ°ÑÑÐžÑÐ° ÑÐŸÑÐŸÐ°Ð¿Ð¿Ð°ÑÐ°ÑÐ° â1',
+   'CameraCalibration2' => 'ÐÐ°Ð»ÐžÐ±ÑÐŸÐ²ÐŸÑÐœÐ°Ñ ÐŒÐ°ÑÑÐžÑÐ° ÑÐŸÑÐŸÐ°Ð¿Ð¿Ð°ÑÐ°ÑÐ° â2',
+   'CameraCalibrationSig' => 'Ð¡ÐžÐ³ÐœÐ°ÑÑÑÐ° ÐºÐ°Ð»ÐžÐ±ÑÐŸÐ²ÐºÐž ÑÐŸÑÐŸÐ°Ð¿Ð¿Ð°ÑÐ°ÑÐ°',
+   'CameraSerialNumber' => 'Ð¡ÐµÑÐžÐ¹ÐœÑÐ¹ ÐœÐŸÐŒÐµÑ ÑÐŸÑÐŸÐ°Ð¿Ð¿Ð°ÑÐ°ÑÐ°',
+   'Caption-Abstract' => 'ÐÐŸÐŽÐ¿ÐžÑÑ',
+   'CaptionWriter' => 'ÐÐ²ÑÐŸÑ Ð¿ÐŸÐŽÐ¿ÐžÑÐž',
+   'Categories' => 'ÐÐ°ÑÐµÐ³ÐŸÑÐžÐž',
+   'Category' => 'ÐÐ°ÑÐµÐ³ÐŸÑÐžÐž',
+   'ChromaBlurRadius' => 'Ð Ð°ÐŽÐžÑÑ ÑÐ³Ð»Ð°Ð¶ÐžÐ²Ð°ÐœÐžÑ ÑÐ²ÐµÑÐœÐŸÑÑÐž',
+   'City' => 'ÐÐŸÑÐŸÐŽ',
+   'ColorEffect' => {
+      PrintConv => {
+        'Sepia' => 'Ð¡ÐµÐ¿ÐžÑ',
+      },
+    },
+   'ColorFilter' => 'ÐŠÐ²ÐµÑÐŸÐ²ÐŸÐ¹ ÑÐžÐ»ÑÑÑ',
+   'ColorMatrix1' => 'ÐŠÐ²ÐµÑÐŸÐ²Ð°Ñ ÐŒÐ°ÑÑÐžÑÐ° â1',
+   'ColorMatrix2' => 'ÐŠÐ²ÐµÑÐŸÐ²Ð°Ñ ÐŒÐ°ÑÑÐžÑÐ° â2',
+   'ColorMode' => {
+      Description => 'Ð¢Ð²ÐŸÑÑÐµÑÐºÐžÐ¹Ð¡ÑÐžÐ»Ñ',
+      PrintConv => {
+        'Autumn Leaves' => 'ÐÑÐµÐœÐœÐžÐµ Ð»ÐžÑÑÑÑ',
+        'B&W' => 'Ð§ÐµÑÐœÐŸ-Ð±ÐµÐ»ÐŸÐµ',
+        'Clear' => 'ÐÑÐŸÐ·ÑÐ°ÑÐœÑÐ¹',
+        'Deep' => 'ÐÐ»ÑÐ±ÐŸÐºÐžÐ¹',
+        'Landscape' => 'ÐÐµÐ¹Ð·Ð°Ð¶',
+        'Light' => 'ÐÐ»ÐµÐŽÐœÑÐ¹',
+        'Neutral' => 'ÐÐµÐ¹ÑÑÐ°Ð»ÑÐœÑÐ¹',
+        'Night View' => 'ÐÐŸÑÐœÐŸÐ¹ Ð²ÐžÐŽ',
+        'Night View/Portrait' => 'ÐÐŸÑÐœÐŸÐ¹ Ð¿ÐŸÑÑÑÐµÑ',
+        'Portrait' => 'ÐÐŸÑÑÑÐµÑ',
+        'Standard' => 'Ð¡ÑÐ°ÐœÐŽÐ°ÑÑÐœÐŸÐµ',
+        'Sunset' => 'ÐÐ°ÐºÐ°Ñ',
+        'Vivid' => 'Ð¯ÑÐºÐžÐ¹ ÑÐ²ÐµÑ',
+      },
+    },
+   'ColorSpace' => {
+      Description => 'ÐÐ°ÐœÐœÑÐµ ÐŸ ÑÐ²ÐµÑÐŸÐ²ÐŸÐ¹ ÑÑÐµÐŽÐµ',
+      PrintConv => {
+        'ICC Profile' => 'ÐÑÐŸÑÐžÐ»Ñ ICC',
+        'Uncalibrated' => 'ÐÐµ ÐºÐ°Ð»ÐžÐ±ÑÐŸÐ²Ð°ÐœÐœÑÐ¹',
+      },
+    },
+   'ColorTemperature' => 'ÐŠÐ²ÐµÑÐŸÐ²Ð°Ñ ÑÐµÐŒÐ¿ÐµÑÐ°ÑÑÑÐ°',
+   'ColorimetricReference' => 'ÐÐŸÐ»ÐŸÑÐžÐŒÐµÑÑÐžÑÐµÑÐºÐžÐ¹ ÑÑÐ°Ð»ÐŸÐœ',
+   'Comment' => 'ÐÐŸÐŒÐŒÐµÐœÑÐ°ÑÐžÐ¹',
+   'ComponentsConfiguration' => 'ÐÐœÐ°ÑÐµÐœÐžÐµ ÐºÐ°Ð¶ÐŽÐŸÐ³ÐŸ ÐºÐŸÐŒÐ¿ÐŸÐœÐµÐœÑÐ°',
+   'CompressedBitsPerPixel' => 'Ð ÐµÐ¶ÐžÐŒ ÑÐ¶Ð°ÑÐžÑ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ',
+   'Compression' => {
+      Description => 'Ð¡Ñ
+ÐµÐŒÐ° ÑÐ¶Ð°ÑÐžÑ',
+      PrintConv => {
+        'JPEG' => 'JPEG ÑÐ¶Ð°ÑÐžÐµ',
+        'Uncompressed' => 'Ð±ÐµÐ· ÑÐ¶Ð°ÑÐžÑ',
+      },
+    },
+   'Contrast' => {
+      Description => 'ÐÐŸÐœÑÑÐ°ÑÑÐœÐŸÑÑÑ',
+      PrintConv => {
+        'High' => 'Ð ÐµÐ·ÐºÐŸ',
+        'Low' => 'ÐÑÐ³ÐºÐŸ',
+        'Normal' => 'Ð¡ÑÐ°ÐœÐŽÐ°ÑÑ',
+      },
+    },
+   'Copyright' => 'ÐÐ»Ð°ÐŽÐµÐ»ÐµÑ ÐºÐŸÐ¿ÐžÑÐ°Ð¹ÑÐ°',
+   'CopyrightNotice' => 'Ð£Ð²ÐµÐŽÐŸÐŒÐ»ÐµÐœÐžÐµ ÐŸÐ± Ð°Ð²ÑÐŸÑÑÐºÐžÑ
+ Ð¿ÑÐ°Ð²Ð°Ñ
+',
+   'Country' => 'Ð¡ÑÑÐ°ÐœÐ°',
+   'Country-PrimaryLocationName' => 'Ð¡ÑÑÐ°ÐœÐ°',
+   'CreateDate' => 'ÐÐ°ÑÐ° ÑÐŸÐ·ÐŽÐ°ÐœÐžÑ',
+   'CreationDate' => 'ÐÐ°ÑÐ° ÑÐŸÐ·ÐŽÐ°ÐœÐžÑ',
+   'Credit' => 'Ð€Ð°ÐŒÐžÐ»ÐžÑ',
+   'CurrentICCProfile' => 'Ð¢ÐµÐºÑÑÐžÐ¹ ICC Ð¿ÑÐŸÑÐžÐ»Ñ',
+   'CurrentPreProfileMatrix' => 'Ð¢ÐµÐºÑÑÐ°Ñ Ð¿ÑÐµÐŽÐ²Ð°ÑÐžÑÐµÐ»ÑÐœÐ°Ñ ÑÐ²ÐµÑÐŸÐ²Ð°Ñ ÐŒÐ°ÑÑÐžÑÐ°',
+   'CustomRendered' => {
+      Description => 'ÐÐ±ÑÐ°Ð±ÐŸÑÐºÐ° ÑÐœÐžÐŒÐºÐŸÐ² Ð¿ÐŸ Ð¿ÐµÑÑÐŸÐœÐ°Ð»ÑÐœÑÐŒ ÐœÐ°ÑÑÑÐŸÐ¹ÐºÐ°ÐŒ',
+      PrintConv => {
+        'Custom' => '"ÐÑÐŸÑÐµÑÑ, ÐœÐ°ÑÑÑÐŸÐµÐœÐœÑÐ¹ Ð¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÐµÐ»ÐµÐŒ"',
+        'Normal' => 'ÐÐŸÑÐŒÐ°Ð»ÑÐœÑÐ¹ Ð¿ÑÐŸÑÐµÑÑ',
+      },
+    },
+   'DNGBackwardVersion' => 'Ð¡ÐŸÐ²ÐŒÐµÑÑÐžÐŒÐ°Ñ Ð²ÐµÑÑÐžÑ DNG',
+   'DNGLensInfo' => 'ÐÐžÐœÐžÐŒÐ°Ð»ÑÐœÐŸÐµ ÑÐŸÐºÑÑÐœÐŸÐµ ÑÐ°ÑÑÑÐŸÑÐœÐžÐµ',
+   'DNGVersion' => 'ÐÐµÑÑÐžÑ DNG',
+   'DateCreated' => 'ÐÐ°ÑÐ° ÑÐŸÐ·ÐŽÐ°ÐœÐžÑ',
+   'DateTimeOriginal' => 'ÐÑÑ
+ÐŸÐŽÐœÐ°Ñ ÐŽÐ°ÑÐ° Ðž Ð²ÑÐµÐŒÑ',
+   'DefaultCropOrigin' => 'ÐÐŸÐ»ÐŸÐ¶ÐµÐœÐžÐµ ÐŸÐ±ÑÐµÐ·Ð°ÐœÐœÐŸÐ³ÐŸ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ Ð¿ÐŸ-ÑÐŒÐŸÐ»ÑÐ°ÐœÐžÑ',
+   'DefaultCropSize' => 'Ð Ð°Ð·ÐŒÐµÑ ÐŸÐ±ÑÐµÐ·Ð°ÐœÐœÐŸÐ³ÐŸ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ Ð¿ÐŸ-ÑÐŒÐŸÐ»ÑÐ°ÐœÐžÑ',
+   'DefaultScale' => 'Ð¡ÑÐ°ÐœÐŽÐ°ÑÑÐœÑÐ¹ ÐŒÐ°ÑÑÑÐ°Ð±',
+   'DeviceSettingDescription' => 'ÐÐ¿ÐžÑÐ°ÐœÐžÐµ ÐœÐ°ÑÑÑÐŸÐµÐº ÑÑÑÑÐŸÐ¹ÑÑÐ²Ð°',
+   'DigitalZoom' => 'ÐŠÐžÑÑÐŸÐ²ÐŸÐ¹ Ð·ÑÐŒ',
+   'DigitalZoomRatio' => 'ÐÐŸÐºÐ°Ð·Ð°ÑÐµÐ»Ñ ÑÐžÑÑÐŸÐ²ÐŸÐ³ÐŸ Ð·ÑÐŒÐ°',
+   'Directory' => '"Ð€Ð°Ð¹Ð», ÑÐ°Ð·ÐŒÐµÑÐµÐœÐžÐµ"',
+   'DriveMode' => 'Ð ÐµÐ¶ÐžÐŒ ÑÐ¿ÑÑÐºÐ°',
+   'DynamicRangeOptimizer' => {
+      Description => 'ÐÐ¿ÑÐžÐŒ.Ð-ÐŽÐžÐ°Ð¿Ð°Ð·.',
+      PrintConv => {
+        'Advanced Auto' => 'Ð£Ð»ÑÑÑ.Ð°Ð²ÑÐŸ',
+        'Advanced Lv1' => 'Ð£Ð»ÑÑÑ.ÑÑÐŸÐ²ÐµÐœÑ1',
+        'Advanced Lv2' => 'Ð£Ð»ÑÑÑ.ÑÑÐŸÐ²ÐµÐœÑ2',
+        'Advanced Lv3' => 'Ð£Ð»ÑÑÑ.ÑÑÐŸÐ²ÐµÐœÑ3',
+        'Advanced Lv4' => 'Ð£Ð»ÑÑÑ.ÑÑÐŸÐ²ÐµÐœÑ4',
+        'Advanced Lv5' => 'Ð£Ð»ÑÑÑ.ÑÑÐŸÐ²ÐµÐœÑ5',
+        'Auto' => 'ÐÐ²ÑÐŸ',
+        'Off' => 'ÐÑÐºÐ»ÑÑÐµÐœÐŸ',
+        'Standard' => 'Ð¡ÑÐ°ÐœÐŽÐ°ÑÑÐœÐŸÐµ',
+      },
+    },
+   'ExifImageHeight' => 'ÐÐŸÐ¿ÑÑÑÐžÐŒÐ°Ñ Ð²ÑÑÐŸÑÐ° ÑÐœÐžÐŒÐºÐ°',
+   'ExifImageWidth' => 'ÐÐŸÐ¿ÑÑÑÐžÐŒÐ°Ñ ÑÐžÑÐžÐœÐ° ÑÐœÐžÐŒÐºÐ°',
+   'ExifOffset' => 'Exif IFD ÑÐºÐ°Ð·Ð°ÑÐµÐ»Ñ',
+   'ExifVersion' => 'Exif Ð²ÐµÑÑÐžÑ',
+   'ExposureCompensation' => '"Ð­ÐºÑÐ¿ÐŸÐ·ÐžÑÐžÑ, ÐºÐ°Ð»ÐžÐ±ÑÐŸÐ²ÐºÐ°"',
+   'ExposureIndex' => '"Ð­ÐºÑÐ¿ÐŸÐ·ÐžÑÐžÑ, Ð¿ÐŸÐºÐ°Ð·Ð°ÑÐµÐ»Ñ"',
+   'ExposureMode' => {
+      Description => '"Ð­ÐºÑÐ¿ÐŸÐ·ÐžÑÐžÑ, ÑÐµÐ¶ÐžÐŒ"',
+      PrintConv => {
+        'Auto' => 'ÐÐ²ÑÐŸÑÐºÑÐ¿ÐŸÐ·ÐžÑÐžÑ',
+        'Auto bracket' => 'ÐÐ²ÑÐŸÐ±ÑÑÐºÐµÑÐžÐœÐ³',
+        'Manual' => 'Ð ÑÑÐœÐ°Ñ ÑÐºÑÐ¿ÐŸÐ·ÐžÑÐžÑ',
+      },
+    },
+   'ExposureProgram' => {
+      Description => 'Ð­ÐºÑÐ¿ÐŸÐ·ÐžÑÐžÑ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐœÐ°Ñ',
+      PrintConv => {
+        'Action (High speed)' => 'Ð­ÐºÑÐµÐœ/Ð±ÐŸÐµÐ²ÐžÐº',
+        'Aperture-priority AE' => 'ÐÑÐžÐŸÑÐžÑÐµÑ ÐŽÐžÐ°ÑÑÐ°Ð³ÐŒÑ',
+        'Bulb' => 'ÐÐ°ÐŒÐ¿Ð°',
+        'Creative (Slow speed)' => 'Ð¢Ð²ÐŸÑÑÐµÑÐºÐ°Ñ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐ°',
+        'Landscape' => 'ÐÐµÐ¹Ð·Ð°Ð¶',
+        'Manual' => '"Ð­ÐºÑÐ¿ÐŸÐ·ÐžÑÐžÑ, ÑÑÑÐœÐ°Ñ"',
+        'Portrait' => 'ÐÐŸÑÑÑÐµÑ',
+        'Program AE' => 'ÐÐŸÑÐŒÐ°Ð»ÑÐœÐ°Ñ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐ°',
+        'Shutter speed priority AE' => 'ÐÑÐžÐŸÑÐžÑÐµÑ Ð²ÑÐŽÐµÑÐ¶ÐºÐž',
+      },
+    },
+   'ExposureTime' => 'ÐÑÐŽÐµÑÐ¶ÐºÐ°',
+   'FNumber' => 'ÐÐžÐ°ÑÑÐ°Ð³ÐŒÐ°',
+   'FileFormat' => 'Ð€ÐŸÑÐŒÐ°Ñ',
+   'FileModifyDate' => 'ÐÐ°ÑÐ° ÐŸÐ±ÐœÐŸÐ²Ð»ÐµÐœÐžÑ',
+   'FileName' => 'ÐÐŒÑ ÑÐ°Ð¹Ð»Ð°',
+   'FileSize' => 'Ð Ð°Ð·ÐŒÐµÑ ÑÐ°Ð¹Ð»Ð°',
+   'FileSource' => {
+      Description => 'ÐÑÑÐŸÑÐœÐžÐº ÑÐ°Ð¹Ð»Ð°',
+      PrintConv => {
+        'Digital Camera' => 'DSC',
+        'Film Scanner' => 'Ð¡ÐºÐ°ÐœÐœÐµÑ Ð¿ÑÐŸÑÐ²ÐµÑÐžÐ²Ð°ÑÑÐµÐ³ÐŸ ÑÐžÐ¿Ð°',
+        'Reflection Print Scanner' => 'Ð¡ÐºÐ°ÐœÐœÐµÑ ÐŸÑÑÐ°Ð¶Ð°ÑÑÐµÐ³ÐŸ ÑÐžÐ¿Ð°',
+      },
+    },
+   'FileType' => 'Ð¢ÐžÐ¿ ÑÐ°Ð¹Ð»Ð°',
+   'Flash' => {
+      Description => 'ÐÑÐ¿ÑÑÐºÐ°',
+      PrintConv => {
+        'Auto, Fired' => 'ÐÐºÐ». (Ð°Ð²ÑÐŸÐŒÐ°ÑÐžÑÐµÑÐºÐ°Ñ Ð²ÑÐ¿ÑÑÐºÐ°)',
+        'Auto, Fired, Red-eye reduction' => '"ÐÐºÐ». (Ð°Ð²ÑÐŸÐŒÐ°ÑÐžÑÐµÑÐºÐ°Ñ Ð²ÑÐ¿ÑÑÐºÐ°, ÑÐœÐžÐ¶ÐµÐœÐžÐµ ÑÑÑÐµÐºÑÐ° Â«ÐºÑÐ°ÑÐœÑÑ
+ Ð³Ð»Ð°Ð·Â»)"',
+        'Auto, Fired, Red-eye reduction, Return detected' => '"ÐÐºÐ». (Ð°Ð²ÑÐŸÐŒÐ°ÑÐžÑÐµÑÐºÐ°Ñ Ð²ÑÐ¿ÑÑÐºÐ°, ÑÐœÐžÐ¶ÐµÐœÐžÐµ ÑÑÑÐµÐºÑÐ° Â«ÐºÑÐ°ÑÐœÑÑ
+ Ð³Ð»Ð°Ð·Â», ÑÐµÐ³ÐžÑÑÑÐ°ÑÐžÑ ÐŸÑÑÐ°Ð¶ÐµÐœÐœÐŸÐ³ÐŸ Ð»ÑÑÐ°)"',
+        'Auto, Fired, Return detected' => '"ÐÐºÐ». (Ð°Ð²ÑÐŸÐŒÐ°ÑÐžÑÐµÑÐºÐ°Ñ Ð²ÑÐ¿ÑÑÐºÐ°, ÑÐµÐ³ÐžÑÑÑÐ°ÑÐžÑ ÐŸÑÑÐ°Ð¶ÐµÐœÐœÐŸÐ³ÐŸ Ð»ÑÑÐ°)"',
+        'Did not fire' => 'ÐÑÐ¿ÑÑÐºÐ° ÐœÐµ ÑÑÐ°Ð±ÐŸÑÐ°Ð»Ð°',
+        'Fired' => 'ÐÑÐ¿ÑÑÐºÐ° ÑÑÐ°Ð±ÐŸÑÐ°Ð»Ð°',
+        'Fired, Red-eye reduction' => 'ÐÐºÐ». (ÑÐœÐžÐ¶ÐµÐœÐžÐµ ÑÑÑÐµÐºÑÐ° Â«ÐºÑÐ°ÑÐœÑÑ
+ Ð³Ð»Ð°Ð·Â»)',
+        'Fired, Red-eye reduction, Return detected' => '"ÐÐºÐ». (ÑÐœÐžÐ¶ÐµÐœÐžÐµ ÑÑÑÐµÐºÑÐ° Â«ÐºÑÐ°ÑÐœÑÑ
+ Ð³Ð»Ð°Ð·Â», ÑÐµÐ³ÐžÑÑÑÐ°ÑÐžÑ ÐŸÑÑÐ°Ð¶ÐµÐœÐœÐŸÐ³ÐŸ Ð»ÑÑÐ°)"',
+        'Fired, Return detected' => 'ÐÐºÐ». (ÑÐµÐ³ÐžÑÑÑÐ°ÑÐžÑ ÐŸÑÑÐ°Ð¶ÐµÐœÐœÐŸÐ³ÐŸ Ð»ÑÑÐ°)',
+        'No Flash' => 'ÐÐµÑ ÑÑÐœÐºÑÐžÐž Ð²ÑÐ¿ÑÑÐºÐž',
+        'On, Fired' => 'ÐÐºÐ». (Ð¿ÑÐžÐœÑÐŽÐžÑÐµÐ»ÑÐœÐ°Ñ)',
+        'On, Red-eye reduction' => '"ÐÐºÐ». (Ð¿ÑÐžÐœÑÐŽÐžÑÐµÐ»ÑÐœÐ°Ñ, ÑÐœÐžÐ¶ÐµÐœÐžÐµ ÑÑÑÐµÐºÑÐ° Â«ÐºÑÐ°ÑÐœÑÑ
+ Ð³Ð»Ð°Ð·Â»)"',
+        'On, Red-eye reduction, Return detected' => '"ÐÐºÐ». (Ð¿ÑÐžÐœÑÐŽÐžÑÐµÐ»ÑÐœÐ°Ñ, ÑÐœÐžÐ¶ÐµÐœÐžÐµ ÑÑÑÐµÐºÑÐ° Â«ÐºÑÐ°ÑÐœÑÑ
+ Ð³Ð»Ð°Ð·Â», ÑÐµÐ³ÐžÑÑÑÐ°ÑÐžÑ ÐŸÑÑÐ°Ð¶ÐµÐœÐœÐŸÐ³ÐŸ Ð»ÑÑÐ°)"',
+        'On, Return detected' => '"ÐÐºÐ». (Ð¿ÑÐžÐœÑÐŽÐžÑÐµÐ»ÑÐœÐ°Ñ, ÑÐµÐ³ÐžÑÑÑÐ°ÑÐžÑ ÐŸÑÑÐ°Ð¶ÐµÐœÐœÐŸÐ³ÐŸ Ð»ÑÑÐ°)"',
+      },
+    },
+   'FlashEnergy' => 'ÐÐŸÑÐœÐŸÑÑÑ Ð²ÑÐ¿ÑÑÐºÐž',
+   'FlashExposureComp' => 'ÐÐŸÑÑÐµÐºÑÐžÑ Ð²ÑÐ¿ÑÑÐºÐž',
+   'FlashpixVersion' => 'ÐÐŸÐŽÐŽÐµÑÐ¶ÐžÐ²Ð°ÐµÐŒÐ°Ñ Ð²ÐµÑÑÐžÑ Flashpix',
+   'FocalLength' => 'Ð€ÐŸÐºÑÑÐœÐŸÐµ ÑÐ°ÑÑÑÐŸÑÐœÐžÐµ',
+   'FocalLength35efl' => 'Ð€ÐŸÐºÑÑÐœÐŸÐµ ÑÐ°ÑÑÑÐŸÑÐœÐžÐµ (Ð¿ÑÐžÐ²ÐµÐŽÐµÐœÐŸ Ðº 35 ÐŒÐŒ)',
+   'FocalLengthIn35mmFormat' => 'Ð€ÐŸÐºÑÑÐœÐŸÐµ ÑÐ°ÑÑÑÐŸÑÐœÐžÐµ ÐŽÐ»Ñ 35-ÐŒÐŒ ÑÐŸÑÐŸÐ¿Ð»ÐµÐœÐºÐž',
+   'FocalPlaneResolutionUnit' => {
+      Description => 'Ð­Ð»ÐµÐŒÐµÐœÑ ÑÐ°Ð·ÑÐµÑÐµÐœÐžÑ Ð² ÑÐŸÐºÐ°Ð»ÑÐœÐŸÐ¹ Ð¿Ð»ÐŸÑÐºÐŸÑÑÐž',
+      PrintConv => {
+        'inches' => 'ÐŽÑÐ¹ÐŒ',
+      },
+    },
+   'FocalPlaneXResolution' => 'Ð Ð°Ð·ÑÐµÑÐµÐœÐžÐµ Ð² ÑÐŸÐºÐ°Ð»ÑÐœÐŸÐ¹ Ð¿Ð»ÐŸÑÐºÐŸÑÑÐž Ð¿ÐŸ X',
+   'FocalPlaneYResolution' => 'Ð Ð°Ð·ÑÐµÑÐµÐœÐžÐµ Ð² ÑÐŸÐºÐ°Ð»ÑÐœÐŸÐ¹ Ð¿Ð»ÐŸÑÐºÐŸÑÑÐž Ð¿ÐŸ Y',
+   'FocusMode' => 'Ð€ÐŸÐºÑÑÐžÑÐŸÐ²ÐºÐ°',
+   'ForwardMatrix1' => 'ÐÑÑÐŒÐ°Ñ ÐŒÐ°ÑÑÐžÑÐ° â1',
+   'ForwardMatrix2' => 'ÐÑÑÐŒÐ°Ñ ÐŒÐ°ÑÑÐžÑÐ° â2',
+   'FrameRate' => 'ÐÐ»ÐŸÑÐœÐŸÑÑÑ ÐºÐ°ÐŽÑÐŸÐ²',
+   'FrameSize' => '"ÐÐ°ÐŽÑ, ÑÐ°Ð·ÐŒÐµÑ"',
+   'GPSAltitude' => 'ÐÑÑÐŸÑÐ°',
+   'GPSAltitudeRef' => {
+      Description => 'ÐÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐžÐµ Ð¿ÐŸ Ð²ÑÑÐŸÑÐµ',
+      PrintConv => {
+        'Above Sea Level' => 'Ð£ÑÐŸÐ²ÐµÐœÑ ÐŒÐŸÑÑ',
+        'Below Sea Level' => 'ÐÐ¿ÐŸÑÐœÐŸÐµ Ð·ÐœÐ°ÑÐµÐœÐžÐµ ÑÑÐŸÐ²ÐœÑ ÐŒÐŸÑÑ (ÐœÐµÐ³Ð°ÑÐžÐ²ÐœÐŸÐµ Ð·ÐœÐ°ÑÐµÐœÐžÐµ)',
+      },
+    },
+   'GPSAreaInformation' => 'ÐÐ°Ð·Ð²Ð°ÐœÐžÐµ ÐŸÐ±Ð»Ð°ÑÑÐž GPS',
+   'GPSDOP' => 'Ð¢ÐŸÑÐœÐŸÑÑÑ ÐžÐ·ÐŒÐµÑÐµÐœÐžÑ',
+   'GPSDateStamp' => 'ÐÐ°ÑÐ° GPS',
+   'GPSDestBearing' => 'ÐÐ·ÐžÐŒÑÑ Ð¿ÑÐœÐºÑÐ° ÐœÐ°Ð·ÐœÐ°ÑÐµÐœÐžÑ',
+   'GPSDestBearingRef' => 'ÐÐ¿ÐŸÑÐœÐ°Ñ Ð²ÐµÐ»ÐžÑÐžÐœÐ° ÐŽÐ»Ñ Ð°Ð·ÐžÐŒÑÑÐ° Ð¿ÑÐœÐºÑÐ° ÐœÐ°Ð·ÐœÐ°ÑÐµÐœÐžÑ',
+   'GPSDestDistance' => 'Ð Ð°ÑÑÑÐŸÑÐœÐžÐµ ÐŽÐŸ Ð¿ÑÐœÐºÑÐ° ÐœÐ°Ð·ÐœÐ°ÑÐµÐœÐžÑ',
+   'GPSDestDistanceRef' => 'ÐÐ¿ÐŸÑÐœÐ°Ñ Ð²ÐµÐ»ÐžÑÐžÐœÐ° ÑÐ°ÑÑÑÐŸÑÐœÐžÑ ÐŽÐŸ Ð¿ÑÐœÐºÑÐ° ÐœÐ°Ð·ÐœÐ°ÑÐµÐœÐžÑ',
+   'GPSDestLatitude' => 'ÐšÐžÑÐŸÑÐ° Ð¿ÑÐœÐºÑÐ° ÐœÐ°Ð·ÐœÐ°ÑÐµÐœÐžÑ',
+   'GPSDestLatitudeRef' => 'ÐÐ¿ÐŸÑÐœÐ°Ñ Ð²ÐµÐ»ÐžÑÐžÐœÐ° ÐŽÐ»Ñ ÑÐžÑÐŸÑÑ Ð¿ÑÐœÐºÑÐ° ÐœÐ°Ð·ÐœÐ°ÑÐµÐœÐžÑ',
+   'GPSDestLongitude' => 'ÐÐŸÐ»Ð³ÐŸÑÐ° Ð¿ÑÐœÐºÑÐ° ÐœÐ°Ð·ÐœÐ°ÑÐµÐœÐžÑ',
+   'GPSDestLongitudeRef' => 'ÐÐ¿ÐŸÑÐœÐ°Ñ Ð²ÐµÐ»ÐžÑÐžÐœÐ° ÐŽÐ»Ñ ÐŽÐŸÐ»Ð³ÐŸÑÑ Ð¿ÑÐœÐºÑÐ° ÐœÐ°Ð·ÐœÐ°ÑÐµÐœÐžÑ',
+   'GPSDifferential' => {
+      Description => 'ÐÐžÑÑÐµÑÐµÐœÑÐžÐ°Ð»ÑÐœÐ°Ñ ÐºÐŸÑÑÐµÐºÑÐžÑ GPS',
+      PrintConv => {
+        'Differential Corrected' => 'ÐÐžÑÑÐµÑÐµÐœÑÐžÐ°Ð»ÑÐœÐ°Ñ ÐºÐŸÑÑÐµÐºÑÐžÑ Ð¿ÑÐžÐŒÐµÐœÐµÐœÐ°',
+        'No Correction' => 'ÐÐ·ÐŒÐµÑÐµÐœÐžÐµ Ð±ÐµÐ· ÐŽÐžÑÑÐµÑÐµÐœÑÐžÐ°Ð»ÑÐœÐŸÐ¹ ÐºÐŸÑÑÐµÐºÑÐžÐž',
+      },
+    },
+   'GPSImgDirection' => 'ÐÐ°Ð¿ÑÐ°Ð²Ð»ÐµÐœÐžÐµ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ',
+   'GPSImgDirectionRef' => 'ÐÐ¿ÐŸÑÐœÐ°Ñ Ð²ÐµÐ»ÐžÑÐžÐœÐ° ÐŽÐ»Ñ ÐœÐ°Ð¿ÑÐ°Ð²Ð»ÐµÐœÐžÑ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ',
+   'GPSInfo' => 'IFD ÑÐºÐ°Ð·Ð°ÑÐµÐ»Ñ ÐžÐœÑÐŸÑÐŒÐ°ÑÐžÐž GPS',
+   'GPSLatitude' => 'ÐšÐžÑÐŸÑÐ°',
+   'GPSLatitudeRef' => {
+      Description => 'Ð¡ÐµÐ²ÐµÑÐœÐ°Ñ ÐžÐ»Ðž ÑÐ¶ÐœÐ°Ñ ÑÐžÑÐŸÑÐ°',
+      PrintConv => {
+        'North' => 'Ð¡ÐµÐ²ÐµÑÐœÐ°Ñ ÑÐžÑÐŸÑÐ°',
+        'South' => 'Ð®Ð¶ÐœÐ°Ñ ÑÐžÑÐŸÑÐ°',
+      },
+    },
+   'GPSLongitude' => 'ÐÐŸÐ»Ð³ÐŸÑÐ°',
+   'GPSLongitudeRef' => {
+      Description => 'ÐÐŸÑÑÐŸÑÐœÐ°Ñ ÐžÐ»Ðž Ð·Ð°Ð¿Ð°ÐŽÐœÐ°Ñ ÐŽÐŸÐ»Ð³ÐŸÑÐ°',
+      PrintConv => {
+        'East' => 'ÐÐŸÑÑÐŸÑÐœÐ°Ñ ÐŽÐŸÐ»Ð³ÐŸÑÐ°',
+        'West' => 'ÐÐ°Ð¿Ð°ÐŽÐœÐ°Ñ ÐŽÐŸÐ»Ð³ÐŸÑÐ°',
+      },
+    },
+   'GPSMapDatum' => 'ÐÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÐœÑ ÐŽÐ°ÐœÐœÑÐµ Ð³ÐµÐŸÐŽÐµÐ·ÐžÑÐµÑÐºÐžÑ
+ ÐžÑÑÐ»ÐµÐŽÐŸÐ²Ð°ÐœÐžÐ¹',
+   'GPSMeasureMode' => {
+      Description => 'Ð ÐµÐ¶ÐžÐŒ ÐžÐ·ÐŒÐµÑÐµÐœÐžÑ GPS',
+      PrintConv => {
+        '3-Dimensional Measurement' => '3-ÐŒÐµÑÐœÐŸÐµ ÐžÐ·ÐŒÐµÑÐµÐœÐžÐµ',
+      },
+    },
+   'GPSProcessingMethod' => 'ÐÐ°Ð·Ð²Ð°ÐœÐžÐµ ÐŒÐµÑÐŸÐŽÐ° ÐŸÐ±ÑÐ°Ð±ÐŸÑÐºÐž GPS',
+   'GPSSatellites' => '"Ð¡Ð¿ÑÑÐœÐžÐºÐž GPS, ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÐŒÑÐµ ÐŽÐ»Ñ ÐžÐ·ÐŒÐµÑÐµÐœÐžÑ"',
+   'GPSSpeed' => 'Ð¡ÐºÐŸÑÐŸÑÑÑ GPS-ÑÑÑÑÐŸÐ¹ÑÑÐ²Ð°',
+   'GPSSpeedRef' => {
+      Description => 'Ð¡ÐºÐŸÑÐŸÑÑÐœÐŸÐ¹ ÑÐ»ÐµÐŒÐµÐœÑ',
+      PrintConv => {
+        'km/h' => 'ÐÐžÐ»ÐŸÐŒÐµÑÑÑ Ð² ÑÐ°Ñ',
+        'knots' => 'Ð£Ð·Ð»Ñ',
+        'mph' => 'ÐÐžÐ»Ðž Ð² ÑÐ°Ñ',
+      },
+    },
+   'GPSStatus' => {
+      Description => 'Ð¡ÐŸÑÑÐŸÑÐœÐžÐµ GPS-ÑÑÑÑÐŸÐ¹ÑÑÐ²Ð°',
+      PrintConv => {
+        'Measurement Active' => 'ÐÑÐŸÐžÐ·Ð²ÐŸÐŽÐžÑÑÑ ÐžÐ·ÐŒÐµÑÐµÐœÐžÐµ',
+        'Measurement Void' => 'ÐÐ·Ð°ÐžÐŒÐœÐ°Ñ ÑÐŸÐ²ÐŒÐµÑÑÐžÐŒÐŸÑÑÑ ÐžÐ·ÐŒÐµÑÐµÐœÐžÐ¹',
+      },
+    },
+   'GPSTimeStamp' => 'GPS-Ð²ÑÐµÐŒÑ (Ð°ÑÐŸÐŒÐœÑÐµ ÑÐ°ÑÑ)',
+   'GPSTrack' => 'ÐÐ°Ð¿ÑÐ°Ð²Ð»ÐµÐœÐžÐµ ÐŽÐ²ÐžÐ¶ÐµÐœÐžÑ',
+   'GPSTrackRef' => {
+      Description => 'ÐÐ¿ÐŸÑÐœÐ°Ñ Ð²ÐµÐ»ÐžÑÐžÐœÐ° ÐœÐ°Ð¿ÑÐ°Ð²Ð»ÐµÐœÐžÑ ÐŽÐ²ÐžÐ¶ÐµÐœÐžÑ',
+      PrintConv => {
+        'Magnetic North' => 'ÐÐ°Ð¿ÑÐ°Ð²Ð»ÐµÐœÐžÐµ ÐŒÐ°Ð³ÐœÐžÑÐœÐŸÐ¹ ÑÑÑÐµÐ»ÐºÐž',
+        'True North' => 'ÐÑÑÐžÐœÐœÐŸÐµ ÐœÐ°Ð¿ÑÐ°Ð²Ð»ÐµÐœÐžÐµ',
+      },
+    },
+   'GPSVersionID' => 'ÐÐµÑÑÐžÑ GPS-ÑÑÐ³Ð°',
+   'GainControl' => {
+      Description => 'Ð£Ð¿ÑÐ°Ð²Ð»ÐµÐœÐžÐµ ÑÐ°Ð³ÐŸÐŒ',
+      PrintConv => {
+        'High gain down' => 'Ð¡ Ð±ÐŸÐ»ÑÑÐžÐŒ ÑÐ°Ð³ÐŸÐŒ Ð²ÐœÐžÐ·',
+        'High gain up' => 'Ð¡ Ð±ÐŸÐ»ÑÑÐžÐŒ ÑÐ°Ð³ÐŸÐŒ Ð²Ð²ÐµÑÑ
+',
+        'Low gain down' => 'Ð¡ ÐŒÐ°Ð»ÑÐŒ ÑÐ°Ð³ÐŸÐŒ Ð²ÐœÐžÐ·',
+        'Low gain up' => 'Ð¡ ÐŒÐ°Ð»ÑÐŒ ÑÐ°Ð³ÐŸÐŒ Ð²Ð²ÐµÑÑ
+',
+        'None' => 'ÐÐµÑ',
+      },
+    },
+   'Gamma' => 'ÐÐ°ÐŒÐŒÐ°',
+   'Gradation' => 'ÐÐ¿ÐµÑÐ°ÑÐ»ÑÑÑ.ÑÐµÐ¶ÐžÐŒ',
+   'HDR' => {
+      Description => 'ÐÐ²ÑÐŸ HDR',
+      PrintConv => {
+        'Off' => 'ÐÑÐºÐ»ÑÑÐµÐœÐŸ',
+      },
+    },
+   'Headline' => 'ÐÐ°Ð³ÐŸÐ»ÐŸÐ²ÐŸÐº',
+   'HighISONoiseReduction' => {
+      Description => 'NR Ð²ÑÑÐŸÐºÐŸÐ³ÐŸ ISO',
+      PrintConv => {
+        'Auto' => 'ÐÐ²ÑÐŸ',
+        'High' => 'Hi',
+        'Low' => 'Lo',
+        'Normal' => 'ÐÐŸÑÐŒÐ°Ð»ÑÐœÐ°Ñ',
+        'Off' => 'ÐÑÐºÐ»ÑÑÐµÐœÐŸ',
+      },
+    },
+   'Hue' => 'ÐÑÑÐµÐœÐŸÐº',
+   'ISO' => 'ÐÐœÐ°ÑÐµÐœÐžÐµ ISO',
+   'ImageHeight' => 'ÐÑÑÐŸÑÐ° ÑÐœÐžÐŒÐºÐ°',
+   'ImageSize' => '"Ð¡ÐœÐžÐŒÐŸÐº, ÑÐ°Ð·ÐŒÐµÑ"',
+   'ImageUniqueID' => 'Ð£ÐœÐžÐºÐ°Ð»ÑÐœÑÐ¹ ID-ÐºÐŸÐŽ ÑÐœÐžÐŒÐºÐ°',
+   'ImageWidth' => 'ÐšÐžÑÐžÐœÐ° ÑÐœÐžÐŒÐºÐ°',
+   'Index' => 'ÐÐœÐŽÐµÐºÑ',
+   'Instructions' => 'ÐÐœÑÑÑÑÐºÑÐžÐž',
+   'InteropIndex' => 'ÐÐŽÐµÐœÑÐžÑÐžÐºÐ°ÑÐžÑ Ð²Ð·Ð°ÐžÐŒÐœÐŸÐ¹ ÑÐŸÐ²ÐŒÐµÑÑÐžÐŒÐŸÑÑÐž',
+   'InteropOffset' => 'Ð¢ÑÐ³ Ð²Ð·Ð°ÐžÐŒÐœÐŸÐ¹ ÑÐŸÐ²ÐŒÐµÑÑÐžÐŒÐŸÑÑÐž',
+   'InteropVersion' => 'ÐÐµÑÑÐžÑ Ð²Ð·Ð°ÐžÐŒÐœÐŸÐ¹ ÑÐŸÐ²ÐŒÐµÑÑÐžÐŒÐŸÑÑÐž',
+   'Keywords' => 'ÐÐ»ÑÑÐµÐ²ÑÐµ ÑÐ»ÐŸÐ²Ð°',
+   'Lens' => 'ÐÐ±ÑÐµÐºÑÐžÐ²',
+   'LensInfo' => 'ÐÐœÑÐŸÑÐŒÐ°ÑÐžÑ ÐŸÐ± ÐŸÐ±ÑÐµÐºÑÐžÐ²Ðµ',
+   'LightSource' => {
+      Description => 'ÐÑÑÐŸÑÐœÐžÐº ÑÐ²ÐµÑÐ°',
+      PrintConv => {
+        'Cloudy' => 'ÐÐ±Ð»Ð°ÑÐœÐŸÑÑÑ',
+        'Cool White Fluorescent' => 'Ð€Ð»ÑÐŸÑÐµÑÑÐµÐœÑÐœÑÐ¹ Ð±ÐµÐ»ÑÐ¹ Ñ
+ÐŸÐ»ÐŸÐŽÐœÑÐ¹ (W 3800 - 4500K)',
+        'Day White Fluorescent' => 'Ð€Ð»ÑÐŸÑÐµÑÑÐµÐœÑÐœÑÐ¹ Ð±ÐµÐ»ÑÐ¹ ÐŽÐœÐµÐ²ÐœÐŸÐ¹',
+        'Daylight' => 'ÐÐœÐµÐ²ÐœÐŸÐ¹ ÑÐ²ÐµÑ',
+        'Daylight Fluorescent' => 'Ð€Ð»ÑÐŸÑÐµÑÑÐµÐœÑÐœÑÐ¹ Ð±ÐµÐ»ÑÐ¹ ÐŽÐœÐµÐ²ÐœÐŸÐ³ÐŸ ÑÐ²ÐµÑÐ° (D 5700 - 7100K)',
+        'Fine Weather' => 'Ð¯ÑÐœÐ°Ñ Ð¿ÐŸÐ³ÐŸÐŽÐ°',
+        'Flash' => 'ÐÑÐ¿ÑÑÐºÐ°',
+        'Fluorescent' => 'Ð€Ð»ÑÐŸÑÐµÑÑÐµÐœÑÐœÑÐ¹',
+        'ISO Studio Tungsten' => 'ISO ÐŽÐ»Ñ ÑÑÑÐŽÐžÐ¹ÐœÑÑ
+ Ð»Ð°ÐŒÐ¿ ÐœÐ°ÐºÐ°Ð»ÐžÐ²Ð°ÐœÐžÑ',
+        'Other' => 'ÐŽÑÑÐ³ÐŸÐ¹ ÐžÑÑÐŸÑÐœÐžÐº ÑÐ²ÐµÑÐ°',
+        'Shade' => 'Ð¢ÐµÐœÑ',
+        'Standard Light A' => 'Ð¡ÑÐ°ÐœÐŽÐ°ÑÑÐœÑÐ¹ ÑÐ²ÐµÑ A',
+        'Standard Light B' => 'Ð¡ÑÐ°ÐœÐŽÐ°ÑÑÐœÑÐ¹ ÑÐ²ÐµÑ B',
+        'Standard Light C' => 'Ð¡ÑÐ°ÐœÐŽÐ°ÑÑÐœÑÐ¹ ÑÐ²ÐµÑ C',
+        'Tungsten (Incandescent)' => 'ÐÐ°ÐŒÐ¿Ð° ÐœÐ°ÐºÐ°Ð»ÐžÐ²Ð°ÐœÐžÑ (ÑÑÐºÐžÐ¹ ÑÐ²ÐµÑ)',
+        'Unknown' => 'ÐœÐµÐžÐ·Ð²ÐµÑÑÐœÐŸ',
+        'Warm White Fluorescent' => 'Ð€Ð»ÑÐŸÑÐµÑÑÐµÐœÑÐœÑÐ¹ ÑÐµÐ¿Ð»ÑÐ¹ Ð±ÐµÐ»ÑÐ¹ (L 2600 - 3250K)',
+        'White Fluorescent' => 'Ð€Ð»ÑÐŸÑÐµÑÑÐµÐœÑÐœÑÐ¹ Ð±ÐµÐ»ÑÐ¹ (WW 3250 - 3800K)',
+      },
+    },
+   'Lightness' => 'ÐÑÐ²ÐµÑÐµÐœÐœÐŸÑÑÑ',
+   'LinearResponseLimit' => 'ÐÑÐµÐŽÐµÐ» Ð»ÐžÐœÐµÐ¹ÐœÐŸÐ³ÐŸ ÐŸÑÐºÐ»ÐžÐºÐ°',
+   'LinearizationTable' => 'Ð¢Ð°Ð±Ð»ÐžÑÐ° Ð»ÐžÐœÐµÐ°ÑÐžÐ·Ð°ÑÐžÐž',
+   'LocalizedCameraModel' => 'ÐÐŸÐºÐ°Ð»ÐžÐ·ÐŸÐ²Ð°ÐœÐœÐŸÐµ ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµ ÑÐŸÑÐŸÐ°Ð¿Ð¿Ð°ÑÐ°ÑÐ°',
+   'Location' => 'ÐÐµÑÑÐŸ ÑÑÐµÐŒÐºÐž',
+   'LongExposureNoiseReduction' => {
+      Description => 'NR ÐŽÐŸÐ»Ð³ÐŸÐ¹ ÑÐºÑÐ¿.',
+      PrintConv => {
+        'Off' => 'ÐÑÐºÐ»ÑÑÐµÐœÐŸ',
+        'On' => 'ÐÐºÐ»ÑÑÐµÐœÐŸ',
+      },
+    },
+   'Make' => 'ÐÐ·Ð³ÐŸÑÐŸÐ²ÐžÑÐµÐ»Ñ',
+   'MakerNote' => 'ÐÑÐžÐ²Ð°ÑÐœÑÐµ ÐŽÐ°ÐœÐœÑÐµ DNG',
+   'MakerNoteSafety' => {
+      Description => 'ÐÐµÐ·ÐŸÐ¿Ð°ÑÐœÐŸÑÑÑ Â«Ð¿ÑÐžÐŒÐµÑÐ°ÐœÐžÐ¹ Ð¿ÑÐŸÐžÐ·Ð²ÐŸÐŽÐžÑÐµÐ»ÑÂ»',
+      PrintConv => {
+        'Safe' => 'ÐÐµÐ·ÐŸÐ¿Ð°ÑÐœÐŸ',
+        'Unsafe' => 'ÐÐµÐ±ÐµÐ·ÐŸÐ¿Ð°ÑÐœÐŸ',
+      },
+    },
+   'MakerNotes' => 'ÐÐ°ÐœÐœÑÐµ Ð¿ÑÐŸÐžÐ·Ð²ÐŸÐŽÐžÑÐµÐ»ÐµÐ¹',
+   'MaskedAreas' => 'ÐÐµÐ°ÐºÑÐžÐ²ÐœÑÐµ ÐŸÐ±Ð»Ð°ÑÑÐž',
+   'MaxAperture' => 'ÐÐ°ÐºÑ. ÐŽÐžÐ°ÑÑÐ°Ð³ÐŒÐ° ÐŸÐ±ÑÐµÐºÑÐžÐ²Ð°',
+   'MeteringMode' => {
+      Description => 'Ð­ÐºÑÐ¿ÐŸÐ·Ð°ÐŒÐµÑ',
+      PrintConv => {
+        'Average' => 'Ð¡ÑÐµÐŽÐœÐžÐ¹',
+        'Center-weighted average' => 'ÐŠÐµÐœÑÑÐ°Ð»ÑÐœÐŸ-Ð²Ð·Ð²ÐµÑÐµÐœÐœÑÐ¹ ÑÑÐµÐŽÐœÐžÐ¹',
+        'Multi-segment' => 'Ð£Ð·ÐŸÑ',
+        'Multi-spot' => 'ÐÐœÐŸÐ³ÐŸÐ·ÐŸÐœÐ°Ð»ÑÐœÑÐ¹',
+        'Other' => 'ÐÑÑÐ³ÐŸÐµ',
+        'Partial' => 'Ð§Ð°ÑÑÐžÑÐœÑÐ¹',
+        'Spot' => 'Ð¢ÐŸÑÐµÑÐœÑÐ¹',
+        'Unknown' => 'ÐœÐµÐžÐ·Ð²ÐµÑÑÐœÐŸ',
+      },
+    },
+   'Model' => 'ÐÐ°ÐŒÐµÑÐ°',
+   'ModifyDate' => '"Ð€Ð°Ð¹Ð», ÐžÐ·ÐŒÐµÐœÐžÑÑ ÐŽÐ°ÑÑ Ðž Ð²ÑÐµÐŒÑ"',
+   'MultiFrameNoiseReduction' => {
+      Description => 'ÐÐœÐŸÐ³ÐŸÐºÐ°ÐŽÑ. ÑÑÐŒÐŸÐ¿ÐŸÐŽÐ°Ð²Ð».',
+      PrintConv => {
+        'Off' => 'ÐÑÐºÐ»ÑÑÐµÐœÐŸ',
+        'On' => 'ÐÐºÐ»ÑÑÐµÐœÐŸ',
+      },
+    },
+   'NoiseReduction' => 'ÐšÑÐŒÐŸÐ¿ÐŸÐŽÐ°Ð²Ð»ÐµÐœÐžÐµ',
+   'NoiseReductionApplied' => 'ÐÑÐžÐŒÐµÐœÑÐœÐœÐŸÐµ ÑÑÐŒÐŸÐ¿ÐŸÐŽÐ°Ð²Ð»ÐµÐœÐžÐµ',
+   'Opto-ElectricConvFactor' => 'Ð€Ð°ÐºÑÐŸÑ ÐŸÐ¿ÑÐžÐºÐŸ-ÑÐ»ÐµÐºÑÑÐžÑÐµÑÐºÐŸÐ³ÐŸ Ð¿ÑÐµÐŸÐ±ÑÐ°Ð·ÐŸÐ²Ð°ÐœÐžÑ',
+   'Orientation' => {
+      Description => 'ÐÑÐžÐµÐœÑÐ°ÑÐžÑ',
+      PrintConv => {
+        'Horizontal (normal)' => 'ÐÐŸÐ»ÐŸÐ¶ÐžÑÐµÐ»ÑÐœÐŸÐµ ÐœÐ°Ð¿ÑÐ°Ð²Ð»ÐµÐœÐžÐµ',
+        'Rotate 90 CW' => 'ÐÐŸÐ²ÐŸÑÐŸÑ ÐœÐ° 90Â° Ð¿ÐŸ ÑÐ°ÑÐŸÐ²ÐŸÐ¹ ÑÑÑÐµÐ»ÐºÐµ',
+      },
+    },
+   'OriginalRawFileData' => 'ÐÑÑ
+ÐŸÐŽÐœÑÐµ ÐŽÐ°ÐœÐœÑÐµ raw-ÑÐ°Ð¹Ð»Ð°',
+   'OriginalRawFileDigest' => 'Ð¡ÐžÐ³ÐœÐ°ÑÑÑÐ° ÐžÑÑ
+ÐŸÐŽÐœÐŸÐ³ÐŸ Raw-ÑÐ°Ð¹Ð»Ð°',
+   'OriginalRawFileName' => 'ÐÑÑ
+ÐŸÐŽÐœÐŸÐµ ÐžÐŒÑ Raw-ÑÐ°Ð¹Ð»Ð°',
+   'PhotometricInterpretation' => 'Ð¡ÐŸÑÑÐ°Ð² Ð¿ÐžÐºÑÐµÐ»Ð°',
+   'PlanarConfiguration' => {
+      Description => 'ÐÑÐ³Ð°ÐœÐžÐ·Ð°ÑÐžÑ ÐŽÐ°ÐœÐœÑÑ
+ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ',
+      PrintConv => {
+        'Chunky' => 'ÐºÑÑÐ¿ÐœÑÐ¹ ÑÐŸÑÐŒÐ°Ñ',
+        'Planar' => 'Ð¿Ð»Ð°ÐœÐ°ÑÐœÑÐ¹ ÑÐŸÑÐŒÐ°Ñ',
+      },
+    },
+   'PreviewApplicationName' => 'ÐÐŒÑ Ð¿ÑÐžÐ»ÐŸÐ¶ÐµÐœÐžÑ Ð¿ÑÐµÐŽÐ¿ÑÐŸÑÐŒÐŸÑÑÐ°',
+   'PreviewApplicationVersion' => 'ÐÐµÑÑÐžÑ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ Ð¿ÑÐµÐŽÐ¿ÑÐŸÑÐŒÐŸÑÑÐ°',
+   'PreviewColorSpace' => {
+      Description => 'ÐŠÐ²ÐµÑÐŸÐ²ÐŸÐµ Ð¿ÑÐŸÑÑÑÐ°ÐœÑÑÐ²ÐŸ Ð¿ÑÐµÐŽÐ¿ÑÐŸÑÐŒÐŸÑÑÐ°',
+      PrintConv => {
+        'Unknown' => 'ÐÐµÐžÐ·Ð²ÐµÑÑÐœÐŸ',
+      },
+    },
+   'PreviewDateTime' => 'ÐÐ°ÑÐ° Ðž Ð²ÑÐµÐŒÑ Ð¿ÑÐµÐŽÐ¿ÑÐŸÑÐŒÐŸÑÑÐ°',
+   'PreviewSettingsDigest' => 'Ð¡ÐžÐ³ÐœÐ°ÑÑÑÐ° ÐœÐ°ÑÑÑÐŸÐµÐº Ð¿ÑÐµÐŽÐ¿ÑÐŸÑÐŒÐŸÑÑÐ°',
+   'PreviewSettingsName' => 'ÐÐ°Ð·Ð²Ð°ÐœÐžÐµ ÐœÐ°ÑÑÑÐŸÐµÐº Ð¿ÑÐµÐŽÐ¿ÑÐŸÑÐŒÐŸÑÑÐ°',
+   'PrimaryChromaticities' => 'Ð¢ÐŸÐœÐ°Ð»ÑÐœÐŸÑÑÑ ÐŸÑÐœÐŸÐ²ÐœÑÑ
+ ÑÐ²ÐµÑÐŸÐ²',
+   'ProfileCalibrationSig' => 'Ð¡ÐžÐ³ÐœÐ°ÑÑÑÐ° ÐºÐ°Ð»ÐžÐ±ÑÐŸÐ²ÐºÐž Ð¿ÑÐŸÑÐžÐ»Ñ',
+   'ProfileCopyright' => 'ÐÐ²ÑÐŸÑÑÐºÐžÐµ Ð¿ÑÐ°Ð²Ð° Ð¿ÑÐŸÑÐžÐ»Ñ',
+   'ProfileEmbedPolicy' => {
+      Description => 'ÐÐŸÐ»ÐžÑÐžÐºÐ° Ð²ÐœÐµÐŽÑÐµÐœÐžÑ Ð¿ÑÐŸÑÐžÐ»Ñ',
+      PrintConv => {
+        'Allow Copying' => 'Ð Ð°Ð·ÑÐµÑÐµÐœÐŸ ÐºÐŸÐ¿ÐžÑÐŸÐ²Ð°ÐœÐžÐµ',
+        'Embed if Used' => 'ÐÐœÐµÐŽÑÐžÑÑ ÐµÑÐ»Ðž ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°Ðœ',
+        'Never Embed' => 'ÐÐžÐºÐŸÐ³ÐŽÐ° ÐœÐµ Ð²ÐœÐµÐŽÑÑÑÑ',
+        'No Restrictions' => 'ÐÐµÑ ÐŸÐ³ÑÐ°ÐœÐžÑÐµÐœÐžÐ¹',
+      },
+    },
+   'ProfileHueSatMapData1' => 'ÐÐ°ÐœÑÐµ ÐŸÑÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ ÐŸÑÑÐµÐœÐºÐ°/ÐœÐ°ÑÑÑÐµÐœÐœÐŸÑÑÐž â1',
+   'ProfileHueSatMapData2' => 'ÐÐ°ÐœÑÐµ ÐŸÑÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ ÐŸÑÑÐµÐœÐºÐ°/ÐœÐ°ÑÑÑÐµÐœÐœÐŸÑÑÐž â2',
+   'ProfileHueSatMapDims' => 'ÐÐŸÐ»ÐžÑÐµÑÑÐ²ÐŸ ÐŸÐ±ÑÐ°Ð·ÑÐŸÐ² ÐŸÑÑÐµÐœÐºÐŸÐ²',
+   'ProfileLookTableData' => 'ÐÐ°ÐœÐœÑÐµ ÑÐ°Ð±Ð»ÐžÑÑ Ð¿ÑÐŸÑÐŒÐŸÑÑÐ°',
+   'ProfileLookTableDims' => 'ÐÐŸÐ»ÐžÑÐµÑÑÐ²ÐŸ ÐŸÐ±ÑÐ°Ð·ÑÐŸÐ² ÐŸÑÑÐµÐœÐºÐŸÐ²',
+   'ProfileName' => 'ÐÐŒÑ Ð¿ÑÐŸÑÐžÐ»Ñ',
+   'ProfileToneCurve' => 'ÐÑÐžÐ²Ð°Ñ ÑÑÐŸÐºÑÑÐž Ð¿ÑÐŸÑÐžÐ»Ñ',
+   'Province-State' => 'ÐÐ±Ð»Ð°ÑÑÑ/ÑÐ°Ð¹ÐŸÐœ',
+   'Quality' => {
+      Description => 'ÐÐ°ÑÐµÑÑÐ²ÐŸ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ',
+      PrintConv => {
+        'Compressed RAW' => 'cRAW',
+        'Compressed RAW + JPEG' => 'cRAW+JPEG',
+        'Extra Fine' => 'Ð¡Ð²ÐµÑÑ
+Ð²ÑÑÐŸÐºÐŸÐµ',
+        'Fine' => 'ÐÑÑÐŸÐºÐŸÐµ',
+        'Low' => 'ÐÐžÐ·ÐºÐŸÐµ ÐºÐ°ÑÐµÑÑÐ²ÐŸ',
+        'Normal' => 'Ð¡ÑÐ°ÐœÐŽÐ°ÑÑÐœÐŸÐµ ÐºÐ°ÑÐµÑÑÐ²ÐŸ',
+        'RAW + JPEG' => 'RAW+JPEG',
+        'Standard' => 'Ð¡ÑÐ°ÐœÐŽÐ°ÑÑÐœÐŸÐµ',
+      },
+    },
+   'RawDataUniqueID' => 'Ð£ÐœÐžÐºÐ°Ð»ÑÐœÑÐ¹ ÐžÐŽÐµÐœÑÐžÑÐžÐºÐ°ÑÐŸÑ ÑÐ°Ð¹Ð»Ð°',
+   'RawImageDigest' => 'Ð¡ÐžÐ³ÐœÐ°ÑÑÑÐ° RAW-ÑÐ°Ð¹Ð»Ð°',
+   'RecordMode' => 'Ð ÐµÐ¶ÐžÐŒ Ð·Ð°Ð¿ÐžÑÐž',
+   'ReductionMatrix1' => 'ÐÐ°ÑÑÐžÑÐ° ÑÐµÐŽÑÐºÑÐžÐž â1',
+   'ReductionMatrix2' => 'ÐÐ°ÑÑÐžÑÐ° ÑÐµÐŽÑÐºÑÐžÐž 2',
+   'ReferenceBlackWhite' => 'ÐÐ°ÑÐ° ÐŸÐ¿ÐŸÑÐœÑÑ
+ Ð·ÐœÐ°ÑÐµÐœÐžÐ¹ ÑÐµÑÐœÐŸÐ³ÐŸ Ðž Ð±ÐµÐ»ÐŸÐ³ÐŸ',
+   'RelatedImageFileFormat' => 'Ð€ÐŸÑÐŒÐ°Ñ ÑÐ°Ð¹Ð»Ð° ÑÐ²ÑÐ·Ð°ÐœÐœÐŸÐ³ÐŸ ÑÐœÐžÐŒÐºÐ°',
+   'RelatedImageHeight' => 'ÐÐ»ÐžÐœÐ° ÑÐ²ÑÐ·Ð°ÐœÐœÐŸÐ³ÐŸ ÑÐœÐžÐŒÐºÐ°',
+   'RelatedImageWidth' => 'ÐšÐžÑÐžÐœÐ° ÑÐ²ÑÐ·Ð°ÐœÐœÐŸÐ³ÐŸ ÑÐœÐžÐŒÐºÐ°',
+   'RelatedSoundFile' => 'Ð¡Ð²ÑÐ·Ð°ÐœÐœÑÐ¹ Ð°ÑÐŽÐžÐŸ-ÑÐ°Ð¹Ð»',
+   'ResolutionUnit' => {
+      Description => 'Ð­Ð»ÐµÐŒÐµÐœÑ ÑÐ°Ð·ÑÐµÑÐµÐœÐžÑ Ð¿ÐŸ X Ðž Y',
+      PrintConv => {
+        'cm' => 'ÑÐ°ÐœÑÐžÐŒÐµÑÑÑ',
+        'inches' => 'ÐŽÑÐ¹ÐŒÑ',
+      },
+    },
+   'RowInterleaveFactor' => 'ÐšÐžÑÐžÐœÐ° ÑÐµÑÐµÐŽÐŸÐ²Ð°ÐœÐžÑ ÑÑÑÐŸÐº',
+   'RowsPerStrip' => 'Ð§ÐžÑÐ»ÐŸ ÑÑÐŽÐŸÐ² Ð² Ð¿ÐŸÐ»ÐŸÑÐµ',
+   'SamplesPerPixel' => 'ÐÐŸÐ»ÐžÑÐµÑÑÐ²ÐŸ ÐºÐŸÐŒÐ¿ÐŸÐœÐµÐœÑÐŸÐ²',
+   'Saturation' => {
+      Description => 'ÐÐ°ÑÑÑÐµÐœÐœÐŸÑÑÑ',
+      PrintConv => {
+        'High' => 'ÐÑÑÐŸÐºÐ°Ñ ÐœÐ°ÑÑÑÐµÐœÐœÐŸÑÑÑ',
+        'Low' => 'ÐÐžÐ·ÐºÐ°Ñ ÐœÐ°ÑÑÑÐµÐœÐœÐŸÑÑÑ',
+        'Normal' => 'Ð¡ÑÐ°ÐœÐŽÐ°ÑÑÐœÑÐ¹',
+      },
+    },
+   'SceneCaptureType' => {
+      Description => 'Ð¡ÑÐ¶ÐµÑÐœÐ°Ñ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐ°',
+      PrintConv => {
+        'Landscape' => 'ÐÐµÐ¹Ð·Ð°Ð¶',
+        'Night' => 'ÐÐŸÑÐœÐ°Ñ ÑÑÐµÐŒÐºÐ°',
+        'Portrait' => 'ÐÐŸÑÑÑÐµÑ',
+        'Standard' => 'Ð¡ÑÐ°ÐœÐŽÐ°ÑÑÐœÑÐ¹',
+      },
+    },
+   'SceneMode' => {
+      Description => 'ÐÑÐ±ÐŸÑ ÑÑÐµÐœÑ',
+      PrintConv => {
+        '3D Sweep Panorama' => '3D',
+        'Anti Motion Blur' => 'Ð£ÑÑÑ. ÑÐ°Ð·ÐŒÑÑ. ÐŽÐ²ÐžÐ¶.',
+        'Auto' => 'ÐÐ²ÑÐŸ',
+        'Cont. Priority AE' => 'ÐÐµÐ¿ÑÐµÑ. Ð¿ÑÐžÐŸÑ. ÐÐ­',
+        'Handheld Night Shot' => 'ÐÐŸÑÐœÐ°Ñ ÑÑÐµÐŒÐºÐ° Ñ ÑÑÐº',
+        'Landscape' => 'ÐÐµÐ¹Ð·Ð°Ð¶',
+        'Macro' => 'ÐÐ°ÐºÑÐŸÑÑÑÐŒÐºÐ°',
+        'Night Portrait' => 'ÐÐŸÑÐœÐŸÐ¹ Ð¿ÐŸÑÑÑÐµÑ',
+        'Night Scene' => 'ÐÐŸÑÐœÐŸÐ¹ Ð²ÐžÐŽ',
+        'Night View/Portrait' => 'ÐÐŸÑÐœÐŸÐ¹ Ð²ÐžÐŽ/Ð¿ÐŸÑÑÑÐµÑ',
+        'Portrait' => 'ÐÐŸÑÑÑÐµÑ',
+        'Sports' => 'Ð¡Ð¿ÐŸÑÑÐžÐ²ÐœÑÐµ ÑÑÐµÐœÑ',
+        'Standard' => '',
+        'Sunset' => 'ÐÐ°ÐºÐ°Ñ',
+        'Sweep Panorama' => 'ÐÐ°ÐœÐŸÑÐ°ÐŒÐœÑÐ¹ ÐŸÐ±Ð·ÐŸÑ',
+      },
+    },
+   'SceneType' => {
+      Description => 'Ð¢ÐžÐ¿ ÑÑÐ¶ÐµÑÐ°',
+      PrintConv => {
+        'Directly photographed' => 'ÐÐµÐ¿ÐŸÑÑÐµÐŽÑÑÐ²ÐµÐœÐœÐŸ Ð¿ÐŸÐ»ÑÑÐµÐœÐœÑÐ¹ ÑÐœÐžÐŒÐŸÐº',
+      },
+    },
+   'SensingMethod' => {
+      Description => 'ÐÐµÑÐŸÐŽ ÑÐµÐ³ÐžÑÑÑÐ°ÑÐžÐž',
+      PrintConv => {
+        'Color sequential area' => 'ÐÐŸÑÐ»ÐµÐŽÐŸÐ²Ð°ÑÐµÐ»ÑÐœÑÐ¹ ÑÐµÐœÑÐŸÑ ÑÐ²ÐµÑÐŸÐ²ÐŸÐ¹ ÐŸÐ±Ð»Ð°ÑÑÐž',
+        'Color sequential linear' => 'ÐÐŸÑÐ»ÐµÐŽÐŸÐ²Ð°ÑÐµÐ»ÑÐœÑÐ¹ Ð»ÐžÐœÐµÐ¹ÐœÑÐ¹ ÑÐ²ÐµÑÐŸÐ²ÐŸÐ¹ ÑÐµÐœÑÐŸÑ',
+        'One-chip color area' => 'ÐÐŽÐœÐŸÐ¿ÑÐŸÑÐµÑÑÐŸÑÐœÑÐ¹ ÑÐµÐœÑÐŸÑ ÑÐ²ÐµÑÐŸÐ²ÐŸÐ¹ ÐŸÐ±Ð»Ð°ÑÑÐž',
+        'Three-chip color area' => 'Ð¢ÑÐµÑ
+Ð¿ÑÐŸÑÐµÑÑÐŸÑÐœÑÐ¹ ÑÐµÐœÑÐŸÑ ÑÐ²ÐµÑÐŸÐ²ÐŸÐ¹ ÐŸÐ±Ð»Ð°ÑÑÐž',
+        'Trilinear' => 'Ð¢ÑÐµÑ
+Ð»ÐžÐœÐµÐ¹ÐœÑÐ¹ ÑÐ²ÐµÑÐŸÐ²ÐŸÐ¹ ÑÐµÐœÑÐŸÑ',
+        'Two-chip color area' => 'ÐÐ²ÑÑ
+Ð¿ÑÐŸÑÐµÑÑÐŸÑÐœÑÐ¹ ÑÐµÐœÑÐŸÑ ÑÐ²ÐµÑÐŸÐ²ÐŸÐ¹ ÐŸÐ±Ð»Ð°ÑÑÐž',
+      },
+    },
+   'SerialNumber' => 'ID-ÐºÐŸÐŽ ÑÐŸÑÐŸÐºÐ°ÐŒÐµÑÑ',
+   'ShadingCompensation' => 'Ð£ÑÑÑÐ°ÐœÐµÐœÐžÐµ ÑÐµÐœÐµÐ¹',
+   'ShadowScale' => 'ÐÐžÐ°Ð¿Ð°Ð·ÐŸÐœ ÑÐµÐœÐµÐ¹',
+   'Sharpness' => {
+      Description => 'Ð ÐµÐ·ÐºÐŸÑÑÑ',
+      PrintConv => {
+        'Hard' => 'Ð ÐµÐ·ÐºÐžÐ¹',
+        'Normal' => 'Ð¡ÑÐ°ÐœÐŽÐ°ÑÑÐœÑÐ¹',
+        'Soft' => 'ÐÑÐ³ÐºÐžÐ¹',
+      },
+    },
+   'ShootingMode' => 'Ð ÐµÐ¶ÐžÐŒ ÑÑÐµÐŒÐºÐž',
+   'ShutterSpeed' => 'ÐÑÐŽÐµÑÐ¶ÐºÐ°',
+   'ShutterSpeedValue' => 'ÐÑÐŽÐµÑÐ¶ÐºÐ°',
+   'Software' => 'ÐÐŒÑ Ðž Ð²ÐµÑÑÐžÑ ÐÐ',
+   'Source' => 'ÐÑÑÐŸÑÐœÐžÐº',
+   'SpatialFrequencyResponse' => 'ÐÑÐŸÑÑÑÐ°ÐœÑÑÐ²ÐµÐœÐœÐ°Ñ ÑÐ°ÑÑÐŸÑÐœÐ°Ñ Ñ
+Ð°ÑÐ°ÐºÑÐµÑÐžÑÑÐžÐºÐ°',
+   'SpectralSensitivity' => 'Ð¡Ð¿ÐµÐºÑÑÐ°Ð»ÑÐœÐ°Ñ ÑÑÐ²ÑÑÐ²ÐžÑÐµÐ»ÑÐœÐŸÑÑÑ',
+   'State' => 'ÐÐ±Ð»Ð°ÑÑÑ',
+   'StripByteCounts' => 'ÐÐ°Ð¹Ñ ÐœÐ° ÑÐ¶Ð°ÑÑÑ Ð¿ÐŸÐ»ÐŸÑÑ',
+   'StripOffsets' => 'Ð Ð°ÑÐ¿ÐŸÐ»ÐŸÐ¶ÐµÐœÐžÐµ ÐŽÐ°ÐœÐœÑÑ
+ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ',
+   'SubSecTime' => '"ÐÐ°ÑÐ° Ðž Ð²ÑÐµÐŒÑ, ÑÑÐ±-ÑÐµÐºÑÐœÐŽÑ"',
+   'SubSecTimeDigitized' => '"ÐÐ°ÑÐ° Ðž Ð²ÑÐµÐŒÑ ÑÐžÑÑÐŸÐ²ÐŸÐµ, ÑÑÐ±-ÑÐµÐºÑÐœÐŽÑ"',
+   'SubSecTimeOriginal' => '"ÐÐ°ÑÐ° Ðž Ð²ÑÐµÐŒÑ ÐžÑÑ
+ÐŸÐŽÐœÐŸÐµ, ÑÑÐ±-ÑÐµÐºÑÐœÐŽÑ"',
+   'SubTileBlockSize' => 'Ð Ð°Ð·ÐŒÐµÑ Ð±Ð»ÐŸÐºÐ° Ð² ÑÐ°Ð¹Ð»Ðµ',
+   'SubjectArea' => 'ÐÐ±Ð»Ð°ÑÑÑ ÐŸÐ±ÑÐµÐºÑÐ°',
+   'SubjectDistance' => 'Ð Ð°ÑÑÑÐŸÑÐœÐžÐµ ÐŽÐŸ ÐŸÐ±ÑÐµÐºÑÐ°',
+   'SubjectDistanceRange' => {
+      Description => 'ÐÐžÐ°Ð¿Ð°Ð·ÐŸÐœ ÑÐ°ÑÑÑÐŸÑÐœÐžÐ¹ ÐŽÐŸ ÐŸÐ±ÑÐµÐºÑÐ°',
+      PrintConv => {
+        'Close' => 'ÐÑÑÐ¿ÐœÑÐ¹ Ð¿Ð»Ð°Ðœ',
+        'Distant' => 'Ð£ÐŽÐ°Ð»ÐµÐœÐœÑÐ¹ Ð¿Ð»Ð°Ðœ',
+        'Macro' => 'ÐÐ°ÐºÑÐŸ',
+      },
+    },
+   'SubjectLocation' => 'Ð Ð°ÑÐ¿ÐŸÐ»ÐŸÐ¶ÐµÐœÐžÐµ ÐŸÐ±ÑÐµÐºÑÐ°',
+   'SupplementalCategories' => 'ÐÐŸÐ¿ÐŸÐ»ÐœÐžÑÐµÐ»ÑÐœÑÐµ ÐºÐ°ÑÐµÐ³ÐŸÑÐžÐž',
+   'ThumbnailImage' => 'ÐÐžÐºÑÐŸÐ³ÑÐ°ÐŒÐŒÐ°',
+   'ThumbnailImageSize' => 'Ð Ð°Ð·ÐŒÐµÑ Ð¿ÐžÐºÑÐŸÐ³ÑÐ°ÐŒÐŒ',
+   'Title' => 'ÐÐ°Ð³ÐŸÐ»ÐŸÐ²ÐŸÐº',
+   'TransferFunction' => 'Ð€ÑÐœÐºÑÐžÑ Ð¿ÐµÑÐµÐœÐŸÑÐ°',
+   'TransmissionReference' => 'Ð¡ÑÑÐ»ÐºÐ° ÐœÐ° ÐžÑÑÐŸÑÐœÐžÐº',
+   'UniqueCameraModel' => 'Ð£ÐœÐžÐºÐ°Ð»ÑÐœÐ°Ñ ÐŒÐŸÐŽÐµÐ»Ñ ÑÐŸÑÐŸÐ°Ð¿Ð¿Ð°ÑÐ°ÑÐ°',
+   'Urgency' => 'ÐÑÐžÐŸÑÐžÑÐµÑÐœÐŸÑÑÑ',
+   'UserComment' => 'ÐÐŸÐŒÐŒÐµÐœÑÐ°ÑÐžÐž Ð¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÐµÐ»Ñ',
+   'WhiteBalance' => {
+      Description => 'ÐÐ°Ð»Ð°ÐœÑ Ð±ÐµÐ»ÐŸÐ³ÐŸ',
+      PrintConv => {
+        'Auto' => 'ÐÐ²ÑÐŸÐŒÐ°ÑÐžÑÐµÑÐºÐžÐ¹ Ð±Ð°Ð»Ð°ÐœÑ Ð±ÐµÐ»ÐŸÐ³ÐŸ',
+        'Black & White' => 'ÐÐŸÐœÐŸÑ
+ÑÐŸÐŒ',
+        'Cloudy' => 'ÐÐ±Ð»Ð°ÑÐœÐŸÑÑÑ',
+        'Color Temperature/Color Filter' => 'ÐŠÐ²ÐµÑÐŸÐ²Ð°Ñ ÑÐµÐŒÐ¿ÐµÑÐ°ÑÑÑÐ° / ÐŠÐ²ÐµÑÐŸÐ²ÐŸÐ¹ ÑÐžÐ»ÑÑÑ',
+        'Cool White Fluorescent' => 'Ð€Ð»ÑÐŸÑÐµÑÑÐµÐœÑÐœÑÐ¹ Ð±ÐµÐ»ÑÐ¹ Ñ
+ÐŸÐ»ÐŸÐŽÐœÑÐ¹',
+        'Custom' => 'ÐÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÐµÐ»Ñ',
+        'Custom 1' => 'ÐÐÐ Ð¡ÐÐÐÐÐ¬ÐÐ«Ð 1',
+        'Custom 2' => 'ÐÐÐ Ð¡ÐÐÐÐÐ¬ÐÐ«Ð 2',
+        'Custom 3' => 'ÐÐÐ Ð¡ÐÐÐÐÐ¬ÐÐ«Ð 3',
+        'Custom 4' => 'ÐÐÐ Ð¡ÐÐÐÐÐ¬ÐÐ«Ð 4',
+        'Day White Fluorescent' => 'Ð€Ð»ÑÐŸÑÐµÑÑÐµÐœÑÐœÑÐ¹ Ð±ÐµÐ»ÑÐ¹ ÐŽÐœÐµÐ²ÐœÐŸÐ¹',
+        'Daylight' => 'ÐÐœÐµÐ²ÐœÐŸÐ¹ ÑÐ²ÐµÑ',
+        'Daylight Fluorescent' => 'Ð€Ð»ÑÐŸÑÐµÑÑÐµÐœÑÐœÑÐ¹ ÐŽÐœÐµÐ²ÐœÐŸÐ¹',
+        'Flash' => 'ÐÑÐ¿ÑÑÐºÐ°',
+        'Fluorescent' => 'Ð€Ð»ÑÐŸÑÐµÑÑÐµÐœÑÐœÑÐ¹',
+        'Manual' => 'Ð ÑÑÐœÐ°Ñ ÐœÐ°ÑÑÑÐŸÐ¹ÐºÐ° Ð±Ð°Ð»Ð°ÐœÑÐ° Ð±ÐµÐ»ÐŸÐ³ÐŸ',
+        'Shade' => 'Ð¢ÐµÐœÑ',
+        'Tungsten' => 'ÐÐ°ÐŒÐ¿Ð° ÐœÐ°ÐºÐ°Ð»ÐžÐ²Ð°ÐœÐžÑ',
+        'Unknown' => 'ÐœÐµÐžÐ·Ð²ÐµÑÑÐœÐŸ',
+        'Warm White Fluorescent' => 'Ð€Ð»ÑÐŸÑÐµÑÑÐµÐœÑÐœÑÐ¹ ÑÐµÐ¿Ð»ÑÐ¹ Ð±ÐµÐ»ÑÐ¹',
+        'White Fluorescent' => 'Ð€Ð»ÑÐŸÑÐµÑÑÐµÐœÑÐœÑÐ¹ Ð±ÐµÐ»ÑÐ¹',
+      },
+    },
+   'WhiteLevel' => 'Ð£ÑÐŸÐ²ÐµÐœÑ Ð±ÐµÐ»ÐŸÐ³ÐŸ',
+   'WhitePoint' => 'ÐŠÐ²ÐµÑÐœÐŸÑÑÑ Ð±ÐµÐ»ÐŸÐ¹ ÑÐŸÑÐºÐž',
+   'Writer-Editor' => 'ÐÐ²ÑÐŸÑ Ð¿ÐŸÐŽÐ¿ÐžÑÐž',
+   'YCbCrCoefficients' => 'ÐÐ°ÑÑÐžÑÐœÑÐµ ÐºÐŸÑÑÑÐžÑÐžÐµÐœÑÑ Ð¿ÑÐµÐŸÐ±ÑÐ°Ð·ÐŸÐ²Ð°ÐœÐžÑ ÑÐ²ÐµÑÐŸÐ²ÐŸÐ¹ ÑÑÐµÐŽÑ',
+   'YCbCrPositioning' => {
+      Description => 'ÐÐŸÐ·ÐžÑÐžÑ Ð¿ÐŸ Y Ðž C',
+      PrintConv => {
+        'Centered' => 'ÑÐµÐœÑÑÐŸÐ²Ð°ÐœÐœÑÐ¹',
+        'Co-sited' => 'ÑÐŸÐ²Ð¿Ð°ÐŽÐ°ÑÑÐžÐ¹ Ð¿ÐŸ ÐŒÐµÑÑÑ',
+      },
+    },
+   'YCbCrSubSampling' => 'ÐÐŸÑÑÑÐžÑÐžÐµÐœÑ ÑÑÐ±ÐŽÐžÑÐºÑÐµÑÐžÐ·Ð°ÑÐžÐž Y Ðž C',
+   'ZoneMatching' => {
+      Description => 'Ð¡ÐŸÐŸÑÐ²ÐµÑÑÑÐ²ÐžÐµ ÐŸÐ±Ð»Ð°ÑÑÐµÐ¹',
+      PrintConv => {
+        'High Key' => 'Hi',
+        'ISO Setting Used' => 'ÐÑÐºÐ»ÑÑÐµÐœÐŸ',
+        'Low Key' => 'Lo',
+      },
+    },
+);
+
+1;  # end
+
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Lang::ru.pm - ExifTool Russian language translations
+
+=head1 DESCRIPTION
+
+This file is used by Image::ExifTool to generate localized tag descriptions
+and values.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Jens Duttke, Sergey Shemetov, Dmitry Yerokhin and Anton Sukhinov
+for providing this translation.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool(3pm)|Image::ExifTool>,
+L<Image::ExifTool::TagInfoXML(3pm)|Image::ExifTool::TagInfoXML>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/sv.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/sv.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/sv.pm	(revision 24799)
@@ -0,0 +1,635 @@
+#------------------------------------------------------------------------------
+# File:         sv.pm
+#
+# Description:  ExifTool Swedish language translations
+#
+# Notes:        This file generated automatically by Image::ExifTool::TagInfoXML
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Lang::sv;
+
+use strict;
+use vars qw($VERSION);
+
+$VERSION = '1.03';
+
+%Image::ExifTool::Lang::sv::Translate = (
+   'Aperture' => 'BlÃ€ndare',
+   'ApertureValue' => 'BlÃ€ndare',
+   'Artist' => 'Upphovsman',
+   'Author' => 'Upphovsman',
+   'AuthorsPosition' => 'FÃ¶rfattarens befattning',
+   'BitsPerSample' => 'Antal bitar per komponent',
+   'Brightness' => 'Ljusstyrka',
+   'By-line' => 'Upphovsman',
+   'CFAPattern' => 'CFA-mÃ¶nster',
+   'CalibrationIlluminant1' => {
+      PrintConv => {
+        'Cloudy' => 'Mulet',
+        'Cool White Fluorescent' => 'KalljusrÃ¶r (W 3800 - 4500 k)',
+        'Day White Fluorescent' => 'DagljusrÃ¶r, hÃ¶gdager (N 4600 - 5500k)',
+        'Daylight' => 'Dagsljus',
+        'Daylight Fluorescent' => 'DagljusrÃ¶r (D 5700 - 7100 k)',
+        'Fine Weather' => 'Fint vÃ€der',
+        'Flash' => 'Blixt',
+        'Fluorescent' => 'LysrÃ¶rsbelysning',
+        'ISO Studio Tungsten' => 'ISO tungsten studiobelysning',
+        'Other' => 'annan ljuskÃ€lla',
+        'Shade' => 'Skugga',
+        'Standard Light A' => 'Standardljus A',
+        'Standard Light B' => 'Standardljus B',
+        'Standard Light C' => 'Standardljus C',
+        'Tungsten (Incandescent)' => 'Tungsten',
+        'Unknown' => 'okÃ€nt',
+        'Warm White Fluorescent' => 'Varmt vitt fluorescerande (L 2600 - 3250k)',
+        'White Fluorescent' => 'Vit lysrÃ¶rsbelysning (WW 3250 - 3800 k)',
+      },
+    },
+   'CalibrationIlluminant2' => {
+      PrintConv => {
+        'Cloudy' => 'Mulet',
+        'Cool White Fluorescent' => 'KalljusrÃ¶r (W 3800 - 4500 k)',
+        'Day White Fluorescent' => 'DagljusrÃ¶r, hÃ¶gdager (N 4600 - 5500k)',
+        'Daylight' => 'Dagsljus',
+        'Daylight Fluorescent' => 'DagljusrÃ¶r (D 5700 - 7100 k)',
+        'Fine Weather' => 'Fint vÃ€der',
+        'Flash' => 'Blixt',
+        'Fluorescent' => 'LysrÃ¶rsbelysning',
+        'ISO Studio Tungsten' => 'ISO tungsten studiobelysning',
+        'Other' => 'annan ljuskÃ€lla',
+        'Shade' => 'Skugga',
+        'Standard Light A' => 'Standardljus A',
+        'Standard Light B' => 'Standardljus B',
+        'Standard Light C' => 'Standardljus C',
+        'Tungsten (Incandescent)' => 'Tungsten',
+        'Unknown' => 'okÃ€nt',
+        'Warm White Fluorescent' => 'Varmt vitt fluorescerande (L 2600 - 3250k)',
+        'White Fluorescent' => 'Vit lysrÃ¶rsbelysning (WW 3250 - 3800 k)',
+      },
+    },
+   'Caption-Abstract' => 'Bildtext',
+   'CaptionWriter' => 'Bildtextredigerare',
+   'Categories' => 'Kategorier',
+   'Category' => 'Kategorier',
+   'City' => 'Ort',
+   'ColorFilter' => 'FÃ€rgfilter',
+   'ColorMode' => {
+      Description => 'Kreativa inst.',
+      PrintConv => {
+        'Autumn Leaves' => 'HÃ¶stlÃ¶v',
+        'B&W' => 'Svartvitt',
+        'Clear' => 'Klart',
+        'Deep' => 'Djupt',
+        'Landscape' => 'Landskap',
+        'Light' => 'Ljust',
+        'Neutral' => 'Neutralt',
+        'Night View' => 'Nattvy',
+        'Night View/Portrait' => 'NattportrÃ€tt',
+        'Portrait' => 'PortrÃ€tt',
+        'Sunset' => 'SolnedgÃ¥ng',
+        'Vivid' => 'Levande fÃ€rg',
+      },
+    },
+   'ColorSpace' => {
+      Description => 'FÃ€rgomrÃ¥desinformation',
+      PrintConv => {
+        'ICC Profile' => 'ICC-profil',
+        'Uncalibrated' => 'Ej kalibrerat',
+      },
+    },
+   'ColorTemperature' => 'FÃ€rgtemperatur',
+   'Comment' => 'Kommentar',
+   'ComponentsConfiguration' => 'Enskilda komponenters betydelse',
+   'CompressedBitsPerPixel' => 'BildkomprimeringslÃ€ge',
+   'Compression' => {
+      Description => 'Komprimeringsschema',
+      PrintConv => {
+        'JPEG' => 'JPEG-komprimering',
+        'Uncompressed' => 'ingen komprimering',
+      },
+    },
+   'Contrast' => {
+      Description => 'Kontrast',
+      PrintConv => {
+        'High' => 'HÃ¥rd',
+        'Low' => 'Mjuk',
+        'Normal' => 'Standard',
+      },
+    },
+   'Copyright' => 'Copyright-innehavare',
+   'CopyrightNotice' => 'Copyrightmeddelande',
+   'Country' => 'Land',
+   'Country-PrimaryLocationName' => 'Land',
+   'CreateDate' => 'Skapat datum',
+   'CreationDate' => 'Skapad datum',
+   'Credit' => 'Medverkande',
+   'CustomRendered' => {
+      Description => 'Anpassad bildbearbetning',
+      PrintConv => {
+        'Custom' => 'Anpassad process',
+        'Normal' => 'Normal process',
+      },
+    },
+   'DateCreated' => 'Skapat datum',
+   'DateTimeOriginal' => 'Ursprungligt datum & tid',
+   'DeviceSettingDescription' => 'Beskrivning av enhetsinstÃ€llning',
+   'DigitalZoomRatio' => 'Digitalt zoomomfÃ¥ng',
+   'Directory' => 'Filplats',
+   'DriveMode' => 'EnhetslÃ€ge',
+   'DynamicRangeOptimizer' => {
+      Description => 'Opt.av dyn.omr.',
+      PrintConv => {
+        'Advanced Auto' => 'Avancerad auto',
+        'Advanced Lv1' => 'Avancerad niv1',
+        'Advanced Lv2' => 'Avancerad niv2',
+        'Advanced Lv3' => 'Avancerad niv3',
+        'Advanced Lv4' => 'Avancerad niv4',
+        'Advanced Lv5' => 'Avancerad niv5',
+        'Auto' => 'Automatisk',
+        'Off' => 'Av',
+      },
+    },
+   'ExifImageHeight' => 'Giltig bildhÃ¶jd',
+   'ExifImageWidth' => 'Giltig bildbredd',
+   'ExifOffset' => 'IFD-pekare fÃ¶r Exif',
+   'ExifVersion' => 'Exif-version',
+   'ExposureCompensation' => 'ExponeringsfÃ¶rskjutning',
+   'ExposureIndex' => 'Exponeringsindex',
+   'ExposureMode' => {
+      Description => 'ExponeringslÃ€ge',
+      PrintConv => {
+        'Auto' => 'Automatisk exponering',
+        'Auto bracket' => 'Automatisk alternativexponering',
+        'Manual' => 'Manuell exponering',
+      },
+    },
+   'ExposureProgram' => {
+      Description => 'Exponeringsprogram',
+      PrintConv => {
+        'Action (High speed)' => 'Sport',
+        'Aperture-priority AE' => 'BlÃ€ndarprioritet',
+        'Bulb' => 'GlÃ¶dlampa',
+        'Creative (Slow speed)' => 'Kreativ',
+        'Landscape' => 'Liggande',
+        'Manual' => 'Manuell exponering',
+        'Portrait' => 'StÃ¥ende',
+        'Program AE' => 'Normalt program',
+        'Shutter speed priority AE' => 'Slutarprioritet',
+      },
+    },
+   'ExposureTime' => 'Exponeringstid',
+   'FNumber' => 'BlÃ€ndare',
+   'FileFormat' => 'Format',
+   'FileModifyDate' => 'Uppdateringsdatum',
+   'FileName' => 'Filnamn',
+   'FileSize' => 'Filstorlek',
+   'FileSource' => {
+      Description => 'FilkÃ€lla',
+      PrintConv => {
+        'Digital Camera' => 'DSC',
+        'Film Scanner' => 'Skanner av transparent typ',
+        'Reflection Print Scanner' => 'Skanner av reflextyp',
+      },
+    },
+   'FileType' => 'Filtyp',
+   'Flash' => {
+      Description => 'Blixt',
+      PrintConv => {
+        'Auto, Fired' => 'PÃ
+ (automatisk blixt)',
+        'Auto, Fired, Red-eye reduction' => '"PÃ
+ (automatisk blixt, reducering av rÃ¶da Ã¶gon)"',
+        'Auto, Fired, Red-eye reduction, Return detected' => '"PÃ
+ (automatisk blixt, reducering av rÃ¶da Ã¶gon, reflekterat ljus)"',
+        'Auto, Fired, Return detected' => '"PÃ
+ (automatisk blixt, reflekterat ljus)"',
+        'Did not fire' => 'Blixten utlÃ¶stes inte',
+        'Fired' => 'Blixten utlÃ¶stes',
+        'Fired, Red-eye reduction' => 'PÃ
+ (reducering av rÃ¶da Ã¶gon)',
+        'Fired, Red-eye reduction, Return detected' => '"PÃ
+ (reducering av rÃ¶da Ã¶gon, reflekterat ljus)"',
+        'Fired, Return detected' => 'PÃ
+ (reflekterat ljus)',
+        'No Flash' => 'Ingen blixtfunktion',
+        'On, Fired' => 'PÃ
+ (upplÃ€ttnad)',
+        'On, Red-eye reduction' => '"PÃ
+ (upplÃ€ttnad, reducering av rÃ¶da Ã¶gon)"',
+        'On, Red-eye reduction, Return detected' => '"PÃ
+ upplÃ€ttnad reducering av rÃ¶da Ã¶gon, reflekterat ljus)"',
+        'On, Return detected' => '"PÃ
+ (upplÃ€ttnad, reflekterat ljus)"',
+      },
+    },
+   'FlashEnergy' => 'Blixtenergi',
+   'FlashExposureComp' => 'Blixtkompensering',
+   'FlashpixVersion' => 'Flashpix-version som stÃ¶ds',
+   'FocalLength' => 'BrÃ€nnvidd',
+   'FocalLength35efl' => 'BrÃ€nnvidd (i 35 mm format)',
+   'FocalLengthIn35mmFormat' => 'BrÃ€nnvidd fÃ¶r 35 mm-film',
+   'FocalPlaneResolutionUnit' => {
+      PrintConv => {
+        'inches' => 'tum',
+      },
+    },
+   'FocusMode' => 'Fokustyp',
+   'FrameRate' => 'Bildfrekvens',
+   'FrameSize' => 'Bildstorlek',
+   'GPSAltitude' => 'HÃ¶jd',
+   'GPSAltitudeRef' => {
+      Description => 'HÃ¶jdreferens',
+      PrintConv => {
+        'Above Sea Level' => 'HavsnivÃ¥',
+        'Below Sea Level' => 'HavsnivÃ¥ref. (negativt vÃ€rde)',
+      },
+    },
+   'GPSAreaInformation' => 'Namn pÃ¥ GPS-omrÃ¥de',
+   'GPSDOP' => 'MÃ¥ttprecision',
+   'GPSDateStamp' => 'GPS-datum',
+   'GPSDestBearing' => 'Destination',
+   'GPSDestBearingRef' => 'Referens fÃ¶r destination',
+   'GPSDestDistance' => 'AvstÃ¥nd till destination',
+   'GPSDestDistanceRef' => 'Referens fÃ¶r avstÃ¥nd till destination',
+   'GPSDestLatitude' => 'Destinationsbredd',
+   'GPSDestLatitudeRef' => 'Referens fÃ¶r destionationsbredd',
+   'GPSDestLongitude' => 'DestionationslÃ€ngd',
+   'GPSDestLongitudeRef' => 'Referens fÃ¶r destinationslÃ€ngd',
+   'GPSDifferential' => {
+      Description => 'GPS-differentialkorrigering',
+      PrintConv => {
+        'Differential Corrected' => 'Differentialkorrigering anvÃ€nd',
+        'No Correction' => 'MÃ€tning utan differentialkorrigering',
+      },
+    },
+   'GPSImgDirection' => 'Bildriktning',
+   'GPSImgDirectionRef' => 'Referens fÃ¶r bildriktning',
+   'GPSInfo' => 'IFD-pekare fÃ¶r GPS-information',
+   'GPSLatitude' => 'Bredd',
+   'GPSLatitudeRef' => {
+      Description => 'Nordlig eller sydlig bredd',
+      PrintConv => {
+        'North' => 'Nordlig bredd',
+        'South' => 'Sydlig bredd',
+      },
+    },
+   'GPSLongitude' => 'LÃ€ngd',
+   'GPSLongitudeRef' => {
+      Description => 'Ãstlig eller vÃ€stlig lÃ€ngd',
+      PrintConv => {
+        'East' => 'Ãstlig lÃ€ngd',
+        'West' => 'VÃ€stlig lÃ€ngd',
+      },
+    },
+   'GPSMapDatum' => 'Geodetiska mÃ€tningsdata anvÃ€nda',
+   'GPSMeasureMode' => {
+      Description => 'GPS-mÃ€tningslÃ€ge',
+      PrintConv => {
+        '3-Dimensional Measurement' => '3D-mÃ€tning',
+      },
+    },
+   'GPSProcessingMethod' => 'Namn pÃ¥ GPS-bearbetningsmetod',
+   'GPSSatellites' => 'GPS-satelliter anvÃ€nda fÃ¶r mÃ€tning',
+   'GPSSpeed' => 'Hastighet pÃ¥ GPS-mottagare',
+   'GPSSpeedRef' => {
+      Description => 'Hastighetsenhet',
+      PrintConv => {
+        'km/h' => 'Km/tim',
+        'knots' => 'Knop',
+        'mph' => 'Miles/tim',
+      },
+    },
+   'GPSStatus' => {
+      Description => 'GPS-mottagarstatus',
+      PrintConv => {
+        'Measurement Active' => 'MÃ€tning pÃ¥gÃ¥r',
+        'Measurement Void' => 'MÃ€tningssamverkan',
+      },
+    },
+   'GPSTimeStamp' => 'GPS-tid (atomur)',
+   'GPSTrack' => 'RÃ¶relseriktning',
+   'GPSTrackRef' => {
+      Description => 'Referens fÃ¶r rÃ¶relseriktning',
+      PrintConv => {
+        'Magnetic North' => 'Magnetisk riktning',
+        'True North' => 'Verklig riktning',
+      },
+    },
+   'GPSVersionID' => 'GPS tag version',
+   'GainControl' => {
+      Description => 'FÃ¶rstÃ€rkningskontroll',
+      PrintConv => {
+        'High gain down' => 'HÃ¶g fÃ¶rstÃ€rkning ned',
+        'High gain up' => 'HÃ¶g fÃ¶rstÃ€rkning upp',
+        'Low gain down' => 'LÃ¥g fÃ¶rstÃ€rkning ned',
+        'Low gain up' => 'LÃ¥g fÃ¶rstÃ€rkning upp',
+        'None' => 'Ingen',
+      },
+    },
+   'Gradation' => 'Effektfull',
+   'HDR' => {
+      Description => 'Auto HDR',
+      PrintConv => {
+        'Off' => 'Av',
+      },
+    },
+   'Headline' => 'Rubrik',
+   'HighISONoiseReduction' => {
+      Description => 'HÃ¶g-ISO brusred',
+      PrintConv => {
+        'Auto' => 'Automatisk',
+        'High' => 'HÃ¶g',
+        'Low' => 'LÃ¥g',
+        'Off' => 'Av',
+      },
+    },
+   'Hue' => 'Nyans',
+   'ISO' => 'ISO vÃ€rde',
+   'ImageHeight' => 'BildhÃ¶jd',
+   'ImageSize' => 'Bildstorlek',
+   'ImageUniqueID' => 'Unikt bild-ID',
+   'ImageWidth' => 'Bildbredd',
+   'Index' => 'SmÃ¥bilder',
+   'Instructions' => 'Instruktioner',
+   'InteropIndex' => 'Interoperability Identification',
+   'InteropOffset' => 'Interoperability tag',
+   'InteropVersion' => 'Interoperability Version',
+   'Keywords' => 'Nyckelord',
+   'Lens' => 'Objektiv',
+   'LensInfo' => 'Objektivinformation',
+   'LightSource' => {
+      Description => 'LjuskÃ€lla',
+      PrintConv => {
+        'Cloudy' => 'Mulet',
+        'Cool White Fluorescent' => 'KalljusrÃ¶r (W 3800 - 4500 k)',
+        'Day White Fluorescent' => 'DagljusrÃ¶r, hÃ¶gdager (N 4600 - 5500k)',
+        'Daylight' => 'Dagsljus',
+        'Daylight Fluorescent' => 'DagljusrÃ¶r (D 5700 - 7100 k)',
+        'Fine Weather' => 'Fint vÃ€der',
+        'Flash' => 'Blixt',
+        'Fluorescent' => 'LysrÃ¶rsbelysning',
+        'ISO Studio Tungsten' => 'ISO tungsten studiobelysning',
+        'Other' => 'annan ljuskÃ€lla',
+        'Shade' => 'Skugga',
+        'Standard Light A' => 'Standardljus A',
+        'Standard Light B' => 'Standardljus B',
+        'Standard Light C' => 'Standardljus C',
+        'Tungsten (Incandescent)' => 'Tungsten',
+        'Unknown' => 'okÃ€nt',
+        'Warm White Fluorescent' => 'Varmt vitt fluorescerande (L 2600 - 3250k)',
+        'White Fluorescent' => 'Vit lysrÃ¶rsbelysning (WW 3250 - 3800 k)',
+      },
+    },
+   'Lightness' => 'Ljushet',
+   'Location' => 'Plats',
+   'LongExposureNoiseReduction' => {
+      Description => 'LÃ¥ngexp.brusred',
+      PrintConv => {
+        'Off' => 'Av',
+        'On' => 'PÃ¥',
+      },
+    },
+   'Make' => 'Tillverkare',
+   'MakerNotes' => 'Tillverkare',
+   'MaxAperture' => 'StÃ¶rsta blÃ€ndare',
+   'MeteringMode' => {
+      Description => 'MÃ€tningstyp',
+      PrintConv => {
+        'Average' => 'Genomsnitt',
+        'Center-weighted average' => 'CentrumvÃ€gd genomsnittsmÃ€tning',
+        'Multi-segment' => 'MÃ¶nster',
+        'Multi-spot' => 'MultiSpot',
+        'Other' => 'annat',
+        'Partial' => 'Delvis',
+        'Unknown' => 'okÃ€nt',
+      },
+    },
+   'Model' => 'Kamera',
+   'ModifyDate' => 'FilÃ€ndringsdatum och -tid',
+   'MultiFrameNoiseReduction' => {
+      Description => 'Multi Frame brusred.',
+      PrintConv => {
+        'Off' => 'Av',
+        'On' => 'PÃ¥',
+      },
+    },
+   'NoiseReduction' => 'Brusreducering',
+   'Opto-ElectricConvFactor' => 'Optoelektrisk konverteringsfaktor',
+   'Orientation' => {
+      Description => 'Orientering',
+      PrintConv => {
+        'Horizontal (normal)' => 'Positiv riktning',
+        'Rotate 90 CW' => 'Rotera 90Â° medurs',
+      },
+    },
+   'PhotometricInterpretation' => 'PixelsammansÃ€ttning',
+   'PlanarConfiguration' => {
+      Description => 'Bilddataordning',
+      PrintConv => {
+        'Chunky' => 'Kompakt format',
+        'Planar' => 'Planar format',
+      },
+    },
+   'PrimaryChromaticities' => 'Kromaticitet fÃ¶r primÃ€rfÃ€rger',
+   'Province-State' => 'LÃ€n/provins',
+   'Quality' => {
+      Description => 'Bildkvalitet',
+      PrintConv => {
+        'Compressed RAW' => 'cRAW',
+        'Compressed RAW + JPEG' => 'cRAW+JPEG',
+        'Extra Fine' => 'Extra fin',
+        'Fine' => 'Fin',
+        'Low' => 'LÃ¥g kvalitet',
+        'Normal' => 'Standardkvalitet',
+        'RAW + JPEG' => 'RAW+JPEG',
+      },
+    },
+   'RecordMode' => 'InspelningslÃ€ge',
+   'ReferenceBlackWhite' => 'Par av svartvita referensvÃ€rden',
+   'RelatedImageFileFormat' => 'TillhÃ¶rande bildfilsformat',
+   'RelatedImageHeight' => 'TillhÃ¶rande bildlÃ€ngd',
+   'RelatedImageWidth' => 'TillhÃ¶rande bildbredd',
+   'RelatedSoundFile' => 'TillhÃ¶rande ljudfil',
+   'ResolutionUnit' => {
+      Description => 'Enhet fÃ¶r X- och Y-upplÃ¶sning',
+      PrintConv => {
+        'cm' => 'centimeter',
+        'inches' => 'tum',
+      },
+    },
+   'RowsPerStrip' => 'Antal rader',
+   'SamplesPerPixel' => 'Antal komponenter',
+   'Saturation' => {
+      Description => 'MÃ€ttnad',
+      PrintConv => {
+        'High' => 'HÃ¶g mÃ€ttnad',
+        'Low' => 'LÃ¥g mÃ€ttnad',
+        'Normal' => 'Standard',
+      },
+    },
+   'SceneCaptureType' => {
+      Description => 'Motivtyp',
+      PrintConv => {
+        'Landscape' => 'Landskap',
+        'Night' => 'Nattmotiv',
+        'Portrait' => 'PortrÃ€tt',
+      },
+    },
+   'SceneMode' => {
+      Description => 'Scenval',
+      PrintConv => {
+        '3D Sweep Panorama' => '3D',
+        'Anti Motion Blur' => 'Anti-rÃ¶relseoskÃ€rpa',
+        'Auto' => 'Automatisk',
+        'Cont. Priority AE' => 'Kont. prioritet AE',
+        'Handheld Night Shot' => 'Manuell nattbild',
+        'Landscape' => 'Landskap',
+        'Macro' => 'Makro',
+        'Night Portrait' => 'NattportrÃ€tt',
+        'Night Scene' => 'Nattvy',
+        'Night View/Portrait' => 'Nattvy/portrÃ€tt',
+        'Portrait' => 'PortrÃ€tt',
+        'Sports' => 'SporthÃ€ndelse',
+        'Standard' => '',
+        'Sunset' => 'SolnedgÃ¥ng',
+        'Sweep Panorama' => 'Panorering',
+      },
+    },
+   'SceneType' => {
+      Description => 'Motivtyp',
+      PrintConv => {
+        'Directly photographed' => 'En direktfotograferad bild',
+      },
+    },
+   'SensingMethod' => {
+      Description => 'AvkÃ€nningsmetod',
+      PrintConv => {
+        'Color sequential area' => 'Color sequential area sensor',
+        'Color sequential linear' => 'Color sequential linear sensor',
+        'One-chip color area' => 'One-chip color area sensor',
+        'Three-chip color area' => 'Three-chip color area sensor',
+        'Trilinear' => 'Trilinear sensor',
+        'Two-chip color area' => 'Two-chip color area sensor',
+      },
+    },
+   'SerialNumber' => 'Kamera-ID',
+   'ShadingCompensation' => 'Skuggkompensering',
+   'Sharpness' => {
+      Description => 'SkÃ€rpa',
+      PrintConv => {
+        'Hard' => 'HÃ¥rd',
+        'Normal' => 'Standard',
+        'Soft' => 'Mjuk',
+      },
+    },
+   'ShootingMode' => 'FotograferingslÃ€ge',
+   'ShutterSpeed' => 'Exponeringstid',
+   'ShutterSpeedValue' => 'Slutartid',
+   'Software' => 'Programvara',
+   'Source' => 'KÃ€lla',
+   'SpatialFrequencyResponse' => 'FrekvensomfÃ¥ng',
+   'SpectralSensitivity' => 'Spektral kÃ€nslighet',
+   'State' => 'LÃ€n',
+   'StripByteCounts' => 'Byte komprimerade',
+   'StripOffsets' => 'Plats fÃ¶r bilddata',
+   'SubSecTime' => 'DateTime subseconds',
+   'SubSecTimeDigitized' => 'DateTimeDigitized subseconds',
+   'SubSecTimeOriginal' => 'DateTimeOriginal subseconds',
+   'SubjectArea' => 'Motivyta',
+   'SubjectDistance' => 'MotivavstÃ¥nd',
+   'SubjectDistanceRange' => {
+      Description => 'MotivavstÃ¥nd',
+      PrintConv => {
+        'Close' => 'NÃ€ra hÃ¥ll',
+        'Distant' => 'LÃ¥ngt hÃ¥ll',
+        'Macro' => 'Makro',
+      },
+    },
+   'SubjectLocation' => 'Motivets placering',
+   'SupplementalCategories' => 'TillÃ€ggskategorier',
+   'ThumbnailImage' => 'Miniatyr',
+   'ThumbnailImageSize' => 'Miniatyrstorlek',
+   'Title' => 'Titel',
+   'TransferFunction' => 'ÃverfÃ¶ringsfunktion',
+   'TransmissionReference' => 'SÃ€ndningsreferens',
+   'Urgency' => 'Prioritet',
+   'UserComment' => 'AnvÃ€ndarkommentarer',
+   'WhiteBalance' => {
+      Description => 'Vitbalans',
+      PrintConv => {
+        'Auto' => 'Automatisk vitbalans',
+        'Black & White' => 'Monokrom',
+        'Cloudy' => 'Mulet',
+        'Color Temperature/Color Filter' => 'FÃ€rgtemperatur / FÃ€rgfilter',
+        'Cool White Fluorescent' => 'KalljusrÃ¶r',
+        'Custom' => 'Special',
+        'Custom 1' => 'ANPASSNING1',
+        'Custom 2' => 'ANPASSNING2',
+        'Custom 3' => 'ANPASSNING3',
+        'Custom 4' => 'ANPASSNING4',
+        'Day White Fluorescent' => '"DagljusrÃ¶r, hÃ¶gdager"',
+        'Daylight' => 'Dagsljus',
+        'Daylight Fluorescent' => 'DagljusrÃ¶r',
+        'Flash' => 'Blixt',
+        'Fluorescent' => 'LysrÃ¶rsbelysning',
+        'Manual' => 'Manuell vitbalans',
+        'Shade' => 'Skugga',
+        'Tungsten' => 'GlÃ¶dlampa',
+        'Unknown' => 'okÃ€nt',
+        'Warm White Fluorescent' => 'Varmt vitt fluorescerande',
+        'White Fluorescent' => 'Vit lysrÃ¶rsbelysning',
+      },
+    },
+   'WhitePoint' => 'Vitpunktskromaticitet',
+   'Writer-Editor' => 'Bildtextredigerare',
+   'YCbCrCoefficients' => 'Koefficienter fÃ¶r fÃ€rgomrÃ¥desomvandling',
+   'YCbCrPositioning' => {
+      Description => 'Y- och C-placering',
+      PrintConv => {
+        'Centered' => 'centrerad',
+        'Co-sited' => 'co-sited',
+      },
+    },
+   'YCbCrSubSampling' => 'Subsampling ratio of Y to C',
+   'ZoneMatching' => {
+      Description => 'Zonmatchning',
+      PrintConv => {
+        'High Key' => 'HÃ¶g',
+        'ISO Setting Used' => 'Av',
+        'Low Key' => 'LÃ¥g',
+      },
+    },
+);
+
+1;  # end
+
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Lang::sv.pm - ExifTool Swedish language translations
+
+=head1 DESCRIPTION
+
+This file is used by Image::ExifTool to generate localized tag descriptions
+and values.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Jens Duttke and BjE<ouml>rn SE<ouml>derstrE<ouml>m for providing
+this translation.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool(3pm)|Image::ExifTool>,
+L<Image::ExifTool::TagInfoXML(3pm)|Image::ExifTool::TagInfoXML>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/tr.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/tr.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/tr.pm	(revision 24799)
@@ -0,0 +1,531 @@
+#------------------------------------------------------------------------------
+# File:         tr.pm
+#
+# Description:  ExifTool Turkish language translations
+#
+# Notes:        This file generated automatically by Image::ExifTool::TagInfoXML
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Lang::tr;
+
+use strict;
+use vars qw($VERSION);
+
+$VERSION = '1.02';
+
+%Image::ExifTool::Lang::tr::Translate = (
+   'Album' => 'AlbÃŒm',
+   'Aperture' => 'AÃ§Ä±klÄ±k',
+   'ApertureValue' => 'AÃ§Ä±klÄ±k',
+   'Artist' => 'SanatÃ§Ä±',
+   'Author' => 'Yazar',
+   'AuthorsPosition' => 'YazarÄ±n Pozisyonu',
+   'BitsPerSample' => 'Komponent baÅÄ±na bit sayÄ±sÄ±',
+   'Brightness' => 'ParlaklÄ±k',
+   'By-line' => 'Yazar',
+   'CFAPattern' => 'CFA deseni',
+   'CalibrationIlluminant1' => {
+      PrintConv => {
+        'Cloudy' => 'Bulutlu Hava',
+        'Cool White Fluorescent' => 'SoÄuk beyaz floresan (W 3800 - 4500K)',
+        'Day White Fluorescent' => 'GÃŒn beyaz floresan (N 4600 - 5500K)',
+        'Daylight' => 'GÃŒnÄ±ÅÄ±ÄÄ±',
+        'Daylight Fluorescent' => 'GÃŒnÄ±ÅÄ±ÄÄ± floresan (D 5700 - 7100K)',
+        'Fine Weather' => 'Ä°yi hava',
+        'Flash' => 'FlaÅ',
+        'Fluorescent' => 'Floresan',
+        'ISO Studio Tungsten' => 'ISO stÃŒdyo tungsten',
+        'Other' => 'diÄer Ä±ÅÄ±k kaynaÄÄ±',
+        'Shade' => 'GÃ¶lge',
+        'Standard Light A' => 'Standard IÅÄ±k A',
+        'Standard Light B' => 'Standard IÅÄ±k B',
+        'Standard Light C' => 'Standard IÅÄ±k C',
+        'Tungsten (Incandescent)' => 'Tungsten',
+        'Unknown' => 'bilinmeyen',
+        'White Fluorescent' => 'Beyaz floresan (WW 3250 - 3800K)',
+      },
+    },
+   'CalibrationIlluminant2' => {
+      PrintConv => {
+        'Cloudy' => 'Bulutlu Hava',
+        'Cool White Fluorescent' => 'SoÄuk beyaz floresan (W 3800 - 4500K)',
+        'Day White Fluorescent' => 'GÃŒn beyaz floresan (N 4600 - 5500K)',
+        'Daylight' => 'GÃŒnÄ±ÅÄ±ÄÄ±',
+        'Daylight Fluorescent' => 'GÃŒnÄ±ÅÄ±ÄÄ± floresan (D 5700 - 7100K)',
+        'Fine Weather' => 'Ä°yi hava',
+        'Flash' => 'FlaÅ',
+        'Fluorescent' => 'Floresan',
+        'ISO Studio Tungsten' => 'ISO stÃŒdyo tungsten',
+        'Other' => 'diÄer Ä±ÅÄ±k kaynaÄÄ±',
+        'Shade' => 'GÃ¶lge',
+        'Standard Light A' => 'Standard IÅÄ±k A',
+        'Standard Light B' => 'Standard IÅÄ±k B',
+        'Standard Light C' => 'Standard IÅÄ±k C',
+        'Tungsten (Incandescent)' => 'Tungsten',
+        'Unknown' => 'bilinmeyen',
+        'White Fluorescent' => 'Beyaz floresan (WW 3250 - 3800K)',
+      },
+    },
+   'Caption-Abstract' => 'AÃ§Ä±klama',
+   'CaptionWriter' => 'AÃ§Ä±klama YazarÄ±',
+   'Categories' => 'Kategoriler',
+   'Category' => 'Kategoriler',
+   'City' => 'Åehir',
+   'ColorFilter' => 'Renk Filtresi',
+   'ColorSpace' => {
+      Description => 'Renk alanÄ± bilgisi',
+      PrintConv => {
+        'Uncalibrated' => 'Kalibre edilmemiÅ',
+      },
+    },
+   'ColorTemperature' => 'Renk SÄ±caklÄ±ÄÄ±',
+   'Comment' => 'Yorum',
+   'ComponentsConfiguration' => 'Her komponentin anlamÄ±',
+   'CompressedBitsPerPixel' => 'Ä°maj sÄ±kÄ±ÅtÄ±ma modu',
+   'Compression' => {
+      Description => 'SÄ±kÄ±ÅtÄ±rma planÄ±',
+      PrintConv => {
+        'JPEG' => 'JPEG SÄ±kÄ±ÅtÄ±rma',
+        'Uncompressed' => 'sÄ±kÄ±ÅtÄ±rÄ±lmamÄ±Å',
+      },
+    },
+   'Contrast' => {
+      Description => 'Kontrast',
+      PrintConv => {
+        'High' => 'Sert',
+        'Low' => 'YumuÅak',
+        'Normal' => 'Standard',
+      },
+    },
+   'Copyright' => 'Telif hakkÄ± sahibi',
+   'CopyrightNotice' => 'Telif HakkÄ± UyarÄ±sÄ±',
+   'Country' => 'Ãlke',
+   'Country-PrimaryLocationName' => 'Ãlke',
+   'CreateDate' => 'OluÅturma Tarihi',
+   'CreationDate' => 'YaratÄ±lÄ±Å tarihi',
+   'Credit' => 'Jenerik',
+   'CustomRendered' => {
+      Description => 'Ãzel imaj iÅleme',
+      PrintConv => {
+        'Custom' => 'Ãzel iÅlem',
+        'Normal' => 'Normal iÅlem',
+      },
+    },
+   'DateCreated' => 'OluÅturma Tarihi',
+   'DateTimeOriginal' => 'Orjinal Tarih & Zaman',
+   'DeviceSettingDescription' => 'Cihaz ayar tanÄ±mlarÄ±',
+   'DigitalZoom' => 'Dijital Zoom',
+   'DigitalZoomRatio' => 'Dijital zoom oranÄ±',
+   'Directory' => 'Dosya Konumu',
+   'DriveMode' => 'SÃŒrÃŒÅ Modu',
+   'ExifImageHeight' => 'GeÃ§erli imaj yÃŒksekliÄi',
+   'ExifImageWidth' => 'GeÃ§erli imaj eni',
+   'ExifOffset' => 'Exif IFD Ä°mleci',
+   'ExifVersion' => 'Exif sÃŒrÃŒm',
+   'ExposureCompensation' => 'Pozlama SapmasÄ±',
+   'ExposureIndex' => 'Pozlama indeksi',
+   'ExposureMode' => {
+      Description => 'Pozlama modu',
+      PrintConv => {
+        'Auto' => 'Otomatik',
+        'Auto bracket' => 'Otomatik Ã§erÃ§eve',
+        'Manual' => 'Manuel pozlama',
+      },
+    },
+   'ExposureProgram' => {
+      Description => 'Pozlama program',
+      PrintConv => {
+        'Action (High speed)' => 'Hareket programÄ±',
+        'Aperture-priority AE' => 'ApertÃŒr Ã¶nceliÄi',
+        'Bulb' => 'Ampul',
+        'Creative (Slow speed)' => 'YaratÄ±cÄ± program',
+        'Landscape' => 'Manzara',
+        'Manual' => 'Manuel Pozlama',
+        'Portrait' => 'Portre',
+        'Program AE' => 'Normal program',
+        'Shutter speed priority AE' => 'DeklanÅÃ¶r Ã¶nceliÄi',
+      },
+    },
+   'ExposureTime' => 'Poz sÃŒresi',
+   'FNumber' => 'AÃ§Ä±klÄ±k',
+   'FileFormat' => 'Format',
+   'FileModifyDate' => 'GÃŒncellenen Tarih',
+   'FileName' => 'Dosya adÄ±',
+   'FileSize' => 'Dosya boyutu',
+   'FileSource' => {
+      Description => 'Dosya kaynaÄÄ±',
+      PrintConv => {
+        'Digital Camera' => 'DSC',
+        'Film Scanner' => 'Transparan tip tarayÄ±cÄ±',
+        'Reflection Print Scanner' => 'Refleks tipi tarayÄ±cÄ±',
+      },
+    },
+   'FileType' => 'Dosya tÃŒrÃŒ',
+   'Flash' => {
+      Description => 'FlaÅ',
+      PrintConv => {
+        'Auto, Fired' => 'AÃIK (Otom-flaÅ)',
+        'Auto, Fired, Red-eye reduction' => '"AÃIK (Otom-flaÅ, KÄ±rmÄ±zÄ±-GÃ¶z Azaltma)"',
+        'Auto, Fired, Red-eye reduction, Return detected' => '"AÃIK (Otom-flaÅ, KÄ±rmÄ±zÄ±-GÃ¶z Azaltma, Geri dÃ¶nen Ä±ÅÄ±k bulundu)"',
+        'Auto, Fired, Return detected' => '"AÃIK (Otom-flaÅ, Geri dÃ¶nen Ä±ÅÄ±k bulundu)"',
+        'Did not fire' => 'FlaÅ patlamadÄ±',
+        'Fired' => 'FlaÅ patladÄ±',
+        'Fired, Red-eye reduction' => 'AÃIK (KÄ±rmÄ±zÄ±-GÃ¶z Azaltma)',
+        'Fired, Red-eye reduction, Return detected' => '"AÃIK (KÄ±rmÄ±zÄ±-GÃ¶z Azaltma, Geri dÃ¶nen Ä±ÅÄ±k bulundu)"',
+        'Fired, Return detected' => 'AÃIK (Geri dÃ¶nen Ä±ÅÄ±k bulundu)',
+        'No Flash' => 'FlaÅ fonksiyonu yok',
+        'On, Fired' => 'AÃIK (Doldurma)',
+        'On, Red-eye reduction' => '"AÃIK (Doldurma, KÄ±rmÄ±zÄ±-GÃ¶z Ãnleme)"',
+        'On, Red-eye reduction, Return detected' => '"AÃIK (Doldurma, KÄ±rmÄ±zÄ±-GÃ¶z Ãnleme, Geri dÃ¶nen Ä±ÅÄ±k bulundu)"',
+        'On, Return detected' => '"AÃIK (Doldurma, Geri dÃ¶nen Ä±ÅÄ±k bulundu)"',
+      },
+    },
+   'FlashEnergy' => 'FlaÅ enerjisi',
+   'FlashExposureComp' => 'FlaÅ Telafisi',
+   'FlashpixVersion' => 'Desteklenen Flashpix sÃŒrÃŒmÃŒ',
+   'FocalLength' => 'Odak uzunluÄu',
+   'FocalLength35efl' => 'Odak UzaklÄ±ÄÄ± (35 mm dengi)',
+   'FocalLengthIn35mmFormat' => '35mm filmde odak uzaklÄ±ÄÄ±',
+   'FocalPlaneResolutionUnit' => {
+      Description => 'Odak dÃŒzlemi Ã§Ã¶zÃŒnÃŒrlÃŒk birimi',
+      PrintConv => {
+        'inches' => 'inÃ§',
+      },
+    },
+   'FocalPlaneXResolution' => 'Odak dÃŒzlemi X Ã§Ã¶zÃŒnÃŒrlÃŒÄÃŒ',
+   'FocalPlaneYResolution' => 'Odak dÃŒzlemi Y Ã§Ã¶zÃŒnÃŒrlÃŒÄÃŒ',
+   'FocusMode' => 'Odak modu',
+   'FrameRate' => 'Kare HÄ±zÄ±',
+   'FrameSize' => 'Kare Boyutu',
+   'GPSAltitude' => 'YÃŒkseklik',
+   'GPSAltitudeRef' => {
+      Description => 'YÃŒkselti referansÄ±',
+      PrintConv => {
+        'Above Sea Level' => 'Deniz dÃŒzeyi',
+        'Below Sea Level' => 'Deniz dÃŒzeyi referansÄ± (negatif deÄer)',
+      },
+    },
+   'GPSAreaInformation' => 'GPS AlanÄ±nÄ±n ismi',
+   'GPSDOP' => 'ÃlÃ§ÃŒm hassaslÄ±ÄÄ±',
+   'GPSDateStamp' => 'GPS alanÄ±',
+   'GPSDestBearing' => 'VarÄ±Å yÃ¶nÃŒ',
+   'GPSDestBearingRef' => 'VarÄ±Å yÃ¶nÃŒ iÃ§in referans',
+   'GPSDestDistance' => 'VarÄ±Åa uzaklÄ±k',
+   'GPSDestDistanceRef' => 'VarÄ±Åa uzaklÄ±k iÃ§in referans',
+   'GPSDestLatitude' => 'VarÄ±ÅÄ±n enlemi',
+   'GPSDestLatitudeRef' => 'VarÄ±ÅÄ±n enlemi iÃ§in referans',
+   'GPSDestLongitude' => 'VarÄ±ÅÄ±n boylamÄ±',
+   'GPSDestLongitudeRef' => 'VarÄ±ÅÄ±n boylamÄ± iÃ§in referans',
+   'GPSDifferential' => {
+      Description => 'GPS diferansiyel dÃŒzeltme',
+      PrintConv => {
+        'Differential Corrected' => 'Difrensiyel dÃŒzeltme uygulandÄ±',
+        'No Correction' => 'Difrensiyel dÃŒzeltme olmadan Ã¶lÃ§ÃŒm',
+      },
+    },
+   'GPSImgDirection' => 'Ä°majÄ±n yÃ¶nÃŒ',
+   'GPSImgDirectionRef' => 'Ä°majÄ±n yÃ¶nÃŒ iÃ§in referans',
+   'GPSInfo' => 'GPS Info IDF Ä°mleci',
+   'GPSLatitude' => 'Enlem',
+   'GPSLatitudeRef' => {
+      Description => 'Kuzey veya GÃŒney Enlemi',
+      PrintConv => {
+        'North' => 'Kuzey enlemi',
+        'South' => 'GÃŒney enlemi',
+      },
+    },
+   'GPSLongitude' => 'Boylam',
+   'GPSLongitudeRef' => {
+      Description => 'DoÄu veya BatÄ± BoylamÄ±',
+      PrintConv => {
+        'East' => 'DoÄu boylamÄ±',
+        'West' => 'BatÄ± boylamÄ±',
+      },
+    },
+   'GPSMapDatum' => 'Geodetik veri kullanÄ±ldÄ±',
+   'GPSMeasureMode' => {
+      Description => 'GPS Ã¶lÃ§ÃŒm modu',
+      PrintConv => {
+        '3-Dimensional Measurement' => '3-boyutlu Ã¶lÃ§ÃŒm',
+      },
+    },
+   'GPSProcessingMethod' => 'GPS iÅlem metodunun ismi',
+   'GPSSatellites' => 'ÃlÃ§ÃŒm iÃ§in kullanÄ±lan GPS uydularÄ±',
+   'GPSSpeed' => 'GSP alÄ±cÄ±nÄ±n hÄ±zÄ±',
+   'GPSSpeedRef' => {
+      Description => 'HÄ±z Ãnitesi',
+      PrintConv => {
+        'km/h' => 'km / saat',
+        'knots' => 'Knot',
+        'mph' => 'Mil / saat',
+      },
+    },
+   'GPSStatus' => {
+      Description => 'GPS alÄ±cÄ± durumu',
+      PrintConv => {
+        'Measurement Active' => 'Ä°lerlemeli Ã¶lÃ§ÃŒm',
+        'Measurement Void' => 'ÃlÃ§ÃŒ Birlikte Ä°ÅlerliÄi',
+      },
+    },
+   'GPSTimeStamp' => 'GPS saati (atomik saat)',
+   'GPSTrack' => 'Hareket yÃ¶nÃŒ',
+   'GPSTrackRef' => {
+      Description => 'Hareket yÃ¶nÃŒ iÃ§in referans',
+      PrintConv => {
+        'Magnetic North' => 'Manyetik yÃ¶n',
+        'True North' => 'GerÃ§ek yÃ¶n',
+      },
+    },
+   'GPSVersionID' => 'GSP etiket sÃŒrÃŒmÃŒ',
+   'GainControl' => {
+      Description => 'Kontrol Kazan',
+      PrintConv => {
+        'High gain down' => 'YÃŒksek kazanÃ§ aÅaÄÄ±',
+        'High gain up' => 'YÃŒksek kazanÃ§ yukarÄ±',
+        'Low gain down' => 'DÃŒÅek kazanÃ§ aÅaÄÄ±',
+        'Low gain up' => 'DÃŒÅÃŒk kazanÃ§ yukarÄ±',
+        'None' => 'HiÃ§biri',
+      },
+    },
+   'Gradation' => 'Dereceleme',
+   'Headline' => 'BaÅlÄ±k',
+   'Hue' => 'Renk',
+   'ISO' => 'ISO deÄeri',
+   'ImageHeight' => 'Ä°maj yÃŒksekliÄi',
+   'ImageSize' => 'Ä°maj Boyutu',
+   'ImageUniqueID' => 'Kendine has imaj ID',
+   'ImageWidth' => 'Ä°maj geniÅliÄi',
+   'Index' => 'Ä°ndeks',
+   'Instructions' => 'Talimatlar',
+   'InteropIndex' => 'Interoperabilite TanÄ±mÄ±',
+   'InteropOffset' => 'Interoperabilite etiketi',
+   'InteropVersion' => 'Interoperabilite SÃŒrÃŒmÃŒ',
+   'Keywords' => 'Anahtar sÃ¶zcÃŒkler',
+   'Lens' => 'Objektif',
+   'LensInfo' => 'Lens Bilgisi',
+   'LightSource' => {
+      Description => 'IÅÄ±k kaynaÄÄ±',
+      PrintConv => {
+        'Cloudy' => 'Bulutlu Hava',
+        'Cool White Fluorescent' => 'SoÄuk beyaz floresan (W 3800 - 4500K)',
+        'Day White Fluorescent' => 'GÃŒn beyaz floresan (N 4600 - 5500K)',
+        'Daylight' => 'GÃŒnÄ±ÅÄ±ÄÄ±',
+        'Daylight Fluorescent' => 'GÃŒnÄ±ÅÄ±ÄÄ± floresan (D 5700 - 7100K)',
+        'Fine Weather' => 'Ä°yi hava',
+        'Flash' => 'FlaÅ',
+        'Fluorescent' => 'Floresan',
+        'ISO Studio Tungsten' => 'ISO stÃŒdyo tungsten',
+        'Other' => 'diÄer Ä±ÅÄ±k kaynaÄÄ±',
+        'Shade' => 'GÃ¶lge',
+        'Standard Light A' => 'Standard IÅÄ±k A',
+        'Standard Light B' => 'Standard IÅÄ±k B',
+        'Standard Light C' => 'Standard IÅÄ±k C',
+        'Tungsten (Incandescent)' => 'Tungsten',
+        'Unknown' => 'bilinmeyen',
+        'White Fluorescent' => 'Beyaz floresan (WW 3250 - 3800K)',
+      },
+    },
+   'Lightness' => 'IÅÄ±k',
+   'Location' => 'Mevki',
+   'Make' => 'Ãretici',
+   'MakerNotes' => 'Ãretici notlarÄ±',
+   'MaxAperture' => 'Maksimum lens aÃ§Ä±klÄ±ÄÄ±',
+   'MeteringMode' => {
+      Description => 'ÃlÃ§ÃŒ modu',
+      PrintConv => {
+        'Average' => 'Ortalama',
+        'Center-weighted average' => 'CenterWeightedAverage',
+        'Multi-segment' => 'Desen',
+        'Multi-spot' => 'Multispot',
+        'Other' => 'diÄer',
+        'Partial' => 'KÄ±smen',
+        'Unknown' => 'bilinmeyen',
+      },
+    },
+   'Model' => 'Kamera',
+   'ModifyDate' => 'Dosya deÄiÅim tarih ve zamanÄ±',
+   'NoiseReduction' => 'Parazit azaltÄ±mÄ±',
+   'Opto-ElectricConvFactor' => 'Optoelektrik Ã§evrim faktÃ¶rÃŒ',
+   'Orientation' => {
+      Description => 'YÃ¶nelim',
+      PrintConv => {
+        'Horizontal (normal)' => 'Pozitif yÃ¶n',
+        'Rotate 90 CW' => 'Saat yÃ¶nÃŒnde 90Â° dÃ¶ndÃŒr',
+      },
+    },
+   'PhotometricInterpretation' => 'Piksel kompozisyonu',
+   'PlanarConfiguration' => {
+      Description => 'Ä°maj veri aranjmanÄ±',
+      PrintConv => {
+        'Chunky' => 'Chunky format',
+        'Planar' => 'Planar format',
+      },
+    },
+   'PrimaryChromaticities' => 'Ä°lklerin kromatikleri',
+   'Province-State' => 'Eyalet/BÃ¶lge',
+   'Quality' => {
+      PrintConv => {
+        'Low' => 'DÃŒÅÃŒk Kalite',
+        'Normal' => 'Standart Kalite',
+      },
+    },
+   'RecordMode' => 'KayÄ±t modu',
+   'ReferenceBlackWhite' => 'Bir Ã§ift siyah ve beyaz referans deÄerleri',
+   'RelatedImageFileFormat' => 'Ä°lgili GÃ¶rÃŒntÃŒ Dosya FormatÄ±',
+   'RelatedImageHeight' => 'Ä°lgili Ä°maj YÃŒksekliÄi',
+   'RelatedImageWidth' => 'Ä°lgili Ä°maj GeniÅliÄi',
+   'RelatedSoundFile' => 'Ä°lgili ses dosyasÄ±',
+   'ResolutionUnit' => {
+      Description => 'X ve Y birim Ã§Ã¶zÃŒnÃŒrlÃŒÄÃŒ',
+      PrintConv => {
+        'cm' => 'santimetre',
+        'inches' => 'inÃ§',
+      },
+    },
+   'RowsPerStrip' => 'Åerit baÅÄ±na satÄ±r sayÄ±sÄ±',
+   'SamplesPerPixel' => 'Komponent sayÄ±sÄ±',
+   'Saturation' => {
+      Description => 'Doyma',
+      PrintConv => {
+        'High' => 'YÃŒksek Doyma',
+        'Low' => 'DÃŒÅÃŒk Doyma',
+        'Normal' => 'Standard',
+      },
+    },
+   'SceneCaptureType' => {
+      Description => 'Senaryo yakalama tipi',
+      PrintConv => {
+        'Landscape' => 'Manzara',
+        'Night' => 'Gece Ã§ekimi',
+        'Portrait' => 'Portre',
+      },
+    },
+   'SceneMode' => {
+      PrintConv => {
+        'Sunset' => 'GÃŒnbatÄ±mÄ±',
+      },
+    },
+   'SceneType' => {
+      Description => 'Senaryo tipi',
+      PrintConv => {
+        'Directly photographed' => 'DoÄrudan fotograflanmÄ±Å imaj',
+      },
+    },
+   'SensingMethod' => {
+      Description => 'AlÄ±cÄ± metodu',
+      PrintConv => {
+        'Color sequential area' => 'Renk ardaÅÄ±k alan alÄ±cÄ±sÄ±',
+        'Color sequential linear' => 'Renk ardÄ±ÅÄ±k Ã§izgisel alÄ±cÄ±',
+        'One-chip color area' => 'Tek-Ã§ip renk alanÄ± alÄ±cÄ±',
+        'Three-chip color area' => 'ÃÃ§-Ã§ip renk alanÄ± alÄ±cÄ±',
+        'Trilinear' => 'Triple Ã§izgisel alÄ±cÄ±',
+        'Two-chip color area' => 'Ä°ki-Ã§ip renk alanÄ± alÄ±cÄ±',
+      },
+    },
+   'SerialNumber' => 'Kamera ID',
+   'ShadingCompensation' => 'GÃ¶lgelendirme Telafisi',
+   'Sharpness' => {
+      Description => 'Keskinlik',
+      PrintConv => {
+        'Hard' => 'Sert',
+        'Normal' => 'Standard',
+        'Soft' => 'YumuÅak',
+      },
+    },
+   'ShootingMode' => 'Ãekim Modu',
+   'ShutterSpeed' => 'Poz sÃŒresi',
+   'ShutterSpeedValue' => 'DeklanÅÃ¶r hÄ±zÄ±',
+   'Software' => 'KullanÄ±lan yazÄ±lÄ±m',
+   'Source' => 'Kaynak',
+   'SpatialFrequencyResponse' => 'Uzaysal frekans cevabÄ±',
+   'SpectralSensitivity' => 'Uzaysal hassaslÄ±k',
+   'State' => 'Eyalet',
+   'StripByteCounts' => 'SÄ±kÄ±ÅtÄ±rÄ±lmÄ±Å Åerit baÅÄ±na bayt',
+   'StripOffsets' => 'Ä°maj veri konumu',
+   'SubSecTime' => 'TarihZaman altsaniyeler',
+   'SubSecTimeDigitized' => 'TarihZamanDijitize altsaniyeler',
+   'SubSecTimeOriginal' => 'TarihZamanOrjinal altsaniyeler',
+   'SubjectArea' => 'Obje alanÄ±',
+   'SubjectDistance' => 'Obje uzaklÄ±ÄÄ±',
+   'SubjectDistanceRange' => {
+      Description => 'Obje uzaklÄ±k menzili',
+      PrintConv => {
+        'Close' => 'YakÄ±n gÃ¶rÃŒntÃŒ',
+        'Distant' => 'Uzak gÃ¶rÃŒntÃŒ',
+        'Macro' => 'Makro',
+      },
+    },
+   'SubjectLocation' => 'Obje konumu',
+   'SupplementalCategories' => 'TamamlayÄ±cÄ± Kategoriler',
+   'ThumbnailImage' => 'KÃŒÃ§ÃŒk Resim',
+   'ThumbnailImageSize' => 'KÃŒÃ§ÃŒk resim boyutu',
+   'Title' => 'BaÅlÄ±k',
+   'TransferFunction' => 'Transfer fonksiyonu',
+   'TransmissionReference' => 'Ä°letim BaÅvurusu',
+   'Urgency' => 'Acil',
+   'UserComment' => 'KullanÄ±cÄ± yorumlarÄ±',
+   'WhiteBalance' => {
+      Description => 'Beyaz ayarÄ±',
+      PrintConv => {
+        'Auto' => 'Otomatik beyaz ayarÄ±',
+        'Black & White' => 'Monokrom',
+        'Cloudy' => 'Bulutlu hava',
+        'Cool White Fluorescent' => 'SoÄuk beyaz floresan',
+        'Custom 1' => 'ÃZEL1',
+        'Custom 2' => 'ÃZEL2',
+        'Custom 3' => 'ÃZEL3',
+        'Custom 4' => 'ÃZEL4',
+        'Day White Fluorescent' => 'GÃŒn beyaz floresan',
+        'Daylight' => 'GÃŒnÄ±ÅÄ±ÄÄ±',
+        'Daylight Fluorescent' => 'GÃŒnÄ±ÅÄ±ÄÄ± floresan',
+        'Fluorescent' => 'Floresan',
+        'Manual' => 'Elle beyaz ayarÄ±',
+        'Shade' => 'GÃ¶lge',
+        'Tungsten' => 'Tungsten Ä±ÅÄ±k',
+      },
+    },
+   'WhitePoint' => 'Beya nokta kromatik',
+   'Writer-Editor' => 'AÃ§Ä±klama YazarÄ±',
+   'YCbCrCoefficients' => 'Renk alanÄ± transformasyon matriks katsayÄ±sÄ±',
+   'YCbCrPositioning' => {
+      Description => 'Y ve C konumlama',
+      PrintConv => {
+        'Centered' => 'ortalanmÄ±Å',
+        'Co-sited' => 'birlikte-konumlanmÄ±Å',
+      },
+    },
+   'YCbCrSubSampling' => 'Y den C\'ye alt Ã¶rnekleme oranÄ±',
+);
+
+1;  # end
+
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Lang::tr.pm - ExifTool Turkish language translations
+
+=head1 DESCRIPTION
+
+This file is used by Image::ExifTool to generate localized tag descriptions
+and values.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Jens Duttke, Hasan Yildirim and Cihan Ulusoy for providing this
+translation.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool(3pm)|Image::ExifTool>,
+L<Image::ExifTool::TagInfoXML(3pm)|Image::ExifTool::TagInfoXML>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/zh_cn.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/zh_cn.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/zh_cn.pm	(revision 24799)
@@ -0,0 +1,1489 @@
+#------------------------------------------------------------------------------
+# File:         zh_cn.pm
+#
+# Description:  ExifTool Simplified Chinese language translations
+#
+# Notes:        This file generated automatically by Image::ExifTool::TagInfoXML
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Lang::zh_cn;
+
+use strict;
+use vars qw($VERSION);
+
+$VERSION = '1.05';
+
+%Image::ExifTool::Lang::zh_cn::Translate = (
+   'AEProgramMode' => {
+      PrintConv => {
+        'Landscape' => 'é£æ¯',
+        'Portrait' => 'äººç©',
+      },
+    },
+   'AFAreaIllumination' => {
+      PrintConv => {
+        'Auto' => 'èªåš',
+      },
+    },
+   'AFPointIllumination' => {
+      PrintConv => {
+        'Auto' => 'èªåš',
+      },
+    },
+   'AFPointMode' => {
+      PrintConv => {
+        'Auto' => 'èªåš',
+      },
+    },
+   'AFPointRegistration' => {
+      PrintConv => {
+        'Automatic' => 'èªåš',
+      },
+    },
+   'AFPointSelected' => {
+      PrintConv => {
+        'Auto' => 'èªåš',
+      },
+    },
+   'AFPointSelected2' => {
+      PrintConv => {
+        'Auto' => 'èªåš',
+      },
+    },
+   'AFPointsUnknown2' => {
+      PrintConv => {
+        'Auto' => 'èªåš',
+      },
+    },
+   'APEVersion' => 'APE çæ¬',
+   'AdultContentWarning' => {
+      PrintConv => {
+        'Unknown' => 'æªç¥',
+      },
+    },
+   'Album' => 'çžå',
+   'Anti-Blur' => {
+      PrintConv => {
+        'n/a' => 'æªè®Ÿçœ®',
+      },
+    },
+   'Aperture' => 'å
+åæ°',
+   'ApertureValue' => 'å
+å',
+   'Artist' => 'åŸåäœè
+',
+   'Author' => 'äœè
+',
+   'AuthorsPosition' => 'èäœ',
+   'AutoLightingOptimizer' => {
+      PrintConv => {
+        'n/a' => 'æªè®Ÿçœ®',
+      },
+    },
+   'AutoRotate' => {
+      PrintConv => {
+        'Rotate 180' => '180Â° (åº/å³)',
+        'Rotate 270 CW' => '90Â° CW (å·Š/åº)',
+        'Rotate 90 CW' => '90Â° CCW (å³/äž)',
+        'n/a' => 'æªç¥',
+      },
+    },
+   'BatteryLevel' => 'çµæ± çµé',
+   'BitsPerSample' => 'æ¯äžªç»ä»¶çæ¯ç¹æ°',
+   'BracketShotNumber' => {
+      PrintConv => {
+        'n/a' => 'æªè®Ÿçœ®',
+      },
+    },
+   'Brightness' => 'äº®åºŠ',
+   'BrightnessValue' => 'äº®åºŠ',
+   'By-line' => 'äœè
+',
+   'CFAPattern' => 'CFA æš¡åŒ',
+   'CalibrationIlluminant1' => {
+      PrintConv => {
+        'Cloudy' => 'éŽå€©',
+        'Cool White Fluorescent' => 'å·çœè²è§å
+ç¯ïŒW3800-4500KïŒ',
+        'Day White Fluorescent' => 'æ¥å
+çœè²è§å
+ç¯ïŒN4600-5500KïŒ',
+        'Daylight' => 'å€ªé³å
+',
+        'Daylight Fluorescent' => 'æ¥å
+è²è§å
+ç¯ïŒD5700-7100KïŒ',
+        'Fine Weather' => 'æŽå€©',
+        'Flash' => 'éªå
+',
+        'Fluorescent' => 'è§å
+',
+        'ISO Studio Tungsten' => 'ISOçžå®€çœçœç¯',
+        'Other' => 'å
+¶ä»å
+æº',
+        'Shade' => 'éŽåœ±',
+        'Standard Light A' => 'æ åå
+A',
+        'Standard Light B' => 'æ åå
+B',
+        'Standard Light C' => 'æ åå
+C',
+        'Tungsten (Incandescent)' => 'çœçœç¯',
+        'Unknown' => 'æªç¥',
+        'White Fluorescent' => 'çœè²è§å
+ç¯ïŒWW3250-3800KïŒ',
+        'Warm White Fluorescent' => 'æçœè§å
+ç¯ïŒL2600-3250KïŒ',
+      },
+    },
+   'CalibrationIlluminant2' => {
+      PrintConv => {
+        'Cloudy' => 'éŽå€©',
+        'Cool White Fluorescent' => 'å·çœè²è§å
+ç¯ïŒW3800-4500KïŒ',
+        'Day White Fluorescent' => 'æ¥å
+çœè²è§å
+ç¯ïŒN4600-5500KïŒ',
+        'Daylight' => 'å€ªé³å
+',
+        'Daylight Fluorescent' => 'æ¥å
+è²è§å
+ç¯ïŒD5700-7100KïŒ',
+        'Fine Weather' => 'æŽå€©',
+        'Flash' => 'éªå
+',
+        'Fluorescent' => 'è§å
+',
+        'ISO Studio Tungsten' => 'ISOçžå®€çœçœç¯',
+        'Other' => 'å
+¶ä»å
+æº',
+        'Shade' => 'éŽåœ±',
+        'Standard Light A' => 'æ åå
+A',
+        'Standard Light B' => 'æ åå
+B',
+        'Standard Light C' => 'æ åå
+C',
+        'Tungsten (Incandescent)' => 'çœçœç¯',
+        'Unknown' => 'æªç¥',
+        'White Fluorescent' => 'çœè²è§å
+ç¯ïŒWW3250-3800KïŒ',
+        'Warm White Fluorescent' => 'æçœè§å
+ç¯ïŒL2600-3250KïŒ',
+      },
+    },
+   'CameraOrientation' => {
+      Description => 'åŸååå',
+      PrintConv => {
+        'Horizontal (normal)' => '0Â° (äž/å·Š)',
+        'Rotate 270 CW' => '90Â° CW (å·Š/åº)',
+        'Rotate 90 CW' => '90Â° CCW (å³/äž)',
+      },
+    },
+   'CanonExposureMode' => {
+      PrintConv => {
+        'Aperture-priority AE' => 'å
+åäŒå
+',
+        'Manual' => 'æåš',
+        'Shutter speed priority AE' => 'å¿«éšäŒå
+',
+      },
+    },
+   'CanonFlashMode' => {
+      PrintConv => {
+        'Auto' => 'èªåš',
+      },
+    },
+   'Caption-Abstract' => 'è¯Žæ',
+   'CaptionWriter' => 'è¯Žæäœè
+',
+   'CaptureXResolutionUnit' => {
+      PrintConv => {
+        'um' => 'Âµm (åŸ®ç±³)',
+      },
+    },
+   'CaptureYResolutionUnit' => {
+      PrintConv => {
+        'um' => 'Âµm (åŸ®ç±³)',
+      },
+    },
+   'Categories' => 'ç±»å«',
+   'Category' => 'ç±»å«',
+   'City' => 'ååž',
+   'ColorEffect' => {
+      PrintConv => {
+        'Sepia' => 'ææ§æ·±åå¡è²',
+      },
+    },
+   'ColorFilter' => 'é¢è²æ»€é',
+   'ColorMode' => {
+      Description => 'åæé£æ Œ',
+      PrintConv => {
+        'Autumn Leaves' => 'çº¢å¶',
+        'B&W' => 'é»çœ',
+        'Clear' => 'æž
+æŸ',
+        'Deep' => 'æ·±è²',
+        'Landscape' => 'é£æ¯',
+        'Light' => 'èœ»æ·¡',
+        'Neutral' => 'äž­æ§',
+        'Night View' => 'å€æ¯',
+        'Night View/Portrait' => 'å€æèå',
+        'Portrait' => 'äººç©',
+        'Standard' => 'æ å',
+        'Sunset' => 'é»æ',
+        'Vivid' => 'çåšè²åœ©',
+      },
+    },
+   'ColorSpace' => {
+      Description => 'è²åœ©ç©ºéŽä¿¡æ¯',
+      PrintConv => {
+        'ICC Profile' => 'è²åœ©ç¹æ§æä»¶',
+        'Uncalibrated' => 'èªå',
+      },
+    },
+   'ColorTemperature' => 'è²æž©',
+   'CommanderGroupAMode' => {
+      PrintConv => {
+        'Manual' => 'æåš',
+      },
+    },
+   'CommanderGroupBMode' => {
+      PrintConv => {
+        'Manual' => 'æåš',
+      },
+    },
+   'CommanderInternalFlash' => {
+      PrintConv => {
+        'Manual' => 'æåš',
+      },
+    },
+   'Comment' => 'æ³šé',
+   'ComponentsConfiguration' => 'ååç»çå«ä¹',
+   'CompressedBitsPerPixel' => 'åŸååçŒ©æš¡åŒ',
+   'Compression' => {
+      Description => 'åçŒ©æ¹æ¡',
+      PrintConv => {
+        'JPEG' => 'JEPGåçŒ©ç',
+        'JPEG (old-style)' => 'JPEG (æ§æ ·åŒ)',
+        'Kodak DCR Compressed' => 'æ¯èŸŸ DCR åçŒ©',
+        'Kodak KDC Compressed' => 'æ¯èŸŸ KDC åçŒ©',
+        'Next' => 'NeXT 2æ¯ç¹çŒç ',
+        'Nikon NEF Compressed' => 'å°Œåº· NEF åçŒ©',
+        'Pentax PEF Compressed' => 'å®ŸåŸ PEF åçŒ©',
+        'SGILog' => 'SGI 32æ¯ç¹å¯¹æ°äº®åºŠçŒç ',
+        'SGILog24' => 'SGI 24æ¯ç¹å¯¹æ°äº®åºŠçŒç ',
+        'Sony ARW Compressed' => 'çŽ¢å°Œ ARW åçŒ©',
+        'Thunderscan' => 'ThunderScan 4æ¯ç¹çŒç ',
+        'Uncompressed' => 'æªåçŒ©',
+      },
+    },
+   'Contrast' => {
+      Description => 'å¯¹æ¯åºŠ',
+      PrintConv => {
+        'High' => 'ç¡¬è°',
+        'Low' => 'èœ¯è°',
+        'Normal' => 'æ å',
+      },
+    },
+   'ControlMode' => {
+      PrintConv => {
+        'n/a' => 'æªè®Ÿçœ®',
+      },
+    },
+   'Copyright' => 'äžå©æ¥æè
+',
+   'CopyrightNotice' => 'çæä¿¡æ¯',
+   'CopyrightStatus' => {
+      PrintConv => {
+        'Unknown' => 'æªç¥',
+      },
+    },
+   'Country' => 'åœå®¶',
+   'Country-PrimaryLocationName' => 'åœå®¶',
+   'CreateDate' => 'æ°å­æ°æ®äº§ççæ¥æåæ¶éŽ',
+   'Credit' => 'äœè
+',
+   'CustomRendered' => {
+      Description => 'çšæ·èªå®ä¹åŸåå€ç',
+      PrintConv => {
+        'Custom' => 'èªå®ä¹å€ç',
+        'Normal' => 'æ®éæš¡åŒ',
+      },
+    },
+   'DateCreated' => 'åå»ºæ¥æ',
+   'DateTime' => 'æä»¶æ¹åçæ¥æåæ¶éŽ',
+   'DateTimeOriginal' => 'åå§æ°æ®äº§ççæ¥æåæ¶éŽ',
+   'DeviceSettingDescription' => 'è®Ÿå€è®Ÿå®è¯Žæ',
+   'DigitalZoom' => 'æ°ç åçŠ',
+   'DigitalZoomRatio' => 'æ°ç åçŠæ¯',
+   'Directory' => 'æä»¶å­åšäœçœ®',
+   'DisplayXResolutionUnit' => {
+      PrintConv => {
+        'um' => 'Âµm (åŸ®ç±³)',
+      },
+    },
+   'DisplayYResolutionUnit' => {
+      PrintConv => {
+        'um' => 'Âµm (åŸ®ç±³)',
+      },
+    },
+   'DjVuVersion' => 'DjVu çæ¬',
+   'DriveMode' => 'é©±åšæš¡åŒ',
+   'DynamicRangeOptimizer' => {
+      Description => 'åšæèåŽäŒå',
+      PrintConv => {
+        'Advanced Auto' => 'é«çº§èªåš',
+        'Advanced Lv1' => 'é«çº§äŒåçšåºŠ 1',
+        'Advanced Lv2' => 'é«çº§äŒåçšåºŠ 2',
+        'Advanced Lv3' => 'é«çº§äŒåçšåºŠ 3',
+        'Advanced Lv4' => 'é«çº§äŒåçšåºŠ 4',
+        'Advanced Lv5' => 'é«çº§äŒåçšåºŠ 5',
+        'Auto' => 'èªåš',
+        'Off' => 'å
+³',
+        'Standard' => 'æ å',
+      },
+    },
+   'EasyMode' => {
+      PrintConv => {
+        'Landscape' => 'é£æ¯',
+        'Manual' => 'æåš',
+        'Night' => 'å€æ¯',
+        'Portrait' => 'äººç©',
+      },
+    },
+   'ExifImageHeight' => 'åé«',
+   'ExifImageWidth' => 'åå®œ',
+   'ExifOffset' => 'Exif IFD æé',
+   'ExifToolVersion' => 'ExifTool çæ¬',
+   'ExifVersion' => 'Exif çæ¬',
+   'ExpandFilm' => 'è¶çæ©å±',
+   'ExpandFilterLens' => 'æ»€éæ©å±',
+   'ExpandFlashLamp' => 'éªå
+ç¯æ©å±',
+   'ExpandLens' => 'éå€Žæ©å±',
+   'ExpandScanner' => 'æ«æä»ªæ©å±',
+   'ExpandSoftware' => 'èœ¯ä»¶æ©å±',
+   'ExposureCompensation' => 'æå
+åå·®',
+   'ExposureIndex' => 'æå
+çŽ¢åŒ',
+   'ExposureMode' => {
+      Description => 'æå
+æš¡åŒ',
+      PrintConv => {
+        'Aperture Priority' => 'å
+åäŒå
+',
+        'Aperture-priority AE' => 'å
+åäŒå
+',
+        'Auto' => 'èªåšæå
+',
+        'Auto bracket' => 'èªåšæ¯æ¶',
+        'Landscape' => 'é£æ¯',
+        'Manual' => 'æåšæå
+',
+        'Portrait' => 'äººç©',
+        'Shutter Priority' => 'å¿«éšäŒå
+',
+        'Shutter speed priority AE' => 'å¿«éšäŒå
+',
+      },
+    },
+   'ExposureProgram' => {
+      Description => 'æå
+çšåº',
+      PrintConv => {
+        'Action (High speed)' => 'è¿åšæåœ±',
+        'Aperture Priority' => 'å
+åäŒå
+',
+        'Aperture-priority AE' => 'å
+åäŒå
+',
+        'Creative (Slow speed)' => 'åææåœ±',
+        'Landscape' => 'é£æ¯',
+        'Manual' => 'æåš',
+        'Portrait' => 'äººç©',
+        'Program AE' => 'äžè¬çšåº',
+        'Shutter Priority' => 'å¿«éšäŒå
+',
+        'Shutter speed priority AE' => 'å¿«éšäŒå
+',
+      },
+    },
+   'ExposureTime' => 'æå
+æ¶éŽ',
+   'ExposureTime2' => 'æå
+æ¶éŽ 2',
+   'ExternalFlashBounce' => {
+      PrintConv => {
+        'n/a' => 'æªè®Ÿçœ®',
+      },
+    },
+   'ExternalFlashExposureComp' => {
+      PrintConv => {
+        'n/a' => 'æªè®Ÿçœ® (Off or Auto Modes)',
+        'n/a (Manual Mode)' => 'æªè®Ÿçœ® (Manual Mode)',
+      },
+    },
+   'FNumber' => 'å
+åæ°',
+   'FaxProfile' => {
+      PrintConv => {
+        'Unknown' => 'æªç¥',
+      },
+    },
+   'FileFormat' => 'æ ŒåŒ',
+   'FileModifyDate' => 'æŽæ°æ¥æ',
+   'FileName' => 'æä»¶å',
+   'FileSize' => 'æä»¶å€§å°',
+   'FileSource' => {
+      Description => 'æä»¶æ¥æº',
+      PrintConv => {
+        'Digital Camera' => 'æ°ç çžæº',
+        'Film Scanner' => 'è¶çæ«æä»ª',
+        'Reflection Print Scanner' => 'åå°åæ«æä»ª',
+      },
+    },
+   'FileType' => 'æä»¶æ ŒåŒ',
+   'FilterEffect' => {
+      PrintConv => {
+        'n/a' => 'æªè®Ÿçœ®',
+      },
+    },
+   'Flash' => {
+      Description => 'éªå
+',
+      PrintConv => {
+        'Auto, Fired' => 'åŒ (èªåšéªå
+)',
+        'Auto, Fired, Red-eye reduction' => 'åŒ (èªåšéªå
+ïŒåèœ»çº¢çŒ)',
+        'Auto, Fired, Red-eye reduction, Return detected' => 'åŒ (åŒºå¶éªå
+ïŒåèœ»çº¢çŒïŒæ£æµè¿åå
+)',
+        'Auto, Fired, Return detected' => 'åŒ (èªåšéªå
+ïŒæ£æµè¿åå
+)',
+        'Did not fire' => 'éªå
+ç¯æªäº®',
+        'Fired' => 'éªå
+ç¯äº®',
+        'Fired, Red-eye reduction' => 'åŒ (åèœ»çº¢çŒ)',
+        'Fired, Red-eye reduction, Return detected' => 'åŒ (åèœ»çº¢çŒïŒæ£æµè¿åå
+)',
+        'Fired, Return detected' => 'åŒ (æ£æµè¿åå
+)',
+        'No Flash' => 'æ éªå
+åèœ',
+        'On, Fired' => 'åŒ (åŒºå¶éªå
+)',
+        'On, Red-eye reduction' => 'åŒ (åŒºå¶éªå
+(åèœ»çº¢çŒ))',
+        'On, Red-eye reduction, Return detected' => 'åŒ (åŒºå¶éªå
+ïŒåèœ»çº¢çŒïŒæ£æµè¿åå
+)',
+        'On, Return detected' => 'åŒ (åŒºå¶éªå
+ïŒæ£æµè¿åå
+)',
+      },
+    },
+   'FlashControlMode' => {
+      PrintConv => {
+        'Manual' => 'æåš',
+      },
+    },
+   'FlashEnergy' => 'éªå
+åŒºåºŠ',
+   'FlashExposureComp' => 'éªå
+è¡¥å¿',
+   'FlashGroupAControlMode' => {
+      PrintConv => {
+        'Manual' => 'æåš',
+      },
+    },
+   'FlashGroupBControlMode' => {
+      PrintConv => {
+        'Manual' => 'æåš',
+      },
+    },
+   'FlashGroupCControlMode' => {
+      PrintConv => {
+        'Manual' => 'æåš',
+      },
+    },
+   'FlashMode' => {
+      PrintConv => {
+        'Auto' => 'èªåš',
+        'Unknown' => 'æªç¥',
+      },
+    },
+   'FlashOptions' => {
+      PrintConv => {
+        'Auto' => 'èªåš',
+      },
+    },
+   'FlashOptions2' => {
+      PrintConv => {
+        'Auto' => 'èªåš',
+      },
+    },
+   'FlashSyncSpeedAv' => {
+      PrintConv => {
+        'Auto' => 'èªåš',
+      },
+    },
+   'FlashpixVersion' => 'æ¯æç Flashpix çæ¬',
+   'FocalLength' => 'çŠè·',
+   'FocalLength35efl' => 'çŠç¹è·çŠ»(35 mm æ¢ç®)',
+   'FocalLengthIn35mmFormat' => '35 mm æ¢ç®éå€ŽçŠç¹è·çŠ»',
+   'FocalPlaneResolutionUnit' => {
+      Description => 'çŠå¹³é¢åèŸšçåäœ',
+      PrintConv => {
+        'inches' => 'è±å¯ž',
+        'um' => 'Âµm (åŸ®ç±³)',
+      },
+    },
+   'FocalPlaneXResolution' => 'çŠå¹³é¢ X åèŸšç',
+   'FocalPlaneYResolution' => 'çŠå¹³é¢ Y åèŸšç',
+   'Focus' => {
+      PrintConv => {
+        'Manual' => 'æåš',
+      },
+    },
+   'FocusContinuous' => {
+      PrintConv => {
+        'Manual' => 'æåš',
+      },
+    },
+   'FocusMode' => {
+      Description => 'å¯¹çŠæš¡åŒ',
+      PrintConv => {
+        'Auto' => 'èªåš',
+        'Manual' => 'æåš',
+      },
+    },
+   'FocusMode2' => {
+      PrintConv => {
+        'Manual' => 'æåš',
+      },
+    },
+   'FocusModeSetting' => {
+      PrintConv => {
+        'Manual' => 'æåš',
+      },
+    },
+   'FocusRange' => {
+      PrintConv => {
+        'Auto' => 'èªåš',
+        'Manual' => 'æåš',
+      },
+    },
+   'FrameRate' => 'æŽæ°éç',
+   'FrameSize' => 'ç»é¢å°ºå¯ž',
+   'FreeByteCounts' => 'ç©ºçœå­èæ°',
+   'FujiFlashMode' => {
+      PrintConv => {
+        'Auto' => 'èªåš',
+      },
+    },
+   'GIFVersion' => 'GIF çæ¬',
+   'GPSAltitude' => 'æµ·æé«åºŠ',
+   'GPSAltitudeRef' => {
+      Description => 'é«åºŠåºå',
+      PrintConv => {
+        'Above Sea Level' => 'æµ·å¹³é¢',
+        'Below Sea Level' => 'æµ·æ(èŽåŒ)',
+      },
+    },
+   'GPSAreaInformation' => 'GPSåºåå',
+   'GPSDOP' => 'æµéç²ŸåºŠ',
+   'GPSDateStamp' => 'GPSæ¥æ',
+   'GPSDestBearing' => 'ç®çå°æ¹äœ',
+   'GPSDestBearingRef' => 'ç®çå°æ¹äœåç
+§',
+   'GPSDestDistance' => 'çŠ»ç»ç¹çè·çŠ»',
+   'GPSDestDistanceRef' => {
+      Description => 'è·ç®çå°è·çŠ»åç
+§',
+      PrintConv => {
+        'Kilometers' => 'å
+¬éæ°',
+        'Miles' => 'è±éæ°',
+        'Nautical Miles' => 'èæ°',
+      },
+    },
+   'GPSDestLatitude' => 'ç»ç¹çº¬åºŠ',
+   'GPSDestLatitudeRef' => {
+      Description => 'ç®çå°çåçº¬æåçº¬',
+      PrintConv => {
+        'North' => 'åçº¬',
+        'South' => 'åçº¬',
+      },
+    },
+   'GPSDestLongitude' => 'ç»ç¹ç»åºŠ',
+   'GPSDestLongitudeRef' => {
+      Description => 'ç®çå°çäžç»æè¥¿ç»',
+      PrintConv => {
+        'East' => 'äžç»',
+        'West' => 'è¥¿ç»',
+      },
+    },
+   'GPSDifferential' => {
+      Description => 'GPS å·®åæ ¡æ­£',
+      PrintConv => {
+        'Differential Corrected' => 'å·®åæ ¡æ­£å®äœ',
+        'No Correction' => 'éå·®åæ ¡æ­£æµé',
+      },
+    },
+   'GPSImgDirection' => 'åŸåæ¹å',
+   'GPSImgDirectionRef' => 'åŸåæ¹ååç
+§',
+   'GPSInfo' => 'GPS Info IFD æé',
+   'GPSLatitude' => 'çº¬åºŠ',
+   'GPSLatitudeRef' => {
+      Description => 'åçº¬æè
+åçº¬',
+      PrintConv => {
+        'North' => 'åçº¬',
+        'South' => 'åçº¬',
+      },
+    },
+   'GPSLongitude' => 'ç»åºŠ',
+   'GPSLongitudeRef' => {
+      Description => 'äžç»æè
+è¥¿ç»',
+      PrintConv => {
+        'East' => 'äžç»',
+        'West' => 'è¥¿ç»',
+      },
+    },
+   'GPSMapDatum' => 'äœ¿çšçå€§å°æµéæ°æ®',
+   'GPSMeasureMode' => {
+      Description => 'GPSæµéæš¡åŒ',
+      PrintConv => {
+        '2-D' => '2ç»Žæµé',
+        '2-Dimensional' => '2ç»Žæµé',
+        '2-Dimensional Measurement' => '2ç»Žæµé',
+        '3-D' => '3ç»Žæµé',
+        '3-Dimensional' => '3ç»Žæµé',
+        '3-Dimensional Measurement' => '3ç»Žæµé',
+      },
+    },
+   'GPSProcessingMethod' => 'å®äœæ¹åŒåç§°',
+   'GPSSatellites' => 'çšäºå®äœç GPS å«æä¿¡å·',
+   'GPSSpeed' => 'GPSæ¥æ¶åšçéåºŠ',
+   'GPSSpeedRef' => {
+      Description => 'éåºŠåäœ',
+      PrintConv => {
+        'km/h' => 'å
+¬é/å°æ¶',
+        'knots' => 'æµ·é/å°æ¶',
+        'mph' => 'è±é/å°æ¶',
+      },
+    },
+   'GPSStatus' => {
+      Description => 'GPS æ¥æ¶åšç¶æ',
+      PrintConv => {
+        'Measurement Active' => 'æ­£åšæµéäž­',
+        'Measurement Void' => 'æµéäž­æ­',
+      },
+    },
+   'GPSTimeStamp' => 'GPS æ¶éŽ(åå­é)',
+   'GPSTrack' => 'è¿åšæ¹å',
+   'GPSTrackRef' => {
+      Description => 'è¿åšæ¹ååç
+§',
+      PrintConv => {
+        'Magnetic North' => 'ç£åºæ¹å',
+        'True North' => 'çæ¹å',
+      },
+    },
+   'GPSVersionID' => 'GPSæ ç­Ÿçæ¬',
+   'GainControl' => {
+      Description => 'å¢çæ§å¶',
+      PrintConv => {
+        'High gain down' => 'åŒºåå°',
+        'High gain up' => 'åŒºå¢ç',
+        'Low gain down' => 'åŒ±åå°',
+        'Low gain up' => 'åŒ±å¢ç',
+        'None' => 'æ ',
+      },
+    },
+   'Gamma' => 'å¯¹æ¯ç³»æ°',
+   'Gradation' => 'ç°é¶',
+   'HDR' => {
+      Description => 'èªåšHDR',
+      PrintConv => {
+        'Off' => 'å
+³',
+      },
+    },
+   'Headline' => 'æ é¢',
+   'HighISONoiseReduction' => {
+      Description => 'é«ISOéåª',
+      PrintConv => {
+        'Auto' => 'èªåš',
+        'High' => 'åŒº',
+        'Low' => 'åŒ±',
+        'Normal' => 'æ å',
+        'Off' => 'å
+³',
+      },
+    },
+   'Hue' => 'è²çž',
+   'IPTC-NAA' => 'IPTC-NAA å
+æ°æ®',
+   'ISOSetting' => {
+      PrintConv => {
+        'Auto' => 'èªåš',
+        'Manual' => 'æåš',
+      },
+    },
+   'ImageDescription' => 'åŸåæ é¢',
+   'ImageHeight' => 'åé«',
+   'ImageOrientation' => {
+      PrintConv => {
+        'Portrait' => 'äººç©',
+      },
+    },
+   'ImageSize' => 'åŸåå°ºå¯ž',
+   'ImageTone' => {
+      PrintConv => {
+        'Landscape' => 'é£æ¯',
+        'Portrait' => 'äººç©',
+      },
+    },
+   'ImageUniqueID' => 'åŸåå¯äžæ è¯',
+   'ImageWidth' => 'åå®œ',
+   'Index' => 'çŽ¢åŒ',
+   'Instructions' => 'æç€º',
+   'InternalFlash' => {
+      PrintConv => {
+        'Manual' => 'æåš',
+      },
+    },
+   'InteropIndex' => {
+      Description => 'äºçšæ è¯',
+      PrintConv => {
+        'THM - DCF thumbnail file' => 'THM: DCF çŒ©ç¥åŸæä»¶',
+      },
+    },
+   'InteropOffset' => 'äºçšæé',
+   'InteropVersion' => 'äºçšçæ¬',
+   'JFIFVersion' => 'JFIF çæ¬',
+   'Keyword' => 'å
+³é®è¯',
+   'Keywords' => 'å
+³é®å­',
+   'Lens' => 'éå€Ž',
+   'LensInfo' => 'éå€Žä¿¡æ¯',
+   'LensType' => 'æªè®Ÿçœ®',
+   'LicenseType' => {
+      PrintConv => {
+        'Unknown' => 'æªç¥',
+      },
+    },
+   'LightSource' => {
+      Description => 'å
+æº',
+      PrintConv => {
+        'Cloudy' => 'éŽå€©',
+        'Cool White Fluorescent' => 'å·çœè²è§å
+ç¯ïŒW3800-4500KïŒ',
+        'Day White Fluorescent' => 'æ¥å
+çœè²è§å
+ç¯ïŒN4600-5500KïŒ',
+        'Daylight' => 'å€ªé³å
+',
+        'Daylight Fluorescent' => 'æ¥å
+è²è§å
+ç¯ïŒD5700-7100KïŒ',
+        'Fine Weather' => 'æŽå€©',
+        'Flash' => 'éªå
+',
+        'Fluorescent' => 'è§å
+',
+        'ISO Studio Tungsten' => 'ISOçžå®€çœçœç¯',
+        'Other' => 'å
+¶ä»å
+æº',
+        'Shade' => 'éŽåœ±',
+        'Standard Light A' => 'æ åå
+A',
+        'Standard Light B' => 'æ åå
+B',
+        'Standard Light C' => 'æ åå
+C',
+        'Tungsten (Incandescent)' => 'çœçœç¯',
+        'Unknown' => 'æªç¥',
+        'White Fluorescent' => 'çœè²è§å
+ç¯ïŒWW3250-3800KïŒ',
+        'Warm White Fluorescent' => 'æçœè§å
+ç¯ïŒL2600-3250KïŒ',
+      },
+    },
+   'Lightness' => 'ææåºŠ',
+   'LongExposureNoiseReduction' => {
+      Description => 'é¿æ¶éŽæå
+éåª',
+      PrintConv => {
+        'Auto' => 'èªåš',
+        'Off' => 'å
+³',
+        'On' => 'åŒ',
+      },
+    },
+   'MIEVersion' => 'MIE çæ¬',
+   'Macro' => {
+      PrintConv => {
+        'Manual' => 'æåš',
+      },
+    },
+   'Make' => 'åå',
+   'MakerNote' => 'ååæ³šé',
+   'MakerNotes' => 'å¶é åè®°åœ',
+   'ManualFlashOutput' => {
+      PrintConv => {
+        'n/a' => 'æªè®Ÿçœ®',
+      },
+    },
+   'MaxAperture' => 'éå€Žå
+åæå€§åŒ',
+   'MaxApertureValue' => 'æå€§éå€Žå
+å',
+   'MeteringMode' => {
+      Description => 'æµéæ¹åŒ',
+      PrintConv => {
+        'Average' => 'å¹³å',
+        'Center-weighted average' => 'äž­å€®éç¹',
+        'Multi-segment' => 'åå²æµå
+',
+        'Multi-spot' => 'å€ç¹',
+        'Other' => 'å
+¶å®',
+        'Partial' => 'éšåæµå
+',
+        'Spot' => 'ç¹æµå
+',
+        'Unknown' => 'æªç¥',
+      },
+    },
+   'Model' => 'åå·',
+   'ModifiedPictureStyle' => {
+      PrintConv => {
+        'Landscape' => 'é£æ¯',
+        'Portrait' => 'äººç©',
+      },
+    },
+   'ModifiedSharpnessFreq' => {
+      PrintConv => {
+        'n/a' => 'æªè®Ÿçœ®',
+      },
+    },
+   'ModifiedToneCurve' => {
+      PrintConv => {
+        'Manual' => 'æåš',
+      },
+    },
+   'ModifiedWhiteBalance' => {
+      PrintConv => {
+        'Auto' => 'èªåš',
+        'Cloudy' => 'éŽå€©',
+        'Daylight' => 'å€ªé³å
+',
+        'Flash' => 'éªå
+',
+        'Fluorescent' => 'è§å
+',
+        'Shade' => 'éŽåœ±',
+      },
+    },
+   'ModifyDate' => 'æä»¶æ¹åçæ¥æåæ¶éŽ',
+   'MultiFrameNoiseReduction' => {
+      Description => 'å€åž§éåª',
+      PrintConv => {
+        'Off' => 'å
+³',
+        'On' => 'åŒ',
+      },
+    },
+   'NEFCompression' => {
+      PrintConv => {
+        'Uncompressed' => 'æªåçŒ©',
+      },
+    },
+   'Noise' => 'åªå£°',
+   'NoiseReduction' => {
+      Description => 'åå°åªå£°',
+      PrintConv => {
+        'Auto' => 'èªåš',
+      },
+    },
+   'ObjectFileType' => {
+      PrintConv => {
+        'Unknown' => 'æªç¥',
+      },
+    },
+   'Opto-ElectricConvFactor' => 'å
+çµèœ¬æ¢å å­',
+   'Orientation' => {
+      Description => 'åŸååå',
+      PrintConv => {
+        'Horizontal (normal)' => '0Â° (äž/å·Š)',
+        'Mirror horizontal' => '0Â° (äž/å³)',
+        'Mirror horizontal and rotate 270 CW' => '90Â° CW (å·Š/äž)',
+        'Mirror horizontal and rotate 90 CW' => '90Â° CCW (å³/åº)',
+        'Mirror vertical' => '180Â° (åº/å·Š)',
+        'Rotate 180' => '180Â° (åº/å³)',
+        'Rotate 270 CW' => '90Â° CW (å·Š/åº)',
+        'Rotate 90 CW' => '90Â° CCW (å³/äž)',
+      },
+    },
+   'PEFVersion' => 'PEF çæ¬',
+   'PageNumber' => 'é¡µæ°',
+   'PhotometricInterpretation' => {
+      Description => 'åçŽ æ¹æ¡',
+      PrintConv => {
+        'BlackIsZero' => 'é¶é»è²',
+        'Color Filter Array' => 'CFA (é¢è²æ»€éç©éµ)',
+        'Pixar LogL' => 'CIE Log2(L) (å¯¹æ°äº®åºŠ)',
+        'Pixar LogLuv' => 'CIE Log2(L)(u\',v\') (å¯¹æ°äº®åºŠåè²åºŠ)',
+        'RGB Palette' => 'è°è²æ¿é¢è²',
+        'Transparency Mask' => 'éæèæ¿',
+        'WhiteIsZero' => 'é¶çœè²',
+      },
+    },
+   'PictureFinish' => {
+      PrintConv => {
+        'Portrait' => 'äººç©',
+      },
+    },
+   'PictureMode' => {
+      PrintConv => {
+        'Aperture-priority AE' => 'å
+åäŒå
+',
+        'Auto' => 'èªåš',
+        'Landscape' => 'é£æ¯',
+        'Manual' => 'æåš',
+        'Portrait' => 'äººç©',
+        'Shutter speed priority AE' => 'å¿«éšäŒå
+',
+      },
+    },
+   'PictureMode2' => {
+      PrintConv => {
+        'Aperture Priority' => 'å
+åäŒå
+',
+        'Manual' => 'æåš',
+        'Shutter Speed Priority' => 'å¿«éšäŒå
+',
+      },
+    },
+   'PictureModeBWFilter' => {
+      PrintConv => {
+        'n/a' => 'æªè®Ÿçœ®',
+      },
+    },
+   'PictureModeTone' => {
+      PrintConv => {
+        'n/a' => 'æªè®Ÿçœ®',
+      },
+    },
+   'PictureStyle' => {
+      PrintConv => {
+        'Landscape' => 'é£æ¯',
+        'Portrait' => 'äººç©',
+      },
+    },
+   'PixelUnits' => {
+      PrintConv => {
+        'Unknown' => 'æªç¥',
+      },
+    },
+   'PlanarConfiguration' => {
+      Description => 'åŸåæ°æ®æå',
+      PrintConv => {
+        'Chunky' => 'ç¹é¡ºåºæ ŒåŒ',
+        'Planar' => 'å¹³é¢æ ŒåŒ',
+      },
+    },
+   'PreviewColorSpace' => {
+      PrintConv => {
+        'Unknown' => 'æªç¥',
+      },
+    },
+   'PrimaryChromaticities' => 'åè²è²åºŠåæ åŒ',
+   'ProgramMode' => {
+      PrintConv => {
+        'Portrait' => 'äººç©',
+      },
+    },
+   'Province-State' => 'å·ïŒç',
+   'Quality' => {
+      Description => 'åŸåèŽšé',
+      PrintConv => {
+        'Compressed RAW' => 'cRAW',
+        'Compressed RAW + JPEG' => 'cRAW+JPEG',
+        'Extra Fine' => 'è¶
+ç²Ÿç»',
+        'Fine' => 'ç²Ÿç»',
+        'Low' => 'äœç»èŽš',
+        'Normal' => 'æ åç»èŽš',
+        'RAW + JPEG' => 'RAW+JPEG',
+        'Standard' => 'æ å',
+      },
+    },
+   'RAFVersion' => 'RAF çæ¬',
+   'Rating' => 'è¯å',
+   'RatingPercent' => 'çŸåæ¯è¯çº§',
+   'RecordMode' => {
+      Description => 'è®°åœæš¡åŒ',
+      PrintConv => {
+        'Aperture Priority' => 'å
+åäŒå
+',
+        'Manual' => 'æåš',
+        'Shutter Priority' => 'å¿«éšäŒå
+',
+      },
+    },
+   'RecordingMode' => {
+      PrintConv => {
+        'Auto' => 'èªåš',
+        'Landscape' => 'é£æ¯',
+        'Manual' => 'æåš',
+        'Portrait' => 'äººç©',
+      },
+    },
+   'RedEyeCorrection' => {
+      PrintConv => {
+        'Automatic' => 'èªåš',
+      },
+    },
+   'ReferenceBlackWhite' => 'é»çœåç
+§åŒå¯¹',
+   'RelatedImageFileFormat' => 'çžå
+³åŸåæä»¶æ ŒåŒ',
+   'RelatedImageHeight' => 'çžå
+³åŸåé«åºŠ',
+   'RelatedImageWidth' => 'çžå
+³åŸåå®œåºŠ',
+   'RelatedSoundFile' => 'çžå
+³çé³é¢æä»¶',
+   'ResolutionUnit' => {
+      Description => 'åŸåé«å®œåèŸšçåäœ',
+      PrintConv => {
+        'cm' => 'åçŽ /åç±³',
+        'inches' => 'è±å¯ž',
+      },
+    },
+   'Rotation' => {
+      PrintConv => {
+        'Horizontal' => '0Â° (äž/å·Š)',
+        'Horizontal (Normal)' => '0Â° (äž/å·Š)',
+        'Horizontal (normal)' => '0Â° (äž/å·Š)',
+        'Rotate 180' => '180Â° (åº/å³)',
+        'Rotate 270 CW' => '90Â° CW (å·Š/åº)',
+        'Rotate 90 CW' => '90Â° CCW (å³/äž)',
+        'Rotated 180' => '180Â° (åº/å³)',
+        'Rotated 270 CW' => '90Â° CW (å·Š/åº)',
+        'Rotated 90 CW' => '90Â° CCW (å³/äž)',
+      },
+    },
+   'RowsPerStrip' => 'æ¯æ¡åžŠçè¡æ°',
+   'SPIFFVersion' => 'SPIFF çæ¬',
+   'SRAWQuality' => {
+      PrintConv => {
+        'n/a' => 'æªè®Ÿçœ®',
+      },
+    },
+   'SVGVersion' => 'SVG çæ¬',
+   'SamplesPerPixel' => 'ç»ä»¶æ°',
+   'Saturation' => {
+      Description => 'é¥±ååºŠ',
+      PrintConv => {
+        'High' => 'é«é¥±ååºŠ',
+        'Low' => 'äœé¥±ååºŠ',
+        'None' => 'æªè®Ÿçœ®',
+        'Normal' => 'æ å',
+      },
+    },
+   'SceneCaptureType' => {
+      Description => 'åæ¯ç±»å',
+      PrintConv => {
+        'Landscape' => 'é£æ¯',
+        'Night' => 'å€æ¯',
+        'Portrait' => 'äººç©',
+        'Standard' => 'æ å',
+      },
+    },
+   'SceneMode' => {
+      Description => 'åºæ¯éæ©',
+      PrintConv => {
+        '3D Sweep Panorama' => '3D',
+        'Anti Motion Blur' => 'åšäœé²æ',
+        'Aperture Priority' => 'å
+åäŒå
+',
+        'Auto' => 'èªåš',
+        'Cont. Priority AE' => 'è¿ç»­ææäŒå
+AE',
+        'Handheld Night Shot' => 'ææå€æ¯ææ',
+        'Landscape' => 'é£æ¯',
+        'Macro' => 'åŸ®è·',
+        'Manual' => 'æåš',
+        'Night Portrait' => 'å€æèå',
+        'Night Scene' => 'å€æ¯',
+        'Night View/Portrait' => 'å€æ¯/èå',
+        'Portrait' => 'äººç©',
+        'Shutter Priority' => 'å¿«éšäŒå
+',
+        'Sports' => 'è¿åšæš¡åŒ',
+        'Standard' => '',
+        'Sunset' => 'å€é³',
+        'Sweep Panorama' => 'æ«æå
+šæ¯',
+      },
+    },
+   'SceneModeUsed' => {
+      PrintConv => {
+        'Aperture Priority' => 'å
+åäŒå
+',
+        'Landscape' => 'é£æ¯',
+        'Manual' => 'æåš',
+        'Portrait' => 'äººç©',
+        'Shutter Priority' => 'å¿«éšäŒå
+',
+      },
+    },
+   'SceneSelect' => {
+      PrintConv => {
+        'Night' => 'å€æ¯',
+      },
+    },
+   'SceneType' => {
+      Description => 'åºæ¯ç±»å',
+      PrintConv => {
+        'Directly photographed' => 'çŽæ¥ææçåŸå',
+      },
+    },
+   'SensingMethod' => {
+      Description => 'æåºæ¹æ³',
+      PrintConv => {
+        'Color sequential area' => 'è²åœ©è¿ç»­åºæåºåš',
+        'Color sequential linear' => 'è²åœ©è¿ç»­çº¿æ§æåºåš',
+        'One-chip color area' => 'åçè²åœ©åºæåºåš',
+        'Three-chip color area' => '3 çè²åœ©åºäŒ æåš',
+        'Trilinear' => '3 çº¿äŒ æåš',
+        'Two-chip color area' => '2 çè²åœ©åºäŒ æåš',
+      },
+    },
+   'SerialNumber' => 'ç
+§çžæºæ è¯',
+   'ShadingCompensation' => 'éŽåœ±è¡¥å¿',
+   'Sharpness' => {
+      Description => 'éåºŠ',
+      PrintConv => {
+        'Hard' => 'åŒº',
+        'Normal' => 'æ å',
+        'Soft' => 'åŒ±',
+        'n/a' => 'æªè®Ÿçœ®',
+      },
+    },
+   'SharpnessFrequency' => {
+      PrintConv => {
+        'n/a' => 'æªè®Ÿçœ®',
+      },
+    },
+   'ShootingInfoDisplay' => {
+      PrintConv => {
+        'Auto' => 'èªåš',
+      },
+    },
+   'ShootingMode' => {
+      Description => 'æææš¡åŒ',
+      PrintConv => {
+        'Aperture Priority' => 'å
+åäŒå
+',
+        'Manual' => 'æåš',
+        'Portrait' => 'äººç©',
+        'Shutter Priority' => 'å¿«éšäŒå
+',
+      },
+    },
+   'ShutterMode' => {
+      PrintConv => {
+        'Aperture Priority' => 'å
+åäŒå
+',
+        'Auto' => 'èªåš',
+      },
+    },
+   'ShutterSpeed' => 'æå
+æ¶éŽ',
+   'ShutterSpeedValue' => 'å¿«éšéåºŠ',
+   'Software' => 'äœ¿çšèœ¯ä»¶',
+   'Source' => 'æ¥æº',
+   'SpatialFrequencyResponse' => 'ç©ºéŽé¢çååº',
+   'SpectralSensitivity' => 'å
+è°±çµæåºŠ',
+   'State' => 'å·',
+   'StripByteCounts' => 'æ¯åçŒ©æ¡åžŠçå­èæ°',
+   'StripOffsets' => 'åŸåæ°æ®äœçœ®',
+   'SubSecCreateDate' => 'æ°å­æ°æ®äº§ççæ¥æåæ¶éŽ',
+   'SubSecDateTimeOriginal' => 'åå§æ°æ®äº§ççæ¥æåæ¶éŽ',
+   'SubSecModifyDate' => 'æä»¶æ¹åçæ¥æåæ¶éŽ',
+   'SubSecTime' => 'æ¶éŽçæ¬¡ç§',
+   'SubSecTimeDigitized' => 'æ°å­åæ¶éŽçæ¬¡ç§',
+   'SubSecTimeOriginal' => 'åå§æ¶éŽçæ¬¡ç§',
+   'Subject' => 'äž»é¢',
+   'SubjectArea' => 'è¢«æå¯¹è±¡åºå',
+   'SubjectDistance' => 'ç®æ è·çŠ»',
+   'SubjectDistanceRange' => {
+      Description => 'è¢«æå¯¹è±¡è·çŠ»èåŽ',
+      PrintConv => {
+        'Close' => 'è¿æ¯',
+        'Distant' => 'è¿æ¯',
+        'Macro' => 'åŸ®è·',
+        'Unknown' => 'æªç¥',
+      },
+    },
+   'SubjectLocation' => 'è¢«æå¯¹è±¡äœçœ®',
+   'SubjectProgram' => {
+      PrintConv => {
+        'Portrait' => 'äººç©',
+      },
+    },
+   'Subsystem' => {
+      PrintConv => {
+        'Unknown' => 'æªç¥',
+      },
+    },
+   'SupplementalCategories' => 'è¿œå ç±»å«',
+   'SupplementalType' => {
+      PrintConv => {
+        'Main Image' => 'æªè®Ÿçœ®',
+      },
+    },
+   'T4Options' => 'æªåçŒ©',
+   'T6Options' => 'T6 éé¡¹',
+   'ThumbnailImage' => 'çŒ©ç¥åŸ',
+   'ThumbnailImageSize' => 'çŒ©åŸå°ºå¯ž',
+   'Title' => 'æ é¢',
+   'ToneCurve' => {
+      PrintConv => {
+        'Manual' => 'æåš',
+      },
+    },
+   'ToningEffect' => {
+      PrintConv => {
+        'n/a' => 'æªè®Ÿçœ®',
+      },
+    },
+   'TransferFunction' => 'äŒ éåèœ',
+   'Transformation' => {
+      PrintConv => {
+        'Horizontal (normal)' => '0Â° (äž/å·Š)',
+        'Mirror horizontal' => '0Â° (äž/å³)',
+        'Mirror horizontal and rotate 270 CW' => '90Â° CW (å·Š/äž)',
+        'Mirror horizontal and rotate 90 CW' => '90Â° CCW (å³/åº)',
+        'Mirror vertical' => '180Â° (åº/å·Š)',
+        'Rotate 180' => '180Â° (åº/å³)',
+        'Rotate 270 CW' => '90Â° CW (å·Š/åº)',
+        'Rotate 90 CW' => '90Â° CCW (å³/äž)',
+      },
+    },
+   'TransmissionReference' => 'äŒ èŸè®°åœ',
+   'Trapped' => {
+      PrintConv => {
+        'Unknown' => 'æªç¥',
+      },
+    },
+   'Urgency' => 'çŽ§æ¥åºŠ',
+   'UserComment' => 'çšæ·æ³šé',
+   'UserDef1PictureStyle' => {
+      PrintConv => {
+        'Landscape' => 'é£æ¯',
+        'Portrait' => 'äººç©',
+      },
+    },
+   'UserDef2PictureStyle' => {
+      PrintConv => {
+        'Landscape' => 'é£æ¯',
+        'Portrait' => 'äººç©',
+      },
+    },
+   'UserDef3PictureStyle' => {
+      PrintConv => {
+        'Landscape' => 'é£æ¯',
+        'Portrait' => 'äººç©',
+      },
+    },
+   'VRDVersion' => 'VRD çæ¬',
+   'Version' => 'çæ¬',
+   'VibrationReduction' => {
+      PrintConv => {
+        'n/a' => 'æªè®Ÿçœ®',
+      },
+    },
+   'WBAdjLighting' => {
+      PrintConv => {
+        'Daylight' => 'å€ªé³å
+',
+        'Flash' => 'éªå
+',
+      },
+    },
+   'WBMode' => {
+      PrintConv => {
+        'Auto' => 'èªåš',
+      },
+    },
+   'WhiteBalance' => {
+      Description => 'çœå¹³è¡¡',
+      PrintConv => {
+        'Auto' => 'èªåš',
+        'Black & White' => 'é»çœ',
+        'Cloudy' => 'éŽå€©',
+        'Color Temperature/Color Filter' => 'è²æž© / åœ©è²æ»€å
+ç',
+        'Cool White Fluorescent' => 'çœè²è§å
+ç¯',
+        'Custom' => 'èªå®ä¹',
+        'Custom 1' => 'èªå®ä¹1',
+        'Custom 2' => 'èªå®ä¹2',
+        'Custom 3' => 'èªå®ä¹3',
+        'Custom 4' => 'èªå®ä¹4',
+        'Day White Fluorescent' => 'æ¥å
+çœè²è§å
+ç¯',
+        'Daylight' => 'å€ªé³å
+',
+        'Daylight Fluorescent' => 'æ¥å
+è²è§å
+ç¯',
+        'Flash' => 'éªå
+',
+        'Fluorescent' => 'è§å
+',
+        'Manual' => 'æåš',
+        'Shade' => 'éŽåœ±',
+        'Tungsten' => 'çœçœç¯',
+        'Unknown' => 'æªç¥',
+        'White Fluorescent' => 'çœè²è§å
+ç¯',
+        'Warm White Fluorescent' => 'æçœè§å
+ç¯',
+      },
+    },
+   'WhiteBalance2' => {
+      PrintConv => {
+        'Auto' => 'èªåš',
+      },
+    },
+   'WhiteBalanceAdj' => {
+      PrintConv => {
+        'Auto' => 'èªåš',
+        'Cloudy' => 'éŽå€©',
+        'Daylight' => 'å€ªé³å
+',
+        'Flash' => 'éªå
+',
+        'Fluorescent' => 'è§å
+',
+        'Shade' => 'éŽåœ±',
+      },
+    },
+   'WhiteBalanceMode' => {
+      PrintConv => {
+        'Unknown' => 'æªç¥',
+      },
+    },
+   'WhiteBalanceSet' => {
+      PrintConv => {
+        'Auto' => 'èªåš',
+        'Cloudy' => 'éŽå€©',
+        'Daylight' => 'å€ªé³å
+',
+        'Flash' => 'éªå
+',
+        'Manual' => 'æåš',
+        'Shade' => 'éŽåœ±',
+      },
+    },
+   'WhitePoint' => 'çœç¹è²åºŠ',
+   'Writer-Editor' => 'è¯Žæäœè
+',
+   'XMP' => 'XMP å
+æ°æ®',
+   'XPAuthor' => 'äœè
+',
+   'XPComment' => 'æ³šé',
+   'XPKeywords' => 'å
+³é®è¯',
+   'XPSubject' => 'äž»é¢',
+   'XPTitle' => 'æ é¢',
+   'YCbCrCoefficients' => 'è²åœ©ç©ºéŽåæ¢ç©éµç³»æ°',
+   'YCbCrPositioning' => {
+      Description => 'YCC åçŽ ç»æ(Y å C çäœçœ®)',
+      PrintConv => {
+        'Centered' => 'äž­å¿ç',
+        'Co-sited' => 'äžèŽ',
+      },
+    },
+   'YCbCrSubSampling' => 'YCC åçŽ ç»æ(Y è³ C çå­éæ ·ç)',
+   'ZoneMatching' => {
+      Description => 'åºåå¹é
+',
+      PrintConv => {
+        'High Key' => 'åŒº',
+        'ISO Setting Used' => 'å
+³',
+        'Low Key' => 'åŒ±',
+      },
+    },
+);
+
+1;  # end
+
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Lang::zh_cn.pm - ExifTool Simplified Chinese language translations
+
+=head1 DESCRIPTION
+
+This file is used by Image::ExifTool to generate localized tag descriptions
+and values.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Jens Duttke and Haibing Zhong for providing this translation.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool(3pm)|Image::ExifTool>,
+L<Image::ExifTool::TagInfoXML(3pm)|Image::ExifTool::TagInfoXML>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/zh_tw.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/zh_tw.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Lang/zh_tw.pm	(revision 24799)
@@ -0,0 +1,960 @@
+#------------------------------------------------------------------------------
+# File:         zh_tw.pm
+#
+# Description:  ExifTool Traditional Chinese language translations
+#
+# Notes:        This file generated automatically by Image::ExifTool::TagInfoXML
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Lang::zh_tw;
+
+use strict;
+use vars qw($VERSION);
+
+$VERSION = '1.04';
+
+%Image::ExifTool::Lang::zh_tw::Translate = (
+   'Album' => 'çžç°¿',
+   'Aperture' => 'å
+å',
+   'ApertureValue' => 'å
+å',
+   'Artist' => 'åœ±åå»ºç«è
+',
+   'Author' => 'äœè
+',
+   'AuthorsPosition' => 'è·äœ',
+   'BatteryLevel' => 'é»æ± å®¹é',
+   'BitsPerSample' => 'æ¯åå
+ä»¶ bits çµæçæžé',
+   'Brightness' => 'äº®åºŠ',
+   'BrightnessValue' => 'äº®åºŠ',
+   'By-line' => 'äœè
+',
+   'CFAPattern' => 'åœ©è²æ¿Ÿé¡é£åå',
+   'CFAPattern2' => 'CFA æš¡åŒ 2',
+   'CFARepeatPatternDim' => 'CFA éè€æš¡åŒå°ºå¯ž',
+   'CalibrationIlluminant1' => {
+      PrintConv => {
+        'Cloudy' => 'å€é²',
+        'Cool White Fluorescent' => 'å·çœè²çå
+ç (W 3800 - 4500K)',
+        'Day White Fluorescent' => 'æ¥å
+çœè²çå
+ç (N 4600 - 5500K)',
+        'Daylight' => 'æ¥å
+',
+        'Daylight Fluorescent' => 'æ¥å
+çå
+ç (D 5700 - 7100K)',
+        'Fine Weather' => 'æŽå€©',
+        'Flash' => 'éå
+ç',
+        'Fluorescent' => 'æ¥å
+ç',
+        'ISO Studio Tungsten' => 'ISO æåœ±æ£é¢ç',
+        'Other' => 'å
+¶ä»å
+æº',
+        'Shade' => 'é°å€©',
+        'Standard Light A' => 'æšæºçå
+ A',
+        'Standard Light B' => 'æšæºçå
+ B',
+        'Standard Light C' => 'æšæºçå
+ C',
+        'Tungsten (Incandescent)' => 'é¢çµ²ç',
+        'Unknown' => 'æªç¥',
+        'Warm White Fluorescent' => 'æçœè¢å
+ç (L 2600 - 3250K)',
+        'White Fluorescent' => 'çœè²çå
+ç (WW 3250 - 3800K)',
+      },
+    },
+   'CalibrationIlluminant2' => {
+      PrintConv => {
+        'Cloudy' => 'å€é²',
+        'Cool White Fluorescent' => 'å·çœè²çå
+ç (W 3800 - 4500K)',
+        'Day White Fluorescent' => 'æ¥å
+çœè²çå
+ç (N 4600 - 5500K)',
+        'Daylight' => 'æ¥å
+',
+        'Daylight Fluorescent' => 'æ¥å
+çå
+ç (D 5700 - 7100K)',
+        'Fine Weather' => 'æŽå€©',
+        'Flash' => 'éå
+ç',
+        'Fluorescent' => 'æ¥å
+ç',
+        'ISO Studio Tungsten' => 'ISO æåœ±æ£é¢ç',
+        'Other' => 'å
+¶ä»å
+æº',
+        'Shade' => 'é°å€©',
+        'Standard Light A' => 'æšæºçå
+ A',
+        'Standard Light B' => 'æšæºçå
+ B',
+        'Standard Light C' => 'æšæºçå
+ C',
+        'Tungsten (Incandescent)' => 'é¢çµ²ç',
+        'Unknown' => 'æªç¥',
+        'Warm White Fluorescent' => 'æçœè¢å
+ç (L 2600 - 3250K)',
+        'White Fluorescent' => 'çœè²çå
+ç (WW 3250 - 3800K)',
+      },
+    },
+   'Caption-Abstract' => 'èªªæ',
+   'CaptionWriter' => 'èªªæäœè
+',
+   'Categories' => 'é¡å¥',
+   'Category' => 'é¡å¥',
+   'CellLength' => 'å
+ä»¶é·åºŠ',
+   'CellWidth' => 'å
+ä»¶å¯¬åºŠ',
+   'City' => 'ååž',
+   'ColorEffect' => {
+      PrintConv => {
+        'Sepia' => 'æ·èæ·±åå¡è²',
+      },
+    },
+   'ColorFilter' => 'é¡è²æ¿Ÿé¡',
+   'ColorMap' => 'è²åœ©å°å',
+   'ColorMode' => {
+      Description => 'é¢šæ Œèš­å®',
+      PrintConv => {
+        'Autumn Leaves' => 'ç§è',
+        'B&W' => 'é»çœ',
+        'Clear' => 'éæ',
+        'Deep' => 'æ·±è²',
+        'Landscape' => 'é¢šæ¯',
+        'Light' => 'æ·¡è²',
+        'Neutral' => 'äž­æ§',
+        'Night View' => 'å€æ¯',
+        'Night View/Portrait' => 'å€éèå',
+        'Portrait' => 'èå',
+        'Standard' => 'æšæº',
+        'Sunset' => 'æ¥èœ',
+        'Vivid' => 'é®®æè²åœ©',
+      },
+    },
+   'ColorResponseUnit' => 'é¡è²åæå®äœ',
+   'ColorSpace' => {
+      Description => 'è²åœ©ç©ºé',
+      PrintConv => {
+        'ICC Profile' => 'è²åœ©æè¿°æª',
+        'Uncalibrated' => 'æªæ ¡æº',
+      },
+    },
+   'ColorTemperature' => 'è²æº«',
+   'Comment' => 'èš»è§£',
+   'ComponentsConfiguration' => 'æ¯åçµæéšåçæçŸ©',
+   'CompressedBitsPerPixel' => 'åœ±åå£çž®æš¡åŒ',
+   'Compression' => {
+      Description => 'å£çž®æ¹åŒ',
+      PrintConv => {
+        'JPEG' => 'JPEGå£çž®ç',
+        'JPEG (old-style)' => 'JPEG (èåŒ)',
+        'Kodak DCR Compressed' => 'Kodak DCR å£çž®',
+        'Kodak KDC Compressed' => 'Kodak KDC å£çž®',
+        'Next' => 'NeXT 2-bit ç·šç¢Œ',
+        'Nikon NEF Compressed' => 'Nikon NEF å£çž®',
+        'Pentax PEF Compressed' => 'Pentax PEF å£çž®',
+        'SGILog' => 'SGI 32-bit Log Luminance ç·šç¢Œ',
+        'SGILog24' => 'SGI 24-bit Log Luminance ç·šç¢Œ',
+        'Sony ARW Compressed' => 'Sony ARW å£çž®',
+        'Thunderscan' => 'ThunderScan 4-bit ç·šç¢Œ',
+        'Uncompressed' => 'æªå£çž®',
+      },
+    },
+   'Contrast' => {
+      Description => 'å°æ¯',
+      PrintConv => {
+        'High' => 'ç¡¬',
+        'Low' => 'è»',
+        'Normal' => 'æšæº',
+      },
+    },
+   'Copyright' => 'çæ¬ææäºº',
+   'CopyrightNotice' => 'çæ¬è²æ',
+   'Country' => 'åå®¶',
+   'Country-PrimaryLocationName' => 'åå®¶',
+   'CreateDate' => 'æžäœåçæ¥ææé',
+   'CreationDate' => 'å»ºç«æ¥æ',
+   'Credit' => 'äœè
+',
+   'CustomRendered' => {
+      Description => 'èªèšåœ±åèç',
+      PrintConv => {
+        'Custom' => 'èªèšçšåº',
+        'Normal' => 'æ­£åžžçšåº',
+      },
+    },
+   'DateCreated' => 'å»ºç«æ¥æ',
+   'DateTimeOriginal' => 'åå§åœ±åæ¥ææé',
+   'DeviceSettingDescription' => 'è£åèš­å®èªªæ',
+   'DigitalZoom' => 'æžç¢Œè®çŠ',
+   'DigitalZoomRatio' => 'æžäœè®çŠæ¯ç',
+   'Directory' => 'å²å­ææ¡äœçœ®',
+   'DocumentName' => 'æä»¶åçš±',
+   'DriveMode' => 'æ¿åµæš¡åŒ',
+   'DynamicRangeOptimizer' => {
+      Description => 'åæ
+ç¯åæäœ³å',
+      PrintConv => {
+        'Advanced Auto' => 'é²éèªå',
+        'Advanced Lv1' => 'é²éç­çŽ 1',
+        'Advanced Lv2' => 'é²éç­çŽ 2',
+        'Advanced Lv3' => 'é²éç­çŽ 3',
+        'Advanced Lv4' => 'é²éç­çŽ 4',
+        'Advanced Lv5' => 'é²éç­çŽ 5',
+        'Auto' => 'èªå',
+        'Off' => 'éé',
+        'Standard' => 'æšæº',
+      },
+    },
+   'ExifImageHeight' => 'åœ±åé«åºŠ',
+   'ExifImageWidth' => 'åœ±åå¯¬åºŠ',
+   'ExifOffset' => 'Exif IFDæé',
+   'ExifVersion' => 'Exif çæ¬',
+   'ExpandFilm' => 'å±éçžç',
+   'ExpandFilterLens' => 'å±éæ¿Ÿé¡',
+   'ExpandFlashLamp' => 'å±ééå
+ç',
+   'ExpandLens' => 'å±éé¡é ­',
+   'ExpandScanner' => 'å±éææåš',
+   'ExpandSoftware' => 'å±éè»é«',
+   'ExposureCompensation' => 'æå
+è£å',
+   'ExposureIndex' => 'æå
+ææž',
+   'ExposureMode' => {
+      Description => 'æå
+æš¡åŒ',
+      PrintConv => {
+        'Auto' => 'èªåæå
+',
+        'Auto bracket' => 'èªåå
+åæå
+',
+        'Manual' => 'æåæå
+',
+      },
+    },
+   'ExposureProgram' => {
+      Description => 'æææš¡åŒ',
+      PrintConv => {
+        'Action (High speed)' => 'åæ
+æš¡åŒ (é«éå¿«é)',
+        'Aperture-priority AE' => 'å
+ååªå
+',
+        'Creative (Slow speed)' => 'æ¯æ·±åªå
+',
+        'Landscape' => 'é¢šæ¯æš¡åŒ',
+        'Manual' => 'æå',
+        'Not Defined' => 'æªå®çŸ©',
+        'Portrait' => 'èåæš¡åŒ (èæ¯åšçŠè·ä»¥å€çç¹å¯«ç
+§ç)',
+        'Program AE' => 'æ­£åžž',
+        'Shutter speed priority AE' => 'å¿«éåªå
+',
+      },
+    },
+   'ExposureTime' => 'æå
+æé',
+   'ExtraSamples' => 'é¡å€çæš£æ¬',
+   'FNumber' => 'å
+å',
+   'FaxRecvParams' => 'å³çæ¥æ¶åæž',
+   'FaxRecvTime' => 'å³çæ¥æ¶æé',
+   'FaxSubAddress' => 'å³çéå±¬å°å',
+   'FileFormat' => 'æ ŒåŒ',
+   'FileModifyDate' => 'æŽæ°æ¥æ',
+   'FileName' => 'æªæ¡åçš±',
+   'FileSize' => 'æªæ¡å€§å°',
+   'FileSource' => {
+      Description => 'æªæ¡äŸæº',
+      PrintConv => {
+        'Digital Camera' => 'æžäœçžæ©',
+        'Film Scanner' => 'åºçææåš',
+        'Reflection Print Scanner' => 'åå°åå°ææåš',
+      },
+    },
+   'FileType' => 'æªæ¡æ ŒåŒ',
+   'FillOrder' => 'å¡«å¯«èšå®',
+   'Flash' => {
+      Description => 'éå
+ç',
+      PrintConv => {
+        'Auto, Did not fire' => 'éå
+çæªæçŒ, èªåæš¡åŒ',
+        'Auto, Did not fire, Red-eye reduction' => 'èªå, éå
+çæªæçŒ, é²çŽ
+çŒæš¡åŒ',
+        'Auto, Fired' => 'éå
+çæçŒ, èªåæš¡åŒ',
+        'Auto, Fired, Red-eye reduction' => 'éå
+çæçŒ, èªåæš¡åŒ, é²çŽ
+çŒæš¡åŒ',
+        'Auto, Fired, Red-eye reduction, Return detected' => 'éå
+çæçŒ, èªåæš¡åŒ, åµæž¬å°åå°å
+, é²çŽ
+çŒæš¡åŒ',
+        'Auto, Fired, Red-eye reduction, Return not detected' => 'éå
+çæçŒ, èªåæš¡åŒ, æªåµæž¬å°åå°å
+, é²çŽ
+çŒæš¡åŒ',
+        'Auto, Fired, Return detected' => 'éå
+çæçŒ, èªåæš¡åŒ, åµæž¬å°åå°å
+',
+        'Auto, Fired, Return not detected' => 'éå
+çæçŒ, èªåæš¡åŒ, æªåµæž¬å°åå°å
+',
+        'Did not fire' => 'éå
+çæªäº®',
+        'Fired' => 'éå
+çæçŒ',
+        'Fired, Red-eye reduction' => 'éå
+çæçŒ, é²çŽ
+çŒæš¡åŒ',
+        'Fired, Red-eye reduction, Return detected' => 'éå
+çæçŒ, é²çŽ
+çŒæš¡åŒ, åµæž¬å°åå°å
+',
+        'Fired, Red-eye reduction, Return not detected' => 'éå
+çæçŒ, é²çŽ
+çŒæš¡åŒ, æªåµæž¬å°åå°å
+',
+        'Fired, Return detected' => 'åµæž¬å° Strobe åå°å
+',
+        'Fired, Return not detected' => 'æªåµæž¬å° Strobe åå°å
+',
+        'No Flash' => 'éå
+çæªæçŒ',
+        'No flash function' => 'æ²æéå
+åèœ',
+        'Off, Did not fire' => 'éå
+çæªæçŒ, åŒ·å¶éå
+æš¡åŒ',
+        'Off, Did not fire, Return not detected' => 'éé, éå
+çæªæçŒ, åå°æªåµæž¬',
+        'Off, No flash function' => 'éé, æ²æéå
+åèœ',
+        'Off, Red-eye reduction' => 'éé, é²çŽ
+çŒæš¡åŒ',
+        'On, Did not fire' => 'éå, éå
+çæªæçŒ',
+        'On, Fired' => 'éå
+çæçŒ, åŒ·å¶éå
+æš¡åŒ',
+        'On, Red-eye reduction' => 'éå
+çæçŒ, åŒ·å¶éå
+æš¡åŒ, é²çŽ
+çŒæš¡åŒ',
+        'On, Red-eye reduction, Return detected' => 'éå
+çæçŒ, åŒ·å¶éå
+æš¡åŒ, é²çŽ
+çŒæš¡åŒ, åµæž¬å°åå°å
+',
+        'On, Red-eye reduction, Return not detected' => 'éå
+çæçŒ, åŒ·å¶éå
+æš¡åŒ, é²çŽ
+çŒæš¡åŒ, æªåµæž¬å°åå°å
+',
+        'On, Return detected' => 'éå
+çæçŒ, åŒ·å¶éå
+æš¡åŒ, åµæž¬å°åå°å
+',
+        'On, Return not detected' => 'éå
+çæçŒ, åŒ·å¶éå
+æš¡åŒ, æªåµæž¬å°åå°å
+',
+      },
+    },
+   'FlashEnergy' => 'éå
+èœé',
+   'FlashExposureComp' => 'éå
+è£å',
+   'FlashpixVersion' => 'æ¯æŽ Flashpix çæ¬',
+   'FocalLength' => 'çŠè·',
+   'FocalLength35efl' => 'çŠè·(35mmæç®)',
+   'FocalLengthIn35mmFormat' => '35mm çžæ©ç­æçŠè·',
+   'FocalPlaneResolutionUnit' => {
+      Description => 'çŠå¹³é¢åèŸšçå®äœ',
+      PrintConv => {
+        'None' => 'ç¡',
+        'inches' => 'è±å',
+        'um' => 'Âµm (åŸ®ç±³)',
+      },
+    },
+   'FocalPlaneXResolution' => 'Xè»žçŠå¹³é¢åèŸšç',
+   'FocalPlaneYResolution' => 'Yè»žçŠå¹³é¢åèŸšç',
+   'FocusMode' => 'å°çŠæš¡åŒ',
+   'FrameRate' => 'æžé¢éç',
+   'FrameSize' => 'ç«é¢å°ºå¯ž',
+   'GPSAltitude' => 'æµ·æé«åºŠ',
+   'GPSAltitudeRef' => {
+      Description => 'æµ·æé«åºŠåè',
+      PrintConv => {
+        'Above Sea Level' => 'æµ·å¹³é¢',
+        'Below Sea Level' => 'æµ·å¹³é¢åè(è² åŒ)',
+      },
+    },
+   'GPSAreaInformation' => 'GPSåååçš±',
+   'GPSDOP' => 'æž¬éç²ŸåºŠ',
+   'GPSDateStamp' => 'GPS æ¥æ',
+   'GPSDestBearing' => 'ç®çå°æ¹äœ',
+   'GPSDestBearingRef' => {
+      Description => 'ç®çå°æ¹äœäŸæ',
+      PrintConv => {
+        'Magnetic North' => 'ç£æ§çæ¹äœ',
+        'True North' => 'çå¯Šçæ¹äœ',
+      },
+    },
+   'GPSDestDistance' => 'ç®çå°è·é¢',
+   'GPSDestDistanceRef' => {
+      Description => 'ç®çå°è·é¢äŸæ',
+      PrintConv => {
+        'Kilometers' => 'å
+¬é',
+        'Miles' => 'è±é',
+        'Nautical Miles' => 'ç¯',
+      },
+    },
+   'GPSDestLatitude' => 'ç®çå°ç·¯åºŠ',
+   'GPSDestLatitudeRef' => {
+      Description => 'ç®çå°çç·¯åºŠäŸæ',
+      PrintConv => {
+        'North' => 'åç·¯',
+        'South' => 'åç·¯',
+      },
+    },
+   'GPSDestLongitude' => 'ç®çå°ç¶åºŠ',
+   'GPSDestLongitudeRef' => {
+      Description => 'ç®çå°çç¶åºŠäŸæ',
+      PrintConv => {
+        'East' => 'æ±ç¶',
+        'West' => 'è¥¿ç¶',
+      },
+    },
+   'GPSDifferential' => {
+      Description => 'GPS å®äœåå·®ä¿®æ­£',
+      PrintConv => {
+        'Differential Corrected' => 'å®äœåå·®ä¿®æ­£',
+        'No Correction' => 'ç¡å®äœåå·®ä¿®æ­£',
+      },
+    },
+   'GPSImgDirection' => 'åœ±åæ¹äœ',
+   'GPSImgDirectionRef' => {
+      Description => 'åœ±åæ¹äœäŸæ',
+      PrintConv => {
+        'Magnetic North' => 'ç£æ§çæ¹äœ ',
+        'True North' => 'çå¯Šçæ¹äœ',
+      },
+    },
+   'GPSInfo' => 'GPS Info IFDæé',
+   'GPSLatitude' => 'ç·¯åºŠ',
+   'GPSLatitudeRef' => {
+      Description => 'å/åç·¯',
+      PrintConv => {
+        'North' => 'åç·¯',
+        'South' => 'åç·¯',
+      },
+    },
+   'GPSLongitude' => 'ç¶åºŠ',
+   'GPSLongitudeRef' => {
+      Description => 'æ±/è¥¿ç¶',
+      PrintConv => {
+        'East' => 'æ±ç¶',
+        'West' => 'è¥¿ç¶',
+      },
+    },
+   'GPSMapDatum' => 'äœ¿çšå€§å°æž¬éæžæ',
+   'GPSMeasureMode' => {
+      Description => 'GPS æž¬éæš¡åŒ',
+      PrintConv => {
+        '2-Dimensional Measurement' => '2-äžç¶­æž¬é',
+        '3-Dimensional Measurement' => '3-äžç¶­æž¬é',
+      },
+    },
+   'GPSProcessingMethod' => 'GPSèçåçš±',
+   'GPSSatellites' => 'çšæŒæž¬éçå
+šçè¡æå®äœç³»çµ±è¡æ',
+   'GPSSpeed' => 'GPS æ¥æ¶æ©çéåºŠ',
+   'GPSSpeedRef' => {
+      Description => 'éåºŠå®äœ',
+      PrintConv => {
+        'km/h' => 'æé',
+        'knots' => 'ç¯',
+        'mph' => 'è±é',
+      },
+    },
+   'GPSStatus' => {
+      Description => 'GPSæ¥æ¶æ©ççæ
+',
+      PrintConv => {
+        'Measurement Active' => 'æž¬éææ',
+        'Measurement Void' => 'æž¬éç¡æ',
+      },
+    },
+   'GPSTimeStamp' => 'GPS æé (åå­é)',
+   'GPSTrack' => 'ç§»åæ¹äœ',
+   'GPSTrackRef' => {
+      Description => 'ç§»åæ¹äœäŸæ',
+      PrintConv => {
+        'Magnetic North' => 'ç£æ§çæ¹äœ ',
+        'True North' => 'çå¯Šçæ¹äœ',
+      },
+    },
+   'GPSVersionID' => 'GPS æšç±€çæ¬',
+   'GainControl' => {
+      Description => 'å¢çæ§å¶',
+      PrintConv => {
+        'High gain down' => 'é«è¡°æž',
+        'High gain up' => 'é«å¢ç',
+        'Low gain down' => 'äœè¡°æž',
+        'Low gain up' => 'äœå¢ç',
+        'None' => 'ç¡',
+      },
+    },
+   'Gamma' => 'å°æ¯ç³»æž',
+   'Gradation' => 'ç°é',
+   'GrayResponseCurve' => 'ç°è²åææ²ç·',
+   'GrayResponseUnit' => 'ç°è²åæå®äœ',
+   'HDR' => {
+      Description => 'Auto HDR',
+      PrintConv => {
+        'Off' => 'éé',
+      },
+    },
+   'Headline' => 'æšé¡',
+   'HighISONoiseReduction' => {
+      Description => 'é« ISO éèšæ¶é€',
+      PrintConv => {
+        'Auto' => 'èªå',
+        'High' => 'é«',
+        'Low' => 'äœ',
+        'Normal' => 'äžè¬',
+        'Off' => 'éé',
+      },
+    },
+   'HostComputer' => 'äž»æ©',
+   'Hue' => 'è²çž',
+   'IPTC-NAA' => 'IPTC-NAA å
+è³æ',
+   'ImageDescription' => 'åœ±åæšé¡',
+   'ImageHeight' => 'åœ±åé«åºŠ',
+   'ImageHistory' => 'åœ±åæ­·å²',
+   'ImageNumber' => 'åœ±åç·šè',
+   'ImageSize' => 'åœ±åå°ºå¯ž',
+   'ImageSourceData' => 'åœ±åäŸæºè³æ',
+   'ImageUniqueID' => 'çšç¹çåœ±åID',
+   'ImageWidth' => 'åœ±åå¯¬åºŠ',
+   'Index' => 'çŽ¢åŒ',
+   'Instructions' => 'èªªæ',
+   'Interlace' => 'äº€é¯',
+   'InteropIndex' => 'äºéæ§éå®',
+   'InteropOffset' => 'äºçšæšèš',
+   'InteropVersion' => 'äºéæ§çæ¬',
+   'Keyword' => 'ééµå­',
+   'Keywords' => 'ééµå­',
+   'Lens' => 'é¡é ­',
+   'LensInfo' => 'é¡é ­è³èš',
+   'LightSource' => {
+      Description => 'å
+æº',
+      PrintConv => {
+        'Cloudy' => 'å€é²',
+        'Cool White Fluorescent' => 'å·çœè²çå
+ç (W 3800 - 4500K)',
+        'Day White Fluorescent' => 'æ¥å
+çœè²çå
+ç (N 4600 - 5500K)',
+        'Daylight' => 'æ¥å
+',
+        'Daylight Fluorescent' => 'æ¥å
+çå
+ç (D 5700 - 7100K)',
+        'Fine Weather' => 'æŽå€©',
+        'Flash' => 'éå
+ç',
+        'Fluorescent' => 'æ¥å
+ç',
+        'ISO Studio Tungsten' => 'ISO æåœ±æ£é¢ç',
+        'Other' => 'å
+¶ä»å
+æº',
+        'Shade' => 'é°å€©',
+        'Standard Light A' => 'æšæºçå
+ A',
+        'Standard Light B' => 'æšæºçå
+ B',
+        'Standard Light C' => 'æšæºçå
+ C',
+        'Tungsten (Incandescent)' => 'é¢çµ²ç',
+        'Unknown' => 'æªç¥',
+        'Warm White Fluorescent' => 'æçœè¢å
+ç (L 2600 - 3250K)',
+        'White Fluorescent' => 'çœè²çå
+ç (WW 3250 - 3800K)',
+      },
+    },
+   'Lightness' => 'ææåºŠ',
+   'Location' => 'å°å',
+   'LongExposureNoiseReduction' => {
+      Description => 'æ¶é€é·æéèš',
+      PrintConv => {
+        'Off' => 'éé',
+        'On' => 'éå',
+      },
+    },
+   'Make' => 'è£œé å',
+   'MakerNote' => 'è£œé åèš»è§£',
+   'MakerNotes' => 'è£œé åèšé',
+   'MaxAperture' => 'é¡é ­å
+åæå€§åŒ',
+   'MaxApertureValue' => 'é¡é ­æå€§å
+å',
+   'MaxSampleValue' => 'å€§æš£ååŒ',
+   'MeteringMode' => {
+      Description => 'æž¬å
+æš¡åŒ',
+      PrintConv => {
+        'Average' => 'å¹³åæž¬å
+',
+        'Center-weighted average' => 'äž­å€®éé»å¹³åæž¬å
+',
+        'Multi-segment' => 'è©å¹æž¬å
+',
+        'Multi-spot' => 'å€é»æž¬å
+',
+        'Other' => 'å
+¶ä»',
+        'Partial' => 'å±éšæž¬å
+',
+        'Spot' => 'é»æž¬å
+',
+        'Unknown' => 'æªç¥',
+      },
+    },
+   'MinSampleValue' => 'å°æš£ååŒ',
+   'Model' => 'çžæ©åè',
+   'Model2' => 'ç¬¬äºåœ±åèŒžå
+¥èš­å',
+   'ModifyDate' => 'æªæ¡å»ºç«æ¥æåæé',
+   'MultiFrameNoiseReduction' => {
+      Description => 'å€æ¡éèšæ¶é€',
+      PrintConv => {
+        'Off' => 'éé',
+        'On' => 'éå',
+      },
+    },
+   'Noise' => 'éèš',
+   'NoiseReduction' => 'éèšæå¶',
+   'Opto-ElectricConvFactor' => 'å
+é»èœæå å­',
+   'Orientation' => {
+      Description => 'åœ±åçæ¹å',
+      PrintConv => {
+        'Horizontal (normal)' => '0Â° (é ç«¯/å·Šé)',
+        'Mirror horizontal' => '0Â° (é ç«¯/å³é)',
+        'Mirror horizontal and rotate 270 CW' => '90Â° CW (å·Šé/é ç«¯)',
+        'Mirror horizontal and rotate 90 CW' => '90Â° CCW (å³é/åºéš)',
+        'Mirror vertical' => '180Â° (åºéš/å·Šé)',
+        'Rotate 180' => '180Â° (åºéš/å³é)',
+        'Rotate 270 CW' => '90Â° CW (å·Šé/åºéš)',
+        'Rotate 90 CW' => '90Â° CCW (å³é/é ç«¯)',
+      },
+    },
+   'Padding' => 'å¡«å
+
+',
+   'PageName' => 'åçš±',
+   'PageNumber' => 'é æ¬¡',
+   'PhotometricInterpretation' => {
+      Description => 'åçŽ æ ŒåŒ',
+      PrintConv => {
+        'BlackIsZero' => 'é»è²çºé¶',
+        'Color Filter Array' => 'CFA (åœ©è²æ¿Ÿå
+çç©é£)',
+        'RGB Palette' => 'èª¿è²æ¿çé¡è²',
+        'Transparency Mask' => 'éæé®çœ©',
+        'WhiteIsZero' => 'çœè²çºé¶',
+      },
+    },
+   'PlanarConfiguration' => {
+      Description => 'åœ±åè³æç·šææ¹åŒ',
+      PrintConv => {
+        'Chunky' => 'Chunky æ ŒåŒ (äº€é¯å)',
+        'Planar' => 'Planar æ ŒåŒ (å¹³é¢å)',
+      },
+    },
+   'Predictor' => {
+      Description => 'é æž¬',
+      PrintConv => {
+        'Horizontal differencing' => 'æ°Žå¹³åå¥',
+        'None' => 'æ²æäœ¿çšéé æž¬ç·šç¢Œæ¹æ¡',
+      },
+    },
+   'PrimaryChromaticities' => 'é éžçè²åºŠ',
+   'ProcessingSoftware' => 'èçè»é«',
+   'Province-State' => 'å·/ç',
+   'Quality' => {
+      Description => 'åœ±ååè³ª',
+      PrintConv => {
+        'Compressed RAW' => 'cRAW',
+        'Compressed RAW + JPEG' => 'cRAW+JPEG',
+        'Extra Fine' => 'è¶
+ç²ŸçŽ°',
+        'Fine' => 'ç²ŸçŽ°',
+        'Low' => 'äœåè³ª',
+        'Normal' => 'æšæºåè³ª',
+        'RAW + JPEG' => 'RAW+JPEG',
+        'Standard' => 'æšæº',
+      },
+    },
+   'Rating' => 'è©å',
+   'RatingPercent' => 'è©åççŸåæ¯',
+   'RecordMode' => 'èšéæš¡åŒ',
+   'ReferenceBlackWhite' => 'å°é»è²åçœè²çåèå¹åŒ',
+   'RelatedImageFileFormat' => 'çžéçåœ±åæªæ¡æ ŒåŒ',
+   'RelatedImageHeight' => 'çžéçåœ±åé«åºŠ',
+   'RelatedImageWidth' => 'çžéçåœ±åå¯¬åºŠ',
+   'RelatedSoundFile' => 'çžéçé³é »æªæ¡',
+   'ResolutionUnit' => {
+      Description => 'å¯¬èé«çå®äœ',
+      PrintConv => {
+        'None' => 'ç¡',
+        'cm' => 'å
+¬å',
+        'inches' => 'è±å',
+      },
+    },
+   'RowsPerStrip' => 'æ¯æ¢åæž',
+   'SamplesPerPixel' => 'å
+ä»¶æžé',
+   'Saturation' => {
+      Description => 'é£œååºŠ',
+      PrintConv => {
+        'High' => 'é«é£œååºŠ',
+        'Low' => 'äœé£œååºŠ',
+        'Normal' => 'æšæº',
+      },
+    },
+   'SceneCaptureType' => {
+      Description => 'å Žæ¯æ·åé¡å',
+      PrintConv => {
+        'Landscape' => 'é¢šæ¯',
+        'Night' => 'å€æ¯',
+        'Portrait' => 'èå',
+        'Standard' => 'æšæº',
+      },
+    },
+   'SceneMode' => {
+      Description => 'å Žæ¯éžæ',
+      PrintConv => {
+        '3D Sweep Panorama' => '3D',
+        'Anti Motion Blur' => 'é²æ­¢ç§»åæš¡ç³',
+        'Auto' => 'èªå',
+        'Cont. Priority AE' => 'é£æåªå
+AE',
+        'Handheld Night Shot' => 'ææå€æ',
+        'Landscape' => 'é¢šæ¯',
+        'Macro' => 'è¶
+è¿ææ',
+        'Night Portrait' => 'å€éèå',
+        'Night Scene' => 'å€æ¯',
+        'Night View/Portrait' => 'å€æ¯/èå',
+        'Portrait' => 'èå',
+        'Sports' => 'éåå Žé¢',
+        'Standard' => '',
+        'Sunset' => 'å€éœ',
+        'Sweep Panorama' => 'å
+šæ¯æåœ±',
+      },
+    },
+   'SceneType' => {
+      Description => 'å Žæ¯é¡å',
+      PrintConv => {
+        'Directly photographed' => 'çŽæ¥ææçåœ±å',
+      },
+    },
+   'SecurityClassification' => {
+      Description => 'å®å
+šåé¡',
+      PrintConv => {
+        'Confidential' => 'ç§å¯',
+        'Restricted' => 'éå¶',
+        'Secret' => 'æ©å¯',
+        'Top Secret' => 'æé«æ©å¯',
+        'Unclassified' => 'æªåé¡',
+      },
+    },
+   'SelfTimerMode' => 'åæžèªææš¡åŒ',
+   'SensingMethod' => {
+      Description => 'ææž¬åšé¡å',
+      PrintConv => {
+        'Color sequential area' => 'é£çºåœ©è²ææž¬åš',
+        'Color sequential linear' => 'é£çºåœ©è²ç·æ§ææž¬åš',
+        'Monochrome area' => 'å®è²ææž¬åš',
+        'Monochrome linear' => 'å®è²ç·æ§ææž¬åš',
+        'Not defined' => 'æªå®çŸ©',
+        'One-chip color area' => 'å®æ¶çåœ©è²ææž¬åš',
+        'Three-chip color area' => 'äžæ¶çåœ©è²ææž¬åš',
+        'Trilinear' => 'äžç·æ§ææž¬åš',
+        'Two-chip color area' => 'éæ¶çåœ©è²ææž¬åš',
+      },
+    },
+   'SerialNumber' => 'ç
+§çžæ©ID',
+   'ShadingCompensation' => 'é°åœ±è£å',
+   'Sharpness' => {
+      Description => 'é³å©åºŠ',
+      PrintConv => {
+        'Hard' => 'ç¡¬',
+        'Normal' => 'æšæº',
+        'Soft' => 'è»',
+      },
+    },
+   'ShootingMode' => 'æææš¡åŒ',
+   'ShutterSpeed' => 'æå
+æé',
+   'ShutterSpeedValue' => 'å¿«é',
+   'Software' => 'è»é«',
+   'Source' => 'äŸæº',
+   'SpatialFrequencyResponse' => 'ç©ºéé »çé¿æ',
+   'SpectralSensitivity' => 'å
+è­éæåºŠ',
+   'State' => 'å·',
+   'StripByteCounts' => 'æ­€è³æåæ®µçå®¹é',
+   'StripOffsets' => 'åœ±åè³æäœå',
+   'SubSecTime' => 'æ¥ææéç§',
+   'SubSecTimeDigitized' => 'æžäœåçæ¥ææéç§',
+   'SubSecTimeOriginal' => 'åå§åœ±åæ¥ææéç§',
+   'SubfileType' => 'æ°ç subfile é¡å',
+   'Subject' => 'äž»æš',
+   'SubjectArea' => 'äž»é¡å°å',
+   'SubjectDistance' => 'äž»é«è·é¢ç¯å',
+   'SubjectDistanceRange' => {
+      Description => 'äž»é«è·é¢ç¯å',
+      PrintConv => {
+        'Close' => 'è¿',
+        'Distant' => 'é ',
+        'Macro' => 'åŸ®è·',
+        'Unknown' => 'æªç¥',
+      },
+    },
+   'SubjectLocation' => 'äž»é¡äœçœ®',
+   'SupplementalCategories' => 'è£å
+
+é¡å¥',
+   'T4Options' => 'æªå£çž®',
+   'ThumbnailImage' => 'çž®ç¥å',
+   'ThumbnailImageSize' => 'çž®åå°ºå¯ž',
+   'Title' => 'æšé¡',
+   'TransferFunction' => 'å³éåœæž',
+   'TransmissionReference' => 'å³èŒžéèš»',
+   'Urgency' => 'ç·æ¥åºŠ',
+   'UserComment' => 'äœ¿çšè
+èš»è§£',
+   'WhiteBalance' => {
+      Description => 'çœå¹³è¡¡',
+      PrintConv => {
+        'Auto' => 'èªå',
+        'Black & White' => 'é»çœ',
+        'Cloudy' => 'å€é²',
+        'Color Temperature/Color Filter' => 'è²æº« / åœ©è²æ¿Ÿé¡',
+        'Cool White Fluorescent' => 'å·çœè²è¢å
+ç',
+        'Custom' => 'èªèš­',
+        'Custom 1' => 'çšæ¶èªå®1',
+        'Custom 2' => 'çšæ¶èªå®2',
+        'Custom 3' => 'çšæ¶èªå®3',
+        'Custom 4' => 'çšæ¶èªå®4',
+        'Day White Fluorescent' => 'æ¥å
+çœè²è¢å
+ç',
+        'Daylight' => 'æ¥å
+',
+        'Daylight Fluorescent' => 'æ¥å
+è²è¢å
+ç',
+        'Flash' => 'éå
+ç',
+        'Fluorescent' => 'çå
+ç',
+        'Manual' => 'æå',
+        'Shade' => 'é°å€©',
+        'Tungsten' => 'çœçŸç',
+        'Warm White Fluorescent' => 'æçœè¢å
+ç',
+        'White Fluorescent' => 'çœè²çå
+ç',
+      },
+    },
+   'WhitePoint' => 'çœé»è²åºŠ',
+   'Writer-Editor' => 'èªªæäœè
+',
+   'XMP' => 'XMP å
+è³æ',
+   'XPosition' => 'X äœçœ®',
+   'XResolution' => 'æ°Žå¹³è§£æåºŠ',
+   'YCbCrCoefficients' => 'é¡è²ç©ºéè®åç©é£ç³»æž',
+   'YCbCrPositioning' => {
+      Description => 'Y å C çèš­å®',
+      PrintConv => {
+        'Centered' => 'äž­å¿',
+        'Co-sited' => 'äžèŽ',
+      },
+    },
+   'YCbCrSubSampling' => 'Y å° C çæœæš£æ¯ç',
+   'YPosition' => 'Y äœçœ®',
+   'YResolution' => 'åçŽè§£æåºŠ',
+   'ZoneMatching' => {
+      Description => 'ååå¹é
+',
+      PrintConv => {
+        'High Key' => 'é«',
+        'ISO Setting Used' => 'éé',
+        'Low Key' => 'äœ',
+      },
+    },
+);
+
+1;  # end
+
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Lang::zh_tw.pm - ExifTool Traditional Chinese language translations
+
+=head1 DESCRIPTION
+
+This file is used by Image::ExifTool to generate localized tag descriptions
+and values.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Jens Duttke and MikeF for providing this translation.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool(3pm)|Image::ExifTool>,
+L<Image::ExifTool::TagInfoXML(3pm)|Image::ExifTool::TagInfoXML>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Leaf.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Leaf.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Leaf.pm	(revision 24799)
@@ -0,0 +1,515 @@
+#------------------------------------------------------------------------------
+# File:         Leaf.pm
+#
+# Description:  Read Creo Leaf EXIF meta information
+#
+# Revisions:    09/28/2005  - P. Harvey Created
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Leaf;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::Exif;
+
+$VERSION = '1.03';
+
+sub ProcessLeaf($$$);
+
+%Image::ExifTool::Leaf::Main = (
+    PROCESS_PROC => \&ProcessLeaf,
+    GROUPS => { 0 => 'Leaf', 2 => 'Camera' },
+    NOTES => q{
+        These tags are found in .MOS images from Leaf digital camera backs as
+        written by Creo Leaf Capture.  They exist within the Leaf-specific directory
+        structure of EXIF tag 0x8606.  The tables below list observed Leaf tags,
+        however ExifTool will extract any tags found in the Leaf directories even if
+        they don't appear in these tables.
+    },
+    icc_camera_profile => {
+        Name => 'ICC_Profile',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::ICC_Profile::Main',
+        },
+    },
+    icc_rgb_ws_profile => {
+        Name => 'RGB_Profile',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::ICC_Profile::Main',
+        },
+    },
+    camera_profile => {
+        Name => 'CameraProfile',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Leaf::CameraProfile',
+        },
+    },
+    JPEG_preview_data => {
+        %Image::ExifTool::previewImageTagInfo,
+    },
+    JPEG_preview_info => 'PreviewInfo',
+    icc_camera_to_tone_space_flow => {
+        Name => 'ToneSpaceFlow',
+        Description => 'ICC To Tone Space Flow',
+        Format => 'int16u',
+    },
+    icc_camera_to_tone_matrix => {
+        Name => 'ToneMatrix',
+        Description => 'ICC To Tone Matrix',
+        Format => 'int8u',
+        Binary => 1,
+    },
+    PDA_histogram_data => {
+        Name => 'PDAHistogram',
+        Binary => 1,
+    },
+    pattern_ratation_angle => {
+        Name => 'PatternAngle',
+        Description => 'Pattern Rotation Angle',
+        Format => 'int16u',
+        Notes => '"ratation" is not a typo',
+    },
+    back_serial_number => {
+        Name => 'BackSerial',
+        Description => 'Back Serial Number',
+        PrintConv => '$val =~ s/ .*//; $val',
+    },
+    image_offset => { Format => 'int16u' },
+);
+
+%Image::ExifTool::Leaf::CameraProfile = (
+    PROCESS_PROC => \&ProcessLeaf,
+    GROUPS => { 0 => 'Leaf', 2 => 'Camera' },
+    CamProf_version => 'CameraProfileVersion',
+    CamProf_name    => 'CameraName',
+    CamProf_type    => 'CameraType',
+    CamProf_back_type => 'CameraBackType',
+    CamProf_back_type => {
+        Name => 'CameraBackType',
+    },
+    CamProf_capture_profile => {
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Leaf::CaptureProfile',
+        },
+    },
+    CamProf_image_profile => {
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Leaf::ImageProfile',
+        },
+    },
+);
+
+%Image::ExifTool::Leaf::CaptureProfile = (
+    PROCESS_PROC => \&ProcessLeaf,
+    GROUPS => { 0 => 'Leaf', 2 => 'Image' },
+    CaptProf_version        => {},
+    CaptProf_name           => {},
+    CaptProf_type           => {},
+    CaptProf_back_type      => {},
+    CaptProf_serial_number  => {
+        Name => 'CaptureSerial',
+        Description => 'Capture Serial Number',
+        PrintConv => '$val =~ s/ .*//; $val',
+    },
+    CaptProf_image_offset       => {},
+    CaptProf_luminance_consts   => {},
+    CaptProf_xy_offset_info     => 'XYOffsetInfo',
+    CaptProf_color_matrix       => {},
+    CaptProf_reconstruction_type=> {},
+    CaptProf_image_fields       => {},
+    CaptProf_image_bounds       => {},
+    CaptProf_number_of_planes   => {},
+    CaptProf_raw_data_rotation  => {},
+    CaptProf_color_averages     => {},
+    CaptProf_mosaic_pattern     => {},
+    CaptProf_dark_correction_type=>{},
+    CaptProf_right_dark_rect    => {},
+    CaptProf_left_dark_rect     => {},
+    CaptProf_center_dark_rect   => {},
+    CaptProf_CCD_rect           => {},
+    CaptProf_CCD_valid_rect     => {},
+    CaptProf_CCD_video_rect     => {},
+);
+
+%Image::ExifTool::Leaf::ImageProfile = (
+    PROCESS_PROC => \&ProcessLeaf,
+    GROUPS => { 0 => 'Leaf', 2 => 'Image' },
+    ImgProf_version         => {},
+    ImgProf_name            => {},
+    ImgProf_type            => {},
+    ImgProf_back_type       => {},
+    ImgProf_shoot_setup => {
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Leaf::ShootSetup',
+        },
+    },
+    ImgProf_image_status    => {},
+    ImgProf_rotation_angle  => {},
+);
+
+%Image::ExifTool::Leaf::ShootSetup = (
+    PROCESS_PROC => \&ProcessLeaf,
+    GROUPS => { 0 => 'Leaf', 2 => 'Image' },
+    ShootObj_version        => {},
+    ShootObj_name           => {},
+    ShootObj_type           => {},
+    ShootObj_back_type      => {},
+    ShootObj_capture_setup => {
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Leaf::CaptureSetup',
+        },
+    },
+    ShootObj_color_setup => {
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Leaf::ColorSetup',
+        },
+    },
+    ShootObj_save_setup => {
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Leaf::SaveSetup',
+        },
+    },
+    ShootObj_camera_setup => {
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Leaf::CameraSetup',
+        },
+    },
+    ShootObj_look_header => {
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Leaf::LookHeader',
+        },
+    },
+);
+
+%Image::ExifTool::Leaf::CaptureSetup = (
+    PROCESS_PROC => \&ProcessLeaf,
+    GROUPS => { 0 => 'Leaf', 2 => 'Image' },
+    CaptureObj_version      => {},
+    CaptureObj_name         => {},
+    CaptureObj_type         => {},
+    CaptureObj_back_type    => {},
+    CaptureObj_neutals => {
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Leaf::Neutrals',
+        },
+    },
+    CaptureObj_selection => {
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Leaf::Selection',
+        },
+    },
+    CaptureObj_tone_curve => {
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Leaf::ToneCurve',
+        },
+    },
+    CaptureObj_sharpness => {
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Leaf::Sharpness',
+        },
+    },
+    CaptureObj_single_quality => {},
+    CaptureObj_Multi_quality  => {},
+);
+
+%Image::ExifTool::Leaf::Neutrals = (
+    PROCESS_PROC => \&ProcessLeaf,
+    GROUPS => { 0 => 'Leaf', 2 => 'Image' },
+    NeutObj_version         => {},
+    NeutObj_name            => {},
+    NeutObj_type            => {},
+    NeutObj_back_type       => {},
+    NeutObj_neutrals        => {},
+    NeutObj_color_casts     => {},
+    NeutObj_shadow_end_points    => {},
+    NeutObj_highlight_end_points => {},
+);
+
+%Image::ExifTool::Leaf::Selection = (
+    PROCESS_PROC => \&ProcessLeaf,
+    GROUPS => { 0 => 'Leaf', 2 => 'Image' },
+    SelObj_version          => {},
+    SelObj_name             => {},
+    SelObj_type             => {},
+    SelObj_back_type        => {},
+    SelObj_rect             => {},
+    SelObj_resolution       => {},
+    SelObj_scale            => {},
+    SelObj_locks            => {},
+    SelObj_orientation      => {},
+);
+
+%Image::ExifTool::Leaf::ToneCurve = (
+    PROCESS_PROC => \&ProcessLeaf,
+    GROUPS => { 0 => 'Leaf', 2 => 'Image' },
+    ToneObj_version         => {},
+    ToneObj_name            => {},
+    ToneObj_type            => {},
+    ToneObj_back_type       => {},
+    ToneObj_npts            => {},
+    ToneObj_tones           => {},
+    ToneObj_gamma           => {},
+);
+
+%Image::ExifTool::Leaf::Sharpness = (
+    PROCESS_PROC => \&ProcessLeaf,
+    GROUPS => { 0 => 'Leaf', 2 => 'Image' },
+    SharpObj_version        => {},
+    SharpObj_name           => {},
+    SharpObj_type           => {},
+    SharpObj_back_type      => {},
+    SharpObj_sharp_method   => {},
+    SharpObj_data_len       => {},
+    SharpObj_sharp_info     => {},
+);
+
+%Image::ExifTool::Leaf::ColorSetup = (
+    PROCESS_PROC => \&ProcessLeaf,
+    GROUPS => { 0 => 'Leaf', 2 => 'Image' },
+    ColorObj_version        => {},
+    ColorObj_name           => {},
+    ColorObj_type           => {},
+    ColorObj_back_type      => {},
+    ColorObj_has_ICC        => {},
+    ColorObj_input_profile  => {},
+    ColorObj_output_profile => {},
+    ColorObj_color_mode     => {},
+    ColorObj_color_type     => {},
+);
+
+%Image::ExifTool::Leaf::SaveSetup = (
+    PROCESS_PROC => \&ProcessLeaf,
+    GROUPS => { 0 => 'Leaf', 2 => 'Other' },
+    SaveObj_version         => {},
+    SaveObj_name            => {},
+    SaveObj_type            => {},
+    SaveObj_back_type       => {},
+    SaveObj_leaf_auto_active=> {},
+    SaveObj_leaf_hot_folder => {},
+    SaveObj_leaf_output_file_type => {},
+    SaveObj_leaf_auto_base_name   => {},
+    SaveObj_leaf_save_selection   => {},
+    SaveObj_leaf_open_proc_HDR    => {},
+    SaveObj_std_auto_active       => {},
+    SaveObj_std_hot_folder        => {},
+    SaveObj_std_output_file_type  => {},
+    SaveObj_std_output_color_mode => {},
+    SaveObj_std_output_bit_depth  => {},
+    SaveObj_std_base_name         => {},
+    SaveObj_std_save_selection    => {},
+    SaveObj_std_oxygen            => {},
+    SaveObj_std_open_in_photoshop => {},
+    SaveObj_std_scaled_output     => {},
+    SaveObj_std_sharpen_output    => {},
+);
+
+%Image::ExifTool::Leaf::CameraSetup = (
+    PROCESS_PROC => \&ProcessLeaf,
+    GROUPS => { 0 => 'Leaf', 2 => 'Camera' },
+    CameraObj_version       => {},
+    CameraObj_name          => {},
+    CameraObj_type          => {},
+    CameraObj_back_type     => {},
+    CameraObj_ISO_speed     => {},
+    CameraObj_strobe        => {},
+    CameraObj_camera_type   => {},
+    CameraObj_lens_type     => {},
+    CameraObj_lens_ID       => {},
+);
+
+%Image::ExifTool::Leaf::LookHeader = (
+    PROCESS_PROC => \&ProcessLeaf,
+    GROUPS => { 0 => 'Leaf', 2 => 'Other' },
+    LookHead_version        => {},
+    LookHead_name           => {},
+    LookHead_type           => {},
+    LookHead_back_type      => {},
+);
+
+# tag table for any unknown Leaf directories
+%Image::ExifTool::Leaf::Unknown = (
+    PROCESS_PROC => \&ProcessLeaf,
+    GROUPS => { 0 => 'Leaf', 2 => 'Unknown' },
+);
+
+# table for Leaf SubIFD entries
+%Image::ExifTool::Leaf::SubIFD = (
+    GROUPS => { 0 => 'MakerNotes', 1 => 'LeafSubIFD', 2 => 'Image'},
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    NOTES => q{
+        Leaf writes a TIFF-format sub-IFD inside IFD0 of a MOS image.  No tags in
+        this sub-IFD are currently known, except for tag 0x8606 which really
+        shouldn't be here anyway (so it doesn't appear in the table below) because
+        it duplicates a reference to the same data of tag 0x8606 in IFD0.
+    },
+);
+
+# prepare Leaf tables by generating tag 'Name' and table 'NOTES'
+{
+    my @tableList = ( 'Image::ExifTool::Leaf::Main' );
+    my ($tag, %doneTable);
+    # keep prefix in tag name of common tags
+    my %keepPrefix = ( Version=>1, Name=>1, Type=>1, BackType=>1 );
+    while (@tableList) {
+        my $table = shift @tableList;
+        next if $doneTable{$table};
+        my $prefix = ($table =~ /::Main$/) ? undef : '';
+        $doneTable{$table} = 1;
+        no strict 'refs';
+        $table = \%$table;
+        use strict 'refs';
+        foreach $tag (keys %$table) {
+            my $tagInfo = $$table{$tag};
+            next unless ref $tagInfo eq 'HASH';
+            next if $tag eq 'GROUPS';
+            if (defined $prefix and not $prefix) {
+                ($prefix = $tag) =~ s/_.*//;
+            }
+            unless ($$tagInfo{Name}) {
+                my $name;
+                ($name = $tag) =~ s/_(.)/\U$1/g;
+                if ($prefix) {
+                    $name =~ s/^$prefix//;
+                    $name = $prefix . $name if $keepPrefix{$name};
+                }
+                $$tagInfo{Name} = ucfirst($name);
+            }
+            next unless $$tagInfo{SubDirectory};
+            my $subTable = $tagInfo->{SubDirectory}->{TagTable};
+            next unless $subTable =~ /::Leaf::/;
+            push @tableList, $subTable;
+        }
+        next unless $prefix;
+        $$table{NOTES} = "All B<Tag ID>'s in the following table have a " .
+                         "leading '${prefix}_' which\nhas been removed.\n";
+    }
+}
+
+#------------------------------------------------------------------------------
+# Process Leaf information
+# Inputs: 0) ExifTool object reference
+#         1) Reference to directory information hash
+#         2) Pointer to tag table for this directory
+# Returns: 1 on success, otherwise returns 0 and sets a Warning
+sub ProcessLeaf($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dirStart = $$dirInfo{DirStart} || 0;
+    my $dirLen = $$dirInfo{DirLen} || $$dirInfo{DataLen} - $dirStart;
+    my $dirEnd = $dirStart + $dirLen;
+    my $verbose = $exifTool->Options('Verbose');
+    my $pos = $dirStart;
+    my $hdrLen = 52;    # header length for PKTS information
+    my $success;
+
+    $verbose and $exifTool->VerboseDir('Leaf');
+    for (;;) {
+        last if $pos + $hdrLen > $dirEnd;
+        my $header = substr($$dataPt, $pos, $hdrLen);
+        last unless substr($header, 0, 4) eq 'PKTS';
+        $success = 1;
+        my $size = Get32u(\$header, 48);
+        $pos += $hdrLen;
+        if ($pos + $size > $dirEnd) {
+            $exifTool->Warn('Truncated Leaf data');
+            last;
+        }
+        my $tag = substr($header, 8, 40);
+        $tag =~ s/\0.*//;
+        next unless $tag;
+        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        # generate tag info for unknown tags
+        my $val;
+        if ($tagInfo and $$tagInfo{Format}) {
+            $val = ReadValue($dataPt, $pos, $$tagInfo{Format}, undef, $size);
+        } else {
+            $val = substr($$dataPt, $pos, $size);
+        }
+        unless ($tagInfo) {
+            my $name = ucfirst($tag);
+            $name =~ s/_(.)/\U$1/g;
+            if ($val =~ /^PKTS\0\0\0\x01/) {
+                # also unpack unknown directories
+                $tagInfo = {
+                    Name => $name,
+                    SubDirectory => { TagTable => 'Image::ExifTool::Leaf::Unknown' },
+                };
+            } elsif ($tagTablePtr ne \%Image::ExifTool::Leaf::Main or
+                     $exifTool->Options('Unknown'))
+            {
+                $tagInfo = {
+                    Name => $name,
+                    Writable => 0,
+                    PrintConv => 'length($val) > 60 ? substr($val,0,55) . "[...]" : $val',
+                };
+                # make tags in main table unknown because they tend to be binary
+                $$tagInfo{Unknown} = 1 if $tagTablePtr eq \%Image::ExifTool::Leaf::Main;
+            }
+            $tagInfo and Image::ExifTool::AddTagToTable($tagTablePtr, $tag, $tagInfo);
+        }
+        if ($verbose) {
+            $exifTool->VerboseInfo($tag, $tagInfo,
+                Table   => $tagTablePtr,
+                Value   => $val,
+                DataPt  => $dataPt,
+                DataPos => $$dirInfo{DataPos},
+                Size    => $size,
+                Start   => $pos,
+            );
+        }
+        if ($tagInfo) {
+            if ($$tagInfo{SubDirectory}) {
+                my %subdirInfo = (
+                    DataPt => $dataPt,
+                    DirLen => $size,
+                    DirStart => $pos,
+                    DataPos => $$dirInfo{DataPos},
+                    DirName => 'Leaf PKTS',
+                );
+                my $subTable = GetTagTable($tagInfo->{SubDirectory}->{TagTable});
+                $exifTool->ProcessDirectory(\%subdirInfo, $subTable);
+            } else {
+                $val =~ tr/\n/ /;   # translate newlines to spaces
+                $val =~ s/\0+$//;   # remove null terminators
+                $exifTool->FoundTag($tagInfo, $val);
+            }
+        }
+        $pos += $size;
+    }
+    $success or $exifTool->Warn('Bad format Leaf data');
+    return $success;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Leaf - Read Creo Leaf EXIF meta information
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to interpret
+meta information from Leaf digital camera backs written by Creo Leaf
+Capture.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/Leaf Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/M2TS.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/M2TS.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/M2TS.pm	(revision 24799)
@@ -0,0 +1,712 @@
+#------------------------------------------------------------------------------
+# File:         M2TS.pm
+#
+# Description:  Read M2TS (AVCHD) meta information
+#
+# Revisions:    2009/07/03 - P. Harvey Created
+#
+# References:   1) http://neuron2.net/library/mpeg2/iso13818-1.pdf
+#               2) http://www.blu-raydisc.com/Assets/Downloadablefile/BD-RE_Part3_V2.1_WhitePaper_080406-15271.pdf
+#               3) http://www.videohelp.com/forum/archive/reading-avchd-playlist-files-bdmv-playlist-mpl-t358888.html
+#               4) http://en.wikipedia.org/wiki/MPEG_transport_stream
+#               5) http://www.dunod.com/documents/9782100493463/49346_DVB.pdf
+#               6) http://trac.handbrake.fr/browser/trunk/libhb/stream.c
+#               7) http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=04560141
+#               8) http://www.w6rz.net/xport.zip
+#
+# Notes:        Variable names containing underlines are the same as in ref 1.
+#
+# Glossary:     PES = Packetized Elementary Stream
+#               PAT = Program Association Table
+#               PMT = Program Map Table
+#               PCR = Program Clock Reference
+#               PID = Packet Identifier
+#
+# To Do:        - parse PCR to obtain average bitrates?
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::M2TS;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.08';
+
+# program map table "stream_type" lookup (ref 6/1)
+my %streamType = (
+    0x00 => 'Reserved',
+    0x01 => 'MPEG-1 Video',
+    0x02 => 'MPEG-2 Video',
+    0x03 => 'MPEG-1 Audio',
+    0x04 => 'MPEG-2 Audio',
+    0x05 => 'ISO 13818-1 private sections',
+    0x06 => 'ISO 13818-1 PES private data',
+    0x07 => 'ISO 13522 MHEG',
+    0x08 => 'ISO 13818-1 DSM-CC',
+    0x09 => 'ISO 13818-1 auxiliary',
+    0x0A => 'ISO 13818-6 multi-protocol encap',
+    0x0B => 'ISO 13818-6 DSM-CC U-N msgs',
+    0x0C => 'ISO 13818-6 stream descriptors',
+    0x0D => 'ISO 13818-6 sections',
+    0x0E => 'ISO 13818-1 auxiliary',
+    0x0F => 'MPEG-2 AAC Audio',
+    0x10 => 'MPEG-4 Video',
+    0x11 => 'MPEG-4 LATM AAC Audio',
+    0x12 => 'MPEG-4 generic',
+    0x13 => 'ISO 14496-1 SL-packetized',
+    0x14 => 'ISO 13818-6 Synchronized Download Protocol',
+  # 0x15-0x7F => 'ISO 13818-1 Reserved',
+    0x1b => 'H.264 Video',
+    0x80 => 'DigiCipher II Video',
+    0x81 => 'A52/AC-3 Audio',
+    0x82 => 'HDMV DTS Audio',
+    0x83 => 'LPCM Audio',
+    0x84 => 'SDDS Audio',
+    0x85 => 'ATSC Program ID',
+    0x86 => 'DTS-HD Audio',
+    0x87 => 'E-AC-3 Audio',
+    0x8a => 'DTS Audio',
+    0x91 => 'A52b/AC-3 Audio',
+    0x92 => 'DVD_SPU vls Subtitle',
+    0x94 => 'SDDS Audio',
+    0xa0 => 'MSCODEC Video',
+    0xea => 'Private ES (VC-1)',
+  # 0x80-0xFF => 'User Private',
+);
+
+# "table_id" values (ref 5)
+my %tableID = (
+    0x00 => 'Program Association',
+    0x01 => 'Conditional Access',
+    0x02 => 'Program Map',
+    0x03 => 'Transport Stream Description',
+    0x40 => 'Actual Network Information',
+    0x41 => 'Other Network Information',
+    0x42 => 'Actual Service Description',
+    0x46 => 'Other Service Description',
+    0x4a => 'Bouquet Association',
+    0x4e => 'Actual Event Information - Present/Following',
+    0x4f => 'Other Event Information - Present/Following',
+    0x50 => 'Actual Event Information - Schedule', #(also 0x51-0x5f)
+    0x60 => 'Other Event Information - Schedule', # (also 0x61-0x6f)
+    0x70 => 'Time/Date',
+    0x71 => 'Running Status',
+    0x72 => 'Stuffing',
+    0x73 => 'Time Offset',
+    0x7e => 'Discontinuity Information',
+    0x7f => 'Selection Information',
+  # 0x80-0xfe => 'User Defined',
+);
+
+# PES stream ID's for which a syntax field does not exist
+my %noSyntax = (
+    0xbc => 1, # program_stream_map
+    0xbe => 1, # padding_stream
+    0xbf => 1, # private_stream_2
+    0xf0 => 1, # ECM_stream
+    0xf1 => 1, # EMM_stream
+    0xf2 => 1, # DSMCC_stream
+    0xf8 => 1, # ITU-T Rec. H.222.1 type E stream
+    0xff => 1, # program_stream_directory
+);
+
+# information extracted from the MPEG-2 transport stream
+%Image::ExifTool::M2TS::Main = (
+    GROUPS => { 2 => 'Video' },
+    VARS => { NO_ID => 1 },
+    NOTES => q{
+        The MPEG-2 transport stream is used as a container for many different
+        audio/video formats (including AVCHD).  This table lists information
+        extracted from M2TS files.
+    },
+    VideoStreamType => {
+        PrintHex => 1,
+        PrintConv => \%streamType,
+        SeparateTable => 'StreamType',
+    },
+    AudioStreamType => {
+        PrintHex => 1,
+        PrintConv => \%streamType,
+        SeparateTable => 'StreamType',
+    },
+    Duration => {
+        Notes => q{
+            the -fast option may be used to avoid scanning to the end of file to
+            calculate the Duration
+        },
+        ValueConv => '$val / 27000000', # (clock is 27MHz)
+        PrintConv => 'ConvertDuration($val)',
+    },
+    # the following tags are for documentation purposes only
+    _AC3  => { SubDirectory => { TagTable => 'Image::ExifTool::M2TS::AC3' } },
+    _H264 => { SubDirectory => { TagTable => 'Image::ExifTool::H264::Main' } },
+);
+
+# information extracted from AC-3 audio streams
+%Image::ExifTool::M2TS::AC3 = (
+    GROUPS => { 1 => 'AC3', 2 => 'Audio' },
+    VARS => { NO_ID => 1 },
+    NOTES => 'Tags extracted from AC-3 audio streams.',
+    AudioSampleRate => {
+        PrintConv => {
+            0 => '48000',
+            1 => '44100',
+            2 => '32000',
+        },
+    },
+    AudioBitrate => {
+        PrintConvColumns => 2,
+        ValueConv => {
+            0 => 32000,
+            1 => 40000,
+            2 => 48000,
+            3 => 56000,
+            4 => 64000,
+            5 => 80000,
+            6 => 96000,
+            7 => 112000,
+            8 => 128000,
+            9 => 160000,
+            10 => 192000,
+            11 => 224000,
+            12 => 256000,
+            13 => 320000,
+            14 => 384000,
+            15 => 448000,
+            16 => 512000,
+            17 => 576000,
+            18 => 640000,
+            32 => '32000 max',
+            33 => '40000 max',
+            34 => '48000 max',
+            35 => '56000 max',
+            36 => '64000 max',
+            37 => '80000 max',
+            38 => '96000 max',
+            39 => '112000 max',
+            40 => '128000 max',
+            41 => '160000 max',
+            42 => '192000 max',
+            43 => '224000 max',
+            44 => '256000 max',
+            45 => '320000 max',
+            46 => '384000 max',
+            47 => '448000 max',
+            48 => '512000 max',
+            49 => '576000 max',
+            50 => '640000 max',
+        },
+        PrintConv => 'ConvertBitrate($val)',
+    },
+    SurroundMode => {
+        PrintConv => {
+            0 => 'Not indicated',
+            1 => 'Not Dolby surround',
+            2 => 'Dolby surround',
+        },
+    },
+    AudioChannels => {
+        PrintConvColumns => 2,
+        PrintConv => {
+            0 => '1 + 1',
+            1 => 1,
+            2 => 2,
+            3 => 3,
+            4 => '2/1',
+            5 => '3/1',
+            6 => '2/2',
+            7 => '3/2',
+            8 => 1,
+            9 => '2 max',
+            10 => '3 max',
+            11 => '4 max',
+            12 => '5 max',
+            13 => '6 max',
+        },
+    },
+);
+
+#------------------------------------------------------------------------------
+# Extract information from AC-3 audio stream
+# Inputs: 0) ExifTool ref, 1) data ref
+# Reference: http://www.atsc.org/standards/a_52b.pdf
+sub ParseAC3Audio($$)
+{
+    my ($exifTool, $dataPt) = @_;
+    if ($$dataPt =~ /\x0b\x77..(.)/sg) {
+        my $sampleRate = ord($1) >> 6;
+        my $tagTablePtr = GetTagTable('Image::ExifTool::M2TS::AC3');
+        $exifTool->HandleTag($tagTablePtr, AudioSampleRate => $sampleRate);
+    }
+}
+
+#------------------------------------------------------------------------------
+# Extract information from AC-3 stream descriptor
+# Inputs: 0) ExifTool ref, 1) data ref
+# Reference: http://www.atsc.org/standards/a_52b.pdf
+# Note: This information is duplicated in the Audio stream, but it
+#       is somewhat easier to extract it from the descriptor instead
+sub ParseAC3Descriptor($$)
+{
+    my ($exifTool, $dataPt) = @_;
+    return if length $$dataPt < 3;
+    my @v = unpack('C3', $$dataPt);
+    my $tagTablePtr = GetTagTable('Image::ExifTool::M2TS::AC3');
+    # $exifTool->HandleTag($tagTablePtr, 'AudioSampleRate', $v[0] >> 5);
+    $exifTool->HandleTag($tagTablePtr, 'AudioBitrate', $v[1] >> 2);
+    $exifTool->HandleTag($tagTablePtr, 'SurroundMode', $v[1] & 0x03);
+    $exifTool->HandleTag($tagTablePtr, 'AudioChannels', ($v[2] >> 1) & 0x0f);
+    # don't (yet) decode any more (language codes, etc)
+}
+
+#------------------------------------------------------------------------------
+# Parse PID stream data
+# Inputs: 0) Exiftool ref, 1) PID number, 2) PID type, 3) PID name, 4) data ref
+# Returns: 0=stream parsed OK,
+#          1=stream parsed but we want to parse more of these,
+#          -1=can't parse yet because we don't know the type
+sub ParsePID($$$$$)
+{
+    my ($exifTool, $pid, $type, $pidName, $dataPt) = @_;
+    # can't parse until we know the type (Program Map Table may be later in the stream)
+    return -1 unless defined $type;   
+    my $verbose = $exifTool->Options('Verbose');
+    if ($verbose > 1) {
+        my $out = $exifTool->Options('TextOut');
+        printf $out "Parsing stream 0x%.4x (%s)\n", $pid, $pidName;
+        my %parms = ( Out => $out );
+        $parms{MaxLen} = 96 if $verbose < 4;
+        Image::ExifTool::HexDump($dataPt, undef, %parms) if $verbose > 2;
+    }
+    my $more = 0;
+    if ($type == 0x01 or $type == 0x02) {
+        # MPEG-1/MPEG-2 Video
+        require Image::ExifTool::MPEG;
+        Image::ExifTool::MPEG::ParseMPEGAudioVideo($exifTool, $dataPt);
+    } elsif ($type == 0x03 or $type == 0x04) {
+        # MPEG-1/MPEG-2 Audio
+        require Image::ExifTool::MPEG;
+        Image::ExifTool::MPEG::ParseMPEGAudio($exifTool, $dataPt);
+    } elsif ($type == 0x1b) {
+        # H.264 Video
+        require Image::ExifTool::H264;
+        $more = Image::ExifTool::H264::ParseH264Video($exifTool, $dataPt);
+        # force parsing additional H264 frames with ExtractEmbedded option
+        $more = 1 if $exifTool->Options('ExtractEmbedded');
+    } elsif ($type == 0x81 or $type == 0x87 or $type == 0x91) {
+        # AC-3 audio
+        ParseAC3Audio($exifTool, $dataPt);
+    }
+    return $more;
+}
+
+#------------------------------------------------------------------------------
+# Extract information from a M2TS file
+# Inputs: 0) ExifTool object reference, 1) DirInfo reference
+# Returns: 1 on success, 0 if this wasn't a valid M2TS file
+sub ProcessM2TS($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my ($buff, $plen, $i, $j, $fileType, $eof);
+    my (%pmt, %pidType, %didPID, %data, %sectLen);
+    my ($startTime, $endTime, $backScan, $maxBack);
+    my $verbose = $exifTool->Options('Verbose');
+    my $out = $exifTool->Options('TextOut');
+
+    # read first packet
+    return 0 unless $raf->Read($buff, 8) == 8;
+    # test for magic number (sync byte is the only thing we can safely check)
+    return 0 unless $buff =~ /^(....)?\x47/s;
+    unless ($1) {
+        $plen = 188;        # no timecode
+        $fileType = 'M2T';  # (just as a way to tell there is no timecode)
+    } else {
+        $plen = 192; # 188-byte transport packet + leading 4-byte timecode (ref 4)
+    }
+    $exifTool->SetFileType($fileType);
+    SetByteOrder('MM');
+    $raf->Seek(0,0);        # rewind to start
+    my $tagTablePtr = GetTagTable('Image::ExifTool::M2TS::Main');
+
+    # PID lookup strings (will add to this with entries from program map table)
+    my %pidName = (
+        0 => 'Program Association Table',
+        1 => 'Conditional Access Table',
+        2 => 'Transport Stream Description Table',
+        0x1fff => 'Null Packet',
+    );
+    my %needPID = ( 0x00 => 1 );    # lookup for stream PID's that we still need to parse
+
+    # parse packets from MPEG-2 Transport Stream
+    for ($i=0; ; ++$i) {
+
+        unless (%needPID) {
+            last unless defined $startTime;
+            # seek backwards to find last PCR
+            if (defined $backScan) {
+                last if defined $endTime;
+                $backScan -= $plen;
+                last if $backScan < $maxBack;
+            } else {
+                undef $endTime;
+                last if $exifTool->Options('FastScan');
+                $verbose and print "[Starting backscan for last PCR]\n";
+                # calculate position of last complete packet
+                my $fwdPos = $raf->Tell();
+                $raf->Seek(0, 2) or last;
+                my $fsize = $raf->Tell();
+                my $nPack = int($fsize / $plen);
+                $backScan = ($nPack - 1) * $plen - $fsize;
+                # set limit on how far back we will go
+                $maxBack = $fwdPos - $fsize;
+                $maxBack = -256000 if $maxBack < -256000;
+            }
+            $raf->Seek($backScan, 2) or last;
+        }
+        # read the next packet
+        $raf->Read($buff, $plen) == $plen or $eof = 1, last;
+        # decode the packet prefix
+        my $pos = length($buff) - 188;
+        my $prefix = Get32u(\$buff, $pos);
+        $pos += 4;
+        # validate sync byte
+        unless (($prefix & 0xff000000) >> 24 == 0x47) {
+            $exifTool->Warn('Synchronization error') unless defined $backScan;
+            last;
+        }
+      # my $transport_error_indicator    = $prefix & 0x00800000;
+        my $payload_unit_start_indicator = $prefix & 0x00400000;
+      # my $transport_priority           = $prefix & 0x00200000;
+        my $pid                          =($prefix & 0x001fff00) >> 8; # packet ID
+      # my $transport_scrambling_control = $prefix & 0x000000c0;
+        my $adaptation_field_exists      = $prefix & 0x00000020;
+        my $payload_data_exists          = $prefix & 0x00000010;
+      # my $continuity_counter           = $prefix & 0x0000000f;
+
+        if ($verbose > 1) {
+            print  $out "Transport packet $i:\n";
+            Image::ExifTool::HexDump(\$buff, undef, Addr => $i * $plen, Out => $out) if $verbose > 2;
+            my $str = $pidName{$pid} ? " ($pidName{$pid})" : '';
+            printf $out "  Timecode:   0x%.4x\n", Get32u(\$buff, 0) if $plen == 192;
+            printf $out "  Packet ID:  0x%.4x$str\n", $pid;
+            printf $out "  Start Flag: %s\n", $payload_unit_start_indicator ? 'Yes' : 'No';
+        }
+
+        # handle adaptation field
+        if ($adaptation_field_exists) {
+            my $len = Get8u(\$buff, $pos++);
+            $pos + $len > $plen and $exifTool->Warn('Invalid adaptation field length'), last;
+            # read PCR value for calculation of Duration
+            if ($len > 6) {
+                my $flags = Get8u(\$buff, $pos);
+                if ($flags & 0x10) { # PCR_flag
+                    # combine 33-bit program_clock_reference_base and 9-bit extension
+                    my $pcrBase = Get32u(\$buff, $pos + 1);
+                    my $pcrExt  = Get16u(\$buff, $pos + 5);
+                    # ignore separate programs (PID's) and store just the
+                    # first and last timestamps found in the file (is this OK?)
+                    $endTime = 300 * (2 * $pcrBase + ($pcrExt >> 15)) + ($pcrExt & 0x01ff);
+                    $startTime = $endTime unless defined $startTime;
+                }
+            }
+            $pos += $len;
+        }
+
+        # all done with this packet unless it carries a payload
+        # or if we are just looking for the last timestamp
+        next unless $payload_data_exists and not defined $backScan;
+
+        # decode payload data
+        if ($pid == 0 or            # program association table
+            defined $pmt{$pid})     # program map table(s)
+        {
+            # must interpret pointer field if payload_unit_start_indicator is set
+            if ($payload_unit_start_indicator) {
+                # skip to start of section
+                my $pointer_field = Get8u(\$buff, $pos);
+                $pos += 1 + $pointer_field;
+                $pos >= $plen and $exifTool->Warn('Bad pointer field'), last;
+            } else {
+                # not the start of a section
+                next unless $sectLen{$pid};
+                my $more = $sectLen{$pid} - length($data{$pid});
+                my $size = length($buff) - $pos;
+                $size = $more if $size > $more;
+                $data{$pid} .= substr($buff, $pos, $size);
+                next unless $size == $more;
+                # we have the complete section now, so put back into $buff for parsing
+                $buff = $data{$pid};
+                $pos = 0;
+                delete $data{$pid};
+                delete $sectLen{$pid};
+            }
+            my $slen = length($buff);   # section length
+            $pos + 8 > $slen and $exifTool->Warn("Truncated payload"), last;
+            # validate table ID
+            my $table_id = Get8u(\$buff, $pos);
+            my $name = ($tableID{$table_id} || sprintf('Unknown (0x%x)',$table_id)) . ' Table';
+            my $expectedID = $pid ? 0x02 : 0x00;
+            unless ($table_id == $expectedID) {
+                $verbose > 1 and printf $out "  (skipping $name)\n";
+                delete $needPID{$pid};
+                $didPID{$pid} = 1;
+                next;
+            }
+            # validate section syntax indicator for parsed tables (PAT, PMT)
+            my $section_syntax_indicator = Get8u(\$buff, $pos + 1) & 0xc0;
+            $section_syntax_indicator == 0x80 or $exifTool->Warn("Bad $name"), last;
+            my $section_length = Get16u(\$buff, $pos + 1) & 0x0fff;
+            $section_length > 1021 and $exifTool->Warn("Invalid $name length"), last;
+            if ($slen < $section_length + 3) { # (3 bytes for table_id + section_length)
+                # must wait until we have the full section
+                $data{$pid} = substr($buff, $pos);
+                $sectLen{$pid} = $section_length + 3;
+                next;
+            }
+            my $program_number = Get16u(\$buff, $pos + 3);
+            my $section_number = Get8u(\$buff, $pos + 6);
+            my $last_section_number = Get8u(\$buff, $pos + 7);
+            if ($verbose > 1) {
+                print  $out "  $name length: $section_length\n";
+                print  $out "  Program No: $program_number\n" if $pid;
+                printf $out "  Stream ID:  0x%x\n", $program_number if not $pid;
+                print  $out "  Section No: $section_number\n";
+                print  $out "  Last Sect.: $last_section_number\n";
+            }
+            my $end = $pos + $section_length + 3 - 4; # (don't read 4-byte CRC)
+            $pos += 8;
+            if ($pid == 0) {
+                # decode PAT (Program Association Table)
+                while ($pos <= $end - 4) {
+                    my $program_number = Get16u(\$buff, $pos);
+                    my $program_map_PID = Get16u(\$buff, $pos + 2) & 0x1fff;
+                    $pmt{$program_map_PID} = $program_number; # save our PMT PID's
+                    if (not $pidName{$program_map_PID} or $verbose > 1) {
+                        my $str = "Program $program_number Map";
+                        $pidName{$program_map_PID} = $str;
+                        $needPID{$program_map_PID} = 1 unless $didPID{$program_map_PID};
+                        $verbose and printf $out "  PID(0x%.4x) --> $str\n", $program_map_PID;
+                    }
+                    $pos += 4;
+                }
+            } else {
+                # decode PMT (Program Map Table)
+                $pos + 4 > $slen and $exifTool->Warn('Truncated PMT'), last;
+                my $pcr_pid = Get16u(\$buff, $pos) & 0x1fff;
+                my $program_info_length = Get16u(\$buff, $pos + 2) & 0x0fff;
+                if (not $pidName{$pcr_pid} or $verbose > 1) {
+                    my $str = "Program $program_number Clock Reference";
+                    $pidName{$pcr_pid} = $str;
+                    $verbose and printf $out "  PID(0x%.4x) --> $str\n", $pcr_pid;
+                }
+                $pos += 4;
+                $pos + $program_info_length > $slen and $exifTool->Warn('Truncated program info'), last;
+                # dump program information descriptors if verbose
+                if ($verbose > 1) { for ($j=0; $j<$program_info_length-2; ) {
+                    my $descriptor_tag = Get8u(\$buff, $pos + $j);
+                    my $descriptor_length = Get8u(\$buff, $pos + $j + 1);
+                    $j += 2;
+                    last if $j + $descriptor_length > $program_info_length;
+                    my $desc = substr($buff, $pos+$j, $descriptor_length);
+                    $j += $descriptor_length;
+                    $desc =~ s/([\x00-\x1f\x80-\xff])/sprintf("\\x%.2x",ord $1)/eg;
+                    printf $out "    Program Descriptor: Type=0x%.2x \"$desc\"\n", $descriptor_tag;
+                }}
+                $pos += $program_info_length; # skip descriptors (for now)
+                while ($pos <= $end - 5) {
+                    my $stream_type = Get8u(\$buff, $pos);
+                    my $elementary_pid = Get16u(\$buff, $pos + 1) & 0x1fff;
+                    my $es_info_length = Get16u(\$buff, $pos + 3) & 0x0fff;
+                    if (not $pidName{$elementary_pid} or $verbose > 1) {
+                        my $str = $streamType{$stream_type};
+                        $str or $str = ($stream_type < 0x7f ? 'Reserved' : 'Private');
+                        $str = sprintf('%s (0x%.2x)', $str, $stream_type);
+                        $str = "Program $program_number $str";
+                        # save PID type and name string
+                        $pidName{$elementary_pid} = $str;
+                        $pidType{$elementary_pid} = $stream_type;
+                        $verbose and printf $out "  PID(0x%.4x) --> $str\n", $elementary_pid;
+                        if ($str =~ /(Audio|Video)/) {
+                            $exifTool->HandleTag($tagTablePtr, $1 . 'StreamType', $stream_type);
+                            # we want to parse all Audio and Video streams
+                            $needPID{$elementary_pid} = 1 unless $didPID{$elementary_pid};
+                        }
+                    }
+                    $pos += 5;
+                    $pos + $es_info_length > $slen and $exifTool->Warn('Trunacted ES info'), $pos = $end, last;
+                    # parse elementary stream descriptors
+                    for ($j=0; $j<$es_info_length-2; ) {
+                        my $descriptor_tag = Get8u(\$buff, $pos + $j);
+                        my $descriptor_length = Get8u(\$buff, $pos + $j + 1);
+                        $j += 2;
+                        last if $j + $descriptor_length > $es_info_length;
+                        my $desc = substr($buff, $pos+$j, $descriptor_length);
+                        $j += $descriptor_length;
+                        if ($verbose > 1) {
+                            my $dstr = $desc;
+                            $dstr =~ s/([\x00-\x1f\x80-\xff])/sprintf("\\x%.2x",ord $1)/eg;
+                            printf $out "    ES Descriptor: Type=0x%.2x \"$dstr\"\n", $descriptor_tag;
+                        }
+                        # parse type-specific descriptor information (once)
+                        unless ($didPID{$pid}) {
+                            if ($descriptor_tag == 0x81) {  # AC-3
+                                ParseAC3Descriptor($exifTool, \$desc);
+                            }
+                        }
+                    }
+                    $pos += $es_info_length;
+                }
+            }
+            $pos = $end + 4; # skip CRC
+        } elsif ($pid == 1) {       # conditional access table
+        } elsif ($pid == 2) {       # transport stream description table
+        } elsif ($pid == 0x1fff) {  # null packet
+        } elsif (not $didPID{$pid}) {
+            # save data from the start of each elementary stream
+            if ($payload_unit_start_indicator) {
+                if (defined $data{$pid}) {
+                    # we must have a whole section, so parse now
+                    my $more = ParsePID($exifTool, $pid, $pidType{$pid}, $pidName{$pid}, \$data{$pid});
+                    # start fresh even if we couldn't process this PID yet
+                    delete $data{$pid};
+                    unless ($more) {
+                        delete $needPID{$pid};
+                        $didPID{$pid} = 1;
+                        next;
+                    }
+                    # set flag indicating we found this PID but we still want more
+                    $needPID{$pid} = -1;
+                }
+                # check for a PES header
+                next if $pos + 6 > $plen;
+                my $start_code = Get32u(\$buff, $pos);
+                next unless ($start_code & 0xffffff00) == 0x00000100;
+                my $stream_id = $start_code & 0xff;
+                if ($verbose > 1) {
+                    my $pes_packet_length = Get16u(\$buff, $pos + 4);
+                    printf $out "  Stream ID:  0x%.2x\n", $stream_id;
+                    print  $out "  Packet Len: $pes_packet_length\n";
+                }
+                $pos += 6;
+                unless ($noSyntax{$stream_id}) {
+                    next if $pos + 3 > $plen;
+                    # validate PES syntax
+                    my $syntax = Get8u(\$buff, $pos) & 0xc0;
+                    $syntax == 0x80 or $exifTool->Warn('Bad PES syntax'), next;
+                    # skip PES header
+                    my $pes_header_data_length = Get8u(\$buff, $pos + 2);
+                    $pos += 3 + $pes_header_data_length;
+                    next if $pos >= $plen;
+                }
+                $data{$pid} = substr($buff, $pos);
+            } else {
+                next unless defined $data{$pid};
+                # accumulate data for each elementary stream
+                $data{$pid} .= substr($buff, $pos);
+            }
+            # save only the first 256 bytes of most streams, except for
+            # unknown or H.264 streams where we save 1 kB
+            my $saveLen = (not $pidType{$pid} or $pidType{$pid} == 0x1b) ? 1024 : 256;
+            if (length($data{$pid}) >= $saveLen) {
+                my $more = ParsePID($exifTool, $pid, $pidType{$pid}, $pidName{$pid}, \$data{$pid});
+                next if $more < 0;  # wait for program map table (hopefully not too long)
+                delete $data{$pid};
+                $more and $needPID{$pid} = -1, next; # parse more of these
+                delete $needPID{$pid};
+                $didPID{$pid} = 1;
+            }
+            next;
+        }
+        if ($needPID{$pid}) {
+            # we found and parsed a section with this PID, so
+            # delete from the lookup of PID's we still need to parse
+            delete $needPID{$pid};
+            $didPID{$pid} = 1;
+        }
+    }
+
+    # calculate Duration if available
+    if (defined $startTime and defined $endTime and $startTime != $endTime) {
+        $endTime += 0x80000000 * 1200 if $startTime > $endTime; # handle 33-bit wrap
+        $exifTool->HandleTag($tagTablePtr, 'Duration', $endTime - $startTime);
+    }
+
+    if ($verbose) {
+        my @need;
+        foreach (keys %needPID) {
+            push @need, sprintf('0x%.2x',$_) if $needPID{$_} > 0;
+        }
+        if (@need) {
+            @need = sort @need;
+            print $out "End of file.  Missing PID(s): @need\n";
+        } else {
+            my $what = $eof ? 'of file' : 'scan';
+            print $out "End $what.  All PID's parsed.\n";
+        }
+    }
+
+    # parse any remaining partial PID streams
+    my $pid;
+    foreach $pid (sort keys %data) {
+        ParsePID($exifTool, $pid, $pidType{$pid}, $pidName{$pid}, \$data{$pid});
+        delete $data{$pid};
+    }
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::M2TS - Read M2TS (AVCHD) meta information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains routines required by Image::ExifTool to extract
+information from MPEG-2 transport streams, such as those used by AVCHD
+video.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://neuron2.net/library/mpeg2/iso13818-1.pdf>
+
+=item L<http://www.blu-raydisc.com/Assets/Downloadablefile/BD-RE_Part3_V2.1_WhitePaper_080406-15271.pdf>
+
+=item L<http://www.videohelp.com/forum/archive/reading-avchd-playlist-files-bdmv-playlist-mpl-t358888.html>
+
+=item L<http://en.wikipedia.org/wiki/MPEG_transport_stream>
+
+=item L<http://www.dunod.com/documents/9782100493463/49346_DVB.pdf>
+
+=item L<http://trac.handbrake.fr/browser/trunk/libhb/stream.c>
+
+=item L<http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=04560141>
+
+=item L<http://www.w6rz.net/xport.zip>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/M2TS Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/MIE.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/MIE.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/MIE.pm	(revision 24799)
@@ -0,0 +1,2549 @@
+#------------------------------------------------------------------------------
+# File:         MIE.pm
+#
+# Description:  Read/write MIE meta information
+#
+# Revisions:    11/18/2005 - P. Harvey Created
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::MIE;
+
+use strict;
+use vars qw($VERSION %tableDefaults);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::Exif;
+use Image::ExifTool::GPS;
+
+$VERSION = '1.34';
+
+sub ProcessMIE($$);
+sub ProcessMIEGroup($$$);
+sub WriteMIEGroup($$$);
+sub CheckMIE($$$);
+sub GetLangInfo($$);
+
+# local variables
+my $hasZlib;        # 1=Zlib available, 0=no Zlib
+my %mieCode;        # reverse lookup for MIE format names
+my $doneMieMap;     # flag indicating we added user-defined groups to %mieMap
+
+# MIE format codes
+my %mieFormat = (
+    0x00 => 'undef',
+    0x10 => 'MIE',
+    0x18 => 'MIE',
+    0x20 => 'string', # ASCII (ISO 8859-1)
+    0x28 => 'utf8',
+    0x29 => 'utf16',
+    0x2a => 'utf32',
+    0x30 => 'string_list',
+    0x38 => 'utf8_list',
+    0x39 => 'utf16_list',
+    0x3a => 'utf32_list',
+    0x40 => 'int8u',
+    0x41 => 'int16u',
+    0x42 => 'int32u',
+    0x43 => 'int64u',
+    0x48 => 'int8s',
+    0x49 => 'int16s',
+    0x4a => 'int32s',
+    0x4b => 'int64s',
+    0x52 => 'rational32u',
+    0x53 => 'rational64u',
+    0x5a => 'rational32s',
+    0x5b => 'rational64s',
+    0x61 => 'fixed16u',
+    0x62 => 'fixed32u',
+    0x69 => 'fixed16s',
+    0x6a => 'fixed32s',
+    0x72 => 'float',
+    0x73 => 'double',
+    0x80 => 'free',
+);
+
+# map of MIE directory locations
+my %mieMap = (
+   'MIE-Meta'       => 'MIE',
+   'MIE-Audio'      => 'MIE-Meta',
+   'MIE-Camera'     => 'MIE-Meta',
+   'MIE-Doc'        => 'MIE-Meta',
+   'MIE-Geo'        => 'MIE-Meta',
+   'MIE-Image'      => 'MIE-Meta',
+   'MIE-MakerNotes' => 'MIE-Meta',
+   'MIE-Preview'    => 'MIE-Meta',
+   'MIE-Thumbnail'  => 'MIE-Meta',
+   'MIE-Video'      => 'MIE-Meta',
+   'MIE-Flash'      => 'MIE-Camera',
+   'MIE-Lens'       => 'MIE-Camera',
+   'MIE-Orient'     => 'MIE-Camera',
+   'MIE-Extender'   => 'MIE-Lens',
+   'MIE-GPS'        => 'MIE-Geo',
+   'MIE-UTM'        => 'MIE-Geo',
+   'MIE-Canon'      => 'MIE-MakerNotes',
+    EXIF            => 'MIE-Meta',
+    XMP             => 'MIE-Meta',
+    IPTC            => 'MIE-Meta',
+    ICC_Profile     => 'MIE-Meta',
+    ID3             => 'MIE-Meta',
+    CanonVRD        => 'MIE-Canon',
+    IFD0            => 'EXIF',
+    IFD1            => 'IFD0',
+    ExifIFD         => 'IFD0',
+    GPS             => 'IFD0',
+    SubIFD          => 'IFD0',
+    GlobParamIFD    => 'IFD0',
+    PrintIM         => 'IFD0',
+    InteropIFD      => 'ExifIFD',
+    MakerNotes      => 'ExifIFD',
+);
+
+# convenience variables for common tagInfo entries
+my %binaryConv = (
+    Writable => 'undef',
+    Binary => 1,
+);
+my %dateInfo = (
+    Shift => 'Time',
+    PrintConv => '$self->ConvertDateTime($val)',
+    PrintConvInv => '$self->InverseDateTime($val)',
+);
+my %noYes = ( 0 => 'No', 1 => 'Yes' );
+my %offOn = ( 0 => 'Off', 1 => 'On' );
+
+# default entries for MIE tag tables
+%tableDefaults = (
+    PROCESS_PROC => \&ProcessMIE,
+    WRITE_PROC   => \&ProcessMIE,
+    CHECK_PROC   => \&CheckMIE,
+    LANG_INFO    => \&GetLangInfo,
+    WRITABLE     => 'string',
+    PREFERRED    => 1,
+);
+
+# MIE info
+%Image::ExifTool::MIE::Main = (
+    %tableDefaults,
+    GROUPS => { 1 => 'MIE-Main' },
+    WRITE_GROUP => 'MIE-Main',
+    NOTES => q{
+        MIE is a flexible format which may be used as a stand-alone meta information
+        format, for encapsulation of other files and information, or as a trailer
+        appended to other file formats.  The tables below represent currently
+        defined MIE tags, however ExifTool will also extract any other information
+        present in a MIE file.
+
+        When writing MIE information, some special features are supported:
+
+        1) String values may be written as ASCII (ISO 8859-1) or UTF-8.  ExifTool
+        automatically detects the presence of wide characters and treats the string
+        appropriately. Internally, UTF-8 text may be converted to UTF-16 or UTF-32
+        and stored in this format in the file if it is more compact.
+
+        2) All MIE string-value tags support localized text.  Localized values are
+        written by adding a language/country code to the tag name in the form
+        C<TAG-xx_YY>, where C<TAG> is the tag name, C<xx> is a 2-character lower
+        case ISO 639-1 language code, and C<YY> is a 2-character upper case ISO
+        3166-1 alpha 2 country code (ie. C<Title-en_US>).  But as usual, the user
+        interface is case-insensitive, and ExifTool will write the correct case to
+        the file.
+
+        3) Some numerical MIE tags allow units of measurement to be specified.  For
+        these tags, units may be added in brackets immediately following the value
+        (ie. C<55(mi/h)>).  If no units are specified, the default units are
+        written.
+    },
+   '0Type' => {
+        Name => 'SubfileType',
+        Notes => q{
+            the capitalized common extension for this type of file.  If the extension
+            has a dot-3 abbreviation, then the longer version is used here. For
+            instance, JPEG and TIFF are used, not JPG and TIF
+        },
+    },
+   '0Vers' => {
+        Name => 'MIEVersion',
+        Notes => 'version 1.1 is assumed if not specified',
+    },
+   '1Directory' => {
+        Name => 'SubfileDirectory',
+        Notes => 'original directory for the file',
+    },
+   '1Name'      => {
+        Name => 'SubfileName',
+        Notes => 'the file name, including extension if it exists',
+    },
+   '2MIME'      => { Name => 'SubfileMIMEType' },
+    Meta => {
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::MIE::Meta',
+            DirName => 'MIE-Meta',
+        },
+    },
+    data => {
+        Name => 'SubfileData',
+        Notes => 'the subfile data',
+        %binaryConv,
+    },
+    rsrc => {
+        Name => 'SubfileResource',
+        Notes => 'subfile resource fork if it exists',
+        %binaryConv,
+    },
+    zmd5 => {
+        Name => 'MD5Digest',
+        Notes => q{
+            16-byte MD5 digest written in binary form or as a 32-character hex-encoded
+            ASCII string. Value is an MD5 digest of the entire 0MIE group as it would be
+            with the digest value itself set to all null bytes
+        },
+    },
+    zmie => {
+        Name => 'TrailerSignature',
+        Writable => 'undef',
+        Notes => q{
+            used as the last element in the main "0MIE" group to identify a MIE trailer
+            when appended to another type of file.  ExifTool will create this tag if set
+            to any value, but always with an empty data block
+        },
+        ValueConvInv => '""',   # data block must be empty
+    },
+);
+
+# MIE meta information group
+%Image::ExifTool::MIE::Meta = (
+    %tableDefaults,
+    GROUPS => { 1 => 'MIE-Meta', 2 => 'Image' },
+    WRITE_GROUP => 'MIE-Meta',
+    Audio => {
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::MIE::Audio',
+            DirName => 'MIE-Audio',
+        },
+    },
+    Camera => {
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::MIE::Camera',
+            DirName => 'MIE-Camera',
+        },
+    },
+    Document => {
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::MIE::Doc',
+            DirName => 'MIE-Doc',
+        },
+    },
+    EXIF => {
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Exif::Main',
+            ProcessProc => \&Image::ExifTool::ProcessTIFF,
+            WriteProc => \&Image::ExifTool::WriteTIFF,
+        },
+    },
+    Geo => {
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::MIE::Geo',
+            DirName => 'MIE-Geo',
+        },
+    },
+    ICCProfile  => {
+        Name => 'ICC_Profile',
+        SubDirectory => { TagTable => 'Image::ExifTool::ICC_Profile::Main' },
+    },
+    ID3  => { SubDirectory => { TagTable => 'Image::ExifTool::ID3::Main' } },
+    IPTC => { SubDirectory => { TagTable => 'Image::ExifTool::IPTC::Main' } },
+    Image => {
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::MIE::Image',
+            DirName => 'MIE-Image',
+        },
+    },
+    MakerNotes => {
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::MIE::MakerNotes',
+            DirName => 'MIE-MakerNotes',
+        },
+    },
+    Preview => {
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::MIE::Preview',
+            DirName => 'MIE-Preview',
+        },
+    },
+    Thumbnail => {
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::MIE::Thumbnail',
+            DirName => 'MIE-Thumbnail',
+        },
+    },
+    Video => {
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::MIE::Video',
+            DirName => 'MIE-Video',
+        },
+    },
+    XMP => { SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' } },
+);
+
+# MIE document information
+%Image::ExifTool::MIE::Doc = (
+    %tableDefaults,
+    GROUPS => { 1 => 'MIE-Doc', 2 => 'Document' },
+    WRITE_GROUP => 'MIE-Doc',
+    NOTES => 'Information describing the main document, image or file.',
+    Author      => { Groups => { 2 => 'Author' } },
+    Comment     => { },
+    Contributors=> { Groups => { 2 => 'Author' }, List => 1 },
+    Copyright   => { Groups => { 2 => 'Author' } },
+    CreateDate  => { Groups => { 2 => 'Time' }, %dateInfo },
+    EMail       => { Groups => { 2 => 'Author' } },
+    Keywords    => { List => 1 },
+    ModifyDate  => { Groups => { 2 => 'Time' }, %dateInfo },
+    OriginalDate=> {
+        Name => 'DateTimeOriginal',
+        Description => 'Date/Time Original',
+        Groups => { 2 => 'Time' },
+        %dateInfo,
+    },
+    Phone       => { Name => 'PhoneNumber', Groups => { 2 => 'Author' } },
+    References  => { List => 1 },
+    Software    => { },
+    Title       => { },
+    URL         => { },
+);
+
+# MIE geographic information
+%Image::ExifTool::MIE::Geo = (
+    %tableDefaults,
+    GROUPS => { 1 => 'MIE-Geo', 2 => 'Location' },
+    WRITE_GROUP => 'MIE-Geo',
+    NOTES => 'Information related to geographic location.',
+    Address     => { },
+    City        => { },
+    Country     => { },
+    GPS => {
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::MIE::GPS',
+            DirName => 'MIE-GPS',
+        },
+    },
+    PostalCode  => { },
+    State       => { Notes => 'state or province' },
+    UTM => {
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::MIE::UTM',
+            DirName => 'MIE-UTM',
+        },
+    },
+);
+
+# MIE GPS information
+%Image::ExifTool::MIE::GPS = (
+    %tableDefaults,
+    GROUPS => { 1 => 'MIE-GPS', 2 => 'Location' },
+    WRITE_GROUP => 'MIE-GPS',
+    Altitude   => {
+        Name => 'GPSAltitude',
+        Writable => 'rational64s',
+        Units => [ qw(m ft) ],
+        Notes => q{'m' above sea level unless 'ft' specified},
+    },
+    Bearing => {
+        Name => 'GPSDestBearing',
+        Writable => 'rational64s',
+        Units => [ qw(deg deg{mag}) ],
+        Notes => q{'deg' CW from true north unless 'deg{mag}' specified},
+    },
+    Datum   => { Name => 'GPSMapDatum', Notes => 'WGS-84 assumed if not specified' },
+    Differential => {
+        Name => 'GPSDifferential',
+        Writable => 'int8u',
+        PrintConv => {
+            0 => 'No Correction',
+            1 => 'Differential Corrected',
+        },
+    },
+    Distance => {
+        Name => 'GPSDestDistance',
+        Writable => 'rational64s',
+        Units => [ qw(km mi nmi) ],
+        Notes => q{'km' unless 'mi' or 'nmi' specified},
+    },
+    Heading  => {
+        Name => 'GPSTrack',
+        Writable => 'rational64s',
+        Units => [ qw(deg deg{mag}) ],
+        Notes => q{'deg' CW from true north unless 'deg{mag}' specified},
+    },
+    Latitude => {
+        Name => 'GPSLatitude',
+        Writable => 'rational64s',
+        Count => -1,
+        Notes => q{
+            1 to 3 numbers: degrees, minutes then seconds.  South latitudes are stored
+            as all negative numbers, but may be entered as positive numbers with a
+            trailing 'S' for convenience.  For example, these are all equivalent: "-40
+            -30", "-40.5", "40 30 0.00 S"
+        },
+        ValueConv    => 'Image::ExifTool::GPS::ToDegrees($val, 1)',
+        ValueConvInv => 'Image::ExifTool::GPS::ToDMS($self, $val, 0)',
+        PrintConv    => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")',
+        PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1)',
+    },
+    Longitude => {
+        Name => 'GPSLongitude',
+        Writable => 'rational64s',
+        Count => -1,
+        Notes => q{
+            1 to 3 numbers: degrees, minutes then seconds.  West longitudes are
+            negative, but may be entered as positive numbers with a trailing 'W'
+        },
+        ValueConv    => 'Image::ExifTool::GPS::ToDegrees($val, 1)',
+        ValueConvInv => 'Image::ExifTool::GPS::ToDMS($self, $val, 0)',
+        PrintConv    => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
+        PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1)',
+    },
+    MeasureMode => {
+        Name => 'GPSMeasureMode',
+        Writable => 'int8u',
+        PrintConv => { 2 => '2-D', 3 => '3-D' },
+    },
+    Satellites => 'GPSSatellites',
+    Speed => {
+        Name => 'GPSSpeed',
+        Writable => 'rational64s',
+        Units => [ qw(km/h mi/h m/s kn) ],
+        Notes => q{'km/h' unless 'mi/h', 'm/s' or 'kn' specified},
+    },
+    DateTime => { Name => 'GPSDateTime', Groups => { 2 => 'Time' }, %dateInfo },
+);
+
+# MIE UTM information
+%Image::ExifTool::MIE::UTM = (
+    %tableDefaults,
+    GROUPS => { 1 => 'MIE-UTM', 2 => 'Location' },
+    WRITE_GROUP => 'MIE-UTM',
+    Datum    => { Name => 'UTMMapDatum', Notes => 'WGS-84 assumed if not specified' },
+    Easting  => { Name => 'UTMEasting' },
+    Northing => { Name => 'UTMNorthing' },
+    Zone     => { Name => 'UTMZone', Writable => 'int8s' },
+);
+
+# MIE image information
+%Image::ExifTool::MIE::Image = (
+    %tableDefaults,
+    GROUPS => { 1 => 'MIE-Image', 2 => 'Image' },
+    WRITE_GROUP => 'MIE-Image',
+   '0Type'          => { Name => 'FullSizeImageType', Notes => 'JPEG if not specified' },
+   '1Name'          => { Name => 'FullSizeImageName' },
+    BitDepth        => { Name => 'BitDepth', Writable => 'int16u' },
+    ColorSpace      => { Notes => 'standard ColorSpace values are "sRGB" and "Adobe RGB"' },
+    Components      => {
+        Name => 'ComponentsConfiguration',
+        Notes => 'string composed of R, G, B, Y, Cb and Cr',
+    },
+    Compression     => { Name => 'CompressionRatio', Writable => 'rational32u' },
+    ImageSize       => {
+        Writable => 'int16u',
+        Count => -1,
+        Notes => '2 or 3 values, for number of XY or XYZ pixels',
+        PrintConv => '$val=~tr/ /x/;$val',
+        PrintConvInv => '$val=~tr/x/ /;$val',
+    },
+    Resolution      => {
+        Writable => 'rational64u',
+        Units => [ qw(/in /cm /deg /arcmin /arcsec), '' ],
+        Count => -1,
+        Notes => q{
+            1 to 3 values.  A single value for equal resolution in all directions, or
+            separate X, Y and Z values if necessary.  Units are '/in' unless '/cm',
+            '/deg', '/arcmin', '/arcsec' or '' specified
+        },
+        PrintConv => '$val=~tr/ /x/;$val',
+        PrintConvInv => '$val=~tr/x/ /;$val',
+    },
+    data => {
+        Name => 'FullSizeImage',
+        %binaryConv,
+        RawConv => '$self->ValidateImage(\$val,$tag)',
+    },
+);
+
+# MIE preview image
+%Image::ExifTool::MIE::Preview = (
+    %tableDefaults,
+    GROUPS => { 1 => 'MIE-Preview', 2 => 'Image' },
+    WRITE_GROUP => 'MIE-Preview',
+   '0Type'  => { Name => 'PreviewImageType', Notes => 'JPEG if not specified' },
+   '1Name'  => { Name => 'PreviewImageName' },
+    ImageSize => {
+        Name => 'PreviewImageSize',
+        Writable => 'int16u',
+        Count => -1,
+        Notes => '2 or 3 values, for number of XY or XYZ pixels',
+        PrintConv => '$val=~tr/ /x/;$val',
+        PrintConvInv => '$val=~tr/x/ /;$val',
+    },
+    data => {
+        Name => 'PreviewImage',
+        %binaryConv,
+        RawConv => '$self->ValidateImage(\$val,$tag)',
+    },
+);
+
+# MIE thumbnail image
+%Image::ExifTool::MIE::Thumbnail = (
+    %tableDefaults,
+    GROUPS => { 1 => 'MIE-Thumbnail', 2 => 'Image' },
+    WRITE_GROUP => 'MIE-Thumbnail',
+   '0Type'  => { Name => 'ThumbnailImageType', Notes => 'JPEG if not specified' },
+   '1Name'  => { Name => 'ThumbnailImageName' },
+    ImageSize => {
+        Name => 'ThumbnailImageSize',
+        Writable => 'int16u',
+        Count => -1,
+        Notes => '2 or 3 values, for number of XY or XYZ pixels',
+        PrintConv => '$val=~tr/ /x/;$val',
+        PrintConvInv => '$val=~tr/x/ /;$val',
+    },
+    data => {
+        Name => 'ThumbnailImage',
+        %binaryConv,
+        RawConv => '$self->ValidateImage(\$val,$tag)',
+    },
+);
+
+# MIE audio information
+%Image::ExifTool::MIE::Audio = (
+    %tableDefaults,
+    GROUPS => { 1 => 'MIE-Audio', 2 => 'Audio' },
+    WRITE_GROUP => 'MIE-Audio',
+    NOTES => q{
+        For the Audio group (and any other group containing a 'data' element), tags
+        refer to the contained data if present, otherwise they refer to the main
+        SubfileData.  The C<0Type> and C<1Name> elements should exist only if C<data>
+        is present.
+    },
+   '0Type'      => { Name => 'RelatedAudioFileType', Notes => 'MP3 if not specified' },
+   '1Name'      => { Name => 'RelatedAudioFileName' },
+    SampleBits  => { Writable => 'int16u' },
+    Channels    => { Writable => 'int8u' },
+    Compression => { Name => 'AudioCompression' },
+    Duration    => { Writable => 'rational64u', PrintConv => 'ConvertDuration($val)' },
+    SampleRate  => { Writable => 'int32u' },
+    data        => { Name => 'RelatedAudioFile', %binaryConv },
+);
+
+# MIE video information
+%Image::ExifTool::MIE::Video = (
+    %tableDefaults,
+    GROUPS => { 1 => 'MIE-Video', 2 => 'Video' },
+    WRITE_GROUP => 'MIE-Video',
+   '0Type'      => { Name => 'RelatedVideoFileType', Notes => 'MOV if not specified' },
+   '1Name'      => { Name => 'RelatedVideoFileName' },
+    Codec       => { },
+    Duration    => { Writable => 'rational64u', PrintConv => 'ConvertDuration($val)' },
+    data        => { Name => 'RelatedVideoFile', %binaryConv },
+);
+
+# MIE camera information
+%Image::ExifTool::MIE::Camera = (
+    %tableDefaults,
+    GROUPS => { 1 => 'MIE-Camera', 2 => 'Camera' },
+    WRITE_GROUP => 'MIE-Camera',
+    Brightness      => { Writable => 'int8s' },
+    ColorTemperature=> { Writable => 'int32u' },
+    ColorBalance    => {
+        Writable => 'rational64u',
+        Count => 3,
+        Notes => 'RGB scaling factors',
+    },
+    Contrast        => { Writable => 'int8s' },
+    DigitalZoom     => { Writable => 'rational64u' },
+    ExposureComp    => { Name => 'ExposureCompensation', Writable => 'rational64s' },
+    ExposureMode    => { },
+    ExposureTime    => {
+        Writable => 'rational64u',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    Flash => {
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::MIE::Flash',
+            DirName => 'MIE-Flash',
+        },
+    },
+    FirmwareVersion => { },
+    FocusMode       => { },
+    ISO             => { Writable => 'int16u' },
+    ISOSetting      => {
+        Writable => 'int16u',
+        Notes => '0 = Auto, otherwise manual ISO speed setting',
+    },
+    ImageNumber     => { Writable => 'int32u' },
+    ImageQuality    => { Notes => 'Economy, Normal, Fine, Super Fine or Raw' },
+    ImageStabilization => { Writable => 'int8u', %offOn },
+    Lens => {
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::MIE::Lens',
+            DirName => 'MIE-Lens',
+        },
+    },
+    Make            => { },
+    MeasuredEV      => { Writable => 'rational64s' },
+    Model           => { },
+    OwnerName       => { },
+    Orientation     => {
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::MIE::Orient',
+            DirName => 'MIE-Orient',
+        },
+    },
+    Saturation      => { Writable => 'int8s' },
+    SensorSize      => {
+        Writable => 'rational64u',
+        Count => 2,
+        Notes => 'width and height of active sensor area in mm',
+    },
+    SerialNumber    => { },
+    Sharpness       => { Writable => 'int8s' },
+    ShootingMode    => { },
+);
+
+# Camera orientation information
+%Image::ExifTool::MIE::Orient = (
+    %tableDefaults,
+    GROUPS => { 1 => 'MIE-Orient', 2 => 'Camera' },
+    WRITE_GROUP => 'MIE-Orient',
+    NOTES => 'These tags describe the camera orientation.',
+    Azimuth     => {
+        Writable => 'rational64s',
+        Units => [ qw(deg deg{mag}) ],
+        Notes => q{'deg' CW from true north unless 'deg{mag}' specified},
+    },
+    Declination => { Writable => 'rational64s' },
+    Elevation   => { Writable => 'rational64s' },
+    RightAscension => { Writable => 'rational64s' },
+    Rotation => {
+        Writable => 'rational64s',
+        Notes => 'CW rotation angle of camera about lens axis',
+    },
+);
+
+# MIE camera lens information
+%Image::ExifTool::MIE::Lens = (
+    %tableDefaults,
+    GROUPS => { 1 => 'MIE-Lens', 2 => 'Camera' },
+    WRITE_GROUP => 'MIE-Lens',
+    NOTES => q{
+        All recorded lens parameters (focal length, aperture, etc) include the
+        effects of the extender if present.
+    },
+    Extender => {
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::MIE::Extender',
+            DirName => 'MIE-Extender',
+        },
+    },
+    FNumber         => { Writable => 'rational64u' },
+    FocalLength     => { Writable => 'rational64u', Notes => 'all focal lengths in mm' },
+    FocusDistance   => {
+        Writable => 'rational64u',
+        Units => [ qw(m ft) ],
+        Notes => q{'m' unless 'ft' specified},
+    },
+    Make            => { Name => 'LensMake' },
+    MaxAperture     => { Writable => 'rational64u' },
+    MaxApertureAtMaxFocal => { Writable => 'rational64u' },
+    MaxFocalLength  => { Writable => 'rational64u' },
+    MinAperture     => { Writable => 'rational64u' },
+    MinFocalLength  => { Writable => 'rational64u' },
+    Model           => { Name => 'LensModel' },
+    OpticalZoom     => { Writable => 'rational64u' },
+    SerialNumber    => { Name => 'LensSerialNumber' },
+);
+
+# MIE lens extender information
+%Image::ExifTool::MIE::Extender = (
+    %tableDefaults,
+    GROUPS => { 1 => 'MIE-Extender', 2 => 'Camera' },
+    WRITE_GROUP => 'MIE-Extender',
+    Magnification   => { Name => 'ExtenderMagnification', Writable => 'rational64s' },
+    Make            => { Name => 'ExtenderMake' },
+    Model           => { Name => 'ExtenderModel' },
+    SerialNumber    => { Name => 'ExtenderSerialNumber' },
+);
+
+# MIE camera flash information
+%Image::ExifTool::MIE::Flash = (
+    %tableDefaults,
+    GROUPS => { 1 => 'MIE-Flash', 2 => 'Camera' },
+    WRITE_GROUP => 'MIE-Flash',
+    ExposureComp    => { Name => 'FlashExposureComp', Writable => 'rational64s' },
+    Fired           => { Name => 'FlashFired', Writable => 'int8u', PrintConv => \%noYes },
+    GuideNumber     => { Name => 'FlashGuideNumber' },
+    Make            => { Name => 'FlashMake' },
+    Mode            => { Name => 'FlashMode' },
+    Model           => { Name => 'FlashModel' },
+    SerialNumber    => { Name => 'FlashSerialNumber' },
+    Type            => { Name => 'FlashType', Notes => '"Internal" or "External"' },
+);
+
+# MIE maker notes information
+%Image::ExifTool::MIE::MakerNotes = (
+    %tableDefaults,
+    GROUPS => { 1 => 'MIE-MakerNotes' },
+    WRITE_GROUP => 'MIE-MakerNotes',
+    NOTES => q{
+        MIE maker notes are contained within separate groups for each manufacturer
+        to avoid name conflicts.
+    },
+    Canon => {
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::MIE::Canon',
+            DirName => 'MIE-Canon',
+        },
+    },
+    Casio       => { SubDirectory => { TagTable => 'Image::ExifTool::MIE::Unknown' } },
+    FujiFilm    => { SubDirectory => { TagTable => 'Image::ExifTool::MIE::Unknown' } },
+    Kodak       => { SubDirectory => { TagTable => 'Image::ExifTool::MIE::Unknown' } },
+    KonicaMinolta=>{ SubDirectory => { TagTable => 'Image::ExifTool::MIE::Unknown' } },
+    Nikon       => { SubDirectory => { TagTable => 'Image::ExifTool::MIE::Unknown' } },
+    Olympus     => { SubDirectory => { TagTable => 'Image::ExifTool::MIE::Unknown' } },
+    Panasonic   => { SubDirectory => { TagTable => 'Image::ExifTool::MIE::Unknown' } },
+    Pentax      => { SubDirectory => { TagTable => 'Image::ExifTool::MIE::Unknown' } },
+    Ricoh       => { SubDirectory => { TagTable => 'Image::ExifTool::MIE::Unknown' } },
+    Sigma       => { SubDirectory => { TagTable => 'Image::ExifTool::MIE::Unknown' } },
+    Sony        => { SubDirectory => { TagTable => 'Image::ExifTool::MIE::Unknown' } },
+);
+
+# MIE Canon-specific information
+%Image::ExifTool::MIE::Canon = (
+    %tableDefaults,
+    GROUPS => { 1 => 'MIE-Canon' },
+    WRITE_GROUP => 'MIE-Canon',
+    VRD => {
+        Name => 'CanonVRD',
+        SubDirectory => { TagTable => 'Image::ExifTool::CanonVRD::Main' },
+    },
+);
+
+%Image::ExifTool::MIE::Unknown = (
+    PROCESS_PROC => \&ProcessMIE,
+    GROUPS => { 1 => 'MIE-Unknown' },
+);
+
+#------------------------------------------------------------------------------
+# Add user-defined MIE groups to %mieMap
+# Inputs: none;  Returns: nothing, but sets $doneMieMap flag
+sub UpdateMieMap()
+{
+    $doneMieMap = 1;    # set flag so we only do this once
+    return unless %Image::ExifTool::UserDefined;
+    my ($tableName, @tables, %doneTable, $tagID);
+    # get list of top-level MIE tables with user-defined tags
+    foreach $tableName (keys %Image::ExifTool::UserDefined) {
+        next unless $tableName =~ /^Image::ExifTool::MIE::/;
+        my $userTable = $Image::ExifTool::UserDefined{$tableName};
+        my $tagTablePtr = GetTagTable($tableName) or next;
+        # copy the WRITE_GROUP from the actual table
+        $$userTable{WRITE_GROUP} = $$tagTablePtr{WRITE_GROUP};
+        # add to list of tables to process
+        $doneTable{$tableName} = 1;
+        push @tables, [$tableName, $userTable];
+    }
+    # recursively add all user-defined groups to MIE map
+    while (@tables) {
+        my ($tableName, $tagTablePtr) = @{shift @tables};
+        my $parent = $$tagTablePtr{WRITE_GROUP};
+        $parent or warn("No WRITE_GROUP for $tableName\n"), next;
+        $mieMap{$parent} or warn("$parent is not in MIE map\n"), next;
+        foreach $tagID (TagTableKeys($tagTablePtr)) {
+            my $tagInfo = $$tagTablePtr{$tagID};
+            next unless ref $tagInfo eq 'HASH' and $$tagInfo{SubDirectory};
+            my $subTableName = $tagInfo->{SubDirectory}->{TagTable};
+            my $subTablePtr = GetTagTable($subTableName) or next;
+            # only care about MIE tables
+            next unless $$subTablePtr{PROCESS_PROC} and
+                        $$subTablePtr{PROCESS_PROC} eq \&ProcessMIE;
+            my $group = $$subTablePtr{WRITE_GROUP};
+            $group or warn("No WRITE_GROUP for $subTableName\n"), next;
+            if ($mieMap{$group} and $mieMap{$group} ne $parent) {
+                warn("$group already has different parent ($mieMap{$group})\n"), next;
+            }
+            $mieMap{$group} = $parent;  # add to map
+            # process tables within this one too
+            $doneTable{$subTableName} and next;
+            $doneTable{$subTableName} = 1;
+            push @tables, [$subTableName, $subTablePtr];
+        }
+    }
+}
+
+#------------------------------------------------------------------------------
+# Get localized version of tagInfo hash
+# Inputs: 0) tagInfo hash ref, 1) locale code (ie. "en_CA")
+# Returns: new tagInfo hash ref, or undef if invalid
+sub GetLangInfo($$)
+{
+    my ($tagInfo, $langCode) = @_;
+    # check for properly formatted language code
+    return undef unless $langCode =~ /^[a-z]{2}([-_])[A-Z]{2}$/;
+    # use '_' as a separator, but recognize '_' or '-'
+    $langCode =~ tr/-/_/ if $1 eq '-';
+    # can only set locale on string types
+    return undef if $$tagInfo{Writable} and $$tagInfo{Writable} ne 'string';
+    return Image::ExifTool::GetLangInfo($tagInfo, $langCode);
+}
+
+#------------------------------------------------------------------------------
+# return true if we have Zlib::Compress
+# Inputs: 0) ExifTool object ref, 1) verb for what you want to do with the info
+# Returns: 1 if Zlib available, 0 otherwise
+sub HasZlib($$)
+{
+    unless (defined $hasZlib) {
+        $hasZlib = eval 'require Compress::Zlib';
+        unless ($hasZlib) {
+            $hasZlib = 0;
+            $_[0]->Warn("Install Compress::Zlib to $_[1] compressed information");
+        }
+    }
+    return $hasZlib;
+}
+
+#------------------------------------------------------------------------------
+# Get format code for MIE group element with current byte order
+# Inputs: 0) [optional] true to convert result to chr()
+# Returns: format code
+sub MIEGroupFormat(;$)
+{
+    my $chr = shift;
+    my $format = GetByteOrder() eq 'MM' ? 0x10 : 0x18;
+    return $chr ? chr($format) : $format;
+}
+
+#------------------------------------------------------------------------------
+# ReadValue() with added support for UTF formats (utf8, utf16 and utf32)
+# Inputs: 0) data reference, 1) value offset, 2) format string,
+#         3) number of values (or undef to use all data)
+#         4) valid data length relative to offset
+# Returns: converted value, or undefined if data isn't there
+#          or list of values in list context
+# Notes: all string formats are converted to UTF8
+sub ReadMIEValue($$$$$)
+{
+    my ($dataPt, $offset, $format, $count, $size) = @_;
+    my $val;
+    if ($format =~ /^(utf(8|16|32)|string)/) {
+        if ($1 eq 'utf8' or $1 eq 'string') {
+            # read the 8-bit string
+            $val = substr($$dataPt, $offset, $size);
+            # (as of ExifTool 7.62, leave string values unconverted)
+        } else {
+            # convert to UTF8
+            my $fmt;
+            if (GetByteOrder() eq 'MM') {
+                $fmt = ($1 eq 'utf16') ? 'n' : 'N';
+            } else {
+                $fmt = ($1 eq 'utf16') ? 'v' : 'V';
+            }
+            my @unpk = unpack("x$offset$fmt$size",$$dataPt);
+            if ($] >= 5.006001) {
+                $val = pack('C0U*', @unpk);
+            } else {
+                $val = Image::ExifTool::PackUTF8(@unpk);
+            }
+        }
+        # truncate at null unless this is a list
+        # (strings shouldn't have a null, but just in case)
+        $val =~ s/\0.*//s unless $format =~ /_list$/;
+    } else {
+        $format = 'undef' if $format eq 'free'; # read 'free' as 'undef'
+        return ReadValue($dataPt, $offset, $format, $count, $size);
+    }
+    return $val;
+}
+
+#------------------------------------------------------------------------------
+# validate raw values for writing
+# Inputs: 0) ExifTool object ref, 1) tagInfo hash ref, 2) raw value ref
+# Returns: error string or undef (and possibly changes value) on success
+sub CheckMIE($$$)
+{
+    my ($exifTool, $tagInfo, $valPtr) = @_;
+    my $format = $$tagInfo{Writable} || $tagInfo->{Table}->{WRITABLE};
+    my $err;
+
+    return 'No writable format' if not $format or $format eq '1';
+    # handle units if supported by this tag
+    my $ulist = $$tagInfo{Units};
+    if ($ulist and $$valPtr =~ /(.*)\((.*)\)$/) {
+        my ($val, $units) = ($1, $2);
+        ($units) = grep /^$units$/i, @$ulist;
+        defined $units or return 'Allowed units: (' . join('|', @$ulist) . ')';
+        $err = Image::ExifTool::CheckValue(\$val, $format, $$tagInfo{Count});
+        # add units back onto value
+        $$valPtr = "$val($units)" unless $err;
+    } elsif ($format !~ /^(utf|string|undef)/ and $$valPtr =~ /\)$/) {
+        return 'Units not supported';
+    } else {
+        if ($format eq 'string' and $exifTool->{OPTIONS}->{Charset} ne 'UTF8' and
+            $$valPtr =~ /[\x80-\xff]/)
+        {
+            # convert from Charset to UTF-8
+            $$valPtr = $exifTool->Encode($$valPtr,'UTF8');
+        }
+        $err = Image::ExifTool::CheckValue($valPtr, $format, $$tagInfo{Count});
+    }
+    return $err;
+}
+
+#------------------------------------------------------------------------------
+# Rewrite a MIE directory
+# Inputs: 0) ExifTool object reference, 1) DirInfo reference, 2) tag table ptr
+# Returns: undef on success, otherwise error message (empty message if nothing to write)
+sub WriteMIEGroup($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $outfile = $$dirInfo{OutFile};
+    my $dirName = $$dirInfo{DirName};
+    my $toWrite = $$dirInfo{ToWrite} || '';
+    my $raf = $$dirInfo{RAF};
+    my $verbose = $exifTool->Options('Verbose');
+    my $optCompress = $exifTool->Options('Compress');
+    my $out = $exifTool->Options('TextOut');
+    my ($msg, $err, $ok, $sync, $delGroup);
+    my $tag = '';
+    my $deletedTag = '';
+
+    # count each MIE directory found and make name for this specific instance
+    my ($grp1, %isWriting);
+    my $cnt = $exifTool->{MIE_COUNT};
+    my $grp = $tagTablePtr->{GROUPS}->{1};
+    my $n = $$cnt{'MIE-Main'} || 0;
+    if ($grp eq 'MIE-Main') {
+        $$cnt{$grp} = ++$n;
+        ($grp1 = $grp) =~ s/MIE-/MIE$n-/;
+    } else {
+        ($grp1 = $grp) =~ s/MIE-/MIE$n-/;
+        my $m = $$cnt{$grp1} = ($$cnt{$grp1} || 0) + 1;
+        $isWriting{"$grp$m"} = 1;   # ie. 'MIE-Doc2'
+        $isWriting{$grp1} = 1;      # ie. 'MIE1-Doc'
+        $grp1 .= $m;
+    }
+    # build lookup for all valid group names for this MIE group
+    $isWriting{$grp} = 1;           # ie. 'MIE-Doc'
+    $isWriting{$grp1} = 1;          # ie. 'MIE1-Doc2'
+    $isWriting{"MIE$n"} = 1;        # ie. 'MIE1'
+
+    # determine if we are deleting this group
+    if (%{$exifTool->{DEL_GROUP}}) {
+        $delGroup = 1 if $exifTool->{DEL_GROUP}->{MIE} or
+                         $exifTool->{DEL_GROUP}->{$grp} or
+                         $exifTool->{DEL_GROUP}->{$grp1} or
+                         $exifTool->{DEL_GROUP}->{"MIE$n"};
+    }
+
+    # prepare lookups and lists for writing
+    my $newTags = $exifTool->GetNewTagInfoHash($tagTablePtr);
+    my ($addDirs, $editDirs) = $exifTool->GetAddDirHash($tagTablePtr, $dirName);
+    my @editTags = sort keys %$newTags, keys %$editDirs;
+    $verbose and print $out $raf ? 'Writing' : 'Creating', " $grp1:\n";
+
+    # loop through elements in MIE group
+    MieElement: for (;;) {
+        my ($format, $tagLen, $valLen, $units, $oldHdr, $buff);
+        my $lastTag = $tag;
+        if ($raf) {
+            # read first 4 bytes of element header
+            my $n = $raf->Read($oldHdr, 4);
+            if ($n != 4) {
+                last if $n or defined $sync;
+                undef $raf; # all done reading
+                $ok = 1;
+            }
+        }
+        if ($raf) {
+            ($sync, $format, $tagLen, $valLen) = unpack('aC3', $oldHdr);
+            $sync eq '~' or $msg = 'Invalid sync byte', last;
+
+            # read tag name
+            if ($tagLen) {
+                $raf->Read($tag, $tagLen) == $tagLen or last;
+                $oldHdr .= $tag;    # add tag to element header
+                $exifTool->Warn("MIE tag '$tag' out of sequence") if $tag lt $lastTag;
+                # separate units from tag name if they exist
+                $units = $1 if $tag =~ s/\((.*)\)$//;
+            } else {
+                $tag = '';
+            }
+
+            # get multi-byte value length if necessary
+            if ($valLen > 252) {
+                # calculate number of bytes in extended DataLength
+                my $n = 1 << (256 - $valLen);
+                $raf->Read($buff, $n) == $n or last;
+                $oldHdr .= $buff;   # add to old header
+                my $fmt = 'int' . ($n * 8) . 'u';
+                $valLen = ReadValue(\$buff, 0, $fmt, 1, $n);
+                if ($valLen > 0x7fffffff) {
+                    $msg = "Can't write $tag (DataLength > 2GB not yet supported)";
+                    last;
+                }
+            }
+            # don't rewrite free bytes or information in deleted groups
+            if ($format eq 0x80 or ($delGroup and $tagLen and ($format & 0xf0) != 0x10)) {
+                $raf->Seek($valLen, 1) or $msg = 'Seek error', last;
+                if ($verbose > 1) {
+                    my $free = ($format eq 0x80) ? ' free' : '';
+                    print $out "    - $grp1:$tag ($valLen$free bytes)\n";
+                }
+                ++$exifTool->{CHANGED} if $delGroup;
+                next;
+            }
+        } else {
+            # no more elements to read
+            $tagLen = $valLen = 0;
+            $tag = '';
+        }
+#
+# write necessary new tags and process directories
+#
+        while (@editTags) {
+            last if $tagLen and $editTags[0] gt $tag;
+            # we are writing the new tag now
+            my ($newVal, $writable, $oldVal, $newFormat, $compress);
+            my $newTag = shift @editTags;
+            my $newInfo = $$editDirs{$newTag};
+            if ($newInfo) {
+                # create the new subdirectory or rewrite existing non-MIE directory
+                my $subTablePtr = GetTagTable($newInfo->{SubDirectory}->{TagTable});
+                unless ($subTablePtr) {
+                    $exifTool->Warn("No tag table for $newTag $$newInfo{Name}");
+                    next;
+                }
+                my %subdirInfo;
+                my $isMieGroup = ($$subTablePtr{WRITE_PROC} and
+                                  $$subTablePtr{WRITE_PROC} eq \&ProcessMIE);
+
+                if ($newTag eq $tag) {
+                    # make sure that either both or neither old and new tags are MIE groups
+                    if ($isMieGroup xor ($format & 0xf3) == 0x10) {
+                        $exifTool->Warn("Tag '$tag' not expected type");
+                        next;   # don't write our new tag
+                    }
+                    # uncompress existing directory into $oldVal since we are editing it
+                    if ($format & 0x04) {
+                        last unless HasZlib($exifTool, 'edit');
+                        $raf->Read($oldVal, $valLen) == $valLen or last MieElement;
+                        my $stat;
+                        my $inflate = Compress::Zlib::inflateInit();
+                        $inflate and ($oldVal, $stat) = $inflate->inflate($oldVal);
+                        unless ($inflate and $stat == Compress::Zlib::Z_STREAM_END()) {
+                            $msg = "Error inflating $tag";
+                            last MieElement;
+                        }
+                        $compress = 1;
+                        $valLen = length $oldVal;    # uncompressed value length
+                    }
+                } else {
+                    # don't create this directory unless necessary
+                    next unless $$addDirs{$newTag};
+                }
+
+                if ($isMieGroup) {
+                    my $hdr;
+                    if ($newTag eq $tag) {
+                        # rewrite existing directory later unless it was compressed
+                        last unless $compress;
+                        # rewrite directory to '$newVal'
+                        $newVal = '';
+                        %subdirInfo = (
+                            OutFile => \$newVal,
+                            RAF => new File::RandomAccess(\$oldVal),
+                        );
+                    } elsif ($optCompress and not $$dirInfo{IsCompressed}) {
+                        # write to memory so we can compress the new MIE group
+                        $compress = 1;
+                        %subdirInfo = (
+                            OutFile => \$newVal,
+                        );
+                    } else {
+                        $hdr = '~' . MIEGroupFormat(1) . chr(length($newTag)) .
+                               "\0" . $newTag;
+                        %subdirInfo = (
+                            OutFile => $outfile,
+                            ToWrite => $toWrite . $hdr,
+                        );
+                    }
+                    $subdirInfo{DirName} = $newInfo->{SubDirectory}->{DirName} || $newTag;
+                    $subdirInfo{Parent} = $dirName;
+                    # don't compress elements of an already compressed group
+                    $subdirInfo{IsCompressed} = 1;
+                    $msg = WriteMIEGroup($exifTool, \%subdirInfo, $subTablePtr);
+                    last MieElement if $msg;
+                    # message is defined but empty if nothing was written
+                    if (defined $msg) {
+                        undef $msg; # not a problem if nothing was written
+                        next;
+                    } elsif (not $compress) {
+                        # group was written already
+                        $toWrite = '';
+                        next;
+                    }
+                    $writable = 'undef';
+                    $newFormat = MIEGroupFormat();
+                } else {
+                    if ($newTag eq $tag) {
+                        unless ($compress) {
+                            # read and edit existing directory
+                            $raf->Read($oldVal, $valLen) == $valLen or last MieElement;
+                        }
+                        %subdirInfo = (
+                            DataPt  => \$oldVal,
+                            DataLen => $valLen,
+                            DirName => $$newInfo{Name},
+                            DataPos => $raf->Tell() - $valLen,
+                            DirStart=> 0,
+                            DirLen  => $valLen,
+                        );
+                        # write Compact subdirectories if we will compress the data
+                        if (($compress or $optCompress or $$dirInfo{IsCompressed}) and
+                            eval 'require Compress::Zlib')
+                        {
+                            $subdirInfo{Compact} = 1;
+                        }
+                    }
+                    $subdirInfo{Parent} = $dirName;
+                    my $writeProc = $newInfo->{SubDirectory}->{WriteProc};
+                    # reset processed lookup to avoid errors in case of multiple EXIF blocks
+                    $exifTool->{PROCESSED} = { };
+                    $newVal = $exifTool->WriteDirectory(\%subdirInfo, $subTablePtr, $writeProc);
+                    if (defined $newVal) {
+                        if ($newVal eq '') {
+                            next MieElement if $newTag eq $tag; # deleting the directory
+                            next;       # not creating the new directory
+                        }
+                    } else {
+                        next unless defined $oldVal;
+                        $newVal = $oldVal;  # just copy over the old directory
+                    }
+                    $writable = 'undef';
+                    $newFormat = 0x00;  # all other directories are 'undef' format
+                }
+            } else {
+
+                # get the new tag information
+                $newInfo = $$newTags{$newTag};
+                my $nvHash = $exifTool->GetNewValueHash($newInfo);
+                my @newVals;
+
+                # write information only to specified group
+                my $writeGroup = $$nvHash{WriteGroup};
+                last unless $isWriting{$writeGroup};
+
+                # if tag existed, must decide if we want to overwrite the value
+                if ($newTag eq $tag) {
+                    my $isOverwriting;
+                    my $isList = $$newInfo{List};
+                    if ($isList) {
+                        $isOverwriting = -1;    # force processing list elements individually
+                    } else {
+                        $isOverwriting = Image::ExifTool::IsOverwriting($nvHash);
+                        last unless $isOverwriting;
+                    }
+                    my ($val, $cmpVal);
+                    if ($isOverwriting < 0 or $verbose > 1) {
+                        # check to be sure we can uncompress the value if necessary
+                        HasZlib($exifTool, 'edit') or last if $format & 0x04;
+                        # read the old value
+                        $raf->Read($oldVal, $valLen) == $valLen or last MieElement;
+                        # uncompress if necessary
+                        if ($format & 0x04) {
+                            my $stat;
+                            my $inflate = Compress::Zlib::inflateInit();
+                            # must save original compressed value in case we decide
+                            # not to overwrite it later
+                            $cmpVal = $oldVal;
+                            $inflate and ($oldVal, $stat) = $inflate->inflate($oldVal);
+                            unless ($inflate and $stat == Compress::Zlib::Z_STREAM_END()) {
+                                $msg = "Error inflating $tag";
+                                last MieElement;
+                            }
+                            $valLen = length $oldVal;    # update value length
+                        }
+                        # convert according to specified format
+                        my $formatStr = $mieFormat{$format & 0xfb} || 'undef';
+                        $val = ReadMIEValue(\$oldVal, 0, $formatStr, undef, $valLen);
+                        if ($isOverwriting < 0 and defined $val) {
+                            # handle list values individually
+                            if ($isList) {
+                                my (@vals, $v);
+                                if ($formatStr =~ /_list$/) {
+                                    @vals = split "\0", $val;
+                                } else {
+                                    @vals = $val;
+                                }
+                                # keep any list items that we aren't overwriting
+                                foreach $v (@vals) {
+                                    next if Image::ExifTool::IsOverwriting($nvHash, $v);
+                                    push @newVals, $v;
+                                }
+                            } else {
+                                # test to see if we really want to overwrite the value
+                                $isOverwriting = Image::ExifTool::IsOverwriting($nvHash, $val);
+                            }
+                        }
+                    }
+                    if ($isOverwriting) {
+                        # skip the old value if we didn't read it already
+                        unless (defined $oldVal) {
+                            $raf->Seek($valLen, 1) or $msg = 'Seek error';
+                        }
+                        if ($verbose > 1) {
+                            $val .= "($units)" if defined $units;
+                            $exifTool->VerboseValue("- $grp1:$$newInfo{Name}", $val);
+                        }
+                        $deletedTag = $tag;     # remember that we deleted this tag
+                        ++$exifTool->{CHANGED}; # we deleted the old value
+                    } else {
+                        if (defined $oldVal) {
+                            # write original compressed value
+                            $oldVal = $cmpVal if defined $cmpVal;
+                        } else {
+                            $raf->Read($oldVal, $valLen) == $valLen or last MieElement;
+                        }
+                        # write the old value now
+                        Write($outfile, $toWrite, $oldHdr, $oldVal) or $err = 1;
+                        $toWrite = '';
+                    }
+                    unless (@newVals) {
+                        # unshift the new tag info to write it later
+                        unshift @editTags, $newTag;
+                        next MieElement;    # get next element from file
+                    }
+                } else {
+                    # write new value if creating, or if List and list existed, or
+                    # if tag was previously deleted
+                    next unless Image::ExifTool::IsCreating($nvHash) or
+                        ($newTag eq $lastTag and ($$newInfo{List} or $deletedTag eq $lastTag));
+                }
+                # get the new value to write (undef to delete)
+                push @newVals, Image::ExifTool::GetNewValues($nvHash);
+                next unless @newVals;
+                $writable = $$newInfo{Writable} || $$tagTablePtr{WRITABLE};
+                if ($writable eq 'string') {
+                    # join multiple values into a single string
+                    $newVal = join "\0", @newVals;
+                    # write string as UTF-8,16 or 32 if value contains valid UTF-8 codes
+                    require Image::ExifTool::XMP;
+                    my $isUTF8 = Image::ExifTool::XMP::IsUTF8(\$newVal);
+                    if ($isUTF8 > 0) {
+                        $writable = 'utf8';
+                        # write UTF-16 or UTF-32 if it is more compact
+                        my $to = $isUTF8 > 1 ? 'UCS4' : 'UCS2';
+                        my $tmp = Image::ExifTool::Decode(undef,$newVal,'UTF8',undef,$to);
+                        if (length $tmp < length $newVal) {
+                            $newVal = $tmp;
+                            $writable = ($isUTF8 > 1) ? 'utf32' : 'utf16';
+                        }
+                    }
+                    # write as a list if we have multiple values
+                    $writable .= '_list' if @newVals > 1;
+                } else {
+                    # should only be one element in the list
+                    $newVal = shift @newVals;
+                }
+                $newFormat = $mieCode{$writable};
+                unless (defined $newFormat) {
+                    $msg = "Bad format '$writable' for $$newInfo{Name}";
+                    next MieElement;
+                }
+            }
+
+            # write the new or edited element
+            while (defined $newFormat) {
+                my $valPt = \$newVal;
+                # remove units from value and add to tag name if supported by this tag
+                if ($$newInfo{Units}) {
+                    my $val2;
+                    if ($$valPt =~ /(.*)\((.*)\)$/) {
+                        $val2 = $1;
+                        $newTag .= "($2)";
+                    } else {
+                        $val2 = $$valPt;
+                        # add default units
+                        my $ustr = '(' . $newInfo->{Units}->[0] . ')';
+                        $newTag .= $ustr;
+                        $$valPt .= $ustr;
+                    }
+                    $valPt = \$val2;
+                }
+                # convert value if necessary
+                if ($writable !~ /^(utf|string|undef)/) {
+                    my $val3 = WriteValue($$valPt, $writable, $$newInfo{Count});
+                    defined $val3 or $exifTool->Warn("Error writing $newTag"), last;
+                    $valPt = \$val3;
+                }
+                my $len = length $$valPt;
+                # compress value before writing if required
+                if (($compress or $optCompress) and not $$dirInfo{IsCompressed} and
+                    HasZlib($exifTool, 'write'))
+                {
+                    my $deflate = Compress::Zlib::deflateInit();
+                    my $val4;
+                    if ($deflate) {
+                        $val4 = $deflate->deflate($$valPt);
+                        $val4 .= $deflate->flush() if defined $val4;
+                    }
+                    if (defined $val4) {
+                        my $len4 = length $val4;
+                        my $saved = $len - $len4;
+                        # only use compressed data if it is smaller
+                        if ($saved > 0) {
+                            $verbose and print $out "  [$newTag compression saved $saved bytes]\n";
+                            $newFormat |= 0x04; # set compressed bit
+                            $len = $len4;       # set length
+                            $valPt = \$val4;    # set value pointer
+                        } elsif ($verbose) {
+                            print $out "  [$newTag compression saved $saved bytes -- written uncompressed]\n";
+                        }
+                    } else {
+                        $exifTool->Warn("Error deflating $newTag (written uncompressed)");
+                    }
+                }
+                # calculate the DataLength code
+                my $extLen;
+                if ($len < 253) {
+                    $extLen = '';
+                } elsif ($len < 65536) {
+                    $extLen = Set16u($len);
+                    $len = 255;
+                } elsif ($len <= 0x7fffffff) {
+                    $extLen = Set32u($len);
+                    $len = 254;
+                } else {
+                    $exifTool->Warn("Can't write $newTag (DataLength > 2GB not yet suppported)");
+                    last; # don't write this tag
+                }
+                # write this element (with leading MIE group element if not done already)
+                my $hdr = $toWrite . '~' . chr($newFormat) . chr(length $newTag);
+                Write($outfile, $hdr, chr($len), $newTag, $extLen, $$valPt) or $err = 1;
+                $toWrite = '';
+                # we changed a tag unless just editing a subdirectory
+                unless ($$editDirs{$newTag}) {
+                    $exifTool->VerboseValue("+ $grp1:$$newInfo{Name}", $newVal);
+                    ++$exifTool->{CHANGED};
+                }
+                last;   # didn't want to loop anyway
+            }
+            next MieElement if defined $oldVal;
+        }
+#
+# rewrite existing element or descend into uncompressed MIE group
+#
+        # all done this MIE group if we reached the terminator element
+        unless ($tagLen) {
+            # skip over existing terminator data (if any)
+            last if $valLen and not $raf->Seek($valLen, 1);
+            $ok = 1;
+            # write group terminator if necessary
+            unless ($toWrite) {
+                # write end-of-group terminator element
+                my $term = "~\0\0\0";
+                unless ($$dirInfo{Parent}) {
+                    # write extended terminator for file-level group
+                    my $len = ref $outfile eq 'SCALAR' ? length($$outfile) : tell $outfile;
+                    $len += 10; # include length of terminator itself
+                    if ($len and $len <= 0x7fffffff) {
+                        $term = "~\0\0\x06" . Set32u($len) . MIEGroupFormat(1) . "\x04";
+                    }
+                }
+                Write($outfile, $term) or $err = 1;
+            }
+            last;
+        }
+
+        # descend into existing uncompressed MIE group
+        if ($format == 0x10 or $format == 0x18) {
+            my ($subTablePtr, $dirName);
+            my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+            if ($tagInfo and $$tagInfo{SubDirectory}) {
+                $dirName = $tagInfo->{SubDirectory}->{DirName};
+                my $subTable = $tagInfo->{SubDirectory}->{TagTable};
+                $subTablePtr = $subTable ? GetTagTable($subTable) : $tagTablePtr;
+            } else {
+                $subTablePtr = GetTagTable('Image::ExifTool::MIE::Unknown');
+            }
+            my $hdr = '~' . chr($format) . chr(length $tag) . "\0" . $tag;
+            my %subdirInfo = (
+                DirName => $dirName || $tag,
+                RAF     => $raf,
+                ToWrite => $toWrite . $hdr,
+                OutFile => $outfile,
+                Parent  => $dirName,
+                IsCompressed => $$dirInfo{IsCompressed},
+            );
+            my $oldOrder = GetByteOrder();
+            SetByteOrder($format & 0x08 ? 'II' : 'MM');
+            $msg = WriteMIEGroup($exifTool, \%subdirInfo, $subTablePtr);
+            SetByteOrder($oldOrder);
+            last if $msg;
+            if (defined $msg) {
+                undef $msg; # no problem if nothing written
+            } else {
+                $toWrite = '';
+            }
+            next;
+        }
+        # just copy existing element
+        my $oldVal;
+        $raf->Read($oldVal, $valLen) == $valLen or last;
+        if ($toWrite) {
+            Write($outfile, $toWrite) or $err = 1;
+            $toWrite = '';
+        }
+        Write($outfile, $oldHdr, $oldVal) or $err = 1;
+    }
+    # return error message
+    if ($err) {
+        $msg = 'Error writing file';
+    } elsif (not $ok and not $msg) {
+        $msg = 'Unexpected end of file';
+    } elsif (not $msg and $toWrite) {
+        $msg = '';  # flag for nothing written
+        $verbose and print $out "Deleted $grp1 (empty)\n";
+    }
+    return $msg;
+}
+
+#------------------------------------------------------------------------------
+# Process MIE directory
+# Inputs: 0) ExifTool object reference, 1) DirInfo reference, 2) tag table ref
+# Returns: undef on success, or error message if there was a problem
+# Notes: file pointer is positioned at the MIE end on entry
+sub ProcessMIEGroup($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $raf = $$dirInfo{RAF};
+    my $verbose = $exifTool->Options('Verbose');
+    my $out = $exifTool->Options('TextOut');
+    my $notUTF8 = ($exifTool->{OPTIONS}->{Charset} ne 'UTF8');
+    my ($msg, $buff, $ok, $oldIndent, $mime);
+    my $lastTag = '';
+
+    # get group 1 names: $grp doesn't have numbers (ie. 'MIE-Doc'),
+    # and $grp1 does (ie. 'MIE1-Doc1')
+    my $cnt = $exifTool->{MIE_COUNT};
+    my $grp1 = $tagTablePtr->{GROUPS}->{1};
+    my $n = $$cnt{'MIE-Main'} || 0;
+    if ($grp1 eq 'MIE-Main') {
+        $$cnt{$grp1} = ++$n;
+        $grp1 =~ s/MIE-/MIE$n-/ if $n > 1;
+    } else {
+        $grp1 =~ s/MIE-/MIE$n-/ if $n > 1;
+        $$cnt{$grp1} = ($$cnt{$grp1} || 0) + 1;
+        $grp1 .= $$cnt{$grp1} if $$cnt{$grp1} > 1;
+    }
+    # set group1 name for all tags extracted from this group
+    $exifTool->{SET_GROUP1} = $grp1;
+
+    if ($verbose) {
+        $oldIndent = $exifTool->{INDENT};
+        $exifTool->{INDENT} .= '| ';
+        $exifTool->VerboseDir($grp1);
+    }
+    my $wasCompressed = $$dirInfo{WasCompressed};
+
+    # process all MIE elements
+    for (;;) {
+        $raf->Read($buff, 4) == 4 or last;
+        my ($sync, $format, $tagLen, $valLen) = unpack('aC3', $buff);
+        $sync eq '~' or $msg = 'Invalid sync byte', last;
+
+        # read tag name
+        my ($tag, $units);
+        if ($tagLen) {
+            $raf->Read($tag, $tagLen) == $tagLen or last;
+            $exifTool->Warn("MIE tag '$tag' out of sequence") if $tag lt $lastTag;
+            $lastTag = $tag;
+            # separate units from tag name if they exist
+            $units = $1 if $tag =~ s/\((.*)\)$//;
+        } else {
+            $tag = '';
+        }
+
+        # get multi-byte value length if necessary
+        if ($valLen > 252) {
+            my $n = 1 << (256 - $valLen);
+            $raf->Read($buff, $n) == $n or last;
+            my $fmt = 'int' . ($n * 8) . 'u';
+            $valLen = ReadValue(\$buff, 0, $fmt, 1, $n);
+            if ($valLen > 0x7fffffff) {
+                $msg = "Can't read $tag (DataLength > 2GB not yet supported)";
+                last;
+            }
+        }
+
+        # all done if we reached the group terminator
+        unless ($tagLen) {
+            # skip over terminator data block
+            $ok = 1 unless $valLen and not $raf->Seek($valLen, 1);
+            last;
+        }
+
+        # get tag information hash unless this is free space
+        my ($tagInfo, $value);
+        while ($format != 0x80) {
+            $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+            last if $tagInfo;
+            # extract tags with locale code
+            if ($tag =~ /\W/) {
+                if ($tag =~ /^(\w+)-([a-z]{2}_[A-Z]{2})$/) {
+                    my ($baseTag, $langCode) = ($1, $2);
+                    $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $baseTag);
+                    $tagInfo = GetLangInfo($tagInfo, $langCode) if $tagInfo;
+                    last if $tagInfo;
+                } else {
+                    $exifTool->Warn('Invalid MIE tag name');
+                    last;
+                }
+            }
+            # extract unknown tags if specified
+            $tagInfo = {
+                Name => $tag,
+                Writable => 0,
+                PrintConv => 'length($val) > 60 ? substr($val,0,55) . "[...]" : $val',
+            };
+            Image::ExifTool::AddTagToTable($tagTablePtr, $tag, $tagInfo);
+            last;
+        }
+
+        # read value and uncompress if necessary
+        my $formatStr = $mieFormat{$format & 0xfb} || 'undef';
+        if ($tagInfo or ($formatStr eq 'MIE' and $format & 0x04)) {
+            $raf->Read($value, $valLen) == $valLen or last;
+            if ($format & 0x04) {
+                if ($verbose) {
+                    print $out "$$exifTool{INDENT}\[Tag '$tag' $valLen bytes compressed]\n";
+                }
+                next unless HasZlib($exifTool, 'decode');
+                my $stat;
+                my $inflate = Compress::Zlib::inflateInit();
+                $inflate and ($value, $stat) = $inflate->inflate($value);
+                unless ($inflate and $stat == Compress::Zlib::Z_STREAM_END()) {
+                    $exifTool->Warn("Error inflating $tag");
+                    next;
+                }
+                $valLen = length $value;
+                $wasCompressed = 1;
+            }
+        }
+
+        # process this tag
+        if ($formatStr eq 'MIE') {
+            # process MIE directory
+            my ($subTablePtr, $dirName);
+            if ($tagInfo and $$tagInfo{SubDirectory}) {
+                $dirName = $tagInfo->{SubDirectory}->{DirName};
+                my $subTable = $tagInfo->{SubDirectory}->{TagTable};
+                $subTablePtr = $subTable ? GetTagTable($subTable) : $tagTablePtr;
+            } else {
+                $subTablePtr = GetTagTable('Image::ExifTool::MIE::Unknown');
+            }
+            if ($verbose) {
+                my $order = ', byte order ' . GetByteOrder();
+                $exifTool->VerboseInfo($tag, $tagInfo, Size => $valLen, Extra => $order);
+            }
+            my %subdirInfo = (
+                DirName => $dirName || $tag,
+                RAF     => $raf,
+                Parent  => $$dirInfo{DirName},
+                WasCompressed => $wasCompressed,
+            );
+            # read from uncompressed data instead if necessary
+            $subdirInfo{RAF} = new File::RandomAccess(\$value) if $format & 0x04;
+
+            my $oldOrder = GetByteOrder();
+            SetByteOrder($format & 0x08 ? 'II' : 'MM');
+            $msg = ProcessMIEGroup($exifTool, \%subdirInfo, $subTablePtr);
+            SetByteOrder($oldOrder);
+            $exifTool->{SET_GROUP1} = $grp1;    # restore this group1 name
+            last if $msg;
+        } else {
+            # process MIE data format types
+            if ($tagInfo) {
+                # extract tag value
+                my $val = ReadMIEValue(\$value, 0, $formatStr, undef, $valLen);
+                unless (defined $val) {
+                    $exifTool->Warn("Error reading $tag value");
+                    $val = '<err>';
+                }
+                # save type or mime type
+                $mime = $val if $tag eq '0Type' or $tag eq '2MIME';
+                if ($verbose) {
+                    my $count;
+                    my $s = Image::ExifTool::FormatSize($formatStr);
+                    if ($s and $formatStr !~ /^(utf|string|undef)/) {
+                        $count = $valLen / $s;
+                    }
+                    $exifTool->VerboseInfo($lastTag, $tagInfo,
+                        DataPt  => \$value,
+                        DataPos => $raf->Tell() - $valLen,
+                        Size    => $valLen,
+                        Format  => $formatStr,
+                        Value   => $val,
+                        Count   => $count,
+                    );
+                }
+                if ($$tagInfo{SubDirectory}) {
+                    my $subTablePtr = GetTagTable($tagInfo->{SubDirectory}->{TagTable});
+                    my %subdirInfo = (
+                        DirName => $$tagInfo{Name},
+                        DataPt  => \$value,
+                        DataLen => $valLen,
+                        DirStart=> 0,
+                        DirLen  => $valLen,
+                        Parent  => $$dirInfo{DirName},
+                        WasCompressed => $wasCompressed,
+                    );
+                    # set DataPos and Base for uncompressed information only
+                    unless ($wasCompressed) {
+                        $subdirInfo{DataPos} = $raf->Tell() - $valLen;
+                        $subdirInfo{Base}    = $raf->Tell() - $valLen;
+                    }
+                    # reset PROCESSED lookup for each MIE directory
+                    # (there is no possibility of double-processing a MIE directory)
+                    $exifTool->{PROCESSED} = { };
+                    my $processProc = $tagInfo->{SubDirectory}->{ProcessProc};
+                    delete $exifTool->{SET_GROUP1};
+                    delete $exifTool->{NO_LIST};
+                    $exifTool->ProcessDirectory(\%subdirInfo, $subTablePtr, $processProc);
+                    $exifTool->{SET_GROUP1} = $grp1;
+                    $exifTool->{NO_LIST} = 1;
+                } else {
+                    # convert to specified character set if necessary
+                    if ($notUTF8 and $formatStr =~ /^(utf|string)/) {
+                        $val = $exifTool->Decode($val, 'UTF8');
+                    }
+                    if ($formatStr =~ /_list$/) {
+                        # split list value into separate strings
+                        my @vals = split "\0", $val;
+                        $val = \@vals;
+                    }
+                    if (defined $units) {
+                        $val = "@$val" if ref $val; # convert string list to number list
+                        # add units to value if specified
+                        $val .= "($units)" if defined $units;
+                    }
+                    $exifTool->FoundTag($tagInfo, $val);
+                }
+            } else {
+                # skip over unknown information or free bytes
+                $raf->Seek($valLen, 1) or $msg = 'Seek error', last;
+                $verbose and $exifTool->VerboseInfo($tag, undef, Size => $valLen);
+            }
+        }
+    }
+    # modify MIME type if necessary
+    $mime and not $$dirInfo{Parent} and $exifTool->ModifyMimeType($mime);
+
+    $ok or $msg or $msg = 'Unexpected end of file';
+    $verbose and $exifTool->{INDENT} = $oldIndent;
+    return $msg;
+}
+
+#------------------------------------------------------------------------------
+# Read/write a MIE file
+# Inputs: 0) ExifTool object reference, 1) DirInfo reference
+# Returns: 1 on success, 0 if this wasn't a valid MIE file, or -1 on write error
+# - process as a trailer if "Trailer" flag set in dirInfo
+sub ProcessMIE($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    return 1 unless defined $exifTool;
+    my $raf = $$dirInfo{RAF};
+    my $outfile = $$dirInfo{OutFile};
+    my ($buff, $err, $msg, $pos, $end, $isCreating);
+    my $numDocs = 0;
+#
+# process as a trailer (from end of file) if specified
+#
+    if ($$dirInfo{Trailer}) {
+        my $offset = $$dirInfo{Offset} || 0;    # offset from end of file
+        $raf->Seek(-10 - $offset, 2) or return 0;
+        for (;;) {
+            # read and validate last 10 bytes
+            $raf->Read($buff, 10) == 10 or last;
+            last unless $buff =~ /~\0\0\x06.{4}(\x10|\x18)(\x04)$/s or
+                        $buff =~ /(\x10|\x18)(\x08)$/s;
+            SetByteOrder($1 eq "\x10" ? 'MM' : 'II');
+            my $len = ($2 eq "\x04") ? Get32u(\$buff, 4) : Get64u(\$buff, 0);
+            my $curPos = $raf->Tell() or last;
+            last if $len < 12 or $len > $curPos;
+            # validate element header if 8-byte offset was used
+            if ($2 eq "\x08") {
+                last if $len < 14;
+                $raf->Seek($curPos - 14, 0) and $raf->Read($buff, 4) or last;
+                last unless $buff eq "~\0\0\x0a";
+            }
+            # looks like a good group, so remember start position
+            $pos = $curPos - $len;
+            $end = $curPos unless $end;
+            # seek to 10 bytes from end of previous group
+            $raf->Seek($pos - 10, 0) or last;
+        }
+        # seek to start of first MIE group
+        return 0 unless defined $pos and $raf->Seek($pos, 0);
+        # update DataPos and DirLen for ProcessTrailers()
+        $$dirInfo{DataPos} = $pos;
+        $$dirInfo{DirLen} = $end - $pos;
+        if ($outfile and $exifTool->{DEL_GROUP}->{MIE}) {
+            # delete the trailer
+            $exifTool->VPrint(0,"  Deleting MIE trailer\n");
+            ++$exifTool->{CHANGED};
+            return 1;
+        } elsif ($exifTool->Options('Verbose') or $exifTool->{HTML_DUMP}) {
+            $exifTool->DumpTrailer($dirInfo);
+        }
+    }
+#
+# loop through all documents in MIE file
+#
+    for (;;) {
+        # look for "0MIE" group element
+        my $num = $raf->Read($buff, 8);
+        if ($num == 8) {
+            # verify file identifier
+            if ($buff =~ /^~(\x10|\x18)\x04(.)0MIE/) {
+                SetByteOrder($1 eq "\x10" ? 'MM' : 'II');
+                my $len = ord($2);
+                # skip extended DataLength if it exists
+                if ($len > 252 and not $raf->Seek(1 << (256 - $len), 1)) {
+                    $msg = 'Seek error';
+                    last;
+                }
+            } else {
+                return 0 unless $numDocs;   # not a MIE file
+                if ($buff =~ /^~/) {
+                    $msg = 'Non-standard file-level MIE element';
+                } else {
+                    $msg = 'Invalid MIE file-level data';
+                }
+            }
+        } elsif ($numDocs) {
+            last unless $num;   # OK, all done with file
+            $msg = 'Truncated MIE element header';
+        } else {
+            return 0 if $num or not $outfile;
+            # we have the ability to create a MIE file from scratch
+            $buff = ''; # start from nothing
+            # set byte order according to preferences
+            $exifTool->SetPreferredByteOrder();
+            $isCreating = 1;
+        }
+        if ($msg) {
+            last if $$dirInfo{Trailer}; # allow other trailers after MIE
+            if ($outfile) {
+                $exifTool->Error($msg);
+            } else {
+                $exifTool->Warn($msg);
+            }
+            last;
+        }
+        # this is a new MIE document -- increment document count
+        unless ($numDocs) {
+            # this is a valid MIE file (unless a trailer on another file)
+            $exifTool->SetFileType();
+            $exifTool->{NO_LIST} = 1;   # handle lists ourself
+            $exifTool->{MIE_COUNT} = { };
+            undef $hasZlib;
+        }
+        ++$numDocs;
+
+        # process the MIE groups recursively, beginning with the main MIE group
+        my $tagTablePtr = GetTagTable('Image::ExifTool::MIE::Main');
+
+        my %subdirInfo = (
+            DirName => 'MIE',
+            RAF => $raf,
+            OutFile => $outfile,
+            # don't define Parent so WriteMIEGroup() writes extended terminator
+        );
+        if ($outfile) {
+            # generate lookup for MIE format codes if not done already
+            unless (%mieCode) {
+                foreach (keys %mieFormat) {
+                    $mieCode{$mieFormat{$_}} = $_;
+                }
+            }
+            # update %mieMap with user-defined MIE groups
+            UpdateMieMap() unless $doneMieMap;
+            # initialize write directories, with MIE tags taking priority
+            # (note that this may re-initialize directories when writing trailer
+            #  to another type of image, but this is OK because we are done writing
+            #  the other format by the time we start writing the trailer)
+            $exifTool->InitWriteDirs(\%mieMap, 'MIE');
+            $subdirInfo{ToWrite} = '~' . MIEGroupFormat(1) . "\x04\xfe0MIE\0\0\0\0";
+            $msg = WriteMIEGroup($exifTool, \%subdirInfo, $tagTablePtr);
+            if ($msg) {
+                $exifTool->Error($msg);
+                $err = 1;
+                last;
+            } elsif (defined $msg and $isCreating) {
+                last;
+            }
+        } else {
+            $msg = ProcessMIEGroup($exifTool, \%subdirInfo, $tagTablePtr);
+            if ($msg) {
+                $exifTool->Warn($msg);
+                last;
+            }
+        }
+    }
+    delete $exifTool->{NO_LIST};
+    delete $exifTool->{MIE_COUNT};
+    delete $exifTool->{SET_GROUP1};
+    return $err ? -1 : 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::MIE - Read/write MIE meta information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains routines required by Image::ExifTool to read and write
+information in MIE files.
+
+=head1 WHAT IS MIE?
+
+MIE stands for "Meta Information Encapsulation".  The MIE format is an
+extensible, dedicated meta information format which supports storage of
+binary as well as textual meta information.  MIE can be used to encapsulate
+meta information from many sources and bundle it together with any type of
+file.
+
+=head2 Features
+
+Below is very subjective score card comparing the features of a number of
+common file and meta information formats, and comparing them to MIE.  The
+following features are rated for each format with a score of 0 to 10:
+
+  1) Extensible (can incorporate user-defined information).
+  2) Meaningful tag ID's (hint to meaning of unknown information).
+  3) Sequential read/write ability (streamable).
+  4) Hierarchical information structure.
+  5) Easy to implement reader/writer/editor.
+  6) Order of information well defined.
+  7) Large data lengths supported: >64kB (+5) and >4GB (+5).
+  8) Localized text strings.
+  9) Multiple documents in a single file.
+ 10) Compact format doesn't squander disk space or bandwidth.
+ 11) Compressed meta information supported.
+ 12) Relocatable data elements (ie. no fixed offsets).
+ 13) Binary meta information (+7) with variable byte order (+3).
+ 14) Mandatory tags not required (an unecessary complication).
+ 15) Append information to end of file without editing.
+
+                          Feature number                   Total
+     Format  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15   Score
+     ------ ---------------------------------------------  -----
+     MIE    10 10 10 10 10 10 10 10 10 10 10 10 10 10 10    150
+     PDF    10 10  0 10  0  0 10  0 10 10 10  0  7 10 10     97
+     PNG    10 10 10  0  8  0  5 10  0 10 10 10  0 10  0     93
+     XMP    10 10 10 10  2  0 10 10 10  0  0 10  0 10  0     92
+     AIFF    0  5 10 10 10  0  5  0  0 10  0 10  7 10  0     77
+     RIFF    0  5 10 10 10  0  5  0  0 10  0 10  7 10  0     77
+     JPEG   10  0 10  0 10  0  0  0  0 10  0 10  7 10  0     67
+     EPS    10 10 10  0  0  0 10  0 10  0  0  5  0 10  0     65
+     CIFF    0  0  0 10 10  0  5  0  0 10  0 10 10 10  0     65
+     TIFF    0  0  0 10  5 10  5  0 10 10  0  0 10  0  0     60
+     EXIF    0  0  0 10  5 10  0  0  0 10  0  0 10  0  0     45
+     IPTC    0  0 10  0  8  0  0  0  0 10  0 10  7  0  0     45
+
+By design, MIE ranks highest by a significant margin.  Other formats with
+reasonable scores are PDF, PNG and XMP, but each has significant weak
+points.  What may be surprising is that TIFF, EXIF and IPTC rank so low.
+
+As well as scoring high in all these features, the MIE format has the unique
+ability to encapsulate any other type of file, and provides a non-invasive
+method of adding meta information to a file.  The meta information is
+logically separated from the original file data, which is extremely
+important because meta information is routinely lost when files are edited.
+
+Also, the MIE format supports multiple files by simple concatenation,
+enabling all kinds of wonderful features such as linear databases, edit
+histories or non-intrusive file updates.  This ability can also be leveraged
+to allow MIE-format trailers to be added to some other file types.
+
+=head1 MIE 1.1 FORMAT SPECIFICATION (2007-01-21)
+
+=head2 File Structure
+
+A MIE file consists of a series of MIE elements.  A MIE element may contain
+either data or a group of MIE elements, providing a hierarchical format for
+storing data.  Each MIE element is identified by a human-readable tag name,
+and may store data from zero to 2^64-1 bytes in length.
+
+=head2 File Signature
+
+The first element in the MIE file must be an uncompressed MIE group element
+with a tag name of "0MIE".  This restriction allows the first 8 bytes of a
+MIE file to be used to identify a MIE format file.  The following table
+lists the two possible initial byte sequences for a MIE-format file (the
+first for big-endian, and the second for little-endian byte ordering):
+
+    Byte Number:      0    1    2    3    4    5    6    7
+
+    C Characters:     ~ \x10 \x04    ?    0    M    I    E
+        or            ~ \x18 \x04    ?    0    M    I    E
+
+    Hexadecimal:     7e   10   04    ?   30   4d   49   45
+        or           7e   18   04    ?   30   4d   49   45
+
+    Decimal:        126   16    4    ?   48   77   73   69
+        or          126   24    4    ?   48   77   73   69
+
+Note that byte 1 may have one of the two possible values (0x10 or 0x18), and
+byte 3 may have any value (0x00 to 0xff).
+
+=head2 Element Structure
+
+    1 byte  SyncByte = 0x7e (decimal 126, character '~')
+    1 byte  FormatCode (see below)
+    1 byte  TagLength (T)
+    1 byte  DataLength (gives D if DataLength < 253)
+    T bytes TagName (T given by TagLength)
+    2 bytes DataLength2 [exists only if DataLength == 255 (0xff)]
+    4 bytes DataLength4 [exists only if DataLength == 254 (0xfe)]
+    8 bytes DataLength8 [exists only if DataLength == 253 (0xfd)]
+    D bytes DataBlock (D given by DataLength)
+
+The minimum element length is 4 bytes (for a group terminator).  The maximum
+DataBlock size is 2^64-1 bytes.  TagLength and DataLength are unsigned
+integers, and the byte ordering for multi-byte DataLength fields is
+specified by the containing MIE group element.  The SyncByte is byte
+aligned, so no padding is added to align on an N-byte boundary.
+
+=head3 FormatCode
+
+The format code is a bitmask that defines the format of the data:
+
+    7654 3210
+    ++++ ----  FormatType
+    ---- +---  TypeModifier
+    ---- -+--  Compressed
+    ---- --++  FormatSize
+
+=over 4
+
+=item FormatType (bitmask 0xf0):
+
+    0x00 - other (or unknown) data
+    0x10 - MIE group
+    0x20 - text string
+    0x30 - list of null-separated text strings
+    0x40 - integer
+    0x50 - rational
+    0x60 - fixed point
+    0x70 - floating point
+    0x80 - free space
+
+=item TypeModifier (bitmask 0x08):
+
+Modifies the meaning of certain FormatTypes (0x00-0x60):
+
+    0x08 - other data sensitive to MIE group byte order
+    0x18 - MIE group with little-endian byte ordering
+    0x28 - UTF encoded text string
+    0x38 - UTF encoded text string list
+    0x48 - signed integer
+    0x58 - signed rational (denominator is always unsigned)
+    0x68 - signed fixed-point
+
+=item Compressed (bitmask 0x04):
+
+If this bit is set, the data block is compressed using Zlib deflate.  An
+entire MIE group may be compressed, with the exception of file-level groups.
+
+=item FormatSize (bitmask 0x03):
+
+Gives the byte size of each data element:
+
+    0x00 - 8 bits  (1 byte)
+    0x01 - 16 bits (2 bytes)
+    0x02 - 32 bits (4 bytes)
+    0x03 - 64 bits (8 bytes)
+
+The number of bytes in a single value for this format is given by
+2**FormatSize (or 1 << FormatSize).  The number of values is the data length
+divided by this number of bytes.  It is an error if the data length is not
+an even multiple of the format size in bytes.
+
+=back
+
+The following is a list of all currently defined MIE FormatCode values for
+uncompressed data (add 0x04 to each value for compressed data):
+
+    0x00 - other data (insensitive to MIE group byte order) (1)
+    0x01 - other 16-bit data (may be byte swapped)
+    0x02 - other 32-bit data (may be byte swapped)
+    0x03 - other 64-bit data (may be byte swapped)
+    0x08 - other data (sensitive to MIE group byte order) (1)
+    0x10 - MIE group with big-endian values (1)
+    0x18 - MIE group with little-endian values (1)
+    0x20 - ASCII (ISO 8859-1) string (2,3)
+    0x28 - UTF-8 string (2,3,4)
+    0x29 - UTF-16 string (2,3,4)
+    0x2a - UTF-32 string (2,3,4)
+    0x30 - ASCII (ISO 8859-1) string list (3,5)
+    0x38 - UTF-8 string list (3,4,5)
+    0x39 - UTF-16 string list (3,4,5)
+    0x3a - UTF-32 string list (3,4,5)
+    0x40 - unsigned 8-bit integer
+    0x41 - unsigned 16-bit integer
+    0x42 - unsigned 32-bit integer
+    0x43 - unsigned 64-bit integer (6)
+    0x48 - signed 8-bit integer
+    0x49 - signed 16-bit integer
+    0x4a - signed 32-bit integer
+    0x4b - signed 64-bit integer (6)
+    0x52 - unsigned 32-bit rational (16-bit numerator then denominator) (7)
+    0x53 - unsigned 64-bit rational (32-bit numerator then denominator) (7)
+    0x5a - signed 32-bit rational (denominator is unsigned) (7)
+    0x5b - signed 64-bit rational (denominator is unsigned) (7)
+    0x61 - unsigned 16-bit fixed-point (high 8 bits is integer part) (8)
+    0x62 - unsigned 32-bit fixed-point (high 16 bits is integer part) (8)
+    0x69 - signed 16-bit fixed-point (high 8 bits is signed integer) (8)
+    0x6a - signed 32-bit fixed-point (high 16 bits is signed integer) (8)
+    0x72 - 32-bit IEEE float (not recommended for portability reasons)
+    0x73 - 64-bit IEEE double (not recommended for portability reasons) (6)
+    0x80 - free space (value data does not contain useful information)
+
+Notes:
+
+=over 4
+
+=item 1.
+
+The byte ordering specified by the MIE group TypeModifier applies to the MIE
+group element as well as all elements within the group.  Data for all
+FormatCodes except 0x08 (other data, sensitive to byte order) may be
+transferred between MIE groups with different byte order by byte swapping
+the uncompressed data according to the specified data format.  The following
+list illustrates the byte-swapping pattern, based on FormatSize, for all
+format types except rational (FormatType 0x50).
+
+      FormatSize              Change in Byte Sequence
+    --------------      -----------------------------------
+    0x00 (8 bits)       0 1 2 3 4 5 6 7 --> 0 1 2 3 4 5 6 7 (no change)
+    0x01 (16 bits)      0 1 2 3 4 5 6 7 --> 1 0 3 2 5 4 7 6
+    0x02 (32 bits)      0 1 2 3 4 5 6 7 --> 3 2 1 0 7 6 5 4
+    0x03 (64 bits)      0 1 2 3 4 5 6 7 --> 7 6 5 4 3 2 1 0
+
+Rational values consist of two integers, so they are swapped as the next
+lower FormatSize.  For example, a 32-bit rational (FormatSize 0x02, and
+FormatCode 0x52 or 0x5a) is swapped as two 16-bit values (ie. as if it had
+FormatSize 0x01).
+
+=item 2.
+
+The TagName of a string element may have an 6-character suffix to indicate a
+specific locale. (ie. "Title-en_US", or "Keywords-de_DE").
+
+=item 3.
+
+Text strings are not normally null terminated, however they may be padded
+with one or more null characters to the end of the data block to allow
+strings to be edited within fixed-length data blocks.  Newlines in the text
+are indicated by a single LF (0x0a) character.
+
+=item 4.
+
+UTF strings must not begin with a byte order mark (BOM) since the byte order
+and byte size are specified by the MIE format.  If a BOM is found, it should
+be treated as a zero-width non-breaking space.
+
+=item 5.
+
+A list of text strings separated by null characters.  These lists must not
+be null padded or null terminated, since this would be interpreted as
+additional zero-length strings.  For ASCII and UTF-8 strings, the null
+character is a single zero (0x00) byte.  For UTF-16 or UTF-32 strings, the
+null character is 2 or 4 zero bytes respectively.
+
+=item 6.
+
+64-bit integers and doubles are subject to the specified byte ordering for
+both 32-bit words and bytes within these words.  For instance, the high
+order byte is always the first byte if big-endian, and the eighth byte if
+little-endian.  This means that some swapping is always necessary for these
+values on systems where the byte order differs from the word order (ie. some
+ARM systems), regardless of the endian-ness of the stored values.
+
+=item 7.
+
+Rational values are treated as two separate integers.  The numerator always
+comes first regardless of the byte ordering.  In a signed rational value,
+only the numerator is signed.  The denominator of all rational values is
+unsigned (ie. a signed 64-bit rational of 0x80000000/0x80000000 evaluates to
+-1, not +1).
+
+=item 8.
+
+32-bit fixed point values are converted to floating point by treating them
+as an integer and dividing by an appropriate value.  ie)
+
+    16-bit fixed value = 16-bit integer value / 256.0
+    32-bit fixed value = 32-bit integer value / 65536.0
+
+=back
+
+=head3 TagLength
+
+Gives the length of the TagName string.  Any value between 0 and 255 is
+valid, but the TagLength of 0 is valid only for the MIE group terminator.
+
+=head3 DataLength
+
+DataLength is an unsigned byte that gives the number of bytes in the data
+block.  A value between 0 and 252 gives the data length directly, and
+numbers from 253 to 255 are reserved for extended DataLength codes.  Codes
+of 255, 254 and 253 indicate that the element contains an additional 2, 4 or
+8 byte unsigned integer representing the data length.
+
+    0-252      - length of data block
+    255 (0xff) - use DataLength2
+    254 (0xfe) - use DataLength4
+    253 (0xfd) - use DataLength8
+
+A DataLength of zero is valid for any element except a compressed MIE group.
+A zero DataLength for an uncompressed MIE group indicates that the group
+length is unknown.  For other elements, a zero length indicates there is no
+associated data.  A terminator element must have a DataLength of 0, 6 or 10,
+and may not use an extended DataLength.
+
+=head3 TagName
+
+The TagName string is 0 to 255 bytes long, and is composed of the ASCII
+characters A-Z, a-z, 0-9 and underline ('_').  Also, a dash ('-') is used to
+separate the language/country code in the TagName of a localized text
+string, and a units string (possibly containing other ASCII characters) may
+be appear in brackets at the end of the TagName.  The TagName string is NOT
+null terminated.  A MIE element with a tag string of zero length is reserved
+for the group terminator.
+
+MIE elements are sorted alphabetically by TagName within each group.
+Multiple elements with the same TagName are allowed, even within the same
+group.
+
+TagNames should be meaningful.  Case is significant.  Words should be
+lowercase with an uppercase first character, and acronyms should be all
+upper case.  The underline ("_") is provided to allow separation of two
+acronyms or two numbers, but it shouldn't be used unless necessary.  No
+separation is necessary between an acronym and a word (ie. "ISOSetting").
+
+All TagNames should start with an uppercase letter.  An exception to this
+rule allows tags to begin with a digit (0-9) if they must come before other
+tags in the sort order, or a lowercase letter (a-z) if they must come after.
+For instance, the '0Type' element begins with a digit so it comes before,
+and the 'data' element begins with a lowercase letter so that it comes after
+meta information tags in the main "0MIE" group.
+
+Tag names for localized text strings have an 6-character suffix with the
+following format:  The first character is a dash ('-'), followed by a
+2-character lower case ISO 639-1 language code, then an underline ('_'), and
+ending with a 2-character upper case ISO 3166-1 alpha 2 country code.  (ie.
+"-en_US", "-en_GB", "-de_DE" or "-fr_FR".  Note that "GB", and not "UK" is
+the code for Great Britain, although "UK" should be recognized for
+compatibility reasons.)  The suffix is included when sorting the tags
+alphabetically, so the default locale (with no tag-name suffix) always comes
+first.  If the country is unknown or not applicable, a country code of "XX"
+should be used.
+
+Tags with numerical values may allow units of measurement to be specified.
+The units string is stored in brackets at the end of the tag name, and is
+composed of zero or more ASCII characters in the range 0x21 to 0x7d,
+excluding the bracket characters 0x28 and 0x29.  (ie. "Resolution(/cm)" or
+"SpecificHeat(J/kg.K)".)  See L<Image::ExifTool::MIEUnits> for details. Unit
+strings are not localized, and may not be used in combination with localized
+text strings.
+
+Sets of tags which would require a common prefix should be added in a
+separate MIE group instead of adding the prefix to all tag names.  For
+example, instead of these TagName's:
+
+    ExternalFlashType
+    ExternalFlashSerialNumber
+    ExternalFlashFired
+
+one would instead designate a separate "ExternalFlash" MIE group to contain
+the following elements:
+
+    Type
+    SerialNumber
+    Fired
+
+=head3 DataLength2/4/8
+
+These extended DataLength fields exist only if DataLength is 255, 254 or
+253, and are respectively 2, 4 or 8 byte unsigned integers giving the data
+block length.  One of these values must be used if the data block is larger
+than 252 bytes, but they may be used if desired for smaller blocks too
+(although this may add a few unnecessary bytes to the MIE element).
+
+=head3 DataBlock
+
+The data value for the MIE element.  The format of the data is given by the
+FormatCode.  For MIE group elements, the data includes all contained
+elements and the group terminator.
+
+=head2 MIE groups
+
+All MIE data elements must be contained within a group.  A group begins with
+a MIE group element, and ends with a group terminator.  Groups may be nested
+in a hierarchy to arbitrary depth.
+
+A MIE group element is identified by a format code of 0x10 (big endian byte
+ordering) or 0x18 (little endian).  The group terminator is distinguished by
+a zero TagLength (it is the only element allowed to have a zero TagLength),
+and has a FormatCode of 0x00.
+
+The MIE group element is permitted to have a zero DataLength only if the
+data is uncompressed.  This special value indicates that the group length is
+unknown (otherwise the minimum value for DataLength is 4, corresponding the
+the minimum group size which includes a terminator of at least 4 bytes). If
+DataLength is zero, all elements in the group must be parsed until the group
+terminator is found.  If non-zero, DataLength includes the length of all
+elements contained within the group, including the group terminator.  Use of
+a non-zero DataLength is encouraged because it allows readers quickly skip
+over entire MIE groups.  For compressed groups DataLength must be non-zero,
+and is the length of the compressed group data (which includes the
+compressed group terminator).
+
+=head3 Group Terminator
+
+The group terminator has a FormatCode and TagLength of zero.  The terminator
+DataLength must be 0, 6 or 10 bytes, and extended DataLength codes may not
+be used.  With a zero DataLength, the byte sequence for a terminator is "7e
+00 00 00" (hex).  With a DataLength of 6 or 10 bytes, the terminator data
+block contains information about the length and byte ordering of the
+preceding group.  This additional information is recommended for file-level
+groups, and is used in multi-document MIE files and MIE trailers to allow
+the file to be scanned backwards from the end.  (This may also allow some
+documents to be recovered if part of the file is corrupted.)  The structure
+of this optional terminator data block is as follows:
+
+    4 or 8 bytes  GroupLength (unsigned integer)
+    1 byte        ByteOrder (0x10 or 0x18, same as MIE group)
+    1 byte        GroupLengthSize (0x04 or 0x08)
+
+The ByteOrder and GroupLengthSize values give the byte ordering and size of
+the GroupLength integer.  The GroupLength value is the total length of the
+entire MIE group ending with this terminator, including the opening MIE
+group element and the terminator itself.
+
+=head3 File-level MIE groups
+
+File-level MIE groups may NOT be compressed.
+
+All elements in a MIE file are contained within a special group with a
+TagName of "0MIE".  The purpose of the "OMIE" group is to provide a unique
+signature at the start of the file, and to encapsulate information allowing
+files to be easily combined.  The "0MIE" group must be terminated like any
+other group, but it is recommended that the terminator of a file-level group
+include the optional data block (defined above) to provide information about
+the group length and byte order.
+
+It is valid to have more than one "0MIE" group at the file level, allowing
+multiple documents in a single MIE file.  Furthermore, the MIE structure
+enables multi-document files to be generated by simply concatenating two or
+more MIE files.
+
+=head2 Scanning Backwards through a MIE File
+
+The steps below give an algorithm to quickly locate the last document in a
+MIE file:
+
+=over 4
+
+=item 1.
+
+Read the last 10 bytes of the file.  (Note that a valid MIE file may be as
+short as 12 bytes long, but a file this length contains only an an empty MIE
+group.)
+
+=item 2.
+
+If the last byte of the file is zero, then it is not possible to scan
+backward through the file, so the file must be scanned from the beginning.
+Otherwise, proceed to the next step.
+
+=item 3.
+
+If the last byte is 4 or 8, the terminator contains information about the
+byte ordering and length of the group.  Otherwise, stop here because this
+isn't a valid MIE file.
+
+=item 4.
+
+The next-to-last byte must be either 0x10 indicating big-endian byte
+ordering or 0x18 for little-endian ordering, otherwise this isn't a valid
+MIE file.
+
+=item 5.
+
+The value of the preceding 4 or 8 bytes gives the length of the complete
+file-level MIE group (GroupLength).  This length includes both the leading
+MIE group element and the terminator element itself.  The value is an
+unsigned integer with a byte length given in step 3), and a byte order from
+step 4).  From the current file position (at the end of the data read in
+step 1), seek backward by this number of bytes to find the start of the MIE
+group element for this document.
+
+=back
+
+This algorithm may be repeated again beginning at this point in the file to
+locate the next-to-last document, etc.
+
+The table below lists all 5 valid patterns for the last 14 bytes of a
+file-level MIE group, with all numbers in hex.  The comments indicate the
+length and byte ordering of GroupLength (xx) if available:
+
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 7e 00 00 00  - (no GroupLength)
+  ?? ?? ?? ?? 7e 00 00 06 xx xx xx xx 10 04  - 4 bytes, big endian
+  ?? ?? ?? ?? 7e 00 00 06 xx xx xx xx 18 04  - 4 bytes, little endian
+  7e 00 00 0a xx xx xx xx xx xx xx xx 10 08  - 8 bytes, big endian
+  7e 00 00 0a xx xx xx xx xx xx xx xx 18 08  - 8 bytes, little endian
+
+=head2 Trailer Signature
+
+The MIE format may be used for trailer information appended to other types
+of files.  When this is done, a signature must appear at the end of the main
+MIE group to uniquely identify the MIE format trailer.  To achieve this, a
+"zmie" trailer signature is written as the last element in the main "0MIE"
+group.  This element has a FormatCode of 0, a TagLength of 4, a DataLength
+of 0, and a TagName of "zmie".  With this signature, the hex byte sequence
+"7e 00 04 00 7a 6d 69 65" appears immediately before the final group
+terminator, and the last 22 bytes of the trailer correspond to one of the
+following 4 patterns (where the trailer length is given by "xx", as above):
+
+  ?? ?? ?? ?? 7e 00 04 00 7a 6d 69 65 7e 00 00 06 xx xx xx xx 10 04
+  ?? ?? ?? ?? 7e 00 04 00 7a 6d 69 65 7e 00 00 06 xx xx xx xx 18 04
+  7e 00 04 00 7a 6d 69 65 7e 00 00 0a xx xx xx xx xx xx xx xx 10 08
+  7e 00 04 00 7a 6d 69 65 7e 00 00 0a xx xx xx xx xx xx xx xx 18 08
+
+Note that the zero-DataLength terminator may not be used here because the
+trailer length must be known for seeking backwards from the end of the file.
+
+Multiple trailers may be appended to the same file using this technique.
+
+=head2 MIE Data Values
+
+MIE data values for a given tag are usually not restricted to a specific
+FormatCode.  Any value may be represented in any appropriate format,
+including numbers represented in string (ASCII or UTF) form.
+
+It is preferred that closely related values with the same format are written
+to a single tag instead of using multiple tags.  This improves localization
+of like values and decreases MIE element overhead.  For instance, instead of
+separate ImageWidth and ImageHeight tags, a single ImageSize tag is defined.
+
+Tags which may take on a discrete set of values should have meaningful
+values if possible.  This improves the extensibility of the format and
+allows a more reasonable interpretation of unrecognized values.
+
+=head3 Numerical Representation
+
+Integer and floating point numbers may be represented in binary or string
+form.  In string form, integers are a series of digits with an optional
+leading sign (ie. "[+|-]DDDDDD"), and multiple values are separated by a
+single space character (ie. "23 128 -32").  Floating point numbers are
+similar but may also contain a decimal point and/or a signed exponent with a
+leading 'e' character (ie. "[+|-]DD[.DDDDDD][e(+|-)EEE]").  The string "inf"
+is used to represent infinity.  One advantage of numerical strings is that
+they can have an arbitrarily high precision because the possible number of
+significant digits is virtually unlimited.
+
+Note that numerical values may have associated units of measurement which
+are specified in the L</TagName> string.
+
+=head3 Date/Time Format
+
+All MIE dates are strings in the form "YYYY:mm:dd HH:MM:SS.ss+HH:MM".  The
+fractional seconds (".ss") are optional, and if included may contain any
+number of significant digits (unlike all other fields which are a fixed
+number of digits and must be padded with leading zeros if necessary).  The
+timezone ("+HH:MM" or "-HH:MM") is recommended but not required.  If not
+given, the local system timezone is assumed.
+
+=head2 MIME Type
+
+The basic MIME type for a MIE file is "application/x-mie", however the
+specific MIME type depends on the type of subfile, and is obtained by adding
+"x-mie-" to the MIME type of the subfile.  For example, with a subfile of
+type "image/jpeg", the MIE file MIME type is "image/x-mie-jpeg".  But note
+that the "x-" is not duplicated if the subfile MIME type already starts with
+"x-".  So a subfile with MIME type "image/x-raw" is contained within a MIE
+file of type "image/x-mie-raw", not "image/x-mie-x-raw".  In the case of
+multiple documents in a MIE file, the MIME type is taken from the first
+document.  Regardless of the subfile type, all MIE-format files should have
+a filename extension of ".MIE".
+
+=head2 Levels of Support
+
+Basic MIE reader/writer applications may choose not to provide support for
+some advanced features of the MIE format.  Features which may not be
+supported by all software are:
+
+=over 4
+
+=item Compression
+
+Software not supporting compression must ignore compressed elements and
+groups, but should be able to process the remaining information.
+
+=item Large data lengths
+
+Some software may limit the maximum size of a MIE group or element.
+Historically, a limit of 2GB may be imposed by some systems.  However,
+8-byte data lengths should be supported by all applications provided the
+value doesn't exceed the system limit.  (ie. For systems with a 2GB limit,
+8-byte data lengths should be supported if the upper 17 bits are all zero.)
+If a data length above the system limit is encountered, it may be necessary
+for the application to stop processing if it can not seek to the next
+element in the file.
+
+=back
+
+=head1 EXAMPLES
+
+This section gives examples for working with MIE information using ExifTool.
+
+=head2 Encapsulating Information with Data in a MIE File
+
+The following command encapsulates any file recognized by ExifTool inside a
+MIE file, and initializes MIE tags from information within the file:
+
+    exiftool -o new.mie -tagsfromfile FILE '-mie:all<all' \
+        '-subfilename<filename' '-subfiletype<filetype' \
+        '-subfilemimetype<mimetype' '-subfiledata<=FILE'
+
+where C<FILE> is the name of the file.
+
+For unrecognized files, this command may be used:
+
+    exiftool -o new.mie -subfilename=FILE -subfiletype=TYPE \
+        -subfilemimetype=MIME '-subfiledata<=FILE'
+
+where C<TYPE> and C<MIME> represent the source file type and MIME type
+respectively.
+
+=head2 Adding a MIE Trailer to a File
+
+The MIE format may also be used to store information in a trailer appended
+to another type of file.  Beware that trailers may not be compatible with
+all file formats, but JPEG and TIFF are two formats where additional trailer
+information doesn't create any problems for normal parsing of the file.
+Also note that this technique has the disadvantage that trailer information
+is commonly lost if the file is subsequently edited by other software.
+
+Creating a MIE trailer with ExifTool is a two-step process since ExifTool
+can't currently be used to add a MIE trailer directly.  The example below
+illustrates the steps for adding a MIE trailer with a small preview image
+(C<small.jpg>) to a destination JPEG image (C<dst.jpg>).
+
+Step 1) Create a MIE file with a TrailerSignature containing the desired
+information:
+
+    exiftool -o new.mie -trailersignature=1 -tagsfromfile small.jpg \
+        '-previewimagetype<filetype' '-previewimagesize<imagesize' \
+        '-previewimagename<filename' '-previewimage<=small.jpg'
+
+Step 2) Append the MIE information to another file.  In Unix, this can be
+done with the 'cat' command:
+
+    cat new.mie >> dst.jpg
+
+Once added, ExifTool may be used to edit or delete a MIE trailer in a JPEG
+or TIFF image.
+
+=head2 Multiple MIE Documents in a Single File
+
+The MIE specification allows multiple MIE documents (or trailers) to exist
+in a single file.  A file like this may be created by simply concatenating
+MIE documents.  ExifTool may be used to access information in a specific
+document by adding a copy number to the MIE group name.  For example:
+
+    # write the Author tag in the second MIE document
+    exiftool -mie2:author=phil test.mie
+
+    # delete the first MIE document from a file
+    exiftool -mie1:all= test.mie
+
+=head2 Units of Measurement
+
+Some MIE tags allow values to be specified in different units of
+measurement.  In the MIE file format these units are combined with the tag
+name, but when using ExifTool they are specified in brackets after the
+value:
+
+    exiftool -mie:gpsaltitude='7500(ft)' test.mie
+
+If no units are provided, the default units are written.
+
+=head2 Localized Text
+
+Localized text values are accessed by adding a language/country code to the
+tag name.  For example:
+
+    exiftool -comment-en_us='this is a comment' test.mie
+
+=head1 REVISIONS
+
+  2010-04-05 - Fixed ÒFormat SizeÓ Note 7 to give the correct number of bits
+               in the example rational value
+  2007-01-21 - Specified LF character (0x0a) for text newline sequence
+  2007-01-19 - Specified ISO 8859-1 character set for extended ASCII codes
+  2007-01-01 - Improved wording of Step 5 for scanning backwards in MIE file
+  2006-12-30 - Added EXAMPLES section and note about UTF BOM
+  2006-12-20 - MIE 1.1:  Changed meaning of TypeModifier bit (0x08) for
+               unknown data (FormatType 0x00), and documented byte swapping
+  2006-12-14 - MIE 1.0:  Added Data Values and Numerical Representations
+               sections, and added ability to specify units in tag names
+  2006-11-09 - Added Levels of Support section
+  2006-11-03 - Added Trailer Signature
+  2005-11-18 - Original specification created
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.  The MIE format itself is also
+copyright Phil Harvey, and is covered by the same free-use license.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://owl.phy.queensu.ca/~phil/exiftool/MIE1.1-20070121.pdf>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/MIE Tags>, L<Image::ExifTool::MIEUnits>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/MIEUnits.pod
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/MIEUnits.pod	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/MIEUnits.pod	(revision 24799)
@@ -0,0 +1,377 @@
+
+=head1 NAME
+
+Image::ExifTool::MIEUnits - MIE units documentation
+
+=head1 DESCRIPTION
+
+The MIE format allows units of measurement to be specified in brackets at
+the end of a MIE tag name (ie. "Volume(m3)"). This document describes the
+standard MIE units abbreviations.
+
+=head1 SYNTAX
+
+The units string may contain any ASCII characters in the range 0x21 ('!') to
+0x7d ('}'), excepting the bracket characters (0x28 and 0x29).  An empty
+string is allowed, and indicates a dimensionless value.  L<Standard
+units|/STANDARD UNITS> should be used where possible.  In the standard
+units, an underline ('_') is used to indicate a subscript, and multiple
+words may be separated with a hyphen ('-').
+
+Exponents should be positive, and require no separator (ie. "m2" for square
+meters).  L<Prefixes|/PREFIXES> may be added to the standard units (ie.
+"cm") except when the resulting name conflicts with another standard unit.
+
+Multiplication is indicated by '.', and division by '/'.  Reciprocal units
+(ie. the multiplicative inverse) are obtained through division rather than
+the use of negative exponents (ie. "/in", not "in-1").  In MIE units,
+multiplication has precedence over division, so everything to the right of a
+'/' is in the denominator.  (See L</EXAMPLES> for a few examples.)
+
+Below is a table summarizing the special characters used in MIE units
+strings.
+
+  .           multiplication
+  /           division (used for negative exponents)
+  -           word separator
+  _           subscript
+  {}          annotation
+  []          used to avoid name conflicts if necessary
+  0-9         exponentiation
+
+=head1 STANDARD UNITS
+
+              dimensionless
+  [G]         Newtonian constant of gravitation (unclassified)
+  [g]         standard acceleration of free fall (acceleration)
+  [h]         Planck constant (action)
+  [k]         Boltzmann constant (unclassified)
+  {cfu}       colony forming units (number)
+  {rbc}       red blood cell count (number)
+  {tbl}       tablets (number)
+  {tot}       particles total count (number)
+  %           percent (fraction)
+  10^N        the number ten for arbitrary powers (number)
+  A           Ampere (electric current)
+  a           year (time)
+  a_g         mean Gregorian year (time)
+  a_j         mean Julian year (time)
+  a_t         tropical year (time)
+  acr         acre, U.S. (area)
+  acr_br      acre, British (area)
+  Ao          Angstrom (length)
+  APL-U       APL unit (biologic activity of anticardiolipin IgA)
+  ar          are (area)
+  arb-U       arbitrary unit (arbitrary)
+  arcmin      minute of arc (plane angle)
+  arcsec      second of arc (plane angle)
+  atm         standard atmosphere (pressure)
+  att         technical atmosphere (pressure)
+  AU          astronomic unit (length)
+  b           barn (action area)
+  B           bel (level)
+  B-kW        bel kilowatt (power level)
+  B-mV        bel millivolt (electric potential level)
+  B-SPL       bel sound pressure (pressure level)
+  B-uV        bel microvolt (electric potential level)
+  B-V         bel volt (electric potential level)
+  B-W         bel watt (power level)
+  bar         bar (pressure)
+  bbl         barrel (fluid volume)
+  Bd          baud (signal transmission rate)
+  bdsk-U      Bodansky unit (biologic activity of phosphatase)
+  beth-U      Bethesda unit (biologic activity of factor VIII inhibitor)
+  bf          board foot (volume)
+  Bi          Biot (electric current)
+  bit         bit (amount of information)
+  Bq          Becquerel (radioactivity)
+  Btu         British thermal unit (energy)
+  Btu_39      British thermal unit at 39 degF (energy)
+  Btu_59      British thermal unit at 59 degF (energy)
+  Btu_60      British thermal unit at 60 degF (energy)
+  Btu_IT      international table British thermal unit (energy)
+  Btu_m       mean British thermal unit (energy)
+  Btu_th      thermochemical British thermal unit (energy)
+  bu          bushel, U.S. (dry volume)
+  bu_br       bushel, British (volume)
+  By          byte (amount of information)
+  C           Coulomb (electric charge)
+  c           velocity of light (velocity)
+  cal         calorie (energy)
+  Cal         nutrition label Calories (energy)
+  cal_15      calorie at 15 degC (energy)
+  cal_20      calorie at 20 degC (energy)
+  cal_IT      international table calorie (energy)
+  cal_m       mean calorie (energy)
+  cal_th      thermochemical calorie (energy)
+  car_Au      carat of gold alloys (mass fraction)
+  car_m       metric carat (mass)
+  cd          candela (luminous intensity)
+  Cel         degree Celsius (temperature)
+  Ch          Charriere (gauge of catheters)
+  ch          Gunter's chain, U.S. (length)
+  ch_br       Gunter's chain, British (length)
+  Ci          Curie (radioactivity)
+  cicero      cicero (length)
+  circ        circle (plane angle)
+  cml         circular mil, international (area)
+  cr          cord, international (volume)
+  crd_us      cord, U.S. (fluid volume)
+  cup_us      cup (volume)
+  d           day (time)
+  deg         degree (plane angle)
+  deg{mag}    degree from magnetic north (plane angle)
+  degF        degree Fahrenheit (temperature)
+  didot       didot (length)
+  diop        diopter (refraction of a lens)
+  dpt         dry pint, U.S. (dry volume)
+  dqt         dry quart, U.S. (dry volume)
+  dr          dram (mass)
+  dr_ap       dram, apothecary (mass)
+  drp         drop (volume)
+  dye-U       Dye unit (biologic activity of amylase)
+  dyn         dyne (force)
+  e           elementary charge (electric charge)
+  eps_0       permittivity of vacuum (electric permittivity)
+  eq          equivalents (amount of substance)
+  erg         erg (energy)
+  eV          electronvolt (energy)
+  F           Farad (electric capacitance)
+  fdr         fluid dram, U.S. (fluid volume)
+  fdr_br      fluid dram, British (volume)
+  foz         fluid ounce, U.S. (fluid volume)
+  foz_br      fluid ounce, British (volume)
+  ft          foot, international (length)
+  ft_br       foot, British (length)
+  ft_us       foot, U.S. (length)
+  fth         fathom, international (length)
+  fth_br      fathom, British (length)
+  fth_us      fathom, U.S. (length)
+  fur         furlong, U.S. (length)
+  G           Gauss (magnetic flux density)
+  g           gram (mass)
+  g.m/{H-B}   gram meter per heartbeat (prop. to ventricular stroke work)
+  g%          gram percent (mass fraction)
+  Gal         Gal (acceleration)
+  gal         gallon, U.S. (fluid volume)
+  gal_br      gallon, British (volume)
+  gal_wi      historical winchester gallon (dry volume)
+  Gb          Gilbert (magnetic tension)
+  gf          gram-force (force)
+  gil         gill, U.S. (fluid volume)
+  gil_br      gill, British (volume)
+  gon         gon (plane angle)
+  GPL-U       GPL unit (biologic activity of anticardiolipin IgG)
+  gr          grain (mass)
+  Gy          Gray (energy dose)
+  H           Henry (inductance)
+  h           hour (time)
+  hd          hand, international (height of horses)
+  hnsf-U      Hounsfield unit (x-ray attenuation)
+  HP          horsepower (power)
+  hp_C        homeopathic potency of centesimal series (homeopathic potency)
+  hp_X        homeopathic potency of decimal series (homeopathic potency)
+  HPF         high power field (view area in microscope)
+  Hz          Herz (frequency)
+  in          inch, international (length)
+  in_br       inch, British (length)
+  in_us       inch, U.S. (length)
+  in-H2O      inch of water column (pressure)
+  in-Hg       inch of mercury column (pressure)
+  iU          international unit (arbitrary)
+  J           Joule (energy)
+  K           Kelvin (temperature)
+  ka-U        King-Armstrong unit (biologic activity of phosphatase)
+  kat         katal (catalytic activity)
+  kg{wet-tis} kilogram of wet tissue (mass)
+  kn          knot, international (velocity)
+  kn_br       knot, British (velocity)
+  knk-U       Kunkel unit (arbitrary biologic activity)
+  Ky          Kayser (lineic number)
+  l           liter (volume)
+  L           liter (volume)
+  lb          pound (mass)
+  lb_ap       pound, apothecary (mass)
+  lb_tr       pound, troy (mass)
+  lbf         pound force (force)
+  lcwt        long hunderdweight (mass)
+  ligne       ligne (length)
+  lk          link for Gunter's chain, U.S. (length)
+  lk_br       link for Gunter's chain, British (length)
+  lm          lumen (luminous flux)
+  Lmb         Lambert (brightness)
+  lne         line (length)
+  LPF         low power field (view area in microscope)
+  lton        long ton (mass)
+  lx          lux (illuminance)
+  ly          light-year (length)
+  m           meter (length)
+  m_e         electron mass (mass)
+  m_p         proton mass (mass)
+  m-H2O       meter of water column (pressure)
+  m-Hg        meter of mercury column (pressure)
+  mclg-U      Mac Lagan unit (arbitrary biologic activity)
+  mesh        mesh, international (lineic number)
+  MET         metabolic equivalent (metabolic cost of physical activity)
+  mg{creat}   milligram of creatinine (mass)
+  mho         mho (electric conductance)
+  mi          mile, international (statute mile) (length)
+  mi_br       mile, British (length)
+  mi_us       mile, U.S. (length)
+  mil         mil, international (length)
+  mil_us      mil, U.S. (length)
+  min         minute (time)
+  min_br      minim, British (volume)
+  min_us      minim, U.S. (fluid volume)
+  mo          month (time)
+  mo_g        mean Gregorian month (time)
+  mo_j        mean Julian month (time)
+  mo_s        synodal month (time)
+  mol         mole (amount of substance)
+  MPL-U       MPL unit (biologic activity of anticardiolipin IgM)
+  mu_0        permeability of vacuum (magnetic permeability)
+  Mx          Maxwell (flux of magnetic induction)
+  N           Newton (force)
+  nmi         nautical mile, international (length)
+  nmi_br      nautical mile, British (length)
+  Np          neper (level)
+  Oe          Oersted (magnetic field intensity)
+  Ohm         Ohm (electric resistance)
+  osm         osmole of dissolved particles (amount of substance)
+  oz          ounce (mass)
+  oz_ap       ounce, apothecary (mass)
+  oz_tr       ounce, troy (mass)
+  P           Poise (dynamic viscosity)
+  Pa          Pascal (pressure)
+  pc          parsec (length)
+  pc_br       pace (length)
+  pca         pica (length)
+  pca_pr      Printer's pica (length)
+  pH          pH (acidity)
+  ph          phot (illuminance)
+  pi          the number pi (number)
+  pied        pied (length)
+  pk          peck, U.S. (dry volume)
+  pk_br       peck, British (volume)
+  pnt         point (length)
+  pnt_pr      Printer's point (length)
+  pouce       pouce (length)
+  ppb         parts per billion (fraction)
+  ppm         parts per million (fraction)
+  ppth        parts per thousand (fraction)
+  pptr        parts per trillion (fraction)
+  PRU         peripheral vascular resistance unit (fluid resistance)
+  psi         pound per square inch (pressure)
+  pt          pint, U.S. (fluid volume)
+  pt_br       pint, British (volume)
+  pwt_tr      pennyweight (mass)
+  qt          quart, U.S. (fluid volume)
+  qt_br       quart, British (volume)
+  R           Roentgen (ion dose)
+  rad         radian (plane angle)
+  RAD         radiation absorbed dose (energy dose)
+  rch         Ramden's chain, U.S. (length)
+  rd          rod, U.S. (length)
+  rd_br       rod, British (length)
+  REM         radiation equivalent man (dose equivalent)
+  rlk_us      link for Ramden's chain (length)
+  s           second (time)
+  S           Siemens (electric conductance)
+  sb          stilb (lum. intensity density)
+  sc_ap       scruple, apothecary (mass)
+  sct         section (area)
+  scwt        short hundredweight (mass)
+  smgy-U      Somogyi unit (biologic activity of amylase)
+  sph         spere (solid angle)
+  sr          streadian (solid angle)
+  st          stere (volume)
+  St          Stokes (kinematic viscosity)
+  ston        short ton (mass)
+  stone       stone (mass)
+  Sv          Sievert (dose equivalent)
+  Sv-U        Svedberg unit (sedimentation coefficient)
+  T           Tesla (magnetic flux density)
+  t           tonne (mass)
+  tb-U        tuberculin unit (biologic activity of tuberculin)
+  tbs         tablespoon, U.S. (volume)
+  todd-U      Todd unit (biologic activity antistreptolysin O)
+  tsp         teaspoon, U.S. (volume)
+  twp         township (area)
+  u           unified atomic mass unit (mass)
+  U           Unit (catalytic activity)
+  USP-U       U.S. Pharmacopeia unit (arbitrary)
+  V           Volt (electric potential)
+  W           Watt (power)
+  Wb          Weber (magnetic flux)
+  wk          week (time)
+  yd          yard, international (length)
+  yd_br       yard, British (length)
+  yd_us       yard, U.S. (length)
+
+=head1 PREFIXES
+
+Standard SI prefixes:
+
+  y           yocto (10^-24)
+  z           zepto (10^-21)
+  a           atto  (10^-18)
+  f           femto (10^-15)
+  p           pico  (10^-12)
+  n           nano  (10^-9)
+  u           micro (10^-6)
+  m           milli (10^-3)
+  c           centi (10^-2)
+  d           deci  (10^-1)
+  da          deka  (10)
+  h           hecto (10^2)
+  k           kilo  (10^3)
+  G           giga  (10^9)
+  M           mega  (10^6)
+  T           tera  (10^12)
+  P           peta  (10^15)
+  E           exa   (10^18)
+  Z           zetta (10^21)
+  Y           yotta (10^24)
+
+Binary power prefixes:
+
+  Ki          kibi  (2^10)
+  Mi          mebi  (2^20)
+  Gi          gibi  (2^30)
+  Ti          tebi  (2^40)
+
+=head1 EXAMPLES
+
+A few examples of combined units strings:
+
+  /cm3        per cubic centimeter
+  in2         square inches
+  kg.m/s2     Newtons (N)
+  m3/kg.s2    units of [G]
+  10^100      googols
+
+=head1 HISTORY
+
+  2006-12-14 - PH Created
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://aurora.regenstrief.org/UCUM/>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::MIE(3pm)|Image::ExifTool::MIE>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/MIFF.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/MIFF.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/MIFF.pm	(revision 24799)
@@ -0,0 +1,279 @@
+#------------------------------------------------------------------------------
+# File:         MIFF.pm
+#
+# Description:  Read Magick Image File Format meta information
+#
+# Revisions:    06/10/2005 - P. Harvey Created
+#
+# References:   1) http://www.imagemagick.org/script/miff.php
+#               2) http://www.cs.uni.edu/Help/ImageMagick/www/miff.html
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::MIFF;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.05';
+
+# MIFF chunks
+%Image::ExifTool::MIFF::Main = (
+    GROUPS => { 2 => 'Image' },
+    NOTES => q{
+        The MIFF (Magick Image File Format) format allows aribrary tag names to be
+        used.  Only the standard tag names are listed below, however ExifTool will
+        decode any tags found in the image.
+    },
+   'background-color' => 'BackgroundColor',
+   'blue-primary' => 'BluePrimary',
+   'border-color' => 'BorderColor',
+   'matt-color' => 'MattColor',
+    class => 'Class',
+    colors => 'Colors',
+    colorspace => 'Colorspace',
+    columns => 'ImageWidth',
+    compression => 'Compression',
+    delay => 'Delay',
+    depth => 'Depth',
+    dispose => 'Dispose',
+    gamma => 'Gamma',
+   'green-primary' => 'GreenPrimary',
+    id => 'ID',
+    iterations => 'Iterations',
+    label => 'Label',
+    matte => 'Matte',
+    montage => 'Montage',
+    packets => 'Packets',
+    page => 'Page',
+    # profile tags.  Note the SubDirectory is not used by ProcessMIFF(),
+    # but is inserted for documentation purposes only
+   'profile-APP1' => [
+        # [this list is just for the sake of the documentation]
+        {
+            Name => 'APP1_Profile',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Exif::Main',
+            },
+        },
+        {
+            Name => 'APP1_Profile',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::XMP::Main',
+            },
+        },
+    ],
+   'profile-exif' => { # haven't seen this, but it would make sense - PH
+        Name => 'EXIF_Profile',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Exif::Main',
+        },
+    },
+   'profile-icc' => {
+        Name => 'ICC_Profile',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::ICC_Profile::Main',
+        },
+    },
+   'profile-iptc' => {
+        Name => 'IPTC_Profile',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Photoshop::Main',
+        },
+    },
+   'profile-xmp' => { # haven't seen this, but it would make sense - PH
+        Name => 'XMP_Profile',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::XMP::Main',
+        },
+    },
+   'red-primary' => 'RedPrimary',
+   'rendering-intent' => 'RenderingIntent',
+    resolution => 'Resolution',
+    rows => 'ImageHeight',
+    scene => 'Scene',
+    signature => 'Signature',
+    units => 'Units',
+   'white-point' => 'WhitePoint',
+);
+
+#------------------------------------------------------------------------------
+# Extract meta information from a MIFF image
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 on success, 0 if this wasn't a valid MIFF image
+sub ProcessMIFF($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my $verbose = $exifTool->{OPTIONS}->{Verbose};
+    my ($hdr, $buff);
+
+    # validate the MIFF file (note: MIFF files _may_ begin with other
+    # characters, but this starting sequence is strongly suggested.)
+    return 0 unless $raf->Read($hdr, 14) == 14;
+    return 0 unless $hdr eq 'id=ImageMagick';
+    $exifTool->SetFileType();   # set the FileType tag
+
+    # set end-of-line character sequence to read to end of the TEXT
+    # section for new-type MIFF files (text ends with Colon+Ctrl-Z)
+    # Old MIFF files end with Colon+Linefeed, so this will likely
+    # slurp those entire files, which will be slower, but will work
+    # OK except that the profile information won't be decoded
+    local $/ = ":\x1a";
+
+    my $mode = '';
+    my @profiles;
+    if ($raf->ReadLine($buff)) {
+        chomp $buff;    # remove end-of-line chars
+        my $tagTablePtr = GetTagTable('Image::ExifTool::MIFF::Main');
+        my @entries = split ' ', $buff;
+        unshift @entries, $hdr; # put the ID back in
+        my ($tag, $val);
+        foreach (@entries) {
+            if ($mode eq 'com') {
+                $mode = '' if /\}$/;
+                next;
+            } elsif (/^\{/) {
+                $mode = 'com';  # read to the end of the comment
+                next;
+            }
+            if ($mode eq 'val') {
+                $val .= " $_";  # join back together with a space
+                next unless /\}$/;
+                $mode = '';
+                $val =~ s/(^\{|\}$)//g; # remove braces
+            } elsif (/(.+)=(.+)/) {
+                ($tag, $val) = ($1, $2);
+                if ($val =~ /^\{/) {
+                    $mode = 'val';      # read to the end of the value data
+                    next;
+                }
+            } elsif (/^:/) {
+                # this could be the end of an old-style MIFF file
+                last;
+            } else {
+                # something we don't recognize -- stop parsing here
+                $exifTool->Warn('Unrecognized MIFF data');
+                last;
+            }
+            my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+            unless ($tagInfo) {
+                $tagInfo = { Name => $tag };
+                Image::ExifTool::AddTagToTable($tagTablePtr, $tag, $tagInfo);
+            }
+            $verbose and $exifTool->VerboseInfo($tag, $tagInfo,
+                Table  => $tagTablePtr,
+                DataPt => \$val,
+            );
+            # handle profile tags specially
+            if ($tag =~ /^profile-(.*)/) {
+                push @profiles, [$1, $val];
+            } else {
+                $exifTool->FoundTag($tagInfo, $val);
+            }
+        }
+    }
+
+    # process profile information
+    foreach (@profiles) {
+        my ($type, $len) = @{$_};
+        unless ($len =~ /^\d+$/) {
+            $exifTool->Warn("Invalid length for $type profile");
+            last;   # don't try to read the rest
+        }
+        unless ($raf->Read($buff, $len) == $len) {
+            $exifTool->Warn("Error reading $type profile ($len bytes)");
+            next;
+        }
+        my $processed = 0;
+        my %dirInfo = (
+            Parent   => 'PNG',
+            DataPt   => \$buff,
+            DataPos  => $raf->Tell() - $len,
+            DataLen  => $len,
+            DirStart => 0,
+            DirLen   => $len,
+        );
+        if ($type eq 'icc') {
+            # ICC Profile information
+            my $tagTablePtr = GetTagTable('Image::ExifTool::ICC_Profile::Main');
+            $processed = $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+        } elsif ($type eq 'iptc') {
+            if ($buff =~ /^8BIM/) {
+                # Photoshop information
+                my $tagTablePtr = GetTagTable('Image::ExifTool::Photoshop::Main');
+                $processed = $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+            }
+        # I haven't seen 'exif' or 'xmp' profile types yet, but I have seen them
+        # in newer PNG files so presumably they are possible here as well - PH
+        } elsif ($type eq 'APP1' or $type eq 'exif' or $type eq 'xmp') {
+            if ($buff =~ /^$Image::ExifTool::exifAPP1hdr/) {
+                # APP1 EXIF
+                my $hdrLen = length($Image::ExifTool::exifAPP1hdr);
+                $dirInfo{DirStart} += $hdrLen;
+                $dirInfo{DirLen} -= $hdrLen;
+                # use the usual position for EXIF data: 12 bytes from start of file
+                # (this may be wrong, but I can't see where the PNG stores this information)
+                $dirInfo{Base} = 12; # this is the usual value
+                $processed = $exifTool->ProcessTIFF(\%dirInfo);
+            } elsif ($buff =~ /^$Image::ExifTool::xmpAPP1hdr/) {
+                # APP1 XMP
+                my $hdrLen = length($Image::ExifTool::xmpAPP1hdr);
+                my $tagTablePtr = GetTagTable('Image::ExifTool::XMP::Main');
+                $dirInfo{DirStart} += $hdrLen;
+                $dirInfo{DirLen} -= $hdrLen;
+                $processed = $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+            }
+        }
+        unless ($processed) {
+            $exifTool->Warn("Unknown MIFF $type profile data");
+            if ($verbose) {
+                $exifTool->VerboseDir($type, 0, $len);
+                $exifTool->VerboseDump(\$buff);
+            }
+         }
+    }
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::MIFF - Read Magick Image File Format meta information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains routines required by Image::ExifTool to read MIFF
+(Magick Image File Format) images.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.imagemagick.org/script/miff.php>
+
+=item L<http://www.cs.uni.edu/Help/ImageMagick/www/miff.html>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/MIFF Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/MNG.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/MNG.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/MNG.pm	(revision 24799)
@@ -0,0 +1,684 @@
+#------------------------------------------------------------------------------
+# File:         MNG.pm
+#
+# Description:  MNG and JNG meta information tags
+#
+# Revisions:    06/23/2005 - P. Harvey Created
+#
+# References:   1) http://www.libpng.org/pub/mng/
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::MNG;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.00';
+
+# MNG chunks
+%Image::ExifTool::MNG::Main = (
+    GROUPS => { 2 => 'Image' },
+    NOTES => q{
+        This table contains definitions for tags found in MNG and JNG images.  MNG
+        is a superset of PNG and JNG, so a MNG image may contain any of these tags
+        as well as any PNG tags.  Conversely, only some of these tags are valid for
+        JNG images.
+    },
+    BACK => {
+        Name => 'Background',
+        SubDirectory => { TagTable => 'Image::ExifTool::MNG::Background' },
+    },
+    BASI => {
+        Name => 'BasisObject',
+        SubDirectory => { TagTable => 'Image::ExifTool::MNG::BasisObject' },
+    },
+    CLIP => {
+        Name => 'ClipObjects',
+        SubDirectory => { TagTable => 'Image::ExifTool::MNG::ClipObjects' },
+    },
+    CLON => {
+        Name => 'CloneObject',
+        SubDirectory => { TagTable => 'Image::ExifTool::MNG::CloneObject' },
+    },
+    DBYK => {
+        Name => 'DropByKeyword',
+        Binary => 1,
+    },
+    DEFI => {
+        Name => 'DefineObject',
+        SubDirectory => { TagTable => 'Image::ExifTool::MNG::DefineObject' },
+    },
+    DHDR => {
+        Name => 'DeltaPNGHeader',
+        SubDirectory => { TagTable => 'Image::ExifTool::MNG::DeltaPNGHeader' },
+    },
+    DISC => {
+        Name => 'DiscardObjects',
+        ValueConv => 'join(" ",unpack("n*",$val))',
+    },
+    DROP => {
+        Name => 'DropChunks',
+        ValueConv => 'join(" ",$val=~/..../g)',
+    },
+#   ENDL
+    eXPi => {
+        Name => 'ExportImage',
+        SubDirectory => { TagTable => 'Image::ExifTool::MNG::ExportImage' },
+    },
+    fPRI => {
+        Name => 'FramePriority',
+        SubDirectory => { TagTable => 'Image::ExifTool::MNG::FramePriority' },
+    },
+    FRAM => {
+        Name => 'Frame',
+        Binary => 1,
+    },
+#   IJNG
+#   IPNG
+#   JDAA (JNG)
+#   JDAT (JNG)
+    JHDR => { # (JNG)
+        Name => 'JNGHeader',
+        SubDirectory => { TagTable => 'Image::ExifTool::MNG::JNGHeader' },
+    },
+#   JSEP (JNG)
+    LOOP => {
+        Name => 'Loop',
+        SubDirectory => { TagTable => 'Image::ExifTool::MNG::Loop' },
+    },
+    MAGN => {
+        Name => 'MagnifyObject',
+        SubDirectory => { TagTable => 'Image::ExifTool::MNG::MagnifyObject' },
+    },
+#   MEND
+    MHDR => {
+        Name => 'MNGHeader',
+        SubDirectory => { TagTable => 'Image::ExifTool::MNG::MNGHeader' },
+    },
+    MOVE => {
+        Name => 'MoveObjects',
+        SubDirectory => { TagTable => 'Image::ExifTool::MNG::MoveObjects' },
+    },
+    nEED => {
+        Name => 'ResourcesNeeded',
+        Binary => 1,
+    },
+    ORDR => {
+        Name => 'OrderingRestrictions',
+        Binary => 1,
+    },
+    PAST => {
+        Name => 'PasteImage',
+        SubDirectory => { TagTable => 'Image::ExifTool::MNG::PasteImage' },
+    },
+    pHYg => {
+        Name => 'GlobalPixelSize',
+        SubDirectory => { TagTable => 'Image::ExifTool::PNG::PhysicalPixel' },
+    },
+    PPLT => {
+        Name => 'PartialPalette',
+        Binary => 1,
+    },
+    PROM => {
+        Name => 'PromoteParent',
+        SubDirectory => { TagTable => 'Image::ExifTool::MNG::PromoteParent' },
+    },
+    SAVE => {
+        Name => 'SaveObjects',
+        Binary => 1,
+    },
+    SEEK => {
+        Name => 'SeekPoint',
+        ValueConv => '$val=~s/\0.*//s; $val',
+    },
+    SHOW => {
+        Name => 'ShowObjects',
+        SubDirectory => { TagTable => 'Image::ExifTool::MNG::ShowObjects' },
+    },
+    TERM => {
+        Name => 'TerminationAction',
+        SubDirectory => { TagTable => 'Image::ExifTool::MNG::TerminationAction' },
+    },
+);
+
+# MNG MHDR chunk
+%Image::ExifTool::MNG::MNGHeader = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    FORMAT => 'int32u',
+    0 => 'ImageWidth',
+    1 => 'ImageHeight',
+    2 => 'TicksPerSecond',
+    3 => 'NominalLayerCount',
+    4 => 'NominalFrameCount',
+    5 => 'NominalPlayTime',
+    6 => {
+        Name => 'SimplicityProfile',
+        PrintConv => 'sprintf("0x%.8x", $val)',
+    },
+);
+
+# MNG BASI chunk
+%Image::ExifTool::MNG::BasisObject = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    0 => {
+        Name => 'ImageWidth',
+        Format => 'int32u',
+    },
+    4 => {
+        Name => 'ImageHeight',
+        Format => 'int32u',
+    },
+    8 => 'BitDepth',
+    9 => {
+        Name => 'ColorType',
+        RawConv => '$Image::ExifTool::PNG::colorType = $val',
+        PrintConv => {
+            0 => 'Grayscale',
+            2 => 'RGB',
+            3 => 'Palette',
+            4 => 'Grayscale with Alpha',
+            6 => 'RGB with Alpha',
+        },
+    },
+    10 => {
+        Name => 'Compression',
+        PrintConv => { 0 => 'Deflate/Inflate' },
+    },
+    11 => {
+        Name => 'Filter',
+        PrintConv => { 0 => 'Adaptive' },
+    },
+    12 => {
+        Name => 'Interlace',
+        PrintConv => { 0 => 'Noninterlaced', 1 => 'Adam7 Interlace' },
+    },
+    13 => {
+        Name => 'RedSample',
+        Format => 'int32u',
+    },
+    17 => {
+        Name => 'GreenSample',
+        Format => 'int32u',
+    },
+    21 => {
+        Name => 'BlueSample',
+        Format => 'int32u',
+    },
+    25 => {
+        Name => 'AlphaSample',
+        Format => 'int32u',
+    },
+    26 => 'Viewable',
+);
+
+# MNG LOOP chunk
+%Image::ExifTool::MNG::Loop = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    0 => 'NestLevel',
+    1 => {
+        Name => 'IterationCount',
+        Format => 'int32u',
+    },
+    5 => {
+        Name => 'TerminationCondition',
+        PrintConv => {
+            0 => 'Deterministic, not cacheable',
+            1 => 'Decoder discretion, not cacheable',
+            2 => 'User discretion, not cacheable',
+            3 => 'External signal, not cacheable',
+            4 => 'Deterministic, cacheable',
+            5 => 'Decoder discretion, cacheable',
+            6 => 'User discretion, cacheable',
+            7 => 'External signal, cacheable',
+        },
+    },
+    6 => {
+        Name => 'IterationMinMax',
+        Format => 'int32u[2]',
+    },
+    14 => {
+        Name => 'SignalNumber',
+        Format => 'int32u',
+    },
+);
+
+# MNG DEFI chunk
+%Image::ExifTool::MNG::DefineObject = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    0 => {
+        Name => 'ObjectID',
+        Format => 'int16u',
+    },
+    2 => 'DoNotShow',
+    3 => 'ConcreteFlag',
+    4 => {
+        Name => 'XYLocation',
+        Format => 'int32u[2]',
+    },
+    12 => {
+        Name => 'ClippingBoundary',
+        Format => 'int32u[4]',
+    },
+);
+
+# MNG CLON chunk
+%Image::ExifTool::MNG::CloneObject = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    0 => {
+        Name => 'SourceID',
+        Format => 'int16u',
+    },
+    2 => {
+        Name => 'CloneID',
+        Format => 'int16u',
+    },
+    4 => {
+        Name => 'CloneType',
+        PrintConv => { 0 => 'Full', 1 => 'Parital', 2 => 'Renumber object' },
+    },
+    5 => 'DoNotShow',
+    6 => 'ConcreteFlag',
+    7 => {
+        Name => 'LocalDeltaType',
+        PrintConv => { 0 => 'Absolute', 1 => 'Relative' },
+    },
+    8 => {
+        Name => 'DeltaXY',
+        Format => 'int32u[2]',
+    },
+);
+
+# MNG PAST chunk
+%Image::ExifTool::MNG::PasteImage = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    0 => {
+        Name => 'DestinationID',
+        Format => 'int16u',
+    },
+    2 => {
+        Name => 'TargetDeltaType',
+        PrintConv => { 0 => 'Absolute', 1 => 'Relative' },
+    },
+    3 => {
+        Name => 'TargetXY',
+        Format => 'int32u[2]',
+    },
+    11 => {
+        Name => 'SourceID',
+        Format => 'int16u',
+    },
+    13 => {
+        Name => 'CompositionMode',
+        PrintConv => { 0 => 'Over', 1 => 'Replace', 2 => 'Under' },
+    },
+    14 => {
+        Name => 'Orientation',
+        PrintConv => {
+            0 => 'Same as source',
+            2 => 'Flipped left-right, then up-down',
+            4 => 'Flipped left-right',
+            6 => 'Flipped up-down',
+            8 => 'Tiled',
+        },
+    },
+    15 => {
+        Name => 'OffsetOrigin',
+        PrintConv => { 0 => 'Desination Origin', 1 => 'Target Origin' },
+    },
+    16 => {
+        Name => 'OffsetXY',
+        Format => 'int32u[2]',
+    },
+    24 => {
+        Name => 'BoundaryOrigin',
+        PrintConv => { 0 => 'Desination Origin', 1 => 'Target Origin' },
+    },
+    25 => {
+        Name => 'PastClippingBoundary',
+        Format => 'int32u[4]',
+    },
+);
+
+my %magMethod = (
+    0 => 'No Magnification',
+    1 => 'Pixel Replication',
+    2 => 'Linear Interpolation',
+    3 => 'Closest Pixel',
+    4 => 'Color Linear Interpolation and Alpha Closest Pixel',
+    5 => 'Color Closest Pixel and Alpha Linear Interpolation',
+);
+
+# MNG MAGN chunk
+%Image::ExifTool::MNG::MagnifyObject = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    0 => {
+        Name => 'FirstObjectID',
+        Format => 'int16u',
+    },
+    2 => {
+        Name => 'LastObjectID',
+        Format => 'int16u',
+    },
+    4 => {
+        Name => 'XMethod',
+        PrintConv => \%magMethod,
+    },
+    5 => {
+        Name => 'XMag',
+        Format => 'int16u',
+    },
+    7 => {
+        Name => 'YMag',
+        Format => 'int16u',
+    },
+    9 => {
+        Name => 'LeftMag',
+        Format => 'int16u',
+    },
+    11 => {
+        Name => 'RightMag',
+        Format => 'int16u',
+    },
+    13 => {
+        Name => 'TopMag',
+        Format => 'int16u',
+    },
+    15 => {
+        Name => 'BottomMag',
+        Format => 'int16u',
+    },
+    17 => {
+        Name => 'YMethod',
+        PrintConv => \%magMethod,
+    },
+);
+
+# MNG TERM chunk
+%Image::ExifTool::MNG::TerminationAction = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    0 => {
+        Name => 'TerminationAction',
+        PrintConv => {
+            0 => 'Show Last Frame',
+            1 => 'Display Nothing',
+            2 => 'Show First Frame',
+            3 => 'Repeat Sequence',
+        },
+    },
+    1 => {
+        Name => 'IterationEndAction',
+        PrintConv => {
+            0 => 'Show Last Frame',
+            1 => 'Display Nothing',
+            2 => 'Show First Frame',
+        },
+    },
+    2 => {
+        Name => 'Delay',
+        Format => 'int32u',
+    },
+    6 => {
+        Name => 'IterationMax',
+        Format => 'int32u',
+    },
+);
+
+# MNG BACK chunk
+%Image::ExifTool::MNG::Background = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    0 => {
+        Name => 'BackgroundColor',
+        Format => 'int16u[3]',
+    },
+    6 => {
+        Name => 'MandatoryBackground',
+        PrintConv => {
+            0 => 'Color and Image Advisory',
+            1 => 'Color Mandatory, Image Advisory',
+            2 => 'Color Advisory, Image Mandatory',
+            3 => 'Color and Image Mandatory',
+        },
+    },
+    7 => {
+        Name => 'BackgroundImageID',
+        Format => 'int16u',
+    },
+    9 => {
+        Name => 'BackgroundTiling',
+        PrintConv => { 0 => 'No', 1 => 'Yes' },
+    },
+);
+
+# MNG MOVE chunk
+%Image::ExifTool::MNG::MoveObjects = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    0 => {
+        Name => 'FirstObject',
+        Format => 'int16u',
+    },
+    2 => {
+        Name => 'LastObject',
+        Format => 'int16u',
+    },
+    4 => {
+        Name => 'DeltaType',
+        PrintConv => { 0 => 'Absolute', 1 => 'Relative' },
+    },
+    5 => {
+        Name => 'DeltaXY',
+        Format => 'int32u[2]',
+    },
+);
+
+# MNG CLIP chunk
+%Image::ExifTool::MNG::ClipObjects = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    0 => {
+        Name => 'FirstObject',
+        Format => 'int16u',
+    },
+    2 => {
+        Name => 'LastObject',
+        Format => 'int16u',
+    },
+    4 => {
+        Name => 'DeltaType',
+        PrintConv => { 0 => 'Absolute', 1 => 'Relative' },
+    },
+    5 => {
+        Name => 'ClipBoundary',
+        Format => 'int32u[4]',
+    },
+);
+
+# MNG SHOW chunk
+%Image::ExifTool::MNG::ShowObjects = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    0 => {
+        Name => 'FirstObject',
+        Format => 'int16u',
+    },
+    2 => {
+        Name => 'LastObject',
+        Format => 'int16u',
+    },
+    4 => 'ShowMode',
+);
+
+# MNG eXPI chunk
+%Image::ExifTool::MNG::ExportImage = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    0 => {
+        Name => 'SnapshotID',
+        Format => 'int16u',
+    },
+    2 => {
+        Name => 'SnapshotName',
+        Format => 'string',
+    },
+);
+
+# MNG fPRI chunk
+%Image::ExifTool::MNG::FramePriority = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    0 => {
+        Name => 'DeltaType',
+        PrintConv => { 0 => 'Absolute', 1 => 'Relative' },
+    },
+    2 => 'Priority',
+);
+
+# MNG DHDR chunk
+%Image::ExifTool::MNG::DeltaPNGHeader = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    0 => {
+        Name => 'ObjectID',
+        Format => 'int16u',
+    },
+    2 => {
+        Name => 'ImageType',
+        PrintConv => {
+            0 => 'Unspecified',
+            1 => 'PNG',
+            2 => 'JNG',
+        },
+    },
+    3 => {
+        Name => 'DeltaType',
+        PrintConv => {
+            0 => 'Full Replacement',
+            1 => 'Pixel Addition',
+            2 => 'Alpha Addition',
+            3 => 'Color Addition',
+            4 => 'Pixel Replacement',
+            5 => 'Alpha Replacement',
+            6 => 'Color Replacement',
+            7 => 'No Change',
+        },
+    },
+    4 => {
+        Name => 'BlockSize',
+        Format => 'int32u[2]',
+    },
+    12 => {
+        Name => 'BlockLocation',
+        Format => 'int32u[2]',
+    },
+);
+
+# MNG PROM chunk
+%Image::ExifTool::MNG::PromoteParent = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    0 => 'NewColorType',
+    1 => 'NewBitDepth',
+    2 => {
+        Name => 'FillMethod',
+        PrintConv => { 0 => 'Bit Replication', 1 => 'Zero Fill' },
+    },
+);
+
+# JNG JHDR chunk
+%Image::ExifTool::MNG::JNGHeader = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    0 => {
+        Name => 'ImageWidth',
+        Format => 'int32u',
+    },
+    4 => {
+        Name => 'ImageHeight',
+        Format => 'int32u',
+    },
+    8 => {
+        Name => 'ColorType',
+        PrintConv => {
+            8 => 'Gray',
+            10 => 'Color',
+            12 => 'Gray Alpha',
+            14 => 'Color Alpha',
+        },
+    },
+    9 => 'BitDepth',
+    10 => {
+        Name => 'Compression',
+        PrintConv => { 8 => 'Huffman-coded baseline JPEG' },
+    },
+    11 => {
+        Name => 'Interlace',
+        PrintConv => { 0 => 'Sequential', 8 => 'Progressive' },
+    },
+    12 => 'AlphaBitDepth',
+    13 => {
+        Name => 'AlphaCompression',
+        PrintConv => {
+            0 => 'MNG Grayscale IDAT',
+            8 => 'JNG 8-bit Grayscale JDAA',
+        },
+    },
+    14 => {
+        Name => 'AlphaFilter',
+        PrintConv => { 0 => 'Adaptive MNG (N/A for JPEG)' },
+    },
+    15 => {
+        Name => 'AlphaInterlace',
+        PrintConv => { 0 => 'Noninterlaced' },
+    },
+);
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::MNG - MNG and JNG meta information tags
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to read MNG
+(Multi-image Network Graphics) and JNG (JPEG Network Graphics) images.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.libpng.org/pub/mng/>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/MNG Tags>,
+L<Image::ExifTool::TagNames/PNG Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/MPC.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/MPC.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/MPC.pm	(revision 24799)
@@ -0,0 +1,156 @@
+#------------------------------------------------------------------------------
+# File:         MPC.pm
+#
+# Description:  Read Musepack audio meta information
+#
+# Revisions:    11/14/2006 - P. Harvey Created
+#
+# References:   1) http://www.musepack.net/
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::MPC;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::FLAC;
+
+$VERSION = '1.00';
+
+# MPC metadata blocks
+%Image::ExifTool::MPC::Main = (
+    PROCESS_PROC => \&Image::ExifTool::FLAC::ProcessBitStream,
+    GROUPS => { 2 => 'Audio' },
+    NOTES => q{
+        Tags used in Musepack (MPC) audio files.  ExifTool also extracts ID3 and APE
+        information from these files.
+    },
+    'Bit032-063' => 'TotalFrames',
+    'Bit080-081' => {
+        Name => 'SampleRate',
+        PrintConv => {
+            0 => 44100,
+            1 => 48000,
+            2 => 37800,
+            3 => 32000,
+        },
+    },
+    'Bit084-087' => {
+        Name => 'Quality',
+        PrintConv => {
+             1 => 'Unstable/Experimental',
+             5 => '0',
+             6 => '1',
+             7 => '2 (Telephone)',
+             8 => '3 (Thumb)',
+             9 => '4 (Radio)',
+            10 => '5 (Standard)',
+            11 => '6 (Xtreme)',
+            12 => '7 (Insane)',
+            13 => '8 (BrainDead)',
+            14 => '9',
+            15 => '10',
+       },
+    },
+    'Bit088-093' => 'MaxBand',
+    'Bit096-111' => 'ReplayGainTrackPeak',
+    'Bit112-127' => 'ReplayGainTrackGain',
+    'Bit128-143' => 'ReplayGainAlbumPeak',
+    'Bit144-159' => 'ReplayGainAlbumGain',
+    'Bit179' => {
+        Name => 'FastSeek',
+        PrintConv => { 0 => 'No', 1 => 'Yes' },
+    },
+    'Bit191' => {
+        Name => 'Gapless',
+        PrintConv => { 0 => 'No', 1 => 'Yes' },
+    },
+    'Bit216-223' => {
+        Name => 'EncoderVersion',
+        PrintConv => '$val =~ s/(\d)(\d)(\d)$/$1.$2.$3/; $val',
+    },
+);
+
+#------------------------------------------------------------------------------
+# Extract information from an MPC file
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# - Just looks for MPC trailer if FileType is already set
+# Returns: 1 on success, 0 if this wasn't a valid MPC file
+sub ProcessMPC($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+
+    # must first check for leading ID3 information
+    unless ($exifTool->{DoneID3}) {
+        require Image::ExifTool::ID3;
+        Image::ExifTool::ID3::ProcessID3($exifTool, $dirInfo) and return 1;
+    }
+    my $raf = $$dirInfo{RAF};
+    my $buff;
+
+    # check MPC signature
+    $raf->Read($buff, 32) == 32 and $buff =~ /^MP\+(.)/s or return 0;
+    my $vers = ord($1) & 0x0f;
+    $exifTool->SetFileType();
+
+    # extract audio information (currently only from version 7 MPC files)
+    if ($vers == 0x07) {
+        SetByteOrder('II');
+        my $pos = $raf->Tell() - 32;
+        if ($exifTool->Options('Verbose')) {
+            $exifTool->VPrint(0, "MPC Header (32 bytes):\n");
+            $exifTool->VerboseDump(\$buff, DataPos => $pos);
+        }
+        my $tagTablePtr = GetTagTable('Image::ExifTool::MPC::Main');
+        my %dirInfo = ( DataPt => \$buff, DataPos => $pos );
+        $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+    } else {
+        $exifTool->Warn('Audio info not currently extracted from this version MPC file');
+    }
+
+    # process APE trailer if it exists
+    require Image::ExifTool::APE;
+    Image::ExifTool::APE::ProcessAPE($exifTool, $dirInfo);
+
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::MPC - Read Musepack audio meta information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to extract meta
+information from Musepack (MPC) audio files.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.musepack.net/>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/MPC Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/MPEG.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/MPEG.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/MPEG.pm	(revision 24799)
@@ -0,0 +1,734 @@
+#------------------------------------------------------------------------------
+# File:         MPEG.pm
+#
+# Description:  Read MPEG-1 and MPEG-2 meta information
+#
+# Revisions:    05/11/2006 - P. Harvey Created
+#
+# References:   1) http://www.mp3-tech.org/
+#               2) http://www.getid3.org/
+#               3) http://dvd.sourceforge.net/dvdinfo/dvdmpeg.html
+#               4) http://ffmpeg.org/
+#               5) http://sourceforge.net/projects/mediainfo/
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::MPEG;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.13';
+
+%Image::ExifTool::MPEG::Audio = (
+    GROUPS => { 2 => 'Audio' },
+    'Bit11-12' => {
+        Name => 'MPEGAudioVersion',
+        RawConv => '$self->{MPEG_Vers} = $val',
+        PrintConv => {
+            0 => 2.5,
+            2 => 2,
+            3 => 1,
+        },
+    },
+    'Bit13-14' => {
+        Name => 'AudioLayer',
+        RawConv => '$self->{MPEG_Layer} = $val',
+        PrintConv => {
+            1 => 3,
+            2 => 2,
+            3 => 1,
+        },
+    },
+    # Bit 15 indicates CRC protection
+    'Bit16-19' => [
+        {
+            Name => 'AudioBitrate',
+            Condition => '$self->{MPEG_Vers} == 3 and $self->{MPEG_Layer} == 3',
+            Notes => 'version 1, layer 1',
+            PrintConvColumns => 3,
+            ValueConv => {
+                0 => 'free',
+                1 => 32000,
+                2 => 64000,
+                3 => 96000,
+                4 => 128000,
+                5 => 160000,
+                6 => 192000,
+                7 => 224000,
+                8 => 256000,
+                9 => 288000,
+                10 => 320000,
+                11 => 352000,
+                12 => 384000,
+                13 => 416000,
+                14 => 448000,
+            },
+            PrintConv => 'ConvertBitrate($val)',
+        },
+        {
+            Name => 'AudioBitrate',
+            Condition => '$self->{MPEG_Vers} == 3 and $self->{MPEG_Layer} == 2',
+            Notes => 'version 1, layer 2',
+            PrintConvColumns => 3,
+            ValueConv => {
+                0 => 'free',
+                1 => 32000,
+                2 => 48000,
+                3 => 56000,
+                4 => 64000,
+                5 => 80000,
+                6 => 96000,
+                7 => 112000,
+                8 => 128000,
+                9 => 160000,
+                10 => 192000,
+                11 => 224000,
+                12 => 256000,
+                13 => 320000,
+                14 => 384000,
+            },
+            PrintConv => 'ConvertBitrate($val)',
+        },
+        {
+            Name => 'AudioBitrate',
+            Condition => '$self->{MPEG_Vers} == 3 and $self->{MPEG_Layer} == 1',
+            Notes => 'version 1, layer 3',
+            PrintConvColumns => 3,
+            ValueConv => {
+                0 => 'free',
+                1 => 32000,
+                2 => 40000,
+                3 => 48000,
+                4 => 56000,
+                5 => 64000,
+                6 => 80000,
+                7 => 96000,
+                8 => 112000,
+                9 => 128000,
+                10 => 160000,
+                11 => 192000,
+                12 => 224000,
+                13 => 256000,
+                14 => 320000,
+            },
+            PrintConv => 'ConvertBitrate($val)',
+        },
+        {
+            Name => 'AudioBitrate',
+            Condition => '$self->{MPEG_Vers} != 3 and $self->{MPEG_Layer} == 3',
+            Notes => 'version 2 or 2.5, layer 1',
+            PrintConvColumns => 3,
+            ValueConv => {
+                0 => 'free',
+                1 => 32000,
+                2 => 48000,
+                3 => 56000,
+                4 => 64000,
+                5 => 80000,
+                6 => 96000,
+                7 => 112000,
+                8 => 128000,
+                9 => 144000,
+                10 => 160000,
+                11 => 176000,
+                12 => 192000,
+                13 => 224000,
+                14 => 256000,
+            },
+            PrintConv => 'ConvertBitrate($val)',
+        },
+        {
+            Name => 'AudioBitrate',
+            Condition => '$self->{MPEG_Vers} != 3 and $self->{MPEG_Layer}',
+            Notes => 'version 2 or 2.5, layer 2 or 3',
+            PrintConvColumns => 3,
+            ValueConv => {
+                0 => 'free',
+                1 => 8000,
+                2 => 16000,
+                3 => 24000,
+                4 => 32000,
+                5 => 40000,
+                6 => 48000,
+                7 => 56000,
+                8 => 64000,
+                9 => 80000,
+                10 => 96000,
+                11 => 112000,
+                12 => 128000,
+                13 => 144000,
+                14 => 160000,
+            },
+            PrintConv => 'ConvertBitrate($val)',
+        },
+    ],
+    'Bit20-21' => [
+        {
+            Name => 'SampleRate',
+            Condition => '$self->{MPEG_Vers} == 3',
+            Notes => 'version 1',
+            PrintConv => {
+                0 => 44100,
+                1 => 48000,
+                2 => 32000,
+            },
+        },
+        {
+            Name => 'SampleRate',
+            Condition => '$self->{MPEG_Vers} == 2',
+            Notes => 'version 2',
+            PrintConv => {
+                0 => 22050,
+                1 => 24000,
+                2 => 16000,
+            },
+        },
+        {
+            Name => 'SampleRate',
+            Condition => '$self->{MPEG_Vers} == 0',
+            Notes => 'version 2.5',
+            PrintConv => {
+                0 => 11025,
+                1 => 12000,
+                2 => 8000,
+            },
+        },
+    ],
+    # Bit 22 - padding flag
+    # Bit 23 - private bit
+    'Bit24-25' => {
+        Name => 'ChannelMode',
+        RawConv => '$self->{MPEG_Mode} = $val',
+        PrintConv => {
+            0 => 'Stereo',
+            1 => 'Joint Stereo',
+            2 => 'Dual Channel',
+            3 => 'Single Channel',
+        },
+    },
+    'Bit26' => {
+        Name => 'MSStereo',
+        Condition => '$self->{MPEG_Layer} == 1',
+        Notes => 'layer 3',
+        PrintConv => { 0 => 'Off', 1 => 'On' },
+    },
+    'Bit27' => {
+        Name => 'IntensityStereo',
+        Condition => '$self->{MPEG_Layer} == 1',
+        Notes => 'layer 3',
+        PrintConv => { 0 => 'Off', 1 => 'On' },
+    },
+    'Bit26-27' => {
+        Name => 'ModeExtension',
+        Condition => '$self->{MPEG_Layer} > 1',
+        Notes => 'layer 1 or 2',
+        PrintConv => {
+            0 => 'Bands 4-31',
+            1 => 'Bands 8-31',
+            2 => 'Bands 12-31',
+            3 => 'Bands 16-31',
+        },
+    },
+    'Bit28'    => {
+        Name => 'CopyrightFlag',
+        PrintConv => {
+            0 => 'False',
+            1 => 'True',
+        },
+    },
+    'Bit29'    => {
+        Name => 'OriginalMedia',
+        PrintConv => {
+            0 => 'False',
+            1 => 'True',
+        },
+    },
+    'Bit30-31' => {
+        Name => 'Emphasis',
+        PrintConv => {
+            0 => 'None',
+            1 => '50/15 ms',
+            2 => 'reserved',
+            3 => 'CCIT J.17',
+        },
+    },
+);
+
+%Image::ExifTool::MPEG::Video = (
+    GROUPS => { 2 => 'Video' },
+    'Bit00-11' => 'ImageWidth',
+    'Bit12-23' => 'ImageHeight',
+    'Bit24-27' => {
+        Name => 'AspectRatio',
+        ValueConv => {
+            1 => 1,
+            2 => 0.6735,
+            3 => 0.7031,
+            4 => 0.7615,
+            5 => 0.8055,
+            6 => 0.8437,
+            7 => 0.8935,
+            8 => 0.9157,
+            9 => 0.9815,
+            10 => 1.0255,
+            11 => 1.0695,
+            12 => 1.0950,
+            13 => 1.1575,
+            14 => 1.2015,
+        },
+        PrintConv => {
+            1      => '1:1',
+            0.6735 => '0.6735',
+            0.7031 => '16:9, 625 line, PAL',
+            0.7615 => '0.7615',
+            0.8055 => '0.8055',
+            0.8437 => '16:9, 525 line, NTSC',
+            0.8935 => '0.8935',
+            0.9157 => '4:3, 625 line, PAL, CCIR601',
+            0.9815 => '0.9815',
+            1.0255 => '1.0255',
+            1.0695 => '1.0695',
+            1.0950 => '4:3, 525 line, NTSC, CCIR601',
+            1.1575 => '1.1575',
+            1.2015 => '1.2015',
+        },
+    },
+    'Bit28-31' => {
+        Name => 'FrameRate',
+        ValueConv => {
+            1 => 23.976,
+            2 => 24,
+            3 => 25,
+            4 => 29.97,
+            5 => 30,
+            6 => 50,
+            7 => 59.94,
+            8 => 60,
+        },
+        PrintConv => '"$val fps"',
+    },
+    'Bit32-49' => {
+        Name => 'VideoBitrate',
+        ValueConv => '$val eq 0x3ffff ? "Variable" : $val * 400',
+        PrintConv => 'ConvertBitrate($val)',
+    },
+    # these tags not very interesting
+    #'Bit50'    => 'MarkerBit',
+    #'Bit51-60' => 'VBVBufferSize',
+    #'Bit61'    => 'ConstrainedParamFlag',
+    #'Bit62'    => 'IntraQuantMatrixFlag',
+);
+
+%Image::ExifTool::MPEG::Xing = (
+    GROUPS => { 2 => 'Audio' },
+    VARS => { NO_ID => 1 },
+    NOTES => 'These tags are extracted from the Xing/Info frame.',
+    1 => { Name => 'VBRFrames' },
+    2 => { Name => 'VBRBytes' },
+    3 => { Name => 'VBRScale' },
+    4 => { Name => 'Encoder' },
+    5 => { Name => 'LameVBRQuality' },
+    6 => { Name => 'LameQuality' },
+    7 => { # (for documentation only)
+        Name => 'LameHeader',
+        SubDirectory => { TagTable => 'Image::ExifTool::MPEG::Lame' },
+    },
+);
+
+# Lame header tags (ref 5)
+%Image::ExifTool::MPEG::Lame = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Audio' },
+    NOTES => 'Tags extracted from Lame 3.90 or later header.',
+    9 => {
+        Name => 'LameMethod',
+        Mask => 0x0f,
+        PrintConv => {
+            1 => 'CBR',
+            2 => 'ABR',
+            3 => 'VBR (old/rh)',
+            4 => 'VBR (new/mtrh)',
+            5 => 'VBR (old/rh)',
+            6 => 'VBR',
+            8 => 'CBR (2-pass)',
+            9 => 'ABR (2-pass)',
+        },
+    },
+    10 => {
+        Name => 'LameLowPassFilter',
+        ValueConv => '$val * 100',
+        PrintConv => '($val / 1000) . " kHz"',
+    },
+    # 19 - EncodingFlags
+    20 => {
+        Name => 'LameBitrate',
+        ValueConv => '$val * 1000',
+        PrintConv => 'ConvertBitrate($val)',
+    },
+    24 => {
+        Name => 'LameStereoMode',
+        Mask => 0x1c,
+        ValueConv => '$val >> 2',
+        PrintConv => {
+            0 => 'Mono',
+            1 => 'Stereo',
+            2 => 'Dual Channels',
+            3 => 'Joint Stereo',
+            4 => 'Forced Joint Stereo',
+            6 => 'Auto',
+            7 => 'Intensity Stereo',
+        },
+    },
+);
+
+# composite tags
+%Image::ExifTool::MPEG::Composite = (
+    Duration => {
+        Groups => { 2 => 'Video' },
+        Require => {
+            0 => 'FileSize',
+        },
+        Desire => {
+            1 => 'ID3Size',
+            2 => 'MPEG:AudioBitrate',
+            3 => 'MPEG:VideoBitrate',
+            4 => 'MPEG:VBRFrames',
+            5 => 'MPEG:SampleRate',
+            6 => 'MPEG:MPEGAudioVersion',
+        },
+        Priority => -1, # (don't want to replace any other Duration tag)
+        ValueConv => q{
+            if ($val[4] and defined $val[5] and defined $val[6]) {
+                # calculate from number of VBR audio frames
+                my $mfs = $prt[5] / ($val[6] == 3 ? 144 : 72);
+                # calculate using VBR length
+                return 8 * $val[4] / $mfs;
+            }
+            # calculate duration as file size divided by total bitrate
+            # (note: this is only approximate!)
+            return undef unless $val[2] or $val[3];
+            return undef if $val[2] and not $val[2] =~ /^\d+$/;
+            return undef if $val[3] and not $val[3] =~ /^\d+$/;
+            return (8 * ($val[0] - ($val[1]||0))) / (($val[2]||0) + ($val[3]||0));
+        },
+        PrintConv => 'ConvertDuration($val) . " (approx)"',
+    },
+    AudioBitrate => {
+        Groups => { 2 => 'Audio' },
+        Notes => 'calculated for variable-bitrate MPEG audio',
+        Require => {
+            0 => 'MPEG:MPEGAudioVersion',
+            1 => 'MPEG:SampleRate',
+            2 => 'MPEG:VBRBytes',
+            3 => 'MPEG:VBRFrames',
+        },
+        ValueConv => q{
+            return undef unless $val[3];
+            my $mfs = $prt[1] / ($val[0] == 3 ? 144 : 72);
+            return $mfs * $val[2] / $val[3];
+        },
+        PrintConv => 'ConvertBitrate($val)',
+    },
+);
+
+# add our composite tags
+Image::ExifTool::AddCompositeTags('Image::ExifTool::MPEG');
+
+
+#------------------------------------------------------------------------------
+# Process information in an MPEG audio or video frame header
+# Inputs: 0) ExifTool object ref, 1) tag table ref, 2-N) list of 32-bit data words
+sub ProcessFrameHeader($$@)
+{
+    my ($exifTool, $tagTablePtr, @data) = @_;
+    my $tag;
+    foreach $tag (sort keys %$tagTablePtr) {
+        next unless $tag =~ /^Bit(\d{2})-?(\d{2})?/;
+        my ($b1, $b2) = ($1, $2 || $1);
+        my $index = int($b1 / 32);
+        my $word = $data[$index];
+        my $mask = 0;
+        foreach (0 .. ($b2 - $b1)) {
+            $mask += (1 << $_);
+        }
+        my $val = ($word >> (31 + 32*$index - $b2)) & $mask;
+        $exifTool->HandleTag($tagTablePtr, $tag, $val);
+    }
+}
+
+#------------------------------------------------------------------------------
+# Read MPEG audio frame header
+# Inputs: 0) ExifTool object reference, 1) Reference to audio data
+# Returns: 1 on success, 0 if no audio header was found
+sub ParseMPEGAudio($$)
+{
+    my ($exifTool, $buffPt) = @_;
+    my ($word, $pos);
+    my $ext = $$exifTool{FILE_EXT} || '';
+
+    for (;;) {
+        # find frame sync
+        return 0 unless $$buffPt =~ m{(\xff.{3})}sg;
+        $word = unpack('N', $1);    # get audio frame header word
+        unless (($word & 0xffe00000) == 0xffe00000) {
+            pos($$buffPt) = pos($$buffPt) - 2;  # next possible location for frame sync
+            next;
+        }
+        # validate header as much as possible
+        if (($word & 0x180000) == 0x080000 or   # 01 is a reserved version ID
+            ($word & 0x060000) == 0x000000 or   # 00 is a reserved layer description
+            ($word & 0x00f000) == 0x000000 or   # 0000 is the "free" bitrate index
+            ($word & 0x00f000) == 0x00f000 or   # 1111 is a bad bitrate index
+            ($word & 0x000c00) == 0x000c00 or   # 11 is a reserved sampling frequency
+            ($word & 0x000003) == 0x000002)     # 10 is a reserved emphasis
+        {
+            # give up easily unless this really should be an MP3 file
+            return 0 unless $ext eq 'MP3';
+            pos($$buffPt) = pos($$buffPt) - 1;
+            next;
+        }
+        $pos = pos($$buffPt);
+        last;
+    }
+    # set file type if not done already
+    $exifTool->SetFileType();
+
+    my $tagTablePtr = GetTagTable('Image::ExifTool::MPEG::Audio');
+    ProcessFrameHeader($exifTool, $tagTablePtr, $word);
+
+    # extract the VBR information (ref MP3::Info)
+    my ($v, $m) = ($$exifTool{MPEG_Vers}, $$exifTool{MPEG_Mode});
+    while (defined $v and defined $m) {
+        my $len = length $$buffPt;
+        $pos += $v == 3 ? ($m == 3 ? 17 : 32) : ($m == 3 ?  9 : 17);
+        last if $pos + 8 > $len;
+        my $buff = substr($$buffPt, $pos, 8);
+        last unless $buff =~ /^(Xing|Info)/;
+        my $xingTable = GetTagTable('Image::ExifTool::MPEG::Xing');
+        my $vbrScale;
+        my $flags = unpack('x4N', $buff);
+        my $isVBR = ($buff !~ /^Info/);     # Info frame is not VBR (ref 5)
+        $pos += 8;
+        if ($flags & 0x01) {    # VBRFrames
+            last if $pos + 4 > $len;
+            $exifTool->HandleTag($xingTable, 1, unpack("x${pos}N", $$buffPt)) if $isVBR;
+            $pos += 4;
+        }
+        if ($flags & 0x02) {    # VBRBytes
+            last if $pos + 4 > $len;
+            $exifTool->HandleTag($xingTable, 2, unpack("x${pos}N", $$buffPt)) if $isVBR;
+            $pos += 4;
+        }
+        if ($flags & 0x04) {    # VBR_TOC
+            last if $pos + 100 > $len;
+            # (ignore toc for now)
+            $pos += 100;
+        }
+        if ($flags & 0x08) {    # VBRScale
+            last if $pos + 4 > $len;
+            $vbrScale = unpack("x${pos}N", $$buffPt);
+            $exifTool->HandleTag($xingTable, 3, $vbrScale) if $isVBR;
+            $pos += 4;
+        }
+        # process Lame header (ref 5)
+        if ($flags & 0x10) {    # Lame
+            last if $pos + 348 > $len;
+        } elsif ($pos + 4 <= $len) {
+            my $lib = substr($$buffPt, $pos, 4);
+            unless ($lib eq 'LAME' or $lib eq 'GOGO') {
+                # attempt to identify other encoders
+                my $n;
+                if (index($$buffPt, 'RCA mp3PRO Encoder') >= 0) {
+                    $lib = 'RCA mp3PRO';
+                } elsif (($n = index($$buffPt, 'THOMSON mp3PRO Encoder')) >= 0) {
+                    $lib = 'Thomson mp3PRO';
+                    $n += 22;
+                    $lib .= ' ' . substr($$buffPt, $n, 6) if length($$buffPt) - $n >= 6;
+                } elsif (index($$buffPt, 'MPGE') >= 0) {
+                    $lib = 'Gogo (<3.0)';
+                } else {
+                    last;
+                }
+                $exifTool->HandleTag($xingTable, 4, $lib);
+                last;
+            }
+        }
+        my $lameLen = $len - $pos;
+        last if $lameLen < 9;
+        my $enc = substr($$buffPt, $pos, 9);
+        if ($enc ge 'LAME3.90') {
+            $exifTool->HandleTag($xingTable, 4, $enc);
+            if ($vbrScale <= 100) {
+                $exifTool->HandleTag($xingTable, 5, int((100 - $vbrScale) / 10));
+                $exifTool->HandleTag($xingTable, 6, (100 - $vbrScale) % 10);
+            }
+            my %dirInfo = (
+                DataPt   => $buffPt,
+                DirStart => $pos,
+                DirLen   => length($$buffPt) - $pos,
+            );
+            my $subTablePtr = GetTagTable('Image::ExifTool::MPEG::Lame');
+            $exifTool->ProcessDirectory(\%dirInfo, $subTablePtr);
+        } else {
+            $exifTool->HandleTag($xingTable, 4, substr($$buffPt, $pos, 20));
+        }
+        last;   # (didn't want to loop anyway)
+	}
+
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Read MPEG video frame header
+# Inputs: 0) ExifTool object reference, 1) Reference to video data
+# Returns: 1 on success, 0 if no video header was found
+sub ProcessMPEGVideo($$)
+{
+    my ($exifTool, $buffPt) = @_;
+
+    return 0 unless length $$buffPt >= 4;
+    my ($w1, $w2) = unpack('N2', $$buffPt);
+    # validate as much as possible
+    if (($w1 & 0x000000f0) == 0x00000000 or     # 0000 is a forbidden aspect ratio
+        ($w1 & 0x000000f0) == 0x000000f0 or     # 1111 is a reserved aspect ratio
+        ($w1 & 0x0000000f) == 0 or              # frame rate must be 1-8
+        ($w1 & 0x0000000f) > 8)
+    {
+        return 0;
+    }
+    # set file type if not done already
+    $exifTool->SetFileType('MPEG') unless $exifTool->{VALUE}->{FileType};
+
+    my $tagTablePtr = GetTagTable('Image::ExifTool::MPEG::Video');
+    ProcessFrameHeader($exifTool, $tagTablePtr, $w1, $w2);
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Read MPEG audio and video frame headers
+# Inputs: 0) ExifTool object reference, 1) Reference to audio/video data
+# Returns: 1 on success, 0 if no video header was found
+# To Do: Properly parse MPEG streams:
+#   0xb7 - sequence end
+#   0xb9 - end code
+#   0xba - pack start code
+#   0xbb - system header
+#   0xbc - program map <-- should parse this
+#   0xbd - private stream 1 --> for VOB, this contains sub-streams:
+#           0x20-0x3f - pictures
+#           0x80-0x87 - audio (AC3,DTS,SDDS)
+#           0xa0-0xa7 - audio (LPCM)
+#   0xbe - padding
+#   0xbf - private stream 2
+#   0xc0-0xdf - audio stream
+#   0xe0-0xef - video stream
+sub ParseMPEGAudioVideo($$)
+{
+    my ($exifTool, $buffPt) = @_;
+    my (%found, $didHdr);
+    my $rtnVal = 0;
+    my %proc = ( audio => \&ParseMPEGAudio, video => \&ProcessMPEGVideo );
+
+    delete $exifTool->{AudioBitrate};
+    delete $exifTool->{VideoBitrate};
+
+    while ($$buffPt =~ /\0\0\x01(\xb3|\xc0)/g) {
+        my $type = $1 eq "\xb3" ? 'video' : 'audio';
+        unless ($didHdr) {
+            # make sure we didn't miss an audio frame sync before this (ie. MP3 file)
+            # (the last byte of the 4-byte MP3 audio frame header word may be zero,
+            # but the 2nd last must be non-zero, so we need only check to pos-3)
+            my $buff = substr($$buffPt, 0, pos($$buffPt) - 3);
+            $found{audio} = 1 if ParseMPEGAudio($exifTool, \$buff);
+            $didHdr = 1;
+        }
+        next if $found{$type};
+        my $len = length($$buffPt) - pos($$buffPt);
+        last if $len < 4;
+        $len > 256 and $len = 256;
+        my $dat = substr($$buffPt, pos($$buffPt), $len);
+        # process MPEG audio or video
+        if (&{$proc{$type}}($exifTool, \$dat)) {
+            $rtnVal = 1;
+            $found{$type} = 1;
+            # done if we found audio and video
+            last if scalar(keys %found) == 2;
+        }
+    }
+    return $rtnVal;
+}
+
+#------------------------------------------------------------------------------
+# Read information from an MPEG file
+# Inputs: 0) ExifTool object reference, 1) Directory information reference
+# Returns: 1 on success, 0 if this wasn't a valid MPEG file
+sub ProcessMPEG($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my $buff;
+
+    $raf->Read($buff, 4) == 4 or return 0;
+    return 0 unless $buff =~ /^\0\0\x01[\xb0-\xbf]/;
+    $exifTool->SetFileType();
+
+    $raf->Seek(0,0);
+    $raf->Read($buff, 65536*4) or return 0;
+
+    return ParseMPEGAudioVideo($exifTool, \$buff);
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::MPEG - Read MPEG-1 and MPEG-2 meta information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to read MPEG-1
+and MPEG-2 audio/video files.
+
+=head1 NOTES
+
+Since ISO charges money for the official MPEG specification, this module is
+based on unofficial sources which may be incomplete, inaccurate or outdated.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.mp3-tech.org/>
+
+=item L<http://www.getid3.org/>
+
+=item L<http://dvd.sourceforge.net/dvdinfo/dvdmpeg.html>
+
+=item L<http://ffmpeg.org/>
+
+=item L<http://sourceforge.net/projects/mediainfo/>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/MPEG Tags>,
+L<MP3::Info(3pm)|MP3::Info>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/MPF.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/MPF.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/MPF.pm	(revision 24799)
@@ -0,0 +1,286 @@
+#------------------------------------------------------------------------------
+# File:         MPF.pm
+#
+# Description:  Read Multi-Picture Format information
+#
+# Revisions:    06/12/2009 - P. Harvey Created
+#
+# References:   1) http://www.cipa.jp/english/hyoujunka/kikaku/pdf/DC-007_E.pdf
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::MPF;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::Exif;
+
+$VERSION = '1.05';
+
+sub ProcessMPImageList($$$);
+
+# Tags found in MPF APP2 segment in JPEG images
+%Image::ExifTool::MPF::Main = (
+    GROUPS => { 0 => 'MPF', 1 => 'MPF0', 2 => 'Image'},
+    NOTES => q{
+        These tags are part of the CIPA Multi-Picture Format specification, and are
+        found in the APP2 "MPF" segment of JPEG images.  See
+        L<http://www.cipa.jp/english/hyoujunka/kikaku/pdf/DC-007_E.pdf> for the
+        official specification.
+    },
+    0xb000 => 'MPFVersion',
+    0xb001 => 'NumberOfImages',
+    0xb002 => {
+        Name => 'MPImageList',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::MPF::MPImage',
+            ProcessProc => \&ProcessMPImageList,
+        },
+    },
+    0xb003 => {
+        Name => 'ImageUIDList',
+        Binary => 1,
+    },
+    0xb004 => 'TotalFrames',
+    0xb101 => 'MPIndividualNum',
+    0xb201 => {
+        Name => 'PanOrientation',
+        PrintHex => 1,
+        Notes => 'long integer is split into 4 bytes',
+        ValueConv => 'join(" ",unpack("C*",pack("N",$val)))',
+        PrintConv => [
+            '"$val rows"',
+            '"$val columns"',
+            {
+                0 => '[unused]',
+                1 => 'Start at top right',
+                2 => 'Start at top left',
+                3 => 'Start at bottom left',
+                4 => 'Start at bottom right',
+            },
+            {
+                0x01 => 'Left to right',
+                0x02 => 'Right to left',
+                0x03 => 'Top to bottom',
+                0x04 => 'Bottom to top',
+                0x10 => 'Clockwise',
+                0x20 => 'Counter clockwise',
+                0x30 => 'Zigzag (row start)',
+                0x40 => 'Zigzag (column start)',
+            },
+        ],
+    },          
+    0xb202 => 'PanOverlapH',
+    0xb203 => 'PanOverlapV',
+    0xb204 => 'BaseViewpointNum',
+    0xb205 => 'ConvergenceAngle',
+    0xb206 => 'BaselineLength',
+    0xb207 => 'VerticalDivergence',
+    0xb208 => 'AxisDistanceX',
+    0xb209 => 'AxisDistanceY',
+    0xb20a => 'AxisDistanceZ',
+    0xb20b => 'YawAngle',
+    0xb20c => 'PitchAngle',
+    0xb20d => 'RollAngle',
+);
+
+# Tags found in MPImage structure
+%Image::ExifTool::MPF::MPImage = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    #WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    #CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    #WRITABLE => 1,
+    GROUPS => { 0 => 'MPF', 1 => 'MPImage', 2 => 'Image'},
+    NOTES => q{
+        The first MPF "Large Thumbnail" image is extracted as PreviewImage, and the
+        rest of the embedded MPF images are extracted as MPImage#.  The
+        ExtractEmbedded (-ee) option may be used to extract information from these
+        embedded images.
+    },
+    0.1 => {
+        Name => 'MPImageFlags',
+        Format => 'int32u',
+        Mask => 0xf8000000,
+        PrintConv => { BITMASK => {
+            29 => 'Representative image',
+            30 => 'Dependent child image',
+            31 => 'Dependent parent image',
+        }},
+    },
+    0.2 => {
+        Name => 'MPImageFormat',
+        Format => 'int32u',
+        Mask => 0x07000000,
+        PrintConv => {
+            0 => 'JPEG',
+        },
+    },
+    0.3 => {
+        Name => 'MPImageType',
+        Format => 'int32u',
+        Mask => 0x00ffffff,
+        PrintHex => 1,
+        PrintConv => {
+            0x000000 => 'Undefined',
+            0x010001 => 'Large Thumbnail (VGA equivalent)',
+            0x010002 => 'Large Thumbnail (full HD equivalent)',
+            0x020001 => 'Multi-frame Panorama',
+            0x020002 => 'Multi-frame Disparity',
+            0x020003 => 'Multi-angle',
+            0x030000 => 'Baseline MP Primary Image',
+        },
+    },
+    4 => {
+        Name => 'MPImageLength',
+        Format => 'int32u',
+    },
+    8 => {
+        Name => 'MPImageStart',
+        Format => 'int32u',
+        IsOffset => '$val',
+    },
+    12 => {
+        Name => 'DependentImage1EntryNumber',
+        Format => 'int16u',
+    },
+    14 => {
+        Name => 'DependentImage2EntryNumber',
+        Format => 'int16u',
+    },
+);
+
+# extract MP Images as composite tags
+%Image::ExifTool::MPF::Composite = (
+    GROUPS => { 2 => 'Image' },
+    MPImage => {
+        Require => {
+            0 => 'MPImageStart',
+            1 => 'MPImageLength',
+            2 => 'MPImageType',
+        },
+        Notes => q{
+            the first MPF "Large Thumbnail" is extracted as PreviewImage, and the rest
+            of the embedded MPF images are extracted as MPImage#.  The ExtractEmbedded
+            option may be used to extract information from these embedded images.
+        },
+        # extract all MPF images (not just one)
+        RawConv => q{
+            require Image::ExifTool::MPF;
+            Image::ExifTool::MPF::ExtractMPImages($self);
+        },
+    },
+);
+
+# add our composite tags
+Image::ExifTool::AddCompositeTags('Image::ExifTool::MPF');
+
+#------------------------------------------------------------------------------
+# Extract all MP images
+# Inputs: 0) ExifTool object ref
+# Returns: undef
+sub ExtractMPImages($)
+{
+    my $exifTool = shift;
+    my $ee = $exifTool->Options('ExtractEmbedded');
+    my $saveBinary = $exifTool->Options('Binary');
+    my ($i, $didPreview, $xtra);
+
+    for ($i=1; $xtra or not defined $xtra; ++$i) {
+        # run through MP images in the same order they were extracted
+        $xtra = defined $$exifTool{VALUE}{"MPImageStart ($i)"} ? " ($i)" : '';
+        my $off = $exifTool->GetValue("MPImageStart$xtra");
+        my $len = $exifTool->GetValue("MPImageLength$xtra");
+        if ($off and $len) {
+            my $type = $exifTool->GetValue("MPImageType$xtra", 'ValueConv');
+            my $tag = "MPImage$i";
+            # store first "Large Thumbnail" as a PreviewImage
+            if (not $didPreview and $type and ($type & 0x0f0000) == 0x010000) {
+                $tag = 'PreviewImage';
+                $didPreview = 1;
+            }
+            $exifTool->Options('Binary', 1) if $ee;
+            my $val = Image::ExifTool::Exif::ExtractImage($exifTool, $off, $len, $tag);
+            $exifTool->Options('Binary', $saveBinary) if $ee;
+            next unless defined $val;
+            unless ($Image::ExifTool::Extra{$tag}) {
+                Image::ExifTool::AddTagToTable(\%Image::ExifTool::Extra, $tag, {
+                    Name => $tag,
+                    Groups => { 0 => 'Composite', 1 => 'Composite', 2 => 'Image'},
+                });
+            }
+            my $key = $exifTool->FoundTag($tag, $val);
+            # set groups for PreviewImage
+            if ($tag eq 'PreviewImage') {
+                $exifTool->SetGroup($key, 'Composite', 0);
+                $exifTool->SetGroup($key, 'Composite');
+            }
+            # extract information from MP images if ExtractEmbedded option used
+            if ($ee) {
+                $$exifTool{DOC_NUM} = $i;
+                $exifTool->ExtractInfo($val, { ReEntry => 1 });
+                delete $$exifTool{DOC_NUM};
+            }
+        }
+    }
+    return undef;
+}
+
+#------------------------------------------------------------------------------
+# Process MP Entry list
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessMPImageList($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $num = int($$dirInfo{DirLen} / 16); # (16 bytes per MP Entry)
+    $$dirInfo{DirLen} = 16;
+    my ($i, $success);
+    my $oldG1 = $$exifTool{SET_GROUP1};
+    for ($i=0; $i<$num; ++$i) {
+        $$exifTool{SET_GROUP1} = '+' . ($i + 1);
+        $success = $exifTool->ProcessBinaryData($dirInfo, $tagTablePtr);
+        $$dirInfo{DirStart} += 16;
+    }
+    $$exifTool{SET_GROUP1} = $oldG1;
+    return $success;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::MPF - Read Multi-Picture Format information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains tag definitions and routines to read Multi-Picture
+Format (MPF) information from JPEG images.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.cipa.jp/english/hyoujunka/kikaku/pdf/DC-007_E.pdf>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/MPF Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/MWG.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/MWG.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/MWG.pm	(revision 24799)
@@ -0,0 +1,577 @@
+#------------------------------------------------------------------------------
+# File:         MWG.pm
+#
+# Description:  Metadata Working Group support
+#
+# Revisions:    2009/10/21 - P. Harvey Created
+#
+# References:   1) http://www.metadataworkinggroup.org/
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::MWG;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::Exif;
+
+$VERSION = '1.08';
+
+# enable MWG strict mode by default
+# (causes non-standard EXIF, IPTC and XMP to be ignored)
+$Image::ExifTool::MWG::strict = 1 unless defined $Image::ExifTool::MWG::strict;
+
+sub RecoverTruncatedIPTC($$$);
+sub ListToString($);
+sub StringToList($$);
+sub OverwriteStringList($$$$);
+
+# MWG Composite tags
+%Image::ExifTool::MWG::Composite = (
+    GROUPS => { 0 => 'Composite', 1 => 'MWG', 2 => 'Image' },
+    VARS => { NO_ID => 1 },
+    NOTES => q{
+        The Metadata Working Group (MWG) recommendations provide a set of rules to
+        allow certain overlapping EXIF, IPTC and XMP tags to be reconciled when
+        reading, and synchronized when writing.  The ExifTool MWG module is designed
+        to aid in the implementation of these recommendations.  (See
+        L<http://www.metadataworkinggroup.org/> for the complete MWG technical
+        specifications.)
+
+        The table below lists special Composite tags which are used to access other
+        tags based on the MWG 2.0 recommendations.  These tags are only accessible
+        when the MWG module is loaded.  The MWG module is loaded automatically by
+        the exiftool application if MWG is specified as a group for any tag on the
+        command line, or manually with the C<-use MWG> option.  Via the API, the MWG
+        module is loaded with "C<use Image::ExifTool::MWG>".
+
+        When reading, the value of each MWG tag is B<Derived From> the specified
+        tags based on the MWG guidelines.  When writing, the appropriate associated
+        tags are written.  The value of the IPTCDigest tag is updated automatically
+        when the IPTC is changed if either the IPTCDigest tag didn't exist
+        beforehand or its value agreed with the original IPTC digest (indicating
+        that the XMP is synchronized with the IPTC).  IPTC information is written
+        only if the original file contained IPTC.
+
+        Loading the MWG module activates "strict MWG conformance mode", which has
+        the effect of causing EXIF, IPTC and XMP in non-standard locations to be
+        ignored when reading, as per the MWG recommendations.  Instead, a "Warning"
+        tag is generated when non-standard metadata is encountered.  This feature
+        may be disabled by setting C<$Image::ExifTool::MWG::strict = 0> in the
+        ExifTool config file (or from your Perl script when using the API).  Note
+        that the behaviour when writing is not changed:  ExifTool always creates new
+        records only in the standard location, but writes new tags to any
+        EXIF/IPTC/XMP records that exist.
+
+        A complication of the specification is that although the MWG:Creator
+        property may consist of multiple values, the associated EXIF tag
+        (EXIF:Artist) is only a simple string.  To resolve this discrepancy the MWG
+        recommends a technique which allows a list of values to be stored in a
+        string by using a semicolon-space separator (with quotes around values if
+        necessary).  When the MWG module is loaded, ExifTool automatically
+        implements this policy and changes EXIF:Artist to a list-type tag.
+    },
+    Keywords => {
+        Flags  => ['Writable','List'],
+        Desire => {
+            0 => 'IPTC:Keywords', # (64-character limit)
+            1 => 'XMP-dc:Subject',
+            2 => 'CurrentIPTCDigest',
+            3 => 'IPTCDigest',
+        },
+        ValueConv => q{
+            return $val[1] if not defined $val[2] or (defined $val[1] and
+                             (not defined $val[3] or $val[2] eq $val[3]));
+            return Image::ExifTool::MWG::RecoverTruncatedIPTC($val[0], $val[1], 64);
+        },
+        DelCheck   => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)',
+        WriteCheck => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)',
+        WriteAlso  => {
+            # only write Keywords if IPTC exists (ie. set EditGroup option)
+            'IPTC:Keywords'  => '$opts{EditGroup} = 1; $val',
+            'XMP-dc:Subject' => '$val',
+        },
+    },
+    Description => {
+        Writable => 1,
+        Desire => {
+            0 => 'EXIF:ImageDescription',
+            1 => 'IPTC:Caption-Abstract', # (2000-character limit)
+            2 => 'XMP-dc:Description',
+            3 => 'CurrentIPTCDigest',
+            4 => 'IPTCDigest',
+        },
+        ValueConv => q{
+            return $val[0] if defined $val[0] and $val[0] !~ /^ *$/;
+            return $val[2] if not defined $val[3] or (defined $val[2] and
+                             (not defined $val[4] or $val[3] eq $val[4]));
+            return Image::ExifTool::MWG::RecoverTruncatedIPTC($val[1], $val[2], 2000);
+        },
+        DelCheck   => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)',
+        WriteCheck => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)',
+        WriteAlso  => {
+            'EXIF:ImageDescription' => '$val',
+            'IPTC:Caption-Abstract' => '$opts{EditGroup} = 1; $val',
+            'XMP-dc:Description'    => '$val',
+        },
+    },
+    DateTimeOriginal => {
+        Description => 'Date/Time Original',
+        Groups => { 2 => 'Time' },
+        Notes => '"creation date of the intellectual content being shown" - MWG',
+        Writable => 1,
+        Desire => {
+            0 => 'EXIF:DateTimeOriginal',
+            1 => 'EXIF:SubSecTimeOriginal',
+            2 => 'IPTC:DateCreated',
+            3 => 'IPTC:TimeCreated',
+            4 => 'XMP-photoshop:DateCreated',
+            5 => 'CurrentIPTCDigest',
+            6 => 'IPTCDigest',
+        },
+        ValueConv => q{
+            if (defined $val[0] and $val[0] !~ /^[: ]*$/) {
+                return ($val[1] and $val[1] !~ /^ *$/) ? "$val[0].$val[1]" : $val[0];
+            }
+            return $val[4] if not defined $val[5] or (defined $val[4] and
+                             (not defined $val[6] or $val[5] eq $val[6]));
+            return $val[3] ? "$val[2] $val[3]" : $val[2] if $val[2];
+            return undef;
+        },
+        PrintConv => '$self->ConvertDateTime($val)',
+        PrintConvInv => '$self->InverseDateTime($val,undef,1)',
+        DelCheck   => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)',
+        WriteCheck => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)',
+        WriteAlso  => {
+            # set EXIF date/time values according to PrintConv option instead
+            # of defaulting to Type=ValueConv to allow reformatting to be applied
+            'EXIF:DateTimeOriginal'     => 'delete $opts{Type}; $val',
+            'EXIF:SubSecTimeOriginal'   => 'delete $opts{Type}; $val',
+            'IPTC:DateCreated'          => '$opts{EditGroup} = 1; $val',
+            'IPTC:TimeCreated'          => '$opts{EditGroup} = 1; $val',
+            'XMP-photoshop:DateCreated' => '$val',
+        },
+    },
+    CreateDate => {
+        Groups => { 2 => 'Time' },
+        Notes => '"creation date of the digital representation" - MWG',
+        Writable => 1,
+        Desire => {
+            0 => 'EXIF:CreateDate',
+            1 => 'EXIF:SubSecTimeDigitized',
+            2 => 'IPTC:DigitalCreationDate',
+            3 => 'IPTC:DigitalCreationTime',
+            4 => 'XMP-xmp:CreateDate',
+            5 => 'CurrentIPTCDigest',
+            6 => 'IPTCDigest',
+        },
+        ValueConv => q{
+            if (defined $val[0] and $val[0] !~ /^[: ]*$/) {
+                return ($val[1] and $val[1] !~ /^ *$/) ? "$val[0].$val[1]" : $val[0];
+            }
+            return $val[4] if not defined $val[5] or (defined $val[4] and
+                             (not defined $val[6] or $val[5] eq $val[6]));
+            return $val[3] ? "$val[2] $val[3]" : $val[2] if $val[2];
+            return undef;
+        },
+        PrintConv => '$self->ConvertDateTime($val)',
+        PrintConvInv => '$self->InverseDateTime($val,undef,1)',
+        DelCheck   => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)',
+        WriteCheck => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)',
+        WriteAlso  => {
+            'EXIF:CreateDate'          => 'delete $opts{Type}; $val',
+            'EXIF:SubSecTimeDigitized' => 'delete $opts{Type}; $val',
+            'IPTC:DigitalCreationDate' => '$opts{EditGroup} = 1; $val',
+            'IPTC:DigitalCreationTime' => '$opts{EditGroup} = 1; $val',
+            'XMP-xmp:CreateDate'       => '$val',
+        },
+    },
+    ModifyDate => {
+        Groups => { 2 => 'Time' },
+        Notes => '"modification date of the digital image file" - MWG',
+        Writable => 1,
+        Desire => {
+            0 => 'EXIF:ModifyDate',
+            1 => 'EXIF:SubSecTime',
+            2 => 'XMP-xmp:ModifyDate',
+            3 => 'CurrentIPTCDigest',
+            4 => 'IPTCDigest',
+        },
+        ValueConv => q{
+            if (defined $val[0] and $val[0] !~ /^[: ]*$/) {
+                return ($val[1] and $val[1] !~ /^ *$/) ? "$val[0].$val[1]" : $val[0];
+            }
+            return $val[2] if not defined $val[3] or not defined $val[4] or $val[3] eq $val[4];
+            return undef;
+        },
+        PrintConv => '$self->ConvertDateTime($val)',
+        PrintConvInv => '$self->InverseDateTime($val,undef,1)',
+        # return empty string from check routines so this tag will never be set
+        # (only WriteAlso tags are written), the only difference is a -v2 message
+        DelCheck   => '""',
+        WriteCheck => '""',
+        WriteAlso  => {
+            'EXIF:ModifyDate'    => 'delete $opts{Type}; $val',
+            'EXIF:SubSecTime'    => 'delete $opts{Type}; $val',
+            'XMP-xmp:ModifyDate' => '$val',
+        },
+    },
+    Orientation => {
+        Writable   => 1,
+        Require    => 'EXIF:Orientation',
+        ValueConv  => '$val',
+        PrintConv  => \%Image::ExifTool::Exif::orientation,
+        DelCheck   => '""',
+        WriteCheck => '""',
+        WriteAlso  => {
+            'EXIF:Orientation' => '$val',
+        },
+    },
+    Rating => {
+        Writable   => 1,
+        Require    => 'XMP-xmp:Rating',
+        ValueConv  => '$val',
+        DelCheck   => '""',
+        WriteCheck => '""',
+        WriteAlso  => {
+            'XMP-xmp:Rating' => '$val',
+        },
+    },
+    Copyright => {
+        Groups => { 2 => 'Author' },
+        Writable => 1,
+        Desire => {
+            0 => 'EXIF:Copyright',
+            1 => 'IPTC:CopyrightNotice', # (128-character limit)
+            2 => 'XMP-dc:Rights',
+            3 => 'CurrentIPTCDigest',
+            4 => 'IPTCDigest',
+        },
+        ValueConv => q{
+            return $val[0] if defined $val[0] and $val[0] !~ /^ *$/;
+            return $val[2] if not defined $val[3] or (defined $val[2] and
+                             (not defined $val[4] or $val[3] eq $val[4]));
+            return Image::ExifTool::MWG::RecoverTruncatedIPTC($val[1], $val[2], 128);
+        },
+        DelCheck   => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)',
+        WriteCheck => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)',
+        WriteAlso  => {
+            'EXIF:Copyright'       => '$val',
+            'IPTC:CopyrightNotice' => '$opts{EditGroup} = 1; $val',
+            'XMP-dc:Rights'        => '$val',
+        },
+    },
+    Creator => {
+        Groups => { 2 => 'Author' },
+        Flags  => ['Writable','List'],
+        Desire => {
+            0 => 'EXIF:Artist',
+            1 => 'IPTC:By-line', # (32-character limit)
+            2 => 'XMP-dc:Creator',
+            3 => 'CurrentIPTCDigest',
+            4 => 'IPTCDigest',
+        },
+        ValueConv => q{
+            return $val[0] if defined $val[0] and $val[0] !~ /^ *$/;
+            return $val[2] if not defined $val[3] or (defined $val[2] and
+                             (not defined $val[4] or $val[3] eq $val[4]));
+            return Image::ExifTool::MWG::RecoverTruncatedIPTC($val[1], $val[2], 32);
+        },
+        DelCheck   => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)',
+        WriteCheck => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)',
+        WriteAlso  => {
+            'EXIF:Artist'    => '$val',
+            'IPTC:By-line'   => '$opts{EditGroup} = 1; $val',
+            'XMP-dc:Creator' => '$val',
+        },
+    },
+    Country => {
+        Groups => { 2 => 'Location' },
+        Writable => 1,
+        Desire => {
+            0 => 'IPTC:Country-PrimaryLocationName', # (64-character limit)
+            1 => 'XMP-photoshop:Country',
+            2 => 'CurrentIPTCDigest',
+            3 => 'IPTCDigest',
+        },
+        ValueConv => q{
+            return $val[1] if not defined $val[2] or (defined $val[1] and
+                             (not defined $val[3] or $val[2] eq $val[3]));
+            return Image::ExifTool::MWG::RecoverTruncatedIPTC($val[0], $val[1], 64);
+        },
+        DelCheck   => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)',
+        WriteCheck => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)',
+        WriteAlso  => {
+            'IPTC:Country-PrimaryLocationName' => '$opts{EditGroup} = 1; $val',
+            'XMP-photoshop:Country'            => '$val',
+        },
+    },
+    State => {
+        Groups => { 2 => 'Location' },
+        Writable => 1,
+        Desire => {
+            0 => 'IPTC:Province-State', # (32-character limit)
+            1 => 'XMP-photoshop:State',
+            2 => 'CurrentIPTCDigest',
+            3 => 'IPTCDigest',
+        },
+        ValueConv => q{
+            return $val[1] if not defined $val[2] or (defined $val[1] and
+                             (not defined $val[3] or $val[2] eq $val[3]));
+            return Image::ExifTool::MWG::RecoverTruncatedIPTC($val[0], $val[1], 32);
+        },
+        DelCheck   => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)',
+        WriteCheck => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)',
+        WriteAlso  => {
+            'IPTC:Province-State' => '$opts{EditGroup} = 1; $val',
+            'XMP-photoshop:State' => '$val',
+        },
+    },
+    City => {
+        Groups => { 2 => 'Location' },
+        Writable => 1,
+        Desire => {
+            0 => 'IPTC:City', # (32-character limit)
+            1 => 'XMP-photoshop:City',
+            2 => 'CurrentIPTCDigest',
+            3 => 'IPTCDigest',
+        },
+        ValueConv => q{
+            return $val[1] if not defined $val[2] or (defined $val[1] and
+                             (not defined $val[3] or $val[2] eq $val[3]));
+            return Image::ExifTool::MWG::RecoverTruncatedIPTC($val[0], $val[1], 32);
+        },
+        DelCheck   => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)',
+        WriteCheck => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)',
+        WriteAlso  => {
+            'IPTC:City'          => '$opts{EditGroup} = 1; $val',
+            'XMP-photoshop:City' => '$val',
+        },
+    },
+    Location => {
+        Groups => { 2 => 'Location' },
+        Writable => 1,
+        Desire => {
+            0 => 'IPTC:Sub-location', # (32-character limit)
+            1 => 'XMP-iptcCore:Location',
+            2 => 'CurrentIPTCDigest',
+            3 => 'IPTCDigest',
+        },
+        ValueConv => q{
+            return $val[1] if not defined $val[2] or (defined $val[1] and
+                             (not defined $val[3] or $val[2] eq $val[3]));
+            return Image::ExifTool::MWG::RecoverTruncatedIPTC($val[0], $val[1], 32);
+        },
+        DelCheck   => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)',
+        WriteCheck => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)',
+        WriteAlso  => {
+            'IPTC:Sub-location'     => '$opts{EditGroup} = 1; $val',
+            'XMP-iptcCore:Location' => '$val',
+        },
+    },
+);
+
+unless ($Image::ExifTool::documentOnly) {
+    # add our composite tags
+    Image::ExifTool::AddCompositeTags('Image::ExifTool::MWG');
+    # must also add to lookup so we can write them
+    # (since MWG tags aren't in the tag lookup by default)
+    Image::ExifTool::AddTagsToLookup(\%Image::ExifTool::MWG::Composite,
+                                     'Image::ExifTool::Composite');
+}
+
+# modify EXIF:Artist to behave as a List-type tag
+{
+    my $artist = $Image::ExifTool::Exif::Main{0x13b};
+    $$artist{List} = 1;
+    $$artist{IsOverwriting} = \&OverwriteStringList;
+    $$artist{RawConv} = \&StringToList;
+}
+
+#------------------------------------------------------------------------------
+# Change a list of values to a string using MWG rules
+# Inputs: 0)reference to list of values
+# Returns: string of values (and may reformat list entries)
+sub ListToString($)
+{
+    my $vals = shift;
+    foreach (@$vals) {
+        # double all quotes in value and quote the value if it begins
+        # with a quote or contains a semicolon-space separator
+        if (/^"/ or /; /) {
+            s/"/""/g;       # double all quotes
+            $_ = qq{"$_"};  # quote the value
+        }
+    }
+    return join('; ', @$vals);
+}
+
+#------------------------------------------------------------------------------
+# Change a string value to a list of values using MWG rules
+# Inputs: 0) string of values, 1) ExifTool ref
+# Returns: value or list reference if more than one value
+# Notes: Sets Warning tag on error
+sub StringToList($$)
+{
+    my ($str, $exifTool) = @_;
+    my (@vals, $inQuotes);
+    my @t = split '; ', $str, -1;
+    foreach (@t) {
+        my $wasQuotes = $inQuotes;
+        $inQuotes = 1 if not $inQuotes and s/^"//;
+        if ($inQuotes) {
+            # remove the last quote and reset the inQuotes flag if
+            # the value ended in an odd number of quotes
+            $inQuotes = 0 if s/((^|[^"])("")*)"$/$1/;
+            s/""/"/g;   # un-double the contained quotes
+        }
+        if ($wasQuotes) {
+            # previous separator was quoted, so concatinate with previous value
+            $vals[-1] .= '; ' . $_;
+        } else {
+            push @vals, $_;
+        }
+    }
+    $exifTool->Warn('Incorrectly quoted MWG string-list value') if $inQuotes;
+    return @vals > 1 ? \@vals : $vals[0];
+}
+
+#------------------------------------------------------------------------------
+# Handle logic for overwriting EXIF string-type list tag
+# Inputs: 0) new value hash ref, 1) new value hash ref,
+#         2) old string value (or undef if it didn't exist), 3) new value ref
+# Returns: 1 and sets the new value for the tag
+sub OverwriteStringList($$$$)
+{
+    local $_;
+    my ($exifTool, $nvHash, $val, $newValuePt) = @_;
+    my (@new, $delIndex);
+    if ($$nvHash{DelValue} and defined $val) {
+        # preserve specified old values
+        my $old = StringToList($val, $exifTool);
+        my @old = ref $old eq 'ARRAY' ? @$old : $old;
+        if (@{$$nvHash{DelValue}}) {
+            my %del;
+            $del{$_} = 1 foreach @{$$nvHash{DelValue}};
+            foreach (@old) {
+                $del{$_} or push(@new, $_), next;
+                $delIndex or $delIndex = scalar @new;
+            }
+        } else {
+            push @new, @old;
+        }
+    }
+    # add new values (at location of deleted values, if any)
+    if ($$nvHash{Value}) {
+        if (defined $delIndex) {
+            splice @new, $delIndex, 0, @{$$nvHash{Value}};
+        } else {
+            push @new, @{$$nvHash{Value}};
+        }
+    }
+    if (@new) {
+        # convert back to string format
+        $$newValuePt = ListToString(\@new);
+    } else {
+        $$newValuePt = undef;   # delete the tag
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Reconcile IPTC digest after writing an MWG tag
+# Inputs: 0) ExifTool object ref
+# Returns: empty string
+sub ReconcileIPTCDigest($)
+{
+    my $exifTool = shift;
+
+    # set new value for IPTCDigest if not done already
+    unless ($Image::ExifTool::Photoshop::iptcDigestInfo and
+            $exifTool->{NEW_VALUE}{$Image::ExifTool::Photoshop::iptcDigestInfo})
+    {
+        # write new IPTCDigest only if it doesn't exist or
+        # is the same as the digest of the original IPTC
+        my @a; # (capture warning messages)
+        @a = $exifTool->SetNewValue('Photoshop:IPTCDigest', 'old', Protected => 1, DelValue => 1);
+        @a = $exifTool->SetNewValue('Photoshop:IPTCDigest', 'new', Protected => 1);
+    }
+    return '';
+}
+
+#------------------------------------------------------------------------------
+# Recover strings which were truncated by IPTC dataset length limit
+# Inputs: 0) IPTC value, 1) XMP value, 2) length limit
+# Notes: handles the case where IPTC and/or XMP values are lists
+sub RecoverTruncatedIPTC($$$)
+{
+    my ($iptc, $xmp, $limit) = @_;
+
+    return $iptc unless defined $xmp;
+    if (ref $iptc) {
+        $xmp = [ $xmp ] unless ref $xmp;
+        my ($i, @vals);
+        for ($i=0; $i<@$iptc; ++$i) {
+            push @vals, RecoverTruncatedIPTC($$iptc[$i], $$xmp[$i], $limit);
+        }
+        return \@vals;
+    } elsif (defined $iptc and length $iptc == $limit) {    
+        $xmp = $$xmp[0] if ref $xmp;    # take first element of list
+        return $xmp if length $xmp > $limit and $iptc eq substr($xmp, 0, $limit);
+    }
+    return $iptc;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::MWG - Metadata Working Group support
+
+=head1 SYNOPSIS
+
+    # enable MWG tags (strict mode enabled by default)
+    use Image::ExifTool::MWG;
+
+    # disable MWG strict mode
+    $Image::ExifTool::MWG::strict = 0;
+
+=head1 DESCRIPTION
+
+The MWG module contains tag definitions which are designed to simplify
+implementation of the Metadata Working Group guidelines.  These special MWG
+composite tags are enabled simply by loading this module:
+
+    use Image::ExifTool::MWG;
+
+When the MWG module is loaded, "strict MWG conformance" is enabled by
+default.  In this mode, ExifTool will generate a Warning tag instead of
+extracting EXIF, IPTC and XMP from non-standard locations.  The strict mode
+may be disabled by setting the MWG "strict" flag to zero (either before or
+after loading the MWG module):
+
+    $Image::ExifTool::MWG::strict = 0;
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.metadataworkinggroup.org/>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/MWG Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/MXF.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/MXF.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/MXF.pm	(revision 24799)
@@ -0,0 +1,3033 @@
+#------------------------------------------------------------------------------
+# File:         MXF.pm
+#
+# Description:  Read MXF meta information
+#
+# Revisions:    2010/12/15 - P. Harvey Created
+#
+# References:   1) http://sourceforge.net/projects/mxflib/
+#               2) http://www.aafassociation.org/downloads/whitepapers/MXFPhysicalview.pdf
+#               3) http://archive.nlm.nih.gov/pubs/pearson/MJ2_Metadata2005.pdf
+#               4) http://www.aafassociation.org/downloads/specifications/AMWA-AS-03-Delivery-Spec-1_0.pdf
+#               5) http://paul-sampson.ca/private/s385m.pdf
+#               6) http://avwiki.nl/documents/eg41.pdf
+#               7) http://avwiki.nl/documents/eg42.pdf
+#               8) http://rhea.tele.ucl.ac.be:8081/Plone/Members/egoray/thesaurus-dictionnaire-metadata/
+#                   a) S335M Dictionary structure.pdf
+#                   b) S330M  UMID.PDF
+#               9) http://www.smpte-ra.org/mdd/RP210v12-publication-20100623.xls
+#               10) http://www.amwa.tv/downloads/specifications/aafobjectspec-v1.1.pdf
+#               11) http://www.mog-solutions.com/img_upload/PDF/XML%20Schema%20for%20MXF%20Metadata.pdf
+#               12) http://www.freemxf.org/freemxf_board/viewtopic.php?p=545&sid=00a5c17e07d828c1e93ecdbaed3076f7
+#
+# Notes:     1) The alternate language support is dependent on the serialization
+#               sequence.  Specifically the InstanceUID's must come before any
+#               text in an alternate language set, and these sets must come
+#               after the language definitions.
+#
+#            2) UTF-16 surrogate pairs are not handled properly.
+#
+#            3) This code is not tested for files larger than 2 GB,
+#               but in theory this should be OK with 64-bit Perl.
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::MXF;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.02';
+
+sub ProcessPrimer($$$);
+sub ProcessLocalSet($$$);
+sub ConvLatLon($);
+sub ReadMXFValue($$$);
+sub SetGroups($$;$$);
+sub ConvertDurations($$);
+
+# list of currently decoded MXF value types
+my %knownType = (
+    Alt => 1,       Lon => 1,                   UL => 1,
+    AUID => 1,      PackageID => 1,             UMID => 1,
+    BatchOfUL => 1, Position => 1,             'UTF-16' => 1,
+    Boolean => 1,   ProductVersion => 1,        UUID => 1,
+    GUID => 1,      StrongReference => 1,       VersionType => 1,
+    Hex => 1,       StrongReferenceArray => 1,  WeakReference => 1,
+    Label => 1,     StrongReferenceBatch => 1,
+    Lat => 1,       Timestamp => 1,
+    Length => 1,    UID => 1,
+           
+);
+
+# common tag info parameters
+my %header = (
+    IsHeader => 1,
+    SubDirectory => {
+        TagTable => 'Image::ExifTool::MXF::Header',
+        ProcessProc => \&Image::ExifTool::ProcessBinaryData,
+    },
+);
+my %localSet = (
+    SubDirectory => { TagTable => 'Image::ExifTool::MXF::Main' },
+);
+my %timestamp = (
+    Type => 'Timestamp',
+    Groups => { 2 => 'Time' },
+    PrintConv => '$self->ConvertDateTime($val)',
+);
+my %geoLat = (
+    Groups => { 2 => 'Location' },
+    PrintConv => 'require Image::ExifTool::GPS; Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")',
+);
+my %geoLon = (
+    Groups => { 2 => 'Location' },
+    PrintConv => 'require Image::ExifTool::GPS; Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
+);
+my %geoLatLon = (
+    Groups => { 2 => 'Location' },
+    PrintConv => q{
+        require Image::ExifTool::GPS;
+        my ($lat, $lon) = split ' ', $val;
+        $lat = Image::ExifTool::GPS::ToDMS($self, $lat, 1, 'N');
+        $lon = Image::ExifTool::GPS::ToDMS($self, $lon, 1, 'E');
+        return "$lat, $lon";
+    },
+);
+my %duration = (
+    IsDuration => 1,  # flag used to correct durations by the appropriate EditRate
+    RawConv    => '$val > 1e18 ? undef : $val', # (all 0xff's)
+    PrintConv  => 'ConvertDuration($val)',
+);
+
+# ComponentDataDefinition values
+my %componentDataDef = (
+    PrintConv => {
+        '060e2b34.0401.0101.01030201.01000000' => 'SMPTE 12M Timecode Track',
+        '060e2b34.0401.0101.01030201.02000000' => 'SMPTE 12M Timecode Track with active user bits',
+        '060e2b34.0401.0101.01030201.03000000' => 'SMPTE 309M Timecode Track',
+        '060e2b34.0401.0101.01030201.10000000' => 'Descriptive Metadata Track',
+        '060e2b34.0401.0101.01030202.01000000' => 'Picture Essence Track',
+        '060e2b34.0401.0101.01030202.02000000' => 'Sound Essence Track',
+        '060e2b34.0401.0101.01030202.03000000' => 'Data Essence Track',
+    },
+);
+
+# MXF tags (ref 1)
+# Note: The Binary flag is automatically set for all Unknown tags with unknown Type
+%Image::ExifTool::MXF::Main = (
+    GROUPS => { 2 => 'Video' },
+    PROCESS_PROC => 0,  # set this to zero to omit tags from lookup (way too many!)
+    VARS => { NO_ID => 1 }, # tag ID's are too bulky for documentation
+    NOTES => q{
+        Tags extracted from Material Exchange Format files.  Tag ID's are not listed
+        because they are bulky 16-byte binary values.
+    },
+  # '060a2b34.0101.0101.01010100.00000000' => { Name => 'UMIDVideo', Type => 'Node' },
+  # '060a2b34.0101.0101.01010110.00000000' => { Name => 'UMIDVideo', Unknown => 1 },
+  # '060a2b34.0101.0101.01010111.00000000' => { Name => 'UMIDVideo', Unknown => 1 },
+  # '060a2b34.0101.0101.01010112.00000000' => { Name => 'UMIDVideo', Unknown => 1 },
+  # '060a2b34.0101.0101.01010120.00000000' => { Name => 'UMIDVideo', Unknown => 1 },
+  # '060a2b34.0101.0101.01010121.00000000' => { Name => 'UMIDVideo', Unknown => 1 },
+  # '060a2b34.0101.0101.01010122.00000000' => { Name => 'UMIDVideo', Unknown => 1 },
+  # '060a2b34.0101.0101.01010200.00000000' => { Name => 'UMIDAudio', Type => 'Node' },
+  # '060a2b34.0101.0101.01010210.00000000' => { Name => 'UMIDAudio', Unknown => 1 },
+  # '060a2b34.0101.0101.01010211.00000000' => { Name => 'UMIDAudio', Unknown => 1 },
+  # '060a2b34.0101.0101.01010212.00000000' => { Name => 'UMIDAudio', Unknown => 1 },
+  # '060a2b34.0101.0101.01010220.00000000' => { Name => 'UMIDAudio', Unknown => 1 },
+  # '060a2b34.0101.0101.01010221.00000000' => { Name => 'UMIDAudio', Unknown => 1 },
+  # '060a2b34.0101.0101.01010222.00000000' => { Name => 'UMIDAudio', Unknown => 1 },
+  # '060a2b34.0101.0101.01010300.00000000' => { Name => 'UMIDData', Type => 'Node' },
+  # '060a2b34.0101.0101.01010310.00000000' => { Name => 'UMIDData', Unknown => 1 },
+  # '060a2b34.0101.0101.01010311.00000000' => { Name => 'UMIDData', Unknown => 1 },
+  # '060a2b34.0101.0101.01010312.00000000' => { Name => 'UMIDData', Unknown => 1 },
+  # '060a2b34.0101.0101.01010320.00000000' => { Name => 'UMIDData', Unknown => 1 },
+  # '060a2b34.0101.0101.01010321.00000000' => { Name => 'UMIDData', Unknown => 1 },
+  # '060a2b34.0101.0101.01010322.00000000' => { Name => 'UMIDData', Unknown => 1 },
+  # '060a2b34.0101.0101.01010400.00000000' => { Name => 'UMIDSystem', Type => 'Node' },
+  # '060a2b34.0101.0101.01010410.00000000' => { Name => 'UMIDSystem', Unknown => 1 },
+  # '060a2b34.0101.0101.01010411.00000000' => { Name => 'UMIDSystem', Unknown => 1 },
+  # '060a2b34.0101.0101.01010412.00000000' => { Name => 'UMIDSystem', Unknown => 1 },
+  # '060a2b34.0101.0101.01010420.00000000' => { Name => 'UMIDSystem', Unknown => 1 },
+  # '060a2b34.0101.0101.01010421.00000000' => { Name => 'UMIDSystem', Unknown => 1 },
+  # '060a2b34.0101.0101.01010422.00000000' => { Name => 'UMIDSystem', Unknown => 1 },
+
+  # '060e2b34.0101.0101.00000000.00000000' => { Name => 'Elements', Type => 'Node' },
+  # '060e2b34.0101.0101.01000000.00000000' => { Name => 'Identifiers', Type => 'Node' },
+  # '060e2b34.0101.0101.01010000.00000000' => { Name => 'GloballyUniqueIdentifiers', Type => 'Node' },
+  # '060e2b34.0101.0101.01011000.00000000' => { Name => 'InternationalBroadcastingOrganizationIdentifiers', Type => 'Node' },
+    '060e2b34.0101.0101.01011001.00000000' => { Name => 'OrganizationID', Format => 'string' },
+  # '060e2b34.0101.0101.01011003.00000000' => { Name => 'ProgramIdentifiers', Type => 'Node' },
+    '060e2b34.0101.0101.01011003.01000000' => { Name => 'UPID', Unknown => 1 },
+    '060e2b34.0101.0101.01011003.02000000' => { Name => 'UPN', Unknown => 1 },
+  # '060e2b34.0101.0101.01011004.00000000' => { Name => 'PhysicalMediaIdentifiers', Type => 'Node' },
+  # '060e2b34.0101.0101.01011004.01000000' => { Name => 'TapeIdentifiers', Type => 'Node' },
+    '060e2b34.0101.0101.01011004.01010000' => { Name => 'IBTN', Unknown => 1 },
+  # '060e2b34.0101.0101.01011100.00000000' => { Name => 'InternationalStandardIdentifiers', Type => 'Node' },
+    '060e2b34.0101.0101.01011101.00000000' => { Name => 'ISAN', Unknown => 1 },
+    '060e2b34.0101.0101.01011102.00000000' => { Name => 'ISBN', Unknown => 1 },
+    '060e2b34.0101.0101.01011103.00000000' => { Name => 'ISSN', Unknown => 1 },
+    '060e2b34.0101.0101.01011104.00000000' => { Name => 'ISWC', Unknown => 1 },
+    '060e2b34.0101.0101.01011105.00000000' => { Name => 'ISMN', Unknown => 1 },
+    '060e2b34.0101.0101.01011106.00000000' => { Name => 'ISCI', Unknown => 1 },
+    '060e2b34.0101.0101.01011107.00000000' => { Name => 'ISRC', Unknown => 1 },
+    '060e2b34.0101.0101.01011108.00000000' => { Name => 'ISRN', Unknown => 1 },
+    '060e2b34.0101.0101.01011109.00000000' => { Name => 'ISBD', Unknown => 1 },
+    '060e2b34.0101.0101.0101110a.00000000' => { Name => 'ISTC', Unknown => 1 },
+  # '060e2b34.0101.0101.01011300.00000000' => { Name => 'InternationalStandardCompoundIdentifiers', Type => 'Node' },
+    '060e2b34.0101.0101.01011301.00000000' => { Name => 'SICI', Unknown => 1 },
+    '060e2b34.0101.0101.01011302.00000000' => { Name => 'BICI', Unknown => 1 },
+    '060e2b34.0101.0101.01011303.00000000' => { Name => 'AICI', Unknown => 1 },
+    '060e2b34.0101.0101.01011304.00000000' => { Name => 'PII', Unknown => 1 },
+  # '060e2b34.0101.0101.01011500.00000000' => { Name => 'ObjectIdentifiers', Type => 'Node' },
+    '060e2b34.0101.0101.01011501.00000000' => { Name => 'DOI', Unknown => 1 },
+    '060e2b34.0101.0101.01011502.00000000' => { Name => 'InstanceUID', Type => 'GUID', Unknown => 1 },
+    '060e2b34.0101.0101.01011510.00000000' => { Name => 'PackageID', Type => 'PackageID', Unknown => 1 },
+  # '060e2b34.0101.0101.01012000.00000000' => { Name => 'DeviceIdentifiers', Type => 'Node' },
+    '060e2b34.0101.0101.01012001.00000000' => { Name => 'DeviceDesignation', Format => 'string' },
+    '060e2b34.0101.0101.01012003.00000000' => { Name => 'DeviceModel', Format => 'string' },
+    '060e2b34.0101.0101.01012004.00000000' => { Name => 'DeviceSerialNumber', Format => 'string' },
+  # '060e2b34.0101.0101.01020000.00000000' => { Name => 'GloballyUniqueLocators', Type => 'Node' },
+  # '060e2b34.0101.0101.01020100.00000000' => { Name => 'UniformResourceLocators', Type => 'Node' },
+    '060e2b34.0101.0101.01020101.00000000' => { Name => 'URL', Format => 'string' },
+    '060e2b34.0101.0101.01020101.01000000' => { Name => 'URL', Type => 'UTF-16' },
+    '060e2b34.0101.0101.01020102.00000000' => { Name => 'PURL', Format => 'string' },
+    '060e2b34.0101.0101.01020103.00000000' => { Name => 'URN', Format => 'string' },
+  # '060e2b34.0101.0101.01030000.00000000' => { Name => 'LocallyUniqueIdentifiers', Type => 'Node' },
+  # '060e2b34.0101.0101.01030100.00000000' => { Name => 'AdministrativeIdentifiers', Type => 'Node' },
+    '060e2b34.0101.0101.01030101.00000000' => { Name => 'TransmissionID', Format => 'string' },
+    '060e2b34.0101.0101.01030102.00000000' => { Name => 'ArchiveID', Format => 'string' },
+    '060e2b34.0101.0101.01030103.00000000' => { Name => 'ItemID', Format => 'string' },
+    '060e2b34.0101.0101.01030104.00000000' => { Name => 'AccountingReferenceNumber', Format => 'string' },
+    '060e2b34.0101.0101.01030105.00000000' => { Name => 'TrafficID', Format => 'string' },
+  # '060e2b34.0101.0101.01030200.00000000' => { Name => 'LocalPhysicalMediaIdentifiers', Type => 'Node' },
+  # '060e2b34.0101.0101.01030201.00000000' => { Name => 'LocalFilmID', Type => 'Node' },
+    '060e2b34.0101.0101.01030201.01000000' => { Name => 'ReelOrRollNumber', Format => 'string' },
+  # '060e2b34.0101.0101.01030202.00000000' => { Name => 'LocalTapeIdentifiers', Type => 'Node' },
+    '060e2b34.0101.0101.01030202.01000000' => { Name => 'LocalTapeNumber', Format => 'string' },
+  # '060e2b34.0101.0101.01030300.00000000' => { Name => 'LocalObjectIdentifiers', Type => 'Node' },
+    '060e2b34.0101.0101.01030301.00000000' => { Name => 'LUID', Format => 'int32u' },
+    '060e2b34.0101.0101.01030302.01000000' => { Name => 'PackageName', Type => 'UTF-16' },
+  # '060e2b34.0101.0101.01040000.00000000' => { Name => 'LocallyUniqueLocators', Type => 'Node' },
+  # '060e2b34.0101.0101.01040100.00000000' => { Name => 'MediaLocators', Type => 'Node' },
+    '060e2b34.0101.0101.01040101.00000000' => { Name => 'LocalFilePath', Format => 'string' },
+  # '060e2b34.0101.0101.01040700.00000000' => { Name => 'FilmLocators', Type => 'Node' },
+    '060e2b34.0101.0101.01040701.00000000' => { Name => 'EdgeCode', Format => 'string' },
+    '060e2b34.0101.0101.01040702.00000000' => { Name => 'FrameCode', Format => 'string' },
+    '060e2b34.0101.0101.01040703.00000000' => { Name => 'KeyCode', Type => 'KeyCode', Unknown => 1 },
+    '060e2b34.0101.0101.01040704.00000000' => { Name => 'InkNumber', Format => 'string' },
+  # '060e2b34.0101.0101.01041000.00000000' => { Name => 'ProxyLocators', Type => 'Node' },
+    '060e2b34.0101.0101.01041001.00000000' => { Name => 'KeyText', Format => 'string' },
+    '060e2b34.0101.0101.01041002.00000000' => { Name => 'KeyFrame', Format => 'string' },
+    '060e2b34.0101.0101.01041003.00000000' => { Name => 'KeySound', Format => 'string' },
+    '060e2b34.0101.0101.01041004.00000000' => { Name => 'KeyDataOrProgram', Format => 'string' },
+  # '060e2b34.0101.0101.01050000.00000000' => { Name => 'Titles', Type => 'Node' },
+    '060e2b34.0101.0101.01050100.00000000' => { Name => 'TitleKind', Format => 'string' },
+    '060e2b34.0101.0101.01050200.00000000' => { Name => 'MainTitle', Format => 'string' },
+    '060e2b34.0101.0101.01050300.00000000' => { Name => 'SecondaryTitle', Format => 'string' },
+    '060e2b34.0101.0101.01050400.00000000' => { Name => 'SeriesNumber', Format => 'string' },
+    '060e2b34.0101.0101.01050500.00000000' => { Name => 'EpisodeNumber', Format => 'string' },
+    '060e2b34.0101.0101.01050600.00000000' => { Name => 'SceneNumber', Format => 'string' },
+    '060e2b34.0101.0101.01050700.00000000' => { Name => 'TakeNumber', Format => 'int16u' },
+  # '060e2b34.0101.0101.01100000.00000000' => { Name => 'IntellectualPropertyRightsIdentifiers', Type => 'Node' },
+  # '060e2b34.0101.0101.01100100.00000000' => { Name => 'SUISACISACIPI', Type => 'Node' },
+    '060e2b34.0101.0101.01100101.00000000' => { Name => 'CISACLegalEntityID', Unknown => 1 },
+  # '060e2b34.0101.0101.01100200.00000000' => { Name => 'AGICOAIdentifers', Type => 'Node' },
+    '060e2b34.0101.0101.01100201.00000000' => { Name => 'AGICOAID', Unknown => 1 },
+  # '060e2b34.0101.0101.02000000.00000000' => { Name => 'ADMINISTRATION', Type => 'Node' },
+  # '060e2b34.0101.0101.02010000.00000000' => { Name => 'Supplier', Type => 'Node' },
+    '060e2b34.0101.0101.02010100.00000000' => { Name => 'SourceOrganization', Format => 'string' },
+    '060e2b34.0101.0101.02010200.00000000' => { Name => 'SupplyContractNumber', Format => 'string' },
+    '060e2b34.0101.0101.02010300.00000000' => { Name => 'OriginalProducerName', Format => 'string' },
+  # '060e2b34.0101.0101.02020000.00000000' => { Name => 'Product', Type => 'Node' },
+    '060e2b34.0101.0101.02020100.00000000' => { Name => 'TotalEpisodeCount', Format => 'int16u' },
+  # '060e2b34.0101.0101.02050000.00000000' => { Name => 'Rights', Type => 'Node' },
+  # '060e2b34.0101.0101.02050100.00000000' => { Name => 'Copyright', Type => 'Node' },
+    '060e2b34.0101.0101.02050101.00000000' => { Name => 'CopyrightStatus', Format => 'string' },
+    '060e2b34.0101.0101.02050102.00000000' => { Name => 'CopyrightOwnerName', Format => 'string' },
+  # '060e2b34.0101.0101.02050200.00000000' => { Name => 'IntellectualRights', Type => 'Node' },
+    '060e2b34.0101.0101.02050201.00000000' => { Name => 'IntellectualPropertyDescription', Format => 'string' },
+    '060e2b34.0101.0101.02050202.00000000' => { Name => 'IntellectualPropertyRights', Format => 'string' },
+  # '060e2b34.0101.0101.02050300.00000000' => { Name => 'LegalPersonalities', Type => 'Node' },
+    '060e2b34.0101.0101.02050301.00000000' => { Name => 'Rightsholder', Format => 'string' },
+    '060e2b34.0101.0101.02050302.00000000' => { Name => 'RightsManagementAuthority', Format => 'string' },
+    '060e2b34.0101.0101.02050303.00000000' => { Name => 'InterestedPartyName', Format => 'string' },
+  # '060e2b34.0101.0101.02050400.00000000' => { Name => 'IntellectualPropertyRightsOptions', Type => 'Node' },
+    '060e2b34.0101.0101.02050401.00000000' => { Name => 'MaximumUseCount', Format => 'int16u' },
+    '060e2b34.0101.0101.02050402.00000000' => { Name => 'LicenseOptionsDescription', Format => 'string' },
+  # '060e2b34.0101.0101.02060000.00000000' => { Name => 'FinancialInformation', Type => 'Node' },
+  # '060e2b34.0101.0101.02060100.00000000' => { Name => 'Currencies', Type => 'Node' },
+    '060e2b34.0101.0101.02060101.00000000' => { Name => 'CurrencyCode', Format => 'string' },
+  # '060e2b34.0101.0101.02060200.00000000' => { Name => 'PaymentsAndCosts', Type => 'Node' },
+    '060e2b34.0101.0101.02060201.00000000' => { Name => 'RoyaltyPaymentInformation', Format => 'string' },
+  # '060e2b34.0101.0101.02060300.00000000' => { Name => 'Income', Type => 'Node' },
+    '060e2b34.0101.0101.02060301.00000000' => { Name => 'RoyaltyIncomeInformation', Format => 'string' },
+  # '060e2b34.0101.0101.02070000.00000000' => { Name => 'AccessControl', Type => 'Node' },
+    '060e2b34.0101.0101.02070100.00000000' => { Name => 'RestrictionsonUse', Format => 'string' },
+    '060e2b34.0101.0101.02070200.00000000' => { Name => 'ExCCIData', Type => 'DataBlock', Unknown => 1 },
+  # '060e2b34.0101.0101.02080000.00000000' => { Name => 'Security', Type => 'Node' },
+  # '060e2b34.0101.0101.02080100.00000000' => { Name => 'SystemAccess', Type => 'Node' },
+    '060e2b34.0101.0101.02080101.00000000' => { Name => 'Username', Format => 'string' },
+    '060e2b34.0101.0101.02080101.01000000' => { Name => 'Username', Type => 'UTF-16' },
+    '060e2b34.0101.0101.02080102.00000000' => { Name => 'Password', Format => 'string' },
+    '060e2b34.0101.0101.02080102.01000000' => { Name => 'Password', Type => 'UTF-16' },
+  # '060e2b34.0101.0101.02090000.00000000' => { Name => 'Encryption', Type => 'Node' },
+  # '060e2b34.0101.0101.02090100.00000000' => { Name => 'FilmEncryption', Type => 'Node' },
+  # '060e2b34.0101.0101.02090101.00000000' => { Name => 'ScramblingKeys', Type => 'Node' },
+    '060e2b34.0101.0101.02090101.01000000' => { Name => 'ScramblingKeyKind', Format => 'string' },
+    '060e2b34.0101.0101.02090101.02000000' => { Name => 'ScramblingKeyValue', Format => 'int8u' },
+  # '060e2b34.0101.0101.02100000.00000000' => { Name => 'PublicationOutlet', Type => 'Node' },
+  # '060e2b34.0101.0101.02100100.00000000' => { Name => 'Broadcast', Type => 'Node' },
+  # '060e2b34.0101.0101.02100101.00000000' => { Name => 'Broadcaster', Type => 'Node' },
+    '060e2b34.0101.0101.02100101.01000000' => { Name => 'BroadcastOrganizationName', Format => 'string' },
+    '060e2b34.0101.0101.02100101.02000000' => { Name => 'BroadcastChannel', Format => 'string' },
+    '060e2b34.0101.0101.02100101.03000000' => { Name => 'BroadcastMediumKind', Format => 'string' },
+    '060e2b34.0101.0101.02100101.05000000' => { Name => 'BroadcastRegion', Format => 'string' },
+  # '060e2b34.0101.0101.02200000.00000000' => { Name => 'BroadcastAndRepeatInformation', Type => 'Node' },
+  # '060e2b34.0101.0101.02200100.00000000' => { Name => 'BroadcastFlags', Type => 'Node' },
+    '060e2b34.0101.0101.02200101.00000000' => { Name => 'FirstBroadcastFlag', Type => 'Boolean' },
+  # '060e2b34.0101.0101.02200200.00000000' => { Name => 'RepeatNumbers', Type => 'Node' },
+    '060e2b34.0101.0101.02200201.00000000' => { Name => 'CurrentRepeatNumber', Format => 'int16u' },
+    '060e2b34.0101.0101.02200202.00000000' => { Name => 'PreviousRepeatNumber', Format => 'int16u' },
+  # '060e2b34.0101.0101.02200300.00000000' => { Name => 'Ratings', Type => 'Node' },
+    '060e2b34.0101.0101.02200301.00000000' => { Name => 'AudienceRating', Format => 'int32u' },
+    '060e2b34.0101.0101.02200302.00000000' => { Name => 'AudienceReach', Format => 'int32u' },
+  # '060e2b34.0101.0101.02300000.00000000' => { Name => 'ParticipatingParties', Type => 'Node' },
+  # '060e2b34.0101.0101.02300100.00000000' => { Name => 'IndividualsAndGroups', Type => 'Node' },
+    '060e2b34.0101.0101.02300101.00000000' => { Name => 'NatureOfPersonality', Format => 'string' },
+  # '060e2b34.0101.0101.02300102.00000000' => { Name => 'Production', Type => 'Node' },
+    '060e2b34.0101.0101.02300102.01000000' => { Name => 'ContributionStatus', Format => 'string' },
+  # '060e2b34.0101.0101.02300103.00000000' => { Name => 'SupportAndAdministrationDetails', Type => 'Node' },
+    '060e2b34.0101.0101.02300103.01000000' => { Name => 'SupportOrAdministrationStatus', Format => 'string' },
+  # '060e2b34.0101.0101.02300200.00000000' => { Name => 'OrganizationsAndPublicBodies', Type => 'Node' },
+    '060e2b34.0101.0101.02300201.00000000' => { Name => 'OrganizationKind', Format => 'string' },
+  # '060e2b34.0101.0101.02300202.00000000' => { Name => 'ProductionOrganizationOrPublicBody', Type => 'Node' },
+    '060e2b34.0101.0101.02300202.01000000' => { Name => 'ProductionOrganizationRole', Format => 'string' },
+  # '060e2b34.0101.0101.02300203.00000000' => { Name => 'SupportAndAdministrationOrganizationOrPublicBody', Type => 'Node' },
+    '060e2b34.0101.0101.02300203.01000000' => { Name => 'SupportOrganizationRole', Format => 'string' },
+  # '060e2b34.0101.0101.02300500.00000000' => { Name => 'JobFunctionInformation', Type => 'Node' },
+    '060e2b34.0101.0101.02300501.00000000' => { Name => 'JobFunctionName', Format => 'string' },
+    '060e2b34.0101.0101.02300502.00000000' => { Name => 'RoleName', Format => 'string' },
+  # '060e2b34.0101.0101.02300600.00000000' => { Name => 'ContactInformation', Type => 'Node' },
+    '060e2b34.0101.0101.02300601.00000000' => { Name => 'ContactKind', Format => 'string' },
+    '060e2b34.0101.0101.02300602.00000000' => { Name => 'ContactDepartmentName', Format => 'string' },
+  # '060e2b34.0101.0101.02300603.00000000' => { Name => 'PersonOrOrganizationDetails', Type => 'Node' },
+  # '060e2b34.0101.0101.02300603.01000000' => { Name => 'PersonNames', Type => 'Node' },
+    '060e2b34.0101.0101.02300603.01010000' => { Name => 'FamilyName', Format => 'string' },
+    '060e2b34.0101.0101.02300603.01020000' => { Name => 'FirstGivenName', Format => 'string' },
+    '060e2b34.0101.0101.02300603.01030000' => { Name => 'SecondGivenName', Format => 'string' },
+    '060e2b34.0101.0101.02300603.01040000' => { Name => 'ThirdGivenName', Format => 'string' },
+  # '060e2b34.0101.0101.02300603.02000000' => { Name => 'GroupNames', Type => 'Node' },
+    '060e2b34.0101.0101.02300603.02010000' => { Name => 'MainName', Format => 'string' },
+    '060e2b34.0101.0101.02300603.02020000' => { Name => 'SupplementaryName', Format => 'string' },
+  # '060e2b34.0101.0101.02300603.03000000' => { Name => 'OrganizationNames', Type => 'Node' },
+    '060e2b34.0101.0101.02300603.03010000' => { Name => 'OrganizationMainName', Format => 'string' },
+    '060e2b34.0101.0101.02300603.03020000' => { Name => 'SupplementaryOrganizationName', Format => 'string' },
+  # '060e2b34.0101.0101.03000000.00000000' => { Name => 'Interpretive', Type => 'Node' },
+  # '060e2b34.0101.0101.03010000.00000000' => { Name => 'Fundamental', Type => 'Node' },
+  # '060e2b34.0101.0101.03010100.00000000' => { Name => 'CountriesAndLanguages', Type => 'Node' },
+  # '060e2b34.0101.0101.03010101.00000000' => { Name => 'CountryAndRegionCodes', Type => 'Node' },
+    '060e2b34.0101.0101.03010101.01000000' => { Name => 'ISO3166CountryCode', Format => 'string' },
+  # '060e2b34.0101.0101.03010102.00000000' => { Name => 'LanguageCodes', Type => 'Node' },
+    '060e2b34.0101.0101.03010102.01000000' => { Name => 'ISO639-1LanguageCode', Format => 'string' },
+  # '060e2b34.0101.0101.03010201.00000000' => { Name => 'SystemInterpretations', Type => 'Node' },
+    '060e2b34.0101.0101.03010201.01000000' => { Name => 'OperatingSystemInterpretations', Format => 'int8u' },
+    '060e2b34.0101.0101.03010201.02000000' => {
+        Name => 'ByteOrder', #PH (was int16s, but I have seen "II")
+        Format => 'string',
+        PrintConv => {
+            II => 'Little-endian (Intel, II)',
+            MM => 'Big-endian (Motorola, MM)',
+        },
+    },
+    '060e2b34.0101.0101.03010201.03000000' => { Name => 'EssenceIsIdentified', Type => 'Boolean' },
+  # '060e2b34.0101.0101.03010300.00000000' => { Name => 'FundamentalDimensions', Type => 'Node' },
+  # '060e2b34.0101.0101.03010301.00000000' => { Name => 'Length', Type => 'Node' },
+    '060e2b34.0101.0101.03010301.01000000' => { Name => 'LengthSystemName', Format => 'string' },
+    '060e2b34.0101.0101.03010301.02000000' => { Name => 'LengthUnitKind', Format => 'string' },
+  # '060e2b34.0101.0101.03010302.00000000' => { Name => 'Angles', Type => 'Node' },
+    '060e2b34.0101.0101.03010302.01000000' => { Name => 'AngularUnitKind', Format => 'string' },
+  # '060e2b34.0101.0101.03010303.00000000' => { Name => 'Time', Type => 'Node' },
+    '060e2b34.0101.0101.03010303.01000000' => { Name => 'TimeSystemOffset', Format => 'string' },
+    '060e2b34.0101.0101.03010303.02000000' => { Name => 'TimeUnitKind', Format => 'string' },
+  # '060e2b34.0101.0101.03010304.00000000' => { Name => 'Mass', Type => 'Node' },
+  # '060e2b34.0101.0101.03010305.00000000' => { Name => 'Energy', Type => 'Node' },
+  # '060e2b34.0101.0101.03020000.00000000' => { Name => 'HumanAssignedDescriptors', Type => 'Node' },
+  # '060e2b34.0101.0101.03020100.00000000' => { Name => 'Categorization', Type => 'Node' },
+  # '060e2b34.0101.0101.03020101.00000000' => { Name => 'ContentClassification', Type => 'Node' },
+    '060e2b34.0101.0101.03020101.01000000' => { Name => 'ContentCodingSystem', Format => 'string' },
+    '060e2b34.0101.0101.03020101.02000000' => { Name => 'ProgramKind', Format => 'string' },
+    '060e2b34.0101.0101.03020101.03000000' => { Name => 'Genre', Format => 'string' },
+    '060e2b34.0101.0101.03020101.04000000' => { Name => 'TargetAudience', Format => 'string' },
+  # '060e2b34.0101.0101.03020102.00000000' => { Name => 'CatalogingAndIndexing', Type => 'Node' },
+    '060e2b34.0101.0101.03020102.01000000' => { Name => 'CatalogDataStatus', Format => 'string' },
+    '060e2b34.0101.0101.03020102.02000000' => { Name => 'ThesaurusName', Format => 'string' },
+    '060e2b34.0101.0101.03020102.03000000' => { Name => 'Theme', Format => 'string' },
+    '060e2b34.0101.0101.03020102.04000000' => { Name => 'ContentClassification', Format => 'string' },
+    '060e2b34.0101.0101.03020102.05000000' => { Name => 'Keywords', Format => 'string' },
+    '060e2b34.0101.0101.03020102.06000000' => { Name => 'KeyFrames', Format => 'string' },
+    '060e2b34.0101.0101.03020102.07000000' => { Name => 'KeySounds', Format => 'string' },
+    '060e2b34.0101.0101.03020102.08000000' => { Name => 'KeyData', Format => 'string' },
+  # '060e2b34.0101.0101.03020106.00000000' => { Name => 'TextualDescription', Type => 'Node' },
+    '060e2b34.0101.0101.03020106.01000000' => { Name => 'Abstract', Format => 'string' },
+    '060e2b34.0101.0101.03020106.02000000' => { Name => 'Purpose', Format => 'string' },
+    '060e2b34.0101.0101.03020106.03000000' => { Name => 'Description', Format => 'string' },
+    '060e2b34.0101.0101.03020106.04000000' => { Name => 'ColorDescriptor', Format => 'string' },
+    '060e2b34.0101.0101.03020106.05000000' => { Name => 'FormatDescriptor', Format => 'string' },
+  # '060e2b34.0101.0101.03020107.00000000' => { Name => 'Stratum', Type => 'Node' },
+    '060e2b34.0101.0101.03020107.01000000' => { Name => 'StratumKind', Format => 'string' },
+  # '060e2b34.0101.0101.03020200.00000000' => { Name => 'Assessments', Type => 'Node' },
+  # '060e2b34.0101.0101.03020201.00000000' => { Name => 'Awards', Type => 'Node' },
+    '060e2b34.0101.0101.03020201.01000000' => { Name => 'IndividualAwardName', Format => 'string' },
+    '060e2b34.0101.0101.03020201.02000000' => { Name => 'ProgramAwardName', Format => 'string' },
+  # '060e2b34.0101.0101.03020202.00000000' => { Name => 'QualitativeValues', Type => 'Node' },
+    '060e2b34.0101.0101.03020202.01000000' => { Name => 'AssetValue', Format => 'string' },
+    '060e2b34.0101.0101.03020202.02000000' => { Name => 'ContentValue', Format => 'string' },
+    '060e2b34.0101.0101.03020202.03000000' => { Name => 'CulturalValue', Format => 'string' },
+    '060e2b34.0101.0101.03020202.04000000' => { Name => 'AestheticValue', Format => 'string' },
+    '060e2b34.0101.0101.03020202.05000000' => { Name => 'HistoricalValue', Format => 'string' },
+    '060e2b34.0101.0101.03020202.06000000' => { Name => 'TechnicalValue', Format => 'string' },
+    '060e2b34.0101.0101.03020202.07000000' => { Name => 'OtherValues', Format => 'string' },
+  # '060e2b34.0101.0101.03020300.00000000' => { Name => 'TechnicalCommentsAndDescriptions', Type => 'Node' },
+  # '060e2b34.0101.0101.03020301.00000000' => { Name => 'ObjectCommentsAndDescriptions', Type => 'Node' },
+  # '060e2b34.0101.0101.03030000.00000000' => { Name => 'Machine-AssignedOrComputedDescriptions', Type => 'Node' },
+  # '060e2b34.0101.0101.03030100.00000000' => { Name => 'AutomatedCategorization', Type => 'Node' },
+  # '060e2b34.0101.0101.03030101.00000000' => { Name => 'AutomatedContentClassification', Type => 'Node' },
+  # '060e2b34.0101.0101.03030102.00000000' => { Name => 'AutomatedCatalogingAndIndexing', Type => 'Node' },
+    '060e2b34.0101.0101.03030102.01000000' => { Name => 'CatalogDataStatus', Format => 'string' },
+    '060e2b34.0101.0101.03030102.02000000' => { Name => 'CatalogingSystemName', Format => 'string' },
+    '060e2b34.0101.0101.03030102.06000000' => { Name => 'ComputedKeywords', Format => 'string' },
+    '060e2b34.0101.0101.03030102.07000000' => { Name => 'ComputedKeyFrames', Format => 'string' },
+    '060e2b34.0101.0101.03030102.08000000' => { Name => 'ComputedKeySounds', Format => 'string' },
+    '060e2b34.0101.0101.03030102.09000000' => { Name => 'ComputedKeyData', Format => 'string' },
+  # '060e2b34.0101.0101.03030106.00000000' => { Name => 'ComputedTextualDescription', Type => 'Node' },
+  # '060e2b34.0101.0101.03030107.00000000' => { Name => 'AutomatedStratum', Type => 'Node' },
+    '060e2b34.0101.0101.03030107.01000000' => { Name => 'ComputedStratumKind', Format => 'string' },
+  # '060e2b34.0101.0101.03030300.00000000' => { Name => 'ComputedTechnicalCommentsAndDescriptions', Type => 'Node' },
+  # '060e2b34.0101.0101.03030301.00000000' => { Name => 'ComputedObjectCommentsAndDescriptions', Type => 'Node' },
+  # '060e2b34.0101.0101.04000000.00000000' => { Name => 'PARAMETRIC', Type => 'Node' },
+  # '060e2b34.0101.0101.04010000.00000000' => { Name => 'VideoAndImageEssenceCharacteristics', Type => 'Node' },
+  # '060e2b34.0101.0101.04010100.00000000' => { Name => 'FundamentalImageCharacteristics', Type => 'Node' },
+  # '060e2b34.0101.0101.04010101.00000000' => { Name => 'AspectRatios', Type => 'Node' },
+    '060e2b34.0101.0101.04010101.01000000' => { Name => 'PresentationAspectRatio', Format => 'rational64s' },
+    '060e2b34.0101.0101.04010101.02000000' => { Name => 'CaptureAspectRatio', Format => 'string' },
+  # '060e2b34.0101.0101.04010200.00000000' => { Name => 'ImageSourceCharacteristics', Type => 'Node' },
+  # '060e2b34.0101.0101.04010201.00000000' => { Name => 'Opto-ElectronicFormulation', Type => 'Node' },
+  # '060e2b34.0101.0101.04010201.01000000' => { Name => 'TransferCharacteristics', Type => 'Node' },
+    '060e2b34.0101.0101.04010201.01010000' => { Name => 'CaptureGammaEquation', Format => 'string' },
+    '060e2b34.0101.0101.04010201.01010100' => { Name => 'CaptureGammaEquation', Format => 'rational64s' },
+    '060e2b34.0101.0101.04010201.01020000' => { Name => 'LumaEquation', Format => 'string' },
+    '060e2b34.0101.0101.04010201.01030000' => { Name => 'ColorimetryCode', Format => 'string' },
+    '060e2b34.0101.0101.04010201.01040000' => { Name => 'SignalFormCode', Format => 'string' },
+  # '060e2b34.0101.0101.04010300.00000000' => { Name => 'VideoAndImageScanningParameters', Type => 'Node' },
+  # '060e2b34.0101.0101.04010301.00000000' => { Name => 'TemporalParameters', Type => 'Node' },
+    '060e2b34.0101.0101.04010301.01000000' => { Name => 'ColorFieldCode', Format => 'int8u' },
+    '060e2b34.0101.0101.04010301.02000000' => { Name => 'FieldRate', Format => 'int16u' },
+    '060e2b34.0101.0101.04010301.03000000' => { Name => 'FrameRate', Format => 'int16u' },
+    '060e2b34.0101.0101.04010301.04000000' => { Name => 'FrameLayout', Format => 'int8u' },
+    '060e2b34.0101.0101.04010301.05000000' => { Name => 'SamplingStructureCode', Format => 'string' },
+  # '060e2b34.0101.0101.04010302.00000000' => { Name => 'VerticalParameters', Type => 'Node' },
+    '060e2b34.0101.0101.04010302.01000000' => { Name => 'TotalLinesperFrame', Format => 'int16u' },
+    '060e2b34.0101.0101.04010302.02000000' => { Name => 'ActiveLinesperFrame', Format => 'int16u' },
+    '060e2b34.0101.0101.04010302.03000000' => { Name => 'LeadingLines', Format => 'int32s' },
+    '060e2b34.0101.0101.04010302.04000000' => { Name => 'TrailingLines', Format => 'int32s' },
+  # '060e2b34.0101.0101.04010303.00000000' => { Name => 'HorizontalParameters', Type => 'Node' },
+  # '060e2b34.0101.0101.04010400.00000000' => { Name => 'AnalogVideoCodingCharacteristics', Type => 'Node' },
+    '060e2b34.0101.0101.04010401.00000000' => { Name => 'AnalogVideoSystemName', Format => 'string' },
+  # '060e2b34.0101.0101.04010500.00000000' => { Name => 'DigitalVideoAndImageCodingParameters', Type => 'Node' },
+  # '060e2b34.0101.0101.04010501.00000000' => { Name => 'DigitalVideoAndImageSamplingParameters', Type => 'Node' },
+    '060e2b34.0101.0101.04010501.01000000' => { Name => 'LuminanceSampleRate', Format => 'int8u' },
+    '060e2b34.0101.0101.04010501.02000000' => { Name => 'ActiveSamplesperLine', Format => 'int16u' },
+    '060e2b34.0101.0101.04010501.03000000' => { Name => 'TotalSamplesperLine', Format => 'int16u' },
+    '060e2b34.0101.0101.04010501.04000000' => { Name => 'SamplingHierarchyCode', Format => 'string' },
+    '060e2b34.0101.0101.04010501.05000000' => { Name => 'HorizontalSubsampling', Format => 'int32u' },
+    '060e2b34.0101.0101.04010501.06000000' => { Name => 'ColorSiting', Format => 'int8u' },
+    '060e2b34.0101.0101.04010501.07000000' => { Name => 'SampledHeight', Format => 'int32u' },
+    '060e2b34.0101.0101.04010501.08000000' => { Name => 'SampledWidth', Format => 'int32u' },
+    '060e2b34.0101.0101.04010501.09000000' => { Name => 'SampledXOffset', Format => 'int32s' },
+    '060e2b34.0101.0101.04010501.0a000000' => { Name => 'SampledYOffset', Format => 'int32s' },
+    '060e2b34.0101.0101.04010501.0b000000' => { Name => 'DisplayHeight', Format => 'int32u' },
+    '060e2b34.0101.0101.04010501.0c000000' => { Name => 'DisplayWidth', Format => 'int32u' },
+    '060e2b34.0101.0101.04010501.0d000000' => { Name => 'DisplayXOffset', Format => 'int32s' },
+    '060e2b34.0101.0101.04010501.0e000000' => { Name => 'DisplayYOffset', Format => 'int32s' },
+    '060e2b34.0101.0101.04010501.0f000000' => { Name => 'FilteringCode', Format => 'string' },
+  # '060e2b34.0101.0101.04010502.00000000' => { Name => 'DigitalVideoAndImageStorageParameters', Type => 'Node' },
+    '060e2b34.0101.0101.04010502.01000000' => { Name => 'ImageHeight', Format => 'int32u' }, # (renamed from StoredHeight)
+    '060e2b34.0101.0101.04010502.02000000' => { Name => 'ImageWidth', Format => 'int32u' }, # (renamed from StoredWidth)
+  # '060e2b34.0101.0101.04010503.00000000' => { Name => 'DigitalQuantizationAndLevelParameters', Type => 'Node' },
+    '060e2b34.0101.0101.04010503.01000000' => { Name => 'BitsperPixel', Format => 'int8u' },
+    '060e2b34.0101.0101.04010503.02000000' => { Name => 'RoundingMethodCode', Format => 'string' },
+    '060e2b34.0101.0101.04010503.03000000' => { Name => 'BlackReferenceLevel', Format => 'int32u' },
+    '060e2b34.0101.0101.04010503.04000000' => { Name => 'WhiteReferenceLevel', Format => 'int32u' },
+  # '060e2b34.0101.0101.04010600.00000000' => { Name => 'DigitalVideoAndImageCompressionParameters', Type => 'Node' },
+  # '060e2b34.0101.0101.04010602.00000000' => { Name => 'MPEGCodingParameters', Type => 'Node' },
+  # '060e2b34.0101.0101.04010602.01000000' => { Name => 'MPEG-2CodingParameters', Type => 'Node' },
+    '060e2b34.0101.0101.04010602.01010000' => { Name => 'FieldFrameTypeCode', Format => 'string' },
+  # '060e2b34.0101.0101.04010800.00000000' => { Name => 'Film-to-VideoCharacteristics', Type => 'Node' },
+  # '060e2b34.0101.0101.04010801.00000000' => { Name => 'FilmPulldownCharacteristics', Type => 'Node' },
+    '060e2b34.0101.0101.04010801.01000000' => { Name => 'PulldownSequence', Type => 'PulldownKind', Unknown => 1 },
+    '060e2b34.0101.0101.04010801.02000000' => { Name => 'PulldownFieldDominance', Type => 'Boolean' },
+    '060e2b34.0101.0101.04010801.03000000' => { Name => 'VideoAndFilmFrameRelationship', Format => 'int8u' },
+  # '060e2b34.0101.0101.04010802.00000000' => { Name => 'FilmFrameRates', Type => 'Node' },
+    '060e2b34.0101.0101.04010802.01000000' => { Name => 'CaptureFilmFrameRate', Format => 'string' },
+    '060e2b34.0101.0101.04010802.02000000' => { Name => 'TransferFilmFrameRate', Format => 'string' },
+  # '060e2b34.0101.0101.04011000.00000000' => { Name => 'ImageTestParameters', Type => 'Node' },
+  # '060e2b34.0101.0101.04011001.00000000' => { Name => 'VideoTestParameters', Type => 'Node' },
+    '060e2b34.0101.0101.04011001.01000000' => { Name => 'VideoTestParameter', Format => 'string' },
+    '060e2b34.0101.0101.04011001.02000000' => { Name => 'VideoTestResult', Format => 'float' },
+    '060e2b34.0101.0101.04011001.03000000' => { Name => 'VideoTestResult', Format => 'int32u' },
+  # '060e2b34.0101.0101.04011002.00000000' => { Name => 'FilmTestParameters', Type => 'Node' },
+    '060e2b34.0101.0101.04011002.01000000' => { Name => 'FilmTestParameter', Format => 'string' },
+    '060e2b34.0101.0101.04011002.02000000' => { Name => 'FilmTestResult', Format => 'float' },
+    '060e2b34.0101.0101.04011002.03000000' => { Name => 'FilmTestResult', Type => 'SIMSBF', Unknown => 1, Groups => { 2 => 'Time' } },
+  # '060e2b34.0101.0101.04020000.00000000' => { Name => 'AudioEssenceCharacteristics', Type => 'Node' },
+  # '060e2b34.0101.0101.04020100.00000000' => { Name => 'FundamentalAudioCharacteristics', Type => 'Node' },
+  # '060e2b34.0101.0101.04020101.00000000' => { Name => 'AudioFormulation', Type => 'Node' },
+    '060e2b34.0101.0101.04020101.01000000' => { Name => 'ElectrospatialFormulation', Format => 'int8u', Groups => { 2 => 'Audio' } },
+    '060e2b34.0101.0101.04020101.02000000' => { Name => 'FilteringApplied', Format => 'string', Groups => { 2 => 'Audio' } },
+    '060e2b34.0101.0101.04020101.03000000' => { Name => 'AudioReferenceLevel', Format => 'int8s', Groups => { 2 => 'Audio' } },
+  # '060e2b34.0101.0101.04020101.10000000' => { Name => 'AudioMix', Type => 'Node' },
+    '060e2b34.0101.0101.04020101.10010000' => { Name => 'AudioMonoChannelCount', Format => 'int8u', Groups => { 2 => 'Audio' } },
+    '060e2b34.0101.0101.04020101.10020000' => { Name => 'AudioStereoChannelCount', Format => 'int8u', Groups => { 2 => 'Audio' } },
+  # '060e2b34.0101.0101.04020200.00000000' => { Name => 'AnalogAudioCodingParameters', Type => 'Node' },
+    '060e2b34.0101.0101.04020201.00000000' => { Name => 'AnalogSystem', Format => 'string', Groups => { 2 => 'Audio' } },
+  # '060e2b34.0101.0101.04020300.00000000' => { Name => 'DigitalAudioCodingParameters', Type => 'Node' },
+  # '060e2b34.0101.0101.04020301.00000000' => { Name => 'DigitalSamplingParameters', Type => 'Node' },
+    '060e2b34.0101.0101.04020301.01000000' => { Name => 'AudioSampleRate', Format => 'int8u', Groups => { 2 => 'Audio' } },
+  # '060e2b34.0101.0101.04020302.00000000' => { Name => 'DigitalAudioStorageParameters', Type => 'Node' },
+  # '060e2b34.0101.0101.04020303.00000000' => { Name => 'DigitalAudioQuantizationAndLevelParameters', Type => 'Node' },
+    '060e2b34.0101.0101.04020303.01000000' => { Name => 'BitsPerSample', Format => 'int8u', Groups => { 2 => 'Audio' } },
+    '060e2b34.0101.0101.04020303.02000000' => { Name => 'RoundingLaw', Format => 'string', Groups => { 2 => 'Audio' } },
+    '060e2b34.0101.0101.04020303.03000000' => { Name => 'Dither', Format => 'string', Groups => { 2 => 'Audio' } },
+  # '060e2b34.0101.0101.04020400.00000000' => { Name => 'DigitalAudioCompressionParameters', Type => 'Node' },
+  # '060e2b34.0101.0101.04020403.00000000' => { Name => 'MPEGAudioCodingParameters', Type => 'Node' },
+  # '060e2b34.0101.0101.04020403.01000000' => { Name => 'MPEG-1AudioCodingParameters', Type => 'Node' },
+  # '060e2b34.0101.0101.04020800.00000000' => { Name => 'FilmSoundSource', Type => 'Node' },
+    '060e2b34.0101.0101.04020801.00000000' => { Name => 'OpticalTrack', Format => 'string' },
+    '060e2b34.0101.0101.04020802.00000000' => { Name => 'MagneticTrack', Format => 'string' },
+  # '060e2b34.0101.0101.04021000.00000000' => { Name => 'AudioTestParameters', Type => 'Node' },
+    '060e2b34.0101.0101.04021001.00000000' => { Name => 'Signal-to-NoiseRatio', Format => 'float', Groups => { 2 => 'Audio' } },
+    '060e2b34.0101.0101.04021002.00000000' => { Name => 'Weighting', Format => 'string', Groups => { 2 => 'Audio' } },
+  # '060e2b34.0101.0101.04030000.00000000' => { Name => 'DataEssenceCharacteristics', Type => 'Node' },
+  # '060e2b34.0101.0101.04030100.00000000' => { Name => 'FundamentalDataEssenceParameters', Type => 'Node' },
+  # '060e2b34.0101.0101.04030200.00000000' => { Name => 'AnalogDataEssenceCodingParameters', Type => 'Node' },
+    '060e2b34.0101.0101.04030201.00000000' => { Name => 'AnalogDataCodingKind', Format => 'string' },
+  # '060e2b34.0101.0101.04030300.00000000' => { Name => 'DigitalDataEssenceCodingParameters', Type => 'Node' },
+  # '060e2b34.0101.0101.04031000.00000000' => { Name => 'DataEssenceTestParameters', Type => 'Node' },
+  # '060e2b34.0101.0101.04040000.00000000' => { Name => 'MetadataCharacteristics', Type => 'Node' },
+  # '060e2b34.0101.0101.04040100.00000000' => { Name => 'FundamentalMetadataCharacteristics', Type => 'Node' },
+  # '060e2b34.0101.0101.04040101.00000000' => { Name => 'TimecodeCharacteristics', Type => 'Node' },
+    '060e2b34.0101.0101.04040101.01000000' => { Name => 'TimecodeKind', Format => 'string' },
+    '060e2b34.0101.0101.04040101.02000000' => { Name => 'TimecodeTimebase', Format => 'int8u' },
+    '060e2b34.0101.0101.04040101.03000000' => { Name => 'TimecodeUserBitsFlag', Type => 'Boolean' },
+    '060e2b34.0101.0101.04040101.04000000' => { Name => 'IncludeSync', Type => 'Boolean' },
+    '060e2b34.0101.0101.04040101.05000000' => { Name => 'DropFrame', Type => 'Boolean' },
+  # '060e2b34.0101.0101.04040200.00000000' => { Name => 'AnalogMetadataCodingCharacteristics', Type => 'Node' },
+    '060e2b34.0101.0101.04040201.00000000' => { Name => 'TimecodeSourceKind', Format => 'int8u' },
+    '060e2b34.0101.0101.04040202.00000000' => { Name => 'AnalogMetadataCarrier', Format => 'string' },
+  # '060e2b34.0101.0101.04040300.00000000' => { Name => 'DigitalMetadataCodingCharacteristics', Type => 'Node' },
+    '060e2b34.0101.0101.04040301.00000000' => { Name => 'DigitalMetadataCarrier', Format => 'string' },
+  # '060e2b34.0101.0101.04041000.00000000' => { Name => 'MetadataTestParameters', Type => 'Node' },
+  # '060e2b34.0101.0101.04050000.00000000' => { Name => 'MonitoringAndControlCharacteristics', Type => 'Node' },
+  # '060e2b34.0101.0101.04050100.00000000' => { Name => 'FundamentalMonitoringAndControlCharacteristics', Type => 'Node' },
+  # '060e2b34.0101.0101.04050200.00000000' => { Name => 'AnalogMonitoringAndControlCodingCharacteristics', Type => 'Node' },
+    '060e2b34.0101.0101.04050201.00000000' => { Name => 'AnalogMonitoringAndControlCodingKind', Format => 'string' },
+  # '060e2b34.0101.0101.04050300.00000000' => { Name => 'DigitalMonitoringAndControlCodingParameters', Type => 'Node' },
+  # '060e2b34.0101.0101.04050301.00000000' => { Name => 'DigitalMonitoringAndControlSamplingParameters', Type => 'Node' },
+  # '060e2b34.0101.0101.04051000.00000000' => { Name => 'MonitoringAndControlTestParameters', Type => 'Node' },
+  # '060e2b34.0101.0101.04060000.00000000' => { Name => 'GeneralCodingCharacteristics', Type => 'Node' },
+  # '060e2b34.0101.0101.04060100.00000000' => { Name => 'GeneralEssenceCodingCharacteristics', Type => 'Node' },
+    '060e2b34.0101.0101.04060101.00000000' => { Name => 'SampleRate', Format => 'rational64s' },
+    '060e2b34.0101.0101.04060102.00000000' => { Name => 'EssenceLength', Type => 'Length', %duration },
+  # '060e2b34.0101.0101.04080000.00000000' => { Name => 'ObjectCharacteristics', Type => 'Node' },
+  # '060e2b34.0101.0101.04100000.00000000' => { Name => 'MediumCharacteristics', Type => 'Node' },
+  # '060e2b34.0101.0101.04100100.00000000' => { Name => 'StorageMediumParameters', Type => 'Node' },
+  # '060e2b34.0101.0101.04100101.00000000' => { Name => 'TapeMediumParameters', Type => 'Node' },
+  # '060e2b34.0101.0101.04100102.00000000' => { Name => 'DiscMediumParameters', Type => 'Node' },
+  # '060e2b34.0101.0101.04100103.00000000' => { Name => 'FilmMediumParameters', Type => 'Node' },
+  # '060e2b34.0101.0101.04100103.01000000' => { Name => 'GenericFilmMediumParameters', Type => 'Node' },
+    '060e2b34.0101.0101.04100103.01010000' => { Name => 'FilmColorProcess', Format => 'string' },
+    '060e2b34.0101.0101.04100103.01020000' => { Name => 'EdgeCodeFormat', Type => 'EdgeType', Unknown => 1 },
+    '060e2b34.0101.0101.04100103.01040000' => { Name => 'FilmFormatName', Format => 'string' },
+    '060e2b34.0101.0101.04100103.01050000' => { Name => 'FilmStockKind', Format => 'string' },
+    '060e2b34.0101.0101.04100103.01060000' => { Name => 'FilmStockManufacturerName', Format => 'string' },
+  # '060e2b34.0101.0101.04100103.02000000' => { Name => 'SpecificFilmMediumParameters', Type => 'Node' },
+    '060e2b34.0101.0101.04100103.02010000' => { Name => 'PhysicalMediaLength', Type => 'UIMSBF', Unknown => 1, Groups => { 2 => 'Time' } },
+    '060e2b34.0101.0101.04100103.02020000' => { Name => 'FilmCaptureAperture', Format => 'string' },
+  # '060e2b34.0101.0101.04200000.00000000' => { Name => 'DeviceCharacteristics', Type => 'Node' },
+  # '060e2b34.0101.0101.04200100.00000000' => { Name => 'CameraCharacteristics', Type => 'Node' },
+  # '060e2b34.0101.0101.04200101.00000000' => { Name => 'ImageCharacteristics', Type => 'Node' },
+    '060e2b34.0101.0101.04200101.01000000' => { Name => 'ImageCategory', Format => 'string' },
+  # '060e2b34.0101.0101.04200102.01000000' => { Name => 'ImageDevices', Type => 'Node' },
+    '060e2b34.0101.0101.04200102.01010000' => { Name => 'ImageSourceDeviceKind', Format => 'string' },
+  # '060e2b34.0101.0101.04200200.00000000' => { Name => 'OpticalCharacteristics', Type => 'Node' },
+  # '060e2b34.0101.0101.04200201.00000000' => { Name => 'OpticalTestParameters', Type => 'Node' },
+  # '060e2b34.0101.0101.04200201.01000000' => { Name => 'OpticalDeviceParameters', Type => 'Node' },
+    '060e2b34.0101.0101.04200201.01010000' => { Name => 'OpticalTestParameterName', Format => 'string' },
+    '060e2b34.0101.0101.04200201.01020000' => { Name => 'OpticalTestResult', Format => 'float' },
+    '060e2b34.0101.0101.04200201.01030000' => { Name => 'OpticalTestResult', Format => 'int32s' },
+  # '060e2b34.0101.0101.04200300.00000000' => { Name => 'MicrophoneCharacteristics', Type => 'Node' },
+    '060e2b34.0101.0101.04200301.00000000' => { Name => 'SensorType', Format => 'string' },
+    '060e2b34.0101.0101.04200302.00000000' => { Name => 'PolarCharacteristic', Format => 'string' },
+  # '060e2b34.0101.0101.05000000.00000000' => { Name => 'PROCESS', Type => 'Node' },
+  # '060e2b34.0101.0101.05010000.00000000' => { Name => 'GeneralProcessIndicators', Type => 'Node' },
+  # '060e2b34.0101.0101.05010100.00000000' => { Name => 'ProcessFundamentals', Type => 'Node' },
+    '060e2b34.0101.0101.05010101.00000000' => { Name => 'IntegrationIndication', Format => 'string' },
+    '060e2b34.0101.0101.05010102.00000000' => { Name => 'EventIndication', Format => 'string' },
+    '060e2b34.0101.0101.05010103.00000000' => { Name => 'QualityFlag', Type => 'Boolean' },
+    '060e2b34.0101.0101.05010105.00000000' => { Name => 'PhysicalInstanceKind', Format => 'string' },
+  # '060e2b34.0101.0101.05010200.00000000' => { Name => 'ContentCapture', Type => 'Node' },
+    '060e2b34.0101.0101.05010201.00000000' => { Name => 'DigitalOrAnalogOrigination', Format => 'string' },
+  # '060e2b34.0101.0101.05010202.00000000' => { Name => 'VideoOrImageCaptureProcess', Type => 'Node' },
+  # '060e2b34.0101.0101.05010203.00000000' => { Name => 'FilmCaptureProcess', Type => 'Node' },
+  # '060e2b34.0101.0101.05010204.00000000' => { Name => 'AudioCaptureProcess', Type => 'Node' },
+    '060e2b34.0101.0101.05010204.01000000' => { Name => 'MicrophonePlacementTechniques', Format => 'string', Groups => { 2 => 'Audio' } },
+  # '060e2b34.0101.0101.05010205.00000000' => { Name => 'DataCaptureProcess', Type => 'Node' },
+  # '060e2b34.0101.0101.05010300.00000000' => { Name => 'Manipulation', Type => 'Node' },
+    '060e2b34.0101.0101.05010301.00000000' => { Name => 'SimpleFlaggingCount', Format => 'int16u' },
+    '060e2b34.0101.0101.05010302.00000000' => { Name => 'CopyCount', Format => 'int8u' },
+    '060e2b34.0101.0101.05010303.00000000' => { Name => 'CloneCount', Format => 'int8u' },
+    '060e2b34.0101.0101.05010304.00000000' => { Name => 'Work-in-ProgressFlag', Type => 'Boolean' },
+  # '060e2b34.0101.0101.05020000.00000000' => { Name => 'CompressionProcessing', Type => 'Node' },
+  # '060e2b34.0101.0101.05020100.00000000' => { Name => 'VideoOrImageCompression', Type => 'Node' },
+    '060e2b34.0101.0101.05020101.00000000' => { Name => 'VideoOrImageCompressionAlgorithm', Format => 'string' },
+  # '060e2b34.0101.0101.05020102.00000000' => { Name => 'MPEGProcessing', Type => 'Node' },
+  # '060e2b34.0101.0101.05020102.01000000' => { Name => 'MPEG-2Processing', Type => 'Node' },
+    '060e2b34.0101.0101.05020102.01010000' => { Name => 'SplicingMetadata', Unknown => 1 },
+  # '060e2b34.0101.0101.05020200.00000000' => { Name => 'AudioCompression', Type => 'Node' },
+    '060e2b34.0101.0101.05020201.00000000' => { Name => 'AudioCompressionAlgorithm', Format => 'string', Groups => { 2 => 'Audio' } },
+  # '060e2b34.0101.0101.05020300.00000000' => { Name => 'DataEssenceCompression', Type => 'Node' },
+  # '060e2b34.0101.0101.05020400.00000000' => { Name => 'MetadataCompression', Type => 'Node' },
+  # '060e2b34.0101.0101.05030000.00000000' => { Name => 'NoiseReductionProcessing', Type => 'Node' },
+  # '060e2b34.0101.0101.05030100.00000000' => { Name => 'VideoNoiseReduction', Type => 'Node' },
+    '060e2b34.0101.0101.05030101.00000000' => { Name => 'VideoNoiseReductionAlgorithm', Format => 'string' },
+  # '060e2b34.0101.0101.05030200.00000000' => { Name => 'AudioNoiseReduction', Type => 'Node' },
+    '060e2b34.0101.0101.05030201.00000000' => { Name => 'AudioNoiseReductionAlgorithm', Format => 'string', Groups => { 2 => 'Audio' } },
+  # '060e2b34.0101.0101.05200000.00000000' => { Name => 'EnhancementOrModification', Type => 'Node' },
+  # '060e2b34.0101.0101.05200100.00000000' => { Name => 'ImageEssenceProcessing', Type => 'Node' },
+    '060e2b34.0101.0101.05200101.00000000' => { Name => 'EnhancementOrModificationDescription', Format => 'string' },
+  # '060e2b34.0101.0101.05200200.00000000' => { Name => 'VideoProcessOrSettings', Type => 'Node' },
+    '060e2b34.0101.0101.05200201.00000000' => { Name => 'VideoDeviceKind', Format => 'string' },
+    '060e2b34.0101.0101.05200202.00000000' => { Name => 'VideoDeviceParameterName', Format => 'string' },
+    '060e2b34.0101.0101.05200203.00000000' => { Name => 'VideoDeviceParameterSetting', Format => 'string' },
+  # '060e2b34.0101.0101.05200300.00000000' => { Name => 'AudioEssenceProcessing', Type => 'Node' },
+    '060e2b34.0101.0101.05200301.00000000' => { Name => 'AudioEnhancementOrModificationDescription', Format => 'string', Groups => { 2 => 'Audio' } },
+    '060e2b34.0101.0101.05200302.00000000' => { Name => 'AudioFirstMix-DownProcess', Format => 'string', Groups => { 2 => 'Audio' } },
+  # '060e2b34.0101.0101.05200400.00000000' => { Name => 'AudioProcessorSettings', Type => 'Node' },
+    '060e2b34.0101.0101.05200401.00000000' => { Name => 'AudioDeviceKind', Format => 'string', Groups => { 2 => 'Audio' } },
+    '060e2b34.0101.0101.05200402.00000000' => { Name => 'AudioDeviceParameter', Format => 'string', Groups => { 2 => 'Audio' } },
+    '060e2b34.0101.0101.05200403.00000000' => { Name => 'AudioDeviceParameterSetting', Format => 'string', Groups => { 2 => 'Audio' } },
+  # '060e2b34.0101.0101.05200500.00000000' => { Name => 'DataEssenceProcessing', Type => 'Node' },
+    '060e2b34.0101.0101.05200501.00000000' => { Name => 'DataEnhancementOrModificationDescription', Format => 'string' },
+  # '060e2b34.0101.0101.05200600.00000000' => { Name => 'DataProcessorSettings', Type => 'Node' },
+    '060e2b34.0101.0101.05200601.00000000' => { Name => 'DataDeviceKind', Format => 'string' },
+    '060e2b34.0101.0101.05200602.00000000' => { Name => 'DataDeviceParameterName', Format => 'string' },
+    '060e2b34.0101.0101.05200603.00000000' => { Name => 'DataDeviceParameterSetting', Format => 'string' },
+  # '060e2b34.0101.0101.05200700.00000000' => { Name => 'MetadataProcessing', Type => 'Node' },
+  # '060e2b34.0101.0101.05200800.00000000' => { Name => 'MetadataProcessorSettings', Type => 'Node' },
+  # '060e2b34.0101.0101.05300000.00000000' => { Name => 'EditingInformation', Type => 'Node' },
+  # '060e2b34.0101.0101.05300100.00000000' => { Name => 'EditingVersionInformation', Type => 'Node' },
+  # '060e2b34.0101.0101.05300200.00000000' => { Name => 'EditingDecisionInformation', Type => 'Node' },
+    '060e2b34.0101.0101.05300201.00000000' => { Name => 'DefaultFadeType', Type => 'FadeType', Unknown => 1 },
+  # '060e2b34.0101.0101.05300300.00000000' => { Name => 'EditingMatteInformation', Type => 'Node' },
+  # '060e2b34.0101.0101.05300400.00000000' => { Name => 'EditingEventInformation', Type => 'Node' },
+    '060e2b34.0101.0101.05300401.00000000' => { Name => 'ActiveState', Type => 'Boolean' },
+  # '060e2b34.0101.0101.05300500.00000000' => { Name => 'EditingEffectInformation', Type => 'Node' },
+    '060e2b34.0101.0101.05300501.00000000' => { Name => 'Fade-InType', Type => 'FadeType', Unknown => 1 },
+    '060e2b34.0101.0101.05300502.00000000' => { Name => 'Fade-OutType', Type => 'FadeType', Unknown => 1 },
+    '060e2b34.0101.0101.05300503.00000000' => { Name => 'SpeedChangeEffectFlag', Type => 'Boolean' },
+    '060e2b34.0101.0101.05300504.00000000' => { Name => 'InputSegmentCount', Format => 'int32s' },
+    '060e2b34.0101.0101.05300505.00000000' => { Name => 'Bypass', Format => 'int32u' },
+  # '060e2b34.0101.0101.05300600.00000000' => { Name => 'EditingWebInformation', Type => 'Node' },
+  # '060e2b34.0101.0101.05300700.00000000' => { Name => 'EditingUserNotes', Type => 'Node' },
+  # '060e2b34.0101.0101.05400000.00000000' => { Name => 'ProcessingHistory', Type => 'Node' },
+  # '060e2b34.0101.0101.05400100.00000000' => { Name => 'VideoCompressionHistory', Type => 'Node' },
+    '060e2b34.0101.0101.05400101.00000000' => { Name => 'VideoCompressionAlgorithm', Format => 'string' },
+    '060e2b34.0101.0101.05400102.00000000' => { Name => 'MPEGVideoRecodingDataset', Unknown => 1 },
+  # '060e2b34.0101.0101.05400200.00000000' => { Name => 'AudioCompressionHistory', Type => 'Node' },
+    '060e2b34.0101.0101.05400201.00000000' => { Name => 'UpstreamAudioCompressionAlgorithm', Format => 'string', Groups => { 2 => 'Audio' } },
+    '060e2b34.0101.0101.05400202.00000000' => { Name => 'MPEGAudioRecodingDataset', Unknown => 1, Groups => { 2 => 'Audio' } },
+  # '060e2b34.0101.0101.05400300.00000000' => { Name => 'DataCompressionHistory', Type => 'Node' },
+  # '060e2b34.0101.0101.05400400.00000000' => { Name => 'MetadataCompressionHistory', Type => 'Node' },
+  # '060e2b34.0101.0101.06000000.00000000' => { Name => 'RELATIONAL', Type => 'Node' },
+  # '060e2b34.0101.0101.06010000.00000000' => { Name => 'GenericRelationships', Type => 'Node' },
+  # '060e2b34.0101.0101.06010100.00000000' => { Name => 'EssenceAndMetadataRelationships', Type => 'Node' },
+  # '060e2b34.0101.0101.06010101.00000000' => { Name => 'EssenceToEssenceRelationships', Type => 'Node' },
+  # '060e2b34.0101.0101.06010102.00000000' => { Name => 'MetadataToEssenceRelationships', Type => 'Node' },
+  # '060e2b34.0101.0101.06010103.00000000' => { Name => 'MetadataToMetadataRelationships', Type => 'Node' },
+  # '060e2b34.0101.0101.06010104.00000000' => { Name => 'ObjectToObjectRelationships', Type => 'Node' },
+  # '060e2b34.0101.0101.06010105.00000000' => { Name => 'MetadataToObjectRelationships', Type => 'Node' },
+  # '060e2b34.0101.0101.06020000.00000000' => { Name => 'RelatedProductionMaterial', Type => 'Node' },
+    '060e2b34.0101.0101.06020100.00000000' => { Name => 'ProgramSupportMaterialReference', Format => 'string' },
+    '060e2b34.0101.0101.06020200.00000000' => { Name => 'AdvertisingMaterialReference', Format => 'string' },
+    '060e2b34.0101.0101.06020300.00000000' => { Name => 'ProgramCommercialMaterialReference', Format => 'string' },
+  # '060e2b34.0101.0101.06080000.00000000' => { Name => 'StreamAndStorageRelationships', Type => 'Node' },
+  # '060e2b34.0101.0101.06080100.00000000' => { Name => 'StreamRelationships', Type => 'Node' },
+  # '060e2b34.0101.0101.06080200.00000000' => { Name => 'StorageRelationships', Type => 'Node' },
+    '060e2b34.0101.0101.06080201.00000000' => { Name => 'ContiguousDataFlag', Type => 'Boolean' },
+  # '060e2b34.0101.0101.06100000.00000000' => { Name => 'NumericalSequence', Type => 'Node' },
+    '060e2b34.0101.0101.06100100.00000000' => { Name => 'PositionInSequence', Format => 'int32u' },
+    '060e2b34.0101.0101.06100200.00000000' => { Name => 'RelativePositionInSequenceOffset', Format => 'int32s' },
+    '060e2b34.0101.0101.06100300.00000000' => { Name => 'RelativePositionInSequenceName', Format => 'string' },
+  # '060e2b34.0101.0101.07000000.00000000' => { Name => 'SPATIO-TEMPORAL', Type => 'Node' },
+  # '060e2b34.0101.0101.07010000.00000000' => { Name => 'PositionAndSpaceVectors', Type => 'Node' },
+  # '060e2b34.0101.0101.07010100.00000000' => { Name => 'PositionalSystemInformation', Type => 'Node' },
+    '060e2b34.0101.0101.07010101.00000000' => { Name => 'ImageCoordinateSystem', Format => 'string' },
+    '060e2b34.0101.0101.07010102.00000000' => { Name => 'MapDatumUsed', Format => 'string' },
+  # '060e2b34.0101.0101.07010200.00000000' => { Name => 'PositionalInformation', Type => 'Node' },
+  # '060e2b34.0101.0101.07010201.00000000' => { Name => 'AbsolutePosition', Type => 'Node' },
+  # '060e2b34.0101.0101.07010201.01000000' => { Name => 'LocalDatumAbsolutePosition', Type => 'Node' },
+    '060e2b34.0101.0101.07010201.01010000' => { Name => 'LocalDatumAbsolutePositionAccuracy', Format => 'float' },
+  # '060e2b34.0101.0101.07010201.02000000' => { Name => 'DeviceAbsolutePosition', Type => 'Node' },
+    '060e2b34.0101.0101.07010201.02010000' => { Name => 'DeviceAbsolutePositionalAccuracy', Format => 'float' },
+    '060e2b34.0101.0101.07010201.02020000' => { Name => 'DeviceAltitude', Format => 'float', Groups => { 2 => 'Location' }, PrintConv => '$val m' },
+    '060e2b34.0101.0101.07010201.02020100' => { Name => 'DeviceAltitude', Type => 'Alt', Groups => { 2 => 'Location' }, PrintConv => '$val m' },
+    '060e2b34.0101.0101.07010201.02040000' => { Name => 'DeviceLatitude', Format => 'float', %geoLat },
+    '060e2b34.0101.0101.07010201.02040100' => { Name => 'DeviceLatitude', Type => 'Lat', %geoLat },
+    '060e2b34.0101.0101.07010201.02060000' => { Name => 'DeviceLongitude', Format => 'float', %geoLon },
+    '060e2b34.0101.0101.07010201.02060100' => { Name => 'DeviceLongitude', Type => 'Lon', %geoLon },
+    '060e2b34.0101.0101.07010201.02100000' => { Name => 'DeviceXDimension', Format => 'float' },
+    '060e2b34.0101.0101.07010201.02110000' => { Name => 'DeviceYDimension', Format => 'float' },
+  # '060e2b34.0101.0101.07010201.03000000' => { Name => 'SubjectAbsolutePosition', Type => 'Node' },
+    '060e2b34.0101.0101.07010201.03010000' => { Name => 'FramePositionalAccuracy', Format => 'float' },
+    '060e2b34.0101.0101.07010201.03020000' => { Name => 'FrameCenterLatitude', Format => 'double', %geoLat },
+    '060e2b34.0101.0101.07010201.03030000' => { Name => 'FrameCenterLatitude', Format => 'string', %geoLat, ValueConv => \&ConvLatLon },
+    '060e2b34.0101.0101.07010201.03040000' => { Name => 'FrameCenterLongitude', Format => 'double', %geoLon },
+    '060e2b34.0101.0101.07010201.03050000' => { Name => 'FrameCenterLongitude', Format => 'string', %geoLon, ValueConv => \&ConvLatLon },
+    '060e2b34.0101.0101.07010201.03060000' => { Name => 'FrameCenterLatitudeLongitude', Format => 'string', %geoLatLon, ValueConv => \&ConvLatLon },
+  # '060e2b34.0101.0101.07010202.00000000' => { Name => 'RelativePosition', Type => 'Node' },
+  # '060e2b34.0101.0101.07010202.01000000' => { Name => 'LocalDatumRelativePosition', Type => 'Node' },
+    '060e2b34.0101.0101.07010202.01010000' => { Name => 'LocalDatumRelativePositionAccuracy', Format => 'float' },
+  # '060e2b34.0101.0101.07010202.02000000' => { Name => 'DeviceRelativePosition', Type => 'Node' },
+    '060e2b34.0101.0101.07010202.02010000' => { Name => 'DeviceRelativePositionalAccuracy', Format => 'float' },
+    '060e2b34.0101.0101.07010202.02020000' => { Name => 'DeviceRelativePositionX', Format => 'float' },
+    '060e2b34.0101.0101.07010202.02030000' => { Name => 'DeviceRelativePositionY', Format => 'float' },
+    '060e2b34.0101.0101.07010202.02040000' => { Name => 'DeviceRelativePositionZ', Format => 'float' },
+  # '060e2b34.0101.0101.07010202.03000000' => { Name => 'SubjectRelativePosition', Type => 'Node' },
+    '060e2b34.0101.0101.07010202.03010000' => { Name => 'SubjectRelativePositionalAccuracy', Format => 'float' },
+  # '060e2b34.0101.0101.07010203.00000000' => { Name => 'ImagePositionalInformation', Type => 'Node' },
+    '060e2b34.0101.0101.07010203.01000000' => { Name => 'PositionWithinViewportImageXCoordinate', Format => 'int16s' },
+    '060e2b34.0101.0101.07010203.02000000' => { Name => 'PositionWithinViewportImageYCoordinate', Format => 'int16s' },
+    '060e2b34.0101.0101.07010203.03000000' => { Name => 'SourceImageCenterXCoordinate', Format => 'int16s' },
+    '060e2b34.0101.0101.07010203.04000000' => { Name => 'SourceImageCenterYCoordinate', Format => 'int16s' },
+    '060e2b34.0101.0101.07010203.05000000' => { Name => 'ViewportImageCenterCCoordinate', Format => 'int16s' },
+    '060e2b34.0101.0101.07010203.06000000' => { Name => 'ViewportImageCenterYCoordinate', Format => 'int16s' },
+  # '060e2b34.0101.0101.07010300.00000000' => { Name => 'RateAndDirectionOfPositionalChange', Type => 'Node' },
+  # '060e2b34.0101.0101.07010301.00000000' => { Name => 'AbsoluteRateAndDirectionOfPositionalChange', Type => 'Node' },
+  # '060e2b34.0101.0101.07010301.01000000' => { Name => 'DeviceRateAndDirectionOfPositionalChange', Type => 'Node' },
+    '060e2b34.0101.0101.07010301.01010000' => { Name => 'DeviceAbsoluteSpeed', Format => 'float' },
+    '060e2b34.0101.0101.07010301.01020000' => { Name => 'DeviceAbsoluteHeading', Format => 'float' },
+  # '060e2b34.0101.0101.07010301.02000000' => { Name => 'SubjectRateAndDirectionOfPositionalChange', Type => 'Node' },
+    '060e2b34.0101.0101.07010301.02010000' => { Name => 'SubjectAbsoluteSpeed', Format => 'float' },
+    '060e2b34.0101.0101.07010301.02020000' => { Name => 'SubjectAbsoluteHeading', Format => 'float' },
+  # '060e2b34.0101.0101.07010302.00000000' => { Name => 'RelativeRateAndDirectionOfPositionalChange', Type => 'Node' },
+  # '060e2b34.0101.0101.07010302.01000000' => { Name => 'DeviceRelativeRateAndDirectionOfPositionalChange', Type => 'Node' },
+    '060e2b34.0101.0101.07010302.01010000' => { Name => 'DeviceRelativeSpeed', Format => 'float' },
+    '060e2b34.0101.0101.07010302.01020000' => { Name => 'DeviceRelativeHeading', Format => 'float' },
+  # '060e2b34.0101.0101.07010302.02000000' => { Name => 'SubjectRelativeRateAndDirectionOfPositionalChange', Type => 'Node' },
+    '060e2b34.0101.0101.07010302.02010000' => { Name => 'SubjectRelativeSpeed', Format => 'float' },
+    '060e2b34.0101.0101.07010302.02020000' => { Name => 'SubjectRelativeHeading', Format => 'float' },
+  # '060e2b34.0101.0101.07010800.00000000' => { Name => 'DistanceMeasurements', Type => 'Node' },
+  # '060e2b34.0101.0101.07010801.00000000' => { Name => 'DeviceToSubjectDistance', Type => 'Node' },
+    '060e2b34.0101.0101.07010801.01000000' => { Name => 'SlantRange', Format => 'float' },
+  # '060e2b34.0101.0101.07010900.00000000' => { Name => 'Dimensions', Type => 'Node' },
+  # '060e2b34.0101.0101.07010901.00000000' => { Name => 'DeviceDimensions', Type => 'Node' },
+  # '060e2b34.0101.0101.07010902.00000000' => { Name => 'SubjectDimensions', Type => 'Node' },
+    '060e2b34.0101.0101.07010902.01000000' => { Name => 'TargetWidth', Format => 'float' },
+  # '060e2b34.0101.0101.07010903.00000000' => { Name => 'LocationDimensions', Type => 'Node' },
+  # '060e2b34.0101.0101.07010904.00000000' => { Name => 'MediaDimensions', Type => 'Node' },
+  # '060e2b34.0101.0101.07010904.01000000' => { Name => 'ImageDimensions', Type => 'Node' },
+  # '060e2b34.0101.0101.07010904.01010000' => { Name => 'Pan-and-ScanImageDimensions', Type => 'Node' },
+    '060e2b34.0101.0101.07010904.01010100' => { Name => 'ViewportHeight', Format => 'int16u' },
+    '060e2b34.0101.0101.07010904.01010200' => { Name => 'ViewportWidth', Format => 'int16u' },
+  # '060e2b34.0101.0101.07011000.00000000' => { Name => 'AngularSpecifications', Type => 'Node' },
+  # '060e2b34.0101.0101.07011001.00000000' => { Name => 'DeviceAngles', Type => 'Node' },
+    '060e2b34.0101.0101.07011001.01000000' => { Name => 'SensorRollAngle', Format => 'float' },
+    '060e2b34.0101.0101.07011001.02000000' => { Name => 'AngleToNorth', Format => 'float' },
+    '060e2b34.0101.0101.07011001.03000000' => { Name => 'ObliquityAngle', Format => 'float' },
+  # '060e2b34.0101.0101.07011002.00000000' => { Name => 'SubjectAngles', Type => 'Node' },
+  # '060e2b34.0101.0101.07012000.00000000' => { Name => 'AbstractLocations', Type => 'Node' },
+  # '060e2b34.0101.0101.07012001.00000000' => { Name => 'PlaceNames', Type => 'Node' },
+  # '060e2b34.0101.0101.07012001.01000000' => { Name => 'AbstractNames', Type => 'Node' },
+    '060e2b34.0101.0101.07012001.01010000' => { Name => 'PlaceKeyword', Format => 'string' },
+  # '060e2b34.0101.0101.07012001.02000000' => { Name => 'CountryCodes', Type => 'Node' },
+    '060e2b34.0101.0101.07012001.02010000' => { Name => 'ObjectCountryCode', Format => 'string' },
+    '060e2b34.0101.0101.07012001.02020000' => { Name => 'ShootingCountryCode', Format => 'string' },
+    '060e2b34.0101.0101.07012001.02030000' => { Name => 'SettingCountryCode', Format => 'string' },
+    '060e2b34.0101.0101.07012001.02040000' => { Name => 'CopyrightLicenseCountryCode', Format => 'string' },
+    '060e2b34.0101.0101.07012001.02050000' => { Name => 'IntellectualPropertyLicenseCountryCode', Format => 'string' },
+  # '060e2b34.0101.0101.07012001.03000000' => { Name => 'Regions', Type => 'Node' },
+    '060e2b34.0101.0101.07012001.03010000' => { Name => 'ObjectRegionCode', Format => 'string' },
+    '060e2b34.0101.0101.07012001.03020000' => { Name => 'ShootingRegionCode', Format => 'string' },
+    '060e2b34.0101.0101.07012001.03030000' => { Name => 'SettingRegionCode', Format => 'string' },
+    '060e2b34.0101.0101.07012001.03040000' => { Name => 'CopyrightLicenseRegionCode', Format => 'string' },
+    '060e2b34.0101.0101.07012001.03050000' => { Name => 'IntellectualPropertyLicenseRegionCode', Format => 'string' },
+  # '060e2b34.0101.0101.07012001.04000000' => { Name => 'Addresses', Type => 'Node' },
+  # '060e2b34.0101.0101.07012001.04010000' => { Name => 'PostalAddresses', Type => 'Node' },
+    '060e2b34.0101.0101.07012001.04010100' => { Name => 'RoomNumber', Format => 'string' },
+    '060e2b34.0101.0101.07012001.04010200' => { Name => 'StreetNumber', Format => 'string' },
+    '060e2b34.0101.0101.07012001.04010300' => { Name => 'StreetName', Format => 'string' },
+    '060e2b34.0101.0101.07012001.04010400' => { Name => 'PostalTown', Format => 'string' },
+    '060e2b34.0101.0101.07012001.04010500' => { Name => 'CityName', Format => 'string' },
+    '060e2b34.0101.0101.07012001.04010600' => { Name => 'StateOrProvinceOrCountyName', Format => 'string' },
+    '060e2b34.0101.0101.07012001.04010700' => { Name => 'PostalCode', Format => 'string' },
+    '060e2b34.0101.0101.07012001.04010800' => { Name => 'CountryName', Format => 'string' },
+  # '060e2b34.0101.0101.07012001.04020000' => { Name => 'SettingAddresses', Type => 'Node' },
+    '060e2b34.0101.0101.07012001.04020100' => { Name => 'SettingRoomNumber', Format => 'string' },
+    '060e2b34.0101.0101.07012001.04020200' => { Name => 'SettingStreetNumberOrBuildingName', Format => 'string' },
+    '060e2b34.0101.0101.07012001.04020300' => { Name => 'SettingStreetName', Format => 'string' },
+    '060e2b34.0101.0101.07012001.04020400' => { Name => 'SettingTownName', Format => 'string' },
+    '060e2b34.0101.0101.07012001.04020500' => { Name => 'SettingCityName', Format => 'string' },
+    '060e2b34.0101.0101.07012001.04020600' => { Name => 'SettingStateOrProvinceOrCountyName', Format => 'string' },
+    '060e2b34.0101.0101.07012001.04020700' => { Name => 'SettingPostalCode', Format => 'string' },
+    '060e2b34.0101.0101.07012001.04020800' => { Name => 'SettingCountryName', Format => 'string' },
+  # '060e2b34.0101.0101.07012001.10030000' => { Name => 'ElectronicAddressInformation', Type => 'Node' },
+    '060e2b34.0101.0101.07012001.10030100' => { Name => 'TelephoneNumber', Format => 'string' },
+    '060e2b34.0101.0101.07012001.10030200' => { Name => 'FaxNumber', Format => 'string' },
+    '060e2b34.0101.0101.07012001.10030300' => { Name => 'E-MailAddress', Format => 'string' },
+  # '060e2b34.0101.0101.07012002.00000000' => { Name => 'PlaceDescriptions', Type => 'Node' },
+    '060e2b34.0101.0101.07012002.01000000' => { Name => 'SettingDescription', Format => 'string' },
+  # '060e2b34.0101.0101.07020000.00000000' => { Name => 'Temporal', Type => 'Node' },
+  # '060e2b34.0101.0101.07020100.00000000' => { Name => 'DatesAndTimes', Type => 'Node' },
+  # '060e2b34.0101.0101.07020101.00000000' => { Name => 'GeneralDatesAndTimes', Type => 'Node' },
+  # '060e2b34.0101.0101.07020101.01000000' => { Name => 'UserDateTime', Type => 'Node' },
+    '060e2b34.0101.0101.07020101.01010000' => { Name => 'UTCUserDateTime', Format => 'string', Groups => { 2 => 'Time' } },
+    '060e2b34.0101.0101.07020101.01020000' => { Name => 'LocalUserDateTime', Format => 'string', Groups => { 2 => 'Time' } },
+    '060e2b34.0101.0101.07020101.01030000' => { Name => 'SMPTE309MUserDateTime', Type => 'UILSBF', Unknown => 1, Groups => { 2 => 'Time' } },
+    '060e2b34.0101.0101.07020101.01040000' => { Name => 'SMPTE12MUserDateTime', Type => 'UILSBF', Unknown => 1, Groups => { 2 => 'Time' } },
+  # '060e2b34.0101.0101.07020102.00000000' => { Name => 'AbsoluteDatesAndTimes', Type => 'Node' },
+  # '060e2b34.0101.0101.07020102.01000000' => { Name => 'MaterialStartTrueDateTime', Type => 'Node' },
+    '060e2b34.0101.0101.07020102.01010000' => { Name => 'UTCStartDateTime', Format => 'string', Groups => { 2 => 'Time' } },
+    '060e2b34.0101.0101.07020102.01020000' => { Name => 'LocalStartDateTime', Format => 'string', Groups => { 2 => 'Time' } },
+  # '060e2b34.0101.0101.07020102.02000000' => { Name => 'MaterialStartTimeAddress', Type => 'Node' },
+    '060e2b34.0101.0101.07020102.02010000' => { Name => 'TimecodeStartDateTime', Type => 'UILSBF', Unknown => 1, Groups => { 2 => 'Time' } },
+  # '060e2b34.0101.0101.07020102.03000000' => { Name => 'MaterialEndTrueDateTime', Type => 'Node' },
+    '060e2b34.0101.0101.07020102.03010000' => { Name => 'UTCEndDateTime', Format => 'string', Groups => { 2 => 'Time' } },
+    '060e2b34.0101.0101.07020102.03020000' => { Name => 'LocalEndDateTime', Format => 'string', Groups => { 2 => 'Time' } },
+  # '060e2b34.0101.0101.07020102.04000000' => { Name => 'MaterialEndTimeAddress', Type => 'Node' },
+    '060e2b34.0101.0101.07020102.04010000' => { Name => 'TimecodeEndDateTime', Type => 'UILSBF', Unknown => 1, Groups => { 2 => 'Time' } },
+  # '060e2b34.0101.0101.07020102.05000000' => { Name => 'MaterialOccurrenceTrueDateTime', Type => 'Node' },
+    '060e2b34.0101.0101.07020102.05010000' => { Name => 'UTCLastModifyDate', Format => 'string' },
+    '060e2b34.0101.0101.07020102.05020000' => { Name => 'LocalLastModifyDate', Format => 'string' },
+  # '060e2b34.0101.0101.07020102.06000000' => { Name => 'MaterialOccurrenceTimeAddress', Type => 'Node' },
+    '060e2b34.0101.0101.07020102.06010000' => { Name => 'TimecodeLastModifyDate', Type => 'UILSBF', Unknown => 1, Groups => { 2 => 'Time' } },
+  # '060e2b34.0101.0101.07020102.07000000' => { Name => 'EventStartTrueDateTime', Type => 'Node' },
+    '060e2b34.0101.0101.07020102.07010000' => { Name => 'UTCEventStartDateTime', Format => 'string', Groups => { 2 => 'Time' } },
+    '060e2b34.0101.0101.07020102.07020000' => { Name => 'LocalEventStartDateTime', Format => 'string', Groups => { 2 => 'Time' } },
+  # '060e2b34.0101.0101.07020102.08000000' => { Name => 'EventStartTimeAddress', Type => 'Node' },
+    '060e2b34.0101.0101.07020102.08010000' => { Name => 'TimecodeEventStartDateTime', Type => 'UILSBF', Unknown => 1, Groups => { 2 => 'Time' } },
+  # '060e2b34.0101.0101.07020102.09000000' => { Name => 'EventEndTrueDateTime', Type => 'Node' },
+    '060e2b34.0101.0101.07020102.09010000' => { Name => 'UTCEventEndDateTime', Format => 'string', Groups => { 2 => 'Time' } },
+    '060e2b34.0101.0101.07020102.09020000' => { Name => 'LocalEventEndDateTime', Format => 'string', Groups => { 2 => 'Time' } },
+  # '060e2b34.0101.0101.07020102.0a000000' => { Name => 'EventEndTimeAddress', Type => 'Node' },
+    '060e2b34.0101.0101.07020102.0a010000' => { Name => 'TimecodeEventEndDateTime', Type => 'UILSBF', Unknown => 1, Groups => { 2 => 'Time' } },
+  # '060e2b34.0101.0101.07020103.00000000' => { Name => 'RelativeTimes', Type => 'Node' },
+  # '060e2b34.0101.0101.07020103.01000000' => { Name => 'MaterialStartRelativeTimes', Type => 'Node' },
+    '060e2b34.0101.0101.07020103.01010000' => { Name => 'StartTimeRelativeToReference', Format => 'string' },
+    '060e2b34.0101.0101.07020103.01020000' => { Name => 'StartTimecodeRelativeToReference', Type => 'UILSBF', Unknown => 1, Groups => { 2 => 'Time' } },
+  # '060e2b34.0101.0101.07020103.02000000' => { Name => 'MaterialEndRelativeTimes', Type => 'Node' },
+    '060e2b34.0101.0101.07020103.02010000' => { Name => 'MaterialEndTimeOffset', Format => 'string' },
+    '060e2b34.0101.0101.07020103.02020000' => { Name => 'MaterialEndTimecodeOffset', Type => 'UILSBF', Unknown => 1, Groups => { 2 => 'Time' } },
+  # '060e2b34.0101.0101.07020103.03000000' => { Name => 'EventStartRelativeTimes', Type => 'Node' },
+    '060e2b34.0101.0101.07020103.03010000' => { Name => 'EventStartTimeOffset', Format => 'string' },
+    '060e2b34.0101.0101.07020103.03020000' => { Name => 'EventStartTimecodeOffset', Type => 'UILSBF', Unknown => 1, Groups => { 2 => 'Time' } },
+  # '060e2b34.0101.0101.07020103.04000000' => { Name => 'EventEndRelativeTimes', Type => 'Node' },
+    '060e2b34.0101.0101.07020103.04010000' => { Name => 'EventEndTimeOffset', Format => 'string' },
+    '060e2b34.0101.0101.07020103.04020000' => { Name => 'EventEndTimecodeOffset', Type => 'UILSBF', Unknown => 1, Groups => { 2 => 'Time' } },
+  # '060e2b34.0101.0101.07020103.10000000' => { Name => 'Offsets', Type => 'Node' },
+  # '060e2b34.0101.0101.07020103.10010000' => { Name => 'MaterialOffsets', Type => 'Node' },
+    '060e2b34.0101.0101.07020103.10010100' => { Name => 'FrameCountOffset', Format => 'int32u' },
+  # '060e2b34.0101.0101.07020108.00000000' => { Name => 'SettingDateAndTime', Type => 'Node' },
+    '060e2b34.0101.0101.07020108.01000000' => { Name => 'TimePeriodName', Format => 'string' },
+  # '060e2b34.0101.0101.07020110.00000000' => { Name => 'ProcessDateTime', Type => 'Node' },
+  # '060e2b34.0101.0101.07020110.01000000' => { Name => 'CreateDate', Type => 'Node' },
+    '060e2b34.0101.0101.07020110.01010000' => { Name => 'LocalCreationDateTime', Format => 'string', Groups => { 2 => 'Time' } },
+    '060e2b34.0101.0101.07020110.01020000' => { Name => 'TimecodeCreationDateTime', Type => 'UILSBF', Unknown => 1, Groups => { 2 => 'Time' } },
+  # '060e2b34.0101.0101.07020110.02000000' => { Name => 'ModifyDate', Type => 'Node' },
+    '060e2b34.0101.0101.07020110.02010000' => { Name => 'LocalModifyDate', Format => 'string' },
+    '060e2b34.0101.0101.07020110.02020000' => { Name => 'TimecodeModifyDate', Type => 'UILSBF', Unknown => 1, Groups => { 2 => 'Time' } },
+  # '060e2b34.0101.0101.07020200.00000000' => { Name => 'Durations', Type => 'Node' },
+  # '060e2b34.0101.0101.07020201.00000000' => { Name => 'AbsoluteDurations', Type => 'Node' },
+  # '060e2b34.0101.0101.07020201.01000000' => { Name => 'EditTimelineDurations', Type => 'Node' },
+    '060e2b34.0101.0101.07020201.01010000' => { Name => 'FrameCount', Format => 'int32u' },
+  # '060e2b34.0101.0101.07020201.01040000' => { Name => 'VideoDurations', Type => 'Node' },
+  # '060e2b34.0101.0101.07020201.01050000' => { Name => 'AudioDurations', Type => 'Node' },
+  # '060e2b34.0101.0101.07020201.02000000' => { Name => 'MaterialAbsoluteDurations', Type => 'Node' },
+    '060e2b34.0101.0101.07020201.02010000' => { Name => 'MaterialAbsoluteDuration', Format => 'string' },
+    '060e2b34.0101.0101.07020201.02020000' => { Name => 'MaterialAbsoluteDuration', Type => 'UILSBF', Unknown => 1, Groups => { 2 => 'Time' } },
+    '060e2b34.0101.0101.07020201.02030000' => { Name => 'TextlessBlackDuration', Format => 'int32u' },
+  # '060e2b34.0101.0101.07020201.03000000' => { Name => 'EventAbsoluteDurations', Type => 'Node' },
+    '060e2b34.0101.0101.07020201.03010000' => { Name => 'EventAbsoluteDurationFrameCount', Format => 'int32u' },
+    '060e2b34.0101.0101.07020201.03020000' => { Name => 'EventAbsoluteDuration', Format => 'string' },
+    '060e2b34.0101.0101.07020201.03030000' => { Name => 'EventAbsoluteDuration', Type => 'UILSBF', Unknown => 1, Groups => { 2 => 'Time' } },
+  # '060e2b34.0101.0101.07020202.00000000' => { Name => 'RelativeScalingDurations', Type => 'Node' },
+  # '060e2b34.0101.0101.07020300.00000000' => { Name => 'Delay', Type => 'Node' },
+  # '060e2b34.0101.0101.07020301.00000000' => { Name => 'EncodingAndDecoding', Type => 'Node' },
+  # '060e2b34.0101.0101.07020301.01000000' => { Name => 'CodecDelay', Type => 'Node' },
+  # '060e2b34.0101.0101.07020301.02000000' => { Name => 'EncodingDelay', Type => 'Node' },
+  # '060e2b34.0101.0101.07020301.03000000' => { Name => 'DecodingDelay', Type => 'Node' },
+    '060e2b34.0101.0101.07020301.03010000' => { Name => 'BufferDelay', Unknown => 1 },
+  # '060e2b34.0101.0101.07020500.00000000' => { Name => 'Latency', Type => 'Node' },
+  # '060e2b34.0101.0101.07020600.00000000' => { Name => 'ShutterCharacteristics', Type => 'Node' },
+  # '060e2b34.0101.0101.07020601.00000000' => { Name => 'ShutterCharacteristics', Type => 'Node' },
+  # '060e2b34.0101.0101.07020601.01000000' => { Name => 'ShutterSpeed', Type => 'Node' },
+  # '060e2b34.0101.0101.07020601.02000000' => { Name => 'ShutterGating', Type => 'Node' },
+  # '060e2b34.0101.0101.0d000000.00000000' => { Name => 'UserOrganizationRegisteredForPublicUse', Type => 'Node' },
+  # '060e2b34.0101.0101.0d010000.00000000' => { Name => 'AAFAssociation', Type => 'Node' },
+  # '060e2b34.0101.0101.0d010100.00000000' => { Name => 'AAFAttributes', Type => 'Node' },
+  # '060e2b34.0101.0101.0d010101.00000000' => { Name => 'AAFInformationAttributes', Type => 'Node' },
+  # '060e2b34.0101.0101.0d010101.01000000' => { Name => 'AAFInformationAttributesVersion1', Type => 'Node' },
+  # '060e2b34.0101.0101.0d010101.01010000' => { Name => 'EnumeratedAttributes', Type => 'Node' },
+
+    # tags from ref 4 (untested)
+    '060e2b34.0101.0101.0d010401.03010100' => { Name => 'ProgramIdentifier', Type => 'UTF-16' },
+    '060e2b34.0101.0101.0d010401.03010200' => { Name => 'ProgramIdentifierString', Type => 'UTF-16' },
+    '060e2b34.0101.0101.0d010401.03010300' => { Name => 'ShimName', Type => 'UTF-16' },
+    '060e2b34.0101.0101.0d010401.03010400' => { Name => 'SignalStandard', Type => 'UTF-16' },
+    '060e2b34.0101.0101.0d010401.03010500' => { Name => 'IntendedAFD', Type => 'UTF-16' },
+    '060e2b34.0101.0101.0d010401.03010600' => { Name => 'SlateTitle', Type => 'UTF-16' },
+    '060e2b34.0101.0101.0d010401.03010700' => { Name => 'NOLACode', Type => 'UTF-16' },
+    '060e2b34.0101.0101.0d010401.03010800' => { Name => 'Rating', Type => 'UTF-16' },
+    '060e2b34.0101.0101.0d010401.03010900' => { Name => 'NielsenStreamIdentifier', Type => 'UTF-16' },
+
+  # '060e2b34.0101.0101.0d0b0100.00000000' => { Name => 'ProductionFramework', Type => 'Node' },
+    '060e2b34.0101.0101.0d0b0101.00000000' => { Name => 'IsRecording', Type => 'Boolean' },
+    '060e2b34.0101.0101.0d0b0102.00000000' => { Name => 'IsLiveProduction', Type => 'Boolean' },
+    '060e2b34.0101.0101.0d0b0103.00000000' => { Name => 'IsLiveTransmission', Type => 'Boolean' },
+    '060e2b34.0101.0101.0d0b0104.00000000' => { Name => 'IsDubbed', Type => 'Boolean' },
+    '060e2b34.0101.0101.0d0b0105.00000000' => { Name => 'IsVoiceover', Type => 'Boolean' },
+    '060e2b34.0101.0101.0d0b0106.00000000' => { Name => 'HasAudioWatermark', Type => 'Boolean', Groups => { 2 => 'Audio' } },
+    '060e2b34.0101.0101.0d0b0107.00000000' => { Name => 'AudioWatermarkKind', Type => 'UTF-16', Groups => { 2 => 'Audio' } },
+    '060e2b34.0101.0101.0d0b0108.00000000' => { Name => 'HasVideoWatermark', Type => 'Boolean' },
+    '060e2b34.0101.0101.0d0b0109.00000000' => { Name => 'VideoWatermarkKind', Type => 'UTF-16' },
+  # '060e2b34.0101.0101.0d0b0200.00000000' => { Name => 'Subtitling', Type => 'Node' },
+    '060e2b34.0101.0101.0d0b0201.00000000' => { Name => 'SubtitlesPresent', Type => 'Boolean' },
+  # '060e2b34.0101.0101.0d0b0300.00000000' => { Name => 'CaptionTitles', Type => 'Node' },
+    '060e2b34.0101.0101.0d0b0301.00000000' => { Name => 'CaptionTitles', Type => 'Boolean' },
+    '060e2b34.0101.0101.0d0b0302.00000000' => { Name => 'CaptionsViaTeletext', Type => 'Boolean' },
+    '060e2b34.0101.0101.0d0b0303.00000000' => { Name => 'TextlessMaterial', Type => 'Boolean' },
+  # '060e2b34.0101.0101.0d0b0400.00000000' => { Name => 'AudioParameters', Type => 'Node' },
+    '060e2b34.0101.0101.0d0b0401.00000000' => { Name => 'AudioReferenceLevel', Format => 'string', Groups => { 2 => 'Audio' } },
+  # '060e2b34.0101.0101.0d0b0500.00000000' => { Name => 'StorageMedia', Type => 'Node' },
+    '060e2b34.0101.0101.0d0b0501.00000000' => { Name => 'StorageDeviceKind', Type => 'UTF-16' },
+    '060e2b34.0101.0101.0d0b0502.00000000' => { Name => 'StorageMediaKind', Type => 'UTF-16' },
+    '060e2b34.0101.0101.0d0b0503.00000000' => { Name => 'StorageMediaID', Type => 'UTF-16' },
+  # '060e2b34.0101.0101.0d0b0600.00000000' => { Name => 'BroadcastScheduleInformation', Type => 'Node' },
+    '060e2b34.0101.0101.0d0b0601.00000000' => { Name => 'BroadcastDate', %timestamp },
+    '060e2b34.0101.0101.0d0b0602.00000000' => { Name => 'BroadcastTime', %timestamp },
+    '060e2b34.0101.0101.0d0b0603.00000000' => { Name => 'IsRepeat', Type => 'Boolean' },
+    '060e2b34.0101.0101.0d0b0604.00000000' => { Name => 'FirstTransmissionInfo', Type => 'UTF-16' },
+    '060e2b34.0101.0101.0d0b0605.00000000' => { Name => 'TeletextSubtitlesAvailable', Type => 'Boolean' },
+    '060e2b34.0101.0101.0d0b0606.00000000' => { Name => 'SeasonEpisodeNumber', Format => 'string' },
+    '060e2b34.0101.0101.0d0b0607.00000000' => { Name => 'SeasonEpisodeTitle', Format => 'string' },
+    '060e2b34.0101.0101.0d0b0608.00000000' => { Name => 'EPGProgramSynopsis', Type => 'UTF-16' },
+  # '060e2b34.0101.0101.0d0b0700.00000000' => { Name => 'Classification', Type => 'Node' },
+    '060e2b34.0101.0101.0d0b0701.00000000' => { Name => 'ContentClassification', Type => 'UTF-16' },
+    '060e2b34.0101.0101.0d0b0702.00000000' => { Name => 'DVBParentalRating', Type => 'UTF-16' },
+    '060e2b34.0101.0101.0d0b0703.00000000' => { Name => 'ContentMaturityRating', Type => 'UTF-16' },
+    '060e2b34.0101.0101.0d0b0704.00000000' => { Name => 'ContentMaturityDescription', Type => 'UTF-16' },
+    '060e2b34.0101.0101.0d0b0705.00000000' => { Name => 'ContentMaturityGraphic', Type => 'UTF-16' },
+  # '060e2b34.0101.0101.0d0b0800.00000000' => { Name => 'Contract', Type => 'Node' },
+    '060e2b34.0101.0101.0d0b0801.00000000' => { Name => 'ContractEntity', Type => 'UTF-16' },
+    '060e2b34.0101.0101.0d0b0802.00000000' => { Name => 'ContractTypeLink', Type => 'UTF-16' },
+  # '060e2b34.0101.0101.0d0b0900.00000000' => { Name => 'Rights', Type => 'Node' },
+    '060e2b34.0101.0101.0d0b0901.00000000' => { Name => 'ConsumerRightsToCopy', Type => 'UTF-16' },
+    '060e2b34.0101.0101.0d0b0902.00000000' => { Name => 'BroadcasterRightsToCopy', Type => 'UTF-16' },
+  # '060e2b34.0101.0101.0d0b0a00.00000000' => { Name => 'ProductionKeyPeople', Type => 'Node' },
+    '060e2b34.0101.0101.0d0b0a01.00000000' => { Name => 'DirectorName', Type => 'UTF-16' },
+    '060e2b34.0101.0101.0d0b0a02.00000000' => { Name => 'ProducerName', Type => 'UTF-16' },
+    '060e2b34.0101.0101.0d0b0a03.00000000' => { Name => 'FemaleLeadActressName', Type => 'UTF-16' },
+    '060e2b34.0101.0101.0d0b0a04.00000000' => { Name => 'MaleLeadActorName', Type => 'UTF-16' },
+    '060e2b34.0101.0101.0d0b0a05.00000000' => { Name => 'PresenterName', Type => 'UTF-16' },
+    '060e2b34.0101.0101.0d0b0a06.00000000' => { Name => 'MainSponsorName', Type => 'UTF-16' },
+    '060e2b34.0101.0101.0d0b0a07.00000000' => { Name => 'VoiceTalentName', Type => 'UTF-16' },
+  # '060e2b34.0101.0101.0d0b0b00.00000000' => { Name => 'Address', Type => 'Node' },
+    '060e2b34.0101.0101.0d0b0b01.00000000' => { Name => 'PostboxNumber', Type => 'UTF-16' },
+    '060e2b34.0101.0101.0d0b0b02.00000000' => { Name => 'PostCodeForPostbox', Type => 'UTF-16' },
+  # '060e2b34.0101.0101.0e000000.00000000' => { Name => 'PrivateUse', Type => 'Node' },
+  # '060e2b34.0101.0101.0e010000.00000000' => { Name => 'MISBSystems', Type => 'Node' },
+  # '060e2b34.0101.0101.0e010100.00000000' => { Name => 'MISBSystemsStreams', Type => 'Node' },
+  # '060e2b34.0101.0101.0e010200.00000000' => { Name => 'MISBSystemsAttributes', Type => 'Node' },
+  # '060e2b34.0101.0101.0e010300.00000000' => { Name => 'MISBSystemsComposites', Type => 'Node' },
+  # '060e2b34.0101.0101.0e010400.00000000' => { Name => 'MISBSystemsIdentifiers', Type => 'Node' },
+  # '060e2b34.0101.0101.0e020000.00000000' => { Name => 'ASPA', Type => 'Node' },
+  # '060e2b34.0101.0101.0e020100.00000000' => { Name => 'ASPAStreams', Type => 'Node' },
+  # '060e2b34.0101.0101.0e020200.00000000' => { Name => 'ASPAAttributes', Type => 'Node' },
+  # '060e2b34.0101.0101.0e020201.00000000' => { Name => 'ASPARelationalAttributes', Type => 'Node' },
+  # '060e2b34.0101.0101.0e020202.00000000' => { Name => 'ASPAInformationAttributes', Type => 'Node' },
+  # '060e2b34.0101.0101.0e020300.00000000' => { Name => 'ASPAComposites', Type => 'Node' },
+  # '060e2b34.0101.0101.0e020400.00000000' => { Name => 'ASPAIdentifiers', Type => 'Node' },
+  # '060e2b34.0101.0101.0e030000.00000000' => { Name => 'MISBClassified', Type => 'Node' },
+  # '060e2b34.0101.0101.0e030100.00000000' => { Name => 'MISBClassifiedStreams', Type => 'Node' },
+  # '060e2b34.0101.0101.0e030200.00000000' => { Name => 'MISBClassifiedAttributes', Type => 'Node' },
+  # '060e2b34.0101.0101.0e030300.00000000' => { Name => 'MISBClassifiedComposites', Type => 'Node' },
+  # '060e2b34.0101.0101.0e030400.00000000' => { Name => 'MISBClassifiedIdentifiers', Type => 'Node' },
+  # '060e2b34.0101.0101.0f000000.00000000' => { Name => 'EXPERIMENTALMETADATA', Type => 'Node' },
+  # '060e2b34.0101.0101.43000000.00000000' => { Name => 'Legacy315M', Type => 'Node' },
+    '060e2b34.0101.0102.01011003.03000000' => { Name => 'ProgramNumber', Format => 'string' },
+    '060e2b34.0101.0102.01011503.00000000' => { Name => 'DefinitionObjectID', Type => 'AUID', Unknown => 1 },
+    '060e2b34.0101.0102.01012005.00000000' => { Name => 'IEEEDeviceID', Format => 'int8u' },
+    '060e2b34.0101.0102.01030106.00000000' => { Name => 'ProjectNumber', Format => 'string' },
+    '060e2b34.0101.0102.01030201.02000000' => { Name => 'EdgeCodeHeader', Type => 'DataValue', Unknown => 1 },
+  # '060e2b34.0101.0102.01030400.00000000' => { Name => 'NetworkAndStreamIdentifiers', Type => 'Node' },
+    '060e2b34.0101.0102.01030401.00000000' => { Name => 'ChannelHandle', Format => 'int16s' },
+    '060e2b34.0101.0102.01040102.00000000' => { Name => 'PhysicalMediaLocation', Format => 'string' },
+    '060e2b34.0101.0102.01040102.01000000' => { Name => 'MediaLocation', Type => 'UTF-16' },
+    '060e2b34.0101.0102.01040103.00000000' => { Name => 'TrackNumber', Format => 'int32u' },
+  # '060e2b34.0101.0102.01040900.00000000' => { Name => 'SynchronizationLocators', Type => 'Node' },
+    '060e2b34.0101.0102.01040901.00000000' => { Name => 'EdgeCodeStart', Type => 'Position', %duration },
+    '060e2b34.0101.0102.01050800.00000000' => { Name => 'VersionTitle', Format => 'string' },
+  # '060e2b34.0101.0102.01070000.00000000' => { Name => 'LocalIdentifiers', Type => 'Node' },
+  # '060e2b34.0101.0102.01070100.00000000' => { Name => 'PackageIdentifiers', Type => 'Node' },
+    '060e2b34.0101.0102.01070101.00000000' => { Name => 'TrackID', Format => 'int32u' },
+    '060e2b34.0101.0102.01070102.00000000' => { Name => 'TrackName', Format => 'string' },
+    '060e2b34.0101.0102.01070102.01000000' => { Name => 'TrackName', Type => 'UTF-16' },
+    '060e2b34.0101.0102.01070102.03000000' => { Name => 'DefinitionObjectName', Format => 'string' },
+    '060e2b34.0101.0102.01070102.03010000' => { Name => 'DefinitionObjectName', Type => 'UTF-16' },
+    '060e2b34.0101.0102.01070103.00000000' => { Name => 'ContentPackageMetadataLink', Format => 'int8u' },
+    '060e2b34.0101.0102.01070104.00000000' => { Name => 'DefinedName', Format => 'string' },
+    '060e2b34.0101.0102.01070104.01000000' => { Name => 'DefinedName', Type => 'UTF-16' },
+  # '060e2b34.0101.0102.010a0000.00000000' => { Name => 'OrganizationIdentifiers', Type => 'Node' },
+  # '060e2b34.0101.0102.010a0100.00000000' => { Name => 'ManufacturerIdentifiers', Type => 'Node' },
+  # '060e2b34.0101.0102.010a0101.00000000' => { Name => 'ManufacturerIdentifiers', Type => 'Node' },
+    '060e2b34.0101.0102.010a0101.01000000' => { Name => 'DeviceManufacturerName', Format => 'string' },
+    '060e2b34.0101.0102.010a0101.01010000' => { Name => 'DeviceManufacturerName', Type => 'UTF-16' },
+    '060e2b34.0101.0102.010a0101.03000000' => { Name => 'ManufacturerID', Type => 'AUID', Unknown => 1 },
+    '060e2b34.0101.0102.010a0102.00000000' => { Name => 'IEEEManufacturerID', Type => 'Hex' },
+    '060e2b34.0101.0102.010a0103.00000000' => { Name => 'AAFManufacturerID', Type => 'AUID', Unknown => 1 },
+    '060e2b34.0101.0102.02010400.00000000' => { Name => 'SupplyingDepartmentName', Format => 'string' },
+    '060e2b34.0101.0102.02200303.00000000' => { Name => 'AudienceShare', Format => 'float' },
+    '060e2b34.0101.0102.02200304.00000000' => { Name => 'AudienceAppreciation', Format => 'float' },
+    '060e2b34.0101.0102.02300603.01050000' => { Name => 'Salutation', Format => 'string' },
+    '060e2b34.0101.0102.02300603.01060000' => { Name => 'HonorsAndQualifications', Format => 'string' },
+  # '060e2b34.0101.0102.03010200.00000000' => { Name => 'DataInterpretationsAndDefinitions', Type => 'Node' },
+    '060e2b34.0101.0102.03010201.04000000' => { Name => 'ObjectModelVersion', Format => 'int32u' },
+    '060e2b34.0101.0102.03010201.05000000' => { Name => 'SDKVersion', Type => 'VersionType' },
+  # '060e2b34.0101.0102.03010202.00000000' => { Name => 'PropertyDefinitions', Type => 'Node' },
+    '060e2b34.0101.0102.03010202.01000000' => { Name => 'IsOptional', Type => 'Boolean' },
+    '060e2b34.0101.0102.03010202.02000000' => { Name => 'IsSearchable', Type => 'Boolean' },
+  # '060e2b34.0101.0102.03010202.03000000' => { Name => 'PropertyDefaults', Type => 'Node' },
+    '060e2b34.0101.0102.03010202.03010000' => { Name => 'UseDefaultValue', Type => 'Boolean' },
+    '060e2b34.0101.0102.03010202.03020000' => { Name => 'DefaultDataValue', Type => 'Indirect', Unknown => 1 },
+  # '060e2b34.0101.0102.03010203.00000000' => { Name => 'TypeDefinition', Type => 'Node' },
+    '060e2b34.0101.0102.03010203.01000000' => { Name => 'Size', Format => 'int8u' },
+    '060e2b34.0101.0102.03010203.02000000' => { Name => 'IsSigned', Type => 'Boolean' },
+    '060e2b34.0101.0102.03010203.03000000' => { Name => 'ElementCount', Format => 'int32u' },
+    '060e2b34.0101.0102.03010203.04000000' => { Name => 'ElementNameList', Type => 'UTF-16' },
+    '060e2b34.0101.0102.03010203.05000000' => { Name => 'TypeDefinitionElementValueList', Format => 'int64s' },
+    '060e2b34.0101.0102.03010203.06000000' => { Name => 'MemberNameList', Type => 'UTF-16' },
+    '060e2b34.0101.0102.03010203.07000000' => { Name => 'ExtendibleElementNameList', Type => 'UTF-16' },
+    '060e2b34.0101.0102.03010203.08000000' => { Name => 'TypeDefinitionExtendibleElementValues', Type => 'AUIDArray', Unknown => 1 },
+    '060e2b34.0101.0102.03010203.0b000000' => { Name => 'TargetSet', Type => 'AUIDArray', Unknown => 1 },
+  # '060e2b34.0101.0102.03010210.00000000' => { Name => 'KLVInterpretations', Type => 'Node' },
+    '060e2b34.0101.0102.03010210.01000000' => { Name => 'FillerData', Format => 'undef', Unknown => 1 },
+    '060e2b34.0101.0102.03010210.02000000' => { Name => 'KLVDataValue', Type => 'Opaque', Unknown => 1 },
+    '060e2b34.0101.0102.03010210.03000000' => { Name => 'PackageKLVData', Type => 'StrongReferenceArray', Unknown => 1 },
+    '060e2b34.0101.0102.03010210.04000000' => { Name => 'ComponentKLVData', Type => 'StrongReferenceArray', Unknown => 1 },
+    '060e2b34.0101.0102.03020102.09000000' => { Name => 'AssignedCategoryName', Format => 'string' },
+    '060e2b34.0101.0102.03020102.09010000' => { Name => 'AssignedCategoryName', Type => 'UTF-16' },
+    '060e2b34.0101.0102.03020102.0a000000' => { Name => 'AssignedCategoryValue', Format => 'string' },
+    '060e2b34.0101.0102.03020102.0a010000' => { Name => 'AssignedCategoryValue', Type => 'UTF-16' },
+    '060e2b34.0101.0102.03020102.0b000000' => { Name => 'ShotList', Format => 'string' },
+    '060e2b34.0101.0102.03020102.0c000000' => { Name => 'PackageUserComments', Type => 'StrongReferenceArray', Unknown => 1 },
+    '060e2b34.0101.0102.03020102.0d000000' => { Name => 'Cue-InWords', Format => 'string' },
+    '060e2b34.0101.0102.03020102.0e000000' => { Name => 'Cue-OutWords', Format => 'string' },
+    '060e2b34.0101.0102.03020301.01000000' => { Name => 'ObjectKind', Format => 'string' },
+    '060e2b34.0101.0102.03020301.01010000' => { Name => 'ObjectKind', Type => 'UTF-16' },
+    '060e2b34.0101.0102.03020301.02000000' => { Name => 'ObjectDescription', Format => 'string' },
+    '060e2b34.0101.0102.03020301.02010000' => { Name => 'ObjectDescription', Type => 'UTF-16' },
+  # '060e2b34.0101.0102.03020400.00000000' => { Name => 'DescriptiveNames', Type => 'Node' },
+  # '060e2b34.0101.0102.03020401.01000000' => { Name => 'GenericObjectNames', Type => 'Node' },
+    '060e2b34.0101.0102.03020401.01010000' => { Name => 'ObjectName', Format => 'string' },
+    '060e2b34.0101.0102.03020401.02010000' => { Name => 'MetadataItemName', Type => 'UTF-16' },
+  # '060e2b34.0101.0102.03020500.00000000' => { Name => 'EditorialCommentsAndDescriptions', Type => 'Node' },
+    '060e2b34.0101.0102.03020501.00000000' => { Name => 'ShotCommentKind', Format => 'string' },
+    '060e2b34.0101.0102.03020502.00000000' => { Name => 'ShotComment', Format => 'string' },
+    '060e2b34.0101.0102.03030301.01000000' => { Name => 'ComputedObjectKind', Format => 'string' },
+    '060e2b34.0101.0102.03030301.01010000' => { Name => 'ComputedObjectKind', Type => 'UTF-16' },
+    '060e2b34.0101.0102.03030301.02000000' => { Name => 'VersionNumberString', Format => 'string' },
+    '060e2b34.0101.0102.03030301.02010000' => { Name => 'VersionNumberString', Type => 'UTF-16' },
+    '060e2b34.0101.0102.03030301.03000000' => { Name => 'VersionNumber', Type => 'VersionType' },
+  # '060e2b34.0101.0102.03030302.00000000' => { Name => 'DerivedSummaryInformation', Type => 'Node' },
+    '060e2b34.0101.0102.03030302.01000000' => { Name => 'WAVESummary', Type => 'DataValue', Unknown => 1 },
+    '060e2b34.0101.0102.03030302.02000000' => { Name => 'AIFCSummary', Type => 'DataValue', Unknown => 1 },
+    '060e2b34.0101.0102.03030302.03000000' => { Name => 'TIFFSummary', Type => 'DataValue', Unknown => 1 },
+    '060e2b34.0101.0102.04010101.03000000' => { Name => 'ViewportAspectRatio', Format => 'rational64s' },
+    '060e2b34.0101.0102.04010201.01010200' => { Name => 'CaptureGammaEquation', Type => 'UL', Unknown => 1 },
+    '060e2b34.0101.0102.04010201.01030100' => { Name => 'ColorimetryCode', Type => 'ColorimetryCode', Unknown => 1 },
+    '060e2b34.0101.0102.04010201.01100000' => { Name => 'PresentationGammaEquation', Format => 'string' },
+    '060e2b34.0101.0102.04010201.01100100' => { Name => 'PresentationGammaEquation', Type => 'PresentationGamma', Unknown => 1 },
+    '060e2b34.0101.0102.04010301.06000000' => { Name => 'FieldDominance', Format => 'int8u' },
+    '060e2b34.0101.0102.04010302.05000000' => { Name => 'VideoLineMap', Format => 'int32s' },
+    '060e2b34.0101.0102.04010401.01000000' => { Name => 'AnalogVideoSystemName', Type => 'VideoSignalType', Unknown => 1 },
+    '060e2b34.0101.0102.04010501.10000000' => { Name => 'VerticalSub-sampling', Format => 'int32u' },
+    '060e2b34.0101.0102.04010503.01010000' => { Name => 'BitsperPixel', Format => 'int32u' },
+    '060e2b34.0101.0102.04010503.05000000' => { Name => 'ColorRangeLevels', Format => 'int32u' },
+    '060e2b34.0101.0102.04010503.06000000' => { Name => 'PixelLayout', Type => 'RGBALayout', Unknown => 1 },
+    '060e2b34.0101.0102.04010503.07000000' => { Name => 'AlphaSampleDepth', Format => 'int32u' },
+    '060e2b34.0101.0102.04010503.08000000' => { Name => 'Palette', Type => 'DataValue', Unknown => 1 },
+    '060e2b34.0101.0102.04010503.09000000' => { Name => 'PaletteLayout', Type => 'RGBALayout', Unknown => 1 },
+    '060e2b34.0101.0102.04010503.0a000000' => { Name => 'ComponentDepth', Format => 'int32u' },
+    '060e2b34.0101.0102.04010601.00000000' => { Name => 'VideoCodingSchemeID', Type => 'AUID', Unknown => 1 },
+    '060e2b34.0101.0102.04010802.03000000' => { Name => 'RoundedCaptureFilmFrameRate', Format => 'int32u' },
+    '060e2b34.0101.0102.04020301.02000000' => { Name => 'AudioAverageBitrate', Format => 'float', PrintConv => 'ConvertBitrate($val)', Groups => { 2 => 'Audio' } },
+    '060e2b34.0101.0102.04020301.03000000' => { Name => 'AudioFixedBitrateFlag', Type => 'Boolean', Groups => { 2 => 'Audio' } },
+    '060e2b34.0101.0102.04020401.00000000' => { Name => 'CodingLawKind', Format => 'string' },
+    '060e2b34.0101.0102.04020402.00000000' => { Name => 'AudioCodingSchemeID', Type => 'AUID', Unknown => 1, Groups => { 2 => 'Audio' } },
+    '060e2b34.0101.0102.04020403.01010000' => { Name => 'LayerNumber', Format => 'int8u' },
+    '060e2b34.0101.0102.04040101.02010000' => { Name => 'TimecodeTimebase', Format => 'rational64s' },
+    '060e2b34.0101.0102.04040101.02060000' => { Name => 'RoundedTimecodeTimebase', Format => 'int16u' },
+  # '060e2b34.0101.0102.04070000.00000000' => { Name => 'GeneralEssenceAndDataParameters', Type => 'Node' },
+    '060e2b34.0101.0102.04070100.00000000' => { Name => 'ComponentDataDefinition', Type => 'WeakReference', %componentDataDef },
+    '060e2b34.0101.0102.04070200.00000000' => { Name => 'StreamData', Type => 'DataStream', Unknown => 1 },
+    '060e2b34.0101.0102.04070300.00000000' => { Name => 'TimecodeStreamData', Type => 'DataStream', Unknown => 1 },
+    '060e2b34.0101.0102.04090101.00000000' => { Name => 'RecordedFormat', Type => 'UTF-16' },
+    '060e2b34.0101.0102.04100101.01000000' => { Name => 'TapeShellKind', Format => 'string' },
+    '060e2b34.0101.0102.04100101.01010000' => { Name => 'TapeShellKind', Type => 'UTF-16' },
+    '060e2b34.0101.0102.04100101.02000000' => { Name => 'TapeFormulation', Format => 'string' },
+    '060e2b34.0101.0102.04100101.02010000' => { Name => 'TapeFormulation', Type => 'UTF-16' },
+    '060e2b34.0101.0102.04100101.03000000' => { Name => 'TapeCapacity', Format => 'int32u' },
+    '060e2b34.0101.0102.04100101.04000000' => { Name => 'TapeManufacturer', Format => 'string' },
+    '060e2b34.0101.0102.04100101.04010000' => { Name => 'TapeManufacturer', Type => 'UTF-16' },
+    '060e2b34.0101.0102.04100101.05000000' => { Name => 'TapeStock', Format => 'string' },
+    '060e2b34.0101.0102.04100101.05010000' => { Name => 'TapeStock', Type => 'UTF-16' },
+    '060e2b34.0101.0102.04100101.06000000' => { Name => 'TapeBatchNumber', Format => 'string' },
+    '060e2b34.0101.0102.04100101.06010000' => { Name => 'TapeBatchNumber', Type => 'UTF-16' },
+    '060e2b34.0101.0102.04100103.01030000' => { Name => 'PerforationsPerFrame', Format => 'int8u' },
+    '060e2b34.0101.0102.04100103.01030100' => { Name => 'PerforationsPerFrame', Format => 'rational64s' },
+    '060e2b34.0101.0102.04100103.01040100' => { Name => 'FilmFormatName', Type => 'UTF-16' },
+    '060e2b34.0101.0102.04100103.01040200' => { Name => 'FilmFormatName', Type => 'FilmFormat', Unknown => 1 },
+    '060e2b34.0101.0102.04100103.01050100' => { Name => 'FilmStockKind', Type => 'UTF-16' },
+    '060e2b34.0101.0102.04100103.01060100' => { Name => 'FilmStockManufacturerName', Type => 'UTF-16' },
+    '060e2b34.0101.0102.04100103.01070000' => { Name => 'FilmBatchNumber', Format => 'string' },
+    '060e2b34.0101.0102.04100103.01070100' => { Name => 'FilmBatchNumber', Type => 'UTF-16' },
+    '060e2b34.0101.0102.04100103.01080000' => { Name => 'FilmGauge', Type => 'FilmType', Unknown => 1 },
+    '060e2b34.0101.0102.04100103.01090000' => { Name => 'EdgeCodeFilmGauge', Type => 'FilmType', Unknown => 1 },
+    '060e2b34.0101.0102.04100103.02030000' => { Name => 'ExposedAspectRatio', Format => 'rational64s' },
+  # '060e2b34.0101.0102.04180000.00000000' => { Name => 'MemoryStorageCharacteristics', Type => 'Node' },
+  # '060e2b34.0101.0102.04180100.00000000' => { Name => 'MemoryStorageAlignmentCharacteristics', Type => 'Node' },
+    '060e2b34.0101.0102.04180101.00000000' => { Name => 'ImageAlignmentOffset', Format => 'int32u' },
+    '060e2b34.0101.0102.04180102.00000000' => { Name => 'ImageStartOffset', Format => 'int32u' },
+    '060e2b34.0101.0102.04180103.00000000' => { Name => 'ImageEndOffset', Format => 'int32u' },
+    '060e2b34.0101.0102.04180104.00000000' => { Name => 'PaddingBits', Format => 'int16s' },
+    '060e2b34.0101.0102.04200201.01040000' => { Name => 'FocalLength', Format => 'float', PrintConv => 'sprintf("%.1f mm",$val)' },
+    '060e2b34.0101.0102.04200201.01050000' => { Name => 'SensorSize', Format => 'string' },
+    '060e2b34.0101.0102.04200201.01060000' => { Name => 'FNumber', Format => 'float' },
+    '060e2b34.0101.0102.04200201.01070000' => { Name => 'SensorTypeCode', Format => 'string' },
+    '060e2b34.0101.0102.04200201.01080000' => { Name => 'FieldOfViewHorizontal', Format => 'float' },
+    '060e2b34.0101.0102.04200201.01090000' => { Name => 'AnamorphicLensCharacteristic', Format => 'string' },
+  # '060e2b34.0101.0102.05020103.00000000' => { Name => 'JPEGProcessing', Type => 'Node' },
+  # '060e2b34.0101.0102.05020103.01000000' => { Name => 'TIFFJPEGProcessing', Type => 'Node' },
+    '060e2b34.0101.0102.05020103.01010000' => { Name => 'UniformDataFlag', Type => 'Boolean' },
+    '060e2b34.0101.0102.05020103.01020000' => { Name => 'JPEGTableID', Type => 'JPEGTableIDType', Unknown => 1 },
+  # '060e2b34.0101.0102.05020103.02000000' => { Name => 'JFIF_JPEGProcessing', Type => 'Node' },
+    '060e2b34.0101.0102.05200102.00000000' => { Name => 'AlphaTransparency', Format => 'int8u',
+        PrintConv => { 0 => 'Not Inverted', 1 => 'Inverted' },
+    },
+  # '060e2b34.0101.0102.05200701.00000000' => { Name => 'ModificationInformation', Type => 'Node' },
+    '060e2b34.0101.0102.05200701.01000000' => { Name => 'GenerationID', Type => 'AUID', Unknown => 1 },
+    '060e2b34.0101.0102.05200701.02000000' => { Name => 'ApplicationSupplierName', Format => 'string' },
+    '060e2b34.0101.0102.05200701.02010000' => { Name => 'ApplicationSupplierName', Type => 'UTF-16' },
+    '060e2b34.0101.0102.05200701.03000000' => { Name => 'ApplicationName', Format => 'string' },
+    '060e2b34.0101.0102.05200701.03010000' => { Name => 'ApplicationName', Type => 'UTF-16' },
+    '060e2b34.0101.0102.05200701.04000000' => { Name => 'ApplicationVersionNumber', Type => 'ProductVersion' },
+    '060e2b34.0101.0102.05200701.05000000' => { Name => 'ApplicationVersionString', Format => 'string' },
+    '060e2b34.0101.0102.05200701.05010000' => { Name => 'ApplicationVersionString', Type => 'UTF-16' },
+    '060e2b34.0101.0102.05200701.06000000' => { Name => 'ApplicationPlatform', Format => 'string' },
+    '060e2b34.0101.0102.05200701.06010000' => { Name => 'ApplicationPlatform', Type => 'UTF-16' },
+    '060e2b34.0101.0102.05200701.07000000' => { Name => 'ApplicationProductID', Type => 'AUID', Unknown => 1 },
+    '060e2b34.0101.0102.05200701.08000000' => { Name => 'LinkedGenerationID', Type => 'AUID', Unknown => 1 },
+    '060e2b34.0101.0102.05200701.09000000' => { Name => 'ContainerVersion', Type => 'ProductVersion' },
+    '060e2b34.0101.0102.05200701.0a000000' => { Name => 'ToolkitVersion', Type => 'ProductVersion' },
+  # '060e2b34.0101.0102.05200900.00000000' => { Name => 'CodeProcessorSettings', Type => 'Node' },
+    '060e2b34.0101.0102.05200901.00000000' => { Name => 'Plug-InCategoryID', Type => 'AUID', Unknown => 1 },
+    '060e2b34.0101.0102.05200902.00000000' => { Name => 'Plug-InPlatformID', Type => 'AUID', Unknown => 1 },
+    '060e2b34.0101.0102.05200903.00000000' => { Name => 'MinimumSupportedPlatformVersion', Type => 'VersionType' },
+    '060e2b34.0101.0102.05200904.00000000' => { Name => 'MaximumSupportedPlatformVersion', Type => 'VersionType' },
+    '060e2b34.0101.0102.05200905.00000000' => { Name => 'Plug-InEngineID', Type => 'AUID', Unknown => 1 },
+    '060e2b34.0101.0102.05200906.00000000' => { Name => 'MinimumSupportedEngineVersion', Type => 'VersionType' },
+    '060e2b34.0101.0102.05200907.00000000' => { Name => 'MaximumSupportedEngineVersion', Type => 'VersionType' },
+    '060e2b34.0101.0102.05200908.00000000' => { Name => 'Plug-InAPIID', Type => 'AUID', Unknown => 1 },
+    '060e2b34.0101.0102.05200909.00000000' => { Name => 'MinimumAPIVersion', Type => 'VersionType' },
+    '060e2b34.0101.0102.0520090a.00000000' => { Name => 'MaximumAPIVersion', Type => 'VersionType' },
+    '060e2b34.0101.0102.0520090b.00000000' => { Name => 'Software-OnlySupportFlag', Type => 'Boolean' },
+    '060e2b34.0101.0102.0520090c.00000000' => { Name => 'HardwareAcceleratorFlag', Type => 'Boolean' },
+    '060e2b34.0101.0102.0520090d.00000000' => { Name => 'Plug-InLocatorSet', Type => 'StrongReferenceArray', Unknown => 1 },
+    '060e2b34.0101.0102.0520090e.00000000' => { Name => 'AuthenticationFlag', Type => 'Boolean' },
+    '060e2b34.0101.0102.0520090f.00000000' => { Name => 'AssociatedMetadataDefinition', Type => 'AUID', Unknown => 1 },
+    '060e2b34.0101.0102.05300402.00000000' => { Name => 'EventTrackEditRate', Format => 'rational64s' },
+    '060e2b34.0101.0102.05300403.00000000' => { Name => 'DefaultFadeEditRate', Format => 'rational64s' },
+    '060e2b34.0101.0102.05300404.00000000' => { Name => 'EditingEventComment', Format => 'string' },
+    '060e2b34.0101.0102.05300404.01000000' => { Name => 'EditingEventComment', Type => 'UTF-16' },
+    '060e2b34.0101.0102.05300405.00000000' => { Name => 'EditRate', Format => 'rational64s' },
+    '060e2b34.0101.0102.05300506.00000000' => { Name => 'OperationDefinitionID', Type => 'WeakReference', Unknown => 1 },
+    '060e2b34.0101.0102.05300507.00000000' => { Name => 'Value', Type => 'Indirect', Unknown => 1 },
+    '060e2b34.0101.0102.05300508.00000000' => { Name => 'EditHint', Type => 'EditHintType', Unknown => 1 },
+    '060e2b34.0101.0102.05300509.00000000' => { Name => 'OperationDataDefinition', Type => 'WeakReference', Unknown => 1 },
+    '060e2b34.0101.0102.0530050a.00000000' => { Name => 'OperationCategory', Type => 'AUID', Unknown => 1 },
+    '060e2b34.0101.0102.0530050b.00000000' => { Name => 'DisplayUnits', Format => 'string' },
+    '060e2b34.0101.0102.0530050b.01000000' => { Name => 'DisplayUnits', Type => 'UTF-16' },
+    '060e2b34.0101.0102.0530050c.00000000' => { Name => 'BypassOverride', Format => 'int32u' },
+    '060e2b34.0101.0102.0530050d.00000000' => { Name => 'TimepointValue', Type => 'Indirect', Unknown => 1 },
+    '060e2b34.0101.0102.05300601.00000000' => { Name => 'BeginAnchor', Format => 'string' },
+    '060e2b34.0101.0102.05300601.01000000' => { Name => 'BeginAnchor', Type => 'UTF-16' },
+    '060e2b34.0101.0102.05300602.00000000' => { Name => 'EndAnchor', Format => 'string' },
+    '060e2b34.0101.0102.05300602.01000000' => { Name => 'EndAnchor', Type => 'UTF-16' },
+  # '060e2b34.0101.0102.05401000.00000000' => { Name => 'TransferHistory', Type => 'Node' },
+  # '060e2b34.0101.0102.05401001.00000000' => { Name => 'ImageTransferHistory', Type => 'Node' },
+    '060e2b34.0101.0102.05401001.01000000' => { Name => 'FilmToVideoTransferDirection', Type => 'PulldownDirection', Unknown => 1 },
+    '060e2b34.0101.0102.05401001.02000000' => { Name => 'FilmToVideoTransferKind', Type => 'PulldownKind', Unknown => 1 },
+    '060e2b34.0101.0102.05401001.03000000' => { Name => 'FilmToVideoTransferPhase', Type => 'PhaseFrameType', Unknown => 1 },
+    '060e2b34.0101.0102.06010101.01000000' => { Name => 'TeletextSubtitlesFlag', Type => 'Boolean' },
+    '060e2b34.0101.0102.06010101.02000000' => { Name => 'SubtitleDatafileFlag', Type => 'Boolean' },
+    '060e2b34.0101.0102.06010101.03000000' => { Name => 'ClosedCaptionSubtitlesFlag', Type => 'Boolean' },
+    '060e2b34.0101.0102.06010102.01000000' => { Name => 'SampleIndex', Type => 'DataStream', Unknown => 1 },
+    '060e2b34.0101.0102.06010103.01000000' => { Name => 'SourcePackageID', Type => 'PackageID', Unknown => 1 },
+    '060e2b34.0101.0102.06010103.02000000' => { Name => 'SourceTrackID', Format => 'int32u' },
+    '060e2b34.0101.0102.06010103.03000000' => { Name => 'RelativeScope', Format => 'int32u' },
+    '060e2b34.0101.0102.06010103.04000000' => { Name => 'RelativeTrack', Format => 'int32u' },
+  # '060e2b34.0101.0102.06010104.01000000' => { Name => 'WeakReferences', Type => 'Node' },
+    '060e2b34.0101.0102.06010104.01010000' => { Name => 'ObjectClass', Type => 'WeakReference', Unknown => 1 },
+    '060e2b34.0101.0102.06010104.01020000' => { Name => 'EssenceContainerFormat', Type => 'WeakReference', Unknown => 1 },
+    '060e2b34.0101.0102.06010104.01030000' => { Name => 'CodecDefinition', Type => 'WeakReference', Unknown => 1 },
+    '060e2b34.0101.0102.06010104.01040000' => { Name => 'ParameterDefinition', Type => 'WeakReference', Unknown => 1 },
+    '060e2b34.0101.0102.06010104.01050000' => { Name => 'Interpolation', Type => 'WeakReference', Unknown => 1 },
+    '060e2b34.0101.0102.06010104.01060000' => { Name => 'ParameterDataType', Type => 'WeakReference', Unknown => 1 },
+    '060e2b34.0101.0102.06010104.01070000' => { Name => 'CodecEssenceDescriptor', Type => 'WeakReference', Unknown => 1 },
+  # '060e2b34.0101.0102.06010104.02000000' => { Name => 'StrongReferences', Type => 'Node' },
+    '060e2b34.0101.0102.06010104.02010000' => { Name => 'ContentStorage', Type => 'StrongReference', Unknown => 1 },
+    '060e2b34.0101.0102.06010104.02020000' => { Name => 'Dictionary', Type => 'StrongReference', Unknown => 1 },
+    '060e2b34.0101.0102.06010104.02030000' => { Name => 'EssenceDescription', Type => 'StrongReference', Unknown => 1 },
+    '060e2b34.0101.0102.06010104.02040000' => { Name => 'Sequence', Type => 'StrongReference', Unknown => 1 },
+    '060e2b34.0101.0102.06010104.02050000' => { Name => 'TransitionEffect', Type => 'StrongReference', Unknown => 1 },
+    '060e2b34.0101.0102.06010104.02060000' => { Name => 'EffectRendering', Type => 'StrongReference', Unknown => 1 },
+    '060e2b34.0101.0102.06010104.02070000' => { Name => 'InputSegment', Type => 'StrongReference', Unknown => 1 },
+    '060e2b34.0101.0102.06010104.02080000' => { Name => 'StillFrame', Type => 'StrongReference', Unknown => 1 },
+    '060e2b34.0101.0102.06010104.02090000' => { Name => 'Selected', Type => 'StrongReference', Unknown => 1 },
+    '060e2b34.0101.0102.06010104.020a0000' => { Name => 'Annotation', Type => 'StrongReference', Unknown => 1 },
+    '060e2b34.0101.0102.06010104.020b0000' => { Name => 'ManufacturerInformationObject', Type => 'StrongReference', Unknown => 1 },
+  # '060e2b34.0101.0102.06010104.03000000' => { Name => 'WeakReferencesBatches', Type => 'Node' },
+    '060e2b34.0101.0102.06010104.03010000' => { Name => 'CodecEssenceKinds', Type => 'WeakReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0102.06010104.03020000' => { Name => 'OperationParameters', Type => 'WeakReferenceBatch', Unknown => 1 },
+  # '060e2b34.0101.0102.06010104.04000000' => { Name => 'WeakReferencesArrays', Type => 'Node' },
+    '060e2b34.0101.0102.06010104.04010000' => { Name => 'DegradedEffects', Type => 'WeakReferenceArray', Unknown => 1 },
+  # '060e2b34.0101.0102.06010104.05000000' => { Name => 'StrongReferencesBatches', Type => 'Node' },
+    '060e2b34.0101.0102.06010104.05010000' => { Name => 'Packages', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0102.06010104.05020000' => { Name => 'EssenceData', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0102.06010104.05030000' => { Name => 'OperationDefinitions', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0102.06010104.05040000' => { Name => 'ParameterDefinitions', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0102.06010104.05050000' => { Name => 'DataDefinitions', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0102.06010104.05060000' => { Name => 'Plug-InDefinitions', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0102.06010104.05070000' => { Name => 'CodecDefinitions', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0102.06010104.05080000' => { Name => 'ContainerDefinitions', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0102.06010104.05090000' => { Name => 'InterpolationDefinitions', Type => 'StrongReferenceBatch', Unknown => 1 },
+  # '060e2b34.0101.0102.06010104.06000000' => { Name => 'StrongReferencesArrays', Type => 'Node' },
+    '060e2b34.0101.0102.06010104.06010000' => { Name => 'AvailableRepresentations', Type => 'StrongReferenceArray', Unknown => 1 },
+    '060e2b34.0101.0102.06010104.06020000' => { Name => 'InputSegments', Type => 'StrongReferenceArray', Unknown => 1 },
+    '060e2b34.0101.0102.06010104.06030000' => { Name => 'EssenceLocators', Type => 'StrongReferenceArray', Unknown => 1 },
+    '060e2b34.0101.0102.06010104.06040000' => { Name => 'IdentificationList', Type => 'StrongReferenceArray', Unknown => 1 },
+    '060e2b34.0101.0102.06010104.06050000' => { Name => 'Tracks', Type => 'StrongReferenceArray', Unknown => 1 },
+    '060e2b34.0101.0102.06010104.06060000' => { Name => 'ControlPointList', Type => 'StrongReferenceArray', Unknown => 1 },
+    '060e2b34.0101.0102.06010104.06070000' => { Name => 'PackageTracks', Type => 'StrongReferenceArray', Unknown => 1 },
+    '060e2b34.0101.0102.06010104.06080000' => { Name => 'Alternates', Type => 'StrongReferenceArray', Unknown => 1 },
+    '060e2b34.0101.0102.06010104.06090000' => { Name => 'ComponentsInSequence', Type => 'StrongReferenceArray', Unknown => 1 },
+    '060e2b34.0101.0102.06010104.060a0000' => { Name => 'Parameters', Type => 'StrongReferenceBatch', Unknown => 1 },
+  # '060e2b34.0101.0102.06010106.00000000' => { Name => 'EssenceToObjectRelationships', Type => 'Node' },
+    '060e2b34.0101.0102.06010106.01000000' => { Name => 'LinkedPackageID', Type => 'PackageID', Unknown => 1 },
+  # '060e2b34.0101.0102.06010107.00000000' => { Name => 'ObjectDictionaryToMetadataRelationships', Type => 'Node' },
+    '060e2b34.0101.0102.06010107.01000000' => { Name => 'ParentClass', Type => 'WeakReference', Unknown => 1 },
+    '060e2b34.0101.0102.06010107.02000000' => { Name => 'Properties', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0102.06010107.03000000' => { Name => 'IsConcrete', Type => 'Boolean' },
+    '060e2b34.0101.0102.06010107.04000000' => { Name => 'PropertyType', Type => 'WeakReference', Unknown => 1 },
+    '060e2b34.0101.0102.06010107.05000000' => { Name => 'LocalID', Format => 'int16u' },
+    '060e2b34.0101.0102.06010107.06000000' => { Name => 'IsUniqueIdentifier', Type => 'Boolean' },
+    '060e2b34.0101.0102.06010107.07000000' => { Name => 'ClassDefinitions', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0102.06010107.08000000' => { Name => 'TypeDefinitions', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0102.06010107.09000000' => { Name => 'TargetClassOfStrongReference', Type => 'WeakReference', Unknown => 1 },
+    '060e2b34.0101.0102.06010107.0a000000' => { Name => 'TargetClassOfWeakReference', Type => 'WeakReference', Unknown => 1 },
+    '060e2b34.0101.0102.06010107.0b000000' => { Name => 'EnumerationUnderlyingIntegerType', Type => 'WeakReference', Unknown => 1 },
+    '060e2b34.0101.0102.06010107.0c000000' => { Name => 'FixedArrayElementType', Type => 'WeakReference', Unknown => 1 },
+    '060e2b34.0101.0102.06010107.0d000000' => { Name => 'VariableArrayElementType', Type => 'WeakReference', Unknown => 1 },
+    '060e2b34.0101.0102.06010107.0e000000' => { Name => 'SetElementType', Type => 'WeakReference', Unknown => 1 },
+    '060e2b34.0101.0102.06010107.0f000000' => { Name => 'StringElementType', Type => 'WeakReference', Unknown => 1 },
+    '060e2b34.0101.0102.06010107.10000000' => { Name => 'StreamElementType', Type => 'WeakReference', Unknown => 1 },
+    '060e2b34.0101.0102.06010107.11000000' => { Name => 'MemberTypes', Type => 'WeakReferenceArray', Unknown => 1 },
+    '060e2b34.0101.0102.06010107.12000000' => { Name => 'RenamedType', Type => 'WeakReference', Unknown => 1 },
+    '060e2b34.0101.0102.06010107.13000000' => { Name => 'DictionaryIdentifier', Type => 'AUID', Unknown => 1 },
+    '060e2b34.0101.0102.06010107.14000000' => { Name => 'DictionaryDescription', Format => 'string' },
+    '060e2b34.0101.0102.06010107.14010000' => { Name => 'DictionaryDescription', Type => 'UTF-16' },
+  # '060e2b34.0101.0102.06080101.00000000' => { Name => 'ContinuityCounts', Type => 'Node' },
+    '060e2b34.0101.0102.06080101.01000000' => { Name => 'BlockContinuityCount', Format => 'int16u' },
+  # '060e2b34.0101.0102.06080102.00000000' => { Name => 'StreamPositionalRelationships', Type => 'Node' },
+    '060e2b34.0101.0102.06080102.01000000' => { Name => 'StreamPositionIndicator', Format => 'int8u' },
+  # '060e2b34.0101.0102.06080202.00000000' => { Name => 'StorageOffsets', Type => 'Node' },
+    '060e2b34.0101.0102.07020103.01030000' => { Name => 'Origin', Format => 'int64s', %duration },
+    '060e2b34.0101.0102.07020103.01040000' => { Name => 'StartTimeRelativeToReference', Format => 'int64s', %duration },
+    '060e2b34.0101.0102.07020103.01050000' => { Name => 'StartTimecode', Format => 'int64s', %duration },
+    '060e2b34.0101.0102.07020103.01060000' => { Name => 'CutPoint', Format => 'int64s', %duration },
+    '060e2b34.0101.0102.07020103.03030000' => { Name => 'EventStart', Type => 'Position', %duration },
+  # '060e2b34.0101.0102.07020103.10020000' => { Name => 'EditOffsets', Type => 'Node' },
+    '060e2b34.0101.0102.07020103.10020100' => { Name => 'ControlPointTime', Format => 'rational64s' },
+    '060e2b34.0101.0102.07020110.01030000' => { Name => 'CreateDate', %timestamp },
+    '060e2b34.0101.0102.07020110.02030000' => { Name => 'ModifyDate', %timestamp },
+    '060e2b34.0101.0102.07020110.02040000' => { Name => 'ContainerLastModifyDate', %timestamp },
+    '060e2b34.0101.0102.07020110.02050000' => { Name => 'PackageLastModifyDate', %timestamp },
+    '060e2b34.0101.0102.07020201.01030000' => { Name => 'Duration', Type => 'Length', %duration },
+    '060e2b34.0101.0102.07020201.01050100' => { Name => 'DefaultFadeDuration', Type => 'Length', %duration },
+    '060e2b34.0101.0102.07020201.01050200' => { Name => 'Fade-InDuration', Type => 'Length', %duration },
+    '060e2b34.0101.0102.07020201.01050300' => { Name => 'Fade-OutDuration', Type => 'Length', %duration },
+    '060e2b34.0101.0102.0d010101.01010100' => { Name => 'TapeFormat', Type => 'TapeFormatType', Unknown => 1 },
+    '060e2b34.0101.0103.01011001.01000000' => { Name => 'OrganizationID', Type => 'UTF-16' },
+    '060e2b34.0101.0103.01011504.00000000' => { Name => 'GlobalNumber', Format => 'string' },
+    '060e2b34.0101.0103.01012007.00000000' => { Name => 'DeviceIDKind', Format => 'string' },
+    '060e2b34.0101.0103.01012008.00000000' => { Name => 'DeviceKind', Format => 'string' },
+    '060e2b34.0101.0103.01012008.02000000' => { Name => 'DeviceKindCode', Format => 'string' },
+  # '060e2b34.0101.0103.01012100.00000000' => { Name => 'PlatformIdentifiers', Type => 'Node' },
+    '060e2b34.0101.0103.01012101.00000000' => { Name => 'PlatformDesignation', Format => 'string' },
+    '060e2b34.0101.0103.01012102.00000000' => { Name => 'PlatformModel', Format => 'string' },
+    '060e2b34.0101.0103.01012103.00000000' => { Name => 'PlatformSerialNumber', Format => 'string' },
+    '060e2b34.0101.0103.01030107.00000000' => { Name => 'LocalTargetID', Format => 'string' },
+  # '060e2b34.0101.0103.01030203.00000000' => { Name => 'DiskIdentifiers', Type => 'Node' },
+  # '060e2b34.0101.0103.01030203.01000000' => { Name => 'MagneticDisks', Type => 'Node' },
+    '060e2b34.0101.0103.01030203.01010000' => { Name => 'MagneticDiskNumber', Format => 'string' },
+  # '060e2b34.0101.0103.01030203.02000000' => { Name => 'OpticalDiscs', Type => 'Node' },
+    '060e2b34.0101.0103.01030203.02010000' => { Name => 'OpticalDiscNumber', Format => 'string' },
+    '060e2b34.0101.0103.01030402.00000000' => { Name => 'StreamID', Format => 'int8u' },
+    '060e2b34.0101.0103.01030403.00000000' => { Name => 'TransportStreamID', Format => 'int16u' },
+  # '060e2b34.0101.0103.01030500.00000000' => { Name => 'OrganizationalProgramIdentifiers', Type => 'Node' },
+    '060e2b34.0101.0103.01030501.00000000' => { Name => 'OrganizationalProgramNumber', Format => 'string' },
+    '060e2b34.0101.0103.01030501.01000000' => { Name => 'OrganizationalProgramNumber', Type => 'UTF-16' },
+  # '060e2b34.0101.0103.01030600.00000000' => { Name => 'MetadataIdentifiers', Type => 'Node' },
+    '060e2b34.0101.0103.01030601.00000000' => { Name => 'ItemDesignatorID', Type => 'SMPTE336M', Unknown => 1 },
+    '060e2b34.0101.0103.01040101.01000000' => { Name => 'LocalFilePath', Type => 'UTF-16' },
+    '060e2b34.0101.0103.01050101.00000000' => { Name => 'TitleKind', Type => 'UTF-16' },
+    '060e2b34.0101.0103.01050201.00000000' => { Name => 'MainTitle', Type => 'UTF-16' },
+    '060e2b34.0101.0103.01050301.00000000' => { Name => 'SecondaryTitle', Type => 'UTF-16' },
+    '060e2b34.0101.0103.01050401.00000000' => { Name => 'SeriesNumber', Type => 'UTF-16' },
+    '060e2b34.0101.0103.01050501.00000000' => { Name => 'EpisodeNumber', Type => 'UTF-16' },
+    '060e2b34.0101.0103.01050601.00000000' => { Name => 'SceneNumber', Type => 'UTF-16' },
+    '060e2b34.0101.0103.01050801.00000000' => { Name => 'VersionTitle', Type => 'UTF-16' },
+    '060e2b34.0101.0103.01050900.00000000' => { Name => 'MissionID', Format => 'string' },
+    '060e2b34.0101.0103.01050901.00000000' => { Name => 'MissionID', Type => 'UTF-16' },
+  # '060e2b34.0101.0103.01100300.00000000' => { Name => 'MusicIndustryIdentifiers', Type => 'Node' },
+    '060e2b34.0101.0103.01100301.00000000' => { Name => 'RecordingLabelName', Format => 'string' },
+    '060e2b34.0101.0103.01100301.01000000' => { Name => 'RecordingLabelName', Type => 'UTF-16' },
+    '060e2b34.0101.0103.01100302.00000000' => { Name => 'CollectionName', Format => 'string' },
+    '060e2b34.0101.0103.01100302.01000000' => { Name => 'CollectionName', Type => 'UTF-16' },
+    '060e2b34.0101.0103.01100303.00000000' => { Name => 'OriginCode', Format => 'string' },
+    '060e2b34.0101.0103.01100304.00000000' => { Name => 'MainCatalogNumber', Format => 'string' },
+    '060e2b34.0101.0103.01100305.00000000' => { Name => 'CatalogPrefixNumber', Format => 'string' },
+    '060e2b34.0101.0103.01100306.00000000' => { Name => 'SideNumber', Format => 'string' },
+    '060e2b34.0101.0103.01100307.00000000' => { Name => 'RecordedTrackNumber', Format => 'string' },
+    '060e2b34.0101.0103.02020200.00000000' => { Name => 'SeriesinaSeriesGroupCount', Format => 'int16u' },
+    '060e2b34.0101.0103.02020300.00000000' => { Name => 'ProgrammingGroupKind', Format => 'string' },
+  # '060e2b34.0101.0103.02030000.00000000' => { Name => 'Purchaser', Type => 'Node' },
+    '060e2b34.0101.0103.02030100.00000000' => { Name => 'PurchasingOrganizationName', Format => 'string' },
+    '060e2b34.0101.0103.02030200.00000000' => { Name => 'SalesContractNumber', Format => 'string' },
+    '060e2b34.0101.0103.02030400.00000000' => { Name => 'PurchasingDepartment', Format => 'string' },
+  # '060e2b34.0101.0103.02040000.00000000' => { Name => 'ContractDescriptions', Type => 'Node' },
+    '060e2b34.0101.0103.02040100.00000000' => { Name => 'ContractType', Format => 'string' },
+    '060e2b34.0101.0103.02040101.00000000' => { Name => 'ContractTypeCode', Format => 'string' },
+    '060e2b34.0101.0103.02040200.00000000' => { Name => 'ContractClauseDescription', Format => 'string' },
+    '060e2b34.0101.0103.02040300.00000000' => { Name => 'ContractLineCode', Format => 'string' },
+    '060e2b34.0101.0103.02040301.00000000' => { Name => 'ContractLineName', Format => 'string' },
+    '060e2b34.0101.0103.02040400.00000000' => { Name => 'ContractTermsOfBusiness', Format => 'string' },
+    '060e2b34.0101.0103.02040500.00000000' => { Name => 'ContractInstallmentPercentage', Format => 'float' },
+    '060e2b34.0101.0103.02040600.00000000' => { Name => 'Jurisdiction', Format => 'string' },
+    '060e2b34.0101.0103.02050101.01000000' => { Name => 'CopyrightStatus', Type => 'UTF-16' },
+    '060e2b34.0101.0103.02050102.01000000' => { Name => 'CopyrightOwnerName', Type => 'UTF-16' },
+    '060e2b34.0101.0103.02050201.01000000' => { Name => 'IntellectualPropertyDescription', Type => 'UTF-16' },
+    '060e2b34.0101.0103.02050202.01000000' => { Name => 'IntellectualPropertyRights', Type => 'UTF-16' },
+    '060e2b34.0101.0103.02050301.01000000' => { Name => 'Rightsholder', Type => 'UTF-16' },
+    '060e2b34.0101.0103.02050302.01000000' => { Name => 'RightsManagementAuthority', Type => 'UTF-16' },
+    '060e2b34.0101.0103.02050403.00000000' => { Name => 'RightsConditionDescription', Format => 'string' },
+    '060e2b34.0101.0103.02050403.01000000' => { Name => 'RightsConditionDescription', Type => 'UTF-16' },
+    '060e2b34.0101.0103.02060101.01000000' => { Name => 'CurrencyName', Format => 'string' },
+    '060e2b34.0101.0103.02060202.00000000' => { Name => 'TotalPayment', Format => 'string' },
+    '060e2b34.0101.0103.02060203.00000000' => { Name => 'PayeeAccountName', Format => 'string' },
+    '060e2b34.0101.0103.02060204.00000000' => { Name => 'PayeeAccountNumber', Format => 'string' },
+    '060e2b34.0101.0103.02060205.00000000' => { Name => 'PayeeAccountSortCode', Format => 'string' },
+    '060e2b34.0101.0103.02060302.00000000' => { Name => 'TotalIncome', Format => 'string' },
+    '060e2b34.0101.0103.02060303.00000000' => { Name => 'PayerAccountName', Format => 'string' },
+    '060e2b34.0101.0103.02060304.00000000' => { Name => 'PayerAccountNumber', Format => 'string' },
+    '060e2b34.0101.0103.02060305.00000000' => { Name => 'PayerAccountSortCode', Format => 'string' },
+  # '060e2b34.0101.0103.02080200.00000000' => { Name => 'Classification', Type => 'Node' },
+    '060e2b34.0101.0103.02080201.00000000' => { Name => 'SecurityClassification', Format => 'string' },
+    '060e2b34.0101.0103.02080202.00000000' => { Name => 'SecurityClassificationCaveats', Format => 'string' },
+    '060e2b34.0101.0103.02080203.00000000' => { Name => 'ClassifiedBy', Format => 'string' },
+    '060e2b34.0101.0103.02080204.00000000' => { Name => 'ClassificationReason', Format => 'string' },
+    '060e2b34.0101.0103.02080205.00000000' => { Name => 'DeclassificationDate', Format => 'string' },
+    '060e2b34.0101.0103.02080206.00000000' => { Name => 'DerivedFrom', Format => 'string' },
+    '060e2b34.0101.0103.02080207.00000000' => { Name => 'ClassificationComment', Format => 'string' },
+    '060e2b34.0101.0103.02080208.00000000' => { Name => 'ClassificationAndMarkingSystem', Format => 'string' },
+    '060e2b34.0101.0103.02100101.01010000' => { Name => 'BroadcastOrganizationName', Type => 'UTF-16' },
+    '060e2b34.0101.0103.02100101.02010000' => { Name => 'BroadcastServiceName', Type => 'UTF-16' },
+    '060e2b34.0101.0103.02100101.03020000' => { Name => 'BroadcastMediumCode', Format => 'string' },
+    '060e2b34.0101.0103.02100101.04010000' => { Name => 'BroadcastRegion', Type => 'UTF-16' },
+    '060e2b34.0101.0103.02300101.01000000' => { Name => 'NatureOfPersonality', Type => 'UTF-16' },
+    '060e2b34.0101.0103.02300102.01010000' => { Name => 'ContributionStatus', Type => 'UTF-16' },
+    '060e2b34.0101.0103.02300103.01010000' => { Name => 'SupportorAdministrationStatus', Type => 'UTF-16' },
+    '060e2b34.0101.0103.02300201.01000000' => { Name => 'OrganizationKind', Type => 'UTF-16' },
+    '060e2b34.0101.0103.02300202.01010000' => { Name => 'ProductionOrganizationRole', Type => 'UTF-16' },
+    '060e2b34.0101.0103.02300203.01010000' => { Name => 'SupportOrganizationRole', Type => 'UTF-16' },
+    '060e2b34.0101.0103.02300501.01000000' => { Name => 'JobFunctionName', Type => 'UTF-16' },
+    '060e2b34.0101.0103.02300501.02000000' => { Name => 'JobFunctionCode', Format => 'string' },
+    '060e2b34.0101.0103.02300502.01000000' => { Name => 'RoleName', Type => 'UTF-16' },
+    '060e2b34.0101.0103.02300503.00000000' => { Name => 'JobTitle', Format => 'string' },
+    '060e2b34.0101.0103.02300503.01000000' => { Name => 'JobTitle', Type => 'UTF-16' },
+    '060e2b34.0101.0103.02300601.01000000' => { Name => 'ContactKind', Type => 'UTF-16' },
+    '060e2b34.0101.0103.02300602.01000000' => { Name => 'ContactDepartmentName', Type => 'UTF-16' },
+    '060e2b34.0101.0103.02300603.01010100' => { Name => 'FamilyName', Type => 'UTF-16' },
+    '060e2b34.0101.0103.02300603.01020100' => { Name => 'FirstGivenName', Type => 'UTF-16' },
+    '060e2b34.0101.0103.02300603.01030100' => { Name => 'SecondGivenName', Type => 'UTF-16' },
+    '060e2b34.0101.0103.02300603.01040100' => { Name => 'ThirdGivenName', Type => 'UTF-16' },
+    '060e2b34.0101.0103.02300603.01070000' => { Name => 'PersonDescription', Format => 'string' },
+    '060e2b34.0101.0103.02300603.01070100' => { Name => 'PersonDescription', Type => 'UTF-16' },
+    '060e2b34.0101.0103.02300603.02010100' => { Name => 'MainName', Type => 'UTF-16' },
+    '060e2b34.0101.0103.02300603.02020100' => { Name => 'SupplementaryName', Type => 'UTF-16' },
+    '060e2b34.0101.0103.02300603.03010100' => { Name => 'OrganizationMainName', Type => 'UTF-16' },
+    '060e2b34.0101.0103.02300603.03020100' => { Name => 'SupplementaryOrganizationName', Type => 'UTF-16' },
+    '060e2b34.0101.0103.03010101.02000000' => { Name => 'RegionCode', Format => 'string' },
+  # '060e2b34.0101.0103.03010101.10000000' => { Name => 'CountryAndRegionNames', Type => 'Node' },
+    '060e2b34.0101.0103.03010101.10010000' => { Name => 'CountryName', Format => 'string' },
+    '060e2b34.0101.0103.03010101.10010100' => { Name => 'CountryName', Type => 'UTF-16' },
+    '060e2b34.0101.0103.03010101.10020000' => { Name => 'RegionName', Format => 'string' },
+    '060e2b34.0101.0103.03010101.10020100' => { Name => 'RegionName', Type => 'UTF-16' },
+  # '060e2b34.0101.0103.03010102.10000000' => { Name => 'LanguageNames', Type => 'Node' },
+    '060e2b34.0101.0103.03010102.10010000' => { Name => 'LanguageName', Format => 'string' },
+    '060e2b34.0101.0103.03010102.10010100' => { Name => 'LanguageName', Type => 'UTF-16' },
+    '060e2b34.0101.0103.03010210.05000000' => { Name => 'TerminatingFillerData', Format => 'int8u' },
+    '060e2b34.0101.0103.03010303.03000000' => { Name => 'TimingBiasCorrection', Format => 'float' },
+    '060e2b34.0101.0103.03010303.04000000' => { Name => 'TimingBiasCorrectionDescription', Format => 'string' },
+    '060e2b34.0101.0103.03020101.03010000' => { Name => 'Genre', Type => 'UTF-16' },
+    '060e2b34.0101.0103.03020101.04010000' => { Name => 'TargetAudience', Type => 'UTF-16' },
+    '060e2b34.0101.0103.03020101.10000000' => { Name => 'ProgramMaterialClassificationCode', Format => 'string' },
+    '060e2b34.0101.0103.03020102.03010000' => { Name => 'Theme', Type => 'UTF-16' },
+    '060e2b34.0101.0103.03020102.04010000' => { Name => 'SubjectName', Format => 'string' },
+    '060e2b34.0101.0103.03020102.04020000' => { Name => 'SubjectName', Type => 'UTF-16' },
+    '060e2b34.0101.0103.03020102.05010000' => { Name => 'Keywords', Type => 'UTF-16' },
+    '060e2b34.0101.0103.03020102.0f000000' => { Name => 'KeyFrameSampleCount', Format => 'int32u' },
+    '060e2b34.0101.0103.03020106.01010000' => { Name => 'Abstract', Type => 'UTF-16' },
+    '060e2b34.0101.0103.03020106.02010000' => { Name => 'Purpose', Type => 'UTF-16' },
+    '060e2b34.0101.0103.03020106.03010000' => { Name => 'Description', Type => 'UTF-16' },
+    '060e2b34.0101.0103.03020106.04010000' => { Name => 'ColorDescriptor', Type => 'UTF-16' },
+    '060e2b34.0101.0103.03020106.05010000' => { Name => 'FormatDescriptor', Type => 'UTF-16' },
+    '060e2b34.0101.0103.03020106.06000000' => { Name => 'IntentDescriptor', Format => 'string' },
+    '060e2b34.0101.0103.03020106.06010000' => { Name => 'IntentDescriptor', Type => 'UTF-16' },
+    '060e2b34.0101.0103.03020106.07000000' => { Name => 'TextualDescriptionKind', Format => 'string' },
+    '060e2b34.0101.0103.03020106.07010000' => { Name => 'TextualDescriptionKind', Type => 'UTF-16' },
+    '060e2b34.0101.0103.03020201.03000000' => { Name => 'FestivalName', Format => 'string' },
+    '060e2b34.0101.0103.03020301.02020000' => { Name => 'ObjectDescriptionCode', Format => 'string' },
+  # '060e2b34.0101.0103.03020302.00000000' => { Name => 'GeneralComments', Type => 'Node' },
+    '060e2b34.0101.0103.03020302.01000000' => { Name => 'DescriptionKind', Format => 'string' },
+    '060e2b34.0101.0103.03020302.01010000' => { Name => 'DescriptionKind', Type => 'UTF-16' },
+    '060e2b34.0101.0103.03020302.02000000' => { Name => 'DescriptiveComment', Format => 'string' },
+    '060e2b34.0101.0103.03020302.02010000' => { Name => 'DescriptiveComment', Type => 'UTF-16' },
+  # '060e2b34.0101.0103.03020401.00000000' => { Name => 'ObjectNames', Type => 'Node' },
+  # '060e2b34.0101.0103.03020600.00000000' => { Name => 'Human-AssignedContextDescriptions', Type => 'Node' },
+    '060e2b34.0101.0103.03020601.00000000' => { Name => 'ContextDescription', Format => 'string' },
+    '060e2b34.0101.0103.03030102.06010000' => { Name => 'ComputedKeywords', Type => 'UTF-16' },
+    '060e2b34.0101.0103.03030301.04000000' => { Name => 'ObjectIdentificationConfidence', Format => 'int16u' },
+    '060e2b34.0101.0103.03030301.05000000' => { Name => 'ObjectHorizontalAverageDimension', Format => 'int32u' },
+    '060e2b34.0101.0103.03030301.06000000' => { Name => 'ObjectVerticalAverageDimension', Format => 'int32u' },
+    '060e2b34.0101.0103.03030301.07000000' => { Name => 'ObjectAreaDimension', Format => 'int32u' },
+    '060e2b34.0101.0103.04010101.04000000' => { Name => 'HorizontalActionSafePercentage', Format => 'float' },
+    '060e2b34.0101.0103.04010101.05000000' => { Name => 'VerticalActionSafePercentage', Format => 'float' },
+    '060e2b34.0101.0103.04010101.06000000' => { Name => 'HorizontalGraphicsSafePercentage', Format => 'float' },
+    '060e2b34.0101.0103.04010101.07000000' => { Name => 'VerticalGraphicsSafePercentage', Format => 'float' },
+    '060e2b34.0101.0103.04010101.08000000' => { Name => 'PerceivedDisplayFormatName', Format => 'string' },
+    '060e2b34.0101.0103.04010101.08010000' => { Name => 'PerceivedDisplayFormatCode', Format => 'string' },
+    '060e2b34.0101.0103.04010201.01050000' => { Name => 'VideoColorKind', Format => 'string' },
+    '060e2b34.0101.0103.04010301.07000000' => { Name => 'PictureDisplayRate', Format => 'int16u' },
+    '060e2b34.0101.0103.04010501.11000000' => { Name => 'VideoAverageBitrate', Format => 'float', PrintConv => 'ConvertBitrate($val)' },
+    '060e2b34.0101.0103.04010501.12000000' => { Name => 'VideoFixedBitrate', Type => 'Boolean' },
+  # '060e2b34.0101.0103.04010b00.00000000' => { Name => 'VideoFileFormats', Type => 'Node' },
+    '060e2b34.0101.0103.04010b01.00000000' => { Name => 'DigitalVideoFileFormat', Format => 'string' },
+    '060e2b34.0101.0103.04020401.01000000' => { Name => 'CodingLawName', Format => 'string' },
+    '060e2b34.0101.0103.04020402.01000000' => { Name => 'AudioCodingSchemeCode', Format => 'string', Groups => { 2 => 'Audio' } },
+    '060e2b34.0101.0103.04020402.02000000' => { Name => 'AudioCodingSchemeName', Format => 'string', Groups => { 2 => 'Audio' } },
+    '060e2b34.0101.0103.04030301.00000000' => { Name => 'DigitalEncodingBitrate', Format => 'int32u', PrintConv => 'ConvertBitrate($val)' },
+    '060e2b34.0101.0103.04030302.00000000' => { Name => 'DataEssenceCodingID', Type => 'AUID', Unknown => 1 },
+  # '060e2b34.0101.0103.040f0000.00000000' => { Name => 'StorageCharacteristics', Type => 'Node' },
+    '060e2b34.0101.0103.040f0100.00000000' => { Name => 'StorageKind', Format => 'string' },
+    '060e2b34.0101.0103.040f0101.00000000' => { Name => 'StorageKind', Type => 'UTF-16' },
+    '060e2b34.0101.0103.040f0102.00000000' => { Name => 'StorageKindCode', Format => 'string' },
+  # '060e2b34.0101.0103.04100101.10000000' => { Name => 'TapeMediumFundamentalParameters', Type => 'Node' },
+    '060e2b34.0101.0103.04100101.10010000' => { Name => 'TapePartitionCapacity', Format => 'int64u' },
+  # '060e2b34.0101.0103.04100102.01000000' => { Name => 'DiscMediumFundamentalParameters', Type => 'Node' },
+    '060e2b34.0101.0103.04100102.02000000' => { Name => 'DiscPartitionCapacity', Format => 'int64u' },
+    '060e2b34.0101.0103.04200201.01040100' => { Name => 'FocalLength', Format => 'int32u', ValueConv => '$val/10' },
+    '060e2b34.0101.0103.04200201.01080100' => { Name => 'FieldOfViewHorizontal', Format => 'int16u', ValueConv => '$val/10' },
+    '060e2b34.0101.0103.04200201.010a0000' => { Name => 'FieldOfViewVertical', Format => 'int16u', ValueConv => '$val/10' },
+  # '060e2b34.0101.0103.04300000.00000000' => { Name => 'SystemCharacteristics', Type => 'Node' },
+    '060e2b34.0101.0103.04300100.00000000' => { Name => 'SystemNameOrNumber', Format => 'string' },
+    '060e2b34.0101.0103.05010104.00000000' => { Name => 'LogoFlag', Type => 'Boolean' },
+    '060e2b34.0101.0103.05010106.00000000' => { Name => 'GraphicKind', Format => 'string' },
+    '060e2b34.0101.0103.05010107.00000000' => { Name => 'GraphicUsageKind', Format => 'string' },
+    '060e2b34.0101.0103.05010401.00000000' => { Name => 'SignatureTuneFlag', Type => 'Boolean' },
+    '060e2b34.0101.0103.05010402.00000000' => { Name => 'BackgroundMusicFlag', Type => 'Boolean' },
+  # '060e2b34.0101.0103.06030000.00000000' => { Name => 'RelatedProductionContent', Type => 'Node' },
+  # '060e2b34.0101.0103.06030500.00000000' => { Name => 'RelatedTextualContent', Type => 'Node' },
+    '060e2b34.0101.0103.06030501.00000000' => { Name => 'ProductionScriptReference', Format => 'string' },
+    '060e2b34.0101.0103.06030501.01000000' => { Name => 'ProductionScriptReference', Type => 'UTF-16' },
+    '060e2b34.0101.0103.06030502.00000000' => { Name => 'TranscriptReference', Format => 'string' },
+    '060e2b34.0101.0103.06030502.01000000' => { Name => 'TranscriptReference', Type => 'UTF-16' },
+    '060e2b34.0101.0103.07010103.00000000' => { Name => 'HorizontalDatum', Format => 'string' },
+    '060e2b34.0101.0103.07010104.00000000' => { Name => 'VerticalDatum', Format => 'string' },
+    '060e2b34.0101.0103.07010201.02040200' => { Name => 'DeviceLatitude', Format => 'double', %geoLat },
+    '060e2b34.0101.0103.07010201.02060200' => { Name => 'DeviceLongitude', Format => 'double', %geoLon },
+    '060e2b34.0101.0103.07010201.03020200' => { Name => 'FrameCenterLatitude', Format => 'double', %geoLat },
+    '060e2b34.0101.0103.07010201.03040200' => { Name => 'FrameCenterLongitude', Format => 'double', %geoLon },
+    '060e2b34.0101.0103.07010201.03070000' => { Name => 'CornerLatitudePoint1', Format => 'string', %geoLat, ValueConv => \&ConvLatLon },
+    '060e2b34.0101.0103.07010201.03070100' => { Name => 'CornerLatitudePoint1', Format => 'double', %geoLat },
+    '060e2b34.0101.0103.07010201.03080000' => { Name => 'CornerLatitudePoint2', Format => 'string', %geoLat },
+    '060e2b34.0101.0103.07010201.03080100' => { Name => 'CornerLatitudePoint2', Format => 'double', %geoLat },
+    '060e2b34.0101.0103.07010201.03090000' => { Name => 'CornerLatitudePoint3', Format => 'string', %geoLat },
+    '060e2b34.0101.0103.07010201.03090100' => { Name => 'CornerLatitudePoint3', Format => 'double', %geoLat },
+    '060e2b34.0101.0103.07010201.030a0000' => { Name => 'CornerLatitudePoint4', Format => 'string' },
+    '060e2b34.0101.0103.07010201.030a0100' => { Name => 'CornerLatitudePoint4', Format => 'double', %geoLat },
+    '060e2b34.0101.0103.07010201.030b0000' => { Name => 'CornerLongitudePoint1', Format => 'string' },
+    '060e2b34.0101.0103.07010201.030b0100' => { Name => 'CornerLongitudePoint1', Format => 'double', %geoLon },
+    '060e2b34.0101.0103.07010201.030c0000' => { Name => 'CornerLongitudePoint2', Format => 'string' },
+    '060e2b34.0101.0103.07010201.030c0100' => { Name => 'CornerLongitudePoint2', Format => 'double', %geoLon },
+    '060e2b34.0101.0103.07010201.030d0000' => { Name => 'CornerLongitudePoint3', Format => 'string' },
+    '060e2b34.0101.0103.07010201.030d0100' => { Name => 'CornerLongitudePoint3', Format => 'double', %geoLon },
+    '060e2b34.0101.0103.07010201.030e0000' => { Name => 'CornerLongitudePoint4', Format => 'string' },
+    '060e2b34.0101.0103.07010201.030e0100' => { Name => 'CornerLongitudePoint4', Format => 'double', %geoLon },
+    '060e2b34.0101.0103.07010801.02000000' => { Name => 'SubjectDistance', Format => 'float' },
+    '060e2b34.0101.0103.07012001.01010100' => { Name => 'PlaceKeyword', Type => 'UTF-16' },
+    '060e2b34.0101.0103.07012001.02010100' => { Name => 'ObjectCountryCode', Type => 'UTF-16' },
+    '060e2b34.0101.0103.07012001.02060000' => { Name => 'ObjectCountryCodeMethod', Format => 'string' },
+    '060e2b34.0101.0103.07012001.02070000' => { Name => 'CountryCodeMethod', Format => 'string' },
+    '060e2b34.0101.0103.07012001.02080000' => { Name => 'Non-USClassifyingCountryCode', Format => 'string' },
+    '060e2b34.0101.0103.07012001.02090000' => { Name => 'ReleasableCountryCode', Format => 'string' },
+    '060e2b34.0101.0103.07012001.03010100' => { Name => 'ObjectRegionName', Type => 'UTF-16' },
+    '060e2b34.0101.0103.07012001.03020100' => { Name => 'ShootingRegionName', Type => 'UTF-16' },
+    '060e2b34.0101.0103.07012001.03030100' => { Name => 'SettingRegionName', Type => 'UTF-16' },
+    '060e2b34.0101.0103.07012001.03040100' => { Name => 'CopyrightLicenseRegionName', Type => 'UTF-16' },
+    '060e2b34.0101.0103.07012001.03050100' => { Name => 'IntellectualPropertyLicenseRegionName', Type => 'UTF-16' },
+    '060e2b34.0101.0103.07012001.04010101' => { Name => 'RoomNumber', Type => 'UTF-16' },
+    '060e2b34.0101.0103.07012001.04010201' => { Name => 'StreetNumber', Type => 'UTF-16' },
+    '060e2b34.0101.0103.07012001.04010301' => { Name => 'StreetName', Type => 'UTF-16' },
+    '060e2b34.0101.0103.07012001.04010401' => { Name => 'PostalTown', Type => 'UTF-16' },
+    '060e2b34.0101.0103.07012001.04010501' => { Name => 'CityName', Type => 'UTF-16' },
+    '060e2b34.0101.0103.07012001.04010601' => { Name => 'StateOrProvinceOrCountyName', Type => 'UTF-16' },
+    '060e2b34.0101.0103.07012001.04010701' => { Name => 'PostalCode', Type => 'UTF-16' },
+    '060e2b34.0101.0103.07012001.04010801' => { Name => 'CountryName', Type => 'UTF-16' },
+    '060e2b34.0101.0103.07012001.04020101' => { Name => 'SettingRoomNumber', Type => 'UTF-16' },
+    '060e2b34.0101.0103.07012001.04020201' => { Name => 'SettingStreetNumberOrBuildingName', Type => 'UTF-16' },
+    '060e2b34.0101.0103.07012001.04020301' => { Name => 'SettingStreetName', Type => 'UTF-16' },
+    '060e2b34.0101.0103.07012001.04020401' => { Name => 'SettingTownName', Type => 'UTF-16' },
+    '060e2b34.0101.0103.07012001.04020501' => { Name => 'SettingCityName', Type => 'UTF-16' },
+    '060e2b34.0101.0103.07012001.04020601' => { Name => 'SettingStateOrProvinceOrCountyName', Type => 'UTF-16' },
+    '060e2b34.0101.0103.07012001.04020701' => { Name => 'SettingPostalCode', Type => 'UTF-16' },
+    '060e2b34.0101.0103.07012001.04020801' => { Name => 'SettingCountryName', Type => 'UTF-16' },
+    '060e2b34.0101.0103.07012001.10030101' => { Name => 'TelephoneNumber', Type => 'UTF-16' },
+    '060e2b34.0101.0103.07012001.10030201' => { Name => 'FaxNumber', Type => 'UTF-16' },
+    '060e2b34.0101.0103.07012001.10030301' => { Name => 'E-MailAddress', Type => 'UTF-16' },
+    '060e2b34.0101.0103.07012002.01010000' => { Name => 'SettingDescription', Type => 'UTF-16' },
+    '060e2b34.0101.0103.07020101.01050000' => { Name => 'POSIXMicroseconds', Format => 'int64u' },
+  # '060e2b34.0101.0103.07020103.10030000' => { Name => 'EventOffsets', Type => 'Node' },
+    '060e2b34.0101.0103.07020103.10030100' => { Name => 'EventElapsedTimeToStart', Format => 'string' },
+    '060e2b34.0101.0103.07020103.10030200' => { Name => 'EventElapsedTimeToEnd', Format => 'string' },
+    '060e2b34.0101.0104.01011002.00000000' => { Name => 'OrganizationIDKind', Format => 'string' },
+    '060e2b34.0101.0104.01011002.01000000' => { Name => 'OrganizationIDKind', Type => 'UTF-16' },
+  # '060e2b34.0101.0104.01020200.00000000' => { Name => 'RegistryLocators', Type => 'Node' },
+    '060e2b34.0101.0104.01020201.00000000' => { Name => 'SMPTEUL', Type => 'UL', Unknown => 1 },
+  # '060e2b34.0101.0104.01020210.00000000' => { Name => 'RegistryLocatorGroups', Type => 'Node' },
+  # '060e2b34.0101.0104.01020210.01000000' => { Name => 'RegistryLocatorOrderedGroup', Type => 'Node' },
+    '060e2b34.0101.0104.01020210.01010000' => { Name => 'EssenceContainerArray', Type => 'Array of UL', Unknown => 1 },
+    '060e2b34.0101.0104.01030404.00000000' => { Name => 'EssenceStreamID', Format => 'int32u' },
+    '060e2b34.0101.0104.01030405.00000000' => { Name => 'IndexStreamID', Format => 'int32u' },
+    '060e2b34.0101.0104.01050a00.00000000' => { Name => 'WorkingTitle', Format => 'string' },
+    '060e2b34.0101.0104.01050a01.00000000' => { Name => 'WorkingTitle', Type => 'UTF-16' },
+    '060e2b34.0101.0104.01050b00.00000000' => { Name => 'OriginalTitle', Format => 'string' },
+    '060e2b34.0101.0104.01050b01.00000000' => { Name => 'OriginalTitle', Type => 'UTF-16' },
+    '060e2b34.0101.0104.01050c00.00000000' => { Name => 'ClipNumber', Format => 'string' },
+    '060e2b34.0101.0104.01050c01.00000000' => { Name => 'ClipNumber', Type => 'UTF-16' },
+    '060e2b34.0101.0104.01070105.00000000' => { Name => 'DescriptiveMetadataTrackIDs', Format => 'int32u' },
+  # '060e2b34.0101.0104.01080000.00000000' => { Name => 'GenericIdentifiers', Type => 'Node' },
+    '060e2b34.0101.0104.01080100.00000000' => { Name => 'IdentifierKind', Format => 'string' },
+    '060e2b34.0101.0104.01080200.00000000' => { Name => 'IdentifierValue', Format => 'int8u' },
+  # '060e2b34.0101.0104.010a0200.00000000' => { Name => 'GeneralOrganizationIdentifiers', Type => 'Node' },
+    '060e2b34.0101.0104.010a0201.00000000' => { Name => 'OrganizationCode', Format => 'string' },
+    '060e2b34.0101.0104.010a0201.01000000' => { Name => 'OrganizationCode', Type => 'UTF-16' },
+    '060e2b34.0101.0104.02010500.00000000' => { Name => 'SupplierIdentificationKind', Format => 'string' },
+    '060e2b34.0101.0104.02010600.00000000' => { Name => 'SupplierIdentificationValue', Format => 'string' },
+    '060e2b34.0101.0104.02010700.00000000' => { Name => 'SupplierAccountNumber', Format => 'string' },
+    '060e2b34.0101.0104.02010800.00000000' => { Name => 'SupplierAccountName', Format => 'string' },
+    '060e2b34.0101.0104.02010801.00000000' => { Name => 'SupplierAccountName', Type => 'UTF-16' },
+    '060e2b34.0101.0104.02020400.00000000' => { Name => 'EpisodeStartNumber', Format => 'int16u' },
+    '060e2b34.0101.0104.02020500.00000000' => { Name => 'EpisodeEndNumber', Format => 'int16u' },
+    '060e2b34.0101.0104.02030500.00000000' => { Name => 'PurchaserIdentificationKind', Format => 'string' },
+    '060e2b34.0101.0104.02030600.00000000' => { Name => 'PurchaserIdentificationValue', Format => 'string' },
+    '060e2b34.0101.0104.02030700.00000000' => { Name => 'PurchaserAccountNumber', Format => 'string' },
+    '060e2b34.0101.0104.02030800.00000000' => { Name => 'PurchaserAccountName', Format => 'string' },
+    '060e2b34.0101.0104.02030801.00000000' => { Name => 'PurchaserAccountName', Type => 'UTF-16' },
+    '060e2b34.0101.0104.02040102.00000000' => { Name => 'ContractType', Type => 'UTF-16' },
+    '060e2b34.0101.0104.02040201.00000000' => { Name => 'ContractClauseDescription', Type => 'UTF-16' },
+    '060e2b34.0101.0104.02040302.00000000' => { Name => 'ContractLineName', Type => 'UTF-16' },
+    '060e2b34.0101.0104.02040401.00000000' => { Name => 'ContractTermsOfBusiness', Type => 'UTF-16' },
+    '060e2b34.0101.0104.02040601.00000000' => { Name => 'Jurisdiction', Type => 'UTF-16' },
+    '060e2b34.0101.0104.02060102.00000000' => { Name => 'TotalCurrencyAmount', Format => 'double' },
+    '060e2b34.0101.0104.02060103.00000000' => { Name => 'InstallmentNumber', Format => 'int16u' },
+  # '060e2b34.0101.0104.020a0000.00000000' => { Name => 'IdentifiersAndLocatorsAdministrationAuthorities', Type => 'Node' },
+    '060e2b34.0101.0104.020a0100.00000000' => { Name => 'IdentifierIssuingAuthority', Format => 'string' },
+  # '060e2b34.0101.0104.02100200.00000000' => { Name => 'Publication', Type => 'Node' },
+  # '060e2b34.0101.0104.02100201.00000000' => { Name => 'GeneralPublication', Type => 'Node' },
+    '060e2b34.0101.0104.02100201.01000000' => { Name => 'PublishingOrganizationName', Format => 'string' },
+    '060e2b34.0101.0104.02100201.01010000' => { Name => 'PublishingOrganizationName', Type => 'UTF-16' },
+    '060e2b34.0101.0104.02100201.02000000' => { Name => 'PublishingServiceName', Format => 'string' },
+    '060e2b34.0101.0104.02100201.02010000' => { Name => 'PublishingServiceName', Type => 'UTF-16' },
+    '060e2b34.0101.0104.02100201.03000000' => { Name => 'PublishingMediumName', Format => 'string' },
+    '060e2b34.0101.0104.02100201.03010000' => { Name => 'PublishingMediumName', Type => 'UTF-16' },
+    '060e2b34.0101.0104.02100201.04000000' => { Name => 'PublishingRegionName', Format => 'string' },
+    '060e2b34.0101.0104.02100201.04010000' => { Name => 'PublishingRegionName', Type => 'UTF-16' },
+    '060e2b34.0101.0104.02300603.01050100' => { Name => 'Salutation', Type => 'UTF-16' },
+    '060e2b34.0101.0104.02300603.01060100' => { Name => 'HonorsAndQualifications', Type => 'UTF-16' },
+    '060e2b34.0101.0104.02300603.01080000' => { Name => 'OtherGivenNames', Format => 'string' },
+    '060e2b34.0101.0104.02300603.01080100' => { Name => 'OtherGivenNames', Type => 'UTF-16' },
+    '060e2b34.0101.0104.02300603.01090000' => { Name => 'AlternateName', Format => 'string' },
+    '060e2b34.0101.0104.02300603.01090100' => { Name => 'AlternateName', Type => 'UTF-16' },
+  # '060e2b34.0101.0104.03010102.02000000' => { Name => 'TextLanguageCodes', Type => 'Node' },
+    '060e2b34.0101.0104.03010102.02010000' => { Name => 'ISO639TextLanguageCode', Format => 'string', LanguageCode => 1 },
+    '060e2b34.0101.0104.03010102.02020000' => { Name => 'ISO639CaptionsLanguageCode', Format => 'string' },
+  # '060e2b34.0101.0104.03010102.03000000' => { Name => 'SpokenLanguageCodes', Type => 'Node' },
+    '060e2b34.0101.0104.03010102.03010000' => { Name => 'PrimarySpokenLanguageCode', Format => 'string' },
+    '060e2b34.0101.0104.03010102.03020000' => { Name => 'SecondarySpokenLanguageCode', Format => 'string' },
+    '060e2b34.0101.0104.03010102.03030000' => { Name => 'PrimaryOriginalLanguageCode', Format => 'string' },
+    '060e2b34.0101.0104.03010102.03040000' => { Name => 'SecondaryOriginalLanguageCode', Format => 'string' },
+    '060e2b34.0101.0104.03010201.06000000' => { Name => 'MajorVersion', Format => 'int16u' },
+    '060e2b34.0101.0104.03010201.07000000' => { Name => 'MinorVersion', Format => 'int16u' },
+    '060e2b34.0101.0104.03010201.08000000' => { Name => 'SectorSize', Format => 'int32u' },
+    '060e2b34.0101.0104.03010203.09000000' => { Name => 'ElementLength', Format => 'int32u' },
+    '060e2b34.0101.0104.03020102.02010000' => { Name => 'ThesaurusName', Type => 'UTF-16' },
+    '060e2b34.0101.0104.03020102.0d010000' => { Name => 'Cue-InWords', Type => 'UTF-16' },
+    '060e2b34.0101.0104.03020102.0e010000' => { Name => 'Cue-OutWords', Type => 'UTF-16' },
+    '060e2b34.0101.0104.03020102.10000000' => { Name => 'KeypointKind', Format => 'string' },
+    '060e2b34.0101.0104.03020102.10010000' => { Name => 'KeypointKind', Type => 'UTF-16' },
+    '060e2b34.0101.0104.03020102.11000000' => { Name => 'KeypointValue', Format => 'string' },
+    '060e2b34.0101.0104.03020102.11010000' => { Name => 'KeypointValue', Type => 'UTF-16' },
+    '060e2b34.0101.0104.03020201.03010000' => { Name => 'FestivalName', Type => 'UTF-16' },
+    '060e2b34.0101.0104.03020201.04000000' => { Name => 'AwardName', Format => 'string' },
+    '060e2b34.0101.0104.03020201.04010000' => { Name => 'AwardName', Type => 'UTF-16' },
+    '060e2b34.0101.0104.03020201.05000000' => { Name => 'AwardCategory', Format => 'string' },
+    '060e2b34.0101.0104.03020201.05010000' => { Name => 'AwardCategory', Type => 'UTF-16' },
+    '060e2b34.0101.0104.03020503.00000000' => { Name => 'SlateInformation', Type => 'UTF-16' },
+    '060e2b34.0101.0104.04020301.04000000' => { Name => 'LockedIndicator', Type => 'Boolean' },
+    '060e2b34.0101.0104.04020303.04000000' => { Name => 'BitsPerAudioSample', Format => 'int32u', Groups => { 2 => 'Audio' } },
+    '060e2b34.0101.0104.04030101.00000000' => { Name => 'CaptionKind', Format => 'string' },
+    '060e2b34.0101.0104.04030101.01000000' => { Name => 'CaptionKind', Type => 'UTF-16' },
+  # '060e2b34.0101.0104.04040400.00000000' => { Name => 'IndexingMetadataCodingCharacteristics', Type => 'Node' },
+  # '060e2b34.0101.0104.04040401.00000000' => { Name => 'IntraEditUnitIndexing', Type => 'Node' },
+    '060e2b34.0101.0104.04040401.01000000' => { Name => 'SliceCount', Format => 'int8u' },
+    '060e2b34.0101.0104.04040401.02000000' => { Name => 'SliceNumber', Format => 'int8u' },
+    '060e2b34.0101.0104.04040401.03000000' => { Name => 'ElementDelta', Format => 'int32u' },
+    '060e2b34.0101.0104.04040401.04000000' => { Name => 'PositionTableIndexing', Format => 'int8s' },
+    '060e2b34.0101.0104.04040401.05000000' => { Name => 'SliceOffsetList', Type => 'UInt32Array', Unknown => 1 },
+    '060e2b34.0101.0104.04040401.08000000' => { Name => 'PosTableArray', Unknown => 1 },
+  # '060e2b34.0101.0104.04040402.00000000' => { Name => 'InterEditUnitIndexing', Type => 'Node' },
+    '060e2b34.0101.0104.04040402.01000000' => { Name => 'StreamOffset', Format => 'int64u' },
+    '060e2b34.0101.0104.04040402.02000000' => { Name => 'EditUnitFlags', Format => 'int8u' },
+    '060e2b34.0101.0104.04040402.03000000' => { Name => 'TemporalOffset', Format => 'int8s' },
+    '060e2b34.0101.0104.04040402.04000000' => { Name => 'AnchorOffset', Format => 'int8s' },
+  # '060e2b34.0101.0104.04060200.00000000' => { Name => 'GeneralEssenceContainerCharacteristics', Type => 'Node' },
+    '060e2b34.0101.0104.04060201.00000000' => { Name => 'EditUnitLength', Format => 'int32u' },
+  # '060e2b34.0101.0104.04060800.00000000' => { Name => 'GeneralMetadataCodingCharacteristics', Type => 'Node' },
+  # '060e2b34.0101.0104.04060900.00000000' => { Name => 'GeneralMetadataContainerCharacteristics', Type => 'Node' },
+    '060e2b34.0101.0104.04060901.00000000' => { Name => 'HeaderByteCount', Format => 'int64u' },
+    '060e2b34.0101.0104.04060902.00000000' => { Name => 'IndexByteCount', Format => 'int64u' },
+  # '060e2b34.0101.0104.04061000.00000000' => { Name => 'GeneralDataCodingCharacteristics', Type => 'Node' },
+    '060e2b34.0101.0104.04061001.00000000' => { Name => 'PackLength', Format => 'int32u' },
+  # '060e2b34.0101.0104.04200102.00000000' => { Name => 'ImagerCharacteristics', Type => 'Node' },
+    '060e2b34.0101.0104.05010101.01000000' => { Name => 'IntegrationIndication', Type => 'UTF-16' },
+    '060e2b34.0101.0104.05010102.01000000' => { Name => 'EventIndication', Type => 'UTF-16' },
+    '060e2b34.0101.0104.05010107.01000000' => { Name => 'GraphicUsageKind', Type => 'UTF-16' },
+    '060e2b34.0101.0104.06010104.01080000' => { Name => 'PrimaryPackage', Type => 'WeakReference', Unknown => 1 },
+  # '060e2b34.0101.0104.06010104.02400000' => { Name => 'StrongReferencingToDescriptiveMetadataSets', Type => 'Node' },
+    '060e2b34.0101.0104.06010104.03030000' => { Name => 'DescriptiveMetadataSets', Type => 'WeakReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0104.06010104.04020000' => { Name => 'DescriptiveMetadataSetReferences', Type => 'WeakReferenceArray', Unknown => 1 },
+  # '060e2b34.0101.0104.06010104.05400000' => { Name => 'StrongReferencesToDescriptiveMetadataBatches', Type => 'Node' },
+    '060e2b34.0101.0104.06010104.060b0000' => { Name => 'FileDescriptors', Type => 'StrongReferenceArray', Unknown => 1 },
+    '060e2b34.0101.0104.06080102.01010000' => { Name => 'StreamPositionIndicator', Format => 'int16u' },
+    '060e2b34.0101.0104.06080102.01020000' => { Name => 'StreamPositionIndicator', Format => 'int32u' },
+    '060e2b34.0101.0104.06080102.01030000' => { Name => 'StreamPositionIndicator', Format => 'int64u' },
+    '060e2b34.0101.0104.06080202.01000000' => { Name => 'OffsetToMetadata', Format => 'int32s' },
+    '060e2b34.0101.0104.06080202.01010000' => { Name => 'OffsetToMetadata', Format => 'int64s' },
+    '060e2b34.0101.0104.06080202.02000000' => { Name => 'OffsetToIndexTable', Format => 'int32s' },
+    '060e2b34.0101.0104.06080202.02010000' => { Name => 'OffsetToIndexTable', Format => 'int64s' },
+  # '060e2b34.0101.0104.06090000.00000000' => { Name => 'DataRelationships', Type => 'Node' },
+  # '060e2b34.0101.0104.06090200.00000000' => { Name => 'LocalDataRelationships', Type => 'Node' },
+  # '060e2b34.0101.0104.06090201.00000000' => { Name => 'DataOffsets', Type => 'Node' },
+    '060e2b34.0101.0104.06090201.01000000' => { Name => 'ByteOffset', Format => 'int64u' },
+    '060e2b34.0101.0104.06090201.02000000' => { Name => 'ReversePlay', Format => 'int64u' },
+  # '060e2b34.0101.0104.06101000.00000000' => { Name => 'RelativeNumericalSequences', Type => 'Node' },
+    '060e2b34.0101.0104.06101001.00000000' => { Name => 'FirstNumberInSequence', Format => 'int32u' },
+    '060e2b34.0101.0104.06101001.01000000' => { Name => 'FirstNumberInSequence', Format => 'int64u' },
+    '060e2b34.0101.0104.06101002.00000000' => { Name => 'PreviousNumberInSequence', Format => 'int32u' },
+    '060e2b34.0101.0104.06101002.01000000' => { Name => 'PreviousNumberInSequence', Format => 'int64u' },
+    '060e2b34.0101.0104.06101003.00000000' => { Name => 'CurrentNumberInSequence', Format => 'int32u' },
+    '060e2b34.0101.0104.06101003.01000000' => { Name => 'CurrentNumberInSequence', Format => 'int64u' },
+    '060e2b34.0101.0104.06101004.00000000' => { Name => 'NextNumberInSequence', Format => 'int32u' },
+    '060e2b34.0101.0104.06101004.01000000' => { Name => 'NextNumberInSequence', Format => 'int64u' },
+    '060e2b34.0101.0104.06101005.00000000' => { Name => 'LastNumberInSequence', Format => 'int32u' },
+    '060e2b34.0101.0104.06101005.01000000' => { Name => 'LastNumberInSequence', Format => 'int64u' },
+  # '060e2b34.0101.0104.07012001.10000000' => { Name => 'ElectronicAddressVarieties', Type => 'Node' },
+    '060e2b34.0101.0104.07012001.10030400' => { Name => 'CentralTelephoneNumber', Format => 'string' },
+    '060e2b34.0101.0104.07012001.10030500' => { Name => 'MobileTelephoneNumber', Format => 'string' },
+    '060e2b34.0101.0104.07012001.10030600' => { Name => 'URL', Format => 'string' },
+    '060e2b34.0101.0104.07012002.02000000' => { Name => 'LocationDescription', Format => 'string' },
+    '060e2b34.0101.0104.07012002.02010000' => { Name => 'LocationDescription', Type => 'UTF-16' },
+    '060e2b34.0101.0104.07012002.03000000' => { Name => 'LocationKind', Format => 'string' },
+    '060e2b34.0101.0104.07012002.03010000' => { Name => 'LocationKind', Type => 'UTF-16' },
+    '060e2b34.0101.0104.07020102.07010100' => { Name => 'UTCEventStartDateTime', %timestamp },
+    '060e2b34.0101.0104.07020102.07020100' => { Name => 'LocalEventStartDateTime', %timestamp },
+    '060e2b34.0101.0104.07020102.09010100' => { Name => 'UTCEventEndDateTime', %timestamp },
+    '060e2b34.0101.0104.07020102.09020100' => { Name => 'LocalEventEndDateTime', %timestamp },
+    '060e2b34.0101.0104.07020103.01070000' => { Name => 'KeyTimePoint', Format => 'int64u' },
+    '060e2b34.0101.0104.07020108.01010000' => { Name => 'TimePeriodName', Type => 'UTF-16' },
+    '060e2b34.0101.0104.07020108.02000000' => { Name => 'SettingDateTime', %timestamp },
+  # '060e2b34.0101.0104.07020120.00000000' => { Name => 'AdministrativeDateTime', Type => 'Node' },
+    '060e2b34.0101.0104.07020120.01000000' => { Name => 'ContractDateTime', %timestamp },
+    '060e2b34.0101.0104.07020120.02000000' => { Name => 'RightsStartDateTime', %timestamp },
+    '060e2b34.0101.0104.07020120.03000000' => { Name => 'RightsStopDateTime', %timestamp },
+    '060e2b34.0101.0104.07020120.04000000' => { Name => 'PaymentDueDateTime', %timestamp },
+  # '060e2b34.0101.0105.01010500.00000000' => { Name => 'UMIDPicture', Type => 'Node' },
+  # '060e2b34.0101.0105.01010600.00000000' => { Name => 'UMIDMultiPicture', Type => 'Node' },
+  # '060e2b34.0101.0105.01010800.00000000' => { Name => 'UMIDSound', Type => 'Node' },
+  # '060e2b34.0101.0105.01010900.00000000' => { Name => 'UMIDMultiSound', Type => 'Node' },
+  # '060e2b34.0101.0105.01010b00.00000000' => { Name => 'UMIDSingleData', Type => 'Node' },
+  # '060e2b34.0101.0105.01010c00.00000000' => { Name => 'UMIDMultiData', Type => 'Node' },
+  # '060e2b34.0101.0105.01010d00.00000000' => { Name => 'UMIDMixed', Type => 'Node' },
+  # '060e2b34.0101.0105.01010f00.00000000' => { Name => 'UMIDGeneral', Type => 'Node' },
+    '060e2b34.0101.0105.01011508.00000000' => { Name => 'ClipID', Type => 'UMID' },
+    '060e2b34.0101.0105.01012008.01000000' => { Name => 'DeviceKind', Type => 'UTF-16' },
+    '060e2b34.0101.0105.0101200c.00000000' => { Name => 'DeviceAssetNumber', Format => 'string' },
+    '060e2b34.0101.0105.01020202.00000000' => { Name => 'IdentificationUL', Type => 'UL', Unknown => 1 },
+    '060e2b34.0101.0105.01020203.00000000' => { Name => 'OperationalPatternUL', Type => 'UL', Unknown => 1 },
+  # '060e2b34.0101.0105.01020210.02000000' => { Name => 'RegistryLocatorUnorderedGroups', Type => 'Node' },
+    '060e2b34.0101.0105.01020210.02010000' => { Name => 'EssenceContainers', Type => 'BatchOfUL', Unknown => 1 },
+    '060e2b34.0101.0105.01020210.02020000' => { Name => 'DescriptiveMetadataSchemes', Type => 'BatchOfUL', Unknown => 1 },
+    '060e2b34.0101.0105.01030108.00000000' => { Name => 'ProjectName', Format => 'string' },
+    '060e2b34.0101.0105.01030108.01000000' => { Name => 'ProjectName', Type => 'UTF-16' },
+    '060e2b34.0101.0105.01030602.00000000' => { Name => 'LocalTagValue', Format => 'int16u' },
+    '060e2b34.0101.0105.01030603.00000000' => { Name => 'LocalTagUniqueID', Type => 'AUID', Unknown => 1 },
+    '060e2b34.0101.0105.01050d00.00000000' => { Name => 'BrandMainTitle', Format => 'string' },
+    '060e2b34.0101.0105.01050d01.00000000' => { Name => 'BrandMainTitle', Type => 'UTF-16' },
+    '060e2b34.0101.0105.01050e00.00000000' => { Name => 'BrandOriginalTitle', Format => 'string' },
+    '060e2b34.0101.0105.01050e01.00000000' => { Name => 'BrandOriginalTitle', Type => 'UTF-16' },
+    '060e2b34.0101.0105.01050f00.00000000' => { Name => 'FrameworkTitle', Format => 'string' },
+    '060e2b34.0101.0105.01050f01.00000000' => { Name => 'FrameworkTitle', Type => 'UTF-16' },
+    '060e2b34.0101.0105.01070106.00000000' => { Name => 'SourceTrackIDs', Format => 'int32u' },
+    '060e2b34.0101.0105.01070107.00000000' => { Name => 'ShotTrackIDs', Format => 'int32u' },
+    '060e2b34.0101.0105.02020301.00000000' => { Name => 'ProgrammingGroupKind', Type => 'UTF-16' },
+    '060e2b34.0101.0105.02020600.00000000' => { Name => 'ProgrammingGroupTitle', Format => 'string' },
+    '060e2b34.0101.0105.02020601.00000000' => { Name => 'ProgrammingGroupTitle', Type => 'UTF-16' },
+    '060e2b34.0101.0105.020a0101.00000000' => { Name => 'IdentifierIssuingAuthority', Type => 'UTF-16' },
+    '060e2b34.0101.0105.02300603.010a0000' => { Name => 'LinkingName', Format => 'string' },
+    '060e2b34.0101.0105.02300603.010a0100' => { Name => 'LinkingName', Type => 'UTF-16' },
+    '060e2b34.0101.0105.02300603.010b0000' => { Name => 'NameSuffix', Format => 'string' },
+    '060e2b34.0101.0105.02300603.010b0100' => { Name => 'NameSuffix', Type => 'UTF-16' },
+    '060e2b34.0101.0105.02300603.010c0000' => { Name => 'FormerFamilyName', Format => 'string' },
+    '060e2b34.0101.0105.02300603.010c0100' => { Name => 'FormerFamilyName', Type => 'UTF-16' },
+    '060e2b34.0101.0105.02300603.010d0000' => { Name => 'Nationality', Format => 'string' },
+    '060e2b34.0101.0105.02300603.010d0100' => { Name => 'Nationality', Type => 'UTF-16' },
+    '060e2b34.0101.0105.02300603.010e0000' => { Name => 'Citizenship', Format => 'string' },
+    '060e2b34.0101.0105.02300603.010e0100' => { Name => 'Citizenship', Type => 'UTF-16' },
+    '060e2b34.0101.0105.03010102.02030000' => { Name => 'FrameworkTextLanguageCode', Format => 'string', LanguageCode => 1 },
+    '060e2b34.0101.0105.03010201.09000000' => { Name => 'KAGSize', Format => 'int32u' },
+    '060e2b34.0101.0105.03010201.0a000000' => { Name => 'ReversedByteOrder', Type => 'Boolean' },
+  # '060e2b34.0101.0105.0301020a.00000000' => { Name => 'NameValueConstructInterpretations', Type => 'Node' },
+    '060e2b34.0101.0105.0301020a.01000000' => { Name => 'ItemName', Format => 'string' },
+    '060e2b34.0101.0105.0301020a.01010000' => { Name => 'ItemName', Type => 'UTF-16' },
+    '060e2b34.0101.0105.0301020a.02000000' => { Name => 'ItemValue', Format => 'string' },
+    '060e2b34.0101.0105.0301020a.02010000' => { Name => 'ItemValue', Type => 'UTF-16' },
+  # '060e2b34.0101.0105.03010220.00000000' => { Name => 'XMLConstructsAndInterpretations', Type => 'Node' },
+    '060e2b34.0101.0105.03010220.01000000' => { Name => 'XMLDocumentText', Type => 'Indirect', Unknown => 1 },
+    '060e2b34.0101.0105.03010220.01010000' => { Name => 'XMLDocumentText', Format => 'string' },
+    '060e2b34.0101.0105.03010220.01020000' => { Name => 'XMLDocumentText', Type => 'UTF-16' },
+    '060e2b34.0101.0105.03010220.01030000' => { Name => 'XMLDocumentText', Type => 'ByteStream', Unknown => 1 },
+    '060e2b34.0101.0105.03020102.15000000' => { Name => 'FrameworkThesaurusName', Format => 'string' },
+    '060e2b34.0101.0105.03020102.15010000' => { Name => 'FrameworkThesaurusName', Type => 'UTF-16' },
+    '060e2b34.0101.0105.03020106.08000000' => { Name => 'GroupSynopsis', Format => 'string' },
+    '060e2b34.0101.0105.03020106.08010000' => { Name => 'GroupSynopsis', Type => 'UTF-16' },
+    '060e2b34.0101.0105.03020106.09000000' => { Name => 'AnnotationSynopsis', Format => 'string' },
+    '060e2b34.0101.0105.03020106.09010000' => { Name => 'AnnotationSynopsis', Type => 'UTF-16' },
+    '060e2b34.0101.0105.03020106.0a000000' => { Name => 'AnnotationDescription', Format => 'string' },
+    '060e2b34.0101.0105.03020106.0a010000' => { Name => 'AnnotationDescription', Type => 'UTF-16' },
+    '060e2b34.0101.0105.03020106.0b000000' => { Name => 'ScriptingKind', Format => 'string' },
+    '060e2b34.0101.0105.03020106.0b010000' => { Name => 'ScriptingKind', Type => 'UTF-16' },
+    '060e2b34.0101.0105.03020106.0c000000' => { Name => 'ScriptingText', Format => 'string' },
+    '060e2b34.0101.0105.03020106.0c010000' => { Name => 'ScriptingText', Type => 'UTF-16' },
+    '060e2b34.0101.0105.03020106.0d000000' => { Name => 'ShotDescription', Format => 'string' },
+    '060e2b34.0101.0105.03020106.0d010000' => { Name => 'ShotDescription', Type => 'UTF-16' },
+    '060e2b34.0101.0105.03020106.0e000000' => { Name => 'AnnotationKind', Format => 'string' },
+    '060e2b34.0101.0105.03020106.0e010000' => { Name => 'AnnotationKind', Type => 'UTF-16' },
+    '060e2b34.0101.0105.03020106.0f000000' => { Name => 'RelatedMaterialDescription', Format => 'string' },
+    '060e2b34.0101.0105.03020106.0f010000' => { Name => 'RelatedMaterialDescription', Type => 'UTF-16' },
+    '060e2b34.0101.0105.03020504.00000000' => { Name => 'ClipKind', Type => 'UTF-16' },
+  # '060e2b34.0101.0105.03030310.00000000' => { Name => 'DeviceCommentsAndDescriptions', Type => 'Node' },
+    '060e2b34.0101.0105.03030310.01000000' => { Name => 'DeviceUsageDescription', Format => 'string' },
+    '060e2b34.0101.0105.03030310.01010000' => { Name => 'DeviceUsageDescription', Type => 'UTF-16' },
+    '060e2b34.0101.0105.04010302.07000000' => { Name => 'DisplayF2Offset', Format => 'int32s' },
+    '060e2b34.0101.0105.04010302.08000000' => { Name => 'StoredF2Offset', Format => 'int32s' },
+    '060e2b34.0101.0105.04010302.09000000' => { Name => 'ActiveFormatDescriptor', Format => 'int8u' },
+    '060e2b34.0101.0105.04010302.0a000000' => { Name => 'LineNumber', Format => 'int32u' },
+  # '060e2b34.0101.0105.04010404.00000000' => { Name => 'VideoScanningCharacteristics', Type => 'Node' },
+    '060e2b34.0101.0105.04010404.01000000' => { Name => 'ScanningDirection', Format => 'int8u' },
+    '060e2b34.0101.0105.04010503.0b000000' => { Name => 'ComponentMaximumRef', Format => 'int32u' },
+    '060e2b34.0101.0105.04010503.0c000000' => { Name => 'ComponentMinimumRef', Format => 'int32u' },
+    '060e2b34.0101.0105.04010503.0d000000' => { Name => 'AlphaMaximumRef', Format => 'int32u' },
+    '060e2b34.0101.0105.04010503.0e000000' => { Name => 'AlphaMinimumRef', Format => 'int32u' },
+  # '060e2b34.0101.0105.04010504.00000000' => { Name => 'DigitalVideoAndImageSignalTypeIdentifiers', Type => 'Node' },
+    '060e2b34.0101.0105.04010504.01000000' => { Name => 'VideoPayloadIdentifier', Format => 'int8u' },
+    '060e2b34.0101.0105.04010504.02000000' => { Name => 'VideoPayloadIdentifier2002', Format => 'int8u' },
+    '060e2b34.0101.0105.04010602.01020000' => { Name => 'SingleSequenceFlag', Type => 'Boolean' },
+    '060e2b34.0101.0105.04010602.01030000' => { Name => 'ConstantBPictureFlag', Type => 'Boolean' },
+    '060e2b34.0101.0105.04010602.01040000' => { Name => 'CodedContentScanningKind', Type => 'int8u',
+        PrintConv => { 0 => 'Unknown', 1 => 'Progressive', 2 => 'Interlaced', 3 => 'Mixed' },
+    },
+    '060e2b34.0101.0105.04010602.01050000' => { Name => 'LowDelayIndicator', Type => 'Boolean' },
+    '060e2b34.0101.0105.04010602.01060000' => { Name => 'ClosedGOPIndicator', Type => 'Boolean' },
+    '060e2b34.0101.0105.04010602.01070000' => { Name => 'IdenticalGOPIndicator', Type => 'Boolean' },
+    '060e2b34.0101.0105.04010602.01080000' => { Name => 'MaximumGOPSize', Format => 'int16u' },
+    '060e2b34.0101.0105.04010602.01090000' => { Name => 'MaximumBPictureCount', Format => 'int16u' },
+    '060e2b34.0101.0105.04010602.010a0000' => { Name => 'ProfileAndLevel', Format => 'int8u' },
+    '060e2b34.0101.0105.04010602.010b0000' => { Name => 'Bitrate', Format => 'int32u', PrintConv => 'ConvertBitrate($val)' },
+    '060e2b34.0101.0105.04020101.04000000' => { Name => 'ChannelCount', Format => 'int32u', Groups => { 2 => 'Audio' } },
+    '060e2b34.0101.0105.04020301.01010000' => { Name => 'AudioSampleRate', Format => 'rational64s', Groups => { 2 => 'Audio' } },
+    '060e2b34.0101.0105.04020301.05000000' => { Name => 'PeakEnvelope', Format => 'int8u', Groups => { 2 => 'Audio' } },
+    '060e2b34.0101.0105.04020301.0e000000' => { Name => 'PeakEnvelopeData', Type => 'Stream', Unknown => 1, Groups => { 2 => 'Audio' } },
+    '060e2b34.0101.0105.04020302.01000000' => { Name => 'BlockAlign', Format => 'int16u' },
+    '060e2b34.0101.0105.04020302.02000000' => { Name => 'SequenceOffset', Format => 'int8u' },
+    '060e2b34.0101.0105.04020302.03000000' => { Name => 'BlockStartOffset', Format => 'int16u' },
+    '060e2b34.0101.0105.04020302.05000000' => { Name => 'FileSecurityReport', Format => 'int32u' },
+    '060e2b34.0101.0105.04020302.06000000' => { Name => 'FileSecurityWave', Format => 'int32u' },
+    '060e2b34.0101.0105.04020303.05000000' => { Name => 'AverageBytesPerSecond', Format => 'int32u', Groups => { 2 => 'Audio' } },
+  # '060e2b34.0101.0105.04020500.00000000' => { Name => 'DigitalAudioProcessingParameters', Type => 'Node' },
+  # '060e2b34.0101.0105.04020501.00000000' => { Name => 'AES-3ProcessingParameters', Type => 'Node' },
+    '060e2b34.0101.0105.04020501.01000000' => { Name => 'AuxiliaryBitsMode', Format => 'int8u' },
+    '060e2b34.0101.0105.04020501.02000000' => { Name => 'ChannelStatusMode', Format => 'undef',
+        RawConv => 'length($val) > 8 ? join(" ",unpack("x8C*",$val)) : undef',
+        # convert just the first value for now
+        PrintConv => [{
+            0 => 'No Channel Status Data',
+            1 => 'AES3 Minimum',
+            2 => 'AES3 Standard',
+            3 => 'Fixed 24 Bytes in FixedChannelStatusData',
+            4 => 'Stream of Data in MXF Header Metadata',
+            5 => 'Stream of Data Multiplexed within MXF Body',
+        }],
+    },
+    '060e2b34.0101.0105.04020501.03000000' => { Name => 'FixedChannelStatusData', Type => 'Array of bytes', Unknown => 1 },
+    '060e2b34.0101.0105.04020501.04000000' => { Name => 'UserDataMode', Type => 'EnumeratedArray', Unknown => 1 },
+    '060e2b34.0101.0105.04020501.05000000' => { Name => 'FixedUserData', Type => 'Array of bytes', Unknown => 1 },
+    '060e2b34.0101.0105.04020501.06000000' => { Name => 'Emphasis', Format => 'int8u' },
+  # '060e2b34.0101.0105.04020502.00000000' => { Name => 'BWFProcessingParameters', Type => 'Node' },
+    '060e2b34.0101.0105.04020502.01000000' => { Name => 'BextCodingHistory', Format => 'string' },
+    '060e2b34.0101.0105.04020502.01010000' => { Name => 'BextCodingHistory', Type => 'UTF-16' },
+    '060e2b34.0101.0105.04020502.02000000' => { Name => 'QltyBasicData', Format => 'string' },
+    '060e2b34.0101.0105.04020502.02010000' => { Name => 'QltyBasicData', Type => 'UTF-16' },
+    '060e2b34.0101.0105.04020502.03000000' => { Name => 'QltyStartOfModulation', Format => 'string' },
+    '060e2b34.0101.0105.04020502.03010000' => { Name => 'QltyStartOfModulation', Type => 'UTF-16' },
+    '060e2b34.0101.0105.04020502.04000000' => { Name => 'QltyQualityEvent', Format => 'string' },
+    '060e2b34.0101.0105.04020502.04010000' => { Name => 'QltyQualityEvent', Type => 'UTF-16' },
+    '060e2b34.0101.0105.04020502.05000000' => { Name => 'QltyEndOfModulation', Format => 'string' },
+    '060e2b34.0101.0105.04020502.05010000' => { Name => 'QltyEndOfModulation', Type => 'UTF-16' },
+    '060e2b34.0101.0105.04020502.06000000' => { Name => 'QltyQualityParameter', Format => 'string' },
+    '060e2b34.0101.0105.04020502.06010000' => { Name => 'QltyQualityParameter', Type => 'UTF-16' },
+    '060e2b34.0101.0105.04020502.07000000' => { Name => 'QltyOperatorComment', Format => 'string' },
+    '060e2b34.0101.0105.04020502.07010000' => { Name => 'QltyOperatorComment', Type => 'UTF-16' },
+    '060e2b34.0101.0105.04020502.08000000' => { Name => 'QltyCueSheet', Format => 'string' },
+    '060e2b34.0101.0105.04020502.08010000' => { Name => 'QltyCueSheet', Type => 'UTF-16' },
+  # '060e2b34.0101.0105.04020700.00000000' => { Name => 'GeneralProcessingParameters', Type => 'Node' },
+    '060e2b34.0101.0105.04020701.00000000' => { Name => 'DialNorm', Format => 'int8s' },
+    '060e2b34.0101.0105.04030302.00000000' => { Name => 'DataEssenceCoding', Type => 'Label' },
+  # '060e2b34.0101.0105.04040102.00000000' => { Name => 'GeneralDateTimeCodingCharacteristics', Type => 'Node' },
+    '060e2b34.0101.0105.04040102.01000000' => { Name => 'DateTimeRate', Format => 'rational64s', Groups => { 2 => 'Time' } },
+    '060e2b34.0101.0105.04040102.02000000' => { Name => 'DateTimeDropFrameFlag', Type => 'Boolean', Groups => { 2 => 'Time' } },
+    '060e2b34.0101.0105.04040102.03000000' => { Name => 'DateTimeEmbeddedFlag', Type => 'Boolean', Groups => { 2 => 'Time' } },
+    '060e2b34.0101.0105.04040102.04000000' => { Name => 'DateTimeKind', Type => 'UL', Unknown => 1, Groups => { 2 => 'Time' } },
+    '060e2b34.0101.0105.04040401.06000000' => { Name => 'DeltaEntryArray', Type => 'ArrayOfDeltaEntry', Unknown => 1 },
+    '060e2b34.0101.0105.04040401.07000000' => { Name => 'PositionTableCount', Format => 'int8u' },
+    '060e2b34.0101.0105.04040401.08000000' => { Name => 'PositionTable', Type => 'ArrayOfRational', Unknown => 1 },
+    '060e2b34.0101.0105.04040402.05000000' => { Name => 'IndexEntryArray', Type => 'ArrayOfIndexEntry', Unknown => 1 },
+    '060e2b34.0101.0105.04050113.00000000' => { Name => 'SignalStandard', Format => 'int8u' },
+    '060e2b34.0101.0105.04070101.00000000' => { Name => 'DataDefinition', Type => 'UL', Unknown => 1 },
+  # '060e2b34.0101.0105.04090000.00000000' => { Name => 'FormatCharacteristics', Type => 'Node' },
+    '060e2b34.0101.0105.04090100.00000000' => { Name => 'RecordedFormat', Format => 'string' },
+    '060e2b34.0101.0105.05010302.01000000' => { Name => 'GenerationCopyNumber', Format => 'int16u' },
+    '060e2b34.0101.0105.05010303.01000000' => { Name => 'GenerationCloneNumber', Format => 'int16u' },
+  # '060e2b34.0101.0105.05010400.00000000' => { Name => 'MusicFlags', Type => 'Node' },
+    '060e2b34.0101.0105.05010403.00000000' => { Name => 'ThemeMusicFlag', Type => 'Boolean' },
+    '060e2b34.0101.0105.05010404.00000000' => { Name => 'InsertMusicFlag', Type => 'Boolean' },
+    '060e2b34.0101.0105.05300406.00000000' => { Name => 'IndexEditRate', Format => 'rational64s' },
+    '060e2b34.0101.0105.06010103.05000000' => { Name => 'LinkedTrackID', Format => 'int32u' },
+    '060e2b34.0101.0105.06010104.01020100' => { Name => 'EssenceContainerFormat', Type => 'UL', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.01030100' => { Name => 'CodecDefinition', Type => 'UL', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.020c0000' => { Name => 'DescriptiveMetadataFramework', Type => 'StrongReference', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.02400500' => { Name => 'GroupSet', Type => 'StrongReference', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.02401c00' => { Name => 'BankDetailsSet', Type => 'StrongReference', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.02401d00' => { Name => 'ImageFormatSet', Type => 'StrongReference', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.02402000' => { Name => 'ProcessingSet', Type => 'StrongReference', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.02402100' => { Name => 'ProjectSet', Type => 'StrongReference', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.02402200' => { Name => 'ContactsListSet', Type => 'StrongReference', Unknown => 1 },
+  # '060e2b34.0101.0105.06010104.02402300' => { Name => 'CueWordsSets', Type => 'Node' },
+    '060e2b34.0101.0105.06010104.02402301' => { Name => 'AnnotationCueWordsSet', Type => 'StrongReference', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.02402302' => { Name => 'ShotCueWordsSet', Type => 'StrongReference', Unknown => 1 },
+  # '060e2b34.0101.0105.06010104.03400000' => { Name => 'WeakReferencingToDescriptiveMetadataSets', Type => 'Node' },
+  # '060e2b34.0101.0105.06010104.03401300' => { Name => 'ParticipantRoleSets', Type => 'Node' },
+    '060e2b34.0101.0105.06010104.03401301' => { Name => 'AwardParticipantSets', Type => 'GlobalReferenceBatch (Participant)', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.03401302' => { Name => 'ContractParticipantSets', Type => 'GlobalReferenceBatch (Participant)', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.03401400' => { Name => 'PersonSets', Type => 'GlobalReferenceBatch (Participant)', Unknown => 1 },
+  # '060e2b34.0101.0105.06010104.03401500' => { Name => 'OrganizationSets', Type => 'Node' },
+    '060e2b34.0101.0105.06010104.03401501' => { Name => 'ParticipantOrganizationSets', Type => 'GlobalReferenceBatch (Organisation)', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.03401502' => { Name => 'PersonOrganizationSets', Type => 'GlobalReferenceBatch (Organisation)', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.03401600' => { Name => 'LocationSets', Type => 'GlobalReferenceBatch (Location)', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.05400400' => { Name => 'TitlesSets', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.05400500' => { Name => 'GroupSets', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.05400600' => { Name => 'IdentificationSets', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.05400700' => { Name => 'EpisodicItemSets', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.05400800' => { Name => 'BrandingSets', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.05400900' => { Name => 'EventSets', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.05400a00' => { Name => 'PublicationSets', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.05400b00' => { Name => 'AwardSets', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.05400c00' => { Name => 'CaptionDescriptionSets', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.05400d00' => { Name => 'AnnotationSets', Type => 'StrongReferenceBatch', Unknown => 1 },
+  # '060e2b34.0101.0105.06010104.05400e00' => { Name => 'SettingPeriodSets', Type => 'Node' },
+    '060e2b34.0101.0105.06010104.05400e01' => { Name => 'ProductionSettingPeriodSets', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.05400e02' => { Name => 'SceneSettingPeriodSets', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.05400f00' => { Name => 'ScriptingSets', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.05401000' => { Name => 'ClassificationSets', Type => 'StrongReferenceBatch', Unknown => 1 },
+  # '060e2b34.0101.0105.06010104.05401100' => { Name => 'ShotSets', Type => 'Node' },
+    '060e2b34.0101.0105.06010104.05401101' => { Name => 'SceneShotSets', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.05401102' => { Name => 'ClipShotSets', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.05401200' => { Name => 'KeyPointSets', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.05401300' => { Name => 'ShotParticipantRoleSets', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.05401400' => { Name => 'ShotPersonSets', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.05401500' => { Name => 'OrganizationSets', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.05401600' => { Name => 'ShotLocationSets', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.05401700' => { Name => 'AddressSets', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.05401800' => { Name => 'CommunicationSets', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.05401900' => { Name => 'ContractSets', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.05401a00' => { Name => 'RightsSets', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.05401b00' => { Name => 'PaymentsSets', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.05401e00' => { Name => 'DeviceParametersSets', Type => 'StrongReferenceBatch', Unknown => 1 },
+  # '060e2b34.0101.0105.06010104.05401f00' => { Name => 'NameValueSets', Type => 'Node' },
+    '060e2b34.0101.0105.06010104.05401f01' => { Name => 'ClassificationNameValueSets', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.05401f02' => { Name => 'ContactNameValueSets', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.05401f03' => { Name => 'DeviceParameterNameValueSets', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.060c0000' => { Name => 'MetadataServerLocators', Type => 'StrongReferenceArray', Unknown => 1 },
+    '060e2b34.0101.0105.06010104.060d0000' => { Name => 'RelatedMaterialLocators', Type => 'StrongReferenceArray', Unknown => 1 },
+    '060e2b34.0101.0105.06010107.15000000' => { Name => 'LocalTagEntries', Type => 'LocalTagEntryBatch', Unknown => 1 },
+    '060e2b34.0101.0105.06100400.00000000' => { Name => 'TotalNumberInSequence', Format => 'int32u' },
+    '060e2b34.0101.0105.07012001.04011100' => { Name => 'RoomOrSuiteName', Format => 'string' },
+    '060e2b34.0101.0105.07012001.04011101' => { Name => 'RoomOrSuiteName', Type => 'UTF-16' },
+    '060e2b34.0101.0105.07012001.04011200' => { Name => 'BuildingName', Format => 'string' },
+    '060e2b34.0101.0105.07012001.04011201' => { Name => 'BuildingName', Type => 'UTF-16' },
+    '060e2b34.0101.0105.07012001.10030601' => { Name => 'URL', Type => 'UTF-16' },
+  # '060e2b34.0101.0105.07020102.07100000' => { Name => 'DefinedEventStartTrueDateTime', Type => 'Node' },
+    '060e2b34.0101.0105.07020102.07100100' => { Name => 'LocalFestivalDateTime', Format => 'string', Groups => { 2 => 'Time' } },
+    '060e2b34.0101.0105.07020103.01090000' => { Name => 'ShotStartPosition', Type => 'Position', %duration },
+    '060e2b34.0101.0105.07020103.010a0000' => { Name => 'IndexingStartPosition', Type => 'Position', %duration },
+    '060e2b34.0101.0105.07020103.010b0000' => { Name => 'EventOrigin', Type => 'Position', %duration },
+    '060e2b34.0101.0105.07020108.03000000' => { Name => 'SettingPeriodDescription', Format => 'string' },
+    '060e2b34.0101.0105.07020108.03010000' => { Name => 'SettingPeriodDescription', Type => 'UTF-16' },
+    '060e2b34.0101.0105.07020201.01020000' => { Name => 'IndexDuration', Type => 'Length', %duration },
+    '060e2b34.0101.0105.07020201.02040000' => { Name => 'ShotDuration', Type => 'Length', %duration },
+  # '060e2b34.0101.0105.0d020000.00000000' => { Name => 'EBU_UER', Type => 'Node' },
+  # '060e2b34.0101.0105.0d030000.00000000' => { Name => 'Pro-MPEGForum', Type => 'Node' },
+  # '060e2b34.0101.0106.0e040000.00000000' => { Name => 'Avid', Type => 'Node' },
+  # '060e2b34.0101.0106.0e050000.00000000' => { Name => 'CNN', Type => 'Node' },
+  # '060e2b34.0101.0106.0e050100.00000000' => { Name => 'CNNMediaIdentifiers', Type => 'Node' },
+  # '060e2b34.0101.0106.0e050101.00000000' => { Name => 'CNNLegacyMediaIdentifiers', Type => 'Node' },
+  # '060e2b34.0101.0106.0e050200.00000000' => { Name => 'CNNAttributes', Type => 'Node' },
+  # '060e2b34.0101.0106.0e050201.00000000' => { Name => 'CNNRelationalAttributes', Type => 'Node' },
+  # '060e2b34.0101.0106.0e050202.00000000' => { Name => 'CNNInformationAttributes', Type => 'Node' },
+  # '060e2b34.0101.0106.0e050300.00000000' => { Name => 'CNNMetadataSets', Type => 'Node' },
+  # '060e2b34.0101.0106.0e060000.00000000' => { Name => 'Sony', Type => 'Node' },
+    '060e2b34.0101.0107.01011509.00000000' => { Name => 'ExtendedClipID', Type => 'UMID' },
+    '060e2b34.0101.0107.0101150a.00000000' => { Name => 'ClipIDArray', Type => 'UMID Array', Unknown => 1 },
+    '060e2b34.0101.0107.0101150b.00000000' => { Name => 'ExtendedClipIDArray', Type => 'UMID Array', Unknown => 1 },
+    '060e2b34.0101.0107.01040104.00000000' => { Name => 'TrackNumberBatch', Format => 'int32u' },
+    '060e2b34.0101.0107.03010102.02110000' => { Name => 'ExtendedTextLanguageCode', Format => 'string', LanguageCode => 1 },
+    '060e2b34.0101.0107.03010102.02120000' => { Name => 'ExtendedCaptionsLanguageCode', Format => 'string' },
+    '060e2b34.0101.0107.03010102.02130000' => { Name => 'FrameworkExtendedTextLanguageCode', Format => 'string', LanguageCode => 1 },
+    '060e2b34.0101.0107.03010102.03110000' => { Name => 'PrimaryExtendedSpokenLanguageCode', Format => 'string' },
+    '060e2b34.0101.0107.03010102.03120000' => { Name => 'SecondaryExtendedSpokenLanguageCode', Format => 'string' },
+    '060e2b34.0101.0107.03010102.03130000' => { Name => 'OriginalExtendedSpokenPrimaryLanguageCode', Format => 'string' },
+    '060e2b34.0101.0107.03010102.03140000' => { Name => 'SecondaryOriginalExtendedSpokenLanguageCode', Format => 'string' },
+    '060e2b34.0101.0107.03010210.06000000' => { Name => 'KLVMetadataSequence', Type => 'Sequence of KLV packets', Unknown => 1 },
+    '060e2b34.0101.0107.03010210.07000000' => { Name => 'PackageAttributes', Type => 'StrongReferenceArray', Unknown => 1 },
+    '060e2b34.0101.0107.03010210.08000000' => { Name => 'ComponentAttributes', Type => 'StrongReferenceArray', Unknown => 1 },
+  # '060e2b34.0101.0107.03010220.02000000' => { Name => 'XMLBiMConstructsInMultipleStreams', Type => 'Node' },
+  # '060e2b34.0101.0107.03010220.02010000' => { Name => 'MPEG7BiMDecoderInitFrames', Type => 'Node' },
+    '060e2b34.0101.0107.03010220.02010100' => { Name => 'MPEG7BiMDecoderInitFrame1', Type => 'ByteStream', Unknown => 1 },
+    '060e2b34.0101.0107.03010220.02010200' => { Name => 'MPEG7BiMDecoderInitFrame2', Type => 'ByteStream', Unknown => 1 },
+    '060e2b34.0101.0107.03010220.02010300' => { Name => 'MPEG7BiMDecoderInitFrame3', Type => 'ByteStream', Unknown => 1 },
+    '060e2b34.0101.0107.03010220.02010400' => { Name => 'MPEG7BiMDecoderInitFrame4', Type => 'ByteStream', Unknown => 1 },
+    '060e2b34.0101.0107.03010220.02010500' => { Name => 'MPEG7BiMDecoderInitFrame5', Type => 'ByteStream', Unknown => 1 },
+    '060e2b34.0101.0107.03010220.02010600' => { Name => 'MPEG7BiMDecoderInitFrame6', Type => 'ByteStream', Unknown => 1 },
+    '060e2b34.0101.0107.03010220.02010700' => { Name => 'MPEG7BiMDecoderInitFrame7', Type => 'ByteStream', Unknown => 1 },
+    '060e2b34.0101.0107.03010220.02010800' => { Name => 'MPEG7BiMDecoderInitFrame8', Type => 'ByteStream', Unknown => 1 },
+  # '060e2b34.0101.0107.03010220.02020000' => { Name => 'MPEG7BiMAccessUnitFrames', Type => 'Node' },
+    '060e2b34.0101.0107.03010220.02020100' => { Name => 'MPEG7BiMAccessUnitFrame1', Type => 'ByteStream', Unknown => 1 },
+    '060e2b34.0101.0107.03010220.02020200' => { Name => 'MPEG7BiMAccessUnitFrame2', Type => 'ByteStream', Unknown => 1 },
+    '060e2b34.0101.0107.03010220.02020300' => { Name => 'MPEG7BiMAccessUnitFrame3', Type => 'ByteStream', Unknown => 1 },
+    '060e2b34.0101.0107.03010220.02020400' => { Name => 'MPEG7BiMAccessUnitFrame4', Type => 'ByteStream', Unknown => 1 },
+    '060e2b34.0101.0107.03010220.02020500' => { Name => 'MPEG7BiMAccessUnitFrame5', Type => 'ByteStream', Unknown => 1 },
+    '060e2b34.0101.0107.03010220.02020600' => { Name => 'MPEG7BiMAccessUnitFrame6', Type => 'ByteStream', Unknown => 1 },
+    '060e2b34.0101.0107.03010220.02020700' => { Name => 'MPEG7BiMAccessUnitFrame7', Type => 'ByteStream', Unknown => 1 },
+    '060e2b34.0101.0107.03010220.02020800' => { Name => 'MPEG7BiMAccessUnitFrame8', Type => 'ByteStream', Unknown => 1 },
+    '060e2b34.0101.0107.03020102.16000000' => { Name => 'ComponentUserComments', Type => 'StrongReferenceArray', Unknown => 1 },
+    '060e2b34.0101.0107.03020501.01000000' => { Name => 'ShotCommentKind', Type => 'UTF-16' },
+    '060e2b34.0101.0107.03020502.01000000' => { Name => 'ShotComment', Type => 'UTF-16' },
+  # '060e2b34.0101.0107.04010202.00000000' => { Name => 'SensorParameters', Type => 'Node' },
+    '060e2b34.0101.0107.04010202.01000000' => { Name => 'SensorMode', Format => 'string' },
+    '060e2b34.0101.0107.04020101.05000000' => { Name => 'ChannelAssignment', Type => 'UL', Unknown => 1 },
+    '060e2b34.0101.0107.04040402.06000000' => { Name => 'ContentPackageIndexArray', Type => 'ArrayOfIndexEntry', Unknown => 1 },
+  # '060e2b34.0101.0107.04040403.00000000' => { Name => 'VideoIndexParameters', Type => 'Node' },
+    '060e2b34.0101.0107.04040403.01000000' => { Name => 'VideoIndexArray', Type => 'Array of bytes', Unknown => 1 },
+    '060e2b34.0101.0107.04060202.00000000' => { Name => 'ApproximateImageContainerSize', Format => 'int32u' },
+    '060e2b34.0101.0107.04060801.00000000' => { Name => 'MetadataEncodingSchemeCode', Format => 'string' },
+    '060e2b34.0101.0107.04090200.00000000' => { Name => 'MIMEMediaType', Format => 'string' },
+    '060e2b34.0101.0107.04090201.00000000' => { Name => 'MIMEMediaType', Type => 'UTF-16' },
+    '060e2b34.0101.0107.04200201.010a0100' => { Name => 'FieldOfViewVerticalFP', Format => 'float' },
+    '060e2b34.0101.0107.05010108.00000000' => { Name => 'PackageUsageKind', Type => 'AUID', Unknown => 1 },
+    '060e2b34.0101.0107.06010103.06000000' => { Name => 'ChannelID', Format => 'int32u' },
+    '060e2b34.0101.0107.06010103.07000000' => { Name => 'ChannelIDs', Format => 'int32u' },
+    '060e2b34.0101.0107.06010104.01090000' => { Name => 'KLVDataType', Type => 'WeakReference', Unknown => 1 },
+    '060e2b34.0101.0107.06010104.03040000' => { Name => 'KLVDataParentProperties', Type => 'WeakReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0107.06010104.03050000' => { Name => 'TaggedValueParentProperties', Type => 'WeakReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0107.06010104.03401303' => { Name => 'AnnotationParticipantSets', Type => 'GlobalReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0107.06010104.050a0000' => { Name => 'KLVDataDefinitions', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0107.06010104.050b0000' => { Name => 'TaggedValueDefinitions', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0107.06010104.05401f04' => { Name => 'AddressNameValueSets', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0107.07010201.02300000' => { Name => 'NMEADocumentText', Format => 'string' },
+    '060e2b34.0101.0107.07011001.04000000' => { Name => 'PlatformRollAngle', Format => 'float' },
+    '060e2b34.0101.0107.07011001.05000000' => { Name => 'PlatformPitchAngle', Format => 'float' },
+    '060e2b34.0101.0107.07011001.06000000' => { Name => 'PlatformHeadingAngle', Format => 'float' },
+    '060e2b34.0101.0107.07012001.04011300' => { Name => 'AddressLine', Format => 'string' },
+    '060e2b34.0101.0107.07012001.04011301' => { Name => 'AddressLine', Type => 'UTF-16' },
+    '060e2b34.0101.0107.07012001.04011400' => { Name => 'PlaceName', Format => 'string' },
+    '060e2b34.0101.0107.07012001.04011401' => { Name => 'PlaceName', Type => 'UTF-16' },
+    '060e2b34.0101.0107.07012001.04011500' => { Name => 'GeographicalCoordinates', Type => '12-byte Spatial Coordinate', Unknown => 1 },
+    '060e2b34.0101.0107.07012001.04011600' => { Name => 'AstronomicalBodyName', Format => 'string' },
+    '060e2b34.0101.0107.07012001.04011601' => { Name => 'AstronomicalBodyName', Type => 'UTF-16' },
+    '060e2b34.0101.0107.07020102.08020000' => { Name => 'TimecodeArray', Type => 'Array of timecodes', Unknown => 1 },
+    '060e2b34.0101.0107.07020103.010c0000' => { Name => 'MarkIn', Type => 'Position', %duration },
+    '060e2b34.0101.0107.07020103.010d0000' => { Name => 'UserPosition', Type => 'Position', %duration },
+    '060e2b34.0101.0107.07020103.02030000' => { Name => 'MarkOut', Type => 'Position', %duration },
+    '060e2b34.0101.0107.07020110.01040000' => { Name => 'ClipCreationDateTime', %timestamp },
+    '060e2b34.0101.0107.07020201.02050000' => { Name => 'VideoClipDuration', Format => 'int32u' },
+  # '060e2b34.0101.0107.0d040000.00000000' => { Name => 'BBC', Type => 'Node' },
+  # '060e2b34.0101.0107.0d050000.00000000' => { Name => 'IRT', Type => 'Node' },
+  # '060e2b34.0101.0107.0e070000.00000000' => { Name => 'IdeasUnlimitedTV', Type => 'Node' },
+  # '060e2b34.0101.0107.0e080000.00000000' => { Name => 'IPV', Type => 'Node' },
+  # '060e2b34.0101.0107.0e090000.00000000' => { Name => 'Dolby', Type => 'Node' },
+  # '060e2b34.0101.0108.01011540.00000000' => { Name => 'GloballyUniqueObjectIdentifiers', Type => 'Node' },
+  # '060e2b34.0101.0108.01011540.01000000' => { Name => 'GloballyUniqueHumanIdentifiers', Type => 'Node' },
+    '060e2b34.0101.0108.01011540.01010000' => { Name => 'ParticipantID', Type => 'UID', Unknown => 1 },
+    '060e2b34.0101.0108.01011540.01020000' => { Name => 'ContactID', Type => 'UID', Unknown => 1 },
+    '060e2b34.0101.0108.01020104.00000000' => { Name => 'DefaultNamespaceURI', Format => 'string' },
+    '060e2b34.0101.0108.01020104.01000000' => { Name => 'DefaultNamespaceURI', Type => 'UTF-16' },
+    '060e2b34.0101.0108.01020105.00000000' => { Name => 'NamespaceURI', Format => 'string' },
+    '060e2b34.0101.0108.01020105.01000000' => { Name => 'NamespaceURI', Type => 'UTF-16' },
+    '060e2b34.0101.0108.01020106.00000000' => { Name => 'NamespaceURIs', Format => 'string' },
+    '060e2b34.0101.0108.01020106.01000000' => { Name => 'NamespaceURIs', Type => 'UTF-16' },
+    '060e2b34.0101.0108.01030604.00000000' => { Name => 'HTMLDOCTYPE', Format => 'string' },
+    '060e2b34.0101.0108.01030604.01000000' => { Name => 'HTMLDOCTYPE', Type => 'UTF-16' },
+    '060e2b34.0101.0108.01030605.00000000' => { Name => 'NamespacePrefix', Format => 'string' },
+    '060e2b34.0101.0108.01030605.01000000' => { Name => 'NamespacePrefix', Type => 'UTF-16' },
+    '060e2b34.0101.0108.01030606.00000000' => { Name => 'NamespacePrefixes', Format => 'string' },
+    '060e2b34.0101.0108.01030606.01000000' => { Name => 'NamespacePrefixes', Type => 'UTF-16' },
+    '060e2b34.0101.0108.02050404.00000000' => { Name => 'RightsComment', Format => 'string' },
+    '060e2b34.0101.0108.02050404.01000000' => { Name => 'RightsComment', Type => 'UTF-16' },
+    '060e2b34.0101.0108.03020201.06000000' => { Name => 'NominationCategory', Format => 'string' },
+    '060e2b34.0101.0108.03020201.06010000' => { Name => 'NominationCategory', Type => 'UTF-16' },
+    '060e2b34.0101.0108.04020301.06000000' => { Name => 'PeakEnvelopeVersion', Format => 'int32u' },
+    '060e2b34.0101.0108.04020301.07000000' => { Name => 'PeakEnvelopeFormat', Format => 'int32u' },
+    '060e2b34.0101.0108.04020301.08000000' => { Name => 'PointsPerPeakValue', Format => 'int32u' },
+    '060e2b34.0101.0108.04020301.09000000' => { Name => 'PeakEnvelopeBlockSize', Format => 'int32u' },
+    '060e2b34.0101.0108.04020301.0a000000' => { Name => 'PeakChannelCount', Format => 'int32u' },
+    '060e2b34.0101.0108.04020301.0b000000' => { Name => 'PeakFrameCount', Format => 'int32u' },
+    '060e2b34.0101.0108.04020301.0c000000' => { Name => 'PeakOfPeaksPosition', Type => 'Position', %duration },
+    '060e2b34.0101.0108.04020301.0d000000' => { Name => 'PeakEnvelopeTimestamp', Format => 'int32u' },
+    '060e2b34.0101.0108.04020301.0e000000' => { Name => 'PeakEnvelopeData', Type => 'Stream', Unknown => 1 },
+    '060e2b34.0101.0108.04060802.00000000' => { Name => 'RIFFChunkID', Format => 'int32u' },
+    '060e2b34.0101.0108.04060903.00000000' => { Name => 'RIFFChunkLength', Format => 'int32u' },
+    '060e2b34.0101.0108.04070400.00000000' => { Name => 'RIFFChunkData', Type => 'DataStream', Unknown => 1 },
+    '060e2b34.0101.0108.04090300.00000000' => { Name => 'MIMECharSet', Format => 'string' },
+    '060e2b34.0101.0108.04090301.00000000' => { Name => 'MIMECharSet', Type => 'UTF-16' },
+    '060e2b34.0101.0108.04090400.00000000' => { Name => 'MIMEEncoding', Format => 'string' },
+    '060e2b34.0101.0108.04090401.00000000' => { Name => 'MIMEEncoding', Type => 'UTF-16' },
+    '060e2b34.0101.0108.06010103.08000000' => { Name => 'MonoSourceTrackIDs', Format => 'int32u' },
+    '060e2b34.0101.0108.06010104.010a0000' => { Name => 'CompositionRendering', Type => 'PackageID', Unknown => 1 },
+    '060e2b34.0101.0108.06010104.03401304' => { Name => 'CaptionsDescriptionParticipantSets', Type => 'GlobalReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0108.06010104.05400d01' => { Name => 'EventAnnotationSets', Type => 'StrongReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.0108.06010104.060e0000' => { Name => 'ScriptingLocators', Type => 'StrongReferenceArray', Unknown => 1 },
+    '060e2b34.0101.0108.06010104.060f0000' => { Name => 'UnknownBWFChunks', Type => 'StrongReferenceArray', Unknown => 1 },
+  # '060e2b34.0101.0108.0e0a0000.00000000' => { Name => 'SnellAndWilcox', Type => 'Node' },
+    '060e2b34.0101.0109.01011511.00000000' => { Name => 'CryptographicContextID', Type => 'UUID', Unknown => 1 },
+    '060e2b34.0101.0109.01012101.01000000' => { Name => 'PlatformDesignation', Type => 'UTF-16' },
+    '060e2b34.0101.0109.01030107.01000000' => { Name => 'LocalTargetID', Type => 'UTF-16' },
+    '060e2b34.0101.0109.01030109.00000000' => { Name => 'NITFLayerTargetID', Format => 'string' },
+    '060e2b34.0101.0109.01030109.01000000' => { Name => 'NITFLayerTargetID', Type => 'UTF-16' },
+    '060e2b34.0101.0109.01030302.00000000' => { Name => 'PackageName', Format => 'string' },
+    '060e2b34.0101.0109.01030406.00000000' => { Name => 'RP217DataStreamPID', Format => 'int16u' },
+    '060e2b34.0101.0109.01030407.00000000' => { Name => 'RP217VideoStreamPID', Format => 'int16u' },
+    '060e2b34.0101.0109.02010101.00000000' => { Name => 'SourceOrganization', Type => 'UTF-16' },
+    '060e2b34.0101.0109.02010301.00000000' => { Name => 'OriginalProducerName', Type => 'UTF-16' },
+    '060e2b34.0101.0109.02080201.01000000' => { Name => 'SecurityClassification', Type => 'UTF-16' },
+    '060e2b34.0101.0109.02080202.01000000' => { Name => 'SecurityClassificationCaveats', Type => 'UTF-16' },
+    '060e2b34.0101.0109.02080207.01000000' => { Name => 'ClassificationComment', Type => 'UTF-16' },
+  # '060e2b34.0101.0109.02090200.00000000' => { Name => 'DataEncryption', Type => 'Node' },
+  # '060e2b34.0101.0109.02090201.00000000' => { Name => 'DataEncryptionAlgorithms', Type => 'Node' },
+  # '060e2b34.0101.0109.02090202.00000000' => { Name => 'DataHashingAlgorithms', Type => 'Node' },
+  # '060e2b34.0101.0109.02090300.00000000' => { Name => 'DigitalCinemaEncryption', Type => 'Node' },
+  # '060e2b34.0101.0109.02090301.00000000' => { Name => 'DigitalCinemaEncryptionAlgorithms', Type => 'Node' },
+    '060e2b34.0101.0109.02090301.01000000' => { Name => 'CipherAlgorithm', Type => 'UL', Unknown => 1 },
+    '060e2b34.0101.0109.02090301.02000000' => { Name => 'CryptographicKeyID', Type => 'UUID', Unknown => 1 },
+    '060e2b34.0101.0109.02090301.03000000' => { Name => 'EncryptedSourceValue', Type => 'DataValue', Unknown => 1 },
+  # '060e2b34.0101.0109.02090302.00000000' => { Name => 'DigitalCinemaHashingAlgorithms', Type => 'Node' },
+    '060e2b34.0101.0109.02090302.01000000' => { Name => 'MICAlgorithm', Type => 'UL', Unknown => 1 },
+    '060e2b34.0101.0109.02090302.02000000' => { Name => 'MIC', Type => 'DataValue', Unknown => 1 },
+    '060e2b34.0101.0109.03010102.01010000' => { Name => 'ISO639-1LanguageCode', Type => 'UTF-16' },
+    '060e2b34.0101.0109.03020106.10000000' => { Name => 'JFIFMarkerDescription', Format => 'string' },
+    '060e2b34.0101.0109.03020106.10010000' => { Name => 'JFIFMarkerDescription', Type => 'UTF-16' },
+    '060e2b34.0101.0109.03020106.11000000' => { Name => 'HTMLMetaDescription', Format => 'string' },
+    '060e2b34.0101.0109.03020106.11010000' => { Name => 'HTMLMetaDescription', Type => 'UTF-16' },
+    '060e2b34.0101.0109.03020401.02000000' => { Name => 'MetadataItemName', Format => 'string' },
+    '060e2b34.0101.0109.04010201.01060000' => { Name => 'ColorPrimaries', Format => 'string' },
+    '060e2b34.0101.0109.04010201.01060100' => { Name => 'ColorPrimaries', Type => 'ColorPrimariesType', Unknown => 1 },
+    '060e2b34.0101.0109.04060203.00000000' => { Name => 'ProductFormat', Format => 'string' },
+    '060e2b34.0101.0109.04060203.01000000' => { Name => 'ProductFormat', Type => 'UTF-16' },
+    '060e2b34.0101.0109.04061002.00000000' => { Name => 'SourceLength', Format => 'int64u' },
+    '060e2b34.0101.0109.04200102.01010100' => { Name => 'ImageSourceDeviceKind', Type => 'UTF-16' },
+    '060e2b34.0101.0109.06010102.02000000' => { Name => 'SourceContainerFormat', Type => 'UL', Unknown => 1 },
+    '060e2b34.0101.0109.06010102.03000000' => { Name => 'SourceKey', Type => 'UL', Unknown => 1 },
+    '060e2b34.0101.0109.06010103.09000000' => { Name => 'DynamicSourcePackageID', Type => 'PackageID', Unknown => 1 },
+    '060e2b34.0101.0109.06010103.0a000000' => { Name => 'DynamicSourceTrackIDs', Format => 'int32u' },
+    '060e2b34.0101.0109.06010103.0b000000' => { Name => 'SourceIndex', Type => 'Indirect', Unknown => 1 },
+    '060e2b34.0101.0109.06010103.0c000000' => { Name => 'SourceSpecies', Type => 'Indirect', Unknown => 1 },
+    '060e2b34.0101.0109.06010103.0d000000' => { Name => 'SourceValue', Type => 'Indirect', Unknown => 1 },
+    '060e2b34.0101.0109.06010104.020d0000' => { Name => 'CryptographicContextObject', Type => 'StrongReference', Unknown => 1 },
+    '060e2b34.0101.0109.06010104.06100000' => { Name => 'Sub-descriptors', Type => 'StrongReferenceArray', Unknown => 1 },
+    '060e2b34.0101.0109.06010106.02000000' => { Name => 'EncryptedTrackFileID', Type => 'UUID', Unknown => 1 },
+    '060e2b34.0101.0109.06010106.03000000' => { Name => 'CryptographicContextLink', Type => 'UUID', Unknown => 1 },
+    '060e2b34.0101.0109.06090201.03000000' => { Name => 'PlaintextOffset', Format => 'int64u' },
+    '060e2b34.0101.0109.06100500.00000000' => { Name => 'TripletSequenceNumber', Format => 'int64u' },
+    '060e2b34.0101.0109.07010201.030f0000' => { Name => 'BoundingRectangle', Type => 'Geographic Rectangle', Unknown => 1 },
+    '060e2b34.0101.0109.07010201.03100000' => { Name => 'GeographicLocation', Type => 'Geographic Polygon', Unknown => 1 },
+    '060e2b34.0101.0109.07010201.03110000' => { Name => 'GeographicPolygonCoordinates', Type => 'Array of GeographicCoordinate', Unknown => 1 },
+    '060e2b34.0101.0109.07010201.03120000' => { Name => 'GeographicAreaNorthwest', Type => 'GeographicCoordinate', Unknown => 1 },
+    '060e2b34.0101.0109.07010201.03130000' => { Name => 'GeographicAreaSoutheast', Type => 'GeographicCoordinate', Unknown => 1 },
+    '060e2b34.0101.0109.07010201.03140000' => { Name => 'GeographicAreaSourceDatum', Format => 'string' },
+    '060e2b34.0101.0109.07010201.03150000' => { Name => 'GeographicPolygonSourceDatum', Format => 'string' },
+    '060e2b34.0101.0109.07012001.02070100' => { Name => 'CountryCodeMethod', Type => 'UTF-16' },
+    '060e2b34.0101.0109.07012001.02080100' => { Name => 'ClassifyingCountryCode', Type => 'UTF-16' },
+    '060e2b34.0101.0109.07012001.02090100' => { Name => 'ReleasableCountryCode', Type => 'UTF-16' },
+    '060e2b34.0101.0109.07020102.01010100' => { Name => 'UTCStartDateTime', Type => 'UTF-16', Groups => { 2 => 'Time' } },
+    '060e2b34.0101.0109.07020102.01030000' => { Name => 'UTCInstantDateTime', Format => 'string', Groups => { 2 => 'Time' } },
+    '060e2b34.0101.0109.07020102.01030100' => { Name => 'UTCInstantDateTime', Type => 'UTF-16', Groups => { 2 => 'Time' } },
+    '060e2b34.0101.0109.07020102.05010100' => { Name => 'UTCLastModifyDate', Type => 'UTF-16', Groups => { 2 => 'Time' } },
+    '060e2b34.0101.0109.07020501.00000000' => { Name => 'ToleranceMode', Type => 'ToleranceModeType', Unknown => 1 },
+    '060e2b34.0101.0109.07020502.00000000' => { Name => 'ToleranceWindow', Type => 'Indirect', Unknown => 1 },
+    '060e2b34.0101.0109.07020503.00000000' => { Name => 'ToleranceInterpolationMethod', Type => 'WeakReferenceInterpolationDefinition', Unknown => 1 },
+  # '060e2b34.0101.0109.0d060000.00000000' => { Name => 'ARIB', Type => 'Node' },
+  # '060e2b34.0101.0109.0d070000.00000000' => { Name => 'AMIA', Type => 'Node' },
+  # '060e2b34.0101.0109.0e0b0000.00000000' => { Name => 'OmneonVideoNetworks', Type => 'Node' },
+  # '060e2b34.0101.0109.0e0c0000.00000000' => { Name => 'AscentMediaGroup', Type => 'Node' },
+  # '060e2b34.0101.0109.0e0c0100.00000000' => { Name => 'Published', Type => 'Node' },
+  # '060e2b34.0101.0109.0e0d0000.00000000' => { Name => 'Quantel', Type => 'Node' },
+  # '060e2b34.0101.0109.0e0e0000.00000000' => { Name => 'Panasonic', Type => 'Node' },
+    '060e2b34.0101.010a.04010502.03000000' => { Name => 'VBILineCount', Format => 'int16u' },
+    '060e2b34.0101.010a.04010502.04000000' => { Name => 'StoredVBILineNumber', Format => 'int16u' },
+    '060e2b34.0101.010a.04010502.05000000' => { Name => 'VBIWrappingType', Format => 'int8u' },
+    '060e2b34.0101.010a.04010502.06000000' => { Name => 'VBIPayloadSampleCount', Format => 'int16u' },
+    '060e2b34.0101.010a.04010502.07000000' => { Name => 'VBIPayloadByteArray', Format => 'int8u' },
+    '060e2b34.0101.010a.04010502.08000000' => { Name => 'ANCPacketCount', Format => 'int16u' },
+    '060e2b34.0101.010a.04010502.09000000' => { Name => 'StoredANCLineNumber', Format => 'int16u' },
+    '060e2b34.0101.010a.04010502.0a000000' => { Name => 'ANCWrappingType', Format => 'int8u' },
+    '060e2b34.0101.010a.04010502.0b000000' => { Name => 'ANCPayloadSampleCount', Format => 'int16u' },
+    '060e2b34.0101.010a.04010502.0c000000' => { Name => 'ANCPayloadByteArray', Format => 'int8u' },
+    '060e2b34.0101.010a.04010503.0f000000' => { Name => 'VBIPayloadSampleCoding', Format => 'int8u' },
+    '060e2b34.0101.010a.04010503.10000000' => { Name => 'ANCPayloadSampleCoding', Format => 'int8u' },
+  # '060e2b34.0101.010a.04010603.00000000' => { Name => 'JPEG2000CodingParameters', Type => 'Node' },
+    '060e2b34.0101.010a.04010603.01000000' => { Name => 'Rsiz', Format => 'int16u' },
+    '060e2b34.0101.010a.04010603.02000000' => { Name => 'Xsiz', Format => 'int32u' },
+    '060e2b34.0101.010a.04010603.03000000' => { Name => 'Ysiz', Format => 'int32u' },
+    '060e2b34.0101.010a.04010603.04000000' => { Name => 'XOsiz', Format => 'int32u' },
+    '060e2b34.0101.010a.04010603.05000000' => { Name => 'YOsiz', Format => 'int32u' },
+    '060e2b34.0101.010a.04010603.06000000' => { Name => 'XTsiz', Format => 'int32u' },
+    '060e2b34.0101.010a.04010603.07000000' => { Name => 'YTsiz', Format => 'int32u' },
+    '060e2b34.0101.010a.04010603.08000000' => { Name => 'XTOsiz', Format => 'int32u' },
+    '060e2b34.0101.010a.04010603.09000000' => { Name => 'YTOsiz', Format => 'int32u' },
+    '060e2b34.0101.010a.04010603.0a000000' => { Name => 'Csiz', Format => 'int16u' },
+    '060e2b34.0101.010a.04010603.0b000000' => { Name => 'PictureComponentSizing', Type => 'J2K ComponentSizingArray', Unknown => 1 },
+    '060e2b34.0101.010a.04010603.0c000000' => { Name => 'CodingStyleDefault', Type => 'J2K CodingStyleDefault', Unknown => 1 },
+    '060e2b34.0101.010a.04010603.0d000000' => { Name => 'QuantizationDefault', Type => 'J2K QuantizationDefault', Unknown => 1 },
+    '060e2b34.0101.010a.04020403.01020000' => { Name => 'MPEGAudioBitrate', Format => 'int32u', PrintConv => 'ConvertBitrate($val)', Groups => { 2 => 'Audio' } },
+    '060e2b34.0101.010a.04060204.00000000' => { Name => 'CBEStartOffset', Format => 'int64u' },
+    '060e2b34.0101.010a.04060205.00000000' => { Name => 'VBEEndOffset', Format => 'int64u' },
+    '060e2b34.0101.010a.06010104.02100000' => { Name => 'SubDescriptor', Unknown => 1 },
+    '060e2b34.0101.010a.06010104.06100000' => { Name => 'SubDescriptors', Unknown => 1 },
+    '060e2b34.0101.010a.06010107.16000000' => { Name => 'RootMetaDictionary', Type => 'StrongReference', Unknown => 1 },
+    '060e2b34.0101.010a.06010107.17000000' => { Name => 'RootPreface', Type => 'StrongReference', Unknown => 1 },
+    '060e2b34.0101.010a.06010107.18000000' => { Name => 'RootObjectDirectory', Type => 'Array of bytes', Unknown => 1 },
+    '060e2b34.0101.010a.06010107.19000000' => { Name => 'RootFormatVersion', Format => 'int32u' },
+    '060e2b34.0101.010a.07010201.03160000' => { Name => 'FrameCenterElevation', Format => 'float' },
+    '060e2b34.0101.010a.07020103.010e0000' => { Name => 'PackageMarkInPosition', Type => 'Position', %duration },
+    '060e2b34.0101.010a.07020103.02040000' => { Name => 'PackageMarkOutPosition', Type => 'Position', %duration },
+  # '060e2b34.0101.010a.0d080000.00000000' => { Name => 'PBS', Type => 'Node' },
+  # '060e2b34.0101.010a.0e0f0000.00000000' => { Name => 'GrassValley', Type => 'Node' },
+  # '060e2b34.0101.010a.0e100000.00000000' => { Name => 'DoremiLabs', Type => 'Node' },
+  # '060e2b34.0101.010a.0e110000.00000000' => { Name => 'EVSBroadcastEquipment', Type => 'Node' },
+  # '060e2b34.0101.010a.0e120000.00000000' => { Name => 'TurnerBroadcastingSystem', Type => 'Node' },
+    '060e2b34.0101.010c.0101110b.00000000' => { Name => 'Ad-ID', Unknown => 1 },
+    '060e2b34.0101.010c.01011512.00000000' => { Name => 'ResourceID', Type => 'UUID', Unknown => 1 },
+    '060e2b34.0101.010c.01011513.00000000' => { Name => 'AncillaryResourceID', Type => 'UUID', Unknown => 1 },
+    '060e2b34.0101.010c.01020210.02030000' => { Name => 'ApplicationSchemeBatch', Type => 'BatchOfUL', Unknown => 1 },
+  # '060e2b34.0101.010c.02100202.00000000' => { Name => 'RegisterPublicationInformation', Type => 'Node' },
+    '060e2b34.0101.010c.02100202.01000000' => { Name => 'RegisterKind', Type => 'RegisterType', Unknown => 1 },
+    '060e2b34.0101.010c.02100202.02000000' => { Name => 'RegisterVersion', Type => 'Hex' },
+    '060e2b34.0101.010c.02100202.03000000' => { Name => 'RegisterEditorName', Type => 'UTF-16' },
+    '060e2b34.0101.010c.02100202.04000000' => { Name => 'RegisterStatusKind', Type => 'RegisterStatusType', Unknown => 1 },
+  # '060e2b34.0101.010c.02100203.00000000' => { Name => 'RegisterItem', Type => 'Node' },
+    '060e2b34.0101.010c.02100203.01000000' => { Name => 'RegisterItemName', Type => 'UTF-16' },
+    '060e2b34.0101.010c.02100203.02000000' => { Name => 'RegisterItemDefinition', Type => 'UTF-16' },
+    '060e2b34.0101.010c.02100203.03000000' => { Name => 'RegisterItemSymbol', Type => 'SymbolType', Unknown => 1 },
+    '060e2b34.0101.010c.02100203.04000000' => { Name => 'RegisterItemDefiningDocumentName', Type => 'UTF-16' },
+    '060e2b34.0101.010c.02100203.05000000' => { Name => 'RegisterItemUL', Type => 'UniversalLabelType', Unknown => 1 },
+    '060e2b34.0101.010c.02100203.06000000' => { Name => 'RegisterItemNotes', Type => 'UTF-16' },
+    '060e2b34.0101.010c.02100203.07000000' => { Name => 'RegisterItemIntroductionVersion', Format => 'int8u' },
+    '060e2b34.0101.010c.02100203.08000000' => { Name => 'RegisterItemHierarchyLevel', Format => 'int16u' },
+  # '060e2b34.0101.010c.02100203.09000000' => { Name => 'RegisterWildcardFlag', Type => 'Node' },
+    '060e2b34.0101.010c.02100203.0a000000' => { Name => 'RegisterEntryStatus', Type => 'EntryStatusType', Unknown => 1 },
+  # '060e2b34.0101.010c.02100204.00000000' => { Name => 'RegisterAdministration', Type => 'Node' },
+    '060e2b34.0101.010c.02100204.01000000' => { Name => 'RegisterAction', Type => 'UTF-16' },
+    '060e2b34.0101.010c.02100204.02000000' => { Name => 'RegisterApproverName', Type => 'UTF-16' },
+    '060e2b34.0101.010c.02100204.03000000' => { Name => 'RegisterCreationTime', %timestamp },
+    '060e2b34.0101.010c.02100204.04000000' => { Name => 'RegistrantName', Type => 'UTF-16' },
+    '060e2b34.0101.010c.02100204.05000000' => { Name => 'RegisterItemOriginatorName', Type => 'UTF-16' },
+    '060e2b34.0101.010c.02100204.06000000' => { Name => 'RegisterUserName', Type => 'UTF-16' },
+    '060e2b34.0101.010c.02100204.07000000' => { Name => 'RegisterUserTime', %timestamp },
+    '060e2b34.0101.010c.02100204.08000000' => { Name => 'RegisterAdministrationNotes', Type => 'UTF-16' },
+    '060e2b34.0101.010c.04010101.09000000' => { Name => 'AFDAndBarData', Unknown => 1 },
+    '060e2b34.0101.010c.04010101.0a000000' => { Name => 'PanScanInformation', Unknown => 1 },
+  # '060e2b34.0101.010c.04010604.00000000' => { Name => 'VC-1PictureEssenceDescriptors', Type => 'Node' },
+    '060e2b34.0101.010c.04010604.01000000' => { Name => 'VC-1InitializationMetadata', Type => 'DataStream', Unknown => 1 },
+    '060e2b34.0101.010c.04010604.02000000' => { Name => 'VC-1SingleSequence', Type => 'Boolean' },
+    '060e2b34.0101.010c.04010604.03000000' => { Name => 'VC-1CodedContentType', Format => 'int8u' },
+    '060e2b34.0101.010c.04010604.04000000' => { Name => 'VC-1IdenticalGOP', Type => 'Boolean' },
+    '060e2b34.0101.010c.04010604.05000000' => { Name => 'VC-1MaximumGOP', Format => 'int16u' },
+    '060e2b34.0101.010c.04010604.06000000' => { Name => 'VC-1BPictureCount', Format => 'int16u' },
+    '060e2b34.0101.010c.04010604.07000000' => { Name => 'VC-1AverageBitrate', Format => 'int32u', PrintConv => 'ConvertBitrate($val)' },
+    '060e2b34.0101.010c.04010604.08000000' => { Name => 'VC-1MaximumBitrate', Format => 'int32u', PrintConv => 'ConvertBitrate($val)' },
+    '060e2b34.0101.010c.04010604.09000000' => { Name => 'VC-1Profile', Format => 'int8u' },
+    '060e2b34.0101.010c.04010604.0a000000' => { Name => 'VC-1Level', Format => 'int8u' },
+    '060e2b34.0101.010c.04020501.07000000' => { Name => 'LinkedTimecodeTrackID', Type => 'UInt32Array', Unknown => 1 },
+    '060e2b34.0101.010c.04020501.08000000' => { Name => 'SMPTE337MDataStreamNumber', Format => 'int8u' },
+    '060e2b34.0101.010c.04060803.00000000' => { Name => 'ApplicationScheme', Type => 'UL', Unknown => 1 },
+    '060e2b34.0101.010c.04060804.00000000' => { Name => 'DescriptiveMetadataScheme', Type => 'UL', Unknown => 1 },
+    '060e2b34.0101.010c.04090500.00000000' => { Name => 'UCSEncoding', Type => 'UTF-16' },
+    '060e2b34.0101.010c.05200701.0b000000' => { Name => 'LinkedApplicationPlug-InInstanceID', Type => 'WeakReference', Unknown => 1 },
+    '060e2b34.0101.010c.05200701.0c000000' => { Name => 'LinkedDescriptiveFrameworkPlug-InID', Type => 'WeakReference', Unknown => 1 },
+    '060e2b34.0101.010c.05200701.0d000000' => { Name => 'ApplicationPlug-InInstanceID', Type => 'UUID', Unknown => 1 },
+    '060e2b34.0101.010c.05200701.0e000000' => { Name => 'DescriptiveMetadataPlug-InID', Type => 'UUID', Unknown => 1 },
+    '060e2b34.0101.010c.05200701.0f000000' => { Name => 'ApplicationEnvironmentID', Type => 'UTF-16' },
+    '060e2b34.0101.010c.05200701.10000000' => { Name => 'DescriptiveMetadataApplicationEnvironmentID', Type => 'UTF-16' },
+    '060e2b34.0101.010c.05200701.11000000' => { Name => 'LinkedDescriptiveObjectPlug-InID', Type => 'WeakReference', Unknown => 1 },
+    '060e2b34.0101.010c.06010103.0e000000' => { Name => 'TimebaseReferenceTrackID', Format => 'int32u' },
+    '060e2b34.0101.010c.06010104.010b0000' => { Name => 'ObjectClassDefinition', Type => 'AUID', Unknown => 1 },
+    '060e2b34.0101.010c.06010104.020e0000' => { Name => 'ApplicationPlug-InBatch', Type => 'StrongReference', Unknown => 1 },
+    '060e2b34.0101.010c.06010104.020f0000' => { Name => 'PackageMarker', Type => 'StrongReference', Unknown => 1 },
+    '060e2b34.0101.010c.06010104.02100000' => { Name => 'PackageTimelineMarkerRef', Type => 'StrongReference', Unknown => 1 },
+    '060e2b34.0101.010c.06010104.02110000' => { Name => 'RegisterAdministrationObject', Type => 'StrongReference', Unknown => 1 },
+    '060e2b34.0101.010c.06010104.02120000' => { Name => 'RegisterEntryAdministrationObject', Type => 'StrongReference', Unknown => 1 },
+    '060e2b34.0101.010c.06010104.03060000' => { Name => 'GenericPayloads', Type => 'WeakReferenceBatch', Unknown => 1 },
+    '060e2b34.0101.010c.06010104.06110000' => { Name => 'RegisterEntryArray', Type => 'StrongReferenceArray', Unknown => 1 },
+    '060e2b34.0101.010c.06010104.06120000' => { Name => 'RegisterAdministrationArray', Type => 'StrongReferenceArray', Unknown => 1 },
+    '060e2b34.0101.010c.06010104.06130000' => { Name => 'ApplicationInformationArray', Type => 'StrongReferenceArray', Unknown => 1 },
+    '060e2b34.0101.010c.06010104.06140000' => { Name => 'RegisterChildEntryArray', Type => 'StrongReferenceArray', Unknown => 1 },
+    '060e2b34.0101.010c.07020101.01060000' => { Name => 'RegisterReleaseDateTime', %timestamp },
+    '060e2b34.0101.010c.07020101.01070000' => { Name => 'RegisterItemStatusChangeDateTime', %timestamp },
+  # '060e2b34.0101.010c.0d090000.00000000' => { Name => 'ASC', Type => 'Node' },
+  # '060e2b34.0101.010c.0d0a0000.00000000' => { Name => 'AES', Type => 'Node' },
+  # '060e2b34.0101.010c.0d0b0000.00000000' => { Name => 'DutchGuild', Type => 'Node' },
+  # '060e2b34.0101.010c.0e130000.00000000' => { Name => 'NLTechnologyLLC', Type => 'Node' },
+  # '060e2b34.0101.010c.0e140000.00000000' => { Name => 'HarrisCorporation', Type => 'Node' },
+
+  # data types (not used as tag ID's, right?)
+  # '060e2b34.0104.0101.01010100.00000000' => { Name => 'UInt8' },
+  # '060e2b34.0104.0101.01010200.00000000' => { Name => 'UInt16' },
+  # '060e2b34.0104.0101.01010300.00000000' => { Name => 'UInt32' },
+  # '060e2b34.0104.0101.01010400.00000000' => { Name => 'UInt64' },
+  # '060e2b34.0104.0101.01010500.00000000' => { Name => 'Int8' },
+  # '060e2b34.0104.0101.01010600.00000000' => { Name => 'Int16' },
+  # '060e2b34.0104.0101.01010700.00000000' => { Name => 'Int32' },
+  # '060e2b34.0104.0101.01010800.00000000' => { Name => 'Int64' },
+  # '060e2b34.0104.0101.01012001.00000000' => { Name => 'Position' },
+  # '060e2b34.0104.0101.01012002.00000000' => { Name => 'LengthType' },
+  # '060e2b34.0104.0101.01030100.00000000' => { Name => 'AUID' },
+  # '060e2b34.0104.0101.01030200.00000000' => { Name => 'PackageID' },
+  # '060e2b34.0104.0101.01040100.00000000' => { Name => 'Boolean' },
+  # '060e2b34.0104.0101.01100100.00000000' => { Name => 'UTF16' },
+  # '060e2b34.0104.0101.01100200.00000000' => { Name => 'UTF16String' },
+  # '060e2b34.0104.0101.01100300.00000000' => { Name => 'ISO7' },
+  # '060e2b34.0104.0101.01100400.00000000' => { Name => 'ISO7String' },
+  # '060e2b34.0104.0101.01200500.00000000' => { Name => 'UTF7String' },
+  # '060e2b34.0104.0101.01300100.00000000' => { Name => 'UMID' },
+  # '060e2b34.0104.0101.0201010e.00000000' => { Name => 'RGBACode' },
+  # '060e2b34.0104.0101.02010125.00000000' => { Name => 'ChannelStatusModeType' },
+  # '060e2b34.0104.0101.03010100.00000000' => { Name => 'Rational' },
+  # '060e2b34.0104.0101.03010101.00000000' => { Name => 'Numerator' },
+  # '060e2b34.0104.0101.03010102.00000000' => { Name => 'Denominator' },
+  # '060e2b34.0104.0101.03010200.00000000' => { Name => 'ProductVersionType' },
+  # '060e2b34.0104.0101.03010201.00000000' => { Name => 'Major' },
+  # '060e2b34.0104.0101.03010202.00000000' => { Name => 'Minor' },
+  # '060e2b34.0104.0101.03010203.00000000' => { Name => 'Patch' },
+  # '060e2b34.0104.0101.03010204.00000000' => { Name => 'Build' },
+  # '060e2b34.0104.0101.03010205.00000000' => { Name => 'Release' },
+  # '060e2b34.0104.0101.03010300.00000000' => { Name => 'VersionType' },
+  # '060e2b34.0104.0101.03010400.00000000' => { Name => 'RGBALayoutItem' },
+  # '060e2b34.0104.0101.03010501.00000000' => { Name => 'Year' },
+  # '060e2b34.0104.0101.03010502.00000000' => { Name => 'Month' },
+  # '060e2b34.0104.0101.03010503.00000000' => { Name => 'Day' },
+  # '060e2b34.0104.0101.03010601.00000000' => { Name => 'Hours' },
+  # '060e2b34.0104.0101.03010602.00000000' => { Name => 'Minutes' },
+  # '060e2b34.0104.0101.03010603.00000000' => { Name => 'Seconds' },
+  # '060e2b34.0104.0101.03010604.00000000' => { Name => 'msBy4' },
+  # '060e2b34.0104.0101.03010700.00000000' => { Name => 'Timestamp' },
+  # '060e2b34.0104.0101.04010100.00000000' => { Name => 'UInt8Array' },
+  # '060e2b34.0104.0101.04010300.00000000' => { Name => 'Int32Array' },
+  # '060e2b34.0104.0101.04010400.00000000' => { Name => 'Int64Array' },
+  # '060e2b34.0104.0101.04010600.00000000' => { Name => 'AUIDArray' },
+  # '060e2b34.0104.0101.04020100.00000000' => { Name => 'RGBALayout' },
+  # '060e2b34.0104.0101.04020200.00000000' => { Name => 'RationalArray' },
+  # '060e2b34.0104.0101.04030200.00000000' => { Name => 'UInt32Batch' },
+  # '060e2b34.0104.0101.04100100.00000000' => { Name => 'DataValue' },
+  # '060e2b34.0104.0101.04100200.00000000' => { Name => 'Stream' },
+  # '060e2b34.0104.0101.04100300.00000000' => { Name => 'Indirect' },
+  # '060e2b34.0104.0101.04100400.00000000' => { Name => 'Opaque' },
+  # '060e2b34.0104.0101.05010000.00000000' => { Name => 'WeakRef' },
+  # '060e2b34.0104.0101.05020000.00000000' => { Name => 'StrongRef' },
+  # '060e2b34.0104.0101.05021400.00000000' => { Name => 'StrongReferenceTrack' },
+  # '060e2b34.0104.0101.05060500.00000000' => { Name => 'StrongReferenceVectorTrack' },
+  # '060e2b34.0204.0107.0d010301.027e0100' => { Name => 'EncryptedTriplet' },
+
+    '060e2b34.0205.0101.0d010201.01020100' => { Name => 'OpenHeader', %header },
+    '060e2b34.0205.0101.0d010201.01020200' => { Name => 'ClosedHeader', %header },
+    '060e2b34.0205.0101.0d010201.01020300' => { Name => 'OpenCompleteHeader', %header },
+    '060e2b34.0205.0101.0d010201.01020400' => { Name => 'ClosedCompleteHeader', %header },
+    '060e2b34.0205.0101.0d010201.01030100' => { Name => 'OpenBodyPartition', Unknown => 1 },
+    '060e2b34.0205.0101.0d010201.01030200' => { Name => 'ClosedBodyPartition', Unknown => 1 },
+    '060e2b34.0205.0101.0d010201.01030300' => { Name => 'OpenCompleteBodyPartition', Unknown => 1 },
+    '060e2b34.0205.0101.0d010201.01030400' => { Name => 'ClosedCompleteBodyPartition', Unknown => 1 },
+    '060e2b34.0205.0101.0d010201.01040200' => { Name => 'Footer', Unknown => 1 },
+    '060e2b34.0205.0101.0d010201.01040400' => { Name => 'CompleteFooter', Unknown => 1 },
+
+    '060e2b34.0205.0101.0d010201.01050100' => { Name => 'Primer', SubDirectory => { TagTable => 'Image::ExifTool::MXF::Main', ProcessProc => \&ProcessPrimer } },
+
+    '060e2b34.0205.0101.0d010201.01110000' => { Name => 'RandomIndexMetadataV10', Type => 'FixedPack', Unknown => 1 },
+    '060e2b34.0205.0101.0d010201.01110100' => { Name => 'RandomIndexMetadata', Type => 'FixedPack', Unknown => 1 },
+    '060e2b34.0206.0101.0d010200.00000000' => { Name => 'PartitionMetadata', Type => 'FixedPack', Unknown => 1 },
+
+    '060e2b34.0253.0101.0d010101.01010200' => { Name => 'StructuralComponent', %localSet },
+    '060e2b34.0253.0101.0d010101.01010f00' => { Name => 'SequenceSet', %localSet },
+    # Note: SourceClip is actually a local set, but it isn't decoded because it has a Duration
+    # tag which gets confused with the other Duration tags (also, my technique of determining
+    # the corresponding EditRate doesn't seem to work for this Duration)
+    '060e2b34.0253.0101.0d010101.01011100' => { Name => 'SourceClip', Unknown => 1 },
+    '060e2b34.0253.0101.0d010101.01011400' => { Name => 'TimecodeComponent', %localSet },
+    '060e2b34.0253.0101.0d010101.01011800' => { Name => 'ContentStorageSet', %localSet },
+    '060e2b34.0253.0101.0d010101.01012300' => { Name => 'EssenceContainerDataSet', %localSet },
+    '060e2b34.0253.0101.0d010101.01012500' => { Name => 'FileDescriptor', %localSet },
+    '060e2b34.0253.0101.0d010101.01012700' => { Name => 'GenericPictureEssenceDescriptor', %localSet },
+    '060e2b34.0253.0101.0d010101.01012800' => { Name => 'CDCIEssenceDescriptor', %localSet },
+    '060e2b34.0253.0101.0d010101.01012900' => { Name => 'RGBAEssenceDescriptor', %localSet },
+    '060e2b34.0253.0101.0d010101.01012f00' => { Name => 'Preface', %localSet },
+    '060e2b34.0253.0101.0d010101.01013000' => { Name => 'Identification', %localSet },
+    '060e2b34.0253.0101.0d010101.01013200' => { Name => 'NetworkLocator', %localSet },
+    '060e2b34.0253.0101.0d010101.01013300' => { Name => 'TextLocator', %localSet },
+    '060e2b34.0253.0101.0d010101.01013400' => { Name => 'GenericPackage', %localSet },
+    '060e2b34.0253.0101.0d010101.01013600' => { Name => 'MaterialPackage', %localSet },
+    '060e2b34.0253.0101.0d010101.01013700' => { Name => 'SourcePackage', %localSet },
+    '060e2b34.0253.0101.0d010101.01013800' => { Name => 'GenericTrack', %localSet },
+    '060e2b34.0253.0101.0d010101.01013900' => { Name => 'EventTrack', %localSet },
+    '060e2b34.0253.0101.0d010101.01013a00' => { Name => 'StaticTrack', %localSet },
+    '060e2b34.0253.0101.0d010101.01013b00' => { Name => 'Track', %localSet },
+    '060e2b34.0253.0101.0d010101.01014100' => { Name => 'DMSegment', %localSet },
+    '060e2b34.0253.0101.0d010101.01014200' => { Name => 'GenericSoundEssenceDescriptor', %localSet },
+    '060e2b34.0253.0101.0d010101.01014300' => { Name => 'GenericDataEssenceDescriptor', %localSet },
+    '060e2b34.0253.0101.0d010101.01014400' => { Name => 'MultipleDescriptor', %localSet },
+    '060e2b34.0253.0101.0d010101.01014500' => { Name => 'DMSourceClip', %localSet },
+    '060e2b34.0253.0101.0d010101.01014700' => { Name => 'AES3PCMDescriptor', %localSet },
+    '060e2b34.0253.0101.0d010101.01014800' => { Name => 'WaveAudioDescriptor', %localSet },
+    '060e2b34.0253.0101.0d010101.01015100' => { Name => 'MPEG2VideoDescriptor', %localSet },
+    '060e2b34.0253.0101.0d010101.01015a00' => { Name => 'JPEG2000PictureSubDescriptor', %localSet },
+    '060e2b34.0253.0101.0d010101.01015b00' => { Name => 'VBIDataDescriptor', %localSet },
+    # ignore the index table sets because they contain no useful metadata
+    '060e2b34.0253.0101.0d010201.01100000' => { Name => 'V10IndexTableSegment', Unknown => 1 },
+    '060e2b34.0253.0101.0d010201.01100100' => { Name => 'IndexTableSegment', Unknown => 1 },
+    '060e2b34.0253.0101.0d010400.00000000' => { Name => 'DMSet', %localSet },
+    '060e2b34.0253.0101.0d010401.00000000' => { Name => 'DMFramework', %localSet },
+
+    # DMS1 local sets (ref 12)
+    '060e2b34.0253.0101.0d010401.01010100' => { Name => 'ProductionFramework', %localSet },
+    '060e2b34.0253.0101.0d010401.01010200' => { Name => 'ClipFramework', %localSet },
+    '060e2b34.0253.0101.0d010401.01010300' => { Name => 'SceneFramework', %localSet },
+    '060e2b34.0253.0101.0d010401.01100100' => { Name => 'Titles', %localSet },
+    '060e2b34.0253.0101.0d010401.01110100' => { Name => 'Identification', %localSet },
+    '060e2b34.0253.0101.0d010401.01120100' => { Name => 'GroupRelationship', %localSet },
+    '060e2b34.0253.0101.0d010401.01130100' => { Name => 'Branding', %localSet },
+    '060e2b34.0253.0101.0d010401.01140100' => { Name => 'Event', %localSet },
+    '060e2b34.0253.0101.0d010401.01140200' => { Name => 'Publication', %localSet },
+    '060e2b34.0253.0101.0d010401.01150100' => { Name => 'Award', %localSet },
+    '060e2b34.0253.0101.0d010401.01160100' => { Name => 'CaptionDescription', %localSet },
+    '060e2b34.0253.0101.0d010401.01170100' => { Name => 'Annotation', %localSet },
+    '060e2b34.0253.0101.0d010401.01170200' => { Name => 'SettingPeriod', %localSet },
+    '060e2b34.0253.0101.0d010401.01170300' => { Name => 'Scripting', %localSet },
+    '060e2b34.0253.0101.0d010401.01170400' => { Name => 'Classification', %localSet },
+    '060e2b34.0253.0101.0d010401.01170500' => { Name => 'Shot', %localSet },
+    '060e2b34.0253.0101.0d010401.01170600' => { Name => 'KeyPoint', %localSet },
+    '060e2b34.0253.0101.0d010401.01170800' => { Name => 'CueWords', %localSet },
+    '060e2b34.0253.0101.0d010401.01180100' => { Name => 'Participant', %localSet },
+    '060e2b34.0253.0101.0d010401.01190100' => { Name => 'ContactsList', %localSet },
+    '060e2b34.0253.0101.0d010401.011a0200' => { Name => 'Person', %localSet },
+    '060e2b34.0253.0101.0d010401.011a0300' => { Name => 'Organisation', %localSet },
+    '060e2b34.0253.0101.0d010401.011a0400' => { Name => 'Location', %localSet },
+    '060e2b34.0253.0101.0d010401.011b0100' => { Name => 'Address', %localSet },
+    '060e2b34.0253.0101.0d010401.011b0200' => { Name => 'Communications', %localSet },
+    '060e2b34.0253.0101.0d010401.011c0100' => { Name => 'Contract', %localSet },
+    '060e2b34.0253.0101.0d010401.011c0200' => { Name => 'Rights', %localSet },
+    '060e2b34.0253.0101.0d010401.011d0100' => { Name => 'PictureFormat', %localSet },
+    '060e2b34.0253.0101.0d010401.011e0100' => { Name => 'DeviceParameters', %localSet },
+    '060e2b34.0253.0101.0d010401.011f0100' => { Name => 'NameValue', %localSet },
+    '060e2b34.0253.0101.0d010401.01200100' => { Name => 'Processing', %localSet },
+    '060e2b34.0253.0101.0d010401.01200200' => { Name => 'Projects', %localSet },
+
+    '060e2b34.0253.0101.0d010401.02010000' => { Name => 'CryptographicFramework', %localSet },
+    '060e2b34.0253.0101.0d010401.02020000' => { Name => 'CryptographicContext', %localSet },
+
+    '060e2b34.0253.0101.7f000000.00000000' => { Name => 'DefaultObject', Unknown => 1 },
+    '060e2b34.0401.0107.02090201.01000000' => { Name => 'CipherAlgorithmAES128CBC', Type => 'Label', Unknown => 1 },
+    '060e2b34.0401.0107.02090202.01000000' => { Name => 'HMACAlgorithmSHA1128', Type => 'Label', Unknown => 1 },
+    '060e2b34.0401.0107.0d010301.020b0100' => { Name => 'EncryptedContainerLabel', Type => 'Label', Unknown => 1 },
+    '060e2b34.0401.0107.0d010401.02010100' => { Name => 'CryptographicFrameworkLabel', Type => 'Label', Unknown => 1 },
+);
+
+# header information 
+%Image::ExifTool::MXF::Header = (
+    GROUPS => { 2 => 'Video' },
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    0 => {
+        Name => 'MXFVersion',
+        Format => 'int16u[2]',
+        ValueConv => '$val =~ tr/ /./; $val',
+    },
+    # 4 - int32u: KAGSize
+    # 8 - int64u: bytes from first header
+    # 16 - int64u: bytes from previous partition
+    24 => { # bytes to footer from start of header
+        Name => 'FooterPosition',
+        Format => 'int64u',
+        RawConv => '$$self{MXFInfo}{FooterPos} = $val; undef',
+    },
+    32 => { # number of bytes in header, beginning at the start of the Primer
+        Name => 'HeaderSize',
+        Format => 'int64u',
+        # use this opportinity to also save our header type
+        RawConv => q{
+            $$self{MXFInfo}{HeaderType} = $$self{DIR_NAME};
+            $$self{MXFInfo}{HeaderSize} = $val;
+            return undef; # I don't think anyone would care about this
+        },
+    },
+    # ...plus more stuff we don't care about
+);
+
+#------------------------------------------------------------------------------
+# Convert 16 bytes to UL format
+# Inputs: 0) 16-byte value
+# Returns: UL string
+sub UL($)
+{
+    return join('.', unpack('H8H4H4H8H8', shift));;
+}
+
+#------------------------------------------------------------------------------
+# Convert latitude and/or longitude in [d]ddmmss(N|S|E|W) format
+# Inputs: 0) string value to convert
+# Returns: numerical lat and/or long
+sub ConvLatLon($)
+{
+    my $val = shift;
+    my (@convVal, $ne);
+    foreach $ne ('NS','EW') {
+        next unless $val =~ /(\d{2,3})(\d{2})(\d{2})([$ne])/;
+        push @convVal, $1 + ($2 + $3 / 60) / 60 * (($4 eq 'N' or $4 eq 'E') ? 1 : -1);
+    }
+    return join ' ', @convVal;
+}
+
+#------------------------------------------------------------------------------
+# Read MXF-specific Format types
+# Inputs: 0) ExifTool ref, 1) value, 2) MXF value type
+# Returns: formatted value
+# Note: All types recognized here should be defined in the %knownType lookup
+sub ReadMXFValue($$$)
+{
+    my ($exifTool, $val, $type) = @_;
+    my $len = length($val);
+    local $_;
+
+    if ($type eq 'UTF-16') {
+        $val = $exifTool->Decode($val, 'UCS2'); # (until we handle UTF-16 properly)
+    } elsif ($type eq 'ProductVersion') {
+        my @a = unpack('n*', $val);
+        push @a, 0 while @a < 5;
+        $a[4] = { 0 => 'unknown', 1 => 'released', 2 => 'debug', 3 => 'patched',
+                  4 => 'beta', 5 => 'private build' }->{$a[4]} || "unknown $a[4]";
+        $val = join('.', @a[0..3]) . ' ' . $a[4];
+    } elsif ($type eq 'VersionType') {
+        $val = join('.',unpack('C*',$val));
+    } elsif ($type eq 'Timestamp') {
+        my @a = unpack('nC*',$val);
+        my @max = (3000,12,31,24,59,59,249);
+        foreach (@a) {
+            last unless @max and $_ <= $max[0];
+            shift @max;
+        }
+        if (@max) {
+            $val = 'Invalid (0x' . unpack('H*',$val) . ')';
+        } else {
+            $a[6] *= 4;
+            $val = sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d.%.3d', @a);
+        }
+    } elsif ($type eq 'Position' or $type eq 'Length') {
+        $val = Get64u(\$val, 0);
+    } elsif ($type eq 'Boolean') {
+        $val = $val eq "\0" ? 'False' : 'True';
+    } elsif ($type =~ /^(Alt|Lat|Lon)$/ and $len == 4) {
+        # split into nibbles after swapping byte order (see reference 8b)
+        $val = unpack('H*', pack('N', unpack('V', $val)));
+        if ($type eq 'Alt') {
+            # drop satellite information and only support altitudes up to +/-99999 m
+            $val = "$val (from earth centre)" unless $val =~ s/^[abc]..// or $val =~ s/^[def]../-/;
+        } else {
+            $val =~ s/(...)/$1./;   # insert decimal point after 3rd character
+            if ($type eq 'Lat') {
+                $val =~ s/^f/-/;    # south with first digit = 0
+            } else {
+                $val =~ s/^e/-/;    # east with first digit = 0
+                $val =~ s/^f/-1/;   # east with first digit = 1
+            }
+        }
+    } elsif ($type =~ /(Array|Batch)/ and $len > 16) {
+        my ($count, $size) = unpack('NN', $val);
+        # validate data length
+        $len == 8 + $count * $size or $exifTool->WarnOnce("Bad array or batch size");
+        my ($i, @a);
+        for ($i=0; $i<$count; ++$i) {
+            my $pos = 8 + $i * $size;
+            last if $pos + $size > $len;
+            push @a, substr($val, $pos, $size);
+        }
+        if ($type =~ /^StrongReference/) {
+            $_ = join('-', unpack('H8H4H4H4H12', $_)) foreach @a;
+        } elsif ($type eq 'BatchOfUL' or $type =~ /^WeakReference/) {
+            $_ = ReadMXFValue($exifTool, $_, 'UL') foreach @a;
+        }
+        $val = \@a;
+    } elsif ($len == 32) {
+        # 32-byte types include UMID, PackageID
+        $val = join('.', unpack('H8H4H4H8', $val)) . ' ' .
+               join(' ', unpack('x12H2H6', $val)) . ' ' .
+               join('-', unpack('x16H8H4H4H4H12', $val));
+    } elsif ($len == 16) {
+        # convert remaining 16-byte known types as GUID or UL
+        # - this covers all UID's, UL, Label, WeakReference, StrongReference
+        if ($type eq 'UL' or $type eq 'WeakReference') {
+            # reverse high/low word if a reversed GUID is stored in a UL type
+            # (see ref 8b, section 5.5.8)
+            # - a GUID will have high bit of byte 8 set (reversed, this is in byte 0)
+            return UL($val) unless unpack('C', $val) & 0x80;
+            $val = substr($val, 8) . substr($val, 0, 8);
+        }
+        $val = join('-', unpack('H8H4H4H4H12', $val)); # compact GUID format
+    } else {
+        # Note: a 64-byte extended UMID contains date/time, GPS coordinates, etc,
+        # which would could be decoded here (ref 8b, section 5)...
+        $val = unpack('H*', $val);
+    }
+    return $val;
+}
+
+#------------------------------------------------------------------------------
+# Process MXF Primer (to build lookup for translating local tag ID's)
+# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessPrimer($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $end = $$dirInfo{DirLen};
+    return 0 unless $end > 8;
+    my $count = Get32u($dataPt, 0);
+    my $size = Get32u($dataPt, 4);
+    return 0 unless $size >= 18;
+    $exifTool->VerboseDir('MXF Primer', $count);
+    my $verbose = $exifTool->Options('Verbose');
+    my $primer = $$exifTool{MXFInfo}{Primer};
+    my $pos = 8;
+    my $i;
+    for ($i=0; $i<$count; ++$i) {
+        last if $pos + $size > $end;
+        my $local = Get16u($dataPt, $pos);
+        my $global = UL(substr($$dataPt, $pos + 2, 16));
+        $pos += $size;
+        # save this entry in the primer lookup table
+        $$primer{$local} = $global;
+        # print lookup details in verbose mode
+        next unless $verbose;
+        my $indx = $i . ')';
+        $indx .= ' ' if length($indx) < 3;
+        $exifTool->VPrint(0, sprintf("  | $indx 0x%.4x => '$global'\n", $local));
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Read tags from an MXF local set
+# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessLocalSet($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    local $_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dataPos = $$dirInfo{DataPos};
+    my $end = $$dirInfo{DirLen};
+    my $mxfInfo = $$exifTool{MXFInfo};
+    my $primer = $$mxfInfo{Primer};
+    my (@strongRef, @groups, $instance, $editRate, $trackID, $langCode, $textLang);
+
+    $exifTool->VerboseDir('MXF LocalSet', undef, $end);
+
+    # loop through all tags in this local set
+    my $pos = 0;
+    while ($pos + 4 < $end) {
+        my $loc = Get16u($dataPt, $pos);        # get key (local tag ID)
+        my $len = Get16u($dataPt, $pos + 2);    # get length
+        $pos += 4;
+        last if $pos + $len > $end;
+        my $tag = $$primer{$loc};
+        my ($extra, $val, $type, $langInfo);
+        if ($tag and $$tagTablePtr{$tag}) {
+            $extra = sprintf(', Local 0x%.4x', $loc);
+        } else {
+            $tag = $loc;
+          # $exifTool->WarnOnce('Missing local key for at least one tag');
+            $extra = ', NOT IN PRIMER!';
+        }
+        my $tagInfo = $$tagTablePtr{$tag};
+        # handle our MXF-specific format types
+        if ($tagInfo) {
+            $type = $$tagInfo{Type};
+            if ($type and $knownType{$type}) {
+                $val = ReadMXFValue($exifTool, substr($$dataPt, $pos, $len), $type);
+                push @strongRef, (ref $val ? @$val : $val) if $type =~ /^StrongReference/;
+                # remember instance UID of this local set
+                if ($$tagInfo{Name} eq 'InstanceUID') {
+                    $instance = $val;
+                    # set language code for text
+                    # (only works if InstanceUID comes before text)
+                    $textLang = $$mxfInfo{$instance}{LangCode} if $$mxfInfo{$instance};
+                } elsif ($type eq 'UTF-16' and $textLang) {
+                    $langInfo = Image::ExifTool::GetLangInfo($tagInfo, $textLang);
+                }
+            }
+        }
+        # get tagInfo ref the standard way to handle Unknown tags
+        $tagInfo = $langInfo || $exifTool->GetTagInfo($tagTablePtr, $tag);
+        # set Binary flag to extract all unknown-format tags as Binary data
+        if ($tagInfo and $$tagInfo{Unknown} and not defined $$tagInfo{Binary}) {
+            $$tagInfo{Binary} = not ($$tagInfo{Format} or ($type and $knownType{$type}));
+        }
+        my $key = $exifTool->HandleTag($tagTablePtr, $tag, $val,
+            Extra       => $extra,
+            TagInfo     => $tagInfo,
+            DataPt      => $dataPt,
+            DataPos     => $dataPos,
+            Start       => $pos,
+            Size        => $len,
+            ProcessProc => \&ProcessLocalSet,
+        );
+        $pos += $len;
+        next unless $key;
+        # save information to allow later fixup of durations and group1 names
+        # (necessary because we don't have all the information we need
+        #  to do this on the fly when the file is parsed linearly)
+        push @groups, $$exifTool{TAG_EXTRA}{$key};
+        next unless $tagInfo;
+        my $name = $$tagInfo{Name};
+        if ($$tagInfo{IsDuration}) {
+            $$mxfInfo{FixDuration}{$key} = 1;
+        } elsif ($$tagInfo{LanguageCode}) {
+            $langCode = $$exifTool{VALUE}{$key};
+        } elsif ($name eq 'EditRate') {
+            $editRate = $$exifTool{VALUE}{$key};
+        } elsif ($name =~ /TrackID$/) {
+            $trackID = $$exifTool{VALUE}{$key};
+            unless ($$mxfInfo{Group1}{$trackID}) {
+                # save lookup to convert TrackID to our group 1 name
+                $$mxfInfo{Group1}{$trackID} = 'Track' . ++$$mxfInfo{NumTracks};
+            }
+        }
+    }
+
+    # save object information now that we know the instance UID
+    if ($instance) {
+        my $objInfo = $$mxfInfo{$instance};
+        if ($objInfo) {
+            push @{$$objInfo{StrongRef}}, @strongRef;
+            push @{$$objInfo{Groups}}, @groups;
+        } else {
+            $objInfo = $$mxfInfo{$instance} = {
+                StrongRef => \@strongRef,
+                Groups => \@groups,
+            };
+        }
+        # save instance UID's in groups hash (used to remove duplicates later)
+        $$_{UID} = $instance foreach @groups;
+        $$objInfo{Name} = $$exifTool{DIR_NAME};
+        $$objInfo{TrackID} = $trackID if defined $trackID;
+        $$objInfo{EditRate} = $editRate if $editRate;
+        if ($langCode) {
+            $$objInfo{LangCode} = $langCode;
+        } else {
+            $langCode = $$objInfo{LangCode};
+        }
+        if ($langCode) {
+            # pre-set language code in all children
+            my $ul;
+            foreach $ul (@{$$objInfo{StrongRef}}) {
+                my $obj = $$mxfInfo{$ul};
+                $obj or $obj = $$mxfInfo{$ul} = { StrongRef => [], Groups => [], Name => 'XXX' };
+                $$obj{LangCode} = $langCode;
+            }
+        }
+        # save instance UID's of Preface's
+        push @{$$mxfInfo{Preface}}, $instance if $$exifTool{DIR_NAME} eq 'Preface';
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Walk MXF tree to set group names
+# Inputs: 0) MXF information hash ref, 1) object instance UID,
+#         2) path information hash ref (only for group 5 names), 3) track ID number
+# Notes: also generates lookup table for EditRate based on group 1 name
+#        and the instance UID of the SequenceSet with the preferred Duration value
+sub SetGroups($$;$$)
+{
+    my ($mxfInfo, $instance, $pathInfo, $trackID) = @_;
+    my $objInfo = $$mxfInfo{$instance};
+    return unless $objInfo and not $$objInfo{DidGroups};
+    $$objInfo{DidGroups} = 1;   # avoid reprocessing this object
+    $trackID = $$objInfo{TrackID} if defined $$objInfo{TrackID};
+    my ($ul, $g1, $g5, $groups, $path, $nameCount, $setSource);
+    # generate group 1 name for different tracks
+    if (defined $trackID) {
+        $$objInfo{TrackID} = $trackID;
+        $g1 = $$mxfInfo{Group1}{$trackID};
+        # build a lookup to determine edit rates based on group 1 name
+        my $editRate = $$objInfo{EditRate};
+        $$mxfInfo{EditRate}{$g1} = $editRate if defined $editRate;
+        # save the TimeCodeComponent instance UID (for determining Duration later)
+        if ($$objInfo{Name} eq 'TimecodeComponent') {
+            my $inWhat = $$mxfInfo{InSource} ? 'Source' : 'Other';
+            $$mxfInfo{BestDuration}{$inWhat} = $instance;
+        }
+    }
+    # set flag if we are in the SourcePackage (contains our preferred TimecodeComponent)
+    my $name = $$objInfo{Name};
+    $setSource = $$mxfInfo{InSource} = 1 if $name eq 'SourcePackage';
+
+    # generate group 5 path names if requested
+    if ($pathInfo) {
+        $nameCount = $$pathInfo{NameCount} || { };
+        $path = $$pathInfo{Path};
+        $$nameCount{$name} = ($$nameCount{$name} || 0) + 1;
+        push @$path, $name . $$nameCount{$name};
+        $g5 = join '-', @$path;
+        $$pathInfo{NameCount} = { };    # use new name count for child objects
+    }
+    foreach $groups (@{$$objInfo{Groups}}) {
+        $$groups{G1} = $g1 if $g1;
+        $$groups{G5} = $g5 if $g5;
+    }
+    # walk through remaining objects in tree
+    foreach $ul (@{$$objInfo{StrongRef}}) {
+        SetGroups($mxfInfo, $ul, $pathInfo, $trackID);
+    }
+    if ($pathInfo) {
+        pop @$path;
+        $$pathInfo{NameCount} = $nameCount;
+    }
+    delete $$mxfInfo{InSource} if $setSource;
+}
+
+#------------------------------------------------------------------------------
+# Convert all duration values to seconds
+# Inputs: 0) ExifTool object ref, 1) MXF information hash ref
+sub ConvertDurations($$)
+{
+    my ($exifTool, $mxfInfo) = @_;
+    my $valueHash = $$exifTool{VALUE};
+    my $infoHash = $$exifTool{TAG_INFO};
+    my $tagExtra = $$exifTool{TAG_EXTRA};
+    my $editHash = $$mxfInfo{EditRate};
+    my ($tag, $key, $i);
+    foreach $tag (keys %{$$mxfInfo{FixDuration}}) {
+        # loop through all instances of this tag name
+        for ($i=0, $key=$tag; ; ++$i, $key="$tag ($i)") {
+            my $tagInfo = $$infoHash{$key} or last;
+            next unless $$tagInfo{IsDuration};  # test IsDuration flag to be sure
+            my $g1 = $$tagExtra{$key}{G1} or next;
+            my $editRate = $$editHash{$g1};
+            $$valueHash{$key} /= $editRate if $editRate;
+        }
+    }
+}
+
+#------------------------------------------------------------------------------
+# Read information in a MXF file
+# Inputs: 0) ExifTool ref, 1) dirInfo ref
+# Returns: 1 on success, 0 if this wasn't a valid MXF file
+sub ProcessMXF($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my $verbose = $exifTool->Options('Verbose');
+    my $unknown = $exifTool->Options('Unknown');
+    my ($buff, $preface, $n, $headerEnd, $footerPos);
+
+    # read enough to allow skipping over run-in if it exists
+    $raf->Read($buff, 65547) or return 0;
+    $buff =~ /\x06\x0e\x2b\x34\x02\x05\x01\x01\x0d\x01\x02/g or return 0;
+    my $start = pos($buff) - 11;
+
+    $exifTool->SetFileType();
+    SetByteOrder('MM');
+    $raf->Seek($start, 0) or $exifTool->Warn('Seek error'), return 1;
+    my $tagTablePtr = GetTagTable('Image::ExifTool::MXF::Main');
+
+    # determine header length and type
+
+    # initialize MXF information lookups
+    my %mxfInfo = (
+        Primer => { },      # convert local keys to global UL
+        Group1 => { },      # group 1 names base on TrackID
+        NumTracks => 0,     # counts number of tracks in file
+        FixDuration => { }, # names of all Duration tags that need fixing
+        Preface => [ ],     # instance UID's for all Preface objects
+    );
+    $$exifTool{MXFInfo} = \%mxfInfo;
+
+    # set group 1 name for all tags (so we can overwrite with track number later)
+    $$exifTool{SET_GROUP1} = 'MXF';
+
+    for (;;) {
+        my $pos = $raf->Tell();
+        # did we just finish parsing the header partition?
+        if ($headerEnd and $pos >= $headerEnd) {
+            # all done if it was a closed and complete header
+            last if $mxfInfo{HeaderType} eq 'ClosedCompleteHeader' and not $verbose;
+            undef $headerEnd;   # (only test this once)
+            # skip directly to footer if possible
+            if ($footerPos and $footerPos > $pos and (not $verbose or not $unknown)) {
+                $exifTool->VPrint(0, "[Skipping to footer. Use Unknown option to parse body partitions]\n");
+                $raf->Seek($footerPos, 0) or last;
+                $pos = $footerPos;
+            }
+        }
+        # read the next KLV Key and first byte of Value
+        $raf->Read($buff, 17) == 17 or last;
+        my $tag = substr($buff, 0, 16);     # get KLV Key (global tag ID)
+        my $len = Get8u(\$buff, 16);        # get KLV Length
+        my $n;
+        if ($len >= 0x80) {
+            $n = $len & 0x7f;
+            $raf->Read($buff, $n) == $n or last;
+            $len = 0;
+            foreach $b (unpack 'C*', $buff) {
+                $len = $len * 256 + $b;
+            }
+        } else {
+            $n = 0;
+        }
+        # convert tag ID to ASCII UL notation
+        my $ul = UL($tag);
+        my $tagInfo = $$tagTablePtr{$ul};
+        if (not $tagInfo and $ul =~ /^060e2b34\.0253\.0101\.(0d|0f)/ and
+            ($1 eq '0d' or $verbose or $unknown))
+        {
+            # generate some unknown set tags automatically
+            my $name = $1 eq '0d' ? 'UserOrganizationPublicUse' : 'Experimental';
+            $tagInfo = { Name => $name, %localSet };
+            Image::ExifTool::AddTagToTable($tagTablePtr, $ul, $tagInfo);
+        }
+        my ($val, $dataPt);
+        if ($tagInfo and not $$tagInfo{Unknown} and $len < 10000000) {
+            # save information about header/footer positions for skipping over body partitions
+            if ($$tagInfo{Name} eq 'Primer' and $mxfInfo{HeaderSize}) {
+                # footer position relative to header start and only valid if non-zero
+                $footerPos = $start + $mxfInfo{FooterPos} if $mxfInfo{FooterPos};
+                # header length is relative to start of Primer
+                $headerEnd = $pos + $mxfInfo{HeaderSize};
+            } elsif ($$tagInfo{IsHeader}) {
+                # save position of header start to allow calculation of footer position
+                $start = $pos;
+            }
+            $raf->Read($buff, $len) == $len or last; # get KLV Value
+            $dataPt = \$buff;
+            my $type = $$tagInfo{Type};
+            $val = ReadMXFValue($exifTool, $buff, $type) if $type and $knownType{$type};
+        } elsif (($tagInfo and (not $$tagInfo{Unknown} or $unknown)) or $verbose) {
+            if ($tagInfo) {
+                # set Binary flag to extract all unknown-format tags as Binary data
+                if ($$tagInfo{Unknown} and not defined $$tagInfo{Binary}) {
+                    my $type = $$tagInfo{Type};
+                    $$tagInfo{Binary} = not ($$tagInfo{Format} or ($type and $knownType{$type}));
+                }
+            } else {
+                my $id = unpack 'H*', $tag;
+                $tagInfo = {
+                    Name        => "MXF_$id",
+                    Description => "MXF $id",
+                };
+                # note: don't add unknown tags to table because we don't
+                # want them to be extracted with the Unknown option
+            }
+            # read the first 64kB max
+            my $n = $len < 65536 ? $len : 65536;
+            $raf->Read($val, $n) == $n or last;
+            $dataPt = \$val;
+            my $more = $len - $n;
+            $raf->Seek($more, 1) or last if $more;
+        } else {
+            $raf->Seek($len, 1) or last;    # skip this value
+            next;
+        }
+        $exifTool->HandleTag($tagTablePtr, $ul, $val,
+            TagInfo     => $tagInfo,
+            DataPt      => $dataPt,
+            DataPos     => $pos + 17 + $n,
+            Size        => $len,
+            ProcessProc => \&ProcessLocalSet,
+        );
+    }
+    # walk entire MXF object tree to fix family 1 group names
+    my ($pathInfo, $tag, %did, %bestDur);
+    $pathInfo = { Path => [ 'MXF' ] } if $exifTool->Options('SavePath');
+    foreach $preface (@{$mxfInfo{Preface}}) {
+        SetGroups(\%mxfInfo, $preface, $pathInfo);
+    }
+    # convert Duration values to seconds based on the appropriate EditRate
+    ConvertDurations($exifTool, \%mxfInfo);
+
+    # remove tags to keep only the one from the most recent instance of the object
+    my $tagExtra = $$exifTool{TAG_EXTRA};
+    my $fileOrder = $$exifTool{FILE_ORDER};
+    # also determine our best Duration value
+    if ($mxfInfo{BestDuration}) {
+        my $instance = $mxfInfo{BestDuration}{Source} || $mxfInfo{BestDuration}{Other};
+        $instance and $bestDur{"Duration $instance"} = 1;
+    }
+    # process tags in reverse order to preserve the last found of each identical tag
+    foreach $tag (sort { $$fileOrder{$b} <=> $$fileOrder{$a} } keys %$tagExtra) {
+        my $instance = $$tagExtra{$tag}{UID} or next;
+        delete $$tagExtra{$tag}{UID};   # (no longer needed)
+        $tag =~ /^(\S+)/;               # get tag name without index number
+        my $utag = "$1 $instance";      # instance-specific tag name
+        if ($did{$utag}) {
+            Image::ExifTool::DeleteTag($exifTool, $tag); # delete the duplicate
+        } else {
+            $did{$utag} = 1;
+            if ($bestDur{$utag}) {
+                # save best duration value
+                my $val = $$exifTool{VALUE}{$tag};
+                $exifTool->HandleTag($tagTablePtr, '060e2b34.0101.0102.07020201.01030000', $val);
+            }
+        }
+    }
+
+    # clean up and return
+    delete $$exifTool{SET_GROUP1};
+    delete $$exifTool{MXFInfo};
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::MXF - Read MXF meta information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to read meta
+information from MXF (Material Exchange Format) files.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://sourceforge.net/projects/mxflib/>
+
+=item L<http://www.aafassociation.org/downloads/whitepapers/MXFPhysicalview.pdf>
+
+=item L<http://archive.nlm.nih.gov/pubs/pearson/MJ2_Metadata2005.pdf>
+
+=item L<http://www.aafassociation.org/downloads/specifications/AMWA-AS-03-Delivery-Spec-1_0.pdf>
+
+=item L<http://paul-sampson.ca/private/s385m.pdf>
+
+=item L<http://avwiki.nl/documents/eg41.pdf>
+
+=item L<http://avwiki.nl/documents/eg42.pdf>
+
+=item L<http://www.amwa.tv/downloads/specifications/aafobjectspec-v1.1.pdf>
+
+=item L<http://www.smpte-ra.org/mdd/RP210v12-publication-20100623.xls>
+
+=item L<http://rhea.tele.ucl.ac.be:8081/Plone/Members/egoray/thesaurus-dictionnaire-metadata/>
+
+=item L<http://www.mog-solutions.com/img_upload/PDF/XML%20Schema%20for%20MXF%20Metadata.pdf>
+
+=item L<http://www.freemxf.org/freemxf_board/viewtopic.php?p=545&sid=00a5c17e07d828c1e93ecdbaed3076f7>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/MXF Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/MakerNotes.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/MakerNotes.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/MakerNotes.pm	(revision 24799)
@@ -0,0 +1,1514 @@
+#------------------------------------------------------------------------------
+# File:         MakerNotes.pm
+#
+# Description:  Read and write EXIF maker notes
+#
+# Revisions:    11/11/2004 - P. Harvey Created
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::MakerNotes;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess);
+use Image::ExifTool::Exif;
+
+sub ProcessUnknown($$$);
+sub ProcessUnknownOrPreview($$$);
+sub ProcessCanon($$$);
+sub ProcessGE2($$$);
+sub WriteUnknownOrPreview($$$);
+sub FixLeicaBase($$;$);
+
+$VERSION = '1.66';
+
+my $debug;          # set to 1 to enable debugging code
+
+# conditional list of maker notes
+# Notes:
+# - This is NOT a normal tag table!
+# - All byte orders are now specified because we can now
+#   write maker notes into a file with different byte ordering!
+# - Put these in alphabetical order to make TagNames documentation nicer.
+@Image::ExifTool::MakerNotes::Main = (
+    # decide which MakerNotes to use (based on camera make/model)
+    {
+        Name => 'MakerNoteCanon',
+        # (starts with an IFD)
+        Condition => '$$self{Make} =~ /^Canon/',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Canon::Main',
+            ProcessProc => \&ProcessCanon,
+            ByteOrder => 'Unknown',
+        },
+    },
+    {
+        Name => 'MakerNoteCasio',
+        # do negative lookahead assertion just to get tags
+        # in a nice order for documentation
+        # (starts with an IFD)
+        Condition => '$$self{Make}=~/^CASIO/ and $$valPt!~/^(QVC|DCI)\0/',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Casio::Main',
+            ByteOrder => 'Unknown',
+        },
+    },
+    {
+        Name => 'MakerNoteCasio2',
+        # (starts with "QVC\0" [Casio] or "DCI\0" [Concord])
+        # (also found in AVI and MOV videos)
+        Condition => '$$valPt =~ /^(QVC|DCI)\0/',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Casio::Type2',
+            Start => '$valuePtr + 6',
+            ByteOrder => 'Unknown',
+            FixBase => 1, # necessary for AVI and MOV videos
+        },
+    },
+    {
+        # The Fuji maker notes use a structure similar to a self-contained
+        # TIFF file, but with "FUJIFILM" instead of the standard TIFF header
+        Name => 'MakerNoteFujiFilm',
+        # (starts with "FUJIFILM" -- also used by some Leica, Minolta and Sharp models)
+        # (GE FujiFilm models start with "GENERALE")
+        Condition => '$$valPt =~ /^(FUJIFILM|GENERALE)/',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::FujiFilm::Main',
+            # there is an 8-byte maker tag (FUJIFILM) we must skip over
+            OffsetPt => '$valuePtr+8',
+            # the pointers are relative to the subdirectory start
+            # (before adding the offsetPt) - PH
+            Base => '$start',
+            ByteOrder => 'LittleEndian',
+        },
+    },
+    {
+        Name => 'MakerNoteGE',
+        Condition => '$$valPt =~ /^GE(\0\0|NIC\0)/',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::GE::Main',
+            Start => '$valuePtr + 18',
+            FixBase => 1,
+            AutoFix => 1,
+            ByteOrder => 'Unknown',
+       },
+    },
+    {
+        Name => 'MakerNoteGE2',
+        Condition => '$$valPt =~ /^GE\x0c\0\0\0\x16\0\0\0/',
+        # Note: we will get a "Maker notes could not be parsed" warning when writing
+        #       these maker notes because they aren't currently supported for writing
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::FujiFilm::Main',
+            ProcessProc => \&ProcessGE2,
+            Start => '$valuePtr + 12',
+            Base => '$start - 6',
+            ByteOrder => 'LittleEndian',
+            # hard patch for crazy offsets
+            FixOffsets => '$valuePtr -= 210 if $tagID >= 0x1303',
+       },
+    },
+    # (the GE X5 has really messed up EXIF-like maker notes starting with
+    #  "GENIC\x0c\0" --> currently not decoded)
+    {
+        Name => 'MakerNoteHP',  # PhotoSmart 720 (also Vivitar 3705, 3705B and 3715)
+        Condition => '$$valPt =~ /^(Hewlett-Packard|Vivitar)/',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::HP::Main',
+            ProcessProc => \&ProcessUnknown,
+            ByteOrder => 'Unknown',
+        },
+    },
+    {
+        Name => 'MakerNoteHP2', # PhotoSmart E427
+        # (this type of maker note also used by BenQ, Mustek, Sanyo, Traveler and Vivitar)
+        Condition => '$$valPt =~ /^610[\0-\4]/',
+        NotIFD => 1,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::HP::Type2',
+            Start => '$valuePtr',
+            ByteOrder => 'LittleEndian',
+        },
+    },
+    {
+        Name => 'MakerNoteHP4', # PhotoSmart M627
+        Condition => '$$valPt =~ /^IIII\x04\0/',
+        NotIFD => 1,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::HP::Type4',
+            Start => '$valuePtr',
+            ByteOrder => 'LittleEndian',
+        },
+    },
+    {
+        Name => 'MakerNoteHP6', # PhotoSmart M425, M525 and M527
+        Condition => '$$valPt =~ /^IIII\x06\0/',
+        NotIFD => 1,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::HP::Type6',
+            Start => '$valuePtr',
+            ByteOrder => 'LittleEndian',
+        },
+    },
+    {
+        Name => 'MakerNoteISL', # (used in Samsung GX20 samples)
+        Condition => '$$valPt =~ /^ISLMAKERNOTE000\0/',
+        # this maker notes starts with a TIFF-like header at offset 0x10
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Unknown::Main',
+            Start => '$valuePtr + 24',
+            Base => '$start - 8',
+            ByteOrder => 'Unknown',
+        },
+    },
+    {
+        Name => 'MakerNoteJVC',
+        Condition => '$$valPt=~/^JVC /',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::JVC::Main',
+            Start => '$valuePtr + 4',
+            ByteOrder => 'Unknown',
+        },
+    },
+    {
+        Name => 'MakerNoteJVCText',
+        Condition => '$$self{Make}=~/^(JVC|Victor)/ and $$valPt=~/^VER:/',
+        NotIFD => 1,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::JVC::Text',
+        },
+    },
+    {
+        Name => 'MakerNoteKodak1a',
+        Condition => '$$self{Make}=~/^EASTMAN KODAK/ and $$valPt=~/^KDK INFO/',
+        NotIFD => 1,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::Main',
+            Start => '$valuePtr + 8',
+            ByteOrder => 'BigEndian',
+        },
+    },
+    {
+        Name => 'MakerNoteKodak1b',
+        Condition => '$$self{Make}=~/^EASTMAN KODAK/ and $$valPt=~/^KDK/',
+        NotIFD => 1,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::Main',
+            Start => '$valuePtr + 8',
+            ByteOrder => 'LittleEndian',
+        },
+    },
+    {
+        # used by various Kodak, HP, Pentax and Minolta models
+        Name => 'MakerNoteKodak2',
+        Condition => q{
+            $$valPt =~ /^.{8}Eastman Kodak/s or
+            $$valPt =~ /^\x01\0[\0\x01]\0\0\0\x04\0[a-zA-Z]{4}/
+        },
+        NotIFD => 1,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::Type2',
+            ByteOrder => 'BigEndian',
+        },
+    },
+    {
+        # not much to key on here, but we know the
+        # upper byte of the year should be 0x07:
+        Name => 'MakerNoteKodak3',
+        Condition => q{
+            $$self{Make} =~ /^EASTMAN KODAK/ and
+            $$valPt =~ /^(?!MM|II).{12}\x07/s and
+            $$valPt !~ /^(MM|II|AOC)/
+        },
+        NotIFD => 1,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::Type3',
+            ByteOrder => 'BigEndian',
+        },
+    },
+    {
+        Name => 'MakerNoteKodak4',
+        Condition => q{
+            $$self{Make} =~ /^Eastman Kodak/ and
+            $$valPt =~ /^.{41}JPG/s and
+            $$valPt !~ /^(MM|II|AOC)/
+        },
+        NotIFD => 1,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::Type4',
+            ByteOrder => 'BigEndian',
+        },
+    },
+    {
+        Name => 'MakerNoteKodak5',
+        Condition => q{
+            $$self{Make}=~/^EASTMAN KODAK/ and
+            ($$self{Model}=~/CX(4200|4230|4300|4310|6200|6230)/ or
+            # try to pick up similar models we haven't tested yet
+            $$valPt=~/^\0(\x1a\x18|\x3a\x08|\x59\xf8|\x14\x80)\0/)
+        },
+        NotIFD => 1,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::Type5',
+            ByteOrder => 'BigEndian',
+        },
+    },
+    {
+        Name => 'MakerNoteKodak6a',
+        Condition => q{
+            $$self{Make}=~/^EASTMAN KODAK/ and
+            $$self{Model}=~/DX3215/
+        },
+        NotIFD => 1,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::Type6',
+            ByteOrder => 'BigEndian',
+        },
+    },
+    {
+        Name => 'MakerNoteKodak6b',
+        Condition => q{
+            $$self{Make}=~/^EASTMAN KODAK/ and
+            $$self{Model}=~/DX3700/
+        },
+        NotIFD => 1,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::Type6',
+            ByteOrder => 'LittleEndian',
+        },
+    },
+    {
+        Name => 'MakerNoteKodak7',
+        # look for something that looks like a serial number
+        # (confirmed serial numbers have the format KXXXX########, but we also
+        #  accept other strings from sample images that may be serial numbers)
+        Condition => q{
+            $$self{Make}=~/Kodak/i and
+            $$valPt =~ /^[CK][A-Z\d]{3} ?[A-Z\d]{1,2}\d{2}[A-Z\d]\d{4}[ \0]/
+        },
+        NotIFD => 1,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::Type7',
+            ByteOrder => 'LittleEndian',
+        },
+    },
+    {
+        Name => 'MakerNoteKodak8a',
+        # IFD-format maker notes: look for reasonable number of
+        # entries and check format and count of first IFD entry
+        Condition => q{
+            $$self{Make}=~/Kodak/i and
+            ($$valPt =~ /^\0[\x02-\x7f]..\0[\x01-\x0c]\0\0/s or
+             $$valPt =~ /^[\x02-\x7f]\0..[\x01-\x0c]\0..\0\0/s)
+        },
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::Type8',
+            ProcessProc => \&ProcessUnknown,
+            ByteOrder => 'Unknown',
+        },
+    },
+    {
+        Name => 'MakerNoteKodak8b',
+        # TIFF-format maker notes
+        Condition => q{
+            $$self{Make}=~/Kodak/i and
+            $$valPt =~ /^(MM\0\x2a\0\0\0\x08|II\x2a\0\x08\0\0\0)/
+        },
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::Type8',
+            ProcessProc => \&ProcessUnknown,
+            ByteOrder => 'Unknown',
+            Start => '$valuePtr + 8',
+            Base => '$start - 8',
+        },
+    },
+    {
+        Name => 'MakerNoteKodak9',
+        # test header and Kodak:DateTimeOriginal
+        Condition => '$$valPt =~ m{^IIII[\x02\x03]\0.{14}\d{4}/\d{2}/\d{2} }s',
+        NotIFD => 1,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::Type9',
+            ByteOrder => 'LittleEndian',
+        },
+    },
+    {
+        Name => 'MakerNoteKodak10',
+        # yet another type of Kodak IFD-format maker notes:
+        # this type begins with a byte order indicator,
+        # followed immediately by the IFD
+        Condition => q{
+            $$self{Make}=~/Kodak/i and
+            $$valPt =~ /^(MM\0[\x02-\x7f]|II[\x02-\x7f]\0)/
+        },
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::Type10',
+            ProcessProc => \&ProcessUnknown,
+            ByteOrder => 'Unknown',
+            Start => '$valuePtr + 2',
+        },
+    },
+    {
+        Name => 'MakerNoteKodakUnknown',
+        Condition => '$$self{Make}=~/Kodak/i and $$valPt!~/^AOC\0/',
+        NotIFD => 1,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Kodak::Unknown',
+            ByteOrder => 'BigEndian',
+        },
+    },
+    {
+        Name => 'MakerNoteKyocera',
+        # (starts with "KYOCERA")
+        Condition => '$$valPt =~ /^KYOCERA/',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Unknown::Main',
+            Start => '$valuePtr + 22',
+            Base => '$start + 2',
+            EntryBased => 1,
+            ByteOrder => 'Unknown',
+        },
+    },
+    {
+        Name => 'MakerNoteMinolta',
+        Condition => q{
+            $$self{Make}=~/^(Konica Minolta|Minolta)/i and
+            $$valPt !~ /^(MINOL|CAMER|MLY0|KC|\+M\+M|\xd7)/
+        },
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Minolta::Main',
+            ByteOrder => 'Unknown',
+        },
+    },
+    {
+        # the DiMAGE E323 (MINOL) and E500 (CAMER), and some models
+        # of Mustek, Pentax, Ricoh and Vivitar (CAMER).
+        Name => 'MakerNoteMinolta2',
+        Condition => '$$valPt =~ /^(MINOL|CAMER)\0/ and $$self{OlympusCAMER} = 1',
+        SubDirectory => {
+            # these models use Olympus tags in the range 0x200-0x221 plus 0xf00
+            TagTable => 'Image::ExifTool::Olympus::Main',
+            Start => '$valuePtr + 8',
+            ByteOrder => 'Unknown',
+        },
+    },
+    {
+        # /^MLY0/ - DiMAGE G400, G500, G530, G600
+        # /^KC/   - Revio KD-420Z, DiMAGE E203
+        # /^+M+M/ - DiMAGE E201
+        # /^\xd7/ - DiMAGE RD3000
+        Name => 'MakerNoteMinolta3',
+        Condition => '$$self{Make} =~ /^(Konica Minolta|Minolta)/i',
+        Binary => 1,
+        Notes => 'not EXIF-based',
+    },
+    {
+        # this maker notes starts with a standard TIFF header at offset 0x0a
+        Name => 'MakerNoteNikon',
+        Condition => '$$self{Make}=~/^NIKON/i and $$valPt=~/^Nikon\x00\x02/',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Nikon::Main',
+            Start => '$valuePtr + 18',
+            Base => '$start - 8',
+            ByteOrder => 'Unknown',
+        },
+    },
+    {
+        # older Nikon maker notes
+        Name => 'MakerNoteNikon2',
+        Condition => '$$self{Make}=~/^NIKON/ and $$valPt=~/^Nikon\x00\x01/',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Nikon::Type2',
+            Start => '$valuePtr + 8',
+            ByteOrder => 'LittleEndian',
+        },
+    },
+    {
+        # headerless Nikon maker notes
+        Name => 'MakerNoteNikon3',
+        Condition => '$$self{Make}=~/^NIKON/i',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Nikon::Main',
+            ByteOrder => 'Unknown', # most are little-endian, but D1 is big
+        },
+    },
+    {
+        Name => 'MakerNoteOlympus',
+        # (if Make is 'SEIKO EPSON CORP.', starts with "EPSON\0")
+        # (if Make is 'OLYMPUS OPTICAL CO.,LTD' or 'OLYMPUS CORPORATION',
+        #  starts with "OLYMP\0")
+        Condition => '$$valPt =~ /^(OLYMP|EPSON)\0/',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Olympus::Main',
+            Start => '$valuePtr + 8',
+            ByteOrder => 'Unknown',
+        },
+    },
+    {
+        Name => 'MakerNoteOlympus2',
+        # new Olympus maker notes start with "OLYMPUS\0"
+        Condition => '$$valPt =~ /^OLYMPUS\0/',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Olympus::Main',
+            Start => '$valuePtr + 12',
+            Base => '$start - 12',
+            ByteOrder => 'Unknown',
+        },
+    },
+    {
+        Name => 'MakerNoteLeica',
+        # (starts with "LEICA\0\0\0")
+        Condition => '$$self{Make} eq "LEICA"',
+        SubDirectory => {
+            # many Leica models use the same format as Panasonic
+            TagTable => 'Image::ExifTool::Panasonic::Main',
+            Start => '$valuePtr + 8',
+            ByteOrder => 'Unknown',
+        },
+    },
+    {
+        Name => 'MakerNoteLeica2', # used by the M8
+        # (starts with "LEICA\0\0\0")
+        Condition => '$$self{Make} =~ /^Leica Camera AG/ and $$valPt =~ /^LEICA\0\0\0/',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Panasonic::Leica2',
+            # (the offset base is different in JPEG and DNG images, but we
+            # can copy makernotes from one to the other, so we need special
+            # logic to decide which base to apply)
+            ProcessProc => \&FixLeicaBase,
+            Start => '$valuePtr + 8',
+            Base => '$start', # (- 8 for DNG images!)
+            ByteOrder => 'Unknown',
+        },
+    },
+    {
+        Name => 'MakerNoteLeica3', # used by the R8 and R9
+        # (starts with IFD)
+        Condition => '$$self{Make} =~ /^Leica Camera AG/ and $$valPt !~ /^LEICA/ and $$self{Model} ne "S2"',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Panasonic::Leica3',
+            Start => '$valuePtr',
+            ByteOrder => 'Unknown',
+        },
+    },
+    {
+        Name => 'MakerNoteLeica4', # used by the M9
+        # (M9 starts with "LEICA0\x03\0")
+        Condition => '$$self{Make} =~ /^Leica Camera AG/ and $$valPt =~ /^LEICA0/',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Panasonic::Leica4',
+            Start => '$valuePtr + 8',
+            Base => '$start - 8', # (yay! Leica fixed the M8 problem)
+            ByteOrder => 'Unknown',
+        },
+    },
+    {
+        Name => 'MakerNoteLeica5', # used by the X1
+        # (X1 starts with "LEICA\0\x01\0", Make is "LEICA CAMERA AG")
+        Condition => '$$valPt =~ /^LEICA\0\x01\0/',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Panasonic::Leica5',
+            Start => '$valuePtr + 8',
+            Base => '$start - 8',
+            ByteOrder => 'Unknown',
+        },
+    },
+    {
+        Name => 'MakerNoteLeica6', # used by the S2 (CAUTION: this tag name is special cased in the code)
+        # (S2 starts with "LEICA\0\x02\xff", Make is "LEICA CAMERA AG",
+        #  but maker notes aren't loaded at the time this is tested)
+        Condition => '$$self{Model} eq "S2"',
+        DataTag => 'LeicaTrailer',  # (generates fixup name for this tag)
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Panasonic::Leica6',
+            Start => '$valuePtr + 8',
+            ByteOrder => 'Unknown',
+            # NOTE: Leica uses absolute file offsets when this maker note is stored
+            # as a JPEG trailer -- this case is handled by ProcessLeicaTrailer in
+            # Panasonic.pm, and any "Base" defined here is ignored for this case.
+            # ExifTool may also create S2 maker notes inside the APP1 segment when
+            # copying from other files, and for this the normal EXIF offsets are used,
+            # Base should not be defined!
+        },
+    },
+    {
+        Name => 'MakerNotePanasonic',
+        # (starts with "Panasonic\0")
+        Condition => '$$valPt=~/^Panasonic/',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Panasonic::Main',
+            Start => '$valuePtr + 12',
+            ByteOrder => 'Unknown',
+        },
+    },
+    {
+        Name => 'MakerNotePanasonic2',
+        # (starts with "Panasonic\0")
+        Condition => '$$self{Make}=~/^Panasonic/ and $$valPt=~/^MKE/',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Panasonic::Type2',
+            ByteOrder => 'LittleEndian',
+        },
+    },
+    {
+        Name => 'MakerNotePentax',
+        # (starts with "AOC\0", but so does MakerNotePentax3)
+        # (also used by some Samsung models)
+        Condition => q{
+            $$valPt=~/^AOC\0/ and
+            $$self{Model} !~ /^PENTAX Optio ?[34]30RS\s*$/
+        },
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Pentax::Main',
+            # process as Unknown maker notes because the start offset and
+            # byte ordering are so variable
+            ProcessProc => \&ProcessUnknown,
+            # offsets can be totally whacky for Pentax maker notes,
+            # so attempt to fix the offset base if possible
+            FixBase => 1,
+            ByteOrder => 'Unknown',
+        },
+    },
+    {
+        Name => 'MakerNotePentax2',
+        # (starts with an IFD)
+        # Casio-like maker notes used only by the Optio 330 and 430
+        Condition => '$$self{Make}=~/^Asahi/ and $$valPt!~/^AOC\0/',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Pentax::Type2',
+            ProcessProc => \&ProcessUnknown,
+            FixBase => 1,
+            ByteOrder => 'Unknown',
+        },
+    },
+    {
+        Name => 'MakerNotePentax3',
+        # (starts with "AOC\0", like the more common Pentax maker notes)
+        # Casio maker notes used only by the Optio 330RS and 430RS
+        Condition => '$$self{Make}=~/^Asahi/',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Casio::Type2',
+            ProcessProc => \&ProcessUnknown,
+            FixBase => 1,
+            ByteOrder => 'Unknown',
+        },
+    },
+    {
+        Name => 'MakerNotePentax4',
+        # (starts with 3 or 4 digits)
+        # HP2-like text-based maker notes used by Optio E20
+        Condition => '$$self{Make}=~/^PENTAX/ and $$valPt=~/^\d{3}/',
+        NotIFD => 1,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Pentax::Type4',
+            Start => '$valuePtr',
+            ByteOrder => 'LittleEndian',
+        },
+    },
+    {
+        Name => 'MakerNotePentax5',
+        # (starts with "PENTAX \0")
+        Condition => '$$valPt=~/^PENTAX \0/',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Pentax::Main',
+            Start => '$valuePtr + 10',
+            Base => '$start - 10',
+            ByteOrder => 'Unknown',
+        },
+    },
+    {
+        Name => 'MakerNotePhaseOne',
+        # Starts with: 'IIIITwaR' or 'IIIICwaR' (have seen both written by P25)
+        # (have also seen code which expects 'MMMMRawT')
+        Condition => q{
+            return undef unless $$valPt =~ /^(IIII.waR|MMMMRaw.)/s;
+            $self->OverrideFileType($$self{TIFF_TYPE} = 'IIQ') if $count > 1000000;
+            return 1;
+        },
+        NotIFD => 1,
+        Binary => 1,
+        PutFirst => 1, # place immediately after TIFF header
+        Notes => 'the raw image data in PhaseOne IIQ images',
+    },
+    {
+        Name => 'MakerNoteReconyx',
+        Condition => '$$valPt =~ /^\x01\xf1[\x02\x03]\x00/',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Reconyx::Main',
+            ByteOrder => 'Little-endian',
+        },
+    },
+    {
+        Name => 'MakerNoteRicoh',
+        # (my test R50 image starts with "      \x02\x01" - PH)
+        Condition => '$$self{Make}=~/^RICOH/ and $$valPt=~/^(Ricoh|      )/i',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Ricoh::Main',
+            Start => '$valuePtr + 8',
+            ByteOrder => 'Unknown',
+        },
+    },
+    {
+        Name => 'MakerNoteRicohText',
+        Condition => '$$self{Make}=~/^RICOH/',
+        NotIFD => 1,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Ricoh::Text',
+            ByteOrder => 'Unknown',
+        },
+    },
+    {
+        Name => 'MakerNoteSamsung1a',
+        # Samsung STMN maker notes WITHOUT PreviewImage
+        Condition => '$$valPt =~ /^STMN\d{3}.\0{4}/s',
+        Binary => 1,
+        Notes => 'Samsung "STMN" maker notes without PreviewImage',
+    },
+    {
+        Name => 'MakerNoteSamsung1b',
+        # Samsung STMN maker notes WITH PreviewImage
+        Condition => '$$valPt =~ /^STMN\d{3}/',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Samsung::Type1',
+        },
+    },
+    {
+        Name => 'MakerNoteSamsung2',
+        # Samsung EXIF-format maker notes
+        Condition => q{
+            $$self{Make} eq 'SAMSUNG' and ($$self{TIFF_TYPE} eq 'SRW' or
+            $$valPt=~/^(\0.\0\x01\0\x07\0{3}\x04|.\0\x01\0\x07\0\x04\0{3})0100/s)
+        },
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Samsung::Type2',
+            # Samsung is very inconsistent here, and uses absolute offsets for some
+            # models and relative offsets for others, so process as Unknown
+            ProcessProc => \&ProcessUnknown,
+            FixBase => 1,
+            ByteOrder => 'Unknown',
+        },
+    },
+    {
+        Name => 'MakerNoteSanyo',
+        # (starts with "SANYO\0")
+        Condition => '$$self{Make}=~/^SANYO/ and $$self{Model}!~/^(C4|J\d|S\d)\b/',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Sanyo::Main',
+            Validate => '$val =~ /^SANYO/',
+            Start => '$valuePtr + 8',
+            ByteOrder => 'Unknown',
+        },
+    },
+    {
+        Name => 'MakerNoteSanyoC4',
+        # The C4 offsets are wrong by 12, so they must be fixed
+        Condition => '$$self{Make}=~/^SANYO/ and $$self{Model}=~/^C4\b/',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Sanyo::Main',
+            Validate => '$val =~ /^SANYO/',
+            Start => '$valuePtr + 8',
+            FixBase => 1,
+            ByteOrder => 'Unknown',
+        },
+    },
+    {
+        Name => 'MakerNoteSanyoPatch',
+        # The J1, J2, J4, S1, S3 and S4 offsets are completely screwy
+        Condition => '$$self{Make}=~/^SANYO/',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Sanyo::Main',
+            Validate => '$val =~ /^SANYO/',
+            Start => '$valuePtr + 8',
+            ByteOrder => 'Unknown',
+            FixOffsets => 'Image::ExifTool::Sanyo::FixOffsets($valuePtr, $valEnd, $size, $tagID, $wFlag)',
+        },
+    },
+    {
+        Name => 'MakerNoteSigma',
+        # (starts with "SIGMA\0")
+        Condition => '$$self{Make}=~/^(SIGMA|FOVEON)/',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Sigma::Main',
+            Validate => '$val =~ /^(SIGMA|FOVEON)/',
+            Start => '$valuePtr + 10',
+            ByteOrder => 'Unknown',
+        },
+    },
+    {
+        Name => 'MakerNoteSony',
+        # (starts with "SONY DSC \0" or "SONY CAM \0")
+        Condition => '$$self{Make}=~/^SONY/ and $$valPt=~/^SONY (DSC|CAM)/',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Sony::Main',
+            Start => '$valuePtr + 12',
+            ByteOrder => 'Unknown',
+        },
+    },
+    {
+        Name => 'MakerNoteSony2',
+        # (starts with "SONY PI\0" -- DSC-S650/S700/S750)
+        Condition => '$$self{Make}=~/^SONY/ and $$valPt=~/^SONY PI\0/ and $$self{OlympusCAMER}=1',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Olympus::Main',
+            Start => '$valuePtr + 12',
+            ByteOrder => 'Unknown',
+        },
+    },
+    {
+        Name => 'MakerNoteSony3',
+        # (starts with "PREMI\0" -- DSC-S45/S500)
+        Condition => '$$self{Make}=~/^SONY/ and $$valPt=~/^(PREMI)\0/ and $$self{OlympusCAMER}=1',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Olympus::Main',
+            Start => '$valuePtr + 8',
+            ByteOrder => 'Unknown',
+        },
+    },
+    {
+        Name => 'MakerNoteSony4', # used in SR2 and ARW images
+        Condition => '$$self{Make}=~/^SONY/ and $$valPt!~/^\x01\x00/',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Sony::Main',
+            Start => '$valuePtr',
+            ByteOrder => 'Unknown',
+        },
+    },
+    {
+        Name => 'MakerNoteSonyEricsson',
+        Condition => '$$valPt =~ /^SEMC MS\0/',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Sony::Ericsson',
+            Start => '$valuePtr + 20',
+            Base => '$start - 8',
+            ByteOrder => 'Unknown',
+        },
+    },
+    {
+        Name => 'MakerNoteSonySRF',
+        Condition => '$$self{Make}=~/^SONY/',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Sony::SRF',
+            Start => '$valuePtr',
+            ByteOrder => 'Unknown',
+        },
+    },
+    {
+        Name => 'MakerNoteUnknownText',
+        Condition => '$$valPt =~ /^[\x09\x0d\x0a\x20-\x7e]+\0*$/',
+        Notes => 'unknown text-based maker notes',
+        # show as binary if it is too long
+        ValueConv => 'length($val) > 64 ? \$val : $val',
+        ValueConvInv => '$val',
+    },
+    {
+        Name => 'MakerNoteUnknown',
+        PossiblePreview => 1,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Unknown::Main',
+            ProcessProc => \&ProcessUnknownOrPreview,
+            WriteProc => \&WriteUnknownOrPreview,
+            ByteOrder => 'Unknown',
+            FixBase => 2,
+       },
+    },
+);
+
+# insert writable properties so we can write our maker notes
+my $tagInfo;
+foreach $tagInfo (@Image::ExifTool::MakerNotes::Main) {
+    $$tagInfo{Writable} = 'undef';
+    $$tagInfo{WriteGroup} = 'ExifIFD';
+    $$tagInfo{Groups} = { 1 => 'MakerNotes' };
+    next unless $$tagInfo{SubDirectory};
+    # make all SubDirectory tags block-writable
+    $$tagInfo{Binary} = 1,
+    $$tagInfo{MakerNotes} = 1;
+}
+
+#------------------------------------------------------------------------------
+# Get normal offset of value data from end of maker note IFD
+# Inputs: 0) ExifTool object reference
+# Returns: Array: 0) relative flag (undef for no change)
+#                 1) normal offset from end of IFD to first value (empty if unknown)
+#                 2-N) other possible offsets used by some models
+# Notes: Directory size should be validated before calling this routine
+sub GetMakerNoteOffset($)
+{
+    my $exifTool = shift;
+    # figure out where we expect the value data based on camera type
+    my $make = $exifTool->{Make};
+    my $model = $exifTool->{Model};
+    my ($relative, @offsets);
+
+    # normally value data starts 4 bytes after end of directory, so this is the default.
+    # offsets of 0 and 4 are always allowed even if not specified,
+    # but the first offset specified is the one used when writing
+    if ($make =~ /^Canon/) {
+        push @offsets, ($model =~ /\b(20D|350D|REBEL XT|Kiss Digital N)\b/) ? 6 : 4;
+        # some Canon models (FV-M30, Optura50, Optura60) leave 24 unused bytes
+        # at the end of the IFD (2 spare IFD entries?)
+        push @offsets, 28 if $model =~ /\b(FV\b|OPTURA)/;
+        # some Canon PowerShot models leave 12 unused bytes
+        push @offsets, 16 if $model =~ /(PowerShot|IXUS|IXY)/;
+    } elsif ($make =~ /^CASIO/) {
+        # Casio AVI and MOV images use no padding, and their JPEG's use 4,
+        # except some models like the EX-S770,Z65,Z70,Z75 and Z700 which use 16,
+        # and the EX-Z35 which uses 2 (grrrr...)
+        push @offsets, $$exifTool{FILE_TYPE} =~ /^(RIFF|MOV)$/ ? 0 : (4, 16, 2);
+    } elsif ($make =~ /^(General Imaging Co.|GEDSC IMAGING CORP.)/i) {
+        push @offsets, 0;
+    } elsif ($make =~ /^KYOCERA/) {
+        push @offsets, 12;
+    } elsif ($make =~ /^Leica Camera AG/) {
+        if ($model eq 'S2') {
+            # lots of empty space before first value in S2 images
+            push @offsets, 4, ($$exifTool{FILE_TYPE} eq 'JPEG' ? 286 : 274);
+        } elsif ($model =~ /^(R8|R9|M8)\b/) {
+            push @offsets, 6;
+        } else {
+            push @offsets, 4;
+        }
+    } elsif ($make =~ /^OLYMPUS/ and $model =~ /^E-(1|300|330)\b/) {
+        push @offsets, 16;
+    } elsif ($make =~ /^OLYMPUS/ and
+        # these Olympus models are just weird
+        $model =~ /^(C2500L|C-1Z?|C-5000Z|X-2|C720UZ|C725UZ|C150|C2Z|E-10|E-20|FerrariMODEL2003|u20D|u10D)\b/)
+    {
+        # no expected offset --> determine offset empirically via FixBase()
+    } elsif ($make =~ /^(Panasonic|JVC)\b/) {
+        push @offsets, 0;
+    } elsif ($make =~ /^SONY/) {
+        # DSLR and "PREMI" models use an offset of 4
+        if ($model =~ /DSLR/ or $$exifTool{OlympusCAMER}) {
+            push @offsets, 4;
+        } else {
+            push @offsets, 0;
+        }
+    } elsif ($make eq 'FUJIFILM') {
+        # some models have offset of 6, so allow that too (A345,A350,A360,A370)
+        push @offsets, 4, 6;
+    } elsif ($make =~ /^TOSHIBA/) {
+        # similar to Canon, can also have 24 bytes of padding
+        push @offsets, 0, 24;
+    } elsif ($make =~ /^PENTAX/) {
+        push @offsets, 4;
+        # the Pentax addressing mode is determined automatically, but
+        # sometimes the algorithm gets it wrong, but Pentax always uses
+        # absolute addressing, so force it to be absolute
+        $relative = 0;
+    } elsif ($make =~ /^Konica Minolta/i) {
+        # patch for DiMAGE X50, Xg, Z2 and Z10
+        push @offsets, 4, -16;
+    } elsif ($make =~ /^Minolta/) {
+        # patch for DiMAGE 7, X20 and Z1
+        push @offsets, 4, -8, -12;
+    } else {
+        push @offsets, 4;   # the normal offset
+    }
+    return ($relative, @offsets);
+}
+
+#------------------------------------------------------------------------------
+# Get hash of value offsets / block sizes
+# Inputs: 0) Data pointer, 1) offset to start of directory,
+#         2) hash ref to return value pointers based on tag ID
+# Returns: 0) hash reference: keys are offsets, values are block sizes
+#          1) same thing, but with keys adjusted for value-based offsets
+# Notes: Directory size should be validated before calling this routine
+# - calculates MIN and MAX offsets in entry-based hash
+sub GetValueBlocks($$;$)
+{
+    my ($dataPt, $dirStart, $tagPtr) = @_;
+    my $numEntries = Get16u($dataPt, $dirStart);
+    my ($index, $valPtr, %valBlock, %valBlkAdj, $end);
+    for ($index=0; $index<$numEntries; ++$index) {
+        my $entry = $dirStart + 2 + 12 * $index;
+        my $format = Get16u($dataPt, $entry+2);
+        last if $format < 1 or $format > 13;
+        my $count = Get32u($dataPt, $entry+4);
+        my $size = $count * $Image::ExifTool::Exif::formatSize[$format];
+        next if $size <= 4;
+        $valPtr = Get32u($dataPt, $entry+8);
+        $tagPtr and $$tagPtr{Get16u($dataPt, $entry)} = $valPtr;
+        # save location and size of longest block at this offset
+        unless (defined $valBlock{$valPtr} and $valBlock{$valPtr} > $size) {
+            $valBlock{$valPtr} = $size;
+        }
+        # adjust for case of value-based offsets
+        $valPtr += 12 * $index;
+        unless (defined $valBlkAdj{$valPtr} and $valBlkAdj{$valPtr} > $size) {
+            $valBlkAdj{$valPtr} = $size;
+            my $end = $valPtr + $size;
+            if (defined $valBlkAdj{MIN}) {
+                # save minimum only if it has a value of 12 or greater
+                $valBlkAdj{MIN} = $valPtr if $valBlkAdj{MIN} < 12 or $valBlkAdj{MIN} > $valPtr;
+                $valBlkAdj{MAX} = $end if $valBlkAdj{MAX} > $end;
+            } else {
+                $valBlkAdj{MIN} = $valPtr;
+                $valBlkAdj{MAX} = $end;
+            }
+        }
+    }
+    return(\%valBlock, \%valBlkAdj);
+}
+
+#------------------------------------------------------------------------------
+# Fix base for value offsets in maker notes IFD (if necessary)
+# Inputs: 0) ExifTool object ref, 1) DirInfo hash ref
+# Return: amount of base shift (and $dirInfo Base and DataPos are updated,
+#         FixedBy is set if offsets fixed, and Relative or EntryBased may be set)
+sub FixBase($$)
+{
+    local $_;
+    my ($exifTool, $dirInfo) = @_;
+    # don't fix base if fixing offsets individually or if we don't want to fix them
+    return 0 if $$dirInfo{FixOffsets} or $$dirInfo{NoFixBase};
+
+    my $dataPt = $$dirInfo{DataPt};
+    my $dataPos = $$dirInfo{DataPos};
+    my $dirStart = $$dirInfo{DirStart} || 0;
+    my $entryBased = $$dirInfo{EntryBased};
+    my $dirName = $$dirInfo{DirName};
+    my $fixBase = $exifTool->Options('FixBase');
+    my $setBase = (defined $fixBase and $fixBase ne '') ? 1 : 0;
+    my ($fix, $fixedBy, %tagPtr);
+
+    # get hash of value block positions
+    my ($valBlock, $valBlkAdj) = GetValueBlocks($dataPt, $dirStart, \%tagPtr);
+    return 0 unless %$valBlock;
+    # get sorted list of value offsets
+    my @valPtrs = sort { $a <=> $b } keys %$valBlock;
+#
+# handle special case of Canon maker notes with TIFF footer containing original offset
+#
+    if ($$exifTool{Make} =~ /^Canon/ and $$dirInfo{DirLen} > 8) {
+        my $footerPos = $dirStart + $$dirInfo{DirLen} - 8;
+        my $footer = substr($$dataPt, $footerPos, 8);
+        if ($footer =~ /^(II\x2a\0|MM\0\x2a)/ and  # check for TIFF footer
+            substr($footer,0,2) eq GetByteOrder()) # validate byte ordering
+        {
+            my $oldOffset = Get32u(\$footer, 4);
+            my $newOffset = $dirStart + $dataPos;
+            if ($setBase) {
+                $fix = $fixBase;
+            } else {
+                $fix = $newOffset - $oldOffset;
+                return 0 unless $fix;
+                # Picasa and ACDSee have a bug where they update other offsets without
+                # updating the TIFF footer (PH - 2009/02/25), so test for this case:
+                # validate Canon maker note footer fix by checking offset of last value
+                my $maxPt = $valPtrs[-1] + $$valBlock{$valPtrs[-1]};
+                # compare to end of maker notes, taking 8-byte footer into account
+                my $endDiff = $dirStart + $$dirInfo{DirLen} - ($maxPt - $dataPos) - 8;
+                # ignore footer offset only if end difference is exactly correct
+                # (allow for possible padding byte, although I have never seen this)
+                if (not $endDiff or $endDiff == 1) {
+                    $exifTool->Warn('Canon maker note footer may be invalid (ignored)',1);
+                    return 0;
+                }
+            }
+            $exifTool->Warn("Adjusted $dirName base by $fix",1);
+            $$dirInfo{FixedBy} = $fix;
+            $$dirInfo{Base} += $fix;
+            $$dirInfo{DataPos} -= $fix;
+            return $fix;
+        }
+    }
+#
+# analyze value offsets to see if they need fixing.  The first task is to determine
+# the minimum valid offset used (this is tricky, because we have to weed out bad
+# offsets written by some cameras)
+#
+    my $minPt = $$dirInfo{MinOffset} = $valPtrs[0]; # if life were simple, this would be it
+    my $ifdLen = 2 + 12 * Get16u($$dirInfo{DataPt}, $dirStart);
+    my $ifdEnd = $dirStart + $ifdLen;
+    my ($relative, @offsets) = GetMakerNoteOffset($exifTool);
+    my $makeDiff = $offsets[0];
+    my $verbose = $exifTool->Options('Verbose');
+    my ($diff, $shift);
+
+    # calculate expected minimum value offset
+    my $expected = $dataPos + $ifdEnd + (defined $makeDiff ? $makeDiff : 4);
+    $debug and print "$expected expected\n";
+
+    # zero our counters
+    my ($countNeg12, $countZero, $countOverlap) = (0, 0, 0);
+    my ($valPtr, $last);
+    foreach $valPtr (@valPtrs) {
+        printf("%d - %d (%d)\n", $valPtr, $valPtr + $$valBlock{$valPtr},
+               $valPtr - ($last || 0)) if $debug;
+        if (defined $last) {
+            my $gap = $valPtr - $last;
+            if ($gap == 0 or $gap == 1) {
+                ++$countZero;
+            } elsif ($gap == -12 and not $entryBased) {
+                # you get this when value offsets are relative to the IFD entry
+                ++$countNeg12;
+            } elsif ($gap < 0) {
+                # any other negative difference indicates overlapping values
+                ++$countOverlap if $valPtr; # (but ignore zero value pointers)
+            } elsif ($gap >= $ifdLen) {
+                # ignore previous minimum if we took a jump to near the expected value
+                # (some values can be stored before the IFD)
+                $minPt = $valPtr if abs($valPtr - $expected) <= 4;
+            }
+            # an offset less than 12 is surely garbage, so ignore it
+            $minPt = $valPtr if $minPt < 12;
+        }
+        $last = $valPtr + $$valBlock{$valPtr};
+    }
+    # could this IFD be using entry-based offsets?
+    if ((($countNeg12 > $countZero and $$valBlkAdj{MIN} >= $ifdLen - 2) or
+         ($$valBlkAdj{MIN} == $ifdLen - 2 or $$valBlkAdj{MIN} == $ifdLen + 2)
+        ) and $$valBlkAdj{MAX} <= $$dirInfo{DirLen}-2)
+    {
+        # looks like these offsets are entry-based, so use the offsets
+        # which have been correcting for individual entry position
+        $entryBased = 1;
+        $verbose and $exifTool->Warn("$dirName offsets are entry-based",1);
+    } else {
+        # calculate offset difference from end of IFD to first value
+        $diff = ($minPt - $dataPos) - $ifdEnd;
+        $shift = 0;
+        $countOverlap and $exifTool->Warn("Overlapping $dirName values",1);
+        if ($entryBased) {
+            $exifTool->Warn("$dirName offsets do NOT look entry-based",1);
+            undef $entryBased;
+            undef $relative;
+        }
+        # use PrintIM tag to do special check for correct absolute offsets
+        if ($tagPtr{0xe00}) {
+            my $ptr = $tagPtr{0xe00} - $dataPos;
+            return 0 if $ptr > 0 and $ptr <= length($$dataPt) - 8 and
+                        substr($$dataPt, $ptr, 8) eq "PrintIM\0";
+        }
+        # allow a range of reasonable differences for Unknown maker notes
+        if ($$dirInfo{FixBase} and $$dirInfo{FixBase} == 2) {
+            return 0 if $diff >=0 and $diff <= 24;
+        }
+        # (used for testing to extract differences)
+        # $exifTool->FoundTag('Diff', $diff);
+    }
+#
+# handle entry-based offsets
+#
+    if ($entryBased) {
+        $debug and print "--> entry-based!\n";
+        # most of my entry-based samples have first value immediately
+        # after last IFD entry (ie. no padding or next IFD pointer)
+        $makeDiff = 0;
+        push @offsets, 4;   # but some do have a next IFD pointer
+        # corrected entry-based offsets are relative to start of first entry
+        my $expected = 12 * Get16u($$dirInfo{DataPt}, $dirStart);
+        $diff = $$valBlkAdj{MIN} - $expected;
+        # set up directory to read values with entry-based offsets
+        # (ignore everything and set base to start of first entry)
+        $shift = $dataPos + $dirStart + 2;
+        $$dirInfo{Base} += $shift;
+        $$dirInfo{DataPos} -= $shift;
+        $$dirInfo{EntryBased} = 1;
+        $$dirInfo{Relative} = 1;    # entry-based offsets are relative
+        delete $$dirInfo{FixBase};  # no automatic base fix
+        undef $fixBase unless $setBase;
+    }
+#
+# return without doing shift if offsets look OK
+#
+    unless ($setBase) {
+        # don't try to fix offsets for whacky cameras
+        return $shift unless defined $makeDiff;
+        # normal value data starts 4 bytes after IFD, but allow 0 or 4...
+        return $shift if $diff == 0 or $diff == 4;
+        # also check for allowed make-specific differences
+        foreach (@offsets) {
+            return $shift if $diff == $_;
+        }
+    }
+#
+# apply the fix, or issue a warning
+#
+    # use default padding of 4 bytes unless already specified
+    $makeDiff = 4 unless defined $makeDiff;
+    $fix = $makeDiff - $diff;   # assume standard diff for this make
+
+    if ($$dirInfo{FixBase}) {
+        # set flag if offsets are relative (base is at or above directory start)
+        if ($dataPos - $fix + $dirStart <= 0) {
+            $$dirInfo{Relative} = (defined $relative) ? $relative : 1;
+        }
+        if ($setBase) {
+            $fixedBy = $fixBase;
+            $fix += $fixBase;
+        }
+    } elsif (defined $fixBase) {
+        $fix = $fixBase if $fixBase ne '';
+        $fixedBy = $fix;
+    } else {
+        # print warning unless difference looks reasonable
+        if ($diff < 0 or $diff > 16 or ($diff & 0x01)) {
+            $exifTool->Warn("Possibly incorrect maker notes offsets (fix by $fix?)",1);
+        }
+        # don't do the fix (but we already adjusted base if entry-based)
+        return $shift;
+    }
+    if (defined $fixedBy) {
+        $exifTool->Warn("Adjusted $dirName base by $fixedBy",1);
+        $$dirInfo{FixedBy} = $fixedBy;
+    }
+    $$dirInfo{Base} += $fix;
+    $$dirInfo{DataPos} -= $fix;
+    return $fix + $shift;
+}
+
+#------------------------------------------------------------------------------
+# Find start of IFD in unknown maker notes
+# Inputs: 0) reference to directory information
+# Returns: offset to IFD on success, undefined otherwise
+# - dirInfo may contain TagInfo reference for tag associated with directory
+# - on success, updates DirStart, DirLen, Base and DataPos in dirInfo
+# - also sets Relative flag in dirInfo if offsets are relative to IFD
+# Note: Changes byte ordering!
+sub LocateIFD($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dirStart = $$dirInfo{DirStart} || 0;
+    # (ignore MakerNotes DirLen since sometimes this is incorrect)
+    my $size = $$dirInfo{DataLen} - $dirStart;
+    my $dirLen = $$dirInfo{DirLen} || $size;
+    my $tagInfo = $$dirInfo{TagInfo};
+    my $ifdOffsetPos;
+    # the IFD should be within the first 32 bytes
+    # (Kyocera sets the current record at 22 bytes)
+    my ($firstTry, $lastTry) = (0, 32);
+
+    # make sure Base and DataPos are defined
+    $$dirInfo{Base} or $$dirInfo{Base} = 0;
+    $$dirInfo{DataPos} or $$dirInfo{DataPos} = 0;
+#
+# use tag information (if provided) to determine directory location
+#
+    if ($tagInfo and $$tagInfo{SubDirectory}) {
+        my $subdir = $$tagInfo{SubDirectory};
+        unless ($$subdir{ProcessProc} and 
+               ($$subdir{ProcessProc} eq \&ProcessUnknown or
+                $$subdir{ProcessProc} eq \&ProcessUnknownOrPreview))
+        {
+            # look for the IFD at the "Start" specified in our SubDirectory information
+            my $valuePtr = $dirStart;
+            my $newStart = $dirStart;
+            if (defined $$subdir{Start}) {
+                #### eval Start ($valuePtr)
+                $newStart = eval($$subdir{Start});
+            }
+            if ($$subdir{Base}) {
+                # calculate subdirectory start relative to $base for eval
+                my $start = $newStart + $$dirInfo{DataPos};
+                my $base = $$dirInfo{Base} || 0;
+                #### eval Base ($start,$base)
+                my $baseShift = eval($$subdir{Base});
+                # shift directory base (note: we may do this again below
+                # if an OffsetPt is defined, but that doesn't matter since
+                # the base shift is relative to DataPos, which we set too)
+                $$dirInfo{Base} += $baseShift;
+                $$dirInfo{DataPos} -= $baseShift;
+                # this is a relative directory if Base depends on $start
+                if ($$subdir{Base} =~ /\$start\b/) {
+                    $$dirInfo{Relative} = 1;
+                    # hack to fix Leica quirk
+                    if ($$subdir{ProcessProc} and $$subdir{ProcessProc} eq \&FixLeicaBase) {
+                        my $oldStart = $$dirInfo{DirStart};
+                        $$dirInfo{DirStart} = $newStart;
+                        FixLeicaBase($exifTool, $dirInfo);
+                        $$dirInfo{DirStart} = $oldStart;
+                    }
+                }
+            }
+            # add offset to the start of the directory if necessary
+            if ($$subdir{OffsetPt}) {
+                if ($$subdir{ByteOrder} =~ /^Little/i) {
+                    SetByteOrder('II');
+                } elsif ($$subdir{ByteOrder} =~ /^Big/i) {
+                    SetByteOrder('MM');
+                } else {
+                    warn "Can't have variable byte ordering for SubDirectories using OffsetPt\n";
+                    return undef;
+                }
+                #### eval OffsetPt ($valuePtr)
+                $ifdOffsetPos = eval($$subdir{OffsetPt}) - $dirStart;
+            }
+            # pinpoint position to look for this IFD
+            $firstTry = $lastTry = $newStart - $dirStart;
+        }
+    }
+#
+# scan for something that looks like an IFD
+#
+    if ($dirLen >= 14 + $firstTry) {  # minimum size for an IFD
+        my $offset;
+IFD_TRY: for ($offset=$firstTry; $offset<=$lastTry; $offset+=2) {
+            last if $offset + 14 > $dirLen;    # 14 bytes is minimum size for an IFD
+            my $pos = $dirStart + $offset;
+#
+# look for a standard TIFF header (Nikon uses it, others may as well),
+#
+            if (SetByteOrder(substr($$dataPt, $pos, 2)) and
+                Get16u($dataPt, $pos + 2) == 0x2a)
+            {
+                $ifdOffsetPos = 4;
+            }
+            if (defined $ifdOffsetPos) {
+                # get pointer to IFD
+                my $ptr = Get32u($dataPt, $pos + $ifdOffsetPos);
+                if ($ptr >= $ifdOffsetPos + 4 and $ptr + $offset + 14 <= $dirLen) {
+                    # shift directory start and shorten dirLen accordingly
+                    $$dirInfo{DirStart} += $ptr + $offset;
+                    $$dirInfo{DirLen} -= $ptr + $offset;
+                    # shift pointer base to the start of the TIFF header
+                    my $shift = $$dirInfo{DataPos} + $dirStart + $offset;
+                    $$dirInfo{Base} += $shift;
+                    $$dirInfo{DataPos} -= $shift;
+                    $$dirInfo{Relative} = 1;   # set "relative offsets" flag
+                    return $ptr + $offset;
+                }
+                undef $ifdOffsetPos;
+            }
+#
+# look for a standard IFD (starts with 2-byte entry count)
+#
+            my $num = Get16u($dataPt, $pos);
+            next unless $num;
+            # number of entries in an IFD should be between 1 and 255
+            if (!($num & 0xff)) {
+                # lower byte is zero -- byte order could be wrong
+                ToggleByteOrder();
+                $num >>= 8;
+            } elsif ($num & 0xff00) {
+                # upper byte isn't zero -- not an IFD
+                next;
+            }
+            my $bytesFromEnd = $size - ($offset + 2 + 12 * $num);
+            if ($bytesFromEnd < 4) {
+                next unless $bytesFromEnd == 2 or $bytesFromEnd == 0;
+            }
+            # do a quick validation of all format types
+            my $index;
+            for ($index=0; $index<$num; ++$index) {
+                my $entry = $pos + 2 + 12 * $index;
+                my $format = Get16u($dataPt, $entry+2);
+                my $count = Get32u($dataPt, $entry+4);
+                # allow everything to be zero if not first entry
+                # because some manufacturers pad with null entries
+                next unless $format or $count or $index == 0;
+                # patch for Canon EOS 40D firmware 1.0.4 bug: allow zero format for last entry
+                next if $format==0 and $index==$num-1 and $$exifTool{Model}=~/EOS 40D/;
+                # (would like to verify tag ID, but some manufactures don't
+                #  sort entries in order of tag ID so we don't have much of
+                #  a handle to verify this field)
+                # verify format
+                next IFD_TRY if $format < 1 or $format > 13;
+                # count must be reasonable (can't test for zero count because
+                # cameras like the 1DmkIII use this value)
+                next IFD_TRY if $count & 0xff000000;
+                # extra tests to avoid mis-identifying Samsung makernotes (GT-I9000, etc)
+                next unless $num == 1;
+                my $valueSize = $count * $Image::ExifTool::Exif::formatSize[$format];
+                if ($valueSize > 4) {
+                    next IFD_TRY if $valueSize > $size;
+                    my $valuePtr = Get32u($dataPt, $entry+8);
+                    next IFD_TRY if $valuePtr > 0x10000;
+                }
+            }
+            $$dirInfo{DirStart} += $offset;    # update directory start
+            $$dirInfo{DirLen} -= $offset;
+            return $offset;   # success!!
+        }
+    }
+    return undef;
+}
+
+#------------------------------------------------------------------------------
+# Fix base offset for Leica maker notes
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success, and updates $dirInfo if necessary for new directory
+sub FixLeicaBase($$;$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dirStart = $$dirInfo{DirStart} || 0;
+    # get hash of value block positions
+    my ($valBlock, $valBlkAdj) = GetValueBlocks($dataPt, $dirStart);
+    if (%$valBlock) {
+        # get sorted list of value offsets
+        my @valPtrs = sort { $a <=> $b } keys %$valBlock;
+        my $numEntries = Get16u($dataPt, $dirStart);
+        my $diff = $valPtrs[0] - ($numEntries * 12 + 4);
+        if ($diff > 8) {
+            $$dirInfo{Base} -= 8;
+            $$dirInfo{DataPos} += 8;
+        }
+    }
+    my $success = 1;
+    if ($tagTablePtr) {
+        $success = Image::ExifTool::Exif::ProcessExif($exifTool, $dirInfo, $tagTablePtr);
+    }
+    return $success;
+}
+
+#------------------------------------------------------------------------------
+# Process Canon maker notes
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessCanon($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    # identify Canon MakerNote footer in HtmlDump
+    # (this code moved from FixBase so it also works for Adobe MakN in DNG images)
+    if ($$exifTool{HTML_DUMP} and $$dirInfo{DirLen} > 8) {
+        my $dataPos = $$dirInfo{DataPos};
+        my $dirStart = $$dirInfo{DirStart} || 0;
+        my $footerPos = $dirStart + $$dirInfo{DirLen} - 8;
+        my $footer = substr(${$$dirInfo{DataPt}}, $footerPos, 8);
+        if ($footer =~ /^(II\x2a\0|MM\0\x2a)/ and substr($footer,0,2) eq GetByteOrder()) {
+            my $oldOffset = Get32u(\$footer, 4);
+            my $newOffset = $dirStart + $dataPos;
+            my $str = sprintf('Original maker note offset: 0x%.4x', $oldOffset);
+            if ($oldOffset != $newOffset) {
+                $str .= sprintf("\nCurrent maker note offset: 0x%.4x", $newOffset);
+            }
+            my $filePos = ($$dirInfo{Base} || 0) + $dataPos + $footerPos;
+            $exifTool->HDump($filePos, 8, '[Canon MakerNotes footer]', $str);
+        }
+    }
+    # process as normal
+    return Image::ExifTool::Exif::ProcessExif($exifTool, $dirInfo, $tagTablePtr);
+}
+
+#------------------------------------------------------------------------------
+# Process GE type 2 maker notes
+# Inputs: 0) ExifTool object ref, 1) DirInfo ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessGE2($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt} or return 0;
+    my $dirStart = $$dirInfo{DirStart} || 0;
+
+    # these maker notes are missing the IFD entry count, but they
+    # always have 25 entries, so write the entry count manually
+    Set16u(25, $dataPt, $dirStart);
+    return Image::ExifTool::Exif::ProcessExif($exifTool, $dirInfo, $tagTablePtr);
+}
+
+#------------------------------------------------------------------------------
+# Process unknown maker notes or PreviewImage
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success, and updates $dirInfo if necessary for new directory
+sub ProcessUnknownOrPreview($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dirStart = $$dirInfo{DirStart};
+    my $dirLen = $$dirInfo{DirLen};
+    # check to see if this is a preview image
+    if ($dirLen > 6 and substr($$dataPt, $dirStart, 3) eq "\xff\xd8\xff") {
+        $exifTool->VerboseDir('PreviewImage');
+        if ($$exifTool{HTML_DUMP}) {
+            my $pos = $$dirInfo{DataPos} + $$dirInfo{Base} + $dirStart;
+            $exifTool->HDump($pos, $dirLen, '(MakerNotes:PreviewImage data)', "Size: $dirLen bytes")
+        }
+        $exifTool->FoundTag('PreviewImage', substr($$dataPt, $dirStart, $dirLen));
+        return 1;
+    }
+    return ProcessUnknown($exifTool, $dirInfo, $tagTablePtr);
+}
+
+#------------------------------------------------------------------------------
+# Write unknown maker notes or PreviewImage
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: directory data, '' to delete, or undef on error
+sub WriteUnknownOrPreview($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dirStart = $$dirInfo{DirStart};
+    my $dirLen = $$dirInfo{DirLen};
+    my $newVal;
+    # check to see if this is a preview image
+    if ($dirLen > 6 and substr($$dataPt, $dirStart, 3) eq "\xff\xd8\xff") {
+        if ($$exifTool{NEW_VALUE}{$Image::ExifTool::Extra{PreviewImage}}) {
+            # write or delete new preview (if deleted, it can't currently be added back again)
+            $newVal = $exifTool->GetNewValues('PreviewImage') || '';
+            if ($exifTool->Options('Verbose') > 1) {
+                $exifTool->VerboseValue("- MakerNotes:PreviewImage", substr($$dataPt, $dirStart, $dirLen));
+                $exifTool->VerboseValue("+ MakerNotes:PreviewImage", $newVal) if $newVal;
+            }
+            ++$$exifTool{CHANGED};
+        } else {
+            $newVal = substr($$dataPt, $dirStart, $dirLen);
+        }
+    } else {
+        # rewrite MakerNote IFD
+        $newVal = Image::ExifTool::Exif::WriteExif($exifTool, $dirInfo, $tagTablePtr);
+    }
+    return $newVal;
+}
+
+#------------------------------------------------------------------------------
+# Process unknown maker notes assuming it is in EXIF IFD format
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success, and updates $dirInfo if necessary for new directory
+sub ProcessUnknown($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $success = 0;
+
+    my $loc = LocateIFD($exifTool, $dirInfo);
+    if (defined $loc) {
+        $exifTool->{UnknownByteOrder} = GetByteOrder();
+        if ($exifTool->Options('Verbose') > 1) {
+            my $out = $exifTool->Options('TextOut');
+            my $indent = $exifTool->{INDENT};
+            $indent =~ s/\| $/  /;
+            printf $out "${indent}Found IFD at offset 0x%.4x in maker notes:\n",
+                    $$dirInfo{DirStart} + $$dirInfo{DataPos} + $$dirInfo{Base};
+        }
+        $success = Image::ExifTool::Exif::ProcessExif($exifTool, $dirInfo, $tagTablePtr);
+    } else {
+        $exifTool->{UnknownByteOrder} = ''; # indicates we tried but didn't set byte order
+        $exifTool->Warn("Unrecognized $$dirInfo{DirName}", 1);
+    }
+    return $success;
+}
+
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::MakerNotes - Read and write EXIF maker notes
+
+=head1 SYNOPSIS
+
+This module is required by Image::ExifTool.
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to interpret
+maker notes in EXIF information.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames(3pm)|Image::ExifTool::TagNames>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Matroska.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Matroska.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Matroska.pm	(revision 24799)
@@ -0,0 +1,891 @@
+#------------------------------------------------------------------------------
+# File:         Matroska.pm
+#
+# Description:  Read meta information from Matroska multimedia files
+#
+# Revisions:    05/26/2010 - P. Harvey Created
+#
+# References:   1) http://www.matroska.org/technical/specs/index.html
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Matroska;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.04';
+
+my %noYes = ( 0 => 'No', 1 => 'Yes' );
+
+# Matroska tags
+# Note: The tag ID's in the Matroska documentation include the length designation
+#       (the upper bits), which is not included in the tag ID's below
+%Image::ExifTool::Matroska::Main = (
+    GROUPS => { 2 => 'Video' },
+    NOTES => q{
+        The following tags are extracted from Matroska multimedia container files. 
+        This container format is used by file types such as MKA, MKV, MKS and WEBM. 
+        For speed, ExifTool extracts tags only up to the first Cluster unless the
+        Verbose (-v) or Unknown = 2 (-U) option is used.  See
+        L<http://www.matroska.org/technical/specs/index.html> for the official
+        Matroska specification.
+    },
+    # supported Format's: signed, unsigned, float, date, string, utf8
+    # (or undef by default)
+#
+# EBML Header
+#
+    0xa45dfa3 => {
+        Name => 'EBMLHeader',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x286 => { Name => 'EBMLVersion',       Format => 'unsigned' },
+    0x2f7 => { Name => 'EBMLReadVersion',   Format => 'unsigned' },
+    0x2f2 => { Name => 'EBMLMaxIDLength',   Format => 'unsigned', Unknown => 1 },
+    0x2f3 => { Name => 'EBMLMaxSizeLength', Format => 'unsigned', Unknown => 1 },
+    0x282 => {
+        Name => 'DocType',
+        Format => 'string',
+        # override FileType for "webm" files
+        RawConv => '$self->OverrideFileType("WEBM") if $val eq "webm"; $val',
+    },
+    0x287 => { Name => 'DocTypeVersion',    Format => 'unsigned' },
+    0x285 => { Name => 'DocTypeReadVersion',Format => 'unsigned' },
+#
+# General
+#
+    0x3f  => { Name => 'CRC-32',            Binary => 1, Unknown => 1 },
+    0x6c  => { Name => 'Void',              NoSave => 1, Unknown => 1 },
+#
+# Signature
+#
+    0xb538667 => {
+        Name => 'SignatureSlot',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x3e8a => { Name => 'SignatureAlgo',    Format => 'unsigned' },
+    0x3e9a => { Name => 'SignatureHash',    Format => 'unsigned' },
+    0x3ea5 => { Name =>'SignaturePublicKey',Binary => 1, Unknown => 1 },
+    0x3eb5 => { Name => 'Signature',        Binary => 1, Unknown => 1 },
+    0x3e5b => {
+        Name => 'SignatureElements',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x3e7b => {
+        Name => 'SignatureElementList',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x2532 => { Name => 'SignedElement',    Binary => 1, Unknown => 1 },
+#
+# Segment
+#
+    0x8538067 => {
+        Name => 'SegmentHeader',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x14d9b74 => {
+        Name => 'SeekHead',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0xdbb => {
+        Name => 'Seek',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x13ab => { Name => 'SeekID',           Binary => 1, Unknown => 1 },
+    0x13ac => { Name => 'SeekPosition',     Format => 'unsigned', Unknown => 1 },
+#
+# Segment Info
+#
+    0x549a966 => {
+        Name => 'Info',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x33a4 => { Name => 'SegmentUID',       Binary => 1, Unknown => 1 },
+    0x3384 => { Name => 'SegmentFileName',  Format => 'utf8' },
+    0x1cb923 => { Name => 'PrevUID',        Binary => 1, Unknown => 1 },
+    0x1c83ab => { Name => 'PrevFileName',   Format => 'utf8' },
+    0x1eb923 => { Name => 'NextUID',        Binary => 1, Unknown => 1 },
+    0x1e83bb => { Name => 'NextFileName',   Format => 'utf8' },
+    0x0444 => { Name => 'SegmentFamily',    Binary => 1, Unknown => 1 },
+    0x2924 => {
+        Name => 'ChapterTranslate',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x29fc => { Name => 'ChapterTranslateEditionUID',Format => 'unsigned', Unknown => 1 },
+    0x29bf => {
+        Name => 'ChapterTranslateCodec',
+        Format => 'unsigned',
+        PrintConv => { 0 => 'Matroska Script', 1 => 'DVD Menu' },
+    },
+    0x29a5 => { Name => 'ChapterTranslateID',Binary => 1, Unknown => 1 },
+    0xad7b1 => {
+        Name => 'TimecodeScale',
+        Format => 'unsigned',
+        RawConv => '$$self{TimecodeScale} = $val',
+        ValueConv => '$val / 1e9',
+        PrintConv => '($val * 1000) . " ms"',
+    },
+    0x489 => {
+        Name => 'Duration',
+        Format => 'float',
+        ValueConv => '$$self{TimecodeScale} ? $val * $$self{TimecodeScale} / 1e9 : $val',
+        PrintConv => '$$self{TimecodeScale} ? ConvertDuration($val) : $val',
+    },
+    0x461 => {
+        Name => 'DateTimeOriginal', # called "DateUTC" by the spec
+        Description => 'Date/Time Original',
+        Groups => { 2 => 'Time' },
+        Format => 'date',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    0x3ba9 => { Name => 'Title',            Format => 'utf8' },
+    0xd80  => { Name => 'MuxingApp',        Format => 'utf8' },
+    0x1741 => { Name => 'WritingApp',       Format => 'utf8' },
+#
+# Cluster
+#
+    0xf43b675 => {
+        Name => 'Cluster',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x67 => {
+        Name => 'Timecode',
+        Format => 'unsigned',
+        Unknown => 1,
+        ValueConv => '$$self{TimecodeScale} ? $val * $$self{TimecodeScale} / 1e9 : $val',
+        PrintConv => '$$self{TimecodeScale} ? ConvertDuration($val) : $val',
+    },
+    0x1854 => {
+        Name => 'SilentTracks',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x18d7 => { Name => 'SilentTrackNumber',Format => 'unsigned' },
+    0x27   => { Name => 'Position',         Format => 'unsigned' },
+    0x2b   => { Name => 'PrevSize',         Format => 'unsigned' },
+    0x23   => { Name => 'SimpleBlock',      NoSave => 1, Unknown => 1 },
+    0x20 => {
+        Name => 'BlockGroup',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x21   => { Name => 'Block',            NoSave => 1, Unknown => 1 },
+    0x22   => { Name => 'BlockVirtual',     NoSave => 1, Unknown => 1 },
+    0x35a1 => {
+        Name => 'BlockAdditions',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x26 => {
+        Name => 'BlockMore',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x6e   => { Name => 'BlockAddID',       Format => 'unsigned', Unknown => 1 },
+    0x25   => { Name => 'BlockAdditional',  NoSave => 1, Unknown => 1 },
+    0x1b   => {
+        Name => 'BlockDuration',
+        Format => 'unsigned',
+        Unknown => 1,
+        ValueConv => '$$self{TimecodeScale} ? $val * $$self{TimecodeScale} / 1e9 : $val',
+        PrintConv => '$$self{TimecodeScale} ? "$val s" : $val',
+    },
+    0x7a   => { Name => 'ReferencePriority',Format => 'unsigned', Unknown => 1 },
+    0x7b   => {
+        Name => 'ReferenceBlock',
+        Format => 'signed',
+        Unknown => 1,
+        ValueConv => '$$self{TimecodeScale} ? $val * $$self{TimecodeScale} / 1e9 : $val',
+        PrintConv => '$$self{TimecodeScale} ? "$val s" : $val',
+    },
+    0x7d   => { Name => 'ReferenceVirtual', Format => 'signed', Unknown => 1 },
+    0x24   => { Name => 'CodecState',       Binary => 1, Unknown => 1 },
+    0x0e => {
+        Name => 'Slices',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x68 => {
+        Name => 'TimeSlice',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x4c   => { Name => 'LaceNumber',       Format => 'unsigned', Unknown => 1 },
+    0x4d   => { Name => 'FrameNumber',      Format => 'unsigned', Unknown => 1 },
+    0x4b   => { Name => 'BlockAdditionalID',Format => 'unsigned', Unknown => 1 },
+    0x4e   => { Name => 'Delay',            Format => 'unsigned', Unknown => 1 },
+    0x4f   => { Name => 'ClusterDuration',  Format => 'unsigned', Unknown => 1 },
+    0x2f   => { Name => 'EncryptedBlock',   NoSave => 1, Unknown => 1 },
+#
+# Tracks
+#
+    0x654ae6b => {
+        Name => 'Tracks',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x2e => {
+        Name => 'TrackEntry',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x57   => { Name => 'TrackNumber',      Format => 'unsigned' },
+    0x33c5 => { Name => 'TrackUID',         Format => 'unsigned', Unknown => 1 },
+    0x03 => {
+        Name => 'TrackType',
+        Format => 'unsigned',
+        PrintHex => 1,
+        # remember types of all tracks encountered, as well as the current track type
+        RawConv => '$$self{TrackTypes}{$val} = 1; $$self{TrackType} = $val',
+        PrintConv => {
+            0x01 => 'Video',
+            0x02 => 'Audio',
+            0x03 => 'Complex', # (audio+video)
+            0x10 => 'Logo',
+            0x11 => 'Subtitle',
+            0x12 => 'Buttons',
+            0x20 => 'Control',
+        },
+    },
+    0x39   => { Name => 'TrackUsed',        Format => 'unsigned', PrintConv => \%noYes },
+    0x08   => { Name => 'TrackDefault',     Format => 'unsigned', PrintConv => \%noYes },
+    0x15aa => { Name => 'TrackForced',      Format => 'unsigned', PrintConv => \%noYes },
+    0x1c => {
+        Name => 'TrackLacing',
+        Format => 'unsigned',
+        Unknown => 1,
+        PrintConv => \%noYes,
+    },
+    0x2de7 => { Name => 'MinCache',         Format => 'unsigned', Unknown => 1 },
+    0x2df8 => { Name => 'MaxCache',         Format => 'unsigned', Unknown => 1 },
+    0x3e383 => [
+        {
+            Name => 'VideoFrameRate',
+            Condition => '$$self{TrackType} and $$self{TrackType} == 0x01',
+            Format => 'unsigned',
+            ValueConv => '$val ? 1e9 / $val : 0',
+            PrintConv => 'int($val * 1000 + 0.5) / 1000',
+        },{
+            Name => 'DefaultDuration',
+            Format => 'unsigned',
+            ValueConv => '$val / 1e9',
+            PrintConv => '($val * 1000) . " ms"',
+        }
+    ],
+    0x3314f => { Name => 'TrackTimecodeScale',Format => 'float' },
+    0x137f  => { Name => 'TrackOffset',     Format => 'signed', Unknown => 1 },
+    0x15ee  => { Name => 'MaxBlockAdditionID',Format => 'unsigned', Unknown => 1 },
+    0x136e  => { Name => 'TrackName',       Format => 'utf8' },
+    0x2b59c => { Name => 'TrackLanguage',   Format => 'string' },
+    0x06 => [
+        {
+            Name => 'VideoCodecID',
+            Condition => '$$self{TrackType} and $$self{TrackType} == 0x01',
+            Format => 'string',
+        },{
+            Name => 'AudioCodecID',
+            Condition => '$$self{TrackType} and $$self{TrackType} == 0x02',
+            Format => 'string',
+        },{
+            Name => 'CodecID',
+            Format => 'string',
+        }
+    ],
+    0x23a2 => { Name => 'CodecPrivate',     Binary => 1, Unknown => 1 },
+    0x58688 => [
+        {
+            Name => 'VideoCodecName',
+            Condition => '$$self{TrackType} and $$self{TrackType} == 0x01',
+            Format => 'utf8',
+        },{
+            Name => 'AudioCodecName',
+            Condition => '$$self{TrackType} and $$self{TrackType} == 0x02',
+            Format => 'utf8',
+        },{
+            Name => 'CodecName',
+            Format => 'utf8',
+        }
+    ],
+    0x3446 => { Name => 'TrackAttachmentUID',Format => 'unsigned' },
+    0x1a9697=>{ Name => 'CodecSettings',    Format => 'utf8' },
+    0x1b4040=>{ Name => 'CodecInfoURL',     Format => 'string' },
+    0x6b240 =>{ Name => 'CodecDownloadURL', Format => 'string' },
+    0x2a   => { Name => 'CodecDecodeAll',   Format => 'unsigned', PrintConv => \%noYes },
+    0x2fab => { Name => 'TrackOverlay',     Format => 'unsigned', Unknown => 1 },
+    0x2624 => {
+        Name => 'TrackTranslate',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x26fc => { Name => 'TrackTranslateEditionUID',Format => 'unsigned', Unknown => 1 },
+    0x26bf => {
+        Name => 'TrackTranslateCodec',
+        Format => 'unsigned',
+        PrintConv => { 0 => 'Matroska Script', 1 => 'DVD Menu' },
+    },
+    0x26a5 => { Name => 'TrackTranslateTrackID', Binary => 1, Unknown => 1 },
+#
+# Video
+#
+    0x60 => {
+        Name => 'Video',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x1a => {
+        Name => 'VideoScanType',
+        Format => 'unsigned',
+        PrintConv => {
+            0 => 'Progressive',
+            1 => 'Interlaced',
+        },
+    },
+    0x13b8 => {
+        Name => 'Stereo3DMode',
+        Format => 'unsigned',
+        Printconv => {
+            0 => 'Mono',
+            1 => 'Right Eye',
+            2 => 'Left Eye',
+            3 => 'Both Eyes',
+        },
+    },
+    0x30   => { Name => 'ImageWidth',       Format => 'unsigned' },
+    0x3a   => { Name => 'ImageHeight',      Format => 'unsigned' },
+    0x14aa => { Name => 'CropBottom',       Format => 'unsigned' },
+    0x14bb => { Name => 'CropTop',          Format => 'unsigned' },
+    0x14cc => { Name => 'CropLeft',         Format => 'unsigned' },
+    0x14dd => { Name => 'CropRight',        Format => 'unsigned' },
+    0x14b0 => { Name => 'DisplayWidth',     Format => 'unsigned' },
+    0x14ba => { Name => 'DisplayHeight',    Format => 'unsigned' },
+    0x14b2 => {
+        Name => 'DisplayUnit',
+        Format => 'unsigned',
+        PrintConv => {
+            0 => 'Pixels',
+            1 => 'cm',
+            2 => 'inches',
+        },
+    },
+    0x14b3 => {
+        Name => 'AspectRatioType',
+        Format => 'unsigned',
+        PrintConv => {
+            0 => 'Free Resizing',
+            1 => 'Keep Aspect Ratio',
+            2 => 'Fixed',
+        },
+    },
+    0xeb524 => { Name => 'ColorSpace',      Binary => 1, Unknown => 1 },
+    0xfb523 => { Name => 'Gamma',           Format => 'float' },
+    0x383e3 => { Name => 'FrameRate',       Format => 'float' },
+#
+# Audio
+#
+    0x61 => {
+        Name => 'Audio',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x35   => { Name => 'AudioSampleRate',  Format => 'float',     Groups => { 2 => 'Audio' } },
+    0x38b5 => { Name => 'OutputAudioSampleRate',Format => 'float', Groups => { 2 => 'Audio' } },
+    0x1f   => { Name => 'AudioChannels',    Format => 'unsigned',  Groups => { 2 => 'Audio' } },
+    0x3d7b => {
+        Name => 'ChannelPositions',
+        Binary => 1,
+        Unknown => 1,
+        Groups => { 2 => 'Audio' },
+    },
+    0x2264 => { Name => 'AudioBitsPerSample',   Format => 'unsigned', Groups => { 2 => 'Audio' } },
+#
+# Content Encoding
+#
+    0x2d80 => {
+        Name => 'ContentEncodings',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x2240 => {
+        Name => 'ContentEncoding',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x1031 => { Name => 'ContentEncodingOrder', Format => 'unsigned', Unknown => 1 },
+    0x1032 => { Name => 'ContentEncodingScope', Format => 'unsigned', Unknown => 1 },
+    0x1033 => {
+        Name => 'ContentEncodingType',
+        Format => 'unsigned',
+        PrintConv => { 0 => 'Compression', 1 => 'Encryption' },
+    },
+    0x1034 => {
+        Name => 'ContentCompression',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x254 => {
+        Name => 'ContentCompressionAlgorithm',
+        Format => 'unsigned',
+        PrintConv => {
+            0 => 'zlib',
+            1 => 'bzlib',
+            2 => 'lzo1x',
+            3 => 'Header Stripping',
+        },
+    },
+    0x255 => { Name => 'ContentCompressionSettings',Binary => 1, Unknown => 1 },
+    0x1035 => {
+        Name => 'ContentEncryption',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x7e1 => {
+        Name => 'ContentEncryptionAlgorithm',
+        Format => 'unsigned',
+        PrintConv => {
+            0 => 'Not Encrypted',
+            1 => 'DES',
+            2 => '3DES',
+            3 => 'Twofish',
+            4 => 'Blowfish',
+            5 => 'AES',
+        },
+    },
+    0x7e2 => { Name => 'ContentEncryptionKeyID',Binary => 1, Unknown => 1 },
+    0x7e3 => { Name => 'ContentSignature',      Binary => 1, Unknown => 1 },
+    0x7e4 => { Name => 'ContentSignatureKeyID', Binary => 1, Unknown => 1 },
+    0x7e5 => {
+        Name => 'ContentSignatureAlgorithm',
+        Format => 'unsigned',
+        PrintConv => {
+            0 => 'Not Signed',
+            1 => 'RSA',
+        },
+    },
+    0x7e6 => {
+        Name => 'ContentSignatureHashAlgorithm',
+        Format => 'unsigned',
+        PrintConv => {
+            0 => 'Not Signed',
+            1 => 'SHA1-160',
+            2 => 'MD5',
+        },
+    },
+#
+# Cues
+#
+    0xc53bb6b => {
+        Name => 'Cues',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x3b => {
+        Name => 'CuePoint',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x33 => {
+        Name => 'CueTime',
+        Format => 'unsigned',
+        Unknown => 1,
+        ValueConv => '$$self{TimecodeScale} ? $val * $$self{TimecodeScale} / 1e9 : $val',
+        PrintConv => '$$self{TimecodeScale} ? ConvertDuration($val) : $val',
+    },
+    0x37 => {
+        Name => 'CueTrackPositions',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x77   => { Name => 'CueTrack',         Format => 'unsigned', Unknown => 1 },
+    0x71   => { Name => 'CueClusterPosition',Format => 'unsigned', Unknown => 1 },
+    0x1378 => { Name => 'CueBlockNumber',   Format => 'unsigned', Unknown => 1 },
+    0x6a   => { Name => 'CueCodecState',    Format => 'unsigned', Unknown => 1 },
+    0x5b => {
+        Name => 'CueReference',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x16 => {
+        Name => 'CueRefTime',
+        Format => 'unsigned',
+        Unknown => 1,
+        ValueConv => '$$self{TimecodeScale} ? $val * $$self{TimecodeScale} / 1e9 : $val',
+        PrintConv => '$$self{TimecodeScale} ? ConvertDuration($val) : $val',
+    },
+    0x17  => { Name => 'CueRefCluster',     Format => 'unsigned', Unknown => 1 },
+    0x135f=> { Name => 'CueRefNumber',      Format => 'unsigned', Unknown => 1 },
+    0x6b  => { Name => 'CueRefCodecState',  Format => 'unsigned', Unknown => 1 },
+#
+# Attachments
+#
+    0x941a469 => {
+        Name => 'Attachments',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x21a7 => {
+        Name => 'AttachedFile',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x67e => { Name => 'AttachedFileDescription',Format => 'utf8' },
+    0x66e => { Name => 'AttachedFileName',      Format => 'utf8' },
+    0x660 => { Name => 'AttachedFileMIMEType',  Format => 'string' },
+    0x65c => { Name => 'AttachedFileData',      Binary => 1 },
+    0x6ae => { Name => 'AttachedFileUID',       Format => 'unsigned' },
+    0x675 => { Name => 'AttachedFileReferral',  Binary => 1, Unknown => 1 },
+#
+# Chapters
+#
+    0x43a770 => {
+        Name => 'Chapters',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x5b9 => {
+        Name => 'EditionEntry',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x5bc => { Name => 'EditionUID',        Format => 'unsigned', Unknown => 1 },
+    0x5bd => { Name => 'EditionFlagHidden', Format => 'unsigned', Unknown => 1 },
+    0x5db => { Name => 'EditionFlagDefault',Format => 'unsigned', Unknown => 1 },
+    0x5dd => { Name => 'EditionFlagOrdered',Format => 'unsigned', Unknown => 1 },
+    0x36 => {
+        Name => 'ChapterAtom',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x33c4 => { Name => 'ChapterUID',       Format => 'unsigned', Unknown => 1 },
+    0x11 => {
+        Name => 'ChapterTimeStart',
+        Groups => { 1 => 'Chapter#' },
+        Format => 'unsigned',
+        ValueConv => '$val / 1e9',
+        PrintConv => 'ConvertDuration($val)',
+    },
+    0x12 => {
+        Name => 'ChapterTimeEnd',
+        Format => 'unsigned',
+        ValueConv => '$val / 1e9',
+        PrintConv => 'ConvertDuration($val)',
+    },
+    0x18  => { Name => 'ChapterFlagHidden', Format => 'unsigned', Unknown => 1 },
+    0x598 => { Name => 'ChapterFlagEnabled',Format => 'unsigned', Unknown => 1 },
+    0x2e67=> { Name => 'ChapterSegmentUID', Binary => 1, Unknown => 1 },
+    0x2ebc=> { Name => 'ChapterSegmentEditionUID', Binary => 1, Unknown => 1 },
+    0x23c3 => {
+        Name => 'ChapterPhysicalEquivalent',
+        Format => 'unsigned',
+        PrintConv => {
+            10 => 'Index',
+            20 => 'Track',
+            30 => 'Session',
+            40 => 'Layer',
+            50 => 'Side',
+            60 => 'CD / DVD',
+            70 => 'Set / Package',
+        },
+    },
+    0x0f => {
+        Name => 'ChapterTrack',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x09 => { Name => 'ChapterTrackNumber', Format => 'unsigned', Unknown => 1 },
+    0x00 => {
+        Name => 'ChapterDisplay',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x05  => { Name => 'ChapterString',     Format => 'utf8' },
+    0x37c => { Name => 'ChapterLanguage',   Format => 'string' },
+    0x37e => { Name => 'ChapterCountry',    Format => 'string' },
+    0x2944 => {
+        Name => 'ChapterProcess',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x2955 => {
+        Name => 'ChapterProcessCodecID',
+        Format => 'unsigned',
+        Unknown => 1,
+        PrintConv => { 0 => 'Matroska', 1 => 'DVD' },
+    },
+    0x50d => { Name => 'ChapterProcessPrivate', Binary => 1, Unknown => 1 },
+    0x2911 => {
+        Name => 'ChapterProcessCommand',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x2922 => {
+        Name => 'ChapterProcessTime',
+        Format => 'unsigned',
+        Unknown => 1,
+        PrintConv => {
+            0 => 'For Duration of Chapter',
+            1 => 'Before Chapter',
+            2 => 'After Chapter',
+        },
+    },
+    0x2933 => { Name => 'ChapterProcessData',   Binary => 1, Unknown => 1 },
+#
+# Tags
+#
+    0x254c367 => {
+        Name => 'Tags',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x3373 => {
+        Name => 'Tag',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x23c0 => {
+        Name => 'Targets',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x28ca => { Name => 'TargetTypeValue',  Format => 'unsigned' },
+    0x23ca => { Name => 'TargetType',       Format => 'string' },
+    0x23c5 => { Name => 'TagTrackUID',      Format => 'unsigned', Unknown => 1 },
+    0x23c9 => { Name => 'TagEditionUID',    Format => 'unsigned', Unknown => 1 },
+    0x23c4 => { Name => 'TagChapterUID',    Format => 'unsigned', Unknown => 1 },
+    0x23c6 => { Name => 'TagAttachmentUID', Format => 'unsigned', Unknown => 1 },
+    0x27c8 => {
+        Name => 'SimpleTag',
+        SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
+    },
+    0x5a3 => { Name => 'TagName',           Format => 'utf8' },
+    0x47a => { Name => 'TagLanguage',       Format => 'string' },
+    0x484 => { Name => 'TagDefault',        Format => 'unsigned', PrintConv => \%noYes },
+    0x487 => { Name => 'TagString',         Format => 'utf8' },
+    0x485 => { Name => 'TagBinary',         Binary => 1 },
+);
+
+#------------------------------------------------------------------------------
+# Get variable-length Matroska integer
+# Inputs: 0) data buffer, 1) position in data
+# Returns: integer value and updates position, -1 for unknown/reserved value,
+#          or undef if no data left
+sub GetVInt($$)
+{
+    return undef if $_[1] >= length $_[0];
+    my $val = ord(substr($_[0], $_[1]++));
+    my $num = 0;
+    unless ($val) {
+        return undef if $_[1] >= length $_[0];
+        $val = ord(substr($_[0], $_[1]++));
+        return undef unless $val;   # can't be this large!
+        $num += 7;  # 7 more bytes to read (we just read one)
+    }
+    my $mask = 0x7f;
+    while ($val == ($val & $mask)) {
+        $mask >>= 1;
+        ++$num;
+    }
+    $val = ($val & $mask);
+    my $unknown = ($val == $mask);
+    return undef if $_[1] + $num > length $_[0];
+    while ($num) {
+        my $b = ord(substr($_[0], $_[1]++));
+        $unknown = 0 if $b != 0xff;
+        $val = $val * 256 + $b;
+        --$num;
+    }
+    return $unknown ? -1 : $val;
+}
+
+#------------------------------------------------------------------------------
+# Read information from a Matroska multimedia file (MKV, MKA, MKS)
+# Inputs: 0) ExifTool object reference, 1) Directory information reference
+# Returns: 1 on success, 0 if this wasn't a valid Matroska file
+sub ProcessMKV($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my ($buff, $buf2, @dirEnd, $trackIndent, %trackTypes);
+
+    $raf->Read($buff, 4) == 4 or return 0;
+    return 0 unless $buff =~ /^\x1a\x45\xdf\xa3/;
+
+    # read in 64kB blocks (already read 4 bytes)
+    $raf->Read($buff, 65532) or return 0;
+    my $dataLen = length $buff;
+    my ($pos, $dataPos) = (0, 4);
+
+    # verify header length
+    my $hlen = GetVInt($buff, $pos);
+    return 0 unless $hlen and $hlen > 0;
+    $pos + $hlen > $dataLen and $exifTool->Warn('Truncated Matroska header'), return 1;
+    $exifTool->SetFileType();
+    SetByteOrder('MM');
+    my $tagTablePtr = GetTagTable('Image::ExifTool::Matroska::Main');
+
+    # set flag to process entire file (otherwise we stop at the first Cluster)
+    my $verbose = $exifTool->Options('Verbose');
+    my $processAll = ($verbose or $exifTool->Options('Unknown') > 1);
+    $$exifTool{TrackTypes} = \%trackTypes;  # store Track types reference
+    my $oldIndent = $$exifTool{INDENT};
+    my $chapterNum = 0;
+
+    # loop over all Matroska elements
+    for (;;) {
+        while (@dirEnd and $pos + $dataPos >= $dirEnd[-1][0]) {
+            pop @dirEnd;
+            # use INDENT to decide whether or not we are done this Track element
+            delete $$exifTool{SET_GROUP1} if $trackIndent and $trackIndent eq $$exifTool{INDENT};
+            $$exifTool{INDENT} = substr($$exifTool{INDENT}, 0, -2);
+        }
+        # read more if we are getting close to the end of our buffer
+        # (24 more bytes should be enough to read this element header)
+        if ($pos + 24 > $dataLen and $raf->Read($buf2, 65536)) {
+            $buff = substr($buff, $pos) . $buf2;
+            undef $buf2;
+            $dataPos += $pos;
+            $dataLen = length $buff;
+            $pos = 0;
+        }
+        my $tag = GetVInt($buff, $pos);
+        last unless defined $tag and $tag >= 0;
+        my $size = GetVInt($buff, $pos);
+        last unless defined $size;
+        my $unknownSize;
+        $size < 0 and $unknownSize = 1, $size = 1e20;
+        if (@dirEnd and $pos + $dataPos + $size > $dirEnd[-1][0]) {
+            $exifTool->Warn("Invalid or corrupted $dirEnd[-1][1] master element");
+            $pos = $dirEnd[-1][0] - $dataPos;
+            if ($pos < 0 or $pos > $dataLen) {
+                $buff = '';
+                $dataPos += $pos;
+                $dataLen = 0;
+                $pos = 0;
+                $raf->Seek($dataPos, 0) or last;
+            }
+            next;
+        }
+        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        # just fall through into the contained EBML elements
+        if ($tagInfo and $$tagInfo{SubDirectory}) {
+            # stop processing at first cluster unless we are in verbose mode
+            last if $$tagInfo{Name} eq 'Cluster' and not $processAll;
+            $$exifTool{INDENT} .= '| ';
+            $exifTool->VerboseDir($$tagTablePtr{$tag}{Name}, undef, $size);
+            push @dirEnd, [ $pos + $dataPos + $size, $$tagInfo{Name} ];
+            if ($$tagInfo{Name} eq 'ChapterAtom') {
+                $$exifTool{SET_GROUP1} = 'Chapter' . (++$chapterNum);
+                $trackIndent = $$exifTool{INDENT};
+            }
+            next;
+        }
+        last if $unknownSize;
+        if ($pos + $size > $dataLen) {
+            # how much more do we need to read?
+            my $more = $pos + $size - $dataLen;
+            # just skip unknown and large data blocks
+            if (not $tagInfo or $more > 10000000) {
+                # don't try to skip very large blocks unless LargeFileSupport is enabled
+                last if $more > 0x80000000 and not $exifTool->Options('LargeFileSupport');
+                $raf->Seek($more, 1) or last;
+                $buff = '';
+                $dataPos += $dataLen + $more;
+                $dataLen = 0;
+                $pos = 0;
+                next;
+            } else {
+                # read data in multiples of 64kB
+                $more = (int($more / 65536) + 1) * 65536;
+                if ($raf->Read($buf2, $more)) {
+                    $buff = substr($buff, $pos) . $buf2;
+                    undef $buf2;
+                    $dataPos += $pos;
+                    $dataLen = length $buff;
+                    $pos = 0;
+                }
+                last if $pos + $size > $dataLen;
+            }
+        }
+        unless ($tagInfo) {
+            # ignore the element
+            $pos += $size;
+            next;
+        }
+        my $val;
+        if ($$tagInfo{Format}) {
+            my $fmt = $$tagInfo{Format};
+            if ($fmt eq 'string' or $fmt eq 'utf8') {
+                ($val = substr($buff, $pos, $size)) =~ s/\0.*//s;
+                $val = $exifTool->Decode($val, 'UTF8') if $fmt eq 'utf8';
+            } elsif ($fmt eq 'float') {
+                if ($size == 4) {
+                    $val = GetFloat(\$buff, $pos);
+                } elsif ($size == 8) {
+                    $val = GetDouble(\$buff, $pos);
+                } else {
+                    $exifTool->Warn("Illegal float size ($size)");
+                }
+            } else {
+                my @vals = unpack("x${pos}C$size", $buff);
+                $val = 0;
+                if ($fmt eq 'signed' or $fmt eq 'date') {
+                    my $over = 1;
+                    foreach (@vals) {
+                        $val = $val * 256 + $_;
+                        $over *= 256;
+                    }
+                    # interpret negative numbers
+                    $val -= $over if $vals[0] & 0x80;
+                    # convert dates (nanoseconds since 2001:01:01)
+                    if ($fmt eq 'date') {
+                        my $t = $val / 1e9;
+                        my $f = $t - int($t);   # fractional seconds
+                        $f =~ s/^\d+//;         # remove leading zero
+                        # (8 leap days between 1970 and 2001)
+                        $t += (((2001-1970)*365+8)*24*3600);
+                        $val = Image::ExifTool::ConvertUnixTime($t) . $f . 'Z';
+                    }
+                } else { # must be unsigned
+                    $val = $val * 256 + $_ foreach @vals;
+                }
+            }
+            # set group1 to Track/Chapter number
+            if ($$tagInfo{Name} eq 'TrackNumber') {
+                $$exifTool{SET_GROUP1} = 'Track' . $val;
+                $trackIndent = $$exifTool{INDENT};
+            }
+        }
+        my %parms = (
+            DataPt  => \$buff,
+            DataPos => $dataPos,
+            Start   => $pos,
+            Size    => $size,
+        );
+        if ($$tagInfo{NoSave}) {
+            $exifTool->VerboseInfo($tag, $tagInfo, Value => $val, %parms) if $verbose;
+        } else {
+            $exifTool->HandleTag($tagTablePtr, $tag, $val, %parms);
+        }
+        $pos += $size;  # step to next element
+    }
+    $$exifTool{INDENT} = $oldIndent;
+    delete $$exifTool{SET_GROUP1};
+    # override file type if necessary based on existing track types
+    unless ($trackTypes{0x01} or $trackTypes{0x03}) {   # video or complex?
+        if ($trackTypes{0x02}) {                        # audio?
+            $exifTool->OverrideFileType('MKA');
+        } elsif ($trackTypes{0x11}) {                   # subtitle?
+            $exifTool->OverrideFileType('MKS');
+        }
+    }
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Matroska - Read meta information from Matroska files
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to read meta
+information from Matroska multimedia files (MKA, MKV, MKS and WEBM).
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.matroska.org/technical/specs/index.html>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/Matroska Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Microsoft.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Microsoft.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Microsoft.pm	(revision 24799)
@@ -0,0 +1,199 @@
+#------------------------------------------------------------------------------
+# File:         Microsoft.pm
+#
+# Description:  Definitions for custom Microsoft tags
+#
+# Revisions:    2010/10/01 - P. Harvey Created
+#
+# References:   1) http://research.microsoft.com/en-us/um/redmond/groups/ivm/hdview/hdmetadataspec.htm
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Microsoft;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool::XMP;
+
+$VERSION = '1.03';
+
+# tags written by Microsoft HDView (ref 1)
+%Image::ExifTool::Microsoft::Stitch = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FORMAT => 'float',
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    NOTES => q{
+        Information found in the Microsoft custom EXIF tag 0x4748, as written by
+        Windows Live Photo Gallery.
+    },
+    0 => {
+        Name => 'PanoramicStitchVersion',
+        Format => 'int32u',
+    },
+    1 => {
+        Name => 'PanoramicStitchCameraMotion',
+        Format => 'int32u',
+        PrintConv => {
+            2 => 'Rigid Scale',
+            3 => 'Affine',
+            4 => '3D Rotation',
+            5 => 'Homography',
+        },
+    },
+    2 => {
+        Name => 'PanoramicStitchMapType',
+        Format => 'int32u',
+        PrintConv => {
+            0 => 'Perspective',
+            1 => 'Horizontal Cylindrical',
+            2 => 'Horizontal Spherical',
+            257 => 'Vertical Cylindrical',
+            258 => 'Vertical Spherical',
+        },
+    },
+    3 => 'PanoramicStitchTheta0',
+    4 => 'PanoramicStitchTheta1',
+    5 => 'PanoramicStitchPhi0',
+    6 => 'PanoramicStitchPhi1',
+);
+
+# Microsoft Photo schema properties (MicrosoftPhoto) (ref PH)
+%Image::ExifTool::Microsoft::XMP = (
+    %Image::ExifTool::XMP::xmpTableDefaults,
+    GROUPS => { 0 => 'XMP', 1 => 'XMP-microsoft', 2 => 'Image' },
+    NAMESPACE => 'MicrosoftPhoto',
+    TABLE_DESC => 'XMP Microsoft',
+    VARS => { NO_ID => 1 },
+    NOTES => q{
+        Microsoft Photo 1.0 schema XMP tags.  This is likely not a complete list,
+        but represents tags which have been observed in sample images.  The actual
+        namespace prefix is "MicrosoftPhoto", but ExifTool shortens this to
+        "XMP-microsoft" in the family 1 group name.
+    },
+    CameraSerialNumber => { },
+    DateAcquired       => { Groups => { 2 => 'Time' }, %Image::ExifTool::XMP::dateTimeInfo },
+    FlashManufacturer  => { },
+    FlashModel         => { },
+    LastKeywordIPTC    => { List => 'Bag' },
+    LastKeywordXMP     => { List => 'Bag' },
+    LensManufacturer   => { },
+    LensModel          => { },
+    Rating => {
+        Name => 'RatingPercent',
+        Notes => q{
+            normal Rating values of 1,2,3,4 and 5 stars correspond to RatingPercent
+            values of 1,25,50,75 and 99 respectively
+        },
+    },
+);
+
+# Microsoft Photo 1.1 schema properties (MP1 - written as 'prefix0' by MSPhoto) (ref PH)
+%Image::ExifTool::Microsoft::MP1 = (
+    %Image::ExifTool::XMP::xmpTableDefaults,
+    GROUPS => { 0 => 'XMP', 1 => 'XMP-MP1', 2 => 'Image' },
+    NAMESPACE => 'MP1',
+    TABLE_DESC => 'XMP Microsoft Photo',
+    VARS => { NO_ID => 1 },
+    NOTES => q{
+        Microsoft Photo 1.1 schema XMP tags which have been observed.
+    },
+    PanoramicStitchCameraMotion => {
+        PrintConv => {
+            'RigidScale' => 'Rigid Scale',
+            'Affine'     => 'Affine',
+            '3DRotation' => '3D Rotation',
+            'Homography' => 'Homography',
+        },
+    },
+    PanoramicStitchMapType => {
+        PrintConv => {
+            'Perspective'            => 'Perspective',
+            'Horizontal-Cylindrical' => 'Horizontal Cylindrical',
+            'Horizontal-Spherical'   => 'Horizontal Spherical',
+            'Vertical-Cylindrical'   => 'Vertical Cylindrical',
+            'Vertical-Spherical'     => 'Vertical Spherical',
+        },
+    },
+    PanoramicStitchPhi0   => { Writable => 'real' },
+    PanoramicStitchPhi1   => { Writable => 'real' },
+    PanoramicStitchTheta0 => { Writable => 'real' },
+    PanoramicStitchTheta1 => { Writable => 'real' },
+);
+
+# Microsoft Photo 1.2 schema properties (MP) (ref PH)
+my %sRegions = (
+    STRUCT_NAME => 'Regions',
+    NAMESPACE   => 'MPReg',
+    Rectangle => { },
+    PersonDisplayName => { },
+);
+%Image::ExifTool::Microsoft::MP = (
+    %Image::ExifTool::XMP::xmpTableDefaults,
+    GROUPS => { 0 => 'XMP', 1 => 'XMP-MP', 2 => 'Image' },
+    NAMESPACE => 'MP',
+    TABLE_DESC => 'XMP Microsoft Photo',
+    VARS => { NO_ID => 1 },
+    NOTES => q{
+        Microsoft Photo 1.2 schema XMP tags which have been observed.
+    },
+    RegionInfo => {
+        Name => 'RegionInfoMP',
+        Struct => {
+            STRUCT_NAME => 'RegionInfoMP',
+            NAMESPACE   => 'MPRI',
+            Regions   => { Struct => \%sRegions, List => 'Bag' },
+        },
+    },
+    RegionInfoRegionsRectangle => {
+        Name => 'RegionRectangle',
+        Flat => 1,
+    },
+    RegionInfoRegionsPersonDisplayName => {
+        Name => 'RegionPersonDisplayName',
+        Flat => 1,
+    },
+);
+
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Microsoft - Definitions for custom Microsoft tags
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to interpret
+Microsoft-specific EXIF and XMP tags.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://research.microsoft.com/en-us/um/redmond/groups/ivm/hdview/hdmetadataspec.htm>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/Microsoft Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Minolta.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Minolta.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Minolta.pm	(revision 24799)
@@ -0,0 +1,2231 @@
+#------------------------------------------------------------------------------
+# File:         Minolta.pm
+#
+# Description:  Minolta EXIF maker notes tags
+#
+# Revisions:    04/06/2004 - P. Harvey Created
+#               09/09/2005 - P. Harvey Added ability to write MRW files
+#
+# References:   1) http://www.dalibor.cz/minolta/makernote.htm
+#               2) Jay Al-Saadi private communication (testing with A2)
+#               3) Shingo Noguchi, PhotoXP (http://www.daifukuya.com/photoxp/)
+#               4) Niels Kristian Bech Jensen private communication
+#               5) http://www.cybercom.net/~dcoffin/dcraw/
+#               6) Pedro Corte-Real private communication
+#               7) ExifTool forum post by bronek (http://www.cpanforum.com/posts/1118)
+#               8) http://www.chauveau-central.net/mrw-format/
+#               9) CPAN Forum post by 'geve' (http://www.cpanforum.com/threads/2168)
+#              10) http://homepage3.nifty.com/kamisaka/makernote/makernote_km.htm
+#              11) http://www.dyxum.com/dforum/forum_posts.asp?TID=6371&PN=1 and
+#                  http://www.dyxum.com/dAdmin/lenses/MakerNoteList_Public.asp?stro=makr
+#                  http://dyxum.com/dforum/forum_posts.asp?TID=23435&PN=2
+#              12) http://www.minolta-forum.de/forum/index.php?showtopic=14914
+#              13) http://www.mhohner.de/minolta/lenses.php
+#              14) Jeffery Small private communication (tests with 7D)
+#              15) http://homepage3.nifty.com/kamisaka/makernote/makernote_sony.htm
+#              16) Thomas Kassner private communication
+#              17) Mladen Sever private communication
+#              18) Olaf Ulrich private communication
+#              19) Lukasz Stelmach private communication
+#              20) Igal Milchtaich private communication (A100 firmware 1.04)
+#              21) Jean-Michel Dubois private communication
+#              22) http://www.mi-fo.de/forum/index.php?act=attach&type=post&id=6024
+#              23) Marcin Krol private communication
+#              24) http://cpanforum.com/threads/12291
+#              JD) Jens Duttke private communication
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Minolta;
+
+use strict;
+use vars qw($VERSION %minoltaLensTypes %minoltaColorMode %sonyColorMode %minoltaSceneMode);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::Exif;
+
+$VERSION = '1.76';
+
+# lens ID numbers (ref 3)
+# ("New" and "II" appear in brackets if original version also has this LensType)
+%minoltaLensTypes = (
+    Notes => q{
+        Decimal values differentiate lenses which would otherwise have the same
+        LensType, and are used by the Composite LensID tag when attempting to
+        identify the specific lens model.  "New" or "II" appear in brackets if the
+        original version of the lens has the same LensType.
+    },
+    0 => 'Minolta AF 28-85mm F3.5-4.5 New', # New added (ref 13/18)
+    1 => 'Minolta AF 80-200mm F2.8 HS-APO G',
+    2 => 'Minolta AF 28-70mm F2.8 G',
+    3 => 'Minolta AF 28-80mm F4-5.6',
+    5 => 'Minolta AF 35-70mm F3.5-4.5 [II]', # (original and II, ref 13)
+    6 => 'Minolta AF 24-85mm F3.5-4.5 [New]', # (original and New, ref 13)
+  # 7 => 'AF 100-400mm F4.5-6.7 (D)', ??
+    7 => 'Minolta AF 100-300mm F4.5-5.6 APO [New] or 100-400mm or Sigma Lens',
+    7.1 => 'Minolta AF 100-400mm F4.5-6.7 APO', #JD
+    7.2 => 'Sigma AF 100-300mm F4 EX DG IF', #JD
+    8 => 'Minolta AF 70-210mm F4.5-5.6 [II]', # (original and II, ref 13)
+    9 => 'Minolta AF 50mm F3.5 Macro',
+    10 => 'Minolta AF 28-105mm F3.5-4.5 [New]', # (original and New, ref 13)
+    11 => 'Minolta AF 300mm F4 HS-APO G',
+    12 => 'Minolta AF 100mm F2.8 Soft Focus',
+    13 => 'Minolta AF 75-300mm F4.5-5.6 (New or II)', # (II and New, ref 13)
+    14 => 'Minolta AF 100-400mm F4.5-6.7 APO',
+    15 => 'Minolta AF 400mm F4.5 HS-APO G',
+    16 => 'Minolta AF 17-35mm F3.5 G',
+    17 => 'Minolta AF 20-35mm F3.5-4.5',
+    18 => 'Minolta AF 28-80mm F3.5-5.6 II',
+    19 => 'Minolta AF 35mm F1.4 G', # G added (ref 18), but not New as per ref 13
+    20 => 'Minolta/Sony 135mm F2.8 [T4.5] STF',
+    22 => 'Minolta AF 35-80mm F4-5.6 II', # II added (ref 13)
+    23 => 'Minolta AF 200mm F4 Macro APO G',
+    24 => 'Minolta/Sony AF 24-105mm F3.5-4.5 (D) or Sigma or Tamron Lens',
+    24.1 => 'Sigma 18-50mm F2.8',
+    24.2 => 'Sigma 17-70mm F2.8-4.5 (D)',
+    24.3 => 'Sigma 20-40mm F2.8 EX DG Aspherical IF', #JD
+    24.4 => 'Sigma 18-200mm F3.5-6.3 DC', #22
+    24.5 => 'Sigma 20-40mm F2.8 EX DG Aspherical IF', #22
+    24.6 => 'Tamron SP AF 28-75mm F2.8 XR Di (IF) Macro', #JD
+    25 => 'Minolta AF 100-300mm F4.5-5.6 APO (D) or Sigma Lens',
+    25.1 => 'Sigma 100-300mm F4 EX (APO (D) or D IF)', #JD
+    25.2 => 'Sigma 70mm F2.8 EX DG Macro', #JD
+    25.3 => 'Sigma 20mm F1.8 EX DG Aspherical RF', #19
+    25.4 => 'Sigma 30mm F1.4 DG EX', #21
+    27 => 'Minolta AF 85mm F1.4 G (D)', # added (D) (ref 13)
+    28 => 'Minolta/Sony AF 100mm F2.8 Macro (D) or Tamron Lens',
+    # 28 => 'Sony 100mm F2.8 Macro (SAL-100M28)' (ref 18)
+    28.1 => 'Tamron SP AF 90mm F2.8 Di Macro', #JD
+    29 => 'Minolta/Sony AF 75-300mm F4.5-5.6 (D)', # Sony added (ref 13)
+    30 => 'Minolta AF 28-80mm F3.5-5.6 (D) or Sigma Lens',
+    30.1 => 'Sigma AF 10-20mm F4-5.6 EX DC', #JD
+    30.2 => 'Sigma AF 12-24mm F4.5-5.6 EX DG',
+    30.3 => 'Sigma 28-70mm EX DG F2.8', #16
+    30.4 => 'Sigma 55-200mm F4-5.6 DC', #JD
+    31 => 'Minolta/Sony AF 50mm F2.8 Macro (D) or F3.5',
+    31.1 => 'Minolta/Sony AF 50mm F3.5 Macro',
+    32 => 'Minolta/Sony AF 300mm F2.8 G or 1.5x Teleconverter', #13/18
+    # 32 => 'Minolta AF 300mm F2.8 G (D) SSM' (ref 13)
+    # 32 => 'Sony 300mm F2.8 G (SAL-300F28G)' (ref 18)
+    33 => 'Minolta/Sony AF 70-200mm F2.8 G',
+    # 33 => 'Minolta AF 70-200mm F2.8 G (D) SSM' (ref 13)
+    35 => 'Minolta AF 85mm F1.4 G (D) Limited',
+    36 => 'Minolta AF 28-100mm F3.5-5.6 (D)',
+    38 => 'Minolta AF 17-35mm F2.8-4 (D)', # (Konica Minolta, ref 13)
+    39 => 'Minolta AF 28-75mm F2.8 (D)', # (Konica Minolta, ref 13)
+    40 => 'Minolta/Sony AF DT 18-70mm F3.5-5.6 (D) or 18-200m F3.5-6.3', # (Konica Minolta, ref 13)
+    40.1 => 'Sony AF DT 18-200mm F3.5-6.3', #11
+    41 => 'Minolta/Sony AF DT 11-18mm F4.5-5.6 (D) or Tamron Lens', # (Konica Minolta, ref 13)
+    41.1 => 'Tamron SP AF 11-18mm F4.5-5.6 Di II LD Aspherical IF', #JD
+    42 => 'Minolta/Sony AF DT 18-200mm F3.5-6.3 (D)', # Sony added (ref 13) (Konica Minolta, ref 13)
+    43 => 'Sony 35mm F1.4 G (SAL-35F14G)', # changed from Minolta to Sony (ref 13/18) (but ref 11 shows both!)
+    44 => 'Sony 50mm F1.4 (SAL-50F14)', # changed from Minolta to Sony (ref 13/18)
+    45 => 'Carl Zeiss Planar T* 85mm F1.4 ZA',
+    46 => 'Carl Zeiss Vario-Sonnar T* DT 16-80mm F3.5-4.5 ZA',
+    47 => 'Carl Zeiss Sonnar T* 135mm F1.8 ZA',
+    48 => 'Carl Zeiss Vario-Sonnar T* 24-70mm F2.8 ZA SSM (SAL-2470Z)', #11
+    49 => 'Sony AF DT 55-200mm F4-5.6', #JD
+    50 => 'Sony AF DT 18-250mm F3.5-6.3', #11
+    51 => 'Sony AF DT 16-105mm F3.5-5.6 or 55-200mm F4-5.5', #11
+    51.1 => 'Sony AF DT 55-200mm F4-5.5', #11
+    52 => 'Sony 70-300mm F4.5-5.6 G SSM', #JD
+    53 => 'Sony AF 70-400mm F4-5.6 G SSM (SAL-70400G)', #17 (/w correction by Stephen Bishop)
+    54 => 'Carl Zeiss Vario-Sonnar T* 16-35mm F2.8 ZA SSM (SAL-1635Z)', #17
+    55 => 'Sony DT 18-55mm F3.5-5.6 SAM (SAL-1855)', #PH
+    56 => 'Sony AF DT 55-200mm F4-5.6 SAM', #22
+    57 => 'Sony AF DT 50mm F1.8 SAM', #22
+    58 => 'Sony AF DT 30mm F2.8 SAM Macro', #22
+    59 => 'Sony 28-75/2.8 SAM', #21
+    60 => 'Carl Zeiss Distagon T* 24mm F2 SSM', #17
+    61 => 'Sony 85mm F2.8 SAM (SAL-85F28)', #17
+    62 => 'Sony DT 35mm F1.8 SAM (SAL-35F18)', #PH
+    128 => 'Tamron or Sigma Lens (128)',
+    128.1 => 'Tamron 18-200mm F3.5-6.3',
+    128.2 => 'Tamron 28-300mm F3.5-6.3',
+    128.3 => 'Tamron 80-300mm F3.5-6.3',
+    128.4 => 'Tamron AF 28-200mm F3.8-5.6 XR Di Aspherical [IF] MACRO', #JD
+    128.5 => 'Tamron SP AF 17-35mm F2.8-4 Di LD Aspherical IF', #JD
+    128.6 => 'Sigma AF 50-150mm F2.8 EX DC APO HSM II', #JD
+    128.7 => 'Sigma 10-20mm F3.5 EX DC HSM', #11 (model 202-205)
+    128.8 => 'Sigma 70-200mm F2.8 II EX DG APO MACRO HSM', #24
+    129 => 'Tamron Lens (129)',
+    129.1 => 'Tamron 200-400mm F5.6 LD', #12 (LD ref 23)
+    129.2 => 'Tamron 70-300mm F4-5.6 LD', #12
+    131 => 'Tamron 20-40mm F2.7-3.5 SP Aspherical IF', #23
+    135 => 'Vivitar 28-210mm F3.5-5.6', #16
+    136 => 'Tokina EMZ M100 AF 100mm F3.5', #JD
+    137 => 'Cosina 70-210mm F2.8-4 AF', #11
+    138 => 'Soligor 19-35mm F3.5-4.5', #11
+    142 => 'Voigtlander 70-300mm F4.5-5.6', #JD
+    146 => 'Voigtlander Macro APO-Lanthar 125mm F2.5 SL', #JD
+    255 => 'Tamron Lens (255)',
+    255.1 => 'Tamron SP AF 17-50mm F2.8 XR Di II LD Aspherical',
+    255.2 => 'Tamron AF 18-250mm F3.5-6.3 XR Di II LD', #JD
+    255.3 => 'Tamron AF 55-200mm F4-5.6 Di II',
+    255.4 => 'Tamron AF 70-300mm F4-5.6 Di LD MACRO 1:2',
+    255.5 => 'Tamron SP AF 200-500mm F5.0-6.3 Di LD IF',
+    255.6 => 'Tamron SP AF 10-24mm F3.5-4.5 Di II LD Aspherical IF', #22
+    255.7 => 'Tamron SP AF 70-200mm F2.8 Di LD IF Macro', #22
+    255.8 => 'Tamron SP AF 28-75mm F2.8 XR Di LD Aspherical IF', #24
+    25501 => 'Minolta AF 50mm F1.7', #7
+    25511 => 'Minolta AF 35-70mm F4 or Other Lens',
+    25511.1 => 'Sigma UC AF 28-70mm F3.5-4.5', #12/16(HighSpeed-AF)
+    25511.2 => 'Sigma AF 28-70mm F2.8', #JD
+    25511.3 => 'Sigma M-AF 70-200mm F2.8 EX Aspherical', #12
+    25511.4 => 'Quantaray M-AF 35-80mm F4-5.6', #JD
+    25521 => 'Minolta AF 28-85mm F3.5-4.5 or Other Lens', # not New (ref 18)
+    25521.1 => 'Tokina 19-35mm F3.5-4.5', #3
+    25521.2 => 'Tokina 28-70mm F2.8 AT-X', #7
+    25521.3 => 'Tokina 80-400mm F4.5-5.6 AT-X AF II 840', #JD
+    25521.4 => 'Tokina AF PRO 28-80mm F2.8 AT-X 280', #JD
+    25521.5 => 'Tokina AT-X PRO II AF 28-70mm F2.6-2.8 270', #24
+    25521.6 => 'Tamron AF 19-35mm F3.5-4.5', #JD
+    25521.7 => 'Angenieux AF 28-70mm F2.6', #JD
+    25531 => 'Minolta AF 28-135mm F4-4.5 or Sigma Lens',
+    25531.1 => 'Sigma ZOOM-alpha 35-135mm F3.5-4.5', #16
+    25531.2 => 'Sigma 28-105mm F2.8-4 Aspherical', #JD
+    25541 => 'Minolta AF 35-105mm F3.5-4.5', #13
+    25551 => 'Minolta AF 70-210mm F4 Macro or Sigma Lens',
+    25551.1 => 'Sigma 70-210mm F4-5.6 APO', #7
+    25551.2 => 'Sigma M-AF 70-200mm F2.8 EX APO', #6
+    25551.3 => 'Sigma 75-200mm F2.8-3.5', #22
+    25561 => 'Minolta AF 135mm F2.8',
+    25571 => 'Minolta/Sony AF 28mm F2.8', # Sony added (ref 18)
+    # 25571 => 'Sony 28mm F2.8 (SAL-28F28)' (ref 18)
+    25581 => 'Minolta AF 24-50mm F4',
+    25601 => 'Minolta AF 100-200mm F4.5',
+    25611 => 'Minolta AF 75-300mm F4.5-5.6 or Sigma Lens', #13
+    25611.1 => 'Sigma 70-300mm F4-5.6 DL Macro', #12
+    25611.2 => 'Sigma 300mm F4 APO Macro', #3/7
+    25611.3 => 'Sigma AF 500mm F4.5 APO', #JD
+    25611.4 => 'Sigma AF 170-500mm F5-6.3 APO Aspherical', #JD
+    25611.5 => 'Tokina AT-X AF 300mm F4', #JD
+    25611.6 => 'Tokina AT-X AF 400mm F5.6 SD', #22
+    25611.7 => 'Tokina AF 730 II 75-300mm F4.5-5.6', #JD
+    25621 => 'Minolta AF 50mm F1.4 [New]', # original and New, not Sony (ref 13/18)
+    25631 => 'Minolta AF 300mm F2.8 APO or Sigma Lens', # changed G to APO (ref 13)
+    25631.1 => 'Sigma AF 50-500mm F4-6.3 EX DG APO', #JD
+    25631.2 => 'Sigma AF 170-500mm F5-6.3 APO Aspherical', #JD
+    25631.3 => 'Sigma AF 500mm F4.5 EX DG APO', #JD
+    25631.4 => 'Sigma 400mm F5.6 APO', #22
+    25641 => 'Minolta AF 50mm F2.8 Macro or Sigma Lens',
+    25641.1 => 'Sigma 50mm F2.8 EX Macro', #11
+    25651 => 'Minolta AF 600mm F4',
+    25661 => 'Minolta AF 24mm F2.8',
+    25721 => 'Minolta/Sony AF 500mm F8 Reflex',
+    25781 => 'Minolta/Sony AF 16mm F2.8 Fisheye or Sigma Lens', # Sony added (ref 13/18)
+    # 25781 => 'Sony 16mm F2.8 Fisheye (SAL-16F28)' (ref 18)
+    25781.1 => 'Sigma 8mm F4 EX [DG] Fisheye',
+    25781.2 => 'Sigma 14mm F3.5',
+    25781.3 => 'Sigma 15mm F2.8 Fisheye', #JD (writes 16mm to EXIF)
+    25791 => 'Minolta/Sony AF 20mm F2.8', # Sony added (ref 11)
+    25811 => 'Minolta AF 100mm F2.8 Macro [New] or Sigma or Tamron Lens', # not Sony (ref 13/18)
+    25811.1 => 'Sigma AF 90mm F2.8 Macro', #JD
+    25811.2 => 'Sigma AF 105mm F2.8 EX [DG] Macro', #JD
+    25811.3 => 'Sigma 180mm F5.6 Macro',
+    25811.4 => 'Tamron 90mm F2.8 Macro',
+    25851 => 'Beroflex 35-135mm F3.5-4.5', #16
+    25858 => 'Minolta AF 35-105mm F3.5-4.5 New or Tamron Lens',
+    25858.1 => 'Tamron 24-135mm F3.5-5.6',
+    25881 => 'Minolta AF 70-210mm F3.5-4.5',
+    25891 => 'Minolta AF 80-200mm F2.8 APO or Tokina Lens',
+    25891.1 => 'Tokina 80-200mm F2.8',
+    25911 => 'Minolta AF 35mm F1.4', #(from Sony list) (not G as per ref 13)
+    25921 => 'Minolta AF 85mm F1.4 G (D)',
+    25931 => 'Minolta AF 200mm F2.8 G APO',
+    25941 => 'Minolta AF 3x-1x F1.7-2.8 Macro',
+    25961 => 'Minolta AF 28mm F2',
+    25971 => 'Minolta AF 35mm F2 [New]', #13
+    25981 => 'Minolta AF 100mm F2',
+    26041 => 'Minolta AF 80-200mm F4.5-5.6',
+    26051 => 'Minolta AF 35-80mm F4-5.6', #(from Sony list)
+    26061 => 'Minolta AF 100-300mm F4.5-5.6', # not (D) (ref 13/18)
+    26071 => 'Minolta AF 35-80mm F4-5.6', #13
+    26081 => 'Minolta AF 300mm F2.8 HS-APO G', # HS-APO added (ref 13/18)
+    26091 => 'Minolta AF 600mm F4 HS-APO G',
+    26121 => 'Minolta AF 200mm F2.8 HS-APO G',
+    26131 => 'Minolta AF 50mm F1.7 New',
+    26151 => 'Minolta AF 28-105mm F3.5-4.5 xi', # xi, not Power Zoom (ref 13/18)
+    26161 => 'Minolta AF 35-200mm F4.5-5.6 xi', # xi, not Power Zoom (ref 13/18)
+    26181 => 'Minolta AF 28-80mm F4-5.6 xi', # xi, not Power Zoom (ref 13/18)
+    26191 => 'Minolta AF 80-200mm F4.5-5.6 xi', # xi, not Power Zoom (ref 13/18)
+    26201 => 'Minolta AF 28-70mm F2.8 G', #11
+    26211 => 'Minolta AF 100-300mm F4.5-5.6 xi', # xi, not Power Zoom (ref 13/18)
+    26241 => 'Minolta AF 35-80mm F4-5.6 Power Zoom',
+    26281 => 'Minolta AF 80-200mm F2.8 G', #11
+    26291 => 'Minolta AF 85mm F1.4 New',
+    26311 => 'Minolta/Sony AF 100-300mm F4.5-5.6 APO', #11
+    26321 => 'Minolta AF 24-50mm F4 New',
+    26381 => 'Minolta AF 50mm F2.8 Macro New',
+    26391 => 'Minolta AF 100mm F2.8 Macro',
+    26411 => 'Minolta/Sony AF 20mm F2.8 New', # Sony added (ref 13)
+    26421 => 'Minolta AF 24mm F2.8 New',
+    26441 => 'Minolta AF 100-400mm F4.5-6.7 APO', #11
+    26621 => 'Minolta AF 50mm F1.4 New',
+    26671 => 'Minolta AF 35mm F2 New',
+    26681 => 'Minolta AF 28mm F2 New',
+    26721 => 'Minolta AF 24-105mm F3.5-4.5 (D)', #11
+    45671 => 'Tokina 70-210mm F4-5.6', #22
+    45741 => '2x Teleconverter or Tamron or Tokina Lens', #18
+    45741.1 => 'Tamron SP AF 90mm F2.5', #JD
+    45741.2 => 'Tokina RF 500mm F8.0 x2', #JD
+    45741.3 => 'Tokina 300mm F2.8 x2',
+    45751 => '1.4x Teleconverter', #18
+    45851 => 'Tamron SP AF 300mm F2.8 LD IF', #11
+    # all M42-type lenses give a value of 65535 (and FocalLength=0, FNumber=1)
+    65535 => 'T-Mount or Other Lens or no lens', #JD
+    65535.1 => 'Arax MC 35mm F2.8 Tilt+Shift', #JD
+    65535.2 => 'Arax MC 80mm F2.8 Tilt+Shift', #JD
+    65535.3 => 'Zenitar MF 16mm F2.8 Fisheye M42', #JD
+    65535.4 => 'Samyang 500mm Mirror F8.0', #19
+    65535.5 => 'Pentacon Auto 135mm F2.8', #19
+    65535.6 => 'Pentacon Auto 29mm F2.8', #19
+    65535.7 => 'Helios 44-2 58mm F2.0', #19
+);
+
+%minoltaColorMode = (
+    0 => 'Natural color',
+    1 => 'Black & White',
+    2 => 'Vivid color',
+    3 => 'Solarization',
+    4 => 'Adobe RGB',
+    5 => 'Sepia', #10
+    9 => 'Natural', #10
+    12 => 'Portrait', #10
+    13 => 'Natural sRGB',
+    14 => 'Natural+ sRGB',
+    15 => 'Landscape', #10
+    16 => 'Evening', #10
+    17 => 'Night Scene', #10
+    18 => 'Night Portrait', #10
+    0x84 => 'Embed Adobe RGB',
+);
+
+%sonyColorMode = ( #15
+    0 => 'Standard',
+    1 => 'Vivid', #PH
+    2 => 'Portrait',
+    3 => 'Landscape',
+    4 => 'Sunset',
+    5 => 'Night View/Portrait', #(portrait if flash is on)
+    6 => 'B&W',
+    7 => 'Adobe RGB',
+    12 => 'Neutral', # Sony
+    100 => 'Neutral', #JD
+    101 => 'Clear', #JD
+    102 => 'Deep', #JD
+    103 => 'Light', #JD
+    104 => 'Night View', #JD
+    105 => 'Autumn Leaves', #JD
+    0xffffffff => 'n/a', #PH
+);
+
+%minoltaSceneMode = (
+    0 => 'Standard',
+    1 => 'Portrait',
+    2 => 'Text',
+    3 => 'Night Scene',
+    4 => 'Sunset',
+    5 => 'Sports',
+    6 => 'Landscape',
+    7 => 'Night Portrait', #JD
+    8 => 'Macro',
+    9 => 'Super Macro',
+    16 => 'Auto',
+    17 => 'Night View/Portrait',
+    18 => 'Sweep Panorama', #PH (SLT-A55V)
+    19 => 'Handheld Night Shot', #PH
+    20 => 'Anti Motion Blur', #PH
+    21 => 'Cont. Priority AE', #PH
+    22 => 'Auto+',
+    23 => '3D Sweep Panorama', #PH (SLT-A55V)
+    0xffff => 'n/a', #PH
+);
+
+my %exposureIndicator = (
+    0 => 'Not Indicated',
+    1 => 'Under Scale',
+    119 => 'Bottom of Scale',
+    120 => '-2.0',
+    121 => '-1.7',
+    122 => '-1.5',
+    123 => '-1.3',
+    124 => '-1.0',
+    125 => '-0.7',
+    126 => '-0.5',
+    127 => '-0.3',
+    128 => '0',
+    129 => '+0.3',
+    130 => '+0.5',
+    131 => '+0.7',
+    132 => '+1.0',
+    133 => '+1.3',
+    134 => '+1.5',
+    135 => '+1.7',
+    136 => '+2.0',
+    253 => 'Top of Scale',
+    254 => 'Over Scale',
+);
+
+my %onOff = ( 0 => 'On', 1 => 'Off' );
+my %offOn = ( 0 => 'Off', 1 => 'On' );
+
+# Minolta tag table
+%Image::ExifTool::Minolta::Main = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    WRITABLE => 1,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0x0000 => {
+        Name => 'MakerNoteVersion',
+        Writable => 'undef',
+        Count => 4,
+    },
+    0x0001 => {
+        Name => 'MinoltaCameraSettingsOld',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Minolta::CameraSettings',
+            ByteOrder => 'BigEndian',
+        },
+    },
+    0x0003 => {
+        Name => 'MinoltaCameraSettings',
+        # These camera settings are different for the DiMAGE X31
+        Condition => '$self->{Model} ne "DiMAGE X31"',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Minolta::CameraSettings',
+            ByteOrder => 'BigEndian',
+        },
+    },
+    0x0004 => { #8
+        Name => 'MinoltaCameraSettings7D',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Minolta::CameraSettings7D',
+            ByteOrder => 'BigEndian',
+        },
+    },
+    # it appears that image stabilization is on if this tag exists (ref 2),
+    # but it is an 8kB binary data block!
+    0x0018 => {
+        Name => 'ImageStabilization',
+        Condition => '$self->{Model} =~ /^DiMAGE (A1|A2|X1)$/',
+        Notes => q{
+            a block of binary data which exists in DiMAGE A2 (and A1/X1?) images only if
+            image stabilization is enabled
+        },
+        ValueConv => '"On"',
+    },
+    0x0020 => {
+        Name => 'WBInfoA100',
+        Condition => '$$self{Model} eq "DSLR-A100"',
+        Notes => 'currently decoded only for the Sony A100',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Minolta::WBInfoA100',
+            ByteOrder => 'BigEndian',
+        },
+    },
+    0x0040 => {
+        Name => 'CompressedImageSize',
+        Writable => 'int32u',
+    },
+    0x0081 => {
+        # JPEG preview found in DiMAGE 7 images
+        %Image::ExifTool::previewImageTagInfo,
+        Permanent => 1,     # don't add this to a file
+    },
+    0x0088 => {
+        Name => 'PreviewImageStart',
+        Flags => 'IsOffset',
+        OffsetPair => 0x0089, # point to associated byte count
+        DataTag => 'PreviewImage',
+        Writable => 'int32u',
+        Protected => 2,
+        # Note: Sony also uses this tag in A100 ARW images, but it points
+        #       to the same data as JpgFromRaw
+    },
+    0x0089 => {
+        Name => 'PreviewImageLength',
+        OffsetPair => 0x0088, # point to associated offset
+        DataTag => 'PreviewImage',
+        Writable => 'int32u',
+        Protected => 2,
+    },
+    0x0100 => { #10
+        Name => 'SceneMode',
+        Writable => 'int32u',
+        PrintConv => \%minoltaSceneMode,
+    },
+    0x0101 => [
+        {
+            Name => 'ColorMode',
+            Condition => '$self->{Make} !~ /^SONY/',
+            Priority => 0, # Other ColorMode is more reliable for A2
+            Writable => 'int32u',
+            PrintConv => \%minoltaColorMode,
+        },
+        { #15
+            Name => 'ColorMode',
+            Writable => 'int32u',
+            Notes => 'Sony models',
+            PrintConv => \%sonyColorMode,
+        },
+    ],
+    0x0102 => {
+        Name => 'MinoltaQuality',
+        Writable => 'int32u',
+        # PrintConv strings conform with Minolta reference manual (ref 4)
+        # (note that Minolta calls an uncompressed TIFF image "Super fine")
+        PrintConv => {
+            0 => 'Raw',
+            1 => 'Super Fine',
+            2 => 'Fine',
+            3 => 'Standard',
+            4 => 'Economy',
+            5 => 'Extra fine',
+        },
+    },
+    # (0x0103 is the same as 0x0102 above) -- this is true for some
+    # cameras (A2/7Hi), but not others - PH
+    0x0103 => [
+        {
+            Name => 'MinoltaQuality',
+            Writable => 'int32u',
+            Condition => '$self->{Model} =~ /^DiMAGE (A2|7Hi)$/',
+            Notes => 'quality for DiMAGE A2/7Hi',
+            Priority => 0, # lower priority because this doesn't work for A200
+            PrintConv => { #4
+                0 => 'Raw',
+                1 => 'Super Fine',
+                2 => 'Fine',
+                3 => 'Standard',
+                4 => 'Economy',
+                5 => 'Extra fine',
+            },
+        },
+        { #PH
+            Name => 'MinoltaImageSize',
+            Writable => 'int32u',
+            Condition => '$self->{Model} !~ /^DiMAGE A200$/',
+            Notes => 'image size for other models except A200',
+            PrintConv => {
+                1 => '1600x1200',
+                2 => '1280x960',
+                3 => '640x480',
+                5 => '2560x1920',
+                6 => '2272x1704',
+                7 => '2048x1536',
+            },
+        },
+    ],
+    0x0104 => { #14
+        Name => 'FlashExposureComp',
+        Description => 'Flash Exposure Compensation',
+        Writable => 'rational64s',
+    },
+    0x0105 => { #10
+        Name => 'Teleconverter',
+        Writable => 'int32u',
+        PrintHex => 1,
+        PrintConv => {
+            0x00 => 'None',
+            0x48 => 'Minolta AF 2x APO (D)',
+            0x50 => 'Minolta AF 2x APO II',
+            0x88 => 'Minolta AF 1.4x APO (D)',
+            0x90 => 'Minolta AF 1.4x APO II',
+        },
+    },
+    0x0107 => { #8
+        Name => 'ImageStabilization',
+        Writable => 'int32u',
+        PrintConv => {
+            1 => 'Off',
+            5 => 'On',
+        },
+    },
+    0x0109 => { #20
+        Name => 'RawAndJpgRecording',
+        Writable => 'int32u',
+        PrintConv => \%offOn,
+    },
+    0x010a => {
+        Name => 'ZoneMatching',
+        Writable => 'int32u',
+        PrintConv => {
+            0 => 'ISO Setting Used',
+            1 => 'High Key',
+            2 => 'Low Key',
+        },
+    },
+    0x010b => {
+        Name => 'ColorTemperature',
+        Writable => 'int32u',
+    },
+    0x010c => { #3 (Alpha 7)
+        Name => 'LensType',
+        Writable => 'int32u',
+        SeparateTable => 1,
+        PrintConv => \%minoltaLensTypes,
+    },
+    # 0x010e - WhiteBalance according to ref #10
+    0x0111 => { #20
+        Name => 'ColorCompensationFilter',
+        Writable => 'int32s',
+        Notes => 'ranges from -2 for green to +2 for magenta',
+    },
+    0x0112 => { #PH (from Sony tags, NC)
+        Name => 'WhiteBalanceFineTune',
+        Format => 'int32s',
+        Writable => 'int32u',
+    },
+    0x0113 => { #PH
+        Name => 'ImageStabilization',
+        Condition => '$self->{Model} eq "DSLR-A100"',
+        Notes => 'valid for Sony A100 only',
+        Writable => 'int32u',
+        PrintConv => \%offOn,
+    },
+    0x0114 => [
+        { #8
+            Name => 'MinoltaCameraSettings5D',
+            Condition => '$self->{Model} =~ /^(DYNAX 5D|MAXXUM 5D|ALPHA SWEET)/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Minolta::CameraSettings5D',
+                ByteOrder => 'BigEndian',
+            },
+        },
+        { #PH
+            Name => 'CameraSettingsA100',
+            Condition => '$self->{Model} eq "DSLR-A100"',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Minolta::CameraSettingsA100',
+                ByteOrder => 'BigEndian', # required because order differs for ARW and JPG images
+            },
+        },
+    ],
+    0x0115 => { #20
+        Name => 'WhiteBalance',
+        Writable => 'int32u',
+        PrintHex => 1,
+        PrintConv => {
+            0x00 => 'Auto',
+            0x01 => 'Color Temperature/Color Filter',
+            0x10 => 'Daylight',
+            0x20 => 'Cloudy',
+            0x30 => 'Shade',
+            0x40 => 'Tungsten',
+            0x50 => 'Flash',
+            0x60 => 'Fluorescent',
+            0x70 => 'Custom',
+        },
+    },
+    0x0e00 => {
+        Name => 'PrintIM',
+        Description => 'Print Image Matching',
+        Writable => 0,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::PrintIM::Main',
+        },
+    },
+    0x0f00 => {
+        Name => 'MinoltaCameraSettings2',
+        Writable => 0,
+        Binary => 1,
+    },
+);
+
+%Image::ExifTool::Minolta::CameraSettings = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    PRIORITY => 0, # not as reliable as other tags
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    FORMAT => 'int32u',
+    FIRST_ENTRY => 0,
+    NOTES => q{
+        There is some variability in CameraSettings information between different
+        models (and sometimes even between different firmware versions), so this
+        information may not be as reliable as it should be.  Because of this, tags
+        in the following tables are set to lower priority to prevent them from
+        superceding the values of same-named tags in other locations when duplicate
+        tags are disabled.
+    },
+    1 => {
+        Name => 'ExposureMode',
+        PrintConv => {
+            0 => 'Program',
+            1 => 'Aperture Priority',
+            2 => 'Shutter Priority',
+            3 => 'Manual',
+        },
+    },
+    2 => {
+        Name => 'FlashMode',
+        PrintConv => {
+            0 => 'Fill flash',
+            1 => 'Red-eye reduction',
+            2 => 'Rear flash sync',
+            3 => 'Wireless',
+            4 => 'Off?', #PH
+        },
+    },
+    3 => {
+        Name => 'WhiteBalance',
+        PrintConv => 'Image::ExifTool::Minolta::ConvertWhiteBalance($val)',
+    },
+    4 => {
+        Name => 'MinoltaImageSize',
+        PrintConv => {
+            0 => 'Full',
+            1 => '1600x1200',
+            2 => '1280x960',
+            3 => '640x480',
+            6 => '2080x1560', #PH (A2)
+            7 => '2560x1920', #PH (A2)
+            8 => '3264x2176', #PH (A2)
+        },
+    },
+    5 => {
+        Name => 'MinoltaQuality',
+        PrintConv => { #4
+            0 => 'Raw',
+            1 => 'Super Fine',
+            2 => 'Fine',
+            3 => 'Standard',
+            4 => 'Economy',
+            5 => 'Extra Fine',
+        },
+    },
+    6 => {
+        Name => 'DriveMode',
+        PrintConv => {
+            0 => 'Single',
+            1 => 'Continuous',
+            2 => 'Self-timer',
+            4 => 'Bracketing',
+            5 => 'Interval',
+            6 => 'UHS continuous',
+            7 => 'HS continuous',
+        },
+    },
+    7 => {
+        Name => 'MeteringMode',
+        PrintConv => {
+            0 => 'Multi-segment',
+            1 => 'Center-weighted average',
+            2 => 'Spot',
+        },
+    },
+    8 => {
+        Name => 'ISO',
+        ValueConv => '2 ** (($val-48)/8) * 100',
+        ValueConvInv => '48 + 8*log($val/100)/log(2)',
+        PrintConv => 'int($val + 0.5)',
+        PrintConvInv => '$val',
+    },
+    9 => {
+        Name => 'ExposureTime',
+        ValueConv => '2 ** ((48-$val)/8)',
+        ValueConvInv => '48 - 8*log($val)/log(2)',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    10 => {
+        Name => 'FNumber',
+        ValueConv => '2 ** (($val-8)/16)',
+        ValueConvInv => '8 + 16*log($val)/log(2)',
+        PrintConv => 'sprintf("%.1f",$val)',
+        PrintConvInv => '$val',
+    },
+    11 => {
+        Name => 'MacroMode',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'On',
+        },
+    },
+    12 => {
+        Name => 'DigitalZoom',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Electronic magnification',
+            2 => '2x',
+        },
+    },
+    13 => {
+        Name => 'ExposureCompensation',
+        ValueConv => '$val/3 - 2',
+        ValueConvInv => '($val + 2) * 3',
+        PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    14 => {
+        Name => 'BracketStep',
+        PrintConv => {
+            0 => '1/3 EV',
+            1 => '2/3 EV',
+            2 => '1 EV',
+        },
+    },
+    16 => 'IntervalLength',
+    17 => 'IntervalNumber',
+    18 => {
+        Name => 'FocalLength',
+        ValueConv => '$val / 256',
+        ValueConvInv => '$val * 256',
+        PrintConv => 'sprintf("%.1f mm",$val)',
+        PrintConvInv => '$val=~s/\s*mm$//;$val',
+    },
+    19 => {
+        Name => 'FocusDistance',
+        ValueConv => '$val / 1000',
+        ValueConvInv => '$val * 1000',
+        PrintConv => '$val ? "$val m" : "inf"',
+        PrintConvInv => '$val eq "inf" ? 0 : $val =~ s/\s*m$//, $val',
+    },
+    20 => {
+        Name => 'FlashFired',
+        PrintConv => {
+            0 => 'No',
+            1 => 'Yes',
+        },
+    },
+    21 => {
+        Name => 'MinoltaDate',
+        Groups => { 2 => 'Time' },
+        Shift => 'Time',
+        ValueConv => 'sprintf("%4d:%.2d:%.2d",$val>>16,($val&0xff00)>>8,$val&0xff)',
+        ValueConvInv => 'my @a=($val=~/(\d+):(\d+):(\d+)/); @a ? ($a[0]<<16)+($a[1]<<8)+$a[2] : undef',
+    },
+    22 => {
+        Name => 'MinoltaTime',
+        Groups => { 2 => 'Time' },
+        Shift => 'Time',
+        ValueConv => 'sprintf("%.2d:%.2d:%.2d",$val>>16,($val&0xff00)>>8,$val&0xff)',
+        ValueConvInv => 'my @a=($val=~/(\d+):(\d+):(\d+)/); @a ? ($a[0]<<16)+($a[1]<<8)+$a[2] : undef',
+    },
+    23 => {
+        Name => 'MaxAperture',
+        ValueConv => '2 ** (($val-8)/16)',
+        ValueConvInv => '8 + 16*log($val)/log(2)',
+        PrintConv => 'sprintf("%.1f",$val)',
+        PrintConvInv => '$val',
+    },
+    26 => {
+        Name => 'FileNumberMemory',
+        PrintConv => \%offOn,
+    },
+    27 => 'LastFileNumber',
+    28 => {
+        Name => 'ColorBalanceRed',
+        ValueConv => '$val / 256',
+        ValueConvInv => '$val * 256',
+    },
+    29 => {
+        Name => 'ColorBalanceGreen',
+        ValueConv => '$val / 256',
+        ValueConvInv => '$val * 256',
+    },
+    30 => {
+        Name => 'ColorBalanceBlue',
+        ValueConv => '$val / 256',
+        ValueConvInv => '$val * 256',
+    },
+    31 => {
+        Name => 'Saturation',
+        ValueConv => '$val - ($self->{Model}=~/DiMAGE A2/ ? 5 : 3)',
+        ValueConvInv => '$val + ($self->{Model}=~/DiMAGE A2/ ? 5 : 3)',
+        %Image::ExifTool::Exif::printParameter,
+    },
+    32 => {
+        Name => 'Contrast',
+        ValueConv => '$val - ($self->{Model}=~/DiMAGE A2/ ? 5 : 3)',
+        ValueConvInv => '$val + ($self->{Model}=~/DiMAGE A2/ ? 5 : 3)',
+        %Image::ExifTool::Exif::printParameter,
+    },
+    33 => {
+        Name => 'Sharpness',
+        PrintConv => {
+            0 => 'Hard',
+            1 => 'Normal',
+            2 => 'Soft',
+        },
+    },
+    34 => {
+        Name => 'SubjectProgram',
+        PrintConv => {
+            0 => 'None',
+            1 => 'Portrait',
+            2 => 'Text',
+            3 => 'Night portrait',
+            4 => 'Sunset',
+            5 => 'Sports action',
+        },
+    },
+    35 => {
+        Name => 'FlashExposureComp',
+        Description => 'Flash Exposure Compensation',
+        ValueConv => '($val - 6) / 3',
+        ValueConvInv => '$val * 3 + 6',
+        PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    36 => {
+        Name => 'ISOSetting',
+        PrintConv => {
+            0 => 100,
+            1 => 200,
+            2 => 400,
+            3 => 800,
+            4 => 'Auto',
+            5 => 64,
+        },
+    },
+    37 => {
+        Name => 'MinoltaModelID',
+        PrintConv => {
+            0 => 'DiMAGE 7, X1, X21 or X31',
+            1 => 'DiMAGE 5',
+            2 => 'DiMAGE S304',
+            3 => 'DiMAGE S404',
+            4 => 'DiMAGE 7i',
+            5 => 'DiMAGE 7Hi',
+            6 => 'DiMAGE A1',
+            7 => 'DiMAGE A2 or S414',
+        },
+    },
+    38 => {
+        Name => 'IntervalMode',
+        PrintConv => {
+            0 => 'Still Image',
+            1 => 'Time-lapse Movie',
+        },
+    },
+    39 => {
+        Name => 'FolderName',
+        PrintConv => {
+            0 => 'Standard Form',
+            1 => 'Data Form',
+        },
+    },
+    40 => {
+        Name => 'ColorMode',
+        PrintConv => {
+            0 => 'Natural color',
+            1 => 'Black & White',
+            2 => 'Vivid color',
+            3 => 'Solarization',
+            4 => 'Adobe RGB',
+        },
+    },
+    41 => {
+        Name => 'ColorFilter',
+        ValueConv => '$val - ($self->{Model}=~/DiMAGE A2/ ? 5 : 3)',
+        ValueConvInv => '$val + ($self->{Model}=~/DiMAGE A2/ ? 5 : 3)',
+    },
+    42 => 'BWFilter',
+    43 => {
+        Name => 'InternalFlash',
+        PrintConv => {
+            0 => 'No',
+            1 => 'Fired',
+        },
+    },
+    44 => {
+        Name => 'Brightness',
+        ValueConv => '$val/8 - 6',
+        ValueConvInv => '($val + 6) * 8',
+    },
+    45 => 'SpotFocusPointX',
+    46 => 'SpotFocusPointY',
+    47 => {
+        Name => 'WideFocusZone',
+        PrintConv => {
+            0 => 'No zone',
+            1 => 'Center zone (horizontal orientation)',
+            2 => 'Center zone (vertical orientation)',
+            3 => 'Left zone',
+            4 => 'Right zone',
+        },
+    },
+    48 => {
+        Name => 'FocusMode',
+        PrintConv => {
+            0 => 'AF',
+            1 => 'MF',
+        },
+    },
+    49 => {
+        Name => 'FocusArea',
+        PrintConv => {
+            0 => 'Wide Focus (normal)',
+            1 => 'Spot Focus',
+        },
+    },
+    50 => {
+        Name => 'DECPosition',
+        PrintConv => {
+            0 => 'Exposure',
+            1 => 'Contrast',
+            2 => 'Saturation',
+            3 => 'Filter',
+        },
+    },
+    # 7Hi only:
+    51 => {
+        Name => 'ColorProfile',
+        Condition => '$self->{Model} eq "DiMAGE 7Hi"',
+        Notes => 'DiMAGE 7Hi only',
+        PrintConv => {
+            0 => 'Not Embedded',
+            1 => 'Embedded',
+        },
+    },
+    # (the following may be entry 51 for other models?)
+    52 => {
+        Name => 'DataImprint',
+        Condition => '$self->{Model} eq "DiMAGE 7Hi"',
+        Notes => 'DiMAGE 7Hi only',
+        PrintConv => {
+            0 => 'None',
+            1 => 'YYYY/MM/DD',
+            2 => 'MM/DD/HH:MM',
+            3 => 'Text',
+            4 => 'Text + ID#',
+        },
+    },
+    63 => { #9
+        Name => 'FlashMetering',
+        PrintConv => {
+            0 => 'ADI (Advanced Distance Integration)',
+            1 => 'Pre-flash TTL',
+            2 => 'Manual flash control',
+        },
+    },
+);
+
+# Camera settings used by the 7D (ref 8)
+%Image::ExifTool::Minolta::CameraSettings7D = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    PRIORITY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    FORMAT => 'int16u',
+    FIRST_ENTRY => 0,
+    0x00 => {
+        Name => 'ExposureMode',
+        PrintConv => {
+            0 => 'Program',
+            1 => 'Aperture Priority',
+            2 => 'Shutter Priority',
+            3 => 'Manual',
+            4 => 'Auto',
+            5 => 'Program-shift A',
+            6 => 'Program-shift S',
+        },
+    },
+    0x02 => { #PH
+        Name => 'MinoltaImageSize',
+        PrintConv => {
+            0 => 'Large',
+            1 => 'Medium',
+            2 => 'Small',
+        },
+    },
+    0x03 => {
+        Name => 'MinoltaQuality',
+        PrintConv => {
+            0 => 'RAW',
+            16 => 'Fine', #PH
+            32 => 'Normal', #PH
+            34 => 'RAW+JPEG',
+            48 => 'Economy', #PH
+        },
+    },
+    0x04 => {
+        Name => 'WhiteBalance',
+        PrintConv => {
+            0 => 'Auto',
+            1 => 'Daylight',
+            2 => 'Shade',
+            3 => 'Cloudy',
+            4 => 'Tungsten',
+            5 => 'Fluorescent',
+            0x100 => 'Kelvin',
+            0x200 => 'Manual',
+        },
+    },
+    0x0e => {
+        Name => 'FocusMode',
+        PrintConv => {
+            0 => 'AF-S',
+            1 => 'AF-C',
+            # Note: these two are reversed in ref 8
+            3 => 'Manual', #JD
+            4 => 'AF-A', #JD
+        },
+    },
+    0x10 => {
+        Name => 'AFPoints',
+        PrintConv => { BITMASK => {
+            0 => 'Center',
+            1 => 'Top',
+            2 => 'Top-Right',
+            3 => 'Right',
+            4 => 'Bottom-Right',
+            5 => 'Bottom',
+            6 => 'Bottom-Left',
+            7 => 'Left',
+            8 => 'Top-Left',
+        } },
+    },
+    0x15 => {
+        Name => 'Flash',
+        PrintConv => \%offOn,
+    },
+    0x16 => { #10
+        Name => 'FlashMode',
+        PrintConv => {
+            0 => 'Normal',
+            1 => 'Red-eye reduction',
+            2 => 'Rear flash sync',
+        },
+    },
+    0x1c => {
+        Name => 'ISOSetting',
+        PrintConv => {
+            0 => 'Auto', #10
+            1 => 100,
+            3 => 200,
+            4 => 400,
+            5 => 800,
+            6 => 1600,
+            7 => 3200,
+        },
+    },
+    0x1e => {
+        Name => 'ExposureCompensation',
+        Format => 'int16s',
+        ValueConv => '$val / 24',
+        ValueConvInv => '$val * 24',
+        PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    0x25 => {
+        Name => 'ColorSpace',
+        PrintConv => {
+            0 => 'Natural sRGB',
+            1 => 'Natural+ sRGB',
+            4 => 'Adobe RGB',
+        },
+    },
+    0x26 => {
+        Name => 'Sharpness',
+        ValueConv => '$val - 10',
+        ValueConvInv => '$val + 10',
+    },
+    0x27 => {
+        Name => 'Contrast',
+        ValueConv => '$val - 10',
+        ValueConvInv => '$val + 10',
+    },
+    0x28 => {
+        Name => 'Saturation',
+        ValueConv => '$val - 10',
+        ValueConvInv => '$val + 10',
+    },
+    0x2d => 'FreeMemoryCardImages',
+    0x3f => {
+        Format => 'int16s',
+        Name => 'ColorTemperature',
+        ValueConv => '$val * 100',
+        ValueConvInv => '$val / 100',
+    },
+    0x40 => { #10
+        Name => 'HueAdjustment',
+        ValueConv => '$val - 10',
+        ValueConvInv => '$val + 10',
+    },
+    0x46 => {
+        Name => 'Rotation',
+        PrintConv => {
+            72 => 'Horizontal (normal)',
+            76 => 'Rotate 90 CW',
+            82 => 'Rotate 270 CW',
+        },
+    },
+    0x47 => {
+        Name => 'FNumber',
+        ValueConv => '2 ** (($val-8)/16)',
+        ValueConvInv => '8 + 16*log($val)/log(2)',
+        PrintConv => 'sprintf("%.1f",$val)',
+        PrintConvInv => '$val',
+    },
+    0x48 => {
+        Name => 'ExposureTime',
+        ValueConv => '2 ** ((48-$val)/8)',
+        ValueConvInv => '48 - 8*log($val)/log(2)',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    0x4a => 'FreeMemoryCardImages',
+    0x5e => {
+        Name => 'ImageNumber',
+        Notes => q{
+            this information may appear at index 98 (0x62), depending on firmware
+            version
+        },
+        ValueConv => '$val + 1',
+        ValueConvInv => '$val - 1',
+    },
+    0x60 => {
+        Name => 'NoiseReduction',
+        PrintConv => \%offOn,
+    },
+    0x62 => {
+        Name => 'ImageNumber2',
+        ValueConv => '$val + 1',
+        ValueConvInv => '$val - 1',
+    },
+    0x71 => {
+        Name => 'ImageStabilization',
+        PrintConv => \%offOn,
+    },
+    0x75 => {
+        Name => 'ZoneMatchingOn',
+        PrintConv => \%offOn,
+    },
+);
+
+# Camera settings used by the 5D (ref 8)
+%Image::ExifTool::Minolta::CameraSettings5D = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    PRIORITY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    FORMAT => 'int16u',
+    FIRST_ENTRY => 0,
+    0x0a => {
+        Name => 'ExposureMode',
+        PrintConv => {
+            0 => 'Program',
+            1 => 'Aperture Priority',
+            2 => 'Shutter Priority',
+            3 => 'Manual',
+            4 => 'Auto?',
+            4131 => 'Connected Copying?',
+        },
+    },
+    0x0c => { #PH
+        Name => 'MinoltaImageSize',
+        PrintConv => {
+            0 => 'Large',
+            1 => 'Medium',
+            2 => 'Small',
+        },
+    },
+    0x0d => {
+        Name => 'MinoltaQuality',
+        PrintConv => {
+            0 => 'RAW',
+            16 => 'Fine', #PH
+            32 => 'Normal', #PH
+            34 => 'RAW+JPEG',
+            48 => 'Economy', #PH
+        },
+    },
+    0x0e => {
+        Name => 'WhiteBalance',
+        PrintConv => {
+            0 => 'Auto',
+            1 => 'Daylight',
+            2 => 'Cloudy',
+            3 => 'Shade',
+            4 => 'Tungsten',
+            5 => 'Fluorescent',
+            6 => 'Flash',
+            0x100 => 'Kelvin',
+            0x200 => 'Manual',
+        },
+    },
+    # 0x0f-0x11 something to do with WB RGB levels as shot? (PH)
+    # 0x12-0x17 RGB levels for other WB modes (with G missing)? (PH)
+    0x1f => { #PH
+        Name => 'Flash',
+        PrintConv => {
+            0 => 'Did not fire',
+            1 => 'Fired',
+        },
+    },
+    0x20 => { #10
+        Name => 'FlashMode',
+        PrintConv => {
+            0 => 'Normal',
+            1 => 'Red-eye reduction',
+            2 => 'Rear flash sync',
+        },
+    },
+    0x25 => {
+        Name => 'MeteringMode',
+        PrintConv => {
+            0 => 'Multi-segment',
+            1 => 'Center-weighted average',
+            2 => 'Spot',
+        },
+    },
+    0x26 => {
+        Name => 'ISOSetting',
+        PrintConv => {
+            0 => 'Auto',
+            1 => 100,
+            3 => 200,
+            4 => 400,
+            5 => 800,
+            6 => 1600,
+            7 => 3200,
+            8 => '200 (Zone Matching High)',
+            10 => '80 (Zone Matching Low)',
+        },
+    },
+# looks wrong:
+#    0x28 => { #10
+#        Name => 'ExposureCompensation',
+#        ValueConv => '$val / 24',
+#        ValueConvInv => '$val * 24',
+#    },
+    0x2f => { #10
+        Name => 'ColorSpace',
+        PrintConv => {
+            0 => 'Natural sRGB',
+            1 => 'Natural+ sRGB',
+            2 => 'Monochrome',
+            4 => 'Adobe RGB (ICC)',
+            5 => 'Adobe RGB',
+        },
+    },
+    0x30 => {
+        Name => 'Sharpness',
+        ValueConv => '$val - 10',
+        ValueConvInv => '$val + 10',
+    },
+    0x31 => {
+        Name => 'Contrast',
+        ValueConv => '$val - 10',
+        ValueConvInv => '$val + 10',
+    },
+    0x32 => {
+        Name => 'Saturation',
+        ValueConv => '$val - 10',
+        ValueConvInv => '$val + 10',
+    },
+    0x35 => { #PH
+        Name => 'ExposureTime',
+        ValueConv => '2 ** ((48-$val)/8)',
+        ValueConvInv => '48 - 8*log($val)/log(2)',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    0x36 => { #PH
+        Name => 'FNumber',
+        ValueConv => '2 ** (($val-8)/16)',
+        ValueConvInv => '8 + 16*log($val)/log(2)',
+        PrintConv => 'sprintf("%.1f",$val)',
+        PrintConvInv => '$val',
+    },
+    0x37 => 'FreeMemoryCardImages',
+    # 0x38 definitely not related to exposure comp as in ref 8 (PH)
+    0x49 => { #PH
+        Name => 'ColorTemperature',
+        Format => 'int16s',
+        ValueConv => '$val * 100',
+        ValueConvInv => '$val / 100',
+    },
+    0x4a => { #10
+        Name => 'HueAdjustment',
+        ValueConv => '$val - 10',
+        ValueConvInv => '$val + 10',
+    },
+    0x50 => {
+        Name => 'Rotation',
+        PrintConv => {
+            72 => 'Horizontal (normal)',
+            76 => 'Rotate 90 CW',
+            82 => 'Rotate 270 CW',
+        },
+    },
+    0x53 => {
+        Name => 'ExposureCompensation',
+        ValueConv => '$val / 100 - 3',
+        ValueConvInv => '($val + 3) * 100',
+        PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    0x54 => 'FreeMemoryCardImages',
+    0x65 => { #10
+        Name => 'Rotation',
+        PrintConv => {
+            0 => 'Horizontal (normal)',
+            1 => 'Rotate 90 CW',
+            2 => 'Rotate 270 CW',
+        },
+    },
+    # 0x66 maybe program mode or some setting like this? (PH)
+    0x6e => { #10
+        Name => 'ColorTemperature',
+        Format => 'int16s',
+        ValueConv => '$val * 100',
+        ValueConvInv => '$val / 100',
+    },
+    0x71 => { #10
+        Name => 'PictureFinish',
+        PrintConv => {
+            0 => 'Natural',
+            1 => 'Natural+',
+            2 => 'Portrait',
+            3 => 'Wind Scene',
+            4 => 'Evening Scene',
+            5 => 'Night Scene',
+            6 => 'Night Portrait',
+            7 => 'Monochrome',
+            8 => 'Adobe RGB',
+            9 => 'Adobe RGB (ICC)',
+        },
+    },
+    # 0x95 FlashStrength? (PH)
+    # 0xa4 similar information to 0x27, except with different values
+    0xae => {
+        Name => 'ImageNumber',
+        ValueConv => '$val + 1',
+        ValueConvInv => '$val - 1',
+    },
+    0xb0 => {
+        Name => 'NoiseReduction',
+        PrintConv => \%offOn,
+    },
+    0xbd => {
+        Name => 'ImageStabilization',
+        PrintConv => \%offOn,
+    },
+);
+
+# Camera settings used by the Sony DSLR-A100 (ref PH)
+%Image::ExifTool::Minolta::CameraSettingsA100 = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    NOTES => 'Camera settings information for the Sony DSLR-A100.',
+    WRITABLE => 1,
+    PRIORITY => 0, # may not be as reliable as other information
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    FORMAT => 'int16u',
+    FIRST_ENTRY => 0,
+    0x00 => { #15
+        Name => 'ExposureMode',
+        PrintHex => 1,
+        PrintConv => {
+            0 => 'Program',
+            1 => 'Aperture Priority',
+            2 => 'Shutter Priority',
+            3 => 'Manual',
+            4 => 'Auto',
+            5 => 'Program Shift A', #20
+            6 => 'Program Shift S', #20
+            0x1013 => 'Portrait',
+            0x1023 => 'Sports', #20
+            0x1033 => 'Sunset', #20
+            0x1043 => 'Night View/Portrait', #20
+            0x1053 => 'Landscape',
+            0x1083 => 'Macro', #20
+        },
+    },
+    0x01 => { #15
+        Name => 'ExposureCompensationSetting',
+        # (differs from ExposureCompensation for exposure bracketing shots, ref 20)
+        ValueConv => '$val / 100 - 3',
+        ValueConvInv => 'int(($val + 3) * 100 + 0.5)',
+    },
+    0x05 => { #20 (requires external flash)
+        Name => 'HighSpeedSync',
+        PrintConv => \%offOn,
+    },
+    0x06 => { #20
+        Name => 'ManualExposureTime',
+        Notes => 'the most recent exposure time set manually by the user',
+        ValueConv => '$val ? 2 ** ((48-$val)/8) : $val',
+        ValueConvInv => '$val ? 48 - 8*log($val)/log(2) : $val',
+        PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"',
+        PrintConvInv => 'lc($val) eq "bulb" ? 0 : Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    0x07 => { #20
+        Name => 'ManualFNumber',
+        Notes => 'the most recent aperture set manually by the user',
+        ValueConv => '2 ** (($val-8)/16)',
+        ValueConvInv => '8 + 16*log($val)/log(2)',
+        PrintConv => 'sprintf("%.1f",$val)',
+        PrintConvInv => '$val',
+    },
+    0x08 => { #20
+        Name => 'ExposureTime',
+        ValueConv => '$val ? 2 ** ((48-$val)/8) : $val',
+        ValueConvInv => '$val ? 48 - 8*log($val)/log(2) : $val',
+        PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"',
+        PrintConvInv => 'lc($val) eq "bulb" ? 0 : Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    0x09 => { #15/20
+        Name => 'FNumber',
+        ValueConv => '2 ** (($val / 8 - 1) / 2)',
+        ValueConvInv => '$val>0 ? (2*log($val)/log(2)+1) * 8 : undef',
+        PrintConv => 'sprintf("%.1f",$val)',
+        PrintConvInv => '$val',
+    },
+    0x0a => { #20
+        Name => 'DriveMode2',
+        PrintConv => {
+            0 => 'Self-timer 10 sec',
+            1 => 'Continuous',
+            4 => 'Self-timer 2 sec',
+            5 => 'Single Frame',
+            8 => 'White Balance Bracketing Low',
+            9 => 'White Balance Bracketing High',
+            770 => 'Single-frame Bracketing Low',
+            771 => 'Continous Bracketing Low',
+            1794 => 'Single-frame Bracketing High',
+            1795 => 'Continuous Bracketing High',
+        },
+    },
+    0x0b => { #15
+        Name => 'WhiteBalance',
+        PrintHex => 1,
+        PrintConv => {
+            0 => 'Auto',
+            1 => 'Daylight',
+            2 => 'Cloudy',
+            3 => 'Shade',
+            4 => 'Tungsten',
+            5 => 'Fluorescent',
+            6 => 'Flash',
+            0x100 => 'Kelvin',
+            0x200 => 'Manual',
+        },
+    },
+    0x0c => { #20
+        Name => 'FocusMode',
+        PrintConv => {
+            0 => 'AF-S',
+            1 => 'AF-C',
+            4 => 'AF-A',
+            5 => 'Manual',
+            6 => 'DMF',
+        },
+    },
+    0x0d => { #20
+        Name => 'LocalAFAreaPoint',
+        PrintConv => {
+            1 => 'Center',
+            2 => 'Top',
+            3 => 'Top-Right',
+            4 => 'Right',
+            5 => 'Bottom-Right',
+            6 => 'Bottom',
+            7 => 'Bottom-Left',
+            8 => 'Left',
+            9 => 'Top-Left',
+        },
+    },
+    0x0e => { #20
+        Name => 'AFAreaMode',
+        PrintConv => {
+            0 => 'Wide',
+            1 => 'Local',
+            2 => 'Spot',
+        },
+    },
+    0x0f => { #20
+        Name => 'FlashMode',
+        PrintConv => {
+            0 => 'Auto',
+            2 => 'Rear Sync',
+            3 => 'Wireless',
+            4 => 'Fill Flash',
+        },
+    },
+    0x10 => { #20
+        Name => 'FlashExposureCompSetting',
+        Description => 'Flash Exposure Comp. Setting',
+        # (may differ from FlashExposureComp for flash bracketing shots)
+        ValueConv => '$val / 100 - 3',
+        ValueConvInv => 'int(($val + 3) * 100 + 0.5)',
+    },
+    0x12 => { #15/20
+        Name => 'MeteringMode',
+        PrintConv => {
+            0 => 'Multi-segment',
+            1 => 'Center-weighted average',
+            2 => 'Spot',
+        },
+    },
+    0x13 => { #15/20
+        Name => 'ISOSetting',
+        PrintConv => {
+            0 => 'Auto',
+            48 => 100,
+            56 => 200,
+            64 => 400,
+            72 => 800,
+            80 => 1600,
+            174 => '80 (Zone Matching Low)',
+            184 => '200 (Zone Matching High)',
+        },
+    },
+    0x14 => { #15/20
+        Name => 'ZoneMatchingMode',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Standard',
+            2 => 'Advanced',
+        },
+    },
+    0x15 => { #15/20
+        Name => 'DynamicRangeOptimizer',
+        # this and the Sony tag 0xb025 DynamicRangeOptimizer give the actual mode
+        # applied to the image. The Minolta CameraSettingsA100 0x0027 tag gives
+        # the setting. There is a longish list of scenarios in which, regardless
+        # of the latter, DRO is not applied (ref 20)
+        Notes => 'as applied to image',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Standard',
+            2 => 'Advanced',
+        },
+    },
+    0x16 => { #15
+        Name => 'ColorMode',
+        PrintConv => {
+            0 => 'Standard',
+            1 => 'Vivid',
+            2 => 'Portrait',
+            3 => 'Landscape',
+            4 => 'Sunset',
+            5 => 'Night Scene',
+            7 => 'B&W',
+            8 => 'Adobe RGB',
+        },
+    },
+    0x17 => { # 15/20
+        Name => 'ColorSpace',
+        PrintConv => {
+            0 => 'sRGB',
+            5 => 'Adobe RGB',
+        },
+    },
+    0x18 => { #15
+        Name => 'Sharpness',
+        ValueConv => '$val - 10',
+        ValueConvInv => '$val + 10',
+        %Image::ExifTool::Exif::printParameter,
+    },
+    0x19 => { #15
+        Name => 'Contrast',
+        ValueConv => '$val - 10',
+        ValueConvInv => '$val + 10',
+        %Image::ExifTool::Exif::printParameter,
+    },
+    0x1a => { #15
+        Name => 'Saturation',
+        ValueConv => '$val - 10',
+        ValueConvInv => '$val + 10',
+        %Image::ExifTool::Exif::printParameter,
+    },
+    0x1c => { #20
+        Name => 'FlashMetering',
+        PrintConv => {
+            0 => 'ADI (Advanced Distance Integration)',
+            1 => 'Pre-flash TTL',
+        },
+    },
+    0x1d => { #20
+        Name => 'PrioritySetupShutterRelease',
+        PrintConv => {
+            0 => 'AF',
+            1 => 'Release',
+        },
+    },
+    0x1e => { #PH
+        Name => 'DriveMode',
+        PrintConv => {
+            0 => 'Single Frame',
+            1 => 'Continuous',
+            2 => 'Self-timer',
+            3 => 'Continuous Bracketing',
+            4 => 'Single-Frame Bracketing',
+            5 => 'White Balance Bracketing',
+        },
+    },
+    0x1f => { #20
+        Name => 'SelfTimerTime',
+        PrintConv => {
+            0 => '10 s',
+            4 => '2 s',
+        },
+    },
+    0x20 => { #20
+        Name => 'ContinuousBracketing',
+        PrintHex => 1,
+        PrintConv => {
+            0x303 => 'Low',
+            0x703 => 'High',
+        },
+    },
+    0x21 => { #20
+        Name => 'SingleFrameBracketing',
+        PrintHex => 1,
+        PrintConv => {
+            0x302 => 'Low',
+            0x702 => 'High',
+        },
+    },
+    0x22 => { #20
+        Name => 'WhiteBalanceBracketing',
+        PrintHex => 1,
+        PrintConv => {
+            0x08 => 'Low',
+            0x09 => 'High',
+        },
+    },
+    0x023 => { #20
+        Name => 'WhiteBalanceSetting',
+        PrintHex => 1,
+        # (not sure what bit 0x8000 indicates)
+        PrintConv => {
+            0 => 'Auto',
+            1 => 'Preset',
+            2 => 'Custom',
+            3 => 'Color Temperature/Color Filter',
+            0x8001 => 'Preset',
+            0x8002 => 'Custom',
+            0x8003 => 'Color Temperature/Color Filter',
+        },
+    },
+    0x24 => { #20
+        Name => 'PresetWhiteBalance',
+        PrintConv => {
+            1 => 'Daylight',
+            2 => 'Cloudy',
+            3 => 'Shade',
+            4 => 'Tungsten',
+            5 => 'Fluorescent',
+            6 => 'Flash',
+        },
+    },
+    0x25 => { #20
+        Name => 'ColorTemperatureSetting',
+        PrintConv => {
+            0 => 'Temperature',
+            2 => 'Color Filter',
+        },
+    },
+    0x26 => { #20
+        Name => 'CustomWBSetting',
+        PrintConv => {
+            0 => 'Setup',
+            1 => 'Recall',
+        },
+    },
+    0x27 => { #20
+        Name => 'DynamicRangeOptimizerSetting',
+        Notes => 'as set in camera',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Standard',
+            2 => 'Advanced',
+        },
+    },
+    0x32 => 'FreeMemoryCardImages', #20
+    0x34 => 'CustomWBRedLevel', #20
+    0x35 => 'CustomWBGreenLevel', #20
+    0x36 => 'CustomWBBlueLevel', #20
+    0x37 => { #20
+        Name => 'CustomWBError',
+        PrintConv => {
+            0 => 'OK',
+            1 => 'Error',
+        },
+    },
+    0x38 => { #20
+        Name => 'WhiteBalanceFineTune',
+        Format => 'int16s',
+    },
+    0x39 => { #20
+        Name => 'ColorTemperature',
+        ValueConv => '$val * 100',
+        ValueConvInv => '$val / 100',
+    },
+    0x3a => { #20
+        Name => 'ColorCompensationFilter',
+        Format => 'int16s',
+        Notes => 'ranges from -2 for green to +2 for magenta',
+    },
+    0x3b => { #20
+        Name => 'SonyImageSize',
+        PrintConv => {
+            0 => 'Standard',
+            1 => 'Medium',
+            2 => 'Small',
+        },
+    },
+    0x3c => { #20
+        Name => 'SonyQuality',
+        PrintConv => {
+            0 => 'RAW',
+            32 => 'Fine',
+            34 => 'RAW + JPEG',
+            48 => 'Standard',
+        },
+    },
+    0x3d => { #20
+        Name => 'InstantPlaybackTime',
+        PrintConv => '"$val s"',
+        PrintConvInv => '$val=~s/\s*s//; $val',
+    },
+    0x3e => { #20
+        Name => 'InstantPlaybackSetup',
+        PrintConv => {
+            0 => 'Image and Information',
+            1 => 'Image Only',
+            # 2 appears to be unused
+            3 => 'Image and Histogram',
+        },
+    },
+    0x3f => { #PH
+        Name => 'NoiseReduction',
+        PrintConv => \%offOn,
+    },
+    0x40 => { #20
+        Name => 'EyeStartAF',
+        PrintConv => \%onOff,
+    },
+    0x41 => { #20
+        Name => 'RedEyeReduction',
+        PrintConv => \%offOn,
+    },
+    0x42 => { #20
+        Name => 'FlashDefault',
+        PrintConv => {
+            0 => 'Auto',
+            1 => 'Fill Flash',
+        },
+    },
+    0x43 => { #20
+        Name => 'AutoBracketOrder',
+        PrintConv => {
+            0 => '0 - +',
+            1 => '- 0 +',
+        },
+    },
+    0x44 => { #20
+        Name => 'FocusHoldButton',
+        PrintConv => {
+            0 => 'Focus Hold',
+            1 => 'DOF Preview',
+        },
+    },
+    0x45 => { #20
+        Name => 'AELButton',
+        PrintConv => {
+            0 => 'Hold',
+            1 => 'Toggle',
+            2 => 'Spot Hold',
+            3 => 'Spot Toggle',
+        },
+    },
+    0x46 => { #20
+        Name => 'ControlDialSet',
+        PrintConv => {
+            0 => 'Shutter Speed',
+            1 => 'Aperture',
+        },
+    },
+    0x47 => { #20
+        Name => 'ExposureCompensationMode',
+        PrintConv => {
+            0 => 'Ambient and Flash',
+            1 => 'Ambient Only',
+        },
+    },
+    0x48 => { #20
+        Name => 'AFAssist',
+        PrintConv => \%onOff,
+    },
+    0x49 => { #20
+        Name => 'CardShutterLock',
+        PrintConv => \%onOff,
+    },
+    0x4a => { #20
+        Name => 'LensShutterLock',
+        PrintConv => \%onOff,
+    },
+    0x4b => { #20
+        Name => 'AFAreaIllumination',
+        PrintConv => {
+            0 => '0.3 s',
+            1 => '0.6 s',
+            2 => 'Off',
+        },
+    },
+    0x4c => { #20
+        Name => 'MonitorDisplayOff',
+        PrintConv => {
+            0 => 'Automatic',
+            1 => 'Manual',
+        },
+    },
+    0x4d => { #20
+        Name => 'RecordDisplay',
+        PrintConv => {
+            0 => 'Auto Rotate',
+            1 => 'Horizontal',
+        },
+    },
+    0x4e => { #20
+        Name => 'PlayDisplay',
+        PrintConv => {
+            0 => 'Auto Rotate',
+            1 => 'Manual Rotate',
+        },
+    },
+    0x50 => { #20
+        Name => 'ExposureIndicator',
+        SeparateTable => 'ExposureIndicator',
+        PrintConv => \%exposureIndicator,
+    },
+    0x51 => { #20
+        Name => 'AELExposureIndicator',
+        Notes => 'also indicates exposure for next shot when bracketing',
+        SeparateTable => 'ExposureIndicator',
+        PrintConv => \%exposureIndicator,
+    },
+    0x52 => { #20
+        Name => 'ExposureBracketingIndicatorLast',
+        Notes => 'indicator for last shot when bracketing',
+        SeparateTable => 'ExposureIndicator',
+        PrintConv => \%exposureIndicator,
+    },
+    0x53 => { #20
+        Name => 'MeteringOffScaleIndicator',
+        Notes => 'two flashing triangles when under or over metering scale',
+        PrintConv => {
+            0 => 'Within Range',
+            1 => 'Under/Over Range',
+            255 => 'Out of Range',
+        },
+    },
+    0x54 => { #20
+        Name => 'FlashExposureIndicator',
+        SeparateTable => 'ExposureIndicator',
+        PrintConv => \%exposureIndicator,
+    },
+    0x55 => { #20
+        Name => 'FlashExposureIndicatorNext',
+        Notes => 'indicator for next shot when bracketing',
+        SeparateTable => 'ExposureIndicator',
+        PrintConv => \%exposureIndicator,
+    },
+    0x56 => { #20
+        Name => 'FlashExposureIndicatorLast',
+        Notes => 'indicator for last shot when bracketing',
+        SeparateTable => 'ExposureIndicator',
+        PrintConv => \%exposureIndicator,
+    },
+    0x58 => { #20
+        Name => 'FocusModeSwitch',
+        PrintConv => {
+            0 => 'AF',
+            1 => 'MF',
+        },
+    },
+    0x59 => { #20
+        Name => 'FlashType',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Built-in', # (also when built-in flash is a trigger in wireless mode)
+            2 => 'External',
+        },
+    },
+    0x5a => { #15
+        Name => 'Rotation',
+        PrintConv => {
+            0 => 'Horizontal (Normal)',
+            1 => 'Rotate 270 CW',
+            2 => 'Rotate 90 CW',
+        },
+    },
+    0x5b => { #20
+        Name => 'AELock',
+        PrintConv => \%offOn,
+    },
+    0x57 => { #15
+        Name => 'ImageStabilization',
+        PrintConv => \%offOn,
+    },
+    0x5e => { #15
+        Name => 'ColorTemperature',
+        ValueConv => '$val * 100',
+        ValueConvInv => '$val / 100',
+    },
+    0x5f => { #20
+        Name => 'ColorCompensationFilter',
+        Format => 'int16s',
+        Notes => 'ranges from -2 for green to +2 for magenta',
+    },
+    0x60 => { #20
+        Name => 'BatteryLevel',
+        PrintConv => {
+            3 => 'Very Low',
+            4 => 'Low',
+            5 => 'Half Full',
+            6 => 'Sufficient Power Remaining',
+        },
+    },
+);
+
+# white balance information stored by the Sony DSLR-A100 (ref 20)
+%Image::ExifTool::Minolta::WBInfoA100 = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    NOTES => 'White balance information for the Sony DSLR-A100.',
+    WRITABLE => 1,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    FIRST_ENTRY => 0,
+    0x96  => { Name => 'WB_RGBLevels',          Format => 'int16u[3]' },
+    0xae  => { Name => 'WB_GBRGLevels',         Format => 'int16u[4]' },
+    0x304 => { Name => 'WB_RBPresetFlash',      Format => 'int16u[2]' },
+    0x308 => { Name => 'WB_RBPresetCoolWhiteF', Format => 'int16u[2]' },
+    0x3e8 => { Name => 'WB_RBPresetTungsten',   Format => 'int16u[2]' },
+    0x3ec => { Name => 'WB_RBPresetDaylight',   Format => 'int16u[2]' },
+    0x3f0 => { Name => 'WB_RBPresetCloudy',     Format => 'int16u[2]' },
+    0x3f4 => { Name => 'WB_RBPresetFlash',      Format => 'int16u[2]' },
+    0x3fc => {
+        Name => 'WB_RedPresetsFluorescent',
+        Format => 'int16u[7]',
+        Notes => q{
+            white balance red presets for fluorescent -2 through +4.  -2=Fluorescent,
+            -1=WhiteFluorescent, 0=CoolWhiteFluorescent, +1=DayWhiteFluorescent and
+            +3=DaylightFluorescent
+        },
+    },
+    0x40a => {
+        Name => 'WB_BluePresetsFluorescent',
+        Format => 'int16u[7]',
+        Notes => 'white balance blue presets for fluorescent -2 through +4',
+    },
+    0x418 => { Name => 'WB_RBPresetShade',                 Format => 'int16u[2]' },
+    0x424 => { Name => 'WB_RBPresetCustom',                Format => 'int16u[2]' },
+    0x49dc => {
+        Name => 'InternalSerialNumber',
+        Format => 'string[12]',
+    },
+);
+
+# tags in Konica Minolta MOV videos (ref PH)
+# (similar information in Kodak,Minolta,Nikon,Olympus,Pentax and Sanyo videos)
+%Image::ExifTool::Minolta::MOV1 = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    FIRST_ENTRY => 0,
+    NOTES => q{
+        This information is found in MOV videos from some Konica Minolta models such
+        as the DiMage Z10 and X50.
+    },
+    0 => {
+        Name => 'Make',
+        Format => 'string[32]',
+    },
+    0x20 => {
+        Name => 'ModelType',
+        Format => 'string[8]',
+    },
+    # (01 00 at offset 0x28)
+    0x2e => {
+        Name => 'ExposureTime',
+        Format => 'int32u',
+        ValueConv => '$val ? 10 / $val : 0',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+    },
+    0x32 => {
+        Name => 'FNumber',
+        Format => 'rational64u',
+        PrintConv => 'sprintf("%.1f",$val)',
+    },
+    0x3a => {
+        Name => 'ExposureCompensation',
+        Format => 'rational64s',
+        PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
+    },
+    # 0x4c => 'WhiteBalance', ?
+    0x50 => {
+        Name => 'FocalLength',
+        Format => 'rational64u',
+        PrintConv => 'sprintf("%.1f mm",$val)',
+    },
+);
+
+# tags in Minolta MOV videos (ref PH)
+# (similar information in Kodak,Minolta,Nikon,Olympus,Pentax and Sanyo videos)
+%Image::ExifTool::Minolta::MOV2 = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    FIRST_ENTRY => 0,
+    NOTES => q{
+        This information is found in MOV videos from some Minolta models such as the
+        DiMAGE X and Xt.
+    },
+    0 => {
+        Name => 'Make',
+        Format => 'string[32]',
+    },
+    0x18 => {
+        Name => 'ModelType',
+        Format => 'string[8]',
+    },
+    # (01 00 at offset 0x20)
+    0x26 => {
+        Name => 'ExposureTime',
+        Format => 'int32u',
+        ValueConv => '$val ? 10 / $val : 0',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+    },
+    0x2a => {
+        Name => 'FNumber',
+        Format => 'rational64u',
+        PrintConv => 'sprintf("%.1f",$val)',
+    },
+    0x32 => {
+        Name => 'ExposureCompensation',
+        Format => 'rational64s',
+        PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
+    },
+    # 0x44 => 'WhiteBalance', ?
+    0x48 => {
+        Name => 'FocalLength',
+        Format => 'rational64u',
+        PrintConv => 'sprintf("%.1f mm",$val)',
+    },
+);
+
+# more tags in Minolta MOV videos (ref PH)
+%Image::ExifTool::Minolta::MMA = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => q{
+        This information is found in MOV videos from Minolta models such as the
+        DiMAGE A2, S414 and 7Hi.
+    },
+    0 => {
+        Name => 'Make',
+        Format => 'string[20]',
+    },
+    20 => {
+        Name => 'SoftwareVersion',
+        Format => 'string[16]',
+    },
+);
+
+# basic Minolta white balance lookup
+my %minoltaWhiteBalance = (
+    0 => 'Auto',
+    1 => 'Daylight',
+    2 => 'Cloudy',
+    3 => 'Tungsten',
+    5 => 'Custom',
+    7 => 'Fluorescent',
+    8 => 'Fluorescent 2',
+    11 => 'Custom 2',
+    12 => 'Custom 3',
+    # the following come from tests with the A2 (ref 2)
+    0x0800000 => 'Auto',
+    0x1800000 => 'Daylight',
+    0x2800000 => 'Cloudy',
+    0x3800000 => 'Tungsten',
+    0x4800000 => 'Flash',
+    0x5800000 => 'Fluorescent',
+    0x6800000 => 'Shade',
+    0x7800000 => 'Custom1',
+    0x8800000 => 'Custom2',
+    0x9800000 => 'Custom3',
+);
+
+#------------------------------------------------------------------------------
+# PrintConv for Minolta white balance
+sub ConvertWhiteBalance($)
+{
+    my $val = shift;
+    my $printConv = $minoltaWhiteBalance{$val};
+    unless (defined $printConv) {
+        if ($val & 0xffff0000) {
+            # the A2 values can be shifted by += 3 settings, where
+            # each setting adds or subtracts 0x0010000 (ref 2)
+            my $type = ($val & 0xff000000) + 0x800000;
+            if ($minoltaWhiteBalance{$type}) {
+                $printConv = $minoltaWhiteBalance{$type} .
+                             sprintf("%+.8g", ($val - $type) / 0x10000);
+            } else {
+                $printConv = sprintf("Unknown (0x%x)", $val);
+            }
+        } else {
+            $printConv = sprintf("Unknown ($val)");
+        }
+    }
+    return $printConv;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Minolta - Minolta EXIF maker notes tags
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to interpret
+Minolta and Konica-Minolta maker notes in EXIF information, and to read
+and write Minolta RAW (MRW) images.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.dalibor.cz/minolta/makernote.htm>
+
+=item L<http://www.cybercom.net/~dcoffin/dcraw/>
+
+=back
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Jay Al-Saadi, Niels Kristian Bech Jensen, Shingo Noguchi, Pedro
+Corte-Real, Jeffery Small, Jens Duttke,  Thomas Kassner, Mladen Sever, Olaf
+Ulrich, Lukasz Stelmach and Igal Milchtaich for the information they
+provided, and for everyone who helped with the LensType list.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/Minolta Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/MinoltaRaw.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/MinoltaRaw.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/MinoltaRaw.pm	(revision 24799)
@@ -0,0 +1,526 @@
+#------------------------------------------------------------------------------
+# File:         MinoltaRaw.pm
+#
+# Description:  Read/write Konica-Minolta RAW (MRW) meta information
+#
+# Revisions:    03/11/2006 - P. Harvey Split out from Minolta.pm
+#
+# References:   1) http://www.cybercom.net/~dcoffin/dcraw/
+#               2) http://www.chauveau-central.net/mrw-format/
+#               3) Igal Milchtaich private communication (A100)
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::MinoltaRaw;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::Minolta;
+
+$VERSION = '1.12';
+
+sub ProcessMRW($$;$);
+sub WriteMRW($$;$);
+
+# Minolta MRW tags
+%Image::ExifTool::MinoltaRaw::Main = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    PROCESS_PROC => \&Image::ExifTool::MinoltaRaw::ProcessMRW,
+    WRITE_PROC => \&Image::ExifTool::MinoltaRaw::WriteMRW,
+    NOTES => 'These tags are used in Minolta RAW format (MRW) images.',
+    "\0TTW" => { # TIFF Tags
+        Name => 'MinoltaTTW',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Exif::Main',
+            # this EXIF information starts with a TIFF header
+            ProcessProc => \&Image::ExifTool::ProcessTIFF,
+            WriteProc => \&Image::ExifTool::WriteTIFF,
+        },
+    },
+    "\0PRD" => { # Raw Picture Dimensions
+        Name => 'MinoltaPRD',
+        SubDirectory => { TagTable => 'Image::ExifTool::MinoltaRaw::PRD' },
+    },
+    "\0WBG" => { # White Balance Gains
+        Name => 'MinoltaWBG',
+        SubDirectory => { TagTable => 'Image::ExifTool::MinoltaRaw::WBG' },
+    },
+    "\0RIF" => { # Requested Image Format
+        Name => 'MinoltaRIF',
+        SubDirectory => { TagTable => 'Image::ExifTool::MinoltaRaw::RIF' },
+    },
+    # "\0CSA" is padding
+);
+
+# Minolta MRW PRD information (ref 2)
+%Image::ExifTool::MinoltaRaw::PRD = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    FIRST_ENTRY => 0,
+    0 => {
+        Name => 'FirmwareID',
+        Format => 'string[8]',
+    },
+    8 => {
+        Name => 'SensorHeight',
+        Format => 'int16u',
+    },
+    10 => {
+        Name => 'SensorWidth',
+        Format => 'int16u',
+    },
+    12 => {
+        Name => 'ImageHeight',
+        Format => 'int16u',
+    },
+    14 => {
+        Name => 'ImageWidth',
+        Format => 'int16u',
+    },
+    16 => {
+        Name => 'RawDepth',
+        Format => 'int8u',
+    },
+    17 => {
+        Name => 'BitDepth',
+        Format => 'int8u',
+    },
+    18 => {
+        Name => 'StorageMethod',
+        Format => 'int8u',
+        PrintConv => {
+            82 => 'Padded',
+            89 => 'Linear',
+        },
+    },
+    23 => {
+        Name => 'BayerPattern',
+        Format => 'int8u',
+        PrintConv => {
+            1 => 'RGGB',
+            4 => 'GBRG',
+        },
+    },
+);
+
+# Minolta MRW WBG information (ref 2)
+%Image::ExifTool::MinoltaRaw::WBG = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    FIRST_ENTRY => 0,
+    0 => {
+        Name => 'WBScale',
+        Format => 'int8u[4]',
+    },
+    4 => [
+        {
+            Condition => '$$self{Model} =~ /DiMAGE A200\b/',
+            Name => 'WB_GBRGLevels',
+            Format => 'int16u[4]',
+            Notes => 'DiMAGE A200',
+        },
+        {
+            Name => 'WB_RGGBLevels',
+            Format => 'int16u[4]',
+            Notes => 'other models',
+        },
+    ],
+);
+
+# Minolta MRW RIF information (ref 2)
+%Image::ExifTool::MinoltaRaw::RIF = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    FIRST_ENTRY => 0,
+    1 => {
+        Name => 'Saturation',
+        Format => 'int8s',
+    },
+    2 => {
+        Name => 'Contrast',
+        Format => 'int8s',
+    },
+    3 => {
+        Name => 'Sharpness',
+        Format => 'int8s',
+    },
+    4 => {
+        Name => 'WBMode',
+        PrintConv => 'Image::ExifTool::MinoltaRaw::ConvertWBMode($val)',
+    },
+    5 => {
+        Name => 'ProgramMode',
+        PrintConv => {
+            0 => 'None',
+            1 => 'Portrait',
+            2 => 'Text',
+            3 => 'Night Portrait',
+            4 => 'Sunset',
+            5 => 'Sports',
+            # have seen these values in Sony ARW images: - PH
+            # 7, 128, 129, 160
+        },
+    },
+    6 => {
+        Name => 'ISOSetting',
+        RawConv => '$val == 255 ? undef : $val',
+        PrintConv => { #3
+            0 => 'Auto',
+            48 => 100,
+            56 => 200,
+            64 => 400,
+            72 => 800,
+            80 => 1600,
+            174 => '80 (Zone Matching Low)',
+            184 => '200 (Zone Matching High)',
+            OTHER => sub {
+                my ($val, $inv) = @_;
+                return int(2 ** (($val-48)/8) * 100 + 0.5) unless $inv;
+                return 48 + 8*log($val/100)/log(2) if Image::ExifTool::IsFloat($val);
+                return undef;
+            },
+        },
+        #ValueConv => '2 ** (($val-48)/8) * 100',
+        #ValueConvInv => '48 + 8*log($val/100)/log(2)',
+        #PrintConv => 'int($val + 0.5)',
+        #PrintConvInv => '$val',
+    },
+    7 => [
+        {
+            Name => 'ColorMode',
+            Condition => '$$self{Make} !~ /^SONY/',
+            Priority => 0,
+            Writable => 'int32u',
+            PrintConv => \%Image::ExifTool::Minolta::minoltaColorMode,
+        },
+        { #3
+            Name => 'ColorMode',
+            Condition => '$$self{Model} eq "DSLR-A100"',
+            Writable => 'int32u',
+            Notes => 'Sony A100',
+            Priority => 0,
+            PrintHex => 1,
+            PrintConv => \%Image::ExifTool::Minolta::sonyColorMode,
+        },
+    ],
+    # NOTE: some of these WB_RBLevels may apply to other models too...
+    8  => { #3
+        Name => 'WB_RBLevelsTungsten',
+        Condition => '$$self{Model} eq "DSLR-A100"',
+        Format => 'int16u[2]',
+        Notes => 'these WB_RBLevels currently decoded only for the Sony A100',
+    },
+    12 => { #3
+        Name => 'WB_RBLevelsDaylight',
+        Condition => '$$self{Model} eq "DSLR-A100"',
+        Format => 'int16u[2]',
+    },
+    16 => { #3
+        Name => 'WB_RBLevelsCloudy',
+        Condition => '$$self{Model} eq "DSLR-A100"',
+        Format => 'int16u[2]',
+    },
+    20 => { #3
+        Name => 'WB_RBLevelsCoolWhiteF',
+        Condition => '$$self{Model} eq "DSLR-A100"',
+        Format => 'int16u[2]',
+    },
+    24 => { #3
+        Name => 'WB_RBLevelsFlash',
+        Condition => '$$self{Model} eq "DSLR-A100"',
+        Format => 'int16u[2]',
+    },
+    28 => { #3
+        Name => 'WB_RBLevelsUnknown',
+        Condition => '$$self{Model} eq "DSLR-A100"',
+        Format => 'int16u[2]',
+        Unknown => 1,
+    },
+    32 => { #3
+        Name => 'WB_RBLevelsShade',
+        Condition => '$$self{Model} eq "DSLR-A100"',
+        Format => 'int16u[2]',
+    },
+    36 => { #3
+        Name => 'WB_RBLevelsDaylightF',
+        Condition => '$$self{Model} eq "DSLR-A100"',
+        Format => 'int16u[2]',
+    },
+    40 => { #3
+        Name => 'WB_RBLevelsDayWhiteF',
+        Condition => '$$self{Model} eq "DSLR-A100"',
+        Format => 'int16u[2]',
+    },
+    44 => { #3
+        Name => 'WB_RBLevelsWhiteF',
+        Condition => '$$self{Model} eq "DSLR-A100"',
+        Format => 'int16u[2]',
+    },
+    56 => {
+        Name => 'ColorFilter',
+        Condition => '$$self{Make} !~ /^SONY/',
+        Format => 'int8s',
+        Notes => 'Minolta models',
+    },
+    57 => 'BWFilter',
+    58 => {
+        Name => 'ZoneMatching',
+        Condition => '$$self{Make} !~ /^SONY/',
+        Priority => 0,
+        Notes => 'Minolta models',
+        PrintConv => {
+            0 => 'ISO Setting Used',
+            1 => 'High Key',
+            2 => 'Low Key',
+        },
+    },
+    59 => {
+        Name => 'Hue',
+        Format => 'int8s',
+    },
+    60 => {
+        Name => 'ColorTemperature',
+        Condition => '$$self{Make} !~ /^SONY/',
+        Notes => 'Minolta models',
+        ValueConv => '$val * 100',
+        ValueConvInv => '$val / 100',
+    },
+    74 => { #3
+        Name => 'ZoneMatching',
+        Condition => '$$self{Make} =~ /^SONY/',
+        Priority => 0,
+        Notes => 'Sony models',
+        PrintConv => {
+            0 => 'ISO Setting Used',
+            1 => 'High Key',
+            2 => 'Low Key',
+        },
+    },
+    76 => { #3
+        Name => 'ColorTemperature',
+        Condition => '$$self{Make} =~ /^SONY/ and $$self{Model} eq "DSLR-A100"',
+        Notes => 'A100',
+        ValueConv => '$val * 100',
+        ValueConvInv => '$val / 100',
+        PrintConv => '$val ? $val : "Auto"',
+        PrintConvInv => '$val=~/Auto/i ? 0 : $val',
+    },
+    77 => { #3
+        Name => 'ColorFilter',
+        Condition => '$$self{Make} =~ /^SONY/ and $$self{Model} eq "DSLR-A100"',
+        Notes => 'A100',
+    },
+    78 => { #3
+        Name => 'ColorTemperature',
+        Condition => '$$self{Make} =~ /^SONY/ and $$self{Model} =~ /^DSLR-A(200|700)$/',
+        Notes => 'A200 and A700',
+        ValueConv => '$val * 100',
+        ValueConvInv => '$val / 100',
+        PrintConv => '$val ? $val : "Auto"',
+        PrintConvInv => '$val=~/Auto/i ? 0 : $val',
+    },
+    79 => { #3
+        Name => 'ColorFilter',
+        Condition => '$$self{Make} =~ /^SONY/ and $$self{Model} =~ /^DSLR-A(200|700)$/',
+        Notes => 'A200 and A700',
+    },
+);
+
+#------------------------------------------------------------------------------
+# PrintConv for WBMode
+sub ConvertWBMode($)
+{
+    my $val = shift;
+    my %mrwWB = (
+        0 => 'Auto',
+        1 => 'Daylight',
+        2 => 'Cloudy',
+        3 => 'Tungsten',
+        4 => 'Flash/Fluorescent',
+        5 => 'Fluorescent',
+        6 => 'Shade',
+        7 => 'User 1',
+        8 => 'User 2',
+        9 => 'User 3',
+        10 => 'Temperature',
+    );
+    my $lo = $val & 0x0f;
+    my $wbstr = $mrwWB{$lo} || "Unknown ($lo)";
+    my $hi = $val >> 4;
+    $wbstr .= ' (' . ($hi - 8) . ')' if $hi >= 6 and $hi <=12;
+    return $wbstr;
+}
+
+#------------------------------------------------------------------------------
+# Write MRW directory (ie. in ARW images)
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) optional tag table ref
+# Returns: new MRW data or undef on error
+sub WriteMRW($$;$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    $exifTool or return 1;      # allow dummy access
+    my $buff = '';
+    $$dirInfo{OutFile} = \$buff;
+    ProcessMRW($exifTool, $dirInfo, $tagTablePtr) > 0 or undef $buff;
+    return $buff;
+}
+
+#------------------------------------------------------------------------------
+# Read or write Minolta MRW file
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) optional tag table ref
+# Returns: 1 on success, 0 if this wasn't a valid MRW file, or -1 on write error
+# Notes: File pointer must be set to start of MRW in RAF upon entry
+sub ProcessMRW($$;$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $raf = $$dirInfo{RAF};
+    my $outfile = $$dirInfo{OutFile};
+    my $verbose = $exifTool->Options('Verbose');
+    my $out = $exifTool->Options('TextOut');
+    my ($data, $err, $outBuff);
+
+    if ($$dirInfo{DataPt}) {
+        # make a RAF object for MRW information extracted from other file types
+        $raf = new File::RandomAccess($$dirInfo{DataPt});
+        # MRW information in DNG images may not start at beginning of data block
+        $raf->Seek($$dirInfo{DirStart}, 0) if $$dirInfo{DirStart};
+    }
+    $raf->Read($data,8) == 8 or return 0;
+    # "\0MRM" for big-endian (MRW images), and
+    # "\0MRI" for little-endian (MRWInfo in ARW images)
+    $data =~ /^\0MR([MI])/ or return 0;
+    my $hdr = "\0MR$1";
+    SetByteOrder($1 . $1);
+    $exifTool->SetFileType();
+    $tagTablePtr = GetTagTable('Image::ExifTool::MinoltaRaw::Main');
+    if ($outfile) {
+        $exifTool->InitWriteDirs('TIFF'); # use same write dirs as TIFF
+        $outBuff = '';
+    }
+    my $pos = $raf->Tell();
+    my $offset = Get32u(\$data, 4) + $pos;
+    my $rtnVal = 1;
+    $verbose and printf $out "  [MRW Data Offset: 0x%x]\n", $offset;
+    # loop through MRW segments (ref 1)
+    while ($pos < $offset) {
+        $raf->Read($data,8) == 8 or $err = 1, last;
+        $pos += 8;
+        my $tag = substr($data, 0, 4);
+        my $len = Get32u(\$data, 4);
+        if ($verbose) {
+            print $out "MRW ",$exifTool->Printable($tag)," segment ($len bytes):\n";
+            if ($verbose > 2) {
+                $raf->Read($data,$len) == $len and $raf->Seek($pos,0) or $err = 1, last;
+                $exifTool->VerboseDump(\$data);
+            }
+        }
+        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        if ($tagInfo and $$tagInfo{SubDirectory}) {
+            my $subTable = GetTagTable($tagInfo->{SubDirectory}->{TagTable});
+            my $buff;
+            # save shift for values stored with wrong base offset
+            $$exifTool{MRW_WrongBase} = -($raf->Tell());
+            $raf->Read($buff, $len) == $len or $err = 1, last;
+            my %subdirInfo = (
+                DataPt => \$buff,
+                DataLen => $len,
+                DataPos => $pos,
+                DirStart => 0,
+                DirLen => $len,
+                DirName => $$tagInfo{Name},
+                Parent => 'MRW',
+                NoTiffEnd => 1, # no end-of-TIFF check
+            );
+            if ($outfile) {
+                my $writeProc = $tagInfo->{SubDirectory}->{WriteProc};
+                my $val = $exifTool->WriteDirectory(\%subdirInfo, $subTable, $writeProc);
+                if (defined $val and length $val) {
+                    # pad to an even 4 bytes (can't hurt, and it seems to be the standard)
+                    $val .= "\0" x (4 - (length($val) & 0x03)) if length($val) & 0x03;
+                    $outBuff .= $tag . Set32u(length $val) . $val;
+                } elsif (not defined $val) {
+                    $outBuff .= $data . $buff;  # copy over original information
+                }
+            } else {
+                my $processProc = $tagInfo->{SubDirectory}->{ProcessProc};
+                $exifTool->ProcessDirectory(\%subdirInfo, $subTable, $processProc);
+            }
+        } elsif ($outfile) {
+            # add this segment to the output buffer
+            my $buff;
+            $raf->Read($buff, $len) == $len or $err = 1, last;
+            $outBuff .= $data . $buff;
+        } else {
+            # skip this segment
+            $raf->Seek($pos+$len, 0) or $err = 1, last;
+        }
+        $pos += $len;
+    }
+    $pos == $offset or $err = 1;    # meta information length check
+
+    if ($outfile) {
+        # write the file header then the buffered meta information
+        Write($outfile, $hdr, Set32u(length $outBuff), $outBuff) or $rtnVal = -1;
+        # copy over image data
+        while ($raf->Read($outBuff, 65536)) {
+            Write($outfile, $outBuff) or $rtnVal = -1;
+        }
+        # Sony IDC utility corrupts MRWInfo when writing ARW images,
+        # so make this a minor error for these images
+        $err and $exifTool->Error("MRW format error", $$exifTool{TIFF_TYPE} eq 'ARW');
+    } else {
+        $err and $exifTool->Warn("MRW format error");
+    }
+    return $rtnVal;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::MinoltaRaw - Read/write Konica-Minolta RAW (MRW) information
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to read and
+write Konica-Minolta RAW (MRW) images.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.cybercom.net/~dcoffin/dcraw/>
+
+=item L<http://www.chauveau-central.net/mrw-format/>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/MinoltaRaw Tags>,
+L<Image::ExifTool::Minolta(3pm)|Image::ExifTool::Minolta>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Nikon.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Nikon.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Nikon.pm	(revision 24799)
@@ -0,0 +1,5290 @@
+#------------------------------------------------------------------------------
+# File:         Nikon.pm
+#
+# Description:  Nikon EXIF maker notes tags
+#
+# Revisions:    12/09/2003 - P. Harvey Created
+#               05/17/2004 - P. Harvey Added information from Joseph Heled
+#               09/21/2004 - P. Harvey Changed tag 2 to ISOUsed & added PrintConv
+#               12/01/2004 - P. Harvey Added default PRINT_CONV
+#               01/01/2005 - P. Harvey Decode preview image and preview IFD
+#               03/35/2005 - T. Christiansen additions
+#               05/10/2005 - P. Harvey Decode encrypted lens data
+#               [ongoing]  - P. Harvey Constantly decoding new information
+#
+# References:   1) http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html
+#               2) Joseph Heled private communication (tests with D70)
+#               3) Thomas Walter private communication (tests with Coolpix 5400)
+#               4) http://www.cybercom.net/~dcoffin/dcraw/
+#               5) Brian Ristuccia private communication (tests with D70)
+#               6) Danek Duvall private communication (tests with D70)
+#               7) Tom Christiansen private communication (tests with D70)
+#               8) Robert Rottmerhusen private communication
+#               9) http://members.aol.com/khancock/pilot/nbuddy/
+#              10) Werner Kober private communication (D2H, D2X, D100, D70, D200, D90)
+#              11) http://www.rottmerhusen.com/objektives/lensid/thirdparty.html
+#              12) http://libexif.sourceforge.net/internals/mnote-olympus-tag_8h-source.html
+#              13) Roger Larsson private communication (tests with D200)
+#              14) http://homepage3.nifty.com/kamisaka/makernote/makernote_nikon.htm (2007/09/15)
+#              15) http://tomtia.plala.jp/DigitalCamera/MakerNote/index.asp
+#              16) Jeffrey Friedl private communication (D200 with firmware update)
+#              17) http://www.wohlberg.net/public/software/photo/nstiffexif/
+#                  and Brendt Wohlberg private communication
+#              18) Anonymous user private communication (D70, D200, D2x)
+#              19) Bruce Stevens private communication
+#              20) Vladimir Sauta private communication (D80)
+#              21) Gregor Dorlars private communication (D300)
+#              22) Tanel Kuusk private communication
+#              23) Alexandre Naaman private communication (D3)
+#              24) Geert De Soete private communication
+#              25) Niels Kristian private communication
+#              26) Bozi (http://www.cpanforum.com/posts/8983)
+#              27) Jens Kriese private communication
+#              28) Warren Hatch private communication (D3v2.00 with SB-800 and SB-900)
+#              29) Anonymous contribution 2011/05/25 (D700, D7000)
+#              JD) Jens Duttke private communication
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Nikon;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::Exif;
+
+$VERSION = '2.47';
+
+sub LensIDConv($$$);
+sub ProcessNikonAVI($$$);
+sub ProcessNikonMOV($$$);
+sub FormatString($);
+sub ProcessNikonCaptureEditVersions($$$);
+
+# nikon lens ID numbers (ref 8/11)
+my %nikonLensIDs = (
+    Notes => q{
+        The Nikon LensID is constructed as a Composite tag from the raw hex values
+        of 8 other tags: LensIDNumber, LensFStops, MinFocalLength, MaxFocalLength,
+        MaxApertureAtMinFocal, MaxApertureAtMaxFocal, MCUVersion and LensType, in
+        that order.  (source:
+        L<http://www.rottmerhusen.com/objektives/lensid/thirdparty.html>.) Multiple
+        lenses with the same LensID are differentiated by decimal values in the list
+        below.  The user-defined "Lenses" list may be used to specify the lens for
+        ExifTool to choose in these cases (see the
+        L<sample config file|../config.html> for details).
+    },
+    OTHER => \&LensIDConv,
+    # Note: Sync this list with Robert's Perl version at
+    # http://www.rottmerhusen.com/objektives/lensid/files/exif/fmountlens.p.txt
+    # (hex digits must be uppercase in keys below)
+    '01 58 50 50 14 14 02 00' => 'AF Nikkor 50mm f/1.8',
+    '02 42 44 5C 2A 34 02 00' => 'AF Zoom-Nikkor 35-70mm f/3.3-4.5',
+    '02 42 44 5C 2A 34 08 00' => 'AF Zoom-Nikkor 35-70mm f/3.3-4.5',
+    '03 48 5C 81 30 30 02 00' => 'AF Zoom-Nikkor 70-210mm f/4',
+    '04 48 3C 3C 24 24 03 00' => 'AF Nikkor 28mm f/2.8',
+    '05 54 50 50 0C 0C 04 00' => 'AF Nikkor 50mm f/1.4',
+    '06 54 53 53 24 24 06 00' => 'AF Micro-Nikkor 55mm f/2.8',
+    '07 40 3C 62 2C 34 03 00' => 'AF Zoom-Nikkor 28-85mm f/3.5-4.5',
+    '08 40 44 6A 2C 34 04 00' => 'AF Zoom-Nikkor 35-105mm f/3.5-4.5',
+    '09 48 37 37 24 24 04 00' => 'AF Nikkor 24mm f/2.8',
+    '0A 48 8E 8E 24 24 03 00' => 'AF Nikkor 300mm f/2.8 IF-ED',
+    '0A 48 8E 8E 24 24 05 00' => 'AF Nikkor 300mm f/2.8 IF-ED N',
+    '0B 48 7C 7C 24 24 05 00' => 'AF Nikkor 180mm f/2.8 IF-ED',
+    '0D 40 44 72 2C 34 07 00' => 'AF Zoom-Nikkor 35-135mm f/3.5-4.5',
+    '0E 48 5C 81 30 30 05 00' => 'AF Zoom-Nikkor 70-210mm f/4',
+    '0F 58 50 50 14 14 05 00' => 'AF Nikkor 50mm f/1.8 N',
+    '10 48 8E 8E 30 30 08 00' => 'AF Nikkor 300mm f/4 IF-ED',
+    '11 48 44 5C 24 24 08 00' => 'AF Zoom-Nikkor 35-70mm f/2.8',
+    '12 48 5C 81 30 3C 09 00' => 'AF Nikkor 70-210mm f/4-5.6',
+    '13 42 37 50 2A 34 0B 00' => 'AF Zoom-Nikkor 24-50mm f/3.3-4.5',
+    '14 48 60 80 24 24 0B 00' => 'AF Zoom-Nikkor 80-200mm f/2.8 ED',
+    '15 4C 62 62 14 14 0C 00' => 'AF Nikkor 85mm f/1.8',
+    '17 3C A0 A0 30 30 0F 00' => 'Nikkor 500mm f/4 P ED IF',
+    '17 3C A0 A0 30 30 11 00' => 'Nikkor 500mm f/4 P ED IF',
+    '18 40 44 72 2C 34 0E 00' => 'AF Zoom-Nikkor 35-135mm f/3.5-4.5 N',
+    '1A 54 44 44 18 18 11 00' => 'AF Nikkor 35mm f/2',
+    '1B 44 5E 8E 34 3C 10 00' => 'AF Zoom-Nikkor 75-300mm f/4.5-5.6',
+    '1C 48 30 30 24 24 12 00' => 'AF Nikkor 20mm f/2.8',
+    '1D 42 44 5C 2A 34 12 00' => 'AF Zoom-Nikkor 35-70mm f/3.3-4.5 N',
+    '1E 54 56 56 24 24 13 00' => 'AF Micro-Nikkor 60mm f/2.8',
+    '1F 54 6A 6A 24 24 14 00' => 'AF Micro-Nikkor 105mm f/2.8',
+    '20 48 60 80 24 24 15 00' => 'AF Zoom-Nikkor 80-200mm f/2.8 ED',
+    '21 40 3C 5C 2C 34 16 00' => 'AF Zoom-Nikkor 28-70mm f/3.5-4.5',
+    '22 48 72 72 18 18 16 00' => 'AF DC-Nikkor 135mm f/2',
+    '23 30 BE CA 3C 48 17 00' => 'Zoom-Nikkor 1200-1700mm f/5.6-8 P ED IF',
+    '24 48 60 80 24 24 1A 02' => 'AF Zoom-Nikkor 80-200mm f/2.8D ED',
+    '25 48 44 5C 24 24 1B 02' => 'AF Zoom-Nikkor 35-70mm f/2.8D',
+    '25 48 44 5C 24 24 52 02' => 'AF Zoom-Nikkor 35-70mm f/2.8D',
+    '26 40 3C 5C 2C 34 1C 02' => 'AF Zoom-Nikkor 28-70mm f/3.5-4.5D',
+    '27 48 8E 8E 24 24 1D 02' => 'AF-I Nikkor 300mm f/2.8D IF-ED',
+    '27 48 8E 8E 24 24 F1 02' => 'AF-I Nikkor 300mm f/2.8D IF-ED + TC-14E',
+    '27 48 8E 8E 24 24 E1 02' => 'AF-I Nikkor 300mm f/2.8D IF-ED + TC-17E',
+    '27 48 8E 8E 24 24 F2 02' => 'AF-I Nikkor 300mm f/2.8D IF-ED + TC-20E',
+    '28 3C A6 A6 30 30 1D 02' => 'AF-I Nikkor 600mm f/4D IF-ED',
+    '28 3C A6 A6 30 30 F1 02' => 'AF-I Nikkor 600mm f/4D IF-ED + TC-14E',
+    '28 3C A6 A6 30 30 E1 02' => 'AF-I Nikkor 600mm f/4D IF-ED + TC-17E',
+    '28 3C A6 A6 30 30 F2 02' => 'AF-I Nikkor 600mm f/4D IF-ED + TC-20E',
+    '2A 54 3C 3C 0C 0C 26 02' => 'AF Nikkor 28mm f/1.4D',
+    '2B 3C 44 60 30 3C 1F 02' => 'AF Zoom-Nikkor 35-80mm f/4-5.6D',
+    '2C 48 6A 6A 18 18 27 02' => 'AF DC-Nikkor 105mm f/2D',
+    '2D 48 80 80 30 30 21 02' => 'AF Micro-Nikkor 200mm f/4D IF-ED',
+    '2E 48 5C 82 30 3C 22 02' => 'AF Nikkor 70-210mm f/4-5.6D',
+    '2E 48 5C 82 30 3C 28 02' => 'AF Nikkor 70-210mm f/4-5.6D',
+    '2F 48 30 44 24 24 29 02.1' => 'AF Zoom-Nikkor 20-35mm f/2.8D IF',
+    '30 48 98 98 24 24 24 02' => 'AF-I Nikkor 400mm f/2.8D IF-ED',
+    '30 48 98 98 24 24 F1 02' => 'AF-I Nikkor 400mm f/2.8D IF-ED + TC-14E',
+    '30 48 98 98 24 24 E1 02' => 'AF-I Nikkor 400mm f/2.8D IF-ED + TC-17E',
+    '30 48 98 98 24 24 F2 02' => 'AF-I Nikkor 400mm f/2.8D IF-ED + TC-20E',
+    '31 54 56 56 24 24 25 02' => 'AF Micro-Nikkor 60mm f/2.8D',
+    '32 54 6A 6A 24 24 35 02.1' => 'AF Micro-Nikkor 105mm f/2.8D',
+    '33 48 2D 2D 24 24 31 02' => 'AF Nikkor 18mm f/2.8D',
+    '34 48 29 29 24 24 32 02' => 'AF Fisheye Nikkor 16mm f/2.8D',
+    '35 3C A0 A0 30 30 33 02' => 'AF-I Nikkor 500mm f/4D IF-ED',
+    '35 3C A0 A0 30 30 F1 02' => 'AF-I Nikkor 500mm f/4D IF-ED + TC-14E',
+    '35 3C A0 A0 30 30 E1 02' => 'AF-I Nikkor 500mm f/4D IF-ED + TC-17E',
+    '35 3C A0 A0 30 30 F2 02' => 'AF-I Nikkor 500mm f/4D IF-ED + TC-20E',
+    '36 48 37 37 24 24 34 02' => 'AF Nikkor 24mm f/2.8D',
+    '37 48 30 30 24 24 36 02' => 'AF Nikkor 20mm f/2.8D',
+    '38 4C 62 62 14 14 37 02' => 'AF Nikkor 85mm f/1.8D',
+    '3A 40 3C 5C 2C 34 39 02' => 'AF Zoom-Nikkor 28-70mm f/3.5-4.5D',
+    '3B 48 44 5C 24 24 3A 02' => 'AF Zoom-Nikkor 35-70mm f/2.8D N',
+    '3C 48 60 80 24 24 3B 02' => 'AF Zoom-Nikkor 80-200mm f/2.8D ED', #25
+    '3D 3C 44 60 30 3C 3E 02' => 'AF Zoom-Nikkor 35-80mm f/4-5.6D',
+    '3E 48 3C 3C 24 24 3D 02' => 'AF Nikkor 28mm f/2.8D',
+    '3F 40 44 6A 2C 34 45 02' => 'AF Zoom-Nikkor 35-105mm f/3.5-4.5D',
+    '41 48 7C 7C 24 24 43 02' => 'AF Nikkor 180mm f/2.8D IF-ED',
+    '42 54 44 44 18 18 44 02' => 'AF Nikkor 35mm f/2D',
+    '43 54 50 50 0C 0C 46 02' => 'AF Nikkor 50mm f/1.4D',
+    '44 44 60 80 34 3C 47 02' => 'AF Zoom-Nikkor 80-200mm f/4.5-5.6D',
+    '45 40 3C 60 2C 3C 48 02' => 'AF Zoom-Nikkor 28-80mm f/3.5-5.6D',
+    '46 3C 44 60 30 3C 49 02' => 'AF Zoom-Nikkor 35-80mm f/4-5.6D N',
+    '47 42 37 50 2A 34 4A 02' => 'AF Zoom-Nikkor 24-50mm f/3.3-4.5D',
+    '48 48 8E 8E 24 24 4B 02' => 'AF-S Nikkor 300mm f/2.8D IF-ED',
+    '48 48 8E 8E 24 24 F1 02' => 'AF-S Nikkor 300mm f/2.8D IF-ED + TC-14E',
+    '48 48 8E 8E 24 24 E1 02' => 'AF-S Nikkor 300mm f/2.8D IF-ED + TC-17E',
+    '48 48 8E 8E 24 24 F2 02' => 'AF-S Nikkor 300mm f/2.8D IF-ED + TC-20E',
+    '49 3C A6 A6 30 30 4C 02' => 'AF-S Nikkor 600mm f/4D IF-ED',
+    '49 3C A6 A6 30 30 F1 02' => 'AF-S Nikkor 600mm f/4D IF-ED + TC-14E',
+    '49 3C A6 A6 30 30 E1 02' => 'AF-S Nikkor 600mm f/4D IF-ED + TC-17E',
+    '49 3C A6 A6 30 30 F2 02' => 'AF-S Nikkor 600mm f/4D IF-ED + TC-20E',
+    '4A 54 62 62 0C 0C 4D 02' => 'AF Nikkor 85mm f/1.4D IF',
+    '4B 3C A0 A0 30 30 4E 02' => 'AF-S Nikkor 500mm f/4D IF-ED',
+    '4B 3C A0 A0 30 30 F1 02' => 'AF-S Nikkor 500mm f/4D IF-ED + TC-14E',
+    '4B 3C A0 A0 30 30 E1 02' => 'AF-S Nikkor 500mm f/4D IF-ED + TC-17E',
+    '4B 3C A0 A0 30 30 F2 02' => 'AF-S Nikkor 500mm f/4D IF-ED + TC-20E',
+    '4C 40 37 6E 2C 3C 4F 02' => 'AF Zoom-Nikkor 24-120mm f/3.5-5.6D IF',
+    '4D 40 3C 80 2C 3C 62 02' => 'AF Zoom-Nikkor 28-200mm f/3.5-5.6D IF',
+    '4E 48 72 72 18 18 51 02' => 'AF DC-Nikkor 135mm f/2D',
+    '4F 40 37 5C 2C 3C 53 06' => 'IX-Nikkor 24-70mm f/3.5-5.6',
+    '50 48 56 7C 30 3C 54 06' => 'IX-Nikkor 60-180mm f/4-5.6',
+    '53 48 60 80 24 24 57 02' => 'AF Zoom-Nikkor 80-200mm f/2.8D ED',
+    '53 48 60 80 24 24 60 02' => 'AF Zoom-Nikkor 80-200mm f/2.8D ED',
+    '54 44 5C 7C 34 3C 58 02' => 'AF Zoom-Micro Nikkor 70-180mm f/4.5-5.6D ED',
+    '56 48 5C 8E 30 3C 5A 02' => 'AF Zoom-Nikkor 70-300mm f/4-5.6D ED',
+    '59 48 98 98 24 24 5D 02' => 'AF-S Nikkor 400mm f/2.8D IF-ED',
+    '59 48 98 98 24 24 F1 02' => 'AF-S Nikkor 400mm f/2.8D IF-ED + TC-14E',
+    '59 48 98 98 24 24 E1 02' => 'AF-S Nikkor 400mm f/2.8D IF-ED + TC-17E',
+    '59 48 98 98 24 24 F2 02' => 'AF-S Nikkor 400mm f/2.8D IF-ED + TC-20E',
+    '5A 3C 3E 56 30 3C 5E 06' => 'IX-Nikkor 30-60mm f/4-5.6',
+    '5B 44 56 7C 34 3C 5F 06' => 'IX-Nikkor 60-180mm f/4.5-5.6',
+    '5D 48 3C 5C 24 24 63 02' => 'AF-S Zoom-Nikkor 28-70mm f/2.8D IF-ED',
+    '5E 48 60 80 24 24 64 02' => 'AF-S Zoom-Nikkor 80-200mm f/2.8D IF-ED',
+    '5F 40 3C 6A 2C 34 65 02' => 'AF Zoom-Nikkor 28-105mm f/3.5-4.5D IF',
+    '60 40 3C 60 2C 3C 66 02' => 'AF Zoom-Nikkor 28-80mm f/3.5-5.6D', #(http://www.exif.org/forum/topic.asp?TOPIC_ID=16)
+    '61 44 5E 86 34 3C 67 02' => 'AF Zoom-Nikkor 75-240mm f/4.5-5.6D',
+    '63 48 2B 44 24 24 68 02' => 'AF-S Nikkor 17-35mm f/2.8D IF-ED',
+    '64 00 62 62 24 24 6A 02' => 'PC Micro-Nikkor 85mm f/2.8D',
+    '65 44 60 98 34 3C 6B 0A' => 'AF VR Zoom-Nikkor 80-400mm f/4.5-5.6D ED',
+    '66 40 2D 44 2C 34 6C 02' => 'AF Zoom-Nikkor 18-35mm f/3.5-4.5D IF-ED',
+    '67 48 37 62 24 30 6D 02' => 'AF Zoom-Nikkor 24-85mm f/2.8-4D IF',
+    '68 42 3C 60 2A 3C 6E 06' => 'AF Zoom-Nikkor 28-80mm f/3.3-5.6G',
+    '69 48 5C 8E 30 3C 6F 06' => 'AF Zoom-Nikkor 70-300mm f/4-5.6G',
+    '6A 48 8E 8E 30 30 70 02' => 'AF-S Nikkor 300mm f/4D IF-ED',
+    '6B 48 24 24 24 24 71 02' => 'AF Nikkor ED 14mm f/2.8D',
+    '6D 48 8E 8E 24 24 73 02' => 'AF-S Nikkor 300mm f/2.8D IF-ED II',
+    '6E 48 98 98 24 24 74 02' => 'AF-S Nikkor 400mm f/2.8D IF-ED II',
+    '6F 3C A0 A0 30 30 75 02' => 'AF-S Nikkor 500mm f/4D IF-ED II',
+    '70 3C A6 A6 30 30 76 02' => 'AF-S Nikkor 600mm f/4D IF-ED II',
+    '72 48 4C 4C 24 24 77 00' => 'Nikkor 45mm f/2.8 P',
+    '74 40 37 62 2C 34 78 06' => 'AF-S Zoom-Nikkor 24-85mm f/3.5-4.5G IF-ED',
+    '75 40 3C 68 2C 3C 79 06' => 'AF Zoom-Nikkor 28-100mm f/3.5-5.6G',
+    '76 58 50 50 14 14 7A 02' => 'AF Nikkor 50mm f/1.8D',
+    '77 48 5C 80 24 24 7B 0E' => 'AF-S VR Zoom-Nikkor 70-200mm f/2.8G IF-ED',
+    '78 40 37 6E 2C 3C 7C 0E' => 'AF-S VR Zoom-Nikkor 24-120mm f/3.5-5.6G IF-ED',
+    '79 40 3C 80 2C 3C 7F 06' => 'AF Zoom-Nikkor 28-200mm f/3.5-5.6G IF-ED',
+    '7A 3C 1F 37 30 30 7E 06.1' => 'AF-S DX Zoom-Nikkor 12-24mm f/4G IF-ED',
+    '7B 48 80 98 30 30 80 0E' => 'AF-S VR Zoom-Nikkor 200-400mm f/4G IF-ED',
+    '7D 48 2B 53 24 24 82 06' => 'AF-S DX Zoom-Nikkor 17-55mm f/2.8G IF-ED',
+    '7F 40 2D 5C 2C 34 84 06' => 'AF-S DX Zoom-Nikkor 18-70mm f/3.5-4.5G IF-ED',
+    '80 48 1A 1A 24 24 85 06' => 'AF DX Fisheye-Nikkor 10.5mm f/2.8G ED',
+    '81 54 80 80 18 18 86 0E' => 'AF-S VR Nikkor 200mm f/2G IF-ED',
+    '82 48 8E 8E 24 24 87 0E' => 'AF-S VR Nikkor 300mm f/2.8G IF-ED',
+    '83 00 B0 B0 5A 5A 88 04' => 'FSA-L2, EDG 65, 800mm F13 G',
+    '89 3C 53 80 30 3C 8B 06' => 'AF-S DX Zoom-Nikkor 55-200mm f/4-5.6G ED',
+    '8A 54 6A 6A 24 24 8C 0E' => 'AF-S VR Micro-Nikkor 105mm f/2.8G IF-ED', #10
+    '8B 40 2D 80 2C 3C 8D 0E' => 'AF-S DX VR Zoom-Nikkor 18-200mm f/3.5-5.6G IF-ED',
+    '8B 40 2D 80 2C 3C FD 0E' => 'AF-S DX VR Zoom-Nikkor 18-200mm f/3.5-5.6G IF-ED [II]', #20
+    '8C 40 2D 53 2C 3C 8E 06' => 'AF-S DX Zoom-Nikkor 18-55mm f/3.5-5.6G ED',
+    '8D 44 5C 8E 34 3C 8F 0E' => 'AF-S VR Zoom-Nikkor 70-300mm f/4.5-5.6G IF-ED', #10
+    '8F 40 2D 72 2C 3C 91 06' => 'AF-S DX Zoom-Nikkor 18-135mm f/3.5-5.6G IF-ED',
+    '90 3B 53 80 30 3C 92 0E' => 'AF-S DX VR Zoom-Nikkor 55-200mm f/4-5.6G IF-ED',
+    '92 48 24 37 24 24 94 06' => 'AF-S Zoom-Nikkor 14-24mm f/2.8G ED',
+    '93 48 37 5C 24 24 95 06' => 'AF-S Zoom-Nikkor 24-70mm f/2.8G ED',
+    '94 40 2D 53 2C 3C 96 06' => 'AF-S DX Zoom-Nikkor 18-55mm f/3.5-5.6G ED II', #10 (D40)
+    '95 4C 37 37 2C 2C 97 02' => 'PC-E Nikkor 24mm f/3.5D ED',
+    '95 00 37 37 2C 2C 97 06' => 'PC-E Nikkor 24mm f/3.5D ED', #JD
+    '96 48 98 98 24 24 98 0E' => 'AF-S VR Nikkor 400mm f/2.8G ED',
+    '97 3C A0 A0 30 30 99 0E' => 'AF-S VR Nikkor 500mm f/4G ED',
+    '98 3C A6 A6 30 30 9A 0E' => 'AF-S VR Nikkor 600mm f/4G ED',
+    '99 40 29 62 2C 3C 9B 0E' => 'AF-S DX VR Zoom-Nikkor 16-85mm f/3.5-5.6G ED',
+    '9A 40 2D 53 2C 3C 9C 0E' => 'AF-S DX VR Zoom-Nikkor 18-55mm f/3.5-5.6G',
+    '9B 54 4C 4C 24 24 9D 02' => 'PC-E Micro Nikkor 45mm f/2.8D ED',
+    '9B 00 4C 4C 24 24 9D 06' => 'PC-E Micro Nikkor 45mm f/2.8D ED',
+    '9C 54 56 56 24 24 9E 06' => 'AF-S Micro Nikkor 60mm f/2.8G ED',
+    '9D 54 62 62 24 24 9F 02' => 'PC-E Micro Nikkor 85mm f/2.8D',
+    '9D 00 62 62 24 24 9F 06' => 'PC-E Micro Nikkor 85mm f/2.8D',
+    '9E 40 2D 6A 2C 3C A0 0E' => 'AF-S DX VR Zoom-Nikkor 18-105mm f/3.5-5.6G ED', #PH/10
+    '9F 58 44 44 14 14 A1 06' => 'AF-S DX Nikkor 35mm f/1.8G', #27
+    'A0 54 50 50 0C 0C A2 06' => 'AF-S Nikkor 50mm f/1.4G',
+    'A1 40 18 37 2C 34 A3 06' => 'AF-S DX Nikkor 10-24mm f/3.5-4.5G ED',
+    'A2 48 5C 80 24 24 A4 0E' => 'AF-S Nikkor 70-200mm f/2.8G ED VR II',
+    'A3 3C 29 44 30 30 A5 0E' => 'AF-S Nikkor 16-35mm f/4G ED VR',
+    'A4 54 37 37 0C 0C A6 06' => 'AF-S Nikkor 24mm f/1.4G ED',
+    'A5 40 3C 8E 2C 3C A7 0E' => 'AF-S Nikkor 28-300mm f/3.5-5.6G ED VR',
+    'A6 48 8E 8E 24 24 A8 0E' => 'AF-S VR Nikkor 300mm f/2.8G IF-ED II',
+    'A7 4B 62 62 2C 2C A9 0E' => 'AF-S DX Micro Nikkor 85mm f/3.5G ED VR',
+    'A9 54 80 80 18 18 AB 0E' => 'AF-S Nikkor 200mm f/2G ED VR II',
+    'AA 3C 37 6E 30 30 AC 0E' => 'AF-S Nikkor 24-120mm f/4G ED VR',
+    'AC 38 53 8E 34 3C AE 0E' => 'AF-S DX VR Nikkor 55-300mm 4.5-5.6G ED',
+    'AE 54 62 62 0C 0C B0 06' => 'AF-S Nikkor 85mm f/1.4G',
+    'AF 54 44 44 0C 0C B1 06' => 'AF-S Nikkor 35mm f/1.4G',
+    'B0 4C 50 50 14 14 B2 06' => 'AF-S Nikkor 50mm f/1.8G',
+    '01 00 00 00 00 00 02 00' => 'TC-16A',
+    '01 00 00 00 00 00 08 00' => 'TC-16A',
+    '00 00 00 00 00 00 F1 0C' => 'TC-14E [II] or Sigma APO Tele Converter 1.4x EX DG or Kenko Teleplus PRO 300 DG 1.4x',
+    '00 00 00 00 00 00 F2 18' => 'TC-20E [II] or Sigma APO Tele Converter 2x EX DG or Kenko Teleplus PRO 300 DG 2.0x',
+    '00 00 00 00 00 00 E1 12' => 'TC-17E II',
+    'FE 47 00 00 24 24 4B 06' => 'Sigma 4.5mm F2.8 EX DC HSM Circular Fisheye', #JD
+    '26 48 11 11 30 30 1C 02' => 'Sigma 8mm F4 EX Circular Fisheye',
+    '79 40 11 11 2C 2C 1C 06' => 'Sigma 8mm F3.5 EX Circular Fisheye', #JD
+    'DC 48 19 19 24 24 4B 06' => 'Sigma 10mm F2.8 EX DC HSM Fisheye',
+    '02 3F 24 24 2C 2C 02 00' => 'Sigma 14mm F3.5',
+    '48 48 24 24 24 24 4B 02' => 'Sigma 14mm F2.8 EX Aspherical HSM',
+    '26 48 27 27 24 24 1C 02' => 'Sigma 15mm F2.8 EX Diagonal Fisheye',
+    '26 58 31 31 14 14 1C 02' => 'Sigma 20mm F1.8 EX DG Aspherical RF',
+    '26 58 37 37 14 14 1C 02' => 'Sigma 24mm F1.8 EX DG Aspherical Macro',
+    'E1 58 37 37 14 14 1C 02' => 'Sigma 24mm F1.8 EX DG Aspherical Macro',
+    '02 46 37 37 25 25 02 00' => 'Sigma 24mm F2.8 Super Wide II Macro',
+    '26 58 3C 3C 14 14 1C 02' => 'Sigma 28mm F1.8 EX DG Aspherical Macro',
+    '48 54 3E 3E 0C 0C 4B 06' => 'Sigma 30mm F1.4 EX DC HSM',
+    'F8 54 3E 3E 0C 0C 4B 06' => 'Sigma 30mm F1.4 EX DC HSM', #JD
+    'DE 54 50 50 0C 0C 4B 06' => 'Sigma 50mm F1.4 EX DG HSM',
+    '32 54 50 50 24 24 35 02' => 'Sigma Macro 50mm F2.8 EX DG',
+    'E3 54 50 50 24 24 35 02' => 'Sigma Macro 50mm F2.8 EX DG', #http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,3215.0.html
+    '79 48 5C 5C 24 24 1C 06' => 'Sigma Macro 70mm F2.8 EX DG', #JD
+    '9B 54 62 62 0C 0C 4B 06' => 'Sigma 85mm F1.4 EX DG HSM',
+    '02 48 65 65 24 24 02 00' => 'Sigma 90mm F2.8 Macro',
+    '32 54 6A 6A 24 24 35 02.2' => 'Sigma Macro 105mm F2.8 EX DG', #JD
+    'E5 54 6A 6A 24 24 35 02' => 'Sigma Macro 105mm F2.8 EX DG',
+    '48 48 76 76 24 24 4B 06' => 'Sigma 150mm F2.8 EX DG APO Macro HSM',
+    'F5 48 76 76 24 24 4B 06' => 'Sigma 150mm F2.8 EX DG APO Macro HSM', #24
+    '48 4C 7C 7C 2C 2C 4B 02' => 'Sigma 180mm F3.5 EX DG Macro',
+    '48 4C 7D 7D 2C 2C 4B 02' => 'Sigma APO Macro 180mm F3.5 EX DG HSM',
+    '48 54 8E 8E 24 24 4B 02' => 'Sigma APO 300mm F2.8 EX DG HSM',
+    'FB 54 8E 8E 24 24 4B 02' => 'Sigma APO 300mm F2.8 EX DG HSM', #26
+    '26 48 8E 8E 30 30 1C 02' => 'Sigma APO Tele Macro 300mm F4',
+    '02 2F 98 98 3D 3D 02 00' => 'Sigma APO 400mm F5.6',
+    '26 3C 98 98 3C 3C 1C 02' => 'Sigma APO Tele Macro 400mm F5.6',
+    '02 37 A0 A0 34 34 02 00' => 'Sigma APO 500mm F4.5', #19
+    '48 44 A0 A0 34 34 4B 02' => 'Sigma APO 500mm F4.5 EX HSM',
+    'F1 44 A0 A0 34 34 4B 02' => 'Sigma APO 500mm F4.5 EX DG HSM',
+    '02 34 A0 A0 44 44 02 00' => 'Sigma APO 500mm F7.2',
+    '02 3C B0 B0 3C 3C 02 00' => 'Sigma APO 800mm F5.6',
+    '48 3C B0 B0 3C 3C 4B 02' => 'Sigma APO 800mm F5.6 EX HSM',
+    '9E 38 11 29 34 3C 4B 06' => 'Sigma 8-16mm F4.5-5.6 DC HSM',
+    'A1 41 19 31 2C 2C 4B 06' => 'Sigma 10-20mm F3.5 EX DC HSM',
+    '48 3C 19 31 30 3C 4B 06' => 'Sigma 10-20mm F4-5.6 EX DC HSM',
+    'F9 3C 19 31 30 3C 4B 06' => 'Sigma 10-20mm F4-5.6 EX DC HSM', #JD
+    '48 38 1F 37 34 3C 4B 06' => 'Sigma 12-24mm F4.5-5.6 EX DG Aspherical HSM',
+    'F0 38 1F 37 34 3C 4B 06' => 'Sigma 12-24mm F4.5-5.6 EX DG Aspherical HSM',
+    '26 40 27 3F 2C 34 1C 02' => 'Sigma 15-30mm F3.5-4.5 EX DG Aspherical DF',
+    '48 48 2B 44 24 30 4B 06' => 'Sigma 17-35mm F2.8-4 EX DG  Aspherical HSM',
+    '26 54 2B 44 24 30 1C 02' => 'Sigma 17-35mm F2.8-4 EX Aspherical',
+    '7A 47 2B 5C 24 34 4B 06' => 'Sigma 17-70mm F2.8-4.5 DC Macro Asp. IF HSM',
+    '7A 48 2B 5C 24 34 4B 06' => 'Sigma 17-70mm F2.8-4.5 DC Macro Asp. IF HSM',
+    '7F 48 2B 5C 24 34 1C 06' => 'Sigma 17-70mm F2.8-4.5 DC Macro Asp. IF',
+    '26 40 2D 44 2B 34 1C 02' => 'Sigma 18-35 F3.5-4.5 Aspherical',
+    '26 48 2D 50 24 24 1C 06' => 'Sigma 18-50mm F2.8 EX DC',
+    '7F 48 2D 50 24 24 1C 06' => 'Sigma 18-50mm F2.8 EX DC Macro', #25
+    '7A 48 2D 50 24 24 4B 06' => 'Sigma 18-50mm F2.8 EX DC Macro',
+    'F6 48 2D 50 24 24 4B 06' => 'Sigma 18-50mm F2.8 EX DC Macro',
+    'A4 47 2D 50 24 34 4B 0E' => 'Sigma 18-50mm F2.8-4.5 DC OS HSM',
+    '26 40 2D 50 2C 3C 1C 06' => 'Sigma 18-50mm F3.5-5.6 DC',
+    '7A 40 2D 50 2C 3C 4B 06' => 'Sigma 18-50mm F3.5-5.6 DC HSM',
+    '26 40 2D 70 2B 3C 1C 06' => 'Sigma 18-125mm F3.5-5.6 DC',
+    'CD 3D 2D 70 2E 3C 4B 0E' => 'Sigma 18-125mm F3.8-5.6 DC OS HSM',
+    '26 40 2D 80 2C 40 1C 06' => 'Sigma 18-200mm F3.5-6.3 DC',
+    '7A 40 2D 80 2C 40 4B 0E' => 'Sigma 18-200mm F3.5-6.3 DC OS HSM',
+    'ED 40 2D 80 2C 40 4B 0E' => 'Sigma 18-200mm F3.5-6.3 DC OS HSM', #JD
+    'A5 40 2D 88 2C 40 4B 0E' => 'Sigma 18-250mm F3.5-6.3 DC OS HSM',
+    '26 48 31 49 24 24 1C 02' => 'Sigma 20-40mm F2.8',
+    '26 48 37 56 24 24 1C 02' => 'Sigma 24-60mm F2.8 EX DG',
+    'B6 48 37 56 24 24 1C 02' => 'Sigma 24-60mm F2.8 EX DG',
+    'A6 48 37 5C 24 24 4B 06' => 'Sigma 24-70mm F2.8 IF EX DG HSM', #JD
+    '26 54 37 5C 24 24 1C 02' => 'Sigma 24-70mm F2.8 EX DG Macro',
+    '67 54 37 5C 24 24 1C 02' => 'Sigma 24-70mm F2.8 EX DG Macro',
+    'E9 54 37 5C 24 24 1C 02' => 'Sigma 24-70mm F2.8 EX DG Macro',
+    '26 40 37 5C 2C 3C 1C 02' => 'Sigma 24-70mm F3.5-5.6 Aspherical HF',
+    '26 54 37 73 24 34 1C 02' => 'Sigma 24-135mm F2.8-4.5',
+    '02 46 3C 5C 25 25 02 00' => 'Sigma 28-70mm F2.8',
+    '26 54 3C 5C 24 24 1C 02' => 'Sigma 28-70mm F2.8 EX',
+    '26 48 3C 5C 24 24 1C 06' => 'Sigma 28-70mm F2.8 EX DG',
+    '26 48 3C 5C 24 30 1C 02' => 'Sigma 28-70mm F2.8-4 DG',
+    '02 3F 3C 5C 2D 35 02 00' => 'Sigma 28-70mm F3.5-4.5 UC',
+    '26 40 3C 60 2C 3C 1C 02' => 'Sigma 28-80mm F3.5-5.6 Mini Zoom Macro II Aspherical',
+    '26 40 3C 65 2C 3C 1C 02' => 'Sigma 28-90mm F3.5-5.6 Macro',
+    '26 48 3C 6A 24 30 1C 02' => 'Sigma 28-105mm F2.8-4 Aspherical',
+    '26 3E 3C 6A 2E 3C 1C 02' => 'Sigma 28-105mm F3.8-5.6 UC-III Aspherical IF',
+    '26 40 3C 80 2C 3C 1C 02' => 'Sigma 28-200mm F3.5-5.6 Compact Aspherical Hyperzoom Macro',
+    '26 40 3C 80 2B 3C 1C 02' => 'Sigma 28-200mm F3.5-5.6 Compact Aspherical Hyperzoom Macro',
+    '26 3D 3C 80 2F 3D 1C 02' => 'Sigma 28-300mm F3.8-5.6 Aspherical',
+    '26 41 3C 8E 2C 40 1C 02' => 'Sigma 28-300mm F3.5-6.3 DG Macro',
+    'E6 41 3C 8E 2C 40 1C 02' => 'Sigma 28-300mm F3.5-6.3 DG Macro', #http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,3301.0.html
+    '26 40 3C 8E 2C 40 1C 02' => 'Sigma 28-300mm F3.5-6.3 Macro',
+    '02 3B 44 61 30 3D 02 00' => 'Sigma 35-80mm F4-5.6',
+    '02 40 44 73 2B 36 02 00' => 'Sigma 35-135mm F3.5-4.5 a',
+    '7A 47 50 76 24 24 4B 06' => 'Sigma 50-150mm F2.8 EX APO DC HSM',
+    'FD 47 50 76 24 24 4B 06' => 'Sigma 50-150mm F2.8 EX APO DC HSM II',
+    '48 3C 50 A0 30 40 4B 02' => 'Sigma 50-500mm F4-6.3 EX APO RF HSM',
+    '9F 37 50 A0 34 40 4B 0E' => 'Sigma 50-500mm F4.5-6.3 DG OS HSM', #16
+    '26 3C 54 80 30 3C 1C 06' => 'Sigma 55-200mm F4-5.6 DC',
+    '7A 3B 53 80 30 3C 4B 06' => 'Sigma 55-200mm F4-5.6 DC HSM',
+    '48 54 5C 80 24 24 4B 02' => 'Sigma 70-200mm F2.8 EX APO IF HSM',
+    '7A 48 5C 80 24 24 4B 06' => 'Sigma 70-200mm F2.8 EX APO DG Macro HSM II',
+    'EE 48 5C 80 24 24 4B 06' => 'Sigma 70-200mm F2.8 EX APO DG Macro HSM II', #JD
+    '9C 48 5C 80 24 24 4B 0E' => 'Sigma 70-200mm F2.8 EX DG OS HSM', #Rolando Ruzic
+    '02 46 5C 82 25 25 02 00' => 'Sigma 70-210mm F2.8 APO', #JD
+    '26 3C 5C 82 30 3C 1C 02' => 'Sigma 70-210mm F4-5.6 UC-II',
+    '26 3C 5C 8E 30 3C 1C 02' => 'Sigma 70-300mm F4-5.6 DG Macro',
+    '56 3C 5C 8E 30 3C 1C 02' => 'Sigma 70-300mm F4-5.6 APO Macro Super II',
+    'E0 3C 5C 8E 30 3C 4B 06' => 'Sigma 70-300mm F4-5.6 APO DG Macro HSM', #22
+    'A3 3C 5C 8E 30 3C 4B 0E' => 'Sigma 70-300mm F4-5.6 DG OS',
+    '02 37 5E 8E 35 3D 02 00' => 'Sigma 75-300mm F4.5-5.6 APO',
+    '02 3A 5E 8E 32 3D 02 00' => 'Sigma 75-300mm F4.0-5.6',
+    '77 44 61 98 34 3C 7B 0E' => 'Sigma 80-400mm F4.5-5.6 EX OS',
+    '48 48 68 8E 30 30 4B 02' => 'Sigma 100-300mm F4 EX IF HSM',
+    'F3 48 68 8E 30 30 4B 02' => 'Sigma APO 100-300mm F4 EX IF HSM',
+    '48 54 6F 8E 24 24 4B 02' => 'Sigma APO 120-300mm F2.8 EX DG HSM',
+    '7A 54 6E 8E 24 24 4B 02' => 'Sigma APO 120-300mm F2.8 EX DG HSM',
+    'FA 54 6E 8E 24 24 4B 02' => 'Sigma APO 120-300mm F2.8 EX DG HSM', #http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,2787.0.html
+    'CF 38 6E 98 34 3C 4B 0E' => 'Sigma APO 120-400mm F4.5-5.6 DG OS HSM',
+    '26 44 73 98 34 3C 1C 02' => 'Sigma 135-400mm F4.5-5.6 APO Aspherical',
+    'CE 34 76 A0 38 40 4B 0E' => 'Sigma 150-500mm F5-6.3 DG OS APO HSM', #JD
+    '26 40 7B A0 34 40 1C 02' => 'Sigma APO 170-500mm F5-6.3 Aspherical RF',
+    'A7 49 80 A0 24 24 4B 06' => 'Sigma APO 200-500mm F2.8 EX DG',
+    '48 3C 8E B0 3C 3C 4B 02' => 'Sigma APO 300-800mm F5.6 EX DG HSM',
+#
+    '00 47 25 25 24 24 00 02' => 'Tamron SP AF 14mm f/2.8 Aspherical (IF) (69E)',
+    'F4 54 56 56 18 18 84 06' => 'Tamron SP AF 60mm f/2.0 Di II Macro 1:1 (G005)', #24
+    '1E 5D 64 64 20 20 13 00' => 'Tamron SP AF 90mm f/2.5 (52E)',
+    '20 5A 64 64 20 20 14 00' => 'Tamron SP AF 90mm f/2.5 Macro (152E)',
+    '22 53 64 64 24 24 E0 02' => 'Tamron SP AF 90mm f/2.8 Macro 1:1 (72E)',
+    '32 53 64 64 24 24 35 02' => 'Tamron SP AF 90mm f/2.8 [Di] Macro 1:1 (172E/272E)',
+    'F8 55 64 64 24 24 84 06' => 'Tamron SP AF 90mm f/2.8 Di Macro 1:1 (272NII)',
+    'F8 54 64 64 24 24 DF 06' => 'Tamron SP AF 90mm f/2.8 Di Macro 1:1 (272NII)',
+    '00 4C 7C 7C 2C 2C 00 02' => 'Tamron SP AF 180mm f/3.5 Di Model (B01)',
+    '21 56 8E 8E 24 24 14 00' => 'Tamron SP AF 300mm f/2.8 LD-IF (60E)',
+    '27 54 8E 8E 24 24 1D 02' => 'Tamron SP AF 300mm f/2.8 LD-IF (360E)',
+    'F6 3F 18 37 2C 34 84 06' => 'Tamron SP AF 10-24mm f/3.5-4.5 Di II LD Aspherical (IF) (B001)',
+    '00 36 1C 2D 34 3C 00 06' => 'Tamron SP AF 11-18mm f/4.5-5.6 Di II LD Aspherical (IF) (A13)',
+    '07 46 2B 44 24 30 03 02' => 'Tamron SP AF 17-35mm f/2.8-4 Di LD Aspherical (IF) (A05)',
+    '00 53 2B 50 24 24 00 06' => 'Tamron SP AF 17-50mm f/2.8 XR Di II LD Aspherical (IF) (A16)', #PH
+    '00 54 2B 50 24 24 00 06' => 'Tamron SP AF 17-50mm f/2.8 XR Di II LD Aspherical (IF) (A16NII)',
+    'F3 54 2B 50 24 24 84 0E' => 'Tamron SP AF 17-50mm f/2.8 XR Di II VC LD Aspherical (IF) (B005)',
+    '00 3F 2D 80 2B 40 00 06' => 'Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical (IF) (A14)',
+    '00 3F 2D 80 2C 40 00 06' => 'Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical (IF) Macro (A14)',
+    '00 40 2D 80 2C 40 00 06' => 'Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical (IF) Macro (A14NII)', #25
+    '00 40 2D 88 2C 40 62 06' => 'Tamron AF 18-250mm f/3.5-6.3 Di II LD Aspherical (IF) Macro (A18)',
+    '00 40 2D 88 2C 40 00 06' => 'Tamron AF 18-250mm f/3.5-6.3 Di II LD Aspherical (IF) Macro (A18NII)', #JD
+    'F5 40 2C 8A 2C 40 40 0E' => 'Tamron AF 18-270mm f/3.5-6.3 Di II VC LD Aspherical (IF) Macro (B003)',
+    '07 40 2F 44 2C 34 03 02' => 'Tamron AF 19-35mm f/3.5-4.5 (A10)',
+    '07 40 30 45 2D 35 03 02' => 'Tamron AF 19-35mm f/3.5-4.5 (A10)',
+    '00 49 30 48 22 2B 00 02' => 'Tamron SP AF 20-40mm f/2.7-3.5 (166D)',
+    '0E 4A 31 48 23 2D 0E 02' => 'Tamron SP AF 20-40mm f/2.7-3.5 (166D)',
+    '45 41 37 72 2C 3C 48 02' => 'Tamron SP AF 24-135mm f/3.5-5.6 AD Aspherical (IF) Macro (190D)',
+    '33 54 3C 5E 24 24 62 02' => 'Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical (IF) Macro (A09)',
+    'FA 54 3C 5E 24 24 84 06' => 'Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical (IF) Macro (A09NII)', #JD
+    '10 3D 3C 60 2C 3C D2 02' => 'Tamron AF 28-80mm f/3.5-5.6 Aspherical (177D)',
+    '45 3D 3C 60 2C 3C 48 02' => 'Tamron AF 28-80mm f/3.5-5.6 Aspherical (177D)',
+    '00 48 3C 6A 24 24 00 02' => 'Tamron SP AF 28-105mm f/2.8 LD Aspherical IF (176D)',
+    '0B 3E 3D 7F 2F 3D 0E 00' => 'Tamron AF 28-200mm f/3.8-5.6 (71D)',
+    '0B 3E 3D 7F 2F 3D 0E 02' => 'Tamron AF 28-200mm f/3.8-5.6D (171D)',
+    '12 3D 3C 80 2E 3C DF 02' => 'Tamron AF 28-200mm f/3.8-5.6 AF Aspherical LD (IF) (271D)',
+    '4D 41 3C 8E 2B 40 62 02' => 'Tamron AF 28-300mm f/3.5-6.3 XR Di LD Aspherical (IF) (A061)',
+    '4D 41 3C 8E 2C 40 62 02' => 'Tamron AF 28-300mm f/3.5-6.3 XR LD Aspherical (IF) (185D)',
+    'F9 40 3C 8E 2C 40 40 0E' => 'Tamron AF 28-300mm f/3.5-6.3 XR Di VC LD Aspherical (IF) Macro (A20)',
+    '00 47 53 80 30 3C 00 06' => 'Tamron AF 55-200mm f/4-5.6 Di II LD (A15)',
+    'F7 53 5C 80 24 24 84 06' => 'Tamron SP AF 70-200mm f/2.8 Di LD (IF) Macro (A001)',
+    'FE 53 5C 80 24 24 84 06' => 'Tamron SP AF 70-200mm f/2.8 Di LD (IF) Macro (A001)',
+    '69 48 5C 8E 30 3C 6F 02' => 'Tamron AF 70-300mm f/4-5.6 LD Macro 1:2 (772D)',
+    '69 47 5C 8E 30 3C 00 02' => 'Tamron AF 70-300mm f/4-5.6 Di LD Macro 1:2 (A17N)',
+    '00 48 5C 8E 30 3C 00 06' => 'Tamron AF 70-300mm f/4-5.6 Di LD Macro 1:2 (A17)', #JD
+    'F1 47 5C 8E 30 3C DF 0E' => 'Tamron SP 70-300mm f/4-5.6 Di VC USD (A005)',
+    '20 3C 80 98 3D 3D 1E 02' => 'Tamron AF 200-400mm f/5.6 LD IF (75D)',
+    '00 3E 80 A0 38 3F 00 02' => 'Tamron SP AF 200-500mm f/5-6.3 Di LD (IF) (A08)',
+    '00 3F 80 A0 38 3F 00 02' => 'Tamron SP AF 200-500mm f/5-6.3 Di (A08)',
+#
+    '00 40 2B 2B 2C 2C 00 02' => 'Tokina AT-X 17 AF PRO (AF 17mm f/3.5)',
+    '00 47 44 44 24 24 00 06' => 'Tokina AT-X M35 PRO DX (AF 35mm f/2.8 Macro)',
+    '00 54 68 68 24 24 00 02' => 'Tokina AT-X M100 PRO D (AF 100mm f/2.8 Macro)',
+    '27 48 8E 8E 30 30 1D 02' => 'Tokina AT-X 304 AF (AF 300mm f/4.0)',
+    '00 54 8E 8E 24 24 00 02' => 'Tokina AT-X 300 AF PRO (AF 300mm f/2.8)',
+    '12 3B 98 98 3D 3D 09 00' => 'Tokina AT-X 400 AF SD (AF 400mm f/5.6)',
+    '00 40 18 2B 2C 34 00 06' => 'Tokina AT-X 107 DX Fisheye (AF 10-17mm f/3.5-4.5)',
+    '00 48 1C 29 24 24 00 06' => 'Tokina AT-X 116 PRO DX (AF 11-16mm f/2.8)',
+    '00 3C 1F 37 30 30 00 06' => 'Tokina AT-X 124 AF PRO DX (AF 12-24mm f/4)',
+    '7A 3C 1F 37 30 30 7E 06.2' => 'Tokina AT-X 124 AF PRO DX II (AF 12-24mm f/4)',
+    '00 48 29 3C 24 24 00 06' => 'Tokina AT-X 16-28 AF PRO FX (AF 16-28mm f/2.8)',
+    '00 48 29 50 24 24 00 06' => 'Tokina AT-X 165 PRO DX (AF 16-50mm f/2.8)',
+    '00 40 2A 72 2C 3C 00 06' => 'Tokina AT-X 16.5-135 DX (AF 16.5-135mm F3.5-5.6)',
+    '2F 40 30 44 2C 34 29 02.2' => 'Tokina AF 193 (AF 19-35mm f/3.5-4.5)',
+    '2F 48 30 44 24 24 29 02.2' => 'Tokina AT-X 235 AF PRO (AF 20-35mm f/2.8)',
+    '2F 40 30 44 2C 34 29 02.1' => 'Tokina AF 235 II (AF 20-35mm f/3.5-4.5)',
+    '00 40 37 80 2C 3C 00 02' => 'Tokina AT-X 242 AF (AF 24-200mm f/3.5-5.6)',
+    '25 48 3C 5C 24 24 1B 02.1' => 'Tokina AT-X 270 AF PRO II (AF 28-70mm f/2.6-2.8)',
+    '25 48 3C 5C 24 24 1B 02.2' => 'Tokina AT-X 287 AF PRO SV (AF 28-70mm f/2.8)',
+    '07 48 3C 5C 24 24 03 00' => 'Tokina AT-X 287 AF (AF 28-70mm f/2.8)',
+    '07 47 3C 5C 25 35 03 00' => 'Tokina AF 287 SD (AF 28-70mm f/2.8-4.5)',
+    '07 40 3C 5C 2C 35 03 00' => 'Tokina AF 270 II (AF 28-70mm f/3.5-4.5)',
+    '00 48 3C 60 24 24 00 02' => 'Tokina AT-X 280 AF PRO (AF 28-80mm f/2.8)',
+    '25 44 44 8E 34 42 1B 02' => 'Tokina AF 353 (AF 35-300mm f/4.5-6.7)',
+    '00 48 50 72 24 24 00 06' => 'Tokina AT-X 535 PRO DX (AF 50-135mm f/2.8)',
+    '12 44 5E 8E 34 3C 09 00' => 'Tokina AF 730 (AF 75-300mm F4.5-5.6)',
+    '14 54 60 80 24 24 0B 00' => 'Tokina AT-X 828 AF (AF 80-200mm f/2.8)',
+    '24 54 60 80 24 24 1A 02' => 'Tokina AT-X 828 AF PRO (AF 80-200mm f/2.8)',
+    '24 44 60 98 34 3C 1A 02' => 'Tokina AT-X 840 AF-II (AF 80-400mm f/4.5-5.6)',
+    '00 44 60 98 34 3C 00 02' => 'Tokina AT-X 840 D (AF 80-400mm f/4.5-5.6)',
+    '14 48 68 8E 30 30 0B 00' => 'Tokina AT-X 340 AF (AF 100-300mm f/4)',
+#
+    '06 3F 68 68 2C 2C 06 00' => 'Cosina AF 100mm F3.5 Macro',
+    '07 36 3D 5F 2C 3C 03 00' => 'Cosina AF Zoom 28-80mm F3.5-5.6 MC Macro',
+    '07 46 3D 6A 25 2F 03 00' => 'Cosina AF Zoom 28-105mm F2.8-3.8 MC',
+    '12 36 5C 81 35 3D 09 00' => 'Cosina AF Zoom 70-210mm F4.5-5.6 MC Macro',
+    '12 39 5C 8E 34 3D 08 02' => 'Cosina AF Zoom 70-300mm F4.5-5.6 MC Macro',
+    '12 3B 68 8D 3D 43 09 02' => 'Cosina AF Zoom 100-300mm F5.6-6.7 MC Macro',
+#
+    '00 40 31 31 2C 2C 00 00' => 'Voigtlander Color Skopar 20mm F3.5 SLII Aspherical',
+    '00 54 48 48 18 18 00 00' => 'Voigtlander Ultron 40mm F2 SLII Aspherical',
+    '00 54 55 55 0C 0C 00 00' => 'Voigtlander Nokton 58mm F1.4 SLII',
+    '00 40 64 64 2C 2C 00 00' => 'Voigtlander APO-Lanthar 90mm F3.5 SLII Close Focus',
+#
+    '00 40 2D 2D 2C 2C 00 00' => 'Carl Zeiss Distagon T* 3,5/18 ZF.2',
+    '00 48 32 32 24 24 00 00' => 'Carl Zeiss Distagon T* 2,8/21 ZF.2',
+    '00 54 3C 3C 18 18 00 00' => 'Carl Zeiss Distagon T* 2/28 ZF.2',
+    '00 54 44 44 18 18 00 00' => 'Carl Zeiss Distagon T* 2/35 ZF.2',
+    '00 54 50 50 0C 0C 00 00' => 'Carl Zeiss Planar T* 1,4/50 ZF.2',
+    '00 54 50 50 18 18 00 00' => 'Carl Zeiss Makro-Planar T* 2/50 ZF.2',
+    '00 54 62 62 0C 0C 00 00' => 'Carl Zeiss Planar T* 1,4/85 ZF.2',
+    '00 54 68 68 18 18 00 00' => 'Carl Zeiss Makro-Planar T* 2/100 ZF.2',
+#
+    '00 54 56 56 30 30 00 00' => 'Coastal Optical Systems 60mm 1:4 UV-VIS-IR Macro Apo',
+#
+    '4A 48 24 24 24 0C 4D 02' => 'Samyang AE 14mm f/2.8 ED AS IF UMC', #http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,3150.0.html
+    '4A 60 44 44 0C 0C 4D 02' => 'Samyang 35mm f/1.4 AS UMC',
+    '4A 60 62 62 0C 0C 4D 02' => 'Samyang AE 85mm f/1.4 AS IF UMC', #http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,2888.0.html
+#
+    '02 40 44 5C 2C 34 02 00' => 'Exakta AF 35-70mm 1:3.5-4.5 MC',
+#
+    '07 3E 30 43 2D 35 03 00' => 'Soligor AF Zoom 19-35mm 1:3.5-4.5 MC',
+    '03 43 5C 81 35 35 02 00' => 'Soligor AF C/D Zoom UMCS 70-210mm 1:4.5',
+    '12 4A 5C 81 31 3D 09 00' => 'Soligor AF C/D Auto Zoom+Macro 70-210mm 1:4-5.6 UMCS',
+#
+    '00 00 00 00 00 00 00 01' => 'Manual Lens No CPU',
+#
+    '00 47 10 10 24 24 00 00' => 'Fisheye Nikkor 8mm f/2.8 AiS',
+    '00 54 44 44 0C 0C 00 00' => 'Nikkor 35mm f/1.4 AiS',
+    '00 48 50 50 18 18 00 00' => 'Nikkor H 50mm f/2',
+    '00 58 64 64 20 20 00 00' => 'Soligor C/D Macro MC 90mm f/2.5',
+    '00 48 68 68 24 24 00 00' => 'Series E 100mm f/2.8',
+    '00 4C 6A 6A 20 20 00 00' => 'Nikkor 105mm f/2.5 AiS',
+    '00 48 80 80 30 30 00 00' => 'Nikkor 200mm f/4 AiS',
+);
+
+# flash firmware decoding (ref JD)
+my %flashFirmware = (
+    '0 0' => 'n/a',
+    '1 1' => '1.01 (SB-800 or Metz 58 AF-1)',
+    '1 3' => '1.03 (SB-800)',
+    '2 1' => '2.01 (SB-800)',
+    '2 4' => '2.04 (SB-600)',
+    '2 5' => '2.05 (SB-600)',
+    '3 1' => '3.01 (SU-800 Remote Commander)',
+    '4 1' => '4.01 (SB-400)',
+    '4 2' => '4.02 (SB-400)',
+    '4 4' => '4.04 (SB-400)',
+    '5 1' => '5.01 (SB-900)',
+    '5 2' => '5.02 (SB-900)',
+    OTHER => sub {
+        my ($val, $inv) = @_;
+        return sprintf('%d.%.2d (Unknown model)', split(' ', $val)) unless $inv;
+        return "$1 $2" if $val =~ /(\d+)\.(\d+)/;
+        return '0 0';
+    },
+);
+
+# flash Guide Number (GN) distance settings (ref 28)
+my %flashGNDistance = (
+    0 => 0,         19 => '2.8 m',
+    1 => '0.1 m',   20 => '3.2 m',
+    2 => '0.2 m',   21 => '3.6 m',
+    3 => '0.3 m',   22 => '4.0 m',
+    4 => '0.4 m',   23 => '4.5 m',
+    5 => '0.5 m',   24 => '5.0 m',
+    6 => '0.6 m',   25 => '5.6 m',
+    7 => '0.7 m',   26 => '6.3 m',
+    8 => '0.8 m',   27 => '7.1 m',
+    9 => '0.9 m',   28 => '8.0 m',
+    10 => '1.0 m',  29 => '9.0 m',
+    11 => '1.1 m',  30 => '10.0 m',
+    12 => '1.3 m',  31 => '11.0 m',
+    13 => '1.4 m',  32 => '13.0 m',
+    14 => '1.6 m',  33 => '14.0 m',
+    15 => '1.8 m',  34 => '16.0 m',
+    16 => '2.0 m',  35 => '18.0 m',
+    17 => '2.2 m',  36 => '20.0 m',
+    18 => '2.5 m',  255 => 'n/a',
+);
+
+# flash control mode values (ref JD)
+my %flashControlMode = (
+    0x00 => 'Off',
+    0x01 => 'iTTL-BL',
+    0x02 => 'iTTL',
+    0x03 => 'Auto Aperture',
+    0x04 => 'Automatic', #28
+    0x05 => 'GN (distance priority)', #28 (Guide Number, but called "GN" in manual)
+    0x06 => 'Manual',
+    0x07 => 'Repeating Flash',
+);
+
+my %retouchValues = ( #PH
+    0 => 'None',
+    3 => 'B & W',
+    4 => 'Sepia',
+    5 => 'Trim',
+    6 => 'Small Picture',
+    7 => 'D-Lighting',
+    8 => 'Red Eye',
+    9 => 'Cyanotype',
+    10 => 'Sky Light',
+    11 => 'Warm Tone',
+    12 => 'Color Custom',
+    13 => 'Image Overlay',
+    14 => 'Red Intensifier',
+    15 => 'Green Intensifier',
+    16 => 'Blue Intensifier',
+    17 => 'Cross Screen',
+    18 => 'Quick Retouch',
+    19 => 'NEF Processing',
+    23 => 'Distortion Control',
+    25 => 'Fisheye',
+    26 => 'Straighten',
+    29 => 'Perspective Control',
+    30 => 'Color Outline',
+    31 => 'Soft Filter',
+    33 => 'Miniature Effect',
+);
+
+my %offOn = ( 0 => 'Off', 1 => 'On' );
+
+# common attributes for writable BinaryData directories
+my %binaryDataAttrs = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+);
+
+# Nikon maker note tags
+%Image::ExifTool::Nikon::Main = (
+    PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikon,
+    WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikon,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    WRITABLE => 1,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    PRINT_CONV => \&FormatString,
+    0x0001 => { #2
+        # the format differs for different models.  for D70, this is a string '0210',
+        # but for the E775 it is binary: "\x00\x01\x00\x00"
+        Name => 'MakerNoteVersion',
+        Writable => 'undef',
+        Count => 4,
+        # convert to string if binary
+        ValueConv => '$_=$val; /^[\x00-\x09]/ and $_=join("",unpack("CCCC",$_)); $_',
+        ValueConvInv => '$val',
+        PrintConv => '$_=$val;s/^(\d{2})/$1\./;s/^0//;$_',
+        PrintConvInv => '$_=$val;s/\.//;"0$_"',
+    },
+    0x0002 => {
+        # this is the ISO actually used by the camera
+        # (may be different than ISO setting if auto)
+        Name => 'ISO',
+        Writable => 'int16u',
+        Count => 2,
+        Priority => 0,  # the EXIF ISO is more reliable
+        Groups => { 2 => 'Image' },
+        # D300 sets this to undef with 4 zero bytes when LO ISO is used - PH
+        RawConv => '$val eq "\0\0\0\0" ? undef : $val',
+        # first number is 1 for "Hi ISO" modes (H0.3, H0.7 and H1.0 on D80) - PH
+        PrintConv => '$_=$val;s/^0 //;s/^1 (\d+)/Hi $1/;$_',
+        PrintConvInv => '$_=$val;/^\d+/ ? "0 $_" : (s/Hi ?//i ? "1 $_" : $_)',
+    },
+    # Note: we attempt to fix the case of these string values (typically written in all caps)
+    0x0003 => { Name => 'ColorMode',    Writable => 'string' },
+    0x0004 => { Name => 'Quality',      Writable => 'string' },
+    0x0005 => { Name => 'WhiteBalance', Writable => 'string' },
+    0x0006 => { Name => 'Sharpness',    Writable => 'string' },
+    0x0007 => { Name => 'FocusMode',    Writable => 'string' },
+    # FlashSetting (better named FlashSyncMode, ref 28) values:
+    #   "Normal", "Slow", "Rear Slow", "RED-EYE", "RED-EYE SLOW"
+    0x0008 => { Name => 'FlashSetting', Writable => 'string' },
+    # FlashType observed values:
+    #   internal: "Built-in,TTL", "Built-in,RPT", "Comdr.", "NEW_TTL"
+    #   external: "Optional,TTL", "Optional,RPT", "Optional,M", "Comdr."
+    #   both:     "Built-in,TTL&Comdr."
+    #   no flash: ""
+    0x0009 => { Name => 'FlashType',    Writable => 'string' }, #2 (count varies by model - PH)
+    # 0x000a - rational values: 5.6 to 9.283 - found in coolpix models - PH
+    #          (not correlated with any LV or scale factor)
+    0x000b => { #2
+        Name => 'WhiteBalanceFineTune',
+        Writable => 'int16s',
+        Count => -1, # older models write 1 value, newer DSLR's write 2 - PH
+    },
+    0x000c => { # (D1X)
+        Name => 'WB_RBLevels',
+        Writable => 'rational64u',
+        Count => 4, # (not sure what the last 2 values are for)
+    },
+    0x000d => { #15
+        Name => 'ProgramShift',
+        Writable => 'undef',
+        Count => 4,
+        ValueConv => 'my ($a,$b,$c)=unpack("c3",$val); $c ? $a*($b/$c) : 0',
+        ValueConvInv => q{
+            my $a = int($val*6 + ($val>0 ? 0.5 : -0.5));
+            $a<-128 or $a>127 ? undef : pack("c4",$a,1,6,0);
+        },
+        PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    0x000e => {
+        Name => 'ExposureDifference',
+        Writable => 'undef',
+        Count => 4,
+        ValueConv => 'my ($a,$b,$c)=unpack("c3",$val); $c ? $a*($b/$c) : 0',
+        ValueConvInv => q{
+            my $a = int($val*12 + ($val>0 ? 0.5 : -0.5));
+            $a<-128 or $a>127 ? undef : pack("c4",$a,1,12,0);
+        },
+        PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
+        PrintConvInv => '$val',
+    },
+    0x000f => { Name => 'ISOSelection', Writable => 'string' }, #2
+    0x0010 => {
+        Name => 'DataDump',
+        Writable => 0,
+        Binary => 1,
+    },
+    0x0011 => {
+        Name => 'PreviewIFD',
+        Groups => { 1 => 'PreviewIFD', 2 => 'Image' },
+        Flags => 'SubIFD',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Nikon::PreviewIFD',
+            Start => '$val',
+        },
+    },
+    0x0012 => { #2 (camera setting: combination of command dial and menus - PH)
+        Name => 'FlashExposureComp',
+        Description => 'Flash Exposure Compensation',
+        Writable => 'undef',
+        Count => 4,
+        Notes => 'may be set even if flash does not fire',
+        ValueConv => 'my ($a,$b,$c)=unpack("c3",$val); $c ? $a*($b/$c) : 0',
+        ValueConvInv => q{
+            my $a = int($val*6 + ($val>0 ? 0.5 : -0.5));
+            $a<-128 or $a>127 ? undef : pack("c4",$a,1,6,0);
+        },
+        PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    # D70 - another ISO tag
+    0x0013 => { #2
+        Name => 'ISOSetting',
+        Writable => 'int16u',
+        Count => 2,
+        PrintConv => '$_=$val;s/^0 //;$_',
+        PrintConvInv => '"0 $val"',
+    },
+    0x0014 => [
+        { #4
+            Name => 'ColorBalanceA',
+            Condition => '$format eq "undef" and $count == 2560',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Nikon::ColorBalanceA',
+                ByteOrder => 'BigEndian',
+            },
+        },
+        { #PH
+            Name => 'NRWData',
+            Condition => '$$valPt =~ /^NRW/', # starts with "NRW 0100"
+            Notes => 'large unknown block in NRW images, not copied to JPEG images',
+            # 'Drop' because not found in JPEG images (too large for APP1 anyway)
+            Flags => [ 'Unknown', 'Binary', 'Drop' ],
+        },
+    ],
+    # D70 Image boundary?? top x,y bot-right x,y
+    0x0016 => { #2
+        Name => 'ImageBoundary',
+        Writable => 'int16u',
+        Count => 4,
+    },
+    0x0017 => { #28
+        Name => 'ExternalFlashExposureComp', #PH (setting from external flash unit)
+        Writable => 'undef',
+        Count => 4,
+        ValueConv => 'my ($a,$b,$c)=unpack("c3",$val); $c ? $a*($b/$c) : 0',
+        ValueConvInv => q{
+            my $a = int($val*6 + ($val>0 ? 0.5 : -0.5));
+            $a<-128 or $a>127 ? undef : pack("c4",$a,1,6,0);
+        },
+        PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    0x0018 => { #5
+        Name => 'FlashExposureBracketValue',
+        Writable => 'undef',
+        Count => 4,
+        ValueConv => 'my ($a,$b,$c)=unpack("c3",$val); $c ? $a*($b/$c) : 0',
+        ValueConvInv => q{
+            my $a = int($val*6 + ($val>0 ? 0.5 : -0.5));
+            $a<-128 or $a>127 ? undef : pack("c4",$a,1,6,0);
+        },
+        PrintConv => 'sprintf("%.1f",$val)',
+        PrintConvInv => '$val',
+    },
+    0x0019 => { #5
+        Name => 'ExposureBracketValue',
+        Writable => 'rational64s',
+        PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    0x001a => { #PH
+        Name => 'ImageProcessing',
+        Writable => 'string',
+    },
+    0x001b => { #15
+        Name => 'CropHiSpeed',
+        Writable => 'int16u',
+        Count => 7,
+        PrintConv => q{
+            my @a = split ' ', $val;
+            return "Unknown ($val)" unless @a == 7;
+            $a[0] = $a[0] ? "On" : "Off";
+            return "$a[0] ($a[1]x$a[2] cropped to $a[3]x$a[4] at pixel $a[5],$a[6])";
+        }
+    },
+    0x001c => { #28 (D3 "the application of CSb6 to the selected metering mode")
+        Name => 'ExposureTuning',
+        Writable => 'undef',
+        Count => 3,
+        ValueConv => 'my ($a,$b,$c)=unpack("c3",$val); $c ? $a*($b/$c) : 0',
+        ValueConvInv => q{
+            my $a = int($val*6 + ($val>0 ? 0.5 : -0.5));
+            $a<-128 or $a>127 ? undef : pack("c3",$a,1,6);
+        },
+        PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    0x001d => { #4
+        Name => 'SerialNumber',
+        Writable => 'string',
+        Protected => 1,
+        Notes => q{
+            this value is used as a key to decrypt other information -- writing this tag
+            causes the other information to be re-encrypted with the new key
+        },
+        PrintConv => undef, # disable default PRINT_CONV
+    },
+    0x001e => { #14
+        Name => 'ColorSpace',
+        Writable => 'int16u',
+        PrintConv => {
+            1 => 'sRGB',
+            2 => 'Adobe RGB',
+        },
+    },
+    0x001f => { #PH
+        Name => 'VRInfo',
+        SubDirectory => { TagTable => 'Image::ExifTool::Nikon::VRInfo' },
+    },
+    0x0020 => { #16
+        Name => 'ImageAuthentication',
+        Writable => 'int8u',
+        PrintConv => \%offOn,
+    },
+    0x0021 => { #PH
+        Name => 'FaceDetect',
+        SubDirectory => { TagTable => 'Image::ExifTool::Nikon::FaceDetect' },
+    },
+    0x0022 => { #21
+        Name => 'ActiveD-Lighting',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Low',
+            3 => 'Normal',
+            5 => 'High',
+            7 => 'Extra High', #10
+            0xffff => 'Auto', #10
+        },
+    },
+    0x0023 => { #PH (D300, but also found in D3,D3S,D3X,D90,D300S,D700,D3000,D5000)
+        Name => 'PictureControlData',
+        Writable => 'undef',
+        Permanent => 0,
+        Binary => 1,
+        SubDirectory => { TagTable => 'Image::ExifTool::Nikon::PictureControl' },
+    },
+    0x0024 => { #JD
+        Name => 'WorldTime',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Nikon::WorldTime',
+            # (CaptureNX does flip the byte order of this record)
+        },
+    },
+    0x0025 => { #PH
+        Name => 'ISOInfo',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Nikon::ISOInfo',
+            ByteOrder => 'BigEndian', #(NC)
+        },
+    },
+    0x002a => { #23 (this tag added with D3 firmware 1.10 -- also written by Nikon utilities)
+        Name => 'VignetteControl',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Low',
+            3 => 'Normal',
+            5 => 'High',
+        },
+    },
+    0x002b => { #PH
+        Name => 'DistortInfo',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Nikon::DistortInfo',
+            ByteOrder => 'BigEndian', #(NC)
+        },
+    },
+    0x002c => { #29 (D7000)
+        Name => 'UnknownInfo',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Nikon::UnknownInfo',
+            ByteOrder => 'BigEndian', #(NC)
+        },
+    },
+    0x0032 => { #PH
+        Name => 'UnknownInfo2',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Nikon::UnknownInfo2',
+            ByteOrder => 'BigEndian', #(NC)
+        },
+    },
+    0x0080 => { Name => 'ImageAdjustment',  Writable => 'string' },
+    0x0081 => { Name => 'ToneComp',         Writable => 'string' }, #2
+    0x0082 => { Name => 'AuxiliaryLens',    Writable => 'string' },
+    0x0083 => {
+        Name => 'LensType',
+        Writable => 'int8u',
+        # credit to Tom Christiansen (ref 7) for figuring this out...
+        PrintConv => q[$_ = $val ? Image::ExifTool::DecodeBits($val,
+            {
+                0 => 'MF',
+                1 => 'D',
+                2 => 'G',
+                3 => 'VR',
+            }) : 'AF';
+            # remove commas and change "D G" to just "G"
+            s/,//g; s/\bD G\b/G/; $_
+        ],
+        PrintConvInv => q[
+            my $bits = 0;
+            $bits |= 0x01 if $val =~ /\bMF\b/i;
+            $bits |= 0x02 if $val =~ /\bD\b/i;
+            $bits |= 0x06 if $val =~ /\bG\b/i;
+            $bits |= 0x08 if $val =~ /\bVR\b/i;
+            return $bits;
+        ],
+    },
+    0x0084 => { #2
+        Name => "Lens",
+        Writable => 'rational64u',
+        Count => 4,
+        # short focal, long focal, aperture at short focal, aperture at long focal
+        PrintConv => \&Image::ExifTool::Exif::PrintLensInfo,
+        PrintConvInv => \&Image::ExifTool::Exif::ConvertLensInfo,
+    },
+    0x0085 => {
+        Name => 'ManualFocusDistance',
+        Writable => 'rational64u',
+    },
+    0x0086 => {
+        Name => 'DigitalZoom',
+        Writable => 'rational64u',
+    },
+    0x0087 => { #5
+        Name => 'FlashMode',
+        Writable => 'int8u',
+        PrintConv => {
+            0 => 'Did Not Fire',
+            1 => 'Fired, Manual', #14
+            3 => 'Not Ready', #28
+            7 => 'Fired, External', #14
+            8 => 'Fired, Commander Mode',
+            9 => 'Fired, TTL Mode',
+        },
+    },
+    0x0088 => [
+        {
+            Name => 'AFInfo',
+            Condition => '$$self{Model} =~ /^NIKON D/i',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Nikon::AFInfo',
+                ByteOrder => 'BigEndian',
+            },
+        },
+        {
+            Name => 'AFInfo',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Nikon::AFInfo',
+                ByteOrder => 'LittleEndian',
+            },
+        },
+    ],
+    0x0089 => { #5
+        Name => 'ShootingMode',
+        Writable => 'int16u',
+        # the meaning of bit 5 seems to change:  For the D200 it indicates "Auto ISO" - PH
+        Notes => 'for the D70, Bit 5 = Unused LE-NR Slowdown',
+        # credit to Tom Christiansen (ref 7) for figuring this out...
+        # The (new?) bit 5 seriously complicates our life here: after firmwareB's
+        # 1.03, bit 5 turns on when you ask for BUT DO NOT USE the long-range
+        # noise reduction feature, probably because even not using it, it still
+        # slows down your drive operation to 50% (1.5fps max not 3fps).  But no
+        # longer does !$val alone indicate single-frame operation. - TC, D70
+        PrintConv => q[
+            $_ = '';
+            unless ($val & 0x87) {
+                return 'Single-Frame' unless $val;
+                $_ = 'Single-Frame, ';
+            }
+            return $_ . Image::ExifTool::DecodeBits($val,
+            {
+                0 => 'Continuous',
+                1 => 'Delay',
+                2 => 'PC Control',
+                4 => 'Exposure Bracketing',
+                5 => $$self{Model}=~/D70\b/ ? 'Unused LE-NR Slowdown' : 'Auto ISO',
+                6 => 'White-Balance Bracketing',
+                7 => 'IR Control',
+            });
+        ],
+    },
+    # 0x008a - called "AutoBracketRelease" by ref 15 [but this seems wrong]
+    #   values: 0,255 (when writing NEF only), or 1,2 (when writing JPEG or JPEG+NEF)
+    #   --> makes odd, repeating pattern in sequential NEF images (ref 28)
+    0x008b => { #8
+        Name => 'LensFStops',
+        ValueConv => 'my ($a,$b,$c)=unpack("C3",$val); $c ? $a*($b/$c) : 0',
+        ValueConvInv => 'my $a=int($val*12+0.5);$a<256 ? pack("C4",$a,1,12,0) : undef',
+        PrintConv => 'sprintf("%.2f", $val)',
+        PrintConvInv => '$val',
+        Writable => 'undef',
+        Count => 4,
+    },
+    0x008c => {
+        Name => 'ContrastCurve', #JD
+        Writable => 0,
+        Binary => 1,
+    },
+    0x008d => { Name => 'ColorHue' ,        Writable => 'string' }, #2
+    # SceneMode takes on the following values: PORTRAIT, PARTY/INDOOR, NIGHT PORTRAIT,
+    # BEACH/SNOW, LANDSCAPE, SUNSET, NIGHT SCENE, MUSEUM, FIREWORKS, CLOSE UP, COPY,
+    # BACK LIGHT, PANORAMA ASSIST, SPORT, DAWN/DUSK
+    0x008f => { Name => 'SceneMode',        Writable => 'string' }, #2
+    # LightSource shows 3 values COLORED SPEEDLIGHT NATURAL.
+    # (SPEEDLIGHT when flash goes. Have no idea about difference between other two.)
+    0x0090 => { Name => 'LightSource',      Writable => 'string' }, #2
+    0x0091 => [ #18
+        { #PH
+            Condition => '$$valPt =~ /^0209/',
+            Name => 'ShotInfoD40',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Nikon::ShotInfoD40',
+                DecryptStart => 4,
+                DecryptLen => 748,
+                ByteOrder => 'BigEndian',
+            },
+        },
+        {
+            Condition => '$$valPt =~ /^0208/',
+            Name => 'ShotInfoD80',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Nikon::ShotInfoD80',
+                DecryptStart => 4,
+                DecryptLen => 764,
+                # (Capture NX can change the makernote byte order, but this stays big-endian)
+                ByteOrder => 'BigEndian',
+            },
+        },
+        { #PH (D90, firmware 1.00)
+            Condition => '$$valPt =~ /^0213/',
+            Name => 'ShotInfoD90',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Nikon::ShotInfoD90',
+                DecryptStart => 4,
+                DecryptLen => 0x398,
+                ByteOrder => 'BigEndian',
+            },
+        },
+        { #PH (D3, firmware 0.37 and 1.00)
+            Condition => '$$valPt =~ /^0210/ and $count == 5399',
+            Name => 'ShotInfoD3a',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Nikon::ShotInfoD3a',
+                DecryptStart => 4,
+                DecryptLen => 0x318,
+                ByteOrder => 'BigEndian',
+            },
+        },
+        { #PH (D3, firmware 1.10, 2.00 and 2.01 [count 5408], and 2.02 [count 5412])
+            Condition => '$$valPt =~ /^0210/ and ($count == 5408 or $count == 5412)',
+            Name => 'ShotInfoD3b',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Nikon::ShotInfoD3b',
+                DecryptStart => 4,
+                DecryptLen => 0x321,
+                ByteOrder => 'BigEndian',
+            },
+        },
+        { #PH (D3X, firmware 1.00)
+            Condition => '$$valPt =~ /^0214/ and $count == 5409',
+            Name => 'ShotInfoD3X',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Nikon::ShotInfoD3X',
+                DecryptStart => 4,
+                DecryptLen => 0x323,
+                ByteOrder => 'BigEndian',
+            },
+        },
+        { #PH (D3S, firmware 0.16 and 1.00)
+            Condition => '$$valPt =~ /^0218/ and ($count == 5356 or $count == 5388)',
+            Name => 'ShotInfoD3S',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Nikon::ShotInfoD3S',
+                DecryptStart => 4,
+                DecryptLen => 0x2e6,
+                ByteOrder => 'BigEndian',
+            },
+        },
+        { #JD (D300, firmware 0.25 and 1.00)
+            # D3 and D300 use the same version number, but the length is different
+            Condition => '$$valPt =~ /^0210/ and $count == 5291',
+            Name => 'ShotInfoD300a',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Nikon::ShotInfoD300a',
+                DecryptStart => 4,
+                DecryptLen => 813,
+                ByteOrder => 'BigEndian',
+            },
+        },
+        { #PH (D300, firmware version 1.10)
+            # yet again the same ShotInfoVersion for different data
+            Condition => '$$valPt =~ /^0210/ and $count == 5303',
+            Name => 'ShotInfoD300b',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Nikon::ShotInfoD300b',
+                DecryptStart => 4,
+                DecryptLen => 825,
+                ByteOrder => 'BigEndian',
+            },
+        },
+        { #PH (D300S, firmware version 1.00)
+            # yet again the same ShotInfoVersion for different data
+            Condition => '$$valPt =~ /^0216/ and $count == 5311',
+            Name => 'ShotInfoD300S',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Nikon::ShotInfoD300S',
+                DecryptStart => 4,
+                DecryptLen => 827,
+                ByteOrder => 'BigEndian',
+            },
+        },
+        { #29 (D700 firmware version 1.02f)
+            Condition => '$$valPt =~ /^0212/ and $count == 5312',
+            Name => 'ShotInfoD700',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Nikon::ShotInfoD700',
+                ProcessProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+                WriteProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+                DecryptStart => 4,
+                DecryptLen => 0x358,
+                ByteOrder => 'BigEndian',
+            },
+        },
+        { #PH
+            Condition => '$$valPt =~ /^0215/ and $count == 6745',
+            Name => 'ShotInfoD5000',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Nikon::ShotInfoD5000',
+                DecryptStart => 4,
+                DecryptLen => 0x39a,
+                ByteOrder => 'BigEndian',
+            },
+        },
+        { #29 (D7000 firmware version 1.01b)
+            Condition => '$$valPt =~ /^0220/',
+            Name => 'ShotInfoD7000',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Nikon::ShotInfoD7000',
+                ProcessProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+                WriteProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+                DecryptStart => 4,
+                DecryptLen => 0x448,
+                ByteOrder => 'BigEndian',
+            },
+        },
+        {
+            Condition => '$$valPt =~ /^02/',
+            Name => 'ShotInfo02xx',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Nikon::ShotInfo',
+                ProcessProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+                WriteProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+                DecryptStart => 4,
+                DecryptLen => 0x251,
+                ByteOrder => 'BigEndian',
+            },
+        },
+        {
+            Name => 'ShotInfoUnknown',
+            Writable => 0,
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Nikon::ShotInfo',
+                ByteOrder => 'BigEndian',
+            },
+        },
+    ],
+    0x0092 => { #2
+        Name => 'HueAdjustment',
+        Writable => 'int16s',
+    },
+    # 0x0093 - ref 15 calls this Saturation, but this is wrong - PH
+    0x0093 => { #21
+        Name => 'NEFCompression',
+        Writable => 'int16u',
+        PrintConv => {
+            1 => 'Lossy (type 1)', # (older models)
+            2 => 'Uncompressed', #JD - D100 (even though TIFF compression is set!)
+            3 => 'Lossless',
+            4 => 'Lossy (type 2)',
+        },
+    },
+    0x0094 => { Name => 'Saturation',       Writable => 'int16s' },
+    0x0095 => { Name => 'NoiseReduction',   Writable => 'string' },
+    0x0096 => {
+        Name => 'LinearizationTable', # same table as DNG LinearizationTable (ref JD)
+        Writable => 0,
+        Binary => 1,
+    },
+    0x0097 => [ #4
+        # (NOTE: these are byte-swapped by NX when byte order changes)
+        {
+            Condition => '$$valPt =~ /^0100/', # (D100)
+            Name => 'ColorBalance0100',
+            SubDirectory => {
+                Start => '$valuePtr + 72',
+                TagTable => 'Image::ExifTool::Nikon::ColorBalance1',
+            },
+        },
+        {
+            Condition => '$$valPt =~ /^0102/', # (D2H)
+            Name => 'ColorBalance0102',
+            SubDirectory => {
+                Start => '$valuePtr + 10',
+                TagTable => 'Image::ExifTool::Nikon::ColorBalance2',
+            },
+        },
+        {
+            Condition => '$$valPt =~ /^0103/', # (D70)
+            Name => 'ColorBalance0103',
+            # D70:  at file offset 'tag-value + base + 20', 4 16 bits numbers,
+            # v[0]/v[1] , v[2]/v[3] are the red/blue multipliers.
+            SubDirectory => {
+                Start => '$valuePtr + 20',
+                TagTable => 'Image::ExifTool::Nikon::ColorBalance3',
+            },
+        },
+        {
+            Condition => '$$valPt =~ /^0205/', # (D50)
+            Name => 'ColorBalance0205',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Nikon::ColorBalance2',
+                ProcessProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+                WriteProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+                DecryptStart => 4,
+                DecryptLen => 22, # 284 bytes encrypted, but don't need to decrypt it all
+                DirOffset => 14,
+            },
+        },
+        {
+            Condition => '$$valPt =~ /^0209/', # (D3)
+            Name => 'ColorBalance0209',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Nikon::ColorBalance4',
+                ProcessProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+                WriteProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+                DecryptStart => 284,
+                DecryptLen => 18, # don't need to decrypt it all
+                DirOffset => 10,
+            },
+        },
+        {   # (D2X=0204,D2Hs=0206,D200=0207,D40=0208)
+            Condition => '$$valPt =~ /^02(\d{2})/ and $1 < 11',
+            Name => 'ColorBalance02',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Nikon::ColorBalance2',
+                ProcessProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+                WriteProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+                DecryptStart => 284,
+                DecryptLen => 14, # 324 bytes encrypted, but don't need to decrypt it all
+                DirOffset => 6,
+            },
+        },
+        {   # (D90/D5000=0211,D300S=0212,D3000=0213,D3S=0214,D3100=0215,D7000/D5100=0216)
+            Name => 'ColorBalanceUnknown',
+            Writable => 0,
+        },
+    ],
+    0x0098 => [
+        { #8
+            Condition => '$$valPt =~ /^0100/', # D100, D1X - PH
+            Name => 'LensData0100',
+            SubDirectory => { TagTable => 'Image::ExifTool::Nikon::LensData00' },
+        },
+        { #8
+            Condition => '$$valPt =~ /^0101/', # D70, D70s - PH
+            Name => 'LensData0101',
+            SubDirectory => { TagTable => 'Image::ExifTool::Nikon::LensData01' },
+        },
+        # note: this information is encrypted if the version is 02xx
+        { #8
+            # 0201 - D200, D2Hs, D2X and D2Xs
+            # 0202 - D40, D40X and D80
+            # 0203 - D300
+            Condition => '$$valPt =~ /^020[1-3]/',
+            Name => 'LensData0201',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Nikon::LensData01',
+                ProcessProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+                WriteProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+                DecryptStart => 4,
+            },
+        },
+        { #PH
+            Condition => '$$valPt =~ /^0204/', # D90, D7000
+            Name => 'LensData0204',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Nikon::LensData0204',
+                ProcessProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+                WriteProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+                DecryptStart => 4,
+            },
+        },
+        {
+            Name => 'LensDataUnknown',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Nikon::LensDataUnknown',
+            },
+        },
+    ],
+    0x0099 => { #2/15
+        Name => 'RawImageCenter',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x009a => { #10
+        Name => 'SensorPixelSize',
+        Writable => 'rational64u',
+        Count => 2,
+        PrintConv => '$val=~s/ / x /;"$val um"',
+        PrintConvInv => '$val=~tr/a-zA-Z/ /;$val',
+    },
+    0x009c => { #14
+        # L2/L3 has these modes (from owner's manual): - PH
+        # Portrait Assist: FACE-PRIORITY AF,PORTRAIT,PORTRAIT LEFT,PORTRAIT RIGHT,
+        #                  PORTRAIT CLOSE-UP,PORTRAIT COUPLE,PORTRAIT-FIGURE
+        # Landscape Assist:LANDSCAPE,SCENIC VIEW,ARCHITECTURE,GROUP RIGHT,GROUP LEFT
+        # Sports Assist:   SPORTS,SPORT SPECTATOR,SPORT COMPOSITE
+        Name => 'SceneAssist',
+        Writable => 'string',
+    },
+    0x009e => { #JD
+        Name => 'RetouchHistory',
+        Writable => 'int16u',
+        Count => 10,
+        # trim off extra "None" values
+        ValueConv => '$val=~s/( 0)+$//; $val',
+        ValueConvInv => 'my $n=($val=~/ \d+/g);$n < 9 ? $val . " 0" x (9-$n) : $val',
+        PrintConvColumns => 2,
+        PrintConv => [
+            \%retouchValues,
+            \%retouchValues,
+            \%retouchValues,
+            \%retouchValues,
+            \%retouchValues,
+            \%retouchValues,
+            \%retouchValues,
+            \%retouchValues,
+            \%retouchValues,
+            \%retouchValues,
+        ],
+    },
+    0x00a0 => { Name => 'SerialNumber',     Writable => 'string' }, #2
+    0x00a2 => { # size of compressed image data plus EOI segment (ref 10)
+        Name => 'ImageDataSize',
+        Writable => 'int32u',
+    },
+    # 0x00a3 - int8u: 0 (All DSLR's but D1,D1H,D1X,D100)
+    # 0x00a4 - version number found only in NEF images from DSLR models except the
+    # D1,D1X,D2H and D100.  Value is "0200" for all available samples except images
+    # edited by Nikon Capture Editor 4.3.1 W and 4.4.2 which have "0100" - PH
+    0x00a5 => { #15
+        Name => 'ImageCount',
+        Writable => 'int32u',
+    },
+    0x00a6 => { #15
+        Name => 'DeletedImageCount',
+        Writable => 'int32u',
+    },
+    # the sum of 0xa5 and 0xa6 is equal to 0xa7 ShutterCount (D2X,D2Hs,D2H,D200, ref 10)
+    0x00a7 => { # Number of shots taken by camera so far (ref 2)
+        Name => 'ShutterCount',
+        Writable => 'int32u',
+        Protected => 1,
+        Notes => q{
+            this value is used as a key to decrypt other information -- writing this tag
+            causes the other information to be re-encrypted with the new key
+        },
+    },
+    0x00a8 => [#JD
+        {
+            Name => 'FlashInfo0100',
+            Condition => '$$valPt =~ /^010[01]/',
+            SubDirectory => { TagTable => 'Image::ExifTool::Nikon::FlashInfo0100' },
+        },
+        {
+            Name => 'FlashInfo0102',
+            Condition => '$$valPt =~ /^0102/',
+            SubDirectory => { TagTable => 'Image::ExifTool::Nikon::FlashInfo0102' },
+        },
+        {
+            Name => 'FlashInfo0103',
+            Condition => '$$valPt =~ /^0103/',
+            SubDirectory => { TagTable => 'Image::ExifTool::Nikon::FlashInfo0103' },
+        },
+        { #29 (D7000, NC)
+            Name => 'FlashInfo0104',
+            Condition => '$$valPt =~ /^0104/',
+            SubDirectory => { TagTable => 'Image::ExifTool::Nikon::FlashInfo0103' },
+        },
+        {
+            Name => 'FlashInfoUnknown',
+            SubDirectory => { TagTable => 'Image::ExifTool::Nikon::FlashInfoUnknown' },
+        },
+    ],
+    0x00a9 => { Name => 'ImageOptimization',Writable => 'string' },#2
+    0x00aa => { Name => 'Saturation',       Writable => 'string' }, #2
+    0x00ab => { Name => 'VariProgram',      Writable => 'string' }, #2 (scene mode for DSLR's - PH)
+    0x00ac => { Name => 'ImageStabilization',Writable=> 'string' }, #14
+    0x00ad => { Name => 'AFResponse',       Writable => 'string' }, #14
+    0x00b0 => { #PH
+        Name => 'MultiExposure',
+        Condition => '$$valPt =~ /^0100/',
+        SubDirectory => { TagTable => 'Image::ExifTool::Nikon::MultiExposure' },
+    },
+    0x00b1 => { #14/PH/JD (D80)
+        Name => 'HighISONoiseReduction',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Minimal', # for high ISO (>800) when setting is "Off"
+            2 => 'Low',     # Low,Normal,High take effect for ISO > 400
+            4 => 'Normal',
+            6 => 'High',
+        },
+    },
+    # 0x00b2 (string: 'Normal', 0xc3's, 0xff's or 0x20's)
+    0x00b3 => { #14
+        Name => 'ToningEffect',
+        Writable => 'string',
+    },
+    0x00b6 => { #PH
+        Name => 'PowerUpTime',
+        Groups => { 2 => 'Time' },
+        Shift => 'Time',
+        # not clear whether "powered up" means "turned on" or "power applied" - PH
+        Notes => 'date/time when camera was last powered up',
+        Writable => 'undef',
+        # must use RawConv so byte order is correct
+        RawConv => sub {
+            my $val = shift;
+            return $val if length $val < 7;
+            my $shrt = GetByteOrder() eq 'II' ? 'v' : 'n';
+            my @date = unpack("${shrt}C5", $val);
+            return sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d', @date);
+        },
+        RawConvInv => sub {
+            my $val = shift;
+            my $shrt = GetByteOrder() eq 'II' ? 'v' : 'n';
+            my @date = ($val =~ /\d+/g);
+            return pack("${shrt}C6", @date, 0);
+        },
+        PrintConv => '$self->ConvertDateTime($val)',
+        PrintConvInv => '$self->InverseDateTime($val,0)',
+    },
+    0x00b7 => { #JD
+        Name => 'AFInfo2',
+        SubDirectory => { TagTable => 'Image::ExifTool::Nikon::AFInfo2' },
+    },
+    0x00b8 => { #PH
+        Name => 'FileInfo',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Nikon::FileInfo',
+            ByteOrder => 'BigEndian',
+        },
+    },
+    0x00b9 => { #28
+        Name => 'AFTune',
+        SubDirectory => { TagTable => 'Image::ExifTool::Nikon::AFTune' },
+    },
+    # 0x00ba - custom curve data? (ref 28?) (only in NEF images)
+    0x00bd => { #PH (P6000)
+        Name => 'PictureControlData',
+        Writable => 'undef',
+        Permanent => 0,
+        Binary => 1,
+        SubDirectory => { TagTable => 'Image::ExifTool::Nikon::PictureControl' },
+    },
+    0x0e00 => {
+        Name => 'PrintIM',
+        Description => 'Print Image Matching',
+        Writable => 0,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::PrintIM::Main',
+        },
+    },
+    # 0x0e01 - In D70 NEF files produced by Nikon Capture, the data for this tag extends 4 bytes
+    # past the end of the maker notes.  Very odd.  I hope these 4 bytes aren't useful because
+    # they will get lost by any utility that blindly copies the maker notes (not ExifTool) - PH
+    0x0e01 => {
+        Name => 'NikonCaptureData',
+        Writable => 'undef',
+        Permanent => 0,
+        Drop => 1, # (may be too large for JPEG images)
+        Binary => 1,
+        Notes => q{
+            this data is dropped when copying Nikon MakerNotes since it may be too large
+            to fit in the EXIF segment of a JPEG image, but it may be copied as a block
+            into existing Nikon MakerNotes later if desired
+        },
+        SubDirectory => {
+            DirName => 'NikonCapture',
+            TagTable => 'Image::ExifTool::NikonCapture::Main',
+        },
+    },
+    # 0x0e05 written by Nikon Capture to NEF files, values of 1 and 2 - PH
+    0x0e09 => { #12
+        Name => 'NikonCaptureVersion',
+        Writable => 'string',
+        PrintConv => undef,
+    },
+    # 0x0e0e is in D70 Nikon Capture files (not out-of-the-camera D70 files) - PH
+    0x0e0e => { #PH
+        Name => 'NikonCaptureOffsets',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Nikon::CaptureOffsets',
+            Validate => '$val =~ /^0100/',
+            Start => '$valuePtr + 4',
+        },
+    },
+    0x0e10 => { #17
+        Name => 'NikonScanIFD',
+        Groups => { 1 => 'NikonScan', 2 => 'Image' },
+        Flags => 'SubIFD',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Nikon::Scan',
+            Start => '$val',
+        },
+    },
+    0x0e13 => [{ # PH/http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,2737.0.html
+        Name => 'NikonCaptureEditVersions',
+        Condition => '$self->Options("ExtractEmbedded")',
+        Notes => q{
+            the ExtractEmbedded option may be used to decode settings from the stored
+            edit versions, otherwise this is extracted as a binary data block
+        },
+        Writable => 'undef',
+        Permanent => 0,
+        Drop => 1, # (may be too large for JPEG images)
+        SubDirectory => {
+            DirName => 'NikonCaptureEditVersions',
+            TagTable => 'Image::ExifTool::NikonCapture::Main',
+            ProcessProc => \&ProcessNikonCaptureEditVersions,
+            WriteProc => sub { return undef }, # (writing not yet supported)
+        },
+    },{
+        Name => 'NikonCaptureEditVersions',
+        Writable => 'undef',
+        Permanent => 0,
+        Binary => 1,
+        Drop => 1,
+    }],
+    0x0e1d => { #JD
+        Name => 'NikonICCProfile',
+        Binary => 1,
+        Protected => 1,
+        Writable => 'undef', # must be defined here so tag will be extracted if specified
+        WriteCheck => q{
+            require Image::ExifTool::ICC_Profile;
+            return Image::ExifTool::ICC_Profile::ValidateICC(\$val);
+        },
+        SubDirectory => {
+            DirName => 'NikonICCProfile',
+            TagTable => 'Image::ExifTool::ICC_Profile::Main',
+        },
+    },
+    0x0e1e => { #PH
+        Name => 'NikonCaptureOutput',
+        Writable => 'undef',
+        Permanent => 0,
+        Binary => 1,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Nikon::CaptureOutput',
+            Validate => '$val =~ /^0100/',
+        },
+    },
+    0x0e22 => { #28
+        Name => 'NEFBitDepth',
+        Writable => 'int16u',
+        Count => 4,
+        Protected => 1,
+        PrintConv => {
+            '0 0 0 0' => 'n/a (JPEG)',
+            '8 8 8 0' => '8 x 3', # TIFF RGB
+            '12 0 0 0' => 12,
+            '14 0 0 0' => 14,
+        },
+    },
+);
+
+# NikonScan IFD entries (ref 17)
+%Image::ExifTool::Nikon::Scan = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    WRITE_GROUP => 'NikonScan',
+    WRITABLE => 1,
+    GROUPS => { 0 => 'MakerNotes', 1 => 'NikonScan', 2 => 'Image' },
+    VARS => { MINOR_ERRORS => 1 }, # this IFD is non-essential and often corrupted
+    NOTES => 'This information is written by the Nikon Scan software.',
+    0x02 => { Name => 'FilmType',    Writable => 'string', },
+    0x40 => { Name => 'MultiSample', Writable => 'string' },
+    0x41 => { Name => 'BitDepth',    Writable => 'int16u' },
+    0x50 => {
+        Name => 'MasterGain',
+        Writable => 'rational64s',
+        PrintConv => 'sprintf("%.2f",$val)',
+        PrintConvInv => '$val',
+    },
+    0x51 => {
+        Name => 'ColorGain',
+        Writable => 'rational64s',
+        Count => 3,
+        PrintConv => 'sprintf("%.2f %.2f %.2f",split(" ",$val))',
+        PrintConvInv => '$val',
+    },
+    0x60 => {
+        Name => 'ScanImageEnhancer',
+        Writable => 'int32u',
+        PrintConv => \%offOn,
+    },
+    0x100 => { Name => 'DigitalICE', Writable => 'string' },
+    0x110 => {
+        Name => 'ROCInfo',
+        SubDirectory => { TagTable => 'Image::ExifTool::Nikon::ROC' },
+    },
+    0x120 => {
+        Name => 'GEMInfo',
+        SubDirectory => { TagTable => 'Image::ExifTool::Nikon::GEM' },
+    },
+    0x200 => { Name => 'DigitalDEEShadowAdj',   Writable => 'int32u' },
+    0x201 => { Name => 'DigitalDEEThreshold',   Writable => 'int32u' },
+    0x202 => { Name => 'DigitalDEEHighlightAdj',Writable => 'int32u' },
+);
+
+# ref 17
+%Image::ExifTool::Nikon::ROC = (
+    %binaryDataAttrs,
+    FORMAT => 'int32u',
+    GROUPS => { 0 => 'MakerNotes', 1 => 'NikonScan', 2 => 'Image' },
+    0 => {
+        Name => 'DigitalROC',
+        ValueConv => '$val / 10',
+        ValueConvInv => 'int($val * 10)',
+    },
+);
+
+# ref 17
+%Image::ExifTool::Nikon::GEM = (
+    %binaryDataAttrs,
+    FORMAT => 'int32u',
+    GROUPS => { 0 => 'MakerNotes', 1 => 'NikonScan', 2 => 'Image' },
+    0 => {
+        Name => 'DigitalGEM',
+        ValueConv => '$val<95 ? $val/20-1 : 4',
+        ValueConvInv => '$val == 4 ? 95 : int(($val + 1) * 20)',
+    },
+);
+
+# Vibration Reduction information - PH (D300)
+%Image::ExifTool::Nikon::VRInfo = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added
+    0 => {
+        Name => 'VRInfoVersion',
+        Format => 'undef[4]',
+        Writable => 0,
+    },
+    4 => {
+        Name => 'VibrationReduction',
+        PrintConv => {
+            1 => 'On',
+            2 => 'Off',
+        },
+    },
+    # 5 - values: 0, 1, 2
+    # 6 and 7 - values: 0
+);
+
+# Face detection information - PH (S8100)
+%Image::ExifTool::Nikon::FaceDetect = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    FORMAT => 'int16u',
+    DATAMEMBER => [ 0x03 ],
+    0x01 => {
+        Name => 'FaceDetectFrameSize',
+        Format => 'int16u[2]',
+    },
+    0x03 => {
+        Name => 'FacesDetected',
+        DataMember => 'FacesDetected',
+        RawConv => '$$self{FacesDetected} = $val',
+    },
+    0x04 => {
+        Name => 'Face1Position',
+        Format => 'int16u[4]',
+        RawConv => '$$self{FacesDetected} < 1 ? undef : $val',
+        Notes => q{
+            top, left, width and height of face detect area in coordinates of
+            FaceDetectFrameSize
+        },
+    },
+    0x08 => {
+        Name => 'Face2Position',
+        Format => 'int16u[4]',
+        RawConv => '$$self{FacesDetected} < 2 ? undef : $val',
+    },
+    0x0c => {
+        Name => 'Face3Position',
+        Format => 'int16u[4]',
+        RawConv => '$$self{FacesDetected} < 3 ? undef : $val',
+    },
+    0x10 => {
+        Name => 'Face4Position',
+        Format => 'int16u[4]',
+        RawConv => '$$self{FacesDetected} < 4 ? undef : $val',
+    },
+    0x14 => {
+        Name => 'Face5Position',
+        Format => 'int16u[4]',
+        RawConv => '$$self{FacesDetected} < 5 ? undef : $val',
+    },
+    0x18 => {
+        Name => 'Face6Position',
+        Format => 'int16u[4]',
+        RawConv => '$$self{FacesDetected} < 6 ? undef : $val',
+    },
+    0x1c => {
+        Name => 'Face7Position',
+        Format => 'int16u[4]',
+        RawConv => '$$self{FacesDetected} < 7 ? undef : $val',
+    },
+    0x20 => {
+        Name => 'Face8Position',
+        Format => 'int16u[4]',
+        RawConv => '$$self{FacesDetected} < 8 ? undef : $val',
+    },
+    0x24 => {
+        Name => 'Face9Position',
+        Format => 'int16u[4]',
+        RawConv => '$$self{FacesDetected} < 9 ? undef : $val',
+    },
+    0x28 => {
+        Name => 'Face10Position',
+        Format => 'int16u[4]',
+        RawConv => '$$self{FacesDetected} < 10 ? undef : $val',
+    },
+    0x2c => {
+        Name => 'Face11Position',
+        Format => 'int16u[4]',
+        RawConv => '$$self{FacesDetected} < 11 ? undef : $val',
+    },
+    0x30 => {
+        Name => 'Face12Position',
+        Format => 'int16u[4]',
+        RawConv => '$$self{FacesDetected} < 12 ? undef : $val',
+    },
+);
+
+# Picture Control information - PH (D300,P6000)
+%Image::ExifTool::Nikon::PictureControl = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added
+    0 => {
+        Name => 'PictureControlVersion',
+        Format => 'undef[4]',
+        Writable => 0,
+    },
+    4 => {
+        Name => 'PictureControlName',
+        Format => 'string[20]',
+        # make lower case with a leading capital for each word
+        PrintConv => \&FormatString,
+        PrintConvInv => 'uc($val)',
+    },
+    24 => {
+        Name => 'PictureControlBase',
+        Format => 'string[20]',
+        PrintConv => \&FormatString,
+        PrintConvInv => 'uc($val)',
+    },
+    # beginning at byte 44, there is some interesting information.
+    # here are the observed bytes for each PictureControlMode:
+    #            44 45 46 47 48 49 50 51 52 53 54 55 56 57
+    # STANDARD   00 01 00 00 00 80 83 80 80 80 80 ff ff ff
+    # NEUTRAL    03 c2 00 00 00 ff 82 80 80 80 80 ff ff ff
+    # VIVID      00 c3 00 00 00 80 84 80 80 80 80 ff ff ff
+    # MONOCHROME 06 4d 00 01 02 ff 82 80 80 ff ff 80 80 ff
+    # Neutral2   03 c2 01 00 02 ff 80 7f 81 00 7f ff ff ff (custom)
+    # (note that up to 9 different custom picture controls can be stored)
+    #
+    48 => { #21
+        Name => 'PictureControlAdjust',
+        PrintConv => {
+            0 => 'Default Settings',
+            1 => 'Quick Adjust',
+            2 => 'Full Control',
+        },
+    },
+    49 => {
+        Name => 'PictureControlQuickAdjust',
+        # settings: -2 to +2 (n/a for Neutral and Monochrome modes)
+        DelValue => 0xff,
+        ValueConv => '$val - 0x80',
+        ValueConvInv => '$val + 0x80',
+        PrintConv => 'Image::ExifTool::Nikon::PrintPC($val)',
+        PrintConvInv => 'Image::ExifTool::Nikon::PrintPCInv($val)',
+    },
+    50 => {
+        Name => 'Sharpness',
+        # settings: 0 to 9, Auto
+        ValueConv => '$val - 0x80',
+        ValueConvInv => '$val + 0x80',
+        PrintConv => 'Image::ExifTool::Nikon::PrintPC($val,"No Sharpening","%d")',
+        PrintConvInv => 'Image::ExifTool::Nikon::PrintPCInv($val)',
+    },
+    51 => {
+        Name => 'Contrast',
+        # settings: -3 to +3, Auto
+        ValueConv => '$val - 0x80',
+        ValueConvInv => '$val + 0x80',
+        PrintConv => 'Image::ExifTool::Nikon::PrintPC($val)',
+        PrintConvInv => 'Image::ExifTool::Nikon::PrintPCInv($val)',
+    },
+    52 => {
+        Name => 'Brightness',
+        # settings: -1 to +1
+        ValueConv => '$val - 0x80',
+        ValueConvInv => '$val + 0x80',
+        PrintConv => 'Image::ExifTool::Nikon::PrintPC($val)',
+        PrintConvInv => 'Image::ExifTool::Nikon::PrintPCInv($val)',
+    },
+    53 => {
+        Name => 'Saturation',
+        # settings: -3 to +3, Auto (n/a for Monochrome mode)
+        DelValue => 0xff,
+        ValueConv => '$val - 0x80',
+        ValueConvInv => '$val + 0x80',
+        PrintConv => 'Image::ExifTool::Nikon::PrintPC($val)',
+        PrintConvInv => 'Image::ExifTool::Nikon::PrintPCInv($val)',
+    },
+    54 => {
+        Name => 'HueAdjustment',
+        # settings: -3 to +3 (n/a for Monochrome mode)
+        DelValue => 0xff,
+        ValueConv => '$val - 0x80',
+        ValueConvInv => '$val + 0x80',
+        PrintConv => 'Image::ExifTool::Nikon::PrintPC($val,"None")',
+        PrintConvInv => 'Image::ExifTool::Nikon::PrintPCInv($val)',
+    },
+    55 => {
+        Name => 'FilterEffect',
+        # settings: Off,Yellow,Orange,Red,Green (n/a for color modes)
+        DelValue => 0xff,
+        PrintHex => 1,
+        PrintConv => {
+            0x80 => 'Off',
+            0x81 => 'Yellow',
+            0x82 => 'Orange',
+            0x83 => 'Red',
+            0x84 => 'Green',
+            0xff => 'n/a',
+        },
+    },
+    56 => {
+        Name => 'ToningEffect',
+        # settings: B&W,Sepia,Cyanotype,Red,Yellow,Green,Blue-Green,Blue,
+        #           Purple-Blue,Red-Purple (n/a for color modes)
+        DelValue => 0xff,
+        PrintHex => 1,
+        PrintConvColumns => 2,
+        PrintConv => {
+            0x80 => 'B&W',
+            0x81 => 'Sepia',
+            0x82 => 'Cyanotype',
+            0x83 => 'Red',
+            0x84 => 'Yellow',
+            0x85 => 'Green',
+            0x86 => 'Blue-green',
+            0x87 => 'Blue',
+            0x88 => 'Purple-blue',
+            0x89 => 'Red-purple',
+            0xff => 'n/a',
+        },
+    },
+    57 => { #21
+        Name => 'ToningSaturation',
+        # settings: B&W,Sepia,Cyanotype,Red,Yellow,Green,Blue-Green,Blue,
+        #           Purple-Blue,Red-Purple (n/a unless ToningEffect is used)
+        DelValue => 0xff,
+        ValueConv => '$val - 0x80',
+        ValueConvInv => '$val + 0x80',
+        PrintConv => '$val==0x7f ? "n/a" : $val',
+        PrintConvInv => 'Image::ExifTool::Nikon::PrintPCInv($val)',
+    },
+);
+
+# World Time information - JD (D300)
+%Image::ExifTool::Nikon::WorldTime = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Time' },
+    0 => {
+        Name => 'Timezone',
+        Format => 'int16s',
+        PrintConv => q{
+            my $sign = $val < 0 ? '-' : '+';
+            my $h = int(abs($val) / 60);
+            sprintf("%s%.2d:%.2d", $sign, $h, abs($val)-60*$h);
+        },
+        PrintConvInv => q{
+            $val =~ /([-+]?)(\d+):(\d+)/ or return undef;
+            return $1 . ($2 * 60 + $3);
+        },
+    },
+    2 => {
+        Name => 'DaylightSavings',
+        PrintConv => { 0 => 'No', 1 => 'Yes' },
+    },
+    3 => {
+        Name => 'DateDisplayFormat',
+        PrintConv => {
+            0 => 'Y/M/D',
+            1 => 'M/D/Y',
+            2 => 'D/M/Y',
+        },
+    },
+);
+
+# ISO information - PH (D300)
+%Image::ExifTool::Nikon::ISOInfo = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0 => {
+        Name => 'ISO',
+        Notes => 'val = 100 * 2**(raw/12-5)',
+        Priority => 0, # because people like to see rounded-off values if they exist
+        ValueConv => '100*exp(($val/12-5)*log(2))',
+        ValueConvInv => '(log($val/100)/log(2)+5)*12',
+        PrintConv => 'int($val + 0.5)',
+        PrintConvInv => '$val',
+    },
+    # 1 - 0x01
+    # 2 - 0x0c (probably the ISO divisor above)
+    # 3 - 0x00
+    4 => {
+        Name => 'ISOExpansion',
+        Format => 'int16u',
+        PrintHex => 1,
+        PrintConvColumns => 2,
+        PrintConv => {
+            0x000 => 'Off',
+            0x101 => 'Hi 0.3',
+            0x102 => 'Hi 0.5',
+            0x103 => 'Hi 0.7',
+            0x104 => 'Hi 1.0',
+            0x105 => 'Hi 1.3', # (Hi 1.3-1.7 may be possible with future models)
+            0x106 => 'Hi 1.5',
+            0x107 => 'Hi 1.7',
+            0x108 => 'Hi 2.0', #(NC) - D3 should have this mode
+            0x201 => 'Lo 0.3',
+            0x202 => 'Lo 0.5',
+            0x203 => 'Lo 0.7',
+            0x204 => 'Lo 1.0',
+        },
+    },
+    # bytes 6-11 same as 0-4 in my samples (why is this duplicated?)
+    6 => {
+        Name => 'ISO2',
+        Notes => 'val = 100 * 2**(raw/12-5)',
+        ValueConv => '100*exp(($val/12-5)*log(2))',
+        ValueConvInv => '(log($val/100)/log(2)+5)*12',
+        PrintConv => 'int($val + 0.5)',
+        PrintConvInv => '$val',
+    },
+    # 7 - 0x01
+    # 8 - 0x0c (probably the ISO divisor above)
+    # 9 - 0x00
+    10 => {
+        Name => 'ISOExpansion2',
+        Format => 'int16u',
+        PrintHex => 1,
+        PrintConvColumns => 2,
+        PrintConv => {
+            0x000 => 'Off',
+            0x101 => 'Hi 0.3',
+            0x102 => 'Hi 0.5',
+            0x103 => 'Hi 0.7',
+            0x104 => 'Hi 1.0',
+            0x105 => 'Hi 1.3', # (Hi 1.3-1.7 may be possible with future models)
+            0x106 => 'Hi 1.5',
+            0x107 => 'Hi 1.7',
+            0x108 => 'Hi 2.0', #(NC) - D3 should have this mode
+            0x201 => 'Lo 0.3',
+            0x202 => 'Lo 0.5',
+            0x203 => 'Lo 0.7',
+            0x204 => 'Lo 1.0',
+        },
+    },
+    # bytes 12-13: 00 00
+);
+
+# distortion information - PH (D5000)
+%Image::ExifTool::Nikon::DistortInfo = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0 => {
+        Name => 'DistortionVersion',
+        Format => 'undef[4]',
+        Writable => 0,
+        Unknown => 1,
+    },
+    4 => {
+        Name => 'AutoDistortionControl',
+        PrintConv => \%offOn,
+    },
+);
+
+# unknown information - PH (D7000)
+%Image::ExifTool::Nikon::UnknownInfo = (
+    %binaryDataAttrs,
+    FORMAT => 'int32u',
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0 => {
+        Name => 'UnknownInfoVersion',
+        Condition => '$$valPt =~ /^\d{4}/',
+        Format => 'undef[4]',
+        Writable => 0,
+        Unknown => 1,
+    },
+);
+
+# more unknown information - PH (D7000)
+%Image::ExifTool::Nikon::UnknownInfo2 = (
+    %binaryDataAttrs,
+    FORMAT => 'int32u',
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0 => {
+        Name => 'UnknownInfo2Version',
+        Condition => '$$valPt =~ /^\d{4}/',
+        Format => 'undef[4]',
+        Writable => 0,
+        Unknown => 1,
+    },
+);
+
+# Nikon AF information (ref 13)
+%Image::ExifTool::Nikon::AFInfo = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0 => {
+        Name => 'AFAreaMode',
+        PrintConv => {
+            0 => 'Single Area',
+            1 => 'Dynamic Area',
+            2 => 'Dynamic Area (closest subject)',
+            3 => 'Group Dynamic',
+            4 => 'Single Area (wide)',
+            5 => 'Dynamic Area (wide)',
+        },
+    },
+    1 => {
+        Name => 'AFPoint',
+        Notes => 'in some focus modes this value is not meaningful',
+        PrintConvColumns => 2,
+        PrintConv => {
+            0 => 'Center',
+            1 => 'Top',
+            2 => 'Bottom',
+            3 => 'Mid-left',
+            4 => 'Mid-right',
+            5 => 'Upper-left',
+            6 => 'Upper-right',
+            7 => 'Lower-left',
+            8 => 'Lower-right',
+            9 => 'Far Left',
+            10 => 'Far Right',
+        },
+    },
+    2 => {
+        Name => 'AFPointsInFocus',
+        Format => 'int16u',
+        PrintConvColumns => 2,
+        PrintConv => {
+            0x7ff => 'All 11 Points',
+            BITMASK => {
+                0 => 'Center',
+                1 => 'Top',
+                2 => 'Bottom',
+                3 => 'Mid-left',
+                4 => 'Mid-right',
+                5 => 'Upper-left',
+                6 => 'Upper-right',
+                7 => 'Lower-left',
+                8 => 'Lower-right',
+                9 => 'Far Left',
+                10 => 'Far Right',
+            },
+        },
+    },
+);
+
+# Nikon AF information for D3 and D300 (ref JD)
+%Image::ExifTool::Nikon::AFInfo2 = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    DATAMEMBER => [ 4, 6 ],
+    NOTES => "These tags are written by Nikon DSLR's which have the live view feature.",
+    # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added
+    0 => {
+        Name => 'AFInfo2Version',
+        Format => 'undef[4]',
+        Writable => 0,
+    },
+    4 => { #PH
+        Name => 'ContrastDetectAF',
+        RawConv => '$$self{ContrastDetectAF} = $val',
+        PrintConv => \%offOn,
+    },
+    5 => [
+        {
+            Name => 'AFAreaMode',
+            Condition => 'not $$self{ContrastDetectAF}',
+            Notes => 'ContrastDetectAF Off',
+            PrintConv => {
+                0 => 'Single Area', # (called "Single Point" in manual - PH)
+                1 => 'Dynamic Area', #PH
+                2 => 'Dynamic Area (closest subject)', #PH
+                3 => 'Group Dynamic', #PH
+                4 => 'Dynamic Area (9 points)', #JD/28
+                5 => 'Dynamic Area (21 points)', #28
+                6 => 'Dynamic Area (51 points)', #28
+                7 => 'Dynamic Area (51 points, 3D-tracking)', #PH/28
+                8 => 'Auto-area',
+                9 => 'Dynamic Area (3D-tracking)', #PH (D5000 "3D-tracking (11 points)")
+                10 => 'Single Area (wide)', #PH
+                11 => 'Dynamic Area (wide)', #PH
+                12 => 'Dynamic Area (wide, 3D-tracking)', #PH
+            },
+        },
+        { #PH (D3/D90/D5000)
+            Name => 'AFAreaMode',
+            Notes => 'ContrastDetectAF On',
+            PrintConv => {
+                0 => 'Contrast-detect', # (D3)
+                1 => 'Contrast-detect (normal area)', # (D90/D5000)
+                # (D90 and D5000 give value of 2 when set to 'Face Priority' and
+                # 'Subject Tracking', but I didn't have a face to shoot at or a
+                #  moving subject to track so perhaps this value changes dynamically)
+                2 => 'Contrast-detect (wide area)', # (D90/D5000)
+                3 => 'Contrast-detect (face priority)', # (ViewNX)
+                4 => 'Contrast-detect (subject tracking)', # (ViewNX)
+            },
+        },
+    ],
+    6 => {
+        Name => 'PhaseDetectAF', #JD(AutoFocus), PH(PhaseDetectAF)
+        Notes => 'PrimaryAFPoint and AFPointsUsed below are only valid when this is On',
+        RawConv => '$$self{PhaseDetectAF} = $val',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'On (51-point)', #PH
+            2 => 'On (11-point)', #PH
+            3 => 'On (39-point)', #29 (D7000)
+        },
+    },
+    7 => [
+        { #PH/JD
+            Name => 'PrimaryAFPoint',
+            Condition => '$$self{PhaseDetectAF} < 2',
+            Notes => 'models with 51-point AF: D3, D3S, D3X, D300, D300S and D700',
+            PrintConvColumns => 5,
+            PrintConv => {
+                0 => '(none)',      26 => 'C10',
+                1 => 'C6 (Center)', 27 => 'B10',
+                2 => 'B6',          28 => 'A9',
+                3 => 'A5',          29 => 'D10',
+                4 => 'D6',          30 => 'E9',
+                5 => 'E5',          31 => 'C11',
+                6 => 'C7',          32 => 'B11',
+                7 => 'B7',          33 => 'D11',
+                8 => 'A6',          34 => 'C4',
+                9 => 'D7',          35 => 'B4',
+                10 => 'E6',         36 => 'A3',
+                11 => 'C5',         37 => 'D4',
+                12 => 'B5',         38 => 'E3',
+                13 => 'A4',         39 => 'C3',
+                14 => 'D5',         40 => 'B3',
+                15 => 'E4',         41 => 'A2',
+                16 => 'C8',         42 => 'D3',
+                17 => 'B8',         43 => 'E2',
+                18 => 'A7',         44 => 'C2',
+                19 => 'D8',         45 => 'B2',
+                20 => 'E7',         46 => 'A1',
+                21 => 'C9',         47 => 'D2',
+                22 => 'B9',         48 => 'E1',
+                23 => 'A8',         49 => 'C1',
+                24 => 'D9',         50 => 'B1',
+                25 => 'E8',         51 => 'D1',
+            },
+        },
+        { #10
+            Name => 'PrimaryAFPoint',
+            Notes => 'models with 11-point AF: D90, D3000 and D5000',
+            Condition => '$$self{PhaseDetectAF} == 2',
+            PrintConvColumns => 2,
+            PrintConv => {
+                0 => '(none)',
+                1 => 'Center',
+                2 => 'Top',
+                3 => 'Bottom',
+                4 => 'Mid-left',
+                5 => 'Upper-left',
+                6 => 'Lower-left',
+                7 => 'Far Left',
+                8 => 'Mid-right',
+                9 => 'Upper-right',
+                10 => 'Lower-right',
+                11 => 'Far Right',
+            },
+        },
+        { #29
+            Name => 'PrimaryAFPoint',
+            Condition => '$$self{PhaseDetectAF} == 3',
+            Notes => 'models with 39-point AF: D7000 (not verified)',
+            PrintConvColumns => 5,
+            PrintConv => {
+                0 => '(none)',      22 => 'C10',
+                1 => 'C6 (Center)', 23 => 'B10',
+                2 => 'B6',          24 => 'D10',
+                3 => 'A2',          25 => 'C11',
+                4 => 'D6',          26 => 'B11',
+                5 => 'E2',          27 => 'D11',
+                6 => 'C7',          28 => 'C4',
+                7 => 'B7',          29 => 'B4',
+                8 => 'A3',          30 => 'D4',
+                9 => 'D7',          31 => 'C3',
+                10 => 'E3',         32 => 'B3',
+                11 => 'C5',         33 => 'D3',
+                12 => 'B5',         34 => 'C2',
+                13 => 'A1',         35 => 'B2',
+                14 => 'D5',         36 => 'D2',
+                15 => 'E1',         37 => 'C1',
+                16 => 'C8',         38 => 'B1',
+                17 => 'B8',         39 => 'D1',
+                18 => 'D8',
+                19 => 'C9',
+                20 => 'B9',
+                21 => 'D9',
+            },
+        },
+        {
+            Name => 'PrimaryAFPoint',
+            Notes => 'future models?...',
+            PrintConv => {
+                0 => '(none)',
+                1 => 'Center',
+            },
+        },
+    ],
+    8 => [
+        { #JD/PH
+            Name => 'AFPointsUsed',
+            Condition => '$$self{PhaseDetectAF} < 2',
+            Notes => q{
+                models with 51-point AF -- 5 rows: A1-9, B1-11, C1-11, D1-11, E1-9, center
+                point is C6
+            },
+            Format => 'undef[7]',
+            PrintConv => 'Image::ExifTool::Nikon::PrintAFPointsD3($val)',
+        },
+        { #10
+            Name => 'AFPointsUsed',
+            Condition => '$$self{PhaseDetectAF} == 2',
+            Notes => 'models with 11-point AF',
+            # read as int16u in little-endian byte order
+            Format => 'undef[2]',
+            ValueConv => 'unpack("v",$val)',
+            ValueConvInv => 'pack("v",$val)',
+            PrintConvColumns => 2,
+            PrintConv => {
+                0x7ff => 'All 11 Points',
+                BITMASK => {
+                    0 => 'Center',
+                    1 => 'Top',
+                    2 => 'Bottom',
+                    3 => 'Mid-left',
+                    4 => 'Upper-left',
+                    5 => 'Lower-left',
+                    6 => 'Far Left',
+                    7 => 'Mid-right',
+                    8 => 'Upper-right',
+                    9 => 'Lower-right',
+                    10 => 'Far Right',
+                },
+            },
+        },
+        { #29
+            Name => 'AFPointsUsed',
+            Condition => '$$self{PhaseDetectAF} == 3',
+            Notes => 'models with 39-point AF: D7000 (not decoded)',
+            Format => 'undef[7]',
+            PrintConv => '$_=unpack("H*",$val); "Unknown (".join(" ", /(..)/g).")"',
+        },
+        {
+            Name => 'AFPointsUsed',
+            Format => 'undef[7]',
+            PrintConv => '$_=unpack("H*",$val); "Unknown (".join(" ", /(..)/g).")"',
+        },
+    ],
+    0x10 => { #PH (D90 and D5000)
+        Name => 'AFImageWidth',
+        Format => 'int16u',
+        RawConv => '$val ? $val : undef',
+        Notes => 'this and the following tags are valid only for contrast-detect AF',
+    },
+    0x12 => { #PH
+        Name => 'AFImageHeight',
+        Format => 'int16u',
+        RawConv => '$val ? $val : undef',
+    },
+    0x14 => { #PH
+        Name => 'AFAreaXPosition',
+        Notes => 'center of AF area in AFImage coordinates',
+        Format => 'int16u',
+        RawConv => '$val ? $val : undef',
+    },
+    0x16 => { #PH
+        Name => 'AFAreaYPosition',
+        Format => 'int16u',
+        RawConv => '$val ? $val : undef',
+    },
+    # AFAreaWidth/Height for the D90 and D5000:
+    #   352x288 (AF normal area),
+    #   704x576 (AF face priority, wide area, subject tracking)
+    0x18 => { #PH
+        Name => 'AFAreaWidth',
+        Format => 'int16u',
+        Notes => 'size of AF area in AFImage coordinates',
+        RawConv => '$val ? $val : undef',
+    },
+    0x1a => { #PH
+        Name => 'AFAreaHeight',
+        Format => 'int16u',
+        RawConv => '$val ? $val : undef',
+    },
+    0x1c => { #PH
+        Name => 'ContrastDetectAFInFocus',
+        PrintConv => { 0 => 'No', 1 => 'Yes' },
+    },
+    # 0x1d - always zero (with or without live view)
+);
+
+# Nikon AF fine-tune information (ref 28)
+%Image::ExifTool::Nikon::AFTune = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0 => {
+        Name => 'AFFineTune',
+        PrintConv => {
+            0 => 'Off',
+            # (don't know what the difference between 1 and 2 is)
+            1 => 'On (1)',
+            2 => 'On (2)',
+        },
+    },
+    1 => {
+        Name => 'AFFineTuneIndex',
+        Notes => 'index of saved lens',
+        PrintConv => '$val == 255 ? "n/a" : $val',
+        PrintConvInv => '$val eq "n/a" ? 255 : $val',
+    },
+    2 => {
+        Name => 'AFFineTuneAdj',
+        Priority => 0, # so other value takes priority if it exists
+        Notes => 'may only be valid for saved lenses',
+        Format => 'int8s',
+        PrintConv => '$val > 0 ? "+$val" : $val',
+        PrintConvInv => '$val',
+    },
+);
+
+# Nikon File information - D60, D3 and D300 (ref PH)
+%Image::ExifTool::Nikon::FileInfo = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    0 => {
+        Name => 'FileInfoVersion',
+        Format => 'undef[4]',
+        Writable => 0,
+    },
+    6 => {
+        Name => 'DirectoryNumber',
+        Format => 'int16u',
+        PrintConv => 'sprintf("%.3d", $val)',
+        PrintConvInv => '$val',
+    },
+    8 => {
+        Name => 'FileNumber',
+        Format => 'int16u',
+        PrintConv => 'sprintf("%.4d", $val)',
+        PrintConvInv => '$val',
+    },
+);
+
+# ref PH
+%Image::ExifTool::Nikon::CaptureOffsets = (
+    PROCESS_PROC => \&ProcessNikonCaptureOffsets,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    1 => 'IFD0_Offset',
+    2 => 'PreviewIFD_Offset',
+    3 => 'SubIFD_Offset',
+);
+
+# ref PH (Written by capture NX)
+%Image::ExifTool::Nikon::CaptureOutput = (
+    %binaryDataAttrs,
+    FORMAT => 'int32u',
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    # 1 = 1
+    2 => 'OutputImageWidth',
+    3 => 'OutputImageHeight',
+    4 => 'OutputResolution',
+    # 5 = 1
+);
+
+# ref 4
+%Image::ExifTool::Nikon::ColorBalanceA = (
+    %binaryDataAttrs,
+    FORMAT => 'int16u',
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    624 => {
+        Name => 'RedBalance',
+        ValueConv => '$val / 256',
+        ValueConvInv => '$val * 256',
+        Protected => 1,
+    },
+    625 => {
+        Name => 'BlueBalance',
+        ValueConv => '$val / 256',
+        ValueConvInv => '$val * 256',
+        Protected => 1,
+    },
+);
+
+# ref 4
+%Image::ExifTool::Nikon::ColorBalance1 = (
+    %binaryDataAttrs,
+    FORMAT => 'int16u',
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0 => {
+        Name => 'WB_RBGGLevels',
+        Format => 'int16u[4]',
+        Protected => 1,
+    },
+);
+
+# ref 4
+%Image::ExifTool::Nikon::ColorBalance2 = (
+    %binaryDataAttrs,
+    FORMAT => 'int16u',
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'This information is encrypted for most camera models.',
+    0 => {
+        Name => 'WB_RGGBLevels',
+        Format => 'int16u[4]',
+        Protected => 1,
+    },
+);
+
+# ref 4
+%Image::ExifTool::Nikon::ColorBalance3 = (
+    %binaryDataAttrs,
+    FORMAT => 'int16u',
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0 => {
+        Name => 'WB_RGBGLevels',
+        Format => 'int16u[4]',
+        Protected => 1,
+    },
+);
+
+# ref 4
+%Image::ExifTool::Nikon::ColorBalance4 = (
+    %binaryDataAttrs,
+    FORMAT => 'int16u',
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0 => {
+        Name => 'WB_GRBGLevels',
+        Format => 'int16u[4]',
+        Protected => 1,
+    },
+);
+
+%Image::ExifTool::Nikon::Type2 = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    WRITABLE => 1,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0x0003 => 'Quality',
+    0x0004 => 'ColorMode',
+    0x0005 => 'ImageAdjustment',
+    0x0006 => 'CCDSensitivity',
+    0x0007 => 'WhiteBalance',
+    0x0008 => 'Focus',
+    0x000A => 'DigitalZoom',
+    0x000B => 'Converter',
+);
+
+# these are standard EXIF tags, but they are duplicated here so we can
+# set the family 0 group to 'MakerNotes' and set the MINOR_ERRORS flag
+%Image::ExifTool::Nikon::PreviewIFD = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    GROUPS => { 0 => 'MakerNotes', 1 => 'PreviewIFD', 2 => 'Image'},
+    VARS => { MINOR_ERRORS => 1 }, # this IFD is non-essential and often corrupted
+    # (these tags are priority 0 by default because PreviewIFD is flagged in LOW_PRIORITY_DIR)
+    0xfe => { # (not used by Nikon, but SRW images also use this table)
+        Name => 'SubfileType',
+        DataMember => 'SubfileType',
+        RawConv => '$$self{SubfileType} = $val',
+        PrintConv => \%Image::ExifTool::Exif::subfileType,
+    },
+    0x103 => {
+        Name => 'Compression',
+        SeparateTable => 'EXIF Compression',
+        PrintConv => \%Image::ExifTool::Exif::compression,
+    },
+    0x11a => 'XResolution',
+    0x11b => 'YResolution',
+    0x128 => {
+        Name => 'ResolutionUnit',
+        PrintConv => {
+            1 => 'None',
+            2 => 'inches',
+            3 => 'cm',
+        },
+    },
+    0x201 => {
+        Name => 'PreviewImageStart',
+        Flags => [ 'IsOffset', 'Permanent' ],
+        OffsetPair => 0x202,
+        DataTag => 'PreviewImage',
+        Writable => 'int32u',
+        Protected => 2,
+    },
+    0x202 => {
+        Name => 'PreviewImageLength',
+        Flags => 'Permanent' ,
+        OffsetPair => 0x201,
+        DataTag => 'PreviewImage',
+        Writable => 'int32u',
+        Protected => 2,
+    },
+    0x213 => {
+        Name => 'YCbCrPositioning',
+        PrintConv => {
+            1 => 'Centered',
+            2 => 'Co-sited',
+        },
+    },
+);
+
+# these are duplicated enough times to make it worthwhile to define them centrally
+my %nikonApertureConversions = (
+    ValueConv => '2**($val/24)',
+    ValueConvInv => '$val>0 ? 24*log($val)/log(2) : 0',
+    PrintConv => 'sprintf("%.1f",$val)',
+    PrintConvInv => '$val',
+);
+
+my %nikonFocalConversions = (
+    ValueConv => '5 * 2**($val/24)',
+    ValueConvInv => '$val>0 ? 24*log($val/5)/log(2) : 0',
+    PrintConv => 'sprintf("%.1f mm",$val)',
+    PrintConvInv => '$val=~s/\s*mm$//;$val',
+);
+
+# Version 100 Nikon lens data
+%Image::ExifTool::Nikon::LensData00 = (
+    %binaryDataAttrs,
+    NOTES => 'This structure is used by the D100, and D1X with firmware version 1.1.',
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added
+    0x00 => {
+        Name => 'LensDataVersion',
+        Format => 'undef[4]',
+        Writable => 0,
+    },
+    0x06 => { #8
+        Name => 'LensIDNumber',
+        Notes => 'see LensID values below',
+    },
+    0x07 => { #8
+        Name => 'LensFStops',
+        ValueConv => '$val / 12',
+        ValueConvInv => '$val * 12',
+        PrintConv => 'sprintf("%.2f", $val)',
+        PrintConvInv => '$val',
+    },
+    0x08 => { #8/9
+        Name => 'MinFocalLength',
+        %nikonFocalConversions,
+    },
+    0x09 => { #8/9
+        Name => 'MaxFocalLength',
+        %nikonFocalConversions,
+    },
+    0x0a => { #8
+        Name => 'MaxApertureAtMinFocal',
+        %nikonApertureConversions,
+    },
+    0x0b => { #8
+        Name => 'MaxApertureAtMaxFocal',
+        %nikonApertureConversions,
+    },
+    0x0c => 'MCUVersion', #8
+);
+
+# Nikon lens data (note: needs decrypting if LensDataVersion is 020x)
+%Image::ExifTool::Nikon::LensData01 = (
+    %binaryDataAttrs,
+    NOTES => q{
+        Nikon encrypts the LensData information below if LensDataVersion is 0201 or
+        higher, but  the decryption algorithm is known so the information can be
+        extracted.
+    },
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added
+    0x00 => {
+        Name => 'LensDataVersion',
+        Format => 'string[4]',
+        Writable => 0,
+    },
+    0x04 => { #8
+        Name => 'ExitPupilPosition',
+        ValueConv => '$val ? 2048 / $val : $val',
+        ValueConvInv => '$val ? 2048 / $val : $val',
+        PrintConv => 'sprintf("%.1f mm",$val)',
+        PrintConvInv => '$val=~s/\s*mm$//; $val',
+    },
+    0x05 => { #8
+        Name => 'AFAperture',
+        %nikonApertureConversions,
+    },
+    0x08 => { #8
+        # this seems to be 2 values: the upper nibble gives the far focus
+        # range and the lower nibble gives the near focus range.  The values
+        # are in the range 1-N, where N is lens-dependent.  A value of 0 for
+        # the far focus range indicates infinity. (ref JD)
+        Name => 'FocusPosition',
+        PrintConv => 'sprintf("0x%02x", $val)',
+        PrintConvInv => '$val',
+    },
+    0x09 => { #8/9
+        # With older AF lenses this does not work... (ref 13)
+        # ie) AF Nikkor 50mm f/1.4 => 48 (0x30)
+        # AF Zoom-Nikkor 35-105mm f/3.5-4.5 => @35mm => 15 (0x0f), @105mm => 141 (0x8d)
+        Notes => 'this focus distance is approximate, and not very accurate for some lenses',
+        Name => 'FocusDistance',
+        ValueConv => '0.01 * 10**($val/40)', # in m
+        ValueConvInv => '$val>0 ? 40*log($val*100)/log(10) : 0',
+        PrintConv => '$val ? sprintf("%.2f m",$val) : "inf"',
+        PrintConvInv => '$val eq "inf" ? 0 : $val =~ s/\s*m$//, $val',
+    },
+    0x0a => { #8/9
+        Name => 'FocalLength',
+        Priority => 0,
+        %nikonFocalConversions,
+    },
+    0x0b => { #8
+        Name => 'LensIDNumber',
+        Notes => 'see LensID values below',
+    },
+    0x0c => { #8
+        Name => 'LensFStops',
+        ValueConv => '$val / 12',
+        ValueConvInv => '$val * 12',
+        PrintConv => 'sprintf("%.2f", $val)',
+        PrintConvInv => '$val',
+    },
+    0x0d => { #8/9
+        Name => 'MinFocalLength',
+        %nikonFocalConversions,
+    },
+    0x0e => { #8/9
+        Name => 'MaxFocalLength',
+        %nikonFocalConversions,
+    },
+    0x0f => { #8
+        Name => 'MaxApertureAtMinFocal',
+        %nikonApertureConversions,
+    },
+    0x10 => { #8
+        Name => 'MaxApertureAtMaxFocal',
+        %nikonApertureConversions,
+    },
+    0x11 => 'MCUVersion', #8
+    0x12 => { #8
+        Name => 'EffectiveMaxAperture',
+        %nikonApertureConversions,
+    },
+);
+
+# Nikon lens data (note: needs decrypting)
+%Image::ExifTool::Nikon::LensData0204 = (
+    %binaryDataAttrs,
+    NOTES => q{
+        Nikon encrypts the LensData information below if LensDataVersion is 0201 or
+        higher, but  the decryption algorithm is known so the information can be
+        extracted.
+    },
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added
+    0x00 => {
+        Name => 'LensDataVersion',
+        Format => 'string[4]',
+        Writable => 0,
+    },
+    0x04 => { #8
+        Name => 'ExitPupilPosition',
+        ValueConv => '$val ? 2048 / $val : $val',
+        ValueConvInv => '$val ? 2048 / $val : $val',
+        PrintConv => 'sprintf("%.1f mm",$val)',
+        PrintConvInv => '$val=~s/\s*mm$//; $val',
+    },
+    0x05 => { #8
+        Name => 'AFAperture',
+        %nikonApertureConversions,
+    },
+    0x08 => { #8
+        # this seems to be 2 values: the upper nibble gives the far focus
+        # range and the lower nibble gives the near focus range.  The values
+        # are in the range 1-N, where N is lens-dependent.  A value of 0 for
+        # the far focus range indicates infinity. (ref JD)
+        Name => 'FocusPosition',
+        PrintConv => 'sprintf("0x%02x", $val)',
+        PrintConvInv => '$val',
+    },
+    # --> extra byte at position 0x09 in this version of LensData (PH)
+    0x0a => { #8/9
+        # With older AF lenses this does not work... (ref 13)
+        # ie) AF Nikkor 50mm f/1.4 => 48 (0x30)
+        # AF Zoom-Nikkor 35-105mm f/3.5-4.5 => @35mm => 15 (0x0f), @105mm => 141 (0x8d)
+        Notes => 'this focus distance is approximate, and not very accurate for some lenses',
+        Name => 'FocusDistance',
+        ValueConv => '0.01 * 10**($val/40)', # in m
+        ValueConvInv => '$val>0 ? 40*log($val*100)/log(10) : 0',
+        PrintConv => '$val ? sprintf("%.2f m",$val) : "inf"',
+        PrintConvInv => '$val eq "inf" ? 0 : $val =~ s/\s*m$//, $val',
+    },
+    0x0b => { #8/9
+        Name => 'FocalLength',
+        Priority => 0,
+        %nikonFocalConversions,
+    },
+    0x0c => { #8
+        Name => 'LensIDNumber',
+        Notes => 'see LensID values below',
+    },
+    0x0d => { #8
+        Name => 'LensFStops',
+        ValueConv => '$val / 12',
+        ValueConvInv => '$val * 12',
+        PrintConv => 'sprintf("%.2f", $val)',
+        PrintConvInv => '$val',
+    },
+    0x0e => { #8/9
+        Name => 'MinFocalLength',
+        %nikonFocalConversions,
+    },
+    0x0f => { #8/9
+        Name => 'MaxFocalLength',
+        %nikonFocalConversions,
+    },
+    0x10 => { #8
+        Name => 'MaxApertureAtMinFocal',
+        %nikonApertureConversions,
+    },
+    0x11 => { #8
+        Name => 'MaxApertureAtMaxFocal',
+        %nikonApertureConversions,
+    },
+    0x12 => 'MCUVersion', #8
+    0x13 => { #8
+        Name => 'EffectiveMaxAperture',
+        %nikonApertureConversions,
+    },
+);
+
+# Unknown Nikon lens data (note: data may need decrypting after byte 4)
+%Image::ExifTool::Nikon::LensDataUnknown = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0x00 => {
+        Name => 'LensDataVersion',
+        Format => 'string[4]',
+    },
+);
+
+# shot information (encrypted in some cameras) - ref 18
+%Image::ExifTool::Nikon::ShotInfo = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    DATAMEMBER => [ 0 ],
+    NOTES => q{
+        This information is encrypted for ShotInfoVersion 02xx, and some tags are
+        only valid for specific models.
+    },
+    0x00 => {
+        Name => 'ShotInfoVersion',
+        Format => 'string[4]',
+        Writable => 0,
+        RawConv => '$$self{ShotInfoVersion} = $val; $val =~ /^\d+$/ ? $val : undef',
+    },
+    0x04 => {
+        Name => 'FirmwareVersion',
+        Format => 'string[5]',
+        Writable => 0,
+        RawConv => '$val =~ /^\d\.\d+.$/ ? $val : undef',
+    },
+    0x10 => {
+        Name => 'DistortionControl',
+        Condition => '$$self{Model} =~ /P6000\b/',
+        Notes => 'P6000',
+        PrintConv => \%offOn,
+    },
+    0x66 => {
+        Name => 'VR_0x66',
+        Condition => '$$self{ShotInfoVersion} eq "0204"',
+        Format => 'int8u',
+        Unknown => 1,
+        Notes => 'D2X, D2Xs (unverified)',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'On (normal)',
+            2 => 'On (active)',
+        },
+    },
+    # 6a, 6e not correct for 0103 (D70), 0207 (D200)
+    0x6a => {
+        Name => 'ShutterCount',
+        Condition => '$$self{ShotInfoVersion} eq "0204"',
+        Format => 'int32u',
+        Priority => 0,
+        Notes => 'D2X, D2Xs',
+    },
+    0x6e => {
+        Name => 'DeletedImageCount',
+        Condition => '$$self{ShotInfoVersion} eq "0204"',
+        Format => 'int32u',
+        Priority => 0,
+        Notes => 'D2X, D2Xs',
+    },
+    0x75 => { #JD
+        Name => 'VibrationReduction',
+        Condition => '$$self{ShotInfoVersion} eq "0207"',
+        Format => 'int8u',
+        Notes => 'D200',
+        PrintConv => {
+            0 => 'Off',
+            # (not sure what the different values represent, but values
+            # of 1 and 2 have even been observed for non-VR lenses!)
+            1 => 'On (1)', #PH
+            2 => 'On (2)', #PH
+            3 => 'On (3)', #PH (rare -- only seen once)
+        },
+    },
+    0x82 => { # educated guess, needs verification
+        Name => 'VibrationReduction',
+        Condition => '$$self{ShotInfoVersion} eq "0204"',
+        Format => 'int8u',
+        Notes => 'D2X, D2Xs',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'On',
+        },
+    },
+    0x157 => { #JD
+        Name => 'ShutterCount',
+        Condition => '$$self{ShotInfoVersion} eq "0205"',
+        Format => 'undef[2]',
+        Priority => 0,
+        Notes => 'D50',
+        # treat as a 2-byte big-endian integer
+        ValueConv => 'unpack("n", $val)',
+        ValueConvInv => 'pack("n",$val)',
+    },
+    0x1ae => { #JD
+        Name => 'VibrationReduction',
+        Condition => '$$self{ShotInfoVersion} eq "0205"',
+        Format => 'int8u',
+        Notes => 'D50',
+        PrintHex => 1,
+        PrintConv => {
+            0x00 => 'n/a',
+            0x0c => 'Off',
+            0x0f => 'On',
+        },
+    },
+    0x24d => { #PH
+        Name => 'ShutterCount',
+        Condition => '$$self{ShotInfoVersion} eq "0211"',
+        Notes => 'D60',
+        Format => 'int32u',
+        Priority => 0,
+    },
+    # note: DecryptLen currently set to 0x251
+);
+
+# shot information for D40 and D40X (encrypted) - ref PH
+%Image::ExifTool::Nikon::ShotInfoD40 = (
+    PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+    WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    VARS => { ID_LABEL => 'Index' },
+    IS_SUBDIR => [ 729 ],
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'These tags are extracted from encrypted data in D40 and D40X images.',
+    0x00 => {
+        Name => 'ShotInfoVersion',
+        Format => 'string[4]',
+        Writable => 0,
+    },
+    582 => {
+        Name => 'ShutterCount',
+        Format => 'int32u',
+        Priority => 0,
+    },
+    586.1 => { #JD
+        Name => 'VibrationReduction',
+        Mask => 0x08,
+        PrintConv => {
+            0x00 => 'Off',
+            0x08 => 'On',
+        },
+    },
+    729 => { #JD
+        Name => 'CustomSettingsD40',
+        Format => 'undef[12]',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::NikonCustom::SettingsD40',
+        },
+    },
+    # note: DecryptLen currently set to 748
+);
+
+# shot information for D80 (encrypted) - ref JD
+%Image::ExifTool::Nikon::ShotInfoD80 = (
+    PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+    WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    VARS => { ID_LABEL => 'Index' },
+    IS_SUBDIR => [ 748 ],
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'These tags are extracted from encrypted data in D80 images.',
+    0x00 => {
+        Name => 'ShotInfoVersion',
+        Format => 'string[4]',
+        Writable => 0,
+    },
+    586 => {
+        Name => 'ShutterCount',
+        Format => 'int32u',
+        Priority => 0,
+    },
+    # split 590 into a few different tags
+    590.1 => {
+        Name => 'Rotation',
+        Mask => 0x07,
+        PrintConv => {
+            0x00 => 'Horizontal',
+            0x01 => 'Rotated 270 CW',
+            0x02 => 'Rotated 90 CW',
+            0x03 => 'Rotated 180',
+        },
+    },
+    590.2 => {
+        Name => 'VibrationReduction',
+        Mask => 0x18,
+        PrintConv => {
+            0x00 => 'Off',
+            0x18 => 'On',
+        },
+    },
+    590.3 => {
+        Name => 'FlashFired',
+        Mask => 0xe0,
+        PrintConv => { BITMASK => {
+            6 => 'Internal',
+            7 => 'External',
+        }},
+    },
+    708 => {
+        Name => 'NikonImageSize',
+        Mask => 0xf0,
+        PrintConv => {
+            0x00 => 'Large (10.0 M)',
+            0x10 => 'Medium (5.6 M)',
+            0x20 => 'Small (2.5 M)',
+        },
+    },
+    708.1 => {
+        Name => 'ImageQuality',
+        Mask => 0x0f,
+        PrintConv => {
+            0 => 'NEF (RAW)',
+            1 => 'JPEG Fine',
+            2 => 'JPEG Normal',
+            3 => 'JPEG Basic',
+            4 => 'NEF (RAW) + JPEG Fine',
+            5 => 'NEF (RAW) + JPEG Normal',
+            6 => 'NEF (RAW) + JPEG Basic',
+        },
+    },
+    748 => { #JD
+        Name => 'CustomSettingsD80',
+        Format => 'undef[17]',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::NikonCustom::SettingsD80',
+        },
+    },
+    # note: DecryptLen currently set to 764
+);
+
+# shot information for D90 (encrypted) - ref PH
+%Image::ExifTool::Nikon::ShotInfoD90 = (
+    PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+    WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    VARS => { ID_LABEL => 'Index' },
+    IS_SUBDIR => [ 0x374 ],
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => q{
+        These tags are extracted from encrypted data in images from the D90 with
+        firmware 1.00.
+    },
+    0x00 => {
+        Name => 'ShotInfoVersion',
+        Format => 'string[4]',
+        Writable => 0,
+    },
+    0x04 => {
+        Name => 'FirmwareVersion',
+        Format => 'string[5]',
+        Writable => 0,
+    },
+    0x2b5 => { #JD (same value found at offset 0x39, 0x2bf, 0x346)
+        Name => 'ISO2',
+        ValueConv => '100*exp(($val/12-5)*log(2))',
+        ValueConvInv => '(log($val/100)/log(2)+5)*12',
+        PrintConv => 'int($val + 0.5)',
+        PrintConvInv => '$val',
+    },
+    0x2d5 => {
+        Name => 'ShutterCount',
+        Format => 'int32u',
+        Priority => 0,
+    },
+    0x374 => {
+        Name => 'CustomSettingsD90',
+        Format => 'undef[36]',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::NikonCustom::SettingsD90',
+        },
+    },
+    # note: DecryptLen currently set to 0x398
+);
+
+# shot information for the D3 firmware 0.37 and 1.00 (encrypted) - ref PH
+%Image::ExifTool::Nikon::ShotInfoD3a = (
+    PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+    WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    VARS => { ID_LABEL => 'Index' },
+    IS_SUBDIR => [ 0x301 ],
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => q{
+        These tags are extracted from encrypted data in images from the D3 with
+        firmware 1.00 and earlier.
+    },
+    0x00 => {
+        Name => 'ShotInfoVersion',
+        Format => 'string[4]',
+        Writable => 0,
+    },
+    0x256 => { #JD (same value found at offset 0x26b)
+        Name => 'ISO2',
+        ValueConv => '100*exp(($val/12-5)*log(2))',
+        ValueConvInv => '(log($val/100)/log(2)+5)*12',
+        PrintConv => 'int($val + 0.5)',
+        PrintConvInv => '$val',
+    },
+    0x276 => { #JD
+        Name => 'ShutterCount',
+        Format => 'int32u',
+        Priority => 0,
+    },
+    723.1 => {
+        Name => 'NikonImageSize',
+        Mask => 0x18,
+        PrintConv => {
+            0x00 => 'Large',
+            0x08 => 'Medium',
+            0x10 => 'Small',
+        },
+    },
+    723.2 => {
+        Name => 'ImageQuality',
+        Mask => 0x07,
+        PrintConv => {
+            0 => 'NEF (RAW) + JPEG Fine',
+            1 => 'NEF (RAW) + JPEG Norm',
+            2 => 'NEF (RAW) + JPEG Basic',
+            3 => 'NEF (RAW)',
+            4 => 'TIF (RGB)',
+            5 => 'JPEG Fine',
+            6 => 'JPEG Normal',
+            7 => 'JPEG Basic',
+        },
+    },
+    0x301 => { #(NC)
+        Name => 'CustomSettingsD3',
+        Format => 'undef[24]',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::NikonCustom::SettingsD3',
+        },
+    },
+    # note: DecryptLen currently set to 0x318
+);
+
+# shot information for the D3 firmware 1.10, 2.00 and 2.01 (encrypted) - ref PH
+%Image::ExifTool::Nikon::ShotInfoD3b = (
+    PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+    WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    VARS => { ID_LABEL => 'Index' },
+    IS_SUBDIR => [ 0x30a ],
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    DATAMEMBER => [ 4 ],
+    NOTES => q{
+        These tags are extracted from encrypted data in images from the D3 with
+        firmware 1.10, 2.00, 2.01 and 2.02.
+    },
+    0x00 => {
+        Name => 'ShotInfoVersion',
+        Format => 'string[4]',
+        Writable => 0,
+    },
+    0x04 => {
+        Name => 'FirmwareVersion',
+        Format => 'string[5]',
+        Writable => 0,
+        RawConv => '$$self{FirmwareVersion} = $val',
+    },
+    0x10 => { #28
+        Name => 'ImageArea',
+        PrintConv => {
+            0 => 'FX (36.0 x 23.9 mm)',
+            1 => 'DX (23.5 x 15.6 mm)',
+            2 => '5:4 (30.0 x 23.9 mm)',
+        },
+    },
+    0x25d => {
+        Name => 'ISO2',
+        ValueConv => '100*exp(($val/12-5)*log(2))',
+        ValueConvInv => '(log($val/100)/log(2)+5)*12',
+        PrintConv => 'int($val + 0.5)',
+        PrintConvInv => '$val',
+    },
+    0x27d => {
+        Name => 'ShutterCount',
+        Condition => '$$self{FirmwareVersion} =~ /^1.01/',
+        Notes => 'firmware 1.10',
+        Format => 'int32u',
+        Priority => 0,
+    },
+    0x27f => {
+        Name => 'ShutterCount',
+        Condition => '$$self{FirmwareVersion} =~ /^2.0[012]/',
+        Notes => 'firmware 2.00, 2.01 and 2.02',
+        Format => 'int32u',
+        Priority => 0,
+    },
+    732.1 => { #28
+        Name => 'NikonImageSize',
+        Mask => 0x18,
+        PrintConv => {
+            0x00 => 'Large',
+            0x08 => 'Medium',
+            0x10 => 'Small',
+        },
+    },
+    732.2 => { #28
+        Name => 'ImageQuality',
+        Mask => 0x07,
+        PrintConv => {
+            0 => 'NEF (RAW) + JPEG Fine',
+            1 => 'NEF (RAW) + JPEG Norm',
+            2 => 'NEF (RAW) + JPEG Basic',
+            3 => 'NEF (RAW)',
+            4 => 'TIF (RGB)',
+            5 => 'JPEG Fine',
+            6 => 'JPEG Normal',
+            7 => 'JPEG Basic',
+        },
+    },
+    0x28a => { #28
+        Name => 'PreFlashReturnStrength',
+        Notes => 'valid in TTL and TTL-BL flash control modes',
+        # this is used to set the flash power using this relationship
+        # for the SB-800 and SB-900:
+        # $val < 140 ? 2**(0.08372*$val-12.352) : $val
+    },
+    0x30a => { # tested with firmware 2.00
+        Name => 'CustomSettingsD3',
+        Format => 'undef[24]',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::NikonCustom::SettingsD3',
+        },
+    },
+    # note: DecryptLen currently set to 0x321
+);
+
+# shot information for the D3X firmware 1.00 (encrypted) - ref PH
+%Image::ExifTool::Nikon::ShotInfoD3X = (
+    PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+    WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    VARS => { ID_LABEL => 'Index' },
+    IS_SUBDIR => [ 0x30b ],
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => q{
+        These tags are extracted from encrypted data in images from the D3X with
+        firmware 1.00.
+    },
+    0x00 => {
+        Name => 'ShotInfoVersion',
+        Format => 'string[4]',
+        Writable => 0,
+    },
+    0x04 => {
+        Name => 'FirmwareVersion',
+        Format => 'string[5]',
+        Writable => 0,
+    },
+    0x25d => {
+        Name => 'ISO2',
+        ValueConv => '100*exp(($val/12-5)*log(2))',
+        ValueConvInv => '(log($val/100)/log(2)+5)*12',
+        PrintConv => 'int($val + 0.5)',
+        PrintConvInv => '$val',
+    },
+    0x280 => {
+        Name => 'ShutterCount',
+        Format => 'int32u',
+        Priority => 0,
+    },
+    0x30b => { #(NC)
+        Name => 'CustomSettingsD3X',
+        Format => 'undef[24]',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::NikonCustom::SettingsD3',
+        },
+    },
+    # note: DecryptLen currently set to 0x323
+);
+
+# shot information for the D3S firmware 0.16 and 1.00 (encrypted) - ref PH
+%Image::ExifTool::Nikon::ShotInfoD3S = (
+    PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+    WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    VARS => { ID_LABEL => 'Index' },
+    IS_SUBDIR => [ 0x2ce ],
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => q{
+        These tags are extracted from encrypted data in images from the D3S with
+        firmware 1.00 and earlier.
+    },
+    0x00 => {
+        Name => 'ShotInfoVersion',
+        Format => 'string[4]',
+        Writable => 0,
+    },
+    0x04 => {
+        Name => 'FirmwareVersion',
+        Format => 'string[5]',
+        Writable => 0,
+    },
+    0x10 => { #28
+        Name => 'ImageArea',
+        PrintConv => {
+            0 => 'FX (36x24)',
+            1 => 'DX (24x16)',
+            2 => '5:4 (30x24)',
+            3 => '1.2x (30x20)',
+        },
+    },
+    0x221 => {
+        Name => 'ISO2',
+        ValueConv => '100*exp(($val/12-5)*log(2))',
+        ValueConvInv => '(log($val/100)/log(2)+5)*12',
+        PrintConv => 'int($val + 0.5)',
+        PrintConvInv => '$val',
+    },
+    0x242 => {
+        Name => 'ShutterCount',
+        Format => 'int32u',
+        Priority => 0,
+    },
+    0x2ce => { #(NC)
+        Name => 'CustomSettingsD3S',
+        Format => 'undef[24]',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::NikonCustom::SettingsD3',
+        },
+    },
+    # note: DecryptLen currently set to 0x2e6
+);
+
+# shot information for the D300 firmware 1.00 (encrypted) - ref JD
+%Image::ExifTool::Nikon::ShotInfoD300a = (
+    PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+    WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    VARS => { ID_LABEL => 'Index' },
+    IS_SUBDIR => [ 790 ],
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => q{
+        These tags are extracted from encrypted data in images from the D300 with
+        firmware 1.00 and earlier.
+    },
+    0x00 => {
+        Name => 'ShotInfoVersion',
+        Format => 'string[4]',
+        Writable => 0,
+    },
+    604 => {
+        Name => 'ISO2',
+        ValueConv => '100*exp(($val/12-5)*log(2))',
+        ValueConvInv => '(log($val/100)/log(2)+5)*12',
+        PrintConv => 'int($val + 0.5)',
+        PrintConvInv => '$val',
+    },
+    633 => {
+        Name => 'ShutterCount',
+        Format => 'int32u',
+        Priority => 0,
+    },
+    721 => { #PH
+        Name => 'AFFineTuneAdj',
+        Format => 'int16u',
+        PrintHex => 1,
+        PrintConvColumns => 3,
+        # thanks to Neil Nappe for the samples to decode this!...
+        # (have seen various unknown values here when flash is enabled, but
+        # these are yet to be decoded: 0x2e,0x619,0xd0d,0x103a,0x2029 - PH)
+        PrintConv => {
+            0x403e => '+20',
+            0x303e => '+19',
+            0x203e => '+18',
+            0x103e => '+17',
+            0x003e => '+16',
+            0xe03d => '+15',
+            0xc03d => '+14',
+            0xa03d => '+13',
+            0x803d => '+12',
+            0x603d => '+11',
+            0x403d => '+10',
+            0x203d => '+9',
+            0x003d => '+8',
+            0xc03c => '+7',
+            0x803c => '+6',
+            0x403c => '+5',
+            0x003c => '+4',
+            0x803b => '+3',
+            0x003b => '+2',
+            0x003a => '+1',
+            0x0000 => '0',
+            0x00c6 => '-1',
+            0x00c5 => '-2',
+            0x80c5 => '-3',
+            0x00c4 => '-4',
+            0x40c4 => '-5',
+            0x80c4 => '-6',
+            0xc0c4 => '-7',
+            0x00c3 => '-8',
+            0x20c3 => '-9',
+            0x40c3 => '-10',
+            0x60c3 => '-11',
+            0x80c3 => '-12',
+            0xa0c3 => '-13',
+            0xc0c3 => '-14',
+            0xe0c3 => '-15',
+            0x00c2 => '-16',
+            0x10c2 => '-17',
+            0x20c2 => '-18',
+            0x30c2 => '-19',
+            0x40c2 => '-20',
+        },
+    },
+    790 => {
+        Name => 'CustomSettingsD300',
+        Format => 'undef[24]',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::NikonCustom::SettingsD3',
+        },
+    },
+    # note: DecryptLen currently set to 813
+);
+
+# shot information for the D300 firmware 1.10 (encrypted) - ref PH
+%Image::ExifTool::Nikon::ShotInfoD300b = (
+    PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+    WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    VARS => { ID_LABEL => 'Index' },
+    IS_SUBDIR => [ 802 ],
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => q{
+        These tags are extracted from encrypted data in images from the D300 with
+        firmware 1.10.
+    },
+    0x00 => {
+        Name => 'ShotInfoVersion',
+        Format => 'string[4]',
+        Writable => 0,
+    },
+    0x04 => { #PH
+        Name => 'FirmwareVersion',
+        Format => 'string[5]',
+        Writable => 0,
+    },
+    613 => {
+        Name => 'ISO2',
+        ValueConv => '100*exp(($val/12-5)*log(2))',
+        ValueConvInv => '(log($val/100)/log(2)+5)*12',
+        PrintConv => 'int($val + 0.5)',
+        PrintConvInv => '$val',
+    },
+    644 => {
+        Name => 'ShutterCount',
+        Format => 'int32u',
+        Priority => 0,
+    },
+    732 => {
+        Name => 'AFFineTuneAdj',
+        Format => 'int16u',
+        PrintHex => 1,
+        PrintConvColumns => 3,
+        # thanks to Stuart Solomon for the samples to decode this!...
+        PrintConv => {
+            0x903e => '+20',
+            0x7c3e => '+19',
+            0x683e => '+18',
+            0x543e => '+17',
+            0x403e => '+16',
+            0x2c3e => '+15',
+            0x183e => '+14',
+            0x043e => '+13',
+            0xe03d => '+12',
+            0xb83d => '+11',
+            0x903d => '+10',
+            0x683d => '+9',
+            0x403d => '+8',
+            0x183d => '+7',
+            0xe03c => '+6',
+            0x903c => '+5',
+            0x403c => '+4',
+            0xe03b => '+3',
+            0x403b => '+2',
+            0x403a => '+1',
+            0x0000 => '0',
+            0x40c6 => '-1',
+            0x40c5 => '-2',
+            0xe0c5 => '-3',
+            0x40c4 => '-4',
+            0x90c4 => '-5',
+            0xe0c4 => '-6',
+            0x18c3 => '-7',
+            0x40c3 => '-8',
+            0x68c3 => '-9',
+            0x90c3 => '-10',
+            0xb8c3 => '-11',
+            0xe0c3 => '-12',
+            0x04c2 => '-13',
+            0x18c2 => '-14',
+            0x2cc2 => '-15',
+            0x40c2 => '-16',
+            0x54c2 => '-17',
+            0x68c2 => '-18',
+            0x7cc2 => '-19',
+            0x90c2 => '-20',
+        },
+    },
+    802 => {
+        Name => 'CustomSettingsD300',
+        Format => 'undef[24]',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::NikonCustom::SettingsD3',
+        },
+    },
+    # note: DecryptLen currently set to 825
+);
+
+# shot information for the D300S firmware 1.00 (encrypted) - ref PH
+%Image::ExifTool::Nikon::ShotInfoD300S = (
+    PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+    WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    VARS => { ID_LABEL => 'Index' },
+    IS_SUBDIR => [ 804 ],
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => q{
+        These tags are extracted from encrypted data in images from the D300S with
+        firmware 1.00.
+    },
+    0x00 => {
+        Name => 'ShotInfoVersion',
+        Format => 'string[4]',
+        Writable => 0,
+    },
+    0x04 => {
+        Name => 'FirmwareVersion',
+        Format => 'string[5]',
+        Writable => 0,
+    },
+    613 => {
+        Name => 'ISO2',
+        ValueConv => '100*exp(($val/12-5)*log(2))',
+        ValueConvInv => '(log($val/100)/log(2)+5)*12',
+        PrintConv => 'int($val + 0.5)',
+        PrintConvInv => '$val',
+    },
+    646 => {
+        Name => 'ShutterCount',
+        Format => 'int32u',
+        Priority => 0,
+    },
+    804 => { #(NC)
+        Name => 'CustomSettingsD300S',
+        Format => 'undef[24]',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::NikonCustom::SettingsD3',
+        },
+    },
+    # note: DecryptLen currently set to 827
+);
+
+# shot information for the D700 firmware 1.02f (encrypted) - ref 29
+%Image::ExifTool::Nikon::ShotInfoD700 = (
+    PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+    WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    VARS => { ID_LABEL => 'Index' },
+    IS_SUBDIR => [ 804 ],
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => q{
+        These tags are extracted from encrypted data in images from the D700 with
+        firmware 1.02f.
+    },
+    0x00 => {
+        Name => 'ShotInfoVersion',
+        Format => 'string[4]',
+        Writable => 0,
+    },
+    0x04 => {
+        Name => 'FirmwareVersion',
+        Format => 'string[5]',
+        Writable => 0,
+    },
+    613 => { # 0x265
+       Name => 'ISO2',
+       ValueConv => '100*exp(($val/12-5)*log(2))',
+       ValueConvInv => '(log($val/100)/log(2)+5)*12',
+       PrintConv => 'int($val + 0.5)',
+       PrintConvInv => '$val',
+    },
+    0x287 => {
+        Name => 'ShutterCount',
+        Format => 'int32u',
+        Priority => 0,
+    },
+    804 => { # 0x324 (NC)
+        Name => 'CustomSettingsD700',
+        Format => 'undef[48]',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::NikonCustom::SettingsD700',
+        },
+    },
+    # note: DecryptLen currently set to 852
+);
+
+# shot information for the D5000 firmware 1.00 (encrypted) - ref PH
+%Image::ExifTool::Nikon::ShotInfoD5000 = (
+    PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+    WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    VARS => { ID_LABEL => 'Index' },
+    IS_SUBDIR => [ 0x378 ],
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => q{
+        These tags are extracted from encrypted data in images from the D5000 with
+        firmware 1.00.
+    },
+    0x00 => {
+        Name => 'ShotInfoVersion',
+        Format => 'string[4]',
+        Writable => 0,
+    },
+    0x04 => {
+        Name => 'FirmwareVersion',
+        Format => 'string[5]',
+        Writable => 0,
+    },
+    0x2b5 => { # (also found at 0x2c0)
+        Name => 'ISO2',
+        ValueConv => '100*exp(($val/12-5)*log(2))',
+        ValueConvInv => '(log($val/100)/log(2)+5)*12',
+        PrintConv => 'int($val + 0.5)',
+        PrintConvInv => '$val',
+    },
+    0x2d6 => {
+        Name => 'ShutterCount',
+        Format => 'int32u',
+        Priority => 0,
+    },
+    0x378 => {
+        Name => 'CustomSettingsD5000',
+        Format => 'undef[34]',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::NikonCustom::SettingsD5000',
+        },
+    },
+    # note: DecryptLen currently set to 0x39a
+);
+
+# shot information for the D7000 firmware 1.01d (encrypted) - ref 29
+%Image::ExifTool::Nikon::ShotInfoD7000 = (
+    PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+    WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    VARS => { ID_LABEL => 'Index' },
+    IS_SUBDIR => [ 1028 ],
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => q{
+        These tags are extracted from encrypted data in images from the D7000 with
+        firmware 1.01b.
+    },
+    0x00 => {
+        Name => 'ShotInfoVersion',
+        Format => 'string[4]',
+        Writable => 0,
+    },
+    0x04 => {
+        Name => 'FirmwareVersion',
+        Format => 'string[5]',
+        Writable => 0,
+    },
+    #613 => {
+    #    Name => 'ISO2',
+    #    ValueConv => '100*exp(($val/12-5)*log(2))',
+    #    ValueConvInv => '(log($val/100)/log(2)+5)*12',
+    #    PrintConv => 'int($val + 0.5)',
+    #    PrintConvInv => '$val',
+    #},
+    0x320 => { # 800
+        Name => 'ShutterCount',
+        Format => 'int32u',
+        Priority => 0,
+    },
+    0x404 => { # 1028 (NC)
+        Name => 'CustomSettingsD7000',
+        Format => 'undef[48]',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::NikonCustom::SettingsD7000',
+        },
+    },
+);
+
+# Flash information (ref JD)
+%Image::ExifTool::Nikon::FlashInfo0100 = (
+    %binaryDataAttrs,
+    DATAMEMBER => [ 9.2, 15, 16 ],
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => q{
+        These tags are used by the D2H, D2Hs, D2X, D2Xs, D50, D70, D70s, D80 and
+        D200.
+    },
+    # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added
+    0 => {
+        Name => 'FlashInfoVersion',
+        Format => 'string[4]',
+        Writable => 0,
+    },
+    4 => { #PH
+        Name => 'FlashSource',
+        PrintConv => {
+            0 => 'None',
+            1 => 'External',
+            2 => 'Internal',
+        },
+    },
+    # 5 - values: 46,48,50,54,78
+    6 => {
+        Format => 'int8u[2]',
+        Name => 'ExternalFlashFirmware',
+        SeparateTable => 'FlashFirmware',
+        PrintConv => \%flashFirmware,
+    },
+    8 => {
+        Name => 'ExternalFlashFlags',
+        PrintConv => { BITMASK => {
+            0 => 'Fired', #28
+            2 => 'Bounce Flash', #PH
+            4 => 'Wide Flash Adapter',
+            5 => 'Dome Diffuser', #28
+        }},
+    },
+    9.1 => {
+        Name => 'FlashCommanderMode',
+        Mask => 0x80,
+        PrintConv => {
+            0x00 => 'Off',
+            0x80 => 'On',
+        },
+    },
+    9.2 => {
+        Name => 'FlashControlMode',
+        Mask => 0x7f,
+        DataMember => 'FlashControlMode',
+        RawConv => '$$self{FlashControlMode} = $val',
+        PrintConv => \%flashControlMode,
+        SeparateTable => 'FlashControlMode',
+    },
+    10 => [
+        {
+            Name => 'FlashOutput',
+            Condition => '$$self{FlashControlMode} >= 0x06',
+            ValueConv => '2 ** (-$val/6)',
+            ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0',
+            PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)',
+            PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
+        },
+        {
+            Name => 'FlashCompensation',
+            Format => 'int8s',
+            Priority => 0,
+            ValueConv => '-$val/6',
+            ValueConvInv => '-6 * $val',
+            PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
+            PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+        },
+    ],
+    11 => {
+        Name => 'FlashFocalLength',
+        RawConv => '$val ? $val : undef',
+        PrintConv => '"$val mm"',
+        PrintConvInv => '$val=~/(\d+)/; $1 || 0',
+    },
+    12 => {
+        Name => 'RepeatingFlashRate',
+        RawConv => '$val ? $val : undef',
+        PrintConv => '"$val Hz"',
+        PrintConvInv => '$val=~/(\d+)/; $1 || 0',
+    },
+    13 => {
+        Name => 'RepeatingFlashCount',
+        RawConv => '$val ? $val : undef',
+    },
+    14 => { #PH
+        Name => 'FlashGNDistance',
+        SeparateTable => 1,
+        PrintConv => \%flashGNDistance,
+    },
+    15 => {
+        Name => 'FlashGroupAControlMode',
+        Mask => 0x0f,
+        DataMember => 'FlashGroupAControlMode',
+        RawConv => '$$self{FlashGroupAControlMode} = $val',
+        PrintConv => \%flashControlMode,
+        SeparateTable => 'FlashControlMode',
+    },
+    16 => {
+        Name => 'FlashGroupBControlMode',
+        Mask => 0x0f,
+        DataMember => 'FlashGroupBControlMode',
+        RawConv => '$$self{FlashGroupBControlMode} = $val',
+        PrintConv => \%flashControlMode,
+        SeparateTable => 'FlashControlMode',
+    },
+    17 => [
+        {
+            Name => 'FlashGroupAOutput',
+            Condition => '$$self{FlashGroupAControlMode} >= 0x06',
+            ValueConv => '2 ** (-$val/6)',
+            ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0',
+            PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)',
+            PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
+        },
+        {
+            Name => 'FlashGroupACompensation',
+            Format => 'int8s',
+            ValueConv => '-$val/6',
+            ValueConvInv => '-6 * $val',
+            PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
+            PrintConvInv => '$val',
+        },
+    ],
+    18 => [
+        {
+            Name => 'FlashGroupBOutput',
+            Condition => '$$self{FlashGroupBControlMode} >= 0x06',
+            ValueConv => '2 ** (-$val/6)',
+            ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0',
+            PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)',
+            PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
+        },
+        {
+            Name => 'FlashGroupBCompensation',
+            Format => 'int8s',
+            ValueConv => '-$val/6',
+            ValueConvInv => '-6 * $val',
+            PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
+            PrintConvInv => '$val',
+        },
+    ],
+);
+
+# Flash information for D40, D40x, D3 and D300 (ref JD)
+%Image::ExifTool::Nikon::FlashInfo0102 = (
+    %binaryDataAttrs,
+    DATAMEMBER => [ 9.2, 16.1, 17.1, 17.2 ],
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => q{
+        These tags are used by the D3 (firmware 1.x), D40, D40X, D60 and D300
+        (firmware 1.00).
+    },
+    # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added
+    0 => {
+        Name => 'FlashInfoVersion',
+        Format => 'string[4]',
+        Writable => 0,
+    },
+    4 => { #PH
+        Name => 'FlashSource',
+        PrintConv => {
+            0 => 'None',
+            1 => 'External',
+            2 => 'Internal',
+        },
+    },
+    # 5 - values: 46,48,50,54,78
+    6 => {
+        Format => 'int8u[2]',
+        Name => 'ExternalFlashFirmware',
+        SeparateTable => 'FlashFirmware',
+        PrintConv => \%flashFirmware,
+    },
+    8 => {
+        Name => 'ExternalFlashFlags',
+        PrintConv => { BITMASK => {
+            0 => 'Fired', #28
+            2 => 'Bounce Flash', #PH
+            4 => 'Wide Flash Adapter',
+            5 => 'Dome Diffuser', #28
+        }},
+    },
+    9.1 => {
+        Name => 'FlashCommanderMode',
+        Mask => 0x80,
+        PrintConv => {
+            0x00 => 'Off',
+            0x80 => 'On',
+        },
+    },
+    9.2 => {
+        Name => 'FlashControlMode',
+        Mask => 0x7f,
+        DataMember => 'FlashControlMode',
+        RawConv => '$$self{FlashControlMode} = $val',
+        PrintConv => \%flashControlMode,
+        SeparateTable => 'FlashControlMode',
+    },
+    10 => [
+        {
+            Name => 'FlashOutput',
+            Condition => '$$self{FlashControlMode} >= 0x06',
+            ValueConv => '2 ** (-$val/6)',
+            ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0',
+            PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)',
+            PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
+        },
+        {
+            Name => 'FlashCompensation',
+            # this is the compensation from the camera (0x0012) for "Built-in" FlashType, or
+            # the compensation from the external unit (0x0017) for "Optional" FlashType - PH
+            Format => 'int8s',
+            Priority => 0,
+            ValueConv => '-$val/6',
+            ValueConvInv => '-6 * $val',
+            PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
+            PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+        },
+    ],
+    12 => {
+        Name => 'FlashFocalLength',
+        RawConv => '$val ? $val : undef',
+        PrintConv => '"$val mm"',
+        PrintConvInv => '$val=~/(\d+)/; $1 || 0',
+    },
+    13 => {
+        Name => 'RepeatingFlashRate',
+        RawConv => '$val ? $val : undef',
+        PrintConv => '"$val Hz"',
+        PrintConvInv => '$val=~/(\d+)/; $1 || 0',
+    },
+    14 => {
+        Name => 'RepeatingFlashCount',
+        RawConv => '$val ? $val : undef',
+    },
+    15 => { #PH
+        Name => 'FlashGNDistance',
+        SeparateTable => 1,
+        PrintConv => \%flashGNDistance,
+    },
+    16.1 => {
+        Name => 'FlashGroupAControlMode',
+        Mask => 0x0f,
+        Notes => 'note: group A tags may apply to the built-in flash settings for some models',
+        DataMember => 'FlashGroupAControlMode',
+        RawConv => '$$self{FlashGroupAControlMode} = $val',
+        PrintConv => \%flashControlMode,
+        SeparateTable => 'FlashControlMode',
+    },
+    17.1 => {
+        Name => 'FlashGroupBControlMode',
+        Mask => 0xf0,
+        Notes => 'note: group B tags may apply to group A settings for some models',
+        DataMember => 'FlashGroupBControlMode',
+        RawConv => '$$self{FlashGroupBControlMode} = $val',
+        ValueConv => '$val >> 4',
+        ValueConvInv => '$val << 4',
+        PrintConv => \%flashControlMode,
+        SeparateTable => 'FlashControlMode',
+    },
+    17.2 => { #PH
+        Name => 'FlashGroupCControlMode',
+        Mask => 0x0f,
+        Notes => 'note: group C tags may apply to group B settings for some models',
+        DataMember => 'FlashGroupCControlMode',
+        RawConv => '$$self{FlashGroupCControlMode} = $val',
+        PrintConv => \%flashControlMode,
+        SeparateTable => 'FlashControlMode',
+    },
+    18 => [
+        {
+            Name => 'FlashGroupAOutput',
+            Condition => '$$self{FlashGroupAControlMode} >= 0x06',
+            ValueConv => '2 ** (-$val/6)',
+            ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0',
+            PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)',
+            PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
+        },
+        {
+            Name => 'FlashGroupACompensation',
+            Format => 'int8s',
+            ValueConv => '-$val/6',
+            ValueConvInv => '-6 * $val',
+            PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
+            PrintConvInv => '$val',
+        },
+    ],
+    19 => [
+        {
+            Name => 'FlashGroupBOutput',
+            Condition => '$$self{FlashGroupBControlMode} >= 0x60',
+            ValueConv => '2 ** (-$val/6)',
+            ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0',
+            PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)',
+            PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
+        },
+        {
+            Name => 'FlashGroupBCompensation',
+            Format => 'int8s',
+            ValueConv => '-$val/6',
+            ValueConvInv => '-6 * $val',
+            PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
+            PrintConvInv => '$val',
+        },
+    ],
+    20 => [ #PH
+        {
+            Name => 'FlashGroupCOutput',
+            Condition => '$$self{FlashGroupCControlMode} >= 0x06',
+            ValueConv => '2 ** (-$val/6)',
+            ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0',
+            PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)',
+            PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
+        },
+        {
+            Name => 'FlashGroupCCompensation',
+            Format => 'int8s',
+            ValueConv => '-$val/6',
+            ValueConvInv => '-6 * $val',
+            PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
+            PrintConvInv => '$val',
+        },
+    ],
+);
+
+# Flash information for D90 and D700 (ref PH)
+%Image::ExifTool::Nikon::FlashInfo0103 = (
+    %binaryDataAttrs,
+    DATAMEMBER => [ 9.2, 17.1, 18.1, 18.2 ],
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => q{
+        These tags are used by the D3 (firmware 2.x), D3X, D3S, D90, D300 (firmware
+        1.10), D300S, D700, D3000 and D5000.
+    },
+    # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added
+    0 => {
+        Name => 'FlashInfoVersion',
+        Format => 'string[4]',
+        Writable => 0,
+    },
+    4 => { #PH
+        Name => 'FlashSource',
+        PrintConv => {
+            0 => 'None',
+            1 => 'External',
+            2 => 'Internal',
+        },
+    },
+    # 5 - values: 46,48,50,54,78
+    6 => {
+        Format => 'int8u[2]',
+        Name => 'ExternalFlashFirmware',
+        SeparateTable => 'FlashFirmware',
+        PrintConv => \%flashFirmware,
+    },
+    8 => {
+        Name => 'ExternalFlashFlags',
+        PrintConv => { BITMASK => {
+            0 => 'Fired', #28
+            2 => 'Bounce Flash', #PH
+            4 => 'Wide Flash Adapter',
+            5 => 'Dome Diffuser', #28
+        }},
+    },
+    9.1 => {
+        Name => 'FlashCommanderMode',
+        Mask => 0x80,
+        PrintConv => {
+            0x00 => 'Off',
+            0x80 => 'On',
+        },
+    },
+    9.2 => {
+        Name => 'FlashControlMode',
+        Mask => 0x7f,
+        DataMember => 'FlashControlMode',
+        RawConv => '$$self{FlashControlMode} = $val',
+        PrintConv => \%flashControlMode,
+        SeparateTable => 'FlashControlMode',
+    },
+    10 => [
+        {
+            Name => 'FlashOutput',
+            Condition => '$$self{FlashControlMode} >= 0x06',
+            ValueConv => '2 ** (-$val/6)',
+            ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0',
+            PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)',
+            PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
+        },
+        {
+            Name => 'FlashCompensation',
+            # this is the compensation from the camera (0x0012) for "Built-in" FlashType, or
+            # the compensation from the external unit (0x0017) for "Optional" FlashType - PH
+            Format => 'int8s',
+            Priority => 0,
+            ValueConv => '-$val/6',
+            ValueConvInv => '-6 * $val',
+            PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
+            PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+        },
+    ],
+    12 => { #JD
+        Name => 'FlashFocalLength',
+        RawConv => '($val and $val != 255) ? $val : undef',
+        PrintConv => '"$val mm"',
+        PrintConvInv => '$val=~/(\d+)/; $1 || 0',
+    },
+    13 => { #JD
+        Name => 'RepeatingFlashRate',
+        RawConv => '($val and $val != 255) ? $val : undef',
+        PrintConv => '"$val Hz"',
+        PrintConvInv => '$val=~/(\d+)/; $1 || 0',
+    },
+    14 => { #JD
+        Name => 'RepeatingFlashCount',
+        RawConv => '($val and $val != 255) ? $val : undef',
+    },
+    15 => { #28
+        Name => 'FlashGNDistance',
+        SeparateTable => 1,
+        PrintConv => \%flashGNDistance,
+    },
+    16 => { #28
+        Name => 'FlashColorFilter',
+        PrintConv => {
+            0x00 => 'None',
+            1 => 'FL-GL1',
+            2 => 'FL-GL2',
+            9 => 'TN-A1',
+            10 => 'TN-A2',
+            65 => 'Red',
+            66 => 'Blue',
+            67 => 'Yellow',
+            68 => 'Amber',
+        },
+    },
+    17.1 => {
+        Name => 'FlashGroupAControlMode',
+        Mask => 0x0f,
+        Notes => 'note: group A tags may apply to the built-in flash settings for some models',
+        DataMember => 'FlashGroupAControlMode',
+        RawConv => '$$self{FlashGroupAControlMode} = $val',
+        PrintConv => \%flashControlMode,
+        SeparateTable => 'FlashControlMode',
+    },
+    18.1 => {
+        Name => 'FlashGroupBControlMode',
+        Mask => 0xf0,
+        Notes => 'note: group B tags may apply to group A settings for some models',
+        DataMember => 'FlashGroupBControlMode',
+        RawConv => '$$self{FlashGroupBControlMode} = $val',
+        ValueConv => '$val >> 4',
+        ValueConvInv => '$val << 4',
+        PrintConv => \%flashControlMode,
+        SeparateTable => 'FlashControlMode',
+    },
+    18.2 => { #PH
+        Name => 'FlashGroupCControlMode',
+        Mask => 0x0f,
+        Notes => 'note: group C tags may apply to group B settings for some models',
+        DataMember => 'FlashGroupCControlMode',
+        RawConv => '$$self{FlashGroupCControlMode} = $val',
+        PrintConv => \%flashControlMode,
+        SeparateTable => 'FlashControlMode',
+    },
+    19 => [
+        {
+            Name => 'FlashGroupAOutput',
+            Condition => '$$self{FlashGroupAControlMode} >= 0x06',
+            ValueConv => '2 ** (-$val/6)',
+            ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0',
+            PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)',
+            PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
+        },
+        {
+            Name => 'FlashGroupACompensation',
+            Format => 'int8s',
+            ValueConv => '-$val/6',
+            ValueConvInv => '-6 * $val',
+            PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
+            PrintConvInv => '$val',
+        },
+    ],
+    20 => [
+        {
+            Name => 'FlashGroupBOutput',
+            Condition => '$$self{FlashGroupBControlMode} >= 0x60',
+            ValueConv => '2 ** (-$val/6)',
+            ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0',
+            PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)',
+            PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
+        },
+        {
+            Name => 'FlashGroupBCompensation',
+            Format => 'int8s',
+            ValueConv => '-$val/6',
+            ValueConvInv => '-6 * $val',
+            PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
+            PrintConvInv => '$val',
+        },
+    ],
+    21 => [ #PH
+        {
+            Name => 'FlashGroupCOutput',
+            Condition => '$$self{FlashGroupCControlMode} >= 0x06',
+            ValueConv => '2 ** (-$val/6)',
+            ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0',
+            PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)',
+            PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
+        },
+        {
+            Name => 'FlashGroupCCompensation',
+            Format => 'int8s',
+            ValueConv => '-$val/6',
+            ValueConvInv => '-6 * $val',
+            PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
+            PrintConvInv => '$val',
+        },
+    ],
+);
+
+# Unknown Flash information
+%Image::ExifTool::Nikon::FlashInfoUnknown = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0 => {
+        Name => 'FlashInfoVersion',
+        Format => 'string[4]',
+        Writable => 0,
+    },
+);
+
+# Multi exposure / image overlay information (ref PH)
+%Image::ExifTool::Nikon::MultiExposure = (
+    %binaryDataAttrs,
+    FORMAT => 'int32u',
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added
+    0 => {
+        Name => 'MultiExposureVersion',
+        Format => 'string[4]',
+        Writable => 0,
+    },
+    1 => {
+        Name => 'MultiExposureMode',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Multiple Exposure',
+            2 => 'Image Overlay',
+        },
+    },
+    2 => 'MultiExposureShots',
+    3 => {
+        Name => 'MultiExposureAutoGain',
+        PrintConv => \%offOn,
+    },
+);
+
+# tags in Nikon QuickTime videos (PH - observations with Coolpix S3)
+# (similar information in Kodak,Minolta,Nikon,Olympus,Pentax and Sanyo videos)
+%Image::ExifTool::Nikon::MOV = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    FIRST_ENTRY => 0,
+    NOTES => q{
+        This information is found in MOV and QT videos from some Nikon cameras.
+    },
+    0x00 => {
+        Name => 'Make',
+        Format => 'string[24]',
+    },
+    0x18 => {
+        Name => 'Model',
+        Description => 'Camera Model Name',
+        Format => 'string[8]',
+    },
+    # (01 00 at offset 0x20)
+    0x26 => {
+        Name => 'ExposureTime',
+        Format => 'int32u',
+        ValueConv => '$val ? 10 / $val : 0',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+    },
+    0x2a => {
+        Name => 'FNumber',
+        Format => 'rational64u',
+        PrintConv => 'sprintf("%.1f",$val)',
+    },
+    0x32 => {
+        Name => 'ExposureCompensation',
+        Format => 'rational64s',
+        PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
+    },
+    0x44 => {
+        Name => 'WhiteBalance',
+        Format => 'int16u',
+        PrintConv => {
+            0 => 'Auto',
+            1 => 'Daylight',
+            2 => 'Shade',
+            3 => 'Fluorescent', #2
+            4 => 'Tungsten',
+            5 => 'Manual',
+        },
+    },
+    0x48 => {
+        Name => 'FocalLength',
+        Format => 'rational64u',
+        PrintConv => 'sprintf("%.1f mm",$val)',
+    },
+    0xaf => {
+        Name => 'Software',
+        Format => 'string[16]',
+    },
+    0xdf => { # (this is a guess ... could also be offset 0xdb)
+        Name => 'ISO',
+        Format => 'int16u',
+        RawConv => '$val < 50 ? undef : $val', # (not valid for Coolpix L10)
+    },
+);
+
+# Nikon metadata in AVI videos (PH)
+%Image::ExifTool::Nikon::AVI = (
+    NOTES => 'Nikon-specific RIFF tags found in AVI videos.',
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Video' },
+    nctg => {
+        Name => 'NikonTags',
+        SubDirectory => { TagTable => 'Image::ExifTool::Nikon::AVITags' },
+    },
+    ncth => {
+        Name => 'ThumbnailImage',
+        Binary => 1,
+    },
+    ncvr => {
+        Name => 'NikonVers',
+        SubDirectory => { TagTable => 'Image::ExifTool::Nikon::AVIVers' },
+    },
+    ncvw => {
+        Name => 'PreviewImage',
+        RawConv => 'length($val) ? $val : undef',
+        Binary => 1,
+    },
+);
+
+# version information in AVI videos (PH)
+%Image::ExifTool::Nikon::AVIVers = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Video' },
+    PROCESS_PROC => \&ProcessNikonAVI,
+    FORMAT => 'string',
+    0x01 => 'MakerNoteType',
+    0x02 => {
+        Name => 'MakerNoteVersion',
+        Format => 'int8u',
+        ValueConv => 'my @a = reverse split " ", $val; join ".", @a;',
+    },
+);
+
+# tags in AVI videos (PH)
+%Image::ExifTool::Nikon::AVITags = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    PROCESS_PROC => \&ProcessNikonAVI,
+    FORMAT => 'string',
+    NOTES => q{
+        These tags and the AVIVer tags below are found in proprietary-format records
+        of Nikon AVI videos.
+    },
+    0x03 => 'Make',
+    0x04 => 'Model',
+    0x05 => {
+        Name => 'Software',
+        Format => 'undef',
+        ValueConv => '$val =~ tr/\0//d; $val',
+    },
+    0x06 => 'Equipment', # "NIKON DIGITAL CAMERA"
+    0x07 => { # (guess)
+        Name => 'Orientation',
+        Format => 'int16u',
+        Groups => { 2 => 'Image' },
+        PrintConv => \%Image::ExifTool::Exif::orientation,
+    },
+    0x08 => {
+        Name => 'ExposureTime',
+        Format => 'rational64u',
+        Groups => { 2 => 'Image' },
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+    },
+    0x09 => {
+        Name => 'FNumber',
+        Format => 'rational64u',
+        Groups => { 2 => 'Image' },
+        PrintConv => 'sprintf("%.1f",$val)',
+    },
+    0x0a => {
+        Name => 'ExposureCompensation',
+        Format => 'rational64s',
+        Groups => { 2 => 'Image' },
+        PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
+    },
+    0x0b => {
+        Name => 'MaxApertureValue',
+        Format => 'rational64u',
+        ValueConv => '2 ** ($val / 2)',
+        PrintConv => 'sprintf("%.1f",$val)',
+    },
+    0x0c => {
+        Name => 'MeteringMode', # (guess)
+        Format => 'int16u',
+        PrintConv => {
+            0 => 'Unknown',
+            1 => 'Average',
+            2 => 'Center-weighted average',
+            3 => 'Spot',
+            4 => 'Multi-spot',
+            5 => 'Multi-segment',
+            6 => 'Partial',
+            255 => 'Other',
+        },
+    },
+    0x0d => { # val: 0
+        Name => 'Nikon_AVITags_0x000d',
+        Format => 'int16u',
+        Flags => [ 'Hidden', 'Unknown' ],
+    },
+    0x0e => { # val: 0
+        Name => 'Nikon_AVITags_0x000e',
+        Format => 'int16u',
+        Flags => [ 'Hidden', 'Unknown' ],
+    },
+    0x0f => {
+        Name => 'FocalLength',
+        Format => 'rational64u',
+        PrintConv => 'sprintf("%.1f mm",$val)',
+    },
+    0x10 => {
+        Name => 'XResolution',
+        Format => 'rational64u',
+        Groups => { 2 => 'Image' },
+    },
+    0x11 => {
+        Name => 'YResolution',
+        Format => 'rational64u',
+        Groups => { 2 => 'Image' },
+    },
+    0x12 => {
+        Name => 'ResolutionUnit',
+        Format => 'int16u',
+        Groups => { 2 => 'Image' },
+        PrintConv => {
+            1 => 'None',
+            2 => 'inches',
+            3 => 'cm',
+        },
+    },
+    0x13 => {
+        Name => 'DateTimeOriginal', # (guess)
+        Description => 'Date/Time Original',
+        Groups => { 2 => 'Time' },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    0x14 => {
+        Name => 'CreateDate', # (guess)
+        Groups => { 2 => 'Time' },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    0x15 => {
+        Name => 'Nikon_AVITags_0x0015',
+        Format => 'int16u',
+        Flags => [ 'Hidden', 'Unknown' ],
+    },
+    0x16 => {
+        Name => 'Duration',
+        Format => 'rational64u',
+        PrintConv => '"$val s"',
+    },
+    0x17 => { # val: 1
+        Name => 'Nikon_AVITags_0x0017',
+        Format => 'int16u',
+        Flags => [ 'Hidden', 'Unknown' ],
+    },
+    0x18 => 'FocusMode',
+    0x19 => { # vals: -5, -2, 3, 5, 6, 8, 11, 12, 14, 20, 22
+        Name => 'Nikon_AVITags_0x0019',
+        Format => 'int32s',
+        Flags => [ 'Hidden', 'Unknown' ],
+    },
+    0x1b => { # vals: 1 (640x480), 1.25 (320x240)
+        Name => 'DigitalZoom',
+        Format => 'rational64u',
+    },
+    0x1c => { # (same as Nikon_0x000a)
+        Name => 'Nikon_AVITags_0x001c',
+        Format => 'rational64u',
+        Flags => [ 'Hidden', 'Unknown' ],
+    },
+    0x1d => 'ColorMode',
+    0x1e => { # string[8] - val: "AUTO"
+        Name => 'Sharpness', # (guess, could also be ISOSelection)
+    },
+    0x1f => { # string[16] - val: "AUTO"
+        Name => 'WhiteBalance', # (guess, could also be ImageAdjustment)
+    },
+    0x20 => { # string[4] - val: "OFF"
+        Name => 'NoiseReduction', # (guess)
+    },
+    0x801a => { # val: 0 (why is the 0x8000 bit set in the ID?)
+        Name => 'Nikon_AVITags_0x801a',
+        Format => 'int32s',
+        Flags => [ 'Hidden', 'Unknown' ],
+    }
+);
+
+# Nikon NCDT atoms (ref PH)
+%Image::ExifTool::Nikon::NCDT = (
+    GROUPS => { 0 => 'MakerNotes', 1 => 'Nikon', 2 => 'Video' },
+    NOTES => q{
+        Nikon-specific QuickTime tags found in the NCDT atom of MOV videos from some
+        Nikon cameras such as the Coolpix S8000.
+    },
+    NCHD => {
+        Name => 'MakerNoteVersion',
+        Format => 'undef',
+        ValueConv => q{
+            $val =~ s/\0$//;    # remove trailing null
+            $val =~ s/([\0-\x1f])/'.'.ord($1)/ge;
+            $val =~ s/\./ /; return $val;
+        },
+    },
+    NCTG => {
+        Name => 'NikonTags',
+        SubDirectory => { TagTable => 'Image::ExifTool::Nikon::NCTG' },
+    },
+    NCTH => { Name => 'ThumbnailImage', Format => 'undef', Binary => 1 },
+    NCVW => { Name => 'PreviewImage',   Format => 'undef', Binary => 1 },
+    # NCDB - 0 bytes long, or 4 null bytes
+);
+
+# Nikon NCTG tags from MOV videos (ref PH)
+%Image::ExifTool::Nikon::NCTG = (
+    PROCESS_PROC => \&ProcessNikonMOV,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => q{
+        These tags are found in proprietary-format records of the NCTG atom in MOV
+        videos from some Nikon cameras.
+    },
+    0x01 => 'Make',
+    0x02 => 'Model',
+    0x03 => 'Software',
+    0x11 => {
+        Name => 'CreateDate', #(guess, but matches QuickTime CreateDate)
+        Groups => { 2 => 'Time' },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    0x12 => {
+        Name => 'DateTimeOriginal', #(guess, but time is 1 sec before tag 0x11)
+        Description => 'Date/Time Original',
+        Groups => { 2 => 'Time' },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    0x13 => {
+        Name => 'FrameCount',
+        # int32u[2]: "467 0", "1038 0", "1127 0"
+        ValueConv => '$val =~ s/ 0$//; $val', # (not sure what the extra "0" is for)
+    },
+    # 0x14 - int32u[2]: "0 0"
+    # 0x15 - int32u[2]: "0 0"
+    0x16 => {
+        Name => 'FrameRate',
+        Groups => { 2 => 'Video' },
+        PrintConv => 'int($val * 1000 + 0.5) / 1000',
+    },
+    # 0x21 - int16u: 1, 2
+    0x22 => {
+        Name => 'FrameWidth',
+        Groups => { 2 => 'Video' },
+    },
+    0x23 => {
+        Name => 'FrameHeight',
+        Groups => { 2 => 'Video' },
+    },
+    # 0x24 - int16u: 2
+    # 0x31 - int16u: 1, 2
+    0x32 => { #(guess)
+        Name => 'AudioChannels',
+        Groups => { 2 => 'Audio' },
+    },
+    0x33 => {
+        Name => 'AudioBitsPerSample',
+        Groups => { 2 => 'Audio' },
+    },
+    0x34 => {
+        Name => 'AudioSampleRate',
+        Groups => { 2 => 'Audio' },
+    },
+    0x2000001 => {
+        Name => 'MakerNoteVersion',
+        PrintConv => '$_=$val;s/^(\d{2})/$1\./;s/^0//;$_',
+    },
+    0x2000005 => 'WhiteBalance',
+    0x200000b => 'WhiteBalanceFineTune',
+    0x200001e => {
+        Name => 'ColorSpace',
+        PrintConv => {
+            1 => 'sRGB',
+            2 => 'Adobe RGB',
+        },
+    },
+    0x2000023 => {
+        Name => 'PictureControlData',
+        Binary => 1,
+        SubDirectory => { TagTable => 'Image::ExifTool::Nikon::PictureControl' },
+    },
+    0x2000024 => {
+        Name => 'WorldTime',
+        SubDirectory => { TagTable => 'Image::ExifTool::Nikon::WorldTime' },
+    },
+    0x2000032 => {
+        Name => 'UnknownInfo',
+        SubDirectory => { TagTable => 'Image::ExifTool::Nikon::UnknownInfo' },
+    },
+    0x2000083 => {
+        Name => 'LensType',
+        # credit to Tom Christiansen (ref 7) for figuring this out...
+        PrintConv => q[$_ = $val ? Image::ExifTool::DecodeBits($val,
+            {
+                0 => 'MF',
+                1 => 'D',
+                2 => 'G',
+                3 => 'VR',
+            }) : 'AF';
+            # remove commas and change "D G" to just "G"
+            s/,//g; s/\bD G\b/G/; $_
+        ],
+    },
+    0x2000084 => {
+        Name => "Lens",
+        # short focal, long focal, aperture at short focal, aperture at long focal
+        PrintConv => \&Image::ExifTool::Exif::PrintLensInfo,
+    },
+);
+
+# Nikon composite tags
+%Image::ExifTool::Nikon::Composite = (
+    GROUPS => { 2 => 'Camera' },
+    LensSpec => {
+        Description => 'Lens',
+        Require => {
+            0 => 'Nikon:Lens',
+            1 => 'Nikon:LensType',
+        },
+        ValueConv => '"$val[0] $val[1]"',
+        PrintConv => '"$prt[0] $prt[1]"',
+    },
+    LensID => {
+        SeparateTable => 'Nikon LensID',    # print values in a separate table
+        Require => {
+            0 => 'Nikon:LensIDNumber',
+            1 => 'LensFStops',
+            2 => 'MinFocalLength',
+            3 => 'MaxFocalLength',
+            4 => 'MaxApertureAtMinFocal',
+            5 => 'MaxApertureAtMaxFocal',
+            6 => 'MCUVersion',
+            7 => 'Nikon:LensType',
+        },
+        # construct lens ID string as per ref 11
+        ValueConv => 'uc(join(" ",(unpack("H*",pack("C*",@raw)) =~ /../g)))',
+        PrintConv => \%nikonLensIDs,
+    },
+    AutoFocus => {
+        Require => {
+            0 => 'Nikon:PhaseDetectAF',
+            1 => 'Nikon:ContrastDetectAF',
+        },
+        ValueConv => '($val[0] or $val[1]) ? 1 : 0',
+        PrintConv => \%offOn,
+    },
+);
+
+# add our composite tags
+Image::ExifTool::AddCompositeTags('Image::ExifTool::Nikon');
+
+#------------------------------------------------------------------------------
+# Process Nikon AVI tags (D5000 videos)
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessNikonAVI($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $pos = $$dirInfo{DirStart} || 0;
+    my $dirEnd = $pos + $$dirInfo{DirLen};
+    $exifTool->VerboseDir($dirInfo, undef, $$dirInfo{DirLen});
+    SetByteOrder('II');
+    while ($pos + 4 <= $dirEnd) {
+        my $tag = Get16u($dataPt, $pos);
+        my $size = Get16u($dataPt, $pos + 2);
+        $pos += 4;
+        last if $pos + $size > $dirEnd;
+        $exifTool->HandleTag($tagTablePtr, $tag, undef,
+            DataPt => $dataPt,
+            Start  => $pos,
+            Size   => $size,
+        );
+        $pos += $size;
+    }
+    return 1;
+}
+#------------------------------------------------------------------------------
+# Print D3/D300 AF points (similar to Canon::PrintAFPoints1D)
+# Inputs: 0) value to convert (undef[7])
+# Focus point pattern:
+#        A1  A2  A3  A4  A5  A6  A7  A8  A9
+#    B1  B2  B3  B4  B5  B6  B7  B8  B9  B10  B11
+#    C1  C2  C3  C4  C5  C6  C7  C8  C9  C10  C11
+#    D1  D2  D3  D4  D5  D6  D7  D8  D9  D10  D11
+#        E1  E2  E3  E4  E5  E6  E7  E8  E9
+sub PrintAFPointsD3($)
+{
+    my $val = shift;
+    return 'Unknown' unless length $val == 7;
+    # list of byte/bit positions for each focus point (upper/lower nibble)
+    my @focusPts = (
+             0x55,0x50,0x43,0x14,0x02,0x07,0x21,0x26,0x33,
+        0x61,0x54,0x47,0x42,0x13,0x01,0x06,0x20,0x25,0x32,0x37,
+        0x60,0x53,0x46,0x41,0x12,0x00,0x05,0x17,0x24,0x31,0x36,
+        0x62,0x56,0x51,0x44,0x15,0x03,0x10,0x22,0x27,0x34,0x40,
+             0x57,0x52,0x45,0x16,0x04,0x11,0x23,0x30,0x35
+    );
+    my ($focusPt, @points);
+    my @dat = unpack('C*', $val);
+    my @cols = (9,11,11,11,9);
+    my $cols = shift @cols;
+    my ($row, $col) = ('A', 1);
+    foreach $focusPt (@focusPts) {
+        push @points, $row . $col if $dat[$focusPt >> 4] & (0x01 << ($focusPt & 0x0f));
+        if (++$col > $cols) {
+            $cols = shift @cols;
+            $col = 1;
+            ++$row;
+        }
+    }
+    return '(none)' unless @points;
+    return join(',',@points);
+}
+
+#------------------------------------------------------------------------------
+# Print PictureControl value
+# Inputs: 0) value (with 0x80 subtracted),
+#         1) 'Normal' (0 value) string (default 'Normal')
+#         2) format string for numbers (default '%+d')
+# Returns: PrintConv value
+sub PrintPC($;$$)
+{
+    my ($val, $norm, $fmt) = @_;
+    return $norm || 'Normal' if $val == 0;
+    return 'n/a'             if $val == 0x7f;
+    return 'Auto'            if $val == -128;
+    # -127 = custom curve created in Camera Control Pro (show as "User" by D3) - ref 28
+    return 'User'            if $val == -127; #28
+    return sprintf($fmt || '%+d', $val);
+}
+
+#------------------------------------------------------------------------------
+# Inverse of PrintPC
+# Inputs: 0) PrintConv value (after subracting 0x80 from raw value)
+# Returns: unconverted value
+# Notes: raw values: 0=Auto, 1=User, 0xff=n/a, ... 0x7f=-1, 0x80=0, 0x81=1, ...
+sub PrintPCInv($)
+{
+    my $val = shift;
+    return $val if $val =~ /^[-+]?\d+$/;
+    return 0x7f if $val =~ /n\/a/i;
+    return -128 if $val =~ /auto/i;
+    return -127 if $val =~ /user/i; #28
+    return 0;
+}
+
+#------------------------------------------------------------------------------
+# Convert unknown LensID values
+# Inputs: 0) value, 1) flag for inverse conversion, 2) PrintConv hash ref
+sub LensIDConv($$$)
+{
+    my ($val, $inv, $conv) = @_;
+    return undef if $inv;
+    # multiple lenses with the same LensID are distinguished by decimal values
+    if ($$conv{"$val.1"}) {
+        my ($i, @vals, @user);
+        for ($i=1; ; ++$i) {
+            my $lens = $$conv{"$val.$i"} or last;
+            if ($Image::ExifTool::userLens{$lens}) {
+                push @user, $lens;
+            } else {
+                push @vals, $lens;
+            }
+        }
+        return join(' or ', @user) if @user;
+        return join(' or ', @vals);
+    }
+    my $regex = $val;
+    # Sigma has been changing the LensID on some new lenses
+    $regex =~ s/^\w+/../;
+    my @ids = sort grep /^$regex$/, keys %$conv;
+    return "Unknown ($val) $$conv{$ids[0]} ?" if @ids;
+    return undef;
+}
+
+#------------------------------------------------------------------------------
+# Clean up formatting of string values
+# Inputs: 0) string value
+# Returns: formatted string value
+# - removes trailing spaces and changes case to something more sensible
+sub FormatString($)
+{
+    my $str = shift;
+    # limit string length (can be very long for some unknown tags)
+    if (length($str) > 60) {
+        $str = substr($str,0,55) . "[...]";
+    } else {
+        $str =~ s/\s+$//;   # remove trailing white space
+        # Don't change case of non-words (no vowels)
+        if ($str =~ /[AEIOUY]/) {
+            # change all letters but the first to lower case,
+            # but only in words containing a vowel
+            if ($str =~ s/\b([AEIOUY])([A-Z]+)/$1\L$2/g) {
+                $str =~ s/\bAf\b/AF/;   # patch for "AF"
+                # patch for a number of models that write improper string
+                # terminator for ImageStabilization (VR-OFF, VR-ON)
+                $str =~ s/  +.$//
+            }
+            if ($str =~ s/\b([A-Z])([A-Z]*[AEIOUY][A-Z]*)/$1\L$2/g) {
+                $str =~ s/\bRaw\b/RAW/; # patch for "RAW"
+            }
+        }
+    }
+    return $str;
+}
+
+#------------------------------------------------------------------------------
+# decoding tables from ref 4
+my @xlat = (
+  [ 0xc1,0xbf,0x6d,0x0d,0x59,0xc5,0x13,0x9d,0x83,0x61,0x6b,0x4f,0xc7,0x7f,0x3d,0x3d,
+    0x53,0x59,0xe3,0xc7,0xe9,0x2f,0x95,0xa7,0x95,0x1f,0xdf,0x7f,0x2b,0x29,0xc7,0x0d,
+    0xdf,0x07,0xef,0x71,0x89,0x3d,0x13,0x3d,0x3b,0x13,0xfb,0x0d,0x89,0xc1,0x65,0x1f,
+    0xb3,0x0d,0x6b,0x29,0xe3,0xfb,0xef,0xa3,0x6b,0x47,0x7f,0x95,0x35,0xa7,0x47,0x4f,
+    0xc7,0xf1,0x59,0x95,0x35,0x11,0x29,0x61,0xf1,0x3d,0xb3,0x2b,0x0d,0x43,0x89,0xc1,
+    0x9d,0x9d,0x89,0x65,0xf1,0xe9,0xdf,0xbf,0x3d,0x7f,0x53,0x97,0xe5,0xe9,0x95,0x17,
+    0x1d,0x3d,0x8b,0xfb,0xc7,0xe3,0x67,0xa7,0x07,0xf1,0x71,0xa7,0x53,0xb5,0x29,0x89,
+    0xe5,0x2b,0xa7,0x17,0x29,0xe9,0x4f,0xc5,0x65,0x6d,0x6b,0xef,0x0d,0x89,0x49,0x2f,
+    0xb3,0x43,0x53,0x65,0x1d,0x49,0xa3,0x13,0x89,0x59,0xef,0x6b,0xef,0x65,0x1d,0x0b,
+    0x59,0x13,0xe3,0x4f,0x9d,0xb3,0x29,0x43,0x2b,0x07,0x1d,0x95,0x59,0x59,0x47,0xfb,
+    0xe5,0xe9,0x61,0x47,0x2f,0x35,0x7f,0x17,0x7f,0xef,0x7f,0x95,0x95,0x71,0xd3,0xa3,
+    0x0b,0x71,0xa3,0xad,0x0b,0x3b,0xb5,0xfb,0xa3,0xbf,0x4f,0x83,0x1d,0xad,0xe9,0x2f,
+    0x71,0x65,0xa3,0xe5,0x07,0x35,0x3d,0x0d,0xb5,0xe9,0xe5,0x47,0x3b,0x9d,0xef,0x35,
+    0xa3,0xbf,0xb3,0xdf,0x53,0xd3,0x97,0x53,0x49,0x71,0x07,0x35,0x61,0x71,0x2f,0x43,
+    0x2f,0x11,0xdf,0x17,0x97,0xfb,0x95,0x3b,0x7f,0x6b,0xd3,0x25,0xbf,0xad,0xc7,0xc5,
+    0xc5,0xb5,0x8b,0xef,0x2f,0xd3,0x07,0x6b,0x25,0x49,0x95,0x25,0x49,0x6d,0x71,0xc7 ],
+  [ 0xa7,0xbc,0xc9,0xad,0x91,0xdf,0x85,0xe5,0xd4,0x78,0xd5,0x17,0x46,0x7c,0x29,0x4c,
+    0x4d,0x03,0xe9,0x25,0x68,0x11,0x86,0xb3,0xbd,0xf7,0x6f,0x61,0x22,0xa2,0x26,0x34,
+    0x2a,0xbe,0x1e,0x46,0x14,0x68,0x9d,0x44,0x18,0xc2,0x40,0xf4,0x7e,0x5f,0x1b,0xad,
+    0x0b,0x94,0xb6,0x67,0xb4,0x0b,0xe1,0xea,0x95,0x9c,0x66,0xdc,0xe7,0x5d,0x6c,0x05,
+    0xda,0xd5,0xdf,0x7a,0xef,0xf6,0xdb,0x1f,0x82,0x4c,0xc0,0x68,0x47,0xa1,0xbd,0xee,
+    0x39,0x50,0x56,0x4a,0xdd,0xdf,0xa5,0xf8,0xc6,0xda,0xca,0x90,0xca,0x01,0x42,0x9d,
+    0x8b,0x0c,0x73,0x43,0x75,0x05,0x94,0xde,0x24,0xb3,0x80,0x34,0xe5,0x2c,0xdc,0x9b,
+    0x3f,0xca,0x33,0x45,0xd0,0xdb,0x5f,0xf5,0x52,0xc3,0x21,0xda,0xe2,0x22,0x72,0x6b,
+    0x3e,0xd0,0x5b,0xa8,0x87,0x8c,0x06,0x5d,0x0f,0xdd,0x09,0x19,0x93,0xd0,0xb9,0xfc,
+    0x8b,0x0f,0x84,0x60,0x33,0x1c,0x9b,0x45,0xf1,0xf0,0xa3,0x94,0x3a,0x12,0x77,0x33,
+    0x4d,0x44,0x78,0x28,0x3c,0x9e,0xfd,0x65,0x57,0x16,0x94,0x6b,0xfb,0x59,0xd0,0xc8,
+    0x22,0x36,0xdb,0xd2,0x63,0x98,0x43,0xa1,0x04,0x87,0x86,0xf7,0xa6,0x26,0xbb,0xd6,
+    0x59,0x4d,0xbf,0x6a,0x2e,0xaa,0x2b,0xef,0xe6,0x78,0xb6,0x4e,0xe0,0x2f,0xdc,0x7c,
+    0xbe,0x57,0x19,0x32,0x7e,0x2a,0xd0,0xb8,0xba,0x29,0x00,0x3c,0x52,0x7d,0xa8,0x49,
+    0x3b,0x2d,0xeb,0x25,0x49,0xfa,0xa3,0xaa,0x39,0xa7,0xc5,0xa7,0x50,0x11,0x36,0xfb,
+    0xc6,0x67,0x4a,0xf5,0xa5,0x12,0x65,0x7e,0xb0,0xdf,0xaf,0x4e,0xb3,0x61,0x7f,0x2f ]
+);
+
+# decrypt Nikon data block (ref 4)
+# Inputs: 0) reference to data block, 1) serial number key, 2) shutter count key
+#         4) optional start offset (default 0)
+#         5) optional number of bytes to decode (default to the end of the data)
+# Returns: data block with specified data decrypted
+sub Decrypt($$$;$$)
+{
+    my ($dataPt, $serial, $count, $start, $len) = @_;
+    my ($i, $dat);
+
+    $start or $start = 0;
+    $len = length($$dataPt) - $start if not defined $len or $len > length($$dataPt) - $start;
+    return $$dataPt if $len <= 0;
+    my $key = 0;
+    for ($i=0; $i<4; ++$i) {
+        $key ^= ($count >> ($i*8)) & 0xff;
+    }
+    my $ci = $xlat[0][$serial & 0xff];
+    my $cj = $xlat[1][$key];
+    my $ck = 0x60;
+    my @data = unpack("x${start}C$len", $$dataPt);
+    foreach $dat (@data) {
+        $cj = ($cj + $ci * $ck) & 0xff;
+        $ck = ($ck + 1) & 0xff;
+        $dat ^= $cj;
+    }
+    my $end = $start + $len;
+    my $pre = $start ? substr($$dataPt, 0, $start) : '';
+    my $post = $end < length($$dataPt) ? substr($$dataPt, $end) : '';
+    return $pre . pack('C*',@data) . $post;
+}
+
+#------------------------------------------------------------------------------
+# Get serial number for use as a decryption key
+# Inputs: 0) ExifTool object ref, 1) serial number string
+# Returns: serial key integer or undef if no serial number provided
+sub SerialKey($$)
+{
+    my ($exifTool, $serial) = @_;
+    # use serial number as key if integral
+    return $serial if not defined $serial or $serial =~ /^\d+$/;
+    return 0x22 if $$exifTool{Model} =~ /\bD50$/; # D50 (ref 8)
+    return 0x60; # D200 (ref 10), D40X (ref PH), etc
+}
+
+#------------------------------------------------------------------------------
+# Read Nikon NCTG tags in MOV videos
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessNikonMOV($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dataPos = $$dirInfo{DataPos};
+    my $pos = $$dirInfo{DirStart};
+    my $end = $pos + $$dirInfo{DirLen};
+    $exifTool->VerboseDir($$dirInfo{DirName}, 0, $$dirInfo{DirLen});
+    while ($pos + 8 < $end) {
+        my $tag = Get32u($dataPt, $pos);
+        my $fmt = Get16u($dataPt, $pos + 4); # (same format code as EXIF)
+        my $count = Get16u($dataPt, $pos + 6);
+        $pos += 8;
+        my $fmtStr = $Image::ExifTool::Exif::formatName[$fmt];
+        unless ($fmtStr) {
+            $exifTool->Warn(sprintf("Unknown format ($fmt) for $$dirInfo{DirName} tag 0x%x",$tag));
+            last;
+        }
+        my $size = $count * $Image::ExifTool::Exif::formatSize[$fmt];
+        if ($pos + $size > $end) {
+            $exifTool->Warn(sprintf("Truncated data for $$dirInfo{DirName} tag 0x%x",$tag));
+            last;
+        }
+        my $val = ReadValue($dataPt, $pos, $fmtStr, $count, $size);
+        $exifTool->HandleTag($tagTablePtr, $tag, $val,
+            DataPt  => $dataPt,
+            DataPos => $dataPos,
+            Format  => $fmtStr,
+            Start   => $pos,
+            Size    => $size,
+        );
+        $pos += $size;  # is this padded to an even offset????
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Read/Write Nikon Encrypted data block
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success when reading, or new directory when writing (IsWriting set)
+sub ProcessNikonEncrypted($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    $exifTool or return 1;    # allow dummy access
+    my $serial = $$exifTool{NikonSerialKey};
+    my $count = $$exifTool{NikonCountKey};
+    unless (defined $serial and defined $count) {
+        if (defined $serial or defined $count) {
+            my $missing = defined $serial ? 'ShutterCount' : 'SerialNumber';
+            $exifTool->Warn("Can't decrypt Nikon information (no $missing key)");
+        }
+        delete $$exifTool{NikonSerialKey};
+        delete $$exifTool{NikonCountKey};
+        return 0;
+    }
+    my $verbose = $$dirInfo{IsWriting} ? 0 : $exifTool->Options('Verbose');
+    my $tagInfo = $$dirInfo{TagInfo};
+    my $data = substr(${$$dirInfo{DataPt}}, $$dirInfo{DirStart}, $$dirInfo{DirLen});
+
+    my ($start, $len, $offset, $byteOrder, $recrypt, $newSerial, $newCount);
+
+    # must re-encrypt when writing if serial number or shutter count changes
+    if ($$dirInfo{IsWriting}) {
+        if ($$exifTool{NewNikonSerialKey}) {
+            $newSerial = $$exifTool{NewNikonSerialKey};
+            $recrypt = 1;
+        }
+        if ($$exifTool{NewNikonCountKey}) {
+            $newCount = $$exifTool{NewNikonCountKey};
+            $recrypt = 1;
+        }
+    }
+    if ($tagInfo and $$tagInfo{SubDirectory}) {
+        $start = $tagInfo->{SubDirectory}->{DecryptStart};
+        # may decrypt only part of the information to save time
+        if ($verbose < 3 and $exifTool->Options('Unknown') < 2 and not $recrypt) {
+            $len = $tagInfo->{SubDirectory}->{DecryptLen};
+        }
+        $offset = $tagInfo->{SubDirectory}->{DirOffset};
+        $byteOrder = $tagInfo->{SubDirectory}->{ByteOrder};
+    }
+    $start or $start = 0;
+    if (defined $offset) {
+        # offset, if specified, is releative to start of encrypted data
+        $offset += $start;
+    } else {
+        $offset = 0;
+    }
+    my $maxLen = length($data) - $start;
+    # decrypt all the data unless DecryptLen is given
+    $len = $maxLen unless $len and $len <= $maxLen;
+
+    $data = Decrypt(\$data, $serial, $count, $start, $len);
+
+    if ($verbose > 2) {
+        $exifTool->VerboseDir("Decrypted $$tagInfo{Name}");
+        $exifTool->VerboseDump(\$data,
+            Prefix  => $exifTool->{INDENT} . '  ',
+            DataPos => $$dirInfo{DirStart} + $$dirInfo{DataPos} + ($$dirInfo{Base} || 0),
+        );
+    }
+    # process the decrypted information
+    my %subdirInfo = (
+        DataPt   => \$data,
+        DirStart => $offset,
+        DirLen   => length($data) - $offset,
+        DirName  => $$dirInfo{DirName},
+        DataPos  => $$dirInfo{DataPos} + $$dirInfo{DirStart},
+        Base     => $$dirInfo{Base},
+    );
+    my $rtnVal;
+    my $oldOrder = GetByteOrder();
+    SetByteOrder($byteOrder) if $byteOrder;
+    if ($$dirInfo{IsWriting}) {
+        my $changed = $$exifTool{CHANGED};
+        $rtnVal = $exifTool->WriteBinaryData(\%subdirInfo, $tagTablePtr);
+        # must re-encrypt if serial number or shutter count changes
+        if ($recrypt) {
+            $serial = $newSerial if defined $newSerial;
+            $count = $newCount if defined $newCount;
+            ++$$exifTool{CHANGED};
+        }
+        if ($changed == $$exifTool{CHANGED}) {
+            undef $rtnVal;  # nothing changed so use original data
+        } else {
+            # add back any un-encrypted data at start
+            $rtnVal = substr($data, 0, $offset) . $rtnVal if $offset;
+            # re-encrypt data (symmetrical algorithm)
+            $rtnVal = Decrypt(\$rtnVal, $serial, $count, $start, $len);
+        }
+    } else {
+        $rtnVal = $exifTool->ProcessBinaryData(\%subdirInfo, $tagTablePtr);
+    }
+    SetByteOrder($oldOrder);
+    return $rtnVal;
+}
+
+#------------------------------------------------------------------------------
+# Pre-scan EXIF directory to extract specific tags
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) required tagID hash ref
+# Returns: 1 if directory was scanned successfully
+sub PrescanExif($$$)
+{
+    my ($exifTool, $dirInfo, $tagHash) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dataPos = $$dirInfo{DataPos} || 0;
+    my $dataLen = $$dirInfo{DataLen};
+    my $dirStart = $$dirInfo{DirStart} || 0;
+    my $base = $$dirInfo{Base} || 0;
+    my $raf = $$dirInfo{RAF};
+    my ($index, $numEntries, $data, $buff);
+
+    # get number of entries in IFD
+    if ($dirStart >= 0 and $dirStart <= $dataLen-2) {
+        $numEntries = Get16u($dataPt, $dirStart);
+        # reset $numEntries to read from file if necessary
+        undef $numEntries if $dirStart + 2 + 12 * $numEntries > $dataLen;
+    }
+    # read IFD from file if necessary
+    unless ($numEntries) {
+        $raf or return 0;
+        $dataPos += $dirStart;  # read data from the start of the directory
+        $raf->Seek($dataPos + $base, 0) and $raf->Read($data, 2) == 2 or return 0;
+        $numEntries = Get16u(\$data, 0);
+        my $len = 12 * $numEntries;
+        $raf->Read($buff, $len) == $len or return 0;
+        $data .= $buff;
+        # update variables for the newly loaded IFD (already updated dataPos)
+        $dataPt = \$data;
+        $dataLen = length $data;
+        $dirStart = 0;
+    }
+    # loop through necessary IFD entries
+    my ($lastTag) = sort { $b <=> $a } keys %$tagHash; # (reverse sort)
+    for ($index=0; $index<$numEntries; ++$index) {
+        my $entry = $dirStart + 2 + 12 * $index;
+        my $tagID = Get16u($dataPt, $entry);
+        last if $tagID > $lastTag;  # (assuming tags are in order)
+        next unless exists $$tagHash{$tagID};   # only extract required tags
+        my $format = Get16u($dataPt, $entry+2);
+        next if $format < 1 or $format > 13;
+        my $count = Get32u($dataPt, $entry+4);
+        my $size = $count * $Image::ExifTool::Exif::formatSize[$format];
+        my $formatStr = $Image::ExifTool::Exif::formatName[$format];
+        my $valuePtr = $entry + 8;      # pointer to value within $$dataPt
+        if ($size > 4) {
+            next if $size > 0x1000000;  # set a reasonable limit on data size (16MB)
+            $valuePtr = Get32u($dataPt, $valuePtr);
+            # convert offset to pointer in $$dataPt
+            # (don't yet handle EntryBased or FixOffsets)
+            $valuePtr -= $dataPos;
+            if ($valuePtr < 0 or $valuePtr+$size > $dataLen) {
+                next unless $raf and $raf->Seek($base + $valuePtr + $dataPos,0) and
+                                     $raf->Read($buff,$size) == $size;
+                $$tagHash{$tagID} = ReadValue(\$buff,0,$formatStr,$count,$size);
+                next;
+            }
+        }
+        $$tagHash{$tagID} = ReadValue($dataPt,$valuePtr,$formatStr,$count,$size);
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Process Nikon Capture history data
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessNikonCaptureEditVersions($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    require Image::ExifTool::NikonCapture;
+    return Image::ExifTool::NikonCapture::ProcessNikonCaptureEditVersions($exifTool, $dirInfo, $tagTablePtr);
+}
+
+#------------------------------------------------------------------------------
+# process Nikon Capture Offsets IFD (ref PH)
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+# Notes: This isn't a normal IFD, but is close...
+sub ProcessNikonCaptureOffsets($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dirStart = $$dirInfo{DirStart};
+    my $dirLen = $$dirInfo{DirLen};
+    my $success = 0;
+    return 0 unless $dirLen > 2;
+    my $count = Get16u($dataPt, $dirStart);
+    return 0 unless $count and $count * 12 + 2 <= $dirLen;
+    if ($exifTool->Options('Verbose')) {
+        $exifTool->VerboseDir('NikonCaptureOffsets', $count);
+    }
+    my $index;
+    for ($index=0; $index<$count; ++$index) {
+        my $pos = $dirStart + 12 * $index + 2;
+        my $tagID = Get32u($dataPt, $pos);
+        my $value = Get32u($dataPt, $pos + 4);
+        $exifTool->HandleTag($tagTablePtr, $tagID, $value,
+            Index  => $index,
+            DataPt => $dataPt,
+            Start  => $pos,
+            Size   => 12,
+        ) and $success = 1;
+    }
+    return $success;
+}
+
+#------------------------------------------------------------------------------
+# Read/write Nikon Makernotes directory
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success, otherwise returns 0 and sets a Warning when reading
+#          or new directory when writing (IsWriting set in dirInfo)
+sub ProcessNikon($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    $exifTool or return 1;    # allow dummy access
+
+    # pre-scan IFD to get SerialNumber (0x001d) and ShutterCount (0x00a7) for use in decryption
+    my %needTags = ( 0x001d => 0, 0x00a7 => undef );
+    PrescanExif($exifTool, $dirInfo, \%needTags);
+    $$exifTool{NikonSerialKey} = SerialKey($exifTool, $needTags{0x001d});
+    $$exifTool{NikonCountKey} = $needTags{0x00a7};
+
+    # process Nikon makernotes
+    my $rtnVal;
+    if ($$dirInfo{IsWriting}) {
+        # get new decryptino keys if they are being changed
+        my $serial = $exifTool->GetNewValues($Image::ExifTool::Nikon::Main{0x001d});
+        my $count = $exifTool->GetNewValues($Image::ExifTool::Nikon::Main{0x00a7});
+        $$exifTool{NewNikonSerialKey} = SerialKey($exifTool, $serial);
+        $$exifTool{NewNikonCountKey} = $count;
+        $rtnVal = Image::ExifTool::Exif::WriteExif($exifTool, $dirInfo, $tagTablePtr);
+        delete $$exifTool{NewNikonSerialKey};
+        delete $$exifTool{NewNikonCountKey};
+    } else {
+        $rtnVal = Image::ExifTool::Exif::ProcessExif($exifTool, $dirInfo, $tagTablePtr);
+    }
+    delete $$exifTool{NikonSerialKey};
+    delete $$exifTool{NikonCountKey};
+    return $rtnVal;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Nikon - Nikon EXIF maker notes tags
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to interpret
+Nikon maker notes in EXIF information.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html>
+
+=item L<http://www.cybercom.net/~dcoffin/dcraw/>
+
+=item L<http://members.aol.com/khancock/pilot/nbuddy/>
+
+=item L<http://www.rottmerhusen.com/objektives/lensid/thirdparty.html>
+
+=item L<http://homepage3.nifty.com/kamisaka/makernote/makernote_nikon.htm>
+
+=item L<http://www.wohlberg.net/public/software/photo/nstiffexif/>
+
+=back
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Joseph Heled, Thomas Walter, Brian Ristuccia, Danek Duvall, Tom
+Christiansen, Robert Rottmerhusen, Werner Kober, Roger Larsson, Jens Duttke,
+Gregor Dorlars, Neil Nappe, Alexandre Naaman, Brendt Wohlberg and Warren
+Hatch for their help figuring out some Nikon tags, and to everyone who
+helped contribute to the LensID list.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/Nikon Tags>,
+L<Image::ExifTool::TagNames/NikonCapture Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/NikonCapture.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/NikonCapture.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/NikonCapture.pm	(revision 24799)
@@ -0,0 +1,911 @@
+#------------------------------------------------------------------------------
+# File:         NikonCapture.pm
+#
+# Description:  Read/write Nikon Capture information
+#
+# Revisions:    11/08/2005 - P. Harvey Created
+#               10/10/2008 - P. Harvey Updated for Capture NX 2
+#               16/04/2011 - P. Harvey Decode NikonCaptureEditVersions
+#
+# References:   1) http://www.cybercom.net/~dcoffin/dcraw/
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::NikonCapture;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::Exif;
+
+$VERSION = '1.07';
+
+sub ProcessNikonCapture($$$);
+
+# common print conversions
+my %offOn = ( 0 => 'Off', 1 => 'On' );
+my %noYes = ( 0 => 'No', 1 => 'Yes' );
+my %unsharpColor = (
+    0 => 'RGB',
+    1 => 'Red',
+    2 => 'Green',
+    3 => 'Blue',
+    4 => 'Yellow',
+    5 => 'Magenta',
+    6 => 'Cyan',
+);
+
+# Nikon Capture data (ref PH)
+%Image::ExifTool::NikonCapture::Main = (
+    PROCESS_PROC => \&ProcessNikonCapture,
+    WRITE_PROC => \&WriteNikonCapture,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    NOTES => q{
+        This information is written by the Nikon Capture software in tag 0x0e01 of
+        the maker notes of NEF images.
+    },
+    # 0x007ddc9d contains contrast information
+    0x008ae85e => {
+        Name => 'LCHEditor',
+        Writable => 'int8u',
+        PrintConv => \%offOn,
+    },
+    0x0c89224b => {
+        Name => 'ColorAberrationControl',
+        Writable => 'int8u',
+        PrintConv => \%offOn,
+    },
+    0x116fea21 => {
+        Name => 'HighlightData',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::NikonCapture::HighlightData',
+        },
+    },
+    0x2175eb78 => {
+        Name => 'D-LightingHQ',
+        Writable => 'int8u',
+        PrintConv => \%offOn,
+    },
+    0x2fc08431 => {
+        Name => 'StraightenAngle',
+        Writable => 'double',
+    },
+    0x374233e0 => {
+        Name => 'CropData',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::NikonCapture::CropData',
+        },
+    },
+    0x39c456ac => {
+        Name => 'PictureCtrl',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::NikonCapture::PictureCtrl',
+        },
+    },
+    0x3cfc73c6 => {
+        Name => 'RedEyeData',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::NikonCapture::RedEyeData',
+        },
+    },
+    0x3d136244 => {
+        Name => 'EditVersionName',
+        Writable => 'string', # (null terminated)
+    },
+    # 0x3e726567 added when I rotated by 90 degrees
+    0x56a54260 => {
+        Name => 'Exposure',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::NikonCapture::Exposure',
+        },
+    },
+    0x5f0e7d23 => {
+        Name => 'ColorBooster',
+        Writable => 'int8u',
+        PrintConv => \%offOn,
+    },
+    0x6a6e36b6 => {
+        Name => 'D-LightingHQSelected',
+        Writable => 'int8u',
+        PrintConv => \%noYes,
+    },
+    0x753dcbc0 => {
+        Name => 'NoiseReduction',
+        Writable => 'int8u',
+        PrintConv => \%offOn,
+    },
+    0x76a43200 => {
+        Name => 'UnsharpMask',
+        Writable => 'int8u',
+        PrintConv => \%offOn,
+    },
+    0x76a43201 => {
+        Name => 'Curves',
+        Writable => 'int8u',
+        PrintConv => \%offOn,
+    },
+    0x76a43202 => {
+        Name => 'ColorBalanceAdj',
+        Writable => 'int8u',
+        PrintConv => \%offOn,
+    },
+    0x76a43203 => {
+        Name => 'AdvancedRaw',
+        Writable => 'int8u',
+        PrintConv => \%offOn,
+    },
+    0x76a43204 => {
+        Name => 'WhiteBalanceAdj',
+        Writable => 'int8u',
+        PrintConv => \%offOn,
+    },
+    0x76a43205 => {
+        Name => 'VignetteControl',
+        Writable => 'int8u',
+        PrintConv => \%offOn,
+    },
+    0x76a43206 => {
+        Name => 'FlipHorizontal',
+        Writable => 'int8u',
+        PrintConv => \%noYes,
+    },
+    0x76a43207 => { # rotation angle in degrees
+        Name => 'Rotation',
+        Writable => 'int16u',
+    },
+    0x083a1a25 => {
+        Name => 'HistogramXML',
+        Writable => 'undef',
+        Binary => 1,
+        AdjustSize => 4,    # patch Nikon bug
+    },
+    0x84589434 => {
+        Name => 'BrightnessData',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::NikonCapture::Brightness',
+        },
+    },
+    0x890ff591 => {
+        Name => 'D-LightingHQData',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::NikonCapture::DLightingHQ',
+        },
+    },
+    0x926f13e0 => {
+        Name => 'NoiseReductionData',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::NikonCapture::NoiseReduction',
+        },
+    },
+    0x9ef5f6e0 => {
+        Name => 'IPTCData',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::IPTC::Main',
+        },
+    },
+  # 0xa7264a72, 0x88f55e48 and 0x416391c6 all change from 0 to 1 when QuickFix is turned on
+    0xab5eca5e => {
+        Name => 'PhotoEffects',
+        Writable => 'int8u',
+        PrintConv => \%offOn,
+    },
+    0xac6bd5c0 => {
+        Name => 'VignetteControlIntensity',
+        Writable => 'int16s',
+    },
+    0xb0384e1e => {
+        Name => 'PhotoEffectsData',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::NikonCapture::PhotoEffects',
+        },
+    },
+    0xb999a36f => {
+        Name => 'ColorBoostData',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::NikonCapture::ColorBoost',
+        },
+    },
+    0xbf3c6c20 => {
+        Name => 'WBAdjData',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::NikonCapture::WBAdjData',
+        },
+    },
+    0xce5554aa => {
+        Name => 'D-LightingHS',
+        Writable => 'int8u',
+        PrintConv => \%offOn,
+    },
+    0xe2173c47 => {
+        Name => 'PictureControl',
+        Writable => 'int8u',
+        PrintConv => \%offOn,
+    },
+    0xe37b4337 => {
+        Name => 'D-LightingHSData',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::NikonCapture::DLightingHS',
+        },
+    },
+    0xe42b5161 => {
+        Name => 'UnsharpData',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::NikonCapture::UnsharpData',
+        },
+    },
+    0xe9651831 => {
+        Name => 'PhotoEffectHistoryXML',
+        Binary => 1,
+        Writable => 'undef',
+    },
+    0xfe28a44f => {
+        Name => 'AutoRedEye',
+        Writable => 'int8u',
+        PrintConv => \%offOn, # (have seen a value of 28 here for older software?)
+    },
+    0xfe443a45 => {
+        Name => 'ImageDustOff',
+        Writable => 'int8u',
+        PrintConv => \%offOn,
+    },
+);
+
+%Image::ExifTool::NikonCapture::UnsharpData = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FORMAT => 'int8u',
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    0 => 'UnsharpCount',
+    19 => { Name => 'Unsharp1Color', Format => 'int16u', PrintConv => \%unsharpColor },
+    23 => { Name => 'Unsharp1Intensity', Format => 'int16u' },
+    25 => { Name => 'Unsharp1HaloWidth', Format => 'int16u' },
+    27 => 'Unsharp1Threshold',
+    46 => { Name => 'Unsharp2Color', Format => 'int16u', PrintConv => \%unsharpColor },
+    50 => { Name => 'Unsharp2Intensity', Format => 'int16u' },
+    52 => { Name => 'Unsharp2HaloWidth', Format => 'int16u' },
+    54 => 'Unsharp2Threshold',
+    73 => { Name => 'Unsharp3Color', Format => 'int16u', PrintConv => \%unsharpColor },
+    77 => { Name => 'Unsharp3Intensity', Format => 'int16u' },
+    79 => { Name => 'Unsharp3HaloWidth', Format => 'int16u' },
+    81 => 'Unsharp3Threshold',
+    100 => { Name => 'Unsharp4Color', Format => 'int16u', PrintConv => \%unsharpColor },
+    104 => { Name => 'Unsharp4Intensity', Format => 'int16u' },
+    106 => { Name => 'Unsharp4HaloWidth', Format => 'int16u' },
+    108 => 'Unsharp4Threshold',
+    # there could be more, but I grow bored of this... :P
+);
+
+%Image::ExifTool::NikonCapture::DLightingHS = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FORMAT => 'int32u',
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    0 => 'D-LightingHSAdjustment',
+    1 => 'D-LightingHSColorBoost',
+);
+
+%Image::ExifTool::NikonCapture::DLightingHQ = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FORMAT => 'int32u',
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    0 => 'D-LightingHQShadow',
+    1 => 'D-LightingHQHighlight',
+    2 => 'D-LightingHQColorBoost',
+);
+
+%Image::ExifTool::NikonCapture::ColorBoost = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FORMAT => 'int8u',
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    0 => {
+        Name => 'ColorBoostType',
+        PrintConv => {
+            0 => 'Nature',
+            1 => 'People',
+        },
+    },
+    1 => {
+        Name => 'ColorBoostLevel',
+        Format => 'int32u',
+    },
+);
+
+%Image::ExifTool::NikonCapture::WBAdjData = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FORMAT => 'int8u',
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    0x00 => {
+        Name => 'WBAdjRedBalance',
+        Format => 'double',
+    },
+    0x08 => {
+        Name => 'WBAdjBlueBalance',
+        Format => 'double',
+    },
+    0x10 => {
+        Name => 'WBAdjMode',
+        PrintConv => {
+            1 => 'Use Gray Point',
+            2 => 'Recorded Value',
+            3 => 'Use Temperature',
+            4 => 'Calculate Automatically'
+        },
+    },
+    0x14 => {
+        Name => 'WBAdjLightingSubtype',
+        # this varies for different lighting types
+        # (ie. for Daylight, this is 0 => 'Direct', 1 => 'Shade', 2 => 'Cloudy')
+    },
+    0x15 => {
+        Name => 'WBAdjLighting',
+        PrintConv => {
+            0 => 'None',
+            1 => 'Incandescent',
+            2 => 'Daylight',
+            3 => 'Standard Fluorescent',
+            4 => 'High Color Rendering Fluorescent',
+            5 => 'Flash',
+        },
+    },
+    0x18 => {
+        Name => 'WBAdjTemperature',
+        Format => 'int16u',
+    },
+    0x25 => {
+        Name => 'WBAdjTint',
+        Format => 'int32s',
+    },
+);
+
+%Image::ExifTool::NikonCapture::PhotoEffects = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FORMAT => 'int8u',
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    0 => {
+        Name => 'PhotoEffectsType',
+        PrintConv => {
+            0 => 'None',
+            1 => 'B&W',
+            2 => 'Sepia',
+            3 => 'Tinted',
+        },
+    },
+    4 => {
+        Name => 'PhotoEffectsRed',
+        Format => 'int16s',
+    },
+    6 => {
+        Name => 'PhotoEffectsGreen',
+        Format => 'int16s',
+    },
+    8 => {
+        Name => 'PhotoEffectsBlue',
+        Format => 'int16s',
+    },
+);
+
+%Image::ExifTool::NikonCapture::Brightness = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FORMAT => 'int8u',
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    0 => {
+        Name => 'BrightnessAdj',
+        Format => 'double',
+        ValueConv => '$val * 50',
+        ValueConvInv => '$val / 50',
+    },
+    8 => {
+        Name => 'EnhanceDarkTones',
+        PrintConv => \%offOn,
+    },
+);
+
+%Image::ExifTool::NikonCapture::NoiseReduction = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FORMAT => 'int8u',
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    0x04 => {
+        Name => 'EdgeNoiseReduction',
+        PrintConv => \%offOn,
+    },
+    0x05 => {
+        Name => 'ColorMoireReductionMode',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Low',
+            2 => 'Medium',
+            3 => 'High',
+        },
+    },
+    0x09 => {
+        Name => 'NoiseReductionIntensity',
+        Format => 'int32u',
+    },
+    0x0d => {
+        Name => 'NoiseReductionSharpness',
+        Format => 'int32u',
+    },
+    0x11 => {
+        Name => 'NoiseReductionMethod',
+        Format => 'int16u',
+        PrintConv => {
+            0 => 'Faster',
+            1 => 'Better Quality',
+        },
+    },
+    0x15 => {
+        Name => 'ColorMoireReduction',
+        PrintConv => \%offOn,
+    },
+    0x17 => {
+        Name => 'NoiseReduction',
+        PrintConv => \%offOn,
+    },
+    0x18 => {
+        Name => 'ColorNoiseReductionIntensity',
+        Format => 'int32u',
+    },
+    0x1c => {
+        Name => 'ColorNoiseReductionSharpness',
+        Format => 'int32u',
+    },
+);
+
+%Image::ExifTool::NikonCapture::CropData = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FORMAT => 'int8u',
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    0x1e => {
+        Name => 'CropLeft',
+        Format => 'double',
+        ValueConv => '$val / 2',
+        ValueConvInv => '$val * 2',
+    },
+    0x26 => {
+        Name => 'CropTop',
+        Format => 'double',
+        ValueConv => '$val / 2',
+        ValueConvInv => '$val * 2',
+    },
+    0x2e => {
+        Name => 'CropRight',
+        Format => 'double',
+        ValueConv => '$val / 2',
+        ValueConvInv => '$val * 2',
+    },
+    0x36 => {
+        Name => 'CropBottom',
+        Format => 'double',
+        ValueConv => '$val / 2',
+        ValueConvInv => '$val * 2',
+    },
+    0x8e => {
+        Name => 'CropOutputWidthInches',
+        Format => 'double',
+    },
+    0x96 => {
+        Name => 'CropOutputHeightInches',
+        Format => 'double',
+    },
+    0x9e => {
+        Name => 'CropScaledResolution',
+        Format => 'double',
+    },
+    0xae => {
+        Name => 'CropSourceResolution',
+        Format => 'double',
+        ValueConv => '$val / 2',
+        ValueConvInv => '$val * 2',
+    },
+    0xb6 => {
+        Name => 'CropOutputResolution',
+        Format => 'double',
+    },
+    0xbe => {
+        Name => 'CropOutputScale',
+        Format => 'double',
+    },
+    0xc6 => {
+        Name => 'CropOutputWidth',
+        Format => 'double',
+    },
+    0xce => {
+        Name => 'CropOutputHeight',
+        Format => 'double',
+    },
+    0xd6 => {
+        Name => 'CropOutputPixels',
+        Format => 'double',
+    },
+);
+
+%Image::ExifTool::NikonCapture::PictureCtrl = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FORMAT => 'int8u',
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    0x00 => {
+        Name => 'PictureControlActive',
+        PrintConv => \%offOn,
+    },
+    0x13 => {
+        Name => 'PictureControlMode',
+        Format => 'string[16]',
+    },
+    # 0x29 changes with Hue and Sharpening
+    0x2a => {
+        Name => 'QuickAdjust',
+        ValueConv => '$val - 128',
+        ValueConvInv => '$val + 128',
+    },
+    0x2b => {
+        Name => 'SharpeningAdj',
+        ValueConv => '$val ? $val - 128 : "Auto"',
+        ValueConvInv => '$val=~/\d/ ? $val + 128 : 0',
+    },
+    0x2c => {
+        Name => 'ContrastAdj',
+        ValueConv => '$val ? $val - 128 : "Auto"',
+        ValueConvInv => '$val=~/\d/ ? $val + 128 : 0',
+    },
+    0x2d => {
+        Name => 'BrightnessAdj',
+        ValueConv => '$val ? $val - 128 : "Auto"', # no "Auto" mode (yet) for this setting
+        ValueConvInv => '$val=~/\d/ ? $val + 128 : 0',
+    },
+    0x2e => {
+        Name => 'SaturationAdj',
+        ValueConv => '$val ? $val - 128 : "Auto"',
+        ValueConvInv => '$val=~/\d/ ? $val + 128 : 0',
+    },
+    0x2f => {
+        Name => 'HueAdj',
+        ValueConv => '$val - 128',
+        ValueConvInv => '$val + 128',
+    },
+    # 0x37 changed from 0 to 2 when Picture Control is enabled (and no active DLighting)
+);
+
+%Image::ExifTool::NikonCapture::RedEyeData = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FORMAT => 'int8u',
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    0 => {
+        Name => 'RedEyeCorrection',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Automatic',
+            2 => 'Click on Eyes',
+        },
+    },
+);
+
+%Image::ExifTool::NikonCapture::Exposure = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FORMAT => 'int8u',
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    0x00 => {
+        Name => 'ExposureAdj',
+        Format => 'int16s',
+        ValueConv => '$val / 100',
+        ValueConvInv => '$val * 100',
+    },
+    0x12 => {
+        Name => 'ExposureAdj2',
+        Format => 'double',
+        PrintConv => 'sprintf("%.4f", $val)',
+        PrintConvInvn => '$val',
+    },
+    0x24 => {
+        Name => 'ActiveD-Lighting',
+        PrintConv => \%offOn,
+    },
+    0x25 => {
+        Name => 'ActiveD-LightingMode',
+        PrintConv => {
+            0 => 'Unchanged',
+            1 => 'Off',
+            2 => 'Low',
+            3 => 'Normal',
+            4 => 'High',
+            6 => 'Extra High',
+        },
+    },
+);
+
+%Image::ExifTool::NikonCapture::HighlightData = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FORMAT => 'int8s',
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    0 => 'ShadowProtection',
+    1 => 'SaturationAdj',
+    6 => 'HighlightProtection',
+);
+
+#------------------------------------------------------------------------------
+# write Nikon Capture data (ref 1)
+# Inputs: 0) ExifTool object reference, 1) reference to directory information
+#         2) pointer to tag table
+# Returns: 1 on success
+sub WriteNikonCapture($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    $exifTool or return 1;    # allow dummy access to autoload this package
+
+    # no need to edit this information unless necessary
+    unless ($exifTool->{EDIT_DIRS}->{MakerNotes} or $exifTool->{EDIT_DIRS}->{IPTC}) {
+        return undef;
+    }
+    my $dataPt = $$dirInfo{DataPt};
+    my $dirStart = $$dirInfo{DirStart};
+    my $dirLen = $$dirInfo{DirLen};
+    if ($dirLen < 22) {
+        $exifTool->Warn('Short Nikon Capture Data',1);
+        return undef;
+    }
+    # make sure the capture data is properly contained
+    SetByteOrder('II');
+    my $tagID = Get32u($dataPt, $dirStart);
+    # sometimes size includes 18 header bytes, and other times it doesn't (ie. ViewNX 2.1.1)
+    my $size = Get32u($dataPt, $dirStart + 18);
+    my $pad = $dirLen - $size - 18; 
+    unless ($tagID == 0x7a86a940 and ($pad >= 0 or $pad == -18)) {
+        $exifTool->Warn('Unrecognized Nikon Capture Data header');
+        return undef;
+    }
+    # determine if there is any data after this block
+    if ($pad > 0) {
+        $pad = substr($$dataPt, $dirStart + 18 + $size, $pad);
+        $dirLen = $size + 18;
+    } else {
+        $pad = '';
+    }
+    my $outBuff = '';
+    my $pos;
+    my $newTags = $exifTool->GetNewTagInfoHash($tagTablePtr);
+    my $dirEnd = $dirStart + $dirLen;
+
+    # loop through all entries in the Nikon Capture data
+    for ($pos=$dirStart+22; $pos+22<$dirEnd; $pos+=22+$size) {
+        $tagID = Get32u($dataPt, $pos);
+        $size = Get32u($dataPt, $pos + 18) - 4;
+        last if $size < 0 or $pos + 22 + $size > $dirEnd;
+        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tagID);
+        if ($tagInfo) {
+            my $newVal;
+            if ($$tagInfo{SubDirectory}) {
+                # rewrite the subdirectory
+                my %subdirInfo = (
+                    DataPt => $dataPt,
+                    DirStart => $pos + 22,
+                    DirLen => $size,
+                );
+                my $subTable = GetTagTable($tagInfo->{SubDirectory}->{TagTable});
+                # ignore minor errors in IPTC since there is typically trailing garbage
+                my $oldSetting = $exifTool->Options('IgnoreMinorErrors');
+                $$tagInfo{Name} =~ /IPTC/ and $exifTool->Options(IgnoreMinorErrors => 1);
+                # rewrite the directory
+                $newVal = $exifTool->WriteDirectory(\%subdirInfo, $subTable);
+                # restore our original options
+                $exifTool->Options(IgnoreMinorErrors => $oldSetting);
+            } elsif ($$newTags{$tagID}) {
+                # get new value for this tag if we are writing it
+                my $format = $$tagInfo{Format} || $$tagInfo{Writable};
+                my $oldVal = ReadValue($dataPt,$pos+22,$format,1,$size);
+                my $nvHash = $exifTool->GetNewValueHash($tagInfo);
+                if (Image::ExifTool::IsOverwriting($nvHash, $oldVal)) {
+                    my $val = $exifTool->GetNewValues($tagInfo);
+                    $newVal = WriteValue($val, $$tagInfo{Writable}) if defined $val;
+                    if (defined $newVal and length $newVal) {
+                        ++$exifTool->{CHANGED};
+                    } else {
+                        undef $newVal;
+                        $exifTool->Warn("Can't delete $$tagInfo{Name}");
+                    }
+                }
+            }
+            if (defined $newVal) {
+                next unless length $newVal; # don't write zero length information
+                # write the new value
+                $outBuff .= substr($$dataPt, $pos, 18);
+                $outBuff .= Set32u(length($newVal) + 4);
+                $outBuff .= $newVal;
+                next;
+            }
+        }
+        # rewrite the existing information
+        $outBuff .= substr($$dataPt, $pos, 22 + $size);
+    }
+    unless ($pos == $dirEnd) {
+        if ($pos == $dirEnd - 4) {
+            # it seems that sometimes (NX2) the main block size is wrong by 4 bytes
+            # (did they forget to include the size word?)
+            $outBuff .= substr($$dataPt, $pos, 4);
+        } else {
+            $exifTool->Warn('Nikon Capture Data improperly terminated',1);
+            return undef;
+        }
+    }
+    # add the header and return the new directory
+    return substr($$dataPt, $dirStart, 18) .
+           Set32u(length($outBuff) + 4) .
+           $outBuff . $pad;
+}
+
+#------------------------------------------------------------------------------
+# process Nikon Capture data (ref 1)
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessNikonCaptureEditVersions($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dirStart = $$dirInfo{DirStart};
+    my $dirLen = $$dirInfo{DirLen};
+    my $dirEnd = $dirStart + $dirLen;
+    my $verbose = $exifTool->Options('Verbose');
+    SetByteOrder('II');
+    return 0 unless $dirLen > 4;
+    my $num = Get32u($dataPt, $dirStart);
+    my $pos = $dirStart + 4;
+    $verbose and $exifTool->VerboseDir('NikonCaptureEditVersions', $num);
+    while ($num) {
+        last if $pos + 4 > $dirEnd;
+        my $len = Get32u($dataPt, $pos);
+        last if $pos + $len + 4 > $dirEnd;
+        my %dirInfo = (
+            DirName  => 'NikonCapture',
+            Parent   => 'NikonCaptureEditVersions',
+            DataPt   => $dataPt,
+            DirStart => $pos + 4,
+            DirLen   => $len,
+        );
+        $$exifTool{DOC_NUM} = ++$$exifTool{DOC_COUNT};
+        $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+        --$num;
+        $pos += $len + 4;
+    }
+    delete $$exifTool{DOC_NUM};
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# process Nikon Capture data (ref 1)
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessNikonCapture($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dirStart = $$dirInfo{DirStart};
+    my $dirLen = $$dirInfo{DirLen};
+    my $dirEnd = $dirStart + $dirLen;
+    my $verbose = $exifTool->Options('Verbose');
+    my $success = 0;
+    SetByteOrder('II');
+    $verbose and $exifTool->VerboseDir('NikonCapture', 0, $dirLen);
+    my $pos;
+    for ($pos=$dirStart+22; $pos+22<$dirEnd; ) {
+        my $tagID = Get32u($dataPt, $pos);
+        my $size = Get32u($dataPt, $pos + 18) - 4;
+        $pos += 22;
+        last if $size < 0 or $pos + $size > $dirEnd;
+        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tagID);
+        if ($tagInfo or $verbose) {
+            my ($format, $value);
+            # (note that Writable will be 0 for Unknown tags)
+            $tagInfo and $format = ($$tagInfo{Format} || $$tagInfo{Writable});
+            # generate a reasonable default format type for short values
+            if (not $format and ($size == 1 or $size == 2 or $size == 4)) {
+                $format = 'int' . ($size * 8) . 'u';
+            }
+            if ($format) {
+                my $count = 1;
+                if ($format eq 'string' or $format eq 'undef') {
+                    # patch Nikon bug in size of some values (HistogramXML)
+                    $size += $$tagInfo{AdjustSize} if $tagInfo and $$tagInfo{AdjustSize};
+                    $count = $size;
+                }
+                $value = ReadValue($dataPt,$pos,$format,$count,$size);
+            } elsif ($size == 1) {
+                $value = substr($$dataPt, $pos, $size);
+            }
+            $exifTool->HandleTag($tagTablePtr, $tagID, $value,
+                DataPt => $dataPt,
+                Start  => $pos,
+                Size   => $size,
+            ) and $success = 1;
+        }
+        $pos += $size;
+    }
+    return $success;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::NikonCapture - Read/write Nikon Capture information
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This module contains routines to read and write Nikon Capture information in
+the maker notes of NEF images.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.cybercom.net/~dcoffin/dcraw/>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/NikonCapture Tags>,
+L<Image::ExifTool::TagNames/Nikon Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/NikonCustom.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/NikonCustom.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/NikonCustom.pm	(revision 24799)
@@ -0,0 +1,3724 @@
+#------------------------------------------------------------------------------
+# File:         NikonCustom.pm
+#
+# Description:  Read and write Nikon Custom settings
+#
+# Revisions:    2009/11/25 - P. Harvey Created
+#
+# References:   1) Warren Hatch private communication (D3 with SB-800 and SB-900)
+#               2) Anonymous contribution 2011/05/25 (D700, D7000)
+#              JD) Jens Duttke private communication
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::NikonCustom;
+
+use strict;
+use vars qw($VERSION);
+
+$VERSION = '1.06';
+
+# custom settings for the D80 (encrypted) - ref JD
+%Image::ExifTool::NikonCustom::SettingsD80 = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'Custom settings for the Nikon D80.',
+    0.1 => { # CS1
+        Name => 'Beep',
+        Mask => 0x80,
+        PrintConv => {
+            0x00 => 'On',
+            0x80 => 'Off',
+        },
+    },
+    0.2 => { # CS4
+        Name => 'AFAssist',
+        Mask => 0x40,
+        PrintConv => {
+            0x00 => 'On',
+            0x40 => 'Off',
+        },
+    },
+    0.3 => { # CS5
+        Name => 'NoMemoryCard',
+        Mask => 0x20,
+        PrintConv => {
+            0x00 => 'Release Locked',
+            0x20 => 'Enable Release',
+        },
+    },
+    0.4 => { # CS6
+        Name => 'ImageReview',
+        Mask => 0x10,
+        PrintConv => {
+            0x00 => 'On',
+            0x10 => 'Off',
+        },
+    },
+    0.5 => { # CS17
+        Name => 'Illumination',
+        Mask => 0x08,
+        PrintConv => {
+            0x00 => 'Off',
+            0x08 => 'On',
+        },
+    },
+    0.6 => { # CS11
+        Name => 'MainDialExposureComp',
+        Mask => 0x04,
+        PrintConv => {
+            0x00 => 'Off',
+            0x04 => 'On',
+        },
+    },
+    0.7 => { # CS10
+        Name => 'EVStepSize',
+        Mask => 0x01,
+        PrintConv => {
+            0x00 => '1/3 EV',
+            0x01 => '1/2 EV',
+        },
+    },
+    1.1 => { # CS7
+        Name => 'AutoISO',
+        Mask => 0x40,
+        PrintConv => {
+            0x00 => 'Off',
+            0x40 => 'On',
+        },
+    },
+    1.2 => { # CS7-a
+        Name => 'AutoISOMax',
+        Mask => 0x30,
+        PrintConv => {
+            0x00 => 200,
+            0x10 => 400,
+            0x20 => 800,
+            0x30 => 1600,
+        },
+    },
+    1.3 => { # CS7-b
+        Name => 'AutoISOMinShutterSpeed',
+        Mask => 0x0f,
+        PrintConvColumns => 2,
+        PrintConv => {
+            0x00 => '1/125 s',
+            0x01 => '1/100 s',
+            0x02 => '1/80 s',
+            0x03 => '1/60 s',
+            0x04 => '1/40 s',
+            0x05 => '1/30 s',
+            0x06 => '1/15 s',
+            0x07 => '1/8 s',
+            0x08 => '1/4 s',
+            0x09 => '1/2 s',
+            0x0a => '1 s',
+        },
+    },
+    2.1 => { # CS13
+        Name => 'AutoBracketSet',
+        Mask => 0xc0,
+        PrintConv => {
+            0x00 => 'AE & Flash',
+            0x40 => 'AE Only',
+            0x80 => 'Flash Only',
+            0xc0 => 'WB Bracketing',
+        },
+    },
+    2.2 => { # CS14
+        Name => 'AutoBracketOrder',
+        Mask => 0x20,
+        PrintConv => {
+            0x00 => '0,-,+',
+            0x20 => '-,0,+',
+        },
+    },
+    3.1 => { # CS27
+        Name => 'MonitorOffTime',
+        Mask => 0xe0,
+        PrintConv => {
+            0x00 => '5 s',
+            0x20 => '10 s',
+            0x40 => '20 s',
+            0x60 => '1 min',
+            0x80 => '5 min',
+            0xa0 => '10 min',
+        },
+    },
+    3.2 => { # CS28
+        Name => 'MeteringTime',
+        Mask => 0x1c,
+        PrintConv => {
+            0x00 => '4 s',
+            0x04 => '6 s',
+            0x08 => '8 s',
+            0x0c => '16 s',
+            0x10 => '30 s',
+            0x14 => '30 min',
+        },
+    },
+    3.3 => { # CS29
+        Name => 'SelfTimerTime',
+        Mask => 0x03,
+        PrintConv => {
+            0x00 => '2 s',
+            0x01 => '5 s',
+            0x02 => '10 s',
+            0x03 => '20 s',
+        },
+    },
+    4.1 => { # CS18
+        Name => 'AELockButton',
+        Mask => 0x1e,
+        PrintConv => {
+            0x00 => 'AE/AF Lock',
+            0x02 => 'AE Lock Only',
+            0x04 => 'AF Lock Only',
+            0x06 => 'AE Lock (hold)',
+            0x08 => 'AF-ON',
+            0x0a => 'FV Lock',
+            0x0c => 'Focus Area Selection',
+            0x0e => 'AE-L/AF-L/AF Area',
+            0x10 => 'AE-L/AF Area',
+            0x12 => 'AF-L/AF Area',
+            0x14 => 'AF-ON/AF Area',
+        },
+    },
+    4.2 => { # CS19
+        Name => 'AELock',
+        Mask => 0x01,
+        PrintConv => {
+            0x00 => 'Off',
+            0x01 => 'On',
+        },
+    },
+    4.3 => { # CS30
+        Name => 'RemoteOnDuration',
+        Mask => 0xc0,
+        PrintConv => {
+            0x00 => '1 min',
+            0x40 => '5 min',
+            0x80 => '10 min',
+            0xc0 => '15 min',
+        },
+    },
+    5.1 => { # CS15
+        Name => 'CommandDials',
+        Mask => 0x80,
+        PrintConv => {
+            0x00 => 'Standard (Main Shutter, Sub Aperture)',
+            0x80 => 'Reversed (Main Aperture, Sub Shutter)',
+        },
+    },
+    5.2 => { # CS16
+        Name => 'FunctionButton',
+        Mask => 0x78,
+        PrintConv => {
+            0x00 => 'ISO Display',
+            0x08 => 'Framing Grid',
+            0x10 => 'AF-area Mode',
+            0x18 => 'Center AF Area',
+            0x20 => 'FV Lock',
+            0x28 => 'Flash Off',
+            0x30 => 'Matrix Metering',
+            0x38 => 'Center-weighted',
+            0x40 => 'Spot Metering',
+        },
+    },
+    6.1 => { # CS8
+        Name => 'GridDisplay',
+        Mask => 0x80,
+        PrintConv => {
+            0x00 => 'Off',
+            0x80 => 'On',
+        },
+    },
+    6.2 => { # CS9
+        Name => 'ViewfinderWarning',
+        Mask => 0x40,
+        PrintConv => {
+            0x00 => 'On',
+            0x40 => 'Off',
+        },
+    },
+    6.3 => { # CS12
+        Name => 'CenterWeightedAreaSize',
+        Mask => 0x0c,
+        PrintConv => {
+            0x00 => '6 mm',
+            0x04 => '8 mm',
+            0x08 => '10 mm',
+        },
+    },
+    6.4 => { # CS31
+        Name => 'ExposureDelayMode',
+        Mask => 0x20,
+        PrintConv => {
+            0x00 => 'Off',
+            0x20 => 'On',
+        },
+    },
+    6.5 => { # CS32
+        Name => 'MB-D80Batteries',
+        Mask => 0x03,
+        PrintConv => {
+            0x00 => 'LR6 (AA Alkaline)',
+            0x01 => 'HR6 (AA Ni-MH)',
+            0x02 => 'FR6 (AA Lithium)',
+            0x03 => 'ZR6 (AA Ni-Mg)',
+        },
+    },
+    7.1 => { # CS23
+        Name => 'FlashWarning',
+        Mask => 0x80,
+        PrintConv => {
+            0x00 => 'On',
+            0x80 => 'Off',
+        },
+    },
+    7.2 => { # CS24
+        Name => 'FlashShutterSpeed',
+        Mask => 0x78,
+        ValueConv => '2 ** (($val >> 3) - 6)',
+        ValueConvInv => '$val>0 ? int(log($val)/log(2)+6+0.5) << 3 : 0',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    7.3 => { # CS25
+        Name => 'AutoFP',
+        Mask => 0x04,
+        PrintConv => {
+            0x00 => 'Off',
+            0x04 => 'On',
+        },
+    },
+    7.4 => { # CS26
+        Name => 'ModelingFlash',
+        Mask => 0x02,
+        PrintConv => {
+            0x00 => 'Off',
+            0x02 => 'On',
+        },
+    },
+    8.1 => { # CS22
+        Name => 'InternalFlash',
+        Mask => 0xc0,
+        PrintConv => {
+            0x00 => 'TTL',
+            0x40 => 'Manual',
+            0x80 => 'Repeating Flash',
+            0xc0 => 'Commander Mode',
+        },
+    },
+    8.2 => { # CS22-a
+        Name => 'ManualFlashOutput',
+        Mask => 0x07,
+        ValueConv => '2 ** (-$val)',
+        ValueConvInv => '$val > 0 ? -log($val)/log(2) : 0',
+        PrintConv => q{
+            return 'Full' if $val > 0.99;
+            Image::ExifTool::Exif::PrintExposureTime($val);
+        },
+        PrintConvInv => '$val=~/F/i ? 1 : Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    9.1 => { # CS22-b
+        Name => 'RepeatingFlashOutput',
+        Mask => 0x70,
+        ValueConv => '2 ** (-($val>>4)-2)',
+        ValueConvInv => '$val > 0 ? int(-log($val)/log(2)-2+0.5)<<4 : 0',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    9.2 => { # CS22-c
+        Name => 'RepeatingFlashCount',
+        Mask => 0x0f,
+        ValueConv => '$val < 10 ? $val + 1 : 5 * ($val - 7)',
+        ValueConvInv => '$val <= 10 ? $val - 1 : $val / 5 + 7',
+    },
+    10.1 => { # CS22-d
+        Name => 'RepeatingFlashRate',
+        Mask => 0xf0,
+        ValueConv => 'my $v=($val>>4); $v < 10 ? $v + 1 : 10 * ($v - 8)',
+        ValueConvInv => 'int(($val <= 10 ? $val - 1 : $val / 10 + 8) + 0.5) << 4',
+        PrintConv => '"$val Hz"',
+        PrintConvInv => '$val=~/(\d+)/; $1 || 0',
+    },
+    10.2 => { # CS22-n
+        Name => 'CommanderChannel',
+        Mask => 0x03,
+        ValueConv => '$val + 1',
+        ValueConvInv => '$val - 1',
+    },
+    11.1 => { # CS22-e
+        Name => 'CommanderInternalFlash',
+        Mask => 0xc0,
+        PrintConv => {
+            0x00 => 'TTL',
+            0x40 => 'Manual',
+            0x80 => 'Off',
+        },
+    },
+    11.2 => { # CS22-h
+        Name => 'CommanderGroupAMode',
+        Mask => 0x30,
+        PrintConv => {
+            0x00 => 'TTL',
+            0x10 => 'Auto Aperture',
+            0x20 => 'Manual',
+            0x30 => 'Off',
+        },
+    },
+    11.3 => { # CS22-k
+        Name => 'CommanderGroupBMode',
+        Mask => 0x0c,
+        PrintConv => {
+            0x00 => 'TTL',
+            0x04 => 'Auto Aperture',
+            0x08 => 'Manual',
+            0x0c => 'Off',
+        },
+    },
+    12.1 => { # CS22-f
+        Name => 'CommanderInternalTTLComp',
+        Mask => 0x1f,
+        ValueConv => '($val - 9) / 3',
+        ValueConvInv => '$val * 3 + 9',
+        PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
+        PrintConvInv => '$val',
+    },
+    12.2 => { # CS22-g
+        Name => 'CommanderInternalManualOutput',
+        Mask => 0xe0,
+        ValueConv => '2 ** (-($val>>5))',
+        ValueConvInv => '$val > 0 ? int(-log($val)/log(2)+0.5) << 5 : 0',
+        PrintConv => q{
+            return 'Full' if $val > 0.99;
+            Image::ExifTool::Exif::PrintExposureTime($val);
+        },
+        PrintConvInv => '$val=~/F/i ? 1 : Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    13.1 => { # CS22-i
+        Name => 'CommanderGroupA_TTL-AAComp',
+        Mask => 0x1f,
+        ValueConv => '($val - 9) / 3',
+        ValueConvInv => '$val * 3 + 9',
+        PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
+        PrintConvInv => '$val',
+    },
+    13.2 => { # CS22-j
+        Name => 'CommanderGroupAManualOutput',
+        Mask => 0xe0,
+        ValueConv => '2 ** (-($val>>5))',
+        ValueConvInv => '$val > 0 ? int(-log($val)/log(2)+0.5) << 5 : 0',
+        PrintConv => q{
+            return 'Full' if $val > 0.99;
+            Image::ExifTool::Exif::PrintExposureTime($val);
+        },
+        PrintConvInv => '$val=~/F/i ? 1 : Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    14.1 => { # CS22-l
+        Name => 'CommanderGroupB_TTL-AAComp',
+        Mask => 0x1f,
+        ValueConv => '($val - 9) / 3',
+        ValueConvInv => '$val * 3 + 9',
+        PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
+        PrintConvInv => '$val',
+    },
+    14.2 => { # CS22-m
+        Name => 'CommanderGroupBManualOutput',
+        Mask => 0xe0,
+        ValueConv => '2 ** (-($val>>5))',
+        ValueConvInv => '$val > 0 ? int(-log($val)/log(2)+0.5) << 5 : 0',
+        PrintConv => q{
+            return 'Full' if $val > 0.99;
+            Image::ExifTool::Exif::PrintExposureTime($val);
+        },
+        PrintConvInv => '$val=~/F/i ? 1 : Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    15.1 => { # CS3
+        Name => 'CenterAFArea',
+        Mask => 0x80,
+        PrintConv => {
+            0x00 => 'Normal Zone',
+            0x80 => 'Wide Zone',
+        },
+    },
+    15.2 => { # CS20
+        Name => 'FocusAreaSelection',
+        Mask => 0x04,
+        PrintConv => {
+            0x00 => 'No Wrap',
+            0x04 => 'Wrap',
+        },
+    },
+    15.3 => { # CS21
+        Name => 'AFAreaIllumination',
+        Mask => 0x03,
+        PrintConv => {
+            0x00 => 'Auto',
+            0x01 => 'Off',
+            0x02 => 'On',
+        },
+    },
+    16.1 => { # CS2
+        Name => 'AFAreaModeSetting',
+        Mask => 0xc0,
+        PrintConv => {
+            0x00 => 'Single Area',
+            0x40 => 'Dynamic Area',
+            0x80 => 'Auto-area',
+        },
+    },
+);
+
+# custom settings for the D40 (encrypted) - ref JD
+%Image::ExifTool::NikonCustom::SettingsD40 = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'Custom settings for the Nikon D40.',
+    0.1 => { # CS1
+        Name => 'Beep',
+        Mask => 0x80,
+        PrintConv => {
+            0x00 => 'On',
+            0x80 => 'Off',
+        },
+    },
+    0.2 => { # CS9
+        Name => 'AFAssist',
+        Mask => 0x40,
+        PrintConv => {
+            0x00 => 'On',
+            0x40 => 'Off',
+        },
+    },
+    0.3 => { # CS6
+        Name => 'NoMemoryCard',
+        Mask => 0x20,
+        PrintConv => {
+            0x00 => 'Release Locked',
+            0x20 => 'Enable Release',
+        },
+    },
+    0.4 => { # CS7
+        Name => 'ImageReview',
+        Mask => 0x10,
+        PrintConv => {
+            0x00 => 'On',
+            0x10 => 'Off',
+        },
+    },
+    1.1 => { # CS10-a
+        Name => 'AutoISO',
+        Mask => 0x80,
+        PrintConv => {
+            0x00 => 'Off',
+            0x80 => 'On',
+        },
+    },
+    1.2 => { # CS10-b
+        Name => 'AutoISOMax',
+        Mask => 0x30,
+        PrintConv => {
+            0x10 => 400,
+            0x20 => 800,
+            0x30 => 1600,
+        },
+    },
+    1.3 => { # CS10-c
+        Name => 'AutoISOMinShutterSpeed',
+        Mask => 0x07,
+        PrintConvColumns => 2,
+        PrintConv => {
+            0x00 => '1/125 s',
+            0x01 => '1/60 s',
+            0x02 => '1/30 s',
+            0x03 => '1/15 s',
+            0x04 => '1/8 s',
+            0x05 => '1/4 s',
+            0x06 => '1/2 s',
+            0x07 => '1 s',
+        },
+    },
+    2.1 => { # CS15-b
+        Name => 'ImageReviewTime',
+        Mask => 0x07,
+        PrintConv => {
+            0x00 => '4 s',
+            0x01 => '8 s',
+            0x02 => '20 s',
+            0x03 => '1 min',
+            0x04 => '10 min',
+        },
+    },
+    3.1 => { # CS15-a
+        Name => 'MonitorOffTime',
+        Mask => 0xe0,
+        PrintConv => {
+            0x00 => '4 s',
+            0x20 => '8 s',
+            0x40 => '20 s',
+            0x60 => '1 min',
+            0x80 => '10 min',
+        },
+    },
+    3.2 => { # CS15-c
+        Name => 'MeteringTime',
+        Mask => 0x1c,
+        PrintConv => {
+            0x00 => '4 s',
+            0x04 => '8 s',
+            0x08 => '20 s',
+            0x0c => '1 min',
+            0x10 => '30 min',
+        },
+    },
+    3.3 => { # CS16
+        Name => 'SelfTimerTime',
+        Mask => 0x03,
+        PrintConv => {
+            0x00 => '2 s',
+            0x01 => '5 s',
+            0x02 => '10 s',
+            0x03 => '20 s',
+        },
+    },
+    3.4 => { # CS17
+        Name => 'RemoteOnDuration',
+        Mask => 0xc0,
+        PrintConv => {
+            0x00 => '1 min',
+            0x40 => '5 min',
+            0x80 => '10 min',
+            0xc0 => '15 min',
+        },
+    },
+    4.1 => { # CS12
+        Name => 'AELockButton',
+        Mask => 0x0e,
+        PrintConv => {
+            0x00 => 'AE/AF Lock',
+            0x02 => 'AE Lock Only',
+            0x04 => 'AF Lock Only',
+            0x06 => 'AE Lock (hold)',
+            0x08 => 'AF-ON',
+        },
+    },
+    4.2 => { # CS13
+        Name => 'AELock',
+        Mask => 0x01,
+        PrintConv => {
+            0x00 => 'Off',
+            0x01 => 'On',
+        },
+    },
+    5.1 => { # CS4
+        Name => 'ShootingModeSetting',
+        Mask => 0x70,
+        PrintConv => {
+            0x00 => 'Single Frame',
+            0x10 => 'Continuous',
+            0x20 => 'Self-timer',
+            0x30 => 'Delayed Remote',
+            0x40 => 'Quick-response Remote',
+        },
+    },
+    5.2 => { # CS11
+        Name => 'TimerFunctionButton',
+        Mask => 0x07,
+        PrintConv => {
+            0x00 => 'Shooting Mode',
+            0x01 => 'Image Quality/Size',
+            0x02 => 'ISO',
+            0x03 => 'White Balance',
+            0x04 => 'Self-timer',
+        },
+    },
+    6.1 => { # CS5
+        Name => 'Metering',
+        Mask => 0x03,
+        PrintConv => {
+            0x00 => 'Matrix',
+            0x01 => 'Center-weighted',
+            0x02 => 'Spot',
+        },
+    },
+    8.1 => { # CS14-a
+        Name => 'InternalFlash',
+        Mask => 0x10,
+        PrintConv => {
+            0x00 => 'TTL',
+            0x10 => 'Manual',
+        },
+    },
+    8.2 => { # CS14-b
+        Name => 'ManualFlashOutput',
+        Mask => 0x07,
+        ValueConv => '2 ** (-$val)',
+        ValueConvInv => '$val > 0 ? -log($val)/log(2) : 0',
+        PrintConv => q{
+            return 'Full' if $val > 0.99;
+            Image::ExifTool::Exif::PrintExposureTime($val);
+        },
+        PrintConvInv => '$val=~/F/i ? 1 : Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    9 => { # CS8
+        Name => 'FlashLevel',
+        Format => 'int8s',
+        ValueConv => '$val / 6',
+        ValueConvInv => '$val * 6',
+        PrintConv => 'sprintf("%+.1f",$val)',
+        PrintConvInv => '$val',
+    },
+    10.1 => { # CS2
+        Name => 'FocusModeSetting',
+        # (may differ from FocusMode if lens switch is set to Manual)
+        Mask => 0xc0,
+        PrintConv => {
+            0x00 => 'Manual',
+            0x40 => 'AF-S',
+            0x80 => 'AF-C',
+            0xc0 => 'AF-A',
+        },
+    },
+    11.1 => { # CS3
+        Name => 'AFAreaModeSetting',
+        # (may differ from AFAreaMode for Manual focus)
+        Mask => 0x30,
+        PrintConv => {
+            0x00 => 'Single Area',
+            0x10 => 'Dynamic Area',
+            0x20 => 'Closest Subject',
+        },
+    }
+);
+
+# D90 custom settings (ref PH)
+%Image::ExifTool::NikonCustom::SettingsD90 = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'Custom settings for the D90.',
+    # Missing:
+    # CSe2 RepeatingFlashRate (needs verification)
+    #      CommanderInternalFlash, CommanderGroupAMode, CommanderGroupBMode,
+    #      CommanderChannel, CommanderInternalManualOutput,
+    #      CommanderGroupAManualOutput, CommanderGroupBManualOutput
+    #      CommanderGroupA_TTL-AAComp, CommanderGroupB_TTL-AAComp,
+    # CSe4 AutoBracketSet (some values need verification)
+    # CSf2 OKButton ("Not Used" value needs verification)
+    # CSf5-b CommandDialsChangeMainSub
+    # CSf5-c CommandDialsMenuAndPlayback
+    0.1 => { # CSf1
+        Name => 'LightSwitch',
+        Mask => 0x08,
+        PrintConv => {
+            0x00 => 'LCD Backlight',
+            0x08 => 'LCD Backlight and Shooting Information',
+        },
+    },
+    2.1 => { # CSa1
+        Name => 'AFAreaModeSetting',
+        Mask => 0x60,
+        PrintConv => {
+            0x00 => 'Single Area',
+            0x20 => 'Dynamic Area',
+            0x40 => 'Auto-area',
+            0x60 => '3D-tracking (11 points)',
+        },
+    },
+    2.2 => { # CSa2
+        Name => 'CenterFocusPoint',
+        Mask => 0x10,
+        PrintConv => {
+            0x00 => 'Normal Zone',
+            0x10 => 'Wide Zone',
+        },
+    },
+    2.3 => { # CSa3
+        Name => 'AFAssist',
+        Mask => 0x01,
+        PrintConv => { 0x00 => 'On', 0x01 => 'Off' },
+    },
+    2.4 => { # CSa4
+        Name => 'AFPointIllumination',
+        Mask => 0x06,
+        PrintConv => {
+            0x00 => 'Auto',
+            0x02 => 'On',
+            0x04 => 'Off',
+        },
+    },
+    2.5 => { # CSa5
+        Name => 'FocusPointWrap',
+        Mask => 0x08,
+        PrintConv => {
+            0x00 => 'No Wrap',
+            0x08 => 'Wrap',
+        },
+    },
+    3.1 => { # CSa6
+        Name => 'AELockForMB-D80',
+        Mask => 0x1c,
+        PrintConv => {
+            0x00 => 'AE Lock Only',
+            0x04 => 'AF Lock Only',
+            0x08 => 'AE Lock (hold)',
+            0x0c => 'AF-On',
+            0x10 => 'FV Lock',
+            0x14 => 'Focus Point Selection',
+            0x1c => 'AE/AF Lock',
+        },
+    },
+    3.2 => { # CSd12
+        Name => 'MB-D80BatteryType',
+        Mask => 0x03,
+        PrintConv => {
+            0x00 => 'LR6 (AA alkaline)',
+            0x01 => 'HR6 (AA Ni-MH)',
+            0x02 => 'FR6 (AA lithium)',
+            0x03 => 'ZR6 (AA Ni-Mn)',
+        },
+    },
+    4.1 => { # CSd1
+        Name => 'Beep',
+        Mask => 0x40,
+        PrintConv => {
+            0x40 => 'On',
+            0x00 => 'Off',
+        },
+    },
+    4.2 => { # CSd2
+        Name => 'GridDisplay',
+        Mask => 0x02,
+        PrintConv => { 0x00 => 'Off', 0x02 => 'On' },
+    },
+    4.3 => { # CSd3
+        Name => 'ISODisplay',
+        Mask => 0x0c,
+        PrintConv => {
+            0x00 => 'Show ISO/Easy ISO',
+            0x04 => 'Show ISO Sensitivity',
+            0x0c => 'Show Frame Count',
+        },
+    },
+    4.4 => { # CSd4
+        Name => 'ViewfinderWarning',
+        Mask => 0x01,
+        PrintConv => { 0x00 => 'On', 0x01 => 'Off' },
+    },
+    4.5 => { # CSf6
+        Name => 'NoMemoryCard',
+        Mask => 0x20,
+        PrintConv => {
+            0x00 => 'Release Locked',
+            0x20 => 'Enable Release',
+        },
+    },
+    5.1 => { # CSd5
+        Name => 'ScreenTips',
+        Mask => 0x04,
+        PrintConv => { 0x00 => 'Off', 0x04 => 'On' },
+    },
+    5.2 => { # CSd7
+        Name => 'FileNumberSequence',
+        Mask => 0x08,
+        PrintConv => { 0x00 => 'On', 0x08 => 'Off' },
+    },
+    5.3 => { # CSd8
+        Name => 'ShootingInfoDisplay',
+        Mask => 0xc0,
+        PrintConv => {
+            0x00 => 'Auto',
+            0x80 => 'Manual (dark on light)',
+            0xc0 => 'Manual (light on dark)',
+        },
+    },
+    5.4 => { # CSd9
+        Name => 'LCDIllumination',
+        Mask => 0x20,
+        PrintConv => { 0x00 => 'Off', 0x20 => 'On' },
+    },
+    6.1 => { # CSb2
+        Name => 'EasyExposureComp',
+        Mask => 0x01,
+        PrintConv => { 0x00 => 'Off', 0x01 => 'On' },
+    },
+    6.2 => { # CSf7
+        Name => 'ReverseIndicators',
+        Mask => 0x80,
+        PrintConv => {
+            0x00 => '+ 0 -',
+            0x80 => '- 0 +',
+        },
+    },
+    7.1 => { # CSb1
+        Name => 'ExposureControlStepSize',
+        Mask => 0x40,
+        PrintConv => {
+            0x00 => '1/3 EV',
+            0x40 => '1/2 EV',
+        },
+    },
+    8.1 => { # CSb3
+        Name => 'CenterWeightedAreaSize',
+        Mask => 0x60,
+        PrintConv => {
+            0x00 => '6 mm',
+            0x20 => '8 mm',
+            0x40 => '10 mm',
+        },
+    },
+    8.2 => { # CSb4-a
+        Name => 'FineTuneOptMatrixMetering',
+        Mask => 0x0f,
+        ValueConv => '($val > 0x7 ? $val - 0x10 : $val) / 6',
+        ValueConvInv => 'int($val*6+($val>0?0.5:-0.5)) & 0x0f',
+        PrintConv => '$val ? sprintf("%+.2f", $val) : 0',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    9.1 => { # CSb4-b
+        Name => 'FineTuneOptCenterWeighted',
+        Mask => 0xf0,
+        ValueConv => '($val > 0x70 ? $val - 0x100 : $val) / 0x60',
+        ValueConvInv => '(int($val*6+($val>0?0.5:-0.5))<<4) & 0xf0',
+        PrintConv => '$val ? sprintf("%+.2f", $val) : 0',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    9.2 => { # CSb4-c
+        Name => 'FineTuneOptSpotMetering',
+        Mask => 0x0f,
+        ValueConv => '($val > 0x7 ? $val - 0x10 : $val) / 6',
+        ValueConvInv => 'int($val*6+($val>0?0.5:-0.5)) & 0x0f',
+        PrintConv => '$val ? sprintf("%+.2f", $val) : 0',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    11.1 => { # CSd6
+        Name => 'CLModeShootingSpeed',
+        Mask => 0x07,
+        PrintConv => '"$val fps"',
+        PrintConvInv => '$val=~s/\s*fps//i; $val',
+    },
+    11.2 => { # CSd10
+        Name => 'ExposureDelayMode',
+        Mask => 0x40,
+        PrintConv => {
+            0x00 => 'Off',
+            0x40 => 'On',
+        },
+    },
+    13.1 => { # CSe4
+        Name => 'AutoBracketSet',
+        Mask => 0xe0, #(NC)
+        PrintConv => {
+            0x00 => 'AE & Flash', # default
+            0x20 => 'AE Only',
+            0x40 => 'Flash Only', #(NC)
+            0x60 => 'WB Bracketing', #(NC)
+            0x80 => 'Active D-Lighting', #(NC)
+        },
+    },
+    13.2 => { # CSe6
+        Name => 'AutoBracketOrder',
+        Mask => 0x10,
+        PrintConv => {
+            0x00 => '0,-,+',
+            0x10 => '-,0,+',
+        },
+    },
+    14.1 => { # CSf3
+        Name => 'FuncButton',
+        Mask => 0x78,
+        PrintConv => {
+            0x08 => 'Framing Grid',
+            0x10 => 'AF-area Mode',
+            0x18 => 'Center Focus Point',
+            0x20 => 'FV Lock', # default
+            0x28 => 'Flash Off',
+            0x30 => 'Matrix Metering',
+            0x38 => 'Center-weighted Metering',
+            0x40 => 'Spot Metering',
+            0x48 => 'My Menu Top',
+            0x50 => '+ NEF (RAW)',
+        },
+    },
+    16.1 => { # CSf2
+        Name => 'OKButton',
+        Mask => 0x18,
+        PrintConv => {
+            0x08 => 'Select Center Focus Point',
+            0x10 => 'Highlight Active Focus Point',
+            0x18 => 'Not Used', #(NC)
+            0x00 => 'Not Used', #(NC)
+        },
+    },
+    17.1 => { # CSf4
+        Name => 'AELockButton',
+        Mask => 0x38,
+        PrintConv => {
+            0x00 => 'AE/AF Lock',
+            0x08 => 'AE Lock Only',
+            0x10 => 'AF Lock Only', #(NC)
+            0x18 => 'AE Lock (hold)', #(NC)
+            0x20 => 'AF-ON', #(NC)
+            0x28 => 'FV Lock', #(NC)
+        },
+    },
+    18.1 => { # CSf5-a
+        Name => 'CommandDialsReverseRotation',
+        Mask => 0x80,
+        PrintConv => { 0x00 => 'No', 0x80 => 'Yes' },
+    },
+    18.2 => { # CSc1
+        Name => 'ShutterReleaseButtonAE-L',
+        Mask => 0x02,
+        PrintConv => { 0x00 => 'Off', 0x02 => 'On' },
+    },
+    19.1 => { # CSc2
+        Name => 'MeteringTime',
+        Mask => 0xf0,
+        PrintConvColumns => 2,
+        PrintConv => {
+            0x00 => '4 s',
+            0x10 => '6 s', # default
+            0x20 => '8 s',
+            0x30 => '16 s',
+            0x40 => '30 s',
+            0x50 => '1 min',
+            0x60 => '5 min',
+            0x70 => '10 min',
+            0x80 => '30 min',
+        },
+    },
+    19.2 => { # CSc5
+        Name => 'RemoteOnDuration',
+        Mask => 0x03,
+        PrintConv => {
+            0x00 => '1 min',
+            0x01 => '5 min',
+            0x02 => '10 min',
+            0x03 => '15 min',
+        },
+    },
+    20.1 => { # CSc3-a
+        Name => 'SelfTimerTime',
+        Mask => 0xc0,
+        PrintConv => {
+            0x00 => '2 s',
+            0x40 => '5 s',
+            0x80 => '10 s', # default
+            0xc0 => '20 s',
+        },
+    },
+    20.2 => { # CSc3-b
+        Name => 'SelfTimerShotCount',
+        Mask => 0x1e,
+        ValueConv => '$val >> 1',
+        ValueConvInv => '$val << 1',
+    },
+    21.1 => { # CSc4-a
+        Name => 'PlaybackMonitorOffTime',
+        Mask => 0x1c,
+        PrintConv => {
+            0x00 => '4 s',
+            0x04 => '10 s', # default
+            0x08 => '20 s',
+            0x0c => '1 min',
+            0x10 => '5 min',
+            0x14 => '10 min',
+        },
+    },
+    21.2 => { # CSc4-d
+        Name => 'ImageReviewTime',
+        Mask => 0xe0,
+        PrintConv => {
+            0x00 => '4 s', # default
+            0x20 => '10 s',
+            0x40 => '20 s',
+            0x60 => '1 min',
+            0x80 => '5 min',
+            0xa0 => '10 min',
+        },
+    },
+    22.1 => { # CSc4-b
+        Name => 'MenuMonitorOffTime',
+        Mask => 0xe0,
+        PrintConv => {
+            0x00 => '4 s',
+            0x20 => '10 s',
+            0x40 => '20 s', # default
+            0x60 => '1 min',
+            0x80 => '5 min',
+            0xa0 => '10 min',
+        },
+    },
+    22.2 => { # CSc4-c
+        Name => 'ShootingInfoMonitorOffTime',
+        Mask => 0x1c,
+        PrintConv => {
+            0x00 => '4 s',
+            0x04 => '10 s', # default
+            0x08 => '20 s',
+            0x0c => '1 min',
+            0x10 => '5 min',
+            0x14 => '10 min',
+        },
+    },
+    23.1 => { # CSe1
+        Name => 'FlashShutterSpeed',
+        Mask => 0x0f,
+        PrintConvColumns => 2,
+        PrintConv => {
+            0x00 => '1/60 s', # default
+            0x01 => '1/30 s',
+            0x02 => '1/15 s',
+            0x03 => '1/8 s',
+            0x04 => '1/4 s',
+            0x05 => '1/2 s',
+            0x06 => '1 s',
+            0x07 => '2 s',
+            0x08 => '4 s',
+            0x09 => '8 s',
+            0x0a => '15 s',
+            0x0b => '30 s',
+        },
+    },
+    24.1 => { # CSe2-a
+        Name => 'InternalFlash',
+        Mask => 0xc0,
+        PrintConv => {
+            0x00 => 'TTL',
+            0x40 => 'Manual',
+            0x80 => 'Repeating Flash',
+            0xc0 => 'Commander Mode',
+        },
+    },
+    24.2 => { # CSe2-b
+        Name => 'ManualFlashOutput',
+        Mask => 0x1f,
+        ValueConv => '2 ** (-$val/3)',
+        ValueConvInv => '$val > 0 ? -3*log($val)/log(2) : 0',
+        PrintConv => q{
+            return 'Full' if $val > 0.99;
+            Image::ExifTool::Exif::PrintExposureTime($val);
+        },
+        PrintConvInv => '$val=~/F/i ? 1 : Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    25.1 => { # CSe2-ca
+        Name => 'RepeatingFlashOutput',
+        Mask => 0x70,
+        ValueConv => '2 ** (-($val>>4)-2)',
+        ValueConvInv => '$val > 0 ? int(-log($val)/log(2)-2+0.5)<<4 : 0',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    25.2 => { # CSe2-cb
+        Name => 'RepeatingFlashCount',
+        Mask => 0x0f,
+        ValueConv => '$val < 10 ? $val + 1 : 5 * ($val - 7)',
+        ValueConvInv => '$val <= 10 ? $val - 1 : $val / 5 + 7',
+    },
+    26.1 => { # CSe2-cc (NC)
+        Name => 'RepeatingFlashRate',
+        Mask => 0xf0,
+        ValueConv => 'my $v=($val>>4); $v < 10 ? $v + 1 : 10 * ($v - 8)',
+        ValueConvInv => 'int(($val <= 10 ? $val - 1 : $val / 10 + 8) + 0.5) << 4',
+        PrintConv => '"$val Hz"',
+        PrintConvInv => '$val=~/(\d+)/; $1 || 0',
+    },
+    31.1 => { # CSd11
+        Name => 'FlashWarning',
+        Mask => 0x80,
+        PrintConv => {
+            0x00 => 'On',
+            0x80 => 'Off',
+        },
+    },
+    31.2 => { # CSe2-ea
+        Name => 'CommanderInternalTTLComp',
+        Mask => 0x1f,
+        ValueConv => '($val - 9) / 3',
+        ValueConvInv => '$val * 3 + 9',
+        PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
+        PrintConvInv => '$val',
+    },
+    31.3 => { # CSe3
+        Name => 'ModelingFlash',
+        Mask => 0x20,
+        PrintConv => { 0x00 => 'On', 0x20 => 'Off' },
+    },
+    31.4 => { # CSe5
+        Name => 'AutoFP',
+        Mask => 0x40,
+        PrintConv => {
+            0x00 => 'Off',
+            0x40 => 'On',
+        },
+    },
+    32.1 => { # CSe2-eb
+        Name => 'CommanderGroupA_TTLComp',
+        Mask => 0x1f,
+        ValueConv => '($val - 9) / 3',
+        ValueConvInv => '$val * 3 + 9',
+        PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
+        PrintConvInv => '$val',
+    },
+    33.1 => { # CSe2-ec
+        Name => 'CommanderGroupB_TTLComp',
+        Mask => 0x1f,
+        ValueConv => '($val - 9) / 3',
+        ValueConvInv => '$val * 3 + 9',
+        PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
+        PrintConvInv => '$val',
+    },
+    34.1 => { # CSa7
+        Name => 'LiveViewAF',
+        Mask => 0xc0,
+        PrintConv => {
+            0x00 => 'Face Priority', #(NC)
+            0x40 => 'Wide Area',
+            0x80 => 'Normal Area',
+        },
+    },
+);
+
+# D300 (ref JD) and D3 (ref 1/PH) custom settings
+%Image::ExifTool::NikonCustom::SettingsD3 = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'Custom settings for the D3, D3S, D3X, D300 and D300S.',
+    # these settings have been decoded using the D3 and D300, and
+    # extrapolated to the other models, but these haven't yet been
+    # verified, and the following custom settings are missing:
+    #   CSf1-d (D3X,D3S) MultiSelectorLiveView
+    #   CSf1 (D300S) LightSwitch
+    0.1 => { #1
+        Name => 'CustomSettingsBank',
+        Mask => 0x03,
+        PrintConv => {
+            0 => 'A',
+            1 => 'B',
+            2 => 'C',
+            3 => 'D',
+        },
+    },
+    0.2 => { #1
+        Name => 'CustomSettingsAllDefault',
+        Notes => '"No" if any custom setting for this bank was changed from the default',
+        Mask => 0x80,
+        PrintConv => { 0x00 => 'Yes', 0x80 => 'No' },
+    },
+    1.1 => { # CSa1
+        Name => 'AF-CPrioritySelection',
+        Mask => 0xc0,
+        PrintConv => {
+            0x00 => 'Release',
+            0x40 => 'Release + Focus',
+            0x80 => 'Focus',
+        },
+    },
+    1.2 => { # CSa2
+        Name => 'AF-SPrioritySelection',
+        Mask => 0x20,
+        PrintConv => {
+            0x00 => 'Focus',
+            0x20 => 'Release',
+        },
+    },
+    1.3 => { # CSa8
+        Name => 'AFPointSelection',
+        Mask => 0x10,
+        PrintConv => {
+            0x00 => '51 Points',
+            0x10 => '11 Points',
+        },
+    },
+    1.4 => { # CSa3
+        Name => 'DynamicAFArea',
+        Mask => 0x0c,
+        PrintConv => {
+            0x00 => '9 Points',
+            0x04 => '21 Points',
+            0x08 => '51 Points',
+            0x0c => '51 Points (3D-tracking)',
+        },
+    },
+    1.5 => { # CSa4
+        Name => 'FocusTrackingLockOn',
+        Condition => '$$self{Model} !~ /D3S\b/',
+        Notes => 'not D3S',
+        Mask => 0x03,
+        PrintConv => {
+            0x00 => 'Long',
+            0x01 => 'Normal',
+            0x02 => 'Short',
+            0x03 => 'Off',
+        },
+    },
+    2.1 => { # CSa5
+        Name => 'AFActivation',
+        Mask => 0x80,
+        PrintConv => {
+            0x00 => 'Shutter/AF-On',
+            0x80 => 'AF-On Only',
+        },
+    },
+    2.2 => { # CSa7
+        Name => 'FocusPointWrap',
+        Mask => 0x08,
+        PrintConv => {
+            0x00 => 'No Wrap',
+            0x08 => 'Wrap',
+        },
+    },
+    2.3 => [ # CSa6
+        {
+            Name => 'AFPointIllumination',
+            Condition => '$$self{Model} =~ /D3[SX]?\b/',
+            Notes => 'D3',
+            Mask => 0x60,
+            PrintConv => { 
+                0x00 => 'On in Continuous Shooting and Manual Focusing',
+                0x20 => 'On During Manual Focusing',
+                0x40 => 'On in Continuous Shooting Modes',
+                0x60 => 'Off',
+            },
+        },
+        {
+            Name => 'AFPointIllumination',
+            Notes => 'D300',
+            Mask => 0x06,
+            PrintConv => {
+                0x00 => 'Auto',
+                0x02 => 'Off',
+                0x04 => 'On',
+            },
+        },
+    ],
+    2.4 => { # CSa6-b (D3, added by firmware update)
+        Name => 'AFPointBrightness',
+        Condition => '$$self{Model} =~ /D3[SX]?\b/',
+        Notes => 'D3 only',
+        Mask => 0x06,
+        PrintConv => {
+            0x00 => 'Low',
+            0x02 => 'Normal',
+            0x04 => 'High',
+            0x06 => 'Extra High',
+        },
+    },
+    2.5 => { # CSa9 (D300)
+        Name => 'AFAssist',
+        Condition => '$$self{Model} =~ /D300S?\b/',
+        Notes => 'D300 only',
+        Mask => 0x01,
+        PrintConv => { 0x00 => 'On', 0x01 => 'Off' },
+    },
+    3.1 => { # CSa9 (D3)
+        Name => 'AFOnButton',
+        Condition => '$$self{Model} =~ /D3[SX]?\b/',
+        Notes => 'D3 only',
+        Mask => 0x07,
+        PrintConv => {
+            0 => 'AF On',
+            1 => 'AE/AF Lock',
+            2 => 'AE Lock Only',
+            3 => 'AE Lock (reset on release)',
+            4 => 'AE Lock (hold)',
+            5 => 'AF Lock Only',
+        },
+    },
+    3.2 => { # CSa10 (D3)
+        Name => 'VerticalAFOnButton',
+        Condition => '$$self{Model} =~ /D3[SX]?\b/',
+        Notes => 'D3 only',
+        Mask => 0x70,
+        PrintConv => {
+            0x00 => 'AF On',
+            0x10 => 'AE/AF Lock',
+            0x20 => 'AE Lock Only',
+            0x30 => 'AE Lock (reset on release)',
+            0x40 => 'AE Lock (hold)',
+            0x50 => 'AF Lock Only',
+            0x70 => 'Same as AF On',
+        },
+    },
+    3.3 => { # CSa10 (D300)
+        Name => 'AF-OnForMB-D10',
+        Condition => '$$self{Model} =~ /D300S?\b/',
+        Notes => 'D300 only',
+        Mask => 0x70,
+        PrintConv => {
+            0x00 => 'AF-On',
+            0x10 => 'AE/AF Lock',
+            0x20 => 'AE Lock Only',
+            0x30 => 'AE Lock (reset on release)',
+            0x40 => 'AE Lock (hold)',
+            0x50 => 'AF Lock Only',
+            0x60 => 'Same as FUNC Button',
+        },
+    },
+    4.1 => { # CSa4 (D3S)
+        Name => 'FocusTrackingLockOn',
+        Condition => '$$self{Model} =~ /D3S\b/',
+        Notes => 'D3S only',
+        Mask => 0x07,
+        PrintConv => {
+            0x00 => '5 (Long)',
+            0x01 => '4',
+            0x02 => '3 (Normal)',
+            0x03 => '2',
+            0x04 => '1 (Short)',
+            0x05 => 'Off',
+        },
+    },
+    4.2 => { # CSf7 (D3S)
+        Name => 'AssignBktButton',
+        Condition => '$$self{Model} =~ /D3S\b/',
+        Notes => 'D3S only',
+        Mask => 0x08,
+        PrintConv => {
+            0x00 => 'Auto Bracketing',
+            0x08 => 'Multiple Exposure',
+        },
+    },
+    4.3 => { # CSf1-c (D3S) (ref 1)
+        Name => 'MultiSelectorLiveView',
+        Condition => '$$self{Model} =~ /D3S\b/',
+        Notes => 'D3S only',
+        Mask => 0xc0,
+        PrintConv => {
+            0x00 => 'Reset',
+            0x40 => 'Zoom On/Off',
+            0x80 => 'Start Movie Recording',
+            0xc0 => 'Not Used',
+        },
+    },
+    4.4 => { # CSf1-c2 (D3S) (ref 1)
+        Name => 'InitialZoomLiveView',
+        Condition => '$$self{Model} =~ /D3S\b/',
+        Notes => 'D3S only',
+        Mask => 0x30,
+        PrintConv => {
+            0x00 => 'Low Magnification',
+            0x10 => 'Medium Magnification',
+            0x20 => 'High Magnification',
+        },
+    },
+    6.1 => { # CSb1
+        Name => 'ISOStepSize',
+        Mask => 0xc0,
+        PrintConv => {
+            0x00 => '1/3 EV',
+            0x40 => '1/2 EV',
+            0x80 => '1 EV',
+        },
+    },
+    6.2 => { # CSb2
+        Name => 'ExposureControlStepSize',
+        Mask => 0x30,
+        PrintConv => {
+            0x00 => '1/3 EV',
+            0x10 => '1/2 EV',
+            0x20 => '1 EV',
+        },
+    },
+    6.3 => { # CSb3
+        Name => 'ExposureCompStepSize',
+        Mask => 0x0c,
+        PrintConv => {
+            0x00 => '1/3 EV',
+            0x04 => '1/2 EV',
+            0x08 => '1 EV',
+        },
+    },
+    6.4 => { # CSb4
+        Name => 'EasyExposureCompensation',
+        Mask => 0x03,
+        PrintConv => {
+            0x00 => 'Off',
+            0x01 => 'On',
+            0x02 => 'On (auto reset)',
+        },
+    },
+    7.1 => [ # CSb5
+        {
+            Name => 'CenterWeightedAreaSize',
+            Condition => '$$self{Model} =~ /D3[SX]?\b/',
+            Notes => 'D3',
+            Mask => 0xe0,
+            PrintConv => {
+                0x00 => '8 mm',
+                0x20 => '12 mm',
+                0x40 => '15 mm',
+                0x60 => '20 mm',
+                0x80 => 'Average',
+            },
+        },
+        {
+            Name => 'CenterWeightedAreaSize',
+            Notes => 'D300',
+            Mask => 0xe0,
+            PrintConv => {
+                0x00 => '6 mm',
+                0x20 => '8 mm',
+                0x40 => '10 mm',
+                0x60 => '13 mm',
+                0x80 => 'Average',
+            },
+        },
+    ],
+    7.2 => { # CSb6-b
+        Name => 'FineTuneOptCenterWeighted',
+        Mask => 0x0f,
+        ValueConv => '($val > 0x7 ? $val - 0x10 : $val) / 6',
+        ValueConvInv => 'int($val*6+($val>0?0.5:-0.5)) & 0x0f',
+        PrintConv => '$val ? sprintf("%+.2f", $val) : 0',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    8.1 => { # CSb6-a
+        Name => 'FineTuneOptMatrixMetering',
+        Mask => 0xf0,
+        ValueConv => '($val > 0x70 ? $val - 0x100 : $val) / 0x60',
+        ValueConvInv => '(int($val*6+($val>0?0.5:-0.5))<<4) & 0xf0',
+        PrintConv => '$val ? sprintf("%+.2f", $val) : 0',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    8.2 => { # CSb6-c
+        Name => 'FineTuneOptSpotMetering',
+        Mask => 0x0f,
+        ValueConv => '($val > 0x7 ? $val - 0x10 : $val) / 6',
+        ValueConvInv => 'int($val*6+($val>0?0.5:-0.5)) & 0x0f',
+        PrintConv => '$val ? sprintf("%+.2f", $val) : 0',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    9.1 => { # CSf1-a, CSf2-a (D300S)
+        Name => 'MultiSelectorShootMode',
+        Mask => 0xc0,
+        PrintConv => {
+            0x00 => 'Select Center Focus Point',
+            0x40 => 'Highlight Active Focus Point',
+            0x80 => 'Not Used',
+        },
+    },
+    9.2 => { # CSf1-b, CSf2-b (D300S)
+        Name => 'MultiSelectorPlaybackMode',
+        Condition => '$$self{Model} !~ /D3S\b/',
+        Notes => 'all models except D3S', # (not confirmed for D3X)
+        Mask => 0x30,
+        PrintConv => {
+            0x00 => 'Thumbnail On/Off',
+            0x10 => 'View Histograms',
+            0x20 => 'Zoom On/Off',
+            0x30 => 'Choose Folder',
+        },
+    },
+    9.3 => [ # CSf1-b2, CSf2-b2 (D300S)
+        {
+            Name => 'InitialZoomSetting',
+            Condition => '$$self{Model} =~ /D3[SX]?\b/',
+            Notes => 'D3',
+            Mask => 0x0c,
+            PrintConv => { #1
+                0x00 => 'High Magnification',
+                0x04 => 'Medium Magnification',
+                0x08 => 'Low Magnification',
+            },
+        },
+        {
+            Name => 'InitialZoomSetting',
+            Notes => 'D300',
+            Mask => 0x0c,
+            PrintConv => { #JD
+                0x00 => 'Low Magnification',
+                0x04 => 'Medium Magnification',
+                0x08 => 'High Magnification',
+            },
+        },
+    ],
+    9.4 => { # CSf2 (D300,D3), CSf3 (D300S)
+        Name => 'MultiSelector',
+        Mask => 0x01,
+        PrintConv => {
+            0x00 => 'Do Nothing',
+            0x01 => 'Reset Meter-off Delay',
+        },
+    },
+    10.1 => { # CSd9 (D300,D3S), CSd10 (D300S), CSd8 (D3)
+        Name => 'ExposureDelayMode',
+        Mask => 0x40,
+        PrintConv => { 0x00 => 'Off', 0x40 => 'On' },
+    },
+    10.2 => { # CSd4 (D300), CDs5 (D300S), CSd2-a (D3)
+        Name => 'CLModeShootingSpeed',
+        Mask => 0x07,
+        PrintConv => '"$val fps"',
+        PrintConvInv => '$val=~s/\s*fps//i; $val',
+    },
+    10.3 => { # (D3 CSd2-b)
+        Name => 'CHModeShootingSpeed',
+        Condition => '$$self{Model} =~ /D3[SX]?\b/',
+        Notes => 'D3 only',
+        Mask => 0x30,
+        PrintConv => {
+            0x00 => '9 fps',
+            0x10 => '10 fps',
+            0x20 => '11 fps',
+        },
+    },
+    11 => { # CSd5 (D300), CSd6 (D300S), CSd3 (D3)
+        Name => 'MaxContinuousRelease',
+        # values: 1-100 (D300), 1-130 (D3)
+    },
+    12.1 => { # CSf10, CSf11 (D3S,D300S)
+        Name => 'ReverseIndicators',
+        Mask => 0x20,
+        PrintConv => {
+            0x00 => '+ 0 -',
+            0x20 => '- 0 +',
+        },
+    },
+    12.2 => [ # CSd6 (D300), CSd7 (D300S), CSd4 (D3)
+        {
+            Name => 'FileNumberSequence',
+            Condition => '$$self{Model} =~ /D3[SX]?\b/',
+            Notes => 'D3',
+            Mask => 0x02,
+            PrintConv => { 0x00 => 'On', 0x02 => 'Off' },
+        },
+        {
+            Name => 'FileNumberSequence',
+            Notes => 'D300',
+            Mask => 0x08,
+            PrintConv => { 0x00 => 'On', 0x08 => 'Off' },
+        },
+    ],
+    12.3 => { # CSd5-a (D3)
+        Name => 'RearDisplay',
+        Condition => '$$self{Model} =~ /D3[SX]?\b/',
+        Notes => 'D3 only',
+        Mask => 0x80,
+        PrintConv => {
+            0x00 => 'ISO',
+            0x80 => 'Exposures Remaining',
+        },
+    },
+    12.4 => { # CSd5-b (D3)
+        Name => 'ViewfinderDisplay',
+        Condition => '$$self{Model} =~ /D3[SX]?\b/',
+        Notes => 'D3 only',
+        Mask => 0x40,
+        PrintConv => {
+            0x00 => 'Frame Count',
+            0x40 => 'Exposures Remaining',
+        },
+    },
+    12.5 => { # CSd11 (D300), CSd12 (D300S)
+        Name => 'BatteryOrder',
+        Condition => '$$self{Model} =~ /D300S?\b/',
+        Notes => 'D300 only',
+        Mask => 0x04,
+        PrintConv => {
+            0x00 => 'MB-D10 First',
+            0x04 => 'Camera Battery First',
+        },
+    },
+    12.6 => { # CSd10 (D300), CSd11 (D300S)
+        Name => 'MB-D10Batteries',
+        Condition => '$$self{Model} =~ /D300S?\b/',
+        Notes => 'D300 only',
+        Mask => 0x03,
+        PrintConv => {
+            0x00 => 'LR6 (AA alkaline)',
+            0x01 => 'HR6 (AA Ni-MH)',
+            0x02 => 'FR6 (AA lithium)',
+            0x03 => 'ZR6 (AA Ni-Mn)',
+        },
+    },
+    12.7 => { # CSd7 (D3S), CSd4, (D300S)
+        Name => 'ScreenTips',
+        Condition => '$$self{Model} =~ /(D3S|D300S)\b/',
+        Mask => 0x10,
+        PrintConv => {
+            0x00 => 'On',
+            0x10 => 'Off',
+        },
+    },
+    13.1 => { # CSd1
+        Name => 'Beep',
+        Mask => 0xc0,
+        PrintConv => {
+            0x00 => 'High',
+            0x40 => 'Low',
+            0x80 => 'Off',
+        },
+    },
+    13.2 => { # CSd7 (D300), CSd8 (D300S), CSd6 (D3)
+        Name => 'ShootingInfoDisplay',
+        Mask => 0x30,
+        PrintConv => {
+            0x00 => 'Auto', #JD (D300)
+            0x10 => 'Auto', #1 (D3)
+            0x20 => 'Manual (dark on light)',
+            0x30 => 'Manual (light on dark)',
+        },
+    },
+    13.3 => { # CSd2 (D300)
+        Name => 'GridDisplay',
+        Condition => '$$self{Model} =~ /D300S?\b/',
+        Notes => 'D300 only',
+        Mask => 0x02,
+        PrintConv => { 0x00 => 'Off', 0x02 => 'On' },
+    },
+    13.4 => { # CSd3 (D300)
+        Name => 'ViewfinderWarning',
+        Condition => '$$self{Model} =~ /D300S?\b/',
+        Notes => 'D300 only',
+        Mask => 0x01,
+        PrintConv => { 0x00 => 'On', 0x01 => 'Off' },
+    },
+    13.5 => { # CSf1-b (D3S) (ref 1)
+        Name => 'MultiSelectorPlaybackMode',
+        Condition => '$$self{Model} =~ /D3S\b/',
+        Notes => 'D3S only',
+        Mask => 0x03,
+        PrintConv => {
+            0x00 => 'Thumbnail On/Off',
+            0x01 => 'View Histograms',
+            0x02 => 'Zoom On/Off',
+        },
+    },
+    14.1 => [ # CSf5-a (ref 1), CSf6-a (D300S)
+        {
+            Name => 'PreviewButton',
+            Condition => '$$self{Model} =~ /D3[SX]?\b/',
+            Notes => 'D3',
+            Mask => 0xf8,
+            PrintConv => {
+                0x00 => 'None',
+                0x08 => 'Preview',
+                0x10 => 'FV Lock',
+                0x18 => 'AE/AF Lock',
+                0x20 => 'AE Lock Only',
+                0x28 => 'AE Lock (reset on release)',
+                0x30 => 'AE Lock (hold)',
+                0x38 => 'AF Lock Only',
+                0x40 => 'Flash Off',
+                0x48 => 'Bracketing Burst',
+                0x50 => 'Matrix Metering',
+                0x58 => 'Center-weighted Metering',
+                0x60 => 'Spot Metering',
+                0x68 => 'Virtual Horizon',
+                # 0x70 not used
+                0x78 => 'Playback',
+                0x80 => 'My Menu Top',
+            },
+        },
+        { #PH
+            Name => 'FuncButton',
+            Notes => 'D300',
+            Mask => 0xf8,
+            PrintConv => {
+                0x00 => 'None',
+                0x08 => 'Preview',
+                0x10 => 'FV Lock',
+                0x18 => 'AE/AF Lock',
+                0x20 => 'AE Lock Only',
+                0x28 => 'AE Lock (reset on release)',
+                0x30 => 'AE Lock (hold)',
+                0x38 => 'AF Lock Only',
+                # 0x40 not used
+                0x48 => 'Flash Off',
+                0x50 => 'Bracketing Burst',
+                0x58 => 'Matrix Metering',
+                0x60 => 'Center-weighted Metering',
+                0x68 => 'Spot Metering',
+                0x70 => 'Playback', #PH (guess)
+                0x78 => 'My Menu Top', #PH (guess)
+                0x80 => '+ NEF (RAW)', #PH (guess)
+            },
+        },
+    ],
+    14.2 => [ # CSf5-b (PH,NC), CSf6-b (D300S)
+        {
+            Name => 'PreviewButtonPlusDials',
+            Condition => '$$self{Model} =~ /D3[SX]?\b/',
+            Notes => 'D3',
+            Mask => 0x07,
+            PrintConv => {
+                0 => 'None',
+                1 => 'Choose Image Area (FX/DX/5:4)',
+                2 => 'One Step Speed/Aperture',
+                3 => 'Choose Non-CPU Lens Number',
+                # n/a  4 => 'Focus Point Selection',
+                5 => 'Choose Image Area (FX/DX)',
+                6 => 'Shooting Bank Menu',
+                7 => 'Dynamic AF Area', #PH (D3S,D3X,NC)
+            },
+        },
+        { #PH
+            Name => 'FuncButtonPlusDials',
+            Notes => 'D300',
+            Mask => 0x07,
+            PrintConv => {
+                0 => 'None',
+                2 => 'One Step Speed/Aperture',
+                3 => 'Choose Non-CPU Lens Number',
+                5 => 'Auto Bracketing',
+                6 => 'Dynamic AF Area',
+            },
+        },
+    ],
+    15.1 => [ # CSf4-a (ref 1), CSf5-a (D300S)
+        {
+            Name => 'FuncButton',
+            Condition => '$$self{Model} =~ /D3[SX]?\b/',
+            Notes => 'D3',
+            Mask => 0xf8,
+            PrintConv => {
+                0x00 => 'None',
+                0x08 => 'Preview',
+                0x10 => 'FV Lock',
+                0x18 => 'AE/AF Lock',
+                0x20 => 'AE Lock Only',
+                0x28 => 'AE Lock (reset on release)',
+                0x30 => 'AE Lock (hold)',
+                0x38 => 'AF Lock Only',
+                0x40 => 'Flash Off',
+                0x48 => 'Bracketing Burst',
+                0x50 => 'Matrix Metering',
+                0x58 => 'Center-weighted Metering',
+                0x60 => 'Spot Metering',
+                0x68 => 'Virtual Horizon',
+                # 0x70 not used
+                0x78 => 'Playback',
+                0x80 => 'My Menu Top',
+            },
+        },
+        { #PH
+            Name => 'PreviewButton',
+            Notes => 'D300',
+            Mask => 0xf8,
+            PrintConv => {
+                0x00 => 'None',
+                0x08 => 'Preview',
+                0x10 => 'FV Lock',
+                0x18 => 'AE/AF Lock',
+                0x20 => 'AE Lock Only',
+                0x28 => 'AE Lock (reset on release)',
+                0x30 => 'AE Lock (hold)',
+                0x38 => 'AF Lock Only',
+                # 0x40 not used
+                0x48 => 'Flash Off',
+                0x50 => 'Bracketing Burst',
+                0x58 => 'Matrix Metering',
+                0x60 => 'Center-weighted Metering',
+                0x68 => 'Spot Metering',
+                0x70 => 'Playback', #PH (guess)
+                0x78 => 'My Menu Top', #PH (guess)
+                0x80 => '+ NEF (RAW)', #PH (guess)
+            },
+        },
+    ],
+    15.2 => [ # CSf4-b (ref 1), CSf5-b (D300S)
+        {
+            Name => 'FuncButtonPlusDials',
+            Condition => '$$self{Model} =~ /D3[SX]?\b/',
+            Notes => 'D3',
+            Mask => 0x07,
+            PrintConv => {
+                0 => 'None',
+                1 => 'Choose Image Area (FX/DX/5:4)',
+                2 => 'One Step Speed/Aperture',
+                3 => 'Choose Non-CPU Lens Number',
+                4 => 'Focus Point Selection', #(NC)
+                5 => 'Choose Image Area (FX/DX)',
+                6 => 'Shooting Bank Menu',
+                7 => 'Dynamic AF Area', #PH (D3S,D3X,NC)
+            },
+        },
+        { #PH
+            Name => 'PreviewButtonPlusDials',
+            Notes => 'D300',
+            Mask => 0x07,
+            PrintConv => {
+                0 => 'None',
+                2 => 'One Step Speed/Aperture',
+                3 => 'Choose Non-CPU Lens Number',
+                5 => 'Auto Bracketing',
+                6 => 'Dynamic AF Area',
+            },
+        },
+    ],
+    16.1 => [ # CSf6-a (ref 1), CSf7-a (D300S)
+        {
+            Name => 'AELockButton',
+            Condition => '$$self{Model} =~ /D3[SX]?\b/',
+            Notes => 'D3',
+            Mask => 0xf8,
+            PrintConv => {
+                0x00 => 'None',
+                0x08 => 'Preview',
+                0x10 => 'FV Lock',
+                0x18 => 'AE/AF Lock',
+                0x20 => 'AE Lock Only',
+                0x28 => 'AE Lock (reset on release)',
+                0x30 => 'AE Lock (hold)',
+                0x38 => 'AF Lock Only',
+                0x40 => 'Flash Off',
+                0x48 => 'Bracketing Burst',
+                0x50 => 'Matrix Metering',
+                0x58 => 'Center-weighted Metering',
+                0x60 => 'Spot Metering',
+                0x68 => 'Virtual Horizon',
+                0x70 => 'AF On', # (AE-L/AF-L button only)
+                0x78 => 'Playback',
+                0x80 => 'My Menu Top',
+            },
+        },
+        { #PH
+            Name => 'AELockButton',
+            Notes => 'D300',
+            Mask => 0xf8,
+            PrintConv => {
+                0x00 => 'None',
+                0x08 => 'Preview',
+                0x10 => 'FV Lock',
+                0x18 => 'AE/AF Lock',
+                0x20 => 'AE Lock Only',
+                0x28 => 'AE Lock (reset on release)',
+                0x30 => 'AE Lock (hold)',
+                0x38 => 'AF Lock Only',
+                0x40 => 'AF On', # (AE-L/AF-L button only)
+                0x48 => 'Flash Off',
+                0x50 => 'Bracketing Burst',
+                0x58 => 'Matrix Metering',
+                0x60 => 'Center-weighted Metering',
+                0x68 => 'Spot Metering',
+                0x70 => 'Playback', #PH (guess)
+                0x78 => 'My Menu Top', #PH (guess)
+                0x80 => '+ NEF (RAW)', #PH (guess)
+            },
+        },
+    ],
+    16.2 => [ # CSf6-b (ref 1), CSf7-b (D300S)
+        {
+            Name => 'AELockButtonPlusDials',
+            Condition => '$$self{Model} =~ /D3[SX]?\b/',
+            Notes => 'D3',
+            Mask => 0x07,
+            PrintConv => {
+                0 => 'None',
+                1 => 'Choose Image Area (FX/DX/5:4)',
+                2 => 'One Step Speed/Aperture',
+                3 => 'Choose Non-CPU Lens Number',
+                # n/c 4 => 'Focus Point Selection', #(NC)
+                5 => 'Choose Image Area (FX/DX)',
+                6 => 'Shooting Bank Menu',
+                7 => 'Dynamic AF Area', #PH (D3S,D3X,NC)
+            },
+        },
+        { #PH
+            Name => 'AELockButtonPlusDials',
+            Notes => 'D300',
+            Mask => 0x07,
+            PrintConv => {
+                0 => 'None',
+                # n/a  2 => 'One Step Speed/Aperture',
+                3 => 'Choose Non-CPU Lens Number',
+                5 => 'Auto Bracketing', #(NC)
+                6 => 'Dynamic AF Area',
+            },
+        },
+    ],
+    17.1 => { # CSf7-a, CSf8-a (D3S,D300S)
+        Name => 'CommandDialsReverseRotation',
+        Mask => 0x80,
+        PrintConv => { 0x00 => 'No', 0x80 => 'Yes' },
+    },
+    17.2 => { # CSf7-b, CSf8-b (D3S,D300S)
+        Name => 'CommandDialsChangeMainSub',
+        Mask => 0x40,
+        PrintConv => { 0x00 => 'Off', 0x40 => 'On' },
+    },
+    17.3 => { # CSf7-c, CSf8-c (D3S,D300S)
+        Name => 'CommandDialsApertureSetting',
+        Mask => 0x20,
+        PrintConv => {
+            0x00 => 'Sub-command Dial',
+            0x20 => 'Aperture Ring',
+        },
+    },
+    17.4 => { # CSf7-d, CSf8-d (D3S,D300S)
+        Name => 'CommandDialsMenuAndPlayback',
+        Mask => 0x10,
+        PrintConv => { 0x00 => 'Off', 0x10 => 'On' },
+    },
+    17.5 => { # CSd8 (D300,D3S), CSd9 (D300S), CSd7 (D3)
+        Name => 'LCDIllumination',
+        Mask => 0x08,
+        PrintConv => { 0x00 => 'Off', 0x08 => 'On' },
+    },
+    17.6 => { # CSf3, CSf4 (D300S)
+        Name => 'PhotoInfoPlayback',
+        Mask => 0x04,
+        PrintConv => {
+            0x00 => 'Info Up-down, Playback Left-right',
+            0x04 => 'Info Left-right, Playback Up-down',
+        },
+    },
+    17.7 => { # CSc1
+        Name => 'ShutterReleaseButtonAE-L',
+        Mask => 0x02,
+        PrintConv => { 0x00 => 'Off', 0x02 => 'On' },
+    },
+    17.8 => { # CSf8, CSf9 (D3S,D300S)
+        Name => 'ReleaseButtonToUseDial',
+        Mask => 0x01,
+        PrintConv => { 0x00 => 'No', 0x01 => 'Yes' },
+    },
+    18.1 => { # CSc3
+        Name => 'SelfTimerTime',
+        Mask => 0x18,
+        PrintConv => {
+            0x00 => '2 s',
+            0x08 => '5 s',
+            0x10 => '10 s',
+            0x18 => '20 s',
+        },
+    },
+    18.2 => { # CSc4
+        Name => 'MonitorOffTime',
+        # NOTE: The D3S and D300S have separate settings for Playback,
+        # Image Review, Menus, and Information Display times, but these
+        # have not yet been decoded - PH
+        Mask => 0x07,
+        PrintConv => {
+            0x00 => '10 s',
+            0x01 => '20 s',
+            0x02 => '1 min',
+            0x03 => '5 min',
+            0x04 => '10 min',
+        },
+    },
+    20.1 => [ # CSe1
+        {
+            Name => 'FlashSyncSpeed',
+            Condition => '$$self{Model} =~ /D3[SX]?\b/',
+            Notes => 'D3',
+            Mask => 0xe0,
+            PrintConv => {
+                0x00 => '1/250 s (auto FP)',
+                0x20 => '1/250 s',
+                0x40 => '1/200 s',
+                0x60 => '1/160 s',
+                0x80 => '1/125 s',
+                0xa0 => '1/100 s',
+                0xc0 => '1/80 s',
+                0xe0 => '1/60 s',
+            },
+        },
+        {
+            Name => 'FlashSyncSpeed',
+            Notes => 'D300',
+            Mask => 0xf0,
+            PrintConv => {
+                0x00 => '1/320 s (auto FP)',
+                0x10 => '1/250 s (auto FP)',
+                0x20 => '1/250 s',
+                0x30 => '1/200 s',
+                0x40 => '1/160 s',
+                0x50 => '1/125 s',
+                0x60 => '1/100 s',
+                0x70 => '1/80 s',
+                0x80 => '1/60 s',
+            },
+        },
+    ],
+    20.2 => { # CSe2
+        Name => 'FlashShutterSpeed',
+        Mask => 0x0f,
+        PrintConvColumns => 2,
+        PrintConv => {
+            0x00 => '1/60 s',
+            0x01 => '1/30 s',
+            0x02 => '1/15 s',
+            0x03 => '1/8 s',
+            0x04 => '1/4 s',
+            0x05 => '1/2 s',
+            0x06 => '1 s',
+            0x07 => '2 s',
+            0x08 => '4 s',
+            0x09 => '8 s',
+            0x0a => '15 s',
+            0x0b => '30 s',
+        },
+    },
+    21.1 => { # CSe5 (D300), CSe4 (D3)
+        Name => 'AutoBracketSet',
+        Mask => 0xc0,
+        PrintConv => {
+            0x00 => 'AE & Flash',
+            0x40 => 'AE Only',
+            0x80 => 'Flash Only',
+            0xc0 => 'WB Bracketing',
+            # NOTE: D3S/D300S have an "ADL Bracketing" setting not decoded - PH
+        },
+    },
+    21.2 => { # CSe6 (D300), CSe5 (D3)
+        Name => 'AutoBracketModeM',
+        Mask => 0x30,
+        PrintConv => {
+            0x00 => 'Flash/Speed',
+            0x10 => 'Flash/Speed/Aperture',
+            0x20 => 'Flash/Aperture',
+            0x30 => 'Flash Only',
+        },
+    },
+    21.3 => { # CSe7 (D300), CSe6 (D3)
+        Name => 'AutoBracketOrder',
+        Mask => 0x08,
+        PrintConv => {
+            0x00 => '0,-,+',
+            0x08 => '-,0,+',
+        },
+    },
+    21.4 => { # CSe4 (D300), CSe3 (D3)
+        Name => 'ModelingFlash',
+        Mask => 0x01,
+        PrintConv => { 0x00 => 'On', 0x01 => 'Off' },
+    },
+    22.1 => { # CSf9, CSf10 (D3S,D300S)
+        Name => 'NoMemoryCard',
+        Mask => 0x80,
+        PrintConv => {
+            0x00 => 'Release Locked',
+            0x80 => 'Enable Release',
+        },
+    },
+    22.2 => { # CSc2
+        Name => 'MeteringTime',
+        Mask => 0x0f,
+        PrintConvColumns => 2,
+        PrintConv => {
+            0x00 => '4 s',
+            0x01 => '6 s',
+            0x02 => '8 s',
+            0x03 => '16 s',
+            0x04 => '30 s',
+            0x05 => '1 min',
+            0x06 => '5 min',
+            0x07 => '10 min',
+            0x08 => '30 min',
+            0x09 => 'No Limit',
+        },
+    },
+    23.1 => { # CSe3
+        Name => 'InternalFlash',
+        Mask => 0xc0,
+        PrintConv => {
+            0x00 => 'TTL',
+            0x40 => 'Manual',
+            0x80 => 'Repeating Flash',
+            0xc0 => 'Commander Mode',
+        },
+    },
+);
+
+# D700 custom settings (ref 2)
+%Image::ExifTool::NikonCustom::SettingsD700 = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    DATAMEMBER => [ 16.1 ],
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'Custom settings for the D700.',
+    0.1 => { #1
+        Name => 'CustomSettingsBank',
+        Mask => 0x03,
+        PrintConv => {
+            0 => 'A',
+            1 => 'B',
+            2 => 'C',
+            3 => 'D',
+        },
+    },
+    0.2 => { #1
+        Name => 'CustomSettingsAllDefault',
+        Notes => '"No" if any custom setting for this bank was changed from the default',
+        Mask => 0x80,
+        PrintConv => { 0x00 => 'Yes', 0x80 => 'No' },
+    },
+    1.1 => { # CSa1
+        Name => 'AF-CPrioritySelection',
+        Mask => 0xc0,
+        PrintConv => {
+            0x00 => 'Release',
+            0x40 => 'Release + Focus',
+            0x80 => 'Focus',
+        },
+    },
+    1.2 => { # CSa2
+        Name => 'AF-SPrioritySelection',
+        Mask => 0x20,
+        PrintConv => {
+            0x00 => 'Focus',
+            0x20 => 'Release',
+        },
+    },
+    1.3 => { # CSa8
+        Name => 'AFPointSelection',
+        Mask => 0x10,
+        PrintConv => {
+            0x00 => '51 Points',
+            0x10 => '11 Points',
+        },
+    },
+    1.4 => { # CSa3
+        Name => 'DynamicAFArea',
+        Mask => 0x0c,
+        PrintConv => {
+            0x00 => '9 Points',
+            0x04 => '21 Points',
+            0x08 => '51 Points',
+            0x0c => '51 Points (3D-tracking)',
+        },
+    },
+    2.1 => { # CSa5
+        Name => 'AFActivation',
+        Mask => 0x80,
+        PrintConv => {
+            0x00 => 'Shutter/AF-On',
+            0x80 => 'AF-On Only',
+        },
+    },
+    2.2 => { # CSa7
+        Name => 'FocusPointWrap',
+        Mask => 0x08,
+        PrintConv => {
+            0x00 => 'No Wrap',
+            0x08 => 'Wrap',
+        },
+    },
+    2.3 => { # CSa6
+        Name => 'AFPointIllumination',
+        Mask => 0x06,
+        PrintConv => {
+            0x00 => 'Auto',
+            0x02 => 'Off',
+            0x04 => 'On',
+        },
+    },
+    2.4 => { # CSa9
+        Name => 'AFAssist',
+        Mask => 0x01,
+        PrintConv => { 0x00 => 'On', 0x01 => 'Off' },
+    },
+    3.1 => { # CSa4
+        Name => 'FocusTrackingLockOn',
+        Mask => 0x07,
+        PrintConv => {
+            0x00 => '3 Normal',
+            0x01 => '4',
+            0x02 => '5 Long',
+            0x03 => '2',
+            0x04 => '1 Short',
+            0x05 => 'Off',
+        },
+    },
+    3.2 => { # CSa10
+        Name => 'AF-OnForMB-D10',
+        Mask => 0x70,
+        PrintConv => {
+            0x00 => 'AF-On',
+            0x10 => 'AE/AF Lock',
+            0x20 => 'AE Lock Only',
+            0x30 => 'AE Lock (reset on release)',
+            0x40 => 'AE Lock (hold)',
+            0x50 => 'AF Lock Only',
+            0x60 => 'Same as FUNC Button',
+        },
+    },
+    4.1 => { # CSb1
+        Name => 'ISOStepSize',
+        Mask => 0xc0,
+        PrintConv => {
+            0x00 => '1/3 EV',
+            0x40 => '1/2 EV',
+            0x80 => '1 EV',
+        },
+    },
+    4.2 => { # CSb2
+        Name => 'ExposureControlStepSize',
+        Mask => 0x30,
+        PrintConv => {
+            0x00 => '1/3 EV',
+            0x10 => '1/2 EV',
+            0x20 => '1 EV',
+        },
+    },
+    4.3 => { # CSb3
+        Name => 'ExposureCompStepSize',
+        Mask => 0x0c,
+        PrintConv => {
+            0x00 => '1/3 EV',
+            0x04 => '1/2 EV',
+            0x08 => '1 EV',
+        },
+    },
+    4.4 => { # CSb4
+        Name => 'EasyExposureCompensation',
+        Mask => 0x03,
+        PrintConv => {
+            0x00 => 'Off',
+            0x01 => 'On',
+            0x02 => 'On (auto reset)',
+        },
+    },
+    5.1 => { # CSb5
+        Name => 'CenterWeightedAreaSize',
+        Mask => 0x70,
+        PrintConv => {
+            0x00 => '8 mm',
+            0x10 => '12 mm',
+            0x20 => '15 mm',
+            0x30 => '20 mm',
+            0x40 => 'Average',
+        },
+    },
+    6.1 => { # CSb6-a
+        Name => 'FineTuneOptMatrixMetering',
+        Mask => 0xf0,
+        ValueConv => '($val > 0x70 ? $val - 0x100 : $val) / 0x60',
+        ValueConvInv => '(int($val*6+($val>0?0.5:-0.5))<<4) & 0xf0',
+        PrintConv => '$val ? sprintf("%+.2f", $val) : 0',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    6.2 => { # CSb6-c
+        Name => 'FineTuneOptSpotMetering',
+        Mask => 0x0f,
+        ValueConv => '($val > 0x7 ? $val - 0x10 : $val) / 6',
+        ValueConvInv => 'int($val*6+($val>0?0.5:-0.5)) & 0x0f',
+        PrintConv => '$val ? sprintf("%+.2f", $val) : 0',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    7.1 => { # CSc1
+        Name => 'ShutterReleaseButtonAE-L',
+        Mask => 0x80,
+        PrintConv => { 0x00 => 'Off', 0x80 => 'On' },
+    },
+    7.2 => { # CSc3
+        Name => 'SelfTimerTime',
+        Mask => 0x30,
+        PrintConv => {
+            0x00 => '2 s',
+            0x10 => '5 s',
+            0x20 => '10 s',
+            0x30 => '20 s',
+        },
+    },
+    7.3 => { # CSc2
+        Name => 'MeteringTime',
+        Mask => 0x0f,
+        PrintConvColumns => 2,
+        PrintConv => {
+            0x00 => '4 s',
+            0x01 => '6 s',
+            0x02 => '8 s',
+            0x03 => '16 s',
+            0x04 => '30 s',
+            0x05 => '1 min',
+            0x06 => '5 min',
+            0x07 => '10 min',
+            0x08 => '30 min',
+            0x09 => 'No Limit',
+        },
+    },
+    8.1 => { # CSc4-a
+        Name => 'PlaybackMonitorOffTime',
+        Mask => 0x38,
+        PrintConv => {
+            0x00 => '4 s',
+            0x08 => '10 s',
+            0x10 => '20 s',
+            0x18 => '1 min',
+            0x20 => '5 min',
+            0x28 => '10 min',
+        },
+    },
+    8.2 => { # CSc4-b
+        Name => 'MenuMonitorOffTime',
+        Mask => 0x07,
+        PrintConv => {
+            0x00 => '4 s',
+            0x01 => '10 s',
+            0x02 => '20 s',
+            0x03 => '1 min',
+            0x04 => '5 min',
+            0x05 => '10 min',
+        },
+    },
+    9.1 => { # CSc4-c
+        Name => 'ShootingInfoMonitorOffTime',
+        Mask => 0x38,
+        PrintConv => {
+            0x00 => '4 s',
+            0x08 => '10 s',
+            0x10 => '20 s',
+            0x18 => '1 min',
+            0x20 => '5 min',
+            0x28 => '10 min',
+        },
+    },
+    9.2 => { # CSc4-d
+        Name => 'ImageReviewTime',
+        Mask => 0x07,
+        PrintConv => {
+            0x00 => '4 s',
+            0x01 => '10 s',
+            0x02 => '20 s',
+            0x03 => '1 min',
+            0x04 => '5 min',
+            0x05 => '10 min',
+        },
+    },
+    10.1 => { # CSd1
+        Name => 'Beep',
+        Mask => 0xc0,
+        PrintConv => {
+            0x00 => 'High',
+            0x40 => 'Low',
+            0x80 => 'Off',
+        },
+    },
+    10.2 => { # CSd7
+        Name => 'ShootingInfoDisplay',
+        Mask => 0x30,
+        PrintConv => {
+            0x00 => 'Auto', #JD (D300)
+            0x10 => 'Auto', #1 (D3)
+            0x20 => 'Manual (dark on light)',
+            0x30 => 'Manual (light on dark)',
+        },
+    },
+    10.3 => { # CSd8
+        Name => 'LCDIllumination',
+        Mask => 0x08,
+        PrintConv => { 0x00 => 'Off', 0x08 => 'On' },
+    },
+    10.4 => { # CSd9
+        Name => 'ExposureDelayMode',
+        Mask => 0x04,
+        PrintConv => { 0x00 => 'Off', 0x04 => 'On' },
+    },
+    10.5 => { # CSd2
+        Name => 'GridDisplay',
+        Mask => 0x02,
+        PrintConv => { 0x00 => 'Off', 0x02 => 'On' },
+    },
+    11.1 => { # CSd6
+        Name => 'FileNumberSequence',
+        Mask => 0x40,
+        PrintConv => { 0x00 => 'On', 0x40 => 'Off' },
+    },
+    11.2 => { # CSd4
+        Name => 'CLModeShootingSpeed',
+        Mask => 0x07,
+        PrintConv => '"$val fps"',
+        PrintConvInv => '$val=~s/\s*fps//i; $val',
+    },
+    12 => { # CSd5
+        Name => 'MaxContinuousRelease',
+        # values: 1-100
+    },
+    13.1 => { # CSd3
+        Name => 'ScreenTips',
+        Mask => 0x08,
+        PrintConv => { 0x08 => 'On', 0x00 => 'Off' },
+    },
+    13.2 => { # CSd11
+        Name => 'BatteryOrder',
+        Mask => 0x04,
+        PrintConv => {
+            0x00 => 'MB-D10 First',
+            0x04 => 'Camera Battery First',
+        },
+    },
+    13.3 => { # CSd10
+        Name => 'MB-D10BatteryType',
+        Mask => 0x03,
+        PrintConv => {
+            0x00 => 'LR6 (AA alkaline)',
+            0x01 => 'HR6 (AA Ni-MH)',
+            0x02 => 'FR6 (AA lithium)',
+            0x03 => 'ZR6 (AA Ni-Mn)',
+        },
+    },
+    15.1 => { # CSe1
+        Name => 'FlashSyncSpeed',
+        Mask => 0xf0,
+        PrintConv => {
+            0x00 => '1/320 s (auto FP)',
+            0x10 => '1/250 s (auto FP)',
+            0x20 => '1/250 s',
+            0x30 => '1/200 s',
+            0x40 => '1/160 s',
+            0x50 => '1/125 s',
+            0x60 => '1/100 s',
+            0x70 => '1/80 s',
+            0x80 => '1/60 s',
+       },
+    },
+    15.2 => { # CSe2
+        Name => 'FlashShutterSpeed',
+        Mask => 0x0f,
+        PrintConvColumns => 2,
+        PrintConv => {
+            0x00 => '1/60 s',
+            0x01 => '1/30 s',
+            0x02 => '1/15 s',
+            0x03 => '1/8 s',
+            0x04 => '1/4 s',
+            0x05 => '1/2 s',
+            0x06 => '1 s',
+            0x07 => '2 s',
+            0x08 => '4 s',
+            0x09 => '8 s',
+            0x0a => '15 s',
+            0x0b => '30 s',
+        },
+    },
+    16.1 => { # CSe3
+        Name => 'FlashControlBuilt-in',
+        # Note If set the Manual, Repeating Flash, Commander Mode
+        #      does not decode the detail settings.
+        Mask => 0xc0,
+        RawConv => '$$self{FlashControlBuiltin} = $val & 0xc0',
+        PrintConv => {
+            0x00 => 'TTL',
+            0x40 => 'Manual',
+            0x80 => 'Repeating Flash',
+            0xc0 => 'Commander Mode',
+        },
+    },
+    16.2 => { # CSe3-b
+        Name => 'ManualFlashOutput',
+        Condition => '$$self{FlashControlBuiltin} == 0x40',
+        Mask => 0x1f,
+        ValueConv => '2 ** (-$val/3)',
+        ValueConvInv => '$val > 0 ? -3*log($val)/log(2) : 0',
+        PrintConv => q{
+            return 'Full' if $val > 0.99;
+            Image::ExifTool::Exif::PrintExposureTime($val);
+        },
+        PrintConvInv => '$val=~/F/i ? 1 : Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    17.1 => { # CSe3-ca
+        Name => 'RepeatingFlashOutput',
+        Condition => '$$self{FlashControlBuiltin} == 0x80',
+        Mask => 0x70,
+        ValueConv => '2 ** (-($val>>4)-2)',
+        ValueConvInv => '$val > 0 ? int(-log($val)/log(2)-2+0.5)<<4 : 0',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    17.2 => { # CSe3-cb
+        Name => 'RepeatingFlashCount',
+        Condition => '$$self{FlashControlBuiltin} == 0x80',
+        Mask => 0x0f,
+        ValueConv => '$val < 10 ? $val + 1 : 5 * ($val - 7)',
+        ValueConvInv => '$val <= 10 ? $val - 1 : $val / 5 + 7',
+    },
+    18.1 => { # CSe3-cc (NC)
+        Name => 'RepeatingFlashRate',
+        Condition => '$$self{FlashControlBuiltin} == 0x80',
+        Mask => 0xf0,
+        ValueConv => 'my $v=($val>>4); $v < 10 ? $v + 1 : 10 * ($v - 8)',
+        ValueConvInv => 'int(($val <= 10 ? $val - 1 : $val / 10 + 8) + 0.5) << 4',
+        PrintConv => '"$val Hz"',
+        PrintConvInv => '$val=~/(\d+)/; $1 || 0',
+    },
+    18.2 => { # CSe3-dd
+        Name => 'CommanderInternalTTLChannel',
+        Condition => '$$self{FlashControlBuiltin} == 0xc0',
+        Mask => 0x03,
+        PrintConv => {
+            0x00 => '1 ch',
+            0x01 => '2 ch',
+            0x02 => '3 ch',
+            0x03 => '4 ch',
+        },
+    },
+    20.1 => { # CSe3-da
+        Name => 'CommanderInternalTTLCompBuiltin',
+        Condition => '$$self{FlashControlBuiltin} == 0xc0',
+        Mask => 0x1f,
+        ValueConv => '($val - 9) / 3',
+        ValueConvInv => '$val * 3 + 9',
+        PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
+        PrintConvInv => '$val',
+    },
+    21.1 => { # CSe3-db
+        Name => 'CommanderInternalTTLCompGroupA',
+        Condition => '$$self{FlashControlBuiltin} == 0xc0',
+        Mask => 0x1f,
+        ValueConv => '($val - 9) / 3',
+        ValueConvInv => '$val * 3 + 9',
+        PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
+        PrintConvInv => '$val',
+    },
+    22.1 => { # CSe3-dc
+        Name => 'CommanderInternalTTLCompGroupB',
+        Condition => '$$self{FlashControlBuiltin} == 0xc0',
+        Mask => 0x1f,
+        ValueConv => '($val - 9) / 3',
+        ValueConvInv => '$val * 3 + 9',
+        PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
+        PrintConvInv => '$val',
+    },
+    26.1 => { # CSe5
+        Name => 'AutoBracketSet',
+        Mask => 0xc0,
+        PrintConv => {
+            0x00 => 'AE & Flash',
+            0x40 => 'AE Only',
+            0x80 => 'Flash Only',
+            0xc0 => 'WB Bracketing',
+        },
+    },
+    26.2 => { # CSe6
+        Name => 'AutoBracketModeM',
+        Mask => 0x30,
+        PrintConv => {
+            0x00 => 'Flash/Speed',
+            0x10 => 'Flash/Speed/Aperture',
+            0x20 => 'Flash/Aperture',
+            0x30 => 'Flash Only',
+        },
+    },
+    26.3 => { # CSe7
+        Name => 'AutoBracketOrder',
+        Mask => 0x08,
+        PrintConv => {
+            0x00 => '0,-,+',
+            0x08 => '-,0,+',
+        },
+    },
+    26.4 => { # CSe4
+        Name => 'ModelingFlash',
+        Mask => 0x01,
+        PrintConv => { 0x00 => 'On', 0x01 => 'Off' },
+    },
+    27.1 => { # CSf2-a
+        Name => 'MultiSelectorShootMode',
+        Mask => 0xc0,
+        PrintConv => {
+            0x00 => 'Select Center Focus Point',
+            0x40 => 'Highlight Active Focus Point',
+            0x80 => 'Not Used',
+        },
+    },
+    27.2 => { # CSf2-b
+        Name => 'MultiSelectorPlaybackMode',
+        Mask => 0x30,
+        PrintConv => {
+            0x00 => 'Thumbnail On/Off',
+            0x10 => 'View Histograms',
+            0x20 => 'Zoom On/Off',
+            0x30 => 'Choose Folder',
+        },
+    },
+    27.3 => { # CSf2-b2
+        Name => 'InitialZoomSetting',
+        Mask => 0x0c,
+        PrintConv => { #1
+            0x00 => 'Low Magnification',
+            0x04 => 'Medium Magnification',
+            0x08 => 'High Magnification',
+        },
+    },
+    27.4 => { # CSf3
+        Name => 'MultiSelector',
+        Mask => 0x01,
+        PrintConv => {
+            0x00 => 'Do Nothing',
+            0x01 => 'Reset Meter-off Delay',
+        },
+    },
+    28.1 => { # CSf5-a
+        Name => 'FuncButton',
+        Mask => 0xf8,
+        PrintConv => {
+            0x00 => 'None',
+            0x08 => 'Preview',
+            0x10 => 'FV Lock',
+            0x18 => 'AE/AF Lock',
+            0x20 => 'AE Lock Only',
+            0x28 => 'AE Lock (reset on release)',
+            0x30 => 'AE Lock (hold)',
+            0x38 => 'AF Lock Only',
+            # 0x40 not used
+            0x48 => 'Flash Off',
+            0x50 => 'Bracketing Burst',
+            0x58 => 'Matrix Metering',
+            0x60 => 'Center-weighted Metering',
+            0x68 => 'Spot Metering',
+            0x70 => 'My Menu Top',
+            0x78 => 'Live View',
+            0x80 => '+ NEF (RAW)',
+            0x88 => 'Virtual Horizon',
+        },
+    },
+    29.1 => { # CSf6-a
+        Name => 'PreviewButton',
+        Mask => 0xf8,
+        PrintConv => {
+            0x00 => 'None',
+            0x08 => 'Preview',
+            0x10 => 'FV Lock',
+            0x18 => 'AE/AF Lock',
+            0x20 => 'AE Lock Only',
+            0x28 => 'AE Lock (reset on release)',
+            0x30 => 'AE Lock (hold)',
+            0x38 => 'AF Lock Only',
+            0x40 => 'AF-ON',
+            0x48 => 'Flash Off',
+            0x50 => 'Bracketing Burst',
+            0x58 => 'Matrix Metering',
+            0x60 => 'Center-weighted Metering',
+            0x68 => 'Spot Metering',
+            0x70 => 'My Menu Top',
+            0x78 => 'Live View',
+            0x80 => '+ NEF (RAW)',
+            0x88 => 'Virtual Horizon',
+        },
+    },
+    30.1 => { # CSf7-a
+        Name => 'AELockButton',
+        Notes => 'D300',
+        Mask => 0xf8,
+        PrintConv => {
+            0x00 => 'None',
+            0x08 => 'Preview',
+            0x10 => 'FV Lock',
+            0x18 => 'AE/AF Lock',
+            0x20 => 'AE Lock Only',
+            0x28 => 'AE Lock (reset on release)',
+            0x30 => 'AE Lock (hold)',
+            0x38 => 'AF Lock Only',
+            0x40 => 'AF-ON',
+            0x48 => 'Flash Off',
+            0x50 => 'Bracketing Burst',
+            0x58 => 'Matrix Metering',
+            0x60 => 'Center-weighted Metering',
+            0x68 => 'Spot Metering',
+            0x70 => 'My Menu Top',
+            0x78 => 'Live View',
+            0x80 => '+ NEF (RAW)',
+            0x88 => 'Virtual Horizon',
+        },
+    },
+    31.1 => { # CSf5-b
+        Name => 'FuncButtonPlusDials',
+        Mask => 0x70,
+        PrintConv => {
+            0x00 => 'None',
+            0x10 => 'Choose Image Area',
+            0x20 => 'One Step Speed/Aperture',
+            0x30 => 'Choose Non-CPU Lens Number',
+            # n/a  0x40 => 'Focus Point Selection',
+            0x50 => 'Auto bracketing',
+            0x60 => 'Dynamic AF Area',
+            0x70 => 'Shutter speed & Aperture lock',
+        },
+    },
+    31.2 => { # CSf6-b
+        Name => 'PreviewButtonPlusDials',
+        Mask => 0x07,
+        PrintConv => {
+            0x00 => 'None',
+            0x01 => 'Choose Image Area',
+            0x02 => 'One Step Speed/Aperture',
+            0x03 => 'Choose Non-CPU Lens Number',
+            # n/a  0x04 => 'Focus Point Selection',
+            0x05 => 'Auto bracketing',
+            0x06 => 'Dynamic AF Area',
+            0x07 => 'Shutter speed & Aperture lock',
+        },
+    },
+    32.1 => { # CSf7-b
+        Name => 'AELockButtonPlusDials',
+        Mask => 0x70,
+        PrintConv => {
+            0x00 => 'None',
+            0x10 => 'Choose Image Area',
+            0x20 => 'One Step Speed/Aperture',
+            0x30 => 'Choose Non-CPU Lens Number',
+            # n/a  0x40 => 'Focus Point Selection',
+            0x50 => 'Auto bracketing',
+            0x60 => 'Dynamic AF Area',
+            0x70 => 'Shutter speed & Aperture lock',
+        },
+    },
+    33.1 => { # CSf9-a
+        Name => 'CommandDialsReverseRotation',
+        Mask => 0x80,
+        PrintConv => { 0x00 => 'No', 0x80 => 'Yes' },
+    },
+    33.2 => { # CSf9-b
+        Name => 'CommandDialsChangeMainSub',
+        Mask => 0x40,
+        PrintConv => { 0x00 => 'Off', 0x40 => 'On' },
+    },
+    33.3 => { # CSf9-c
+        Name => 'CommandDialsApertureSetting',
+        Mask => 0x20,
+        PrintConv => {
+            0x00 => 'Sub-command Dial',
+            0x20 => 'Aperture Ring',
+        },
+    },
+    33.4 => { # CSf9-d
+        Name => 'CommandDialsMenuAndPlayback',
+        Mask => 0x10,
+        PrintConv => { 0x00 => 'Off', 0x10 => 'On' },
+    },
+    33.5 => { # CSf12
+        Name => 'ReverseIndicators',
+        Mask => 0x08,
+        PrintConv => {
+            0x00 => '+ 0 -',
+            0x08 => '- 0 +',
+        },
+    },
+    33.6 => { # CSf4
+        Name => 'PhotoInfoPlayback',
+        Mask => 0x04,
+        PrintConv => { 0x00 => 'Off', 0x04 => 'On' },
+    },
+    33.7 => { # CSf11
+        Name => 'NoMemoryCard',
+        Mask => 0x02,
+        PrintConv => {
+            0x00 => 'Release Locked',
+            0x02 => 'Enable Release',
+        },
+    },
+    33.8 => { # CSf10
+        Name => 'ReleaseButtonToUseDial',
+        Mask => 0x01,
+        PrintConv => { 0x00 => 'No', 0x01 => 'Yes' },
+    },
+);
+
+# D5000 custom settings (ref PH)
+%Image::ExifTool::NikonCustom::SettingsD5000 = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'Custom settings for the D5000.',
+    # Missing/Incomplete settings:
+    # CSd7 - LiveViewDisplayOptions [couldn't find in data - try again with live view shots]
+    0.1 => { # CSa1
+        Name => 'AFAreaModeSetting',
+        Mask => 0x60,
+        PrintConv => {
+            0x00 => 'Single Area',
+            0x20 => 'Dynamic Area',
+            0x40 => 'Auto-area',
+            0x60 => '3D-tracking (11 points)',
+        },
+    },
+    0.2 => { # CSa2
+        Name => 'AFAssist',
+        Mask => 0x01,
+        PrintConv => {
+            0 => 'On',
+            1 => 'Off',
+        },
+    },
+    2.1 => { # CSd1
+        Name => 'Beep',
+        Mask => 0xc0,
+        PrintConv => {
+            0x00 => 'Off',
+            0x40 => 'Low',
+            0x80 => 'High',
+        },
+    },
+    2.2 => { # CSd2
+        Name => 'GridDisplay',
+        Mask => 0x02,
+        PrintConv => {
+            0x00 => 'On',
+            0x02 => 'Off',
+        },
+    },
+    2.3 => { # CSd3
+        Name => 'ISODisplay',
+        Mask => 0x08,
+        PrintConv => {
+            0x08 => 'Off',
+            0x00 => 'On',
+        },
+    },
+    2.4 => { # CSf4
+        Name => 'NoMemoryCard',
+        Mask => 0x20,
+        PrintConv => {
+            0x00 => 'Release Locked',
+            0x20 => 'Enable Release',
+        },
+    },
+    3.1 => { # CSd4
+        Name => 'FileNumberSequence',
+        Mask => 0x08,
+        PrintConv => { 0x00 => 'On', 0x08 => 'Off' },
+    },
+    4.1 => { # CSa4
+        Name => 'RangeFinder',
+        Mask => 0x10,
+        PrintConv => { 0x00 => 'Off', 0x10 => 'On' },
+    },
+    4.2 => { # CSd6
+        Name => 'DateImprint',
+        Mask => 0x08,
+        PrintConv => {
+            0x00 => 'Off',
+            0x08 => 'On',
+        },
+    },
+    4.3 => { # CSf5
+        Name => 'ReverseIndicators',
+        Mask => 0x80,
+        PrintConv => {
+            0x00 => '+ 0 -',
+            0x80 => '- 0 +',
+        },
+    },
+    5.1 => { # CSb1
+        Name => 'EVStepSize',
+        Mask => 0x40,
+        PrintConv => {
+            0x00 => '1/3 EV',
+            0x40 => '1/2 EV',
+        },
+    },
+    9.1 => { # CSd5
+        Name => 'ExposureDelayMode',
+        Mask => 0x40,
+        PrintConv => {
+            0x00 => 'Off',
+            0x40 => 'On',
+        },
+    },
+    11.1 => { # CSe2
+        Name => 'AutoBracketSet',
+        Mask => 0xc0,
+        PrintConv => {
+            0x00 => 'Exposure',
+            0x40 => 'Active D-Lighting', #(NC)
+            0x80 => 'WB Bracketing',
+        },
+    },
+    12.1 => { # CSf1
+        Name => 'TimerFunctionButton',
+        Mask => 0x38,
+        PrintConv => {
+            0x00 => 'Self-timer',
+            0x08 => 'Release Mode',
+            0x10 => 'Image Quality/Size', #(NC)
+            0x18 => 'ISO', #(NC)
+            0x20 => 'White Balance', #(NC)
+            0x28 => 'Active D-Lighting', #(NC)
+            0x30 => '+ NEF (RAW)',
+            0x38 => 'Auto Bracketing',
+        },
+    },
+    15.1 => { # CSf2
+        Name => 'AELockButton',
+        Mask => 0x38,
+        PrintConv => {
+            0x00 => 'AE/AF Lock',
+            0x08 => 'AE Lock Only', #(NC)
+            0x10 => 'AF Lock Only', #(NC)
+            0x18 => 'AE Lock (hold)',
+            0x20 => 'AF-ON',
+        },
+    },
+    16.1 => { # CSc1
+        Name => 'ShutterReleaseButtonAE-L',
+        Mask => 0x02,
+        PrintConv => { 0x00 => 'Off', 0x02 => 'On' },
+    },
+    16.2 => { # CSf3
+        Name => 'CommandDialsReverseRotation',
+        Mask => 0x80,
+        PrintConv => { 0x00 => 'No', 0x80 => 'Yes' },
+    },
+    17.1 => { # CSc2-c
+        Name => 'MeteringTime',
+        Mask => 0x70,
+        PrintConv => {
+            0x00 => '4 s',
+            0x10 => '8 s',
+            0x20 => '20 s',
+            0x30 => '1 min',
+            0x40 => '30 min',
+        },
+    },
+    17.2 => { # CSc4
+        Name => 'RemoteOnDuration',
+        Mask => 0x03,
+        PrintConv => {
+            0x00 => '1 min',
+            0x01 => '5 min',
+            0x02 => '10 min',
+            0x03 => '15 min',
+        },
+    },
+    18.1 => { # CSc3-a
+        Name => 'SelfTimerTime',
+        Mask => 0xc0,
+        PrintConv => {
+            0x00 => '2 s',
+            0x40 => '5 s',
+            0x80 => '10 s',
+            0xc0 => '20 s',
+        },
+    },
+    18.2 => { # CSc3-b
+        Name => 'SelfTimerShotCount',
+        Mask => 0x1e,
+        ValueConv => '$val >> 1',
+        ValueConvInv => '$val << 1',
+    },
+    19.1 => { # CSc2-b
+        Name => 'ImageReviewTime',
+        Mask => 0xe0,
+        PrintConv => {
+            0x00 => '4 s',
+            0x20 => '8 s',
+            0x40 => '20 s',
+            0x60 => '1 min',
+            0x80 => '10 min',
+        },
+    },
+    20.1 => { # CSc2-a
+        Name => 'PlaybackMenusTime',
+        Mask => 0xe0,
+        PrintConv => {
+            0x00 => '8 s',
+            0x20 => '12 s',
+            0x40 => '20 s',
+            0x60 => '1 min',
+            0x80 => '10 min',
+        },
+    },
+    22.1 => { # CSe1-a
+        Name => 'InternalFlash',
+        Mask => 0xc0,
+        PrintConv => {
+            0x00 => 'TTL',
+            0x40 => 'Manual',
+        },
+    },
+    22.2 => { # CSe1-b
+        Name => 'ManualFlashOutput',
+        Mask => 0x1f,
+        ValueConv => '2 ** (-$val/3)',
+        ValueConvInv => '$val > 0 ? -3*log($val)/log(2) : 0',
+        PrintConv => q{
+            return 'Full' if $val > 0.99;
+            Image::ExifTool::Exif::PrintExposureTime($val);
+        },
+        PrintConvInv => '$val=~/F/i ? 1 : Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    32.1 => { # CSa3
+        Name => 'LiveViewAF',
+        Mask => 0x60,
+        PrintConv => {
+            0x00 => 'Face Priority',
+            0x20 => 'Wide Area',
+            0x40 => 'Normal Area',
+            0x60 => 'Subject Tracking',
+        },
+    },
+);
+
+# D7000 custom settings (ref 2)
+%Image::ExifTool::NikonCustom::SettingsD7000 = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    DATAMEMBER => [ 23.1 ],
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'Custom settings for the D7000.',
+    0.1 => { # CSa1
+        Name => 'AF-CPrioritySelection',
+        Mask => 0x80,
+        PrintConv => {
+            0x00 => 'Release',
+            0x80 => 'Focus',
+        },
+    },
+    0.2 => { # CSa2
+        Name => 'AF-SPrioritySelection',
+        Mask => 0x20,
+        PrintConv => {
+            0x00 => 'Focus',
+            0x20 => 'Release',
+        },
+    },
+    0.3 => { # CSa6
+        Name => 'NumberOfFocusPoints',
+        Mask => 0x10,
+        PrintConv => {
+            0x00 => '39 Points',
+            0x10 => '11 Points',
+        },
+    },
+    0.4 => { # CSa3
+        Name => 'FocusTrackingLockOn',
+        Mask => 0x07,
+        PrintConv => {
+            0x05 => '5 Long',
+            0x04 => '4',
+            0x03 => '3 Normal',
+            0x02 => '2',
+            0x01 => '1 Short',
+            0x00 => 'Off',
+        },
+    },
+    1.2 => { # CSa5
+        Name => 'FocusPointWrap',
+        Mask => 0x08,
+        PrintConv => {
+            0x00 => 'No Wrap',
+            0x08 => 'Wrap',
+        },
+    },
+    1.3 => { # CSa4
+        Name => 'AFPointIllumination',
+        Mask => 0x06,
+        PrintConv => {
+            0x00 => 'Auto',
+            0x02 => 'On',
+            0x04 => 'Off',
+        },
+    },
+    1.4 => { # CSa7
+        Name => 'AFAssist',
+        Mask => 0x01,
+        PrintConv => { 0x00 => 'On', 0x01 => 'Off' },
+    },
+    2.1 => { # CSd14
+        Name => 'BatteryOrder',
+        Mask => 0x40,
+        PrintConv => {
+            0x00 => 'MB-D11 First',
+            0x40 => 'Camera Battery First',
+        },
+    },
+    2.2 => { # CSa10
+        Name => 'AF-OnForMB-D11',
+        Mask => 0x1c,
+        PrintConv => {
+            0x00 => 'AE/AF Lock',
+            0x04 => 'AE Lock Only',
+            0x08 => 'AF Lock Only',
+            0x0c => 'AE Lock (hold)',
+            0x10 => 'AF-ON',
+            0x14 => 'FV Lock',
+            0x18 => 'Same as FUNC Button',
+        },
+    },
+    2.3 => { # CSd13
+        Name => 'MB-D11BatteryType',
+        Mask => 0x03,
+        PrintConv => {
+            0x00 => 'LR6 (AA alkaline)',
+            0x01 => 'Ni-MH (AA Ni-MH)',
+            0x02 => 'FR6 (AA lithium)',
+        },
+    },
+    3.1 => { # CSd1-b
+        Name => 'BeepPitch',
+        Mask => 0xc0,
+        PrintConv => {
+            0x00 => 'Off',
+            0x40 => 'Low',
+            0x80 => 'High',
+        },
+    },
+    3.2 => { # CSf8
+        Name => 'NoMemoryCard',
+        Mask => 0x20,
+        PrintConv => {
+            0x00 => 'Release Locked',
+            0x20 => 'Enable Release',
+        },
+    },
+    3.3 => { # CSd3
+        Name => 'ISODisplay',
+        Mask => 0x0c,
+        PrintConv => {
+            0x00 => 'Show ISO/Easy ISO',
+            0x04 => 'Show ISO Sensitivity',
+            0x0c => 'Show Frame Count',
+        },
+    },
+    3.4 => { # CSd2
+        Name => 'GridDisplay',
+        Mask => 0x02,
+        PrintConv => { 0x00 => 'On', 0x02 => 'Off' },
+    },
+    3.5 => { # CSd4
+        Name => 'ViewfinderWarning',
+        Mask => 0x01,
+        PrintConv => { 0x00 => 'On', 0x01 => 'Off' },
+    },
+    4.1 => { # CSd9
+        Name => 'ShootingInfoDisplay',
+        Mask => 0xc0,
+        PrintConv => {
+            0x00 => 'Auto',
+            0x80 => 'Manual (dark on light)',
+            0xc0 => 'Manual (light on dark)',
+        },
+    },
+    4.2 => { # CSd10
+        Name => 'LCDIllumination',
+        Mask => 0x20,
+        PrintConv => { 0x00 => 'Off', 0x20 => 'On' },
+    },
+    4.3 => { # CSd8
+        Name => 'FileNumberSequence',
+        Mask => 0x08,
+        PrintConv => { 0x00 => 'On', 0x08 => 'Off' },
+    },
+    4.4 => { # CSd5
+        Name => 'ScreenTips',
+        Mask => 0x04,
+        PrintConv => { 0x00 => 'Off', 0x04 => 'On' },
+    },
+    4.5 => { # CSd1-a
+        Name => 'BeepVolume',
+        Mask => 0x03,
+        PrintConv => {
+            0x00 => 'Off',
+            0x01 => '1',
+            0x02 => '2',
+            0x03 => '3',
+        },
+    },
+    5.1 => { # CSf9
+        Name => 'ReverseIndicators',
+        Mask => 0x80,
+        PrintConv => {
+            0x00 => '+ 0 -',
+            0x80 => '- 0 +',
+        },
+    },
+    5.2 => { # CSb3
+        Name => 'EasyExposureCompensation',
+        Mask => 0x03,
+        PrintConv => {
+            0x00 => 'Off',
+            0x01 => 'On',
+            0x02 => 'On Auto Reset',
+        },
+    },
+    6.1 => { # CSb2
+        Name => 'ExposureControlStep',
+        Mask => 0x40,
+        PrintConv => {
+            0x00 => '1/3 EV',
+            0x40 => '1/2 EV',
+        },
+    },
+    6.2 => { # CSb1
+        Name => 'ISOSensitivityStep',
+        Mask => 0x10,
+        PrintConv => {
+            0x00 => '1/3 EV',
+            0x10 => '1/2 EV',
+        },
+    },
+    7.1 => { # CSb4
+        Name => 'CenterWeightedAreaSize',
+        Mask => 0xe0,
+        PrintConv => {
+            0x00 => '6 mm',
+            0x20 => '8 mm',
+            0x40 => '10 mm',
+            0x60 => '13 mm',
+            0x80 => 'Average',
+        },
+    },
+    10.1 => { # CSd11
+        Name => 'ExposureDelayMode',
+        Mask => 0x40,
+        PrintConv => {
+            0x00 => 'Off',
+            0x40 => 'On',
+        },
+    },
+    10.2 => { # CSd6
+        Name => 'CLModeShootingSpeed',
+        Mask => 0x07,
+        PrintConv => '"$val fps"',
+        PrintConvInv => '$val=~s/\s*fps//i; $val',
+    },
+    11 => { # CSd7
+        Name => 'MaxContinuousRelease',
+        # values: 1-100
+    },
+    12.1 => { # CSe5
+        Name => 'AutoBracketSet',
+        Mask => 0xe0, #(NC)
+        PrintConv => {
+            0x00 => 'AE & Flash', # default
+            0x20 => 'AE Only',
+            0x40 => 'Flash Only', #(NC)
+            0x60 => 'WB Bracketing', #(NC)
+            0x80 => 'Active D-Lighting', #(NC)
+        },
+    },
+    12.2 => { # CSe6
+        Name => 'AutoBracketOrder',
+        Mask => 0x10,
+        PrintConv => {
+            0x00 => '0,-,+',
+            0x10 => '-,0,+',
+        },
+    },
+    13.1 => { # CSf3
+        Name => 'FuncButton',
+        Mask => 0xf8,
+        PrintConv => {
+            0x00 => 'Grid Display',
+            0x08 => 'FV Lock',
+            0x10 => 'Flash Off',
+            0x18 => 'Matrix Metering',
+            0x20 => 'Center-weighted Metering',
+            0x28 => 'Spot Metering',
+            0x30 => 'My Menu Top',
+            0x38 => '+ NEF (RAW)',
+            0x40 => 'Active D-Lighting',
+            0x48 => 'Preview',
+            0x50 => 'AE/AF Lock',
+            0x58 => 'AE Lock Only',
+            0x60 => 'AF Lock Only',
+            0x68 => 'AE Lock (hold)',
+            0x70 => 'Bracketing Burst',
+            0x78 => 'Playback',
+            0x80 => '1EV Step Speed/Aperture',
+            0x88 => 'Choose Non-CPU Lens',
+            0x90 => 'Virtual Horizon',
+            0x98 => 'Start Movie Recording',
+        },
+    },
+    14.1 => { # CSf4
+        Name => 'PreviewButton',
+        Mask => 0xf8,
+        PrintConv => {
+            0x00 => 'Grid Display',
+            0x08 => 'FV Lock',
+            0x10 => 'Flash Off',
+            0x18 => 'Matrix Metering',
+            0x20 => 'Center-weighted Metering',
+            0x28 => 'Spot Metering',
+            0x30 => 'My Menu Top',
+            0x38 => '+ NEF (RAW)',
+            0x40 => 'Active D-Lighting',
+            0x48 => 'Preview',
+            0x50 => 'AE/AF Lock',
+            0x58 => 'AE Lock Only',
+            0x60 => 'AF Lock Only',
+            0x68 => 'AE Lock (hold)',
+            0x70 => 'Bracketing Burst',
+            0x78 => 'Playback',
+            0x80 => '1EV Step Speed/Aperture',
+            0x88 => 'Choose Non-CPU Lens',
+            0x90 => 'Virtual Horizon',
+            0x98 => 'Start Movie Recording',
+        },
+    },
+    16.1 => { # CSf5
+        Name => 'AELockButton',
+        Mask => 0x38,
+        PrintConv => {
+            0x00 => 'AE/AF Lock',
+            0x08 => 'AE Lock Only',
+            0x10 => 'AF Lock Only',
+            0x18 => 'AE Lock (hold)',
+            0x20 => 'AF-ON',
+            0x28 => 'FV Lock',
+        },
+    },
+    15.1 => { # CSf2
+        Name => 'OKButton',
+        Mask => 0x18,
+        PrintConv => {
+            0x08 => 'Select Center Focus Point',
+            0x10 => 'Highlight Active Focus Point',
+            0x18 => 'Not Used', #(NC)
+            0x00 => 'Off', #(NC)
+        },
+    },
+    17.1 => { # CSf6-a
+        Name => 'CommandDialsReverseRotation',
+        Mask => 0x80,
+        PrintConv => { 0x00 => 'No', 0x80 => 'Yes' },
+    },
+    17.2 => { # CSf6-b
+        Name => 'CommandDialsChangeMainSub',
+        Mask => 0x60,
+        PrintConv => {
+            0x00 => 'Off',
+            0x20 => 'On',
+            0x40 => 'On (A mode only)',
+        },
+    },
+    17.3 => { # CSf6-c
+        Name => 'CommandDialsApertureSetting',
+        Mask => 0x04,
+        PrintConv => {
+            0x00 => 'Sub-command Dial',
+            0x04 => 'Aperture Ring',
+        },
+    },
+    17.4 => { # CSf6-d
+        Name => 'CommandDialsMenuAndPlayback',
+        Mask => 0x18,
+        PrintConv => {
+            0x00 => 'On',
+            0x10 => 'On (Image Review Exclude)',
+            0x08 => 'Off',
+        },
+    },
+    17.5 => { # CSc1
+        Name => 'ShutterReleaseButtonAE-L',
+        Mask => 0x02,
+        PrintConv => { 0x00 => 'Off', 0x02 => 'On' },
+    },
+    17.6 => { # CSf7
+        Name => 'ReleaseButtonToUseDial',
+        Mask => 0x01,
+        PrintConv => { 0x00 => 'No', 0x01 => 'Yes' },
+    },
+    18.1 => { # CSc2
+        Name => 'MeteringTime',
+        Mask => 0xf0,
+        PrintConvColumns => 2,
+        PrintConv => {
+            0x00 => '4 s',
+            0x10 => '6 s', # default
+            0x20 => '8 s',
+            0x30 => '16 s',
+            0x40 => '30 s',
+            0x50 => '1 min',
+            0x60 => '5 min',
+            0x70 => '10 min',
+            0x80 => '30 min',
+            0x90 => 'No Limit',
+        },
+    },
+    18.2 => { # CSc5
+        Name => 'RemoteOnDuration',
+        Mask => 0x03,
+        PrintConv => {
+            0x00 => '1 min',
+            0x01 => '5 min',
+            0x02 => '10 min',
+            0x03 => '15 min',
+        },
+    },
+    19.1 => { # CSc3-a
+        Name => 'SelfTimerTime',
+        Mask => 0xc0,
+        PrintConv => {
+            0x00 => '2 s',
+            0x40 => '5 s',
+            0x80 => '10 s', # default
+            0xc0 => '20 s',
+        },
+    },
+    19.2 => { # CSc3-c
+        Name => 'SelfTimerInterval',
+        Mask => 0x30,
+        PrintConv => {
+            0x00 => '0.5 s',
+            0x10 => '1 s',
+            0x20 => '2 s', # default
+            0x30 => '3 s',
+        },
+    },
+    19.3 => { # CSc3-b
+        Name => 'SelfTimerShotCount',
+        Mask => 0x0f,
+    },
+    20.1 => { # CSc4-d
+        Name => 'ImageReviewTime',
+        Mask => 0xe0,
+        PrintConv => { # (NC)
+            0x00 => '4 s',
+            0x20 => '10 s', # default
+            0x40 => '20 s',
+            0x60 => '1 min',
+            0x80 => '5 min',
+            0xa0 => '10 min',
+        },
+    },
+    20.2 => { # CSc4-e
+        Name => 'LiveViewMonitorOffTime',
+        Mask => 0x1c,
+        PrintConv => { # (NC)
+            0x00 => '4 s',
+            0x04 => '10 s', # default
+            0x08 => '20 s',
+            0x0c => '1 min',
+            0x10 => '5 min',
+            0x14 => '10 min',
+        },
+    },
+    21.1 => { # CSc4-b
+        Name => 'MenuMonitorOffTime',
+        Mask => 0xe0,
+        PrintConv => {
+            0x00 => '4 s',
+            0x20 => '10 s', # default
+            0x40 => '20 s',
+            0x60 => '1 min',
+            0x80 => '5 min',
+            0xa0 => '10 min',
+        },
+    },
+    21.2 => { # CSc4-c
+        Name => 'ShootingInfoMonitorOffTime',
+        Mask => 0x1c,
+        PrintConv => { # (NC)
+            0x00 => '4 s',
+            0x04 => '10 s', # default
+            0x08 => '20 s',
+            0x0c => '1 min',
+            0x10 => '5 min',
+            0x14 => '10 min',
+        },
+    },
+    22.1 => { # CSe1
+        Name => 'FlashSyncSpeed',
+        Mask => 0xf0,
+        PrintConv => {
+            0x00 => '1/320 s (auto FP)',
+            0x10 => '1/250 s (auto FP)',
+            0x20 => '1/250 s',
+            0x30 => '1/200 s',
+            0x40 => '1/160 s',
+            0x50 => '1/125 s',
+            0x60 => '1/100 s',
+            0x70 => '1/80 s',
+            0x80 => '1/60 s',
+       },
+    },
+    22.2 => { # CSe2
+        Name => 'FlashShutterSpeed',
+        Mask => 0x0f,
+        PrintConvColumns => 2,
+        PrintConv => {
+            0x00 => '1/60 s',
+            0x01 => '1/30 s',
+            0x02 => '1/15 s',
+            0x03 => '1/8 s',
+            0x04 => '1/4 s',
+            0x05 => '1/2 s',
+            0x06 => '1 s',
+            0x07 => '2 s',
+            0x08 => '4 s',
+            0x09 => '8 s',
+            0x0a => '15 s',
+            0x0b => '30 s',
+        },
+    },
+    23.1 => { # CSe3
+        Name => 'FlashControlBuilt-in',
+        Mask => 0xc0,
+        RawConv => '$$self{FlashControlBuiltin} = $val & 0xc0',
+        PrintConv => {
+            0x00 => 'TTL',
+            0x40 => 'Manual',
+            0x80 => 'Repeating Flash',
+            0xc0 => 'Commander Mode',
+        },
+    },
+    23.2 => { # CSe3-b
+        Name => 'ManualFlashOutput',
+        Condition => '$$self{FlashControlBuiltin} == 0x40',
+        Mask => 0x1f,
+        ValueConv => '2 ** (-$val/3)',
+        ValueConvInv => '$val > 0 ? -3*log($val)/log(2) : 0',
+        PrintConv => q{
+            return 'Full' if $val > 0.99;
+            Image::ExifTool::Exif::PrintExposureTime($val);
+        },
+        PrintConvInv => '$val=~/F/i ? 1 : Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    24.1 => { # CSe3-ca
+        Name => 'RepeatingFlashOutput',
+        Condition => '$$self{FlashControlBuiltin} == 0x80',
+        Mask => 0x70,
+        ValueConv => '2 ** (-($val>>4)-2)',
+        ValueConvInv => '$val > 0 ? int(-log($val)/log(2)-2+0.5)<<4 : 0',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    24.2 => { # CSe3-cb
+        Name => 'RepeatingFlashCount',
+        Condition => '$$self{FlashControlBuiltin} == 0x80',
+        Mask => 0x0f,
+        ValueConv => '$val < 10 ? $val + 1 : 5 * ($val - 7)',
+        ValueConvInv => '$val <= 10 ? $val - 1 : $val / 5 + 7',
+    },
+    25.1 => { # CSe3-cc (NC)
+        Name => 'RepeatingFlashRate',
+        Condition => '$$self{FlashControlBuiltin} == 0x80',
+        Mask => 0xf0,
+        ValueConv => 'my $v=($val>>4); $v < 10 ? $v + 1 : 10 * ($v - 8)',
+        ValueConvInv => 'int(($val <= 10 ? $val - 1 : $val / 10 + 8) + 0.5) << 4',
+        PrintConv => '"$val Hz"',
+        PrintConvInv => '$val=~/(\d+)/; $1 || 0',
+    },
+    26.1 => { # CSe3-da
+        Name => 'CommanderInternalTTLCompBuiltin',
+        Condition => '$$self{FlashControlBuiltin} == 0xc0',
+        Mask => 0x1f,
+        ValueConv => '($val - 9) / 3',
+        ValueConvInv => '$val * 3 + 9',
+        PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
+        PrintConvInv => '$val',
+    },
+    27.1 => { # CSe3-db
+        Name => 'CommanderInternalTTLCompGroupA',
+        Condition => '$$self{FlashControlBuiltin} == 0xc0',
+        Mask => 0x1f,
+        ValueConv => '($val - 9) / 3',
+        ValueConvInv => '$val * 3 + 9',
+        PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
+        PrintConvInv => '$val',
+    },
+    28.1 => { # CSe3-dc
+        Name => 'CommanderInternalTTLCompGroupB',
+        Condition => '$$self{FlashControlBuiltin} == 0xc0',
+        Mask => 0x1f,
+        ValueConv => '($val - 9) / 3',
+        ValueConvInv => '$val * 3 + 9',
+        PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
+        PrintConvInv => '$val',
+    },
+    30.1 => { # CSd11
+        Name => 'FlashWarning',
+        Mask => 0x80,
+        PrintConv => {
+            0x00 => 'On',
+            0x80 => 'Off',
+        },
+    },
+    30.2 => { # CSe4
+        Name => 'ModelingFlash',
+        Mask => 0x20,
+        PrintConv => { 0x00 => 'On', 0x20 => 'Off' },
+    },
+    34.1 => { # CSa8-b
+        Name => 'LiveViewAFAreaMode',
+        Mask => 0x60,
+        PrintConv => {
+            0x00 => 'Face-Priority',
+            0x20 => 'NormalArea',
+            0x40 => 'WideArea',
+            0x60 => 'SubjectTracking',
+        },
+    },
+    34.2 => { # CSa8-a
+        Name => 'LiveViewAFMode',
+        Mask => 0x02,
+        PrintConv => {
+            0x00 => 'AF-C',
+            0x02 => 'AF-F',
+        },
+    },
+    35.1 => { # CSc4-a
+        Name => 'PlaybackMonitorOffTime',
+        Mask => 0xe0,
+        PrintConv => {
+            0x00 => '4 s',
+            0x20 => '10 s', # default
+            0x40 => '20 s',
+            0x60 => '1 min',
+            0x80 => '5 min',
+            0xa0 => '10 min',
+        },
+    },
+);
+
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::NikonCustom - Read and Write Nikon custom settings
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+The Nikon custom functions are very specific to the camera model (and
+sometimes even change with firmware version).  The information is stored as
+unformatted binary data in the ShotInfo record of the Nikon MakerNotes. 
+This module contains the definitions necessary for Image::ExifTool to decode
+this information.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Jens Duttke and Warren Hatch for their help decoding the D300 and
+D3 custom settings.  And thanks to the customer service personnel at Best
+Buy for not bugging me while I play with their cameras.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/Nikon Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/OOXML.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/OOXML.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/OOXML.pm	(revision 24799)
@@ -0,0 +1,408 @@
+#------------------------------------------------------------------------------
+# File:         OOXML.pm
+#
+# Description:  Read Office Open XML+ZIP files
+#
+# Revisions:    2009/10/31 - P. Harvey Created
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::OOXML;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::XMP;
+use Image::ExifTool::ZIP;
+
+$VERSION = '1.05';
+
+# test for recognized OOXML document extensions
+my %isOOXML = (
+    DOCX => 1,  DOCM => 1,
+    DOTX => 1,  DOTM => 1,
+    POTX => 1,  POTM => 1,
+    PPSX => 1,  PPSM => 1,
+    PPTX => 1,  PPTM => 1,  THMX => 1,
+    XLAM => 1,
+    XLSX => 1,  XLSM => 1,  XLSB => 1,
+    XLTX => 1,  XLTM => 1,
+);
+
+# generate reverse lookup for file type based on MIME
+my %fileType;
+{
+    my $type;
+    foreach $type (keys %isOOXML) {
+        $fileType{$Image::ExifTool::mimeType{$type}} = $type;
+    }
+}
+
+# XML attributes to queue
+my %queuedAttrs;
+my %queueAttrs = (
+    fmtid => 1,
+    pid   => 1,
+    name  => 1,
+);
+
+# keep track of items in a vector (to accumulate as a list)
+my $vectorCount;
+my @vectorVals;
+
+# Office Open XML tags
+%Image::ExifTool::OOXML::Main = (
+    GROUPS => { 0 => 'XML', 1 => 'XML', 2 => 'Document' },
+    PROCESS_PROC => \&Image::ExifTool::XMP::ProcessXMP,
+    VARS => { NO_ID => 1 },
+    NOTES => q{
+        The Office Open XML (OOXML) format was introduced with Microsoft Office 2007
+        and is used by file types such as DOCX, PPTX and XLSX.  These are
+        essentially ZIP archives containing XML files.  The table below lists some
+        tags which have been observed in OOXML documents, but ExifTool will extract
+        any tags found from XML files of the OOXML document properties ("docProps")
+        directory.
+
+        B<Tips:>
+        
+        1) Structural ZIP tags may be ignored (if desired) with C<--ZIP:all> on the
+        command line.
+        
+        2) Tags may be grouped by their document number in the ZIP archive with the
+        C<-g3> or C<-G3> option.
+    },
+    # These tags all have 1:1 correspondence with FlashPix tags except for:
+    #   OOXML            FlashPix
+    #   ---------------  -------------
+    #   DocSecurity      Security
+    #   Application      Software
+    #   dc:Description   Comments
+    #   dc:Creator       Author
+    Application => { },
+    AppVersion  => { },
+    category    => { },
+    Characters  => { },
+    CharactersWithSpaces => { },
+    CheckedBy   => { },
+    Client      => { },
+    Company     => { },
+    created     => {
+        Name => 'CreateDate',
+        Groups => { 2 => 'Time' },
+        Format => 'date',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    createdType => { Hidden => 1, RawConv => 'undef' }, # ignore this XML type name
+    DateCompleted => {
+        Groups => { 2 => 'Time' },
+        Format => 'date',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    Department  => { },
+    Destination => { },
+    Disposition => { },
+    Division    => { },
+    DocSecurity => {
+        # (http://msdn.microsoft.com/en-us/library/documentformat.openxml.extendedproperties.documentsecurity.aspx)
+        PrintConv => {
+            0 => 'None',
+            1 => 'Password protected',
+            2 => 'Read-only recommended',
+            4 => 'Read-only enforced',
+            8 => 'Locked for annotations',
+        },
+    },
+    DocumentNumber=> { },
+    Editor      => { Groups => { 2 => 'Author'} },
+    ForwardTo   => { },
+    Group       => { },
+    HeadingPairs=> { },
+    HiddenSlides=> { },
+    HyperlinkBase=>{ },
+    HyperlinksChanged => { PrintConv => { 'false' => 'No', 'true' => 'Yes' } },
+    keywords    => { },
+    Language    => { },
+    lastModifiedBy => { Groups => { 2 => 'Author'} },
+    lastPrinted => {
+        Groups => { 2 => 'Time' },
+        Format => 'date',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    Lines       => { },
+    LinksUpToDate=>{ PrintConv => { 'false' => 'No', 'true' => 'Yes' } },
+    Mailstop    => { },
+    Manager     => { },
+    Matter      => { },
+    MMClips     => { },
+    modified    => {
+        Name => 'ModifyDate', 
+        Groups => { 2 => 'Time' },
+        Format => 'date',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    modifiedType=> { Hidden => 1, RawConv => 'undef' }, # ignore this XML type name
+    Notes       => { },
+    Office      => { },
+    Owner       => { Groups => { 2 => 'Author'} },
+    Pages       => { },
+    Paragraphs  => { },
+    PresentationFormat => { },
+    Project     => { },
+    Publisher   => { },
+    Purpose     => { },
+    ReceivedFrom=> { },
+    RecordedBy  => { },
+    RecordedDate=> {
+        Groups => { 2 => 'Time' },
+        Format => 'date',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    Reference   => { },
+    revision    => { Name => 'RevisionNumber' },
+    ScaleCrop   => { PrintConv => { 'false' => 'No', 'true' => 'Yes' } },
+    SharedDoc   => { PrintConv => { 'false' => 'No', 'true' => 'Yes' } },
+    Slides      => { },
+    Source      => { },
+    Status      => { },
+    TelephoneNumber => { },
+    Template    => { },
+    TitlesOfParts=>{ },
+    TotalTime   => {
+        Name => 'TotalEditTime',
+        PrintConv => 'ConvertTimeSpan($val, 60)',
+    },
+    Typist      => { },
+    Words       => { },
+);
+
+#------------------------------------------------------------------------------
+# Generate a tag ID for this XML tag
+# Inputs: 0) tag property name list ref
+# Returns: tagID and outtermost interesting namespace (or '' if no namespace)
+sub GetTagID($)
+{
+    my $props = shift;
+    my ($tag, $prop, $namespace);
+    foreach $prop (@$props) {
+        # split name into namespace and property name
+        # (Note: namespace can be '' for property qualifiers)
+        my ($ns, $nm) = ($prop =~ /(.*?):(.*)/) ? ($1, $2) : ('', $prop);
+        next if $ns eq 'vt';        # ignore 'vt' properties
+        if (defined $tag) {
+            $tag .= ucfirst($nm);   # add to tag name
+        } elsif ($prop ne 'Properties' and $prop ne 'cp:coreProperties' and
+                 $prop ne 'property')
+        {
+            $tag = $nm;
+            # save namespace of first property to contribute to tag name
+            $namespace = $ns unless $namespace;
+        }
+    }
+    return ($tag, $namespace || '');
+}
+
+#------------------------------------------------------------------------------
+# We found an XMP property name/value
+# Inputs: 0) ExifTool object ref, 1) tag table ref
+#         2) reference to array of XMP property names (last is current property)
+#         3) property value, 4) attribute hash ref (not used here)
+# Returns: 1 if valid tag was found
+sub FoundTag($$$$;$)
+{
+    my ($exifTool, $tagTablePtr, $props, $val, $attrs) = @_;
+    return 0 unless @$props;
+    my $verbose = $exifTool->Options('Verbose');
+
+    my $tag = $$props[-1];
+    $exifTool->VPrint(0, "  | - Tag '", join('/',@$props), "'\n") if $verbose > 1;
+
+    # un-escape XML character entities
+    $val = Image::ExifTool::XMP::UnescapeXML($val);
+    # convert OOXML-escaped characters (ie. "_x0000d_" is a newline)
+    $val =~ s/_x([0-9a-f]{4})_/Image::ExifTool::PackUTF8(hex($1))/gie;
+    # convert from UTF8 to ExifTool Charset
+    $val = $exifTool->Decode($val, 'UTF8');
+    # queue this attribute for later if necessary
+    if ($queueAttrs{$tag}) {
+        $queuedAttrs{$tag} = $val;
+        return 0;
+    }
+    my $ns;
+    ($tag, $ns) = GetTagID($props);
+    if (not $tag) {
+        # all properties are in ignored namespaces
+        # so 'name' from our queued attributes for the tag
+        my $name = $queuedAttrs{name} or return 0;
+        $name =~ s/(^| )([a-z])/$1\U$2/g;     # start words with uppercase
+        ($tag = $name) =~ tr/-_a-zA-Z0-9//dc;
+        return 0 unless length $tag;
+        unless ($$tagTablePtr{$tag}) {
+            my %tagInfo = (
+                Name => $tag,
+                Description => $name,
+            );
+            # format as a date/time value if type is 'vt:filetime'
+            if ($$props[-1] eq 'vt:filetime') {
+                $tagInfo{Groups} = { 2 => 'Time' },
+                $tagInfo{Format} = 'date',
+                $tagInfo{PrintConv} = '$self->ConvertDateTime($val)';
+            }
+            $exifTool->VPrint(0, "  | [adding $tag]\n") if $verbose;
+            Image::ExifTool::AddTagToTable($tagTablePtr, $tag, \%tagInfo);
+        }
+    } elsif ($tag eq 'xmlns') {
+        # ignore namespaces (for now)
+        return 0;
+    } elsif (ref $Image::ExifTool::XMP::Main{$ns} eq 'HASH' and
+        $Image::ExifTool::XMP::Main{$ns}{SubDirectory})
+    {
+        # use standard XMP table if it exists
+        my $table = $Image::ExifTool::XMP::Main{$ns}{SubDirectory}{TagTable};
+        no strict 'refs';
+        if ($table and %$table) {
+            $tagTablePtr = Image::ExifTool::GetTagTable($table);
+        }
+    } elsif (@$props > 2 and grep /^vt:vector$/, @$props) {
+        # handle vector properties (accumulate as lists)
+        if ($$props[-1] eq 'vt:size') {
+            $vectorCount = $val;
+            undef @vectorVals;
+            return 0;
+        } elsif ($$props[-1] eq 'vt:baseType') {
+            return 0;   # ignore baseType
+        } elsif ($vectorCount) {
+            --$vectorCount;
+            if ($vectorCount) {
+                push @vectorVals, $val;
+                return 0;
+            }
+            $val = [ @vectorVals, $val ] if @vectorVals;
+            # Note: we will lose any improper-sized vector elements here
+        }
+    }
+    # add any unknown tags to table
+    if ($$tagTablePtr{$tag}) {
+        my $tagInfo = $$tagTablePtr{$tag};
+        if (ref $tagInfo eq 'HASH') {
+            # reformat date/time values
+            my $fmt = $$tagInfo{Format} || $$tagInfo{Writable} || '';
+            $val = Image::ExifTool::XMP::ConvertXMPDate($val) if $fmt eq 'date';
+        }
+    } else {
+        $exifTool->VPrint(0, "  [adding $tag]\n") if $verbose;
+        Image::ExifTool::AddTagToTable($tagTablePtr, $tag, { Name => ucfirst $tag });
+    }
+    # save the tag
+    $exifTool->HandleTag($tagTablePtr, $tag, $val);
+
+    # start fresh for next tag
+    undef $vectorCount;
+    undef %queuedAttrs;
+
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Extract information from an OOXML file
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1
+# Notes: Upon entry to this routine, the file type has already been verified
+# and the dirInfo hash contains 2 elements unique to this process proc:
+#   MIME    - mime type of main document from "[Content_Types].xml"
+#   ZIP     - reference to Archive::Zip object for this file
+sub ProcessDOCX($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $zip = $$dirInfo{ZIP};
+    my $tagTablePtr = GetTagTable('Image::ExifTool::OOXML::Main');
+    my $mime = $$dirInfo{MIME} || $Image::ExifTool::mimeType{DOCX};
+
+    # set the file type ('DOCX' by default)
+    my $fileType = $fileType{$mime};
+    if ($fileType) {
+        # THMX is a special case because its contents.main MIME types is PPTX
+        if ($fileType eq 'PPTX' and $$exifTool{FILE_EXT} and $$exifTool{FILE_EXT} eq 'THMX') {
+            $fileType = 'THMX';
+        }
+    } else {
+        $exifTool->VPrint(0, "Unrecognized MIME type: $mime\n");
+        # get MIME type according to file extension
+        $fileType = $$exifTool{FILE_EXT};
+        # default to 'DOCX' if this isn't a known OOXML extension
+        $fileType = 'DOCX' unless $fileType and $isOOXML{$fileType};
+    }
+    $exifTool->SetFileType($fileType);
+
+    # must catch all Archive::Zip warnings
+    local $SIG{'__WARN__'} = \&Image::ExifTool::ZIP::WarnProc;
+    # extract meta information from all files in ZIP "docProps" directory
+    my $docNum = 0;
+    my @members = $zip->members();
+    my $member;
+    foreach $member (@members) {
+        # get filename of this ZIP member
+        my $file = $member->fileName();
+        next unless defined $file;
+        $exifTool->VPrint(0, "File: $file\n");
+        # set the document number and extract ZIP tags
+        $$exifTool{DOC_NUM} = ++$docNum;
+        Image::ExifTool::ZIP::HandleMember($exifTool, $member);
+        # process only XML and JPEG files in "docProps" directory
+        next unless $file =~ m{^docProps/.*\.(xml|jpe?g)$}i;
+        # get the file contents (CAREFUL! $buff MUST be local since we hand off a value ref)
+        my ($buff, $status) = $zip->contents($member);
+        $status and $exifTool->Warn("Error extracting $file"), next;
+        # extract JPEG as PreviewImage (should only be docProps/thumbnail.jpeg)
+        if ($file =~ /\.jpe?g/i) {
+            $exifTool->FoundTag('PreviewImage', \$buff);
+            next;
+        }
+        # process XML files (docProps/app.xml, docProps/core.xml, docProps/custom.xml)
+        my %dirInfo = (
+            DataPt => \$buff,
+            DirLen => length $buff,
+            DataLen => length $buff,
+            XMPParseOpts => {
+                FoundProc => \&FoundTag,
+            },
+        );
+        $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+        undef $buff;    # (free memory now)
+    }
+    delete $$exifTool{DOC_NUM};
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::OOXML - Read Office Open XML+ZIP files
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to extract meta
+information from Office Open XML files.  This is the format of Word, Excel
+and PowerPoint files written by Microsoft Office 2007 -- essentially ZIP
+archives of XML files.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/OOXML Tags>,
+L<Image::ExifTool::TagNames/FlashPix Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Olympus.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Olympus.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Olympus.pm	(revision 24799)
@@ -0,0 +1,3405 @@
+#------------------------------------------------------------------------------
+# File:         Olympus.pm
+#
+# Description:  Olympus/Epson EXIF maker notes tags
+#
+# Revisions:    12/09/2003 - P. Harvey Created
+#               11/11/2004 - P. Harvey Added Epson support
+#
+# References:   1) http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html
+#               2) http://www.cybercom.net/~dcoffin/dcraw/
+#               3) http://www.ozhiker.com/electronics/pjmt/jpeg_info/olympus_mn.html
+#               4) Markku Hnninen private communication (tests with E-1)
+#               5) Rmi Guyomarch from http://forums.dpreview.com/forums/read.asp?forum=1022&message=12790396
+#               6) Frank Ledwon private communication (tests with E/C-series cameras)
+#               7) Michael Meissner private communication
+#               8) Shingo Noguchi, PhotoXP (http://www.daifukuya.com/photoxp/)
+#               9) Mark Dapoz private communication
+#              10) Lilo Huang private communication (E-330)
+#              11) http://olypedia.de/Olympus_Makernotes
+#              12) Ioannis Panagiotopoulos private communication (E-510)
+#              13) Chris Shaw private communication (E-3)
+#              14) Viktor Lushnikov private communication (E-400)
+#              15) Yrjo Rauste private communication (E-30)
+#              16) Godfrey DiGiorgi private communcation (E-P1) + http://forums.dpreview.com/forums/read.asp?message=33187567
+#              17) Martin Hibers private communication
+#              18) Tomasz Kawecki private communication
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Olympus;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool::Exif;
+use Image::ExifTool::APP12;
+
+$VERSION = '1.79';
+
+sub PrintLensInfo($$$);
+
+my %offOn = ( 0 => 'Off', 1 => 'On' );
+
+# lookup for Olympus LensType values
+my %olympusLensTypes = (
+    '0 0 0'  => 'None',
+    # Olympus lenses
+    '0 1 0'  => 'Olympus Zuiko Digital ED 50mm F2.0 Macro',
+    '0 1 1'  => 'Olympus Zuiko Digital 40-150mm F3.5-4.5', #8
+    '0 1 16' => 'Olympus M.Zuiko Digital ED 14-42mm F3.5-5.6', #PH (E-P1 pre-production)
+    '0 2 0'  => 'Olympus Zuiko Digital ED 150mm F2.0',
+    '0 2 16' => 'Olympus M.Zuiko Digital 17mm F2.8 Pancake', #PH (E-P1 pre-production)
+    '0 3 0'  => 'Olympus Zuiko Digital ED 300mm F2.8',
+    '0 3 16' => 'Olympus M.Zuiko Digital ED 14-150mm F4.0-5.6', #11
+    '0 4 16' => 'Olympus M.Zuiko Digital ED 9-18mm F4.0-5.6', #11
+    '0 5 0'  => 'Olympus Zuiko Digital 14-54mm F2.8-3.5',
+    '0 5 1'  => 'Olympus Zuiko Digital Pro ED 90-250mm F2.8', #9
+    '0 5 16' => 'Olympus M.Zuiko Digital ED 14-42mm F3.5-5.6', #11
+    '0 6 0'  => 'Olympus Zuiko Digital ED 50-200mm F2.8-3.5',
+    '0 6 1'  => 'Olympus Zuiko Digital ED 8mm F3.5 Fisheye', #9
+    '0 7 0'  => 'Olympus Zuiko Digital 11-22mm F2.8-3.5',
+    '0 7 1'  => 'Olympus Zuiko Digital 18-180mm F3.5-6.3', #6
+    '0 8 1'  => 'Olympus Zuiko Digital 70-300mm F4.0-5.6', #7 (seen as release 1 - PH)
+    '0 9 16' => 'Olympus M.Zuiko Digital 14-42mm F3.5-5.6 II', #PH (E-PL2)
+    '0 21 0' => 'Olympus Zuiko Digital ED 7-14mm F4.0',
+    '0 23 0' => 'Olympus Zuiko Digital Pro ED 35-100mm F2.0', #7
+    '0 24 0' => 'Olympus Zuiko Digital 14-45mm F3.5-5.6',
+    '0 32 0' => 'Olympus Zuiko Digital 35mm F3.5 Macro', #9
+    '0 34 0' => 'Olympus Zuiko Digital 17.5-45mm F3.5-5.6', #9
+    '0 35 0' => 'Olympus Zuiko Digital ED 14-42mm F3.5-5.6', #PH
+    '0 36 0' => 'Olympus Zuiko Digital ED 40-150mm F4.0-5.6', #PH
+    '0 48 0' => 'Olympus Zuiko Digital ED 50-200mm F2.8-3.5 SWD', #7
+    '0 49 0' => 'Olympus Zuiko Digital ED 12-60mm F2.8-4.0 SWD', #7
+    '0 50 0' => 'Olympus Zuiko Digital ED 14-35mm F2.0 SWD', #PH
+    '0 51 0' => 'Olympus Zuiko Digital 25mm F2.8', #PH
+    '0 52 0' => 'Olympus Zuiko Digital ED 9-18mm F4.0-5.6', #7
+    '0 53 0' => 'Olympus Zuiko Digital 14-54mm F2.8-3.5 II', #PH
+    # Sigma lenses
+    '1 1 0'  => 'Sigma 18-50mm F3.5-5.6', #8
+    '1 2 0'  => 'Sigma 55-200mm F4.0-5.6 DC',
+    '1 3 0'  => 'Sigma 18-125mm F3.5-5.6 DC',
+    '1 4 0'  => 'Sigma 18-125mm F3.5-5.6', #7
+    '1 5 0'  => 'Sigma 30mm F1.4', #10
+    '1 6 0'  => 'Sigma 50-500mm F4.0-6.3 EX DG APO HSM RF', #6
+    '1 7 0'  => 'Sigma 105mm F2.8 DG', #PH
+    '1 8 0'  => 'Sigma 150mm F2.8 DG HSM', #PH
+    '1 16 0' => 'Sigma 24mm F1.8 EX DG Aspherical Macro', #PH
+    '1 17 0' => 'Sigma 135-400mm F4.5-5.6 DG ASP APO RF', #11
+    '1 18 0' => 'Sigma 300-800mm F5.6 EX DG APO', #11
+    '1 20 0' => 'Sigma 50-500mm F4.0-6.3 EX DG APO HSM RF', #11
+    '1 21 0' => 'Sigma 10-20mm F4.0-5.6 EX DC HSM', #11
+    '1 22 0' => 'Sigma 70-200mm F2.8 EX DG Macro HSM II', #11
+    '1 23 0' => 'Sigma 50mm F1.4 EX DG HSM', #11
+    # Leica lenses (ref 11)
+    '2 1 0'  => 'Leica D Vario Elmarit 14-50mm F2.8-3.5 Asph.',
+    '2 1 16' => 'Lumix G Vario 14-45mm F3.5-5.6 Asph. Mega OIS', #16
+    '2 2 0'  => 'Leica D Summilux 25mm F1.4 Asph.',
+    '2 2 16' => 'Lumix G Vario 45-200mm F4-5.6 Mega OIS', #16
+    '2 3 1'  => 'Leica D Vario Elmar 14-50mm F3.8-5.6 Asph.', #14 (L10 kit)
+    '2 3 16' => 'Lumix G Vario HD 14-140mm F4-5.8 Asph. Mega OIS', #16
+    '2 4 0'  => 'Leica D Vario Elmar 14-150mm F3.5-5.6', #13
+    '2 4 16' => 'Lumix G Vario 7-14mm F4 Asph.', #PH (E-P1 pre-production)
+    '2 5 16' => 'Lumix G 20mm F1.7 Asph.', #16
+    '2 6 16' => 'Leica DG Macro-Elmarit 45mm F2.8', #PH
+    '2 8 16' => 'Lumix G Fisheye 8mm F3.5', #PH
+    '3 1 0'  => 'Leica D Vario Elmarit 14-50mm F2.8-3.5 Asph.',
+    '3 2 0'  => 'Leica D Summilux 25mm F1.4 Asph.',
+);
+
+# ArtFilter and MagicFilter values (ref PH)
+my %filters = (
+    '0'    => 'Off',
+    '1' => 'Soft Focus',
+    '2' => 'Pop Art',
+    '3' => 'Pale & Light Color',
+    '4' => 'Light Tone',
+    '5' => 'Pin Hole',
+    '6' => 'Grainy Film',
+    '9' => 'Diorama',
+    '10' => 'Cross Process',
+    '12' => 'Fish Eye',
+    '13' => 'Drawing',
+    # Punk? Sparkle?
+);
+
+# tag information for WAV "Index" tags
+my %indexInfo = (
+    Format => 'int32u',
+    RawConv => '$val == 0xffffffff ? undef : $val',
+    ValueConv => '$val / 1000',
+    PrintConv => 'ConvertDuration($val)',
+);
+
+# Olympus tags
+%Image::ExifTool::Olympus::Main = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    WRITABLE => 1,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+#
+# Tags 0x0000 through 0x0103 are the same as Konica/Minolta cameras (ref 3)
+# (removed 0x0101-0x0103 because they weren't supported by my samples - PH)
+#
+    0x0000 => {
+        Name => 'MakerNoteVersion',
+        Writable => 'undef',
+    },
+    0x0001 => {
+        Name => 'MinoltaCameraSettingsOld',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Minolta::CameraSettings',
+            ByteOrder => 'BigEndian',
+        },
+    },
+    0x0003 => {
+        Name => 'MinoltaCameraSettings',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Minolta::CameraSettings',
+            ByteOrder => 'BigEndian',
+        },
+    },
+    0x0040 => {
+        Name => 'CompressedImageSize',
+        Writable => 'int32u',
+    },
+    0x0081 => {
+        Name => 'PreviewImageData',
+        Binary => 1,
+        Writable => 0,
+    },
+    0x0088 => {
+        Name => 'PreviewImageStart',
+        Flags => 'IsOffset',
+        OffsetPair => 0x0089, # point to associated byte count
+        DataTag => 'PreviewImage',
+        Writable => 0,
+        Protected => 2,
+    },
+    0x0089 => {
+        Name => 'PreviewImageLength',
+        OffsetPair => 0x0088, # point to associated offset
+        DataTag => 'PreviewImage',
+        Writable => 0,
+        Protected => 2,
+    },
+    0x0100 => {
+        Name => 'ThumbnailImage',
+        Writable => 'undef',
+        WriteCheck => '$self->CheckImage(\$val)',
+        Binary => 1,
+    },
+    0x0104 => { #11
+        Name => 'BodyFirmwareVersion',
+        Writable => 'string',
+    },
+#
+# end Konica/Minolta tags
+#
+    0x0200 => {
+        Name => 'SpecialMode',
+        Notes => q{
+            3 numbers: 1. Shooting mode: 0=Normal, 2=Fast, 3=Panorama;
+            2. Sequence Number; 3. Panorama Direction: 1=Left-Right,
+            2=Right-Left, 3=Bottom-Top, 4=Top-Bottom
+        },
+        Writable => 'int32u',
+        Count => 3,
+        PrintConv => sub { #3
+            my $val = shift;
+            my @v = split ' ', $val;
+            return $val unless @v >= 3;
+            my @v0 = ('Normal','Unknown (1)','Fast','Panorama');
+            my @v2 = ('(none)','Left to Right','Right to Left','Bottom to Top','Top to Bottom');
+            $val = $v0[$v[0]] || "Unknown ($v[0])";
+            $val .= ", Sequence: $v[1]";
+            $val .= ', Panorama: ' . ($v2[$v[2]] || "Unknown ($v[2])");
+            return $val;
+        },
+    },
+    0x0201 => {
+        Name => 'Quality',
+        Writable => 'int16u',
+        Notes => q{
+            Quality values are decoded based on the CameraType tag. All types
+            represent SQ, HQ and SHQ as sequential integers, but in general
+            SX-type cameras start with a value of 0 for SQ while others start
+            with 1
+        },
+        # These values are different for different camera types
+        # (can't have Condition based on CameraType because it isn't known
+        #  when this tag is extracted)
+        PrintConv => sub {
+            my ($val, $self) = @_;
+            my %t1 = ( # all SX camera types except SX151
+                0 => 'SQ (Low)',
+                1 => 'HQ (Normal)',
+                2 => 'SHQ (Fine)',
+                6 => 'RAW', #PH - C5050WZ
+            );
+            my %t2 = ( # all other types
+                1 => 'SQ (Low)',
+                2 => 'HQ (Normal)',
+                3 => 'SHQ (Fine)',
+                4 => 'RAW',
+                5 => 'Medium-Fine', #PH
+                6 => 'Small-Fine', #PH
+                33 => 'Uncompressed', #PH - C2100Z
+            );
+            my $conv = $self->{CameraType} =~ /^SX(?!151\b)/ ? \%t1 : \%t2;
+            return $$conv{$val} ? $$conv{$val} : "Unknown ($val)";
+        },
+        # (no PrintConvInv because we don't know CameraType at write time)
+    },
+    0x0202 => {
+        Name => 'Macro',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'On',
+            2 => 'Super Macro', #6
+        },
+    },
+    0x0203 => { #6
+        Name => 'BWMode',
+        Description => 'Black And White Mode',
+        Writable => 'int16u',
+        PrintConv => \%offOn,
+    },
+    0x0204 => {
+        Name => 'DigitalZoom',
+        Writable => 'rational64u',
+        PrintConv => '$val=~/\./ or $val.=".0"; $val',
+        PrintConvInv => '$val',
+    },
+    0x0205 => { #6
+        Name => 'FocalPlaneDiagonal',
+        Writable => 'rational64u',
+        PrintConv => '"$val mm"',
+        PrintConvInv => '$val=~s/\s*mm$//;$val',
+    },
+    0x0206 => { #6
+        Name => 'LensDistortionParams',
+        Writable => 'int16s',
+        Count => 6,
+    },
+    0x0207 => { #PH (was incorrectly FirmwareVersion, ref 1,3)
+        Name => 'CameraType',
+        Writable => 'string',
+        DataMember => 'CameraType',
+        RawConv => '$self->{CameraType} = $val',
+    },
+    0x0208 => {
+        Name => 'TextInfo',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Olympus::TextInfo',
+        },
+    },
+    0x0209 => {
+        Name => 'CameraID',
+        Format => 'string', # this really should have been a string
+    },
+    0x020b => { #PH
+        Name => 'EpsonImageWidth',
+        Writable => 'int16u',
+    },
+    0x020c => { #PH
+        Name => 'EpsonImageHeight',
+        Writable => 'int16u',
+    },
+    0x020d => { #PH
+        Name => 'EpsonSoftware',
+        Writable => 'string',
+    },
+    0x0280 => { #PH
+        %Image::ExifTool::previewImageTagInfo,
+        Notes => 'found in ERF and JPG images from some Epson models',
+        Format => 'undef',
+        Writable => 'int8u',
+    },
+    0x0300 => { #6
+        Name => 'PreCaptureFrames',
+        Writable => 'int16u',
+    },
+    0x0301 => { #11
+        Name => 'WhiteBoard',
+        Writable => 'int16u',
+    },
+    0x0302 => { #6
+        Name => 'OneTouchWB',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'On',
+            2 => 'On (Preset)',
+        },
+    },
+    0x0303 => { #11
+        Name => 'WhiteBalanceBracket',
+        Writable => 'int16u',
+    },
+    0x0304 => { #11
+        Name => 'WhiteBalanceBias',
+        Writable => 'int16u',
+    },
+   # 0x0305 => 'PrintMaching', ? #11
+    0x0403 => { #11
+        Name => 'SceneMode',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Normal',
+            1 => 'Standard',
+            2 => 'Auto',
+            3 => 'Intelligent Auto', #PH (guess, u7040)
+            4 => 'Portrait',
+            5 => 'Landscape+Portrait',
+            6 => 'Landscape',
+            7 => 'Night Scene',
+            8 => 'Night+Portrait',
+            9 => 'Sport',
+            10 => 'Self Portrait',
+            11 => 'Indoor',
+            12 => 'Beach & Snow',
+            13 => 'Beach',
+            14 => 'Snow',
+            15 => 'Self Portrait+Self Timer',
+            16 => 'Sunset',
+            17 => 'Cuisine',
+            18 => 'Documents',
+            19 => 'Candle',
+            20 => 'Fireworks',
+            21 => 'Available Light',
+            22 => 'Vivid',
+            23 => 'Underwater Wide1',
+            24 => 'Underwater Macro',
+            25 => 'Museum',
+            26 => 'Behind Glass',
+            27 => 'Auction',
+            28 => 'Shoot & Select1',
+            29 => 'Shoot & Select2',
+            30 => 'Underwater Wide2',
+            31 => 'Digital Image Stabilization',
+            32 => 'Face Portrait',
+            33 => 'Pet',
+            34 => 'Smile Shot',
+            101 => 'Magic Filter', #PH
+        },
+    },
+    0x0404 => { #PH (D595Z, C7070WZ)
+        Name => 'SerialNumber',
+        Writable => 'string',
+    },
+    0x0405 => { #11
+        Name => 'Firmware',
+        Writable => 'string',
+    },
+    0x0e00 => {
+        Name => 'PrintIM',
+        Description => 'Print Image Matching',
+        Writable => 0,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::PrintIM::Main',
+        },
+    },
+    0x0f00 => {
+        Name => 'DataDump',
+        Writable => 0,
+        Binary => 1,
+    },
+    0x0f01 => { #6
+        Name => 'DataDump2',
+        Writable => 0,
+        Binary => 1,
+    },
+    0x0f04 => {
+        Name => 'ZoomedPreviewStart',
+        # NOTE: this tag is not currently updated properly when the image is rewritten!
+        OffsetPair => 0xf05,
+        DataTag => 'ZoomedPreviewImage',
+        Writable => 'int32u',
+        Protected => 2,
+    },
+    0x0f05 => {
+        Name => 'ZoomedPreviewLength',
+        OffsetPair => 0xf04,
+        DataTag => 'ZoomedPreviewImage',
+        Writable => 'int32u',
+        Protected => 2,
+    },
+    0x0f06 => {
+        Name => 'ZoomedPreviewSize',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x1000 => { #6
+        Name => 'ShutterSpeedValue',
+        Writable => 'rational64s',
+        Priority => 0,
+        ValueConv => 'abs($val)<100 ? 2**(-$val) : 0',
+        ValueConvInv => '$val>0 ? -log($val)/log(2) : -100',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    0x1001 => { #6
+        Name => 'ISOValue',
+        Writable => 'rational64s',
+        Priority => 0,
+        ValueConv => '100 * 2 ** ($val - 5)',
+        ValueConvInv => '$val>0 ? log($val/100)/log(2)+5 : 0',
+        PrintConv => 'int($val * 100 + 0.5) / 100',
+        PrintConvInv => '$val',
+    },
+    0x1002 => { #6
+        Name => 'ApertureValue',
+        Writable => 'rational64s',
+        Priority => 0,
+        ValueConv => '2 ** ($val / 2)',
+        ValueConvInv => '$val>0 ? 2*log($val)/log(2) : 0',
+        PrintConv => 'sprintf("%.1f",$val)',
+        PrintConvInv => '$val',
+    },
+    0x1003 => { #6
+        Name => 'BrightnessValue',
+        Writable => 'rational64s',
+        Priority => 0,
+    },
+    0x1004 => { #3
+        Name => 'FlashMode',
+        Writable => 'int16u',
+        PrintConv => {
+            2 => 'On', #PH
+            3 => 'Off', #PH
+        },
+    },
+    0x1005 => { #6
+        Name => 'FlashDevice',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'None',
+            1 => 'Internal',
+            4 => 'External',
+            5 => 'Internal + External',
+        },
+    },
+    0x1006 => { #6
+        Name =>'ExposureCompensation',
+        Writable => 'rational64s',
+    },
+    0x1007 => { #6 (E-10, E-20 and C2500L - numbers usually around 30-40)
+        Name => 'SensorTemperature',
+        Writable => 'int16s',
+    },
+    0x1008 => { #6
+        Name => 'LensTemperature',
+        Writable => 'int16s',
+    },
+    0x1009 => { #11
+        Name => 'LightCondition',
+        Writable => 'int16u',
+    },
+    0x100a => { #11
+        Name => 'FocusRange',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Normal',
+            1 => 'Macro',
+        },
+    },
+    0x100b => { #6
+        Name => 'FocusMode',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Auto',
+            1 => 'Manual',
+        },
+    },
+    0x100c => { #6
+        Name => 'ManualFocusDistance',
+        Writable => 'rational64u',
+        PrintConv => '"$val mm"', #11
+        PrintConvInv => '$val=~s/\s*mm$//; $val',
+    },
+    0x100d => { #6
+        Name => 'ZoomStepCount',
+        Writable => 'int16u',
+    },
+    0x100e => { #6
+        Name => 'FocusStepCount',
+        Writable => 'int16u',
+    },
+    0x100f => { #6
+        Name => 'Sharpness',
+        Writable => 'int16u',
+        Priority => 0,
+        PrintConv => {
+            0 => 'Normal',
+            1 => 'Hard',
+            2 => 'Soft',
+        },
+    },
+    0x1010 => { #6
+        Name => 'FlashChargeLevel',
+        Writable => 'int16u',
+    },
+    0x1011 => { #3
+        Name => 'ColorMatrix',
+        Writable => 'int16u',
+        Format => 'int16s',
+        Count => 9,
+    },
+    0x1012 => { #3
+        Name => 'BlackLevel',
+        Writable => 'int16u',
+        Count => 4,
+    },
+    0x1013 => { #11
+        Name => 'ColorTemperatureBG',
+        Writable => 'int16u',
+        Unknown => 1, # (doesn't look like a temperature)
+    },
+    0x1014 => { #11
+        Name => 'ColorTemperatureRG',
+        Writable => 'int16u',
+        Unknown => 1, # (doesn't look like a temperature)
+    },
+    0x1015 => { #6
+        Name => 'WBMode',
+        Writable => 'int16u',
+        Count => 2,
+        PrintConv => {
+            '1'   => 'Auto',
+            '1 0' => 'Auto',
+            '1 2' => 'Auto (2)',
+            '1 4' => 'Auto (4)',
+            '2 2' => '3000 Kelvin',
+            '2 3' => '3700 Kelvin',
+            '2 4' => '4000 Kelvin',
+            '2 5' => '4500 Kelvin',
+            '2 6' => '5500 Kelvin',
+            '2 7' => '6500 Kelvin',
+            '2 8' => '7500 Kelvin',
+            '3 0' => 'One-touch',
+        },
+    },
+    0x1017 => { #2
+        Name => 'RedBalance',
+        Writable => 'int16u',
+        Count => 2,
+        ValueConv => '$val=~s/ .*//; $val / 256',
+        ValueConvInv => '$val*=256;"$val 64"',
+    },
+    0x1018 => { #2
+        Name => 'BlueBalance',
+        Writable => 'int16u',
+        Count => 2,
+        ValueConv => '$val=~s/ .*//; $val / 256',
+        ValueConvInv => '$val*=256;"$val 64"',
+    },
+    0x1019 => { #11
+        Name => 'ColorMatrixNumber',
+        Writable => 'int16u',
+    },
+    # 0x101a is same as CameraID ("OLYMPUS DIGITAL CAMERA") for C2500L - PH
+    0x101a => { #3
+        Name => 'SerialNumber',
+        Writable => 'string',
+    },
+    0x101b => { #11
+        Name => 'ExternalFlashAE1_0',
+        Writable => 'int32u',
+        Unknown => 1, # (what are these?)
+    },
+    0x101c => { #11
+        Name => 'ExternalFlashAE2_0',
+        Writable => 'int32u',
+        Unknown => 1,
+    },
+    0x101d => { #11
+        Name => 'InternalFlashAE1_0',
+        Writable => 'int32u',
+        Unknown => 1,
+    },
+    0x101e => { #11
+        Name => 'InternalFlashAE2_0',
+        Writable => 'int32u',
+        Unknown => 1,
+    },
+    0x101f => { #11
+        Name => 'ExternalFlashAE1',
+        Writable => 'int32u',
+        Unknown => 1,
+    },
+    0x1020 => { #11
+        Name => 'ExternalFlashAE2',
+        Writable => 'int32u',
+        Unknown => 1,
+    },
+    0x1021 => { #11
+        Name => 'InternalFlashAE1',
+        Writable => 'int32u',
+        Unknown => 1,
+    },
+    0x1022 => { #11
+        Name => 'InternalFlashAE2',
+        Writable => 'int32u',
+        Unknown => 1,
+    },
+    0x1023 => { #6
+        Name => 'FlashExposureComp',
+        Writable => 'rational64s',
+    },
+    0x1024 => { #11
+        Name => 'InternalFlashTable',
+        Writable => 'int16u',
+    },
+    0x1025 => { #11
+        Name => 'ExternalFlashGValue',
+        Writable => 'rational64s',
+    },
+    0x1026 => { #6
+        Name => 'ExternalFlashBounce',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'No',
+            1 => 'Yes',
+        },
+    },
+    0x1027 => { #6
+        Name => 'ExternalFlashZoom',
+        Writable => 'int16u',
+    },
+    0x1028 => { #6
+        Name => 'ExternalFlashMode',
+        Writable => 'int16u',
+    },
+    0x1029 => { #3
+        Name => 'Contrast',
+        Writable => 'int16u',
+        PrintConv => { #PH (works with E1)
+            0 => 'High',
+            1 => 'Normal',
+            2 => 'Low',
+        },
+    },
+    0x102a => { #3
+        Name => 'SharpnessFactor',
+        Writable => 'int16u',
+    },
+    0x102b => { #3
+        Name => 'ColorControl',
+        Writable => 'int16u',
+        Count => 6,
+    },
+    0x102c => { #3
+        Name => 'ValidBits',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x102d => { #3
+        Name => 'CoringFilter',
+        Writable => 'int16u',
+    },
+    0x102e => { #PH
+        Name => 'OlympusImageWidth',
+        Writable => 'int32u',
+    },
+    0x102f => { #PH
+        Name => 'OlympusImageHeight',
+        Writable => 'int32u',
+    },
+    0x1030 => { #11
+        Name => 'SceneDetect',
+        Writable => 'int16u',
+    },
+    0x1031 => { #11
+        Name => 'SceneArea',
+        Writable => 'int32u',
+        Count => 8,
+        Unknown => 1, # (numbers don't make much sense?)
+    },
+    # 0x1032 HAFFINAL? #11
+    0x1033 => { #11
+        Name => 'SceneDetectData',
+        Writable => 'int32u',
+        Count => 720,
+        Binary => 1,
+        Unknown => 1, # (but what does it mean?)
+    },
+    0x1034 => { #3
+        Name => 'CompressionRatio',
+        Writable => 'rational64u',
+    },
+    0x1035 => { #6
+        Name => 'PreviewImageValid',
+        Writable => 'int32u',
+        PrintConv => { 0 => 'No', 1 => 'Yes' },
+    },
+    0x1036 => { #6
+        Name => 'PreviewImageStart',
+        Flags => 'IsOffset',
+        OffsetPair => 0x1037, # point to associated byte count
+        DataTag => 'PreviewImage',
+        Writable => 'int32u',
+        Protected => 2,
+    },
+    0x1037 => { #6
+        # (may contain data from multiple previews - PH, FE320)
+        Name => 'PreviewImageLength',
+        OffsetPair => 0x1036, # point to associated offset
+        DataTag => 'PreviewImage',
+        Writable => 'int32u',
+        Protected => 2,
+    },
+    0x1038 => { #11
+        Name => 'AFResult',
+        Writable => 'int16u',
+    },
+    0x1039 => { #6
+        Name => 'CCDScanMode',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Interlaced',
+            1 => 'Progressive',
+        },
+    },
+    0x103a => { #6
+        Name => 'NoiseReduction',
+        Writable => 'int16u',
+        PrintConv => \%offOn,
+    },
+    0x103b => { #6
+        Name => 'FocusStepInfinity',
+        Writable => 'int16u',
+    },
+    0x103c => { #6
+        Name => 'FocusStepNear',
+        Writable => 'int16u',
+    },
+    0x103d => { #11
+        Name => 'LightValueCenter',
+        Writable => 'rational64s',
+    },
+    0x103e => { #11
+        Name => 'LightValuePeriphery',
+        Writable => 'rational64s',
+    },
+    0x103f => { #11
+        Name => 'FieldCount',
+        Writable => 'int16u',
+        Unknown => 1, # (but what does it mean?)
+    },
+#
+# Olympus really screwed up the format of the following subdirectories (for the
+# E-1 and E-300 anyway). Not only is the subdirectory value data not included in
+# the size, but also the count is 2 bytes short for the subdirectory itself
+# (presumably the Olympus programmers forgot about the 2-byte entry count at the
+# start of the subdirectory).  This mess is straightened out and these subdirs
+# are written properly when ExifTool rewrites the file.  Note that this problem
+# has been fixed by Olympus in the new-style IFD maker notes since a standard
+# SubIFD offset value is used.  As written by the camera, the old style
+# directories have format 'undef' or 'string', and the new style has format
+# 'ifd'.  However, some older versions of exiftool may have rewritten the new
+# style as 'int32u', so handle both cases. - PH
+#
+    0x2010 => [ #PH
+        {
+            Name => 'Equipment',
+            Condition => '$format ne "ifd" and $format ne "int32u"',
+            NestedHtmlDump => 2, # (so HtmlDump doesn't show these as double-referenced)
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::Equipment',
+                ByteOrder => 'Unknown',
+            },
+        },
+        {
+            Name => 'EquipmentIFD',
+            Groups => { 1 => 'MakerNotes' },    # SubIFD needs group 1 set
+            Flags => 'SubIFD',
+            FixFormat => 'ifd',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::Equipment',
+                Start => '$val',
+            },
+        },
+    ],
+    0x2020 => [ #PH
+        {
+            Name => 'CameraSettings',
+            Condition => '$format ne "ifd" and $format ne "int32u"',
+            NestedHtmlDump => 2,
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::CameraSettings',
+                ByteOrder => 'Unknown',
+            },
+        },
+        {
+            Name => 'CameraSettingsIFD',
+            Groups => { 1 => 'MakerNotes' },
+            Flags => 'SubIFD',
+            FixFormat => 'ifd',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::CameraSettings',
+                Start => '$val',
+            },
+        },
+    ],
+    0x2030 => [ #PH
+        {
+            Name => 'RawDevelopment',
+            Condition => '$format ne "ifd" and $format ne "int32u"',
+            NestedHtmlDump => 2,
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::RawDevelopment',
+                ByteOrder => 'Unknown',
+            },
+        },
+        {
+            Name => 'RawDevelopmentIFD',
+            Groups => { 1 => 'MakerNotes' },
+            Flags => 'SubIFD',
+            FixFormat => 'ifd',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::RawDevelopment',
+                Start => '$val',
+            },
+        },
+    ],
+    0x2031 => [ #11
+        {
+            Name => 'RawDev2',
+            Condition => '$format ne "ifd" and $format ne "int32u"',
+            NestedHtmlDump => 2,
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::RawDevelopment2',
+                ByteOrder => 'Unknown',
+            },
+        },
+        {
+            Name => 'RawDev2IFD',
+            Groups => { 1 => 'MakerNotes' },
+            Flags => 'SubIFD',
+            FixFormat => 'ifd',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::RawDevelopment2',
+                Start => '$val',
+            },
+        },
+    ],
+    0x2040 => [ #PH
+        {
+            Name => 'ImageProcessing',
+            Condition => '$format ne "ifd" and $format ne "int32u"',
+            NestedHtmlDump => 2,
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::ImageProcessing',
+                ByteOrder => 'Unknown',
+            },
+        },
+        {
+            Name => 'ImageProcessingIFD',
+            Groups => { 1 => 'MakerNotes' },
+            Flags => 'SubIFD',
+            FixFormat => 'ifd',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::ImageProcessing',
+                Start => '$val',
+            },
+        },
+    ],
+    0x2050 => [ #PH
+        {
+            Name => 'FocusInfo',
+            Condition => '$format ne "ifd" and $format ne "int32u" and not $$self{OlympusCAMER}',
+            NestedHtmlDump => 2,
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::FocusInfo',
+                ByteOrder => 'Unknown',
+            },
+        },
+        {
+            Name => 'FocusInfoIFD',
+            Condition => 'not $$self{OlympusCAMER}',
+            Groups => { 1 => 'MakerNotes' },
+            Flags => 'SubIFD',
+            FixFormat => 'ifd',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::FocusInfo',
+                Start => '$val',
+            },
+        },
+        {
+            # ASCII-based camera parameters if makernotes starts with "CAMER\0"
+            # (or for Sony models starting with "SONY PI\0" or "PREMI\0")
+            Name => 'CameraParameters',
+            Writable => 'undef',
+            Binary => 1,
+        },
+    ],
+    0x2100 => [
+        { #11
+            Name => 'Olympus2100',
+            Condition => '$format ne "ifd" and $format ne "int32u"',
+            NestedHtmlDump => 2,
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::FETags',
+                ByteOrder => 'Unknown',
+            },
+        },
+        { #PH
+            Name => 'Olympus2100IFD',
+            Groups => { 1 => 'MakerNotes' },
+            Flags => 'SubIFD',
+            FixFormat => 'ifd',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::FETags',
+                ByteOrder => 'Unknown',
+                Start => '$val',
+            },
+        },
+    ],
+    0x2200 => [
+        { #11
+            Name => 'Olympus2200',
+            Condition => '$format ne "ifd" and $format ne "int32u"',
+            NestedHtmlDump => 2,
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::FETags',
+                ByteOrder => 'Unknown',
+            },
+        },
+        { #PH
+            Name => 'Olympus2200IFD',
+            Groups => { 1 => 'MakerNotes' },
+            Flags => 'SubIFD',
+            FixFormat => 'ifd',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::FETags',
+                ByteOrder => 'Unknown',
+                Start => '$val',
+            },
+        },
+    ],
+    0x2300 => [
+        { #11
+            Name => 'Olympus2300',
+            Condition => '$format ne "ifd" and $format ne "int32u"',
+            NestedHtmlDump => 2,
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::FETags',
+                ByteOrder => 'Unknown',
+            },
+        },
+        { #PH
+            Name => 'Olympus2300IFD',
+            Groups => { 1 => 'MakerNotes' },
+            Flags => 'SubIFD',
+            FixFormat => 'ifd',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::FETags',
+                ByteOrder => 'Unknown',
+                Start => '$val',
+            },
+        },
+    ],
+    0x2400 => [
+        { #11
+            Name => 'Olympus2400',
+            Condition => '$format ne "ifd" and $format ne "int32u"',
+            NestedHtmlDump => 2,
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::FETags',
+                ByteOrder => 'Unknown',
+            },
+        },
+        { #PH
+            Name => 'Olympus2400IFD',
+            Groups => { 1 => 'MakerNotes' },
+            Flags => 'SubIFD',
+            FixFormat => 'ifd',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::FETags',
+                ByteOrder => 'Unknown',
+                Start => '$val',
+            },
+        },
+    ],
+    0x2500 => [
+        { #11
+            Name => 'Olympus2500',
+            Condition => '$format ne "ifd" and $format ne "int32u"',
+            NestedHtmlDump => 2,
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::FETags',
+                ByteOrder => 'Unknown',
+            },
+        },
+        { #PH
+            Name => 'Olympus2500IFD',
+            Groups => { 1 => 'MakerNotes' },
+            Flags => 'SubIFD',
+            FixFormat => 'ifd',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::FETags',
+                ByteOrder => 'Unknown',
+                Start => '$val',
+            },
+        },
+    ],
+    0x2600 => [
+        { #11
+            Name => 'Olympus2600',
+            Condition => '$format ne "ifd" and $format ne "int32u"',
+            NestedHtmlDump => 2,
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::FETags',
+                ByteOrder => 'Unknown',
+            },
+        },
+        { #PH
+            Name => 'Olympus2600IFD',
+            Groups => { 1 => 'MakerNotes' },
+            Flags => 'SubIFD',
+            FixFormat => 'ifd',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::FETags',
+                ByteOrder => 'Unknown',
+                Start => '$val',
+            },
+        },
+    ],
+    0x2700 => [
+        { #11
+            Name => 'Olympus2700',
+            Condition => '$format ne "ifd" and $format ne "int32u"',
+            NestedHtmlDump => 2,
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::FETags',
+                ByteOrder => 'Unknown',
+            },
+        },
+        { #PH
+            Name => 'Olympus2700IFD',
+            Groups => { 1 => 'MakerNotes' },
+            Flags => 'SubIFD',
+            FixFormat => 'ifd',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::FETags',
+                ByteOrder => 'Unknown',
+                Start => '$val',
+            },
+        },
+    ],
+    0x2800 => [
+        { #11
+            Name => 'Olympus2800',
+            Condition => '$format ne "ifd" and $format ne "int32u"',
+            NestedHtmlDump => 2,
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::FETags',
+                ByteOrder => 'Unknown',
+            },
+        },
+        { #PH
+            Name => 'Olympus2800IFD',
+            Groups => { 1 => 'MakerNotes' },
+            Flags => 'SubIFD',
+            FixFormat => 'ifd',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::FETags',
+                ByteOrder => 'Unknown',
+                Start => '$val',
+            },
+        },
+    ],
+    0x2900 => [
+        { #11
+            Name => 'Olympus2900',
+            Condition => '$format ne "ifd" and $format ne "int32u"',
+            NestedHtmlDump => 2,
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::FETags',
+                ByteOrder => 'Unknown',
+            },
+        },
+        { #PH
+            Name => 'Olympus2900IFD',
+            Groups => { 1 => 'MakerNotes' },
+            Flags => 'SubIFD',
+            FixFormat => 'ifd',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::FETags',
+                ByteOrder => 'Unknown',
+                Start => '$val',
+            },
+        },
+    ],
+    0x3000 => [
+        { #6
+            Name => 'RawInfo',
+            Condition => '$format ne "ifd" and $format ne "int32u"',
+            NestedHtmlDump => 2,
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::RawInfo',
+                ByteOrder => 'Unknown',
+            },
+        },
+        { #PH
+            Name => 'RawInfoIFD',
+            Groups => { 1 => 'MakerNotes' },
+            Flags => 'SubIFD',
+            FixFormat => 'ifd',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::RawInfo',
+                Start => '$val',
+            },
+        },
+    ],
+    0x4000 => [ #PH
+        {
+            Name => 'MainInfo',
+            Condition => '$format ne "ifd" and $format ne "int32u"',
+            NestedHtmlDump => 2,
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::Main',
+                ByteOrder => 'Unknown',
+            },
+        },
+        {
+            Name => 'MainInfoIFD',
+            Groups => { 1 => 'MakerNotes' },
+            Flags => 'SubIFD',
+            FixFormat => 'ifd',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::Main',
+                Start => '$val',
+            },
+        },
+    ],
+    0x5000 => [ #PH
+        {
+            Name => 'UnknownInfo',
+            Condition => '$format ne "ifd" and $format ne "int32u"',
+            NestedHtmlDump => 2,
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::UnknownInfo',
+                ByteOrder => 'Unknown',
+            },
+        },
+        {
+            Name => 'UnknownInfoIFD',
+            Groups => { 1 => 'MakerNotes' },
+            Flags => 'SubIFD',
+            FixFormat => 'ifd',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::UnknownInfo',
+                Start => '$val',
+            },
+        },
+    ],
+);
+
+# TextInfo tags
+%Image::ExifTool::Olympus::TextInfo = (
+    PROCESS_PROC => \&Image::ExifTool::APP12::ProcessAPP12,
+    NOTES => q{
+        This information is in text format (similar to APP12 information, but with
+        spaces instead of linefeeds).  Below are tags which have been observed, but
+        any information found here will be extracted, even if the tag is not listed.
+    },
+    GROUPS => { 0 => 'MakerNotes', 1 => 'Olympus', 2 => 'Image' },
+    Resolution => { },
+    Type => {
+        Name => 'CameraType',
+        Groups => { 2 => 'Camera' },
+        DataMember => 'CameraType',
+        RawConv => '$self->{CameraType} = $val',
+    },
+);
+
+# Olympus Equipment IFD
+%Image::ExifTool::Olympus::Equipment = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    WRITABLE => 1,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0x000 => { #PH
+        Name => 'EquipmentVersion',
+        Writable => 'undef',
+        RawConv => '$val=~s/\0+$//; $val',  # (may be null terminated)
+        Count => 4,
+    },
+    0x100 => { #6
+        Name => 'CameraType2',
+        Writable => 'string',
+        Count => 6,
+    },
+    0x101 => { #PH
+        Name => 'SerialNumber',
+        Writable => 'string',
+        Count => 32,
+        PrintConv => '$val=~s/\s+$//;$val',
+        PrintConvInv => 'pack("A31",$val)', # pad with spaces to 31 chars
+    },
+    0x102 => { #6
+        Name => 'InternalSerialNumber',
+        Notes => '16 digits: 0-3=model, 4=year, 5-6=month, 8-12=unit number',
+        Writable => 'string',
+        Count => 32,
+    },
+    0x103 => { #6
+        Name => 'FocalPlaneDiagonal',
+        Writable => 'rational64u',
+        PrintConv => '"$val mm"',
+        PrintConvInv => '$val=~s/\s*mm$//;$val',
+    },
+    0x104 => { #6
+        Name => 'BodyFirmwareVersion',
+        Writable => 'int32u',
+        PrintConv => '$val=sprintf("%x",$val);$val=~s/(.{3})$/\.$1/;$val',
+        PrintConvInv => '$val=sprintf("%.3f",$val);$val=~s/\.//;hex($val)',
+    },
+    0x201 => { #6
+        Name => 'LensType',
+        Writable => 'int8u',
+        Count => 6,
+        Notes => q{
+            6 numbers: 0. Make, 1. Unknown, 2. Model, 3. Sub-model, 4-5. Unknown.  Only
+            the Make, Model and Sub-model are used to determine the lens model
+        },
+        SeparateTable => 'LensType',
+        # Have seen these values for the unknown numbers:
+        # 1: 0
+        # 4: 0, 2(Olympus lenses for which I have also seen 0 for this number)
+        # 5: 0, 16(new Lumix lenses)
+        ValueConv => 'my @a = split(" ",$val); "$a[0] $a[2] $a[3]"',
+        # set unknown values to zero when writing
+        ValueConvInv => 'my @a=split(" ",$val); "$a[0] 0 $a[1] $a[2] 0 0"',
+        PrintConv => \%olympusLensTypes,
+    },
+    # apparently the first 3 digits of the lens s/n give the type (ref 4):
+    # 010 = 50macro
+    # 040 = EC-14
+    # 050 = 14-54
+    # 060 = 50-200
+    # 080 = EX-25
+    # 101 = FL-50
+    # 272 = EC-20 #7
+    0x202 => { #PH
+        Name => 'LensSerialNumber',
+        Writable => 'string',
+        Count => 32,
+        PrintConv => '$val=~s/\s+$//;$val',
+        PrintConvInv => 'pack("A31",$val)', # pad with spaces to 31 chars
+    },
+    0x203 => { #17
+        Name => 'LensModel',
+        Writable => 'string',
+    },
+    0x204 => { #6
+        Name => 'LensFirmwareVersion',
+        Writable => 'int32u',
+        PrintConv => '$val=sprintf("%x",$val);$val=~s/(.{3})$/\.$1/;$val',
+        PrintConvInv => '$val=sprintf("%.3f",$val);$val=~s/\.//;hex($val)',
+    },
+    0x205 => { #11
+        Name => 'MaxApertureAtMinFocal',
+        Writable => 'int16u',
+        ValueConv => '$val ? sqrt(2)**($val/256) : 0',
+        ValueConvInv => '$val>0 ? int(512*log($val)/log(2)+0.5) : 0',
+        PrintConv => 'sprintf("%.1f",$val)',
+        PrintConvInv => '$val',
+    },
+    0x206 => { #5
+        Name => 'MaxApertureAtMaxFocal',
+        Writable => 'int16u',
+        ValueConv => '$val ? sqrt(2)**($val/256) : 0',
+        ValueConvInv => '$val>0 ? int(512*log($val)/log(2)+0.5) : 0',
+        PrintConv => 'sprintf("%.1f",$val)',
+        PrintConvInv => '$val',
+    },
+    0x207 => { #PH
+        Name => 'MinFocalLength',
+        Writable => 'int16u',
+    },
+    0x208 => { #PH
+        Name => 'MaxFocalLength',
+        Writable => 'int16u',
+    },
+    0x20a => { #9
+        Name => 'MaxApertureAtCurrentFocal',
+        Writable => 'int16u',
+        ValueConv => '$val ? sqrt(2)**($val/256) : 0',
+        ValueConvInv => '$val>0 ? int(512*log($val)/log(2)+0.5) : 0',
+        PrintConv => 'sprintf("%.1f",$val)',
+        PrintConvInv => '$val',
+    },
+    0x20b => { #11
+        Name => 'LensProperties',
+        Writable => 'int16u',
+        PrintConv => 'sprintf("0x%x",$val)',
+        PrintConvInv => '$val',
+    },
+    0x301 => { #6
+        Name => 'Extender',
+        Writable => 'int8u',
+        Count => 6,
+        Notes => q{
+            6 numbers: 0. Make, 1. Unknown, 2. Model, 3. Sub-model, 4-5. Unknown.  Only
+            the Make and Model are used to determine the extender model
+        },
+        ValueConv => 'my @a = split(" ",$val); "$a[0] $a[2]"',
+        ValueConvInv => 'my @a=split(" ",$val); "$a[0] 0 $a[1] 0 0 0"',
+        PrintConv => {
+            '0 0'   => 'None',
+            '0 4'   => 'Olympus Zuiko Digital EC-14 1.4x Teleconverter',
+            '0 8'   => 'Olympus EX-25 Extension Tube',
+            '0 16'  => 'Olympus Zuiko Digital EC-20 2.0x Teleconverter', #7
+        },
+    },
+    0x302 => { #4
+        Name => 'ExtenderSerialNumber',
+        Writable => 'string',
+        Count => 32,
+    },
+    0x303 => { #9
+        Name => 'ExtenderModel',
+        Writable => 'string',
+    },
+    0x304 => { #6
+        Name => 'ExtenderFirmwareVersion',
+        Writable => 'int32u',
+        PrintConv => '$val=sprintf("%x",$val);$val=~s/(.{3})$/\.$1/;$val',
+        PrintConvInv => '$val=sprintf("%.3f",$val);$val=~s/\.//;hex($val)',
+    },
+    0x1000 => { #6
+        Name => 'FlashType',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'None',
+            2 => 'Simple E-System',
+            3 => 'E-System',
+        },
+    },
+    0x1001 => { #6
+        Name => 'FlashModel',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'None',
+            1 => 'FL-20', # (or subtronic digital or Inon UW flash, ref 11)
+            2 => 'FL-50', # (or Metzblitz+SCA or Cullmann 34, ref 11)
+            3 => 'RF-11',
+            4 => 'TF-22',
+            5 => 'FL-36',
+            6 => 'FL-50R', #11 (or Metz mecablitz digital)
+            7 => 'FL-36R', #11
+            # have seen value of 9 - PH
+        },
+    },
+    0x1002 => { #6
+        Name => 'FlashFirmwareVersion',
+        Writable => 'int32u',
+        PrintConv => '$val=sprintf("%x",$val);$val=~s/(.{3})$/\.$1/;$val',
+        PrintConvInv => '$val=sprintf("%.3f",$val);$val=~s/\.//;hex($val)',
+    },
+    0x1003 => { #4
+        Name => 'FlashSerialNumber',
+        Writable => 'string',
+        Count => 32,
+    },
+);
+
+# Olympus camera settings IFD
+%Image::ExifTool::Olympus::CameraSettings = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    WRITABLE => 1,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0x000 => { #PH
+        Name => 'CameraSettingsVersion',
+        Writable => 'undef',
+        RawConv => '$val=~s/\0+$//; $val',  # (may be null terminated)
+        Count => 4,
+    },
+    0x100 => { #6
+        Name => 'PreviewImageValid',
+        Writable => 'int32u',
+        PrintConv => { 0 => 'No', 1 => 'Yes' },
+    },
+    0x101 => { #PH
+        Name => 'PreviewImageStart',
+        Flags => 'IsOffset',
+        OffsetPair => 0x102,
+        DataTag => 'PreviewImage',
+        Writable => 'int32u',
+        Protected => 2,
+    },
+    0x102 => { #PH
+        Name => 'PreviewImageLength',
+        OffsetPair => 0x101,
+        DataTag => 'PreviewImage',
+        Writable => 'int32u',
+        Protected => 2,
+    },
+    0x200 => { #4
+        Name => 'ExposureMode',
+        Writable => 'int16u',
+        PrintConv => {
+            1 => 'Manual',
+            2 => 'Program', #6
+            3 => 'Aperture-priority AE',
+            4 => 'Shutter speed priority AE',
+            5 => 'Program-shift', #6
+        }
+    },
+    0x201 => { #6
+        Name => 'AELock',
+        Writable => 'int16u',
+        PrintConv => \%offOn,
+    },
+    0x202 => { #PH/4
+        Name => 'MeteringMode',
+        Writable => 'int16u',
+        PrintConv => {
+            2 => 'Center-weighted average',
+            3 => 'Spot',
+            5 => 'ESP',
+            261 => 'Pattern+AF', #6
+            515 => 'Spot+Highlight control', #6
+            1027 => 'Spot+Shadow control', #6
+        },
+    },
+    0x203 => { #11 (some E-models only)
+        Name => 'ExposureShift',
+        Writable => 'rational64s',
+    },
+    0x300 => { #6
+        Name => 'MacroMode',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'On',
+            2 => 'Super Macro', #11
+        },
+    },
+    0x301 => { #6
+        Name => 'FocusMode',
+        Writable => 'int16u',
+        Count => -1,
+        Notes => '1 or 2 values',
+        PrintConv => [{
+            0 => 'Single AF',
+            1 => 'Sequential shooting AF',
+            2 => 'Continuous AF',
+            3 => 'Multi AF',
+            5 => 'Face detect', #11
+            10 => 'MF',
+        }, { BITMASK => { #11
+            0 => 'S-AF',
+            2 => 'C-AF',
+            4 => 'MF',
+            5 => 'Face detect',
+            6 => 'Imager AF',
+            8 => 'AF sensor',
+        }}],
+    },
+    0x302 => { #6
+        Name => 'FocusProcess',
+        Writable => 'int16u',
+        Count => -1,
+        Notes => '1 or 2 values',
+        PrintConv => [{
+            0 => 'AF Not Used',
+            1 => 'AF Used',
+        }],
+        # 2nd value written only by some models (u1050SW, u9000, uT6000, uT6010,
+        # uT8000, E-30, E-420, E-450, E-520, E-620, E-P1 and E-P2): - PH
+        # observed values when "AF Not Used": 0, 16
+        # observed values when "AF Used": 64, 96(face detect on), 256
+    },
+    0x303 => { #6
+        Name => 'AFSearch',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Not Ready',
+            1 => 'Ready',
+        },
+    },
+    0x304 => { #PH/4
+        Name => 'AFAreas',
+        Notes => 'coordinates range from 0 to 255',
+        Format => 'int32u',
+        Count => 64,
+        PrintConv => 'Image::ExifTool::Olympus::PrintAFAreas($val)',
+    },
+    0x0305 => { #PH
+        Name => 'AFPointSelected',
+        Notes => 'coordinates expressed as a percent',
+        Format => 'rational64s',
+        Count => 5,
+        ValueConv => '$val =~ s/\S* //; $val', # ignore first undefined value
+        ValueConvInv => '"undef $val"',
+        PrintConv => q{
+            return $val if $val =~ /undef/;
+            sprintf("(%d%%,%d%%) (%d%%,%d%%)", map {$_ * 100} split(" ",$val));
+        }
+    },
+    0x307 => { #15
+        Name => 'AFFineTuneAdj',
+        Format => 'int16s',
+        Count => 3, # not sure what the 3 values mean
+    },
+    0x400 => { #6
+        Name => 'FlashMode',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            BITMASK => {
+                0 => 'On',
+                1 => 'Fill-in',
+                2 => 'Red-eye',
+                3 => 'Slow-sync',
+                4 => 'Forced On',
+                5 => '2nd Curtain',
+            },
+        },
+    },
+    0x401 => { #6
+        Name => 'FlashExposureComp',
+        Writable => 'rational64s',
+    },
+    # 0x402 - FlashMode? bit0=TTL, bit2=SuperFP (ref 11)
+    0x403 => { #11
+        Name => 'FlashRemoteControl',
+        Writable => 'int16u',
+        PrintHex => 1,
+        PrintConv => {
+            0 => 'Off',
+            0x01 => 'Channel 1, Low',
+            0x02 => 'Channel 2, Low',
+            0x03 => 'Channel 3, Low',
+            0x04 => 'Channel 4, Low',
+            0x09 => 'Channel 1, Mid',
+            0x0a => 'Channel 2, Mid',
+            0x0b => 'Channel 3, Mid',
+            0x0c => 'Channel 4, Mid',
+            0x11 => 'Channel 1, High',
+            0x12 => 'Channel 2, High',
+            0x13 => 'Channel 3, High',
+            0x14 => 'Channel 4, High',
+        },
+    },
+    0x404 => { #11
+        Name => 'FlashControlMode',
+        Writable => 'int16u',
+        Count => 3,
+        PrintConv => [{
+            0 => 'Off',
+            3 => 'TTL',
+            4 => 'Auto',
+            5 => 'Manual',
+        }],
+    },
+    0x405 => { #11
+        Name => 'FlashIntensity',
+        Writable => 'rational64s',
+        Count => 3,
+        PrintConv => '$val eq "undef undef undef" ? "n/a" : $val',
+        PrintConvInv => '$val eq "n/a" ? "undef undef undef" : $val',
+    },
+    0x406 => { #11
+        Name => 'ManualFlashStrength',
+        Writable => 'rational64s',
+        Count => 3,
+        PrintConv => '$val eq "undef undef undef" ? "n/a" : $val',
+        PrintConvInv => '$val eq "n/a" ? "undef undef undef" : $val',
+    },
+    0x500 => { #6
+        Name => 'WhiteBalance2',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Auto',
+            16 => '7500K (Fine Weather with Shade)',
+            17 => '6000K (Cloudy)',
+            18 => '5300K (Fine Weather)',
+            20 => '3000K (Tungsten light)',
+            21 => '3600K (Tungsten light-like)',
+            33 => '6600K (Daylight fluorescent)',
+            34 => '4500K (Neutral white fluorescent)',
+            35 => '4000K (Cool white fluorescent)',
+            48 => '3600K (Tungsten light-like)',
+            256 => 'Custom WB 1',
+            257 => 'Custom WB 2',
+            258 => 'Custom WB 3',
+            259 => 'Custom WB 4',
+            512 => 'Custom WB 5400K',
+            513 => 'Custom WB 2900K',
+            514 => 'Custom WB 8000K',
+        },
+    },
+    0x501 => { #PH/4
+        Name => 'WhiteBalanceTemperature',
+        Writable => 'int16u',
+        PrintConv => '$val ? $val : "Auto"',
+        PrintConvInv => '$val=~/^\d+$/ ? $val : 0',
+    },
+    0x502 => {  #PH/4
+        Name => 'WhiteBalanceBracket',
+        Writable => 'int16s',
+    },
+    0x503 => { #PH/4/6
+        Name => 'CustomSaturation',
+        Writable => 'int16s',
+        Count => 3,
+        Notes => '3 numbers: 1. CS Value, 2. Min, 3. Max',
+        PrintConv => q{
+            my ($a,$b,$c)=split ' ',$val;
+            if ($self->{Model} =~ /^E-1\b/) {
+                $a-=$b; $c-=$b;
+                return "CS$a (min CS0, max CS$c)";
+            } else {
+                return "$a (min $b, max $c)";
+            }
+        },
+    },
+    0x504 => { #PH/4
+        Name => 'ModifiedSaturation',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'CM1 (Red Enhance)',
+            2 => 'CM2 (Green Enhance)',
+            3 => 'CM3 (Blue Enhance)',
+            4 => 'CM4 (Skin Tones)',
+        },
+    },
+    0x505 => { #PH/4
+        Name => 'ContrastSetting',
+        Writable => 'int16s',
+        Count => 3,
+        Notes => 'value, min, max',
+        PrintConv => 'my @v=split " ",$val; "$v[0] (min $v[1], max $v[2])"',
+        PrintConvInv => '$val=~tr/-0-9 //dc;$val',
+    },
+    0x506 => { #PH/4
+        Name => 'SharpnessSetting',
+        Writable => 'int16s',
+        Count => 3,
+        Notes => 'value, min, max',
+        PrintConv => 'my @v=split " ",$val; "$v[0] (min $v[1], max $v[2])"',
+        PrintConvInv => '$val=~tr/-0-9 //dc;$val',
+    },
+    0x507 => { #PH/4
+        Name => 'ColorSpace',
+        Writable => 'int16u',
+        PrintConv => { #6
+            0 => 'sRGB',
+            1 => 'Adobe RGB',
+            2 => 'Pro Photo RGB',
+        },
+    },
+    0x509 => { #6
+        Name => 'SceneMode',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Standard',
+            6 => 'Auto', #6
+            7 => 'Sport',
+            8 => 'Portrait',
+            9 => 'Landscape+Portrait',
+            10 => 'Landscape',
+            11 => 'Night Scene',
+            12 => 'Self Portrait', #11
+            13 => 'Panorama', #6
+            14 => '2 in 1', #11
+            15 => 'Movie', #11
+            16 => 'Landscape+Portrait', #6
+            17 => 'Night+Portrait',
+            18 => 'Indoor', #11 (Party - PH)
+            19 => 'Fireworks',
+            20 => 'Sunset',
+            21 => 'Beauty Skin', #PH
+            22 => 'Macro',
+            23 => 'Super Macro', #11
+            24 => 'Food', #11
+            25 => 'Documents',
+            26 => 'Museum',
+            27 => 'Shoot & Select', #11
+            28 => 'Beach & Snow',
+            29 => 'Self Protrait+Timer', #11
+            30 => 'Candle',
+            31 => 'Available Light', #11
+            32 => 'Behind Glass', #11
+            33 => 'My Mode', #11
+            34 => 'Pet', #11
+            35 => 'Underwater Wide1', #6
+            36 => 'Underwater Macro', #6
+            37 => 'Shoot & Select1', #11
+            38 => 'Shoot & Select2', #11
+            39 => 'High Key',
+            40 => 'Digital Image Stabilization', #6
+            41 => 'Auction', #11
+            42 => 'Beach', #11
+            43 => 'Snow', #11
+            44 => 'Underwater Wide2', #6
+            45 => 'Low Key', #6
+            46 => 'Children', #6
+            47 => 'Vivid', #11
+            48 => 'Nature Macro', #6
+            49 => 'Underwater Snapshot', #11
+            50 => 'Shooting Guide', #11
+            51 => 'Face Portrait', #PH (NC)
+            52 => 'Smile Shot', #PH (NC)
+            53 => 'Quick Shutter', #PH (NC)
+            54 => 'Slow Shutter', #PH (NC)
+            55 => 'Bird Watching', #PH (NC)
+            56 => 'Multiple Exposure', #PH (NC)
+            57 => 'e-Portrait', #PH (NC)
+            58 => 'Beauty Fix', #PH (NC)
+            59 => 'Soft Background', #PH (NC)
+        },
+    },
+    0x50a => { #PH/4/6
+        Name => 'NoiseReduction',
+        Writable => 'int16u',
+        PrintConv => {
+            BITMASK => {
+                0 => 'Noise Reduction',
+                1 => 'Noise Filter',
+                2 => 'Noise Filter (ISO Boost)',
+                3 => 'Auto', #11
+            },
+        },
+    },
+    0x50b => { #6
+        Name => 'DistortionCorrection',
+        Writable => 'int16u',
+        PrintConv => \%offOn,
+    },
+    0x50c => { #PH/4
+        Name => 'ShadingCompensation',
+        Writable => 'int16u',
+        PrintConv => \%offOn,
+    },
+    0x50d => { #PH/4
+        Name => 'CompressionFactor',
+        Writable => 'rational64u',
+    },
+    0x50f => { #6
+        Name => 'Gradation',
+        Writable => 'int16s',
+        Notes => '3 or 4 values',
+        Count => -1,
+        Relist => [ [0..2], 3 ], # join values 0-2 for PrintConv
+        PrintConv => [{
+           '-1 -1 1' => 'Low Key',
+            '0 -1 1' => 'Normal',
+            '1 -1 1' => 'High Key',
+        },{
+            0 => 'User-Selected',
+            1 => 'Auto-Override',
+        }],
+    },
+    0x520 => { #6
+        Name => 'PictureMode',
+        Writable => 'int16u',
+        Notes => '1 or 2 values',
+        Count => -1,
+        PrintConv => [{
+            1 => 'Vivid',
+            2 => 'Natural',
+            3 => 'Muted',
+            4 => 'Portrait',
+            5 => 'i-Enhance', #11
+            256 => 'Monotone',
+            512 => 'Sepia',
+        }],
+    },
+    0x521 => { #6
+        Name => 'PictureModeSaturation',
+        Writable => 'int16s',
+        Count => 3,
+        Notes => 'value, min, max',
+        PrintConv => 'my @v=split " ",$val; "$v[0] (min $v[1], max $v[2])"',
+        PrintConvInv => '$val=~tr/-0-9 //dc;$val',
+    },
+    0x522 => { #6
+        Name => 'PictureModeHue',
+        Writable => 'int16s',
+        Unknown => 1, # (needs verification)
+    },
+    0x523 => { #6
+        Name => 'PictureModeContrast',
+        Writable => 'int16s',
+        Count => 3,
+        Notes => 'value, min, max',
+        PrintConv => 'my @v=split " ",$val; "$v[0] (min $v[1], max $v[2])"',
+        PrintConvInv => '$val=~tr/-0-9 //dc;$val',
+    },
+    0x524 => { #6
+        Name => 'PictureModeSharpness',
+        # verified as the Sharpness setting in the Picture Mode menu for the E-410
+        Writable => 'int16s',
+        Count => 3,
+        Notes => 'value, min, max',
+        PrintConv => 'my @v=split " ",$val; "$v[0] (min $v[1], max $v[2])"',
+        PrintConvInv => '$val=~tr/-0-9 //dc;$val',
+    },
+    0x525 => { #6
+        Name => 'PictureModeBWFilter',
+        Writable => 'int16s',
+        PrintConv => {
+            0 => 'n/a',
+            1 => 'Neutral',
+            2 => 'Yellow',
+            3 => 'Orange',
+            4 => 'Red',
+            5 => 'Green',
+        },
+    },
+    0x526 => { #6
+        Name => 'PictureModeTone',
+        Writable => 'int16s',
+        PrintConv => {
+            0 => 'n/a',
+            1 => 'Neutral',
+            2 => 'Sepia',
+            3 => 'Blue',
+            4 => 'Purple',
+            5 => 'Green',
+        },
+    },
+    0x527 => { #12
+        Name => 'NoiseFilter',
+        Writable => 'int16s',
+        Count => 3,
+        PrintConv => {
+           '-2 -2 1' => 'Off',
+           '-1 -2 1' => 'Low',
+           '0 -2 1' => 'Standard',
+           '1 -2 1' => 'High',
+        },
+    },
+    0x529 => { #PH
+        Name => 'ArtFilter',
+        Writable => 'int16u',
+        Count => 4,
+        PrintConv => [ \%filters ],
+    },
+    0x52c => { #PH
+        Name => 'MagicFilter',
+        Writable => 'int16u',
+        Count => 4, # (2nd number is 0 or 1280, 3rd/4th are 0)
+        PrintConv => [ \%filters ],
+    },
+    0x600 => { #PH/4
+        Name => 'DriveMode',
+        Writable => 'int16u',
+        Count => -1,
+        Notes => '2 or 3 numbers: 1. Mode, 2. Shot number, 3. Mode bits',
+        PrintConv => q{
+            my ($a,$b,$c) = split ' ',$val;
+            return 'Single Shot' unless $a;
+            if ($a == 5 and defined $c) {
+                $a = DecodeBits($c, { #6
+                    0 => 'AE',
+                    1 => 'WB',
+                    2 => 'FL',
+                    3 => 'MF',
+                }) . ' Bracketing';
+                $a =~ s/, /+/g;
+            } else {
+                my %a = (
+                    1 => 'Continuous Shooting',
+                    2 => 'Exposure Bracketing',
+                    3 => 'White Balance Bracketing',
+                    4 => 'Exposure+WB Bracketing', #6
+                );
+                $a = $a{$a} || "Unknown ($a)";
+            }
+            return "$a, Shot $b";
+        },
+    },
+    0x601 => { #6
+        Name => 'PanoramaMode',
+        Writable => 'int16u',
+        Notes => '2 numbers: 1. Mode, 2. Shot number',
+        PrintConv => q{
+            my ($a,$b) = split ' ',$val;
+            return 'Off' unless $a;
+            my %a = (
+                1 => 'Left to Right',
+                2 => 'Right to Left',
+                3 => 'Bottom to Top',
+                4 => 'Top to Bottom',
+            );
+            return ($a{$a} || "Unknown ($a)") . ', Shot ' . $b;
+        },
+    },
+    0x603 => { #PH/4
+        Name => 'ImageQuality2',
+        Writable => 'int16u',
+        PrintConv => {
+            1 => 'SQ',
+            2 => 'HQ',
+            3 => 'SHQ',
+            4 => 'RAW',
+            5 => 'SQ (5)', # (E-500)
+        },
+    },
+    0x604 => { #PH
+        Name => 'ImageStabilization',
+        Writable => 'int32u',
+        DataMember => 'ImageStabilization',
+        RawConv => '$$self{ImageStabilization} = $val',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'On, Mode 1',
+            2 => 'On, Mode 2',
+            3 => 'On, Mode 3',
+        },
+    },
+    0x900 => { #11
+        Name => 'ManometerPressure',
+        Writable => 'int16u',
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+        PrintConv => '"$val kPa"',
+        PrintConvInv => '$val=~s/ ?kPa//i; $val',
+    },
+    0x901 => { #PH (u770SW)
+        # 2 numbers: 1st looks like meters above sea level, 2nd is usually 3x the 1st (feet?)
+        Name => 'ManometerReading',
+        Writable => 'int32s',
+        Count => 2,
+        ValueConv => 'my @a=split(" ",$val); $_ /= 10 foreach @a; "@a"',
+        ValueConvInv => 'my @a=split(" ",$val); $_ *= 10 foreach @a; "@a"',
+        PrintConv => '$val=~s/(\S+) (\S+)/$1 m, $2 ft/; $val',
+        PrintConvInv => '$val=~s/ ?(m|ft)//gi; $val',
+    },
+    0x902 => { #11
+        Name => 'ExtendedWBDetect',
+        Writable => 'int16u',
+        PrintConv => \%offOn,
+    },
+    0x903 => { #11
+        Name => 'LevelGaugeRoll',
+        Writable => 'int16u',
+        PrintConv => \%offOn,
+    },
+    0x904 => { #11
+        Name => 'LevelGaugePitch',
+        Writable => 'int16u',
+        PrintConv => \%offOn,
+    },
+);
+
+# Olympus RAW processing IFD (ref 6)
+%Image::ExifTool::Olympus::RawDevelopment = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    WRITABLE => 1,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0x000 => { #PH
+        Name => 'RawDevVersion',
+        Writable => 'undef',
+        RawConv => '$val=~s/\0+$//; $val',  # (may be null terminated)
+        Count => 4,
+    },
+    0x100 => {
+        Name => 'RawDevExposureBiasValue',
+        Writable => 'rational64s',
+    },
+    0x101 => {
+        Name => 'RawDevWhiteBalanceValue',
+        Writable => 'int16u',
+    },
+    0x102 => {
+        Name => 'RawDevWBFineAdjustment',
+        Writable => 'int16s',
+    },
+    0x103 => {
+        Name => 'RawDevGrayPoint',
+        Writable => 'int16u',
+        Count => 3,
+    },
+    0x104 => {
+        Name => 'RawDevSaturationEmphasis',
+        Writable => 'int16s',
+        Count => 3,
+    },
+    0x105 => {
+        Name => 'RawDevMemoryColorEmphasis',
+        Writable => 'int16u',
+    },
+    0x106 => {
+        Name => 'RawDevContrastValue',
+        Writable => 'int16s',
+        Count => 3,
+    },
+    0x107 => {
+        Name => 'RawDevSharpnessValue',
+        Writable => 'int16s',
+        Count => 3,
+    },
+    0x108 => {
+        Name => 'RawDevColorSpace',
+        Writable => 'int16u',
+        PrintConv => { #11
+            0 => 'sRGB',
+            1 => 'Adobe RGB',
+            2 => 'Pro Photo RGB',
+        },
+    },
+    0x109 => {
+        Name => 'RawDevEngine',
+        Writable => 'int16u',
+        PrintConv => { #11
+            0 => 'High Speed',
+            1 => 'High Function',
+            2 => 'Advanced High Speed',
+            3 => 'Advanced High Function',
+        },
+    },
+    0x10a => {
+        Name => 'RawDevNoiseReduction',
+        Writable => 'int16u',
+        PrintConv => { #11
+            BITMASK => {
+                0 => 'Noise Reduction',
+                1 => 'Noise Filter',
+                2 => 'Noise Filter (ISO Boost)',
+            },
+        },
+    },
+    0x10b => {
+        Name => 'RawDevEditStatus',
+        Writable => 'int16u',
+        PrintConv => { #11
+            0 => 'Original',
+            1 => 'Edited (Landscape)',
+            6 => 'Edited (Portrait)',
+            8 => 'Edited (Portrait)',
+        },
+    },
+    0x10c => {
+        Name => 'RawDevSettings',
+        Writable => 'int16u',
+        PrintConv => { #11
+            BITMASK => {
+                0 => 'WB Color Temp',
+                1 => 'WB Gray Point',
+                2 => 'Saturation',
+                3 => 'Contrast',
+                4 => 'Sharpness',
+                5 => 'Color Space',
+                6 => 'High Function',
+                7 => 'Noise Reduction',
+            },
+        },
+    },
+);
+
+# Olympus RAW processing B IFD (ref 11)
+%Image::ExifTool::Olympus::RawDevelopment2 = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    WRITABLE => 1,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0x000 => {
+        Name => 'RawDevVersion',
+        Writable => 'undef',
+        RawConv => '$val=~s/\0+$//; $val',  # (may be null terminated)
+        Count => 4,
+    },
+    0x100 => {
+        Name => 'RawDevExposureBiasValue',
+        Writable => 'rational64s',
+    },
+    0x101 => {
+        Name => 'RawDevWhiteBalance',
+        Writable => 'int16u',
+        PrintConv => {
+            1 => 'Color Temperature',
+            2 => 'Gray Point',
+        },
+    },
+    0x102 => {
+        Name => 'RawDevWhiteBalanceValue',
+        Writable => 'int16u',
+    },
+    0x103 => {
+        Name => 'RawDevWBFineAdjustment',
+        Writable => 'int16s',
+    },
+    0x104 => {
+        Name => 'RawDevGrayPoint',
+        Writable => 'int16u',
+        Count => 3,
+    },
+    0x105 => {
+        Name => 'RawDevContrastValue',
+        Writable => 'int16s',
+        Count => 3,
+    },
+    0x106 => {
+        Name => 'RawDevSharpnessValue',
+        Writable => 'int16s',
+        Count => 3,
+    },
+    0x107 => {
+        Name => 'RawDevSaturationEmphasis',
+        Writable => 'int16s',
+        Count => 3,
+    },
+    0x108 => {
+        Name => 'RawDevMemoryColorEmphasis',
+        Writable => 'int16u',
+    },
+    0x109 => {
+        Name => 'RawDevColorSpace',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'sRGB',
+            1 => 'Adobe RGB',
+            2 => 'Pro Photo RGB',
+        },
+    },
+    0x10a => {
+        Name => 'RawDevNoiseReduction',
+        Writable => 'int16u',
+        PrintConv => {
+            BITMASK => {
+                0 => 'Noise Reduction',
+                1 => 'Noise Filter',
+                2 => 'Noise Filter (ISO Boost)',
+            },
+        },
+    },
+    0x10b => {
+        Name => 'RawDevEngine',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'High Speed',
+            1 => 'High Function',
+        },
+    },
+    0x10c => {
+        Name => 'RawDevPictureMode',
+        Writable => 'int16u',
+        PrintConv => {
+            1 => 'Vivid',
+            2 => 'Natural',
+            3 => 'Muted',
+            256 => 'Monotone',
+            512 => 'Sepia',
+        },
+    },
+    0x10d => {
+        Name => 'RawDevPMSaturation',
+        Writable => 'int16s',
+        Count => 3,
+    },
+    0x10e => {
+        Name => 'RawDevPMContrast',
+        Writable => 'int16s',
+        Count => 3,
+    },
+    0x10f => {
+        Name => 'RawDevPMSharpness',
+        Writable => 'int16s',
+        Count => 3,
+    },
+    0x110 => {
+        Name => 'RawDevPM_BWFilter',
+        Writable => 'int16u',
+        PrintConv => {
+            1 => 'Neutral',
+            2 => 'Yellow',
+            3 => 'Orange',
+            4 => 'Red',
+            5 => 'Green',
+        },
+    },
+    0x111 => {
+        Name => 'RawDevPMPictureTone',
+        Writable => 'int16u',
+        PrintConv => {
+            1 => 'Neutral',
+            2 => 'Sepia',
+            3 => 'Blue',
+            4 => 'Purple',
+            5 => 'Green',
+        },
+    },
+    0x112 => {
+        Name => 'RawDevGradation',
+        Writable => 'int16s',
+        Count => 3,
+    },
+    0x113 => {
+        Name => 'RawDevSaturation3',
+        Writable => 'int16s',
+        Count => 3, #(NC)
+    },
+    0x119 => {
+        Name => 'RawDevAutoGradation',
+        Writable => 'int16u', #(NC)
+        PrintConv => \%offOn,
+    },
+    0x120 => {
+        Name => 'RawDevPMNoiseFilter',
+        Writable => 'int16u', #(NC)
+    },
+);
+
+# Olympus Image processing IFD
+%Image::ExifTool::Olympus::ImageProcessing = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    WRITABLE => 1,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0x000 => { #PH
+        Name => 'ImageProcessingVersion',
+        Writable => 'undef',
+        RawConv => '$val=~s/\0+$//; $val',  # (may be null terminated)
+        Count => 4,
+    },
+    0x100 => { #6
+        Name => 'WB_RBLevels',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x102 => { #11
+        Name => 'WB_RBLevels3000K',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x103 => { #11
+        Name => 'WB_RBLevels3300K',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x104 => { #11
+        Name => 'WB_RBLevels3600K',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x105 => { #11
+        Name => 'WB_RBLevels3900K',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x106 => { #11
+        Name => 'WB_RBLevels4000K',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x107 => { #11
+        Name => 'WB_RBLevels4300K',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x108 => { #11
+        Name => 'WB_RBLevels4500K',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x109 => { #11
+        Name => 'WB_RBLevels4800K',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x10a => { #11
+        Name => 'WB_RBLevels5300K',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x10b => { #11
+        Name => 'WB_RBLevels6000K',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x10c => { #11
+        Name => 'WB_RBLevels6600K',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x10d => { #11
+        Name => 'WB_RBLevels7500K',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x10e => { #11
+        Name => 'WB_RBLevelsCWB1',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x10f => { #11
+        Name => 'WB_RBLevelsCWB2',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x110 => { #11
+        Name => 'WB_RBLevelsCWB3',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x111 => { #11
+        Name => 'WB_RBLevelsCWB4',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x113 => { #11
+        Name => 'WB_GLevel3000K',
+        Writable => 'int16u',
+    },
+    0x114 => { #11
+        Name => 'WB_GLevel3300K',
+        Writable => 'int16u',
+    },
+    0x115 => { #11
+        Name => 'WB_GLevel3600K',
+        Writable => 'int16u',
+    },
+    0x116 => { #11
+        Name => 'WB_GLevel3900K',
+        Writable => 'int16u',
+    },
+    0x117 => { #11
+        Name => 'WB_GLevel4000K',
+        Writable => 'int16u',
+    },
+    0x118 => { #11
+        Name => 'WB_GLevel4300K',
+        Writable => 'int16u',
+    },
+    0x119 => { #11
+        Name => 'WB_GLevel4500K',
+        Writable => 'int16u',
+    },
+    0x11a => { #11
+        Name => 'WB_GLevel4800K',
+        Writable => 'int16u',
+    },
+    0x11b => { #11
+        Name => 'WB_GLevel5300K',
+        Writable => 'int16u',
+    },
+    0x11c => { #11
+        Name => 'WB_GLevel6000K',
+        Writable => 'int16u',
+    },
+    0x11d => { #11
+        Name => 'WB_GLevel6600K',
+        Writable => 'int16u',
+    },
+    0x11e => { #11
+        Name => 'WB_GLevel7500K',
+        Writable => 'int16u',
+    },
+    0x11f => { #11
+        Name => 'WB_GLevel',
+        Writable => 'int16u',
+    },
+    0x200 => { #6
+        Name => 'ColorMatrix',
+        Writable => 'int16u',
+        Format => 'int16s',
+        Count => 9,
+    },
+    # color matrices (ref 11):
+    # 0x0201-0x020d are sRGB color matrices
+    # 0x020e-0x021a are Adobe RGB color matrices
+    # 0x021b-0x0227 are ProPhoto RGB color matrices
+    # 0x0228 and 0x0229 are ColorMatrix for E-330
+    # 0x0250-0x0252 are sRGB color matrices
+    # 0x0253-0x0255 are Adobe RGB color matrices
+    # 0x0256-0x0258 are ProPhoto RGB color matrices
+    0x300 => { #11
+        Name => 'Enhancer',
+        Writable => 'int16u',
+    },
+    0x301 => { #11
+        Name => 'EnhancerValues',
+        Writable => 'int16u',
+        Count => 7,
+    },
+    0x310 => { #11
+        Name => 'CoringFilter',
+        Writable => 'int16u',
+    },
+    0x0311 => { #11
+        Name => 'CoringValues',
+        Writable => 'int16u',
+        Count => 7,
+    },
+    0x600 => { #11
+        Name => 'BlackLevel2',
+        Writable => 'int16u',
+        Count => 4,
+    },
+    0x610 => { #11
+        Name => 'GainBase',
+        Writable => 'int16u',
+    },
+    0x611 => { #4/6
+        Name => 'ValidBits',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x612 => { #11
+        Name => 'CropLeft',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x613 => { #11
+        Name => 'CropTop',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x614 => { #PH/11
+        Name => 'CropWidth',
+        Writable => 'int32u',
+    },
+    0x615 => { #PH/11
+        Name => 'CropHeight',
+        Writable => 'int32u',
+    },
+    # 0x800 LensDistortionParams, float[9] (ref 11)
+    # 0x801 LensShadingParams, int16u[16] (ref 11)
+    # 0x1010-0x1012 are the processing options used in camera or in
+    # Olympus software, which 0x050a-0x050c are in-camera only (ref 6)
+    0x1010 => { #PH/4
+        Name => 'NoiseReduction2',
+        Writable => 'int16u',
+        PrintConv => {
+            BITMASK => {
+                0 => 'Noise Reduction',
+                1 => 'Noise Filter',
+                2 => 'Noise Filter (ISO Boost)',
+            },
+        },
+    },
+    0x1011 => { #6
+        Name => 'DistortionCorrection2',
+        Writable => 'int16u',
+        PrintConv => \%offOn,
+    },
+    0x1012 => { #PH/4
+        Name => 'ShadingCompensation2',
+        Writable => 'int16u',
+        PrintConv => \%offOn,
+    },
+    0x101c => { #11
+        Name => 'MultipleExposureMode',
+        Writable => 'int16u',
+        Count => 2,
+        PrintConv => [{
+            0 => 'Off',
+            2 => 'On (2 frames)',
+            3 => 'On (3 frames)',
+        }],
+    },
+    0x1103 => { #PH
+        Name => 'UnknownBlock',
+        Writable => 'undef',
+        Notes => 'unknown 142kB block in ORF images, not copied to JPEG images',
+        # 'Drop' because too large for APP1 in JPEG images
+        Flags => [ 'Unknown', 'Binary', 'Drop' ],
+    },
+    0x1112 => { #11
+        Name => 'AspectRatio',
+        Writable => 'int8u',
+        Count => 2,
+        PrintConv => {
+            '1 1' => '4:3',
+            '2 2' => '3:2',
+            '3 3' => '16:9',
+            '4 4' => '6:6',
+            '5 5' => '5:4',
+            '6 6' => '7:6',
+            '7 7' => '6:5',
+            '8 8' => '7:5',
+            '9 9' => '3:4',
+        },
+    },
+    0x1113 => { #11
+        Name => 'AspectFrame',
+        Writable => 'int16u',
+        Count => 4,
+    },
+    0x1200 => { #11/PH
+        Name => 'FacesDetected',
+        Writable => 'int32u',
+        Count => -1,
+        Notes => '2 or 3 values',
+    },
+    0x1201 => { #11/PH
+        Name => 'FaceDetectArea',
+        Writable => 'int16s',
+        Count => -1, # (varies with model)
+        Binary => 1, # (too long)
+        Notes => q{
+            for models with 2 values in FacesDetected this gives X/Y coordinates in the
+            FaceDetectFrame for all 4 corners of the face rectangle.  For models with 3
+            values in FacesDetected this gives X/Y coordinates, size and rotation angle
+            of the face detect square
+        },
+    },
+    0x1202 => { #PH
+        Name => 'MaxFaces',
+        Writable => 'int32u',
+        Count => 3,
+    },
+    0x1203 => { #PH
+        Name => 'FaceDetectFrameSize',
+        Writable => 'int16u',
+        Count => 6,
+        Notes => 'width/height of the full face detect frame',
+    },
+    0x1207 => { #PH
+        Name => 'FaceDetectFrameCrop',
+        Writable => 'int16s',
+        Count => 12,
+        Notes => 'X/Y offset and width/height of the cropped face detect frame',
+    },
+);
+
+# Olympus Focus Info IFD
+%Image::ExifTool::Olympus::FocusInfo = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    WRITABLE => 1,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0x000 => { #PH
+        Name => 'FocusInfoVersion',
+        Writable => 'undef',
+        RawConv => '$val=~s/\0+$//; $val',  # (may be null terminated)
+        Count => 4,
+    },
+    0x209 => { #PH/4
+        Name => 'AutoFocus',
+        Writable => 'int16u',
+        PrintConv => \%offOn,
+        Unknown => 1, #6
+    },
+    0x210 => { #11
+        Name => 'SceneDetect',
+        Writable => 'int16u',
+    },
+    0x211 => { #11
+        Name => 'SceneArea',
+        Writable => 'int32u',
+        Count => 8,
+        Unknown => 1, # (numbers don't make much sense?)
+    },
+    0x212 => { #11
+        Name => 'SceneDetectData',
+        Writable => 'int32u',
+        Count => 720,
+        Binary => 1,
+        Unknown => 1, # (but what does it mean?)
+    },
+    0x300 => { #6
+        Name => 'ZoomStepCount',
+        Writable => 'int16u',
+    },
+    0x301 => { #11
+        Name => 'FocusStepCount',
+        Writable => 'int16u',
+    },
+    0x303 => { #11
+        Name => 'FocusStepInfinity',
+        Writable => 'int16u',
+    },
+    0x304 => { #11
+        Name => 'FocusStepNear',
+        Writable => 'int16u',
+    },
+    0x305 => { #4
+        Name => 'FocusDistance',
+        Writable => 'rational64u',
+        # this rational value looks like it is in mm when the denominator is
+        # 1 (E-1), and cm when denominator is 10 (E-300), so if we ignore the
+        # denominator we are consistently in mm - PH
+        Format => 'int32u',
+        Count => 2,
+        ValueConv => q{
+            my ($a,$b) = split ' ',$val;
+            return 0 if $a == 0xffffffff;
+            return $a / 1000;
+        },
+        ValueConvInv => q{
+            return '4294967295 1' unless $val;
+            $val = int($val * 1000 + 0.5);
+            return "$val 1";
+        },
+        PrintConv => '$val ? "$val m" : "inf"',
+        PrintConvInv => '$val eq "inf" ? 0 : $val=~s/\s*m$//, $val',
+    },
+    0x308 => [ # NEED A BETTER WAY TO DETERMINE WHICH MODELS USE WHICH ENCODING!
+        {
+            Name => 'AFPoint',
+            Condition => '$$self{Model} =~ /E-(3|5|30)\b/',
+            Writable => 'int16u',
+            PrintHex => 1,
+            # decoded by ref 6
+            Notes => q{
+                for the E-3, E-5 and E-30 the value is separated into 2 parts: low 5 bits
+                give AF point, upper bits give AF target selection mode
+            },
+            ValueConv => '($val & 0x1f) . " " . ($val & 0xffe0)',
+            ValueConvInv => 'my @v=split(" ",$val); @v == 2 ? $v[0] + $v[1] : $val',
+            PrintConv => [
+                {
+                    0x00 => '(none)',
+                    0x01 => 'Top-left (horizontal)',
+                    0x02 => 'Top-center (horizontal)',
+                    0x03 => 'Top-right (horizontal)',
+                    0x04 => 'Left (horizontal)',
+                    0x05 => 'Mid-left (horizontal)',
+                    0x06 => 'Center (horizontal)',
+                    0x07 => 'Mid-right (horizontal)',
+                    0x08 => 'Right (horizontal)',
+                    0x09 => 'Bottom-left (horizontal)',
+                    0x0a => 'Bottom-center (horizontal)',
+                    0x0b => 'Bottom-right (horizontal)',
+                    0x0c => 'Top-left (vertical)',
+                    0x0d => 'Top-center (vertical)',
+                    0x0e => 'Top-right (vertical)',
+                    0x0f => 'Left (vertical)',
+                    0x10 => 'Mid-left (vertical)',
+                    0x11 => 'Center (vertical)',
+                    0x12 => 'Mid-right (vertical)',
+                    0x13 => 'Right (vertical)',
+                    0x14 => 'Bottom-left (vertical)',
+                    0x15 => 'Bottom-center (vertical)',
+                    0x16 => 'Bottom-right (vertical)',
+                },
+                {
+                    0x00 => 'Single Target',
+                    0x40 => 'All Target',
+                    0x80 => 'Dynamic Single Target',
+                }
+            ],
+        },{ #PH (models with 7-point AF)
+            Name => 'AFPoint',
+            Condition => '$$self{Model} =~ /E-(520|600|620)\b/',
+            Notes => 'models with 7-point AF',
+            Writable => 'int16u',
+            PrintHex => 1,
+            ValueConv => '($val & 0x1f) . " " . ($val & 0xffe0)',
+            ValueConvInv => 'my @v=split(" ",$val); @v == 2 ? $v[0] + $v[1] : $val',
+            PrintConv => [
+                {
+                    0x00 => '(none)',
+                    0x01 => 'Center',
+                    # need to fill this in...
+                },
+                {
+                    0x00 => 'Single Target',
+                    0x40 => 'All Target', # (guess)
+                },
+            ]
+        },{ #11
+            Name => 'AFPoint',
+            Writable => 'int16u',
+            Notes => 'other models',
+            RawConv => '($val or $$self{Model} ne "E-P1") ? $val : undef',
+            PrintConv => {
+                # (E-P1 always writes 0, maybe other models do too - PH)
+                0 => 'Left (or n/a)',
+                1 => 'Center (horizontal)', #6 (E-510)
+                2 => 'Right',
+                3 => 'Center (vertical)', #6 (E-510)
+                255 => 'None',
+            },
+        }
+    ],
+    # 0x31a Continuous AF parameters?
+    # 0x328 Related to AF (maybe Imager AF data?) (ref PH, E-PL1):
+    #  - offset 0x2a (int8u)  ImagerAFMode?  0=Manual, 1=Auto
+    #  - offset 0x30 (int16u) AFAreaXPosition
+    #  - offset 0x32 (int16u) AFAreaWidth (202)
+    #  - offset 0x34 (int16u) AFAreaYPosition
+    #  - offset 0x36 (int16u) AFAreaHeight (50)
+    #  (AF area positions above give the top-left coordinates of the AF area in the
+    #   AF frame. Increasing Y is downwards, and the AF frame size is about 1280x256)
+    # 0x1200-0x1209 Flash information:
+    0x1201 => { #6
+        Name => 'ExternalFlash',
+        Writable => 'int16u',
+        Count => 2,
+        PrintConv => {
+            '0 0' => 'Off',
+            '1 0' => 'On',
+        },
+    },
+    0x1203 => { #11
+        Name => 'ExternalFlashGuideNumber',
+        Writable => 'rational64s',
+        Unknown => 1, # (needs verification)
+    },
+    0x1204 => { #11(reversed)/7
+        Name => 'ExternalFlashBounce',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Bounce or Off',
+            1 => 'Direct',
+        },
+    },
+    0x1205 => { #11 (ref converts to mm using table)
+        Name => 'ExternalFlashZoom',
+        Writable => 'rational64u',
+    },
+    0x1208 => { #6
+        Name => 'InternalFlash',
+        Writable => 'int16u',
+        Count => -1,
+        PrintConv => {
+            '0'   => 'Off',
+            '1'   => 'On',
+            '0 0' => 'Off',
+            '1 0' => 'On',
+        },
+    },
+    0x1209 => { #6
+        Name => 'ManualFlash',
+        Writable => 'int16u',
+        Count => 2,
+        Notes => '2 numbers: 1. 0=Off, 1=On, 2. Flash strength',
+        PrintConv => q{
+            my ($a,$b) = split ' ',$val;
+            return 'Off' unless $a;
+            $b = ($b == 1) ? 'Full' : "1/$b";
+            return "On ($b strength)";
+        },
+    },
+    0x1500 => { #6
+        Name => 'SensorTemperature',
+        Writable => 'int16s',
+        Notes => q{
+            approximately Celsius for E-1, unknown calibration for E-3/410/420/510, and
+            always zero for E-300/330/400/500, divide by 10 for E-P1?
+        },
+    },
+    0x1600 => { # ref http://fourthirdsphoto.com/vbb/showpost.php?p=107607&postcount=15
+        Name => 'ImageStabilization',
+        # (the other value is more reliable, so ignore this totally if the other exists)
+        Condition => 'not defined $$self{ImageStabilization}',
+        Writable => 'undef',
+        # if the first 4 bytes are non-zero, then bit 0x01 of byte 44
+        # gives the stabilization mode
+        PrintConv => q{
+            $val =~ /^\0{4}/ ? 'Off' : 'On, ' .
+            (unpack('x44C',$val) & 0x01 ? 'Mode 1' : 'Mode 2')
+        },
+    },
+    # 0x102a same as Subdir4-0x300
+);
+
+# Olympus raw information tags (ref 6)
+%Image::ExifTool::Olympus::RawInfo = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    NOTES => 'These tags are found only in ORF images of some models (ie. C8080WZ).',
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0x000 => {
+        Name => 'RawInfoVersion',
+        Writable => 'undef',
+        RawConv => '$val=~s/\0+$//; $val',  # (may be null terminated)
+        Count => 4,
+    },
+    0x100 => {
+        Name => 'WB_RBLevelsUsed',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x110 => {
+        Name => 'WB_RBLevelsAuto',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x120 => {
+        Name => 'WB_RBLevelsShade',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x121 => {
+        Name => 'WB_RBLevelsCloudy',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x122 => {
+        Name => 'WB_RBLevelsFineWeather',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x123 => {
+        Name => 'WB_RBLevelsTungsten',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x124 => {
+        Name => 'WB_RBLevelsEveningSunlight',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x130 => {
+        Name => 'WB_RBLevelsDaylightFluor',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x131 => {
+        Name => 'WB_RBLevelsDayWhiteFluor',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x132 => {
+        Name => 'WB_RBLevelsCoolWhiteFluor',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x133 => {
+        Name => 'WB_RBLevelsWhiteFluorescent',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x200 => {
+        Name => 'ColorMatrix2',
+        Format => 'int16s',
+        Writable => 'int16u',
+        Count => 9,
+    },
+    # 0x240 => 'ColorMatrixDefault', ?
+    # 0x250 => 'ColorMatrixSaturation', ?
+    # 0x251 => 'ColorMatrixHue', ?
+    # 0x252 => 'ColorMatrixContrast', ?
+    # 0x300 => sharpness-related
+    # 0x301 => list of sharpness-related values
+    0x310 => {
+        Name => 'CoringFilter',
+        Writable => 'int16u',
+    },
+    0x311 => {
+        Name => 'CoringValues',
+        Writable => 'int16u',
+        Count => 11,
+    },
+    0x600 => {
+        Name => 'BlackLevel2',
+        Writable => 'int16u',
+        Count => 4,
+    },
+    0x601 => {
+        Name => 'YCbCrCoefficients',
+        Notes => 'stored as int16u[6], but extracted as rational32u[3]',
+        Format => 'rational32u',
+    },
+    0x611 => {
+        Name => 'ValidPixelDepth',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x612 => { #11
+        Name => 'CropLeft',
+        Writable => 'int16u',
+    },
+    0x613 => { #11
+        Name => 'CropTop',
+        Writable => 'int16u',
+    },
+    0x614 => {
+        Name => 'CropWidth',
+        Writable => 'int32u',
+    },
+    0x615 => {
+        Name => 'CropHeight',
+        Writable => 'int32u',
+    },
+    0x1000 => {
+        Name => 'LightSource',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Unknown',
+            16 => 'Shade',
+            17 => 'Cloudy',
+            18 => 'Fine Weather',
+            20 => 'Tungsten (Incandescent)',
+            22 => 'Evening Sunlight',
+            33 => 'Daylight Fluorescent',
+            34 => 'Day White Fluorescent',
+            35 => 'Cool White Fluorescent',
+            36 => 'White Fluorescent',
+            256 => 'One Touch White Balance',
+            512 => 'Custom 1-4',
+        },
+    },
+    # the following 5 tags all have 3 values: val, min, max
+    0x1001 => {
+        Name => 'WhiteBalanceComp',
+        Writable => 'int16s',
+        Count => 3,
+    },
+    0x1010 => {
+        Name => 'SaturationSetting',
+        Writable => 'int16s',
+        Count => 3,
+    },
+    0x1011 => {
+        Name => 'HueSetting',
+        Writable => 'int16s',
+        Count => 3,
+    },
+    0x1012 => {
+        Name => 'ContrastSetting',
+        Writable => 'int16s',
+        Count => 3,
+    },
+    0x1013 => {
+        Name => 'SharpnessSetting',
+        Writable => 'int16s',
+        Count => 3,
+    },
+    # settings written by Camedia Master 4.x
+    0x2000 => {
+        Name => 'CMExposureCompensation',
+        Writable => 'rational64s',
+    },
+    0x2001 => {
+        Name => 'CMWhiteBalance',
+        Writable => 'int16u',
+    },
+    0x2002 => {
+        Name => 'CMWhiteBalanceComp',
+        Writable => 'int16s',
+    },
+    0x2010 => {
+        Name => 'CMWhiteBalanceGrayPoint',
+        Writable => 'int16u',
+        Count => 3,
+    },
+    0x2020 => {
+        Name => 'CMSaturation',
+        Writable => 'int16s',
+        Count => 3,
+    },
+    0x2021 => {
+        Name => 'CMHue',
+        Writable => 'int16s',
+        Count => 3,
+    },
+    0x2022 => {
+        Name => 'CMContrast',
+        Writable => 'int16s',
+        Count => 3,
+    },
+    0x2023 => {
+        Name => 'CMSharpness',
+        Writable => 'int16s',
+        Count => 3,
+    },
+);
+
+# Olympus unknown information tags
+%Image::ExifTool::Olympus::UnknownInfo = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+);
+
+# Tags found only in some FE models
+%Image::ExifTool::Olympus::FETags = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => q{
+        Some FE models write a large number of tags here, but most of this
+        information remains unknown.
+    },
+    0x0100 => {
+        Name => 'BodyFirmwareVersion',
+        Writable => 'string',
+    },
+);
+
+# tags in Olympus QuickTime videos (ref PH)
+# (similar information in Kodak,Minolta,Nikon,Olympus,Pentax and Sanyo videos)
+%Image::ExifTool::Olympus::MOV1 = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    FIRST_ENTRY => 0,
+    NOTES => q{
+        This information is found in MOV videos from Olympus models such as the
+        D540Z, D595Z, FE100, FE110, FE115, FE170 and FE200.
+    },
+    0x00 => {
+        Name => 'Make',
+        Format => 'string[24]',
+    },
+    0x18 => {
+        Name => 'Model',
+        Format => 'string[8]',
+    },
+    # (01 00 at offset 0x20)
+    0x26 => {
+        Name => 'ExposureUnknown',
+        Unknown => 1,
+        Format => 'int32u',
+        # this conversion doesn't work for all models (ie. gives "1/100000")
+        ValueConv => '$val ? 10 / $val : 0',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+    },
+    0x2a => {
+        Name => 'FNumber',
+        Format => 'rational64u',
+        PrintConv => 'sprintf("%.1f",$val)',
+    },
+    0x32 => { #(NC)
+        Name => 'ExposureCompensation',
+        Format => 'rational64s',
+        PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
+    },
+  # 0x44 => WhiteBalance ?
+    0x48 => {
+        Name => 'FocalLength',
+        Format => 'rational64u',
+        PrintConv => 'sprintf("%.1f mm",$val)',
+    },
+  # 0xb1 => 'ISO', #(I don't think this works - PH)
+);
+
+# tags in Olympus QuickTime videos (ref PH)
+# (similar information in Kodak,Minolta,Nikon,Olympus,Pentax and Sanyo videos)
+%Image::ExifTool::Olympus::MOV2 = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    FIRST_ENTRY => 0,
+    NOTES => q{
+        This information is found in MOV videos from Olympus models such as the
+        FE120, FE140 and FE190.
+    },
+    0x00 => {
+        Name => 'Make',
+        Format => 'string[24]',
+    },
+    0x18 => {
+        Name => 'Model',
+        Format => 'string[24]',
+    },
+    # (01 00 at offset 0x30)
+    0x36 => {
+        Name => 'ExposureTime',
+        Format => 'int32u',
+        ValueConv => '$val ? 10 / $val : 0',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+    },
+    0x3a => {
+        Name => 'FNumber',
+        Format => 'rational64u',
+        PrintConv => 'sprintf("%.1f",$val)',
+    },
+    0x42 => { #(NC)
+        Name => 'ExposureCompensation',
+        Format => 'rational64s',
+        PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
+    },
+    0x58 => {
+        Name => 'FocalLength',
+        Format => 'rational64u',
+        PrintConv => 'sprintf("%.1f mm",$val)',
+    },
+    0xc1 => {
+        Name => 'ISO',
+        Format => 'int16u',
+    },
+);
+
+# tags in Olympus MP4 videos (ref PH)
+%Image::ExifTool::Olympus::MP4 = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    FIRST_ENTRY => 0,
+    NOTES => q{
+        This information is found in MP4 videos from Olympus models such as the
+        u7040 and u9010.
+    },
+    0x00 => {
+        Name => 'Make',
+        Format => 'string[24]',
+    },
+    0x18 => {
+        Name => 'Model',
+        Format => 'string[24]',
+    },
+    0x28 => {
+        Name => 'FNumber',
+        Format => 'rational64u',
+        PrintConv => 'sprintf("%.1f",$val)',
+    },
+    0x30 => { #(NC)
+        Name => 'ExposureCompensation',
+        Format => 'rational64s',
+        PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
+    },
+    # NEED MORE SAMPLES TO DECODE THIS
+);
+
+# tags in Olympus AVI videos (ref PH)
+%Image::ExifTool::Olympus::AVI = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    FIRST_ENTRY => 0,
+    NOTES => 'This information is found in Olympus AVI videos.',
+    0x12 => {
+        Name => 'Make',
+        Format => 'string[24]',
+    },
+    0x2c => {
+        Name => 'ModelType',
+        Format => 'string[24]',
+    },
+    0x5e => {
+        Name => 'FNumber',
+        Format => 'rational64u',
+        PrintConv => 'sprintf("%.1f",$val)',
+    },
+    0x83 => {
+        Name => 'DateTime1',
+        Format => 'string[24]',
+        Groups => { 2 => 'Time' },
+    },
+    0x9d => {
+        Name => 'DateTime2',
+        Format => 'string[24]',
+        Groups => { 2 => 'Time' },
+    },
+    0x12d => {
+        Name => 'ThumbnailLength',
+        Format => 'int32u',
+    },
+    0x131 => {
+        Name => 'ThumbnailImage',
+        Format => 'undef[$val{0x12d}]',
+        Notes => '160x120 JPEG thumbnail image',
+        RawConv => '$self->ValidateImage(\$val,$tag)',
+    },
+);
+
+# tags in WAV files from Olympus PCM linear recorders (ref 18)
+%Image::ExifTool::Olympus::WAV = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Audio' },
+    FIRST_ENTRY => 0,
+    NOTES => q{
+        This information is found in WAV files from Olympus PCM linear recorders
+        like the LS-5, LS-10, LS-11.
+    },
+    0x0c => {
+        Name => 'Model',
+        Format => 'string[16]',
+    },
+    0x1c => {
+        Name => 'FileNumber',
+        Format => 'int32u',
+        PrintConv => 'sprintf("%.4d", $val)',
+    },
+    0x26 => {
+        Name => 'DateTimeOriginal',
+        Description => 'Date/Time Original',
+        Groups => { 2 => 'Time' },
+        Format => 'undef[12]',
+        Notes => 'time at start of recording',
+        ValueConv => q{
+            return undef unless $val =~ /^(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$/;
+            my $y = $1 < 70 ? "20$1" : "19$1";
+            return "$y:$2:$3 $4:$5:$6";
+        },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    0x32 => {
+        Name => 'DateTimeEnd',
+        Groups => { 2 => 'Time' },
+        Format => 'undef[12]',
+        Notes => 'time at end of recording',
+        ValueConv => q{
+            return undef unless $val =~ /^(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$/;
+            my $y = $1 < 70 ? "20$1" : "19$1";
+            return "$y:$2:$3 $4:$5:$6";
+        },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    0x3e => {
+        Name => 'RecordingTime',
+        Format => 'undef[6]',
+        ValueConv => '$val =~ s/^(\d{2})(\d{2})/$1:$2:/; $val',
+    },
+    0x200 => {
+        Name => 'Duration',
+        Format => 'int32u',
+        ValueConv => '$val / 1000',
+        PrintConv => 'ConvertDuration($val)',
+    },
+    0x20a => { Name => 'Index01', %indexInfo },
+    0x214 => { Name => 'Index02', %indexInfo },
+    0x21e => { Name => 'Index03', %indexInfo },
+    0x228 => { Name => 'Index04', %indexInfo },
+    0x232 => { Name => 'Index05', %indexInfo },
+    0x23c => { Name => 'Index06', %indexInfo },
+    0x246 => { Name => 'Index07', %indexInfo },
+    0x250 => { Name => 'Index08', %indexInfo },
+    0x25a => { Name => 'Index09', %indexInfo },
+    0x264 => { Name => 'Index10', %indexInfo },
+    0x26e => { Name => 'Index11', %indexInfo },
+    0x278 => { Name => 'Index12', %indexInfo },
+    0x282 => { Name => 'Index13', %indexInfo },
+    0x28c => { Name => 'Index14', %indexInfo },
+    0x296 => { Name => 'Index15', %indexInfo },
+    0x2a0 => { Name => 'Index16', %indexInfo },
+);
+
+# Olympus composite tags
+%Image::ExifTool::Olympus::Composite = (
+    GROUPS => { 2 => 'Camera' },
+    ExtenderStatus => {
+        Notes => q{
+            Olympus cameras have the quirk that they may retain the extender settings
+            after the extender is removed until the camera is powered off.  This tag is
+            an attempt to represent the actual status of the extender.
+        },
+        Require => {
+            0 => 'Olympus:Extender',
+            1 => 'Olympus:LensType',
+            2 => 'MaxApertureValue',
+        },
+        ValueConv => 'Image::ExifTool::Olympus::ExtenderStatus($val[0],$prt[1],$val[2])',
+        PrintConv => {
+            0 => 'Not attached',
+            1 => 'Attached',
+            2 => 'Removed',
+        },
+    },
+    ZoomedPreviewImage => {
+        Require => {
+            0 => 'ZoomedPreviewStart',
+            1 => 'ZoomedPreviewLength',
+        },
+        RawConv => 'Image::ExifTool::Exif::ExtractImage($self,$val[0],$val[1],"ZoomedPreviewImage")',
+    },
+);
+
+# add our composite tags
+Image::ExifTool::AddCompositeTags('Image::ExifTool::Olympus');
+
+
+#------------------------------------------------------------------------------
+# Determine if the extender (EX-25/EC-14) was really attached (ref 9)
+# Inputs: 0) Extender, 1) LensType string, 2) MaxApertureAtMaxFocal
+# Returns: 0=not attached, 1=attached, 2=could have been removed
+# Notes: Olympus has a bug in the in-camera firmware which results in the
+# extender information being cached and written into the EXIF data even after
+# the extender has been removed.  You must power cycle the camera to prevent it
+# from writing the cached extender information into the EXIF data.
+sub ExtenderStatus($$$)
+{
+    my ($extender, $lensType, $maxAperture) = @_;
+    my @info = split ' ', $extender;
+    # validate that extender identifier is reasonable
+    return 0 unless @info >= 2 and $info[1];
+    # if it's not an EC-14 (id 0 4) then assume it was really attached
+    # (other extenders don't seem to affect the reported max aperture)
+    return 1 if "$info[0] $info[1]" ne '0 4';
+    # get the maximum aperture for this lens (in $1)
+    $lensType =~ / F(\d+(.\d+)?)/ or return 1;
+    # If the maximum aperture at the maximum focal length is greater than the
+    # known max/max aperture of the lens, then the extender must be attached
+    return ($maxAperture - $1 > 0.2) ? 1 : 2;
+}
+
+#------------------------------------------------------------------------------
+# Print AF points
+# Inputs: 0) AF point data (string of integers)
+# Notes: I'm just guessing that the 2nd and 4th bytes are the Y coordinates,
+# and that more AF points will show up in the future (derived from E-1 images,
+# and the E-1 uses just one of 3 possible AF points, all centered in Y) - PH
+sub PrintAFAreas($)
+{
+    my $val = shift;
+    my @points = split ' ', $val;
+    my %afPointNames = (
+        0x36794285 => 'Left',
+        0x79798585 => 'Center',
+        0xBD79C985 => 'Right',
+    );
+    $val = '';
+    my $pt;
+    foreach $pt (@points) {
+        next unless $pt;
+        $val and $val .= ', ';
+        $afPointNames{$pt} and $val .= $afPointNames{$pt} . ' ';
+        my @coords = unpack('C4',pack('N',$pt));
+        $val .= "($coords[0],$coords[1])-($coords[2],$coords[3])";
+    }
+    $val or $val = 'none';
+    return $val;
+}
+
+#------------------------------------------------------------------------------
+# Process ORF file
+# Inputs: 0) ExifTool object reference, 1) directory information reference
+# Returns: 1 if this looked like a valid ORF file, 0 otherwise
+sub ProcessORF($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    return $exifTool->ProcessTIFF($dirInfo);
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Olympus - Olympus/Epson maker notes tags
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to interpret
+Olympus or Epson maker notes in EXIF information.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html>
+
+=item L<http://www.cybercom.net/~dcoffin/dcraw/>
+
+=item L<http://www.ozhiker.com/electronics/pjmt/jpeg_info/olympus_mn.html>
+
+=item L<http://olypedia.de/Olympus_Makernotes>
+
+=back
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Markku Hanninen, Remi Guyomarch, Frank Ledwon, Michael Meissner,
+Mark Dapoz, Ioannis Panagiotopoulos and Tomasz Kawecki for their help
+figuring out some Olympus tags, and Lilo Huang, Chris Shaw and Viktor
+Lushnikov for adding to the LensType list.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/Olympus Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/PDF.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/PDF.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/PDF.pm	(revision 24799)
@@ -0,0 +1,1946 @@
+#------------------------------------------------------------------------------
+# File:         PDF.pm
+#
+# Description:  Read PDF meta information
+#
+# Revisions:    07/11/2005 - P. Harvey Created
+#               07/25/2005 - P. Harvey Add support for encrypted documents
+#
+# References:   1) http://www.adobe.com/devnet/pdf/pdf_reference.html
+#               2) http://search.cpan.org/dist/Crypt-RC4/
+#               3) http://www.adobe.com/devnet/acrobat/pdfs/PDF32000_2008.pdf
+#               4) http://www.adobe.com/content/dam/Adobe/en/devnet/pdf/pdfs/adobe_supplement_iso32000.pdf
+#               5) http://tools.ietf.org/search/rfc3454
+#               6) http://www.armware.dk/RFC/rfc/rfc4013.html
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::PDF;
+
+use strict;
+use vars qw($VERSION $AUTOLOAD $lastFetched);
+use Image::ExifTool qw(:DataAccess :Utils);
+require Exporter;
+
+$VERSION = '1.29';
+
+sub FetchObject($$$$);
+sub ExtractObject($$;$$);
+sub ReadToNested($;$);
+sub ProcessDict($$$$;$$);
+sub ReadPDFValue($);
+sub CheckPDF($$$);
+
+# $lastFetched - last fetched object reference (used for decryption)
+#                (undefined if fetched object was already decrypted, ie. object from stream)
+
+my $cryptInfo;      # encryption object reference (plus additional information)
+my $cryptString;    # flag that strings are encrypted
+my $cryptStream;    # flag that streams are encrypted
+my $lastOffset;     # last fetched object offset
+my %streamObjs;     # hash of stream objects
+my %fetched;        # dicts fetched in verbose mode (to avoid cyclical recursion)
+my $pdfVer;         # version of PDF file being processed
+
+# tags in main PDF directories
+%Image::ExifTool::PDF::Main = (
+    GROUPS => { 2 => 'Document' },
+    VARS => { CAPTURE => ['Main','Prev'] },
+    Info => {
+        SubDirectory => { TagTable => 'Image::ExifTool::PDF::Info' },
+    },
+    Root => {
+        SubDirectory => { TagTable => 'Image::ExifTool::PDF::Root' },
+    },
+    Encrypt => {
+        NoProcess => 1, # don't process normally (processed in advance)
+        SubDirectory => { TagTable => 'Image::ExifTool::PDF::Encrypt' },
+    },
+    _linearized => {
+        Name => 'Linearized',
+        Notes => 'flag set if document is linearized for fast web display; not a real Tag ID',
+        PrintConv => { 'true' => 'Yes', 'false' => 'No' },
+    },
+);
+
+# tags in PDF Info directory
+%Image::ExifTool::PDF::Info = (
+    GROUPS => { 2 => 'Document' },
+    VARS => { CAPTURE => ['Info'] },
+    EXTRACT_UNKNOWN => 1, # extract all unknown tags in this directory
+    WRITE_PROC => \&Image::ExifTool::DummyWriteProc,
+    CHECK_PROC => \&CheckPDF,
+    WRITABLE => 'string',
+    NOTES => q{
+        As well as the tags listed below, the PDF specification allows for
+        user-defined tags to exist in the Info dictionary.  These tags, which should
+        have corresponding XMP-pdfx entries in the XMP of the PDF XML Metadata
+        object, are also extracted by ExifTool.
+
+        B<Writable> specifies the value format, and may be C<string>, C<date>,
+        C<integer>, C<real>, C<boolean> or C<name> for PDF tags.
+    },
+    Title       => { },
+    Author      => { Groups => { 2 => 'Author' } },
+    Subject     => { },
+    Keywords    => { List => 'string' },  # this is a string list
+    Creator     => { },
+    Producer    => { },
+    CreationDate => {
+        Name => 'CreateDate',
+        Writable => 'date',
+        Groups => { 2 => 'Time' },
+        Shift => 'Time',
+        PrintConv => '$self->ConvertDateTime($val)',
+        PrintConvInv => '$self->InverseDateTime($val)',
+    },
+    ModDate => {
+        Name => 'ModifyDate',
+        Writable => 'date',
+        Groups => { 2 => 'Time' },
+        Shift => 'Time',
+        PrintConv => '$self->ConvertDateTime($val)',
+        PrintConvInv => '$self->InverseDateTime($val)',
+    },
+    Trapped => {
+        Protected => 1,
+        # remove leading '/' from '/True' or '/False'
+        ValueConv => '$val=~s{^/}{}; $val',
+        ValueConvInv => '"/$val"',
+    },
+    'AAPL:Keywords' => { #PH
+        Name => 'AppleKeywords',
+        List => 'array', # this is an array of values
+        Notes => q{
+            keywords written by Apple utilities, although they seem to use PDF:Keywords
+            when reading
+        },
+    },
+);
+
+# tags in the PDF Root document catalog
+%Image::ExifTool::PDF::Root = (
+    GROUPS => { 2 => 'Document' },
+    # note: can't capture previous versions of Root since they are not parsed
+    VARS => { CAPTURE => ['Root'] },
+    NOTES => 'This is the PDF document catalog.',
+    MarkInfo => {
+        SubDirectory => { TagTable => 'Image::ExifTool::PDF::MarkInfo' },
+    },
+    Metadata => {
+        SubDirectory => { TagTable => 'Image::ExifTool::PDF::Metadata' },
+    },
+    Pages => {
+        SubDirectory => { TagTable => 'Image::ExifTool::PDF::Pages' },
+    },
+    Perms => {
+        SubDirectory => { TagTable => 'Image::ExifTool::PDF::Perms' },
+    },
+    Lang       => 'Language',
+    PageLayout => { },
+    PageMode   => { },
+    Version    => 'PDFVersion',
+);
+
+# tags extracted from the PDF Encrypt dictionary
+%Image::ExifTool::PDF::Encrypt = (
+    GROUPS => { 2 => 'Document' },
+    NOTES => 'Tags extracted from the document Encrypt dictionary.',
+    Filter => {
+        Name => 'Encryption',
+        Notes => q{
+            extracted value is actually a combination of the Filter, SubFilter, V, R and
+            Length information from the Encrypt dictionary
+        },
+    },
+    P => {
+        Name => 'UserAccess',
+        ValueConv => '$val & 0x0f3c',  # ignore reserved bits
+        PrintConvColumns => 2,
+        PrintConv => { BITMASK => {
+            2 => 'Print',
+            3 => 'Modify',
+            4 => 'Copy',
+            5 => 'Annotate',
+            8 => 'Fill forms',
+            9 => 'Extract',
+            10 => 'Assemble',
+            11 => 'Print high-res',
+        }},
+    },
+);
+
+# tags in PDF Pages directory
+%Image::ExifTool::PDF::Pages = (
+    GROUPS => { 2 => 'Document' },
+    Count => 'PageCount',
+    Kids => {
+        SubDirectory => { TagTable => 'Image::ExifTool::PDF::Kids' },
+    },
+);
+
+# tags in PDF Perms directory
+%Image::ExifTool::PDF::Perms = (
+    NOTES => 'Additional document permissions imposed by digital signatures.',
+    DocMDP => {
+        SubDirectory => { TagTable => 'Image::ExifTool::PDF::Signature' },
+    },
+    FieldMDP => {
+        SubDirectory => { TagTable => 'Image::ExifTool::PDF::Signature' },
+    },
+    UR3 => {
+        SubDirectory => { TagTable => 'Image::ExifTool::PDF::Signature' },
+    },
+);
+
+# tags in PDF Kids directory
+%Image::ExifTool::PDF::Kids = (
+    Metadata => {
+        SubDirectory => { TagTable => 'Image::ExifTool::PDF::Metadata' },
+    },
+    PieceInfo => {
+        SubDirectory => { TagTable => 'Image::ExifTool::PDF::PieceInfo' },
+    },
+    Resources => {
+        SubDirectory => { TagTable => 'Image::ExifTool::PDF::Resources' },
+    },
+);
+
+# tags in PDF Resources directory
+%Image::ExifTool::PDF::Resources = (
+    ColorSpace => {
+        SubDirectory => { TagTable => 'Image::ExifTool::PDF::ColorSpace' },
+    },
+);
+
+# tags in PDF ColorSpace directory
+%Image::ExifTool::PDF::ColorSpace = (
+    DefaultRGB => {
+        SubDirectory => { TagTable => 'Image::ExifTool::PDF::DefaultRGB' },
+    },
+);
+
+# tags in PDF DefaultRGB directory
+%Image::ExifTool::PDF::DefaultRGB = (
+    ICCBased => {
+        SubDirectory => { TagTable => 'Image::ExifTool::PDF::ICCBased' },
+    },
+);
+
+# tags in PDF ICCBased directory
+%Image::ExifTool::PDF::ICCBased = (
+    _stream => {
+        SubDirectory => { TagTable => 'Image::ExifTool::ICC_Profile::Main' },
+    },
+);
+
+# tags in PDF PieceInfo directory
+%Image::ExifTool::PDF::PieceInfo = (
+    AdobePhotoshop => {
+        SubDirectory => { TagTable => 'Image::ExifTool::PDF::AdobePhotoshop' },
+    },
+    Illustrator => {
+        # assume this is an illustrator file if it contains this directory
+        # and doesn't have a ".PDF" extension
+        Condition => q{
+            $self->OverrideFileType("AI") unless $$self{FILE_EXT} and $$self{FILE_EXT} eq 'PDF';
+            return 1;
+        },
+        SubDirectory => { TagTable => 'Image::ExifTool::PDF::Illustrator' },
+    },
+);
+
+# tags in PDF AdobePhotoshop directory
+%Image::ExifTool::PDF::AdobePhotoshop = (
+    Private => {
+        SubDirectory => { TagTable => 'Image::ExifTool::PDF::Private' },
+    },
+);
+
+# tags in PDF Illustrator directory
+%Image::ExifTool::PDF::Illustrator = (
+    Private => {
+        SubDirectory => { TagTable => 'Image::ExifTool::PDF::AIPrivate' },
+    },
+);
+
+# tags in PDF Private directory
+%Image::ExifTool::PDF::Private = (
+    ImageResources => {
+        SubDirectory => { TagTable => 'Image::ExifTool::PDF::ImageResources' },
+    },
+);
+
+# tags in PDF AI Private directory
+%Image::ExifTool::PDF::AIPrivate = (
+    GROUPS => { 2 => 'Document' },
+    EXTRACT_UNKNOWN => 0,   # extract known but numbered tags
+    AIMetaData => {
+        SubDirectory => { TagTable => 'Image::ExifTool::PDF::AIMetaData' },
+    },
+    AIPrivateData => {
+        Notes => q{
+            the ExtractEmbedded option enables information to be extracted from embedded
+            PostScript documents in the AIPrivateData stream
+        },
+        SubDirectory => { TagTable => 'Image::ExifTool::PostScript::Main' },
+    },
+    RoundTripVersion => { },
+    ContainerVersion => { },
+    CreatorVersion => { },
+);
+
+# tags in PDF AIMetaData directory
+%Image::ExifTool::PDF::AIMetaData = (
+    _stream => {
+        SubDirectory => { TagTable => 'Image::ExifTool::PostScript::Main' },
+    },
+);
+
+# tags in PDF ImageResources directory
+%Image::ExifTool::PDF::ImageResources = (
+    _stream => {
+        SubDirectory => { TagTable => 'Image::ExifTool::Photoshop::Main' },
+    },
+);
+
+# tags in PDF MarkInfo directory
+%Image::ExifTool::PDF::MarkInfo = (
+    GROUPS => { 2 => 'Document' },
+    Marked => {
+        Name => 'TaggedPDF',
+        Notes => "not a Tagged PDF if this tag is missing",
+        PrintConv => { 'true' => 'Yes', 'false' => 'No' },
+    },
+);
+
+# tags in PDF Metadata directory
+%Image::ExifTool::PDF::Metadata = (
+    GROUPS => { 2 => 'Document' },
+    XML_stream => { # this is the stream for a Subtype /XML dictionary (not a real tag)
+        Name => 'XMP',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' },
+    },
+);
+
+# tags in PDF signature directories (DocMDP, FieldMDP or UR3)
+%Image::ExifTool::PDF::Signature = (
+    GROUPS => { 2 => 'Document' },
+    ContactInfo => 'SignerContactInfo',
+    Location => 'SigningLocation',
+    M => {
+        Name => 'SigningDate',
+        Format => 'date',
+        Groups => { 2 => 'Time' },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    Name     => 'SigningAuthority',
+    Reason   => 'SigningReason',
+    Reference => {
+        SubDirectory => { TagTable => 'Image::ExifTool::PDF::Reference' },
+    },
+    Prop_AuthTime => {
+        Name => 'AuthenticationTime',
+        PrintConv => 'ConvertTimeSpan($val) . " ago"',
+    },
+    Prop_AuthType => 'AuthenticationType',
+);
+
+# tags in PDF Reference directory
+%Image::ExifTool::PDF::Reference = (
+    TransformParams => {
+        SubDirectory => { TagTable => 'Image::ExifTool::PDF::TransformParams' },
+    },
+);
+
+# tags in PDF TransformParams directory
+%Image::ExifTool::PDF::TransformParams = (
+    GROUPS => { 2 => 'Document' },
+    Annots => {
+        Name => 'AnnotationUsageRights',
+        Notes => 'UR3 signatures only',
+        List => 1,
+    },
+    Document => {
+        Name => 'DocumentUsageRights',
+        Notes => 'UR3 signatures only',
+        List => 1,
+    },
+    Form => {
+        Name => 'FormUsageRights',
+        Notes => 'UR3 signatures only',
+        List => 1,
+    },
+    Signature => {
+        Name => 'SignatureUsageRights',
+        Notes => 'UR3 signatures only',
+        List => 1,
+    },
+    EF => {
+        Name => 'EmbeddedFileUsageRights',
+        Notes => 'UR3 signatures only',
+        List => 1,
+    },
+    Msg => {
+        Name => 'UsageRightsMessage',
+        Notes => 'UR3 signatures only',
+    },
+    P => {
+        Name => 'ModificationPermissions',
+        Notes => q{
+            1-3 for DocMDP signatures, default 2; true/false for UR3 signatures, default
+            false
+        },
+        PrintConv => {
+            1 => 'No changes permitted',
+            2 => 'Fill forms, Create page templates, Sign',
+            3 => 'Fill forms, Create page templates, Sign, Create/Delete/Edit annotations',
+            'true' => 'Restrict al applications to reader permissions',
+            'false' => 'Do not restrict applications to reader permissions',
+        },
+    },
+    Action => {
+        Name => 'FieldPermissions',
+        Notes => 'FieldMDP signatures only',
+        PrintConv => {
+            'All' => 'Disallow changes to all form fields',
+            'Include' => 'Disallow changes to specified form fields',
+            'Exclude' => 'Allow changes to specified form fields',
+        },
+    },
+    Fields => {
+        Notes => 'FieldMDP signatures only',
+        Name => 'FormFields',
+        List => 1,
+    },
+);
+
+# unknown tags for use in verbose option
+%Image::ExifTool::PDF::Unknown = (
+    GROUPS => { 2 => 'Unknown' },
+);
+
+#------------------------------------------------------------------------------
+# AutoLoad our writer routines when necessary
+#
+sub AUTOLOAD
+{
+    return Image::ExifTool::DoAutoLoad($AUTOLOAD, @_);
+}
+
+#------------------------------------------------------------------------------
+# Convert from PDF to EXIF-style date/time
+# Inputs: 0) PDF date/time string (D:YYYYmmddHHMMSS+HH'MM')
+# Returns: EXIF date string (YYYY:mm:dd HH:MM:SS+HH:MM)
+sub ConvertPDFDate($)
+{
+    my $date = shift;
+    # remove optional 'D:' prefix
+    $date =~ s/^D://;
+    # fill in default values if necessary
+    #              YYYYmmddHHMMSS
+    my $default = '00000101000000';
+    if (length $date < length $default) {
+        $date .= substr($default, length $date);
+    }
+    $date =~ /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(.*)/ or return $date;
+    $date = "$1:$2:$3 $4:$5:$6";
+    if ($7) {
+        my $tz = $7;
+        if ($tz =~ /^\s*Z/i) {
+            # ignore any "HH'mm'" after the Z (OS X 10.6 does this)
+            $date .= 'Z';
+        # tolerate some improper formatting in timezone specification
+        } elsif ($tz =~ /^\s*([-+])\s*(\d+)[': ]+(\d*)/) {
+            $date .= $1 . $2 . ':' . ($3 || '00');
+        }
+    }
+    return $date;
+}
+
+#------------------------------------------------------------------------------
+# Locate any object in the XRef tables (including compressed objects)
+# Inputs: 0) XRef reference, 1) object reference string (or free object number)
+# Returns: offset to object in file or compressed object reference string,
+#          0 if object is free, or undefined on error
+sub LocateAnyObject($$)
+{
+    my ($xref, $ref) = @_;
+    return undef unless $xref;
+    return $$xref{$ref} if exists $$xref{$ref};
+    # get the object number
+    return undef unless $ref =~ /^(\d+)/;
+    my $objNum = $1;
+    # return 0 if the object number has been reused (old object is free)
+    return 0 if defined $$xref{$objNum};
+#
+# scan our XRef stream dictionaries for this object
+#
+    return undef unless $$xref{dicts};
+    my $dict;
+    foreach $dict (@{$$xref{dicts}}) {
+        # quick check to see if the object is in the range for this xref stream
+        next if $objNum >= $$dict{Size};
+        my $index = $$dict{Index};
+        next if $objNum < $$index[0];
+        # scan the tables for the specified object
+        my $size = $$dict{_entry_size};
+        my $num = scalar(@$index) / 2;
+        my $tot = 0;
+        my $i;
+        for ($i=0; $i<$num; ++$i) {
+            my $start = $$index[$i*2];
+            my $count = $$index[$i*2+1];
+            # table is in ascending order, so quit if we have passed the object
+            last if $objNum < $start;
+            if ($objNum < $start + $count) {
+                my $offset = $size * ($objNum - $start + $tot);
+                last if $offset + $size > length $$dict{_stream};
+                my @c = unpack("x$offset C$size", $$dict{_stream});
+                # extract values from this table entry
+                # (can be 1, 2, 3, 4, etc.. bytes per value)
+                my (@t, $j, $k);
+                my $w = $$dict{W};
+                for ($j=0; $j<3; ++$j) {
+                    # use default value if W entry is 0 (as per spec)
+                    # - 0th element defaults to 1, others default to 0
+                    $$w[$j] or $t[$j] = ($j ? 0 : 1), next;
+                    $t[$j] = shift(@c);
+                    for ($k=1; $k < $$w[$j]; ++$k) {
+                        $t[$j] = 256 * $t[$j] + shift(@c);
+                    }
+                }
+                # by default, use "o g R" as the xref key
+                # (o = object number, g = generation number)
+                my $ref2 = "$objNum $t[2] R";
+                if ($t[0] == 1) {
+                    # normal object reference:
+                    # $t[1]=offset of object from start, $t[2]=generation number
+                    $$xref{$ref2} = $t[1];
+                } elsif ($t[0] == 2) {
+                    # compressed object reference:
+                    # $t[1]=stream object number, $t[2]=index of object in stream
+                    $ref2 = "$objNum 0 R";
+                    $$xref{$ref2} = "I$t[2] $t[1] 0 R";
+                } elsif ($t[0] == 0) {
+                    # free object:
+                    # $t[1]=next free object in linked list, $t[2]=generation number
+                    $$xref{$ref2} = 0;
+                } else {
+                    # treat as a null object
+                    $$xref{$ref2} = undef;
+                }
+                $$xref{$objNum} = $t[1];    # remember offsets by object number too
+                return $$xref{$ref} if $ref eq $ref2;
+                return 0;   # object is free or was reused
+            }
+            $tot += $count;
+        }
+    }
+    return undef;
+}
+
+#------------------------------------------------------------------------------
+# Locate a regular object in the XRef tables (does not include compressed objects)
+# Inputs: 0) XRef reference, 1) object reference string (or free object number)
+# Returns: offset to object in file, 0 if object is free,
+#          or undef on error or if object was compressed
+sub LocateObject($$)
+{
+    my ($xref, $ref) = @_;
+    my $offset = LocateAnyObject($xref, $ref);
+    return undef if $offset and $offset =~ /^I/;
+    return $offset;
+}
+
+#------------------------------------------------------------------------------
+# Fetch indirect object from file (from inside a stream if required)
+# Inputs: 0) ExifTool object reference, 1) object reference string,
+#         2) xref lookup, 3) object name (for warning messages)
+# Returns: object data or undefined on error
+# Notes: sets $lastFetched to the object reference, or undef if the object
+#        was extracted from an encrypted stream
+sub FetchObject($$$$)
+{
+    my ($exifTool, $ref, $xref, $tag) = @_;
+    $lastFetched = $ref;    # save this for decoding if necessary
+    my $offset = LocateAnyObject($xref, $ref);
+    $lastOffset = $offset;
+    unless ($offset) {
+        $exifTool->Warn("Bad $tag reference") unless defined $offset;
+        return undef;
+    }
+    my ($data, $obj);
+    if ($offset =~ s/^I(\d+) //) {
+        my $index = $1; # object index in stream
+        my ($objNum) = split ' ', $ref; # save original object number
+        $ref = $offset; # now a reference to the containing stream object
+        $obj = $streamObjs{$ref};
+        unless ($obj) {
+            # don't try to load the same object stream twice
+            return undef if defined $obj;
+            $streamObjs{$ref} = '';
+            # load the parent object stream
+            $obj = FetchObject($exifTool, $ref, $xref, $tag);
+            # make sure it contains everything we need
+            return undef unless defined $obj and ref($obj) eq 'HASH';
+            return undef unless $$obj{First} and $$obj{N};
+            return undef unless DecodeStream($exifTool, $obj);
+            # add a special '_table' entry to this dictionary which contains
+            # the list of object number/offset pairs from the stream header
+            my $num = $$obj{N} * 2;
+            my @table = split ' ', $$obj{_stream}, $num;
+            return undef unless @table == $num;
+            # remove everything before first object in stream
+            $$obj{_stream} = substr($$obj{_stream}, $$obj{First});
+            $table[$num-1] =~ s/^(\d+).*/$1/s;  # trim excess from last number
+            $$obj{_table} = \@table;
+            # save the object stream so we don't have to re-load it later
+            $streamObjs{$ref} = $obj;
+        }
+        # verify that we have the specified object
+        my $i = 2 * $index;
+        my $table = $$obj{_table};
+        unless ($index < $$obj{N} and $$table[$i] == $objNum) {
+            $exifTool->Warn("Bad index for stream object $tag");
+            return undef;
+        }
+        # extract the object at the specified index in the stream
+        # (offsets in table are in sequential order, so we can subract from
+        #  the next offset to get the object length)
+        $offset = $$table[$i + 1];
+        my $len = ($$table[$i + 3] || length($$obj{_stream})) - $offset;
+        $data = substr($$obj{_stream}, $offset, $len);
+        # avoid re-decrypting data in already decrypted streams
+        undef $lastFetched if $cryptStream;
+        return ExtractObject($exifTool, \$data);
+    }
+    my $raf = $exifTool->{RAF};
+    $raf->Seek($offset, 0) or $exifTool->Warn("Bad $tag offset"), return undef;
+    # verify that we are reading the expected object
+    $raf->ReadLine($data) or $exifTool->Warn("Error reading $tag data"), return undef;
+    ($obj = $ref) =~ s/R/obj/;
+    unless ($data =~ s/^$obj//) {
+        $exifTool->Warn("$tag object ($obj) not found at $offset");
+        return undef;
+    }
+    return ExtractObject($exifTool, \$data, $raf, $xref);
+}
+
+#------------------------------------------------------------------------------
+# Convert PDF value to something readable
+# Inputs: 0) PDF object data
+# Returns: converted object
+sub ReadPDFValue($)
+{
+    my $str = shift;
+    # decode all strings in an array
+    if (ref $str eq 'ARRAY') {
+        # create new list to not alter the original data when rewriting
+        my ($val, @vals);
+        foreach $val (@$str) {
+            push @vals, ReadPDFValue($val);
+        }
+        return \@vals;
+    }
+    length $str or return $str;
+    my $delim = substr($str, 0, 1);
+    if ($delim eq '(') {    # literal string
+        $str = $1 if $str =~ /.*?\((.*)\)/s;    # remove brackets
+        # decode escape sequences in literal strings
+        while ($str =~ /\\(.)/sg) {
+            my $n = pos($str) - 2;
+            my $c = $1;
+            my $r;
+            if ($c =~ /[0-7]/) {
+                # get up to 2 more octal digits
+                $c .= $1 if $str =~ /\G([0-7]{1,2})/g;
+                # convert octal escape code
+                $r = chr(oct($c) & 0xff);
+            } elsif ($c eq "\x0d") {
+                # the string is continued if the line ends with '\'
+                # (also remove "\x0d\x0a")
+                $c .= $1 if $str =~ /\G(\x0a)/g;
+                $r = '';
+            } elsif ($c eq "\x0a") {
+                $r = '';
+            } else {
+                # convert escaped characters
+                ($r = $c) =~ tr/nrtbf/\n\r\t\b\f/;
+            }
+            substr($str, $n, length($c)+1) = $r;
+            # continue search after this character
+            pos($str) = $n + length($r);
+        }
+        Crypt(\$str, $lastFetched) if $cryptString;
+    } elsif ($delim eq '<') {   # hex string
+        # decode hex data
+        $str =~ tr/0-9A-Fa-f//dc;
+        $str .= '0' if length($str) & 0x01; # (by the spec)
+        $str = pack('H*', $str);
+        Crypt(\$str, $lastFetched) if $cryptString;
+    } elsif ($delim eq '/') {   # name
+        $str = substr($str, 1);
+        # convert escape codes (PDF 1.2 or later)
+        $str =~ s/#([0-9a-f]{2})/chr(hex($1))/sgei if $pdfVer >= 1.2;
+    }
+    return $str;
+}
+
+#------------------------------------------------------------------------------
+# Extract PDF object from combination of buffered data and file
+# Inputs: 0) ExifTool object reference, 1) data reference,
+#         2) optional raf reference, 3) optional xref table
+# Returns: converted PDF object or undef on error
+#          a) dictionary object --> hash reference
+#          b) array object --> array reference
+#          c) indirect reference --> scalar reference
+#          d) string, name, integer, boolean, null --> scalar value
+# - updates $$dataPt on return to contain unused data
+# - creates two bogus entries ('_stream' and '_tags') in dictionaries to represent
+#   the stream data and a list of the tags (not including '_stream' and '_tags')
+#   in their original order
+sub ExtractObject($$;$$)
+{
+    my ($exifTool, $dataPt, $raf, $xref) = @_;
+    my (@tags, $data, $objData);
+    my $dict = { };
+    my $delim;
+
+    for (;;) {
+        if ($$dataPt =~ /^\s*(<{1,2}|\[|\()/s) {
+            $delim = $1;
+            $$dataPt =~ s/^\s+//;   # remove leading white space
+            $objData = ReadToNested($dataPt, $raf);
+            return undef unless defined $objData;
+            last;
+        } elsif ($$dataPt =~ s{^\s*(\S[^[(/<>\s]*)\s*}{}s) {
+#
+# extract boolean, numerical, string, name, null object or indirect reference
+#
+            $objData = $1;
+            # look for an indirect reference
+            if ($objData =~ /^\d+$/ and $$dataPt =~ s/^(\d+)\s+R//s) {
+                $objData .= "$1 R";
+                $objData = \$objData;   # return scalar reference
+            }
+            return $objData;    # return simple scalar or scalar reference
+        }
+        $raf and $raf->ReadLine($data) or return undef;
+        $$dataPt .= $data;
+    }
+#
+# return literal string or hex string without parsing
+#
+    if ($delim eq '(' or $delim eq '<') {
+        return $objData;
+#
+# extract array
+#
+    } elsif ($delim eq '[') {
+        $objData =~ /.*?\[(.*)\]/s or return undef;
+        my $data = $1;    # brackets removed
+        my @list;
+        for (;;) {
+            last unless $data =~ m{\s*(\S[^[(/<>\s]*)}sg;
+            my $val = $1;
+            if ($val =~ /^(<{1,2}|\[|\()/) {
+                my $pos = pos($data) - length($val);
+                # nested dict, array, literal string or hex string
+                my $buff = substr($data, $pos);
+                $val = ReadToNested(\$buff);
+                last unless defined $val;
+                pos($data) = $pos + length($val);
+                $val = ExtractObject($exifTool, \$val);
+            } elsif ($val =~ /^\d/) {
+                my $pos = pos($data);
+                if ($data =~ /\G\s+(\d+)\s+R/g) {
+                    $val = \ "$val $1 R";   # make a reference
+                } else {
+                    pos($data) = $pos;
+                }
+            }
+            push @list, $val;
+        }
+        return \@list;
+    }
+#
+# extract dictionary
+#
+    # Note: entries are not necessarily separated by whitespace (doh!)
+    # ie) "/Tag/Name", "/Tag(string)", "/Tag[array]", etc are legal!
+    # Also, they may be separated by a comment (ie. "/Tag%comment\nValue"),
+    # but comments have already been removed
+    while ($objData =~ m{(\s*)/([^/[\]()<>{}\s]+)\s*(\S[^[(/<>\s]*)}sg) {
+        my $tag = $2;
+        my $val = $3;
+        if ($val =~ /^(<{1,2}|\[|\()/) {
+            # nested dict, array, literal string or hex string
+            $objData = substr($objData, pos($objData)-length($val));
+            $val = ReadToNested(\$objData, $raf);
+            last unless defined $val;
+            $val = ExtractObject($exifTool, \$val);
+            pos($objData) = 0;
+        } elsif ($val =~ /^\d/) {
+            my $pos = pos($objData);
+            if ($objData =~ /\G\s+(\d+)\s+R/sg) {
+                $val = \ "$val $1 R";   # make a reference
+            } else {
+                pos($objData) = $pos;
+            }
+        }
+        if ($$dict{$tag}) {
+            # duplicate dictionary entries are not allowed
+            $exifTool->Warn('Duplicate $tag entry in dictionary (ignored)');
+        } else {
+            # save the entry
+            push @tags, $tag;
+            $$dict{$tag} = $val;
+        }
+    }
+    return undef unless @tags;
+    $$dict{_tags} = \@tags;
+    return $dict unless $raf;   # direct objects can not have streams
+#
+# extract the stream object
+#
+    # dictionary must specify stream Length
+    my $length = $$dict{Length} or return $dict;
+    if (ref $length) {
+        $length = $$length;
+        my $oldpos = $raf->Tell();
+        # get the location of the object specifying the length
+        # (compressed objects are not allowed)
+        my $offset = LocateObject($xref, $length) or return $dict;
+        $offset or $exifTool->Warn('Bad Length object'), return $dict;
+        $raf->Seek($offset, 0) or $exifTool->Warn('Bad Length offset'), return $dict;
+        # verify that we are reading the expected object
+        $raf->ReadLine($data) or $exifTool->Warn('Error reading Length data'), return $dict;
+        $length =~ s/R/obj/;
+        unless ($data =~ /^$length/) {
+            $exifTool->Warn("Length object ($length) not found at $offset");
+            return $dict;
+        }
+        $raf->ReadLine($data) or $exifTool->Warn('Error reading stream Length'), return $dict;
+        $data =~ /(\d+)/ or $exifTool->Warn('Stream length not found'), return $dict;
+        $length = $1;
+        $raf->Seek($oldpos, 0); # restore position to start of stream
+    }
+    # extract the trailing stream data
+    for (;;) {
+        # find the stream token
+        if ($$dataPt =~ /(\S+)/) {
+            last unless $1 eq 'stream';
+            # read an extra line because it may contain our \x0a
+            $$dataPt .= $data if $raf->ReadLine($data);
+            # remove our stream header
+            $$dataPt =~ s/^\s*stream(\x0a|\x0d\x0a)//s;
+            my $more = $length - length($$dataPt);
+            if ($more > 0) {
+                unless ($raf->Read($data, $more) == $more) {
+                    $exifTool->Warn('Error reading stream data');
+                    $$dataPt = '';
+                    return $dict;
+                }
+                $$dict{_stream} = $$dataPt . $data;
+                $$dataPt = '';
+            } elsif ($more < 0) {
+                $$dict{_stream} = substr($$dataPt, 0, $length);
+                $$dataPt = substr($$dataPt, $length);
+            } else {
+                $$dict{_stream} = $$dataPt;
+                $$dataPt = '';
+            }
+            last;
+        }
+        $raf->ReadLine($data) or last;
+        $$dataPt .= $data;
+    }
+    return $dict;
+}
+
+#------------------------------------------------------------------------------
+# Read to nested delimiter
+# Inputs: 0) data reference, 1) optional raf reference
+# Returns: data up to and including matching delimiter (or undef on error)
+# - updates data reference with trailing data
+# - unescapes characters in literal strings
+my %closingDelim = (    # lookup for matching delimiter
+    '(' => ')',
+    '[' => ']',
+    '<' => '>',
+   '<<' => '>>',
+);
+sub ReadToNested($;$)
+{
+    my ($dataPt, $raf) = @_;
+    my @delim = ('');   # closing delimiter list, most deeply nested first
+    pos($$dataPt) = 0;  # begin at start of data
+    for (;;) {
+        unless ($$dataPt =~ /(\\*)(\(|\)|<{1,2}|>{1,2}|\[|\]|%)/g) {
+            # must read some more data
+            my $buff;
+            last unless $raf and $raf->ReadLine($buff);
+            $$dataPt .= $buff;
+            pos($$dataPt) = length($$dataPt) - length($buff);
+            next;
+        }
+        # are we in a literal string?
+        if ($delim[0] eq ')') {
+            # ignore escaped delimiters (preceeded by odd number of \'s)
+            next if length($1) & 0x01;
+            # ignore all delimiters but unescaped braces
+            next unless $2 eq '(' or $2 eq ')';
+        } elsif ($2 eq '%') {
+            # ignore the comment
+            my $pos = pos($$dataPt) - 1;
+            # remove everything from '%' up to but not including newline
+            $$dataPt =~ /.*/g;
+            my $end = pos($$dataPt);
+            $$dataPt = substr($$dataPt, 0, $pos) . substr($$dataPt, $end);
+            pos($$dataPt) = $pos;
+            next;
+        }
+        if ($closingDelim{$2}) {
+            # push the corresponding closing delimiter
+            unshift @delim, $closingDelim{$2};
+            next;
+        }
+        unless ($2 eq $delim[0]) {
+            # handle the case where we find a ">>>" and interpret it
+            # as ">> >" instead of "> >>"
+            next unless $2 eq '>>' and $delim[0] eq '>';
+            pos($$dataPt) = pos($$dataPt) - 1;
+        }
+        shift @delim;               # remove from nesting list
+        next if $delim[0];          # keep going if we have more nested delimiters
+        my $pos = pos($$dataPt);
+        my $buff = substr($$dataPt, 0, $pos);
+        $$dataPt = substr($$dataPt, $pos);
+        return $buff;   # success!
+    }
+    return undef;   # didn't find matching delimiter
+}
+
+#------------------------------------------------------------------------------
+# Decode filtered stream
+# Inputs: 0) ExifTool object reference, 1) dictionary reference
+# Returns: true if stream has been decoded OK
+sub DecodeStream($$)
+{
+    my ($exifTool, $dict) = @_;
+
+    return 0 unless $$dict{_stream}; # no stream to decode
+
+    # get list of filters
+    my (@filters, @decodeParms, $filter);
+    if (ref $$dict{Filter} eq 'ARRAY') {
+        @filters = @{$$dict{Filter}};
+    } elsif (defined $$dict{Filter}) {
+        @filters = ($$dict{Filter});
+    }
+    # apply decryption first if required (and if the default encryption
+    # has not been overridden by a Crypt filter. Note: the Crypt filter
+    # must be first in the Filter array: ref 3, page 38)
+    unless (defined $$dict{_decrypted} or ($filters[0] and $filters[0] eq '/Crypt')) {
+        CryptStream($dict, $lastFetched);
+    }
+    return 1 unless $$dict{Filter};         # Filter entry is mandatory
+    return 0 if defined $$dict{_filtered};  # avoid double-filtering
+    $$dict{_filtered} = 1;                  # set flag to prevent double-filtering
+
+    # get array of DecodeParms dictionaries
+    if (ref $$dict{DecodeParms} eq 'ARRAY') {
+        @decodeParms = @{$$dict{DecodeParms}};
+    } else {
+        @decodeParms = ($$dict{DecodeParms});
+    }
+    foreach $filter (@filters) {
+        my $decodeParms = shift @decodeParms;
+
+        if ($filter eq '/FlateDecode') {
+            if (eval 'require Compress::Zlib') {
+                my $inflate = Compress::Zlib::inflateInit();
+                my ($buff, $stat);
+                $inflate and ($buff, $stat) = $inflate->inflate($$dict{_stream});
+                if ($inflate and $stat == Compress::Zlib::Z_STREAM_END()) {
+                    $$dict{_stream} = $buff;
+                } else {
+                    $exifTool->Warn('Error inflating stream');
+                    return 0;
+                }
+            } else {
+                $exifTool->WarnOnce('Install Compress::Zlib to process filtered streams');
+                return 0;
+            }
+            # apply anti-predictor if necessary
+            next unless ref $decodeParms eq 'HASH';
+            my $pre = $$decodeParms{Predictor};
+            next unless $pre and $pre != 1;
+            if ($pre != 12) {
+                # currently only support 'up' prediction
+                $exifTool->WarnOnce("FlateDecode Predictor $pre not currently supported");
+                return 0;
+            }
+            my $cols = $$decodeParms{Columns};
+            unless ($cols) {
+                # currently only support 'up' prediction
+                $exifTool->WarnOnce('No Columns for decoding stream');
+                return 0;
+            }
+            my @bytes = unpack('C*', $$dict{_stream});
+            my @pre = (0) x $cols;  # initialize predictor array
+            my $buff = '';
+            while (@bytes > $cols) {
+                unless (($_ = shift @bytes) == 2) {
+                    $exifTool->WarnOnce("Unsupported PNG filter $_"); # (yes, PNG)
+                    return 0;
+                }
+                foreach (@pre) {
+                    $_ = ($_ + shift(@bytes)) & 0xff;
+                }
+                $buff .= pack('C*', @pre);
+            }
+            $$dict{_stream} = $buff;
+
+        } elsif ($filter eq '/Crypt') {
+
+            # (we shouldn't have to check the _decrypted flag since we
+            #  already checked the _filtered flag, but what the heck...)
+            next if defined $$dict{_decrypted};
+            # assume Identity filter (the default) if DecodeParms are missing
+            next unless ref $decodeParms eq 'HASH';
+            my $name = $$decodeParms{Name};
+            next unless defined $name or $name eq 'Identity';
+            if ($name ne 'StdCF') {
+                $exifTool->WarnOnce("Unsupported Crypt Filter $name");
+                return 0;
+            }
+            unless ($cryptInfo) {
+                $exifTool->WarnOnce('Missing Encrypt StdCF entry');
+                return 0;
+            }
+            # decrypt the stream manually because we want to:
+            # 1) ignore $cryptStream (StmF) setting
+            # 2) ignore EncryptMetadata setting (I can't find mention of how to
+            #    reconcile this in the spec., but this would make sense)
+            # 3) avoid adding the crypt key extension (ref 3, page 58, Algorithm 1b)
+            # 4) set _decrypted flag so we will recrypt according to StmF when
+            #    writing (since we don't yet write Filter'd streams)
+            Crypt(\$$dict{_stream}, 'none');
+            $$dict{_decrypted} = ($cryptStream ? 1 : 0);
+
+        } elsif ($filter ne '/Identity') {
+
+            $exifTool->WarnOnce("Unsupported Filter $filter");
+            return 0;
+        }
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Initialize state for RC4 en/decryption (ref 2)
+# Inputs: 0) RC4 key string
+# Returns: RC4 key hash reference
+sub RC4Init($)
+{
+    my @key = unpack('C*', shift);
+    my @state = (0 .. 255);
+    my ($i, $j) = (0, 0);
+    while ($i < 256) {
+        my $st = $state[$i];
+        $j = ($j + $st + $key[$i % scalar(@key)]) & 0xff;
+        $state[$i++] = $state[$j];
+        $state[$j] = $st;
+    }
+    return { State => \@state, XY => [ 0, 0 ] };
+}
+
+#------------------------------------------------------------------------------
+# Apply RC4 en/decryption (ref 2)
+# Inputs: 0) data reference, 1) RC4 key hash reference or RC4 key string
+# - can call this method directly with a key string, or with with the key
+#   reference returned by RC4Init
+# - RC4 is a symmetric algorithm, so encryption is the same as decryption
+sub RC4Crypt($$)
+{
+    my ($dataPt, $key) = @_;
+    $key = RC4Init($key) unless ref $key eq 'HASH';
+    my $state = $$key{State};
+    my ($x, $y) = @{$$key{XY}};
+
+    my @data = unpack('C*', $$dataPt);
+    foreach (@data) {
+         $x = ($x + 1) & 0xff;
+         my $stx = $$state[$x];
+         $y = ($stx + $y) & 0xff;
+         my $sty = $$state[$x] = $$state[$y];
+         $$state[$y] = $stx;
+         $_ ^= $$state[($stx + $sty) & 0xff];
+     }
+     $$key{XY} = [ $x, $y ];
+     $$dataPt = pack('C*', @data);
+}
+
+#------------------------------------------------------------------------------
+# Initialize decryption
+# Inputs: 0) ExifTool object reference, 1) Encrypt dictionary reference,
+#         2) ID from file trailer dictionary
+# Returns: error string or undef on success (and sets $cryptInfo)
+sub DecryptInit($$$)
+{
+    local $_;
+    my ($exifTool, $encrypt, $id) = @_;
+
+    undef $cryptInfo;
+    unless ($encrypt and ref $encrypt eq 'HASH') {
+        return 'Error loading Encrypt object';
+    }
+    my $filt = $$encrypt{Filter};
+    unless ($filt and $filt =~ s/^\///) {
+        return 'Encrypt dictionary has no Filter!';
+    }
+    # extract some interesting tags
+    my $ver = $$encrypt{V} || 0;
+    my $rev = $$encrypt{R} || 0;
+    my $enc = "$filt V$ver";
+    $enc .= ".$rev" if $filt eq 'Standard';
+    $enc .= " ($1)" if $$encrypt{SubFilter} and $$encrypt{SubFilter} =~ /^\/(.*)/;
+    $enc .= ' (' . ($$encrypt{Length} || 40) . '-bit)' if $filt eq 'Standard';
+    my $tagTablePtr = GetTagTable('Image::ExifTool::PDF::Encrypt');
+    $exifTool->HandleTag($tagTablePtr, 'Filter', $enc);
+    if ($filt ne 'Standard') {
+        return "Encryption filter $filt not currently supported";
+    } elsif (not defined $$encrypt{R}) {
+        return 'Standard security handler missing revision';
+    }
+    unless ($$encrypt{O} and $$encrypt{P} and $$encrypt{U}) {
+        return 'Incomplete Encrypt specification';
+    }
+    $exifTool->HandleTag($tagTablePtr, 'P', $$encrypt{P});
+
+    my %parm;   # optional parameters extracted from Encrypt dictionary
+
+    if ($ver == 1 or $ver == 2) {
+        $cryptString = $cryptStream = 1;
+    } elsif ($ver == 4 or $ver == 5) {
+        # initialize our $cryptString and $cryptStream flags
+        foreach ('StrF', 'StmF') {
+            my $flagPt = $_ eq 'StrF' ? \$cryptString : \$cryptStream;
+            $$flagPt = $$encrypt{$_};
+            undef $$flagPt if $$flagPt and $$flagPt eq '/Identity';
+            return "Unsupported $_ encryption $$flagPt" if $$flagPt and $$flagPt ne '/StdCF';
+        }
+        if ($cryptString or $cryptStream) {
+            return 'Missing or invalid Encrypt StdCF entry' unless ref $$encrypt{CF} eq 'HASH' and
+                ref $$encrypt{CF}{StdCF} eq 'HASH' and $$encrypt{CF}{StdCF}{CFM};
+            my $cryptMeth = $$encrypt{CF}{StdCF}{CFM};
+            unless ($cryptMeth =~ /^\/(V2|AESV2|AESV3)$/) {
+                return "Unsupported encryption method $cryptMeth";
+            }
+            # set "_aesv2" or "_aesv3" flag in %$encrypt hash if AES encryption was used
+            $$encrypt{'_' . lc($1)} = 1 if $cryptMeth =~ /^\/(AESV2|AESV3)$/;
+        }
+        if ($ver == 5) {
+            # validate OE and UE entries
+            foreach ('OE', 'UE') {
+                return "Missing Encrypt $_ entry" unless $$encrypt{$_};
+                $parm{$_} = ReadPDFValue($$encrypt{$_});
+                return "Invalid Encrypt $_ entry" unless length $parm{$_} == 32;
+            }
+            require Image::ExifTool::AES;   # will need this later
+        }
+    } else {
+        return "Encryption version $ver not currently supported";
+    }
+    $id or return "Can't decrypt (no document ID)";
+
+    # make sure we have the necessary libraries available
+    if ($ver < 5) {
+        unless (eval 'require Digest::MD5') {
+            return "Install Digest::MD5 to process encrypted PDF";
+        }
+    } else {
+        unless (eval 'require Digest::SHA') {
+            return "Install Digest::SHA to process AES-256 encrypted PDF";
+        }
+    }
+
+    # calculate file-level en/decryption key
+    my $pad = "\x28\xBF\x4E\x5E\x4E\x75\x8A\x41\x64\x00\x4E\x56\xFF\xFA\x01\x08".
+              "\x2E\x2E\x00\xB6\xD0\x68\x3E\x80\x2F\x0C\xA9\xFE\x64\x53\x69\x7A";
+    my $o = ReadPDFValue($$encrypt{O});
+    my $u = ReadPDFValue($$encrypt{U});
+
+    # set flag indicating whether metadata is encrypted
+    # (in version 4 and higher, metadata streams may not be encrypted)
+    if ($ver < 4 or not $$encrypt{EncryptMetadata} or $$encrypt{EncryptMetadata} !~ /false/i) {
+        $$encrypt{_meta} = 1;
+    }
+    # try no password first, then try provided password if available
+    my ($try, $key);
+    for ($try=0; ; ++$try) {
+        my $password;
+        if ($try == 0) {
+            $password = '';
+        } elsif ($try == 1) {
+            $password = $exifTool->Options('Password');
+            return 'Document is password protected (use Password option)' unless defined $password;
+            # make sure there is no UTF-8 flag on the password
+            if ($] >= 5.006 and (eval 'require Encode; Encode::is_utf8($password)' or $@)) {
+                # repack by hand if Encode isn't available
+                $password = $@ ? pack('C*',unpack('U0C*',$password)) : Encode::encode('utf8',$password);
+            }
+        } else {
+            return 'Incorrect password';
+        }
+        if ($ver < 5) {
+            if (length $password) {
+                # password must be encoding in PDFDocEncoding (ref iso32000)
+                $password = $exifTool->Encode($password, 'PDFDoc');
+                # truncate or pad the password to exactly 32 bytes
+                if (length($password) > 32) {
+                    $password = substr($password, 0, 32);
+                } elsif (length($password) < 32) {
+                    $password .= substr($pad, 0, 32-length($password));
+                }
+            } else {
+                $password = $pad;
+            }
+            $key = $password . $o . pack('V', $$encrypt{P}) . $id;
+            my $rep = 1;
+            if ($rev == 3 or $rev == 4) {
+                # must add this if metadata not encrypted
+                $key .= "\xff\xff\xff\xff" unless $$encrypt{_meta};
+                $rep += 50; # repeat MD5 50 more times if revision is 3 or greater
+            }
+            my ($len, $i, $dat);
+            if ($ver == 1) {
+                $len = 5;
+            } else {
+                $len = $$encrypt{Length} || 40;
+                $len >= 40 or return 'Bad Encrypt Length';
+                $len = int($len / 8);
+            }
+            for ($i=0; $i<$rep; ++$i) {
+                $key = substr(Digest::MD5::md5($key), 0, $len);
+            }
+            # decrypt U to see if a user password is required
+            if ($rev >= 3) {
+                $dat = Digest::MD5::md5($pad . $id);
+                RC4Crypt(\$dat, $key);
+                for ($i=1; $i<=19; ++$i) {
+                    my @key = unpack('C*', $key);
+                    foreach (@key) { $_ ^= $i; }
+                    RC4Crypt(\$dat, pack('C*', @key));
+                }
+                $dat .= substr($u, 16);
+            } else {
+                $dat = $pad;
+                RC4Crypt(\$dat, $key);
+            }
+            last if $dat eq $u; # all done if this was the correct key
+        } else {
+            return 'Invalid O or U Encrypt entries' if length($o) < 48 or length($u) < 48;
+            if (length $password) {
+                # Note: this should be good for passwords containing reasonable characters,
+                # but to be bullet-proof we need to apply the SASLprep (IETF RFC 4013) profile
+                # of stringprep (IETF RFC 3454) to the password before encoding in UTF-8
+                $password = $exifTool->Encode($password, 'UTF8');
+                $password = substr($password, 0, 127) if length($password) > 127;
+            }
+            # test for the owner password
+            my $sha = Digest::SHA::sha256($password, substr($o,32,8), substr($u,0,48));
+            if ($sha eq substr($o, 0, 32)) {
+                $key = Digest::SHA::sha256($password, substr($o,40,8), substr($u,0,48));
+                my $dat = ("\0" x 16) . $parm{OE};
+                # decrypt with no padding
+                my $err = Image::ExifTool::AES::Crypt(\$dat, $key, 0, 1);
+                return $err if $err;
+                $key = $dat;    # use this as the file decryption key
+                last;
+            }
+            # test for the user password
+            $sha = Digest::SHA::sha256($password, substr($u,32,8));
+            if ($sha eq substr($u, 0, 32)) {
+                $key = Digest::SHA::sha256($password, substr($u,40,8));
+                my $dat = ("\0" x 16) . $parm{UE};
+                my $err = Image::ExifTool::AES::Crypt(\$dat, $key, 0, 1);
+                return $err if $err;
+                $key = $dat;    # use this as the file decryption key
+                last;
+            }
+        }
+    }
+    $$encrypt{_key} = $key; # save the file-level encryption key
+    $cryptInfo = $encrypt;  # save reference to the file-level Encrypt object
+    return undef;           # success!
+}
+
+#------------------------------------------------------------------------------
+# Decrypt/Encrypt data
+# Inputs: 0) data ref
+#         1) PDF object reference to use as crypt key extension (may be 'none' to
+#            avoid extending the encryption key, as for streams with Crypt Filter)
+#         2) encrypt flag (false for decryption)
+sub Crypt($$;$)
+{
+    return unless $cryptInfo;
+    my ($dataPt, $keyExt, $encrypt) = @_;
+    # do not decrypt if the key extension object is undefined
+    # (this doubles as a flag to disable decryption/encryption)
+    return unless defined $keyExt;
+    my $key = $$cryptInfo{_key};
+    # apply the necessary crypt key extension
+    unless ($$cryptInfo{_aesv3}) {
+        unless ($keyExt eq 'none') {
+            # extend crypt key using object and generation number
+            unless ($keyExt =~ /^(I\d+ )?(\d+) (\d+)/) {
+                $$cryptInfo{_error} = 'Invalid object reference for encryption';
+                return;
+            }
+            $key .= substr(pack('V', $2), 0, 3) . substr(pack('V', $3), 0, 2);
+        }
+        # add AES-128 salt if necessary (this little gem is conveniently
+        # omitted from the Adobe PDF 1.6 documentation, causing me to
+        # waste 12 hours trying to figure out why this wasn't working --
+        # it appears in ISO32000 though, so I should have been using that)
+        $key .= 'sAlT' if $$cryptInfo{_aesv2};
+        my $len = length($key);
+        $key = Digest::MD5::md5($key);              # get 16-byte MD5 digest
+        $key = substr($key, 0, $len) if $len < 16;  # trim if necessary
+    }
+    # perform the decryption/encryption
+    if ($$cryptInfo{_aesv2} or $$cryptInfo{_aesv3}) {
+        require Image::ExifTool::AES;
+        my $err = Image::ExifTool::AES::Crypt($dataPt, $key, $encrypt);
+        $err and $$cryptInfo{_error} = $err;
+    } else {
+        RC4Crypt($dataPt, $key);
+    }
+}
+
+#------------------------------------------------------------------------------
+# Decrypt/Encrypt stream data
+# Inputs: 0) dictionary ref, 1) PDF object reference to use as crypt key extension
+sub CryptStream($$)
+{
+    return unless $cryptStream;
+    my ($dict, $keyExt) = @_;
+    my $type = $$dict{Type} || '';
+    # XRef streams are not encrypted (ref 3, page 50),
+    # and Metadata may or may not be encrypted
+    if ($cryptInfo and $type ne '/XRef' and
+        ($$cryptInfo{_meta} or $type ne '/Metadata'))
+    {
+        Crypt(\$$dict{_stream}, $keyExt, $$dict{_decrypted});
+        # toggle _decrypted flag
+        $$dict{_decrypted} = ($$dict{_decrypted} ? undef : 1);
+    } else {
+        $$dict{_decrypted} = 0; # stream should never be encrypted
+    }
+}
+
+#------------------------------------------------------------------------------
+# Generate a new PDF tag (based on its ID) and add it to a tag table
+# Inputs: 0) tag table ref, 1) tag ID
+# Returns: tag info ref
+sub NewPDFTag($$)
+{
+    my ($tagTablePtr, $tag) = @_;
+    my $name = $tag;
+    # translate URL-like escape sequences
+    $name =~ s/#([0-9a-f]{2})/chr(hex($1))/ige;
+    $name =~ s/[^-\w]+/_/g;         # translate invalid characters to an underline
+    $name =~ s/(^|_)([a-z])/\U$2/g; # start words with upper case
+    my $tagInfo = { Name => $name };
+    Image::ExifTool::AddTagToTable($tagTablePtr, $tag, $tagInfo);
+    return $tagInfo;
+}
+
+#------------------------------------------------------------------------------
+# Process PDF dictionary extract tag values
+# Inputs: 0) ExifTool object reference, 1) tag table reference
+#         2) dictionary reference, 3) cross-reference table reference,
+#         4) nesting depth, 5) dictionary capture type
+sub ProcessDict($$$$;$$)
+{
+    my ($exifTool, $tagTablePtr, $dict, $xref, $nesting, $type) = @_;
+    my $verbose = $exifTool->Options('Verbose');
+    my $unknown = $$tagTablePtr{EXTRACT_UNKNOWN};
+    my $embedded = (defined $unknown and not $unknown and $exifTool->Options('ExtractEmbedded'));
+    my @tags = @{$$dict{_tags}};
+    my ($next, %join);
+    my $index = 0;
+
+    $nesting = ($nesting || 0) + 1;
+    if ($nesting > 50) {
+        $exifTool->WarnOnce('Nesting too deep (directory ignored)');
+        return;
+    }
+    # save entire dictionary for rewriting if specified
+    if ($$exifTool{PDF_CAPTURE} and $$tagTablePtr{VARS} and
+        $tagTablePtr->{VARS}->{CAPTURE})
+    {
+        my $name;
+        foreach $name (@{$tagTablePtr->{VARS}->{CAPTURE}}) {
+            next if $exifTool->{PDF_CAPTURE}->{$name};
+            # make sure we load the right type if indicated
+            next if $type and $type ne $name;
+            $exifTool->{PDF_CAPTURE}->{$name} = $dict;
+            last;
+        }
+    }
+#
+# extract information from all tags in the dictionary
+#
+    for (;;) {
+        my ($tag, $tagInfo);
+        if (@tags) {
+            $tag = shift @tags;
+        } elsif (defined $next and not $next) {
+            $tag = 'Next';
+            $next = 1;
+        } else {
+            last;
+        }
+        my $val = $$dict{$tag};
+        if ($$tagTablePtr{$tag}) {
+            $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+            undef $tagInfo if $$tagInfo{NoProcess};
+        } elsif ($embedded and $tag =~ /^(.*?)(\d+)$/ and
+            $$tagTablePtr{$1} and ref $val eq 'SCALAR' and not $fetched{$$val})
+        {
+            my ($name, $num) = ($1, $2);
+            $join{$name} = [] unless $join{$name};
+            $fetched{$$val} = 1;
+            my $obj = FetchObject($exifTool, $$val, $xref, $tag);
+            next unless ref $obj eq 'HASH' and $$obj{_stream};
+            # save all the stream data to join later
+            $join{$name}->[$num] = $$obj{_stream};
+        }
+        if ($verbose) {
+            my ($val2, $extra);
+            if (ref $val eq 'SCALAR') {
+                $extra = ", indirect object ($$val)";
+                if ($fetched{$$val}) {
+                    $val2 = "ref($$val)";
+                } elsif ($tag eq 'Next' and not $next) {
+                    # handle 'Next' links after all others
+                    $next = 0;
+                    next;
+                } else {
+                    $fetched{$$val} = 1;
+                    $val = FetchObject($exifTool, $$val, $xref, $tag);
+                    unless (defined $val) {
+                        my $str;
+                        if (defined $lastOffset) {
+                            $val2 = '<free>';
+                            $str = 'Object was freed';
+                        } else {
+                            $val2 = '<err>';
+                            $str = 'Error reading object';
+                        }
+                        $exifTool->VPrint(0, "$$exifTool{INDENT}${str}:\n");
+                    }
+                }
+            } elsif (ref $val eq 'HASH') {
+                $extra = ', direct dictionary';
+            } elsif (ref $val eq 'ARRAY') {
+                $extra = ', direct array of ' . scalar(@$val) . ' objects';
+            } else {
+                $extra = ', direct object';
+            }
+            my $isSubdir;
+            if (ref $val eq 'HASH') {
+                $isSubdir = 1;
+            } elsif (ref $val eq 'ARRAY') {
+                # recurse into objects in arrays only if they are lists of
+                # dictionaries or indirect objects which could be dictionaries
+                $isSubdir = 1 if @$val;
+                foreach (@$val) {
+                    next if ref $_ eq 'HASH' or ref $_ eq 'SCALAR';
+                    undef $isSubdir;
+                    last;
+                }
+            }
+            if ($isSubdir) {
+                # create bogus subdirectory to recurse into this dict
+                $tagInfo or $tagInfo = {
+                    Name => $tag,
+                    SubDirectory => {
+                        TagTable => 'Image::ExifTool::PDF::Unknown',
+                    },
+                };
+            } else {
+                if (ref $val eq 'ARRAY') {
+                    my @list = @$val;
+                    foreach (@list) {
+                        $_ = "ref($$_)" if ref $_ eq 'SCALAR';
+                    }
+                    $val2 = '[' . join(',',@list) . ']';
+                }
+                # generate tag info if we will use it later
+                if (not $tagInfo and defined $val and $unknown) {
+                    $tagInfo = NewPDFTag($tagTablePtr, $tag);
+                }
+            }
+            $exifTool->VerboseInfo($tag, $tagInfo,
+                Value => $val2 || $val,
+                Extra => $extra,
+                Index => $index++,
+            );
+            next unless defined $val;
+        }
+        unless ($tagInfo) {
+            # add any tag found in Info directory to table
+            next unless $unknown;
+            $tagInfo = NewPDFTag($tagTablePtr, $tag);
+        }
+        unless ($$tagInfo{SubDirectory}) {
+            # fetch object if necessary
+            # (OS X 10.6 writes indirect objects in the Info dictionary!)
+            if (ref $val eq 'SCALAR') {
+                my $prevFetched = $lastFetched;
+                # (note: fetching the same object multiple times is OK here)
+                $val = FetchObject($exifTool, $$val, $xref, $tag);
+                next unless defined $val;
+                $val = ReadPDFValue($val);
+                # set flag to re-encrypt if necessary if rewritten
+                $$dict{_needCrypt}{$tag} = ($lastFetched ? 0 : 1) if $cryptString;
+                $lastFetched = $prevFetched; # restore last fetched object reference
+            } else {
+                $val = ReadPDFValue($val);
+            }
+            my $format = $$tagInfo{Format} || $$tagInfo{Writable} || 'string';
+            $val = ConvertPDFDate($val) if $format eq 'date';
+            # convert from UTF-16 (big endian) to UTF-8 or Latin if necessary
+            # unless this is binary data (hex-encoded strings would not have been converted)
+            if (ref $val) {
+                next if ref $val ne 'ARRAY';
+                my $v;
+                foreach $v (@$val) {
+                    $exifTool->FoundTag($tagInfo, $v);
+                }
+            } else {
+                if (not $$tagInfo{Binary} and $val =~ /[\x18-\x1f\x80-\xff]/) {
+                    # text string is already in Unicode if it starts with "\xfe\xff",
+                    # otherwise we must first convert from PDFDocEncoding
+                    $val = $exifTool->Decode($val, ($val=~s/^\xfe\xff// ? 'UCS2' : 'PDFDoc'), 'MM');
+                }
+                if ($$tagInfo{List}) {
+                    # separate tokens in comma or whitespace delimited lists
+                    my @values = ($val =~ /,/) ? split /,+\s*/, $val : split ' ', $val;
+                    foreach $val (@values) {
+                        $exifTool->FoundTag($tagInfo, $val);
+                    }
+                } else {
+                    # a simple tag value
+                    $exifTool->FoundTag($tagInfo, $val);
+                }
+            }
+            next;
+        }
+        # process the subdirectory
+        my @subDicts;
+        if (ref $val eq 'ARRAY') {
+            @subDicts = @{$val};
+        } else {
+            @subDicts = ( $val );
+        }
+        # loop through all values of this tag
+        for (;;) {
+            my $subDict = shift @subDicts or last;
+            # save last fetched object in case we fetch another one here
+            my $prevFetched = $lastFetched;
+            if (ref $subDict eq 'SCALAR') {
+                # only fetch once (other copies are obsolete)
+                next if $fetched{$$subDict};
+                # load dictionary via an indirect reference
+                $fetched{$$subDict} = 1;
+                my $obj = FetchObject($exifTool, $$subDict, $xref, $tag);
+                unless (defined $obj) {
+                    unless (defined $lastOffset) {
+                        $exifTool->Warn("Error reading $tag object ($$subDict)");
+                    }
+                    next;
+                }
+                $subDict = $obj;
+            }
+            if (ref $subDict eq 'ARRAY') {
+                # convert array of key/value pairs to a hash
+                next if @$subDict < 2;
+                my %hash = ( _tags => [] );
+                while (@$subDict >= 2) {
+                    my $key = shift @$subDict;
+                    $key =~ s/^\///;
+                    push @{$hash{_tags}}, $key;
+                    $hash{$key} = shift @$subDict;
+                }
+                $subDict = \%hash;
+            } else {
+                next unless ref $subDict eq 'HASH';
+            }
+            # set flag to re-crypt all strings when rewriting if the dictionary
+            # came from an encrypted stream
+            $$subDict{_needCrypt}{'*'} = 1 unless $lastFetched;
+            my $subTablePtr = GetTagTable($tagInfo->{SubDirectory}->{TagTable});
+            if (not $verbose) {
+                my $proc = $$subTablePtr{PROCESS_PROC} || \&ProcessDict;
+                &$proc($exifTool, $subTablePtr, $subDict, $xref, $nesting);
+            } elsif ($next) {
+                # handle 'Next' links at this level to avoid deep recursion
+                undef $next;
+                $index = 0;
+                $tagTablePtr = $subTablePtr;
+                $dict = $subDict;
+                @tags = @{$$subDict{_tags}};
+                $exifTool->VerboseDir($tag, scalar(@tags));
+            } else {
+                my $oldIndent = $exifTool->{INDENT};
+                my $oldDir = $exifTool->{DIR_NAME};
+                $exifTool->{INDENT} .= '| ';
+                $exifTool->{DIR_NAME} = $tag;
+                $exifTool->VerboseDir($tag, scalar(@{$$subDict{_tags}}));
+                ProcessDict($exifTool, $subTablePtr, $subDict, $xref, $nesting);
+                $exifTool->{INDENT} = $oldIndent;
+                $exifTool->{DIR_NAME} = $oldDir;
+            }
+            $lastFetched = $prevFetched;
+        }
+    }
+#
+# extract information from joined streams if necessary
+#
+
+    if (%join) {
+        my ($tag, $i);
+        foreach $tag (sort keys %join) {
+            my $list = $join{$tag};
+            last unless defined $$list[1] and $$list[1] =~ /^%.*?([\x0d\x0a]*)/;
+            my $buff = "%!PS-Adobe-3.0$1";  # add PS header with same line break
+            for ($i=1; defined $$list[$i]; ++$i) {
+                $buff .= $$list[$i];
+                undef $$list[$i];   # free memory
+            }
+            $exifTool->HandleTag($tagTablePtr, $tag, $buff);
+        }
+    }
+#
+# extract information from stream object if it exists (ie. Metadata stream)
+#
+    return unless $$dict{_stream};
+    my $tag = '_stream';
+    # add Subtype (if it exists) to stream name and remove leading '/'
+    ($tag = $$dict{Subtype} . $tag) =~ s/^\/// if $$dict{Subtype};
+    return unless $$tagTablePtr{$tag};
+    my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+    # decode stream if necessary
+    DecodeStream($exifTool, $dict) or return;
+    # extract information from stream
+    my %dirInfo = (
+        DataPt   => \$$dict{_stream},
+        DataLen  => length $$dict{_stream},
+        DirStart => 0,
+        DirLen   => length $$dict{_stream},
+        Parent   => 'PDF',
+    );
+    my $subTablePtr = GetTagTable($tagInfo->{SubDirectory}->{TagTable});
+    unless ($exifTool->ProcessDirectory(\%dirInfo, $subTablePtr)) {
+        $exifTool->Warn("Error processing $$tagInfo{Name} information");
+    }
+}
+
+#------------------------------------------------------------------------------
+# Extract information from PDF file
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 0 if not a PDF file, 1 on success, otherwise a negative error number
+sub ReadPDF($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my $verbose = $exifTool->Options('Verbose');
+    my ($buff, $encrypt, $id);
+#
+# validate PDF file
+#
+    # (linearization dictionary must be in the first 1024 bytes of the file)
+    $raf->Read($buff, 1024) >= 8 or return 0;
+    $buff =~ /^%PDF-(\d+\.\d+)/ or return 0;
+    $pdfVer = $1;
+    $exifTool->SetFileType();   # set the FileType tag
+    $exifTool->Warn("May not be able to read a PDF version $pdfVer file") if $pdfVer >= 2.0;
+    # store PDFVersion tag
+    my $tagTablePtr = GetTagTable('Image::ExifTool::PDF::Root');
+    $exifTool->HandleTag($tagTablePtr, 'Version', $pdfVer);
+    $tagTablePtr = GetTagTable('Image::ExifTool::PDF::Main');
+#
+# check for a linearized PDF (only if reading)
+#
+    my $capture = $$exifTool{PDF_CAPTURE};
+    unless ($capture) {
+        my $lin = 'false';
+        if ($buff =~ /<</g) {
+            $buff = substr($buff, pos($buff) - 2);
+            my $dict = ExtractObject($exifTool, \$buff);
+            if (ref $dict eq 'HASH' and $$dict{Linearized} and $$dict{L}) {
+                if (not $$exifTool{VALUE}{FileSize}) {
+                    undef $lin; # can't determine if it is linearized
+                } elsif ($$dict{L} == $$exifTool{VALUE}{FileSize}) {
+                    $lin = 'true';
+                }
+            }
+        }
+        $exifTool->HandleTag($tagTablePtr, '_linearized', $lin) if $lin;
+    }
+#
+# read the xref tables referenced from startxref at the end of the file
+#
+    my @xrefOffsets;
+    $raf->Seek(0, 2) or return -2;
+    # the %%EOF must occur within the last 1024 bytes of the file (PDF spec, appendix H)
+    my $len = $raf->Tell();
+    $len = 1024 if $len > 1024;
+    $raf->Seek(-$len, 2) or return -2;
+    $raf->Read($buff, $len) == $len or return -3;
+    # find the last xref table in the file (may be multiple %%EOF marks)
+    $buff =~ /.*startxref *(\x0d\x0a|\x0d|\x0a)\s*?(\d+)\s+%%EOF/s or return -4;
+    local $/ = $1;    # set input record separator
+    push @xrefOffsets, $2, 'Main';
+    my (%xref, @mainDicts, %loaded, $mainFree);
+    # initialize variables to capture when rewriting
+    if ($capture) {
+        $capture->{startxref} = $2;
+        $capture->{xref} = \%xref;
+        $capture->{newline} = $/;
+        $capture->{mainFree} = $mainFree = { };
+    }
+    while (@xrefOffsets) {
+        my $offset = shift @xrefOffsets;
+        my $type = shift @xrefOffsets;
+        next if $loaded{$offset};   # avoid infinite recursion
+        unless ($raf->Seek($offset, 0)) {
+            %loaded or return -5;
+            $exifTool->Warn('Bad offset for secondary xref table');
+            next;
+        }
+        # Note: care must be taken because ReadLine may read more than we want if
+        # the newline sequence for this table is different than the rest of the file
+        unless ($raf->ReadLine($buff)) {
+            %loaded or return -6;
+            $exifTool->Warn('Bad offset for secondary xref table');
+            next;
+        }
+        my $loadXRefStream;
+        if ($buff =~ s/^xref\s+//s) {
+            # load xref table
+            for (;;) {
+                # read another line if necessary (skipping blank lines)
+                $raf->ReadLine($buff) or return -6 until $buff =~ /\S/;
+                last if $buff =~ s/^\s*trailer\s+//s;
+                $buff =~ s/\s*(\d+)\s+(\d+)\s+//s or return -4;
+                my ($start, $num) = ($1, $2);
+                $raf->Seek(-length($buff), 1) or return -4;
+                my $i;
+                for ($i=0; $i<$num; ++$i) {
+                    $raf->Read($buff, 20) == 20 or return -6;
+                    $buff =~ /^\s*(\d{10}) (\d{5}) (f|n)/s or return -4;
+                    my $num = $start + $i;
+                    # save offset for newest copy of all objects
+                    # (or next object number for free objects)
+                    unless (defined $xref{$num}) {
+                        my ($offset, $gen) = (int($1), int($2));
+                        $xref{$num} = $offset;
+                        if ($3 eq 'f') {
+                            # save free objects in last xref table for rewriting
+                            $$mainFree{$num} =  [ $offset, $gen, 'f' ] if $mainFree;
+                            next;
+                        }
+                        # also save offset keyed by object reference string
+                        $xref{"$num $gen R"} = $offset;
+                    }
+                }
+                # (I have a sample from Adobe which has an empty xref table)
+                # %xref or return -4; # xref table may not be empty
+                $buff = '';
+            }
+            undef $mainFree;    # only do this for the last xref table
+        } elsif ($buff =~ s/^(\d+)\s+(\d+)\s+obj//s) {
+            # this is a PDF-1.5 cross-reference stream dictionary
+            $loadXRefStream = 1;
+        } else {
+            %loaded or return -4;
+            $exifTool->Warn('Invalid secondary xref table');
+            next;
+        }
+        my $mainDict = ExtractObject($exifTool, \$buff, $raf, \%xref);
+        unless (ref $mainDict eq 'HASH') {
+            %loaded or return -8;
+            $exifTool->Warn('Error loading secondary dictionary');
+            next;
+        }
+        if ($loadXRefStream) {
+            # decode and save our XRef stream from PDF-1.5 file
+            # (but parse it later as required to save time)
+            # Note: this technique can potentially result in an old object
+            # being used if the file was incrementally updated and an older
+            # object from an xref table was replaced by a newer object in an
+            # xref stream.  But doing so isn't a good idea (if allowed at all)
+            # because a PDF 1.4 consumer would also make this same mistake.
+            if ($$mainDict{Type} eq '/XRef' and $$mainDict{W} and
+                @{$$mainDict{W}} > 2 and $$mainDict{Size} and
+                DecodeStream($exifTool, $mainDict))
+            {
+                # create Index entry if it doesn't exist
+                $$mainDict{Index} or $$mainDict{Index} = [ 0, $$mainDict{Size} ];
+                # create '_entry_size' entry for internal use
+                my $w = $$mainDict{W};
+                my $size = 0;
+                foreach (@$w) { $size += $_; }
+                $$mainDict{_entry_size} = $size;
+                # save this stream dictionary to use later if required
+                $xref{dicts} = [] unless $xref{dicts};
+                push @{$xref{dicts}}, $mainDict;
+            } else {
+                %loaded or return -9;
+                $exifTool->Warn('Invalid xref stream in secondary dictionary');
+            }
+        }
+        $loaded{$offset} = 1;
+        # load XRef stream in hybrid file if it exists
+        push @xrefOffsets, $$mainDict{XRefStm}, 'XRefStm' if $$mainDict{XRefStm};
+        $encrypt = $$mainDict{Encrypt} if $$mainDict{Encrypt};
+        if ($$mainDict{ID} and ref $$mainDict{ID} eq 'ARRAY') {
+            $id = ReadPDFValue($mainDict->{ID}->[0]);
+        }
+        push @mainDicts, $mainDict, $type;
+        # load previous xref table if it exists
+        push @xrefOffsets, $$mainDict{Prev}, 'Prev' if $$mainDict{Prev};
+    }
+#
+# extract encryption information if necessary
+#
+    if ($encrypt) {
+        if (ref $encrypt eq 'SCALAR') {
+            $encrypt = FetchObject($exifTool, $$encrypt, \%xref, 'Encrypt');
+        }
+        # generate Encryption tag information
+        my $err = DecryptInit($exifTool, $encrypt, $id);
+        if ($err) {
+            $exifTool->Warn($err);
+            $$capture{Error} = $err if $capture;
+            return -1;
+        }
+    }
+#
+# extract the information beginning with each of the main dictionaries
+#
+    while (@mainDicts) {
+        my $dict = shift @mainDicts;
+        my $type = shift @mainDicts;
+        if ($verbose) {
+            my $n = scalar(@{$$dict{_tags}});
+            $exifTool->VPrint(0, "PDF dictionary with $n entries:\n");
+        }
+        ProcessDict($exifTool, $tagTablePtr, $dict, \%xref, 0, $type);
+    }
+    # handle any decryption errors
+    if ($encrypt) {
+        my $err = $$encrypt{_error};
+        if ($err) {
+            $exifTool->Warn($err);
+            $$capture{Error} = $err if $capture;
+            return -1;
+        }
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# ReadPDF() warning strings for each error return value
+my %pdfWarning = (
+    # -1 is reserved as error return value with no associated warning
+    -2 => 'Error seeking in file',
+    -3 => 'Error reading file',
+    -4 => 'Invalid xref table',
+    -5 => 'Invalid xref offset',
+    -6 => 'Error reading xref table',
+    -7 => 'Error reading trailer',
+    -8 => 'Error reading main dictionary',
+    -9 => 'Invalid xref stream in main dictionary',
+);
+
+#------------------------------------------------------------------------------
+# Extract information from PDF file
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 if this was a valid PDF file
+sub ProcessPDF($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+
+    undef $cryptInfo;   # (must not delete after returning so writer can use it)
+    undef $cryptStream;
+    undef $cryptString;
+    my $result = ReadPDF($exifTool, $dirInfo);
+    if ($result < 0) {
+        $exifTool->Warn($pdfWarning{$result}) if $pdfWarning{$result};
+        $result = 1;
+    }
+    # clean up and return
+    undef %streamObjs;
+    undef %fetched;
+    return $result;
+}
+
+1; # end
+
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::PDF - Read PDF meta information
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This code reads meta information from PDF (Adobe Portable Document Format)
+files.  It supports object streams introduced in PDF-1.5 but only with a
+limited set of Filter and Predictor algorithms, however all standard
+encryption methods through PDF-1.7 extension level 3 are supported,
+including AESV2 (AES-128) and AESV3 (AES-256).
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://partners.adobe.com/public/developer/pdf/index_reference.html>
+
+=item L<Crypt::RC4|Crypt::RC4>
+
+=item L<http://www.adobe.com/devnet/acrobat/pdfs/PDF32000_2008.pdf>
+
+=item L<http://www.adobe.com/content/dam/Adobe/en/devnet/pdf/pdfs/adobe_supplement_iso32000.pdf>
+
+=item L<http://tools.ietf.org/search/rfc3454>
+
+=item L<http://www.armware.dk/RFC/rfc/rfc4013.html>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/PDF Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/PGF.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/PGF.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/PGF.pm	(revision 24799)
@@ -0,0 +1,143 @@
+#------------------------------------------------------------------------------
+# File:         PGF.pm
+#
+# Description:  Read Progressive Graphics File meta information
+#
+# Revisions:    2011/01/25 - P. Harvey Created
+#
+# References:   1) http://www.libpgf.org/
+#               2) http://www.exiv2.org/
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::PGF;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.01';
+
+# PGF header information
+%Image::ExifTool::PGF::Main = (
+    GROUPS => { 0 => 'File', 1 => 'File', 2 => 'Image' },
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    PRIORITY => 2,  # (to take precedence over PNG tags from embedded image)
+    NOTES => q{
+        The following table lists information extracted from the header of
+        Progressive Graphics File (PGF) images.  As well, information is extracted
+        from the embedded PNG metadata image if it exists.  See
+        L<http://www.libpgf.org/> for the PGF specification.
+    },
+    3  => {
+        Name => 'PGFVersion',
+        PrintConv => 'sprintf("0x%.2x", $val)',
+        # this is actually a bitmask (ref digikam PGFtypes.h):
+        # 0x02 - data structure PGFHeader of major version 2
+        # 0x04 - 32-bit values
+        # 0x08 - supports regions of interest
+        # 0x10 - new coding scheme since major version 5
+        # 0x20 - new HeaderSize: 32 bits instead of 16 bits
+    },
+    8  => { Name => 'ImageWidth',  Format => 'int32u' },
+    12 => { Name => 'ImageHeight', Format => 'int32u' },
+    16 => 'PyramidLevels',
+    17 => 'Quality',
+    18 => 'BitsPerPixel',
+    19 => 'ColorComponents',
+    20 => {
+        Name => 'ColorMode',
+        RawConv => '$$self{PGFColorMode} = $val',
+        PrintConvColumns => 2,
+        PrintConv => {
+            0 => 'Bitmap',
+            1 => 'Grayscale',
+            2 => 'Indexed',
+            3 => 'RGB',
+            4 => 'CMYK',
+            7 => 'Multichannel',
+            8 => 'Duotone',
+            9 => 'Lab',
+        },
+    },
+    21 => { Name => 'BackgroundColor', Format => 'int8u[3]' },
+);
+
+#------------------------------------------------------------------------------
+# Extract information from a PGF image
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 on success, 0 if this wasn't a valid PGF file
+sub ProcessPGF($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my $buff;
+
+    # read header and check magic number
+    return 0 unless $raf->Read($buff, 24) == 24 and $buff =~ /^PGF(.)/s;
+    my $ver = ord $1;
+    $exifTool->SetFileType();
+    SetByteOrder('II');
+
+    # currently support only version 0x36
+    unless ($ver == 0x36) {
+        $exifTool->Error(sprintf('Unsupported PGF version 0x%.2x', $ver));
+        return 1;
+    }
+    # extract information from the PGF header
+    my $tagTablePtr = GetTagTable('Image::ExifTool::PGF::Main');
+    $exifTool->ProcessDirectory({ DataPt => \$buff, DataPos => 0 }, $tagTablePtr);
+
+    my $len = Get32u(\$buff, 4) - 16; # length of post-header data
+
+    # skip colour table if necessary
+    $len -= $raf->Seek(1024, 1) ? 1024 : $len if $$exifTool{PGFColorMode} == 2;
+
+    # extract information from the embedded metadata image (PNG format)
+    if ($len > 0 and $len < 0x1000000 and $raf->Read($buff, $len) == $len) {
+        $exifTool->ExtractInfo(\$buff, { ReEntry => 1 });
+    }
+    return 1;
+}
+
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::PGF - Read Progressive Graphics File meta information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to extract meta
+information from Progressive Graphics File (PGF) images.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.libpgf.org/>
+
+=item L<http://www.exiv2.org/>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/PGF Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/PICT.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/PICT.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/PICT.pm	(revision 24799)
@@ -0,0 +1,1260 @@
+#------------------------------------------------------------------------------
+# File:         PICT.pm
+#
+# Description:  Read PICT meta information
+#
+# Revisions:    10/10/2005 - P. Harvey Created
+#
+# Notes:        Extraction of PICT opcodes is still experimental
+#
+# - size difference in PixPat color table?? (imagemagick reads only 1 long per entry)
+# - other differences in the way imagemagick reads 16-bit images
+#
+# References:   1) http://developer.apple.com/documentation/mac/QuickDraw/QuickDraw-2.html
+#               2) http://developer.apple.com/documentation/QuickTime/INMAC/QT/iqImageCompMgr.a.htm
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::PICT;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.03';
+
+sub ReadPictValue($$$;$);
+
+my ($vers, $extended);  # PICT version number, and extended flag
+my ($verbose, $out, $indent); # used in verbose mode
+
+# ranges of reserved opcodes.
+# opcodes at the start of each range must be defined in the tag table
+my @reserved = (
+    0x0017 => 0x0019, 0x0024 => 0x0027, 0x0035 => 0x0037, 0x003d => 0x003f,
+    0x0045 => 0x0047, 0x004d => 0x004f, 0x0055 => 0x0057, 0x005d => 0x005f,
+    0x0065 => 0x0067, 0x006d => 0x006f, 0x0075 => 0x0077, 0x007d => 0x007f,
+    0x0085 => 0x0087, 0x008d => 0x008f, 0x0092 => 0x0097, 0x00a2 => 0x00af,
+    0x00b0 => 0x00cf, 0x00d0 => 0x00fe, 0x0100 => 0x01ff, 0x0300 => 0x0bfe,
+    0x0c01 => 0x7eff, 0x7f00 => 0x7fff, 0x8000 => 0x80ff, 0x8100 => 0x81ff,
+    0x8201 => 0xffff,
+);
+
+# Apple data structures in PICT images
+my %structs = (
+    Arc => [
+        rect => 'Rect',
+        startAng => 'int16s',
+        arcAng => 'int16s',
+    ],
+    BitMap => [
+        # (no baseAddr)
+        rowBytes => 'int16u',
+        bounds => 'Rect',
+    ],
+    # BitsRect data for PICT version 1
+    BitsRect1 => [
+        bitMap => 'BitMap',
+        srcRect => 'Rect',
+        dstRect => 'Rect',
+        mode => 'int16u',
+        dataSize => 'int16u',
+        bitData => 'binary[$val{dataSize}]',
+    ],
+    # BitsRect data for PICT version 2
+    BitsRect2 => [
+        pixMap => 'PixMap',
+        colorTable => 'ColorTable',
+        srcRect => 'Rect',
+        dstRect => 'Rect',
+        mode => 'int16u',
+        pixData => \ 'GetPixData($val{pixMap}, $raf)',
+    ],
+    # BitsRgn data for PICT version 1
+    BitsRgn1 => [
+        bitMap => 'BitMap',
+        srcRect => 'Rect',
+        dstRect => 'Rect',
+        mode => 'int16u',
+        maskRgn => 'Rgn',
+        dataSize => 'int16u',
+        bitData => 'binary[$val{dataSize}]',
+    ],
+    # BitsRgn data for PICT version 2
+    BitsRgn2 => [
+        pixMap => 'PixMap',
+        colorTable => 'ColorTable',
+        srcRect => 'Rect',
+        dstRect => 'Rect',
+        mode => 'int16u',
+        maskRgn => 'Rgn',
+        pixData => \ 'GetPixData($val{pixMap}, $raf)',
+    ],
+    ColorSpec => [
+        value => 'int16u',
+        rgb => 'RGBColor',
+    ],
+    ColorTable => [
+        ctSeed => 'int32u',
+        ctFlags => 'int16u',
+        ctSize => 'int16u',
+        ctTable => 'ColorSpec[$val{ctSize}+1]',
+    ],
+    # http://developer.apple.com/documentation/QuickTime/INMAC/QT/iqImageCompMgr.a.htm
+    CompressedQuickTime => [
+        size => 'int32u',   # size NOT including size word
+        version => 'int16u',
+        matrix => 'int32u[9]',
+        matteSize => 'int32u',
+        matteRect => 'Rect',
+        mode => 'int16u',
+        srcRect => 'Rect',
+        accuracy => 'int32u',
+        maskSize => 'int32u',
+        matteDescr => 'Int32uData[$val{matteSize} ? 1 : 0]',
+        matteData => 'int8u[$val{matteSize}]',
+        maskRgn => 'int8u[$val{maskSize}]',
+        imageDescr => 'ImageDescription',
+        # size should be $val{imageDescr}->{dataSize}, but this is unreliable
+        imageData => q{binary[$val{size} - 68 - $val{maskSize} - $val{imageDescr}->{size} -
+                    ($val{matteSize} ? $val{mattSize} + $val{matteDescr}->{size} : 0)]
+        },
+    ],
+    DirectBitsRect => [
+        baseAddr => 'int32u',
+        pixMap => 'PixMap',
+        srcRect => 'Rect',
+        dstRect => 'Rect',
+        mode => 'int16u',
+        pixData => \ 'GetPixData($val{pixMap}, $raf)',
+    ],
+    DirectBitsRgn => [
+        baseAddr => 'int32u',
+        pixMap => 'PixMap',
+        srcRect => 'Rect',
+        dstRect => 'Rect',
+        mode => 'int16u',
+        maskRgn => 'Rgn',
+        pixData => \ 'GetPixData($val{pixMap}, $raf)',
+    ],
+    # http://developer.apple.com/technotes/qd/qd_01.html
+    FontName => [
+        size => 'int16u',   # size NOT including size word
+        oldFontID => 'int16u',
+        nameLen => 'int8u',
+        fontName => 'string[$val{nameLen}]',
+        padding => 'binary[$val{size} - $val{nameLen} - 3]',
+    ],
+    # http://developer.apple.com/documentation/QuickTime/APIREF/imagedescription.htm
+    ImageDescription => [
+        size => 'int32u',   # size INCLUDING size word
+        cType => 'string[4]',
+        res1 => 'int32u',
+        res2 => 'int16u',
+        dataRefIndex => 'int16u',
+        version => 'int16u',
+        revision => 'int16u',
+        vendor => 'string[4]',
+        temporalQuality => 'int32u',
+        quality => 'int32u',
+        width => 'int16u',
+        height => 'int16u',
+        hRes => 'fixed32u',
+        vRes => 'fixed32u',
+        dataSize => 'int32u',
+        frameCount => 'int16u',
+        nameLen => 'int8u',
+        compressor => 'string[31]',
+        depth => 'int16u',
+        clutID => 'int16u',
+        clutData => 'binary[$val{size}-86]',
+    ],
+    Int8uText => [
+        val => 'int8u',
+        count => 'int8u',
+        text => 'string[$val{count}]',
+    ],
+    Int8u2Text => [
+        val => 'int8u[2]',
+        count => 'int8u',
+        text => 'string[$val{count}]',
+    ],
+    Int16Data => [
+        size => 'int16u',   # size NOT including size word
+        data => 'int8u[$val{size}]',
+    ],
+    Int32uData => [
+        size => 'int32u',   # size NOT including size word
+        data => 'int8u[$val{size}]',
+    ],
+    LongComment => [
+        kind => 'int16u',
+        size => 'int16u',   # size of data only
+        data => 'binary[$val{size}]',
+    ],
+    PixMap => [
+        # Note: does not contain baseAddr
+        # (except for DirectBits opcodes in which it is loaded separately)
+        rowBytes => 'int16u',
+        bounds => 'Rect',
+        pmVersion => 'int16u',
+        packType => 'int16u',
+        packSize => 'int32u',
+        hRes => 'fixed32s',
+        vRes => 'fixed32s',
+        pixelType => 'int16u',
+        pixelSize => 'int16u',
+        cmpCount => 'int16u',
+        cmpSize => 'int16u',
+        planeBytes => 'int32u',
+        pmTable => 'int32u',
+        pmReserved => 'int32u',
+    ],
+    PixPat => [
+        patType => 'int16u',    # 1 = non-dithered, 2 = dithered
+        pat1Data => 'int8u[8]',
+        # dithered PixPat has RGB entry
+        RGB => 'RGBColor[$val{patType} == 2 ? 1 : 0]',
+        # non-dithered PixPat has other stuff instead
+        nonDithered=> 'PixPatNonDithered[$val{patType} == 2 ? 0 : 1]',
+    ],
+    PixPatNonDithered => [
+        pixMap => 'PixMap',
+        colorTable => 'ColorTable',
+        pixData => \ 'GetPixData($val{pixMap}, $raf)',
+    ],
+    Point => [
+        v => 'int16s',
+        h => 'int16s',
+    ],
+    PointText => [
+        txLoc => 'Point',
+        count => 'int8u',
+        text => 'string[$val{count}]',
+    ],
+    Polygon => [
+        polySize => 'int16u',
+        polyBBox => 'Rect',
+        polyPoints => 'int16u[($val{polySize}-10)/2]',
+    ],
+    Rect => [
+        topLeft => 'Point',
+        botRight => 'Point',
+    ],
+    RGBColor => [
+        red => 'int16u',
+        green => 'int16u',
+        blue => 'int16u',
+    ],
+    Rgn => [
+        rgnSize => 'int16u',
+        rgnBBox => 'Rect',
+        data => 'int8u[$val{rgnSize}-10]',
+    ],
+    ShortLine => [
+        pnLoc => 'Point',
+        dh => 'int8s',
+        dv => 'int8s',
+    ],
+    # http://developer.apple.com/documentation/QuickTime/INMAC/QT/iqImageCompMgr.a.htm
+    UncompressedQuickTime => [
+        size => 'int32u',   # size NOT including size word
+        version => 'int16u',
+        matrix => 'int32u[9]',
+        matteSize => 'int32u',
+        matteRect => 'Rect',
+        matteDescr => 'Int32uData[$val{matteSize} ? 1 : 0]',
+        matteData => 'binary[$val{matteSize}]',
+        subOpcodeData => q{
+            binary[ $val{size} - 50 -
+                    ($val{matteSize} ? $val{mattSize} + $val{matteDescr}->{size} : 0)]
+        },
+    ],
+);
+
+# PICT image opcodes
+%Image::ExifTool::PICT::Main = (
+    PROCESS_PROC => 0,  # set this to zero to omit tags from lookup
+    NOTES => q{
+The PICT format contains no true meta information, except for the possible
+exception of the LongComment opcode.  By default, only ImageWidth,
+ImageHeight and X/YResolution are extracted from a PICT image.  Tags in the
+following table represent image opcodes.  Extraction of these tags is
+experimental, and is only enabled with the Verbose or Unknown options.
+    },
+    0x0000 => {
+        Name => 'Nop',
+        Description => 'No Operation',
+        Format => 'null',
+    },
+    0x0001 => {
+        Name => 'ClipRgn',
+        Description => 'Clipping Region',
+        Format => 'Rgn',
+    },
+    0x0002 => {
+        Name => 'BkPat',
+        Description => 'Background Pattern',
+        Format => 'int8u[8]',
+    },
+    0x0003 => {
+        Name => 'TxFont',
+        Description => 'Font Number',
+        Format => 'int16u',
+    },
+    0x0004 => {
+        Name => 'TxFace',
+        Description => 'Text Font Style',
+        Format => 'int8u',
+    },
+    0x0005 => {
+        Name => 'TxMode',
+        Description => 'Text Source Mode',
+        Format => 'int16u',
+    },
+    0x0006 => {
+        Name => 'SpExtra',
+        Description => 'Extra Space',
+        Format => 'fixed32s',
+    },
+    0x0007 => {
+        Name => 'PnSize',
+        Description => 'Pen Size',
+        Format => 'Point',
+    },
+    0x0008 => {
+        Name => 'PnMode',
+        Description => 'Pen Mode',
+        Format => 'int16u',
+    },
+    0x0009 => {
+        Name => 'PnPat',
+        Description => 'Pen Pattern',
+        Format => 'int8u[8]',
+    },
+    0x000a => {
+        Name => 'FillPat',
+        Description => 'Fill Pattern',
+        Format => 'int8u[8]',
+    },
+    0x000b => {
+        Name => 'OvSize',
+        Description => 'Oval Size',
+        Format => 'Point',
+    },
+    0x000c => {
+        Name => 'Origin',
+        Format => 'Point',
+    },
+    0x000d => {
+        Name => 'TxSize',
+        Description => 'Text Size',
+        Format => 'int16u',
+    },
+    0x000e => {
+        Name => 'FgColor',
+        Description => 'Foreground Color',
+        Format => 'int32u',
+    },
+    0x000f => {
+        Name => 'BkColor',
+        Description => 'Background Color',
+        Format => 'int32u',
+    },
+    0x0010 => {
+        Name => 'TxRatio',
+        Description => 'Text Ratio',
+        Format => 'Rect',
+    },
+    0x0011 => {
+        Name => 'VersionOp',
+        Description => 'Version',
+        Format => 'int8u',
+    },
+    0x0012 => {
+        Name => 'BkPixPat',
+        Description => 'Background Pixel Pattern',
+        Format => 'PixPat',
+    },
+    0x0013 => {
+        Name => 'PnPixPat',
+        Description => 'Pen Pixel Pattern',
+        Format => 'PixPat',
+    },
+    0x0014 => {
+        Name => 'FillPixPat',
+        Description => 'Fill Pixel Pattern',
+        Format => 'PixPat',
+    },
+    0x0015 => {
+        Name => 'PnLocHFrac',
+        Description => 'Fractional Pen Position',
+        Format => 'int16u',
+    },
+    0x0016 => {
+        Name => 'ChExtra',
+        Description => 'Added Width for NonSpace Characters',
+        Format => 'int16u',
+    },
+    0x0017 => {
+        Name => 'Reserved',
+        Format => 'Unknown',
+    },
+    0x001a => {
+        Name => 'RGBFgCol',
+        Description => 'Foreground Color',
+        Format => 'RGBColor',
+    },
+    0x001b => {
+        Name => 'RGBBkCol',
+        Description => 'Background Color',
+        Format => 'RGBColor',
+    },
+    0x001c => {
+        Name => 'HiliteMode',
+        Description => 'Highlight Mode Flag',
+        Format => 'null',
+    },
+    0x001d => {
+        Name => 'HiliteColor',
+        Description => 'Highlight Color',
+        Format => 'RGBColor',
+    },
+    0x001e => {
+        Name => 'DefHilite',
+        Description => 'Use Default Highlight Color',
+        Format => 'null',
+    },
+    0x001f => {
+        Name => 'OpColor',
+        Format => 'RGBColor',
+    },
+    0x0020 => {
+        Name => 'Line',
+        Format => 'Rect',
+    },
+    0x0021 => {
+        Name => 'LineFrom',
+        Format => 'Point',
+    },
+    0x0022 => {
+        Name => 'ShortLine',
+        Format => 'ShortLine',
+    },
+    0x0023 => {
+        Name => 'ShortLineFrom',
+        Format => 'int8u[2]',
+    },
+    0x0024 => {
+        Name => 'Reserved',
+        Format => 'Int16Data',
+    },
+    0x0028 => {
+        Name => 'LongText',
+        Format => 'PointText',
+    },
+    0x0029 => {
+        Name => 'DHText',
+        Format => 'Int8uText',
+    },
+    0x002a => {
+        Name => 'DVText',
+        Format => 'Int8uText',
+    },
+    0x002b => {
+        Name => 'DHDVText',
+        Format => 'Int8u2Text',
+    },
+    0x002c => {
+        Name => 'FontName',
+        Format => 'FontName',
+    },
+    0x002d => {
+        Name => 'LineJustify',
+        Format => 'int8u[10]',
+    },
+    0x002e => {
+        Name => 'GlyphState',
+        Format => 'int8u[8]',
+    },
+    0x002f => {
+        Name => 'Reserved',
+        Format => 'Int16Data',
+    },
+    0x0030 => {
+        Name => 'FrameRect',
+        Format => 'Rect',
+    },
+    0x0031 => {
+        Name => 'PaintRect',
+        Format => 'Rect',
+    },
+    0x0032 => {
+        Name => 'EraseRect',
+        Format => 'Rect',
+    },
+    0x0033 => {
+        Name => 'InvertRect',
+        Format => 'Rect',
+    },
+    0x0034 => {
+        Name => 'FillRect',
+        Format => 'Rect',
+    },
+    0x0035 => {
+        Name => 'Reserved',
+        Format => 'Rect',
+    },
+    0x0038 => {
+        Name => 'FrameSameRect',
+        Format => 'null',
+    },
+    0x0039 => {
+        Name => 'PaintSameRect',
+        Format => 'null',
+    },
+    0x003a => {
+        Name => 'EraseSameRect',
+        Format => 'null',
+    },
+    0x003b => {
+        Name => 'InvertSameRect',
+        Format => 'null',
+    },
+    0x003c => {
+        Name => 'FillSameRect',
+        Format => 'null',
+    },
+    0x003d => {
+        Name => 'Reserved',
+        Format => 'null',
+    },
+    0x0040 => {
+        Name => 'FrameRRect',
+        Format => 'Rect',
+    },
+    0x0041 => {
+        Name => 'PaintRRect',
+        Format => 'Rect',
+    },
+    0x0042 => {
+        Name => 'EraseRRect',
+        Format => 'Rect',
+    },
+    0x0043 => {
+        Name => 'InvertRRect',
+        Format => 'Rect',
+    },
+    0x0044 => {
+        Name => 'FillRRect',
+        Format => 'Rect',
+    },
+    0x0045 => {
+        Name => 'Reserved',
+        Format => 'Rect',
+    },
+    0x0048 => {
+        Name => 'FrameSameRRect',
+        Format => 'null',
+    },
+    0x0049 => {
+        Name => 'PaintSameRRect',
+        Format => 'null',
+    },
+    0x004a => {
+        Name => 'EraseSameRRect',
+        Format => 'null',
+    },
+    0x004b => {
+        Name => 'InvertSameRRect',
+        Format => 'null',
+    },
+    0x004c => {
+        Name => 'FillSameRRect',
+        Format => 'null',
+    },
+    0x004d => {
+        Name => 'Reserved',
+        Format => 'null',
+    },
+    0x0050 => {
+        Name => 'FrameOval',
+        Format => 'Rect',
+    },
+    0x0051 => {
+        Name => 'PaintOval',
+        Format => 'Rect',
+    },
+    0x0052 => {
+        Name => 'EraseOval',
+        Format => 'Rect',
+    },
+    0x0053 => {
+        Name => 'InvertOval',
+        Format => 'Rect',
+    },
+    0x0054 => {
+        Name => 'FillOval',
+        Format => 'Rect',
+    },
+    0x0055 => {
+        Name => 'Reserved',
+        Format => 'Rect',
+    },
+    0x0058 => {
+        Name => 'FrameSameOval',
+        Format => 'null',
+    },
+    0x0059 => {
+        Name => 'PaintSameOval',
+        Format => 'null',
+    },
+    0x005a => {
+        Name => 'EraseSameOval',
+        Format => 'null',
+    },
+    0x005b => {
+        Name => 'InvertSameOval',
+        Format => 'null',
+    },
+    0x005c => {
+        Name => 'FillSameOval',
+        Format => 'null',
+    },
+    0x005d => {
+        Name => 'Reserved',
+        Format => 'null',
+    },
+    0x0060 => {
+        Name => 'FrameArc',
+        Format => 'Arc',
+    },
+    0x0061 => {
+        Name => 'PaintArc',
+        Format => 'Arc',
+    },
+    0x0062 => {
+        Name => 'EraseArc',
+        Format => 'Arc',
+    },
+    0x0063 => {
+        Name => 'InvertArc',
+        Format => 'Arc',
+    },
+    0x0064 => {
+        Name => 'FillArc',
+        Format => 'Arc',
+    },
+    0x0065 => {
+        Name => 'Reserved',
+        Format => 'Arc',
+    },
+    0x0068 => {
+        Name => 'FrameSameArc',
+        Format => 'Point',
+    },
+    0x0069 => {
+        Name => 'PaintSameArc',
+        Format => 'Point',
+    },
+    0x006a => {
+        Name => 'EraseSameArc',
+        Format => 'Point',
+    },
+    0x006b => {
+        Name => 'InvertSameArc',
+        Format => 'Point',
+    },
+    0x006c => {
+        Name => 'FillSameArc',
+        Format => 'Point',
+    },
+    0x006d => {
+        Name => 'Reserved',
+        Format => 'int32u',
+    },
+    0x0070 => {
+        Name => 'FramePoly',
+        Format => 'Polygon',
+    },
+    0x0071 => {
+        Name => 'PaintPoly',
+        Format => 'Polygon',
+    },
+    0x0072 => {
+        Name => 'ErasePoly',
+        Format => 'Polygon',
+    },
+    0x0073 => {
+        Name => 'InvertPoly',
+        Format => 'Polygon',
+    },
+    0x0074 => {
+        Name => 'FillPoly',
+        Format => 'Polygon',
+    },
+    0x0075 => {
+        Name => 'Reserved',
+        Format => 'Polygon',
+    },
+    0x0078 => {
+        Name => 'FrameSamePoly',
+        Format => 'null',
+    },
+    0x0079 => {
+        Name => 'PaintSamePoly',
+        Format => 'null',
+    },
+    0x007a => {
+        Name => 'EraseSamePoly',
+        Format => 'null',
+    },
+    0x007b => {
+        Name => 'InvertSamePoly',
+        Format => 'null',
+    },
+    0x007c => {
+        Name => 'FillSamePoly',
+        Format => 'null',
+    },
+    0x007d => {
+        Name => 'Reserved',
+        Format => 'null',
+    },
+    0x0080 => {
+        Name => 'FrameRgn',
+        Format => 'Rgn',
+    },
+    0x0081 => {
+        Name => 'PaintRgn',
+        Format => 'Rgn',
+    },
+    0x0082 => {
+        Name => 'EraseRgn',
+        Format => 'Rgn',
+    },
+    0x0083 => {
+        Name => 'InvertRgn',
+        Format => 'Rgn',
+    },
+    0x0084 => {
+        Name => 'FillRgn',
+        Format => 'Rgn',
+    },
+    0x0085 => {
+        Name => 'Reserved',
+        Format => 'Rgn',
+    },
+    0x0088 => {
+        Name => 'FrameSameRgn',
+        Format => 'null',
+    },
+    0x0089 => {
+        Name => 'PaintSameRgn',
+        Format => 'null',
+    },
+    0x008a => {
+        Name => 'EraseSameRgn',
+        Format => 'null',
+    },
+    0x008b => {
+        Name => 'InvertSameRgn',
+        Format => 'null',
+    },
+    0x008c => {
+        Name => 'FillSameRgn',
+        Format => 'null',
+    },
+    0x008d => {
+        Name => 'Reserved',
+        Format => 'null',
+    },
+    0x0090 => {
+        Name => 'BitsRect',
+        Description => 'CopyBits with Clipped Rectangle',
+        Format => 'BitsRect#',  # (version-dependent format)
+    },
+    0x0091 => {
+        Name => 'BitsRgn',
+        Description => 'CopyBits with Clipped Region',
+        Format => 'BitsRgn#',   # (version-dependent format)
+    },
+    0x0092 => {
+        Name => 'Reserved',
+        Format => 'Int16Data',
+    },
+    0x0098 => {
+        Name => 'PackBitsRect',
+        Description => 'Packed CopyBits with Clipped Rectangle',
+        Format => 'BitsRect#',  # (version-dependent format)
+    },
+    0x0099 => {
+        Name => 'PackBitsRgn',
+        Description => 'Packed CopyBits with Clipped Region',
+        Format => 'BitsRgn#',   # (version-dependent format)
+    },
+    0x009a => {
+        Name => 'DirectBitsRect',
+        Format => 'DirectBitsRect',
+    },
+    0x009b => {
+        Name => 'DirectBitsRgn',
+        Format => 'DirectBitsRgn',
+    },
+    0x009c => {
+        Name => 'Reserved',
+        Format => 'Int16Data',
+    },
+    0x009d => {
+        Name => 'Reserved',
+        Format => 'Int16Data',
+    },
+    0x009e => {
+        Name => 'Reserved',
+        Format => 'Int16Data',
+    },
+    0x009f => {
+        Name => 'Reserved',
+        Format => 'Int16Data',
+    },
+    0x00a0 => {
+        Name => 'ShortComment',
+        Format => 'int16u',
+    },
+    0x00a1 => [
+        # this list for documentation only [not currently extracted]
+        {
+            # (not actually a full Photohop IRB record it appears, but it does start
+            #  with '8BIM', and does contain resolution information at offset 0x0a)
+            Name => 'LongComment',  # kind = 498
+            Format => 'LongComment',
+            SubDirectory => { TagTable => 'Image::ExifTool::Photoshop::Main' },
+        },
+        {
+            Name => 'LongComment',  # kind = 224
+            Format => 'LongComment',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::ICC_Profile::Main',
+                Start => '$valuePtr + 4',
+            },
+        },
+    ],
+    0x00a2 => {
+        Name => 'Reserved',
+        Format => 'Int16Data',
+    },
+    0x00b0 => {
+        Name => 'Reserved',
+        Format => 'null',
+    },
+    0x00d0 => {
+        Name => 'Reserved',
+        Format => 'Int32uData',
+    },
+    0x00ff => {
+        Name => 'OpEndPic',
+        Description => 'End of picture',
+        Format => 'null', # 2 for version 2!?
+    },
+    0x0100 => {
+        Name => 'Reserved',
+        Format => 'int16u',
+    },
+    0x0200 => {
+        Name => 'Reserved',
+        Format => 'int32u',
+    },
+    0x02ff => {
+        Name => 'Version',
+        Description => 'Version number of picture',
+        Format => 'int16u',
+    },
+    0x0300 => {
+        Name => 'Reserved',
+        Format => 'int16u',
+    },
+    0x0bff => {
+        Name => 'Reserved',
+        Format => 'int8u[22]',
+    },
+    0x0c00 => {
+        Name => 'HeaderOp',
+        Format => 'int16u[12]',
+    },
+    0x0c01 => {
+        Name => 'Reserved',
+        Format => 'int8u[24]',
+    },
+    0x7f00 => {
+        Name => 'Reserved',
+        Format => 'int8u[254]',
+    },
+    0x8000 => {
+        Name => 'Reserved',
+        Format => 'null',
+    },
+    0x8100 => {
+        Name => 'Reserved',
+        Format => 'Int32uData',
+    },
+    0x8200 => {
+        Name => 'CompressedQuickTime',
+        Format => 'CompressedQuickTime',
+    },
+    0x8201 => {
+        Name => 'UncompressedQuickTime',
+        Format => 'Int32uData',
+    },
+    0xffff => {
+        Name => 'Reserved',
+        Format => 'Int32uData',
+    },
+);
+
+# picture comment 'kind' codes
+# http://developer.apple.com/technotes/qd/qd_10.html
+my %commentKind = (
+    150 => 'TextBegin',
+    151 => 'TextEnd',
+    152 => 'StringBegin',
+    153 => 'StringEnd',
+    154 => 'TextCenter',
+    155 => 'LineLayoutOff',
+    156 => 'LineLayoutOn',
+    157 => 'ClientLineLayout',
+    160 => 'PolyBegin',
+    161 => 'PolyEnd',
+    163 => 'PolyIgnore',
+    164 => 'PolySmooth',
+    165 => 'PolyClose',
+    180 => 'DashedLine',
+    181 => 'DashedStop',
+    182 => 'SetLineWidth',
+    190 => 'PostScriptBegin',
+    191 => 'PostScriptEnd',
+    192 => 'PostScriptHandle',
+    193 => 'PostScriptFile',
+    194 => 'TextIsPostScript',
+    195 => 'ResourcePS',
+    196 => 'PSBeginNoSave',
+    197 => 'SetGrayLevel',
+    200 => 'RotateBegin',
+    201 => 'RotateEnd',
+    202 => 'RotateCenter',
+    210 => 'FormsPrinting',
+    211 => 'EndFormsPrinting',
+    224 => '<ICC Profile>',
+    498 => '<Photoshop Data>',
+    1000 => 'BitMapThinningOff',
+    1001 => 'BitMapThinningOn',
+);
+
+#------------------------------------------------------------------------------
+# Get PixData data
+# Inputs: 0) reference to PixMap, 1) RAF reference
+# Returns: reference to PixData or undef on error
+sub GetPixData($$)
+{
+    my ($pixMap, $raf) = @_;
+    my $packType = $pixMap->{packType};
+    my $rowBytes = $pixMap->{rowBytes} & 0x3fff;    # remove flags bits
+    my $height = $pixMap->{bounds}->{botRight}->{v} -
+                 $pixMap->{bounds}->{topLeft}->{v};
+    my ($data, $size, $buff, $i);
+
+    if ($packType == 1 or $rowBytes < 8) {  # unpacked data
+        $size = $rowBytes * $height;
+        return undef unless $raf->Read($data, $size) == $size;
+    } elsif ($packType == 2) {              # pad byte dropped
+        $size = int($rowBytes * $height * 3 / 4 + 0.5);
+        return undef unless $raf->Read($data, $size) == $size;
+    } else {
+        $data = '';
+        for ($i=0; $i<$height; ++$i) {
+            if ($rowBytes > 250) {
+                $raf->Read($buff,2) == 2 or return undef;
+                $size = unpack('n',$buff);
+            } else {
+                $raf->Read($buff,1) == 1 or return undef;
+                $size = unpack('C',$buff);
+            }
+            $data .= $buff;
+            $raf->Read($buff,$size) == $size or return undef;
+            $data .= $buff;
+        }
+    }
+    return \$data;
+}
+
+#------------------------------------------------------------------------------
+# Read value from PICT file
+# Inputs: 0) RAF reference, 1) tag, 2) format, 3) optional count
+# Returns: value, reference to structure hash, or undef on error
+sub ReadPictValue($$$;$)
+{
+    my ($raf, $tag, $format, $count) = @_;
+    return undef unless $format;
+    unless (defined $count) {
+        if ($format =~ /(.+)\[(.+)\]/s) {
+            $format = $1;
+            $count = $2;
+        } else {
+            $count = 1; # count undefined: assume 1
+        }
+    }
+    my $cntStr = ($count == 1) ? '' : "[$count]";
+    # no size if count is 0
+    my $size = $count ? Image::ExifTool::FormatSize($format) : 0;
+    if (defined $size or $format eq 'null') {
+        my $val;
+        if ($size) {
+            my $buff;
+            $size *= $count;
+            $raf->Read($buff, $size) == $size or return undef;
+            $val = ReadValue(\$buff, 0, $format, $count, $size);
+        } else {
+            $val = '';
+        }
+        if ($verbose) {
+            print $out "${indent}$tag ($format$cntStr)";
+            if ($size) {
+                if (not defined $val) {
+                    print $out " = <undef>\n";
+                } elsif ($format eq 'binary') {
+                    print $out " = <binary data>\n";
+                    if ($verbose > 2) {
+                        my %parms = ( Out => $out );
+                        $parms{MaxLen} = 96 if $verbose < 4;
+                        Image::ExifTool::HexDump(\$val, undef, %parms);
+                    }
+                } else {
+                    print $out " = $val\n";
+                }
+            } else {
+                print $out "\n";
+            }
+        }
+        return \$val if $format eq 'binary' and defined $val;
+        return $val;
+    }
+    $verbose and print $out "${indent}$tag ($format$cntStr):\n";
+    my $struct = $structs{$format} or return undef;
+    my ($c, @vals);
+    for ($c=0; $c<$count; ++$c) {
+        my (%val, $i);
+        for ($i=0; ; $i+=2) {
+            my $tag = $$struct[$i] or last;
+            my $fmt = $$struct[$i+1];
+            my ($cnt, $val);
+            $indent .= '  ';
+            if (ref $fmt) {
+                $val = eval $$fmt;
+                $@ and warn $@;
+                if ($verbose and defined $val) {
+                    printf $out "${indent}$tag (binary[%d]) = <binary data>\n",length($$val);
+                    if ($verbose > 2) {
+                        my %parms = ( Out => $out );
+                        $parms{MaxLen} = 96 if $verbose < 4;
+                        Image::ExifTool::HexDump($val, undef, %parms);
+                    }
+                }
+            } elsif ($fmt =~ /(.+)\[(.+)\]/s) {
+                $fmt = $1;
+                $cnt = eval $2;
+                $@ and warn $@;
+                $val = ReadPictValue($raf, $tag, $fmt, $cnt);
+            } else {
+                $val = ReadPictValue($raf, $tag, $fmt);
+            }
+            $indent = substr($indent, 2);
+            return undef unless defined $val;
+            $val{$tag} = $val;
+        }
+        return \%val if $count == 1;
+        push @vals, \%val;
+    }
+    return \@vals;
+}
+
+#------------------------------------------------------------------------------
+# Extract meta information from a PICT image
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 on success, 0 if this wasn't a valid PICT image
+sub ProcessPICT($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    $verbose = $exifTool->Options('Verbose');
+    $out = $exifTool->Options('TextOut');
+    $indent = '';
+    my ($buff, $tried, @hdr, $op, $hRes, $vRes);
+
+    # recognize both PICT files and PICT resources (PICT files have a
+    # 512-byte header that we ignore, but PICT resources do not)
+    for (;;) {
+        $raf->Read($buff, 12) == 12 or return 0;
+        @hdr = unpack('x2n5', $buff);
+        $op = pop @hdr;
+        # check for PICT version 1 format
+        if ($op eq 0x1101) {
+            $vers = 1;
+            undef $extended;
+            last;
+        }
+        # check for PICT version 2 format
+        if ($op eq 0x0011) {
+            $raf->Read($buff, 28) == 28 or return 0;
+            if ($buff =~ /^\x02\xff\x0c\x00\xff\xff/) {
+                $vers = 2;
+                undef $extended;
+                last;
+            }
+            if ($buff =~ /^\x02\xff\x0c\x00\xff\xfe/) {
+                $vers = 2;
+                $extended = 1;
+                ($hRes, $vRes) = unpack('x8N2', $buff);
+                last;
+            }
+        }
+        return 0 if $tried;
+        $tried = 1;
+        $raf->Seek(512, 0) or return 0;
+    }
+    # make the bounding rect signed
+    foreach (@hdr) {
+        $_ >= 0x8000 and $_ -= 0x10000;
+    }
+    my $w = $hdr[3] - $hdr[1];
+    my $h = $hdr[2] - $hdr[0];
+    return 0 unless $w > 0 and $h > 0;
+
+    SetByteOrder('MM');
+
+    if ($extended) {
+        # extended version 2 pictures contain resolution information
+        # and image bounds are in 72-dpi equivalent units
+        $hRes = GetFixed32s(\$buff, 8);
+        $vRes = GetFixed32s(\$buff, 12);
+        return 0 unless $hRes and $vRes;
+        $w = int($w * $hRes / 72 + 0.5);
+        $h = int($h * $vRes / 72 + 0.5);
+    }
+    $exifTool->SetFileType();
+    $exifTool->FoundTag('ImageWidth', $w);
+    $exifTool->FoundTag('ImageHeight', $h);
+    $exifTool->FoundTag('XResolution', $hRes) if $hRes;
+    $exifTool->FoundTag('YResolution', $vRes) if $vRes;
+
+    # don't extract image opcodes unless verbose
+    return 1 unless $verbose or $exifTool->Options('Unknown');
+
+    $verbose and printf $out "PICT version $vers%s\n", $extended ? ' extended' : '';
+
+    my $tagTablePtr = GetTagTable('Image::ExifTool::PICT::Main');
+
+    my $success;
+    for (;;) {
+        if ($vers == 1) {
+            $raf->Read($buff, 1) == 1 or last;
+            $op = ord($buff);
+        } else {
+            # must start version 2 opcode on an even byte
+            $raf->Read($buff, 1) if $raf->Tell() & 0x01;
+            $raf->Read($buff, 2) == 2 or last;
+            $op = unpack('n', $buff);
+        }
+        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $op);
+        unless ($tagInfo) {
+            my $i;
+            # search for reserved tag info
+            for ($i=0; $i<scalar(@reserved); $i+=2) {
+                next unless $op >= $reserved[$i];
+                last if $op > $reserved[$i+1];
+                $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $reserved[$i]);
+                last;
+            }
+            last unless $tagInfo;
+        }
+        if ($op eq 0xff) {
+            $verbose and print $out "End of picture\n";
+            $success = 1;
+            last;
+        }
+        my $format = $$tagInfo{Format};
+        unless ($format) {
+            $exifTool->Warn("Missing format for $$tagInfo{Name}");
+            last;
+        }
+        # replace version number for version-dependent formats
+        $format =~ s/#$/$vers/;
+        my $wid = $vers * 2;
+        $verbose and printf $out "Tag 0x%.${wid}x, ", $op;
+        my $val = ReadPictValue($raf, $$tagInfo{Name}, $format);
+        unless (defined $val) {
+            $exifTool->Warn("Error reading $$tagInfo{Name} information");
+            last;
+        }
+        if (ref $val eq 'HASH') {
+            # extract JPEG image from CompressedQuickTime imageData
+            if ($$tagInfo{Name} eq 'CompressedQuickTime' and
+                ref $val->{imageDescr} eq 'HASH' and
+                $val->{imageDescr}->{compressor} and
+                $val->{imageDescr}->{compressor} eq 'Photo - JPEG' and
+                ref $val->{imageData} eq 'SCALAR' and
+                $exifTool->ValidateImage($val->{imageData}, 'PreviewImage'))
+            {
+                $exifTool->FoundTag('PreviewImage', $val->{imageData});
+            }
+        } else {
+            # $exifTool->FoundTag($tagInfo, $val);
+        }
+    }
+    $success or $exifTool->Warn('End of picture not found');
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::PICT - Read PICT meta information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains routines required by Image::ExifTool to read PICT
+(Apple Picture) images.
+
+=head1 NOTES
+
+Extraction of PICT opcodes is experimental, and is only enabled with the
+Verbose or the Unknown option.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://developer.apple.com/documentation/mac/QuickDraw/QuickDraw-2.html>
+
+=item L<http://developer.apple.com/documentation/QuickTime/INMAC/QT/iqImageCompMgr.a.htm>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/PICT Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/PNG.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/PNG.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/PNG.pm	(revision 24799)
@@ -0,0 +1,1100 @@
+#------------------------------------------------------------------------------
+# File:         PNG.pm
+#
+# Description:  Read and write PNG meta information
+#
+# Revisions:    06/10/2005 - P. Harvey Created
+#               06/23/2005 - P. Harvey Added MNG and JNG support
+#               09/16/2005 - P. Harvey Added write support
+#
+# References:   1) http://www.libpng.org/pub/png/spec/1.2/
+#               2) http://www.faqs.org/docs/png/
+#               3) http://www.libpng.org/pub/mng/
+#               4) http://www.libpng.org/pub/png/spec/register/
+#               5) ftp://ftp.simplesystems.org/pub/png/documents/pngext-1.4.0-pdg.html
+#
+# Notes:        Writing meta information in PNG images is a pain in the butt
+#               for a number of reasons:  One biggie is that you have to
+#               decompress then decode the ASCII/hex profile information before
+#               you can edit it, then you have to ASCII/hex-encode, recompress
+#               and calculate a CRC before you can write it out again.  gaaaak.
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::PNG;
+
+use strict;
+use vars qw($VERSION $AUTOLOAD);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.24';
+
+sub ProcessPNG_tEXt($$$);
+sub ProcessPNG_iTXt($$$);
+sub ProcessPNG_Compressed($$$);
+sub CalculateCRC($;$$$);
+sub HexEncode($);
+sub AddChunks($$);
+sub Add_iCCP($$);
+sub GetLangInfo($$);
+sub BuildTextChunk($$$$$);
+
+my $noCompressLib;
+
+# look up for file type, header chunk and end chunk, based on file signature
+my %pngLookup = (
+    "\x89PNG\r\n\x1a\n" => ['PNG', 'IHDR', 'IEND' ],
+    "\x8aMNG\r\n\x1a\n" => ['MNG', 'MHDR', 'MEND' ],
+    "\x8bJNG\r\n\x1a\n" => ['JNG', 'JHDR', 'IEND' ],
+);
+
+# map for directories in PNG images
+my %pngMap = (
+    IFD1         => 'IFD0',
+    EXIF         => 'IFD0', # to write EXIF as a block
+    ExifIFD      => 'IFD0',
+    GPS          => 'IFD0',
+    SubIFD       => 'IFD0',
+    GlobParamIFD => 'IFD0',
+    PrintIM      => 'IFD0',
+    InteropIFD   => 'ExifIFD',
+    MakerNotes   => 'ExifIFD',
+    IFD0         => 'PNG',
+    XMP          => 'PNG',
+    ICC_Profile  => 'PNG',
+    Photoshop    => 'PNG',
+    IPTC         => 'Photoshop',
+    MakerNotes   => 'ExifIFD',
+);
+
+# color type of current image
+$Image::ExifTool::PNG::colorType = -1;
+
+# PNG chunks
+%Image::ExifTool::PNG::Main = (
+    WRITE_PROC => \&Image::ExifTool::DummyWriteProc,
+    GROUPS => { 2 => 'Image' },
+    PREFERRED => 1, # always add these tags when writing
+    NOTES => q{
+        Tags extracted from PNG images.  See
+        L<http://www.libpng.org/pub/png/spec/1.2/> for the official PNG 1.2
+        specification.
+    },
+    bKGD => {
+        Name => 'BackgroundColor',
+        ValueConv => 'join(" ",unpack(length($val) < 2 ? "C" : "n*", $val))',
+    },
+    cHRM => {
+        Name => 'PrimaryChromaticities',
+        SubDirectory => { TagTable => 'Image::ExifTool::PNG::PrimaryChromaticities' },
+    },
+    dSIG => {
+        Name => 'DigitalSignature',
+        Binary => 1,
+    },
+    fRAc => {
+        Name => 'FractalParameters',
+        Binary => 1,
+    },
+    gAMA => {
+        Name => 'Gamma',
+        ValueConv => 'my $a=unpack("N",$val);$a ? int(1e9/$a+0.5)/1e4 : $val',
+    },
+    gIFg => {
+        Name => 'GIFGraphicControlExtension',
+        Binary => 1,
+    },
+    gIFt => {
+        Name => 'GIFPlainTextExtension',
+        Binary => 1,
+    },
+    gIFx => {
+        Name => 'GIFApplicationExtension',
+        Binary => 1,
+    },
+    hIST => {
+        Name => 'PaletteHistogram',
+        Binary => 1,
+    },
+    iCCP => {
+        Name => 'ICC_Profile',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::ICC_Profile::Main',
+            ProcessProc => \&ProcessPNG_Compressed,
+        },
+    },
+#   IDAT
+#   IEND
+    IHDR => {
+        Name => 'ImageHeader',
+        SubDirectory => { TagTable => 'Image::ExifTool::PNG::ImageHeader' },
+    },
+    iTXt => {
+        Name => 'InternationalText',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::PNG::TextualData',
+            ProcessProc => \&ProcessPNG_iTXt,
+        },
+    },
+    oFFs => {
+        Name => 'ImageOffset',
+        ValueConv => q{
+            my @a = unpack("NNC",$val);
+            $a[2] = ($a[2] ? "microns" : "pixels");
+            return "$a[0], $a[1] ($a[2])";
+        },
+    },
+    pCAL => {
+        Name => 'PixelCalibration',
+        Binary => 1,
+    },
+    pHYs => {
+        Name => 'PhysicalPixel',
+        SubDirectory => { TagTable => 'Image::ExifTool::PNG::PhysicalPixel' },
+    },
+    PLTE => {
+        Name => 'Palette',
+        ValueConv => 'length($val) <= 3 ? join(" ",unpack("C*",$val)) : \$val',
+    },
+    sBIT => {
+        Name => 'SignificantBits',
+        ValueConv => 'join(" ",unpack("C*",$val))',
+    },
+    sCAL => { # png 1.4.0
+        Name => 'SubjectScale',
+        SubDirectory => { TagTable => 'Image::ExifTool::PNG::SubjectScale' },
+    },
+    sPLT => {
+        Name => 'SuggestedPalette',
+        Binary => 1,
+        PrintConv => 'split("\0",$$val,1)', # extract palette name
+    },
+    sRGB => {
+        Name => 'SRGBRendering',
+        ValueConv => 'unpack("C",$val)',
+        PrintConv => {
+            0 => 'Perceptual',
+            1 => 'Relative Colorimetric',
+            2 => 'Saturation',
+            3 => 'Absolute Colorimetric',
+        },
+    },
+    sTER => { # png 1.4.0
+        Name => 'StereoImage',
+        SubDirectory => { TagTable => 'Image::ExifTool::PNG::StereoImage' },
+    },
+    tEXt => {
+        Name => 'TextualData',
+        SubDirectory => { TagTable => 'Image::ExifTool::PNG::TextualData' },
+    },
+    tIME => {
+        Name => 'ModifyDate',
+        Groups => { 2 => 'Time' },
+        Writable => 1,
+        Shift => 'Time',
+        ValueConv => 'sprintf("%.4d:%.2d:%.2d %.2d:%.2d:%.2d", unpack("nC5", $val))',
+        ValueConvInv => q{
+            my @a = ($val=~/^(\d+):(\d+):(\d+)\s+(\d+):(\d+):(\d+)/);
+            @a == 6 or warn('Invalid date'), return undef;
+            return pack('nC5', @a);
+        },
+        PrintConv => '$self->ConvertDateTime($val)',
+        PrintConvInv => '$self->InverseDateTime($val)',
+    },
+    tRNS => {
+        Name => 'Transparency',
+        ValueConv => q{
+            return \$val if length($val) > 6;
+            join(" ",unpack($Image::ExifTool::PNG::colorType == 3 ? "C*" : "n*", $val));
+        },
+    },
+    tXMP => {
+        Name => 'XMP',
+        Notes => 'obsolete location specified by older XMP draft',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' },
+    },
+    vpAg => { # private imagemagick chunk
+        Name => 'VirtualPage',
+        SubDirectory => { TagTable => 'Image::ExifTool::PNG::VirtualPage' },
+    },
+    zTXt => {
+        Name => 'CompressedText',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::PNG::TextualData',
+            ProcessProc => \&ProcessPNG_Compressed,
+        },
+    },
+);
+
+# PNG IHDR chunk
+%Image::ExifTool::PNG::ImageHeader = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    0 => {
+        Name => 'ImageWidth',
+        Format => 'int32u',
+    },
+    4 => {
+        Name => 'ImageHeight',
+        Format => 'int32u',
+    },
+    8 => 'BitDepth',
+    9 => {
+        Name => 'ColorType',
+        RawConv => '$Image::ExifTool::PNG::colorType = $val',
+        PrintConv => {
+            0 => 'Grayscale',
+            2 => 'RGB',
+            3 => 'Palette',
+            4 => 'Grayscale with Alpha',
+            6 => 'RGB with Alpha',
+        },
+    },
+    10 => {
+        Name => 'Compression',
+        PrintConv => { 0 => 'Deflate/Inflate' },
+    },
+    11 => {
+        Name => 'Filter',
+        PrintConv => { 0 => 'Adaptive' },
+    },
+    12 => {
+        Name => 'Interlace',
+        PrintConv => { 0 => 'Noninterlaced', 1 => 'Adam7 Interlace' },
+    },
+);
+
+# PNG cHRM chunk
+%Image::ExifTool::PNG::PrimaryChromaticities = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    FORMAT => 'int32u',
+    0 => { Name => 'WhitePointX', ValueConv => '$val / 100000' },
+    1 => { Name => 'WhitePointY', ValueConv => '$val / 100000' },
+    2 => { Name => 'RedX',        ValueConv => '$val / 100000' },
+    3 => { Name => 'RedY',        ValueConv => '$val / 100000' },
+    4 => { Name => 'GreenX',      ValueConv => '$val / 100000' },
+    5 => { Name => 'GreenY',      ValueConv => '$val / 100000' },
+    6 => { Name => 'BlueX',       ValueConv => '$val / 100000' },
+    7 => { Name => 'BlueY',       ValueConv => '$val / 100000' },
+);
+
+# PNG pHYs chunk
+%Image::ExifTool::PNG::PhysicalPixel = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    0 => {
+        Name => 'PixelsPerUnitX',
+        Format => 'int32u',
+    },
+    4 => {
+        Name => 'PixelsPerUnitY',
+        Format => 'int32u',
+    },
+    8 => {
+        Name => 'PixelUnits',
+        PrintConv => { 0 => 'Unknown', 1 => 'Meters' },
+    },
+);
+
+# PNG sCAL chunk
+%Image::ExifTool::PNG::SubjectScale = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    0 => {
+        Name => 'SubjectUnits',
+        PrintConv => { 1 => 'Meters', 2 => 'Radians' },
+    },
+    1 => {
+        Name => 'SubjectPixelWidth',
+        Format => 'var_string',
+    },
+    2 => {
+        Name => 'SubjectPixelHeight',
+        Format => 'var_string',
+    },
+);
+
+# PNG vpAg chunk
+%Image::ExifTool::PNG::VirtualPage = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    FORMAT => 'int32u',
+    0 => 'VirtualImageWidth',
+    1 => 'VirtualImageHeight',
+    2 => {
+        Name => 'VirtualPageUnits',
+        Format => 'int8u',
+        # what is the conversion for this?
+    },
+);
+
+# PNG sTER chunk
+%Image::ExifTool::PNG::StereoImage = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    0 => {
+        Name => 'StereoMode',
+        PrintConv => {
+            0 => 'Cross-fuse Layout',
+            1 => 'Diverging-fuse Layout',
+        },
+    },
+);
+
+my %unreg = ( Notes => 'unregistered' );
+
+# Tags for PNG tEXt zTXt and iTXt chunks
+# (NOTE: ValueConv is set dynamically, so don't set it here!)
+%Image::ExifTool::PNG::TextualData = (
+    PROCESS_PROC => \&ProcessPNG_tEXt,
+    WRITE_PROC => \&Image::ExifTool::DummyWriteProc,
+    WRITABLE => 'string',
+    PREFERRED => 1, # always add these tags when writing
+    GROUPS => { 2 => 'Image' },
+    LANG_INFO => \&GetLangInfo,
+    NOTES => q{
+        The PNG TextualData format allows arbitrary tag names to be used.  The tags
+        listed below are the only ones that can be written (unless new user-defined
+        tags are added via the configuration file), however ExifTool will extract
+        any other TextualData tags that are found.
+        
+        These tags may be stored as tEXt, zTXt or iTXt chunks in the PNG image.  By
+        default ExifTool writes new string-value tags as as uncompressed tEXt, or
+        compressed zTXt if the Compress (-z) option is used and Compress::Zlib is
+        available.  Alternate language tags and values containing special characters
+        (unless the Latin character set is used) are written as iTXt, and compressed
+        if the Compress option is used and Compress::Zlib is available.  Raw profile
+        information is always created as compressed zTXt if Compress::Zlib is
+        available, or tEXt otherwise.  Standard XMP is written as uncompressed iTXt.
+
+        Alternate languages are accessed by suffixing the tag name with a '-',
+        followed by an RFC 3066 language code (ie. "PNG:Comment-fr", or
+        "Title-en-US").  See L<http://www.ietf.org/rfc/rfc3066.txt> for the RFC 3066
+        specification.
+
+        Some of the tags below are not registered as part of the PNG specification,
+        but are included here because they are generated by other software such as
+        ImageMagick.
+    },
+    Title       => { },
+    Author      => { Groups => { 2 => 'Author' } },
+    Description => { },
+    Copyright   => { Groups => { 2 => 'Author' } },
+   'Creation Time' => {
+        Name => 'CreationTime',
+        Groups => { 2 => 'Time' },
+        Shift => 'Time',
+    },
+    Software    => { },
+    Disclaimer  => { },
+    # change name to differentiate from ExifTool Warning
+    Warning     => { Name => 'PNGWarning', },
+    Source      => { },
+    Comment     => { },
+#
+# The following tags are not part of the original PNG specification,
+# but are written by ImageMagick and other software
+#
+    Artist      => { %unreg, Groups => { 2 => 'Author' } },
+    Document    => { %unreg },
+    Label       => { %unreg },
+    Make        => { %unreg, Groups => { 2 => 'Camera' } },
+    Model       => { %unreg, Groups => { 2 => 'Camera' } },
+   'create-date'=> {
+        Name => 'CreateDate',
+        Groups => { 2 => 'Time' },
+        Shift => 'Time',
+        %unreg,
+        ValueConv => 'require Image::ExifTool::XMP; Image::ExifTool::XMP::ConvertXMPDate($val)',
+        ValueConvInv => 'require Image::ExifTool::XMP; Image::ExifTool::XMP::FormatXMPDate($val)',
+        PrintConv => '$self->ConvertDateTime($val)',
+        PrintConvInv => '$self->InverseDateTime($val,undef,1)',
+    },
+   'modify-date'=> {
+        Name => 'ModDate', # (to distinguish from tIME chunk "ModifyDate")
+        Groups => { 2 => 'Time' },
+        Shift => 'Time',
+        %unreg,
+        ValueConv => 'require Image::ExifTool::XMP; Image::ExifTool::XMP::ConvertXMPDate($val)',
+        ValueConvInv => 'require Image::ExifTool::XMP; Image::ExifTool::XMP::FormatXMPDate($val)',
+        PrintConv => '$self->ConvertDateTime($val)',
+        PrintConvInv => '$self->InverseDateTime($val,undef,1)',
+    },
+    TimeStamp   => { %unreg, Groups => { 2 => 'Time' }, Shift => 'Time' },
+    URL         => { %unreg },
+   'XML:com.adobe.xmp' => {
+        Name => 'XMP',
+        Notes => q{
+            unregistered, but this is the location according to the XMP specification,
+            and is where ExifTool will add a new XMP chunk if the image didn't already
+            contain XMP
+        },
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::XMP::Main',
+        },
+    },
+   'Raw profile type APP1' => [
+        {
+            # EXIF table must come first because we key on this in ProcessProfile()
+            # (No condition because this is just for BuildTagLookup)
+            Name => 'APP1_Profile',
+            %unreg,
+            SubDirectory => {
+                TagTable=>'Image::ExifTool::Exif::Main',
+                ProcessProc => \&ProcessProfile,
+            },
+        },
+        {
+            Name => 'APP1_Profile',
+            SubDirectory => {
+                TagTable=>'Image::ExifTool::XMP::Main',
+                ProcessProc => \&ProcessProfile,
+            },
+        },
+    ],
+   'Raw profile type exif' => {
+        Name => 'EXIF_Profile',
+        %unreg,
+        SubDirectory => {
+            TagTable=>'Image::ExifTool::Exif::Main',
+            ProcessProc => \&ProcessProfile,
+        },
+    },
+   'Raw profile type icc' => {
+        Name => 'ICC_Profile',
+        %unreg,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::ICC_Profile::Main',
+            ProcessProc => \&ProcessProfile,
+        },
+    },
+   'Raw profile type icm' => {
+        Name => 'ICC_Profile',
+        %unreg,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::ICC_Profile::Main',
+            ProcessProc => \&ProcessProfile,
+        },
+    },
+   'Raw profile type iptc' => {
+        Name => 'IPTC_Profile',
+        %unreg,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Photoshop::Main',
+            ProcessProc => \&ProcessProfile,
+        },
+    },
+   'Raw profile type xmp' => {
+        Name => 'XMP_Profile',
+        %unreg,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::XMP::Main',
+            ProcessProc => \&ProcessProfile,
+        },
+    },
+);
+
+#------------------------------------------------------------------------------
+# AutoLoad our writer routines when necessary
+#
+sub AUTOLOAD
+{
+    return Image::ExifTool::DoAutoLoad($AUTOLOAD, @_);
+}
+
+#------------------------------------------------------------------------------
+# Get standard case for language code (this routine copied from XMP.pm)
+# Inputs: 0) Language code
+# Returns: Language code in standard case
+sub StandardLangCase($)
+{
+    my $lang = shift;
+    # make 2nd subtag uppercase only if it is 2 letters
+    return lc($1) . uc($2) . lc($3) if $lang =~ /^([a-z]{2,3}|[xi])(-[a-z]{2})\b(.*)/i;
+    return lc($lang);
+}
+
+#------------------------------------------------------------------------------
+# Get localized version of tagInfo hash
+# Inputs: 0) tagInfo hash ref, 1) language code (ie. "x-default")
+# Returns: new tagInfo hash ref, or undef if invalid
+sub GetLangInfo($$)
+{
+    my ($tagInfo, $lang) = @_;
+    $lang =~ tr/_/-/;   # RFC 3066 specifies '-' as a separator
+    # no alternate languages for XMP or raw profile directories
+    return undef if $$tagInfo{SubDirectory};
+    # language code must normalized for use in tag ID
+    return Image::ExifTool::GetLangInfo($tagInfo, StandardLangCase($lang));
+}
+
+#------------------------------------------------------------------------------
+# Found a PNG tag -- extract info from subdirectory or decompress data if necessary
+# Inputs: 0) ExifTool object reference, 1) Pointer to tag table,
+#         2) Tag ID, 3) Tag value, 4) [optional] compressed data flag:
+#            0=not compressed, 1=unknown compression, 2-N=compression with type N-2
+#         5) optional output buffer ref, 6) character encoding (tEXt/zTXt/iTXt only)
+#         6) optional language code
+# Returns: 1 on success
+sub FoundPNG($$$$;$$$$)
+{
+    my ($exifTool, $tagTablePtr, $tag, $val, $compressed, $outBuff, $enc, $lang) = @_;
+    return 0 unless defined $val;
+    my $verbose = $exifTool->Options('Verbose');
+    my $id = $tag;  # generate tag ID which include language code
+    if ($lang) {
+        # case of language code must be normalized since they are case insensitive
+        $lang = StandardLangCase($lang);
+        $id .= '-' . $lang;
+    }
+    my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $id) ||
+                  # (some software forgets to capitalize first letter)
+                  $exifTool->GetTagInfo($tagTablePtr, ucfirst($id));
+    # create alternate language tag if necessary
+    if (not $tagInfo and $lang) {
+        $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag) ||
+                   $exifTool->GetTagInfo($tagTablePtr, ucfirst($tag));
+        $tagInfo = GetLangInfo($tagInfo, $lang) if $tagInfo;
+    }
+#
+# uncompress data if necessary
+#
+    my ($wasCompressed, $deflateErr);
+    if ($compressed and $compressed > 1) {
+        if ($compressed == 2) { # Inflate/Deflate compression
+            if (eval 'require Compress::Zlib') {
+                my ($v2, $stat);
+                my $inflate = Compress::Zlib::inflateInit();
+                $inflate and ($v2, $stat) = $inflate->inflate($val);
+                if ($inflate and $stat == Compress::Zlib::Z_STREAM_END()) {
+                    $val = $v2;
+                    $compressed = 0;
+                    $wasCompressed = 1;
+                } else {
+                    $deflateErr = "Error inflating $tag";
+                }
+            } elsif (not $noCompressLib) {
+                $deflateErr = "Install Compress::Zlib to read compressed information";
+            } else {
+                $deflateErr = '';   # flag deflate error but no warning
+            }
+        } else {
+            $compressed -= 2;
+            $deflateErr = "Unknown compression method $compressed for $tag";
+        }
+        if ($compressed and $verbose and $tagInfo and $$tagInfo{SubDirectory}) {
+            $exifTool->VerboseDir("Unable to decompress $$tagInfo{Name}", 0, length($val));
+        }
+        # issue warning if relevant
+        if ($deflateErr and (not $outBuff or
+            ($tagInfo and $$tagInfo{SubDirectory} and $$exifTool{EDIT_DIRS}{$$tagInfo{Name}})))
+        {
+            $exifTool->Warn($deflateErr);
+            $noCompressLib = 1 if $deflateErr =~ /^Install/;
+        }
+    }
+    # translate character encoding if necessary (tEXt/zTXt/iTXt string values only)
+    if ($enc and not $compressed and not ($tagInfo and $$tagInfo{SubDirectory})) {
+        $val = $exifTool->Decode($val, $enc);
+    }
+#
+# extract information from subdirectory if available
+#
+    if ($tagInfo) {
+        my $tagName = $$tagInfo{Name};
+        my $processed;
+        if ($$tagInfo{SubDirectory} and not $compressed) {
+            my $len = length $val;
+            if ($verbose and $exifTool->{INDENT} ne '  ') {
+                if ($wasCompressed and $verbose > 2) {
+                    my $name = $tagName;
+                    $wasCompressed and $name = "Decompressed $name";
+                    $exifTool->VerboseDir($name, 0, $len);
+                    $exifTool->VerboseDump(\$val);
+                }
+                # don't indent next directory (since it is really the same data)
+                $exifTool->{INDENT} =~ s/..$//;
+            }
+            my $subdir = $$tagInfo{SubDirectory};
+            my $processProc = $$subdir{ProcessProc};
+            # nothing more to do if writing and subdirectory is not writable
+            my $subTable = GetTagTable($$subdir{TagTable});
+            return 1 if $outBuff and not $$subTable{WRITE_PROC};
+            my %subdirInfo = (
+                DataPt   => \$val,
+                DirStart => 0,
+                DataLen  => $len,
+                DirLen   => $len,
+                DirName  => $tagName,
+                TagInfo  => $tagInfo,
+                ReadOnly => 1, # (only used by WriteXMP)
+                OutBuff  => $outBuff,
+            );
+            # no need to re-decompress if already done
+            undef $processProc if $wasCompressed and $processProc eq \&ProcessPNG_Compressed;
+            # rewrite this directory if necessary (but always process TextualData normally)
+            if ($outBuff and not $processProc and $subTable ne \%Image::ExifTool::PNG::TextualData) {
+                return 1 unless $exifTool->{EDIT_DIRS}->{$tagName};
+                $$outBuff = $exifTool->WriteDirectory(\%subdirInfo, $subTable);
+                # if this was an XMP directory, we must make it read-only
+                $tagName eq 'XMP' and Image::ExifTool::XMP::ValidateXMP(\$outBuff,'r');
+                delete $exifTool->{ADD_DIRS}->{$tagName};
+            } else {
+                $processed = $exifTool->ProcessDirectory(\%subdirInfo, $subTable, $processProc);
+            }
+            $compressed = 1;    # pretend this is compressed since it is binary data
+        }
+        if ($outBuff) {
+            my $writable = $tagInfo->{Writable};
+            my $isOverwriting;
+            if ($writable or ($$tagTablePtr{WRITABLE} and
+                not defined $writable and not $$tagInfo{SubDirectory}))
+            {
+                # write new value for this tag if necessary
+                my $newVal;
+                if ($exifTool->{DEL_GROUP}->{PNG}) {
+                    # remove this tag now, but keep in ADD_PNG list to add back later
+                    $isOverwriting = 1;
+                } else {
+                    # remove this from the list of PNG tags to add
+                    delete $exifTool->{ADD_PNG}->{$id};
+                    # (also handle case of tEXt tags written with lowercase first letter)
+                    delete $exifTool->{ADD_PNG}->{ucfirst($id)};
+                    my $nvHash = $exifTool->GetNewValueHash($tagInfo);
+                    $isOverwriting = Image::ExifTool::IsOverwriting($nvHash);
+                    if (defined $deflateErr) {
+                        $newVal = Image::ExifTool::GetNewValues($nvHash);
+                        # can only write tag now if always overwriting
+                        if ($isOverwriting > 0) {
+                            $val = '<deflate error>';
+                        } elsif ($isOverwriting) {
+                            $isOverwriting = 0; # can't overwrite
+                            $exifTool->Warn($deflateErr) if $deflateErr;
+                        }
+                    } else {
+                        if ($isOverwriting < 0) {
+                            $isOverwriting = Image::ExifTool::IsOverwriting($nvHash, $val);
+                        }
+                        # (must get new value after IsOverwriting() in case it was shifted)
+                        $newVal = Image::ExifTool::GetNewValues($nvHash);
+                    }
+                }
+                if ($isOverwriting) {
+                    $$outBuff = (defined $newVal) ? $newVal : '';
+                    ++$exifTool->{CHANGED};
+                    $exifTool->VerboseValue("- PNG:$tagName", $val);
+                    $exifTool->VerboseValue("+ PNG:$tagName", $newVal) if defined $newVal;
+                }
+            }
+            if (defined $$outBuff and length $$outBuff) {
+                if ($enc) { # must be tEXt/zTXt/iTXt if $enc is set
+                    $$outBuff = BuildTextChunk($exifTool, $tag, $tagInfo, $$outBuff, $lang);
+                } elsif ($wasCompressed) {
+                    # re-compress the output data
+                    my $deflate;
+                    if (eval 'require Compress::Zlib') {
+                        my $deflate = Compress::Zlib::deflateInit();
+                        if ($deflate) {
+                            $$outBuff = $deflate->deflate($$outBuff);
+                            $$outBuff .= $deflate->flush() if defined $$outBuff;
+                        } else {
+                            undef $$outBuff;
+                        }
+                    }
+                    $$outBuff or $exifTool->Warn("PNG:$tagName not written (compress error)");
+                }
+            }
+            return 1;
+        }
+        return 1 if $processed;
+    } else {
+        my $name;
+        ($name = $tag) =~ s/\s+(.)/\u$1/g;   # remove white space from tag name
+        $tagInfo = { Name => $name };
+        $$tagInfo{LangCode} = $lang if $lang;
+        # make unknown profiles binary data type
+        $$tagInfo{Binary} = 1 if $tag =~ /^Raw profile type /;
+        Image::ExifTool::AddTagToTable($tagTablePtr, $tag, $tagInfo);
+    }
+#
+# store this tag information
+#
+    if ($verbose) {
+        # temporarily remove subdirectory so it isn't printed in verbose information
+        # since we aren't decoding it anyway;
+        my $subdir = $$tagInfo{SubDirectory};
+        delete $$tagInfo{SubDirectory};
+        $exifTool->VerboseInfo($tag, $tagInfo,
+            Table  => $tagTablePtr,
+            DataPt => \$val,
+        );
+        $$tagInfo{SubDirectory} = $subdir if $subdir;
+    }
+    # set the RawConv dynamically depending on whether this is binary or not
+    my $delRawConv;
+    if ($compressed and not defined $$tagInfo{ValueConv}) {
+        $$tagInfo{RawConv} = '\$val';
+        $delRawConv = 1;
+    }
+    $exifTool->FoundTag($tagInfo, $val);
+    delete $$tagInfo{RawConv} if $delRawConv;
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Process encoded PNG profile information
+# Inputs: 0) ExifTool object reference, 1) DirInfo reference, 2) Pointer to tag table
+# Returns: 1 on success
+sub ProcessProfile($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $tagInfo = $$dirInfo{TagInfo};
+    my $outBuff = $$dirInfo{OutBuff};
+    my $tagName = $$tagInfo{Name};
+
+    # ImageMagick 5.3.6 writes profiles with the following headers:
+    # "\nICC Profile\n", "\nIPTC profile\n", "\n\xaa\x01{generic prof\n"
+    # and "\ngeneric profile\n"
+    return 0 unless $$dataPt =~ /^\n(.*?)\n\s*(\d+)\n(.*)/s;
+    my ($profileType, $len) = ($1, $2);
+    # data is encoded in hex, so change back to binary
+    my $buff = pack('H*', join('',split(' ',$3)));
+    my $actualLen = length $buff;
+    if ($len ne $actualLen) {
+        $exifTool->Warn("$tagName is wrong size (should be $len bytes but is $actualLen)");
+        $len = $actualLen;
+    }
+    my $verbose = $exifTool->Options('Verbose');
+    if ($verbose) {
+        if ($verbose > 2) {
+            $exifTool->VerboseDir("Decoded $tagName", 0, $len);
+            $exifTool->VerboseDump(\$buff);
+        }
+        # don't indent next directory (since it is really the same data)
+        $exifTool->{INDENT} =~ s/..$//;
+    }
+    my %dirInfo = (
+        Parent   => 'PNG',
+        DataPt   => \$buff,
+        DataLen  => $len,
+        DirStart => 0,
+        DirLen   => $len,
+        Base     => 0,
+        OutFile  => $outBuff,
+    );
+    my $processed = 0;
+    my $oldChanged = $exifTool->{CHANGED};
+    my $exifTable = GetTagTable('Image::ExifTool::Exif::Main');
+    my $editDirs = $exifTool->{EDIT_DIRS};
+    my $addDirs = $exifTool->{ADD_DIRS};
+    if ($tagTablePtr ne $exifTable) {
+        # process non-EXIF and non-APP1 profile as-is
+        if ($outBuff) {
+            # no need to rewrite this if not editing tags in this directory
+            my $dir = $tagName;
+            $dir =~ s/_Profile// unless $dir =~ /^ICC/;
+            return 1 unless $$editDirs{$dir};
+            $$outBuff = $exifTool->WriteDirectory(\%dirInfo, $tagTablePtr);
+            delete $$addDirs{$dir};
+        } else {
+            $processed = $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+        }
+    } elsif ($buff =~ /^$Image::ExifTool::exifAPP1hdr/) {
+        # APP1 EXIF information
+        return 1 if $outBuff and not $$editDirs{IFD0};
+        my $hdrLen = length($Image::ExifTool::exifAPP1hdr);
+        $dirInfo{DirStart} += $hdrLen;
+        $dirInfo{DirLen} -= $hdrLen;
+        if ($outBuff) {
+            $$outBuff = $exifTool->WriteDirectory(\%dirInfo, $tagTablePtr,
+                                                  \&Image::ExifTool::WriteTIFF);
+            $$outBuff = $Image::ExifTool::exifAPP1hdr . $$outBuff if $$outBuff;
+            delete $$addDirs{IFD0};
+        } else {
+            $processed = $exifTool->ProcessTIFF(\%dirInfo);
+        }
+    } elsif ($buff =~ /^$Image::ExifTool::xmpAPP1hdr/) {
+        # APP1 XMP information
+        my $hdrLen = length($Image::ExifTool::xmpAPP1hdr);
+        my $tagTablePtr = GetTagTable('Image::ExifTool::XMP::Main');
+        $dirInfo{DirStart} += $hdrLen;
+        $dirInfo{DirLen} -= $hdrLen;
+        if ($outBuff) {
+            return 1 unless $$editDirs{XMP};
+            $$outBuff = $exifTool->WriteDirectory(\%dirInfo, $tagTablePtr);
+            $$outBuff and $$outBuff = $Image::ExifTool::xmpAPP1hdr . $$outBuff;
+            delete $$addDirs{XMP};
+        } else {
+            $processed = $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+        }
+    } elsif ($buff =~ /^(MM\0\x2a|II\x2a\0)/) {
+        # TIFF information (haven't seen this, but what the heck...)
+        return 1 if $outBuff and not $$editDirs{IFD0};
+        if ($outBuff) {
+            $$outBuff = $exifTool->WriteDirectory(\%dirInfo, $tagTablePtr,
+                                                  \&Image::ExifTool::WriteTIFF);
+            $$outBuff = $Image::ExifTool::exifAPP1hdr . $$outBuff if $$outBuff;
+            delete $$addDirs{IFD0};
+        } else {
+            $processed = $exifTool->ProcessTIFF(\%dirInfo);
+        }
+    } else {
+        my $profName = $profileType;
+        $profName =~ tr/\x00-\x1f\x7f-\xff/./;
+        $exifTool->Warn("Unknown raw profile '$profName'");
+    }
+    if ($outBuff and defined $$outBuff and length $$outBuff) {
+        if ($exifTool->{CHANGED} != $oldChanged) {
+            my $hdr = sprintf("\n%s\n%8d\n", $profileType, length($$outBuff));
+            # hex encode the data
+            $$outBuff = $hdr . HexEncode($outBuff);
+        } else {
+            undef $$outBuff;
+        }
+    }
+    return $processed;
+}
+
+#------------------------------------------------------------------------------
+# Process PNG compressed zTXt or iCCP chunk
+# Inputs: 0) ExifTool object reference, 1) DirInfo reference, 2) Pointer to tag table
+# Returns: 1 on success
+# Notes: writes new chunk data to ${$$dirInfo{OutBuff}} if writing tag
+sub ProcessPNG_Compressed($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($tag, $val) = split /\0/, ${$$dirInfo{DataPt}}, 2;
+    return 0 unless defined $val;
+    # set compressed to 2 + compression method to decompress the data
+    my $compressed = 2 + unpack('C', $val);
+    my $hdr = $tag . "\0" . substr($val, 0, 1);
+    $val = substr($val, 1); # remove compression method byte
+    my $success;
+    my $outBuff = $$dirInfo{OutBuff};
+    # use the PNG chunk tag instead of the embedded tag name for iCCP chunks
+    if ($$dirInfo{TagInfo} and $$dirInfo{TagInfo}->{Name} eq 'ICC_Profile') {
+        $tag = 'iCCP';
+        $tagTablePtr = \%Image::ExifTool::PNG::Main;
+        $success = FoundPNG($exifTool, $tagTablePtr, $tag, $val, $compressed, $outBuff);
+        $$outBuff = $hdr . $$outBuff if $outBuff and $$outBuff;
+    } else {
+        $success = FoundPNG($exifTool, $tagTablePtr, $tag, $val, $compressed, $outBuff, 'Latin');
+    }
+    return $success;
+}
+
+#------------------------------------------------------------------------------
+# Process PNG tEXt chunk
+# Inputs: 0) ExifTool object reference, 1) DirInfo reference, 2) Pointer to tag table
+# Returns: 1 on success
+# Notes: writes new chunk data to ${$$dirInfo{OutBuff}} if writing tag
+sub ProcessPNG_tEXt($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($tag, $val) = split /\0/, ${$$dirInfo{DataPt}}, 2;
+    my $outBuff = $$dirInfo{OutBuff};
+    return FoundPNG($exifTool, $tagTablePtr, $tag, $val, undef, $outBuff, 'Latin');
+}
+
+#------------------------------------------------------------------------------
+# Process PNG iTXt chunk
+# Inputs: 0) ExifTool object reference, 1) DirInfo reference, 2) Pointer to tag table
+# Returns: 1 on success
+# Notes: writes new chunk data to ${$$dirInfo{OutBuff}} if writing tag
+sub ProcessPNG_iTXt($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my ($tag, $dat) = split /\0/, ${$$dirInfo{DataPt}}, 2;
+    return 0 unless defined $dat and length($dat) >= 4;
+    my ($compressed, $meth) = unpack('CC', $dat);
+    my ($lang, $trans, $val) = split /\0/, substr($dat, 2), 3;
+    # set compressed flag so we will decompress it in FoundPNG()
+    $compressed and $compressed = 2 + $meth;
+    my $outBuff = $$dirInfo{OutBuff};
+    return FoundPNG($exifTool, $tagTablePtr, $tag, $val, $compressed, $outBuff, 'UTF8', $lang);
+}
+
+#------------------------------------------------------------------------------
+# Extract meta information from a PNG image
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 on success, 0 if this wasn't a valid PNG image, or -1 on write error
+sub ProcessPNG($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $outfile = $$dirInfo{OutFile};
+    my $raf = $$dirInfo{RAF};
+    my $datChunk = '';
+    my $datCount = 0;
+    my $datBytes = 0;
+    my ($sig, $err, $ok);
+
+    # check to be sure this is a valid PNG/MNG/JNG image
+    return 0 unless $raf->Read($sig,8) == 8 and $pngLookup{$sig};
+    if ($outfile) {
+        delete $$exifTool{TextChunkType};
+        Write($outfile, $sig) or $err = 1 if $outfile;
+        # can only add tags in Main and TextualData tables
+        $exifTool->{ADD_PNG} = $exifTool->GetNewTagInfoHash(
+            \%Image::ExifTool::PNG::Main,
+            \%Image::ExifTool::PNG::TextualData);
+        # initialize with same directories, with PNG tags taking priority
+        $exifTool->InitWriteDirs(\%pngMap,'PNG');
+    }
+    my ($fileType, $hdrChunk, $endChunk) = @{$pngLookup{$sig}};
+    $exifTool->SetFileType($fileType);  # set the FileType tag
+    SetByteOrder('MM'); # PNG files are big-endian
+    my $tagTablePtr = GetTagTable('Image::ExifTool::PNG::Main');
+    my $mngTablePtr;
+    if ($fileType ne 'PNG') {
+        $mngTablePtr = GetTagTable('Image::ExifTool::MNG::Main');
+    }
+    my $verbose = $exifTool->Options('Verbose');
+    my $out = $exifTool->Options('TextOut');
+    my ($hbuf, $dbuf, $cbuf, $foundHdr);
+
+    # process the PNG/MNG/JNG chunks
+    undef $noCompressLib;
+    for (;;) {
+        $raf->Read($hbuf,8) == 8 or $exifTool->Warn("Truncated $fileType image"), last;
+        my ($len, $chunk) = unpack('Na4',$hbuf);
+        $len > 0x7fffffff and $exifTool->Warn("Invalid $fileType box size"), last;
+        if ($verbose) {
+            # don't dump image data chunks in verbose mode (only give count instead)
+            if ($datCount and $chunk ne $datChunk) {
+                my $s = $datCount > 1 ? 's' : '';
+                print $out "$fileType $datChunk ($datCount chunk$s, total $datBytes bytes)\n";
+                $datCount = $datBytes = 0;
+                $datChunk = '';
+            }
+            if ($chunk =~ /^(IDAT|JDAT|JDAA)$/) {
+                $datChunk = $chunk;
+                $datCount++;
+                $datBytes += $len;
+            }
+        }
+        if ($outfile) {
+            if ($chunk eq 'IEND') {
+                # add any new chunks immediately before the IEND chunk
+                AddChunks($exifTool, $outfile) or $err = 1;
+            } elsif ($chunk eq 'PLTE' or $chunk eq 'IDAT') {
+                # iCCP chunk must come before PLTE and IDAT
+                # (ignore errors -- will add later as text profile if this fails)
+                Add_iCCP($exifTool, $outfile);
+            }
+        }
+        if ($chunk eq $endChunk) {
+            if ($outfile) {
+                # copy over the rest of the file if necessary
+                Write($outfile, $hbuf) or $err = 1;
+                while ($raf->Read($hbuf, 65536)) {
+                    Write($outfile, $hbuf) or $err = 1;
+                }
+            }
+            $verbose and print $out "$fileType $chunk (end of image)\n";
+            $ok = 1;
+            last;
+        }
+        # read chunk data and CRC
+        unless ($raf->Read($dbuf,$len)==$len and $raf->Read($cbuf, 4)==4) {
+            $exifTool->Warn("Corrupted $fileType image");
+            last;
+        }
+        unless ($foundHdr) {
+            if ($chunk eq $hdrChunk) {
+                $foundHdr = 1;
+            } elsif ($hdrChunk eq 'IHDR' and $chunk eq 'CgBI') {
+                $exifTool->Warn('Non-standard PNG image (Apple iPhone format)');
+            } else {
+                $exifTool->Warn("$fileType image did not start with $hdrChunk");
+                last;
+            }
+        }
+        if ($verbose) {
+            # check CRC when in verbose mode (since we don't care about speed)
+            my $crc = CalculateCRC(\$hbuf, undef, 4);
+            $crc = CalculateCRC(\$dbuf, $crc);
+            $crc == unpack('N',$cbuf) or $exifTool->Warn("Bad CRC for $chunk chunk");
+            if ($datChunk) {
+                Write($outfile, $hbuf, $dbuf, $cbuf) or $err = 1 if $outfile;
+                next;
+            }
+            print $out "$fileType $chunk ($len bytes):\n";
+            $exifTool->VerboseDump(\$dbuf, Addr => $raf->Tell() - $len - 4) if $verbose > 2;
+        }
+        # only extract information from chunks in our tables
+        my ($theBuff, $outBuff);
+        $outBuff = \$theBuff if $outfile;
+        if ($$tagTablePtr{$chunk}) {
+            FoundPNG($exifTool, $tagTablePtr, $chunk, $dbuf, undef, $outBuff);
+        } elsif ($mngTablePtr and $$mngTablePtr{$chunk}) {
+            FoundPNG($exifTool, $mngTablePtr, $chunk, $dbuf, undef, $outBuff);
+        }
+        if ($outfile) {
+            if (defined $theBuff) {
+                next unless length $theBuff; # empty if we deleted the information
+                # change chunk type if necessary
+                if ($$exifTool{TextChunkType}) {
+                    $chunk = $$exifTool{TextChunkType};
+                    delete $$exifTool{TextChunkType};
+                }
+                $hbuf = pack('Na4', length($theBuff), $chunk);
+                $dbuf = $theBuff;
+                my $crc = CalculateCRC(\$hbuf, undef, 4);
+                $crc = CalculateCRC(\$dbuf, $crc);
+                $cbuf = pack('N', $crc);
+            }
+            Write($outfile, $hbuf, $dbuf, $cbuf) or $err = 1;
+        }
+    }
+    return -1 if $outfile and ($err or not $ok);
+    return 1;   # this was a valid PNG/MNG/JNG image
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::PNG - Read and write PNG meta information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains routines required by Image::ExifTool to read and
+write PNG (Portable Network Graphics), MNG (Multi-image Network Graphics)
+and JNG (JPEG Network Graphics) images.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.libpng.org/pub/png/spec/1.2/>
+
+=item L<http://www.faqs.org/docs/png/>
+
+=item L<http://www.libpng.org/pub/mng/>
+
+=item L<http://www.libpng.org/pub/png/spec/register/>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/PNG Tags>,
+L<Image::ExifTool::TagNames/MNG Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/PPM.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/PPM.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/PPM.pm	(revision 24799)
@@ -0,0 +1,169 @@
+#------------------------------------------------------------------------------
+# File:         PPM.pm
+#
+# Description:  Read and write PPM meta information
+#
+# Revisions:    09/03/2005 - P. Harvey Created
+#
+# References:   1) http://netpbm.sourceforge.net/doc/ppm.html
+#               2) http://netpbm.sourceforge.net/doc/pgm.html
+#               3) http://netpbm.sourceforge.net/doc/pbm.html
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::PPM;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.05';
+
+#------------------------------------------------------------------------------
+# Read or write information in a PPM/PGM/PBM image
+# Inputs: 0) ExifTool object reference, 1) Directory information reference
+# Returns: 1 on success, 0 if this wasn't a valid PPM file, -1 on write error
+sub ProcessPPM($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my $outfile = $$dirInfo{OutFile};
+    my $verbose = $exifTool->Options('Verbose');
+    my $out = $exifTool->Options('TextOut');
+    my ($buff, $num, $type, %info);
+#
+# read as much of the image as necessary to extract the header and comments
+#
+    for (;;) {
+        if (defined $buff) {
+            # need to read some more data
+            my $tmp;
+            return 0 unless $raf->Read($tmp, 1024);
+            $buff .= $tmp;
+        } else {
+            return 0 unless $raf->Read($buff, 1024);
+        }
+        # verify this is a valid PPM file
+        return 0 unless $buff =~ /^P([1-6])\s+/g;
+        $num = $1;
+        # note: may contain comments starting with '#'
+        if ($buff =~ /\G#/gc) {
+            # must read more if we are in the middle of a comment
+            next unless $buff =~ /\G ?(.*\n(#.*\n)*)\s*/g;
+            $info{Comment} = $1;
+            next if $buff =~ /\G#/gc;
+        } else {
+            delete $info{Comment};
+        }
+        next unless $buff =~ /\G(\S+)\s+(\S+)\s/g;
+        $info{ImageWidth} = $1;
+        $info{ImageHeight} = $2;
+        $type = [qw{PPM PBM PGM}]->[$num % 3];
+        last if $type eq 'PBM'; # (no MaxVal for PBM images)
+        if ($buff =~ /\G\s*#/gc) {
+            next unless $buff =~ /\G ?(.*\n(#.*\n)*)\s*/g;
+            $info{Comment} = '' unless exists $info{Comment};
+            $info{Comment} .= $1;
+            next if $buff =~ /\G#/gc;
+        }
+        next unless $buff =~ /\G(\S+)\s/g;
+        $info{MaxVal} = $1;
+        last;
+    }
+    # validate numerical values
+    foreach (keys %info) {
+        next if $_ eq 'Comment';
+        return 0 unless $info{$_} =~ /^\d+$/;
+    }
+    if (defined $info{Comment}) {
+        $info{Comment} =~ s/^# ?//mg;   # remove "# " at the start of each line
+        $info{Comment} =~ s/\n$//;      # remove trailing newline
+    }
+    $exifTool->SetFileType($type);
+    my $len = pos($buff);
+#
+# rewrite the file if requested
+#
+    if ($outfile) {
+        my $nvHash;
+        my $newComment = $exifTool->GetNewValues('Comment', \$nvHash);
+        my $oldComment = $info{Comment};
+        if (Image::ExifTool::IsOverwriting($nvHash, $oldComment)) {
+            ++$exifTool->{CHANGED};
+            $exifTool->VerboseValue('- Comment', $oldComment) if defined $oldComment;
+            $exifTool->VerboseValue('+ Comment', $newComment) if defined $newComment;
+        } else {
+            $newComment = $oldComment;  # use existing comment
+        }
+        my $hdr = "P$num\n";
+        if (defined $newComment) {
+            $newComment =~ s/\n/\n# /g;
+            $hdr .= "# $newComment\n";
+        }
+        $hdr .= "$info{ImageWidth} $info{ImageHeight}\n";
+        $hdr .= "$info{MaxVal}\n" if $type ne 'PBM';
+        # write header and start of image
+        Write($outfile, $hdr, substr($buff, $len)) or return -1;
+        # copy over the rest of the image
+        while ($raf->Read($buff, 0x10000)) {
+            Write($outfile, $buff) or return -1;
+        }
+        return 1;
+    }
+#
+# save extracted information
+#
+    if ($verbose > 2) {
+        print $out "$type header ($len bytes):\n";
+        Image::ExifTool::HexDump(\$buff, $len, Out => $out);
+    }
+    my $tag;
+    foreach $tag (qw{Comment ImageWidth ImageHeight MaxVal}) {
+        $exifTool->FoundTag($tag, $info{$tag}) if defined $info{$tag};
+    }
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::PPM - Read and write PPM meta information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to read and
+write PPM (Portable Pixel Map), PGM (Portable Gray Map) and PBM (Portable
+BitMap) images.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://netpbm.sourceforge.net/doc/ppm.html>
+
+=item L<http://netpbm.sourceforge.net/doc/pgm.html>
+
+=item L<http://netpbm.sourceforge.net/doc/pbm.html>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/PPM Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/PSP.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/PSP.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/PSP.pm	(revision 24799)
@@ -0,0 +1,305 @@
+#------------------------------------------------------------------------------
+# File:         PSP.pm
+#
+# Description:  Read Paint Shop Pro meta information
+#
+# Revisions:    2010/01/23 - P. Harvey Created
+#
+# References:   1) http://www.jasc.com/support/kb/articles/pspspec.asp
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::PSP;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::Exif;
+
+$VERSION = '1.03';
+
+sub ProcessExtData($$$);
+
+# PSP info
+%Image::ExifTool::PSP::Main = (
+    GROUPS => { 2 => 'Image' },
+    VARS => { ALPHA_FIRST => 1 },
+    NOTES => q{
+        Tags extracted from Paint Shop Pro images (PSP, PSPIMAGE, PSPFRAME,
+        PSPSHAPE, PSPTUBE and TUB extensions).
+    },
+    # FileVersions:
+    #  3.0 => PSP 5
+    #  4.0 => PSP 6
+    #  5.0 => PSP 7
+    #  6.0 => PSP 8
+    #  7.0 => PSP 9
+    #   ?  => PSP X
+    #   ?  => PSP X1 (is this the same as X?)
+    #   ?  => PSP X2
+    # 10.0 => PSP X3 (= PSP 13)
+    FileVersion => { PrintConv => '$val=~tr/ /./; $val' },
+    0  => [
+        {
+            Condition => '$$self{PSPFileVersion} > 3',
+            Name => 'ImageInfo',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::PSP::Image',
+                Start => 4,
+            },
+        },
+        {
+            Name => 'ImageInfo',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::PSP::Image',
+            },
+        },
+    ],
+    1  => {
+        Name => 'CreatorInfo',
+        SubDirectory => { TagTable => 'Image::ExifTool::PSP::Creator' },
+    },
+    10 => {
+        Name => 'ExtendedInfo',
+        SubDirectory => { TagTable => 'Image::ExifTool::PSP::Ext' },
+    },
+    # this is inside the composite image bank block (16), which I don't want to parse...
+    #18 => {
+    #    Name => 'PreviewImage',
+    #    RawConv => '$self->ValidateImage(\$val,$tag)',
+    #},
+);
+
+# the PSP image block
+%Image::ExifTool::PSP::Image = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    0 => { Name => 'ImageWidth',  Format => 'int32u' },
+    4 => { Name => 'ImageHeight', Format => 'int32u' },
+    8 => { Name => 'ImageResolution', Format => 'double' },
+    16 => {
+        Name => 'ResolutionUnit',
+        Format => 'int8u',
+        PrintConv => {
+            0 => 'None',
+            1 => 'inches',
+            2 => 'cm',
+        },
+    },
+    17 => {
+        Name => 'Compression',
+        Format => 'int16u',
+        PrintConv => {
+            0 => 'None',
+            1 => 'RLE',
+            2 => 'LZ77',
+            3 => 'JPEG',
+        },
+    },
+    19 => { Name => 'BitsPerSample',Format => 'int16u' },
+    21 => { Name => 'Planes',       Format => 'int16u' },
+    23 => { Name => 'NumColors',    Format => 'int32u' },
+);
+
+# the PSP creator data block
+%Image::ExifTool::PSP::Creator = (
+    PROCESS_PROC => \&ProcessExtData,
+    GROUPS => { 2 => 'Image' },
+    PRIORITY => 0,  # prefer EXIF if it exists
+    0 => 'Title',
+    1 => {
+        Name => 'CreateDate',
+        Format => 'int32u',
+        Groups => { 2 => 'Time' },
+        ValueConv => 'Image::ExifTool::ConvertUnixTime($val,1)',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    2 => {
+        Name => 'ModifyDate',
+        Format => 'int32u',
+        Groups => { 2 => 'Time' },
+        ValueConv => 'Image::ExifTool::ConvertUnixTime($val,1)',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    3 => {
+        Name => 'Artist',
+        Groups => { 2 => 'Author' },
+    },
+    4 => {
+        Name => 'Copyright',
+        Groups => { 2 => 'Author' },
+    },
+    5 => 'Description',
+    6 => {
+        Name => 'CreatorAppID',
+        Format => 'int32u',
+        PrintConv => {
+            0 => 'Unknown',
+            1 => 'Paint Shop Pro',
+        },
+    },
+    7 => {
+        Name => 'CreatorAppVersion',
+        Format => 'int8u',
+        Count => 4,
+        ValueConv => 'join(" ",reverse split " ", $val)', # low byte first
+        PrintConv => '$val=~tr/ /./; $val',
+    },
+);
+
+# the PSP extended data block
+%Image::ExifTool::PSP::Ext = (
+    PROCESS_PROC => \&ProcessExtData,
+    GROUPS => { 2 => 'Image' },
+    3 => {
+        Name => 'EXIFInfo', #(don't change this name, it is used in the code)
+        SubDirectory => { TagTable => 'Image::ExifTool::Exif::Main' },
+    },
+);
+
+#------------------------------------------------------------------------------
+# Extract information from the extended data block
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessExtData($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dirLen = $$dirInfo{DirLen};
+    my $pos = 0;
+    # loop through sub-blocks
+    while ($pos + 10 < $dirLen) {
+        unless (substr($$dataPt, $pos, 4) eq "~FL\0") {
+            $exifTool->Warn('Lost synchronization while reading sub blocks');
+            last;
+        }
+        my $tag = Get16u($dataPt, $pos + 4);
+        my $len = Get32u($dataPt, $pos + 6);
+        $pos += 10 + $len;
+        if ($pos > $dirLen) {
+            $exifTool->Warn("Truncated sub block ID=$tag len=$len");
+            last;
+        }
+        next unless $$tagTablePtr{$tag};
+        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag) or next;
+        my $start = $pos - $len;
+        unless ($$tagInfo{Name} eq 'EXIFInfo') {
+            $exifTool->HandleTag($tagTablePtr, $tag, undef,
+                TagInfo => $tagInfo,
+                DataPt  => $dataPt,
+                DataPos => $$dirInfo{DataPos},
+                DataLen => length $$dataPt,
+                Start   => $start,
+                Size    => $len,
+            );
+            next;
+        }
+        # validate EXIF block header and set byte order
+        next unless $len > 14 and substr($$dataPt, $pos - $len, 6) eq "Exif\0\0";
+        next unless SetByteOrder(substr($$dataPt, $start + 6, 2));
+        # This is REALLY annoying...  They use a standard TIFF offset to point to
+        # the first IFD, but after that the offsets are relative to the start of
+        # the IFD instead of the TIFF base, which means that I must handle it as a
+        # special case.  Dumb, dumb...
+        $start += 14;
+        my %dirInfo = (
+            DirName  => 'EXIF',
+            Parent   => 'PSP',
+            DataPt   => $dataPt,
+            DataPos  => -$start,        # data position relative to Base
+            DataLen  => length $$dataPt,
+            DirStart => $start,
+            Base     => $start + $$dirInfo{DataPos}, # absolute base offset
+            Multi    => 0,
+        );
+        my $exifTable = GetTagTable($$tagInfo{SubDirectory}{TagTable});
+        Image::ExifTool::Exif::ProcessExif($exifTool, \%dirInfo, $exifTable);
+        SetByteOrder('II');
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Extract information from a PSP file
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 on success, 0 if this wasn't a valid PSP file
+sub ProcessPSP($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my ($buff, $tag, $len, $err);
+    return 0 unless $raf->Read($buff, 32) == 32 and
+                    $buff eq "Paint Shop Pro Image File\x0a\x1a\0\0\0\0\0" and
+                    $raf->Read($buff, 4) == 4;
+    $exifTool->SetFileType();
+    SetByteOrder('II');
+    my $tagTablePtr = GetTagTable('Image::ExifTool::PSP::Main');
+    my @a = unpack('v*', $buff);
+    # figure out block header length for this format PSP file
+    my $hlen = $a[0] > 3 ? 10 : 14;
+    $$exifTool{PSPFileVersion} = $a[0]; # save for use in Condition
+    $exifTool->HandleTag($tagTablePtr, FileVersion => "@a");
+    # loop through blocks in file
+    my $pos = 36;
+    for (;;) {
+        last unless $raf->Read($buff, $hlen) == $hlen;
+        unless ($buff =~ /^~BK\0/) {
+            $exifTool->Warn('Lost synchronization while reading main PSP blocks');
+            last;
+        }
+        $tag = Get16u(\$buff, 4);
+        $len = Get32u(\$buff, $hlen - 4);
+        $pos += $hlen + $len;
+        unless ($$tagTablePtr{$tag}) {
+            $raf->Seek($len, 1) or $err=1, last;
+            next;
+        }
+        $raf->Read($buff, $len) == $len or $err=1, last;
+        $exifTool->HandleTag($tagTablePtr, $tag, $buff,
+            DataPt  => \$buff,
+            DataPos => $pos - $len,
+            Size    => $len,
+        );
+    }
+    $err and $exifTool->Warn("Truncated main block ID=$tag len=$len");
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::PSP - Read Paint Shop Pro meta information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains routines required by Image::ExifTool to extract
+information from Paint Shop Pro images.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.jasc.com/support/kb/articles/pspspec.asp>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/PSP Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Panasonic.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Panasonic.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Panasonic.pm	(revision 24799)
@@ -0,0 +1,1748 @@
+#------------------------------------------------------------------------------
+# File:         Panasonic.pm
+#
+# Description:  Panasonic/Leica maker notes tags
+#
+# Revisions:    11/10/2004 - P. Harvey Created
+#
+# References:   1) http://www.compton.nu/panasonic.html (based on FZ10)
+#               2) Derived from DMC-FZ3 samples from dpreview.com
+#               3) http://johnst.org/sw/exiftags/
+#               4) Tels (http://bloodgate.com/) private communication (tests with FZ5)
+#               7) http://homepage3.nifty.com/kamisaka/makernote/makernote_pana.htm (2007/10/02)
+#               8) Marcel Coenen private communication (DMC-FZ50)
+#               9) http://forums.dpreview.com/forums/read.asp?forum=1033&message=22756430
+#              10) http://bretteville.com/pdfs/M8Metadata_v2.pdf
+#              11) http://www.digital-leica.com/lens_codes/index.html
+#              12) Joerg - http://www.cpanforum.com/threads/11602 (LX3 firmware 2.0)
+#              13) Michael Byczkowski private communication (Leica M9)
+#              14) Carl Bretteville private communication (M9)
+#              15) Zdenek Mihula private communication (TZ8)
+#              JD) Jens Duttke private communication (TZ3,FZ30,FZ50)
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Panasonic;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::Exif;
+
+$VERSION = '1.59';
+
+sub ProcessPanasonicType2($$$);
+sub WhiteBalanceConv($;$$);
+
+# Leica lens types (ref 10)
+my %leicaLensType = (
+    OTHER => sub {
+        my ($val, $inv, $conv) = @_;
+        return undef if $inv or not $val =~ s/ .*//;
+        return $$conv{$val};
+    },
+    Notes => q{
+        Entries with 2 numbers give the lower 2 bits of the LensType value which are
+        used to identify certain manually coded lenses on the M9, or the focal
+        length of some multi-focal lenses.
+    },
+    # All M9 codes (two numbers: first the LensID then the lower 2 bits)
+    # are ref PH with samples from ref 13.  From ref 10, the lower 2 bits of
+    # the LensType value give the frame selector position for most lenses,
+    # although for the 28-35-50mm (at least) it gives the focal length selection.
+    # The M9 also gives the focal length selection but for other lenses the
+    # lower 3 bits don't change with frame selector position except for the lens
+    # shows as uncoded for certain lenses and some incorrect positions of the
+    # frame selector.  The bits are zero for uncoded lenses when manually coding
+    # from the menu on the M9. - PH
+    '0 0' => 'Uncoded lens',
+#
+# NOTE: MUST ADD ENTRY TO %frameSelectorBits below when a new lens is added!!!!
+#
+                                            # model number(s):
+    1 => 'Elmarit-M 21mm f/2.8',            # 11134
+    3 => 'Elmarit-M 28mm f/2.8 (III)',      # 11804
+    4 => 'Tele-Elmarit-M 90mm f/2.8 (II)',  # 11800
+    5 => 'Summilux-M 50mm f/1.4 (II)',      # 11868/11856/11114
+    6 => 'Summicron-M 35mm f/2 (IV)',       # 11310/11311
+    '6 0' => 'Summilux-M 35mm f/1.4',       # 11869/11870/11860
+    7 => 'Summicron-M 90mm f/2 (II)',       # 11136/11137
+    9 => 'Elmarit-M 135mm f/2.8 (I/II)',    # 11829
+    '9 0' => 'Apo-Telyt-M 135mm f/3.4',     # 11889
+    16 => 'Tri-Elmar-M 16-18-21mm f/4 ASPH.',# 11626
+    '16 1' => 'Tri-Elmar-M 16-18-21mm f/4 ASPH. (at 16mm)',
+    '16 2' => 'Tri-Elmar-M 16-18-21mm f/4 ASPH. (at 18mm)',
+    '16 3' => 'Tri-Elmar-M 16-18-21mm f/4 ASPH. (at 21mm)',
+    23 => 'Summicron-M 50mm f/2 (III)',     # 11817, version (I) in camera menu
+    24 => 'Elmarit-M 21mm f/2.8 ASPH.',     # 11135/11897
+    25 => 'Elmarit-M 24mm f/2.8 ASPH.',     # 11878/11898
+    26 => 'Summicron-M 28mm f/2 ASPH.',     # 11604
+    27 => 'Elmarit-M 28mm f/2.8 (IV)',      # 11809
+    28 => 'Elmarit-M 28mm f/2.8 ASPH.',     # 11606
+    29 => 'Summilux-M 35mm f/1.4 ASPH.',    # 11874/11883
+    '29 0' => 'Summilux-M 35mm f/1.4 ASPHERICAL', # 11873 (different from "ASPH." model!)
+    30 => 'Summicron-M 35mm f/2 ASPH.',     # 11879/11882
+    31 => 'Noctilux-M 50mm f/1',            # 11821/11822
+    '31 0' => 'Noctilux-M 50mm f/1.2',      # 11820
+    32 => 'Summilux-M 50mm f/1.4 ASPH.',    # 11891/11892
+    33 => 'Summicron-M 50mm f/2 (IV, V)',   # 11819/11825/11826/11816, version (II,III) in camera menu
+    34 => 'Elmar-M 50mm f/2.8',             # 11831/11823/11825
+    35 => 'Summilux-M 75mm f/1.4',          # 11814/11815/11810
+    36 => 'Apo-Summicron-M 75mm f/2 ASPH.', # 11637
+    37 => 'Apo-Summicron-M 90mm f/2 ASPH.', # 11884/11885
+    38 => 'Elmarit-M 90mm f/2.8',           # 11807/11808, version (II) in camera menu
+    39 => 'Macro-Elmar-M 90mm f/4',         # 11633/11634
+    '39 0' => 'Tele-Elmar-M 135mm f/4 (II)',# 11861
+    40 => 'Macro-Adapter M',                # 14409
+    42 => 'Tri-Elmar-M 28-35-50mm f/4 ASPH.',# 11625
+    '42 1' => 'Tri-Elmar-M 28-35-50mm f/4 ASPH. (at 28mm)',
+    '42 2' => 'Tri-Elmar-M 28-35-50mm f/4 ASPH. (at 35mm)',
+    '42 3' => 'Tri-Elmar-M 28-35-50mm f/4 ASPH. (at 50mm)',
+    43 => 'Summarit-M 35mm f/2.5',          # ? (ref PH)
+    44 => 'Summarit-M 50mm f/2.5',          # ? (ref PH)
+    45 => 'Summarit-M 75mm f/2.5',          # ? (ref PH)
+    46 => 'Summarit-M 90mm f/2.5',          # ?
+    47 => 'Summilux-M 21mm f/1.4 ASPH.',    # ? (ref 11)
+    48 => 'Summilux-M 24mm f/1.4 ASPH.',    # ? (ref 11)
+    49 => 'Noctilux-M 50mm f/0.95 ASPH.',   # ? (ref 11)
+    50 => 'Elmar-M 24mm f/3.8 ASPH.',       # ? (ref 11)
+    52 => 'Super-Elmar-M 18mm f/3.8 ASPH.', # ? (ref PH/11)
+);
+
+# M9 frame selector bits for each lens
+#  1 = towards lens    = 28/90mm or 21mm or Adapter (or Elmarit-M 135mm f/2.8)
+#  2 = away from lens  = 24/35mm (or 35/135mm on the M9)
+#  3 = middle position = 50/75mm or 18mm
+my %frameSelectorBits = (
+    1 => 1,
+    3 => 1,
+    4 => 1,
+    5 => 3,
+    6 => 2,
+    7 => 1,
+    9 => 1, # (because lens has special magnifier for the rangefinder)
+    16 => 1, # or 2 or 3
+    23 => 3,
+    24 => 1,
+    25 => 2,
+    26 => 1,
+    27 => 1,
+    28 => 1,
+    29 => 2,
+    30 => 2,
+    31 => 3,
+    32 => 3,
+    33 => 3,
+    34 => 3,
+    35 => 3,
+    36 => 3,
+    37 => 1,
+    38 => 1,
+    39 => 1,
+    40 => 1,
+    42 => 1, # or 2 or 3
+    43 => 2, # (NC)
+    44 => 3, # (NC)
+    45 => 3,
+    46 => 1, # (NC)
+    47 => 1, # (NC)
+    48 => 2, # (NC)
+    49 => 3, # (NC)
+    50 => 2, # (NC)
+    52 => 3,
+);
+
+# conversions for ShootingMode and SceneMode
+my %shootingMode = (
+    1  => 'Normal',
+    2  => 'Portrait',
+    3  => 'Scenery',
+    4  => 'Sports',
+    5  => 'Night Portrait',
+    6  => 'Program',
+    7  => 'Aperture Priority',
+    8  => 'Shutter Priority',
+    9  => 'Macro',
+    10 => 'Spot', #7
+    11 => 'Manual',
+    12 => 'Movie Preview', #PH (LZ6)
+    13 => 'Panning',
+    14 => 'Simple', #PH (LZ6)
+    15 => 'Color Effects', #7
+    16 => 'Self Portrait', #PH (TZ5)
+    17 => 'Economy', #7
+    18 => 'Fireworks',
+    19 => 'Party',
+    20 => 'Snow',
+    21 => 'Night Scenery',
+    22 => 'Food', #7
+    23 => 'Baby', #JD
+    24 => 'Soft Skin', #PH (LZ6)
+    25 => 'Candlelight', #PH (LZ6)
+    26 => 'Starry Night', #PH (LZ6)
+    27 => 'High Sensitivity', #7 (LZ6)
+    28 => 'Panorama Assist', #7
+    29 => 'Underwater', #7
+    30 => 'Beach', #PH (LZ6)
+    31 => 'Aerial Photo', #PH (LZ6)
+    32 => 'Sunset', #PH (LZ6)
+    33 => 'Pet', #JD
+    34 => 'Intelligent ISO', #PH (LZ6)
+    35 => 'Clipboard', #7
+    36 => 'High Speed Continuous Shooting', #7
+    37 => 'Intelligent Auto', #7
+    39 => 'Multi-aspect', #PH (TZ5)
+    41 => 'Transform', #PH (FS7)
+    42 => 'Flash Burst', #PH (FZ28)
+    43 => 'Pin Hole', #PH (FZ28)
+    44 => 'Film Grain', #PH (FZ28)
+    45 => 'My Color', #PH (GF1)
+    46 => 'Photo Frame', #PH (FS7)
+    51 => 'HDR', #12
+);
+
+%Image::ExifTool::Panasonic::Main = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    WRITABLE => 1,
+    0x01 => {
+        Name => 'ImageQuality',
+        Writable => 'int16u',
+        PrintConv => {
+            2 => 'High',
+            3 => 'Normal',
+            6 => 'Very High', #3 (Leica)
+            7 => 'Raw', #3 (Leica)
+            9 => 'Motion Picture', #PH (LZ6)
+        },
+    },
+    0x02 => {
+        Name => 'FirmwareVersion',
+        Writable => 'undef',
+        Notes => q{
+            for some camera models such as the FZ30 this may be an internal production
+            reference number and not the actual firmware version
+        }, # (ref http://www.stevesforums.com/forums/view_topic.php?id=87764&forum_id=23&)
+        # (can be either binary or ascii -- add decimal points if binary)
+        ValueConv => '$val=~/[\0-\x2f]/ ? join(" ",unpack("C*",$val)) : $val',
+        ValueConvInv => q{
+            $val =~ /(\d+ ){3}\d+/ and $val = pack('C*',split(' ', $val));
+            length($val) == 4 or warn "Version must be 4 numbers\n";
+            return $val;
+        },
+        PrintConv => '$val=~tr/ /./; $val',
+        PrintConvInv => '$val=~tr/./ /; $val',
+    },
+    0x03 => {
+        Name => 'WhiteBalance',
+        Writable => 'int16u',
+        PrintConv => {
+            1 => 'Auto',
+            2 => 'Daylight',
+            3 => 'Cloudy',
+            4 => 'Incandescent', #PH
+            5 => 'Manual',
+            8 => 'Flash',
+            10 => 'Black & White', #3 (Leica)
+            11 => 'Manual', #PH (FZ8)
+            12 => 'Shade', #PH (FS7)
+        },
+    },
+    0x07 => {
+        Name => 'FocusMode',
+        Writable => 'int16u',
+        PrintConv => {
+            1 => 'Auto',
+            2 => 'Manual',
+            4 => 'Auto, Focus button', #4
+            5 => 'Auto, Continuous', #4
+            # have seens 6 for GF1 - PH
+        },
+    },
+    0x0f => [
+        {
+            Name => 'AFAreaMode',
+            Condition => '$$self{Model} =~ /DMC-FZ10\b/', #JD
+            Writable => 'int8u',
+            Count => 2,
+            Notes => 'DMC-FZ10',
+            PrintConv => {
+                '0 1'   => 'Spot Mode On',
+                '0 16'  => 'Spot Mode Off',
+            },
+        },{
+            Name => 'AFAreaMode',
+            Writable => 'int8u',
+            Count => 2,
+            Notes => 'other models',
+            PrintConv => { #PH
+                '0 1'   => '9-area', # (FS7)
+                '0 16'  => '3-area (high speed)', # (FZ8)
+                '1 0'   => 'Spot Focusing', # (FZ8)
+                '1 1'   => '5-area', # (FZ8)
+                '16'    => 'Normal?', # (only mode for DMC-LC20)
+                '16 0'  => '1-area', # (FZ8)
+                '16 16' => '1-area (high speed)', # (FZ8)
+                '32 0'  => 'Auto or Face Detect', # (Face Detect for FS7, Auto is DMC-L1 guess)
+                '32 1'  => '3-area (left)?', # (DMC-L1 guess)
+                '32 2'  => '3-area (center)?', # (DMC-L1 guess)
+                '32 3'  => '3-area (right)?', # (DMC-L1 guess)
+                '64 0'  => 'Face Detect',
+            },
+        },
+    ],
+    0x1a => {
+        Name => 'ImageStabilization',
+        Writable => 'int16u',
+        PrintConv => {
+            2 => 'On, Mode 1',
+            3 => 'Off',
+            4 => 'On, Mode 2',
+            # GF1 also has a mode 3
+        },
+    },
+    0x1c => {
+        Name => 'MacroMode',
+        Writable => 'int16u',
+        PrintConv => {
+            1 => 'On',
+            2 => 'Off',
+            0x101 => 'Tele-Macro', #7
+            0x201 => 'Macro Zoom', #PH (FS7)
+        },
+    },
+    0x1f => {
+        Name => 'ShootingMode',
+        Writable => 'int16u',
+        PrintConvColumns => 2,
+        PrintConv => \%shootingMode,
+    },
+    0x20 => {
+        Name => 'Audio',
+        Writable => 'int16u',
+        PrintConv => { 1 => 'Yes', 2 => 'No' },
+    },
+    0x21 => { #2
+        Name => 'DataDump',
+        Writable => 0,
+        Binary => 1,
+    },
+    # 0x22 - normally 0, but 2 for 'Simple' ShootingMode in LZ6 sample - PH
+    0x23 => {
+        Name => 'WhiteBalanceBias',
+        Format => 'int16s',
+        Writable => 'int16s',
+        ValueConv => '$val / 3',
+        ValueConvInv => '$val * 3',
+        PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    0x24 => {
+        Name => 'FlashBias',
+        Format => 'int16s',
+        Writable => 'int16s',
+    },
+    0x25 => { #PH
+        Name => 'InternalSerialNumber',
+        Writable => 'undef',
+        Count => 16,
+        Notes => q{
+            this number is unique, and contains the date of manufacture, but is not the
+            same as the number printed on the camera body
+        },
+        PrintConv => q{
+            return $val unless $val=~/^([A-Z]\d{2})(\d{2})(\d{2})(\d{2})(\d{4})/;
+            my $yr = $2 + ($2 < 70 ? 2000 : 1900);
+            return "($1) $yr:$3:$4 no. $5";
+        },
+        PrintConvInv => '$_=$val; tr/A-Z0-9//dc; s/(.{3})(19|20)/$1/; $_',
+    },
+    0x26 => { #PH
+        Name => 'PanasonicExifVersion',
+        Writable => 'undef',
+    },
+    # 0x27 - values: 0 (LZ6,FX10K)
+    0x28 => {
+        Name => 'ColorEffect',
+        Writable => 'int16u',
+        # FX30 manual: (ColorMode) natural, vivid, cool, warm, b/w, sepia
+        PrintConv => {
+            1 => 'Off',
+            2 => 'Warm',
+            3 => 'Cool',
+            4 => 'Black & White',
+            5 => 'Sepia',
+            6 => 'Happy', #PH (FX70) (yes, really. you wouldn't want sad colors now would you?)
+        },
+    },
+    0x29 => { #JD
+        Name => 'TimeSincePowerOn',
+        Writable => 'int32u',
+        Notes => q{
+            time in 1/100 s from when the camera was powered on to when the image is
+            written to memory card
+        },
+        ValueConv => '$val / 100',
+        ValueConvInv => '$val * 100',
+        PrintConv => sub { # convert to format "[DD days ]HH:MM:SS.ss"
+            my $val = shift;
+            my $str = '';
+            if ($val >= 24 * 3600) {
+                my $d = int($val / (24 * 3600));
+                $str .= "$d days ";
+                $val -= $d * 24 * 3600;
+            }
+            my $h = int($val / 3600);
+            $val -= $h * 3600;
+            my $m = int($val / 60);
+            $val -= $m * 60;
+            my $s = int($val);
+            my $f = 100 * ($val - int($val));
+            return sprintf("%s%.2d:%.2d:%.2d.%.2d",$str,$h,$m,$s,$f);
+        },
+        PrintConvInv => sub {
+            my $val = shift;
+            my @vals = ($val =~ /\d+(?:\.\d*)?/g);
+            my $sec = 0;
+            $sec += 24 * 3600 * shift(@vals) if @vals > 3;
+            $sec += 3600 * shift(@vals) if @vals > 2;
+            $sec += 60 * shift(@vals) if @vals > 1;
+            $sec += shift(@vals) if @vals;
+            return $sec;
+        },
+    },
+    0x2a => { #4
+        Name => 'BurstMode',
+        Writable => 'int16u',
+        Notes => 'decoding may be different for some models',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'On', #PH (TZ5) [was "Low/High Quality" from ref 4]
+            2 => 'Infinite',
+            4 => 'Unlimited', #PH (TZ5)
+        },
+    },
+    0x2b => { #4
+        Name => 'SequenceNumber',
+        Writable => 'int32u',
+    },
+    0x2c => [
+        {
+            Name => 'ContrastMode',
+            Condition => '$$self{Model} !~ /^DMC-(FX10|G1|L1|L10|LC80|GF1|TZ10|ZS7)$/',
+            Flags => 'PrintHex',
+            Writable => 'int16u',
+            Notes => q{
+                this decoding seems to work for some models such as the LC1, LX2, FZ7, FZ8,
+                FZ18 and FZ50, but may not be correct for other models such as the FX10, G1, L1,
+                L10 and LC80
+            },
+            PrintConv => {
+                0 => 'Normal',
+                1 => 'Low',
+                2 => 'High',
+                # 3 - observed with LZ6 and TZ5 in Fireworks mode - PH
+                # 5 - observed with FX01, FX40 and FP8 (EXIF contrast "Normal") - PH
+                6 => 'Medium Low', #PH (FZ18)
+                7 => 'Medium High', #PH (FZ18)
+                # DMC-LC1 values:
+                0x100 => 'Low',
+                0x110 => 'Normal',
+                0x120 => 'High',
+            }
+        },{
+            Name => 'ContrastMode',
+            Condition => '$$self{Model} eq "DMC-GF1"',
+            Notes => 'these values are used by the GF1',
+            Writable => 'int16u',
+            PrintConv => {
+                0 => '-2',
+                1 => '-1',
+                2 => 'Normal',
+                3 => '+1',
+                4 => '+2',
+                # Note: Other Contrast tags will be "Normal" in any of these modes:
+                7 => 'Nature (Color Film)',
+                12 => 'Smooth (Color Film) or Pure (My Color)',
+                17 => 'Dynamic (B&W Film)',
+                22 => 'Smooth (B&W Film)',
+                27 => 'Dynamic (Color Film)',
+                32 => 'Vibrant (Color Film) or Expressive (My Color)',
+                33 => 'Elegant (My Color)',
+                37 => 'Nostalgic (Color Film)',
+                41 => 'Dynamic Art (My Color)',
+                42 => 'Retro (My Color)',
+            },
+        },{
+            Name => 'ContrastMode',
+            Condition => '$$self{Model} =~ /^DMC-(TZ10|ZS7)$/',
+            Notes => 'these values are used by the TZ10 and ZS7',
+            Writable => 'int16u',
+            PrintConv => {
+                0 => 'Normal',
+                1 => '-2',
+                2 => '+2',
+                5 => '-1',
+                6 => '+1',
+            },
+        },{
+            Name => 'ContrastMode',
+            Writable => 'int16u',
+        },
+    ],
+    0x2d => {
+        Name => 'NoiseReduction',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Standard',
+            1 => 'Low (-1)',
+            2 => 'High (+1)',
+            3 => 'Lowest (-2)', #JD
+            4 => 'Highest (+2)', #JD
+        },
+    },
+    0x2e => { #4
+        Name => 'SelfTimer',
+        Writable => 'int16u',
+        PrintConv => {
+            1 => 'Off',
+            2 => '10 s',
+            3 => '2 s',
+        },
+    },
+    # 0x2f - values: 1 (LZ6,FX10K)
+    0x30 => { #7
+        Name => 'Rotation',
+        Writable => 'int16u',
+        PrintConv => {
+            1 => 'Horizontal (normal)',
+            3 => 'Rotate 180', #PH
+            6 => 'Rotate 90 CW', #PH (ref 7 gives 270 CW)
+            8 => 'Rotate 270 CW', #PH (ref 7 gives 90 CW)
+        },
+    },
+    0x31 => { #PH (FS7)
+        Name => 'AFAssistLamp',
+        Writable => 'int16u',
+        PrintConv => {
+            1 => 'Fired',
+            2 => 'Enabled but Not Used',
+            3 => 'Disabled but Required',
+            4 => 'Disabled and Not Required',
+            # have seen a value of 5 - PH
+            # values possibly related to FOC-L? - JD
+        },
+    },
+    0x32 => { #7
+        Name => 'ColorMode',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Normal',
+            1 => 'Natural',
+            2 => 'Vivid',
+            # have seen 3 for GF2 - PH
+        },
+    },
+    0x33 => { #JD
+        Name => 'BabyAge',
+        Writable => 'string',
+        Notes => 'or pet age', #PH
+        PrintConv => '$val eq "9999:99:99 00:00:00" ? "(not set)" : $val',
+        PrintConvInv => '$val =~ /^\d/ ? $val : "9999:99:99 00:00:00"',
+    },
+    0x34 => { #7/PH
+        Name => 'OpticalZoomMode',
+        Writable => 'int16u',
+        PrintConv => {
+            1 => 'Standard',
+            2 => 'Extended',
+        },
+    },
+    0x35 => { #9
+        Name => 'ConversionLens',
+        Writable => 'int16u',
+        PrintConv => { #PH (unconfirmed)
+            1 => 'Off',
+            2 => 'Wide',
+            3 => 'Telephoto',
+            4 => 'Macro',
+        },
+    },
+    0x36 => { #8
+        Name => 'TravelDay',
+        Writable => 'int16u',
+        PrintConv => '$val == 65535 ? "n/a" : $val',
+        PrintConvInv => '$val =~ /(\d+)/ ? $1 : $val',
+    },
+    # 0x37 - values: 0,1,2 (LZ6, 0 for movie preview); 257 (FX10K); 0,256 (TZ5, 0 for movie preview)
+    # 0x38 - values: 0,1,2 (LZ6, same as 0x37); 1,2 (FX10K); 0,256 (TZ5, 0 for movie preview)
+    0x39 => { #7 (L1/L10)
+        Name => 'Contrast',
+        Format => 'int16s',
+        Writable => 'int16u',
+        %Image::ExifTool::Exif::printParameter,
+    },
+    0x3a => {
+        Name => 'WorldTimeLocation',
+        Writable => 'int16u',
+        PrintConv => {
+            1 => 'Home',
+            2 => 'Destination',
+        },
+    },
+    0x3b => { #PH (TZ5/FS7)
+        # (tags 0x3b, 0x3e, 0x8008 and 0x8009 have the same values in all my samples - PH)
+        Name => 'TextStamp',
+        Writable => 'int16u',
+        PrintConv => { 1 => 'Off', 2 => 'On' },
+    },
+    0x3c => { #PH
+        Name => 'ProgramISO', # (maybe should rename this ISOSetting?)
+        Writable => 'int16u',
+        PrintConv => {
+            OTHER => sub { return shift },
+            65534 => 'Intelligent ISO', #PH (FS7)
+            65535 => 'n/a',
+        },
+    },
+    0x3d => { #PH
+        Name => 'AdvancedSceneMode',
+        Writable => 'int16u',
+        # values for the FZ28 (SceneMode/AdvancedSceneMode, "*"=add mode name) - PH:
+        # Portrait: 2/1=Normal*, 24/1=Soft Skin, 2/2=Outdoor*, 2/3=Indoor*, 2/4=Creative*
+        # Scenery: 3/1=Normal*, 3/2=Nature, 3/3=Architecture, 3/4=Creative*
+        # Sports: 4/1=Normal*, 4/2=Outdoor*, 4/3=Indoor*, 4/4=Creative*
+        # Night Scenery: 5/1=Night Portrait, 21/1=*, 21/2=Illuminations, 21/4=Creative*
+        # Macro (Close-up): 9/2=Flower, 22/1=Food, 9/3=Objects, 9/4=Creative*
+        # - have seen value of 5 for TZ5 (Macro) and FS20 (Scenery and Intelligent Auto)
+        #   --> I'm guessing this is "Auto" - PH
+        # - values for HDR mode (ref 12): 1=Standard, 2=Art, 3=B&W
+        PrintConv => {
+            1 => 'Normal',
+            2 => 'Outdoor/Illuminations/Flower/HDR Art',
+            3 => 'Indoor/Architecture/Objects/HDR B&W',
+            4 => 'Creative',
+            5 => 'Auto',
+            7 => 'Expressive', #(GF1)
+            8 => 'Retro', #(GF1)
+            9 => 'Pure', #(GF1)
+            10 => 'Elegant', #(GF1)
+            12 => 'Monochrome', #(GF1)
+            13 => 'Dynamic Art', #(GF1)
+            14 => 'Silhouette', #(GF1)
+        },
+    },
+    0x3e => { #PH (TZ5/FS7)
+        # (tags 0x3b, 0x3e, 0x8008 and 0x8009 have the same values in all my samples - PH)
+        Name => 'TextStamp',
+        Writable => 'int16u',
+        PrintConv => { 1 => 'Off', 2 => 'On' },
+    },
+    0x3f => { #PH (TZ7)
+        Name => 'FacesDetected',
+        Writable => 'int16u',
+    },
+    0x40 => { #7 (L1/L10)
+        Name => 'Saturation',
+        Format => 'int16s',
+        Writable => 'int16u',
+        %Image::ExifTool::Exif::printParameter,
+    },
+    0x41 => { #7 (L1/L10)
+        Name => 'Sharpness',
+        Format => 'int16s',
+        Writable => 'int16u',
+        %Image::ExifTool::Exif::printParameter,
+    },
+    0x42 => { #7 (DMC-L1)
+        Name => 'FilmMode',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'n/a', #PH (ie. FZ100 "Photo Frame" ShootingMode)
+            1 => 'Standard (color)',
+            2 => 'Dynamic (color)',
+            3 => 'Nature (color)',
+            4 => 'Smooth (color)',
+            5 => 'Standard (B&W)',
+            6 => 'Dynamic (B&W)',
+            7 => 'Smooth (B&W)',
+            # 8 => 'My Film 1'? (from owner manual)
+            # 9 => 'My Film 2'?
+            10 => 'Nostalgic', # GH1
+            11 => 'Vibrant', # GH1
+            # 12 => 'Multi Film'? (in the GH1 specs)
+        },
+    },
+    # 0x43 - int16u: 2,3
+    # 0x44 - int16u: 0,2500
+    # 0x45 - int16u: 0
+    0x46 => { #PH/JD
+        Name => 'WBAdjustAB',
+        Format => 'int16s',
+        Writable => 'int16u',
+        Notes => 'positive is a shift toward blue',
+    },
+    0x47 => { #PH/JD
+        Name => 'WBAdjustGM',
+        Format => 'int16s',
+        Writable => 'int16u',
+        Notes => 'positive is a shift toward green',
+    },
+    # 0x48 - int16u: 0
+    # 0x49 - int16u: 2
+    # 0x4a - int16u: 0
+    0x4b => { #PH
+        Name => 'PanasonicImageWidth',
+        Writable => 'int32u',
+    },
+    0x4c => { #PH
+        Name => 'PanasonicImageHeight',
+        Writable => 'int32u',
+    },
+    0x4d => { #PH (FS7)
+        Name => 'AFPointPosition',
+        Writable => 'rational64u',
+        Count => 2,
+        Notes => 'X Y coordinates of primary AF area center, in the range 0.0 to 1.0',
+        PrintConv => q{
+            return 'none' if $val eq '16777216 16777216';
+            my @a = split ' ', $val;
+            sprintf("%.2g %.2g",@a);
+        },
+        PrintConvInv => '$val eq "none" ? "16777216 16777216" : $val',
+    },
+    0x4e => { #PH
+        Name => 'FaceDetInfo',
+        PrintConv => 'length $val',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Panasonic::FaceDetInfo',
+        },
+    },
+    # 0x4f,0x50 - int16u: 0
+    0x51 => {
+        Name => 'LensType',
+        Writable => 'string',
+    },
+    0x52 => { #7 (DMC-L1)
+        Name => 'LensSerialNumber',
+        Writable => 'string',
+    },
+    0x53 => { #7 (DMC-L1)
+        Name => 'AccessoryType',
+        Writable => 'string',
+    },
+    # 0x54 - string[14]: "0000000"
+    # 0x55 - int16u: 1
+    # 0x57 - int16u: 0
+    0x59 => { #PH (FS7)
+        Name => 'Transform',
+        Writable => 'undef',
+        Notes => 'decoded as two 16-bit signed integers',
+        Format => 'int16s',
+        Count => 2,
+        PrintConv => {
+            '-3 2' => 'Slim High',
+            '-1 1' => 'Slim Low',
+            '0 0' => 'Off',
+            '1 1' => 'Stretch Low',
+            '3 2' => 'Stretch High',
+        },
+    },
+    # 0x5a - int16u: 0,2
+    # 0x5b - int16u: 0
+    # 0x5c - int16u: 0,2
+    0x5d => { #PH (GF1, FZ35)
+        Name => 'IntelligentExposure',
+        Notes => 'not valid for some models', # (doesn't change in ZS7 and GH1 images)
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Low',
+            2 => 'Standard',
+            3 => 'High',
+        },
+    },
+    # 0x5e,0x5f,0x60 - undef[4]
+    0x61 => { #PH
+        Name => 'FaceRecInfo',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Panasonic::FaceRecInfo',
+        },
+    },
+    0x62 => { #PH (FS7)
+        Name => 'FlashWarning',
+        Writable => 'int16u',
+        PrintConv => { 0 => 'No', 1 => 'Yes (flash required but disabled)' },
+    },
+    0x63 => { #PH
+        # not sure exactly what this means, but in my samples this is
+        # FacesRecognized bytes of 0x01, padded with 0x00 to a length of 4 - PH
+        Name => 'RecognizedFaceFlags',
+        Format => 'int8u',
+        Count => 4,
+        Writable => 'undef',
+        Unknown => 1,
+    },
+    0x65 => { #15
+        Name => 'Title',
+        Format => 'string',
+        Writable => 'undef', # (Count 64)
+    },
+    0x66 => { #15
+        Name => 'BabyName',
+        Notes => 'or pet name',
+        Format => 'string',
+        Writable => 'undef', # (Count 64)
+    },
+    0x67 => { #15
+        Name => 'Location',
+        Groups => { 2 => 'Location' },
+        Format => 'string',
+        Writable => 'undef', # (Count 64)
+    },
+    # 0x68 - int8u: 1
+    0x69 => { #PH (ZS7)
+        Name => 'Country', # (Country/Region)
+        Groups => { 2 => 'Location' },
+        Format => 'string',
+        Writable => 'undef', # (Count 72)
+    },
+    # 0x6a - int8u: 1
+    0x6b => { #PH (ZS7)
+        Name => 'State', # (State/Province/Count -- what is Count?)
+        Groups => { 2 => 'Location' },
+        Format => 'string',
+        Writable => 'undef', # (Count 72)
+    },
+    # 0x6c - int8u: 1
+    0x6d => { #PH (ZS7)
+        Name => 'City', # (City/Town)
+        Groups => { 2 => 'Location' },
+        Format => 'string',
+        Writable => 'undef', # (Count 72)
+    },
+    # 0x6e - int8u: 1
+    0x6f => { #PH (ZS7)
+        Name => 'Landmark', # (Landmark)
+        Groups => { 2 => 'Location' },
+        Format => 'string',
+        Writable => 'undef', # (Count 128)
+    },
+    0x70 => { #PH (ZS7)
+        Name => 'IntelligentResolution',
+        Writable => 'int8u',
+        PrintConv => {
+            0 => 'Off',
+            # Note: I think these values make sense for the GH2, but meanings
+            #       may be different for other models
+            1 => 'Low',
+            2 => 'Standard',
+            3 => 'High',
+            4 => 'Extended',
+        },
+    },
+    # 0x71 - undef[128] (maybe text stamp text?)
+    # 0x72,0x73,0x74,0x75,0x76,0x77,0x78: 0
+    0x79 => { #PH (GH2)
+        Name => 'IntelligentD-Range',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Low',
+            2 => 'Standard',
+            3 => 'High',
+        },
+    },
+    # 0x7a,0x7b: 0
+    0x0e00 => {
+        Name => 'PrintIM',
+        Description => 'Print Image Matching',
+        Writable => 0,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::PrintIM::Main',
+        },
+    },
+    0x8000 => { #PH
+        Name => 'MakerNoteVersion',
+        Format => 'undef',
+    },
+    0x8001 => { #7/PH/JD
+        Name => 'SceneMode',
+        Writable => 'int16u',
+        PrintConvColumns => 2,
+        PrintConv => {
+            0  => 'Off',
+            %shootingMode,
+        },
+    },
+    # 0x8002 - values: 1,2 related to focus? (PH/JD)
+    #          1 for HDR modes, 2 for Portrait (ref 12)
+    # 0x8003 - values: 1,2 related to focus? (PH/JD)
+    0x8004 => { #PH/JD
+        Name => 'WBRedLevel',
+        Writable => 'int16u',
+    },
+    0x8005 => { #PH/JD
+        Name => 'WBGreenLevel',
+        Writable => 'int16u',
+    },
+    0x8006 => { #PH/JD
+        Name => 'WBBlueLevel',
+        Writable => 'int16u',
+    },
+    0x8007 => { #PH
+        Name => 'FlashFired',
+        Writable => 'int16u',
+        PrintConv => { 1 => 'No', 2 => 'Yes' },
+    },
+    0x8008 => { #PH (TZ5/FS7)
+        # (tags 0x3b, 0x3e, 0x8008 and 0x8009 have the same values in all my samples - PH)
+        Name => 'TextStamp',
+        Writable => 'int16u',
+        PrintConv => { 1 => 'Off', 2 => 'On' },
+    },
+    0x8009 => { #PH (TZ5/FS7)
+        # (tags 0x3b, 0x3e, 0x8008 and 0x8009 have the same values in all my samples - PH)
+        Name => 'TextStamp',
+        Writable => 'int16u',
+        PrintConv => { 1 => 'Off', 2 => 'On' },
+    },
+    0x8010 => { #PH
+        Name => 'BabyAge',
+        Writable => 'string',
+        Notes => 'or pet age',
+        PrintConv => '$val eq "9999:99:99 00:00:00" ? "(not set)" : $val',
+        PrintConvInv => '$val =~ /^\d/ ? $val : "9999:99:99 00:00:00"',
+    },
+    0x8012 => { #PH (FS7)
+        Name => 'Transform',
+        Writable => 'undef',
+        Notes => 'decoded as two 16-bit signed integers',
+        Format => 'int16s',
+        Count => 2,
+        PrintConv => {
+            '-3 2' => 'Slim High',
+            '-1 1' => 'Slim Low',
+            '0 0' => 'Off',
+            '1 1' => 'Stretch Low',
+            '3 2' => 'Stretch High',
+        },
+    },
+);
+
+# Leica type2 maker notes (ref 10)
+%Image::ExifTool::Panasonic::Leica2 = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' },
+    WRITABLE => 1,
+    NOTES => 'These tags are used by the Leica M8.',
+    0x300 => {
+        Name => 'Quality',
+        Writable => 'int16u',
+        PrintConv => {
+            1 => 'Fine',
+            2 => 'Basic',
+        },
+    },
+    0x302 => {
+        Name => 'UserProfile',
+        Writable => 'int32u',
+        PrintConv => {
+            1 => 'User Profile 1',
+            2 => 'User Profile 2',
+            3 => 'User Profile 3',
+            4 => 'User Profile 0 (Dynamic)',
+        },
+    },
+    0x303 => {
+        Name => 'SerialNumber',
+        Writable => 'int32u',
+        PrintConv => 'sprintf("%.7d", $val)',
+        PrintConvInv => '$val',
+    },
+    0x304 => {
+        Name => 'WhiteBalance',
+        Writable => 'int16u',
+        Notes => 'values above 0x8000 are converted to Kelvin color temperatures',
+        PrintConv => {
+            0 => 'Auto or Manual',
+            1 => 'Daylight',
+            2 => 'Fluorescent',
+            3 => 'Tungsten',
+            4 => 'Flash',
+            10 => 'Cloudy',
+            11 => 'Shade',
+            OTHER => \&WhiteBalanceConv,
+        },
+    },
+    0x310 => {
+        Name => 'LensInfo',
+        SubDirectory => { TagTable => 'Image::ExifTool::Panasonic::LensInfo' },
+    },
+    0x311 => {
+        Name => 'ExternalSensorBrightnessValue',
+        Format => 'rational64s', # (incorrectly unsigned in JPEG images)
+        Writable => 'rational64s',
+        Notes => '"blue dot" measurement',
+        PrintConv => 'sprintf("%.2f", $val)',
+        PrintConvInv => '$val',
+    },
+    0x312 => {
+        Name => 'MeasuredLV',
+        Format => 'rational64s', # (incorrectly unsigned in JPEG images)
+        Writable => 'rational64s',
+        Notes => 'imaging sensor or TTL exposure meter measurement',
+        PrintConv => 'sprintf("%.2f", $val)',
+        PrintConvInv => '$val',
+    },
+    0x313 => {
+        Name => 'ApproximateFNumber',
+        Writable => 'rational64u',
+        PrintConv => 'sprintf("%.1f", $val)',
+        PrintConvInv => '$val',
+    },
+    0x320 => {
+        Name => 'CameraTemperature',
+        Writable => 'int32s',
+        PrintConv => '"$val C"',
+        PrintConvInv => '$val=~s/ ?C//; $val',
+    },
+    0x321 => { Name => 'ColorTemperature',  Writable => 'int32u' },
+    0x322 => { Name => 'WBRedLevel',        Writable => 'rational64u' },
+    0x323 => { Name => 'WBGreenLevel',      Writable => 'rational64u' },
+    0x324 => { Name => 'WBBlueLevel',       Writable => 'rational64u' },
+    0x325 => {
+        Name => 'UV-IRFilterCorrection',
+        Description => 'UV/IR Filter Correction',
+        Writable => 'int32u',
+        PrintConv => {
+            0 => 'Not Active',
+            1 => 'Active',
+        },
+    },
+    0x330 => { Name => 'CCDVersion',        Writable => 'int32u' },
+    0x331 => { Name => 'CCDBoardVersion',   Writable => 'int32u' },
+    0x332 => { Name => 'ControllerBoardVersion', Writable => 'int32u' },
+    0x333 => { Name => 'M16CVersion',       Writable => 'int32u' },
+    0x340 => { Name => 'ImageIDNumber',     Writable => 'int32u' },
+);
+
+# Leica type3 maker notes (ref PH)
+%Image::ExifTool::Panasonic::Leica3 = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' },
+    WRITABLE => 1,
+    NOTES => 'These tags are used by the Leica R8 and R9 digital backs.',
+    0x0d => {
+        Name => 'WB_RGBLevels',
+        Writable => 'int16u',
+        Count => 3,
+    },
+);
+
+# Leica type4 maker notes (ref PH) (M9)
+%Image::ExifTool::Panasonic::Leica4 = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' },
+    WRITABLE => 1,
+    NOTES => 'This information is written by the M9.',
+    0x3000 => {
+        Name => 'Subdir3000',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Panasonic::Subdir',
+            ByteOrder => 'Unknown',
+        },
+    },
+    0x3100 => {
+        Name => 'Subdir3100',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Panasonic::Subdir',
+            ByteOrder => 'Unknown',
+        },
+    },
+    0x3400 => {
+        Name => 'Subdir3400',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Panasonic::Subdir',
+            ByteOrder => 'Unknown',
+        },
+    },
+    0x3900 => {
+        Name => 'Subdir3900',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Panasonic::Subdir',
+            ByteOrder => 'Unknown',
+        },
+    },
+);
+
+# Leica M9 SubDirectory tags (ref PH)
+%Image::ExifTool::Panasonic::Subdir = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' },
+    TAG_PREFIX => 'Leica_Subdir',
+    WRITABLE => 1,
+    # 0x3001 - normally 0 but value of 2 when manual coding is used
+    #          with a coded lens (but only tested with Elmar-M 50mm f/2.8) - PH
+    0x300a => {
+        Name => 'Contrast',
+        Writable => 'int32u',
+        PrintConv => {
+            0 => 'Low',
+            1 => 'Medium Low',
+            2 => 'Normal',
+            3 => 'Medium High',
+            4 => 'High',
+        },
+    },
+    0x300b => {
+        Name => 'Sharpening',
+        Writable => 'int32u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Low',
+            2 => 'Normal',
+            3 => 'Medium High',
+            4 => 'High',
+        },
+    },
+    0x300d => {
+        Name => 'Saturation',
+        Writable => 'int32u',
+        PrintConv => {
+            0 => 'Low',
+            1 => 'Medium Low',
+            2 => 'Normal',
+            3 => 'Medium High',
+            4 => 'High',
+            5 => 'Black & White',
+            6 => 'Vintage B&W',
+        },
+    },
+    # 0x3032 - some sort of RGB coefficients? (zeros unless Kelvin WB, but same for all Color Temps)
+    0x3033 => {
+        Name => 'WhiteBalance',
+        Writable => 'int32u',
+        PrintConv => { #13
+            0 => 'Auto',
+            1 => 'Tungsten',
+            2 => 'Fluorescent',
+            3 => 'Daylight Fluorescent',
+            4 => 'Daylight',
+            5 => 'Flash',
+            6 => 'Cloudy',
+            7 => 'Shade',
+            8 => 'Manual',
+            9 => 'Kelvin',
+        },
+    },
+    0x3034 => {
+        Name => 'JPEGQuality',
+        Writable => 'int32u',
+        PrintConv => {
+            94 => 'Basic',
+            97 => 'Fine',
+        },
+    },
+    # 0x3035 (int32u): -1 unless Manual WB (2 in my Manual sample)
+    0x3036 => {
+        Name => 'WB_RGBLevels',
+        Writable => 'rational64u',
+        Count => 3,
+    },
+    0x3038 => {
+        Name => 'UserProfile', # (CameraProfile according to ref 14)
+        Writable => 'string',
+    },
+    0x303a => {
+        Name => 'JPEGSize',
+        Writable => 'int32u',
+        PrintConv => {
+            0 => '5216x3472',
+            1 => '3840x2592',
+            2 => '2592x1728',
+            3 => '1728x1152',
+            4 => '1280x864',
+        },
+    },
+    0x3103 => { #13 (valid for FW 1.116 and later)
+        Name => 'SerialNumber',
+        Writable => 'string',
+    },
+    # 0x3104 body-dependent string ("00012905000000") (not serial number)
+    # 0x3105 body-dependent string ("00012905000000")
+    # 0x3107 - body-dependent string ("4H205800116800") (not serial number)
+    0x3109 => {
+        Name => 'FirmwareVersion',
+        Writable => 'string',
+    },
+    0x312a => { #14 (NC)
+        Name => 'BaseISO',
+        Writable => 'int32u',
+    },
+    0x312b => {
+        Name => 'SensorWidth',
+        Writable => 'int32u',
+    },
+    0x312c => {
+        Name => 'SensorHeight',
+        Writable => 'int32u',
+    },
+    0x312d => { #14 (NC)
+        Name => 'SensorBitDepth',
+        Writable => 'int32u',
+    },
+    0x3402 => { #PH/13
+        Name => 'CameraTemperature',
+        Writable => 'int32s',
+        PrintConv => '"$val C"',
+        PrintConvInv => '$val=~s/ ?C//; $val',
+    },
+    0x3405 => {
+        Name => 'LensType',
+        Writable => 'int32u',
+        SeparateTable => 1,
+        ValueConv => '($val >> 2) . " " . ($val & 0x3)',
+        ValueConvInv => \&LensTypeConvInv,
+        PrintConv => \%leicaLensType,
+    },
+    0x3406 => { #PH/13
+        Name => 'ApproximateFNumber',
+        Writable => 'rational64u',
+        PrintConv => 'sprintf("%.1f", $val)',
+        PrintConvInv => '$val',
+    },
+    0x3407 => { #14
+        Name => 'MeasuredLV',
+        Writable => 'int32s',
+        Notes => 'imaging sensor or TTL exposure meter measurement',
+        ValueConv => '$val / 1e5', #PH (NC)
+        ValueConvInv => '$val * 1e5', #PH (NC)
+        PrintConv => 'sprintf("%.2f", $val)',
+        PrintConvInv => '$val',
+    },
+    0x3408 => { #14
+        Name => 'ExternalSensorBrightnessValue',
+        Writable => 'int32s',
+        Notes => '"blue dot" measurement',
+        ValueConv => '$val / 1e5', #PH (NC)
+        ValueConvInv => '$val * 1e5', #PH (NC)
+        PrintConv => 'sprintf("%.2f", $val)',
+        PrintConvInv => '$val',
+    },
+    0x3901 => {
+        Name => 'Data1',
+        SubDirectory => { TagTable => 'Image::ExifTool::Panasonic::Data1' },
+    },
+    0x3902 => {
+        Name => 'Data2',
+        SubDirectory => { TagTable => 'Image::ExifTool::Panasonic::Data2' },
+    },
+    # 0x3903 - larger binary data block
+);
+
+%Image::ExifTool::Panasonic::Data1 = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' },
+    WRITABLE => 1,
+    TAG_PREFIX => 'Leica_Data1',
+    FIRST_ENTRY => 0,
+    0x0016 => {
+        Name => 'LensType',
+        Writable => 'int32u',
+        Priority => 0,
+        SeparateTable => 1,
+        ValueConv => '($val >> 2) . " " . ($val & 0x3)',
+        ValueConvInv => \&LensTypeConvInv,
+        PrintConv => \%leicaLensType,
+    },
+);
+
+%Image::ExifTool::Panasonic::Data2 = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' },
+    TAG_PREFIX => 'Leica_Data2',
+    FIRST_ENTRY => 0,
+);
+
+# Leica type5 maker notes (ref PH) (X1)
+%Image::ExifTool::Panasonic::Leica5 = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' },
+    WRITABLE => 1,
+    NOTES => 'This information is written by the X1.',
+    # 0x0406 - saturation or sharpness
+    0x0407 => { Name => 'OriginalFileName', Writable => 'string' },
+    0x0408 => { Name => 'OriginalDirectory',Writable => 'string' },
+    # 0x040b - related to white balance
+    0x040d => {
+        Name => 'ExposureMode',
+        Format => 'int8u',
+        Count => 4,
+        PrintConv => {
+            '0 0 0 0' => 'Program AE',
+            '1 0 0 0' => 'Aperture-priority AE',
+            '2 0 0 0' => 'Shutter speed priority AE', #(guess)
+            '3 0 0 0' => 'Manual',
+        },
+    },
+    # 0x0411 - saturation or sharpness
+    0x0412 => { Name => 'FilmMode',         Writable => 'string' },
+    0x0413 => { Name => 'WB_RGBLevels',     Writable => 'rational64u', Count => 3 },
+);
+
+# Leica type6 maker notes (ref PH) (S2)
+%Image::ExifTool::Panasonic::Leica6 = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' },
+    NOTES => 'This information is written by the S2 (as a trailer in JPEG images).',
+    0x300 => {
+        Name => 'PreviewImage',
+        Writable => 'undef',
+        Notes => 'S2',
+        DataTag => 'PreviewImage',
+        RawConv => q{
+            return \$val if $val =~ /^Binary/;
+            return \$val if $val =~ /^\xff\xd8\xff/;
+            $$self{PreviewError} = 1 unless $val eq 'none';
+            return undef;
+        },
+        ValueConvInv => '$val || "none"',
+        WriteCheck => 'return $val=~/^(none|\xff\xd8\xff)/s ? undef : "Not a valid image"',
+        ChangeBase => '$dirStart + $dataPos - 8',
+    },
+    0x301 => {
+        Name => 'UnknownBlock',
+        Notes => 'unknown 320kB block, not copied to JPEG images',
+        Flags => [ 'Unknown', 'Binary', 'Drop' ],
+    },
+    # 0x302 - same value as 4 unknown bytes at the end of JPEG or after the DNG TIFF header
+    0x303 => {
+        Name => 'LensType',
+        Writable => 'string',
+    },
+    # 0x340 - same as 0x302
+);
+
+# Type 2 tags (ref PH)
+%Image::ExifTool::Panasonic::Type2 = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    FIRST_ENTRY => 0,
+    FORMAT => 'int16u',
+    NOTES => q{
+        This type of maker notes is used by models such as the NV-DS65, PV-D2002,
+        PV-DC3000, PV-DV203, PV-DV401, PV-DV702, PV-L2001, PV-SD4090, PV-SD5000 and
+        iPalm.
+    },
+    0 => {
+        Name => 'MakerNoteType',
+        Format => 'string[4]',
+    },
+    # seems to vary inversely with amount of light, so I'll call it 'Gain' - PH
+    # (minimum is 16, maximum is 136.  Value is 0 for pictures captured from video)
+    3 => 'Gain',
+);
+
+# lens information (ref 10)
+%Image::ExifTool::Panasonic::LensInfo = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' },
+    WRITABLE => 1,
+    FORMAT => 'int32u',
+    FIRST_ENTRY => 0,
+    0 => {
+        Name => 'LensType',
+        Mask => 0xfffffffc,
+        PrintHex => 0,
+        SeparateTable => 1,
+        ValueConv => '$val >> 2',
+        ValueConvInv => '$val << 2',
+        PrintConv => \%leicaLensType,
+    },
+    0.1 => { # lower 2 bits give frame selector position
+        Name => 'FrameSelector',
+        Mask => 0x03,
+        PrintConv => {
+            1 => '28/90mm frame lines engaged',
+            2 => '24/35mm frame lines engaged',
+            3 => '50/75mm frame lines engaged',
+        },
+    },
+);
+
+# Face detection position information (ref PH)
+%Image::ExifTool::Panasonic::FaceDetInfo = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    WRITABLE => 1,
+    FORMAT => 'int16u',
+    FIRST_ENTRY => 0,
+    DATAMEMBER => [ 0 ],
+    NOTES => 'Face detection position information.',
+    0 => {
+        Name => 'NumFacePositions',
+        Format => 'int16u',
+        DataMember => 'NumFacePositions',
+        RawConv => '$$self{NumFacePositions} = $val',
+        Notes => q{
+            number of detected face positions stored in this record.  May be less than
+            FacesDetected
+        },
+    },
+    1 => {
+        Name => 'Face1Position',
+        Format => 'int16u[4]',
+        RawConv => '$$self{NumFacePositions} < 1 ? undef : $val',
+        Notes => q{
+            4 numbers: X/Y coordinates of the face center and width/height of face. 
+            Coordinates are relative to an image twice the size of the thumbnail, or 320
+            pixels wide
+        },
+    },
+    5 => {
+        Name => 'Face2Position',
+        Format => 'int16u[4]',
+        RawConv => '$$self{NumFacePositions} < 2 ? undef : $val',
+    },
+    9 => {
+        Name => 'Face3Position',
+        Format => 'int16u[4]',
+        RawConv => '$$self{NumFacePositions} < 3 ? undef : $val',
+    },
+    13 => {
+        Name => 'Face4Position',
+        Format => 'int16u[4]',
+        RawConv => '$$self{NumFacePositions} < 4 ? undef : $val',
+    },
+    17 => {
+        Name => 'Face5Position',
+        Format => 'int16u[4]',
+        RawConv => '$$self{NumFacePositions} < 5 ? undef : $val',
+    },
+);
+
+# Face recognition information from DMC-TZ7 (ref PH)
+%Image::ExifTool::Panasonic::FaceRecInfo = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    DATAMEMBER => [ 0 ],
+    NOTES => q{
+        Tags written by cameras with facial recognition.  These cameras not only
+        detect faces in an image, but also recognize specific people based a
+        user-supplied set of known faces.
+    },
+    0 => {
+        Name => 'FacesRecognized',
+        Format => 'int16u',
+        DataMember => 'FacesRecognized',
+        RawConv => '$$self{FacesRecognized} = $val',
+    },
+    4 => {
+        Name => 'RecognizedFace1Name',
+        Format => 'string[20]',
+        RawConv => '$$self{FacesRecognized} < 1 ? undef : $val',
+    },
+    24 => {
+        Name => 'RecognizedFace1Position',
+        Format => 'int16u[4]',
+        RawConv => '$$self{FacesRecognized} < 1 ? undef : $val',
+        Notes => 'coordinates in same format as face detection tags above',
+    },
+    32 => {
+        Name => 'RecognizedFace1Age',
+        Format => 'string[20]',
+        RawConv => '$$self{FacesRecognized} < 1 ? undef : $val',
+    },
+    52 => {
+        Name => 'RecognizedFace2Name',
+        Format => 'string[20]',
+        RawConv => '$$self{FacesRecognized} < 2 ? undef : $val',
+    },
+    72 => {
+        Name => 'RecognizedFace2Position',
+        Format => 'int16u[4]',
+        RawConv => '$$self{FacesRecognized} < 2 ? undef : $val',
+    },
+    80 => {
+        Name => 'RecognizedFace2Age',
+        Format => 'string[20]',
+        RawConv => '$$self{FacesRecognized} < 2 ? undef : $val',
+    },
+    100 => {
+        Name => 'RecognizedFace3Name',
+        Format => 'string[20]',
+        RawConv => '$$self{FacesRecognized} < 3 ? undef : $val',
+    },
+    120 => {
+        Name => 'RecognizedFace3Position',
+        Format => 'int16u[4]',
+        RawConv => '$$self{FacesRecognized} < 3 ? undef : $val',
+    },
+    128 => {
+        Name => 'RecognizedFace3Age',
+        Format => 'string[20]',
+        RawConv => '$$self{FacesRecognized} < 3 ? undef : $val',
+    },
+);
+
+#------------------------------------------------------------------------------
+# Inverse conversion for Leica M9 lens codes
+# Inputs: 0) value
+# Returns: Converted value, or undef on error
+sub LensTypeConvInv($)
+{
+    my $val = shift;
+    if ($val =~ /^(\d+) (\d+)$/) {
+        return ($1 << 2) + ($2 & 0x03);
+    } elsif ($val =~ /^\d+$/) {
+        my $bits = $frameSelectorBits{$val};
+        return undef unless defined $bits;
+        return ($val << 2) | $bits;
+    } else {
+        return undef;
+    }
+}
+
+#------------------------------------------------------------------------------
+# Convert Leica Kelvin white balance
+# Inputs: 0) value, 1) flag to perform inverse conversion
+# Returns: Converted value, or undef on error
+sub WhiteBalanceConv($;$$)
+{
+    my ($val, $inv) = @_;
+    if ($inv) {
+        return $1 + 0x8000 if $val =~ /(\d+)/;
+    } else {
+        return ($val - 0x8000) . ' Kelvin' if $val > 0x8000;
+    }
+    return undef;
+}
+
+#------------------------------------------------------------------------------
+# Process MakerNote trailer written by Leica S2
+# Inputs: 0) ExifTool object ref, 1) new absolute position of Leica trailer when writing
+# Returns: On success: 1 when reading, directory data when writing; othewise undef
+# Notes:
+# - may be called twice for a file if the first call doesn't succeed
+# - must leave RAF position unchanged
+# - uses information from LeicaTrailer member:
+#      TagInfo = tag info ref for MakerNote SubDirectory
+#      Offset/Size = value offset/size from MakerNote IFD
+#      TrailStart/TrailLen = actual JPEG trailer position/size (2nd call only)
+# - deletes LeicaTrailer member and sets LeicaTrailerPos when successful
+sub ProcessLeicaTrailer($;$)
+{
+    my ($exifTool, $newPos) = @_;
+    my $trail = $$exifTool{LeicaTrailer};
+    my $raf = $$exifTool{RAF};
+    my $trailPos = $$trail{TrailPos};
+    my $pos = $trailPos || $$trail{Offset};
+    my $len = $$trail{TrailLen} || $$trail{Size};
+    my ($buff, $result, %tagPtr);
+
+    delete $$exifTool{LeicaTrailer} if $trailPos;   # done after this
+    unless ($len > 0) {
+        $exifTool->Warn('Missing Leica MakerNote trailer', 1) if $trailPos;
+        undef $$exifTool{LeicaTrailer};
+        return undef;
+    }
+    my $oldPos = $raf->Tell();
+    my $ok = ($raf->Seek($pos, 0) and $raf->Read($buff, $len) == $len);
+    $raf->Seek($oldPos, 0);
+    unless ($ok) {
+        $exifTool->Warn('Error reading Leica MakerNote trailer', 1) if $trailPos;
+        return undef;
+    }
+    # look for Leica MakerNote header (should be at start of
+    # trailer, but allow up to 256 bytes of garbage just in case)
+    if ($buff !~ /^(.{0,256})LEICA\0..../sg) {
+        my $what = $trailPos ? 'trailer' : 'offset';
+        $exifTool->Warn("Invalid Leica MakerNote $what", 1);
+        return undef;
+    }
+    my $junk = $1;
+    my $start = pos($buff) - 10;
+    if ($start and not $trailPos) {
+        $exifTool->Warn('Invalid Leica MakerNote offset', 1);
+        return undef;
+    }
+#
+# all checks passed -- go ahead and process the trailer now
+#
+    my $hdrLen = 8;
+    my $dirStart = $start + $hdrLen;
+    my $tagInfo = $$trail{TagInfo};
+    if ($$exifTool{HTML_DUMP}) {
+        my $name = $$tagInfo{Name};
+        $exifTool->HDump($pos+$start, $len-$start, "$name value", 'Leica MakerNote trailer', 4);
+        $exifTool->HDump($pos+$start, $hdrLen, "MakerNotes header", $name);
+    } elsif ($exifTool->Options('Verbose')) {
+        my $where = sprintf('at offset 0x%x', $pos);
+        $exifTool->VPrint(0, "Leica MakerNote trailer ($len bytes $where):\n");
+    }
+    # delete LeicaTrailer member so we don't try to process it again
+    delete $$exifTool{LeicaTrailer};
+    $$exifTool{LeicaTrailerPos} = $pos + $start;    # return actual start position of Leica trailer
+
+    my $oldOrder = GetByteOrder();
+    my $num = Get16u(\$buff, $dirStart);            # get entry count
+    ToggleByteOrder() if ($num>>8) > ($num&0xff);   # set byte order
+
+    # use specialized algorithm to automatically fix offsets
+    my $valStart = $dirStart + 2 + 12 * $num + 4;
+    my $fix = 0;
+    if ($valStart < $len) {
+        my $valBlock = Image::ExifTool::MakerNotes::GetValueBlocks(\$buff, $dirStart, \%tagPtr);
+        # find the minimum offset (excluding the PreviewImage tag 0x300)
+        my $minPtr;
+        foreach (keys %tagPtr) {
+            my $ptr = $tagPtr{$_};
+            next if $_ == 0x300 or not $ptr;
+            $minPtr = $ptr if not defined $minPtr or $minPtr > $ptr;
+        }
+        if ($minPtr) {
+            my $diff = $minPtr - ($valStart + $pos);
+            # scan value data for the first non-zero byte
+            pos($buff) = $valStart;
+            if ($buff =~ /[^\0]/g) {
+                my $n = pos($buff) - 1 - $valStart; # number of zero bytes
+                # S2 writes 282 bytes of zeros, exiftool writes none
+                my $expect = $n >= 282 ? 282 : 0;
+                my $fixBase = $exifTool->Options('FixBase');
+                if ($diff != $expect or defined $fixBase) {
+                    $fix = $expect - $diff;
+                    if (defined $fixBase) {
+                        $fix = $fixBase if $fixBase ne '';
+                        $exifTool->Warn("Adjusted MakerNotes base by $fix",1);
+                    } else {
+                        $exifTool->Warn("Possibly incorrect maker notes offsets (fixed by $fix)",1);
+                    }
+                }
+            }
+        }
+    }
+    # generate dirInfo for Leica MakerNote directory
+    my %dirInfo = (
+        Name       => $$tagInfo{Name},
+        Base       => $fix,
+        DataPt     => \$buff,
+        DataPos    => $pos - $fix,
+        DataLen    => $len,
+        DirStart   => $dirStart,
+        DirLen     => $len - $dirStart,
+        DirName    => 'MakerNotes',
+        Parent     => 'ExifIFD',
+        TagInfo    => $tagInfo,
+    );
+    my $tagTablePtr = GetTagTable($$tagInfo{SubDirectory}{TagTable});
+    if ($newPos) { # are we writing?
+        # set position of new MakerNote IFD (+ 8 for Leica MakerNote header)
+        $dirInfo{NewDataPos} = $newPos + $start + 8;
+        $result = $exifTool->WriteDirectory(\%dirInfo, $tagTablePtr);
+        # write preview image last if necessary and fix up the preview offsets
+        my $previewInfo = $$exifTool{PREVIEW_INFO};
+        delete $$exifTool{PREVIEW_INFO};
+        if ($result) {
+            if ($previewInfo) {
+                my $fixup = $previewInfo->{Fixup};
+                # set preview offset (relative to start of makernotes, + 8 for makernote header)
+                $fixup->SetMarkerPointers(\$result, 'PreviewImage', length($result) + 8);
+                $result .= $$previewInfo{Data};
+            }
+            return $junk . substr($buff, $start, $hdrLen) . $result;
+        }
+    } else {
+        # extract information
+        $result = $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+        # also extract as a block if necessary
+        if ($exifTool->Options('MakerNotes') or
+            $exifTool->{REQ_TAG_LOOKUP}{lc($$tagInfo{Name})})
+        {
+            # makernote header must be included in RebuildMakerNotes call
+            $dirInfo{DirStart} -= 8;
+            $dirInfo{DirLen} += 8;
+            $exifTool->{MAKER_NOTE_BYTE_ORDER} = GetByteOrder();
+            # rebuild maker notes (creates $exifTool->{MAKER_NOTE_FIXUP})
+            my $val = Image::ExifTool::Exif::RebuildMakerNotes($exifTool, $tagTablePtr, \%dirInfo);
+            unless (defined $val) {
+                $exifTool->Warn('Error rebuilding maker notes (may be corrupt)');
+                $val = $buff,
+            }
+            my $key = $exifTool->FoundTag($tagInfo, $val);
+            $exifTool->SetGroup($key, 'ExifIFD');
+        }
+    }
+    SetByteOrder($oldOrder);
+    return $result;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Panasonic - Panasonic/Leica maker notes tags
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to interpret
+Panasonic and Leica maker notes in EXIF information.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.compton.nu/panasonic.html>
+
+=item L<http://johnst.org/sw/exiftags/>
+
+=item L<http://homepage3.nifty.com/kamisaka/makernote/makernote_pana.htm>
+
+=item L<http://bretteville.com/pdfs/M8Metadata_v2.pdf>
+
+=item L<http://www.digital-leica.com/lens_codes/index.html>
+
+=item (...plus lots of testing with store demos and my wife's DMC-FS7!)
+
+=back
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Tels for the information he provided on decoding some tags, and to
+Marcel Coenen, Jens Duttke and Michael Byczkowski for their contributions.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/Panasonic Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/PanasonicRaw.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/PanasonicRaw.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/PanasonicRaw.pm	(revision 24799)
@@ -0,0 +1,383 @@
+#------------------------------------------------------------------------------
+# File:         PanasonicRaw.pm
+#
+# Description:  Read/write Panasonic/Leica RAW/RW2/RWL meta information
+#
+# Revisions:    2009/03/24 - P. Harvey Created
+#               2009/05/12 - PH Added RWL file type (same format as RW2)
+#
+# References:   1) CPAN forum post by 'hardloaf' (http://www.cpanforum.com/threads/2183)
+#               2) http://www.cybercom.net/~dcoffin/dcraw/
+#              JD) Jens Duttke private communication (TZ3,FZ30,FZ50)
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::PanasonicRaw;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::Exif;
+
+$VERSION = '1.02';
+
+sub ProcessJpgFromRaw($$$);
+sub WriteJpgFromRaw($$$);
+
+my %jpgFromRawMap = (
+    IFD1         => 'IFD0',
+    EXIF         => 'IFD0', # to write EXIF as a block
+    ExifIFD      => 'IFD0',
+    GPS          => 'IFD0',
+    SubIFD       => 'IFD0',
+    GlobParamIFD => 'IFD0',
+    PrintIM      => 'IFD0',
+    InteropIFD   => 'ExifIFD',
+    MakerNotes   => 'ExifIFD',
+    IFD0         => 'APP1',
+    MakerNotes   => 'ExifIFD',
+    Comment      => 'COM',
+);
+
+# Tags found in Panasonic RAW/RW2/RWL images (ref PH)
+%Image::ExifTool::PanasonicRaw::Main = (
+    GROUPS => { 0 => 'EXIF', 1 => 'IFD0', 2 => 'Image'},
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    WRITE_GROUP => 'IFD0',   # default write group
+    NOTES => 'These tags are found in IFD0 of Panasonic/Leica RAW, RW2 and RWL images.',
+    0x01 => {
+        Name => 'PanasonicRawVersion',
+        Writable => 'undef',
+    },
+    0x02 => 'SensorWidth', #1/PH
+    0x03 => 'SensorHeight', #1/PH
+    0x04 => 'SensorTopBorder', #JD
+    0x05 => 'SensorLeftBorder', #JD
+    0x06 => 'ImageHeight', #1/PH
+    0x07 => 'ImageWidth', #1/PH
+    # observed values for unknown tags - PH
+    # 0x08: 1
+    # 0x09: 1,3,4
+    # 0x0a: 12
+    # 0x0b: 0x860c,0x880a,0x880c
+    # 0x0c: 2 (only Leica Digilux 2)
+    # 0x0d: 0,1
+    # 0x0e,0x0f,0x10: 4095
+    # 0x18,0x19,0x1a,0x1c,0x1d,0x1e: 0
+    # 0x1b,0x27,0x29,0x2a,0x2b,0x2c: [binary data]
+    # 0x2d: 2,3
+    0x11 => { #JD
+        Name => 'RedBalance',
+        Writable => 'int16u',
+        ValueConv => '$val / 256',
+        ValueConvInv => 'int($val * 256 + 0.5)',
+        Notes => 'found in Digilux 2 RAW images',
+    },
+    0x12 => { #JD
+        Name => 'BlueBalance',
+        Writable => 'int16u',
+        ValueConv => '$val / 256',
+        ValueConvInv => 'int($val * 256 + 0.5)',
+    },
+    0x17 => { #1
+        Name => 'ISO',
+        Writable => 'int16u',
+    },
+    0x24 => { #2
+        Name => 'WBRedLevel',
+        Writable => 'int16u',
+    },
+    0x25 => { #2
+        Name => 'WBGreenLevel',
+        Writable => 'int16u',
+    },
+    0x26 => { #2
+        Name => 'WBBlueLevel',
+        Writable => 'int16u',
+    },
+    0x2e => { #JD
+        Name => 'JpgFromRaw', # (writable directory!)
+        Writable => 'undef',
+        # protect this tag because it contains all the metadata
+        Flags => [ 'Binary', 'Protected', 'NestedHtmlDump', 'BlockExtract' ],
+        Notes => 'processed as an embedded document because it contains full EXIF',
+        WriteCheck => '$val eq "none" ? undef : $self->CheckImage(\$val)',
+        DataTag => 'JpgFromRaw',
+        RawConv => '$self->ValidateImage(\$val,$tag)',
+        SubDirectory => {
+            # extract information from embedded image since it is metadata-rich,
+            # unless HtmlDump option set (note that the offsets will be relative,
+            # not absolute like they should be in verbose mode)
+            TagTable => 'Image::ExifTool::JPEG::Main',
+            WriteProc => \&WriteJpgFromRaw,
+            ProcessProc => \&ProcessJpgFromRaw,
+        },
+    },
+    0x10f => {
+        Name => 'Make',
+        Groups => { 2 => 'Camera' },
+        Writable => 'string',
+        DataMember => 'Make',
+        # save this value as an ExifTool member variable
+        RawConv => '$self->{Make} = $val',
+    },
+    0x110 => {
+        Name => 'Model',
+        Description => 'Camera Model Name',
+        Groups => { 2 => 'Camera' },
+        Writable => 'string',
+        DataMember => 'Model',
+        # save this value as an ExifTool member variable
+        RawConv => '$self->{Model} = $val',
+    },
+    0x111 => {
+        Name => 'StripOffsets',
+        # (this value is 0xffffffff for some models, and RawDataOffset must be used)
+        Flags => [ 'IsOffset', 'PanasonicHack' ],
+        OffsetPair => 0x117,  # point to associated byte counts
+        ValueConv => 'length($val) > 32 ? \$val : $val',
+    },
+    0x112 => {
+        Name => 'Orientation',
+        Writable => 'int16u',
+        PrintConv => \%Image::ExifTool::Exif::orientation,
+        Priority => 0,  # so IFD1 doesn't take precedence
+    },
+    0x116 => {
+        Name => 'RowsPerStrip',
+        Priority => 0,
+    },
+    0x117 => {
+        Name => 'StripByteCounts',
+        # (note that this value may represent something like uncompressed byte count
+        # for RAW/RW2/RWL images from some models, and is zero for some other models)
+        OffsetPair => 0x111,   # point to associated offset
+        ValueConv => 'length($val) > 32 ? \$val : $val',
+    },
+    0x118 => {
+        Name => 'RawDataOffset', #PH (RW2/RWL)
+        IsOffset => '$$exifTool{TIFF_TYPE} =~ /^(RW2|RWL)$/', # (invalid in DNG-converted files)
+        PanasonicHack => 1,
+        OffsetPair => 0x117, # (use StripByteCounts as the offset pair)
+    },
+    # 0x119 undef[32] - lens distortion data? (http://thinkfat.blogspot.com/2009/02/dissecting-panasonic-rw2-files.html)
+    0x2bc => { # PH Extension!!
+        Name => 'ApplicationNotes',
+        Writable => 'int8u', # (writable directory!)
+        Format => 'undef',
+        Flags => [ 'Binary', 'Protected' ],
+        SubDirectory => {
+            DirName => 'XMP',
+            TagTable => 'Image::ExifTool::XMP::Main',
+        },
+    },
+    0x83bb => { # PH Extension!!
+        Name => 'IPTC-NAA', # (writable directory!)
+        Format => 'undef',      # convert binary values as undef
+        Writable => 'int32u',   # but write int32u format code in IFD
+        WriteGroup => 'IFD0',
+        Flags => [ 'Binary', 'Protected' ],
+        SubDirectory => {
+            DirName => 'IPTC',
+            TagTable => 'Image::ExifTool::IPTC::Main',
+        },
+    },
+    0x8769 => {
+        Name => 'ExifOffset',
+        Groups => { 1 => 'ExifIFD' },
+        Flags => 'SubIFD',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Exif::Main',
+            DirName => 'ExifIFD',
+            Start => '$val',
+        },
+    },
+    0x8825 => {
+        Name => 'GPSInfo',
+        Groups => { 1 => 'GPS' },
+        Flags => 'SubIFD',
+        SubDirectory => {
+            DirName => 'GPS',
+            TagTable => 'Image::ExifTool::GPS::Main',
+            Start => '$val',
+        },
+    },
+);
+
+#------------------------------------------------------------------------------
+# Patch for writing non-standard Panasonic RAW/RW2/RWL raw data
+# Inputs: 0) offset info ref, 1) raf ref, 2) IFD number
+# Returns: error string, or undef on success
+# OffsetInfo is a hash by tag ID of lists with the following elements:
+#  0 - tag info ref
+#  1 - pointer to int32u offset in IFD or value data
+#  2 - value count
+#  3 - reference to list of original offset values
+#  4 - IFD format number
+sub PatchRawDataOffset($$$)
+{
+    my ($offsetInfo, $raf, $ifd) = @_;
+    my $stripOffsets = $$offsetInfo{0x111};
+    my $stripByteCounts = $$offsetInfo{0x117};
+    my $rawDataOffset = $$offsetInfo{0x118};
+    my $err;
+    $err = 1 unless $ifd == 0;
+    $err = 1 unless $stripOffsets and $stripByteCounts and $$stripOffsets[2] == 1;
+    if ($rawDataOffset) {
+        $err = 1 unless $$rawDataOffset[2] == 1;
+        $err = 1 unless $$stripOffsets[3][0] == 0xffffffff or $$stripByteCounts[3][0] == 0;
+    }
+    $err and return 'Unsupported Panasonic/Leica RAW variant';
+    if ($rawDataOffset) {
+        # update StripOffsets along with this tag if it contains a reasonable value
+        unless ($$stripOffsets[3][0] == 0xffffffff) {
+            # save pointer to StripOffsets value for updating later
+            push @$rawDataOffset, $$stripOffsets[1];
+        }
+        # handle via RawDataOffset instead of StripOffsets
+        $stripOffsets = $$offsetInfo{0x111} = $rawDataOffset;
+        delete $$offsetInfo{0x118};
+    }
+    # determine the length of the raw data
+    my $pos = $raf->Tell();
+    $raf->Seek(0, 2) or $err = 1; # seek to end of file
+    my $len = $raf->Tell() - $$stripOffsets[3][0];
+    $raf->Seek($pos, 0);
+    # quick check to be sure the raw data length isn't unreasonable
+    # (the 22-byte length is for '<Dummy raw image data>' in our tests)
+    $err = 1 if ($len < 1000 and $len != 22) or $len & 0x80000000;
+    $err and return 'Error reading Panasonic raw data';
+    # update StripByteCounts info with raw data length
+    # (note that the original value is maintained in the file)
+    $$stripByteCounts[3][0] = $len;
+
+    return undef;
+}
+
+#------------------------------------------------------------------------------
+# Write meta information to Panasonic JpgFromRaw in RAW/RW2/RWL image
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: updated image data, or undef if nothing changed
+sub WriteJpgFromRaw($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $byteOrder = GetByteOrder();
+    my $fileType = $$exifTool{FILE_TYPE};   # RAW, RW2 or RWL
+    my $dirStart = $$dirInfo{DirStart};
+    if ($dirStart) { # DirStart is non-zero in DNG-converted RW2/RWL
+        my $dirLen = $$dirInfo{DirLen} | length($$dataPt) - $dirStart;
+        my $buff = substr($$dataPt, $dirStart, $dirLen);
+        $dataPt = \$buff;
+    }
+    my $raf = new File::RandomAccess($dataPt);
+    my $outbuff;
+    my %dirInfo = (
+        RAF => $raf,
+        OutFile => \$outbuff,
+    );
+    $$exifTool{BASE} = $$dirInfo{DataPos};
+    $$exifTool{FILE_TYPE} = $$exifTool{TIFF_TYPE} = 'JPEG';
+    # use a specialized map so we don't write XMP or IPTC (or other junk) into the JPEG
+    my $editDirs = $$exifTool{EDIT_DIRS};
+    my $addDirs = $$exifTool{ADD_DIRS};
+    $exifTool->InitWriteDirs(\%jpgFromRawMap);
+    # don't add XMP segment (IPTC won't get added because it is in Photoshop record)
+    delete $$exifTool{ADD_DIRS}{XMP};
+    my $result = $exifTool->WriteJPEG(\%dirInfo);
+    # restore variables we changed
+    $$exifTool{BASE} = 0;
+    $$exifTool{FILE_TYPE} = 'TIFF';
+    $$exifTool{TIFF_TYPE} = $fileType;
+    $$exifTool{EDIT_DIRS} = $editDirs;
+    $$exifTool{ADD_DIRS} = $addDirs;
+    SetByteOrder($byteOrder);
+    return $result > 0 ? $outbuff : $$dataPt;
+}
+
+#------------------------------------------------------------------------------
+# Extract meta information from an Panasonic JpgFromRaw
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 on success, 0 if this wasn't a valid JpgFromRaw image
+sub ProcessJpgFromRaw($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $byteOrder = GetByteOrder();
+    my $fileType = $$exifTool{FILE_TYPE};   # RAW, RW2 or RWL
+    my $tagInfo = $$dirInfo{TagInfo};
+    my $verbose = $exifTool->Options('Verbose');
+    my ($indent, $out);
+    $tagInfo or $exifTool->Warn('No tag info for Panasonic JpgFromRaw'), return 0;
+    my $dirStart = $$dirInfo{DirStart};
+    if ($dirStart) { # DirStart is non-zero in DNG-converted RW2/RWL
+        my $dirLen = $$dirInfo{DirLen} | length($$dataPt) - $dirStart;
+        my $buff = substr($$dataPt, $dirStart, $dirLen);
+        $dataPt = \$buff;
+    }
+    $$exifTool{BASE} = $$dirInfo{DataPos} + ($dirStart || 0);
+    $$exifTool{FILE_TYPE} = $$exifTool{TIFF_TYPE} = 'JPEG';
+    $$exifTool{DOC_NUM} = 1;
+    # extract information from embedded JPEG
+    my %dirInfo = (
+        Parent => 'RAF',
+        RAF    => new File::RandomAccess($dataPt),
+    );
+    if ($verbose) {
+        my $indent = $$exifTool{INDENT};
+        $$exifTool{INDENT} = '  ';
+        $out = $exifTool->Options('TextOut');
+        print $out '--- DOC1:JpgFromRaw ',('-'x56),"\n";
+    }
+    my $rtnVal = $exifTool->ProcessJPEG(\%dirInfo);
+    # restore necessary variables for continued RW2/RWL processing
+    $$exifTool{BASE} = 0;
+    $$exifTool{FILE_TYPE} = 'TIFF';
+    $$exifTool{TIFF_TYPE} = $fileType;
+    delete $$exifTool{DOC_NUM};
+    SetByteOrder($byteOrder);
+    if ($verbose) {
+        $$exifTool{INDENT} = $indent;
+        print $out ('-'x76),"\n";
+    }
+    return $rtnVal;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::PanasonicRaw - Read/write Panasonic/Leica RAW/RW2/RWL meta information
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to read and
+write meta information in Panasonic/Leica RAW, RW2 and RWL images.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.cybercom.net/~dcoffin/dcraw/>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/PanasonicRaw Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Pentax.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Pentax.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Pentax.pm	(revision 24799)
@@ -0,0 +1,4542 @@
+#------------------------------------------------------------------------------
+# File:         Pentax.pm
+#
+# Description:  Pentax/Asahi EXIF maker notes tags
+#
+# Revisions:    11/25/2003 - P. Harvey Created
+#               02/10/2004 - P. Harvey Completely re-done
+#               02/16/2004 - W. Smith Updated (see ref 3)
+#               11/10/2004 - P. Harvey Added support for Asahi cameras
+#               01/10/2005 - P. Harvey Added LensType with values from ref 4
+#               03/30/2005 - P. Harvey Added new tags from ref 5
+#               10/04/2005 - P. Harvey Added MOV tags
+#               10/22/2007 - P. Harvey Got my new K10D! (more new tags to decode)
+#               11/03/2010 - P. Harvey Got my new K-5! (a gold mine of new tags to discover!)
+#
+# References:   1) Image::MakerNotes::Pentax
+#               2) http://johnst.org/sw/exiftags/ (Asahi cameras)
+#               3) Wayne Smith private communication (Optio 550)
+#               4) http://kobe1995.jp/~kaz/astro/istD.html
+#               5) John Francis (http://www.panix.com/~johnf/raw/index.html) (ist-D/ist-DS)
+#               6) http://www.cybercom.net/~dcoffin/dcraw/
+#               7) Douglas O'Brien private communication (*istD, K10D)
+#               8) Denis Bourez private communication
+#               9) Kazumichi Kawabata private communication
+#              10) David Buret private communication (*istD)
+#              11) http://forums.dpreview.com/forums/read.asp?forum=1036&message=17465929
+#              12) Derby Chang private communication
+#              13) http://homepage3.nifty.com/kamisaka/makernote/makernote_pentax.htm (2007/02/28)
+#              14) Ger Vermeulen private communication (Optio S6)
+#              15) Barney Garrett private communication (Samsung GX-1S)
+#              16) Axel Kellner private communication (K10D)
+#              17) Cvetan Ivanov private communication (K100D)
+#              18) http://www.gvsoft.homedns.org/exif/makernote-pentax-type3.html
+#              19) Dave Nicholson private communication (K10D)
+#              20) Bogdan and yeryry (http://www.cpanforum.com/posts/8037)
+#              21) Peter (*istD, http://www.cpanforum.com/posts/8078)
+#              22) Bozi (K10D, http://www.cpanforum.com/posts/8480)
+#              23) Akos Szalkai (https://rt.cpan.org/Ticket/Display.html?id=43743)
+#              24) Albert Bogner private communication
+#              25) Niels Kristian Bech Jensen private communication
+#              JD) Jens Duttke private communication
+#
+# Notes:        See POD documentation at the bottom of this file
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Pentax;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool::Exif;
+use Image::ExifTool::HP;
+
+$VERSION = '2.30';
+
+sub CryptShutterCount($$);
+sub PrintFilter($$$);
+
+# pentax lens type codes (ref 4)
+# The first number gives the lens series, and the 2nd gives the model number
+# Series numbers: K=1; A=2; F=3; FAJ=4; DFA=4,7; FA=3,4,5,6; FA*=5,6;
+#                 DA=3,4,7; DA*=7,8; FA645=11; DFA645=13
+my %pentaxLensTypes = (
+    Notes => q{
+        The first number gives the series of the lens, and the second identifies the
+        lens model.  Note that newer series numbers may not always be properly
+        identified by cameras running older firmware versions.  Decimal values
+        differentiate lenses which would otherwise have the same LensType, and are
+        used by the Composite LensID tag when attempting to identify the specific
+        lens model.
+    },
+    '0 0' => 'M-42 or No Lens', #17
+    '1 0' => 'K or M Lens',
+    '2 0' => 'A Series Lens', #7 (from smc PENTAX-A 400mm F5.6)
+    '3 0' => 'Sigma', # (includes 'Sigma 30mm F1.4 EX DC' - PH)
+    '3 17' => 'smc PENTAX-FA SOFT 85mm F2.8',
+    '3 18' => 'smc PENTAX-F 1.7X AF ADAPTER',
+    '3 19' => 'smc PENTAX-F 24-50mm F4',
+    '3 20' => 'smc PENTAX-F 35-80mm F4-5.6',
+    '3 21' => 'smc PENTAX-F 80-200mm F4.7-5.6',
+    '3 22' => 'smc PENTAX-F FISH-EYE 17-28mm F3.5-4.5',
+    '3 23' => 'smc PENTAX-F 100-300mm F4.5-5.6 or Sigma Lens',
+    '3 23.1' => 'Sigma AF 28-300mm F3.5-5.6 DL IF', #JD
+    '3 23.2' => 'Sigma AF 28-300mm F3.5-6.3 DG IF Macro', #JD
+    '3 24' => 'smc PENTAX-F 35-135mm F3.5-4.5',
+    '3 25' => 'smc PENTAX-F 35-105mm F4-5.6 or Sigma or Tokina Lens',
+    '3 25.1' => 'Sigma AF 28-300mm F3.5-5.6 DL IF', #11
+    '3 25.2' => 'Sigma 55-200mm F4-5.6 DC', #JD
+    '3 25.3' => 'Sigma AF 28-300mm F3.5-5.6 DL IF', #JD
+    '3 25.4' => 'Sigma AF 28-300mm F3.5-6.3 DG IF Macro', #JD
+    '3 25.5' => 'Tokina 80-200mm F2.8 ATX-Pro', #12
+    '3 26' => 'smc PENTAX-F* 250-600mm F5.6 ED[IF]',
+    '3 27' => 'smc PENTAX-F 28-80mm F3.5-4.5 or Tokina Lens',
+    '3 27.1' => 'Tokina AT-X Pro AF 28-70mm F2.6-2.8', #JD
+    '3 28' => 'smc PENTAX-F 35-70mm F3.5-4.5 or Tokina Lens',
+    '3 28.1' => 'Tokina 19-35mm F3.5-4.5 AF', #12
+    '3 29' => 'PENTAX-F 28-80mm F3.5-4.5 or Sigma or Tokina Lens',
+    '3 29.1' => 'Sigma AF 18-125mm F3.5-5.6 DC', #11
+    '3 29.2' => 'Tokina AT-X PRO 28-70mm F2.6-2.8', #22
+    '3 30' => 'PENTAX-F 70-200mm F4-5.6',
+    '3 31' => 'smc PENTAX-F 70-210mm F4-5.6 or Tokina or Takumar Lens',
+    '3 31.1' => 'Tokina AF 730 75-300mm F4.5-5.6',
+    '3 31.2' => 'Takumar-F 70-210mm F4-5.6', #JD
+    '3 32' => 'smc PENTAX-F 50mm F1.4',
+    '3 33' => 'smc PENTAX-F 50mm F1.7',
+    '3 34' => 'smc PENTAX-F 135mm F2.8 [IF]',
+    '3 35' => 'smc PENTAX-F 28mm F2.8',
+    '3 36' => 'Sigma 20mm F1.8 EX DG Aspherical RF',
+    '3 38' => 'smc PENTAX-F* 300mm F4.5 ED[IF]',
+    '3 39' => 'smc PENTAX-F* 600mm F4 ED[IF]',
+    '3 40' => 'smc PENTAX-F Macro 100mm F2.8',
+    '3 41' => 'smc PENTAX-F Macro 50mm F2.8 or Sigma Lens', #4
+    '3 41.1' => 'Sigma 50mm F2.8 Macro', #16
+    '3 44' => 'Sigma or Tamron Lens (3 44)',
+    '3 44.1' => 'Sigma AF 10-20mm F4-5.6 EX DC', #JD
+    '3 44.2' => 'Sigma 12-24mm F4.5 EX DG', #12
+    '3 44.3' => 'Sigma 17-70mm F2.8-4.5 DC Macro', #(Bart Hickman)
+    '3 44.4' => 'Sigma 18-50mm F3.5-5.6 DC', #4
+    '3 44.5' => 'Tamron 35-90mm F4 AF', #12
+    '3 46' => 'Sigma Lens (3 46)',
+    '3 46.1' => 'Sigma APO 70-200mm F2.8 EX',
+    '3 46.2' => 'Sigma EX APO 100-300mm F4 IF', #JD
+    '3 50' => 'smc PENTAX-FA 28-70mm F4 AL',
+    '3 51' => 'Sigma 28mm F1.8 EX DG Aspherical Macro',
+    '3 52' => 'smc PENTAX-FA 28-200mm F3.8-5.6 AL[IF] or Tamron Lens',
+    '3 52.1' => 'Tamron AF LD 28-200mm F3.8-5.6 [IF] Aspherical (171D)', #JD
+    '3 53' => 'smc PENTAX-FA 28-80mm F3.5-5.6 AL',
+    '3 247' => 'smc PENTAX-DA FISH-EYE 10-17mm F3.5-4.5 ED[IF]',
+    '3 248' => 'smc PENTAX-DA 12-24mm F4 ED AL[IF]',
+    '3 250' => 'smc PENTAX-DA 50-200mm F4-5.6 ED',
+    '3 251' => 'smc PENTAX-DA 40mm F2.8 Limited',
+    '3 252' => 'smc PENTAX-DA 18-55mm F3.5-5.6 AL',
+    '3 253' => 'smc PENTAX-DA 14mm F2.8 ED[IF]',
+    '3 254' => 'smc PENTAX-DA 16-45mm F4 ED AL',
+    '3 255' => 'Sigma Lens (3 255)',
+    '3 255.1' => 'Sigma 18-200mm F3.5-6.3 DC', #8
+    '3 255.2' => 'Sigma DL-II 35-80mm F4-5.6', #12
+    '3 255.3' => 'Sigma DL Zoom 75-300mm F4-5.6', #12
+    '3 255.4' => 'Sigma DF EX Aspherical 28-70mm F2.8', #12
+    '3 255.5' => 'Sigma AF Tele 400mm F5.6 Multi-coated', #JD
+    '3 255.6' => 'Sigma 24-60mm F2.8 EX DG', #PH
+    '3 255.7' => 'Sigma 70-300mm F4-5.6 Macro', #JD
+    '3 255.8' => 'Sigma 55-200mm F4-5.6 DC', #JD
+    '3 255.9' => 'Sigma 18-50mm F2.8 EX DC', #JD
+    '4 1' => 'smc PENTAX-FA SOFT 28mm F2.8',
+    '4 2' => 'smc PENTAX-FA 80-320mm F4.5-5.6',
+    '4 3' => 'smc PENTAX-FA 43mm F1.9 Limited',
+    '4 6' => 'smc PENTAX-FA 35-80mm F4-5.6',
+    '4 12' => 'smc PENTAX-FA 50mm F1.4', #17
+    '4 15' => 'smc PENTAX-FA 28-105mm F4-5.6 [IF]',
+    '4 16' => 'Tamron AF 80-210mm F4-5.6 (178D)', #13
+    '4 19' => 'Tamron SP AF 90mm F2.8 (172E)',
+    '4 20' => 'smc PENTAX-FA 28-80mm F3.5-5.6',
+    '4 21' => 'Cosina AF 100-300mm F5.6-6.7', #20
+    '4 22' => 'Tokina 28-80mm F3.5-5.6', #13
+    '4 23' => 'smc PENTAX-FA 20-35mm F4 AL',
+    '4 24' => 'smc PENTAX-FA 77mm F1.8 Limited',
+    '4 25' => 'Tamron SP AF 14mm F2.8', #13
+    '4 26' => 'smc PENTAX-FA Macro 100mm F3.5 or Cosina Lens',
+    '4 26.1' => 'Cosina 100mm F3.5 Macro', #JD
+    '4 27' => 'Tamron AF 28-300mm F3.5-6.3 LD Aspherical[IF] Macro (185D/285D)',
+    '4 28' => 'smc PENTAX-FA 35mm F2 AL',
+    '4 29' => 'Tamron AF 28-200mm F3.8-5.6 LD Super II Macro (371D)', #JD
+    '4 34' => 'smc PENTAX-FA 24-90mm F3.5-4.5 AL[IF]',
+    '4 35' => 'smc PENTAX-FA 100-300mm F4.7-5.8',
+    '4 36' => 'Tamron AF70-300mm F4-5.6 LD Macro', # both 572D and A17 (Di) - ref JD
+    '4 37' => 'Tamron SP AF 24-135mm F3.5-5.6 AD AL (190D)', #13
+    '4 38' => 'smc PENTAX-FA 28-105mm F3.2-4.5 AL[IF]',
+    '4 39' => 'smc PENTAX-FA 31mm F1.8 AL Limited',
+    '4 41' => 'Tamron AF 28-200mm Super Zoom F3.8-5.6 Aspherical XR [IF] Macro (A03)',
+    '4 43' => 'smc PENTAX-FA 28-90mm F3.5-5.6',
+    '4 44' => 'smc PENTAX-FA J 75-300mm F4.5-5.8 AL',
+    '4 45' => 'Tamron Lens (4 45)',
+    '4 45.1' => 'Tamron 28-300mm F3.5-6.3 Ultra zoom XR',
+    '4 45.2' => 'Tamron AF 28-300mm F3.5-6.3 XR Di LD Aspherical [IF] Macro', #JD
+    '4 46' => 'smc PENTAX-FA J 28-80mm F3.5-5.6 AL',
+    '4 47' => 'smc PENTAX-FA J 18-35mm F4-5.6 AL',
+    '4 49' => 'Tamron SP AF 28-75mm F2.8 XR Di (A09)',
+    '4 51' => 'smc PENTAX-D FA 50mm F2.8 Macro',
+    '4 52' => 'smc PENTAX-D FA 100mm F2.8 Macro',
+    '4 75' => 'Tamron SP AF 70-200mm F2.8 Di LD [IF] Macro (A001)', #JD
+    '4 229' => 'smc PENTAX-DA 18-55mm F3.5-5.6 AL II', #JD
+    '4 230' => 'Tamron SP AF 17-50mm F2.8 XR Di II', #20
+    '4 231' => 'smc PENTAX-DA 18-250mm F3.5-6.3 ED AL [IF]', #21
+    '4 237' => 'Samsung/Schneider D-XENOGON 10-17mm F3.5-4.5', #JD
+    '4 239' => 'Samsung D-XENON 12-24mm F4 ED AL [IF]', #23
+    '4 243' => 'smc PENTAX-DA 70mm F2.4 Limited', #JD
+    '4 244' => 'smc PENTAX-DA 21mm F3.2 AL Limited', #9
+    '4 245' => 'Schneider D-XENON 50-200mm F4-5.6', #15
+    '4 246' => 'Schneider D-XENON 18-55mm F3.5-5.6', #15
+    '4 247' => 'smc PENTAX-DA FISH-EYE 10-17mm F3.5-4.5 ED[IF]', #10
+    '4 248' => 'smc PENTAX-DA 12-24mm F4 ED AL [IF]', #10
+    '4 249' => 'Tamron XR DiII 18-200mm F3.5-6.3 (A14)',
+    '4 250' => 'smc PENTAX-DA 50-200mm F4-5.6 ED', #8
+    '4 251' => 'smc PENTAX-DA 40mm F2.8 Limited', #9
+    '4 252' => 'smc PENTAX-DA 18-55mm F3.5-5.6 AL', #8
+    '4 253' => 'smc PENTAX-DA 14mm F2.8 ED[IF]',
+    '4 254' => 'smc PENTAX-DA 16-45mm F4 ED AL',
+    '5 1' => 'smc PENTAX-FA* 24mm F2 AL[IF]',
+    '5 2' => 'smc PENTAX-FA 28mm F2.8 AL',
+    '5 3' => 'smc PENTAX-FA 50mm F1.7',
+    '5 4' => 'smc PENTAX-FA 50mm F1.4',
+    '5 5' => 'smc PENTAX-FA* 600mm F4 ED[IF]',
+    '5 6' => 'smc PENTAX-FA* 300mm F4.5 ED[IF]',
+    '5 7' => 'smc PENTAX-FA 135mm F2.8 [IF]',
+    '5 8' => 'smc PENTAX-FA Macro 50mm F2.8',
+    '5 9' => 'smc PENTAX-FA Macro 100mm F2.8',
+    '5 10' => 'smc PENTAX-FA* 85mm F1.4 [IF]',
+    '5 11' => 'smc PENTAX-FA* 200mm F2.8 ED[IF]',
+    '5 12' => 'smc PENTAX-FA 28-80mm F3.5-4.7',
+    '5 13' => 'smc PENTAX-FA 70-200mm F4-5.6',
+    '5 14' => 'smc PENTAX-FA* 250-600mm F5.6 ED[IF]',
+    '5 15' => 'smc PENTAX-FA 28-105mm F4-5.6',
+    '5 16' => 'smc PENTAX-FA 100-300mm F4.5-5.6',
+    '5 98' => 'smc PENTAX-FA 100-300mm F4.5-5.6', #JD (pre-production? - PH)
+    '6 1' => 'smc PENTAX-FA* 85mm F1.4 [IF]',
+    '6 2' => 'smc PENTAX-FA* 200mm F2.8 ED[IF]',
+    '6 3' => 'smc PENTAX-FA* 300mm F2.8 ED[IF]',
+    '6 4' => 'smc PENTAX-FA* 28-70mm F2.8 AL',
+    '6 5' => 'smc PENTAX-FA* 80-200mm F2.8 ED[IF]',
+    '6 6' => 'smc PENTAX-FA* 28-70mm F2.8 AL',
+    '6 7' => 'smc PENTAX-FA* 80-200mm F2.8 ED[IF]',
+    '6 8' => 'smc PENTAX-FA 28-70mm F4AL',
+    '6 9' => 'smc PENTAX-FA 20mm F2.8',
+    '6 10' => 'smc PENTAX-FA* 400mm F5.6 ED[IF]',
+    '6 13' => 'smc PENTAX-FA* 400mm F5.6 ED[IF]',
+    '6 14' => 'smc PENTAX-FA* Macro 200mm F4 ED[IF]',
+    '7 0' => 'smc PENTAX-DA 21mm F3.2 AL Limited', #13
+    '7 58' => 'smc PENTAX-D FA Macro 100mm F2.8 WR', #PH - this bit of information cost me $600 ;)
+    '7 75' => 'Tamron SP AF 70-200mm F2.8 Di LD [IF] Macro (A001)', #(Anton Bondar)
+    '7 214' => 'smc PENTAX-DA 35mm F2.4 AL', #PH
+    '7 216' => 'smc PENTAX-DA L 55-300mm F4-5.8 ED', #PH
+    '7 217' => 'smc PENTAX-DA 50-200mm F4-5.6 ED WR', #JD
+    '7 218' => 'smc PENTAX-DA 18-55mm F3.5-5.6 AL WR', #JD
+    '7 220' => 'Tamron SP AF 10-24mm F3.5-4.5 Di II LD Aspherical [IF]', #24
+    '7 221' => 'smc PENTAX-DA L 50-200mm F4-5.6 ED', #Ar't
+    '7 222' => 'smc PENTAX-DA L 18-55mm F3.5-5.6', #PH (tag 0x003f -- was '7 229' in LensInfo of one test image)
+    '7 223' => 'Samsung D-XENON 18-55mm F3.5-5.6 II', #PH
+    '7 224' => 'smc PENTAX-DA 15mm F4 ED AL Limited', #JD
+    '7 225' => 'Samsung D-XENON 18-250mm F3.5-6.3', #8/PH
+    '7 226' => 'smc PENTAX-DA* 55mm F1.4 SDM (SDM unused)', #PH (NC)
+    '7 227' => 'smc PENTAX DA* 60-250mm F4 [IF] SDM (SDM unused)', #PH (NC)
+    '7 229' => 'smc PENTAX-DA 18-55mm F3.5-5.6 AL II', #JD
+    '7 230' => 'Tamron AF 17-50mm F2.8 XR Di-II LD (Model A16)', #JD
+    '7 231' => 'smc PENTAX-DA 18-250mm F3.5-6.3 ED AL [IF]', #JD
+    '7 233' => 'smc PENTAX-DA 35mm F2.8 Macro Limited', #JD
+    '7 234' => 'smc PENTAX-DA* 300mm F4 ED [IF] SDM (SDM unused)', #19 (NC)
+    '7 235' => 'smc PENTAX-DA* 200mm F2.8 ED [IF] SDM (SDM unused)', #PH (NC)
+    '7 236' => 'smc PENTAX-DA 55-300mm F4-5.8 ED', #JD
+    '7 238' => 'Tamron AF 18-250mm F3.5-6.3 Di II LD Aspherical [IF] Macro', #JD
+    '7 241' => 'smc PENTAX-DA* 50-135mm F2.8 ED [IF] SDM (SDM unused)', #PH
+    '7 242' => 'smc PENTAX-DA* 16-50mm F2.8 ED AL [IF] SDM (SDM unused)', #19
+    '7 243' => 'smc PENTAX-DA 70mm F2.4 Limited', #PH
+    '7 244' => 'smc PENTAX-DA 21mm F3.2 AL Limited', #16
+    '8 14' => 'Sigma 17-70mm F2.8-4.0 DC Macro OS HSM', #(Hubert Meier)
+    '8 18' => 'Sigma 8-16mm F4.5-5.6 DC HSM', #http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,2998.0.html
+    '8 215' => 'smc PENTAX-DA 18-135mm F3.5-5.6 ED AL [IF] DC WR', #PH
+    '8 226' => 'smc PENTAX-DA* 55mm F1.4 SDM', #JD
+    '8 227' => 'smc PENTAX DA* 60-250mm F4 [IF] SDM', #JD
+    '8 232' => 'smc PENTAX-DA 17-70mm F4 AL [IF] SDM', #JD
+    '8 234' => 'smc PENTAX-DA* 300mm F4 ED [IF] SDM', #19
+    '8 235' => 'smc PENTAX-DA* 200mm F2.8 ED [IF] SDM', #JD
+    '8 241' => 'smc PENTAX-DA* 50-135mm F2.8 ED [IF] SDM', #JD
+    '8 242' => 'smc PENTAX-DA* 16-50mm F2.8 ED AL [IF] SDM', #JD
+    '8 255' => 'Sigma Lens (8 255)',
+    '8 255.1' => 'Sigma 70-200mm F2.8 EX DG Macro HSM II', #JD
+    '8 255.2' => 'Sigma APO 150-500mm F5-6.3 DG OS HSM', #JD
+    '8 255.3' => 'Sigma 50-150mm F2.8 II APO EX DC HSM', #http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,2997.0.html
+    '11 4' => 'smc PENTAX-FA 645 45-85mm F4.5', #PH
+    '11 8' => 'smc PENTAX-FA 645 80-160mm F4.5', #PH
+    '11 11' => 'smc PENTAX-FA 645 35mm F3.5 AL [IF]', #PH
+    '11 17' => 'smc PENTAX-FA 645 150-300mm F5.6 ED [IF]', #PH
+    '13 18' => 'smc PENTAX-D FA 645 55mm F2.8 AL [IF] SDM AW', #PH
+);
+
+# Pentax model ID codes - PH
+my %pentaxModelID = (
+    0x0000d => 'Optio 330/430',
+    0x12926 => 'Optio 230',
+    0x12958 => 'Optio 330GS',
+    0x12962 => 'Optio 450/550',
+    0x1296c => 'Optio S',
+    0x12971 => 'Optio S V1.01',
+    0x12994 => '*ist D',
+    0x129b2 => 'Optio 33L',
+    0x129bc => 'Optio 33LF',
+    0x129c6 => 'Optio 33WR/43WR/555',
+    0x129d5 => 'Optio S4',
+    0x12a02 => 'Optio MX',
+    0x12a0c => 'Optio S40',
+    0x12a16 => 'Optio S4i',
+    0x12a34 => 'Optio 30',
+    0x12a52 => 'Optio S30',
+    0x12a66 => 'Optio 750Z',
+    0x12a70 => 'Optio SV',
+    0x12a75 => 'Optio SVi',
+    0x12a7a => 'Optio X',
+    0x12a8e => 'Optio S5i',
+    0x12a98 => 'Optio S50',
+    0x12aa2 => '*ist DS',
+    0x12ab6 => 'Optio MX4',
+    0x12ac0 => 'Optio S5n',
+    0x12aca => 'Optio WP',
+    0x12afc => 'Optio S55',
+    0x12b10 => 'Optio S5z',
+    0x12b1a => '*ist DL',
+    0x12b24 => 'Optio S60',
+    0x12b2e => 'Optio S45',
+    0x12b38 => 'Optio S6',
+    0x12b4c => 'Optio WPi', #13
+    0x12b56 => 'BenQ DC X600',
+    0x12b60 => '*ist DS2',
+    0x12b62 => 'Samsung GX-1S',
+    0x12b6a => 'Optio A10',
+    0x12b7e => '*ist DL2',
+    0x12b80 => 'Samsung GX-1L',
+    0x12b9c => 'K100D',
+    0x12b9d => 'K110D',
+    0x12ba2 => 'K100D Super', #JD
+    0x12bb0 => 'Optio T10/T20',
+    0x12be2 => 'Optio W10',
+    0x12bf6 => 'Optio M10',
+    0x12c1e => 'K10D',
+    0x12c20 => 'Samsung GX10',
+    0x12c28 => 'Optio S7',
+    0x12c2d => 'Optio L20',
+    0x12c32 => 'Optio M20',
+    0x12c3c => 'Optio W20',
+    0x12c46 => 'Optio A20',
+    0x12c8c => 'Optio M30',
+    0x12c78 => 'Optio E30',
+    0x12c7d => 'Optio E35',
+    0x12c82 => 'Optio T30',
+    0x12c91 => 'Optio L30',
+    0x12c96 => 'Optio W30',
+    0x12ca0 => 'Optio A30',
+    0x12cb4 => 'Optio E40',
+    0x12cbe => 'Optio M40',
+    0x12cc3 => 'Optio L40',
+    0x12cc5 => 'Optio L36',
+    0x12cc8 => 'Optio Z10',
+    0x12cd2 => 'K20D',
+    0x12cd4 => 'Samsung GX20', #8
+    0x12cdc => 'Optio S10',
+    0x12ce6 => 'Optio A40',
+    0x12cf0 => 'Optio V10',
+    0x12cfa => 'K200D',
+    0x12d04 => 'Optio S12',
+    0x12d0e => 'Optio E50',
+    0x12d18 => 'Optio M50',
+    0x12d22 => 'Optio L50',
+    0x12d2c => 'Optio V20',
+    0x12d40 => 'Optio W60',
+    0x12d4a => 'Optio M60',
+    0x12d68 => 'Optio E60/M90',
+    0x12d72 => 'K2000',
+    0x12d73 => 'K-m',
+    0x12d86 => 'Optio P70',
+    0x12d90 => 'Optio L70',
+    0x12d9a => 'Optio E70',
+    0x12dae => 'X70',
+    0x12db8 => 'K-7',
+    0x12dcc => 'Optio W80',
+    0x12dea => 'Optio P80',
+    0x12df4 => 'Optio WS80',
+    0x12dfe => 'K-x',
+    0x12e08 => '645D',
+    0x12e12 => 'Optio E80',
+    0x12e30 => 'Optio W90',
+    0x12e3a => 'Optio I-10',
+    0x12e44 => 'Optio H90',
+    0x12e4e => 'Optio E90',
+    0x12e58 => 'X90',
+    0x12e6c => 'K-r',
+    0x12e76 => 'K-5',
+    0x12e8a => 'Optio RS1000 / RS1500',
+    0x12e94 => 'Optio RZ10',
+    0x12ebc => 'Optio WG-1 GPS',
+);
+
+# Pentax city codes - (PH, Optio WP)
+my %pentaxCities = (
+    0 => 'Pago Pago',
+    1 => 'Honolulu',
+    2 => 'Anchorage',
+    3 => 'Vancouver',
+    4 => 'San Fransisco',
+    5 => 'Los Angeles',
+    6 => 'Calgary',
+    7 => 'Denver',
+    8 => 'Mexico City',
+    9 => 'Chicago',
+    10 => 'Miami',
+    11 => 'Toronto',
+    12 => 'New York',
+    13 => 'Santiago',
+    14 => 'Caracus',
+    15 => 'Halifax',
+    16 => 'Buenos Aires',
+    17 => 'Sao Paulo',
+    18 => 'Rio de Janeiro',
+    19 => 'Madrid',
+    20 => 'London',
+    21 => 'Paris',
+    22 => 'Milan',
+    23 => 'Rome',
+    24 => 'Berlin',
+    25 => 'Johannesburg',
+    26 => 'Istanbul',
+    27 => 'Cairo',
+    28 => 'Jerusalem',
+    29 => 'Moscow',
+    30 => 'Jeddah',
+    31 => 'Tehran',
+    32 => 'Dubai',
+    33 => 'Karachi',
+    34 => 'Kabul',
+    35 => 'Male',
+    36 => 'Delhi',
+    37 => 'Colombo',
+    38 => 'Kathmandu',
+    39 => 'Dacca',
+    40 => 'Yangon',
+    41 => 'Bangkok',
+    42 => 'Kuala Lumpur',
+    43 => 'Vientiane',
+    44 => 'Singapore',
+    45 => 'Phnom Penh',
+    46 => 'Ho Chi Minh',
+    47 => 'Jakarta',
+    48 => 'Hong Kong',
+    49 => 'Perth',
+    50 => 'Beijing',
+    51 => 'Shanghai',
+    52 => 'Manila',
+    53 => 'Taipei',
+    54 => 'Seoul',
+    55 => 'Adelaide',
+    56 => 'Tokyo',
+    57 => 'Guam',
+    58 => 'Sydney',
+    59 => 'Noumea',
+    60 => 'Wellington',
+    61 => 'Auckland',
+    62 => 'Lima',
+    63 => 'Dakar',
+    64 => 'Algiers',
+    65 => 'Helsinki',
+    66 => 'Athens',
+    67 => 'Nairobi',
+    68 => 'Amsterdam',
+    69 => 'Stockholm',
+    70 => 'Lisbon', #14
+    71 => 'Copenhagen', #25
+    72 => 'Warsaw',
+    73 => 'Prague',
+    74 => 'Budapest',
+);
+
+# digital filter tag information (ref PH, K-5)
+# (also see %filterSettings below for decoding of filter parameters)
+my %digitalFilter = (
+    Format => 'undef[17]',
+    RawConv => '($val!~/^\\0/ or $$self{OPTIONS}{Unknown}) ? join(" ",unpack("Cc*",$val)) : undef',
+    SeparateTable => 'DigitalFilter',
+    ValueConvInv => q{
+        return "\0" x 17 if $val eq "0";
+        $val = pack("Cc*", $val=~/[-+]?\d+/g);
+        length($val)==17 or warn("Expecting 17 values\n"), return undef;
+        return $val;
+    },
+    PrintConv => {
+        OTHER => \&PrintFilter, # this routine actually converts all values
+        0 => 'Off',
+        1 => 'Base Parameter Adjust',
+        2 => 'Soft Focus',
+        3 => 'High Contrast',
+        4 => 'Color Filter',
+        5 => 'Extract Color',
+        6 => 'Monochrome',
+        7 => 'Slim',
+        9 => 'Fisheye',
+        10 => 'Toy Camera',
+        11 => 'Retro',
+        12 => 'Pastel',
+        13 => 'Water Color',
+        14 => 'HDR',
+        16 => 'Miniature',
+        17 => 'Starburst',
+        18 => 'Posterization',
+        19 => 'Sketch Filter',
+        254 => 'Custom Filter',
+    },
+);
+
+# digital filter setting names and conversions (ref PH, K-5)
+# Note: names must be unique for writing
+my %filterSettings = (
+    1  => ['Brightness', '%+d'],    # BPA (-8-+8)
+    2  => ['Saturation', '%+d'],    # BPA (-3-+3)
+    3  => ['Hue', '%+d'],           # BPA (-3-+3)
+    4  => ['Contrast', '%+d'],      # BPA (-3-+3)
+    5  => ['Sharpness', '%+d'],     # BPA (-3-+3)
+    6  => ['SoftFocus', '%d'],      # Soft Focus/Custom (1-3)
+    7  => ['ShadowBlur',    { 0=>'Off',1=>'On' }], # Soft Focus
+    8  => ['HighContrast', '%d'],   # High Contrast/Custom (1-5)
+    9  => ['Color',         { 1=>'Red',2=>'Magenta',3=>'Blue',4=>'Cyan',5=>'Green',6=>'Yellow' }], # Color Filter
+    10 => ['Density',       { 1=>'Light',2=>'Standard',3=>'Dark' }], # Color Filter
+    11 => ['ExtractedColor',{ 0=>'Off',1=>'Red',2=>'Magenta',3=>'Blue',4=>'Cyan',5=>'Green',6=>'Yellow' }], # ExtractColor [x2]
+    12 => ['ColorRange', '%+d'],    # ExtractColor [x2] (-2-+2)
+    13 => ['FilterEffect',  { 0=>'Off',1=>'Red',2=>'Green',3=>'Blue',4=>'Infrared'}], # Monochrome
+    14 => ['ToningBA', '%+d'],      # Monochrome (-3-+3)
+    15 => ['InvertColor',   { 0=>'Off',1=>'On' }], # Custom
+    16 => ['Slim', '%+d'],          # Slim (-8-+8)
+    17 => ['EffectDensity', { 1=>'Sparse',2=>'Normal',3=>'Dense' }], # Starburst
+    18 => ['Size',          { 1=>'Small',2=>'Medium',3=>'Large' }], # Starburst
+    19 => ['Angle',         { 0=>'0deg',2=>'30deg',3=>'45deg',4=>'60deg'}], # Starburst (1 is unused)
+    20 => ['Fisheye',       { 1=>'Weak',2=>'Medium',3=>'Strong' }], # Fisheye
+    21 => ['DistortionType', '%d'], # Custom (1-3)
+    22 => ['DistortionLevel',{0=>'Off',1=>'Weak',2=>'Medium',3=>'Strong' }], #Custom
+    23 => ['ShadingType', '%d'],    # Custom (1-6)
+    24 => ['ShadingLevel', '%+d'],  # Custom (-3-+3)
+    25 => ['Shading', '%d'],        # Toy Camera (1-3)
+    26 => ['Blur',  '%d'],          # Toy Camera (1-3)
+    27 => ['ToneBreak',     { 0=>'Off',1=>'Red',2=>'Green',3=>'Blue',4=>'Yellow'}], # Toy Camera/Custom
+    28 => ['Toning', '%+d'],        # Retro (-3-+3)
+    29 => ['FrameComposite',{ 0=>'None',1=>'Thin',2=>'Medium',3=>'Thick' }], # Retro
+    30 => ['PastelStrength',{ 1=>'Weak',2=>'Medium',3=>'Strong' }], # Pastel
+    31 => ['Intensity', '%d'],      # Water Color (1-3)
+    32 => ['Saturation2',   { 0=>'Off',1=>'Low',2=>'Medium',3=>'High' }], # Water Color
+    33 => ['HDR',           { 1=>'Weak',2=>'Medium',3=>'Strong' }], # HDR
+    35 => ['FocusPlane', '%+d'],    # Miniature (-3-+3)
+    36 => ['FocusWidth',    { 1=>'Narrow',2=>'Middle',3=>'Wide' }], # Miniature
+    37 => ['PlaneAngle',    { 0=>'Horizontal',1=>'Vertical',2=>'Positive slope',3=>'Negative slope' }], # Miniature
+    38 => ['Blur2', '%d'],          # Miniature (1-3)
+    39 => ['Shape',         { 1=>'Cross',2=>'Star',3=>'Snowflake',4=>'Heart',5=>'Note'}], # Starburst
+    40 => ['Posterization', '%d'],  # Posterization (1-5)
+    41 => ['Contrast2',     { 1=>'Low',2=>'Medium',3=>'High'}], # Sketch Filter
+    42 => ['ScratchEffect', { 0=>'Off',1=>'On' }], # Sketch Filter
+);
+
+# decoding for Pentax Firmware ID tags - PH
+my %pentaxFirmwareID = (
+    # the first 2 numbers are the firmware version, I'm not sure what the second 2 mean
+    # Note: the byte order may be different for some models
+    # which give, for example, version 0.01 instead of 1.00
+    ValueConv => sub {
+        my $val = shift;
+        return $val unless length($val) == 4;
+        # (value is encrypted by toggling all bits)
+        my @a = map { $_ ^ 0xff } unpack("C*",$val);
+        return sprintf('%d %.2d %.2d %.2d', @a);
+    },
+    ValueConvInv => sub {
+        my $val = shift;
+        my @a = $val=~/\b\d+\b/g;
+        return $val unless @a == 4;
+        @a = map { ($_ & 0xff) ^ 0xff } @a;
+        return pack("C*", @a);
+    },
+    PrintConv => '$val=~tr/ /./; $val',
+    PrintConvInv => '$val=~s/^(\d+)\.(\d+)\.(\d+)\.(\d+)/$1 $2 $3 $4/ ? $val : undef',
+);
+
+# convert 16 or 77 metering segment values to approximate LV equivalent - PH
+my %convertMeteringSegments = (
+    PrintConv    => sub { join ' ', map(
+        { $_==255 ? 'n/a' : $_==0 ? '0' : sprintf '%.1f', $_ / 8 - 6 } split(' ',$_[0])
+    ) },
+    PrintConvInv => sub { join ' ', map(
+        { /^n/i ? 255 : $_==0 ? '0' : int(($_ + 6) * 8 + 0.5) }        split(' ',$_[0])
+    ) },
+);
+
+# lens code conversions
+my %lensCode = (
+    Unknown => 1,
+    PrintConv => 'sprintf("0x%.2x", $val)',
+    PrintConvInv => 'hex($val)',
+);
+
+# common attributes for writable BinaryData directories
+my %binaryDataAttrs = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+);
+
+# Pentax makernote tags
+%Image::ExifTool::Pentax::Main = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    WRITABLE => 1,
+    0x0000 => { #5
+        Name => 'PentaxVersion',
+        Writable => 'int8u',
+        Count => 4,
+        PrintConv => '$val=~tr/ /./; $val',
+        PrintConvInv => '$val=~tr/./ /; $val',
+    },
+    0x0001 => { #PH
+        Name => 'PentaxModelType',
+        Writable => 'int16u',
+        # (values of 0-5 seem to group models into 6 categories, ref 13)
+    },
+    0x0002 => { #PH
+        Name => 'PreviewImageSize',
+        Groups => { 2 => 'Image' },
+        Writable => 'int16u',
+        Count => 2,
+        PrintConv => '$val =~ tr/ /x/; $val',
+    },
+    0x0003 => { #PH
+        Name => 'PreviewImageLength',
+        OffsetPair => 0x0004, # point to associated offset
+        DataTag => 'PreviewImage',
+        Groups => { 2 => 'Image' },
+        Writable => 'int32u',
+        Protected => 2,
+    },
+    0x0004 => { #PH
+        Name => 'PreviewImageStart',
+        IsOffset => 2,  # code to use original base
+        Protected => 2,
+        OffsetPair => 0x0003, # point to associated byte count
+        DataTag => 'PreviewImage',
+        Groups => { 2 => 'Image' },
+        Writable => 'int32u',
+    },
+    0x0005 => { #13
+        Name => 'PentaxModelID',
+        Writable => 'int32u',
+        PrintHex => 1,
+        SeparateTable => 1,
+        PrintConv => \%pentaxModelID,
+    },
+    0x0006 => { #5
+        # Note: Year is int16u in MM byte ordering regardless of EXIF byte order
+        Name => 'Date',
+        Groups => { 2 => 'Time' },
+        Notes => 'changing either Date or Time will affect ShutterCount decryption',
+        Writable => 'undef',
+        Count => 4,
+        Shift => 'Time',
+        DataMember => 'PentaxDate',
+        RawConv => '$$self{PentaxDate} = $val', # save to decrypt ShutterCount
+        ValueConv => 'length($val)==4 ? sprintf("%.4d:%.2d:%.2d",unpack("nC2",$val)) : "Unknown ($val)"',
+        ValueConvInv => q{
+            $val =~ s/(\d) .*/$1/;          # remove Time
+            my @v = split /:/, $val;
+            return pack("nC2",$v[0],$v[1],$v[2]);
+        },
+    },
+    0x0007 => { #5
+        Name => 'Time',
+        Groups => { 2 => 'Time' },
+        Writable => 'undef',
+        Count => 3,
+        Shift => 'Time',
+        DataMember => 'PentaxTime',
+        RawConv => '$$self{PentaxTime} = $val', # save to decrypt ShutterCount
+        ValueConv => 'length($val)>=3 ? sprintf("%.2d:%.2d:%.2d",unpack("C3",$val)) : "Unknown ($val)"',
+        ValueConvInv => q{
+            $val =~ s/^[0-9:]+ (\d)/$1/;    # remove Date
+            return pack("C3",split(/:/,$val));
+        },
+    },
+    0x0008 => { #2
+        Name => 'Quality',
+        Writable => 'int16u',
+        PrintConvColumns => 2,
+        PrintConv => {
+            0 => 'Good',
+            1 => 'Better',
+            2 => 'Best',
+            3 => 'TIFF', #5
+            4 => 'RAW', #5
+            5 => 'Premium', #PH (K20D)
+        },
+    },
+    0x0009 => { #3
+        Name => 'PentaxImageSize',
+        Groups => { 2 => 'Image' },
+        Writable => 'int16u',
+        PrintConvColumns => 2,
+        PrintConv => {
+            0 => '640x480',
+            1 => 'Full', #PH - this can mean 2048x1536 or 2240x1680 or ... ?
+            2 => '1024x768',
+            3 => '1280x960', #PH (Optio WP)
+            4 => '1600x1200',
+            5 => '2048x1536',
+            8 => '2560x1920 or 2304x1728', #PH (Optio WP) or #14
+            9 => '3072x2304', #PH (Optio M30)
+            10 => '3264x2448', #13
+            19 => '320x240', #PH (Optio WP)
+            20 => '2288x1712', #13
+            21 => '2592x1944',
+            22 => '2304x1728 or 2592x1944', #2 or #14
+            23 => '3056x2296', #13
+            25 => '2816x2212 or 2816x2112', #13 or #14
+            27 => '3648x2736', #PH (Optio A20)
+            29 => '4000x3000', #PH (X70)
+            30 => '4288x3216', #PH (Optio RS1000)
+            129 => '1920x1080', #PH (Optio RZ10)
+            257 => '3216x3216', #PH (Optio RZ10)
+            '0 0' => '2304x1728', #13
+            '4 0' => '1600x1200', #PH (Optio MX4)
+            '5 0' => '2048x1536', #13
+            '8 0' => '2560x1920', #13
+            '32 2' => '960x640', #7
+            '33 2' => '1152x768', #7
+            '34 2' => '1536x1024', #7
+            '35 1' => '2400x1600', #7
+            '36 0' => '3008x2008 or 3040x2024',  #PH
+            '37 0' => '3008x2000', #13
+        },
+    },
+    0x000b => { #3
+        Name => 'PictureMode',
+        Writable => 'int16u',
+        Count => -1,
+        Notes => q{
+            1 or 2 values.  Decimal values differentiate Optio 555 modes which are
+            different from other models
+        },
+        ValueConv => '($val < 4 and $$self{Model} =~ /Optio 555\b/) ? $val + 0.1 : $val',
+        ValueConvInv => 'int $val',
+        PrintConvColumns => 2,
+        PrintConv => [{
+            0 => 'Program', #PH
+            0.1 => 'Av', #PH (Optio 555)
+            1 => 'Shutter Speed Priority', #JD
+            1.1 => 'M', #PH (Optio 555)
+            2 => 'Program AE', #13
+            2.1 => 'Tv', #PH (Optio 555)
+            3 => 'Manual', #13
+            3.1 => 'USER', #PH (Optio 555)
+            5 => 'Portrait',
+            6 => 'Landscape',
+            8 => 'Sport', #PH
+            9 => 'Night Scene',
+            # 10 "full mode"? #13
+            11 => 'Soft', #PH
+            12 => 'Surf & Snow',
+            13 => 'Candlelight', #13
+            14 => 'Autumn',
+            15 => 'Macro',
+            17 => 'Fireworks',
+            18 => 'Text',
+            19 => 'Panorama', #PH
+            20 => '3-D', #PH (Optio 555)
+            21 => 'Black & White', #PH (Optio 555)
+            22 => 'Sepia', #PH (Optio 555)
+            23 => 'Red', #PH (Optio 555)
+            24 => 'Pink', #PH (Optio 555)
+            25 => 'Purple', #PH (Optio 555)
+            26 => 'Blue', #PH (Optio 555)
+            27 => 'Green', #PH (Optio 555)
+            28 => 'Yellow', #PH (Optio 555)
+            30 => 'Self Portrait', #PH
+            31 => 'Illustrations', #13
+            33 => 'Digital Filter', #13
+            35 => 'Night Scene Portrait', #25
+            37 => 'Museum', #PH
+            38 => 'Food', #PH
+            39 => 'Underwater', #25
+            40 => 'Green Mode', #PH
+            49 => 'Light Pet', #PH
+            50 => 'Dark Pet', #PH
+            51 => 'Medium Pet', #PH
+            53 => 'Underwater', #PH
+            54 => 'Candlelight', #PH
+            55 => 'Natural Skin Tone', #PH
+            56 => 'Synchro Sound Record', #PH
+            58 => 'Frame Composite', #14
+            59 => 'Report', #25
+            60 => 'Kids', #13
+            61 => 'Blur Reduction', #13
+            65 => 'Half-length Portrait', #JD
+            221 => 'P', #PH (Optio 555)
+            255=> 'PICT', #PH (Optio 555)
+        }],
+    },
+    0x000c => { #PH
+        Name => 'FlashMode',
+        Writable => 'int16u',
+        Count => -1,
+        PrintHex => 1,
+        PrintConv => [{
+            0x000 => 'Auto, Did not fire',
+            0x001 => 'Off, Did not fire',
+            0x002 => 'On, Did not fire', #19
+            0x003 => 'Auto, Did not fire, Red-eye reduction',
+            0x005 => 'On, Did not fire, Wireless (Master)', #19
+            0x100 => 'Auto, Fired',
+            0x102 => 'On, Fired',
+            0x103 => 'Auto, Fired, Red-eye reduction',
+            0x104 => 'On, Red-eye reduction',
+            0x105 => 'On, Wireless (Master)', #19
+            0x106 => 'On, Wireless (Control)', #19
+            0x108 => 'On, Soft',
+            0x109 => 'On, Slow-sync',
+            0x10a => 'On, Slow-sync, Red-eye reduction',
+            0x10b => 'On, Trailing-curtain Sync',
+        },{ #19 (AF-540FGZ flash)
+            0x000 => 'n/a - Off-Auto-Aperture', #19
+            0x03f => 'Internal',
+            0x100 => 'External, Auto',
+            0x23f => 'External, Flash Problem', #JD
+            0x300 => 'External, Manual',
+            0x304 => 'External, P-TTL Auto',
+            0x305 => 'External, Contrast-control Sync', #JD
+            0x306 => 'External, High-speed Sync',
+            0x30c => 'External, Wireless',
+            0x30d => 'External, Wireless, High-speed Sync',
+        }],
+    },
+    0x000d => [ #2
+        {
+            Name => 'FocusMode',
+            Condition => '$self->{Make} =~ /^PENTAX/',
+            Notes => 'Pentax models',
+            Writable => 'int16u',
+            PrintConvColumns => 2,
+            PrintConv => { #PH
+                0 => 'Normal',
+                1 => 'Macro',
+                2 => 'Infinity',
+                3 => 'Manual',
+                4 => 'Super Macro', #JD
+                5 => 'Pan Focus',
+                16 => 'AF-S', #17
+                17 => 'AF-C', #17
+                18 => 'AF-A', #PH (educated guess)
+                32 => 'Contrast-detect', #PH (K-5)
+                33 => 'Tracking Contrast-detect', #PH (K-5)
+            },
+        },
+        {
+            Name => 'FocusMode',
+            Writable => 'int16u',
+            Notes => 'Asahi models',
+            PrintConv => { #2
+                0 => 'Normal',
+                1 => 'Macro (1)',
+                2 => 'Macro (2)',
+                3 => 'Infinity',
+            },
+        },
+    ],
+    0x000e => { #7
+        Name => 'AFPointSelected',
+        Writable => 'int16u',
+        PrintConvColumns => 2,
+        PrintConv => {
+            # 0 - Contrast-detect AF? - PH (K-5)
+            0xffff => 'Auto',
+            0xfffe => 'Fixed Center',
+            0xfffd => 'Automatic Tracking AF', #JD
+            0xfffc => 'Face Detect AF', #JD
+            1 => 'Upper-left',
+            2 => 'Top',
+            3 => 'Upper-right',
+            4 => 'Left',
+            5 => 'Mid-left',
+            6 => 'Center',
+            7 => 'Mid-right',
+            8 => 'Right',
+            9 => 'Lower-left',
+            10 => 'Bottom',
+            11 => 'Lower-right',
+        },
+    },
+    0x000f => { #PH
+        Name => 'AFPointsInFocus',
+        Writable => 'int16u',
+        PrintHex => 1,
+        PrintConv => {
+            0xffff => 'None',
+            0 => 'Fixed Center or Multiple', #PH/14
+            1 => 'Top-left',
+            2 => 'Top-center',
+            3 => 'Top-right',
+            4 => 'Left',
+            5 => 'Center',
+            6 => 'Right',
+            7 => 'Bottom-left',
+            8 => 'Bottom-center',
+            9 => 'Bottom-right',
+        },
+    },
+    0x0010 => { #PH
+        Name => 'FocusPosition',
+        Writable => 'int16u',
+        Notes => 'related to focus distance but affected by focal length',
+    },
+    0x0012 => { #PH
+        Name => 'ExposureTime',
+        Writable => 'int32u',
+        Priority => 0,
+        ValueConv => '$val * 1e-5',
+        ValueConvInv => '$val * 1e5',
+        # value may be 0xffffffff in Bulb mode (ref JD)
+        PrintConv => '$val > 42949 ? "Unknown (Bulb)" : Image::ExifTool::Exif::PrintExposureTime($val)',
+        PrintConvInv => '$val=~/(unknown|bulb)/i ? $val : Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    0x0013 => { #PH
+        Name => 'FNumber',
+        Writable => 'int16u',
+        Priority => 0,
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+        PrintConv => 'sprintf("%.1f",$val)',
+        PrintConvInv => '$val',
+    },
+    # ISO Tag - Entries confirmed by W. Smith 12 FEB 04
+    0x0014 => {
+        Name => 'ISO',
+        Writable => 'int16u',
+        Notes => 'may be different than EXIF:ISO, which can round to the nearest full stop',
+        PrintConvColumns => 4,
+        PrintConv => {
+            # 1/3 EV step values
+            3 => 50,
+            4 => 64,
+            5 => 80,
+            6 => 100,
+            7 => 125, #PH
+            8 => 160, #PH
+            9 => 200,
+            10 => 250,
+            11 => 320, #PH
+            12 => 400,
+            13 => 500,
+            14 => 640,
+            15 => 800,
+            16 => 1000,
+            17 => 1250,
+            18 => 1600, #PH
+            19 => 2000, #PH
+            20 => 2500, #PH
+            21 => 3200, #PH
+            22 => 4000,
+            23 => 5000,
+            24 => 6400, #PH
+            25 => 8000, #PH
+            26 => 10000, #PH
+            27 => 12800, #PH
+            28 => 16000, #PH
+            29 => 20000, #PH
+            30 => 25600, #PH
+            31 => 32000, #PH
+            32 => 40000, #PH
+            33 => 51200, #PH
+            # Optio 330/430 (oddball)
+            50 => 50, #PH
+            100 => 100, #PH
+            200 => 200, #PH
+            400 => 400, #PH
+            800 => 800, #PH
+            1600 => 1600, #PH
+            3200 => 3200, #PH
+            # 1/2 EV step values
+            258 => 50, #PH (NC)
+            259 => 70, #PH (NC)
+            260 => 100, #19
+            261 => 140, #19
+            262 => 200, #19
+            263 => 280, #19
+            264 => 400, #19
+            265 => 560, #19
+            266 => 800, #19
+            267 => 1100, #19
+            268 => 1600, #19
+            269 => 2200, #PH
+            270 => 3200, #PH
+            271 => 4500, #PH
+            272 => 6400, #PH
+            273 => 9000, #PH
+            274 => 12800, #PH
+            275 => 18000, #PH
+            276 => 25600, #PH
+            277 => 36000, #PH
+            278 => 51200, #PH
+        },
+    },
+    0x0015 => { #PH
+        Name => 'LightReading',
+        Format => 'int16s', # (because I may have seen negative numbers)
+        Writable => 'int16u',
+        # ranges from 0-12 for my Optio WP - PH
+        Notes => q{
+            calibrated differently for different models.  For the Optio WP, add 6 to get
+            approximate Light Value.  May not be valid for some models, ie. Optio S
+        },
+    },
+    0x0016 => { #PH
+        Name => 'ExposureCompensation',
+        Writable => 'int16u',
+        ValueConv => '($val - 50) / 10',
+        ValueConvInv => 'int($val * 10 + 50.5)',
+        PrintConv => '$val ? sprintf("%+.1f", $val) : 0',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    0x0017 => { #3
+        Name => 'MeteringMode',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Multi-segment',
+            1 => 'Center-weighted average',
+            2 => 'Spot',
+            # have seen value of 16 for E70
+        },
+    },
+    0x0018 => { #PH
+        Name => 'AutoBracketing',
+        Writable => 'int16u',
+        Count => -1,
+        Notes => q{
+            1 or 2 values: exposure bracket step in EV, then extended bracket if
+            available.  Extended bracket values are printed as 'WB-BA', 'WB-GM',
+            'Saturation', 'Sharpness', 'Contrast', 'Hue' or 'HighLowKey' followed by
+            '+1', '+2' or '+3' for step size
+        },
+        # 1=.3ev, 2=.7, 3=1.0, ... 10=.5ev, 11=1.5, ...
+        ValueConv => [ '$val<10 ? $val/3 : $val-9.5' ],
+        ValueConvInv => [ 'abs($val-int($val)-.5)>0.05 ? int($val*3+0.5) : int($val+10)' ],
+        PrintConv => sub {
+            my @v = split(' ', shift);
+            $v[0] = sprintf('%.1f', $v[0]) if $v[0];
+            if ($v[1]) {
+                my %s = (1=>'WB-BA',2=>'WB-GM',3=>'Saturation',4=>'Sharpness',
+                         5=>'Contrast',6=>'Hue',7=>'HighLowKey');
+                my $t = $v[1] >> 8;
+                $v[1] = sprintf('%s+%d', $s{$t} || "Unknown($t)", $v[1] & 0xff);
+            } elsif (defined $v[1]) {
+                $v[1] = 'No Extended Bracket',
+            }
+            return join(' EV, ', @v);
+        },
+        PrintConvInv => sub {
+            my @v = split(/, ?/, shift);
+            $v[0] =~ s/ ?EV//i;
+            if ($v[1]) {
+                my %s = ('WB-BA'=>1,'WB-GM'=>2,'Saturation'=>3,'Sharpness'=>4,
+                         'Contrast'=>5,'Hue'=>6,'HighLowKey'=>7);
+                if ($v[1] =~ /^No\b/i) {
+                    $v[1] = 0;
+                } elsif ($v[1] =~ /Unknown\((\d+)\)\+(\d+)/i) {
+                    $v[1] = ($1 << 8) + $2;
+                } elsif ($v[1] =~ /([\w-]+)\+(\d+)/ and $s{$1}) {
+                    $v[1] = ($s{$1} << 8) + $2;
+                } else {
+                    warn "Bad extended bracket\n";
+                }
+            }
+            return "@v";
+        },
+    },
+    0x0019 => { #3
+        Name => 'WhiteBalance',
+        Writable => 'int16u',
+        PrintConvColumns => 2,
+        PrintConv => {
+            0 => 'Auto',
+            1 => 'Daylight',
+            2 => 'Shade',
+            3 => 'Fluorescent', #2
+            4 => 'Tungsten',
+            5 => 'Manual',
+            6 => 'Daylight Fluorescent', #13
+            7 => 'Day White Fluorescent', #13
+            8 => 'White Fluorescent', #13
+            9 => 'Flash', #13
+            10 => 'Cloudy', #13
+            15 => 'Color Temperature Enhancement', #PH
+            17 => 'Kelvin', #PH
+            0xfffe => 'Unknown', #13
+            0xffff => 'User-Selected', #13
+        },
+    },
+    0x001a => { #5
+        Name => 'WhiteBalanceMode',
+        Writable => 'int16u',
+        PrintConv => {
+            1 => 'Auto (Daylight)',
+            2 => 'Auto (Shade)',
+            3 => 'Auto (Flash)',
+            4 => 'Auto (Tungsten)',
+            6 => 'Auto (Daylight Fluorescent)', #19 (NC)
+            7 => 'Auto (Day White Fluorescent)', #17 (K100D guess)
+            8 => 'Auto (White Fluorescent)', #17 (K100D guess)
+            10 => 'Auto (Cloudy)', #17 (K100D guess)
+            # 0xfffd observed in K100D (ref 17)
+            0xfffe => 'Unknown', #PH (you get this when shooting night sky shots)
+            0xffff => 'User-Selected',
+        },
+    },
+    0x001b => { #6
+        Name => 'BlueBalance',
+        Writable => 'int16u',
+        ValueConv => '$val / 256',
+        ValueConvInv => 'int($val * 256 + 0.5)',
+    },
+    0x001c => { #6
+        Name => 'RedBalance',
+        Writable => 'int16u',
+        ValueConv => '$val / 256',
+        ValueConvInv => 'int($val * 256 + 0.5)',
+    },
+    0x001d => [
+        # Would be nice if there was a general way to determine units for FocalLength...
+        {
+            # Optio 30, 33WR, 43WR, 450, 550, 555, 750Z, X
+            Name => 'FocalLength',
+            Condition => '$self->{Model} =~ /^PENTAX Optio (30|33WR|43WR|450|550|555|750Z|X)\b/',
+            Writable => 'int32u',
+            Priority => 0,
+            ValueConv => '$val / 10',
+            ValueConvInv => '$val * 10',
+            PrintConv => 'sprintf("%.1f mm",$val)',
+            PrintConvInv => '$val=~s/\s*mm//;$val',
+        },
+        {
+            # K100D, Optio 230, 330GS, 33L, 33LF, A10, M10, MX, MX4, S, S30,
+            # S4, S4i, S5i, S5n, S5z, S6, S45, S50, S55, S60, SV, Svi, W10, WP,
+            # *ist D, DL, DL2, DS, DS2
+            # (Note: the Optio S6 seems to report the minimum focal length - PH)
+            Name => 'FocalLength',
+            Writable => 'int32u',
+            Priority => 0,
+            ValueConv => '$val / 100',
+            ValueConvInv => '$val * 100',
+            PrintConv => 'sprintf("%.1f mm",$val)',
+            PrintConvInv => '$val=~s/\s*mm//;$val',
+        },
+    ],
+    0x001e => { #3
+        Name => 'DigitalZoom',
+        Writable => 'int16u',
+        ValueConv => '$val / 100', #14
+        ValueConvInv => '$val * 100', #14
+    },
+    0x001f => {
+        Name => 'Saturation',
+        Writable => 'int16u',
+        Count => -1,
+        Notes => '1 or 2 values',
+        PrintConvColumns => 2,
+        PrintConv => [{ # the *istD has pairs of values - PH
+            0 => 'Low', #PH
+            1 => 'Normal', #PH
+            2 => 'High', #PH
+            3 => 'Med Low', #2
+            4 => 'Med High', #2
+            5 => 'Very Low', #(NC)
+            6 => 'Very High', #(NC)
+            7 => '-4', #PH (K-5)
+            8 => '+4', #PH (NC)
+            65535 => 'None', #PH (Monochrome)
+        }],
+    },
+    0x0020 => {
+        Name => 'Contrast',
+        Writable => 'int16u',
+        Count => -1,
+        Notes => '1 or 2 values',
+        PrintConvColumns => 2,
+        PrintConv => [{ # the *istD has pairs of values - PH
+            0 => 'Low', #PH
+            1 => 'Normal', #PH
+            2 => 'High', #PH
+            3 => 'Med Low', #2
+            4 => 'Med High', #2
+            5 => 'Very Low', #PH
+            6 => 'Very High', #PH (NC)
+            7 => '-4', #PH (NC)
+            8 => '+4', #PH (K-5)
+        }],
+    },
+    0x0021 => {
+        Name => 'Sharpness',
+        Writable => 'int16u',
+        Count => -1,
+        Notes => '1 or 2 values',
+        PrintConvColumns => 2,
+        PrintConv => [{ # the *istD has pairs of values - PH
+            0 => 'Soft', #PH
+            1 => 'Normal', #PH
+            2 => 'Hard', #PH
+            3 => 'Med Soft', #2
+            4 => 'Med Hard', #2
+            5 => 'Very Soft', #(NC)
+            6 => 'Very Hard', #(NC)
+            7 => '-4', #PH (NC)
+            8 => '+4', #PH (NC)
+        }],
+    },
+    0x0022 => { #PH
+        Name => 'WorldTimeLocation',
+        Groups => { 2 => 'Time' },
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Hometown',
+            1 => 'Destination',
+        },
+    },
+    0x0023 => { #PH
+        Name => 'HometownCity',
+        Groups => { 2 => 'Time' },
+        Writable => 'int16u',
+        SeparateTable => 'City',
+        PrintConv => \%pentaxCities,
+    },
+    0x0024 => { #PH
+        Name => 'DestinationCity',
+        Groups => { 2 => 'Time' },
+        Writable => 'int16u',
+        SeparateTable => 'City',
+        PrintConv => \%pentaxCities,
+    },
+    0x0025 => { #PH
+        Name => 'HometownDST',
+        Groups => { 2 => 'Time' },
+        Writable => 'int16u',
+        PrintConv => { 0 => 'No', 1 => 'Yes' },
+    },
+    0x0026 => { #PH
+        Name => 'DestinationDST',
+        Groups => { 2 => 'Time' },
+        Writable => 'int16u',
+        PrintConv => { 0 => 'No', 1 => 'Yes' },
+    },
+    0x0027 => { #PH
+        Name => 'DSPFirmwareVersion',
+        Writable => 'undef',
+        # - for K10D, this comes from 4 bytes at offset 0x1c in the firmware file
+        %pentaxFirmwareID,
+    },
+    0x0028 => { #PH
+        Name => 'CPUFirmwareVersion',
+        Writable => 'undef',
+        # - for K10D, this comes from 4 bytes at offset 0x83fbf8 in firmware file
+        %pentaxFirmwareID,
+    },
+    0x0029 => { #5
+        Name => 'FrameNumber',
+        # - one report that this has a value of 84 for the first image with a *istDS
+        # - another report that file number 4 has frameNumber 154 for *istD, and
+        #   that framenumber jumped at about 9700 to around 26000
+        # - with *istDS firmware 2.0, this tag was removed and ShutterCount was added
+        Writable => 'int32u',
+    },
+    # 0x002b - definitely exposure related somehow - PH
+    0x002d => { #PH
+        Name => 'EffectiveLV',
+        Notes => 'camera-calculated light value, but includes exposure compensation',
+        Writable => 'int16u',
+        ValueConv => '$val/1024',
+        ValueConvInv => '$val * 1024',
+        PrintConv => 'sprintf("%.1f",$val)',
+        PrintConvInv => '$val',
+    },
+    0x0032 => { #13
+        Name => 'ImageEditing',
+        Writable => 'undef',
+        Format => 'int8u',
+        Count => 4,
+        PrintConv => {
+            '0 0' => 'None', #PH
+            '0 0 0 0' => 'None',
+            '0 0 0 4' => 'Digital Filter',
+            '1 0 0 0' => 'Resized', #PH (K-5)
+            '2 0 0 0' => 'Cropped', #PH
+            # note: doesn't apply to digital filters applied when picture is taken
+            '4 0 0 0' => 'Digital Filter 4', #PH (K10D)
+            '6 0 0 0' => 'Digital Filter 6', #PH (K-5)
+            '16 0 0 0' => 'Frame Synthesis?',
+        },
+    },
+    0x0033 => { #PH (K110D/K100D/K-m)
+        Name => 'PictureMode',
+        Writable => 'int8u',
+        Count => 3,
+        Relist => [ [0, 1], 2 ], # join values 0 and 1 for PrintConv
+        PrintConvColumns => 2,
+        PrintConv => [{
+            # Program dial modes (from K110D)
+            '0 0'  => 'Program',    # (also on K10D, custom settings: Program Line 1, e-dial in Program 3, 4 or 5)
+            '0 1'  => 'Hi-speed Program', #19 (K10D, custom settings: Program Line 2, e-dial in Program 3, 4 or 5)
+            '0 2'  => 'DOF Program', #19      (K10D, custom settings: Program Line 3, e-dial in Program 3, 4 or 5)
+            '0 3'  => 'MTF Program', #19      (K10D, custom settings: Program Line 4, e-dial in Program 3, 4 or 5)
+            '0 4'  => 'Standard', #13
+            '0 5'  => 'Portrait',
+            '0 6'  => 'Landscape',
+            '0 7'  => 'Macro',
+            '0 8'  => 'Sport',
+            '0 9'  => 'Night Scene Portrait',
+            '0 10' => 'No Flash',
+            # SCN modes (menu-selected) (from K100D)
+            '0 11' => 'Night Scene',
+            '0 12' => 'Surf & Snow',
+            '0 13' => 'Text',
+            '0 14' => 'Sunset',
+            '0 15' => 'Kids',
+            '0 16' => 'Pet',
+            '0 17' => 'Candlelight',
+            '0 18' => 'Museum',
+            '0 19' => 'Food', #(n/c)
+            '0 20' => 'Stage Lighting',
+            '0 21' => 'Night Snap',
+            # AUTO PICT modes (auto-selected)
+            '1 4'  => 'Auto PICT (Standard)', #13
+            '1 5'  => 'Auto PICT (Portrait)', #7 (K100D)
+            '1 6'  => 'Auto PICT (Landscape)', # K110D
+            '1 7'  => 'Auto PICT (Macro)', #13
+            '1 8'  => 'Auto PICT (Sport)', #13
+            # *istD modes (ref 7)
+            '2 0'  => 'Program (HyP)', #13 (K-5 Normal program line - PH)
+            '2 1'  => 'Hi-speed Program (HyP)', #19 (K10D, custom settings: Program Line 2, e-dial in Program 1, 2)
+            '2 2'  => 'DOF Program (HyP)', #19      (K10D, custom settings: Program Line 3, e-dial in Program 1, 2)
+            '2 3'  => 'MTF Program (HyP)', #19      (K10D, custom settings: Program Line 4, e-dial in Program 1, 2)
+            '2 22' => 'Shallow DOF (HyP)', #PH (K-5)
+            '3 0'  => 'Green Mode', #16
+            '4 0'  => 'Shutter Speed Priority',
+            '5 0'  => 'Aperture Priority',
+            '6 0'  => 'Program Tv Shift',
+            '7 0'  => 'Program Av Shift', #19
+            '8 0'  => 'Manual',
+            '9 0'  => 'Bulb',
+            '10 0' => 'Aperture Priority, Off-Auto-Aperture',
+            '11 0' => 'Manual, Off-Auto-Aperture',
+            '12 0' => 'Bulb, Off-Auto-Aperture',
+            # extra K10D modes (ref 16)
+            '13 0' => 'Shutter & Aperture Priority AE',
+            '15 0' => 'Sensitivity Priority AE',
+            '16 0' => 'Flash X-Sync Speed AE',
+            '18 0' => 'Auto Program (Normal)', #PH (K-5)
+            '18 1' => 'Auto Program (Hi-speed)', #PH (NC)
+            '18 2' => 'Auto Program (DOF)', #PH (K-5)
+            '18 3' => 'Auto Program (MTF)', #PH (NC)
+            '18 22' => 'Auto Program (Shallow DOF)', #PH (NC)
+            '254 0' => 'Video', #PH (K-7,K-5)
+            '255 0' => 'Video (Auto Aperture)', #PH (K-5)
+            '255 4' => 'Video (4)', #PH (K-x)
+        },{
+            # EV step size (ref 19)
+            0 => '1/2 EV steps',
+            1 => '1/3 EV steps',
+        }],
+    },
+    0x0034 => { #7/PH
+        Name => 'DriveMode',
+        Writable => 'int8u',
+        Count => 4,
+        PrintConv => [{
+            0 => 'Single-frame',
+            1 => 'Continuous', # (K-5 Hi)
+            2 => 'Continuous (Lo)', #PH (K-5)
+            3 => 'Burst', #PH (K20D)
+            255 => 'Video', #PH (K-x)
+            # (K20D also has an Interval mode that needs decoding)
+        },{
+            0 => 'No Timer',
+            1 => 'Self-timer (12 s)',
+            2 => 'Self-timer (2 s)',
+            16 => 'Mirror Lock-up', # (K-5)
+            255 => 'n/a', #PH (K-x)
+        },{
+            0 => 'Shutter Button', # (also computer remote control - PH)
+            1 => 'Remote Control (3 s delay)', #19
+            2 => 'Remote Control', #19
+            4 => 'Remote Continuous Shooting', # (K-5)
+        },{
+            0x00 => 'Single Exposure',
+            0x01 => 'Multiple Exposure',
+            0x10 => 'HDR', #PH (645D)
+            0x20 => 'HDR Strong 1', #PH (NC) (K-5)
+            0x30 => 'HDR Strong 2', #PH (K-5)
+            0x40 => 'HDR Strong 3', #PH (K-5)
+            0xe0 => 'HDR Auto', #PH (K-5)
+            0xff => 'Video', #PH (K-x)
+        }],
+    },
+    0x0035 => { #PH
+        Name => 'SensorSize',
+        Format => 'int16u',
+        Count => 2,
+        Notes => 'includes masked pixels',
+        # values for various models (not sure why this is in 2um increments):
+        #  11894 7962 (K10D,K-m)   12012 7987 (*istDS,K100D,K110D)   12012 8019 (*istD),
+        #  12061 7988 (K-5)        12053 8005 (K-r,K-x)              14352 9535 (K20D,K-7)
+        #  22315 16711 (645)
+        ValueConv => 'my @a=split(" ",$val); $_/=500 foreach @a; join(" ",@a)',
+        ValueConvInv => 'my @a=split(" ",$val); $_*=500 foreach @a; join(" ",@a)',
+        PrintConv => 'sprintf("%.3f x %.3f mm", split(" ",$val))',
+        PrintConvInv => '$val=~s/\s*mm$//; $val=~s/\s*x\s*/ /; $val',
+    },
+    0x0037 => { #13
+        Name => 'ColorSpace',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'sRGB',
+            1 => 'Adobe RGB',
+        },
+    },
+    0x0038 => { #5 (PEF only)
+        Name => 'ImageAreaOffset',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x0039 => { #PH
+        Name => 'RawImageSize',
+        Writable => 'int16u',
+        Count => 2,
+        PrintConv => '$_=$val;s/ /x/;$_',
+    },
+    0x003c => { #7/PH
+        Name => 'AFPointsInFocus',
+        # not writable because I'm not decoding these 4 bytes fully:
+        # Nibble pattern: XSSSYUUU
+        # X = unknown (AF focused flag?, 0 or 1)
+        # SSS = selected AF point bitmask (0x000 or 0x7ff if unused)
+        # Y = unknown (observed 0,6,7,b,e, always 0 if SSS is 0x000 or 0x7ff)
+        # UUU = af points used
+        Format => 'int32u',
+        Notes => '*istD only',
+        ValueConv => '$val & 0x7ff', # ignore other bits for now
+        PrintConvColumns => 2,
+        PrintConv => { BITMASK => {
+            0 => 'Upper-left',
+            1 => 'Top',
+            2 => 'Upper-right',
+            3 => 'Left',
+            4 => 'Mid-left',
+            5 => 'Center',
+            6 => 'Mid-right',
+            7 => 'Right',
+            8 => 'Lower-left',
+            9 => 'Bottom',
+            10 => 'Lower-right',
+        } },
+    },
+    # 0x003d - int16u: 8192 for most images, but occasionally 11571 for K100D/K110D,
+    #              and 8289 or 8456 for the K-x - PH
+    0x003e => { #PH
+        Name => 'PreviewImageBorders',
+        Writable => 'int8u',
+        Count => 4,
+        Notes => 'top, bottom, left, right',
+    },
+    0x003f => { #PH
+        Name => 'LensType',
+        Writable => 'int8u',
+        Count => 2,
+        SeparateTable => 1,
+        # the K-m adds two zeros to the LensType, some other models add only 1
+        ValueConv => '$val=~s/^(\d+ \d+)( 0){1,2}$/$1/; $val',
+        ValueConvInv => '$val',
+        PrintConv => \%pentaxLensTypes,
+    },
+    0x0040 => { #PH
+        Name => 'SensitivityAdjust',
+        Writable => 'int16u',
+        ValueConv => '($val - 50) / 10',
+        ValueConvInv => '$val * 10 + 50',
+        PrintConv => '$val ? sprintf("%+.1f", $val) : 0',
+        PrintConvInv => '$val',
+    },
+    0x0041 => { #19
+        Name => 'ImageEditCount',
+        Writable => 'int16u',
+    },
+    0x0047 => { #PH
+        Name => 'CameraTemperature',
+        Writable => 'int8s',
+        PrintConv => '"$val C"',
+        PrintConvInv => '$val=~s/ ?c$//i; $val',
+    },
+    0x0048 => { #19
+        Name => 'AELock',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'On',
+        },
+    },
+    0x0049 => { #13
+        Name => 'NoiseReduction',
+        Writable => 'int16u',
+        PrintConv => { 0 => 'Off', 1 => 'On' },
+    },
+    0x004d => { #PH
+        Name => 'FlashExposureComp',
+        Writable => 'int32s',
+        ValueConv => '$val / 256',
+        ValueConvInv => 'int($val * 256 + ($val > 0 ? 0.5 : -0.5))',
+        PrintConv => '$val ? sprintf("%+.1f", $val) : 0',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    0x004f => { #PH
+        Name => 'ImageTone', # (Called CustomImageMode in K20D manual)
+        Writable => 'int16u',
+        PrintConvColumns => 2,
+        PrintConv => {
+            0 => 'Natural',
+            1 => 'Bright',
+            2 => 'Portrait', # (K20D/K200D)
+            3 => 'Landscape', # (K20D)
+            4 => 'Vibrant', # (K20D)
+            5 => 'Monochrome', # (K20D)
+            6 => 'Muted', # (645D)
+            7 => 'Reversal Film', # (645D)
+            8 => 'Bleach Bypass', # (K-5)
+        },
+    },
+    0x0050 => { #PH
+        Name => 'ColorTemperature',
+        Writable => 'int16u',
+        RawConv => '$val ? $val : undef',
+        ValueConv => '53190 - $val',
+        ValueConvInv => '53190 - $val',
+    },
+    # 0x0053-0x005a - not in JPEG images - PH
+    0x005c => { #PH
+        Name => 'ShakeReductionInfo',
+        Format => 'undef', # (written as int8u) - do this just to save time converting the value
+        SubDirectory => { TagTable => 'Image::ExifTool::Pentax::SRInfo' },
+    },
+    0x005d => { #JD/PH
+        # (used by all Pentax DSLR's except *istD and *istDS until firmware 2.0 - PH)
+        # Observed values for the first shot of a new K10D are:  81 [PH], 181 [19],
+        # 246 [7], and 209 [18 (one of the first 20 shots)], so there must be a number
+        # of test images shot in the factory. (But my new K-5 started at 1 - PH)
+        # This count includes shutter actuations even if they don't result in a
+        # recorded image (ie. manual white balance frame or digital preview), but
+        # does not include actuations due to Live View or video recording - PH
+        Name => 'ShutterCount',
+        Writable => 'undef',
+        Count => 4,
+        Notes => q{
+            Note: May be reset by servicing!  Also, does not include shutter actuations
+            for live view or video recording
+        },
+        # raw value is a big-endian 4-byte integer, encrypted using Date and Time
+        RawConv => 'length($val) == 4 ? unpack("N",$val) : undef',
+        RawConvInv => q{
+            my $val = Image::ExifTool::Pentax::CryptShutterCount($val,$self);
+            return pack('N', $val);
+        },
+        ValueConv => \&CryptShutterCount,
+        ValueConvInv => '$val',
+    },
+    0x0060 => { #PH (K-5)
+        Name => 'FaceInfo',
+        Format => 'undef', # (written as int8u)
+        SubDirectory => { TagTable => 'Image::ExifTool::Pentax::FaceInfo' },
+    },
+    # 0x0062 - int16u: 1 (K10D,K200D,K-m,K2000), 3 (K20D), 4 (K-7), 5 (K-x), 6 (645D), 7 (K-r), 8 (K-5)
+    0x0067 => { #PH (K-5)
+        Name => 'Hue',
+        Writable => 'int16u',
+        PrintConvColumns => 2,
+        PrintConv => {
+            0 => -2,
+            1 => 'Normal',
+            2 => 2,
+            3 => -1,
+            4 => 1,
+            5 => -3,
+            6 => 3,
+            7 => -4,
+            8 => 4,
+            65535 => 'None', # (Monochrome)
+        },
+    },
+    # 0x0067 - int16u: 1 [and 65535 in Monochrome] (K20D,K200D) - PH
+    0x0068 => { #PH
+        Name => 'AWBInfo',
+        Format => 'undef', # (written as int8u)
+        SubDirectory => { TagTable => 'Image::ExifTool::Pentax::AWBInfo' },
+    },
+    0x0069 => { #PH (K20D; K-5 highlights only)
+        Name => 'DynamicRangeExpansion',
+        Writable => 'undef',
+        Format => 'int8u',
+        Count => 4,
+        PrintConv => {
+            '0 0 0 0' => 'Off',
+            '1 0 0 0' => 'On',
+        },
+    },
+    0x006b => { #PH (K-5)
+        Name => 'TimeInfo',
+        Format => 'undef', # (written as int8u)
+        SubDirectory => { TagTable => 'Image::ExifTool::Pentax::TimeInfo' },
+    },
+    0x006c => { #PH (K-5)
+        Name => 'HighLowKeyAdj',
+        Description => 'High/Low Key Adj',
+        Writable => 'int16s',
+        Count => 2,
+        PrintConvColumns => 3,
+        PrintConv => {
+            '-4 0' => -4,
+            '-3 0' => -3,
+            '-2 0' => -2,
+            '-1 0' => -1,
+             '0 0' => 0,
+             '1 0' => 1,
+             '2 0' => 2,
+             '3 0' => 3,
+             '4 0' => 4,
+        },
+    },
+    0x006d => { #PH (K-5)
+        Name => 'ContrastHighlight',
+        Writable => 'int16s',
+        Count => 2,
+        PrintConvColumns => 3,
+        PrintConv => {
+            '-4 0' => -4,
+            '-3 0' => -3,
+            '-2 0' => -2,
+            '-1 0' => -1,
+             '0 0' => 0,
+             '1 0' => 1,
+             '2 0' => 2,
+             '3 0' => 3,
+             '4 0' => 4,
+        },
+    },
+    0x006e => { #PH (K-5)
+        Name => 'ContrastShadow',
+        Writable => 'int16s',
+        Count => 2,
+        PrintConvColumns => 3,
+        PrintConv => {
+            '-4 0' => -4,
+            '-3 0' => -3,
+            '-2 0' => -2,
+            '-1 0' => -1,
+             '0 0' => 0,
+             '1 0' => 1,
+             '2 0' => 2,
+             '3 0' => 3,
+             '4 0' => 4,
+        },
+    },
+    0x006f => { #PH (K-5)
+        Name => 'ContrastHighlightShadowAdj',
+        Description => 'Contrast Highlight/Shadow Adj',
+        Writable => 'int8u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'On',
+        },
+    },
+    0x0070 => { #PH (K-5)
+        Name => 'FineSharpness',
+        Writable => 'int8u',
+        Count => -1,    # 1 for K20/K200, 2 for K-5
+        PrintConv => [{
+            0 => 'Off',
+            1 => 'On',
+        },{
+            0 => 'Normal',
+            2 => 'Extra fine',
+        }],
+    },
+    0x0071 => { #PH (K20D,K-x)
+        Name => 'HighISONoiseReduction',
+        Format => 'int8u',
+        PrintConv => [{
+            0 => 'Off',
+            1 => 'Weakest',
+            2 => 'Weak', # (called "Low" by K-x)
+            3 => 'Strong', # (called "High" by K-x)
+            4 => 'Medium',
+            255 => 'Auto', # (K-5)
+        },{
+            0 => 'Inactive',
+            1 => 'Active',
+            2 => 'Active (Weak)', # (K-5)
+            3 => 'Active (Strong)', # (K-5)
+            4 => 'Active (Medium)', # (K-5)
+        },{ # Start ISO level for NR (K-x)
+            48 => 'ISO>400',
+            56 => 'ISO>800',
+            64 => 'ISO>1600',
+            72 => 'ISO>3200',
+        }],
+    },
+    0x0072 => { #JD (K20D)
+        Name => 'AFAdjustment',
+        Writable => 'int16s',
+    },
+    0x0073 => { #PH (K-5)
+        Name => 'MonochromeFilterEffect',
+        Writable => 'int16u',
+        PrintConvColumns => 2,
+        PrintConv => {
+            65535 => 'None',
+            1 => 'Green',
+            2 => 'Yellow',
+            3 => 'Orange',
+            4 => 'Red',
+            5 => 'Magenta',
+            6 => 'Blue',
+            7 => 'Cyan',
+            8 => 'Infrared',
+        },
+    },
+    0x0074 => { #PH (K-5)
+        Name => 'MonochromeToning',
+        Writable => 'int16u',
+        PrintConvColumns => 2,
+        PrintConv => {
+            65535 => 'None',
+            0 => -4,
+            1 => -3,
+            2 => -2,
+            3 => -1,
+            4 => 0,
+            5 => 1,
+            6 => 2,
+            7 => 3,
+            8 => 4,
+        },
+    },
+    0x0076 => { #PH (K-5)
+        Name => 'FaceDetect',
+        Writable => 'int8u',
+        Count => 2,
+        # the Optio S12 writes this but not the FacesDetected tag, so get FacesDetected from here
+        DataMember => 'FacesDetected',
+        RawConv => '$val =~ / (\d+)/ and $$self{FacesDetected} = $1; $val',
+        PrintConv => [
+            '$val ? "On ($val faces max)" : "Off"',
+            '"$val faces detected"',
+        ],
+        PrintConvInv => [
+            '$val =~ /(\d+)/ ? $1 : 0',
+            '$val =~ /(\d+)/ ? $1 : 0',
+        ],
+    },
+    0x0077 => { #PH (K-5)
+        # set by taking a picture with face detect AF,
+        # but it isn't reset until camera is turned off? - PH
+        Name => 'FaceDetectFrameSize',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    # 0x0078 - int16u[2]: '0 0' (K-5,K-7,K-r,K-x)
+    0x0079 => { #PH
+        Name => 'ShadowCompensation',
+        Writable => 'int8u',
+        Count => -1,
+        PrintConvColumns => 2,
+        PrintConv => {
+            # (1 value for K-m/K2000, 2 for 645D)
+            0 => 'Off',
+            1 => 'On',
+            '0 0' => 'Off',
+            '1 1' => 'Weak',
+            '1 2' => 'Normal',
+            '1 3' => 'Strong',
+        },
+    },
+    0x007a => { #PH
+        Name => 'ISOAutoParameters',
+        Writable => 'int8u',
+        Count => 2,
+        PrintConv => {
+            '1 0' => 'Slow',
+            '2 0' => 'Standard',
+            '3 0' => 'Fast',
+        },
+    },
+    0x007b => { #PH (K-5)
+        Name => 'CrossProcess',
+        Writable => 'int8u',
+        PrintConvColumns => 2,
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Random',
+            2 => 'Preset 1',
+            3 => 'Preset 2',
+            4 => 'Preset 3',
+            33 => 'Favorite 1',
+            34 => 'Favorite 2',
+            35 => 'Favorite 3',
+        },
+    },
+    0x007d => { #PH
+        Name => 'LensCorr',
+        Format => 'undef', # (written as int8u)
+        SubDirectory => { TagTable => 'Image::ExifTool::Pentax::LensCorr' },
+    },
+    # 0x007e - int32u: 15859,15860,15864,15865,16315 (K-5 PEF/DNG only) - PH
+    0x007f => { #PH (K-5)
+        Name => 'BleachBypassToning',
+        Writable => 'int16u',
+        PrintConvColumns => 2,
+        PrintConv => {
+            65535 => 'Off',
+            1 => 'Green',
+            2 => 'Yellow',
+            3 => 'Orange',
+            4 => 'Red',
+            5 => 'Magenta',
+            6 => 'Purple',
+            7 => 'Blue',
+            8 => 'Cyan',
+        },
+    },
+    0x0200 => { #5
+        Name => 'BlackPoint',
+        Writable => 'int16u',
+        Count => 4,
+    },
+    0x0201 => { #5
+        # (this doesn't change for different fixed white balances in JPEG images: Daylight,
+        # Tungsten, Kelvin, etc -- always "8192 8192 8192 8192", but it varies for these in
+        # RAW images, all images in Auto, for different Manual WB settings, and for images
+        # taken via Pentax Remote Assistant) - PH
+        Name => 'WhitePoint',
+        Writable => 'int16u',
+        Count => 4,
+    },
+    # 0x0202: int16u[4]: all 0's in all my samples
+    0x0203 => { #JD (not really sure what these mean)
+        Name => 'ColorMatrixA',
+        Writable => 'int16s',
+        Count => 9,
+        ValueConv => 'join(" ",map({ $_/8192 } split(" ",$val)))',
+        ValueConvInv => 'join(" ",map({ int($_*8192 + ($_<0?-0.5:0.5)) } split(" ",$val)))',
+        PrintConv => 'join(" ",map({sprintf("%.5f",$_)} split(" ",$val)))',
+        PrintConvInv => '"$val"',
+    },
+    0x0204 => { #JD
+        Name => 'ColorMatrixB',
+        Writable => 'int16s',
+        Count => 9,
+        ValueConv => 'join(" ",map({ $_/8192 } split(" ",$val)))',
+        ValueConvInv => 'join(" ",map({ int($_*8192 + ($_<0?-0.5:0.5)) } split(" ",$val)))',
+        PrintConv => 'join(" ",map({sprintf("%.5f",$_)} split(" ",$val)))',
+        PrintConvInv => '"$val"',
+    },
+    0x0205 => { #19
+        Name => 'CameraSettings',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Pentax::CameraSettings',
+            ByteOrder => 'BigEndian',
+        },
+    },
+    0x0206 => { #PH
+        Name => 'AEInfo',
+        SubDirectory => { TagTable => 'Image::ExifTool::Pentax::AEInfo' },
+    },
+    0x0207 => [ #PH
+        {
+            Name => 'LensInfo',
+            # the *ist series (and Samsung GX-1) always use the old format, and all
+            # other models but the K100D, K110D and K100D Super always use the newer
+            # format, and for the K110D/K110D we expect ff or 00 00 at byte 20 if
+            # it is the old format.)
+            Condition => q{
+                $$self{Model}=~/(\*ist|GX-1[LS])/ or
+               ($$self{Model}=~/(K100D|K110D)/ and $$valPt=~/^.{20}(\xff|\0\0)/s)
+            },
+            SubDirectory => { TagTable => 'Image::ExifTool::Pentax::LensInfo' },
+        },{
+            Name => 'LensInfo',
+            Condition => '$count < 90',
+            SubDirectory => { TagTable => 'Image::ExifTool::Pentax::LensInfo2' },
+        },{
+            Name => 'LensInfo',
+            Condition => '$count == 90',
+            SubDirectory => { TagTable => 'Image::ExifTool::Pentax::LensInfo3' },
+        },{
+            Name => 'LensInfo',
+            SubDirectory => { TagTable => 'Image::ExifTool::Pentax::LensInfo4' },
+        }
+    ],
+    0x0208 => [ #PH
+        {
+            Name => 'FlashInfo',
+            Condition => '$count == 27',
+            SubDirectory => { TagTable => 'Image::ExifTool::Pentax::FlashInfo' },
+        },
+        {
+            Name => 'FlashInfoUnknown',
+            SubDirectory => { TagTable => 'Image::ExifTool::Pentax::FlashInfoUnknown' },
+        },
+    ],
+    0x0209 => { #PH
+        Name => 'AEMeteringSegments',
+        Format => 'int8u',
+        Count => -1,
+        Notes => q{
+            measurements from each of the 16 AE metering segments for models such as the
+            K10D, and 77 metering segments for models such as the K-5, converted to LV
+        },
+        %convertMeteringSegments,
+        #    16 metering segment             77 metering segment
+        #    locations (ref JD)              locations (ref PH, K-5)
+        # +-------------------------+
+        # |           14            | +----------------------------------+
+        # |    +---+---+---+---+    | |  0  1  2  3  4  5  6  7  8  9 10 |
+        # |    | 5 | 3/1\ 2| 4 |    | | 11 12 13 14 15 16 17 18 19 20 21 |
+        # |  +-+-+-+-+ - +-+-+-+-+  | | 22 23 24 25 26 27 28 29 30 31 32 |
+        # +--+ 9 | 7 ||0|| 6 | 8 +--+ | 33 34 35 36 37 38 39 40 41 42 43 |
+        # |  +-+-+-+-+ - +-+-+-+-+  | | 44 45 46 47 48 49 50 51 52 53 54 |
+        # |    |13 |11\ /10|12 |    | | 55 56 57 58 59 60 61 62 63 64 65 |
+        # |    +---+---+---+---+    | | 66 67 68 69 70 71 72 73 74 75 76 |
+        # |           15            | +----------------------------------+
+        # +-------------------------+
+    },
+    0x020a => { #PH/JD/19
+        Name => 'FlashMeteringSegments',
+        Format => 'int8u',
+        Count => -1,
+        %convertMeteringSegments,
+    },
+    0x020b => { #PH/JD/19
+        Name => 'SlaveFlashMeteringSegments',
+        Format => 'int8u',
+        Count => -1,
+        Notes => 'used in wireless control mode',
+        %convertMeteringSegments,
+    },
+    0x020d => { #PH
+        Name => 'WB_RGGBLevelsDaylight',
+        Writable => 'int16u',
+        Count => 4,
+    },
+    0x020e => { #PH
+        Name => 'WB_RGGBLevelsShade',
+        Writable => 'int16u',
+        Count => 4,
+    },
+    0x020f => { #PH
+        Name => 'WB_RGGBLevelsCloudy',
+        Writable => 'int16u',
+        Count => 4,
+    },
+    0x0210 => { #PH
+        Name => 'WB_RGGBLevelsTungsten',
+        Writable => 'int16u',
+        Count => 4,
+    },
+    0x0211 => { #PH
+        Name => 'WB_RGGBLevelsFluorescentD',
+        Writable => 'int16u',
+        Count => 4,
+    },
+    0x0212 => { #PH
+        Name => 'WB_RGGBLevelsFluorescentN',
+        Writable => 'int16u',
+        Count => 4,
+    },
+    0x0213 => { #PH
+        Name => 'WB_RGGBLevelsFluorescentW',
+        Writable => 'int16u',
+        Count => 4,
+    },
+    0x0214 => { #PH
+        Name => 'WB_RGGBLevelsFlash',
+        Writable => 'int16u',
+        Count => 4,
+    },
+    0x0215 => { #PH
+        Name => 'CameraInfo',
+        Format => 'undef', # (written as int32u)
+        SubDirectory => { TagTable => 'Image::ExifTool::Pentax::CameraInfo' },
+    },
+    0x0216 => { #PH
+        Name => 'BatteryInfo',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Pentax::BatteryInfo',
+            ByteOrder => 'BigEndian', # have seen makernotes changed to little-endian in DNG!
+        },
+    },
+    # 0x021a - undef[1068] (K-5)
+    0x021b => { #19
+        Name => 'SaturationInfo',
+        Flags => [ 'Unknown', 'Binary' ],
+        Writable => 0,
+        Notes => 'only in PEF and DNG images',
+        # K10D values with various Saturation settings (ref 19):
+        # Very Low: 000000022820f9a0fe4000802660f92002e0fee01e402c40f880fb40ffc02b20f52002e0fe401ee0
+        # Low:      000000022ae0f700fe20ff402840f88001e0fcc021602f60f560fb40fe602d20f48001c0fbc02280
+        # Med Low:  000000022dc0f420fe20fe002a20f7e000c0fa8024c032c0f220fb20fce02f60f3c000a0f9202640
+        # Normal:   000000023120f0e0fe00fc802c40f740ffa0f7e028803660ee80fb20fb4031c0f300ff60f6202a80
+        # Med High: 0000000234e0ed40fde0fae02ea0f680fe60f5002ca03a80ea80fb00f9603480f220fe00f2e02f20
+        # High:     0000000238c0e960fde0f9203140f5a0fce0f1e031403f00e600fb00f7803760f120fc60ef403460
+        # Very High:000000023d20e520fdc0f7203420f4c0fb60ee6036404400e120fae0f5403aa0f020fac0eb403a00
+    },
+    # 0x021c - undef[18] (K-5)
+    # 0x021d - undef[18] (K-5)
+    # 0x021e - undef[8] (K-5)
+    0x021f => { #JD
+        Name => 'AFInfo',
+        SubDirectory => {
+            # NOTE: Most of these subdirectories are 'undef' format, and as such the
+            # byte ordering is not changed when changed via the Pentax software (which
+            # will write a little-endian TIFF on an Intel system).  So we must define
+            # BigEndian byte ordering for any of these which contain multi-byte values. - PH
+            ByteOrder => 'BigEndian',
+            TagTable => 'Image::ExifTool::Pentax::AFInfo',
+        },
+    },
+    0x0220 => { #6
+        Name => 'HuffmanTable',
+        Flags => [ 'Unknown', 'Binary' ],
+        Writable => 0,
+        Notes => 'found in K10D, K20D and K2000D PEF images',
+    },
+    # 0x0221 - undef[138] (K-5)
+    0x0222 => { #PH
+        Name => 'ColorInfo',
+        SubDirectory => { TagTable => 'Image::ExifTool::Pentax::ColorInfo' },
+    },
+    # 0x0223 - undef[198] (K-5 PEF/DNG only)
+    0x0224 => { #19
+        Name => 'EVStepInfo',
+        SubDirectory => { TagTable => 'Image::ExifTool::Pentax::EVStepInfo' },
+    },
+    0x0226 => { #PH
+        Name => 'ShotInfo', # (may want to change this later when more is decoded)
+        SubDirectory => { TagTable => 'Image::ExifTool::Pentax::ShotInfo' },
+    },
+    0x0227 => { #PH
+        Name => 'FacePos',
+        Condition => '$$self{FacesDetected}', # ignore if no faces to decode
+        SubDirectory => { TagTable => 'Image::ExifTool::Pentax::FacePos' },
+    },
+    0x0228 => { #PH
+        Name => 'FaceSize',
+        Condition => '$$self{FacesDetected}', # ignore if no faces to decode
+        SubDirectory => { TagTable => 'Image::ExifTool::Pentax::FaceSize' },
+    },
+    0x0229 => { #PH (verified) (K-m, K-x, K-7)
+        Name => 'SerialNumber',
+        Writable => 'string',
+        Notes => 'left blank by some cameras',
+    },
+    0x022a => { #PH (K-5)
+        Name => 'FilterInfo',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Pentax::FilterInfo',
+            ByteOrder => 'BigEndian',
+        },
+    },
+    0x022b => { #PH (K-5)
+        Name => 'LevelInfo',
+        SubDirectory => { TagTable => 'Image::ExifTool::Pentax::LevelInfo' },
+    },
+    # 0x022c - undef[46] (K-5)
+    # 0x022d - undef[100] (K-5)
+    0x022e => { #PH (K-5 AVI videos)
+        Name => 'Artist',
+        Groups => { 2 => 'Author' },
+        Writable => 'string',
+    },
+    0x022f => { #PH (K-5 AVI videos)
+        Name => 'Copyright',
+        Groups => { 2 => 'Author' },
+        Writable => 'string',
+    },
+    0x0230 => { #PH (K-x AVI videos)
+        Name => 'FirmwareVersion',
+        Notes => 'only in AVI videos',
+        # this tag only exists in AVI videos, and for the K-x the value of
+        # this tag is "K-x Ver 1.00", which is the same as the EXIF Software
+        # tag.  I used a different tag name for this because Pentax uses the
+        # AVI Software tag for a different string, "PENTAX K-x".
+        Writable => 'string',
+    },
+    0x0231 => { #PH (K-5)
+        Name => 'ContrastDetectAFArea',
+        Writable => 'int16u',
+        Count => 4,
+        Notes => q{
+            AF area of the most recent contrast-detect focus operation. Coordinates
+            are left, top, width and height in a 720x480 frame, with Y downwards
+        },
+    },
+    0x0235 => { #PH (K-5)
+        Name => 'CrossProcessParams',
+        # (it would be interesting to know exactly what these mean)
+        Writable => 'undef',
+        Format => 'int8u',
+        Count => 10,
+    },
+    0x03fe => { #PH
+        Name => 'DataDump',
+        Writable => 0,
+        PrintConv => '\$val',
+    },
+    0x03ff => [ #PH
+        {
+            Name => 'TempInfoK5',
+            Condition => '$$self{Model} =~ /K-5\b/',
+            SubDirectory => { TagTable => 'Image::ExifTool::Pentax::TempInfoK5' },
+        },{
+            Name => 'UnknownInfo',
+            SubDirectory => { TagTable => 'Image::ExifTool::Pentax::UnknownInfo' },
+        },
+    ],
+    0x0402 => { #5
+        Name => 'ToneCurve',
+        PrintConv => '\$val',
+    },
+    0x0403 => { #5
+        Name => 'ToneCurves',
+        PrintConv => '\$val',
+    },
+    # 0x0404 - undef[2086] (K-5)
+    # 0x0405 - undef[24200] (K-5 PEF/DNG only)
+    # 0x0406 - undef[4116] (K-5)
+    0x0e00 => {
+        Name => 'PrintIM',
+        Description => 'Print Image Matching',
+        Writable => 0,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::PrintIM::Main',
+        },
+    },
+);
+
+# shake reduction information (ref PH)
+%Image::ExifTool::Pentax::SRInfo = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'Shake reduction information.',
+    0 => {
+        Name => 'SRResult',
+        PrintConv => { #PH/JD
+            0 => 'Not stabilized',
+            BITMASK => {
+                0 => 'Stabilized',
+                # have seen 1 and 4 for 0.5 and 0.3 sec exposures with NR on and Bit 0 also set - ref 19
+                # have seen bits 1,2,3,4 in K-5 AVI videos - PH
+                6 => 'Not ready',
+            },
+        },
+    },
+    1 => {
+        Name => 'ShakeReduction',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'On',
+            4 => 'Off (4)', # (K20D, K200D, K-7, K-5)
+            5 => 'On (5)', #(guess) (K20D)
+            # (got 5 for K-5 with HDR [auto-align off only], Composition Adjust, and movie with SR off!)
+            6 => 'On (Video)', # (K-7)
+            7 => 'On (7)', #(NC) (K20D, K200D, K-m, K-5)
+            15 => 'On (15)', # (K20D (with Tamron 10-20mm @ 10mm))
+        },
+    },
+    2 => {
+        Name => 'SRHalfPressTime',
+        # (was SR_SWSToSWRTime: SWS=photometering switch, SWR=shutter release switch)
+        # (from http://www.patentstorm.us/patents/6597867-description.html)
+        # (here, SR could more accurately mean Shutter Release, not Shake Reduction)
+        Notes => q{
+            time from when the shutter button was half pressed to when the shutter was
+            released, including time for focusing
+        },
+        # (constant of 60 determined from times: 2sec=127; 3sec=184,197; 4sec=244,249,243,246 - PH)
+        ValueConv => '$val / 60',
+        ValueConvInv => 'my $v=$val*60; $v < 255 ? int($v + 0.5) : 255',
+        PrintConv => 'sprintf("%.2f s",$val) . ($val > 254.5/60 ? " or longer" : "")',
+        PrintConvInv => '$val=~tr/0-9.//dc; $val',
+    },
+    3 => { #JD
+        Name => 'SRFocalLength',
+        ValueConv => '$val & 0x01 ? $val * 4 : $val / 2',
+        ValueConvInv => '$val <= 127 ? int($val) * 2 : int($val / 4) | 0x01',
+        PrintConv => '"$val mm"',
+        PrintConvInv => '$val=~s/\s*mm//;$val',
+    },
+);
+
+# face detection information (ref PH, K-5)
+%Image::ExifTool::Pentax::FaceInfo = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    DATAMEMBER => [ 0 ],
+    0 => {
+        Name => 'FacesDetected',
+        RawConv => '$$self{FacesDetected} = $val',
+    },
+    2 => {
+        Name => 'FacePosition',
+        Notes => q{
+            X/Y coordinates of the center of the main face in percent of frame size,
+            with positive Y downwards
+        },
+        Format => 'int8u[2]',
+    },
+);
+
+# automatic white balance settings (ref PH, K-5)
+%Image::ExifTool::Pentax::AWBInfo = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    # 0 - always 1?
+    # (data ends here for the K20D, K200D, K-x and K-7)
+    0 => {
+        Name => 'WhiteBalanceAutoAdjustment',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'On',
+        },
+    },
+    1 => { # (exists only for K-5)
+        Name => 'TungstenAWB',
+        PrintConv => {
+            0 => 'Subtle Correction',
+            1 => 'Strong Correction',
+        },
+    },
+);
+
+# world time settings (ref PH, K-5)
+%Image::ExifTool::Pentax::TimeInfo = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Time' },
+    0.1 => {
+        Name => 'WorldTimeLocation',
+        Mask => 0x01,
+        PrintConv => {
+            0x00 => 'Hometown',
+            0x01 => 'Destination',
+        },
+    },
+    0.2 => {
+        Name => 'HometownDST',
+        Mask => 0x02,
+        PrintConv => {
+            0x00 => 'No',
+            0x02 => 'Yes',
+        },
+    },
+    0.3 => {
+        Name => 'DestinationDST',
+        Mask => 0x04,
+        PrintConv => {
+            0x00 => 'No',
+            0x04 => 'Yes',
+        },
+    },
+    2 => {
+        Name => 'HometownCity',
+        SeparateTable => 'City',
+        PrintConv => \%pentaxCities,
+    },
+    3 => {
+        Name => 'DestinationCity',
+        SeparateTable => 'City',
+        PrintConv => \%pentaxCities,
+    },
+);
+
+# lens distortion correction (ref PH, K-5)
+%Image::ExifTool::Pentax::LensCorr = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    0 => {
+        Name => 'DistortionCorrection',
+        PrintConv => { 0 => 'Off', 1 => 'On' },
+    },
+    1 => {
+        Name => 'ChromaticAberrationCorrection',
+        PrintConv => { 0 => 'Off', 1 => 'On' },
+    },
+);
+
+# camera settings (ref 19)
+%Image::ExifTool::Pentax::CameraSettings = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    PRIORITY => 0,
+    NOTES => 'Shot information written by Pentax DSLR cameras.',
+    0 => {
+        Name => 'PictureMode2',
+        PrintConv => {
+            0 => 'Scene Mode', #PH
+            1 => 'Auto PICT', #PH (NC)
+            2 => 'Program AE',
+            3 => 'Green Mode',
+            4 => 'Shutter Speed Priority',
+            5 => 'Aperture Priority',
+            6 => 'Program Tv Shift', #PH
+            7 => 'Program Av Shift',
+            8 => 'Manual', #PH
+            9 => 'Bulb', #PH
+            10 => 'Aperture Priority, Off-Auto-Aperture', #PH (NC)
+            11 => 'Manual, Off-Auto-Aperture', #PH
+            12 => 'Bulb, Off-Auto-Aperture', #PH (NC)
+            13 => 'Shutter & Aperture Priority AE',
+            15 => 'Sensitivity Priority AE',
+            16 => 'Flash X-Sync Speed AE', #PH
+        },
+    },
+    1.1 => {
+        Name => 'ProgramLine',
+        # only set to other than Normal when in Program AE mode
+        Mask => 0x03,
+        PrintConv => {
+            0 => 'Normal',
+            1 => 'Hi Speed',
+            2 => 'Depth',
+            3 => 'MTF',
+        },
+    },
+    1.2 => { # (K10D, K-5)
+        Name => 'EVSteps',
+        Mask => 0x20,
+        PrintConv => {
+            0x00 => '1/2 EV Steps',
+            0x20 => '1/3 EV Steps',
+        },
+    },
+    1.3 => { # (this bit is set for movies with the K-5 - PH)
+        Name => 'E-DialInProgram',
+        # always set even when not in Program AE mode
+        Mask => 0x40,
+        PrintConv => {
+            0x00 => 'Tv or Av',
+            0x40 => 'P Shift',
+        },
+    },
+    1.4 => { # (K10D, K-5)
+        Name => 'ApertureRingUse',
+        # always set even Aperture Ring is in A mode
+        Mask => 0x80,
+        PrintConv => {
+            0x00 => 'Prohibited',
+            0x80 => 'Permitted',
+        },
+    },
+    2 => {
+        Name => 'FlashOptions',
+        Notes => 'the camera flash options settings, set even if the flash is off',
+        Mask => 0xf0,
+        ValueConv => '$val>>4',
+        ValueConvInv => '$val<<4',
+        # Note: These tags correlate with the FlashMode and InternalFlashMode values,
+        # and match what is displayed by the Pentax software
+        PrintConv => {
+            0 => 'Normal', # (this value can occur in Green Mode) - ref 19
+            1 => 'Red-eye reduction', # (this value can occur in Green Mode) - ref 19
+            2 => 'Auto', # (this value can occur in other than Green Mode) - ref 19
+            3 => 'Auto, Red-eye reduction', #PH (this value can occur in other than Green Mode) - ref 19
+            5 => 'Wireless (Master)',
+            6 => 'Wireless (Control)',
+            8 => 'Slow-sync',
+            9 => 'Slow-sync, Red-eye reduction',
+            10 => 'Trailing-curtain Sync'
+        },
+    },
+    2.1 => {
+        Name => 'MeteringMode2',
+        Mask => 0x0f,
+        Notes => 'may not be valid for some models, ie. *ist D',
+        PrintConv => {
+            0 => 'Multi-segment',
+            BITMASK => {
+                0 => 'Center-weighted average',
+                1 => 'Spot',
+            },
+        },
+    },
+    3 => {
+        Name => 'AFPointMode',
+        Mask => 0xf0,
+        PrintConv => {
+            0x00 => 'Auto',
+            BITMASK => {
+                4 => 'Select',
+                5 => 'Fixed Center',
+                # have seen bit 6 set in pre-production images (firmware 0.20) - PH
+            },
+        },
+    },
+    3.1 => {
+        Name => 'FocusMode2',
+        Mask => 0x0f,
+        PrintConv => {
+            0 => 'Manual',
+            1 => 'AF-S',
+            2 => 'AF-C',
+            3 => 'AF-A', #PH
+        },
+    },
+    4 => {
+        Name => 'AFPointSelected2',
+        Format => 'int16u',
+        PrintConv => {
+            0 => 'Auto',
+            BITMASK => {
+                0 => 'Upper-left',
+                1 => 'Top',
+                2 => 'Upper-right',
+                3 => 'Left',
+                4 => 'Mid-left',
+                5 => 'Center',
+                6 => 'Mid-right',
+                7 => 'Right',
+                8 => 'Lower-left',
+                9 => 'Bottom',
+                10 => 'Lower-right',
+            },
+        },
+    },
+    6 => {
+        Name => 'ISOFloor', #PH
+        # manual ISO or minimum ISO in Auto ISO mode - PH
+        ValueConv => 'int(100*exp(Image::ExifTool::Pentax::PentaxEv($val-32)*log(2))+0.5)',
+        ValueConvInv => 'Image::ExifTool::Pentax::PentaxEvInv(log($val/100)/log(2))+32',
+    },
+    7 => {
+        Name => 'DriveMode2',
+        PrintConv => {
+            0 => 'Single-frame',
+            BITMASK => {
+                0 => 'Continuous', # (K-5 Hi)
+                1 => 'Continuous (Lo)', #PH (K-5)
+                2 => 'Self-timer (12 s)', #PH
+                3 => 'Self-timer (2 s)', #PH
+                4 => 'Remote Control (3 s delay)',
+                5 => 'Remote Control',
+                6 => 'Exposure Bracket', #PH/19
+                7 => 'Multiple Exposure',
+            },
+        },
+    },
+    8 => {
+        Name => 'ExposureBracketStepSize',
+        # This is set even when Exposure Bracket is Off (and the K10D
+        # displays Ò---Ó as the step size when you press the EB button) - DaveN
+        # because the last value is remembered and if you turn Exposure Bracket
+        # on the step size goes back to what it was before.
+        PrintConv => {
+            3 => '0.3',
+            4 => '0.5',
+            5 => '0.7',
+            8 => '1.0', #PH
+            11 => '1.3',
+            12 => '1.5',
+            13 => '1.7', #(NC)
+            16 => '2.0', #PH
+        },
+    },
+    9 => { #PH/19
+        Name => 'BracketShotNumber',
+        PrintHex => 1,
+        PrintConv => {
+            0 => 'n/a',
+            0x02 => '1 of 2', #PH (K-5)
+            0x12 => '2 of 2', #PH (K-5)
+            0x03 => '1 of 3',
+            0x13 => '2 of 3',
+            0x23 => '3 of 3',
+            0x05 => '1 of 5',
+            0x15 => '2 of 5',
+            0x25 => '3 of 5',
+            0x35 => '4 of 5',
+            0x45 => '5 of 5',
+        },
+    },
+    10 => {
+        Name => 'WhiteBalanceSet',
+        Mask => 0xf0,
+        # Not necessarily the white balance used; for example if the custom menu is set to
+        # "WB when using flash" -> "2 Flash", then this tag reports the camera setting while
+        # tag 0x0019 reports Flash if the Flash was used.
+        PrintConv => {
+            0 => 'Auto',
+            16 => 'Daylight',
+            32 => 'Shade',
+            48 => 'Cloudy',
+            64 => 'Daylight Fluorescent',
+            80 => 'Day White Fluorescent',
+            96 => 'White Fluorescent',
+            112 => 'Tungsten',
+            128 => 'Flash',
+            144 => 'Manual',
+            # The three Set Color Temperature settings refer to the 3 preset settings which
+            # can be saved in the menu (see page 123 of the K10D manual)
+            192 => 'Set Color Temperature 1',
+            208 => 'Set Color Temperature 2',
+            224 => 'Set Color Temperature 3',
+        },
+    },
+    10.1 => {
+        Name => 'MultipleExposureSet',
+        Mask => 0x0f,
+        PrintConv => {
+            0 => 'Off',
+            1 => 'On',
+        },
+    },
+    13 => {
+        Name => 'RawAndJpgRecording',
+        Condition => '$$self{Model} =~ /(K10D|GX10)\b/',
+        Notes => 'K10D only',
+        # this is actually a bit field: - PH
+        # bit 0=JPEG, bit 2=PEF, bit 3=DNG; high nibble: 0x00=best, 0x20=better, 0x40=good
+        PrintHex => 1,
+        PrintConv => {
+            0x01 => 'JPEG (Best)', #PH
+            0x04 => 'RAW (PEF, Best)',
+            0x05 => 'RAW+JPEG (PEF, Best)',
+            0x08 => 'RAW (DNG, Best)', #PH (NC)
+            0x09 => 'RAW+JPEG (DNG, Best)', #PH (NC)
+            0x21 => 'JPEG (Better)', #PH
+            0x24 => 'RAW (PEF, Better)',
+            0x25 => 'RAW+JPEG (PEF, Better)', #PH
+            0x28 => 'RAW (DNG, Better)', #PH
+            0x29 => 'RAW+JPEG (DNG, Better)', #PH (NC)
+            0x41 => 'JPEG (Good)',
+            0x44 => 'RAW (PEF, Good)', #PH (NC)
+            0x45 => 'RAW+JPEG (PEF, Good)', #PH (NC)
+            0x48 => 'RAW (DNG, Good)', #PH (NC)
+            0x49 => 'RAW+JPEG (DNG, Good)',
+            # have seen values of 0,2,34 for other models (not K10D) - PH
+        },
+    },
+    14.1 => { #PH
+        Name => 'JpgRecordedPixels',
+        Condition => '$$self{Model} =~ /(K10D|GX10)\b/',
+        Notes => 'K10D only',
+        Mask => 0x03,
+        PrintConv => {
+            0 => '10 MP',
+            1 => '6 MP',
+            2 => '2 MP',
+        },
+    },
+    14.2 => { #PH (K-5)
+        Name => 'LinkAEToAFPoint',
+        Condition => '$$self{Model} =~ /K-5\b/',
+        Notes => 'K-5 only',
+        Mask => 0x01,
+        PrintConv => {
+            0x00 => 'Off',
+            0x01 => 'On',
+        },
+    },
+    14.3 => { #PH (K-5)
+        Name => 'SensitivitySteps',
+        Condition => '$$self{Model} =~ /K-5\b/',
+        Notes => 'K-5 only',
+        Mask => 0x02,
+        PrintConv => {
+            0x00 => '1 EV Steps',
+            0x02 => 'As EV Steps',
+        },
+    },
+    14.4 => { #PH (K-5)
+        Name => 'ISOAuto',
+        Condition => '$$self{Model} =~ /K-5\b/',
+        Notes => 'K-5 only',
+        Mask => 0x04,
+        PrintConv => {
+            0x00 => 'Off',
+            0x04 => 'On',
+        },
+    },
+    # 14.5 Mask 0x80 - changes for K-5
+    16 => {
+        Name => 'FlashOptions2',
+        Condition => '$$self{Model} =~ /(K10D|GX10)\b/',
+        Notes => 'K10D only; set even if the flash is off',
+        Mask => 0xf0,
+        # Note: the Normal and Auto values (0x00 to 0x30) do not tags always
+        # correlate with the FlashMode, InternalFlashMode and FlashOptions values
+        # however, these values seem to better match the K10D's actual functionality
+        # (always Auto in Green mode always Normal otherwise if one of the other options
+        # isn't selected) - ref 19
+        # (these tags relate closely to InternalFlashMode values - PH)
+        PrintConv => {
+            0x00 => 'Normal', # (this value never occurs in Green Mode) - ref 19
+            0x10 => 'Red-eye reduction', # (this value never occurs in Green Mode) - ref 19
+            0x20 => 'Auto',  # (this value only occurs in Green Mode) - ref 19
+            0x30 => 'Auto, Red-eye reduction', # (this value only occurs in Green Mode) - ref 19
+            0x50 => 'Wireless (Master)',
+            0x60 => 'Wireless (Control)',
+            0x80 => 'Slow-sync',
+            0x90 => 'Slow-sync, Red-eye reduction',
+            0xa0 => 'Trailing-curtain Sync'
+        },
+    },
+    16.1 => {
+        Name => 'MeteringMode3',
+        Condition => '$$self{Model} =~ /(K10D|GX10)\b/',
+        Notes => 'K10D only',
+        Mask => 0x0f,
+        PrintConv => {
+            0 => 'Multi-segment',
+            BITMASK => {
+                0 => 'Center-weighted average',
+                1 => 'Spot',
+            },
+        },
+    },
+    # 16 Mask 0x0f - changes when changing EV steps? (K-5)
+    17.1 => {
+        Name => 'SRActive',
+        Condition => '$$self{Model} =~ /(K10D|GX10)\b/',
+        Notes => q{
+            K10D only; SR is active only when ShakeReduction is On, DriveMode is not
+            Remote or Self-timer, and Internal/ExternalFlashMode is not "On, Wireless"
+        },
+        Mask => 0x80,
+        PrintConv => {
+            0x00 => 'No',
+            0x80 => 'Yes',
+        },
+    },
+    17.2 => {
+        Name => 'Rotation',
+        Condition => '$$self{Model} =~ /(K10D|GX10)\b/',
+        Notes => 'K10D only',
+        Mask => 0x60,
+        PrintConv => {
+            0x00 => 'Horizontal (normal)',
+            0x20 => 'Rotate 180',
+            0x40 => 'Rotate 90 CW',
+            0x60 => 'Rotate 270 CW',
+        },
+    },
+    # Bit 0x08 is set on 3 of my 3000 shots to (All 3 were Shutter Priority
+    # but this may not mean anything with such a small sample) - ref 19
+    17.3 => {
+        Name => 'ISOSetting',
+        Condition => '$$self{Model} =~ /(K10D|GX10)\b/',
+        Notes => 'K10D only',
+        Mask => 0x04,
+        PrintConv => {
+            0x00 => 'Manual',
+            0x04 => 'Auto',
+        },
+    },
+    17.4 => {
+        Name => 'SensitivitySteps',
+        Condition => '$$self{Model} =~ /(K10D|GX10)\b/',
+        Notes => 'K10D only',
+        Mask => 0x02,
+        PrintConv => {
+            0x00 => '1 EV Steps',
+            0x02 => 'As EV Steps',
+        },
+    },
+    # 17 Mask 0x08 - changed when changing Auto ISO range (K-5)
+    18 => {
+        Name => 'TvExposureTimeSetting',
+        Condition => '$$self{Model} =~ /(K10D|GX10)\b/',
+        Notes => 'K10D only',
+        ValueConv => 'exp(-Image::ExifTool::Pentax::PentaxEv($val-68)*log(2))',
+        ValueConvInv => 'Image::ExifTool::Pentax::PentaxEvInv(-log($val)/log(2))+68',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    19 => {
+        Name => 'AvApertureSetting',
+        Condition => '$$self{Model} =~ /(K10D|GX10)\b/',
+        Notes => 'K10D only',
+        ValueConv => 'exp(Image::ExifTool::Pentax::PentaxEv($val-68)*log(2)/2)',
+        ValueConvInv => 'Image::ExifTool::Pentax::PentaxEvInv(log($val)*2/log(2))+68',
+        PrintConv => 'sprintf("%.1f",$val)',
+        PrintConvInv => '$val',
+    },
+    20 => { #PH
+        Name => 'SvISOSetting',
+        Condition => '$$self{Model} =~ /(K10D|GX10)\b/',
+        Notes => 'K10D only',
+        # ISO setting for sensitivity-priority mode
+        # (conversion may not give actual displayed values:)
+        # 32 => 100, 35 => 125, 36 => 140, 37 => 160,
+        # 40 => 200, 43 => 250, 44 => 280, 45 => 320,
+        # 48 => 400, 51 => 500, 52 => 560, 53 => 640,
+        # 56 => 800, 59 => 1000,60 => 1100,61 => 1250, 64 => 1600
+        ValueConv => 'int(100*exp(Image::ExifTool::Pentax::PentaxEv($val-32)*log(2))+0.5)',
+        ValueConvInv => 'Image::ExifTool::Pentax::PentaxEvInv(log($val/100)/log(2))+32',
+    },
+    21 => { #PH
+        Name => 'BaseExposureCompensation',
+        Condition => '$$self{Model} =~ /(K10D|GX10)\b/',
+        Notes => 'K10D only; exposure compensation without auto bracketing',
+        ValueConv => 'Image::ExifTool::Pentax::PentaxEv(64-$val)',
+        ValueConvInv => '64-Image::ExifTool::Pentax::PentaxEvInv($val)',
+        PrintConv => '$val ? sprintf("%+.1f", $val) : 0',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+);
+
+# auto-exposure information (ref PH)
+%Image::ExifTool::Pentax::AEInfo = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    DATAMEMBER => [ 8 ],
+    # instead of /8, should these be PentaxEV(), as in CameraSettings? - PH
+    0 => {
+        Name => 'AEExposureTime',
+        Notes => 'val = 24 * 2**((32-raw)/8)',
+        ValueConv => '24*exp(-($val-32)*log(2)/8)',
+        ValueConvInv => '-log($val/24)*8/log(2)+32',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    1 => {
+        Name => 'AEAperture',
+        Notes => 'val = 2**((raw-68)/16)',
+        ValueConv => 'exp(($val-68)*log(2)/16)',
+        ValueConvInv => 'log($val)*16/log(2)+68',
+        PrintConv => 'sprintf("%.1f",$val)',
+        PrintConvInv => '$val',
+    },
+    2 => {
+        Name => 'AE_ISO',
+        Notes => 'val = 100 * 2**((raw-32)/8)',
+        ValueConv => '100*exp(($val-32)*log(2)/8)',
+        ValueConvInv => 'log($val/100)*8/log(2)+32',
+        PrintConv => 'int($val + 0.5)',
+        PrintConvInv => '$val',
+    },
+    3 => {
+        Name => 'AEXv',
+        Notes => 'val = (raw-64)/8',
+        ValueConv => '($val-64)/8',
+        ValueConvInv => '$val * 8 + 64',
+    },
+    4 => {
+        Name => 'AEBXv',
+        Format => 'int8s',
+        Notes => 'val = raw / 8',
+        ValueConv => '$val / 8',
+        ValueConvInv => '$val * 8',
+    },
+    5 => {
+        Name => 'AEMinExposureTime', #19
+        Notes => 'val = 24 * 2**((32-raw)/8)',
+        ValueConv => '24*exp(-($val-32)*log(2)/8)', #JD
+        ValueConvInv => '-log($val/24)*8/log(2)+32',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    6 => {
+        Name => 'AEProgramMode',
+        PrintConvColumns => 2,
+        PrintConv => {
+            0 => 'M, P or TAv',
+            1 => 'Av, B or X',
+            2 => 'Tv',
+            3 => 'Sv or Green Mode',
+            8 => 'Hi-speed Program',
+            11 => 'Hi-speed Program (P-Shift)', #19
+            16 => 'DOF Program', #19
+            19 => 'DOF Program (P-Shift)', #19
+            24 => 'MTF Program', #19
+            27 => 'MTF Program (P-Shift)', #19
+            35 => 'Standard',
+            43 => 'Portrait',
+            51 => 'Landscape',
+            59 => 'Macro',
+            67 => 'Sport',
+            75 => 'Night Scene Portrait',
+            83 => 'No Flash',
+            91 => 'Night Scene',
+            99 => 'Surf & Snow',
+            107 => 'Text',
+            115 => 'Sunset',
+            123 => 'Kids',
+            131 => 'Pet',
+            139 => 'Candlelight',
+            147 => 'Museum',
+            184 => 'Shallow DOF Program', # (K-5)
+        },
+    },
+    7 => {
+        Name => 'AEFlags',
+        Unknown => 1,
+        Writable => 0,
+        PrintConv => { #19
+            # (seems to be the warnings displayed in the viewfinder for several bits)
+            BITMASK => {
+                # 0 - seen in extreme low light conditions (e.g. Lens Cap On)
+                # 1 - seen in 2 cases, Aperture Priority mode, Auto ISO at 100,
+                #     Shutter speed at 1/4000 and aperture opened wider causing under exposure
+                # 2 - only (but not always) set in Shutter Speed Priority (seems to be when over/under exposed).
+                #     In one case set when auto exposure compensation changed the Tv from 1/250 to 1/80.
+                #     In another case set when external flash was in SB mode so did not fire.
+                3 => 'AE lock',
+                4 => 'Flash recommended?', # not 100% sure of this one
+                # 5 - seen lots...
+                # 6 - seen lots...
+                7 => 'Aperture wide open', # mostly true...  (Set for all my lenses except for DA* 16-50mm)
+            },
+        },
+    },
+    8 => {
+        Name => 'AEUnknown',
+        Notes => 'indices after this are incremented by 1 for some models',
+        Format => 'var_int8u[$size > 20 ? 2 : 1]',
+        Writable => 0,
+        # (this tag can't be unknown because the Format must be evaluated
+        #  to shift the following offsets if necessary.  Instead, ignore
+        #  the return value unless Unknown > 1)
+        RawConv => '$$self{OPTIONS}{Unknown} > 1 ? $val : undef',
+    },
+    # Note: Offsets below shifted by 1 if record size is > 20 bytes
+    # (implemented by the var_int8u count above)
+    9 => { #19
+        Name => 'AEMaxAperture',
+        Notes => 'val = 2**((raw-68)/16)',
+        ValueConv => 'exp(($val-68)*log(2)/16)',
+        ValueConvInv => 'log($val)*16/log(2)+68',
+        PrintConv => 'sprintf("%.1f",$val)',
+        PrintConvInv => '$val',
+    },
+    10 => { #19
+        Name => 'AEMaxAperture2',
+        Notes => 'val = 2**((raw-68)/16)',
+        ValueConv => 'exp(($val-68)*log(2)/16)',
+        ValueConvInv => 'log($val)*16/log(2)+68',
+        PrintConv => 'sprintf("%.1f",$val)',
+        PrintConvInv => '$val',
+    },
+    11 => { #19
+        Name => 'AEMinAperture',
+        Notes => 'val = 2**((raw-68)/16)',
+        ValueConv => 'exp(($val-68)*log(2)/16)',
+        ValueConvInv => 'log($val)*16/log(2)+68',
+        PrintConv => 'sprintf("%.0f",$val)',
+        PrintConvInv => '$val',
+    },
+    12 => { #19
+        Name => 'AEMeteringMode',
+        PrintConv => {
+            0 => 'Multi-segment',
+            BITMASK => {
+                4 => 'Center-weighted average',
+                5 => 'Spot',
+            },
+        },
+    },
+    # 13 - related to program mode somehow - PH
+    14 => { #19
+        Name => 'FlashExposureCompSet',
+        Format => 'int8s',
+        Notes => q{
+            reports the camera setting, unlike tag 0x004d which reports 0 in Green mode
+            or if flash was on but did not fire.  Both this tag and 0x004d report the
+            setting even if the flash is off
+        },
+        ValueConv => 'Image::ExifTool::Pentax::PentaxEv($val)',
+        ValueConvInv => 'Image::ExifTool::Pentax::PentaxEvInv($val)',
+        PrintConv => '$val ? sprintf("%+.1f", $val) : 0',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+);
+
+# lens information (ref PH)
+%Image::ExifTool::Pentax::LensInfo = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    IS_SUBDIR => [ 3 ],
+    NOTES => 'Pentax lens information structure for models such as the *istD.',
+    0 => {
+        Name => 'LensType',
+        Format => 'int8u[2]',
+        Priority => 0,
+        PrintConv => \%pentaxLensTypes,
+        SeparateTable => 1,
+    },
+    3 => {
+        Name => 'LensData',
+        Format => 'undef[17]',
+        SubDirectory => { TagTable => 'Image::ExifTool::Pentax::LensData' },
+    },
+);
+
+# lens information for newer models (ref PH)
+%Image::ExifTool::Pentax::LensInfo2 = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    IS_SUBDIR => [ 4 ],
+    NOTES => 'Pentax lens information structure for models such as the K10D and K20D.',
+    0 => {
+        Name => 'LensType',
+        Format => 'int8u[4]',
+        Priority => 0,
+        ValueConv => q{
+            my @v = split(' ',$val);
+            $v[0] &= 0x0f;
+            $v[1] = $v[2] * 256 + $v[3]; # (always high byte first)
+            return "$v[0] $v[1]";
+        },
+        PrintConv => \%pentaxLensTypes,
+        SeparateTable => 1,
+    },
+    4 => {
+        Name => 'LensData',
+        Format => 'undef[17]',
+        SubDirectory => { TagTable => 'Image::ExifTool::Pentax::LensData' },
+    },
+);
+
+# lens information for 645D (ref PH)
+%Image::ExifTool::Pentax::LensInfo3 = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    IS_SUBDIR => [ 13 ],
+    NOTES => 'Pentax lens information structure for 645D.',
+    1 => {
+        Name => 'LensType',
+        Format => 'int8u[4]',
+        Priority => 0,
+        ValueConv => q{
+            my @v = split(' ',$val);
+            $v[0] &= 0x0f;
+            $v[1] = $v[2] * 256 + $v[3]; # (always high byte first)
+            return "$v[0] $v[1]";
+        },
+        PrintConv => \%pentaxLensTypes,
+        SeparateTable => 1,
+    },
+    13 => {
+        Name => 'LensData',
+        Format => 'undef[17]',
+        SubDirectory => { TagTable => 'Image::ExifTool::Pentax::LensData' },
+    },
+);
+
+# lens information for K-5, K-r, etc (ref PH)
+%Image::ExifTool::Pentax::LensInfo4 = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    IS_SUBDIR => [ 12 ],
+    NOTES => 'Pentax lens information structure for models such as the K-5 and K-r.',
+    1 => {
+        Name => 'LensType',
+        Format => 'int8u[4]',
+        Priority => 0,
+        ValueConv => q{
+            my @v = split(' ',$val);
+            $v[0] &= 0x0f;
+            $v[1] = $v[2] * 256 + $v[3]; # (always high byte first)
+            return "$v[0] $v[1]";
+        },
+        PrintConv => \%pentaxLensTypes,
+        SeparateTable => 1,
+    },
+    12 => {
+        Name => 'LensData',
+        Format => 'undef[17]',
+        SubDirectory => { TagTable => 'Image::ExifTool::Pentax::LensData' },
+    },
+);
+
+# lens data information, including lens codes (ref PH)
+%Image::ExifTool::Pentax::LensData = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => q{
+        Pentax lens data information.  Some of these tags require interesting binary
+        gymnastics to decode them into useful values.
+    },
+    # this byte comes from the lens electrical contacts
+    # (see http://kmp.bdimitrov.de/technology/K-mount/Ka.html)
+    0.1 => { #JD
+        Name => 'AutoAperture',
+        Mask => 0x01,
+        PrintConv => {
+            0 => 'On',
+            1 => 'Off',
+        },
+    },
+    0.2 => { #JD
+        Name => 'MinAperture',
+        Mask => 0x06,
+        PrintConv => {
+            0x00 => 22,
+            0x02 => 32,
+            0x04 => 45,
+            0x06 => 16,
+        },
+    },
+    0.3 => { #JD
+        Name => 'LensFStops',
+        Mask => 0x70,
+        ValueConv => '5 + (($val >> 4) ^ 0x07) / 2',
+        ValueConvInv => '((($val - 5) * 2) ^ 0x07) << 4',
+    },
+    # 1-16 look like Lens Codes LC0-LC15, ref patent 5617173 and 5999753 [+notes by PH]
+    1 => { # LC0 = lens kind + version data
+        Name => 'LensKind',
+        %lensCode,
+    },
+    2 => { # LC1 = lens data (changes with AF setting)
+        Name => 'LC1',
+        %lensCode,
+    },
+    3 => { # LC2 = distance data
+        Name => 'LC2',
+        %lensCode,
+        # FocusRange decoding needs more testing with various lenses - PH
+        TestName => 'FocusRange',
+        TestPrintConv => q{
+            my @v;
+            my $lsb = $val & 0x07;
+            my $msb = $val >> 3;
+            my $ls2 = $lsb ^ 0x07;
+            $ls2 ^= 0x01 if $ls2 & 0x02;
+            $ls2 ^= 0x03 if $ls2 & 0x04;
+            foreach ($ls2, $ls2+1) {
+                push(@v,'inf'), next if $_ > 7;
+                push @v, sprintf("%.2f m", 2 ** ($msb / 4) * 0.18 * ($_ + 4) / 16);
+            }
+            return join ' - ', @v;
+        },
+    },
+    4 => { # LC3 = K-value data (AF pulses to displace image by unit length)
+        Name => 'LC3',
+        %lensCode,
+    },
+    5 => { # LC4 = abberation correction, near distance data
+        Name => 'LC4',
+        %lensCode,
+    },
+    6 => { # LC5 = light color abberation correction data
+        Name => 'LC5',
+        %lensCode,
+    },
+    7 => { # LC6 = open abberation data
+        Name => 'LC6',
+        %lensCode,
+    },
+    8 => { # LC7 = AF minimum actuation condition
+        Name => 'LC7',
+        %lensCode,
+    },
+    9 => { # LC8 = focal length data
+        Name => 'FocalLength',
+        Priority => 0,
+        ValueConv => '10*($val>>2) * 4**(($val&0x03)-2)', #JD
+        ValueConvInv => q{
+            my $range = int(log($val/10)/(2*log(2)));
+            warn("Value out of range") and return undef if $range < 0 or $range > 3;
+            return $range + (int($val/(10*4**($range-2))+0.5) << 2);
+        },
+        PrintConv => 'sprintf("%.1f mm", $val)',
+        PrintConvInv => '$val=~s/\s*mm//; $val',
+    },
+    # the following aperture values change with focal length
+    10 => { # LC9 = nominal AVmin/AVmax data (open/closed aperture values)
+        Name => 'NominalMaxAperture',
+        Mask => 0xf0,
+        ValueConv => '2**(($val>>4)/4)', #JD
+        ValueConvInv => '4*log($val)/log(2) << 4',
+        PrintConv => 'sprintf("%.1f", $val)',
+        PrintConvInv => '$val',
+    },
+    10.1 => { # LC9 = nominal AVmin/AVmax data (open/closed aperture values)
+        Name => 'NominalMinAperture',
+        Mask => 0x0f,
+        ValueConv => '2**(($val+10)/4)', #JD
+        ValueConvInv => '4*log($val)/log(2) - 10',
+        PrintConv => 'sprintf("%.0f", $val)',
+        PrintConvInv => '$val',
+    },
+    11 => { # LC10 = mv'/nv' data (full-aperture metering error compensation/marginal lumination compensation)
+        Name => 'LC10',
+        %lensCode,
+    },
+    12 => { # LC11 = AVC 1/EXP data
+        Name => 'LC11',
+        %lensCode,
+    },
+    13 => { # LC12 = mv1 AVminsif data
+        Name => 'LC12',
+        %lensCode,
+    },
+    14.1 => { # LC13 = AVmin (open aperture value) [MaxAperture=(2**((AVmin-1)/32))]
+        Name => 'MaxAperture',
+        Notes => 'effective wide open aperture for current focal length',
+        Mask => 0x7f, # (not sure what the high bit indicates)
+        # (a value of 1 seems to indicate 'n/a')
+        RawConv => '$val > 1 ? $val : undef',
+        ValueConv => '2**(($val-1)/32)',
+        ValueConvInv => '32*log($val)/log(2) + 1',
+        PrintConv => 'sprintf("%.1f", $val)',
+        PrintConvInv => '$val',
+    },
+    15 => { # LC14 = UNT_12 UNT_6 data
+        Name => 'LC14',
+        %lensCode,
+    },
+    16 => { # LC15 = incorporated flash suited END data
+        Name => 'LC15',
+        %lensCode,
+    },
+);
+
+# flash information (ref PH)
+%Image::ExifTool::Pentax::FlashInfo = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'Flash information tags for the K10D, K20D and K200D.',
+    0 => {
+        Name => 'FlashStatus',
+        PrintHex => 1,
+        PrintConv => { #19
+            0x00 => 'Off',
+            0x01 => 'Off (1)', #PH (K-5)
+            0x02 => 'External, Did not fire', # 0010
+            0x06 => 'External, Fired',        # 0110
+            0x08 => 'Internal, Did not fire (0x08)',
+            0x09 => 'Internal, Did not fire', # 1001
+            0x0d => 'Internal, Fired',        # 1101
+        },
+    },
+    1 => {
+        Name => 'InternalFlashMode',
+        PrintHex => 1,
+        PrintConv => {
+            0x00 => 'n/a - Off-Auto-Aperture', #19
+            0x86 => 'Fired, Wireless (Control)', #19
+            0x95 => 'Fired, Wireless (Master)', #19
+            0xc0 => 'Fired', # K10D
+            0xc1 => 'Fired, Red-eye reduction', # *istDS2, K10D
+            0xc2 => 'Fired, Auto', # K100D, K110D
+            0xc3 => 'Fired, Auto, Red-eye reduction', #PH
+            0xc6 => 'Fired, Wireless (Control), Fired normally not as control', #19 (Remote 3s)
+            0xc8 => 'Fired, Slow-sync', # K10D
+            0xc9 => 'Fired, Slow-sync, Red-eye reduction', # K10D
+            0xca => 'Fired, Trailing-curtain Sync', # K10D
+            0xf0 => 'Did not fire, Normal', #19
+            0xf1 => 'Did not fire, Red-eye reduction', #19
+            0xf2 => 'Did not fire, Auto', #19
+            0xf3 => 'Did not fire, Auto, Red-eye reduction', #19
+            0xf4 => 'Did not fire, (Unknown 0xf4)', #19
+            0xf5 => 'Did not fire, Wireless (Master)', #19
+            0xf6 => 'Did not fire, Wireless (Control)', #19
+            0xf8 => 'Did not fire, Slow-sync', #19
+            0xf9 => 'Did not fire, Slow-sync, Red-eye reduction', #19
+            0xfa => 'Did not fire, Trailing-curtain Sync', #19
+        },
+    },
+    2 => {
+        Name => 'ExternalFlashMode',
+        PrintHex => 1,
+        PrintConv => { #19
+            0x00 => 'n/a - Off-Auto-Aperture',
+            0x3f => 'Off',
+            0x40 => 'On, Auto',
+            0xbf => 'On, Flash Problem', #JD
+            0xc0 => 'On, Manual',
+            0xc4 => 'On, P-TTL Auto',
+            0xc5 => 'On, Contrast-control Sync', #JD
+            0xc6 => 'On, High-speed Sync',
+            0xcc => 'On, Wireless',
+            0xcd => 'On, Wireless, High-speed Sync',
+            0xf0 => 'Not Connected', #PH (K-5)
+        },
+    },
+    3 => {
+        Name => 'InternalFlashStrength',
+        Notes => 'saved from the most recent flash picture, on a scale of about 0 to 100',
+    },
+    4 => 'TTL_DA_AUp',
+    5 => 'TTL_DA_ADown',
+    6 => 'TTL_DA_BUp',
+    7 => 'TTL_DA_BDown',
+    24.1 => { #19/17
+        Name => 'ExternalFlashGuideNumber',
+        Mask => 0x1f,
+        Notes => 'val = 2**(raw/16 + 4), with a few exceptions',
+        ValueConv => q{
+            return 0 unless $val;
+            $val = -3 if $val == 29;  # -3 is stored as 0x1d
+            return 2**($val/16 + 4);
+        },
+        ValueConvInv => q{
+            return 0 unless $val;
+            my $raw = int((log($val)/log(2)-4)*16+0.5);
+            $raw = 29 if $raw < 0;   # guide number of 14 gives -3 which is stored as 0x1d
+            $raw = 31 if $raw > 31;  # maximum value is 0x1f
+            return $raw;
+        },
+        PrintConv => '$val ? int($val + 0.5) : "n/a"',
+        PrintConvInv => '$val=~/^n/ ? 0 : $val',
+        # observed values for various flash focal lengths/guide numbers:
+        #  AF-540FGZ (ref 19)  AF-360FGZ (ref 17)
+        #     6 => 20mm/21       29 => 20mm/14   (wide angle panel used)
+        #    16 => 24mm/32        6 => 24mm/21
+        #    18 => 28mm/35        7 => 28mm/22
+        #    21 => 35mm/39       10 => 35mm/25
+        #    24 => 50mm/45       14 => 50mm/30
+        #    26 => 70mm/50       17 => 70mm/33
+        #    28 => 85mm/54       19 => 85mm/36
+        # (I have also seen a value of 31 when both flashes are used together
+        # in a wired configuration, but I don't know exactly what this means - PH)
+    },
+    # 24 - have seen bit 0x80 set when 2 external wired flashes are used - PH
+    # 24 - have seen bit 0x40 set when wireless high speed sync is used - ref 19
+    25 => { #19
+        Name => 'ExternalFlashExposureComp',
+        PrintConv => {
+            0 => 'n/a', # Off or Auto Modes
+            144 => 'n/a (Manual Mode)', # Manual Flash Output
+            164 => '-3.0',
+            167 => '-2.5',
+            168 => '-2.0',
+            171 => '-1.5',
+            172 => '-1.0',
+            175 => '-0.5',
+            176 => '0.0',
+            179 => '0.5',
+            180 => '1.0',
+        },
+    },
+    26 => { #17
+        Name => 'ExternalFlashBounce',
+        Notes => 'saved from the most recent external flash picture', #19
+        PrintConv => {
+             0 => 'n/a',
+            16 => 'Direct',
+            48 => 'Bounce',
+        },
+    },
+    # ? => 'ExternalFlashAOutput',
+    # ? => 'ExternalFlashBOutput',
+);
+
+%Image::ExifTool::Pentax::FlashInfoUnknown = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    # 4 - changes with FEC for K-5 - PH
+);
+
+# camera manufacture information (ref PH)
+%Image::ExifTool::Pentax::CameraInfo = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    FORMAT => 'int32u',
+    0 => {
+        Name => 'PentaxModelID',
+        Priority => 0, # (Optio SVi uses incorrect Optio SV ID here)
+        SeparateTable => 1,
+        PrintHex => 1,
+        PrintConv => \%pentaxModelID,
+    },
+    1 => {
+        Name => 'ManufactureDate',
+        Groups => { 2 => 'Time' },
+        Notes => q{
+            this value, and the values of the tags below, may change if the camera is
+            serviced
+        },
+        ValueConv => q{
+            $val =~ /^(\d{4})(\d{2})(\d{2})$/ and return "$1:$2:$3";
+            # Optio A10 and A20 leave "200" off the year
+            $val =~ /^(\d)(\d{2})(\d{2})$/ and return "200$1:$2:$3";
+            return "Unknown ($val)";
+        },
+        ValueConvInv => '$val=~tr/0-9//dc; $val',
+    },
+    2 => {
+        #(see http://www.pentaxforums.com/forums/pentax-dslr-discussion/25711-k10d-update-model-revision-8-1-yes-no-8.html)
+        Name => 'ProductionCode', #(previously ModelRevision)
+        Format => 'int32u[2]',
+        Note => 'values of 8.x indicate that the camera has been serviced',
+        ValueConv => '$val=~tr/ /./; $val',
+        ValueConvInv => '$val=~tr/./ /; $val',
+        PrintConv => '$val=~/^8\./ ? "$val (camera has been serviced)" : $val',
+        PrintConvInv => '$val=~s/\s+.*//s; $val',
+    },
+    4 => 'InternalSerialNumber',
+);
+
+# battery information (ref PH)
+%Image::ExifTool::Pentax::BatteryInfo = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+# size of data:
+# 4 (K-m,K2000=4xAA), 6 (*istD,K10D,K100D,K110D=2xCR-V3/4xAA),
+# 7 (K20D=D-LI50, K200D=4xAA), 8 (645D=D-LI90), 10 (K-r pre-production?),
+# 14 (K-7=D-LI90, K-r=D-LI109/4xAA, K-x=4xAA), 26 (K-5=D-LI90)
+# battery grips available for:
+# BG1 (*istD), BG2 (K10D/K20D), BG3 (K200D), BG4 (K-7,K-5)
+# no grip available: K-x
+    0.1 => { #19
+        Name => 'PowerSource',
+        Mask => 0x0f,
+        # have seen the upper bit set (value of 0x82) for the
+        # *istDS and K100D, but I'm not sure what this means - PH
+        # I've also seen: 0x42 (K2000), 0xf2 (K-7,K-r,K-5), 0x12,0x22 (K-x) - PH
+        PrintConv => {
+            2 => 'Body Battery',
+            3 => 'Grip Battery',
+            4 => 'External Power Supply', #PH
+        },
+    },
+    1.1 => [
+        {
+            Name => 'BodyBatteryState',
+            Condition => '$$self{Model} =~ /(\*ist|K100D|K200D|K10D|GX10|K20D|GX20)\b/',
+            Notes => '*istD, K100D, K200D, K10D and K20D',
+            Mask => 0xf0,
+            PrintConv => { #19
+                 0x10 => 'Empty or Missing',
+                 0x20 => 'Almost Empty',
+                 0x30 => 'Running Low',
+                 0x40 => 'Full',
+            },
+        },{
+            Name => 'BodyBatteryState',
+            Condition => '$$self{Model} =~ /(K-5|K-7|K-r|K-x|645D)\b/',
+            Notes => 'K-5, K-7, K-r, K-x and 645D',
+            Mask => 0xf0,
+            PrintConv => {
+                 0x10 => 'Empty or Missing',
+                 0x20 => 'Almost Empty',
+                 0x30 => 'Running Low',
+                 0x40 => 'Close to Full',
+                 0x50 => 'Full',
+            },
+        },{
+            Name => 'BodyBatteryState',
+            Notes => 'decoding unknown for other models',
+            Mask => 0xf0,
+            ValueConv => '$val >> 4',
+            ValueConvInv => '$val << 4',
+        },
+    ],
+    1.2 => [
+        {
+            Name => 'GripBatteryState',
+            Condition => '$$self{Model} =~ /(K10D|GX10|K20D|GX20)\b/',
+            Notes => 'K10D and K20D',
+            Mask => 0x0f,
+            PrintConv => { #19
+                 0x01 => 'Empty or Missing',
+                 0x02 => 'Almost Empty',
+                 0x03 => 'Running Low',
+                 0x04 => 'Full',
+            },
+        },{
+            Name => 'GripBatteryState',
+            Notes => 'decoding unknown for other models',
+            Unknown => 1, # (doesn't appear to be valid for the K-5)
+            Mask => 0x0f,
+        },
+    ],
+    # internal and grip battery voltage Analogue to Digital measurements,
+    # open circuit and under load
+    2 => [
+        {
+            Name => 'BodyBatteryADNoLoad',
+            Description => 'Body Battery A/D No Load',
+            Condition => '$$self{Model} =~ /(K10D|GX10|K20D|GX20)\b/',
+            Notes => 'roughly calibrated for K10D with a new Pentax battery',
+            # rough linear calibration drops quickly below 30% - PH
+            # DVM readings: 8.18V=186, 8.42-8.40V=192 (full), 6.86V=155 (empty)
+            PrintConv => 'sprintf("%d (%.1fV, %d%%)",$val,$val*8.18/186,($val-155)*100/35)',
+            PrintConvInv => '$val=~s/ .*//; $val',
+        },
+        {
+            Name => 'BodyBatteryADNoLoad',
+            Description => 'Body Battery A/D No Load',
+            Condition => '$$self{Model} =~ /(\*ist|K100D|K200D)\b/',
+        },
+        {
+            Name => 'BodyBatteryVoltage1', # (static?)
+            Condition => '$$self{Model} =~ /(K-5|K-7|K-r|K-x|645D)\b/',
+            Format => 'int16u',
+            ValueConv => '$val / 100',
+            ValueConvInv => '$val * 100',
+            PrintConv => 'sprintf("%.2f V", $val)',
+            PrintConvInv => '$val =~ s/\s*V$//',
+            # For my K-5:          Min (0%) Max (100%) Meas
+            # BodyBatteryVoltage1  6.24 V   7.75 V     7.66 V
+            # BodyBatteryVoltage2  5.98 V   7.43 V     7.34 V
+            # BodyBatteryVoltage3  6.41 V   7.93 V     7.84 V
+            # BodyBatteryVoltage4  6.10 V   7.55 V     7.45 V
+            # "Meas" open-circuit voltages with DVM: AB=0V, AC=+8.33V, BC=+8.22V
+            # (terminal "C" is closest to edge of battery)
+        },
+    ],
+    3 => [
+        {
+            Name => 'BodyBatteryADLoad',
+            Description => 'Body Battery A/D Load',
+            Condition => '$$self{Model} =~ /(K10D|GX10|K20D|GX20)\b/',
+            Notes => 'roughly calibrated for K10D with a new Pentax battery',
+            # [have seen 187] - PH
+            PrintConv => 'sprintf("%d (%.1fV, %d%%)",$val,$val*8.18/186,($val-152)*100/34)',
+            PrintConvInv => '$val=~s/ .*//; $val',
+        },
+        {
+            Name => 'BodyBatteryADLoad',
+            Description => 'Body Battery A/D Load',
+            Condition => '$$self{Model} =~ /(\*ist|K100D|K200D)\b/',
+        },
+    ],
+    4 => [
+        {
+            Name => 'GripBatteryADNoLoad',
+            Description => 'Grip Battery A/D No Load',
+            Condition => '$$self{Model} =~ /(\*ist|K10D|GX10|K20D|GX20)\b/',
+        },
+        {
+            Name => 'BodyBatteryVoltage2', # (less than BodyBatteryVoltage1 -- under load?)
+            Condition => '$$self{Model} =~ /(K-5|K-7|K-r|K-x|645D)\b/',
+            Format => 'int16u',
+            ValueConv => '$val / 100',
+            ValueConvInv => '$val * 100',
+            PrintConv => 'sprintf("%.2f V", $val)',
+            PrintConvInv => '$val =~ s/\s*V$//',
+        },
+    ],
+    5 => {
+        Name => 'GripBatteryADLoad',
+        Condition => '$$self{Model} =~ /(\*ist|K10D|GX10|K20D|GX20)\b/',
+        Description => 'Grip Battery A/D Load',
+    },
+    6 => {
+        Name => 'BodyBatteryVoltage3', # (greater than BodyBatteryVoltage1)
+        Condition => '$$self{Model} =~ /(K-5|K-r|645D)\b/',
+        Format => 'int16u',
+        Notes => 'K-5, K-r and 645D only',
+        ValueConv => '$val / 100',
+        ValueConvInv => '$val * 100',
+        PrintConv => 'sprintf("%.2f V", $val)',
+        PrintConvInv => '$val =~ s/\s*V$//',
+    },
+    8 => {
+        Name => 'BodyBatteryVoltage4', # (between BodyBatteryVoltage1 and BodyBatteryVoltage2)
+        Condition => '$$self{Model} =~ /(K-5|K-r)\b/',
+        Format => 'int16u',
+        Notes => 'K-5 and K-r only',
+        ValueConv => '$val / 100',
+        ValueConvInv => '$val * 100',
+        PrintConv => 'sprintf("%.2f V", $val)',
+        PrintConvInv => '$val =~ s/\s*V$//',
+    },
+);
+
+# auto focus information
+%Image::ExifTool::Pentax::AFInfo = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    # AF Info tag names in K10D debugging output - PH:
+    # SelectArea, InFocusArea, Predictor, Defocus, IntegTime2msStep,
+    # CalFlag, ContrastFlag, PrecalFlag, SelectSensor
+    0x00 => { #PH
+        Name => 'AFPointsUnknown1',
+        Unknown => 1,
+        Format => 'int16u',
+        ValueConv => '$self->Options("Unknown") ? $val : $val & 0x7ff',
+        ValueConvInv => '$val',
+        PrintConvColumns => 2,
+        PrintConv => {
+            0x07ff => 'All',
+            0x0777 => 'Central 9 points',
+            BITMASK => {
+                0 => 'Upper-left',
+                1 => 'Top',
+                2 => 'Upper-right',
+                3 => 'Left',
+                4 => 'Mid-left',
+                5 => 'Center',
+                6 => 'Mid-right',
+                7 => 'Right',
+                8 => 'Lower-left',
+                9 => 'Bottom',
+                10 => 'Lower-right',
+                # (bits 12-15 are flags of some sort)
+            },
+        },
+    },
+    0x02 => { #PH
+        Name => 'AFPointsUnknown2',
+        Unknown => 1,
+        Format => 'int16u',
+        ValueConv => '$self->Options("Unknown") ? $val : $val & 0x7ff',
+        ValueConvInv => '$val',
+        PrintConvColumns => 2,
+        PrintConv => {
+            0 => 'Auto',
+            BITMASK => {
+                0 => 'Upper-left',
+                1 => 'Top',
+                2 => 'Upper-right',
+                3 => 'Left',
+                4 => 'Mid-left',
+                5 => 'Center',
+                6 => 'Mid-right',
+                7 => 'Right',
+                8 => 'Lower-left',
+                9 => 'Bottom',
+                10 => 'Lower-right',
+                # (bits 12-15 are flags of some sort)
+                # bit 15 is set for center focus point only if it is vertical
+            },
+        },
+    },
+    0x04 => { #PH (educated guess - predicted amount to drive lens)
+        Name => 'AFPredictor',
+        Format => 'int16s',
+    },
+    0x06 => 'AFDefocus', #PH (educated guess - calculated distance from focused)
+    0x07 => { #PH
+        # effective exposure time for AF sensors in 2 ms increments
+        Name => 'AFIntegrationTime',
+        Notes => 'times less than 2 ms give a value of 0',
+        ValueConv => '$val * 2',
+        ValueConvInv => 'int($val / 2)', # (don't round up)
+        PrintConv => '"$val ms"',
+        PrintConvInv => '$val=~tr/0-9//dc; $val',
+    },
+    # 0x0a - values: 00,05,0d,15,86,8e,a6,ae
+    0x0b => { #JD
+        Name => 'AFPointsInFocus',
+        Notes => q{
+            may report two points in focus even though a single AFPoint has been
+            selected, in which case the selected AFPoint is the first reported
+        },
+        PrintConvColumns => 2,
+        PrintConv => {
+            0 => 'None',
+            1 => 'Lower-left, Bottom',
+            2 => 'Bottom',
+            3 => 'Lower-right, Bottom',
+            4 => 'Mid-left, Center',
+            5 => 'Center (horizontal)', #PH
+            6 => 'Mid-right, Center',
+            7 => 'Upper-left, Top',
+            8 => 'Top',
+            9 => 'Upper-right, Top',
+            10 => 'Right',
+            11 => 'Lower-left, Mid-left',
+            12 => 'Upper-left, Mid-left',
+            13 => 'Bottom, Center',
+            14 => 'Top, Center',
+            15 => 'Lower-right, Mid-right',
+            16 => 'Upper-right, Mid-right',
+            17 => 'Left',
+            18 => 'Mid-left',
+            19 => 'Center (vertical)', #PH
+            20 => 'Mid-right',
+        },
+    },
+);
+
+# color information - PH
+%Image::ExifTool::Pentax::ColorInfo = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    FORMAT => 'int8s',
+    16 => {
+        Name => 'WBShiftAB',
+        Notes => 'positive is a shift toward blue',
+    },
+    17 => {
+        Name => 'WBShiftMG',
+        Notes => 'positive is a shift toward green',
+    },
+);
+
+# EV step size information - ref 19
+%Image::ExifTool::Pentax::EVStepInfo = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0 => {
+        Name => 'EVSteps',
+        PrintConv => {
+            0 => '1/2 EV Steps',
+            1 => '1/3 EV Steps',
+        },
+    },
+    1 => {
+        Name => 'SensitivitySteps',
+        PrintConv => {
+            0 => '1 EV Steps',
+            1 => 'As EV Steps',
+        },
+    },
+);
+
+# shot information? - ref PH (K-5)
+%Image::ExifTool::Pentax::ShotInfo = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    # 0: 0xf2/0xf3 (HDR), 0xf0 (otherwise)
+    1 => { # (presumably this is from an orientation sensor)
+        Name => 'CameraOrientation',
+        Condition => '$$self{Model} =~ /K-[^m]/',
+        Notes => 'K-5, K-7, K-r and K-x',
+        PrintHex => 1,
+        PrintConv => {
+            0x10 => 'Horizontal (normal)',
+            0x20 => 'Rotate 180',
+            0x30 => 'Rotate 90 CW',
+            0x40 => 'Rotate 270 CW',
+            0x50 => 'Upwards', # (to the sky)
+            0x60 => 'Downwards', # (to the ground)
+        },
+    },
+    # 2: 0xd3 (live view), 0xdb (HDR), 0x7b (otherwise)
+    # 3: 0xff
+    # 4: 0x64, 0x6a, 0x6f, 0xa4, 0xaa, 0xab, 0xbf
+    # 5: 0xfe
+    # 6: 0x0e
+    # 7: 0x02 (live view), 0x06 (otherwise)
+    # 8-10: 0x00
+);
+
+# face detect positions - ref PH (Optio RZ10)
+%Image::ExifTool::Pentax::FacePos = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    FORMAT => 'int16u',
+    0 => {
+        Name => 'Face1Position',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 1 ? undef : $val',
+        Notes => 'X/Y coordinates of face center in full-sized image',
+    },
+    2 => {
+        Name => 'Face2Position',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 2 ? undef : $val',
+    },
+    4 => {
+        Name => 'Face3Position',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 3 ? undef : $val',
+    },
+    6 => {
+        Name => 'Face4Position',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 4 ? undef : $val',
+    },
+    8 => {
+        Name => 'Face5Position',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 5 ? undef : $val',
+    },
+    10 => {
+        Name => 'Face6Position',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 6 ? undef : $val',
+    },
+    12 => {
+        Name => 'Face7Position',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 7 ? undef : $val',
+    },
+    14 => {
+        Name => 'Face8Position',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 8 ? undef : $val',
+    },
+    16 => {
+        Name => 'Face9Position',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 9 ? undef : $val',
+    },
+    18 => {
+        Name => 'Face10Position',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 10 ? undef : $val',
+    },
+    20 => {
+        Name => 'Face11Position',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 11 ? undef : $val',
+    },
+    22 => {
+        Name => 'Face12Position',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 12 ? undef : $val',
+    },
+    24 => {
+        Name => 'Face13Position',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 13 ? undef : $val',
+    },
+    26 => {
+        Name => 'Face14Position',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 14 ? undef : $val',
+    },
+    28 => {
+        Name => 'Face15Position',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 15 ? undef : $val',
+    },
+    30 => {
+        Name => 'Face16Position',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 16 ? undef : $val',
+    },
+    32 => {
+        Name => 'Face17Position',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 17 ? undef : $val',
+    },
+    34 => {
+        Name => 'Face18Position',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 18 ? undef : $val',
+    },
+    36 => {
+        Name => 'Face19Position',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 19 ? undef : $val',
+    },
+    38 => {
+        Name => 'Face20Position',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 20 ? undef : $val',
+    },
+    40 => {
+        Name => 'Face21Position',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 21 ? undef : $val',
+    },
+    42 => {
+        Name => 'Face22Position',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 22 ? undef : $val',
+    },
+    44 => {
+        Name => 'Face23Position',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 23 ? undef : $val',
+    },
+    46 => {
+        Name => 'Face24Position',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 24 ? undef : $val',
+    },
+    48 => {
+        Name => 'Face25Position',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 25 ? undef : $val',
+    },
+    50 => {
+        Name => 'Face26Position',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 26 ? undef : $val',
+    },
+    52 => {
+        Name => 'Face27Position',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 27 ? undef : $val',
+    },
+    54 => {
+        Name => 'Face28Position',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 28 ? undef : $val',
+    },
+    56 => {
+        Name => 'Face29Position',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 29 ? undef : $val',
+    },
+    58 => {
+        Name => 'Face30Position',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 30 ? undef : $val',
+    },
+    60 => {
+        Name => 'Face31Position',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 31 ? undef : $val',
+    },
+    62 => {
+        Name => 'Face32Position',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 32 ? undef : $val',
+    },
+);
+
+# face detect sizes - ref PH (Optio RZ10)
+%Image::ExifTool::Pentax::FaceSize = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    FORMAT => 'int16u',
+    0 => {
+        Name => 'Face1Size',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 1 ? undef : $val',
+    },
+    2 => {
+        Name => 'Face2Size',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 2 ? undef : $val',
+    },
+    4 => {
+        Name => 'Face3Size',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 3 ? undef : $val',
+    },
+    6 => {
+        Name => 'Face4Size',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 4 ? undef : $val',
+    },
+    8 => {
+        Name => 'Face5Size',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 5 ? undef : $val',
+    },
+    10 => {
+        Name => 'Face6Size',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 6 ? undef : $val',
+    },
+    12 => {
+        Name => 'Face7Size',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 7 ? undef : $val',
+    },
+    14 => {
+        Name => 'Face8Size',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 8 ? undef : $val',
+    },
+    16 => {
+        Name => 'Face9Size',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 9 ? undef : $val',
+    },
+    18 => {
+        Name => 'Face10Size',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 10 ? undef : $val',
+    },
+    20 => {
+        Name => 'Face11Size',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 11 ? undef : $val',
+    },
+    22 => {
+        Name => 'Face12Size',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 12 ? undef : $val',
+    },
+    24 => {
+        Name => 'Face13Size',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 13 ? undef : $val',
+    },
+    26 => {
+        Name => 'Face14Size',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 14 ? undef : $val',
+    },
+    28 => {
+        Name => 'Face15Size',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 15 ? undef : $val',
+    },
+    30 => {
+        Name => 'Face16Size',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 16 ? undef : $val',
+    },
+    32 => {
+        Name => 'Face17Size',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 17 ? undef : $val',
+    },
+    34 => {
+        Name => 'Face18Size',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 18 ? undef : $val',
+    },
+    36 => {
+        Name => 'Face19Size',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 19 ? undef : $val',
+    },
+    38 => {
+        Name => 'Face20Size',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 20 ? undef : $val',
+    },
+    40 => {
+        Name => 'Face21Size',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 21 ? undef : $val',
+    },
+    42 => {
+        Name => 'Face22Size',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 22 ? undef : $val',
+    },
+    44 => {
+        Name => 'Face23Size',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 23 ? undef : $val',
+    },
+    46 => {
+        Name => 'Face24Size',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 24 ? undef : $val',
+    },
+    48 => {
+        Name => 'Face25Size',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 25 ? undef : $val',
+    },
+    50 => {
+        Name => 'Face26Size',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 26 ? undef : $val',
+    },
+    52 => {
+        Name => 'Face27Size',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 27 ? undef : $val',
+    },
+    54 => {
+        Name => 'Face28Size',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 28 ? undef : $val',
+    },
+    56 => {
+        Name => 'Face29Size',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 29 ? undef : $val',
+    },
+    58 => {
+        Name => 'Face30Size',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 30 ? undef : $val',
+    },
+    60 => {
+        Name => 'Face31Size',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 31 ? undef : $val',
+    },
+    62 => {
+        Name => 'Face32Size',
+        Format => 'int16u[2]',
+        RawConv => '$$self{FacesDetected} < 32 ? undef : $val',
+    },
+);
+
+# digital filter information - ref PH (K-5)
+%Image::ExifTool::Pentax::FilterInfo = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    FORMAT => 'int8u',
+    NOTES => q{
+        The parameters associated with each type of digital filter are unique, and
+        these settings are also extracted with the DigitalFilter tag.  Information
+        is not extracted for filters that are "Off" unless the Unknown option is
+        used.
+    },
+    0 => {
+        Name => 'SourceDirectoryIndex',
+        Format => 'int16u',
+    },
+    2 => {
+        Name => 'SourceFileIndex',
+        Format => 'int16u',
+    },
+    0x005 => { Name => 'DigitalFilter01', %digitalFilter },
+    0x016 => { Name => 'DigitalFilter02', %digitalFilter },
+    0x027 => { Name => 'DigitalFilter03', %digitalFilter },
+    0x038 => { Name => 'DigitalFilter04', %digitalFilter },
+    0x049 => { Name => 'DigitalFilter05', %digitalFilter },
+    0x05a => { Name => 'DigitalFilter06', %digitalFilter },
+    0x06b => { Name => 'DigitalFilter07', %digitalFilter },
+    0x07c => { Name => 'DigitalFilter08', %digitalFilter },
+    0x08d => { Name => 'DigitalFilter09', %digitalFilter },
+    0x09e => { Name => 'DigitalFilter10', %digitalFilter },
+    0x0af => { Name => 'DigitalFilter11', %digitalFilter },
+    0x0c0 => { Name => 'DigitalFilter12', %digitalFilter },
+    0x0d1 => { Name => 'DigitalFilter13', %digitalFilter },
+    0x0e2 => { Name => 'DigitalFilter14', %digitalFilter },
+    0x0f3 => { Name => 'DigitalFilter15', %digitalFilter },
+    0x104 => { Name => 'DigitalFilter16', %digitalFilter },
+    0x115 => { Name => 'DigitalFilter17', %digitalFilter },
+    0x126 => { Name => 'DigitalFilter18', %digitalFilter },
+    0x137 => { Name => 'DigitalFilter19', %digitalFilter },
+    0x148 => { Name => 'DigitalFilter20', %digitalFilter },
+);
+
+# electronic level information - ref PH (K-5)
+%Image::ExifTool::Pentax::LevelInfo = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    FORMAT => 'int8s',
+    NOTES => 'Tags decoded from the electronic level information.',
+    0 => {
+        Name => 'LevelOrientation',
+        Mask => 0x0f,
+        PrintHex => 0,
+        PrintConv => {
+            1 => 'Horizontal (normal)',
+            2 => 'Rotate 180',
+            3 => 'Rotate 90 CW',
+            4 => 'Rotate 270 CW',
+            9 => 'Horizontal; Off Level',
+            10 => 'Rotate 180; Off Level',
+            11 => 'Rotate 90 CW; Off Level',
+            12 => 'Rotate 270 CW; Off Level',
+            13 => 'Upwards',
+            14 => 'Downwards',
+        },
+    },
+    0.1 => {
+        Name => 'CompositionAdjust',
+        Mask => 0xf0,
+        PrintConv => {
+            0x00 => 'Off',
+            0x20 => 'Composition Adjust',
+            0xa0 => 'Composition Adjust + Horizon Correction',
+            0xc0 => 'Horizon Correction',
+        },
+    },
+    1 => {
+        Name => 'RollAngle',
+        Notes => 'degrees of clockwise camera rotation',
+        ValueConv => '-$val / 2',
+        ValueConvInv => '-$val * 2',
+    },
+    2 => {
+        Name => 'PitchAngle',
+        Notes => 'degrees of upward camera tilt',
+        ValueConv => '-$val / 2',
+        ValueConvInv => '-$val * 2',
+    },
+    # 3,4 - related somehow to horizon correction and composition adjust
+    # 5,6,7 - (the notes below refer to how the image moves in the LCD monitor)
+    5 => {
+        Name => 'CompositionAdjustX',
+        Notes => 'steps to the right, 1/16 mm per step',
+        ValueConv => '-$val',
+        ValueConvInv => '-$val',
+    },
+    6 => {
+        Name => 'CompositionAdjustY',
+        Notes => 'steps up, 1/16 mm per step',
+        ValueConv => '-$val',
+        ValueConvInv => '-$val',
+    },
+    7 => {
+        Name => 'CompositionAdjustRotation',
+        Notes => 'steps clockwise, 1/8 degree per step',
+        ValueConv => '-$val / 2',
+        ValueConvInv => '-$val * 2',
+    },
+);
+
+# temperature information for the K5 - PH
+%Image::ExifTool::Pentax::TempInfoK5 = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => q{
+        A number of additional temperature readings are extracted from this 256-byte
+        binary-data block in images from the K-5.  It is not currently known where
+        the corresponding temperature sensors are located in the camera.
+    },
+    # (it would be nice to know where these temperature sensors are located,
+    #  but since according to the manual the Slow Shutter Speed NR Auto mode
+    #  is based on "internal temperature", my guess is that there must be
+    #  at least one on the sensor itself.  These temperatures seem to rise
+    #  more quickly than CameraTemperature when shooting video.)
+    0x0c => {
+        Name => 'CameraTemperature2',
+        Format => 'int16s',
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+        PrintConv => 'sprintf("%.1f C", $val)',
+        PrintConvInv => '$val=~s/ ?c$//i; $val',
+    },
+    0x0e => {
+        Name => 'CameraTemperature3',
+        Format => 'int16s',
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+        PrintConv => 'sprintf("%.1f C", $val)',
+        PrintConvInv => '$val=~s/ ?c$//i; $val',
+    },
+    0x14 => {
+        Name => 'CameraTemperature4',
+        Format => 'int16s',
+        PrintConv => '"$val C"',
+        PrintConvInv => '$val=~s/ ?c$//i; $val',
+    },
+    0x16 => { # usually the same as CameraTemperature4, but not always
+        Name => 'CameraTemperature5',
+        Format => 'int16s',
+        PrintConv => '"$val C"',
+        PrintConvInv => '$val=~s/ ?c$//i; $val',
+    },
+);
+
+# currently unknown info
+%Image::ExifTool::Pentax::UnknownInfo = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    # K10D: first 8 bytes seem to be short integers which change with ISO (value
+    # is usually close to ISO/100) possibly smoothing or gain parameters? - PH
+    # byte 0-1 - Higher for high color temperatures (red boost or red noise suppression?)
+    # byte 6-7 - Higher for low color temperatures (blue boost or blue noise suppression?)
+    # also changing are bytes 10,11,14,15
+);
+
+# Pentax type 2 (Casio-like) maker notes (ref 1)
+%Image::ExifTool::Pentax::Type2 = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    WRITABLE => 'int16u',
+    NOTES => q{
+        These tags are used by the Pentax Optio 330 and 430, and are similar to the
+        tags used by Casio.
+    },
+    0x0001 => {
+        Name => 'RecordingMode',
+        PrintConv => {
+            0 => 'Auto',
+            1 => 'Night Scene',
+            2 => 'Manual',
+        },
+    },
+    0x0002 => {
+        Name => 'Quality',
+        PrintConv => {
+            0 => 'Good',
+            1 => 'Better',
+            2 => 'Best',
+        },
+    },
+    0x0003 => {
+        Name => 'FocusMode',
+        PrintConv => {
+            2 => 'Custom',
+            3 => 'Auto',
+        },
+    },
+    0x0004 => {
+        Name => 'FlashMode',
+        PrintConv => {
+            1 => 'Auto',
+            2 => 'On',
+            4 => 'Off',
+            6 => 'Red-eye reduction',
+        },
+    },
+    # Casio 0x0005 is FlashIntensity
+    # Casio 0x0006 is ObjectDistance
+    0x0007 => {
+        Name => 'WhiteBalance',
+        PrintConv => {
+            0 => 'Auto',
+            1 => 'Daylight',
+            2 => 'Shade',
+            3 => 'Tungsten',
+            4 => 'Fluorescent',
+            5 => 'Manual',
+        },
+    },
+    0x000a => {
+        Name => 'DigitalZoom',
+        Writable => 'int32u',
+    },
+    0x000b => {
+        Name => 'Sharpness',
+        PrintConv => {
+            0 => 'Normal',
+            1 => 'Soft',
+            2 => 'Hard',
+        },
+    },
+    0x000c => {
+        Name => 'Contrast',
+        PrintConv => {
+            0 => 'Normal',
+            1 => 'Low',
+            2 => 'High',
+        },
+    },
+    0x000d => {
+        Name => 'Saturation',
+        PrintConv => {
+            0 => 'Normal',
+            1 => 'Low',
+            2 => 'High',
+        },
+    },
+    0x0014 => {
+        Name => 'ISO',
+        Priority => 0,
+        PrintConv => {
+            10 => 100,
+            16 => 200,
+            50 => 50, #PH
+            100 => 100, #PH
+            200 => 200, #PH
+            400 => 400, #PH
+            800 => 800, #PH
+            1600 => 1600, #PH
+            3200 => 3200, #PH
+        },
+    },
+    0x0017 => {
+        Name => 'ColorFilter',
+        PrintConv => {
+            1 => 'Full',
+            2 => 'Black & White',
+            3 => 'Sepia',
+        },
+    },
+    # Casio 0x0018 is AFPoint
+    # Casio 0x0019 is FlashIntensity
+    0x0e00 => {
+        Name => 'PrintIM',
+        Description => 'Print Image Matching',
+        Writable => 0,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::PrintIM::Main',
+        },
+    },
+    0x1000 => {
+        Name => 'HometownCityCode',
+        Writable => 'undef',
+        Count => 4,
+    },
+    0x1001 => { #PH
+        Name => 'DestinationCityCode',
+        Writable => 'undef',
+        Count => 4,
+    },
+);
+
+# ASCII-based maker notes of Optio E20 and E25 - PH
+%Image::ExifTool::Pentax::Type4 = (
+    PROCESS_PROC => \&Image::ExifTool::HP::ProcessHP,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => q{
+        The following few tags are extracted from the wealth of information
+        available in maker notes of the Optio E20 and E25.  These maker notes are
+        stored as ASCII text in a format very similar to some HP models.
+    },
+   'F/W Version' => 'FirmwareVersion',
+);
+
+# tags in Pentax QuickTime videos (PH - tests with Optio WP)
+# (similar information in Kodak,Minolta,Nikon,Olympus,Pentax and Sanyo videos)
+%Image::ExifTool::Pentax::MOV = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    FIRST_ENTRY => 0,
+    NOTES => 'This information is found in Pentax MOV videos.',
+    0x00 => {
+        Name => 'Make',
+        Format => 'string[24]',
+    },
+    # (01 00 at offset 0x20)
+    0x26 => {
+        Name => 'ExposureTime',
+        Format => 'int32u',
+        ValueConv => '$val ? 10 / $val : 0',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+    },
+    0x2a => {
+        Name => 'FNumber',
+        Format => 'rational64u',
+        PrintConv => 'sprintf("%.1f",$val)',
+    },
+    0x32 => {
+        Name => 'ExposureCompensation',
+        Format => 'rational64s',
+        PrintConv => '$val ? sprintf("%+.1f", $val) : 0',
+    },
+    0x44 => {
+        Name => 'WhiteBalance',
+        Format => 'int16u',
+        PrintConv => {
+            0 => 'Auto',
+            1 => 'Daylight',
+            2 => 'Shade',
+            3 => 'Fluorescent', #2
+            4 => 'Tungsten',
+            5 => 'Manual',
+        },
+    },
+    0x48 => {
+        Name => 'FocalLength',
+        Format => 'rational64u',
+        PrintConv => 'sprintf("%.1f mm",$val)',
+    },
+    0xaf => {
+        Name => 'ISO',
+        Format => 'int16u',
+    },
+);
+
+# Pentax metadata in AVI videos (PH)
+%Image::ExifTool::Pentax::AVI = (
+    NOTES => 'Pentax-specific RIFF tags found in AVI videos.',
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Video' },
+    hymn => {
+        Name => 'MakerNotes',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Pentax::Main',
+            Start => 10,
+            Base => '$start',
+            ByteOrder => 'BigEndian',
+        },
+    },
+);
+
+# Pentax metadata in AVI videos from the RS1000 (PH)
+%Image::ExifTool::Pentax::Junk = (
+    NOTES => 'Tags found in the JUNK chunk of AVI videos from the RS1000.',
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0x0c => {
+        Name => 'Model',
+        Format => 'string[32]',
+    },
+);
+
+#------------------------------------------------------------------------------
+# Convert filter settings (ref PH, K-5)
+# Inputs: 0) value to convert, 1) flag for inverse conversion, 2) lookup table
+# Returns: converted value
+sub PrintFilter($$$)
+{
+    my ($val, $inv, $conv) = @_;
+    my (@vals, @cval, $t, $v);
+
+    if (not $inv) {
+        # forward conversion (reading):
+        @vals = split ' ',$val;
+        $t = shift @vals;
+        push @cval, $$conv{$t} || "Unknown ($t)";
+        while (@vals) {
+            $t = shift @vals;
+            $v = shift @vals;
+            next unless $t;
+            last unless defined $v;
+            my $c = $filterSettings{$t};
+            if ($c) {
+                my $c1 = $$c[1];
+                if (ref $c1) {
+                    $v = $$c1{$v} || "Unknown($v)";
+                } elsif ($v) {
+                    $v = sprintf $c1, $v;
+                }
+                push @cval, "$$c[0]=$v";
+            } else {
+                push @cval, "Unknown($t)=$v";
+            }
+        }
+        return @cval ? \@cval : undef;
+    } else {
+        # reverse conversion (writing):
+        @vals = split /,\s*/, $val;
+        # convert filter name
+        delete $$conv{OTHER}; # avoid recursion
+        $v = Image::ExifTool::ReverseLookup(shift(@vals), $conv);
+        $$conv{OTHER} = \&PrintFilter;
+        return undef unless defined $v;
+        push @cval, $v;
+        # generate a lookup table for the filter setting name
+        my %settingNames;
+        $settingNames{$_} = $filterSettings{$_}[0] foreach keys %filterSettings;
+        # convert filter settings
+        foreach $v (@vals) {
+            $v =~ /^(.*)=(.*)$/ or return undef;
+            ($t, $v) = ($1, $2);
+            # look up settings name
+            $t = Image::ExifTool::ReverseLookup($t, \%settingNames);
+            return undef unless defined $t;
+            if (ref $filterSettings{$t}[1]) {
+                # look up settings value
+                $v = Image::ExifTool::ReverseLookup($v, $filterSettings{$t}[1]);
+                return undef unless defined $v;
+            } else {
+                return undef unless Image::ExifTool::IsInt($v);
+            }
+            push @cval, $t, $v;
+        }
+        push @cval, (0) x (17 - @cval) if @cval < 17; # pad with zeros if necessary
+        return join(' ', @cval);
+    }
+}
+
+#------------------------------------------------------------------------------
+# Convert Pentax hex-based EV (modulo 8) to real number
+# Inputs: 0) value to convert
+# ie) 0x00 -> 0
+#     0x03 -> 0.33333
+#     0x04 -> 0.5
+#     0x05 -> 0.66666
+#     0x08 -> 1   ...  etc
+sub PentaxEv($)
+{
+    my $val = shift;
+    if ($val & 0x01) {
+        my $sign = $val < 0 ? -1 : 1;
+        my $frac = ($val * $sign) & 0x07;
+        if ($frac == 0x03) {
+            $val += $sign * ( 8 / 3 - $frac);
+        } elsif ($frac == 0x05) {
+            $val += $sign * (16 / 3 - $frac);
+        }
+    }
+    return $val / 8;
+}
+
+#------------------------------------------------------------------------------
+# Convert number to Pentax hex-based EV (modulo 8)
+# Inputs: 0) number
+# Returns: Pentax EV code
+sub PentaxEvInv($)
+{
+    my $num = shift;
+    my $val = $num * 8;
+    # extra fudging makes sure 0.3 and 0.33333 both round up to 3, etc
+    my $sign = $num < 0 ? -1 : 1;
+    my $inum = $num * $sign - int($num * $sign);
+    if ($inum > 0.29 and $inum < 0.4) {
+        $val += $sign / 3;
+    } elsif ($inum > 0.6 and $inum < .71) {
+        $val -= $sign / 3;
+    }
+    return int($val + 0.5 * $sign);
+}
+
+#------------------------------------------------------------------------------
+# Encrypt or decrypt Pentax ShutterCount (symmetrical encryption) - PH
+# Inputs: 0) shutter count value, 1) ExifTool object ref
+# Returns: Encrypted or decrypted ShutterCount
+sub CryptShutterCount($$)
+{
+    my ($val, $exifTool) = @_;
+    # Pentax Date and Time values are used in the encryption
+    return undef unless $$exifTool{PentaxDate} and $$exifTool{PentaxTime} and
+        length($$exifTool{PentaxDate})==4 and length($$exifTool{PentaxTime})>=3;
+    # get Date and Time as integers (after padding Time with a null byte)
+    my $date = unpack('N', $$exifTool{PentaxDate});
+    my $time = unpack('N', $$exifTool{PentaxTime} . "\0");
+    return $val ^ $date ^ (0xffffffff - $time);
+}
+
+
+1; # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Pentax - Pentax/Asahi maker notes tags
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to interpret
+Pentax and Asahi maker notes in EXIF information.
+
+=head1 NOTES
+
+I couldn't find a good source for Pentax maker notes information, but I've
+managed to discover a fair bit of information by analyzing sample images
+downloaded from the internet, and through tests with my own Optio WP,
+K10D, and K-5, and with help provided by other ExifTool users (see
+L</ACKNOWLEDGEMENTS>).
+
+The Pentax maker notes are stored in standard EXIF format, but the offsets
+used for some of their cameras are wacky.  The Optio 330 gives the offset
+relative to the offset of the tag in the directory, the Optio WP uses a base
+offset in the middle of nowhere, and the Optio 550 uses different (and
+totally illogical) bases for different menu entries.  Very weird.  (It
+wouldn't surprise me if Pentax can't read their own maker notes!)  Luckily,
+there are only a few entries in the maker notes which are large enough to
+require offsets, so this doesn't affect much useful information.  ExifTool
+attempts to make sense of this fiasco by making an assumption about where
+the information should be stored to deduce the correct offsets.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<Image::MakerNotes::Pentax|Image::MakerNotes::Pentax>
+
+=item L<http://johnst.org/sw/exiftags/> (Asahi models)
+
+=item L<http://kobe1995.jp/~kaz/astro/istD.html>
+
+=item L<http://www.cybercom.net/~dcoffin/dcraw/>
+
+=item (...plus lots of testing with my Optio WP, K10D and K-5!)
+
+=back
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Wayne Smith, John Francis, Douglas O'Brien Cvetan Ivanov, Jens
+Duttke and Dave Nicholson for help figuring out some Pentax tags, Ger
+Vermeulen and Niels Kristian Bech Jensen for contributing print conversion
+values for some tags, and everyone who helped contribute to the LensType
+values.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/Pentax Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>,
+L<Image::Info(3pm)|Image::Info>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/PhotoMechanic.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/PhotoMechanic.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/PhotoMechanic.pm	(revision 24799)
@@ -0,0 +1,250 @@
+#------------------------------------------------------------------------------
+# File:         PhotoMechanic.pm
+#
+# Description:  Read/write Camera Bits Photo Mechanic information
+#
+# Revisions:    10/28/2006 - P. Harvey Created
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::PhotoMechanic;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::Exif;
+use Image::ExifTool::IPTC;
+use Image::ExifTool::XMP;
+
+$VERSION = '1.02';
+
+sub ProcessPhotoMechanic($$);
+
+# color class names
+my %colorClasses = (
+    0 => '0 (None)',
+    1 => '1 (Winner)',
+    2 => '2 (Winner alt)',
+    3 => '3 (Superior)',
+    4 => '4 (Superior alt)',
+    5 => '5 (Typical)',
+    6 => '6 (Typical alt)',
+    7 => '7 (Extras)',
+    8 => '8 (Trash)',
+);
+
+# main tag table IPTC-format records in PhotoMechanic trailer
+%Image::ExifTool::PhotoMechanic::Main = (
+    GROUPS => { 2 => 'Image' },
+    PROCESS_PROC => \&Image::ExifTool::IPTC::ProcessIPTC,
+    WRITE_PROC => \&Image::ExifTool::IPTC::WriteIPTC,
+    NOTES => q{
+        The Photo Mechanic trailer contains data in an IPTC-format structure, with
+        soft edit information stored under record number 2.
+    },
+    2 => {
+        Name => 'SoftEdit',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::PhotoMechanic::SoftEdit',
+        },
+    },
+);
+
+# raw/preview crop coordinate conversions
+my %rawCropConv = (
+    ValueConv => '$val / 655.36',
+    ValueConvInv => 'int($val * 655.36 + 0.5)',
+    PrintConv => 'sprintf("%.3f%%",$val)',
+    PrintConvInv => '$val=~tr/ %//d; $val',
+);
+
+# Record 2 -- PhotoMechanic soft edit information
+%Image::ExifTool::PhotoMechanic::SoftEdit = (
+    GROUPS => { 2 => 'Image' },
+    WRITE_PROC => \&Image::ExifTool::IPTC::WriteIPTC,
+    CHECK_PROC => \&Image::ExifTool::IPTC::CheckIPTC,
+    WRITABLE => 1,
+    FORMAT => 'int32s',
+    209 => { Name => 'RawCropLeft',   %rawCropConv },
+    210 => { Name => 'RawCropTop',    %rawCropConv },
+    211 => { Name => 'RawCropRight',  %rawCropConv },
+    212 => { Name => 'RawCropBottom', %rawCropConv },
+    213 => 'ConstrainedCropWidth',
+    214 => 'ConstrainedCropHeight',
+    215 => 'FrameNum',
+    216 => {
+        Name => 'Rotation',
+        PrintConv => {
+            0 => '0',
+            1 => '90',
+            2 => '180',
+            3 => '270',
+        },
+    },
+    217 => 'CropLeft',
+    218 => 'CropTop',
+    219 => 'CropRight',
+    220 => 'CropBottom',
+    221 => {
+        Name => 'Tagged',
+        PrintConv => { 0 => 'No', 1 => 'Yes' },
+    },
+    222 => {
+        Name => 'ColorClass',
+        PrintConv => \%colorClasses,
+    },
+    223 => 'Rating',
+    236 => { Name => 'PreviewCropLeft',   %rawCropConv },
+    237 => { Name => 'PreviewCropTop',    %rawCropConv },
+    238 => { Name => 'PreviewCropRight',  %rawCropConv },
+    239 => { Name => 'PreviewCropBottom', %rawCropConv },
+);
+
+# PhotoMechanic XMP properties
+%Image::ExifTool::PhotoMechanic::XMP = (
+    GROUPS => { 0 => 'XMP', 1 => 'XMP-photomech', 2 => 'Image' },
+    NAMESPACE => { photomechanic => 'http://ns.camerabits.com/photomechanic/1.0/' },
+    WRITE_PROC => \&Image::ExifTool::XMP::WriteXMP,
+    WRITABLE => 'string',
+    NOTES => q{
+        Below is a list of the observed PhotoMechanic XMP tags.  The actual
+        namespace prefix is "photomechanic" but ExifTool shortens this in
+        the "XMP-photomech" family 1 group name.
+    },
+    CountryCode => { Avoid => 1, Groups => { 2 => 'Location' } },
+    EditStatus  => { },
+    Prefs       => {
+        Notes => 'format is "Tagged:0, ColorClass:1, Rating:2, FrameNum:3"',
+        PrintConv => q{
+            $val =~ s[\s*(\d+):\s*(\d+):\s*(\d+):\s*(\S*)]
+                     [Tagged:$1, ColorClass:$2, Rating:$3, FrameNum:$4];
+            return $val;
+        },
+        PrintConvInv => q{
+            $val =~ s[Tagged:\s*(\d+).*ColorClass:\s*(\d+).*Rating:\s*(\d+).*FrameNum:\s*(\S*)]
+                     [$1:$2:$3:$4]is;
+            return $val;
+        },
+    },
+    TimeCreated => {
+        Avoid => 1,
+        Groups => { 2 => 'Time' },
+        Shift => 'Time',
+        ValueConv => 'Image::ExifTool::Exif::ExifTime($val)',
+        ValueConvInv => 'Image::ExifTool::IPTC::IptcTime($val)',
+    },
+);
+
+#------------------------------------------------------------------------------
+# Read/write PhotoMechanic information in a file
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 on success, 0 if this file didn't contain PhotoMechanic information
+# - updates DataPos to point to start of PhotoMechanic information
+# - updates DirLen to trailer length
+sub ProcessPhotoMechanic($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my $offset = $$dirInfo{Offset} || 0;
+    my $outfile = $$dirInfo{OutFile};
+    my $verbose = $exifTool->Options('Verbose');
+    my $out = $exifTool->Options('TextOut');
+    my $rtnVal = 0;
+    my ($buff, $footer);
+
+    for (;;) {
+        # read and validate trailer footer (last 12 bytes)
+        last unless $raf->Seek(-12-$offset, 2) and $raf->Read($footer, 12) == 12;
+        last unless $footer =~ /cbipcbbl$/;
+        my $size = unpack('N', $footer);
+
+        if ($size & 0x80000000 or not $raf->Seek(-$size-12, 1)) {
+            $exifTool->Warn('Bad PhotoMechanic trailer');
+            last;
+        }
+        unless ($raf->Read($buff, $size) == $size) {
+            $exifTool->Warn('Error reading PhotoMechanic trailer');
+            last;
+        }
+        $rtnVal = 1;    # we read the trailer successfully
+
+        # set variables returned in dirInfo hash
+        $$dirInfo{DataPos} = $raf->Tell() - $size;
+        $$dirInfo{DirLen} = $size + 12;
+
+        my %dirInfo = (
+            DataPt => \$buff,
+            DataPos => $$dirInfo{DataPos},
+            DirStart => 0,
+            DirLen => $size,
+            Parent => 'PhotoMechanic',
+        );
+        my $tagTablePtr = GetTagTable('Image::ExifTool::PhotoMechanic::Main');
+        if (not $outfile) {
+            # extract trailer information
+            $exifTool->DumpTrailer($dirInfo) if $verbose or $exifTool->{HTML_DUMP};
+            $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+        } elsif ($exifTool->{DEL_GROUP}->{PhotoMechanic}) {
+            # delete the trailer
+            $verbose and printf $out "  Deleting PhotoMechanic trailer\n";
+            ++$exifTool->{CHANGED};
+        } else {
+            # rewrite the trailer
+            my $newPt;
+            my $newBuff = $exifTool->WriteDirectory(\%dirInfo, $tagTablePtr);
+            if (defined $newBuff) {
+                $newPt = \$newBuff; # write out the modified trailer
+                my $pad = 0x800 - length($newBuff);
+                if ($pad > 0 and not $exifTool->Options('Compact')) {
+                    # pad out to 2kB like PhotoMechanic does
+                    $newBuff .= "\0" x $pad;
+                }
+                # generate new footer
+                $footer = pack('N', length($$newPt)) . 'cbipcbbl';
+            } else {
+                $newPt = \$buff;    # just copy existing trailer
+            }
+            # write out the trailer
+            Write($outfile, $$newPt, $footer) or $rtnVal = -1;
+        }
+        last;
+    }
+    return $rtnVal;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::PhotoMechanic - Read/write Photo Mechanic information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to read and
+write information written by the Camera Bits Photo Mechanic software.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 ACKNOWLEDGEMENTS
+
+Many thanks to the great support provided by Camera Bits, and in particular
+for the valuable exchanges with Kirk Baker.  Based on this experience, I can
+say that the technical support offered by Camera Bits is second to none.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/PhotoMechanic Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Photoshop.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Photoshop.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Photoshop.pm	(revision 24799)
@@ -0,0 +1,594 @@
+#------------------------------------------------------------------------------
+# File:         Photoshop.pm
+#
+# Description:  Read/write Photoshop IRB meta information
+#
+# Revisions:    02/06/2004 - P. Harvey Created
+#               02/25/2004 - P. Harvey Added hack for problem with old photoshops
+#               10/04/2004 - P. Harvey Added a bunch of tags (ref Image::MetaData::JPEG)
+#                            but left most of them commented out until I have enough
+#                            information to write PrintConv routines for them to
+#                            display something useful
+#               07/08/2005 - P. Harvey Added support for reading PSD files
+#               01/07/2006 - P. Harvey Added PSD write support
+#               11/04/2006 - P. Harvey Added handling of resource name
+#
+# References:   1) http://www.fine-view.com/jp/lab/doc/ps6ffspecsv2.pdf
+#               2) http://www.ozhiker.com/electronics/pjmt/jpeg_info/irb_jpeg_qual.html
+#               3) Matt Mueller private communication (tests with PS CS2)
+#               4) http://www.fileformat.info/format/psd/egff.htm
+#               5) http://www.telegraphics.com.au/svn/psdparse/trunk/resources.c
+#               6) http://libpsd.graphest.com/files/Photoshop%20File%20Formats.pdf
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Photoshop;
+
+use strict;
+use vars qw($VERSION $AUTOLOAD $iptcDigestInfo);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.41';
+
+sub ProcessPhotoshop($$$);
+sub WritePhotoshop($$$);
+
+# map of where information is stored in PSD image
+my %psdMap = (
+    IPTC         => 'Photoshop',
+    XMP          => 'Photoshop',
+    EXIFInfo     => 'Photoshop',
+    IFD0         => 'EXIFInfo',
+    IFD1         => 'IFD0',
+    ICC_Profile  => 'Photoshop',
+    ExifIFD      => 'IFD0',
+    GPS          => 'IFD0',
+    SubIFD       => 'IFD0',
+    GlobParamIFD => 'IFD0',
+    PrintIM      => 'IFD0',
+    InteropIFD   => 'ExifIFD',
+    MakerNotes   => 'ExifIFD',
+);
+
+# Photoshop APP13 tag table
+# (set Unknown flag for information we don't want to display normally)
+%Image::ExifTool::Photoshop::Main = (
+    GROUPS => { 2 => 'Image' },
+    PROCESS_PROC => \&ProcessPhotoshop,
+    WRITE_PROC => \&WritePhotoshop,
+    0x03e8 => { Unknown => 1, Name => 'Photoshop2Info' },
+    0x03e9 => { Unknown => 1, Name => 'MacintoshPrintInfo' },
+    0x03ea => { Unknown => 1, Name => 'XMLData', Binary => 1 }, #PH
+    0x03eb => { Unknown => 1, Name => 'Photoshop2ColorTable' },
+    0x03ed => {
+        Name => 'ResolutionInfo',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Photoshop::Resolution',
+        },
+    },
+    0x03ee => {
+        Name => 'AlphaChannelsNames',
+        ValueConv => 'Image::ExifTool::Photoshop::ConvertPascalString($self,$val)',
+    },
+    0x03ef => { Unknown => 1, Name => 'DisplayInfo' },
+    0x03f0 => { Unknown => 1, Name => 'PStringCaption' },
+    0x03f1 => { Unknown => 1, Name => 'BorderInformation' },
+    0x03f2 => { Unknown => 1, Name => 'BackgroundColor' },
+    0x03f3 => { Unknown => 1, Name => 'PrintFlags' },
+    0x03f4 => { Unknown => 1, Name => 'BW_HalftoningInfo' },
+    0x03f5 => { Unknown => 1, Name => 'ColorHalftoningInfo' },
+    0x03f6 => { Unknown => 1, Name => 'DuotoneHalftoningInfo' },
+    0x03f7 => { Unknown => 1, Name => 'BW_TransferFunc' },
+    0x03f8 => { Unknown => 1, Name => 'ColorTransferFuncs' },
+    0x03f9 => { Unknown => 1, Name => 'DuotoneTransferFuncs' },
+    0x03fa => { Unknown => 1, Name => 'DuotoneImageInfo' },
+    0x03fb => { Unknown => 1, Name => 'EffectiveBW' },
+    0x03fc => { Unknown => 1, Name => 'ObsoletePhotoshopTag1' },
+    0x03fd => { Unknown => 1, Name => 'EPSOptions' },
+    0x03fe => { Unknown => 1, Name => 'QuickMaskInfo' },
+    0x03ff => { Unknown => 1, Name => 'ObsoletePhotoshopTag2' },
+    0x0400 => { Unknown => 1, Name => 'LayerStateInfo' },
+    0x0401 => { Unknown => 1, Name => 'WorkingPath' },
+    0x0402 => { Unknown => 1, Name => 'LayersGroupInfo' },
+    0x0403 => { Unknown => 1, Name => 'ObsoletePhotoshopTag3' },
+    0x0404 => {
+        Name => 'IPTCData',
+        SubDirectory => {
+            DirName => 'IPTC',
+            TagTable => 'Image::ExifTool::IPTC::Main',
+        },
+    },
+    0x0405 => { Unknown => 1, Name => 'RawImageMode' },
+    0x0406 => { #2
+        Name => 'JPEG_Quality',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Photoshop::JPEG_Quality',
+        },
+    },
+    0x0408 => { Unknown => 1, Name => 'GridGuidesInfo' },
+    0x0409 => {
+        Name => 'PhotoshopBGRThumbnail',
+        Notes => 'this is a JPEG image, but in BGR format instead of RGB',
+        RawConv => 'my $img=substr($val,0x1c);$self->ValidateImage(\$img,$tag)',
+    },
+    0x040a => {
+        Name => 'CopyrightFlag',
+        Writable => 'int8u',
+        Groups => { 2 => 'Author' },
+        ValueConv => 'join(" ",unpack("C*", $val))',
+        ValueConvInv => 'pack("C*",split(" ",$val))',
+        PrintConv => { #3
+            0 => 'False',
+            1 => 'True',
+        },
+    },
+    0x040b => {
+        Name => 'URL',
+        Writable => 'string',
+        Groups => { 2 => 'Author' },
+    },
+    0x040c => {
+        Name => 'PhotoshopThumbnail',
+        RawConv => 'my $img=substr($val,0x1c);$self->ValidateImage(\$img,$tag)',
+    },
+    0x040d => {
+        Name => 'GlobalAngle',
+        Writable => 'int32u',
+        ValueConv => 'unpack("N",$val)',
+        ValueConvInv => 'pack("N",$val)',
+    },
+    0x040e => { Unknown => 1, Name => 'ColorSamplersResource' },
+    0x040f => {
+        Name => 'ICC_Profile',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::ICC_Profile::Main',
+        },
+    },
+    0x0410 => { Unknown => 1, Name => 'Watermark' },
+    0x0411 => { Unknown => 1, Name => 'ICC_Untagged' },
+    0x0412 => { Unknown => 1, Name => 'EffectsVisible' },
+    0x0413 => { Unknown => 1, Name => 'SpotHalftone' },
+    0x0414 => { Unknown => 1, Name => 'IDsBaseValue', Description => 'IDs Base Value' },
+    0x0415 => { Unknown => 1, Name => 'UnicodeAlphaNames' },
+    0x0416 => { Unknown => 1, Name => 'IndexedColourTableCount' },
+    0x0417 => { Unknown => 1, Name => 'TransparentIndex' },
+    0x0419 => {
+        Name => 'GlobalAltitude',
+        Writable => 'int32u',
+        ValueConv => 'unpack("N",$val)',
+        ValueConvInv => 'pack("N",$val)',
+    },
+    0x041a => { Unknown => 1, Name => 'Slices' },
+    0x041b => { Unknown => 1, Name => 'WorkflowURL' },
+    0x041c => { Unknown => 1, Name => 'JumpToXPEP' },
+    0x041d => { Unknown => 1, Name => 'AlphaIdentifiers' },
+    0x041e => { Unknown => 1, Name => 'URL_List' },
+    0x0421 => { Unknown => 1, Name => 'VersionInfo' },
+    0x0422 => {
+        Name => 'EXIFInfo', #PH (Found in EPS and PSD files)
+        SubDirectory => {
+            TagTable=> 'Image::ExifTool::Exif::Main',
+            ProcessProc => \&Image::ExifTool::ProcessTIFF,
+            WriteProc => \&Image::ExifTool::WriteTIFF,
+        },
+    },
+    0x0423 => { Unknown => 1, Name => 'ExifInfo2', Binary => 1 }, #5
+    0x0424 => {
+        Name => 'XMP',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::XMP::Main',
+        },
+    },
+    0x0425 => {
+        Name => 'IPTCDigest',
+        Writable => 'string',
+        Protected => 1,
+        Notes => q{
+            when writing, special values of "new" and "old" represent the digests of the
+            IPTC from the edited and original files respectively, and are undefined if
+            the IPTC does not exist in the respective file
+        },
+        # also note the 'new' feature requires that the IPTC comes before this tag is written
+        ValueConv => 'unpack("H*", $val)',
+        ValueConvInv => q{
+            if (lc($val) eq 'new' or lc($val) eq 'old') {
+                {
+                    local $SIG{'__WARN__'} = sub { };
+                    return lc($val) if eval 'require Digest::MD5';
+                }
+                warn "Digest::MD5 must be installed\n";
+                return undef;
+            }
+            return pack('H*', $val) if $val =~ /^[0-9a-f]{32}$/i;
+            warn "Value must be 'new', 'old' or 32 hexadecimal digits\n";
+            return undef;
+        }
+    },
+    0x0426 => { Unknown => 1, Name => 'PrintScale' }, #5
+    0x0428 => { Unknown => 1, Name => 'PixelAspectRatio' }, #5
+    0x0429 => { Unknown => 1, Name => 'LayerComps' }, #5
+    0x042a => { Unknown => 1, Name => 'AlternateDuotoneColors' }, #5
+    0x042b => { Unknown => 1, Name => 'AlternateSpotColors' }, #5
+    # 0x07d0-0x0bb6 Path information
+    0x0bb7 => {
+        Name => 'ClippingPathName',
+        # convert from a Pascal string (ignoring 6 bytes of unknown data after string)
+        ValueConv => q{
+            my $len = ord($val);
+            $val = substr($val, 0, $len+1) if $len < length($val);
+            return Image::ExifTool::Photoshop::ConvertPascalString($self,$val);
+        },
+    },
+    0x2710 => { Unknown => 1, Name => 'PrintFlagsInfo' },
+);
+
+# Photoshop JPEG quality record (ref 2)
+%Image::ExifTool::Photoshop::JPEG_Quality = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    FORMAT => 'int16s',
+    GROUPS => { 2 => 'Image' },
+    0 => {
+        Name => 'PhotoshopQuality',
+        Writable => 1,
+        PrintConv => '$val + 4',
+        PrintConvInv => '$val - 4',
+    },
+    1 => {
+        Name => 'PhotoshopFormat',
+        PrintConv => {
+            0x0000 => 'Standard',
+            0x0001 => 'Optimised',
+            0x0101 => 'Progressive',
+        },
+    },
+    2 => {
+        Name => 'ProgressiveScans',
+        PrintConv => {
+            1 => '3 Scans',
+            2 => '4 Scans',
+            3 => '5 Scans',
+        },
+    },
+);
+
+# Photoshop resolution information #PH
+%Image::ExifTool::Photoshop::Resolution = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    FORMAT => 'int16u',
+    FIRST_ENTRY => 0,
+    WRITABLE => 1,
+    GROUPS => { 2 => 'Image' },
+    0 => {
+        Name => 'XResolution',
+        Format => 'int32u',
+        Priority => 0,
+        ValueConv => '$val / 0x10000',
+        ValueConvInv => 'int($val * 0x10000 + 0.5)',
+        PrintConv => 'int($val * 100 + 0.5) / 100',
+        PrintConvInv => '$val',
+    },
+    2 => {
+        Name => 'DisplayedUnitsX',
+        PrintConv => {
+            1 => 'inches',
+            2 => 'cm',
+        },
+    },
+    4 => {
+        Name => 'YResolution',
+        Format => 'int32u',
+        Priority => 0,
+        ValueConv => '$val / 0x10000',
+        ValueConvInv => 'int($val * 0x10000 + 0.5)',
+        PrintConv => 'int($val * 100 + 0.5) / 100',
+        PrintConvInv => '$val',
+    },
+    6 => {
+        Name => 'DisplayedUnitsY',
+        PrintConv => {
+            1 => 'inches',
+            2 => 'cm',
+        },
+    },
+);
+
+# Photoshop PSD file header
+%Image::ExifTool::Photoshop::Header = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    FORMAT => 'int16u',
+    GROUPS => { 2 => 'Image' },
+    NOTES => 'This information is found in the PSD file header.',
+    6 => 'NumChannels',
+    7 => { Name => 'ImageHeight', Format => 'int32u' },
+    9 => { Name => 'ImageWidth', Format => 'int32u' },
+    11 => 'BitDepth',
+    12 => {
+        Name => 'ColorMode',
+        PrintConvColumns => 2,
+        PrintConv => {
+            0 => 'Bitmap',
+            1 => 'Grayscale',
+            2 => 'Indexed',
+            3 => 'RGB',
+            4 => 'CMYK',
+            7 => 'Multichannel',
+            8 => 'Duotone',
+            9 => 'Lab',
+        },
+    },
+);
+
+# tags for unknown resource types
+%Image::ExifTool::Photoshop::Unknown = (
+    GROUPS => { 2 => 'Unknown' },
+);
+
+# define reference to IPTCDigest tagInfo hash for convenience
+$iptcDigestInfo = $Image::ExifTool::Photoshop::Main{0x0425};
+
+
+#------------------------------------------------------------------------------
+# AutoLoad our writer routines when necessary
+#
+sub AUTOLOAD
+{
+    return Image::ExifTool::DoAutoLoad($AUTOLOAD, @_);
+}
+
+#------------------------------------------------------------------------------
+# Convert pascal string(s) to something we can use
+# Inputs: 1) Pascal string data
+# Returns: Strings, concatenated with ', '
+sub ConvertPascalString($$)
+{
+    my ($exifTool, $inStr) = @_;
+    my $outStr = '';
+    my $len = length($inStr);
+    my $i=0;
+    while ($i < $len) {
+        my $n = ord(substr($inStr, $i, 1));
+        last if $i + $n >= $len;
+        $i and $outStr .= ', ';
+        $outStr .= substr($inStr, $i+1, $n);
+        $i += $n + 1;
+    }
+    my $charset = $exifTool->Options('CharsetPhotoshop') || 'Latin';
+    return $exifTool->Decode($outStr, $charset);
+}
+
+#------------------------------------------------------------------------------
+# Process Photoshop APP13 record
+# Inputs: 0) ExifTool object reference, 1) Reference to directory information
+#         2) Tag table reference
+# Returns: 1 on success
+sub ProcessPhotoshop($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $pos = $$dirInfo{DirStart};
+    my $dirEnd = $pos + $$dirInfo{DirLen};
+    my $verbose = $exifTool->Options('Verbose');
+    my $success = 0;
+
+    SetByteOrder('MM');     # Photoshop is always big-endian
+    $verbose and $exifTool->VerboseDir('Photoshop', 0, $$dirInfo{DirLen});
+
+    # scan through resource blocks:
+    # Format: 0) Type, 4 bytes - '8BIM' (or the rare 'PHUT', 'DCSR' or 'AgHg')
+    #         1) TagID,2 bytes
+    #         2) Name, pascal string padded to even no. bytes
+    #         3) Size, 4 bytes - N
+    #         4) Data, N bytes
+    while ($pos + 8 < $dirEnd) {
+        my $type = substr($$dataPt, $pos, 4);
+        my ($ttPtr, $extra, $val, $name);
+        if ($type eq '8BIM') {
+            $ttPtr = $tagTablePtr;
+        } elsif ($type =~ /^(PHUT|DCSR|AgHg)$/) {
+            $ttPtr = GetTagTable('Image::ExifTool::Photoshop::Unknown');
+        } else {
+            $type =~ s/([^\w])/sprintf("\\x%.2x",ord($1))/ge;
+            $exifTool->Warn(qq{Bad Photoshop IRB resource "$type"});
+            last;
+        }
+        my $tag = Get16u($dataPt, $pos + 4);
+        $pos += 6;  # point to start of name
+        my $nameLen = Get8u($dataPt, $pos);
+        my $namePos = ++$pos;
+        # skip resource block name (pascal string, padded to an even # of bytes)
+        $pos += $nameLen;
+        ++$pos unless $nameLen & 0x01;
+        if ($pos + 4 > $dirEnd) {
+            $exifTool->Warn("Bad Photoshop resource block");
+            last;
+        }
+        my $size = Get32u($dataPt, $pos);
+        $pos += 4;
+        if ($size + $pos > $dirEnd) {
+            $exifTool->Warn("Bad Photoshop resource data size $size");
+            last;
+        }
+        $success = 1;
+        if ($nameLen) {
+            $name = substr($$dataPt, $namePos, $nameLen);
+            $extra = qq{, Name="$name"};
+        } else {
+            $name = '';
+        }
+        my $tagInfo = $exifTool->GetTagInfo($ttPtr, $tag);
+        # append resource name to value if requested (braced by "/#...#/")
+        if ($tagInfo and defined $$tagInfo{SetResourceName} and
+            $$tagInfo{SetResourceName} eq '1' and $name !~ m{/#})
+        {
+            $val = substr($$dataPt, $pos, $size) . '/#' . $name . '#/';
+        }
+        $exifTool->HandleTag($ttPtr, $tag, $val,
+            TagInfo => $tagInfo,
+            Extra   => $extra,
+            DataPt  => $dataPt,
+            DataPos => $$dirInfo{DataPos},
+            Size    => $size,
+            Start   => $pos,
+            Parent  => $$dirInfo{DirName},
+        );
+        $size += 1 if $size & 0x01; # size is padded to an even # bytes
+        $pos += $size;
+    }
+    return $success;
+}
+
+#------------------------------------------------------------------------------
+# extract information from Photoshop PSD file
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 if this was a valid PSD file, -1 on write error
+sub ProcessPSD($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my $outfile = $$dirInfo{OutFile};
+    my ($data, $err, $tagTablePtr);
+
+    $raf->Read($data, 30) == 30 or return 0;
+    $data =~ /^8BPS\0([\x01\x02])/ or return 0;
+    SetByteOrder('MM');
+    $exifTool->SetFileType($1 eq "\x01" ? 'PSD' : 'PSB'); # set the FileType tag
+    my %dirInfo = (
+        DataPt => \$data,
+        DirStart => 0,
+        DirName => 'Photoshop',
+    );
+    my $len = Get32u(\$data, 26);
+    if ($outfile) {
+        Write($outfile, $data) or $err = 1;
+        $raf->Read($data, $len) == $len or return -1;
+        Write($outfile, $data) or $err = 1; # write color mode data
+        # initialize map of where things are written
+        $exifTool->InitWriteDirs(\%psdMap);
+    } else {
+        # process the header
+        $tagTablePtr = GetTagTable('Image::ExifTool::Photoshop::Header');
+        $dirInfo{DirLen} = 30;
+        $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+        $raf->Seek($len, 1) or $err = 1;    # skip over color mode data
+    }
+    $raf->Read($data, 4) == 4 or $err = 1;
+    $len = Get32u(\$data, 0);
+    $raf->Read($data, $len) == $len or $err = 1;
+    $tagTablePtr = GetTagTable('Image::ExifTool::Photoshop::Main');
+    $dirInfo{DirLen} = $len;
+    my $rtnVal = 1;
+    if ($outfile) {
+        # rewrite IRB resources
+        $data = WritePhotoshop($exifTool, \%dirInfo, $tagTablePtr);
+        if ($data) {
+            $len = Set32u(length $data);
+            Write($outfile, $len, $data) or $err = 1;
+            # look for trailer and edit if necessary
+            my $trailInfo = Image::ExifTool::IdentifyTrailer($raf);
+            if ($trailInfo) {
+                my $tbuf = '';
+                $$trailInfo{OutFile} = \$tbuf;  # rewrite trailer(s)
+                # rewrite all trailers to buffer
+                if ($exifTool->ProcessTrailers($trailInfo)) {
+                    my $copyBytes = $$trailInfo{DataPos} - $raf->Tell();
+                    if ($copyBytes >= 0) {
+                        # copy remaining PSD file up to start of trailer
+                        while ($copyBytes) {
+                            my $n = ($copyBytes > 65536) ? 65536 : $copyBytes;
+                            $raf->Read($data, $n) == $n or $err = 1;
+                            Write($outfile, $data) or $err = 1;
+                            $copyBytes -= $n;
+                        }
+                        # write the trailer (or not)
+                        $exifTool->WriteTrailerBuffer($trailInfo, $outfile) or $err = 1;
+                    } else {
+                        $exifTool->Warn('Overlapping trailer');
+                        undef $trailInfo;
+                    }
+                } else {
+                    undef $trailInfo;
+                }
+            }
+            unless ($trailInfo) {
+                # copy over the rest of the file
+                while ($raf->Read($data, 65536)) {
+                    Write($outfile, $data) or $err = 1;
+                }
+            }
+        } else {
+            $err = 1;
+        }
+        $rtnVal = -1 if $err;
+    } elsif ($err) {
+        $exifTool->Warn('File format error');
+    } else {
+        ProcessPhotoshop($exifTool, \%dirInfo, $tagTablePtr);
+        # process trailers if they exist
+        my $trailInfo = Image::ExifTool::IdentifyTrailer($raf);
+        $exifTool->ProcessTrailers($trailInfo) if $trailInfo;
+    }
+    return $rtnVal;
+}
+
+1; # end
+
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Photoshop - Read/write Photoshop IRB meta information
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+Photoshop writes its own format of meta information called a Photoshop IRB
+resource which is located in the APP13 record of JPEG files.  This module
+contains the definitions to read this information.
+
+=head1 NOTES
+
+Photoshop IRB blocks may have an associated resource name.  These names are
+usually just an empty string, but if not empty they are displayed in the
+verbose level 2 (or greater) output.  A special C<SetResourceName> flag may
+be set to '1' in the tag information hash to cause the resource name to be
+appended to the value when extracted.  If this is done, the returned value
+has the form "VALUE/#NAME#/".  When writing, the writer routine looks for
+this syntax (if C<SetResourceName> is defined), and and uses the embedded
+name to set the name of the new resource.  This allows the resource names to
+be preserved when copying Photoshop information via user-defined tags.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.fine-view.com/jp/lab/doc/ps6ffspecsv2.pdf>
+
+=item L<http://www.ozhiker.com/electronics/pjmt/jpeg_info/irb_jpeg_qual.html>
+
+=item L<http://www.fileformat.info/format/psd/egff.htm>
+
+=item L<http://libpsd.graphest.com/files/Photoshop%20File%20Formats.pdf>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/Photoshop Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>,
+L<Image::MetaData::JPEG(3pm)|Image::MetaData::JPEG>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/PostScript.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/PostScript.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/PostScript.pm	(revision 24799)
@@ -0,0 +1,689 @@
+#------------------------------------------------------------------------------
+# File:         PostScript.pm
+#
+# Description:  Read PostScript meta information
+#
+# Revisions:    07/08/2005 - P. Harvey Created
+#
+# References:   1) http://partners.adobe.com/public/developer/en/ps/5002.EPSF_Spec.pdf
+#               2) http://partners.adobe.com/public/developer/en/ps/5001.DSC_Spec.pdf
+#               3) http://partners.adobe.com/public/developer/en/illustrator/sdk/AI7FileFormat.pdf
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::PostScript;
+
+use strict;
+use vars qw($VERSION $AUTOLOAD);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.33';
+
+sub WritePS($$);
+sub ProcessPS($$;$);
+
+# PostScript tag table
+%Image::ExifTool::PostScript::Main = (
+    PROCESS_PROC => \&ProcessPS,
+    WRITE_PROC => \&WritePS,
+    PREFERRED => 1, # always add these tags when writing
+    GROUPS => { 2 => 'Image' },
+    # Note: Make all of these tags priority 0 since the first one found at
+    # the start of the file should take priority (in case multiples exist)
+    Author      => { Priority => 0, Groups => { 2 => 'Author' }, Writable => 'string' },
+    BoundingBox => { Priority => 0 },
+    Copyright   => { Priority => 0, Writable => 'string' }, #2
+    CreationDate => {
+        Name => 'CreateDate',
+        Priority => 0,
+        Groups => { 2 => 'Time' },
+        Writable => 'string',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    Creator     => { Priority => 0, Writable => 'string' },
+    ImageData   => { Priority => 0 },
+    For         => { Priority => 0, Writable => 'string', Notes => 'for whom the document was prepared'},
+    Keywords    => { Priority => 0, Writable => 'string' },
+    ModDate => {
+        Name => 'ModifyDate',
+        Priority => 0,
+        Groups => { 2 => 'Time' },
+        Writable => 'string',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    Pages       => { Priority => 0 },
+    Routing     => { Priority => 0, Writable => 'string' }, #2
+    Subject     => { Priority => 0, Writable => 'string' },
+    Title       => { Priority => 0, Writable => 'string' },
+    Version     => { Priority => 0, Writable => 'string' }, #2
+    # these subdirectories for documentation only
+    BeginPhotoshop => {
+        Name => 'PhotoshopData',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Photoshop::Main',
+        },
+    },
+    BeginICCProfile => {
+        Name => 'ICC_Profile',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::ICC_Profile::Main',
+        },
+    },
+    begin_xml_packet => {
+        Name => 'XMP',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::XMP::Main',
+        },
+    },
+    TIFFPreview => {
+        Binary => 1,
+        Notes => q{
+            not a real tag ID, but used to represent the TIFF preview extracted from DOS
+            EPS images
+        },
+    },
+    BeginDocument => {
+        Name => 'EmbeddedFile',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::PostScript::Main',
+        },
+        Notes => 'extracted with ExtractEmbedded option',
+    },
+    EmbeddedFileName => {
+        Notes => q{
+            not a real tag ID, but the file name from a BeginDocument statement.
+            Extracted with document metadata when ExtractEmbedded option is used
+        },
+    },
+);
+
+# composite tags
+%Image::ExifTool::PostScript::Composite = (
+    GROUPS => { 2 => 'Image' },
+    # BoundingBox is in points, not pixels,
+    # but use it anyway if ImageData is not available
+    ImageWidth => {
+        Desire => {
+            0 => 'Main:PostScript:ImageData',
+            1 => 'PostScript:BoundingBox',
+        },
+        ValueConv => 'Image::ExifTool::PostScript::ImageSize(\@val, 0)',
+    },
+    ImageHeight => {
+        Desire => {
+            0 => 'Main:PostScript:ImageData',
+            1 => 'PostScript:BoundingBox',
+        },
+        ValueConv => 'Image::ExifTool::PostScript::ImageSize(\@val, 1)',
+    },
+);
+
+# add our composite tags
+Image::ExifTool::AddCompositeTags('Image::ExifTool::PostScript');
+
+#------------------------------------------------------------------------------
+# AutoLoad our writer routines when necessary
+#
+sub AUTOLOAD
+{
+    return Image::ExifTool::DoAutoLoad($AUTOLOAD, @_);
+}
+
+#------------------------------------------------------------------------------
+# Is this a PC system
+# Returns: true for PC systems
+my %isPC = (MSWin32 => 1, os2 => 1, dos => 1, NetWare => 1, symbian => 1, cygwin => 1);
+sub IsPC()
+{
+    return $isPC{$^O};
+}
+
+#------------------------------------------------------------------------------
+# Get image width or height
+# Inputs: 0) value list ref (ImageData, BoundingBox), 1) true to get height
+sub ImageSize($$)
+{
+    my ($vals, $getHeight) = @_;
+    my ($w, $h);
+    if ($$vals[0] and $$vals[0] =~ /^(\d+) (\d+)/) {
+        ($w, $h) = ($1, $2);
+    } elsif ($$vals[1] and $$vals[1] =~ /^(\d+) (\d+) (\d+) (\d+)/) {
+        ($w, $h) = ($3 - $1, $4 - $2);
+    }
+    return $getHeight ? $h : $w;
+}
+
+#------------------------------------------------------------------------------
+# Set PostScript format error warning
+# Inputs: 0) ExifTool object reference, 1) error string
+# Returns: 1
+sub PSErr($$)
+{
+    my ($exifTool, $str) = @_;
+    # set file type if not done already
+    my $ext = $$exifTool{FILE_EXT};
+    $exifTool->SetFileType(($ext and $ext eq 'AI') ? 'AI' : 'PS');
+    $exifTool->Warn("PostScript format error ($str)");
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Return input record separator to use for the specified file
+# Inputs: 0) RAF reference
+# Returns: Input record separator or undef on error
+sub GetInputRecordSeparator($)
+{
+    my $raf = shift;
+    my $pos = $raf->Tell(); # save current position
+    my ($data, $sep);
+    $raf->Read($data,256) or return undef;
+    my ($a, $d) = (999,999);
+    $a = pos($data), pos($data) = 0 if $data =~ /\x0a/g;
+    $d = pos($data) if $data =~ /\x0d/g;
+    my $diff = $a - $d;
+    if ($diff eq 1) {
+        $sep = "\x0d\x0a";
+    } elsif ($diff eq -1) {
+        $sep = "\x0a\x0d";
+    } elsif ($diff > 0) {
+        $sep = "\x0d";
+    } elsif ($diff < 0) {
+        $sep = "\x0a";
+    } # else error
+    $raf->Seek($pos, 0);    # restore original position
+    return $sep;
+}
+
+#------------------------------------------------------------------------------
+# Decode comment from PostScript file
+# Inputs: 0) comment string, 1) RAF ref, 2) reference to lines array
+#         3) optional data reference for extra lines read from file
+# Returns: Decoded comment string (may be an array reference)
+# - handles multi-line comments and escape sequences
+sub DecodeComment($$$;$)
+{
+    my ($val, $raf, $lines, $dataPt) = @_;
+    $val =~ s/\x0d*\x0a*$//;        # remove trailing CR, LF or CR/LF
+    # check for continuation comments
+    for (;;) {
+        unless (@$lines) {
+            my $buff;
+            $raf->ReadLine($buff) or last;
+            my $altnl = $/ eq "\x0d" ? "\x0a" : "\x0d";
+            if ($buff =~ /$altnl/) {
+                # split into separate lines
+                @$lines = split /$altnl/, $buff, -1;
+                # handle case of DOS newline data inside file using Unix newlines
+                @$lines = ( $$lines[0] . $$lines[1] ) if @$lines == 2 and $$lines[1] eq $/;
+            } else {
+                push @$lines, $buff;
+            }
+        }
+        last unless $$lines[0] =~ /^%%\+/;  # is the next line a continuation?
+        $$dataPt .= $$lines[0] if $dataPt;  # add to data if necessary
+        $$lines[0] =~ s/\x0d*\x0a*$//;      # remove trailing CR, LF or CR/LF
+        $val .= substr(shift(@$lines), 3);  # add to value (without leading "%%+")
+    }
+    my @vals;
+    # handle bracketed string values
+    if ($val =~ s/^\((.*)\)$/$1/) { # remove brackets if necessary
+        # split into an array of strings if necessary
+        my $nesting = 1;
+        while ($val =~ /(\(|\))/g) {
+            my $bra = $1;
+            my $pos = pos($val) - 2;
+            my $backslashes = 0;
+            while ($pos and substr($val, $pos, 1) eq '\\') {
+                --$pos;
+                ++$backslashes;
+            }
+            next if $backslashes & 0x01;    # escaped if odd number
+            if ($bra eq '(') {
+                ++$nesting;
+            } else {
+                --$nesting;
+                unless ($nesting) {
+                    push @vals, substr($val, 0, pos($val)-1);
+                    $val = substr($val, pos($val));
+                    ++$nesting if $val =~ s/\s*\(//;
+                }
+            }
+        }
+        push @vals, $val;
+        foreach $val (@vals) {
+            # decode escape sequences in bracketed strings
+            # (similar to code in PDF.pm, but without line continuation)
+            while ($val =~ /\\(.)/sg) {
+                my $n = pos($val) - 2;
+                my $c = $1;
+                my $r;
+                if ($c =~ /[0-7]/) {
+                    # get up to 2 more octal digits
+                    $c .= $1 if $val =~ /\G([0-7]{1,2})/g;
+                    # convert octal escape code
+                    $r = chr(oct($c) & 0xff);
+                } else {
+                    # convert escaped characters
+                    ($r = $c) =~ tr/nrtbf/\n\r\t\b\f/;
+                }
+                substr($val, $n, length($c)+1) = $r;
+                # continue search after this character
+                pos($val) = $n + length($r);
+            }
+        }
+        $val = @vals > 1 ? \@vals : $vals[0];
+    }
+    return $val;
+}
+
+#------------------------------------------------------------------------------
+# Unescape PostScript string
+# Inputs: 0) string
+# Returns: unescaped string
+sub UnescapePostScript($)
+{
+    my $str = shift;
+    # decode escape sequences in literal strings
+    while ($str =~ /\\(.)/sg) {
+        my $n = pos($str) - 2;
+        my $c = $1;
+        my $r;
+        if ($c =~ /[0-7]/) {
+            # get up to 2 more octal digits
+            $c .= $1 if $str =~ /\G([0-7]{1,2})/g;
+            # convert octal escape code
+            $r = chr(oct($c) & 0xff);
+        } elsif ($c eq "\x0d") {
+            # the string is continued if the line ends with '\'
+            # (also remove "\x0d\x0a")
+            $c .= $1 if $str =~ /\G(\x0a)/g;
+            $r = '';
+        } elsif ($c eq "\x0a") {
+            $r = '';
+        } else {
+            # convert escaped characters
+            ($r = $c) =~ tr/nrtbf/\n\r\t\b\f/;
+        }
+        substr($str, $n, length($c)+1) = $r;
+        # continue search after this character
+        pos($str) = $n + length($r);
+    }
+    return $str;
+}
+
+#------------------------------------------------------------------------------
+# Extract information from EPS, PS or AI file
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference, 2) optional tag table ref
+# Returns: 1 if this was a valid PostScript file
+sub ProcessPS($$;$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $raf = $$dirInfo{RAF};
+    my $embedded = $exifTool->Options('ExtractEmbedded');
+    my ($data, $dos, $endDoc, $fontTable, $comment);
+
+    # allow read from data
+    $raf = new File::RandomAccess($$dirInfo{DataPt}) unless $raf;
+#
+# determine if this is a postscript file
+#
+    $raf->Read($data, 4) == 4 or return 0;
+    # accept either ASCII or DOS binary postscript file format
+    return 0 unless $data =~ /^(%!PS|%!Ad|%!Fo|\xc5\xd0\xd3\xc6)/;
+    if ($data =~ /^%!Ad/) {
+        # I've seen PS files start with "%!Adobe-PS"...
+        return 0 unless $raf->Read($data, 6) == 6 and $data eq "obe-PS";
+    } elsif ($data =~ /^\xc5\xd0\xd3\xc6/) {
+        # process DOS binary file header
+        # - save DOS header then seek ahead and check PS header
+        $raf->Read($dos, 26) == 26 or return 0;
+        SetByteOrder('II');
+        unless ($raf->Seek(Get32u(\$dos, 0), 0) and
+                $raf->Read($data, 4) == 4 and $data eq '%!PS')
+        {
+            return PSErr($exifTool, 'invalid header');
+        }
+    } else {
+        # check for PostScript font file (PFA or PFB)
+        my $d2;
+        $data .= $d2 if $raf->Read($d2,12);
+        if ($data =~ /^%!(PS-(AdobeFont-|Bitstream )|FontType1-)/) {
+            $exifTool->SetFileType('PFA');  # PostScript ASCII font file
+            $fontTable = GetTagTable('Image::ExifTool::Font::PSInfo');
+            # PostScript font files may contain an unformatted comments which may
+            # contain useful information, so accumulate these for the Comment tag
+            $comment = 1;
+        }
+        $raf->Seek(-length($data), 1);
+    }
+#
+# set the newline type based on the first newline found in the file
+#
+    local $/ = GetInputRecordSeparator($raf);
+    $/ or return PSErr($exifTool, 'invalid PS data');
+
+    # set file type (PostScript or EPS)
+    $raf->ReadLine($data) or $data = '';
+    my $type;
+    if ($data =~ /EPSF/) {
+        $type = 'EPS';
+    } else {
+        # read next line to see if this is an Illustrator file
+        my $line2;
+        my $pos = $raf->Tell();
+        if ($raf->ReadLine($line2) and $line2 =~ /^%%Creator: Adobe Illustrator/) {
+            $type = 'AI';
+        } else {
+            $type = 'PS';
+        }
+        $raf->Seek($pos, 0);
+    }
+    $exifTool->SetFileType($type);
+#
+# extract TIFF information from DOS header
+#
+    $tagTablePtr or $tagTablePtr = GetTagTable('Image::ExifTool::PostScript::Main');
+    if ($dos) {
+        my $base = Get32u(\$dos, 16);
+        if ($base) {
+            my $pos = $raf->Tell();
+            # extract the TIFF preview
+            my $len = Get32u(\$dos, 20);
+            my $val = $exifTool->ExtractBinary($base, $len, 'TIFFPreview');
+            if (defined $val and $val =~ /^(MM\0\x2a|II\x2a\0|Binary)/) {
+                $exifTool->HandleTag($tagTablePtr, 'TIFFPreview', $val);
+            } else {
+                $exifTool->Warn('Bad TIFF preview image');
+            }
+            # extract information from TIFF in DOS header
+            # (set Parent to '' to avoid setting FileType tag again)
+            my %dirInfo = (
+                Parent => '',
+                RAF => $raf,
+                Base => $base,
+            );
+            $exifTool->ProcessTIFF(\%dirInfo) or $exifTool->Warn('Bad embedded TIFF');
+            # position file pointer to extract PS information
+            $raf->Seek($pos, 0);
+        }
+    }
+#
+# parse the postscript
+#
+    my ($buff, $mode, $beginToken, $endToken, $docNum, $subDocNum, $changedNL);
+    my (@lines, $altnl);
+    if ($/ eq "\x0d") {
+        $altnl = "\x0a";
+    } else {
+        $/ = "\x0a";        # end on any LF (even if DOS CR+LF)
+        $altnl = "\x0d";
+    }
+    for (;;) {
+        if (@lines) {
+            $data = shift @lines;
+        } else {
+            $raf->ReadLine($data) or last;
+            # check for alternate newlines as efficiently as possible
+            if ($data =~ /$altnl/) {
+                if (length($data) > 500000 and IsPC()) {
+                    # Windows can't split very long lines due to poor memory handling,
+                    # so re-read the file with the other newline character instead
+                    # (slower but uses less memory)
+                    unless ($changedNL) {
+                        $changedNL = 1;
+                        my $t = $/;
+                        $/ = $altnl;
+                        $altnl = $t;
+                        $raf->Seek(-length($data), 1);
+                        next;
+                    }
+                } else {
+                    # split into separate lines
+                    @lines = split /$altnl/, $data, -1;
+                    $data = shift @lines;
+                    if (@lines == 1 and $lines[0] eq $/) {
+                        # handle case of DOS newline data inside file using Unix newlines
+                        $data .= $lines[0];
+                        undef @lines;
+                    }
+                }
+            }
+        }
+        undef $changedNL;
+        if ($mode) {
+            if (not $endToken) {
+                $buff .= $data;
+                next unless $data =~ m{<\?xpacket end=.(w|r).\?>($/|$)};
+            } elsif ($data !~ /^$endToken/i) {
+                if ($mode eq 'XMP') {
+                    $buff .= $data;
+                } elsif ($mode eq 'Document') {
+                    # ignore embedded documents, but keep track of nesting level
+                    $docNum .= '-1' if $data =~ /^$beginToken/;
+                } else {
+                    # data is ASCII-hex encoded
+                    $data =~ tr/0-9A-Fa-f//dc;  # remove all but hex characters
+                    $buff .= pack('H*', $data); # translate from hex
+                }
+                next;
+            } elsif ($mode eq 'Document') {
+                $docNum =~ s/-?\d+$//;  # decrement document nesting level
+                # done with Document mode if we are back at the top level
+                undef $mode unless $docNum;
+                next;
+            }
+        } elsif ($endDoc and $data =~ /^$endDoc/i) {
+            $docNum =~ s/-?(\d+)$//;        # decrement nesting level
+            $subDocNum = $1;                # remember our last sub-document number
+            $$exifTool{DOC_NUM} = $docNum;
+            undef $endDoc unless $docNum;   # done with document if top level
+            next;
+        } elsif ($data =~ /^(%{1,2})(Begin)(_xml_packet|Photoshop|ICCProfile|Document|Binary)/i) {
+            # the beginning of a data block
+            my %modeLookup = (
+                _xml_packet => 'XMP',
+                photoshop   => 'Photoshop',
+                iccprofile  => 'ICC_Profile',
+                document    => 'Document',
+                binary      => undef, # (we will try to skip this)
+            );
+            $mode = $modeLookup{lc $3};
+            unless ($mode) {
+                if (not @lines and $data =~ /^%{1,2}BeginBinary:\s*(\d+)/i) {
+                    $raf->Seek($1, 1) or last;  # skip binary data
+                }
+                next;
+            }
+            $buff = '';
+            $beginToken = $1 . $2 . $3;
+            $endToken = $1 . ($2 eq 'begin' ? 'end' : 'End') . $3;
+            if ($mode eq 'Document') {
+                # this is either the 1st sub-document or Nth document
+                if ($docNum) {
+                    # increase nesting level
+                    $docNum .= '-' . (++$subDocNum);
+                } else {
+                    # this is the Nth document
+                    $docNum = $$exifTool{DOC_COUNT} + 1;
+                }
+                $subDocNum = 0; # new level, so reset subDocNum
+                next unless $embedded;  # skip over this document
+                # set document number for family 4-7 group names
+                $$exifTool{DOC_NUM} = $docNum;
+                $$exifTool{LIST_TAGS} = { };  # don't build lists across different documents
+                $exifTool->{PROCESSED} = { }; # re-initialize processed directory lookup too
+                $endDoc = $endToken;          # parse to EndDocument token
+                # reset mode to allow parsing into sub-directories
+                undef $endToken;
+                undef $mode;
+                # save document name if available
+                if ($data =~ /^$beginToken:\s+([^\n\r]+)/i) {
+                    my $docName = $1;
+                    # remove brackets if necessary
+                    $docName = $1 if $docName =~ /^\((.*)\)$/;
+                    $exifTool->HandleTag($tagTablePtr, 'EmbeddedFileName', $docName);
+                }
+            }
+            next;
+        } elsif ($data =~ /^<\?xpacket begin=.{7,13}W5M0MpCehiHzreSzNTczkc9d/) {
+            # pick up any stray XMP data
+            $mode = 'XMP';
+            $buff = $data;
+            undef $endToken;    # no end token (just look for xpacket end)
+            # XMP could be contained in a single line (if newlines are different)
+            next unless $data =~ m{<\?xpacket end=.(w|r).\?>($/|$)};
+        } elsif ($data =~ /^%%?(\w+): ?(.*)/s and $$tagTablePtr{$1}) {
+            my ($tag, $val) = ($1, $2);
+            # only allow 'ImageData' to have single leading '%'
+            next unless $data =~ /^%%/ or $1 eq 'ImageData';
+            # decode comment string (reading continuation lines if necessary)
+            $val = DecodeComment($val, $raf, \@lines);
+            $exifTool->HandleTag($tagTablePtr, $tag, $val);
+            next;
+        } elsif ($embedded and $data =~ /^%AI12_CompressedData/) {
+            # the rest of the file is compressed
+            unless (eval 'require Compress::Zlib') {
+                $exifTool->Warn('Install Compress::Zlib to extract compressed embedded data');
+                last;
+            }
+            # seek back to find the start of the compressed data in the file
+            my $tlen = length($data) + @lines;
+            $tlen += length $_ foreach @lines;
+            my $backTo = $raf->Tell() - $tlen - 64;
+            $backTo = 0 if $backTo < 0;
+            last unless $raf->Seek($backTo, 0) and $raf->Read($data, 2048);
+            last unless $data =~ s/.*?%AI12_CompressedData//;
+            my $inflate = Compress::Zlib::inflateInit();
+            $inflate or $exifTool->Warn('Error initializing inflate'), last;
+            # generate a PS-like file in memory from the compressed data
+            my $verbose = $exifTool->Options('Verbose');
+            if ($verbose > 1) {
+                $exifTool->VerboseDir('AI12_CompressedData (first 4kB)');
+                $exifTool->VerboseDump(\$data);
+            }
+            # remove header if it exists (Windows AI files only)
+            $data =~ s/^.{0,256}EndData[\x0d\x0a]+//s;
+            my $val;
+            for (;;) {
+                my ($v2, $stat) = $inflate->inflate($data);
+                $stat == Compress::Zlib::Z_STREAM_END() and $val .= $v2, last;
+                $stat != Compress::Zlib::Z_OK() and undef($val), last;
+                if (defined $val) {
+                    $val .= $v2;
+                } elsif ($v2 =~ /^%!PS/) {
+                    $val = $v2;
+                } else {
+                    # add postscript header (for file recognition) if it doesn't exist
+                    $val = "%!PS-Adobe-3.0$/" . $v2;
+                }
+                $raf->Read($data, 65536) or last;
+            }
+            defined $val or $exifTool->Warn('Error inflating AI compressed data'), last;
+            if ($verbose > 1) {
+                $exifTool->VerboseDir('Uncompressed AI12 Data');
+                $exifTool->VerboseDump(\$val);
+            }
+            # extract information from embedded images in the uncompressed data
+            $val =  # add PS header in case it needs one
+            ProcessPS($exifTool, { DataPt => \$val });
+            last;
+        } elsif ($fontTable) {
+            if (defined $comment) {
+                # extract initial comments from PostScript Font files
+                if ($data =~ /^%\s+(.*?)[\x0d\x0a]/) {
+                    $comment .= "\n" if $comment;
+                    $comment .= $1;
+                    next;
+                } elsif ($data !~ /^%/) {
+                    # stop extracting comments at the first non-comment line
+                    $exifTool->FoundTag('Comment', $comment) if length $comment;
+                    undef $comment;
+                }
+            }
+            if ($data =~ m{^\s*/(\w+)\s*(.*)} and $$fontTable{$1}) {
+                my ($tag, $val) = ($1, $2);
+                if ($val =~ /^\((.*)\)/) {
+                    $val = UnescapePostScript($1);
+                } elsif ($val =~ m{/?(\S+)}) {
+                    $val = $1;
+                }
+                $exifTool->HandleTag($fontTable, $tag, $val);
+            } elsif ($data =~ /^currentdict end/) {
+                # only extract tags from initial FontInfo dict
+                undef $fontTable;
+            }
+            next;
+        } else {
+            next;
+        }
+        # extract information from buffered data
+        my %dirInfo = (
+            DataPt => \$buff,
+            DataLen => length $buff,
+            DirStart => 0,
+            DirLen => length $buff,
+            Parent => 'PostScript',
+        );
+        my $subTablePtr = GetTagTable("Image::ExifTool::${mode}::Main");
+        unless ($exifTool->ProcessDirectory(\%dirInfo, $subTablePtr)) {
+            $exifTool->Warn("Error processing $mode information in PostScript file");
+        }
+        undef $buff;
+        undef $mode;
+    }
+    $mode = 'Document' if $endDoc and not $mode;
+    $mode and PSErr($exifTool, "unterminated $mode data");
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Extract information from EPS file
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 if this was a valid PostScript file
+sub ProcessEPS($$)
+{
+    return ProcessPS($_[0],$_[1]);
+}
+
+1; # end
+
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::PostScript - Read PostScript meta information
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This code reads meta information from EPS (Encapsulated PostScript), PS
+(PostScript) and AI (Adobe Illustrator) files.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://partners.adobe.com/public/developer/en/ps/5002.EPSF_Spec.pdf>
+
+=item L<http://partners.adobe.com/public/developer/en/ps/5001.DSC_Spec.pdf>
+
+=item L<http://partners.adobe.com/public/developer/en/illustrator/sdk/AI7FileFormat.pdf>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/PostScript Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/PrintIM.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/PrintIM.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/PrintIM.pm	(revision 24799)
@@ -0,0 +1,125 @@
+#------------------------------------------------------------------------------
+# File:         PrintIM.pm
+#
+# Description:  Read PrintIM meta information
+#
+# Revisions:    04/07/2004  - P. Harvey Created
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::PrintIM;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess);
+
+$VERSION = '1.06';
+
+sub ProcessPrintIM($$$);
+
+# PrintIM table (proprietary specification by Epson)
+%Image::ExifTool::PrintIM::Main = (
+    PROCESS_PROC => \&ProcessPrintIM,
+    GROUPS => { 0 => 'PrintIM', 1 => 'PrintIM', 2 => 'Printing' },
+    PRINT_CONV => 'sprintf("0x%.8x", $val)',
+    TAG_PREFIX => 'PrintIM',
+    PrintIMVersion => { # values: 0100, 0250, 0260, 0300
+        Description => 'PrintIM Version',
+        PrintConv => undef,
+    },
+    # the following names are from http://www.kanzaki.com/ns/exif
+    # but the decoding is unknown:
+    # 9  => { Name => 'PIMContrast',     Unknown => 1 }, #1
+    # 10 => { Name => 'PIMBrightness',   Unknown => 1 }, #1
+    # 11 => { Name => 'PIMColorbalance', Unknown => 1 }, #1
+    # 12 => { Name => 'PIMSaturation',   Unknown => 1 }, #1
+    # 13 => { Name => 'PIMSharpness',    Unknown => 1 }, #1
+);
+
+
+#------------------------------------------------------------------------------
+# Process PrintIM IFD
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessPrintIM($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $offset = $$dirInfo{DirStart};
+    my $size = $$dirInfo{DirLen};
+    my $verbose = $exifTool->Options('Verbose');
+
+    unless ($size) {
+        $exifTool->Warn('Empty PrintIM data', 1);
+        return 0;
+    }
+    unless ($size > 15) {
+        $exifTool->Warn('Bad PrintIM data');
+        return 0;
+    }
+    unless (substr($$dataPt, $offset, 7) eq 'PrintIM') {
+        $exifTool->Warn('Invalid PrintIM header');
+        return 0;
+    }
+    # check size of PrintIM block
+    my $num = Get16u($dataPt, $offset + 14);
+    if ($size < 16 + $num * 6) {
+        # size is too big, maybe byte ordering is wrong
+        ToggleByteOrder();
+        $num = Get16u($dataPt, $offset + 14);
+        if ($size < 16 + $num * 6) {
+            $exifTool->Warn('Bad PrintIM size');
+            return 0;
+        }
+    }
+    $verbose and $exifTool->VerboseDir('PrintIM', $num);
+    $exifTool->HandleTag($tagTablePtr, 'PrintIMVersion', substr($$dataPt, $offset + 8, 4),
+        DataPt => $dataPt,
+        Start  => $offset + 8,
+        Size   => 4,
+    );
+    my $n;
+    for ($n=0; $n<$num; ++$n) {
+        my $pos = $offset + 16 + $n * 6;
+        my $tag = Get16u($dataPt, $pos);
+        my $val = Get32u($dataPt, $pos + 2);
+        $exifTool->HandleTag($tagTablePtr, $tag, $val,
+            Index  => $n,
+            DataPt => $dataPt,
+            Start  => $pos + 2,
+            Size   => 4,
+        );
+    }
+    return 1;
+}
+
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::PrintIM - Read PrintIM meta information
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to interpret
+Print Image Matching meta information.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/PrintIM Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/QuickTime.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/QuickTime.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/QuickTime.pm	(revision 24799)
@@ -0,0 +1,2714 @@
+#------------------------------------------------------------------------------
+# File:         QuickTime.pm
+#
+# Description:  Read QuickTime, MP4 and M4A meta information
+#
+# Revisions:    10/04/2005 - P. Harvey Created
+#               12/19/2005 - P. Harvey Added MP4 support
+#               09/22/2006 - P. Harvey Added M4A support
+#               07/27/2010 - P. Harvey Updated to 2010-05-03 QuickTime spec
+#
+# References:   1) http://developer.apple.com/mac/library/documentation/QuickTime/QTFF/QTFFChap1/qtff1.html
+#               2) http://search.cpan.org/dist/MP4-Info-1.04/
+#               3) http://www.geocities.com/xhelmboyx/quicktime/formats/mp4-layout.txt
+#               4) http://wiki.multimedia.cx/index.php?title=Apple_QuickTime
+#               5) ISO 14496-12 (http://neuron2.net/library/avc/c041828_ISO_IEC_14496-12_2005(E).pdf)
+#               6) ISO 14496-16 (http://www.iec-normen.de/previewpdf/info_isoiec14496-16%7Bed2.0%7Den.pdf)
+#               7) http://atomicparsley.sourceforge.net/mpeg-4files.html
+#               8) http://wiki.multimedia.cx/index.php?title=QuickTime_container
+#               9) http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart3.pdf (Oct 2008)
+#               10) http://code.google.com/p/mp4v2/wiki/iTunesMetadata
+#               11) http://www.canieti.com.mx/assets/files/1011/IEC_100_1384_DC.pdf
+#               12) QuickTime file format specification 2010-05-03
+#               13) http://www.adobe.com/devnet/flv/pdf/video_file_format_spec_v10.pdf
+#               14) http://standards.iso.org/ittf/PubliclyAvailableStandards/c051533_ISO_IEC_14496-12_2008.zip
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::QuickTime;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::Exif;
+
+$VERSION = '1.48';
+
+sub FixWrongFormat($);
+sub ProcessMOV($$;$);
+sub ProcessKeys($$$);
+sub ProcessMetaData($$$);
+sub ConvertISO6709($);
+sub PrintGPSCoordinates($);
+
+# information for time/date-based tags (time zero is Jan 1, 1904)
+my %timeInfo = (
+    # Note: This value will be in UTC if generated by a system that is aware of the time zone
+    ValueConv => 'ConvertUnixTime($val - ((66 * 365 + 17) * 24 * 3600))',
+    PrintConv => '$self->ConvertDateTime($val)',
+    # (can't put Groups here because they aren't constant!)
+);
+# information for duration tags
+my %durationInfo = (
+    ValueConv => '$$self{TimeScale} ? $val / $$self{TimeScale} : $val',
+    PrintConv => '$$self{TimeScale} ? ConvertDuration($val) : $val',
+);
+
+# 4-character Vendor ID codes (ref PH)
+my %vendorID = (
+    appl => 'Apple',
+    fe20 => 'Olympus (fe20)', # (FE200)
+    FFMP => 'FFmpeg',
+   'GIC '=> 'General Imaging Co.',
+    kdak => 'Kodak',
+    KMPI => 'Konica-Minolta',
+    mino => 'Minolta',
+    niko => 'Nikon',
+    NIKO => 'Nikon',
+    olym => 'Olympus',
+    pana => 'Panasonic',
+    pent => 'Pentax',
+    pr01 => 'Olympus (pr01)', # (FE100,FE110,FE115)
+    sany => 'Sanyo',
+   'SMI '=> 'Sorenson Media Inc.',
+    ZORA => 'Zoran Corporation',
+);
+
+# QuickTime data atom encodings for string types (ref 12)
+my %stringEncoding = (
+    1 => 'UTF8',
+    2 => 'UTF16',
+    3 => 'ShiftJIS',
+    4 => 'UTF8',
+    5 => 'UTF16',
+);
+
+# MIME types for all entries in the ftypLookup with file extensions
+# (defaults to 'video/mp4' if not found in this lookup)
+my %mimeLookup = (
+   '3G2' => 'video/3gpp2',
+   '3GP' => 'video/3gpp',
+    DVB  => 'video/vnd.dvb.file',
+    F4A  => 'audio/mp4',
+    F4B  => 'audio/mp4',
+    JP2  => 'image/jp2',
+    JPM  => 'image/jpm',
+    JPX  => 'image/jpx',
+    M4A  => 'audio/mp4',
+    M4B  => 'audio/mp4',
+    M4P  => 'audio/mp4',
+    M4V  => 'video/x-m4v',
+    MOV  => 'video/quicktime',
+    MQV  => 'video/quicktime',
+);
+
+my %graphicsMode = (
+    # (ref http://homepage.mac.com/vanhoek/MovieGuts%20docs/64.html)
+    0x00 => 'srcCopy',
+    0x01 => 'srcOr',
+    0x02 => 'srcXor',
+    0x03 => 'srcBic',
+    0x04 => 'notSrcCopy',
+    0x05 => 'notSrcOr',
+    0x06 => 'notSrcXor',
+    0x07 => 'notSrcBic',
+    0x08 => 'patCopy',
+    0x09 => 'patOr',
+    0x0a => 'patXor',
+    0x0b => 'patBic',
+    0x0c => 'notPatCopy',
+    0x0d => 'notPatOr',
+    0x0e => 'notPatXor',
+    0x0f => 'notPatBic',
+    0x20 => 'blend',
+    0x21 => 'addPin',
+    0x22 => 'addOver',
+    0x23 => 'subPin',
+    0x24 => 'transparent',
+    0x25 => 'addMax',
+    0x26 => 'subOver',
+    0x27 => 'addMin',
+    0x31 => 'grayishTextOr',
+    0x32 => 'hilite',
+    0x40 => 'ditherCopy',
+    # the following ref ISO/IEC 15444-3
+    0x100 => 'Alpha',
+    0x101 => 'White Alpha',
+    0x102 => 'Pre-multiplied Black Alpha',
+    0x110 => 'Component Alpha',
+);
+
+# look up file type from ftyp atom type, with MIME type in comment if known
+# (ref http://www.ftyps.com/)
+my %ftypLookup = (
+    '3g2a' => '3GPP2 Media (.3G2) compliant with 3GPP2 C.S0050-0 V1.0', # video/3gpp2
+    '3g2b' => '3GPP2 Media (.3G2) compliant with 3GPP2 C.S0050-A V1.0.0', # video/3gpp2
+    '3g2c' => '3GPP2 Media (.3G2) compliant with 3GPP2 C.S0050-B v1.0', # video/3gpp2
+    '3ge6' => '3GPP (.3GP) Release 6 MBMS Extended Presentations', # video/3gpp
+    '3ge7' => '3GPP (.3GP) Release 7 MBMS Extended Presentations', # video/3gpp
+    '3gg6' => '3GPP Release 6 General Profile', # video/3gpp
+    '3gp1' => '3GPP Media (.3GP) Release 1 (probably non-existent)', # video/3gpp
+    '3gp2' => '3GPP Media (.3GP) Release 2 (probably non-existent)', # video/3gpp
+    '3gp3' => '3GPP Media (.3GP) Release 3 (probably non-existent)', # video/3gpp
+    '3gp4' => '3GPP Media (.3GP) Release 4', # video/3gpp
+    '3gp5' => '3GPP Media (.3GP) Release 5', # video/3gpp
+    '3gp6' => '3GPP Media (.3GP) Release 6 Basic Profile', # video/3gpp
+    '3gp6' => '3GPP Media (.3GP) Release 6 Progressive Download', # video/3gpp
+    '3gp6' => '3GPP Media (.3GP) Release 6 Streaming Servers', # video/3gpp
+    '3gs7' => '3GPP Media (.3GP) Release 7 Streaming Servers', # video/3gpp
+    'avc1' => 'MP4 Base w/ AVC ext [ISO 14496-12:2005]', # video/mp4
+    'CAEP' => 'Canon Digital Camera',
+    'caqv' => 'Casio Digital Camera',
+    'CDes' => 'Convergent Design',
+    'da0a' => 'DMB MAF w/ MPEG Layer II aud, MOT slides, DLS, JPG/PNG/MNG images',
+    'da0b' => 'DMB MAF, extending DA0A, with 3GPP timed text, DID, TVA, REL, IPMP',
+    'da1a' => 'DMB MAF audio with ER-BSAC audio, JPG/PNG/MNG images',
+    'da1b' => 'DMB MAF, extending da1a, with 3GPP timed text, DID, TVA, REL, IPMP',
+    'da2a' => 'DMB MAF aud w/ HE-AAC v2 aud, MOT slides, DLS, JPG/PNG/MNG images',
+    'da2b' => 'DMB MAF, extending da2a, with 3GPP timed text, DID, TVA, REL, IPMP',
+    'da3a' => 'DMB MAF aud with HE-AAC aud, JPG/PNG/MNG images',
+    'da3b' => 'DMB MAF, extending da3a w/ BIFS, 3GPP timed text, DID, TVA, REL, IPMP',
+    'dmb1' => 'DMB MAF supporting all the components defined in the specification',
+    'dmpf' => 'Digital Media Project', # various
+    'drc1' => 'Dirac (wavelet compression), encapsulated in ISO base media (MP4)',
+    'dv1a' => 'DMB MAF vid w/ AVC vid, ER-BSAC aud, BIFS, JPG/PNG/MNG images, TS',
+    'dv1b' => 'DMB MAF, extending dv1a, with 3GPP timed text, DID, TVA, REL, IPMP',
+    'dv2a' => 'DMB MAF vid w/ AVC vid, HE-AAC v2 aud, BIFS, JPG/PNG/MNG images, TS',
+    'dv2b' => 'DMB MAF, extending dv2a, with 3GPP timed text, DID, TVA, REL, IPMP',
+    'dv3a' => 'DMB MAF vid w/ AVC vid, HE-AAC aud, BIFS, JPG/PNG/MNG images, TS',
+    'dv3b' => 'DMB MAF, extending dv3a, with 3GPP timed text, DID, TVA, REL, IPMP',
+    'dvr1' => 'DVB (.DVB) over RTP', # video/vnd.dvb.file
+    'dvt1' => 'DVB (.DVB) over MPEG-2 Transport Stream', # video/vnd.dvb.file
+    'F4A ' => 'Audio for Adobe Flash Player 9+ (.F4A)', # audio/mp4
+    'F4B ' => 'Audio Book for Adobe Flash Player 9+ (.F4B)', # audio/mp4
+    'F4P ' => 'Protected Video for Adobe Flash Player 9+ (.F4P)', # video/mp4
+    'F4V ' => 'Video for Adobe Flash Player 9+ (.F4V)', # video/mp4
+    'isc2' => 'ISMACryp 2.0 Encrypted File', # ?/enc-isoff-generic
+    'iso2' => 'MP4 Base Media v2 [ISO 14496-12:2005]', # video/mp4
+    'isom' => 'MP4  Base Media v1 [IS0 14496-12:2003]', # video/mp4
+    'JP2 ' => 'JPEG 2000 Image (.JP2) [ISO 15444-1 ?]', # image/jp2
+    'JP20' => 'Unknown, from GPAC samples (prob non-existent)',
+    'jpm ' => 'JPEG 2000 Compound Image (.JPM) [ISO 15444-6]', # image/jpm
+    'jpx ' => 'JPEG 2000 with extensions (.JPX) [ISO 15444-2]', # image/jpx
+    'KDDI' => '3GPP2 EZmovie for KDDI 3G cellphones', # video/3gpp2
+    'M4A ' => 'Apple iTunes AAC-LC (.M4A) Audio', # audio/x-m4a
+    'M4B ' => 'Apple iTunes AAC-LC (.M4B) Audio Book', # audio/mp4
+    'M4P ' => 'Apple iTunes AAC-LC (.M4P) AES Protected Audio', # audio/mp4
+    'M4V ' => 'Apple iTunes Video (.M4V) Video', # video/x-m4v
+    'M4VH' => 'Apple TV (.M4V)', # video/x-m4v
+    'M4VP' => 'Apple iPhone (.M4V)', # video/x-m4v
+    'mj2s' => 'Motion JPEG 2000 [ISO 15444-3] Simple Profile', # video/mj2
+    'mjp2' => 'Motion JPEG 2000 [ISO 15444-3] General Profile', # video/mj2
+    'mmp4' => 'MPEG-4/3GPP Mobile Profile (.MP4/3GP) (for NTT)', # video/mp4
+    'mp21' => 'MPEG-21 [ISO/IEC 21000-9]', # various
+    'mp41' => 'MP4 v1 [ISO 14496-1:ch13]', # video/mp4
+    'mp42' => 'MP4 v2 [ISO 14496-14]', # video/mp4
+    'mp71' => 'MP4 w/ MPEG-7 Metadata [per ISO 14496-12]', # various
+    'MPPI' => 'Photo Player, MAF [ISO/IEC 23000-3]', # various
+    'mqt ' => 'Sony / Mobile QuickTime (.MQV) US Patent 7,477,830 (Sony Corp)', # video/quicktime
+    'MSNV' => 'MPEG-4 (.MP4) for SonyPSP', # audio/mp4
+    'NDAS' => 'MP4 v2 [ISO 14496-14] Nero Digital AAC Audio', # audio/mp4
+    'NDSC' => 'MPEG-4 (.MP4) Nero Cinema Profile', # video/mp4
+    'NDSH' => 'MPEG-4 (.MP4) Nero HDTV Profile', # video/mp4
+    'NDSM' => 'MPEG-4 (.MP4) Nero Mobile Profile', # video/mp4
+    'NDSP' => 'MPEG-4 (.MP4) Nero Portable Profile', # video/mp4
+    'NDSS' => 'MPEG-4 (.MP4) Nero Standard Profile', # video/mp4
+    'NDXC' => 'H.264/MPEG-4 AVC (.MP4) Nero Cinema Profile', # video/mp4
+    'NDXH' => 'H.264/MPEG-4 AVC (.MP4) Nero HDTV Profile', # video/mp4
+    'NDXM' => 'H.264/MPEG-4 AVC (.MP4) Nero Mobile Profile', # video/mp4
+    'NDXP' => 'H.264/MPEG-4 AVC (.MP4) Nero Portable Profile', # video/mp4
+    'NDXS' => 'H.264/MPEG-4 AVC (.MP4) Nero Standard Profile', # video/mp4
+    'odcf' => 'OMA DCF DRM Format 2.0 (OMA-TS-DRM-DCF-V2_0-20060303-A)', # various
+    'opf2' => 'OMA PDCF DRM Format 2.1 (OMA-TS-DRM-DCF-V2_1-20070724-C)',
+    'opx2' => 'OMA PDCF DRM + XBS extensions (OMA-TS-DRM_XBS-V1_0-20070529-C)',
+    'pana' => 'Panasonic Digital Camera',
+    'qt  ' => 'Apple QuickTime (.MOV/QT)', # video/quicktime
+    'ROSS' => 'Ross Video',
+    'sdv ' => 'SD Memory Card Video', # various?
+    'ssc1' => 'Samsung stereoscopic, single stream',
+    'ssc2' => 'Samsung stereoscopic, dual stream',
+);
+
+# QuickTime atoms
+%Image::ExifTool::QuickTime::Main = (
+    PROCESS_PROC => \&ProcessMOV,
+    GROUPS => { 2 => 'Video' },
+    NOTES => q{
+        The QuickTime format is used for many different types of audio, video and
+        image files.  Exiftool extracts meta information from the UserData atom
+        (including some proprietary manufacturer-specific information), as well as
+        extracting various audio, video and image parameters.  Tags with a question
+        mark after their name are not extracted unless the Unknown option is set.
+    },
+    free => { Unknown => 1, Binary => 1 },
+    skip => { Unknown => 1, Binary => 1 },
+    wide => { Unknown => 1, Binary => 1 },
+    ftyp => { #MP4
+        Name => 'FileType',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::FileType' },
+    },
+    pnot => {
+        Name => 'Preview',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Preview' },
+    },
+    PICT => {
+        Name => 'PreviewPICT',
+        Binary => 1,
+    },
+    pict => { #8
+        Name => 'PreviewPICT',
+        Binary => 1,
+    },
+    moov => {
+        Name => 'Movie',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Movie' },
+    },
+    mdat => { Name => 'MovieData', Unknown => 1, Binary => 1 },
+    'mdat-size' => {
+        Name => 'MovieDataSize',
+        Notes => q{
+            not a real tag ID, this tag represents the size of the 'mdat' data in bytes
+            and is used in the AvgBitrate calculation
+        },
+    },
+    junk => { Unknown => 1, Binary => 1 }, #8
+    uuid => [
+        { #9 (MP4 files)
+            Name => 'UUID-XMP',
+            Condition => '$$valPt=~/^\xbe\x7a\xcf\xcb\x97\xa9\x42\xe8\x9c\x71\x99\x94\x91\xe3\xaf\xac/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::XMP::Main',
+                Start => 16,
+            },
+        },
+        { #11 (MP4 files)
+            Name => 'UUID-PROF',
+            Condition => '$$valPt=~/^PROF!\xd2\x4f\xce\xbb\x88\x69\x5c\xfa\xc9\xc7\x40/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::QuickTime::Profile',
+                Start => 24, # uid(16) + version(1) + flags(3) + count(4)
+            },
+        },
+        { #PH (Flip MP4 files)
+            Name => 'UUID-Flip',
+            Condition => '$$valPt=~/\x4a\xb0\x3b\x0f\x61\x8d\x40\x75\x82\xb2\xd9\xfa\xce\xd3\x5f\xf5/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::QuickTime::Flip',
+                Start => 16,
+            },
+        },
+        # "\x98\x7f\xa3\xdf\x2a\x85\x43\xc0\x8f\x8f\xd9\x7c\x47\x1e\x8e\xea" - unknown data in Flip videos
+        { #8
+            Name => 'UUID-Unknown',
+            Unknown => 1,
+            Binary => 1,
+        },
+    ],
+);
+
+# MPEG-4 'ftyp' atom
+# (ref http://developer.apple.com/mac/library/documentation/QuickTime/QTFF/QTFFChap1/qtff1.html)
+%Image::ExifTool::QuickTime::FileType = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Video' },
+    FORMAT => 'int32u',
+    0 => {
+        Name => 'MajorBrand',
+        Format => 'undef[4]',
+        PrintConv => \%ftypLookup,
+    },
+    1 => {
+        Name => 'MinorVersion',
+        Format => 'undef[4]',
+        ValueConv => 'sprintf("%x.%x.%x", unpack("nCC", $val))',
+    },
+    2 => {
+        Name => 'CompatibleBrands',
+        Format => 'undef[$size-8]',
+        # ignore any entry with a null, and return others as a list
+        ValueConv => 'my @a=($val=~/.{4}/sg); @a=grep(!/\0/,@a); \@a', 
+    },
+);
+
+# atoms used in QTIF files
+%Image::ExifTool::QuickTime::ImageFile = (
+    PROCESS_PROC => \&ProcessMOV,
+    GROUPS => { 2 => 'Image' },
+    NOTES => 'Tags used in QTIF QuickTime Image Files.',
+    idsc => {
+        Name => 'ImageDescription',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::ImageDesc' },
+    },
+    idat => {
+        Name => 'ImageData',
+        Binary => 1,
+    },
+    iicc => {
+        Name => 'ICC_Profile',
+        SubDirectory => { TagTable => 'Image::ExifTool::ICC_Profile::Main' },
+    },
+);
+
+# image description data block
+%Image::ExifTool::QuickTime::ImageDesc = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    FORMAT => 'int16u',
+    2 => {
+        Name => 'CompressorID',
+        Format => 'string[4]',
+# not very useful since this isn't a complete list and name is given below
+#        # ref http://developer.apple.com/mac/library/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html
+#        PrintConv => {
+#            cvid => 'Cinepak',
+#            jpeg => 'JPEG',
+#           'smc '=> 'Graphics',
+#           'rle '=> 'Animation',
+#            rpza => 'Apple Video',
+#            kpcd => 'Kodak Photo CD',
+#           'png '=> 'Portable Network Graphics',
+#            mjpa => 'Motion-JPEG (format A)',
+#            mjpb => 'Motion-JPEG (format B)',
+#            SVQ1 => 'Sorenson video, version 1',
+#            SVQ3 => 'Sorenson video, version 3',
+#            mp4v => 'MPEG-4 video',
+#           'dvc '=> 'NTSC DV-25 video',
+#            dvcp => 'PAL DV-25 video',
+#           'gif '=> 'Compuserve Graphics Interchange Format',
+#            h263 => 'H.263 video',
+#            tiff => 'Tagged Image File Format',
+#           'raw '=> 'Uncompressed RGB',
+#           '2vuY'=> "Uncompressed Y'CbCr, 3x8-bit 4:2:2 (2vuY)",
+#           'yuv2'=> "Uncompressed Y'CbCr, 3x8-bit 4:2:2 (yuv2)",
+#            v308 => "Uncompressed Y'CbCr, 8-bit 4:4:4",
+#            v408 => "Uncompressed Y'CbCr, 8-bit 4:4:4:4",
+#            v216 => "Uncompressed Y'CbCr, 10, 12, 14, or 16-bit 4:2:2",
+#            v410 => "Uncompressed Y'CbCr, 10-bit 4:4:4",
+#            v210 => "Uncompressed Y'CbCr, 10-bit 4:2:2",
+#        },
+    },
+    10 => {
+        Name => 'VendorID',
+        Format => 'string[4]',
+        RawConv => 'length $val ? $val : undef',
+        PrintConv => \%vendorID,
+        SeparateTable => 'VendorID',
+    },
+  # 14 - ("Quality" in QuickTime docs) ??
+    16 => 'SourceImageWidth',
+    17 => 'SourceImageHeight',
+    18 => { Name => 'XResolution',  Format => 'fixed32u' },
+    20 => { Name => 'YResolution',  Format => 'fixed32u' },
+  # 24 => 'FrameCount', # always 1 (what good is this?)
+    25 => {
+        Name => 'CompressorName',
+        Format => 'string[32]',
+        # (sometimes this is a Pascal string, and sometimes it is a C string)
+        RawConv => q{
+            $val=substr($val,1,ord($1)) if $val=~/^([\0-\x1f])/ and ord($1)<length($val);
+            length $val ? $val : undef;
+        },
+    },
+    41 => 'BitDepth',
+);
+
+# preview data block
+%Image::ExifTool::QuickTime::Preview = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Image' },
+    FORMAT => 'int16u',
+    0 => {
+        Name => 'PreviewDate',
+        Format => 'int32u',
+        Groups => { 2 => 'Time' },
+        %timeInfo,
+    },
+    2 => 'PreviewVersion',
+    3 => {
+        Name => 'PreviewAtomType',
+        Format => 'string[4]',
+    },
+    5 => 'PreviewAtomIndex',
+);
+
+# movie atoms
+%Image::ExifTool::QuickTime::Movie = (
+    PROCESS_PROC => \&ProcessMOV,
+    GROUPS => { 2 => 'Video' },
+    mvhd => {
+        Name => 'MovieHeader',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::MovieHeader' },
+    },
+    trak => {
+        Name => 'Track',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Track' },
+    },
+    udta => {
+        Name => 'UserData',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::UserData' },
+    },
+    meta => { # 'meta' is found here in my EX-F1 MOV sample - PH
+        Name => 'Meta',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Meta' },
+    },
+    iods => {
+        Name => 'InitialObjectDescriptor',
+        Flags => ['Binary','Unknown'],
+    },
+    uuid => [
+        { #11 (MP4 files) (also found in QuickTime::Track)
+            Name => 'UUID-USMT',
+            Condition => '$$valPt=~/^USMT!\xd2\x4f\xce\xbb\x88\x69\x5c\xfa\xc9\xc7\x40/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::QuickTime::UserMedia',
+                Start => 16,
+            },
+        },
+        {
+            Name => 'UUID-Unknown',
+            Unknown => 1,
+            Binary => 1,
+        },
+    ],
+    # prfl - Profile (ref 12)
+    # clip - clipping --> contains crgn (clip region) (ref 12)
+    # mvex - movie extends --> contains mehd (movie extends header), trex (track extends) (ref 14)
+);
+
+# movie header data block
+%Image::ExifTool::QuickTime::MovieHeader = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Video' },
+    FORMAT => 'int32u',
+    0 => {
+        Name => 'MovieHeaderVersion',
+        Format => 'int8u',
+        RawConv => '$$self{MovieHeaderVersion} = $val',
+    },
+    1 => {
+        Name => 'CreateDate',
+        Groups => { 2 => 'Time' },
+        %timeInfo,
+        # this is int64u if MovieHeaderVersion == 1 (ref 13)
+        Hook => '$$self{MovieHeaderVersion} and $format = "int64u", $varSize += 4',
+    },
+    2 => {
+        Name => 'ModifyDate',
+        Groups => { 2 => 'Time' },
+        %timeInfo,
+        # this is int64u if MovieHeaderVersion == 1 (ref 13)
+        Hook => '$$self{MovieHeaderVersion} and $format = "int64u", $varSize += 4',
+    },
+    3 => {
+        Name => 'TimeScale',
+        RawConv => '$$self{TimeScale} = $val',
+    },
+    4 => {
+        Name => 'Duration',
+        %durationInfo,
+        # this is int64u if MovieHeaderVersion == 1 (ref 13)
+        Hook => '$$self{MovieHeaderVersion} and $format = "int64u", $varSize += 4',
+    },
+    5 => {
+        Name => 'PreferredRate',
+        ValueConv => '$val / 0x10000',
+    },
+    6 => {
+        Name => 'PreferredVolume',
+        Format => 'int16u',
+        ValueConv => '$val / 256',
+        PrintConv => 'sprintf("%.2f%%", $val * 100)',
+    },
+    9 => {
+        Name => 'MatrixStructure',
+        Format => 'fixed32s[9]',
+        # (the right column is fixed 2.30 instead of 16.16)
+        ValueConv => q{
+            my @a = split ' ',$val;
+            $_ /= 0x4000 foreach @a[2,5,8];
+            return "@a";
+        },
+    },
+    18 => { Name => 'PreviewTime',      %durationInfo },
+    19 => { Name => 'PreviewDuration',  %durationInfo },
+    20 => { Name => 'PosterTime',       %durationInfo },
+    21 => { Name => 'SelectionTime',    %durationInfo },
+    22 => { Name => 'SelectionDuration',%durationInfo },
+    23 => { Name => 'CurrentTime',      %durationInfo },
+    24 => 'NextTrackID',
+);
+
+# track atoms
+%Image::ExifTool::QuickTime::Track = (
+    PROCESS_PROC => \&ProcessMOV,
+    GROUPS => { 2 => 'Video' },
+    tkhd => {
+        Name => 'TrackHeader',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::TrackHeader' },
+    },
+    udta => {
+        Name => 'UserData',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::UserData' },
+    },
+    mdia => { #MP4
+        Name => 'Media',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Media' },
+    },
+    meta => { #PH (MOV)
+        Name => 'Meta',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Meta' },
+    },
+    tref => {
+        Name => 'TrackRef',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::TrackRef' },
+    },
+    uuid => [
+        { #11 (MP4 files) (also found in QuickTime::Movie)
+            Name => 'UUID-USMT',
+            Condition => '$$valPt=~/^USMT!\xd2\x4f\xce\xbb\x88\x69\x5c\xfa\xc9\xc7\x40/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::QuickTime::UserMedia',
+                Start => 16,
+            },
+        },
+        {
+            Name => 'UUID-Unknown',
+            Unknown => 1,
+            Binary => 1,
+        },
+    ],
+    # edts - edits --> contains elst (edit list)
+    # tapt - TrackApertureModeDimensionsAID --> contains clef (TrackCleanApertureDimensionsAID),
+    #        prof (TrackProductionApertureDimensionsAID), enof (TrackEncodedPixelsDimensionsAID)
+    # clip - clipping --> contains crgn (clip region)
+    # matt - track matt --> contains kmat (compressed matt)
+    # load - track loading settings
+    # imap - track input map --> contains '  in' --> contains '  ty', obid
+    # prfl - Profile (ref 12)
+);
+
+# track header data block
+%Image::ExifTool::QuickTime::TrackHeader = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 1 => 'Track#', 2 => 'Video' },
+    FORMAT => 'int32u',
+    0 => {
+        Name => 'TrackHeaderVersion',
+        Format => 'int8u',
+        Priority => 0,
+        RawConv => '$$self{TrackHeaderVersion} = $val',
+    },
+    1 => {
+        Name => 'TrackCreateDate',
+        Priority => 0,
+        Groups => { 2 => 'Time' },
+        %timeInfo,
+        # this is int64u if TrackHeaderVersion == 1 (ref 13)
+        Hook => '$$self{TrackHeaderVersion} and $format = "int64u", $varSize += 4',
+    },
+    2 => {
+        Name => 'TrackModifyDate',
+        Priority => 0,
+        Groups => { 2 => 'Time' },
+        %timeInfo,
+        # this is int64u if TrackHeaderVersion == 1 (ref 13)
+        Hook => '$$self{TrackHeaderVersion} and $format = "int64u", $varSize += 4',
+    },
+    3 => {
+        Name => 'TrackID',
+        Priority => 0,
+    },
+    5 => {
+        Name => 'TrackDuration',
+        Priority => 0,
+        %durationInfo,
+        # this is int64u if TrackHeaderVersion == 1 (ref 13)
+        Hook => '$$self{TrackHeaderVersion} and $format = "int64u", $varSize += 4',
+    },
+    8 => {
+        Name => 'TrackLayer',
+        Format => 'int16u',
+        Priority => 0,
+    },
+    9 => {
+        Name => 'TrackVolume',
+        Format => 'int16u',
+        Priority => 0,
+        ValueConv => '$val / 256',
+        PrintConv => 'sprintf("%.2f%%", $val * 100)',
+    },
+    10 => {
+        Name => 'MatrixStructure',
+        Format => 'fixed32s[9]',
+        # (the right column is fixed 2.30 instead of 16.16)
+        ValueConv => q{
+            my @a = split ' ',$val;
+            $_ /= 0x4000 foreach @a[2,5,8];
+            return "@a";
+        },
+    },
+    19 => {
+        Name => 'ImageWidth',
+        Priority => 0,
+        RawConv => \&FixWrongFormat,
+    },
+    20 => {
+        Name => 'ImageHeight',
+        Priority => 0,
+        RawConv => \&FixWrongFormat,
+    },
+);
+
+# user data atoms
+%Image::ExifTool::QuickTime::UserData = (
+    PROCESS_PROC => \&ProcessMOV,
+    GROUPS => { 2 => 'Video' },
+    NOTES => q{
+        Tag ID's beginning with the copyright symbol (hex 0xa9) are multi-language
+        text.  Alternate language tags are accessed by adding a dash followed by the
+        language/country code to the tag name.  ExifTool will extract any
+        multi-language user data tags found, even if they don't exist in this table.
+    },
+    "\xa9cpy" => { Name => 'Copyright',  Groups => { 2 => 'Author' } },
+    "\xa9day" => {
+        Name => 'CreateDate',
+        Groups => { 2 => 'Time' },
+        # handle values in the form "2010-02-12T13:27:14-0800" (written by Apple iPhone)
+        ValueConv => q{
+            require Image::ExifTool::XMP;
+            $val =  Image::ExifTool::XMP::ConvertXMPDate($val);
+            $val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary
+            return $val;
+        },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    "\xa9ART" => 'Artist', #PH (iTunes 8.0.2)
+    "\xa9alb" => 'Album', #PH (iTunes 8.0.2)
+    "\xa9arg" => 'Arranger', #12
+    "\xa9ark" => 'ArrangerKeywords', #12
+    "\xa9cmt" => 'Comment', #PH (iTunes 8.0.2)
+    "\xa9cok" => 'ComposerKeywords', #12
+    "\xa9com" => 'Composer', #12
+    "\xa9dir" => 'Director', #12
+    "\xa9ed1" => 'Edit1',
+    "\xa9ed2" => 'Edit2',
+    "\xa9ed3" => 'Edit3',
+    "\xa9ed4" => 'Edit4',
+    "\xa9ed5" => 'Edit5',
+    "\xa9ed6" => 'Edit6',
+    "\xa9ed7" => 'Edit7',
+    "\xa9ed8" => 'Edit8',
+    "\xa9ed9" => 'Edit9',
+    "\xa9fmt" => 'Format',
+    "\xa9gen" => 'Genre', #PH (iTunes 8.0.2)
+    "\xa9grp" => 'Grouping', #PH (NC)
+    "\xa9inf" => 'Information',
+    "\xa9isr" => 'ISRCCode', #12
+    "\xa9lab" => 'RecordLabelName', #12
+    "\xa9lal" => 'RecordLabelURL', #12
+    "\xa9lyr" => 'Lyrics', #PH (NC)
+    "\xa9mak" => 'Make', #12
+    "\xa9mal" => 'MakerURL', #12
+    "\xa9mod" => 'Model', #PH
+    "\xa9nam" => 'Title', #12
+    "\xa9pdk" => 'ProducerKeywords', #12
+    "\xa9phg" => 'RecordingCopyright', #12
+    "\xa9prd" => 'Producer',
+    "\xa9prf" => 'Performers',
+    "\xa9prk" => 'PerformerKeywords', #12
+    "\xa9prl" => 'PerformerURL',
+    "\xa9dir" => 'Director', #12
+    "\xa9req" => 'Requirements',
+    "\xa9snk" => 'SubtitleKeywords', #12
+    "\xa9snm" => 'Subtitle', #12
+    "\xa9src" => 'SourceCredits', #12
+    "\xa9swf" => 'SongWriter', #12
+    "\xa9swk" => 'SongWriterKeywords', #12
+    "\xa9swr" => 'SoftwareVersion', #12
+    "\xa9too" => 'Encoder', #PH (NC)
+    "\xa9trk" => 'Track', #PH (NC)
+    "\xa9wrt" => 'Composer',
+    "\xa9xyz" => { #PH (iPhone 3GS)
+        Name => 'GPSCoordinates',
+        Groups => { 2 => 'Location' },
+        ValueConv => \&ConvertISO6709,
+        PrintConv => \&PrintGPSCoordinates,
+    },
+    name => 'Name',
+    WLOC => {
+        Name => 'WindowLocation',
+        Format => 'int16u',
+    },
+    LOOP => {
+        Name => 'LoopStyle',
+        Format => 'int32u',
+        PrintConv => {
+            1 => 'Normal',
+            2 => 'Palindromic',
+        },
+    },
+    SelO => {
+        Name => 'PlaySelection',
+        Format => 'int8u',
+    },
+    AllF => {
+        Name => 'PlayAllFrames',
+        Format => 'int8u',
+    },
+    meta => {
+        Name => 'Meta',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::QuickTime::Meta',
+            Start => 4, # must skip 4-byte version number header
+        },
+    },
+    DcMD => {
+        Name => 'DcMD',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::QuickTime::DcMD',
+        },
+    },
+   'ptv '=> {
+        Name => 'PrintToVideo',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Video' },
+    },
+   'hnti'=> {
+        Name => 'HintInfo',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::HintInfo' },
+    },
+   'hinf' => {
+        Name => 'HintTrackInfo',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::HintTrackInfo' },
+    },
+    TAGS => [ #PH
+        # these tags were initially discovered in a Pentax movie,
+        # but similar information is found in videos from other manufacturers
+        {
+            Name => 'KodakTags',
+            Condition => '$$valPt =~ /^EASTMAN KODAK COMPANY/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Kodak::MOV',
+                ByteOrder => 'LittleEndian',
+            },
+        },
+        {
+            Name => 'KonicaMinoltaTags',
+            Condition => '$$valPt =~ /^KONICA MINOLTA DIGITAL CAMERA/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Minolta::MOV1',
+                ByteOrder => 'LittleEndian',
+            },
+        },
+        {
+            Name => 'MinoltaTags',
+            Condition => '$$valPt =~ /^MINOLTA DIGITAL CAMERA/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Minolta::MOV2',
+                ByteOrder => 'LittleEndian',
+            },
+        },
+        {
+            Name => 'NikonTags',
+            Condition => '$$valPt =~ /^NIKON DIGITAL CAMERA\0/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Nikon::MOV',
+                ByteOrder => 'LittleEndian',
+            },
+        },
+        {
+            Name => 'OlympusTags1',
+            Condition => '$$valPt =~ /^OLYMPUS DIGITAL CAMERA\0.{9}\x01\0/s',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::MOV1',
+                ByteOrder => 'LittleEndian',
+            },
+        },
+        {
+            Name => 'OlympusTags2',
+            Condition => '$$valPt =~ /^OLYMPUS DIGITAL CAMERA(?!\0.{21}\x0a\0{3})/s',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::MOV2',
+                ByteOrder => 'LittleEndian',
+            },
+        },
+        {
+            Name => 'OlympusTags3',
+            Condition => '$$valPt =~ /^OLYMPUS DIGITAL CAMERA\0/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Olympus::MP4',
+                ByteOrder => 'LittleEndian',
+            },
+        },
+        {
+            Name => 'PentaxTags',
+            Condition => '$$valPt =~ /^PENTAX DIGITAL CAMERA\0/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Pentax::MOV',
+                ByteOrder => 'LittleEndian',
+            },
+        },
+        {
+            Name => 'SamsungTags',
+            Condition => '$$valPt =~ /^SAMSUNG DIGITAL CAMERA\0/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Samsung::MP4',
+                ByteOrder => 'LittleEndian',
+            },
+        },
+        {
+            Name => 'SanyoMOV',
+            Condition => q{
+                $$valPt =~ /^SANYO DIGITAL CAMERA\0/ and
+                $self->{VALUE}->{FileType} eq "MOV"
+            },
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Sanyo::MOV',
+                ByteOrder => 'LittleEndian',
+            },
+        },
+        {
+            Name => 'SanyoMP4',
+            Condition => q{
+                $$valPt =~ /^SANYO DIGITAL CAMERA\0/ and
+                $self->{VALUE}->{FileType} eq "MP4"
+            },
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Sanyo::MP4',
+                ByteOrder => 'LittleEndian',
+            },
+        },
+        {
+            Name => 'UnknownTags',
+            Unknown => 1,
+            Binary => 1
+        },
+    ],
+    NCDT => { #PH
+        Name => 'NikonNCDT',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Nikon::NCDT',
+            ProcessProc => \&ProcessMOV,
+        },
+    },
+    QVMI => { #PH
+        Name => 'CasioQVMI',
+        # Casio stores standard EXIF-format information in MOV videos (ie. EX-S880)
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Exif::Main',
+            DirName => 'IFD0',
+            Multi => 0, # (no NextIFD pointer)
+            Start => 10,
+            ByteOrder => 'BigEndian',
+        },
+    },
+    MMA0 => { #PH (DiMage 7Hi)
+        Name => 'MinoltaMMA0',
+        SubDirectory => { TagTable => 'Image::ExifTool::Minolta::MMA' },
+    },
+    MMA1 => { #PH (Dimage A2)
+        Name => 'MinoltaMMA1',
+        SubDirectory => { TagTable => 'Image::ExifTool::Minolta::MMA' },
+    },
+    XMP_ => { #PH (Adobe CS3 Bridge)
+        Name => 'XMP',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' },
+    },
+    vndr => 'Vendor', #PH (Samsung PL70)
+    SDLN => 'PlayMode', #PH (NC, Samsung ST80 "SEQ_PLAY")
+    # Canon tags
+    CNCV => 'CompressorVersion', #PH (5D Mark II)
+    CNMN => 'Model', #PH (EOS 550D)
+    CNFV => 'FirmwareVersion', #PH (EOS 550D)
+    CNTH => { #PH (PowerShot S95)
+        Name => 'CanonCNTH',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Canon::CNTH',
+            ProcessProc => \&ProcessMOV,
+        },
+    },
+    # CNDB - 2112 bytes (550D)
+    # CNDM - 4 bytes - 0xff,0xd8,0xff,0xd9 (S95)
+    INFO => {
+        Name => 'SamsungINFO',
+        SubDirectory => { TagTable => 'Image::ExifTool::Samsung::INFO' },
+    },
+    FFMV => { #PH (FinePix HS20EXR)
+        Name => 'FujiFilmFFMV',
+        SubDirectory => { TagTable => 'Image::ExifTool::FujiFilm::FFMV' },
+    },
+    MVTG => { #PH (FinePix HS20EXR)
+        Name => 'FujiFilmMVTG',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Exif::Main',
+            DirName => 'IFD0',
+            Start => 16,
+            Base => '$start',
+            ByteOrder => 'LittleEndian',
+        },
+    },
+);
+
+# User-specific media data atoms (ref 11)
+%Image::ExifTool::QuickTime::UserMedia = (
+    PROCESS_PROC => \&ProcessMOV,
+    GROUPS => { 2 => 'Video' },
+    MTDT => {
+        Name => 'MetaData',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::MetaData' },
+    },
+);
+
+# User-specific media data atoms (ref 11)
+%Image::ExifTool::QuickTime::MetaData = (
+    PROCESS_PROC => \&Image::ExifTool::QuickTime::ProcessMetaData,
+    GROUPS => { 2 => 'Video' },
+    TAG_PREFIX => 'MetaData',
+    0x01 => 'Title',
+    0x03 => {
+        Name => 'ProductionDate',
+        Groups => { 2 => 'Time' },
+        # translate from format "YYYY/mm/dd HH:MM:SS"
+        ValueConv => '$val=~tr{/}{:}; $val',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    0x04 => 'Software',
+    0x05 => 'Product',
+    0x0a => {
+        Name => 'TrackProperty',
+        RawConv => 'my @a=unpack("Nnn",$val); "@a"',
+        PrintConv => [
+            { 0 => 'No presentation', BITMASK => { 0 => 'Main track' } },
+            { 0 => 'No attributes',   BITMASK => { 15 => 'Read only' } },
+            '"Priority $val"',
+        ],
+    },
+    0x0b => {
+        Name => 'TimeZone',
+        Groups => { 2 => 'Time' },
+        RawConv => 'Get16s(\$val,0)',
+        PrintConv => 'TimeZoneString($val)',
+    },
+    0x0c => {
+        Name => 'ModifyDate',
+        Groups => { 2 => 'Time' },
+        # translate from format "YYYY/mm/dd HH:MM:SS"
+        ValueConv => '$val=~tr{/}{:}; $val',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+);
+
+# Profile atoms (ref 11)
+%Image::ExifTool::QuickTime::Profile = (
+    PROCESS_PROC => \&ProcessMOV,
+    GROUPS => { 2 => 'Video' },
+    FPRF => {
+        Name => 'FileGlobalProfile',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::FileProf' },
+    },
+    APRF => {
+        Name => 'AudioProfile',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::AudioProf' },
+    },
+    VPRF => {
+        Name => 'VideoProfile',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::VideoProf' },
+    },
+);
+
+# FPRF atom information (ref 11)
+%Image::ExifTool::QuickTime::FileProf = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Video' },
+    FORMAT => 'int32u',
+    0 => { Name => 'FileProfileVersion', Unknown => 1 }, # unknown = uninteresting
+    1 => {
+        Name => 'FileFunctionFlags',
+        PrintConv => { BITMASK => {
+            28 => 'Fragmented',
+            29 => 'Additional tracks',
+            30 => 'Edited', # (main AV track is edited)
+        }},
+    },
+    # 2 - reserved
+);
+
+# APRF atom information (ref 11)
+%Image::ExifTool::QuickTime::AudioProf = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Audio' },
+    FORMAT => 'int32u',
+    0 => { Name => 'AudioProfileVersion', Unknown => 1 },
+    1 => 'AudioTrackID',
+    2 => {
+        Name => 'AudioCodec',
+        Format => 'undef[4]',
+    },
+    3 => {
+        Name => 'AudioCodecInfo',
+        Unknown => 1,
+        PrintConv => 'sprintf("0x%.4x", $val)',
+    },
+    4 => {
+        Name => 'AudioAttributes',
+        PrintConv => { BITMASK => {
+            0 => 'Encrypted',
+            1 => 'Variable bitrate',
+            2 => 'Dual mono',
+        }},
+    },
+    5 => {
+        Name => 'AudioAvgBitrate',
+        ValueConv => '$val * 1000',
+        PrintConv => 'ConvertBitrate($val)',
+    },
+    6 => {
+        Name => 'AudioMaxBitrate',
+        ValueConv => '$val * 1000',
+        PrintConv => 'ConvertBitrate($val)',
+    },
+    7 => 'AudioSampleRate',
+    8 => 'AudioChannels',
+);
+
+# VPRF atom information (ref 11)
+%Image::ExifTool::QuickTime::VideoProf = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Video' },
+    FORMAT => 'int32u',
+    0 => { Name => 'VideoProfileVersion', Unknown => 1 },
+    1 => 'VideoTrackID',
+    2 => {
+        Name => 'VideoCodec',
+        Format => 'undef[4]',
+    },
+    3 => {
+        Name => 'VideoCodecInfo',
+        Unknown => 1,
+        PrintConv => 'sprintf("0x%.4x", $val)',
+    },
+    4 => {
+        Name => 'VideoAttributes',
+        PrintConv => { BITMASK => {
+            0 => 'Encrypted',
+            1 => 'Variable bitrate',
+            2 => 'Variable frame rate',
+            3 => 'Interlaced',
+        }},
+    },
+    5 => {
+        Name => 'VideoAvgBitrate',
+        ValueConv => '$val * 1000',
+        PrintConv => 'ConvertBitrate($val)',
+    },
+    6 => {
+        Name => 'VideoMaxBitrate',
+        ValueConv => '$val * 1000',
+        PrintConv => 'ConvertBitrate($val)',
+    },
+    7 => {
+        Name => 'VideoAvgFrameRate',
+        Format => 'fixed32u',
+        PrintConv => 'int($val * 1000 + 0.5) / 1000',
+    },
+    8 => {
+        Name => 'VideoMaxFrameRate',
+        Format => 'fixed32u',
+        PrintConv => 'int($val * 1000 + 0.5) / 1000',
+    },
+    9 => {
+        Name => 'VideoSize',
+        Format => 'int16u[2]',
+        PrintConv => '$val=~tr/ /x/; $val',
+    },
+    10 => {
+        Name => 'PixelAspectRatio',
+        Format => 'int16u[2]',
+        PrintConv => '$val=~tr/ /:/; $val',
+    },
+);
+
+# meta atoms
+%Image::ExifTool::QuickTime::Meta = (
+    PROCESS_PROC => \&ProcessMOV,
+    GROUPS => { 2 => 'Video' },
+    ilst => {
+        Name => 'ItemList',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::QuickTime::ItemList',
+            HasData => 1, # process atoms as containers with 'data' elements
+        },
+    },
+    # MP4 tags (ref 5)
+    hdlr => {
+        Name => 'Handler',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Handler' },
+    },
+    dinf => {
+        Name => 'DataInformation',
+        Flags => ['Binary','Unknown'],
+    },
+    ipmc => {
+        Name => 'IPMPControl',
+        Flags => ['Binary','Unknown'],
+    },
+    iloc => {
+        Name => 'ItemLocation',
+        Flags => ['Binary','Unknown'],
+    },
+    ipro => {
+        Name => 'ItemProtection',
+        Flags => ['Binary','Unknown'],
+    },
+    iinf => {
+        Name => 'ItemInformation',
+        Flags => ['Binary','Unknown'],
+    },
+   'xml ' => {
+        Name => 'XML',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' },
+    },
+   'keys' => {
+        Name => 'Keys',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Keys' },
+    },
+    bxml => {
+        Name => 'BinaryXML',
+        Flags => ['Binary','Unknown'],
+    },
+    pitm => {
+        Name => 'PrimaryItemReference',
+        Flags => ['Binary','Unknown'],
+    },
+    free => { #PH
+        Name => 'Free',
+        Flags => ['Binary','Unknown'],
+    },
+);
+
+# track reference atoms
+%Image::ExifTool::QuickTime::TrackRef = (
+    PROCESS_PROC => \&ProcessMOV,
+    GROUPS => { 2 => 'Video' },
+    chap => { Name => 'ChapterList', Format => 'int32u' },
+    # also: tmcd, sync, scpt, ssrc, iTunesInfo
+);
+
+# item list atoms
+# -> these atoms are unique, and contain one or more 'data' atoms
+%Image::ExifTool::QuickTime::ItemList = (
+    PROCESS_PROC => \&ProcessMOV,
+    GROUPS => { 2 => 'Audio' },
+    NOTES => q{
+        As well as these tags, the 'mdta' handler uses numerical tag ID's which are
+        added dynamically to this table after processing the Meta Keys information.
+    },
+    # in this table, binary 1 and 2-byte "data"-type tags are interpreted as
+    # int8u and int16u.  Multi-byte binary "data" tags are extracted as binary data
+    "\xa9ART" => 'Artist',
+    "\xa9alb" => 'Album',
+    "\xa9cmt" => 'Comment',
+    "\xa9com" => 'Composer',
+    "\xa9day" => { Name => 'Year', Groups => { 2 => 'Time' } },
+    "\xa9des" => 'Description', #4
+    "\xa9enc" => 'EncodedBy', #10
+    "\xa9gen" => 'Genre',
+    "\xa9grp" => 'Grouping',
+    "\xa9lyr" => 'Lyrics',
+    "\xa9nam" => 'Title',
+    # "\xa9st3" ? #10
+    "\xa9too" => 'Encoder',
+    "\xa9trk" => 'Track',
+    "\xa9wrt" => 'Composer',
+    '----' => {
+        Name => 'iTunesInfo',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::iTunesInfo' },
+    },
+    aART => 'AlbumArtist',
+    covr => 'CoverArt',
+    cpil => { #10
+        Name => 'Compilation',
+        PrintConv => { 0 => 'No', 1 => 'Yes' },
+    },
+    disk => {
+        Name => 'DiskNumber',
+        ValueConv => 'length($val) >= 6 ? join(" of ",unpack("x2nn",$val)) : \$val',
+    },
+    pgap => { #10
+        Name => 'PlayGap',
+        PrintConv => {
+            0 => 'Insert Gap',
+            1 => 'No Gap',
+        },
+    },
+    tmpo => {
+        Name => 'BeatsPerMinute',
+        Format => 'int16u', # marked as boolean but really int16u in my sample
+    },
+    trkn => {
+        Name => 'TrackNumber',
+        ValueConv => 'length($val) >= 6 ? join(" of ",unpack("x2nn",$val)) : \$val',
+    },
+#
+# Note: it is possible that the tags below are not being decoded properly
+# because I don't have samples to verify many of these - PH
+#
+    akID => { #10
+        Name => 'AppleStoreAccountType',
+        PrintConv => {
+            0 => 'iTunes',
+            1 => 'AOL',
+        },
+    },
+    albm => 'Album', #(ffmpeg source)
+    apID => 'AppleStoreAccount',
+    atID => { #10 (or TV series)
+        Name => 'AlbumTitleID',
+        Format => 'int32u',
+    },
+    auth => { Name => 'Author', Groups => { 2 => 'Author' } },
+    catg => 'Category', #7
+    cnID => { #10
+        Name => 'AppleStoreCatalogID',
+        Format => 'int32u',
+    },
+    cprt => { Name => 'Copyright', Groups => { 2 => 'Author' } },
+    dscp => 'Description',
+    desc => 'Description', #7
+    gnre => { #10
+        Name => 'Genre',
+        PrintConv => q{
+            return $val unless $val =~ /^\d+$/;
+            require Image::ExifTool::ID3;
+            Image::ExifTool::ID3::PrintGenre($val - 1); # note the "- 1"
+        },
+    },
+    egid => 'EpisodeGlobalUniqueID', #7
+    geID => { #10
+        Name => 'GenreID',
+        Format => 'int32u',
+        # 4005 = Kids
+        # 4010 = Teens
+    },
+    grup => 'Grouping', #10
+    hdvd => { #10
+        Name => 'HDVideo',
+        PrintConv => { 0 => 'No', 1 => 'Yes' },
+    },
+    keyw => 'Keyword', #7
+    ldes => 'LongDescription', #10
+    pcst => { #7
+        Name => 'Podcast',
+        PrintConv => { 0 => 'No', 1 => 'Yes' },
+    },
+    perf => 'Performer',
+    plID => { #10 (or TV season)
+        Name => 'PlayListID',
+        Format => 'int8u',  # actually int64u, but split it up
+    },
+    purd => 'PurchaseDate', #7
+    purl => 'PodcastURL', #7
+    rtng => { #10
+        Name => 'Rating',
+        PrintConv => {
+            0 => 'none',
+            2 => 'Clean',
+            4 => 'Explicit',
+        },
+    },
+    sfID => { #10
+        Name => 'AppleStoreCountry',
+        Format => 'int32u',
+        PrintConv => {
+            143460 => 'Australia',
+            143445 => 'Austria',
+            143446 => 'Belgium',
+            143455 => 'Canada',
+            143458 => 'Denmark',
+            143447 => 'Finland',
+            143442 => 'France',
+            143443 => 'Germany',
+            143448 => 'Greece',
+            143449 => 'Ireland',
+            143450 => 'Italy',
+            143462 => 'Japan',
+            143451 => 'Luxembourg',
+            143452 => 'Netherlands',
+            143461 => 'New Zealand',
+            143457 => 'Norway',
+            143453 => 'Portugal',
+            143454 => 'Spain',
+            143456 => 'Sweden',
+            143459 => 'Switzerland',
+            143444 => 'United Kingdom',
+            143441 => 'United States',
+        },
+    },
+    soaa => 'SortAlbumArtist', #10
+    soal => 'SortAlbum', #10
+    soar => 'SortArtist', #10
+    soco => 'SortComposer', #10
+    sonm => 'SortName', #10
+    sosn => 'SortShow', #10
+    stik => { #10
+        Name => 'MediaType',
+        PrintConv => { #(http://weblog.xanga.com/gryphondwb/615474010/iphone-ringtones---what-did-itunes-741-really-do.html)
+            0 => 'Movie',
+            1 => 'Normal (Music)',
+            2 => 'Audiobook',
+            5 => 'Whacked Bookmark',
+            6 => 'Music Video',
+            9 => 'Short Film',
+            10 => 'TV Show',
+            11 => 'Booklet',
+            14 => 'Ringtone',
+        },
+    },
+    titl => 'Title',
+    tven => 'TVEpisodeID', #7
+    tves => { #7/10
+        Name => 'TVEpisode',
+        Format => 'int32u',
+    },
+    tvnn => 'TVNetworkName', #7
+    tvsh => 'TVShow', #10
+    tvsn => { #7/10
+        Name => 'TVSeason',
+        Format => 'int32u',
+    },
+    yrrc => 'Year', #(ffmpeg source)
+);
+
+# item list keys (ref PH)
+%Image::ExifTool::QuickTime::Keys = (
+    PROCESS_PROC => \&Image::ExifTool::QuickTime::ProcessKeys,
+    NOTES => q{
+        This directory contains a list of key names which are used to decode
+        ItemList tags written by the "mdta" handler.  The prefix of
+        "com.apple.quicktime." has been removed from all TagID's below.
+    },
+    version     => 'Version',
+    album       => 'Album',
+    artist      => { },
+    artwork     => { },
+    author      => { Name => 'Author',      Groups => { 2 => 'Author' } },
+    comment     => { },
+    copyright   => { Name => 'Copyright',   Groups => { 2 => 'Author' } },
+    creationdate=> {
+        Name => 'CreationDate',
+        Groups => { 2 => 'Time' },
+        ValueConv => q{
+            require Image::ExifTool::XMP;
+            $val =  Image::ExifTool::XMP::ConvertXMPDate($val,1);
+            $val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary
+            return $val;
+        },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    description => { },
+    director    => { },
+    genre       => { },
+    information => { },
+    keywords    => { },
+    make        => { Name => 'Make',        Groups => { 2 => 'Camera' } },
+    model       => { Name => 'Model',       Groups => { 2 => 'Camera' } },
+    publisher   => { },
+    software    => { },
+    year        => { Groups => { 2 => 'Time' } },
+    'camera.identifier' => 'CameraIdentifier', # (iPhone 4)
+    'camera.framereadouttimeinmicroseconds' => { # (iPhone 4)
+        Name => 'FrameReadoutTime',
+        ValueConv => '$val * 1e-6',
+        PrintConv => '$val * 1e6 . " microseconds"',
+    },
+    'location.ISO6709' => {
+        Name => 'GPSCoordinates',
+        Groups => { 2 => 'Location' },
+        ValueConv => \&ConvertISO6709,
+        PrintConv => \&PrintGPSCoordinates,
+    },
+    'location.name' => { Name => 'LocationName', Groups => { 2 => 'Location' } },
+    'location.body' => { Name => 'LocationBody', Groups => { 2 => 'Location' } },
+    'location.note' => { Name => 'LocationNote', Groups => { 2 => 'Location' } },
+    'location.role' => {
+        Name => 'LocationRole',
+        Groups => { 2 => 'Location' },
+        PrintConv => {
+            0 => 'Shooting Location',
+            1 => 'Real Location',
+            2 => 'Fictional Location',
+        },
+    },
+    'location.date' => {
+        Name => 'LocationDate',
+        Groups => { 2 => 'Time' },
+        ValueConv => q{
+            require Image::ExifTool::XMP;
+            $val =  Image::ExifTool::XMP::ConvertXMPDate($val);
+            $val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary
+            return $val;
+        },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    'direction.facing' => { Name => 'CameraDirection', Groups => { 2 => 'Location' } },
+    'direction.motion' => { Name => 'CameraMotion', Groups => { 2 => 'Location' } },
+    'location.body' => { Name => 'LocationBody', Groups => { 2 => 'Location' } },
+    'player.version'                => 'PlayerVersion',
+    'player.movie.visual.brightness'=> 'Brightness',
+    'player.movie.visual.color'     => 'Color',
+    'player.movie.visual.tint'      => 'Tint',
+    'player.movie.visual.contrast'  => 'Contrast',
+    'player.movie.audio.gain'       => 'AudioGain',
+    'player.movie.audio.treble'     => 'Trebel',
+    'player.movie.audio.bass'       => 'Bass',
+    'player.movie.audio.balance'    => 'Balance',
+    'player.movie.audio.pitchshift' => 'PitchShift',
+    'player.movie.audio.mute' => {
+        Name => 'Mute',
+        Format => 'int8u',
+        PrintConv => { 0 => 'Off', 1 => 'On' },
+    },
+);
+
+# iTunes info ('----') atoms
+%Image::ExifTool::QuickTime::iTunesInfo = (
+    PROCESS_PROC => \&ProcessMOV,
+    GROUPS => { 2 => 'Audio' },
+    # 'mean'/'name'/'data' atoms form a triplet, but unfortunately
+    # I can't find any source for decoding 'data'.
+    # 'mean' is normally 'com.apple.iTunes'
+    # 'name' values: 'tool', 'iTunNORM' (volume normalization),
+    #   'iTunSMPB', 'iTunes_CDDB_IDs', 'iTunes_CDDB_TrackNumber'
+    mean => {
+        Name => 'Mean',
+        Unknown => 1,
+    },
+    name => {
+        Name => 'Name',
+        Unknown => 1,
+    },
+    data => {
+        Name => 'Data',
+        Flags => ['Binary','Unknown'],
+    },
+);
+
+# print to video data block
+%Image::ExifTool::QuickTime::Video = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Video' },
+    0 => {
+        Name => 'DisplaySize',
+        PrintConv => {
+            0 => 'Normal',
+            1 => 'Double Size',
+            2 => 'Half Size',
+            3 => 'Full Screen',
+            4 => 'Current Size',
+        },
+    },
+    6 => {
+        Name => 'SlideShow',
+        PrintConv => {
+            0 => 'No',
+            1 => 'Yes',
+        },
+    },
+);
+
+# 'hnti' atoms
+%Image::ExifTool::QuickTime::HintInfo = (
+    PROCESS_PROC => \&ProcessMOV,
+    GROUPS => { 2 => 'Video' },
+    'rtp ' => {
+        Name => 'RealtimeStreamingProtocol',
+        PrintConv => '$val=~s/^sdp /(SDP) /; $val',
+    },
+    'sdp ' => 'StreamingDataProtocol',
+);
+
+# 'hinf' atoms
+%Image::ExifTool::QuickTime::HintTrackInfo = (
+    PROCESS_PROC => \&ProcessMOV,
+    GROUPS => { 2 => 'Video' },
+    trpY => { Name => 'TotalBytes', Format => 'int64u' }, #(documented)
+    trpy => { Name => 'TotalBytes', Format => 'int64u' }, #(observed)
+    totl => { Name => 'TotalBytes', Format => 'int32u' },
+    nump => { Name => 'NumPackets', Format => 'int64u' },
+    npck => { Name => 'NumPackets', Format => 'int32u' },
+    tpyl => { Name => 'TotalBytesNoRTPHeaders', Format => 'int64u' },
+    tpaY => { Name => 'TotalBytesNoRTPHeaders', Format => 'int32u' }, #(documented)
+    tpay => { Name => 'TotalBytesNoRTPHeaders', Format => 'int32u' }, #(observed)
+    maxr => {
+        Name => 'MaxDataRate',
+        Format => 'int32u',
+        Count => 2,
+        PrintConv => 'my @a=split(" ",$val);sprintf("%d bytes in %.3f s",$a[1],$a[0]/1000)',
+    },
+    dmed => { Name => 'MediaTrackBytes',    Format => 'int64u' },
+    dimm => { Name => 'ImmediateDataBytes', Format => 'int64u' },
+    drep => { Name => 'RepeatedDataBytes',  Format => 'int64u' },
+    tmin => {
+        Name => 'MinTransmissionTime',
+        Format => 'int32u',
+        PrintConv => 'sprintf("%.3f s",$val/1000)',
+    },
+    tmax => {
+        Name => 'MaxTransmissionTime',
+        Format => 'int32u',
+        PrintConv => 'sprintf("%.3f s",$val/1000)',
+    },
+    pmax => { Name => 'LargestPacketSize',  Format => 'int32u' },
+    dmax => {
+        Name => 'LargestPacketDuration',
+        Format => 'int32u',
+        PrintConv => 'sprintf("%.3f s",$val/1000)',
+    },
+    payt => {
+        Name => 'PayloadType',
+        ValueConv => 'unpack("N",$val) . " " . substr($val, 5)',
+        PrintConv => '$val=~s/ /, /;$val',
+    },
+);
+
+# Kodak DcMD atoms (ref PH)
+%Image::ExifTool::QuickTime::DcMD = (
+    PROCESS_PROC => \&ProcessMOV,
+    GROUPS => { 2 => 'Video' },
+    NOTES => 'Metadata directory found in MOV videos from some Kodak cameras.',
+    Cmbo => {
+        Name => 'CameraByteOrder',
+        PrintConv => {
+            II => 'Little-endian (Intel, II)',
+            MM => 'Big-endian (Motorola, MM)',
+        },
+    },
+    DcME => {
+        Name => 'DcME',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::QuickTime::DcME',
+        },
+    },
+);
+
+# Kodak DcME atoms (ref PH)
+%Image::ExifTool::QuickTime::DcME = (
+    PROCESS_PROC => \&ProcessMOV,
+    GROUPS => { 2 => 'Video' },
+    # Mtmd = binary data ("00 00 00 00 00 00 00 01" x 3)
+    # Keyw = keywords? (six bytes all zero)
+    # Rate = 2 bytes "00 00"
+);
+
+# MP4 media box (ref 5)
+%Image::ExifTool::QuickTime::Media = (
+    PROCESS_PROC => \&ProcessMOV,
+    GROUPS => { 2 => 'Video' },
+    NOTES => 'MP4 media box.',
+    mdhd => {
+        Name => 'MediaHeader',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::MediaHeader' },
+    },
+    hdlr => {
+        Name => 'Handler',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Handler' },
+    },
+    minf => {
+        Name => 'MediaInfo',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::MediaInfo' },
+    },
+);
+
+# MP4 media header box (ref 5)
+%Image::ExifTool::QuickTime::MediaHeader = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Video' },
+    FORMAT => 'int32u',
+    0 => {
+        Name => 'MediaHeaderVersion',
+        RawConv => '$$self{MediaHeaderVersion} = $val',
+    },
+    1 => {
+        Name => 'MediaCreateDate',
+        Groups => { 2 => 'Time' },
+        %timeInfo,
+        # this is int64u if MediaHeaderVersion == 1 (ref 5/13)
+        Hook => '$$self{MediaHeaderVersion} and $format = "int64u", $varSize += 4',
+    },
+    2 => {
+        Name => 'MediaModifyDate',
+        Groups => { 2 => 'Time' },
+        %timeInfo,
+        # this is int64u if MediaHeaderVersion == 1 (ref 5/13)
+        Hook => '$$self{MediaHeaderVersion} and $format = "int64u", $varSize += 4',
+    },
+    3 => {
+        Name => 'MediaTimeScale',
+        RawConv => '$$self{MediaTS} = $val',
+    },
+    4 => {
+        Name => 'MediaDuration',
+        RawConv => '$$self{MediaTS} ? $val / $$self{MediaTS} : $val',
+        PrintConv => '$$self{MediaTS} ? ConvertDuration($val) : $val',
+        # this is int64u if MediaHeaderVersion == 1 (ref 5/13)
+        Hook => '$$self{MediaHeaderVersion} and $format = "int64u", $varSize += 4',
+    },
+    5 => {
+        Name => 'MediaLanguageCode',
+        Format => 'int16u',
+        RawConv => '$val ? $val : undef',
+        # allow both Macintosh (for MOV files) and ISO (for MP4 files) language codes
+        ValueConv => '$val < 0x400 ? $val : pack "C*", map { (($val>>$_)&0x1f)+0x60 } 10, 5, 0',
+        PrintConv => q{
+            return $val unless $val =~ /^\d+$/;
+            require Image::ExifTool::Font;
+            return $Image::ExifTool::Font::ttLang{Macintosh}{$val} || "Unknown ($val)";
+        },
+    },
+);
+
+# MP4 media information box (ref 5)
+%Image::ExifTool::QuickTime::MediaInfo = (
+    PROCESS_PROC => \&ProcessMOV,
+    GROUPS => { 2 => 'Video' },
+    NOTES => 'MP4 media info box.',
+    vmhd => {
+        Name => 'VideoHeader',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::VideoHeader' },
+    },
+    smhd => {
+        Name => 'AudioHeader',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::AudioHeader' },
+    },
+    hmhd => {
+        Name => 'HintHeader',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::HintHeader' },
+    },
+    nmhd => {
+        Name => 'NullMediaHeader',
+        Flags => ['Binary','Unknown'],
+    },
+    dinf => {
+        Name => 'DataInfo',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::DataInfo' },
+    },
+    gmhd => {
+        Name => 'GenMediaHeader',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::GenMediaHeader' },
+    },
+    hdlr => { #PH
+        Name => 'Handler',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Handler' },
+    },
+    stbl => {
+        Name => 'SampleTable',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::SampleTable' },
+    },
+);
+
+# MP4 video media header (ref 5)
+%Image::ExifTool::QuickTime::VideoHeader = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Video' },
+    NOTES => 'MP4 video media header.',
+    FORMAT => 'int16u',
+    2 => {
+        Name => 'GraphicsMode',
+        PrintHex => 1,
+        SeparateTable => 'GraphicsMode',
+        PrintConv => \%graphicsMode,
+    },
+    3 => { Name => 'OpColor', Format => 'int16u[3]' },
+);
+
+# MP4 audio media header (ref 5)
+%Image::ExifTool::QuickTime::AudioHeader = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Audio' },
+    NOTES => 'MP4 audio media header.',
+    FORMAT => 'int16u',
+    2 => { Name => 'Balance', Format => 'fixed16s' },
+);
+
+# MP4 hint media header (ref 5)
+%Image::ExifTool::QuickTime::HintHeader = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    NOTES => 'MP4 hint media header.',
+    FORMAT => 'int16u',
+    2 => 'MaxPDUSize',
+    3 => 'AvgPDUSize',
+    4 => { Name => 'MaxBitrate', Format => 'int32u', PrintConv => 'ConvertBitrate($val)' },
+    6 => { Name => 'AvgBitrate', Format => 'int32u', PrintConv => 'ConvertBitrate($val)' },
+);
+
+# MP4 sample table box (ref 5)
+%Image::ExifTool::QuickTime::SampleTable = (
+    PROCESS_PROC => \&ProcessMOV,
+    GROUPS => { 2 => 'Video' },
+    NOTES => 'MP4 sample table box.',
+    stsd => [
+        {
+            Name => 'AudioSampleDesc',
+            Condition => '$$self{HandlerType} and $$self{HandlerType} eq "soun"',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::QuickTime::AudioSampleDesc',
+                Start => 8, # skip version number and count
+            },
+        },{
+            Name => 'VideoSampleDesc',
+            Condition => '$$self{HandlerType} and $$self{HandlerType} eq "vide"',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::QuickTime::ImageDesc',
+                Start => 8, # skip version number and count
+            },
+        },{
+            Name => 'HintSampleDesc',
+            Condition => '$$self{HandlerType} and $$self{HandlerType} eq "hint"',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::QuickTime::HintSampleDesc',
+                Start => 8, # skip version number and count
+            },
+        },{
+            Name => 'OtherSampleDesc',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::QuickTime::OtherSampleDesc',
+                Start => 8, # skip version number and count
+            },
+        },
+        # (Note: "alis" HandlerType handled by the parent audio or video handler)
+    ],
+    stts => [ # decoding time-to-sample table
+        {
+            Name => 'VideoFrameRate',
+            Notes => 'average rate calculated from time-to-sample table for video media',
+            Condition => '$$self{HandlerType} and $$self{HandlerType} eq "vide"',
+            # (must be RawConv so appropriate MediaTS is used in calculation)
+            RawConv => 'Image::ExifTool::QuickTime::CalcSampleRate($self, \$val)',
+            PrintConv => 'int($val * 1000 + 0.5) / 1000',
+        },
+        {
+            Name => 'TimeToSampleTable',
+            Flags => ['Binary','Unknown'],
+        },
+    ],
+    ctts => {
+        Name => 'CompositionTimeToSample',
+        Flags => ['Binary','Unknown'],
+    },
+    stsc => {
+        Name => 'SampleToChunk',
+        Flags => ['Binary','Unknown'],
+    },
+    stsz => {
+        Name => 'SampleSizes',
+        Flags => ['Binary','Unknown'],
+    },
+    stz2 => {
+        Name => 'CompactSampleSizes',
+        Flags => ['Binary','Unknown'],
+    },
+    stco => {
+        Name => 'ChunkOffset',
+        Flags => ['Binary','Unknown'],
+    },
+    co64 => {
+        Name => 'ChunkOffset64',
+        Flags => ['Binary','Unknown'],
+    },
+    stss => {
+        Name => 'SyncSampleTable',
+        Flags => ['Binary','Unknown'],
+    },
+    stsh => {
+        Name => 'ShadowSyncSampleTable',
+        Flags => ['Binary','Unknown'],
+    },
+    padb => {
+        Name => 'SamplePaddingBits',
+        Flags => ['Binary','Unknown'],
+    },
+    stdp => {
+        Name => 'SampleDegradationPriority',
+        Flags => ['Binary','Unknown'],
+    },
+    sdtp => {
+        Name => 'IdependentAndDisposableSamples',
+        Flags => ['Binary','Unknown'],
+    },
+    sbgp => {
+        Name => 'SampleToGroup',
+        Flags => ['Binary','Unknown'],
+    },
+    sgpd => {
+        Name => 'SampleGroupDescription',
+        Flags => ['Binary','Unknown'],
+    },
+    subs => {
+        Name => 'Sub-sampleInformation',
+        Flags => ['Binary','Unknown'],
+    },
+    cslg => {
+        Name => 'CompositionToDecodeTimelineMapping',
+        Flags => ['Binary','Unknown'],
+    },
+);
+
+# MP4 audio sample description box (ref 5)
+%Image::ExifTool::QuickTime::AudioSampleDesc = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Audio' },
+    FORMAT => 'int16u',
+    NOTES => 'MP4 audio sample description.',
+    2  => {
+        Name => 'AudioFormat',
+        Format => 'undef[4]',
+        RawConv => q{
+            return undef unless $val =~ /^[\w ]{4}$/i;
+            # check for protected audio format
+            $self->OverrideFileType('M4P') if $val eq 'drms' and $$self{VALUE}{FileType} eq 'M4A';
+            return $val;
+        },
+    },
+    10 => { #PH
+        Name => 'AudioVendorID',
+        Format => 'undef[4]',
+        RawConv => '$val eq "\0\0\0\0" ? undef : $val',
+        PrintConv => \%vendorID,
+        SeparateTable => 'VendorID',
+    },
+    12 => 'AudioChannels',
+    13 => 'AudioBitsPerSample',
+    16 => { Name => 'AudioSampleRate', Format => 'fixed32u' },
+    28 => { #PH
+        Name => 'AudioFormat',
+        Format => 'undef[4]',
+        RawConv => '$val =~ /^[\w ]{4}$/i ? $val : undef',
+        Notes => 'in Casio MOV videos',
+    },
+);
+
+# MP4 hint sample description box (ref 5)
+%Image::ExifTool::QuickTime::HintSampleDesc = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    FORMAT => 'int16u',
+    NOTES => 'MP4 hint sample description.',
+    2 => { Name => 'HintFormat', Format => 'undef[4]' },
+);
+
+# MP4 generic sample description box
+%Image::ExifTool::QuickTime::OtherSampleDesc = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    FORMAT => 'int16u',
+    2 => { Name => 'OtherFormat', Format => 'undef[4]' },
+);
+
+# MP4 data information box (ref 5)
+%Image::ExifTool::QuickTime::DataInfo = (
+    PROCESS_PROC => \&ProcessMOV,
+    NOTES => 'MP4 data information box.',
+    dref => {
+        Name => 'DataRef',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::QuickTime::DataRef',
+            Start => 8,
+        },
+    },
+);
+
+# Generic media header
+%Image::ExifTool::QuickTime::GenMediaHeader = (
+    PROCESS_PROC => \&ProcessMOV,
+    gmin => {
+        Name => 'GenMediaInfo',
+        SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::GenMediaInfo' },
+    },
+    text => {
+        Name => 'Text',
+        Flags => ['Binary','Unknown'],
+    },
+);
+
+# Generic media info (ref http://sourceforge.jp/cvs/view/ntvrec/ntvrec/libqtime/gmin.h?view=co)
+%Image::ExifTool::QuickTime::GenMediaInfo = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Video' },
+    0  => 'GenMediaVersion',
+    1  => { Name => 'GenFlags',   Format => 'int8u[3]' },
+    4  => { Name => 'GenGraphicsMode',
+        Format => 'int16u',
+        PrintHex => 1,
+        SeparateTable => 'GraphicsMode',
+        PrintConv => \%graphicsMode,
+    },
+    6  => { Name => 'GenOpColor', Format => 'int16u[3]' },
+    12 => { Name => 'GenBalance', Format => 'fixed16s' },
+);
+
+# MP4 data reference box (ref 5)
+%Image::ExifTool::QuickTime::DataRef = (
+    PROCESS_PROC => \&ProcessMOV,
+    NOTES => 'MP4 data reference box.',
+    'url ' => {
+        Name => 'URL',
+        RawConv => q{
+            # ignore if self-contained (flags bit 0 set)
+            return undef if unpack("N",$val) & 0x01;
+            $_ = substr($val,4); s/\0.*//s; $_;
+        },
+    },
+    'urn ' => {
+        Name => 'URN',
+        RawConv => q{
+            return undef if unpack("N",$val) & 0x01;
+            $_ = substr($val,4); s/\0.*//s; $_;
+        },
+    },
+);
+
+# MP4 handler box (ref 5)
+%Image::ExifTool::QuickTime::Handler = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Video' },
+    4 => { #PH
+        Name => 'HandlerClass',
+        Format => 'undef[4]',
+        RawConv => '$val eq "\0\0\0\0" ? undef : $val',
+        PrintConv => {
+            mhlr => 'Media Handler',
+            dhlr => 'Data Handler',
+        },
+    },
+    8 => {
+        Name => 'HandlerType',
+        Format => 'undef[4]',
+        RawConv => '$$self{HandlerType} = $val unless $val eq "alis"; $val',
+        PrintConv => {
+            alis => 'Alias Data', #PH
+            crsm => 'Clock Reference', #3
+            hint => 'Hint Track',
+            ipsm => 'IPMP', #3
+            m7sm => 'MPEG-7 Stream', #3
+            mdir => 'Metadata', #3
+            mdta => 'Metadata Tags', #PH
+            mjsm => 'MPEG-J', #3
+            ocsm => 'Object Content', #3
+            odsm => 'Object Descriptor', #3
+            sdsm => 'Scene Description', #3
+            soun => 'Audio Track',
+            text => 'Text', #PH (but what type? subtitle?)
+           'url '=> 'URL', #3
+            vide => 'Video Track',
+        },
+    },
+    12 => { #PH
+        Name => 'HandlerVendorID',
+        Format => 'undef[4]',
+        RawConv => '$val eq "\0\0\0\0" ? undef : $val',
+        PrintConv => \%vendorID,
+        SeparateTable => 'VendorID',
+    },
+    24 => {
+        Name => 'HandlerDescription',
+        Format => 'string',
+        # (sometimes this is a Pascal string, and sometimes it is a C string)
+        RawConv => q{
+            $val=substr($val,1,ord($1)) if $val=~/^([\0-\x1f])/ and ord($1)<length($val);
+            length $val ? $val : undef;
+        },
+    },
+);
+
+# Flip uuid data (ref PH)
+%Image::ExifTool::QuickTime::Flip = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    FORMAT => 'int32u',
+    FIRST_ENTRY => 0,
+    NOTES => 'Found in MP4 files from Flip Video cameras.',
+    GROUPS => { 1 => 'MakerNotes', 2 => 'Image' },
+    1 => 'PreviewImageWidth',
+    2 => 'PreviewImageHeight',
+    13 => 'PreviewImageLength',
+    14 => { # (confirmed for FlipVideoMinoHD)
+        Name => 'SerialNumber',
+        Groups => { 2 => 'Camera' },
+        Format => 'string[16]',
+    },
+    28 => {
+        Name => 'PreviewImage',
+        Format => 'undef[$val{13}]',
+        RawConv => '$self->ValidateImage(\$val, $tag)',
+    },
+);
+
+# QuickTime composite tags
+%Image::ExifTool::QuickTime::Composite = (
+    GROUPS => { 2 => 'Video' },
+    Rotation => {
+        Require => {
+            0 => 'QuickTime:MatrixStructure',
+            1 => 'QuickTime:HandlerType',
+        },
+        ValueConv => 'Image::ExifTool::QuickTime::CalcRotation($self)',
+    },
+    AvgBitrate => {
+        Priority => 0,  # let QuickTime::AvgBitrate take priority
+        Require => {
+            0 => 'QuickTime::MovieDataSize',
+            1 => 'QuickTime::Duration',
+        },
+        RawConv => q{
+            return undef unless $val[1];
+            $val[1] /= $$self{TimeScale} if $$self{TimeScale};
+            return int($val[0] * 8 / $val[1] + 0.5);
+        },
+        PrintConv => 'ConvertBitrate($val)',
+    },
+    GPSLatitude => {
+        Require => 'QuickTime:GPSCoordinates',
+        Groups => { 2 => 'Location' },
+        ValueConv => 'my @c = split " ", $val; $c[0]',
+        PrintConv => q{
+            require Image::ExifTool::GPS;
+            Image::ExifTool::GPS::ToDMS($self, $val, 1, 'N');
+        },
+    },
+    GPSLongitude => {
+        Require => 'QuickTime:GPSCoordinates',
+        Groups => { 2 => 'Location' },
+        ValueConv => 'my @c = split " ", $val; $c[1]',
+        PrintConv => q{
+            require Image::ExifTool::GPS;
+            Image::ExifTool::GPS::ToDMS($self, $val, 1, 'E');
+        },
+    },
+    # split altitude into GPSAltitude/GPSAltitudeRef like EXIF and XMP
+    GPSAltitude => {
+        Require => 'QuickTime:GPSCoordinates',
+        Groups => { 2 => 'Location' },
+        Priority => 0, # (because it may not exist)
+        ValueConv => 'my @c = split " ", $val; defined $c[2] ? abs($c[2]) : undef',
+        PrintConv => '"$val m"',
+    },
+    GPSAltitudeRef  => {
+        Require => 'QuickTime:GPSCoordinates',
+        Groups => { 2 => 'Location' },
+        Priority => 0, # (because altitude information may not exist)
+        ValueConv => 'my @c = split " ", $val; defined $c[2] ? ($c[2] < 0 ? 1 : 0) : undef',
+        PrintConv => {
+            0 => 'Above Sea Level',
+            1 => 'Below Sea Level',
+        },
+    },
+);
+
+# add our composite tags
+Image::ExifTool::AddCompositeTags('Image::ExifTool::QuickTime');
+
+
+#------------------------------------------------------------------------------
+# Calculate rotation of video track
+# Inputs: 0) ExifTool object ref
+# Returns: rotation angle or undef
+sub CalcRotation($)
+{
+    my $exifTool = shift;
+    my $value = $$exifTool{VALUE};
+    my ($i, $track);
+    # get the video track family 1 group (ie. "Track1");
+    for ($i=0; ; ++$i) {
+        my $idx = $i ? " ($i)" : '';
+        my $tag = "HandlerType$idx";
+        last unless $$value{$tag};
+        next unless $$value{$tag} eq 'vide';
+        $track = $exifTool->GetGroup($tag, 1);
+        last;
+    }
+    return undef unless $track;
+    # get the video track matrix
+    for ($i=0; ; ++$i) {
+        my $idx = $i ? " ($i)" : '';
+        my $tag = "MatrixStructure$idx";
+        last unless $$value{$tag};
+        next unless $exifTool->GetGroup($tag, 1) eq $track;
+        my @a = split ' ', $$value{$tag};
+        return undef unless $a[0] or $a[1];
+        # calculate the rotation angle (assume uniform rotation)
+        my $angle = atan2($a[1], $a[0]) * 180 / 3.14159;
+        $angle += 360 if $angle < 0;
+        return int($angle * 1000 + 0.5) / 1000;
+    }
+    return undef;
+}
+
+#------------------------------------------------------------------------------
+# Determine the average sample rate from a time-to-sample table
+# Inputs: 0) ExifTool object ref, 1) time-to-sample table data ref
+# Returns: average sample rate (in Hz)
+sub CalcSampleRate($$)
+{
+    my ($exifTool, $valPt) = @_;
+    my @dat = unpack('N*', $$valPt);
+    my ($num, $dur) = (0, 0);
+    my $i;
+    for ($i=2; $i<@dat-1; $i+=2) {
+        $num += $dat[$i];               # total number of samples
+        $dur += $dat[$i] * $dat[$i+1];  # total sample duration
+    }
+    return undef unless $num and $dur and $$exifTool{MediaTS};
+    return $num * $$exifTool{MediaTS} / $dur;
+}
+
+#------------------------------------------------------------------------------
+# Fix incorrect format for ImageWidth/Height as written by Pentax
+sub FixWrongFormat($)
+{
+    my $val = shift;
+    return undef unless $val;
+    if ($val & 0xffff0000) {
+        $val = unpack('n',pack('N',$val));
+    }
+    return $val;
+}
+
+#------------------------------------------------------------------------------
+# Convert ISO 6709 string to standard lag/lon format
+# Inputs: 0) ISO 6709 string (lat, lon, and optional alt)
+# Returns: position in decimal degress with altitude if available
+# Notes: Wikipedia indicates altitude may be in feet -- how is this specified?
+sub ConvertISO6709($)
+{
+    my $val = shift;
+    if ($val =~ /^([-+]\d{2}(?:\.\d*)?)([-+]\d{3}(?:\.\d*)?)([-+]\d+)?/) {
+        $val = ($1 + 0) . ' ' . ($2 + 0);
+        $val .= ' ' . ($3 + 0) if $3;
+    } elsif ($val =~ /^([-+])(\d{2})(\d{2}(?:\.\d*)?)([-+])(\d{3})(\d{2}(?:\.\d*)?)([-+]\d+)?/) {
+        my $lat = $2 + $3 / 60;
+        $lat = -$lat if $1 eq '-';
+        my $lon = $5 + $6 / 60;
+        $lon = -$lon if $4 eq '-';
+        $val = "$lat $lon";
+        $val .= ' ' . ($7 + 0) if $7;
+    } elsif ($val =~ /^([-+])(\d{2})(\d{2})(\d{2}(?:\.\d*)?)([-+])(\d{3})(\d{2})(\d{2}(?:\.\d*)?)([-+]\d+)?/) {
+        my $lat = $2 + $3 / 60 + $4 / 3600;
+        $lat = -$lat if $1 eq '-';
+        my $lon = $6 + $7 / 60 + $8 / 3600;
+        $lon = -$lon if $5 eq '-';
+        $val = "$lat $lon";
+        $val .= ' ' . ($9 + 0) if $9;
+    }
+    return $val;
+}
+
+#------------------------------------------------------------------------------
+# Format GPSCoordinates for printing
+# Inputs: 0) string with numerical lat, lon and optional alt, separated by spaces
+#         1) ExifTool object reference
+# Returns: PrintConv value
+sub PrintGPSCoordinates($)
+{
+    my ($val, $exifTool) = @_;
+    require Image::ExifTool::GPS;
+    my @v = split ' ', $val;
+    my $prt = Image::ExifTool::GPS::ToDMS($exifTool, $v[0], 1, "N") . ', ' .
+              Image::ExifTool::GPS::ToDMS($exifTool, $v[1], 1, "E");
+    if (defined $v[2]) {
+        $prt .= ', ' . ($v[2] < 0 ? -$v[2] . ' m Below' : $v[2] . ' m Above') . ' Sea Level';
+    }
+    return $prt;
+}
+
+#------------------------------------------------------------------------------
+# Unpack packed ISO 639/T language code
+# Inputs: 0) packed language code (or undef)
+# Returns: language code, or undef for default language, or 'err' for format error
+sub UnpackLang($)
+{
+    my $lang = shift;
+    if ($lang) {
+        # language code is packed in 5-bit characters
+        $lang = pack "C*", map { (($lang>>$_)&0x1f)+0x60 } 10, 5, 0;
+        # validate language code
+        if ($lang =~ /^[a-z]+$/) {
+            # treat 'eng' or 'und' as the default language
+            undef $lang if $lang eq 'und' or $lang eq 'eng';
+        } else {
+            $lang = 'err';  # invalid language code
+        }
+    }
+    return $lang;
+}
+
+#------------------------------------------------------------------------------
+# Process MPEG-4 MTDT atom (ref 11)
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessMetaData($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dirLen = length $$dataPt;
+    my $verbose = $exifTool->Options('Verbose');
+    return 0 unless $dirLen >= 2;
+    my $count = Get16u($dataPt, 0);
+    $verbose and $exifTool->VerboseDir('MetaData', $count);
+    my $i;
+    my $pos = 2;
+    for ($i=0; $i<$count; ++$i) {
+        last if $pos + 10 > $dirLen;
+        my $size = Get16u($dataPt, $pos);
+        last if $size < 10 or $size + $pos > $dirLen;
+        my $tag  = Get32u($dataPt, $pos + 2);
+        my $lang = Get16u($dataPt, $pos + 6);
+        my $enc  = Get16u($dataPt, $pos + 8);
+        my $val  = substr($$dataPt, $pos + 10, $size);
+        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        if ($tagInfo) {
+            # convert language code to ASCII (ignore read-only bit)
+            $lang = UnpackLang($lang);
+            # handle alternate languages
+            if ($lang) {
+                my $langInfo = Image::ExifTool::GetLangInfo($tagInfo, $lang);
+                $tagInfo = $langInfo if $langInfo;
+            }
+            $verbose and $exifTool->VerboseInfo($tag, $tagInfo,
+                Value  => $val,
+                DataPt => $dataPt,
+                Start  => $pos + 10,
+                Size   => $size - 10,
+            );
+            # convert from UTF-16 BE if necessary
+            $val = $exifTool->Decode($val, 'UCS2') if $enc == 1;
+            if ($enc == 0 and $$tagInfo{Unknown}) {
+                # binary data
+                $exifTool->FoundTag($tagInfo, \$val);
+            } else {
+                $exifTool->FoundTag($tagInfo, $val);
+            }
+        }
+        $pos += $size;
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Process Meta keys and add tags to the ItemList table ('mdta' handler) (ref PH)
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessKeys($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dirLen = length $$dataPt;
+    my $out;
+    if ($exifTool->Options('Verbose')) {
+        $exifTool->VerboseDir('Keys');
+        $out = $exifTool->Options('TextOut');
+    }
+    my $pos = 8;
+    my $index = 1;
+    my $infoTable = GetTagTable('Image::ExifTool::QuickTime::ItemList');
+    my $userTable = GetTagTable('Image::ExifTool::QuickTime::UserData');
+    while ($pos < $dirLen - 4) {
+        my $len = unpack("x${pos}N", $$dataPt);
+        last if $len < 8 or $pos + $len > $dirLen;
+        delete $$tagTablePtr{$index};
+        my $ns  = substr($$dataPt, $pos + 4, 4);
+        my $tag = substr($$dataPt, $pos + 8, $len - 8);
+        $tag =~ s/\0.*//s; # truncate at null
+        if ($ns eq 'mdta') {
+            $tag =~ s/^com\.apple\.quicktime\.//;   # remove common apple quicktime domain
+        }
+        next unless $tag;
+        # (I have some samples where the tag is a reversed ItemList or UserData tag ID)
+        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        unless ($tagInfo) {
+            $tagInfo = $exifTool->GetTagInfo($infoTable, $tag);
+            unless ($tagInfo) {
+                $tagInfo = $exifTool->GetTagInfo($userTable, $tag);
+                if (not $tagInfo and $tag =~ /^\w{3}\xa9$/) {
+                    $tag = pack('N', unpack('V', $tag));
+                    $tagInfo = $exifTool->GetTagInfo($infoTable, $tag);
+                    $tagInfo or $tagInfo = $exifTool->GetTagInfo($userTable, $tag);
+                }
+            }
+        }
+        my $newInfo;
+        if ($tagInfo) {
+            $newInfo = {
+                Name      => $$tagInfo{Name},
+                Format    => $$tagInfo{Format},
+                ValueConv => $$tagInfo{ValueConv},
+                PrintConv => $$tagInfo{PrintConv},
+            };
+            my $groups = $$tagInfo{Groups};
+            $$newInfo{Groups} = { %$groups } if $groups;
+        } elsif ($tag =~ /^[-\w.]+$/) {
+            # create info for tags with reasonable id's
+            my $name = $tag;
+            $name =~ s/\.(.)/\U$1/g;
+            $newInfo = { Name => ucfirst($name) };
+        }
+        # substitute this tag in the ItemList table with the given index
+        delete $$infoTable{$index};
+        if ($newInfo) {
+            Image::ExifTool::AddTagToTable($infoTable, $index, $newInfo);
+            $out and printf $out "%sAdded ItemList Tag 0x%.4x = $tag\n", $exifTool->{INDENT}, $index;
+        }
+        $pos += $len;
+        ++$index;
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Process a QuickTime atom
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) optional tag table ref
+# Returns: 1 on success
+sub ProcessMOV($$;$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $raf = $$dirInfo{RAF};
+    my $dataPt = $$dirInfo{DataPt};
+    my $verbose = $exifTool->Options('Verbose');
+    my $dataPos = $$dirInfo{Base} || 0;
+    my ($buff, $tag, $size, $track);
+
+    # more convenient to package data as a RandomAccess file
+    $raf or $raf = new File::RandomAccess($dataPt);
+    # skip leading bytes if necessary
+    if ($$dirInfo{DirStart}) {
+        $raf->Seek($$dirInfo{DirStart}, 1) or return 0;
+        $dataPos += $$dirInfo{DirStart};
+    }
+    # read size/tag name atom header
+    $raf->Read($buff,8) == 8 or return 0;
+    $dataPos += 8;
+    $tagTablePtr or $tagTablePtr = GetTagTable('Image::ExifTool::QuickTime::Main');
+    ($size, $tag) = unpack('Na4', $buff);
+    if ($dataPt) {
+        $verbose and $exifTool->VerboseDir($$dirInfo{DirName});
+    } else {
+        # check on file type if called with a RAF
+        $$tagTablePtr{$tag} or return 0;
+        if ($tag eq 'ftyp') {
+            # read ahead 4 bytes to see what type of file this is
+            my $fileType;
+            if ($raf->Read($buff, 4) == 4) {
+                $raf->Seek(-4, 1);
+                # see if we know the extension for this file type
+                $fileType = $1 if $ftypLookup{$buff} and $ftypLookup{$buff} =~ /\(\.(\w+)/;
+            }
+            $fileType or $fileType = 'MP4'; # default to MP4
+            $exifTool->SetFileType($fileType, $mimeLookup{$fileType} || 'video/mp4');
+        } else {
+            $exifTool->SetFileType();       # MOV
+        }
+        SetByteOrder('MM');
+    }
+    for (;;) {
+        if ($size < 8) {
+            last if $size == 0;
+            $size == 1 or $exifTool->Warn('Invalid atom size'), last;
+            $raf->Read($buff, 8) == 8 or last;
+            $dataPos += 8;
+            my ($hi, $lo) = unpack('NN', $buff);
+            $size = $lo;
+            if ($hi or $lo > 0x7fffffff) {
+                if ($hi > 0x7fffffff) {
+                    $exifTool->Warn('Invalid atom size');
+                    last;
+                } elsif (not $exifTool->Options('LargeFileSupport')) {
+                    $exifTool->Warn('End of processing at large atom (LargeFileSupport not enabled)');
+                    last;
+                }
+            }
+            $size = $hi * 4294967296 + $lo;
+        }
+        $size -= 8;
+        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        # allow numerical tag ID's
+        unless ($tagInfo) {
+            my $num = unpack('N', $tag);
+            if ($$tagTablePtr{$num}) {
+                $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $num);
+                $tag = $num;
+            }
+        }
+        # generate tagInfo if Unknown option set
+        if (not defined $tagInfo and ($exifTool->{OPTIONS}->{Unknown} or
+            $verbose or $tag =~ /^\xa9/))
+        {
+            my $name = $tag;
+            my $n = ($name =~ s/([\x00-\x1f\x7f-\xff])/'x'.unpack('H*',$1)/eg);
+            # print in hex if tag is numerical
+            $name = sprintf('0x%.4x',unpack('N',$tag)) if $n > 2;
+            if ($name =~ /^xa9(.*)/) {
+                $tagInfo = {
+                    Name => "UserData_$1",
+                    Description => "User Data $1",
+                };
+            } else {
+                $tagInfo = {
+                    Name => "Unknown_$name",
+                    Description => "Unknown $name",
+                    Unknown => 1,
+                    Binary => 1,
+                };
+            }
+            Image::ExifTool::AddTagToTable($tagTablePtr, $tag, $tagInfo);
+        }
+        # save required tag sizes
+        $exifTool->HandleTag($tagTablePtr, "$tag-size", $size) if $$tagTablePtr{"$tag-size"};
+        # load values only if associated with a tag (or verbose) and < 16MB long
+        if ((defined $tagInfo or $verbose) and $size < 0x1000000) {
+            my $val;
+            unless ($raf->Read($val, $size) == $size) {
+                $exifTool->Warn("Truncated '$tag' data");
+                last;
+            }
+            # use value to get tag info if necessary
+            $tagInfo or $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag, \$val);
+            my $hasData = ($$dirInfo{HasData} and $val =~ /\0...data\0/s);
+            if ($verbose and not $hasData) {
+                $exifTool->VerboseInfo($tag, $tagInfo,
+                    Value => $val,
+                    DataPt => \$val,
+                    DataPos => $dataPos,
+                );
+            }
+            if ($tagInfo) {
+                my $subdir = $$tagInfo{SubDirectory};
+                if ($subdir) {
+                    my $start = $$subdir{Start} || 0;
+                    my ($base, $dPos) = ($dataPos, 0);
+                    if ($$subdir{Base}) {
+                        $dPos -= eval $$subdir{Base};
+                        $base -= $dPos;
+                    }
+                    my %dirInfo = (
+                        DataPt   => \$val,
+                        DataLen  => $size,
+                        DirStart => $start,
+                        DirLen   => $size - $start,
+                        DirName  => $$subdir{DirName} || $$tagInfo{Name},
+                        HasData  => $$subdir{HasData},
+                        Multi    => $$subdir{Multi},
+                        DataPos  => $dPos,
+                        # Base needed for IsOffset tags in binary data
+                        Base     => $base,
+                    );
+                    if ($$subdir{ByteOrder} and $$subdir{ByteOrder} =~ /^Little/) {
+                        SetByteOrder('II');
+                    }
+                    my $oldGroup1 = $exifTool->{SET_GROUP1};
+                    if ($$tagInfo{Name} eq 'Track') {
+                        $track or $track = 0;
+                        $exifTool->{SET_GROUP1} = 'Track' . (++$track);
+                    }
+                    my $subTable = GetTagTable($$subdir{TagTable});
+                    my $proc = $$subdir{ProcessProc};
+                    $exifTool->ProcessDirectory(\%dirInfo, $subTable, $proc) if $size > $start;
+                    $exifTool->{SET_GROUP1} = $oldGroup1;
+                    SetByteOrder('MM');
+                } elsif ($hasData) {
+                    # handle atoms containing 'data' tags
+                    # (currently ignore contained atoms: 'itif', 'name', etc.)
+                    my $pos = 0;
+                    for (;;) {
+                        last if $pos + 16 > $size;
+                        my ($len, $type, $flags, $ctry, $lang) = unpack("x${pos}Na4Nnn", $val);
+                        last if $pos + $len > $size;
+                        my $value;
+                        my $format = $$tagInfo{Format};
+                        if ($type eq 'data' and $len >= 16) {
+                            $pos += 16;
+                            $len -= 16;
+                            $value = substr($val, $pos, $len);
+                            # format flags (ref 12):
+                            # 0x0=binary, 0x1=UTF-8, 0x2=UTF-16, 0x3=ShiftJIS,
+                            # 0x4=UTF-8  0x5=UTF-16, 0xd=JPEG, 0xe=PNG,
+                            # 0x15=signed int, 0x16=unsigned int, 0x17=float,
+                            # 0x18=double, 0x1b=BMP, 0x1c='meta' atom
+                            if ($stringEncoding{$flags}) {
+                                # handle all string formats
+                                $value = $exifTool->Decode($value, $stringEncoding{$flags});
+                            } else {
+                                if (not $format) {
+                                    if ($flags == 0x15 or $flags == 0x16) {
+                                        $format = { 1=>'int8', 2=>'int16', 4=>'int32' }->{$len};
+                                        $format .= $flags == 0x15 ? 's' : 'u' if $format;
+                                    } elsif ($flags == 0x17) {
+                                        $format = 'float';
+                                    } elsif ($flags == 0x18) {
+                                        $format = 'double';
+                                    } elsif ($flags == 0x00) {
+                                        # read 1 and 2-byte binary as integers
+                                        if ($len == 1) {
+                                            $format = 'int8u',
+                                        } elsif ($len == 2) {
+                                            $format = 'int16u',
+                                        }
+                                    }
+                                }
+                                if ($format) {
+                                    $value = ReadValue(\$value, 0, $format, $$tagInfo{Count}, $len);
+                                } elsif (not $$tagInfo{ValueConv}) {
+                                    # make binary data a scalar reference unless a ValueConv exists
+                                    my $buf = $value;
+                                    $value = \$buf;
+                                }
+                            }
+                        }
+                        my $langInfo;
+                        if ($ctry or $lang) {
+                            # ignore country ('ctry') and language lists ('lang') for now
+                            undef $ctry if $ctry and $ctry <= 255;
+                            undef $lang if $lang and $lang <= 255;
+                            $lang = UnpackLang($lang);
+                            # add country code if specified
+                            if ($ctry) {
+                                $ctry = unpack('a2',pack('n',$ctry)); # unpack as ISO 3166-1
+                                # treat 'ZZ' like a default country (see ref 12)
+                                undef $ctry if $ctry eq 'ZZ';
+                                if ($ctry and $ctry =~ /^[A-Z]{2}$/) {
+                                    $lang or $lang = 'und';
+                                    $lang .= "-$ctry";
+                                }
+                            }
+                            $langInfo = Image::ExifTool::GetLangInfo($tagInfo, $lang) if $lang;
+                        }
+                        $langInfo or $langInfo = $tagInfo;
+                        $exifTool->VerboseInfo($tag, $langInfo,
+                            Value   => ref $value ? $$value : $value,
+                            DataPt  => \$val,
+                            DataPos => $dataPos,
+                            Start   => $pos,
+                            Size    => $len,
+                            Format  => $format,
+                            Extra   => sprintf(", Type='$type', Flags=0x%x",$flags)
+                        ) if $verbose;
+                        $exifTool->FoundTag($langInfo, $value) if defined $value;
+                        $pos += $len;
+                    }
+                } elsif ($tag =~ /^\xa9/) {
+                    # parse international text to extract all languages
+                    my $pos = 0;
+                    for (;;) {
+                        last if $pos + 4 > $size;
+                        my ($len, $lang) = unpack("x${pos}nn", $val);
+                        $pos += 4;
+                        # according to the QuickTime spec (ref 12), $len should include
+                        # 4 bytes for length and type words, but nobody (including
+                        # Apple, Pentax and Kodak) seems to add these in, so try
+                        # to allow for either
+                        if ($pos + $len > $size) {
+                            $len -= 4;
+                            last if $pos + $len > $size or $len < 0;
+                        }
+                        # ignore any empty entries (or null padding) after the first
+                        next if not $len and $pos;
+                        my $str = substr($val, $pos, $len);
+                        my $langInfo;
+                        if ($lang < 0x400) {
+                            # this is a Macintosh language code
+                            # a language code of 0 is Macintosh english, so treat as default
+                            if ($lang) { 
+                                # use Font.pm to look up language string
+                                require Image::ExifTool::Font;
+                                $lang = $Image::ExifTool::Font::ttLang{Macintosh}{$lang};
+                            }
+                            # the spec says only "Macintosh text encoding", so
+                            # I can only assume that it is the most common one
+                            $str = $exifTool->Decode($str, 'MacRoman');
+                        } else {
+                            # convert language code to ASCII (ignore read-only bit)
+                            $lang = UnpackLang($lang);
+                            # may be either UTF-8 or UTF-16BE
+                            my $enc = $str=~s/^\xfe\xff// ? 'UTF16' : 'UTF8';
+                            $str = $exifTool->Decode($str, $enc);
+                        }
+                        $langInfo = Image::ExifTool::GetLangInfo($tagInfo, $lang) if $lang;
+                        $exifTool->FoundTag($langInfo || $tagInfo, $str);
+                        $pos += $len;
+                    }
+                } else {
+                    if ($$tagInfo{Format}) {
+                        $val = ReadValue(\$val, 0, $$tagInfo{Format}, $$tagInfo{Count}, length($val));
+                    }
+                    $exifTool->FoundTag($tagInfo, $val);
+                }
+            }
+        } else {
+            $raf->Seek($size, 1) or $exifTool->Warn("Truncated '$tag' data"), last;
+        }
+        $raf->Read($buff, 8) == 8 or last;
+        $dataPos += $size + 8;
+        ($size, $tag) = unpack('Na4', $buff);
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Process a QuickTime Image File
+# Inputs: 0) ExifTool object reference, 1) directory information reference
+# Returns: 1 on success
+sub ProcessQTIF($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $table = GetTagTable('Image::ExifTool::QuickTime::ImageFile');
+    return ProcessMOV($exifTool, $dirInfo, $table);
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::QuickTime - Read QuickTime and MP4 meta information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains routines required by Image::ExifTool to extract
+information from QuickTime and MP4 video, and M4A audio files.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://developer.apple.com/mac/library/documentation/QuickTime/QTFF/QTFFChap1/qtff1.html>
+
+=item L<http://search.cpan.org/dist/MP4-Info-1.04/>
+
+=item L<http://www.geocities.com/xhelmboyx/quicktime/formats/mp4-layout.txt>
+
+=item L<http://wiki.multimedia.cx/index.php?title=Apple_QuickTime>
+
+=item L<http://atomicparsley.sourceforge.net/mpeg-4files.html>
+
+=item L<http://wiki.multimedia.cx/index.php?title=QuickTime_container>
+
+=item L<http://code.google.com/p/mp4v2/wiki/iTunesMetadata>
+
+=item L<http://www.canieti.com.mx/assets/files/1011/IEC_100_1384_DC.pdf>
+
+=item L<http://www.adobe.com/devnet/flv/pdf/video_file_format_spec_v10.pdf>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/QuickTime Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/README
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/README	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/README	(revision 24799)
@@ -0,0 +1,888 @@
+--------------------------------------------------------------------------------
+File:         Image/ExifTool/README
+
+Description:  ExifTool support modules documentation
+
+The ExifTool support modules are loaded by ExifTool to allow processing of
+various meta information formats.
+
+The tables in these files are used as lookups based on the tag ID values.  The
+hash keys are the tag IDs (in decimal or hexadecimal if the ID is numerical as
+with EXIF tables, or the tag name if the ID is ASCII as with XMP tables).  In
+the case of a BinaryData table, the IDs are numerical and specify offsets into
+the binary data block (floating point IDs allow multiple tags for the same
+offset, with the integer part being used for the offset).  The corresponding
+hash value provides information about the tag (explained later).
+
+Twenty-five special keys (TABLE_NAME, SHORT_NAME, PROCESS_PROC, WRITE_PROC,
+CHECK_PROC, GROUPS, FORMAT, FIRST_ENTRY, TAG_PREFIX, PRINT_CONV, WRITABLE,
+TABLE_DESC, NOTES, IS_OFFSET, IS_SUBDIR, EXTRACT_UNKNOWN, NAMESPACE, PREFERRED,
+SRC_TABLE, PRIORITY, WRITE_GROUP, LANG_INFO, VARS, DATAMEMBER and SET_GROUP1)
+are used to provide additional information about a table. The special keys have
+names that are all capitalized to avoid possible conflicts with tag keys.  Below
+is an explanation of the meaning of each special key:
+
+  TABLE_NAME : Name of this table (set by GetTagTable()).
+
+  SHORT_NAME : Table name with leading "Image::ExifTool::" removed.
+
+  PROCESS_PROC : Reference to a function used to process the directory for this
+  table.  If PROCESS_PROC is not given, \&Image::ExifTool::Exif::ProcessExif is
+  assumed.  If PROCESS_PROC is set to 0, the tags are not added to the lookup.
+  The process proc returns 1 on success or 0 on failure, and takes 3 arguments:
+  0) reference to the ExifTool object, 1) reference to a directory information
+  hash (with the following entries:), 2) reference to the tag table hash.
+
+    Name        - Tag name for this SubDirectory entry (for verbose messages)
+    Base        - Base offset for pointers from start of file
+    DataPt      - Reference to data block containing directory (may be undef)
+    DataPos     - Position of data block within file (relative to Base)
+    DataLen     - Length of data block in bytes
+    DirStart    - Offset to start of directory from start of data block
+    DirLen      - Length of directory data within block
+    DirName     - Name of this directory
+    OutFile     - Output file or scalar reference
+    Parent      - Name of parent directory
+    RAF         - Reference to File::RandomAccess object if available
+    NewDataPos  - File position of new data (write proc only)
+    Fixup       - Reference to hash of offset fixups (used in EXIF writing only)
+    FixBase     - Flag set to attempt to fix base offsets
+    FixOffsets  - Evaluated for each value pointer to patch maker note offsets
+    LastIFD     - Used by WriteExif() to return offset of last IFD written
+    ImageData   - Used by WriteExif() to avoid buffering large image data blocks
+
+  WRITE_PROC : Reference to a function to write all new tags for this directory.
+  The write proc returns the new directory data or undefined on error.  It takes
+  the same arguments as the process proc above except that the second argument
+  (reference to directory information hash) is optional, and if specified gives
+  information about the source directory for tags to be copied to the output.
+
+  CHECK_PROC : Reference to a function which validates Raw values for writing.
+  The function takes three arguments: 0) ExifTool object reference, 1) tagInfo
+  reference, 2) value reference, and returns undefined (and possibly modifies
+  the input value) if successful, or an error message if there was a format
+  problem.  May set ExifTool CHECK_WARN datamember for success with a warning.
+
+  GROUPS : A hash lookup for the default group names for all entries in this
+  table. If not specified, the Group 0 and 1 names will be set automatically
+  according to the name of the module.
+
+  FORMAT : Specifies the default tag Format and corresponding pointer increment
+  for entries in a BinaryData table, and defaults to 'int8u' if not specified.
+  Format names starting with 'var_' cause subsequent tag ID's in BinaryData
+  tables to be incremented according to the size of the data (not including the
+  terminator).  The possible values of FORMAT are:
+
+    int8s       - Signed 8-bit integer                    (EXIF 'SBYTE')
+    int8u       - Unsigned 8-bit integer                  (EXIF 'BYTE')
+    int16s      - Signed 16-bit integer                   (EXIF 'SSHORT')
+    int16u      - Unsigned 16-bit integer                 (EXIF 'SHORT')
+    int16uRev   - Unsigned 16-bit integer, reversed byte order
+    int32s      - Signed 32-bit integer                   (EXIF 'SLONG')
+    int32u      - Unsigned 32-bit integer                 (EXIF 'LONG')
+    int64s      - Signed 64-bit integer                   (BigTIFF 'SLONG8')
+    int64u      - Unsigned 64-bit integer                 (BigTIFF 'LONG8')
+    rational32s - Rational consisting of 2 int16s values
+    rational32u - Rational consisting of 2 int16u values
+    rational64s - Rational consisting of 2 int32s values  (EXIF 'SRATIONAL')
+    rational64u - Rational consisting of 2 int32u values  (EXIF 'RATIONAL')
+    fixed16s    - Signed 16-bit fixed point value
+    fixed16u    - Unsigned 16-bit fixed point value
+    fixed32s    - Signed 32-bit fixed point value
+    fixed32u    - Unsigned 32-bit fixed point value
+    float       - 32-bit IEEE floating point value        (EXIF 'FLOAT')
+    double      - 64-bit IEEE floating point value        (EXIF 'DOUBLE')
+    extended    - 80-bit extended floating float
+    ifd         - Unsigned 32-bit integer sub-IFD pointer (EXIF 'IFD')
+    ifd64       - Unsigned 64-bit integer sub-IFD pointer (BigTIFF 'IFD8')
+    string      - Series of 8-bit ASCII characters        (EXIF 'ASCII')
+    pstring     - Pascal string [BinaryData tables only]
+    undef       - Undefined-format binary data            (EXIF 'UNDEFINED')
+    binary      - Binary data
+    var_string  - variable-length null-terminated ASCII string [BinaryData]
+    var_ustring - variable-length null-terminated UCS-2 string [BinaryData]
+    var_pstring - variable-length Pascal string                [BinaryData]
+    var_pstr32  - variable-length Pascal string /w 32-bit len  [BinaryData]
+    var_int16u  - variable-length undef data with int6u count  [BinaryData]
+
+  FIRST_ENTRY : Specifies the index for the first tag entry in a binary table.
+  This value is only used if the Unknown option is set to 2 or higher, and
+  allows the binary data to be scanned for unknown tag entries.
+
+  TAG_PREFIX : Prefix for names of unknown tags.
+
+  PRINT_CONV : Default print conversion for tags where PrintConv isn't
+  specified.  PrintConv may be set to undef for individual tags to disable print
+  conversion when PRINT_CONV is defined for a table.
+
+  WRITABLE : Indicates that all tags in this table are writable.  This is the
+  same as setting the Writable flag for each individual tag in the table, except
+  for SubDirectory tags which are not made Writable.
+
+  TABLE_DESC : Short description for this table.  Plain text only.  Used only
+  for XML tag database output.
+
+  NOTES : Notes to introduce the table in the TagNames documentation.  Pod
+  formatting codes B<> and C<> may be used in this text.
+
+  IS_OFFSET : Reference to list of sorted TagID's representing offsets for
+  writable binary data tables only.  Not used for EXIF tables.
+
+  IS_SUBDIR : BinaryData tables only.  A reference to a list of sorted tag ID's
+  representing subdirectories.  Required for writable subdirectories only.
+
+  EXTRACT_UNKNOWN : Used in PDF tables to specify a directory where all unknown
+  tags should be extracted.  Set to 0 to extract only unknown numbered tags for
+  which the unnumbered tag is known.
+
+  NAMESPACE : Namespace prefix for tags in the XMP table.  If this isn't a
+  standard (pre-defined) namespace, then the URI must be defined as well.  To do
+  this, the NAMESPACE value is a reference to either a list or a hash, where the
+  first element (or hash key) is the namespace prefix and and the second element
+  (or hash value) is the URI.  This is undef for XMP tables in which tags have
+  variable namespaces, and in this case each tag must have a Namespace entry.
+
+  PREFERRED : Set to true if the tags in this table should always be added when
+  writing information.  Overrides the order specified by SetNewGroups().  When
+  this feature is used, it may also be desireable to specify a preferred group
+  when calling InitWriteDirs() to write these tags; this avoids creating other
+  directories for tags which are already being creating in the preferred group.
+
+  SRC_TABLE : Used internally to store the source table name of a user-defined
+  tag table so the appropriate module can be loaded as required.
+
+  PRIORITY : Default Priority for all tags in this table.
+
+  WRITE_GROUP : Default WriteGroup for all tags in the table.
+
+  LANG_INFO : Code reference to a routine which returns a reference to a
+  language-specific tag information hash.  The routine takes two arguments: a
+  reference to the non-specific tagInfo hash, and the language code. Used only
+  in tables with writable tags which support tag name language extensions (ie.
+  MIE and XMP).
+
+  VARS : Hash used to store additional parameters.  Individual modules may use
+  this to store any parameters they want.  The following additional parameters
+  have been defined, and may be used by any module:
+
+    ID_LABEL      Label to use instead of "Tag ID" for column heading in tag
+                  name documentation.  When this is set, numerical TagID's are
+                  not converted to hexadecimal notation. Unless otherwise set,
+                  an ID_LABEL of "Index" is assumed for tables which use
+                  ProcessBinaryData.
+
+    NO_ID         Avoid printing "Tag ID" column in tag name documentation.
+
+    CAPTURE       Used by PDF module to name dictionaries to capture when
+                  writing.
+
+    MINOR_ERRORS  [EXIF tables only] Flag to make errors in this IFD minor, or
+                  to downgrade already minor errors to warnings while writing.
+                  (Errors in MakerNote IFD's are already classified as minor.)
+                  Note that for certain types errors, the response is to delete
+                  the entire IFD from the image.
+
+    NUMBERS_LAST  Sort numerical tags after character tags in documentation.
+
+  DATAMEMBER : BinaryData tables only.  A reference to a list of sorted tag ID's
+  which must be extracted as data members when writing.  Must also list "var_"
+  format tags and tags with Hook so offsets are properly calculated if the table
+  is writable.
+
+  SET_GROUP1 : [EXIF tables only] Flag to set group1 name to the directory name
+  for all tags in the table.
+
+The remaining entries in a tag table are the tag IDs with their associated
+information.  The information may exist in one of three forms:  1) A simple
+scalar which is the name of the tag, 2) A reference to a hash of information
+describing this tag, or 3) a reference to a list of hashes which contain
+Condition expressions allowing the appropriate hash to be selected to suit the
+conditions.  The following is a description of possible hash entries.  All
+entries are optional, except for the tag Name which is required if the tag ID is
+numerical.
+
+  Name          : The tag name.  Tag names need not be unique.  If they aren't
+                  unique, then duplicate tags will hide the values of previous
+                  tags when extracting information unless the Duplicates option
+                  is set or the new tag has lower Priority.  With Duplicates
+                  set, to allow multiple tags with the same name to exist in the
+                  tag information hash, the key of the previous tag is changed
+                  to the form "TagName (N)", where N starts at 1 and increments
+                  for subsequent duplicate tags.  A tag name should start with
+                  an uppercase letter, and contain only the charcters in the set
+                  [A-Za-z0-9_-].  If not given, the Name is taken from the tag
+                  ID with the first character changed to upper case.
+
+  Description   : A more readable description of tag name.  If a tag doesn't
+                  specify a Description, then the tag Name is used instead, with
+                  spaces inserted between the words.
+
+  Notes         : Notes for this tag in the HTML TagNames documentation.
+
+  Groups        : Hash lookup for group names for this tag.
+
+  Format        : Only valid for BinaryData, EXIF and IPTC tables. For a Binary
+                  or EXIF table, this gives the format that is used to convert
+                  the binary data, and is one of the FORMAT types specified
+                  above.  If not specified, the Format of an EXIF entry is taken
+                  from the EXIF information, and the Format of a BinaryData
+                  entry is taken from the FORMAT specified for the table (or
+                  int8u if FORMAT is not specified).  Must be specified for
+                  Writable tags where the value must be converted for a
+                  Condition.  For BinaryData tables, the format may have a size
+                  in trailing brackets which is a Perl expression to be
+                  evaluated. The expression may access any of the previous table
+                  entries through a %val hash (read-only tables), the data size
+                  via $size, or the ExifTool object via $self. For example,
+                  'string[$val{3}]' defines a string with length given by the
+                  table entry with tag index '3'.  An initial "var_" may be
+                  added to the Format name of any BinaryData tag with a size in
+                  brackets.  In this case, subsequent offsets are adjusted by
+                  the total size minus the size of the base Format (ie.
+                  "var_int16u[10]" causes subsequent offsets to be incremented
+                  by sizeof(int16u) * 9).  Note that all "var_" Format tags must
+                  have corresponding DATAMEMBER entries.
+
+  Count         : Used when writing EXIF information to specify the number
+                  values to write, or the number of characters in a fixed-length
+                  string.  A value of -1 indicates that the count is variable
+                  and should be determined by the number of values provided.
+                  Note that this count that corresponds to the specified Format,
+                  so if a different-sized Writable format is defined, the actual
+                  count written to the file will be different.
+
+  FixCount      : Flag set to determine correct count from offsets in IFD.  This
+                  is necessary for some Kodak tags which write an incorrect
+                  Count value.
+
+  Flags         : Flags to specify characteristics for this tag.  May be a
+                  simple scalar flag name, a reference to a list of flag names,
+                  or a reference to a hash of flag/value pairs. If not a hash
+                  reference, the flag value is set to 1. Flags are expanded for
+                  faster access at run time into members of the tagInfo hash,
+                  and may be written directly as members if desired. The
+                  available flag names are:
+
+                  'AutoSplit' - [List tags only] Similar to ListSplit option,
+                  but applied automatically to individual tags.  Value specifies
+                  pattern for split, or 1 for default pattern ',?\\s+'.
+
+                  'Avoid' - avoid creating this tag if possible.  This is only
+                  effective if another tag exists with the same name.
+
+                  'Binary' - set to 1 for binary data.  This has the same effect
+                  as setting ValueConv to '\$val', but it it a bit cleaner and
+                  avoids dummy ValueConvInv entries for writable tags.  Has no
+                  effect if ValueConv is defined for the tag.  Some values may
+                  be treated as binary data even if this flag is not set.
+
+                  'BlockExtract' - set for writable directories in EXIF
+                  information which are extracted by default.  Otherwise
+                  writable directories are only extracted as a block if
+                  specified explicitly.
+
+                  'DataMember' - name of exiftool data member associated with
+                  this tag if it should be stored as a special data member when
+                  writing information.  Necessary only if the value of the tag
+                  affects other written information.  Currently only used for
+                  tags in EXIF tables where it triggers the execution of the
+                  RawConv to convert and stores the value as an ExifTool data
+                  member when writing.
+
+                  'DataTag' - associated tag name containing data for offset or
+                  byte count tags.
+
+                  'Drop' - set to 1 for tags that should be excluded when
+                  rebuilding maker notes when copying all tags.
+
+                  'EntryBased' - set to 1 if the offset for this value is based
+                  on the IFD entry position.  This allows individual values to
+                  be entry-based even though some others aren't (as with the
+                  Casio PrintIM information).
+
+                  'Flat' - [flattened XMP structure tags only] must be set for
+                  all pre-defined flattened tags (including user-defined
+                  flattened tags).  This flag is reset to 0 internally after all
+                  associated flattened tags in the structure have been
+                  generated.
+
+                  'Flattened' - [reserved] used internally to mark Struct tags
+                  which have been processed to generate flattened equivalents.
+
+                  'GotGroups' - [reserved] flag used internally to indicate that
+                  the Groups hash has been initialized for this tag.
+
+                  'Hidden' - set to hide tag from the TagName documentation. 
+                  Also suppresses verbose output of a BinaryData tag.
+
+                  'IsOffset' - flag set if the tag represents an offset to some
+                  data, and causes value will be adjusted to an absolute file
+                  offset.  If set to 2, the offset base of the parent directory
+                  is used even if the base changes for the current directory
+                  (only some maker notes are this messed up).  Set to 3 if
+                  absolute file offsets are used.  May be set to an expression
+                  to be evaluated.  Expression may access $val and $exifTool,
+                  and is evaluated only when reading.
+
+                  'List' - flag indicating that duplicate entries of this tag
+                  are allowed, and will be accumulated in a list.  Note that for
+                  XMP information, 3 different types of lists are supported and
+                  the List value specifies the type: 'Bag', 'Seq' or 'Alt'.  As
+                  well, a value of '1' is used internally in XMP to allow list
+                  behaviour for a flattened tag which is itself not a list
+                  element (ie. a member of list of structures).  Note that in
+                  ExifTool an XMP lang-alt tag (Writable="lang-alt") is NOT a
+                  List-type tag (unless it is a list of lang-alt lists, which is
+                  uncommon).
+
+                  'MakerNotes' - set if this tag is maker note data.
+
+                  'MakerPreview' - set in the PreviewImageStart tag information
+                  if the preview must be stored inside the maker notes.
+
+                  'Mandatory' - set for mandatory tags.  Used only by TagInfoXML
+                  and documentation purposes.  Mandatory tags may be added
+                  automatically by ExifTool.
+
+                  'NestedHtmlDump' - flag set if value for this tag is also
+                  dumped when processing the SubDirectory.  This flag is implied
+                  if the MakerNotes flag is set.  Set to 2 if the dump should
+                  only be underlined if nested inside other maker notes.
+
+                  'NotIFD' - set for 'MakerNotes' tags only if the data is not
+                  in standard EXIF IFD format.  (Note: All SubDirectory tags in
+                  the MakerNotes table are 'MakerNotes' type by default.)
+
+                  'OffsetPair' - set if the tag represents half of an offset/
+                  byte count pair.  Data for these tags must be handled
+                  separately.  Value is the tagID for the paired tag.
+
+                  'Permanent' - flag indicates that a tag is permanent, and
+                  can't be added or deleted from the file, although a new value
+                  may be written if the tag already exists.  By default, all
+                  MakerNotes tags are permanent unless otherwise specified.
+
+                  'PrintHex' - specifies that unknown PrintConv values should
+                  be printed in hex (ie. 'Unknown (0x01)').  Also causes
+                  numerical tag values to be printed in hex in the HTML tag name
+                  documentation.
+
+                  'PrintString' - flag set to force PrintConv values to be
+                  printed as strings in the documentation.
+
+                  'Priority' - gives the priority of this tag while reading.  If
+                  set to zero, this tag will not override the value of previous
+                  tags with the same name.  If the priority is greater than
+                  zero, this tag won't be overridden by subsequent tags unless
+                  their priority is equal to or greater than this priority.  A
+                  special feature is that Priority 0 tags are automatically
+                  incremented to Priority 1 if they exist in the IFD of the full
+                  resolution image (as determined by SubfileType).  If not
+                  defined, the priority defaults to 1 for all tags except except
+                  tags in IFD1 of JPEG images which default to priority 0.
+
+                  'Protected' - bit mask to protect tags from writing:
+                  Bit 0x01 indicates an 'unsafe' tag, which is not set via
+                  SetNewValuesFromFile() unless specified explicitly.
+                  Bit 0x02 indicates a 'protected' tag, which should not be set
+                  directly by the user.
+
+                  'PutFirst' - [EXIF only] flag to place this value before IFD0
+                  when writing (ie. immediately after TIFF header).  Only used
+                  for main IFD's (IFD0, IFD1, etc) and IFD's where SubIFD flag
+                  is set to 2 (currently only ExifIFD).
+
+                  'Resource' - [XMP only] flag to write value as an rdf:resource
+                  in an empty element instead of as a normal string.
+
+                  'SeparateTable' - set to list PrintConv values in a separate
+                  table in the HTML documentation.  Value is 1 for a table name
+                  of 'Module TagName', or 'TAG' for 'Module TAG', or 'MODULE
+                  TAG' to fully specify the table name.  The table may have a
+                  'Notes' entry for a description of the table.
+
+                  'SetResourceName' - [Photoshop tags only] set to 1 to append
+                  resource name to the extracted value (ie. 'VALUE/#NAME#/').
+                  Also allows resource name to be appended when writing new
+                  values.  May be set to any value other than 1 for a default
+                  resource name to use when writing if an appended name is not
+                  provided.
+
+                  'StructType' - [reserved] used internally by XMP writer for
+                  flattened structure tags as a flag to indicate that one or
+                  more enclosing structures has a TYPE field.
+
+                  'SubDoc' - [Composite tags only] set to cause this composite
+                  tag to also be generated for each sub-document.  To achieve
+                  this, 'Main:' and 'Doc#:' prefixes are added to all Require'd
+                  and Desire'd tag names which don't already start with 'Main:'
+                  or 'Doc#:', and the composite tag is built once for each of
+                  the main document and all sub-documents.
+
+                  'SubIFD' - used in writing to determine that the tag specifies
+                  an offset to a sub-IFD.  When this flag is set, the Group1
+                  name gives the name of the IFD.  Must be set if and only if
+                  the tag has a SubDirectory Start of '$val' (this is validated
+                  by BuildTagLookup).  Set to 2 for standard EXIF SubIFD's where
+                  the PutFirst flag is valid.
+
+                  'Unknown' - this is an unknown tag (only extracted when the
+                  Unknown option is set).
+
+                  'WrongBase' - ['IsOffset' tags only] An expression using $self
+                  that is evaluated to generate a base shift for 'IsOffset' tags
+                  which use a different base than the rest of the tags.
+
+  RawConv       : Used to convert the Raw value at extraction time (while the
+                  image file is still open, unlike ValueConv and PrintConv below
+                  which are done later only if the value is requested).  May be
+                  a scalar expression using $val (the Raw tag value), $self (the
+                  current ExifTool object), $tag (the tag key) and $tagInfo
+                  (reference to the tag information hash) or a code reference
+                  with $val and $self as arguments.  For Composite tags, $val is
+                  a reference to a hash of source ("derived from") tag names,
+                  and @val may be used to access the Raw values of these tags.
+                  If RawConv is specified for a Composite tag, then ValueConv
+                  and PrintConv evals will no longer have access to the source
+                  @val and @prt values.  The returned value may be a scalar
+                  which is used as the new Raw value, a scalar reference to a
+                  binary data value, a hash reference for Composite tags, an
+                  ARRAY reference for a list of values, or undefined to indicate
+                  that the tag should be ignored.  Also, RawConv may generate
+                  Warning or Error tags, while ValueConv and PrintConv may not. 
+                  Note: RawConv should only be used if necessary (in general,
+                  only if the conversion may return undef to ignore the tag)
+                  because ValueConv is more efficient since it is only executed
+                  if the tag value is requested, while RawConv is executed for
+                  all extracted tags.
+
+  ValueConv     : Used to convert the Raw value to a useable form. May be a hash
+                  reference to act as a lookup table, a scalar which is
+                  evaluated as a Perl expression, or a code reference to a
+                  subroutine.  May also be a list reference, in which case the
+                  value is split at whitespace into a list of values and each
+                  value is converted by the associated entry in the ValueConv
+                  list.  If a hash reference is used and the Raw value doesn't
+                  appear as one of the keys, then the converted value is set to
+                  "Unknown (X)", where X is the Raw value (unless either of the
+                  special keys exist: 'BITMASK', a reference to a hash used to
+                  decode individual value bits; or 'OTHER', a reference to a
+                  subroutine used to convert unknown values.  The subroutine
+                  takes 3 arguments: the value, a flag which is set for the
+                  inverse conversion, and a reference to the PrintConv hash, and
+                  returns the converted value or undef on error.  The lookup
+                  hash may also contain a 'Notes' entry which is used for
+                  documentation if the SeparateTable flag is set).  In an
+                  expression, $self is a reference to the current ExifTool
+                  object, $val is the Raw value, and $tag is the tag key.  The
+                  subroutine takes 2 arguments: the Raw value and a reference to
+                  the current ExifTool object.  The expression or subroutine is
+                  evaluated when and if the tag value is requested (ie. only
+                  after all extraction is complete), so if necessary at this
+                  time the values of all other tags are available via calls to
+                  $self->GetValue("Tag","Raw"). (Note: In theory, types other
+                  than "Raw" may be accessed, but they are slower and may lead
+                  to cyclical dependencies so they should be avoided). When
+                  evaluated, the expression or subroutine returns a scalar for
+                  the converted value, a SCALAR reference to a binary data value
+                  (see the 'Binary' flag), or an ARRAY reference for a list of
+                  values.  The return value should always be defined -- use
+                  RawConv instead to return undef if it is necessary to test the
+                  value for validity, otherwise an undef tag may hide a
+                  previously defined value when the Duplicates option is not
+                  enabled.  If this isn't possible (as with Composite tags where
+                  the converted values of the source tags are needed), set the
+                  Priority to 0 to avoid taking priority over a valid tag. 
+                  Composite tags which Require or Desire other tags may access
+                  the ValueConv, PrintConv and Raw values of these tags through
+                  the elements of the @val, @prt and @raw lists respectively
+                  (only if there was no RawConv or it returned a hash
+                  reference).  For these tags, $val may be used in an expression
+                  to represent $val[0], and the first argument passed for a code
+                  reference is a reference to @val. If ValueConv is not
+                  specified, the Raw value is not converted.
+
+  PrintConv     : This entry is similar to ValueConv above, except that it is
+                  used to further convert the tag value to a human readable
+                  form.  It can be either a hash lookup, a scalar Perl
+                  expression, a code reference or a list reference.  In this
+                  expression, $self, $val and $tag may be used as with
+                  ValueConv, but if ValueConv was defined then $val is the
+                  ValueConv value instead of the Raw value.  The returned value
+                  should always be defined.  Note that the print conversion is
+                  only done if the PrintConv option is enabled (which it is by
+                  default), and if the result of the ValueConv is not a scalar
+                  reference.  If it is a list reference, then the converted
+                  values are joined by '; ' in the output string.
+
+  RawConvInv    : The inverse of RawConv.  This should only be used in very rare
+                  situations when the raw value can not be predetermined.
+                  Unlike the other inverse conversions which are applied in
+                  SetNewValue(), this conversion is applied in WriteInfo() as
+                  the file is being written.  This is important because it means
+                  that FILE_TYPE and any DataMember tags ocurring before this
+                  tag in the file are available.  Beware that if the return
+                  value is not defined, the tag will be deleted unless there is
+                  specific logic to avoid this (currently, only EXIF and Binary
+                  data directories handle this case).
+
+  ValueConvInv  : The inverse of ValueConv.  Only necessary for Writable tags
+                  when ValueConv is specified (except WriteAlso tags).  Note
+                  that DataMember tags may NOT be used in the inverse
+                  conversions because these conversions are done before the
+                  input file is parsed.  Instead, a Condition or RawConvInv must
+                  be used.  May return undef on conversion error and call warn()
+                  to issue a warning.  If warn() is not called, a generic
+                  warning is generated when undef is returned.  An empty warning
+                  ("\n") may be issued to suppress warning messages when undef
+                  is returned.  If a scalar, the expression may use the
+                  variables $val, $self and $wantGroup.  If a code ref, the
+                  routine is passed 2 arguments: $val and $self.  Note that this
+                  conversion is not applied for deleted tags (ie. $val is
+                  undef).
+
+  PrintConvInv  : The inverse of PrintConv.  Only necessary if for Writable tags
+                  when PrintConv is specified (unless WriteAlso is used).  See
+                  ValueConvInv above for more details.
+
+  PrintConvColumns : Number of columns for PrintConv lookup in HTML docs.
+                  Default is 1 if not specified.
+
+  DelValue      : Raw value to be used when deleting a permanent tag.  (Note all
+                  MakerNotes tags are permanent.)  If not specified, an attempt
+                  is made to convert an empty string for the raw value.
+
+  Relist        : [Only if ValueConv or PrintConv is a list ref] Reference to a
+                  list of original value indices used to reorganize values. Each
+                  entry in the list may be a scalar index, or a reference to a
+                  list of indices to join values.  (Currently values may be
+                  joined, but the order of writable values must not be changed
+                  until this ability is added to the writer.)
+
+  Mask          : [BinaryData tags only] Bitmask for this value.  (Multiple tags
+                  may have the same index by using floating point indices.  An
+                  unknown tag will only be generated for a certain TagID if
+                  there is no integral TagID for that tag.)  When Mask is used,
+                  PrintHex=1 is implied unless otherwise defined.
+
+  Condition     : If given, specifies scalar which is evaluated as a Perl
+                  expression at extraction time to decide whether the tag is
+                  valid.  If used in a list of alternate tag definitions, the
+                  first list entry with a true condition is taken.  If no
+                  condition exists, then a 'true' condition is assumed.  The
+                  expression may use $self to access the ExifTool object.  The
+                  first 128 bytes of the raw data value are accessible through
+                  the reference $valPt for EXIF, Jpeg2000 and BinaryData tags
+                  only (note that for BinaryData tags, the raw data of $$valPt
+                  is always 'undef' type, and may not be used when writing
+                  except for SubDirectory tags).  EXIF tags may also reference
+                  the format string and value count through $format and $count.
+                  Note that if the value is writable and $valPt is used, the tag
+                  must have a Format (unless 'undef' or 'string'), and a Count
+                  (unless 1 or length of the 'undef' or 'string'), so the raw
+                  data may be generated for evaluating the Condition.  When
+                  writing, $valPt, $format and $count refer to the new value,
+                  except for MakerNotes tags where $format and $count refer to
+                  the old tag if it existed.
+
+  Require       : [Composite tags only] A hash reference specifying the tags
+                  required to calculate the composite tag value.  The hash
+                  values are the names of the required tags, and the keys
+                  specify the indices where the tag values are stored in the
+                  @val list used in the ValueConv and/or PrintConv expression.
+                  The composite value is only calculated if the values for all
+                  Require'd tags are defined.  Require and Desire tag names may
+                  be prefixed by an optional group family 0 or 1 name followed
+                  by a colon.  Case IS significant.  A special feature allows
+                  a scalar tag name to be used instead of the hash reference
+                  when only the 0th tag is defined.  For example, the following
+                  two definitions are equivalent:
+
+                        Require => { 0 => 'XMP:Title' },
+                        Require => 'XMP:Title',
+
+  Desire        : [Composite tags only] This is the same as Require except that
+                  the value is still calculated even if the specified tags don't
+                  exist.  Beware that the elements of @val, @prt and @raw may be
+                  undefined for Desire'd tags.  Both Require and Desire may
+                  exist together, however be sure to specify unique keys for
+                  each tag since they are used as indices into the @val, @prt
+                  and @raw lists common to both Require'd and Desire'd tags.
+
+  Shift         : [Writable tags only] Specifies type of shift to apply if this
+                  value may be shifted.  Set to 'Time' for shifting date/time
+                  tags.
+
+  Writable      : Indicates this tag can be written (or not written if value is
+                  set to zero), and for EXIF-type tables gives format for
+                  writing.  Writable may be set to 1 for MakerNotes information
+                  because the existing format is always used, however providing
+                  a format is desireable because it is used in validating the
+                  value.  For EXIF tables, the Writable flag may be different
+                  than the Format flag, in which case Format is used for
+                  converting the binary value and Writable specifies the format
+                  code written to the EXIF IFD.  For SubDirectories in EXIF
+                  information, this flag is only defined if the SubDirectory is
+                  writable as a block, or if the SubDirectory can not be edited
+                  (in which case Writable is set to 0).  If non-zero, the
+                  SubDirectory is also extracted as a block, so the Binary and
+                  Protected flags should usually set as well.  There is
+                  currently no way to specify a write format for a SubDirectory
+                  that is not writable as a block (the default is 'int32u' for
+                  IFD-type SubDirectories, and 'undef' for all others).
+
+  WriteAlso     : Used for writable tag to specify other tags to write when this
+                  tag is written.  The value is a hash reference.  The hash keys
+                  are the names of the tags to write, and the values are
+                  evaluated to obtain the ValueConv values of each tag (or undef
+                  to delete the tag).  In the eval, $val is the Raw value of the
+                  parent tag (which may be undef if the tag is being deleted),
+                  and the %opts hash may be accessed to modify SetNewValue
+                  options for each tag.  By default, Type is set to "ValueConv"
+                  and the Protected option has bit 0x02 set to allow writing of
+                  Protected tags that aren't directly writable.  The AddValue
+                  and DelValue options from the parent tag are also defined, but
+                  no other options are set by default.  Previous new values of
+                  WriteAlso tags have already been removed prior to the eval if
+                  the Replace option was used for the parent tag.  If an empty
+                  warning is issued ("\n"), the target tag is not written and no
+                  error is reported.
+
+  WriteCheck    : If given, specifies a scalar which is evaluated as a Perl
+                  expression for a one-time validatation the value being
+                  written.  The expression has access to 3 variables: $val is
+                  the value to be written, $self is the ExifTool object, and
+                  $tagInfo is the tag information hash reference.  It returns an
+                  error string, or undef if the value is good.  If the error
+                  string is empty, the tag is not written and no warnings are
+                  issued, but WriteAlso is still evaluated if it exists.
+
+  DelCheck      : Similar to WriteCheck, but called when the tag is deleted. The
+                  expression may access $self, $tagInfo and $wantGroup.  Returns
+                  error string, or undef on success, and may set $val to
+                  something other than undef.  May return empty string ('') to
+                  suppress warning messages but not delete tag (ie. when
+                  deleting only associated tags).
+
+  WriteCondition: [Writable EXIF tags only] Specifies a condition to be
+                  evaluated before the tag can be written to a specific file.
+                  The condition may use $self to reference the ExifTool object,
+                  and returns true if it is OK for writing.  Unlike WriteCheck
+                  which is done only once when the new value is set, this
+                  condition is evaluated just before the tags of the specific
+                  SubDirectory are written.
+
+  WriteGroup    : [Writable EXIF tags only] Specifies the IFD where the
+                  information gets written by default.  Must be defined for
+                  writable EXIF tags if WRITE_GROUP is not specified in table.
+
+  IsOverwriting : [Writable EXIF tags only] Specifies reference to subroutine
+                  which determines if tag should be overwritten.  Arguments are:
+                  0) ExifTool object ref, 1) new value hash ref, 2) old value,
+                  3) new value reference.
+
+  AllowGroup    : [Writable tags only] Regular expression string (case
+                  insensitive) to match group names which are allowed when
+                  writing this tag.  Only needed if tag can be written to
+                  groups other than the normal groups for this tag (very rare).
+
+  OffsetPair    : Used in EXIF table to specify the tagID for the corresponding
+                  offset or length tag.
+
+  DataTag       : Used in EXIF table to specify the tag name of the data
+                  associated with offset/length tags.
+
+  FixFormat     : [Writable EXIF SubIFD SubDirectory's only] Used to specify a
+                  format for writing an IFD pointer other than 'int32u'.
+
+  ChangeBase    : [EXIF tags in JPEG images only] Eval used to return new base
+                  for the offset for this tag only.  Eval may use $dirStart and
+                  $dataPos.  Note this is geared to the quirky Leica preview
+                  image offset, and is only used if the preview is outside the
+                  APP1 EXIF segment.
+
+  Struct        : [XMP tags only] Reference to structure hash for structured XMP
+                  tags.  See "STRUCTURES" section below for more details.  (For
+                  backward compatibility, this may be a name to an entry in
+                  %Image::ExifTool::UserDefined::xmpStruct, but this use is
+                  deprecated.)  Flattened tags are automatically generated for
+                  each field in the structure.  Note that Struct tags can NOT
+                  have ValueConv/PrintConv entries, because values that are HASH
+                  references are are also used by Composite tags, which use the
+                  the Conv entries to generate the composite value.
+
+  Namespace     : [XMP tags only] Gives standard XMP namespace prefix to use for
+                  this tag.  If not defined, the tag table NAMESPACE is used.
+
+  Units         : [MIE tags only] Reference to a list of valid units strings.
+                  The default units are the first item in the list.
+
+  Hook          : [BinaryData tags only] Expression to be evaluated when
+                  extracting tag to allow dynamic Format, etc for BinaryData
+                  tags.  May access $self, and assign a new value to $format to
+                  dynamically set the tag format, and/or increment $varSize to
+                  add a byte offset to subsequent tags.
+
+  TagID         : [reserved] Used internally to save the table key for this tag.
+                  Note: For XMP tables this corresponds to the XMP property
+                  name, but the table key may have a full XMP namespace prefix
+                  added.
+
+  NewTagID      : [reserved] Used internally to save new ID of tag in Composite
+                  table if it is different that the original TagID (happens if
+                  there was a conflict with an existing entry in the table)
+
+  Index         : [reserved] Used internally to save the index of tagInfo items
+                  which are in a conditional list.
+
+  Table         : [reserved] Reference to parent tag table.
+
+  PropertyPath  : [reserved] Used internally by XMP writer to save property path
+                  name.  Also used in structure field information hashes, but
+                  for these the full property path is not stored.
+
+  SrcTagInfo    : [reserved] Used internally by XMP module to store reference to
+                  default language tagInfo hash for alternate-language tags.
+
+  RootTagInfo   : [reserved] Used internally to store a reference to the tag
+                  information hash of the top-level structure for flattened
+                  structure tags.
+
+  Module        : [reserved] Used internally to store module name for writable
+                  Composite tags.
+
+  LangCode      : [reserved] Used internally to indicate language code for
+                  alternate language tags (ie. 'fr').  Only used with formats
+                  which support alternate languages (ie. XMP, MIE, etc).
+
+  SubDirectory {  If it exists, this specifies the start of a new subdirectory.
+                  It contains a collection of variables which specify the type
+                  and location of the subdirectory.  These variables are
+                  described below:
+
+     TagTable   : Specifies the name of the tag table lookup for the new
+                  subdirectory.  If not specified, the parent tag table is used.
+
+     Start      : The offset to the start of the subdirectory relative to the
+                  current Base.  This is a Perl expression which may use
+                  $valuePtr to represent the location of the tag value in the
+                  file, or $val for the value itself.  If not specified, a Start
+                  of '$valuePtr' is assumed.
+
+     OffsetPt   : If specified, this is a Perl expression that gives the
+                  position of a 32-bit word in the current directory that is
+                  added to the Start position to get the position of the new
+                  subdirectory.  The expression should use the position of the
+                  current tag ($valuePtr).
+
+     Base       : This specifies the base offset for all pointers in the
+                  subdirectory.  This need not be specified if the offset is the
+                  same as the current directory, which is normally the case.
+                  May use $start to represent the subdirectory start location
+                  relative to the current base, and $base for the value of the
+                  current base.  If this is defined, the automatic validation of
+                  base offsets is disabled for maker notes directories.  The
+                  IFD is flagged as using relative offsets when writing if
+                  '$start' is used in this expression.
+
+     EntryBased : Flag indicating that the offsets are based on the individual
+                  directory entry position, so offsets are incremented by 12
+                  times the corresponding entry index.
+
+     MaxSubdirs : Maximum number of subdirectories specified by the current tag
+                  (if the tag specifies multiple values).  If not specified, the
+                  tag value ($val) is used as-is.  If MaxSubdirs is specified,
+                  then one subdirectory is parsed for each value found up to the
+                  maximum number specified.  Ignored when writing.
+
+     ByteOrder  : Specifies byte ordering if different than than the rest of the
+                  file.  Must be either BigEndian, LittleEndian or Unknown.  If
+                  Unknown is specified, the byte order will be determined from
+                  the directory count (however, this can not be done if OffsetPt
+                  is specified).
+
+     Validate   : If given, specifies Perl expression which is used to validate
+                  the subdirectory data.  The following variables may be used in
+                  the expression: $val (value of the tag), $dirData (reference
+                  to directory data), $subdirStart (offset to subdirectory
+                  start) and $size (size of subdirectory).  Returns true if
+                  subirectory is valid.
+
+     ProcessProc: If given, specifies processing procedure used to decode this
+                  subdirectory data.  This overrides the default procedure
+                  specified by PROCESS_PROC in the tag table.
+
+     WriteProc:  If given, specifies processing procedure used to write this
+                  subdirectory data.  This overrides the default procedure
+                  specified by WRITE_PROC in the tag table.
+
+     DirName    : Name of this subdirectory.  If not specified, the name is
+                  taken from the tag name.  DirName is important because it is
+                  used when writing to compare against names in the directory
+                  map to determine which directories need to be edited.
+
+     FixBase    : Flag set if base offsets should be fixed.  Used to add a
+                  constant to maker notes offsets to fix damage done by some
+                  image editing utilities. (maker notes only)  Set to 2 for
+                  unknown maker notes to be a bit more flexible in adjusting
+                  the base offset.
+
+     AutoFix    : Flag set to patch GE makernote offset quirks and apply FixBase
+                  without warnings when writing.
+
+     FixOffsets : Expression to evaluate for each value pointer to patch
+                  problems with some EXIF maker note offsets.  May access the
+                  following variables: $valuePtr, $valEnd, $size, $tagID and
+                  $wFlag.  May return undef when writing to ignore the entry.
+
+     RelativeBase:[EXIF directories only] Flag to adjust all offsets relative
+                  to the start of the IFD when writing.
+
+     Multi      : [EXIF directories only] Flag to allow multiple linked IFD's.
+                  1 is assumed if DirName is IFD0 or SubIFD unless otherwise
+                  defined.
+
+     Magic      : [TiffIFD directories only] Magic number used in TIFF-like
+                  header.
+  }
+
+STRUCTURES
+
+Structure hashes are very similar to tag tables in that their keys are structure
+field ID's and their values are structure field information hashes.  The special
+keys in structure hashes are:
+
+  NAMESPACE   : Same as in tag tables, but may be set to undef for a
+                variable-namespace structure which holds any top-level tag. This
+                is mandatory for built-in tags, but optional for user-defined
+                tags (where it defaults to the NAMESPACE of the tag table).
+
+  STRUCT_NAME : Name of structure (used in warning messages).
+
+  TYPE        : rdf:type resource for structure.
+
+  NOTES       : Notes for documentation.
+
+  GROUPS      : Same as in tag table, but only the family 2 group name is used,
+                as the default for the flattened tags.
+
+The contained structure field information hashes are similar to tag information
+hashes, except that only the following elements are used:
+
+  Raw/Value/PrintConv (and their inverses), TagID (optional), Groups, List,
+  Writable, Struct, Namespace, LangCode, PropertyPath.
+
+But note that for PropertyPath, only the element of the path corresponding to
+the specific field is stored (including any necessary list properties).  The
+full property path is obtained by walking the structure tree.
+
+Flattened tags corresponding to each field in a structure are automatically
+generated (using an on-demand approach to avoid spending time generating them
+unless necessary).  Pre-defined flattened tags are allowed, and are used when it
+is necessary to change the Name or Description of a flattened tag.  The
+flattened tag information hash entries are copied from the corresponding
+structure field definitions, even for pre-defined flattened tags.  The exception
+that the List tag is generated automatically unless explicity set to 0 in a
+pre-defined flattened tag.
+
+--------------------------------------------------------------------------------
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/RIFF.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/RIFF.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/RIFF.pm	(revision 24799)
@@ -0,0 +1,1180 @@
+#------------------------------------------------------------------------------
+# File:         RIFF.pm
+#
+# Description:  Read RIFF/WAV/AVI meta information
+#
+# Revisions:    09/14/2005 - P. Harvey Created
+#
+# References:   1) http://www.exif.org/Exif2-2.PDF
+#               2) http://www.vlsi.fi/datasheets/vs1011.pdf
+#               3) http://www.music-center.com.br/spec_rif.htm
+#               4) http://www.codeproject.com/audio/wavefiles.asp
+#               5) http://msdn.microsoft.com/archive/en-us/directx9_c/directx/htm/avirifffilereference.asp
+#               6) http://research.microsoft.com/invisible/tests/riff.h.htm
+#               7) http://www.onicos.com/staff/iz/formats/wav.html
+#               8) http://graphics.cs.uni-sb.de/NMM/dist-0.9.1/Docs/Doxygen/html/mmreg_8h-source.html
+#               9) http://developers.videolan.org/vlc/vlc/doc/doxygen/html/codecs_8h-source.html
+#              10) http://wiki.multimedia.cx/index.php?title=TwoCC
+#              11) Andreas Winter (SCLive) private communication
+#              12) http://abcavi.kibi.ru/infotags.htm
+#              13) http://tech.ebu.ch/docs/tech/tech3285.pdf
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::RIFF;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.28';
+
+sub ConvertTimecode($);
+
+# type of current stream
+$Image::ExifTool::RIFF::streamType = '';
+
+%Image::ExifTool::RIFF::audioEncoding = ( #2
+    Notes => 'These "TwoCC" audio encoding codes are used in RIFF and ASF files.',
+    0x01 => 'Microsoft PCM',
+    0x02 => 'Microsoft ADPCM',
+    0x03 => 'Microsoft IEEE float',
+    0x04 => 'Compaq VSELP', #4
+    0x05 => 'IBM CVSD', #4
+    0x06 => 'Microsoft a-Law',
+    0x07 => 'Microsoft u-Law',
+    0x08 => 'Microsoft DTS', #4
+    0x09 => 'DRM', #4
+    0x0a => 'WMA 9 Speech', #9
+    0x0b => 'Microsoft Windows Media RT Voice', #10
+    0x10 => 'OKI-ADPCM',
+    0x11 => 'Intel IMA/DVI-ADPCM',
+    0x12 => 'Videologic Mediaspace ADPCM', #4
+    0x13 => 'Sierra ADPCM', #4
+    0x14 => 'Antex G.723 ADPCM', #4
+    0x15 => 'DSP Solutions DIGISTD',
+    0x16 => 'DSP Solutions DIGIFIX',
+    0x17 => 'Dialoic OKI ADPCM', #6
+    0x18 => 'Media Vision ADPCM', #6
+    0x19 => 'HP CU', #7
+    0x1a => 'HP Dynamic Voice', #10
+    0x20 => 'Yamaha ADPCM', #6
+    0x21 => 'SONARC Speech Compression', #6
+    0x22 => 'DSP Group True Speech', #6
+    0x23 => 'Echo Speech Corp.', #6
+    0x24 => 'Virtual Music Audiofile AF36', #6
+    0x25 => 'Audio Processing Tech.', #6
+    0x26 => 'Virtual Music Audiofile AF10', #6
+    0x27 => 'Aculab Prosody 1612', #7
+    0x28 => 'Merging Tech. LRC', #7
+    0x30 => 'Dolby AC2',
+    0x31 => 'Microsoft GSM610',
+    0x32 => 'MSN Audio', #6
+    0x33 => 'Antex ADPCME', #6
+    0x34 => 'Control Resources VQLPC', #6
+    0x35 => 'DSP Solutions DIGIREAL', #6
+    0x36 => 'DSP Solutions DIGIADPCM', #6
+    0x37 => 'Control Resources CR10', #6
+    0x38 => 'Natural MicroSystems VBX ADPCM', #6
+    0x39 => 'Crystal Semiconductor IMA ADPCM', #6
+    0x3a => 'Echo Speech ECHOSC3', #6
+    0x3b => 'Rockwell ADPCM',
+    0x3c => 'Rockwell DIGITALK',
+    0x3d => 'Xebec Multimedia', #6
+    0x40 => 'Antex G.721 ADPCM',
+    0x41 => 'Antex G.728 CELP',
+    0x42 => 'Microsoft MSG723', #7
+    0x43 => 'IBM AVC ADPCM', #10
+    0x45 => 'ITU-T G.726', #9
+    0x50 => 'Microsoft MPEG',
+    0x51 => 'RT23 or PAC', #7
+    0x52 => 'InSoft RT24', #4
+    0x53 => 'InSoft PAC', #4
+    0x55 => 'MP3',
+    0x59 => 'Cirrus', #7
+    0x60 => 'Cirrus Logic', #6
+    0x61 => 'ESS Tech. PCM', #6
+    0x62 => 'Voxware Inc.', #6
+    0x63 => 'Canopus ATRAC', #6
+    0x64 => 'APICOM G.726 ADPCM',
+    0x65 => 'APICOM G.722 ADPCM',
+    0x66 => 'Microsoft DSAT', #6
+    0x67 => 'Micorsoft DSAT DISPLAY', #6
+    0x69 => 'Voxware Byte Aligned', #7
+    0x70 => 'Voxware AC8', #7
+    0x71 => 'Voxware AC10', #7
+    0x72 => 'Voxware AC16', #7
+    0x73 => 'Voxware AC20', #7
+    0x74 => 'Voxware MetaVoice', #7
+    0x75 => 'Voxware MetaSound', #7
+    0x76 => 'Voxware RT29HW', #7
+    0x77 => 'Voxware VR12', #7
+    0x78 => 'Voxware VR18', #7
+    0x79 => 'Voxware TQ40', #7
+    0x7a => 'Voxware SC3', #10
+    0x7b => 'Voxware SC3', #10
+    0x80 => 'Soundsoft', #6
+    0x81 => 'Voxware TQ60', #7
+    0x82 => 'Microsoft MSRT24', #7
+    0x83 => 'AT&T G.729A', #7
+    0x84 => 'Motion Pixels MVI MV12', #7
+    0x85 => 'DataFusion G.726', #7
+    0x86 => 'DataFusion GSM610', #7
+    0x88 => 'Iterated Systems Audio', #7
+    0x89 => 'Onlive', #7
+    0x8a => 'Multitude, Inc. FT SX20', #10
+    0x8b => 'Infocom ITS A/S G.721 ADPCM', #10
+    0x8c => 'Convedia G729', #10
+    0x8d => 'Not specified congruency, Inc.', #10
+    0x91 => 'Siemens SBC24', #7
+    0x92 => 'Sonic Foundry Dolby AC3 APDIF', #7
+    0x93 => 'MediaSonic G.723', #8
+    0x94 => 'Aculab Prosody 8kbps', #8
+    0x97 => 'ZyXEL ADPCM', #7,
+    0x98 => 'Philips LPCBB', #7
+    0x99 => 'Studer Professional Audio Packed', #7
+    0xa0 => 'Malden PhonyTalk', #8
+    0xa1 => 'Racal Recorder GSM', #10
+    0xa2 => 'Racal Recorder G720.a', #10
+    0xa3 => 'Racal G723.1', #10
+    0xa4 => 'Racal Tetra ACELP', #10
+    0xb0 => 'NEC AAC NEC Corporation', #10
+    0xff => 'AAC', #10
+    0x100 => 'Rhetorex ADPCM', #6
+    0x101 => 'IBM u-Law', #3
+    0x102 => 'IBM a-Law', #3
+    0x103 => 'IBM ADPCM', #3
+    0x111 => 'Vivo G.723', #7
+    0x112 => 'Vivo Siren', #7
+    0x120 => 'Philips Speech Processing CELP', #10
+    0x121 => 'Philips Speech Processing GRUNDIG', #10
+    0x123 => 'Digital G.723', #7
+    0x125 => 'Sanyo LD ADPCM', #8
+    0x130 => 'Sipro Lab ACEPLNET', #8
+    0x131 => 'Sipro Lab ACELP4800', #8
+    0x132 => 'Sipro Lab ACELP8V3', #8
+    0x133 => 'Sipro Lab G.729', #8
+    0x134 => 'Sipro Lab G.729A', #8
+    0x135 => 'Sipro Lab Kelvin', #8
+    0x136 => 'VoiceAge AMR', #10
+    0x140 => 'Dictaphone G.726 ADPCM', #8
+    0x150 => 'Qualcomm PureVoice', #8
+    0x151 => 'Qualcomm HalfRate', #8
+    0x155 => 'Ring Zero Systems TUBGSM', #8
+    0x160 => 'Microsoft Audio1', #8
+    0x161 => 'Windows Media Audio V2 V7 V8 V9 / DivX audio (WMA) / Alex AC3 Audio', #10
+    0x162 => 'Windows Media Audio Professional V9', #10
+    0x163 => 'Windows Media Audio Lossless V9', #10
+    0x164 => 'WMA Pro over S/PDIF', #10
+    0x170 => 'UNISYS NAP ADPCM', #10
+    0x171 => 'UNISYS NAP ULAW', #10
+    0x172 => 'UNISYS NAP ALAW', #10
+    0x173 => 'UNISYS NAP 16K', #10
+    0x174 => 'MM SYCOM ACM SYC008 SyCom Technologies', #10
+    0x175 => 'MM SYCOM ACM SYC701 G726L SyCom Technologies', #10
+    0x176 => 'MM SYCOM ACM SYC701 CELP54 SyCom Technologies', #10
+    0x177 => 'MM SYCOM ACM SYC701 CELP68 SyCom Technologies', #10
+    0x178 => 'Knowledge Adventure ADPCM', #10
+    0x180 => 'Fraunhofer IIS MPEG2AAC', #10
+    0x190 => 'Digital Theater Systems DTS DS', #10
+    0x200 => 'Creative Labs ADPCM', #6
+    0x202 => 'Creative Labs FASTSPEECH8', #6
+    0x203 => 'Creative Labs FASTSPEECH10', #6
+    0x210 => 'UHER ADPCM', #8
+    0x215 => 'Ulead DV ACM', #10
+    0x216 => 'Ulead DV ACM', #10
+    0x220 => 'Quarterdeck Corp.', #6
+    0x230 => 'I-Link VC', #8
+    0x240 => 'Aureal Semiconductor Raw Sport', #8
+    0x241 => 'ESST AC3', #10
+    0x250 => 'Interactive Products HSX', #8
+    0x251 => 'Interactive Products RPELP', #8
+    0x260 => 'Consistent CS2', #8
+    0x270 => 'Sony SCX', #8
+    0x271 => 'Sony SCY', #10
+    0x272 => 'Sony ATRAC3', #10
+    0x273 => 'Sony SPC', #10
+    0x280 => 'TELUM Telum Inc.', #10
+    0x281 => 'TELUMIA Telum Inc.', #10
+    0x285 => 'Norcom Voice Systems ADPCM', #10
+    0x300 => 'Fujitsu FM TOWNS SND', #6
+    0x301 => 'Fujitsu (not specified)', #10
+    0x302 => 'Fujitsu (not specified)', #10
+    0x303 => 'Fujitsu (not specified)', #10
+    0x304 => 'Fujitsu (not specified)', #10
+    0x305 => 'Fujitsu (not specified)', #10
+    0x306 => 'Fujitsu (not specified)', #10
+    0x307 => 'Fujitsu (not specified)', #10
+    0x308 => 'Fujitsu (not specified)', #10
+    0x350 => 'Micronas Semiconductors, Inc. Development', #10
+    0x351 => 'Micronas Semiconductors, Inc. CELP833', #10
+    0x400 => 'Brooktree Digital', #6
+    0x401 => 'Intel Music Coder (IMC)', #10
+    0x402 => 'Ligos Indeo Audio', #10
+    0x450 => 'QDesign Music', #8
+    0x500 => 'On2 VP7 On2 Technologies', #10
+    0x501 => 'On2 VP6 On2 Technologies', #10
+    0x680 => 'AT&T VME VMPCM', #7
+    0x681 => 'AT&T TCP', #8
+    0x700 => 'YMPEG Alpha (dummy for MPEG-2 compressor)', #10
+    0x8ae => 'ClearJump LiteWave (lossless)', #10
+    0x1000 => 'Olivetti GSM', #6
+    0x1001 => 'Olivetti ADPCM', #6
+    0x1002 => 'Olivetti CELP', #6
+    0x1003 => 'Olivetti SBC', #6
+    0x1004 => 'Olivetti OPR', #6
+    0x1100 => 'Lernout & Hauspie', #6
+    0x1101 => 'Lernout & Hauspie CELP codec', #10
+    0x1102 => 'Lernout & Hauspie SBC codec', #10
+    0x1103 => 'Lernout & Hauspie SBC codec', #10
+    0x1104 => 'Lernout & Hauspie SBC codec', #10
+    0x1400 => 'Norris Comm. Inc.', #6
+    0x1401 => 'ISIAudio', #7
+    0x1500 => 'AT&T Soundspace Music Compression', #7
+    0x181c => 'VoxWare RT24 speech codec', #10
+    0x181e => 'Lucent elemedia AX24000P Music codec', #10
+    0x1971 => 'Sonic Foundry LOSSLESS', #10
+    0x1979 => 'Innings Telecom Inc. ADPCM', #10
+    0x1c07 => 'Lucent SX8300P speech codec', #10
+    0x1c0c => 'Lucent SX5363S G.723 compliant codec', #10
+    0x1f03 => 'CUseeMe DigiTalk (ex-Rocwell)', #10
+    0x1fc4 => 'NCT Soft ALF2CD ACM', #10
+    0x2000 => 'FAST Multimedia DVM', #7
+    0x2001 => 'Dolby DTS (Digital Theater System)', #10
+    0x2002 => 'RealAudio 1 / 2 14.4', #10
+    0x2003 => 'RealAudio 1 / 2 28.8', #10
+    0x2004 => 'RealAudio G2 / 8 Cook (low bitrate)', #10
+    0x2005 => 'RealAudio 3 / 4 / 5 Music (DNET)', #10
+    0x2006 => 'RealAudio 10 AAC (RAAC)', #10
+    0x2007 => 'RealAudio 10 AAC+ (RACP)', #10
+    0x2500 => 'Reserved range to 0x2600 Microsoft', #10
+    0x3313 => 'makeAVIS (ffvfw fake AVI sound from AviSynth scripts)', #10
+    0x4143 => 'Divio MPEG-4 AAC audio', #10
+    0x4201 => 'Nokia adaptive multirate', #10
+    0x4243 => 'Divio G726 Divio, Inc.', #10
+    0x434c => 'LEAD Speech', #10
+    0x564c => 'LEAD Vorbis', #10
+    0x5756 => 'WavPack Audio', #10
+    0x674f => 'Ogg Vorbis (mode 1)', #10
+    0x6750 => 'Ogg Vorbis (mode 2)', #10
+    0x6751 => 'Ogg Vorbis (mode 3)', #10
+    0x676f => 'Ogg Vorbis (mode 1+)', #10
+    0x6770 => 'Ogg Vorbis (mode 2+)', #10
+    0x6771 => 'Ogg Vorbis (mode 3+)', #10
+    0x7000 => '3COM NBX 3Com Corporation', #10
+    0x706d => 'FAAD AAC', #10
+    0x7a21 => 'GSM-AMR (CBR, no SID)', #10
+    0x7a22 => 'GSM-AMR (VBR, including SID)', #10
+    0xa100 => 'Comverse Infosys Ltd. G723 1', #10
+    0xa101 => 'Comverse Infosys Ltd. AVQSBC', #10
+    0xa102 => 'Comverse Infosys Ltd. OLDSBC', #10
+    0xa103 => 'Symbol Technologies G729A', #10
+    0xa104 => 'VoiceAge AMR WB VoiceAge Corporation', #10
+    0xa105 => 'Ingenient Technologies Inc. G726', #10
+    0xa106 => 'ISO/MPEG-4 advanced audio Coding', #10
+    0xa107 => 'Encore Software Ltd G726', #10
+    0xa109 => 'Speex ACM Codec xiph.org', #10
+    0xdfac => 'DebugMode SonicFoundry Vegas FrameServer ACM Codec', #10
+    0xe708 => 'Unknown -', #10
+    0xf1ac => 'Free Lossless Audio Codec FLAC', #10
+    0xfffe => 'Extensible', #7
+    0xffff => 'Development', #4
+);
+
+# RIFF info
+%Image::ExifTool::RIFF::Main = (
+    PROCESS_PROC => \&Image::ExifTool::RIFF::ProcessChunks,
+    NOTES => q{
+        The RIFF container format is used various types of fines including WAV, AVI
+        and WEBP.  According to the EXIF specification, Meta information is embedded
+        in two types of RIFF C<LIST> chunks: C<INFO> and C<exif>, and information
+        about the audio content is stored in the C<fmt > chunk.  As well as this
+        information, some video information and proprietary manufacturer-specific
+        information is also extracted.
+    },
+   'fmt ' => {
+        Name => 'AudioFormat',
+        SubDirectory => { TagTable => 'Image::ExifTool::RIFF::AudioFormat' },
+    },
+   'bext' => {
+        Name => 'BroadcastExtension',
+        SubDirectory => { TagTable => 'Image::ExifTool::RIFF::BroadcastExt' },
+    },
+    LIST_INFO => {
+        Name => 'Info',
+        SubDirectory => { TagTable => 'Image::ExifTool::RIFF::Info' },
+    },
+    LIST_exif => {
+        Name => 'Exif',
+        SubDirectory => { TagTable => 'Image::ExifTool::RIFF::Exif' },
+    },
+    LIST_hdrl => { # AVI header LIST chunk
+        Name => 'Hdrl',
+        SubDirectory => { TagTable => 'Image::ExifTool::RIFF::Hdrl' },
+    },
+    LIST_Tdat => { #PH (Adobe CS3 Bridge)
+        Name => 'Tdat',
+        SubDirectory => { TagTable => 'Image::ExifTool::RIFF::Tdat' },
+    },
+    LIST_ncdt => { #PH (Nikon metadata)
+        Name => 'NikonData',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Nikon::AVI',
+            # define ProcessProc here so we don't need to load RIFF.pm from Nikon.pm
+            ProcessProc => \&Image::ExifTool::RIFF::ProcessChunks,
+        },
+    },
+    LIST_hydt => { #PH (Pentax metadata)
+        Name => 'PentaxData',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Pentax::AVI',
+            ProcessProc => \&Image::ExifTool::RIFF::ProcessChunks,
+        },
+    },
+    JUNK => [
+        {
+            Name => 'OlympusJunk',
+            Condition => '$$valPt =~ /^OLYMDigital Camera/',
+            SubDirectory => { TagTable => 'Image::ExifTool::Olympus::AVI' },
+        },
+        {
+            Name => 'CasioJunk',
+            Condition => '$$valPt =~ /^QVMI/',
+            # Casio stores standard EXIF-format information in AVI videos (EX-S600)
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Exif::Main',
+                DirName => 'IFD0',
+                Multi => 0, # (IFD1 is not written)
+                Start => 10,
+                ByteOrder => 'BigEndian',
+            },
+        },
+        {
+            Name => 'RicohJunk',
+            # the Ricoh Caplio GX stores sub-chunks in here
+            Condition => '$$valPt =~ /^ucmt/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Ricoh::AVI',
+                ProcessProc => \&Image::ExifTool::RIFF::ProcessChunks,
+            },
+        },
+        {
+            Name => 'PentaxJunk', # (Optio RS1000)
+            Condition => '$$valPt =~ /^IIII\x01\0/',
+            SubDirectory => { TagTable => 'Image::ExifTool::Pentax::Junk' },
+        },
+        {
+            Name => 'TextJunk',
+            # try to interpret unknown junk as an ASCII string
+            RawConv => '$val =~ /^([^\0-\x1f\x7f-\xff]+)\0*$/ ? $1 : undef',
+        }
+    ],
+    _PMX => { #PH (Adobe CS3 Bridge)
+        Name => 'XMP',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' },
+    },
+    JUNQ => { #PH (Adobe CS3 Bridge)
+        # old XMP is preserved when metadata is replaced in Bridge
+        Name => 'OldXMP',
+        Binary => 1,
+    },
+    olym => {
+        Name => 'Olym',
+        SubDirectory => { TagTable => 'Image::ExifTool::Olympus::WAV' },
+    },
+);
+
+# the maker notes used by some digital cameras
+%Image::ExifTool::RIFF::Junk = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Audio' },
+);
+
+# Format and Audio Stream Format chunk data
+%Image::ExifTool::RIFF::AudioFormat = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Audio' },
+    FORMAT => 'int16u',
+    0 => {
+        Name => 'Encoding',
+        PrintHex => 1,
+        PrintConv => \%Image::ExifTool::RIFF::audioEncoding,
+        SeparateTable => 'AudioEncoding',
+    },
+    1 => 'NumChannels',
+    2 => {
+        Name => 'SampleRate',
+        Format => 'int32u',
+    },
+    4 => {
+        Name => 'AvgBytesPerSec',
+        Format => 'int32u',
+    },
+   # uninteresting
+   # 6 => 'BlockAlignment',
+    7 => 'BitsPerSample',
+);
+
+# Broadcast Audio Extension 'bext' information (ref 13)
+%Image::ExifTool::RIFF::BroadcastExt = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Audio' },
+    NOTES => q{
+        Information found in the Broadcast Audio Extension chunk (see
+        L<http://tech.ebu.ch/docs/tech/tech3285.pdf>).
+    },
+    0 => {
+        Name => 'Description',
+        Format => 'string[256]',
+    },
+    256 => {
+        Name => 'Originator',
+        Format => 'string[32]',
+    },
+    288 => {
+        Name => 'OriginatorReference',
+        Format => 'string[32]',
+    },
+    320 => {
+        Name => 'DateTimeOriginal',
+        Description => 'Date/Time Original',
+        Groups => { 2 => 'Time' },
+        Format => 'string[18]',
+        ValueConv => '$_=$val; tr/-/:/; s/^(\d{4}:\d{2}:\d{2})/$1 /; $_',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    338 => {
+        Name => 'TimeReference',
+        Notes => 'first sample count since midnight',
+        Format => 'int32u[2]',
+        ValueConv => 'my @v=split(" ",$val); $v[0] + $v[1] * 4294967296',
+    },
+    346 => {
+        Name => 'BWFVersion',
+        Format => 'int16u',
+    },
+    # 348 - int8u[64] - SMPTE 330M UMID (Unique Material Identifier)
+    # 412 - int8u[190] - reserved
+    602 => {
+        Name => 'CodingHistory',
+        Format => 'string[$size-602]',
+    },
+);
+
+# Sub chunks of INFO LIST chunk
+%Image::ExifTool::RIFF::Info = (
+    PROCESS_PROC => \&Image::ExifTool::RIFF::ProcessChunks,
+    GROUPS => { 2 => 'Audio' },
+    NOTES => q{
+        RIFF INFO tags found in WAV audio and AVI video files.  Tags which are part
+        of the EXIF 2.3 specification have an underlined Tag Name in the HTML
+        version of this documentation.  Other tags are found in AVI files generated
+        by some software.
+    },
+    IARL => 'ArchivalLocation',
+    IART => { Name => 'Artist',    Groups => { 2 => 'Author' } },
+    ICMS => 'Commissioned',
+    ICMT => 'Comment',
+    ICOP => { Name => 'Copyright', Groups => { 2 => 'Author' } },
+    ICRD => {
+        Name => 'DateCreated',
+        Groups => { 2 => 'Time' },
+        ValueConv => '$_=$val; s/-/:/g; $_',
+    },
+    ICRP => 'Cropped',
+    IDIM => 'Dimensions',
+    IDPI => 'DotsPerInch',
+    IENG => 'Engineer',
+    IGNR => 'Genre',
+    IKEY => 'Keywords',
+    ILGT => 'Lightness',
+    IMED => 'Medium',
+    INAM => 'Title',
+    IPLT => 'NumColors',
+    IPRD => 'Product',
+    ISBJ => 'Subject',
+    ISFT => {
+        Name => 'Software',
+        # remove trailing nulls/spaces and split at first null
+        # (Casio writes "CASIO" in unicode after the first null)
+        ValueConv => '$_=$val; s/(\s*\0)+$//; s/(\s*\0)/, /; s/\0+//g; $_',
+    },
+    ISHP => 'Sharpness',
+    ISRC => 'Source',
+    ISRF => 'SourceForm',
+    ITCH => 'Technician',
+#
+# 3rd party tags
+#
+    # internet movie database (ref 12)
+    ISGN => 'SecondaryGenre',
+    IWRI => 'WrittenBy',
+    IPRO => 'ProducedBy',
+    ICNM => 'Cinematographer',
+    IPDS => 'ProductionDesigner',
+    IEDT => 'EditedBy',
+    ICDS => 'CostumeDesigner',
+    IMUS => 'MusicBy',
+    ISTD => 'ProductionStudio',
+    IDST => 'DistributedBy',
+    ICNT => 'Country',
+    ILNG => 'Language',
+    IRTD => 'Rating',
+    ISTR => 'Starring',
+    # MovieID (ref12)
+    TITL => 'Title',
+    DIRC => 'Directory',
+    YEAR => 'Year',
+    GENR => 'Genre',
+    COMM => 'Comments',
+    LANG => 'Language',
+    AGES => 'Rated',
+    STAR => 'Starring',
+    CODE => 'EncodedBy',
+    PRT1 => 'Part',
+    PRT2 => 'NumberOfParts',
+    # Morgan Multimedia INFO tags (ref 12)
+    IAS1 => 'FirstLanguage',
+    IAS2 => 'SecondLanguage',
+    IAS3 => 'ThirdLanguage',
+    IAS4 => 'FourthLanguage',
+    IAS5 => 'FifthLanguage',
+    IAS6 => 'SixthLanguage',
+    IAS7 => 'SeventhLanguage',
+    IAS8 => 'EighthLanguage',
+    IAS9 => 'NinthLanguage',
+    ICAS => 'DefaultAudioStream',
+    IBSU => 'BaseURL',
+    ILGU => 'LogoURL',
+    ILIU => 'LogoIconURL',
+    IWMU => 'WatermarkURL',
+    IMIU => 'MoreInfoURL',
+    IMBI => 'MoreInfoBannerImage',
+    IMBU => 'MoreInfoBannerURL',
+    IMIT => 'MoreInfoText',
+    # GSpot INFO tags (ref 12)
+    IENC => 'EncodedBy',
+    IRIP => 'RippedBy',
+    # Sound Forge Pro tags
+    DISP => 'SoundSchemeTitle',
+    TLEN => { Name => 'Length', ValueConv => '$val/1000', PrintConv => '"$val s"' },
+    TRCK => 'TrackNumber',
+    TURL => 'URL',
+    TVER => 'Version',
+    LOCA => 'Location',
+    TORG => 'Organization',
+    # Sony Vegas AVI tags, also used by SCLive and Adobe Premier (ref 11)
+    TAPE => {
+        Name => 'TapeName',
+        Groups => { 2 => 'Video' },
+    },
+    TCOD => {
+        Name => 'StartTimecode',
+        # this is the tape time code for the start of the video
+        Groups => { 2 => 'Video' },
+        ValueConv => '$val * 1e-7',
+        PrintConv => \&ConvertTimecode,
+    },
+    TCDO => {
+        Name => 'EndTimecode',
+        Groups => { 2 => 'Video' },
+        ValueConv => '$val * 1e-7',
+        PrintConv => \&ConvertTimecode,
+    },
+    VMAJ => {
+        Name => 'VegasVersionMajor',
+        Groups => { 2 => 'Video' },
+    },
+    VMIN => {
+        Name => 'VegasVersionMinor',
+        Groups => { 2 => 'Video' },
+    },
+    CMNT => {
+        Name => 'Comment',
+        Groups => { 2 => 'Video' },
+    },
+    RATE => {
+        Name => 'Rate', #? (video? units?)
+        Groups => { 2 => 'Video' },
+    },
+    STAT => {
+        Name => 'Statistics',
+        Groups => { 2 => 'Video' },
+        # ("7318 0 3.430307 1", "0 0 3500.000000 1", "7 0 3.433228 1")
+        PrintConv => [
+            '"$val frames captured"',
+            '"$val dropped"',
+            '"Data rate $val"',
+            { 0 => 'Bad', 1 => 'OK' }, # capture OK?
+        ],
+    },
+    DTIM => {
+        Name => 'DateTimeOriginal',
+        Description => 'Date/Time Original',
+        Groups => { 2 => 'Time' },
+        ValueConv => q{
+            my @v = split ' ', $val;
+            return undef unless @v == 2;
+            # get time in seconds
+            $val = 1e-7 * ($v[0] * 4294967296 + $v[1]);
+            # shift from Jan 1, 1601 to Jan 1, 1970
+            $val -= 134774 * 24 * 3600 if $val != 0;
+            return Image::ExifTool::ConvertUnixTime($val);
+        },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+);
+
+# Sub chunks of EXIF LIST chunk
+%Image::ExifTool::RIFF::Exif = (
+    PROCESS_PROC => \&Image::ExifTool::RIFF::ProcessChunks,
+    GROUPS => { 2 => 'Audio' },
+    NOTES => 'These tags are part of the EXIF 2.3 specification for WAV audio files.',
+    ever => 'ExifVersion',
+    erel => 'RelatedImageFile',
+    etim => { Name => 'TimeCreated', Groups => { 2 => 'Time' } },
+    ecor => { Name => 'Make',        Groups => { 2 => 'Camera' } },
+    emdl => { Name => 'Model',       Groups => { 2 => 'Camera' } },
+    emnt => { Name => 'MakerNotes',  Binary => 1 },
+    eucm => {
+        Name => 'UserComment',
+        PrintConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val)',
+    },
+);
+
+# Sub chunks of hdrl LIST chunk
+%Image::ExifTool::RIFF::Hdrl = (
+    PROCESS_PROC => \&Image::ExifTool::RIFF::ProcessChunks,
+    GROUPS => { 2 => 'Image' },
+    avih => {
+        Name => 'AVIHeader',
+        SubDirectory => { TagTable => 'Image::ExifTool::RIFF::AVIHeader' },
+    },
+    IDIT => {
+        Name => 'DateTimeOriginal',
+        Description => 'Date/Time Original',
+        Groups => { 2 => 'Time' },
+        ValueConv => 'Image::ExifTool::RIFF::ConvertRIFFDate($val)',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    ISMP => 'Timecode',
+    LIST_strl => {
+        Name => 'Stream',
+        SubDirectory => { TagTable => 'Image::ExifTool::RIFF::Stream' },
+    },
+    LIST_odml => {
+        Name => 'OpenDML',
+        SubDirectory => { TagTable => 'Image::ExifTool::RIFF::OpenDML' },
+    },
+);
+
+# Sub chunks of Tdat LIST chunk (ref PH)
+%Image::ExifTool::RIFF::Tdat = (
+    PROCESS_PROC => \&Image::ExifTool::RIFF::ProcessChunks,
+    GROUPS => { 2 => 'Video' },
+    # (have seen tc_O, tc_A, rn_O and rn_A)
+);
+
+%Image::ExifTool::RIFF::AVIHeader = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Video' },
+    FORMAT => 'int32u',
+    FIRST_ENTRY => 0,
+    0 => {
+        Name => 'FrameRate',
+        # (must use RawConv because raw value used in Composite tag)
+        RawConv => '$val ? 1e6 / $val : undef',
+        PrintConv => 'int($val * 1000 + 0.5) / 1000',
+    },
+    1 => {
+        Name => 'MaxDataRate',
+        PrintConv => 'sprintf("%.4g kB/s",$val / 1024)',
+    },
+  # 2 => 'PaddingGranularity',
+  # 3 => 'Flags',
+    4 => 'FrameCount',
+  # 5 => 'InitialFrames',
+    6 => 'StreamCount',
+  # 7 => 'SuggestedBufferSize',
+    8 => 'ImageWidth',
+    9 => 'ImageHeight',
+);
+
+%Image::ExifTool::RIFF::Stream = (
+    PROCESS_PROC => \&Image::ExifTool::RIFF::ProcessChunks,
+    GROUPS => { 2 => 'Image' },
+    strh => {
+        Name => 'StreamHeader',
+        SubDirectory => { TagTable => 'Image::ExifTool::RIFF::StreamHeader' },
+    },
+    strn => 'StreamName',
+    strd => { #PH
+        Name => 'StreamData',
+        SubDirectory => { TagTable => 'Image::ExifTool::RIFF::StreamData' },
+    },
+    strf => [
+        {
+            Name => 'AudioFormat',
+            Condition => '$Image::ExifTool::RIFF::streamType eq "auds"',
+            SubDirectory => { TagTable => 'Image::ExifTool::RIFF::AudioFormat' },
+        },
+        {
+            Name => 'VideoFormat',
+            Condition => '$Image::ExifTool::RIFF::streamType eq "vids"',
+            SubDirectory => { TagTable => 'Image::ExifTool::BMP::Main' },
+        },
+    ],
+);
+
+# Open DML tags (ref http://www.morgan-multimedia.com/download/odmlff2.pdf)
+%Image::ExifTool::RIFF::OpenDML = (
+    PROCESS_PROC => \&Image::ExifTool::RIFF::ProcessChunks,
+    GROUPS => { 2 => 'Video' },
+    dmlh => {
+        Name => 'ExtendedAVIHeader',
+        SubDirectory => { TagTable => 'Image::ExifTool::RIFF::ExtAVIHdr' },
+    },
+);
+
+# Extended AVI Header tags (ref http://www.morgan-multimedia.com/download/odmlff2.pdf)
+%Image::ExifTool::RIFF::ExtAVIHdr = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Video' },
+    FORMAT => 'int32u',
+    0 => 'TotalFrameCount',
+);
+
+%Image::ExifTool::RIFF::StreamHeader = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Video' },
+    FORMAT => 'int32u',
+    FIRST_ENTRY => 0,
+    PRIORITY => 0,  # so we get values from the first stream
+    0 => {
+        Name => 'StreamType',
+        Format => 'string[4]',
+        RawConv => '$Image::ExifTool::RIFF::streamType = $val',
+        PrintConv => {
+            auds => 'Audio',
+            mids => 'MIDI',
+            txts => 'Text',
+            vids => 'Video',
+        },
+    },
+    1 => [
+        {
+            Name => 'AudioCodec',
+            Condition => '$Image::ExifTool::RIFF::streamType eq "auds"',
+            Format => 'string[4]',
+        },
+        {
+            Name => 'VideoCodec',
+            Condition => '$Image::ExifTool::RIFF::streamType eq "vids"',
+            Format => 'string[4]',
+        },
+        {
+            Name => 'Codec',
+            Format => 'string[4]',
+        },
+    ],
+  # 2 => 'StreamFlags',
+  # 3 => 'StreamPriority',
+  # 3.5 => 'Language',
+  # 4 => 'InitialFrames',
+    5 => [
+        {
+            Name => 'AudioSampleRate',
+            Condition => '$Image::ExifTool::RIFF::streamType eq "auds"',
+            Format => 'rational64u',
+            ValueConv => '$val ? 1/$val : 0',
+            PrintConv => 'int($val * 100 + 0.5) / 100',
+        },
+        {
+            Name => 'VideoFrameRate',
+            Condition => '$Image::ExifTool::RIFF::streamType eq "vids"',
+            Format => 'rational64u',
+            # (must use RawConv because raw value used in Composite tag)
+            RawConv => '$val ? 1/$val : undef',
+            PrintConv => 'int($val * 1000 + 0.5) / 1000',
+        },
+        {
+            Name => 'StreamSampleRate',
+            Format => 'rational64u',
+            ValueConv => '$val ? 1/$val : 0',
+            PrintConv => 'int($val * 1000 + 0.5) / 1000',
+        },
+    ],
+  # 7 => 'Start',
+    8 => [
+        {
+            Name => 'AudioSampleCount',
+            Condition => '$Image::ExifTool::RIFF::streamType eq "auds"',
+        },
+        {
+            Name => 'VideoFrameCount',
+            Condition => '$Image::ExifTool::RIFF::streamType eq "vids"',
+        },
+        {
+            Name => 'StreamSampleCount',
+        },
+    ],
+  # 9 => 'SuggestedBufferSize',
+    10 => {
+        Name => 'Quality',
+        PrintConv => '$val eq 0xffffffff ? "Default" : $val',
+    },
+    11 => {
+        Name => 'SampleSize',
+        PrintConv => '$val ? "$val byte" . ($val==1 ? "" : "s") : "Variable"',
+    },
+  # 12 => { Name => 'Frame', Format => 'int16u[4]' },
+);
+
+%Image::ExifTool::RIFF::StreamData = ( #PH
+    PROCESS_PROC => \&Image::ExifTool::RIFF::ProcessStreamData,
+    GROUPS => { 2 => 'Video' },
+    NOTES => q{
+        This chunk is used to store proprietary information in AVI videos from some
+        cameras.  The first 4 characters of the data are used as the Tag ID below.
+    },
+    AVIF => {
+        Name => 'AVIF',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Exif::Main',
+            DirName => 'IFD0',
+            Start => 8,
+            ByteOrder => 'LittleEndian',
+        },
+    },
+    CASI => { # (used by Casio GV-10)
+        Name => 'CasioData',
+        SubDirectory => { TagTable => 'Image::ExifTool::Casio::AVI' },
+    },
+    Zora => 'VendorName',   # (Samsung PL90 AVI files)
+    unknown => {
+        Name => 'UnknownData',
+        # try to interpret unknown stream data as a string
+        RawConv => '$_=$val; /^[^\0-\x1f\x7f-\xff]+$/ ? $_ : undef',
+    },
+);
+
+# RIFF composite tags
+%Image::ExifTool::RIFF::Composite = (
+    Duration => {
+        Require => {
+            0 => 'RIFF:FrameRate',
+            1 => 'RIFF:FrameCount',
+        },
+        Desire => {
+            2 => 'VideoFrameRate',
+            3 => 'VideoFrameCount',
+        },
+        # this is annoying.  Apparently (although I couldn't verify this), FrameCount
+        # in the RIFF header includes multiple video tracks if they exist (ie. with the
+        # FujiFilm REAL 3D AVI's), but the video stream information isn't reliable for
+        # some cameras (ie. Olympus FE models), so use the video stream information
+        # only if the RIFF header duration is 2 to 3 times longer
+        RawConv => q {
+            my ($dur1, $dur2);
+            $dur1 = $val[1] / $val[0] if $val[0];
+            return $dur1 unless $val[2] and $val[3];
+            $dur2 = $val[3] / $val[2];
+            my $rat = $dur1 / $dur2;
+            return ($rat > 1.9 and $rat < 3.1) ? $dur2 : $dur1;
+        },
+        PrintConv => 'ConvertDuration($val)',
+    },
+    Duration2 => {
+        Name => 'Duration',
+        Require => {
+            0 => 'RIFF:AvgBytesPerSec',
+            1 => 'FileSize',
+        },
+        Desire => {
+            # check FrameCount because this calculation only applies
+            # to audio-only files (ie. WAV)
+            2 => 'FrameCount',
+            3 => 'VideoFrameCount',
+        },
+        RawConv => '($val[0] and not ($val[2] or $val[3])) ? $val[1] / $val[0] : undef',
+        PrintConv => 'ConvertDuration($val)',
+    },
+);
+
+# add our composite tags
+Image::ExifTool::AddCompositeTags('Image::ExifTool::RIFF');
+
+
+#------------------------------------------------------------------------------
+# Convert RIFF date to EXIF format
+my %monthNum = (
+    Jan=>1, Feb=>2, Mar=>3, Apr=>4, May=>5, Jun=>6,
+    Jul=>7, Aug=>8, Sep=>9, Oct=>10,Nov=>11,Dec=>12
+);
+sub ConvertRIFFDate($)
+{
+    my $val = shift;
+    my @part = split ' ', $val;
+    my $mon;
+    if (@part >= 5 and $mon = $monthNum{ucfirst(lc($part[1]))}) {
+        # the standard AVI date format (ie. "Mon Mar 10 15:04:43 2003")
+        $val = sprintf("%.4d:%.2d:%.2d %s", $part[4],
+                       $mon, $part[2], $part[3]);
+    } elsif ($val =~ m{(\d{4})/\s*(\d+)/\s*(\d+)/?\s+(\d+):\s*(\d+)\s*(P?)}) {
+        # but the Casio QV-3EX writes dates like "2001/ 1/27  1:42PM",
+        # and the Casio EX-Z30 writes "2005/11/28/ 09:19"... doh!
+        $val = sprintf("%.4d:%.2d:%.2d %.2d:%.2d:00",$1,$2,$3,$4+($6?12:0),$5);
+    }
+    return $val;
+}
+
+#------------------------------------------------------------------------------
+# Print time
+# Inputs: 0) time in seconds
+# Returns: time string
+sub ConvertTimecode($)
+{
+    my $val = shift;
+    my $hr = int($val / 3600);
+    $val -= $hr * 3600;
+    my $min = int($val / 60);
+    $val -= $min * 60;
+    return sprintf("%d:%.2d:%05.2f", $hr, $min, $val);
+}
+
+#------------------------------------------------------------------------------
+# Process stream data
+# Inputs: 0) ExifTool object ref, 1) dirInfo reference, 2) tag table ref
+# Returns: 1 on success
+sub ProcessStreamData($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $start = $$dirInfo{DirStart};
+    my $size = $$dirInfo{DirLen};
+    return 0 if $size < 4;
+    if ($exifTool->Options('Verbose')) {
+        $exifTool->VerboseDir($$dirInfo{DirName}, 0, $size);
+    }
+    my $tag = substr($$dataPt, $start, 4);
+    my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+    unless ($tagInfo) {
+        $tagInfo = $exifTool->GetTagInfo($tagTablePtr, 'unknown');
+        return 1 unless $tagInfo;
+    }
+    my $subdir = $$tagInfo{SubDirectory};
+    if ($$tagInfo{SubDirectory}) {
+        my $offset = $$subdir{Start} || 0;
+        my $baseShift = $$dirInfo{DataPos} + $$dirInfo{DirStart} + $offset;
+        my %subdirInfo = (
+            DataPt  => $dataPt,
+            DataPos => $$dirInfo{DataPos} - $baseShift,
+            Base    => ($$dirInfo{Base} || 0) + $baseShift,
+            DataLen => $$dirInfo{DataLen},
+            DirStart=> $$dirInfo{DirStart} + $offset,
+            DirLen  => $$dirInfo{DirLen} - $offset,
+            DirName => $$subdir{DirName},
+            Parent  => $$dirInfo{DirName},
+        );
+        unless ($offset) {
+            # allow processing of 2nd directory at the same address
+            my $addr = $subdirInfo{DirStart} + $subdirInfo{DataPos} + $subdirInfo{Base};
+            delete $exifTool->{PROCESSED}->{$addr}
+        }
+        # (we could set FIRST_EXIF_POS to $subdirInfo{Base} here to make
+        #  htmlDump offsets relative to EXIF base if we wanted...)
+        my $subTable = GetTagTable($$subdir{TagTable});
+        $exifTool->ProcessDirectory(\%subdirInfo, $subTable);
+    } else {
+        $exifTool->HandleTag($tagTablePtr, $tag, undef,
+            DataPt  => $dataPt,
+            DataPos => $$dirInfo{DataPos},
+            Start   => $start,
+            Size    => $size,
+            TagInfo => $tagInfo,
+        );
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Process RIFF chunks
+# Inputs: 0) ExifTool object reference, 1) directory information reference
+#         2) tag table reference
+# Returns: 1 on success
+sub ProcessChunks($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $start = $$dirInfo{DirStart};
+    my $size = $$dirInfo{DirLen};
+    my $end = $start + $size;
+    my $base = $$dirInfo{Base};
+
+    if ($exifTool->Options('Verbose')) {
+        $exifTool->VerboseDir($$dirInfo{DirName}, 0, $size);
+    }
+    while ($start + 8 < $end) {
+        my $tag = substr($$dataPt, $start, 4);
+        my $len = Get32u($dataPt, $start + 4);
+        $start += 8;
+        if ($start + $len > $end) {
+            $exifTool->Warn("Bad $tag chunk");
+            return 0;
+        }
+        if ($tag eq 'LIST' and $len >= 4) {
+            $tag .= '_' . substr($$dataPt, $start, 4);
+            $len -= 4;
+            $start += 4;
+        }
+        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        my $baseShift = 0;
+        my $val;
+        if ($tagInfo) {
+            if ($$tagInfo{SubDirectory}) {
+                # adjust base if necessary (needed for Ricoh maker notes)
+                my $newBase = $tagInfo->{SubDirectory}{Base};
+                if (defined $newBase) {
+                    # different than your average Base eval...
+                    # here we use an absolute $start address
+                    $start += $base;
+                    #### eval Base ($start)
+                    $newBase = eval $newBase;
+                    $baseShift = $newBase - $base;
+                    $start -= $base;
+                }
+            } elsif (not $$tagInfo{Binary}) {
+                $val = substr($$dataPt, $start, $len);
+                $val =~ s/\0+$//;   # remove trailing nulls from strings
+            }
+        }
+        $exifTool->HandleTag($tagTablePtr, $tag, $val,
+            DataPt  => $dataPt,
+            DataPos => $$dirInfo{DataPos} - $baseShift,
+            Start   => $start,
+            Size    => $len,
+            Base    => $base + $baseShift,
+        );
+        ++$len if $len & 0x01;  # must account for padding if odd number of bytes
+        $start += $len;
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Extract information from a RIFF file
+# Inputs: 0) ExifTool object reference, 1) DirInfo reference
+# Returns: 1 on success, 0 if this wasn't a valid RIFF file
+sub ProcessRIFF($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my ($buff, $err);
+    my %types = ( 'WAVE' => 'WAV', 'AVI ' => 'AVI', 'WEBP' => 'WEBP' );
+    my $verbose = $exifTool->Options('Verbose');
+
+    # verify this is a valid RIFF file
+    return 0 unless $raf->Read($buff, 12) == 12;
+    return 0 unless $buff =~ /^RIFF....(.{4})/s;
+    $exifTool->SetFileType($types{$1}); # set type to 'WAV', 'AVI', 'WEBP' or 'RIFF'
+    $Image::ExifTool::RIFF::streamType = '';    # initialize stream type
+    SetByteOrder('II');
+    my $tagTablePtr = GetTagTable('Image::ExifTool::RIFF::Main');
+    my $pos = 12;
+#
+# Read chunks in RIFF image
+#
+    for (;;) {
+        my $num = $raf->Read($buff, 8);
+        if ($num < 8) {
+            $err = 1 if $num;
+            last;
+        }
+        $pos += 8;
+        my ($tag, $len) = unpack('a4V', $buff);
+        # special case: construct new tag name from specific LIST type
+        if ($tag eq 'LIST') {
+            $raf->Read($buff, 4) == 4 or $err=1, last;
+            $pos += 4;
+            $tag .= "_$buff";
+            $len -= 4;  # already read 4 bytes (the LIST type)
+        }
+        $exifTool->VPrint(0, "RIFF '$tag' chunk ($len bytes of data):\n");
+        # stop when we hit the audio data or AVI index or AVI movie data
+        # --> no more because Adobe Bridge stores XMP after this!!
+        # (so now we only do this on the FastScan option)
+        if (($tag eq 'data' or $tag eq 'idx1' or $tag eq 'LIST_movi') and
+            $exifTool->Options('FastScan'))
+        {
+            $exifTool->VPrint(0, "(end of parsing)\n");
+            last;
+        }
+        # RIFF chunks are padded to an even number of bytes
+        my $len2 = $len + ($len & 0x01);
+        if ($$tagTablePtr{$tag} or ($verbose and $tag !~ /^(data|idx1|LIST_movi)$/)) {
+            $raf->Read($buff, $len2) == $len2 or $err=1, last;
+            $exifTool->HandleTag($tagTablePtr, $tag, $buff,
+                DataPt  => \$buff,
+                DataPos => 0,   # (relative to Base)
+                Start   => 0,
+                Size    => $len2,
+                Base    => $pos,
+            );
+        } else {
+            $raf->Seek($len2, 1) or $err=1, last;
+        }
+        $pos += $len2;
+    }
+    $err and $exifTool->Warn('Error reading RIFF file (corrupted?)');
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::RIFF - Read RIFF/WAV/AVI meta information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains routines required by Image::ExifTool to extract
+information from RIFF-based (Resource Interchange File Format) files,
+including Windows WAV audio and AVI video files.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.exif.org/Exif2-2.PDF>
+
+=item L<http://www.vlsi.fi/datasheets/vs1011.pdf>
+
+=item L<http://www.music-center.com.br/spec_rif.htm>
+
+=item L<http://www.codeproject.com/audio/wavefiles.asp>
+
+=item L<http://msdn.microsoft.com/archive/en-us/directx9_c/directx/htm/avirifffilereference.asp>
+
+=item L<http://wiki.multimedia.cx/index.php?title=TwoCC>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/RIFF Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/RSRC.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/RSRC.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/RSRC.pm	(revision 24799)
@@ -0,0 +1,226 @@
+#------------------------------------------------------------------------------
+# File:         RSRC.pm
+#
+# Description:  Read Mac OS Resource information
+#
+# Revisions:    2010/03/17 - P. Harvey Created
+#
+# References:   1) http://developer.apple.com/legacy/mac/library/documentation/mac/MoreToolbox/MoreToolbox-99.html
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::RSRC;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.02';
+
+# Information decoded from Mac OS resources
+%Image::ExifTool::RSRC::Main = (
+    GROUPS => { 2 => 'Document' },
+    NOTES => q{
+        Tags extracted from Mac OS resource files and DFONT files.  These tags may
+        also be extracted from the resource fork of any file in OS X, either by
+        adding "/rsrc" to the filename to process the resource fork alone, or by
+        using the ExtractEmbedded (-ee) option to process the resource fork as a
+        sub-document of the main file.
+    },
+    '8BIM' => {
+        Name => 'PhotoshopInfo',
+        SubDirectory => { TagTable => 'Image::ExifTool::Photoshop::Main' },
+    },
+    'sfnt' => {
+        Name => 'Font',
+        SubDirectory => { TagTable => 'Image::ExifTool::Font::Name' },
+    },
+    'usro_0x0000' => 'OpenWithApplication',
+    'vers_0x0001' => 'ApplicationVersion',
+    'STR _0xbff3' => 'ApplicationMissingMsg',
+    'STR _0xbff4' => 'CreatorApplication',
+    # the following written by Photoshop
+    # (ref http://www.adobe.ca/devnet/photoshop/psir/ps_image_resources.pdf)
+    'STR#_0x0080' => 'Keywords',
+    'TEXT_0x0080' => 'Description',
+    # don't extract PICT's because the clip region isn't set properly
+    # in the PICT resource for some reason.  Also, a dummy 512-byte
+    # header would have to be added to create a valid PICT file.
+    # 'PICT' => { Name => 'PreviewPICT', Binary => 1 },
+);
+
+#------------------------------------------------------------------------------
+# Read information from a Mac resource file (ref 1)
+# Inputs: 0) ExifTool ref, 1) dirInfo ref
+# Returns: 1 on success, 0 if this wasn't a valid resource file
+sub ProcessRSRC($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my ($hdr, $map, $buff, $i, $j);
+
+    # attempt to validate the format as thoroughly as practical
+    return 0 unless $raf->Read($hdr, 30) == 30;
+    my ($datOff, $mapOff, $datLen, $mapLen) = unpack('N*', $hdr);
+    return 0 unless $raf->Seek(0, 2);
+    my $fLen = $raf->Tell();
+    return 0 if $datOff < 0x10 or $datOff + $datLen > $fLen;
+    return 0 if $mapOff < 0x10 or $mapOff + $mapLen > $fLen or $mapLen < 30;
+    return 0 if $datOff < $mapOff and $datOff + $datLen > $mapOff;
+    return 0 if $mapOff < $datOff and $mapOff + $mapLen > $datOff;
+
+    # read the resource map
+    $raf->Seek($mapOff, 0) and $raf->Read($map, $mapLen) == $mapLen or return 0;
+    SetByteOrder('MM');
+    my $typeOff = Get16u(\$map, 24);
+    my $nameOff = Get16u(\$map, 26);
+    my $numTypes = Get16u(\$map, 28);
+
+    # validate offsets in the resource map
+    return 0 if $typeOff < 28 or $nameOff < 30;
+
+    $exifTool->SetFileType('RSRC') unless $$exifTool{IN_RESOURCE};
+    my $verbose = $exifTool->Options('Verbose');
+    my $tagTablePtr = GetTagTable('Image::ExifTool::RSRC::Main');
+
+    # parse resource type list
+    for ($i=0; $i<=$numTypes; ++$i) {
+        my $off = $typeOff + 2 + 8 * $i;    # offset of entry in type list
+        last if $off + 8 > $mapLen;
+        my $resType = substr($map,$off,4);  # resource type
+        my $resNum = Get16u(\$map,$off+4);  # number of resources - 1
+        my $refOff = Get16u(\$map,$off+6) + $typeOff; # offset to first resource reference
+        # loop through all resources
+        for ($j=0; $j<=$resNum; ++$j) {
+            my $roff = $refOff + 12 * $j;
+            last if $roff + 12 > $mapLen;
+            # read only the 24-bit resource data offset
+            my $id = Get16u(\$map,$roff);
+            my $resOff = (Get32u(\$map,$roff+4) & 0x00ffffff) + $datOff;
+            my $resNameOff = Get16u(\$map,$roff+2) + $nameOff + $mapOff;
+            my ($tag, $val, $valLen);
+            my $tagInfo = $$tagTablePtr{$resType};
+            if ($tagInfo) {
+                $tag = $resType;
+            } else {
+                $tag = sprintf('%s_0x%.4x', $resType, $id);
+                $tagInfo = $$tagTablePtr{$tag};
+            }
+            # read the resource data if necessary
+            if ($tagInfo or $verbose) {
+                unless ($raf->Seek($resOff, 0) and $raf->Read($buff, 4) == 4 and
+                        ($valLen = unpack('N', $buff)) < 1024000 and # arbitrary size limit
+                        $raf->Read($val, $valLen) == $valLen)
+                {
+                    $exifTool->Warn("Error reading $resType resource");
+                    next;
+                }
+            }
+            if ($verbose) {
+                my ($resName, $nameLen);
+                $resName = '' unless $raf->Seek($resNameOff, 0) and $raf->Read($buff, 1) and
+                    ($nameLen = ord $buff) != 0 and $raf->Read($resName, $nameLen) == $nameLen;
+                $exifTool->VPrint(0,sprintf("$resType resource ID 0x%.4x (offset 0x%.4x, $valLen bytes, name='$resName'):\n", $id, $resOff));
+                $exifTool->VerboseDump(\$val);
+            }
+            next unless $tagInfo;
+            if ($resType eq 'vers') {
+                # parse the 'vers' resource to get the long version string
+                next unless $valLen > 8;
+                # long version string is after short version
+                my $p = 7 + Get8u(\$val, 6);
+                next if $p >= $valLen;
+                my $vlen = Get8u(\$val, $p++);
+                next if $p + $vlen > $valLen;
+                my $tagTablePtr = GetTagTable('Image::ExifTool::RSRC::Main');
+                $val = $exifTool->Decode(substr($val, $p, $vlen), 'MacRoman');
+            } elsif ($resType eq 'sfnt') {
+                # parse the OTF font block
+                $raf->Seek($resOff + 4, 0) or next;
+                $$dirInfo{Base} = $resOff + 4;
+                require Image::ExifTool::Font;
+                unless (Image::ExifTool::Font::ProcessOTF($exifTool, $dirInfo)) {
+                    $exifTool->Warn('Unrecognized sfnt resource format');
+                }
+                $exifTool->OverrideFileType('DFONT');
+                next;
+            } elsif ($resType eq '8BIM') {
+                my $ttPtr = GetTagTable('Image::ExifTool::Photoshop::Main');
+                $exifTool->HandleTag($ttPtr, $id, $val,
+                    DataPt  => \$val,
+                    DataPos => $resOff + 4,
+                    Size    => $valLen,
+                    Start   => 0,
+                    Parent  => 'RSRC',
+                );
+                next;
+            } elsif ($resType eq 'STR ' and $valLen > 1) {
+                # extract Pascal string
+                my $len = ord $val;
+                next unless $valLen >= $len + 1;
+                $val = substr($val, 1, $len);
+            } elsif ($resType eq 'usro' and $valLen > 4) {
+                my $len = unpack('N', $val);
+                next unless $valLen >= $len + 4;
+                ($val = substr($val, 4, $len)) =~ s/\0.*//g; # truncate at null
+            } elsif ($resType eq 'STR#' and $valLen > 2) {
+                # extract list of strings (ref http://simtech.sourceforge.net/tech/strings.html)
+                my $num = unpack('n', $val);
+                next if $num & 0xf000; # (ignore special-format STR# resources)
+                my ($i, @vals);
+                my $pos = 2;
+                for ($i=0; $i<$num; ++$i) {
+                    last if $pos >= $valLen;
+                    my $len = ord substr($val, $pos++, 1);
+                    last if $pos + $len > $valLen;
+                    push @vals, substr($val, $pos, $len);
+                    $pos += $len;
+                }
+                $val = \@vals;
+            } elsif ($resType ne 'TEXT') {
+                next;
+            }
+            $exifTool->HandleTag($tagTablePtr, $tag, $val);
+        }
+    }
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::RSRC - Read Mac OS Resource information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains routines required by Image::ExifTool to read Mac OS
+resource files.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://developer.apple.com/legacy/mac/library/documentation/mac/MoreToolbox/MoreToolbox-99.html>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/RSRC Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/RTF.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/RTF.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/RTF.pm	(revision 24799)
@@ -0,0 +1,383 @@
+#------------------------------------------------------------------------------
+# File:         RTF.pm
+#
+# Description:  Read Rich Text Format meta information
+#
+# Revisions:    2010/06/17 - P. Harvey Created
+#
+# References:   1) http://download.microsoft.com/download/2/f/5/2f599e18-07ee-4ec5-a1e7-f4e6a9423592/Word2007RTFSpec9.doc
+#               2) http://search.cpan.org/dist/RTF-Writer/lib/RTF/Cookbook.pod
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::RTF;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.01';
+
+sub ProcessUserProps($$$);
+
+# supported RTF character entities
+my %rtfEntity = (
+    par       => 0x0a,
+    tab       => 0x09,
+    endash    => 0x2013,
+    emdash    => 0x2014,
+    lquote    => 0x2018,
+    rquote    => 0x2019,
+    ldblquote => 0x201c,
+    rdblquote => 0x201d,
+    bullet    => 0x2022,
+);
+
+# RTF tags (ref 1)
+%Image::ExifTool::RTF::Main = (
+    GROUPS => { 2 => 'Document' },
+    NOTES => q{
+        This table lists standard tags of the RTF information group, but ExifTool
+        will also extract any non-standard tags found in this group.  As well,
+        ExifTool will extract any custom properties that are found.  See
+        L<http://download.microsoft.com/download/2/f/5/2f599e18-07ee-4ec5-a1e7-f4e6a9423592/Word2007RTFSpec9.doc>
+        for the specification.
+    },
+    title    => { },
+    subject  => { },
+    author   => { Groups => { 2 => 'Author' } },
+    manager  => { },
+    company  => { },
+    copyright=> { Groups => { 2 => 'Author' } }, # (written by Apple TextEdit)
+    operator => { Name => 'LastModifiedBy' },
+    category => { },
+    keywords => { },
+    comment  => { },
+    doccomm  => { Name => 'Comments' },
+    hlinkbase=> { Name => 'HyperlinkBase' },
+    creatim  => {
+        Name => 'CreateDate',
+        Format => 'date',
+        Groups => { 2 => 'Time' },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    revtim   => {
+        Name => 'ModifyDate',
+        Format => 'date',
+        Groups => { 2 => 'Time' },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    printim  => {
+        Name => 'LastPrinted',
+        Format => 'date',
+        Groups => { 2 => 'Time' },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    buptim   => {
+        Name => 'BackupTime',
+        Format => 'date',
+        Groups => { 2 => 'Time' },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    edmins   => {
+        Name => 'TotalEditTime', # in minutes
+        PrintConv => 'ConvertTimeSpan($val, 60)',
+    },
+    nofpages => { Name => 'Pages' },
+    nofwords => { Name => 'Words' },
+    nofchars => { Name => 'Characters' },
+    nofcharsws=>{
+        Name => 'CharactersWithSpaces',
+        Notes => q{
+            according to the 2007 Microsoft RTF specification this is clearly the number
+            of characters NOT including spaces, but Microsoft Word writes this as the
+            number WITH spaces, so ExifTool names this tag according to the de facto
+            standard
+        },
+    },
+    id       => { Name => 'InternalIDNumber' },
+    version  => { Name => 'RevisionNumber' },
+    vern     => { Name => 'InternalVersionNumber' },
+);
+
+# lookup for user-defined properties
+# (none are pre-defined and this table doesn't appear in the docs)
+%Image::ExifTool::RTF::UserProps = (
+    GROUPS => { 2 => 'Document' },
+);
+
+#------------------------------------------------------------------------------
+# Read to nested closing curly bracket "}"
+# Inputs: 0) data ref, 1) optional RAF ref to read more data if available
+# Returns: text inside brackets, or undef on error
+# Notes: On entry the current position in the data must be set to immediately
+#        after the command that opens the bracket.  On return the current
+#        position is immediately following the closing brace if the return
+#        value is defined.
+sub ReadToNested($;$)
+{
+    my ($dataPt, $raf) = @_;
+    my $pos = pos $$dataPt;
+    my $level = 1;
+    for (;;) {
+        # look for the next bracket
+        unless ($$dataPt =~ /(\\*)([{}])/g) {
+            # must read some more data
+            my $p = length $$dataPt;
+            my $buff;
+            last unless $raf and $raf->Read($buff, 65536);
+            $$dataPt .= $buff;
+            # rewind position to include any leading backslashes
+            --$p while $p and substr($$dataPt, $p - 1, 1) eq '\\';
+            pos($$dataPt) = $p; # set position to continue search
+            next;
+        }
+        # bracket is escaped if preceded by an odd number of backslashes
+        next if $1 and length($1) & 0x01;
+        $2 eq '{' and ++$level, next;
+        next unless --$level <= 0;
+        return substr($$dataPt, $pos, pos($$dataPt) - $pos - 1);
+    }
+    return undef;
+}
+
+#------------------------------------------------------------------------------
+# Unescape RTF escape sequences
+# Inputs: 0) ExifTool ref, 1) RTF text, 2) RTF character set (for hex characters)
+# Returns: Unescaped text (in current ExifTool Charset)
+sub UnescapeRTF($$$)
+{
+    my ($exifTool, $val, $charset) = @_;
+
+    # return now unless we have a control sequence
+    unless ($val =~ /\\/) {
+        $val =~ tr/\n\r//d; # ignore CR's and LF's
+        return $val;
+    }
+    # CR/LF is signficant if it terminates a control sequence (so change these to a space)
+    $val =~ s/(^|[^\\])((?:\\\\)*)(\\[a-zA-Z]+(?:-?\d+)?)[\n\r]/$1$2$3 /g;
+    # protect the newline control sequence by converting to a \par command
+    $val =~ s/(^|[^\\])((?:\\\\)*)(\\[\n\r])/$1$2\\par /g;
+    # all other CR/LF's are ignored (so delete them)
+    $val =~ tr/\n\r//d;
+
+    my $rtnVal = '';
+    my $len = length $val;
+    my $skip = 1;   # default Unicode skip count
+    my $p0 = 0;
+
+    for (;;) {
+        # find next backslash
+        my $p1 = ($val =~ /\\/g) ? pos($val) : $len + 1;
+        # add text up to start of this control sequence (or up to end)
+        my $n = $p1 - $p0 - 1;
+        $rtnVal .= substr($val, $p0, $n) if $n > 0;
+        # all done if at the end or if control sequence is empty
+        last if $p1 >= $len;
+        # look for an ASCII-letter control word or Unicode control
+        if ($val =~ /\G([a-zA-Z]+)(-?\d+)? ?/g) {
+            # interpret command if recognized
+            if ($1 eq 'uc') {       # \ucN
+                $skip = $2;
+            } elsif ($1 eq 'u') {   # \uN
+                require Image::ExifTool::Charset;
+                $rtnVal .= Image::ExifTool::Charset::Recompose($exifTool, [$2]);
+                if ($skip) {
+                    # must skip the specified number of characters
+                    # (not simple because RTF control words count as a single character)
+                    last unless $val =~ /\G([^\\]|\\([a-zA-Z]+)(-?\d+)? ?|\\'.{2}|\\.){$skip}/g;
+                }
+            } elsif ($rtfEntity{$1}) {
+                require Image::ExifTool::Charset;
+                $rtnVal .= Image::ExifTool::Charset::Recompose($exifTool, [$rtfEntity{$1}]);
+            } # (else ignore the command)
+        } else {
+            my $ch = substr($val, $p1, 1);
+            if ($ch eq "'") {
+                # hex character code
+                last if $p1 + 3 > $len;
+                my $hex = substr($val, $p1 + 1, 2);
+                if ($hex =~ /^[0-9a-fA-F]{2}$/) {
+                    require Image::ExifTool::Charset;
+                    $rtnVal .= $exifTool->Decode(chr(hex($hex)), $charset);
+                }
+                pos($val) = $p1 + 3;    # skip to after the hex code
+            } else {
+                # assume a standard control symbol (\, {, }, etc)
+                # (note, this may not be valid for some uncommon
+                #  control symbols like \~ for non-breaking space)
+                $rtnVal .= $ch;
+                pos($val) = $p1 + 1;    # skip to after this character
+            }
+        }
+        $p0 = pos($val);
+    }
+    return $rtnVal;
+}
+
+#------------------------------------------------------------------------------
+# Read information in a RTF document
+# Inputs: 0) ExifTool ref, 1) dirInfo ref
+# Returns: 1 on success, 0 if this wasn't a valid RTF file
+sub ProcessRTF($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my ($buff, $buf2, $cs);
+    
+    return 0 unless $raf->Read($buff, 64) and $raf->Seek(0,0);
+    return 0 unless $buff =~ /^[\n\r]*\{[\n\r]*\\rtf[^a-zA-Z]/;
+    $exifTool->SetFileType();
+#
+# determine the RTF character set
+#
+    if ($buff=~ /\\ansicpg(\d*)/) { 
+        $cs = "cp$1";
+    } elsif ($buff=~ /\\(ansi|mac|pc|pca)[^a-zA-Z]/) {
+        my %trans = (
+            ansi => 'Latin',
+            mac  => 'MacRoman',
+            pc   => 'cp437',
+            pca  => 'cp850',
+        );
+        $cs = $trans{$1};
+    } else {
+        $exifTool->Warn('Unspecified RTF encoding. Will assume Latin');
+        $cs = 'Latin';
+    }
+    my $charset = $Image::ExifTool::charsetName{lc $cs};
+    unless ($charset) {
+        $exifTool->Warn("Unsupported RTF encoding $cs. Will assume Latin.");
+        $charset = 'Latin';
+    }
+    my $tagTablePtr = GetTagTable('Image::ExifTool::RTF::Main');
+    undef $buff;
+#
+# scan for \info group
+#
+    for (;;) {
+        $raf->Read($buf2, 65536) or last;
+        if (defined $buff) {
+            # read more but leave some overlap for the match
+            $buff = substr($buff, -16) . $buf2;
+        } else {
+            $buff = $buf2;
+        }
+        next unless $buff =~ /[^\\]\{[\n\r]*\\info([^a-zA-Z])/g;
+        # anything but a space is included in the contents
+        pos($buff) = pos($buff) - 1 if $1 ne ' ';
+        my $info = ReadToNested(\$buff, $raf);
+        unless (defined $info) {
+            $exifTool->Warn('Unterminated information group');
+            last;
+        }
+        # process info commands (ie. "\author", "\*\copyright");
+        while ($info =~ /\{[\n\r]*(\\\*[\n\r]*)?\\([a-zA-Z]+)([^a-zA-Z])/g) {
+            pos($info) = pos($info) - 1 if $3 ne ' ';
+            my $tag = $2;
+            my $val = ReadToNested(\$info);
+            last unless defined $val;
+            my $tagInfo = $$tagTablePtr{$tag};
+            if ($tagInfo and $$tagInfo{Format} and $$tagInfo{Format} eq 'date') {
+                # parse RTF date commands
+                my %idx = (yr=>0,mo=>1,dy=>2,hr=>3,min=>4,sec=>5);
+                my @t = (0) x 6;
+                while ($val =~ /\\([a-z]+)(\d+)/g) {
+                    next unless defined $idx{$1};
+                    $t[$idx{$1}] = $2;
+                }
+                $val = sprintf("%.4d:%.2d:%.2d %.2d:%.2d:%.2d", @t);
+            } else {
+                # unescape RTF string value
+                $val = UnescapeRTF($exifTool, $val, $charset);
+            }
+            # create tagInfo for unknown tags
+            if (not $tagInfo) {
+                Image::ExifTool::AddTagToTable($tagTablePtr, $tag, { Name => ucfirst($tag) });
+            }
+            $exifTool->HandleTag($tagTablePtr, $tag, $val);
+        }
+    }
+    return 1 unless defined $buff;
+#
+# scan for \userprops (but don't read more from file to find the start of this command)
+#
+    pos($buff) = 0;
+    while ($buff =~ /[^\\]\{[\n\r]*\\\*[\n\r]*\\userprops([^a-zA-Z])/g) {
+        # Note: The RTF spec places brackets around each propinfo structure,
+        # but Microsoft Word doesn't write it this way, so tolerate either.
+        pos($buff) = pos($buff) - 1 if $1 ne ' ';
+        my $props = ReadToNested(\$buff, $raf);
+        $tagTablePtr = Image::ExifTool::GetTagTable('Image::ExifTool::RTF::UserProps');
+        unless (defined $props) {
+            $exifTool->Warn('Unterminated user properties');
+            last;
+        }
+        # process user properties
+        my $tag;
+        while ($props =~ /\{[\n\r]*(\\\*[\n\r]*)?\\([a-zA-Z]+)([^a-zA-Z])/g) {
+            pos($props) = pos($props) - 1 if $3 ne ' ';
+            my $t = $2;
+            my $val = ReadToNested(\$props);
+            last unless defined $val;
+            $val = UnescapeRTF($exifTool, $val, $charset);
+            if ($t eq 'propname') {
+                $tag = $val;
+                next;
+            } elsif ($t ne 'staticval' or not defined $tag) {
+                next;   # ignore \linkval and \proptype for now
+            }
+            $tag =~ s/\s(.)/\U$1/g;     # capitalize all words in tag name
+            $tag =~ tr/-_a-zA-Z0-9//dc; # remove illegal characters
+            next unless $tag;
+            # create tagInfo for unknown tags
+            unless ($$tagTablePtr{$tag}) {
+                Image::ExifTool::AddTagToTable($tagTablePtr, $tag, { Name => $tag });
+            }
+            $exifTool->HandleTag($tagTablePtr, $tag, $val);
+        }
+        last;   # (didn't really want to loop)
+    }
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::RTF - Read Rich Text Format meta information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to read meta
+information from RTF (Rich Text Format) documents.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://download.microsoft.com/download/2/f/5/2f599e18-07ee-4ec5-a1e7-f4e6a9423592/Word2007RTFSpec9.doc>
+
+=item L<http://search.cpan.org/dist/RTF-Writer/lib/RTF/Cookbook.pod>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/RTF Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Rawzor.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Rawzor.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Rawzor.pm	(revision 24799)
@@ -0,0 +1,190 @@
+#------------------------------------------------------------------------------
+# File:         Rawzor.pm
+#
+# Description:  Read meta information from Rawzor compressed images
+#
+# Revisions:    09/09/2008 - P. Harvey Created
+#
+# References:   1) http://www.rawzor.com/
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Rawzor;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.01';
+
+# currently support this version Rawzor images
+my $implementedRawzorVersion = 199; # (up to version 1.99)
+
+# Rawzor-specific tags
+%Image::ExifTool::Rawzor::Main = (
+    GROUPS => { 2 => 'Other' },
+    VARS => { NO_ID => 1 },
+    NOTES => q{
+        Rawzor files store compressed images of other formats. As well as the
+        information listed below, exiftool uncompresses and extracts the meta
+        information from the original image.
+    },
+    OriginalFileType => { },
+    OriginalFileSize => {
+        PrintConv => $Image::ExifTool::Extra{FileSize}->{PrintConv},
+    },
+    RawzorRequiredVersion => {
+        ValueConv => '$val / 100',
+        PrintConv => 'sprintf("%.2f", $val)',
+    },
+    RawzorCreatorVersion => {
+        ValueConv => '$val / 100',
+        PrintConv => 'sprintf("%.2f", $val)',
+    },
+    # compression factor is originalSize/compressedSize (and compression
+    # ratio is the inverse - ref "Data Compression" by David Salomon)
+    CompressionFactor => { PrintConv => 'sprintf("%.2f", $val)' },
+);
+
+#------------------------------------------------------------------------------
+# Extract information from a Rawzor file
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 on success, 0 if this wasn't a valid Rawzor file
+sub ProcessRWZ($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my ($buff, $buf2);
+
+    # read the Rawzor file header:
+    #  0 string - "rawzor" signature
+    #  6 int16u - Required SDK version
+    #  8 int16u - Creator SDK version
+    # 10 int64u - RWZ file size
+    # 18 int64u - original raw file size
+    # 26 undef[12] - reserved
+    # 38 int64u - metadata offset
+    $raf->Read($buff, 46) == 46 and $buff =~ /^rawzor/ or return 0;
+
+    SetByteOrder('II');
+    my $reqVers = Get16u(\$buff, 6);
+    my $creatorVers = Get16u(\$buff, 8);
+    my $rwzSize = Get64u(\$buff, 10);
+    my $origSize = Get64u(\$buff, 18);
+    my $tagTablePtr = GetTagTable('Image::ExifTool::Rawzor::Main');
+    $exifTool->HandleTag($tagTablePtr, RawzorRequiredVersion => $reqVers);
+    $exifTool->HandleTag($tagTablePtr, RawzorCreatorVersion => $creatorVers);
+    $exifTool->HandleTag($tagTablePtr, OriginalFileSize => $origSize);
+    $exifTool->HandleTag($tagTablePtr, CompressionFactor => $origSize/$rwzSize) if $rwzSize;
+    # check version numbers
+    if ($reqVers > $implementedRawzorVersion) {
+        $exifTool->Warn("Version $reqVers Rawzor images not yet supported");
+        return 1;
+    }
+    my $metaOffset = Get64u(\$buff, 38);
+    if ($metaOffset > 0x7fffffff) {
+        $exifTool->Warn('Bad metadata offset');
+        return 1;
+    }
+    # check for the ability to uncompress the information
+    unless (eval 'require IO::Uncompress::Bunzip2') {
+        $exifTool->Warn('Install IO::Compress::Bzip2 to decode Rawzor bzip2 compression');
+        return 1;
+    }
+    # read the metadata header:
+    #  0 int64u - metadata section 0 end (offset in original file)
+    #  8 int64u - metadata section 1 start
+    # 16 int64u - metadata section 1 end
+    # 24 int64u - metadata section 2 start
+    # 32 undef[4] - reserved
+    # 36 int32u - original metadata size
+    # 40 int32u - compressed metadata size
+    unless ($raf->Seek($metaOffset, 0) and $raf->Read($buff, 44) == 44) {
+        $exifTool->Warn('Error reading metadata header');
+        return 1;
+    }
+    my $metaSize = Get32u(\$buff, 36);
+    if ($metaSize) {
+        # validate the metadata header and read the compressed metadata
+        my $end0 = Get64u(\$buff, 0);
+        my $pos1 = Get64u(\$buff, 8);
+        my $end1 = Get64u(\$buff, 16);
+        my $pos2 = Get64u(\$buff, 24);
+        my $len = Get32u(\$buff, 40);
+        unless ($raf->Read($buff, $len) == $len and
+            $end0 + ($end1 - $pos1) + ($origSize - $pos2) == $metaSize and
+            $end0 <= $pos1 and $pos1 <= $end1 and $end1 <= $pos2)
+        {
+            $exifTool->Warn('Error reading image metadata');
+            return 1;
+        }
+        # uncompress the metadata
+        unless (IO::Uncompress::Bunzip2::bunzip2(\$buff, \$buf2) and
+            length($buf2) eq $metaSize)
+        {
+            $exifTool->Warn('Error uncompressing image metadata');
+            return 1;
+        }
+        # re-assemble the original file (sans image data)
+        undef $buff; # (can't hurt to free memory as soon as possible)
+        $buff = substr($buf2, 0, $end0) . ("\0" x ($pos1 - $end0)) .
+                substr($buf2, $end0, $end1 - $pos1) . ("\0" x ($pos2 - $end1)) .
+                substr($buf2, $end0 + $end1 - $pos1, $origSize - $pos2);
+        undef $buf2;
+
+        # extract original information by calling ExtractInfo recursively
+        $exifTool->ExtractInfo(\$buff, { ReEntry => 1 });
+        undef $buff;
+    }
+    # set OriginalFileType from FileType of original file
+    # then change FileType and MIMEType to indicate a Rawzor image
+    my $origFileType = $exifTool->{VALUE}->{FileType};
+    if ($origFileType) {
+        $exifTool->HandleTag($tagTablePtr, OriginalFileType => $origFileType);
+        $exifTool->{VALUE}->{FileType} = 'RWZ';
+        $exifTool->{VALUE}->{MIMEType} = 'image/x-rawzor';
+    } else {
+        $exifTool->HandleTag($tagTablePtr, OriginalFileType => 'Unknown');
+        $exifTool->SetFileType();
+    }
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Rawzor - Read meta information from Rawzor compressed images
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to extract meta
+information from Rawzor compressed images.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.rawzor.com/>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/Rawzor Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Real.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Real.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Real.pm	(revision 24799)
@@ -0,0 +1,736 @@
+#------------------------------------------------------------------------------
+# File:         Real.pm
+#
+# Description:  Read Real audio/video meta information
+#
+# Revisions:    05/16/2006 - P. Harvey Created
+#
+# References:   1) http://www.getid3.org/
+#               2) https://common.helixcommunity.org/nonav/2003/HCS_SDK_r5/htmfiles/rmff.htm
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Real;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::Canon;
+
+$VERSION = '1.04';
+
+sub ProcessRealMeta($$$);
+sub ProcessRealProperties($$$);
+
+# Real property types (ref PH)
+my %propertyType = (
+    0 => 'int32u',
+    2 => 'string',
+);
+
+# Real Metadata property types
+my %metadataFormat = (
+    1 => 'string',  # text
+    2 => 'string',  # text list
+    3 => 'flag',    # 1 or 4 byte integer
+    4 => 'int32u',  # 4-byte integer
+    5 => 'undef',   # binary data
+    6 => 'string',  # URL
+    7 => 'string',  # date
+    8 => 'string',  # file name
+    9 =>  undef,    # grouping
+    10 => undef,    # reference
+);
+
+# Real Metadata property flag bit descriptions
+my %metadataFlag = (
+    0 => 'Read Only',
+    1 => 'Private',
+    2 => 'Type Descriptor',
+);
+
+
+# tags used in RealMedia (RM, RV and RMVB) files
+%Image::ExifTool::Real::Media = (
+    GROUPS => { 2 => 'Video' },
+    NOTES => q{
+        These B<Tag ID>'s are Chunk ID's used in RealMedia and RealVideo (RM, RV and
+        RMVB) files.
+    },
+    CONT => { SubDirectory => { TagTable => 'Image::ExifTool::Real::ContentDescr' } },
+    MDPR => { SubDirectory => { TagTable => 'Image::ExifTool::Real::MediaProps' } },
+    PROP => { SubDirectory => { TagTable => 'Image::ExifTool::Real::Properties' } },
+    RJMD => { SubDirectory => { TagTable => 'Image::ExifTool::Real::Metadata' } },
+);
+
+# pseudo-tags used in RealAudio (RA) files
+%Image::ExifTool::Real::Audio = (
+    GROUPS => { 2 => 'Audio' },
+    NOTES => q{
+        Tags in the following table reference information extracted from various
+        versions of RealAudio (RA) files.
+    },
+    '.ra3' => { Name => 'RA3', SubDirectory => { TagTable => 'Image::ExifTool::Real::AudioV3' } },
+    '.ra4' => { Name => 'RA4', SubDirectory => { TagTable => 'Image::ExifTool::Real::AudioV4' } },
+    '.ra5' => { Name => 'RA5', SubDirectory => { TagTable => 'Image::ExifTool::Real::AudioV5' } },
+);
+
+# pseudo-tags used in RealMedia Metafiles and RealMedia Plug-in Metafiles (RAM and RPM)
+%Image::ExifTool::Real::Metafile = (
+    GROUPS => { 2 => 'Video' },
+    NOTES => q{
+        Tags representing information extracted from Real Audio Metafile and
+        RealMedia Plug-in Metafile (RAM and RPM) files.
+    },
+    txt => 'Text',
+    url => 'URL',
+);
+
+%Image::ExifTool::Real::Properties = (
+    GROUPS => { 1 => 'Real-PROP', 2 => 'Video' },
+    PROCESS_PROC => \&Image::ExifTool::Canon::ProcessSerialData,
+    VARS => { ID_LABEL => 'Sequence' },
+    FORMAT => 'int32u',
+    0  => { Name => 'MaxBitrate', PrintConv => 'ConvertBitrate($val)' },
+    1  => { Name => 'AvgBitrate', PrintConv => 'ConvertBitrate($val)' },
+    2  => 'MaxPacketSize',
+    3  => 'AvgPacketSize',
+    4  => 'NumPackets',
+    5 => { Name => 'Duration',      ValueConv => '$val / 1000',  PrintConv => 'ConvertDuration($val)' },
+    6 => { Name => 'Preroll',       ValueConv => '$val / 1000',  PrintConv => 'ConvertDuration($val)' },
+    7 => { Name => 'IndexOffset',   Unknown => 1 },
+    8 => { Name => 'DataOffset',    Unknown => 1 },
+    9 => { Name => 'NumStreams',    Format => 'int16u' },
+    10 => {
+        Name => 'Flags',
+        Format => 'int16u',
+        PrintConv => { BITMASK => {
+            0 => 'Allow Recording',
+            1 => 'Perfect Play',
+            2 => 'Live',
+            3 => 'Allow Download', #PH (from rmeditor dump)
+        } },
+    },
+);
+
+%Image::ExifTool::Real::MediaProps = (
+    GROUPS => { 1 => 'Real-MDPR', 2 => 'Video' },
+    PROCESS_PROC => \&Image::ExifTool::Canon::ProcessSerialData,
+    VARS => { ID_LABEL => 'Sequence' },
+    FORMAT => 'int32u',
+    PRIORITY => 0,  # first stream takes priority
+    0  => { Name => 'StreamNumber',  Format => 'int16u' },
+    1  => { Name => 'StreamMaxBitrate', PrintConv => 'ConvertBitrate($val)' },
+    2  => { Name => 'StreamAvgBitrate', PrintConv => 'ConvertBitrate($val)' },
+    3  => { Name => 'StreamMaxPacketSize' },
+    4  => { Name => 'StreamAvgPacketSize' },
+    5  => { Name => 'StreamStartTime' },
+    6  => { Name => 'StreamPreroll', ValueConv => '$val / 1000',  PrintConv => 'ConvertDuration($val)' },
+    7  => { Name => 'StreamDuration',ValueConv => '$val / 1000',  PrintConv => 'ConvertDuration($val)' },
+    8  => { Name => 'StreamNameLen', Format => 'int8u', Unknown => 1 },
+    9  => { Name => 'StreamName',    Format => 'string[$val{8}]' },
+    10 => { Name => 'StreamMimeLen', Format => 'int8u', Unknown => 1 },
+    11 => {
+        Name => 'StreamMimeType',
+        Format => 'string[$val{10}]',
+        RawConv => '$self->{RealStreamMime} = $val',
+    },
+    12 => { Name => 'FileInfoLen', Unknown => 1 },
+    13 => {
+        Name => 'FileInfoLen2',
+        # if this condition fails, subsequent tags will not be processed
+        Condition => '$self->{RealStreamMime} eq "logical-fileinfo"',
+        Unknown => 1,
+    },
+    14 => {
+        Name => 'FileInfoVersion',
+        Format => 'int16u',
+    },
+    15 => {
+        Name => 'PhysicalStreams',
+        Format => 'int16u',
+        Unknown => 1,
+    },
+    16 => {
+        Name => 'PhysicalStreamNumbers',
+        Format => 'int16u[$val{15}]',
+        Unknown => 1,
+    },
+    17 => {
+        Name => 'DataOffsets',
+        Format => 'int32u[$val{15}]',
+        Unknown => 1,
+    },
+    18 => {
+        Name => 'NumRules',
+        Format => 'int16u',
+        Unknown => 1,
+    },
+    19 => {
+        Name => 'PhysicalStreamNumberMap',
+        Format => 'int16u[$val{18}]',
+        Unknown => 1,
+    },
+    20 => {
+        Name => 'NumProperties',
+        Format => 'int16u',
+        Unknown => 1,
+    },
+    21 => {
+        Name => 'FileInfoProperties',
+        Format => 'undef[$val{13}-$val{15}*6-$val{18}*2-12]',
+        SubDirectory => { TagTable => 'Image::ExifTool::Real::FileInfo' },
+    },
+);
+
+# Observed FileInfo properties (ref PH)
+%Image::ExifTool::Real::FileInfo = (
+    GROUPS => { 1 => 'Real-MDPR', 2 => 'Video' },
+    PROCESS_PROC => \&ProcessRealProperties,
+    NOTES => q{
+        The following tags have been observed in the FileInfo properties, but any
+        other existing information will also be extracted.
+    },
+    Indexable       => { PrintConv => { 0 => 'False', 1 => 'True' } },
+    Keywords        => { },
+    Description     => { },
+   'File ID'        => { Name => 'FileID' },
+   'Content Rating' => {
+        Name => 'ContentRating',
+        PrintConv => {
+            0 => 'No Rating',
+            1 => 'All Ages',
+            2 => 'Older Children',
+            3 => 'Younger Teens',
+            4 => 'Older Teens',
+            5 => 'Adult Supervision Recommended',
+            6 => 'Adults Only',
+        },
+    },
+    Audiences       => { },
+    audioMode       => { Name => 'AudioMode' },
+   'Creation Date'  => {
+        Name => 'CreateDate',
+        Groups => { 2 => 'Time' },
+        ValueConv => q{
+            $val =~ m{(\d+)/(\d+)/(\d+)\s+(\d+):(\d+):(\d+)} ?
+            sprintf("%.4d:%.2d:%.2d %.2d:%.2d:%.2d",$3,$2,$1,$4,$5,$6) : $val
+        },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+   'Generated By'   => { Name => 'Software' },
+   'Modification Date' => {
+        Name => 'ModifyDate',
+        Groups => { 2 => 'Time' },
+        ValueConv => q{
+            $val =~ m{(\d+)/(\d+)/(\d+)\s+(\d+):(\d+):(\d+)} ?
+            sprintf("%.4d:%.2d:%.2d %.2d:%.2d:%.2d",$3,$2,$1,$4,$5,$6) : $val
+        },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+   'Target Audiences' => { Name => 'TargetAudiences' },
+   'Audio Format'   => { Name => 'AudioFormat' },
+   'Video Quality'  => { Name => 'VideoQuality' },
+    videoMode       => { Name => 'VideoMode' },
+);
+
+%Image::ExifTool::Real::ContentDescr = (
+    GROUPS => { 1 => 'Real-CONT', 2 => 'Video' },
+    PROCESS_PROC => \&Image::ExifTool::Canon::ProcessSerialData,
+    VARS => { ID_LABEL => 'Sequence' },
+    FORMAT => 'int16u',
+    0 => { Name => 'TitleLen',      Unknown => 1 },
+    1 => { Name => 'Title',         Format => 'string[$val{0}]' },
+    2 => { Name => 'AuthorLen',     Unknown => 1 },
+    3 => { Name => 'Author',        Format => 'string[$val{2}]', Groups => { 2 => 'Author' } },
+    4 => { Name => 'CopyrightLen',  Unknown => 1 },
+    5 => { Name => 'Copyright',     Format => 'string[$val{4}]', Groups => { 2 => 'Author' } },
+    6 => { Name => 'CommentLen',    Unknown => 1 },
+    7 => { Name => 'Comment',       Format => 'string[$val{6}]' },
+);
+
+# Real RJMD meta information (ref PH)
+%Image::ExifTool::Real::Metadata = (
+    GROUPS => { 1 => 'Real-RJMD', 2 => 'Video' },
+    PROCESS_PROC => \&ProcessRealMeta,
+    NOTES => q{
+        The tags below represent information which has been observed in the Real
+        Metadata format, but ExifTool will extract any information it finds in this
+        format.  (As far as I can tell from the referenced documentation, string
+        values should be plain text, but this is not the case for the only sample
+        file I have been able to obtain containing this information.  These tags
+        could also be split into separate sub-directories, but this will wait until
+        I have better documentation or a more complete set of samples.)
+    },
+   'Album/Name'     => 'AlbumName',
+   'Track/Category' => 'TrackCategory',
+   'Track/Comments' => 'TrackComments',
+   'Track/Lyrics'   => 'TrackLyrics',
+);
+
+%Image::ExifTool::Real::AudioV3 = (
+    GROUPS => { 1 => 'Real-RA3', 2 => 'Audio' },
+    PROCESS_PROC => \&Image::ExifTool::Canon::ProcessSerialData,
+    VARS => { ID_LABEL => 'Sequence' },
+    FORMAT => 'int8u',
+    0  => { Name => 'Channels',       Format => 'int16u' },
+    1  => { Name => 'Unknown',        Format => 'int16u[3]', Unknown => 1 },
+    2  => { Name => 'BytesPerMinute', Format => 'int16u' },
+    3  => { Name => 'AudioBytes',     Format => 'int32u' },
+    4  => { Name => 'TitleLen',       Unknown => 1 },
+    5  => { Name => 'Title',          Format => 'string[$val{4}]' },
+    6  => { Name => 'ArtistLen',      Unknown => 1 },
+    7  => { Name => 'Artist',         Format => 'string[$val{6}]', Groups => { 2 => 'Author' } },
+    8  => { Name => 'CopyrightLen',   Unknown => 1 },
+    9  => { Name => 'Copyright',      Format => 'string[$val{8}]', Groups => { 2 => 'Author' } },
+    10 => { Name => 'CommentLen',     Unknown => 1 },
+    11 => { Name => 'Comment',        Format => 'string[$val{10}]' },
+);
+
+%Image::ExifTool::Real::AudioV4 = (
+    GROUPS => { 1 => 'Real-RA4', 2 => 'Audio' },
+    PROCESS_PROC => \&Image::ExifTool::Canon::ProcessSerialData,
+    VARS => { ID_LABEL => 'Sequence' },
+    FORMAT => 'int16u',
+    0  => { Name => 'FourCC1',        Format => 'undef[4]', Unknown => 1 },
+    1  => { Name => 'AudioFileSize',  Format => 'int32u',   Unknown => 1 },
+    2  => { Name => 'Version2',       Unknown => 1 },
+    3  => { Name => 'HeaderSize',     Format => 'int32u',   Unknown => 1 },
+    4  => { Name => 'CodecFlavorID',  Unknown => 1 },
+    5  => { Name => 'CodedFrameSize', Format => 'int32u',   Unknown => 1 },
+    6  => { Name => 'AudioBytes',     Format => 'int32u' },
+    7  => { Name => 'BytesPerMinute', Format => 'int32u' },
+    8  => { Name => 'Unknown',        Format => 'int32u',   Unknown => 1 },
+    9  => { Name => 'SubPacketH',     Unknown => 1 },
+    10 => 'AudioFrameSize',
+    11 => { Name => 'SubPacketSize',  Unknown => 1 },
+    12 => { Name => 'Unknown',        Unknown => 1 },
+    13 => 'SampleRate',
+    14 => { Name => 'Unknown',        Unknown => 1 },
+    15 => 'BitsPerSample',
+    16 => 'Channels',
+    17 => { Name => 'FourCC2Len',     Format => 'int8u',    Unknown => 1 },
+    18 => { Name => 'FourCC2',        Format => 'undef[4]', Unknown => 1 },
+    19 => { Name => 'FourCC3Len',     Format => 'int8u',    Unknown => 1 },
+    20 => { Name => 'FourCC3',        Format => 'undef[4]', Unknown => 1 },
+    21 => { Name => 'Unknown',        Format => 'int8u',    Unknown => 1 },
+    22 => { Name => 'Unknown',        Unknown => 1 },
+    23 => { Name => 'TitleLen',       Format => 'int8u',    Unknown => 1 },
+    24 => { Name => 'Title',          Format => 'string[$val{23}]' },
+    25 => { Name => 'ArtistLen',      Format => 'int8u',    Unknown => 1 },
+    26 => { Name => 'Artist',         Format => 'string[$val{25}]', Groups => { 2 => 'Author' } },
+    27 => { Name => 'CopyrightLen',   Format => 'int8u',    Unknown => 1 },
+    28 => { Name => 'Copyright',      Format => 'string[$val{27}]', Groups => { 2 => 'Author' } },
+    29 => { Name => 'CommentLen',     Format => 'int8u',    Unknown => 1 },
+    30 => { Name => 'Comment',        Format => 'string[$val{29}]' },
+);
+
+%Image::ExifTool::Real::AudioV5 = (
+    GROUPS => { 1 => 'Real-RA5', 2 => 'Audio' },
+    PROCESS_PROC => \&Image::ExifTool::Canon::ProcessSerialData,
+    VARS => { ID_LABEL => 'Sequence' },
+    FORMAT => 'int16u',
+    0  => { Name => 'FourCC1',        Format => 'undef[4]', Unknown => 1 },
+    1  => { Name => 'AudioFileSize',  Format => 'int32u',   Unknown => 1 },
+    2  => { Name => 'Version2',       Unknown => 1 },
+    3  => { Name => 'HeaderSize',     Format => 'int32u',   Unknown => 1 },
+    4  => { Name => 'CodecFlavorID',  Unknown => 1 },
+    5  => { Name => 'CodedFrameSize', Format => 'int32u',   Unknown => 1 },
+    6  => { Name => 'AudioBytes',     Format => 'int32u' },
+    7  => { Name => 'BytesPerMinute', Format => 'int32u' },
+    8  => { Name => 'Unknown',        Format => 'int32u',   Unknown => 1 },
+    9  => { Name => 'SubPacketH',     Unknown => 1 },
+    10 => { Name => 'FrameSize',      Unknown => 1 },
+    11 => { Name => 'SubPacketSize',  Unknown => 1 },
+    12 => 'SampleRate',
+    13 => { Name => 'SampleRate2',    Unknown => 1 },
+    14 => { Name => 'BitsPerSample',  Format => 'int32u' },
+    15 => 'Channels',
+    16 => { Name => 'Genr',           Format => 'int32u',   Unknown => 1 },
+    17 => { Name => 'FourCC3',        Format => 'undef[4]', Unknown => 1 },
+);
+
+#------------------------------------------------------------------------------
+# Process Real NameValueProperties
+# Inputs: 0) ExifTool object reference, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessRealProperties($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dirLen = $$dirInfo{DirLen};
+    my $pos = $$dirInfo{DirStart};
+    my $verbose = $exifTool->Options('Verbose');
+
+    $verbose and $exifTool->VerboseDir('RealProperties', undef, $dirLen);
+
+    while ($pos + 6 <= $dirLen) {
+
+        # get property size and version
+        my ($size, $vers) = unpack("x${pos}Nn", $$dataPt);
+        last if $size < 6;
+        unless ($vers == 0) {
+            $pos += $size;
+            next;
+        }
+        $pos += 6;
+
+        my $tagLen = unpack("x${pos}C", $$dataPt);
+        ++$pos;
+
+        last if $pos + $tagLen > $dirLen;
+        my $tag = substr($$dataPt, $pos, $tagLen);
+        $pos += $tagLen;
+
+        last if $pos + 6 > $dirLen;
+        my ($type, $valLen) = unpack("x${pos}Nn", $$dataPt);
+        $pos += 6;
+
+        last if $pos + $valLen > $dirLen;
+        my $format = $propertyType{$type} || 'undef';
+        my $count = int($valLen / Image::ExifTool::FormatSize($format));
+        my $val = ReadValue($dataPt, $pos, $format, $count, $dirLen-$pos);
+
+        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        unless ($tagInfo) {
+            my $tagName;
+            ($tagName = $tag) =~ s/\s+//g;
+            next unless $tagName =~ /^\w+$/;    # ignore crazy names
+            $tagInfo = { Name => ucfirst($tagName) };
+            Image::ExifTool::AddTagToTable($tagTablePtr, $tag, $tagInfo);
+        }
+        if ($verbose) {
+            $exifTool->VerboseInfo($tag, $tagInfo,
+                Table  => $tagTablePtr,
+                Value  => $val,
+                DataPt => $dataPt,
+                Size   => $valLen,
+                Start  => $pos,
+                Addr   => $pos + $$dirInfo{DataPos},
+                Format => $format,
+                Count  => $count,
+            );
+        }
+        $exifTool->FoundTag($tagInfo, $val);
+        $pos += $valLen;
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Process Real metadata properties
+# Inputs: 0) ExifTool object reference, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessRealMeta($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dataPos = $$dirInfo{DataPos};
+    my $pos = $$dirInfo{DirStart};
+    my $dirEnd = $pos + $$dirInfo{DirLen};
+    my $verbose = $exifTool->Options('Verbose');
+    my $prefix = $$dirInfo{Prefix} || '';
+    $prefix and $prefix .= '/';
+
+    $verbose and $exifTool->VerboseDir('RealMetadata', undef, $$dirInfo{DirLen});
+
+    for (;;) {
+        last if $pos + 28 > $dirEnd;
+        # extract fixed-position metadata structure members
+        my ($size, $type, $flags, $valuePos, $subPropPos, $numSubProps, $nameLen)
+            = unpack("x${pos}N7", $$dataPt);
+        # make pointers relative to data start
+        $valuePos += $pos;
+        $subPropPos += $pos;
+        # validate what we have read so far
+        last if $pos + $size > $dirEnd;
+        last if $pos + 28 + $nameLen > $dirEnd;
+        last if $valuePos <  $pos + 28 + $nameLen;
+        last if $valuePos + 4 > $dirEnd;
+        my $tag = substr($$dataPt, $pos + 28, $nameLen);
+        $tag =~ s/\0.*//s;  # truncate at null
+        $tag = $prefix . $tag;
+        my $valueLen = unpack("x${valuePos}N", $$dataPt);
+        $valuePos += 4; # point at value itself
+        last if $valuePos + $valueLen > $dirEnd;
+
+        my $format = $metadataFormat{$type};
+        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        unless ($tagInfo) {
+            my $tagName = $tag;
+            $tagName =~ tr/A-Za-z0-9//dc;
+            $tagInfo = { Name => ucfirst($tagName) };
+            Image::ExifTool::AddTagToTable($tagTablePtr, $tag, $tagInfo);
+        }
+        if ($verbose) {
+            $format = 'undef' unless defined $format;
+            $flags = Image::ExifTool::DecodeBits($flags, \%metadataFlag);
+        }
+        if ($valueLen and $format) {
+            # (a flag can be 1 or 4 bytes)
+            if ($format eq 'flag') {
+                $format = ($valueLen == 4) ? 'int32u' : 'int8u';
+            } elsif ($type == 7 and $tagInfo) {
+                # add PrintConv and ValueConv for "date" type
+                $$tagInfo{ValueConv} or $$tagInfo{ValueConv} = q{
+                    $val =~ /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/ ?
+                    sprintf("%.4d:%.2d:%.2d %.2d:%.2d:%.2d",$1,$2,$3,$4,$5,$6) :
+                    $val;
+                };
+                $$tagInfo{PrintConv} or $$tagInfo{PrintConv} = '$self->ConvertDateTime($val)';
+            }
+            my $count = int($valueLen / Image::ExifTool::FormatSize($format));
+            my $val = ReadValue($dataPt, $valuePos, $format, $count, $dirEnd-$valuePos);
+            $exifTool->HandleTag($tagTablePtr, $tag, $val,
+                DataPt => $dataPt,
+                DataPos => $dataPos,
+                Start => $valuePos,
+                Size => $valueLen,
+                Format => "type=$type, flags=$flags",
+            );
+        }
+        # extract sub-properties
+        if ($numSubProps) {
+            my $dirStart = $valuePos + $valueLen + $numSubProps * 8;
+            my %dirInfo = (
+                DataPt => $dataPt,
+                DataPos => $dataPos,
+                DirStart => $dirStart,
+                DirLen => $pos + $size - $dirStart,
+                Prefix => $tag,
+            );
+            $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+        }
+        $pos += $size;  # step to next Metadata structure
+    }
+    unless ($pos == $dirEnd) {
+        $exifTool->Warn('Format error in Real Metadata');
+        return 0;
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Read information frame a Real file
+# Inputs: 0) ExifTool object reference, 1) Directory information reference
+# Returns: 1 on success, 0 if this wasn't a valid Real file
+sub ProcessReal($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my ($buff, $tag, $vers, $extra, @mimeTypes, %dirCount);
+
+    $raf->Read($buff, 8) == 8 or return 0;
+    $buff =~ m{^(\.RMF|\.ra\xfd|pnm://|rtsp://|http://)} or return 0;
+
+    my ($type, $tagTablePtr);
+    if ($1 eq '.RMF') {
+        $tagTablePtr = GetTagTable('Image::ExifTool::Real::Media');
+        $type = 'RM';
+    } elsif ($1 eq ".ra\xfd") {
+        $tagTablePtr = GetTagTable('Image::ExifTool::Real::Audio');
+        $type = 'RA';
+    } else {
+        $tagTablePtr = GetTagTable('Image::ExifTool::Real::Metafile');
+        my $ext = $exifTool->{FILE_EXT};
+        $type = ($ext and $ext eq 'RPM') ? 'RPM' : 'RAM';
+        require Image::ExifTool::PostScript;
+        local $/ = Image::ExifTool::PostScript::GetInputRecordSeparator($raf) || "\n";
+        $raf->Seek(0,0);
+        while ($raf->ReadLine($buff)) {
+            last if length $buff > 256;
+            next unless $buff ;
+            chomp $buff;
+            if ($type) {
+                # must be a Real file type if protocol is http
+                return 0 if $buff =~ /^http/ and $buff !~ /\.(ra|rm|rv|rmvb|smil)$/i;
+                $exifTool->SetFileType($type);
+                undef $type;
+            }
+            # save URL or Text from RAM file
+            my $tag = $buff =~ m{^[a-z]{3,4}://} ? 'url' : 'txt';
+            $exifTool->HandleTag($tagTablePtr, $tag, $buff);
+        }
+        return 1;
+    }
+
+    $exifTool->SetFileType($type);
+    SetByteOrder('MM');
+    my $verbose = $exifTool->Options('Verbose');
+#
+# Process RealAudio file
+#
+    if ($type eq 'RA') {
+        ($vers, $extra) = unpack('x4nn', $buff);
+        $tag = ".ra$vers";
+        my $fpos = $raf->Tell();
+        unless ($raf->Read($buff, 512)) {
+            $exifTool->Warn('Error reading audio header');
+            return 1;
+        }
+        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        if ($verbose > 2) {
+            $exifTool->VerboseInfo($tag, $tagInfo, DataPt => \$buff, DataPos => $fpos);
+        }
+        if ($tagInfo) {
+            my $subTablePtr = GetTagTable($tagInfo->{SubDirectory}->{TagTable});
+            my %dirInfo = (
+                DataPt   => \$buff,
+                DataPos  => $fpos,
+                DirLen   => length $buff,
+                DirStart => 0,
+            );
+            $exifTool->ProcessDirectory(\%dirInfo, $subTablePtr);
+        } else {
+            $exifTool->Warn('Unsupported RealAudio version');
+        }
+        return 1;
+    }
+#
+# Process RealMedia file
+#
+    # skip the rest of the RM header
+    my $size = unpack('x4N', $buff);
+    unless ($raf->Seek($size - 8, 1)) {
+        $exifTool->Warn('Error seeking in file');
+        return 0;
+    }
+
+    # Process RealMedia chunks
+    for (;;) {
+        $raf->Read($buff, 10) == 10 or last;
+        ($tag, $size, $vers) = unpack('a4Nn', $buff);
+        last if $tag eq "\0\0\0\0";
+        if ($verbose) {
+            $exifTool->VPrint(0, "$tag chunk ($size bytes):\n");
+        } else {
+            last if $tag eq 'DATA'; # stop normal parsing at DATA tag
+        }
+        if ($size & 0x80000000) {
+            $exifTool->Warn('Bad chunk header');
+            last;
+        }
+        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        if ($tagInfo and $$tagInfo{SubDirectory}) {
+            my $fpos = $raf->Tell();
+            unless ($raf->Read($buff, $size-10) == $size-10) {
+                $exifTool->Warn("Error reading $tag chunk");
+                last;
+            }
+            if ($verbose > 2) {
+                $exifTool->VerboseInfo($tag, $tagInfo, DataPt => \$buff, DataPos => $fpos);
+            }
+            my $subTablePtr = GetTagTable($tagInfo->{SubDirectory}->{TagTable});
+            my %dirInfo = (
+                DataPt   => \$buff,
+                DataPos  => $fpos,
+                DirLen   => length $buff,
+                DirStart => 0,
+            );
+            if ($dirCount{$tag}) {
+                $exifTool->{SET_GROUP1} = '+' . ++$dirCount{$tag};
+            } else {
+                $dirCount{$tag} = 1;
+            }
+            $exifTool->ProcessDirectory(\%dirInfo, $subTablePtr);
+            delete $exifTool->{SET_GROUP1};
+            # keep track of stream MIME types
+            my $mime = $exifTool->{RealStreamMime};
+            if ($mime) {
+                delete $exifTool->{RealStreamMime};
+                $mime =~ s/\0.*//s;
+                push @mimeTypes, $mime unless $mime =~ /^logical-/;
+            }
+        } else {
+            unless ($raf->Seek($size-10, 1)) {
+                $exifTool->Warn('Error seeking in file');
+                last;
+            }
+        }
+    }
+    # override MIMEType with stream MIME type if we only have one stream
+    if (@mimeTypes == 1 and length $mimeTypes[0]) {
+        $exifTool->{VALUE}->{MIMEType} = $mimeTypes[0];
+        $exifTool->VPrint(0, "  MIMEType = $mimeTypes[0]\n");
+    }
+#
+# Process footer containing Real metadata and ID3 information
+#
+    if ($raf->Seek(-140, 2) and $raf->Read($buff, 12) == 12 and $buff =~ /^RMJE/) {
+        my $metaSize = unpack('x8N', $buff);
+        if ($raf->Seek(-$metaSize-12, 1) and
+            $raf->Read($buff, $metaSize) == $metaSize and
+            $buff =~ /^RJMD/)
+        {
+            my %dirInfo = (
+                DataPt => \$buff,
+                DataPos => $raf->Tell() - $metaSize,
+                DirStart => 8,
+                DirLen => length($buff) - 8,
+            );
+            my $tagTablePtr = GetTagTable('Image::ExifTool::Real::Metadata');
+            $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+        } else {
+            $exifTool->Warn('Bad metadata footer');
+        }
+        if ($raf->Seek(-128, 2) and $raf->Read($buff, 128) == 128 and $buff =~ /^TAG/) {
+            $exifTool->VPrint(0, "ID3v1:\n");
+            my %dirInfo = (
+                DataPt => \$buff,
+                DirStart => 0,
+                DirLen => length($buff),
+            );
+            my $tagTablePtr = GetTagTable('Image::ExifTool::ID3::v1');
+            $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+        }
+    }
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Real - Read Real audio/video meta information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains the routines required by Image::ExifTool to read meta
+information in RealAudio (RA), RealMedia (RM, RV and RMVB) and RealMedia
+Metafile (RAM and RPM) files.
+
+=head1 NOTES
+
+There must be a bug in the software that wrote the Metadata used in the test
+file t/images/Real.rm because the TrackLyricsDataSize word is written
+little-endian, but the Real format is big-endian.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.getid3.org/>
+
+=item L<https://common.helixcommunity.org/nonav/2003/HCS_SDK_r5/htmfiles/rmff.htm>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/Real Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Reconyx.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Reconyx.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Reconyx.pm	(revision 24799)
@@ -0,0 +1,183 @@
+#------------------------------------------------------------------------------
+# File:         Reconyx.pm
+#
+# Description:  Reconyx maker notes tags
+#
+# Revisions:    2011-01-11 - P. Harvey Created
+#
+# References:   1) RCNX_MN10.pdf (courtesy of Reconyx Inc.)
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Reconyx;
+
+use strict;
+use vars qw($VERSION);
+
+$VERSION = '1.02';
+
+# maker notes for Reconyx Hyperfire cameras (ref PH)
+%Image::ExifTool::Reconyx::Main = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    TAG_PREFIX => 'Reconyx',
+    FORMAT => 'int16u',
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    NOTES => q{
+        The following tags are extracted from the maker notes of Reconyx Hyperfire
+        cameras such as the HC500, HC600 and PC900.
+    },
+    0x00 => { #1
+        Name => 'MakerNoteVersion',
+        PrintConv => 'sprintf("0x%.4x", $val)',
+        Writable => 0, # (we use this for identification, 0xf101 --> rev 1.0)
+        PrintConvInv => 'hex $val',
+    },
+    0x01 => { #1
+        Name => 'FirmwareVersion',
+        Format => 'int16u[3]',
+        PrintConv => '$val=~tr/ /./; $val',
+        Writable => 0, # (we use this for identification, 0x0003 --> ver 2 or 3)
+    },
+    0x04 => { #1
+        Name => 'FirmwareDate',
+        Format => 'int16u[2]',
+        ValueConv => q{
+            my @v = split(' ',$val);
+            sprintf('%.4x:%.2x:%.2x', $v[0], $v[1]>>8, $v[1]&0xff);
+        },
+        ValueConvInv => q{
+            my @v = split(':', $val);
+            hex($v[0]) . ' ' . hex($v[1] . $v[2]);
+        },
+    },
+    0x06 => {
+        Name => 'TriggerMode',
+        Format => 'string[2]',
+        PrintConv => {
+            C => 'CodeLoc Not Entered', #1
+            E => 'External Sensor', #1
+            M => 'Motion Detection',
+            T => 'Time Lapse',
+        },
+    },
+    0x07 => {
+        Name => 'Sequence',
+        Format => 'int16u[2]',
+        PrintConv => '$val =~ s/ / of /; $val',
+        PrintConvInv => 'join(" ", $val=~/\d+/g)',
+    },
+    0x09 => { #1
+        Name => 'EventNumber',
+        Format => 'int16u[2]',
+        ValueConv => 'my @v=split(" ",$val); ($v[0]<<16) + $v[1]',
+        ValueConvInv => '($val>>16) . " " . ($val&0xffff)',
+    },
+    0x0b => {
+        Name => 'DateTimeOriginal',
+        Description => 'Date/Time Original',
+        Format => 'int16u[6]',
+        Groups => { 2 => 'Time' },
+        Shift => 'Time',
+        ValueConv => q{
+            my @a = split ' ', $val;
+            sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d', @a[5,3,4,2,1,0]);
+        },
+        ValueConvInv => q{
+            my @a = ($val =~ /\d+/g);
+            return undef unless @a >= 6;
+            join ' ', @a[5,4,3,1,2,0];
+        },
+        PrintConv => '$self->ConvertDateTime($val)',
+        PrintConvInv => '$val',
+    },
+    0x12 => {
+        Name => 'MoonPhase',
+        Groups => { 2 => 'Time' },
+        PrintConv => {
+            0 => 'New',
+            1 => 'New Crescent',
+            2 => 'First Quarter',
+            3 => 'Waxing Gibbous',
+            4 => 'Full',
+            5 => 'Waning Gibbous',
+            6 => 'Last Quarter',
+            7 => 'Old Crescent',
+        },
+    },
+    0x13 => {
+        Name => 'AmbientTemperatureFahrenheit',
+        PrintConv => '"$val F"',
+        PrintConvInv => '$val=~/(\d+)/ ? $1 : $val',
+    },
+    0x14 => {
+        Name => 'AmbientTemperature',
+        PrintConv => '"$val C"',
+        PrintConvInv => '$val=~/(\d+)/ ? $1 : $val',
+    },
+    0x15 => {
+        Name => 'SerialNumber',
+        Format => 'undef[30]',
+        RawConv => '$_ = $self->Decode($val, "UCS2"); s/\0.*//; $_',
+        RawConvInv => q{
+            $_ = $self->Encode($val, "UCS2");
+            $_ = substr($_, 0, 30) if length($_) > 30;
+            return $_;
+        },
+    },
+    0x24 => 'Contrast', #1
+    0x25 => 'Brightness', #1
+    0x26 => 'Sharpness', #1
+    0x27 => 'Saturation', #1
+    0x28 => {
+        Name => 'InfraredIlluminator',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'On',
+        },
+    },
+    0x29 => 'MotionSensitivity', #1
+    0x2a => { #1
+        Name => 'BatteryVoltage',
+        ValueConv => '$val / 1000',
+        ValueConvInv => '$val * 1000',
+        PrintConv => '"$val V"',
+        PrintConvInv => '$val=~s/ ?V$//; $val',
+    },
+    0x2b => {
+        Name => 'UserLabel',
+        Format => 'string[22]', #1 (but manual says 16-char limit)
+    },
+);
+
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Reconyx - Reconyx maker notes tags
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to interpret
+maker notes in Reconyx cameras.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/Reconyx Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Ricoh.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Ricoh.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Ricoh.pm	(revision 24799)
@@ -0,0 +1,697 @@
+#------------------------------------------------------------------------------
+# File:         Ricoh.pm
+#
+# Description:  Ricoh EXIF maker notes tags
+#
+# Revisions:    03/28/2005 - P. Harvey Created
+#
+# References:   1) http://www.ozhiker.com/electronics/pjmt/jpeg_info/ricoh_mn.html
+#               2) http://homepage3.nifty.com/kamisaka/makernote/makernote_ricoh.htm
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Ricoh;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::Exif;
+
+$VERSION = '1.17';
+
+sub ProcessRicohText($$$);
+sub ProcessRicohRMETA($$$);
+
+# lens types for Ricoh GXR
+my %ricohLensIDs = (
+    Notes => q{
+        Lens units available for the GXR, used by the Ricoh Composite LensID tag.  Note
+        that unlike lenses for all other makes of cameras, the focal lengths in these
+        model names have already been scaled to include the 35mm crop factor.
+    },
+    # (the exact lens model names used by Ricoh, except for a change in case)
+    'RL1' => 'GR Lens A12 50mm F2.5 Macro',
+    'RL2' => 'Ricoh Lens S10 24-70mm F2.5-4.4 VC',
+    'RL3' => 'Ricoh Lens P10 28-300mm F3.5-5.6 VC',
+    'RL5' => 'GR Lens A12 28mm F2.5',
+);
+
+%Image::ExifTool::Ricoh::Main = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    WRITABLE => 1,
+    0x0001 => { Name => 'MakerNoteType',   Writable => 'string' },
+    0x0002 => { #PH
+        Name => 'FirmwareVersion',
+        Writable => 'string',
+        # ie. "Rev0113" is firmware version 1.13
+        PrintConv => '$val=~/^Rev(\d+)$/ ? sprintf("%.2f",$1/100) : $val',
+        PrintConvInv => '$val=~/^(\d+)\.(\d+)$/ ? sprintf("Rev%.2d%.2d",$1,$2) : $val',
+    },
+    0x0005 => [ #PH
+        {
+            Condition => '$$valPt =~ /^[-\w ]+$/',
+            Name => 'SerialNumber', # (verified for GXR)
+            Writable => 'undef',
+            Count => 16,
+            Notes => q{
+                the serial number stamped on the camera begins with 2 model-specific letters
+                followed by the last 8 digits of this value.  For the GXR, this is the
+                serial number of the lens unit
+            },
+            PrintConv => '$val=~s/^(.*)(.{8})$/($1)$2/; $val',
+            PrintConvInv => '$val=~tr/()//d; $val',
+        },{
+            Name => 'InternalSerialNumber',
+            Writable => 'undef',
+            Count => 16,
+            PrintConv => 'unpack("H*", $val)',
+            PrintConvInv => 'pack("H*", $val)',
+        },
+    ],
+    0x0e00 => {
+        Name => 'PrintIM',
+        Writable => 0,
+        Description => 'Print Image Matching',
+        SubDirectory => { TagTable => 'Image::ExifTool::PrintIM::Main' },
+    },
+    0x1001 => {
+        Name => 'ImageInfo',
+        SubDirectory => { TagTable => 'Image::ExifTool::Ricoh::ImageInfo' },
+    },
+    0x1003 => {
+        Name => 'Sharpness',
+        Writable => 'int32u',
+        PrintConv => {
+            0 => 'Sharp',
+            1 => 'Normal',
+            2 => 'Soft',
+        },
+    },
+    0x2001 => [
+        {
+            Name => 'RicohSubdir',
+            Condition => '$self->{Model} !~ /^Caplio RR1\b/',
+            SubDirectory => {
+                Validate => '$val =~ /^\[Ricoh Camera Info\]/',
+                TagTable => 'Image::ExifTool::Ricoh::Subdir',
+                Start => '$valuePtr + 20',
+                ByteOrder => 'BigEndian',
+            },
+        },
+        {
+            Name => 'RicohRR1Subdir',
+            SubDirectory => {
+                Validate => '$val =~ /^\[Ricoh Camera Info\]/',
+                TagTable => 'Image::ExifTool::Ricoh::Subdir',
+                Start => '$valuePtr + 20',
+                ByteOrder => 'BigEndian',
+                # the Caplio RR1 uses a different base address -- doh!
+                Base => '$start-20',
+            },
+        },
+    ],
+);
+
+# Ricoh image info (ref 2)
+%Image::ExifTool::Ricoh::ImageInfo = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    PRIORITY => 0,
+    FORMAT => 'int8u',
+    FIRST_ENTRY => 0,
+    IS_OFFSET => [ 28 ],   # tag 28 is 'IsOffset'
+    0 => {
+        Name => 'RicohImageWidth',
+        Format => 'int16u',
+    },
+    2 => {
+        Name => 'RicohImageHeight',
+        Format => 'int16u',
+    },
+    6 => {
+        Name => 'RicohDate',
+        Groups => { 2 => 'Time' },
+        Format => 'int8u[7]',
+        # (what an insane way to encode the date)
+        ValueConv => q{
+            sprintf("%.2x%.2x:%.2x:%.2x %.2x:%.2x:%.2x",
+                    split(' ', $val));
+        },
+        ValueConvInv => q{
+            my @vals = ($val =~ /(\d{1,2})/g);
+            push @vals, 0 if @vals < 7;
+            join(' ', map(hex, @vals));
+        },
+    },
+    28 => {
+        Name => 'PreviewImageStart',
+        Format => 'int16u',
+        Flags => 'IsOffset',
+        OffsetPair => 30,   # associated byte count tagID
+        DataTag => 'PreviewImage',
+        Protected => 2,
+        # prevent preview from being written to raw images
+        RawConvInv => q{
+            return $val if $$self{FILE_TYPE} eq "JPEG";
+            warn "Can't write PreviewImage to $$self{TIFF_TYPE} file\n";
+            return undef;
+        },
+    },
+    30 => {
+        Name => 'PreviewImageLength',
+        Format => 'int16u',
+        OffsetPair => 28,   # point to associated offset
+        DataTag => 'PreviewImage',
+        Protected => 2,
+        RawConvInv => q{
+            return $val if $$self{FILE_TYPE} eq "JPEG";
+            warn "\n"; # suppress warning (already issued for PreviewImageStart)
+            return undef;
+        },
+    },
+    32 => {
+        Name => 'FlashMode',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Auto', #PH
+            2 => 'On',
+        },
+    },
+    33 => {
+        Name => 'Macro',
+        PrintConv => { 0 => 'Off', 1 => 'On' },
+    },
+    34 => {
+        Name => 'Sharpness',
+        PrintConv => {
+            0 => 'Sharp',
+            1 => 'Normal',
+            2 => 'Soft',
+        },
+    },
+    38 => {
+        Name => 'WhiteBalance',
+        PrintConv => {
+            0 => 'Auto',
+            1 => 'Daylight',
+            2 => 'Cloudy',
+            3 => 'Tungsten',
+            4 => 'Fluorescent',
+            5 => 'Manual', #PH (GXR)
+            7 => 'Detail',
+            9 => 'Multi-pattern Auto', #PH (GXR)
+        },
+    },
+    39 => {
+        Name => 'ISOSetting',
+        PrintConv => {
+            0 => 'Auto',
+            1 => 64,
+            2 => 100,
+            4 => 200,
+            6 => 400,
+            7 => 800,
+            8 => 1600,
+            9 => 'Auto', #PH (? CX3)
+        },
+    },
+    40 => {
+        Name => 'Saturation',
+        PrintConv => {
+            0 => 'High',
+            1 => 'Normal',
+            2 => 'Low',
+            3 => 'B&W',
+            6 => 'Toning Effect', #PH (GXR Sepia,Red,Green,Blue,Purple)
+            9 => 'Vivid', #PH (GXR)
+            10 => 'Natural', #PH (GXR)
+        },
+    },
+);
+
+# Ricoh subdirectory tags (ref PH)
+# NOTE: this subdir is not currently writable because the offsets would require
+# special code to handle the funny start location and base offset
+%Image::ExifTool::Ricoh::Subdir = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    # the significance of the following 2 dates is not known.  They are usually
+    # within a month of each other, but I have seen differences of nearly a year.
+    # Sometimes the first is more recent, and sometimes the second.
+    0x0004 => { # (NC)
+        Name => 'ManufactureDate1',
+        Groups => { 2 => 'Time' },
+        Writable => 'string',
+        Count => 20,
+    },
+    0x0005 => { # (NC)
+        Name => 'ManufactureDate2',
+        Groups => { 2 => 'Time' },
+        Writable => 'string',
+        Count => 20,
+    },
+    # 0x000c - int32u[2] 1st number is a counter (file number? shutter count?) - PH
+    # 0x0014 - int8u[338] - could contain some data related to face detection? - PH
+    # 0x0015 - int8u[2]: related to noise reduction?
+    0x001a => { #PH
+        Name => 'FaceInfo',
+        SubDirectory => { TagTable => 'Image::ExifTool::Ricoh::FaceInfo' },
+    },
+    0x0029 => {
+        Name => 'FirmwareInfo',
+        SubDirectory => { TagTable => 'Image::ExifTool::Ricoh::FirmwareInfo' },
+    },
+    0x002a => {
+        Name => 'NoiseReduction',
+        # this is the applied value if NR is set to "Auto"
+        Writable => 'int32u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Weak',
+            2 => 'Strong',
+            3 => 'Max',
+        },
+    },
+    0x002c => { # (GXR)
+        Name => 'SerialInfo',
+        SubDirectory => { TagTable => 'Image::ExifTool::Ricoh::SerialInfo' },
+    }
+    # 0x000E ProductionNumber? (ref 2) [no. zero for most models - PH]
+);
+
+# face detection information (ref PH, CX4)
+%Image::ExifTool::Ricoh::FaceInfo = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+    DATAMEMBER => [ 181 ],
+    0xb5 => { # (should be int16u at 0xb4?)
+        Name => 'FacesDetected',
+        DataMember => 'FacesDetected',
+        RawConv => '$$self{FacesDetected} = $val',
+    },
+    0xb6 => {
+        Name => 'FaceDetectFrameSize',
+        Format => 'int16u[2]',
+    },
+    0xbc => {
+        Name => 'Face1Position',
+        Condition => '$$self{FacesDetected} >= 1',
+        Format => 'int16u[4]',
+        Notes => q{
+            left, top, width and height of detected face in coordinates of
+            FaceDetectFrameSize with increasing Y downwards
+        },
+    },
+    0xc8 => {
+        Name => 'Face2Position',
+        Condition => '$$self{FacesDetected} >= 2',
+        Format => 'int16u[4]',
+    },
+    0xd4 => {
+        Name => 'Face3Position',
+        Condition => '$$self{FacesDetected} >= 3',
+        Format => 'int16u[4]',
+    },
+    0xe0 => {
+        Name => 'Face4Position',
+        Condition => '$$self{FacesDetected} >= 4',
+        Format => 'int16u[4]',
+    },
+    0xec => {
+        Name => 'Face5Position',
+        Condition => '$$self{FacesDetected} >= 5',
+        Format => 'int16u[4]',
+    },
+    0xf8 => {
+        Name => 'Face6Position',
+        Condition => '$$self{FacesDetected} >= 6',
+        Format => 'int16u[4]',
+    },
+    0x104 => {
+        Name => 'Face7Position',
+        Condition => '$$self{FacesDetected} >= 7',
+        Format => 'int16u[4]',
+    },
+    0x110 => {
+        Name => 'Face8Position',
+        Condition => '$$self{FacesDetected} >= 8',
+        Format => 'int16u[4]',
+    },
+);
+
+# firmware version information (ref PH)
+%Image::ExifTool::Ricoh::FirmwareInfo = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    0x00 => {
+        Name => 'FirmwareRevision',
+        Format => 'string[12]',
+    },
+    0x0c => {
+        Name => 'FirmwareRevision2',
+        Format => 'string[12]',
+    },
+);
+
+# serial/version number information written by GXR (ref PH)
+%Image::ExifTool::Ricoh::SerialInfo = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    NOTES => 'This information is found in images from the GXR.',
+    0 => {
+        Name => 'BodyFirmware', #(NC)
+        Format => 'string[16]',
+        # observed: "RS1 :V00560000" --> FirmwareVersion "Rev0056"
+        #           "RS1 :V01020200" --> FirmwareVersion "Rev0102"
+    },
+    16 => {
+        Name => 'BodySerialNumber',
+        Format => 'string[16]',
+        # observed: "SID:00100056" --> "WD00100056" on plate
+    },
+    32 => {
+        Name => 'LensFirmware', #(NC)
+        Format => 'string[16]',
+        # observed: "RL1 :V00560000", "RL1 :V01020200" - A12 50mm F2.5 Macro
+        #           "RL2 :V00560000", "RL2 :V01020300" - S10 24-70mm F2.5-4.4 VC
+        # --> used in a Composite tag to determine LensType
+    },
+    48 => {
+        Name => 'LensSerialNumber',
+        Format => 'string[16]',
+        # observed: (S10) "LID:00010024" --> "WF00010024" on plate
+        #           (A12) "LID:00010054" --> "WE00010029" on plate??
+    },
+);
+
+# Ricoh text-type maker notes (PH)
+%Image::ExifTool::Ricoh::Text = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    PROCESS_PROC => \&ProcessRicohText,
+    NOTES => q{
+        Some Ricoh DC and RDC models use a text-based format for their maker notes
+        instead of the IFD format used by the Caplio models.  Below is a list of known
+        tags in this information.
+    },
+    Rev => {
+        Name => 'FirmwareVersion',
+        PrintConv => '$val=~/^\d+$/ ? sprintf("%.2f",$val/100) : $val',
+        PrintConvInv => '$val=~/^(\d+)\.(\d+)$/ ? sprintf("%.2d%.2d",$1,$2) : $val',
+    },
+    Rv => {
+        Name => 'FirmwareVersion',
+        PrintConv => '$val=~/^\d+$/ ? sprintf("%.2f",$val/100) : $val',
+        PrintConvInv => '$val=~/^(\d+)\.(\d+)$/ ? sprintf("%.2d%.2d",$1,$2) : $val',
+    },
+    Rg => 'RedGain',
+    Gg => 'GreenGain',
+    Bg => 'BlueGain',
+);
+
+%Image::ExifTool::Ricoh::RMETA = (
+    GROUPS => { 0 => 'APP5', 1 => 'RMETA', 2 => 'Image' },
+    PROCESS_PROC => \&Image::ExifTool::Ricoh::ProcessRicohRMETA,
+    NOTES => q{
+        The Ricoh Caplio Pro G3 has the ability to add custom fields to the APP5
+        "RMETA" segment of JPEG images.  While only a few observed tags have been
+        defined below, ExifTool will extract any information found here.
+    },
+    'Sign type' => { Name => 'SignType', PrintConv => {
+        1 => 'Directional',
+        2 => 'Warning',
+        3 => 'Information',
+    } },
+    Location => { PrintConv => {
+        1 => 'Verge',
+        2 => 'Gantry',
+        3 => 'Central reservation',
+        4 => 'Roundabout',
+    } },
+    Lit => { PrintConv => {
+        1 => 'Yes',
+        2 => 'No',
+    } },
+    Condition => { PrintConv => {
+        1 => 'Good',
+        2 => 'Fair',
+        3 => 'Poor',
+        4 => 'Damaged',
+    } },
+    Azimuth => { PrintConv => {
+        1 => 'N',
+        2 => 'NNE',
+        3 => 'NE',
+        4 => 'ENE',
+        5 => 'E',
+        6 => 'ESE',
+        7 => 'SE',
+        8 => 'SSE',
+        9 => 'S',
+        10 => 'SSW',
+        11 => 'SW',
+        12 => 'WSW',
+        13 => 'W',
+        14 => 'WNW',
+        15 => 'NW',
+        16 => 'NNW',
+    } },
+);
+
+# information stored in Ricoh AVI images (ref PH)
+%Image::ExifTool::Ricoh::AVI = (
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Video' },
+    ucmt => {
+        Name => 'Comment',
+        # Ricoh writes a "Unicode" header even when text is ASCII (spaces anyway)
+        ValueConv => '$_=$val; s/^(Unicode\0|ASCII\0\0\0)//; tr/\0//d; s/\s+$//; $_',
+    },
+    mnrt => {
+        Name => 'MakerNoteRicoh',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Ricoh::Main',
+            Start => '$valuePtr + 8',
+            ByteOrder => 'BigEndian',
+            Base => '8',
+        },
+    },
+    rdc2 => {
+        Name => 'RicohRDC2',
+        Unknown => 1,
+        ValueConv => 'unpack("H*",$val)',
+        # have seen values like 0a000444 and 00000000 - PH
+    },
+    thum => {
+        Name => 'ThumbnailImage',
+        Binary => 1,
+    },
+);
+
+# Ricoh composite tags
+%Image::ExifTool::Ricoh::Composite = (
+    GROUPS => { 2 => 'Camera' },
+    LensID => {
+        SeparateTable => 'Ricoh LensID',
+        Require => 'Ricoh:LensFirmware',
+        RawConv => '$val[0] ? $val[0] : undef',
+        ValueConv => '$val=~s/\s*:.*//; $val',
+        PrintConv => \%ricohLensIDs,
+    },
+);
+
+# add our composite tags
+Image::ExifTool::AddCompositeTags('Image::ExifTool::Ricoh');
+
+
+#------------------------------------------------------------------------------
+# Process Ricoh text-based maker notes
+# Inputs: 0) ExifTool object reference
+#         1) Reference to directory information hash
+#         2) Pointer to tag table for this directory
+# Returns: 1 on success, otherwise returns 0 and sets a Warning
+sub ProcessRicohText($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dataLen = $$dirInfo{DataLen};
+    my $dirStart = $$dirInfo{DirStart} || 0;
+    my $dirLen = $$dirInfo{DirLen} || $dataLen - $dirStart;
+    my $verbose = $exifTool->Options('Verbose');
+
+    my $data = substr($$dataPt, $dirStart, $dirLen);
+    return 1 if $data =~ /^\0/;     # blank Ricoh maker notes
+    # validate text maker notes
+    unless ($data =~ /^(Rev|Rv)/) {
+        $exifTool->Warn('Bad Ricoh maker notes');
+        return 0;
+    }
+    while ($data =~ m/([A-Z][a-z]{1,2})([0-9A-F]+);/sg) {
+        my $tag = $1;
+        my $val = $2;
+        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        if ($verbose) {
+            $exifTool->VerboseInfo($tag, $tagInfo,
+                Table  => $tagTablePtr,
+                Value  => $val,
+            );
+        }
+        unless ($tagInfo) {
+            next unless $exifTool->{OPTIONS}->{Unknown};
+            $tagInfo = {
+                Name => "Ricoh_Text_$tag",
+                Unknown => 1,
+                PrintConv => 'length($val) > 60 ? substr($val,0,55) . "[...]" : $val',
+            };
+            # add tag information to table
+            Image::ExifTool::AddTagToTable($tagTablePtr, $tag, $tagInfo);
+        }
+        $exifTool->FoundTag($tagInfo, $val);
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Process Ricoh APP5 RMETA information
+# Inputs: 0) ExifTool object reference
+#         1) Reference to directory information hash
+#         2) Pointer to tag table for this directory
+# Returns: 1 on success, otherwise returns 0 and sets a Warning
+sub ProcessRicohRMETA($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dirStart = $$dirInfo{DirStart};
+    my $dataLen = length($$dataPt);
+    my $verbose = $exifTool->Options('Verbose');
+
+    $dataLen > 6 or $exifTool->Warn('Truncated Ricoh RMETA data'), return 0;
+    my $byteOrder = substr($$dataPt, $dirStart, 2);
+    SetByteOrder($byteOrder) or $exifTool->Warn('Bad Ricoh RMETA data'), return 0;
+    my (@tags, @vals, @nums, $valPos);
+    my $pos = $dirStart + 6;
+    while ($pos <= $dataLen - 4) {
+        my $type = Get16u($dataPt, $pos);
+        my $size = Get16u($dataPt, $pos + 2);
+        $pos += 4;
+        $size -= 2;
+        if ($size < 0 or $pos + $size > $dataLen) {
+            $exifTool->Warn('Corrupted Ricoh RMETA data');
+            last;
+        }
+        if ($type eq 1) {
+            # save the tag names
+            my $tags = substr($$dataPt, $pos, $size);
+            $tags =~ s/\0+$//;  # remove trailing nulls
+            @tags = split /\0/, $tags;
+        } elsif ($type eq 2) {
+            # save the ASCII tag values
+            my $vals = substr($$dataPt, $pos, $size);
+            $vals =~ s/\0+$//;
+            @vals = split /\0/, $vals;
+            $valPos = $pos; # save position of first ASCII value
+        } elsif ($type eq 3) {
+            # save the numerical tag values
+            my $nums = substr($$dataPt, $pos, $size);
+            @nums = unpack($byteOrder eq 'MM' ? 'n*' : 'v*', $nums);
+        } elsif ($type eq 0) {
+            $pos += 2;  # why 2 extra bytes?
+        }
+        $pos += $size;
+    }
+    if (@tags or @vals) {
+        if (@tags != @vals) {
+            my ($nt, $nv) = (scalar(@tags), scalar(@vals));
+            $exifTool->Warn("Number of tags ($nt) and values ($nv) differs in Ricoh RMETA");
+        }
+        # find next tag in null-delimited list
+        # unpack numerical values from block of int16u values
+        my ($tag, $name, $val);
+        foreach $tag (@tags) {
+            $val = shift @vals;
+            last unless defined $val;
+            ($name = $tag) =~ s/\b([a-z])/\U$1/gs;  # make capitalize all words
+            $name =~ s/ (\w)/\U$1/g;                # remove special characters
+            $name = 'RMETA_Unknown' unless length($name);
+            my $num = shift @nums;
+            my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+            if ($tagInfo) {
+                # make sure print conversion is defined
+                $$tagInfo{PrintConv} = { } unless $$tagInfo{PrintConv};
+            } else {
+                # create tagInfo hash
+                $tagInfo = { Name => $name, PrintConv => { } };
+                Image::ExifTool::AddTagToTable($tagTablePtr, $tag, $tagInfo);
+            }
+            # use string value directly if no numerical value
+            $num = $val unless defined $num;
+            # add conversion for this value (replacing any existing entry)
+            $tagInfo->{PrintConv}->{$num} = $val;
+            if ($verbose) {
+                $exifTool->VerboseInfo($tag, $tagInfo,
+                    Table   => $tagTablePtr,
+                    Value   => $num,
+                    DataPt  => $dataPt,
+                    DataPos => $$dirInfo{DataPos},
+                    Start   => $valPos,
+                    Size    => length($val),
+                );
+            }
+            $exifTool->FoundTag($tagInfo, $num);
+            $valPos += length($val) + 1;
+        }
+    }
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Ricoh - Ricoh EXIF maker notes tags
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to
+interpret Ricoh maker notes EXIF meta information.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.ozhiker.com/electronics/pjmt/jpeg_info/ricoh_mn.html>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/Ricoh Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Samsung.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Samsung.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Samsung.pm	(revision 24799)
@@ -0,0 +1,653 @@
+#------------------------------------------------------------------------------
+# File:         Samsung.pm
+#
+# Description:  Samsung EXIF maker notes tags
+#
+# Revisions:    2010/03/01 - P. Harvey Created
+#
+# References:   1) Tae-Sun Park private communication
+#               2) http://www.cybercom.net/~dcoffin/dcraw/
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Samsung;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::Exif;
+
+$VERSION = '1.08';
+
+sub WriteSTMN($$$);
+sub ProcessINFO($$$);
+
+# range of values for Formats used in encrypted information
+my %formatMinMax = (
+    int16u => [ 0, 65535 ],
+    int32u => [ 0, 4294967295 ],
+    int16s => [ -32768, 32767 ],
+    int32s => [ -2147483648, 2147483647 ],
+);
+
+# Samsung "STMN" maker notes (ref PH)
+%Image::ExifTool::Samsung::Type1 = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&WriteSTMN,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FORMAT => 'int32u',
+    FIRST_ENTRY => 0,
+    IS_OFFSET => [ 2 ],   # tag 2 is 'IsOffset'
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    NOTES => q{
+        Tags found in the binary "STMN" format maker notes written by a number of
+        Samsung models.
+    },
+    0 => {
+        Name => 'MakerNoteVersion',
+        Format => 'undef[8]',
+    },
+    2 => {
+        Name => 'PreviewImageStart',
+        OffsetPair => 3,  # associated byte count tagID
+        DataTag => 'PreviewImage',
+        IsOffset => 3,
+        Protected => 2,
+    },
+    3 => {
+        Name => 'PreviewImageLength',
+        OffsetPair => 2,   # point to associated offset
+        DataTag => 'PreviewImage',
+        Protected => 2,
+    },
+);
+
+# Samsung maker notes (ref PH)
+%Image::ExifTool::Samsung::Type2 = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    WRITABLE => 1,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    NOTES => 'Tags found in the EXIF-format maker notes of newer Samsung models.',
+    0x0001 => {
+        Name => 'MakerNoteVersion',
+        Writable => 'undef',
+        Count => 4,
+    },
+    0x0021 => { #1
+        Name => 'PictureWizard',
+        Writable => 'int16u',
+        Count => 5,
+        PrintConv => q{
+            my @a = split ' ', $val;
+            return $val unless @a == 5;
+            sprintf("Mode: %d, Col: %d, Sat: %d, Sha: %d, Con: %d",
+                    $a[0], $a[1], $a[2]-4, $a[3]-4, $a[4]-4);
+        },
+        PrintConvInv => q{
+            my @a = ($val =~ /[+-]?\d+/g);
+            return $val unless @a >= 5;
+            sprintf("%d %d %d %d %d", $a[0], $a[1], $a[2]+4, $a[3]+4, $a[4]+4);
+        },
+    },
+    # 0x0023 - string: "0123456789" (PH)
+    0x0030 => { #1 (NX100 with GPS)
+        Name => 'LocalLocationName',
+        Writable => 'string',
+        Format => 'undef',
+        # this contains 2 place names (in Korean if in Korea), separated by a null+space
+        # - terminate at double-null and replace nulls with newlines
+        ValueConv => '$val=~s/\0\0.*//; $val=~s/\0 */\n/g; $val',
+        ValueConvInv => '$val=~s/(\x0d\x0a|\x0d|\x0a)/\0 /g; $val . "\0\0"'
+    },
+    0x0031 => { #1 (NX100 with GPS)
+        Name => 'LocationName',
+        Writable => 'string',
+    },
+    0x0035 => {
+        Name => 'PreviewIFD',
+        Condition => '$$self{TIFF_TYPE} eq "SRW"', # (not an IFD in JPEG images)
+        Groups => { 1 => 'PreviewIFD' },
+        Flags => 'SubIFD',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Nikon::PreviewIFD',
+            ByteOrder => 'Unknown',
+            Start => '$val',
+        },
+    },
+    0x0043 => { #1 (NC)
+        Name => 'CameraTemperature',
+        Groups => { 2 => 'Camera' },
+        Writable => 'rational64s',
+        # (DPreview samples all 0.2 C --> pre-production model)
+        PrintConv => '"$val C"',
+        PrintConvInv => '$val=~s/ ?C//; $val',
+    },
+    # 0x00a0 - undef[8192]: white balance information (ref 1):
+    #   At byte 5788, the WBAdjust: "Adjust\0\X\0\Y\0\Z\xee\xea\xce\xab", where
+    #   Y = BA adjust (0=Blue7, 7=0, 14=Amber7), Z = MG (0=Magenta7, 7=0, 14=Green7)
+#
+# the following tags found only in SRW images
+#
+    # 0xa000 - rational64u: 1 or 1.1 (ref PH)
+    0xa001 => { #1
+        Name => 'FirmwareName',
+        Groups => { 2 => 'Camera' },
+        Writable => 'string',
+    },
+    # 0xa002 - string[30]: '0' or 'DY049P000000' (ref PH)
+    0xa003 => { #1 (SRW images only)
+        Name => 'LensType',
+        Groups => { 2 => 'Camera' },
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Built-in', #PH (EX1, WB2000)
+            1 => 'Samsung 30mm F2 Pancake',
+            2 => 'Samsung Zoom 18-55mm F3.5-5.6 OIS',
+            3 => 'Samsung Zoom 50-200mm F4-5.6 ED OIS',
+            # what about the non-OIS version of the 18-55,
+            # which was supposed to be available before the 20-50?
+            4 => 'Samsung 20-50mm F3.5-5.6 Compact Zoom', #PH
+            5 => 'Samsung 20mm F2.8 Pancake', #PH (guess)
+        },
+    },
+    0xa004 => { #1
+        Name => 'LensFirmware',
+        Groups => { 2 => 'Camera' },
+        Writable => 'string',
+    },
+    # 0xa005 - string[30]: constant for a given lens? Not the printed serial number (ref 1)
+    0xa010 => { #1
+        Name => 'SensorAreas',
+        Groups => { 2 => 'Camera' },
+        Notes => 'full and valid sensor areas',
+        Writable => 'int32u',
+        Count => 8,
+    },
+    0xa011 => { #1
+        Name => 'ColorSpace',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'sRGB',
+            1 => 'Adobe RGB',
+        },
+    },
+    0xa012 => { #1
+        Name => 'SmartRange',
+        Writable => 'int16u',
+        PrintConv => { 0 => 'Off', 1 => 'On' },
+    },
+    0xa013 => { #1
+        Name => 'ExposureCompensation',
+        Writable => 'rational64s',
+    },
+    0xa014 => { #1
+        Name => 'ISO',
+        Writable => 'int32u',
+    },
+    0xa018 => { #1
+        Name => 'ExposureTime',
+        Writable => 'rational64u',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    0xa019 => { #1
+        Name => 'FNumber',
+        Writable => 'rational64u',
+        PrintConv => 'sprintf("%.1f",$val)',
+        PrintConvInv => '$val',
+    },
+    0xa01a => { #1
+        Name => 'FocalLengthIn35mmFormat',
+        Groups => { 2 => 'Camera' },
+        Format => 'int32u',
+        ValueConv => '$val / 10',
+        ValueConvInv => '$val * 10',
+        PrintConv => '"$val mm"',
+        PrintConvInv => '$val=~s/\s*mm$//;$val',
+    },
+    0xa020 => { #1
+        Name => 'EncryptionKey',
+        Writable => 'int32u',
+        Count => 11,
+        Protected => 1,
+        DataMember => 'EncryptionKey',
+        RawConv => '$$self{EncryptionKey} = [ split(" ",$val) ]; $val',
+        Notes => 'key used to decrypt the tags below',
+        # value is "305 72 737 456 282 307 519 724 13 505 193"
+    },
+    0xa021 => { #1
+        Name => 'WB_RGGBLevelsUncorrected',
+        Writable => 'int32u',
+        Count => 4,
+        Notes => 'these tags not corrected for WB_RGGBLevelsBlack',
+        RawConv    => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0")',
+        RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0)',
+    },
+    0xa022 => { #1
+        Name => 'WB_RGGBLevelsAuto',
+        Writable => 'int32u',
+        Count => 4,
+        RawConv    => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,-4)',
+        RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,4)',
+    },
+    0xa023 => { #1
+        Name => 'WB_RGGBLevelsIlluminator1',
+        Writable => 'int32u',
+        Count => 4,
+        RawConv    => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,-8)',
+        RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,8)',
+    },
+    0xa024 => { #1
+        Name => 'WB_RGGBLevelsIlluminator2',
+        Writable => 'int32u',
+        Count => 4,
+        RawConv    => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,-1)',
+        RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,1)',
+    },
+    #this doesn't seem correct
+    #0xa025 => { #PH/1
+    #    Name => 'ColorTemperatureAuto',
+    #    Writable => 'int32u',
+    #    RawConv    => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,6)',
+    #    RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,-6)',
+    #},
+    0xa028 => { #2/PH
+        Name => 'WB_RGGBLevelsBlack',
+        Writable => 'int32s',
+        Count => 4,
+        RawConv    => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0")',
+        RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0)',
+    },
+    0xa030 => { #1
+        Name => 'ColorMatrix',
+        Writable =>  'int32s',
+        Count => 9,
+        RawConv    => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0)',
+        RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0")',
+    },
+    0xa031 => { #1
+        Name => 'ColorMatrixSRGB',
+        Writable =>  'int32s',
+        Count => 9,
+        RawConv    => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0)',
+        RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0")',
+    },
+    0xa032 => { #1
+        Name => 'ColorMatrixAdobeRGB',
+        Writable =>  'int32s',
+        Count => 9,
+        RawConv    => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0)',
+        RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0")',
+    },
+    0xa033 => { #1
+        Name => 'Samsung_Type2_0xa033',
+        Unknown => 1,
+        Hidden => 1,
+        Writable => 'int32s',
+        Count => 4,
+        RawConv    => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0)',
+        RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0")',
+    },
+    0xa034 => { #1
+        Name => 'Samsung_Type2_0xa034',
+        Unknown => 1,
+        Hidden => 1,
+        Writable => 'int32s',
+        Count => 4,
+        RawConv    => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,4)',
+        RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,-4)',
+    },
+    0xa035 => { #1
+        Name => 'Samsung_Type2_0xa035',
+        Unknown => 1,
+        Hidden => 1,
+        Writable => 'int32u',
+        Count => 2,
+        RawConv    => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0")',
+        RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0)',
+    },
+    0xa036 => { #1
+        Name => 'Samsung_Type2_0xa036',
+        Unknown => 1,
+        Hidden => 1,
+        Writable => 'int32u',
+        Count => 2,
+        RawConv    => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,-2)',
+        RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,2)',
+    },
+    0xa040 => { #1
+        Name => 'ToneCurve1',
+        Writable =>  'int32u',
+        Count => 23,
+        Notes => q{
+            first value gives the number of tone curve entries.  This is followed by an
+            array of X coordinates then an array of Y coordinates
+        },
+        RawConv    => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0,"-0")',
+        RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0",0)',
+    },
+    0xa041 => { #1
+        Name => 'ToneCurve2',
+        Writable =>  'int32u',
+        Count => 23,
+        RawConv    => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0,"-0")',
+        RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0",0)',
+    },
+    0xa042 => { #1
+        Name => 'ToneCurve3',
+        Writable =>  'int32u',
+        Count => 23,
+        RawConv    => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0,"-0")',
+        RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0",0)',
+    },
+    0xa043 => { #1
+        Name => 'ToneCurve4',
+        Writable =>  'int32u',
+        Count => 23,
+        RawConv    => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0,"-0")',
+        RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0",0)',
+    },
+    0xa048 => { #1
+        Name => 'Samsung_Type2_0xa048',
+        Unknown => 1,
+        Hidden => 1,
+        Writable => 'int32s',
+        Count => 12,
+        RawConv    => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0)',
+        RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0")',
+    },
+    0xa050 => { #1 (vignette curve?)
+        Name => 'Samsung_Type2_0xa050',
+        Unknown => 1,
+        Hidden => 1,
+        Writable => 'int32s',
+        Count => 8,
+        RawConv    => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0)',
+        RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0")',
+    },
+    0xa051 => { #1
+        Name => 'Samsung_Type2_0xa051',
+        Unknown => 1,
+        Hidden => 1,
+        Writable => 'int16u',
+        Count => 22,
+        RawConv    => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0",-7,-3)',
+        RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0,7,3)',
+    },
+    0xa052 => { #1 (vignette curve?)
+        Name => 'Samsung_Type2_0xa052',
+        Unknown => 1,
+        Hidden => 1,
+        Writable => 'int16u',
+        Count => 15,
+        RawConv    => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0,"-0")',
+        RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0",0)',
+    },
+    0xa053 => { #1
+        Name => 'Samsung_Type2_0xa053',
+        Unknown => 1,
+        Hidden => 1,
+        Writable => 'int16u',
+        Count => 15,
+        RawConv    => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0,"-0")',
+        RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0",0)',
+    },
+    0xa054 => { #1
+        Name => 'Samsung_Type2_0xa054',
+        Unknown => 1,
+        Hidden => 1,
+        Writable => 'int16u',
+        Count => 15,
+        RawConv    => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0,"-0")',
+        RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0",0)',
+    },
+    0xa055 => { #1
+        Name => 'Samsung_Type2_0xa055',
+        Unknown => 1,
+        Hidden => 1,
+        Writable => 'int32s',
+        Count => 8,
+        RawConv    => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,8)',
+        RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,-8)',
+    },
+    0xa056 => { #1
+        Name => 'Samsung_Type2_0xa056',
+        Unknown => 1,
+        Hidden => 1,
+        Writable => 'int32s',
+        Count => 8,
+        RawConv    => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,5)',
+        RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,-5)',
+    },
+    0xa057 => { #1
+        Name => 'Samsung_Type2_0xa057',
+        Unknown => 1,
+        Hidden => 1,
+        Writable => 'int32s',
+        Count => 8,
+        RawConv    => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,2)',
+        RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,-2)',
+    },
+);
+
+# INFO tags in Samsung MP4 videos (ref PH)
+%Image::ExifTool::Samsung::INFO = (
+    PROCESS_PROC => \&ProcessINFO,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Video' },
+    NOTES => q{
+        This information is found in MP4 videos from Samsung models such as the
+        SMX-C20N.
+    },
+    EFCT => 'Effect', # (guess)
+    QLTY => 'Quality',
+    # MDEL - value: 0
+    # ASPT - value: 1, 2
+);
+
+# Samsung MP4 TAGS information (PH - from WP10 sample)
+# --> very similar to Sanyo MP4 information
+%Image::ExifTool::Samsung::MP4 = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => q{
+        This information is found in Samsung MP4 videos from models such as the
+        WP10.
+    },
+    0x00 => {
+        Name => 'Make',
+        Format => 'string[24]',
+        PrintConv => 'ucfirst(lc($val))',
+    },
+    0x18 => {
+        Name => 'Model',
+        Description => 'Camera Model Name',
+        Format => 'string[16]',
+    },
+    0x2e => { # (NC)
+        Name => 'ExposureTime',
+        Format => 'int32u',
+        ValueConv => '$val ? 10 / $val : 0',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+    },
+    0x32 => {
+        Name => 'FNumber',
+        Format => 'rational64u',
+        PrintConv => 'sprintf("%.1f",$val)',
+    },
+    0x3a => { # (NC)
+        Name => 'ExposureCompensation',
+        Format => 'rational64s',
+        PrintConv => '$val ? sprintf("%+.1f", $val) : 0',
+    },
+    0x6a => {
+        Name => 'ISO',
+        Format => 'int32u',
+    },
+    0x7d => {
+        Name => 'Software',
+        Format => 'string[32]',
+        # (these tags are not at a constant offset for Sanyo videos,
+        #  so just to be safe use this to validate subsequent tags)
+        RawConv => q{
+            $val =~ /^SAMSUNG/ or return undef;
+            $$self{SamsungMP4} = 1;
+            return $val;
+        },
+    },
+    0xf8 => {
+        Name => 'ThumbnailWidth',
+        Condition => '$$self{SamsungMP4}',
+        Format => 'int32u',
+    },
+    0xfc => {
+        Name => 'ThumbnailHeight',
+        Condition => '$$self{SamsungMP4}',
+        Format => 'int32u',
+    },
+    0x100 => {
+        Name => 'ThumbnailLength',
+        Condition => '$$self{SamsungMP4}',
+        Format => 'int32u',
+    },
+    0x104 => {
+        Name => 'ThumbnailOffset',
+        Condition => '$$self{SamsungMP4}',
+        IsOffset => 1,
+        Format => 'int32u',
+        RawConv => '$val + 0xf4',
+    },
+);
+
+# Samsung composite tags
+%Image::ExifTool::Samsung::Composite = (
+    GROUPS => { 2 => 'Image' },
+    WB_RGGBLevels => {
+        Require => {
+            0 => 'WB_RGGBLevelsUncorrected',
+            1 => 'WB_RGGBLevelsBlack',
+        },
+        ValueConv => q{
+            my @a = split ' ', $val[0];
+            my @b = split ' ', $val[1];
+            $a[$_] -= $b[$_] foreach 0..$#a;
+            return "@a";
+        },
+    },
+);
+
+# add our composite tags
+Image::ExifTool::AddCompositeTags('Image::ExifTool::Samsung');
+
+#------------------------------------------------------------------------------
+# Encrypt/Decrypt NX10 information
+# Inputs: 0) ExifTool ref, 1) value as a string of integers,
+#         2) tagInfo hash ref, 3-N) encryption salt values
+# Returns: encrypted/decrypted value
+# Notes:
+# 1) The encryption salt starts with '-' to reverse the encryption algorithm
+# 2) Additional salt values are provided when tag stores multiple arrays
+#    (in which case the first value of the tag gives the array length)
+sub Crypt($$$@)
+{
+    my ($exifTool, $val, $tagInfo, @salt) = @_;
+    my $key = $$exifTool{EncryptionKey} or return undef;
+    my $format = $$tagInfo{Writable} || $$tagInfo{Format} or return undef;
+    return undef unless $formatMinMax{$format};
+    my ($min, $max) = @{$formatMinMax{$format}};
+    my @a = split ' ', $val;
+    my $newSalt = (@salt > 1) ? 1 : 0;  # skip length entry if this is an array
+    my ($i, $sign, $salt, $start);
+    for ($i=$newSalt; $i<@a; ++$i) {
+        if ($i == $newSalt) {
+            $start = $i;
+            $salt = shift @salt;
+            $sign = ($salt =~ s/^-//) ? -1 : 1;
+            $newSalt += $a[0] if @salt;
+        }
+        $a[$i] += $sign * $$key[($salt+$i-$start) % scalar(@$key)];
+        # handle integer wrap-around
+        if ($sign > 0) {
+            $a[$i] -= $max - $min + 1 if $a[$i] > $max;
+        } else {
+            $a[$i] += $max - $min + 1 if $a[$i] < $min;
+        }
+    }
+    return "@a";
+}
+
+#------------------------------------------------------------------------------
+# Process Samsung MP4 INFO data
+# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessINFO($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $pos = $$dirInfo{DirStart};
+    my $len = $$dirInfo{DirLen};
+    my $end = $pos + $len;
+    $exifTool->VerboseDir('INFO', undef, $len);
+    while ($pos + 8 <= $end) {
+        my $tag = substr($$dataPt, $pos, 4);
+        my $val = Get32u($dataPt, $pos + 4);
+        unless ($$tagTablePtr{$tag}) {
+            my $name = "Samsung_INFO_$tag";
+            $name =~ tr/-_0-9a-zA-Z//dc;
+            Image::ExifTool::AddTagToTable($tagTablePtr, $tag, { Name => $name }) if $name;
+        }
+        $exifTool->HandleTag($tagTablePtr, $tag, $val);
+        $pos += 8;
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Write Samsung STMN maker notes
+# Inputs: 0) ExifTool object ref, 1) source dirInfo ref, 2) tag table ref
+# Returns: Binary data block or undefined on error
+sub WriteSTMN($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    # create a Fixup for the PreviewImage
+    $$dirInfo{Fixup} = new Image::ExifTool::Fixup;
+    my $val = Image::ExifTool::WriteBinaryData($exifTool, $dirInfo, $tagTablePtr);
+    # force PreviewImage into the trailer even if it fits in EXIF segment
+    $$exifTool{PREVIEW_INFO}{IsTrailer} = 1 if $$exifTool{PREVIEW_INFO};
+    return $val;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Samsung - Samsung EXIF maker notes tags
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to interpret
+Samsung maker notes in EXIF information.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Tae-Sun Park for decoding a number of tags.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/Samsung Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Sanyo.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Sanyo.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Sanyo.pm	(revision 24799)
@@ -0,0 +1,434 @@
+#------------------------------------------------------------------------------
+# File:         Sanyo.pm
+#
+# Description:  Sanyo EXIF maker notes tags
+#
+# Revisions:    04/06/2004  - P. Harvey Created
+#
+# Reference:    http://www.exif.org/makernotes/SanyoMakerNote.html
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Sanyo;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool::Exif;
+
+$VERSION = '1.14';
+
+my %offOn = (
+    0 => 'Off',
+    1 => 'On',
+);
+
+%Image::ExifTool::Sanyo::Main = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    WRITABLE => 1,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0x00ff => {
+        # this is an absolute offset in the JPG file... odd - PH
+        Name => 'MakerNoteOffset',
+        Writable => 'int32u',
+    },
+    0x0100 => {
+        Name => 'SanyoThumbnail',
+        Writable => 'undef',
+        WriteCheck => '$self->CheckImage(\$val)',
+        RawConv => '$self->ValidateImage(\$val,$tag)',
+    },
+    0x0200 => {
+        Name => 'SpecialMode',
+        Writable => 'int32u',
+        Count => 3,
+    },
+    0x0201 => {
+        Name => 'SanyoQuality',
+        Flags => 'PrintHex',
+        Writable => 'int16u',
+        PrintConv => {
+            0x0000 => 'Normal/Very Low',
+            0x0001 => 'Normal/Low',
+            0x0002 => 'Normal/Medium Low',
+            0x0003 => 'Normal/Medium',
+            0x0004 => 'Normal/Medium High',
+            0x0005 => 'Normal/High',
+            0x0006 => 'Normal/Very High',
+            0x0007 => 'Normal/Super High',
+            # have seen 0x11 with HD2000 in '8M-H JPEG' mode - PH
+            0x0100 => 'Fine/Very Low',
+            0x0101 => 'Fine/Low',
+            0x0102 => 'Fine/Medium Low',
+            0x0103 => 'Fine/Medium',
+            0x0104 => 'Fine/Medium High',
+            0x0105 => 'Fine/High',
+            0x0106 => 'Fine/Very High',
+            0x0107 => 'Fine/Super High',
+            0x0200 => 'Super Fine/Very Low',
+            0x0201 => 'Super Fine/Low',
+            0x0202 => 'Super Fine/Medium Low',
+            0x0203 => 'Super Fine/Medium',
+            0x0204 => 'Super Fine/Medium High',
+            0x0205 => 'Super Fine/High',
+            0x0206 => 'Super Fine/Very High',
+            0x0207 => 'Super Fine/Super High',
+        },
+    },
+    0x0202 => {
+        Name => 'Macro',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Normal',
+            1 => 'Macro',
+            2 => 'View',
+            3 => 'Manual',
+        },
+    },
+    0x0204 => {
+        Name => 'DigitalZoom',
+        Writable => 'rational64u',
+    },
+    0x0207 => 'SoftwareVersion',
+    0x0208 => 'PictInfo',
+    0x0209 => 'CameraID',
+    0x020e => {
+        Name => 'SequentialShot',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'None',
+            1 => 'Standard',
+            2 => 'Best',
+            3 => 'Adjust Exposure',
+        },
+    },
+    0x020f => {
+        Name => 'WideRange',
+        Writable => 'int16u',
+        PrintConv => \%offOn,
+    },
+    0x0210 => {
+        Name => 'ColorAdjustmentMode',
+        Writable => 'int16u',
+        PrintConv => \%offOn,
+    },
+    0x0213 => {
+        Name => 'QuickShot',
+        Writable => 'int16u',
+        PrintConv => \%offOn,
+    },
+    0x0214 => {
+        Name => 'SelfTimer',
+        Writable => 'int16u',
+        PrintConv => \%offOn,
+    },
+    # 0x0215 - Flash?
+    0x0216 => {
+        Name => 'VoiceMemo',
+        Writable => 'int16u',
+        PrintConv => \%offOn,
+    },
+    0x0217 => {
+        Name => 'RecordShutterRelease',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Record while down',
+            1 => 'Press start, press stop',
+        },
+    },
+    0x0218 => {
+        Name => 'FlickerReduce',
+        Writable => 'int16u',
+        PrintConv => \%offOn,
+    },
+    0x0219 => {
+        Name => 'OpticalZoomOn',
+        Writable => 'int16u',
+        PrintConv => \%offOn,
+    },
+    0x021b => {
+        Name => 'DigitalZoomOn',
+        Writable => 'int16u',
+        PrintConv => \%offOn,
+    },
+    0x021d => {
+        Name => 'LightSourceSpecial',
+        Writable => 'int16u',
+        PrintConv => \%offOn,
+    },
+    0x021e => {
+        Name => 'Resaved',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'No',
+            1 => 'Yes',
+        },
+    },
+    0x021f => {
+        Name => 'SceneSelect',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Sport',
+            2 => 'TV',
+            3 => 'Night',
+            4 => 'User 1',
+            5 => 'User 2',
+            6 => 'Lamp', #PH
+        },
+    },
+    0x0223 => [
+        {
+            Name => 'ManualFocusDistance',
+            Condition => '$format eq "rational64u"',
+            Writable => 'rational64u',
+        }, { #PH
+            Name => 'FaceInfo',
+            SubDirectory => { TagTable => 'Image::ExifTool::Sanyo::FaceInfo' },
+        },
+    ],
+    0x0224 => {
+        Name => 'SequenceShotInterval',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => '5 frames/s',
+            1 => '10 frames/s',
+            2 => '15 frames/s',
+            3 => '20 frames/s',
+        },
+    },
+    0x0225 => {
+        Name => 'FlashMode',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Auto',
+            1 => 'Force',
+            2 => 'Disabled',
+            3 => 'Red eye',
+        },
+    },
+    0x0e00 => {
+        Name => 'PrintIM',
+        Description => 'Print Image Matching',
+        Writable => 0,
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::PrintIM::Main',
+        },
+    },
+    0x0f00 => {
+        Name => 'DataDump',
+        Writable => 0,
+        Binary => 1,
+    },
+);
+
+# face detection information (ref PH)
+%Image::ExifTool::Sanyo::FaceInfo = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    WRITABLE => 1,
+    FORMAT => 'int32u',
+    FIRST_ENTRY => 0,
+    0 => 'FacesDetected',
+    4 => {
+        Name => 'FacePosition',
+        Format => 'int32u[4]',
+        Notes => q{
+            left, top, right and bottom coordinates of detected face in an unrotated
+            640-pixel-wide image, with increasing Y downwards
+        },
+    },
+);
+
+# tags in Sanyo MOV videos (PH - observations from an E6 sample)
+# (similar information in Kodak,Minolta,Nikon,Olympus,Pentax and Sanyo videos)
+%Image::ExifTool::Sanyo::MOV = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'This information is found in Sanyo MOV videos.',
+    0x00 => {
+        Name => 'Make',
+        Format => 'string[24]',
+    },
+    0x18 => {
+        Name => 'Model',
+        Description => 'Camera Model Name',
+        Format => 'string[8]',
+    },
+    # (01 00 at offset 0x20)
+    0x26 => {
+        Name => 'ExposureTime',
+        Format => 'int32u',
+        ValueConv => '$val ? 10 / $val : 0',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+    },
+    0x2a => {
+        Name => 'FNumber',
+        Format => 'int32u',
+        ValueConv => '$val / 10',
+        PrintConv => 'sprintf("%.1f",$val)',
+    },
+    0x32 => {
+        Name => 'ExposureCompensation',
+        Format => 'int32s',
+        ValueConv => '$val / 10',
+        PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
+    },
+    0x44 => {
+        Name => 'WhiteBalance',
+        Format => 'int16u',
+        PrintConv => {
+            0 => 'Auto',
+            1 => 'Daylight',
+            2 => 'Shade',
+            3 => 'Fluorescent', #2
+            4 => 'Tungsten',
+            5 => 'Manual',
+        },
+    },
+    0x48 => {
+        Name => 'FocalLength',
+        Format => 'int32u',
+        ValueConv => '$val / 10',
+        PrintConv => 'sprintf("%.1f mm",$val)',
+    },
+);
+
+# tags in Sanyo MP4 videos (PH - from C4, C5 and HD1A samples)
+# --> very similar to Samsung MP4 information
+# (there is still a lot more information here that could be decoded!)
+%Image::ExifTool::Sanyo::MP4 = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    NOTES => 'This information is found in Sanyo MP4 videos.',
+    0x00 => {
+        Name => 'Make',
+        Format => 'string[5]',
+        PrintConv => 'ucfirst(lc($val))',
+    },
+    0x18 => {
+        Name => 'Model',
+        Description => 'Camera Model Name',
+        Format => 'string[8]',
+    },
+    # (01 00 at offset 0x28)
+    # (0x2e has values 0x31, 0x33 and 0x3c in my samples, but
+    # some of the shutter speeds should be around 1/500 or so)
+    0x32 => {
+        Name => 'FNumber',
+        Format => 'rational64u',
+        PrintConv => 'sprintf("%.1f",$val)',
+    },
+    0x3a => { # (NC)
+        Name => 'ExposureCompensation',
+        Format => 'rational64s',
+        PrintConv => '$val ? sprintf("%+.1f", $val) : 0',
+    },
+    0x6a => {
+        Name => 'ISO',
+        Format => 'int32u',
+    },
+    0xd1 => {
+        Name => 'Software',
+        Notes => 'these tags are shifted up by 1 byte for some models like the HD1A',
+        Format => 'undef[32]',
+        RawConv => q{
+            $val =~ /^SANYO/ or return undef;
+            $val =~ tr/\0//d;
+            $$self{SanyoSledder0xd1} = 1;
+            return $val;
+        },
+    },
+    0xd2 => {
+        Name => 'Software',
+        Format => 'undef[32]',
+        RawConv => q{
+            $val =~ /^SANYO/ or return undef;
+            $val =~ tr/\0//d;
+            $$self{SanyoSledder0xd2} = 1;
+            return $val;
+        },
+    },
+    0xfd => {
+        Name => 'ThumbnailLength',
+        Condition => '$$self{SanyoSledder0xd1}',
+        Format => 'int32u',
+    },
+    0xfe => {
+        Name => 'ThumbnailLength',
+        Condition => '$$self{SanyoSledder0xd2}',
+        Format => 'int32u',
+    },
+    0x101 => {
+        Name => 'ThumbnailOffset',
+        Condition => '$$self{SanyoSledder0xd1}',
+        IsOffset => 1,
+        Format => 'int32u',
+        RawConv => '$val + 0xf1',
+    },
+    0x102 => {
+        Name => 'ThumbnailOffset',
+        Condition => '$$self{SanyoSledder0xd2}',
+        IsOffset => 1,
+        Format => 'int32u',
+        RawConv => '$val + 0xf2',
+    },
+);
+
+#------------------------------------------------------------------------------
+# Patch incorrect offsets in J1, J2, J4, S1, S3 and S4 maker notes
+# Inputs: 0) valuePtr, 1) end of previous value, 2) value size, 3) tag ID, 4) write flag
+sub FixOffsets($$$$;$)
+{
+    my ($valuePtr, $valEnd, $size, $tagID, $wFlag) = @_;
+    # ignore existing offsets and calculate reasonable values instead
+    if ($tagID == 0x100) {
+        # just ignore the SanyoThumbnail when writing (pointer is garbage)
+        $_[0] = undef if $wFlag;
+    } else {
+        $_[0] = $valEnd;    # set value pointer to next logical location
+        ++$size if $size & 0x01;
+        $_[1] += $size;     # update end-of-value pointer
+    }
+}
+
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Sanyo - Sanyo EXIF maker notes tags
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to interpret
+Sanyo maker notes in EXIF information.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.exif.org/makernotes/SanyoMakerNote.html>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/Sanyo Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Shift.pl
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Shift.pl	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Shift.pl	(revision 24799)
@@ -0,0 +1,582 @@
+#------------------------------------------------------------------------------
+# File:         Shift.pl
+#
+# Description:  ExifTool time shifting routines
+#
+# Revisions:    10/28/2005 - P. Harvey Created
+#------------------------------------------------------------------------------
+
+package Image::ExifTool;
+
+use strict;
+
+sub ShiftTime($$$;$);
+
+#------------------------------------------------------------------------------
+# apply shift to value in new value hash
+# Inputs: 0) shift type, 1) shift string, 2) raw date/time value, 3) new value hash ref
+# Returns: error string or undef on success and updates value in new value hash
+sub ApplyShift($$$;$)
+{
+    my ($func, $shift, $val, $nvHash) = @_;
+
+    # get shift direction from first character in shift string
+    $shift =~ s/^(\+|-)// or return 'Bad shift string (no sign)';
+    my $pre = $1;
+    my $dir = ($pre eq '+') ? 1 : -1;
+    my $tagInfo = $$nvHash{TagInfo};
+    my $tag = $$tagInfo{Name};
+    my $self = $$nvHash{Self};    # (used in eval)
+    my $shiftOffset;
+    if ($$nvHash{ShiftOffset}) {
+        $shiftOffset = $$nvHash{ShiftOffset};
+    } else {
+        $shiftOffset = $$nvHash{ShiftOffset} = { };
+    }
+
+    # initialize handler for eval warnings
+    local $SIG{'__WARN__'} = \&SetWarning;
+    SetWarning(undef);
+
+    # shift is applied to ValueConv value, so we must ValueConv-Shift-ValueConvInv
+    my ($type, $err);
+    foreach $type ('ValueConv','Shift','ValueConvInv') {
+        if ($type eq 'Shift') {
+            #### eval ShiftXxx function
+            $err = eval "Shift$func(\$val, \$shift, \$dir, \$shiftOffset)";
+        } elsif ($$tagInfo{$type}) {
+            my $conv = $$tagInfo{$type};
+            if (ref $conv eq 'CODE') {
+                $val = &$conv($val, $self);
+            } else {
+                return "Can't handle $type for $tag in ApplyShift()" if ref $$tagInfo{$type};
+                #### eval ValueConv/ValueConvInv ($val, $self)
+                $val = eval $$tagInfo{$type};
+            }
+        } else {
+            next;
+        }
+        # handle errors
+        $err and return $err;
+        $@ and SetWarning($@);
+        GetWarning() and return CleanWarning();
+    }
+    # update value in new value hash
+    $nvHash->{Value} = [ $val ];
+    return undef;   # success
+}
+
+#------------------------------------------------------------------------------
+# Check date/time shift
+# Inputs: 0) shift type, 1) shift string (without sign)
+# Returns: updated shift string, or undef on error (and may update shift)
+sub CheckShift($$)
+{
+    my ($type, $shift) = @_;
+    my $err;
+    if ($type eq 'Time') {
+        return "No shift direction" unless $shift =~ s/^(\+|-)//;
+        # do a test shift to validate the shift string
+        my $testTime = '2005:11:02 09:00:13.25-04:00';
+        $err = ShiftTime($testTime, $shift, $1 eq '+' ? 1 : -1);
+    } else {
+        $err = "Unknown shift type ($type)";
+    }
+    return $err;
+}
+
+#------------------------------------------------------------------------------
+# return the number of days in a month
+# Inputs: 0) month number (Jan=1, may be outside range), 1) year
+# Returns: number of days in month
+sub DaysInMonth($$)
+{
+    my ($mon, $year) = @_;
+    my @days = (31,28,31,30,31,30,31,31,30,31,30,31);
+    # adjust to the range [0,11]
+    while ($mon < 1)  { $mon += 12; --$year; }
+    while ($mon > 12) { $mon -= 12; ++$year; }
+    # return standard number of days unless february on a leap year
+    return $days[$mon-1] unless $mon == 2 and not $year % 4;
+    # leap years don't occur on even centuries except every 400 years
+    return 29 if $year % 100 or not $year % 400;
+    return 28;
+}
+
+#------------------------------------------------------------------------------
+# split times into corresponding components: YYYY mm dd HH MM SS tzh tzm
+# Inputs: 0) date/time or shift string 1) reference to list for returned components
+#         2) optional reference to list of time components (if shift string)
+# Returns: true on success
+# Returned components are 0-Y, 1-M, 2-D, 3-hr, 4-min, 5-sec, 6-tzhr, 7-tzmin
+sub SplitTime($$;$)
+{
+    my ($val, $vals, $time) = @_;
+    # insert zeros if missing in shift string
+    if ($time) {
+        $val =~ s/(^|[-+:\s]):/${1}0:/g;
+        $val =~ s/:([:\s]|$)/:0$1/g;
+    }
+    # change dashes to colons in date (for XMP dates)
+    if ($val =~ s/^(\d{4})-(\d{2})-(\d{2})/$1:$2:$3/) {
+        $val =~ tr/T/ /;    # change 'T' separator to ' '
+    }
+    # add space before timezone to split it into a separate word
+    $val =~ s/(\+|-)/ $1/;
+    my @words = split ' ', $val;
+    my $err = 1;
+    my @v;
+    for (;;) {
+        my $word = shift @words;
+        last unless defined $word;
+        # split word into separate numbers (allow decimal points but no signs)
+        my @vals = $word =~ /(?=\d|\.\d)\d*(?:\.\d*)?/g or last;
+        if ($word =~ /^(\+|-)/) {
+            # this is the timezone
+            (defined $v[6] or @vals > 2) and $err = 1, last;
+            my $sign = ($1 ne '-') ? 1 : -1;
+            # apply sign to both minutes and seconds
+            $v[6] = $sign * shift(@vals);
+            $v[7] = $sign * (shift(@vals) || 0);
+        } elsif ((@words and $words[0] =~ /^\d+/) or # there is a time word to follow
+            (not $time and $vals[0] =~ /^\d{3}/) or # first value is year (3 or more digits)
+            ($time and not defined $$time[3] and not defined $v[0])) # we don't have a time
+        {
+            # this is a date (must come first)
+            (@v or @vals > 3) and $err = 1, last;
+            not $time and @vals != 3 and $err = 1, last;
+            $v[2] = pop(@vals);     # take day first if only one specified
+            $v[1] = pop(@vals) || 0;
+            $v[0] = pop(@vals) || 0;
+        } else {
+            # this is a time (can't come after timezone)
+            (defined $v[3] or defined $v[6] or @vals > 3) and $err = 1, last;
+            not $time and @vals != 3 and @vals != 2 and $err = 1, last;
+            $v[3] = shift(@vals);   # take hour first if only one specified
+            $v[4] = shift(@vals) || 0;
+            $v[5] = shift(@vals) || 0;
+        }
+        $err = 0;
+    }
+    return 0 if $err or not @v;
+    if ($time) {
+        # zero any required shift entries which aren't yet defined
+        $v[0] = $v[1] = $v[2] = 0 if defined $$time[0] and not defined $v[0];
+        $v[3] = $v[4] = $v[5] = 0 if defined $$time[3] and not defined $v[3];
+        $v[6] = $v[7] = 0 if defined $$time[6] and not defined $v[6];
+    }
+    @$vals = @v;    # return split time components
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# shift date/time by components
+# Inputs: 0) split date/time list ref, 1) split shift list ref,
+#         2) shift direction, 3) reference to output list of shifted components
+#         4) number of decimal points in seconds
+#         5) reference to return time difference due to rounding
+# Returns: error string or undef on success
+sub ShiftComponents($$$$$;$)
+{
+    my ($time, $shift, $dir, $toTime, $dec, $rndPt) = @_;
+    # min/max for Y, M, D, h, m, s
+    my @min = (    0, 1, 1, 0, 0, 0);
+    my @max = (10000,12,28,24,60,60);
+    my $i;
+#
+# apply the shift
+#
+    my $c = 0;
+    for ($i=0; $i<@$time; ++$i) {
+        my $v = ($$time[$i] || 0) + $dir * ($$shift[$i] || 0) + $c;
+        # handle fractional values by propagating remainders downwards
+        if ($v != int($v) and $i < 5) {
+            my $iv = int($v);
+            $c = ($v - $iv) * $max[$i+1];
+            $v = $iv;
+        } else {
+            $c = 0;
+        }
+        $$toTime[$i] = $v;
+    }
+    # round off seconds to the required number of decimal points
+    my $sec = $$toTime[5];
+    if (defined $sec and $sec != int($sec)) {
+        my $mult = 10 ** $dec;
+        my $rndSec = int($sec * $mult + 0.5 * ($sec <=> 0)) / $mult;
+        $rndPt and $$rndPt = $sec - $rndSec;
+        $$toTime[5] = $rndSec;
+    }
+#
+# handle overflows, starting with least significant number first (seconds)
+#
+    $c = 0;
+    for ($i=5; $i>=0; $i--) {
+        defined $$time[$i] or $c = 0, next;
+        # apply shift and adjust for previous overflow
+        my $v = $$toTime[$i] + $c;
+        $c = 0; # set carry to zero
+        # adjust for over/underflow
+        my ($min, $max) = ($min[$i], $max[$i]);
+        if ($v < $min) {
+            if ($i == 2) {  # 2 = day of month
+                do {
+                    # add number of days in previous month
+                    --$c;
+                    my $mon = $$toTime[$i-1] + $c;
+                    $v += DaysInMonth($mon, $$toTime[$i-2]);
+                } while ($v < 1);
+            } else {
+                my $fc = ($v - $min) / $max;
+                # carry ($c) must be largest integer equal to or less than $fc
+                $c = int($fc);
+                --$c if $c > $fc;
+                $v -= $c * $max;
+            }
+        } elsif ($v >= $max + $min) {
+            if ($i == 2) {
+                for (;;) {
+                    # test against number of days in current month
+                    my $mon = $$toTime[$i-1] + $c;
+                    my $days = DaysInMonth($mon, $$toTime[$i-2]);
+                    last if $v <= $days;
+                    $v -= $days;
+                    ++$c;
+                    last if $v <= 28;
+                }
+            } else {
+                my $fc = ($v - $max - $min) / $max;
+                # carry ($c) must be smallest integer greater than $fc
+                $c = int($fc);
+                ++$c if $c <= $fc;
+                $v -= $c * $max;
+            }
+        }
+        $$toTime[$i] = $v;  # save the new value
+    }
+    # handle overflows in timezone
+    if (defined $$toTime[6]) {
+        my $m = $$toTime[6] * 60 + $$toTime[7];
+        $m += 0.5 * ($m <=> 0);     # avoid round-off errors
+        $$toTime[6] = int($m / 60);
+        $$toTime[7] = int($m - $$toTime[6] * 60);
+    }
+    return undef;   # success
+}
+
+#------------------------------------------------------------------------------
+# Shift date/time string
+# Inputs: 0) date/time string, 1) shift string, 2) shift direction (+1 or -1)
+#         3) reference to ShiftOffset hash (with Date, DateTime, Time, Timezone keys)
+# Returns: error string or undef on success and date/time string is updated
+sub ShiftTime($$$;$)
+{
+    local $_;
+    my ($val, $shift, $dir, $shiftOffset) = @_;
+    my (@time, @shift, @toTime, $mode, $needShiftOffset, $dec);
+#
+# figure out what we are dealing with (time, date or date/time)
+#
+    SplitTime($val, \@time) or return "Invalid time string ($val)";
+    if (defined $time[0]) {
+        $mode = defined $time[3] ? 'DateTime' : 'Date';
+    } elsif (defined $time[3]) {
+        $mode = 'Time';
+    }
+    # get number of digits after the seconds decimal point
+    if (defined $time[5] and $time[5] =~ /\.(\d+)/) {
+        $dec = length($1);
+    } else {
+        $dec = 0;
+    }
+    if ($shiftOffset) {
+        $needShiftOffset = 1 unless defined $$shiftOffset{$mode};
+        $needShiftOffset = 1 if defined $time[6] and not defined $$shiftOffset{Timezone};
+    } else {
+        $needShiftOffset = 1;
+    }
+    if ($needShiftOffset) {
+#
+# apply date/time shift the hard way
+#
+        SplitTime($shift, \@shift, \@time) or return "Invalid shift string ($shift)";
+
+        # change 'Z' timezone to '+00:00' only if necessary
+        if (@shift > 6 and @time <= 6) {
+            $time[6] = $time[7] = 0 if $val =~ s/Z$/\+00:00/;
+        }
+        my $rndDiff;
+        my $err = ShiftComponents(\@time, \@shift, $dir, \@toTime, $dec, \$rndDiff);
+        $err and return $err;
+#
+# calculate and save the shift offsets for next time
+#
+        if ($shiftOffset) {
+            if (defined $time[0] or defined $time[3]) {
+                my @tm1 = (0, 0, 0, 1, 0, 2000);
+                my @tm2 = (0, 0, 0, 1, 0, 2000);
+                if (defined $time[0]) {
+                    @tm1[3..5] = reverse @time[0..2];
+                    @tm2[3..5] = reverse @toTime[0..2];
+                    --$tm1[4]; # month should start from 0
+                    --$tm2[4];
+                }
+                my $diff = 0;
+                if (defined $time[3]) {
+                    @tm1[0..2] = reverse @time[3..5];
+                    @tm2[0..2] = reverse @toTime[3..5];
+                    # handle fractional seconds separately
+                    $diff = $tm2[0] - int($tm2[0]) - ($tm1[0] - int($tm1[0]));
+                    $diff += $rndDiff if defined $rndDiff;  # un-do rounding
+                    $tm1[0] = int($tm1[0]);
+                    $tm2[0] = int($tm2[0]);
+                }
+                eval q{
+                    require Time::Local;
+                    $diff += Time::Local::timegm(@tm2) - Time::Local::timegm(@tm1);
+                };
+                # not a problem if we failed here since we'll just try again next time,
+                # so don't return error message
+                unless (@$) {
+                    my $mode;
+                    if (defined $time[0]) {
+                        $mode = defined $time[3] ? 'DateTime' : 'Date';
+                    } else {
+                        $mode = 'Time';
+                    }
+                    $$shiftOffset{$mode} = $diff;
+                }
+            }
+            if (defined $time[6]) {
+                $$shiftOffset{Timezone} = ($toTime[6] - $time[6]) * 60 +
+                                           $toTime[7] - $time[7];
+            }
+        }
+
+    } else {
+#
+# apply shift from previously calculated offsets
+#
+        if ($$shiftOffset{Timezone} and @time <= 6) {
+            # change 'Z' timezone to '+00:00' only if necessary
+            $time[6] = $time[7] = 0 if $val =~ s/Z$/\+00:00/;
+        }
+        # apply the previous date/time shift if necessary
+        if ($mode) {
+            my @tm = (0, 0, 0, 1, 0, 2000);
+            if (defined $time[0]) {
+                @tm[3..5] = reverse @time[0..2];
+                --$tm[4]; # month should start from 0
+            }
+            @tm[0..2] = reverse @time[3..5] if defined $time[3];
+            # save fractional seconds
+            my $frac = $tm[0] - int($tm[0]);
+            $tm[0] = int($tm[0]);
+            my $tm;
+            eval q{
+                require Time::Local;
+                $tm = Time::Local::timegm(@tm) + $frac;
+            };
+            $@ and return CleanWarning($@);
+            $tm += $$shiftOffset{$mode};    # apply the shift
+            $tm < 0 and return 'Shift results in negative time';
+            # save fractional seconds in shifted time
+            $frac = $tm - int($tm);
+            if ($frac) {
+                $tm = int($tm);
+                # must account for any rounding that could occur
+                $frac + 0.5 * 10 ** (-$dec) >= 1 and ++$tm, $frac = 0;
+            }
+            @tm = gmtime($tm);
+            @toTime = reverse @tm[0..5];
+            $toTime[0] += 1900;
+            ++$toTime[1];
+            $toTime[5] += $frac;    # add the fractional seconds back in
+        }
+        # apply the previous timezone shift if necessary
+        if (defined $time[6]) {
+            my $m = $time[6] * 60 + $time[7];
+            $m += $$shiftOffset{Timezone};
+            $m += 0.5 * ($m <=> 0);     # avoid round-off errors
+            $toTime[6] = int($m / 60);
+            $toTime[7] = int($m - $toTime[6] * 60);
+        }
+    }
+#
+# insert shifted time components back into original string
+#
+    my ($i, $err);
+    for ($i=0; $i<@toTime; ++$i) {
+        next unless defined $time[$i] and defined $toTime[$i];
+        my ($v, $d, $s);
+        if ($i != 6) {  # not timezone hours
+            last unless $val =~ /((?=\d|\.\d)\d*(\.\d*)?)/g;
+            next if $toTime[$i] == $time[$i];
+            $v = $1;    # value
+            $d = $2;    # decimal part of value
+            $s = '';    # no sign
+        } else {
+            last if $time[$i] == $toTime[$i] and $time[$i+1] == $toTime[$i+1];
+            last unless $val =~ /((?:\+|-)(?=\d|\.\d)\d*(\.\d*)?)/g;
+            $v = $1;
+            $d = $2;
+            if ($toTime[6] >= 0 and $toTime[7] >= 0) {
+                $s = '+';
+            } else {
+                $s = '-';
+                $toTime[6] = -$toTime[6];
+                $toTime[7] = -$toTime[7];
+            }
+        }
+        my $nv = $toTime[$i];
+        my $pos = pos $val;
+        my $len = length $v;
+        my $sig = $len - length $s;
+        my $dec = $d ? length($d) - 1 : 0;
+        my $newNum = sprintf($dec ? "$s%0$sig.${dec}f" : "$s%0${sig}d", $nv);
+        length($newNum) != $len and $err = 1;
+        substr($val, $pos - $len, $len) = $newNum;
+        pos($val) = $pos;
+    }
+    $err and return "Error packing shifted time ($val)";
+    $_[0] = $val;   # return shifted value
+    return undef;   # success!
+}
+
+
+1; # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Shift.pl - ExifTool time shifting routines
+
+=head1 DESCRIPTION
+
+This module contains routines used by ExifTool to shift date and time
+values.
+
+=head1 DETAILS
+
+Time shifts are applied to standard EXIF-formatted date/time values (ie.
+C<2005:03:14 18:55:00>).  Date-only and time-only values may also be
+shifted, and an optional timezone (ie. C<-05:00>) is also supported.  Here
+are some general rules and examples to explain how shift strings are
+interpreted:
+
+Date-only values are shifted using the following formats:
+
+    'Y:M:D'     - shift date by 'Y' years, 'M' months and 'D' days
+    'M:D'       - shift months and days only
+    'D'         - shift specified number of days
+
+Time-only values are shifted using the following formats:
+
+    'h:m:s'     - shift time by 'h' hours, 'm' minutes and 's' seconds
+    'h:m'       - shift hours and minutes only
+    'h'         - shift specified number of hours
+
+Timezone shifts are specified in the following formats:
+
+    '+h:m'      - shift timezone by 'h' hours and 'm' minutes
+    '-h:m'      - negative shift of timezone hours and minutes
+    '+h'        - shift timezone hours only
+    '-h'        - negative shift of timezone hours only
+
+A valid shift value consists of one or two arguments, separated by a space.
+If only one is provided, it is assumed to be a time shift when applied to a
+time-only or a date/time value, or a date shift when applied to a date-only
+value.  For example:
+
+    '7'         - shift by 1 hour if applied to a time or date/time
+                  value, or by one day if applied to a date value
+    '2:0'       - shift 2 hours (time, date/time), or 2 months (date)
+    '5:0:0'     - shift 5 hours (time, date/time), or 5 years (date)
+    '0:0:1'     - shift 1 s (time, date/time), or 1 day (date)
+
+If two arguments are given, the date shift is first, followed by the time
+shift:
+
+    '3:0:0 0'         - shift date by 3 years
+    '0 15:30'         - shift time by 15 hours and 30 minutes
+    '1:0:0 0:0:0+5:0' - shift date by 1 year and timezone by 5 hours
+
+A date shift is simply ignored if applied to a time value or visa versa.
+
+Numbers specified in shift fields may contain a decimal point:
+
+    '1.5'       - 1 hour 30 minutes (time, date/time), or 1 day (date)
+    '2.5 0'     - 2 days 12 hours (date/time), 12 hours (time) or
+                  2 days (date)
+
+And to save typing, a zero is assumed for any missing numbers:
+
+    '1::'       - shift by 1 hour (time, date/time) or 1 year (date)
+    '26:: 0'    - shift date by 26 years
+    '+:30       - shift timezone by 30 minutes
+
+Below are some specific examples applied to real date and/or time values
+('Dir' is the applied shift direction: '+' is positive, '-' is negative):
+
+     Original Value         Shift   Dir    Shifted Value
+    ---------------------  -------  ---  ---------------------
+    '20:30:00'             '5'       +   '01:30:00'
+    '2005:01:27'           '5'       +   '2005:02:01'
+    '11:54:00'             '2.5 0'   -   '23:54:00'
+    '2005:11:02'           '2.5 0'   -   '2005:10:31'
+    '2005:11:02 11:54:00'  '2.5 0'   -   '2005:10:30 23:54:00'
+    '2004:02:28 08:00:00'  '1 1.3'   +   '2004:02:29 09:18:00'
+    '07:00:00'             '-5'      +   '07:00:00'
+    '07:00:00+01:00'       '-5'      +   '07:00:00-04:00'
+    '07:00:00Z'            '+2:30'   -   '07:00:00-02:30'
+    '1970:01:01'           '35::'    +   '2005:01:01'
+    '2005:01:01'           '400'     +   '2006:02:05'
+    '10:00:00.00'          '::1.33'  +   '09:59:58.67'
+
+=head1 NOTES
+
+The format of the original date/time value is not changed when the time
+shift is applied.  This means that the length of the date/time string will
+not change, and only the numbers in the string will be modified.  The only
+exception to this rule is that a 'Z' timezone is changed to '+00:00'
+notation if a timezone shift is applied.  A timezone will not be added to
+the date/time string.
+
+=head1 TRICKY
+
+This module is perhaps more complicated than it needs to be because it is
+designed to be very flexible in the way time shifts are specified and
+applied...
+
+The ability to shift dates by Y years, M months, etc, is somewhat
+contradictory to the goal of maintaining a constant shift for all time
+values when applying a batch shift.  This is because shifting by 1 month can
+be equivalent to anything from 28 to 31 days, and 1 year can be 365 or 366
+days, depending on the starting date.
+
+The inconsistency is handled by shifting the first tag found with the actual
+specified shift, then calculating the equivalent time difference in seconds
+for this shift and applying this difference to subsequent tags in a batch
+conversion.  So if it works as designed, the behaviour should be both
+intuitive and mathematically correct, and the user shouldn't have to worry
+about details such as this (in keeping with Perl's "do the right thing"
+philosophy).
+
+=head1 BUGS
+
+This feature uses the standard time library functions, which typically are
+limited to dates in the range 1970 to 2038.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Shortcuts.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Shortcuts.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Shortcuts.pm	(revision 24799)
@@ -0,0 +1,287 @@
+#------------------------------------------------------------------------------
+# File:         Shortcuts.pm
+#
+# Description:  ExifTool shortcut tags
+#
+# Revisions:    02/07/2004 - P. Harvey Moved out of Exif.pm
+#               09/15/2004 - P. Harvey Added D70Boring from Greg Troxel
+#               01/11/2005 - P. Harvey Added Canon20D from Christian Koller
+#               03/03/2005 - P. Harvey Added user defined shortcuts
+#               03/26/2005 - P. Harvey Added Nikon from Tom Christiansen
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Shortcuts;
+
+use strict;
+use vars qw($VERSION);
+
+$VERSION = '1.41';
+
+# this is a special table used to define command-line shortcuts
+%Image::ExifTool::Shortcuts::Main = (
+    # this shortcut allows the three common date/time tags to be shifted at once
+    AllDates => [
+        'DateTimeOriginal',
+        'CreateDate',
+        'ModifyDate',
+    ],
+    # This is a shortcut to some common information which is useful in most images
+    Common => [
+        'FileName',
+        'FileSize',
+        'Model',
+        'DateTimeOriginal',
+        'ImageSize',
+        'Quality',
+        'FocalLength',
+        'ShutterSpeed',
+        'Aperture',
+        'ISO',
+        'WhiteBalance',
+        'Flash',
+    ],
+    # This shortcut provides the same information as the Canon utilities
+    Canon => [
+        'FileName',
+        'Model',
+        'DateTimeOriginal',
+        'ShootingMode',
+        'ShutterSpeed',
+        'Aperture',
+        'MeteringMode',
+        'ExposureCompensation',
+        'ISO',
+        'Lens',
+        'FocalLength',
+        'ImageSize',
+        'Quality',
+        'Flash',
+        'FlashType',
+        'ConditionalFEC',
+        'RedEyeReduction',
+        'ShutterCurtainHack',
+        'WhiteBalance',
+        'FocusMode',
+        'Contrast',
+        'Sharpness',
+        'Saturation',
+        'ColorTone',
+        'ColorSpace',
+        'LongExposureNoiseReduction',
+        'FileSize',
+        'FileNumber',
+        'DriveMode',
+        'OwnerName',
+        'SerialNumber',
+    ],
+    Nikon => [
+        'Model',
+        'SubSecDateTimeOriginal',
+        'ShutterCount',
+        'LensSpec',
+        'FocalLength',
+        'ImageSize',
+        'ShutterSpeed',
+        'Aperture',
+        'ISO',
+        'NoiseReduction',
+        'ExposureProgram',
+        'ExposureCompensation',
+        'WhiteBalance',
+        'WhiteBalanceFineTune',
+        'ShootingMode',
+        'Quality',
+        'MeteringMode',
+        'FocusMode',
+        'ImageOptimization',
+        'ToneComp',
+        'ColorHue',
+        'ColorSpace',
+        'HueAdjustment',
+        'Saturation',
+        'Sharpness',
+        'Flash',
+        'FlashMode',
+        'FlashExposureComp',
+    ],
+    # This shortcut may be useful when copying tags between files to either
+    # copy the maker notes as a block or prevent it from being copied
+    MakerNotes => [
+        'MakerNotes',   # (for RIFF MakerNotes)
+        'MakerNoteCanon',
+        'MakerNoteCasio',
+        'MakerNoteCasio2',
+        'MakerNoteFujiFilm',
+        'MakerNoteGE',
+        'MakerNoteGE2',
+        'MakerNoteHP',
+        'MakerNoteHP2',
+        'MakerNoteHP4',
+        'MakerNoteHP6',
+        'MakerNoteISL',
+        'MakerNoteJVC',
+        'MakerNoteJVCText',
+        'MakerNoteKodak1a',
+        'MakerNoteKodak1b',
+        'MakerNoteKodak2',
+        'MakerNoteKodak3',
+        'MakerNoteKodak4',
+        'MakerNoteKodak5',
+        'MakerNoteKodak6a',
+        'MakerNoteKodak6b',
+        'MakerNoteKodak7',
+        'MakerNoteKodak8a',
+        'MakerNoteKodak8b',
+        'MakerNoteKodak9',
+        'MakerNoteKodak10',
+        'MakerNoteKodakUnknown',
+        'MakerNoteKyocera',
+        'MakerNoteMinolta',
+        'MakerNoteMinolta2',
+        'MakerNoteMinolta3',
+        'MakerNoteNikon',
+        'MakerNoteNikon2',
+        'MakerNoteNikon3',
+        'MakerNoteOlympus',
+        'MakerNoteOlympus2',
+        'MakerNoteLeica',
+        'MakerNoteLeica2',
+        'MakerNoteLeica3',
+        'MakerNoteLeica4',
+        'MakerNoteLeica5',
+        'MakerNoteLeica6',
+        'MakerNotePanasonic',
+        'MakerNotePanasonic2',
+        'MakerNotePentax',
+        'MakerNotePentax2',
+        'MakerNotePentax3',
+        'MakerNotePentax4',
+        'MakerNotePentax5',
+        'MakerNotePhaseOne',
+        'MakerNoteReconyx',
+        'MakerNoteRicoh',
+        'MakerNoteRicohText',
+        'MakerNoteSamsung1a',
+        'MakerNoteSamsung1b',
+        'MakerNoteSamsung2',
+        'MakerNoteSanyo',
+        'MakerNoteSanyoC4',
+        'MakerNoteSanyoPatch',
+        'MakerNoteSigma',
+        'MakerNoteSony',
+        'MakerNoteSony2',
+        'MakerNoteSony3',
+        'MakerNoteSony4',
+        'MakerNoteSonyEricsson',
+        'MakerNoteSonySRF',
+        'MakerNoteUnknownText',
+        'MakerNoteUnknown',
+    ],
+    # "unsafe" tags we normally don't copy in JPEG images, defined
+    # as a shortcut to use when rebuilding JPEG EXIF from scratch
+    Unsafe => [
+        'IFD0:YCbCrPositioning',
+        'IFD0:YCbCrCoefficients',
+        'IFD0:TransferFunction',
+        'ExifIFD:ComponentsConfiguration',
+        'ExifIFD:CompressedBitsPerPixel',
+        'InteropIFD:InteropIndex',
+        'InteropIFD:InteropVersion',
+        'InteropIFD:RelatedImageWidth',
+        'InteropIFD:RelatedImageHeight',
+    ],
+    # common metadata tags found in IFD0 of TIFF images
+    CommonIFD0 => [
+        # standard EXIF
+        'IFD0:ImageDescription',
+        'IFD0:Make',
+        'IFD0:Model',
+        'IFD0:Software',
+        'IFD0:ModifyDate',
+        'IFD0:Artist',
+        'IFD0:Copyright',
+        # other TIFF tags
+        'IFD0:Rating', 
+        'IFD0:RatingPercent',
+        'IFD0:DNGLensInfo',
+        'IFD0:PanasonicTitle',
+        'IFD0:PanasonicTitle2',
+        'IFD0:XPTitle',
+        'IFD0:XPComment',
+        'IFD0:XPAuthor',
+        'IFD0:XPKeywords',
+        'IFD0:XPSubject',
+    ],
+);
+
+#------------------------------------------------------------------------------
+# load user-defined shortcuts if available
+# Inputs: reference to user-defined shortcut hash
+sub LoadShortcuts($)
+{
+    my $shortcuts = shift;
+    my $shortcut;
+    foreach $shortcut (keys %$shortcuts) {
+        my $val = $$shortcuts{$shortcut};
+        # also allow simple aliases
+        $val = [ $val ] unless ref $val eq 'ARRAY';
+        # save the user-defined shortcut or alias
+        $Image::ExifTool::Shortcuts::Main{$shortcut} = $val;
+    }
+}
+# (for backward compatibility, renamed in ExifTool 7.75)
+if (%Image::ExifTool::Shortcuts::UserDefined) {
+    LoadShortcuts(\%Image::ExifTool::Shortcuts::UserDefined);
+}
+if (%Image::ExifTool::UserDefined::Shortcuts) {
+    LoadShortcuts(\%Image::ExifTool::UserDefined::Shortcuts);
+}
+
+
+1; # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Shortcuts - ExifTool shortcut tags
+
+=head1 SYNOPSIS
+
+This module is required by Image::ExifTool.
+
+=head1 DESCRIPTION
+
+This module contains definitions for tag name shortcuts used by
+Image::ExifTool.  You can customize this file to add your own shortcuts.
+
+Individual users may also add their own shortcuts to the .ExifTool_config
+file in their home directory (or the directory specified by the
+EXIFTOOL_HOME environment variable).  The shortcuts are defined in a hash
+called %Image::ExifTool::UserDefined::Shortcuts.  The keys of the hash are
+the shortcut names, and the elements are either tag names or references to
+lists of tag names.
+
+An example shortcut definition in .ExifTool_config:
+
+    %Image::ExifTool::UserDefined::Shortcuts = (
+        MyShortcut => ['createdate','exif:exposuretime','aperture'],
+        MyAlias => 'FocalLengthIn35mmFormat',
+    );
+
+In this example, MyShortcut is a shortcut for the CreateDate,
+EXIF:ExposureTime and Aperture tags, and MyAlias is a shortcut for
+FocalLengthIn35mmFormat.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Sigma.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Sigma.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Sigma.pm	(revision 24799)
@@ -0,0 +1,324 @@
+#------------------------------------------------------------------------------
+# File:         Sigma.pm
+#
+# Description:  Sigma/Foveon EXIF maker notes tags
+#
+# Revisions:    04/06/2004 - P. Harvey Created
+#               02/20/2007 - PH added SD14 tags
+#               24/06/2010 - PH decode some SD15 tags
+#
+# Reference:    http://www.x3f.info/technotes/FileDocs/MakerNoteDoc.html
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Sigma;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool::Exif;
+
+$VERSION = '1.09';
+
+%Image::ExifTool::Sigma::Main = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    WRITABLE => 'string',
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0x0002 => 'SerialNumber',
+    0x0003 => 'DriveMode',
+    0x0004 => 'ResolutionMode',
+    0x0005 => 'AFMode',
+    0x0006 => 'FocusSetting',
+    0x0007 => 'WhiteBalance',
+    0x0008 => {
+        Name => 'ExposureMode',
+        PrintConv => { #PH
+            A => 'Aperture-priority AE',
+            M => 'Manual',
+            P => 'Program AE',
+            S => 'Shutter speed priority AE',
+        },
+    },
+    0x0009 => {
+        Name => 'MeteringMode',
+        PrintConv => { #PH
+            A => 'Average',
+            C => 'Center-weighted average',
+            8 => 'Multi-segment',
+        },
+    },
+    0x000a => 'LensFocalRange',
+    0x000b => 'ColorSpace',
+    # SIGMA PhotoPro writes these tags as strings, but some cameras (at least) write them as rational
+    0x000c => [
+        {
+            Name => 'ExposureCompensation',
+            Condition => '$format eq "string"',
+            ValueConv => '$val =~ s/Expo:\s*//, $val',
+            ValueConvInv => 'IsFloat($val) ? sprintf("Expo:%+.1f",$val) : undef',
+        },
+        { #PH
+            Name => 'ExposureAdjust',
+            Writable => 'rational64s',
+            Unknown => 1,
+        },
+    ],
+    0x000d => [
+        {
+            Name => 'Contrast',
+            Condition => '$format eq "string"',
+            ValueConv => '$val =~ s/Cont:\s*//, $val',
+            ValueConvInv => 'IsFloat($val) ? sprintf("Cont:%+.1f",$val) : undef',
+        },
+        { #PH
+            Name => 'Contrast',
+            Writable => 'rational64s',
+        },
+    ],
+    0x000e => [
+        {
+            Name => 'Shadow',
+            Condition => '$format eq "string"',
+            ValueConv => '$val =~ s/Shad:\s*//, $val',
+            ValueConvInv => 'IsFloat($val) ? sprintf("Shad:%+.1f",$val) : undef',
+        },
+        { #PH
+            Name => 'Shadow',
+            Writable => 'rational64s',
+        },
+    ],
+    0x000f => [
+        {
+            Name => 'Highlight',
+            Condition => '$format eq "string"',
+            ValueConv => '$val =~ s/High:\s*//, $val',
+            ValueConvInv => 'IsFloat($val) ? sprintf("High:%+.1f",$val) : undef',
+        },
+        { #PH
+            Name => 'Highlight',
+            Writable => 'rational64s',
+        },
+    ],
+    0x0010 => [
+        {
+            Name => 'Saturation',
+            Condition => '$format eq "string"',
+            ValueConv => '$val =~ s/Satu:\s*//, $val',
+            ValueConvInv => 'IsFloat($val) ? sprintf("Satu:%+.1f",$val) : undef',
+        },
+        { #PH
+            Name => 'Saturation',
+            Writable => 'rational64s',
+        },
+    ],
+    0x0011 => [
+        {
+            Name => 'Sharpness',
+            Condition => '$format eq "string"',
+            ValueConv => '$val =~ s/Shar:\s*//, $val',
+            ValueConvInv => 'IsFloat($val) ? sprintf("Shar:%+.1f",$val) : undef',
+        },
+        { #PH
+            Name => 'Sharpness',
+            Writable => 'rational64s',
+        },
+    ],
+    0x0012 => [
+        {
+            Name => 'X3FillLight',
+            Condition => '$format eq "string"',
+            ValueConv => '$val =~ s/Fill:\s*//, $val',
+            ValueConvInv => 'IsFloat($val) ? sprintf("Fill:%+.1f",$val) : undef',
+        },
+        { #PH
+            Name => 'X3FillLight',
+            Writable => 'rational64s',
+        },
+    ],
+    0x0014 => [
+        {
+            Name => 'ColorAdjustment',
+            Condition => '$format eq "string"',
+            ValueConv => '$val =~ s/CC:\s*//, $val',
+            ValueConvInv => 'IsInt($val) ? "CC:$val" : undef',
+        },
+        { #PH
+            Name => 'ColorAdjustment',
+            Writable => 'rational64s',
+            Count => 3,
+        },
+    ],
+    0x0015 => 'AdjustmentMode',
+    0x0016 => {
+        Name => 'Quality',
+        ValueConv => '$val =~ s/Qual:\s*//, $val',
+        ValueConvInv => 'IsInt($val) ? "Qual:$val" : undef',
+    },
+    0x0017 => 'Firmware',
+    0x0018 => 'Software',
+    0x0019 => 'AutoBracket',
+    0x001a => [ #PH
+        {
+            Name => 'PreviewImageStart',
+            Condition => '$format eq "int32u"',
+            IsOffset => 1,
+            OffsetPair => 0x001b,
+            DataTag => 'PreviewImage',
+            Writable => 'int32u',
+            Protected => 2,
+        },{ # (written by Sigma Photo Pro)
+            Name => 'ChrominanceNoiseReduction',
+            ValueConv => '$val =~ s/Chro:\s*//, $val',
+            ValueConvInv => 'IsFloat($val) ? sprintf("Chro:%+.1f",$val) : undef',
+        },
+    ],
+    0x001b => [ #PH
+        {
+            Name => 'PreviewImageLength',
+            Condition => '$format eq "int32u"',
+            OffsetPair => 0x001a,
+            DataTag => 'PreviewImage',
+            Writable => 'int32u',
+            Protected => 2,
+        },{ # (written by Sigma Photo Pro)
+            Name => 'LuminanceNoiseReduction',
+            ValueConv => '$val =~ s/Luma:\s*//, $val',
+            ValueConvInv => 'IsFloat($val) ? sprintf("Luma:%+.1f",$val) : undef',
+        },
+    ],
+    0x001c => { #PH
+        Name => 'PreviewImageSize',
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0x001d => { #PH
+        Name => 'MakerNoteVersion',
+        Writable => 'undef',
+    },
+    # 0x001e - int16u: 0, 4, 13 - flash mode?
+    0x001f => { #PH (NC)
+        Name => 'AFPoint',
+        # values: "", "Center", "Center,Center", "Right,Right"
+    },
+    # 0x0020-21 - string: " "
+    0x0022 => { #PH (NC)
+        Name => 'FileFormat',
+        # values: "JPG", "JPG-S" or "X3F"
+    },
+    # 0x0023 - string: "", 10, 83, 131, 145, 150, 152, 169
+    0x0024 => 'Calibration',
+    # 0x0025 - string: "", "0.70", "0.90"
+    # 0x0026-2b - int32u: 0
+    0x002c => { #PH
+        Name => 'ColorMode',
+        Writable => 'int32u',
+        PrintConv => {
+            0 => 'n/a',
+            1 => 'Sepia',
+            2 => 'B&W',
+            3 => 'Standard',
+            4 => 'Vivid',
+            5 => 'Neutral',
+            6 => 'Portrait',
+            7 => 'Landscape',
+        },
+    },
+    # 0x002d - int32u: 0
+    # 0x002e - rational64s: (the negative of FlashExposureComp, but why?)
+    # 0x002f - int32u: 0, 1
+    0x0030 => { #PH
+        Name => 'LensApertureRange',
+        Notes => 'changes with focal length. MaxAperture for some models',
+    },
+    0x0031 => { #PH
+        Name => 'FNumber',
+        Writable => 'rational64u',
+        PrintConv => 'sprintf("%.1f",$val)',
+        PrintConvInv => '$val',
+    },
+    0x0032 => { #PH
+        Name => 'ExposureTime',
+        Writable => 'rational64u',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    0x0033 => { #PH
+        Name => 'ExposureTime2',
+        Writable => 'string',
+        ValueConv => '$val * 1e-6',
+        ValueConvInv => 'int($val * 1e6 + 0.5)',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    0x0034 => { #PH
+        Name => 'BurstShot',
+        Writable => 'int32u',
+    },
+    # 0x0034 - int32u: 0,1,2,3 or 4
+    0x0035 => { #PH
+        Name => 'ExposureCompensation',
+        Writable => 'rational64s',
+        # add a '+' sign to positive values
+        PrintConv => '$val and $val =~ s/^(\d)/\+$1/; $val',
+        PrintConvInv => '$val',
+    },
+    # 0x0036 - string: "                    "
+    # 0x0037-38 - string: ""
+    0x0039 => { #PH
+        Name => 'SensorTemperature',
+        # (string format)
+        PrintConv => 'IsInt($val) ? "$val C" : $val',
+        PrintConvInv => '$val=~s/ ?C$//; $val',
+    },
+    0x003a => { #PH
+        Name => 'FlashExposureComp',
+        Writable => 'rational64s',
+    },
+    0x003b => { #PH (how is this different from other Firmware?)
+        Name => 'Firmware',
+        Priority => 0,
+    },
+    0x003c => 'WhiteBalance', #PH
+    0x003d => { #PH (new for SD15)
+        Name => 'PictureMode',
+        Notes => 'same as ColorMode, but "Standard" when ColorMode is Sepia or B&W',
+    },
+);
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Sigma - Sigma/Foveon EXIF maker notes tags
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to interpret
+Sigma and Foveon maker notes in EXIF information.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.x3f.info/technotes/FileDocs/MakerNoteDoc.html>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/Sigma Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/SigmaRaw.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/SigmaRaw.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/SigmaRaw.pm	(revision 24799)
@@ -0,0 +1,674 @@
+#------------------------------------------------------------------------------
+# File:         SigmaRaw.pm
+#
+# Description:  Read Sigma/Foveon RAW (X3F) meta information
+#
+# Revisions:    2005/10/16 - P. Harvey Created
+#               2009/11/30 - P. Harvey Support X3F v2.3 written by Sigma DP2
+#
+# References:   1) http://www.x3f.info/technotes/FileDocs/X3F_Format.pdf
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::SigmaRaw;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.14';
+
+sub ProcessX3FHeader($$$);
+sub ProcessX3FDirectory($$$);
+sub ProcessX3FProperties($$$);
+
+# sigma LensType lookup (ref PH)
+my %sigmaLensTypes = (
+    # 0 => 'Sigma 50mm F2.8 EX Macro', (0 used for other lenses too)
+    # 8 - 18-125mm LENSARANGE@18mm=22-4
+    16 => 'Sigma 18-50mm F3.5-5.6 DC',
+    129 => 'Sigma 14mm F2.8 EX Aspherical',
+    131 => 'Sigma 17-70mm F2.8-4.5 DC Macro',
+    145 => 'Sigma Lens (145)',
+    145.1 => 'Sigma 15-30mm F3.5-4.5 EX DG Aspherical',
+    145.2 => 'Sigma 18-50mm F2.8 EX DG', #(NC)
+    145.3 => 'Sigma 20-40mm F2.8 EX DG',
+    165 => 'Sigma 70-200mm F2.8 EX', # ...but what specific model?:
+    # 70-200mm F2.8 EX APO - Original version, minimum focus distance 1.8m (1999)
+    # 70-200mm F2.8 EX DG - Adds 'digitally optimized' lens coatings to reduce flare (2005)
+    # 70-200mm F2.8 EX DG Macro (HSM) - Minimum focus distance reduced to 1m (2006)
+    # 70-200mm F2.8 EX DG Macro HSM II - Improved optical performance (2007)
+    169 => 'Sigma 18-50mm F2.8 EX DC', #(NC)
+    '100' => 'Sigma 24-70mm f/2.8 DG Macro', # (SD15)
+    8900 => 'Sigma 70-300mm f/4-5.6 DG OS', # (SD15)
+);
+
+# main X3F sections (plus header stuff)
+%Image::ExifTool::SigmaRaw::Main = (
+    PROCESS_PROC => \&ProcessX3FDirectory,
+    NOTES => q{
+        These tags are used in Sigma and Foveon RAW (.X3F) images.  Metadata is also
+        extracted from the JpgFromRaw image if it exists (all models but the SD9 and
+        SD10).  Currently, metadata may only be written to the embedded JpgFromRaw.
+    },
+    Header => {
+        SubDirectory => { TagTable => 'Image::ExifTool::SigmaRaw::Header' },
+    },
+    HeaderExt => {
+        SubDirectory => { TagTable => 'Image::ExifTool::SigmaRaw::HeaderExt' },
+    },
+    PROP => {
+        Name => 'Properties',
+        SubDirectory => { TagTable => 'Image::ExifTool::SigmaRaw::Properties' },
+    },
+    IMAG => {
+        Name => 'PreviewImage',
+        Binary => 1,
+    },
+    IMA2 => [
+        {
+            Name => 'PreviewImage',
+            Condition => 'not $$self{IsJpgFromRaw}',
+            Binary => 1,
+        },
+        {
+            Name => 'JpgFromRaw',
+            Binary => 1,
+        },
+    ]
+);
+
+# common X3F header structure
+%Image::ExifTool::SigmaRaw::Header = (
+    PROCESS_PROC => \&ProcessX3FHeader,
+    FORMAT => 'int32u',
+    1 => {
+        Name => 'FileVersion',
+        ValueConv => '($val >> 16) . "." . ($val & 0xffff)',
+    },
+    2 => {
+        Name => 'ImageUniqueID',
+        # the serial number (with an extra leading "0") makes up
+        # the first 8 digits of this UID,
+        Format => 'undef[16]',
+        ValueConv => 'unpack("H*", $val)',
+    },
+    6 => {
+        Name => 'MarkBits',
+        PrintConv => { BITMASK => { } },
+    },
+    7 => 'ImageWidth',
+    8 => 'ImageHeight',
+    9 => 'Rotation',
+    10 => {
+        Name => 'WhiteBalance',
+        Format => 'string[32]',
+    },
+    18 => { #PH (DP2, FileVersion 2.3)
+        Name => 'SceneCaptureType',
+        Format => 'string[32]',
+    },
+);
+
+# extended header tags
+%Image::ExifTool::SigmaRaw::HeaderExt = (
+    GROUPS => { 2 => 'Camera' },
+    NOTES => 'Extended header data found in version 2.1 and 2.2 files',
+    0 => 'Unused',
+    1 => { Name => 'ExposureAdjust',PrintConv => 'sprintf("%.1f",$val)' },
+    2 => { Name => 'Contrast',      PrintConv => 'sprintf("%.1f",$val)' },
+    3 => { Name => 'Shadow',        PrintConv => 'sprintf("%.1f",$val)' },
+    4 => { Name => 'Highlight',     PrintConv => 'sprintf("%.1f",$val)' },
+    5 => { Name => 'Saturation',    PrintConv => 'sprintf("%.1f",$val)' },
+    6 => { Name => 'Sharpness',     PrintConv => 'sprintf("%.1f",$val)' },
+    7 => { Name => 'RedAdjust',     PrintConv => 'sprintf("%.1f",$val)' },
+    8 => { Name => 'GreenAdjust',   PrintConv => 'sprintf("%.1f",$val)' },
+    9 => { Name => 'BlueAdjust',    PrintConv => 'sprintf("%.1f",$val)' },
+   10 => { Name => 'X3FillLight',   PrintConv => 'sprintf("%.1f",$val)' },
+);
+
+# PROP tags
+%Image::ExifTool::SigmaRaw::Properties = (
+    PROCESS_PROC => \&ProcessX3FProperties,
+    GROUPS => { 2 => 'Camera' },
+    AEMODE => {
+        Name => 'MeteringMode',
+        PrintConv => {
+            8 => '8-segment',
+            C => 'Center-weighted average',
+            A => 'Average',
+        },
+    },
+    AFAREA      => 'AFArea', # observed: CENTER_V
+    AFINFOCUS   => 'AFInFocus', # observed: H
+    AFMODE      => 'FocusMode',
+    AP_DESC     => 'ApertureDisplayed',
+    APERTURE => {
+        Name => 'FNumber',
+        Groups => { 2 => 'Image' },
+        PrintConv => 'sprintf("%.1f",$val)',
+    },
+    BRACKET     => 'BracketShot',
+    BURST       => 'BurstShot',
+    CAMMANUF    => 'Make',
+    CAMMODEL    => 'Model',
+    CAMNAME     => 'CameraName',
+    CAMSERIAL   => 'SerialNumber',
+    CM_DESC     => 'SceneCaptureType', #PH (DP2)
+    COLORSPACE  => 'ColorSpace', # observed: sRGB
+    DRIVE => {
+        Name => 'DriveMode',
+        PrintConv => {
+            SINGLE => 'Single Shot',
+            MULTI  => 'Multi Shot',
+            '2S'   => '2 s Timer',
+            '10S'  => '10 s Timer',
+            UP     => 'Mirror Up',
+            AB     => 'Auto Bracket',
+            OFF    => 'Off',
+        },
+    },
+    EVAL_STATE  => 'EvalState', # observed: POST-EXPOSURE
+    EXPCOMP => {
+        Name => 'ExposureCompensation',
+        Groups => { 2 => 'Image' },
+        PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
+    },
+    EXPNET => {
+        Name => 'NetExposureCompensation',
+        Groups => { 2 => 'Image' },
+        PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
+    },
+    EXPTIME => {
+        Name => 'IntegrationTime',
+        Groups => { 2 => 'Image' },
+        ValueConv => '$val * 1e-6', # convert from usec
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+    },
+    FIRMVERS    => 'FirmwareVersion',
+    FLASH => {
+        Name => 'FlashMode',
+        PrintConv => 'ucfirst(lc($val))',
+    },
+    FLASHEXPCOMP=> 'FlashExpComp',
+    FLASHPOWER  => 'FlashPower',
+    FLASHTTLMODE=> 'FlashTTLMode', # observed: ON
+    FLASHTYPE   => 'FlashType', # observed: NONE
+    FLENGTH => {
+        Name => 'FocalLength',
+        PrintConv => 'sprintf("%.1f mm",$val)',
+    },
+    FLEQ35MM => {
+        Name => 'FocalLengthIn35mmFormat',
+        PrintConv => 'sprintf("%.1f mm",$val)',
+    },
+    FOCUS => {
+        Name => 'Focus',
+        PrintConv => {
+            AF => 'Auto-focus Locked',
+           'NO LOCK' => "Auto-focus Didn't Lock",
+            M => 'Manual',
+        },
+    },
+    IMAGERBOARDID => 'ImagerBoardID',
+    IMAGERTEMP  => {
+        Name => 'SensorTemperature',
+        PrintConv => '"$val C"',
+    },
+    IMAGEBOARDID=> 'ImageBoardID', #PH (DP2)
+    ISO         => 'ISO',
+    LENSARANGE  => 'LensApertureRange',
+    LENSFRANGE  => 'LensFocalRange',
+    LENSMODEL   => {
+        Name => 'LensType',
+        Notes => q{
+            decimal values differentiate lenses which would otherwise have the same
+            LensType, and are used by the Composite LensID tag when attempting to
+            identify the specific lens model
+        },
+        PrintConv => \%sigmaLensTypes,
+    },
+    PMODE => {
+        Name => 'ExposureProgram',
+        PrintConv => {
+            P => 'Program',
+            A => 'Aperture Priority',
+            S => 'Shutter Priority',
+            M => 'Manual',
+        },
+    },
+    RESOLUTION => {
+        Name => 'Quality',
+        PrintConv => {
+            LOW => 'Low',
+            MED => 'Medium',
+            HI  => 'High',
+        },
+    },
+    SENSORID    => 'SensorID',
+    SH_DESC     => 'ShutterSpeedDisplayed',
+    SHUTTER => {
+        Name => 'ExposureTime',
+        Groups => { 2 => 'Image' },
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+    },
+    TIME => {
+        Name => 'DateTimeOriginal',
+        Groups => { 2 => 'Time' },
+        Description => 'Date/Time Original',
+        ValueConv => 'ConvertUnixTime($val)',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    WB_DESC     => 'WhiteBalance',
+    VERSION_BF  => 'VersionBF',
+);
+
+#------------------------------------------------------------------------------
+# Extract null-terminated unicode string from list of characters
+# Inputs: 0) ExifTool object ref, 1) list ref, 2) position in list
+# Returns: Converted string
+sub ExtractUnicodeString($$$)
+{
+    my ($exifTool, $chars, $pos) = @_;
+    my $i;
+    for ($i=$pos; $i<@$chars; ++$i) {
+        last unless $$chars[$i];
+    }
+    my $buff = pack('v*', @$chars[$pos..$i-1]);
+    return $exifTool->Decode($buff, 'UCS2', 'II');
+}
+
+#------------------------------------------------------------------------------
+# Process an X3F header
+# Inputs: 0) ExifTool object reference, 1) DirInfo reference, 2) tag table ref
+# Returns: 1 on success
+sub ProcessX3FHeader($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $hdrLen = $$dirInfo{DirLen};
+    my $verbose = $exifTool->Options('Verbose');
+
+    # process the static header structure first
+    $exifTool->ProcessBinaryData($dirInfo, $tagTablePtr);
+
+    # process extended data if available
+    if (length $$dataPt >= 232) {
+        if ($verbose) {
+            $exifTool->VerboseDir('X3F HeaderExt', 32);
+            Image::ExifTool::HexDump($dataPt, undef,
+                MaxLen => $verbose > 3 ? 1024 : 96,
+                Out    => $exifTool->Options('TextOut'),
+                Prefix => $$exifTool{INDENT},
+                Start  => $$dirInfo{DirLen},
+            ) if $verbose > 2;
+        }
+        $tagTablePtr = GetTagTable('Image::ExifTool::SigmaRaw::HeaderExt');
+        my @vals = unpack("x${hdrLen}C32V32", $$dataPt);
+        my $i;
+        my $unused = 0;
+        for ($i=0; $i<32; ++$i) {
+            $vals[$i] or ++$unused, next;
+            my $val = $vals[$i+32];
+            # convert value 0x40000000 => 2 ** 1, 0x3f800000 => 2 ** 0, 0x3f000000 => 2 ** -1
+            if ($val) {
+                my $sign;
+                if ($val & 0x80000000) {
+                    $sign = -1;
+                    $val &= 0x7fffffff;
+                } else {
+                    $sign = 1;
+                }
+                $val = $sign * 2 ** (($val - 0x3f800000) / 0x800000);
+            }
+            $exifTool->HandleTag($tagTablePtr, $vals[$i], $val,
+                Index  => $i,
+                DataPt => $dataPt,
+                Start  => $hdrLen + 32 + $i * 4,
+                Size   => 4,
+            );
+        }
+        $exifTool->VPrint(0, "$exifTool->{INDENT}($unused entries unused)\n");
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Process an X3F properties
+# Inputs: 0) ExifTool object reference, 1) DirInfo reference, 2) tag table ref
+# Returns: 1 on success
+sub ProcessX3FProperties($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $size = length($$dataPt);
+    my $verbose = $exifTool->Options('Verbose');
+    my $unknown = $exifTool->Options('Unknown');
+
+    unless ($size >= 24 and $$dataPt =~ /^SECp/) {
+        $exifTool->Warn('Bad properties header');
+        return 0;
+    }
+    my ($entries, $fmt, $len) = unpack('x8V2x4V', $$dataPt);
+    unless ($size >= 24 + 8 * $entries + $len) {
+        $exifTool->Warn('Truncated Property directory');
+        return 0;
+    }
+    $verbose and $exifTool->VerboseDir('Properties', $entries);
+    $fmt == 0 or $exifTool->Warn("Unsupported character format $fmt"), return 0;
+    my $charPos = 24 + 8 * $entries;
+    my @chars = unpack('v*',substr($$dataPt, $charPos, $len * 2));
+    my $index;
+    for ($index=0; $index<$entries; ++$index) {
+        my ($namePos, $valPos) = unpack('V2',substr($$dataPt, $index*8 + 24, 8));
+        if ($namePos >= @chars or $valPos >= @chars) {
+            $exifTool->Warn('Bad Property pointer');
+            return 0;
+        }
+        my $tag = ExtractUnicodeString($exifTool, \@chars, $namePos);
+        my $val = ExtractUnicodeString($exifTool, \@chars, $valPos);
+        if (not $$tagTablePtr{$tag} and $unknown and $tag =~ /^\w+$/) {
+            my $tagInfo = {
+                Name => "SigmaRaw_$tag",
+                Description => Image::ExifTool::MakeDescription('SigmaRaw', $tag),
+                Unknown => 1,
+                Writable => 0,  # can't write unknown tags
+            };
+            # add tag information to table
+            Image::ExifTool::AddTagToTable($tagTablePtr, $tag, $tagInfo);
+        }
+
+        $exifTool->HandleTag($tagTablePtr, $tag, $val,
+            Index => $index,
+            DataPt => $dataPt,
+            Start => $charPos + 2 * $valPos,
+            Size => 2 * (length($val) + 1),
+        );
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Write an X3F file
+# Inputs: 0) ExifTool object reference, 1) DirInfo reference (DirStart = directory offset)
+# Returns: error string, undef on success, or -1 on write error
+# Notes: Writes metadata to embedded JpgFromRaw image
+sub WriteX3F($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my $outfile = $$dirInfo{OutFile};
+    my ($outDir, $buff, $ver, $entries, $dir, $outPos, $index, $didContain);
+
+    $raf->Seek($$dirInfo{DirStart}, 0) or return 'Error seeking to directory start';
+
+    # read the X3F directory header (will be copied directly to output)
+    $raf->Read($outDir, 12) == 12 or return 'Truncated X3F image';
+    $outDir =~ /^SECd/ or return 'Bad section header';
+    ($ver, $entries) = unpack('x4V2', $outDir);
+
+    # do sanity check on number of entries in directory
+    return 'Invalid X3F directory count' unless $entries > 2 and $entries < 20;
+    # read the directory entries
+    unless ($raf->Read($dir, $entries * 12) == $entries * 12) {
+        return 'Truncated X3F directory';
+    }
+    # do a quick scan to determine the offset of the first data subsection
+    for ($index=0; $index<$entries; ++$index) {
+        my $pos = $index * 12;
+        my ($offset, $len, $tag) = unpack("x${pos}V2a4", $dir);
+        # remember position of first data subsection
+        $outPos = $offset if not defined $outPos or $outPos > $offset;
+    }
+    # copy the file header up to the start of the first data subsection
+    unless ($raf->Seek(0,0) and $raf->Read($buff, $outPos) == $outPos) {
+        return 'Error reading X3F header';
+    }
+    Write($outfile, $buff) or return -1;
+
+    # loop through directory, rewriting each section
+    for ($index=0; $index<$entries; ++$index) {
+
+        my $pos = $index * 12;
+        my ($offset, $len, $tag) = unpack("x${pos}V2a4", $dir);
+        $raf->Seek($offset, 0) or return 'Bad data offset';
+
+        if ($tag eq 'IMA2' and $len > 28) {
+            # check subsection header (28 bytes) to see if this is a JPEG preview image
+            $raf->Read($buff, 28) == 28 or return 'Error reading PreviewImage header';
+            Write($outfile, $buff) or return -1;
+            $len -= 28;
+
+            # only rewrite full-sized JpgFromRaw (version 2.0, type 2, format 18)
+            if ($buff =~ /^SECi\0\0\x02\0\x02\0\0\0\x12\0\0\0/ and
+                $$exifTool{ImageWidth} == unpack('x16V', $buff))
+            {
+                $raf->Read($buff, $len) == $len or return 'Error reading JpgFromRaw';
+                # use same write directories as JPEG
+                $exifTool->InitWriteDirs('JPEG');
+                # rewrite the embedded JPEG in memory
+                my $newData;
+                my %jpegInfo = (
+                    Parent  => 'X3F',
+                    RAF     => new File::RandomAccess(\$buff),
+                    OutFile => \$newData,
+                );
+                $$exifTool{FILE_TYPE} = 'JPEG';
+                my $success = $exifTool->WriteJPEG(\%jpegInfo);
+                $$exifTool{FILE_TYPE} = 'X3F';
+                SetByteOrder('II');
+                return 'Error writing X3F JpgFromRaw' unless $success and $newData;
+                return -1 if $success < 0;
+                # write new data if anything changed, otherwise copy old image
+                my $outPt = $$exifTool{CHANGED} ? \$newData : \$buff;
+                Write($outfile, $$outPt) or return -1;
+                # set $len to the total subsection data length
+                $len = length($$outPt) + 28;
+                $didContain = 1;
+            } else {
+                # copy original image data
+                Image::ExifTool::CopyBlock($raf, $outfile, $len) or return 'Corrupted X3F image';
+                $len += 28;
+            }
+        } else {
+            # copy data for this subsection
+            Image::ExifTool::CopyBlock($raf, $outfile, $len) or return 'Corrupted X3F directory';
+        }
+        # add directory entry and update output file position
+        $outDir .= pack('V2a4', $outPos, $len, $tag);
+        $outPos += $len;
+        # pad data to an even 4-byte boundary
+        if ($len & 0x03) {
+            my $pad = 4 - ($len & 0x03);
+            Write($outfile, "\0" x $pad) or return -1;
+            $outPos += $pad;
+        }
+    }
+    # warn if we couldn't add metadata to this image (should only be SD9 or SD10)
+    $didContain or $exifTool->Warn("Can't yet write SD9 or SD10 X3F images");
+    # write out the directory and the directory pointer, and we are done
+    Write($outfile, $outDir, pack('V', $outPos)) or return -1;
+    return undef;
+}
+
+#------------------------------------------------------------------------------
+# Process an X3F directory
+# Inputs: 0) ExifTool object reference, 1) DirInfo reference, 2) tag table ref
+# Returns: error string or undef on success
+sub ProcessX3FDirectory($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $raf = $$dirInfo{RAF};
+    my $verbose = $exifTool->Options('Verbose');
+
+    $raf->Seek($$dirInfo{DirStart}, 0) or return 'Error seeking to directory start';
+
+    # parse the X3F directory structure
+    my ($buff, $ver, $entries, $index, $dir);
+    $raf->Read($buff, 12) == 12 or return 'Truncated X3F image';
+    $buff =~ /^SECd/ or return 'Bad section header';
+    ($ver, $entries) = unpack('x4V2', $buff);
+    $verbose and $exifTool->VerboseDir('X3F Subsection', $entries);
+    $raf->Read($dir, $entries * 12) == $entries * 12 or return 'Truncated X3F directory';
+    for ($index=0; $index<$entries; ++$index) {
+        my $pos = $index * 12;
+        my ($offset, $len, $tag) = unpack("x${pos}V2a4", $dir);
+        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        if ($verbose) {
+            $exifTool->VPrint(0, "$exifTool->{INDENT}$index) $tag Subsection ($len bytes):\n");
+            if ($verbose > 2) {
+                $raf->Seek($offset, 0) or return 'Error seeking';
+                $raf->Read($buff, $len) == $len or return 'Truncated image';
+                $exifTool->VerboseDump(\$buff);
+            }
+        }
+        next unless $tagInfo;
+        $raf->Seek($offset, 0) or return "Error seeking for $$tagInfo{Name}";
+        if  ($$tagInfo{Name} eq 'PreviewImage') {
+            # check image header to see if this is a JPEG preview image
+            $raf->Read($buff, 28) == 28 or return 'Error reading PreviewImage header';
+            # ignore all image data but JPEG compressed (version 2.0, type 2, format 18)
+            next unless $buff =~ /^SECi\0\0\x02\0\x02\0\0\0\x12\0\0\0/;
+            # check preview image size and extract full-sized preview as JpgFromRaw
+            if ($$exifTool{ImageWidth} == unpack('x16V', $buff)) {
+                $$exifTool{IsJpgFromRaw} = 1;
+                $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+                delete $$exifTool{IsJpgFromRaw};
+            }
+            $offset += 28;
+            $len -= 28;
+        }
+        $raf->Read($buff, $len) == $len or return "Error reading $$tagInfo{Name} data";
+        my $subdir = $$tagInfo{SubDirectory};
+        if ($subdir) {
+            my %dirInfo = ( DataPt => \$buff );
+            my $subTable = GetTagTable($$subdir{TagTable});
+            $exifTool->ProcessDirectory(\%dirInfo, $subTable);
+        } else {
+            # extract metadata from JpgFromRaw
+            if ($$tagInfo{Name} eq 'JpgFromRaw') {
+                my %dirInfo = (
+                    Parent => 'X3F',
+                    RAF    => new File::RandomAccess(\$buff),
+                );
+                $$exifTool{BASE} += $offset;
+                $exifTool->ProcessJPEG(\%dirInfo);
+                $$exifTool{BASE} -= $offset;
+                SetByteOrder('II');
+            }
+            $exifTool->FoundTag($tagInfo, $buff);
+        }
+    }
+    return undef;
+}
+
+#------------------------------------------------------------------------------
+# Read/write information from a Sigma raw (X3F) image
+# Inputs: 0) ExifTool object reference, 1) DirInfo reference
+# Returns: 1 on success, 0 if this wasn't a valid X3F image, or -1 on write error
+sub ProcessX3F($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $outfile = $$dirInfo{OutFile};
+    my $raf = $$dirInfo{RAF};
+    my $warn = $outfile ? \&Image::ExifTool::Error : \&Image::ExifTool::Warn;
+    my ($buff, $err);
+
+    return 0 unless $raf->Read($buff, 40) == 40;
+    return 0 unless $buff =~ /^FOVb/;
+
+    SetByteOrder('II');
+    $exifTool->SetFileType();
+
+    # check version number
+    my $ver = unpack('x4V',$buff);
+    $ver = ($ver >> 16) . '.' . ($ver & 0xffff);
+    if ($ver >= 3) {
+        &$warn($exifTool, "Can't read version $ver X3F image");
+        return 1;
+    } elsif ($ver > 2.3) {
+        &$warn($exifTool, 'Untested X3F version. Please submit sample for testing', 1);
+    }
+    my $hdrLen = length $buff;
+    # read version 2.1/2.2/2.3 extended header
+    if ($ver > 2) {
+        $hdrLen += $ver > 2.2 ? 64 : 32;            # SceneCaptureType string added in 2.3
+        my $more = $hdrLen - length($buff) + 160;   # (extended header is 160 bytes)
+        my $buf2;
+        unless ($raf->Read($buf2, $more) == $more) {
+            &$warn($exifTool, 'Error reading extended header');
+            return 1;
+        }
+        $buff .= $buf2;
+    }
+    # extract ImageWidth for later
+    $$exifTool{ImageWidth} = Get32u(\$buff, 28);
+    # process header information
+    my $tagTablePtr = GetTagTable('Image::ExifTool::SigmaRaw::Main');
+    unless ($outfile) {
+        $exifTool->HandleTag($tagTablePtr, 'Header', $buff,
+            DataPt => \$buff,
+            Size   => $hdrLen,
+        );
+    }
+    # read the directory pointer
+    $raf->Seek(-4, 2) or &$warn($exifTool, 'Seek error'), return 1;
+    unless ($raf->Read($buff, 4) == 4) {
+        &$warn($exifTool, 'Error reading X3F dir pointer');
+        return 1;
+    }
+    my $offset = unpack('V', $buff);
+    my %dirInfo = (
+        RAF => $raf,
+        DirStart => $offset,
+    );
+    if ($outfile) {
+        $dirInfo{OutFile} = $outfile;
+        $err = WriteX3F($exifTool, \%dirInfo);
+        return -1 if $err and $err eq '-1';
+    } else {
+        # process the X3F subsections
+        $err = $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+    }
+    $err and &$warn($exifTool, $err);
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::SigmaRaw - Read Sigma/Foveon RAW (X3F) meta information
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to read
+Sigma and Foveon X3F images.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.x3f.info/technotes/FileDocs/X3F_Format.pdf>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/SigmaRaw Tags>,
+L<Image::ExifTool::Sigma(3pm)|Image::ExifTool::Sigma>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Sony.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Sony.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Sony.pm	(revision 24799)
@@ -0,0 +1,2001 @@
+#------------------------------------------------------------------------------
+# File:         Sony.pm
+#
+# Description:  Sony EXIF Maker Notes tags
+#
+# Revisions:    04/06/2004  - P. Harvey Created
+#
+# References:   1) http://www.cybercom.net/~dcoffin/dcraw/
+#               2) http://homepage3.nifty.com/kamisaka/makernote/makernote_sony.htm (2006/08/06)
+#               3) Thomas Bodenmann private communication
+#               4) Philippe Devaux private communication (A700)
+#               5) Marcus Holland-Moritz private communication (A700)
+#               6) Andrey Tverdokhleb private communication
+#               7) Rudiger Lange private communication (A700)
+#               8) Igal Milchtaich private communication
+#               9) Michael Reitinger private communication (DSC-TX7)
+#               10) http://www.klingebiel.com/tempest/hd/pmp.html
+#               11 Mike Battilana private communication
+#               JD) Jens Duttke private communication
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Sony;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::Exif;
+use Image::ExifTool::Minolta;
+
+$VERSION = '1.50';
+
+sub ProcessSRF($$$);
+sub ProcessSR2($$$);
+sub WriteSR2($$$);
+
+my %sonyLensTypes;  # filled in based on Minolta LensType's
+
+# ExposureProgram values (ref PH, mainly decoded from A200)
+my %sonyExposureProgram = (
+    0 => 'Auto', # (same as 'Program AE'?)
+    1 => 'Manual',
+    2 => 'Program AE',
+    3 => 'Aperture-priority AE',
+    4 => 'Shutter speed priority AE',
+    8 => 'Program Shift A', #7
+    9 => 'Program Shift S', #7
+    19 => 'Night Portrait', # (A330)
+    18 => 'Sunset', # (A330)
+    17 => 'Sports', # (A330)
+    21 => 'Macro', # (A330)
+    20 => 'Landscape', # (A330)
+    16 => 'Portrait', # (A330)
+    35 => 'Auto No Flash', # (A330)
+);
+
+my %binaryDataAttrs = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    WRITABLE => 1,
+    FIRST_ENTRY => 0,
+);
+
+%Image::ExifTool::Sony::Main = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    0x0102 => { #5/JD
+        Name => 'Quality',
+        Writable => 'int32u',
+        PrintConv => {
+            0 => 'RAW',
+            1 => 'Super Fine',
+            2 => 'Fine',
+            3 => 'Standard',
+            4 => 'Economy',
+            5 => 'Extra Fine',
+            6 => 'RAW + JPEG',
+            7 => 'Compressed RAW',
+            8 => 'Compressed RAW + JPEG',
+        },
+    },
+    0x0104 => { #5/JD
+        Name => 'FlashExposureComp',
+        Description => 'Flash Exposure Compensation',
+        Writable => 'rational64s',
+    },
+    0x0105 => { #5/JD
+        Name => 'Teleconverter',
+        Writable => 'int32u',
+        PrintHex => 1,
+        PrintConv => {
+            0 => 'None',
+            72 => 'Minolta AF 2x APO (D)',
+            80 => 'Minolta AF 2x APO II',
+            136 => 'Minolta AF 1.4x APO (D)',
+            144 => 'Minolta AF 1.4x APO II',
+        },
+    },
+    0x0112 => { #JD
+        Name => 'WhiteBalanceFineTune',
+        Format => 'int32s',
+        Writable => 'int32u',
+    },
+    0x0114 => [ #PH
+        {
+            Name => 'CameraSettings',
+            Condition => '$$self{Model} =~ /DSLR-A(200|230|300|350|700|850|900)\b/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Sony::CameraSettings',
+                ByteOrder => 'BigEndian',
+            },
+        },
+        {
+            Name => 'CameraSettings2',
+            Condition => '$$self{Model} =~ /DSLR-A(330|380)\b/',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Sony::CameraSettings2',
+                ByteOrder => 'BigEndian',
+            },
+        },
+        {
+            Name => 'CameraSettingsUnknown',
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::Sony::CameraSettingsUnknown',
+                ByteOrder => 'BigEndian',
+            },
+        },
+    ],
+    0x0115 => { #JD
+        Name => 'WhiteBalance',
+        Writable => 'int32u',
+        PrintHex => 1,
+        PrintConv => {
+            0x00 => 'Auto',
+            0x01 => 'Color Temperature/Color Filter',
+            0x10 => 'Daylight',
+            0x20 => 'Cloudy',
+            0x30 => 'Shade',
+            0x40 => 'Tungsten',
+            0x50 => 'Flash',
+            0x60 => 'Fluorescent',
+            0x70 => 'Custom',
+        },
+    },
+    0x0e00 => {
+        Name => 'PrintIM',
+        Description => 'Print Image Matching',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::PrintIM::Main',
+        },
+    },
+    # the next 3 tags have a different meaning for some models (with format int32u)
+    0x1000 => { #9 (F88, multi burst mode only)
+        Name => 'MultiBurstMode',
+        Condition => '$format eq "undef"',
+        Notes => 'MultiBurst tags valid only for models with this feature, like the F88',
+        Writable => 'undef',
+        Format => 'int8u',
+        PrintConv => { 0 => 'Off', 1 => 'On' },
+    },
+    0x1001 => { #9 (F88, multi burst mode only)
+        Name => 'MultiBurstImageWidth',
+        Condition => '$format eq "int16u"',
+        Writable => 'int16u',
+    },
+    0x1002 => { #9 (F88, multi burst mode only)
+        Name => 'MultiBurstImageHeight',
+        Condition => '$format eq "int16u"',
+        Writable => 'int16u',
+    },
+    0x1003 => { #9 (TX7, panorama mode only)
+        Name => 'Panorama',
+        SubDirectory => { TagTable => 'Image::ExifTool::Sony::Panorama' },
+    },
+    0x2001 => { #PH (JPEG images from all DSLR's except the A100)
+        Name => 'PreviewImage',
+        Writable => 'undef',
+        DataTag => 'PreviewImage',
+        # Note: the preview data starts with a 32-byte proprietary Sony header
+        WriteCheck => 'return $val=~/^(none|.{32}\xff\xd8\xff)/s ? undef : "Not a valid image"',
+        RawConv => q{
+            return \$val if $val =~ /^Binary/;
+            $val = substr($val,0x20) if length($val) > 0x20;
+            return \$val if $val =~ s/^.(\xd8\xff\xdb)/\xff$1/s;
+            $$self{PreviewError} = 1 unless $val eq 'none';
+            return undef;
+        },
+        # must construct 0x20-byte header which contains length, width and height
+        ValueConvInv => q{
+            return 'none' unless $val;
+            my $e = new Image::ExifTool;
+            my $info = $e->ImageInfo(\$val,'ImageWidth','ImageHeight');
+            return undef unless $$info{ImageWidth} and $$info{ImageHeight};
+            my $size = Set32u($$info{ImageWidth}) . Set32u($$info{ImageHeight});
+            return Set32u(length $val) . $size . ("\0" x 8) . $size . ("\0" x 4) . $val;
+        },
+    },
+    # 0x2002 - probably Sharpness (PH guess)
+    0x2004 => { #PH (NEX-5)
+        Name => 'Contrast',
+        Writable => 'int32s',
+        PrintConv => '$val > 0 ? "+$val" : $val',
+        PrintConvInv => '$val',
+    },
+    0x2005 => { #PH (NEX-5)
+        Name => 'Saturation',
+        Writable => 'int32s',
+        PrintConv => '$val > 0 ? "+$val" : $val',
+        PrintConvInv => '$val',
+    },
+    0x2006 => { #PH
+        Name => 'Sharpness',
+        Writable => 'int32s',
+        PrintConv => '$val > 0 ? "+$val" : $val',
+        PrintConvInv => '$val',
+    },
+    0x2007 => { #PH
+        Name => 'Brightness',
+        Writable => 'int32s',
+        PrintConv => '$val > 0 ? "+$val" : $val',
+        PrintConvInv => '$val',
+    },
+    0x2008 => { #PH
+        Name => 'LongExposureNoiseReduction',
+        Writable => 'int32u',
+        PrintHex => 1,
+        PrintConv => {
+            0 => 'Off',
+            1 => 'On',
+            0xffff0000 => 'Off 2',
+            0xffff0001 => 'On 2',
+            0xffffffff => 'n/a',
+        },
+    },
+    0x2009 => { #PH
+        Name => 'HighISONoiseReduction',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Low',
+            2 => 'Normal',
+            3 => 'High',
+            256 => 'Auto',
+            65535 => 'n/a',
+        },
+    },
+    0x200a => { #PH (A550)
+        Name => 'HDR',
+        Writable => 'int32u',
+        PrintHex => 1,
+        PrintConv => {
+            0x0 => 'Off',
+            0x10001 => 'Auto',
+            0x10010 => '1.0 EV', # (NEX_5)
+            0x10011 => '1.5 EV',
+            0x10012 => '2.0 EV',
+            0x10013 => '2.5 EV',
+            0x10014 => '3.0 EV',
+            0x10015 => '3.5 EV',
+            0x10016 => '4.0 EV',
+            0x10017 => '4.5 EV',
+            0x10018 => '5.0 EV',
+            0x10019 => '5.5 EV',
+            0x1001a => '6.0 EV', # (SLT-A55V)
+        },
+    },
+    0x200b => { #PH
+        Name => 'MultiFrameNoiseReduction',
+        Writable => 'int32u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'On',
+            255 => 'n/a',
+        },
+    },
+    0x3000 => {
+        Name => 'ShotInfo',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Sony::ShotInfo',
+        },
+    },
+    # 0x3000: data block that includes DateTimeOriginal string
+    0xb000 => { #8
+        Name => 'FileFormat',
+        Writable => 'int8u',
+        Count => 4,
+        # dynamically set the file type to SR2 because we could have assumed ARW up till now
+        RawConv => q{
+            $self->OverrideFileType($$self{TIFF_TYPE} = 'SR2') if $val eq '1 0 0 0';
+            return $val;
+        },
+        PrintConv => {
+            '0 0 0 2' => 'JPEG',
+            '1 0 0 0' => 'SR2',
+            '2 0 0 0' => 'ARW 1.0',
+            '3 0 0 0' => 'ARW 2.0',
+            '3 1 0 0' => 'ARW 2.1',
+            '3 2 0 0' => 'ARW 2.2', # (NEX-5)
+            # what about cRAW images?
+        },
+    },
+    0xb001 => { # ref http://forums.dpreview.com/forums/read.asp?forum=1037&message=33609644
+        # (ARW and SR2 images only)
+        Name => 'SonyModelID',
+        Writable => 'int16u',
+        PrintConvColumns => 2,
+        PrintConv => {
+            2 => 'DSC-R1',
+            256 => 'DSLR-A100',
+            257 => 'DSLR-A900',
+            258 => 'DSLR-A700',
+            259 => 'DSLR-A200',
+            260 => 'DSLR-A350',
+            261 => 'DSLR-A300',
+            263 => 'DSLR-A380/A390', #PH (A390)
+            264 => 'DSLR-A330',
+            265 => 'DSLR-A230',
+            266 => 'DSLR-A290', #PH
+            269 => 'DSLR-A850',
+            273 => 'DSLR-A550',
+            274 => 'DSLR-A500', #PH
+            275 => 'DSLR-A450', # (http://dev.exiv2.org/issues/show/0000611)
+            278 => 'NEX-5', #PH
+            279 => 'NEX-3', #PH
+            280 => 'SLT-A33', #PH
+            281 => 'SLT-A55V', #PH
+            282 => 'DSLR-A560', #PH
+            283 => 'DSLR-A580', # (http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,2881.0.html)
+        },
+    },
+    0xb020 => { #2
+        Name => 'ColorReproduction',
+        # observed values: None, Standard, Vivid, Real, AdobeRGB - PH
+        Writable => 'string',
+    },
+    0xb021 => { #2
+        Name => 'ColorTemperature',
+        Writable => 'int32u',
+        PrintConv => '$val ? $val : "Auto"',
+        PrintConvInv => '$val=~/Auto/i ? 0 : $val',
+    },
+    0xb022 => { #7
+        Name => 'ColorCompensationFilter',
+        Format => 'int32s',
+        Writable => 'int32u', # (written incorrectly as unsigned by Sony)
+        Notes => 'negative is green, positive is magenta',
+    },
+    0xb023 => { #PH (A100) - (set by mode dial)
+        Name => 'SceneMode',
+        Writable => 'int32u',
+        PrintConv => \%Image::ExifTool::Minolta::minoltaSceneMode,
+    },
+    0xb024 => { #PH (A100)
+        Name => 'ZoneMatching',
+        Writable => 'int32u',
+        PrintConv => {
+            0 => 'ISO Setting Used',
+            1 => 'High Key',
+            2 => 'Low Key',
+        },
+    },
+    0xb025 => { #PH (A100)
+        Name => 'DynamicRangeOptimizer',
+        Writable => 'int32u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Standard',
+            2 => 'Advanced Auto',
+            3 => 'Auto', # (A550)
+            8 => 'Advanced Lv1', #JD
+            9 => 'Advanced Lv2', #JD
+            10 => 'Advanced Lv3', #JD
+            11 => 'Advanced Lv4', #JD
+            12 => 'Advanced Lv5', #JD
+            16 => 'Lv1', # (NEX_5)
+            17 => 'Lv2',
+            18 => 'Lv3',
+            19 => 'Lv4',
+            20 => 'Lv5',
+        },
+    },
+    0xb026 => { #PH (A100)
+        Name => 'ImageStabilization',
+        Writable => 'int32u',
+        PrintConv => { 0 => 'Off', 1 => 'On' },
+    },
+    0xb027 => { #2
+        Name => 'LensType',
+        Writable => 'int32u',
+        SeparateTable => 1,
+        PrintConv => \%sonyLensTypes,
+    },
+    0xb028 => { #2
+        # (used by the DSLR-A100)
+        Name => 'MinoltaMakerNote',
+        # must check for zero since apparently a value of zero indicates the IFD doesn't exist
+        # (dumb Sony -- they shouldn't write this tag if the IFD is missing!)
+        Condition => '$$valPt ne "\0\0\0\0"',
+        Flags => 'SubIFD',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Minolta::Main',
+            Start => '$val',
+        },
+    },
+    0xb029 => { #2 (set by creative style menu)
+        Name => 'ColorMode',
+        Writable => 'int32u',
+        PrintConv => \%Image::ExifTool::Minolta::sonyColorMode,
+    },
+    0xb02b => { #PH (A550 JPEG and A200, A230, A300, A350, A380, A700 and A900 ARW)
+        Name => 'FullImageSize',
+        Writable => 'int32u',
+        Count => 2,
+        # values stored height first, so swap to get "width height"
+        ValueConv => 'join(" ", reverse split(" ", $val))',
+        ValueConvInv => 'join(" ", reverse split(" ", $val))',
+        PrintConv => '$val =~ tr/ /x/; $val',
+        PrintConvInv => '$val =~ tr/x/ /; $val',
+    },
+    0xb02c => { #PH (A550 JPEG and A200, A230, A300, A350, A380, A700 and A900 ARW)
+        Name => 'PreviewImageSize',
+        Writable => 'int32u',
+        Count => 2,
+        ValueConv => 'join(" ", reverse split(" ", $val))',
+        ValueConvInv => 'join(" ", reverse split(" ", $val))',
+        PrintConv => '$val =~ tr/ /x/; $val',
+        PrintConvInv => '$val =~ tr/x/ /; $val',
+    },
+    0xb040 => { #2
+        Name => 'Macro',
+        Writable => 'int16u',
+        RawConv => '$val == 65535 ? undef : $val',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'On',
+            2 => 'Close Focus', #9
+            65535 => 'n/a', #PH (A100)
+        },
+    },
+    0xb041 => { #2
+        Name => 'ExposureMode',
+        Writable => 'int16u',
+        RawConv => '$val == 65535 ? undef : $val',
+        PrintConv => {
+            0 => 'Auto',
+            1 => 'Portrait', #PH (HX1)
+            2 => 'Beach', #9
+            4 => 'Snow', #9
+            5 => 'Landscape',
+            6 => 'Program',
+            7 => 'Aperture Priority',
+            8 => 'Shutter Priority',
+            9 => 'Night Scene / Twilight',#2/9
+            10 => 'Hi-Speed Shutter', #9
+            11 => 'Twilight Portrait', #9
+            12 => 'Soft Snap', #9
+            13 => 'Fireworks', #9
+            14 => 'Smile Shutter', #9 (T200)
+            15 => 'Manual',
+            18 => 'High Sensitivity', #9
+            20 => 'Advanced Sports Shooting', #9
+            29 => 'Underwater', #9
+            33 => 'Gourmet', #9
+            34 => 'Panorama', #PH (HX1)
+            35 => 'Handheld Twilight', #PH (HX1/TX1)
+            36 => 'Anti Motion Blur', #PH (TX1)
+            37 => 'Pet', #9
+            38 => 'Backlight Correction HDR', #9
+            65535 => 'n/a', #PH (A100)
+        },
+    },
+    0xb042 => { #9
+        Name => 'FocusMode',
+        Writable => 'int16u',
+        RawConv => '$val == 65535 ? undef : $val',
+        PrintConv => {
+            1 => 'AF-S', # (called Single-AF by Sony)
+            2 => 'AF-C', # (called Monitor-AF by Sony)
+            4 => 'Permanent-AF', # (TX7)
+            65535 => 'n/a', #PH (A100)
+        },
+    },
+    0xb043 => { #9
+        Name => 'AFMode',
+        Writable => 'int16u',
+        RawConv => '$val == 65535 ? undef : $val',
+        PrintConv => {
+            0 => 'Default', # (takes this value after camera reset, but can't be set back once changed)
+            1 => 'Multi AF',
+            2 => 'Center AF',
+            3 => 'Spot AF',
+            4 => 'Flexible Spot AF', # (T200)
+            6 => 'Touch AF',
+            14 => 'Manual Focus', # (T200)
+            15 => 'Face Detected', # (not set when in face detect mode and no faces detected)
+            65535 => 'n/a', #PH (A100)
+        },
+    },
+    0xb044 => { #9
+        Name => 'AFIlluminator',
+        Writable => 'int16u',
+        RawConv => '$val == 65535 ? undef : $val',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Auto',
+            65535 => 'n/a', #PH (A100)
+        },
+    },
+    0xb047 => { #2
+        Name => 'Quality',
+        Writable => 'int16u',
+        RawConv => '$val == 65535 ? undef : $val',
+        PrintConv => {
+            0 => 'Normal',
+            1 => 'Fine',
+            65535 => 'n/a', #PH (A100)
+        },
+    },
+    0xb048 => { #9
+        Name => 'FlashLevel',
+        Writable => 'int16s',
+        RawConv => '$val == -1 ? undef : $val',
+        PrintConv => {
+            -32768 => 'Low',
+            -1 => 'n/a', #PH (A100)
+            0 => 'Normal',
+            32767 => 'High',
+        },
+    },
+    0xb049 => { #9
+        Name => 'ReleaseMode',
+        Writable => 'int16u',
+        RawConv => '$val == 65535 ? undef : $val',
+        PrintConv => {
+            0 => 'Normal',
+            2 => 'Burst',
+            5 => 'Exposure Bracketing',
+            6 => 'White Balance Bracketing', # (HX5)
+            65535 => 'n/a', #PH (A100)
+        },
+    },
+    0xb04a => { #9
+        Name => 'SequenceNumber',
+        Notes => 'shot number in continuous burst',
+        Writable => 'int16u',
+        RawConv => '$val == 65535 ? undef : $val',
+        PrintConv => {
+            0 => 'Single',
+            65535 => 'n/a', #PH (A100)
+            OTHER => sub { shift }, # pass all other numbers straight through
+        },
+    },
+    0xb04b => { #2/PH
+        Name => 'Anti-Blur',
+        Writable => 'int16u',
+        RawConv => '$val == 65535 ? undef : $val',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'On (Continuous)', #PH (NC)
+            2 => 'On (Shooting)', #PH (NC)
+            65535 => 'n/a',
+        },
+    },
+    0xb04e => { #2
+        Name => 'LongExposureNoiseReduction',
+        Writable => 'int16u',
+        RawConv => '$val == 65535 ? undef : $val',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'On',
+            65535 => 'n/a', #PH (A100)
+        },
+    },
+    0xb04f => { #PH (TX1)
+        Name => 'DynamicRangeOptimizer',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Standard',
+            2 => 'Plus',
+        },
+    },
+    0xb052 => { #PH (TX1)
+        Name => 'IntelligentAuto',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'On',
+            2 => 'Advanced', #9
+        },
+    },
+    0xb054 => { #PH (TX1)
+        Name => 'WhiteBalance',
+        Writable => 'int16u',
+        Priority => 0, # (until more values are filled in)
+        PrintConv => {
+            0 => 'Auto',
+            4 => 'Manual',
+            5 => 'Daylight',
+            6 => 'Cloudy', #9
+            7 => 'White Flourescent', #9      (Sony "Fluorescent 1 (White)")
+            8 => 'Cool White Flourescent', #9 (Sony "Fluorescent 2 (Natural White)")
+            9 => 'Day White Flourescent', #9  (Sony "Fluorescent 3 (Day White)")
+            14 => 'Incandescent',
+            15 => 'Flash', #9
+            17 => 'Underwater 1 (Blue Water)', #9
+            18 => 'Underwater 2 (Green Water)', #9
+        },
+    },
+);
+
+# "SEMC MS" maker notes
+%Image::ExifTool::Sony::Ericsson = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    NOTES => 'Maker notes found in images from some Sony Ericsson phones.',
+    0x2000 => {
+        Name => 'MakerNoteVersion',
+        Writable => 'undef',
+        Count => 4,
+    },
+    0x201 => {
+        Name => 'PreviewImageStart',
+        IsOffset => 1,
+        MakerPreview => 1, # force preview inside maker notes
+        OffsetPair => 0x202,
+        DataTag => 'PreviewImage',
+        Writable => 'int32u',
+        Protected => 2,
+        Notes => 'a small 320x200 preview image',
+    },
+    0x202 => {
+        Name => 'PreviewImageLength',
+        OffsetPair => 0x201,
+        DataTag => 'PreviewImage',
+        Writable => 'int32u',
+        Protected => 2,
+    },
+);
+
+# Camera settings (ref PH) (decoded mainly from A200)
+%Image::ExifTool::Sony::CameraSettings = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    FORMAT => 'int16u',
+    NOTES => q{
+        Camera settings for the A200, A230, A300, A350, A700, A850 and A900.  Some
+        tags are only valid for certain models.
+    },
+    0x04 => { #7 (A700, not valid for other models)
+        Name => 'DriveMode',
+        Condition => '$$self{Model} =~ /DSLR-A700\b/',
+        Notes => 'A700 only',
+        PrintConv => {
+            1 => 'Single Frame',
+            2 => 'Continuous High',
+            4 => 'Self-timer 10 sec',
+            5 => 'Self-timer 2 sec',
+            7 => 'Continuous Bracketing',
+            12 => 'Continuous Low',
+            18 => 'White Balance Bracketing Low',
+            19 => 'D-Range Optimizer Bracketing Low',
+        },
+    },
+    0x06 => { #7 (A700, not valid for other models)
+        Name => 'WhiteBalanceFineTune',
+        Condition => '$$self{Model} =~ /DSLR-A700\b/',
+        Format => 'int16s',
+        Notes => 'A700 only',
+    },
+    0x10 => { #7 (A700, not confirmed for other models)
+        Name => 'FocusMode',
+        PrintConv => {
+            0 => 'Manual',
+            1 => 'AF-S',
+            2 => 'AF-C',
+            3 => 'AF-A',
+        },
+    },
+    0x11 => { #JD (A700)
+        Name => 'AFAreaMode',
+        PrintConv => {
+            0 => 'Wide',
+            1 => 'Local',
+            2 => 'Spot',
+        },
+    },
+    0x12 => { #7 (A700, not confirmed for other models)
+        Name => 'LocalAFAreaPoint',
+        Format => 'int16u',
+        Condition => '$$self{Model} !~ /DSLR-A230/',
+        PrintConv => {
+            1 => 'Center',
+            2 => 'Top',
+            3 => 'Top-Right',
+            4 => 'Right',
+            5 => 'Bottom-Right',
+            6 => 'Bottom',
+            7 => 'Bottom-Left',
+            8 => 'Left',
+            9 => 'Top-Left',
+            10 => 'Far Right',
+            11 => 'Far Left',
+            # have seen value of 128 for A230, A330, A380 - PH
+        },
+    },
+    0x15 => { #7
+        Name => 'MeteringMode',
+        Condition => '$$self{Model} !~ /DSLR-A230/',
+        PrintConv => {
+            1 => 'Multi-segment',
+            2 => 'Center-weighted Average',
+            4 => 'Spot',
+        },
+    },
+    0x16 => {
+        Name => 'ISOSetting',
+        Condition => '$$self{Model} !~ /DSLR-A230/',
+        # 0 indicates 'Auto' (I think)
+        ValueConv => '$val ? exp(($val/8-6)*log(2))*100 : $val',
+        ValueConvInv => '$val ? 8*(log($val/100)/log(2)+6) : $val',
+        PrintConv => '$val ? sprintf("%.0f",$val) : "Auto"',
+        PrintConvInv => '$val =~ /auto/i ? 0 : $val',
+    },
+    0x18 => { #7
+        Name => 'DynamicRangeOptimizerMode',
+        Condition => '$$self{Model} !~ /DSLR-A230/',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Standard',
+            2 => 'Advanced Auto',
+            3 => 'Advanced Level',
+            4097 => 'Auto', #PH (A550)
+        },
+    },
+    0x19 => { #7
+        Name => 'DynamicRangeOptimizerLevel',
+        Condition => '$$self{Model} !~ /DSLR-A230/',
+    },
+    0x1a => { # style actually used (combination of mode dial + creative style menu)
+        Name => 'CreativeStyle',
+        Condition => '$$self{Model} !~ /DSLR-A230/',
+        PrintConv => {
+            1 => 'Standard',
+            2 => 'Vivid',
+            3 => 'Portrait',
+            4 => 'Landscape',
+            5 => 'Sunset',
+            6 => 'Night View/Portrait',
+            8 => 'B&W',
+            9 => 'Adobe RGB', # A900
+            11 => 'Neutral',
+            12 => 'Clear', #7
+            13 => 'Deep', #7
+            14 => 'Light', #7
+            15 => 'Autumn', #7
+            16 => 'Sepia', #7
+        },
+    },
+    0x1c => {
+        Name => 'Sharpness',
+        ValueConv => '$val - 10',
+        ValueConvInv => '$val + 10',
+        PrintConv => '$val > 0 ? "+$val" : $val',
+        PrintConvInv => '$val',
+    },
+    0x1d => {
+        Name => 'Contrast',
+        ValueConv => '$val - 10',
+        ValueConvInv => '$val + 10',
+        PrintConv => '$val > 0 ? "+$val" : $val',
+        PrintConvInv => '$val',
+    },
+    0x1e => {
+        Name => 'Saturation',
+        ValueConv => '$val - 10',
+        ValueConvInv => '$val + 10',
+        PrintConv => '$val > 0 ? "+$val" : $val',
+        PrintConvInv => '$val',
+    },
+    0x1f => { #7
+        Name => 'ZoneMatchingValue',
+        Condition => '$$self{Model} !~ /DSLR-A230/',
+        ValueConv => '$val - 10',
+        ValueConvInv => '$val + 10',
+        PrintConv => '$val > 0 ? "+$val" : $val',
+        PrintConvInv => '$val',
+    },
+    0x22 => { #7
+        Name => 'Brightness',
+        Condition => '$$self{Model} !~ /DSLR-A230/',
+        ValueConv => '$val - 10',
+        ValueConvInv => '$val + 10',
+        PrintConv => '$val > 0 ? "+$val" : $val',
+        PrintConvInv => '$val',
+    },
+    0x23 => {
+        Name => 'FlashMode',
+        PrintConv => {
+            0 => 'ADI',
+            1 => 'TTL',
+        },
+    },
+    0x28 => { #7
+        Name => 'PrioritySetupShutterRelease',
+        Condition => '$$self{Model} =~ /DSLR-A700\b/',
+        Notes => 'A700 only',
+        PrintConv => {
+            0 => 'AF',
+            1 => 'Release',
+        },
+    },
+    0x29 => { #7
+        Name => 'AFIlluminator',
+        Condition => '$$self{Model} =~ /DSLR-A700\b/',
+        Notes => 'A700 only',
+        PrintConv => {
+            0 => 'Auto',
+            1 => 'Off',
+        },
+    },
+    0x2a => { #7
+        Name => 'AFWithShutter',
+        Condition => '$$self{Model} =~ /DSLR-A700\b/',
+        Notes => 'A700 only',
+        PrintConv => { 0 => 'On', 1 => 'Off' },
+    },
+    0x2b => { #7
+        Name => 'LongExposureNoiseReduction',
+        Condition => '$$self{Model} =~ /DSLR-A700\b/',
+        Notes => 'A700 only',
+        PrintConv => { 0 => 'Off', 1 => 'On' },
+    },
+    0x2c => { #7
+        Name => 'HighISONoiseReduction',
+        Condition => '$$self{Model} =~ /DSLR-A700\b/',
+        Notes => 'A700 only',
+        0 => 'Normal',
+        1 => 'Low',
+        2 => 'High',
+        3 => 'Off',
+    },
+    0x2d => { #7
+        Name => 'ImageStyle',
+        Condition => '$$self{Model} =~ /DSLR-A700\b/',
+        Notes => 'A700 only',
+        PrintConv => {
+            1 => 'Standard',
+            2 => 'Vivid',
+            9 => 'Adobe RGB',
+            11 => 'Neutral',
+            129 => 'StyleBox1',
+            130 => 'StyleBox2',
+            131 => 'StyleBox3',
+        },
+    },
+    # 0x2d - A900:1=?,4=?,129=std,130=vivid,131=neutral,132=portrait,133=landscape,134=b&w
+    0x3c => {
+        Name => 'ExposureProgram',
+        Priority => 0,
+        PrintConv => \%sonyExposureProgram,
+    },
+    0x3d => {
+        Name => 'ImageStabilization',
+        PrintConv => { 0 => 'Off', 1 => 'On' },
+    },
+    0x3f => { # (verified for A330/A380)
+        Name => 'Rotation',
+        PrintConv => {
+            0 => 'Horizontal (normal)',
+            1 => 'Rotate 90 CW', #(NC)
+            2 => 'Rotate 270 CW',
+        },
+    },
+    0x54 => {
+        Name => 'SonyImageSize',
+        PrintConv => {
+            1 => 'Large',
+            2 => 'Medium',
+            3 => 'Small',
+        },
+    },
+    0x55 => { #7
+        Name => 'AspectRatio',
+        PrintConv => {
+            1 => '3:2',
+            2 => '16:9',
+        },
+    },
+    0x56 => { #PH/7
+        Name => 'Quality',
+        PrintConv => {
+            0 => 'RAW',
+            2 => 'CRAW',
+            34 => 'RAW + JPEG',
+            35 => 'CRAW + JPEG',
+            16 => 'Extra Fine',
+            32 => 'Fine',
+            48 => 'Standard',
+        },
+    },
+    0x58 => { #7
+        Name => 'ExposureLevelIncrements',
+        PrintConv => {
+            33 => '1/3 EV',
+            50 => '1/2 EV',
+        },
+    },            
+);
+
+# Camera settings (ref PH) (A330 and A380)
+%Image::ExifTool::Sony::CameraSettings2 = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    FORMAT => 'int16u',
+    NOTES => 'Camera settings for the A330 and A380.',
+    0x10 => { #7 (A700, not confirmed for other models)
+        Name => 'FocusMode',
+        PrintConv => {
+            0 => 'Manual',
+            1 => 'AF-S',
+            2 => 'AF-C',
+            3 => 'AF-A',
+        },
+    },
+    0x11 => { #JD (A700)
+        Name => 'AFAreaMode',
+        PrintConv => {
+            0 => 'Wide',
+            1 => 'Local',
+            2 => 'Spot',
+        },
+    },
+    0x12 => { #7 (A700, not confirmed for other models)
+        Name => 'LocalAFAreaPoint',
+        Format => 'int16u',
+        PrintConv => {
+            1 => 'Center',
+            2 => 'Top',
+            3 => 'Top-Right',
+            4 => 'Right',
+            5 => 'Bottom-Right',
+            6 => 'Bottom',
+            7 => 'Bottom-Left',
+            8 => 'Left',
+            9 => 'Top-Left',
+            10 => 'Far Right',
+            11 => 'Far Left',
+            # see value of 128 for some models
+        },
+    },
+    0x13 => {
+        Name => 'MeteringMode',
+        PrintConv => {
+            1 => 'Multi-segment',
+            2 => 'Center-weighted Average',
+            4 => 'Spot',
+        },
+    },
+    0x14 => { # A330/A380
+        Name => 'ISOSetting',
+        # 0 indicates 'Auto' (?)
+        ValueConv => '$val ? exp(($val/8-6)*log(2))*100 : $val',
+        ValueConvInv => '$val ? 8*(log($val/100)/log(2)+6) : $val',
+        PrintConv => '$val ? sprintf("%.0f",$val) : "Auto"',
+        PrintConvInv => '$val =~ /auto/i ? 0 : $val',
+    },
+    0x16 => {
+        Name => 'DynamicRangeOptimizerMode',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Standard',
+            2 => 'Advanced Auto',
+            3 => 'Advanced Level',
+        },
+    },
+    0x17 => {
+        Name => 'DynamicRangeOptimizerLevel',
+    },
+    0x18 => { # A380
+        Name => 'CreativeStyle',
+        PrintConv => {
+            1 => 'Standard',
+            2 => 'Vivid',
+            3 => 'Portrait',
+            4 => 'Landscape',
+            5 => 'Sunset',
+            6 => 'Night View/Portrait',
+            8 => 'B&W',
+            9 => 'Adobe RGB',
+            11 => 'Neutral',
+        },
+    },
+    0x19 => {
+        Name => 'Sharpness',
+        ValueConv => '$val - 10',
+        ValueConvInv => '$val + 10',
+        PrintConv => '$val > 0 ? "+$val" : $val',
+        PrintConvInv => '$val',
+    },
+    0x1a => {
+        Name => 'Contrast',
+        ValueConv => '$val - 10',
+        ValueConvInv => '$val + 10',
+        PrintConv => '$val > 0 ? "+$val" : $val',
+        PrintConvInv => '$val',
+    },
+    0x1b => {
+        Name => 'Saturation',
+        ValueConv => '$val - 10',
+        ValueConvInv => '$val + 10',
+        PrintConv => '$val > 0 ? "+$val" : $val',
+        PrintConvInv => '$val',
+    },
+    0x23 => {
+        Name => 'FlashMode',
+        PrintConv => {
+            0 => 'ADI',
+            1 => 'TTL',
+        },
+    },
+    # 0x27 - also related to CreativeStyle:
+    #  A380:1=std,2=vivid,3=portrait,4=landscape,5=sunset,7=night view,8=b&w
+    0x3c => {
+        Name => 'ExposureProgram',
+        Priority => 0,
+        PrintConv => \%sonyExposureProgram,
+    },
+    0x3f => { # (verified for A330/A380)
+        Name => 'Rotation',
+        PrintConv => {
+            0 => 'Horizontal (normal)',
+            1 => 'Rotate 90 CW', #(NC)
+            2 => 'Rotate 270 CW',
+        },
+    },
+    0x54 => {
+        Name => 'SonyImageSize',
+        PrintConv => {
+            1 => 'Large',
+            2 => 'Medium',
+            3 => 'Small',
+        },
+    },
+    # 0x56 - something to do with JPEG quality?
+);
+
+# Camera settings for other models
+%Image::ExifTool::Sony::CameraSettingsUnknown = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
+    FORMAT => 'int16u',
+);
+
+# shot information (ref PH)
+%Image::ExifTool::Sony::ShotInfo = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    DATAMEMBER => [ 0x02, 0x30, 0x32 ],
+    IS_SUBDIR => [ 0x48, 0x5e ],
+    # 0x00 - byte order 'II'
+    0x02 => {
+        Name => 'FaceInfoOffset',
+        Format => 'int16u',
+        DataMember => 'FaceInfoOffset',
+        Writable => 0,
+        RawConv => '$$self{FaceInfoOffset} = $val',
+    },
+    0x06 => {
+        Name => 'SonyDateTime',
+        Format => 'string[20]',
+        Groups => { 2 => 'Time' },
+        Shift => 'Time',
+        PrintConv => '$self->ConvertDateTime($val)',
+        PrintConvInv => '$self->InverseDateTime($val,0)',
+    },
+    0x30 => { #Jeffrey Friedl
+        Name => 'FacesDetected',
+        DataMember => 'FacesDetected',
+        Format => 'int16u',
+        RawConv => '$$self{FacesDetected} = $val',
+    },
+    0x32 => {
+        Name => 'FaceInfoLength', # length of a single FaceInfo entry
+        DataMember => 'FaceInfoLength',
+        Format => 'int16u',
+        Writable => 0,
+        RawConv => '$$self{FaceInfoLength} = $val',
+    },
+    #0x34 => {
+    #    # values: 'DC5303320222000', 'DC6303320222000' or 'DC7303320222000'
+    #    Name => 'UnknownString',
+    #    Format => 'string[16]',
+    #    Unknown => 1,
+    #},
+    0x48 => { # (most models: DC5303320222000 and DC6303320222000)
+        Name => 'FaceInfo1',
+        Condition => q{
+            $$self{FacesDetected} and
+            $$self{FaceInfoOffset} == 0x48 and
+            $$self{FaceInfoLength} == 0x20
+        },
+        SubDirectory => { TagTable => 'Image::ExifTool::Sony::FaceInfo1' },
+    },
+    0x5e => { # (HX7V: DC7303320222000)
+        Name => 'FaceInfo2',
+        Condition => q{
+            $$self{FacesDetected} and
+            $$self{FaceInfoOffset} == 0x5e and
+            $$self{FaceInfoLength} == 0x25
+        },
+        SubDirectory => { TagTable => 'Image::ExifTool::Sony::FaceInfo2' },
+    },
+);
+
+%Image::ExifTool::Sony::FaceInfo1 = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    0x00 => {
+        Name => 'Face1Position',
+        Format => 'int16u[4]',
+        RawConv => '$$self{FacesDetected} < 1 ? undef : $val',
+        Notes => q{
+            top, left, height and width of detected face.  Coordinates are relative to
+            the full-sized unrotated image, with increasing Y downwards
+        },
+    },
+    0x20 => {
+        Name => 'Face2Position',
+        Format => 'int16u[4]',
+        RawConv => '$$self{FacesDetected} < 2 ? undef : $val',
+    },
+    0x40 => {
+        Name => 'Face3Position',
+        Format => 'int16u[4]',
+        RawConv => '$$self{FacesDetected} < 3 ? undef : $val',
+    },
+    0x60 => {
+        Name => 'Face4Position',
+        Format => 'int16u[4]',
+        RawConv => '$$self{FacesDetected} < 4 ? undef : $val',
+    },
+    0x80 => {
+        Name => 'Face5Position',
+        Format => 'int16u[4]',
+        RawConv => '$$self{FacesDetected} < 5 ? undef : $val',
+    },
+    0xa0 => {
+        Name => 'Face6Position',
+        Format => 'int16u[4]',
+        RawConv => '$$self{FacesDetected} < 6 ? undef : $val',
+    },
+    0xc0 => {
+        Name => 'Face7Position',
+        Format => 'int16u[4]',
+        RawConv => '$$self{FacesDetected} < 7 ? undef : $val',
+    },
+    0xe0 => {
+        Name => 'Face8Position',
+        Format => 'int16u[4]',
+        RawConv => '$$self{FacesDetected} < 8 ? undef : $val',
+    },
+);
+
+%Image::ExifTool::Sony::FaceInfo2 = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    0x00 => {
+        Name => 'Face1Position',
+        Format => 'int16u[4]',
+        RawConv => '$$self{FacesDetected} < 1 ? undef : $val',
+        Notes => q{
+            top, left, height and width of detected face.  Coordinates are relative to
+            the full-sized unrotated image, with increasing Y downwards
+        },
+    },
+    0x25 => {
+        Name => 'Face2Position',
+        Format => 'int16u[4]',
+        RawConv => '$$self{FacesDetected} < 2 ? undef : $val',
+    },
+    0x4a => {
+        Name => 'Face3Position',
+        Format => 'int16u[4]',
+        RawConv => '$$self{FacesDetected} < 3 ? undef : $val',
+    },
+    0x6f => {
+        Name => 'Face4Position',
+        Format => 'int16u[4]',
+        RawConv => '$$self{FacesDetected} < 4 ? undef : $val',
+    },
+    0x94 => {
+        Name => 'Face5Position',
+        Format => 'int16u[4]',
+        RawConv => '$$self{FacesDetected} < 5 ? undef : $val',
+    },
+    0xb9 => {
+        Name => 'Face6Position',
+        Format => 'int16u[4]',
+        RawConv => '$$self{FacesDetected} < 6 ? undef : $val',
+    },
+    0xde => {
+        Name => 'Face7Position',
+        Format => 'int16u[4]',
+        RawConv => '$$self{FacesDetected} < 7 ? undef : $val',
+    },
+    0x103 => {
+        Name => 'Face8Position',
+        Format => 'int16u[4]',
+        RawConv => '$$self{FacesDetected} < 8 ? undef : $val',
+    },
+);
+
+# panorama info for cameras such as the HX1, HX5, TX7 (ref 9/PH)
+%Image::ExifTool::Sony::Panorama = (
+    %binaryDataAttrs,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    FORMAT => 'int32u',
+    NOTES => q{
+        Tags found only in panorama images from Sony cameras such as the HX1, HX5
+        and TX7.  The width/height values of these tags are not affected by camera
+        rotation -- the width is always the longer dimension.
+    },
+    # 0: 257
+    1 => 'PanoramaFullWidth', # (including black/grey borders)
+    2 => 'PanoramaFullHeight',
+    3 => {
+        Name => 'PanoramaDirection',
+        PrintConv => {
+            0 => 'Right to Left',
+            1 => 'Left to Right',
+        },
+    },
+    # crop area to remove black/grey borders from full image
+    4 => 'PanoramaCropLeft',
+    5 => 'PanoramaCropTop', #PH guess (NC)
+    6 => 'PanoramaCropRight',
+    7 => 'PanoramaCropBottom',
+    # 8: 1728 (HX1), 1824 (HX5/TX7) (value8/value9 = 16/9)
+    8 => 'PanoramaFrameWidth', #PH guess (NC)
+    # 9: 972 (HX1), 1026 (HX5/TX7)
+    9 => 'PanoramaFrameHeight', #PH guess (NC)
+    # 10: 3200-3800 (HX1), 4000-4900 (HX5/TX7)
+    10 => 'PanoramaSourceWidth', #PH guess (NC)
+    # 11: 800-1800 (larger for taller panoramas)
+    11 => 'PanoramaSourceHeight', #PH guess (NC)
+    # 12-15: 0
+);
+
+# tag table for SRF0 IFD (ref 1)
+%Image::ExifTool::Sony::SRF = (
+    PROCESS_PROC => \&ProcessSRF,
+    GROUPS => { 0 => 'MakerNotes', 1 => 'SRF#', 2 => 'Camera' },
+    NOTES => q{
+        The maker notes in SRF (Sony Raw Format) images contain 7 IFD's with family
+        1 group names SRF0 through SRF6.  SRF0 and SRF1 use the tags in this table,
+        while SRF2 through SRF5 use the tags in the next table, and SRF6 uses
+        standard EXIF tags.  All information other than SRF0 is encrypted, but
+        thanks to Dave Coffin the decryption algorithm is known.  SRF images are
+        written by the Sony DSC-F828 and DSC-V3.
+    },
+    # tags 0-1 are used in SRF1
+    0 => {
+        Name => 'SRF2Key',
+        Notes => 'key to decrypt maker notes from the start of SRF2',
+        RawConv => '$self->{SRF2Key} = $val',
+    },
+    1 => {
+        Name => 'DataKey',
+        Notes => 'key to decrypt the rest of the file from the end of the maker notes',
+        RawConv => '$self->{SRFDataKey} = $val',
+    },
+    # SRF0 contains a single unknown tag with TagID 0x0003
+);
+
+# tag table for Sony RAW Format (ref 1)
+%Image::ExifTool::Sony::SRF2 = (
+    PROCESS_PROC => \&ProcessSRF,
+    GROUPS => { 0 => 'MakerNotes', 1 => 'SRF#', 2 => 'Camera' },
+    NOTES => "These tags are found in the SRF2 through SRF5 IFD's.",
+    # the following tags are used in SRF2-5
+    2 => 'SRF6Offset', #PH
+    # SRFDataOffset references 2220 bytes of unknown data for the DSC-F828 - PH
+    3 => { Name => 'SRFDataOffset', Unknown => 1 }, #PH
+    4 => { Name => 'RawDataOffset' }, #PH
+    5 => { Name => 'RawDataLength' }, #PH
+);
+
+# tag table for Sony RAW 2 Format Private IFD (ref 1)
+%Image::ExifTool::Sony::SR2Private = (
+    PROCESS_PROC => \&ProcessSR2,
+    WRITE_PROC => \&WriteSR2,
+    GROUPS => { 0 => 'MakerNotes', 1 => 'SR2', 2 => 'Camera' },
+    NOTES => q{
+        The SR2 format uses the DNGPrivateData tag to reference a private IFD
+        containing these tags.  SR2 images are written by the Sony DSC-R1, but
+        this information is also written to ARW images by other models.
+    },
+    0x7200 => {
+        Name => 'SR2SubIFDOffset',
+        # (adjusting offset messes up calculations for AdobeSR2 in DNG images)
+        # Flags => 'IsOffset',
+        # (can't set OffsetPair or else DataMember won't be set when writing)
+        # OffsetPair => 0x7201,
+        DataMember => 'SR2SubIFDOffset',
+        RawConv => '$$self{SR2SubIFDOffset} = $val',
+    },
+    0x7201 => {
+        Name => 'SR2SubIFDLength',
+        # (can't set OffsetPair or else DataMember won't be set when writing)
+        # OffsetPair => 0x7200,
+        DataMember => 'SR2SubIFDLength',
+        RawConv => '$$self{SR2SubIFDLength} = $val',
+    },
+    0x7221 => {
+        Name => 'SR2SubIFDKey',
+        Format => 'int32u',
+        Notes => 'key to decrypt SR2SubIFD',
+        DataMember => 'SR2SubIFDKey',
+        RawConv => '$$self{SR2SubIFDKey} = $val',
+        PrintConv => 'sprintf("0x%.8x", $val)',
+    },
+    0x7240 => { #PH
+        Name => 'IDC_IFD',
+        Groups => { 1 => 'SonyIDC' },
+        Condition => '$$valPt !~ /^\0\0\0\0/',   # (just in case this could be zero)
+        Flags => 'SubIFD',
+        SubDirectory => {
+            DirName => 'SonyIDC',
+            TagTable => 'Image::ExifTool::SonyIDC::Main',
+            Start => '$val',
+        },
+    },
+    0x7241 => { #PH
+        Name => 'IDC2_IFD',
+        Groups => { 1 => 'SonyIDC' },
+        Condition => '$$valPt !~ /^\0\0\0\0/',   # may be zero if dir doesn't exist
+        Flags => 'SubIFD',
+        SubDirectory => {
+            DirName => 'SonyIDC2',
+            TagTable => 'Image::ExifTool::SonyIDC::Main',
+            Start => '$val',
+            Base => '$start',
+            MaxSubdirs => 20,   # (A900 has 10 null entries, but IDC writes only 1)
+            RelativeBase => 1,  # needed to write SubIFD with relative offsets
+        },
+    },
+    0x7250 => { #1
+        Name => 'MRWInfo',
+        Condition => '$$valPt !~ /^\0\0\0\0/',   # (just in case this could be zero)
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::MinoltaRaw::Main',
+        },
+    },
+);
+
+%Image::ExifTool::Sony::SR2SubIFD = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    GROUPS => { 0 => 'MakerNotes', 1 => 'SR2SubIFD', 2 => 'Camera' },
+    SET_GROUP1 => 1, # set group1 name to directory name for all tags in table
+    NOTES => 'Tags in the encrypted SR2SubIFD',
+    0x7303 => 'WB_GRBGLevels', #1
+    0x74c0 => { #PH
+        Name => 'SR2DataIFD',
+        Groups => { 1 => 'SR2DataIFD' }, # (needed to set SubIFD DirName)
+        Flags => 'SubIFD',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Sony::SR2DataIFD',
+            Start => '$val',
+            MaxSubdirs => 20, # an A700 ARW has 14 of these! - PH
+        },
+    },
+    0x7313 => 'WB_RGGBLevels', #6
+    0x74a0 => 'MaxApertureAtMaxFocal', #PH
+    0x74a1 => 'MaxApertureAtMinFocal', #PH
+    0x7820 => 'WB_RGBLevelsDaylight', #6
+    0x7821 => 'WB_RGBLevelsCloudy', #6
+    0x7822 => 'WB_RGBLevelsTungsten', #6
+    0x7825 => 'WB_RGBLevelsShade', #6
+    0x7826 => 'WB_RGBLevelsFluorescent', #6
+    0x7828 => 'WB_RGBLevelsFlash', #6
+);
+
+%Image::ExifTool::Sony::SR2DataIFD = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    GROUPS => { 0 => 'MakerNotes', 1 => 'SR2DataIFD', 2 => 'Camera' },
+    SET_GROUP1 => 1, # set group1 name to directory name for all tags in table
+    # 0x7313 => 'WB_RGGBLevels', (duplicated in all SR2DataIFD's)
+    0x7770 => { #PH
+        Name => 'ColorMode',
+        Priority => 0,
+    },
+);
+
+# tags found in DSC-F1 PMP header (ref 10)
+%Image::ExifTool::Sony::PMP = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
+    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    FIRST_ENTRY => 0,
+    NOTES => q{
+        These tags are written in the proprietary-format header of PMP images from
+        the DSC-F1.
+    },
+    8 => { #PH
+        Name => 'JpgFromRawStart',
+        Format => 'int32u',
+        Notes => q{
+            OK, not really a RAW file, but this mechanism is used to allow extraction of
+            the JPEG image from a PMP file
+        },
+    },
+    12 => { Name => 'JpgFromRawLength',Format => 'int32u' },
+    22 => { Name => 'SonyImageWidth',  Format => 'int16u' },
+    24 => { Name => 'SonyImageHeight', Format => 'int16u' },
+    27 => {
+        Name => 'Orientation',
+        PrintConv => {
+            0 => 'Horizontal (normal)',
+            1 => 'Rotate 270 CW',#11
+            2 => 'Rotate 180',
+            3 => 'Rotate 90 CW',#11
+        },
+    },
+    29 => {
+        Name => 'ImageQuality',
+        PrintConv => {
+            8 => 'Snap Shot',
+            23 => 'Standard',
+            51 => 'Fine',
+        },
+    },
+    # 40 => ImageWidth again (int16u)
+    # 42 => ImageHeight again (int16u)
+    52 => { Name => 'Comment',         Format => 'string[19]' },
+    76 => {
+        Name => 'DateTimeOriginal',
+        Description => 'Date/Time Original',
+        Format => 'int8u[6]',
+        Groups => { 2 => 'Time' },
+        ValueConv => q{
+            my @a = split ' ', $val;
+            $a[0] += $a[0] < 70 ? 2000 : 1900;
+            sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d', @a);
+        },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    84 => {
+        Name => 'ModifyDate',
+        Format => 'int8u[6]',
+        Groups => { 2 => 'Time' },
+        ValueConv => q{
+            my @a = split ' ', $val;
+            $a[0] += $a[0] < 70 ? 2000 : 1900;
+            sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d', @a);
+        },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    102 => {
+        Name => 'ExposureTime',
+        Format => 'int16s',
+        RawConv => '$val <= 0 ? undef : $val',
+        ValueConv => '2 ** (-$val / 100)',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+    },
+    106 => { # (NC -- not written by DSC-F1)
+        Name => 'FNumber',
+        Format => 'int16s',
+        RawConv => '$val <= 0 ? undef : $val',
+        ValueConv => '$val / 100', # (likely wrong)
+    },
+    108 => { # (NC -- not written by DSC-F1)
+        Name => 'ExposureCompensation',
+        Format => 'int16s',
+        RawConv => '($val == -1 or $val == -32768) ? undef : $val',
+        ValueConv => '$val / 100', # (probably wrong too)
+    },
+    112 => { # (NC -- not written by DSC-F1)
+        Name => 'FocalLength',
+        Format => 'int16s',
+        Groups => { 2 => 'Camera' },
+        RawConv => '$val <= 0 ? undef : $val',
+        ValueConv => '$val / 100',
+        PrintConv => 'sprintf("%.1f mm",$val)',
+    },
+    118 => {
+        Name => 'Flash',
+        Groups => { 2 => 'Camera' },
+        PrintConv => { 0 => 'No Flash', 1 => 'Fired' },
+    },
+);
+
+# fill in Sony LensType lookup based on Minolta values
+{
+    my $minoltaTypes = \%Image::ExifTool::Minolta::minoltaLensTypes;
+    %sonyLensTypes = %$minoltaTypes;
+    my $notes = $$minoltaTypes{Notes};
+    delete $$minoltaTypes{Notes};
+    my $id;
+    foreach $id (sort { $a <=> $b } keys %$minoltaTypes) {
+        # higher numbered lenses are missing last digit of ID for some Sony models
+        next if $id < 10000;
+        my $sid = int($id/10);
+        my $i;
+        my $lens = $$minoltaTypes{$id};
+        if ($sonyLensTypes{$sid}) {
+            # put lens name with "or" first in list
+            if ($lens =~ / or /) {
+                my $tmp = $sonyLensTypes{$sid};
+                $sonyLensTypes{$sid} = $lens;
+                $lens = $tmp;
+            }
+            for (;;) {
+                $i = ($i || 0) + 1;
+                $sid = int($id/10) . ".$i";
+                last unless $sonyLensTypes{$sid};
+            }
+        }
+        $sonyLensTypes{$sid} = $lens;
+    }
+    $$minoltaTypes{Notes} = $sonyLensTypes{Notes} = $notes;
+}
+
+#------------------------------------------------------------------------------
+# Read Sony DSC-F1 PMP file
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref
+# Returns: 1 on success when reading, 0 if this isn't a valid PMP file
+sub ProcessPMP($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my $buff;
+    $raf->Read($buff, 128) == 128 or return 0;
+    # validate header length (124 bytes)
+    $buff =~ /^.{8}\0{3}\x7c.{112}\xff\xd8\xff\xdb$/s or return 0;
+    $exifTool->SetFileType();
+    SetByteOrder('MM');
+    $exifTool->FoundTag(Make => 'Sony');
+    $exifTool->FoundTag(Model => 'DSC-F1');
+    # extract information from 124-byte header
+    my $tagTablePtr = GetTagTable('Image::ExifTool::Sony::PMP');
+    my %dirInfo = ( DataPt => \$buff, DirName => 'PMP' );
+    $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+    # process JPEG image
+    $raf->Seek(124, 0);
+    $$dirInfo{Base} = 124;
+    $exifTool->ProcessJPEG($dirInfo);
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Decrypt Sony data (ref 1)
+# Inputs: 0) data reference, 1) start offset, 2) data length, 3) decryption key
+# Returns: nothing (original data buffer is updated with decrypted data)
+# Notes: data length should be a multiple of 4
+sub Decrypt($$$$)
+{
+    my ($dataPt, $start, $len, $key) = @_;
+    my ($i, $j, @pad);
+    my $words = int ($len / 4);
+
+    for ($i=0; $i<4; ++$i) {
+        my $lo = ($key & 0xffff) * 0x0edd + 1;
+        my $hi = ($key >> 16) * 0x0edd + ($key & 0xffff) * 0x02e9 + ($lo >> 16);
+        $pad[$i] = $key = (($hi & 0xffff) << 16) + ($lo & 0xffff);
+    }
+    $pad[3] = ($pad[3] << 1 | ($pad[0]^$pad[2]) >> 31) & 0xffffffff;
+    for ($i=4; $i<0x7f; ++$i) {
+        $pad[$i] = (($pad[$i-4]^$pad[$i-2]) << 1 |
+                    ($pad[$i-3]^$pad[$i-1]) >> 31) & 0xffffffff;
+    }
+    my @data = unpack("x$start N$words", $$dataPt);
+    for ($i=0x7f,$j=0; $j<$words; ++$i,++$j) {
+        $data[$j] ^= $pad[$i & 0x7f] = $pad[($i+1) & 0x7f] ^ $pad[($i+65) & 0x7f];
+    }
+    substr($$dataPt, $start, $words*4) = pack('N*', @data);
+}
+
+#------------------------------------------------------------------------------
+# Set the ARW file type and decide between SubIFD and A100DataOffset
+# Inputs: 0) ExifTool object ref, 1) reference to tag 0x14a raw data
+# Returns: true if tag 0x14a is a SubIFD, false otherwise
+sub SetARW($$)
+{
+    my ($exifTool, $valPt) = @_;
+
+    # assume ARW for now -- SR2's get identified when FileFormat is parsed
+    $exifTool->OverrideFileType($$exifTool{TIFF_TYPE} = 'ARW');
+
+    # this should always be a SubIFD for models other than the A100
+    return 1 unless $$exifTool{Model} eq 'DSLR-A100' and length $$valPt == 4;
+
+    # for the A100, IFD0 tag 0x14a is either a pointer to the raw data if this is
+    # an original image, or a SubIFD offset if the image was edited by Sony IDC,
+    # so assume it points to the raw data if it isn't a valid IFD (this assumption
+    # will be checked later when we try to parse the SR2Private directory)
+    my %subdir = (
+        DirStart => Get32u($valPt, 0),
+        Base     => 0,
+        RAF      => $$exifTool{RAF},
+        AllowOutOfOrderTags => 1, # doh!
+    );
+    return Image::ExifTool::Exif::ValidateIFD(\%subdir);
+}
+
+#------------------------------------------------------------------------------
+# Finish writing ARW image, patching necessary Sony quirks, etc
+# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) EXIF data ref, 3) image data reference
+# Returns: undef on success, error string otherwise
+# Notes: (it turns that all of this is for the A100 only)
+sub FinishARW($$$$)
+{
+    my ($exifTool, $dirInfo, $dataPt, $imageData) = @_;
+
+    # pre-scan IFD0 to get IFD entry offsets for each tag
+    my $dataLen = length $$dataPt;
+    return 'Truncated IFD0' if $dataLen < 2;
+    my $n = Get16u($dataPt, 0);
+    return 'Truncated IFD0' if $dataLen < 2 + 12 * $n;
+    my ($i, %entry, $dataBlock, $pad, $dataOffset);
+    for ($i=0; $i<$n; ++$i) {
+        my $entry = 2 + $i * 12;
+        $entry{Get16u($dataPt, $entry)} = $entry;
+    }
+    # fix up SR2Private offset and A100DataOffset (A100 only)
+    if ($entry{0xc634} and $$exifTool{MRWDirData}) {
+        return 'Unexpected MRW block' unless $$exifTool{Model} eq 'DSLR-A100';
+        return 'Missing A100DataOffset' unless $entry{0x14a} and $$exifTool{A100DataOffset};
+        # account for total length of image data
+        my $totalLen = 8 + $dataLen;
+        if (ref $imageData) {
+            foreach $dataBlock (@$imageData) {
+                my ($pos, $size, $pad) = @$dataBlock;
+                $totalLen += $size + $pad;
+            }
+        }
+        # align MRW block on an even 4-byte boundary
+        my $remain = $totalLen & 0x03;
+        $pad = 4 - $remain and $totalLen += $pad if $remain;
+        # set offset for the MRW directory data
+        Set32u($totalLen, $dataPt, $entry{0xc634} + 8);
+        # also pad MRWDirData data to an even 4 bytes (just to be safe)
+        $remain = length($$exifTool{MRWDirData}) & 0x03;
+        $$exifTool{MRWDirData} .= "\0" x (4 - $remain) if $remain;
+        $totalLen += length $$exifTool{MRWDirData};
+        # fix up A100DataOffset
+        $dataOffset = $$exifTool{A100DataOffset};
+        Set32u($totalLen, $dataPt, $entry{0x14a} + 8);
+    }
+    # patch double-referenced and incorrectly-sized A100 PreviewImage
+    if ($entry{0x201} and $$exifTool{A100PreviewStart} and
+        $entry{0x202} and $$exifTool{A100PreviewLength})
+    {
+        Set32u($$exifTool{A100PreviewStart}, $dataPt, $entry{0x201} + 8);
+        Set32u($$exifTool{A100PreviewLength}, $dataPt, $entry{0x202} + 8);
+    }
+    # write TIFF IFD structure
+    my $outfile = $$dirInfo{OutFile};
+    my $header = GetByteOrder() . Set16u(0x2a) . Set32u(8);
+    Write($outfile, $header, $$dataPt) or return 'Error writing';
+    # copy over image data
+    if (ref $imageData) {
+        $exifTool->CopyImageData($imageData, $outfile) or return 'Error copying image data';
+    }
+    # write MRW data if necessary
+    if ($$exifTool{MRWDirData}) {
+        Write($outfile, "\0" x $pad) if $pad;   # write padding if necessary
+        Write($outfile, $$exifTool{MRWDirData});
+        delete $$exifTool{MRWDirData};
+        # set TIFF_END to copy over the MRW image data
+        $$exifTool{TIFF_END} = $dataOffset if $dataOffset;
+    }
+    return undef;
+}
+
+#------------------------------------------------------------------------------
+# Process SRF maker notes
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessSRF($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $start = $$dirInfo{DirStart};
+    my $verbose = $exifTool->Options('Verbose');
+
+    # process IFD chain
+    my ($ifd, $success);
+    for ($ifd=0; ; ) {
+        # switch tag table for SRF2-5 and SRF6
+        if ($ifd == 2) {
+            $tagTablePtr = GetTagTable('Image::ExifTool::Sony::SRF2');
+        } elsif ($ifd == 6) {
+            # SRF6 uses standard EXIF tags
+            $tagTablePtr = GetTagTable('Image::ExifTool::Exif::Main');
+        }
+        my $srf = $$dirInfo{DirName} = "SRF$ifd";
+        $exifTool->{SET_GROUP1} = $srf;
+        $success = Image::ExifTool::Exif::ProcessExif($exifTool, $dirInfo, $tagTablePtr);
+        delete $exifTool->{SET_GROUP1};
+        last unless $success;
+#
+# get pointer to next IFD
+#
+        my $count = Get16u($dataPt, $$dirInfo{DirStart});
+        my $dirEnd = $$dirInfo{DirStart} + 2 + $count * 12;
+        last if $dirEnd + 4 > length($$dataPt);
+        my $nextIFD = Get32u($dataPt, $dirEnd);
+        last unless $nextIFD;
+        $nextIFD -= $$dirInfo{DataPos}; # adjust for position of makernotes data
+        $$dirInfo{DirStart} = $nextIFD;
+#
+# decrypt next IFD data if necessary
+#
+        ++$ifd;
+        my ($key, $len);
+        if ($ifd == 1) {
+            # get the key to decrypt IFD1
+            my $cp = $start + 0x8ddc;    # why?
+            my $ip = $cp + 4 * unpack("x$cp C", $$dataPt);
+            $key = unpack("x$ip N", $$dataPt);
+            $len = $cp + $nextIFD;  # decrypt up to $cp
+        } elsif ($ifd == 2) {
+            # get the key to decrypt IFD2
+            $key = $exifTool->{SRF2Key};
+            $len = length($$dataPt) - $nextIFD; # decrypt rest of maker notes
+        } else {
+            next;   # no decryption needed
+        }
+        # decrypt data
+        Decrypt($dataPt, $nextIFD, $len, $key) if defined $key;
+        next unless $verbose > 2;
+        # display decrypted data in verbose mode
+        $exifTool->VerboseDir("Decrypted SRF$ifd", 0, $nextIFD + $len);
+        $exifTool->VerboseDump($dataPt,
+            Prefix => "$exifTool->{INDENT}  ",
+            Start => $nextIFD,
+            DataPos => $$dirInfo{DataPos},
+        );
+    }
+}
+
+#------------------------------------------------------------------------------
+# Write SR2 data
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success when reading, or SR2 directory or undef when writing
+sub WriteSR2($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    $exifTool or return 1;      # allow dummy access
+    my $buff = '';
+    $$dirInfo{OutFile} = \$buff;
+    return ProcessSR2($exifTool, $dirInfo, $tagTablePtr);
+}
+
+#------------------------------------------------------------------------------
+# Read/Write SR2 IFD and its encrypted subdirectories
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success when reading, or SR2 directory or undef when writing
+sub ProcessSR2($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $raf = $$dirInfo{RAF};
+    my $dataPt = $$dirInfo{DataPt};
+    my $dataPos = $$dirInfo{DataPos};
+    my $dataLen = $$dirInfo{DataLen} || length $$dataPt;
+    my $base = $$dirInfo{Base} || 0;
+    my $outfile = $$dirInfo{OutFile};
+
+    # clear SR2 member variables to be safe
+    delete $$exifTool{SR2SubIFDOffset};
+    delete $$exifTool{SR2SubIFDLength};
+    delete $$exifTool{SR2SubIFDKey};
+
+    # make sure we have the first 4 bytes available to test directory type
+    my $buff;
+    if ($dataLen < 4 and $raf) {
+        my $pos = $dataPos + ($$dirInfo{DirStart}||0) + $base;
+        if ($raf->Seek($pos, 0) and $raf->Read($buff, 4) == 4) {
+            $dataPt = \$buff;
+            undef $$dirInfo{DataPt};    # must load data from file
+            $raf->Seek($pos, 0);
+        }
+    }
+    # this may either be a normal IFD, or a MRW data block
+    # (only original ARW images from the A100 use the MRW block)
+    my $dataOffset;
+    if ($dataPt and $$dataPt =~ /^\0MR[IM]/) {
+        my ($err, $srfPos, $srfLen, $dataOffset);
+        $dataOffset = $$exifTool{A100DataOffset};
+        if ($dataOffset) {
+            # save information about the RAW data trailer so it will be preserved
+            $$exifTool{KnownTrailer} = { Name => 'A100 RAW Data', Start => $dataOffset };
+        } else {
+            $err = 'A100DataOffset tag is missing from A100 ARW image';
+        }
+        $raf or $err = 'Unrecognized SR2 structure';
+        unless ($err) {
+            $srfPos = $raf->Tell();
+            $srfLen = $dataOffset - $srfPos;
+            unless ($srfLen > 0 and $raf->Read($buff, $srfLen) == $srfLen) {
+                $err = 'Error reading MRW directory';
+            }
+        }
+        if ($err) {
+            $outfile and $exifTool->Error($err), return undef;
+            $exifTool->Warn($err);
+            return 0;
+        }
+        my %dirInfo = ( DataPt => \$buff );
+        require Image::ExifTool::MinoltaRaw;
+        if ($outfile) {
+            # save MRW data to be written last
+            $$exifTool{MRWDirData} = Image::ExifTool::MinoltaRaw::WriteMRW($exifTool, \%dirInfo);
+            return $$exifTool{MRWDirData} ? "\0\0\0\0\0\0" : undef;
+        } else {
+            if (not $outfile and $$exifTool{HTML_DUMP}) {
+                $exifTool->HDump($srfPos, $srfLen, '[A100 SRF Data]');
+            }
+            return Image::ExifTool::MinoltaRaw::ProcessMRW($exifTool, \%dirInfo);
+        }
+    } elsif ($$exifTool{A100DataOffset}) {
+        my $err = 'Unexpected A100DataOffset tag';
+        $outfile and $exifTool->Error($err), return undef;
+        $exifTool->Warn($err);
+        return 0;
+    }
+    my $verbose = $exifTool->Options('Verbose');
+    my $result;
+    if ($outfile) {
+        $result = Image::ExifTool::Exif::WriteExif($exifTool, $dirInfo, $tagTablePtr);
+        return undef unless $result;
+        $$outfile .= $result;
+
+    } else {
+        $result = Image::ExifTool::Exif::ProcessExif($exifTool, $dirInfo, $tagTablePtr);
+    }
+    return $result unless $result and $$exifTool{SR2SubIFDOffset};
+    # only take first offset value if more than one!
+    my @offsets = split ' ', $exifTool->{SR2SubIFDOffset};
+    my $offset = shift @offsets;
+    my $length = $exifTool->{SR2SubIFDLength};
+    my $key = $exifTool->{SR2SubIFDKey};
+    my @subifdPos;
+    if ($offset and $length and defined $key) {
+        my $buff;
+        # read encrypted SR2SubIFD from file
+        if (($raf and $raf->Seek($offset+$base, 0) and
+                $raf->Read($buff, $length) == $length) or
+            # or read from data (when processing Adobe DNGPrivateData)
+            ($offset - $dataPos >= 0 and $offset - $dataPos + $length < $dataLen and
+                ($buff = substr($$dataPt, $offset - $dataPos, $length))))
+        {
+            Decrypt(\$buff, 0, $length, $key);
+            # display decrypted data in verbose mode
+            if ($verbose > 2 and not $outfile) {
+                $exifTool->VerboseDir("Decrypted SR2SubIFD", 0, $length);
+                $exifTool->VerboseDump(\$buff, Addr => $offset + $base);
+            }
+            my $num = '';
+            my $dPos = $offset;
+            for (;;) {
+                my %dirInfo = (
+                    Base => $base,
+                    DataPt => \$buff,
+                    DataLen => length $buff,
+                    DirStart => $offset - $dPos,
+                    DirName => "SR2SubIFD$num",
+                    DataPos => $dPos,
+                );
+                my $subTable = GetTagTable('Image::ExifTool::Sony::SR2SubIFD');
+                if ($outfile) {
+                    my $fixup = new Image::ExifTool::Fixup;
+                    $dirInfo{Fixup} = $fixup;
+                    $result = $exifTool->WriteDirectory(\%dirInfo, $subTable);
+                    return undef unless $result;
+                    # save position of this SubIFD
+                    push @subifdPos, length($$outfile);
+                    # add this directory to the returned data
+                    $$fixup{Start} += length($$outfile);
+                    $$outfile .= $result;
+                    $dirInfo->{Fixup}->AddFixup($fixup);
+                } else {
+                    $result = $exifTool->ProcessDirectory(\%dirInfo, $subTable);
+                }
+                last unless @offsets;
+                $offset = shift @offsets;
+                $num = ($num || 1) + 1;
+            }
+
+        } else {
+            $exifTool->Warn('Error reading SR2 data');
+        }
+    }
+    if ($outfile and @subifdPos) {
+        # the SR2SubIFD must be padded to a multiple of 4 bytes for the encryption
+        my $sr2Len = length($$outfile) - $subifdPos[0];
+        if ($sr2Len & 0x03) {
+            my $pad = 4 - ($sr2Len & 0x03);
+            $sr2Len += $pad;
+            $$outfile .= ' ' x $pad;
+        }
+        # save the new SR2SubIFD Length and Key to be used later for encryption
+        $$exifTool{SR2SubIFDLength} = $sr2Len;
+        my $newKey = $$exifTool{VALUE}{SR2SubIFDKey};
+        $$exifTool{SR2SubIFDKey} = $newKey if defined $newKey;
+        # update SubIFD pointers manually and add to fixup, and set SR2SubIFDLength
+        my $n = Get16u($outfile, 0);
+        my ($i, %found);
+        for ($i=0; $i<$n; ++$i) {
+            my $entry = 2 + 12 * $i;
+            my $tagID = Get16u($outfile, $entry);
+            # only interested in SR2SubIFDOffset (0x7200) and SR2SubIFDLength (0x7201)
+            next unless $tagID == 0x7200 or $tagID == 0x7201;
+            $found{$tagID} = 1;
+            my $fmt = Get16u($outfile, $entry + 2);
+            if ($fmt != 0x04) { # must be int32u
+                $exifTool->Error("Unexpected format ($fmt) for SR2SubIFD tag");
+                return undef;
+            }
+            if ($tagID == 0x7201) { # SR2SubIFDLength
+                Set32u($sr2Len, $outfile, $entry + 8);
+                next;
+            }
+            my $tag = 'SR2SubIFDOffset';
+            my $valuePtr = @subifdPos < 2 ? $entry+8 : Get32u($outfile, $entry+8);
+            my $pos;
+            foreach $pos (@subifdPos) {
+                Set32u($pos, $outfile, $valuePtr);
+                $dirInfo->{Fixup}->AddFixup($valuePtr, $tag);
+                undef $tag;
+                $valuePtr += 4;
+            }
+        }
+        unless ($found{0x7200} and $found{0x7201}) {
+            $exifTool->Error('Missing SR2SubIFD tag');
+            return undef;
+        }
+    }
+    return $outfile ? $$outfile : $result;
+}
+
+1; # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Sony - Sony EXIF maker notes tags
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to interpret
+Sony maker notes EXIF meta information.
+
+=head1 NOTES
+
+Also see Minolta.pm since Sony DSLR models use structures originating from
+Minolta.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.cybercom.net/~dcoffin/dcraw/>
+
+=item L<http://homepage3.nifty.com/kamisaka/makernote/makernote_sony.htm>
+
+=item L<http://www.klingebiel.com/tempest/hd/pmp.html>
+
+=back
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Thomas Bodenmann, Philippe Devaux, Jens Duttke, Marcus
+Holland-Moritz, Andrey Tverdokhleb, Rudiger Lange, Igal Milchtaich and
+Michael Reitinger for help decoding some tags.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/Sony Tags>,
+L<Image::ExifTool::TagNames/Minolta Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/SonyIDC.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/SonyIDC.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/SonyIDC.pm	(revision 24799)
@@ -0,0 +1,330 @@
+#------------------------------------------------------------------------------
+# File:         SonyIDC.pm
+#
+# Description:  Read/write Sony IDC information
+#
+# Revisions:    2010/01/05 - P. Harvey Created
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::SonyIDC;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.02';
+
+# Sony IDC tags (ref PH)
+%Image::ExifTool::SonyIDC::Main = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
+    NOTES => 'Tags written by the Sony Image Data Converter utility in ARW images.',
+    SET_GROUP1 => 1,
+    0x201 => {
+        Name => 'IDCPreviewStart',
+        IsOffset => 1,
+        OffsetPair => 0x202,
+        DataTag => 'IDCPreview',
+        Writable => 'int32u',
+        Protected => 2,
+    },
+    0x202 => {
+        Name => 'IDCPreviewLength',
+        OffsetPair => 0x201,
+        DataTag => 'IDCPreview',
+        Writable => 'int32u',
+        Protected => 2,
+    },
+    0x8000 => {
+        Name => 'IDCCreativeStyle',
+        Writable => 'int32u',
+        PrintConvColumns => 2,
+        PrintConv => {
+            1 => 'Camera Setting',
+            2 => 'Standard',
+            3 => 'Real',
+            4 => 'Vivid',
+            5 => 'Adobe RGB',
+            6 => 'A100 Standard', # shows up as '-' in IDC menu
+            7 => 'Neutral',
+            8 => 'Portrait',
+            9 => 'Landscape',
+            10 => 'Clear',
+            11 => 'Deep',
+            12 => 'Light',
+            13 => 'Sunset',
+            14 => 'Night View',
+            15 => 'Autumn Leaves',
+            16 => 'B&W',
+            17 => 'Sepia',
+        },
+    },
+    0x8001 => {
+        Name => 'CreativeStyleWasChanged',
+        Writable => 'int32u',
+        Notes => 'set if the creative style was ever changed',
+        #        (even if it was changed back again later)
+        PrintConv => { 0 => 'No', 1 => 'Yes' },
+    },
+    0x8002 => {
+        Name => 'PresetWhiteBalance',
+        Writable => 'int32u',
+        PrintConv => {
+            1 => 'Camera Setting',
+            2 => 'Color Temperature',
+            3 => 'Specify Gray Point',
+            4 => 'Daylight',
+            5 => 'Cloudy',
+            6 => 'Shade',
+            7 => 'Cool White Fluorescent',
+            8 => 'Day Light Fluorescent',
+            9 => 'Day White Fluorescent',
+            10 => 'Warm White Fluorescent',
+            11 => 'Tungsten',
+            12 => 'Flash',
+            13 => 'Auto',
+        },
+    },
+    0x8013 => { Name => 'ColorTemperatureAdj',  Writable => 'int16u' },
+    0x8014 => { Name => 'PresetWhiteBalanceAdj',Writable => 'int32s' },
+    0x8015 => { Name => 'ColorCorrection',      Writable => 'int32s' },
+    0x8016 => { Name => 'SaturationAdj',        Writable => 'int32s' },
+    0x8017 => { Name => 'ContrastAdj',          Writable => 'int32s' },
+    0x8018 => { Name => 'BrightnessAdj',        Writable => 'int32s' },
+    0x8019 => { Name => 'HueAdj',               Writable => 'int32s' },
+    0x801a => { Name => 'SharpnessAdj',         Writable => 'int32s' },
+    0x801b => { Name => 'SharpnessOvershoot',   Writable => 'int32s' },
+    0x801c => { Name => 'SharpnessUndershoot',  Writable => 'int32s' },
+    0x801d => { Name => 'SharpnessThreshold',   Writable => 'int32s' },
+    0x801e => {
+        Name => 'NoiseReductionMode',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'On',
+        },
+    },
+    0x8021 => {
+        Name => 'GrayPoint',
+        Writable => 'int16u',
+        Count => 4,
+    },
+    0x8022 => {
+        Name => 'D-RangeOptimizerMode',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'Auto',
+            2 => 'Manual',
+        },
+    },
+    0x8023 => { Name => 'D-RangeOptimizerValue',    Writable => 'int32s' },
+    0x8024 => { Name => 'D-RangeOptimizerHighlight',Writable => 'int32s' },
+    0x8026 => {
+        Name => 'HighlightColorDistortReduct',
+        Writable => 'int16u',
+        PrintConv => {
+            0 => 'Standard',
+            1 => 'Advanced',
+        },
+    },
+    0x8027 => {
+        Name => 'NoiseReductionValue',
+        Writable => 'int32s',
+        ValueConv => '($val + 100) / 2',
+        ValueConvInv => '$val * 2 - 100',
+    },
+    0x8028 => {
+        Name => 'EdgeNoiseReduction',
+        Writable => 'int32s',
+        ValueConv => '($val + 100) / 2',
+        ValueConvInv => '$val * 2 - 100',
+    },
+    0x8029 => {
+        Name => 'ColorNoiseReduction',
+        Writable => 'int32s',
+        ValueConv => '($val + 100) / 2',
+        ValueConvInv => '$val * 2 - 100',
+    },
+    0x802d => { Name => 'D-RangeOptimizerShadow',       Writable => 'int32s' },
+    0x8030 => { Name => 'PeripheralIllumCentralRadius', Writable => 'int32s' },
+    0x8031 => { Name => 'PeripheralIllumCentralValue',  Writable => 'int32s' },
+    0x8032 => { Name => 'PeripheralIllumPeriphValue',   Writable => 'int32s' },
+    0x9000 => {
+        Name => 'ToneCurveBrightnessX',
+        Writable => 'int16u',
+        Count => -1,
+    },
+    0x9001 => {
+        Name => 'ToneCurveRedX',
+        Writable => 'int16u',
+        Count => -1,
+    },
+    0x9002 => {
+        Name => 'ToneCurveGreenX',
+        Writable => 'int16u',
+        Count => -1,
+    },
+    0x9003 => {
+        Name => 'ToneCurveBlueX',
+        Writable => 'int16u',
+        Count => -1,
+    },
+    0x9004 => {
+        Name => 'ToneCurveBrightnessY',
+        Writable => 'int16u',
+        Count => -1,
+    },
+    0x9005 => {
+        Name => 'ToneCurveRedY',
+        Writable => 'int16u',
+        Count => -1,
+    },
+    0x9006 => {
+        Name => 'ToneCurveGreenY',
+        Writable => 'int16u',
+        Count => -1,
+    },
+    0x9007 => {
+        Name => 'ToneCurveBlueY',
+        Writable => 'int16u',
+        Count => -1,
+    },
+    0xd000 => { Name => 'CurrentVersion',   Writable => 'int32u' },
+    0xd001 => {
+        Name => 'VersionIFD',
+        Groups => { 1 => 'Version0' },
+        Flags => 'SubIFD',
+        Notes => 'there is one VersionIFD for each entry in the "Version Stack"',
+        SubDirectory => {
+            DirName => 'Version0',
+            TagTable => 'Image::ExifTool::SonyIDC::Main',
+            Start => '$val',
+            Base => '$start',
+            MaxSubdirs => 20,   # (IDC v3.0 writes max. 10)
+            RelativeBase => 1,  # needed to write SubIFD with relative offsets
+        },
+    },
+    0xd100 => {
+        Name => 'VersionCreateDate',
+        Writable => 'string',
+        Groups => { 2 => 'Time' },
+        Notes => 'date/time when this entry was created in the "Version Stack"',
+        Shift => 'Time',
+        PrintConv => '$self->ConvertDateTime($val)',
+        PrintConvInv => '$self->InverseDateTime($val,0)',
+    },
+    0xd101 => {
+        Name => 'VersionModifyDate',
+        Writable => 'string',
+        Groups => { 2 => 'Time' },
+        Shift => 'Time',
+        PrintConv => '$self->ConvertDateTime($val)',
+        PrintConvInv => '$self->InverseDateTime($val,0)',
+    },
+);
+
+# extract IDC preview images as composite tags
+%Image::ExifTool::SonyIDC::Composite = (
+    GROUPS => { 2 => 'Image' },
+    IDCPreviewImage => {
+        Require => {
+            0 => 'IDCPreviewStart',
+            1 => 'IDCPreviewLength',
+        },
+        # extract all preview images (not just one)
+        RawConv => q{
+            require Image::ExifTool::SonyIDC;
+            Image::ExifTool::SonyIDC::ExtractPreviews($self);
+        },
+    },
+);
+
+# add our composite tags
+Image::ExifTool::AddCompositeTags('Image::ExifTool::SonyIDC');
+
+# set "Permanent" flag for all tags
+{
+    my $key;
+    foreach $key (TagTableKeys(\%Image::ExifTool::SonyIDC::Main)) {
+        $Image::ExifTool::SonyIDC::Main{$key}{Permanent} = 1;
+    }
+}
+
+#------------------------------------------------------------------------------
+# Extract all IDC preview images
+# Inputs: 0) ExifTool object ref
+# Returns: data for "IDCPreviewImage" tag (which I have never seen),
+#          or undef if there was no preview in the SonyIDC IFD
+sub ExtractPreviews($)
+{
+    my $exifTool = shift;
+    my $i = 1;
+    my $xtra = ' (1)';
+    my $preview;
+    # loop through all available IDC preview images in the order they were found
+    for (;;) {
+        my $key = "IDCPreviewStart$xtra";
+        unless (defined $$exifTool{VALUE}{$key}) {
+            last unless $xtra;
+            $xtra = ''; # do the last tag extracted last
+            next;
+        }
+        # run through IDC preview images in the same order they were extracted
+        my $off = $exifTool->GetValue($key) or last;
+        my $len = $exifTool->GetValue("IDCPreviewLength$xtra") or last;
+        # get stack version from number in group 1 name
+        my $grp1 = $exifTool->GetGroup($key, 1);
+        if ($grp1 =~ /(\d+)$/) {
+            my $tag = "IDCPreviewImage$1";
+            unless ($Image::ExifTool::Extra{$tag}) {
+                Image::ExifTool::AddTagToTable(\%Image::ExifTool::Extra, $tag, {
+                    Name => $tag,
+                    Groups => { 0 => 'Composite', 1 => 'Composite', 2 => 'Image'},
+                });
+            }
+            my $val = Image::ExifTool::Exif::ExtractImage($exifTool, $off, $len, $tag);
+            $exifTool->FoundTag($tag, $val);
+        } else {
+            $preview = Image::ExifTool::Exif::ExtractImage($exifTool, $off, $len, 'IDCPreviewImage');
+        }
+        # step to next set of tags unless we are done
+        last unless $xtra;
+        ++$i;
+        $xtra = " ($i)";
+    }
+    return $preview;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::SonyIDC - Read/write Sony IDC information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to read and
+write Sony Image Data Converter verson 3.0 metadata in ARW images.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/SonyIDC Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Stim.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Stim.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Stim.pm	(revision 24799)
@@ -0,0 +1,196 @@
+#------------------------------------------------------------------------------
+# File:         Stim.pm
+#
+# Description:  Definitions for Stereo Still Image tags
+#
+# Revisions:    06/12/2009 - P. Harvey Created
+#
+# References:   1) http://www.cipa.jp/english/hyoujunka/kikaku/pdf/DC-006_E.pdf
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Stim;
+
+use strict;
+use vars qw($VERSION);
+
+$VERSION = '1.00';
+
+# Tags found in Stim APP3 segment in JPEG images
+%Image::ExifTool::Stim::Main = (
+    GROUPS => { 0 => 'Stim', 1 => 'Stim', 2 => 'Image'},
+    NOTES => q{
+        These tags are part of the CIPA Stereo Still Image specification, and are
+        found in the APP3 "Stim" segment of JPEG images.  See
+        L<http://www.cipa.jp/english/hyoujunka/kikaku/pdf/DC-006_E.pdf> for the
+        official specification.
+    },
+    0 => 'StimVersion',
+    1 => {
+        Name => 'ApplicationData',
+        Binary => 1,
+    },
+    2 => {
+        Name => 'ImageArrangement',
+        PrintConv => {
+            0 => 'Parallel View Alignment',
+            1 => 'Cross View Alignment',
+        },
+    },
+    3 => {
+        Name => 'ImageRotation',
+        PrintConv => {
+            1 => 'None',
+        },
+    },
+    4 => 'ScalingFactor',
+    5 => 'CropXSize',
+    6 => 'CropYSize',
+    7 => {
+        Name => 'CropX',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Stim::CropX',
+        },
+    },
+    8 => {
+        Name => 'CropY',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::Stim::CropY',
+        },
+    },
+    9 => {
+        Name => 'ViewType',
+        PrintConv => {
+            0 => 'No Pop-up Effect',
+            1 => 'Pop-up Effect',
+        },
+    },
+    10 => {
+        Name => 'RepresentativeImage',
+        PrintConv => {
+            0 => 'Left Viewpoint',
+            1 => 'Right Viewpoint',
+        },
+    },
+    11 => {
+        Name => 'ConvergenceBaseImage',
+        PrintConv => {
+            0 => 'Left Viewpoint',
+            1 => 'Right Viewpoint',
+            255 => 'Equivalent for Both Viewpoints',
+        },
+    },
+    12 => {
+        Name => 'AssumedDisplaySize',
+        PrintConv => '"$val mm"',
+    },
+    13 => {
+        Name => 'AssumedDistanceView',
+        PrintConv => '"$val mm"',
+    },
+    14 => 'RepresentativeDisparityNear',
+    15 => 'RepresentativeDisparityFar',
+    16 => {
+        Name => 'InitialDisplayEffect',
+        PrintConv => {
+            0 => 'Off',
+            1 => 'On',
+        },
+    },
+    17 => {
+        Name => 'ConvergenceDistance',
+        PrintConv => '$val ? "$val mm" : "inf"',
+    },
+    18 => {
+        Name => 'CameraArrangementInterval',
+        PrintConv => '"$val mm"',
+    },
+    19 => 'ShootingCount',
+);
+
+# crop offset X tags
+%Image::ExifTool::Stim::CropX = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'Stim', 1 => 'Stim', 2 => 'Image'},
+    0 => {
+        Name => 'CropXCommonOffset',
+        Format => 'int16u',
+        PrintConv => {
+            0 => 'Common Offset Setting',
+            1 => 'Individual Offset Setting',
+        },
+    },
+    2 => 'CropXViewpointNumber',
+    3 => {
+        Name => 'CropXOffset',
+        Format => 'int32s',
+    },
+    7 => 'CropXViewpointNumber2',
+    8 => {
+        Name => 'CropXOffset2',
+        Format => 'int32s',
+    },
+);
+
+# crop offset Y tags
+%Image::ExifTool::Stim::CropY = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 0 => 'Stim', 1 => 'Stim', 2 => 'Image'},
+    0 => {
+        Name => 'CropYCommonOffset',
+        Format => 'int16u',
+        PrintConv => {
+            0 => 'Common Offset Setting',
+            1 => 'Individual Offset Setting',
+        },
+    },
+    2 => 'CropYViewpointNumber',
+    3 => {
+        Name => 'CropYOffset',
+        Format => 'int32s',
+    },
+    7 => 'CropYViewpointNumber2',
+    8 => {
+        Name => 'CropYOffset2',
+        Format => 'int32s',
+    },
+);
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Stim - Definitions for Stereo Still Image tags
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains tag definitions for Stereo Still Image format (Stim)
+information.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.cipa.jp/english/hyoujunka/kikaku/pdf/DC-006_E.pdf>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/Stim Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/TagInfoXML.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/TagInfoXML.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/TagInfoXML.pm	(revision 24799)
@@ -0,0 +1,788 @@
+#------------------------------------------------------------------------------
+# File:         TagInfoXML.pm
+#
+# Description:  Read/write tag information XML database
+#
+# Revisions:    2009/01/28 - P. Harvey Created
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::TagInfoXML;
+
+use strict;
+require Exporter;
+
+use vars qw($VERSION @ISA);
+use Image::ExifTool qw(:Utils :Vars);
+use Image::ExifTool::XMP;
+
+$VERSION = '1.15';
+@ISA = qw(Exporter);
+
+# set this to a language code to generate Lang module with 'MISSING' entries
+my $makeMissing = '';
+
+# set this to true to override existing different descriptions/values
+my $overrideDifferent;
+
+sub LoadLangModules($);
+sub WriteLangModule($$;$);
+sub NumbersFirst;
+
+# names for acknowledgements in the POD documentation
+my %credits = (
+    cs   => 'Jens Duttke and Petr MichE<aacute>lek',
+    de   => 'Jens Duttke and Herbert Kauer',
+    es   => 'Jens Duttke and Santiago del BrE<iacute>o GonzE<aacute>lez',
+    fr   => 'Jens Duttke, Bernard Guillotin, Jean Glasser, Jean Piquemal and Harry Nizard',
+    it   => 'Jens Duttke, Ferdinando Agovino and Emilio Dati',
+    ja   => 'Jens Duttke and Kazunari Nishina',
+    ko   => 'Jens Duttke and Jeong Beom Kim',
+    nl   => 'Jens Duttke, Peter Moonen and Herman Beld',
+    pl   => 'Jens Duttke and Przemyslaw Sulek',
+    ru   => 'Jens Duttke, Sergey Shemetov, Dmitry Yerokhin and Anton Sukhinov',
+    sv   => 'Jens Duttke and BjE<ouml>rn SE<ouml>derstrE<ouml>m',
+   'tr'  => 'Jens Duttke, Hasan Yildirim and Cihan Ulusoy',
+    zh_cn => 'Jens Duttke and Haibing Zhong',
+    zh_tw => 'Jens Duttke and MikeF',
+);
+
+# translate country codes to language codes
+my %translateLang = (
+    ch_s  => 'zh_cn',
+    ch_cn => 'zh_cn',
+    ch_tw => 'zh_tw',
+    cz    => 'cs',
+    jp    => 'ja',
+    kr    => 'ko',
+    se    => 'sv',
+);
+
+my $caseInsensitive;    # used internally by sort routine
+
+#------------------------------------------------------------------------------
+# Utility to print tag information database as an XML list
+# Inputs: 0) output file name (undef to send to console),
+#         1) group name (may be undef), 2) options hash ('Flags','NoDesc')
+# Returns: true on success
+sub Write(;$$%)
+{
+    local ($_, *PTIFILE);
+    my ($file, $group, %opts) = @_;
+    my @groups = split ':', $group if $group;
+    my $exifTool = new Image::ExifTool;
+    my ($fp, $tableName, %langInfo, @langs, $defaultLang);
+
+    Image::ExifTool::LoadAllTables();   # first load all our tables
+    unless ($opts{NoDesc}) {
+        LoadLangModules(\%langInfo);    # load all existing Lang modules
+        @langs = sort keys %langInfo;
+        $defaultLang = $Image::ExifTool::defaultLang;
+    }
+    if (defined $file) {
+        open PTIFILE, ">$file" or return 0;
+        $fp = \*PTIFILE;
+    } else {
+        $fp = \*STDOUT;
+    }
+    print $fp "<?xml version='1.0' encoding='UTF-8'?>\n";
+    print $fp "<taginfo>\n\n";
+
+    # loop through all tables and save tag names to %allTags hash
+    foreach $tableName (sort keys %allTables) {
+        my $table = GetTagTable($tableName);
+        my $grps = $$table{GROUPS};
+        my ($tagID, $didTag);
+        # sort in same order as tag name documentation
+        $caseInsensitive = ($tableName =~ /::XMP::/);
+        my @keys = sort NumbersFirst TagTableKeys($table);
+        # get list of languages defining elements in this table
+        my $isBinary = ($$table{PROCESS_PROC} and
+                        $$table{PROCESS_PROC} eq \&Image::ExifTool::ProcessBinaryData);
+        # loop throug all tag ID's in this table
+        foreach $tagID (@keys) {
+            my @infoArray = GetTagInfoList($table, $tagID);
+            my $xmlID = Image::ExifTool::XMP::FullEscapeXML($tagID);
+            # get a list of languages defining elements for this ID
+            my ($index, $fam);
+PTILoop:    for ($index=0; $index<@infoArray; ++$index) {
+                my $tagInfo = $infoArray[$index];
+                # don't list subdirectories unless they are writable
+                next unless $$tagInfo{Writable} or not $$tagInfo{SubDirectory};
+                if (@groups) {
+                    my @tg = $exifTool->GetGroup($tagInfo);
+                    foreach $group (@groups) {
+                        next PTILoop unless grep /^$group$/i, @tg;
+                    }
+                }
+                unless ($didTag) {
+                    my $tname = $$table{SHORT_NAME};
+                    print $fp "<table name='$tname' g0='$$grps{0}' g1='$$grps{1}' g2='$$grps{2}'>\n";
+                    unless ($opts{NoDesc}) {
+                        # print table description
+                        my $desc = $$table{TABLE_DESC};
+                        unless ($desc) {
+                            ($desc = $tname) =~ s/::Main$//;
+                            $desc =~ s/::/ /g;
+                        }
+                        # print alternate language descriptions
+                        print $fp " <desc lang='en'>$desc</desc>\n";
+                        foreach (@langs) {
+                            $desc = $langInfo{$_}{$tableName} or next;
+                            $desc = Image::ExifTool::XMP::EscapeXML($desc);
+                            print $fp " <desc lang='$_'>$desc</desc>\n";
+                        }
+                    }
+                    $didTag = 1;
+                }
+                my $name = $$tagInfo{Name};
+                my $ind = @infoArray > 1 ? " index='$index'" : '';
+                my $format = $$tagInfo{Writable} || $$table{WRITABLE};
+                my $writable = $format ? 'true' : 'false';
+                # check our conversions to make sure we can really write this tag
+                if ($writable eq 'true') {
+                    foreach ('PrintConv','ValueConv') {
+                        next unless $$tagInfo{$_};
+                        next if $$tagInfo{$_ . 'Inv'};
+                        next if ref($$tagInfo{$_}) =~ /^(HASH|ARRAY)$/;
+                        next if $$tagInfo{WriteAlso};
+                        $writable = 'false';
+                        last;
+                    }
+                }
+                $format = $$tagInfo{Format} || $$table{FORMAT} if not defined $format or $format eq '1';
+                if (defined $format) {
+                    $format =~ s/\[.*\$.*\]//;   # remove expressions from format
+                } elsif ($isBinary) {
+                    $format = 'int8u';
+                } else {
+                    $format = '?';
+                }
+                my $count = '';
+                if ($format =~ s/\[.*?(\d*)\]$//) {
+                    $count = " count='$1'" if length $1;
+                }
+                my @groups = $exifTool->GetGroup($tagInfo);
+                my $writeGroup = $$tagInfo{WriteGroup} || $$table{WRITE_GROUP};
+                if ($writeGroup and $writeGroup ne 'Comment') {
+                    $groups[1] = $writeGroup;   # use common write group for group 1
+                }
+                # add group names if different from table defaults
+                my $grp = '';
+                for ($fam=0; $fam<3; ++$fam) {
+                    $grp .= " g$fam='$groups[$fam]'" if $groups[$fam] ne $$grps{$fam};
+                }
+                # add flags if necessary
+                if ($opts{Flags}) {
+                    my @flags;
+                    foreach (qw(Avoid Binary List Mandatory Unknown)) {
+                        push @flags, $_ if $$tagInfo{$_};
+                    }
+                    push @flags, $$tagInfo{List} if $$tagInfo{List} and $$tagInfo{List} =~ /^(Alt|Bag|Seq)$/;
+                    push @flags, 'Unsafe' if $$tagInfo{Protected} and $$tagInfo{Protected} & 0x01;
+                    push @flags, 'Protected' if $$tagInfo{Protected} and $$tagInfo{Protected} & 0x02;
+                    push @flags, 'Permanent' if $$tagInfo{Permanent} or
+                        ($groups[0] eq 'MakerNotes' and not defined $$tagInfo{Permanent});
+                    $grp = " flags='" . join(',', sort @flags) . "'$grp" if @flags;
+                }
+                print $fp " <tag id='$xmlID' name='$name'$ind type='$format'$count writable='$writable'$grp";
+                if ($opts{NoDesc}) {
+                    # short output format
+                    print $fp "/>\n";   # empty tag element
+                    next;               # no descriptions or values
+                }
+                my $desc = $$tagInfo{Description};
+                $desc = Image::ExifTool::MakeDescription($name) unless defined $desc;
+                # add alternate language descriptions and get references
+                # to alternate language PrintConv hashes
+                my $altDescr = '';
+                my %langConv;
+                foreach (@langs) {
+                    my $ld = $langInfo{$_}{$name} or next;
+                    if (ref $ld) {
+                        $langConv{$_} = $$ld{PrintConv};
+                        $ld = $$ld{Description} or next;
+                    }
+                    # ignore descriptions that are the same as the default language
+                    next if $ld eq $desc;
+                    $ld = Image::ExifTool::XMP::EscapeXML($ld);
+                    $altDescr .= "\n  <desc lang='$_'>$ld</desc>";
+                }
+                # print tag descriptions
+                $desc = Image::ExifTool::XMP::EscapeXML($desc);
+                print $fp ">\n  <desc lang='$defaultLang'>$desc</desc>$altDescr\n";
+                for (my $i=0; ; ++$i) {
+                    my $conv = $$tagInfo{PrintConv};
+                    my $idx = '';
+                    if (ref $conv eq 'ARRAY') {
+                        last unless $i < @$conv;
+                        $conv = $$conv[$i];
+                        $idx = " index='$i'";
+                    } else {
+                        last if $i;
+                    }
+                    next unless ref $conv eq 'HASH';
+                    # make a list of available alternate languages
+                    my @langConv = sort keys %langConv;
+                    print $fp "  <values$idx>\n";
+                    my $key;
+                    $caseInsensitive = 0;
+                    # add bitmask values to main lookup
+                    if ($$conv{BITMASK}) {
+                        foreach $key (keys %{$$conv{BITMASK}}) {
+                            my $mask = 0x01 << $key;
+                            next if $$conv{$mask};
+                            $$conv{$mask} = $$conv{BITMASK}{$key};
+                        }
+                    }
+                    foreach $key (sort NumbersFirst keys %$conv) {
+                        next if $key eq 'BITMASK' or $key eq 'OTHER' or $key eq 'Notes';
+                        my $val = $$conv{$key};
+                        my $xmlVal = Image::ExifTool::XMP::EscapeXML($val);
+                        my $xmlKey = Image::ExifTool::XMP::FullEscapeXML($key);
+                        print $fp "   <key id='$xmlKey'>";
+                        print $fp "\n    <val lang='$defaultLang'>$xmlVal</val>\n";
+                        # add alternate language values
+                        foreach (@langConv) {
+                            my $lv = $langConv{$_};
+                            # handle indexed PrintConv entries
+                            $lv = $$lv[$i] or next if ref $lv eq 'ARRAY';
+                            $lv = $$lv{$val};
+                            # ignore values that are missing or same as default
+                            next unless defined $lv and $lv ne $val;
+                            $lv = Image::ExifTool::XMP::EscapeXML($lv);
+                            print $fp "    <val lang='$_'>$lv</val>\n";
+                        }
+                        print $fp "   </key>\n";
+                    }
+                    print $fp "  </values>\n";
+                }
+                print $fp " </tag>\n";
+            }
+        }
+        print $fp "</table>\n\n" if $didTag;
+    }
+    my $success = 1;
+    print $fp "</taginfo>\n" or $success = 0;
+    close $fp or $success = 0 if defined $file;
+    return $success;
+}
+
+#------------------------------------------------------------------------------
+# Perl-ize this constant
+# Inputs: string
+# Returns: constant string for Perl
+sub Perlize($)
+{
+    my $str = shift;
+    unless (($str =~ /^[+-]?(?=\d|\.\d)\d*(\.\d*)?$/ and # int or float
+             not $str =~ /^[+-]?0\d+$/) or # not octal
+            $str =~ /^0x[0-9a-f]+$/i) # hexadecimal
+    {
+        # translate unprintable characters
+        $str =~ s/\\/\\\\/g; # escape backslashes
+        if ($str =~ /([\x00-\x1f\x80-\xff])/) {
+            $str =~ s/"/\\"/g; # escape double quotes
+            # escape unprintable characters
+            $str =~ s/([\x00-\x1f\x80-\xff])/sprintf("\\x%.2x",ord $1)/eg;
+            $str = qq{"$str"};
+        } else {
+            $str =~ s/'/\\'/g; # escape single quotes
+            $str = qq{'$str'};
+        }
+    }
+    return $str;
+}
+
+#------------------------------------------------------------------------------
+# Escape backslash and quote in string
+# Inputs: string
+# Returns: escaped string
+sub EscapePerl
+{
+    my $str = shift;
+    $str =~ s/\\/\\\\/g;
+    $str =~ s/'/\\'/g;
+    return $str;
+}
+
+#------------------------------------------------------------------------------
+# Generate Lang modules from input tag info XML database
+# Inputs: 0) XML filename, 1) update flag:
+#       undef = default (update changed modules only)
+#       0 = (update changed modules only, but preserve version numbers)
+#       1 = (update all, but preserve version numbers)
+#       2 = (update all from scratch, but preserve version numbers)
+# Returns: Count of updated Lang modules, or -1 on error
+# Notes: Must be run from the directory containing 'lib'
+sub BuildLangModules($;$)
+{
+    local ($_, *XFILE);
+    my ($file, $forceUpdate) = @_;
+    my ($table, $tableName, $id, $index, $valIndex, $name, $key, $lang);
+    my (%langInfo, %different, %changed);
+
+    Image::ExifTool::LoadAllTables();   # first load all our tables
+    LoadLangModules(\%langInfo);        # load all existing Lang modules
+    %langInfo = () if $forceUpdate and $forceUpdate eq '2';
+
+    if (defined $file) {
+        open XFILE, $file or return -1;
+        while (<XFILE>) {
+            next unless /^\s*<(\/?)(\w+)/;
+            my $tok = $2;
+            if ($1) {
+                # close appropriate entities
+                if ($tok eq 'tag') {
+                    undef $id;
+                    undef $index;
+                    undef $name;
+                } elsif ($tok eq 'values') {
+                    undef $key;
+                    undef $valIndex;
+                } elsif ($tok eq 'table') {
+                    undef $table;
+                    undef $id;
+                }
+                next;
+            }
+            if ($tok eq 'table') {
+                /^\s*<table name='([^']+)'[ >]/ or warn('Bad table'), next;
+                $tableName = "Image::ExifTool::$1";
+                # ignore userdefined tables
+                next if $tableName =~ /^Image::ExifTool::UserDefined/;
+                $table = Image::ExifTool::GetTagTable($tableName);
+                $table or warn("Unknown tag table $tableName\n");
+                next;
+            }
+            next unless defined $table;
+            if ($tok eq 'tag') {
+                /^\s*<tag id='([^']*)' name='([^']+)'( index='(\d+)')?[ >]/ or warn('Bad tag'), next;
+                $id = Image::ExifTool::XMP::FullUnescapeXML($1);
+                $name = $2;
+                $index = $4;
+                $id = hex($id) if $id =~ /^0x[\da-fA-F]+$/; # convert hex ID's
+                next;
+            }
+            if ($tok eq 'values') {
+                /^\s*<values index='([^']*)'>/ or next;
+                $valIndex = $1;
+            } elsif ($tok eq 'key') {
+                defined $id or warn('No ID'), next;
+                /^\s*<key id='([^']*)'>/ or warn('Bad key'), next;
+                $key = Image::ExifTool::XMP::FullUnescapeXML($1);
+                $key = hex($key) if $key =~ /^0x[\da-fA-F]+$/; # convert hex keys
+            } elsif ($tok eq 'val' or $tok eq 'desc') {
+                /^\s*<$tok( lang='([-\w]+?)')?>(.*)<\/$tok>/ or warn("Bad $tok"), next;
+                $tok eq 'desc' and defined $key and warn('Out of order "desc"'), next;
+                my $lang = $2 or next; # looking only for alternate languages
+                $lang =~ tr/-A-Z/_a-z/;
+                # use standard ISO 639-1 language codes
+                $lang = $translateLang{$lang} if $translateLang{$lang};
+                my $tval = Image::ExifTool::XMP::UnescapeXML($3);
+                my $val = ucfirst $tval;
+                my $cap = ($tval ne $val);
+                if ($makeMissing and $lang eq 'en') {
+                    $lang = $makeMissing;
+                    $val = 'MISSING';
+                }
+                my $isDefault = ($lang eq $Image::ExifTool::defaultLang);
+                unless ($langInfo{$lang} or $isDefault) {
+                    print "Creating new language $lang\n";
+                    $langInfo{$lang} = { };
+                }
+                defined $name or $name = '<unknown>';
+                unless (defined $id) {
+                    next if $isDefault;
+                    # this is a table description
+                    next if $langInfo{$lang}{$tableName} and
+                            $langInfo{$lang}{$tableName} eq $val;
+                    $langInfo{$lang}{$tableName} = $val;
+                    $changed{$lang} = 1;
+                    warn("Capitalized '$lang' val for $name: $val\n") if $cap;
+                    next;
+                }
+                my @infoArray = GetTagInfoList($table, $id);
+    
+                # this will fail for UserDefined tags and tags without ID's
+                @infoArray or warn("Error loading tag for $tableName ID='$id'\n"), next;
+                my ($tagInfo, $langInfo);
+                if (defined $index) {
+                    $tagInfo = $infoArray[$index];
+                    $tagInfo or warn('Invalid index'), next;
+                } else {
+                    @infoArray > 1 and warn('Missing index'), next;
+                    $tagInfo = $infoArray[0];
+                }
+                my $tagName = $$tagInfo{Name};
+                if ($isDefault) {
+                    unless ($$tagInfo{Description}) {
+                        $$tagInfo{Description} = Image::ExifTool::MakeDescription($tagName);
+                    }
+                    $langInfo = $tagInfo;
+                } else {
+                    $langInfo = $langInfo{$lang}{$tagName};
+                    if (not defined $langInfo) {
+                        $langInfo = $langInfo{$lang}{$tagName} = { };
+                    } elsif (not ref $langInfo) {
+                        $langInfo = $langInfo{$lang}{$tagName} = { Description => $langInfo };
+                    }
+                }
+                # save new value in langInfo record
+                if ($tok eq 'desc') {
+                    my $oldVal = $$langInfo{Description};
+                    next if defined $oldVal and $oldVal eq $val;
+                    if ($makeMissing) {
+                        next if defined $oldVal and $val eq 'MISSING';
+                    } elsif (defined $oldVal) {
+                        my $t = "$lang $tagName";
+                        unless (defined $different{$t} and $different{$t} eq $val) {
+                            my $a = defined $different{$t} ? 'ANOTHER ' : '';
+                            warn "${a}Different '$lang' desc for $tagName: $val (was $$langInfo{Description})\n";
+                            next if defined $different{$t}; # don't change back again
+                            $different{$t} = $val;
+                        }
+                        next unless $overrideDifferent;
+                    }
+                    next if $isDefault;
+                    $$langInfo{Description} = $val;
+                } else {
+                    defined $key or warn("No key for $$tagInfo{Name}"), next;
+                    my $printConv = $$tagInfo{PrintConv};
+                    if (ref $printConv eq 'ARRAY') {
+                        defined $valIndex or warn('No value index'), next;
+                        $printConv = $$printConv[$valIndex];
+                    }
+                    ref $printConv eq 'HASH' or warn('No PrintConv'), next;
+                    my $convVal = $$printConv{$key};
+                    unless (defined $convVal) {
+                        if ($$printConv{BITMASK} and $key =~ /^\d+$/) {
+                            my $i;
+                            for ($i=0; $i<32; ++$i) {
+                                next unless $key == (0x01 << $i);
+                                $convVal = $$printConv{BITMASK}{$i};
+                            }
+                        }
+                        warn("Missing PrintConv entry for $key") and next unless defined $convVal;
+                    }
+                    my $lc = $$langInfo{PrintConv};
+                    $lc or $lc = $$langInfo{PrintConv} = { };
+                    $lc = $printConv if ref $lc eq 'ARRAY'; #(default lang only)
+                    my $oldVal = $$lc{$convVal};
+                    next if defined $oldVal and $oldVal eq $val;
+                    if ($makeMissing) {
+                        next if defined $oldVal and $val eq 'MISSING';
+                    } elsif (defined $oldVal and (not $isDefault or not $val=~/^\d+$/)) {
+                        my $t = "$lang $tagName $convVal";
+                        unless (defined $different{$t} and $different{$t} eq $val) {
+                            my $a = defined $different{$t} ? 'ANOTHER ' : '';
+                            warn "${a}Different '$lang' val for $tagName '$convVal': $val (was $oldVal)\n";
+                            next if defined $different{$t}; # don't change back again
+                            $different{$t} = $val;
+                        }
+                        next unless $overrideDifferent;
+                    }
+                    next if $isDefault;
+                    warn("Capitalized '$lang' val for $tagName: $tval\n") if $cap;
+                    $$lc{$convVal} = $val;
+                }
+                $changed{$lang} = 1;
+            }
+        }
+        close XFILE;
+    }
+    # rewrite all changed Lang modules
+    my $rtnVal = 0;
+    foreach $lang ($forceUpdate ? @Image::ExifTool::langs : sort keys %changed) {
+        next if $lang eq $Image::ExifTool::defaultLang;
+        ++$rtnVal;
+        # write this module (only increment version number if not forced)
+        WriteLangModule($lang, $langInfo{$lang}, not defined $forceUpdate) or $rtnVal = -1, last;
+    }
+    return $rtnVal;
+}
+
+#------------------------------------------------------------------------------
+# Write Lang module
+# Inputs: 0) language string, 1) langInfo lookup reference, 2) flag to increment version
+# Returns: true on success
+sub WriteLangModule($$;$)
+{
+    local ($_, *XOUT);
+    my ($lang, $langTags, $newVersion) = @_;
+    my $err;
+    -e "lib/Image/ExifTool" or die "Must run from directory containing 'lib'\n";
+    my $out = "lib/Image/ExifTool/Lang/$lang.pm";
+    my $tmp = "$out.tmp";
+    open XOUT, ">$tmp" or die "Error creating $tmp\n";
+    my $ver = "Image::ExifTool::Lang::${lang}::VERSION";
+    no strict 'refs';
+    if ($$ver) {
+        $ver = $$ver;
+        $ver = int($ver * 100 + 1.5) / 100 if $newVersion;
+    } else {
+        $ver = 1.0;
+    }
+    $ver = sprintf('%.2f', $ver);
+    use strict 'refs';
+    my $langName = $Image::ExifTool::langName{$lang} || $lang;
+    $langName =~ s/\s*\(.*//;
+    print XOUT <<HEADER;
+#------------------------------------------------------------------------------
+# File:         $lang.pm
+#
+# Description:  ExifTool $langName language translations
+#
+# Notes:        This file generated automatically by Image::ExifTool::TagInfoXML
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Lang::$lang;
+
+use strict;
+use vars qw(\$VERSION);
+
+\$VERSION = '$ver';
+
+HEADER
+    print XOUT "\%Image::ExifTool::Lang::${lang}::Translate = (\n";
+    # loop through all tag and table names
+    my $tag;
+    foreach $tag (sort keys %$langTags) {
+        my $desc = $$langTags{$tag};
+        my $conv;
+        if (ref $desc) {
+            $conv = $$desc{PrintConv};
+            $desc = $$desc{Description};
+            # remove description if not necessary
+            # (not strictly correct -- should test against tag description, not name)
+            undef $desc if $desc and $desc eq $tag;
+            # remove unnecessary value translations
+            if ($conv) {
+                my @keys = keys %$conv;
+                foreach (@keys) {
+                    delete $$conv{$_} if $_ eq $$conv{$_};
+                }
+                undef $conv unless %$conv;
+            }
+        }
+        if (defined $desc) {
+            $desc = EscapePerl($desc);
+        } else {
+            next unless $conv;
+        }
+        print XOUT "   '$tag' => ";
+        unless ($conv) {
+            print XOUT "'$desc',\n";
+            next;
+        }
+        print XOUT "{\n";
+        print XOUT "      Description => '$desc',\n" if defined $desc;
+        if ($conv) {
+            print XOUT "      PrintConv => {\n";
+            foreach (sort keys %$conv) {
+                my $str = EscapePerl($_);
+                my $val = EscapePerl($$conv{$_});
+                print XOUT "        '$str' => '$val',\n";
+            }
+            print XOUT "      },\n";
+        }
+        print XOUT "    },\n";
+    }
+    # generate acknowledgements for this language
+    my $ack;
+    if ($credits{$lang}) {
+        $ack = "Thanks to $credits{$lang} for providing this translation.";
+        $ack =~ s/(.{1,76})( +|$)/$1\n/sg;  # wrap text to 76 columns
+        $ack = "~head1 ACKNOWLEDGEMENTS\n\n$ack\n";
+    } else {
+        $ack = '';
+    }
+    my $footer = <<FOOTER;
+);
+
+1;  # end
+
+
+__END__
+
+~head1 NAME
+
+Image::ExifTool::Lang::$lang.pm - ExifTool $langName language translations
+
+~head1 DESCRIPTION
+
+This file is used by Image::ExifTool to generate localized tag descriptions
+and values.
+
+~head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+$ack~head1 SEE ALSO
+
+L<Image::ExifTool(3pm)|Image::ExifTool>,
+L<Image::ExifTool::TagInfoXML(3pm)|Image::ExifTool::TagInfoXML>
+
+~cut
+FOOTER
+    $footer =~ s/^~/=/mg;   # un-do pod obfuscation
+    print XOUT $footer or $err = 1;
+    close XOUT or $err = 1;
+    if ($err or not rename($tmp, $out)) {
+        warn "Error writing $out\n";
+        unlink $tmp;
+        $err = 1;
+    }
+    return $err ? 0 : 1;
+}
+
+#------------------------------------------------------------------------------
+# load all lang modules into hash
+# Inputs: 0) Hash reference
+sub LoadLangModules($)
+{
+    my $langHash = shift;
+    my $lang;
+    require Image::ExifTool;
+    foreach $lang (@Image::ExifTool::langs) {
+        next if $lang eq $Image::ExifTool::defaultLang;
+        eval "require Image::ExifTool::Lang::$lang" or warn("Can't load Lang::$lang\n"), next;
+        my $xlat = "Image::ExifTool::Lang::${lang}::Translate";
+        no strict 'refs';
+        %$xlat or warn("Missing Info for $lang\n"), next;
+        $$langHash{$lang} = \%$xlat;
+        use strict 'refs';
+    }
+}
+
+#------------------------------------------------------------------------------
+# sort numbers first numerically, then strings alphabetically (case insensitive)
+sub NumbersFirst
+{
+    my $rtnVal;
+    my $bNum = ($b =~ /^-?[0-9]+(\.\d*)?$/);
+    if ($a =~ /^-?[0-9]+(\.\d*)?$/) {
+        $rtnVal = ($bNum ? $a <=> $b : -1);
+    } elsif ($bNum) {
+        $rtnVal = 1;
+    } else {
+        my ($a2, $b2) = ($a, $b);
+        # expand numbers to 3 digits (with restrictions to avoid messing up ascii-hex tags)
+        $a2 =~ s/(\d+)/sprintf("%.3d",$1)/eg if $a2 =~ /^(APP)?[.0-9 ]*$/ and length($a2)<16;
+        $b2 =~ s/(\d+)/sprintf("%.3d",$1)/eg if $b2 =~ /^(APP)?[.0-9 ]*$/ and length($b2)<16;
+        $caseInsensitive and $rtnVal = (lc($a2) cmp lc($b2));
+        $rtnVal or $rtnVal = ($a2 cmp $b2);
+    }
+    return $rtnVal;
+}
+
+1;  # end
+
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::TagInfoXML - Read/write tag information XML database
+
+=head1 DESCRIPTION
+
+This module is used to generate an XML database from all ExifTool tag
+information.  The XML database may then be edited and used to re-generate
+the language modules (Image::ExifTool::Lang::*).
+
+=head1 METHODS
+
+=head2 Write
+
+Print complete tag information database in XML format.
+
+  # save list of all tags
+  $success = Image::ExifTool::TagInfoXML::Write('dst.xml');
+
+  # list all IPTC tags to console, including Flags
+  Image::ExifTool::TagInfoXML::Write(undef, 'IPTC', Flags => 1);
+
+  # write all EXIF Camera tags to file
+  Image::ExifTool::TagInfoXML::Write($outfile, 'exif:camera');
+
+=over 4
+
+=item Inputs:
+
+0) [optional] Output file name, or undef for console output.  Output file
+will be overwritten if it already exists.
+
+1) [optional] String of group names separated by colons to specify the group
+to print.  A specific IFD may not be given as a group, since EXIF tags may
+be written to any IFD.  Saves all groups if not specified.
+
+2) [optional] Hash of options values:
+
+    Flags   - Set to output 'flags' attribute
+    NoDesc  - Set to suppress output of descriptions
+
+=item Return Value:
+
+True on success.
+
+=item Sample XML Output:
+
+=back
+
+  <?xml version='1.0' encoding='UTF-8'?>
+  <taginfo>
+
+  <table name='XMP::dc' g0='XMP' g1='XMP-dc' g2='Other'>
+   <desc lang='en'>XMP Dublin Core</desc>
+   <tag id='title' name='Title' type='lang-alt' writable='true' g2='Image'>
+    <desc lang='en'>Title</desc>
+    <desc lang='de'>Titel</desc>
+    <desc lang='fr'>Titre</desc>
+   </tag>
+   ...
+  </table>
+
+  </taginfo>
+
+Flags (if selected and available) are formatted as a comma-separated list of
+the following possible values:  Avoid, Binary, List, Mandatory, Permanent,
+Protected, Unknown and Unsafe.  See the
+L<tag name documentation|Image::ExifTool::TagNames> and
+lib/Image/ExifTool/README for a description of these flags.  For XMP List
+tags, the list type (Alt, Bag or Seq) is also output as a flag if
+applicable.
+
+=head2 BuildLangModules
+
+Build all Image::ExifTool::Lang modules from an XML database file.
+
+    Image::ExifTool::TagInfoXML::BuildLangModules('src.xml');
+
+=over 4
+
+=item Inputs:
+
+0) XML file name
+
+=item Return Value:
+
+Number of modules updated, or negative on error.
+
+=back
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool(3pm)|Image::ExifTool>,
+L<Image::ExifTool::TagNames(3pm)|Image::ExifTool::TagNames>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/TagLookup.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/TagLookup.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/TagLookup.pm	(revision 24799)
@@ -0,0 +1,6704 @@
+#------------------------------------------------------------------------------
+# File:         TagLookup.pm
+#
+# Description:  Fast lookup for ExifTool tags
+#
+# Notes:        This lookup is used to look up tag names for writing
+#
+# Revisions:    12/31/2004  - P. Harvey Created
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::TagLookup;
+
+use strict;
+require Exporter;
+
+use vars qw($VERSION @ISA @EXPORT_OK);
+use Image::ExifTool qw(:Utils);
+
+$VERSION = '1.07';
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(FindTagInfo TagExists);
+
+sub AddTags($$);
+sub AddFields($$$$$$;$$);
+
+#
+# Note: the lists below were generated by Image::ExifTool::BuildTagLookup
+#
+
+#++++ Begin automatically generated code ++++
+
+# list of tables containing writable tags
+my @tableList = (
+	'Image::ExifTool::APP12::Ducky',
+	'Image::ExifTool::Canon::AFMicroAdj',
+	'Image::ExifTool::Canon::Ambience',
+	'Image::ExifTool::Canon::AspectInfo',
+	'Image::ExifTool::Canon::CameraInfo1000D',
+	'Image::ExifTool::Canon::CameraInfo1D',
+	'Image::ExifTool::Canon::CameraInfo1DmkII',
+	'Image::ExifTool::Canon::CameraInfo1DmkIII',
+	'Image::ExifTool::Canon::CameraInfo1DmkIIN',
+	'Image::ExifTool::Canon::CameraInfo1DmkIV',
+	'Image::ExifTool::Canon::CameraInfo40D',
+	'Image::ExifTool::Canon::CameraInfo450D',
+	'Image::ExifTool::Canon::CameraInfo500D',
+	'Image::ExifTool::Canon::CameraInfo50D',
+	'Image::ExifTool::Canon::CameraInfo550D',
+	'Image::ExifTool::Canon::CameraInfo5D',
+	'Image::ExifTool::Canon::CameraInfo5DmkII',
+	'Image::ExifTool::Canon::CameraInfo5DmkII_2',
+	'Image::ExifTool::Canon::CameraInfo60D',
+	'Image::ExifTool::Canon::CameraInfo7D',
+	'Image::ExifTool::Canon::CameraInfo7D_2',
+	'Image::ExifTool::Canon::CameraInfoPowerShot',
+	'Image::ExifTool::Canon::CameraInfoPowerShot2',
+	'Image::ExifTool::Canon::CameraInfoUnknown32',
+	'Image::ExifTool::Canon::CameraSettings',
+	'Image::ExifTool::Canon::ColorBalance',
+	'Image::ExifTool::Canon::ColorCalib',
+	'Image::ExifTool::Canon::ColorCoefs',
+	'Image::ExifTool::Canon::ColorData1',
+	'Image::ExifTool::Canon::ColorData2',
+	'Image::ExifTool::Canon::ColorData3',
+	'Image::ExifTool::Canon::ColorData4',
+	'Image::ExifTool::Canon::ColorData5',
+	'Image::ExifTool::Canon::ColorData6',
+	'Image::ExifTool::Canon::ColorInfo',
+	'Image::ExifTool::Canon::CropInfo',
+	'Image::ExifTool::Canon::FaceDetect1',
+	'Image::ExifTool::Canon::FaceDetect2',
+	'Image::ExifTool::Canon::FileInfo',
+	'Image::ExifTool::Canon::Flags',
+	'Image::ExifTool::Canon::FocalLength',
+	'Image::ExifTool::Canon::LensInfo',
+	'Image::ExifTool::Canon::LightingOpt',
+	'Image::ExifTool::Canon::Main',
+	'Image::ExifTool::Canon::MeasuredColor',
+	'Image::ExifTool::Canon::ModifiedInfo',
+	'Image::ExifTool::Canon::MovieInfo',
+	'Image::ExifTool::Canon::MyColors',
+	'Image::ExifTool::Canon::PSInfo',
+	'Image::ExifTool::Canon::PSInfo2',
+	'Image::ExifTool::Canon::Panorama',
+	'Image::ExifTool::Canon::PreviewImageInfo',
+	'Image::ExifTool::Canon::Processing',
+	'Image::ExifTool::Canon::SerialInfo',
+	'Image::ExifTool::Canon::ShotInfo',
+	'Image::ExifTool::Canon::VignettingCorr',
+	'Image::ExifTool::Canon::VignettingCorr2',
+	'Image::ExifTool::CanonCustom::Functions10D',
+	'Image::ExifTool::CanonCustom::Functions1D',
+	'Image::ExifTool::CanonCustom::Functions2',
+	'Image::ExifTool::CanonCustom::Functions20D',
+	'Image::ExifTool::CanonCustom::Functions30D',
+	'Image::ExifTool::CanonCustom::Functions350D',
+	'Image::ExifTool::CanonCustom::Functions400D',
+	'Image::ExifTool::CanonCustom::Functions5D',
+	'Image::ExifTool::CanonCustom::FunctionsD30',
+	'Image::ExifTool::CanonCustom::PersonalFuncValues',
+	'Image::ExifTool::CanonCustom::PersonalFuncs',
+	'Image::ExifTool::CanonRaw::ExposureInfo',
+	'Image::ExifTool::CanonRaw::FlashInfo',
+	'Image::ExifTool::CanonRaw::ImageFormat',
+	'Image::ExifTool::CanonRaw::ImageInfo',
+	'Image::ExifTool::CanonRaw::Main',
+	'Image::ExifTool::CanonRaw::MakeModel',
+	'Image::ExifTool::CanonRaw::RawJpgInfo',
+	'Image::ExifTool::CanonRaw::TimeStamp',
+	'Image::ExifTool::CanonVRD::Main',
+	'Image::ExifTool::CanonVRD::Ver1',
+	'Image::ExifTool::CanonVRD::Ver2',
+	'Image::ExifTool::Casio::FaceInfo1',
+	'Image::ExifTool::Casio::FaceInfo2',
+	'Image::ExifTool::Casio::Main',
+	'Image::ExifTool::Casio::Type2',
+	'Image::ExifTool::Composite',
+	'Image::ExifTool::DNG::AdobeData',
+	'Image::ExifTool::Exif::Main',
+	'Image::ExifTool::Extra',
+	'Image::ExifTool::FotoStation::Main',
+	'Image::ExifTool::FotoStation::SoftEdit',
+	'Image::ExifTool::FujiFilm::Main',
+	'Image::ExifTool::GE::Main',
+	'Image::ExifTool::GPS::Main',
+	'Image::ExifTool::IPTC::ApplicationRecord',
+	'Image::ExifTool::IPTC::EnvelopeRecord',
+	'Image::ExifTool::IPTC::NewsPhoto',
+	'Image::ExifTool::JFIF::Main',
+	'Image::ExifTool::Kodak::CameraInfo',
+	'Image::ExifTool::Kodak::IFD',
+	'Image::ExifTool::Kodak::KDC_IFD',
+	'Image::ExifTool::Kodak::Main',
+	'Image::ExifTool::Kodak::Meta',
+	'Image::ExifTool::Kodak::SubIFD0',
+	'Image::ExifTool::Kodak::SubIFD1',
+	'Image::ExifTool::Kodak::SubIFD2',
+	'Image::ExifTool::Kodak::SubIFD3',
+	'Image::ExifTool::Kodak::SubIFD5',
+	'Image::ExifTool::Kodak::Type10',
+	'Image::ExifTool::Kodak::Type2',
+	'Image::ExifTool::Kodak::Type3',
+	'Image::ExifTool::Kodak::Type4',
+	'Image::ExifTool::Kodak::Type7',
+	'Image::ExifTool::Kodak::Type9',
+	'Image::ExifTool::MIE::Audio',
+	'Image::ExifTool::MIE::Camera',
+	'Image::ExifTool::MIE::Doc',
+	'Image::ExifTool::MIE::Extender',
+	'Image::ExifTool::MIE::Flash',
+	'Image::ExifTool::MIE::GPS',
+	'Image::ExifTool::MIE::Geo',
+	'Image::ExifTool::MIE::Image',
+	'Image::ExifTool::MIE::Lens',
+	'Image::ExifTool::MIE::Main',
+	'Image::ExifTool::MIE::Orient',
+	'Image::ExifTool::MIE::Preview',
+	'Image::ExifTool::MIE::Thumbnail',
+	'Image::ExifTool::MIE::UTM',
+	'Image::ExifTool::MIE::Video',
+	'Image::ExifTool::Microsoft::MP',
+	'Image::ExifTool::Microsoft::MP1',
+	'Image::ExifTool::Microsoft::Stitch',
+	'Image::ExifTool::Microsoft::XMP',
+	'Image::ExifTool::Minolta::CameraSettings',
+	'Image::ExifTool::Minolta::CameraSettings5D',
+	'Image::ExifTool::Minolta::CameraSettings7D',
+	'Image::ExifTool::Minolta::CameraSettingsA100',
+	'Image::ExifTool::Minolta::Main',
+	'Image::ExifTool::Minolta::WBInfoA100',
+	'Image::ExifTool::MinoltaRaw::PRD',
+	'Image::ExifTool::MinoltaRaw::RIF',
+	'Image::ExifTool::MinoltaRaw::WBG',
+	'Image::ExifTool::Nikon::AFInfo',
+	'Image::ExifTool::Nikon::AFInfo2',
+	'Image::ExifTool::Nikon::AFTune',
+	'Image::ExifTool::Nikon::CaptureOutput',
+	'Image::ExifTool::Nikon::ColorBalance1',
+	'Image::ExifTool::Nikon::ColorBalance2',
+	'Image::ExifTool::Nikon::ColorBalance3',
+	'Image::ExifTool::Nikon::ColorBalance4',
+	'Image::ExifTool::Nikon::ColorBalanceA',
+	'Image::ExifTool::Nikon::DistortInfo',
+	'Image::ExifTool::Nikon::FaceDetect',
+	'Image::ExifTool::Nikon::FileInfo',
+	'Image::ExifTool::Nikon::FlashInfo0100',
+	'Image::ExifTool::Nikon::FlashInfo0102',
+	'Image::ExifTool::Nikon::FlashInfo0103',
+	'Image::ExifTool::Nikon::GEM',
+	'Image::ExifTool::Nikon::ISOInfo',
+	'Image::ExifTool::Nikon::LensData00',
+	'Image::ExifTool::Nikon::LensData01',
+	'Image::ExifTool::Nikon::LensData0204',
+	'Image::ExifTool::Nikon::Main',
+	'Image::ExifTool::Nikon::MultiExposure',
+	'Image::ExifTool::Nikon::PictureControl',
+	'Image::ExifTool::Nikon::PreviewIFD',
+	'Image::ExifTool::Nikon::ROC',
+	'Image::ExifTool::Nikon::Scan',
+	'Image::ExifTool::Nikon::ShotInfo',
+	'Image::ExifTool::Nikon::ShotInfoD300S',
+	'Image::ExifTool::Nikon::ShotInfoD300a',
+	'Image::ExifTool::Nikon::ShotInfoD300b',
+	'Image::ExifTool::Nikon::ShotInfoD3S',
+	'Image::ExifTool::Nikon::ShotInfoD3X',
+	'Image::ExifTool::Nikon::ShotInfoD3a',
+	'Image::ExifTool::Nikon::ShotInfoD3b',
+	'Image::ExifTool::Nikon::ShotInfoD40',
+	'Image::ExifTool::Nikon::ShotInfoD5000',
+	'Image::ExifTool::Nikon::ShotInfoD700',
+	'Image::ExifTool::Nikon::ShotInfoD7000',
+	'Image::ExifTool::Nikon::ShotInfoD80',
+	'Image::ExifTool::Nikon::ShotInfoD90',
+	'Image::ExifTool::Nikon::Type2',
+	'Image::ExifTool::Nikon::VRInfo',
+	'Image::ExifTool::Nikon::WorldTime',
+	'Image::ExifTool::NikonCapture::Brightness',
+	'Image::ExifTool::NikonCapture::ColorBoost',
+	'Image::ExifTool::NikonCapture::CropData',
+	'Image::ExifTool::NikonCapture::DLightingHQ',
+	'Image::ExifTool::NikonCapture::DLightingHS',
+	'Image::ExifTool::NikonCapture::Exposure',
+	'Image::ExifTool::NikonCapture::HighlightData',
+	'Image::ExifTool::NikonCapture::Main',
+	'Image::ExifTool::NikonCapture::NoiseReduction',
+	'Image::ExifTool::NikonCapture::PhotoEffects',
+	'Image::ExifTool::NikonCapture::PictureCtrl',
+	'Image::ExifTool::NikonCapture::RedEyeData',
+	'Image::ExifTool::NikonCapture::UnsharpData',
+	'Image::ExifTool::NikonCapture::WBAdjData',
+	'Image::ExifTool::NikonCustom::SettingsD3',
+	'Image::ExifTool::NikonCustom::SettingsD40',
+	'Image::ExifTool::NikonCustom::SettingsD5000',
+	'Image::ExifTool::NikonCustom::SettingsD700',
+	'Image::ExifTool::NikonCustom::SettingsD7000',
+	'Image::ExifTool::NikonCustom::SettingsD80',
+	'Image::ExifTool::NikonCustom::SettingsD90',
+	'Image::ExifTool::Olympus::CameraSettings',
+	'Image::ExifTool::Olympus::Equipment',
+	'Image::ExifTool::Olympus::FETags',
+	'Image::ExifTool::Olympus::FocusInfo',
+	'Image::ExifTool::Olympus::ImageProcessing',
+	'Image::ExifTool::Olympus::Main',
+	'Image::ExifTool::Olympus::RawDevelopment',
+	'Image::ExifTool::Olympus::RawDevelopment2',
+	'Image::ExifTool::Olympus::RawInfo',
+	'Image::ExifTool::PDF::Info',
+	'Image::ExifTool::PNG::Main',
+	'Image::ExifTool::PNG::TextualData',
+	'Image::ExifTool::Panasonic::Data1',
+	'Image::ExifTool::Panasonic::FaceDetInfo',
+	'Image::ExifTool::Panasonic::FaceRecInfo',
+	'Image::ExifTool::Panasonic::Leica2',
+	'Image::ExifTool::Panasonic::Leica3',
+	'Image::ExifTool::Panasonic::Leica5',
+	'Image::ExifTool::Panasonic::Leica6',
+	'Image::ExifTool::Panasonic::LensInfo',
+	'Image::ExifTool::Panasonic::Main',
+	'Image::ExifTool::Panasonic::Subdir',
+	'Image::ExifTool::PanasonicRaw::Main',
+	'Image::ExifTool::Pentax::AEInfo',
+	'Image::ExifTool::Pentax::AFInfo',
+	'Image::ExifTool::Pentax::AWBInfo',
+	'Image::ExifTool::Pentax::BatteryInfo',
+	'Image::ExifTool::Pentax::CameraInfo',
+	'Image::ExifTool::Pentax::CameraSettings',
+	'Image::ExifTool::Pentax::ColorInfo',
+	'Image::ExifTool::Pentax::EVStepInfo',
+	'Image::ExifTool::Pentax::FaceInfo',
+	'Image::ExifTool::Pentax::FacePos',
+	'Image::ExifTool::Pentax::FaceSize',
+	'Image::ExifTool::Pentax::FilterInfo',
+	'Image::ExifTool::Pentax::FlashInfo',
+	'Image::ExifTool::Pentax::LensCorr',
+	'Image::ExifTool::Pentax::LensData',
+	'Image::ExifTool::Pentax::LensInfo',
+	'Image::ExifTool::Pentax::LensInfo2',
+	'Image::ExifTool::Pentax::LensInfo3',
+	'Image::ExifTool::Pentax::LensInfo4',
+	'Image::ExifTool::Pentax::LevelInfo',
+	'Image::ExifTool::Pentax::Main',
+	'Image::ExifTool::Pentax::SRInfo',
+	'Image::ExifTool::Pentax::ShotInfo',
+	'Image::ExifTool::Pentax::TempInfoK5',
+	'Image::ExifTool::Pentax::TimeInfo',
+	'Image::ExifTool::Pentax::Type2',
+	'Image::ExifTool::PhotoMechanic::SoftEdit',
+	'Image::ExifTool::PhotoMechanic::XMP',
+	'Image::ExifTool::Photoshop::JPEG_Quality',
+	'Image::ExifTool::Photoshop::Main',
+	'Image::ExifTool::Photoshop::Resolution',
+	'Image::ExifTool::PostScript::Main',
+	'Image::ExifTool::Reconyx::Main',
+	'Image::ExifTool::Ricoh::FaceInfo',
+	'Image::ExifTool::Ricoh::FirmwareInfo',
+	'Image::ExifTool::Ricoh::ImageInfo',
+	'Image::ExifTool::Ricoh::Main',
+	'Image::ExifTool::Ricoh::SerialInfo',
+	'Image::ExifTool::Ricoh::Subdir',
+	'Image::ExifTool::Samsung::Type1',
+	'Image::ExifTool::Samsung::Type2',
+	'Image::ExifTool::Sanyo::FaceInfo',
+	'Image::ExifTool::Sanyo::Main',
+	'Image::ExifTool::Sigma::Main',
+	'Image::ExifTool::Sony::CameraSettings',
+	'Image::ExifTool::Sony::CameraSettings2',
+	'Image::ExifTool::Sony::Ericsson',
+	'Image::ExifTool::Sony::FaceInfo1',
+	'Image::ExifTool::Sony::FaceInfo2',
+	'Image::ExifTool::Sony::Main',
+	'Image::ExifTool::Sony::Panorama',
+	'Image::ExifTool::Sony::ShotInfo',
+	'Image::ExifTool::SonyIDC::Main',
+	'Image::ExifTool::XMP::Album',
+	'Image::ExifTool::XMP::DICOM',
+	'Image::ExifTool::XMP::Lightroom',
+	'Image::ExifTool::XMP::MediaPro',
+	'Image::ExifTool::XMP::acdsee',
+	'Image::ExifTool::XMP::aux',
+	'Image::ExifTool::XMP::cc',
+	'Image::ExifTool::XMP::cell',
+	'Image::ExifTool::XMP::crs',
+	'Image::ExifTool::XMP::dc',
+	'Image::ExifTool::XMP::dex',
+	'Image::ExifTool::XMP::digiKam',
+	'Image::ExifTool::XMP::exif',
+	'Image::ExifTool::XMP::iptcCore',
+	'Image::ExifTool::XMP::iptcExt',
+	'Image::ExifTool::XMP::mwg_coll',
+	'Image::ExifTool::XMP::mwg_kw',
+	'Image::ExifTool::XMP::mwg_rs',
+	'Image::ExifTool::XMP::pdf',
+	'Image::ExifTool::XMP::photoshop',
+	'Image::ExifTool::XMP::plus',
+	'Image::ExifTool::XMP::prism',
+	'Image::ExifTool::XMP::prl',
+	'Image::ExifTool::XMP::pur',
+	'Image::ExifTool::XMP::rdf',
+	'Image::ExifTool::XMP::swf',
+	'Image::ExifTool::XMP::tiff',
+	'Image::ExifTool::XMP::x',
+	'Image::ExifTool::XMP::xmp',
+	'Image::ExifTool::XMP::xmpBJ',
+	'Image::ExifTool::XMP::xmpDM',
+	'Image::ExifTool::XMP::xmpMM',
+	'Image::ExifTool::XMP::xmpNote',
+	'Image::ExifTool::XMP::xmpPLUS',
+	'Image::ExifTool::XMP::xmpRights',
+	'Image::ExifTool::XMP::xmpTPg',
+);
+
+# lookup for all writable tags
+my %tagLookup = (
+	'aberrationcorrectiondistance' => { 78 => 0x69 },
+	'about' => { 304 => 'about' },
+	'abspeakaudiofilepath' => { 310 => 'absPeakAudioFilePath' },
+	'accessorytype' => { 224 => 0x53 },
+	'actionadvised' => { 92 => 0x2a },
+	'activearea' => { 85 => 0xc68d },
+	'actived-lighting' => { 160 => 0x22, 188 => 0x24 },
+	'actived-lightingmode' => { 188 => 0x25 },
+	'addaspectratioinfo' => { 59 => 0x80e },
+	'additionalmodelinformation' => { 294 => 'AddlModelInfo' },
+	'addoriginaldecisiondata' => { 59 => 0x80f, 60 => 0x11, 61 => 0x13, 64 => 0x14 },
+	'address' => { 118 => 'Address' },
+	'adjustmentmode' => { 270 => 0x15 },
+	'adultcontentwarning' => { 300 => 'AdultContentWarning', 303 => 'adultContentWarning' },
+	'advancedraw' => { 190 => 0x76a43203 },
+	'advancedscenemode' => { 224 => 0x3d },
+	'advisory' => { 308 => 'Advisory' },
+	'ae_iso' => { 227 => 0x2 },
+	'aeaperture' => { 227 => 0x1 },
+	'aebautocancel' => { 59 => 0x104 },
+	'aebbracketvalue' => { 54 => 0x11 },
+	'aebsequence' => { 59 => 0x105 },
+	'aebsequenceautocancel' => { 57 => 0x9, 58 => 0x9, 60 => 0x8, 61 => 0x9, 64 => 0x9, 65 => 0x7 },
+	'aebshotcount' => { 59 => 0x106 },
+	'aebxv' => { 227 => 0x4 },
+	'aeexposuretime' => { 227 => 0x0 },
+	'aelbutton' => { 134 => 0x45 },
+	'aelexposureindicator' => { 134 => 0x51 },
+	'aelock' => { 134 => 0x5b, 198 => '4.2', 202 => '4.2', 204 => 0x201, 247 => 0x48 },
+	'aelockbutton' => { 197 => '16.1', 198 => '4.1', 199 => '15.1', 200 => '30.1', 201 => '16.1', 202 => '4.1', 203 => '17.1' },
+	'aelockbuttonplusdials' => { 197 => '16.2', 200 => '32.1' },
+	'aelockformb-d80' => { 203 => '3.1' },
+	'aemaxaperture' => { 227 => 0x9 },
+	'aemaxaperture2' => { 227 => 0xa },
+	'aemeteringmode' => { 227 => 0xc },
+	'aemeteringsegments' => { 247 => 0x209 },
+	'aemicroadjustment' => { 59 => 0x111 },
+	'aeminaperture' => { 227 => 0xb },
+	'aeminexposuretime' => { 227 => 0x5 },
+	'aeprogrammode' => { 227 => 0x6 },
+	'aesetting' => { 24 => 0x21 },
+	'aexv' => { 227 => 0x3 },
+	'af-cpriorityselection' => { 197 => '1.1', 200 => '1.1', 201 => '0.1' },
+	'af-onformb-d10' => { 197 => '3.3', 200 => '3.2' },
+	'af-onformb-d11' => { 201 => '2.2' },
+	'af-spriorityselection' => { 197 => '1.2', 200 => '1.2', 201 => '0.2' },
+	'afactivation' => { 197 => '2.1', 200 => '2.1' },
+	'afadjustment' => { 247 => 0x72 },
+	'afandmeteringbuttons' => { 59 => 0x701 },
+	'afaperture' => { 158 => 0x5, 159 => 0x5 },
+	'afareaheight' => { 141 => 0x1a },
+	'afareaillumination' => { 134 => 0x4b, 202 => '15.3' },
+	'afareamode' => { 134 => 0xe, 140 => 0x0, 141 => 0x5, 224 => 0xf, 271 => 0x11, 272 => 0x11 },
+	'afareamodesetting' => { 198 => '11.1', 199 => '0.1', 202 => '16.1', 203 => '2.1' },
+	'afareas' => { 204 => 0x304 },
+	'afareawidth' => { 141 => 0x18 },
+	'afareaxposition' => { 141 => 0x14 },
+	'afareayposition' => { 141 => 0x16 },
+	'afassist' => { 57 => 0x5, 65 => 0x5, 134 => 0x48, 197 => '2.5', 198 => '0.2', 199 => '0.2', 200 => '2.4', 201 => '1.4', 202 => '0.2', 203 => '2.3' },
+	'afassistbeam' => { 59 => 0x50e, 60 => 0x4, 61 => 0x5, 62 => 0x4, 63 => 0x4, 64 => 0x5 },
+	'afassistlamp' => { 224 => 0x31 },
+	'afdefocus' => { 228 => 0x6 },
+	'afduringliveview' => { 59 => 0x511 },
+	'affinetune' => { 142 => 0x0 },
+	'affinetuneadj' => { 142 => 0x2, 168 => 0x2d1, 169 => 0x2dc, 204 => 0x307 },
+	'affinetuneindex' => { 142 => 0x1 },
+	'afilluminator' => { 271 => 0x29, 276 => 0xb044 },
+	'afimageheight' => { 141 => 0x12 },
+	'afimagewidth' => { 141 => 0x10 },
+	'afintegrationtime' => { 228 => 0x7 },
+	'afmicroadjactive' => { 1 => 0x1 },
+	'afmicroadjustment' => { 59 => 0x507 },
+	'afmicroadjvalue' => { 1 => 0x2 },
+	'afmode' => { 82 => 0x3009, 270 => 0x5, 276 => 0xb043 },
+	'afonaelockbuttonswitch' => { 59 => 0x702 },
+	'afonbutton' => { 197 => '3.1' },
+	'afpoint' => { 24 => 0x13, 81 => 0x18, 140 => 0x1, 207 => 0x308, 270 => 0x1f },
+	'afpointactivationarea' => { 58 => 0x11, 64 => 0x11 },
+	'afpointareaexpansion' => { 59 => 0x508 },
+	'afpointautoselection' => { 59 => 0x50b },
+	'afpointbrightness' => { 59 => 0x50d, 197 => '2.4' },
+	'afpointdisplayduringfocus' => { 59 => 0x50c },
+	'afpointillumination' => { 58 => 0xa, 197 => '2.3', 200 => '2.3', 201 => '1.3', 203 => '2.4' },
+	'afpointmode' => { 232 => 0x3 },
+	'afpointposition' => { 82 => 0x2021, 224 => 0x4d },
+	'afpointregistration' => { 57 => 0x7 },
+	'afpoints' => { 133 => 0x10 },
+	'afpointselected' => { 204 => 0x305, 247 => 0xe },
+	'afpointselected2' => { 232 => 0x4 },
+	'afpointselection' => { 58 => 0xb, 197 => '1.3', 200 => '1.3' },
+	'afpointselectionmethod' => { 59 => 0x50f, 60 => 0xc, 61 => 0xd, 64 => 0xd },
+	'afpointsinfocus' => { 54 => 0xe, 140 => 0x2, 228 => 0xb, 247 => [0xf,0x3c] },
+	'afpointsinfocus5d' => { 15 => 0x38 },
+	'afpointspotmetering' => { 58 => 0xd },
+	'afpointsunknown1' => { 228 => 0x0 },
+	'afpointsunknown2' => { 228 => 0x2 },
+	'afpointsused' => { 141 => 0x8 },
+	'afpredictor' => { 228 => 0x4 },
+	'afresponse' => { 160 => 0xad },
+	'afresult' => { 209 => 0x1038 },
+	'afsearch' => { 204 => 0x303 },
+	'afwithshutter' => { 271 => 0x2a },
+	'aggregationtype' => { 301 => 'aggregationType' },
+	'agreement' => { 303 => 'agreement' },
+	'aiservocontinuousshooting' => { 58 => 0x15 },
+	'aiservoimagepriority' => { 59 => 0x503 },
+	'aiservotrackingmethod' => { 59 => 0x504 },
+	'aiservotrackingsensitivity' => { 58 => 0x14, 59 => 0x502 },
+	'album' => { 310 => 'album' },
+	'alreadyapplied' => { 288 => 'AlreadyApplied' },
+	'alternatetitle' => { 301 => 'alternateTitle' },
+	'alttapename' => { 310 => 'altTapeName' },
+	'alttimecode' => { 310 => 'altTimecode' },
+	'alttimecodetimeformat' => { 310 => [\'altTimecode','altTimecodeTimeFormat'] },
+	'alttimecodetimevalue' => { 310 => [\'altTimecode','altTimecodeTimeValue'] },
+	'alttimecodevalue' => { 310 => [\'altTimecode','altTimecodeValue'] },
+	'ambienceselection' => { 2 => 0x1 },
+	'ambienttemperature' => { 259 => 0x14 },
+	'ambienttemperaturefahrenheit' => { 259 => 0x13 },
+	'analogbalance' => { 85 => 0xc627 },
+	'angleadj' => { 78 => 0x8b },
+	'anti-blur' => { 276 => 0xb04b },
+	'antialiasstrength' => { 85 => 0xc632 },
+	'aperturerange' => { 59 => 0x10d },
+	'apertureringuse' => { 232 => '1.4' },
+	'aperturevalue' => { 68 => 0x2, 85 => 0x9202, 209 => 0x1002, 292 => 'ApertureValue' },
+	'applekeywords' => { 213 => 'AAPL:Keywords' },
+	'applicationnotes' => { 85 => 0x2bc, 226 => 0x2bc },
+	'applicationrecordversion' => { 92 => 0x0 },
+	'applyshootingmeteringmode' => { 59 => 0x10e },
+	'approximatefnumber' => { 219 => 0x313, 225 => 0x3406 },
+	'approximatefocusdistance' => { 285 => 'ApproximateFocusDistance' },
+	'armidentifier' => { 93 => 0x78 },
+	'armversion' => { 93 => 0x7a },
+	'artfilter' => { 204 => 0x529 },
+	'artist' => { 85 => 0x13b, 215 => 'Artist', 247 => 0x22e, 306 => 'Artist', 310 => 'artist' },
+	'artworkcopyrightnotice' => { 294 => [\'ArtworkOrObject','ArtworkOrObjectAOCopyrightNotice'] },
+	'artworkcreator' => { 294 => [\'ArtworkOrObject','ArtworkOrObjectAOCreator'] },
+	'artworkdatecreated' => { 294 => [\'ArtworkOrObject','ArtworkOrObjectAODateCreated'] },
+	'artworkorobject' => { 294 => 'ArtworkOrObject' },
+	'artworksource' => { 294 => [\'ArtworkOrObject','ArtworkOrObjectAOSource'] },
+	'artworksourceinventoryno' => { 294 => [\'ArtworkOrObject','ArtworkOrObjectAOSourceInvNo'] },
+	'artworktitle' => { 294 => [\'ArtworkOrObject','ArtworkOrObjectAOTitle'] },
+	'aspectframe' => { 208 => 0x1113 },
+	'aspectratio' => { 3 => 0x0, 208 => 0x1112, 271 => 0x55 },
+	'asshoticcprofile' => { 85 => 0xc68f },
+	'asshotneutral' => { 85 => 0xc628 },
+	'asshotpreprofilematrix' => { 85 => 0xc690 },
+	'asshotprofilename' => { 85 => 0xc6f6 },
+	'asshotwhitexy' => { 85 => 0xc629 },
+	'assignbktbutton' => { 197 => '4.2' },
+	'assignfuncbutton' => { 59 => 0x70b },
+	'assistbuttonfunction' => { 57 => 0xd },
+	'attributionname' => { 286 => 'attributionName' },
+	'attributionurl' => { 286 => 'attributionURL' },
+	'audio' => { 224 => 0x20 },
+	'audiobitrate' => { 46 => 0x6c },
+	'audiochannels' => { 46 => 0x70 },
+	'audiochanneltype' => { 310 => 'audioChannelType' },
+	'audiocompression' => { 112 => 'Compression' },
+	'audiocompressor' => { 310 => 'audioCompressor' },
+	'audioduration' => { 92 => 0x99 },
+	'audiomoddate' => { 310 => 'audioModDate' },
+	'audiooutcue' => { 92 => 0x9a },
+	'audiosamplerate' => { 46 => 0x6e, 310 => 'audioSampleRate' },
+	'audiosampletype' => { 310 => 'audioSampleType' },
+	'audiosamplingrate' => { 92 => 0x97 },
+	'audiosamplingresolution' => { 92 => 0x98 },
+	'audiotype' => { 92 => 0x96 },
+	'author' => { 114 => 'Author', 213 => 'Author', 215 => 'Author', 258 => 'Author', 284 => 'author', 298 => 'Author' },
+	'authorsposition' => { 299 => 'AuthorsPosition' },
+	'autoaperture' => { 241 => '0.1' },
+	'autobracket' => { 270 => 0x19 },
+	'autobracketing' => { 89 => 0x1100, 247 => 0x18 },
+	'autobracketmodem' => { 197 => '21.2', 200 => '26.2' },
+	'autobracketorder' => { 134 => 0x43, 197 => '21.3', 200 => '26.3', 201 => '12.2', 202 => '2.2', 203 => '13.2' },
+	'autobracketset' => { 197 => '21.1', 199 => '11.1', 200 => '26.1', 201 => '12.1', 202 => '2.1', 203 => '13.1' },
+	'autobrightness' => { 288 => 'AutoBrightness' },
+	'autocontrast' => { 288 => 'AutoContrast' },
+	'autodistortioncontrol' => { 149 => 0x4 },
+	'autodynamicrange' => { 89 => 0x140b },
+	'autoexposure' => { 288 => 'AutoExposure' },
+	'autoexposurebracketing' => { 54 => 0x10 },
+	'autofocus' => { 207 => 0x209 },
+	'autofp' => { 202 => '7.3', 203 => '31.4' },
+	'autoiso' => { 54 => 0x1, 82 => 0x3008, 198 => '1.1', 202 => '1.1' },
+	'autoisomax' => { 198 => '1.2', 202 => '1.2' },
+	'autoisominshutterspeed' => { 198 => '1.3', 202 => '1.3' },
+	'autolightingoptimizer' => { 12 => 0xbe, 13 => 0xbf, 16 => 0xbf, 42 => 0x2, 59 => 0x204, 78 => 0x6f },
+	'autolightingoptimizeron' => { 78 => 0x6e },
+	'autoredeye' => { 190 => 0xfe28a44f },
+	'autorotate' => { 54 => 0x1b },
+	'autoshadows' => { 288 => 'AutoShadows' },
+	'auxiliarylens' => { 160 => 0x82 },
+	'avaperturesetting' => { 232 => 0x13 },
+	'avsettingwithoutlens' => { 59 => 0x707 },
+	'azimuth' => { 122 => 'Azimuth' },
+	'babyage' => { 224 => [0x8010,0x33] },
+	'babyname' => { 224 => 0x66 },
+	'backgroundalpha' => { 305 => 'bgalpha' },
+	'baseexposurecompensation' => { 232 => 0x15 },
+	'baseiso' => { 54 => 0x2, 72 => 0x101c, 225 => 0x312a },
+	'baselineexposure' => { 85 => 0xc62a },
+	'baselinenoise' => { 85 => 0xc62b },
+	'baselinesharpness' => { 85 => 0xc62c },
+	'baseurl' => { 308 => 'BaseURL' },
+	'batterylevel' => { 134 => 0x60 },
+	'batteryorder' => { 197 => '12.5', 200 => '13.2', 201 => '2.1' },
+	'batteryvoltage' => { 259 => 0x2a },
+	'bayergreensplit' => { 85 => 0xc62d },
+	'bayerpattern' => { 96 => 0xf902, 137 => 0x17 },
+	'beatspliceparams' => { 310 => 'beatSpliceParams' },
+	'beatspliceparamsriseindecibel' => { 310 => [\'beatSpliceParams','beatSpliceParamsRiseInDecibel'] },
+	'beatspliceparamsriseintimeduration' => { 310 => [\'beatSpliceParams','beatSpliceParamsRiseInTimeDuration'] },
+	'beatspliceparamsriseintimedurationscale' => { 310 => [\'beatSpliceParams','beatSpliceParamsRiseInTimeDurationScale'] },
+	'beatspliceparamsriseintimedurationvalue' => { 310 => [\'beatSpliceParams','beatSpliceParamsRiseInTimeDurationValue'] },
+	'beatspliceparamsusefilebeatsmarker' => { 310 => [\'beatSpliceParams','beatSpliceParamsUseFileBeatsMarker'] },
+	'beep' => { 197 => '13.1', 198 => '0.1', 199 => '2.1', 200 => '10.1', 202 => '0.1', 203 => '4.1' },
+	'beeppitch' => { 201 => '3.1' },
+	'beepvolume' => { 201 => '4.5' },
+	'bestqualityscale' => { 85 => 0xc65c },
+	'bestshotmode' => { 82 => 0x3007 },
+	'bitdepth' => { 119 => 'BitDepth', 137 => 0x11, 165 => 0x41 },
+	'bitspercomponent' => { 94 => 0x87 },
+	'bitspersample' => { 85 => 0x102, 306 => 'BitsPerSample' },
+	'blacklevel' => { 85 => 0xc61a, 209 => 0x1012 },
+	'blacklevel2' => { 208 => 0x600, 212 => 0x600 },
+	'blacklevelrepeatdim' => { 85 => 0xc619 },
+	'blackpoint' => { 247 => 0x200 },
+	'bleachbypasstoning' => { 247 => 0x7f },
+	'bluebalance' => { 148 => 0x271, 209 => 0x1018, 226 => 0x12, 247 => 0x1b },
+	'bluecurvelimits' => { 77 => 0x1fe },
+	'bluecurvepoints' => { 77 => 0x1d4 },
+	'bluehue' => { 288 => 'BlueHue' },
+	'bluesaturation' => { 288 => 'BlueSaturation' },
+	'blurwarning' => { 89 => 0x1300 },
+	'bodybatteryadload' => { 230 => 0x3 },
+	'bodybatteryadnoload' => { 230 => 0x2 },
+	'bodybatterystate' => { 230 => '1.1' },
+	'bodybatteryvoltage1' => { 230 => 0x2 },
+	'bodybatteryvoltage2' => { 230 => 0x4 },
+	'bodybatteryvoltage3' => { 230 => 0x6 },
+	'bodybatteryvoltage4' => { 230 => 0x8 },
+	'bodyfirmware' => { 264 => 0x0 },
+	'bodyfirmwareversion' => { 205 => 0x104, 206 => 0x100, 209 => 0x104 },
+	'bodyserialnumber' => { 264 => 0x10 },
+	'bracketmode' => { 38 => 0x3 },
+	'bracketsequence' => { 82 => 0x301d },
+	'bracketshotnumber' => { 38 => 0x5, 232 => 0x9 },
+	'bracketstep' => { 131 => 0xe },
+	'bracketvalue' => { 38 => 0x4 },
+	'brightness' => { 85 => 0xfe53, 113 => 'Brightness', 131 => 0x2c, 162 => 0x34, 259 => 0x25, 271 => 0x22, 276 => 0x2007, 288 => 'Brightness' },
+	'brightnessadj' => { 77 => 0x114, 183 => 0x0, 193 => 0x2d, 279 => 0x8018 },
+	'brightnessvalue' => { 85 => 0x9203, 209 => 0x1003, 292 => 'BrightnessValue' },
+	'bulbduration' => { 54 => 0x18 },
+	'burstmode' => { 99 => 0xa, 224 => 0x2a },
+	'burstmode2' => { 99 => 0x18 },
+	'burstshot' => { 270 => 0x34 },
+	'buttonfunctioncontroloff' => { 59 => 0x70a },
+	'bwfilter' => { 131 => 0x2a, 138 => 0x39 },
+	'bwmode' => { 209 => 0x203 },
+	'by-line' => { 92 => 0x50 },
+	'by-linetitle' => { 92 => 0x55 },
+	'bytecount' => { 301 => 'byteCount' },
+	'calibration' => { 270 => 0x24 },
+	'calibrationilluminant1' => { 85 => 0xc65a },
+	'calibrationilluminant2' => { 85 => 0xc65b },
+	'cameraangle' => { 310 => 'cameraAngle' },
+	'cameracalibration1' => { 85 => 0xc623 },
+	'cameracalibration2' => { 85 => 0xc624 },
+	'cameracalibrationsig' => { 85 => 0xc6f3 },
+	'cameracolorcalibration01' => { 26 => 0x0, 32 => 0xba },
+	'cameracolorcalibration02' => { 26 => 0x4, 32 => 0xbf },
+	'cameracolorcalibration03' => { 26 => 0x8, 32 => 0xc4 },
+	'cameracolorcalibration04' => { 26 => 0xc, 32 => 0xc9 },
+	'cameracolorcalibration05' => { 26 => 0x10, 32 => 0xce },
+	'cameracolorcalibration06' => { 26 => 0x14, 32 => 0xd3 },
+	'cameracolorcalibration07' => { 26 => 0x18, 32 => 0xd8 },
+	'cameracolorcalibration08' => { 26 => 0x1c, 32 => 0xdd },
+	'cameracolorcalibration09' => { 26 => 0x20, 32 => 0xe2 },
+	'cameracolorcalibration10' => { 26 => 0x24, 32 => 0xe7 },
+	'cameracolorcalibration11' => { 26 => 0x28, 32 => 0xec },
+	'cameracolorcalibration12' => { 26 => 0x2c, 32 => 0xf1 },
+	'cameracolorcalibration13' => { 26 => 0x30, 32 => 0xf6 },
+	'cameracolorcalibration14' => { 26 => 0x34, 32 => 0xfb },
+	'cameracolorcalibration15' => { 26 => 0x38, 32 => 0x100 },
+	'cameraid' => { 209 => 0x209, 269 => 0x209 },
+	'cameraiso' => { 24 => 0x10 },
+	'cameralabel' => { 310 => 'cameraLabel' },
+	'cameramodel' => { 310 => 'cameraModel' },
+	'cameramove' => { 310 => 'cameraMove' },
+	'cameraorientation' => { 4 => 0x30, 7 => 0x30, 9 => 0x35, 10 => 0x30, 11 => 0x30, 12 => 0x31, 13 => 0x31, 14 => 0x35, 15 => 0x27, 16 => 0x31, 18 => 0x36, 20 => 0x11, 249 => 0x1 },
+	'cameraowner' => { 100 => 0xc353 },
+	'cameraparameters' => { 209 => 0x2050 },
+	'cameraprofile' => { 288 => 'CameraProfile' },
+	'cameraprofiledigest' => { 288 => 'CameraProfileDigest' },
+	'cameraserialnumber' => { 85 => 0xc62f, 130 => 'CameraSerialNumber' },
+	'camerasettingsversion' => { 204 => 0x0 },
+	'cameratemperature' => { 4 => 0x18, 7 => 0x18, 9 => 0x19, 10 => 0x18, 11 => 0x18, 12 => 0x19, 13 => 0x19, 14 => 0x19, 15 => 0x17, 16 => 0x19, 18 => 0x19, 19 => 0x19, 21 => [0x87,0x91], 22 => [0x99,0x9f,0xa4,0xa8,0x105], 23 => [0x64,0x1d2,0x1f7,0x1fa,0x47,0x53,0x5b,0x5c], 54 => 0xc, 219 => 0x320, 225 => 0x3402, 247 => 0x47, 267 => 0x43 },
+	'cameratemperature2' => { 250 => 0xc },
+	'cameratemperature3' => { 250 => 0xe },
+	'cameratemperature4' => { 250 => 0x14 },
+	'cameratemperature5' => { 250 => 0x16 },
+	'cameratype' => { 54 => 0x1a, 209 => 0x207 },
+	'cameratype2' => { 205 => 0x100 },
+	'canonexposuremode' => { 24 => 0x14 },
+	'canonfiledescription' => { 72 => 0x805 },
+	'canonfilelength' => { 43 => 0xe },
+	'canonfirmwareversion' => { 43 => 0x7, 72 => 0x80b },
+	'canonflashinfo' => { 72 => 0x1028 },
+	'canonflashmode' => { 24 => 0x4 },
+	'canonimagesize' => { 6 => 0x39, 24 => 0xa },
+	'canonimagetype' => { 43 => 0x6, 72 => 0x815 },
+	'canonmodelid' => { 43 => 0x10, 72 => 0x1834 },
+	'canonvrd' => { 86 => 'CanonVRD' },
+	'caption' => { 284 => 'caption' },
+	'caption-abstract' => { 92 => 0x78 },
+	'captionsauthornames' => { 291 => 'CaptionsAuthorNames' },
+	'captionsdatetimestamps' => { 291 => 'CaptionsDateTimeStamps' },
+	'captionwriter' => { 299 => 'CaptionWriter' },
+	'captureframerate' => { 82 => 0x4001 },
+	'cardshutterlock' => { 134 => 0x49 },
+	'casioimagesize' => { 82 => 0x9 },
+	'catalogsets' => { 92 => 0xff, 283 => 'CatalogSets' },
+	'categories' => { 43 => 0x23, 284 => 'categories' },
+	'category' => { 92 => 0xf, 299 => 'Category' },
+	'ccdboardversion' => { 219 => 0x331 },
+	'ccdscanmode' => { 209 => 0x1039 },
+	'ccdsensitivity' => { 180 => 0x6 },
+	'ccdversion' => { 219 => 0x330 },
+	'cellglobalid' => { 287 => 'cgi' },
+	'celllength' => { 85 => 0x109 },
+	'cellr' => { 287 => 'r' },
+	'celltowerid' => { 287 => 'cellid' },
+	'cellwidth' => { 85 => 0x108 },
+	'centerafarea' => { 202 => '15.1' },
+	'centerfocuspoint' => { 203 => '2.2' },
+	'centerweightedareasize' => { 197 => '7.1', 200 => '5.1', 201 => '7.1', 202 => '6.3', 203 => '8.1' },
+	'certificate' => { 314 => 'Certificate' },
+	'cfapattern' => { 85 => 0xa302, 292 => 'CFAPattern' },
+	'cfapatterncolumns' => { 292 => [\'CFAPattern','CFAPatternColumns'] },
+	'cfapatternrows' => { 292 => [\'CFAPattern','CFAPatternRows'] },
+	'cfapatternvalues' => { 292 => [\'CFAPattern','CFAPatternValues'] },
+	'channel' => { 301 => 'channel' },
+	'channels' => { 112 => 'Channels' },
+	'checkmark' => { 77 => 0x26a },
+	'checkmark2' => { 78 => 0x8e },
+	'childfontfiles' => { 315 => [\'Fonts','FontsChildFontFiles'] },
+	'chmodeshootingspeed' => { 197 => '10.3' },
+	'chromablurradius' => { 85 => 0xc631 },
+	'chromaticaberration' => { 78 => 0x66 },
+	'chromaticaberrationb' => { 288 => 'ChromaticAberrationB' },
+	'chromaticaberrationblue' => { 78 => 0x6b },
+	'chromaticaberrationcorrection' => { 240 => 0x1 },
+	'chromaticaberrationon' => { 78 => 0x62 },
+	'chromaticaberrationr' => { 288 => 'ChromaticAberrationR' },
+	'chromaticaberrationred' => { 78 => 0x6a },
+	'chrominancenoisereduction' => { 78 => 0x5e, 270 => 0x1a },
+	'chrominancenr_tiff_jpeg' => { 78 => 0x60 },
+	'city' => { 92 => 0x5a, 118 => 'City', 224 => 0x6d, 299 => 'City' },
+	'clarity' => { 288 => 'Clarity' },
+	'classifystate' => { 92 => 0xe1 },
+	'client' => { 310 => 'client' },
+	'clmodeshootingspeed' => { 197 => '10.2', 200 => '11.2', 201 => '10.2', 203 => '11.1' },
+	'cmcontrast' => { 212 => 0x2022 },
+	'cmexposurecompensation' => { 212 => 0x2000 },
+	'cmhue' => { 212 => 0x2021 },
+	'cmsaturation' => { 212 => 0x2020 },
+	'cmsharpness' => { 212 => 0x2023 },
+	'cmwhitebalance' => { 212 => 0x2001 },
+	'cmwhitebalancecomp' => { 212 => 0x2002 },
+	'cmwhitebalancegraypoint' => { 212 => 0x2010 },
+	'codec' => { 126 => 'Codec' },
+	'codedcharacterset' => { 93 => 0x5a },
+	'collectionname' => { 295 => [\'Collections','CollectionsCollectionName'] },
+	'collections' => { 295 => 'Collections' },
+	'collectionuri' => { 295 => [\'Collections','CollectionsCollectionURI'] },
+	'coloraberrationcontrol' => { 190 => 0xc89224b },
+	'coloradjustment' => { 270 => 0x14 },
+	'coloradjustmentmode' => { 269 => 0x210 },
+	'coloranta' => { 315 => [\'Colorants','ColorantsA'] },
+	'colorantb' => { 315 => [\'Colorants','ColorantsB'] },
+	'colorantblack' => { 315 => [\'Colorants','ColorantsBlack'] },
+	'colorantblue' => { 315 => [\'Colorants','ColorantsBlue'] },
+	'colorantcyan' => { 315 => [\'Colorants','ColorantsCyan'] },
+	'colorantgreen' => { 315 => [\'Colorants','ColorantsGreen'] },
+	'colorantl' => { 315 => [\'Colorants','ColorantsL'] },
+	'colorantmagenta' => { 315 => [\'Colorants','ColorantsMagenta'] },
+	'colorantmode' => { 315 => [\'Colorants','ColorantsMode'] },
+	'colorantred' => { 315 => [\'Colorants','ColorantsRed'] },
+	'colorants' => { 315 => 'Colorants' },
+	'colorantswatchname' => { 315 => [\'Colorants','ColorantsSwatchName'] },
+	'coloranttype' => { 315 => [\'Colorants','ColorantsType'] },
+	'colorantyellow' => { 315 => [\'Colorants','ColorantsYellow'] },
+	'colorbalance' => { 113 => 'ColorBalance' },
+	'colorbalanceadj' => { 190 => 0x76a43202 },
+	'colorbalanceblue' => { 131 => 0x1e },
+	'colorbalancegreen' => { 131 => 0x1d },
+	'colorbalancered' => { 131 => 0x1c },
+	'colorblur' => { 78 => 0x65 },
+	'colorbooster' => { 190 => 0x5f0e7d23 },
+	'colorboostlevel' => { 184 => 0x1 },
+	'colorboosttype' => { 184 => 0x0 },
+	'colorclass' => { 253 => 0xde },
+	'colorcompensationfilter' => { 134 => [0x3a,0x5f], 135 => 0x111, 276 => 0xb022 },
+	'colorcontrol' => { 209 => 0x102b },
+	'colorcorrection' => { 279 => 0x8015 },
+	'colordataversion' => { 30 => 0x0, 31 => 0x0, 33 => 0x0 },
+	'coloreffect' => { 224 => 0x28 },
+	'colorfilter' => { 81 => 0x17, 82 => 0x3017, 131 => 0x29, 138 => [0x38,0x4d,0x4f], 252 => 0x17 },
+	'colorgain' => { 165 => 0x51 },
+	'colorhue' => { 160 => 0x8d },
+	'colorimetricreference' => { 85 => 0xc6bf },
+	'colormatrix' => { 208 => 0x200, 209 => 0x1011, 267 => 0xa030 },
+	'colormatrix1' => { 85 => 0xc621 },
+	'colormatrix2' => { 85 => 0xc622, 212 => 0x200 },
+	'colormatrixa' => { 247 => 0x203 },
+	'colormatrixadobergb' => { 267 => 0xa032 },
+	'colormatrixb' => { 247 => 0x204 },
+	'colormatrixnumber' => { 209 => 0x1019 },
+	'colormatrixsrgb' => { 267 => 0xa031 },
+	'colormode' => { 82 => 0x3015, 89 => 0x1210, 99 => 0x66, 131 => 0x28, 134 => 0x16, 135 => 0x101, 138 => 0x7, 160 => 0x3, 180 => 0x4, 224 => 0x32, 270 => 0x2c, 276 => 0xb029, 299 => 'ColorMode' },
+	'colormoirereduction' => { 191 => 0x15 },
+	'colormoirereductionmode' => { 191 => 0x5 },
+	'colornoisereduction' => { 279 => 0x8029, 288 => 'ColorNoiseReduction' },
+	'colornoisereductiondetail' => { 288 => 'ColorNoiseReductionDetail' },
+	'colornoisereductionintensity' => { 191 => 0x18 },
+	'colornoisereductionsharpness' => { 191 => 0x1c },
+	'colorplanes' => { 88 => 0x2 },
+	'colorprofile' => { 131 => 0x33 },
+	'colorrepresentation' => { 94 => 0x3c },
+	'colorreproduction' => { 276 => 0xb020 },
+	'colorsequence' => { 94 => 0x41 },
+	'colorspace' => { 34 => 0x3, 43 => 0xb4, 72 => 0x10b4, 85 => 0xa001, 119 => 'ColorSpace', 132 => 0x2f, 133 => 0x25, 134 => 0x17, 160 => 0x1e, 204 => 0x507, 247 => 0x37, 267 => 0xa011, 270 => 0xb, 292 => 'ColorSpace' },
+	'colortempasshot' => { 27 => 0x4, 28 => 0x1d, 29 => 0x26, 30 => 0x43, 33 => 0x43 },
+	'colortempauto' => { 27 => 0x9, 28 => 0x22, 29 => 0x1c, 30 => 0x48, 33 => 0x48 },
+	'colortempcloudy' => { 27 => 0x22, 28 => 0x31, 29 => 0x35, 30 => 0x5c, 33 => 0x75 },
+	'colortempcustom' => { 30 => 0x84 },
+	'colortempcustom1' => { 28 => 0x45 },
+	'colortempcustom2' => { 28 => 0x4a },
+	'colortempdaylight' => { 27 => 0x18, 28 => 0x27, 29 => 0x2b, 30 => 0x52, 33 => 0x6b },
+	'colortemperature' => { 4 => 0x73, 5 => [0x48,0x4e], 6 => 0x37, 7 => 0x62, 8 => 0x37, 9 => [0x7b,0x7c], 10 => 0x73, 11 => 0x73, 12 => 0x77, 13 => 0x73, 14 => 0x7c, 15 => 0x58, 16 => 0x73, 18 => 0x7d, 20 => 0x57, 43 => 0xae, 52 => 0x9, 72 => 0x10ae, 89 => 0x1005, 97 => 0x846, 113 => 'ColorTemperature', 132 => [0x6e,0x49], 133 => 0x3f, 134 => [0x39,0x5e], 135 => 0x10b, 138 => [0x3c,0x4c,0x4e], 219 => 0x321, 247 => 0x50, 276 => 0xb021, 288 => 'Temperature' },
+	'colortemperatureadj' => { 279 => 0x8013 },
+	'colortemperaturebg' => { 209 => 0x1013 },
+	'colortemperaturerg' => { 209 => 0x1014 },
+	'colortemperaturesetting' => { 134 => 0x25 },
+	'colortempflash' => { 27 => 0x36, 28 => 0x40, 29 => 0x49, 30 => 0x70, 33 => 0x89 },
+	'colortempflashdata' => { 30 => 0x24a },
+	'colortempfluorescent' => { 27 => 0x2c, 28 => 0x3b, 29 => 0x3f, 30 => 0x66, 33 => 0x7f },
+	'colortempkelvin' => { 27 => 0x31, 29 => 0x44, 30 => 0x6b, 33 => 0x84 },
+	'colortempmeasured' => { 27 => 0xe, 30 => 0x4d, 33 => 0x4d },
+	'colortemppc1' => { 29 => 0x94, 30 => 0x75 },
+	'colortemppc2' => { 29 => 0x99, 30 => 0x7a },
+	'colortemppc3' => { 29 => 0x9e, 30 => 0x7f },
+	'colortempshade' => { 27 => 0x1d, 28 => 0x2c, 29 => 0x30, 30 => 0x57, 33 => 0x70 },
+	'colortemptungsten' => { 27 => 0x27, 28 => 0x36, 29 => 0x3a, 30 => 0x61, 33 => 0x7a },
+	'colortempunknown' => { 27 => 0x13, 29 => 0x21, 33 => 0x52 },
+	'colortempunknown10' => { 27 => 0x63, 29 => 0x76, 33 => 0xa2 },
+	'colortempunknown11' => { 27 => 0x68, 29 => 0x7b, 33 => 0xa7 },
+	'colortempunknown12' => { 27 => 0x6d, 29 => 0x80, 33 => 0xac },
+	'colortempunknown13' => { 27 => 0x72, 29 => 0x85, 33 => 0xb1 },
+	'colortempunknown14' => { 29 => 0x8a, 33 => 0xb6 },
+	'colortempunknown15' => { 29 => 0x8f, 33 => 0xbb },
+	'colortempunknown16' => { 29 => 0xa3 },
+	'colortempunknown2' => { 27 => 0x3b, 29 => 0x4e, 33 => 0x57 },
+	'colortempunknown3' => { 27 => 0x40, 29 => 0x53, 33 => 0x5c },
+	'colortempunknown4' => { 27 => 0x45, 29 => 0x58, 33 => 0x61 },
+	'colortempunknown5' => { 27 => 0x4a, 29 => 0x5d, 33 => 0x66 },
+	'colortempunknown6' => { 27 => 0x4f, 29 => 0x62, 33 => 0x8e },
+	'colortempunknown7' => { 27 => 0x54, 29 => 0x67, 33 => 0x93 },
+	'colortempunknown8' => { 27 => 0x59, 29 => 0x6c, 33 => 0x98 },
+	'colortempunknown9' => { 27 => 0x5e, 29 => 0x71, 33 => 0x9d },
+	'colortone' => { 6 => 0x6f, 8 => 0x77, 24 => 0x2a, 34 => 0x2 },
+	'colortoneadj' => { 77 => 0x11e },
+	'colortonefaithful' => { 15 => 0x107, 48 => 0x6c, 49 => 0x6c },
+	'colortonelandscape' => { 15 => 0x105, 48 => 0x3c, 49 => 0x3c },
+	'colortonemonochrome' => { 48 => 0x84, 49 => 0x84 },
+	'colortoneneutral' => { 15 => 0x106, 48 => 0x54, 49 => 0x54 },
+	'colortoneportrait' => { 15 => 0x104, 48 => 0x24, 49 => 0x24 },
+	'colortonestandard' => { 15 => 0x103, 48 => 0xc, 49 => 0xc },
+	'colortoneunknown' => { 49 => 0x9c },
+	'colortoneuserdef1' => { 15 => 0x109, 48 => 0x9c, 49 => 0xb4 },
+	'colortoneuserdef2' => { 15 => 0x10a, 48 => 0xb4, 49 => 0xcc },
+	'colortoneuserdef3' => { 15 => 0x10b, 48 => 0xcc, 49 => 0xe4 },
+	'commanddials' => { 202 => '5.1' },
+	'commanddialsaperturesetting' => { 197 => '17.3', 200 => '33.3', 201 => '17.3' },
+	'commanddialschangemainsub' => { 197 => '17.2', 200 => '33.2', 201 => '17.2' },
+	'commanddialsmenuandplayback' => { 197 => '17.4', 200 => '33.4', 201 => '17.4' },
+	'commanddialsreverserotation' => { 197 => '17.1', 199 => '16.2', 200 => '33.1', 201 => '17.1', 203 => '18.1' },
+	'commanderchannel' => { 202 => '10.2' },
+	'commandergroupa_ttl-aacomp' => { 202 => '13.1' },
+	'commandergroupa_ttlcomp' => { 203 => '32.1' },
+	'commandergroupamanualoutput' => { 202 => '13.2' },
+	'commandergroupamode' => { 202 => '11.2' },
+	'commandergroupb_ttl-aacomp' => { 202 => '14.1' },
+	'commandergroupb_ttlcomp' => { 203 => '33.1' },
+	'commandergroupbmanualoutput' => { 202 => '14.2' },
+	'commandergroupbmode' => { 202 => '11.3' },
+	'commanderinternalflash' => { 202 => '11.1' },
+	'commanderinternalmanualoutput' => { 202 => '12.2' },
+	'commanderinternalttlchannel' => { 200 => '18.2' },
+	'commanderinternalttlcomp' => { 202 => '12.1', 203 => '31.2' },
+	'commanderinternalttlcompbuiltin' => { 200 => '20.1', 201 => '26.1' },
+	'commanderinternalttlcompgroupa' => { 200 => '21.1', 201 => '27.1' },
+	'commanderinternalttlcompgroupb' => { 200 => '22.1', 201 => '28.1' },
+	'comment' => { 0 => 0x2, 86 => 'Comment', 114 => 'Comment', 215 => 'Comment' },
+	'complianceprofile' => { 301 => 'complianceProfile' },
+	'componentsconfiguration' => { 85 => 0x9101, 119 => 'Components', 292 => 'ComponentsConfiguration' },
+	'componentversion' => { 72 => 0x80c },
+	'composer' => { 310 => 'composer' },
+	'compositionadjust' => { 246 => '0.1' },
+	'compositionadjustrotation' => { 246 => 0x7 },
+	'compositionadjustx' => { 246 => 0x5 },
+	'compositionadjusty' => { 246 => 0x6 },
+	'compressedbitsperpixel' => { 85 => 0x9102, 292 => 'CompressedBitsPerPixel' },
+	'compressedimagesize' => { 135 => 0x40, 209 => 0x40 },
+	'compression' => { 85 => 0x103, 306 => 'Compression' },
+	'compressionfactor' => { 204 => 0x50d },
+	'compressionratio' => { 119 => 'Compression', 209 => 0x1034 },
+	'constrainedcropheight' => { 77 => 0x266, 253 => 0xd6 },
+	'constrainedcropwidth' => { 77 => 0x262, 253 => 0xd5 },
+	'contact' => { 92 => 0x76 },
+	'contentlocationcode' => { 92 => 0x1a },
+	'contentlocationname' => { 92 => 0x1b },
+	'continuousbracketing' => { 134 => 0x20 },
+	'continuousdrive' => { 24 => 0x5 },
+	'continuousshootingspeed' => { 59 => 0x610 },
+	'continuousshotlimit' => { 59 => 0x611 },
+	'contrast' => { 6 => 0x73, 8 => 0x75, 24 => 0xd, 81 => 0xc, 82 => [0x3012,0x20], 85 => [0xa408,0xfe54], 89 => [0x1004,0x1006], 113 => 'Contrast', 131 => 0x20, 132 => 0x31, 133 => 0x27, 134 => 0x19, 138 => 0x2, 162 => 0x33, 209 => 0x1029, 224 => 0x39, 225 => 0x300a, 247 => 0x20, 252 => 0xc, 259 => 0x24, 270 => 0xd, 271 => 0x1d, 272 => 0x1a, 276 => 0x2004, 288 => 'Contrast', 292 => 'Contrast' },
+	'contrastadj' => { 77 => 0x115, 193 => 0x2c, 279 => 0x8017 },
+	'contrastdetectaf' => { 141 => 0x4 },
+	'contrastdetectafarea' => { 247 => 0x231 },
+	'contrastdetectafinfocus' => { 141 => 0x1c },
+	'contrastfaithful' => { 15 => 0xec, 48 => 0x60, 49 => 0x60 },
+	'contrasthighlight' => { 247 => 0x6d },
+	'contrasthighlightshadowadj' => { 247 => 0x6f },
+	'contrastlandscape' => { 15 => 0xea, 48 => 0x30, 49 => 0x30 },
+	'contrastmode' => { 224 => 0x2c },
+	'contrastmonochrome' => { 15 => 0xed, 48 => 0x78, 49 => 0x78 },
+	'contrastneutral' => { 15 => 0xeb, 48 => 0x48, 49 => 0x48 },
+	'contrastportrait' => { 15 => 0xe9, 48 => 0x18, 49 => 0x18 },
+	'contrastsetting' => { 204 => 0x505, 212 => 0x1012 },
+	'contrastshadow' => { 247 => 0x6e },
+	'contraststandard' => { 15 => 0xe8, 48 => 0x0, 49 => 0x0 },
+	'contrastunknown' => { 49 => 0x90 },
+	'contrastuserdef1' => { 15 => 0xee, 48 => 0x90, 49 => 0xa8 },
+	'contrastuserdef2' => { 15 => 0xef, 48 => 0xa8, 49 => 0xc0 },
+	'contrastuserdef3' => { 15 => 0xf0, 48 => 0xc0, 49 => 0xd8 },
+	'contributedmedia' => { 310 => 'contributedMedia' },
+	'contributedmediaduration' => { 310 => [\'contributedMedia','contributedMediaDuration'] },
+	'contributedmediadurationscale' => { 310 => [\'contributedMedia','contributedMediaDurationScale'] },
+	'contributedmediadurationvalue' => { 310 => [\'contributedMedia','contributedMediaDurationValue'] },
+	'contributedmediamanaged' => { 310 => [\'contributedMedia','contributedMediaManaged'] },
+	'contributedmediapath' => { 310 => [\'contributedMedia','contributedMediaPath'] },
+	'contributedmediastarttime' => { 310 => [\'contributedMedia','contributedMediaStartTime'] },
+	'contributedmediastarttimescale' => { 310 => [\'contributedMedia','contributedMediaStartTimeScale'] },
+	'contributedmediastarttimevalue' => { 310 => [\'contributedMedia','contributedMediaStartTimeValue'] },
+	'contributedmediatrack' => { 310 => [\'contributedMedia','contributedMediaTrack'] },
+	'contributedmediawebstatement' => { 310 => [\'contributedMedia','contributedMediaWebStatement'] },
+	'contributor' => { 289 => 'contributor' },
+	'contributors' => { 114 => 'Contributors' },
+	'controldialset' => { 134 => 0x46 },
+	'controlledvocabularyterm' => { 294 => 'CVterm' },
+	'controllerboardversion' => { 219 => 0x332 },
+	'controlmode' => { 54 => 0x12 },
+	'conversionlens' => { 224 => 0x35 },
+	'converter' => { 85 => 0xfe4d, 180 => 0xb, 288 => 'Converter' },
+	'converttograyscale' => { 288 => 'ConvertToGrayscale' },
+	'copyright' => { 0 => 0x3, 85 => 0x8298, 114 => 'Copyright', 215 => 'Copyright', 247 => 0x22f, 258 => 'Copyright', 298 => 'Copyright', 301 => 'copyright', 303 => 'copyright', 306 => 'Copyright', 310 => 'copyright' },
+	'copyrightflag' => { 256 => 0x40a },
+	'copyrightnotice' => { 92 => 0x74 },
+	'copyrightowner' => { 300 => 'CopyrightOwner' },
+	'copyrightownerid' => { 300 => [\'CopyrightOwner','CopyrightOwnerCopyrightOwnerID'] },
+	'copyrightownerimageid' => { 300 => 'CopyrightOwnerImageID' },
+	'copyrightownername' => { 300 => [\'CopyrightOwner','CopyrightOwnerCopyrightOwnerName'] },
+	'copyrightregistrationnumber' => { 300 => 'CopyrightRegistrationNumber' },
+	'copyrightstatus' => { 300 => 'CopyrightStatus' },
+	'coringfilter' => { 208 => 0x310, 209 => 0x102d, 212 => 0x310 },
+	'coringvalues' => { 208 => 0x311, 212 => 0x311 },
+	'corporateentity' => { 301 => 'corporateEntity' },
+	'country' => { 118 => 'Country', 224 => 0x69, 299 => 'Country' },
+	'country-primarylocationcode' => { 92 => 0x64 },
+	'country-primarylocationname' => { 92 => 0x65 },
+	'countrycode' => { 254 => 'CountryCode', 293 => 'CountryCode' },
+	'coverage' => { 289 => 'coverage' },
+	'coverdate' => { 301 => 'coverDate' },
+	'coverdisplaydate' => { 301 => 'coverDisplayDate' },
+	'cpufirmwareversion' => { 247 => 0x28 },
+	'crc32' => { 290 => 'crc32' },
+	'createdate' => { 85 => 0x9004, 114 => 'CreateDate', 213 => 'CreationDate', 215 => 'create-date', 258 => 'CreationDate', 308 => 'CreateDate' },
+	'creationdate' => { 298 => 'CreationDate', 301 => 'creationDate' },
+	'creationtime' => { 215 => 'Creation Time' },
+	'creativestyle' => { 271 => 0x1a, 272 => 0x18 },
+	'creativestylewaschanged' => { 279 => 0x8001 },
+	'creator' => { 213 => 'Creator', 258 => 'Creator', 289 => 'creator', 298 => 'Creator' },
+	'creatoraddress' => { 293 => [\'CreatorContactInfo','CreatorContactInfoCiAdrExtadr'] },
+	'creatorcity' => { 293 => [\'CreatorContactInfo','CreatorContactInfoCiAdrCity'] },
+	'creatorcontactinfo' => { 293 => 'CreatorContactInfo' },
+	'creatorcountry' => { 293 => [\'CreatorContactInfo','CreatorContactInfoCiAdrCtry'] },
+	'creatorpostalcode' => { 293 => [\'CreatorContactInfo','CreatorContactInfoCiAdrPcode'] },
+	'creatorregion' => { 293 => [\'CreatorContactInfo','CreatorContactInfoCiAdrRegion'] },
+	'creatortool' => { 308 => 'CreatorTool' },
+	'creatorworkemail' => { 293 => [\'CreatorContactInfo','CreatorContactInfoCiEmailWork'] },
+	'creatorworktelephone' => { 293 => [\'CreatorContactInfo','CreatorContactInfoCiTelWork'] },
+	'creatorworkurl' => { 293 => [\'CreatorContactInfo','CreatorContactInfoCiUrlWork'] },
+	'credit' => { 92 => 0x6e, 299 => 'Credit' },
+	'creditline' => { 303 => 'creditLine' },
+	'creditlinereq' => { 313 => 'CreditLineReq' },
+	'creditlinerequired' => { 300 => 'CreditLineRequired' },
+	'cropactive' => { 77 => 0x244 },
+	'cropangle' => { 288 => 'CropAngle' },
+	'cropaspectratio' => { 77 => 0x260 },
+	'cropbottom' => { 88 => 0x9, 185 => 0x36, 253 => 0xdc, 288 => 'CropBottom' },
+	'cropbottommargin' => { 35 => 0x3 },
+	'cropconstraintowarp' => { 288 => 'CropConstrainToWarp' },
+	'cropheight' => { 77 => 0x24c, 208 => 0x615, 212 => 0x615, 288 => 'CropHeight' },
+	'crophispeed' => { 160 => 0x1b },
+	'cropleft' => { 77 => 0x246, 88 => 0x6, 185 => 0x1e, 208 => 0x612, 212 => 0x612, 253 => 0xd9, 288 => 'CropLeft' },
+	'cropleftmargin' => { 35 => 0x0 },
+	'cropoutputheight' => { 185 => 0xce },
+	'cropoutputheightinches' => { 185 => 0x96 },
+	'cropoutputpixels' => { 185 => 0xd6 },
+	'cropoutputresolution' => { 185 => 0xb6 },
+	'cropoutputscale' => { 185 => 0xbe },
+	'cropoutputwidth' => { 185 => 0xc6 },
+	'cropoutputwidthinches' => { 185 => 0x8e },
+	'croppedimageheight' => { 3 => 0x2 },
+	'croppedimagewidth' => { 3 => 0x1 },
+	'cropright' => { 88 => 0x8, 185 => 0x2e, 253 => 0xdb, 288 => 'CropRight' },
+	'croprightmargin' => { 35 => 0x1 },
+	'croprotation' => { 88 => 0xb },
+	'cropscaledresolution' => { 185 => 0x9e },
+	'cropsourceresolution' => { 185 => 0xae },
+	'croptop' => { 77 => 0x248, 88 => 0x7, 185 => 0x26, 208 => 0x613, 212 => 0x613, 253 => 0xda, 288 => 'CropTop' },
+	'croptopmargin' => { 35 => 0x2 },
+	'cropunit' => { 288 => 'CropUnit' },
+	'cropunits' => { 288 => 'CropUnits' },
+	'cropwidth' => { 77 => 0x24a, 208 => 0x614, 212 => 0x614, 288 => 'CropWidth' },
+	'crossprocess' => { 247 => 0x7b },
+	'crossprocessparams' => { 247 => 0x235 },
+	'currenticcprofile' => { 85 => 0xc691 },
+	'currentpreprofilematrix' => { 85 => 0xc692 },
+	'currentversion' => { 279 => 0xd000 },
+	'curves' => { 190 => 0x76a43201 },
+	'custom1' => { 300 => 'Custom1' },
+	'custom10' => { 300 => 'Custom10' },
+	'custom2' => { 300 => 'Custom2' },
+	'custom3' => { 300 => 'Custom3' },
+	'custom4' => { 300 => 'Custom4' },
+	'custom5' => { 300 => 'Custom5' },
+	'custom6' => { 300 => 'Custom6' },
+	'custom7' => { 300 => 'Custom7' },
+	'custom8' => { 300 => 'Custom8' },
+	'custom9' => { 300 => 'Custom9' },
+	'customcontrast' => { 78 => 0x4e },
+	'customcontrols' => { 59 => 0x70c },
+	'customlinear' => { 78 => 0x4f },
+	'customoutputhighlightpoint' => { 78 => 0x53 },
+	'customoutputshadowpoint' => { 78 => 0x54 },
+	'custompicturestylefilename' => { 43 => 0x4010 },
+	'customrawhighlight' => { 78 => 0x7c },
+	'customrawhighlightpoint' => { 78 => 0x51 },
+	'customrawshadow' => { 78 => 0x85 },
+	'customrawshadowpoint' => { 78 => 0x52 },
+	'customrendered' => { 85 => 0xa401, 292 => 'CustomRendered' },
+	'customsaturation' => { 204 => 0x503 },
+	'customsettingsalldefault' => { 197 => '0.2', 200 => '0.2' },
+	'customsettingsbank' => { 197 => '0.1', 200 => '0.1' },
+	'customsharpness' => { 78 => 0x50 },
+	'customwbbluelevel' => { 134 => 0x36 },
+	'customwberror' => { 134 => 0x37 },
+	'customwbgreenlevel' => { 134 => 0x35 },
+	'customwbredlevel' => { 134 => 0x34 },
+	'customwbsetting' => { 134 => 0x26 },
+	'd-lightinghq' => { 190 => 0x2175eb78 },
+	'd-lightinghqcolorboost' => { 186 => 0x2 },
+	'd-lightinghqhighlight' => { 186 => 0x1 },
+	'd-lightinghqselected' => { 190 => 0x6a6e36b6 },
+	'd-lightinghqshadow' => { 186 => 0x0 },
+	'd-lightinghs' => { 190 => 0xce5554aa },
+	'd-lightinghsadjustment' => { 187 => 0x0 },
+	'd-lightinghscolorboost' => { 187 => 0x1 },
+	'd-rangeoptimizerhighlight' => { 279 => 0x8024 },
+	'd-rangeoptimizermode' => { 279 => 0x8022 },
+	'd-rangeoptimizershadow' => { 279 => 0x802d },
+	'd-rangeoptimizervalue' => { 279 => 0x8023 },
+	'datacompressionmethod' => { 94 => 0x6e },
+	'dataimprint' => { 131 => 0x34 },
+	'date' => { 247 => 0x6, 289 => 'date' },
+	'dateacquired' => { 130 => 'DateAcquired' },
+	'datecreated' => { 92 => 0x37, 299 => 'DateCreated' },
+	'datedisplayformat' => { 182 => 0x3 },
+	'dateimprint' => { 199 => '4.2' },
+	'daterecieved' => { 301 => 'dateRecieved' },
+	'datesent' => { 93 => 0x46 },
+	'datestampmode' => { 43 => 0x1c },
+	'datetime' => { 284 => 'datetime', 306 => 'DateTime' },
+	'datetimedigitized' => { 292 => 'DateTimeDigitized' },
+	'datetimeoriginal' => { 75 => 0x0, 85 => 0x9003, 111 => 0x14, 114 => 'OriginalDate', 259 => 0xb, 292 => 'DateTimeOriginal' },
+	'datetimestamp' => { 99 => 0x64 },
+	'daylightsavings' => { 182 => 0x2 },
+	'declination' => { 122 => 'Declination' },
+	'decposition' => { 131 => 0x32 },
+	'defaultcroporigin' => { 85 => 0xc61f },
+	'defaultcropsize' => { 85 => 0xc620 },
+	'defaultscale' => { 85 => 0xc61e },
+	'defringe' => { 288 => 'Defringe' },
+	'deletedimagecount' => { 160 => 0xa6, 166 => 0x6e },
+	'derivedfrom' => { 311 => 'DerivedFrom' },
+	'derivedfromalternatepaths' => { 311 => [\'DerivedFrom','DerivedFromAlternatePaths'] },
+	'derivedfromdocumentid' => { 311 => [\'DerivedFrom','DerivedFromDocumentID'] },
+	'derivedfromfilepath' => { 311 => [\'DerivedFrom','DerivedFromFilePath'] },
+	'derivedfromfrompart' => { 311 => [\'DerivedFrom','DerivedFromFromPart'] },
+	'derivedfrominstanceid' => { 311 => [\'DerivedFrom','DerivedFromInstanceID'] },
+	'derivedfromlastmodifydate' => { 311 => [\'DerivedFrom','DerivedFromLastModifyDate'] },
+	'derivedfrommanager' => { 311 => [\'DerivedFrom','DerivedFromManager'] },
+	'derivedfrommanagervariant' => { 311 => [\'DerivedFrom','DerivedFromManagerVariant'] },
+	'derivedfrommanageto' => { 311 => [\'DerivedFrom','DerivedFromManageTo'] },
+	'derivedfrommanageui' => { 311 => [\'DerivedFrom','DerivedFromManageUI'] },
+	'derivedfrommaskmarkers' => { 311 => [\'DerivedFrom','DerivedFromMaskMarkers'] },
+	'derivedfromoriginaldocumentid' => { 311 => [\'DerivedFrom','DerivedFromOriginalDocumentID'] },
+	'derivedfrompartmapping' => { 311 => [\'DerivedFrom','DerivedFromPartMapping'] },
+	'derivedfromrenditionclass' => { 311 => [\'DerivedFrom','DerivedFromRenditionClass'] },
+	'derivedfromrenditionparams' => { 311 => [\'DerivedFrom','DerivedFromRenditionParams'] },
+	'derivedfromtopart' => { 311 => [\'DerivedFrom','DerivedFromToPart'] },
+	'derivedfromversionid' => { 311 => [\'DerivedFrom','DerivedFromVersionID'] },
+	'description' => { 215 => 'Description', 289 => 'description' },
+	'destination' => { 93 => 0x5 },
+	'destinationcity' => { 247 => 0x24, 251 => 0x3 },
+	'destinationcitycode' => { 252 => 0x1001 },
+	'destinationdst' => { 247 => 0x26, 251 => '0.3' },
+	'developmentdynamicrange' => { 89 => 0x1403 },
+	'devicesettingdescription' => { 292 => 'DeviceSettingDescription' },
+	'devicesettingdescriptioncolumns' => { 292 => [\'DeviceSettingDescription','DeviceSettingDescriptionColumns'] },
+	'devicesettingdescriptionrows' => { 292 => [\'DeviceSettingDescription','DeviceSettingDescriptionRows'] },
+	'devicesettingdescriptionsettings' => { 292 => [\'DeviceSettingDescription','DeviceSettingDescriptionSettings'] },
+	'dialdirectiontvav' => { 59 => 0x706 },
+	'digitalcreationdate' => { 92 => 0x3e },
+	'digitalcreationtime' => { 92 => 0x3f },
+	'digitaldeehighlightadj' => { 165 => 0x202 },
+	'digitaldeeshadowadj' => { 165 => 0x200 },
+	'digitaldeethreshold' => { 165 => 0x201 },
+	'digitalfilter01' => { 238 => 0x5 },
+	'digitalfilter02' => { 238 => 0x16 },
+	'digitalfilter03' => { 238 => 0x27 },
+	'digitalfilter04' => { 238 => 0x38 },
+	'digitalfilter05' => { 238 => 0x49 },
+	'digitalfilter06' => { 238 => 0x5a },
+	'digitalfilter07' => { 238 => 0x6b },
+	'digitalfilter08' => { 238 => 0x7c },
+	'digitalfilter09' => { 238 => 0x8d },
+	'digitalfilter10' => { 238 => 0x9e },
+	'digitalfilter11' => { 238 => 0xaf },
+	'digitalfilter12' => { 238 => 0xc0 },
+	'digitalfilter13' => { 238 => 0xd1 },
+	'digitalfilter14' => { 238 => 0xe2 },
+	'digitalfilter15' => { 238 => 0xf3 },
+	'digitalfilter16' => { 238 => 0x104 },
+	'digitalfilter17' => { 238 => 0x115 },
+	'digitalfilter18' => { 238 => 0x126 },
+	'digitalfilter19' => { 238 => 0x137 },
+	'digitalfilter20' => { 238 => 0x148 },
+	'digitalgain' => { 52 => 0xb },
+	'digitalgem' => { 155 => 0x0 },
+	'digitalice' => { 165 => 0x100 },
+	'digitalimageguid' => { 294 => 'DigImageGUID' },
+	'digitalroc' => { 164 => 0x0 },
+	'digitalsourcefiletype' => { 294 => 'DigitalSourcefileType' },
+	'digitalsourcetype' => { 294 => 'DigitalSourceType' },
+	'digitalzoom' => { 24 => 0xc, 81 => 0xa, 99 => 0x68, 113 => 'DigitalZoom', 131 => 0xc, 160 => 0x86, 180 => 0xa, 209 => 0x204, 247 => 0x1e, 252 => 0xa, 269 => 0x204 },
+	'digitalzoomon' => { 269 => 0x21b },
+	'digitalzoomratio' => { 85 => 0xa404, 292 => 'DigitalZoomRatio' },
+	'director' => { 310 => 'director' },
+	'directorphotography' => { 310 => 'directorPhotography' },
+	'directory' => { 86 => 'Directory' },
+	'directoryindex' => { 4 => 0x137, 7 => 0x17e, 9 => [0x233,0x238], 10 => 0x13f, 11 => 0x133, 12 => 0x1df, 13 => [0x1a3,0x1a7], 14 => 0x1f0, 17 => 0x49, 18 => 0x1e5, 20 => 0x1d3 },
+	'directorynumber' => { 151 => 0x6 },
+	'disclaimer' => { 215 => 'Disclaimer' },
+	'displayallafpoints' => { 59 => 0x514 },
+	'displayaperture' => { 24 => 0x23 },
+	'displayedunitsx' => { 257 => 0x2 },
+	'displayedunitsy' => { 257 => 0x6 },
+	'distance1' => { 99 => 0x28 },
+	'distance2' => { 99 => 0x2c },
+	'distance3' => { 99 => 0x30 },
+	'distance4' => { 99 => 0x34 },
+	'distortioncontrol' => { 166 => 0x10 },
+	'distortioncorrection' => { 78 => 0x67, 204 => 0x50b, 240 => 0x0 },
+	'distortioncorrection2' => { 208 => 0x1011 },
+	'distortioncorrectionon' => { 78 => 0x63 },
+	'distributor' => { 301 => 'distributor' },
+	'dmcomment' => { 310 => 'comment' },
+	'dngbackwardversion' => { 85 => 0xc613 },
+	'dnglensinfo' => { 85 => 0xc630 },
+	'dngversion' => { 85 => 0xc612 },
+	'document' => { 215 => 'Document' },
+	'documentancestorid' => { 299 => [\'DocumentAncestors','DocumentAncestorsAncestorID'] },
+	'documentancestors' => { 299 => 'DocumentAncestors' },
+	'documenthistory' => { 92 => 0xe7 },
+	'documentid' => { 311 => 'DocumentID' },
+	'documentname' => { 85 => 0x10d },
+	'documentnotes' => { 92 => 0xe6 },
+	'doi' => { 301 => 'doi' },
+	'dotrange' => { 85 => 0x150 },
+	'drivemode' => { 82 => 0x3103, 131 => 0x6, 134 => 0x1e, 204 => 0x600, 247 => 0x34, 270 => 0x3, 271 => 0x4 },
+	'drivemode2' => { 134 => 0xa, 232 => 0x7 },
+	'dspfirmwareversion' => { 247 => 0x27 },
+	'duration' => { 46 => 0x6a, 112 => 'Duration', 126 => 'Duration', 310 => 'duration' },
+	'durationscale' => { 310 => [\'duration','durationScale'] },
+	'durationvalue' => { 310 => [\'duration','durationValue'] },
+	'dustremovaldata' => { 43 => 0x97 },
+	'dynamicafarea' => { 197 => '1.4', 200 => '1.4' },
+	'dynamicrange' => { 89 => 0x1400 },
+	'dynamicrangeexpansion' => { 247 => 0x69 },
+	'dynamicrangemax' => { 77 => 0x7c },
+	'dynamicrangemin' => { 77 => 0x7a },
+	'dynamicrangeoptimizer' => { 134 => 0x15, 276 => [0xb025,0xb04f] },
+	'dynamicrangeoptimizerlevel' => { 271 => 0x19, 272 => 0x17 },
+	'dynamicrangeoptimizermode' => { 271 => 0x18, 272 => 0x16 },
+	'dynamicrangeoptimizersetting' => { 134 => 0x27 },
+	'dynamicrangesetting' => { 89 => 0x1402 },
+	'e-dialinprogram' => { 232 => '1.3' },
+	'easyexposurecomp' => { 203 => '6.1' },
+	'easyexposurecompensation' => { 197 => '6.4', 200 => '4.4', 201 => '5.2' },
+	'easymode' => { 24 => 0xb },
+	'edgenoisereduction' => { 191 => 0x4, 279 => 0x8028 },
+	'edition' => { 301 => 'edition' },
+	'editorialupdate' => { 92 => 0x8 },
+	'editstatus' => { 92 => 0x7, 254 => 'EditStatus' },
+	'editversionname' => { 190 => 0x3d136244 },
+	'effectivelv' => { 247 => 0x2d },
+	'effectivemaxaperture' => { 158 => 0x12, 159 => 0x13 },
+	'eissn' => { 301 => 'eIssn' },
+	'elevation' => { 122 => 'Elevation' },
+	'email' => { 114 => 'EMail' },
+	'embargodate' => { 301 => 'embargoDate', 303 => 'embargoDate' },
+	'encryptionkey' => { 267 => 0xa020 },
+	'endingpage' => { 301 => 'endingPage' },
+	'enduser' => { 300 => 'EndUser' },
+	'enduserid' => { 300 => [\'EndUser','EndUserEndUserID'] },
+	'endusername' => { 300 => [\'EndUser','EndUserEndUserName'] },
+	'engineer' => { 310 => 'engineer' },
+	'enhancedarktones' => { 183 => 0x8 },
+	'enhancement' => { 81 => 0x16, 82 => 0x3016 },
+	'enhancer' => { 208 => 0x300 },
+	'enhancervalues' => { 208 => 0x301 },
+	'envelopenumber' => { 93 => 0x28 },
+	'envelopepriority' => { 93 => 0x3c },
+	'enveloperecordversion' => { 93 => 0x0 },
+	'epsonimageheight' => { 209 => 0x20c },
+	'epsonimagewidth' => { 209 => 0x20b },
+	'epsonsoftware' => { 209 => 0x20d },
+	'equipmentinstitution' => { 281 => 'EquipmentInstitution' },
+	'equipmentmanufacturer' => { 281 => 'EquipmentManufacturer' },
+	'equipmentversion' => { 205 => 0x0 },
+	'ettlii' => { 59 => 0x304, 60 => 0xd, 61 => 0xe, 62 => 0x7, 63 => 0x7, 64 => 0xe },
+	'event' => { 283 => 'Event', 294 => 'Event', 301 => 'event' },
+	'eventnumber' => { 259 => 0x9 },
+	'evsteps' => { 232 => '1.2', 234 => 0x0 },
+	'evstepsize' => { 199 => '5.1', 202 => '0.7' },
+	'exclusivityenddate' => { 303 => 'exclusivityEndDate' },
+	'excursiontolerance' => { 94 => 0x82 },
+	'exif' => { 86 => 'EXIF' },
+	'exifbyteorder' => { 86 => 'ExifByteOrder' },
+	'exifcamerainfo' => { 92 => 0xe8 },
+	'exifimageheight' => { 85 => 0xa003, 292 => 'PixelYDimension' },
+	'exifimagewidth' => { 85 => 0xa002, 292 => 'PixelXDimension' },
+	'exifunicodebyteorder' => { 86 => 'ExifUnicodeByteOrder' },
+	'exifversion' => { 85 => 0x9000, 292 => 'ExifVersion' },
+	'exitpupilposition' => { 158 => 0x4, 159 => 0x4 },
+	'expirationdate' => { 92 => 0x25, 301 => 'expirationDate', 303 => 'expirationDate' },
+	'expirationtime' => { 92 => 0x26 },
+	'exposure' => { 85 => 0xfe51, 288 => 'Exposure' },
+	'exposureadj' => { 188 => 0x0 },
+	'exposureadj2' => { 188 => 0x12 },
+	'exposureadjust' => { 270 => 0xc },
+	'exposurebracketingindicatorlast' => { 134 => 0x52 },
+	'exposurebracketstepsize' => { 232 => 0x8 },
+	'exposurebracketvalue' => { 160 => 0x19 },
+	'exposurecompensation' => { 54 => 0x6, 68 => 0x0, 85 => 0x9204, 99 => 0x24, 113 => 'ExposureComp', 131 => 0xd, 132 => 0x53, 133 => 0x1e, 209 => 0x1006, 247 => 0x16, 267 => 0xa013, 270 => [0xc,0x35], 292 => 'ExposureBiasValue' },
+	'exposurecompensationmode' => { 134 => 0x47 },
+	'exposurecompensationsetting' => { 134 => 0x1 },
+	'exposurecompstepsize' => { 197 => '6.3', 200 => '4.3' },
+	'exposurecontrolstep' => { 201 => '6.1' },
+	'exposurecontrolstepsize' => { 197 => '6.2', 200 => '4.2', 203 => '7.1' },
+	'exposuredelaymode' => { 197 => '10.1', 199 => '9.1', 200 => '10.4', 201 => '10.1', 202 => '6.4', 203 => '11.2' },
+	'exposuredifference' => { 160 => 0xe },
+	'exposureindex' => { 85 => 0xa215, 292 => 'ExposureIndex' },
+	'exposureindicator' => { 134 => 0x50 },
+	'exposurelevelincrements' => { 57 => 0x6, 58 => 0x6, 59 => 0x101, 60 => 0x5, 61 => 0x6, 62 => 0x5, 63 => 0x5, 64 => 0x6, 65 => 0x4, 271 => 0x58 },
+	'exposuremode' => { 85 => 0xa402, 113 => 'ExposureMode', 131 => 0x1, 132 => 0xa, 133 => 0x0, 134 => 0x0, 204 => 0x200, 221 => 0x40d, 270 => 0x8, 276 => 0xb041, 292 => 'ExposureMode' },
+	'exposuremodeinmanual' => { 59 => 0x10b },
+	'exposureprogram' => { 85 => 0x8822, 271 => 0x3c, 272 => 0x3c, 292 => 'ExposureProgram' },
+	'exposureshift' => { 204 => 0x203 },
+	'exposuretime' => { 4 => 0x4, 5 => 0x4, 6 => 0x4, 7 => 0x4, 8 => 0x4, 9 => 0x4, 10 => 0x4, 11 => 0x4, 12 => 0x4, 13 => 0x4, 14 => 0x4, 15 => 0x4, 16 => 0x4, 18 => 0x4, 19 => 0x4, 21 => 0x6, 22 => 0x7, 54 => 0x16, 85 => 0x829a, 96 => 0xfd05, 99 => 0x20, 101 => 0xfa24, 103 => 0xf104, 106 => 0x12, 108 => 0x38, 111 => 0x10, 113 => 'ExposureTime', 131 => 0x9, 132 => 0x35, 133 => 0x48, 134 => 0x8, 247 => 0x12, 267 => 0xa018, 270 => 0x32, 292 => 'ExposureTime' },
+	'exposuretime2' => { 270 => 0x33 },
+	'exposuretuning' => { 160 => 0x1c },
+	'exposurevalue' => { 97 => 0x3 },
+	'exposurewarning' => { 89 => 0x1302 },
+	'exrauto' => { 89 => 0x1033 },
+	'exrmode' => { 89 => 0x1034 },
+	'extendedwbdetect' => { 204 => 0x902 },
+	'extender' => { 205 => 0x301 },
+	'extenderfirmwareversion' => { 205 => 0x304 },
+	'extendermagnification' => { 115 => 'Magnification' },
+	'extendermake' => { 115 => 'Make' },
+	'extendermodel' => { 115 => 'Model', 205 => 0x303 },
+	'extenderserialnumber' => { 115 => 'SerialNumber', 205 => 0x302 },
+	'externalflash' => { 207 => 0x1201 },
+	'externalflashae1' => { 209 => 0x101f },
+	'externalflashae1_0' => { 209 => 0x101b },
+	'externalflashae2' => { 209 => 0x1020 },
+	'externalflashae2_0' => { 209 => 0x101c },
+	'externalflashbounce' => { 207 => 0x1204, 209 => 0x1026, 239 => 0x1a },
+	'externalflashexposurecomp' => { 160 => 0x17, 239 => 0x19 },
+	'externalflashfirmware' => { 152 => 0x6, 153 => 0x6, 154 => 0x6 },
+	'externalflashflags' => { 152 => 0x8, 153 => 0x8, 154 => 0x8 },
+	'externalflashguidenumber' => { 207 => 0x1203, 239 => '24.1' },
+	'externalflashgvalue' => { 209 => 0x1025 },
+	'externalflashmode' => { 209 => 0x1028, 239 => 0x2 },
+	'externalflashzoom' => { 207 => 0x1205, 209 => 0x1027 },
+	'externalsensorbrightnessvalue' => { 219 => 0x311, 225 => 0x3408 },
+	'eyestartaf' => { 134 => 0x40 },
+	'face10position' => { 79 => 0x3f4, 80 => 0x1ec, 150 => 0x28, 236 => 0x12 },
+	'face10size' => { 237 => 0x12 },
+	'face11position' => { 150 => 0x2c, 236 => 0x14 },
+	'face11size' => { 237 => 0x14 },
+	'face12position' => { 150 => 0x30, 236 => 0x16 },
+	'face12size' => { 237 => 0x16 },
+	'face13position' => { 236 => 0x18 },
+	'face13size' => { 237 => 0x18 },
+	'face14position' => { 236 => 0x1a },
+	'face14size' => { 237 => 0x1a },
+	'face15position' => { 236 => 0x1c },
+	'face15size' => { 237 => 0x1c },
+	'face16position' => { 236 => 0x1e },
+	'face16size' => { 237 => 0x1e },
+	'face17position' => { 236 => 0x20 },
+	'face17size' => { 237 => 0x20 },
+	'face18position' => { 236 => 0x22 },
+	'face18size' => { 237 => 0x22 },
+	'face19position' => { 236 => 0x24 },
+	'face19size' => { 237 => 0x24 },
+	'face1position' => { 36 => 0x8, 79 => 0xd, 80 => 0x18, 150 => 0x4, 217 => 0x1, 236 => 0x0, 260 => 0xbc, 274 => 0x0, 275 => 0x0 },
+	'face1size' => { 237 => 0x0 },
+	'face20position' => { 236 => 0x26 },
+	'face20size' => { 237 => 0x26 },
+	'face21position' => { 236 => 0x28 },
+	'face21size' => { 237 => 0x28 },
+	'face22position' => { 236 => 0x2a },
+	'face22size' => { 237 => 0x2a },
+	'face23position' => { 236 => 0x2c },
+	'face23size' => { 237 => 0x2c },
+	'face24position' => { 236 => 0x2e },
+	'face24size' => { 237 => 0x2e },
+	'face25position' => { 236 => 0x30 },
+	'face25size' => { 237 => 0x30 },
+	'face26position' => { 236 => 0x32 },
+	'face26size' => { 237 => 0x32 },
+	'face27position' => { 236 => 0x34 },
+	'face27size' => { 237 => 0x34 },
+	'face28position' => { 236 => 0x36 },
+	'face28size' => { 237 => 0x36 },
+	'face29position' => { 236 => 0x38 },
+	'face29size' => { 237 => 0x38 },
+	'face2position' => { 36 => 0xa, 79 => 0x7c, 80 => 0x4c, 150 => 0x8, 217 => 0x5, 236 => 0x2, 260 => 0xc8, 274 => 0x20, 275 => 0x25 },
+	'face2size' => { 237 => 0x2 },
+	'face30position' => { 236 => 0x3a },
+	'face30size' => { 237 => 0x3a },
+	'face31position' => { 236 => 0x3c },
+	'face31size' => { 237 => 0x3c },
+	'face32position' => { 236 => 0x3e },
+	'face32size' => { 237 => 0x3e },
+	'face3position' => { 36 => 0xc, 79 => 0xeb, 80 => 0x80, 150 => 0xc, 217 => 0x9, 236 => 0x4, 260 => 0xd4, 274 => 0x40, 275 => 0x4a },
+	'face3size' => { 237 => 0x4 },
+	'face4position' => { 36 => 0xe, 79 => 0x15a, 80 => 0xb4, 150 => 0x10, 217 => 0xd, 236 => 0x6, 260 => 0xe0, 274 => 0x60, 275 => 0x6f },
+	'face4size' => { 237 => 0x6 },
+	'face5position' => { 36 => 0x10, 79 => 0x1c9, 80 => 0xe8, 150 => 0x14, 217 => 0x11, 236 => 0x8, 260 => 0xec, 274 => 0x80, 275 => 0x94 },
+	'face5size' => { 237 => 0x8 },
+	'face6position' => { 36 => 0x12, 79 => 0x238, 80 => 0x11c, 150 => 0x18, 236 => 0xa, 260 => 0xf8, 274 => 0xa0, 275 => 0xb9 },
+	'face6size' => { 237 => 0xa },
+	'face7position' => { 36 => 0x14, 79 => 0x2a7, 80 => 0x150, 150 => 0x1c, 236 => 0xc, 260 => 0x104, 274 => 0xc0, 275 => 0xde },
+	'face7size' => { 237 => 0xc },
+	'face8position' => { 36 => 0x16, 79 => 0x316, 80 => 0x184, 150 => 0x20, 236 => 0xe, 260 => 0x110, 274 => 0xe0, 275 => 0x103 },
+	'face8size' => { 237 => 0xe },
+	'face9position' => { 36 => 0x18, 79 => 0x385, 80 => 0x1b8, 150 => 0x24, 236 => 0x10 },
+	'face9size' => { 237 => 0x10 },
+	'facedetect' => { 247 => 0x76 },
+	'facedetectarea' => { 208 => 0x1201 },
+	'facedetectframecrop' => { 208 => 0x1207 },
+	'facedetectframesize' => { 36 => 0x3, 79 => 0x1, 80 => 0x4, 150 => 0x1, 208 => 0x1203, 247 => 0x77, 260 => 0xb6 },
+	'faceinfounknown' => { 82 => 0x2089 },
+	'faceorientation' => { 80 => 0x8 },
+	'faceposition' => { 235 => 0x2, 268 => 0x4 },
+	'facepositions' => { 89 => 0x4103 },
+	'facesdetected' => { 36 => 0x2, 37 => 0x2, 79 => 0x0, 80 => 0x2, 82 => 0x211c, 89 => 0x4100, 150 => 0x3, 208 => 0x1200, 224 => 0x3f, 235 => 0x0, 260 => 0xb5, 268 => 0x0, 278 => 0x30 },
+	'facesrecognized' => { 218 => 0x0 },
+	'facewidth' => { 37 => 0x1 },
+	'faithfuloutputhighlightpoint' => { 78 => 0x38 },
+	'faithfuloutputshadowpoint' => { 78 => 0x39 },
+	'faithfulrawcolortone' => { 78 => 0x31 },
+	'faithfulrawcontrast' => { 78 => 0x33 },
+	'faithfulrawhighlight' => { 78 => 0x79 },
+	'faithfulrawhighlightpoint' => { 78 => 0x36 },
+	'faithfulrawlinear' => { 78 => 0x34 },
+	'faithfulrawsaturation' => { 78 => 0x32 },
+	'faithfulrawshadow' => { 78 => 0x82 },
+	'faithfulrawshadowpoint' => { 78 => 0x37 },
+	'faithfulrawsharpness' => { 78 => 0x35 },
+	'femicroadjustment' => { 59 => 0x110 },
+	'ffid' => { 290 => 'ffid' },
+	'fieldcount' => { 209 => 0x103f },
+	'filedatarate' => { 310 => 'fileDataRate' },
+	'fileformat' => { 70 => 0x0, 93 => 0x14, 270 => 0x22, 276 => 0xb000 },
+	'fileindex' => { 4 => 0x143, 7 => 0x172, 9 => [0x227,0x22c], 10 => 0x133, 11 => 0x13f, 12 => 0x1d3, 13 => [0x197,0x19b], 14 => 0x1e4, 17 => 0x3d, 18 => 0x1d9, 20 => 0x1c7 },
+	'filemodifydate' => { 86 => 'FileModifyDate' },
+	'filename' => { 86 => 'FileName' },
+	'filenameasdelivered' => { 300 => 'FileNameAsDelivered' },
+	'filenumber' => { 38 => 0x1, 43 => 0x8, 72 => 0x1817, 83 => 'FileNumber', 151 => 0x8 },
+	'filenumbermemory' => { 131 => 0x1a },
+	'filenumbersequence' => { 197 => '12.2', 199 => '3.1', 200 => '11.1', 201 => '4.3', 203 => '5.2' },
+	'filesource' => { 85 => 0xa300, 89 => 0x8000, 292 => 'FileSource' },
+	'fileversion' => { 93 => 0x16 },
+	'fillflashautoreduction' => { 57 => 0xe, 58 => 0xe, 65 => 0xa },
+	'filllight' => { 288 => 'FillLight' },
+	'fillorder' => { 85 => 0x10a },
+	'filmmode' => { 89 => 0x1401, 221 => 0x412, 224 => 0x42 },
+	'filmtype' => { 165 => 0x2 },
+	'filtereffect' => { 38 => 0xe, 162 => 0x37 },
+	'filtereffectfaithful' => { 48 => 0x70, 49 => 0x70 },
+	'filtereffectlandscape' => { 48 => 0x40, 49 => 0x40 },
+	'filtereffectmonochrome' => { 15 => 0xff, 48 => 0x88, 49 => 0x88 },
+	'filtereffectneutral' => { 48 => 0x58, 49 => 0x58 },
+	'filtereffectportrait' => { 48 => 0x28, 49 => 0x28 },
+	'filtereffectstandard' => { 48 => 0x10, 49 => 0x10 },
+	'filtereffectunknown' => { 49 => 0xa0 },
+	'filtereffectuserdef1' => { 48 => 0xa0, 49 => 0xb8 },
+	'filtereffectuserdef2' => { 48 => 0xb8, 49 => 0xd0 },
+	'filtereffectuserdef3' => { 48 => 0xd0, 49 => 0xe8 },
+	'finderdisplayduringexposure' => { 58 => 0x1 },
+	'finesharpness' => { 247 => 0x70 },
+	'finetuneoptcenterweighted' => { 197 => '7.2', 203 => '9.1' },
+	'finetuneoptmatrixmetering' => { 197 => '8.1', 200 => '6.1', 203 => '8.2' },
+	'finetuneoptspotmetering' => { 197 => '8.2', 200 => '6.2', 203 => '9.2' },
+	'firmware' => { 209 => 0x405, 270 => [0x17,0x3b], 285 => 'Firmware' },
+	'firmwaredate' => { 81 => 0x15, 82 => 0x2001, 259 => 0x4 },
+	'firmwareid' => { 137 => 0x0 },
+	'firmwarename' => { 267 => 0xa001 },
+	'firmwarerevision' => { 15 => 0xa4, 43 => 0x1e, 261 => 0x0 },
+	'firmwarerevision2' => { 261 => 0xc },
+	'firmwareversion' => { 4 => 0x10b, 7 => 0x136, 10 => 0xff, 11 => 0x107, 97 => 0xce5, 111 => 0x57, 113 => 'FirmwareVersion', 224 => 0x2, 225 => 0x3109, 247 => 0x230, 263 => 0x2 },
+	'firstpublicationdate' => { 300 => 'FirstPublicationDate' },
+	'fixtureidentifier' => { 92 => 0x16 },
+	'flash' => { 85 => 0x9209, 132 => 0x1f, 133 => 0x15, 292 => 'Flash' },
+	'flashactivity' => { 24 => 0x1c },
+	'flashbatterylevel' => { 30 => 0x249 },
+	'flashbias' => { 224 => 0x24 },
+	'flashbits' => { 24 => 0x1d },
+	'flashchargelevel' => { 209 => 0x1010 },
+	'flashcolorfilter' => { 154 => 0x10 },
+	'flashcommandermode' => { 152 => '9.1', 153 => '9.1', 154 => '9.1' },
+	'flashcompensation' => { 152 => 0xa, 153 => 0xa, 154 => 0xa, 285 => 'FlashCompensation' },
+	'flashcontrolbuilt-in' => { 200 => '16.1', 201 => '23.1' },
+	'flashcontrolmode' => { 152 => '9.2', 153 => '9.2', 154 => '9.2', 204 => 0x404 },
+	'flashdefault' => { 134 => 0x42 },
+	'flashdevice' => { 209 => 0x1005 },
+	'flashdistance' => { 82 => 0x2034 },
+	'flashenergy' => { 85 => 0xa20b, 292 => 'FlashEnergy' },
+	'flashexposurebracketvalue' => { 160 => 0x18 },
+	'flashexposurecomp' => { 54 => 0xf, 89 => 0x1011, 116 => 'ExposureComp', 131 => 0x23, 135 => 0x104, 160 => 0x12, 204 => 0x401, 209 => 0x1023, 247 => 0x4d, 270 => 0x3a, 276 => 0x104 },
+	'flashexposurecompset' => { 227 => 0xe },
+	'flashexposurecompsetting' => { 134 => 0x10 },
+	'flashexposureindicator' => { 134 => 0x54 },
+	'flashexposureindicatorlast' => { 134 => 0x56 },
+	'flashexposureindicatornext' => { 134 => 0x55 },
+	'flashexposurelock' => { 38 => 0x19 },
+	'flashfired' => { 99 => 0x5d, 116 => 'Fired', 131 => 0x14, 178 => '590.3', 224 => 0x8007, 292 => [\'Flash','FlashFired'] },
+	'flashfiring' => { 59 => 0x306, 60 => 0x6, 61 => 0x7, 64 => 0x7 },
+	'flashfirmwareversion' => { 205 => 0x1002 },
+	'flashfocallength' => { 152 => 0xb, 153 => 0xc, 154 => 0xc },
+	'flashfunction' => { 292 => [\'Flash','FlashFunction'] },
+	'flashgndistance' => { 152 => 0xe, 153 => 0xf, 154 => 0xf },
+	'flashgroupacompensation' => { 152 => 0x11, 153 => 0x12, 154 => 0x13 },
+	'flashgroupacontrolmode' => { 152 => 0xf, 153 => '16.1', 154 => '17.1' },
+	'flashgroupaoutput' => { 152 => 0x11, 153 => 0x12, 154 => 0x13 },
+	'flashgroupbcompensation' => { 152 => 0x12, 153 => 0x13, 154 => 0x14 },
+	'flashgroupbcontrolmode' => { 152 => 0x10, 153 => '17.1', 154 => '18.1' },
+	'flashgroupboutput' => { 152 => 0x12, 153 => 0x13, 154 => 0x14 },
+	'flashgroupccompensation' => { 153 => 0x14, 154 => 0x15 },
+	'flashgroupccontrolmode' => { 153 => '17.2', 154 => '18.2' },
+	'flashgroupcoutput' => { 153 => 0x14, 154 => 0x15 },
+	'flashguidenumber' => { 54 => 0xd, 69 => 0x0, 116 => 'GuideNumber' },
+	'flashintensity' => { 81 => [0x19,0x5], 204 => 0x405 },
+	'flashlevel' => { 198 => 0x9, 276 => 0xb048 },
+	'flashmake' => { 116 => 'Make' },
+	'flashmanufacturer' => { 130 => 'FlashManufacturer' },
+	'flashmetering' => { 131 => 0x3f, 134 => 0x1c },
+	'flashmeteringmode' => { 4 => 0x15, 9 => 0x15, 10 => 0x15, 11 => 0x15, 12 => 0x15, 13 => 0x15, 14 => 0x15, 16 => 0x15, 19 => 0x15 },
+	'flashmeteringsegments' => { 247 => 0x20a },
+	'flashmode' => { 81 => 0x4, 99 => 0x5c, 116 => 'Mode', 131 => 0x2, 132 => 0x20, 133 => 0x16, 134 => 0xf, 160 => 0x87, 204 => 0x400, 209 => 0x1004, 247 => 0xc, 252 => 0x4, 262 => 0x20, 269 => 0x225, 271 => 0x23, 272 => 0x23, 292 => [\'Flash','FlashMode'] },
+	'flashmodel' => { 116 => 'Model', 130 => 'FlashModel', 205 => 0x1001 },
+	'flashoptions' => { 232 => 0x2 },
+	'flashoptions2' => { 232 => 0x10 },
+	'flashoutput' => { 30 => 0x248, 54 => 0x21, 152 => 0xa, 153 => 0xa, 154 => 0xa },
+	'flashpixversion' => { 85 => 0xa000, 292 => 'FlashpixVersion' },
+	'flashredeyemode' => { 292 => [\'Flash','FlashRedEyeMode'] },
+	'flashremotecontrol' => { 204 => 0x403 },
+	'flashreturn' => { 292 => [\'Flash','FlashReturn'] },
+	'flashserialnumber' => { 116 => 'SerialNumber', 205 => 0x1003 },
+	'flashsetting' => { 160 => 0x8 },
+	'flashshutterspeed' => { 197 => '20.2', 200 => '15.2', 201 => '22.2', 202 => '7.2', 203 => '23.1' },
+	'flashsource' => { 152 => 0x4, 153 => 0x4, 154 => 0x4 },
+	'flashstatus' => { 239 => 0x0 },
+	'flashsyncspeed' => { 197 => '20.1', 200 => '15.1', 201 => '22.1' },
+	'flashsyncspeedav' => { 57 => 0x3, 59 => 0x10f, 60 => 0x2, 61 => 0x3, 62 => 0x2, 63 => 0x2, 64 => 0x3, 65 => 0x6 },
+	'flashthreshold' => { 69 => 0x1 },
+	'flashtype' => { 116 => 'Type', 134 => 0x59, 160 => 0x9, 205 => 0x1000 },
+	'flashwarning' => { 201 => '30.1', 202 => '7.1', 203 => '31.1', 224 => 0x62 },
+	'flickerreduce' => { 269 => 0x218 },
+	'fliphorizontal' => { 190 => 0x76a43206 },
+	'fnumber' => { 4 => 0x3, 7 => 0x3, 9 => 0x3, 10 => 0x3, 11 => 0x3, 12 => 0x3, 13 => 0x3, 14 => 0x3, 15 => 0x3, 16 => 0x3, 18 => 0x3, 19 => 0x3, 21 => 0x5, 22 => 0x6, 54 => 0x15, 85 => 0x829d, 96 => 0xfd04, 99 => 0x1e, 101 => 0xfa23, 103 => 0xf103, 106 => 0x13, 108 => 0x3c, 111 => 0xc, 120 => 'FNumber', 131 => 0xa, 132 => 0x36, 133 => 0x47, 134 => 0x9, 247 => 0x13, 267 => 0xa019, 270 => 0x31, 292 => 'FNumber' },
+	'focallength' => { 4 => 0x1d, 5 => 0xa, 6 => 0x9, 7 => 0x1d, 8 => 0x9, 9 => 0x1e, 10 => 0x1d, 11 => 0x1d, 12 => 0x1e, 13 => 0x1e, 14 => 0x1e, 15 => 0x28, 16 => 0x1e, 18 => 0x1e, 19 => 0x1e, 40 => 0x1, 82 => 0x1d, 85 => 0x920a, 106 => 0x1d, 120 => 'FocalLength', 131 => 0x12, 158 => 0xa, 159 => 0xb, 241 => 0x9, 247 => 0x1d, 292 => 'FocalLength' },
+	'focallengthin35mmformat' => { 85 => 0xa405, 267 => 0xa01a, 292 => 'FocalLengthIn35mmFilm' },
+	'focalplanediagonal' => { 205 => 0x103, 209 => 0x205 },
+	'focalplaneresolutionunit' => { 85 => 0xa210, 292 => 'FocalPlaneResolutionUnit' },
+	'focalplanexresolution' => { 85 => 0xa20e, 292 => 'FocalPlaneXResolution' },
+	'focalplanexsize' => { 40 => 0x2 },
+	'focalplanexunknown' => { 40 => 0x2 },
+	'focalplaneyresolution' => { 85 => 0xa20f, 292 => 'FocalPlaneYResolution' },
+	'focalplaneysize' => { 40 => 0x3 },
+	'focalplaneyunknown' => { 40 => 0x3 },
+	'focaltype' => { 6 => 0x2d, 40 => 0x0 },
+	'focalunits' => { 24 => 0x19 },
+	'focus' => { 180 => 0x8 },
+	'focusarea' => { 131 => 0x31 },
+	'focusareaselection' => { 202 => '15.2' },
+	'focuscontinuous' => { 24 => 0x20 },
+	'focusdisplayaiservoandmf' => { 59 => 0x515 },
+	'focusdistance' => { 120 => 'FocusDistance', 131 => 0x13, 158 => 0x9, 159 => 0xa, 207 => 0x305 },
+	'focusdistancelower' => { 4 => 0x45, 7 => 0x45, 9 => 0x56, 10 => 0x45, 11 => 0x45, 12 => 0x52, 13 => 0x52, 14 => 0x56, 16 => 0x52, 18 => 0x57, 20 => 0x32, 54 => 0x14 },
+	'focusdistanceupper' => { 4 => 0x43, 7 => 0x43, 9 => 0x54, 10 => 0x43, 11 => 0x43, 12 => 0x50, 13 => 0x50, 14 => 0x54, 16 => 0x50, 18 => 0x55, 20 => 0x30, 54 => 0x13 },
+	'focusholdbutton' => { 134 => 0x44 },
+	'focusinfoversion' => { 207 => 0x0 },
+	'focusingscreen' => { 58 => 0x0, 59 => 0x80b, 64 => 0x0 },
+	'focusmode' => { 24 => 0x7, 81 => 0x3, 82 => [0x3003,0xd], 89 => 0x1021, 99 => 0x38, 113 => 'FocusMode', 131 => 0x30, 133 => 0xe, 134 => 0xc, 160 => 0x7, 204 => 0x301, 209 => 0x100b, 224 => 0x7, 247 => 0xd, 252 => 0x3, 271 => 0x10, 272 => 0x10, 276 => 0xb042 },
+	'focusmode2' => { 232 => '3.1' },
+	'focusmodesetting' => { 198 => '10.1' },
+	'focusmodeswitch' => { 134 => 0x58 },
+	'focuspixel' => { 89 => 0x1023 },
+	'focuspointwrap' => { 197 => '2.2', 200 => '2.2', 201 => '1.2', 203 => '2.5' },
+	'focusposition' => { 158 => 0x8, 159 => 0x8, 247 => 0x10 },
+	'focusprocess' => { 204 => 0x302 },
+	'focusrange' => { 24 => 0x12, 209 => 0x100a },
+	'focussetting' => { 270 => 0x6 },
+	'focusstepcount' => { 207 => 0x301, 209 => 0x100e },
+	'focusstepinfinity' => { 207 => 0x303, 209 => 0x103b },
+	'focusstepnear' => { 207 => 0x304, 209 => 0x103c },
+	'focustrackinglockon' => { 197 => ['1.5','4.1'], 200 => '3.1', 201 => '0.4' },
+	'focuswarning' => { 89 => 0x1301 },
+	'foldername' => { 131 => 0x27 },
+	'fontcomposite' => { 315 => [\'Fonts','FontsComposite'] },
+	'fontface' => { 315 => [\'Fonts','FontsFontFace'] },
+	'fontfamily' => { 315 => [\'Fonts','FontsFontFamily'] },
+	'fontfilename' => { 315 => [\'Fonts','FontsFontFileName'] },
+	'fontname' => { 315 => [\'Fonts','FontsFontName'] },
+	'fonts' => { 315 => 'Fonts' },
+	'fonttype' => { 315 => [\'Fonts','FontsFontType'] },
+	'fontversion' => { 315 => [\'Fonts','FontsVersionString'] },
+	'for' => { 258 => 'For' },
+	'format' => { 289 => 'format' },
+	'forwardlock' => { 305 => 'forwardlock' },
+	'forwardmatrix1' => { 85 => 0xc714 },
+	'forwardmatrix2' => { 85 => 0xc715 },
+	'framecount' => { 46 => [0x2,0x4] },
+	'framenum' => { 253 => 0xd7 },
+	'framenumber' => { 89 => 0x8003, 247 => 0x29 },
+	'framerate' => { 46 => [0x1,0x6] },
+	'frameselector' => { 223 => '0.1' },
+	'freebytes' => { 72 => 0x1 },
+	'freememorycardimages' => { 132 => [0x37,0x54], 133 => [0x2d,0x4a], 134 => 0x32 },
+	'fujiflashmode' => { 89 => 0x1010 },
+	'fullimagesize' => { 276 => 0xb02b },
+	'fullsizeimage' => { 119 => 'data' },
+	'fullsizeimagename' => { 119 => '1Name' },
+	'fullsizeimagetype' => { 119 => '0Type' },
+	'funcbutton' => { 197 => ['14.1','15.1'], 200 => '28.1', 201 => '13.1', 203 => '14.1' },
+	'funcbuttonplusdials' => { 197 => ['14.2','15.2'], 200 => '31.1' },
+	'functionbutton' => { 202 => '5.2' },
+	'gainbase' => { 208 => 0x610 },
+	'gaincontrol' => { 85 => 0xa407, 292 => 'GainControl' },
+	'gamma' => { 85 => 0xa500 },
+	'gammacompensatedvalue' => { 94 => 0x91 },
+	'geimagesize' => { 89 => 0x1304 },
+	'gemake' => { 90 => 0x300 },
+	'gemodel' => { 90 => 0x207 },
+	'genre' => { 301 => 'genre', 310 => 'genre' },
+	'geography' => { 302 => 'geography' },
+	'geosync' => { 86 => 'Geosync' },
+	'geotag' => { 86 => 'Geotag' },
+	'geotime' => { 86 => 'Geotime' },
+	'globalaltitude' => { 256 => 0x419 },
+	'globalangle' => { 256 => 0x40d },
+	'good' => { 310 => 'good' },
+	'gpsaltitude' => { 91 => 0x6, 117 => 'Altitude', 292 => 'GPSAltitude' },
+	'gpsaltituderef' => { 91 => 0x5, 292 => 'GPSAltitudeRef' },
+	'gpsareainformation' => { 91 => 0x1c, 292 => 'GPSAreaInformation' },
+	'gpsdatestamp' => { 91 => 0x1d },
+	'gpsdatetime' => { 117 => 'DateTime', 292 => 'GPSTimeStamp' },
+	'gpsdestbearing' => { 91 => 0x18, 117 => 'Bearing', 292 => 'GPSDestBearing' },
+	'gpsdestbearingref' => { 91 => 0x17, 292 => 'GPSDestBearingRef' },
+	'gpsdestdistance' => { 91 => 0x1a, 117 => 'Distance', 292 => 'GPSDestDistance' },
+	'gpsdestdistanceref' => { 91 => 0x19, 292 => 'GPSDestDistanceRef' },
+	'gpsdestlatitude' => { 91 => 0x14, 292 => 'GPSDestLatitude' },
+	'gpsdestlatituderef' => { 91 => 0x13 },
+	'gpsdestlongitude' => { 91 => 0x16, 292 => 'GPSDestLongitude' },
+	'gpsdestlongituderef' => { 91 => 0x15 },
+	'gpsdifferential' => { 91 => 0x1e, 117 => 'Differential', 292 => 'GPSDifferential' },
+	'gpsdop' => { 91 => 0xb, 292 => 'GPSDOP' },
+	'gpshpositioningerror' => { 91 => 0x1f },
+	'gpsimgdirection' => { 91 => 0x11, 292 => 'GPSImgDirection' },
+	'gpsimgdirectionref' => { 91 => 0x10, 292 => 'GPSImgDirectionRef' },
+	'gpslatitude' => { 91 => 0x2, 117 => 'Latitude', 292 => 'GPSLatitude' },
+	'gpslatituderef' => { 91 => 0x1 },
+	'gpslongitude' => { 91 => 0x4, 117 => 'Longitude', 292 => 'GPSLongitude' },
+	'gpslongituderef' => { 91 => 0x3 },
+	'gpsmapdatum' => { 91 => 0x12, 117 => 'Datum', 292 => 'GPSMapDatum' },
+	'gpsmeasuremode' => { 91 => 0xa, 117 => 'MeasureMode', 292 => 'GPSMeasureMode' },
+	'gpsprocessingmethod' => { 91 => 0x1b, 292 => 'GPSProcessingMethod' },
+	'gpssatellites' => { 91 => 0x8, 117 => 'Satellites', 292 => 'GPSSatellites' },
+	'gpsspeed' => { 91 => 0xd, 117 => 'Speed', 292 => 'GPSSpeed' },
+	'gpsspeedref' => { 91 => 0xc, 292 => 'GPSSpeedRef' },
+	'gpsstatus' => { 91 => 0x9, 292 => 'GPSStatus' },
+	'gpstimestamp' => { 91 => 0x7 },
+	'gpstrack' => { 91 => 0xf, 117 => 'Heading', 292 => 'GPSTrack' },
+	'gpstrackref' => { 91 => 0xe, 292 => 'GPSTrackRef' },
+	'gpsversionid' => { 91 => 0x0, 292 => 'GPSVersionID' },
+	'gradation' => { 204 => 0x50f },
+	'gradientbasedcorractive' => { 288 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionActive'] },
+	'gradientbasedcorramount' => { 288 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionAmount'] },
+	'gradientbasedcorrbrightness' => { 288 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalBrightness'] },
+	'gradientbasedcorrclarity' => { 288 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalClarity'] },
+	'gradientbasedcorrcontrast' => { 288 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalContrast'] },
+	'gradientbasedcorrections' => { 288 => 'GradientBasedCorrections' },
+	'gradientbasedcorrexposure' => { 288 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalExposure'] },
+	'gradientbasedcorrhue' => { 288 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalToningHue'] },
+	'gradientbasedcorrmaskcenterweight' => { 288 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCenterWeight'] },
+	'gradientbasedcorrmaskdabs' => { 288 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksDabs'] },
+	'gradientbasedcorrmaskflow' => { 288 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksFlow'] },
+	'gradientbasedcorrmaskfullx' => { 288 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksFullX'] },
+	'gradientbasedcorrmaskfully' => { 288 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksFullY'] },
+	'gradientbasedcorrmaskradius' => { 288 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksRadius'] },
+	'gradientbasedcorrmasks' => { 288 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasks'] },
+	'gradientbasedcorrmaskvalue' => { 288 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMaskValue'] },
+	'gradientbasedcorrmaskwhat' => { 288 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksWhat'] },
+	'gradientbasedcorrmaskzerox' => { 288 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksZeroX'] },
+	'gradientbasedcorrmaskzeroy' => { 288 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksZeroY'] },
+	'gradientbasedcorrsaturation' => { 288 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalSaturation','GradientBasedCorrectionsLocalToningSaturation'] },
+	'gradientbasedcorrsharpness' => { 288 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalSharpness'] },
+	'gradientbasedcorrwhat' => { 288 => [\'GradientBasedCorrections','GradientBasedCorrectionsWhat'] },
+	'grainamount' => { 288 => 'GrainAmount' },
+	'grainfrequency' => { 288 => 'GrainFrequency' },
+	'grainsize' => { 288 => 'GrainSize' },
+	'graymixeraqua' => { 288 => 'GrayMixerAqua' },
+	'graymixerblue' => { 288 => 'GrayMixerBlue' },
+	'graymixergreen' => { 288 => 'GrayMixerGreen' },
+	'graymixermagenta' => { 288 => 'GrayMixerMagenta' },
+	'graymixerorange' => { 288 => 'GrayMixerOrange' },
+	'graymixerpurple' => { 288 => 'GrayMixerPurple' },
+	'graymixerred' => { 288 => 'GrayMixerRed' },
+	'graymixeryellow' => { 288 => 'GrayMixerYellow' },
+	'graypoint' => { 279 => 0x8021 },
+	'grayresponseunit' => { 85 => 0x122 },
+	'greencurvelimits' => { 77 => 0x1c4 },
+	'greencurvepoints' => { 77 => 0x19a },
+	'greenhue' => { 288 => 'GreenHue' },
+	'greensaturation' => { 288 => 'GreenSaturation' },
+	'griddisplay' => { 197 => '13.3', 199 => '2.2', 200 => '10.5', 201 => '3.4', 202 => '6.1', 203 => '4.2' },
+	'gripbatteryadload' => { 230 => 0x5 },
+	'gripbatteryadnoload' => { 230 => 0x4 },
+	'gripbatterystate' => { 230 => '1.2' },
+	'halftonehints' => { 85 => 0x141 },
+	'hasalternative' => { 301 => 'hasAlternative' },
+	'hascorrection' => { 301 => 'hasCorrection' },
+	'hascrop' => { 288 => 'HasCrop' },
+	'hasextendedxmp' => { 312 => 'HasExtendedXMP' },
+	'haspreviousversion' => { 301 => 'hasPreviousVersion' },
+	'hassettings' => { 288 => 'HasSettings' },
+	'hastranslation' => { 301 => 'hasTranslation' },
+	'hdr' => { 276 => 0x200a },
+	'headline' => { 92 => 0x69, 299 => 'Headline' },
+	'hierarchicalkeywords' => { 296 => [\'Keywords','KeywordsHierarchy'] },
+	'hierarchicalkeywords1' => { 296 => [\'Keywords','KeywordsHierarchyKeyword'] },
+	'hierarchicalkeywords1applied' => { 296 => [\'Keywords','KeywordsHierarchyApplied'] },
+	'hierarchicalkeywords1children' => { 296 => [\'Keywords','KeywordsHierarchyChildren'] },
+	'hierarchicalkeywords2' => { 296 => [\'Keywords','KeywordsHierarchyChildrenKeyword'] },
+	'hierarchicalkeywords2applied' => { 296 => [\'Keywords','KeywordsHierarchyChildrenApplied'] },
+	'hierarchicalkeywords2children' => { 296 => [\'Keywords','KeywordsHierarchyChildrenChildren'] },
+	'hierarchicalkeywords3' => { 296 => [\'Keywords','KeywordsHierarchyChildrenChildrenKeyword'] },
+	'hierarchicalkeywords3applied' => { 296 => [\'Keywords','KeywordsHierarchyChildrenChildrenApplied'] },
+	'hierarchicalkeywords3children' => { 296 => [\'Keywords','KeywordsHierarchyChildrenChildrenChildren'] },
+	'hierarchicalkeywords4' => { 296 => [\'Keywords','KeywordsHierarchyChildrenChildrenChildrenKeyword'] },
+	'hierarchicalkeywords4applied' => { 296 => [\'Keywords','KeywordsHierarchyChildrenChildrenChildrenApplied'] },
+	'hierarchicalsubject' => { 282 => 'hierarchicalSubject' },
+	'highisonoisereduction' => { 12 => 0xbc, 13 => 0xbd, 16 => 0xbd, 20 => 0xa5, 59 => 0x202, 89 => 0x100e, 160 => 0xb1, 247 => 0x71, 271 => 0x2c, 276 => 0x2009 },
+	'highlight' => { 270 => 0xf },
+	'highlightcolordistortreduct' => { 279 => 0x8026 },
+	'highlightprotection' => { 189 => 0x6 },
+	'highlightrecovery' => { 288 => 'HighlightRecovery' },
+	'highlighttonepriority' => { 9 => 0x7, 12 => 0x7, 13 => 0x7, 14 => 0x7, 16 => 0x7, 19 => 0x7, 59 => 0x203 },
+	'highlowkeyadj' => { 247 => 0x6c },
+	'highspeedsync' => { 134 => 0x5 },
+	'histogramxml' => { 190 => 0x83a1a25 },
+	'history' => { 299 => 'History', 311 => 'History' },
+	'historyaction' => { 311 => [\'History','HistoryAction'] },
+	'historychanged' => { 311 => [\'History','HistoryChanged'] },
+	'historyinstanceid' => { 311 => [\'History','HistoryInstanceID'] },
+	'historyparameters' => { 311 => [\'History','HistoryParameters'] },
+	'historysoftwareagent' => { 311 => [\'History','HistorySoftwareAgent'] },
+	'historywhen' => { 311 => [\'History','HistoryWhen'] },
+	'hometowncity' => { 82 => 0x3006, 247 => 0x23, 251 => 0x2 },
+	'hometowncitycode' => { 252 => 0x1000 },
+	'hometowndst' => { 247 => 0x25, 251 => '0.2' },
+	'hostcomputer' => { 85 => 0x13c },
+	'hue' => { 138 => 0x3b, 247 => 0x67 },
+	'hueadj' => { 193 => 0x2f, 279 => 0x8019 },
+	'hueadjustment' => { 132 => 0x4a, 133 => 0x40, 160 => 0x92, 162 => 0x36 },
+	'hueadjustmentaqua' => { 288 => 'HueAdjustmentAqua' },
+	'hueadjustmentblue' => { 288 => 'HueAdjustmentBlue' },
+	'hueadjustmentgreen' => { 288 => 'HueAdjustmentGreen' },
+	'hueadjustmentmagenta' => { 288 => 'HueAdjustmentMagenta' },
+	'hueadjustmentorange' => { 288 => 'HueAdjustmentOrange' },
+	'hueadjustmentpurple' => { 288 => 'HueAdjustmentPurple' },
+	'hueadjustmentred' => { 288 => 'HueAdjustmentRed' },
+	'hueadjustmentyellow' => { 288 => 'HueAdjustmentYellow' },
+	'huesetting' => { 212 => 0x1011 },
+	'icc_profile' => { 86 => 'ICC_Profile' },
+	'iccprofilename' => { 299 => 'ICCProfile' },
+	'idccreativestyle' => { 279 => 0x8000 },
+	'idcpreviewlength' => { 279 => 0x202 },
+	'idcpreviewstart' => { 279 => 0x201 },
+	'identifier' => { 289 => 'identifier', 308 => 'Identifier' },
+	'illumination' => { 202 => '0.5' },
+	'imageadjustment' => { 160 => 0x80, 180 => 0x5 },
+	'imagealterationconstraints' => { 300 => 'ImageAlterationConstraints' },
+	'imagearea' => { 170 => 0x10, 173 => 0x10 },
+	'imageareaoffset' => { 247 => 0x38 },
+	'imageauthentication' => { 160 => 0x20 },
+	'imageboundary' => { 160 => 0x16 },
+	'imagecount' => { 160 => 0xa5 },
+	'imagecreator' => { 300 => 'ImageCreator' },
+	'imagecreatorid' => { 300 => [\'ImageCreator','ImageCreatorImageCreatorID'] },
+	'imagecreatorimageid' => { 300 => 'ImageCreatorImageID' },
+	'imagecreatorname' => { 300 => [\'ImageCreator','ImageCreatorImageCreatorName'] },
+	'imagedatasize' => { 160 => 0xa2 },
+	'imagedescription' => { 85 => 0x10e, 306 => 'ImageDescription' },
+	'imageduplicationconstraints' => { 300 => 'ImageDuplicationConstraints' },
+	'imagedustoff' => { 190 => 0xfe443a45 },
+	'imageeditcount' => { 247 => 0x41 },
+	'imageediting' => { 247 => 0x32 },
+	'imagefileconstraints' => { 300 => 'ImageFileConstraints' },
+	'imagefileformatasdelivered' => { 300 => 'ImageFileFormatAsDelivered' },
+	'imagefilesizeasdelivered' => { 300 => 'ImageFileSizeAsDelivered' },
+	'imageheight' => { 85 => 0x101, 137 => 0xc, 306 => 'ImageLength' },
+	'imagehistory' => { 85 => 0x9213 },
+	'imageidnumber' => { 219 => 0x340 },
+	'imagenumber' => { 15 => 0xd0, 85 => 0x9211, 113 => 'ImageNumber', 132 => 0xae, 133 => 0x5e, 285 => 'ImageNumber' },
+	'imagenumber2' => { 133 => 0x62 },
+	'imageoptimization' => { 160 => 0xa9 },
+	'imageorientation' => { 92 => 0x83 },
+	'imageprocessing' => { 160 => 0x1a },
+	'imageprocessingversion' => { 208 => 0x0 },
+	'imagequality' => { 113 => 'ImageQuality', 172 => '723.2', 173 => '732.2', 178 => '708.1', 224 => 0x1 },
+	'imagequality2' => { 204 => 0x603 },
+	'imagereview' => { 198 => '0.4', 202 => '0.4' },
+	'imagereviewtime' => { 198 => '2.1', 199 => '19.1', 200 => '9.2', 201 => '20.1', 203 => '21.2' },
+	'imagesize' => { 119 => 'ImageSize' },
+	'imagesizerestriction' => { 303 => 'imageSizeRestriction' },
+	'imagesourcedata' => { 85 => 0x935c },
+	'imagestabilization' => { 24 => 0x22, 82 => 0x3020, 113 => 'ImageStabilization', 132 => 0xbd, 133 => 0x71, 134 => 0x57, 135 => [0x18,0x107,0x113], 160 => 0xac, 204 => 0x604, 207 => 0x1600, 224 => 0x1a, 271 => 0x3d, 276 => 0xb026 },
+	'imagestyle' => { 271 => 0x2d },
+	'imagesupplier' => { 300 => 'ImageSupplier' },
+	'imagesupplierid' => { 300 => [\'ImageSupplier','ImageSupplierImageSupplierID'] },
+	'imagesupplierimageid' => { 300 => 'ImageSupplierImageID' },
+	'imagesuppliername' => { 300 => [\'ImageSupplier','ImageSupplierImageSupplierName'] },
+	'imagetone' => { 247 => 0x4f },
+	'imagetype' => { 92 => 0x82, 300 => 'ImageType' },
+	'imageuniqueid' => { 43 => 0x28, 85 => 0xa420, 292 => 'ImageUniqueID' },
+	'imagewidth' => { 85 => 0x100, 137 => 0xe, 306 => 'ImageWidth' },
+	'incrementaltemperature' => { 288 => 'IncrementalTemperature' },
+	'incrementaltint' => { 288 => 'IncrementalTint' },
+	'industry' => { 301 => 'industry', 302 => 'industry' },
+	'infobuttonwhenshooting' => { 59 => 0x409 },
+	'infraredilluminator' => { 259 => 0x28 },
+	'ingredients' => { 311 => 'Ingredients' },
+	'ingredientsalternatepaths' => { 311 => [\'Ingredients','IngredientsAlternatePaths'] },
+	'ingredientsdocumentid' => { 311 => [\'Ingredients','IngredientsDocumentID'] },
+	'ingredientsfilepath' => { 311 => [\'Ingredients','IngredientsFilePath'] },
+	'ingredientsfrompart' => { 311 => [\'Ingredients','IngredientsFromPart'] },
+	'ingredientsinstanceid' => { 311 => [\'Ingredients','IngredientsInstanceID'] },
+	'ingredientslastmodifydate' => { 311 => [\'Ingredients','IngredientsLastModifyDate'] },
+	'ingredientsmanager' => { 311 => [\'Ingredients','IngredientsManager'] },
+	'ingredientsmanagervariant' => { 311 => [\'Ingredients','IngredientsManagerVariant'] },
+	'ingredientsmanageto' => { 311 => [\'Ingredients','IngredientsManageTo'] },
+	'ingredientsmanageui' => { 311 => [\'Ingredients','IngredientsManageUI'] },
+	'ingredientsmaskmarkers' => { 311 => [\'Ingredients','IngredientsMaskMarkers'] },
+	'ingredientsoriginaldocumentid' => { 311 => [\'Ingredients','IngredientsOriginalDocumentID'] },
+	'ingredientspartmapping' => { 311 => [\'Ingredients','IngredientsPartMapping'] },
+	'ingredientsrenditionclass' => { 311 => [\'Ingredients','IngredientsRenditionClass'] },
+	'ingredientsrenditionparams' => { 311 => [\'Ingredients','IngredientsRenditionParams'] },
+	'ingredientstopart' => { 311 => [\'Ingredients','IngredientsToPart'] },
+	'ingredientsversionid' => { 311 => [\'Ingredients','IngredientsVersionID'] },
+	'initialzoomliveview' => { 197 => '4.4' },
+	'initialzoomsetting' => { 197 => '9.3', 200 => '27.3' },
+	'inkset' => { 85 => 0x14c },
+	'instanceid' => { 311 => 'InstanceID' },
+	'instantplaybacksetup' => { 134 => 0x3e },
+	'instantplaybacktime' => { 134 => 0x3d },
+	'instructions' => { 299 => 'Instructions' },
+	'instrument' => { 310 => 'instrument' },
+	'intellectualgenre' => { 293 => 'IntellectualGenre' },
+	'intelligentauto' => { 276 => 0xb052 },
+	'intelligentd-range' => { 224 => 0x79 },
+	'intelligentexposure' => { 224 => 0x5d },
+	'intelligentresolution' => { 224 => 0x70 },
+	'interchangecolorspace' => { 94 => 0x40 },
+	'internalflash' => { 131 => 0x2b, 197 => '23.1', 198 => '8.1', 199 => '22.1', 202 => '8.1', 203 => '24.1', 207 => 0x1208 },
+	'internalflashae1' => { 209 => 0x1021 },
+	'internalflashae1_0' => { 209 => 0x101d },
+	'internalflashae2' => { 209 => 0x1022 },
+	'internalflashae2_0' => { 209 => 0x101e },
+	'internalflashmode' => { 239 => 0x1 },
+	'internalflashstrength' => { 239 => 0x3 },
+	'internalflashtable' => { 209 => 0x1024 },
+	'internalserialnumber' => { 43 => 0x96, 53 => 0x9, 89 => 0x10, 136 => 0x49dc, 205 => 0x102, 224 => 0x25, 231 => 0x4, 263 => 0x5 },
+	'interopindex' => { 85 => 0x1 },
+	'interopversion' => { 85 => 0x2 },
+	'intervallength' => { 131 => 0x10 },
+	'intervalmode' => { 131 => 0x26 },
+	'intervalnumber' => { 131 => 0x11 },
+	'introtime' => { 310 => 'introTime' },
+	'introtimescale' => { 310 => [\'introTime','introTimeScale'] },
+	'introtimevalue' => { 310 => [\'introTime','introTimeValue'] },
+	'iptc-naa' => { 85 => 0x83bb, 226 => 0x83bb },
+	'iptcbitspersample' => { 94 => 0x56 },
+	'iptcdigest' => { 256 => 0x425 },
+	'iptcimageheight' => { 94 => 0x1e },
+	'iptcimagerotation' => { 94 => 0x66 },
+	'iptcimagewidth' => { 94 => 0x14 },
+	'iptclastedited' => { 294 => 'IptcLastEdited' },
+	'iptcpicturenumber' => { 94 => 0xa },
+	'iptcpixelheight' => { 94 => 0x32 },
+	'iptcpixelwidth' => { 94 => 0x28 },
+	'isbn' => { 301 => 'isbn' },
+	'iscorrectionof' => { 301 => 'isCorrectionOf' },
+	'iscustompicturestyle' => { 78 => 0x3 },
+	'iso' => { 4 => 0x6, 6 => 0x75, 7 => 0x6, 8 => 0x79, 9 => 0x6, 10 => 0x6, 11 => 0x6, 12 => 0x6, 13 => 0x6, 14 => 0x6, 15 => 0x6, 16 => 0x6, 18 => 0x6, 19 => 0x6, 21 => 0x0, 22 => 0x1, 81 => 0x14, 82 => [0x3014,0x14], 85 => 0x8827, 96 => 0xfd06, 97 => 0x1784, 99 => 0x60, 101 => [0xfa2e,0xfa46], 102 => [0x27,0x28], 103 => 0xf105, 106 => 0x14, 108 => 0x4e, 111 => 0x34, 113 => 'ISO', 131 => 0x8, 156 => 0x0, 160 => 0x2, 226 => 0x17, 247 => 0x14, 252 => 0x14, 267 => 0xa014, 292 => 'ISOSpeedRatings' },
+	'iso2' => { 156 => 0x6, 167 => 0x265, 168 => 0x25c, 169 => 0x265, 170 => 0x221, 171 => 0x25d, 172 => 0x256, 173 => 0x25d, 175 => 0x2b5, 176 => 0x265, 179 => 0x2b5 },
+	'isoauto' => { 232 => '14.4' },
+	'isoautoparameters' => { 247 => 0x7a },
+	'isodisplay' => { 199 => '2.3', 201 => '3.3', 203 => '4.3' },
+	'isoexpansion' => { 59 => 0x103, 60 => 0x7, 61 => 0x8, 64 => 0x8, 156 => 0x4 },
+	'isoexpansion2' => { 156 => 0xa },
+	'isofloor' => { 232 => 0x6 },
+	'isoselection' => { 160 => 0xf },
+	'isosensitivitystep' => { 201 => '6.2' },
+	'isosetting' => { 99 => 0x5e, 113 => 'ISOSetting', 131 => 0x24, 132 => 0x26, 133 => 0x1c, 134 => 0x13, 138 => 0x6, 160 => 0x13, 232 => '17.3', 262 => 0x27, 271 => 0x16, 272 => 0x14 },
+	'isospeed' => { 85 => 0x8833 },
+	'isospeedexpansion' => { 58 => 0x3 },
+	'isospeedincrements' => { 59 => 0x102 },
+	'isospeedlatitudeyyy' => { 85 => 0x8834 },
+	'isospeedlatitudezzz' => { 85 => 0x8835 },
+	'isospeedrange' => { 59 => 0x103 },
+	'isostepsize' => { 197 => '6.1', 200 => '4.1' },
+	'isovalue' => { 209 => 0x1001 },
+	'issn' => { 301 => 'issn' },
+	'issueidentifier' => { 301 => 'issueIdentifier' },
+	'issuename' => { 301 => 'issueName' },
+	'istranslationof' => { 301 => 'isTranslationOf' },
+	'jobid' => { 92 => 0xb8 },
+	'jobref' => { 309 => 'JobRef' },
+	'jobrefid' => { 309 => [\'JobRef','JobRefId'] },
+	'jobrefname' => { 309 => [\'JobRef','JobRefName'] },
+	'jobrefurl' => { 309 => [\'JobRef','JobRefUrl'] },
+	'jpegquality' => { 6 => 0x66, 225 => 0x3034 },
+	'jpegsize' => { 225 => 0x303a },
+	'jpgfromraw' => { 72 => 0x2007, 83 => 'JpgFromRaw', 226 => 0x2e },
+	'jpgfromrawlength' => { 85 => [0x117,0x202] },
+	'jpgfromrawstart' => { 85 => [0x111,0x201] },
+	'jpgrecordedpixels' => { 232 => '14.1' },
+	'key' => { 310 => 'key' },
+	'keyword' => { 301 => 'keyword' },
+	'keywordinfo' => { 296 => 'Keywords' },
+	'keywords' => { 92 => 0x19, 114 => 'Keywords', 213 => 'Keywords', 258 => 'Keywords', 284 => 'keywords', 298 => 'Keywords' },
+	'killdate' => { 301 => 'killDate' },
+	'kodakimageheight' => { 96 => 0xf908, 99 => 0xe, 101 => [0xfa1e,0xfa52], 107 => 0x70 },
+	'kodakimagewidth' => { 96 => 0xf907, 99 => 0xc, 101 => [0xfa1d,0xfa51], 107 => 0x6c },
+	'kodakinfotype' => { 96 => 0xfa00 },
+	'kodakmaker' => { 107 => 0x8 },
+	'kodakmodel' => { 99 => 0x0, 107 => 0x28 },
+	'label' => { 215 => 'Label', 308 => 'Label' },
+	'landmark' => { 224 => 0x6f },
+	'landscapeoutputhighlightpoint' => { 78 => 0x26 },
+	'landscapeoutputshadowpoint' => { 78 => 0x27 },
+	'landscaperawcolortone' => { 78 => 0x1f },
+	'landscaperawcontrast' => { 78 => 0x21 },
+	'landscaperawhighlight' => { 78 => 0x77 },
+	'landscaperawhighlightpoint' => { 78 => 0x24 },
+	'landscaperawlinear' => { 78 => 0x22 },
+	'landscaperawsaturation' => { 78 => 0x20 },
+	'landscaperawshadow' => { 78 => 0x80 },
+	'landscaperawshadowpoint' => { 78 => 0x25 },
+	'landscaperawsharpness' => { 78 => 0x23 },
+	'language' => { 289 => 'language' },
+	'languageidentifier' => { 92 => 0x87 },
+	'lastfilenumber' => { 131 => 0x1b },
+	'lastkeywordiptc' => { 130 => 'LastKeywordIPTC' },
+	'lastkeywordxmp' => { 130 => 'LastKeywordXMP' },
+	'lasturl' => { 311 => 'LastURL' },
+	'lc1' => { 241 => 0x2 },
+	'lc10' => { 241 => 0xb },
+	'lc11' => { 241 => 0xc },
+	'lc12' => { 241 => 0xd },
+	'lc14' => { 241 => 0xf },
+	'lc15' => { 241 => 0x10 },
+	'lc2' => { 241 => 0x3 },
+	'lc3' => { 241 => 0x4 },
+	'lc4' => { 241 => 0x5 },
+	'lc5' => { 241 => 0x6 },
+	'lc6' => { 241 => 0x7 },
+	'lc7' => { 241 => 0x8 },
+	'lcddisplayatpoweron' => { 59 => 0x811, 63 => 0xa },
+	'lcddisplayreturntoshoot' => { 64 => 0x12 },
+	'lcdillumination' => { 197 => '17.5', 200 => '10.3', 201 => '4.2', 203 => '5.4' },
+	'lcdilluminationduringbulb' => { 59 => 0x408 },
+	'lcdpanels' => { 58 => 0x8 },
+	'lcheditor' => { 190 => 0x8ae85e },
+	'legacyiptcdigest' => { 299 => 'LegacyIPTCDigest' },
+	'lens' => { 85 => 0xfdea, 160 => 0x84, 285 => 'Lens' },
+	'lensafstopbutton' => { 57 => 0x11, 58 => 0x13, 59 => 0x506, 60 => 0x10, 61 => 0x12, 64 => 0x13, 65 => 0x9 },
+	'lensaperturerange' => { 270 => 0x30 },
+	'lensdistortionparams' => { 209 => 0x206 },
+	'lensdrivenoaf' => { 59 => 0x505 },
+	'lensfirmware' => { 264 => 0x20, 267 => 0xa004 },
+	'lensfirmwareversion' => { 205 => 0x204 },
+	'lensfocalrange' => { 270 => 0xa },
+	'lensfstops' => { 157 => 0x7, 158 => 0xc, 159 => 0xd, 160 => 0x8b, 241 => '0.3' },
+	'lensid' => { 285 => 'LensID' },
+	'lensidnumber' => { 157 => 0x6, 158 => 0xb, 159 => 0xc },
+	'lensinfo' => { 85 => 0xa432, 285 => 'LensInfo' },
+	'lenskind' => { 241 => 0x1 },
+	'lensmake' => { 85 => 0xa433, 120 => 'Make' },
+	'lensmanualdistortionamount' => { 288 => 'LensManualDistortionAmount' },
+	'lensmanufacturer' => { 130 => 'LensManufacturer' },
+	'lensmodel' => { 4 => 0x937, 10 => 0x92b, 11 => 0x933, 43 => 0x95, 85 => 0xa434, 120 => 'Model', 130 => 'LensModel', 205 => 0x203 },
+	'lensprofilechromaticaberrationscale' => { 288 => 'LensProfileChromaticAberrationScale' },
+	'lensprofiledigest' => { 288 => 'LensProfileDigest' },
+	'lensprofiledistortionscale' => { 288 => 'LensProfileDistortionScale' },
+	'lensprofileenable' => { 288 => 'LensProfileEnable' },
+	'lensprofilefilename' => { 288 => 'LensProfileFilename' },
+	'lensprofilename' => { 288 => 'LensProfileName' },
+	'lensprofilesetup' => { 288 => 'LensProfileSetup' },
+	'lensprofilevignettingscale' => { 288 => 'LensProfileVignettingScale' },
+	'lensproperties' => { 205 => 0x20b },
+	'lensserialnumber' => { 41 => 0x0, 85 => 0xa435, 120 => 'SerialNumber', 205 => 0x202, 224 => 0x52, 264 => 0x30 },
+	'lensshutterlock' => { 134 => 0x4a },
+	'lenstemperature' => { 209 => 0x1008 },
+	'lenstype' => { 4 => 0xe2, 5 => 0xd, 6 => 0xc, 7 => 0x111, 8 => 0xc, 9 => [0x14e,0x14f], 10 => 0xd6, 11 => 0xde, 12 => 0xf6, 13 => 0xea, 14 => 0xff, 15 => [0xc,0x97], 16 => 0xe6, 18 => 0xe8, 20 => 0xee, 24 => 0x16, 135 => 0x10c, 160 => 0x83, 205 => 0x201, 216 => 0x16, 222 => 0x303, 223 => 0x0, 224 => 0x51, 225 => 0x3405, 242 => 0x0, 243 => 0x0, 244 => 0x1, 245 => 0x1, 247 => 0x3f, 267 => 0xa003, 276 => 0xb027 },
+	'levelgaugepitch' => { 204 => 0x904 },
+	'levelgaugeroll' => { 204 => 0x903 },
+	'levelorientation' => { 246 => 0x0 },
+	'license' => { 286 => 'license' },
+	'licensee' => { 300 => 'Licensee' },
+	'licenseeid' => { 300 => [\'Licensee','LicenseeLicenseeID'] },
+	'licenseeimageid' => { 300 => 'LicenseeImageID' },
+	'licenseeimagenotes' => { 300 => 'LicenseeImageNotes' },
+	'licenseename' => { 300 => [\'Licensee','LicenseeLicenseeName'] },
+	'licenseenddate' => { 300 => 'LicenseEndDate' },
+	'licenseeprojectreference' => { 300 => 'LicenseeProjectReference' },
+	'licenseetransactionid' => { 300 => 'LicenseeTransactionID' },
+	'licenseid' => { 300 => 'LicenseID' },
+	'licensestartdate' => { 300 => 'LicenseStartDate' },
+	'licensetransactiondate' => { 300 => 'LicenseTransactionDate' },
+	'licensetype' => { 290 => 'licensetype' },
+	'licensor' => { 300 => 'Licensor' },
+	'licensorcity' => { 300 => [\'Licensor','LicensorLicensorCity'] },
+	'licensorcountry' => { 300 => [\'Licensor','LicensorLicensorCountry'] },
+	'licensoremail' => { 300 => [\'Licensor','LicensorLicensorEmail'] },
+	'licensorextendedaddress' => { 300 => [\'Licensor','LicensorLicensorExtendedAddress'] },
+	'licensorid' => { 300 => [\'Licensor','LicensorLicensorID'] },
+	'licensorimageid' => { 300 => 'LicensorImageID' },
+	'licensorname' => { 300 => [\'Licensor','LicensorLicensorName'] },
+	'licensornotes' => { 300 => 'LicensorNotes' },
+	'licensorpostalcode' => { 300 => [\'Licensor','LicensorLicensorPostalCode'] },
+	'licensorregion' => { 300 => [\'Licensor','LicensorLicensorRegion'] },
+	'licensorstreetaddress' => { 300 => [\'Licensor','LicensorLicensorStreetAddress'] },
+	'licensortelephone1' => { 300 => [\'Licensor','LicensorLicensorTelephone1'] },
+	'licensortelephone2' => { 300 => [\'Licensor','LicensorLicensorTelephone2'] },
+	'licensortelephonetype1' => { 300 => [\'Licensor','LicensorLicensorTelephoneType1'] },
+	'licensortelephonetype2' => { 300 => [\'Licensor','LicensorLicensorTelephoneType2'] },
+	'licensortransactionid' => { 300 => 'LicensorTransactionID' },
+	'licensorurl' => { 300 => [\'Licensor','LicensorLicensorURL'] },
+	'lightcondition' => { 209 => 0x1009 },
+	'lightingmode' => { 82 => 0x302a },
+	'lightreading' => { 247 => 0x15 },
+	'lightsource' => { 85 => 0x9208, 160 => 0x90, 212 => 0x1000, 292 => 'LightSource' },
+	'lightsourcespecial' => { 269 => 0x21d },
+	'lightswitch' => { 203 => '0.1' },
+	'lightvaluecenter' => { 209 => 0x103d },
+	'lightvalueperiphery' => { 209 => 0x103e },
+	'linearresponselimit' => { 85 => 0xc62e },
+	'linkaetoafpoint' => { 232 => '14.2' },
+	'liveviewaf' => { 199 => '32.1', 203 => '34.1' },
+	'liveviewafareamode' => { 201 => '34.1' },
+	'liveviewafmode' => { 201 => '34.2' },
+	'liveviewexposuresimulation' => { 59 => 0x810 },
+	'liveviewmonitorofftime' => { 201 => '20.2' },
+	'liveviewshooting' => { 38 => 0x13 },
+	'localafareapoint' => { 134 => 0xd, 271 => 0x12, 272 => 0x12 },
+	'localcaption' => { 92 => 0x79 },
+	'localizedcameramodel' => { 85 => 0xc615 },
+	'locallocationname' => { 267 => 0x30 },
+	'location' => { 224 => 0x67, 283 => 'Location', 293 => 'Location', 301 => 'location' },
+	'locationareacode' => { 287 => 'lac' },
+	'locationcreated' => { 294 => 'LocationCreated' },
+	'locationcreatedcity' => { 294 => [\'LocationCreated','LocationCreatedCity'] },
+	'locationcreatedcountrycode' => { 294 => [\'LocationCreated','LocationCreatedCountryCode'] },
+	'locationcreatedcountryname' => { 294 => [\'LocationCreated','LocationCreatedCountryName'] },
+	'locationcreatedprovincestate' => { 294 => [\'LocationCreated','LocationCreatedProvinceState'] },
+	'locationcreatedsublocation' => { 294 => [\'LocationCreated','LocationCreatedSublocation'] },
+	'locationcreatedworldregion' => { 294 => [\'LocationCreated','LocationCreatedWorldRegion'] },
+	'locationname' => { 267 => 0x31 },
+	'locationshown' => { 294 => 'LocationShown' },
+	'locationshowncity' => { 294 => [\'LocationShown','LocationShownCity'] },
+	'locationshowncountrycode' => { 294 => [\'LocationShown','LocationShownCountryCode'] },
+	'locationshowncountryname' => { 294 => [\'LocationShown','LocationShownCountryName'] },
+	'locationshownprovincestate' => { 294 => [\'LocationShown','LocationShownProvinceState'] },
+	'locationshownsublocation' => { 294 => [\'LocationShown','LocationShownSublocation'] },
+	'locationshownworldregion' => { 294 => [\'LocationShown','LocationShownWorldRegion'] },
+	'lockmicrophonebutton' => { 59 => 0x709 },
+	'logcomment' => { 310 => 'logComment' },
+	'longexposurenoisereduction' => { 59 => 0x201, 60 => 0x1, 61 => 0x2, 62 => 0x1, 63 => 0x1, 64 => 0x2, 65 => 0x1, 271 => 0x2b, 276 => [0xb04e,0x2008] },
+	'longexposurenoisereduction2' => { 38 => 0x8 },
+	'longfocal' => { 5 => 0x10, 6 => 0x13, 7 => 0x115, 8 => 0x13, 9 => [0x152,0x153], 10 => 0xda, 12 => 0xfa, 13 => 0xee, 14 => 0x103, 15 => 0x95, 16 => 0xea, 18 => 0xec, 20 => 0xf2, 24 => 0x17 },
+	'loop' => { 310 => 'loop' },
+	'luminanceadjustmentaqua' => { 288 => 'LuminanceAdjustmentAqua' },
+	'luminanceadjustmentblue' => { 288 => 'LuminanceAdjustmentBlue' },
+	'luminanceadjustmentgreen' => { 288 => 'LuminanceAdjustmentGreen' },
+	'luminanceadjustmentmagenta' => { 288 => 'LuminanceAdjustmentMagenta' },
+	'luminanceadjustmentorange' => { 288 => 'LuminanceAdjustmentOrange' },
+	'luminanceadjustmentpurple' => { 288 => 'LuminanceAdjustmentPurple' },
+	'luminanceadjustmentred' => { 288 => 'LuminanceAdjustmentRed' },
+	'luminanceadjustmentyellow' => { 288 => 'LuminanceAdjustmentYellow' },
+	'luminancecurvelimits' => { 77 => 0x150 },
+	'luminancecurvepoints' => { 77 => 0x126 },
+	'luminancenoisereduction' => { 78 => 0x5f, 270 => 0x1b },
+	'luminancenoisereductioncontrast' => { 288 => 'LuminanceNoiseReductionContrast' },
+	'luminancenoisereductiondetail' => { 288 => 'LuminanceNoiseReductionDetail' },
+	'luminancenr_tiff_jpeg' => { 78 => 0x6d },
+	'luminancesmoothing' => { 288 => 'LuminanceSmoothing' },
+	'm16cversion' => { 219 => 0x333 },
+	'macro' => { 89 => 0x1020, 90 => 0x202, 209 => 0x202, 262 => 0x21, 269 => 0x202, 276 => 0xb040 },
+	'macromagnification' => { 4 => 0x1b, 7 => 0x1b, 10 => 0x1b, 11 => 0x1b, 15 => 0x1b, 16 => 0x1b, 38 => 0x10 },
+	'macromode' => { 24 => 0x1, 131 => 0xb, 204 => 0x300, 224 => 0x1c },
+	'magicfilter' => { 204 => 0x52c },
+	'magnifiedview' => { 61 => 0x11, 63 => 0x9 },
+	'maindialexposurecomp' => { 202 => '0.6' },
+	'make' => { 73 => 0x0, 85 => 0x10f, 113 => 'Make', 215 => 'Make', 226 => 0x10f, 306 => 'Make' },
+	'makernote' => { 292 => 'MakerNote' },
+	'makernotecanon' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotecasio' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotecasio2' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotefujifilm' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotege' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotege2' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotehp' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotehp2' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotehp4' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotehp6' => { 84 => 'MakN', 85 => 0x927c },
+	'makernoteisl' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotejvc' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotejvctext' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotekodak10' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotekodak1a' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotekodak1b' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotekodak2' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotekodak3' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotekodak4' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotekodak5' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotekodak6a' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotekodak6b' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotekodak7' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotekodak8a' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotekodak8b' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotekodak9' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotekodakunknown' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotekyocera' => { 84 => 'MakN', 85 => 0x927c },
+	'makernoteleica' => { 84 => 'MakN', 85 => 0x927c },
+	'makernoteleica2' => { 84 => 'MakN', 85 => 0x927c },
+	'makernoteleica3' => { 84 => 'MakN', 85 => 0x927c },
+	'makernoteleica4' => { 84 => 'MakN', 85 => 0x927c },
+	'makernoteleica5' => { 84 => 'MakN', 85 => 0x927c },
+	'makernoteleica6' => { 84 => 'MakN', 85 => 0x927c },
+	'makernoteminolta' => { 84 => 'MakN', 85 => 0x927c },
+	'makernoteminolta2' => { 84 => 'MakN', 85 => 0x927c },
+	'makernoteminolta3' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotenikon' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotenikon2' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotenikon3' => { 84 => 'MakN', 85 => 0x927c },
+	'makernoteoffset' => { 269 => 0xff },
+	'makernoteolympus' => { 84 => 'MakN', 85 => 0x927c },
+	'makernoteolympus2' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotepanasonic' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotepanasonic2' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotepentax' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotepentax2' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotepentax3' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotepentax4' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotepentax5' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotephaseone' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotereconyx' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotericoh' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotericohtext' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotesafety' => { 85 => 0xc635 },
+	'makernotesamsung1a' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotesamsung1b' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotesamsung2' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotesanyo' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotesanyoc4' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotesanyopatch' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotesigma' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotesony' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotesony2' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotesony3' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotesony4' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotesonyericsson' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotesonysrf' => { 84 => 'MakN', 85 => 0x927c },
+	'makernotetype' => { 263 => 0x1 },
+	'makernoteunknown' => { 84 => 'MakN', 85 => 0x927c },
+	'makernoteunknowntext' => { 84 => 'MakN', 85 => 0x927c },
+	'makernoteversion' => { 135 => 0x0, 160 => 0x1, 209 => 0x0, 224 => 0x8000, 266 => 0x0, 267 => 0x1, 270 => 0x1d, 273 => 0x2000 },
+	'managedfrom' => { 311 => 'ManagedFrom' },
+	'managedfromalternatepaths' => { 311 => [\'ManagedFrom','ManagedFromAlternatePaths'] },
+	'managedfromdocumentid' => { 311 => [\'ManagedFrom','ManagedFromDocumentID'] },
+	'managedfromfilepath' => { 311 => [\'ManagedFrom','ManagedFromFilePath'] },
+	'managedfromfrompart' => { 311 => [\'ManagedFrom','ManagedFromFromPart'] },
+	'managedfrominstanceid' => { 311 => [\'ManagedFrom','ManagedFromInstanceID'] },
+	'managedfromlastmodifydate' => { 311 => [\'ManagedFrom','ManagedFromLastModifyDate'] },
+	'managedfrommanager' => { 311 => [\'ManagedFrom','ManagedFromManager'] },
+	'managedfrommanagervariant' => { 311 => [\'ManagedFrom','ManagedFromManagerVariant'] },
+	'managedfrommanageto' => { 311 => [\'ManagedFrom','ManagedFromManageTo'] },
+	'managedfrommanageui' => { 311 => [\'ManagedFrom','ManagedFromManageUI'] },
+	'managedfrommaskmarkers' => { 311 => [\'ManagedFrom','ManagedFromMaskMarkers'] },
+	'managedfromoriginaldocumentid' => { 311 => [\'ManagedFrom','ManagedFromOriginalDocumentID'] },
+	'managedfrompartmapping' => { 311 => [\'ManagedFrom','ManagedFromPartMapping'] },
+	'managedfromrenditionclass' => { 311 => [\'ManagedFrom','ManagedFromRenditionClass'] },
+	'managedfromrenditionparams' => { 311 => [\'ManagedFrom','ManagedFromRenditionParams'] },
+	'managedfromtopart' => { 311 => [\'ManagedFrom','ManagedFromToPart'] },
+	'managedfromversionid' => { 311 => [\'ManagedFrom','ManagedFromVersionID'] },
+	'manager' => { 311 => 'Manager' },
+	'managervariant' => { 311 => 'ManagerVariant' },
+	'manageto' => { 311 => 'ManageTo' },
+	'manageui' => { 311 => 'ManageUI' },
+	'manifest' => { 311 => 'Manifest' },
+	'manifestlinkform' => { 311 => [\'Manifest','ManifestLinkForm'] },
+	'manifestplacedresolutionunit' => { 311 => [\'Manifest','ManifestPlacedResolutionUnit'] },
+	'manifestplacedxresolution' => { 311 => [\'Manifest','ManifestPlacedXResolution'] },
+	'manifestplacedyresolution' => { 311 => [\'Manifest','ManifestPlacedYResolution'] },
+	'manifestreference' => { 311 => [\'Manifest','ManifestReference'] },
+	'manifestreferencealternatepaths' => { 311 => [\'Manifest','ManifestReferenceAlternatePaths'] },
+	'manifestreferencedocumentid' => { 311 => [\'Manifest','ManifestReferenceDocumentID'] },
+	'manifestreferencefilepath' => { 311 => [\'Manifest','ManifestReferenceFilePath'] },
+	'manifestreferencefrompart' => { 311 => [\'Manifest','ManifestReferenceFromPart'] },
+	'manifestreferenceinstanceid' => { 311 => [\'Manifest','ManifestReferenceInstanceID'] },
+	'manifestreferencelastmodifydate' => { 311 => [\'Manifest','ManifestReferenceLastModifyDate'] },
+	'manifestreferencemanager' => { 311 => [\'Manifest','ManifestReferenceManager'] },
+	'manifestreferencemanagervariant' => { 311 => [\'Manifest','ManifestReferenceManagerVariant'] },
+	'manifestreferencemanageto' => { 311 => [\'Manifest','ManifestReferenceManageTo'] },
+	'manifestreferencemanageui' => { 311 => [\'Manifest','ManifestReferenceManageUI'] },
+	'manifestreferencemaskmarkers' => { 311 => [\'Manifest','ManifestReferenceMaskMarkers'] },
+	'manifestreferenceoriginaldocumentid' => { 311 => [\'Manifest','ManifestReferenceOriginalDocumentID'] },
+	'manifestreferencepartmapping' => { 311 => [\'Manifest','ManifestReferencePartMapping'] },
+	'manifestreferencerenditionclass' => { 311 => [\'Manifest','ManifestReferenceRenditionClass'] },
+	'manifestreferencerenditionparams' => { 311 => [\'Manifest','ManifestReferenceRenditionParams'] },
+	'manifestreferencetopart' => { 311 => [\'Manifest','ManifestReferenceToPart'] },
+	'manifestreferenceversionid' => { 311 => [\'Manifest','ManifestReferenceVersionID'] },
+	'manometerpressure' => { 204 => 0x900 },
+	'manometerreading' => { 204 => 0x901 },
+	'manualafpointselectpattern' => { 59 => 0x513 },
+	'manualexposuretime' => { 134 => 0x6 },
+	'manualflash' => { 207 => 0x1209 },
+	'manualflashoutput' => { 24 => 0x29, 198 => '8.2', 199 => '22.2', 200 => '16.2', 201 => '23.2', 202 => '8.2', 203 => '24.2' },
+	'manualflashstrength' => { 204 => 0x406 },
+	'manualfnumber' => { 134 => 0x7 },
+	'manualfocusdistance' => { 160 => 0x85, 209 => 0x100c, 269 => 0x223 },
+	'manualtv' => { 58 => 0x5, 59 => 0x705 },
+	'manufacturedate' => { 231 => 0x1 },
+	'manufacturedate1' => { 265 => 0x4 },
+	'manufacturedate2' => { 265 => 0x5 },
+	'marked' => { 298 => 'Marked', 314 => 'Marked' },
+	'markers' => { 310 => 'markers' },
+	'markerscomment' => { 310 => [\'markers','markersComment'] },
+	'markerscuepointparams' => { 310 => [\'markers','markersCuePointParams'] },
+	'markerscuepointparamskey' => { 310 => [\'markers','markersCuePointParamsKey'] },
+	'markerscuepointparamsvalue' => { 310 => [\'markers','markersCuePointParamsValue'] },
+	'markerscuepointtype' => { 310 => [\'markers','markersCuePointType'] },
+	'markersduration' => { 310 => [\'markers','markersDuration'] },
+	'markerslocation' => { 310 => [\'markers','markersLocation'] },
+	'markersname' => { 310 => [\'markers','markersName'] },
+	'markersprobability' => { 310 => [\'markers','markersProbability'] },
+	'markersspeaker' => { 310 => [\'markers','markersSpeaker'] },
+	'markersstarttime' => { 310 => [\'markers','markersStartTime'] },
+	'markerstarget' => { 310 => [\'markers','markersTarget'] },
+	'markerstype' => { 310 => [\'markers','markersType'] },
+	'maskedareas' => { 85 => 0xc68e },
+	'masterdocumentid' => { 92 => 0xb9 },
+	'mastergain' => { 165 => 0x50 },
+	'maxaperture' => { 24 => 0x1a, 103 => 0x6103, 120 => 'MaxAperture', 131 => 0x17, 241 => '14.1' },
+	'maxapertureatcurrentfocal' => { 205 => 0x20a },
+	'maxapertureatmaxfocal' => { 89 => 0x1407, 120 => 'MaxApertureAtMaxFocal', 157 => 0xb, 158 => 0x10, 159 => 0x11, 205 => 0x206 },
+	'maxapertureatminfocal' => { 89 => 0x1406, 157 => 0xa, 158 => 0xf, 159 => 0x10, 205 => 0x205 },
+	'maxaperturevalue' => { 85 => 0x9205, 292 => 'MaxApertureValue' },
+	'maxavailheight' => { 294 => 'MaxAvailHeight' },
+	'maxavailwidth' => { 294 => 'MaxAvailWidth' },
+	'maxcontinuousrelease' => { 197 => 0xb, 200 => 0xc, 201 => 0xb },
+	'maxfaces' => { 208 => 0x1202 },
+	'maxfocallength' => { 89 => 0x1405, 120 => 'MaxFocalLength', 157 => 0x9, 158 => 0xe, 159 => 0xf, 205 => 0x208 },
+	'maximumdensityrange' => { 94 => 0x8c },
+	'maxpagesize' => { 315 => 'MaxPageSize' },
+	'maxpagesizeh' => { 315 => [\'MaxPageSize','MaxPageSizeH'] },
+	'maxpagesizeunit' => { 315 => [\'MaxPageSize','MaxPageSizeUnit'] },
+	'maxpagesizew' => { 315 => [\'MaxPageSize','MaxPageSizeW'] },
+	'maxsamplevalue' => { 85 => 0x119 },
+	'maxstorage' => { 305 => 'maxstorage' },
+	'mb-d10batteries' => { 197 => '12.6' },
+	'mb-d10batterytype' => { 200 => '13.3' },
+	'mb-d11batterytype' => { 201 => '2.3' },
+	'mb-d80batteries' => { 202 => '6.5' },
+	'mb-d80batterytype' => { 203 => '3.2' },
+	'mcuversion' => { 157 => 0xc, 158 => 0x11, 159 => 0x12 },
+	'md5digest' => { 121 => 'zmd5' },
+	'measuredev' => { 19 => 0x9, 54 => 0x3, 72 => 0x1814, 113 => 'MeasuredEV' },
+	'measuredev2' => { 9 => 0x8, 19 => 0x8, 54 => 0x17 },
+	'measuredev3' => { 9 => 0x9 },
+	'measuredlv' => { 219 => 0x312, 225 => 0x3407 },
+	'measuredrggb' => { 44 => 0x1 },
+	'measuredrggbdata' => { 30 => 0x287 },
+	'mediaconstraints' => { 300 => 'MediaConstraints' },
+	'mediasummarycode' => { 300 => 'MediaSummaryCode' },
+	'menubuttondisplayposition' => { 57 => 0xb, 60 => 0xa, 61 => 0xb, 64 => 0xb },
+	'menubuttonreturn' => { 65 => 0xb },
+	'menumonitorofftime' => { 200 => '8.2', 201 => '21.1', 203 => '22.1' },
+	'metadatadate' => { 308 => 'MetadataDate' },
+	'metadatamoddate' => { 310 => 'metadataModDate' },
+	'metering' => { 198 => '6.1' },
+	'meteringmode' => { 24 => 0x11, 85 => 0x9207, 99 => 0x1c, 131 => 0x7, 132 => 0x25, 134 => 0x12, 204 => 0x202, 247 => 0x17, 270 => 0x9, 271 => 0x15, 272 => 0x13, 292 => 'MeteringMode' },
+	'meteringmode2' => { 232 => '2.1' },
+	'meteringmode3' => { 232 => '16.1' },
+	'meteringoffscaleindicator' => { 134 => 0x53 },
+	'meteringtime' => { 197 => '22.2', 198 => '3.2', 199 => '17.1', 200 => '7.3', 201 => '18.1', 202 => '3.2', 203 => '19.1' },
+	'mieversion' => { 121 => '0Vers' },
+	'minaperture' => { 24 => 0x1b, 120 => 'MinAperture', 241 => '0.2' },
+	'minfocallength' => { 89 => 0x1404, 120 => 'MinFocalLength', 157 => 0x8, 158 => 0xd, 159 => 0xe, 205 => 0x207 },
+	'minoltadate' => { 131 => 0x15 },
+	'minoltaimagesize' => { 131 => 0x4, 132 => 0xc, 133 => 0x2, 135 => 0x103 },
+	'minoltamodelid' => { 131 => 0x25 },
+	'minoltaquality' => { 131 => 0x5, 132 => 0xd, 133 => 0x3, 135 => [0x102,0x103] },
+	'minoltatime' => { 131 => 0x16 },
+	'minormodelagedisclosure' => { 300 => 'MinorModelAgeDisclosure' },
+	'minsamplevalue' => { 85 => 0x118 },
+	'mirrorlockup' => { 57 => 0xc, 58 => 0xc, 59 => 0x60f, 60 => 0xb, 61 => 0xc, 62 => 0x6, 63 => 0x6, 64 => 0xc, 65 => 0x3 },
+	'mobilecountrycode' => { 287 => 'mcc' },
+	'mobilenetworkcode' => { 287 => 'mnc' },
+	'moddate' => { 215 => 'modify-date', 298 => 'ModDate' },
+	'model' => { 73 => 0x6, 85 => 0x110, 113 => 'Model', 215 => 'Model', 226 => 0x110, 306 => 'Model' },
+	'modelage' => { 294 => 'ModelAge' },
+	'modelingflash' => { 197 => '21.4', 200 => '26.4', 201 => '30.2', 202 => '7.4', 203 => '31.3' },
+	'modelreleaseid' => { 300 => 'ModelReleaseID' },
+	'modelreleasestatus' => { 300 => 'ModelReleaseStatus' },
+	'modificationdate' => { 301 => 'modificationDate' },
+	'modifiedcolortemp' => { 45 => 0x9 },
+	'modifieddigitalgain' => { 45 => 0xb },
+	'modifiedparamflag' => { 39 => 0x1 },
+	'modifiedpicturestyle' => { 45 => 0xa },
+	'modifiedsaturation' => { 204 => 0x504 },
+	'modifiedsensorbluelevel' => { 45 => 0x5 },
+	'modifiedsensorredlevel' => { 45 => 0x4 },
+	'modifiedsharpness' => { 45 => 0x2 },
+	'modifiedsharpnessfreq' => { 45 => 0x3 },
+	'modifiedtonecurve' => { 45 => 0x1 },
+	'modifiedwhitebalance' => { 45 => 0x8 },
+	'modifiedwhitebalanceblue' => { 45 => 0x7 },
+	'modifiedwhitebalancered' => { 45 => 0x6 },
+	'modifydate' => { 85 => 0x132, 114 => 'ModifyDate', 213 => 'ModDate', 214 => 'tIME', 258 => 'ModDate', 308 => 'ModifyDate' },
+	'moirefilter' => { 85 => 0xfe58, 288 => 'MoireFilter' },
+	'monitordisplayoff' => { 134 => 0x4c },
+	'monitorofftime' => { 197 => '18.2', 198 => '3.1', 202 => '3.1' },
+	'monochromecontrast' => { 78 => 0x3c },
+	'monochromefiltereffect' => { 78 => 0x3a, 247 => 0x73 },
+	'monochromelinear' => { 78 => 0x3d },
+	'monochromeoutputhighlightpoint' => { 78 => 0x41 },
+	'monochromeoutputshadowpoint' => { 78 => 0x42 },
+	'monochromerawhighlight' => { 78 => 0x7a },
+	'monochromerawhighlightpoint' => { 78 => 0x3f },
+	'monochromerawshadow' => { 78 => 0x83 },
+	'monochromerawshadowpoint' => { 78 => 0x40 },
+	'monochromesharpness' => { 78 => 0x3e },
+	'monochrometoning' => { 247 => 0x74 },
+	'monochrometoningeffect' => { 78 => 0x3b },
+	'monthdaycreated' => { 99 => 0x12, 108 => 0xe },
+	'moonphase' => { 259 => 0x12 },
+	'morepermissions' => { 286 => 'morePermissions' },
+	'motionsensitivity' => { 259 => 0x29 },
+	'multiburstimageheight' => { 276 => 0x1002 },
+	'multiburstimagewidth' => { 276 => 0x1001 },
+	'multiburstmode' => { 276 => 0x1000 },
+	'multicontrollerwhilemetering' => { 59 => 0x517 },
+	'multiexposureautogain' => { 161 => 0x3 },
+	'multiexposuremode' => { 161 => 0x1 },
+	'multiexposureshots' => { 161 => 0x2 },
+	'multiframenoisereduction' => { 276 => 0x200b },
+	'multipleexposuremode' => { 208 => 0x101c },
+	'multipleexposureset' => { 232 => '10.1' },
+	'multisample' => { 165 => 0x40 },
+	'multiselector' => { 197 => '9.4', 200 => '27.4' },
+	'multiselectorliveview' => { 197 => '4.3' },
+	'multiselectorplaybackmode' => { 197 => ['13.5','9.2'], 200 => '27.2' },
+	'multiselectorshootmode' => { 197 => '9.1', 200 => '27.1' },
+	'mycolormode' => { 47 => 0x2 },
+	'nativedigest' => { 292 => 'NativeDigest', 306 => 'NativeDigest' },
+	'ncdfileinfo' => { 97 => 0x414 },
+	'ndfilter' => { 54 => 0x1c },
+	'nefbitdepth' => { 160 => 0xe22 },
+	'nefcompression' => { 160 => 0x93 },
+	'neutraloutputhighlightpoint' => { 78 => 0x2f },
+	'neutraloutputshadowpoint' => { 78 => 0x30 },
+	'neutralrawcolortone' => { 78 => 0x28 },
+	'neutralrawcontrast' => { 78 => 0x2a },
+	'neutralrawhighlight' => { 78 => 0x78 },
+	'neutralrawhighlightpoint' => { 78 => 0x2d },
+	'neutralrawlinear' => { 78 => 0x2b },
+	'neutralrawsaturation' => { 78 => 0x29 },
+	'neutralrawshadow' => { 78 => 0x81 },
+	'neutralrawshadowpoint' => { 78 => 0x2e },
+	'neutralrawsharpness' => { 78 => 0x2c },
+	'newsphotoversion' => { 94 => 0x0 },
+	'nickname' => { 308 => 'Nickname' },
+	'nikoncapturedata' => { 160 => 0xe01 },
+	'nikoncaptureeditversions' => { 160 => 0xe13 },
+	'nikoncaptureoutput' => { 160 => 0xe1e },
+	'nikoncaptureversion' => { 160 => 0xe09 },
+	'nikoniccprofile' => { 160 => 0xe1d },
+	'nikonimagesize' => { 172 => '723.1', 173 => '732.1', 178 => 0x2c4 },
+	'noisefilter' => { 204 => 0x527 },
+	'noisereduction' => { 89 => 0x100b, 132 => 0xb0, 133 => 0x60, 134 => 0x3f, 160 => 0x95, 190 => 0x753dcbc0, 191 => 0x17, 204 => 0x50a, 209 => 0x103a, 224 => 0x2d, 247 => 0x49, 265 => 0x2a },
+	'noisereduction2' => { 208 => 0x1010 },
+	'noisereductionapplied' => { 85 => 0xc6f7 },
+	'noisereductionintensity' => { 191 => 0x9 },
+	'noisereductionmethod' => { 191 => 0x11 },
+	'noisereductionmode' => { 279 => 0x801e },
+	'noisereductionsharpness' => { 191 => 0xd },
+	'noisereductionvalue' => { 279 => 0x8027 },
+	'nomemorycard' => { 197 => '22.1', 198 => '0.3', 199 => '2.4', 200 => '33.7', 201 => '3.2', 202 => '0.3', 203 => '4.5' },
+	'nominalmaxaperture' => { 241 => 0xa },
+	'nominalminaperture' => { 241 => '10.1' },
+	'notes' => { 280 => 'Notes', 284 => 'notes' },
+	'npages' => { 315 => 'NPages' },
+	'nrwdata' => { 160 => 0x14 },
+	'nullrecord' => { 72 => 0x0 },
+	'number' => { 301 => 'number' },
+	'numberofbeats' => { 310 => 'numberOfBeats' },
+	'numberoffocuspoints' => { 201 => '0.3' },
+	'numfacepositions' => { 217 => 0x0 },
+	'numindexentries' => { 94 => 0x54 },
+	'object' => { 301 => 'object' },
+	'objectattributereference' => { 92 => 0x4 },
+	'objectcycle' => { 92 => 0x4b },
+	'objectdistance' => { 81 => 0x6, 82 => 0x2022 },
+	'objectname' => { 92 => 0x5 },
+	'objectpreviewdata' => { 92 => 0xca },
+	'objectpreviewfileformat' => { 92 => 0xc8 },
+	'objectpreviewfileversion' => { 92 => 0xc9 },
+	'objecttypereference' => { 92 => 0x3 },
+	'oecfcolumns' => { 292 => [\'OECF','OECFColumns'] },
+	'oecfnames' => { 292 => [\'OECF','OECFNames'] },
+	'oecfrows' => { 292 => [\'OECF','OECFRows'] },
+	'oecfvalues' => { 292 => [\'OECF','OECFValues'] },
+	'offsetschema' => { 85 => 0xea1d },
+	'okbutton' => { 201 => '15.1', 203 => '16.1' },
+	'oldsubfiletype' => { 85 => 0xff },
+	'olympusimageheight' => { 209 => 0x102f },
+	'olympusimagewidth' => { 209 => 0x102e },
+	'onetouchwb' => { 209 => 0x302 },
+	'opticalzoom' => { 101 => 0xfa3d, 103 => [0x6006,0xf006], 104 => 0x1000, 105 => 0xf, 108 => 0x1e, 120 => 'OpticalZoom' },
+	'opticalzoomcode' => { 54 => 0xa },
+	'opticalzoommode' => { 224 => 0x34 },
+	'opticalzoomon' => { 269 => 0x219 },
+	'optionenddate' => { 303 => 'optionEndDate' },
+	'opto-electricconvfactor' => { 292 => 'OECF' },
+	'ordernumber' => { 89 => 0x8002 },
+	'organisationinimagecode' => { 294 => 'OrganisationInImageCode' },
+	'organisationinimagename' => { 294 => 'OrganisationInImageName' },
+	'organization' => { 301 => 'organization' },
+	'orientation' => { 85 => 0x112, 226 => 0x112, 306 => 'Orientation' },
+	'orientationlinkedafpoint' => { 59 => 0x516 },
+	'originaldecisiondata' => { 83 => 'OriginalDecisionData' },
+	'originaldecisiondataoffset' => { 43 => 0x83 },
+	'originaldirectory' => { 221 => 0x408 },
+	'originaldocumentid' => { 311 => 'OriginalDocumentID' },
+	'originalfilename' => { 72 => 0x816, 97 => 0x3e9, 109 => 0x20, 221 => 0x407 },
+	'originalimageheight' => { 55 => 0xc, 88 => 0x1 },
+	'originalimagewidth' => { 55 => 0xb, 88 => 0x0 },
+	'originalrawfiledata' => { 85 => 0xc68c },
+	'originalrawfiledigest' => { 85 => 0xc71d },
+	'originalrawfilename' => { 85 => 0xc68b },
+	'originaltransmissionreference' => { 92 => 0x67 },
+	'originatingprogram' => { 92 => 0x41 },
+	'originplatform' => { 301 => 'originPlatform' },
+	'os' => { 290 => 'os' },
+	'otherconditions' => { 300 => 'OtherConditions' },
+	'otherconstraints' => { 300 => 'OtherConstraints' },
+	'otherimageinfo' => { 300 => 'OtherImageInfo' },
+	'otherlicensedocuments' => { 300 => 'OtherLicenseDocuments' },
+	'otherlicenseinfo' => { 300 => 'OtherLicenseInfo' },
+	'otherlicenserequirements' => { 300 => 'OtherLicenseRequirements' },
+	'outcue' => { 310 => 'outCue' },
+	'outcuescale' => { 310 => [\'outCue','outCueScale'] },
+	'outcuevalue' => { 310 => [\'outCue','outCueValue'] },
+	'outputimageheight' => { 143 => 0x3 },
+	'outputimagewidth' => { 143 => 0x2 },
+	'outputresolution' => { 143 => 0x4 },
+	'owner' => { 314 => 'Owner' },
+	'ownerid' => { 92 => 0xbc },
+	'ownername' => { 11 => 0x10f, 43 => 0x9, 72 => 0x810, 85 => [0xa430,0xfde8], 113 => 'OwnerName', 285 => 'OwnerName' },
+	'padding' => { 85 => 0xea1c },
+	'pageimage' => { 308 => [\'PageInfo','PageInfoImage'] },
+	'pageimageformat' => { 308 => [\'PageInfo','PageInfoFormat'] },
+	'pageimageheight' => { 308 => [\'PageInfo','PageInfoHeight'] },
+	'pageimagepagenumber' => { 308 => [\'PageInfo','PageInfoPageNumber'] },
+	'pageimagewidth' => { 308 => [\'PageInfo','PageInfoWidth'] },
+	'pageinfo' => { 308 => 'PageInfo' },
+	'pagename' => { 85 => 0x11d },
+	'pagenumber' => { 85 => 0x129 },
+	'pagerange' => { 301 => 'pageRange' },
+	'paintbasedcorrectionmasks' => { 288 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasks'] },
+	'paintbasedcorrections' => { 288 => 'PaintBasedCorrections' },
+	'paintcorrectionactive' => { 288 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionActive'] },
+	'paintcorrectionamount' => { 288 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionAmount'] },
+	'paintcorrectionbrightness' => { 288 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalBrightness'] },
+	'paintcorrectionclarity' => { 288 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalClarity'] },
+	'paintcorrectioncontrast' => { 288 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalContrast'] },
+	'paintcorrectionexposure' => { 288 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalExposure'] },
+	'paintcorrectionhue' => { 288 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalToningHue'] },
+	'paintcorrectionmaskcenterweight' => { 288 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCenterWeight'] },
+	'paintcorrectionmaskdabs' => { 288 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksDabs'] },
+	'paintcorrectionmaskflow' => { 288 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksFlow'] },
+	'paintcorrectionmaskfullx' => { 288 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksFullX'] },
+	'paintcorrectionmaskfully' => { 288 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksFullY'] },
+	'paintcorrectionmaskradius' => { 288 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksRadius'] },
+	'paintcorrectionmaskvalue' => { 288 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMaskValue'] },
+	'paintcorrectionmaskwhat' => { 288 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksWhat'] },
+	'paintcorrectionmaskzerox' => { 288 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksZeroX'] },
+	'paintcorrectionmaskzeroy' => { 288 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksZeroY'] },
+	'paintcorrectionsaturation' => { 288 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalSaturation','PaintBasedCorrectionsLocalToningSaturation'] },
+	'paintcorrectionsharpness' => { 288 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalSharpness'] },
+	'paintcorrectionwhat' => { 288 => [\'PaintBasedCorrections','PaintBasedCorrectionsWhat'] },
+	'panasonicexifversion' => { 224 => 0x26 },
+	'panasonicimageheight' => { 224 => 0x4c },
+	'panasonicimagewidth' => { 224 => 0x4b },
+	'panasonicrawversion' => { 226 => 0x1 },
+	'panasonictitle' => { 85 => 0xc6d2 },
+	'panasonictitle2' => { 85 => 0xc6d3 },
+	'panoramacropbottom' => { 277 => 0x7 },
+	'panoramacropleft' => { 277 => 0x4 },
+	'panoramacropright' => { 277 => 0x6 },
+	'panoramacroptop' => { 277 => 0x5 },
+	'panoramadirection' => { 50 => 0x5, 277 => 0x3 },
+	'panoramaframeheight' => { 277 => 0x9 },
+	'panoramaframenumber' => { 50 => 0x2 },
+	'panoramaframewidth' => { 277 => 0x8 },
+	'panoramafullheight' => { 277 => 0x2 },
+	'panoramafullwidth' => { 277 => 0x1 },
+	'panoramamode' => { 99 => 0x3c, 204 => 0x601 },
+	'panoramasourceheight' => { 277 => 0xb },
+	'panoramasourcewidth' => { 277 => 0xa },
+	'panoramicstitchcameramotion' => { 128 => 'PanoramicStitchCameraMotion', 129 => 0x1 },
+	'panoramicstitchmaptype' => { 128 => 'PanoramicStitchMapType', 129 => 0x2 },
+	'panoramicstitchphi0' => { 128 => 'PanoramicStitchPhi0', 129 => 0x5 },
+	'panoramicstitchphi1' => { 128 => 'PanoramicStitchPhi1', 129 => 0x6 },
+	'panoramicstitchtheta0' => { 128 => 'PanoramicStitchTheta0', 129 => 0x3 },
+	'panoramicstitchtheta1' => { 128 => 'PanoramicStitchTheta1', 129 => 0x4 },
+	'panoramicstitchversion' => { 129 => 0x0 },
+	'pantry' => { 311 => 'Pantry' },
+	'parallax' => { 89 => 0xb211 },
+	'parametricdarks' => { 288 => 'ParametricDarks' },
+	'parametrichighlights' => { 288 => 'ParametricHighlights' },
+	'parametrichighlightsplit' => { 288 => 'ParametricHighlightSplit' },
+	'parametriclights' => { 288 => 'ParametricLights' },
+	'parametricmidtonesplit' => { 288 => 'ParametricMidtoneSplit' },
+	'parametricshadows' => { 288 => 'ParametricShadows' },
+	'parametricshadowsplit' => { 288 => 'ParametricShadowSplit' },
+	'patientbirthdate' => { 281 => 'PatientDOB' },
+	'patientid' => { 281 => 'PatientID' },
+	'patientname' => { 281 => 'PatientName' },
+	'patientsex' => { 281 => 'PatientSex' },
+	'pdfversion' => { 298 => 'PDFVersion' },
+	'pentaximagesize' => { 247 => 0x9 },
+	'pentaxmodelid' => { 231 => 0x0, 247 => 0x5 },
+	'pentaxmodeltype' => { 247 => 0x1 },
+	'pentaxversion' => { 247 => 0x0 },
+	'people' => { 283 => 'People' },
+	'peripheralillumcentralradius' => { 279 => 0x8030 },
+	'peripheralillumcentralvalue' => { 279 => 0x8031 },
+	'peripheralillumination' => { 78 => 0x68 },
+	'peripheralilluminationon' => { 78 => 0x64 },
+	'peripheralillumperiphvalue' => { 279 => 0x8032 },
+	'peripherallighting' => { 55 => 0x2 },
+	'peripherallightingsetting' => { 56 => 0x5 },
+	'peripherallightingvalue' => { 55 => 0x6 },
+	'permissions' => { 303 => 'permissions' },
+	'person' => { 301 => 'person' },
+	'personinimage' => { 294 => 'PersonInImage' },
+	'perspectivehorizontal' => { 288 => 'PerspectiveHorizontal' },
+	'perspectiverotate' => { 288 => 'PerspectiveRotate' },
+	'perspectivescale' => { 288 => 'PerspectiveScale' },
+	'perspectivevertical' => { 288 => 'PerspectiveVertical' },
+	'pf0customfuncregistration' => { 67 => 0x1 },
+	'pf10retainprogramshift' => { 67 => 0xb },
+	'pf13drivepriority' => { 67 => 0xe },
+	'pf14disablefocussearch' => { 67 => 0xf },
+	'pf15disableafassistbeam' => { 67 => 0x10 },
+	'pf16autofocuspointshoot' => { 67 => 0x11 },
+	'pf17disableafpointsel' => { 67 => 0x12 },
+	'pf18enableautoafpointsel' => { 67 => 0x13 },
+	'pf19continuousshootspeed' => { 67 => 0x14 },
+	'pf19shootingspeedhigh' => { 66 => 0xa },
+	'pf19shootingspeedlow' => { 66 => 0x9 },
+	'pf1disableshootingmodes' => { 67 => 0x2 },
+	'pf1value' => { 66 => 0x1 },
+	'pf20limitcontinousshots' => { 67 => 0x15 },
+	'pf20maxcontinousshots' => { 66 => 0xb },
+	'pf21enablequietoperation' => { 67 => 0x16 },
+	'pf23felocktime' => { 66 => 0xd },
+	'pf23postreleasetime' => { 66 => 0xe },
+	'pf23settimerlengths' => { 67 => 0x18 },
+	'pf23shutterbuttontime' => { 66 => 0xc },
+	'pf24lightlcdduringbulb' => { 67 => 0x19 },
+	'pf25aemode' => { 66 => 0xf },
+	'pf25afmode' => { 66 => 0x12 },
+	'pf25afpointsel' => { 66 => 0x13 },
+	'pf25colormatrix' => { 66 => 0x17 },
+	'pf25defaultclearsettings' => { 67 => 0x1a },
+	'pf25drivemode' => { 66 => 0x11 },
+	'pf25imagesize' => { 66 => 0x14 },
+	'pf25meteringmode' => { 66 => 0x10 },
+	'pf25parameters' => { 66 => 0x16 },
+	'pf25wbmode' => { 66 => 0x15 },
+	'pf26shortenreleaselag' => { 67 => 0x1b },
+	'pf27reversedialrotation' => { 67 => 0x1c },
+	'pf27value' => { 66 => 0x18 },
+	'pf28noquickdialexpcomp' => { 67 => 0x1d },
+	'pf29quickdialswitchoff' => { 67 => 0x1e },
+	'pf2disablemeteringmodes' => { 67 => 0x3 },
+	'pf2value' => { 66 => 0x2 },
+	'pf30enlargementmode' => { 67 => 0x1f },
+	'pf31originaldecisiondata' => { 67 => 0x20 },
+	'pf3manualexposuremetering' => { 67 => 0x4 },
+	'pf3value' => { 66 => 0x3 },
+	'pf4exposuretimelimits' => { 67 => 0x5 },
+	'pf4exposuretimemax' => { 66 => 0x5 },
+	'pf4exposuretimemin' => { 66 => 0x4 },
+	'pf5aperturelimits' => { 67 => 0x6 },
+	'pf5aperturemax' => { 66 => 0x7 },
+	'pf5aperturemin' => { 66 => 0x6 },
+	'pf6presetshootingmodes' => { 67 => 0x7 },
+	'pf7bracketcontinuousshoot' => { 67 => 0x8 },
+	'pf8bracketshots' => { 66 => 0x8 },
+	'pf8setbracketshots' => { 67 => 0x9 },
+	'pf9changebracketsequence' => { 67 => 0xa },
+	'phasedetectaf' => { 141 => 0x6 },
+	'phonenumber' => { 114 => 'Phone' },
+	'photoeffect' => { 24 => 0x28 },
+	'photoeffecthistoryxml' => { 190 => 0xe9651831 },
+	'photoeffects' => { 190 => 0xab5eca5e },
+	'photoeffectsblue' => { 192 => 0x8 },
+	'photoeffectsgreen' => { 192 => 0x6 },
+	'photoeffectsred' => { 192 => 0x4 },
+	'photoeffectstype' => { 192 => 0x0 },
+	'photoinfoplayback' => { 197 => '17.6', 200 => '33.6' },
+	'photometricinterpretation' => { 85 => 0x106, 306 => 'PhotometricInterpretation' },
+	'photoshopquality' => { 255 => 0x0 },
+	'pictinfo' => { 269 => 0x208 },
+	'picturecontrol' => { 190 => 0xe2173c47 },
+	'picturecontrolactive' => { 193 => 0x0 },
+	'picturecontroladjust' => { 162 => 0x30 },
+	'picturecontrolbase' => { 162 => 0x18 },
+	'picturecontroldata' => { 160 => [0xbd,0x23] },
+	'picturecontrolmode' => { 193 => 0x13 },
+	'picturecontrolname' => { 162 => 0x4 },
+	'picturecontrolquickadjust' => { 162 => 0x31 },
+	'picturefinish' => { 132 => 0x71 },
+	'picturemode' => { 89 => 0x1031, 204 => 0x520, 247 => [0xb,0x33], 270 => 0x3d },
+	'picturemode2' => { 232 => 0x0 },
+	'picturemodebwfilter' => { 204 => 0x525 },
+	'picturemodecontrast' => { 204 => 0x523 },
+	'picturemodehue' => { 204 => 0x522 },
+	'picturemodesaturation' => { 204 => 0x521 },
+	'picturemodesharpness' => { 204 => 0x524 },
+	'picturemodetone' => { 204 => 0x526 },
+	'picturestyle' => { 5 => [0x4b,0x51], 6 => 0x6c, 7 => 0x86, 8 => 0x73, 12 => 0xab, 13 => 0xa7, 14 => 0xb0, 15 => 0x6c, 16 => 0xa7, 52 => 0xa, 78 => 0x2 },
+	'picturewizard' => { 267 => 0x21 },
+	'pitchangle' => { 246 => 0x2 },
+	'planarconfiguration' => { 85 => 0x11c, 306 => 'PlanarConfiguration' },
+	'platenames' => { 315 => 'PlateNames' },
+	'playbackmenustime' => { 199 => '20.1' },
+	'playbackmonitorofftime' => { 200 => '8.1', 201 => '35.1', 203 => '21.1' },
+	'playdisplay' => { 134 => 0x4e },
+	'plusversion' => { 300 => 'Version' },
+	'pngwarning' => { 215 => 'Warning' },
+	'portraitoutputhighlightpoint' => { 78 => 0x1d },
+	'portraitoutputshadowpoint' => { 78 => 0x1e },
+	'portraitrawcolortone' => { 78 => 0x16 },
+	'portraitrawcontrast' => { 78 => 0x18 },
+	'portraitrawhighlight' => { 78 => 0x76 },
+	'portraitrawhighlightpoint' => { 78 => 0x1b },
+	'portraitrawlinear' => { 78 => 0x19 },
+	'portraitrawsaturation' => { 78 => 0x17 },
+	'portraitrawshadow' => { 78 => 0x7f },
+	'portraitrawshadowpoint' => { 78 => 0x1c },
+	'portraitrawsharpness' => { 78 => 0x1a },
+	'portraitrefiner' => { 82 => 0x302b },
+	'postalcode' => { 118 => 'PostalCode' },
+	'postcropvignetteamount' => { 288 => 'PostCropVignetteAmount' },
+	'postcropvignettefeather' => { 288 => 'PostCropVignetteFeather' },
+	'postcropvignettemidpoint' => { 288 => 'PostCropVignetteMidpoint' },
+	'postcropvignetteroundness' => { 288 => 'PostCropVignetteRoundness' },
+	'postcropvignettestyle' => { 288 => 'PostCropVignetteStyle' },
+	'powersource' => { 230 => '0.1' },
+	'poweruptime' => { 160 => 0xb6 },
+	'precaptureframes' => { 209 => 0x300 },
+	'predictor' => { 85 => 0x13d },
+	'preflashreturnstrength' => { 173 => 0x28a },
+	'prefs' => { 92 => 0xdd, 254 => 'Prefs' },
+	'preservedfilename' => { 311 => 'PreservedFileName' },
+	'presetwhitebalance' => { 134 => 0x24, 279 => 0x8002 },
+	'presetwhitebalanceadj' => { 279 => 0x8014 },
+	'previewapplicationname' => { 85 => 0xc716 },
+	'previewapplicationversion' => { 85 => 0xc717 },
+	'previewbutton' => { 197 => ['14.1','15.1'], 200 => '29.1', 201 => '14.1' },
+	'previewbuttonplusdials' => { 197 => ['14.2','15.2'], 200 => '31.2' },
+	'previewcolorspace' => { 85 => 0xc71a },
+	'previewcropbottom' => { 253 => 0xef },
+	'previewcropleft' => { 253 => 0xec },
+	'previewcropright' => { 253 => 0xee },
+	'previewcroptop' => { 253 => 0xed },
+	'previewdatetime' => { 85 => 0xc71b },
+	'previewheight' => { 101 => 0xfa58 },
+	'previewimage' => { 82 => 0x2000, 83 => 'PreviewImage', 86 => 'PreviewImage', 87 => 0x4, 123 => 'data', 135 => 0x81, 209 => 0x280, 222 => 0x300, 276 => 0x2001 },
+	'previewimageborders' => { 247 => 0x3e },
+	'previewimageheight' => { 51 => 0x4 },
+	'previewimagelength' => { 51 => 0x2, 82 => 0x3, 85 => [0x117,0x202], 135 => 0x89, 163 => 0x202, 204 => 0x102, 209 => 0x1037, 247 => 0x3, 262 => 0x1e, 266 => 0x3, 270 => 0x1b, 273 => 0x202 },
+	'previewimagename' => { 123 => '1Name' },
+	'previewimagesize' => { 82 => 0x2, 106 => 0x2, 123 => 'ImageSize', 247 => 0x2, 270 => 0x1c, 276 => 0xb02c },
+	'previewimagestart' => { 51 => 0x5, 82 => 0x4, 85 => [0x111,0x201], 135 => 0x88, 163 => 0x201, 204 => 0x101, 209 => 0x1036, 247 => 0x4, 262 => 0x1c, 266 => 0x2, 270 => 0x1a, 273 => 0x201 },
+	'previewimagetype' => { 123 => '0Type' },
+	'previewimagevalid' => { 204 => 0x100, 209 => 0x1035 },
+	'previewimagewidth' => { 51 => 0x3 },
+	'previewquality' => { 51 => 0x1 },
+	'previewsettingsdigest' => { 85 => 0xc719 },
+	'previewsettingsname' => { 85 => 0xc718 },
+	'previewwidth' => { 101 => 0xfa57 },
+	'primaryafpoint' => { 141 => 0x7 },
+	'primarychromaticities' => { 85 => 0x13f, 306 => 'PrimaryChromaticities' },
+	'printim' => { 85 => 0xc4a5 },
+	'prioritysetupshutterrelease' => { 134 => 0x1d, 271 => 0x28 },
+	'privatertkinfo' => { 282 => 'privateRTKInfo' },
+	'processingsoftware' => { 85 => 0xb },
+	'processversion' => { 288 => 'ProcessVersion' },
+	'producer' => { 213 => 'Producer', 298 => 'Producer' },
+	'productid' => { 93 => 0x32 },
+	'productioncode' => { 231 => 0x2 },
+	'productorserviceconstraints' => { 300 => 'ProductOrServiceConstraints' },
+	'profilecalibrationsig' => { 85 => 0xc6f4 },
+	'profilecopyright' => { 85 => 0xc6fe },
+	'profileembedpolicy' => { 85 => 0xc6fd },
+	'profilehuesatmapdata1' => { 85 => 0xc6fa },
+	'profilehuesatmapdata2' => { 85 => 0xc6fb },
+	'profilehuesatmapdims' => { 85 => 0xc6f9 },
+	'profilelooktabledata' => { 85 => 0xc726 },
+	'profilelooktabledims' => { 85 => 0xc725 },
+	'profilename' => { 85 => 0xc6f8 },
+	'profiletonecurve' => { 85 => 0xc6fc },
+	'programiso' => { 224 => 0x3c },
+	'programline' => { 232 => '1.1' },
+	'programmode' => { 138 => 0x5 },
+	'programshift' => { 160 => 0xd },
+	'programversion' => { 92 => 0x46 },
+	'projectname' => { 310 => 'projectName' },
+	'projectref' => { 310 => 'projectRef' },
+	'projectrefpath' => { 310 => [\'projectRef','projectRefPath'] },
+	'projectreftype' => { 310 => [\'projectRef','projectRefType'] },
+	'propertyreleaseid' => { 300 => 'PropertyReleaseID' },
+	'propertyreleasestatus' => { 300 => 'PropertyReleaseStatus' },
+	'province-state' => { 92 => 0x5f },
+	'publicationdate' => { 301 => 'publicationDate' },
+	'publicationname' => { 301 => 'publicationName' },
+	'publisher' => { 289 => 'publisher' },
+	'pulldown' => { 310 => 'pullDown' },
+	'quality' => { 0 => 0x1, 24 => 0x3, 81 => 0x2, 82 => 0x3002, 89 => 0x1000, 99 => 0x9, 160 => 0x4, 180 => 0x3, 209 => 0x201, 219 => 0x300, 247 => 0x8, 252 => 0x2, 270 => 0x16, 271 => 0x56, 276 => [0x102,0xb047] },
+	'qualitymode' => { 82 => 0x8 },
+	'quantizationmethod' => { 94 => 0x78 },
+	'quickadjust' => { 193 => 0x2a },
+	'quickcontroldialinmeter' => { 59 => 0x703 },
+	'quickshot' => { 269 => 0x213 },
+	'rangefinder' => { 199 => '4.1' },
+	'rasterizedcaption' => { 92 => 0x7d },
+	'rating' => { 85 => 0x4746, 253 => 0xdf, 284 => 'rating', 290 => 'rating', 308 => 'Rating' },
+	'ratingpercent' => { 85 => 0x4749, 130 => 'Rating' },
+	'rawandjpgrecording' => { 57 => 0x8, 135 => 0x109, 232 => 0xd },
+	'rawbrightnessadj' => { 77 => 0x38 },
+	'rawcoloradj' => { 77 => 0x2e },
+	'rawcropbottom' => { 253 => 0xd4 },
+	'rawcropleft' => { 253 => 0xd1 },
+	'rawcropright' => { 253 => 0xd3 },
+	'rawcroptop' => { 253 => 0xd2 },
+	'rawcustomsaturation' => { 77 => 0x30 },
+	'rawcustomtone' => { 77 => 0x34 },
+	'rawdatauniqueid' => { 85 => 0xc65d },
+	'rawdepth' => { 137 => 0x10 },
+	'rawdevautogradation' => { 211 => 0x119 },
+	'rawdevcolorspace' => { 210 => 0x108, 211 => 0x109 },
+	'rawdevcontrastvalue' => { 210 => 0x106, 211 => 0x105 },
+	'rawdeveditstatus' => { 210 => 0x10b },
+	'rawdevengine' => { 210 => 0x109, 211 => 0x10b },
+	'rawdevexposurebiasvalue' => { 210 => 0x100, 211 => 0x100 },
+	'rawdevgradation' => { 211 => 0x112 },
+	'rawdevgraypoint' => { 210 => 0x103, 211 => 0x104 },
+	'rawdevmemorycoloremphasis' => { 210 => 0x105, 211 => 0x108 },
+	'rawdevnoisereduction' => { 210 => 0x10a, 211 => 0x10a },
+	'rawdevpicturemode' => { 211 => 0x10c },
+	'rawdevpm_bwfilter' => { 211 => 0x110 },
+	'rawdevpmcontrast' => { 211 => 0x10e },
+	'rawdevpmnoisefilter' => { 211 => 0x120 },
+	'rawdevpmpicturetone' => { 211 => 0x111 },
+	'rawdevpmsaturation' => { 211 => 0x10d },
+	'rawdevpmsharpness' => { 211 => 0x10f },
+	'rawdevsaturation3' => { 211 => 0x113 },
+	'rawdevsaturationemphasis' => { 210 => 0x104, 211 => 0x107 },
+	'rawdevsettings' => { 210 => 0x10c },
+	'rawdevsharpnessvalue' => { 210 => 0x107, 211 => 0x106 },
+	'rawdevversion' => { 210 => 0x0, 211 => 0x0 },
+	'rawdevwbfineadjustment' => { 210 => 0x102, 211 => 0x103 },
+	'rawdevwhitebalance' => { 211 => 0x101 },
+	'rawdevwhitebalancevalue' => { 210 => 0x101, 211 => 0x102 },
+	'rawfile' => { 85 => 0xfe4c },
+	'rawfilename' => { 288 => 'RawFileName' },
+	'rawimagecenter' => { 160 => 0x99 },
+	'rawimagedigest' => { 85 => 0xc71c },
+	'rawimagesize' => { 247 => 0x39 },
+	'rawinfoversion' => { 212 => 0x0 },
+	'rawjpgheight' => { 74 => 0x4 },
+	'rawjpgquality' => { 38 => 0x6, 74 => 0x1 },
+	'rawjpgsize' => { 38 => 0x7, 74 => 0x2 },
+	'rawjpgwidth' => { 74 => 0x3 },
+	'rawmeasuredrggb' => { 29 => 0x26a, 31 => 0x280, 33 => 0x194 },
+	'reardisplay' => { 197 => '12.3' },
+	'recognizedface1age' => { 218 => 0x20 },
+	'recognizedface1name' => { 218 => 0x4 },
+	'recognizedface1position' => { 218 => 0x18 },
+	'recognizedface2age' => { 218 => 0x50 },
+	'recognizedface2name' => { 218 => 0x34 },
+	'recognizedface2position' => { 218 => 0x48 },
+	'recognizedface3age' => { 218 => 0x80 },
+	'recognizedface3name' => { 218 => 0x64 },
+	'recognizedface3position' => { 218 => 0x78 },
+	'recognizedfaceflags' => { 224 => 0x63 },
+	'recommendedexposureindex' => { 85 => 0x8832 },
+	'recorddisplay' => { 134 => 0x4d },
+	'recordid' => { 72 => 0x1804 },
+	'recordingmode' => { 81 => 0x1, 252 => 0x1 },
+	'recordmode' => { 24 => 0x9, 82 => 0x3000 },
+	'recordshutterrelease' => { 269 => 0x217 },
+	'redbalance' => { 148 => 0x270, 209 => 0x1017, 226 => 0x11, 247 => 0x1c },
+	'redcurvelimits' => { 77 => 0x18a },
+	'redcurvepoints' => { 77 => 0x160 },
+	'redeyecorrection' => { 194 => 0x0 },
+	'redeyeinfo' => { 288 => 'RedEyeInfo' },
+	'redeyereduction' => { 134 => 0x41 },
+	'redhue' => { 288 => 'RedHue' },
+	'redsaturation' => { 288 => 'RedSaturation' },
+	'reductionmatrix1' => { 85 => 0xc625 },
+	'reductionmatrix2' => { 85 => 0xc626 },
+	'referenceblackwhite' => { 85 => 0x214, 306 => 'ReferenceBlackWhite' },
+	'referencedate' => { 92 => 0x2f },
+	'referencenumber' => { 92 => 0x32 },
+	'references' => { 114 => 'References' },
+	'referenceservice' => { 92 => 0x2d },
+	'regionappliedtodimensions' => { 297 => [\'Regions','RegionsAppliedToDimensions'] },
+	'regionappliedtodimensionsh' => { 297 => [\'Regions','RegionsAppliedToDimensionsH'] },
+	'regionappliedtodimensionsunit' => { 297 => [\'Regions','RegionsAppliedToDimensionsUnit'] },
+	'regionappliedtodimensionsw' => { 297 => [\'Regions','RegionsAppliedToDimensionsW'] },
+	'regionarea' => { 297 => [\'Regions','RegionsRegionListArea'] },
+	'regionaread' => { 297 => [\'Regions','RegionsRegionListAreaD'] },
+	'regionareah' => { 297 => [\'Regions','RegionsRegionListAreaH'] },
+	'regionareaunit' => { 297 => [\'Regions','RegionsRegionListAreaUnit'] },
+	'regionareaw' => { 297 => [\'Regions','RegionsRegionListAreaW'] },
+	'regionareax' => { 297 => [\'Regions','RegionsRegionListAreaX'] },
+	'regionareay' => { 297 => [\'Regions','RegionsRegionListAreaY'] },
+	'regionbarcodevalue' => { 297 => [\'Regions','RegionsRegionListBarCodeValue'] },
+	'regionconstraints' => { 300 => 'RegionConstraints' },
+	'regiondescription' => { 297 => [\'Regions','RegionsRegionListDescription'] },
+	'regionextensions' => { 297 => [\'Regions','RegionsRegionListExtensions'] },
+	'regionfocususage' => { 297 => [\'Regions','RegionsRegionListFocusUsage'] },
+	'regioninfo' => { 297 => 'Regions' },
+	'regioninfomp' => { 127 => 'RegionInfo' },
+	'regioninfompregions' => { 127 => [\'RegionInfo','RegionInfoRegions'] },
+	'regionlist' => { 297 => [\'Regions','RegionsRegionList'] },
+	'regionname' => { 297 => [\'Regions','RegionsRegionListName'] },
+	'regionpersondisplayname' => { 127 => [\'RegionInfo','RegionInfoRegionsPersonDisplayName'] },
+	'regionrectangle' => { 127 => [\'RegionInfo','RegionInfoRegionsRectangle'] },
+	'regionseealso' => { 297 => [\'Regions','RegionsRegionListSeeAlso'] },
+	'regiontype' => { 297 => [\'Regions','RegionsRegionListType'] },
+	'registryid' => { 294 => 'RegistryId' },
+	'registryitemid' => { 294 => [\'RegistryId','RegistryIdRegItemId'] },
+	'registryorganisationid' => { 294 => [\'RegistryId','RegistryIdRegOrgId'] },
+	'relatedaudiofile' => { 112 => 'data' },
+	'relatedaudiofilename' => { 112 => '1Name' },
+	'relatedaudiofiletype' => { 112 => '0Type' },
+	'relatedimagefileformat' => { 85 => 0x1000 },
+	'relatedimageheight' => { 85 => 0x1002 },
+	'relatedimagewidth' => { 85 => 0x1001 },
+	'relatedsoundfile' => { 85 => 0xa004, 292 => 'RelatedSoundFile' },
+	'relatedvideofile' => { 126 => 'data' },
+	'relatedvideofilename' => { 126 => '1Name' },
+	'relatedvideofiletype' => { 126 => '0Type' },
+	'relation' => { 289 => 'relation' },
+	'relativepeakaudiofilepath' => { 310 => 'relativePeakAudioFilePath' },
+	'relativetimestamp' => { 310 => 'relativeTimestamp' },
+	'relativetimestampscale' => { 310 => [\'relativeTimestamp','relativeTimestampScale'] },
+	'relativetimestampvalue' => { 310 => [\'relativeTimestamp','relativeTimestampValue'] },
+	'releasebuttontousedial' => { 197 => '17.8', 200 => '33.8', 201 => '17.6' },
+	'releasedate' => { 92 => 0x1e, 310 => 'releaseDate' },
+	'releasemode' => { 82 => 0x3001, 276 => 0xb049 },
+	'releasesetting' => { 72 => 0x1016 },
+	'releasetime' => { 92 => 0x23 },
+	'remoteonduration' => { 198 => '3.4', 199 => '17.2', 201 => '18.2', 202 => '4.3', 203 => '19.2' },
+	'renditionclass' => { 311 => 'RenditionClass' },
+	'renditionof' => { 311 => 'RenditionOf' },
+	'renditionofalternatepaths' => { 311 => [\'RenditionOf','RenditionOfAlternatePaths'] },
+	'renditionofdocumentid' => { 311 => [\'RenditionOf','RenditionOfDocumentID'] },
+	'renditionoffilepath' => { 311 => [\'RenditionOf','RenditionOfFilePath'] },
+	'renditionoffrompart' => { 311 => [\'RenditionOf','RenditionOfFromPart'] },
+	'renditionofinstanceid' => { 311 => [\'RenditionOf','RenditionOfInstanceID'] },
+	'renditionoflastmodifydate' => { 311 => [\'RenditionOf','RenditionOfLastModifyDate'] },
+	'renditionofmanager' => { 311 => [\'RenditionOf','RenditionOfManager'] },
+	'renditionofmanagervariant' => { 311 => [\'RenditionOf','RenditionOfManagerVariant'] },
+	'renditionofmanageto' => { 311 => [\'RenditionOf','RenditionOfManageTo'] },
+	'renditionofmanageui' => { 311 => [\'RenditionOf','RenditionOfManageUI'] },
+	'renditionofmaskmarkers' => { 311 => [\'RenditionOf','RenditionOfMaskMarkers'] },
+	'renditionoforiginaldocumentid' => { 311 => [\'RenditionOf','RenditionOfOriginalDocumentID'] },
+	'renditionofpartmapping' => { 311 => [\'RenditionOf','RenditionOfPartMapping'] },
+	'renditionofrenditionclass' => { 311 => [\'RenditionOf','RenditionOfRenditionClass'] },
+	'renditionofrenditionparams' => { 311 => [\'RenditionOf','RenditionOfRenditionParams'] },
+	'renditionoftopart' => { 311 => [\'RenditionOf','RenditionOfToPart'] },
+	'renditionofversionid' => { 311 => [\'RenditionOf','RenditionOfVersionID'] },
+	'renditionparams' => { 311 => 'RenditionParams' },
+	'repeatingflashcount' => { 152 => 0xd, 153 => 0xe, 154 => 0xe, 200 => '17.2', 201 => '24.2', 202 => '9.2', 203 => '25.2' },
+	'repeatingflashoutput' => { 200 => '17.1', 201 => '24.1', 202 => '9.1', 203 => '25.1' },
+	'repeatingflashrate' => { 152 => 0xc, 153 => 0xd, 154 => 0xd, 200 => '18.1', 201 => '25.1', 202 => '10.1', 203 => '26.1' },
+	'resampleparams' => { 310 => 'resampleParams' },
+	'resampleparamsquality' => { 310 => [\'resampleParams','resampleParamsQuality'] },
+	'resaved' => { 269 => 0x21e },
+	'resolution' => { 119 => 'Resolution' },
+	'resolutionmode' => { 270 => 0x4 },
+	'resolutionunit' => { 85 => 0x128, 95 => 0x2, 306 => 'ResolutionUnit' },
+	'restrictions' => { 303 => 'restrictions' },
+	'retouchhistory' => { 160 => 0x9e },
+	'retouchinfo' => { 288 => 'RetouchInfo' },
+	'reuse' => { 300 => 'Reuse' },
+	'reuseallowed' => { 313 => 'ReuseAllowed' },
+	'reuseprohibited' => { 303 => 'reuseProhibited' },
+	'reverseindicators' => { 197 => '12.1', 199 => '4.3', 200 => '33.5', 201 => '5.1', 203 => '6.2' },
+	'revision' => { 290 => 'revision' },
+	'rgbcurvelimits' => { 77 => 0x238 },
+	'rgbcurvepoints' => { 77 => 0x20e },
+	'ricohdate' => { 262 => 0x6 },
+	'ricohimageheight' => { 262 => 0x2 },
+	'ricohimagewidth' => { 262 => 0x0 },
+	'rightascension' => { 122 => 'RightAscension' },
+	'rights' => { 289 => 'rights' },
+	'rightsagent' => { 301 => 'rightsAgent', 303 => 'rightsAgent' },
+	'rightsowner' => { 303 => 'rightsOwner' },
+	'rollangle' => { 246 => 0x1 },
+	'romoperationmode' => { 72 => 0x80d },
+	'rotation' => { 21 => 0x17, 22 => 0x18, 71 => 0x3, 77 => 0x26e, 88 => 0x4, 122 => 'Rotation', 132 => [0x65,0x50], 133 => 0x46, 134 => 0x5a, 178 => '590.1', 190 => 0x76a43207, 224 => 0x30, 232 => '17.2', 253 => 0xd8, 271 => 0x3f, 272 => 0x3f },
+	'routing' => { 258 => 'Routing' },
+	'rowsperstrip' => { 85 => 0x116 },
+	'rpp' => { 284 => 'rpp' },
+	'safetyshift' => { 59 => 0x108 },
+	'safetyshiftinavortv' => { 57 => 0x10, 58 => 0x10, 60 => 0xf, 61 => 0x10, 64 => 0x10 },
+	'samplebits' => { 112 => 'SampleBits' },
+	'samplerate' => { 112 => 'SampleRate' },
+	'samplesperpixel' => { 85 => 0x115, 306 => 'SamplesPerPixel' },
+	'samplestructure' => { 94 => 0x5a },
+	'sanyoquality' => { 269 => 0x201 },
+	'sanyothumbnail' => { 269 => 0x100 },
+	'saturation' => { 6 => 0x6e, 8 => 0x76, 24 => 0xe, 34 => 0x1, 81 => 0xd, 82 => [0x3013,0x1f], 85 => [0xa409,0xfe55], 89 => 0x1003, 113 => 'Saturation', 131 => 0x1f, 132 => 0x32, 133 => 0x28, 134 => 0x1a, 138 => 0x1, 160 => [0x94,0xaa], 162 => 0x35, 224 => 0x40, 225 => 0x300d, 247 => 0x1f, 252 => 0xd, 259 => 0x27, 262 => 0x28, 270 => 0x10, 271 => 0x1e, 272 => 0x1b, 276 => 0x2005, 288 => 'Saturation', 292 => 'Saturation' },
+	'saturationadj' => { 77 => 0x116, 189 => 0x1, 193 => 0x2e, 279 => 0x8016 },
+	'saturationadjustmentaqua' => { 288 => 'SaturationAdjustmentAqua' },
+	'saturationadjustmentblue' => { 288 => 'SaturationAdjustmentBlue' },
+	'saturationadjustmentgreen' => { 288 => 'SaturationAdjustmentGreen' },
+	'saturationadjustmentmagenta' => { 288 => 'SaturationAdjustmentMagenta' },
+	'saturationadjustmentorange' => { 288 => 'SaturationAdjustmentOrange' },
+	'saturationadjustmentpurple' => { 288 => 'SaturationAdjustmentPurple' },
+	'saturationadjustmentred' => { 288 => 'SaturationAdjustmentRed' },
+	'saturationadjustmentyellow' => { 288 => 'SaturationAdjustmentYellow' },
+	'saturationfaithful' => { 15 => 0xfe, 48 => 0x68, 49 => 0x68 },
+	'saturationlandscape' => { 15 => 0xfc, 48 => 0x38, 49 => 0x38 },
+	'saturationmonochrome' => { 48 => 0x80, 49 => 0x80 },
+	'saturationneutral' => { 15 => 0xfd, 48 => 0x50, 49 => 0x50 },
+	'saturationportrait' => { 15 => 0xfb, 48 => 0x20, 49 => 0x20 },
+	'saturationsetting' => { 212 => 0x1010 },
+	'saturationstandard' => { 15 => 0xfa, 48 => 0x8, 49 => 0x8 },
+	'saturationunknown' => { 49 => 0x98 },
+	'saturationuserdef1' => { 15 => 0x100, 48 => 0x98, 49 => 0xb0 },
+	'saturationuserdef2' => { 15 => 0x101, 48 => 0xb0, 49 => 0xc8 },
+	'saturationuserdef3' => { 15 => 0x102, 48 => 0xc8, 49 => 0xe0 },
+	'saveid' => { 311 => 'SaveID' },
+	'scaletype' => { 310 => 'scaleType' },
+	'scanimageenhancer' => { 165 => 0x60 },
+	'scanningdirection' => { 94 => 0x64 },
+	'scene' => { 293 => 'Scene', 310 => 'scene' },
+	'scenearea' => { 207 => 0x211, 209 => 0x1031 },
+	'sceneassist' => { 160 => 0x9c },
+	'scenecapturetype' => { 85 => 0xa406, 292 => 'SceneCaptureType' },
+	'scenedetect' => { 207 => 0x210, 209 => 0x1030 },
+	'scenedetectdata' => { 207 => 0x212, 209 => 0x1033 },
+	'scenemode' => { 101 => 0xfa02, 135 => 0x100, 160 => 0x8f, 204 => 0x509, 209 => 0x403, 224 => 0x8001, 276 => 0xb023 },
+	'scenemodeused' => { 103 => [0x6002,0xf002] },
+	'sceneselect' => { 269 => 0x21f },
+	'scenetype' => { 85 => 0xa301, 292 => 'SceneType' },
+	'screentips' => { 197 => '12.7', 200 => '13.1', 201 => '4.4', 203 => '5.1' },
+	'section' => { 301 => 'section' },
+	'securityclassification' => { 85 => 0x9212 },
+	'selectableafpoint' => { 59 => 0x509 },
+	'selectafareaselectmode' => { 59 => 0x512 },
+	'selftimer' => { 24 => 0x2, 224 => 0x2e, 269 => 0x214 },
+	'selftimer2' => { 54 => 0x1d },
+	'selftimerinterval' => { 201 => '19.2' },
+	'selftimermode' => { 85 => 0x882b },
+	'selftimershotcount' => { 199 => '18.2', 201 => '19.3', 203 => '20.2' },
+	'selftimertime' => { 72 => 0x1806, 134 => 0x1f, 197 => '18.1', 198 => '3.3', 199 => '18.1', 200 => '7.2', 201 => '19.1', 202 => '3.3', 203 => '20.1' },
+	'seminfo' => { 85 => 0x8546 },
+	'sensingmethod' => { 85 => 0xa217, 292 => 'SensingMethod' },
+	'sensitivityadjust' => { 247 => 0x40 },
+	'sensitivitysteps' => { 232 => ['14.3','17.4'], 234 => 0x1 },
+	'sensitivitytype' => { 85 => 0x8830 },
+	'sensorareas' => { 267 => 0xa010 },
+	'sensorbitdepth' => { 225 => 0x312d },
+	'sensorbluelevel' => { 52 => 0x5 },
+	'sensorcleaning' => { 65 => 0xd },
+	'sensorfullheight' => { 96 => 0xf904 },
+	'sensorfullwidth' => { 96 => 0xf903 },
+	'sensorheight' => { 96 => 0xf901, 101 => 0xfa21, 137 => 0x8, 225 => 0x312c },
+	'sensorpixelsize' => { 160 => 0x9a },
+	'sensorredlevel' => { 52 => 0x4 },
+	'sensorsize' => { 113 => 'SensorSize', 247 => 0x35 },
+	'sensortemperature' => { 207 => 0x1500, 209 => 0x1007, 270 => 0x39 },
+	'sensorwidth' => { 96 => 0xf900, 101 => 0xfa20, 137 => 0xa, 225 => 0x312b },
+	'sequence' => { 259 => 0x7 },
+	'sequencenumber' => { 54 => 0x9, 82 => 0x301c, 89 => 0x1101, 99 => 0x1d, 224 => 0x2b, 276 => 0xb04a },
+	'sequenceshotinterval' => { 269 => 0x224 },
+	'sequentialshot' => { 269 => 0x20e },
+	'serialnumber' => { 43 => 0xc, 72 => 0x180b, 85 => [0xa431,0xfde9], 96 => 0xfa04, 98 => 0xfa00, 100 => 0xc354, 101 => 0xfa19, 110 => 0x0, 111 => 0xa8, 113 => 'SerialNumber', 160 => [0xa0,0x1d], 205 => 0x101, 209 => [0x404,0x101a], 219 => 0x303, 225 => 0x3103, 247 => 0x229, 259 => 0x15, 263 => 0x5, 270 => 0x2, 285 => 'SerialNumber' },
+	'serialnumberformat' => { 43 => 0x15, 72 => 0x183b },
+	'seriesdatetime' => { 281 => 'SeriesDateTime' },
+	'seriesdescription' => { 281 => 'SeriesDescription' },
+	'seriesmodality' => { 281 => 'SeriesModality' },
+	'seriesnumber' => { 281 => 'SeriesNumber' },
+	'serviceidentifier' => { 93 => 0x1e },
+	'setbuttoncrosskeysfunc' => { 62 => 0x0, 63 => 0x0 },
+	'setbuttonwhenshooting' => { 57 => 0x1, 59 => 0x704, 65 => 0xc },
+	'setfunctionwhenshooting' => { 60 => 0x0, 61 => 0x1, 64 => 0x1 },
+	'shadingcompensation' => { 204 => 0x50c },
+	'shadingcompensation2' => { 208 => 0x1012 },
+	'shadow' => { 270 => 0xe },
+	'shadowcompensation' => { 247 => 0x79 },
+	'shadowprotection' => { 189 => 0x0 },
+	'shadows' => { 85 => 0xfe52, 288 => 'Shadows' },
+	'shadowscale' => { 85 => 0xc633 },
+	'shadowtint' => { 288 => 'ShadowTint' },
+	'shakereduction' => { 248 => 0x1 },
+	'sharpendetail' => { 288 => 'SharpenDetail' },
+	'sharpenedgemasking' => { 288 => 'SharpenEdgeMasking' },
+	'sharpening' => { 225 => 0x300b },
+	'sharpeningadj' => { 193 => 0x2b },
+	'sharpenradius' => { 288 => 'SharpenRadius' },
+	'sharpness' => { 5 => [0x42,0x48], 6 => 0x72, 8 => 0x74, 24 => 0xf, 52 => 0x2, 81 => 0xb, 82 => [0x3011,0x21], 85 => [0xa40a,0xfe56], 89 => 0x1001, 99 => 0x6b, 108 => 0x37, 113 => 'Sharpness', 131 => 0x21, 132 => 0x30, 133 => 0x26, 134 => 0x18, 138 => 0x3, 160 => 0x6, 162 => 0x32, 209 => 0x100f, 224 => 0x41, 247 => 0x21, 252 => 0xb, 259 => 0x26, 262 => 0x22, 263 => 0x1003, 270 => 0x11, 271 => 0x1c, 272 => 0x19, 276 => 0x2006, 288 => 'Sharpness', 292 => 'Sharpness' },
+	'sharpnessadj' => { 77 => 0x25a, 279 => 0x801a },
+	'sharpnessfactor' => { 209 => 0x102a },
+	'sharpnessfaithful' => { 15 => 0xf5, 48 => 0x64, 49 => 0x64 },
+	'sharpnessfrequency' => { 5 => [0x41,0x47], 52 => 0x3 },
+	'sharpnesslandscape' => { 15 => 0xf3, 48 => 0x34, 49 => 0x34 },
+	'sharpnessmonochrome' => { 15 => 0xf6, 48 => 0x7c, 49 => 0x7c },
+	'sharpnessneutral' => { 15 => 0xf4, 48 => 0x4c, 49 => 0x4c },
+	'sharpnessovershoot' => { 279 => 0x801b },
+	'sharpnessportrait' => { 15 => 0xf2, 48 => 0x1c, 49 => 0x1c },
+	'sharpnesssetting' => { 204 => 0x506, 212 => 0x1013 },
+	'sharpnessstandard' => { 15 => 0xf1, 48 => 0x4, 49 => 0x4 },
+	'sharpnessthreshold' => { 279 => 0x801d },
+	'sharpnessundershoot' => { 279 => 0x801c },
+	'sharpnessunknown' => { 49 => 0x94 },
+	'sharpnessuserdef1' => { 15 => 0xf7, 48 => 0x94, 49 => 0xac },
+	'sharpnessuserdef2' => { 15 => 0xf8, 48 => 0xac, 49 => 0xc4 },
+	'sharpnessuserdef3' => { 15 => 0xf9, 48 => 0xc4, 49 => 0xdc },
+	'shootinginfodisplay' => { 197 => '13.2', 200 => '10.2', 201 => '4.1', 203 => '5.3' },
+	'shootinginfomonitorofftime' => { 200 => '9.1', 201 => '21.2', 203 => '22.2' },
+	'shootingmode' => { 113 => 'ShootingMode', 160 => 0x89, 224 => 0x1f },
+	'shootingmodesetting' => { 198 => '5.1' },
+	'shortdescription' => { 290 => 'shortdescription' },
+	'shortdocumentid' => { 92 => 0xba },
+	'shortfocal' => { 5 => 0xe, 6 => 0x11, 7 => 0x113, 8 => 0x11, 9 => [0x150,0x151], 10 => 0xd8, 12 => 0xf8, 13 => 0xec, 14 => 0x101, 15 => 0x93, 16 => 0xe8, 18 => 0xea, 20 => 0xf0, 24 => 0x18 },
+	'shortownername' => { 15 => 0xac },
+	'shortreleasetimelag' => { 59 => 0x80d },
+	'shotdate' => { 310 => 'shotDate' },
+	'shotday' => { 310 => 'shotDay' },
+	'shotlocation' => { 310 => 'shotLocation' },
+	'shotname' => { 310 => 'shotName' },
+	'shotnumber' => { 310 => 'shotNumber' },
+	'shotsize' => { 310 => 'shotSize' },
+	'shutter-aelock' => { 57 => 0x4, 59 => 0x701, 60 => 0x3, 61 => 0x4, 62 => 0x3, 63 => 0x3, 64 => 0x4, 65 => 0x2 },
+	'shutteraelbutton' => { 58 => 0x4 },
+	'shutterbuttonafonbutton' => { 59 => 0x701 },
+	'shuttercount' => { 7 => 0x176, 38 => 0x1, 160 => 0xa7, 166 => [0x6a,0x157,0x24d], 167 => 0x286, 168 => 0x279, 169 => 0x284, 170 => 0x242, 171 => 0x280, 172 => 0x276, 173 => [0x27d,0x27f], 174 => 0x246, 175 => 0x2d6, 176 => 0x287, 177 => 0x320, 178 => 0x24a, 179 => 0x2d5, 247 => 0x5d },
+	'shuttercurtainsync' => { 57 => 0xf, 58 => 0xf, 59 => 0x305, 60 => 0xe, 61 => 0xf, 62 => 0x8, 63 => 0x8, 64 => 0xf, 65 => 0x8 },
+	'shuttermode' => { 99 => 0x1b },
+	'shutterreleasebuttonae-l' => { 197 => '17.7', 199 => '16.1', 200 => '7.1', 201 => '17.5', 203 => '18.2' },
+	'shutterreleasemethod' => { 72 => 0x1010 },
+	'shutterreleasenocfcard' => { 57 => 0x2, 58 => 0x2, 65 => 0xf },
+	'shutterreleasetiming' => { 72 => 0x1011 },
+	'shutterspeedrange' => { 59 => 0x10c },
+	'shutterspeedvalue' => { 68 => 0x1, 85 => 0x9201, 209 => 0x1000, 292 => 'ShutterSpeedValue' },
+	'sidecarforextension' => { 299 => 'SidecarForExtension' },
+	'similarityindex' => { 92 => 0xe4 },
+	'singleframebracketing' => { 134 => 0x21 },
+	'slaveflashmeteringsegments' => { 247 => 0x20b },
+	'slowshutter' => { 54 => 0x8 },
+	'slowsync' => { 89 => 0x1030 },
+	'smartrange' => { 267 => 0xa012 },
+	'smoothness' => { 85 => 0xfe57, 288 => 'Smoothness' },
+	'software' => { 85 => 0x131, 114 => 'Software', 215 => 'Software', 270 => 0x18, 306 => 'Software' },
+	'softwareversion' => { 269 => 0x207 },
+	'sonydatetime' => { 278 => 0x6 },
+	'sonyimagesize' => { 134 => 0x3b, 271 => 0x54, 272 => 0x54 },
+	'sonymodelid' => { 276 => 0xb001 },
+	'sonyquality' => { 134 => 0x3c },
+	'source' => { 92 => 0x73, 215 => 'Source', 289 => 'source', 290 => 'source', 299 => 'Source' },
+	'sourcedirectoryindex' => { 238 => 0x0 },
+	'sourcefileindex' => { 238 => 0x2 },
+	'spatialfrequencyresponse' => { 292 => 'SpatialFrequencyResponse' },
+	'spatialfrequencyresponsecolumns' => { 292 => [\'SpatialFrequencyResponse','SpatialFrequencyResponseColumns'] },
+	'spatialfrequencyresponsenames' => { 292 => [\'SpatialFrequencyResponse','SpatialFrequencyResponseNames'] },
+	'spatialfrequencyresponserows' => { 292 => [\'SpatialFrequencyResponse','SpatialFrequencyResponseRows'] },
+	'spatialfrequencyresponsevalues' => { 292 => [\'SpatialFrequencyResponse','SpatialFrequencyResponseValues'] },
+	'speakerplacement' => { 310 => 'speakerPlacement' },
+	'specialeffectlevel' => { 82 => 0x3030 },
+	'specialeffectmode' => { 82 => 0x2076 },
+	'specialeffectsetting' => { 82 => 0x3031 },
+	'specialinstructions' => { 92 => 0x28 },
+	'specialmode' => { 209 => 0x200, 269 => 0x200 },
+	'spectralsensitivity' => { 85 => 0x8824, 292 => 'SpectralSensitivity' },
+	'splittoningbalance' => { 288 => 'SplitToningBalance' },
+	'splittoninghighlighthue' => { 288 => 'SplitToningHighlightHue' },
+	'splittoninghighlightsaturation' => { 288 => 'SplitToningHighlightSaturation' },
+	'splittoningshadowhue' => { 288 => 'SplitToningShadowHue' },
+	'splittoningshadowsaturation' => { 288 => 'SplitToningShadowSaturation' },
+	'spotfocuspointx' => { 131 => 0x2d },
+	'spotfocuspointy' => { 131 => 0x2e },
+	'spotmeteringmode' => { 24 => 0x27 },
+	'spotmeterlinktoafpoint' => { 59 => 0x107 },
+	'sractive' => { 232 => '17.1' },
+	'srawquality' => { 24 => 0x2e },
+	'srfocallength' => { 248 => 0x3 },
+	'srhalfpresstime' => { 248 => 0x2 },
+	'srresult' => { 248 => 0x0 },
+	'standardoutputhighlightpoint' => { 78 => 0x14 },
+	'standardoutputsensitivity' => { 85 => 0x8831 },
+	'standardoutputshadowpoint' => { 78 => 0x15 },
+	'standardrawcolortone' => { 78 => 0xd },
+	'standardrawcontrast' => { 78 => 0xf },
+	'standardrawhighlight' => { 78 => 0x75 },
+	'standardrawhighlightpoint' => { 78 => 0x12 },
+	'standardrawlinear' => { 78 => 0x10 },
+	'standardrawsaturation' => { 78 => 0xe },
+	'standardrawshadow' => { 78 => 0x7e },
+	'standardrawshadowpoint' => { 78 => 0x13 },
+	'standardrawsharpness' => { 78 => 0x11 },
+	'startingpage' => { 301 => 'startingPage' },
+	'startmovieshooting' => { 59 => 0x70d },
+	'starttimecode' => { 310 => 'startTimecode' },
+	'starttimecodetimeformat' => { 310 => [\'startTimecode','startTimecodeTimeFormat'] },
+	'starttimecodetimevalue' => { 310 => [\'startTimecode','startTimecodeTimeValue'] },
+	'starttimecodevalue' => { 310 => [\'startTimecode','startTimecodeValue'] },
+	'state' => { 118 => 'State', 224 => 0x6b, 299 => 'State' },
+	'status' => { 283 => 'Status' },
+	'storagemethod' => { 137 => 0x12 },
+	'straightenangle' => { 190 => 0x2fc08431 },
+	'stretchmode' => { 310 => 'stretchMode' },
+	'studydatetime' => { 281 => 'StudyDateTime' },
+	'studydescription' => { 281 => 'StudyDescription' },
+	'studyid' => { 281 => 'StudyID' },
+	'studyphysician' => { 281 => 'StudyPhysician' },
+	'sub-location' => { 92 => 0x5c },
+	'subfiledata' => { 121 => 'data' },
+	'subfiledirectory' => { 121 => '1Directory' },
+	'subfilemimetype' => { 121 => '2MIME' },
+	'subfilename' => { 121 => '1Name' },
+	'subfileresource' => { 121 => 'rsrc' },
+	'subfiletype' => { 85 => 0xfe, 121 => '0Type' },
+	'subject' => { 213 => 'Subject', 258 => 'Subject', 289 => 'subject', 298 => 'Subject' },
+	'subjectarea' => { 85 => 0x9214, 292 => 'SubjectArea' },
+	'subjectcode' => { 293 => 'SubjectCode' },
+	'subjectdistance' => { 85 => 0x9206, 99 => 0x3e, 292 => 'SubjectDistance' },
+	'subjectdistancerange' => { 85 => 0xa40c, 292 => 'SubjectDistanceRange' },
+	'subjectlocation' => { 85 => 0xa214, 292 => 'SubjectLocation' },
+	'subjectprogram' => { 131 => 0x22 },
+	'subjectreference' => { 92 => 0xc },
+	'subsectime' => { 85 => 0x9290 },
+	'subsectimedigitized' => { 85 => 0x9292 },
+	'subsectimeoriginal' => { 85 => 0x9291 },
+	'subsection1' => { 301 => 'subsection1' },
+	'subsection2' => { 301 => 'subsection2' },
+	'subsection3' => { 301 => 'subsection3' },
+	'subsection4' => { 301 => 'subsection4' },
+	'superimposeddisplay' => { 57 => 0xa, 59 => 0x510, 60 => 0x9, 61 => 0xa, 64 => 0xa, 65 => 0xe },
+	'supermacro' => { 43 => 0x1a },
+	'supplementalcategories' => { 92 => 0x14, 299 => 'SupplementalCategories' },
+	'supplementaltype' => { 94 => 0x37 },
+	'svisosetting' => { 232 => 0x14 },
+	'switchtoregisteredafpoint' => { 58 => 0x12, 59 => 0x50a },
+	'tagged' => { 253 => 0xdd, 284 => 'tagged' },
+	'tagslist' => { 291 => 'TagsList' },
+	'takenumber' => { 310 => 'takeNumber' },
+	'tapename' => { 310 => 'tapeName' },
+	'targetaperture' => { 54 => 0x4 },
+	'targetcompressionratio' => { 70 => 0x1 },
+	'targetdistancesetting' => { 72 => 0x1807 },
+	'targetexposuretime' => { 54 => 0x5 },
+	'targetimagetype' => { 72 => 0x100a },
+	'teaser' => { 301 => 'teaser' },
+	'teleconverter' => { 135 => 0x105, 276 => 0x105 },
+	'tempo' => { 310 => 'tempo' },
+	'termsandconditionstext' => { 300 => 'TermsAndConditionsText' },
+	'termsandconditionsurl' => { 300 => 'TermsAndConditionsURL' },
+	'textlayername' => { 299 => [\'TextLayers','TextLayersLayerName'] },
+	'textlayers' => { 299 => 'TextLayers' },
+	'textlayertext' => { 299 => [\'TextLayers','TextLayersLayerText'] },
+	'textstamp' => { 224 => [0x8008,0x8009,0x3b,0x3e] },
+	'thresholding' => { 85 => 0x107 },
+	'thumbnailfilename' => { 72 => 0x817 },
+	'thumbnailformat' => { 308 => [\'Thumbnails','ThumbnailsFormat'] },
+	'thumbnailheight' => { 101 => 0xfa55, 308 => [\'Thumbnails','ThumbnailsHeight'] },
+	'thumbnailimage' => { 72 => 0x2008, 83 => 'ThumbnailImage', 87 => 0x3, 124 => 'data', 209 => 0x100, 308 => [\'Thumbnails','ThumbnailsImage'] },
+	'thumbnailimagename' => { 124 => '1Name' },
+	'thumbnailimagesize' => { 124 => 'ImageSize' },
+	'thumbnailimagetype' => { 124 => '0Type' },
+	'thumbnailimagevalidarea' => { 43 => 0x13 },
+	'thumbnaillength' => { 85 => 0x202 },
+	'thumbnailoffset' => { 85 => 0x201 },
+	'thumbnails' => { 308 => 'Thumbnails' },
+	'thumbnailwidth' => { 101 => 0xfa54, 308 => [\'Thumbnails','ThumbnailsWidth'] },
+	'ticker' => { 301 => 'ticker' },
+	'tilelength' => { 85 => 0x143 },
+	'tilewidth' => { 85 => 0x142 },
+	'time' => { 97 => 0x401, 247 => 0x7 },
+	'timecreated' => { 92 => 0x3c, 99 => 0x14, 108 => 0x10, 254 => 'TimeCreated' },
+	'timeperiod' => { 301 => 'timePeriod' },
+	'timerfunctionbutton' => { 198 => '5.2', 199 => '12.1' },
+	'timerlength' => { 59 => 0x80c },
+	'timescaleparams' => { 310 => 'timeScaleParams' },
+	'timescaleparamsframeoverlappingpercentage' => { 310 => [\'timeScaleParams','timeScaleParamsFrameOverlappingPercentage'] },
+	'timescaleparamsframesize' => { 310 => [\'timeScaleParams','timeScaleParamsFrameSize'] },
+	'timescaleparamsquality' => { 310 => [\'timeScaleParams','timeScaleParamsQuality'] },
+	'timesent' => { 93 => 0x50 },
+	'timesignature' => { 310 => 'timeSignature' },
+	'timesincepoweron' => { 224 => 0x29 },
+	'timestamp' => { 7 => 0x45e, 15 => 0x11c, 215 => 'TimeStamp' },
+	'timestamp1' => { 7 => 0x45a },
+	'timezone' => { 182 => 0x0 },
+	'timezonecode' => { 75 => 0x1 },
+	'timezoneinfo' => { 75 => 0x2 },
+	'timezoneoffset' => { 85 => 0x882a },
+	'tint' => { 288 => 'Tint' },
+	'title' => { 114 => 'Title', 213 => 'Title', 215 => 'Title', 224 => 0x65, 258 => 'Title', 289 => 'title', 298 => 'Title' },
+	'tonecomp' => { 160 => 0x81 },
+	'tonecurve' => { 52 => 0x1, 247 => 0x402, 288 => 'ToneCurve' },
+	'tonecurve1' => { 267 => 0xa040 },
+	'tonecurve2' => { 267 => 0xa041 },
+	'tonecurve3' => { 267 => 0xa042 },
+	'tonecurve4' => { 267 => 0xa043 },
+	'tonecurveactive' => { 77 => 0x110 },
+	'tonecurvebluex' => { 279 => 0x9003 },
+	'tonecurvebluey' => { 279 => 0x9007 },
+	'tonecurvebrightnessx' => { 279 => 0x9000 },
+	'tonecurvebrightnessy' => { 279 => 0x9004 },
+	'tonecurvefilename' => { 97 => 0x1391 },
+	'tonecurvegreenx' => { 279 => 0x9002 },
+	'tonecurvegreeny' => { 279 => 0x9006 },
+	'tonecurveinterpolation' => { 77 => 0x159 },
+	'tonecurvemode' => { 77 => 0x113 },
+	'tonecurvename' => { 288 => 'ToneCurveName' },
+	'tonecurveproperty' => { 77 => 0x3c },
+	'tonecurveredx' => { 279 => 0x9001 },
+	'tonecurveredy' => { 279 => 0x9005 },
+	'tonecurves' => { 247 => 0x403 },
+	'toningeffect' => { 38 => 0xf, 160 => 0xb3, 162 => 0x38 },
+	'toningeffectfaithful' => { 48 => 0x74, 49 => 0x74 },
+	'toningeffectlandscape' => { 48 => 0x44, 49 => 0x44 },
+	'toningeffectmonochrome' => { 15 => 0x108, 48 => 0x8c, 49 => 0x8c },
+	'toningeffectneutral' => { 48 => 0x5c, 49 => 0x5c },
+	'toningeffectportrait' => { 48 => 0x2c, 49 => 0x2c },
+	'toningeffectstandard' => { 48 => 0x14, 49 => 0x14 },
+	'toningeffectunknown' => { 49 => 0xa4 },
+	'toningeffectuserdef1' => { 48 => 0xa4, 49 => 0xbc },
+	'toningeffectuserdef2' => { 48 => 0xbc, 49 => 0xd4 },
+	'toningeffectuserdef3' => { 48 => 0xd4, 49 => 0xec },
+	'toningsaturation' => { 162 => 0x39 },
+	'totalzoom' => { 99 => 0x62 },
+	'tracknumber' => { 310 => 'trackNumber' },
+	'tracks' => { 310 => 'Tracks' },
+	'tracksframerate' => { 310 => [\'Tracks','TracksFrameRate'] },
+	'tracksmarkers' => { 310 => [\'Tracks','TracksMarkers'] },
+	'tracksmarkerscomment' => { 310 => [\'Tracks','TracksMarkersComment'] },
+	'tracksmarkerscuepointparams' => { 310 => [\'Tracks','TracksMarkersCuePointParams'] },
+	'tracksmarkerscuepointparamskey' => { 310 => [\'Tracks','TracksMarkersCuePointParamsKey'] },
+	'tracksmarkerscuepointparamsvalue' => { 310 => [\'Tracks','TracksMarkersCuePointParamsValue'] },
+	'tracksmarkerscuepointtype' => { 310 => [\'Tracks','TracksMarkersCuePointType'] },
+	'tracksmarkersduration' => { 310 => [\'Tracks','TracksMarkersDuration'] },
+	'tracksmarkerslocation' => { 310 => [\'Tracks','TracksMarkersLocation'] },
+	'tracksmarkersname' => { 310 => [\'Tracks','TracksMarkersName'] },
+	'tracksmarkersprobability' => { 310 => [\'Tracks','TracksMarkersProbability'] },
+	'tracksmarkersspeaker' => { 310 => [\'Tracks','TracksMarkersSpeaker'] },
+	'tracksmarkersstarttime' => { 310 => [\'Tracks','TracksMarkersStartTime'] },
+	'tracksmarkerstarget' => { 310 => [\'Tracks','TracksMarkersTarget'] },
+	'tracksmarkerstype' => { 310 => [\'Tracks','TracksMarkersType'] },
+	'trackstrackname' => { 310 => [\'Tracks','TracksTrackName'] },
+	'trackstracktype' => { 310 => [\'Tracks','TracksTrackType'] },
+	'trailersignature' => { 121 => 'zmie' },
+	'transferfunction' => { 85 => 0x12d, 306 => 'TransferFunction' },
+	'transform' => { 224 => [0x8012,0x59] },
+	'transmissionreference' => { 299 => 'TransmissionReference' },
+	'trapped' => { 213 => 'Trapped', 298 => 'Trapped' },
+	'travelday' => { 224 => 0x36 },
+	'triggermode' => { 259 => 0x6 },
+	'ttl_da_adown' => { 239 => 0x5 },
+	'ttl_da_aup' => { 239 => 0x4 },
+	'ttl_da_bdown' => { 239 => 0x7 },
+	'ttl_da_bup' => { 239 => 0x6 },
+	'tungstenawb' => { 229 => 0x1 },
+	'tvexposuretimesetting' => { 232 => 0x12 },
+	'type' => { 289 => 'type', 305 => 'type' },
+	'uniquecameramodel' => { 85 => 0xc614 },
+	'uniquedocumentid' => { 92 => 0xbb },
+	'uniqueobjectname' => { 93 => 0x64 },
+	'unknownblock' => { 208 => 0x1103 },
+	'unknowncontrast' => { 78 => 0x45 },
+	'unknownev' => { 97 => 0x1 },
+	'unknownlinear' => { 78 => 0x46 },
+	'unknownmode' => { 82 => 0x301b },
+	'unknownnumber' => { 72 => 0x180b },
+	'unknownoutputhighlightpoint' => { 78 => 0x4a },
+	'unknownoutputshadowpoint' => { 78 => 0x4b },
+	'unknownrawhighlight' => { 78 => 0x7b },
+	'unknownrawhighlightpoint' => { 78 => 0x48 },
+	'unknownrawshadow' => { 78 => 0x84 },
+	'unknownrawshadowpoint' => { 78 => 0x49 },
+	'unknownsharpness' => { 78 => 0x47 },
+	'unsharp1color' => { 195 => 0x13 },
+	'unsharp1halowidth' => { 195 => 0x19 },
+	'unsharp1intensity' => { 195 => 0x17 },
+	'unsharp1threshold' => { 195 => 0x1b },
+	'unsharp2color' => { 195 => 0x2e },
+	'unsharp2halowidth' => { 195 => 0x34 },
+	'unsharp2intensity' => { 195 => 0x32 },
+	'unsharp2threshold' => { 195 => 0x36 },
+	'unsharp3color' => { 195 => 0x49 },
+	'unsharp3halowidth' => { 195 => 0x4f },
+	'unsharp3intensity' => { 195 => 0x4d },
+	'unsharp3threshold' => { 195 => 0x51 },
+	'unsharp4color' => { 195 => 0x64 },
+	'unsharp4halowidth' => { 195 => 0x6a },
+	'unsharp4intensity' => { 195 => 0x68 },
+	'unsharp4threshold' => { 195 => 0x6c },
+	'unsharpcount' => { 195 => 0x0 },
+	'unsharpmask' => { 78 => 0x90, 190 => 0x76a43200 },
+	'unsharpmaskfineness' => { 78 => 0x94 },
+	'unsharpmaskstrength' => { 78 => 0x92 },
+	'unsharpmaskthreshold' => { 78 => 0x96 },
+	'urgency' => { 92 => 0xa, 299 => 'Urgency' },
+	'url' => { 114 => 'URL', 215 => 'URL', 256 => 0x40b, 301 => 'url' },
+	'usablemeteringmodes' => { 59 => 0x10a },
+	'usableshootingmodes' => { 59 => 0x109 },
+	'usage' => { 302 => 'usage' },
+	'usagefee' => { 303 => 'usageFee' },
+	'usageterms' => { 314 => 'UsageTerms' },
+	'usercomment' => { 72 => 0x805, 85 => 0x9286, 292 => 'UserComment' },
+	'userdef1picturestyle' => { 15 => 0x10c, 48 => 0xd8, 49 => 0xf0 },
+	'userdef2picturestyle' => { 15 => 0x10e, 48 => 0xda, 49 => 0xf2 },
+	'userdef3picturestyle' => { 15 => 0x110, 48 => 0xdc, 49 => 0xf4 },
+	'userfields' => { 283 => 'UserFields' },
+	'userlabel' => { 259 => 0x2b },
+	'userprofile' => { 219 => 0x302, 225 => 0x3038 },
+	'usmlenselectronicmf' => { 58 => 0x7, 59 => 0x501 },
+	'utmeasting' => { 125 => 'Easting' },
+	'utmmapdatum' => { 125 => 'Datum' },
+	'utmnorthing' => { 125 => 'Northing' },
+	'utmzone' => { 125 => 'Zone' },
+	'uv-irfiltercorrection' => { 219 => 0x325 },
+	'validbits' => { 208 => 0x611, 209 => 0x102c },
+	'validpixeldepth' => { 212 => 0x611 },
+	'variousmodes' => { 99 => 0x26 },
+	'variousmodes2' => { 99 => 0x3a },
+	'variprogram' => { 160 => 0xab },
+	'version' => { 89 => 0x0, 258 => 'Version', 288 => 'Version' },
+	'versioncreatedate' => { 279 => 0xd100 },
+	'versionid' => { 311 => 'VersionID' },
+	'versionidentifier' => { 301 => 'versionIdentifier' },
+	'versionmodifydate' => { 279 => 0xd101 },
+	'versions' => { 311 => 'Versions' },
+	'versionscomments' => { 311 => [\'Versions','VersionsComments'] },
+	'versionsevent' => { 311 => [\'Versions','VersionsEvent'] },
+	'versionseventaction' => { 311 => [\'Versions','VersionsEventAction'] },
+	'versionseventchanged' => { 311 => [\'Versions','VersionsEventChanged'] },
+	'versionseventinstanceid' => { 311 => [\'Versions','VersionsEventInstanceID'] },
+	'versionseventparameters' => { 311 => [\'Versions','VersionsEventParameters'] },
+	'versionseventsoftwareagent' => { 311 => [\'Versions','VersionsEventSoftwareAgent'] },
+	'versionseventwhen' => { 311 => [\'Versions','VersionsEventWhen'] },
+	'versionsmodifier' => { 311 => [\'Versions','VersionsModifier'] },
+	'versionsmodifydate' => { 311 => [\'Versions','VersionsModifyDate'] },
+	'versionsversion' => { 311 => [\'Versions','VersionsVersion'] },
+	'verticalafonbutton' => { 197 => '3.2' },
+	'vfdisplayillumination' => { 59 => 0x510 },
+	'vibrance' => { 288 => 'Vibrance' },
+	'vibrationreduction' => { 166 => [0x75,0x82,0x1ae], 174 => '586.1', 178 => '590.2', 181 => 0x4 },
+	'videoalphamode' => { 310 => 'videoAlphaMode' },
+	'videoalphapremultiplecolor' => { 310 => 'videoAlphaPremultipleColor' },
+	'videoalphapremultiplecolora' => { 310 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorA'] },
+	'videoalphapremultiplecolorb' => { 310 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorB'] },
+	'videoalphapremultiplecolorblack' => { 310 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorBlack'] },
+	'videoalphapremultiplecolorblue' => { 310 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorBlue'] },
+	'videoalphapremultiplecolorcyan' => { 310 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorCyan'] },
+	'videoalphapremultiplecolorgreen' => { 310 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorGreen'] },
+	'videoalphapremultiplecolorl' => { 310 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorL'] },
+	'videoalphapremultiplecolormagenta' => { 310 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorMagenta'] },
+	'videoalphapremultiplecolormode' => { 310 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorMode'] },
+	'videoalphapremultiplecolorred' => { 310 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorRed'] },
+	'videoalphapremultiplecolorswatchname' => { 310 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorSwatchName'] },
+	'videoalphapremultiplecolortype' => { 310 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorType'] },
+	'videoalphapremultiplecoloryellow' => { 310 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorYellow'] },
+	'videoalphaunityistransparent' => { 310 => 'videoAlphaUnityIsTransparent' },
+	'videocodec' => { 46 => 0x74 },
+	'videocolorspace' => { 310 => 'videoColorSpace' },
+	'videocompressor' => { 310 => 'videoCompressor' },
+	'videofieldorder' => { 310 => 'videoFieldOrder' },
+	'videoframerate' => { 310 => 'videoFrameRate' },
+	'videoframesize' => { 310 => 'videoFrameSize' },
+	'videoframesizeh' => { 310 => [\'videoFrameSize','videoFrameSizeH'] },
+	'videoframesizeunit' => { 310 => [\'videoFrameSize','videoFrameSizeUnit'] },
+	'videoframesizew' => { 310 => [\'videoFrameSize','videoFrameSizeW'] },
+	'videomoddate' => { 310 => 'videoModDate' },
+	'videopixelaspectratio' => { 310 => 'videoPixelAspectRatio' },
+	'videopixeldepth' => { 310 => 'videoPixelDepth' },
+	'videoquality' => { 82 => 0x4003 },
+	'viewfinderdisplay' => { 197 => '12.4' },
+	'viewfinderwarning' => { 197 => '13.4', 201 => '3.5', 202 => '6.2', 203 => '4.4' },
+	'viewinfoduringexposure' => { 59 => 0x407 },
+	'vignetteamount' => { 288 => 'VignetteAmount' },
+	'vignettecontrol' => { 160 => 0x2a, 190 => 0x76a43205 },
+	'vignettecontrolintensity' => { 190 => 0xac6bd5c0 },
+	'vignettemidpoint' => { 288 => 'VignetteMidpoint' },
+	'voicememo' => { 269 => 0x216 },
+	'volume' => { 301 => 'volume' },
+	'vr_0x66' => { 166 => 0x66 },
+	'vrdoffset' => { 43 => 0xd0 },
+	'wb_bluepresetsfluorescent' => { 136 => 0x40a },
+	'wb_gbrglevels' => { 136 => 0xae, 139 => 0x4 },
+	'wb_glevel' => { 208 => 0x11f },
+	'wb_glevel3000k' => { 208 => 0x113 },
+	'wb_glevel3300k' => { 208 => 0x114 },
+	'wb_glevel3600k' => { 208 => 0x115 },
+	'wb_glevel3900k' => { 208 => 0x116 },
+	'wb_glevel4000k' => { 208 => 0x117 },
+	'wb_glevel4300k' => { 208 => 0x118 },
+	'wb_glevel4500k' => { 208 => 0x119 },
+	'wb_glevel4800k' => { 208 => 0x11a },
+	'wb_glevel5300k' => { 208 => 0x11b },
+	'wb_glevel6000k' => { 208 => 0x11c },
+	'wb_glevel6600k' => { 208 => 0x11d },
+	'wb_glevel7500k' => { 208 => 0x11e },
+	'wb_grbglevels' => { 147 => 0x0 },
+	'wb_rbgglevels' => { 144 => 0x0 },
+	'wb_rblevels' => { 160 => 0xc, 208 => 0x100 },
+	'wb_rblevels3000k' => { 208 => 0x102 },
+	'wb_rblevels3300k' => { 208 => 0x103 },
+	'wb_rblevels3600k' => { 208 => 0x104 },
+	'wb_rblevels3900k' => { 208 => 0x105 },
+	'wb_rblevels4000k' => { 208 => 0x106 },
+	'wb_rblevels4300k' => { 208 => 0x107 },
+	'wb_rblevels4500k' => { 208 => 0x108 },
+	'wb_rblevels4800k' => { 208 => 0x109 },
+	'wb_rblevels5300k' => { 208 => 0x10a },
+	'wb_rblevels6000k' => { 208 => 0x10b },
+	'wb_rblevels6600k' => { 208 => 0x10c },
+	'wb_rblevels7500k' => { 208 => 0x10d },
+	'wb_rblevelsauto' => { 212 => 0x110 },
+	'wb_rblevelscloudy' => { 138 => 0x10, 212 => 0x121 },
+	'wb_rblevelscoolwhitef' => { 138 => 0x14 },
+	'wb_rblevelscoolwhitefluor' => { 212 => 0x132 },
+	'wb_rblevelscwb1' => { 208 => 0x10e },
+	'wb_rblevelscwb2' => { 208 => 0x10f },
+	'wb_rblevelscwb3' => { 208 => 0x110 },
+	'wb_rblevelscwb4' => { 208 => 0x111 },
+	'wb_rblevelsdaylight' => { 138 => 0xc },
+	'wb_rblevelsdaylightf' => { 138 => 0x24 },
+	'wb_rblevelsdaylightfluor' => { 212 => 0x130 },
+	'wb_rblevelsdaywhitef' => { 138 => 0x28 },
+	'wb_rblevelsdaywhitefluor' => { 212 => 0x131 },
+	'wb_rblevelseveningsunlight' => { 212 => 0x124 },
+	'wb_rblevelsfineweather' => { 212 => 0x122 },
+	'wb_rblevelsflash' => { 138 => 0x18 },
+	'wb_rblevelsshade' => { 138 => 0x20, 212 => 0x120 },
+	'wb_rblevelstungsten' => { 138 => 0x8, 212 => 0x123 },
+	'wb_rblevelsunknown' => { 138 => 0x1c },
+	'wb_rblevelsused' => { 212 => 0x100 },
+	'wb_rblevelswhitef' => { 138 => 0x2c },
+	'wb_rblevelswhitefluorescent' => { 212 => 0x133 },
+	'wb_rbpresetcloudy' => { 136 => 0x3f0 },
+	'wb_rbpresetcoolwhitef' => { 136 => 0x308 },
+	'wb_rbpresetcustom' => { 136 => 0x424 },
+	'wb_rbpresetdaylight' => { 136 => 0x3ec },
+	'wb_rbpresetflash' => { 136 => [0x3f4,0x304] },
+	'wb_rbpresetshade' => { 136 => 0x418 },
+	'wb_rbpresettungsten' => { 136 => 0x3e8 },
+	'wb_redpresetsfluorescent' => { 136 => 0x3fc },
+	'wb_rgbglevels' => { 146 => 0x0 },
+	'wb_rgblevels' => { 136 => 0x96, 220 => 0xd, 221 => 0x413, 225 => 0x3036 },
+	'wb_rggblevels' => { 139 => 0x4, 145 => 0x0 },
+	'wb_rggblevelsasshot' => { 27 => 0x0, 28 => 0x19, 29 => 0x22, 30 => 0x3f, 33 => 0x3f },
+	'wb_rggblevelsauto' => { 25 => 0x0, 27 => 0x5, 28 => 0x1e, 29 => 0x18, 30 => 0x44, 33 => 0x44, 267 => 0xa022 },
+	'wb_rggblevelsblack' => { 267 => 0xa028 },
+	'wb_rggblevelscloudy' => { 25 => 0xc, 27 => 0x1e, 28 => 0x2d, 29 => 0x31, 30 => 0x58, 33 => 0x71, 247 => 0x20f },
+	'wb_rggblevelscustom' => { 25 => 0x1c, 30 => 0x80 },
+	'wb_rggblevelscustom1' => { 28 => 0x41 },
+	'wb_rggblevelscustom2' => { 28 => 0x46 },
+	'wb_rggblevelsdaylight' => { 25 => 0x4, 27 => 0x14, 28 => 0x23, 29 => 0x27, 30 => 0x4e, 33 => 0x67, 247 => 0x20d },
+	'wb_rggblevelsflash' => { 25 => 0x18, 27 => 0x32, 28 => 0x3c, 29 => 0x45, 30 => 0x6c, 33 => 0x85, 247 => 0x214 },
+	'wb_rggblevelsfluorescent' => { 25 => 0x14, 27 => 0x28, 28 => 0x37, 29 => 0x3b, 30 => 0x62, 33 => 0x7b },
+	'wb_rggblevelsfluorescentd' => { 247 => 0x211 },
+	'wb_rggblevelsfluorescentn' => { 247 => 0x212 },
+	'wb_rggblevelsfluorescentw' => { 247 => 0x213 },
+	'wb_rggblevelsilluminator1' => { 267 => 0xa023 },
+	'wb_rggblevelsilluminator2' => { 267 => 0xa024 },
+	'wb_rggblevelskelvin' => { 25 => 0x20, 27 => 0x2d, 29 => 0x40, 30 => 0x67, 33 => 0x80 },
+	'wb_rggblevelsmeasured' => { 27 => 0xa, 30 => 0x49, 33 => 0x49 },
+	'wb_rggblevelspc1' => { 29 => 0x90, 30 => 0x71 },
+	'wb_rggblevelspc2' => { 29 => 0x95, 30 => 0x76 },
+	'wb_rggblevelspc3' => { 29 => 0x9a, 30 => 0x7b },
+	'wb_rggblevelsshade' => { 25 => 0x8, 27 => 0x19, 28 => 0x28, 29 => 0x2c, 30 => 0x53, 33 => 0x6c, 247 => 0x20e },
+	'wb_rggblevelstungsten' => { 25 => 0x10, 27 => 0x23, 28 => 0x32, 29 => 0x36, 30 => 0x5d, 33 => 0x76, 247 => 0x210 },
+	'wb_rggblevelsuncorrected' => { 267 => 0xa021 },
+	'wb_rggblevelsunknown' => { 27 => 0xf, 29 => 0x1d, 33 => 0x4e },
+	'wb_rggblevelsunknown10' => { 27 => 0x5f, 29 => 0x72, 33 => 0x9e },
+	'wb_rggblevelsunknown11' => { 27 => 0x64, 29 => 0x77, 33 => 0xa3 },
+	'wb_rggblevelsunknown12' => { 27 => 0x69, 29 => 0x7c, 33 => 0xa8 },
+	'wb_rggblevelsunknown13' => { 27 => 0x6e, 29 => 0x81, 33 => 0xad },
+	'wb_rggblevelsunknown14' => { 29 => 0x86, 33 => 0xb2 },
+	'wb_rggblevelsunknown15' => { 29 => 0x8b, 33 => 0xb7 },
+	'wb_rggblevelsunknown16' => { 29 => 0x9f },
+	'wb_rggblevelsunknown2' => { 27 => 0x37, 29 => 0x4a, 33 => 0x53 },
+	'wb_rggblevelsunknown3' => { 27 => 0x3c, 29 => 0x4f, 33 => 0x58 },
+	'wb_rggblevelsunknown4' => { 27 => 0x41, 29 => 0x54, 33 => 0x5d },
+	'wb_rggblevelsunknown5' => { 27 => 0x46, 29 => 0x59, 33 => 0x62 },
+	'wb_rggblevelsunknown6' => { 27 => 0x4b, 29 => 0x5e, 33 => 0x8a },
+	'wb_rggblevelsunknown7' => { 27 => 0x50, 29 => 0x63, 33 => 0x8f },
+	'wb_rggblevelsunknown8' => { 27 => 0x55, 29 => 0x68, 33 => 0x94 },
+	'wb_rggblevelsunknown9' => { 27 => 0x5a, 29 => 0x6d, 33 => 0x99 },
+	'wbadjbluebalance' => { 196 => 0x8 },
+	'wbadjcolortemp' => { 77 => 0x1a },
+	'wbadjlighting' => { 196 => 0x15 },
+	'wbadjlightingsubtype' => { 196 => 0x14 },
+	'wbadjmode' => { 196 => 0x10 },
+	'wbadjredbalance' => { 196 => 0x0 },
+	'wbadjrgblevels' => { 77 => 0x8 },
+	'wbadjtemperature' => { 196 => 0x18 },
+	'wbadjtint' => { 196 => 0x25 },
+	'wbadjustab' => { 224 => 0x46 },
+	'wbadjustgm' => { 224 => 0x47 },
+	'wbbluelevel' => { 219 => 0x324, 224 => 0x8006, 226 => 0x26 },
+	'wbbracketmode' => { 38 => 0x9 },
+	'wbbracketvalueab' => { 38 => 0xc },
+	'wbbracketvaluegm' => { 38 => 0xd },
+	'wbfinetuneactive' => { 77 => 0x24 },
+	'wbfinetunesaturation' => { 77 => 0x28 },
+	'wbfinetunetone' => { 77 => 0x2c },
+	'wbgreenlevel' => { 219 => 0x323, 224 => 0x8005, 226 => 0x25 },
+	'wbmediaimagesizesetting' => { 59 => 0x708 },
+	'wbmode' => { 138 => 0x4, 209 => 0x1015 },
+	'wbredlevel' => { 219 => 0x322, 224 => 0x8004, 226 => 0x24 },
+	'wbscale' => { 139 => 0x0 },
+	'wbshiftab' => { 52 => 0xc, 233 => 0x10 },
+	'wbshiftgm' => { 52 => 0xd },
+	'wbshiftmg' => { 233 => 0x11 },
+	'webstatement' => { 314 => 'WebStatement' },
+	'whitebalance' => { 4 => 0x6f, 5 => [0x44,0x4a], 6 => 0x36, 7 => 0x5e, 8 => 0x36, 9 => [0x77,0x78], 10 => 0x6f, 11 => 0x6f, 12 => 0x73, 13 => 0x6f, 14 => 0x78, 15 => 0x54, 16 => 0x6f, 20 => 0x53, 52 => 0x8, 54 => 0x7, 81 => 0x7, 82 => [0x19,0x2012], 85 => [0xa403,0xfe4e], 89 => 0x1002, 97 => 0x3fc, 98 => 0xfa0d, 99 => 0x40, 131 => 0x3, 132 => 0xe, 133 => 0x4, 134 => 0xb, 135 => 0x115, 160 => 0x5, 180 => 0x7, 219 => 0x304, 224 => 0x3, 225 => 0x3033, 247 => 0x19, 252 => 0x7, 262 => 0x26, 270 => [0x3c,0x7], 276 => [0x115,0xb054], 288 => 'WhiteBalance', 292 => 'WhiteBalance' },
+	'whitebalance2' => { 204 => 0x500 },
+	'whitebalanceadj' => { 77 => 0x18, 190 => 0x76a43204 },
+	'whitebalanceautoadjustment' => { 229 => 0x0 },
+	'whitebalancebias' => { 82 => 0x2011, 209 => 0x304, 224 => 0x23 },
+	'whitebalanceblue' => { 52 => 0x7 },
+	'whitebalancebracket' => { 204 => 0x502, 209 => 0x303 },
+	'whitebalancebracketing' => { 134 => 0x22 },
+	'whitebalancecomp' => { 212 => 0x1001 },
+	'whitebalancefinetune' => { 89 => 0x100a, 134 => 0x38, 135 => 0x112, 160 => 0xb, 271 => 0x6, 276 => 0x112 },
+	'whitebalancemode' => { 247 => 0x1a },
+	'whitebalancered' => { 52 => 0x6 },
+	'whitebalanceset' => { 232 => 0xa },
+	'whitebalancesetting' => { 134 => 0x23 },
+	'whitebalancetemperature' => { 204 => 0x501 },
+	'whiteboard' => { 209 => 0x301 },
+	'whitelevel' => { 85 => 0xc61d },
+	'whitepoint' => { 85 => 0x13e, 247 => 0x201, 306 => 'WhitePoint' },
+	'widefocuszone' => { 131 => 0x2f },
+	'widerange' => { 269 => 0x20f },
+	'wordcount' => { 301 => 'wordCount' },
+	'workcolorspace' => { 77 => 0x270 },
+	'worldtimelocation' => { 224 => 0x3a, 247 => 0x22, 251 => '0.1' },
+	'writer-editor' => { 92 => 0x7a },
+	'x3filllight' => { 270 => 0x12 },
+	'xmp' => { 76 => 0xffff00f6, 86 => 'XMP' },
+	'xmptoolkit' => { 307 => 'xmptk' },
+	'xpauthor' => { 85 => 0x9c9d },
+	'xpcomment' => { 85 => 0x9c9c },
+	'xpkeywords' => { 85 => 0x9c9e },
+	'xposition' => { 85 => 0x11e },
+	'xpsubject' => { 85 => 0x9c9f },
+	'xptitle' => { 85 => 0x9c9b },
+	'xresolution' => { 85 => 0x11a, 95 => 0x3, 257 => 0x0, 306 => 'XResolution' },
+	'xyresolution' => { 88 => 0x3 },
+	'ycbcrcoefficients' => { 85 => 0x211, 306 => 'YCbCrCoefficients' },
+	'ycbcrpositioning' => { 85 => 0x213, 306 => 'YCbCrPositioning' },
+	'ycbcrsubsampling' => { 85 => 0x212, 306 => 'YCbCrSubSampling' },
+	'yearcreated' => { 99 => 0x10, 108 => 0xc },
+	'yposition' => { 85 => 0x11f },
+	'yresolution' => { 85 => 0x11b, 95 => 0x5, 257 => 0x4, 306 => 'YResolution' },
+	'zonematching' => { 135 => 0x10a, 138 => [0x3a,0x4a], 276 => 0xb024 },
+	'zonematchingmode' => { 134 => 0x14 },
+	'zonematchingon' => { 133 => 0x75 },
+	'zonematchingvalue' => { 271 => 0x1f },
+	'zoomedpreviewlength' => { 209 => 0xf05 },
+	'zoomedpreviewsize' => { 209 => 0xf06 },
+	'zoomedpreviewstart' => { 209 => 0xf04 },
+	'zoomsourcewidth' => { 24 => 0x24 },
+	'zoomstepcount' => { 207 => 0x300, 209 => 0x100d },
+	'zoomtargetwidth' => { 24 => 0x25 },
+);
+
+# lookup for non-writable tags to check if the name exists
+my %tagExists = (
+	'_ac3' => 1,
+	'_h264' => 1,
+	'_stream' => 1,
+	'a100dataoffset' => 1,
+	'abstract' => 1,
+	'accessdate' => 1,
+	'acdsee' => 1,
+	'actualcompensation' => 1,
+	'adobe' => 1,
+	'adobe_cm' => 1,
+	'adobecmtype' => 1,
+	'adobecrw' => 1,
+	'adobekoda' => 1,
+	'adobeleaf' => 1,
+	'adobemrw' => 1,
+	'adobepano' => 1,
+	'adobephotoshop' => 1,
+	'adoberaf' => 1,
+	'adobesr2' => 1,
+	'advancedcontentencryption' => 1,
+	'advancedmutualexcl' => 1,
+	'adventrevision' => 1,
+	'adventscale' => 1,
+	'aeflags' => 1,
+	'aeinfo' => 1,
+	'aeunknown' => 1,
+	'afarea' => 1,
+	'afareaheights' => 1,
+	'afareawidths' => 1,
+	'afareaxpositions' => 1,
+	'afareaypositions' => 1,
+	'afcp' => 1,
+	'afcp_iptc' => 1,
+	'afinfo' => 1,
+	'afinfo2' => 1,
+	'afinfo2version' => 1,
+	'afinfocus' => 1,
+	'afinfosize' => 1,
+	'afm' => 1,
+	'afmicroadj' => 1,
+	'afpointsinfocus1d' => 1,
+	'afpointsselected' => 1,
+	'aftune' => 1,
+	'aimetadata' => 1,
+	'aiprivatedata' => 1,
+	'album2' => 1,
+	'albumartist' => 1,
+	'albumcoverurl' => 1,
+	'albumname' => 1,
+	'albumsortorder' => 1,
+	'albumtitle' => 1,
+	'albumtitleid' => 1,
+	'aliaslayermetadata' => 1,
+	'alphabitdepth' => 1,
+	'alphabytecount' => 1,
+	'alphachannelsnames' => 1,
+	'alphacompression' => 1,
+	'alphadatadiscard' => 1,
+	'alphafilter' => 1,
+	'alphaidentifiers' => 1,
+	'alphainterlace' => 1,
+	'alphaoffset' => 1,
+	'alphasample' => 1,
+	'alternateduotonecolors' => 1,
+	'alternatespotcolors' => 1,
+	'ambienceinfo' => 1,
+	'animationextension' => 1,
+	'animationiterations' => 1,
+	'annotation' => 1,
+	'annotations' => 1,
+	'annotationusagerights' => 1,
+	'anta' => 1,
+	'aperture' => 1,
+	'aperturedisplayed' => 1,
+	'aperturesetting' => 1,
+	'apeversion' => 1,
+	'app14flags0' => 1,
+	'app14flags1' => 1,
+	'app1_profile' => 1,
+	'applestoreaccount' => 1,
+	'applestoreaccounttype' => 1,
+	'applestorecatalogid' => 1,
+	'applestorecountry' => 1,
+	'application' => 1,
+	'applicationdata' => 1,
+	'applicationmissingmsg' => 1,
+	'applicationversion' => 1,
+	'appversion' => 1,
+	'archivallocation' => 1,
+	'archivedfilename' => 1,
+	'arranger' => 1,
+	'arrangerkeywords' => 1,
+	'artist2' => 1,
+	'artistlen' => 1,
+	'artisturl' => 1,
+	'artwork' => 1,
+	'ascender' => 1,
+	'ascent' => 1,
+	'asfleakybucketpairs' => 1,
+	'asfpacketcount' => 1,
+	'asfsecurityobjectssize' => 1,
+	'aspectinfo' => 1,
+	'aspectratiotype' => 1,
+	'aspectratiox' => 1,
+	'aspectratioy' => 1,
+	'association' => 1,
+	'assumeddisplaysize' => 1,
+	'assumeddistanceview' => 1,
+	'atob0' => 1,
+	'atob1' => 1,
+	'atob2' => 1,
+	'attachedfile' => 1,
+	'attachedfiledata' => 1,
+	'attachedfiledescription' => 1,
+	'attachedfilemimetype' => 1,
+	'attachedfilename' => 1,
+	'attachedfilereferral' => 1,
+	'attachedfileuid' => 1,
+	'attachments' => 1,
+	'audiences' => 1,
+	'audioattributes' => 1,
+	'audioavgbitrate' => 1,
+	'audiobitspersample' => 1,
+	'audiobytes' => 1,
+	'audiocodec' => 1,
+	'audiocodecdescription' => 1,
+	'audiocodecid' => 1,
+	'audiocodecinfo' => 1,
+	'audiocodecname' => 1,
+	'audiodelay' => 1,
+	'audioencoding' => 1,
+	'audiofilesize' => 1,
+	'audiofileurl' => 1,
+	'audioformat' => 1,
+	'audioframesize' => 1,
+	'audiogain' => 1,
+	'audioheader' => 1,
+	'audioinfo' => 1,
+	'audiolayer' => 1,
+	'audiomaxbitrate' => 1,
+	'audiomode' => 1,
+	'audioprofile' => 1,
+	'audioprofileversion' => 1,
+	'audiosamplecount' => 1,
+	'audiosampledesc' => 1,
+	'audiosamplesize' => 1,
+	'audiosize' => 1,
+	'audiosourceurl' => 1,
+	'audiostream' => 1,
+	'audiostreamtype' => 1,
+	'audiotrackid' => 1,
+	'audiovendorid' => 1,
+	'authenticationtime' => 1,
+	'authenticationtype' => 1,
+	'authorlen' => 1,
+	'authorship' => 1,
+	'authorurl' => 1,
+	'aux' => 1,
+	'averagelevel' => 1,
+	'avgbitrate' => 1,
+	'avgbytespersec' => 1,
+	'avgpacketsize' => 1,
+	'avgpdusize' => 1,
+	'avgwidth' => 1,
+	'avi1' => 1,
+	'avif' => 1,
+	'aviheader' => 1,
+	'awbinfo' => 1,
+	'axisdistancex' => 1,
+	'axisdistancey' => 1,
+	'axisdistancez' => 1,
+	'background' => 1,
+	'backgroundcolor' => 1,
+	'backgroundcolorindicator' => 1,
+	'backgroundcolorvalue' => 1,
+	'backgroundimageid' => 1,
+	'backgroundtiling' => 1,
+	'backlight' => 1,
+	'backserial' => 1,
+	'backuptime' => 1,
+	'badfaxlines' => 1,
+	'balance' => 1,
+	'band' => 1,
+	'bandwidthsharing' => 1,
+	'bannerimage' => 1,
+	'bannerimagedata' => 1,
+	'bannerimagetype' => 1,
+	'bannerimageurl' => 1,
+	'baselinelength' => 1,
+	'baseviewpointnum' => 1,
+	'basisobject' => 1,
+	'bass' => 1,
+	'batteryinfo' => 1,
+	'beatsperminute' => 1,
+	'binaryfilter' => 1,
+	'binaryxml' => 1,
+	'bitrate' => 1,
+	'bitratemutualexclusion' => 1,
+	'bitsperextendedrunlength' => 1,
+	'bitsperpixel' => 1,
+	'bitsperrunlength' => 1,
+	'blackleveldeltah' => 1,
+	'blackleveldeltav' => 1,
+	'blackmaskbottomborder' => 1,
+	'blackmaskleftborder' => 1,
+	'blackmaskrightborder' => 1,
+	'blackmasktopborder' => 1,
+	'block' => 1,
+	'blockaddid' => 1,
+	'blockadditional' => 1,
+	'blockadditionalid' => 1,
+	'blockadditions' => 1,
+	'blockduration' => 1,
+	'blockgroup' => 1,
+	'blocklocation' => 1,
+	'blockmore' => 1,
+	'blocksize' => 1,
+	'blocksizemax' => 1,
+	'blocksizemin' => 1,
+	'blockspercolumn' => 1,
+	'blocksperframe' => 1,
+	'blocksperrow' => 1,
+	'blockvirtual' => 1,
+	'blueadjust' => 1,
+	'bluegain' => 1,
+	'bluematrixcolumn' => 1,
+	'blueprimary' => 1,
+	'bluesample' => 1,
+	'bluetrc' => 1,
+	'bluex' => 1,
+	'bluey' => 1,
+	'booktitle' => 1,
+	'bordercolor' => 1,
+	'borderid' => 1,
+	'borderinformation' => 1,
+	'borderlocation' => 1,
+	'bordername' => 1,
+	'bordersversion' => 1,
+	'bordertype' => 1,
+	'bottommag' => 1,
+	'boundaryorigin' => 1,
+	'boundingbox' => 1,
+	'bracketshot' => 1,
+	'breakchar' => 1,
+	'brightnessdata' => 1,
+	'broadcast' => 1,
+	'broadcastextension' => 1,
+	'btoa0' => 1,
+	'btoa1' => 1,
+	'btoa2' => 1,
+	'btod0' => 1,
+	'btod1' => 1,
+	'btod2' => 1,
+	'btod3' => 1,
+	'bufferaverage' => 1,
+	'builddate' => 1,
+	'buildversion' => 1,
+	'bw_halftoninginfo' => 1,
+	'bw_transferfunc' => 1,
+	'bwfversion' => 1,
+	'bytelength' => 1,
+	'bytes' => 1,
+	'bytesperminute' => 1,
+	'cachecontrol' => 1,
+	'cachedimageheight' => 1,
+	'cachedimagewidth' => 1,
+	'calibrationdatetime' => 1,
+	'camera' => 1,
+	'camera1' => 1,
+	'camera2' => 1,
+	'cameraarrangementinterval' => 1,
+	'camerabacktype' => 1,
+	'camerabody' => 1,
+	'camerabyteorder' => 1,
+	'cameradatetime' => 1,
+	'cameradirection' => 1,
+	'cameraidentifier' => 1,
+	'camerainfo' => 1,
+	'camerainfo5dmkii_2a' => 1,
+	'camerainfo5dmkii_2b' => 1,
+	'camerainfo7d_2a' => 1,
+	'camerainfo7d_2b' => 1,
+	'cameramotion' => 1,
+	'cameraname' => 1,
+	'cameraobjbacktype' => 1,
+	'cameraobject' => 1,
+	'cameraobjname' => 1,
+	'cameraobjtype' => 1,
+	'cameraobjversion' => 1,
+	'cameraprofileversion' => 1,
+	'camerasettings' => 1,
+	'camerasettings2' => 1,
+	'camerasettingsa100' => 1,
+	'camerasettingsifd' => 1,
+	'camerasettingsunknown' => 1,
+	'camerasetup' => 1,
+	'cameraspecification' => 1,
+	'can_skip_backward' => 1,
+	'can_skip_forward' => 1,
+	'canon' => 1,
+	'canon_afinfo2_0x000d' => 1,
+	'canon_afinfo_0x000b' => 1,
+	'canonafinfo' => 1,
+	'canonafinfo2' => 1,
+	'canoncamerainfo1000d' => 1,
+	'canoncamerainfo1d' => 1,
+	'canoncamerainfo1dmkii' => 1,
+	'canoncamerainfo1dmkiii' => 1,
+	'canoncamerainfo1dmkiin' => 1,
+	'canoncamerainfo1dmkiv' => 1,
+	'canoncamerainfo40d' => 1,
+	'canoncamerainfo450d' => 1,
+	'canoncamerainfo500d' => 1,
+	'canoncamerainfo50d' => 1,
+	'canoncamerainfo550d' => 1,
+	'canoncamerainfo5d' => 1,
+	'canoncamerainfo5dmkii' => 1,
+	'canoncamerainfo60d' => 1,
+	'canoncamerainfo7d' => 1,
+	'canoncamerainfopowershot' => 1,
+	'canoncamerainfopowershot2' => 1,
+	'canoncamerainfounknown' => 1,
+	'canoncamerainfounknown16' => 1,
+	'canoncamerainfounknown32' => 1,
+	'canoncamerasettings' => 1,
+	'canoncnth' => 1,
+	'canoncolorinfo1' => 1,
+	'canoncolorinfo2' => 1,
+	'canonfileinfo' => 1,
+	'canonflags' => 1,
+	'canonfocallength' => 1,
+	'canonimageheight' => 1,
+	'canonimagewidth' => 1,
+	'canonpanorama' => 1,
+	'canonrawmakemodel' => 1,
+	'canonshotinfo' => 1,
+	'canseekontime' => 1,
+	'canseektoend' => 1,
+	'capheight' => 1,
+	'captiontext' => 1,
+	'captprofbacktype' => 1,
+	'captprofname' => 1,
+	'captproftype' => 1,
+	'captprofversion' => 1,
+	'captureconditionspar' => 1,
+	'capturedevicefid' => 1,
+	'captureobjbacktype' => 1,
+	'captureobjname' => 1,
+	'captureobjtype' => 1,
+	'captureobjversion' => 1,
+	'captureprofile' => 1,
+	'captureresolution' => 1,
+	'captureserial' => 1,
+	'capturesetup' => 1,
+	'capturexresolution' => 1,
+	'capturexresolutionunit' => 1,
+	'captureyresolution' => 1,
+	'captureyresolutionunit' => 1,
+	'casio' => 1,
+	'casiodata' => 1,
+	'casiojunk' => 1,
+	'casioquality' => 1,
+	'casioqvmi' => 1,
+	'cc' => 1,
+	'ccdrect' => 1,
+	'ccdvalidrect' => 1,
+	'ccdvideorect' => 1,
+	'cell' => 1,
+	'centerdarkrect' => 1,
+	'cfalayout' => 1,
+	'cfapattern2' => 1,
+	'cfaplanecolor' => 1,
+	'cfarepeatpatterndim' => 1,
+	'channelmode' => 1,
+	'channelpositions' => 1,
+	'chapter' => 1,
+	'chapteratom' => 1,
+	'chaptercountry' => 1,
+	'chapterdisplay' => 1,
+	'chapterflagenabled' => 1,
+	'chapterflaghidden' => 1,
+	'chapterlanguage' => 1,
+	'chapterlist' => 1,
+	'chapterphysicalequivalent' => 1,
+	'chapterprocess' => 1,
+	'chapterprocesscodecid' => 1,
+	'chapterprocesscommand' => 1,
+	'chapterprocessdata' => 1,
+	'chapterprocessprivate' => 1,
+	'chapterprocesstime' => 1,
+	'chapters' => 1,
+	'chaptersegmenteditionuid' => 1,
+	'chaptersegmentuid' => 1,
+	'chapterstring' => 1,
+	'chaptertimeend' => 1,
+	'chaptertimestart' => 1,
+	'chaptertrack' => 1,
+	'chaptertracknumber' => 1,
+	'chaptertranslate' => 1,
+	'chaptertranslatecodec' => 1,
+	'chaptertranslateeditionuid' => 1,
+	'chaptertranslateid' => 1,
+	'chapteruid' => 1,
+	'characters' => 1,
+	'characterset' => 1,
+	'characterswithspaces' => 1,
+	'charcountwithspaces' => 1,
+	'chartarget' => 1,
+	'checkedby' => 1,
+	'chromaticadaptation' => 1,
+	'chromaticity' => 1,
+	'chromaticitychannel1' => 1,
+	'chromaticitychannel2' => 1,
+	'chromaticitychannel3' => 1,
+	'chromaticitychannel4' => 1,
+	'chromaticitychannels' => 1,
+	'chromaticitycolorant' => 1,
+	'chunkoffset' => 1,
+	'chunkoffset64' => 1,
+	'ciff' => 1,
+	'cinematographer' => 1,
+	'cip3datafile' => 1,
+	'cip3sheet' => 1,
+	'cip3side' => 1,
+	'circleofconfusion' => 1,
+	'class' => 1,
+	'classification' => 1,
+	'cleanfaxdata' => 1,
+	'clipboundary' => 1,
+	'clipobjects' => 1,
+	'clippath' => 1,
+	'clippingboundary' => 1,
+	'clippingpathname' => 1,
+	'cloneid' => 1,
+	'cloneobject' => 1,
+	'clonetype' => 1,
+	'cluster' => 1,
+	'clusterduration' => 1,
+	'cmmflags' => 1,
+	'cmykequivalent' => 1,
+	'codecdecodeall' => 1,
+	'codecdownloadurl' => 1,
+	'codecflavorid' => 1,
+	'codecid' => 1,
+	'codecinfourl' => 1,
+	'codeclist' => 1,
+	'codecname' => 1,
+	'codecprivate' => 1,
+	'codecsettings' => 1,
+	'codecstate' => 1,
+	'codedframesize' => 1,
+	'codepage' => 1,
+	'codesize' => 1,
+	'codestreamheader' => 1,
+	'codestreamregistration' => 1,
+	'codinghistory' => 1,
+	'codingmethods' => 1,
+	'color' => 1,
+	'colorant1coordinates' => 1,
+	'colorant1name' => 1,
+	'colorant2coordinates' => 1,
+	'colorant2name' => 1,
+	'colorant3coordinates' => 1,
+	'colorant3name' => 1,
+	'colorantcount' => 1,
+	'colorantorder' => 1,
+	'coloranttable' => 1,
+	'coloranttableout' => 1,
+	'coloraverages' => 1,
+	'colorbalance0100' => 1,
+	'colorbalance0102' => 1,
+	'colorbalance0103' => 1,
+	'colorbalance02' => 1,
+	'colorbalance0205' => 1,
+	'colorbalance0209' => 1,
+	'colorbalancea' => 1,
+	'colorbalanceunknown' => 1,
+	'colorbitdepth' => 1,
+	'colorboostdata' => 1,
+	'colorbw' => 1,
+	'colorcalib' => 1,
+	'colorcalibrationmatrix' => 1,
+	'colorcasts' => 1,
+	'colorcharacterization' => 1,
+	'colorcoefs' => 1,
+	'colorcomponents' => 1,
+	'colordata1' => 1,
+	'colordata2' => 1,
+	'colordata3' => 1,
+	'colordata4' => 1,
+	'colordata5' => 1,
+	'colordata6' => 1,
+	'colordataunknown' => 1,
+	'colorgroup' => 1,
+	'colorhalftoninginfo' => 1,
+	'colorimetricintentimagestate' => 1,
+	'colorimetry' => 1,
+	'colorinfo' => 1,
+	'colormap' => 1,
+	'colorobjbacktype' => 1,
+	'colorobjname' => 1,
+	'colorobjtype' => 1,
+	'colorobjversion' => 1,
+	'colorpalette' => 1,
+	'colorresolutiondepth' => 1,
+	'colorresponseunit' => 1,
+	'colors' => 1,
+	'colorsamplersresource' => 1,
+	'colorsetup' => 1,
+	'colorspacedata' => 1,
+	'colorspecification' => 1,
+	'colortable' => 1,
+	'colortransferfuncs' => 1,
+	'colortransform' => 1,
+	'colortwistmatrix' => 1,
+	'colortype' => 1,
+	'commandlinearguments' => 1,
+	'commentlen' => 1,
+	'comments' => 1,
+	'commenttime' => 1,
+	'commercialurl' => 1,
+	'commissioned' => 1,
+	'common' => 1,
+	'commonnetworkrellink' => 1,
+	'commonpathsuffix' => 1,
+	'compactsamplesizes' => 1,
+	'company' => 1,
+	'companyname' => 1,
+	'compatibility' => 1,
+	'compatiblebrands' => 1,
+	'compatiblefontname' => 1,
+	'compilation' => 1,
+	'compobj' => 1,
+	'compobjusertype' => 1,
+	'compobjusertypelen' => 1,
+	'componentbitdepth' => 1,
+	'componentdefinition' => 1,
+	'componentmapping' => 1,
+	'composerkeywords' => 1,
+	'compositinglayerheader' => 1,
+	'composition' => 1,
+	'compositionmode' => 1,
+	'compositionoptions' => 1,
+	'compositiontimetosample' => 1,
+	'compositiontodecodetimelinemapping' => 1,
+	'compressed' => 1,
+	'compressedannotation' => 1,
+	'compresseddatalength' => 1,
+	'compresseddataoffset' => 1,
+	'compressedsize' => 1,
+	'compressedtext' => 1,
+	'compressionlevel' => 1,
+	'compressiontype' => 1,
+	'compressorid' => 1,
+	'compressorname' => 1,
+	'compressorversion' => 1,
+	'concreteflag' => 1,
+	'condition' => 1,
+	'conditionalfec' => 1,
+	'conductor' => 1,
+	'confirmedobjectsize' => 1,
+	'connectionspaceilluminant' => 1,
+	'consecutivebadfaxlines' => 1,
+	'consoledata' => 1,
+	'consolefedata' => 1,
+	'cont' => 1,
+	'containerformat' => 1,
+	'containerversion' => 1,
+	'contake' => 1,
+	'contentbranding' => 1,
+	'contentcompression' => 1,
+	'contentcompressionalgorithm' => 1,
+	'contentcompressionsettings' => 1,
+	'contentdescription' => 1,
+	'contentdescriptionnotes' => 1,
+	'contentdisposition' => 1,
+	'contentdistributor' => 1,
+	'contentencoding' => 1,
+	'contentencodingorder' => 1,
+	'contentencodings' => 1,
+	'contentencodingscope' => 1,
+	'contentencodingtype' => 1,
+	'contentencryption' => 1,
+	'contentencryptionalgorithm' => 1,
+	'contentencryptionkeyid' => 1,
+	'contentgroupdescription' => 1,
+	'contentlanguage' => 1,
+	'contentrating' => 1,
+	'contents' => 1,
+	'contentscripttype' => 1,
+	'contentsignature' => 1,
+	'contentsignaturealgorithm' => 1,
+	'contentsignaturehashalgorithm' => 1,
+	'contentsignaturekeyid' => 1,
+	'contentstyletype' => 1,
+	'contenttype' => 1,
+	'contiguouscodestream' => 1,
+	'contrastadjustment' => 1,
+	'contrastcurve' => 1,
+	'convergenceangle' => 1,
+	'convergencebaseimage' => 1,
+	'convergencedistance' => 1,
+	'copyrightlen' => 1,
+	'copyrighturl' => 1,
+	'costumedesigner' => 1,
+	'coverart' => 1,
+	'coverartmimetype' => 1,
+	'cpuarchitecture' => 1,
+	'cpubyteorder' => 1,
+	'cpucount' => 1,
+	'cpusubtype' => 1,
+	'cputype' => 1,
+	'cpuversions' => 1,
+	'crc-32' => 1,
+	'crcdevelparams' => 1,
+	'crdinfo' => 1,
+	'createdby' => 1,
+	'creatingapplication' => 1,
+	'creatingtransform' => 1,
+	'creationpathvector' => 1,
+	'creatorappid' => 1,
+	'creatorapplication' => 1,
+	'creatorappversion' => 1,
+	'creatorinfo' => 1,
+	'creatorversion' => 1,
+	'cropdata' => 1,
+	'cropinfo' => 1,
+	'cropped' => 1,
+	'cropx' => 1,
+	'cropxcommonoffset' => 1,
+	'cropxoffset' => 1,
+	'cropxoffset2' => 1,
+	'cropxsize' => 1,
+	'cropxviewpointnumber' => 1,
+	'cropxviewpointnumber2' => 1,
+	'cropy' => 1,
+	'cropycommonoffset' => 1,
+	'cropyoffset' => 1,
+	'cropyoffset2' => 1,
+	'cropysize' => 1,
+	'cropyviewpointnumber' => 1,
+	'cropyviewpointnumber2' => 1,
+	'cross-reference' => 1,
+	'crossref' => 1,
+	'crs' => 1,
+	'crwparam' => 1,
+	'cueblocknumber' => 1,
+	'cueclusterposition' => 1,
+	'cuecodecstate' => 1,
+	'cuepoint' => 1,
+	'cuerefcluster' => 1,
+	'cuerefcodecstate' => 1,
+	'cuereference' => 1,
+	'cuerefnumber' => 1,
+	'cuereftime' => 1,
+	'cues' => 1,
+	'cuetime' => 1,
+	'cuetrack' => 1,
+	'cuetrackpositions' => 1,
+	'currentbitrate' => 1,
+	'currentiptcdigest' => 1,
+	'currenttime' => 1,
+	'currentuser' => 1,
+	'cursorsize' => 1,
+	'customfunctions10d' => 1,
+	'customfunctions1d' => 1,
+	'customfunctions2' => 1,
+	'customfunctions20d' => 1,
+	'customfunctions30d' => 1,
+	'customfunctions350d' => 1,
+	'customfunctions400d' => 1,
+	'customfunctions5d' => 1,
+	'customfunctionsd30' => 1,
+	'customfunctionsd60' => 1,
+	'customfunctionsunknown' => 1,
+	'custompicturestyledata' => 1,
+	'customsettingsd3' => 1,
+	'customsettingsd300' => 1,
+	'customsettingsd300s' => 1,
+	'customsettingsd3s' => 1,
+	'customsettingsd3x' => 1,
+	'customsettingsd40' => 1,
+	'customsettingsd5000' => 1,
+	'customsettingsd700' => 1,
+	'customsettingsd7000' => 1,
+	'customsettingsd80' => 1,
+	'customsettingsd90' => 1,
+	'd-lightinghqdata' => 1,
+	'd-lightinghsdata' => 1,
+	'darkcorrectiontype' => 1,
+	'darwindata' => 1,
+	'data' => 1,
+	'data1' => 1,
+	'data2' => 1,
+	'datacreatedate' => 1,
+	'datadump' => 1,
+	'datadump2' => 1,
+	'datainfo' => 1,
+	'datainformation' => 1,
+	'datakey' => 1,
+	'datalen' => 1,
+	'datalength' => 1,
+	'datalocation' => 1,
+	'datamodifydate' => 1,
+	'dataobject' => 1,
+	'dataobjectid' => 1,
+	'dataobjectstatus' => 1,
+	'dataobjecttitle' => 1,
+	'dataoffset' => 1,
+	'dataoffsets' => 1,
+	'datapackets' => 1,
+	'dataref' => 1,
+	'datareference' => 1,
+	'datasize' => 1,
+	'datatype' => 1,
+	'datecompleted' => 1,
+	'datetime1' => 1,
+	'datetime2' => 1,
+	'datetimecreated' => 1,
+	'datetimeend' => 1,
+	'dc' => 1,
+	'dcmd' => 1,
+	'dcme' => 1,
+	'dctencodeversion' => 1,
+	'dealeridnumber' => 1,
+	'decimationmethod' => 1,
+	'decimationprefilterwidth' => 1,
+	'decode' => 1,
+	'decodertable' => 1,
+	'decodertablenumber' => 1,
+	'defaultaudiostream' => 1,
+	'defaultchar' => 1,
+	'defaultdisplayheight' => 1,
+	'defaultdisplaywidth' => 1,
+	'defaultduration' => 1,
+	'defaultimagecolor' => 1,
+	'defaultrgb' => 1,
+	'defaultstyle' => 1,
+	'defineobject' => 1,
+	'definequantizationtable' => 1,
+	'delay' => 1,
+	'deltapngheader' => 1,
+	'deltatype' => 1,
+	'deltaxy' => 1,
+	'department' => 1,
+	'dependentimage1entrynumber' => 1,
+	'dependentimage2entrynumber' => 1,
+	'depth' => 1,
+	'descender' => 1,
+	'designer' => 1,
+	'designerurl' => 1,
+	'desiredreproductions' => 1,
+	'destinationid' => 1,
+	'deviceattributes' => 1,
+	'devicemanufacturer' => 1,
+	'devicemfgdesc' => 1,
+	'devicemodel' => 1,
+	'devicemodeldesc' => 1,
+	'devicename' => 1,
+	'devicesettings' => 1,
+	'dex' => 1,
+	'dicom' => 1,
+	'dictionary' => 1,
+	'digikam' => 1,
+	'digitalcreationdatetime' => 1,
+	'digitaleffectsname' => 1,
+	'digitaleffectstype' => 1,
+	'digitaleffectsversion' => 1,
+	'digitalimagebroker' => 1,
+	'digitalsignature' => 1,
+	'dimensions' => 1,
+	'discardobjects' => 1,
+	'disknumber' => 1,
+	'displayheight' => 1,
+	'displayinfo' => 1,
+	'displayresolution' => 1,
+	'displaysize' => 1,
+	'displayunit' => 1,
+	'displayunits' => 1,
+	'displaywidth' => 1,
+	'displayxresolution' => 1,
+	'displayxresolutionunit' => 1,
+	'displayyresolution' => 1,
+	'displayyresolutionunit' => 1,
+	'dispose' => 1,
+	'disposition' => 1,
+	'distortinfo' => 1,
+	'distortionversion' => 1,
+	'distributedby' => 1,
+	'distribution' => 1,
+	'division' => 1,
+	'djvuversion' => 1,
+	'dngadobedata' => 1,
+	'dngprivatedata' => 1,
+	'docclass' => 1,
+	'docmdp' => 1,
+	'docrights' => 1,
+	'docsecurity' => 1,
+	'doctype' => 1,
+	'doctypereadversion' => 1,
+	'doctypeversion' => 1,
+	'documentinfo' => 1,
+	'documentnumber' => 1,
+	'documentusagerights' => 1,
+	'dof' => 1,
+	'donotshow' => 1,
+	'dotsperinch' => 1,
+	'driveserialnumber' => 1,
+	'drivetype' => 1,
+	'drm' => 1,
+	'drm_contentid' => 1,
+	'drm_drmheader' => 1,
+	'drm_drmheader_contentdistributor' => 1,
+	'drm_drmheader_contentid' => 1,
+	'drm_drmheader_individualizedversion' => 1,
+	'drm_drmheader_keyid' => 1,
+	'drm_drmheader_licenseacqurl' => 1,
+	'drm_drmheader_subscriptioncontentid' => 1,
+	'drm_individualizedversion' => 1,
+	'drm_keyid' => 1,
+	'drm_lasignaturecert' => 1,
+	'drm_lasignaturelicsrvcert' => 1,
+	'drm_lasignatureprivkey' => 1,
+	'drm_lasignaturerootcert' => 1,
+	'drm_licenseacqurl' => 1,
+	'drm_v1licenseacqurl' => 1,
+	'dropbykeyword' => 1,
+	'dropchunks' => 1,
+	'dtob0' => 1,
+	'dtob1' => 1,
+	'dtob2' => 1,
+	'dtob3' => 1,
+	'ducky' => 1,
+	'duotonehalftoninginfo' => 1,
+	'duotoneimageinfo' => 1,
+	'duotonetransferfuncs' => 1,
+	'dvdid' => 1,
+	'ebmlheader' => 1,
+	'ebmlmaxidlength' => 1,
+	'ebmlmaxsizelength' => 1,
+	'ebmlreadversion' => 1,
+	'ebmlversion' => 1,
+	'edit1' => 1,
+	'edit2' => 1,
+	'edit3' => 1,
+	'edit4' => 1,
+	'edit5' => 1,
+	'edit6' => 1,
+	'edit7' => 1,
+	'edit8' => 1,
+	'edit9' => 1,
+	'editdata' => 1,
+	'editedby' => 1,
+	'editionentry' => 1,
+	'editionflagdefault' => 1,
+	'editionflaghidden' => 1,
+	'editionflagordered' => 1,
+	'editionuid' => 1,
+	'editor' => 1,
+	'edittagarray' => 1,
+	'effect' => 1,
+	'effectivebw' => 1,
+	'effectsvisible' => 1,
+	'eighthlanguage' => 1,
+	'embeddedfile' => 1,
+	'embeddedfilename' => 1,
+	'embeddedfileusagerights' => 1,
+	'emphasis' => 1,
+	'encodedby' => 1,
+	'encodedusing' => 1,
+	'encoder' => 1,
+	'encodersettings' => 1,
+	'encoderversion' => 1,
+	'encoding' => 1,
+	'encodingprocess' => 1,
+	'encodingscheme' => 1,
+	'encodingsettings' => 1,
+	'encodingtime' => 1,
+	'encrypt' => 1,
+	'encryptedblock' => 1,
+	'encryption' => 1,
+	'endpoints' => 1,
+	'endtime' => 1,
+	'endtimecode' => 1,
+	'entrypoint' => 1,
+	'envvardata' => 1,
+	'episodeglobaluniqueid' => 1,
+	'eppim' => 1,
+	'eprint' => 1,
+	'epsoptions' => 1,
+	'equipment' => 1,
+	'equipmentifd' => 1,
+	'error' => 1,
+	'errorcorrection' => 1,
+	'errorcorrectiontype' => 1,
+	'escchar' => 1,
+	'evalstate' => 1,
+	'events' => 1,
+	'evstepinfo' => 1,
+	'exif_profile' => 1,
+	'exifdata' => 1,
+	'exifinfo' => 1,
+	'exifinfo2' => 1,
+	'exifinformation' => 1,
+	'exifoffset' => 1,
+	'exiftoolversion' => 1,
+	'expandfilm' => 1,
+	'expandfilterlens' => 1,
+	'expandflashlamp' => 1,
+	'expandlens' => 1,
+	'expandscanner' => 1,
+	'expandsoftware' => 1,
+	'expires' => 1,
+	'exportimage' => 1,
+	'exposurebias' => 1,
+	'exposureinfo' => 1,
+	'exposureunknown' => 1,
+	'extcache' => 1,
+	'extendedaviheader' => 1,
+	'extendedcontentdescr' => 1,
+	'extendedcontentencryption' => 1,
+	'extendedinfo' => 1,
+	'extendedstreamprops' => 1,
+	'extendedxmp' => 1,
+	'extenderstatus' => 1,
+	'extensionclassid' => 1,
+	'extensioncreatedate' => 1,
+	'extensiondescription' => 1,
+	'extensionmodifydate' => 1,
+	'extensionname' => 1,
+	'extensionpersistence' => 1,
+	'extensions' => 1,
+	'externalleading' => 1,
+	'extraflags' => 1,
+	'extrasamples' => 1,
+	'face1birthday' => 1,
+	'face1category' => 1,
+	'face1name' => 1,
+	'face2birthday' => 1,
+	'face2category' => 1,
+	'face2name' => 1,
+	'face3birthday' => 1,
+	'face3category' => 1,
+	'face3name' => 1,
+	'face4birthday' => 1,
+	'face4category' => 1,
+	'face4name' => 1,
+	'face5birthday' => 1,
+	'face5category' => 1,
+	'face5name' => 1,
+	'face6birthday' => 1,
+	'face6category' => 1,
+	'face6name' => 1,
+	'face7birthday' => 1,
+	'face7category' => 1,
+	'face7name' => 1,
+	'face8birthday' => 1,
+	'face8category' => 1,
+	'face8name' => 1,
+	'facedetect1' => 1,
+	'facedetect2' => 1,
+	'facedetinfo' => 1,
+	'faceinfo' => 1,
+	'faceinfo1' => 1,
+	'faceinfo2' => 1,
+	'faceinfolength' => 1,
+	'faceinfooffset' => 1,
+	'facepos' => 1,
+	'facerecinfo' => 1,
+	'facesize' => 1,
+	'fastseek' => 1,
+	'faxprofile' => 1,
+	'faxrecvparams' => 1,
+	'faxrecvtime' => 1,
+	'faxsubaddress' => 1,
+	'fieldmdp' => 1,
+	'fieldpermissions' => 1,
+	'fifthlanguage' => 1,
+	'fileattributes' => 1,
+	'filedescription' => 1,
+	'fileflags' => 1,
+	'fileflagsmask' => 1,
+	'filefunctionflags' => 1,
+	'fileglobalprofile' => 1,
+	'fileid' => 1,
+	'fileinfo' => 1,
+	'fileinfolen' => 1,
+	'fileinfolen2' => 1,
+	'fileinfoproperties' => 1,
+	'fileinfoversion' => 1,
+	'filelength' => 1,
+	'fileos' => 1,
+	'fileowner' => 1,
+	'filepermissions' => 1,
+	'fileprofileversion' => 1,
+	'fileproperties' => 1,
+	'files' => 1,
+	'filesize' => 1,
+	'filesizebytes' => 1,
+	'filesubtype' => 1,
+	'filetype' => 1,
+	'fileurl' => 1,
+	'fileversionnumber' => 1,
+	'fillattributes' => 1,
+	'fillmethod' => 1,
+	'filmbrand' => 1,
+	'filmcategory' => 1,
+	'filmframenumber' => 1,
+	'filmgencode' => 1,
+	'filmproductcode' => 1,
+	'filmrollnumber' => 1,
+	'filmsize' => 1,
+	'filter' => 1,
+	'filterinfo' => 1,
+	'filtering' => 1,
+	'finalframeblocks' => 1,
+	'firmwareinfo' => 1,
+	'firstchar' => 1,
+	'firstlanguage' => 1,
+	'firstobject' => 1,
+	'firstobjectid' => 1,
+	'flags' => 1,
+	'flashexpcomp' => 1,
+	'flashinfo' => 1,
+	'flashinfo0100' => 1,
+	'flashinfo0102' => 1,
+	'flashinfo0103' => 1,
+	'flashinfo0104' => 1,
+	'flashinfounknown' => 1,
+	'flashinfoversion' => 1,
+	'flashpixstreamfieldoffset' => 1,
+	'flashpixstreampathname' => 1,
+	'flashpower' => 1,
+	'flashsyncmode' => 1,
+	'flashttlmode' => 1,
+	'flashversion' => 1,
+	'flavor' => 1,
+	'focallength35efl' => 1,
+	'focalplanecolorimetryestimates' => 1,
+	'focalrange' => 1,
+	'focusinfo' => 1,
+	'focusinfoifd' => 1,
+	'focuspos' => 1,
+	'font' => 1,
+	'fontsize' => 1,
+	'fontsubfamily' => 1,
+	'fontsubfamilyid' => 1,
+	'fontweight' => 1,
+	'footerposition' => 1,
+	'footnotes' => 1,
+	'form' => 1,
+	'formatter' => 1,
+	'formatversion' => 1,
+	'formatversiontime' => 1,
+	'formfields' => 1,
+	'formusagerights' => 1,
+	'forwardto' => 1,
+	'fotostation' => 1,
+	'fourcc1' => 1,
+	'fourcc2' => 1,
+	'fourcc2len' => 1,
+	'fourcc3' => 1,
+	'fourcc3len' => 1,
+	'fourthlanguage' => 1,
+	'fov' => 1,
+	'fpxr' => 1,
+	'fractalparameters' => 1,
+	'fragmentlist' => 1,
+	'fragmenttable' => 1,
+	'frame' => 1,
+	'frameheight' => 1,
+	'frameinfo' => 1,
+	'framepriority' => 1,
+	'framereadouttime' => 1,
+	'framesize' => 1,
+	'framesizemax' => 1,
+	'framesizemin' => 1,
+	'framewidth' => 1,
+	'free' => 1,
+	'freebytecounts' => 1,
+	'freeoffsets' => 1,
+	'fstype' => 1,
+	'fujifilm' => 1,
+	'fujifilmffmv' => 1,
+	'fujifilmmvtg' => 1,
+	'fujilayout' => 1,
+	'fullname' => 1,
+	'fullscreen' => 1,
+	'gain' => 1,
+	'gamut' => 1,
+	'gapless' => 1,
+	'gdalmetadata' => 1,
+	'gdalnodata' => 1,
+	'geminfo' => 1,
+	'genbalance' => 1,
+	'generator' => 1,
+	'genflags' => 1,
+	'gengraphicsmode' => 1,
+	'genmediaheader' => 1,
+	'genmediainfo' => 1,
+	'genmediaversion' => 1,
+	'genopcolor' => 1,
+	'genr' => 1,
+	'genreid' => 1,
+	'geo' => 1,
+	'geogangularunits' => 1,
+	'geogangularunitsize' => 1,
+	'geogazimuthunits' => 1,
+	'geogcitation' => 1,
+	'geogellipsoid' => 1,
+	'geoggeodeticdatum' => 1,
+	'geoginvflattening' => 1,
+	'geoglinearunits' => 1,
+	'geoglinearunitsize' => 1,
+	'geogprimemeridian' => 1,
+	'geogprimemeridianlong' => 1,
+	'geographictype' => 1,
+	'geogsemimajoraxis' => 1,
+	'geogsemiminoraxis' => 1,
+	'geotiffasciiparams' => 1,
+	'geotiffdirectory' => 1,
+	'geotiffdoubleparams' => 1,
+	'geotiffversion' => 1,
+	'gifapplicationextension' => 1,
+	'gifgraphiccontrolextension' => 1,
+	'gifplaintextextension' => 1,
+	'gifversion' => 1,
+	'globalinfo' => 1,
+	'globalparametersifd' => 1,
+	'globalpixelsize' => 1,
+	'googlebot' => 1,
+	'gps' => 1,
+	'gpscoordinates' => 1,
+	'gpsinfo' => 1,
+	'gpsposition' => 1,
+	'grainybwfilter' => 1,
+	'graphicconverter' => 1,
+	'graphicsmode' => 1,
+	'graphicstechnologystandardoutput' => 1,
+	'grayresponsecurve' => 1,
+	'graytrc' => 1,
+	'greenadjust' => 1,
+	'greengain' => 1,
+	'greenmatrixcolumn' => 1,
+	'greenprimary' => 1,
+	'greensample' => 1,
+	'greentrc' => 1,
+	'greenx' => 1,
+	'greeny' => 1,
+	'gridguidesinfo' => 1,
+	'group' => 1,
+	'groupcaption' => 1,
+	'grouping' => 1,
+	'groupmutualexclusion' => 1,
+	'gtcitation' => 1,
+	'gtmodeltype' => 1,
+	'gtrastertype' => 1,
+	'handler' => 1,
+	'handlerclass' => 1,
+	'handlerdescription' => 1,
+	'handlertype' => 1,
+	'handlervendorid' => 1,
+	'hasarbitrarydatastream' => 1,
+	'hasattachedimages' => 1,
+	'hasaudio' => 1,
+	'hascolormap' => 1,
+	'hascuepoints' => 1,
+	'hasfiletransferstream' => 1,
+	'hasicc' => 1,
+	'hasimage' => 1,
+	'haskeyframes' => 1,
+	'hasmetadata' => 1,
+	'hasscript' => 1,
+	'hasvideo' => 1,
+	'hcusage' => 1,
+	'hdrl' => 1,
+	'hdvideo' => 1,
+	'header' => 1,
+	'headerext' => 1,
+	'headerextension' => 1,
+	'headersize' => 1,
+	'headingpairs' => 1,
+	'heightresolution' => 1,
+	'hiddenslides' => 1,
+	'highlightdata' => 1,
+	'highlightendpoints' => 1,
+	'hintformat' => 1,
+	'hintheader' => 1,
+	'hintinfo' => 1,
+	'hintsampledesc' => 1,
+	'hinttrackinfo' => 1,
+	'historybuffersize' => 1,
+	'hotkey' => 1,
+	'howpublished' => 1,
+	'hp_tdhd' => 1,
+	'http-equiv' => 1,
+	'httphostheader' => 1,
+	'huffmantable' => 1,
+	'hyperfocaldistance' => 1,
+	'hyperlinkbase' => 1,
+	'hyperlinks' => 1,
+	'hyperlinkschanged' => 1,
+	'icc_untagged' => 1,
+	'iccbased' => 1,
+	'iconenvdata' => 1,
+	'iconfilename' => 1,
+	'iconindex' => 1,
+	'id' => 1,
+	'id3' => 1,
+	'id3size' => 1,
+	'id3v1' => 1,
+	'id3v1_enh' => 1,
+	'id3v2_2' => 1,
+	'id3v2_3' => 1,
+	'id3v2_4' => 1,
+	'idc2_ifd' => 1,
+	'idc_ifd' => 1,
+	'idcpreviewimage' => 1,
+	'identification' => 1,
+	'idependentanddisposablesamples' => 1,
+	'idsbasevalue' => 1,
+	'ifd0_offset' => 1,
+	'ihl_exif' => 1,
+	'ihldata' => 1,
+	'illustrator' => 1,
+	'image' => 1,
+	'imagearrangement' => 1,
+	'imageboardid' => 1,
+	'imagebounds' => 1,
+	'imagebytecount' => 1,
+	'imageclass' => 1,
+	'imagecolor' => 1,
+	'imagecolorindicator' => 1,
+	'imagecolorvalue' => 1,
+	'imagedata' => 1,
+	'imagedatadiscard' => 1,
+	'imagedepth' => 1,
+	'imagefields' => 1,
+	'imageformat' => 1,
+	'imageheader' => 1,
+	'imageid' => 1,
+	'imageinfo' => 1,
+	'imagelayer' => 1,
+	'imagelength' => 1,
+	'imageoffset' => 1,
+	'imageprintstatus' => 1,
+	'imageprocessingifd' => 1,
+	'imageprofile' => 1,
+	'imageprops' => 1,
+	'imagerboardid' => 1,
+	'imageresolution' => 1,
+	'imageresources' => 1,
+	'imagerotated' => 1,
+	'imagerotation' => 1,
+	'imagerotationstatus' => 1,
+	'imagesourceek' => 1,
+	'imagestatus' => 1,
+	'imagetoolbar' => 1,
+	'imageuidlist' => 1,
+	'imageversion' => 1,
+	'imgprofbacktype' => 1,
+	'imgprofname' => 1,
+	'imgproftype' => 1,
+	'imgprofversion' => 1,
+	'immediatedatabytes' => 1,
+	'includedfileid' => 1,
+	'index' => 1,
+	'index01' => 1,
+	'index02' => 1,
+	'index03' => 1,
+	'index04' => 1,
+	'index05' => 1,
+	'index06' => 1,
+	'index07' => 1,
+	'index08' => 1,
+	'index09' => 1,
+	'index10' => 1,
+	'index11' => 1,
+	'index12' => 1,
+	'index13' => 1,
+	'index14' => 1,
+	'index15' => 1,
+	'index16' => 1,
+	'indexable' => 1,
+	'indexed' => 1,
+	'indexedcolourtablecount' => 1,
+	'indexoffset' => 1,
+	'indexparameters' => 1,
+	'info' => 1,
+	'information' => 1,
+	'ingrreserved' => 1,
+	'initialdisplayeffect' => 1,
+	'initializeddatasize' => 1,
+	'initialkey' => 1,
+	'initialobjectdescriptor' => 1,
+	'inknames' => 1,
+	'inputdataobjectlist' => 1,
+	'inputprofile' => 1,
+	'insertmode' => 1,
+	'institution' => 1,
+	'instructionset' => 1,
+	'integrationtime' => 1,
+	'intellectualproperty' => 1,
+	'intellectualpropertynotes' => 1,
+	'intensitystereo' => 1,
+	'intergraphflagregisters' => 1,
+	'intergraphmatrix' => 1,
+	'intergraphpacketdata' => 1,
+	'interlace' => 1,
+	'interleavedfield' => 1,
+	'internalidnumber' => 1,
+	'internalleading' => 1,
+	'internalname' => 1,
+	'internalversionnumber' => 1,
+	'internationaltext' => 1,
+	'internetradiostationname' => 1,
+	'internetradiostationowner' => 1,
+	'internetradiostationurl' => 1,
+	'interopoffset' => 1,
+	'interpretedby' => 1,
+	'involvedpeople' => 1,
+	'ipmpcontrol' => 1,
+	'iptc' => 1,
+	'iptc_profile' => 1,
+	'iptcapplication' => 1,
+	'iptccore' => 1,
+	'iptcdata' => 1,
+	'iptcenvelope' => 1,
+	'iptcext' => 1,
+	'iptcfotostation' => 1,
+	'iptcnewsphoto' => 1,
+	'iptcobjectdata' => 1,
+	'iptcpostobjectdata' => 1,
+	'iptcpreobjectdata' => 1,
+	'is_protected' => 1,
+	'is_trusted' => 1,
+	'isbasefont' => 1,
+	'isfixedpitch' => 1,
+	'isfixedv' => 1,
+	'isoinfo' => 1,
+	'isrc' => 1,
+	'isrccode' => 1,
+	'isrcnumber' => 1,
+	'isvbr' => 1,
+	'it8header' => 1,
+	'italic' => 1,
+	'italicangle' => 1,
+	'itch' => 1,
+	'item' => 1,
+	'item0032' => 1,
+	'itemid' => 1,
+	'iteminformation' => 1,
+	'itemlist' => 1,
+	'itemlocation' => 1,
+	'itemprotection' => 1,
+	'iterationcount' => 1,
+	'iterationendaction' => 1,
+	'iterationmax' => 1,
+	'iterationminmax' => 1,
+	'iterations' => 1,
+	'itunesinfo' => 1,
+	'jfif' => 1,
+	'jfifversion' => 1,
+	'jfxx' => 1,
+	'jngheader' => 1,
+	'journal' => 1,
+	'jp2header' => 1,
+	'jp2signature' => 1,
+	'jpeg_quality' => 1,
+	'jpegactables' => 1,
+	'jpegdctables' => 1,
+	'jpegdigest' => 1,
+	'jpegexifdata' => 1,
+	'jpeglosslesspredictors' => 1,
+	'jpegpointtransforms' => 1,
+	'jpegproc' => 1,
+	'jpegprocess' => 1,
+	'jpegqtables' => 1,
+	'jpegrestartinterval' => 1,
+	'jpegtables' => 1,
+	'jumptoxpep' => 1,
+	'junk' => 1,
+	'kbytesize' => 1,
+	'kdc_ifd' => 1,
+	'keyframepositions' => 1,
+	'keyframestimes' => 1,
+	'keys' => 1,
+	'kids' => 1,
+	'knownfolderdata' => 1,
+	'kodak' => 1,
+	'kodakbordersifd' => 1,
+	'kodakeffectsifd' => 1,
+	'kodakifd' => 1,
+	'kodaktags' => 1,
+	'konicaminolta' => 1,
+	'konicaminoltatags' => 1,
+	'lacenumber' => 1,
+	'lamebitrate' => 1,
+	'lameheader' => 1,
+	'lamelowpassfilter' => 1,
+	'lamemethod' => 1,
+	'lamequality' => 1,
+	'lamestereomode' => 1,
+	'lamevbrquality' => 1,
+	'languagecode' => 1,
+	'languagelist' => 1,
+	'largestpacketduration' => 1,
+	'largestpacketsize' => 1,
+	'lastauthor' => 1,
+	'lastchar' => 1,
+	'lastkeyframetime' => 1,
+	'lastmodifiedby' => 1,
+	'lastmodifier' => 1,
+	'lastobject' => 1,
+	'lastobjectid' => 1,
+	'lastprinted' => 1,
+	'lasttimestamp' => 1,
+	'layercomps' => 1,
+	'layersgroupinfo' => 1,
+	'layerstateinfo' => 1,
+	'leafautoactive' => 1,
+	'leafautobasename' => 1,
+	'leafdata' => 1,
+	'leafhotfolder' => 1,
+	'leafopenprochdr' => 1,
+	'leafoutputfiletype' => 1,
+	'leafsaveselection' => 1,
+	'leafsubifd' => 1,
+	'leftdarkrect' => 1,
+	'leftmag' => 1,
+	'legalcopyright' => 1,
+	'legaltrademarks' => 1,
+	'length' => 1,
+	'lens35efl' => 1,
+	'lenscorr' => 1,
+	'lensdata' => 1,
+	'lensdata0100' => 1,
+	'lensdata0101' => 1,
+	'lensdata0201' => 1,
+	'lensdata0204' => 1,
+	'lensdataunknown' => 1,
+	'lensdataversion' => 1,
+	'lensshading' => 1,
+	'lensspec' => 1,
+	'levelinfo' => 1,
+	'libraryid' => 1,
+	'licenseinfourl' => 1,
+	'lightingopt' => 1,
+	'lightness' => 1,
+	'lights' => 1,
+	'lightvalue' => 1,
+	'linearizationtable' => 1,
+	'linearized' => 1,
+	'lines' => 1,
+	'linkerversion' => 1,
+	'linkinfo' => 1,
+	'linksuptodate' => 1,
+	'lit' => 1,
+	'localbasepath' => 1,
+	'localdeltatype' => 1,
+	'localeindicator' => 1,
+	'locationbody' => 1,
+	'locationdate' => 1,
+	'locationnote' => 1,
+	'locationrole' => 1,
+	'lockedpropertylist' => 1,
+	'locks' => 1,
+	'logoiconurl' => 1,
+	'logourl' => 1,
+	'longdescription' => 1,
+	'lookheadbacktype' => 1,
+	'lookheader' => 1,
+	'lookheadname' => 1,
+	'lookheadtype' => 1,
+	'lookheadversion' => 1,
+	'lookuptable' => 1,
+	'loopstyle' => 1,
+	'lotus' => 1,
+	'lr' => 1,
+	'lslv' => 1,
+	'luminance' => 1,
+	'luminanceconsts' => 1,
+	'lyricist' => 1,
+	'lyrics' => 1,
+	'lyrics_synchronised' => 1,
+	'machineid' => 1,
+	'machinetype' => 1,
+	'macintoshprintinfo' => 1,
+	'magnification' => 1,
+	'magnifyobject' => 1,
+	'mailstop' => 1,
+	'maininfo' => 1,
+	'maininfoifd' => 1,
+	'majorbrand' => 1,
+	'makeandmodel' => 1,
+	'makemodel' => 1,
+	'makernotes' => 1,
+	'makerurl' => 1,
+	'mandatorybackground' => 1,
+	'manufacturecode' => 1,
+	'manufactureindex' => 1,
+	'manufacturer' => 1,
+	'manufacturername' => 1,
+	'mappingscheme' => 1,
+	'markbits' => 1,
+	'marker' => 1,
+	'markerid' => 1,
+	'markinfo' => 1,
+	'matrixstructure' => 1,
+	'mattcolor' => 1,
+	'matte' => 1,
+	'matteing' => 1,
+	'matter' => 1,
+	'maxband' => 1,
+	'maxbitrate' => 1,
+	'maxblockadditionid' => 1,
+	'maxcache' => 1,
+	'maxdatarate' => 1,
+	'maximumbitrate' => 1,
+	'maximumimageindex' => 1,
+	'maximumobjectsize' => 1,
+	'maximumoperationindex' => 1,
+	'maximumtransformindex' => 1,
+	'maxjpegtableindex' => 1,
+	'maxpacketsize' => 1,
+	'maxpagenormal' => 1,
+	'maxpdusize' => 1,
+	'maxsubfilesize' => 1,
+	'maxtransmissiontime' => 1,
+	'maxval' => 1,
+	'maxwidth' => 1,
+	'mcdi' => 1,
+	'mdcolortable' => 1,
+	'mdfiletag' => 1,
+	'mdfileunits' => 1,
+	'mdlabname' => 1,
+	'mdpm' => 1,
+	'mdpr' => 1,
+	'mdprepdate' => 1,
+	'mdpreptime' => 1,
+	'mdsampleinfo' => 1,
+	'mdscalepixel' => 1,
+	'mean' => 1,
+	'measuredcolor' => 1,
+	'measuredinfo' => 1,
+	'measurement' => 1,
+	'measurementbacking' => 1,
+	'measurementflare' => 1,
+	'measurementgeometry' => 1,
+	'measurementilluminant' => 1,
+	'measurementobserver' => 1,
+	'media' => 1,
+	'mediablackpoint' => 1,
+	'mediaclassprimaryid' => 1,
+	'mediaclasssecondaryid' => 1,
+	'mediacolor' => 1,
+	'mediacreatedate' => 1,
+	'mediacredits' => 1,
+	'mediadata' => 1,
+	'mediaduration' => 1,
+	'mediaheader' => 1,
+	'mediaheaderversion' => 1,
+	'mediaindex' => 1,
+	'mediainfo' => 1,
+	'mediaisdelay' => 1,
+	'mediaisfinale' => 1,
+	'mediaislive' => 1,
+	'mediaispremiere' => 1,
+	'mediaisrepeat' => 1,
+	'mediaissap' => 1,
+	'mediaisstereo' => 1,
+	'mediaissubtitled' => 1,
+	'mediaistape' => 1,
+	'medialanguagecode' => 1,
+	'mediamodifydate' => 1,
+	'medianetworkaffiliation' => 1,
+	'mediaoriginalbroadcastdatetime' => 1,
+	'mediaoriginalchannel' => 1,
+	'mediapro' => 1,
+	'mediastationcallsign' => 1,
+	'mediastationname' => 1,
+	'mediatimescale' => 1,
+	'mediatrackbytes' => 1,
+	'mediatype' => 1,
+	'mediaweight' => 1,
+	'mediawhitepoint' => 1,
+	'medium' => 1,
+	'message' => 1,
+	'meta' => 1,
+	'metadata' => 1,
+	'metadatacreator' => 1,
+	'metadataid' => 1,
+	'metadatalibrary' => 1,
+	'metadatanumber' => 1,
+	'metermode' => 1,
+	'microsoft' => 1,
+	'mie' => 1,
+	'mimetype' => 1,
+	'mincache' => 1,
+	'miniaturefilter' => 1,
+	'miniaturefilterorientation' => 1,
+	'miniaturefilterposition' => 1,
+	'minimumbitrate' => 1,
+	'minoltacamerasettings' => 1,
+	'minoltacamerasettings2' => 1,
+	'minoltacamerasettings5d' => 1,
+	'minoltacamerasettings7d' => 1,
+	'minoltacamerasettingsold' => 1,
+	'minoltamakernote' => 1,
+	'minoltamma0' => 1,
+	'minoltamma1' => 1,
+	'minoltaprd' => 1,
+	'minoltarif' => 1,
+	'minoltatags' => 1,
+	'minoltattw' => 1,
+	'minoltawbg' => 1,
+	'minorversion' => 1,
+	'minpacketsize' => 1,
+	'mintransmissiontime' => 1,
+	'mmclips' => 1,
+	'mngheader' => 1,
+	'modeextension' => 1,
+	'model2' => 1,
+	'modelandversion' => 1,
+	'modeltiepoint' => 1,
+	'modeltransform' => 1,
+	'modeltype' => 1,
+	'modenumber' => 1,
+	'modificationpermissions' => 1,
+	'modifiedby' => 1,
+	'modifiedinfo' => 1,
+	'montage' => 1,
+	'month' => 1,
+	'mood' => 1,
+	'moreinfobannerimage' => 1,
+	'moreinfobannerurl' => 1,
+	'moreinfotext' => 1,
+	'moreinfourl' => 1,
+	'mosaicpattern' => 1,
+	'moveobjects' => 1,
+	'movie' => 1,
+	'moviedata' => 1,
+	'moviedatasize' => 1,
+	'movieheader' => 1,
+	'movieheaderversion' => 1,
+	'movieinfo' => 1,
+	'moviestreamname' => 1,
+	'mp' => 1,
+	'mp1' => 1,
+	'mpeg7binary' => 1,
+	'mpegaudioversion' => 1,
+	'mpf' => 1,
+	'mpfversion' => 1,
+	'mpimage' => 1,
+	'mpimageflags' => 1,
+	'mpimageformat' => 1,
+	'mpimagelength' => 1,
+	'mpimagelist' => 1,
+	'mpimagestart' => 1,
+	'mpimagetype' => 1,
+	'mpindividualnum' => 1,
+	'mrwinfo' => 1,
+	'msdocumenttext' => 1,
+	'msdocumenttextposition' => 1,
+	'mspropertysetstorage' => 1,
+	'msstereo' => 1,
+	'multiexposure' => 1,
+	'multiexposureversion' => 1,
+	'multimediatype' => 1,
+	'multiprofiles' => 1,
+	'multiquality' => 1,
+	'musicby' => 1,
+	'musiccdidentifier' => 1,
+	'musiciancredits' => 1,
+	'mute' => 1,
+	'muxingapp' => 1,
+	'mwg-coll' => 1,
+	'mwg-kw' => 1,
+	'mwg-rs' => 1,
+	'mxfversion' => 1,
+	'mycolors' => 1,
+	'name' => 1,
+	'namedcolor' => 1,
+	'namedcolor2' => 1,
+	'nametableversion' => 1,
+	'narrator' => 1,
+	'nativedisplayinfo' => 1,
+	'nativeresolutionunit' => 1,
+	'nativexresolution' => 1,
+	'nativeyresolution' => 1,
+	'ncc' => 1,
+	'nestlevel' => 1,
+	'netexposurecompensation' => 1,
+	'netname' => 1,
+	'netprovidertype' => 1,
+	'neutals' => 1,
+	'neutobjbacktype' => 1,
+	'neutobjname' => 1,
+	'neutobjtype' => 1,
+	'neutobjversion' => 1,
+	'neutrals' => 1,
+	'newbitdepth' => 1,
+	'newcolortype' => 1,
+	'nextfilename' => 1,
+	'nexttrackid' => 1,
+	'nextuid' => 1,
+	'nikon' => 1,
+	'nikoncaptureoffsets' => 1,
+	'nikondata' => 1,
+	'nikonncdt' => 1,
+	'nikonscanifd' => 1,
+	'nikontags' => 1,
+	'nikonvers' => 1,
+	'ninthlanguage' => 1,
+	'nitf' => 1,
+	'nitfversion' => 1,
+	'noise' => 1,
+	'noiseprofile' => 1,
+	'noisereductiondata' => 1,
+	'nominalbitrate' => 1,
+	'nominalframecount' => 1,
+	'nominallayercount' => 1,
+	'nominalplaytime' => 1,
+	'nomssmarttags' => 1,
+	'note' => 1,
+	'notice' => 1,
+	'now' => 1,
+	'npts' => 1,
+	'nsc_address' => 1,
+	'nsc_description' => 1,
+	'nsc_email' => 1,
+	'nsc_name' => 1,
+	'nsc_phone' => 1,
+	'nullmediaheader' => 1,
+	'numafpoints' => 1,
+	'numberlist' => 1,
+	'numberofcomponents' => 1,
+	'numberofframes' => 1,
+	'numberofimages' => 1,
+	'numberofinks' => 1,
+	'numberofparts' => 1,
+	'numberofplanes' => 1,
+	'numberofresolutions' => 1,
+	'numchannels' => 1,
+	'numcolors' => 1,
+	'numfonts' => 1,
+	'numhistorybuffers' => 1,
+	'numimportantcolors' => 1,
+	'numpackets' => 1,
+	'numproperties' => 1,
+	'numrules' => 1,
+	'numsampleframes' => 1,
+	'numstreams' => 1,
+	'objectfiletype' => 1,
+	'objectid' => 1,
+	'objectsizeannounced' => 1,
+	'objecttype' => 1,
+	'obsoletephotoshoptag1' => 1,
+	'obsoletephotoshoptag2' => 1,
+	'obsoletephotoshoptag3' => 1,
+	'ocad' => 1,
+	'ocadrevision' => 1,
+	'oceapplicationselector' => 1,
+	'oceidnumber' => 1,
+	'oceimagelogic' => 1,
+	'ocescanjobdesc' => 1,
+	'office' => 1,
+	'offsetorigin' => 1,
+	'offsetxy' => 1,
+	'oldxmp' => 1,
+	'olym' => 1,
+	'olympus' => 1,
+	'olympus2100' => 1,
+	'olympus2100ifd' => 1,
+	'olympus2200' => 1,
+	'olympus2200ifd' => 1,
+	'olympus2300' => 1,
+	'olympus2300ifd' => 1,
+	'olympus2400' => 1,
+	'olympus2400ifd' => 1,
+	'olympus2500' => 1,
+	'olympus2500ifd' => 1,
+	'olympus2600' => 1,
+	'olympus2600ifd' => 1,
+	'olympus2700' => 1,
+	'olympus2700ifd' => 1,
+	'olympus2800' => 1,
+	'olympus2800ifd' => 1,
+	'olympus2900' => 1,
+	'olympus2900ifd' => 1,
+	'olympusjunk' => 1,
+	'olympustags1' => 1,
+	'olympustags2' => 1,
+	'olympustags3' => 1,
+	'opacity' => 1,
+	'opcodelist1' => 1,
+	'opcodelist2' => 1,
+	'opcodelist3' => 1,
+	'opcolor' => 1,
+	'opendml' => 1,
+	'openwithapplication' => 1,
+	'operatingsystem' => 1,
+	'operation' => 1,
+	'operationclassid' => 1,
+	'operationid' => 1,
+	'operationnumber' => 1,
+	'opiproxy' => 1,
+	'optimalbitrate' => 1,
+	'orderingrestrictions' => 1,
+	'originalalbum' => 1,
+	'originalalbumtitle' => 1,
+	'originalartist' => 1,
+	'originaldocumentsize' => 1,
+	'originalfilesize' => 1,
+	'originalfiletype' => 1,
+	'originalimagebroker' => 1,
+	'originallyricist' => 1,
+	'originalmedia' => 1,
+	'originalmedium' => 1,
+	'originalrawcreator' => 1,
+	'originalrawfiletype' => 1,
+	'originalrawimage' => 1,
+	'originalrawresource' => 1,
+	'originalreleasetime' => 1,
+	'originalreleaseyear' => 1,
+	'originalscannedimagesize' => 1,
+	'originalthmcreator' => 1,
+	'originalthmfiletype' => 1,
+	'originalthmimage' => 1,
+	'originalthmresource' => 1,
+	'originator' => 1,
+	'originatorreference' => 1,
+	'osversion' => 1,
+	'othercodecdescription' => 1,
+	'othercodecname' => 1,
+	'otherformat' => 1,
+	'otherimage' => 1,
+	'otherimagelength' => 1,
+	'otherimagestart' => 1,
+	'otherinfo' => 1,
+	'othersampledesc' => 1,
+	'outputaudiosamplerate' => 1,
+	'outputdataobjectlist' => 1,
+	'outputprofile' => 1,
+	'outputresponse' => 1,
+	'packets' => 1,
+	'packingmethod' => 1,
+	'page' => 1,
+	'pagecount' => 1,
+	'pageenter' => 1,
+	'pageexit' => 1,
+	'pagefront' => 1,
+	'pagelayout' => 1,
+	'pagemode' => 1,
+	'pagenormal' => 1,
+	'pages' => 1,
+	'pagespecial' => 1,
+	'palette' => 1,
+	'palettehistogram' => 1,
+	'panasonic' => 1,
+	'panorama' => 1,
+	'panorientation' => 1,
+	'panoverlaph' => 1,
+	'panoverlapv' => 1,
+	'paragraphs' => 1,
+	'parameter' => 1,
+	'parasites' => 1,
+	'parentalrating' => 1,
+	'parentalratingreason' => 1,
+	'part' => 1,
+	'partialpalette' => 1,
+	'partofset' => 1,
+	'pastclippingboundary' => 1,
+	'pasteimage' => 1,
+	'patternangle' => 1,
+	'payloadtype' => 1,
+	'paymenturl' => 1,
+	'pcscitation' => 1,
+	'pdahistogram' => 1,
+	'pdf' => 1,
+	'pdfx' => 1,
+	'peakbitrate' => 1,
+	'peakvalue' => 1,
+	'pefversion' => 1,
+	'pentax' => 1,
+	'pentaxdata' => 1,
+	'pentaxjunk' => 1,
+	'pentaxtags' => 1,
+	'perceptualrenderingintentgamut' => 1,
+	'performer' => 1,
+	'performerkeywords' => 1,
+	'performers' => 1,
+	'performersortorder' => 1,
+	'performerurl' => 1,
+	'period' => 1,
+	'perms' => 1,
+	'perpicturenotes' => 1,
+	'personalfunctions' => 1,
+	'personalfunctionvalues' => 1,
+	'petype' => 1,
+	'pfmheader' => 1,
+	'pfmversion' => 1,
+	'pgfversion' => 1,
+	'photoeffectsdata' => 1,
+	'photomech' => 1,
+	'photomechanic' => 1,
+	'photoshop' => 1,
+	'photoshop2colortable' => 1,
+	'photoshop2info' => 1,
+	'photoshopbgrthumbnail' => 1,
+	'photoshopdata' => 1,
+	'photoshopformat' => 1,
+	'photoshopinfo' => 1,
+	'photoshopsettings' => 1,
+	'photoshopthumbnail' => 1,
+	'physicalpixel' => 1,
+	'physicalstreamnumbermap' => 1,
+	'physicalstreamnumbers' => 1,
+	'physicalstreams' => 1,
+	'picslabel' => 1,
+	'picture' => 1,
+	'picturebitsperpixel' => 1,
+	'picturecontrolversion' => 1,
+	'picturectrl' => 1,
+	'picturedescription' => 1,
+	'pictureformat' => 1,
+	'pictureheight' => 1,
+	'pictureindexedcolors' => 1,
+	'pictureinfo' => 1,
+	'picturelength' => 1,
+	'picturemimetype' => 1,
+	'picturestyleinfo' => 1,
+	'picturestyleinfo2' => 1,
+	'picturetype' => 1,
+	'picturewidth' => 1,
+	'pieceinfo' => 1,
+	'pitchandfamily' => 1,
+	'pitchshift' => 1,
+	'pixelaspectratio' => 1,
+	'pixelcalibration' => 1,
+	'pixelformat' => 1,
+	'pixelintensityrange' => 1,
+	'pixellive' => 1,
+	'pixelmagicjbigoptions' => 1,
+	'pixelscale' => 1,
+	'pixelspermeterx' => 1,
+	'pixelspermetery' => 1,
+	'pixelsperunitx' => 1,
+	'pixelsperunity' => 1,
+	'pixelunits' => 1,
+	'pixheight' => 1,
+	'pixwidth' => 1,
+	'places' => 1,
+	'planes' => 1,
+	'playallframes' => 1,
+	'playcounter' => 1,
+	'playduration' => 1,
+	'playerversion' => 1,
+	'playgap' => 1,
+	'playlistdelay' => 1,
+	'playlistid' => 1,
+	'playmode' => 1,
+	'playselection' => 1,
+	'plus' => 1,
+	'podcast' => 1,
+	'podcasturl' => 1,
+	'pointsize' => 1,
+	'popupfillattributes' => 1,
+	'popupflash' => 1,
+	'position' => 1,
+	'postertime' => 1,
+	'postscript2crd0' => 1,
+	'postscript2crd1' => 1,
+	'postscript2crd2' => 1,
+	'postscript2csa' => 1,
+	'postscriptfontname' => 1,
+	'pragma' => 1,
+	'preferredfamily' => 1,
+	'preferredrate' => 1,
+	'preferredsubfamily' => 1,
+	'preferredvolume' => 1,
+	'preroll' => 1,
+	'presentationformat' => 1,
+	'presentationtarget' => 1,
+	'prevfilename' => 1,
+	'preview' => 1,
+	'preview0' => 1,
+	'preview1' => 1,
+	'preview2' => 1,
+	'previewatomindex' => 1,
+	'previewatomtype' => 1,
+	'previewdate' => 1,
+	'previewduration' => 1,
+	'previewifd' => 1,
+	'previewifd_offset' => 1,
+	'previewimagedata' => 1,
+	'previewimageinfo' => 1,
+	'previewinfo' => 1,
+	'previewpict' => 1,
+	'previewpng' => 1,
+	'previewtime' => 1,
+	'previewversion' => 1,
+	'prevsize' => 1,
+	'prevuid' => 1,
+	'primaryitemreference' => 1,
+	'primaryplatform' => 1,
+	'printflags' => 1,
+	'printflagsinfo' => 1,
+	'printimversion' => 1,
+	'printquality' => 1,
+	'printscale' => 1,
+	'printtovideo' => 1,
+	'priority' => 1,
+	'prism' => 1,
+	'private' => 1,
+	'privatebuild' => 1,
+	'prl' => 1,
+	'processing' => 1,
+	'processinginfo' => 1,
+	'prod' => 1,
+	'prodnotes' => 1,
+	'producedby' => 1,
+	'produceddate' => 1,
+	'producednotice' => 1,
+	'producerkeywords' => 1,
+	'product' => 1,
+	'productiondate' => 1,
+	'productiondesigner' => 1,
+	'productionstudio' => 1,
+	'productname' => 1,
+	'productversion' => 1,
+	'productversionnumber' => 1,
+	'profile' => 1,
+	'profileclass' => 1,
+	'profilecmmtype' => 1,
+	'profileconnectionspace' => 1,
+	'profilecreator' => 1,
+	'profiledatetime' => 1,
+	'profiledescription' => 1,
+	'profiledescriptionml' => 1,
+	'profilefilesignature' => 1,
+	'profileheader' => 1,
+	'profileid' => 1,
+	'profileifd' => 1,
+	'profilesequencedesc' => 1,
+	'profilesequenceidentifier' => 1,
+	'profiletype' => 1,
+	'profileversion' => 1,
+	'progid' => 1,
+	'progressivescans' => 1,
+	'projazimuthangle' => 1,
+	'projcentereasting' => 1,
+	'projcenterlat' => 1,
+	'projcenterlong' => 1,
+	'projcenternorthing' => 1,
+	'projcoordtrans' => 1,
+	'project' => 1,
+	'projectedcstype' => 1,
+	'projection' => 1,
+	'projects' => 1,
+	'projfalseeasting' => 1,
+	'projfalsenorthing' => 1,
+	'projfalseorigineasting' => 1,
+	'projfalseoriginlat' => 1,
+	'projfalseoriginlong' => 1,
+	'projfalseoriginnorthing' => 1,
+	'projlinearunits' => 1,
+	'projlinearunitsize' => 1,
+	'projnatoriginlat' => 1,
+	'projnatoriginlong' => 1,
+	'projrectifiedgridangle' => 1,
+	'projscaleatcenter' => 1,
+	'projscaleatnatorigin' => 1,
+	'projstdparallel1' => 1,
+	'projstdparallel2' => 1,
+	'projstraightvertpolelong' => 1,
+	'promoteparent' => 1,
+	'promotionurl' => 1,
+	'prop' => 1,
+	'properties' => 1,
+	'propertysetidcodes' => 1,
+	'propertysetpathname' => 1,
+	'propertystoredata' => 1,
+	'propertyvectorelements' => 1,
+	'protect' => 1,
+	'protectiontype' => 1,
+	'provider' => 1,
+	'providercopyright' => 1,
+	'providerrating' => 1,
+	'providerstyle' => 1,
+	'ps2crdvmsize' => 1,
+	'ps2renderingintent' => 1,
+	'psfontinfo' => 1,
+	'pstringcaption' => 1,
+	'publisherurl' => 1,
+	'pur' => 1,
+	'purchasedate' => 1,
+	'purpose' => 1,
+	'pyramidlevels' => 1,
+	'quickedit' => 1,
+	'quickmaskinfo' => 1,
+	'qvci' => 1,
+	'ra3' => 1,
+	'ra4' => 1,
+	'ra5' => 1,
+	'radiostationname' => 1,
+	'radiostationowner' => 1,
+	'rafversion' => 1,
+	'rasterpadding' => 1,
+	'rate' => 1,
+	'rated' => 1,
+	'rawcodecversion' => 1,
+	'rawdata' => 1,
+	'rawdatalength' => 1,
+	'rawdataoffset' => 1,
+	'rawdatarotation' => 1,
+	'rawdev2' => 1,
+	'rawdev2ifd' => 1,
+	'rawdevelopment' => 1,
+	'rawdevelopmentifd' => 1,
+	'rawimagefullsize' => 1,
+	'rawimagemode' => 1,
+	'rawimagesegmentation' => 1,
+	'rawinfo' => 1,
+	'rawinfoifd' => 1,
+	'rawjpginfo' => 1,
+	'rawzorcreatorversion' => 1,
+	'rawzorrequiredversion' => 1,
+	'rdf' => 1,
+	'readerrequirements' => 1,
+	'realtimestreamingprotocol' => 1,
+	'receivedfrom' => 1,
+	'recengineer' => 1,
+	'recinfo' => 1,
+	'reclocation' => 1,
+	'reconstructiontype' => 1,
+	'recordedby' => 1,
+	'recordeddate' => 1,
+	'recordingcopyright' => 1,
+	'recordingdates' => 1,
+	'recordingtime' => 1,
+	'recordlabelname' => 1,
+	'recordlabelurl' => 1,
+	'rect' => 1,
+	'rectangleofinterest' => 1,
+	'redadjust' => 1,
+	'redeyedata' => 1,
+	'redgain' => 1,
+	'redmatrixcolumn' => 1,
+	'redprimary' => 1,
+	'redsample' => 1,
+	'redtrc' => 1,
+	'redx' => 1,
+	'redy' => 1,
+	'reference' => 1,
+	'referenceblock' => 1,
+	'referencepriority' => 1,
+	'referencevirtual' => 1,
+	'reflectionhardcopyorigcolorimetry' => 1,
+	'reflectionprintoutputcolorimetry' => 1,
+	'refresh' => 1,
+	'relatedimagefile' => 1,
+	'relativepath' => 1,
+	'removehistoryduplicates' => 1,
+	'renderingintent' => 1,
+	'repeateddatabytes' => 1,
+	'replaygainalbumgain' => 1,
+	'replaygainalbumpeak' => 1,
+	'replaygaintrackgain' => 1,
+	'replaygaintrackpeak' => 1,
+	'replyto' => 1,
+	'representativedisparityfar' => 1,
+	'representativedisparitynear' => 1,
+	'representativeimage' => 1,
+	'requirements' => 1,
+	'reserved1' => 1,
+	'resolutioninfo' => 1,
+	'resourceforksize' => 1,
+	'resources' => 1,
+	'resourcesneeded' => 1,
+	'resourcetype' => 1,
+	'resultaspectratio' => 1,
+	'revisiondate' => 1,
+	'revisionnumber' => 1,
+	'revisitafter' => 1,
+	'rgb_profile' => 1,
+	'ricoh' => 1,
+	'ricohjunk' => 1,
+	'ricohrdc2' => 1,
+	'ricohrr1subdir' => 1,
+	'ricohsubdir' => 1,
+	'rightdarkrect' => 1,
+	'rightmag' => 1,
+	'rippedby' => 1,
+	'rjmd' => 1,
+	'rmeta' => 1,
+	'robots' => 1,
+	'rocinfo' => 1,
+	'roidescription' => 1,
+	'rollguidelements' => 1,
+	'root' => 1,
+	'rotationangle' => 1,
+	'roundtripversion' => 1,
+	'rowinterleavefactor' => 1,
+	'runwindow' => 1,
+	'sampledegradationpriority' => 1,
+	'sampleformat' => 1,
+	'samplegroupdescription' => 1,
+	'samplepaddingbits' => 1,
+	'samplerate2' => 1,
+	'samplesize' => 1,
+	'samplesizes' => 1,
+	'sampletable' => 1,
+	'sampletext' => 1,
+	'sampletochunk' => 1,
+	'sampletogroup' => 1,
+	'samsunginfo' => 1,
+	'samsungtags' => 1,
+	'sanyomov' => 1,
+	'sanyomp4' => 1,
+	'saturationinfo' => 1,
+	'saturationrenderingintentgamut' => 1,
+	'saveobjbacktype' => 1,
+	'saveobjects' => 1,
+	'saveobjname' => 1,
+	'saveobjtype' => 1,
+	'saveobjversion' => 1,
+	'savesetup' => 1,
+	'sba_rgbshifts' => 1,
+	'sbaexposurerecord' => 1,
+	'sbainputimagebitdepth' => 1,
+	'sbainputimagecolorspace' => 1,
+	'scalado' => 1,
+	'scale' => 1,
+	'scalecrop' => 1,
+	'scalefactor35efl' => 1,
+	'scalingfactor' => 1,
+	'scandate' => 1,
+	'scannermake' => 1,
+	'scannermodel' => 1,
+	'scannerpixelsize' => 1,
+	'scannerserialnumber' => 1,
+	'scanoperatorid' => 1,
+	'scansoftware' => 1,
+	'scansoftwarerevisiondate' => 1,
+	'sceneappearanceestimates' => 1,
+	'scenecolorimetryestimates' => 1,
+	'school' => 1,
+	'screenbuffersize' => 1,
+	'screendescriptor' => 1,
+	'screening' => 1,
+	'screeningdesc' => 1,
+	'screennail' => 1,
+	'scriptcommand' => 1,
+	'secondarygenre' => 1,
+	'secondlanguage' => 1,
+	'security' => 1,
+	'seek' => 1,
+	'seekable' => 1,
+	'seekhead' => 1,
+	'seekid' => 1,
+	'seekpoint' => 1,
+	'seekposition' => 1,
+	'segmentfamily' => 1,
+	'segmentfilename' => 1,
+	'segmentheader' => 1,
+	'segmentuid' => 1,
+	'selection' => 1,
+	'selectionduration' => 1,
+	'selectiontime' => 1,
+	'selobjbacktype' => 1,
+	'selobjname' => 1,
+	'selobjtype' => 1,
+	'selobjversion' => 1,
+	'sendduration' => 1,
+	'sensorbottomborder' => 1,
+	'sensorid' => 1,
+	'sensorimageheight' => 1,
+	'sensorimagewidth' => 1,
+	'sensorinfo' => 1,
+	'sensorleftborder' => 1,
+	'sensorrightborder' => 1,
+	'sensortopborder' => 1,
+	'serialinfo' => 1,
+	'series' => 1,
+	'serviceorganizationname' => 1,
+	'setcookie' => 1,
+	'setinfo' => 1,
+	'setsubtitle' => 1,
+	'seventhlanguage' => 1,
+	'shadowendpoints' => 1,
+	'shadowsyncsampletable' => 1,
+	'shakereductioninfo' => 1,
+	'shareddata' => 1,
+	'shareddoc' => 1,
+	'shareduserrating' => 1,
+	'sharpinfo' => 1,
+	'sharpmethod' => 1,
+	'sharpnessapproximation' => 1,
+	'sharpnessfreqtable' => 1,
+	'sharpnesstable' => 1,
+	'sharpobjbacktype' => 1,
+	'sharpobjname' => 1,
+	'sharpobjtype' => 1,
+	'sharpobjversion' => 1,
+	'shimdata' => 1,
+	'shootingcount' => 1,
+	'shootingrecord' => 1,
+	'shootobjbacktype' => 1,
+	'shootobjname' => 1,
+	'shootobjtype' => 1,
+	'shootobjversion' => 1,
+	'shootsetup' => 1,
+	'shotinfo' => 1,
+	'shotinfo02xx' => 1,
+	'shotinfod300a' => 1,
+	'shotinfod300b' => 1,
+	'shotinfod300s' => 1,
+	'shotinfod3a' => 1,
+	'shotinfod3b' => 1,
+	'shotinfod3s' => 1,
+	'shotinfod3x' => 1,
+	'shotinfod40' => 1,
+	'shotinfod5000' => 1,
+	'shotinfod700' => 1,
+	'shotinfod7000' => 1,
+	'shotinfod80' => 1,
+	'shotinfod90' => 1,
+	'shotinfounknown' => 1,
+	'shotinfoversion' => 1,
+	'showmode' => 1,
+	'showobjects' => 1,
+	'shutter' => 1,
+	'shuttercurtainhack' => 1,
+	'shutterspeed' => 1,
+	'shutterspeeddisplayed' => 1,
+	'sidebars' => 1,
+	'sigma' => 1,
+	'signalnumber' => 1,
+	'signature' => 1,
+	'signature_name' => 1,
+	'signaturealgo' => 1,
+	'signatureelementlist' => 1,
+	'signatureelements' => 1,
+	'signaturehash' => 1,
+	'signaturepublickey' => 1,
+	'signatureslot' => 1,
+	'signatureusagerights' => 1,
+	'signedelement' => 1,
+	'signercontactinfo' => 1,
+	'significantbits' => 1,
+	'signingauthority' => 1,
+	'signingdate' => 1,
+	'signinglocation' => 1,
+	'signingreason' => 1,
+	'signtype' => 1,
+	'silenttracknumber' => 1,
+	'silenttracks' => 1,
+	'simpleblock' => 1,
+	'simpleindex' => 1,
+	'simpletag' => 1,
+	'simplicityprofile' => 1,
+	'singlequality' => 1,
+	'site' => 1,
+	'siteenter' => 1,
+	'siteexit' => 1,
+	'sixthlanguage' => 1,
+	'size' => 1,
+	'sizemode' => 1,
+	'skip' => 1,
+	'slices' => 1,
+	'slides' => 1,
+	'slideshow' => 1,
+	'smaxsamplevalue' => 1,
+	'sminsamplevalue' => 1,
+	'snapshotid' => 1,
+	'snapshotname' => 1,
+	'softedit' => 1,
+	'softfocusfilter' => 1,
+	'softwarerelease' => 1,
+	'songwriter' => 1,
+	'songwriterkeywords' => 1,
+	'sony' => 1,
+	'sonyimageheight' => 1,
+	'sonyimagewidth' => 1,
+	'sortalbum' => 1,
+	'sortalbumartist' => 1,
+	'sortartist' => 1,
+	'sortcomposer' => 1,
+	'sortname' => 1,
+	'sortshow' => 1,
+	'soundschemetitle' => 1,
+	'sourcecredits' => 1,
+	'sourcedata' => 1,
+	'sourcedate' => 1,
+	'sourceedition' => 1,
+	'sourceform' => 1,
+	'sourceid' => 1,
+	'sourceimagedirectory' => 1,
+	'sourceimagefilename' => 1,
+	'sourceimageheight' => 1,
+	'sourceimagevolumename' => 1,
+	'sourceimagewidth' => 1,
+	'sourcepublisher' => 1,
+	'sourcerights' => 1,
+	'sourcetitle' => 1,
+	'sourceurl' => 1,
+	'spatialorientation' => 1,
+	'spatialresolution' => 1,
+	'specialbuild' => 1,
+	'specialeffectsopticalfilter' => 1,
+	'specialfolderdata' => 1,
+	'speed' => 1,
+	'spiff' => 1,
+	'spiffversion' => 1,
+	'spothalftone' => 1,
+	'sr2dataifd' => 1,
+	'sr2private' => 1,
+	'sr2subifdkey' => 1,
+	'sr2subifdlength' => 1,
+	'sr2subifdoffset' => 1,
+	'srf2key' => 1,
+	'srf6offset' => 1,
+	'srfdataoffset' => 1,
+	'srgbrendering' => 1,
+	'stamptoolcount' => 1,
+	'starring' => 1,
+	'startofframe' => 1,
+	'starttime' => 1,
+	'statistics' => 1,
+	'stdautoactive' => 1,
+	'stdbasename' => 1,
+	'stdhotfolder' => 1,
+	'stdopeninphotoshop' => 1,
+	'stdoutputbitdepth' => 1,
+	'stdoutputcolormode' => 1,
+	'stdoutputfiletype' => 1,
+	'stdoxygen' => 1,
+	'stdsaveselection' => 1,
+	'stdscaledoutput' => 1,
+	'stdsharpenoutput' => 1,
+	'stereo' => 1,
+	'stereo3dmode' => 1,
+	'stereoimage' => 1,
+	'stereomode' => 1,
+	'stim' => 1,
+	'stimversion' => 1,
+	'stitchinfo' => 1,
+	'stonits' => 1,
+	'storage-streampathname' => 1,
+	'stream' => 1,
+	'streamavgbitrate' => 1,
+	'streamavgpacketsize' => 1,
+	'streambitdepth' => 1,
+	'streambitrateprops' => 1,
+	'streamcolor' => 1,
+	'streamcount' => 1,
+	'streamdata' => 1,
+	'streamduration' => 1,
+	'streamheader' => 1,
+	'streaminfo' => 1,
+	'streamingdataprotocol' => 1,
+	'streammaxbitrate' => 1,
+	'streammaxpacketsize' => 1,
+	'streammimelen' => 1,
+	'streammimetype' => 1,
+	'streamname' => 1,
+	'streamnamelen' => 1,
+	'streamnumber' => 1,
+	'streampreroll' => 1,
+	'streamprioritization' => 1,
+	'streamproperties' => 1,
+	'streamsamplecount' => 1,
+	'streamsamplerate' => 1,
+	'streamstarttime' => 1,
+	'streamtype' => 1,
+	'streamtypeinfo' => 1,
+	'stridable' => 1,
+	'strikeout' => 1,
+	'stripbytecounts' => 1,
+	'stripoffsets' => 1,
+	'striprowcounts' => 1,
+	'strobe' => 1,
+	'strobetime' => 1,
+	'sub-sampleinformation' => 1,
+	'subdir3000' => 1,
+	'subdir3100' => 1,
+	'subdir3400' => 1,
+	'subdir3900' => 1,
+	'subfile' => 1,
+	'subifd' => 1,
+	'subifd0' => 1,
+	'subifd1' => 1,
+	'subifd2' => 1,
+	'subifd255' => 1,
+	'subifd3' => 1,
+	'subifd4' => 1,
+	'subifd5' => 1,
+	'subifd6' => 1,
+	'subifd_offset' => 1,
+	'subimagecolor' => 1,
+	'subimagehdr' => 1,
+	'subimageheight' => 1,
+	'subimageicc_profile' => 1,
+	'subimagenumericalformat' => 1,
+	'subimageresolutions' => 1,
+	'subimagetilecount' => 1,
+	'subimagetileheight' => 1,
+	'subimagetilewidth' => 1,
+	'subimagewidth' => 1,
+	'subjectpixelheight' => 1,
+	'subjectpixelwidth' => 1,
+	'subjectscale' => 1,
+	'subjectunits' => 1,
+	'subpacketh' => 1,
+	'subpacketsize' => 1,
+	'subscriptioncontentid' => 1,
+	'subseccreatedate' => 1,
+	'subsecdatetimeoriginal' => 1,
+	'subsecmodifydate' => 1,
+	'subsystem' => 1,
+	'subsystemversion' => 1,
+	'subtileblocksize' => 1,
+	'subtitle' => 1,
+	'subtitledescription' => 1,
+	'subtitlekeywords' => 1,
+	'suggestedpalette' => 1,
+	'summaryinfo' => 1,
+	'surroundmode' => 1,
+	'svgversion' => 1,
+	'swf' => 1,
+	'synchronizedlyrictext' => 1,
+	'syncsampletable' => 1,
+	't4options' => 1,
+	't6options' => 1,
+	't82options' => 1,
+	't88options' => 1,
+	'tag' => 1,
+	'tagattachmentuid' => 1,
+	'tagbinary' => 1,
+	'tagchapteruid' => 1,
+	'tagdefault' => 1,
+	'tageditionuid' => 1,
+	'taggedpdf' => 1,
+	'taggingtime' => 1,
+	'taglanguage' => 1,
+	'tagname' => 1,
+	'tags' => 1,
+	'tagstring' => 1,
+	'tagtrackuid' => 1,
+	'targetaudiences' => 1,
+	'targetdeltatype' => 1,
+	'targetfiledosname' => 1,
+	'targetfilesize' => 1,
+	'targetprinter' => 1,
+	'targets' => 1,
+	'targettype' => 1,
+	'targettypevalue' => 1,
+	'targetxy' => 1,
+	'tdat' => 1,
+	'tdhd' => 1,
+	'technician' => 1,
+	'technology' => 1,
+	'telephonenumber' => 1,
+	'temperature' => 1,
+	'tempinfok5' => 1,
+	'template' => 1,
+	'terminationaction' => 1,
+	'terminationcondition' => 1,
+	'termsofuse' => 1,
+	'testtarget' => 1,
+	'text' => 1,
+	'textinfo' => 1,
+	'textjunk' => 1,
+	'textualdata' => 1,
+	'textualinfo' => 1,
+	'things' => 1,
+	'thirdlanguage' => 1,
+	'thumbnail' => 1,
+	'thumbnailclip' => 1,
+	'tickspersecond' => 1,
+	'tiff' => 1,
+	'tiff-epstandardid' => 1,
+	'tiff_fxextensions' => 1,
+	'tiffpreview' => 1,
+	'tilebytecounts' => 1,
+	'tiledepth' => 1,
+	'tileoffsets' => 1,
+	'timecode' => 1,
+	'timecodeindex' => 1,
+	'timecodeindexparms' => 1,
+	'timecodescale' => 1,
+	'timeinfo' => 1,
+	'timeoffset' => 1,
+	'timereference' => 1,
+	'timescale' => 1,
+	'timeslice' => 1,
+	'timetosampletable' => 1,
+	'title2' => 1,
+	'titlelen' => 1,
+	'titleofparts' => 1,
+	'titlesofparts' => 1,
+	'titlesortorder' => 1,
+	'tocitems' => 1,
+	'tonecurvematching' => 1,
+	'tonecurvetable' => 1,
+	'tonematrix' => 1,
+	'toneobjbacktype' => 1,
+	'toneobjname' => 1,
+	'toneobjtype' => 1,
+	'toneobjversion' => 1,
+	'tones' => 1,
+	'tonespaceflow' => 1,
+	'toolname' => 1,
+	'toolversion' => 1,
+	'topmag' => 1,
+	'totalbitrate' => 1,
+	'totalbytes' => 1,
+	'totalbytesnortpheaders' => 1,
+	'totaldatarate' => 1,
+	'totalduration' => 1,
+	'totaledittime' => 1,
+	'totalframecount' => 1,
+	'totalframes' => 1,
+	'totalsamples' => 1,
+	'toycamerafilter' => 1,
+	'track' => 1,
+	'trackattachmentuid' => 1,
+	'trackcategory' => 1,
+	'trackcomments' => 1,
+	'trackcreatedate' => 1,
+	'trackdefault' => 1,
+	'trackduration' => 1,
+	'trackentry' => 1,
+	'trackerdata' => 1,
+	'trackforced' => 1,
+	'trackheader' => 1,
+	'trackheaderversion' => 1,
+	'trackid' => 1,
+	'tracklacing' => 1,
+	'tracklanguage' => 1,
+	'tracklayer' => 1,
+	'tracklyrics' => 1,
+	'trackmodifydate' => 1,
+	'trackname' => 1,
+	'trackoffset' => 1,
+	'trackoverlay' => 1,
+	'trackproperty' => 1,
+	'trackref' => 1,
+	'tracktimecodescale' => 1,
+	'tracktranslate' => 1,
+	'tracktranslatecodec' => 1,
+	'tracktranslateeditionuid' => 1,
+	'tracktranslatetrackid' => 1,
+	'tracktype' => 1,
+	'trackuid' => 1,
+	'trackused' => 1,
+	'trackvolume' => 1,
+	'trademark' => 1,
+	'transferrange' => 1,
+	'transformation' => 1,
+	'transformcreatedate' => 1,
+	'transformedimagetitle' => 1,
+	'transformmodifydate' => 1,
+	'transformnodeid' => 1,
+	'transformparams' => 1,
+	'transformtitle' => 1,
+	'transparency' => 1,
+	'transparencyindicator' => 1,
+	'transparentindex' => 1,
+	'trapindicator' => 1,
+	'trebel' => 1,
+	'tvepisode' => 1,
+	'tvepisodeid' => 1,
+	'tvnetworkname' => 1,
+	'tvseason' => 1,
+	'tvshow' => 1,
+	'typeoforiginal' => 1,
+	'typist' => 1,
+	'ucrbg' => 1,
+	'uic1tag' => 1,
+	'uic2tag' => 1,
+	'uic3tag' => 1,
+	'uic4tag' => 1,
+	'uncompressed' => 1,
+	'uncompressedsize' => 1,
+	'underline' => 1,
+	'underlineposition' => 1,
+	'underlinethickness' => 1,
+	'unicodealphanames' => 1,
+	'uninitializeddatasize' => 1,
+	'uniquefileidentifier' => 1,
+	'units' => 1,
+	'unknown' => 1,
+	'unknownd30' => 1,
+	'unknowndata' => 1,
+	'unknowninfo' => 1,
+	'unknowninfo2' => 1,
+	'unknowninfo2version' => 1,
+	'unknowninfoifd' => 1,
+	'unknowninfoversion' => 1,
+	'unknowntags' => 1,
+	'unsharpdata' => 1,
+	'unused' => 1,
+	'ur3' => 1,
+	'url_list' => 1,
+	'urn' => 1,
+	'usagerightsmessage' => 1,
+	'usedextensionnumbers' => 1,
+	'useraccess' => 1,
+	'useradjsba_rgbshifts' => 1,
+	'userdata' => 1,
+	'userdefinedid' => 1,
+	'userdefinedtext' => 1,
+	'userdefinedurl' => 1,
+	'userselectgrouptitle' => 1,
+	'userweburl' => 1,
+	'usingtransforms' => 1,
+	'usptomiscellaneous' => 1,
+	'usptooriginalcontenttype' => 1,
+	'utm' => 1,
+	'uuid-exif' => 1,
+	'uuid-flip' => 1,
+	'uuid-geojp2' => 1,
+	'uuid-iptc' => 1,
+	'uuid-prof' => 1,
+	'uuid-unknown' => 1,
+	'uuid-usmt' => 1,
+	'uuid-xmp' => 1,
+	'uuidinfo' => 1,
+	'uuidlist' => 1,
+	'validafpoints' => 1,
+	'vary' => 1,
+	'vbrbytes' => 1,
+	'vbrframes' => 1,
+	'vbrpeak' => 1,
+	'vbrscale' => 1,
+	'vegasversionmajor' => 1,
+	'vegasversionminor' => 1,
+	'vendor' => 1,
+	'vendorid' => 1,
+	'vendorname' => 1,
+	'vendorurl' => 1,
+	'version2' => 1,
+	'versionbf' => 1,
+	'versionifd' => 1,
+	'versioninfo' => 1,
+	'versionyear' => 1,
+	'verticalcitation' => 1,
+	'verticalcstype' => 1,
+	'verticaldatum' => 1,
+	'verticaldivergence' => 1,
+	'verticalunits' => 1,
+	'video' => 1,
+	'videoattributes' => 1,
+	'videoavgbitrate' => 1,
+	'videoavgframerate' => 1,
+	'videobitrate' => 1,
+	'videocardgamma' => 1,
+	'videoclosedcaptioning' => 1,
+	'videocodecdescription' => 1,
+	'videocodecid' => 1,
+	'videocodecinfo' => 1,
+	'videocodecname' => 1,
+	'videoencoding' => 1,
+	'videoformat' => 1,
+	'videoframecount' => 1,
+	'videoheader' => 1,
+	'videoheight' => 1,
+	'videomaxbitrate' => 1,
+	'videomaxframerate' => 1,
+	'videomode' => 1,
+	'videoprofile' => 1,
+	'videoprofileversion' => 1,
+	'videosampledesc' => 1,
+	'videoscantype' => 1,
+	'videosize' => 1,
+	'videostreamtype' => 1,
+	'videotrackid' => 1,
+	'videowidth' => 1,
+	'viewable' => 1,
+	'viewingconddesc' => 1,
+	'viewingcondilluminant' => 1,
+	'viewingcondilluminanttype' => 1,
+	'viewingconditions' => 1,
+	'viewingcondsurround' => 1,
+	'viewtype' => 1,
+	'vignettingcorr' => 1,
+	'vignettingcorr2' => 1,
+	'virtualimageheight' => 1,
+	'virtualimagewidth' => 1,
+	'virtualpage' => 1,
+	'virtualpageunits' => 1,
+	'visibleoutputs' => 1,
+	'vistaidlistdata' => 1,
+	'void' => 1,
+	'volumeid' => 1,
+	'volumelabel' => 1,
+	'vorbiscomment' => 1,
+	'vorbisversion' => 1,
+	'vrd1' => 1,
+	'vrd2' => 1,
+	'vrdstamptool' => 1,
+	'vrdversion' => 1,
+	'vrinfo' => 1,
+	'vrinfoversion' => 1,
+	'vw96' => 1,
+	'wangannotation' => 1,
+	'wangtag1' => 1,
+	'wangtag3' => 1,
+	'wangtag4' => 1,
+	'warning' => 1,
+	'watermark' => 1,
+	'watermarktype' => 1,
+	'watermarkurl' => 1,
+	'wb_grgblevels' => 1,
+	'wb_rgbcoeffs0' => 1,
+	'wb_rgbcoeffs1' => 1,
+	'wb_rgbcoeffs2' => 1,
+	'wb_rgbcoeffs3' => 1,
+	'wb_rgblevelsauto' => 1,
+	'wb_rgblevelscloudy' => 1,
+	'wb_rgblevelsdaylight' => 1,
+	'wb_rgblevelsflash' => 1,
+	'wb_rgblevelsfluorescent' => 1,
+	'wb_rgblevelsshade' => 1,
+	'wb_rgblevelstungsten' => 1,
+	'wb_rgbmul0' => 1,
+	'wb_rgbmul1' => 1,
+	'wb_rgbmul2' => 1,
+	'wb_rgbmul3' => 1,
+	'wbadjdata' => 1,
+	'wbinfoa100' => 1,
+	'wcsprofiles' => 1,
+	'weight' => 1,
+	'whitebalancematching' => 1,
+	'whitebalancetable' => 1,
+	'whitepointx' => 1,
+	'whitepointy' => 1,
+	'whitesample' => 1,
+	'whitesamplebits' => 1,
+	'whitesampleheight' => 1,
+	'whitesampleleftborder' => 1,
+	'whitesampletopborder' => 1,
+	'whitesamplewidth' => 1,
+	'wide' => 1,
+	'widthbytes' => 1,
+	'widthresolution' => 1,
+	'windowlocation' => 1,
+	'windoworigin' => 1,
+	'windoworiginauto' => 1,
+	'windowsize' => 1,
+	'windowtarget' => 1,
+	'wmadrcaveragereference' => 1,
+	'wmadrcaveragetarget' => 1,
+	'wmadrcpeakreference' => 1,
+	'wmadrcpeaktarget' => 1,
+	'wmcollectiongroupid' => 1,
+	'wmcollectionid' => 1,
+	'wmcontentid' => 1,
+	'words' => 1,
+	'workflowurl' => 1,
+	'workingdirectory' => 1,
+	'workingpath' => 1,
+	'worldtime' => 1,
+	'writer' => 1,
+	'writingapp' => 1,
+	'writtenby' => 1,
+	'wwsfamilyname' => 1,
+	'wwssubfamilyname' => 1,
+	'x' => 1,
+	'xcfversion' => 1,
+	'xclippathunits' => 1,
+	'xheight' => 1,
+	'xmag' => 1,
+	'xmethod' => 1,
+	'xml' => 1,
+	'xmldata' => 1,
+	'xmp_profile' => 1,
+	'xmpbj' => 1,
+	'xmpdm' => 1,
+	'xmpextension' => 1,
+	'xmpmm' => 1,
+	'xmpnote' => 1,
+	'xmpplus' => 1,
+	'xmprights' => 1,
+	'xmptpg' => 1,
+	'xp_dip_xml' => 1,
+	'xylocation' => 1,
+	'xyoffsetinfo' => 1,
+	'yawangle' => 1,
+	'yclippathunits' => 1,
+	'year' => 1,
+	'ylevel' => 1,
+	'ymag' => 1,
+	'ymethod' => 1,
+	'ytarget' => 1,
+	'zipbitflag' => 1,
+	'zipcompressedsize' => 1,
+	'zipcompression' => 1,
+	'zipcrc' => 1,
+	'zipfilename' => 1,
+	'zipmodifydate' => 1,
+	'ziprequiredversion' => 1,
+	'zipuncompressedsize' => 1,
+	'zoom' => 1,
+	'zoomedpreviewimage' => 1,
+	'zoompos' => 1,
+);
+
+# module names for writable Composite tags
+my %compositeModules = (
+	'filenumber' => 'Image::ExifTool::Canon',
+	'jpgfromraw' => 'Image::ExifTool::Exif',
+	'originaldecisiondata' => 'Image::ExifTool::Canon',
+	'previewimage' => 'Image::ExifTool::Exif',
+	'thumbnailimage' => 'Image::ExifTool::Exif',
+);
+
+#++++ End automatically generated code ++++
+
+my %specialStruct = (
+    NAMESPACE   => 1,
+    STRUCT_NAME => 1,
+    TYPE        => 1,
+    NOTES       => 1,
+);
+
+# insert any user-defined tags into our tag lookup
+if (%Image::ExifTool::UserDefined) {
+    my @userTables = sort keys %Image::ExifTool::UserDefined;
+    while (@userTables) {
+        my $table = shift @userTables;
+        AddTags($Image::ExifTool::UserDefined{$table}, $table);
+    }
+}
+
+# insert any other queued tags from plug-in modules
+if (@Image::ExifTool::pluginTags) {
+    my $args;
+    foreach $args (@Image::ExifTool::pluginTags) {
+        AddTags($$args[0], $$args[1]);
+    }
+    undef @Image::ExifTool::pluginTags;
+}
+
+
+#------------------------------------------------------------------------------
+# Add tag names corresponding to flattened XMP tags for all structure fields
+# Inputs: 0) tag table ref for flattened tags, 1) tagID, 2) lowercase tag name,
+#         3) tag ID list ref, 4) reference to list of lowercase tag names
+#         5) table number in lookup, 6) tagInfo hash for parent structure
+#         7) tag ID of top-level stucture
+# Notes: Used only for user-defined structures
+sub AddFields($$$$$$;$$)
+{
+    my ($tagTablePtr, $tagID, $lcTag, $tagIDs, $lcTags, $tnum, $tagInfo, $baseID) = @_;
+    unless ($tagInfo) {
+        $tagInfo = $$tagTablePtr{$tagID};
+        $baseID = $tagID;
+    }
+    my $strTable = $$tagInfo{Struct};
+    unless (ref $strTable) {
+        my $strName = $strTable;
+        $strTable = $Image::ExifTool::UserDefined::xmpStruct{$strTable};
+        $strTable or warn("No definition for structure '$strName'\n"), return;
+        $$strTable{STRUCT_NAME} or $$strTable{STRUCT_NAME} = $strName;
+        $$tagInfo{Struct} = $strTable;  # replace name with hash ref
+        delete $$tagInfo{SubDirectory}; # deprecated use of SubDirectory in Struct tags
+    }
+    # inherit NAMESPACE from parent table if it doesn't exist
+    $$strTable{NAMESPACE} = $$tagTablePtr{NAMESPACE} unless exists $$strTable{NAMESPACE};
+    my $field;
+    foreach $field (keys %$strTable) {
+        next if $specialStruct{$field};
+        my $id = $tagID . ucfirst($field);
+        # use name of existing flattened tag if already defined
+        my $lc = $$tagTablePtr{$id} ? lc $$tagTablePtr{$id}{Name} : $lcTag . lc($field);
+        my $copyID = $baseID;
+        push @$tagIDs, \$copyID, $id;
+        push @$lcTags, $lc, $lc;
+        my $fieldInfo = $$strTable{$field};
+        next unless ref $fieldInfo eq 'HASH' and $$fieldInfo{Struct};
+        # recursively add flattened tags for all sub-fields
+        AddFields($tagTablePtr, $id, $lc, $tagIDs, $lcTags, $tnum, $fieldInfo, $baseID);
+    }
+}
+
+#------------------------------------------------------------------------------
+# Add tags to the lookup (for user-defined tags, etc)
+# Inputs: 0) tag table ref, 1) table name
+my %tableNumHash;
+sub AddTags($$)
+{
+    my ($tagTablePtr, $table) = @_;
+
+    # generate lookup for table numbers if not done already
+    unless (%tableNumHash) {
+        my $tnum = 0;
+        my $tbl;
+        foreach $tbl (@tableList) {
+            $tableNumHash{$tbl} = $tnum++;
+        }
+    }
+    my (@moreTables, %moreTableRefs);
+    for (;;) {
+        my $tnum = $tableNumHash{$table};
+        unless (defined $tnum) {
+            # add new table to list
+            $tnum = scalar @tableList;
+            push @tableList, $table;
+        }
+        my $tagID;
+        foreach $tagID (Image::ExifTool::TagTableKeys($tagTablePtr)) {
+            my $newInfo = $$tagTablePtr{$tagID};
+            if (ref $newInfo eq 'HASH') {
+                $$newInfo{Name} or $$newInfo{Name} = ucfirst($tagID);
+                # use new ID of tag in Composite table in case it changed
+                $tagID = $$newInfo{NewTagID} if defined $$newInfo{NewTagID};
+            } else {
+                $newInfo = $$tagTablePtr{$tagID} = { Name => $newInfo };
+            }
+            my $lcTag = lc $$newInfo{Name};
+            my (@lcTags, @tagIDs, $existed, $isFlat);
+            # if this is a structure, add all flattened tag names to lookup
+            if ($$newInfo{Struct}) {
+                AddFields($tagTablePtr, $tagID, $lcTag, \@tagIDs, \@lcTags, $tnum);
+            }
+            # add tags to lookup even though we don't know if they are writable
+            # (to save speed by not having to load the module)
+Tags:       for (;;) {
+                my $lookup = $tagLookup{$lcTag};
+                $lookup or $lookup = $tagLookup{$lcTag} = { };
+                if ($$lookup{$tnum}) {
+                    my $le = $$lookup{$tnum};
+                    my $ids = (ref $le eq 'ARRAY') ? $le : [ $le ];
+                    if (ref $tagID) {
+                        # a reference points to the tag ID of the base structure for
+                        # a flattened tag.  There must be only one of these,
+                        # and it must come first.
+                        unshift @$ids, $tagID unless ref $$ids[0];
+                    # only add new tag ID if it didn't already exist
+                    } elsif (grep /^$tagID$/, @$ids) {
+                        $existed = 1 unless $isFlat;
+                    } else {
+                        push @$ids, $tagID;
+                    }
+                    # only update lookup if there is now more than one entry
+                    $$lookup{$tnum} = $ids if @$ids > 1;
+                } else {
+                    $$lookup{$tnum} = $tagID;
+                }
+                last unless @tagIDs;
+                for (;;) {
+                    $tagID = shift @tagIDs;
+                    $lcTag = shift @lcTags;
+                    last unless $$tagTablePtr{$tagID}; # don't waste time if it exists
+                    last Tags unless @tagIDs;
+                }
+                $isFlat = 1;
+            }
+            # add any new subdirectory tables (unless done already)
+            next if $existed or not $$newInfo{SubDirectory};
+            my $subTable = $$newInfo{SubDirectory}{TagTable};
+            next unless $subTable and not defined $tableNumHash{$subTable};
+            next if $moreTableRefs{$subTable};
+            no strict 'refs';
+            next unless %$subTable;
+            # save new table to process after this one
+            push @moreTables, $subTable;
+            $moreTableRefs{$subTable} = \%$subTable;
+            # save source table name so we can load it when necessary
+            $$subTable{SRC_TABLE} = $table;
+        }
+        $table = shift @moreTables or last;
+        $tagTablePtr = $moreTableRefs{$table};
+    }
+}
+
+#------------------------------------------------------------------------------
+# Return true if the tag exists
+# Inputs: 0) tag name (case insensitive)
+# Returns: true if tag exists
+sub TagExists($)
+{
+    my $tag = lc($_[0]);
+    return 1 if $tagExists{$tag} or $tagLookup{$tag};
+    return 0;
+}
+
+#------------------------------------------------------------------------------
+# Find information for writable tags (case insensitive)
+# Inputs: 0) tag name (case insensitive)
+# Returns: Scalar context: tag info or false if none found
+#          List context: list of all matching tagInfo hashes
+sub FindTagInfo($)
+{
+    local $_;
+    my $tag = shift;
+    my $lcTag = lc($tag);
+    my ($tableNum, @tagInfoList);
+    my $lookup = $tagLookup{$lcTag};
+    if ($lookup) {
+        foreach $tableNum (keys %$lookup) {
+            my $table = GetTagTable($tableList[$tableNum]);
+            my $le = $$lookup{$tableNum};
+            my ($tagID, $tagIDs);
+            if (ref $le eq 'ARRAY') {
+                $tagIDs = $le;
+                # if first entry is a reference, it indicates that this is a
+                # flattened tag and refers to the tag ID of the containing top-level
+                # structure, so now is the time to generate the flattened tags
+                if (ref $$tagIDs[0]) {
+                    # (remove from the lookup since we only need to do this once)
+                    my $rootIDPtr = shift @$tagIDs;
+                    require Image::ExifTool::XMP;
+                    Image::ExifTool::XMP::AddFlattenedTags($table, $$rootIDPtr);
+                }
+            } else {
+                $tagIDs = [ $le ];
+            }
+            foreach $tagID (@$tagIDs) {
+                my @infoList = GetTagInfoList($table,$tagID);
+                unless (@infoList) {
+                    my $reload;
+                    # call write proc if it exists in case it adds tags to the table
+                    my $writeProc = $table->{WRITE_PROC};
+                    $reload = 1 if $writeProc and &$writeProc();
+                    # load module with composite tag if necessary
+                    my $compMod = $compositeModules{$lcTag};
+                    $reload = 1 if $compMod and eval "require $compMod";
+                    @infoList = GetTagInfoList($table,$tagID) if $reload;
+                }
+                if (@infoList == 1) {
+                    push @tagInfoList, @infoList;
+                } elsif (@infoList > 1) {
+                    my $tagInfo;
+                    # must check tag list in case tags have different names
+                    foreach $tagInfo (@infoList) {
+                        next unless $lcTag eq lc($$tagInfo{Name});
+                        push @tagInfoList, $tagInfo;
+                    }
+                }
+            }
+        }
+    }
+    if (wantarray) {
+        return @tagInfoList;
+    } else {
+        return $tagInfoList[0];
+    }
+}
+
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::TagLookup - Fast lookup for ExifTool tags
+
+=head1 SYNOPSIS
+
+This module is required by Image::ExifTool for writing tags.
+
+=head1 DESCRIPTION
+
+Provides a fast, case insensitive lookup for tag names.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool(3pm)|Image::ExifTool>,
+L<Image::ExifTool::BuildTagLookup(3pm)|Image::ExifTool::BuildTagLookup>,
+L<Image::ExifTool::TagNames(3pm)|Image::ExifTool::TagNames>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/TagNames.pod
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/TagNames.pod	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/TagNames.pod	(revision 24799)
@@ -0,0 +1,21213 @@
+
+=head1 NAME
+
+Image::ExifTool::TagNames - ExifTool tag name documentation
+
+=head1 DESCRIPTION
+
+This document contains a complete list of ExifTool tag names, organized into
+tables based on information type.  Tag names are used to reference specific
+meta information extracted from or written to a file.
+
+=head1 TAG TABLES
+
+The tables listed below give the names of all tags recognized by ExifTool.
+
+B<Tag ID>, B<Index> or B<Sequence> is given in the first column of each
+table.  A B<Tag ID> is the computer-readable equivalent of a tag name, and
+is the identifier that is actually stored in the file.  An B<Index> refers
+to the location of a value when found at a fixed position within a data
+block, and B<Sequence> gives the order of values for a serial data stream.
+
+A B<Tag Name> is the handle by which the information is accessed in
+ExifTool.  In some instances, more than one name may correspond to a single
+tag ID.  In these cases, the actual name used depends on the context in
+which the information is found.  Case is not significant for tag names.  A
+question mark (C<?>) after a tag name indicates that the information is
+either not understood, not verified, or not very useful -- these tags are
+not extracted by ExifTool unless the Unknown (-u) option is enabled.  Be
+aware that some tag names are different than the descriptions printed out by
+default when extracting information with exiftool.  To see the tag names
+instead of the descriptions, use C<exiftool -s>.
+
+The B<Writable> column indicates whether the tag is writable by ExifTool.
+Anything but an C<N> in this column means the tag is writable.  A C<Y>
+indicates writable information that is either unformatted or written using
+the existing format.  Other expressions give details about the information
+format, and vary depending on the general type of information.  The format
+name may be followed by a number in square brackets to indicate the number
+of values written, or the number of characters in a fixed-length string
+(including a null terminator which is added if required).
+
+A plus sign (C<+>) after an entry in the B<Writable> column indicates a
+"list" tag which supports multiple values and allows individual values to be
+added and deleted.  A slash (C</>) indicates an "avoided" tag that is not
+created when writing if another same-named tag may be created instead.  To
+write these tags, the group should be specified.  A tilde (C<~>) indicates a
+tag this is writable only when the print conversion is disabled (by setting
+PrintConv to 0, using the -n option, or suffixing the tag name with a C<#>
+character).  An exclamation point (C<!>) indicates a tag that is considered
+unsafe to write under normal circumstances.  These "unsafe" tags are not set
+when calling SetNewValuesFromFile() or copied with the exiftool
+-tagsFromFile option unless specified explicitly, and care should be taken
+when editing them manually since they may affect the way an image is
+rendered.  An asterisk (C<*>) indicates a "protected" tag which is not
+writable directly, but is written automatically by ExifTool (often when a
+corresponding Composite or Extra tag is written).  A colon (C<:>) indicates
+a mandatory tag which may be added automatically when writing.
+
+The HTML version of these tables also lists possible B<Values> for
+discrete-valued tags, as well as B<Notes> for some tags.  The B<Values> are
+listed as the computer-readable and human-readable values on the left and
+right hand side of an equals sign (C<=>) respectively.  The human-readable
+values are used by default when reading and writing, but the
+computer-readable values may be accessed by disabling the value conversion
+with the -n option on the command line, by setting the ValueConv option to 0
+in the API, or or on a per-tag basis by appending a number symbol (C<#>) to
+the tag name.
+
+B<Note>: If you are familiar with common meta-information tag names, you may
+find that some ExifTool tag names are different than expected.  The usual
+reason for this is to make the tag names more consistent across different
+types of meta information.  To determine a tag name, either consult this
+documentation or run C<exiftool -s> on a file containing the information in
+question.
+
+=head2 JPEG Tags
+
+This table lists information extracted by ExifTool from JPEG images.
+
+  Tag ID       Tag Name                         Writable
+  ------       --------                         --------
+  'APP0'       JFIF                             JFIF
+               JFXX                             JFIF Extension
+               CIFF                             CanonRaw
+               AVI1                             JPEG AVI1
+               Ocad                             JPEG Ocad
+  'APP1'       EXIF                             EXIF
+               ExtendedXMP                      XMP
+               XMP                              XMP
+               QVCI                             Casio QVCI
+  'APP2'       ICC_Profile                      ICC_Profile
+               FPXR                             FlashPix
+               MPF                              MPF
+               PreviewImage                     N
+  'APP3'       Meta                             Kodak Meta
+               Stim                             Stim
+               PreviewImage                     N
+  'APP4'       Scalado                          JPEG Scalado
+               FPXR                             FlashPix
+               PreviewImage                     N
+  'APP5'       RMETA                            Ricoh RMETA
+  'APP6'       EPPIM                            JPEG EPPIM
+               NITF                             JPEG NITF
+               HP_TDHD                          HP TDHD
+  'APP8'       SPIFF                            JPEG SPIFF
+  'APP10'      Comment                          N
+  'APP12'      PictureInfo                      APP12 PictureInfo
+               Ducky                            APP12 Ducky
+  'APP13'      Photoshop                        Photoshop
+               Adobe_CM                         JPEG AdobeCM
+  'APP14'      Adobe                            JPEG Adobe
+  'APP15'      GraphicConverter                 JPEG GraphConv
+  'COM'        Comment                          Y
+  'DQT'        DefineQuantizationTable          N
+  'SOF'        StartOfFrame                     JPEG SOF
+  'Trailer'    AFCP                             AFCP
+               CanonVRD                         CanonVRD
+               FotoStation                      FotoStation
+               PhotoMechanic                    PhotoMechanic
+               MIE                              MIE
+               PreviewImage                     Y
+
+=head3 JPEG AVI1 Tags
+
+This information may be found in APP0 of JPEG image data from AVI videos.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    InterleavedField                     N
+
+=head3 JPEG Ocad Tags
+
+Tags extracted from the JPEG APP0 "Ocad" segment (found in Photobucket
+images).
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'Rev'    OcadRevision                         N
+
+=head3 JPEG Scalado Tags
+
+Tags extracted from the JPEG APP4 "SCALADO" segment (presumably written by
+Scalado mobile software, L<http://www.scalado.com/>).
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'HGHT'   PreviewImageHeight                   N
+  'QUAL'   PreviewQuality                       N
+  'SPMO'   DataLength                           N
+  'WDTH'   PreviewImageWidth                    N
+
+=head3 JPEG EPPIM Tags
+
+APP6 is used in by the Toshiba PDR-M700 to store a TIFF structure containing
+PrintIM information.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0xc4a5   PrintIM                              PrintIM
+
+=head3 JPEG NITF Tags
+
+Information in APP6 used by the National Imagery Transmission Format.  See
+L<http://www.gwg.nga.mil/ntb/baseline/docs/n010697/bwcguide25aug98.pdf> for
+the official specification.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    NITFVersion                          N
+      2    ImageFormat                          N
+      3    BlocksPerRow                         N
+      5    BlocksPerColumn                      N
+      7    ImageColor                           N
+      8    BitDepth                             N
+      9    ImageClass                           N
+     10    JPEGProcess                          N
+     11    Quality                              N
+     12    StreamColor                          N
+     13    StreamBitDepth                       N
+     14    Flags                                N
+
+=head3 JPEG SPIFF Tags
+
+This information is found in APP8 of SPIFF-style JPEG images (the "official"
+yet rarely used JPEG file format standard: Still Picture Interchange File
+Format).  See L<http://www.jpeg.org/public/spiff.pdf> for the official
+specification.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    SPIFFVersion                         N
+      2    ProfileID                            N
+      3    ColorComponents                      N
+      6    ImageHeight                          N
+     10    ImageWidth                           N
+     14    ColorSpace                           N
+     15    BitsPerSample                        N
+     16    Compression                          N
+     17    ResolutionUnit                       N
+     18    YResolution                          N
+     22    XResolution                          N
+
+=head3 JPEG AdobeCM Tags
+
+The "Adobe_CM" APP13 segment presumably contains color management
+information, but the meaning of the data is currently unknown.  If anyone
+has an idea about what this means, please let me know.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    AdobeCMType                          N
+
+=head3 JPEG Adobe Tags
+
+The "Adobe" APP14 segment stores image encoding information for DCT filters.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    DCTEncodeVersion                     N
+      1    APP14Flags0                          N
+      2    APP14Flags1                          N
+      3    ColorTransform                       N
+
+=head3 JPEG GraphConv Tags
+
+APP15 is used by GraphicConverter to store JPEG quality.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'Q'      Quality                              N
+
+=head3 JPEG SOF Tags
+
+This information is extracted from the JPEG Start Of Frame segment.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  BitsPerSample                                 N
+  ColorComponents                               N
+  EncodingProcess                               N
+  ImageHeight                                   N
+  ImageWidth                                    N
+  YCbCrSubSampling                              N
+
+=head2 EXIF Tags
+
+EXIF stands for "Exchangeable Image File Format".  This type of information
+is formatted according to the TIFF specification, and may be found in JPG,
+TIFF, PNG, PGF, MIFF, HDP, PSP and XCF images, as well as many TIFF-based
+RAW images, and even some AVI and MOV videos.
+
+The EXIF meta information is organized into different Image File Directories
+(IFD's) within an image.  The names of these IFD's correspond to the
+ExifTool family 1 group names.  When writing EXIF information, the default
+B<Group> listed below is used unless another group is specified.
+
+The table below lists all EXIF tags.  Also listed are TIFF, DNG, HDP and
+other tags which are not part of the EXIF specification, but may co-exist
+with EXIF tags in some images.  Tags which are part of the EXIF 2.3
+specification have an underlined B<Tag Name> in the HTML version of this
+documentation.  See
+L<http://www.cipa.jp/english/hyoujunka/kikaku/pdf/DC-008-2010_E.pdf> for the
+official EXIF 2.3 specification.
+
+  Tag ID   Tag Name                  Group      Writable
+  ------   --------                  -----      --------
+  0x0001   InteropIndex              InteropIFD string!
+  0x0002   InteropVersion            InteropIFD undef!:
+  0x000b   ProcessingSoftware        IFD0       string
+  0x00fe   SubfileType               IFD0       int32u!
+  0x00ff   OldSubfileType            IFD0       int16u!
+  0x0100   ImageWidth                IFD0       int32u!
+  0x0101   ImageHeight               IFD0       int32u!
+  0x0102   BitsPerSample             IFD0       int16u[n]!
+  0x0103   Compression               IFD0       int16u!:
+  0x0106   PhotometricInterpretation IFD0       int16u!
+  0x0107   Thresholding              IFD0       int16u!
+  0x0108   CellWidth                 IFD0       int16u!
+  0x0109   CellLength                IFD0       int16u!
+  0x010a   FillOrder                 IFD0       int16u!
+  0x010d   DocumentName              IFD0       string
+  0x010e   ImageDescription          IFD0       string
+  0x010f   Make                      IFD0       string
+  0x0110   Model                     IFD0       string
+  0x0111   StripOffsets              -          N
+           PreviewImageStart         IFD0       int32u*
+           PreviewImageStart         SubIFD1    int32u*
+           JpgFromRawStart           SubIFD2    int32u*
+  0x0112   Orientation               IFD0       int16u
+  0x0115   SamplesPerPixel           IFD0       int16u!
+  0x0116   RowsPerStrip              IFD0       int32u!
+  0x0117   StripByteCounts           -          N
+           PreviewImageLength        IFD0       int32u*
+           PreviewImageLength        SubIFD1    int32u*
+           JpgFromRawLength          SubIFD2    int32u*
+  0x0118   MinSampleValue            IFD0       int16u
+  0x0119   MaxSampleValue            IFD0       int16u
+  0x011a   XResolution               IFD0       rational64u:
+  0x011b   YResolution               IFD0       rational64u:
+  0x011c   PlanarConfiguration       IFD0       int16u!
+  0x011d   PageName                  IFD0       string
+  0x011e   XPosition                 IFD0       rational64u
+  0x011f   YPosition                 IFD0       rational64u
+  0x0120   FreeOffsets               -          N
+  0x0121   FreeByteCounts            -          N
+  0x0122   GrayResponseUnit          IFD0       int16u
+  0x0123   GrayResponseCurve         -          N
+  0x0124   T4Options                 -          N
+  0x0125   T6Options                 -          N
+  0x0128   ResolutionUnit            IFD0       int16u:
+  0x0129   PageNumber                IFD0       int16u[2]
+  0x012c   ColorResponseUnit         -          N
+  0x012d   TransferFunction          IFD0       int16u[768]!
+  0x0131   Software                  IFD0       string
+  0x0132   ModifyDate                IFD0       string
+  0x013b   Artist                    IFD0       string
+  0x013c   HostComputer              IFD0       string
+  0x013d   Predictor                 IFD0       int16u!
+  0x013e   WhitePoint                IFD0       rational64u[2]
+  0x013f   PrimaryChromaticities     IFD0       rational64u[6]
+  0x0140   ColorMap                  -          N
+  0x0141   HalftoneHints             IFD0       int16u[2]
+  0x0142   TileWidth                 IFD0       int32u!
+  0x0143   TileLength                IFD0       int32u!
+  0x0144   TileOffsets               -          N
+  0x0145   TileByteCounts            -          N
+  0x0146   BadFaxLines               -          N
+  0x0147   CleanFaxData              -          N
+  0x0148   ConsecutiveBadFaxLines    -          N
+  0x014a   SubIFD                    -          EXIF
+           A100DataOffset            -          N
+  0x014c   InkSet                    IFD0       int16u
+  0x014d   InkNames                  -          N
+  0x014e   NumberofInks              -          N
+  0x0150   DotRange                  IFD0       string
+  0x0151   TargetPrinter             -          N
+  0x0152   ExtraSamples              -          N
+  0x0153   SampleFormat              -          N
+  0x0154   SMinSampleValue           -          N
+  0x0155   SMaxSampleValue           -          N
+  0x0156   TransferRange             -          N
+  0x0157   ClipPath                  -          N
+  0x0158   XClipPathUnits            -          N
+  0x0159   YClipPathUnits            -          N
+  0x015a   Indexed                   -          N
+  0x015b   JPEGTables                -          N
+  0x015f   OPIProxy                  -          N
+  0x0190   GlobalParametersIFD       -          EXIF
+  0x0191   ProfileType               -          N
+  0x0192   FaxProfile                -          N
+  0x0193   CodingMethods             -          N
+  0x0194   VersionYear               -          N
+  0x0195   ModeNumber                -          N
+  0x01b1   Decode                    -          N
+  0x01b2   DefaultImageColor         -          N
+  0x01b3   T82Options                -          N
+  0x01b5   JPEGTables                -          N
+  0x0200   JPEGProc                  -          N
+  0x0201   ThumbnailOffset           IFD1       int32u*
+           ThumbnailOffset           IFD0       int32u*
+           ThumbnailOffset           SubIFD     int32u*
+           PreviewImageStart         MakerNotes int32u*
+           PreviewImageStart         IFD0       int32u*
+           JpgFromRawStart           SubIFD     int32u*
+           JpgFromRawStart           IFD2       int32u*
+           OtherImageStart           -          N
+  0x0202   ThumbnailLength           IFD1       int32u*
+           ThumbnailLength           IFD0       int32u*
+           ThumbnailLength           SubIFD     int32u*
+           PreviewImageLength        MakerNotes int32u*
+           PreviewImageLength        IFD0       int32u*
+           JpgFromRawLength          SubIFD     int32u*
+           JpgFromRawLength          IFD2       int32u*
+           OtherImageLength          -          N
+  0x0203   JPEGRestartInterval       -          N
+  0x0205   JPEGLosslessPredictors    -          N
+  0x0206   JPEGPointTransforms       -          N
+  0x0207   JPEGQTables               -          N
+  0x0208   JPEGDCTables              -          N
+  0x0209   JPEGACTables              -          N
+  0x0211   YCbCrCoefficients         IFD0       rational64u[3]!
+  0x0212   YCbCrSubSampling          IFD0       int16u[2]!
+  0x0213   YCbCrPositioning          IFD0       int16u!:
+  0x0214   ReferenceBlackWhite       IFD0       rational64u[6]
+  0x022f   StripRowCounts            -          N
+  0x02bc   ApplicationNotes          ExifIFD    XMP
+  0x03e7   USPTOMiscellaneous        -          N
+  0x1000   RelatedImageFileFormat    InteropIFD string!
+  0x1001   RelatedImageWidth         InteropIFD int16u!
+  0x1002   RelatedImageHeight        InteropIFD int16u!
+  0x4746   Rating                    IFD0       int16u/
+  0x4747   XP_DIP_XML                -          N
+  0x4748   StitchInfo                -          Microsoft Stitch
+  0x4749   RatingPercent             IFD0       int16u/
+  0x800d   ImageID                   -          N
+  0x80a3   WangTag1                  -          N
+  0x80a4   WangAnnotation            -          N
+  0x80a5   WangTag3                  -          N
+  0x80a6   WangTag4                  -          N
+  0x80e3   Matteing                  -          N
+  0x80e4   DataType                  -          N
+  0x80e5   ImageDepth                -          N
+  0x80e6   TileDepth                 -          N
+  0x827d   Model2                    -          N
+  0x828d   CFARepeatPatternDim       -          N
+  0x828e   CFAPattern2               -          N
+  0x828f   BatteryLevel              -          N
+  0x8290   KodakIFD                  -          Kodak IFD
+  0x8298   Copyright                 IFD0       string
+  0x829a   ExposureTime              ExifIFD    rational64u
+  0x829d   FNumber                   ExifIFD    rational64u
+  0x82a5   MDFileTag                 -          N
+  0x82a6   MDScalePixel              -          N
+  0x82a7   MDColorTable              -          N
+  0x82a8   MDLabName                 -          N
+  0x82a9   MDSampleInfo              -          N
+  0x82aa   MDPrepDate                -          N
+  0x82ab   MDPrepTime                -          N
+  0x82ac   MDFileUnits               -          N
+  0x830e   PixelScale                -          N
+  0x8335   AdventScale               -          N
+  0x8336   AdventRevision            -          N
+  0x835c   UIC1Tag                   -          N
+  0x835d   UIC2Tag                   -          N
+  0x835e   UIC3Tag                   -          N
+  0x835f   UIC4Tag                   -          N
+  0x83bb   IPTC-NAA                  IFD0       IPTC
+  0x847e   IntergraphPacketData      -          N
+  0x847f   IntergraphFlagRegisters   -          N
+  0x8480   IntergraphMatrix          -          N
+  0x8481   INGRReserved              -          N
+  0x8482   ModelTiePoint             -          N
+  0x84e0   Site                      -          N
+  0x84e1   ColorSequence             -          N
+  0x84e2   IT8Header                 -          N
+  0x84e3   RasterPadding             -          N
+  0x84e4   BitsPerRunLength          -          N
+  0x84e5   BitsPerExtendedRunLength  -          N
+  0x84e6   ColorTable                -          N
+  0x84e7   ImageColorIndicator       -          N
+  0x84e8   BackgroundColorIndicator  -          N
+  0x84e9   ImageColorValue           -          N
+  0x84ea   BackgroundColorValue      -          N
+  0x84eb   PixelIntensityRange       -          N
+  0x84ec   TransparencyIndicator     -          N
+  0x84ed   ColorCharacterization     -          N
+  0x84ee   HCUsage                   -          N
+  0x84ef   TrapIndicator             -          N
+  0x84f0   CMYKEquivalent            -          N
+  0x8546   SEMInfo                   IFD0       string
+  0x8568   AFCP_IPTC                 -          IPTC
+  0x85b8   PixelMagicJBIGOptions     -          N
+  0x85d8   ModelTransform            -          N
+  0x8602   WB_GRGBLevels             -          N
+  0x8606   LeafData                  -          Leaf
+  0x8649   PhotoshopSettings         -          Photoshop
+  0x8769   ExifOffset                -          EXIF
+  0x8773   ICC_Profile               -          ICC_Profile
+  0x877f   TIFF_FXExtensions         -          N
+  0x8780   MultiProfiles             -          N
+  0x8781   SharedData                -          N
+  0x8782   T88Options                -          N
+  0x87ac   ImageLayer                -          N
+  0x87af   GeoTiffDirectory          -          N
+  0x87b0   GeoTiffDoubleParams       -          N
+  0x87b1   GeoTiffAsciiParams        -          N
+  0x8822   ExposureProgram           ExifIFD    int16u
+  0x8824   SpectralSensitivity       ExifIFD    string
+  0x8825   GPSInfo                   -          GPS
+  0x8827   ISO                       ExifIFD    int16u[n]
+  0x8828   Opto-ElectricConvFactor   -          N
+  0x8829   Interlace                 -          N
+  0x882a   TimeZoneOffset            ExifIFD    int16s[n]
+  0x882b   SelfTimerMode             ExifIFD    int16u
+  0x8830   SensitivityType           ExifIFD    int16u
+  0x8831   StandardOutputSensitivity ExifIFD    int32u
+  0x8832   RecommendedExposureIndex  ExifIFD    int32u
+  0x8833   ISOSpeed                  ExifIFD    int32u
+  0x8834   ISOSpeedLatitudeyyy       ExifIFD    int32u
+  0x8835   ISOSpeedLatitudezzz       ExifIFD    int32u
+  0x885c   FaxRecvParams             -          N
+  0x885d   FaxSubAddress             -          N
+  0x885e   FaxRecvTime               -          N
+  0x888a   LeafSubIFD                -          Leaf SubIFD
+  0x9000   ExifVersion               ExifIFD    undef:
+  0x9003   DateTimeOriginal          ExifIFD    string
+  0x9004   CreateDate                ExifIFD    string
+  0x9101   ComponentsConfiguration   ExifIFD    undef[4]!:
+  0x9102   CompressedBitsPerPixel    ExifIFD    rational64u!
+  0x9201   ShutterSpeedValue         ExifIFD    rational64s
+  0x9202   ApertureValue             ExifIFD    rational64u
+  0x9203   BrightnessValue           ExifIFD    rational64s
+  0x9204   ExposureCompensation      ExifIFD    rational64s
+  0x9205   MaxApertureValue          ExifIFD    rational64u
+  0x9206   SubjectDistance           ExifIFD    rational64u
+  0x9207   MeteringMode              ExifIFD    int16u
+  0x9208   LightSource               ExifIFD    int16u
+  0x9209   Flash                     ExifIFD    int16u
+  0x920a   FocalLength               ExifIFD    rational64u
+  0x920b   FlashEnergy               -          N
+  0x920c   SpatialFrequencyResponse  -          N
+  0x920d   Noise                     -          N
+  0x920e   FocalPlaneXResolution     -          N
+  0x920f   FocalPlaneYResolution     -          N
+  0x9210   FocalPlaneResolutionUnit  -          N
+  0x9211   ImageNumber               ExifIFD    int32u
+  0x9212   SecurityClassification    ExifIFD    string
+  0x9213   ImageHistory              ExifIFD    string
+  0x9214   SubjectArea               ExifIFD    int16u[n]
+  0x9215   ExposureIndex             -          N
+  0x9216   TIFF-EPStandardID         -          N
+  0x9217   SensingMethod             -          N
+  0x923a   CIP3DataFile              -          N
+  0x923b   CIP3Sheet                 -          N
+  0x923c   CIP3Side                  -          N
+  0x923f   StoNits                   -          N
+  0x927c   MakerNoteCanon            ExifIFD    Canon
+           MakerNoteCasio            ExifIFD    Casio
+           MakerNoteCasio2           ExifIFD    Casio Type2
+           MakerNoteFujiFilm         ExifIFD    FujiFilm
+           MakerNoteGE               ExifIFD    GE
+           MakerNoteGE2              ExifIFD    FujiFilm
+           MakerNoteHP               ExifIFD    HP
+           MakerNoteHP2              ExifIFD    HP Type2
+           MakerNoteHP4              ExifIFD    HP Type4
+           MakerNoteHP6              ExifIFD    HP Type6
+           MakerNoteISL              ExifIFD    Unknown
+           MakerNoteJVC              ExifIFD    JVC
+           MakerNoteJVCText          ExifIFD    JVC Text
+           MakerNoteKodak1a          ExifIFD    Kodak
+           MakerNoteKodak1b          ExifIFD    Kodak
+           MakerNoteKodak2           ExifIFD    Kodak Type2
+           MakerNoteKodak3           ExifIFD    Kodak Type3
+           MakerNoteKodak4           ExifIFD    Kodak Type4
+           MakerNoteKodak5           ExifIFD    Kodak Type5
+           MakerNoteKodak6a          ExifIFD    Kodak Type6
+           MakerNoteKodak6b          ExifIFD    Kodak Type6
+           MakerNoteKodak7           ExifIFD    Kodak Type7
+           MakerNoteKodak8a          ExifIFD    Kodak Type8
+           MakerNoteKodak8b          ExifIFD    Kodak Type8
+           MakerNoteKodak9           ExifIFD    Kodak Type9
+           MakerNoteKodak10          ExifIFD    Kodak Type10
+           MakerNoteKodakUnknown     ExifIFD    Kodak Unknown
+           MakerNoteKyocera          ExifIFD    Unknown
+           MakerNoteMinolta          ExifIFD    Minolta
+           MakerNoteMinolta2         ExifIFD    Olympus
+           MakerNoteMinolta3         ExifIFD    undef
+           MakerNoteNikon            ExifIFD    Nikon
+           MakerNoteNikon2           ExifIFD    Nikon Type2
+           MakerNoteNikon3           ExifIFD    Nikon
+           MakerNoteOlympus          ExifIFD    Olympus
+           MakerNoteOlympus2         ExifIFD    Olympus
+           MakerNoteLeica            ExifIFD    Panasonic
+           MakerNoteLeica2           ExifIFD    Panasonic Leica2
+           MakerNoteLeica3           ExifIFD    Panasonic Leica3
+           MakerNoteLeica4           ExifIFD    Panasonic Leica4
+           MakerNoteLeica5           ExifIFD    Panasonic Leica5
+           MakerNoteLeica6           ExifIFD    Panasonic Leica6
+           MakerNotePanasonic        ExifIFD    Panasonic
+           MakerNotePanasonic2       ExifIFD    Panasonic Type2
+           MakerNotePentax           ExifIFD    Pentax
+           MakerNotePentax2          ExifIFD    Pentax Type2
+           MakerNotePentax3          ExifIFD    Casio Type2
+           MakerNotePentax4          ExifIFD    Pentax Type4
+           MakerNotePentax5          ExifIFD    Pentax
+           MakerNotePhaseOne         ExifIFD    undef
+           MakerNoteReconyx          ExifIFD    Reconyx
+           MakerNoteRicoh            ExifIFD    Ricoh
+           MakerNoteRicohText        ExifIFD    Ricoh Text
+           MakerNoteSamsung1a        ExifIFD    undef
+           MakerNoteSamsung1b        ExifIFD    Samsung Type1
+           MakerNoteSamsung2         ExifIFD    Samsung Type2
+           MakerNoteSanyo            ExifIFD    Sanyo
+           MakerNoteSanyoC4          ExifIFD    Sanyo
+           MakerNoteSanyoPatch       ExifIFD    Sanyo
+           MakerNoteSigma            ExifIFD    Sigma
+           MakerNoteSony             ExifIFD    Sony
+           MakerNoteSony2            ExifIFD    Olympus
+           MakerNoteSony3            ExifIFD    Olympus
+           MakerNoteSony4            ExifIFD    Sony
+           MakerNoteSonyEricsson     ExifIFD    Sony Ericsson
+           MakerNoteSonySRF          ExifIFD    Sony SRF
+           MakerNoteUnknownText      ExifIFD    undef
+           MakerNoteUnknown          ExifIFD    Unknown
+  0x9286   UserComment               ExifIFD    undef
+  0x9290   SubSecTime                ExifIFD    string
+  0x9291   SubSecTimeOriginal        ExifIFD    string
+  0x9292   SubSecTimeDigitized       ExifIFD    string
+  0x932f   MSDocumentText            -          N
+  0x9330   MSPropertySetStorage      -          N
+  0x9331   MSDocumentTextPosition    -          N
+  0x935c   ImageSourceData           IFD0       undef!
+  0x9c9b   XPTitle                   IFD0       int8u
+  0x9c9c   XPComment                 IFD0       int8u
+  0x9c9d   XPAuthor                  IFD0       int8u
+  0x9c9e   XPKeywords                IFD0       int8u
+  0x9c9f   XPSubject                 IFD0       int8u
+  0xa000   FlashpixVersion           ExifIFD    undef:
+  0xa001   ColorSpace                ExifIFD    int16u:
+  0xa002   ExifImageWidth            ExifIFD    int16u:
+  0xa003   ExifImageHeight           ExifIFD    int16u:
+  0xa004   RelatedSoundFile          ExifIFD    string
+  0xa005   InteropOffset             -          EXIF
+  0xa20b   FlashEnergy               ExifIFD    rational64u[n]
+  0xa20c   SpatialFrequencyResponse  -          N
+  0xa20d   Noise                     -          N
+  0xa20e   FocalPlaneXResolution     ExifIFD    rational64u
+  0xa20f   FocalPlaneYResolution     ExifIFD    rational64u
+  0xa210   FocalPlaneResolutionUnit  ExifIFD    int16u
+  0xa211   ImageNumber               -          N
+  0xa212   SecurityClassification    -          N
+  0xa213   ImageHistory              -          N
+  0xa214   SubjectLocation           ExifIFD    int16u[2]
+  0xa215   ExposureIndex             ExifIFD    rational64u
+  0xa216   TIFF-EPStandardID         -          N
+  0xa217   SensingMethod             ExifIFD    int16u
+  0xa300   FileSource                ExifIFD    undef
+  0xa301   SceneType                 ExifIFD    undef
+  0xa302   CFAPattern                ExifIFD    undef
+  0xa401   CustomRendered            ExifIFD    int16u
+  0xa402   ExposureMode              ExifIFD    int16u
+  0xa403   WhiteBalance              ExifIFD    int16u
+  0xa404   DigitalZoomRatio          ExifIFD    rational64u
+  0xa405   FocalLengthIn35mmFormat   ExifIFD    int16u
+  0xa406   SceneCaptureType          ExifIFD    int16u
+  0xa407   GainControl               ExifIFD    int16u
+  0xa408   Contrast                  ExifIFD    int16u
+  0xa409   Saturation                ExifIFD    int16u
+  0xa40a   Sharpness                 ExifIFD    int16u
+  0xa40b   DeviceSettingDescription  -          N
+  0xa40c   SubjectDistanceRange      ExifIFD    int16u
+  0xa420   ImageUniqueID             ExifIFD    string
+  0xa430   OwnerName                 ExifIFD    string
+  0xa431   SerialNumber              ExifIFD    string
+  0xa432   LensInfo                  ExifIFD    rational64u[4]
+  0xa433   LensMake                  ExifIFD    string
+  0xa434   LensModel                 ExifIFD    string
+  0xa435   LensSerialNumber          ExifIFD    string
+  0xa480   GDALMetadata              -          N
+  0xa481   GDALNoData                -          N
+  0xa500   Gamma                     ExifIFD    rational64u
+  0xafc0   ExpandSoftware            -          N
+  0xafc1   ExpandLens                -          N
+  0xafc2   ExpandFilm                -          N
+  0xafc3   ExpandFilterLens          -          N
+  0xafc4   ExpandScanner             -          N
+  0xafc5   ExpandFlashLamp           -          N
+  0xbc01   PixelFormat               -          N
+  0xbc02   Transformation            -          N
+  0xbc03   Uncompressed              -          N
+  0xbc04   ImageType                 -          N
+  0xbc80   ImageWidth                -          N
+  0xbc81   ImageHeight               -          N
+  0xbc82   WidthResolution           -          N
+  0xbc83   HeightResolution          -          N
+  0xbcc0   ImageOffset               -          N
+  0xbcc1   ImageByteCount            -          N
+  0xbcc2   AlphaOffset               -          N
+  0xbcc3   AlphaByteCount            -          N
+  0xbcc4   ImageDataDiscard          -          N
+  0xbcc5   AlphaDataDiscard          -          N
+  0xc427   OceScanjobDesc            -          N
+  0xc428   OceApplicationSelector    -          N
+  0xc429   OceIDNumber               -          N
+  0xc42a   OceImageLogic             -          N
+  0xc44f   Annotations               -          N
+  0xc4a5   PrintIM                   IFD0       PrintIM
+  0xc580   USPTOOriginalContentType  -          N
+  0xc612   DNGVersion                IFD0       int8u[4]!
+  0xc613   DNGBackwardVersion        IFD0       int8u[4]!
+  0xc614   UniqueCameraModel         IFD0       string
+  0xc615   LocalizedCameraModel      IFD0       string
+  0xc616   CFAPlaneColor             -          N
+  0xc617   CFALayout                 -          N
+  0xc618   LinearizationTable        -          N
+  0xc619   BlackLevelRepeatDim       SubIFD     int16u[2]!
+  0xc61a   BlackLevel                SubIFD     rational64u[n]!
+  0xc61b   BlackLevelDeltaH          -          N
+  0xc61c   BlackLevelDeltaV          -          N
+  0xc61d   WhiteLevel                SubIFD     int32u[n]!
+  0xc61e   DefaultScale              SubIFD     rational64u[2]!
+  0xc61f   DefaultCropOrigin         SubIFD     int32u[2]!
+  0xc620   DefaultCropSize           SubIFD     int32u[2]!
+  0xc621   ColorMatrix1              IFD0       rational64s[n]!
+  0xc622   ColorMatrix2              IFD0       rational64s[n]!
+  0xc623   CameraCalibration1        IFD0       rational64s[n]!
+  0xc624   CameraCalibration2        IFD0       rational64s[n]!
+  0xc625   ReductionMatrix1          IFD0       rational64s[n]!
+  0xc626   ReductionMatrix2          IFD0       rational64s[n]!
+  0xc627   AnalogBalance             IFD0       rational64u[n]!
+  0xc628   AsShotNeutral             IFD0       rational64u[n]!
+  0xc629   AsShotWhiteXY             IFD0       rational64u[2]!
+  0xc62a   BaselineExposure          IFD0       rational64s!
+  0xc62b   BaselineNoise             IFD0       rational64u!
+  0xc62c   BaselineSharpness         IFD0       rational64u!
+  0xc62d   BayerGreenSplit           SubIFD     int32u!
+  0xc62e   LinearResponseLimit       IFD0       rational64u!
+  0xc62f   CameraSerialNumber        IFD0       string
+  0xc630   DNGLensInfo               IFD0       rational64u[4]
+  0xc631   ChromaBlurRadius          SubIFD     rational64u!
+  0xc632   AntiAliasStrength         SubIFD     rational64u!
+  0xc633   ShadowScale               IFD0       rational64u!
+  0xc634   SR2Private                -          Sony SR2Private
+           DNGAdobeData              -          DNG AdobeData
+           MakerNotePentax           -          Pentax
+           DNGPrivateData            -          N
+  0xc635   MakerNoteSafety           IFD0       int16u
+  0xc640   RawImageSegmentation      -          N
+  0xc65a   CalibrationIlluminant1    IFD0       int16u!
+  0xc65b   CalibrationIlluminant2    IFD0       int16u!
+  0xc65c   BestQualityScale          SubIFD     rational64u!
+  0xc65d   RawDataUniqueID           IFD0       int8u[16]!
+  0xc660   AliasLayerMetadata        -          N
+  0xc68b   OriginalRawFileName       IFD0       string!
+  0xc68c   OriginalRawFileData       IFD0       DNG OriginalRaw
+  0xc68d   ActiveArea                SubIFD     int32u[4]!
+  0xc68e   MaskedAreas               SubIFD     int32u[4]!
+  0xc68f   AsShotICCProfile          IFD0       ICC_Profile
+  0xc690   AsShotPreProfileMatrix    IFD0       rational64s[n]!
+  0xc691   CurrentICCProfile         IFD0       ICC_Profile
+  0xc692   CurrentPreProfileMatrix   IFD0       rational64s[n]!
+  0xc6bf   ColorimetricReference     IFD0       int16u!
+  0xc6d2   PanasonicTitle            IFD0       undef
+  0xc6d3   PanasonicTitle2           IFD0       undef
+  0xc6f3   CameraCalibrationSig      IFD0       string!
+  0xc6f4   ProfileCalibrationSig     IFD0       string!
+  0xc6f5   ProfileIFD                -          EXIF
+  0xc6f6   AsShotProfileName         IFD0       string!
+  0xc6f7   NoiseReductionApplied     SubIFD     rational64u!
+  0xc6f8   ProfileName               IFD0       string!
+  0xc6f9   ProfileHueSatMapDims      IFD0       int32u[3]!
+  0xc6fa   ProfileHueSatMapData1     IFD0       float[n]!
+  0xc6fb   ProfileHueSatMapData2     IFD0       float[n]!
+  0xc6fc   ProfileToneCurve          IFD0       float[n]!
+  0xc6fd   ProfileEmbedPolicy        IFD0       int32u!
+  0xc6fe   ProfileCopyright          IFD0       string!
+  0xc714   ForwardMatrix1            IFD0       rational64s[n]!
+  0xc715   ForwardMatrix2            IFD0       rational64s[n]!
+  0xc716   PreviewApplicationName    IFD0       string!
+  0xc717   PreviewApplicationVersion IFD0       string!
+  0xc718   PreviewSettingsName       IFD0       string!
+  0xc719   PreviewSettingsDigest     IFD0       int8u!
+  0xc71a   PreviewColorSpace         IFD0       int32u!
+  0xc71b   PreviewDateTime           IFD0       string!
+  0xc71c   RawImageDigest            IFD0       int8u!
+  0xc71d   OriginalRawFileDigest     IFD0       int8u!
+  0xc71e   SubTileBlockSize          -          N
+  0xc71f   RowInterleaveFactor       -          N
+  0xc725   ProfileLookTableDims      IFD0       int32u[3]!
+  0xc726   ProfileLookTableData      IFD0       float[n]!
+  0xc740   OpcodeList1               -          N
+  0xc741   OpcodeList2               -          N
+  0xc74e   OpcodeList3               -          N
+  0xc761   NoiseProfile              -          N
+  0xea1c   Padding                   ExifIFD    undef
+  0xea1d   OffsetSchema              ExifIFD    int32s
+  0xfde8   OwnerName                 ExifIFD    string/
+  0xfde9   SerialNumber              ExifIFD    string/
+  0xfdea   Lens                      ExifIFD    string/
+  0xfe00   KDC_IFD                   -          Kodak KDC_IFD
+  0xfe4c   RawFile                   ExifIFD    string/
+  0xfe4d   Converter                 ExifIFD    string/
+  0xfe4e   WhiteBalance              ExifIFD    string/
+  0xfe51   Exposure                  ExifIFD    string/
+  0xfe52   Shadows                   ExifIFD    string/
+  0xfe53   Brightness                ExifIFD    string/
+  0xfe54   Contrast                  ExifIFD    string/
+  0xfe55   Saturation                ExifIFD    string/
+  0xfe56   Sharpness                 ExifIFD    string/
+  0xfe57   Smoothness                ExifIFD    string/
+  0xfe58   MoireFilter               ExifIFD    string/
+
+=head2 IPTC Tags
+
+The tags listed below are part of the International Press Telecommunications
+Council (IPTC) and the Newspaper Association of America (NAA) Information
+Interchange Model (IIM).  This is an older meta information format, slowly
+being phased out in favor of XMP.  (In fact, the newer IPTCCore
+specification actually uses XMP format!)  IPTC information may be embedded
+in JPG, TIFF, PNG, MIFF, PS, PDF, PSD, XCF and DNG images.
+
+IPTC information is separated into different records, each of which has its
+own set of tags.  See
+L<http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf> for the
+official specification.
+
+This specification dictates a length for ASCII (C<string> or C<digits>) and
+binary (C<undef>) values.  These lengths are given in square brackets after
+the B<Writable> format name.  For tags where a range of lengths is allowed,
+the minimum and maximum lengths are separated by a comma within the
+brackets.  IPTC strings are not null terminated.  When writing, ExifTool
+issues a minor warning and truncates the value if it is longer than allowed
+by the IPTC specification. Minor errors may be ignored with the
+IgnoreMinorErrors (-m) option, allowing longer values to be written, but
+beware that values like this may cause problems for some other IPTC readers.
+
+Separate IPTC date and time tags may be written with a combined date/time
+value and ExifTool automagically takes the appropriate part of the date/time
+string depending on whether a date or time tag is being written.  This is
+very useful when copying date/time values to IPTC from other metadata
+formats.
+
+IPTC time values include a timezone offset.  If written with a value which
+doesn't include a timezone then the current local timezone offset is used
+(unless written with a combined date/time, in which case the local timezone
+offset at the specified date/time is used, which may be different due to
+changes in daylight savings time).
+
+  Record   Tag Name                             Writable
+  ------   --------                             --------
+      1    IPTCEnvelope                         IPTC EnvelopeRecord
+      2    IPTCApplication                      IPTC ApplicationRecord
+      3    IPTCNewsPhoto                        IPTC NewsPhoto
+      7    IPTCPreObjectData                    IPTC PreObjectData
+      8    IPTCObjectData                       IPTC ObjectData
+      9    IPTCPostObjectData                   IPTC PostObjectData
+    240    IPTCFotoStation                      IPTC FotoStation
+
+=head3 IPTC EnvelopeRecord Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+      0    EnvelopeRecordVersion                int16u:
+      5    Destination                          string[0,1024]+
+     20    FileFormat                           int16u
+     22    FileVersion                          int16u
+     30    ServiceIdentifier                    string[0,10]
+     40    EnvelopeNumber                       digits[8]
+     50    ProductID                            string[0,32]+
+     60    EnvelopePriority                     digits[1]
+     70    DateSent                             digits[8]
+     80    TimeSent                             string[11]
+     90    CodedCharacterSet                    string[0,32]!
+    100    UniqueObjectName                     string[14,80]
+    120    ARMIdentifier                        int16u
+    122    ARMVersion                           int16u
+
+=head3 IPTC ApplicationRecord Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+      0    ApplicationRecordVersion             int16u:
+      3    ObjectTypeReference                  string[3,67]
+      4    ObjectAttributeReference             string[4,68]+
+      5    ObjectName                           string[0,64]
+      7    EditStatus                           string[0,64]
+      8    EditorialUpdate                      digits[2]
+     10    Urgency                              digits[1]
+     12    SubjectReference                     string[13,236]+
+     15    Category                             string[0,3]
+     20    SupplementalCategories               string[0,32]+
+     22    FixtureIdentifier                    string[0,32]
+     25    Keywords                             string[0,64]+
+     26    ContentLocationCode                  string[3]+
+     27    ContentLocationName                  string[0,64]+
+     30    ReleaseDate                          digits[8]
+     35    ReleaseTime                          string[11]
+     37    ExpirationDate                       digits[8]
+     38    ExpirationTime                       string[11]
+     40    SpecialInstructions                  string[0,256]
+     42    ActionAdvised                        digits[2]
+     45    ReferenceService                     string[0,10]+
+     47    ReferenceDate                        digits[8]+
+     50    ReferenceNumber                      digits[8]+
+     55    DateCreated                          digits[8]
+     60    TimeCreated                          string[11]
+     62    DigitalCreationDate                  digits[8]
+     63    DigitalCreationTime                  string[11]
+     65    OriginatingProgram                   string[0,32]
+     70    ProgramVersion                       string[0,10]
+     75    ObjectCycle                          string[1]
+     80    By-line                              string[0,32]+
+     85    By-lineTitle                         string[0,32]+
+     90    City                                 string[0,32]
+     92    Sub-location                         string[0,32]
+     95    Province-State                       string[0,32]
+    100    Country-PrimaryLocationCode          string[3]
+    101    Country-PrimaryLocationName          string[0,64]
+    103    OriginalTransmissionReference        string[0,32]
+    105    Headline                             string[0,256]
+    110    Credit                               string[0,32]
+    115    Source                               string[0,32]
+    116    CopyrightNotice                      string[0,128]
+    118    Contact                              string[0,128]+
+    120    Caption-Abstract                     string[0,2000]
+    121    LocalCaption                         string[0,256]
+    122    Writer-Editor                        string[0,32]+
+    125    RasterizedCaption                    undef[7360]
+    130    ImageType                            string[2]
+    131    ImageOrientation                     string[1]
+    135    LanguageIdentifier                   string[2,3]
+    150    AudioType                            string[2]
+    151    AudioSamplingRate                    digits[6]
+    152    AudioSamplingResolution              digits[2]
+    153    AudioDuration                        digits[6]
+    154    AudioOutcue                          string[0,64]
+    184    JobID                                string[0,64]
+    185    MasterDocumentID                     string[0,256]
+    186    ShortDocumentID                      string[0,64]
+    187    UniqueDocumentID                     string[0,128]
+    188    OwnerID                              string[0,128]
+    200    ObjectPreviewFileFormat              int16u
+    201    ObjectPreviewFileVersion             int16u
+    202    ObjectPreviewData                    undef[0,256000]
+    221    Prefs                                string[0,64]
+    225    ClassifyState                        string[0,64]
+    228    SimilarityIndex                      string[0,32]
+    230    DocumentNotes                        string[0,1024]
+    231    DocumentHistory                      string[0,256]
+    232    ExifCameraInfo                       string[0,4096]
+    255    CatalogSets                          string[0,256]+
+
+=head3 IPTC NewsPhoto Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+      0    NewsPhotoVersion                     int16u:
+     10    IPTCPictureNumber                    string[16]
+     20    IPTCImageWidth                       int16u
+     30    IPTCImageHeight                      int16u
+     40    IPTCPixelWidth                       int16u
+     50    IPTCPixelHeight                      int16u
+     55    SupplementalType                     int8u
+     60    ColorRepresentation                  int16u
+     64    InterchangeColorSpace                int8u
+     65    ColorSequence                        int8u
+     66    ICC_Profile                          N
+     70    ColorCalibrationMatrix               N
+     80    LookupTable                          N
+     84    NumIndexEntries                      int16u
+     85    ColorPalette                         N
+     86    IPTCBitsPerSample                    int8u
+     90    SampleStructure                      int8u
+    100    ScanningDirection                    int8u
+    102    IPTCImageRotation                    int8u
+    110    DataCompressionMethod                int32u
+    120    QuantizationMethod                   int8u
+    125    EndPoints                            N
+    130    ExcursionTolerance                   int8u
+    135    BitsPerComponent                     int8u
+    140    MaximumDensityRange                  int16u
+    145    GammaCompensatedValue                int16u
+
+=head3 IPTC PreObjectData Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+     10    SizeMode                             N
+     20    MaxSubfileSize                       N
+     90    ObjectSizeAnnounced                  N
+     95    MaximumObjectSize                    N
+
+=head3 IPTC ObjectData Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+     10    SubFile                              N+
+
+=head3 IPTC PostObjectData Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+     10    ConfirmedObjectSize                  N
+
+=head3 IPTC FotoStation Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  [no tags known]
+
+=head2 XMP Tags
+
+XMP stands for "Extensible Metadata Platform", an XML/RDF-based metadata
+format which is being pushed by Adobe.  Information in this format can be
+embedded in many different image file types including JPG, JP2, TIFF, GIF,
+EPS, PDF, PSD, IND, PNG, DJVU, SVG, PGF, MIFF, XCF, CRW, DNG and a variety
+of proprietary TIFF-based RAW images, as well as MOV, AVI, ASF, WMV, FLV,
+SWF and MP4 videos, and WMA and audio formats supporting ID3v2 information.
+
+The XMP B<Tag ID>'s aren't listed because in most cases they are identical
+to the B<Tag Name> (aside from differences in case).  Tags with different
+ID's are mentioned in the B<Notes> column of the HTML version of this
+document.
+
+All XMP information is stored as character strings.  The B<Writable> column
+specifies the information format:  C<string> is an unformatted string,
+C<integer> is a string of digits (possibly beginning with a '+' or '-'),
+C<real> is a floating point number, C<rational> is entered as a floating
+point number but stored as two C<integer> strings separated by a '/'
+character, C<date> is a date/time string entered in the format "YYYY:mm:dd
+HH:MM:SS[.ss][+/-HH:MM]", C<boolean> is either "True" or "False",
+C<lang-alt> indicates that the tag supports alternate languages (see below),
+and C<struct> is an XMP structure.  When reading, structures are extracted
+only if the Struct (-struct) option is used.  Otherwise the corresponding
+"flattened" tags, indicated by an underline (C<_>) after the B<Writable>
+type, are extracted.  When copying information, the Struct option is in
+effect by default.  When writing, the Struct option has no effect, and both
+structured and flattened tags may be written.  See
+L<http://owl.phy.queensu.ca/~phil/exiftool/struct.html> for more details.
+
+Individual languages for C<lang-alt> tags are accessed by suffixing the tag
+name with a '-', followed by an RFC 3066 language code (ie. "XMP:Title-fr",
+or "Rights-en-US").  (See L<http://www.ietf.org/rfc/rfc3066.txt> for the RFC
+3066 specification.)  A C<lang-alt> tag with no language code accesses the
+"x-default" language, but causes other languages for this tag to be deleted
+when writing.  The "x-default" language code may be specified when writing
+to preserve other existing languages (ie. "XMP-dc:Description-x-default"). 
+When reading, "x-default" is not specified.
+
+The XMP tags are organized according to schema B<Namespace> in the following
+tables.  Note that a few of the longer namespace prefixes given below have
+been shortened for convenience (since the family 1 group names are derived
+from these by adding a leading "XMP-").  In cases where a tag name exists in
+more than one namespace, less common namespaces are avoided when writing.
+However, any namespace may be written by specifying a family 1 group name
+for the tag, ie) XMP-exif:Contrast or XMP-crs:Contrast.  When deciding on
+which tags to add to an image, using standard schemas such as
+L<dc|/XMP dc Tags>, L<xmp|/XMP xmp Tags> or L<iptc|/XMP iptcCore Tags> is
+recommended if possible.
+
+For structures, the heading of the first column is B<Field Name>.  Field
+names are very similar to tag names, except they are used to identify fields
+inside structures instead of stand-alone tags.  See
+L<http://owl.phy.queensu.ca/~phil/exiftool/struct.html#Fields> for more
+details.
+
+ExifTool will extract XMP information even if it is not listed in these
+tables.  For example, the C<pdfx> namespace doesn't have a predefined set of
+tag names because it is used to store application-defined PDF information,
+but this information is extracted by ExifTool.
+
+See L<http://www.adobe.com/devnet/xmp/> for the official XMP specification.
+
+  Namespace                                     Writable
+  ---------                                     --------
+  acdsee                                        XMP acdsee
+  album                                         XMP Album
+  aux                                           XMP aux
+  cc                                            XMP cc
+  cell                                          XMP cell
+  crs                                           XMP crs
+  dc                                            XMP dc
+  dex                                           XMP dex
+  DICOM                                         XMP DICOM
+  digiKam                                       XMP digiKam
+  exif                                          XMP exif
+  iptcCore                                      XMP iptcCore
+  iptcExt                                       XMP iptcExt
+  lr                                            XMP Lightroom
+  mediapro                                      XMP MediaPro
+  microsoft                                     Microsoft XMP
+  MP                                            Microsoft MP
+  MP1                                           Microsoft MP1
+  mwg-coll                                      XMP mwg_coll
+  mwg-kw                                        XMP mwg_kw
+  mwg-rs                                        XMP mwg_rs
+  pdf                                           XMP pdf
+  pdfx                                          XMP pdfx
+  photomech                                     PhotoMechanic XMP
+  photoshop                                     XMP photoshop
+  PixelLive                                     XMP PixelLive
+  plus                                          XMP plus
+  prism                                         XMP prism
+  prl                                           XMP prl
+  pur                                           XMP pur
+  rdf                                           XMP rdf
+  swf                                           XMP swf
+  tiff                                          XMP tiff
+  x                                             XMP x
+  xmp                                           XMP xmp
+  xmpBJ                                         XMP xmpBJ
+  xmpDM                                         XMP xmpDM
+  xmpMM                                         XMP xmpMM
+  xmpNote                                       XMP xmpNote
+  xmpPLUS                                       XMP xmpPLUS
+  xmpRights                                     XMP xmpRights
+  xmpTPg                                        XMP xmpTPg
+
+=head3 XMP acdsee Tags
+
+ACD Systems ACDSee schema tags.
+
+(A note to software developers: Re-inventing your own private tags instead
+of using the equivalent tags in standard XMP schemas defeats one of the most
+valuable features of metadata: interoperability.  Your applications mumble
+to themselves instead of speaking out for the rest of the world to hear.)
+
+  Tag Name                                      Writable
+  --------                                      --------
+  Author                                        string/
+  Caption                                       string/
+  Categories                                    string/
+  Datetime                                      date/
+  Keywords                                      string/+
+  Notes                                         string/
+  Rating                                        real/
+  RPP                                           lang-alt
+  Tagged                                        boolean/
+
+=head3 XMP Album Tags
+
+Adobe Album schema tags.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  Notes                                         string
+
+=head3 XMP aux Tags
+
+Photoshop Auxiliary schema tags.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  ApproximateFocusDistance                      rational
+  Firmware                                      string
+  FlashCompensation                             rational
+  ImageNumber                                   string
+  Lens                                          string
+  LensID                                        string
+  LensInfo                                      string
+  OwnerName                                     string
+  SerialNumber                                  string
+
+=head3 XMP cc Tags
+
+Creative Commons schema tags.  (see
+L<http://creativecommons.org/technology/xmp>)
+
+  Tag Name                                      Writable
+  --------                                      --------
+  AttributionName                               string
+  AttributionURL                                string
+  License                                       string
+  MorePermissions                               string
+
+=head3 XMP cell Tags
+
+Location tags written by some Sony Ericsson phones.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  CellTowerID                                   string
+  CellGlobalID                                  string
+  LocationAreaCode                              string
+  MobileCountryCode                             string
+  MobileNetworkCode                             string
+  CellR                                         string
+
+=head3 XMP crs Tags
+
+Photoshop Camera Raw Schema tags.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  AlreadyApplied                                boolean
+  AutoBrightness                                boolean
+  AutoContrast                                  boolean
+  AutoExposure                                  boolean
+  AutoShadows                                   boolean
+  BlueHue                                       integer
+  BlueSaturation                                integer
+  Brightness                                    integer
+  CameraProfile                                 string
+  CameraProfileDigest                           string
+  ChromaticAberrationB                          integer
+  ChromaticAberrationR                          integer
+  Clarity                                       integer
+  ColorNoiseReduction                           integer
+  ColorNoiseReductionDetail                     integer
+  Contrast                                      integer/
+  Converter                                     string
+  ConvertToGrayscale                            boolean
+  CropAngle                                     real
+  CropBottom                                    real
+  CropConstrainToWarp                           integer
+  CropHeight                                    real
+  CropLeft                                      real
+  CropRight                                     real
+  CropTop                                       real
+  CropUnit                                      integer
+  CropUnits                                     integer
+  CropWidth                                     real
+  Defringe                                      integer
+  Exposure                                      real
+  FillLight                                     integer
+  GradientBasedCorrections                      Correction Struct+
+  GradientBasedCorrActive                       boolean_
+  GradientBasedCorrAmount                       real_
+  GradientBasedCorrMasks                        CorrectionMask Struct_+
+  GradientBasedCorrMaskCenterWeight             real_
+  GradientBasedCorrMaskDabs                     string_
+  GradientBasedCorrMaskFlow                     real_
+  GradientBasedCorrMaskFullX                    real_
+  GradientBasedCorrMaskFullY                    real_
+  GradientBasedCorrMaskValue                    real_
+  GradientBasedCorrMaskRadius                   real_
+  GradientBasedCorrMaskWhat                     string_
+  GradientBasedCorrMaskZeroX                    real_
+  GradientBasedCorrMaskZeroY                    real_
+  GradientBasedCorrBrightness                   real_
+  GradientBasedCorrClarity                      real_
+  GradientBasedCorrContrast                     real_
+  GradientBasedCorrExposure                     real_
+  GradientBasedCorrSaturation                   real_
+  GradientBasedCorrSharpness                    real_
+  GradientBasedCorrHue                          real_
+  GradientBasedCorrSaturation                   real_
+  GradientBasedCorrWhat                         string_
+  GrainAmount                                   integer
+  GrainFrequency                                integer
+  GrainSize                                     integer
+  GrayMixerAqua                                 integer
+  GrayMixerBlue                                 integer
+  GrayMixerGreen                                integer
+  GrayMixerMagenta                              integer
+  GrayMixerOrange                               integer
+  GrayMixerPurple                               integer
+  GrayMixerRed                                  integer
+  GrayMixerYellow                               integer
+  GreenHue                                      integer
+  GreenSaturation                               integer
+  HasCrop                                       boolean
+  HasSettings                                   boolean
+  HighlightRecovery                             integer
+  HueAdjustmentAqua                             integer
+  HueAdjustmentBlue                             integer
+  HueAdjustmentGreen                            integer
+  HueAdjustmentMagenta                          integer
+  HueAdjustmentOrange                           integer
+  HueAdjustmentPurple                           integer
+  HueAdjustmentRed                              integer
+  HueAdjustmentYellow                           integer
+  IncrementalTemperature                        integer
+  IncrementalTint                               integer
+  LensManualDistortionAmount                    integer
+  LensProfileChromaticAberrationScale           integer
+  LensProfileDigest                             string
+  LensProfileDistortionScale                    integer
+  LensProfileEnable                             integer
+  LensProfileFilename                           string
+  LensProfileName                               string
+  LensProfileSetup                              string
+  LensProfileVignettingScale                    integer
+  LuminanceAdjustmentAqua                       integer
+  LuminanceAdjustmentBlue                       integer
+  LuminanceAdjustmentGreen                      integer
+  LuminanceAdjustmentMagenta                    integer
+  LuminanceAdjustmentOrange                     integer
+  LuminanceAdjustmentPurple                     integer
+  LuminanceAdjustmentRed                        integer
+  LuminanceAdjustmentYellow                     integer
+  LuminanceNoiseReductionContrast               integer
+  LuminanceNoiseReductionDetail                 integer
+  LuminanceSmoothing                            integer
+  MoireFilter                                   string
+  PaintBasedCorrections                         Correction Struct+
+  PaintCorrectionActive                         boolean_
+  PaintCorrectionAmount                         real_
+  PaintBasedCorrectionMasks                     CorrectionMask Struct_+
+  PaintCorrectionMaskCenterWeight               real_
+  PaintCorrectionMaskDabs                       string_
+  PaintCorrectionMaskFlow                       real_
+  PaintCorrectionMaskFullX                      real_
+  PaintCorrectionMaskFullY                      real_
+  PaintCorrectionMaskValue                      real_
+  PaintCorrectionMaskRadius                     real_
+  PaintCorrectionMaskWhat                       string_
+  PaintCorrectionMaskZeroX                      real_
+  PaintCorrectionMaskZeroY                      real_
+  PaintCorrectionBrightness                     real_
+  PaintCorrectionClarity                        real_
+  PaintCorrectionContrast                       real_
+  PaintCorrectionExposure                       real_
+  PaintCorrectionSaturation                     real_
+  PaintCorrectionSharpness                      real_
+  PaintCorrectionHue                            real_
+  PaintCorrectionSaturation                     real_
+  PaintCorrectionWhat                           string_
+  ParametricDarks                               integer
+  ParametricHighlights                          integer
+  ParametricHighlightSplit                      integer
+  ParametricLights                              integer
+  ParametricMidtoneSplit                        integer
+  ParametricShadows                             integer
+  ParametricShadowSplit                         integer
+  PerspectiveHorizontal                         integer
+  PerspectiveRotate                             real
+  PerspectiveScale                              integer
+  PerspectiveVertical                           integer
+  PostCropVignetteAmount                        integer
+  PostCropVignetteFeather                       integer
+  PostCropVignetteMidpoint                      integer
+  PostCropVignetteRoundness                     integer
+  PostCropVignetteStyle                         integer
+  ProcessVersion                                string
+  RawFileName                                   string
+  RedEyeInfo                                    string+
+  RedHue                                        integer
+  RedSaturation                                 integer
+  RetouchInfo                                   string+
+  Saturation                                    integer/
+  SaturationAdjustmentAqua                      integer
+  SaturationAdjustmentBlue                      integer
+  SaturationAdjustmentGreen                     integer
+  SaturationAdjustmentMagenta                   integer
+  SaturationAdjustmentOrange                    integer
+  SaturationAdjustmentPurple                    integer
+  SaturationAdjustmentRed                       integer
+  SaturationAdjustmentYellow                    integer
+  Shadows                                       integer
+  ShadowTint                                    integer
+  SharpenDetail                                 integer
+  SharpenEdgeMasking                            integer
+  SharpenRadius                                 real
+  Sharpness                                     integer/
+  Smoothness                                    integer
+  SplitToningBalance                            integer
+  SplitToningHighlightHue                       integer
+  SplitToningHighlightSaturation                integer
+  SplitToningShadowHue                          integer
+  SplitToningShadowSaturation                   integer
+  ColorTemperature                              integer/
+  Tint                                          integer
+  ToneCurve                                     string+
+  ToneCurveName                                 string
+  Version                                       string
+  Vibrance                                      integer
+  VignetteAmount                                integer
+  VignetteMidpoint                              integer
+  WhiteBalance                                  string/
+
+=head3 XMP Correction Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  CorrectionActive                              boolean
+  CorrectionAmount                              real
+  CorrectionMasks                               CorrectionMask Struct+
+  LocalBrightness                               real
+  LocalClarity                                  real
+  LocalContrast                                 real
+  LocalExposure                                 real
+  LocalSaturation                               real
+  LocalSharpness                                real
+  LocalToningHue                                real
+  LocalToningSaturation                         real
+  What                                          string
+
+=head3 XMP CorrectionMask Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  CenterWeight                                  real
+  Dabs                                          string+
+  Flow                                          real
+  FullX                                         real
+  FullY                                         real
+  MaskValue                                     real
+  Radius                                        real
+  What                                          string
+  ZeroX                                         real
+  ZeroY                                         real
+
+=head3 XMP dc Tags
+
+Dublin Core schema tags.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  Contributor                                   string+
+  Coverage                                      string
+  Creator                                       string+
+  Date                                          date+
+  Description                                   lang-alt
+  Format                                        string
+  Identifier                                    string
+  Language                                      string+
+  Publisher                                     string+
+  Relation                                      string+
+  Rights                                        lang-alt
+  Source                                        string/
+  Subject                                       string+
+  Title                                         lang-alt
+  Type                                          string+
+
+=head3 XMP dex Tags
+
+Description Explorer schema tags.  These tags are not very common.  The
+Source and Rating tags are avoided when writing due to name conflicts with
+other XMP tags.  (see L<http://www.optimasc.com/products/fileid/>)
+
+  Tag Name                                      Writable
+  --------                                      --------
+  CRC32                                         integer
+  FFID                                          string
+  LicenseType                                   string
+  OS                                            integer
+  Rating                                        string/
+  Revision                                      string
+  ShortDescription                              lang-alt
+  Source                                        string/
+
+=head3 XMP DICOM Tags
+
+DICOM schema tags.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  EquipmentInstitution                          string
+  EquipmentManufacturer                         string
+  PatientBirthDate                              date
+  PatientID                                     string
+  PatientName                                   string
+  PatientSex                                    string
+  SeriesDateTime                                date
+  SeriesDescription                             string
+  SeriesModality                                string
+  SeriesNumber                                  string
+  StudyDateTime                                 date
+  StudyDescription                              string
+  StudyID                                       string
+  StudyPhysician                                string
+
+=head3 XMP digiKam Tags
+
+DigiKam schema tags.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  CaptionsAuthorNames                           lang-alt
+  CaptionsDateTimeStamps                        lang-alt
+  TagsList                                      string+
+
+=head3 XMP exif Tags
+
+EXIF schema for EXIF tags.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  ApertureValue                                 rational
+  BrightnessValue                               rational
+  CFAPattern                                    CFAPattern Struct
+  CFAPatternColumns                             integer_
+  CFAPatternRows                                integer_
+  CFAPatternValues                              integer_+
+  ColorSpace                                    integer
+  ComponentsConfiguration                       integer+
+  CompressedBitsPerPixel                        rational
+  Contrast                                      integer
+  CustomRendered                                integer
+  DateTimeDigitized                             date
+  DateTimeOriginal                              date
+  DeviceSettingDescription                      DeviceSettings Struct
+  DeviceSettingDescriptionColumns               integer_
+  DeviceSettingDescriptionRows                  integer_
+  DeviceSettingDescriptionSettings              string_+
+  DigitalZoomRatio                              rational
+  ExifVersion                                   string
+  ExposureCompensation                          rational
+  ExposureIndex                                 rational
+  ExposureMode                                  integer
+  ExposureProgram                               integer
+  ExposureTime                                  rational
+  FileSource                                    integer
+  Flash                                         Flash Struct
+  FlashEnergy                                   rational
+  FlashFired                                    boolean_
+  FlashFunction                                 boolean_
+  FlashMode                                     integer_
+  FlashpixVersion                               string
+  FlashRedEyeMode                               boolean_
+  FlashReturn                                   integer_
+  FNumber                                       rational
+  FocalLength                                   rational
+  FocalLengthIn35mmFormat                       integer
+  FocalPlaneResolutionUnit                      integer
+  FocalPlaneXResolution                         rational
+  FocalPlaneYResolution                         rational
+  GainControl                                   integer
+  GPSAltitude                                   rational
+  GPSAltitudeRef                                integer
+  GPSAreaInformation                            string
+  GPSDestBearing                                rational
+  GPSDestBearingRef                             string
+  GPSDestDistance                               rational
+  GPSDestDistanceRef                            string
+  GPSDestLatitude                               string
+  GPSDestLongitude                              string
+  GPSDifferential                               integer
+  GPSDOP                                        rational
+  GPSImgDirection                               rational
+  GPSImgDirectionRef                            string
+  GPSLatitude                                   string
+  GPSLongitude                                  string
+  GPSMapDatum                                   string
+  GPSMeasureMode                                integer
+  GPSProcessingMethod                           string
+  GPSSatellites                                 string
+  GPSSpeed                                      rational
+  GPSSpeedRef                                   string
+  GPSStatus                                     string
+  GPSDateTime                                   date
+  GPSTrack                                      rational
+  GPSTrackRef                                   string
+  GPSVersionID                                  string
+  ImageUniqueID                                 string
+  ISO                                           integer+
+  LightSource                                   string
+  MakerNote                                     string
+  MaxApertureValue                              rational
+  MeteringMode                                  integer
+  NativeDigest                                  string
+  Opto-ElectricConvFactor                       OECF Struct
+  OECFColumns                                   integer_
+  OECFNames                                     string_+
+  OECFRows                                      integer_
+  OECFValues                                    rational_+
+  ExifImageWidth                                integer
+  ExifImageHeight                               integer
+  RelatedSoundFile                              string
+  Saturation                                    integer
+  SceneCaptureType                              integer
+  SceneType                                     integer
+  SensingMethod                                 integer
+  Sharpness                                     integer
+  ShutterSpeedValue                             rational
+  SpatialFrequencyResponse                      OECF Struct
+  SpatialFrequencyResponseColumns               integer_
+  SpatialFrequencyResponseNames                 string_+
+  SpatialFrequencyResponseRows                  integer_
+  SpatialFrequencyResponseValues                rational_+
+  SpectralSensitivity                           string
+  SubjectArea                                   integer+
+  SubjectDistance                               rational
+  SubjectDistanceRange                          integer
+  SubjectLocation                               integer+
+  UserComment                                   lang-alt
+  WhiteBalance                                  integer
+
+=head3 XMP CFAPattern Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  Columns                                       integer
+  Rows                                          integer
+  Values                                        integer+
+
+=head3 XMP DeviceSettings Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  Columns                                       integer
+  Rows                                          integer
+  Settings                                      string+
+
+=head3 XMP Flash Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  Fired                                         boolean
+  Function                                      boolean
+  Mode                                          integer
+  RedEyeMode                                    boolean
+  Return                                        integer
+
+=head3 XMP OECF Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  Columns                                       integer
+  Names                                         string+
+  Rows                                          integer
+  Values                                        rational+
+
+=head3 XMP iptcCore Tags
+
+IPTC Core schema tags.  The actual IPTC Core namespace prefix is
+"Iptc4xmpCore", which is the prefix recorded in the file, but ExifTool
+shortens this for the "XMP-iptcCore" family 1 group name. (see
+L<http://www.iptc.org/IPTC4XMP/>)
+
+  Tag Name                                      Writable
+  --------                                      --------
+  CountryCode                                   string
+  CreatorContactInfo                            ContactInfo Struct
+  CreatorCity                                   string_
+  CreatorCountry                                string_
+  CreatorAddress                                string_
+  CreatorPostalCode                             string_
+  CreatorRegion                                 string_
+  CreatorWorkEmail                              string_
+  CreatorWorkTelephone                          string_
+  CreatorWorkURL                                string_
+  IntellectualGenre                             string
+  Location                                      string
+  Scene                                         string+
+  SubjectCode                                   string+
+
+=head3 XMP ContactInfo Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  CiAdrCity                                     string
+  CiAdrCtry                                     string
+  CiAdrExtadr                                   string
+  CiAdrPcode                                    string
+  CiAdrRegion                                   string
+  CiEmailWork                                   string
+  CiTelWork                                     string
+  CiUrlWork                                     string
+
+=head3 XMP iptcExt Tags
+
+IPTC Extension schema tags.  The actual namespace prefix is "Iptc4xmpExt",
+but ExifTool shortens this for the "XMP-iptcExt" family 1 group name.
+(see L<http://www.iptc.org/IPTC4XMP/>)
+
+  Tag Name                                      Writable
+  --------                                      --------
+  AdditionalModelInformation                    string
+  ArtworkOrObject                               ArtworkOrObjectDetails Struct+
+  ArtworkCopyrightNotice                        string_+
+  ArtworkCreator                                string_+
+  ArtworkDateCreated                            date_+
+  ArtworkSource                                 string_+
+  ArtworkSourceInventoryNo                      string_+
+  ArtworkTitle                                  lang-alt_+
+  ControlledVocabularyTerm                      string+
+  DigitalImageGUID                              string
+  DigitalSourceFileType                         string
+  DigitalSourceType                             string
+  Event                                         lang-alt
+  IptcLastEdited                                date
+  LocationCreated                               LocationDetails Struct+
+  LocationCreatedCity                           string_+
+  LocationCreatedCountryCode                    string_+
+  LocationCreatedCountryName                    string_+
+  LocationCreatedProvinceState                  string_+
+  LocationCreatedSublocation                    string_+
+  LocationCreatedWorldRegion                    string_+
+  LocationShown                                 LocationDetails Struct+
+  LocationShownCity                             string_+
+  LocationShownCountryCode                      string_+
+  LocationShownCountryName                      string_+
+  LocationShownProvinceState                    string_+
+  LocationShownSublocation                      string_+
+  LocationShownWorldRegion                      string_+
+  MaxAvailHeight                                integer
+  MaxAvailWidth                                 integer
+  ModelAge                                      integer+
+  OrganisationInImageCode                       string+
+  OrganisationInImageName                       string+
+  PersonInImage                                 string+
+  RegistryId                                    RegistryEntryDetails Struct+
+  RegistryItemID                                string_+
+  RegistryOrganisationID                        string_+
+
+=head3 XMP ArtworkOrObjectDetails Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  AOCopyrightNotice                             string
+  AOCreator                                     string+
+  AODateCreated                                 date
+  AOSource                                      string
+  AOSourceInvNo                                 string
+  AOTitle                                       lang-alt
+
+=head3 XMP LocationDetails Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  City                                          string
+  CountryCode                                   string
+  CountryName                                   string
+  ProvinceState                                 string
+  Sublocation                                   string
+  WorldRegion                                   string
+
+=head3 XMP RegistryEntryDetails Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  RegItemId                                     string
+  RegOrgId                                      string
+
+=head3 XMP Lightroom Tags
+
+Adobe Lightroom "lr" schema tags.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  HierarchicalSubject                           string+
+  PrivateRTKInfo                                string
+
+=head3 XMP MediaPro Tags
+
+iView MediaPro schema tags.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  CatalogSets                                   string+
+  Event                                         string
+  Location                                      string/
+  People                                        string+
+  Status                                        string
+  UserFields                                    string+
+
+=head3 XMP mwg_coll Tags
+
+Collections metadata defined by the MWG 2.0 specification.  See
+L<http://www.metadataworkinggroup.org/> for the official specification.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  Collections                                   CollectionInfo Struct+
+  CollectionName                                string_+
+  CollectionURI                                 string_+
+
+=head3 XMP CollectionInfo Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  CollectionName                                string
+  CollectionURI                                 string
+
+=head3 XMP mwg_kw Tags
+
+Hierarchical keywords metadata defined by the MWG 2.0 specification.
+ExifTool unrolls keyword structures to an arbitrary depth of 4 to allow
+individual levels to be accessed with different tag names, and to avoid
+infinite recursion.  See L<http://www.metadataworkinggroup.org/> for the
+official specification.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  KeywordInfo                                   KeywordInfo Struct
+  HierarchicalKeywords                          KeywordStruct1 Struct_+
+  HierarchicalKeywords1Applied                  boolean_+
+  HierarchicalKeywords1Children                 KeywordStruct2 Struct_+
+  HierarchicalKeywords2Applied                  boolean_+
+  HierarchicalKeywords2Children                 KeywordStruct3 Struct_+
+  HierarchicalKeywords3Applied                  boolean_+
+  HierarchicalKeywords3Children                 KeywordStruct4 Struct_+
+  HierarchicalKeywords4Applied                  boolean_+
+  HierarchicalKeywords4                         string_+
+  HierarchicalKeywords3                         string_+
+  HierarchicalKeywords2                         string_+
+  HierarchicalKeywords1                         string_+
+
+=head3 XMP KeywordInfo Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  Hierarchy                                     KeywordStruct1 Struct+
+
+=head3 XMP KeywordStruct1 Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  Applied                                       boolean
+  Children                                      KeywordStruct2 Struct+
+  Keyword                                       string
+
+=head3 XMP KeywordStruct2 Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  Applied                                       boolean
+  Children                                      KeywordStruct3 Struct+
+  Keyword                                       string
+
+=head3 XMP KeywordStruct3 Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  Applied                                       boolean
+  Children                                      KeywordStruct4 Struct+
+  Keyword                                       string
+
+=head3 XMP KeywordStruct4 Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  Applied                                       boolean
+  Keyword                                       string
+
+=head3 XMP mwg_rs Tags
+
+Image region metadata defined by the MWG 2.0 specification.  See
+L<http://www.metadataworkinggroup.org/> for the official specification.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  RegionInfo                                    RegionInfo Struct
+  RegionAppliedToDimensions                     Dimensions Struct_
+  RegionAppliedToDimensionsH                    real_
+  RegionAppliedToDimensionsUnit                 string_
+  RegionAppliedToDimensionsW                    real_
+  RegionList                                    RegionStruct Struct_+
+  RegionArea                                    Area Struct_+
+  RegionAreaD                                   real_+
+  RegionAreaH                                   real_+
+  RegionAreaUnit                                string_+
+  RegionAreaW                                   real_+
+  RegionAreaX                                   real_+
+  RegionAreaY                                   real_+
+  RegionBarCodeValue                            string_+
+  RegionDescription                             string_+
+  RegionExtensions                              Extensions Struct_+
+  RegionFocusUsage                              string_+
+  RegionName                                    string_+
+  RegionSeeAlso                                 string_+
+  RegionType                                    string_+
+
+=head3 XMP RegionInfo Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  AppliedToDimensions                           Dimensions Struct
+  RegionList                                    RegionStruct Struct+
+
+=head3 XMP Dimensions Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  H                                             real
+  Unit                                          string
+  W                                             real
+
+=head3 XMP RegionStruct Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  Area                                          Area Struct
+  BarCodeValue                                  string
+  Description                                   string
+  Extensions                                    Extensions Struct
+  FocusUsage                                    string
+  Name                                          string
+  Type                                          string
+  SeeAlso                                       string
+
+=head3 XMP Area Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  D                                             real
+  H                                             real
+  Unit                                          string
+  W                                             real
+  X                                             real
+  Y                                             real
+
+=head3 XMP Extensions Struct
+
+This structure may contain any top-level XMP tags, but none have been
+pre-defined in ExifTool.  Without pre-defined flattened tag names,
+RegionExtensions may be written only as a structure (ie.
+C<{xmp-dc:creator=me,rating=5}>).  Fields for this structure are identified
+using the standard ExifTool tag name (with optional leading group name,
+and/or trailing language code, and/or trailing C<#> symbol to disable print
+conversion).
+
+  Field Name                                    Writable
+  ----------                                    --------
+  [no tags known]
+
+=head3 XMP pdf Tags
+
+Adobe PDF schema tags.  The official XMP specification defines only
+Keywords, PDFVersion, Producer and Trapped.  The other tags are included
+because they have been observed in PDF files, but some are avoided when
+writing due to name conflicts with other XMP namespaces.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  Author                                        string
+  Copyright                                     string/
+  CreationDate                                  date
+  Creator                                       string/
+  Keywords                                      string
+  Marked                                        boolean/
+  ModDate                                       date
+  PDFVersion                                    string
+  Producer                                      string
+  Subject                                       string/
+  Title                                         string/
+  Trapped                                       string
+
+=head3 XMP pdfx Tags
+
+PDF extension tags.  This namespace is used to store application-defined PDF
+information, so there are no pre-defined tags.  User-defined tags must be
+created to enable writing of XMP-pdfx information.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  [no tags known]
+
+=head3 XMP photoshop Tags
+
+Adobe Photoshop schema tags.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  AuthorsPosition                               string
+  CaptionWriter                                 string
+  Category                                      string
+  City                                          string
+  ColorMode                                     integer
+  Country                                       string
+  Credit                                        string
+  DateCreated                                   date
+  DocumentAncestors                             Ancestor Struct+
+  DocumentAncestorID                            string_+
+  Headline                                      string
+  History                                       string
+  ICCProfileName                                string
+  Instructions                                  string
+  LegacyIPTCDigest                              string
+  SidecarForExtension                           string
+  Source                                        string
+  State                                         string
+  SupplementalCategories                        string+
+  TextLayers                                    Layer Struct+
+  TextLayerName                                 string_+
+  TextLayerText                                 string_+
+  TransmissionReference                         string
+  Urgency                                       integer
+
+=head3 XMP Ancestor Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  AncestorID                                    string
+
+=head3 XMP Layer Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  LayerName                                     string
+  LayerText                                     string
+
+=head3 XMP PixelLive Tags
+
+PixelLive schema tags.  These tags are not writable becase they are very
+uncommon and I haven't been able to locate a reference which gives the
+namespace URI.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  Author                                        N
+  Comments                                      N
+  Copyright                                     N
+  Date                                          N
+  Genre                                         N
+  Title                                         N
+
+=head3 XMP plus Tags
+
+PLUS License Data Format 1.2.0 schema tags.  Note that all
+controlled-vocabulary tags in this table (ie. tags with a fixed set of
+values) have raw values which begin with "http://ns.useplus.org/ldf/vocab/",
+but to reduce clutter this prefix has been removed from the values shown
+below.  (see L<http://ns.useplus.org/>)
+
+  Tag Name                                      Writable
+  --------                                      --------
+  AdultContentWarning                           string
+  CopyrightOwner                                CopyrightOwner Struct+
+  CopyrightOwnerID                              string_+
+  CopyrightOwnerName                            string_+
+  CopyrightOwnerImageID                         string
+  CopyrightRegistrationNumber                   string
+  CopyrightStatus                               string
+  CreditLineRequired                            string
+  Custom1                                       lang-alt+
+  Custom10                                      lang-alt+
+  Custom2                                       lang-alt+
+  Custom3                                       lang-alt+
+  Custom4                                       lang-alt+
+  Custom5                                       lang-alt+
+  Custom6                                       lang-alt+
+  Custom7                                       lang-alt+
+  Custom8                                       lang-alt+
+  Custom9                                       lang-alt+
+  EndUser                                       EndUser Struct+
+  EndUserID                                     string_+
+  EndUserName                                   string_+
+  FileNameAsDelivered                           string
+  FirstPublicationDate                          date
+  ImageAlterationConstraints                    string+
+  ImageCreator                                  ImageCreator Struct+
+  ImageCreatorID                                string_+
+  ImageCreatorName                              string_+
+  ImageCreatorImageID                           string
+  ImageDuplicationConstraints                   string
+  ImageFileConstraints                          string+
+  ImageFileFormatAsDelivered                    string
+  ImageFileSizeAsDelivered                      string
+  ImageSupplier                                 ImageSupplier Struct+
+  ImageSupplierImageID                          string
+  ImageSupplierID                               string_+
+  ImageSupplierName                             string_+
+  ImageType                                     string
+  Licensee                                      Licensee Struct+
+  LicenseeImageID                               string
+  LicenseeImageNotes                            lang-alt
+  LicenseeID                                    string_+
+  LicenseeName                                  string_+
+  LicenseEndDate                                date
+  LicenseeProjectReference                      string+
+  LicenseeTransactionID                         string+
+  LicenseID                                     string
+  LicenseStartDate                              date
+  LicenseTransactionDate                        date
+  Licensor                                      Licensor Struct+
+  LicensorImageID                               string
+  LicensorCity                                  string_+
+  LicensorCountry                               string_+
+  LicensorEmail                                 string_+
+  LicensorExtendedAddress                       string_+
+  LicensorID                                    string_+
+  LicensorName                                  string_+
+  LicensorPostalCode                            string_+
+  LicensorRegion                                string_+
+  LicensorStreetAddress                         string_+
+  LicensorTelephone1                            string_+
+  LicensorTelephone2                            string_+
+  LicensorTelephoneType1                        string_+
+  LicensorTelephoneType2                        string_+
+  LicensorURL                                   string_+
+  LicensorNotes                                 lang-alt
+  LicensorTransactionID                         string+
+  MediaConstraints                              lang-alt
+  MediaSummaryCode                              string
+  MinorModelAgeDisclosure                       string
+  ModelReleaseID                                string+
+  ModelReleaseStatus                            string
+  OtherConditions                               lang-alt
+  OtherConstraints                              lang-alt
+  OtherImageInfo                                lang-alt
+  OtherLicenseDocuments                         string+
+  OtherLicenseInfo                              lang-alt
+  OtherLicenseRequirements                      lang-alt
+  ProductOrServiceConstraints                   lang-alt
+  PropertyReleaseID                             string+
+  PropertyReleaseStatus                         string
+  RegionConstraints                             lang-alt
+  Reuse                                         string
+  TermsAndConditionsText                        lang-alt
+  TermsAndConditionsURL                         string
+  PLUSVersion                                   string
+
+=head3 XMP CopyrightOwner Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  CopyrightOwnerID                              string
+  CopyrightOwnerName                            string
+
+=head3 XMP EndUser Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  EndUserID                                     string
+  EndUserName                                   string
+
+=head3 XMP ImageCreator Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  ImageCreatorID                                string
+  ImageCreatorName                              string
+
+=head3 XMP ImageSupplier Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  ImageSupplierID                               string
+  ImageSupplierName                             string
+
+=head3 XMP Licensee Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  LicenseeID                                    string
+  LicenseeName                                  string
+
+=head3 XMP Licensor Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  LicensorCity                                  string
+  LicensorCountry                               string
+  LicensorEmail                                 string
+  LicensorExtendedAddress                       string
+  LicensorID                                    string
+  LicensorName                                  string
+  LicensorPostalCode                            string
+  LicensorRegion                                string
+  LicensorStreetAddress                         string
+  LicensorTelephone1                            string
+  LicensorTelephone2                            string
+  LicensorTelephoneType1                        string
+  LicensorTelephoneType2                        string
+  LicensorURL                                   string
+
+=head3 XMP prism Tags
+
+Publishing Requirements for Industry Standard Metadata 2.1 schema tags. (see
+L<http://www.prismstandard.org/>)
+
+  Tag Name                                      Writable
+  --------                                      --------
+  AggregationType                               string/+
+  AlternateTitle                                string/+
+  ByteCount                                     integer/
+  Channel                                       string/+
+  ComplianceProfile                             string/
+  Copyright                                     string/
+  CorporateEntity                               string/+
+  CoverDate                                     date/
+  CoverDisplayDate                              string/
+  CreationDate                                  date/
+  DateRecieved                                  date/
+  Distributor                                   string/
+  DOI                                           string/
+  Edition                                       string/
+  EIssn                                         string/
+  EmbargoDate                                   date/+
+  EndingPage                                    string/
+  Event                                         string/+
+  ExpirationDate                                date/+
+  Genre                                         string/+
+  HasAlternative                                string/+
+  HasCorrection                                 string/
+  HasPreviousVersion                            string/
+  HasTranslation                                string/+
+  Industry                                      string/+
+  ISBN                                          string/
+  IsCorrectionOf                                string/+
+  ISSN                                          string/
+  IssueIdentifier                               string/
+  IssueName                                     string/
+  IsTranslationOf                               string/
+  Keyword                                       string/+
+  KillDate                                      date/
+  Location                                      string/+
+  ModificationDate                              date/
+  Number                                        string/
+  Object                                        string/+
+  Organization                                  string/+
+  OriginPlatform                                string/+
+  PageRange                                     string/+
+  Person                                        string/
+  PublicationDate                               date/+
+  PublicationName                               string/
+  RightsAgent                                   string/
+  Section                                       string/
+  StartingPage                                  string/
+  Subsection1                                   string/
+  Subsection2                                   string/
+  Subsection3                                   string/
+  Subsection4                                   string/
+  Teaser                                        string/+
+  Ticker                                        string/+
+  TimePeriod                                    string/
+  URL                                           string/+
+  VersionIdentifier                             string/
+  Volume                                        string/
+  WordCount                                     integer/
+
+=head3 XMP prl Tags
+
+PRISM Rights Language 2.1 schema tags.  (see
+L<http://www.prismstandard.org/>)
+
+  Tag Name                                      Writable
+  --------                                      --------
+  Geography                                     string/+
+  Industry                                      string/+
+  Usage                                         string/+
+
+=head3 XMP pur Tags
+
+Prism Usage Rights 2.1 schema tags.  (see L<http://www.prismstandard.org/>)
+
+  Tag Name                                      Writable
+  --------                                      --------
+  AdultContentWarning                           string/+
+  Agreement                                     string/+
+  Copyright                                     lang-alt/
+  CreditLine                                    string/+
+  EmbargoDate                                   date/+
+  ExclusivityEndDate                            date/+
+  ExpirationDate                                date/+
+  ImageSizeRestriction                          string/
+  OptionEndDate                                 date/+
+  Permissions                                   string/+
+  Restrictions                                  string/+
+  ReuseProhibited                               boolean/
+  RightsAgent                                   string/
+  RightsOwner                                   string/
+  UsageFee                                      string/+
+
+=head3 XMP rdf Tags
+
+Most RDF attributes are handled internally, but the "about" attribute is
+treated specially to allow it to be set to a specific value if required.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  About                                         string!
+
+=head3 XMP swf Tags
+
+Adobe SWF schema tags.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  BackgroundAlpha                               integer
+  ForwardLock                                   boolean
+  MaxStorage                                    integer
+  Type                                          string/
+
+=head3 XMP tiff Tags
+
+EXIF schema for TIFF tags.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  Artist                                        string
+  BitsPerSample                                 integer+
+  Compression                                   integer
+  Copyright                                     lang-alt
+  DateTime                                      date
+  ImageDescription                              lang-alt
+  ImageHeight                                   integer
+  ImageWidth                                    integer
+  Make                                          string
+  Model                                         string
+  NativeDigest                                  string
+  Orientation                                   integer
+  PhotometricInterpretation                     integer
+  PlanarConfiguration                           integer
+  PrimaryChromaticities                         rational+
+  ReferenceBlackWhite                           rational+
+  ResolutionUnit                                integer
+  SamplesPerPixel                               integer
+  Software                                      string
+  TransferFunction                              integer+
+  WhitePoint                                    rational+
+  XResolution                                   rational
+  YCbCrCoefficients                             rational+
+  YCbCrPositioning                              integer
+  YCbCrSubSampling                              string
+  YResolution                                   rational
+
+=head3 XMP x Tags
+
+The "x" namespace is used for the "xmpmeta" wrapper, and may contain an
+"xmptk" attribute that is extracted as the XMPToolkit tag.  When writing,
+the XMPToolkit tag is automatically generated by ExifTool unless
+specifically set to another value.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  XMPToolkit                                    string!
+
+=head3 XMP xmp Tags
+
+XMP Basic schema tags.  If the older "xap", "xapBJ", "xapMM" or "xapRights"
+namespace prefixes are found, they are translated to the newer "xmp",
+"xmpBJ", "xmpMM" and "xmpRights" prefixes for use in family 1 group names.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  Advisory                                      string+
+  BaseURL                                       string
+  CreateDate                                    date
+  CreatorTool                                   string
+  Identifier                                    string/+
+  Label                                         string
+  MetadataDate                                  date
+  ModifyDate                                    date
+  Nickname                                      string
+  PageInfo                                      PageInfo Struct+
+  PageImageFormat                               string_+
+  PageImageHeight                               integer_+
+  PageImage                                     string_+
+  PageImagePageNumber                           integer_+
+  PageImageWidth                                integer_+
+  Rating                                        real
+  Thumbnails                                    Thumbnail Struct+
+  ThumbnailFormat                               string_+
+  ThumbnailHeight                               integer_+
+  ThumbnailImage                                string/_+
+  ThumbnailWidth                                integer_+
+
+=head3 XMP PageInfo Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  PageNumber                                    integer
+  Format                                        string
+  Height                                        integer
+  Image                                         string
+  Width                                         integer
+
+=head3 XMP Thumbnail Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  Format                                        string
+  Height                                        integer
+  Image                                         string
+  Width                                         integer
+
+=head3 XMP xmpBJ Tags
+
+XMP Basic Job Ticket schema tags.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  JobRef                                        JobRef Struct+
+  JobRefId                                      string_+
+  JobRefName                                    string_+
+  JobRefUrl                                     string_+
+
+=head3 XMP JobRef Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  Id                                            string
+  Name                                          string
+  Url                                           string
+
+=head3 XMP xmpDM Tags
+
+XMP Dynamic Media schema tags.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  AbsPeakAudioFilePath                          string
+  Album                                         string
+  AltTapeName                                   string
+  AltTimecode                                   Timecode Struct
+  AltTimecodeTimeFormat                         string_
+  AltTimecodeTimeValue                          string_
+  AltTimecodeValue                              integer_
+  Artist                                        string/
+  AudioChannelType                              string
+  AudioCompressor                               string
+  AudioModDate                                  date
+  AudioSampleRate                               integer
+  AudioSampleType                               string
+  BeatSpliceParams                              BeatSpliceStretch Struct
+  BeatSpliceParamsRiseInDecibel                 real_
+  BeatSpliceParamsRiseInTimeDuration            Time Struct_
+  BeatSpliceParamsRiseInTimeDurationScale       rational_
+  BeatSpliceParamsRiseInTimeDurationValue       integer_
+  BeatSpliceParamsUseFileBeatsMarker            boolean_
+  CameraAngle                                   string
+  CameraLabel                                   string
+  CameraModel                                   string
+  CameraMove                                    string
+  Client                                        string
+  DMComment                                     string
+  Composer                                      string
+  ContributedMedia                              Media Struct+
+  ContributedMediaDuration                      Time Struct_+
+  ContributedMediaDurationScale                 rational_+
+  ContributedMediaDurationValue                 integer_+
+  ContributedMediaManaged                       boolean_+
+  ContributedMediaPath                          string_+
+  ContributedMediaStartTime                     Time Struct_+
+  ContributedMediaStartTimeScale                rational_+
+  ContributedMediaStartTimeValue                integer_+
+  ContributedMediaTrack                         string_+
+  ContributedMediaWebStatement                  string_+
+  Copyright                                     string/
+  Director                                      string
+  DirectorPhotography                           string
+  Duration                                      Time Struct
+  DurationScale                                 rational_
+  DurationValue                                 integer_
+  Engineer                                      string
+  FileDataRate                                  rational
+  Genre                                         string
+  Good                                          boolean
+  Instrument                                    string
+  IntroTime                                     Time Struct
+  IntroTimeScale                                rational_
+  IntroTimeValue                                integer_
+  Key                                           string
+  LogComment                                    string
+  Loop                                          boolean
+  Markers                                       Marker Struct+
+  MarkersComment                                string_+
+  MarkersCuePointParams                         CuePointParam Struct_+
+  MarkersCuePointParamsKey                      string_+
+  MarkersCuePointParamsValue                    string_+
+  MarkersCuePointType                           string_+
+  MarkersDuration                               string_+
+  MarkersLocation                               string_+
+  MarkersName                                   string_+
+  MarkersProbability                            real_+
+  MarkersSpeaker                                string_+
+  MarkersStartTime                              string_+
+  MarkersTarget                                 string_+
+  MarkersType                                   string_+
+  MetadataModDate                               date
+  NumberOfBeats                                 real
+  OutCue                                        Time Struct
+  OutCueScale                                   rational_
+  OutCueValue                                   integer_
+  ProjectName                                   string
+  ProjectRef                                    ProjectLink Struct
+  ProjectRefPath                                string_
+  ProjectRefType                                string_
+  PullDown                                      string
+  RelativePeakAudioFilePath                     string
+  RelativeTimestamp                             Time Struct
+  RelativeTimestampScale                        rational_
+  RelativeTimestampValue                        integer_
+  ReleaseDate                                   date
+  ResampleParams                                ResampleStretch Struct
+  ResampleParamsQuality                         string_
+  ScaleType                                     string
+  Scene                                         string/
+  ShotDate                                      date
+  ShotDay                                       string
+  ShotLocation                                  string
+  ShotName                                      string
+  ShotNumber                                    string
+  ShotSize                                      string
+  SpeakerPlacement                              string
+  StartTimecode                                 Timecode Struct
+  StartTimecodeTimeFormat                       string_
+  StartTimecodeTimeValue                        string_
+  StartTimecodeValue                            integer_
+  StretchMode                                   string
+  TakeNumber                                    integer
+  TapeName                                      string
+  Tempo                                         real
+  TimeScaleParams                               TimeScaleStretch Struct
+  TimeScaleParamsFrameOverlappingPercentage     real_
+  TimeScaleParamsFrameSize                      real_
+  TimeScaleParamsQuality                        string_
+  TimeSignature                                 string
+  TrackNumber                                   integer
+  Tracks                                        Track Struct+
+  TracksFrameRate                               string_+
+  TracksMarkers                                 Marker Struct_+
+  TracksMarkersComment                          string_+
+  TracksMarkersCuePointParams                   CuePointParam Struct_+
+  TracksMarkersCuePointParamsKey                string_+
+  TracksMarkersCuePointParamsValue              string_+
+  TracksMarkersCuePointType                     string_+
+  TracksMarkersDuration                         string_+
+  TracksMarkersLocation                         string_+
+  TracksMarkersName                             string_+
+  TracksMarkersProbability                      real_+
+  TracksMarkersSpeaker                          string_+
+  TracksMarkersStartTime                        string_+
+  TracksMarkersTarget                           string_+
+  TracksMarkersType                             string_+
+  TracksTrackName                               string_+
+  TracksTrackType                               string_+
+  VideoAlphaMode                                string
+  VideoAlphaPremultipleColor                    Colorant Struct
+  VideoAlphaPremultipleColorA                   integer_
+  VideoAlphaPremultipleColorB                   integer_
+  VideoAlphaPremultipleColorBlack               real_
+  VideoAlphaPremultipleColorBlue                integer_
+  VideoAlphaPremultipleColorCyan                real_
+  VideoAlphaPremultipleColorGreen               integer_
+  VideoAlphaPremultipleColorL                   real_
+  VideoAlphaPremultipleColorMagenta             real_
+  VideoAlphaPremultipleColorMode                string_
+  VideoAlphaPremultipleColorRed                 integer_
+  VideoAlphaPremultipleColorSwatchName          string_
+  VideoAlphaPremultipleColorType                string_
+  VideoAlphaPremultipleColorYellow              real_
+  VideoAlphaUnityIsTransparent                  boolean
+  VideoColorSpace                               string
+  VideoCompressor                               string
+  VideoFieldOrder                               string
+  VideoFrameRate                                string
+  VideoFrameSize                                Dimensions Struct
+  VideoFrameSizeH                               real_
+  VideoFrameSizeUnit                            string_
+  VideoFrameSizeW                               real_
+  VideoModDate                                  date
+  VideoPixelAspectRatio                         rational
+  VideoPixelDepth                               string
+
+=head3 XMP Timecode Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  TimeFormat                                    string
+  TimeValue                                     string
+  Value                                         integer
+
+=head3 XMP BeatSpliceStretch Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  RiseInDecibel                                 real
+  RiseInTimeDuration                            Time Struct
+  UseFileBeatsMarker                            boolean
+
+=head3 XMP Time Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  Scale                                         rational
+  Value                                         integer
+
+=head3 XMP Media Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  Duration                                      Time Struct
+  Managed                                       boolean
+  Path                                          string
+  StartTime                                     Time Struct
+  Track                                         string
+  WebStatement                                  string
+
+=head3 XMP Marker Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  Comment                                       string
+  CuePointParams                                CuePointParam Struct+
+  CuePointType                                  string
+  Duration                                      string
+  Location                                      string
+  Name                                          string
+  Probability                                   real
+  Speaker                                       string
+  StartTime                                     string
+  Target                                        string
+  Type                                          string
+
+=head3 XMP CuePointParam Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  Key                                           string
+  Value                                         string
+
+=head3 XMP ProjectLink Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  Path                                          string
+  Type                                          string
+
+=head3 XMP ResampleStretch Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  Quality                                       string
+
+=head3 XMP TimeScaleStretch Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  FrameOverlappingPercentage                    real
+  FrameSize                                     real
+  Quality                                       string
+
+=head3 XMP Track Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  FrameRate                                     string
+  Markers                                       Marker Struct+
+  TrackName                                     string
+  TrackType                                     string
+
+=head3 XMP Colorant Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  A                                             integer
+  B                                             integer
+  L                                             real
+  Black                                         real
+  Blue                                          integer
+  Cyan                                          real
+  Green                                         integer
+  Magenta                                       real
+  Mode                                          string
+  Red                                           integer
+  SwatchName                                    string
+  Type                                          string
+  Yellow                                        real
+
+=head3 XMP xmpMM Tags
+
+XMP Media Management schema tags.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  DerivedFrom                                   ResourceRef Struct
+  DerivedFromAlternatePaths                     string_+
+  DerivedFromDocumentID                         string_
+  DerivedFromFilePath                           string_
+  DerivedFromFromPart                           string_
+  DerivedFromInstanceID                         string_
+  DerivedFromLastModifyDate                     date_
+  DerivedFromManager                            string_
+  DerivedFromManagerVariant                     string_
+  DerivedFromManageTo                           string_
+  DerivedFromManageUI                           string_
+  DerivedFromMaskMarkers                        string_
+  DerivedFromOriginalDocumentID                 string_
+  DerivedFromPartMapping                        string_
+  DerivedFromRenditionClass                     string_
+  DerivedFromRenditionParams                    string_
+  DerivedFromToPart                             string_
+  DerivedFromVersionID                          string_
+  DocumentID                                    string
+  History                                       ResourceEvent Struct+
+  HistoryAction                                 string_+
+  HistoryChanged                                string_+
+  HistoryInstanceID                             string_+
+  HistoryParameters                             string_+
+  HistorySoftwareAgent                          string_+
+  HistoryWhen                                   date_+
+  Ingredients                                   ResourceRef Struct+
+  IngredientsAlternatePaths                     string_+
+  IngredientsDocumentID                         string_+
+  IngredientsFilePath                           string_+
+  IngredientsFromPart                           string_+
+  IngredientsInstanceID                         string_+
+  IngredientsLastModifyDate                     date_+
+  IngredientsManager                            string_+
+  IngredientsManagerVariant                     string_+
+  IngredientsManageTo                           string_+
+  IngredientsManageUI                           string_+
+  IngredientsMaskMarkers                        string_+
+  IngredientsOriginalDocumentID                 string_+
+  IngredientsPartMapping                        string_+
+  IngredientsRenditionClass                     string_+
+  IngredientsRenditionParams                    string_+
+  IngredientsToPart                             string_+
+  IngredientsVersionID                          string_+
+  InstanceID                                    string
+  LastURL                                       string
+  ManagedFrom                                   ResourceRef Struct
+  ManagedFromAlternatePaths                     string_+
+  ManagedFromDocumentID                         string_
+  ManagedFromFilePath                           string_
+  ManagedFromFromPart                           string_
+  ManagedFromInstanceID                         string_
+  ManagedFromLastModifyDate                     date_
+  ManagedFromManager                            string_
+  ManagedFromManagerVariant                     string_
+  ManagedFromManageTo                           string_
+  ManagedFromManageUI                           string_
+  ManagedFromMaskMarkers                        string_
+  ManagedFromOriginalDocumentID                 string_
+  ManagedFromPartMapping                        string_
+  ManagedFromRenditionClass                     string_
+  ManagedFromRenditionParams                    string_
+  ManagedFromToPart                             string_
+  ManagedFromVersionID                          string_
+  Manager                                       string
+  ManagerVariant                                string
+  ManageTo                                      string
+  ManageUI                                      string
+  Manifest                                      ManifestItem Struct+
+  ManifestLinkForm                              string_+
+  ManifestPlacedResolutionUnit                  string_+
+  ManifestPlacedXResolution                     real_+
+  ManifestPlacedYResolution                     real_+
+  ManifestReference                             ResourceRef Struct_+
+  ManifestReferenceAlternatePaths               string_+
+  ManifestReferenceDocumentID                   string_+
+  ManifestReferenceFilePath                     string_+
+  ManifestReferenceFromPart                     string_+
+  ManifestReferenceInstanceID                   string_+
+  ManifestReferenceLastModifyDate               date_+
+  ManifestReferenceManager                      string_+
+  ManifestReferenceManagerVariant               string_+
+  ManifestReferenceManageTo                     string_+
+  ManifestReferenceManageUI                     string_+
+  ManifestReferenceMaskMarkers                  string_+
+  ManifestReferenceOriginalDocumentID           string_+
+  ManifestReferencePartMapping                  string_+
+  ManifestReferenceRenditionClass               string_+
+  ManifestReferenceRenditionParams              string_+
+  ManifestReferenceToPart                       string_+
+  ManifestReferenceVersionID                    string_+
+  OriginalDocumentID                            string
+  Pantry                                        PantryItem Struct+
+  PreservedFileName                             string
+  RenditionClass                                string
+  RenditionOf                                   ResourceRef Struct
+  RenditionOfAlternatePaths                     string_+
+  RenditionOfDocumentID                         string_
+  RenditionOfFilePath                           string_
+  RenditionOfFromPart                           string_
+  RenditionOfInstanceID                         string_
+  RenditionOfLastModifyDate                     date_
+  RenditionOfManager                            string_
+  RenditionOfManagerVariant                     string_
+  RenditionOfManageTo                           string_
+  RenditionOfManageUI                           string_
+  RenditionOfMaskMarkers                        string_
+  RenditionOfOriginalDocumentID                 string_
+  RenditionOfPartMapping                        string_
+  RenditionOfRenditionClass                     string_
+  RenditionOfRenditionParams                    string_
+  RenditionOfToPart                             string_
+  RenditionOfVersionID                          string_
+  RenditionParams                               string
+  SaveID                                        integer
+  VersionID                                     string
+  Versions                                      Version Struct+
+  VersionsComments                              string_+
+  VersionsEvent                                 ResourceEvent Struct_+
+  VersionsEventAction                           string_+
+  VersionsEventChanged                          string_+
+  VersionsEventInstanceID                       string_+
+  VersionsEventParameters                       string_+
+  VersionsEventSoftwareAgent                    string_+
+  VersionsEventWhen                             date_+
+  VersionsModifier                              string_+
+  VersionsModifyDate                            date_+
+  VersionsVersion                               string_+
+
+=head3 XMP ResourceRef Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  AlternatePaths                                string+
+  DocumentID                                    string
+  FilePath                                      string
+  FromPart                                      string
+  InstanceID                                    string
+  LastModifyDate                                date
+  ManageTo                                      string
+  ManageUI                                      string
+  Manager                                       string
+  ManagerVariant                                string
+  MaskMarkers                                   string
+  OriginalDocumentID                            string
+  PartMapping                                   string
+  RenditionClass                                string
+  RenditionParams                               string
+  ToPart                                        string
+  VersionID                                     string
+
+=head3 XMP ResourceEvent Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  Action                                        string
+  Changed                                       string
+  InstanceID                                    string
+  Parameters                                    string
+  SoftwareAgent                                 string
+  When                                          date
+
+=head3 XMP ManifestItem Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  LinkForm                                      string
+  PlacedResolutionUnit                          string
+  PlacedXResolution                             real
+  PlacedYResolution                             real
+  Reference                                     ResourceRef Struct
+
+=head3 XMP PantryItem Struct
+
+This structure must have an InstanceID field, but may also contain any other
+XMP properties.
+
+  Field Name                                    Writable
+  ----------                                    --------
+  InstanceID                                    string
+
+=head3 XMP Version Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  Comments                                      string
+  Event                                         ResourceEvent Struct
+  Modifier                                      string
+  ModifyDate                                    date
+  Version                                       string
+
+=head3 XMP xmpNote Tags
+
+XMP Note schema tags.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  HasExtendedXMP                                boolean*
+
+=head3 XMP xmpPLUS Tags
+
+XMP Picture Licensing Universal System (PLUS) schema tags.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  CreditLineReq                                 boolean
+  ReuseAllowed                                  boolean
+
+=head3 XMP xmpRights Tags
+
+XMP Rights Management schema tags.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  Certificate                                   string
+  Marked                                        boolean
+  Owner                                         string+
+  UsageTerms                                    lang-alt
+  WebStatement                                  string
+
+=head3 XMP xmpTPg Tags
+
+XMP Paged-Text schema tags.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  Colorants                                     Colorant Struct+
+  ColorantA                                     integer_+
+  ColorantB                                     integer_+
+  ColorantBlack                                 real_+
+  ColorantBlue                                  integer_+
+  ColorantCyan                                  real_+
+  ColorantGreen                                 integer_+
+  ColorantL                                     real_+
+  ColorantMagenta                               real_+
+  ColorantMode                                  string_+
+  ColorantRed                                   integer_+
+  ColorantSwatchName                            string_+
+  ColorantType                                  string_+
+  ColorantYellow                                real_+
+  Fonts                                         Font Struct+
+  ChildFontFiles                                string_+
+  FontComposite                                 boolean_+
+  FontFace                                      string_+
+  FontFamily                                    string_+
+  FontFileName                                  string_+
+  FontName                                      string_+
+  FontType                                      string_+
+  FontVersion                                   string_+
+  MaxPageSize                                   Dimensions Struct
+  MaxPageSizeH                                  real_
+  MaxPageSizeUnit                               string_
+  MaxPageSizeW                                  real_
+  NPages                                        integer
+  PlateNames                                    string+
+
+=head3 XMP Font Struct
+
+  Field Name                                    Writable
+  ----------                                    --------
+  ChildFontFiles                                string+
+  Composite                                     boolean
+  FontFace                                      string
+  FontFamily                                    string
+  FontFileName                                  string
+  FontName                                      string
+  FontType                                      string
+  VersionString                                 string
+
+=head3 XMP SVG Tags
+
+SVG (Scalable Vector Graphics) image tags.  By default, only the top-level
+SVG and Metadata tags are extracted from these images, but all graphics tags
+may be extracted by setting the Unknown option to 2 (-U on the command
+line).  The SVG tags are not part of XMP as such, but are included with the
+XMP module for convenience.  (see L<http://www.w3.org/TR/SVG11/>)
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'height'             ImageHeight              N
+  'id'                 ID                       N
+  'metadataId'         MetadataID               N
+  'version'            SVGVersion               N
+  'width'              ImageWidth               N
+
+=head2 GPS Tags
+
+These GPS tags are part of the EXIF standard, and are stored in a separate
+IFD within the EXIF information.
+
+ExifTool is very flexible about the input format when writing lat/long
+coordinates, and will accept from 1 to 3 floating point numbers (for decimal
+degrees, degrees and minutes, or degrees, minutes and seconds) separated by
+just about anything, and will format them properly according to the EXIF
+specification.
+
+Some GPS tags have values which are fixed-length strings. For these, the
+indicated string lengths include a null terminator which is added
+automatically by ExifTool.  Remember that the descriptive values are used
+when writing (ie. 'Above Sea Level', not '0') unless the print conversion is
+disabled (with '-n' on the command line or the PrintConv option in the API,
+or by suffixing the tag name with a C<#> character).
+
+When adding GPS information to an image, it is important to set all of the
+following tags: GPSLatitude, GPSLatitudeRef, GPSLongitude, GPSLongitudeRef,
+GPSAltitude and GPSAltitudeRef.  ExifTool will write the required
+GPSVersionID tag automatically if new a GPS IFD is added to an image.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0000   GPSVersionID                         int8u[4]:
+  0x0001   GPSLatitudeRef                       string[2]
+  0x0002   GPSLatitude                          rational64u[3]
+  0x0003   GPSLongitudeRef                      string[2]
+  0x0004   GPSLongitude                         rational64u[3]
+  0x0005   GPSAltitudeRef                       int8u
+  0x0006   GPSAltitude                          rational64u
+  0x0007   GPSTimeStamp                         rational64u[3]
+  0x0008   GPSSatellites                        string
+  0x0009   GPSStatus                            string[2]
+  0x000a   GPSMeasureMode                       string[2]
+  0x000b   GPSDOP                               rational64u
+  0x000c   GPSSpeedRef                          string[2]
+  0x000d   GPSSpeed                             rational64u
+  0x000e   GPSTrackRef                          string[2]
+  0x000f   GPSTrack                             rational64u
+  0x0010   GPSImgDirectionRef                   string[2]
+  0x0011   GPSImgDirection                      rational64u
+  0x0012   GPSMapDatum                          string
+  0x0013   GPSDestLatitudeRef                   string[2]
+  0x0014   GPSDestLatitude                      rational64u[3]
+  0x0015   GPSDestLongitudeRef                  string[2]
+  0x0016   GPSDestLongitude                     rational64u[3]
+  0x0017   GPSDestBearingRef                    string[2]
+  0x0018   GPSDestBearing                       rational64u
+  0x0019   GPSDestDistanceRef                   string[2]
+  0x001a   GPSDestDistance                      rational64u
+  0x001b   GPSProcessingMethod                  undef
+  0x001c   GPSAreaInformation                   undef
+  0x001d   GPSDateStamp                         string[11]
+  0x001e   GPSDifferential                      int16u
+  0x001f   GPSHPositioningError                 rational64u
+
+=head2 GeoTiff Tags
+
+ExifTool extracts the following tags from GeoTIFF images.  See
+L<http://www.remotesensing.org/geotiff/spec/geotiffhome.html> for the
+complete GeoTIFF specification.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0001   GeoTiffVersion                       N
+  0x0400   GTModelType                          N
+  0x0401   GTRasterType                         N
+  0x0402   GTCitation                           N
+  0x0800   GeographicType                       N
+  0x0801   GeogCitation                         N
+  0x0802   GeogGeodeticDatum                    N
+  0x0803   GeogPrimeMeridian                    N
+  0x0804   GeogLinearUnits                      N
+  0x0805   GeogLinearUnitSize                   N
+  0x0806   GeogAngularUnits                     N
+  0x0807   GeogAngularUnitSize                  N
+  0x0808   GeogEllipsoid                        N
+  0x0809   GeogSemiMajorAxis                    N
+  0x080a   GeogSemiMinorAxis                    N
+  0x080b   GeogInvFlattening                    N
+  0x080c   GeogAzimuthUnits                     N
+  0x080d   GeogPrimeMeridianLong                N
+  0x0c00   ProjectedCSType                      N
+  0x0c01   PCSCitation                          N
+  0x0c02   Projection                           N
+  0x0c03   ProjCoordTrans                       N
+  0x0c04   ProjLinearUnits                      N
+  0x0c05   ProjLinearUnitSize                   N
+  0x0c06   ProjStdParallel1                     N
+  0x0c07   ProjStdParallel2                     N
+  0x0c08   ProjNatOriginLong                    N
+  0x0c09   ProjNatOriginLat                     N
+  0x0c0a   ProjFalseEasting                     N
+  0x0c0b   ProjFalseNorthing                    N
+  0x0c0c   ProjFalseOriginLong                  N
+  0x0c0d   ProjFalseOriginLat                   N
+  0x0c0e   ProjFalseOriginEasting               N
+  0x0c0f   ProjFalseOriginNorthing              N
+  0x0c10   ProjCenterLong                       N
+  0x0c11   ProjCenterLat                        N
+  0x0c12   ProjCenterEasting                    N
+  0x0c13   ProjCenterNorthing                   N
+  0x0c14   ProjScaleAtNatOrigin                 N
+  0x0c15   ProjScaleAtCenter                    N
+  0x0c16   ProjAzimuthAngle                     N
+  0x0c17   ProjStraightVertPoleLong             N
+  0x0c18   ProjRectifiedGridAngle               N
+  0x1000   VerticalCSType                       N
+  0x1001   VerticalCitation                     N
+  0x1002   VerticalDatum                        N
+  0x1003   VerticalUnits                        N
+
+=head2 ICC_Profile Tags
+
+ICC profile information is used in many different file types including JPEG,
+TIFF, PDF, PostScript, Photoshop, PNG, MIFF, PICT, QuickTime, XCF and some
+RAW formats.  While the tags listed below are not individually writable, the
+entire profile itself can be accessed via the extra 'ICC_Profile' tag, but
+this tag is neither extracted nor written unless specified explicitly.  See
+L<http://www.color.org/icc_specs2.xalter> for the official ICC
+specification.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'A2B0'   AToB0                                N
+  'A2B1'   AToB1                                N
+  'A2B2'   AToB2                                N
+  'B2A0'   BToA0                                N
+  'B2A1'   BToA1                                N
+  'B2A2'   BToA2                                N
+  'B2D0'   BToD0                                N
+  'B2D1'   BToD1                                N
+  'B2D2'   BToD2                                N
+  'B2D3'   BToD3                                N
+  'D2B0'   DToB0                                N
+  'D2B1'   DToB1                                N
+  'D2B2'   DToB2                                N
+  'D2B3'   DToB3                                N
+  'Header' ProfileHeader                        ICC_Profile Header
+  'MS00'   WCSProfiles                          N
+  'bTRC'   BlueTRC                              N
+  'bXYZ'   BlueMatrixColumn                     N
+  'bfd '   UCRBG                                N
+  'bkpt'   MediaBlackPoint                      N
+  'calt'   CalibrationDateTime                  N
+  'chad'   ChromaticAdaptation                  N
+  'chrm'   Chromaticity                         ICC_Profile Chromaticity
+  'ciis'   ColorimetricIntentImageState         N
+  'clot'   ColorantTableOut                     N
+  'clro'   ColorantOrder                        N
+  'clrt'   ColorantTable                        ICC_Profile ColorantTable
+  'cprt'   ProfileCopyright                     N
+  'crdi'   CRDInfo                              N
+  'desc'   ProfileDescription                   N
+  'devs'   DeviceSettings                       N
+  'dmdd'   DeviceModelDesc                      N
+  'dmnd'   DeviceMfgDesc                        N
+  'dscm'   ProfileDescriptionML                 N
+  'fpce'   FocalPlaneColorimetryEstimates       N
+  'gTRC'   GreenTRC                             N
+  'gXYZ'   GreenMatrixColumn                    N
+  'gamt'   Gamut                                N
+  'kTRC'   GrayTRC                              N
+  'lumi'   Luminance                            N
+  'meas'   Measurement                          ICC_Profile Measurement
+  'meta'   Metadata                             ICC_Profile Metadata
+  'mmod'   MakeAndModel                         N
+  'ncl2'   NamedColor2                          N
+  'ncol'   NamedColor                           N
+  'ndin'   NativeDisplayInfo                    N
+  'pre0'   Preview0                             N
+  'pre1'   Preview1                             N
+  'pre2'   Preview2                             N
+  'ps2i'   PS2RenderingIntent                   N
+  'ps2s'   PostScript2CSA                       N
+  'psd0'   PostScript2CRD0                      N
+  'psd1'   PostScript2CRD1                      N
+  'psd2'   PostScript2CRD2                      N
+  'pseq'   ProfileSequenceDesc                  N
+  'psid'   ProfileSequenceIdentifier            N
+  'psvm'   PS2CRDVMSize                         N
+  'rTRC'   RedTRC                               N
+  'rXYZ'   RedMatrixColumn                      N
+  'resp'   OutputResponse                       N
+  'rhoc'   ReflectionHardcopyOrigColorimetry    N
+  'rig0'   PerceptualRenderingIntentGamut       N
+  'rig2'   SaturationRenderingIntentGamut       N
+  'rpoc'   ReflectionPrintOutputColorimetry     N
+  'sape'   SceneAppearanceEstimates             N
+  'scoe'   SceneColorimetryEstimates            N
+  'scrd'   ScreeningDesc                        N
+  'scrn'   Screening                            N
+  'targ'   CharTarget                           N
+  'tech'   Technology                           N
+  'vcgt'   VideoCardGamma                       N
+  'view'   ViewingConditions                    ICC_Profile ViewingConditions
+  'vued'   ViewingCondDesc                      N
+  'wtpt'   MediaWhitePoint                      N
+
+=head3 ICC_Profile Header Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      4    ProfileCMMType                       N
+      8    ProfileVersion                       N
+     12    ProfileClass                         N
+     16    ColorSpaceData                       N
+     20    ProfileConnectionSpace               N
+     24    ProfileDateTime                      N
+     36    ProfileFileSignature                 N
+     40    PrimaryPlatform                      N
+     44    CMMFlags                             N
+     48    DeviceManufacturer                   N
+     52    DeviceModel                          N
+     56    DeviceAttributes                     N
+     64    RenderingIntent                      N
+     68    ConnectionSpaceIlluminant            N
+     80    ProfileCreator                       N
+     84    ProfileID                            N
+
+=head3 ICC_Profile Chromaticity Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      8    ChromaticityChannels                 N
+     10    ChromaticityColorant                 N
+     12    ChromaticityChannel1                 N
+     20    ChromaticityChannel2                 N
+     28    ChromaticityChannel3                 N
+     36    ChromaticityChannel4                 N
+
+=head3 ICC_Profile ColorantTable Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      8    ColorantCount                        N
+     12    Colorant1Name                        N
+     44    Colorant1Coordinates                 N
+     50    Colorant2Name                        N
+     82    Colorant2Coordinates                 N
+     88    Colorant3Name                        N
+    120    Colorant3Coordinates                 N
+
+=head3 ICC_Profile Measurement Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      8    MeasurementObserver                  N
+     12    MeasurementBacking                   N
+     24    MeasurementGeometry                  N
+     28    MeasurementFlare                     N
+     32    MeasurementIlluminant                N
+
+=head3 ICC_Profile Metadata Tags
+
+Only these few tags have been pre-defined, but ExifTool will extract any
+Metadata tags that exist.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  ManufacturerName                              N
+  MediaColor                                    N
+  MediaWeight                                   N
+
+=head3 ICC_Profile ViewingConditions Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      8    ViewingCondIlluminant                N
+     20    ViewingCondSurround                  N
+     32    ViewingCondIlluminantType            N
+
+=head2 PrintIM Tags
+
+The format of the PrintIM information is known, however no PrintIM tags have
+been decoded.  Use the Unknown (-u) option to extract PrintIM information.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'PrintIMVersion'     PrintIMVersion           N
+
+=head2 Photoshop Tags
+
+Photoshop tags are found in PSD and PSB files, as well as inside embedded
+Photoshop information in many other file types (JPEG, TIFF, PDF, PNG to name
+a few).
+
+Many Photoshop tags are marked as Unknown (indicated by a question mark
+after the tag name) because the information they provide is not very useful
+under normal circumstances I<[and because Adobe denied my application for
+their file format documentation -- apparently open source software is too
+big a concept for them]>.  These unknown tags are not extracted unless the
+Unknown (-u) option is used.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x03e8   Photoshop2Info?                      N
+  0x03e9   MacintoshPrintInfo?                  N
+  0x03ea   XMLData?                             N
+  0x03eb   Photoshop2ColorTable?                N
+  0x03ed   ResolutionInfo                       Photoshop Resolution
+  0x03ee   AlphaChannelsNames                   N
+  0x03ef   DisplayInfo?                         N
+  0x03f0   PStringCaption?                      N
+  0x03f1   BorderInformation?                   N
+  0x03f2   BackgroundColor?                     N
+  0x03f3   PrintFlags?                          N
+  0x03f4   BW_HalftoningInfo?                   N
+  0x03f5   ColorHalftoningInfo?                 N
+  0x03f6   DuotoneHalftoningInfo?               N
+  0x03f7   BW_TransferFunc?                     N
+  0x03f8   ColorTransferFuncs?                  N
+  0x03f9   DuotoneTransferFuncs?                N
+  0x03fa   DuotoneImageInfo?                    N
+  0x03fb   EffectiveBW?                         N
+  0x03fc   ObsoletePhotoshopTag1?               N
+  0x03fd   EPSOptions?                          N
+  0x03fe   QuickMaskInfo?                       N
+  0x03ff   ObsoletePhotoshopTag2?               N
+  0x0400   LayerStateInfo?                      N
+  0x0401   WorkingPath?                         N
+  0x0402   LayersGroupInfo?                     N
+  0x0403   ObsoletePhotoshopTag3?               N
+  0x0404   IPTCData                             IPTC
+  0x0405   RawImageMode?                        N
+  0x0406   JPEG_Quality                         Photoshop JPEG_Quality
+  0x0408   GridGuidesInfo?                      N
+  0x0409   PhotoshopBGRThumbnail                N
+  0x040a   CopyrightFlag                        int8u
+  0x040b   URL                                  string
+  0x040c   PhotoshopThumbnail                   N
+  0x040d   GlobalAngle                          int32u
+  0x040e   ColorSamplersResource?               N
+  0x040f   ICC_Profile                          ICC_Profile
+  0x0410   Watermark?                           N
+  0x0411   ICC_Untagged?                        N
+  0x0412   EffectsVisible?                      N
+  0x0413   SpotHalftone?                        N
+  0x0414   IDsBaseValue?                        N
+  0x0415   UnicodeAlphaNames?                   N
+  0x0416   IndexedColourTableCount?             N
+  0x0417   TransparentIndex?                    N
+  0x0419   GlobalAltitude                       int32u
+  0x041a   Slices?                              N
+  0x041b   WorkflowURL?                         N
+  0x041c   JumpToXPEP?                          N
+  0x041d   AlphaIdentifiers?                    N
+  0x041e   URL_List?                            N
+  0x0421   VersionInfo?                         N
+  0x0422   EXIFInfo                             EXIF
+  0x0423   ExifInfo2?                           N
+  0x0424   XMP                                  XMP
+  0x0425   IPTCDigest                           string!
+  0x0426   PrintScale?                          N
+  0x0428   PixelAspectRatio?                    N
+  0x0429   LayerComps?                          N
+  0x042a   AlternateDuotoneColors?              N
+  0x042b   AlternateSpotColors?                 N
+  0x0bb7   ClippingPathName                     N
+  0x2710   PrintFlagsInfo?                      N
+
+=head3 Photoshop Resolution Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    XResolution                          int32u
+      2    DisplayedUnitsX                      int16u
+      4    YResolution                          int32u
+      6    DisplayedUnitsY                      int16u
+
+=head3 Photoshop JPEG_Quality Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    PhotoshopQuality                     int16s
+      1    PhotoshopFormat                      N
+      2    ProgressiveScans                     N
+
+=head3 Photoshop Header Tags
+
+This information is found in the PSD file header.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      6    NumChannels                          N
+      7    ImageHeight                          N
+      9    ImageWidth                           N
+     11    BitDepth                             N
+     12    ColorMode                            N
+
+=head2 Canon Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0001   CanonCameraSettings                  Canon CameraSettings
+  0x0002   CanonFocalLength                     Canon FocalLength
+  0x0003   CanonFlashInfo?                      N
+  0x0004   CanonShotInfo                        Canon ShotInfo
+  0x0005   CanonPanorama                        Canon Panorama
+  0x0006   CanonImageType                       string
+  0x0007   CanonFirmwareVersion                 string
+  0x0008   FileNumber                           int32u
+  0x0009   OwnerName                            string
+  0x000a   UnknownD30                           Canon UnknownD30
+  0x000c   SerialNumber                         int32u
+  0x000d   CanonCameraInfo1D                    Canon CameraInfo1D
+           CanonCameraInfo1DmkII                Canon CameraInfo1DmkII
+           CanonCameraInfo1DmkIIN               Canon CameraInfo1DmkIIN
+           CanonCameraInfo1DmkIII               Canon CameraInfo1DmkIII
+           CanonCameraInfo1DmkIV                Canon CameraInfo1DmkIV
+           CanonCameraInfo5D                    Canon CameraInfo5D
+           CanonCameraInfo5DmkII                Canon CameraInfo5DmkII
+           CanonCameraInfo7D                    Canon CameraInfo7D
+           CanonCameraInfo40D                   Canon CameraInfo40D
+           CanonCameraInfo50D                   Canon CameraInfo50D
+           CanonCameraInfo60D                   Canon CameraInfo60D
+           CanonCameraInfo450D                  Canon CameraInfo450D
+           CanonCameraInfo500D                  Canon CameraInfo500D
+           CanonCameraInfo550D                  Canon CameraInfo550D
+           CanonCameraInfo1000D                 Canon CameraInfo1000D
+           CanonCameraInfoPowerShot             Canon CameraInfoPowerShot
+           CanonCameraInfoPowerShot2            Canon CameraInfoPowerShot2
+           CanonCameraInfoUnknown32             Canon CameraInfoUnknown32
+           CanonCameraInfoUnknown16             Canon CameraInfoUnknown16
+           CanonCameraInfoUnknown               Canon CameraInfoUnknown
+  0x000e   CanonFileLength                      int32u
+  0x000f   CustomFunctions1D                    CanonCustom Functions1D
+           CustomFunctions5D                    CanonCustom Functions5D
+           CustomFunctions10D                   CanonCustom Functions10D
+           CustomFunctions20D                   CanonCustom Functions20D
+           CustomFunctions30D                   CanonCustom Functions30D
+           CustomFunctions350D                  CanonCustom Functions350D
+           CustomFunctions400D                  CanonCustom Functions400D
+           CustomFunctionsD30                   CanonCustom FunctionsD30
+           CustomFunctionsD60                   CanonCustom FunctionsD30
+           CustomFunctionsUnknown               CanonCustom FuncsUnknown
+  0x0010   CanonModelID                         int32u
+  0x0011   MovieInfo                            Canon MovieInfo
+  0x0012   CanonAFInfo                          Canon AFInfo
+  0x0013   ThumbnailImageValidArea              int16u[4]
+  0x0015   SerialNumberFormat                   int32u
+  0x001a   SuperMacro                           int16u
+  0x001c   DateStampMode                        int16u
+  0x001d   MyColors                             Canon MyColors
+  0x001e   FirmwareRevision                     int32u
+  0x0023   Categories                           int32u[2]
+  0x0024   FaceDetect1                          Canon FaceDetect1
+  0x0025   FaceDetect2                          Canon FaceDetect2
+  0x0026   CanonAFInfo2                         Canon AFInfo2
+  0x0028   ImageUniqueID                        int8u
+  0x0081   RawDataOffset                        N
+  0x0083   OriginalDecisionDataOffset           int32u*
+  0x0090   CustomFunctions1D                    CanonCustom Functions1D
+  0x0091   PersonalFunctions                    CanonCustom PersonalFuncs
+  0x0092   PersonalFunctionValues               CanonCustom PersonalFuncValues
+  0x0093   CanonFileInfo                        Canon FileInfo
+  0x0094   AFPointsInFocus1D                    N
+  0x0095   LensModel                            string
+  0x0096   SerialInfo                           Canon SerialInfo
+           InternalSerialNumber                 string
+  0x0097   DustRemovalData                      undef!
+  0x0098   CropInfo                             Canon CropInfo
+  0x0099   CustomFunctions2                     CanonCustom Functions2
+  0x009a   AspectInfo                           Canon AspectInfo
+  0x00a0   ProcessingInfo                       Canon Processing
+  0x00a1   ToneCurveTable                       N
+  0x00a2   SharpnessTable                       N
+  0x00a3   SharpnessFreqTable                   N
+  0x00a4   WhiteBalanceTable                    N
+  0x00a9   ColorBalance                         Canon ColorBalance
+  0x00aa   MeasuredColor                        Canon MeasuredColor
+  0x00ae   ColorTemperature                     int16u
+  0x00b0   CanonFlags                           Canon Flags
+  0x00b1   ModifiedInfo                         Canon ModifiedInfo
+  0x00b2   ToneCurveMatching                    N
+  0x00b3   WhiteBalanceMatching                 N
+  0x00b4   ColorSpace                           int16u
+  0x00b6   PreviewImageInfo                     Canon PreviewImageInfo
+  0x00d0   VRDOffset                            int32u*
+  0x00e0   SensorInfo                           Canon SensorInfo
+  0x4001   ColorData1                           Canon ColorData1
+           ColorData2                           Canon ColorData2
+           ColorData3                           Canon ColorData3
+           ColorData4                           Canon ColorData4
+           ColorData5                           Canon ColorData5
+           ColorData6                           Canon ColorData6
+           ColorDataUnknown                     Canon ColorDataUnknown
+  0x4002   CRWParam?                            N
+  0x4003   ColorInfo                            Canon ColorInfo
+  0x4005   Flavor?                              N
+  0x4008   BlackLevel?                          N
+  0x4010   CustomPictureStyleFileName           string
+  0x4013   AFMicroAdj                           Canon AFMicroAdj
+  0x4015   VignettingCorr                       Canon VignettingCorr
+  0x4016   VignettingCorr2                      Canon VignettingCorr2
+  0x4018   LightingOpt                          Canon LightingOpt
+  0x4019   LensInfo                             Canon LensInfo
+  0x4020   AmbienceInfo                         Canon Ambience
+  0x4024   FilterInfo                           Canon FilterInfo
+
+=head3 Canon CameraSettings Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      1    MacroMode                            int16s
+      2    SelfTimer                            int16s
+      3    Quality                              int16s
+      4    CanonFlashMode                       int16s
+      5    ContinuousDrive                      int16s
+      7    FocusMode                            int16s
+      9    RecordMode                           int16s
+     10    CanonImageSize                       int16s
+     11    EasyMode                             int16s
+     12    DigitalZoom                          int16s
+     13    Contrast                             int16s
+     14    Saturation                           int16s
+     15    Sharpness                            int16s
+     16    CameraISO                            int16s
+     17    MeteringMode                         int16s
+     18    FocusRange                           int16s
+     19    AFPoint                              int16s
+     20    CanonExposureMode                    int16s
+     22    LensType                             int16s
+     23    LongFocal                            int16u
+     24    ShortFocal                           int16u
+     25    FocalUnits                           int16s
+     26    MaxAperture                          int16s
+     27    MinAperture                          int16s
+     28    FlashActivity                        int16s
+     29    FlashBits                            int16s
+     32    FocusContinuous                      int16s
+     33    AESetting                            int16s
+     34    ImageStabilization                   int16s
+     35    DisplayAperture                      int16s
+     36    ZoomSourceWidth                      int16s
+     37    ZoomTargetWidth                      int16s
+     39    SpotMeteringMode                     int16s
+     40    PhotoEffect                          int16s
+     41    ManualFlashOutput                    int16s
+     42    ColorTone                            int16s
+     46    SRAWQuality                          int16s
+
+=head3 Canon FocalLength Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    FocalType                            int16u
+      1    FocalLength                          int16u
+      2    FocalPlaneXSize                      int16u
+           FocalPlaneXUnknown?                  int16u
+      3    FocalPlaneYSize                      int16u
+           FocalPlaneYUnknown?                  int16u
+
+=head3 Canon ShotInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      1    AutoISO                              int16s
+      2    BaseISO                              int16s
+      3    MeasuredEV                           int16s
+      4    TargetAperture                       int16s
+      5    TargetExposureTime                   int16s
+      6    ExposureCompensation                 int16s
+      7    WhiteBalance                         int16s
+      8    SlowShutter                          int16s
+      9    SequenceNumber                       int16s
+     10    OpticalZoomCode                      int16s
+     12    CameraTemperature                    int16s
+     13    FlashGuideNumber                     int16s
+     14    AFPointsInFocus                      int16s
+     15    FlashExposureComp                    int16s
+     16    AutoExposureBracketing               int16s
+     17    AEBBracketValue                      int16s
+     18    ControlMode                          int16s
+     19    FocusDistanceUpper                   int16u
+     20    FocusDistanceLower                   int16u
+     21    FNumber                              int16s
+     22    ExposureTime                         int16s
+     23    MeasuredEV2                          int16s
+     24    BulbDuration                         int16s
+     26    CameraType                           int16s
+     27    AutoRotate                           int16s
+     28    NDFilter                             int16s
+     29    SelfTimer2                           int16s
+     33    FlashOutput                          int16s
+
+=head3 Canon Panorama Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      2    PanoramaFrameNumber                  int16s
+      5    PanoramaDirection                    int16s
+
+=head3 Canon UnknownD30 Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+  [no tags known]
+
+=head3 Canon CameraInfo1D Tags
+
+Information in the "CameraInfo" records is tricky to decode because the
+encodings are very different than in other Canon records (even sometimes
+switching endianness between values within a single camera), plus there is
+considerable variation in format from model to model. The first table below
+lists CameraInfo tags for the 1D and 1DS.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      4    ExposureTime                         int8u
+     10    FocalLength                          int16u
+     13    LensType                             int16uRev
+     14    ShortFocal                           int16u
+     16    LongFocal                            int16u
+     65    SharpnessFrequency                   int8u
+     66    Sharpness                            int8s
+     68    WhiteBalance                         int8u
+     71    SharpnessFrequency                   int8u
+     72    ColorTemperature                     int16u
+           Sharpness                            int8s
+     74    WhiteBalance                         int8u
+     75    PictureStyle                         int8u
+     78    ColorTemperature                     int16u
+     81    PictureStyle                         int8u
+
+=head3 Canon CameraInfo1DmkII Tags
+
+CameraInfo tags for the 1DmkII and 1DSmkII.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      4    ExposureTime                         int8u
+      9    FocalLength                          int16uRev
+     12    LensType                             int16uRev
+     17    ShortFocal                           int16uRev
+     19    LongFocal                            int16uRev
+     45    FocalType                            int8u
+     54    WhiteBalance                         int8u
+     55    ColorTemperature                     int16uRev
+     57    CanonImageSize                       int16u
+    102    JPEGQuality                          int8u
+    108    PictureStyle                         int8u
+    110    Saturation                           int8s
+    111    ColorTone                            int8s
+    114    Sharpness                            int8s
+    115    Contrast                             int8s
+    117    ISO                                  string[5]
+
+=head3 Canon CameraInfo1DmkIIN Tags
+
+CameraInfo tags for the 1DmkIIN.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      4    ExposureTime                         int8u
+      9    FocalLength                          int16uRev
+     12    LensType                             int16uRev
+     17    ShortFocal                           int16uRev
+     19    LongFocal                            int16uRev
+     54    WhiteBalance                         int8u
+     55    ColorTemperature                     int16uRev
+    115    PictureStyle                         int8u
+    116    Sharpness                            int8s
+    117    Contrast                             int8s
+    118    Saturation                           int8s
+    119    ColorTone                            int8s
+    121    ISO                                  string[5]
+
+=head3 Canon CameraInfo1DmkIII Tags
+
+CameraInfo tags for the 1DmkIII and 1DSmkIII.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      3    FNumber                              int8u
+      4    ExposureTime                         int8u
+      6    ISO                                  int8u
+     24    CameraTemperature                    int8u
+     27    MacroMagnification                   int8u
+     29    FocalLength                          int16uRev
+     48    CameraOrientation                    int8u
+     67    FocusDistanceUpper                   int16uRev
+     69    FocusDistanceLower                   int16uRev
+     94    WhiteBalance                         int16u
+     98    ColorTemperature                     int16u
+    134    PictureStyle                         int8u
+    273    LensType                             int16uRev
+    275    ShortFocal                           int16uRev
+    277    LongFocal                            int16uRev
+    310    FirmwareVersion                      string[6]
+    370    FileIndex                            int32u
+    374    ShutterCount                         int32u
+    382    DirectoryIndex                       int32u
+    682    PictureStyleInfo                     Canon PSInfo
+   1114    TimeStamp1                           int32u
+   1118    TimeStamp                            int32u
+
+=head3 Canon PSInfo Tags
+
+Custom picture style information for various models.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ContrastStandard                     int32s
+      4    SharpnessStandard                    int32s
+      8    SaturationStandard                   int32s
+     12    ColorToneStandard                    int32s
+     16    FilterEffectStandard?                int32s
+     20    ToningEffectStandard?                int32s
+     24    ContrastPortrait                     int32s
+     28    SharpnessPortrait                    int32s
+     32    SaturationPortrait                   int32s
+     36    ColorTonePortrait                    int32s
+     40    FilterEffectPortrait?                int32s
+     44    ToningEffectPortrait?                int32s
+     48    ContrastLandscape                    int32s
+     52    SharpnessLandscape                   int32s
+     56    SaturationLandscape                  int32s
+     60    ColorToneLandscape                   int32s
+     64    FilterEffectLandscape?               int32s
+     68    ToningEffectLandscape?               int32s
+     72    ContrastNeutral                      int32s
+     76    SharpnessNeutral                     int32s
+     80    SaturationNeutral                    int32s
+     84    ColorToneNeutral                     int32s
+     88    FilterEffectNeutral?                 int32s
+     92    ToningEffectNeutral?                 int32s
+     96    ContrastFaithful                     int32s
+    100    SharpnessFaithful                    int32s
+    104    SaturationFaithful                   int32s
+    108    ColorToneFaithful                    int32s
+    112    FilterEffectFaithful?                int32s
+    116    ToningEffectFaithful?                int32s
+    120    ContrastMonochrome                   int32s
+    124    SharpnessMonochrome                  int32s
+    128    SaturationMonochrome?                int32s
+    132    ColorToneMonochrome?                 int32s
+    136    FilterEffectMonochrome               int32s
+    140    ToningEffectMonochrome               int32s
+    144    ContrastUserDef1                     int32s
+    148    SharpnessUserDef1                    int32s
+    152    SaturationUserDef1                   int32s
+    156    ColorToneUserDef1                    int32s
+    160    FilterEffectUserDef1                 int32s
+    164    ToningEffectUserDef1                 int32s
+    168    ContrastUserDef2                     int32s
+    172    SharpnessUserDef2                    int32s
+    176    SaturationUserDef2                   int32s
+    180    ColorToneUserDef2                    int32s
+    184    FilterEffectUserDef2                 int32s
+    188    ToningEffectUserDef2                 int32s
+    192    ContrastUserDef3                     int32s
+    196    SharpnessUserDef3                    int32s
+    200    SaturationUserDef3                   int32s
+    204    ColorToneUserDef3                    int32s
+    208    FilterEffectUserDef3                 int32s
+    212    ToningEffectUserDef3                 int32s
+    216    UserDef1PictureStyle                 int16u
+    218    UserDef2PictureStyle                 int16u
+    220    UserDef3PictureStyle                 int16u
+
+=head3 Canon CameraInfo1DmkIV Tags
+
+CameraInfo tags for the 1DmkIV.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      3    FNumber                              int8u
+      4    ExposureTime                         int8u
+      6    ISO                                  int8u
+      7    HighlightTonePriority                int8u
+      8    MeasuredEV2                          int8u
+      9    MeasuredEV3                          int8u
+     21    FlashMeteringMode                    int8u
+     25    CameraTemperature                    int8u
+     30    FocalLength                          int16uRev
+     53    CameraOrientation                    int8u
+     84    FocusDistanceUpper                   int16uRev
+     86    FocusDistanceLower                   int16uRev
+    119    WhiteBalance                         int16u
+    120    WhiteBalance                         int16u
+    123    ColorTemperature                     int16u
+    124    ColorTemperature                     int16u
+    334    LensType                             int16uRev
+    335    LensType                             int16uRev
+    336    ShortFocal                           int16uRev
+    337    ShortFocal                           int16uRev
+    338    LongFocal                            int16uRev
+    339    LongFocal                            int16uRev
+    488    FirmwareVersion                      N
+    493    FirmwareVersion                      N
+    551    FileIndex                            int32u
+    556    FileIndex                            int32u
+    563    DirectoryIndex                       int32u
+    568    DirectoryIndex                       int32u
+    867    PictureStyleInfo                     Canon PSInfo
+    872    PictureStyleInfo                     Canon PSInfo
+
+=head3 Canon CameraInfo5D Tags
+
+CameraInfo tags for the EOS 5D.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      3    FNumber                              int8u
+      4    ExposureTime                         int8u
+      6    ISO                                  int8u
+     12    LensType                             int16uRev
+     23    CameraTemperature                    int8u
+     27    MacroMagnification                   int8s
+     39    CameraOrientation                    int8s
+     40    FocalLength                          int16uRev
+     56    AFPointsInFocus5D                    int16uRev
+     84    WhiteBalance                         int16u
+     88    ColorTemperature                     int16u
+    108    PictureStyle                         int8u
+    147    ShortFocal                           int16uRev
+    149    LongFocal                            int16uRev
+    151    LensType                             int16uRev
+    164    FirmwareRevision                     string[8]
+    172    ShortOwnerName                       string[16]
+    208    ImageNumber                          int16u
+    232    ContrastStandard                     int8s
+    233    ContrastPortrait                     int8s
+    234    ContrastLandscape                    int8s
+    235    ContrastNeutral                      int8s
+    236    ContrastFaithful                     int8s
+    237    ContrastMonochrome                   int8s
+    238    ContrastUserDef1                     int8s
+    239    ContrastUserDef2                     int8s
+    240    ContrastUserDef3                     int8s
+    241    SharpnessStandard                    int8s
+    242    SharpnessPortrait                    int8s
+    243    SharpnessLandscape                   int8s
+    244    SharpnessNeutral                     int8s
+    245    SharpnessFaithful                    int8s
+    246    SharpnessMonochrome                  int8s
+    247    SharpnessUserDef1                    int8s
+    248    SharpnessUserDef2                    int8s
+    249    SharpnessUserDef3                    int8s
+    250    SaturationStandard                   int8s
+    251    SaturationPortrait                   int8s
+    252    SaturationLandscape                  int8s
+    253    SaturationNeutral                    int8s
+    254    SaturationFaithful                   int8s
+    255    FilterEffectMonochrome               int8s
+    256    SaturationUserDef1                   int8s
+    257    SaturationUserDef2                   int8s
+    258    SaturationUserDef3                   int8s
+    259    ColorToneStandard                    int8s
+    260    ColorTonePortrait                    int8s
+    261    ColorToneLandscape                   int8s
+    262    ColorToneNeutral                     int8s
+    263    ColorToneFaithful                    int8s
+    264    ToningEffectMonochrome               int8s
+    265    ColorToneUserDef1                    int8s
+    266    ColorToneUserDef2                    int8s
+    267    ColorToneUserDef3                    int8s
+    268    UserDef1PictureStyle                 int16u
+    270    UserDef2PictureStyle                 int16u
+    272    UserDef3PictureStyle                 int16u
+    284    TimeStamp                            int32u
+
+=head3 Canon CameraInfo5DmkII Tags
+
+CameraInfo tags for the EOS 5D Mark II.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      3    FNumber                              int8u
+      4    ExposureTime                         int8u
+      6    ISO                                  int8u
+      7    HighlightTonePriority                int8u
+     21    FlashMeteringMode                    int8u
+     25    CameraTemperature                    int8u
+     27    MacroMagnification                   int8u
+     30    FocalLength                          int16uRev
+     49    CameraOrientation                    int8u
+     80    FocusDistanceUpper                   int16uRev
+     82    FocusDistanceLower                   int16uRev
+    111    WhiteBalance                         int16u
+    115    ColorTemperature                     int16u
+    167    PictureStyle                         int8u
+    189    HighISONoiseReduction                int8u
+    191    AutoLightingOptimizer                int8u
+    230    LensType                             int16uRev
+    232    ShortFocal                           int16uRev
+    234    LongFocal                            int16uRev
+    346    CameraInfo5DmkII_2a                  Canon CameraInfo5DmkII_2
+    382    CameraInfo5DmkII_2b                  Canon CameraInfo5DmkII_2
+
+=head3 Canon CameraInfo5DmkII_2 Tags
+
+More CameraInfo tags for the EOS 5D Mark II.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    FirmwareVersion                      N
+     61    FileIndex                            int32u
+     73    DirectoryIndex                       int32u
+    377    PictureStyleInfo                     Canon PSInfo
+
+=head3 Canon CameraInfo7D Tags
+
+CameraInfo tags for the EOS 7D.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      3    FNumber                              int8u
+      4    ExposureTime                         int8u
+      6    ISO                                  int8u
+      7    HighlightTonePriority                int8u
+      8    MeasuredEV2                          int8u
+      9    MeasuredEV                           int8u
+     21    FlashMeteringMode                    int8u
+     25    CameraTemperature                    int8u
+     30    FocalLength                          int16uRev
+     32    CameraInfo7D_2a                      Canon CameraInfo7D_2
+     36    CameraInfo7D_2b                      Canon CameraInfo7D_2
+
+=head3 Canon CameraInfo7D_2 Tags
+
+More CameraInfo tags for the EOS 7D.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+     17    CameraOrientation                    int8u
+     48    FocusDistanceUpper                   int16uRev
+     50    FocusDistanceLower                   int16uRev
+     83    WhiteBalance                         int16u
+     87    ColorTemperature                     int16u
+    165    HighISONoiseReduction                int8u
+    238    LensType                             int16uRev
+    240    ShortFocal                           int16uRev
+    242    LongFocal                            int16uRev
+    392    FirmwareVersion                      N
+    455    FileIndex                            int32u
+    467    DirectoryIndex                       int32u
+    771    PictureStyleInfo                     Canon PSInfo
+
+=head3 Canon CameraInfo40D Tags
+
+CameraInfo tags for the EOS 40D.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      3    FNumber                              int8u
+      4    ExposureTime                         int8u
+      6    ISO                                  int8u
+     21    FlashMeteringMode                    int8u
+     24    CameraTemperature                    int8u
+     27    MacroMagnification                   int8u
+     29    FocalLength                          int16uRev
+     48    CameraOrientation                    int8u
+     67    FocusDistanceUpper                   int16uRev
+     69    FocusDistanceLower                   int16uRev
+    111    WhiteBalance                         int16u
+    115    ColorTemperature                     int16u
+    214    LensType                             int16uRev
+    216    ShortFocal                           int16uRev
+    218    LongFocal                            int16uRev
+    255    FirmwareVersion                      string[6]
+    307    FileIndex                            int32u
+    319    DirectoryIndex                       int32u
+    603    PictureStyleInfo                     Canon PSInfo
+   2347    LensModel                            string[64]
+
+=head3 Canon CameraInfo50D Tags
+
+CameraInfo tags for the EOS 50D.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      3    FNumber                              int8u
+      4    ExposureTime                         int8u
+      6    ISO                                  int8u
+      7    HighlightTonePriority                int8u
+     21    FlashMeteringMode                    int8u
+     25    CameraTemperature                    int8u
+     30    FocalLength                          int16uRev
+     49    CameraOrientation                    int8u
+     80    FocusDistanceUpper                   int16uRev
+     82    FocusDistanceLower                   int16uRev
+    111    WhiteBalance                         int16u
+    115    ColorTemperature                     int16u
+    167    PictureStyle                         int8u
+    189    HighISONoiseReduction                int8u
+    191    AutoLightingOptimizer                int8u
+    234    LensType                             int16uRev
+    236    ShortFocal                           int16uRev
+    238    LongFocal                            int16uRev
+    346    FirmwareVersion                      N
+    350    FirmwareVersion                      N
+    407    FileIndex                            int32u
+    411    FileIndex                            int32u
+    419    DirectoryIndex                       int32u
+    423    DirectoryIndex                       int32u
+    723    PictureStyleInfo                     Canon PSInfo
+    727    PictureStyleInfo                     Canon PSInfo
+
+=head3 Canon CameraInfo60D Tags
+
+CameraInfo tags for the EOS 60D.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      3    FNumber                              int8u
+      4    ExposureTime                         int8u
+      6    ISO                                  int8u
+     25    CameraTemperature                    int8u
+     30    FocalLength                          int16uRev
+     54    CameraOrientation                    int8u
+     85    FocusDistanceUpper                   int16uRev
+     87    FocusDistanceLower                   int16uRev
+    125    ColorTemperature                     int16u
+    232    LensType                             int16uRev
+    234    ShortFocal                           int16uRev
+    236    LongFocal                            int16uRev
+    409    FirmwareVersion                      N
+    473    FileIndex                            int32u
+    485    DirectoryIndex                       int32u
+    801    PictureStyleInfo2                    Canon PSInfo2
+
+=head3 Canon PSInfo2 Tags
+
+Custom picture style information for the EOS 60D.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ContrastStandard                     int32s
+      4    SharpnessStandard                    int32s
+      8    SaturationStandard                   int32s
+     12    ColorToneStandard                    int32s
+     16    FilterEffectStandard?                int32s
+     20    ToningEffectStandard?                int32s
+     24    ContrastPortrait                     int32s
+     28    SharpnessPortrait                    int32s
+     32    SaturationPortrait                   int32s
+     36    ColorTonePortrait                    int32s
+     40    FilterEffectPortrait?                int32s
+     44    ToningEffectPortrait?                int32s
+     48    ContrastLandscape                    int32s
+     52    SharpnessLandscape                   int32s
+     56    SaturationLandscape                  int32s
+     60    ColorToneLandscape                   int32s
+     64    FilterEffectLandscape?               int32s
+     68    ToningEffectLandscape?               int32s
+     72    ContrastNeutral                      int32s
+     76    SharpnessNeutral                     int32s
+     80    SaturationNeutral                    int32s
+     84    ColorToneNeutral                     int32s
+     88    FilterEffectNeutral?                 int32s
+     92    ToningEffectNeutral?                 int32s
+     96    ContrastFaithful                     int32s
+    100    SharpnessFaithful                    int32s
+    104    SaturationFaithful                   int32s
+    108    ColorToneFaithful                    int32s
+    112    FilterEffectFaithful?                int32s
+    116    ToningEffectFaithful?                int32s
+    120    ContrastMonochrome                   int32s
+    124    SharpnessMonochrome                  int32s
+    128    SaturationMonochrome?                int32s
+    132    ColorToneMonochrome?                 int32s
+    136    FilterEffectMonochrome               int32s
+    140    ToningEffectMonochrome               int32s
+    144    ContrastUnknown?                     int32s
+    148    SharpnessUnknown?                    int32s
+    152    SaturationUnknown?                   int32s
+    156    ColorToneUnknown?                    int32s
+    160    FilterEffectUnknown?                 int32s
+    164    ToningEffectUnknown?                 int32s
+    168    ContrastUserDef1                     int32s
+    172    SharpnessUserDef1                    int32s
+    176    SaturationUserDef1                   int32s
+    180    ColorToneUserDef1                    int32s
+    184    FilterEffectUserDef1                 int32s
+    188    ToningEffectUserDef1                 int32s
+    192    ContrastUserDef2                     int32s
+    196    SharpnessUserDef2                    int32s
+    200    SaturationUserDef2                   int32s
+    204    ColorToneUserDef2                    int32s
+    208    FilterEffectUserDef2                 int32s
+    212    ToningEffectUserDef2                 int32s
+    216    ContrastUserDef3                     int32s
+    220    SharpnessUserDef3                    int32s
+    224    SaturationUserDef3                   int32s
+    228    ColorToneUserDef3                    int32s
+    232    FilterEffectUserDef3                 int32s
+    236    ToningEffectUserDef3                 int32s
+    240    UserDef1PictureStyle                 int16u
+    242    UserDef2PictureStyle                 int16u
+    244    UserDef3PictureStyle                 int16u
+
+=head3 Canon CameraInfo450D Tags
+
+CameraInfo tags for the EOS 450D.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      3    FNumber                              int8u
+      4    ExposureTime                         int8u
+      6    ISO                                  int8u
+     21    FlashMeteringMode                    int8u
+     24    CameraTemperature                    int8u
+     27    MacroMagnification                   int8u
+     29    FocalLength                          int16uRev
+     48    CameraOrientation                    int8u
+     67    FocusDistanceUpper                   int16uRev
+     69    FocusDistanceLower                   int16uRev
+    111    WhiteBalance                         int16u
+    115    ColorTemperature                     int16u
+    222    LensType                             int16uRev
+    263    FirmwareVersion                      string[6]
+    271    OwnerName                            string[32]
+    307    DirectoryIndex                       int32u
+    319    FileIndex                            int32u
+    611    PictureStyleInfo                     Canon PSInfo
+   2355    LensModel                            string[64]
+
+=head3 Canon CameraInfo500D Tags
+
+CameraInfo tags for the EOS 500D.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      3    FNumber                              int8u
+      4    ExposureTime                         int8u
+      6    ISO                                  int8u
+      7    HighlightTonePriority                int8u
+     21    FlashMeteringMode                    int8u
+     25    CameraTemperature                    int8u
+     30    FocalLength                          int16uRev
+     49    CameraOrientation                    int8u
+     80    FocusDistanceUpper                   int16uRev
+     82    FocusDistanceLower                   int16uRev
+    115    WhiteBalance                         int16u
+    119    ColorTemperature                     int16u
+    171    PictureStyle                         int8u
+    188    HighISONoiseReduction                int8u
+    190    AutoLightingOptimizer                int8u
+    246    LensType                             int16uRev
+    248    ShortFocal                           int16uRev
+    250    LongFocal                            int16uRev
+    400    FirmwareVersion                      N
+    467    FileIndex                            int32u
+    479    DirectoryIndex                       int32u
+    779    PictureStyleInfo                     Canon PSInfo
+
+=head3 Canon CameraInfo550D Tags
+
+CameraInfo tags for the EOS 550D.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      3    FNumber                              int8u
+      4    ExposureTime                         int8u
+      6    ISO                                  int8u
+      7    HighlightTonePriority                int8u
+     21    FlashMeteringMode                    int8u
+     25    CameraTemperature                    int8u
+     30    FocalLength                          int16uRev
+     53    CameraOrientation                    int8u
+     84    FocusDistanceUpper                   int16uRev
+     86    FocusDistanceLower                   int16uRev
+    120    WhiteBalance                         int16u
+    124    ColorTemperature                     int16u
+    176    PictureStyle                         int8u
+    255    LensType                             int16uRev
+    257    ShortFocal                           int16uRev
+    259    LongFocal                            int16uRev
+    420    FirmwareVersion                      N
+    484    FileIndex                            int32u
+    496    DirectoryIndex                       int32u
+    796    PictureStyleInfo                     Canon PSInfo
+
+=head3 Canon CameraInfo1000D Tags
+
+CameraInfo tags for the EOS 1000D.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      3    FNumber                              int8u
+      4    ExposureTime                         int8u
+      6    ISO                                  int8u
+     21    FlashMeteringMode                    int8u
+     24    CameraTemperature                    int8u
+     27    MacroMagnification                   int8u
+     29    FocalLength                          int16uRev
+     48    CameraOrientation                    int8u
+     67    FocusDistanceUpper                   int16uRev
+     69    FocusDistanceLower                   int16uRev
+    111    WhiteBalance                         int16u
+    115    ColorTemperature                     int16u
+    226    LensType                             int16uRev
+    267    FirmwareVersion                      string[6]
+    311    DirectoryIndex                       int32u
+    323    FileIndex                            int32u
+    615    PictureStyleInfo                     Canon PSInfo
+   2359    LensModel                            string[64]
+
+=head3 Canon CameraInfoPowerShot Tags
+
+CameraInfo tags for PowerShot models such as the A450, A460, A550, A560,
+A570, A630, A640, A650, A710, A720, G7, G9, S5, SD40, SD750, SD800, SD850,
+SD870, SD900, SD950, SD1000, SX100 and TX1.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ISO                                  int32s
+      5    FNumber                              int32s
+      6    ExposureTime                         int32s
+     23    Rotation                             int32s
+    135    CameraTemperature                    int32s
+    145    CameraTemperature                    int32s
+
+=head3 Canon CameraInfoPowerShot2 Tags
+
+CameraInfo tags for PowerShot models such as the A470, A480, A490, A495,
+A580, A590, A1000, A1100, A2000, A2100, A3000, A3100, D10, E1, G10, G11,
+S90, S95, SD770, SD780, SD790, SD880, SD890, SD940, SD960, SD970, SD980,
+SD990, SD1100, SD1200, SD1300, SD1400, SD3500, SD4000, SD4500, SX1, SX10,
+SX20, SX110, SX120, SX130, SX200 and SX210.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      1    ISO                                  int32s
+      6    FNumber                              int32s
+      7    ExposureTime                         int32s
+     24    Rotation                             int32s
+    153    CameraTemperature                    int32s
+    159    CameraTemperature                    int32s
+    164    CameraTemperature                    int32s
+    168    CameraTemperature                    int32s
+    261    CameraTemperature                    int32s
+
+=head3 Canon CameraInfoUnknown32 Tags
+
+Unknown CameraInfo tags are divided into 3 tables based on format size.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+     71    CameraTemperature                    int32s
+     83    CameraTemperature                    int32s
+     91    CameraTemperature                    int32s
+     92    CameraTemperature                    int32s
+    100    CameraTemperature                    int32s
+    466    CameraTemperature                    int32s
+    503    CameraTemperature                    int32s
+    506    CameraTemperature                    int32s
+
+=head3 Canon CameraInfoUnknown16 Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+  [no tags known]
+
+=head3 Canon CameraInfoUnknown Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+  [no tags known]
+
+=head3 Canon MovieInfo Tags
+
+Tags written by some Canon cameras when recording video.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      1    FrameRate                            int16u
+      2    FrameCount                           int16u
+      4    FrameCount                           int32u
+      6    FrameRate                            rational32u
+    106    Duration                             int32u
+    108    AudioBitrate                         int32u
+    110    AudioSampleRate                      int32u
+    112    AudioChannels                        int32u
+    116    VideoCodec                           undef[4]
+
+=head3 Canon AFInfo Tags
+
+Auto-focus information used by many older Canon models.  The values in this
+record are sequential, and some have variable sizes based on the value of
+NumAFPoints (which may be 1,5,7,9,15,45 or 53).  The AFArea coordinates are
+given in a system where the image has dimensions given by AFImageWidth and
+AFImageHeight, and 0,0 is the image center. The direction of the Y axis
+depends on the camera model, with positive Y upwards for EOS models, but
+apparently downwards for PowerShot models.
+
+  Sequence Tag Name                             Writable
+  -------- --------                             --------
+      0    NumAFPoints                          N
+      1    ValidAFPoints                        N
+      2    CanonImageWidth                      N
+      3    CanonImageHeight                     N
+      4    AFImageWidth                         N
+      5    AFImageHeight                        N
+      6    AFAreaWidth                          N
+      7    AFAreaHeight                         N
+      8    AFAreaXPositions                     N
+      9    AFAreaYPositions                     N
+     10    AFPointsInFocus                      N
+     11    PrimaryAFPoint                       N
+           Canon_AFInfo_0x000b?                 N
+     12    PrimaryAFPoint                       N
+
+=head3 Canon MyColors Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      2    MyColorMode                          int16u
+
+=head3 Canon FaceDetect1 Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      2    FacesDetected                        int16u
+      3    FaceDetectFrameSize                  int16u[2]
+      8    Face1Position                        int16s[2]
+     10    Face2Position                        int16s[2]
+     12    Face3Position                        int16s[2]
+     14    Face4Position                        int16s[2]
+     16    Face5Position                        int16s[2]
+     18    Face6Position                        int16s[2]
+     20    Face7Position                        int16s[2]
+     22    Face8Position                        int16s[2]
+     24    Face9Position                        int16s[2]
+
+=head3 Canon FaceDetect2 Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      1    FaceWidth                            int8u
+      2    FacesDetected                        int8u
+
+=head3 Canon AFInfo2 Tags
+
+Newer version of the AFInfo record containing much of the same information
+(and coordinate confusion) as the older version.  In this record, values of
+9 and 45 have been observed for NumAFPoints.
+
+  Sequence Tag Name                             Writable
+  -------- --------                             --------
+      0    AFInfoSize?                          N
+      1    AFAreaMode                           N
+      2    NumAFPoints                          N
+      3    ValidAFPoints                        N
+      4    CanonImageWidth                      N
+      5    CanonImageHeight                     N
+      6    AFImageWidth                         N
+      7    AFImageHeight                        N
+      8    AFAreaWidths                         N
+      9    AFAreaHeights                        N
+     10    AFAreaXPositions                     N
+     11    AFAreaYPositions                     N
+     12    AFPointsInFocus                      N
+     13    AFPointsSelected                     N
+           Canon_AFInfo2_0x000d?                N
+     14    PrimaryAFPoint                       N
+
+=head3 Canon FileInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      1    FileNumber                           int32u
+           ShutterCount                         int32u
+      3    BracketMode                          int16s
+      4    BracketValue                         int16s
+      5    BracketShotNumber                    int16s
+      6    RawJpgQuality                        int16s
+      7    RawJpgSize                           int16s
+      8    LongExposureNoiseReduction2          int16s
+      9    WBBracketMode                        int16s
+     12    WBBracketValueAB                     int16s
+     13    WBBracketValueGM                     int16s
+     14    FilterEffect                         int16s
+     15    ToningEffect                         int16s
+     16    MacroMagnification                   int16s
+     19    LiveViewShooting                     int16s
+     25    FlashExposureLock                    int16s
+
+=head3 Canon SerialInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      9    InternalSerialNumber                 string
+
+=head3 Canon CropInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    CropLeftMargin                       int16u
+      1    CropRightMargin                      int16u
+      2    CropTopMargin                        int16u
+      3    CropBottomMargin                     int16u
+
+=head3 Canon AspectInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    AspectRatio                          int32u
+      1    CroppedImageWidth                    int32u
+      2    CroppedImageHeight                   int32u
+
+=head3 Canon Processing Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      1    ToneCurve                            int16s
+      2    Sharpness                            int16s
+      3    SharpnessFrequency                   int16s
+      4    SensorRedLevel                       int16s
+      5    SensorBlueLevel                      int16s
+      6    WhiteBalanceRed                      int16s
+      7    WhiteBalanceBlue                     int16s
+      8    WhiteBalance                         int16s
+      9    ColorTemperature                     int16s
+     10    PictureStyle                         int16s
+     11    DigitalGain                          int16s
+     12    WBShiftAB                            int16s
+     13    WBShiftGM                            int16s
+
+=head3 Canon ColorBalance Tags
+
+These tags are used by the 10D and 300D.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    WB_RGGBLevelsAuto                    int16s[4]
+      4    WB_RGGBLevelsDaylight                int16s[4]
+      8    WB_RGGBLevelsShade                   int16s[4]
+     12    WB_RGGBLevelsCloudy                  int16s[4]
+     16    WB_RGGBLevelsTungsten                int16s[4]
+     20    WB_RGGBLevelsFluorescent             int16s[4]
+     24    WB_RGGBLevelsFlash                   int16s[4]
+     28    WB_RGGBLevelsCustom                  int16s[4]
+     32    WB_RGGBLevelsKelvin                  int16s[4]
+
+=head3 Canon MeasuredColor Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      1    MeasuredRGGB                         int16u[4]
+
+=head3 Canon Flags Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      1    ModifiedParamFlag                    int16s
+
+=head3 Canon ModifiedInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      1    ModifiedToneCurve                    int16s
+      2    ModifiedSharpness                    int16s
+      3    ModifiedSharpnessFreq                int16s
+      4    ModifiedSensorRedLevel               int16s
+      5    ModifiedSensorBlueLevel              int16s
+      6    ModifiedWhiteBalanceRed              int16s
+      7    ModifiedWhiteBalanceBlue             int16s
+      8    ModifiedWhiteBalance                 int16s
+      9    ModifiedColorTemp                    int16s
+     10    ModifiedPictureStyle                 int16s
+     11    ModifiedDigitalGain                  int16s
+
+=head3 Canon PreviewImageInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      1    PreviewQuality                       int32u
+      2    PreviewImageLength                   int32u*
+      3    PreviewImageWidth                    int32u
+      4    PreviewImageHeight                   int32u
+      5    PreviewImageStart                    int32u*
+
+=head3 Canon SensorInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      1    SensorWidth                          N
+      2    SensorHeight                         N
+      5    SensorLeftBorder                     N
+      6    SensorTopBorder                      N
+      7    SensorRightBorder                    N
+      8    SensorBottomBorder                   N
+      9    BlackMaskLeftBorder                  N
+     10    BlackMaskTopBorder                   N
+     11    BlackMaskRightBorder                 N
+     12    BlackMaskBottomBorder                N
+
+=head3 Canon ColorData1 Tags
+
+These tags are used by the 20D and 350D.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+     25    WB_RGGBLevelsAsShot                  int16s[4]
+     29    ColorTempAsShot                      int16s
+     30    WB_RGGBLevelsAuto                    int16s[4]
+     34    ColorTempAuto                        int16s
+     35    WB_RGGBLevelsDaylight                int16s[4]
+     39    ColorTempDaylight                    int16s
+     40    WB_RGGBLevelsShade                   int16s[4]
+     44    ColorTempShade                       int16s
+     45    WB_RGGBLevelsCloudy                  int16s[4]
+     49    ColorTempCloudy                      int16s
+     50    WB_RGGBLevelsTungsten                int16s[4]
+     54    ColorTempTungsten                    int16s
+     55    WB_RGGBLevelsFluorescent             int16s[4]
+     59    ColorTempFluorescent                 int16s
+     60    WB_RGGBLevelsFlash                   int16s[4]
+     64    ColorTempFlash                       int16s
+     65    WB_RGGBLevelsCustom1                 int16s[4]
+     69    ColorTempCustom1                     int16s
+     70    WB_RGGBLevelsCustom2                 int16s[4]
+     74    ColorTempCustom2                     int16s
+     75    ColorCalib?                          Canon ColorCalib
+
+=head3 Canon ColorCalib Tags
+
+Camera color calibration data.  For the 20D, 350D, 1DmkII and 1DSmkII the
+order of the cooefficients is A, B, C, Temperature, but for newer models it
+is B, C, A, Temperature.  These tags are extracted only when the Unknown
+option is used.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    CameraColorCalibration01?            int16s[4]
+      4    CameraColorCalibration02?            int16s[4]
+      8    CameraColorCalibration03?            int16s[4]
+     12    CameraColorCalibration04?            int16s[4]
+     16    CameraColorCalibration05?            int16s[4]
+     20    CameraColorCalibration06?            int16s[4]
+     24    CameraColorCalibration07?            int16s[4]
+     28    CameraColorCalibration08?            int16s[4]
+     32    CameraColorCalibration09?            int16s[4]
+     36    CameraColorCalibration10?            int16s[4]
+     40    CameraColorCalibration11?            int16s[4]
+     44    CameraColorCalibration12?            int16s[4]
+     48    CameraColorCalibration13?            int16s[4]
+     52    CameraColorCalibration14?            int16s[4]
+     56    CameraColorCalibration15?            int16s[4]
+
+=head3 Canon ColorData2 Tags
+
+These tags are used by the 1DmkII and 1DSmkII.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+     24    WB_RGGBLevelsAuto                    int16s[4]
+     28    ColorTempAuto                        int16s
+     29    WB_RGGBLevelsUnknown?                int16s[4]
+     33    ColorTempUnknown?                    int16s
+     34    WB_RGGBLevelsAsShot                  int16s[4]
+     38    ColorTempAsShot                      int16s
+     39    WB_RGGBLevelsDaylight                int16s[4]
+     43    ColorTempDaylight                    int16s
+     44    WB_RGGBLevelsShade                   int16s[4]
+     48    ColorTempShade                       int16s
+     49    WB_RGGBLevelsCloudy                  int16s[4]
+     53    ColorTempCloudy                      int16s
+     54    WB_RGGBLevelsTungsten                int16s[4]
+     58    ColorTempTungsten                    int16s
+     59    WB_RGGBLevelsFluorescent             int16s[4]
+     63    ColorTempFluorescent                 int16s
+     64    WB_RGGBLevelsKelvin                  int16s[4]
+     68    ColorTempKelvin                      int16s
+     69    WB_RGGBLevelsFlash                   int16s[4]
+     73    ColorTempFlash                       int16s
+     74    WB_RGGBLevelsUnknown2?               int16s[4]
+     78    ColorTempUnknown2?                   int16s
+     79    WB_RGGBLevelsUnknown3?               int16s[4]
+     83    ColorTempUnknown3?                   int16s
+     84    WB_RGGBLevelsUnknown4?               int16s[4]
+     88    ColorTempUnknown4?                   int16s
+     89    WB_RGGBLevelsUnknown5?               int16s[4]
+     93    ColorTempUnknown5?                   int16s
+     94    WB_RGGBLevelsUnknown6?               int16s[4]
+     98    ColorTempUnknown6?                   int16s
+     99    WB_RGGBLevelsUnknown7?               int16s[4]
+    103    ColorTempUnknown7?                   int16s
+    104    WB_RGGBLevelsUnknown8?               int16s[4]
+    108    ColorTempUnknown8?                   int16s
+    109    WB_RGGBLevelsUnknown9?               int16s[4]
+    113    ColorTempUnknown9?                   int16s
+    114    WB_RGGBLevelsUnknown10?              int16s[4]
+    118    ColorTempUnknown10?                  int16s
+    119    WB_RGGBLevelsUnknown11?              int16s[4]
+    123    ColorTempUnknown11?                  int16s
+    124    WB_RGGBLevelsUnknown12?              int16s[4]
+    128    ColorTempUnknown12?                  int16s
+    129    WB_RGGBLevelsUnknown13?              int16s[4]
+    133    ColorTempUnknown13?                  int16s
+    134    WB_RGGBLevelsUnknown14?              int16s[4]
+    138    ColorTempUnknown14?                  int16s
+    139    WB_RGGBLevelsUnknown15?              int16s[4]
+    143    ColorTempUnknown15?                  int16s
+    144    WB_RGGBLevelsPC1                     int16s[4]
+    148    ColorTempPC1                         int16s
+    149    WB_RGGBLevelsPC2                     int16s[4]
+    153    ColorTempPC2                         int16s
+    154    WB_RGGBLevelsPC3                     int16s[4]
+    158    ColorTempPC3                         int16s
+    159    WB_RGGBLevelsUnknown16?              int16s[4]
+    163    ColorTempUnknown16?                  int16s
+    164    ColorCalib?                          Canon ColorCalib
+    618    RawMeasuredRGGB                      int32u[4]
+
+=head3 Canon ColorData3 Tags
+
+These tags are used by the 1DmkIIN, 5D, 30D and 400D.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ColorDataVersion                     int16s
+     63    WB_RGGBLevelsAsShot                  int16s[4]
+     67    ColorTempAsShot                      int16s
+     68    WB_RGGBLevelsAuto                    int16s[4]
+     72    ColorTempAuto                        int16s
+     73    WB_RGGBLevelsMeasured                int16s[4]
+     77    ColorTempMeasured                    int16s
+     78    WB_RGGBLevelsDaylight                int16s[4]
+     82    ColorTempDaylight                    int16s
+     83    WB_RGGBLevelsShade                   int16s[4]
+     87    ColorTempShade                       int16s
+     88    WB_RGGBLevelsCloudy                  int16s[4]
+     92    ColorTempCloudy                      int16s
+     93    WB_RGGBLevelsTungsten                int16s[4]
+     97    ColorTempTungsten                    int16s
+     98    WB_RGGBLevelsFluorescent             int16s[4]
+    102    ColorTempFluorescent                 int16s
+    103    WB_RGGBLevelsKelvin                  int16s[4]
+    107    ColorTempKelvin                      int16s
+    108    WB_RGGBLevelsFlash                   int16s[4]
+    112    ColorTempFlash                       int16s
+    113    WB_RGGBLevelsPC1                     int16s[4]
+    117    ColorTempPC1                         int16s
+    118    WB_RGGBLevelsPC2                     int16s[4]
+    122    ColorTempPC2                         int16s
+    123    WB_RGGBLevelsPC3                     int16s[4]
+    127    ColorTempPC3                         int16s
+    128    WB_RGGBLevelsCustom                  int16s[4]
+    132    ColorTempCustom                      int16s
+    133    ColorCalib?                          Canon ColorCalib
+    584    FlashOutput                          int16s
+    585    FlashBatteryLevel                    int16s
+    586    ColorTempFlashData                   int16s
+    647    MeasuredRGGBData                     int32u[4]
+
+=head3 Canon ColorData4 Tags
+
+These tags are used by the 1DmkIII, 1DSmkIII, 1DmkIV, 5DmkII, 7D, 40D, 50D,
+450D, 500D, 550D, 1000D and 1100D.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ColorDataVersion                     int16s
+     63    ColorCoefs                           Canon ColorCoefs
+    168    ColorCalib?                          Canon ColorCalib
+    640    RawMeasuredRGGB                      int32u[4]
+
+=head3 Canon ColorCoefs Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    WB_RGGBLevelsAsShot                  int16s[4]
+      4    ColorTempAsShot                      int16s
+      5    WB_RGGBLevelsAuto                    int16s[4]
+      9    ColorTempAuto                        int16s
+     10    WB_RGGBLevelsMeasured                int16s[4]
+     14    ColorTempMeasured                    int16s
+     15    WB_RGGBLevelsUnknown?                int16s[4]
+     19    ColorTempUnknown?                    int16s
+     20    WB_RGGBLevelsDaylight                int16s[4]
+     24    ColorTempDaylight                    int16s
+     25    WB_RGGBLevelsShade                   int16s[4]
+     29    ColorTempShade                       int16s
+     30    WB_RGGBLevelsCloudy                  int16s[4]
+     34    ColorTempCloudy                      int16s
+     35    WB_RGGBLevelsTungsten                int16s[4]
+     39    ColorTempTungsten                    int16s
+     40    WB_RGGBLevelsFluorescent             int16s[4]
+     44    ColorTempFluorescent                 int16s
+     45    WB_RGGBLevelsKelvin                  int16s[4]
+     49    ColorTempKelvin                      int16s
+     50    WB_RGGBLevelsFlash                   int16s[4]
+     54    ColorTempFlash                       int16s
+     55    WB_RGGBLevelsUnknown2?               int16s[4]
+     59    ColorTempUnknown2?                   int16s
+     60    WB_RGGBLevelsUnknown3?               int16s[4]
+     64    ColorTempUnknown3?                   int16s
+     65    WB_RGGBLevelsUnknown4?               int16s[4]
+     69    ColorTempUnknown4?                   int16s
+     70    WB_RGGBLevelsUnknown5?               int16s[4]
+     74    ColorTempUnknown5?                   int16s
+     75    WB_RGGBLevelsUnknown6?               int16s[4]
+     79    ColorTempUnknown6?                   int16s
+     80    WB_RGGBLevelsUnknown7?               int16s[4]
+     84    ColorTempUnknown7?                   int16s
+     85    WB_RGGBLevelsUnknown8?               int16s[4]
+     89    ColorTempUnknown8?                   int16s
+     90    WB_RGGBLevelsUnknown9?               int16s[4]
+     94    ColorTempUnknown9?                   int16s
+     95    WB_RGGBLevelsUnknown10?              int16s[4]
+     99    ColorTempUnknown10?                  int16s
+    100    WB_RGGBLevelsUnknown11?              int16s[4]
+    104    ColorTempUnknown11?                  int16s
+    105    WB_RGGBLevelsUnknown12?              int16s[4]
+    109    ColorTempUnknown12?                  int16s
+    110    WB_RGGBLevelsUnknown13?              int16s[4]
+    114    ColorTempUnknown13?                  int16s
+
+=head3 Canon ColorData5 Tags
+
+These tags are used by the PowerShot G10.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+     71    ColorCoefs                           Canon ColorCoefs
+    186    CameraColorCalibration01?            int16s[5]
+    191    CameraColorCalibration02?            int16s[5]
+    196    CameraColorCalibration03?            int16s[5]
+    201    CameraColorCalibration04?            int16s[5]
+    206    CameraColorCalibration05?            int16s[5]
+    211    CameraColorCalibration06?            int16s[5]
+    216    CameraColorCalibration07?            int16s[5]
+    221    CameraColorCalibration08?            int16s[5]
+    226    CameraColorCalibration09?            int16s[5]
+    231    CameraColorCalibration10?            int16s[5]
+    236    CameraColorCalibration11?            int16s[5]
+    241    CameraColorCalibration12?            int16s[5]
+    246    CameraColorCalibration13?            int16s[5]
+    251    CameraColorCalibration14?            int16s[5]
+    256    CameraColorCalibration15?            int16s[5]
+
+=head3 Canon ColorData6 Tags
+
+These tags are used by the EOS 600D.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ColorDataVersion                     int16s
+     63    WB_RGGBLevelsAsShot                  int16s[4]
+     67    ColorTempAsShot                      int16s
+     68    WB_RGGBLevelsAuto                    int16s[4]
+     72    ColorTempAuto                        int16s
+     73    WB_RGGBLevelsMeasured                int16s[4]
+     77    ColorTempMeasured                    int16s
+     78    WB_RGGBLevelsUnknown?                int16s[4]
+     82    ColorTempUnknown?                    int16s
+     83    WB_RGGBLevelsUnknown2?               int16s[4]
+     87    ColorTempUnknown2?                   int16s
+     88    WB_RGGBLevelsUnknown3?               int16s[4]
+     92    ColorTempUnknown3?                   int16s
+     93    WB_RGGBLevelsUnknown4?               int16s[4]
+     97    ColorTempUnknown4?                   int16s
+     98    WB_RGGBLevelsUnknown5?               int16s[4]
+    102    ColorTempUnknown5?                   int16s
+    103    WB_RGGBLevelsDaylight                int16s[4]
+    107    ColorTempDaylight                    int16s
+    108    WB_RGGBLevelsShade                   int16s[4]
+    112    ColorTempShade                       int16s
+    113    WB_RGGBLevelsCloudy                  int16s[4]
+    117    ColorTempCloudy                      int16s
+    118    WB_RGGBLevelsTungsten                int16s[4]
+    122    ColorTempTungsten                    int16s
+    123    WB_RGGBLevelsFluorescent             int16s[4]
+    127    ColorTempFluorescent                 int16s
+    128    WB_RGGBLevelsKelvin                  int16s[4]
+    132    ColorTempKelvin                      int16s
+    133    WB_RGGBLevelsFlash                   int16s[4]
+    137    ColorTempFlash                       int16s
+    138    WB_RGGBLevelsUnknown6?               int16s[4]
+    142    ColorTempUnknown6?                   int16s
+    143    WB_RGGBLevelsUnknown7?               int16s[4]
+    147    ColorTempUnknown7?                   int16s
+    148    WB_RGGBLevelsUnknown8?               int16s[4]
+    152    ColorTempUnknown8?                   int16s
+    153    WB_RGGBLevelsUnknown9?               int16s[4]
+    157    ColorTempUnknown9?                   int16s
+    158    WB_RGGBLevelsUnknown10?              int16s[4]
+    162    ColorTempUnknown10?                  int16s
+    163    WB_RGGBLevelsUnknown11?              int16s[4]
+    167    ColorTempUnknown11?                  int16s
+    168    WB_RGGBLevelsUnknown12?              int16s[4]
+    172    ColorTempUnknown12?                  int16s
+    173    WB_RGGBLevelsUnknown13?              int16s[4]
+    177    ColorTempUnknown13?                  int16s
+    178    WB_RGGBLevelsUnknown14?              int16s[4]
+    182    ColorTempUnknown14?                  int16s
+    183    WB_RGGBLevelsUnknown15?              int16s[4]
+    187    ColorTempUnknown15?                  int16s
+    188    ColorCalib?                          Canon ColorCalib
+    404    RawMeasuredRGGB                      int32u[4]
+
+=head3 Canon ColorDataUnknown Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+  [no tags known]
+
+=head3 Canon ColorInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      1    Saturation                           int16s
+      2    ColorTone                            int16s
+      3    ColorSpace                           int16s
+
+=head3 Canon AFMicroAdj Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      1    AFMicroAdjActive                     int32s
+      2    AFMicroAdjValue                      rational64s
+
+=head3 Canon VignettingCorr Tags
+
+This information is found in images from the 1DmkIV, 5DmkII, 7D, 50D, 500D
+and 550D.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      2    PeripheralLighting                   int16s
+      6    PeripheralLightingValue              int16s
+     11    OriginalImageWidth                   int16s
+     12    OriginalImageHeight                  int16s
+
+=head3 Canon VignettingCorr2 Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      5    PeripheralLightingSetting            int32s
+
+=head3 Canon LightingOpt Tags
+
+This information is new in images from the EOS 7D.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      2    AutoLightingOptimizer                int32s
+
+=head3 Canon LensInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    LensSerialNumber                     undef[5]
+
+=head3 Canon Ambience Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      1    AmbienceSelection                    int32s
+
+=head3 Canon FilterInfo Tags
+
+Information about creative filter settings.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0101   GrainyBWFilter                       N
+  0x0201   SoftFocusFilter                      N
+  0x0301   ToyCameraFilter                      N
+  0x0401   MiniatureFilter                      N
+  0x0402   MiniatureFilterOrientation           N
+  0x0403   MiniatureFilterPosition              N
+
+=head3 Canon CNTH Tags
+
+Canon-specific QuickTime tags found in the CNTH atom of MOV videos from some
+cameras such as the PowerShot S95.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'CNDA'   ThumbnailImage                       N
+
+=head2 CanonCustom Tags
+
+=head3 CanonCustom Functions1D Tags
+
+These custom functions are used by all 1D models up to but not including the
+Mark III.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+      0    FocusingScreen                       int8u
+      1    FinderDisplayDuringExposure          int8u
+      2    ShutterReleaseNoCFCard               int8u
+      3    ISOSpeedExpansion                    int8u
+      4    ShutterAELButton                     int8u
+      5    ManualTv                             int8u
+      6    ExposureLevelIncrements              int8u
+      7    USMLensElectronicMF                  int8u
+      8    LCDPanels                            int8u
+      9    AEBSequenceAutoCancel                int8u
+     10    AFPointIllumination                  int8u
+     11    AFPointSelection                     int8u
+     12    MirrorLockup                         int8u
+     13    AFPointSpotMetering                  int8u
+     14    FillFlashAutoReduction               int8u
+     15    ShutterCurtainSync                   int8u
+     16    SafetyShiftInAvOrTv                  int8u
+     17    AFPointActivationArea                int8u
+     18    SwitchToRegisteredAFPoint            int8u
+     19    LensAFStopButton                     int8u
+     20    AIServoTrackingSensitivity           int8u
+     21    AIServoContinuousShooting            int8u
+
+=head3 CanonCustom Functions5D Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+      0    FocusingScreen                       int8u
+      1    SetFunctionWhenShooting              int8u
+      2    LongExposureNoiseReduction           int8u
+      3    FlashSyncSpeedAv                     int8u
+      4    Shutter-AELock                       int8u
+      5    AFAssistBeam                         int8u
+      6    ExposureLevelIncrements              int8u
+      7    FlashFiring                          int8u
+      8    ISOExpansion                         int8u
+      9    AEBSequenceAutoCancel                int8u
+     10    SuperimposedDisplay                  int8u
+     11    MenuButtonDisplayPosition            int8u
+     12    MirrorLockup                         int8u
+     13    AFPointSelectionMethod               int8u
+     14    ETTLII                               int8u
+     15    ShutterCurtainSync                   int8u
+     16    SafetyShiftInAvOrTv                  int8u
+     17    AFPointActivationArea                int8u
+     18    LCDDisplayReturnToShoot              int8u
+     19    LensAFStopButton                     int8u
+     20    AddOriginalDecisionData              int8u
+
+=head3 CanonCustom Functions10D Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+      1    SetButtonWhenShooting                int8u
+      2    ShutterReleaseNoCFCard               int8u
+      3    FlashSyncSpeedAv                     int8u
+      4    Shutter-AELock                       int8u
+      5    AFAssist                             int8u
+      6    ExposureLevelIncrements              int8u
+      7    AFPointRegistration                  int8u
+      8    RawAndJpgRecording                   int8u
+      9    AEBSequenceAutoCancel                int8u
+     10    SuperimposedDisplay                  int8u
+     11    MenuButtonDisplayPosition            int8u
+     12    MirrorLockup                         int8u
+     13    AssistButtonFunction                 int8u
+     14    FillFlashAutoReduction               int8u
+     15    ShutterCurtainSync                   int8u
+     16    SafetyShiftInAvOrTv                  int8u
+     17    LensAFStopButton                     int8u
+
+=head3 CanonCustom Functions20D Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+      0    SetFunctionWhenShooting              int8u
+      1    LongExposureNoiseReduction           int8u
+      2    FlashSyncSpeedAv                     int8u
+      3    Shutter-AELock                       int8u
+      4    AFAssistBeam                         int8u
+      5    ExposureLevelIncrements              int8u
+      6    FlashFiring                          int8u
+      7    ISOExpansion                         int8u
+      8    AEBSequenceAutoCancel                int8u
+      9    SuperimposedDisplay                  int8u
+     10    MenuButtonDisplayPosition            int8u
+     11    MirrorLockup                         int8u
+     12    AFPointSelectionMethod               int8u
+     13    ETTLII                               int8u
+     14    ShutterCurtainSync                   int8u
+     15    SafetyShiftInAvOrTv                  int8u
+     16    LensAFStopButton                     int8u
+     17    AddOriginalDecisionData              int8u
+
+=head3 CanonCustom Functions30D Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+      1    SetFunctionWhenShooting              int8u
+      2    LongExposureNoiseReduction           int8u
+      3    FlashSyncSpeedAv                     int8u
+      4    Shutter-AELock                       int8u
+      5    AFAssistBeam                         int8u
+      6    ExposureLevelIncrements              int8u
+      7    FlashFiring                          int8u
+      8    ISOExpansion                         int8u
+      9    AEBSequenceAutoCancel                int8u
+     10    SuperimposedDisplay                  int8u
+     11    MenuButtonDisplayPosition            int8u
+     12    MirrorLockup                         int8u
+     13    AFPointSelectionMethod               int8u
+     14    ETTLII                               int8u
+     15    ShutterCurtainSync                   int8u
+     16    SafetyShiftInAvOrTv                  int8u
+     17    MagnifiedView                        int8u
+     18    LensAFStopButton                     int8u
+     19    AddOriginalDecisionData              int8u
+
+=head3 CanonCustom Functions350D Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+      0    SetButtonCrossKeysFunc               int8u
+      1    LongExposureNoiseReduction           int8u
+      2    FlashSyncSpeedAv                     int8u
+      3    Shutter-AELock                       int8u
+      4    AFAssistBeam                         int8u
+      5    ExposureLevelIncrements              int8u
+      6    MirrorLockup                         int8u
+      7    ETTLII                               int8u
+      8    ShutterCurtainSync                   int8u
+
+=head3 CanonCustom Functions400D Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+      0    SetButtonCrossKeysFunc               int8u
+      1    LongExposureNoiseReduction           int8u
+      2    FlashSyncSpeedAv                     int8u
+      3    Shutter-AELock                       int8u
+      4    AFAssistBeam                         int8u
+      5    ExposureLevelIncrements              int8u
+      6    MirrorLockup                         int8u
+      7    ETTLII                               int8u
+      8    ShutterCurtainSync                   int8u
+      9    MagnifiedView                        int8u
+     10    LCDDisplayAtPowerOn                  int8u
+
+=head3 CanonCustom FunctionsD30 Tags
+
+Custom functions for the EOS D30 and D60.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+      1    LongExposureNoiseReduction           int8u
+      2    Shutter-AELock                       int8u
+      3    MirrorLockup                         int8u
+      4    ExposureLevelIncrements              int8u
+      5    AFAssist                             int8u
+      6    FlashSyncSpeedAv                     int8u
+      7    AEBSequenceAutoCancel                int8u
+      8    ShutterCurtainSync                   int8u
+      9    LensAFStopButton                     int8u
+     10    FillFlashAutoReduction               int8u
+     11    MenuButtonReturn                     int8u
+     12    SetButtonWhenShooting                int8u
+     13    SensorCleaning                       int8u
+     14    SuperimposedDisplay                  int8u
+     15    ShutterReleaseNoCFCard               int8u
+
+=head3 CanonCustom FuncsUnknown Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  [no tags known]
+
+=head3 CanonCustom PersonalFuncs Tags
+
+Personal function settings for the EOS-1D.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      1    PF0CustomFuncRegistration            int16u
+      2    PF1DisableShootingModes              int16u
+      3    PF2DisableMeteringModes              int16u
+      4    PF3ManualExposureMetering            int16u
+      5    PF4ExposureTimeLimits                int16u
+      6    PF5ApertureLimits                    int16u
+      7    PF6PresetShootingModes               int16u
+      8    PF7BracketContinuousShoot            int16u
+      9    PF8SetBracketShots                   int16u
+     10    PF9ChangeBracketSequence             int16u
+     11    PF10RetainProgramShift               int16u
+     14    PF13DrivePriority                    int16u
+     15    PF14DisableFocusSearch               int16u
+     16    PF15DisableAFAssistBeam              int16u
+     17    PF16AutoFocusPointShoot              int16u
+     18    PF17DisableAFPointSel                int16u
+     19    PF18EnableAutoAFPointSel             int16u
+     20    PF19ContinuousShootSpeed             int16u
+     21    PF20LimitContinousShots              int16u
+     22    PF21EnableQuietOperation             int16u
+     24    PF23SetTimerLengths                  int16u
+     25    PF24LightLCDDuringBulb               int16u
+     26    PF25DefaultClearSettings             int16u
+     27    PF26ShortenReleaseLag                int16u
+     28    PF27ReverseDialRotation              int16u
+     29    PF28NoQuickDialExpComp               int16u
+     30    PF29QuickDialSwitchOff               int16u
+     31    PF30EnlargementMode                  int16u
+     32    PF31OriginalDecisionData             int16u
+
+=head3 CanonCustom PersonalFuncValues Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      1    PF1Value                             int16u
+      2    PF2Value                             int16u
+      3    PF3Value                             int16u
+      4    PF4ExposureTimeMin                   int16u
+      5    PF4ExposureTimeMax                   int16u
+      6    PF5ApertureMin                       int16u
+      7    PF5ApertureMax                       int16u
+      8    PF8BracketShots                      int16u
+      9    PF19ShootingSpeedLow                 int16u
+     10    PF19ShootingSpeedHigh                int16u
+     11    PF20MaxContinousShots                int16u
+     12    PF23ShutterButtonTime                int16u
+     13    PF23FELockTime                       int16u
+     14    PF23PostReleaseTime                  int16u
+     15    PF25AEMode                           int16u
+     16    PF25MeteringMode                     int16u
+     17    PF25DriveMode                        int16u
+     18    PF25AFMode                           int16u
+     19    PF25AFPointSel                       int16u
+     20    PF25ImageSize                        int16u
+     21    PF25WBMode                           int16u
+     22    PF25Parameters                       int16u
+     23    PF25ColorMatrix                      int16u
+     24    PF27Value                            int16u
+
+=head3 CanonCustom Functions2 Tags
+
+Beginning with the EOS 1D Mark III, Canon finally created a set of custom
+function tags which are (reasonably) consistent across models.  The EOS 1D
+Mark III has 57 custom function tags divided into four main groups: 1.
+Exposure (0x0101-0x010f), 2. Image (0x0201-0x0203), Flash Exposure
+(0x0304-0x0306) and Display (0x0407-0x0409), 3. Auto Focus (0x0501-0x050e)
+and Drive (0x060f-0x0611), and 4. Operation (0x0701-0x070a) and Others
+(0x080b-0x0810).  The table below lists tags used by the EOS 1D Mark III, as
+well as newer tags and values added by later models.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0101   ExposureLevelIncrements              int32s
+  0x0102   ISOSpeedIncrements                   int32s
+  0x0103   ISOSpeedRange                        int32s[3]
+           ISOExpansion                         int32s
+  0x0104   AEBAutoCancel                        int32s
+  0x0105   AEBSequence                          int32s
+  0x0106   AEBShotCount                         int32s[n]
+  0x0107   SpotMeterLinkToAFPoint               int32s
+  0x0108   SafetyShift                          int32s
+  0x0109   UsableShootingModes                  int32s[2]
+  0x010a   UsableMeteringModes                  int32s[2]
+  0x010b   ExposureModeInManual                 int32s
+  0x010c   ShutterSpeedRange                    int32s[3]
+  0x010d   ApertureRange                        int32s[3]
+  0x010e   ApplyShootingMeteringMode            int32s[8]
+  0x010f   FlashSyncSpeedAv                     int32s
+  0x0110   FEMicroadjustment                    int32s[3]
+  0x0111   AEMicroadjustment                    int32s[3]
+  0x0201   LongExposureNoiseReduction           int32s
+  0x0202   HighISONoiseReduction                int32s
+  0x0203   HighlightTonePriority                int32s
+  0x0204   AutoLightingOptimizer                int32s
+  0x0304   ETTLII                               int32s
+  0x0305   ShutterCurtainSync                   int32s
+  0x0306   FlashFiring                          int32s
+  0x0407   ViewInfoDuringExposure               int32s
+  0x0408   LCDIlluminationDuringBulb            int32s
+  0x0409   InfoButtonWhenShooting               int32s
+  0x0501   USMLensElectronicMF                  int32s
+  0x0502   AIServoTrackingSensitivity           int32s
+  0x0503   AIServoImagePriority                 int32s
+  0x0504   AIServoTrackingMethod                int32s
+  0x0505   LensDriveNoAF                        int32s
+  0x0506   LensAFStopButton                     int32s
+  0x0507   AFMicroadjustment                    int32s[5]
+  0x0508   AFPointAreaExpansion                 int32s
+  0x0509   SelectableAFPoint                    int32s
+  0x050a   SwitchToRegisteredAFPoint            int32s
+  0x050b   AFPointAutoSelection                 int32s
+  0x050c   AFPointDisplayDuringFocus            int32s
+  0x050d   AFPointBrightness                    int32s
+  0x050e   AFAssistBeam                         int32s
+  0x050f   AFPointSelectionMethod               int32s
+  0x0510   VFDisplayIllumination                int32s
+           SuperimposedDisplay                  int32s
+  0x0511   AFDuringLiveView                     int32s
+  0x0512   SelectAFAreaSelectMode               int32s
+  0x0513   ManualAFPointSelectPattern           int32s
+  0x0514   DisplayAllAFPoints                   int32s
+  0x0515   FocusDisplayAIServoAndMF             int32s
+  0x0516   OrientationLinkedAFPoint             int32s
+  0x0517   MultiControllerWhileMetering         int32s
+  0x060f   MirrorLockup                         int32s
+  0x0610   ContinuousShootingSpeed              int32s[3]
+  0x0611   ContinuousShotLimit                  int32s[2]
+  0x0701   Shutter-AELock                       int32s
+           AFAndMeteringButtons                 int32s
+           ShutterButtonAFOnButton              int32s
+  0x0702   AFOnAELockButtonSwitch               int32s
+  0x0703   QuickControlDialInMeter              int32s
+  0x0704   SetButtonWhenShooting                int32s
+  0x0705   ManualTv                             int32s
+  0x0706   DialDirectionTvAv                    int32s
+  0x0707   AvSettingWithoutLens                 int32s
+  0x0708   WBMediaImageSizeSetting              int32s
+  0x0709   LockMicrophoneButton                 int32s
+  0x070a   ButtonFunctionControlOff             int32s
+  0x070b   AssignFuncButton                     int32s
+  0x070c   CustomControls                       int32s
+  0x070d   StartMovieShooting                   int32s
+  0x080b   FocusingScreen                       int32s
+  0x080c   TimerLength                          int32s[4]
+  0x080d   ShortReleaseTimeLag                  int32s
+  0x080e   AddAspectRatioInfo                   int32s
+  0x080f   AddOriginalDecisionData              int32s
+  0x0810   LiveViewExposureSimulation           int32s
+  0x0811   LCDDisplayAtPowerOn                  int32s
+
+=head2 CanonVRD Tags
+
+Canon Digital Photo Professional writes VRD (Recipe Data) information as a
+trailer record to JPEG, TIFF, CRW and CR2 images, or as a stand-alone VRD
+file.  The tags listed below represent information found in this record.
+The complete VRD data record may be accessed as a block using the Extra
+'CanonVRD' tag, but this tag is not extracted or copied unless specified
+explicitly.
+
+  Tag ID       Tag Name                         Writable
+  ------       --------                         --------
+  0xffff00f4   EditData                         CanonVRD Edit
+  0xffff00f5   IHLData                          CanonVRD IHL
+  0xffff00f6   XMP                              XMP
+
+=head3 CanonVRD Edit Tags
+
+Canon VRD edit information.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    VRD1                                 CanonVRD Ver1
+      1    VRDStampTool                         CanonVRD StampTool
+      2    VRD2                                 CanonVRD Ver2
+
+=head3 CanonVRD Ver1 Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      2    VRDVersion                           N
+      8    WBAdjRGBLevels                       int16u[3]
+     24    WhiteBalanceAdj                      int16u
+     26    WBAdjColorTemp                       int16u
+     36    WBFineTuneActive                     int16u
+     40    WBFineTuneSaturation                 int16u
+     44    WBFineTuneTone                       int16u
+     46    RawColorAdj                          int16u
+     48    RawCustomSaturation                  int32s
+     52    RawCustomTone                        int32s
+     56    RawBrightnessAdj                     int32s
+     60    ToneCurveProperty                    int16u
+    122    DynamicRangeMin                      int16u
+    124    DynamicRangeMax                      int16u
+    272    ToneCurveActive                      int16u
+    275    ToneCurveMode                        int8u
+    276    BrightnessAdj                        int8s
+    277    ContrastAdj                          int8s
+    278    SaturationAdj                        int16s
+    286    ColorToneAdj                         int32s
+    294    LuminanceCurvePoints                 int16u[21]
+    336    LuminanceCurveLimits                 int16u[4]
+    345    ToneCurveInterpolation               int8u
+    352    RedCurvePoints                       int16u[21]
+    394    RedCurveLimits                       int16u[4]
+    410    GreenCurvePoints                     int16u[21]
+    452    GreenCurveLimits                     int16u[4]
+    468    BlueCurvePoints                      int16u[21]
+    510    BlueCurveLimits                      int16u[4]
+    526    RGBCurvePoints                       int16u[21]
+    568    RGBCurveLimits                       int16u[4]
+    580    CropActive                           int16u
+    582    CropLeft                             int16u
+    584    CropTop                              int16u
+    586    CropWidth                            int16u
+    588    CropHeight                           int16u
+    602    SharpnessAdj                         int16u
+    608    CropAspectRatio                      int16u
+    610    ConstrainedCropWidth                 float
+    614    ConstrainedCropHeight                float
+    618    CheckMark                            int16u
+    622    Rotation                             int16u
+    624    WorkColorSpace                       int16u
+
+=head3 CanonVRD StampTool Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    StampToolCount                       N
+
+=head3 CanonVRD Ver2 Tags
+
+Tags added in DPP version 2.0 and later.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      2    PictureStyle                         int16s
+      3    IsCustomPictureStyle                 int16s
+     13    StandardRawColorTone                 int16s
+     14    StandardRawSaturation                int16s
+     15    StandardRawContrast                  int16s
+     16    StandardRawLinear                    int16s
+     17    StandardRawSharpness                 int16s
+     18    StandardRawHighlightPoint            int16s
+     19    StandardRawShadowPoint               int16s
+     20    StandardOutputHighlightPoint         int16s
+     21    StandardOutputShadowPoint            int16s
+     22    PortraitRawColorTone                 int16s
+     23    PortraitRawSaturation                int16s
+     24    PortraitRawContrast                  int16s
+     25    PortraitRawLinear                    int16s
+     26    PortraitRawSharpness                 int16s
+     27    PortraitRawHighlightPoint            int16s
+     28    PortraitRawShadowPoint               int16s
+     29    PortraitOutputHighlightPoint         int16s
+     30    PortraitOutputShadowPoint            int16s
+     31    LandscapeRawColorTone                int16s
+     32    LandscapeRawSaturation               int16s
+     33    LandscapeRawContrast                 int16s
+     34    LandscapeRawLinear                   int16s
+     35    LandscapeRawSharpness                int16s
+     36    LandscapeRawHighlightPoint           int16s
+     37    LandscapeRawShadowPoint              int16s
+     38    LandscapeOutputHighlightPoint        int16s
+     39    LandscapeOutputShadowPoint           int16s
+     40    NeutralRawColorTone                  int16s
+     41    NeutralRawSaturation                 int16s
+     42    NeutralRawContrast                   int16s
+     43    NeutralRawLinear                     int16s
+     44    NeutralRawSharpness                  int16s
+     45    NeutralRawHighlightPoint             int16s
+     46    NeutralRawShadowPoint                int16s
+     47    NeutralOutputHighlightPoint          int16s
+     48    NeutralOutputShadowPoint             int16s
+     49    FaithfulRawColorTone                 int16s
+     50    FaithfulRawSaturation                int16s
+     51    FaithfulRawContrast                  int16s
+     52    FaithfulRawLinear                    int16s
+     53    FaithfulRawSharpness                 int16s
+     54    FaithfulRawHighlightPoint            int16s
+     55    FaithfulRawShadowPoint               int16s
+     56    FaithfulOutputHighlightPoint         int16s
+     57    FaithfulOutputShadowPoint            int16s
+     58    MonochromeFilterEffect               int16s
+     59    MonochromeToningEffect               int16s
+     60    MonochromeContrast                   int16s
+     61    MonochromeLinear                     int16s
+     62    MonochromeSharpness                  int16s
+     63    MonochromeRawHighlightPoint          int16s
+     64    MonochromeRawShadowPoint             int16s
+     65    MonochromeOutputHighlightPoint       int16s
+     66    MonochromeOutputShadowPoint          int16s
+     69    UnknownContrast?                     int16s
+     70    UnknownLinear?                       int16s
+     71    UnknownSharpness?                    int16s
+     72    UnknownRawHighlightPoint?            int16s
+     73    UnknownRawShadowPoint?               int16s
+     74    UnknownOutputHighlightPoint?         int16s
+     75    UnknownOutputShadowPoint?            int16s
+     78    CustomContrast                       int16s
+     79    CustomLinear                         int16s
+     80    CustomSharpness                      int16s
+     81    CustomRawHighlightPoint              int16s
+     82    CustomRawShadowPoint                 int16s
+     83    CustomOutputHighlightPoint           int16s
+     84    CustomOutputShadowPoint              int16s
+     88    CustomPictureStyleData               N
+     94    ChrominanceNoiseReduction            int16s
+     95    LuminanceNoiseReduction              int16s
+     96    ChrominanceNR_TIFF_JPEG              int16s
+     98    ChromaticAberrationOn                int16s
+     99    DistortionCorrectionOn               int16s
+    100    PeripheralIlluminationOn             int16s
+    101    ColorBlur                            int16s
+    102    ChromaticAberration                  int16s
+    103    DistortionCorrection                 int16s
+    104    PeripheralIllumination               int16s
+    105    AberrationCorrectionDistance         int16s
+    106    ChromaticAberrationRed               int16s
+    107    ChromaticAberrationBlue              int16s
+    109    LuminanceNR_TIFF_JPEG                int16s
+    110    AutoLightingOptimizerOn              int16s
+    111    AutoLightingOptimizer                int16s
+    117    StandardRawHighlight                 int16s
+    118    PortraitRawHighlight                 int16s
+    119    LandscapeRawHighlight                int16s
+    120    NeutralRawHighlight                  int16s
+    121    FaithfulRawHighlight                 int16s
+    122    MonochromeRawHighlight               int16s
+    123    UnknownRawHighlight?                 int16s
+    124    CustomRawHighlight                   int16s
+    126    StandardRawShadow                    int16s
+    127    PortraitRawShadow                    int16s
+    128    LandscapeRawShadow                   int16s
+    129    NeutralRawShadow                     int16s
+    130    FaithfulRawShadow                    int16s
+    131    MonochromeRawShadow                  int16s
+    132    UnknownRawShadow?                    int16s
+    133    CustomRawShadow                      int16s
+    139    AngleAdj                             int32s
+    142    CheckMark2                           int16u
+    144    UnsharpMask                          int16s
+    146    UnsharpMaskStrength                  int16s
+    148    UnsharpMaskFineness                  int16s
+    150    UnsharpMaskThreshold                 int16s
+
+=head3 CanonVRD IHL Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0001   IHL_EXIF                             EXIF
+           IHL_EXIF?                            N
+  0x0003   ThumbnailImage                       N
+  0x0004   PreviewImage                         N
+  0x0005   RawCodecVersion                      N
+  0x0006   CRCDevelParams?                      N
+
+=head2 Casio Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0001   RecordingMode                        int16u
+  0x0002   Quality                              int16u
+  0x0003   FocusMode                            int16u
+  0x0004   FlashMode                            int16u
+  0x0005   FlashIntensity                       int16u
+  0x0006   ObjectDistance                       int32u
+  0x0007   WhiteBalance                         int16u
+  0x000a   DigitalZoom                          int32u
+  0x000b   Sharpness                            int16u
+  0x000c   Contrast                             int16u
+  0x000d   Saturation                           int16u
+  0x0014   ISO                                  int16u
+  0x0015   FirmwareDate                         string[18]
+  0x0016   Enhancement                          int16u
+  0x0017   ColorFilter                          int16u
+  0x0018   AFPoint                              int16u
+  0x0019   FlashIntensity                       int16u
+  0x0e00   PrintIM                              PrintIM
+
+=head3 Casio Type2 Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0002   PreviewImageSize                     int16u[2]
+  0x0003   PreviewImageLength                   int32u*
+  0x0004   PreviewImageStart                    int32u*
+  0x0008   QualityMode                          int16u
+  0x0009   CasioImageSize                       int16u
+  0x000d   FocusMode                            int16u
+  0x0014   ISO                                  int16u
+  0x0019   WhiteBalance                         int16u
+  0x001d   FocalLength                          rational64u
+  0x001f   Saturation                           int16u
+  0x0020   Contrast                             int16u
+  0x0021   Sharpness                            int16u
+  0x0e00   PrintIM                              PrintIM
+  0x2000   PreviewImage                         undef
+  0x2001   FirmwareDate                         string[18]
+  0x2011   WhiteBalanceBias                     int16u[2]
+  0x2012   WhiteBalance                         int16u
+  0x2021   AFPointPosition                      int16u[4]~
+  0x2022   ObjectDistance                       int32u
+  0x2034   FlashDistance                        int16u
+  0x2076   SpecialEffectMode                    int8u[3]
+  0x2089   FaceInfo1                            Casio FaceInfo1
+           FaceInfo2                            Casio FaceInfo2
+           FaceInfoUnknown?                     Y
+  0x211c   FacesDetected                        int8u
+  0x3000   RecordMode                           int16u
+  0x3001   ReleaseMode                          int16u
+  0x3002   Quality                              int16u
+  0x3003   FocusMode                            int16u
+  0x3006   HometownCity                         string
+  0x3007   BestShotMode                         int16u
+  0x3008   AutoISO                              int16u
+  0x3009   AFMode                               int16u
+  0x3011   Sharpness                            undef[2]
+  0x3012   Contrast                             undef[2]
+  0x3013   Saturation                           undef[2]
+  0x3014   ISO                                  int16u
+  0x3015   ColorMode                            int16u
+  0x3016   Enhancement                          int16u
+  0x3017   ColorFilter                          int16u
+  0x301b   UnknownMode?                         int16u
+  0x301c   SequenceNumber                       int16u
+  0x301d   BracketSequence                      int16u[2]
+  0x3020   ImageStabilization                   int16u
+  0x302a   LightingMode                         int16u
+  0x302b   PortraitRefiner                      int16u
+  0x3030   SpecialEffectLevel                   int16u
+  0x3031   SpecialEffectSetting                 int16u
+  0x3103   DriveMode                            int16u
+  0x4001   CaptureFrameRate                     int16u[n]
+  0x4003   VideoQuality                         int16u
+
+=head3 Casio FaceInfo1 Tags
+
+Face-detect tags extracted from models such as the EX-H5.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    FacesDetected                        int8u
+      1    FaceDetectFrameSize                  int16u[2]
+     13    Face1Position                        int16u[4]
+    124    Face2Position                        int16u[4]
+    235    Face3Position                        int16u[4]
+    346    Face4Position                        int16u[4]
+    457    Face5Position                        int16u[4]
+    568    Face6Position                        int16u[4]
+    679    Face7Position                        int16u[4]
+    790    Face8Position                        int16u[4]
+    901    Face9Position                        int16u[4]
+   1012    Face10Position                       int16u[4]
+
+=head3 Casio FaceInfo2 Tags
+
+Face-detect tags extracted from models such as the EX-H20G and EX-ZR100.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      2    FacesDetected                        int8u
+      4    FaceDetectFrameSize                  int16u[2]
+      8    FaceOrientation                      int8u
+     24    Face1Position                        int16u[4]
+     76    Face2Position                        int16u[4]
+    128    Face3Position                        int16u[4]
+    180    Face4Position                        int16u[4]
+    232    Face5Position                        int16u[4]
+    284    Face6Position                        int16u[4]
+    336    Face7Position                        int16u[4]
+    388    Face8Position                        int16u[4]
+    440    Face9Position                        int16u[4]
+    492    Face10Position                       int16u[4]
+
+=head3 Casio QVCI Tags
+
+This information is found in the APP1 QVCI segment of JPEG images from the
+Casio QV-7000SX.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+     44    CasioQuality                         N
+     55    FocalRange?                          N
+     77    DateTimeOriginal                     N
+     98    ModelType                            N
+    114    ManufactureIndex                     N
+    124    ManufactureCode                      N
+
+=head3 Casio AVI Tags
+
+This information is found in Casio GV-10 AVI videos.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    Software                             N
+
+=head2 FujiFilm Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0000   Version                              undef
+  0x0010   InternalSerialNumber                 string
+  0x1000   Quality                              string
+  0x1001   Sharpness                            int16u
+  0x1002   WhiteBalance                         int16u
+  0x1003   Saturation                           int16u
+  0x1004   Contrast                             int16u
+  0x1005   ColorTemperature                     int16u
+  0x1006   Contrast                             int16u
+  0x100a   WhiteBalanceFineTune                 int32s[2]
+  0x100b   NoiseReduction                       int16u
+  0x100e   HighISONoiseReduction                int16u
+  0x1010   FujiFlashMode                        int16u
+  0x1011   FlashExposureComp                    rational64s
+  0x1020   Macro                                int16u
+  0x1021   FocusMode                            int16u
+  0x1023   FocusPixel                           int16u[2]
+  0x1030   SlowSync                             int16u
+  0x1031   PictureMode                          int16u
+  0x1033   EXRAuto                              int16u
+  0x1034   EXRMode                              int16u
+  0x1100   AutoBracketing                       int16u
+  0x1101   SequenceNumber                       int16u
+  0x1210   ColorMode                            int16u
+  0x1300   BlurWarning                          int16u
+  0x1301   FocusWarning                         int16u
+  0x1302   ExposureWarning                      int16u
+  0x1304   GEImageSize                          string
+  0x1400   DynamicRange                         int16u
+  0x1401   FilmMode                             int16u
+  0x1402   DynamicRangeSetting                  int16u
+  0x1403   DevelopmentDynamicRange              int16u
+  0x1404   MinFocalLength                       rational64s
+  0x1405   MaxFocalLength                       rational64s
+  0x1406   MaxApertureAtMinFocal                rational64s
+  0x1407   MaxApertureAtMaxFocal                rational64s
+  0x140b   AutoDynamicRange                     int16u
+  0x4100   FacesDetected                        int16u
+  0x4103   FacePositions                        int16u[n]
+  0x4282   FaceRecInfo                          FujiFilm FaceRecInfo
+  0x8000   FileSource                           string
+  0x8002   OrderNumber                          int32u
+  0x8003   FrameNumber                          int16u
+  0xb211   Parallax                             rational64s
+
+=head3 FujiFilm FaceRecInfo Tags
+
+Face recognition information.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  Face1Birthday                                 N
+  Face1Category                                 N
+  Face1Name                                     N
+  Face2Birthday                                 N
+  Face2Category                                 N
+  Face2Name                                     N
+  Face3Birthday                                 N
+  Face3Category                                 N
+  Face3Name                                     N
+  Face4Birthday                                 N
+  Face4Category                                 N
+  Face4Name                                     N
+  Face5Birthday                                 N
+  Face5Category                                 N
+  Face5Name                                     N
+  Face6Birthday                                 N
+  Face6Category                                 N
+  Face6Name                                     N
+  Face7Birthday                                 N
+  Face7Category                                 N
+  Face7Name                                     N
+  Face8Birthday                                 N
+  Face8Category                                 N
+  Face8Name                                     N
+
+=head3 FujiFilm RAF Tags
+
+FujiFilm RAF images contain meta information stored in a proprietary
+FujiFilm RAF format, as well as EXIF information stored inside an embedded
+JPEG preview image.  The table below lists tags currently decoded from the
+RAF-format information.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0100   RawImageFullSize                     N
+  0x0121   RawImageSize                         N
+  0x0130   FujiLayout                           N
+  0x2ff0   WB_GRGBLevels                        N
+
+=head3 FujiFilm FFMV Tags
+
+Information found in the FFMV atom of MOV videos.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    MovieStreamName                      N
+
+=head2 GE Tags
+
+This table lists tags found in the maker notes of some General Imaging
+camera models.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0202   Macro                                int16u
+  0x0207   GEModel                              string
+  0x0300   GEMake                               string
+
+=head2 HP Tags
+
+These tables list tags found in the maker notes of some Hewlett-Packard
+camera models.
+
+The first table lists tags found in the EXIF-format maker notes of the
+PhotoSmart 720 (also used by the Vivitar ViviCam 3705, 3705B and 3715).
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0e00   PrintIM                              PrintIM
+
+=head3 HP Type2 Tags
+
+These tags are used by the PhotoSmart E427.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'Lens Shading'       LensShading              N
+  'PreviewImage'       PreviewImage             N
+  'Serial Number'      SerialNumber             N
+
+=head3 HP Type4 Tags
+
+These tags are used by the PhotoSmart M627.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+     12    MaxAperture                          N
+     16    ExposureTime                         N
+     20    CameraDateTime                       N
+     52    ISO                                  N
+     92    SerialNumber                         N
+
+=head3 HP Type6 Tags
+
+These tags are used by the PhotoSmart M425, M525 and M527.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+     12    FNumber                              N
+     16    ExposureTime                         N
+     20    CameraDateTime                       N
+     52    ISO                                  N
+     88    SerialNumber                         N
+
+=head3 HP TDHD Tags
+
+These tags are extracted from the APP6 "TDHD" segment of Photosmart R837
+JPEG images.  Many other unknown tags exist in is data, and can be seen with
+the Unknown (-u) option.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'CMSN'   SerialNumber                         N
+  'FWRV'   FirmwareVersion                      N
+  'LSLV'   LSLV                                 HP TDHD
+  'TDHD'   TDHD                                 HP TDHD
+
+=head2 JVC Tags
+
+JVC EXIF maker note tags.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0002   CPUVersions                          N
+  0x0003   Quality                              N
+
+=head3 JVC Text Tags
+
+JVC/Victor text-based maker note tags.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'QTY'    Quality                              N
+  'VER'    MakerNoteVersion                     N
+
+=head2 Kodak Tags
+
+Many Kodak models don't store the maker notes in standard IFD format, and
+these formats vary with different models.  Some information has been
+decoded, but much of the Kodak information remains unknown.
+
+The table below contains the most common set of Kodak tags.  The following
+Kodak camera models have been tested and found to use these tags: C360,
+C663, C875, CX6330, CX6445, CX7330, CX7430, CX7525, CX7530, DC4800, DC4900,
+DX3500, DX3600, DX3900, DX4330, DX4530, DX4900, DX6340, DX6440, DX6490,
+DX7440, DX7590, DX7630, EasyShare-One, LS420, LS443, LS633, LS743, LS753,
+V530, V550, V570, V603, V610, V705, Z650, Z700, Z710, Z730, Z740, Z760 and
+Z7590.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    KodakModel                           string[8]
+      9    Quality                              int8u
+     10    BurstMode                            int8u
+     12    KodakImageWidth                      int16u
+     14    KodakImageHeight                     int16u
+     16    YearCreated                          int16u
+     18    MonthDayCreated                      int8u[2]
+     20    TimeCreated                          int8u[4]
+     24    BurstMode2?                          int16u
+     27    ShutterMode                          int8u
+     28    MeteringMode                         int8u
+     29    SequenceNumber                       int8u
+     30    FNumber                              int16u
+     32    ExposureTime                         int32u
+     36    ExposureCompensation                 int16s
+     38    VariousModes?                        int16u
+     40    Distance1?                           int32u
+     44    Distance2?                           int32u
+     48    Distance3?                           int32u
+     52    Distance4?                           int32u
+     56    FocusMode                            int8u
+     58    VariousModes2?                       int16u
+     60    PanoramaMode?                        int16u
+     62    SubjectDistance?                     int16u
+     64    WhiteBalance                         int8u
+     92    FlashMode                            int8u
+     93    FlashFired                           int8u
+     94    ISOSetting                           int16u
+     96    ISO                                  int16u
+     98    TotalZoom                            int16u
+    100    DateTimeStamp                        int16u
+    102    ColorMode                            int16u
+    104    DigitalZoom                          int16u
+    107    Sharpness                            int8s
+
+=head3 Kodak Type2 Tags
+
+These tags are used by the Kodak DC220, DC260, DC265 and DC290,
+Hewlett-Packard PhotoSmart 618, C500 and C912, Pentax EI-200 and EI-2000,
+and Minolta EX1500Z.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      8    KodakMaker                           string[32]
+     40    KodakModel                           string[32]
+    108    KodakImageWidth                      int32u
+    112    KodakImageHeight                     int32u
+
+=head3 Kodak Type3 Tags
+
+These tags are used by the DC240, DC280, DC3400 and DC5000.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+     12    YearCreated                          int16u
+     14    MonthDayCreated                      int8u[2]
+     16    TimeCreated                          int8u[4]
+     30    OpticalZoom                          int16u
+     55    Sharpness                            int8s
+     56    ExposureTime                         int32u
+     60    FNumber                              int16u
+     78    ISO                                  int16u
+
+=head3 Kodak Type4 Tags
+
+These tags are used by the DC200 and DC215.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+     32    OriginalFileName                     string[12]
+
+=head3 Kodak Type5 Tags
+
+These tags are used by the CX4200, CX4210, CX4230, CX4300, CX4310, CX6200
+and CX6230.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+     20    ExposureTime                         int32u
+     26    WhiteBalance                         int8u
+     28    FNumber                              int16u
+     30    ISO                                  int16u
+     32    OpticalZoom                          int16u
+     34    DigitalZoom                          int16u
+     39    FlashMode                            int8u
+     42    ImageRotated                         int8u
+     43    Macro                                int8u
+
+=head3 Kodak Type6 Tags
+
+These tags are used by the DX3215 and DX3700.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+     16    ExposureTime                         int32u
+     20    ISOSetting?                          int32u
+     24    FNumber                              int16u
+     26    ISO                                  int16u
+     28    OpticalZoom                          int16u
+     30    DigitalZoom                          int16u
+     34    Flash                                int16u
+
+=head3 Kodak Type7 Tags
+
+The maker notes of models such as the C340, C433, CC533, LS755, V803 and
+V1003 seem to start with the camera serial number.  The C310, C315, C330,
+C643, C743, CD33, CD43, CX7220 and CX7300 maker notes are also decoded using
+this table, although the strings for these cameras don't conform to the
+usual Kodak serial number format, and instead have the model name followed
+by 8 digits.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    SerialNumber                         string[16]
+
+=head3 Kodak Type8 Tags
+
+Kodak models such as the ZD710, P712, P850, P880, V1233, V1253, V1275,
+V1285, Z612, Z712, Z812, Z885 use standard TIFF IFD format for the maker
+notes.  In keeping with Kodak's strategy of inconsistent makernotes, models
+such as the M380, M1033, M1093, V1073, V1273, Z1012, Z1085 and Z8612
+also use these tags, but these makernotes begin with a TIFF header instead
+of an IFD entry count and use relative instead of absolute offsets.  There
+is a large amount of information stored in these maker notes (apparently
+with much duplication), but relatively few tags have so far been decoded.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0xfc00   SubIFD0                              Kodak SubIFD0
+                                                Kodak SubIFD0
+  0xfc01   SubIFD1                              Kodak SubIFD1
+                                                Kodak SubIFD1
+  0xfc02   SubIFD2                              Kodak SubIFD2
+                                                Kodak SubIFD2
+  0xfc03   SubIFD3                              Kodak SubIFD3
+                                                Kodak SubIFD3
+  0xfc04   SubIFD4                              Kodak SubIFD4
+                                                Kodak SubIFD4
+  0xfc05   SubIFD5                              Kodak SubIFD5
+                                                Kodak SubIFD5
+  0xfc06   SubIFD6                              Kodak SubIFD6
+                                                Kodak SubIFD6
+  0xfcff   SubIFD255                            Kodak SubIFD0
+  0xff00   CameraInfo                           Kodak CameraInfo
+
+=head3 Kodak SubIFD0 Tags
+
+SubIFD0 through SubIFD5 tags are written a number of newer Kodak models.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0xfa02   SceneMode                            int16u
+  0xfa19   SerialNumber                         string
+  0xfa1d   KodakImageWidth                      int16u
+  0xfa1e   KodakImageHeight                     int16u
+  0xfa20   SensorWidth                          int16u
+  0xfa21   SensorHeight                         int16u
+  0xfa23   FNumber                              int16u
+  0xfa24   ExposureTime                         int32u
+  0xfa2e   ISO                                  int16u
+  0xfa3d   OpticalZoom                          int16u
+  0xfa46   ISO                                  int16u
+  0xfa51   KodakImageWidth                      int16u
+  0xfa52   KodakImageHeight                     int16u
+  0xfa54   ThumbnailWidth                       int16u
+  0xfa55   ThumbnailHeight                      int16u
+  0xfa57   PreviewWidth                         int16u
+  0xfa58   PreviewHeight                        int16u
+
+=head3 Kodak SubIFD1 Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0027   ISO                                  int16u
+  0x0028   ISO                                  int16u
+
+=head3 Kodak SubIFD2 Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x6002   SceneModeUsed                        int32u
+  0x6006   OpticalZoom                          int32u
+  0x6103   MaxAperture                          int32u
+  0xf002   SceneModeUsed                        int32u
+  0xf006   OpticalZoom                          int32u
+  0xf103   FNumber                              int32u
+  0xf104   ExposureTime                         int32u
+  0xf105   ISO                                  int32u
+
+=head3 Kodak SubIFD3 Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x1000   OpticalZoom                          int16u
+
+=head3 Kodak SubIFD4 Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  [no tags known]
+
+=head3 Kodak SubIFD5 Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x000f   OpticalZoom                          int16u
+
+=head3 Kodak SubIFD6 Tags
+
+SubIFD6 is written by the M580.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  [no tags known]
+
+=head3 Kodak CameraInfo Tags
+
+These tags are used by the  P712, P850 and P880.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0xf900   SensorWidth                          int16u
+  0xf901   SensorHeight                         int16u
+  0xf902   BayerPattern                         string
+  0xf903   SensorFullWidth                      int16u
+  0xf904   SensorFullHeight                     int16u
+  0xf907   KodakImageWidth                      int16u
+  0xf908   KodakImageHeight                     int16u
+  0xfa00   KodakInfoType                        string
+  0xfa04   SerialNumber                         string
+  0xfd04   FNumber                              int16u
+  0xfd05   ExposureTime                         int32u
+  0xfd06   ISO                                  int16u
+
+=head3 Kodak Type9 Tags
+
+These tags are used by the Kodak C140, C180, C913, C1013, M320, M340 and
+M550, as well as various cameras marketed by other manufacturers.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+     12    FNumber                              int16u
+     16    ExposureTime                         int32u
+     20    DateTimeOriginal                     string[20]
+     52    ISO                                  int16u
+     87    FirmwareVersion                      string[16]
+    168    SerialNumber                         string[12]
+
+=head3 Kodak Type10 Tags
+
+Another variation of the IFD-format type, this time with just a byte order
+indicator instead of a full TIFF header.  These tags are used by the Z980.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0002   PreviewImageSize                     int16u[2]
+  0x0012   ExposureTime                         int32u
+  0x0013   FNumber                              int16u
+  0x0014   ISO                                  int16u
+  0x001d   FocalLength                          int32u
+
+=head3 Kodak Unknown Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+  [no tags known]
+
+=head3 Kodak IFD Tags
+
+These tags are found in a separate IFD of JPEG, TIFF, DCR and KDC images
+from some older Kodak models such as the DC50, DC120, DCS760C, DCS Pro 14N,
+14nx, SLR/n, Pro Back and Canon EOS D2000.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0001   UnknownEV?                           rational64u
+  0x0003   ExposureValue                        rational64u
+  0x03e9   OriginalFileName                     string
+  0x03eb   SensorLeftBorder                     N
+  0x03ec   SensorTopBorder                      N
+  0x03ed   SensorImageWidth                     N
+  0x03ee   SensorImageHeight                    N
+  0x03f1   TextualInfo                          Kodak TextualInfo
+  0x03fc   WhiteBalance                         int16u
+  0x03fd   Processing                           Kodak Processing
+  0x0401   Time                                 string
+  0x0414   NCDFileInfo                          string
+  0x0846   ColorTemperature                     int16u
+  0x0852   WB_RGBMul0                           N
+  0x0853   WB_RGBMul1                           N
+  0x0854   WB_RGBMul2                           N
+  0x0855   WB_RGBMul3                           N
+  0x085c   WB_RGBCoeffs0                        N
+  0x085d   WB_RGBCoeffs1                        N
+  0x085e   WB_RGBCoeffs2                        N
+  0x085f   WB_RGBCoeffs3                        N
+  0x0ce5   FirmwareVersion                      string
+  0x1391   ToneCurveFileName                    string
+  0x1784   ISO                                  int32u
+
+=head3 Kodak TextualInfo Tags
+
+Below is a list of tags which have been observed in the Kodak TextualInfo
+data, however ExifTool will extract information from any tags found here.
+
+  Tag ID                Tag Name                Writable
+  ------                --------                --------
+  'AF Function'         AFMode                  N
+  'Actual Compensation' ActualCompensation      N
+  'Aperture'            Aperture                N
+  'Auto Bracket'        AutoBracket             N
+  'Brightness Value'    BrightnessValue         N
+  'Camera'              CameraModel             N
+  'Camera body'         CameraBody              N
+  'Compensation'        ExposureCompensation    N
+  'Date'                Date                    N
+  'Exposure Bias'       ExposureBias            N
+  'Exposure Mode'       ExposureMode            N
+  'Firmware Version'    FirmwareVersion         N
+  'Flash Compensation'  FlashExposureComp       N
+  'Flash Fired'         FlashFired              N
+  'Flash Sync Mode'     FlashSyncMode           N
+  'Focal Length'        FocalLength             N
+  'Height'              KodakImageHeight        N
+  'ISO'                 ISO                     N
+  'ISO Speed'           ISO                     N
+  'Image Number'        ImageNumber             N
+  'Max Aperture'        MaxAperture             N
+  'Meter Mode'          MeterMode               N
+  'Min Aperture'        MinAperture             N
+  'Popup Flash'         PopupFlash              N
+  'Serial Number'       SerialNumber            N
+  'Shooting Mode'       ShootingMode            N
+  'Shutter'             ShutterSpeed            N
+  'Temperature'         Temperature             N
+  'Time'                Time                    N
+  'White balance'       WhiteBalance            N
+  'Width'               KodakImageWidth         N
+  '_other_info'         OtherInfo               N
+
+=head3 Kodak Processing Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+     20    WB_RGBLevels                         N
+
+=head3 Kodak Meta Tags
+
+These tags are found in the APP3 "Meta" segment of JPEG images from Kodak
+cameras such as the DC280, DC3400, DC5000, MC3, M580, Z950 and Z981.  The
+structure of this segment is similar to the APP1 "Exif" segment, but a
+different set of tags is used.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0xc350   FilmProductCode                      N
+  0xc351   ImageSourceEK                        N
+  0xc352   CaptureConditionsPAR                 N
+  0xc353   CameraOwner                          undef
+  0xc354   SerialNumber                         undef
+  0xc355   UserSelectGroupTitle                 N
+  0xc356   DealerIDNumber                       N
+  0xc357   CaptureDeviceFID                     N
+  0xc358   EnvelopeNumber                       N
+  0xc359   FrameNumber                          N
+  0xc35a   FilmCategory                         N
+  0xc35b   FilmGencode                          N
+  0xc35c   ModelAndVersion                      N
+  0xc35d   FilmSize                             N
+  0xc35e   SBA_RGBShifts                        N
+  0xc35f   SBAInputImageColorspace              N
+  0xc360   SBAInputImageBitDepth                N
+  0xc361   SBAExposureRecord                    N
+  0xc362   UserAdjSBA_RGBShifts                 N
+  0xc363   ImageRotationStatus                  N
+  0xc364   RollGuidElements                     N
+  0xc365   MetadataNumber                       N
+  0xc366   EditTagArray                         N
+  0xc367   Magnification                        N
+  0xc36c   NativeXResolution                    N
+  0xc36d   NativeYResolution                    N
+  0xc36e   KodakEffectsIFD                      Kodak SpecialEffects
+  0xc36f   KodakBordersIFD                      Kodak Borders
+  0xc37a   NativeResolutionUnit                 N
+  0xc418   SourceImageDirectory                 N
+  0xc419   SourceImageFileName                  N
+  0xc41a   SourceImageVolumeName                N
+  0xc46c   PrintQuality                         N
+  0xc46e   ImagePrintStatus                     N
+
+=head3 Kodak SpecialEffects Tags
+
+The Kodak SpecialEffects and Borders tags are found in sub-IFD's within the
+Kodak JPEG APP3 "Meta" segment.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0000   DigitalEffectsVersion                N
+  0x0001   DigitalEffectsName                   N
+  0x0002   DigitalEffectsType                   N
+
+=head3 Kodak Borders Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0000   BordersVersion                       N
+  0x0001   BorderName                           N
+  0x0002   BorderID                             N
+  0x0003   BorderLocation                       N
+  0x0004   BorderType                           N
+  0x0008   WatermarkType                        N
+
+=head3 Kodak KDC_IFD Tags
+
+These tags are found in a separate IFD of KDC images from some newer Kodak
+models such as the P880 and Z1015IS.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0xfa00   SerialNumber                         string
+  0xfa0d   WhiteBalance                         int8u
+  0xfa25   WB_RGBLevelsAuto                     N
+  0xfa27   WB_RGBLevelsTungsten                 N
+  0xfa28   WB_RGBLevelsFluorescent              N
+  0xfa29   WB_RGBLevelsDaylight                 N
+  0xfa2a   WB_RGBLevelsShade                    N
+
+=head3 Kodak MOV Tags
+
+This information is found in Kodak MOV videos from models such as the P880.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    Make                                 N
+     22    Model                                N
+     64    ModelType                            N
+     78    ExposureTime                         N
+     82    FNumber                              N
+     90    ExposureCompensation                 N
+    112    FocalLength                          N
+
+=head2 Leaf Tags
+
+These tags are found in .MOS images from Leaf digital camera backs as
+written by Creo Leaf Capture.  They exist within the Leaf-specific directory
+structure of EXIF tag 0x8606.  The tables below list observed Leaf tags,
+however ExifTool will extract any tags found in the Leaf directories even if
+they don't appear in these tables.
+
+  Tag ID                          Tag Name      Writable
+  ------                          --------      --------
+  'JPEG_preview_data'             PreviewImage  undef
+  'JPEG_preview_info'             PreviewInfo   N
+  'PDA_histogram_data'            PDAHistogram  N
+  'back_serial_number'            BackSerial    N
+  'camera_profile'                CameraProfile Leaf CameraProfile
+  'icc_camera_profile'            ICC_Profile   ICC_Profile
+  'icc_camera_to_tone_matrix'     ToneMatrix    N
+  'icc_camera_to_tone_space_flow' ToneSpaceFlow N
+  'icc_rgb_ws_profile'            RGB_Profile   ICC_Profile
+  'image_offset'                  ImageOffset   N
+  'pattern_ratation_angle'        PatternAngle  N
+
+=head3 Leaf CameraProfile Tags
+
+All B<Tag ID>'s in the following table have a leading 'CamProf_' which
+has been removed.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'back_type'          CameraBackType           N
+  'capture_profile'    CaptureProfile           Leaf CaptureProfile
+  'image_profile'      ImageProfile             Leaf ImageProfile
+  'name'               CameraName               N
+  'type'               CameraType               N
+  'version'            CameraProfileVersion     N
+
+=head3 Leaf CaptureProfile Tags
+
+All B<Tag ID>'s in the following table have a leading 'CaptProf_' which
+has been removed.
+
+  Tag ID                 Tag Name               Writable
+  ------                 --------               --------
+  'CCD_rect'             CCDRect                N
+  'CCD_valid_rect'       CCDValidRect           N
+  'CCD_video_rect'       CCDVideoRect           N
+  'back_type'            CaptProfBackType       N
+  'center_dark_rect'     CenterDarkRect         N
+  'color_averages'       ColorAverages          N
+  'color_matrix'         ColorMatrix            N
+  'dark_correction_type' DarkCorrectionType     N
+  'image_bounds'         ImageBounds            N
+  'image_fields'         ImageFields            N
+  'image_offset'         ImageOffset            N
+  'left_dark_rect'       LeftDarkRect           N
+  'luminance_consts'     LuminanceConsts        N
+  'mosaic_pattern'       MosaicPattern          N
+  'name'                 CaptProfName           N
+  'number_of_planes'     NumberOfPlanes         N
+  'raw_data_rotation'    RawDataRotation        N
+  'reconstruction_type'  ReconstructionType     N
+  'right_dark_rect'      RightDarkRect          N
+  'serial_number'        CaptureSerial          N
+  'type'                 CaptProfType           N
+  'version'              CaptProfVersion        N
+  'xy_offset_info'       XYOffsetInfo           N
+
+=head3 Leaf ImageProfile Tags
+
+All B<Tag ID>'s in the following table have a leading 'ImgProf_' which
+has been removed.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'back_type'          ImgProfBackType          N
+  'image_status'       ImageStatus              N
+  'name'               ImgProfName              N
+  'rotation_angle'     RotationAngle            N
+  'shoot_setup'        ShootSetup               Leaf ShootSetup
+  'type'               ImgProfType              N
+  'version'            ImgProfVersion           N
+
+=head3 Leaf ShootSetup Tags
+
+All B<Tag ID>'s in the following table have a leading 'ShootObj_' which
+has been removed.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'back_type'          ShootObjBackType         N
+  'camera_setup'       CameraSetup              Leaf CameraSetup
+  'capture_setup'      CaptureSetup             Leaf CaptureSetup
+  'color_setup'        ColorSetup               Leaf ColorSetup
+  'look_header'        LookHeader               Leaf LookHeader
+  'name'               ShootObjName             N
+  'save_setup'         SaveSetup                Leaf SaveSetup
+  'type'               ShootObjType             N
+  'version'            ShootObjVersion          N
+
+=head3 Leaf CameraSetup Tags
+
+All B<Tag ID>'s in the following table have a leading 'CameraObj_' which
+has been removed.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'ISO_speed'          ISOSpeed                 N
+  'back_type'          CameraObjBackType        N
+  'camera_type'        CameraType               N
+  'lens_ID'            LensID                   N
+  'lens_type'          LensType                 N
+  'name'               CameraObjName            N
+  'strobe'             Strobe                   N
+  'type'               CameraObjType            N
+  'version'            CameraObjVersion         N
+
+=head3 Leaf CaptureSetup Tags
+
+All B<Tag ID>'s in the following table have a leading 'CaptureObj_' which
+has been removed.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'Multi_quality'      MultiQuality             N
+  'back_type'          CaptureObjBackType       N
+  'name'               CaptureObjName           N
+  'neutals'            Neutals                  Leaf Neutrals
+  'selection'          Selection                Leaf Selection
+  'sharpness'          Sharpness                Leaf Sharpness
+  'single_quality'     SingleQuality            N
+  'tone_curve'         ToneCurve                Leaf ToneCurve
+  'type'               CaptureObjType           N
+  'version'            CaptureObjVersion        N
+
+=head3 Leaf Neutrals Tags
+
+All B<Tag ID>'s in the following table have a leading 'NeutObj_' which
+has been removed.
+
+  Tag ID                 Tag Name               Writable
+  ------                 --------               --------
+  'back_type'            NeutObjBackType        N
+  'color_casts'          ColorCasts             N
+  'highlight_end_points' HighlightEndPoints     N
+  'name'                 NeutObjName            N
+  'neutrals'             Neutrals               N
+  'shadow_end_points'    ShadowEndPoints        N
+  'type'                 NeutObjType            N
+  'version'              NeutObjVersion         N
+
+=head3 Leaf Selection Tags
+
+All B<Tag ID>'s in the following table have a leading 'SelObj_' which
+has been removed.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'back_type'          SelObjBackType           N
+  'locks'              Locks                    N
+  'name'               SelObjName               N
+  'orientation'        Orientation              N
+  'rect'               Rect                     N
+  'resolution'         Resolution               N
+  'scale'              Scale                    N
+  'type'               SelObjType               N
+  'version'            SelObjVersion            N
+
+=head3 Leaf Sharpness Tags
+
+All B<Tag ID>'s in the following table have a leading 'SharpObj_' which
+has been removed.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'back_type'          SharpObjBackType         N
+  'data_len'           DataLen                  N
+  'name'               SharpObjName             N
+  'sharp_info'         SharpInfo                N
+  'sharp_method'       SharpMethod              N
+  'type'               SharpObjType             N
+  'version'            SharpObjVersion          N
+
+=head3 Leaf ToneCurve Tags
+
+All B<Tag ID>'s in the following table have a leading 'ToneObj_' which
+has been removed.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'back_type'          ToneObjBackType          N
+  'gamma'              Gamma                    N
+  'name'               ToneObjName              N
+  'npts'               Npts                     N
+  'tones'              Tones                    N
+  'type'               ToneObjType              N
+  'version'            ToneObjVersion           N
+
+=head3 Leaf ColorSetup Tags
+
+All B<Tag ID>'s in the following table have a leading 'ColorObj_' which
+has been removed.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'back_type'          ColorObjBackType         N
+  'color_mode'         ColorMode                N
+  'color_type'         ColorType                N
+  'has_ICC'            HasICC                   N
+  'input_profile'      InputProfile             N
+  'name'               ColorObjName             N
+  'output_profile'     OutputProfile            N
+  'type'               ColorObjType             N
+  'version'            ColorObjVersion          N
+
+=head3 Leaf LookHeader Tags
+
+All B<Tag ID>'s in the following table have a leading 'LookHead_' which
+has been removed.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'back_type'          LookHeadBackType         N
+  'name'               LookHeadName             N
+  'type'               LookHeadType             N
+  'version'            LookHeadVersion          N
+
+=head3 Leaf SaveSetup Tags
+
+All B<Tag ID>'s in the following table have a leading 'SaveObj_' which
+has been removed.
+
+  Tag ID                  Tag Name              Writable
+  ------                  --------              --------
+  'back_type'             SaveObjBackType       N
+  'leaf_auto_active'      LeafAutoActive        N
+  'leaf_auto_base_name'   LeafAutoBaseName      N
+  'leaf_hot_folder'       LeafHotFolder         N
+  'leaf_open_proc_HDR'    LeafOpenProcHDR       N
+  'leaf_output_file_type' LeafOutputFileType    N
+  'leaf_save_selection'   LeafSaveSelection     N
+  'name'                  SaveObjName           N
+  'std_auto_active'       StdAutoActive         N
+  'std_base_name'         StdBaseName           N
+  'std_hot_folder'        StdHotFolder          N
+  'std_open_in_photoshop' StdOpenInPhotoshop    N
+  'std_output_bit_depth'  StdOutputBitDepth     N
+  'std_output_color_mode' StdOutputColorMode    N
+  'std_output_file_type'  StdOutputFileType     N
+  'std_oxygen'            StdOxygen             N
+  'std_save_selection'    StdSaveSelection      N
+  'std_scaled_output'     StdScaledOutput       N
+  'std_sharpen_output'    StdSharpenOutput      N
+  'type'                  SaveObjType           N
+  'version'               SaveObjVersion        N
+
+=head3 Leaf SubIFD Tags
+
+Leaf writes a TIFF-format sub-IFD inside IFD0 of a MOS image.  No tags in
+this sub-IFD are currently known, except for tag 0x8606 which really
+shouldn't be here anyway (so it doesn't appear in the table below) because
+it duplicates a reference to the same data of tag 0x8606 in IFD0.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  [no tags known]
+
+=head2 Minolta Tags
+
+These tags are used by Minolta, Konica/Minolta as well as some Sony cameras.
+Minolta doesn't make things easy for decoders because the meaning of some
+tags and the location where some information is stored is different for
+different camera models.  (Take MinoltaQuality for example, which may be
+located in 5 different places.)
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0000   MakerNoteVersion                     undef[4]
+  0x0001   MinoltaCameraSettingsOld             Minolta CameraSettings
+  0x0003   MinoltaCameraSettings                Minolta CameraSettings
+  0x0004   MinoltaCameraSettings7D              Minolta CameraSettings7D
+  0x0018   ImageStabilization                   N
+  0x0020   WBInfoA100                           Minolta WBInfoA100
+  0x0040   CompressedImageSize                  int32u
+  0x0081   PreviewImage                         undef
+  0x0088   PreviewImageStart                    int32u*
+  0x0089   PreviewImageLength                   int32u*
+  0x0100   SceneMode                            int32u
+  0x0101   ColorMode                            int32u
+  0x0102   MinoltaQuality                       int32u
+  0x0103   MinoltaQuality                       int32u
+           MinoltaImageSize                     int32u
+  0x0104   FlashExposureComp                    rational64s
+  0x0105   Teleconverter                        int32u
+  0x0107   ImageStabilization                   int32u
+  0x0109   RawAndJpgRecording                   int32u
+  0x010a   ZoneMatching                         int32u
+  0x010b   ColorTemperature                     int32u
+  0x010c   LensType                             int32u
+  0x0111   ColorCompensationFilter              int32s
+  0x0112   WhiteBalanceFineTune                 int32u
+  0x0113   ImageStabilization                   int32u
+  0x0114   MinoltaCameraSettings5D              Minolta CameraSettings5D
+           CameraSettingsA100                   Minolta CameraSettingsA100
+  0x0115   WhiteBalance                         int32u
+  0x0e00   PrintIM                              PrintIM
+  0x0f00   MinoltaCameraSettings2               N
+
+=head3 Minolta CameraSettings Tags
+
+There is some variability in CameraSettings information between different
+models (and sometimes even between different firmware versions), so this
+information may not be as reliable as it should be.  Because of this, tags
+in the following tables are set to lower priority to prevent them from
+superceding the values of same-named tags in other locations when duplicate
+tags are disabled.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      1    ExposureMode                         int32u
+      2    FlashMode                            int32u
+      3    WhiteBalance                         int32u~
+      4    MinoltaImageSize                     int32u
+      5    MinoltaQuality                       int32u
+      6    DriveMode                            int32u
+      7    MeteringMode                         int32u
+      8    ISO                                  int32u
+      9    ExposureTime                         int32u
+     10    FNumber                              int32u
+     11    MacroMode                            int32u
+     12    DigitalZoom                          int32u
+     13    ExposureCompensation                 int32u
+     14    BracketStep                          int32u
+     16    IntervalLength                       int32u
+     17    IntervalNumber                       int32u
+     18    FocalLength                          int32u
+     19    FocusDistance                        int32u
+     20    FlashFired                           int32u
+     21    MinoltaDate                          int32u
+     22    MinoltaTime                          int32u
+     23    MaxAperture                          int32u
+     26    FileNumberMemory                     int32u
+     27    LastFileNumber                       int32u
+     28    ColorBalanceRed                      int32u
+     29    ColorBalanceGreen                    int32u
+     30    ColorBalanceBlue                     int32u
+     31    Saturation                           int32u
+     32    Contrast                             int32u
+     33    Sharpness                            int32u
+     34    SubjectProgram                       int32u
+     35    FlashExposureComp                    int32u
+     36    ISOSetting                           int32u
+     37    MinoltaModelID                       int32u
+     38    IntervalMode                         int32u
+     39    FolderName                           int32u
+     40    ColorMode                            int32u
+     41    ColorFilter                          int32u
+     42    BWFilter                             int32u
+     43    InternalFlash                        int32u
+     44    Brightness                           int32u
+     45    SpotFocusPointX                      int32u
+     46    SpotFocusPointY                      int32u
+     47    WideFocusZone                        int32u
+     48    FocusMode                            int32u
+     49    FocusArea                            int32u
+     50    DECPosition                          int32u
+     51    ColorProfile                         int32u
+     52    DataImprint                          int32u
+     63    FlashMetering                        int32u
+
+=head3 Minolta CameraSettings7D Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ExposureMode                         int16u
+      2    MinoltaImageSize                     int16u
+      3    MinoltaQuality                       int16u
+      4    WhiteBalance                         int16u
+     14    FocusMode                            int16u
+     16    AFPoints                             int16u
+     21    Flash                                int16u
+     22    FlashMode                            int16u
+     28    ISOSetting                           int16u
+     30    ExposureCompensation                 int16s
+     37    ColorSpace                           int16u
+     38    Sharpness                            int16u
+     39    Contrast                             int16u
+     40    Saturation                           int16u
+     45    FreeMemoryCardImages                 int16u
+     63    ColorTemperature                     int16s
+     64    HueAdjustment                        int16u
+     70    Rotation                             int16u
+     71    FNumber                              int16u
+     72    ExposureTime                         int16u
+     74    FreeMemoryCardImages                 int16u
+     94    ImageNumber                          int16u
+     96    NoiseReduction                       int16u
+     98    ImageNumber2                         int16u
+    113    ImageStabilization                   int16u
+    117    ZoneMatchingOn                       int16u
+
+=head3 Minolta WBInfoA100 Tags
+
+White balance information for the Sony DSLR-A100.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+    150    WB_RGBLevels                         int16u[3]
+    174    WB_GBRGLevels                        int16u[4]
+    772    WB_RBPresetFlash                     int16u[2]
+    776    WB_RBPresetCoolWhiteF                int16u[2]
+   1000    WB_RBPresetTungsten                  int16u[2]
+   1004    WB_RBPresetDaylight                  int16u[2]
+   1008    WB_RBPresetCloudy                    int16u[2]
+   1012    WB_RBPresetFlash                     int16u[2]
+   1020    WB_RedPresetsFluorescent             int16u[7]
+   1034    WB_BluePresetsFluorescent            int16u[7]
+   1048    WB_RBPresetShade                     int16u[2]
+   1060    WB_RBPresetCustom                    int16u[2]
+  18908    InternalSerialNumber                 string[12]
+
+=head3 Minolta CameraSettings5D Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+     10    ExposureMode                         int16u
+     12    MinoltaImageSize                     int16u
+     13    MinoltaQuality                       int16u
+     14    WhiteBalance                         int16u
+     31    Flash                                int16u
+     32    FlashMode                            int16u
+     37    MeteringMode                         int16u
+     38    ISOSetting                           int16u
+     47    ColorSpace                           int16u
+     48    Sharpness                            int16u
+     49    Contrast                             int16u
+     50    Saturation                           int16u
+     53    ExposureTime                         int16u
+     54    FNumber                              int16u
+     55    FreeMemoryCardImages                 int16u
+     73    ColorTemperature                     int16s
+     74    HueAdjustment                        int16u
+     80    Rotation                             int16u
+     83    ExposureCompensation                 int16u
+     84    FreeMemoryCardImages                 int16u
+    101    Rotation                             int16u
+    110    ColorTemperature                     int16s
+    113    PictureFinish                        int16u
+    174    ImageNumber                          int16u
+    176    NoiseReduction                       int16u
+    189    ImageStabilization                   int16u
+
+=head3 Minolta CameraSettingsA100 Tags
+
+Camera settings information for the Sony DSLR-A100.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ExposureMode                         int16u
+      1    ExposureCompensationSetting          int16u
+      5    HighSpeedSync                        int16u
+      6    ManualExposureTime                   int16u
+      7    ManualFNumber                        int16u
+      8    ExposureTime                         int16u
+      9    FNumber                              int16u
+     10    DriveMode2                           int16u
+     11    WhiteBalance                         int16u
+     12    FocusMode                            int16u
+     13    LocalAFAreaPoint                     int16u
+     14    AFAreaMode                           int16u
+     15    FlashMode                            int16u
+     16    FlashExposureCompSetting             int16u
+     18    MeteringMode                         int16u
+     19    ISOSetting                           int16u
+     20    ZoneMatchingMode                     int16u
+     21    DynamicRangeOptimizer                int16u
+     22    ColorMode                            int16u
+     23    ColorSpace                           int16u
+     24    Sharpness                            int16u
+     25    Contrast                             int16u
+     26    Saturation                           int16u
+     28    FlashMetering                        int16u
+     29    PrioritySetupShutterRelease          int16u
+     30    DriveMode                            int16u
+     31    SelfTimerTime                        int16u
+     32    ContinuousBracketing                 int16u
+     33    SingleFrameBracketing                int16u
+     34    WhiteBalanceBracketing               int16u
+     35    WhiteBalanceSetting                  int16u
+     36    PresetWhiteBalance                   int16u
+     37    ColorTemperatureSetting              int16u
+     38    CustomWBSetting                      int16u
+     39    DynamicRangeOptimizerSetting         int16u
+     50    FreeMemoryCardImages                 int16u
+     52    CustomWBRedLevel                     int16u
+     53    CustomWBGreenLevel                   int16u
+     54    CustomWBBlueLevel                    int16u
+     55    CustomWBError                        int16u
+     56    WhiteBalanceFineTune                 int16s
+     57    ColorTemperature                     int16u
+     58    ColorCompensationFilter              int16s
+     59    SonyImageSize                        int16u
+     60    SonyQuality                          int16u
+     61    InstantPlaybackTime                  int16u
+     62    InstantPlaybackSetup                 int16u
+     63    NoiseReduction                       int16u
+     64    EyeStartAF                           int16u
+     65    RedEyeReduction                      int16u
+     66    FlashDefault                         int16u
+     67    AutoBracketOrder                     int16u
+     68    FocusHoldButton                      int16u
+     69    AELButton                            int16u
+     70    ControlDialSet                       int16u
+     71    ExposureCompensationMode             int16u
+     72    AFAssist                             int16u
+     73    CardShutterLock                      int16u
+     74    LensShutterLock                      int16u
+     75    AFAreaIllumination                   int16u
+     76    MonitorDisplayOff                    int16u
+     77    RecordDisplay                        int16u
+     78    PlayDisplay                          int16u
+     80    ExposureIndicator                    int16u
+     81    AELExposureIndicator                 int16u
+     82    ExposureBracketingIndicatorLast      int16u
+     83    MeteringOffScaleIndicator            int16u
+     84    FlashExposureIndicator               int16u
+     85    FlashExposureIndicatorNext           int16u
+     86    FlashExposureIndicatorLast           int16u
+     87    ImageStabilization                   int16u
+     88    FocusModeSwitch                      int16u
+     89    FlashType                            int16u
+     90    Rotation                             int16u
+     91    AELock                               int16u
+     94    ColorTemperature                     int16u
+     95    ColorCompensationFilter              int16s
+     96    BatteryLevel                         int16u
+
+=head3 Minolta MMA Tags
+
+This information is found in MOV videos from Minolta models such as the
+DiMAGE A2, S414 and 7Hi.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    Make                                 N
+     20    SoftwareVersion                      N
+
+=head3 Minolta MOV1 Tags
+
+This information is found in MOV videos from some Konica Minolta models such
+as the DiMage Z10 and X50.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    Make                                 N
+     32    ModelType                            N
+     46    ExposureTime                         N
+     50    FNumber                              N
+     58    ExposureCompensation                 N
+     80    FocalLength                          N
+
+=head3 Minolta MOV2 Tags
+
+This information is found in MOV videos from some Minolta models such as the
+DiMAGE X and Xt.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    Make                                 N
+     24    ModelType                            N
+     38    ExposureTime                         N
+     42    FNumber                              N
+     50    ExposureCompensation                 N
+     72    FocalLength                          N
+
+=head2 Nikon Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0001   MakerNoteVersion                     undef[4]
+  0x0002   ISO                                  int16u[2]
+  0x0003   ColorMode                            string
+  0x0004   Quality                              string
+  0x0005   WhiteBalance                         string
+  0x0006   Sharpness                            string
+  0x0007   FocusMode                            string
+  0x0008   FlashSetting                         string
+  0x0009   FlashType                            string
+  0x000b   WhiteBalanceFineTune                 int16s[n]
+  0x000c   WB_RBLevels                          rational64u[4]
+  0x000d   ProgramShift                         undef[4]
+  0x000e   ExposureDifference                   undef[4]
+  0x000f   ISOSelection                         string
+  0x0010   DataDump                             N
+  0x0011   PreviewIFD                           Nikon PreviewIFD
+  0x0012   FlashExposureComp                    undef[4]
+  0x0013   ISOSetting                           int16u[2]
+  0x0014   ColorBalanceA                        Nikon ColorBalanceA
+           NRWData?                             Y
+  0x0016   ImageBoundary                        int16u[4]
+  0x0017   ExternalFlashExposureComp            undef[4]
+  0x0018   FlashExposureBracketValue            undef[4]
+  0x0019   ExposureBracketValue                 rational64s
+  0x001a   ImageProcessing                      string
+  0x001b   CropHiSpeed                          int16u[7]~
+  0x001c   ExposureTuning                       undef[3]
+  0x001d   SerialNumber                         string!
+  0x001e   ColorSpace                           int16u
+  0x001f   VRInfo                               Nikon VRInfo
+  0x0020   ImageAuthentication                  int8u
+  0x0021   FaceDetect                           Nikon FaceDetect
+  0x0022   ActiveD-Lighting                     int16u
+  0x0023   PictureControlData                   Nikon PictureControl
+  0x0024   WorldTime                            Nikon WorldTime
+  0x0025   ISOInfo                              Nikon ISOInfo
+  0x002a   VignetteControl                      int16u
+  0x002b   DistortInfo                          Nikon DistortInfo
+  0x002c   UnknownInfo                          Nikon UnknownInfo
+  0x0032   UnknownInfo2                         Nikon UnknownInfo2
+  0x0080   ImageAdjustment                      string
+  0x0081   ToneComp                             string
+  0x0082   AuxiliaryLens                        string
+  0x0083   LensType                             int8u
+  0x0084   Lens                                 rational64u[4]
+  0x0085   ManualFocusDistance                  rational64u
+  0x0086   DigitalZoom                          rational64u
+  0x0087   FlashMode                            int8u
+  0x0088   AFInfo                               Nikon AFInfo
+                                                Nikon AFInfo
+  0x0089   ShootingMode                         int16u~
+  0x008b   LensFStops                           undef[4]
+  0x008c   ContrastCurve                        N
+  0x008d   ColorHue                             string
+  0x008f   SceneMode                            string
+  0x0090   LightSource                          string
+  0x0091   ShotInfoD40                          Nikon ShotInfoD40
+           ShotInfoD80                          Nikon ShotInfoD80
+           ShotInfoD90                          Nikon ShotInfoD90
+           ShotInfoD3a                          Nikon ShotInfoD3a
+           ShotInfoD3b                          Nikon ShotInfoD3b
+           ShotInfoD3X                          Nikon ShotInfoD3X
+           ShotInfoD3S                          Nikon ShotInfoD3S
+           ShotInfoD300a                        Nikon ShotInfoD300a
+           ShotInfoD300b                        Nikon ShotInfoD300b
+           ShotInfoD300S                        Nikon ShotInfoD300S
+           ShotInfoD700                         Nikon ShotInfoD700
+           ShotInfoD5000                        Nikon ShotInfoD5000
+           ShotInfoD7000                        Nikon ShotInfoD7000
+           ShotInfo02xx                         Nikon ShotInfo
+           ShotInfoUnknown                      Nikon ShotInfo
+  0x0092   HueAdjustment                        int16s
+  0x0093   NEFCompression                       int16u
+  0x0094   Saturation                           int16s
+  0x0095   NoiseReduction                       string
+  0x0096   LinearizationTable                   N
+  0x0097   ColorBalance0100                     Nikon ColorBalance1
+           ColorBalance0102                     Nikon ColorBalance2
+           ColorBalance0103                     Nikon ColorBalance3
+           ColorBalance0205                     Nikon ColorBalance2
+           ColorBalance0209                     Nikon ColorBalance4
+           ColorBalance02                       Nikon ColorBalance2
+           ColorBalanceUnknown                  N
+  0x0098   LensData0100                         Nikon LensData00
+           LensData0101                         Nikon LensData01
+           LensData0201                         Nikon LensData01
+           LensData0204                         Nikon LensData0204
+           LensDataUnknown                      Nikon LensDataUnknown
+  0x0099   RawImageCenter                       int16u[2]
+  0x009a   SensorPixelSize                      rational64u[2]
+  0x009c   SceneAssist                          string
+  0x009e   RetouchHistory                       int16u[10]
+  0x00a0   SerialNumber                         string
+  0x00a2   ImageDataSize                        int32u
+  0x00a5   ImageCount                           int32u
+  0x00a6   DeletedImageCount                    int32u
+  0x00a7   ShutterCount                         int32u!
+  0x00a8   FlashInfo0100                        Nikon FlashInfo0100
+           FlashInfo0102                        Nikon FlashInfo0102
+           FlashInfo0103                        Nikon FlashInfo0103
+           FlashInfo0104                        Nikon FlashInfo0103
+           FlashInfoUnknown                     Nikon FlashInfoUnknown
+  0x00a9   ImageOptimization                    string
+  0x00aa   Saturation                           string
+  0x00ab   VariProgram                          string
+  0x00ac   ImageStabilization                   string
+  0x00ad   AFResponse                           string
+  0x00b0   MultiExposure                        Nikon MultiExposure
+  0x00b1   HighISONoiseReduction                int16u
+  0x00b3   ToningEffect                         string
+  0x00b6   PowerUpTime                          undef
+  0x00b7   AFInfo2                              Nikon AFInfo2
+  0x00b8   FileInfo                             Nikon FileInfo
+  0x00b9   AFTune                               Nikon AFTune
+  0x00bd   PictureControlData                   Nikon PictureControl
+  0x0e00   PrintIM                              PrintIM
+  0x0e01   NikonCaptureData                     NikonCapture
+  0x0e09   NikonCaptureVersion                  string
+  0x0e0e   NikonCaptureOffsets                  Nikon CaptureOffsets
+  0x0e10   NikonScanIFD                         Nikon Scan
+  0x0e13   NikonCaptureEditVersions             NikonCapture
+           NikonCaptureEditVersions             undef
+  0x0e1d   NikonICCProfile                      ICC_Profile
+  0x0e1e   NikonCaptureOutput                   Nikon CaptureOutput
+  0x0e22   NEFBitDepth                          int16u[4]!
+
+=head3 Nikon PreviewIFD Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x00fe   SubfileType                          N
+  0x0103   Compression                          N
+  0x011a   XResolution                          N
+  0x011b   YResolution                          N
+  0x0128   ResolutionUnit                       N
+  0x0201   PreviewImageStart                    int32u*
+  0x0202   PreviewImageLength                   int32u*
+  0x0213   YCbCrPositioning                     N
+
+=head3 Nikon ColorBalanceA Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+    624    RedBalance                           int16u!
+    625    BlueBalance                          int16u!
+
+=head3 Nikon VRInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    VRInfoVersion                        N
+      4    VibrationReduction                   int8u
+
+=head3 Nikon FaceDetect Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      1    FaceDetectFrameSize                  int16u[2]
+      3    FacesDetected                        int16u
+      4    Face1Position                        int16u[4]
+      8    Face2Position                        int16u[4]
+     12    Face3Position                        int16u[4]
+     16    Face4Position                        int16u[4]
+     20    Face5Position                        int16u[4]
+     24    Face6Position                        int16u[4]
+     28    Face7Position                        int16u[4]
+     32    Face8Position                        int16u[4]
+     36    Face9Position                        int16u[4]
+     40    Face10Position                       int16u[4]
+     44    Face11Position                       int16u[4]
+     48    Face12Position                       int16u[4]
+
+=head3 Nikon PictureControl Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    PictureControlVersion                N
+      4    PictureControlName                   string[20]
+     24    PictureControlBase                   string[20]
+     48    PictureControlAdjust                 int8u
+     49    PictureControlQuickAdjust            int8u
+     50    Sharpness                            int8u
+     51    Contrast                             int8u
+     52    Brightness                           int8u
+     53    Saturation                           int8u
+     54    HueAdjustment                        int8u
+     55    FilterEffect                         int8u
+     56    ToningEffect                         int8u
+     57    ToningSaturation                     int8u
+
+=head3 Nikon WorldTime Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    Timezone                             int16s
+      2    DaylightSavings                      int8u
+      3    DateDisplayFormat                    int8u
+
+=head3 Nikon ISOInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ISO                                  int8u
+      4    ISOExpansion                         int16u
+      6    ISO2                                 int8u
+     10    ISOExpansion2                        int16u
+
+=head3 Nikon DistortInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    DistortionVersion?                   N
+      4    AutoDistortionControl                int8u
+
+=head3 Nikon UnknownInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    UnknownInfoVersion?                  N
+
+=head3 Nikon UnknownInfo2 Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    UnknownInfo2Version?                 N
+
+=head3 Nikon AFInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    AFAreaMode                           int8u
+      1    AFPoint                              int8u
+      2    AFPointsInFocus                      int16u
+
+=head3 Nikon ShotInfoD40 Tags
+
+These tags are extracted from encrypted data in D40 and D40X images.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ShotInfoVersion                      N
+    582    ShutterCount                         int32u
+  586.1    VibrationReduction                   int8u & 0x08
+    729    CustomSettingsD40                    NikonCustom SettingsD40
+
+=head3 Nikon ShotInfoD80 Tags
+
+These tags are extracted from encrypted data in D80 images.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ShotInfoVersion                      N
+    586    ShutterCount                         int32u
+  590.1    Rotation                             int8u & 0x07
+  590.2    VibrationReduction                   int8u & 0x18
+  590.3    FlashFired                           int8u & 0xe0
+    708    NikonImageSize                       int8u & 0xf0
+  708.1    ImageQuality                         int8u & 0x0f
+    748    CustomSettingsD80                    NikonCustom SettingsD80
+
+=head3 Nikon ShotInfoD90 Tags
+
+These tags are extracted from encrypted data in images from the D90 with
+firmware 1.00.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ShotInfoVersion                      N
+      4    FirmwareVersion                      N
+    693    ISO2                                 int8u
+    725    ShutterCount                         int32u
+    884    CustomSettingsD90                    NikonCustom SettingsD90
+
+=head3 Nikon ShotInfoD3a Tags
+
+These tags are extracted from encrypted data in images from the D3 with
+firmware 1.00 and earlier.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ShotInfoVersion                      N
+    598    ISO2                                 int8u
+    630    ShutterCount                         int32u
+  723.1    NikonImageSize                       int8u & 0x18
+  723.2    ImageQuality                         int8u & 0x07
+    769    CustomSettingsD3                     NikonCustom SettingsD3
+
+=head3 Nikon ShotInfoD3b Tags
+
+These tags are extracted from encrypted data in images from the D3 with
+firmware 1.10, 2.00, 2.01 and 2.02.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ShotInfoVersion                      N
+      4    FirmwareVersion                      N
+     16    ImageArea                            int8u
+    605    ISO2                                 int8u
+    637    ShutterCount                         int32u
+    639    ShutterCount                         int32u
+    650    PreFlashReturnStrength               int8u
+  732.1    NikonImageSize                       int8u & 0x18
+  732.2    ImageQuality                         int8u & 0x07
+    778    CustomSettingsD3                     NikonCustom SettingsD3
+
+=head3 Nikon ShotInfoD3X Tags
+
+These tags are extracted from encrypted data in images from the D3X with
+firmware 1.00.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ShotInfoVersion                      N
+      4    FirmwareVersion                      N
+    605    ISO2                                 int8u
+    640    ShutterCount                         int32u
+    779    CustomSettingsD3X                    NikonCustom SettingsD3
+
+=head3 Nikon ShotInfoD3S Tags
+
+These tags are extracted from encrypted data in images from the D3S with
+firmware 1.00 and earlier.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ShotInfoVersion                      N
+      4    FirmwareVersion                      N
+     16    ImageArea                            int8u
+    545    ISO2                                 int8u
+    578    ShutterCount                         int32u
+    718    CustomSettingsD3S                    NikonCustom SettingsD3
+
+=head3 Nikon ShotInfoD300a Tags
+
+These tags are extracted from encrypted data in images from the D300 with
+firmware 1.00 and earlier.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ShotInfoVersion                      N
+    604    ISO2                                 int8u
+    633    ShutterCount                         int32u
+    721    AFFineTuneAdj                        int16u
+    790    CustomSettingsD300                   NikonCustom SettingsD3
+
+=head3 Nikon ShotInfoD300b Tags
+
+These tags are extracted from encrypted data in images from the D300 with
+firmware 1.10.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ShotInfoVersion                      N
+      4    FirmwareVersion                      N
+    613    ISO2                                 int8u
+    644    ShutterCount                         int32u
+    732    AFFineTuneAdj                        int16u
+    802    CustomSettingsD300                   NikonCustom SettingsD3
+
+=head3 Nikon ShotInfoD300S Tags
+
+These tags are extracted from encrypted data in images from the D300S with
+firmware 1.00.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ShotInfoVersion                      N
+      4    FirmwareVersion                      N
+    613    ISO2                                 int8u
+    646    ShutterCount                         int32u
+    804    CustomSettingsD300S                  NikonCustom SettingsD3
+
+=head3 Nikon ShotInfoD700 Tags
+
+These tags are extracted from encrypted data in images from the D700 with
+firmware 1.02f.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ShotInfoVersion                      N
+      4    FirmwareVersion                      N
+    613    ISO2                                 int8u
+    647    ShutterCount                         int32u
+    804    CustomSettingsD700                   NikonCustom SettingsD700
+
+=head3 Nikon ShotInfoD5000 Tags
+
+These tags are extracted from encrypted data in images from the D5000 with
+firmware 1.00.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ShotInfoVersion                      N
+      4    FirmwareVersion                      N
+    693    ISO2                                 int8u
+    726    ShutterCount                         int32u
+    888    CustomSettingsD5000                  NikonCustom SettingsD5000
+
+=head3 Nikon ShotInfoD7000 Tags
+
+These tags are extracted from encrypted data in images from the D7000 with
+firmware 1.01b.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ShotInfoVersion                      N
+      4    FirmwareVersion                      N
+    800    ShutterCount                         int32u
+   1028    CustomSettingsD7000                  NikonCustom SettingsD7000
+
+=head3 Nikon ShotInfo Tags
+
+This information is encrypted for ShotInfoVersion 02xx, and some tags are
+only valid for specific models.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ShotInfoVersion                      N
+      4    FirmwareVersion                      N
+     16    DistortionControl                    int8u
+    102    VR_0x66?                             int8u
+    106    ShutterCount                         int32u
+    110    DeletedImageCount                    int32u
+    117    VibrationReduction                   int8u
+    130    VibrationReduction                   int8u
+    343    ShutterCount                         undef[2]
+    430    VibrationReduction                   int8u
+    589    ShutterCount                         int32u
+
+=head3 Nikon ColorBalance1 Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    WB_RBGGLevels                        int16u[4]!
+
+=head3 Nikon ColorBalance2 Tags
+
+This information is encrypted for most camera models.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    WB_RGGBLevels                        int16u[4]!
+
+=head3 Nikon ColorBalance3 Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    WB_RGBGLevels                        int16u[4]!
+
+=head3 Nikon ColorBalance4 Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    WB_GRBGLevels                        int16u[4]!
+
+=head3 Nikon LensData00 Tags
+
+This structure is used by the D100, and D1X with firmware version 1.1.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    LensDataVersion                      N
+      6    LensIDNumber                         int8u
+      7    LensFStops                           int8u
+      8    MinFocalLength                       int8u
+      9    MaxFocalLength                       int8u
+     10    MaxApertureAtMinFocal                int8u
+     11    MaxApertureAtMaxFocal                int8u
+     12    MCUVersion                           int8u
+
+=head3 Nikon LensData01 Tags
+
+Nikon encrypts the LensData information below if LensDataVersion is 0201 or
+higher, but  the decryption algorithm is known so the information can be
+extracted.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    LensDataVersion                      N
+      4    ExitPupilPosition                    int8u
+      5    AFAperture                           int8u
+      8    FocusPosition                        int8u
+      9    FocusDistance                        int8u
+     10    FocalLength                          int8u
+     11    LensIDNumber                         int8u
+     12    LensFStops                           int8u
+     13    MinFocalLength                       int8u
+     14    MaxFocalLength                       int8u
+     15    MaxApertureAtMinFocal                int8u
+     16    MaxApertureAtMaxFocal                int8u
+     17    MCUVersion                           int8u
+     18    EffectiveMaxAperture                 int8u
+
+=head3 Nikon LensData0204 Tags
+
+Nikon encrypts the LensData information below if LensDataVersion is 0201 or
+higher, but  the decryption algorithm is known so the information can be
+extracted.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    LensDataVersion                      N
+      4    ExitPupilPosition                    int8u
+      5    AFAperture                           int8u
+      8    FocusPosition                        int8u
+     10    FocusDistance                        int8u
+     11    FocalLength                          int8u
+     12    LensIDNumber                         int8u
+     13    LensFStops                           int8u
+     14    MinFocalLength                       int8u
+     15    MaxFocalLength                       int8u
+     16    MaxApertureAtMinFocal                int8u
+     17    MaxApertureAtMaxFocal                int8u
+     18    MCUVersion                           int8u
+     19    EffectiveMaxAperture                 int8u
+
+=head3 Nikon LensDataUnknown Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    LensDataVersion                      N
+
+=head3 Nikon FlashInfo0100 Tags
+
+These tags are used by the D2H, D2Hs, D2X, D2Xs, D50, D70, D70s, D80 and
+D200.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    FlashInfoVersion                     N
+      4    FlashSource                          int8u
+      6    ExternalFlashFirmware                int8u[2]
+      8    ExternalFlashFlags                   int8u
+    9.1    FlashCommanderMode                   int8u & 0x80
+    9.2    FlashControlMode                     int8u & 0x7f
+     10    FlashOutput                          int8u
+           FlashCompensation                    int8s
+     11    FlashFocalLength                     int8u
+     12    RepeatingFlashRate                   int8u
+     13    RepeatingFlashCount                  int8u
+     14    FlashGNDistance                      int8u
+     15    FlashGroupAControlMode               int8u & 0x0f
+     16    FlashGroupBControlMode               int8u & 0x0f
+     17    FlashGroupAOutput                    int8u
+           FlashGroupACompensation              int8s
+     18    FlashGroupBOutput                    int8u
+           FlashGroupBCompensation              int8s
+
+=head3 Nikon FlashInfo0102 Tags
+
+These tags are used by the D3 (firmware 1.x), D40, D40X, D60 and D300
+(firmware 1.00).
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    FlashInfoVersion                     N
+      4    FlashSource                          int8u
+      6    ExternalFlashFirmware                int8u[2]
+      8    ExternalFlashFlags                   int8u
+    9.1    FlashCommanderMode                   int8u & 0x80
+    9.2    FlashControlMode                     int8u & 0x7f
+     10    FlashOutput                          int8u
+           FlashCompensation                    int8s
+     12    FlashFocalLength                     int8u
+     13    RepeatingFlashRate                   int8u
+     14    RepeatingFlashCount                  int8u
+     15    FlashGNDistance                      int8u
+   16.1    FlashGroupAControlMode               int8u & 0x0f
+   17.1    FlashGroupBControlMode               int8u & 0xf0
+   17.2    FlashGroupCControlMode               int8u & 0x0f
+     18    FlashGroupAOutput                    int8u
+           FlashGroupACompensation              int8s
+     19    FlashGroupBOutput                    int8u
+           FlashGroupBCompensation              int8s
+     20    FlashGroupCOutput                    int8u
+           FlashGroupCCompensation              int8s
+
+=head3 Nikon FlashInfo0103 Tags
+
+These tags are used by the D3 (firmware 2.x), D3X, D3S, D90, D300 (firmware
+1.10), D300S, D700, D3000 and D5000.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    FlashInfoVersion                     N
+      4    FlashSource                          int8u
+      6    ExternalFlashFirmware                int8u[2]
+      8    ExternalFlashFlags                   int8u
+    9.1    FlashCommanderMode                   int8u & 0x80
+    9.2    FlashControlMode                     int8u & 0x7f
+     10    FlashOutput                          int8u
+           FlashCompensation                    int8s
+     12    FlashFocalLength                     int8u
+     13    RepeatingFlashRate                   int8u
+     14    RepeatingFlashCount                  int8u
+     15    FlashGNDistance                      int8u
+     16    FlashColorFilter                     int8u
+   17.1    FlashGroupAControlMode               int8u & 0x0f
+   18.1    FlashGroupBControlMode               int8u & 0xf0
+   18.2    FlashGroupCControlMode               int8u & 0x0f
+     19    FlashGroupAOutput                    int8u
+           FlashGroupACompensation              int8s
+     20    FlashGroupBOutput                    int8u
+           FlashGroupBCompensation              int8s
+     21    FlashGroupCOutput                    int8u
+           FlashGroupCCompensation              int8s
+
+=head3 Nikon FlashInfoUnknown Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    FlashInfoVersion                     N
+
+=head3 Nikon MultiExposure Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    MultiExposureVersion                 N
+      1    MultiExposureMode                    int32u
+      2    MultiExposureShots                   int32u
+      3    MultiExposureAutoGain                int32u
+
+=head3 Nikon AFInfo2 Tags
+
+These tags are written by Nikon DSLR's which have the live view feature.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    AFInfo2Version                       N
+      4    ContrastDetectAF                     int8u
+      5    AFAreaMode                           int8u
+      6    PhaseDetectAF                        int8u
+      7    PrimaryAFPoint                       int8u
+      8    AFPointsUsed                         undef[7]~
+           AFPointsUsed                         undef[2]
+           AFPointsUsed                         undef[7]~
+     16    AFImageWidth                         int16u
+     18    AFImageHeight                        int16u
+     20    AFAreaXPosition                      int16u
+     22    AFAreaYPosition                      int16u
+     24    AFAreaWidth                          int16u
+     26    AFAreaHeight                         int16u
+     28    ContrastDetectAFInFocus              int8u
+
+=head3 Nikon FileInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    FileInfoVersion                      N
+      6    DirectoryNumber                      int16u
+      8    FileNumber                           int16u
+
+=head3 Nikon AFTune Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    AFFineTune                           int8u
+      1    AFFineTuneIndex                      int8u
+      2    AFFineTuneAdj                        int8s
+
+=head3 Nikon CaptureOffsets Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0001   IFD0_Offset                          N
+  0x0002   PreviewIFD_Offset                    N
+  0x0003   SubIFD_Offset                        N
+
+=head3 Nikon Scan Tags
+
+This information is written by the Nikon Scan software.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0002   FilmType                             string
+  0x0040   MultiSample                          string
+  0x0041   BitDepth                             int16u
+  0x0050   MasterGain                           rational64s
+  0x0051   ColorGain                            rational64s[3]
+  0x0060   ScanImageEnhancer                    int32u
+  0x0100   DigitalICE                           string
+  0x0110   ROCInfo                              Nikon ROC
+  0x0120   GEMInfo                              Nikon GEM
+  0x0200   DigitalDEEShadowAdj                  int32u
+  0x0201   DigitalDEEThreshold                  int32u
+  0x0202   DigitalDEEHighlightAdj               int32u
+
+=head3 Nikon ROC Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    DigitalROC                           int32u
+
+=head3 Nikon GEM Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    DigitalGEM                           int32u
+
+=head3 Nikon CaptureOutput Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      2    OutputImageWidth                     int32u
+      3    OutputImageHeight                    int32u
+      4    OutputResolution                     int32u
+
+=head3 Nikon Type2 Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0003   Quality                              Y
+  0x0004   ColorMode                            Y
+  0x0005   ImageAdjustment                      Y
+  0x0006   CCDSensitivity                       Y
+  0x0007   WhiteBalance                         Y
+  0x0008   Focus                                Y
+  0x000a   DigitalZoom                          Y
+  0x000b   Converter                            Y
+
+=head3 Nikon NCDT Tags
+
+Nikon-specific QuickTime tags found in the NCDT atom of MOV videos from some
+Nikon cameras such as the Coolpix S8000.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'NCHD'   MakerNoteVersion                     N
+  'NCTG'   NikonTags                            Nikon NCTG
+  'NCTH'   ThumbnailImage                       N
+  'NCVW'   PreviewImage                         N
+
+=head3 Nikon NCTG Tags
+
+These tags are found in proprietary-format records of the NCTG atom in MOV
+videos from some Nikon cameras.
+
+  Tag ID       Tag Name                         Writable
+  ------       --------                         --------
+  0x0001       Make                             N
+  0x0002       Model                            N
+  0x0003       Software                         N
+  0x0011       CreateDate                       N
+  0x0012       DateTimeOriginal                 N
+  0x0013       FrameCount                       N
+  0x0016       FrameRate                        N
+  0x0022       FrameWidth                       N
+  0x0023       FrameHeight                      N
+  0x0032       AudioChannels                    N
+  0x0033       AudioBitsPerSample               N
+  0x0034       AudioSampleRate                  N
+  0x2000001    MakerNoteVersion                 N
+  0x2000005    WhiteBalance                     N
+  0x200000b    WhiteBalanceFineTune             N
+  0x200001e    ColorSpace                       N
+  0x2000023    PictureControlData               Nikon PictureControl
+  0x2000024    WorldTime                        Nikon WorldTime
+  0x2000032    UnknownInfo                      Nikon UnknownInfo
+  0x2000083    LensType                         N
+  0x2000084    Lens                             N
+
+=head3 Nikon MOV Tags
+
+This information is found in MOV and QT videos from some Nikon cameras.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    Make                                 N
+     24    Model                                N
+     38    ExposureTime                         N
+     42    FNumber                              N
+     50    ExposureCompensation                 N
+     68    WhiteBalance                         N
+     72    FocalLength                          N
+    175    Software                             N
+    223    ISO                                  N
+
+=head3 Nikon AVI Tags
+
+Nikon-specific RIFF tags found in AVI videos.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'nctg'   NikonTags                            Nikon AVITags
+  'ncth'   ThumbnailImage                       N
+  'ncvr'   NikonVers                            Nikon AVIVers
+  'ncvw'   PreviewImage                         N
+
+=head3 Nikon AVITags Tags
+
+These tags and the AVIVer tags below are found in proprietary-format records
+of Nikon AVI videos.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0003   Make                                 N
+  0x0004   Model                                N
+  0x0005   Software                             N
+  0x0006   Equipment                            N
+  0x0007   Orientation                          N
+  0x0008   ExposureTime                         N
+  0x0009   FNumber                              N
+  0x000a   ExposureCompensation                 N
+  0x000b   MaxApertureValue                     N
+  0x000c   MeteringMode                         N
+  0x000f   FocalLength                          N
+  0x0010   XResolution                          N
+  0x0011   YResolution                          N
+  0x0012   ResolutionUnit                       N
+  0x0013   DateTimeOriginal                     N
+  0x0014   CreateDate                           N
+  0x0016   Duration                             N
+  0x0018   FocusMode                            N
+  0x001b   DigitalZoom                          N
+  0x001d   ColorMode                            N
+  0x001e   Sharpness                            N
+  0x001f   WhiteBalance                         N
+  0x0020   NoiseReduction                       N
+
+=head3 Nikon AVIVers Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0001   MakerNoteType                        N
+  0x0002   MakerNoteVersion                     N
+
+=head2 NikonCustom Tags
+
+=head3 NikonCustom SettingsD40 Tags
+
+Custom settings for the Nikon D40.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+    0.1    Beep                                 int8u & 0x80
+    0.2    AFAssist                             int8u & 0x40
+    0.3    NoMemoryCard                         int8u & 0x20
+    0.4    ImageReview                          int8u & 0x10
+    1.1    AutoISO                              int8u & 0x80
+    1.2    AutoISOMax                           int8u & 0x30
+    1.3    AutoISOMinShutterSpeed               int8u & 0x07
+    2.1    ImageReviewTime                      int8u & 0x07
+    3.1    MonitorOffTime                       int8u & 0xe0
+    3.2    MeteringTime                         int8u & 0x1c
+    3.3    SelfTimerTime                        int8u & 0x03
+    3.4    RemoteOnDuration                     int8u & 0xc0
+    4.1    AELockButton                         int8u & 0x0e
+    4.2    AELock                               int8u & 0x01
+    5.1    ShootingModeSetting                  int8u & 0x70
+    5.2    TimerFunctionButton                  int8u & 0x07
+    6.1    Metering                             int8u & 0x03
+    8.1    InternalFlash                        int8u & 0x10
+    8.2    ManualFlashOutput                    int8u & 0x07
+      9    FlashLevel                           int8s
+   10.1    FocusModeSetting                     int8u & 0xc0
+   11.1    AFAreaModeSetting                    int8u & 0x30
+
+=head3 NikonCustom SettingsD80 Tags
+
+Custom settings for the Nikon D80.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+    0.1    Beep                                 int8u & 0x80
+    0.2    AFAssist                             int8u & 0x40
+    0.3    NoMemoryCard                         int8u & 0x20
+    0.4    ImageReview                          int8u & 0x10
+    0.5    Illumination                         int8u & 0x08
+    0.6    MainDialExposureComp                 int8u & 0x04
+    0.7    EVStepSize                           int8u & 0x01
+    1.1    AutoISO                              int8u & 0x40
+    1.2    AutoISOMax                           int8u & 0x30
+    1.3    AutoISOMinShutterSpeed               int8u & 0x0f
+    2.1    AutoBracketSet                       int8u & 0xc0
+    2.2    AutoBracketOrder                     int8u & 0x20
+    3.1    MonitorOffTime                       int8u & 0xe0
+    3.2    MeteringTime                         int8u & 0x1c
+    3.3    SelfTimerTime                        int8u & 0x03
+    4.1    AELockButton                         int8u & 0x1e
+    4.2    AELock                               int8u & 0x01
+    4.3    RemoteOnDuration                     int8u & 0xc0
+    5.1    CommandDials                         int8u & 0x80
+    5.2    FunctionButton                       int8u & 0x78
+    6.1    GridDisplay                          int8u & 0x80
+    6.2    ViewfinderWarning                    int8u & 0x40
+    6.3    CenterWeightedAreaSize               int8u & 0x0c
+    6.4    ExposureDelayMode                    int8u & 0x20
+    6.5    MB-D80Batteries                      int8u & 0x03
+    7.1    FlashWarning                         int8u & 0x80
+    7.2    FlashShutterSpeed                    int8u & 0x78
+    7.3    AutoFP                               int8u & 0x04
+    7.4    ModelingFlash                        int8u & 0x02
+    8.1    InternalFlash                        int8u & 0xc0
+    8.2    ManualFlashOutput                    int8u & 0x07
+    9.1    RepeatingFlashOutput                 int8u & 0x70
+    9.2    RepeatingFlashCount                  int8u & 0x0f
+   10.1    RepeatingFlashRate                   int8u & 0xf0
+   10.2    CommanderChannel                     int8u & 0x03
+   11.1    CommanderInternalFlash               int8u & 0xc0
+   11.2    CommanderGroupAMode                  int8u & 0x30
+   11.3    CommanderGroupBMode                  int8u & 0x0c
+   12.1    CommanderInternalTTLComp             int8u & 0x1f
+   12.2    CommanderInternalManualOutput        int8u & 0xe0
+   13.1    CommanderGroupA_TTL-AAComp           int8u & 0x1f
+   13.2    CommanderGroupAManualOutput          int8u & 0xe0
+   14.1    CommanderGroupB_TTL-AAComp           int8u & 0x1f
+   14.2    CommanderGroupBManualOutput          int8u & 0xe0
+   15.1    CenterAFArea                         int8u & 0x80
+   15.2    FocusAreaSelection                   int8u & 0x04
+   15.3    AFAreaIllumination                   int8u & 0x03
+   16.1    AFAreaModeSetting                    int8u & 0xc0
+
+=head3 NikonCustom SettingsD90 Tags
+
+Custom settings for the D90.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+    0.1    LightSwitch                          int8u & 0x08
+    2.1    AFAreaModeSetting                    int8u & 0x60
+    2.2    CenterFocusPoint                     int8u & 0x10
+    2.3    AFAssist                             int8u & 0x01
+    2.4    AFPointIllumination                  int8u & 0x06
+    2.5    FocusPointWrap                       int8u & 0x08
+    3.1    AELockForMB-D80                      int8u & 0x1c
+    3.2    MB-D80BatteryType                    int8u & 0x03
+    4.1    Beep                                 int8u & 0x40
+    4.2    GridDisplay                          int8u & 0x02
+    4.3    ISODisplay                           int8u & 0x0c
+    4.4    ViewfinderWarning                    int8u & 0x01
+    4.5    NoMemoryCard                         int8u & 0x20
+    5.1    ScreenTips                           int8u & 0x04
+    5.2    FileNumberSequence                   int8u & 0x08
+    5.3    ShootingInfoDisplay                  int8u & 0xc0
+    5.4    LCDIllumination                      int8u & 0x20
+    6.1    EasyExposureComp                     int8u & 0x01
+    6.2    ReverseIndicators                    int8u & 0x80
+    7.1    ExposureControlStepSize              int8u & 0x40
+    8.1    CenterWeightedAreaSize               int8u & 0x60
+    8.2    FineTuneOptMatrixMetering            int8u & 0x0f
+    9.1    FineTuneOptCenterWeighted            int8u & 0xf0
+    9.2    FineTuneOptSpotMetering              int8u & 0x0f
+   11.1    CLModeShootingSpeed                  int8u & 0x07
+   11.2    ExposureDelayMode                    int8u & 0x40
+   13.1    AutoBracketSet                       int8u & 0xe0
+   13.2    AutoBracketOrder                     int8u & 0x10
+   14.1    FuncButton                           int8u & 0x78
+   16.1    OKButton                             int8u & 0x18
+   17.1    AELockButton                         int8u & 0x38
+   18.1    CommandDialsReverseRotation          int8u & 0x80
+   18.2    ShutterReleaseButtonAE-L             int8u & 0x02
+   19.1    MeteringTime                         int8u & 0xf0
+   19.2    RemoteOnDuration                     int8u & 0x03
+   20.1    SelfTimerTime                        int8u & 0xc0
+   20.2    SelfTimerShotCount                   int8u & 0x1e
+   21.1    PlaybackMonitorOffTime               int8u & 0x1c
+   21.2    ImageReviewTime                      int8u & 0xe0
+   22.1    MenuMonitorOffTime                   int8u & 0xe0
+   22.2    ShootingInfoMonitorOffTime           int8u & 0x1c
+   23.1    FlashShutterSpeed                    int8u & 0x0f
+   24.1    InternalFlash                        int8u & 0xc0
+   24.2    ManualFlashOutput                    int8u & 0x1f
+   25.1    RepeatingFlashOutput                 int8u & 0x70
+   25.2    RepeatingFlashCount                  int8u & 0x0f
+   26.1    RepeatingFlashRate                   int8u & 0xf0
+   31.1    FlashWarning                         int8u & 0x80
+   31.2    CommanderInternalTTLComp             int8u & 0x1f
+   31.3    ModelingFlash                        int8u & 0x20
+   31.4    AutoFP                               int8u & 0x40
+   32.1    CommanderGroupA_TTLComp              int8u & 0x1f
+   33.1    CommanderGroupB_TTLComp              int8u & 0x1f
+   34.1    LiveViewAF                           int8u & 0xc0
+
+=head3 NikonCustom SettingsD3 Tags
+
+Custom settings for the D3, D3S, D3X, D300 and D300S.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+    0.1    CustomSettingsBank                   int8u & 0x03
+    0.2    CustomSettingsAllDefault             int8u & 0x80
+    1.1    AF-CPrioritySelection                int8u & 0xc0
+    1.2    AF-SPrioritySelection                int8u & 0x20
+    1.3    AFPointSelection                     int8u & 0x10
+    1.4    DynamicAFArea                        int8u & 0x0c
+    1.5    FocusTrackingLockOn                  int8u & 0x03
+    2.1    AFActivation                         int8u & 0x80
+    2.2    FocusPointWrap                       int8u & 0x08
+    2.3    AFPointIllumination                  int8u & 0x60
+           AFPointIllumination                  int8u & 0x06
+    2.4    AFPointBrightness                    int8u & 0x06
+    2.5    AFAssist                             int8u & 0x01
+    3.1    AFOnButton                           int8u & 0x07
+    3.2    VerticalAFOnButton                   int8u & 0x70
+    3.3    AF-OnForMB-D10                       int8u & 0x70
+    4.1    FocusTrackingLockOn                  int8u & 0x07
+    4.2    AssignBktButton                      int8u & 0x08
+    4.3    MultiSelectorLiveView                int8u & 0xc0
+    4.4    InitialZoomLiveView                  int8u & 0x30
+    6.1    ISOStepSize                          int8u & 0xc0
+    6.2    ExposureControlStepSize              int8u & 0x30
+    6.3    ExposureCompStepSize                 int8u & 0x0c
+    6.4    EasyExposureCompensation             int8u & 0x03
+    7.1    CenterWeightedAreaSize               int8u & 0xe0
+    7.2    FineTuneOptCenterWeighted            int8u & 0x0f
+    8.1    FineTuneOptMatrixMetering            int8u & 0xf0
+    8.2    FineTuneOptSpotMetering              int8u & 0x0f
+    9.1    MultiSelectorShootMode               int8u & 0xc0
+    9.2    MultiSelectorPlaybackMode            int8u & 0x30
+    9.3    InitialZoomSetting                   int8u & 0x0c
+    9.4    MultiSelector                        int8u & 0x01
+   10.1    ExposureDelayMode                    int8u & 0x40
+   10.2    CLModeShootingSpeed                  int8u & 0x07
+   10.3    CHModeShootingSpeed                  int8u & 0x30
+     11    MaxContinuousRelease                 int8u
+   12.1    ReverseIndicators                    int8u & 0x20
+   12.2    FileNumberSequence                   int8u & 0x02
+           FileNumberSequence                   int8u & 0x08
+   12.3    RearDisplay                          int8u & 0x80
+   12.4    ViewfinderDisplay                    int8u & 0x40
+   12.5    BatteryOrder                         int8u & 0x04
+   12.6    MB-D10Batteries                      int8u & 0x03
+   12.7    ScreenTips                           int8u & 0x10
+   13.1    Beep                                 int8u & 0xc0
+   13.2    ShootingInfoDisplay                  int8u & 0x30
+   13.3    GridDisplay                          int8u & 0x02
+   13.4    ViewfinderWarning                    int8u & 0x01
+   13.5    MultiSelectorPlaybackMode            int8u & 0x03
+   14.1    PreviewButton                        int8u & 0xf8
+           FuncButton                           int8u & 0xf8
+   14.2    PreviewButtonPlusDials               int8u & 0x07
+           FuncButtonPlusDials                  int8u & 0x07
+   15.1    FuncButton                           int8u & 0xf8
+           PreviewButton                        int8u & 0xf8
+   15.2    FuncButtonPlusDials                  int8u & 0x07
+           PreviewButtonPlusDials               int8u & 0x07
+   16.1    AELockButton                         int8u & 0xf8
+   16.2    AELockButtonPlusDials                int8u & 0x07
+   17.1    CommandDialsReverseRotation          int8u & 0x80
+   17.2    CommandDialsChangeMainSub            int8u & 0x40
+   17.3    CommandDialsApertureSetting          int8u & 0x20
+   17.4    CommandDialsMenuAndPlayback          int8u & 0x10
+   17.5    LCDIllumination                      int8u & 0x08
+   17.6    PhotoInfoPlayback                    int8u & 0x04
+   17.7    ShutterReleaseButtonAE-L             int8u & 0x02
+   17.8    ReleaseButtonToUseDial               int8u & 0x01
+   18.1    SelfTimerTime                        int8u & 0x18
+   18.2    MonitorOffTime                       int8u & 0x07
+   20.1    FlashSyncSpeed                       int8u & 0xe0
+           FlashSyncSpeed                       int8u & 0xf0
+   20.2    FlashShutterSpeed                    int8u & 0x0f
+   21.1    AutoBracketSet                       int8u & 0xc0
+   21.2    AutoBracketModeM                     int8u & 0x30
+   21.3    AutoBracketOrder                     int8u & 0x08
+   21.4    ModelingFlash                        int8u & 0x01
+   22.1    NoMemoryCard                         int8u & 0x80
+   22.2    MeteringTime                         int8u & 0x0f
+   23.1    InternalFlash                        int8u & 0xc0
+
+=head3 NikonCustom SettingsD700 Tags
+
+Custom settings for the D700.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+    0.1    CustomSettingsBank                   int8u & 0x03
+    0.2    CustomSettingsAllDefault             int8u & 0x80
+    1.1    AF-CPrioritySelection                int8u & 0xc0
+    1.2    AF-SPrioritySelection                int8u & 0x20
+    1.3    AFPointSelection                     int8u & 0x10
+    1.4    DynamicAFArea                        int8u & 0x0c
+    2.1    AFActivation                         int8u & 0x80
+    2.2    FocusPointWrap                       int8u & 0x08
+    2.3    AFPointIllumination                  int8u & 0x06
+    2.4    AFAssist                             int8u & 0x01
+    3.1    FocusTrackingLockOn                  int8u & 0x07
+    3.2    AF-OnForMB-D10                       int8u & 0x70
+    4.1    ISOStepSize                          int8u & 0xc0
+    4.2    ExposureControlStepSize              int8u & 0x30
+    4.3    ExposureCompStepSize                 int8u & 0x0c
+    4.4    EasyExposureCompensation             int8u & 0x03
+    5.1    CenterWeightedAreaSize               int8u & 0x70
+    6.1    FineTuneOptMatrixMetering            int8u & 0xf0
+    6.2    FineTuneOptSpotMetering              int8u & 0x0f
+    7.1    ShutterReleaseButtonAE-L             int8u & 0x80
+    7.2    SelfTimerTime                        int8u & 0x30
+    7.3    MeteringTime                         int8u & 0x0f
+    8.1    PlaybackMonitorOffTime               int8u & 0x38
+    8.2    MenuMonitorOffTime                   int8u & 0x07
+    9.1    ShootingInfoMonitorOffTime           int8u & 0x38
+    9.2    ImageReviewTime                      int8u & 0x07
+   10.1    Beep                                 int8u & 0xc0
+   10.2    ShootingInfoDisplay                  int8u & 0x30
+   10.3    LCDIllumination                      int8u & 0x08
+   10.4    ExposureDelayMode                    int8u & 0x04
+   10.5    GridDisplay                          int8u & 0x02
+   11.1    FileNumberSequence                   int8u & 0x40
+   11.2    CLModeShootingSpeed                  int8u & 0x07
+     12    MaxContinuousRelease                 int8u
+   13.1    ScreenTips                           int8u & 0x08
+   13.2    BatteryOrder                         int8u & 0x04
+   13.3    MB-D10BatteryType                    int8u & 0x03
+   15.1    FlashSyncSpeed                       int8u & 0xf0
+   15.2    FlashShutterSpeed                    int8u & 0x0f
+   16.1    FlashControlBuilt-in                 int8u & 0xc0
+   16.2    ManualFlashOutput                    int8u & 0x1f
+   17.1    RepeatingFlashOutput                 int8u & 0x70
+   17.2    RepeatingFlashCount                  int8u & 0x0f
+   18.1    RepeatingFlashRate                   int8u & 0xf0
+   18.2    CommanderInternalTTLChannel          int8u & 0x03
+   20.1    CommanderInternalTTLCompBuiltin      int8u & 0x1f
+   21.1    CommanderInternalTTLCompGroupA       int8u & 0x1f
+   22.1    CommanderInternalTTLCompGroupB       int8u & 0x1f
+   26.1    AutoBracketSet                       int8u & 0xc0
+   26.2    AutoBracketModeM                     int8u & 0x30
+   26.3    AutoBracketOrder                     int8u & 0x08
+   26.4    ModelingFlash                        int8u & 0x01
+   27.1    MultiSelectorShootMode               int8u & 0xc0
+   27.2    MultiSelectorPlaybackMode            int8u & 0x30
+   27.3    InitialZoomSetting                   int8u & 0x0c
+   27.4    MultiSelector                        int8u & 0x01
+   28.1    FuncButton                           int8u & 0xf8
+   29.1    PreviewButton                        int8u & 0xf8
+   30.1    AELockButton                         int8u & 0xf8
+   31.1    FuncButtonPlusDials                  int8u & 0x70
+   31.2    PreviewButtonPlusDials               int8u & 0x07
+   32.1    AELockButtonPlusDials                int8u & 0x70
+   33.1    CommandDialsReverseRotation          int8u & 0x80
+   33.2    CommandDialsChangeMainSub            int8u & 0x40
+   33.3    CommandDialsApertureSetting          int8u & 0x20
+   33.4    CommandDialsMenuAndPlayback          int8u & 0x10
+   33.5    ReverseIndicators                    int8u & 0x08
+   33.6    PhotoInfoPlayback                    int8u & 0x04
+   33.7    NoMemoryCard                         int8u & 0x02
+   33.8    ReleaseButtonToUseDial               int8u & 0x01
+
+=head3 NikonCustom SettingsD5000 Tags
+
+Custom settings for the D5000.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+    0.1    AFAreaModeSetting                    int8u & 0x60
+    0.2    AFAssist                             int8u & 0x01
+    2.1    Beep                                 int8u & 0xc0
+    2.2    GridDisplay                          int8u & 0x02
+    2.3    ISODisplay                           int8u & 0x08
+    2.4    NoMemoryCard                         int8u & 0x20
+    3.1    FileNumberSequence                   int8u & 0x08
+    4.1    RangeFinder                          int8u & 0x10
+    4.2    DateImprint                          int8u & 0x08
+    4.3    ReverseIndicators                    int8u & 0x80
+    5.1    EVStepSize                           int8u & 0x40
+    9.1    ExposureDelayMode                    int8u & 0x40
+   11.1    AutoBracketSet                       int8u & 0xc0
+   12.1    TimerFunctionButton                  int8u & 0x38
+   15.1    AELockButton                         int8u & 0x38
+   16.1    ShutterReleaseButtonAE-L             int8u & 0x02
+   16.2    CommandDialsReverseRotation          int8u & 0x80
+   17.1    MeteringTime                         int8u & 0x70
+   17.2    RemoteOnDuration                     int8u & 0x03
+   18.1    SelfTimerTime                        int8u & 0xc0
+   18.2    SelfTimerShotCount                   int8u & 0x1e
+   19.1    ImageReviewTime                      int8u & 0xe0
+   20.1    PlaybackMenusTime                    int8u & 0xe0
+   22.1    InternalFlash                        int8u & 0xc0
+   22.2    ManualFlashOutput                    int8u & 0x1f
+   32.1    LiveViewAF                           int8u & 0x60
+
+=head3 NikonCustom SettingsD7000 Tags
+
+Custom settings for the D7000.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+    0.1    AF-CPrioritySelection                int8u & 0x80
+    0.2    AF-SPrioritySelection                int8u & 0x20
+    0.3    NumberOfFocusPoints                  int8u & 0x10
+    0.4    FocusTrackingLockOn                  int8u & 0x07
+    1.2    FocusPointWrap                       int8u & 0x08
+    1.3    AFPointIllumination                  int8u & 0x06
+    1.4    AFAssist                             int8u & 0x01
+    2.1    BatteryOrder                         int8u & 0x40
+    2.2    AF-OnForMB-D11                       int8u & 0x1c
+    2.3    MB-D11BatteryType                    int8u & 0x03
+    3.1    BeepPitch                            int8u & 0xc0
+    3.2    NoMemoryCard                         int8u & 0x20
+    3.3    ISODisplay                           int8u & 0x0c
+    3.4    GridDisplay                          int8u & 0x02
+    3.5    ViewfinderWarning                    int8u & 0x01
+    4.1    ShootingInfoDisplay                  int8u & 0xc0
+    4.2    LCDIllumination                      int8u & 0x20
+    4.3    FileNumberSequence                   int8u & 0x08
+    4.4    ScreenTips                           int8u & 0x04
+    4.5    BeepVolume                           int8u & 0x03
+    5.1    ReverseIndicators                    int8u & 0x80
+    5.2    EasyExposureCompensation             int8u & 0x03
+    6.1    ExposureControlStep                  int8u & 0x40
+    6.2    ISOSensitivityStep                   int8u & 0x10
+    7.1    CenterWeightedAreaSize               int8u & 0xe0
+   10.1    ExposureDelayMode                    int8u & 0x40
+   10.2    CLModeShootingSpeed                  int8u & 0x07
+     11    MaxContinuousRelease                 int8u
+   12.1    AutoBracketSet                       int8u & 0xe0
+   12.2    AutoBracketOrder                     int8u & 0x10
+   13.1    FuncButton                           int8u & 0xf8
+   14.1    PreviewButton                        int8u & 0xf8
+   15.1    OKButton                             int8u & 0x18
+   16.1    AELockButton                         int8u & 0x38
+   17.1    CommandDialsReverseRotation          int8u & 0x80
+   17.2    CommandDialsChangeMainSub            int8u & 0x60
+   17.3    CommandDialsApertureSetting          int8u & 0x04
+   17.4    CommandDialsMenuAndPlayback          int8u & 0x18
+   17.5    ShutterReleaseButtonAE-L             int8u & 0x02
+   17.6    ReleaseButtonToUseDial               int8u & 0x01
+   18.1    MeteringTime                         int8u & 0xf0
+   18.2    RemoteOnDuration                     int8u & 0x03
+   19.1    SelfTimerTime                        int8u & 0xc0
+   19.2    SelfTimerInterval                    int8u & 0x30
+   19.3    SelfTimerShotCount                   int8u & 0x0f
+   20.1    ImageReviewTime                      int8u & 0xe0
+   20.2    LiveViewMonitorOffTime               int8u & 0x1c
+   21.1    MenuMonitorOffTime                   int8u & 0xe0
+   21.2    ShootingInfoMonitorOffTime           int8u & 0x1c
+   22.1    FlashSyncSpeed                       int8u & 0xf0
+   22.2    FlashShutterSpeed                    int8u & 0x0f
+   23.1    FlashControlBuilt-in                 int8u & 0xc0
+   23.2    ManualFlashOutput                    int8u & 0x1f
+   24.1    RepeatingFlashOutput                 int8u & 0x70
+   24.2    RepeatingFlashCount                  int8u & 0x0f
+   25.1    RepeatingFlashRate                   int8u & 0xf0
+   26.1    CommanderInternalTTLCompBuiltin      int8u & 0x1f
+   27.1    CommanderInternalTTLCompGroupA       int8u & 0x1f
+   28.1    CommanderInternalTTLCompGroupB       int8u & 0x1f
+   30.1    FlashWarning                         int8u & 0x80
+   30.2    ModelingFlash                        int8u & 0x20
+   34.1    LiveViewAFAreaMode                   int8u & 0x60
+   34.2    LiveViewAFMode                       int8u & 0x02
+   35.1    PlaybackMonitorOffTime               int8u & 0xe0
+
+=head2 NikonCapture Tags
+
+This information is written by the Nikon Capture software in tag 0x0e01 of
+the maker notes of NEF images.
+
+  Tag ID       Tag Name                         Writable
+  ------       --------                         --------
+  0x8ae85e     LCHEditor                        int8u
+  0x83a1a25    HistogramXML                     undef
+  0xc89224b    ColorAberrationControl           int8u
+  0x116fea21   HighlightData                    NikonCapture HighlightData
+  0x2175eb78   D-LightingHQ                     int8u
+  0x2fc08431   StraightenAngle                  double
+  0x374233e0   CropData                         NikonCapture CropData
+  0x39c456ac   PictureCtrl                      NikonCapture PictureCtrl
+  0x3cfc73c6   RedEyeData                       NikonCapture RedEyeData
+  0x3d136244   EditVersionName                  string
+  0x56a54260   Exposure                         NikonCapture Exposure
+  0x5f0e7d23   ColorBooster                     int8u
+  0x6a6e36b6   D-LightingHQSelected             int8u
+  0x753dcbc0   NoiseReduction                   int8u
+  0x76a43200   UnsharpMask                      int8u
+  0x76a43201   Curves                           int8u
+  0x76a43202   ColorBalanceAdj                  int8u
+  0x76a43203   AdvancedRaw                      int8u
+  0x76a43204   WhiteBalanceAdj                  int8u
+  0x76a43205   VignetteControl                  int8u
+  0x76a43206   FlipHorizontal                   int8u
+  0x76a43207   Rotation                         int16u
+  0x84589434   BrightnessData                   NikonCapture Brightness
+  0x890ff591   D-LightingHQData                 NikonCapture DLightingHQ
+  0x926f13e0   NoiseReductionData               NikonCapture NoiseReduction
+  0x9ef5f6e0   IPTCData                         IPTC
+  0xab5eca5e   PhotoEffects                     int8u
+  0xac6bd5c0   VignetteControlIntensity         int16s
+  0xb0384e1e   PhotoEffectsData                 NikonCapture PhotoEffects
+  0xb999a36f   ColorBoostData                   NikonCapture ColorBoost
+  0xbf3c6c20   WBAdjData                        NikonCapture WBAdjData
+  0xce5554aa   D-LightingHS                     int8u
+  0xe2173c47   PictureControl                   int8u
+  0xe37b4337   D-LightingHSData                 NikonCapture DLightingHS
+  0xe42b5161   UnsharpData                      NikonCapture UnsharpData
+  0xe9651831   PhotoEffectHistoryXML            undef
+  0xfe28a44f   AutoRedEye                       int8u
+  0xfe443a45   ImageDustOff                     int8u
+
+=head3 NikonCapture HighlightData Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ShadowProtection                     int8s
+      1    SaturationAdj                        int8s
+      6    HighlightProtection                  int8s
+
+=head3 NikonCapture CropData Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+     30    CropLeft                             double
+     38    CropTop                              double
+     46    CropRight                            double
+     54    CropBottom                           double
+    142    CropOutputWidthInches                double
+    150    CropOutputHeightInches               double
+    158    CropScaledResolution                 double
+    174    CropSourceResolution                 double
+    182    CropOutputResolution                 double
+    190    CropOutputScale                      double
+    198    CropOutputWidth                      double
+    206    CropOutputHeight                     double
+    214    CropOutputPixels                     double
+
+=head3 NikonCapture PictureCtrl Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    PictureControlActive                 int8u
+     19    PictureControlMode                   string[16]
+     42    QuickAdjust                          int8u
+     43    SharpeningAdj                        int8u
+     44    ContrastAdj                          int8u
+     45    BrightnessAdj                        int8u
+     46    SaturationAdj                        int8u
+     47    HueAdj                               int8u
+
+=head3 NikonCapture RedEyeData Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    RedEyeCorrection                     int8u
+
+=head3 NikonCapture Exposure Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ExposureAdj                          int16s
+     18    ExposureAdj2                         double~
+     36    ActiveD-Lighting                     int8u
+     37    ActiveD-LightingMode                 int8u
+
+=head3 NikonCapture Brightness Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    BrightnessAdj                        double
+      8    EnhanceDarkTones                     int8u
+
+=head3 NikonCapture DLightingHQ Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    D-LightingHQShadow                   int32u
+      1    D-LightingHQHighlight                int32u
+      2    D-LightingHQColorBoost               int32u
+
+=head3 NikonCapture NoiseReduction Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      4    EdgeNoiseReduction                   int8u
+      5    ColorMoireReductionMode              int8u
+      9    NoiseReductionIntensity              int32u
+     13    NoiseReductionSharpness              int32u
+     17    NoiseReductionMethod                 int16u
+     21    ColorMoireReduction                  int8u
+     23    NoiseReduction                       int8u
+     24    ColorNoiseReductionIntensity         int32u
+     28    ColorNoiseReductionSharpness         int32u
+
+=head3 NikonCapture PhotoEffects Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    PhotoEffectsType                     int8u
+      4    PhotoEffectsRed                      int16s
+      6    PhotoEffectsGreen                    int16s
+      8    PhotoEffectsBlue                     int16s
+
+=head3 NikonCapture ColorBoost Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ColorBoostType                       int8u
+      1    ColorBoostLevel                      int32u
+
+=head3 NikonCapture WBAdjData Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    WBAdjRedBalance                      double
+      8    WBAdjBlueBalance                     double
+     16    WBAdjMode                            int8u
+     20    WBAdjLightingSubtype                 int8u
+     21    WBAdjLighting                        int8u
+     24    WBAdjTemperature                     int16u
+     37    WBAdjTint                            int32s
+
+=head3 NikonCapture DLightingHS Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    D-LightingHSAdjustment               int32u
+      1    D-LightingHSColorBoost               int32u
+
+=head3 NikonCapture UnsharpData Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    UnsharpCount                         int8u
+     19    Unsharp1Color                        int16u
+     23    Unsharp1Intensity                    int16u
+     25    Unsharp1HaloWidth                    int16u
+     27    Unsharp1Threshold                    int8u
+     46    Unsharp2Color                        int16u
+     50    Unsharp2Intensity                    int16u
+     52    Unsharp2HaloWidth                    int16u
+     54    Unsharp2Threshold                    int8u
+     73    Unsharp3Color                        int16u
+     77    Unsharp3Intensity                    int16u
+     79    Unsharp3HaloWidth                    int16u
+     81    Unsharp3Threshold                    int8u
+    100    Unsharp4Color                        int16u
+    104    Unsharp4Intensity                    int16u
+    106    Unsharp4HaloWidth                    int16u
+    108    Unsharp4Threshold                    int8u
+
+=head2 Olympus Tags
+
+Tags 0x0000 through 0x0103 are used by some older Olympus cameras, and are
+the same as Konica/Minolta tags.  The Olympus tags are also used for Epson
+and Agfa cameras.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0000   MakerNoteVersion                     undef
+  0x0001   MinoltaCameraSettingsOld             Minolta CameraSettings
+  0x0003   MinoltaCameraSettings                Minolta CameraSettings
+  0x0040   CompressedImageSize                  int32u
+  0x0081   PreviewImageData                     N
+  0x0088   PreviewImageStart                    N
+  0x0089   PreviewImageLength                   N
+  0x0100   ThumbnailImage                       undef
+  0x0104   BodyFirmwareVersion                  string
+  0x0200   SpecialMode                          int32u[3]~
+  0x0201   Quality                              int16u~
+  0x0202   Macro                                int16u
+  0x0203   BWMode                               int16u
+  0x0204   DigitalZoom                          rational64u
+  0x0205   FocalPlaneDiagonal                   rational64u
+  0x0206   LensDistortionParams                 int16s[6]
+  0x0207   CameraType                           string
+  0x0208   TextInfo                             Olympus TextInfo
+  0x0209   CameraID                             string
+  0x020b   EpsonImageWidth                      int16u
+  0x020c   EpsonImageHeight                     int16u
+  0x020d   EpsonSoftware                        string
+  0x0280   PreviewImage                         int8u
+  0x0300   PreCaptureFrames                     int16u
+  0x0301   WhiteBoard                           int16u
+  0x0302   OneTouchWB                           int16u
+  0x0303   WhiteBalanceBracket                  int16u
+  0x0304   WhiteBalanceBias                     int16u
+  0x0403   SceneMode                            int16u
+  0x0404   SerialNumber                         string
+  0x0405   Firmware                             string
+  0x0e00   PrintIM                              PrintIM
+  0x0f00   DataDump                             N
+  0x0f01   DataDump2                            N
+  0x0f04   ZoomedPreviewStart                   int32u*
+  0x0f05   ZoomedPreviewLength                  int32u*
+  0x0f06   ZoomedPreviewSize                    int16u[2]
+  0x1000   ShutterSpeedValue                    rational64s
+  0x1001   ISOValue                             rational64s
+  0x1002   ApertureValue                        rational64s
+  0x1003   BrightnessValue                      rational64s
+  0x1004   FlashMode                            int16u
+  0x1005   FlashDevice                          int16u
+  0x1006   ExposureCompensation                 rational64s
+  0x1007   SensorTemperature                    int16s
+  0x1008   LensTemperature                      int16s
+  0x1009   LightCondition                       int16u
+  0x100a   FocusRange                           int16u
+  0x100b   FocusMode                            int16u
+  0x100c   ManualFocusDistance                  rational64u
+  0x100d   ZoomStepCount                        int16u
+  0x100e   FocusStepCount                       int16u
+  0x100f   Sharpness                            int16u
+  0x1010   FlashChargeLevel                     int16u
+  0x1011   ColorMatrix                          int16u[9]
+  0x1012   BlackLevel                           int16u[4]
+  0x1013   ColorTemperatureBG?                  int16u
+  0x1014   ColorTemperatureRG?                  int16u
+  0x1015   WBMode                               int16u[2]
+  0x1017   RedBalance                           int16u[2]
+  0x1018   BlueBalance                          int16u[2]
+  0x1019   ColorMatrixNumber                    int16u
+  0x101a   SerialNumber                         string
+  0x101b   ExternalFlashAE1_0?                  int32u
+  0x101c   ExternalFlashAE2_0?                  int32u
+  0x101d   InternalFlashAE1_0?                  int32u
+  0x101e   InternalFlashAE2_0?                  int32u
+  0x101f   ExternalFlashAE1?                    int32u
+  0x1020   ExternalFlashAE2?                    int32u
+  0x1021   InternalFlashAE1?                    int32u
+  0x1022   InternalFlashAE2?                    int32u
+  0x1023   FlashExposureComp                    rational64s
+  0x1024   InternalFlashTable                   int16u
+  0x1025   ExternalFlashGValue                  rational64s
+  0x1026   ExternalFlashBounce                  int16u
+  0x1027   ExternalFlashZoom                    int16u
+  0x1028   ExternalFlashMode                    int16u
+  0x1029   Contrast                             int16u
+  0x102a   SharpnessFactor                      int16u
+  0x102b   ColorControl                         int16u[6]
+  0x102c   ValidBits                            int16u[2]
+  0x102d   CoringFilter                         int16u
+  0x102e   OlympusImageWidth                    int32u
+  0x102f   OlympusImageHeight                   int32u
+  0x1030   SceneDetect                          int16u
+  0x1031   SceneArea?                           int32u[8]
+  0x1033   SceneDetectData?                     int32u[720]
+  0x1034   CompressionRatio                     rational64u
+  0x1035   PreviewImageValid                    int32u
+  0x1036   PreviewImageStart                    int32u*
+  0x1037   PreviewImageLength                   int32u*
+  0x1038   AFResult                             int16u
+  0x1039   CCDScanMode                          int16u
+  0x103a   NoiseReduction                       int16u
+  0x103b   FocusStepInfinity                    int16u
+  0x103c   FocusStepNear                        int16u
+  0x103d   LightValueCenter                     rational64s
+  0x103e   LightValuePeriphery                  rational64s
+  0x103f   FieldCount?                          int16u
+  0x2010   Equipment                            Olympus Equipment
+           EquipmentIFD                         Olympus Equipment
+  0x2020   CameraSettings                       Olympus CameraSettings
+           CameraSettingsIFD                    Olympus CameraSettings
+  0x2030   RawDevelopment                       Olympus RawDevelopment
+           RawDevelopmentIFD                    Olympus RawDevelopment
+  0x2031   RawDev2                              Olympus RawDevelopment2
+           RawDev2IFD                           Olympus RawDevelopment2
+  0x2040   ImageProcessing                      Olympus ImageProcessing
+           ImageProcessingIFD                   Olympus ImageProcessing
+  0x2050   FocusInfo                            Olympus FocusInfo
+           FocusInfoIFD                         Olympus FocusInfo
+           CameraParameters                     undef
+  0x2100   Olympus2100                          Olympus FE
+           Olympus2100IFD                       Olympus FE
+  0x2200   Olympus2200                          Olympus FE
+           Olympus2200IFD                       Olympus FE
+  0x2300   Olympus2300                          Olympus FE
+           Olympus2300IFD                       Olympus FE
+  0x2400   Olympus2400                          Olympus FE
+           Olympus2400IFD                       Olympus FE
+  0x2500   Olympus2500                          Olympus FE
+           Olympus2500IFD                       Olympus FE
+  0x2600   Olympus2600                          Olympus FE
+           Olympus2600IFD                       Olympus FE
+  0x2700   Olympus2700                          Olympus FE
+           Olympus2700IFD                       Olympus FE
+  0x2800   Olympus2800                          Olympus FE
+           Olympus2800IFD                       Olympus FE
+  0x2900   Olympus2900                          Olympus FE
+           Olympus2900IFD                       Olympus FE
+  0x3000   RawInfo                              Olympus RawInfo
+           RawInfoIFD                           Olympus RawInfo
+  0x4000   MainInfo                             Olympus
+           MainInfoIFD                          Olympus
+  0x5000   UnknownInfo                          Olympus UnknownInfo
+           UnknownInfoIFD                       Olympus UnknownInfo
+
+=head3 Olympus TextInfo Tags
+
+This information is in text format (similar to APP12 information, but with
+spaces instead of linefeeds).  Below are tags which have been observed, but
+any information found here will be extracted, even if the tag is not listed.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'Resolution'         Resolution               N
+  'Type'               CameraType               N
+
+=head3 Olympus Equipment Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0000   EquipmentVersion                     undef[4]
+  0x0100   CameraType2                          string[6]
+  0x0101   SerialNumber                         string[32]
+  0x0102   InternalSerialNumber                 string[32]
+  0x0103   FocalPlaneDiagonal                   rational64u
+  0x0104   BodyFirmwareVersion                  int32u
+  0x0201   LensType                             int8u[6]
+  0x0202   LensSerialNumber                     string[32]
+  0x0203   LensModel                            string
+  0x0204   LensFirmwareVersion                  int32u
+  0x0205   MaxApertureAtMinFocal                int16u
+  0x0206   MaxApertureAtMaxFocal                int16u
+  0x0207   MinFocalLength                       int16u
+  0x0208   MaxFocalLength                       int16u
+  0x020a   MaxApertureAtCurrentFocal            int16u
+  0x020b   LensProperties                       int16u
+  0x0301   Extender                             int8u[6]
+  0x0302   ExtenderSerialNumber                 string[32]
+  0x0303   ExtenderModel                        string
+  0x0304   ExtenderFirmwareVersion              int32u
+  0x1000   FlashType                            int16u
+  0x1001   FlashModel                           int16u
+  0x1002   FlashFirmwareVersion                 int32u
+  0x1003   FlashSerialNumber                    string[32]
+
+=head3 Olympus CameraSettings Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0000   CameraSettingsVersion                undef[4]
+  0x0100   PreviewImageValid                    int32u
+  0x0101   PreviewImageStart                    int32u*
+  0x0102   PreviewImageLength                   int32u*
+  0x0200   ExposureMode                         int16u
+  0x0201   AELock                               int16u
+  0x0202   MeteringMode                         int16u
+  0x0203   ExposureShift                        rational64s
+  0x0300   MacroMode                            int16u
+  0x0301   FocusMode                            int16u[n]
+  0x0302   FocusProcess                         int16u[n]
+  0x0303   AFSearch                             int16u
+  0x0304   AFAreas                              int32u[64]~
+  0x0305   AFPointSelected                      rational64s[5]~
+  0x0307   AFFineTuneAdj                        int16s[3]
+  0x0400   FlashMode                            int16u
+  0x0401   FlashExposureComp                    rational64s
+  0x0403   FlashRemoteControl                   int16u
+  0x0404   FlashControlMode                     int16u[3]
+  0x0405   FlashIntensity                       rational64s[3]
+  0x0406   ManualFlashStrength                  rational64s[3]
+  0x0500   WhiteBalance2                        int16u
+  0x0501   WhiteBalanceTemperature              int16u
+  0x0502   WhiteBalanceBracket                  int16s
+  0x0503   CustomSaturation                     int16s[3]~
+  0x0504   ModifiedSaturation                   int16u
+  0x0505   ContrastSetting                      int16s[3]
+  0x0506   SharpnessSetting                     int16s[3]
+  0x0507   ColorSpace                           int16u
+  0x0509   SceneMode                            int16u
+  0x050a   NoiseReduction                       int16u
+  0x050b   DistortionCorrection                 int16u
+  0x050c   ShadingCompensation                  int16u
+  0x050d   CompressionFactor                    rational64u
+  0x050f   Gradation                            int16s[n]
+  0x0520   PictureMode                          int16u[n]
+  0x0521   PictureModeSaturation                int16s[3]
+  0x0522   PictureModeHue?                      int16s
+  0x0523   PictureModeContrast                  int16s[3]
+  0x0524   PictureModeSharpness                 int16s[3]
+  0x0525   PictureModeBWFilter                  int16s
+  0x0526   PictureModeTone                      int16s
+  0x0527   NoiseFilter                          int16s[3]
+  0x0529   ArtFilter                            int16u[4]
+  0x052c   MagicFilter                          int16u[4]
+  0x0600   DriveMode                            int16u[n]~
+  0x0601   PanoramaMode                         int16u~
+  0x0603   ImageQuality2                        int16u
+  0x0604   ImageStabilization                   int32u
+  0x0900   ManometerPressure                    int16u
+  0x0901   ManometerReading                     int32s[2]
+  0x0902   ExtendedWBDetect                     int16u
+  0x0903   LevelGaugeRoll                       int16u
+  0x0904   LevelGaugePitch                      int16u
+
+=head3 Olympus RawDevelopment Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0000   RawDevVersion                        undef[4]
+  0x0100   RawDevExposureBiasValue              rational64s
+  0x0101   RawDevWhiteBalanceValue              int16u
+  0x0102   RawDevWBFineAdjustment               int16s
+  0x0103   RawDevGrayPoint                      int16u[3]
+  0x0104   RawDevSaturationEmphasis             int16s[3]
+  0x0105   RawDevMemoryColorEmphasis            int16u
+  0x0106   RawDevContrastValue                  int16s[3]
+  0x0107   RawDevSharpnessValue                 int16s[3]
+  0x0108   RawDevColorSpace                     int16u
+  0x0109   RawDevEngine                         int16u
+  0x010a   RawDevNoiseReduction                 int16u
+  0x010b   RawDevEditStatus                     int16u
+  0x010c   RawDevSettings                       int16u
+
+=head3 Olympus RawDevelopment2 Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0000   RawDevVersion                        undef[4]
+  0x0100   RawDevExposureBiasValue              rational64s
+  0x0101   RawDevWhiteBalance                   int16u
+  0x0102   RawDevWhiteBalanceValue              int16u
+  0x0103   RawDevWBFineAdjustment               int16s
+  0x0104   RawDevGrayPoint                      int16u[3]
+  0x0105   RawDevContrastValue                  int16s[3]
+  0x0106   RawDevSharpnessValue                 int16s[3]
+  0x0107   RawDevSaturationEmphasis             int16s[3]
+  0x0108   RawDevMemoryColorEmphasis            int16u
+  0x0109   RawDevColorSpace                     int16u
+  0x010a   RawDevNoiseReduction                 int16u
+  0x010b   RawDevEngine                         int16u
+  0x010c   RawDevPictureMode                    int16u
+  0x010d   RawDevPMSaturation                   int16s[3]
+  0x010e   RawDevPMContrast                     int16s[3]
+  0x010f   RawDevPMSharpness                    int16s[3]
+  0x0110   RawDevPM_BWFilter                    int16u
+  0x0111   RawDevPMPictureTone                  int16u
+  0x0112   RawDevGradation                      int16s[3]
+  0x0113   RawDevSaturation3                    int16s[3]
+  0x0119   RawDevAutoGradation                  int16u
+  0x0120   RawDevPMNoiseFilter                  int16u
+
+=head3 Olympus ImageProcessing Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0000   ImageProcessingVersion               undef[4]
+  0x0100   WB_RBLevels                          int16u[2]
+  0x0102   WB_RBLevels3000K                     int16u[2]
+  0x0103   WB_RBLevels3300K                     int16u[2]
+  0x0104   WB_RBLevels3600K                     int16u[2]
+  0x0105   WB_RBLevels3900K                     int16u[2]
+  0x0106   WB_RBLevels4000K                     int16u[2]
+  0x0107   WB_RBLevels4300K                     int16u[2]
+  0x0108   WB_RBLevels4500K                     int16u[2]
+  0x0109   WB_RBLevels4800K                     int16u[2]
+  0x010a   WB_RBLevels5300K                     int16u[2]
+  0x010b   WB_RBLevels6000K                     int16u[2]
+  0x010c   WB_RBLevels6600K                     int16u[2]
+  0x010d   WB_RBLevels7500K                     int16u[2]
+  0x010e   WB_RBLevelsCWB1                      int16u[2]
+  0x010f   WB_RBLevelsCWB2                      int16u[2]
+  0x0110   WB_RBLevelsCWB3                      int16u[2]
+  0x0111   WB_RBLevelsCWB4                      int16u[2]
+  0x0113   WB_GLevel3000K                       int16u
+  0x0114   WB_GLevel3300K                       int16u
+  0x0115   WB_GLevel3600K                       int16u
+  0x0116   WB_GLevel3900K                       int16u
+  0x0117   WB_GLevel4000K                       int16u
+  0x0118   WB_GLevel4300K                       int16u
+  0x0119   WB_GLevel4500K                       int16u
+  0x011a   WB_GLevel4800K                       int16u
+  0x011b   WB_GLevel5300K                       int16u
+  0x011c   WB_GLevel6000K                       int16u
+  0x011d   WB_GLevel6600K                       int16u
+  0x011e   WB_GLevel7500K                       int16u
+  0x011f   WB_GLevel                            int16u
+  0x0200   ColorMatrix                          int16u[9]
+  0x0300   Enhancer                             int16u
+  0x0301   EnhancerValues                       int16u[7]
+  0x0310   CoringFilter                         int16u
+  0x0311   CoringValues                         int16u[7]
+  0x0600   BlackLevel2                          int16u[4]
+  0x0610   GainBase                             int16u
+  0x0611   ValidBits                            int16u[2]
+  0x0612   CropLeft                             int16u[2]
+  0x0613   CropTop                              int16u[2]
+  0x0614   CropWidth                            int32u
+  0x0615   CropHeight                           int32u
+  0x1010   NoiseReduction2                      int16u
+  0x1011   DistortionCorrection2                int16u
+  0x1012   ShadingCompensation2                 int16u
+  0x101c   MultipleExposureMode                 int16u[2]
+  0x1103   UnknownBlock?                        undef
+  0x1112   AspectRatio                          int8u[2]
+  0x1113   AspectFrame                          int16u[4]
+  0x1200   FacesDetected                        int32u[n]
+  0x1201   FaceDetectArea                       int16s[n]
+  0x1202   MaxFaces                             int32u[3]
+  0x1203   FaceDetectFrameSize                  int16u[6]
+  0x1207   FaceDetectFrameCrop                  int16s[12]
+
+=head3 Olympus FocusInfo Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0000   FocusInfoVersion                     undef[4]
+  0x0209   AutoFocus?                           int16u
+  0x0210   SceneDetect                          int16u
+  0x0211   SceneArea?                           int32u[8]
+  0x0212   SceneDetectData?                     int32u[720]
+  0x0300   ZoomStepCount                        int16u
+  0x0301   FocusStepCount                       int16u
+  0x0303   FocusStepInfinity                    int16u
+  0x0304   FocusStepNear                        int16u
+  0x0305   FocusDistance                        rational64u
+  0x0308   AFPoint                              int16u
+  0x1201   ExternalFlash                        int16u[2]
+  0x1203   ExternalFlashGuideNumber?            rational64s
+  0x1204   ExternalFlashBounce                  int16u
+  0x1205   ExternalFlashZoom                    rational64u
+  0x1208   InternalFlash                        int16u[n]
+  0x1209   ManualFlash                          int16u[2]~
+  0x1500   SensorTemperature                    int16s
+  0x1600   ImageStabilization                   undef~
+
+=head3 Olympus FE Tags
+
+Some FE models write a large number of tags here, but most of this
+information remains unknown.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0100   BodyFirmwareVersion                  string
+
+=head3 Olympus RawInfo Tags
+
+These tags are found only in ORF images of some models (ie. C8080WZ).
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0000   RawInfoVersion                       undef[4]
+  0x0100   WB_RBLevelsUsed                      int16u[2]
+  0x0110   WB_RBLevelsAuto                      int16u[2]
+  0x0120   WB_RBLevelsShade                     int16u[2]
+  0x0121   WB_RBLevelsCloudy                    int16u[2]
+  0x0122   WB_RBLevelsFineWeather               int16u[2]
+  0x0123   WB_RBLevelsTungsten                  int16u[2]
+  0x0124   WB_RBLevelsEveningSunlight           int16u[2]
+  0x0130   WB_RBLevelsDaylightFluor             int16u[2]
+  0x0131   WB_RBLevelsDayWhiteFluor             int16u[2]
+  0x0132   WB_RBLevelsCoolWhiteFluor            int16u[2]
+  0x0133   WB_RBLevelsWhiteFluorescent          int16u[2]
+  0x0200   ColorMatrix2                         int16u[9]
+  0x0310   CoringFilter                         int16u
+  0x0311   CoringValues                         int16u[11]
+  0x0600   BlackLevel2                          int16u[4]
+  0x0601   YCbCrCoefficients                    N
+  0x0611   ValidPixelDepth                      int16u[2]
+  0x0612   CropLeft                             int16u
+  0x0613   CropTop                              int16u
+  0x0614   CropWidth                            int32u
+  0x0615   CropHeight                           int32u
+  0x1000   LightSource                          int16u
+  0x1001   WhiteBalanceComp                     int16s[3]
+  0x1010   SaturationSetting                    int16s[3]
+  0x1011   HueSetting                           int16s[3]
+  0x1012   ContrastSetting                      int16s[3]
+  0x1013   SharpnessSetting                     int16s[3]
+  0x2000   CMExposureCompensation               rational64s
+  0x2001   CMWhiteBalance                       int16u
+  0x2002   CMWhiteBalanceComp                   int16s
+  0x2010   CMWhiteBalanceGrayPoint              int16u[3]
+  0x2020   CMSaturation                         int16s[3]
+  0x2021   CMHue                                int16s[3]
+  0x2022   CMContrast                           int16s[3]
+  0x2023   CMSharpness                          int16s[3]
+
+=head3 Olympus UnknownInfo Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  [no tags known]
+
+=head3 Olympus MOV1 Tags
+
+This information is found in MOV videos from Olympus models such as the
+D540Z, D595Z, FE100, FE110, FE115, FE170 and FE200.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    Make                                 N
+     24    Model                                N
+     38    ExposureUnknown?                     N
+     42    FNumber                              N
+     50    ExposureCompensation                 N
+     72    FocalLength                          N
+
+=head3 Olympus MOV2 Tags
+
+This information is found in MOV videos from Olympus models such as the
+FE120, FE140 and FE190.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    Make                                 N
+     24    Model                                N
+     54    ExposureTime                         N
+     58    FNumber                              N
+     66    ExposureCompensation                 N
+     88    FocalLength                          N
+    193    ISO                                  N
+
+=head3 Olympus MP4 Tags
+
+This information is found in MP4 videos from Olympus models such as the
+u7040 and u9010.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    Make                                 N
+     24    Model                                N
+     40    FNumber                              N
+     48    ExposureCompensation                 N
+
+=head3 Olympus AVI Tags
+
+This information is found in Olympus AVI videos.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+     18    Make                                 N
+     44    ModelType                            N
+     94    FNumber                              N
+    131    DateTime1                            N
+    157    DateTime2                            N
+    301    ThumbnailLength                      N
+    305    ThumbnailImage                       N
+
+=head3 Olympus WAV Tags
+
+This information is found in WAV files from Olympus PCM linear recorders
+like the LS-5, LS-10, LS-11.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+     12    Model                                N
+     28    FileNumber                           N
+     38    DateTimeOriginal                     N
+     50    DateTimeEnd                          N
+     62    RecordingTime                        N
+    512    Duration                             N
+    522    Index01                              N
+    532    Index02                              N
+    542    Index03                              N
+    552    Index04                              N
+    562    Index05                              N
+    572    Index06                              N
+    582    Index07                              N
+    592    Index08                              N
+    602    Index09                              N
+    612    Index10                              N
+    622    Index11                              N
+    632    Index12                              N
+    642    Index13                              N
+    652    Index14                              N
+    662    Index15                              N
+    672    Index16                              N
+
+=head2 Panasonic Tags
+
+These tags are used in Panasonic/Leica cameras.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0001   ImageQuality                         int16u
+  0x0002   FirmwareVersion                      undef
+  0x0003   WhiteBalance                         int16u
+  0x0007   FocusMode                            int16u
+  0x000f   AFAreaMode                           int8u[2]
+  0x001a   ImageStabilization                   int16u
+  0x001c   MacroMode                            int16u
+  0x001f   ShootingMode                         int16u
+  0x0020   Audio                                int16u
+  0x0021   DataDump                             N
+  0x0023   WhiteBalanceBias                     int16s
+  0x0024   FlashBias                            int16s
+  0x0025   InternalSerialNumber                 undef[16]
+  0x0026   PanasonicExifVersion                 undef
+  0x0028   ColorEffect                          int16u
+  0x0029   TimeSincePowerOn                     int32u
+  0x002a   BurstMode                            int16u
+  0x002b   SequenceNumber                       int32u
+  0x002c   ContrastMode                         int16u
+  0x002d   NoiseReduction                       int16u
+  0x002e   SelfTimer                            int16u
+  0x0030   Rotation                             int16u
+  0x0031   AFAssistLamp                         int16u
+  0x0032   ColorMode                            int16u
+  0x0033   BabyAge                              string
+  0x0034   OpticalZoomMode                      int16u
+  0x0035   ConversionLens                       int16u
+  0x0036   TravelDay                            int16u
+  0x0039   Contrast                             int16u
+  0x003a   WorldTimeLocation                    int16u
+  0x003b   TextStamp                            int16u
+  0x003c   ProgramISO                           int16u
+  0x003d   AdvancedSceneMode                    int16u
+  0x003e   TextStamp                            int16u
+  0x003f   FacesDetected                        int16u
+  0x0040   Saturation                           int16u
+  0x0041   Sharpness                            int16u
+  0x0042   FilmMode                             int16u
+  0x0046   WBAdjustAB                           int16u
+  0x0047   WBAdjustGM                           int16u
+  0x004b   PanasonicImageWidth                  int32u
+  0x004c   PanasonicImageHeight                 int32u
+  0x004d   AFPointPosition                      rational64u[2]
+  0x004e   FaceDetInfo                          Panasonic FaceDetInfo
+  0x0051   LensType                             string
+  0x0052   LensSerialNumber                     string
+  0x0053   AccessoryType                        string
+  0x0059   Transform                            undef[4]
+  0x005d   IntelligentExposure                  int16u
+  0x0061   FaceRecInfo                          Panasonic FaceRecInfo
+  0x0062   FlashWarning                         int16u
+  0x0063   RecognizedFaceFlags?                 undef[4]
+  0x0065   Title                                undef
+  0x0066   BabyName                             undef
+  0x0067   Location                             undef
+  0x0069   Country                              undef
+  0x006b   State                                undef
+  0x006d   City                                 undef
+  0x006f   Landmark                             undef
+  0x0070   IntelligentResolution                int8u
+  0x0079   IntelligentD-Range                   int16u
+  0x0e00   PrintIM                              PrintIM
+  0x8000   MakerNoteVersion                     undef
+  0x8001   SceneMode                            int16u
+  0x8004   WBRedLevel                           int16u
+  0x8005   WBGreenLevel                         int16u
+  0x8006   WBBlueLevel                          int16u
+  0x8007   FlashFired                           int16u
+  0x8008   TextStamp                            int16u
+  0x8009   TextStamp                            int16u
+  0x8010   BabyAge                              string
+  0x8012   Transform                            undef[4]
+
+=head3 Panasonic FaceDetInfo Tags
+
+Face detection position information.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    NumFacePositions                     int16u
+      1    Face1Position                        int16u[4]
+      5    Face2Position                        int16u[4]
+      9    Face3Position                        int16u[4]
+     13    Face4Position                        int16u[4]
+     17    Face5Position                        int16u[4]
+
+=head3 Panasonic FaceRecInfo Tags
+
+Tags written by cameras with facial recognition.  These cameras not only
+detect faces in an image, but also recognize specific people based a
+user-supplied set of known faces.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    FacesRecognized                      int16u
+      4    RecognizedFace1Name                  string[20]
+     24    RecognizedFace1Position              int16u[4]
+     32    RecognizedFace1Age                   string[20]
+     52    RecognizedFace2Name                  string[20]
+     72    RecognizedFace2Position              int16u[4]
+     80    RecognizedFace2Age                   string[20]
+    100    RecognizedFace3Name                  string[20]
+    120    RecognizedFace3Position              int16u[4]
+    128    RecognizedFace3Age                   string[20]
+
+=head3 Panasonic Leica2 Tags
+
+These tags are used by the Leica M8.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0300   Quality                              int16u
+  0x0302   UserProfile                          int32u
+  0x0303   SerialNumber                         int32u
+  0x0304   WhiteBalance                         int16u
+  0x0310   LensInfo                             Panasonic LensInfo
+  0x0311   ExternalSensorBrightnessValue        rational64s
+  0x0312   MeasuredLV                           rational64s
+  0x0313   ApproximateFNumber                   rational64u
+  0x0320   CameraTemperature                    int32s
+  0x0321   ColorTemperature                     int32u
+  0x0322   WBRedLevel                           rational64u
+  0x0323   WBGreenLevel                         rational64u
+  0x0324   WBBlueLevel                          rational64u
+  0x0325   UV-IRFilterCorrection                int32u
+  0x0330   CCDVersion                           int32u
+  0x0331   CCDBoardVersion                      int32u
+  0x0332   ControllerBoardVersion               int32u
+  0x0333   M16CVersion                          int32u
+  0x0340   ImageIDNumber                        int32u
+
+=head3 Panasonic LensInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    LensType                             int32u & 0xfffffffc
+    0.1    FrameSelector                        int32u & 0x03
+
+=head3 Panasonic Leica3 Tags
+
+These tags are used by the Leica R8 and R9 digital backs.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x000d   WB_RGBLevels                         int16u[3]
+
+=head3 Panasonic Leica4 Tags
+
+This information is written by the M9.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x3000   Subdir3000                           Panasonic Subdir
+  0x3100   Subdir3100                           Panasonic Subdir
+  0x3400   Subdir3400                           Panasonic Subdir
+  0x3900   Subdir3900                           Panasonic Subdir
+
+=head3 Panasonic Subdir Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x300a   Contrast                             int32u
+  0x300b   Sharpening                           int32u
+  0x300d   Saturation                           int32u
+  0x3033   WhiteBalance                         int32u
+  0x3034   JPEGQuality                          int32u
+  0x3036   WB_RGBLevels                         rational64u[3]
+  0x3038   UserProfile                          string
+  0x303a   JPEGSize                             int32u
+  0x3103   SerialNumber                         string
+  0x3109   FirmwareVersion                      string
+  0x312a   BaseISO                              int32u
+  0x312b   SensorWidth                          int32u
+  0x312c   SensorHeight                         int32u
+  0x312d   SensorBitDepth                       int32u
+  0x3402   CameraTemperature                    int32s
+  0x3405   LensType                             int32u
+  0x3406   ApproximateFNumber                   rational64u
+  0x3407   MeasuredLV                           int32s
+  0x3408   ExternalSensorBrightnessValue        int32s
+  0x3901   Data1                                Panasonic Data1
+  0x3902   Data2                                Panasonic Data2
+
+=head3 Panasonic Data1 Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+     22    LensType                             int32u[0.25]
+
+=head3 Panasonic Data2 Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+  [no tags known]
+
+=head3 Panasonic Leica5 Tags
+
+This information is written by the X1.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0407   OriginalFileName                     string
+  0x0408   OriginalDirectory                    string
+  0x040d   ExposureMode                         int8u[4]
+  0x0412   FilmMode                             string
+  0x0413   WB_RGBLevels                         rational64u[3]
+
+=head3 Panasonic Leica6 Tags
+
+This information is written by the S2 (as a trailer in JPEG images).
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0300   PreviewImage                         undef
+  0x0301   UnknownBlock?                        N
+  0x0303   LensType                             string
+
+=head3 Panasonic Type2 Tags
+
+This type of maker notes is used by models such as the NV-DS65, PV-D2002,
+PV-DC3000, PV-DV203, PV-DV401, PV-DV702, PV-L2001, PV-SD4090, PV-SD5000 and
+iPalm.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    MakerNoteType                        N
+      3    Gain                                 N
+
+=head2 Pentax Tags
+
+These tags are used in Pentax/Asahi cameras.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0000   PentaxVersion                        int8u[4]
+  0x0001   PentaxModelType                      int16u
+  0x0002   PreviewImageSize                     int16u[2]~
+  0x0003   PreviewImageLength                   int32u*
+  0x0004   PreviewImageStart                    int32u*
+  0x0005   PentaxModelID                        int32u
+  0x0006   Date                                 undef[4]
+  0x0007   Time                                 undef[3]
+  0x0008   Quality                              int16u
+  0x0009   PentaxImageSize                      int16u
+  0x000b   PictureMode                          int16u[n]
+  0x000c   FlashMode                            int16u[n]
+  0x000d   FocusMode                            int16u
+  0x000e   AFPointSelected                      int16u
+  0x000f   AFPointsInFocus                      int16u
+  0x0010   FocusPosition                        int16u
+  0x0012   ExposureTime                         int32u
+  0x0013   FNumber                              int16u
+  0x0014   ISO                                  int16u
+  0x0015   LightReading                         int16u
+  0x0016   ExposureCompensation                 int16u
+  0x0017   MeteringMode                         int16u
+  0x0018   AutoBracketing                       int16u[n]
+  0x0019   WhiteBalance                         int16u
+  0x001a   WhiteBalanceMode                     int16u
+  0x001b   BlueBalance                          int16u
+  0x001c   RedBalance                           int16u
+  0x001d   FocalLength                          int32u
+  0x001e   DigitalZoom                          int16u
+  0x001f   Saturation                           int16u[n]
+  0x0020   Contrast                             int16u[n]
+  0x0021   Sharpness                            int16u[n]
+  0x0022   WorldTimeLocation                    int16u
+  0x0023   HometownCity                         int16u
+  0x0024   DestinationCity                      int16u
+  0x0025   HometownDST                          int16u
+  0x0026   DestinationDST                       int16u
+  0x0027   DSPFirmwareVersion                   undef
+  0x0028   CPUFirmwareVersion                   undef
+  0x0029   FrameNumber                          int32u
+  0x002d   EffectiveLV                          int16u
+  0x0032   ImageEditing                         undef[4]
+  0x0033   PictureMode                          int8u[3]
+  0x0034   DriveMode                            int8u[4]
+  0x0035   SensorSize                           int16u[2]
+  0x0037   ColorSpace                           int16u
+  0x0038   ImageAreaOffset                      int16u[2]
+  0x0039   RawImageSize                         int16u[2]~
+  0x003c   AFPointsInFocus                      N
+  0x003e   PreviewImageBorders                  int8u[4]
+  0x003f   LensType                             int8u[2]
+  0x0040   SensitivityAdjust                    int16u
+  0x0041   ImageEditCount                       int16u
+  0x0047   CameraTemperature                    int8s
+  0x0048   AELock                               int16u
+  0x0049   NoiseReduction                       int16u
+  0x004d   FlashExposureComp                    int32s
+  0x004f   ImageTone                            int16u
+  0x0050   ColorTemperature                     int16u
+  0x005c   ShakeReductionInfo                   Pentax SRInfo
+  0x005d   ShutterCount                         undef[4]
+  0x0060   FaceInfo                             Pentax FaceInfo
+  0x0067   Hue                                  int16u
+  0x0068   AWBInfo                              Pentax AWBInfo
+  0x0069   DynamicRangeExpansion                undef[4]
+  0x006b   TimeInfo                             Pentax TimeInfo
+  0x006c   HighLowKeyAdj                        int16s[2]
+  0x006d   ContrastHighlight                    int16s[2]
+  0x006e   ContrastShadow                       int16s[2]
+  0x006f   ContrastHighlightShadowAdj           int8u
+  0x0070   FineSharpness                        int8u[n]
+  0x0071   HighISONoiseReduction                int8u
+  0x0072   AFAdjustment                         int16s
+  0x0073   MonochromeFilterEffect               int16u
+  0x0074   MonochromeToning                     int16u
+  0x0076   FaceDetect                           int8u[2]
+  0x0077   FaceDetectFrameSize                  int16u[2]
+  0x0079   ShadowCompensation                   int8u[n]
+  0x007a   ISOAutoParameters                    int8u[2]
+  0x007b   CrossProcess                         int8u
+  0x007d   LensCorr                             Pentax LensCorr
+  0x007f   BleachBypassToning                   int16u
+  0x0200   BlackPoint                           int16u[4]
+  0x0201   WhitePoint                           int16u[4]
+  0x0203   ColorMatrixA                         int16s[9]
+  0x0204   ColorMatrixB                         int16s[9]
+  0x0205   CameraSettings                       Pentax CameraSettings
+  0x0206   AEInfo                               Pentax AEInfo
+  0x0207   LensInfo                             Pentax LensInfo
+                                                Pentax LensInfo2
+                                                Pentax LensInfo3
+                                                Pentax LensInfo4
+  0x0208   FlashInfo                            Pentax FlashInfo
+           FlashInfoUnknown                     Pentax FlashInfoUnknown
+  0x0209   AEMeteringSegments                   int8u[n]
+  0x020a   FlashMeteringSegments                int8u[n]
+  0x020b   SlaveFlashMeteringSegments           int8u[n]
+  0x020d   WB_RGGBLevelsDaylight                int16u[4]
+  0x020e   WB_RGGBLevelsShade                   int16u[4]
+  0x020f   WB_RGGBLevelsCloudy                  int16u[4]
+  0x0210   WB_RGGBLevelsTungsten                int16u[4]
+  0x0211   WB_RGGBLevelsFluorescentD            int16u[4]
+  0x0212   WB_RGGBLevelsFluorescentN            int16u[4]
+  0x0213   WB_RGGBLevelsFluorescentW            int16u[4]
+  0x0214   WB_RGGBLevelsFlash                   int16u[4]
+  0x0215   CameraInfo                           Pentax CameraInfo
+  0x0216   BatteryInfo                          Pentax BatteryInfo
+  0x021b   SaturationInfo?                      N
+  0x021f   AFInfo                               Pentax AFInfo
+  0x0220   HuffmanTable?                        N
+  0x0222   ColorInfo                            Pentax ColorInfo
+  0x0224   EVStepInfo                           Pentax EVStepInfo
+  0x0226   ShotInfo                             Pentax ShotInfo
+  0x0227   FacePos                              Pentax FacePos
+  0x0228   FaceSize                             Pentax FaceSize
+  0x0229   SerialNumber                         string
+  0x022a   FilterInfo                           Pentax FilterInfo
+  0x022b   LevelInfo                            Pentax LevelInfo
+  0x022e   Artist                               string
+  0x022f   Copyright                            string
+  0x0230   FirmwareVersion                      string
+  0x0231   ContrastDetectAFArea                 int16u[4]
+  0x0235   CrossProcessParams                   undef[10]
+  0x03fe   DataDump                             N
+  0x03ff   TempInfoK5                           Pentax TempInfoK5
+           UnknownInfo                          Pentax UnknownInfo
+  0x0402   ToneCurve                            Y~
+  0x0403   ToneCurves                           Y~
+  0x0e00   PrintIM                              PrintIM
+
+=head3 Pentax SRInfo Tags
+
+Shake reduction information.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    SRResult                             int8u
+      1    ShakeReduction                       int8u
+      2    SRHalfPressTime                      int8u
+      3    SRFocalLength                        int8u
+
+=head3 Pentax FaceInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    FacesDetected                        int8u
+      2    FacePosition                         int8u[2]
+
+=head3 Pentax AWBInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    WhiteBalanceAutoAdjustment           int8u
+      1    TungstenAWB                          int8u
+
+=head3 Pentax TimeInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+    0.1    WorldTimeLocation                    int8u & 0x01
+    0.2    HometownDST                          int8u & 0x02
+    0.3    DestinationDST                       int8u & 0x04
+      2    HometownCity                         int8u
+      3    DestinationCity                      int8u
+
+=head3 Pentax LensCorr Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    DistortionCorrection                 int8u
+      1    ChromaticAberrationCorrection        int8u
+
+=head3 Pentax CameraSettings Tags
+
+Shot information written by Pentax DSLR cameras.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    PictureMode2                         int8u
+    1.1    ProgramLine                          int8u & 0x03
+    1.2    EVSteps                              int8u & 0x20
+    1.3    E-DialInProgram                      int8u & 0x40
+    1.4    ApertureRingUse                      int8u & 0x80
+      2    FlashOptions                         int8u & 0xf0
+    2.1    MeteringMode2                        int8u & 0x0f
+      3    AFPointMode                          int8u & 0xf0
+    3.1    FocusMode2                           int8u & 0x0f
+      4    AFPointSelected2                     int16u
+      6    ISOFloor                             int8u
+      7    DriveMode2                           int8u
+      8    ExposureBracketStepSize              int8u
+      9    BracketShotNumber                    int8u
+     10    WhiteBalanceSet                      int8u & 0xf0
+   10.1    MultipleExposureSet                  int8u & 0x0f
+     13    RawAndJpgRecording                   int8u
+   14.1    JpgRecordedPixels                    int8u & 0x03
+   14.2    LinkAEToAFPoint                      int8u & 0x01
+   14.3    SensitivitySteps                     int8u & 0x02
+   14.4    ISOAuto                              int8u & 0x04
+     16    FlashOptions2                        int8u & 0xf0
+   16.1    MeteringMode3                        int8u & 0x0f
+   17.1    SRActive                             int8u & 0x80
+   17.2    Rotation                             int8u & 0x60
+   17.3    ISOSetting                           int8u & 0x04
+   17.4    SensitivitySteps                     int8u & 0x02
+     18    TvExposureTimeSetting                int8u
+     19    AvApertureSetting                    int8u
+     20    SvISOSetting                         int8u
+     21    BaseExposureCompensation             int8u
+
+=head3 Pentax AEInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    AEExposureTime                       int8u
+      1    AEAperture                           int8u
+      2    AE_ISO                               int8u
+      3    AEXv                                 int8u
+      4    AEBXv                                int8s
+      5    AEMinExposureTime                    int8u
+      6    AEProgramMode                        int8u
+      7    AEFlags?                             N
+      8    AEUnknown                            N
+      9    AEMaxAperture                        int8u
+     10    AEMaxAperture2                       int8u
+     11    AEMinAperture                        int8u
+     12    AEMeteringMode                       int8u
+     14    FlashExposureCompSet                 int8s
+
+=head3 Pentax LensInfo Tags
+
+Pentax lens information structure for models such as the *istD.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    LensType                             int8u[2]
+      3    LensData                             Pentax LensData
+
+=head3 Pentax LensInfo2 Tags
+
+Pentax lens information structure for models such as the K10D and K20D.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    LensType                             N
+      4    LensData                             Pentax LensData
+
+=head3 Pentax LensData Tags
+
+Pentax lens data information.  Some of these tags require interesting binary
+gymnastics to decode them into useful values.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+    0.1    AutoAperture                         int8u & 0x01
+    0.2    MinAperture                          int8u & 0x06
+    0.3    LensFStops                           int8u & 0x70
+      1    LensKind?                            int8u
+      2    LC1?                                 int8u
+      3    LC2?                                 int8u
+      4    LC3?                                 int8u
+      5    LC4?                                 int8u
+      6    LC5?                                 int8u
+      7    LC6?                                 int8u
+      8    LC7?                                 int8u
+      9    FocalLength                          int8u
+     10    NominalMaxAperture                   int8u & 0xf0
+   10.1    NominalMinAperture                   int8u & 0x0f
+     11    LC10?                                int8u
+     12    LC11?                                int8u
+     13    LC12?                                int8u
+   14.1    MaxAperture                          int8u & 0x7f
+     15    LC14?                                int8u
+     16    LC15?                                int8u
+
+=head3 Pentax LensInfo3 Tags
+
+Pentax lens information structure for 645D.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      1    LensType                             N
+     13    LensData                             Pentax LensData
+
+=head3 Pentax LensInfo4 Tags
+
+Pentax lens information structure for models such as the K-5 and K-r.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      1    LensType                             N
+     12    LensData                             Pentax LensData
+
+=head3 Pentax FlashInfo Tags
+
+Flash information tags for the K10D, K20D and K200D.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    FlashStatus                          int8u
+      1    InternalFlashMode                    int8u
+      2    ExternalFlashMode                    int8u
+      3    InternalFlashStrength                int8u
+      4    TTL_DA_AUp                           int8u
+      5    TTL_DA_ADown                         int8u
+      6    TTL_DA_BUp                           int8u
+      7    TTL_DA_BDown                         int8u
+   24.1    ExternalFlashGuideNumber             int8u & 0x1f
+     25    ExternalFlashExposureComp            int8u
+     26    ExternalFlashBounce                  int8u
+
+=head3 Pentax FlashInfoUnknown Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+  [no tags known]
+
+=head3 Pentax CameraInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    PentaxModelID                        int32u
+      1    ManufactureDate                      int32u
+      2    ProductionCode                       int32u[2]
+      4    InternalSerialNumber                 int32u
+
+=head3 Pentax BatteryInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+    0.1    PowerSource                          int8u & 0x0f
+    1.1    BodyBatteryState                     int8u & 0xf0
+    1.2    GripBatteryState                     int8u & 0x0f
+           GripBatteryState?                    int8u & 0x0f
+      2    BodyBatteryADNoLoad                  int8u
+           BodyBatteryVoltage1                  int16u
+      3    BodyBatteryADLoad                    int8u
+      4    GripBatteryADNoLoad                  int8u
+           BodyBatteryVoltage2                  int16u
+      5    GripBatteryADLoad                    int8u
+      6    BodyBatteryVoltage3                  int16u
+      8    BodyBatteryVoltage4                  int16u
+
+=head3 Pentax AFInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    AFPointsUnknown1?                    int16u
+      2    AFPointsUnknown2?                    int16u
+      4    AFPredictor                          int16s
+      6    AFDefocus                            int8u
+      7    AFIntegrationTime                    int8u
+     11    AFPointsInFocus                      int8u
+
+=head3 Pentax ColorInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+     16    WBShiftAB                            int8s
+     17    WBShiftMG                            int8s
+
+=head3 Pentax EVStepInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    EVSteps                              int8u
+      1    SensitivitySteps                     int8u
+
+=head3 Pentax ShotInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      1    CameraOrientation                    int8u
+
+=head3 Pentax FacePos Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    Face1Position                        int16u[2]
+      2    Face2Position                        int16u[2]
+      4    Face3Position                        int16u[2]
+      6    Face4Position                        int16u[2]
+      8    Face5Position                        int16u[2]
+     10    Face6Position                        int16u[2]
+     12    Face7Position                        int16u[2]
+     14    Face8Position                        int16u[2]
+     16    Face9Position                        int16u[2]
+     18    Face10Position                       int16u[2]
+     20    Face11Position                       int16u[2]
+     22    Face12Position                       int16u[2]
+     24    Face13Position                       int16u[2]
+     26    Face14Position                       int16u[2]
+     28    Face15Position                       int16u[2]
+     30    Face16Position                       int16u[2]
+     32    Face17Position                       int16u[2]
+     34    Face18Position                       int16u[2]
+     36    Face19Position                       int16u[2]
+     38    Face20Position                       int16u[2]
+     40    Face21Position                       int16u[2]
+     42    Face22Position                       int16u[2]
+     44    Face23Position                       int16u[2]
+     46    Face24Position                       int16u[2]
+     48    Face25Position                       int16u[2]
+     50    Face26Position                       int16u[2]
+     52    Face27Position                       int16u[2]
+     54    Face28Position                       int16u[2]
+     56    Face29Position                       int16u[2]
+     58    Face30Position                       int16u[2]
+     60    Face31Position                       int16u[2]
+     62    Face32Position                       int16u[2]
+
+=head3 Pentax FaceSize Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    Face1Size                            int16u[2]
+      2    Face2Size                            int16u[2]
+      4    Face3Size                            int16u[2]
+      6    Face4Size                            int16u[2]
+      8    Face5Size                            int16u[2]
+     10    Face6Size                            int16u[2]
+     12    Face7Size                            int16u[2]
+     14    Face8Size                            int16u[2]
+     16    Face9Size                            int16u[2]
+     18    Face10Size                           int16u[2]
+     20    Face11Size                           int16u[2]
+     22    Face12Size                           int16u[2]
+     24    Face13Size                           int16u[2]
+     26    Face14Size                           int16u[2]
+     28    Face15Size                           int16u[2]
+     30    Face16Size                           int16u[2]
+     32    Face17Size                           int16u[2]
+     34    Face18Size                           int16u[2]
+     36    Face19Size                           int16u[2]
+     38    Face20Size                           int16u[2]
+     40    Face21Size                           int16u[2]
+     42    Face22Size                           int16u[2]
+     44    Face23Size                           int16u[2]
+     46    Face24Size                           int16u[2]
+     48    Face25Size                           int16u[2]
+     50    Face26Size                           int16u[2]
+     52    Face27Size                           int16u[2]
+     54    Face28Size                           int16u[2]
+     56    Face29Size                           int16u[2]
+     58    Face30Size                           int16u[2]
+     60    Face31Size                           int16u[2]
+     62    Face32Size                           int16u[2]
+
+=head3 Pentax FilterInfo Tags
+
+The parameters associated with each type of digital filter are unique, and
+these settings are also extracted with the DigitalFilter tag.  Information
+is not extracted for filters that are "Off" unless the Unknown option is
+used.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    SourceDirectoryIndex                 int16u
+      2    SourceFileIndex                      int16u
+      5    DigitalFilter01                      undef[17]
+     22    DigitalFilter02                      undef[17]
+     39    DigitalFilter03                      undef[17]
+     56    DigitalFilter04                      undef[17]
+     73    DigitalFilter05                      undef[17]
+     90    DigitalFilter06                      undef[17]
+    107    DigitalFilter07                      undef[17]
+    124    DigitalFilter08                      undef[17]
+    141    DigitalFilter09                      undef[17]
+    158    DigitalFilter10                      undef[17]
+    175    DigitalFilter11                      undef[17]
+    192    DigitalFilter12                      undef[17]
+    209    DigitalFilter13                      undef[17]
+    226    DigitalFilter14                      undef[17]
+    243    DigitalFilter15                      undef[17]
+    260    DigitalFilter16                      undef[17]
+    277    DigitalFilter17                      undef[17]
+    294    DigitalFilter18                      undef[17]
+    311    DigitalFilter19                      undef[17]
+    328    DigitalFilter20                      undef[17]
+
+=head3 Pentax LevelInfo Tags
+
+Tags decoded from the electronic level information.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    LevelOrientation                     int8s & 0x0f
+    0.1    CompositionAdjust                    int8s & 0xf0
+      1    RollAngle                            int8s
+      2    PitchAngle                           int8s
+      5    CompositionAdjustX                   int8s
+      6    CompositionAdjustY                   int8s
+      7    CompositionAdjustRotation            int8s
+
+=head3 Pentax TempInfoK5 Tags
+
+A number of additional temperature readings are extracted from this 256-byte
+binary-data block in images from the K-5.  It is not currently known where
+the corresponding temperature sensors are located in the camera.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+     12    CameraTemperature2                   int16s
+     14    CameraTemperature3                   int16s
+     20    CameraTemperature4                   int16s
+     22    CameraTemperature5                   int16s
+
+=head3 Pentax UnknownInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+  [no tags known]
+
+=head3 Pentax Type2 Tags
+
+These tags are used by the Pentax Optio 330 and 430, and are similar to the
+tags used by Casio.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0001   RecordingMode                        int16u
+  0x0002   Quality                              int16u
+  0x0003   FocusMode                            int16u
+  0x0004   FlashMode                            int16u
+  0x0007   WhiteBalance                         int16u
+  0x000a   DigitalZoom                          int32u
+  0x000b   Sharpness                            int16u
+  0x000c   Contrast                             int16u
+  0x000d   Saturation                           int16u
+  0x0014   ISO                                  int16u
+  0x0017   ColorFilter                          int16u
+  0x0e00   PrintIM                              PrintIM
+  0x1000   HometownCityCode                     undef[4]
+  0x1001   DestinationCityCode                  undef[4]
+
+=head3 Pentax Type4 Tags
+
+The following few tags are extracted from the wealth of information
+available in maker notes of the Optio E20 and E25.  These maker notes are
+stored as ASCII text in a format very similar to some HP models.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'F/W Version'        FirmwareVersion          N
+
+=head3 Pentax MOV Tags
+
+This information is found in Pentax MOV videos.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    Make                                 N
+     38    ExposureTime                         N
+     42    FNumber                              N
+     50    ExposureCompensation                 N
+     68    WhiteBalance                         N
+     72    FocalLength                          N
+    175    ISO                                  N
+
+=head3 Pentax Junk Tags
+
+Tags found in the JUNK chunk of AVI videos from the RS1000.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+     12    Model                                N
+
+=head3 Pentax AVI Tags
+
+Pentax-specific RIFF tags found in AVI videos.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'hymn'   MakerNotes                           Pentax
+
+=head2 Reconyx Tags
+
+The following tags are extracted from the maker notes of Reconyx Hyperfire
+cameras such as the HC500, HC600 and PC900.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    MakerNoteVersion                     N
+      1    FirmwareVersion                      N
+      4    FirmwareDate                         int16u[2]
+      6    TriggerMode                          string[2]
+      7    Sequence                             int16u[2]
+      9    EventNumber                          int16u[2]
+     11    DateTimeOriginal                     int16u[6]
+     18    MoonPhase                            int16u
+     19    AmbientTemperatureFahrenheit         int16u
+     20    AmbientTemperature                   int16u
+     21    SerialNumber                         undef[30]
+     36    Contrast                             int16u
+     37    Brightness                           int16u
+     38    Sharpness                            int16u
+     39    Saturation                           int16u
+     40    InfraredIlluminator                  int16u
+     41    MotionSensitivity                    int16u
+     42    BatteryVoltage                       int16u
+     43    UserLabel                            string[22]
+
+=head2 Ricoh Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0001   MakerNoteType                        string
+  0x0002   FirmwareVersion                      string
+  0x0005   SerialNumber                         undef[16]
+           InternalSerialNumber                 undef[16]
+  0x0e00   PrintIM                              PrintIM
+  0x1001   ImageInfo                            Ricoh ImageInfo
+  0x1003   Sharpness                            int32u
+  0x2001   RicohSubdir                          Ricoh Subdir
+           RicohRR1Subdir                       Ricoh Subdir
+
+=head3 Ricoh ImageInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    RicohImageWidth                      int16u
+      2    RicohImageHeight                     int16u
+      6    RicohDate                            int8u[7]
+     28    PreviewImageStart                    int16u*
+     30    PreviewImageLength                   int16u*
+     32    FlashMode                            int8u
+     33    Macro                                int8u
+     34    Sharpness                            int8u
+     38    WhiteBalance                         int8u
+     39    ISOSetting                           int8u
+     40    Saturation                           int8u
+
+=head3 Ricoh Subdir Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0004   ManufactureDate1                     string[20]
+  0x0005   ManufactureDate2                     string[20]
+  0x001a   FaceInfo                             Ricoh FaceInfo
+  0x0029   FirmwareInfo                         Ricoh FirmwareInfo
+  0x002a   NoiseReduction                       int32u
+  0x002c   SerialInfo                           Ricoh SerialInfo
+
+=head3 Ricoh FaceInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+    181    FacesDetected                        int8u
+    182    FaceDetectFrameSize                  int16u[2]
+    188    Face1Position                        int16u[4]
+    200    Face2Position                        int16u[4]
+    212    Face3Position                        int16u[4]
+    224    Face4Position                        int16u[4]
+    236    Face5Position                        int16u[4]
+    248    Face6Position                        int16u[4]
+    260    Face7Position                        int16u[4]
+    272    Face8Position                        int16u[4]
+
+=head3 Ricoh FirmwareInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    FirmwareRevision                     string[12]
+     12    FirmwareRevision2                    string[12]
+
+=head3 Ricoh SerialInfo Tags
+
+This information is found in images from the GXR.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    BodyFirmware                         string[16]
+     16    BodySerialNumber                     string[16]
+     32    LensFirmware                         string[16]
+     48    LensSerialNumber                     string[16]
+
+=head3 Ricoh Text Tags
+
+Some Ricoh DC and RDC models use a text-based format for their maker notes
+instead of the IFD format used by the Caplio models.  Below is a list of known
+tags in this information.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'Bg'     BlueGain                             N
+  'Gg'     GreenGain                            N
+  'Rev'    FirmwareVersion                      N
+  'Rg'     RedGain                              N
+  'Rv'     FirmwareVersion                      N
+
+=head3 Ricoh RMETA Tags
+
+The Ricoh Caplio Pro G3 has the ability to add custom fields to the APP5
+"RMETA" segment of JPEG images.  While only a few observed tags have been
+defined below, ExifTool will extract any information found here.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'Azimuth'            Azimuth                  N
+  'Condition'          Condition                N
+  'Lit'                Lit                      N
+  'Location'           Location                 N
+  'Sign type'          SignType                 N
+
+=head3 Ricoh AVI Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'mnrt'   MakerNoteRicoh                       Ricoh
+  'rdc2'   RicohRDC2?                           N
+  'thum'   ThumbnailImage                       N
+  'ucmt'   Comment                              N
+
+=head2 Samsung Tags
+
+=head3 Samsung Type1 Tags
+
+Tags found in the binary "STMN" format maker notes written by a number of
+Samsung models.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    MakerNoteVersion                     undef[8]
+      2    PreviewImageStart                    int32u*
+      3    PreviewImageLength                   int32u*
+
+=head3 Samsung Type2 Tags
+
+Tags found in the EXIF-format maker notes of newer Samsung models.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0001   MakerNoteVersion                     undef[4]
+  0x0021   PictureWizard                        int16u[5]
+  0x0030   LocalLocationName                    string
+  0x0031   LocationName                         string
+  0x0035   PreviewIFD                           Nikon PreviewIFD
+  0x0043   CameraTemperature                    rational64s
+  0xa001   FirmwareName                         string
+  0xa003   LensType                             int16u
+  0xa004   LensFirmware                         string
+  0xa010   SensorAreas                          int32u[8]
+  0xa011   ColorSpace                           int16u
+  0xa012   SmartRange                           int16u
+  0xa013   ExposureCompensation                 rational64s
+  0xa014   ISO                                  int32u
+  0xa018   ExposureTime                         rational64u
+  0xa019   FNumber                              rational64u
+  0xa01a   FocalLengthIn35mmFormat              int32u
+  0xa020   EncryptionKey                        int32u[11]!
+  0xa021   WB_RGGBLevelsUncorrected             int32u[4]
+  0xa022   WB_RGGBLevelsAuto                    int32u[4]
+  0xa023   WB_RGGBLevelsIlluminator1            int32u[4]
+  0xa024   WB_RGGBLevelsIlluminator2            int32u[4]
+  0xa028   WB_RGGBLevelsBlack                   int32s[4]
+  0xa030   ColorMatrix                          int32s[9]
+  0xa031   ColorMatrixSRGB                      int32s[9]
+  0xa032   ColorMatrixAdobeRGB                  int32s[9]
+  0xa040   ToneCurve1                           int32u[23]
+  0xa041   ToneCurve2                           int32u[23]
+  0xa042   ToneCurve3                           int32u[23]
+  0xa043   ToneCurve4                           int32u[23]
+
+=head3 Samsung INFO Tags
+
+This information is found in MP4 videos from Samsung models such as the
+SMX-C20N.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'EFCT'   Effect                               N
+  'QLTY'   Quality                              N
+
+=head3 Samsung MP4 Tags
+
+This information is found in Samsung MP4 videos from models such as the
+WP10.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    Make                                 N
+     24    Model                                N
+     46    ExposureTime                         N
+     50    FNumber                              N
+     58    ExposureCompensation                 N
+    106    ISO                                  N
+    125    Software                             N
+    248    ThumbnailWidth                       N
+    252    ThumbnailHeight                      N
+    256    ThumbnailLength                      N
+    260    ThumbnailOffset                      N
+
+=head2 Sanyo Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x00ff   MakerNoteOffset                      int32u
+  0x0100   SanyoThumbnail                       undef
+  0x0200   SpecialMode                          int32u[3]
+  0x0201   SanyoQuality                         int16u
+  0x0202   Macro                                int16u
+  0x0204   DigitalZoom                          rational64u
+  0x0207   SoftwareVersion                      Y
+  0x0208   PictInfo                             Y
+  0x0209   CameraID                             Y
+  0x020e   SequentialShot                       int16u
+  0x020f   WideRange                            int16u
+  0x0210   ColorAdjustmentMode                  int16u
+  0x0213   QuickShot                            int16u
+  0x0214   SelfTimer                            int16u
+  0x0216   VoiceMemo                            int16u
+  0x0217   RecordShutterRelease                 int16u
+  0x0218   FlickerReduce                        int16u
+  0x0219   OpticalZoomOn                        int16u
+  0x021b   DigitalZoomOn                        int16u
+  0x021d   LightSourceSpecial                   int16u
+  0x021e   Resaved                              int16u
+  0x021f   SceneSelect                          int16u
+  0x0223   ManualFocusDistance                  rational64u
+           FaceInfo                             -
+  0x0224   SequenceShotInterval                 int16u
+  0x0225   FlashMode                            int16u
+  0x0e00   PrintIM                              PrintIM
+  0x0f00   DataDump                             N
+
+=head3 Sanyo FaceInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    FacesDetected                        int32u
+      4    FacePosition                         int32u[4]
+
+=head3 Sanyo MOV Tags
+
+This information is found in Sanyo MOV videos.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    Make                                 N
+     24    Model                                N
+     38    ExposureTime                         N
+     42    FNumber                              N
+     50    ExposureCompensation                 N
+     68    WhiteBalance                         N
+     72    FocalLength                          N
+
+=head3 Sanyo MP4 Tags
+
+This information is found in Sanyo MP4 videos.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    Make                                 N
+     24    Model                                N
+     50    FNumber                              N
+     58    ExposureCompensation                 N
+    106    ISO                                  N
+    209    Software                             N
+    210    Software                             N
+    253    ThumbnailLength                      N
+    254    ThumbnailLength                      N
+    257    ThumbnailOffset                      N
+    258    ThumbnailOffset                      N
+
+=head2 Sigma Tags
+
+These tags are used in Sigma/Foveon cameras.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0002   SerialNumber                         string
+  0x0003   DriveMode                            string
+  0x0004   ResolutionMode                       string
+  0x0005   AFMode                               string
+  0x0006   FocusSetting                         string
+  0x0007   WhiteBalance                         string
+  0x0008   ExposureMode                         string
+  0x0009   MeteringMode                         string
+  0x000a   LensFocalRange                       string
+  0x000b   ColorSpace                           string
+  0x000c   ExposureCompensation                 string
+           ExposureAdjust?                      rational64s
+  0x000d   Contrast                             string
+           Contrast                             rational64s
+  0x000e   Shadow                               string
+           Shadow                               rational64s
+  0x000f   Highlight                            string
+           Highlight                            rational64s
+  0x0010   Saturation                           string
+           Saturation                           rational64s
+  0x0011   Sharpness                            string
+           Sharpness                            rational64s
+  0x0012   X3FillLight                          string
+           X3FillLight                          rational64s
+  0x0014   ColorAdjustment                      string
+           ColorAdjustment                      rational64s[3]
+  0x0015   AdjustmentMode                       string
+  0x0016   Quality                              string
+  0x0017   Firmware                             string
+  0x0018   Software                             string
+  0x0019   AutoBracket                          string
+  0x001a   PreviewImageStart                    int32u*
+           ChrominanceNoiseReduction            string
+  0x001b   PreviewImageLength                   int32u*
+           LuminanceNoiseReduction              string
+  0x001c   PreviewImageSize                     int16u[2]
+  0x001d   MakerNoteVersion                     undef
+  0x001f   AFPoint                              string
+  0x0022   FileFormat                           string
+  0x0024   Calibration                          string
+  0x002c   ColorMode                            int32u
+  0x0030   LensApertureRange                    string
+  0x0031   FNumber                              rational64u
+  0x0032   ExposureTime                         rational64u
+  0x0033   ExposureTime2                        string
+  0x0034   BurstShot                            int32u
+  0x0035   ExposureCompensation                 rational64s
+  0x0039   SensorTemperature                    string
+  0x003a   FlashExposureComp                    rational64s
+  0x003b   Firmware                             string
+  0x003c   WhiteBalance                         string
+  0x003d   PictureMode                          string
+
+=head2 Sony Tags
+
+The maker notes in images from most recent Sony camera models contain a
+wealth of information, but for some models very little has been decoded. 
+Use the ExifTool Unknown (-u) or Verbose (-v) options to see information
+about the unknown tags.  Also see the Minolta tags which are used by some
+Sony models.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0102   Quality                              int32u
+  0x0104   FlashExposureComp                    rational64s
+  0x0105   Teleconverter                        int32u
+  0x0112   WhiteBalanceFineTune                 int32u
+  0x0114   CameraSettings                       Sony CameraSettings
+           CameraSettings2                      Sony CameraSettings2
+           CameraSettingsUnknown                Sony CameraSettingsUnknown
+  0x0115   WhiteBalance                         int32u
+  0x0e00   PrintIM                              PrintIM
+  0x1000   MultiBurstMode                       undef
+  0x1001   MultiBurstImageWidth                 int16u
+  0x1002   MultiBurstImageHeight                int16u
+  0x1003   Panorama                             Sony Panorama
+  0x2001   PreviewImage                         undef
+  0x2004   Contrast                             int32s
+  0x2005   Saturation                           int32s
+  0x2006   Sharpness                            int32s
+  0x2007   Brightness                           int32s
+  0x2008   LongExposureNoiseReduction           int32u
+  0x2009   HighISONoiseReduction                int16u
+  0x200a   HDR                                  int32u
+  0x200b   MultiFrameNoiseReduction             int32u
+  0x3000   ShotInfo                             Sony ShotInfo
+  0xb000   FileFormat                           int8u[4]
+  0xb001   SonyModelID                          int16u
+  0xb020   ColorReproduction                    string
+  0xb021   ColorTemperature                     int32u
+  0xb022   ColorCompensationFilter              int32u
+  0xb023   SceneMode                            int32u
+  0xb024   ZoneMatching                         int32u
+  0xb025   DynamicRangeOptimizer                int32u
+  0xb026   ImageStabilization                   int32u
+  0xb027   LensType                             int32u
+  0xb028   MinoltaMakerNote                     Minolta
+  0xb029   ColorMode                            int32u
+  0xb02b   FullImageSize                        int32u[2]
+  0xb02c   PreviewImageSize                     int32u[2]
+  0xb040   Macro                                int16u
+  0xb041   ExposureMode                         int16u
+  0xb042   FocusMode                            int16u
+  0xb043   AFMode                               int16u
+  0xb044   AFIlluminator                        int16u
+  0xb047   Quality                              int16u
+  0xb048   FlashLevel                           int16s
+  0xb049   ReleaseMode                          int16u
+  0xb04a   SequenceNumber                       int16u
+  0xb04b   Anti-Blur                            int16u
+  0xb04e   LongExposureNoiseReduction           int16u
+  0xb04f   DynamicRangeOptimizer                int16u
+  0xb052   IntelligentAuto                      int16u
+  0xb054   WhiteBalance                         int16u
+
+=head3 Sony CameraSettings Tags
+
+Camera settings for the A200, A230, A300, A350, A700, A850 and A900.  Some
+tags are only valid for certain models.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      4    DriveMode                            int16u
+      6    WhiteBalanceFineTune                 int16s
+     16    FocusMode                            int16u
+     17    AFAreaMode                           int16u
+     18    LocalAFAreaPoint                     int16u
+     21    MeteringMode                         int16u
+     22    ISOSetting                           int16u
+     24    DynamicRangeOptimizerMode            int16u
+     25    DynamicRangeOptimizerLevel           int16u
+     26    CreativeStyle                        int16u
+     28    Sharpness                            int16u
+     29    Contrast                             int16u
+     30    Saturation                           int16u
+     31    ZoneMatchingValue                    int16u
+     34    Brightness                           int16u
+     35    FlashMode                            int16u
+     40    PrioritySetupShutterRelease          int16u
+     41    AFIlluminator                        int16u
+     42    AFWithShutter                        int16u
+     43    LongExposureNoiseReduction           int16u
+     44    HighISONoiseReduction                int16u
+     45    ImageStyle                           int16u
+     60    ExposureProgram                      int16u
+     61    ImageStabilization                   int16u
+     63    Rotation                             int16u
+     84    SonyImageSize                        int16u
+     85    AspectRatio                          int16u
+     86    Quality                              int16u
+     88    ExposureLevelIncrements              int16u
+
+=head3 Sony CameraSettings2 Tags
+
+Camera settings for the A330 and A380.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+     16    FocusMode                            int16u
+     17    AFAreaMode                           int16u
+     18    LocalAFAreaPoint                     int16u
+     19    MeteringMode                         int16u
+     20    ISOSetting                           int16u
+     22    DynamicRangeOptimizerMode            int16u
+     23    DynamicRangeOptimizerLevel           int16u
+     24    CreativeStyle                        int16u
+     25    Sharpness                            int16u
+     26    Contrast                             int16u
+     27    Saturation                           int16u
+     35    FlashMode                            int16u
+     60    ExposureProgram                      int16u
+     63    Rotation                             int16u
+     84    SonyImageSize                        int16u
+
+=head3 Sony CameraSettingsUnknown Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+  [no tags known]
+
+=head3 Sony Panorama Tags
+
+Tags found only in panorama images from Sony cameras such as the HX1, HX5
+and TX7.  The width/height values of these tags are not affected by camera
+rotation -- the width is always the longer dimension.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      1    PanoramaFullWidth                    int32u
+      2    PanoramaFullHeight                   int32u
+      3    PanoramaDirection                    int32u
+      4    PanoramaCropLeft                     int32u
+      5    PanoramaCropTop                      int32u
+      6    PanoramaCropRight                    int32u
+      7    PanoramaCropBottom                   int32u
+      8    PanoramaFrameWidth                   int32u
+      9    PanoramaFrameHeight                  int32u
+     10    PanoramaSourceWidth                  int32u
+     11    PanoramaSourceHeight                 int32u
+
+=head3 Sony ShotInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      2    FaceInfoOffset                       N
+      6    SonyDateTime                         string[20]
+     48    FacesDetected                        int16u
+     50    FaceInfoLength                       N
+     72    FaceInfo1                            Sony FaceInfo1
+     94    FaceInfo2                            Sony FaceInfo2
+
+=head3 Sony FaceInfo1 Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    Face1Position                        int16u[4]
+     32    Face2Position                        int16u[4]
+     64    Face3Position                        int16u[4]
+     96    Face4Position                        int16u[4]
+    128    Face5Position                        int16u[4]
+    160    Face6Position                        int16u[4]
+    192    Face7Position                        int16u[4]
+    224    Face8Position                        int16u[4]
+
+=head3 Sony FaceInfo2 Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    Face1Position                        int16u[4]
+     37    Face2Position                        int16u[4]
+     74    Face3Position                        int16u[4]
+    111    Face4Position                        int16u[4]
+    148    Face5Position                        int16u[4]
+    185    Face6Position                        int16u[4]
+    222    Face7Position                        int16u[4]
+    259    Face8Position                        int16u[4]
+
+=head3 Sony Ericsson Tags
+
+Maker notes found in images from some Sony Ericsson phones.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0201   PreviewImageStart                    int32u*
+  0x0202   PreviewImageLength                   int32u*
+  0x2000   MakerNoteVersion                     undef[4]
+
+=head3 Sony SRF Tags
+
+The maker notes in SRF (Sony Raw Format) images contain 7 IFD's with family
+1 group names SRF0 through SRF6.  SRF0 and SRF1 use the tags in this table,
+while SRF2 through SRF5 use the tags in the next table, and SRF6 uses
+standard EXIF tags.  All information other than SRF0 is encrypted, but
+thanks to Dave Coffin the decryption algorithm is known.  SRF images are
+written by the Sony DSC-F828 and DSC-V3.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0000   SRF2Key                              N
+  0x0001   DataKey                              N
+
+=head3 Sony SRF2 Tags
+
+These tags are found in the SRF2 through SRF5 IFD's.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0002   SRF6Offset                           N
+  0x0003   SRFDataOffset?                       N
+  0x0004   RawDataOffset                        N
+  0x0005   RawDataLength                        N
+
+=head3 Sony SR2Private Tags
+
+The SR2 format uses the DNGPrivateData tag to reference a private IFD
+containing these tags.  SR2 images are written by the Sony DSC-R1, but
+this information is also written to ARW images by other models.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x7200   SR2SubIFDOffset                      N
+  0x7201   SR2SubIFDLength                      N
+  0x7221   SR2SubIFDKey                         N
+  0x7240   IDC_IFD                              SonyIDC
+  0x7241   IDC2_IFD                             SonyIDC
+  0x7250   MRWInfo                              MinoltaRaw
+
+=head3 Sony SR2SubIFD Tags
+
+Tags in the encrypted SR2SubIFD
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x7303   WB_GRBGLevels                        N
+  0x7313   WB_RGGBLevels                        N
+  0x74a0   MaxApertureAtMaxFocal                N
+  0x74a1   MaxApertureAtMinFocal                N
+  0x74c0   SR2DataIFD                           Sony SR2DataIFD
+  0x7820   WB_RGBLevelsDaylight                 N
+  0x7821   WB_RGBLevelsCloudy                   N
+  0x7822   WB_RGBLevelsTungsten                 N
+  0x7825   WB_RGBLevelsShade                    N
+  0x7826   WB_RGBLevelsFluorescent              N
+  0x7828   WB_RGBLevelsFlash                    N
+
+=head3 Sony SR2DataIFD Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x7770   ColorMode                            N
+
+=head3 Sony PMP Tags
+
+These tags are written in the proprietary-format header of PMP images from
+the DSC-F1.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      8    JpgFromRawStart                      N
+     12    JpgFromRawLength                     N
+     22    SonyImageWidth                       N
+     24    SonyImageHeight                      N
+     27    Orientation                          N
+     29    ImageQuality                         N
+     52    Comment                              N
+     76    DateTimeOriginal                     N
+     84    ModifyDate                           N
+    102    ExposureTime                         N
+    106    FNumber                              N
+    108    ExposureCompensation                 N
+    112    FocalLength                          N
+    118    Flash                                N
+
+=head2 SonyIDC Tags
+
+Tags written by the Sony Image Data Converter utility in ARW images.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0201   IDCPreviewStart                      int32u*
+  0x0202   IDCPreviewLength                     int32u*
+  0x8000   IDCCreativeStyle                     int32u
+  0x8001   CreativeStyleWasChanged              int32u
+  0x8002   PresetWhiteBalance                   int32u
+  0x8013   ColorTemperatureAdj                  int16u
+  0x8014   PresetWhiteBalanceAdj                int32s
+  0x8015   ColorCorrection                      int32s
+  0x8016   SaturationAdj                        int32s
+  0x8017   ContrastAdj                          int32s
+  0x8018   BrightnessAdj                        int32s
+  0x8019   HueAdj                               int32s
+  0x801a   SharpnessAdj                         int32s
+  0x801b   SharpnessOvershoot                   int32s
+  0x801c   SharpnessUndershoot                  int32s
+  0x801d   SharpnessThreshold                   int32s
+  0x801e   NoiseReductionMode                   int16u
+  0x8021   GrayPoint                            int16u[4]
+  0x8022   D-RangeOptimizerMode                 int16u
+  0x8023   D-RangeOptimizerValue                int32s
+  0x8024   D-RangeOptimizerHighlight            int32s
+  0x8026   HighlightColorDistortReduct          int16u
+  0x8027   NoiseReductionValue                  int32s
+  0x8028   EdgeNoiseReduction                   int32s
+  0x8029   ColorNoiseReduction                  int32s
+  0x802d   D-RangeOptimizerShadow               int32s
+  0x8030   PeripheralIllumCentralRadius         int32s
+  0x8031   PeripheralIllumCentralValue          int32s
+  0x8032   PeripheralIllumPeriphValue           int32s
+  0x9000   ToneCurveBrightnessX                 int16u[n]
+  0x9001   ToneCurveRedX                        int16u[n]
+  0x9002   ToneCurveGreenX                      int16u[n]
+  0x9003   ToneCurveBlueX                       int16u[n]
+  0x9004   ToneCurveBrightnessY                 int16u[n]
+  0x9005   ToneCurveRedY                        int16u[n]
+  0x9006   ToneCurveGreenY                      int16u[n]
+  0x9007   ToneCurveBlueY                       int16u[n]
+  0xd000   CurrentVersion                       int32u
+  0xd001   VersionIFD                           SonyIDC
+  0xd100   VersionCreateDate                    string
+  0xd101   VersionModifyDate                    string
+
+=head2 Unknown Tags
+
+The following tags are decoded in unsupported maker notes.  Use the Unknown
+(-u) option to display other unknown tags.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0e00   PrintIM                              PrintIM
+
+=head2 DNG Tags
+
+The main DNG tags are found in the EXIF table.  The tables below define only
+information found within structures of these main DNG tag values.  See
+L<http://www.adobe.com/products/dng/> for the official DNG specification.
+
+=head3 DNG AdobeData Tags
+
+This information is found in the "Adobe" DNGPrivateData.
+
+The maker notes ('MakN') are processed by ExifTool, but some information may
+have been lost by the Adobe DNG Converter.  This is because the Adobe DNG
+Converter (as of version 6.3) doesn't properly handle information referenced
+from inside the maker notes that lies outside the original maker notes
+block.  This information is lost when only the maker note block is copied to
+the DNG image.   While this doesn't effect all makes of cameras, it is a
+problem for some major brands such as Olympus and Sony.
+
+Other entries in this table represent proprietary information that is
+extracted from the original RAW image and restructured to a different (but
+still proprietary) Adobe format.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'CRW '   AdobeCRW                             CanonRaw
+  'Koda'   AdobeKoda                            Kodak IFD
+  'Leaf'   AdobeLeaf                            Leaf SubIFD
+  'MRW '   AdobeMRW                             MinoltaRaw
+  'MakN'   MakerNoteCanon                       Canon
+           MakerNoteCasio                       Casio
+           MakerNoteCasio2                      Casio Type2
+           MakerNoteFujiFilm                    FujiFilm
+           MakerNoteGE                          GE
+           MakerNoteGE2                         FujiFilm
+           MakerNoteHP                          HP
+           MakerNoteHP2                         HP Type2
+           MakerNoteHP4                         HP Type4
+           MakerNoteHP6                         HP Type6
+           MakerNoteISL                         Unknown
+           MakerNoteJVC                         JVC
+           MakerNoteJVCText                     JVC Text
+           MakerNoteKodak1a                     Kodak
+           MakerNoteKodak1b                     Kodak
+           MakerNoteKodak2                      Kodak Type2
+           MakerNoteKodak3                      Kodak Type3
+           MakerNoteKodak4                      Kodak Type4
+           MakerNoteKodak5                      Kodak Type5
+           MakerNoteKodak6a                     Kodak Type6
+           MakerNoteKodak6b                     Kodak Type6
+           MakerNoteKodak7                      Kodak Type7
+           MakerNoteKodak8a                     Kodak Type8
+           MakerNoteKodak8b                     Kodak Type8
+           MakerNoteKodak9                      Kodak Type9
+           MakerNoteKodak10                     Kodak Type10
+           MakerNoteKodakUnknown                Kodak Unknown
+           MakerNoteKyocera                     Unknown
+           MakerNoteMinolta                     Minolta
+           MakerNoteMinolta2                    Olympus
+           MakerNoteMinolta3                    undef
+           MakerNoteNikon                       Nikon
+           MakerNoteNikon2                      Nikon Type2
+           MakerNoteNikon3                      Nikon
+           MakerNoteOlympus                     Olympus
+           MakerNoteOlympus2                    Olympus
+           MakerNoteLeica                       Panasonic
+           MakerNoteLeica2                      Panasonic Leica2
+           MakerNoteLeica3                      Panasonic Leica3
+           MakerNoteLeica4                      Panasonic Leica4
+           MakerNoteLeica5                      Panasonic Leica5
+           MakerNoteLeica6                      Panasonic Leica6
+           MakerNotePanasonic                   Panasonic
+           MakerNotePanasonic2                  Panasonic Type2
+           MakerNotePentax                      Pentax
+           MakerNotePentax2                     Pentax Type2
+           MakerNotePentax3                     Casio Type2
+           MakerNotePentax4                     Pentax Type4
+           MakerNotePentax5                     Pentax
+           MakerNotePhaseOne                    undef
+           MakerNoteReconyx                     Reconyx
+           MakerNoteRicoh                       Ricoh
+           MakerNoteRicohText                   Ricoh Text
+           MakerNoteSamsung1a                   undef
+           MakerNoteSamsung1b                   Samsung Type1
+           MakerNoteSamsung2                    Samsung Type2
+           MakerNoteSanyo                       Sanyo
+           MakerNoteSanyoC4                     Sanyo
+           MakerNoteSanyoPatch                  Sanyo
+           MakerNoteSigma                       Sigma
+           MakerNoteSony                        Sony
+           MakerNoteSony2                       Olympus
+           MakerNoteSony3                       Olympus
+           MakerNoteSony4                       Sony
+           MakerNoteSonyEricsson                Sony Ericsson
+           MakerNoteSonySRF                     Sony SRF
+           MakerNoteUnknownText                 undef
+           MakerNoteUnknown                     Unknown
+  'Pano'   AdobePano                            PanasonicRaw
+  'RAF '   AdobeRAF                             FujiFilm RAF
+  'SR2 '   AdobeSR2                             Sony SR2Private
+
+=head3 DNG OriginalRaw Tags
+
+This table defines tags extracted from the DNG OriginalRawFileData
+information.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0000   OriginalRawImage                     N
+  0x0001   OriginalRawResource                  N
+  0x0002   OriginalRawFileType                  N
+  0x0003   OriginalRawCreator                   N
+  0x0004   OriginalTHMImage                     N
+  0x0005   OriginalTHMResource                  N
+  0x0006   OriginalTHMFileType                  N
+  0x0007   OriginalTHMCreator                   N
+
+=head2 CanonRaw Tags
+
+These tags apply to CRW-format Canon RAW files and information in the APP0
+"CIFF" segment of JPEG images.  When writing CanonRaw/CIFF information, the
+length of the information is preserved (and the new information is truncated
+or padded as required) unless B<Writable> is C<resize>. Currently, only
+JpgFromRaw and ThumbnailImage are allowed to change size.
+
+CRW images also support the addition of a CanonVRD trailer, which in turn
+supports XMP.  This trailer is created automatically if necessary when
+ExifTool is used to write XMP to a CRW image.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0000   NullRecord                           undef
+  0x0001   FreeBytes                            undef
+  0x0032   CanonColorInfo1                      N
+  0x0805   CanonFileDescription                 string[32]
+           UserComment                          string[256]
+  0x080a   CanonRawMakeModel                    CanonRaw MakeModel
+  0x080b   CanonFirmwareVersion                 string[32]
+  0x080c   ComponentVersion                     string
+  0x080d   ROMOperationMode                     string[8]
+  0x0810   OwnerName                            string[32]
+  0x0815   CanonImageType                       string[32]
+  0x0816   OriginalFileName                     string[32]
+  0x0817   ThumbnailFileName                    string[32]
+  0x100a   TargetImageType                      int16u
+  0x1010   ShutterReleaseMethod                 int16u
+  0x1011   ShutterReleaseTiming                 int16u
+  0x1016   ReleaseSetting                       int16u
+  0x101c   BaseISO                              int16u
+  0x1028   CanonFlashInfo?                      int16u[4]
+  0x1029   CanonFocalLength                     Canon FocalLength
+  0x102a   CanonShotInfo                        Canon ShotInfo
+  0x102c   CanonColorInfo2                      N
+  0x102d   CanonCameraSettings                  Canon CameraSettings
+  0x1030   WhiteSample                          CanonRaw WhiteSample
+  0x1031   SensorInfo                           Canon SensorInfo
+  0x1033   CustomFunctions10D                   CanonCustom Functions10D
+           CustomFunctionsD30                   CanonCustom FunctionsD30
+           CustomFunctionsD60                   CanonCustom FunctionsD30
+           CustomFunctionsUnknown               CanonCustom FuncsUnknown
+  0x1038   CanonAFInfo                          Canon AFInfo
+  0x1093   CanonFileInfo                        Canon FileInfo
+  0x10a9   ColorBalance                         Canon ColorBalance
+  0x10ae   ColorTemperature                     int16u
+  0x10b4   ColorSpace                           int16u
+  0x10b5   RawJpgInfo                           CanonRaw RawJpgInfo
+  0x1803   ImageFormat                          CanonRaw ImageFormat
+  0x1804   RecordID                             int32u
+  0x1806   SelfTimerTime                        int32u
+  0x1807   TargetDistanceSetting                float
+  0x180b   SerialNumber                         int32u
+           UnknownNumber?                       Y
+  0x180e   TimeStamp                            CanonRaw TimeStamp
+  0x1810   ImageInfo                            CanonRaw ImageInfo
+  0x1813   FlashInfo                            CanonRaw FlashInfo
+  0x1814   MeasuredEV                           float
+  0x1817   FileNumber                           int32u
+  0x1818   ExposureInfo                         CanonRaw ExposureInfo
+  0x1834   CanonModelID                         int32u
+  0x1835   DecoderTable                         CanonRaw DecoderTable
+  0x183b   SerialNumberFormat                   int32u
+  0x2005   RawData                              N
+  0x2007   JpgFromRaw                           resize
+  0x2008   ThumbnailImage                       resize
+  0x2804   ImageDescription                     CanonRaw
+  0x2807   CameraObject                         CanonRaw
+  0x3002   ShootingRecord                       CanonRaw
+  0x3003   MeasuredInfo                         CanonRaw
+  0x3004   CameraSpecification                  CanonRaw
+  0x300a   ImageProps                           CanonRaw
+  0x300b   ExifInformation                      CanonRaw
+
+=head3 CanonRaw MakeModel Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    Make                                 string[6]
+      6    Model                                string
+
+=head3 CanonRaw WhiteSample Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      1    WhiteSampleWidth                     N
+      2    WhiteSampleHeight                    N
+      3    WhiteSampleLeftBorder                N
+      4    WhiteSampleTopBorder                 N
+      5    WhiteSampleBits                      N
+
+=head3 CanonRaw RawJpgInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      1    RawJpgQuality                        int16u
+      2    RawJpgSize                           int16u
+      3    RawJpgWidth                          int16u
+      4    RawJpgHeight                         int16u
+
+=head3 CanonRaw ImageFormat Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    FileFormat                           int32u
+      1    TargetCompressionRatio               float
+
+=head3 CanonRaw TimeStamp Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    DateTimeOriginal                     int32u
+      1    TimeZoneCode                         int32s
+      2    TimeZoneInfo                         int32u
+
+=head3 CanonRaw ImageInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ImageWidth                           N
+      1    ImageHeight                          N
+      2    PixelAspectRatio                     N
+      3    Rotation                             int32s
+      4    ComponentBitDepth                    N
+      5    ColorBitDepth                        N
+      6    ColorBW                              N
+
+=head3 CanonRaw FlashInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    FlashGuideNumber                     float
+      1    FlashThreshold                       float
+
+=head3 CanonRaw ExposureInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ExposureCompensation                 float
+      1    ShutterSpeedValue                    float
+      2    ApertureValue                        float
+
+=head3 CanonRaw DecoderTable Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    DecoderTableNumber                   N
+      2    CompressedDataOffset                 N
+      3    CompressedDataLength                 N
+
+=head2 KyoceraRaw Tags
+
+Tags for Kyocera Contax N Digital RAW images.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      1    FirmwareVersion                      N
+     12    Model                                N
+     25    Make                                 N
+     33    DateTimeOriginal                     N
+     52    ISO                                  N
+     56    ExposureTime                         N
+     60    WB_RGGBLevels                        N
+     88    FNumber                              N
+    104    MaxAperture                          N
+    112    FocalLength                          N
+    124    Lens                                 N
+
+=head2 MinoltaRaw Tags
+
+These tags are used in Minolta RAW format (MRW) images.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  "\0PRD"  MinoltaPRD                           MinoltaRaw PRD
+  "\0RIF"  MinoltaRIF                           MinoltaRaw RIF
+  "\0TTW"  MinoltaTTW                           EXIF
+  "\0WBG"  MinoltaWBG                           MinoltaRaw WBG
+
+=head3 MinoltaRaw PRD Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    FirmwareID                           string[8]
+      8    SensorHeight                         int16u
+     10    SensorWidth                          int16u
+     12    ImageHeight                          int16u
+     14    ImageWidth                           int16u
+     16    RawDepth                             int8u
+     17    BitDepth                             int8u
+     18    StorageMethod                        int8u
+     23    BayerPattern                         int8u
+
+=head3 MinoltaRaw RIF Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      1    Saturation                           int8s
+      2    Contrast                             int8s
+      3    Sharpness                            int8s
+      4    WBMode                               int8u~
+      5    ProgramMode                          int8u
+      6    ISOSetting                           int8u
+      7    ColorMode                            int32u[0.25]
+      8    WB_RBLevelsTungsten                  int16u[2]
+     12    WB_RBLevelsDaylight                  int16u[2]
+     16    WB_RBLevelsCloudy                    int16u[2]
+     20    WB_RBLevelsCoolWhiteF                int16u[2]
+     24    WB_RBLevelsFlash                     int16u[2]
+     28    WB_RBLevelsUnknown?                  int16u[2]
+     32    WB_RBLevelsShade                     int16u[2]
+     36    WB_RBLevelsDaylightF                 int16u[2]
+     40    WB_RBLevelsDayWhiteF                 int16u[2]
+     44    WB_RBLevelsWhiteF                    int16u[2]
+     56    ColorFilter                          int8s
+     57    BWFilter                             int8u
+     58    ZoneMatching                         int8u
+     59    Hue                                  int8s
+     60    ColorTemperature                     int8u
+     74    ZoneMatching                         int8u
+     76    ColorTemperature                     int8u
+     77    ColorFilter                          int8u
+     78    ColorTemperature                     int8u
+     79    ColorFilter                          int8u
+
+=head3 MinoltaRaw WBG Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    WBScale                              int8u[4]
+      4    WB_GBRGLevels                        int16u[4]
+           WB_RGGBLevels                        int16u[4]
+
+=head2 PanasonicRaw Tags
+
+These tags are found in IFD0 of Panasonic/Leica RAW, RW2 and RWL images.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0001   PanasonicRawVersion                  undef
+  0x0002   SensorWidth                          N
+  0x0003   SensorHeight                         N
+  0x0004   SensorTopBorder                      N
+  0x0005   SensorLeftBorder                     N
+  0x0006   ImageHeight                          N
+  0x0007   ImageWidth                           N
+  0x0011   RedBalance                           int16u
+  0x0012   BlueBalance                          int16u
+  0x0017   ISO                                  int16u
+  0x0024   WBRedLevel                           int16u
+  0x0025   WBGreenLevel                         int16u
+  0x0026   WBBlueLevel                          int16u
+  0x002e   JpgFromRaw                           JPEG
+  0x010f   Make                                 string
+  0x0110   Model                                string
+  0x0111   StripOffsets                         N
+  0x0112   Orientation                          int16u
+  0x0116   RowsPerStrip                         N
+  0x0117   StripByteCounts                      N
+  0x0118   RawDataOffset                        N
+  0x02bc   ApplicationNotes                     XMP
+  0x83bb   IPTC-NAA                             IPTC
+  0x8769   ExifOffset                           EXIF
+  0x8825   GPSInfo                              GPS
+
+=head2 SigmaRaw Tags
+
+These tags are used in Sigma and Foveon RAW (.X3F) images.  Metadata is also
+extracted from the JpgFromRaw image if it exists (all models but the SD9 and
+SD10).  Currently, metadata may only be written to the embedded JpgFromRaw.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'Header'             Header                   SigmaRaw Header
+  'HeaderExt'          HeaderExt                SigmaRaw HeaderExt
+  'IMA2'               PreviewImage             N
+                       JpgFromRaw               N
+  'IMAG'               PreviewImage             N
+  'PROP'               Properties               SigmaRaw Properties
+
+=head3 SigmaRaw Header Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0001   FileVersion                          N
+  0x0002   ImageUniqueID                        N
+  0x0006   MarkBits                             N
+  0x0007   ImageWidth                           N
+  0x0008   ImageHeight                          N
+  0x0009   Rotation                             N
+  0x000a   WhiteBalance                         N
+  0x0012   SceneCaptureType                     N
+
+=head3 SigmaRaw HeaderExt Tags
+
+Extended header data found in version 2.1 and 2.2 files
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0000   Unused                               N
+  0x0001   ExposureAdjust                       N
+  0x0002   Contrast                             N
+  0x0003   Shadow                               N
+  0x0004   Highlight                            N
+  0x0005   Saturation                           N
+  0x0006   Sharpness                            N
+  0x0007   RedAdjust                            N
+  0x0008   GreenAdjust                          N
+  0x0009   BlueAdjust                           N
+  0x000a   X3FillLight                          N
+
+=head3 SigmaRaw Properties Tags
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'AEMODE'             MeteringMode             N
+  'AFAREA'             AFArea                   N
+  'AFINFOCUS'          AFInFocus                N
+  'AFMODE'             FocusMode                N
+  'APERTURE'           FNumber                  N
+  'AP_DESC'            ApertureDisplayed        N
+  'BRACKET'            BracketShot              N
+  'BURST'              BurstShot                N
+  'CAMMANUF'           Make                     N
+  'CAMMODEL'           Model                    N
+  'CAMNAME'            CameraName               N
+  'CAMSERIAL'          SerialNumber             N
+  'CM_DESC'            SceneCaptureType         N
+  'COLORSPACE'         ColorSpace               N
+  'DRIVE'              DriveMode                N
+  'EVAL_STATE'         EvalState                N
+  'EXPCOMP'            ExposureCompensation     N
+  'EXPNET'             NetExposureCompensation  N
+  'EXPTIME'            IntegrationTime          N
+  'FIRMVERS'           FirmwareVersion          N
+  'FLASH'              FlashMode                N
+  'FLASHEXPCOMP'       FlashExpComp             N
+  'FLASHPOWER'         FlashPower               N
+  'FLASHTTLMODE'       FlashTTLMode             N
+  'FLASHTYPE'          FlashType                N
+  'FLENGTH'            FocalLength              N
+  'FLEQ35MM'           FocalLengthIn35mmFormat  N
+  'FOCUS'              Focus                    N
+  'IMAGEBOARDID'       ImageBoardID             N
+  'IMAGERBOARDID'      ImagerBoardID            N
+  'IMAGERTEMP'         SensorTemperature        N
+  'ISO'                ISO                      N
+  'LENSARANGE'         LensApertureRange        N
+  'LENSFRANGE'         LensFocalRange           N
+  'LENSMODEL'          LensType                 N
+  'PMODE'              ExposureProgram          N
+  'RESOLUTION'         Quality                  N
+  'SENSORID'           SensorID                 N
+  'SHUTTER'            ExposureTime             N
+  'SH_DESC'            ShutterSpeedDisplayed    N
+  'TIME'               DateTimeOriginal         N
+  'VERSION_BF'         VersionBF                N
+  'WB_DESC'            WhiteBalance             N
+
+=head2 JFIF Tags
+
+The following information is extracted from the JPEG JFIF header.  See
+L<http://www.jpeg.org/public/jfif.pdf> for the JFIF 1.02 specification.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    JFIFVersion                          N
+      2    ResolutionUnit                       int8u
+      3    XResolution                          int16u
+      5    YResolution                          int16u
+
+=head3 JFIF Extension Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0010   ThumbnailImage                       N
+
+=head2 FlashPix Tags
+
+The FlashPix file format, introduced in 1996, was developed by Kodak,
+Hewlett-Packard and Microsoft.  Internally the FPX file structure mimics
+that of an old DOS disk with fixed-sized "sectors" (usually 512 bytes) and a
+"file allocation table" (FAT).  No wonder this image format never became
+popular.  However, some of the structures used in FlashPix streams are part
+of the EXIF specification, and are still being used in the APP2 FPXR segment
+of JPEG images by some Kodak and Hewlett-Packard digital cameras.
+
+ExifTool extracts FlashPix information from both FPX images and the APP2
+FPXR segment of JPEG images.  As well, FlashPix information is extracted
+from DOC, PPT, XLS (Microsoft Word, PowerPoint and Excel) documents, VSD
+(Microsoft Visio) drawings, and FLA (Macromedia/Adobe Flash project) files
+since these are based on the same file format as FlashPix (the Windows
+Compound Binary File format).  See
+L<http://graphcomp.com/info/specs/livepicture/fpx.pdf> for the FlashPix
+specification.
+
+  Tag ID                           Tag Name     Writable
+  ------                           --------     --------
+  "\x01CompObj"                    CompObj      FlashPix CompObj
+  "\x05Audio Info"                 AudioInfo    FlashPix AudioInfo
+  "\x05Data Object"                DataObject   FlashPix DataObject
+  "\x05DocumentSummaryInformation" DocumentInfo FlashPix DocumentInfo
+  "\x05Extension List"             Extensions   FlashPix Extensions
+  "\x05Global Info"                GlobalInfo   FlashPix GlobalInfo
+  "\x05Image Contents"             Image        FlashPix Image
+  "\x05Image Info"                 ImageInfo    FlashPix ImageInfo
+  "\x05Operation"                  Operation    FlashPix Operation
+  "\x05Screen Nail"                ScreenNail   N
+  "\x05SummaryInformation"         SummaryInfo  FlashPix SummaryInfo
+  "\x05Transform"                  Transform    FlashPix Transform
+  'Audio Stream'                   AudioStream  N
+  'Contents'                       Contents     XMP
+  'Current User'                   CurrentUser  N
+  'ICC Profile 0001'               ICC_Profile  ICC_Profile
+  'Subimage 0000 Header'           SubimageHdr  FlashPix SubimageHdr
+
+=head3 FlashPix CompObj Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    CompObjUserTypeLen                   N
+      1    CompObjUserType                      N
+
+=head3 FlashPix AudioInfo Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  [no tags known]
+
+=head3 FlashPix DataObject Tags
+
+  Tag ID       Tag Name                         Writable
+  ------       --------                         --------
+  0x10000      DataObjectID                     N
+  0x10002      LockedPropertyList               N
+  0x10003      DataObjectTitle                  N
+  0x10004      LastModifier                     N
+  0x10005      RevisionNumber                   N
+  0x10006      DataCreateDate                   N
+  0x10007      DataModifyDate                   N
+  0x10008      CreatingApplication              N
+  0x10100      DataObjectStatus                 N
+  0x10101      CreatingTransform                N
+  0x10102      UsingTransforms                  N
+  0x10000000   CachedImageHeight                N
+  0x10000001   CachedImageWidth                 N
+
+=head3 FlashPix DocumentInfo Tags
+
+The DocumentSummaryInformation property set includes a UserDefined property
+set for which only the Hyperlinks and HyperlinkBase tags are pre-defined.
+However, ExifTool will also extract any other information found in the
+UserDefined properties.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  0x0002               Category                 N
+  0x0003               PresentationTarget       N
+  0x0004               Bytes                    N
+  0x0005               Lines                    N
+  0x0006               Paragraphs               N
+  0x0007               Slides                   N
+  0x0008               Notes                    N
+  0x0009               HiddenSlides             N
+  0x000a               MMClips                  N
+  0x000b               ScaleCrop                N
+  0x000c               HeadingPairs             N
+  0x000d               TitleOfParts             N
+  0x000e               Manager                  N
+  0x000f               Company                  N
+  0x0010               LinksUpToDate            N
+  0x0011               CharCountWithSpaces      N
+  0x0013               SharedDoc                N
+  0x0016               HyperlinksChanged        N
+  0x0017               AppVersion               N
+  '_PID_HLINKS'        Hyperlinks               N
+  '_PID_LINKBASE'      HyperlinkBase            N
+
+=head3 FlashPix Extensions Tags
+
+  Tag ID       Tag Name                         Writable
+  ------       --------                         --------
+  0x0001       ExtensionName                    N
+  0x0002       ExtensionClassID                 N
+  0x0003       ExtensionPersistence             N
+  0x0004       ExtensionCreateDate              N
+  0x0005       ExtensionModifyDate              N
+  0x0006       CreatingApplication              N
+  0x0007       ExtensionDescription             N
+  0x1000       Storage-StreamPathname           N
+  0x2000       FlashPixStreamPathname           N
+  0x2001       FlashPixStreamFieldOffset        N
+  0x3000       PropertySetPathname              N
+  0x3001       PropertySetIDCodes               N
+  0x3002       PropertyVectorElements           N
+  0x4000       SubimageResolutions              N
+  0x10000000   UsedExtensionNumbers             N
+
+=head3 FlashPix GlobalInfo Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x10002  LockedPropertyList                   N
+  0x10003  TransformedImageTitle                N
+  0x10004  LastModifier                         N
+  0x10100  VisibleOutputs                       N
+  0x10101  MaximumImageIndex                    N
+  0x10102  MaximumTransformIndex                N
+  0x10103  MaximumOperationIndex                N
+
+=head3 FlashPix Image Tags
+
+  Tag ID       Tag Name                         Writable
+  ------       --------                         --------
+  0x1000000    NumberOfResolutions              N
+  0x1000002    ImageWidth                       N
+  0x1000003    ImageHeight                      N
+  0x1000004    DefaultDisplayHeight             N
+  0x1000005    DefaultDisplayWidth              N
+  0x1000006    DisplayUnits                     N
+  0x2000000    SubimageWidth                    N
+  0x2000001    SubimageHeight                   N
+  0x2000002    SubimageColor                    N
+  0x2000003    SubimageNumericalFormat          N
+  0x2000004    DecimationMethod                 N
+  0x2000005    DecimationPrefilterWidth         N
+  0x2000007    SubimageICC_Profile              N
+  0x3000001    JPEGTables                       N
+  0x3000002    MaxJPEGTableIndex                N
+
+=head3 FlashPix ImageInfo Tags
+
+  Tag ID       Tag Name                         Writable
+  ------       --------                         --------
+  0x21000000   FileSource                       N
+  0x21000001   SceneType                        N
+  0x21000002   CreationPathVector               N
+  0x21000003   SoftwareRelease                  N
+  0x21000004   UserDefinedID                    N
+  0x21000005   SharpnessApproximation           N
+  0x22000000   Copyright                        N
+  0x22000001   OriginalImageBroker              N
+  0x22000002   DigitalImageBroker               N
+  0x22000003   Authorship                       N
+  0x22000004   IntellectualPropertyNotes        N
+  0x23000000   TestTarget                       N
+  0x23000002   GroupCaption                     N
+  0x23000003   CaptionText                      N
+  0x23000004   People                           N
+  0x23000007   Things                           N
+  0x2300000a   DateTimeOriginal                 N
+  0x2300000b   Events                           N
+  0x2300000c   Places                           N
+  0x2300000f   ContentDescriptionNotes          N
+  0x24000000   Make                             N
+  0x24000001   Model                            N
+  0x24000002   SerialNumber                     N
+  0x25000000   CreateDate                       N
+  0x25000001   ExposureTime                     N
+  0x25000002   FNumber                          N
+  0x25000003   ExposureProgram                  N
+  0x25000004   BrightnessValue                  N
+  0x25000005   ExposureCompensation             N
+  0x25000006   SubjectDistance                  N
+  0x25000007   MeteringMode                     N
+  0x25000008   LightSource                      N
+  0x25000009   FocalLength                      N
+  0x2500000a   MaxApertureValue                 N
+  0x2500000b   Flash                            N
+  0x2500000c   FlashEnergy                      N
+  0x2500000d   FlashReturn                      N
+  0x2500000e   BackLight                        N
+  0x2500000f   SubjectLocation                  N
+  0x25000010   ExposureIndex                    N
+  0x25000011   SpecialEffectsOpticalFilter      N
+  0x25000012   PerPictureNotes                  N
+  0x26000000   SensingMethod                    N
+  0x26000001   FocalPlaneXResolution            N
+  0x26000002   FocalPlaneYResolution            N
+  0x26000003   FocalPlaneResolutionUnit         N
+  0x26000004   SpatialFrequencyResponse         N
+  0x26000005   CFAPattern                       N
+  0x26000007   ISO                              N
+  0x26000008   Opto-ElectricConvFactor          N
+  0x27000000   FilmBrand                        N
+  0x27000001   FilmCategory                     N
+  0x27000002   FilmSize                         N
+  0x27000003   FilmRollNumber                   N
+  0x27000004   FilmFrameNumber                  N
+  0x28000000   ScannerMake                      N
+  0x28000001   ScannerModel                     N
+  0x28000002   ScannerSerialNumber              N
+  0x28000003   ScanSoftware                     N
+  0x28000004   ScanSoftwareRevisionDate         N
+  0x28000005   ServiceOrganizationName          N
+  0x28000006   ScanOperatorID                   N
+  0x28000008   ScanDate                         N
+  0x28000009   ModifyDate                       N
+  0x2800000a   ScannerPixelSize                 N
+  0x29000000   OriginalScannedImageSize         N
+  0x29000001   OriginalDocumentSize             N
+  0x29000002   OriginalMedium                   N
+  0x29000003   TypeOfOriginal                   N
+
+=head3 FlashPix Operation Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x10000  OperationID                          N
+
+=head3 FlashPix SummaryInfo Tags
+
+The Dictionary, CodePage and LocalIndicator tags are common to all FlashPix
+property tables, even though they are only listed in the SummaryInfo table.
+
+  Tag ID       Tag Name                         Writable
+  ------       --------                         --------
+  0x0000       Dictionary                       N
+  0x0001       CodePage                         N
+  0x0002       Title                            N
+  0x0003       Subject                          N
+  0x0004       Author                           N
+  0x0005       Keywords                         N
+  0x0006       Comments                         N
+  0x0007       Template                         N
+  0x0008       LastModifiedBy                   N
+  0x0009       RevisionNumber                   N
+  0x000a       TotalEditTime                    N
+  0x000b       LastPrinted                      N
+  0x000c       CreateDate                       N
+  0x000d       ModifyDate                       N
+  0x000e       Pages                            N
+  0x000f       Words                            N
+  0x0010       Characters                       N
+  0x0011       ThumbnailClip                    N
+  0x0012       Software                         N
+  0x0013       Security                         N
+  0x80000000   LocaleIndicator                  N
+
+=head3 FlashPix Transform Tags
+
+  Tag ID       Tag Name                         Writable
+  ------       --------                         --------
+  0x10000      TransformNodeID                  N
+  0x10001      OperationClassID                 N
+  0x10002      LockedPropertyList               N
+  0x10003      TransformTitle                   N
+  0x10004      LastModifier                     N
+  0x10005      RevisionNumber                   N
+  0x10006      TransformCreateDate              N
+  0x10007      TransformModifyDate              N
+  0x10008      CreatingApplication              N
+  0x10100      InputDataObjectList              N
+  0x10101      OutputDataObjectList             N
+  0x10102      OperationNumber                  N
+  0x10000000   ResultAspectRatio                N
+  0x10000001   RectangleOfInterest              N
+  0x10000002   Filtering                        N
+  0x10000003   SpatialOrientation               N
+  0x10000004   ColorTwistMatrix                 N
+  0x10000005   ContrastAdjustment               N
+
+=head3 FlashPix SubimageHdr Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      1    SubimageWidth                        N
+      2    SubimageHeight                       N
+      3    SubimageTileCount                    N
+      4    SubimageTileWidth                    N
+      5    SubimageTileHeight                   N
+      6    NumChannels                          N
+
+=head2 MPF Tags
+
+These tags are part of the CIPA Multi-Picture Format specification, and are
+found in the APP2 "MPF" segment of JPEG images.  See
+L<http://www.cipa.jp/english/hyoujunka/kikaku/pdf/DC-007_E.pdf> for the
+official specification.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0xb000   MPFVersion                           N
+  0xb001   NumberOfImages                       N
+  0xb002   MPImageList                          MPF MPImage
+  0xb003   ImageUIDList                         N
+  0xb004   TotalFrames                          N
+  0xb101   MPIndividualNum                      N
+  0xb201   PanOrientation                       N
+  0xb202   PanOverlapH                          N
+  0xb203   PanOverlapV                          N
+  0xb204   BaseViewpointNum                     N
+  0xb205   ConvergenceAngle                     N
+  0xb206   BaselineLength                       N
+  0xb207   VerticalDivergence                   N
+  0xb208   AxisDistanceX                        N
+  0xb209   AxisDistanceY                        N
+  0xb20a   AxisDistanceZ                        N
+  0xb20b   YawAngle                             N
+  0xb20c   PitchAngle                           N
+  0xb20d   RollAngle                            N
+
+=head3 MPF MPImage Tags
+
+The first MPF "Large Thumbnail" image is extracted as PreviewImage, and the
+rest of the embedded MPF images are extracted as MPImage#.  The
+ExtractEmbedded (-ee) option may be used to extract information from these
+embedded images.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+    0.1    MPImageFlags                         N
+    0.2    MPImageFormat                        N
+    0.3    MPImageType                          N
+      4    MPImageLength                        N
+      8    MPImageStart                         N
+     12    DependentImage1EntryNumber           N
+     14    DependentImage2EntryNumber           N
+
+=head2 Stim Tags
+
+These tags are part of the CIPA Stereo Still Image specification, and are
+found in the APP3 "Stim" segment of JPEG images.  See
+L<http://www.cipa.jp/english/hyoujunka/kikaku/pdf/DC-006_E.pdf> for the
+official specification.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0000   StimVersion                          N
+  0x0001   ApplicationData                      N
+  0x0002   ImageArrangement                     N
+  0x0003   ImageRotation                        N
+  0x0004   ScalingFactor                        N
+  0x0005   CropXSize                            N
+  0x0006   CropYSize                            N
+  0x0007   CropX                                Stim CropX
+  0x0008   CropY                                Stim CropY
+  0x0009   ViewType                             N
+  0x000a   RepresentativeImage                  N
+  0x000b   ConvergenceBaseImage                 N
+  0x000c   AssumedDisplaySize                   N
+  0x000d   AssumedDistanceView                  N
+  0x000e   RepresentativeDisparityNear          N
+  0x000f   RepresentativeDisparityFar           N
+  0x0010   InitialDisplayEffect                 N
+  0x0011   ConvergenceDistance                  N
+  0x0012   CameraArrangementInterval            N
+  0x0013   ShootingCount                        N
+
+=head3 Stim CropX Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    CropXCommonOffset                    N
+      2    CropXViewpointNumber                 N
+      3    CropXOffset                          N
+      7    CropXViewpointNumber2                N
+      8    CropXOffset2                         N
+
+=head3 Stim CropY Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    CropYCommonOffset                    N
+      2    CropYViewpointNumber                 N
+      3    CropYOffset                          N
+      7    CropYViewpointNumber2                N
+      8    CropYOffset2                         N
+
+=head2 APP12 Tags
+
+=head3 APP12 PictureInfo Tags
+
+The JPEG APP12 "Picture Info" segment was used by some older cameras, and
+contains ASCII-based meta information.  Below are some tags which have been
+observed Agfa and Polaroid images, however ExifTool will extract information
+from any tags found in this segment.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'Aperture'           Aperture                 N
+  'ColorMode'          ColorMode                N
+  'ConTake'            ConTake                  N
+  'ExpBias'            ExposureCompensation     N
+  'FNumber'            FNumber                  N
+  'FWare'              FirmwareVersion          N
+  'Flash'              Flash                    N
+  'FocusMode'          FocusMode                N
+  'FocusPos'           FocusPos                 N
+  'ID'                 ID                       N
+  'ImageSize'          ImageSize                N
+  'LightS'             LightS                   N
+  'Macro'              Macro                    N
+  'Protect'            Protect                  N
+  'Quality'            Quality                  N
+  'Resolution'         Resolution               N
+  'Serial#'            SerialNumber             N
+  'Shutter'            ExposureTime             N
+  'StrobeTime'         StrobeTime               N
+  'TimeDate'           DateTimeOriginal         N
+  'Type'               CameraType               N
+  'Version'            Version                  N
+  'Ytarget'            YTarget                  N
+  'Zoom'               Zoom                     N
+  'ZoomPos'            ZoomPos                  N
+  'shtr'               ExposureTime             N
+  'ylevel'             YLevel                   N
+
+=head3 APP12 Ducky Tags
+
+Photoshop uses the JPEG APP12 "Ducky" segment to store some information in
+"Save for Web" images.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0001   Quality                              int32u/
+  0x0002   Comment                              string/
+  0x0003   Copyright                            string/
+
+=head2 AFCP Tags
+
+AFCP stands for AXS File Concatenation Protocol, and is a poorly designed
+protocol for appending information to the end of files.  This can be used as
+an auxiliary technique to store IPTC information in images, but is
+incompatible with some file formats.
+
+ExifTool will read and write (but not create) AFCP IPTC information in JPEG
+and TIFF images.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'IPTC'   IPTC                                 IPTC
+  'Nail'   ThumbnailImage                       N
+  'PrVw'   PreviewImage                         N
+  'TEXT'   Text                                 N
+
+=head2 FotoStation Tags
+
+The following tables define information found in the FotoWare FotoStation
+trailer.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0001   IPTC                                 IPTC
+  0x0002   SoftEdit                             FotoStation SoftEdit
+  0x0003   ThumbnailImage                       Y
+  0x0004   PreviewImage                         Y
+
+=head3 FotoStation SoftEdit Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    OriginalImageWidth                   int32s
+      1    OriginalImageHeight                  int32s
+      2    ColorPlanes                          int32s
+      3    XYResolution                         int32s
+      4    Rotation                             int32s
+      6    CropLeft                             int32s
+      7    CropTop                              int32s
+      8    CropRight                            int32s
+      9    CropBottom                           int32s
+     11    CropRotation                         int32s
+
+=head2 PhotoMechanic Tags
+
+The Photo Mechanic trailer contains data in an IPTC-format structure, with
+soft edit information stored under record number 2.
+
+  Record   Tag Name                             Writable
+  ------   --------                             --------
+      2    SoftEdit                             PhotoMechanic SoftEdit
+
+=head3 PhotoMechanic SoftEdit Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+    209    RawCropLeft                          int32s
+    210    RawCropTop                           int32s
+    211    RawCropRight                         int32s
+    212    RawCropBottom                        int32s
+    213    ConstrainedCropWidth                 int32s
+    214    ConstrainedCropHeight                int32s
+    215    FrameNum                             int32s
+    216    Rotation                             int32s
+    217    CropLeft                             int32s
+    218    CropTop                              int32s
+    219    CropRight                            int32s
+    220    CropBottom                           int32s
+    221    Tagged                               int32s
+    222    ColorClass                           int32s
+    223    Rating                               int32s
+    236    PreviewCropLeft                      int32s
+    237    PreviewCropTop                       int32s
+    238    PreviewCropRight                     int32s
+    239    PreviewCropBottom                    int32s
+
+=head3 PhotoMechanic XMP Tags
+
+Below is a list of the observed PhotoMechanic XMP tags.  The actual
+namespace prefix is "photomechanic" but ExifTool shortens this in
+the "XMP-photomech" family 1 group name.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  CountryCode                                   string/
+  EditStatus                                    string
+  Prefs                                         string
+  TimeCreated                                   string/
+
+=head2 Microsoft Tags
+
+=head3 Microsoft XMP Tags
+
+Microsoft Photo 1.0 schema XMP tags.  This is likely not a complete list,
+but represents tags which have been observed in sample images.  The actual
+namespace prefix is "MicrosoftPhoto", but ExifTool shortens this to
+"XMP-microsoft" in the family 1 group name.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  CameraSerialNumber                            string
+  DateAcquired                                  date
+  FlashManufacturer                             string
+  FlashModel                                    string
+  LastKeywordIPTC                               string+
+  LastKeywordXMP                                string+
+  LensManufacturer                              string
+  LensModel                                     string
+  RatingPercent                                 string
+
+=head3 Microsoft MP1 Tags
+
+Microsoft Photo 1.1 schema XMP tags which have been observed.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  PanoramicStitchCameraMotion                   string
+  PanoramicStitchMapType                        string
+  PanoramicStitchPhi0                           real
+  PanoramicStitchPhi1                           real
+  PanoramicStitchTheta0                         real
+  PanoramicStitchTheta1                         real
+
+=head3 Microsoft MP Tags
+
+Microsoft Photo 1.2 schema XMP tags which have been observed.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  RegionInfoMP                                  RegionInfoMP Struct
+  RegionInfoMPRegions                           Regions Struct_+
+  RegionPersonDisplayName                       string_+
+  RegionRectangle                               string_+
+
+=head3 Microsoft Stitch Tags
+
+Information found in the Microsoft custom EXIF tag 0x4748, as written by
+Windows Live Photo Gallery.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    PanoramicStitchVersion               int32u
+      1    PanoramicStitchCameraMotion          int32u
+      2    PanoramicStitchMapType               int32u
+      3    PanoramicStitchTheta0                float
+      4    PanoramicStitchTheta1                float
+      5    PanoramicStitchPhi0                  float
+      6    PanoramicStitchPhi1                  float
+
+=head2 GIMP Tags
+
+The GNU Image Manipulation Program (GIMP) writes these tags in its native
+XCF (eXperimental Computing Facilty) images.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'header' Header                               GIMP Header
+  0x0011   Compression                          N
+  0x0013   Resolution                           GIMP Resolution
+  0x0015   Parasites                            GIMP Parasite
+
+=head3 GIMP Header Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      9    XCFVersion                           N
+     14    ImageWidth                           N
+     18    ImageHeight                          N
+     22    ColorMode                            N
+
+=head3 GIMP Resolution Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    XResolution                          N
+      1    YResolution                          N
+
+=head3 GIMP Parasite Tags
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'exif-data'          ExifData                 EXIF
+  'gimp-comment'       Comment                  N
+  'gimp-metadata'      XMP                      XMP
+  'icc-profile'        ICC_Profile              ICC_Profile
+  'icc-profile-name'   ICCProfileName           N
+  'iptc-data'          IPTCData                 IPTC
+  'jpeg-exif-data'     JPEGExifData             EXIF
+
+=head2 MIE Tags
+
+MIE is a flexible format which may be used as a stand-alone meta information
+format, for encapsulation of other files and information, or as a trailer
+appended to other file formats.  The tables below represent currently
+defined MIE tags, however ExifTool will also extract any other information
+present in a MIE file.
+
+When writing MIE information, some special features are supported:
+
+1) String values may be written as ASCII (ISO 8859-1) or UTF-8.  ExifTool
+automatically detects the presence of wide characters and treats the string
+appropriately. Internally, UTF-8 text may be converted to UTF-16 or UTF-32
+and stored in this format in the file if it is more compact.
+
+2) All MIE string-value tags support localized text.  Localized values are
+written by adding a language/country code to the tag name in the form
+C<TAG-xx_YY>, where C<TAG> is the tag name, C<xx> is a 2-character lower
+case ISO 639-1 language code, and C<YY> is a 2-character upper case ISO
+3166-1 alpha 2 country code (ie. C<Title-en_US>).  But as usual, the user
+interface is case-insensitive, and ExifTool will write the correct case to
+the file.
+
+3) Some numerical MIE tags allow units of measurement to be specified.  For
+these tags, units may be added in brackets immediately following the value
+(ie. C<55(mi/h)>).  If no units are specified, the default units are
+written.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  '0Type'              SubfileType              string
+  '0Vers'              MIEVersion               string
+  '1Directory'         SubfileDirectory         string
+  '1Name'              SubfileName              string
+  '2MIME'              SubfileMIMEType          string
+  'Meta'               Meta                     MIE Meta
+  'data'               SubfileData              undef
+  'rsrc'               SubfileResource          undef
+  'zmd5'               MD5Digest                string
+  'zmie'               TrailerSignature         undef
+
+=head3 MIE Meta Tags
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'Audio'              Audio                    MIE Audio
+  'Camera'             Camera                   MIE Camera
+  'Document'           Document                 MIE Doc
+  'EXIF'               EXIF                     EXIF
+  'Geo'                Geo                      MIE Geo
+  'ICCProfile'         ICC_Profile              ICC_Profile
+  'ID3'                ID3                      ID3
+  'IPTC'               IPTC                     IPTC
+  'Image'              Image                    MIE Image
+  'MakerNotes'         MakerNotes               MIE MakerNotes
+  'Preview'            Preview                  MIE Preview
+  'Thumbnail'          Thumbnail                MIE Thumbnail
+  'Video'              Video                    MIE Video
+  'XMP'                XMP                      XMP
+
+=head3 MIE Audio Tags
+
+For the Audio group (and any other group containing a 'data' element), tags
+refer to the contained data if present, otherwise they refer to the main
+SubfileData.  The C<0Type> and C<1Name> elements should exist only if C<data>
+is present.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  '0Type'              RelatedAudioFileType     string
+  '1Name'              RelatedAudioFileName     string
+  'Channels'           Channels                 int8u
+  'Compression'        AudioCompression         string
+  'Duration'           Duration                 rational64u~
+  'SampleBits'         SampleBits               int16u
+  'SampleRate'         SampleRate               int32u
+  'data'               RelatedAudioFile         undef
+
+=head3 MIE Camera Tags
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'Brightness'         Brightness               int8s
+  'ColorBalance'       ColorBalance             rational64u[3]
+  'ColorTemperature'   ColorTemperature         int32u
+  'Contrast'           Contrast                 int8s
+  'DigitalZoom'        DigitalZoom              rational64u
+  'ExposureComp'       ExposureCompensation     rational64s
+  'ExposureMode'       ExposureMode             string
+  'ExposureTime'       ExposureTime             rational64u
+  'FirmwareVersion'    FirmwareVersion          string
+  'Flash'              Flash                    MIE Flash
+  'FocusMode'          FocusMode                string
+  'ISO'                ISO                      int16u
+  'ISOSetting'         ISOSetting               int16u
+  'ImageNumber'        ImageNumber              int32u
+  'ImageQuality'       ImageQuality             string
+  'ImageStabilization' ImageStabilization       int8u
+  'Lens'               Lens                     MIE Lens
+  'Make'               Make                     string
+  'MeasuredEV'         MeasuredEV               rational64s
+  'Model'              Model                    string
+  'Orientation'        Orientation              MIE Orient
+  'OwnerName'          OwnerName                string
+  'Saturation'         Saturation               int8s
+  'SensorSize'         SensorSize               rational64u[2]
+  'SerialNumber'       SerialNumber             string
+  'Sharpness'          Sharpness                int8s
+  'ShootingMode'       ShootingMode             string
+
+=head3 MIE Flash Tags
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'ExposureComp'       FlashExposureComp        rational64s
+  'Fired'              FlashFired               int8u
+  'GuideNumber'        FlashGuideNumber         string
+  'Make'               FlashMake                string
+  'Mode'               FlashMode                string
+  'Model'              FlashModel               string
+  'SerialNumber'       FlashSerialNumber        string
+  'Type'               FlashType                string
+
+=head3 MIE Lens Tags
+
+All recorded lens parameters (focal length, aperture, etc) include the
+effects of the extender if present.
+
+  Tag ID                  Tag Name              Writable
+  ------                  --------              --------
+  'Extender'              Extender              MIE Extender
+  'FNumber'               FNumber               rational64u
+  'FocalLength'           FocalLength           rational64u
+  'FocusDistance'         FocusDistance         rational64u
+  'Make'                  LensMake              string
+  'MaxAperture'           MaxAperture           rational64u
+  'MaxApertureAtMaxFocal' MaxApertureAtMaxFocal rational64u
+  'MaxFocalLength'        MaxFocalLength        rational64u
+  'MinAperture'           MinAperture           rational64u
+  'MinFocalLength'        MinFocalLength        rational64u
+  'Model'                 LensModel             string
+  'OpticalZoom'           OpticalZoom           rational64u
+  'SerialNumber'          LensSerialNumber      string
+
+=head3 MIE Extender Tags
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'Magnification'      ExtenderMagnification    rational64s
+  'Make'               ExtenderMake             string
+  'Model'              ExtenderModel            string
+  'SerialNumber'       ExtenderSerialNumber     string
+
+=head3 MIE Orient Tags
+
+These tags describe the camera orientation.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'Azimuth'            Azimuth                  rational64s
+  'Declination'        Declination              rational64s
+  'Elevation'          Elevation                rational64s
+  'RightAscension'     RightAscension           rational64s
+  'Rotation'           Rotation                 rational64s
+
+=head3 MIE Doc Tags
+
+Information describing the main document, image or file.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'Author'             Author                   string
+  'Comment'            Comment                  string
+  'Contributors'       Contributors             string+
+  'Copyright'          Copyright                string
+  'CreateDate'         CreateDate               string
+  'EMail'              EMail                    string
+  'Keywords'           Keywords                 string+
+  'ModifyDate'         ModifyDate               string
+  'OriginalDate'       DateTimeOriginal         string
+  'Phone'              PhoneNumber              string
+  'References'         References               string+
+  'Software'           Software                 string
+  'Title'              Title                    string
+  'URL'                URL                      string
+
+=head3 MIE Geo Tags
+
+Information related to geographic location.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'Address'            Address                  string
+  'City'               City                     string
+  'Country'            Country                  string
+  'GPS'                GPS                      MIE GPS
+  'PostalCode'         PostalCode               string
+  'State'              State                    string
+  'UTM'                UTM                      MIE UTM
+
+=head3 MIE GPS Tags
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'Altitude'           GPSAltitude              rational64s
+  'Bearing'            GPSDestBearing           rational64s
+  'DateTime'           GPSDateTime              string
+  'Datum'              GPSMapDatum              string
+  'Differential'       GPSDifferential          int8u
+  'Distance'           GPSDestDistance          rational64s
+  'Heading'            GPSTrack                 rational64s
+  'Latitude'           GPSLatitude              rational64s[n]
+  'Longitude'          GPSLongitude             rational64s[n]
+  'MeasureMode'        GPSMeasureMode           int8u
+  'Satellites'         GPSSatellites            string
+  'Speed'              GPSSpeed                 rational64s
+
+=head3 MIE UTM Tags
+
+  Tag ID       Tag Name                         Writable
+  ------       --------                         --------
+  'Datum'      UTMMapDatum                      string
+  'Easting'    UTMEasting                       string
+  'Northing'   UTMNorthing                      string
+  'Zone'       UTMZone                          int8s
+
+=head3 MIE Image Tags
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  '0Type'              FullSizeImageType        string
+  '1Name'              FullSizeImageName        string
+  'BitDepth'           BitDepth                 int16u
+  'ColorSpace'         ColorSpace               string
+  'Components'         ComponentsConfiguration  string
+  'Compression'        CompressionRatio         rational32u
+  'ImageSize'          ImageSize                int16u[n]
+  'Resolution'         Resolution               rational64u[n]
+  'data'               FullSizeImage            undef
+
+=head3 MIE MakerNotes Tags
+
+MIE maker notes are contained within separate groups for each manufacturer
+to avoid name conflicts.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'Canon'              Canon                    MIE Canon
+  'Casio'              Casio                    MIE Unknown
+  'FujiFilm'           FujiFilm                 MIE Unknown
+  'Kodak'              Kodak                    MIE Unknown
+  'KonicaMinolta'      KonicaMinolta            MIE Unknown
+  'Nikon'              Nikon                    MIE Unknown
+  'Olympus'            Olympus                  MIE Unknown
+  'Panasonic'          Panasonic                MIE Unknown
+  'Pentax'             Pentax                   MIE Unknown
+  'Ricoh'              Ricoh                    MIE Unknown
+  'Sigma'              Sigma                    MIE Unknown
+  'Sony'               Sony                     MIE Unknown
+
+=head3 MIE Canon Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'VRD'    CanonVRD                             CanonVRD
+
+=head3 MIE Unknown Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  [no tags known]
+
+=head3 MIE Preview Tags
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  '0Type'              PreviewImageType         string
+  '1Name'              PreviewImageName         string
+  'ImageSize'          PreviewImageSize         int16u[n]
+  'data'               PreviewImage             undef
+
+=head3 MIE Thumbnail Tags
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  '0Type'              ThumbnailImageType       string
+  '1Name'              ThumbnailImageName       string
+  'ImageSize'          ThumbnailImageSize       int16u[n]
+  'data'               ThumbnailImage           undef
+
+=head3 MIE Video Tags
+
+  Tag ID       Tag Name                         Writable
+  ------       --------                         --------
+  '0Type'      RelatedVideoFileType             string
+  '1Name'      RelatedVideoFileName             string
+  'Codec'      Codec                            string
+  'Duration'   Duration                         rational64u~
+  'data'       RelatedVideoFile                 undef
+
+=head2 Jpeg2000 Tags
+
+The tags below are extracted from JPEG 2000 images, however ExifTool
+currently writes only EXIF, IPTC and XMP tags in these images.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'asoc'   Association                          N
+  'bfil'   BinaryFilter                         N
+  'bpcc'   BitsPerComponent                     N
+  'cdef'   ComponentDefinition                  N
+  'cgrp'   ColorGroup                           N
+  'chck'   DigitalSignature                     N
+  'cmap'   ComponentMapping                     N
+  'colr'   ICC_Profile                          ICC_Profile
+           Colorspace                           N
+           ColorSpecification                   N
+  'comp'   Composition                          N
+  'copt'   CompositionOptions                   N
+  'cref'   Cross-Reference                      N
+  'creg'   CodestreamRegistration               N
+  'drep'   DesiredReproductions                 N
+  'dtbl'   DataReference                        N
+  'flst'   FragmentList                         N
+  'free'   Free                                 N
+  'ftbl'   FragmentTable                        N
+  'ftyp'   FileType                             Jpeg2000 FileType
+  'gtso'   GraphicsTechnologyStandardOutput     N
+  'ihdr'   ImageHeader                          Jpeg2000 ImageHeader
+  'inst'   InstructionSet                       N
+  'jP  '   JP2Signature                         N
+  'jp2c'   ContiguousCodestream                 N
+  'jp2h'   JP2Header                            Jpeg2000
+  'jp2i'   IntellectualProperty                 XMP
+  'jpch'   CodestreamHeader                     Jpeg2000
+  'jplh'   CompositingLayerHeader               Jpeg2000
+  'lbl '   Label                                N
+  'mdat'   MediaData                            N
+  'mp7b'   MPEG7Binary                          N
+  'nlst'   NumberList                           N
+  'opct'   Opacity                              N
+  'pclr'   Palette                              N
+  'prfl'   Profile                              N
+  'res '   Resolution                           Jpeg2000
+  'resc'   CaptureResolution                    Jpeg2000 CaptureResolution
+  'resd'   DisplayResolution                    Jpeg2000 DisplayResolution
+  'roid'   ROIDescription                       N
+  'rreq'   ReaderRequirements                   N
+  'uinf'   UUIDInfo                             Jpeg2000
+  'ulst'   UUIDList                             N
+  'url '   URL                                  N
+  'uuid'   UUID-EXIF                            EXIF
+           UUID-IPTC                            IPTC
+           UUID-XMP                             XMP
+           UUID-GeoJP2                          EXIF
+           UUID-Unknown                         N
+  'xml '   XML                                  XMP
+
+=head3 Jpeg2000 FileType Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    MajorBrand                           N
+      1    MinorVersion                         N
+      2    CompatibleBrands                     N
+
+=head3 Jpeg2000 ImageHeader Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ImageHeight                          N
+      4    ImageWidth                           N
+      8    NumberOfComponents                   N
+     10    BitsPerComponent                     N
+     11    Compression                          N
+
+=head3 Jpeg2000 CaptureResolution Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    CaptureYResolution                   N
+      4    CaptureXResolution                   N
+      8    CaptureYResolutionUnit               N
+      9    CaptureXResolutionUnit               N
+
+=head3 Jpeg2000 DisplayResolution Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    DisplayYResolution                   N
+      4    DisplayXResolution                   N
+      8    DisplayYResolutionUnit               N
+      9    DisplayXResolutionUnit               N
+
+=head2 GIF Tags
+
+This table lists information extracted from GIF images. See
+L<http://www.w3.org/Graphics/GIF/spec-gif89a.txt> for the official GIF89a
+specification.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  AnimationExtension                            GIF Animate
+  Comment                                       Y
+  Duration                                      N
+  FrameCount                                    N
+  GIFVersion                                    N
+  ScreenDescriptor                              GIF Screen
+  Text                                          N
+  XMPExtension                                  XMP
+
+=head3 GIF Animate Tags
+
+Information extracted from the "NETSCAPE2.0" animation extension.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      2    AnimationIterations                  N
+
+=head3 GIF Screen Tags
+
+Information extracted from the GIF logical screen descriptor.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ImageWidth                           N
+      2    ImageHeight                          N
+    4.1    HasColorMap                          N
+    4.2    ColorResolutionDepth                 N
+    4.3    BitsPerPixel                         N
+      5    BackgroundColor                      N
+
+=head2 BMP Tags
+
+There really isn't much meta information in a BMP file as such, just a bit
+of image related information.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      4    ImageWidth                           N
+      8    ImageHeight                          N
+     12    Planes                               N
+     14    BitDepth                             N
+     16    Compression                          N
+     20    ImageLength                          N
+     24    PixelsPerMeterX                      N
+     28    PixelsPerMeterY                      N
+     32    NumColors                            N
+     36    NumImportantColors                   N
+
+=head3 BMP OS2 Tags
+
+Information extracted from OS/2-format BMP images.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      4    ImageWidth                           N
+      6    ImageHeight                          N
+      8    Planes                               N
+     10    BitDepth                             N
+
+=head2 PICT Tags
+
+The PICT format contains no true meta information, except for the possible
+exception of the LongComment opcode.  By default, only ImageWidth,
+ImageHeight and X/YResolution are extracted from a PICT image.  Tags in the
+following table represent image opcodes.  Extraction of these tags is
+experimental, and is only enabled with the Verbose or Unknown options.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0000   Nop                                  N
+  0x0001   ClipRgn                              N
+  0x0002   BkPat                                N
+  0x0003   TxFont                               N
+  0x0004   TxFace                               N
+  0x0005   TxMode                               N
+  0x0006   SpExtra                              N
+  0x0007   PnSize                               N
+  0x0008   PnMode                               N
+  0x0009   PnPat                                N
+  0x000a   FillPat                              N
+  0x000b   OvSize                               N
+  0x000c   Origin                               N
+  0x000d   TxSize                               N
+  0x000e   FgColor                              N
+  0x000f   BkColor                              N
+  0x0010   TxRatio                              N
+  0x0011   VersionOp                            N
+  0x0012   BkPixPat                             N
+  0x0013   PnPixPat                             N
+  0x0014   FillPixPat                           N
+  0x0015   PnLocHFrac                           N
+  0x0016   ChExtra                              N
+  0x0017   Reserved                             N
+  0x001a   RGBFgCol                             N
+  0x001b   RGBBkCol                             N
+  0x001c   HiliteMode                           N
+  0x001d   HiliteColor                          N
+  0x001e   DefHilite                            N
+  0x001f   OpColor                              N
+  0x0020   Line                                 N
+  0x0021   LineFrom                             N
+  0x0022   ShortLine                            N
+  0x0023   ShortLineFrom                        N
+  0x0024   Reserved                             N
+  0x0028   LongText                             N
+  0x0029   DHText                               N
+  0x002a   DVText                               N
+  0x002b   DHDVText                             N
+  0x002c   FontName                             N
+  0x002d   LineJustify                          N
+  0x002e   GlyphState                           N
+  0x002f   Reserved                             N
+  0x0030   FrameRect                            N
+  0x0031   PaintRect                            N
+  0x0032   EraseRect                            N
+  0x0033   InvertRect                           N
+  0x0034   FillRect                             N
+  0x0035   Reserved                             N
+  0x0038   FrameSameRect                        N
+  0x0039   PaintSameRect                        N
+  0x003a   EraseSameRect                        N
+  0x003b   InvertSameRect                       N
+  0x003c   FillSameRect                         N
+  0x003d   Reserved                             N
+  0x0040   FrameRRect                           N
+  0x0041   PaintRRect                           N
+  0x0042   EraseRRect                           N
+  0x0043   InvertRRect                          N
+  0x0044   FillRRect                            N
+  0x0045   Reserved                             N
+  0x0048   FrameSameRRect                       N
+  0x0049   PaintSameRRect                       N
+  0x004a   EraseSameRRect                       N
+  0x004b   InvertSameRRect                      N
+  0x004c   FillSameRRect                        N
+  0x004d   Reserved                             N
+  0x0050   FrameOval                            N
+  0x0051   PaintOval                            N
+  0x0052   EraseOval                            N
+  0x0053   InvertOval                           N
+  0x0054   FillOval                             N
+  0x0055   Reserved                             N
+  0x0058   FrameSameOval                        N
+  0x0059   PaintSameOval                        N
+  0x005a   EraseSameOval                        N
+  0x005b   InvertSameOval                       N
+  0x005c   FillSameOval                         N
+  0x005d   Reserved                             N
+  0x0060   FrameArc                             N
+  0x0061   PaintArc                             N
+  0x0062   EraseArc                             N
+  0x0063   InvertArc                            N
+  0x0064   FillArc                              N
+  0x0065   Reserved                             N
+  0x0068   FrameSameArc                         N
+  0x0069   PaintSameArc                         N
+  0x006a   EraseSameArc                         N
+  0x006b   InvertSameArc                        N
+  0x006c   FillSameArc                          N
+  0x006d   Reserved                             N
+  0x0070   FramePoly                            N
+  0x0071   PaintPoly                            N
+  0x0072   ErasePoly                            N
+  0x0073   InvertPoly                           N
+  0x0074   FillPoly                             N
+  0x0075   Reserved                             N
+  0x0078   FrameSamePoly                        N
+  0x0079   PaintSamePoly                        N
+  0x007a   EraseSamePoly                        N
+  0x007b   InvertSamePoly                       N
+  0x007c   FillSamePoly                         N
+  0x007d   Reserved                             N
+  0x0080   FrameRgn                             N
+  0x0081   PaintRgn                             N
+  0x0082   EraseRgn                             N
+  0x0083   InvertRgn                            N
+  0x0084   FillRgn                              N
+  0x0085   Reserved                             N
+  0x0088   FrameSameRgn                         N
+  0x0089   PaintSameRgn                         N
+  0x008a   EraseSameRgn                         N
+  0x008b   InvertSameRgn                        N
+  0x008c   FillSameRgn                          N
+  0x008d   Reserved                             N
+  0x0090   BitsRect                             N
+  0x0091   BitsRgn                              N
+  0x0092   Reserved                             N
+  0x0098   PackBitsRect                         N
+  0x0099   PackBitsRgn                          N
+  0x009a   DirectBitsRect                       N
+  0x009b   DirectBitsRgn                        N
+  0x009c   Reserved                             N
+  0x009d   Reserved                             N
+  0x009e   Reserved                             N
+  0x009f   Reserved                             N
+  0x00a0   ShortComment                         N
+  0x00a1   LongComment                          Photoshop
+                                                ICC_Profile
+  0x00a2   Reserved                             N
+  0x00b0   Reserved                             N
+  0x00d0   Reserved                             N
+  0x00ff   OpEndPic                             N
+  0x0100   Reserved                             N
+  0x0200   Reserved                             N
+  0x02ff   Version                              N
+  0x0300   Reserved                             N
+  0x0bff   Reserved                             N
+  0x0c00   HeaderOp                             N
+  0x0c01   Reserved                             N
+  0x7f00   Reserved                             N
+  0x8000   Reserved                             N
+  0x8100   Reserved                             N
+  0x8200   CompressedQuickTime                  N
+  0x8201   UncompressedQuickTime                N
+  0xffff   Reserved                             N
+
+=head2 PNG Tags
+
+Tags extracted from PNG images.  See
+L<http://www.libpng.org/pub/png/spec/1.2/> for the official PNG 1.2
+specification.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'IHDR'   ImageHeader                          PNG ImageHeader
+  'PLTE'   Palette                              N
+  'bKGD'   BackgroundColor                      N
+  'cHRM'   PrimaryChromaticities                PNG PrimaryChromaticities
+  'dSIG'   DigitalSignature                     N
+  'fRAc'   FractalParameters                    N
+  'gAMA'   Gamma                                N
+  'gIFg'   GIFGraphicControlExtension           N
+  'gIFt'   GIFPlainTextExtension                N
+  'gIFx'   GIFApplicationExtension              N
+  'hIST'   PaletteHistogram                     N
+  'iCCP'   ICC_Profile                          ICC_Profile
+  'iTXt'   InternationalText                    PNG TextualData
+  'oFFs'   ImageOffset                          N
+  'pCAL'   PixelCalibration                     N
+  'pHYs'   PhysicalPixel                        PNG PhysicalPixel
+  'sBIT'   SignificantBits                      N
+  'sCAL'   SubjectScale                         PNG SubjectScale
+  'sPLT'   SuggestedPalette                     N
+  'sRGB'   SRGBRendering                        N
+  'sTER'   StereoImage                          PNG StereoImage
+  'tEXt'   TextualData                          PNG TextualData
+  'tIME'   ModifyDate                           Y
+  'tRNS'   Transparency                         N
+  'tXMP'   XMP                                  XMP
+  'vpAg'   VirtualPage                          PNG VirtualPage
+  'zTXt'   CompressedText                       PNG TextualData
+
+=head3 PNG ImageHeader Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ImageWidth                           N
+      4    ImageHeight                          N
+      8    BitDepth                             N
+      9    ColorType                            N
+     10    Compression                          N
+     11    Filter                               N
+     12    Interlace                            N
+
+=head3 PNG PrimaryChromaticities Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    WhitePointX                          N
+      1    WhitePointY                          N
+      2    RedX                                 N
+      3    RedY                                 N
+      4    GreenX                               N
+      5    GreenY                               N
+      6    BlueX                                N
+      7    BlueY                                N
+
+=head3 PNG TextualData Tags
+
+The PNG TextualData format allows arbitrary tag names to be used.  The tags
+listed below are the only ones that can be written (unless new user-defined
+tags are added via the configuration file), however ExifTool will extract
+any other TextualData tags that are found.
+
+These tags may be stored as tEXt, zTXt or iTXt chunks in the PNG image.  By
+default ExifTool writes new string-value tags as as uncompressed tEXt, or
+compressed zTXt if the Compress (-z) option is used and Compress::Zlib is
+available.  Alternate language tags and values containing special characters
+(unless the Latin character set is used) are written as iTXt, and compressed
+if the Compress option is used and Compress::Zlib is available.  Raw profile
+information is always created as compressed zTXt if Compress::Zlib is
+available, or tEXt otherwise.  Standard XMP is written as uncompressed iTXt.
+
+Alternate languages are accessed by suffixing the tag name with a '-',
+followed by an RFC 3066 language code (ie. "PNG:Comment-fr", or
+"Title-en-US").  See L<http://www.ietf.org/rfc/rfc3066.txt> for the RFC 3066
+specification.
+
+Some of the tags below are not registered as part of the PNG specification,
+but are included here because they are generated by other software such as
+ImageMagick.
+
+  Tag ID                  Tag Name              Writable
+  ------                  --------              --------
+  'Artist'                Artist                string
+  'Author'                Author                string
+  'Comment'               Comment               string
+  'Copyright'             Copyright             string
+  'Creation Time'         CreationTime          string
+  'Description'           Description           string
+  'Disclaimer'            Disclaimer            string
+  'Document'              Document              string
+  'Label'                 Label                 string
+  'Make'                  Make                  string
+  'Model'                 Model                 string
+  'Raw profile type APP1' APP1_Profile          EXIF
+                                                XMP
+  'Raw profile type exif' EXIF_Profile          EXIF
+  'Raw profile type icc'  ICC_Profile           ICC_Profile
+  'Raw profile type icm'  ICC_Profile           ICC_Profile
+  'Raw profile type iptc' IPTC_Profile          Photoshop
+  'Raw profile type xmp'  XMP_Profile           XMP
+  'Software'              Software              string
+  'Source'                Source                string
+  'TimeStamp'             TimeStamp             string
+  'Title'                 Title                 string
+  'URL'                   URL                   string
+  'Warning'               PNGWarning            string
+  'XML:com.adobe.xmp'     XMP                   XMP
+  'create-date'           CreateDate            string
+  'modify-date'           ModDate               string
+
+=head3 PNG PhysicalPixel Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    PixelsPerUnitX                       N
+      4    PixelsPerUnitY                       N
+      8    PixelUnits                           N
+
+=head3 PNG SubjectScale Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    SubjectUnits                         N
+      1    SubjectPixelWidth                    N
+      2    SubjectPixelHeight                   N
+
+=head3 PNG StereoImage Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    StereoMode                           N
+
+=head3 PNG VirtualPage Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    VirtualImageWidth                    N
+      1    VirtualImageHeight                   N
+      2    VirtualPageUnits                     N
+
+=head2 MNG Tags
+
+This table contains definitions for tags found in MNG and JNG images.  MNG
+is a superset of PNG and JNG, so a MNG image may contain any of these tags
+as well as any PNG tags.  Conversely, only some of these tags are valid for
+JNG images.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'BACK'   Background                           MNG Background
+  'BASI'   BasisObject                          MNG BasisObject
+  'CLIP'   ClipObjects                          MNG ClipObjects
+  'CLON'   CloneObject                          MNG CloneObject
+  'DBYK'   DropByKeyword                        N
+  'DEFI'   DefineObject                         MNG DefineObject
+  'DHDR'   DeltaPNGHeader                       MNG DeltaPNGHeader
+  'DISC'   DiscardObjects                       N
+  'DROP'   DropChunks                           N
+  'FRAM'   Frame                                N
+  'JHDR'   JNGHeader                            MNG JNGHeader
+  'LOOP'   Loop                                 MNG Loop
+  'MAGN'   MagnifyObject                        MNG MagnifyObject
+  'MHDR'   MNGHeader                            MNG MNGHeader
+  'MOVE'   MoveObjects                          MNG MoveObjects
+  'ORDR'   OrderingRestrictions                 N
+  'PAST'   PasteImage                           MNG PasteImage
+  'PPLT'   PartialPalette                       N
+  'PROM'   PromoteParent                        MNG PromoteParent
+  'SAVE'   SaveObjects                          N
+  'SEEK'   SeekPoint                            N
+  'SHOW'   ShowObjects                          MNG ShowObjects
+  'TERM'   TerminationAction                    MNG TerminationAction
+  'eXPi'   ExportImage                          MNG ExportImage
+  'fPRI'   FramePriority                        MNG FramePriority
+  'nEED'   ResourcesNeeded                      N
+  'pHYg'   GlobalPixelSize                      PNG PhysicalPixel
+
+=head3 MNG Background Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    BackgroundColor                      N
+      6    MandatoryBackground                  N
+      7    BackgroundImageID                    N
+      9    BackgroundTiling                     N
+
+=head3 MNG BasisObject Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ImageWidth                           N
+      4    ImageHeight                          N
+      8    BitDepth                             N
+      9    ColorType                            N
+     10    Compression                          N
+     11    Filter                               N
+     12    Interlace                            N
+     13    RedSample                            N
+     17    GreenSample                          N
+     21    BlueSample                           N
+     25    AlphaSample                          N
+     26    Viewable                             N
+
+=head3 MNG ClipObjects Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    FirstObject                          N
+      2    LastObject                           N
+      4    DeltaType                            N
+      5    ClipBoundary                         N
+
+=head3 MNG CloneObject Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    SourceID                             N
+      2    CloneID                              N
+      4    CloneType                            N
+      5    DoNotShow                            N
+      6    ConcreteFlag                         N
+      7    LocalDeltaType                       N
+      8    DeltaXY                              N
+
+=head3 MNG DefineObject Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ObjectID                             N
+      2    DoNotShow                            N
+      3    ConcreteFlag                         N
+      4    XYLocation                           N
+     12    ClippingBoundary                     N
+
+=head3 MNG DeltaPNGHeader Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ObjectID                             N
+      2    ImageType                            N
+      3    DeltaType                            N
+      4    BlockSize                            N
+     12    BlockLocation                        N
+
+=head3 MNG JNGHeader Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ImageWidth                           N
+      4    ImageHeight                          N
+      8    ColorType                            N
+      9    BitDepth                             N
+     10    Compression                          N
+     11    Interlace                            N
+     12    AlphaBitDepth                        N
+     13    AlphaCompression                     N
+     14    AlphaFilter                          N
+     15    AlphaInterlace                       N
+
+=head3 MNG Loop Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    NestLevel                            N
+      1    IterationCount                       N
+      5    TerminationCondition                 N
+      6    IterationMinMax                      N
+     14    SignalNumber                         N
+
+=head3 MNG MagnifyObject Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    FirstObjectID                        N
+      2    LastObjectID                         N
+      4    XMethod                              N
+      5    XMag                                 N
+      7    YMag                                 N
+      9    LeftMag                              N
+     11    RightMag                             N
+     13    TopMag                               N
+     15    BottomMag                            N
+     17    YMethod                              N
+
+=head3 MNG MNGHeader Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ImageWidth                           N
+      1    ImageHeight                          N
+      2    TicksPerSecond                       N
+      3    NominalLayerCount                    N
+      4    NominalFrameCount                    N
+      5    NominalPlayTime                      N
+      6    SimplicityProfile                    N
+
+=head3 MNG MoveObjects Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    FirstObject                          N
+      2    LastObject                           N
+      4    DeltaType                            N
+      5    DeltaXY                              N
+
+=head3 MNG PasteImage Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    DestinationID                        N
+      2    TargetDeltaType                      N
+      3    TargetXY                             N
+     11    SourceID                             N
+     13    CompositionMode                      N
+     14    Orientation                          N
+     15    OffsetOrigin                         N
+     16    OffsetXY                             N
+     24    BoundaryOrigin                       N
+     25    PastClippingBoundary                 N
+
+=head3 MNG PromoteParent Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    NewColorType                         N
+      1    NewBitDepth                          N
+      2    FillMethod                           N
+
+=head3 MNG ShowObjects Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    FirstObject                          N
+      2    LastObject                           N
+      4    ShowMode                             N
+
+=head3 MNG TerminationAction Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    TerminationAction                    N
+      1    IterationEndAction                   N
+      2    Delay                                N
+      6    IterationMax                         N
+
+=head3 MNG ExportImage Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    SnapshotID                           N
+      2    SnapshotName                         N
+
+=head3 MNG FramePriority Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    DeltaType                            N
+      2    Priority                             N
+
+=head2 DjVu Tags
+
+Information is extracted from the following chunks in DjVu images.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'ANTa'   ANTa                                 DjVu Ant
+  'ANTz'   CompressedAnnotation                 DjVu Ant
+  'FORM'   FORM                                 DjVu Form
+  'INCL'   IncludedFileID                       N
+  'INFO'   INFO                                 DjVu Info
+
+=head3 DjVu Ant Tags
+
+Information extracted from annotation chunks.
+
+  Tag ID       Tag Name                         Writable
+  ------       --------                         --------
+  'metadata'   Metadata                         DjVu Meta
+  'xmp'        XMP                              XMP
+
+=head3 DjVu Meta Tags
+
+This table lists the standard DjVu metadata tags, but ExifTool will extract
+any tags that exist even if they don't appear here.  The DjVu v3
+documentation endorses tags borrowed from two standards: 1) BibTeX
+bibliography system tags (all lowercase Tag ID's in the table below), and 2)
+PDF DocInfo tags (uppercase Tag ID's).
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'Author'             Author                   N
+  'CreationDate'       CreateDate               N
+  'Creator'            Creator                  N
+  'Keywords'           Keywords                 N
+  'ModDate'            ModifyDate               N
+  'Producer'           Producer                 N
+  'Subject'            Subject                  N
+  'Title'              Title                    N
+  'Trapped'            Trapped                  N
+  'address'            Address                  N
+  'annote'             Annotation               N
+  'author'             Author                   N
+  'booktitle'          BookTitle                N
+  'chapter'            Chapter                  N
+  'crossref'           CrossRef                 N
+  'edition'            Edition                  N
+  'eprint'             EPrint                   N
+  'howpublished'       HowPublished             N
+  'institution'        Institution              N
+  'journal'            Journal                  N
+  'key'                Key                      N
+  'month'              Month                    N
+  'note'               Note                     N
+  'number'             Number                   N
+  'organization'       Organization             N
+  'pages'              Pages                    N
+  'publisher'          Publisher                N
+  'school'             School                   N
+  'series'             Series                   N
+  'title'              Title                    N
+  'type'               Type                     N
+  'url'                URL                      N
+  'volume'             Volume                   N
+  'year'               Year                     N
+
+=head3 DjVu Form Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    SubfileType                          N
+
+=head3 DjVu Info Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ImageWidth                           N
+      2    ImageHeight                          N
+      4    DjVuVersion                          N
+      6    SpatialResolution                    N
+      8    Gamma                                N
+      9    Orientation                          N
+
+=head2 PGF Tags
+
+The following table lists information extracted from the header of
+Progressive Graphics File (PGF) images.  As well, information is extracted
+from the embedded PNG metadata image if it exists.  See
+L<http://www.libpgf.org/> for the PGF specification.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      3    PGFVersion                           N
+      8    ImageWidth                           N
+     12    ImageHeight                          N
+     16    PyramidLevels                        N
+     17    Quality                              N
+     18    BitsPerPixel                         N
+     19    ColorComponents                      N
+     20    ColorMode                            N
+     21    BackgroundColor                      N
+
+=head2 MIFF Tags
+
+The MIFF (Magick Image File Format) format allows aribrary tag names to be
+used.  Only the standard tag names are listed below, however ExifTool will
+decode any tags found in the image.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'background-color'   BackgroundColor          N
+  'blue-primary'       BluePrimary              N
+  'border-color'       BorderColor              N
+  'class'              Class                    N
+  'colors'             Colors                   N
+  'colorspace'         Colorspace               N
+  'columns'            ImageWidth               N
+  'compression'        Compression              N
+  'delay'              Delay                    N
+  'depth'              Depth                    N
+  'dispose'            Dispose                  N
+  'gamma'              Gamma                    N
+  'green-primary'      GreenPrimary             N
+  'id'                 ID                       N
+  'iterations'         Iterations               N
+  'label'              Label                    N
+  'matt-color'         MattColor                N
+  'matte'              Matte                    N
+  'montage'            Montage                  N
+  'packets'            Packets                  N
+  'page'               Page                     N
+  'profile-APP1'       APP1_Profile             EXIF
+                                                XMP
+  'profile-exif'       EXIF_Profile             EXIF
+  'profile-icc'        ICC_Profile              ICC_Profile
+  'profile-iptc'       IPTC_Profile             Photoshop
+  'profile-xmp'        XMP_Profile              XMP
+  'red-primary'        RedPrimary               N
+  'rendering-intent'   RenderingIntent          N
+  'resolution'         Resolution               N
+  'rows'               ImageHeight              N
+  'scene'              Scene                    N
+  'signature'          Signature                N
+  'units'              Units                    N
+  'white-point'        WhitePoint               N
+
+=head2 PSP Tags
+
+Tags extracted from Paint Shop Pro images (PSP, PSPIMAGE, PSPFRAME,
+PSPSHAPE, PSPTUBE and TUB extensions).
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'FileVersion'        FileVersion              N
+  0x0000               ImageInfo                PSP Image
+                                                PSP Image
+  0x0001               CreatorInfo              PSP Creator
+  0x000a               ExtendedInfo             PSP Ext
+
+=head3 PSP Image Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ImageWidth                           N
+      4    ImageHeight                          N
+      8    ImageResolution                      N
+     16    ResolutionUnit                       N
+     17    Compression                          N
+     19    BitsPerSample                        N
+     21    Planes                               N
+     23    NumColors                            N
+
+=head3 PSP Creator Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0000   Title                                N
+  0x0001   CreateDate                           N
+  0x0002   ModifyDate                           N
+  0x0003   Artist                               N
+  0x0004   Copyright                            N
+  0x0005   Description                          N
+  0x0006   CreatorAppID                         N
+  0x0007   CreatorAppVersion                    N
+
+=head3 PSP Ext Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0003   EXIFInfo                             EXIF
+
+=head2 PDF Tags
+
+The tags listed in the PDF tables below are those which are used by ExifTool
+to extract meta information, but they are only a small fraction of the total
+number of available PDF tags.  See
+L<http://www.adobe.com/devnet/pdf/pdf_reference.html> for the official PDF
+specification.
+
+ExifTool supports reading and writing PDF documents up to version 1.7
+extension level 3, including support for RC4, AES-128 and AES-256
+encryption.  A Password option is provided to allow processing of
+password-protected PDF files.
+
+When writing PDF files, ExifTool uses an incremental update.  This has the
+advantages of being fast and reversible.  The original PDF can be easily
+recovered by deleting the C<PDF-update> pseudo-group (with
+C<-PDF-update:all=> on the command line).  But there are two main
+disadvantages to this technique:
+
+1) A linearized PDF file is no longer linearized after the update, so it
+must be subsequently re-linearized if this is required.
+
+2) All metadata edits are reversible.  While this would normally be
+considered an advantage, it is a potential security problem because old
+information is never actually deleted from the file.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'Encrypt'            Encrypt                  PDF Encrypt
+  'Info'               Info                     PDF Info
+  'Root'               Root                     PDF Root
+  '_linearized'        Linearized               N
+
+=head3 PDF Encrypt Tags
+
+Tags extracted from the document Encrypt dictionary.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'Filter' Encryption                           N
+  'P'      UserAccess                           N
+
+=head3 PDF Info Tags
+
+As well as the tags listed below, the PDF specification allows for
+user-defined tags to exist in the Info dictionary.  These tags, which should
+have corresponding XMP-pdfx entries in the XMP of the PDF XML Metadata
+object, are also extracted by ExifTool.
+
+B<Writable> specifies the value format, and may be C<string>, C<date>,
+C<integer>, C<real>, C<boolean> or C<name> for PDF tags.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'AAPL:Keywords'      AppleKeywords            string+
+  'Author'             Author                   string
+  'CreationDate'       CreateDate               date
+  'Creator'            Creator                  string
+  'Keywords'           Keywords                 string+
+  'ModDate'            ModifyDate               date
+  'Producer'           Producer                 string
+  'Subject'            Subject                  string
+  'Title'              Title                    string
+  'Trapped'            Trapped                  string!
+
+=head3 PDF Root Tags
+
+This is the PDF document catalog.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'Lang'               Language                 N
+  'MarkInfo'           MarkInfo                 PDF MarkInfo
+  'Metadata'           Metadata                 PDF Metadata
+  'PageLayout'         PageLayout               N
+  'PageMode'           PageMode                 N
+  'Pages'              Pages                    PDF Pages
+  'Perms'              Perms                    PDF Perms
+  'Version'            PDFVersion               N
+
+=head3 PDF MarkInfo Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'Marked' TaggedPDF                            N
+
+=head3 PDF Metadata Tags
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'XML_stream'         XMP                      XMP
+
+=head3 PDF Pages Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'Count'  PageCount                            N
+  'Kids'   Kids                                 PDF Kids
+
+=head3 PDF Kids Tags
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'Metadata'           Metadata                 PDF Metadata
+  'PieceInfo'          PieceInfo                PDF PieceInfo
+  'Resources'          Resources                PDF Resources
+
+=head3 PDF PieceInfo Tags
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'AdobePhotoshop'     AdobePhotoshop           PDF AdobePhotoshop
+  'Illustrator'        Illustrator              PDF Illustrator
+
+=head3 PDF AdobePhotoshop Tags
+
+  Tag ID       Tag Name                         Writable
+  ------       --------                         --------
+  'Private'    Private                          PDF Private
+
+=head3 PDF Private Tags
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'ImageResources'     ImageResources           PDF ImageResources
+
+=head3 PDF ImageResources Tags
+
+  Tag ID       Tag Name                         Writable
+  ------       --------                         --------
+  '_stream'    _stream                          Photoshop
+
+=head3 PDF Illustrator Tags
+
+  Tag ID       Tag Name                         Writable
+  ------       --------                         --------
+  'Private'    Private                          PDF AIPrivate
+
+=head3 PDF AIPrivate Tags
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'AIMetaData'         AIMetaData               PDF AIMetaData
+  'AIPrivateData'      AIPrivateData            PostScript
+  'ContainerVersion'   ContainerVersion         N
+  'CreatorVersion'     CreatorVersion           N
+  'RoundTripVersion'   RoundTripVersion         N
+
+=head3 PDF AIMetaData Tags
+
+  Tag ID       Tag Name                         Writable
+  ------       --------                         --------
+  '_stream'    _stream                          PostScript
+
+=head3 PDF Resources Tags
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'ColorSpace'         ColorSpace               PDF ColorSpace
+
+=head3 PDF ColorSpace Tags
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'DefaultRGB'         DefaultRGB               PDF DefaultRGB
+
+=head3 PDF DefaultRGB Tags
+
+  Tag ID       Tag Name                         Writable
+  ------       --------                         --------
+  'ICCBased'   ICCBased                         PDF ICCBased
+
+=head3 PDF ICCBased Tags
+
+  Tag ID       Tag Name                         Writable
+  ------       --------                         --------
+  '_stream'    _stream                          ICC_Profile
+
+=head3 PDF Perms Tags
+
+Additional document permissions imposed by digital signatures.
+
+  Tag ID       Tag Name                         Writable
+  ------       --------                         --------
+  'DocMDP'     DocMDP                           PDF Signature
+  'FieldMDP'   FieldMDP                         PDF Signature
+  'UR3'        UR3                              PDF Signature
+
+=head3 PDF Signature Tags
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'ContactInfo'        SignerContactInfo        N
+  'Location'           SigningLocation          N
+  'M'                  SigningDate              N
+  'Name'               SigningAuthority         N
+  'Prop_AuthTime'      AuthenticationTime       N
+  'Prop_AuthType'      AuthenticationType       N
+  'Reason'             SigningReason            N
+  'Reference'          Reference                PDF Reference
+
+=head3 PDF Reference Tags
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'TransformParams'    TransformParams          PDF TransformParams
+
+=head3 PDF TransformParams Tags
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'Action'             FieldPermissions         N
+  'Annots'             AnnotationUsageRights    N+
+  'Document'           DocumentUsageRights      N+
+  'EF'                 EmbeddedFileUsageRights  N+
+  'Fields'             FormFields               N+
+  'Form'               FormUsageRights          N+
+  'Msg'                UsageRightsMessage       N
+  'P'                  ModificationPermissions  N
+  'Signature'          SignatureUsageRights     N+
+
+=head2 PostScript Tags
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'Author'             Author                   string
+  'BeginDocument'      EmbeddedFile             PostScript
+  'BeginICCProfile'    ICC_Profile              ICC_Profile
+  'BeginPhotoshop'     PhotoshopData            Photoshop
+  'BoundingBox'        BoundingBox              N
+  'Copyright'          Copyright                string
+  'CreationDate'       CreateDate               string~
+  'Creator'            Creator                  string
+  'EmbeddedFileName'   EmbeddedFileName         N
+  'For'                For                      string
+  'ImageData'          ImageData                N
+  'Keywords'           Keywords                 string
+  'ModDate'            ModifyDate               string~
+  'Pages'              Pages                    N
+  'Routing'            Routing                  string
+  'Subject'            Subject                  string
+  'TIFFPreview'        TIFFPreview              N
+  'Title'              Title                    string
+  'Version'            Version                  string
+  'begin_xml_packet'   XMP                      XMP
+
+=head2 ID3 Tags
+
+ExifTool extracts ID3 information from MP3, MPEG, AIFF, OGG, FLAC, APE and
+RealAudio files.  ID3v2 tags which support multiple languages (ie. Comment
+and Lyrics) are extracted by specifying the tag name, followed by a dash
+('-'), then a 3-character
+ISO 639-2
+language code (ie. "Comment-spa"). See L<http://www.id3.org/> for the
+official ID3 specification and
+L<http://www.loc.gov/standards/iso639-2/php/code_list.php> for a list of ISO
+639-2 language codes.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  ID3v1                                         ID3 v1
+  ID3v1_Enh                                     ID3 v1_Enh
+  ID3v2_2                                       ID3 v2_2
+  ID3v2_3                                       ID3 v2_3
+  ID3v2_4                                       ID3 v2_4
+
+=head3 ID3 v1 Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      3    Title                                N
+     33    Artist                               N
+     63    Album                                N
+     93    Year                                 N
+     97    Comment                              N
+    125    Track                                N
+    127    Genre                                N
+
+=head3 ID3 v1_Enh Tags
+
+ID3 version 1 "Enhanced TAG" information (not part of the official spec).
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      4    Title2                               N
+     64    Artist2                              N
+    124    Album2                               N
+    184    Speed                                N
+    185    Genre                                N
+    215    StartTime                            N
+    221    EndTime                              N
+
+=head3 ID3 v2_2 Tags
+
+ExifTool extracts mainly text-based tags from ID3v2 information.  The tags
+in the tables below are those extracted by ExifTool, and don't represent a
+complete list of available ID3v2 tags.
+
+ID3 version 2.2 tags.  (These are the tags written by iTunes 5.0.)
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'CNT'    PlayCounter                          N
+  'COM'    Comment                              N
+  'IPL'    InvolvedPeople                       N
+  'PIC'    Picture                              N
+  'PIC-1'  PictureFormat                        N
+  'PIC-2'  PictureType                          N
+  'PIC-3'  PictureDescription                   N
+  'SLT'    SynchronizedLyricText                N
+  'TAL'    Album                                N
+  'TBP'    BeatsPerMinute                       N
+  'TCM'    Composer                             N
+  'TCO'    Genre                                N
+  'TCP'    Compilation                          N
+  'TCR'    Copyright                            N
+  'TDA'    Date                                 N
+  'TDY'    PlaylistDelay                        N
+  'TEN'    EncodedBy                            N
+  'TFT'    FileType                             N
+  'TIM'    Time                                 N
+  'TKE'    InitialKey                           N
+  'TLA'    Language                             N
+  'TLE'    Length                               N
+  'TMT'    Media                                N
+  'TOA'    OriginalArtist                       N
+  'TOF'    OriginalFilename                     N
+  'TOL'    OriginalLyricist                     N
+  'TOR'    OriginalReleaseYear                  N
+  'TOT'    OriginalAlbum                        N
+  'TP1'    Artist                               N
+  'TP2'    Band                                 N
+  'TP3'    Conductor                            N
+  'TP4'    InterpretedBy                        N
+  'TPA'    PartOfSet                            N
+  'TPB'    Publisher                            N
+  'TRC'    ISRC                                 N
+  'TRD'    RecordingDates                       N
+  'TRK'    Track                                N
+  'TSI'    Size                                 N
+  'TSS'    EncoderSettings                      N
+  'TT1'    Grouping                             N
+  'TT2'    Title                                N
+  'TT3'    Subtitle                             N
+  'TXT'    Lyricist                             N
+  'TXX'    UserDefinedText                      N
+  'TYE'    Year                                 N
+  'ULT'    Lyrics                               N
+  'WAF'    FileURL                              N
+  'WAR'    ArtistURL                            N
+  'WAS'    SourceURL                            N
+  'WCM'    CommercialURL                        N
+  'WCP'    CopyrightURL                         N
+  'WPB'    PublisherURL                         N
+  'WXX'    UserDefinedURL                       N
+
+=head3 ID3 v2_3 Tags
+
+ID3 version 2.3 tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'APIC'   Picture                              N
+  'APIC-1' PictureMimeType                      N
+  'APIC-2' PictureType                          N
+  'APIC-3' PictureDescription                   N
+  'COMM'   Comment                              N
+  'IPLS'   InvolvedPeople                       N
+  'MCDI'   MusicCDIdentifier                    N
+  'PCNT'   PlayCounter                          N
+  'PRIV'   Private                              ID3 Private
+  'SYLT'   SynchronizedLyricText                N
+  'TALB'   Album                                N
+  'TBPM'   BeatsPerMinute                       N
+  'TCMP'   Compilation                          N
+  'TCOM'   Composer                             N
+  'TCON'   Genre                                N
+  'TCOP'   Copyright                            N
+  'TDAT'   Date                                 N
+  'TDLY'   PlaylistDelay                        N
+  'TENC'   EncodedBy                            N
+  'TEXT'   Lyricist                             N
+  'TFLT'   FileType                             N
+  'TIME'   Time                                 N
+  'TIT1'   Grouping                             N
+  'TIT2'   Title                                N
+  'TIT3'   Subtitle                             N
+  'TKEY'   InitialKey                           N
+  'TLAN'   Language                             N
+  'TLEN'   Length                               N
+  'TMED'   Media                                N
+  'TOAL'   OriginalAlbum                        N
+  'TOFN'   OriginalFilename                     N
+  'TOLY'   OriginalLyricist                     N
+  'TOPE'   OriginalArtist                       N
+  'TORY'   OriginalReleaseYear                  N
+  'TOWN'   FileOwner                            N
+  'TPE1'   Artist                               N
+  'TPE2'   Band                                 N
+  'TPE3'   Conductor                            N
+  'TPE4'   InterpretedBy                        N
+  'TPOS'   PartOfSet                            N
+  'TPUB'   Publisher                            N
+  'TRCK'   Track                                N
+  'TRDA'   RecordingDates                       N
+  'TRSN'   InternetRadioStationName             N
+  'TRSO'   InternetRadioStationOwner            N
+  'TSIZ'   Size                                 N
+  'TSRC'   ISRC                                 N
+  'TSSE'   EncoderSettings                      N
+  'TXXX'   UserDefinedText                      N
+  'TYER'   Year                                 N
+  'USER'   TermsOfUse                           N
+  'USLT'   Lyrics                               N
+  'WCOM'   CommercialURL                        N
+  'WCOP'   CopyrightURL                         N
+  'WOAF'   FileURL                              N
+  'WOAR'   ArtistURL                            N
+  'WOAS'   SourceURL                            N
+  'WORS'   InternetRadioStationURL              N
+  'WPAY'   PaymentURL                           N
+  'WPUB'   PublisherURL                         N
+  'WXXX'   UserDefinedURL                       N
+
+=head3 ID3 Private Tags
+
+ID3 private (PRIV) tags.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'AverageLevel'       AverageLevel             N
+  'PeakValue'          PeakValue                N
+  'XMP'                XMP                      XMP
+
+=head3 ID3 v2_4 Tags
+
+ID3 version 2.4 tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'APIC'   Picture                              N
+  'APIC-1' PictureMimeType                      N
+  'APIC-2' PictureType                          N
+  'APIC-3' PictureDescription                   N
+  'COMM'   Comment                              N
+  'MCDI'   MusicCDIdentifier                    N
+  'PCNT'   PlayCounter                          N
+  'PRIV'   Private                              ID3 Private
+  'SYLT'   SynchronizedLyricText                N
+  'TALB'   Album                                N
+  'TBPM'   BeatsPerMinute                       N
+  'TCMP'   Compilation                          N
+  'TCOM'   Composer                             N
+  'TCON'   Genre                                N
+  'TCOP'   Copyright                            N
+  'TDEN'   EncodingTime                         N
+  'TDLY'   PlaylistDelay                        N
+  'TDOR'   OriginalReleaseTime                  N
+  'TDRC'   RecordingTime                        N
+  'TDRL'   ReleaseTime                          N
+  'TDTG'   TaggingTime                          N
+  'TENC'   EncodedBy                            N
+  'TEXT'   Lyricist                             N
+  'TFLT'   FileType                             N
+  'TIPL'   InvolvedPeople                       N
+  'TIT1'   Grouping                             N
+  'TIT2'   Title                                N
+  'TIT3'   Subtitle                             N
+  'TKEY'   InitialKey                           N
+  'TLAN'   Language                             N
+  'TLEN'   Length                               N
+  'TMCL'   MusicianCredits                      N
+  'TMED'   Media                                N
+  'TMOO'   Mood                                 N
+  'TOAL'   OriginalAlbum                        N
+  'TOFN'   OriginalFilename                     N
+  'TOLY'   OriginalLyricist                     N
+  'TOPE'   OriginalArtist                       N
+  'TOWN'   FileOwner                            N
+  'TPE1'   Artist                               N
+  'TPE2'   Band                                 N
+  'TPE3'   Conductor                            N
+  'TPE4'   InterpretedBy                        N
+  'TPOS'   PartOfSet                            N
+  'TPRO'   ProducedNotice                       N
+  'TPUB'   Publisher                            N
+  'TRCK'   Track                                N
+  'TRSN'   InternetRadioStationName             N
+  'TRSO'   InternetRadioStationOwner            N
+  'TSOA'   AlbumSortOrder                       N
+  'TSOP'   PerformerSortOrder                   N
+  'TSOT'   TitleSortOrder                       N
+  'TSRC'   ISRC                                 N
+  'TSSE'   EncoderSettings                      N
+  'TSST'   SetSubtitle                          N
+  'TXXX'   UserDefinedText                      N
+  'USER'   TermsOfUse                           N
+  'USLT'   Lyrics                               N
+  'WCOM'   CommercialURL                        N
+  'WCOP'   CopyrightURL                         N
+  'WOAF'   FileURL                              N
+  'WOAR'   ArtistURL                            N
+  'WOAS'   SourceURL                            N
+  'WORS'   InternetRadioStationURL              N
+  'WPAY'   PaymentURL                           N
+  'WPUB'   PublisherURL                         N
+  'WXXX'   UserDefinedURL                       N
+
+=head2 ITC Tags
+
+This information is found in iTunes Cover Flow data files.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'data'   ImageData                            N
+  'itch'   Itch                                 ITC Header
+  'item'   Item                                 ITC Item
+
+=head3 ITC Header Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+     16    DataType                             N
+
+=head3 ITC Item Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    LibraryID                            N
+      2    TrackID                              N
+      4    DataLocation                         N
+      5    ImageType                            N
+      7    ImageWidth                           N
+      8    ImageHeight                          N
+
+=head2 Vorbis Tags
+
+ExifTool extracts the following Vorbis information from Ogg files.  As well
+as this, ExifTool also extracts FLAC and ID3 information from Ogg files.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0001   Identification                       Vorbis Identification
+  0x0003   Comments                             Vorbis Comments
+
+=head3 Vorbis Identification Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    VorbisVersion                        N
+      4    AudioChannels                        N
+      5    SampleRate                           N
+      9    MaximumBitrate                       N
+     13    NominalBitrate                       N
+     17    MinimumBitrate                       N
+
+=head3 Vorbis Comments Tags
+
+The tags below are only some common tags found in the Vorbis comments of Ogg
+Vorbis and Ogg FLAC audio files, however ExifTool will extract values from
+any tag found, even if not listed here.
+
+  Tag ID                  Tag Name              Writable
+  ------                  --------              --------
+  'ALBUM'                 Album                 N
+  'ARTIST'                Artist                N+
+  'COMMENT'               Comment               N
+  'CONTACT'               Contact               N+
+  'COPYRIGHT'             Copyright             N
+  'COVERART'              CoverArt              N
+  'COVERARTMIME'          CoverArtMIMEType      N
+  'DATE'                  Date                  N
+  'DESCRIPTION'           Description           N
+  'ENCODED_BY'            EncodedBy             N
+  'ENCODED_USING'         EncodedUsing          N
+  'GENRE'                 Genre                 N
+  'ISRC'                  ISRCNumber            N
+  'LICENSE'               License               N
+  'LOCATION'              Location              N
+  'ORGANIZATION'          Organization          N
+  'PERFORMER'             Performer             N+
+  'REPLAYGAIN_ALBUM_GAIN' ReplayGainAlbumGain   N
+  'REPLAYGAIN_ALBUM_PEAK' ReplayGainAlbumPeak   N
+  'REPLAYGAIN_TRACK_GAIN' ReplayGainTrackGain   N
+  'REPLAYGAIN_TRACK_PEAK' ReplayGainTrackPeak   N
+  'TITLE'                 Title                 N
+  'TRACKNUMBER'           TrackNumber           N
+  'VERSION'               Version               N
+  'vendor'                Vendor                N
+
+=head2 FLAC Tags
+
+Free Lossless Audio Codec (FLAC) meta information.  ExifTool also extracts
+ID3 information from these files.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0000   StreamInfo                           FLAC StreamInfo
+  0x0004   VorbisComment                        Vorbis Comments
+  0x0006   Picture                              FLAC Picture
+
+=head3 FLAC StreamInfo Tags
+
+FLAC is big-endian, so bit 0 is the high-order bit in this table.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'Bit000-015'         BlockSizeMin             N
+  'Bit016-031'         BlockSizeMax             N
+  'Bit032-055'         FrameSizeMin             N
+  'Bit056-079'         FrameSizeMax             N
+  'Bit080-099'         SampleRate               N
+  'Bit100-102'         Channels                 N
+  'Bit103-107'         BitsPerSample            N
+  'Bit108-143'         TotalSamples             N
+
+=head3 FLAC Picture Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    PictureType                          N
+      1    PictureMIMEType                      N
+      2    PictureDescription                   N
+      3    PictureWidth                         N
+      4    PictureHeight                        N
+      5    PictureBitsPerPixel                  N
+      6    PictureIndexedColors                 N
+      7    PictureLength                        N
+      8    Picture                              N
+
+=head2 APE Tags
+
+Tags found in Monkey's Audio (APE) information.  Only a few common tags are
+listed below, but ExifTool will extract any tag found.  ExifTool supports
+APEv1 and APEv2 tags, as well as ID3 information in APE files.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'Album'              Album                    N
+  'Artist'             Artist                   N
+  'Genre'              Genre                    N
+  'Title'              Title                    N
+  'Tool Name'          ToolName                 N
+  'Tool Version'       ToolVersion              N
+  'Track'              Track                    N
+  'Year'               Year                     N
+
+=head3 APE NewHeader Tags
+
+APE MAC audio header for version 3.98 or later.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    CompressionLevel                     N
+      2    BlocksPerFrame                       N
+      4    FinalFrameBlocks                     N
+      6    TotalFrames                          N
+      8    BitsPerSample                        N
+      9    Channels                             N
+     10    SampleRate                           N
+
+=head3 APE OldHeader Tags
+
+APE MAC audio header for version 3.97 or earlier.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    APEVersion                           N
+      1    CompressionLevel                     N
+      3    Channels                             N
+      4    SampleRate                           N
+     10    TotalFrames                          N
+     12    FinalFrameBlocks                     N
+
+=head2 MPC Tags
+
+Tags used in Musepack (MPC) audio files.  ExifTool also extracts ID3 and APE
+information from these files.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'Bit032-063'         TotalFrames              N
+  'Bit080-081'         SampleRate               N
+  'Bit084-087'         Quality                  N
+  'Bit088-093'         MaxBand                  N
+  'Bit096-111'         ReplayGainTrackPeak      N
+  'Bit112-127'         ReplayGainTrackGain      N
+  'Bit128-143'         ReplayGainAlbumPeak      N
+  'Bit144-159'         ReplayGainAlbumGain      N
+  'Bit179'             FastSeek                 N
+  'Bit191'             Gapless                  N
+  'Bit216-223'         EncoderVersion           N
+
+=head2 MPEG Tags
+
+The MPEG format doesn't specify any file-level meta information.  In lieu of
+this, information is extracted from the first audio and video frame headers
+in the file.
+
+=head3 MPEG Audio Tags
+
+  Tag ID       Tag Name                         Writable
+  ------       --------                         --------
+  'Bit11-12'   MPEGAudioVersion                 N
+  'Bit13-14'   AudioLayer                       N
+  'Bit16-19'   AudioBitrate                     N
+  'Bit20-21'   SampleRate                       N
+  'Bit24-25'   ChannelMode                      N
+  'Bit26'      MSStereo                         N
+  'Bit26-27'   ModeExtension                    N
+  'Bit27'      IntensityStereo                  N
+  'Bit28'      CopyrightFlag                    N
+  'Bit29'      OriginalMedia                    N
+  'Bit30-31'   Emphasis                         N
+
+=head3 MPEG Video Tags
+
+  Tag ID       Tag Name                         Writable
+  ------       --------                         --------
+  'Bit00-11'   ImageWidth                       N
+  'Bit12-23'   ImageHeight                      N
+  'Bit24-27'   AspectRatio                      N
+  'Bit28-31'   FrameRate                        N
+  'Bit32-49'   VideoBitrate                     N
+
+=head3 MPEG Xing Tags
+
+These tags are extracted from the Xing/Info frame.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  VBRFrames                                     N
+  VBRBytes                                      N
+  VBRScale                                      N
+  Encoder                                       N
+  LameVBRQuality                                N
+  LameQuality                                   N
+  LameHeader                                    MPEG Lame
+
+=head3 MPEG Lame Tags
+
+Tags extracted from Lame 3.90 or later header.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      9    LameMethod                           N
+     10    LameLowPassFilter                    N
+     20    LameBitrate                          N
+     24    LameStereoMode                       N
+
+=head2 M2TS Tags
+
+The MPEG-2 transport stream is used as a container for many different
+audio/video formats (including AVCHD).  This table lists information
+extracted from M2TS files.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  AudioStreamType                               N
+  Duration                                      N
+  VideoStreamType                               N
+  _AC3                                          M2TS AC3
+  _H264                                         H264
+
+=head3 M2TS AC3 Tags
+
+Tags extracted from AC-3 audio streams.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  AudioBitrate                                  N
+  AudioChannels                                 N
+  AudioSampleRate                               N
+  SurroundMode                                  N
+
+=head2 H264 Tags
+
+Tags extracted from H.264 video streams.  The metadata for AVCHD videos is
+stored in this stream.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  ImageHeight                                   N
+  ImageWidth                                    N
+  MDPM                                          H264 MDPM
+
+=head3 H264 MDPM Tags
+
+The following tags are decoded from the Modified Digital Video Pack Metadata
+(MDPM) of the unregistered user data with UUID
+17ee8c60f84d11d98cd60800200c9a66 in the H.264 Supplemental Enhancement
+Information (SEI).  I<[Yes, this description is confusing, but nothing
+compared to the challenge of actually decoding the data!]>  This information
+may exist at regular intervals through the entire video, but only the first
+occurrence is extracted unless the ExtractEmbedded (-ee) option is used (in
+which case subsequent occurrences are extracted as sub-documents).
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0018   DateTimeOriginal                     N
+  0x0070   Camera1                              H264 Camera1
+  0x0071   Camera2                              H264 Camera2
+  0x007f   Shutter                              H264 Shutter
+  0x00a0   ExposureTime                         N
+  0x00a1   FNumber                              N
+  0x00a2   ExposureProgram                      N
+  0x00a3   BrightnessValue                      N
+  0x00a4   ExposureCompensation                 N
+  0x00a5   MaxApertureValue                     N
+  0x00a6   Flash                                N
+  0x00a7   CustomRendered                       N
+  0x00a8   WhiteBalance                         N
+  0x00a9   FocalLengthIn35mmFormat              N
+  0x00aa   SceneCaptureType                     N
+  0x00b0   GPSVersionID                         N
+  0x00b1   GPSLatitudeRef                       N
+  0x00b2   GPSLatitude                          N
+  0x00b5   GPSLongitudeRef                      N
+  0x00b6   GPSLongitude                         N
+  0x00b9   GPSAltitudeRef                       N
+  0x00ba   GPSAltitude                          N
+  0x00bb   GPSTimeStamp                         N
+  0x00be   GPSStatus                            N
+  0x00bf   GPSMeasureMode                       N
+  0x00c0   GPSDOP                               N
+  0x00c1   GPSSpeedRef                          N
+  0x00c2   GPSSpeed                             N
+  0x00c3   GPSTrackRef                          N
+  0x00c4   GPSTrack                             N
+  0x00c5   GPSImgDirectionRef                   N
+  0x00c6   GPSImgDirection                      N
+  0x00c7   GPSMapDatum                          N
+  0x00e0   MakeModel                            H264 MakeModel
+  0x00e1   RecInfo                              H264 RecInfo
+  0x00e4   Model                                N
+  0x00ee   FrameInfo                            H264 FrameInfo
+
+=head3 H264 Camera1 Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    ApertureSetting                      N
+      1    Gain                                 N
+    1.1    ExposureProgram                      N
+    2.1    WhiteBalance                         N
+      3    Focus                                N
+
+=head3 H264 Camera2 Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      1    ImageStabilization                   N
+
+=head3 H264 Shutter Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+    1.1    ExposureTime                         N
+
+=head3 H264 MakeModel Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    Make                                 N
+
+=head3 H264 RecInfo Tags
+
+Recording information stored by some Canon video cameras.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    RecordingMode                        N
+
+=head3 H264 FrameInfo Tags
+
+Frame rate information stored by some Canon video cameras.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    CaptureFrameRate                     N
+      1    VideoFrameRate                       N
+
+=head2 QuickTime Tags
+
+The QuickTime format is used for many different types of audio, video and
+image files.  Exiftool extracts meta information from the UserData atom
+(including some proprietary manufacturer-specific information), as well as
+extracting various audio, video and image parameters.  Tags with a question
+mark after their name are not extracted unless the Unknown option is set.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'PICT'               PreviewPICT              N
+  'free'               Free?                    N
+  'ftyp'               FileType                 QuickTime FileType
+  'junk'               Junk?                    N
+  'mdat'               MovieData?               N
+  'mdat-size'          MovieDataSize            N
+  'moov'               Movie                    QuickTime Movie
+  'pict'               PreviewPICT              N
+  'pnot'               Preview                  QuickTime Preview
+  'skip'               Skip?                    N
+  'uuid'               UUID-XMP                 XMP
+                       UUID-PROF                QuickTime Profile
+                       UUID-Flip                QuickTime Flip
+                       UUID-Unknown?            N
+  'wide'               Wide?                    N
+
+=head3 QuickTime FileType Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    MajorBrand                           N
+      1    MinorVersion                         N
+      2    CompatibleBrands                     N
+
+=head3 QuickTime Movie Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'iods'   InitialObjectDescriptor?             N
+  'meta'   Meta                                 QuickTime Meta
+  'mvhd'   MovieHeader                          QuickTime MovieHeader
+  'trak'   Track                                QuickTime Track
+  'udta'   UserData                             QuickTime UserData
+  'uuid'   UUID-USMT                            QuickTime UserMedia
+           UUID-Unknown?                        N
+
+=head3 QuickTime Meta Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'bxml'   BinaryXML?                           N
+  'dinf'   DataInformation?                     N
+  'free'   Free?                                N
+  'hdlr'   Handler                              QuickTime Handler
+  'iinf'   ItemInformation?                     N
+  'iloc'   ItemLocation?                        N
+  'ilst'   ItemList                             QuickTime ItemList
+  'ipmc'   IPMPControl?                         N
+  'ipro'   ItemProtection?                      N
+  'keys'   Keys                                 QuickTime Keys
+  'pitm'   PrimaryItemReference?                N
+  'xml '   XML                                  XMP
+
+=head3 QuickTime Handler Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      4    HandlerClass                         N
+      8    HandlerType                          N
+     12    HandlerVendorID                      N
+     24    HandlerDescription                   N
+
+=head3 QuickTime ItemList Tags
+
+As well as these tags, the 'mdta' handler uses numerical tag ID's which are
+added dynamically to this table after processing the Meta Keys information.
+
+  Tag ID       Tag Name                         Writable
+  ------       --------                         --------
+  '----'       iTunesInfo                       QuickTime iTunesInfo
+  'aART'       AlbumArtist                      N
+  'akID'       AppleStoreAccountType            N
+  'albm'       Album                            N
+  'apID'       AppleStoreAccount                N
+  'atID'       AlbumTitleID                     N
+  'auth'       Author                           N
+  'catg'       Category                         N
+  'cnID'       AppleStoreCatalogID              N
+  'covr'       CoverArt                         N
+  'cpil'       Compilation                      N
+  'cprt'       Copyright                        N
+  'desc'       Description                      N
+  'disk'       DiskNumber                       N
+  'dscp'       Description                      N
+  'egid'       EpisodeGlobalUniqueID            N
+  'geID'       GenreID                          N
+  'gnre'       Genre                            N
+  'grup'       Grouping                         N
+  'hdvd'       HDVideo                          N
+  'keyw'       Keyword                          N
+  'ldes'       LongDescription                  N
+  'pcst'       Podcast                          N
+  'perf'       Performer                        N
+  'pgap'       PlayGap                          N
+  'plID'       PlayListID                       N
+  'purd'       PurchaseDate                     N
+  'purl'       PodcastURL                       N
+  'rtng'       Rating                           N
+  'sfID'       AppleStoreCountry                N
+  'soaa'       SortAlbumArtist                  N
+  'soal'       SortAlbum                        N
+  'soar'       SortArtist                       N
+  'soco'       SortComposer                     N
+  'sonm'       SortName                         N
+  'sosn'       SortShow                         N
+  'stik'       MediaType                        N
+  'titl'       Title                            N
+  'tmpo'       BeatsPerMinute                   N
+  'trkn'       TrackNumber                      N
+  'tven'       TVEpisodeID                      N
+  'tves'       TVEpisode                        N
+  'tvnn'       TVNetworkName                    N
+  'tvsh'       TVShow                           N
+  'tvsn'       TVSeason                         N
+  'yrrc'       Year                             N
+  "\xa9ART"    Artist                           N
+  "\xa9alb"    Album                            N
+  "\xa9cmt"    Comment                          N
+  "\xa9com"    Composer                         N
+  "\xa9day"    Year                             N
+  "\xa9des"    Description                      N
+  "\xa9enc"    EncodedBy                        N
+  "\xa9gen"    Genre                            N
+  "\xa9grp"    Grouping                         N
+  "\xa9lyr"    Lyrics                           N
+  "\xa9nam"    Title                            N
+  "\xa9too"    Encoder                          N
+  "\xa9trk"    Track                            N
+  "\xa9wrt"    Composer                         N
+
+=head3 QuickTime iTunesInfo Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'data'   Data?                                N
+  'mean'   Mean?                                N
+  'name'   Name?                                N
+
+=head3 QuickTime Keys Tags
+
+This directory contains a list of key names which are used to decode
+ItemList tags written by the "mdta" handler.  The prefix of
+"com.apple.quicktime." has been removed from all TagID's below.
+
+  Tag ID                       Tag Name         Writable
+  ------                       --------         --------
+  'album'                      Album            N
+  'artist'                     Artist           N
+  'artwork'                    Artwork          N
+  'author'                     Author           N
+  'camera.framereadouttimeinmicroseconds'
+                               FrameReadoutTime N
+  'camera.identifier'          CameraIdentifier N
+  'comment'                    Comment          N
+  'copyright'                  Copyright        N
+  'creationdate'               CreationDate     N
+  'description'                Description      N
+  'direction.facing'           CameraDirection  N
+  'direction.motion'           CameraMotion     N
+  'director'                   Director         N
+  'genre'                      Genre            N
+  'information'                Information      N
+  'keywords'                   Keywords         N
+  'location.ISO6709'           GPSCoordinates   N
+  'location.body'              LocationBody     N
+  'location.date'              LocationDate     N
+  'location.name'              LocationName     N
+  'location.note'              LocationNote     N
+  'location.role'              LocationRole     N
+  'make'                       Make             N
+  'model'                      Model            N
+  'player.movie.audio.balance' Balance          N
+  'player.movie.audio.bass'    Bass             N
+  'player.movie.audio.gain'    AudioGain        N
+  'player.movie.audio.mute'    Mute             N
+  'player.movie.audio.pitchshift' PitchShift    N
+  'player.movie.audio.treble'  Trebel           N
+  'player.movie.visual.brightness' Brightness   N
+  'player.movie.visual.color'  Color            N
+  'player.movie.visual.contrast' Contrast       N
+  'player.movie.visual.tint'   Tint             N
+  'player.version'             PlayerVersion    N
+  'publisher'                  Publisher        N
+  'software'                   Software         N
+  'version'                    Version          N
+  'year'                       Year             N
+
+=head3 QuickTime MovieHeader Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    MovieHeaderVersion                   N
+      1    CreateDate                           N
+      2    ModifyDate                           N
+      3    TimeScale                            N
+      4    Duration                             N
+      5    PreferredRate                        N
+      6    PreferredVolume                      N
+      9    MatrixStructure                      N
+     18    PreviewTime                          N
+     19    PreviewDuration                      N
+     20    PosterTime                           N
+     21    SelectionTime                        N
+     22    SelectionDuration                    N
+     23    CurrentTime                          N
+     24    NextTrackID                          N
+
+=head3 QuickTime Track Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'mdia'   Media                                QuickTime Media
+  'meta'   Meta                                 QuickTime Meta
+  'tkhd'   TrackHeader                          QuickTime TrackHeader
+  'tref'   TrackRef                             QuickTime TrackRef
+  'udta'   UserData                             QuickTime UserData
+  'uuid'   UUID-USMT                            QuickTime UserMedia
+           UUID-Unknown?                        N
+
+=head3 QuickTime Media Tags
+
+MP4 media box.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'hdlr'   Handler                              QuickTime Handler
+  'mdhd'   MediaHeader                          QuickTime MediaHeader
+  'minf'   MediaInfo                            QuickTime MediaInfo
+
+=head3 QuickTime MediaHeader Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    MediaHeaderVersion                   N
+      1    MediaCreateDate                      N
+      2    MediaModifyDate                      N
+      3    MediaTimeScale                       N
+      4    MediaDuration                        N
+      5    MediaLanguageCode                    N
+
+=head3 QuickTime MediaInfo Tags
+
+MP4 media info box.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'dinf'   DataInfo                             QuickTime DataInfo
+  'gmhd'   GenMediaHeader                       QuickTime GenMediaHeader
+  'hdlr'   Handler                              QuickTime Handler
+  'hmhd'   HintHeader                           QuickTime HintHeader
+  'nmhd'   NullMediaHeader?                     N
+  'smhd'   AudioHeader                          QuickTime AudioHeader
+  'stbl'   SampleTable                          QuickTime SampleTable
+  'vmhd'   VideoHeader                          QuickTime VideoHeader
+
+=head3 QuickTime DataInfo Tags
+
+MP4 data information box.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'dref'   DataRef                              QuickTime DataRef
+
+=head3 QuickTime DataRef Tags
+
+MP4 data reference box.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'url '   URL                                  N
+  'urn '   URN                                  N
+
+=head3 QuickTime GenMediaHeader Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'gmin'   GenMediaInfo                         QuickTime GenMediaInfo
+  'text'   Text?                                N
+
+=head3 QuickTime GenMediaInfo Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    GenMediaVersion                      N
+      1    GenFlags                             N
+      4    GenGraphicsMode                      N
+      6    GenOpColor                           N
+     12    GenBalance                           N
+
+=head3 QuickTime HintHeader Tags
+
+MP4 hint media header.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      2    MaxPDUSize                           N
+      3    AvgPDUSize                           N
+      4    MaxBitrate                           N
+      6    AvgBitrate                           N
+
+=head3 QuickTime AudioHeader Tags
+
+MP4 audio media header.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      2    Balance                              N
+
+=head3 QuickTime SampleTable Tags
+
+MP4 sample table box.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'co64'   ChunkOffset64?                       N
+  'cslg'   CompositionToDecodeTimelineMapping?  N
+  'ctts'   CompositionTimeToSample?             N
+  'padb'   SamplePaddingBits?                   N
+  'sbgp'   SampleToGroup?                       N
+  'sdtp'   IdependentAndDisposableSamples?      N
+  'sgpd'   SampleGroupDescription?              N
+  'stco'   ChunkOffset?                         N
+  'stdp'   SampleDegradationPriority?           N
+  'stsc'   SampleToChunk?                       N
+  'stsd'   AudioSampleDesc                      QuickTime AudioSampleDesc
+           VideoSampleDesc                      QuickTime ImageDesc
+           HintSampleDesc                       QuickTime HintSampleDesc
+           OtherSampleDesc                      QuickTime OtherSampleDesc
+  'stsh'   ShadowSyncSampleTable?               N
+  'stss'   SyncSampleTable?                     N
+  'stsz'   SampleSizes?                         N
+  'stts'   VideoFrameRate                       N
+           TimeToSampleTable?                   N
+  'stz2'   CompactSampleSizes?                  N
+  'subs'   Sub-sampleInformation?               N
+
+=head3 QuickTime AudioSampleDesc Tags
+
+MP4 audio sample description.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      2    AudioFormat                          N
+     10    AudioVendorID                        N
+     12    AudioChannels                        N
+     13    AudioBitsPerSample                   N
+     16    AudioSampleRate                      N
+     28    AudioFormat                          N
+
+=head3 QuickTime ImageDesc Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      2    CompressorID                         N
+     10    VendorID                             N
+     16    SourceImageWidth                     N
+     17    SourceImageHeight                    N
+     18    XResolution                          N
+     20    YResolution                          N
+     25    CompressorName                       N
+     41    BitDepth                             N
+
+=head3 QuickTime HintSampleDesc Tags
+
+MP4 hint sample description.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      2    HintFormat                           N
+
+=head3 QuickTime OtherSampleDesc Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      2    OtherFormat                          N
+
+=head3 QuickTime VideoHeader Tags
+
+MP4 video media header.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      2    GraphicsMode                         N
+      3    OpColor                              N
+
+=head3 QuickTime TrackHeader Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    TrackHeaderVersion                   N
+      1    TrackCreateDate                      N
+      2    TrackModifyDate                      N
+      3    TrackID                              N
+      5    TrackDuration                        N
+      8    TrackLayer                           N
+      9    TrackVolume                          N
+     10    MatrixStructure                      N
+     19    ImageWidth                           N
+     20    ImageHeight                          N
+
+=head3 QuickTime TrackRef Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'chap'   ChapterList                          N
+
+=head3 QuickTime UserData Tags
+
+Tag ID's beginning with the copyright symbol (hex 0xa9) are multi-language
+text.  Alternate language tags are accessed by adding a dash followed by the
+language/country code to the tag name.  ExifTool will extract any
+multi-language user data tags found, even if they don't exist in this table.
+
+  Tag ID       Tag Name                         Writable
+  ------       --------                         --------
+  'AllF'       PlayAllFrames                    N
+  'CNCV'       CompressorVersion                N
+  'CNFV'       FirmwareVersion                  N
+  'CNMN'       Model                            N
+  'CNTH'       CanonCNTH                        Canon CNTH
+  'DcMD'       DcMD                             QuickTime DcMD
+  'FFMV'       FujiFilmFFMV                     FujiFilm FFMV
+  'INFO'       SamsungINFO                      Samsung INFO
+  'LOOP'       LoopStyle                        N
+  'MMA0'       MinoltaMMA0                      Minolta MMA
+  'MMA1'       MinoltaMMA1                      Minolta MMA
+  'MVTG'       FujiFilmMVTG                     EXIF
+  'NCDT'       NikonNCDT                        Nikon NCDT
+  'QVMI'       CasioQVMI                        EXIF
+  'SDLN'       PlayMode                         N
+  'SelO'       PlaySelection                    N
+  'TAGS'       KodakTags                        Kodak MOV
+               KonicaMinoltaTags                Minolta MOV1
+               MinoltaTags                      Minolta MOV2
+               NikonTags                        Nikon MOV
+               OlympusTags1                     Olympus MOV1
+               OlympusTags2                     Olympus MOV2
+               OlympusTags3                     Olympus MP4
+               PentaxTags                       Pentax MOV
+               SamsungTags                      Samsung MP4
+               SanyoMOV                         Sanyo MOV
+               SanyoMP4                         Sanyo MP4
+               UnknownTags?                     N
+  'WLOC'       WindowLocation                   N
+  'XMP_'       XMP                              XMP
+  'hinf'       HintTrackInfo                    QuickTime HintTrackInfo
+  'hnti'       HintInfo                         QuickTime HintInfo
+  'meta'       Meta                             QuickTime Meta
+  'name'       Name                             N
+  'ptv '       PrintToVideo                     QuickTime Video
+  'vndr'       Vendor                           N
+  "\xa9ART"    Artist                           N
+  "\xa9alb"    Album                            N
+  "\xa9arg"    Arranger                         N
+  "\xa9ark"    ArrangerKeywords                 N
+  "\xa9cmt"    Comment                          N
+  "\xa9cok"    ComposerKeywords                 N
+  "\xa9com"    Composer                         N
+  "\xa9cpy"    Copyright                        N
+  "\xa9day"    CreateDate                       N
+  "\xa9dir"    Director                         N
+  "\xa9ed1"    Edit1                            N
+  "\xa9ed2"    Edit2                            N
+  "\xa9ed3"    Edit3                            N
+  "\xa9ed4"    Edit4                            N
+  "\xa9ed5"    Edit5                            N
+  "\xa9ed6"    Edit6                            N
+  "\xa9ed7"    Edit7                            N
+  "\xa9ed8"    Edit8                            N
+  "\xa9ed9"    Edit9                            N
+  "\xa9fmt"    Format                           N
+  "\xa9gen"    Genre                            N
+  "\xa9grp"    Grouping                         N
+  "\xa9inf"    Information                      N
+  "\xa9isr"    ISRCCode                         N
+  "\xa9lab"    RecordLabelName                  N
+  "\xa9lal"    RecordLabelURL                   N
+  "\xa9lyr"    Lyrics                           N
+  "\xa9mak"    Make                             N
+  "\xa9mal"    MakerURL                         N
+  "\xa9mod"    Model                            N
+  "\xa9nam"    Title                            N
+  "\xa9pdk"    ProducerKeywords                 N
+  "\xa9phg"    RecordingCopyright               N
+  "\xa9prd"    Producer                         N
+  "\xa9prf"    Performers                       N
+  "\xa9prk"    PerformerKeywords                N
+  "\xa9prl"    PerformerURL                     N
+  "\xa9req"    Requirements                     N
+  "\xa9snk"    SubtitleKeywords                 N
+  "\xa9snm"    Subtitle                         N
+  "\xa9src"    SourceCredits                    N
+  "\xa9swf"    SongWriter                       N
+  "\xa9swk"    SongWriterKeywords               N
+  "\xa9swr"    SoftwareVersion                  N
+  "\xa9too"    Encoder                          N
+  "\xa9trk"    Track                            N
+  "\xa9wrt"    Composer                         N
+  "\xa9xyz"    GPSCoordinates                   N
+
+=head3 QuickTime DcMD Tags
+
+Metadata directory found in MOV videos from some Kodak cameras.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'Cmbo'   CameraByteOrder                      N
+  'DcME'   DcME                                 QuickTime DcME
+
+=head3 QuickTime DcME Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  [no tags known]
+
+=head3 QuickTime HintTrackInfo Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'dimm'   ImmediateDataBytes                   N
+  'dmax'   LargestPacketDuration                N
+  'dmed'   MediaTrackBytes                      N
+  'drep'   RepeatedDataBytes                    N
+  'maxr'   MaxDataRate                          N
+  'npck'   NumPackets                           N
+  'nump'   NumPackets                           N
+  'payt'   PayloadType                          N
+  'pmax'   LargestPacketSize                    N
+  'tmax'   MaxTransmissionTime                  N
+  'tmin'   MinTransmissionTime                  N
+  'totl'   TotalBytes                           N
+  'tpaY'   TotalBytesNoRTPHeaders               N
+  'tpay'   TotalBytesNoRTPHeaders               N
+  'tpyl'   TotalBytesNoRTPHeaders               N
+  'trpY'   TotalBytes                           N
+  'trpy'   TotalBytes                           N
+
+=head3 QuickTime HintInfo Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'rtp '   RealtimeStreamingProtocol            N
+  'sdp '   StreamingDataProtocol                N
+
+=head3 QuickTime Video Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    DisplaySize                          N
+      6    SlideShow                            N
+
+=head3 QuickTime UserMedia Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'MTDT'   MetaData                             QuickTime MetaData
+
+=head3 QuickTime MetaData Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0001   Title                                N
+  0x0003   ProductionDate                       N
+  0x0004   Software                             N
+  0x0005   Product                              N
+  0x000a   TrackProperty                        N
+  0x000b   TimeZone                             N
+  0x000c   ModifyDate                           N
+
+=head3 QuickTime Preview Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    PreviewDate                          N
+      2    PreviewVersion                       N
+      3    PreviewAtomType                      N
+      5    PreviewAtomIndex                     N
+
+=head3 QuickTime Profile Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'APRF'   AudioProfile                         QuickTime AudioProf
+  'FPRF'   FileGlobalProfile                    QuickTime FileProf
+  'VPRF'   VideoProfile                         QuickTime VideoProf
+
+=head3 QuickTime AudioProf Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    AudioProfileVersion?                 N
+      1    AudioTrackID                         N
+      2    AudioCodec                           N
+      3    AudioCodecInfo?                      N
+      4    AudioAttributes                      N
+      5    AudioAvgBitrate                      N
+      6    AudioMaxBitrate                      N
+      7    AudioSampleRate                      N
+      8    AudioChannels                        N
+
+=head3 QuickTime FileProf Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    FileProfileVersion?                  N
+      1    FileFunctionFlags                    N
+
+=head3 QuickTime VideoProf Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    VideoProfileVersion?                 N
+      1    VideoTrackID                         N
+      2    VideoCodec                           N
+      3    VideoCodecInfo?                      N
+      4    VideoAttributes                      N
+      5    VideoAvgBitrate                      N
+      6    VideoMaxBitrate                      N
+      7    VideoAvgFrameRate                    N
+      8    VideoMaxFrameRate                    N
+      9    VideoSize                            N
+     10    PixelAspectRatio                     N
+
+=head3 QuickTime Flip Tags
+
+Found in MP4 files from Flip Video cameras.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      1    PreviewImageWidth                    N
+      2    PreviewImageHeight                   N
+     13    PreviewImageLength                   N
+     14    SerialNumber                         N
+     28    PreviewImage                         N
+
+=head3 QuickTime ImageFile Tags
+
+Tags used in QTIF QuickTime Image Files.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'idat'   ImageData                            N
+  'idsc'   ImageDescription                     QuickTime ImageDesc
+  'iicc'   ICC_Profile                          ICC_Profile
+
+=head2 Matroska Tags
+
+The following tags are extracted from Matroska multimedia container files.
+This container format is used by file types such as MKA, MKV, MKS and WEBM.
+For speed, ExifTool extracts tags only up to the first Cluster unless the
+Verbose (-v) or Unknown = 2 (-U) option is used.  See
+L<http://www.matroska.org/technical/specs/index.html> for the official
+Matroska specification.
+
+  Tag ID       Tag Name                         Writable
+  ------       --------                         --------
+  0x0000       ChapterDisplay                   Matroska
+  0x0003       TrackType                        N
+  0x0005       ChapterString                    N
+  0x0006       VideoCodecID                     N
+               AudioCodecID                     N
+               CodecID                          N
+  0x0008       TrackDefault                     N
+  0x0009       ChapterTrackNumber?              N
+  0x000e       Slices                           Matroska
+  0x000f       ChapterTrack                     Matroska
+  0x0011       ChapterTimeStart                 N
+  0x0012       ChapterTimeEnd                   N
+  0x0016       CueRefTime?                      N
+  0x0017       CueRefCluster?                   N
+  0x0018       ChapterFlagHidden?               N
+  0x001a       VideoScanType                    N
+  0x001b       BlockDuration?                   N
+  0x001c       TrackLacing?                     N
+  0x001f       AudioChannels                    N
+  0x0020       BlockGroup                       Matroska
+  0x0021       Block?                           N
+  0x0022       BlockVirtual?                    N
+  0x0023       SimpleBlock?                     N
+  0x0024       CodecState?                      N
+  0x0025       BlockAdditional?                 N
+  0x0026       BlockMore                        Matroska
+  0x0027       Position                         N
+  0x002a       CodecDecodeAll                   N
+  0x002b       PrevSize                         N
+  0x002e       TrackEntry                       Matroska
+  0x002f       EncryptedBlock?                  N
+  0x0030       ImageWidth                       N
+  0x0033       CueTime?                         N
+  0x0035       AudioSampleRate                  N
+  0x0036       ChapterAtom                      Matroska
+  0x0037       CueTrackPositions                Matroska
+  0x0039       TrackUsed                        N
+  0x003a       ImageHeight                      N
+  0x003b       CuePoint                         Matroska
+  0x003f       CRC-32?                          N
+  0x004b       BlockAdditionalID?               N
+  0x004c       LaceNumber?                      N
+  0x004d       FrameNumber?                     N
+  0x004e       Delay?                           N
+  0x004f       ClusterDuration?                 N
+  0x0057       TrackNumber                      N
+  0x005b       CueReference                     Matroska
+  0x0060       Video                            Matroska
+  0x0061       Audio                            Matroska
+  0x0067       Timecode?                        N
+  0x0068       TimeSlice                        Matroska
+  0x006a       CueCodecState?                   N
+  0x006b       CueRefCodecState?                N
+  0x006c       Void?                            N
+  0x006e       BlockAddID?                      N
+  0x0071       CueClusterPosition?              N
+  0x0077       CueTrack?                        N
+  0x007a       ReferencePriority?               N
+  0x007b       ReferenceBlock?                  N
+  0x007d       ReferenceVirtual?                N
+  0x0254       ContentCompressionAlgorithm      N
+  0x0255       ContentCompressionSettings?      N
+  0x0282       DocType                          N
+  0x0285       DocTypeReadVersion               N
+  0x0286       EBMLVersion                      N
+  0x0287       DocTypeVersion                   N
+  0x02f2       EBMLMaxIDLength?                 N
+  0x02f3       EBMLMaxSizeLength?               N
+  0x02f7       EBMLReadVersion                  N
+  0x037c       ChapterLanguage                  N
+  0x037e       ChapterCountry                   N
+  0x0444       SegmentFamily?                   N
+  0x0461       DateTimeOriginal                 N
+  0x047a       TagLanguage                      N
+  0x0484       TagDefault                       N
+  0x0485       TagBinary                        N
+  0x0487       TagString                        N
+  0x0489       Duration                         N
+  0x050d       ChapterProcessPrivate?           N
+  0x0598       ChapterFlagEnabled?              N
+  0x05a3       TagName                          N
+  0x05b9       EditionEntry                     Matroska
+  0x05bc       EditionUID?                      N
+  0x05bd       EditionFlagHidden?               N
+  0x05db       EditionFlagDefault?              N
+  0x05dd       EditionFlagOrdered?              N
+  0x065c       AttachedFileData                 N
+  0x0660       AttachedFileMIMEType             N
+  0x066e       AttachedFileName                 N
+  0x0675       AttachedFileReferral?            N
+  0x067e       AttachedFileDescription          N
+  0x06ae       AttachedFileUID                  N
+  0x07e1       ContentEncryptionAlgorithm       N
+  0x07e2       ContentEncryptionKeyID?          N
+  0x07e3       ContentSignature?                N
+  0x07e4       ContentSignatureKeyID?           N
+  0x07e5       ContentSignatureAlgorithm        N
+  0x07e6       ContentSignatureHashAlgorithm    N
+  0x0d80       MuxingApp                        N
+  0x0dbb       Seek                             Matroska
+  0x1031       ContentEncodingOrder?            N
+  0x1032       ContentEncodingScope?            N
+  0x1033       ContentEncodingType              N
+  0x1034       ContentCompression               Matroska
+  0x1035       ContentEncryption                Matroska
+  0x135f       CueRefNumber?                    N
+  0x136e       TrackName                        N
+  0x1378       CueBlockNumber?                  N
+  0x137f       TrackOffset?                     N
+  0x13ab       SeekID?                          N
+  0x13ac       SeekPosition?                    N
+  0x13b8       Stereo3DMode                     N
+  0x14aa       CropBottom                       N
+  0x14b0       DisplayWidth                     N
+  0x14b2       DisplayUnit                      N
+  0x14b3       AspectRatioType                  N
+  0x14ba       DisplayHeight                    N
+  0x14bb       CropTop                          N
+  0x14cc       CropLeft                         N
+  0x14dd       CropRight                        N
+  0x15aa       TrackForced                      N
+  0x15ee       MaxBlockAdditionID?              N
+  0x1741       WritingApp                       N
+  0x1854       SilentTracks                     Matroska
+  0x18d7       SilentTrackNumber                N
+  0x21a7       AttachedFile                     Matroska
+  0x2240       ContentEncoding                  Matroska
+  0x2264       AudioBitsPerSample               N
+  0x23a2       CodecPrivate?                    N
+  0x23c0       Targets                          Matroska
+  0x23c3       ChapterPhysicalEquivalent        N
+  0x23c4       TagChapterUID?                   N
+  0x23c5       TagTrackUID?                     N
+  0x23c6       TagAttachmentUID?                N
+  0x23c9       TagEditionUID?                   N
+  0x23ca       TargetType                       N
+  0x2532       SignedElement?                   N
+  0x2624       TrackTranslate                   Matroska
+  0x26a5       TrackTranslateTrackID?           N
+  0x26bf       TrackTranslateCodec              N
+  0x26fc       TrackTranslateEditionUID?        N
+  0x27c8       SimpleTag                        Matroska
+  0x28ca       TargetTypeValue                  N
+  0x2911       ChapterProcessCommand            Matroska
+  0x2922       ChapterProcessTime?              N
+  0x2924       ChapterTranslate                 Matroska
+  0x2933       ChapterProcessData?              N
+  0x2944       ChapterProcess                   Matroska
+  0x2955       ChapterProcessCodecID?           N
+  0x29a5       ChapterTranslateID?              N
+  0x29bf       ChapterTranslateCodec            N
+  0x29fc       ChapterTranslateEditionUID?      N
+  0x2d80       ContentEncodings                 Matroska
+  0x2de7       MinCache?                        N
+  0x2df8       MaxCache?                        N
+  0x2e67       ChapterSegmentUID?               N
+  0x2ebc       ChapterSegmentEditionUID?        N
+  0x2fab       TrackOverlay?                    N
+  0x3373       Tag                              Matroska
+  0x3384       SegmentFileName                  N
+  0x33a4       SegmentUID?                      N
+  0x33c4       ChapterUID?                      N
+  0x33c5       TrackUID?                        N
+  0x3446       TrackAttachmentUID               N
+  0x35a1       BlockAdditions                   Matroska
+  0x38b5       OutputAudioSampleRate            N
+  0x3ba9       Title                            N
+  0x3d7b       ChannelPositions?                N
+  0x3e5b       SignatureElements                Matroska
+  0x3e7b       SignatureElementList             Matroska
+  0x3e8a       SignatureAlgo                    N
+  0x3e9a       SignatureHash                    N
+  0x3ea5       SignaturePublicKey?              N
+  0x3eb5       Signature?                       N
+  0x2b59c      TrackLanguage                    N
+  0x3314f      TrackTimecodeScale               N
+  0x383e3      FrameRate                        N
+  0x3e383      VideoFrameRate                   N
+               DefaultDuration                  N
+  0x58688      VideoCodecName                   N
+               AudioCodecName                   N
+               CodecName                        N
+  0x6b240      CodecDownloadURL                 N
+  0xad7b1      TimecodeScale                    N
+  0xeb524      ColorSpace?                      N
+  0xfb523      Gamma                            N
+  0x1a9697     CodecSettings                    N
+  0x1b4040     CodecInfoURL                     N
+  0x1c83ab     PrevFileName                     N
+  0x1cb923     PrevUID?                         N
+  0x1e83bb     NextFileName                     N
+  0x1eb923     NextUID?                         N
+  0x43a770     Chapters                         Matroska
+  0x14d9b74    SeekHead                         Matroska
+  0x254c367    Tags                             Matroska
+  0x549a966    Info                             Matroska
+  0x654ae6b    Tracks                           Matroska
+  0x8538067    SegmentHeader                    Matroska
+  0x941a469    Attachments                      Matroska
+  0xa45dfa3    EBMLHeader                       Matroska
+  0xb538667    SignatureSlot                    Matroska
+  0xc53bb6b    Cues                             Matroska
+  0xf43b675    Cluster                          Matroska
+
+=head2 MXF Tags
+
+Tags extracted from Material Exchange Format files.  Tag ID's are not listed
+because they are bulky 16-byte binary values.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  OrganizationID                                N
+  UPID?                                         N
+  UPN?                                          N
+  IBTN?                                         N
+  ISAN?                                         N
+  ISBN?                                         N
+  ISSN?                                         N
+  ISWC?                                         N
+  ISMN?                                         N
+  ISCI?                                         N
+  ISRC?                                         N
+  ISRN?                                         N
+  ISBD?                                         N
+  ISTC?                                         N
+  SICI?                                         N
+  BICI?                                         N
+  AICI?                                         N
+  PII?                                          N
+  DOI?                                          N
+  InstanceUID?                                  N
+  PackageID?                                    N
+  DeviceDesignation                             N
+  DeviceModel                                   N
+  DeviceSerialNumber                            N
+  URL                                           N
+  URL                                           N
+  PURL                                          N
+  URN                                           N
+  TransmissionID                                N
+  ArchiveID                                     N
+  ItemID                                        N
+  AccountingReferenceNumber                     N
+  TrafficID                                     N
+  ReelOrRollNumber                              N
+  LocalTapeNumber                               N
+  LUID                                          N
+  PackageName                                   N
+  LocalFilePath                                 N
+  EdgeCode                                      N
+  FrameCode                                     N
+  KeyCode?                                      N
+  InkNumber                                     N
+  KeyText                                       N
+  KeyFrame                                      N
+  KeySound                                      N
+  KeyDataOrProgram                              N
+  TitleKind                                     N
+  MainTitle                                     N
+  SecondaryTitle                                N
+  SeriesNumber                                  N
+  EpisodeNumber                                 N
+  SceneNumber                                   N
+  TakeNumber                                    N
+  CISACLegalEntityID?                           N
+  AGICOAID?                                     N
+  SourceOrganization                            N
+  SupplyContractNumber                          N
+  OriginalProducerName                          N
+  TotalEpisodeCount                             N
+  CopyrightStatus                               N
+  CopyrightOwnerName                            N
+  IntellectualPropertyDescription               N
+  IntellectualPropertyRights                    N
+  Rightsholder                                  N
+  RightsManagementAuthority                     N
+  InterestedPartyName                           N
+  MaximumUseCount                               N
+  LicenseOptionsDescription                     N
+  CurrencyCode                                  N
+  RoyaltyPaymentInformation                     N
+  RoyaltyIncomeInformation                      N
+  RestrictionsonUse                             N
+  ExCCIData?                                    N
+  Username                                      N
+  Username                                      N
+  Password                                      N
+  Password                                      N
+  ScramblingKeyKind                             N
+  ScramblingKeyValue                            N
+  BroadcastOrganizationName                     N
+  BroadcastChannel                              N
+  BroadcastMediumKind                           N
+  BroadcastRegion                               N
+  FirstBroadcastFlag                            N
+  CurrentRepeatNumber                           N
+  PreviousRepeatNumber                          N
+  AudienceRating                                N
+  AudienceReach                                 N
+  NatureOfPersonality                           N
+  ContributionStatus                            N
+  SupportOrAdministrationStatus                 N
+  OrganizationKind                              N
+  ProductionOrganizationRole                    N
+  SupportOrganizationRole                       N
+  JobFunctionName                               N
+  RoleName                                      N
+  ContactKind                                   N
+  ContactDepartmentName                         N
+  FamilyName                                    N
+  FirstGivenName                                N
+  SecondGivenName                               N
+  ThirdGivenName                                N
+  MainName                                      N
+  SupplementaryName                             N
+  OrganizationMainName                          N
+  SupplementaryOrganizationName                 N
+  ISO3166CountryCode                            N
+  ISO639-1LanguageCode                          N
+  OperatingSystemInterpretations                N
+  ByteOrder                                     N
+  EssenceIsIdentified                           N
+  LengthSystemName                              N
+  LengthUnitKind                                N
+  AngularUnitKind                               N
+  TimeSystemOffset                              N
+  TimeUnitKind                                  N
+  ContentCodingSystem                           N
+  ProgramKind                                   N
+  Genre                                         N
+  TargetAudience                                N
+  CatalogDataStatus                             N
+  ThesaurusName                                 N
+  Theme                                         N
+  ContentClassification                         N
+  Keywords                                      N
+  KeyFrames                                     N
+  KeySounds                                     N
+  KeyData                                       N
+  Abstract                                      N
+  Purpose                                       N
+  Description                                   N
+  ColorDescriptor                               N
+  FormatDescriptor                              N
+  StratumKind                                   N
+  IndividualAwardName                           N
+  ProgramAwardName                              N
+  AssetValue                                    N
+  ContentValue                                  N
+  CulturalValue                                 N
+  AestheticValue                                N
+  HistoricalValue                               N
+  TechnicalValue                                N
+  OtherValues                                   N
+  CatalogDataStatus                             N
+  CatalogingSystemName                          N
+  ComputedKeywords                              N
+  ComputedKeyFrames                             N
+  ComputedKeySounds                             N
+  ComputedKeyData                               N
+  ComputedStratumKind                           N
+  PresentationAspectRatio                       N
+  CaptureAspectRatio                            N
+  CaptureGammaEquation                          N
+  CaptureGammaEquation                          N
+  LumaEquation                                  N
+  ColorimetryCode                               N
+  SignalFormCode                                N
+  ColorFieldCode                                N
+  FieldRate                                     N
+  FrameRate                                     N
+  FrameLayout                                   N
+  SamplingStructureCode                         N
+  TotalLinesperFrame                            N
+  ActiveLinesperFrame                           N
+  LeadingLines                                  N
+  TrailingLines                                 N
+  AnalogVideoSystemName                         N
+  LuminanceSampleRate                           N
+  ActiveSamplesperLine                          N
+  TotalSamplesperLine                           N
+  SamplingHierarchyCode                         N
+  HorizontalSubsampling                         N
+  ColorSiting                                   N
+  SampledHeight                                 N
+  SampledWidth                                  N
+  SampledXOffset                                N
+  SampledYOffset                                N
+  DisplayHeight                                 N
+  DisplayWidth                                  N
+  DisplayXOffset                                N
+  DisplayYOffset                                N
+  FilteringCode                                 N
+  ImageHeight                                   N
+  ImageWidth                                    N
+  BitsperPixel                                  N
+  RoundingMethodCode                            N
+  BlackReferenceLevel                           N
+  WhiteReferenceLevel                           N
+  FieldFrameTypeCode                            N
+  PulldownSequence?                             N
+  PulldownFieldDominance                        N
+  VideoAndFilmFrameRelationship                 N
+  CaptureFilmFrameRate                          N
+  TransferFilmFrameRate                         N
+  VideoTestParameter                            N
+  VideoTestResult                               N
+  VideoTestResult                               N
+  FilmTestParameter                             N
+  FilmTestResult                                N
+  FilmTestResult?                               N
+  ElectrospatialFormulation                     N
+  FilteringApplied                              N
+  AudioReferenceLevel                           N
+  AudioMonoChannelCount                         N
+  AudioStereoChannelCount                       N
+  AnalogSystem                                  N
+  AudioSampleRate                               N
+  BitsPerSample                                 N
+  RoundingLaw                                   N
+  Dither                                        N
+  OpticalTrack                                  N
+  MagneticTrack                                 N
+  Signal-to-NoiseRatio                          N
+  Weighting                                     N
+  AnalogDataCodingKind                          N
+  TimecodeKind                                  N
+  TimecodeTimebase                              N
+  TimecodeUserBitsFlag                          N
+  IncludeSync                                   N
+  DropFrame                                     N
+  TimecodeSourceKind                            N
+  AnalogMetadataCarrier                         N
+  DigitalMetadataCarrier                        N
+  AnalogMonitoringAndControlCodingKind          N
+  SampleRate                                    N
+  EssenceLength                                 N
+  FilmColorProcess                              N
+  EdgeCodeFormat?                               N
+  FilmFormatName                                N
+  FilmStockKind                                 N
+  FilmStockManufacturerName                     N
+  PhysicalMediaLength?                          N
+  FilmCaptureAperture                           N
+  ImageCategory                                 N
+  ImageSourceDeviceKind                         N
+  OpticalTestParameterName                      N
+  OpticalTestResult                             N
+  OpticalTestResult                             N
+  SensorType                                    N
+  PolarCharacteristic                           N
+  IntegrationIndication                         N
+  EventIndication                               N
+  QualityFlag                                   N
+  PhysicalInstanceKind                          N
+  DigitalOrAnalogOrigination                    N
+  MicrophonePlacementTechniques                 N
+  SimpleFlaggingCount                           N
+  CopyCount                                     N
+  CloneCount                                    N
+  Work-in-ProgressFlag                          N
+  VideoOrImageCompressionAlgorithm              N
+  SplicingMetadata?                             N
+  AudioCompressionAlgorithm                     N
+  VideoNoiseReductionAlgorithm                  N
+  AudioNoiseReductionAlgorithm                  N
+  EnhancementOrModificationDescription          N
+  VideoDeviceKind                               N
+  VideoDeviceParameterName                      N
+  VideoDeviceParameterSetting                   N
+  AudioEnhancementOrModificationDescription     N
+  AudioFirstMix-DownProcess                     N
+  AudioDeviceKind                               N
+  AudioDeviceParameter                          N
+  AudioDeviceParameterSetting                   N
+  DataEnhancementOrModificationDescription      N
+  DataDeviceKind                                N
+  DataDeviceParameterName                       N
+  DataDeviceParameterSetting                    N
+  DefaultFadeType?                              N
+  ActiveState                                   N
+  Fade-InType?                                  N
+  Fade-OutType?                                 N
+  SpeedChangeEffectFlag                         N
+  InputSegmentCount                             N
+  Bypass                                        N
+  VideoCompressionAlgorithm                     N
+  MPEGVideoRecodingDataset?                     N
+  UpstreamAudioCompressionAlgorithm             N
+  MPEGAudioRecodingDataset?                     N
+  ProgramSupportMaterialReference               N
+  AdvertisingMaterialReference                  N
+  ProgramCommercialMaterialReference            N
+  ContiguousDataFlag                            N
+  PositionInSequence                            N
+  RelativePositionInSequenceOffset              N
+  RelativePositionInSequenceName                N
+  ImageCoordinateSystem                         N
+  MapDatumUsed                                  N
+  LocalDatumAbsolutePositionAccuracy            N
+  DeviceAbsolutePositionalAccuracy              N
+  DeviceAltitude                                N
+  DeviceAltitude                                N
+  DeviceLatitude                                N
+  DeviceLatitude                                N
+  DeviceLongitude                               N
+  DeviceLongitude                               N
+  DeviceXDimension                              N
+  DeviceYDimension                              N
+  FramePositionalAccuracy                       N
+  FrameCenterLatitude                           N
+  FrameCenterLatitude                           N
+  FrameCenterLongitude                          N
+  FrameCenterLongitude                          N
+  FrameCenterLatitudeLongitude                  N
+  LocalDatumRelativePositionAccuracy            N
+  DeviceRelativePositionalAccuracy              N
+  DeviceRelativePositionX                       N
+  DeviceRelativePositionY                       N
+  DeviceRelativePositionZ                       N
+  SubjectRelativePositionalAccuracy             N
+  PositionWithinViewportImageXCoordinate        N
+  PositionWithinViewportImageYCoordinate        N
+  SourceImageCenterXCoordinate                  N
+  SourceImageCenterYCoordinate                  N
+  ViewportImageCenterCCoordinate                N
+  ViewportImageCenterYCoordinate                N
+  DeviceAbsoluteSpeed                           N
+  DeviceAbsoluteHeading                         N
+  SubjectAbsoluteSpeed                          N
+  SubjectAbsoluteHeading                        N
+  DeviceRelativeSpeed                           N
+  DeviceRelativeHeading                         N
+  SubjectRelativeSpeed                          N
+  SubjectRelativeHeading                        N
+  SlantRange                                    N
+  TargetWidth                                   N
+  ViewportHeight                                N
+  ViewportWidth                                 N
+  SensorRollAngle                               N
+  AngleToNorth                                  N
+  ObliquityAngle                                N
+  PlaceKeyword                                  N
+  ObjectCountryCode                             N
+  ShootingCountryCode                           N
+  SettingCountryCode                            N
+  CopyrightLicenseCountryCode                   N
+  IntellectualPropertyLicenseCountryCode        N
+  ObjectRegionCode                              N
+  ShootingRegionCode                            N
+  SettingRegionCode                             N
+  CopyrightLicenseRegionCode                    N
+  IntellectualPropertyLicenseRegionCode         N
+  RoomNumber                                    N
+  StreetNumber                                  N
+  StreetName                                    N
+  PostalTown                                    N
+  CityName                                      N
+  StateOrProvinceOrCountyName                   N
+  PostalCode                                    N
+  CountryName                                   N
+  SettingRoomNumber                             N
+  SettingStreetNumberOrBuildingName             N
+  SettingStreetName                             N
+  SettingTownName                               N
+  SettingCityName                               N
+  SettingStateOrProvinceOrCountyName            N
+  SettingPostalCode                             N
+  SettingCountryName                            N
+  TelephoneNumber                               N
+  FaxNumber                                     N
+  E-MailAddress                                 N
+  SettingDescription                            N
+  UTCUserDateTime                               N
+  LocalUserDateTime                             N
+  SMPTE309MUserDateTime?                        N
+  SMPTE12MUserDateTime?                         N
+  UTCStartDateTime                              N
+  LocalStartDateTime                            N
+  TimecodeStartDateTime?                        N
+  UTCEndDateTime                                N
+  LocalEndDateTime                              N
+  TimecodeEndDateTime?                          N
+  UTCLastModifyDate                             N
+  LocalLastModifyDate                           N
+  TimecodeLastModifyDate?                       N
+  UTCEventStartDateTime                         N
+  LocalEventStartDateTime                       N
+  TimecodeEventStartDateTime?                   N
+  UTCEventEndDateTime                           N
+  LocalEventEndDateTime                         N
+  TimecodeEventEndDateTime?                     N
+  StartTimeRelativeToReference                  N
+  StartTimecodeRelativeToReference?             N
+  MaterialEndTimeOffset                         N
+  MaterialEndTimecodeOffset?                    N
+  EventStartTimeOffset                          N
+  EventStartTimecodeOffset?                     N
+  EventEndTimeOffset                            N
+  EventEndTimecodeOffset?                       N
+  FrameCountOffset                              N
+  TimePeriodName                                N
+  LocalCreationDateTime                         N
+  TimecodeCreationDateTime?                     N
+  LocalModifyDate                               N
+  TimecodeModifyDate?                           N
+  FrameCount                                    N
+  MaterialAbsoluteDuration                      N
+  MaterialAbsoluteDuration?                     N
+  TextlessBlackDuration                         N
+  EventAbsoluteDurationFrameCount               N
+  EventAbsoluteDuration                         N
+  EventAbsoluteDuration?                        N
+  BufferDelay?                                  N
+  ProgramIdentifier                             N
+  ProgramIdentifierString                       N
+  ShimName                                      N
+  SignalStandard                                N
+  IntendedAFD                                   N
+  SlateTitle                                    N
+  NOLACode                                      N
+  Rating                                        N
+  NielsenStreamIdentifier                       N
+  IsRecording                                   N
+  IsLiveProduction                              N
+  IsLiveTransmission                            N
+  IsDubbed                                      N
+  IsVoiceover                                   N
+  HasAudioWatermark                             N
+  AudioWatermarkKind                            N
+  HasVideoWatermark                             N
+  VideoWatermarkKind                            N
+  SubtitlesPresent                              N
+  CaptionTitles                                 N
+  CaptionsViaTeletext                           N
+  TextlessMaterial                              N
+  AudioReferenceLevel                           N
+  StorageDeviceKind                             N
+  StorageMediaKind                              N
+  StorageMediaID                                N
+  BroadcastDate                                 N
+  BroadcastTime                                 N
+  IsRepeat                                      N
+  FirstTransmissionInfo                         N
+  TeletextSubtitlesAvailable                    N
+  SeasonEpisodeNumber                           N
+  SeasonEpisodeTitle                            N
+  EPGProgramSynopsis                            N
+  ContentClassification                         N
+  DVBParentalRating                             N
+  ContentMaturityRating                         N
+  ContentMaturityDescription                    N
+  ContentMaturityGraphic                        N
+  ContractEntity                                N
+  ContractTypeLink                              N
+  ConsumerRightsToCopy                          N
+  BroadcasterRightsToCopy                       N
+  DirectorName                                  N
+  ProducerName                                  N
+  FemaleLeadActressName                         N
+  MaleLeadActorName                             N
+  PresenterName                                 N
+  MainSponsorName                               N
+  VoiceTalentName                               N
+  PostboxNumber                                 N
+  PostCodeForPostbox                            N
+  ProgramNumber                                 N
+  DefinitionObjectID?                           N
+  IEEEDeviceID                                  N
+  ProjectNumber                                 N
+  EdgeCodeHeader?                               N
+  ChannelHandle                                 N
+  PhysicalMediaLocation                         N
+  MediaLocation                                 N
+  TrackNumber                                   N
+  EdgeCodeStart                                 N
+  VersionTitle                                  N
+  TrackID                                       N
+  TrackName                                     N
+  TrackName                                     N
+  DefinitionObjectName                          N
+  DefinitionObjectName                          N
+  ContentPackageMetadataLink                    N
+  DefinedName                                   N
+  DefinedName                                   N
+  DeviceManufacturerName                        N
+  DeviceManufacturerName                        N
+  ManufacturerID?                               N
+  IEEEManufacturerID                            N
+  AAFManufacturerID?                            N
+  SupplyingDepartmentName                       N
+  AudienceShare                                 N
+  AudienceAppreciation                          N
+  Salutation                                    N
+  HonorsAndQualifications                       N
+  ObjectModelVersion                            N
+  SDKVersion                                    N
+  IsOptional                                    N
+  IsSearchable                                  N
+  UseDefaultValue                               N
+  DefaultDataValue?                             N
+  Size                                          N
+  IsSigned                                      N
+  ElementCount                                  N
+  ElementNameList                               N
+  TypeDefinitionElementValueList                N
+  MemberNameList                                N
+  ExtendibleElementNameList                     N
+  TypeDefinitionExtendibleElementValues?        N
+  TargetSet?                                    N
+  FillerData?                                   N
+  KLVDataValue?                                 N
+  PackageKLVData?                               N
+  ComponentKLVData?                             N
+  AssignedCategoryName                          N
+  AssignedCategoryName                          N
+  AssignedCategoryValue                         N
+  AssignedCategoryValue                         N
+  ShotList                                      N
+  PackageUserComments?                          N
+  Cue-InWords                                   N
+  Cue-OutWords                                  N
+  ObjectKind                                    N
+  ObjectKind                                    N
+  ObjectDescription                             N
+  ObjectDescription                             N
+  ObjectName                                    N
+  MetadataItemName                              N
+  ShotCommentKind                               N
+  ShotComment                                   N
+  ComputedObjectKind                            N
+  ComputedObjectKind                            N
+  VersionNumberString                           N
+  VersionNumberString                           N
+  VersionNumber                                 N
+  WAVESummary?                                  N
+  AIFCSummary?                                  N
+  TIFFSummary?                                  N
+  ViewportAspectRatio                           N
+  CaptureGammaEquation?                         N
+  ColorimetryCode?                              N
+  PresentationGammaEquation                     N
+  PresentationGammaEquation?                    N
+  FieldDominance                                N
+  VideoLineMap                                  N
+  AnalogVideoSystemName?                        N
+  VerticalSub-sampling                          N
+  BitsperPixel                                  N
+  ColorRangeLevels                              N
+  PixelLayout?                                  N
+  AlphaSampleDepth                              N
+  Palette?                                      N
+  PaletteLayout?                                N
+  ComponentDepth                                N
+  VideoCodingSchemeID?                          N
+  RoundedCaptureFilmFrameRate                   N
+  AudioAverageBitrate                           N
+  AudioFixedBitrateFlag                         N
+  CodingLawKind                                 N
+  AudioCodingSchemeID?                          N
+  LayerNumber                                   N
+  TimecodeTimebase                              N
+  RoundedTimecodeTimebase                       N
+  ComponentDataDefinition                       N
+  StreamData?                                   N
+  TimecodeStreamData?                           N
+  RecordedFormat                                N
+  TapeShellKind                                 N
+  TapeShellKind                                 N
+  TapeFormulation                               N
+  TapeFormulation                               N
+  TapeCapacity                                  N
+  TapeManufacturer                              N
+  TapeManufacturer                              N
+  TapeStock                                     N
+  TapeStock                                     N
+  TapeBatchNumber                               N
+  TapeBatchNumber                               N
+  PerforationsPerFrame                          N
+  PerforationsPerFrame                          N
+  FilmFormatName                                N
+  FilmFormatName?                               N
+  FilmStockKind                                 N
+  FilmStockManufacturerName                     N
+  FilmBatchNumber                               N
+  FilmBatchNumber                               N
+  FilmGauge?                                    N
+  EdgeCodeFilmGauge?                            N
+  ExposedAspectRatio                            N
+  ImageAlignmentOffset                          N
+  ImageStartOffset                              N
+  ImageEndOffset                                N
+  PaddingBits                                   N
+  FocalLength                                   N
+  SensorSize                                    N
+  FNumber                                       N
+  SensorTypeCode                                N
+  FieldOfViewHorizontal                         N
+  AnamorphicLensCharacteristic                  N
+  UniformDataFlag                               N
+  JPEGTableID?                                  N
+  AlphaTransparency                             N
+  GenerationID?                                 N
+  ApplicationSupplierName                       N
+  ApplicationSupplierName                       N
+  ApplicationName                               N
+  ApplicationName                               N
+  ApplicationVersionNumber                      N
+  ApplicationVersionString                      N
+  ApplicationVersionString                      N
+  ApplicationPlatform                           N
+  ApplicationPlatform                           N
+  ApplicationProductID?                         N
+  LinkedGenerationID?                           N
+  ContainerVersion                              N
+  ToolkitVersion                                N
+  Plug-InCategoryID?                            N
+  Plug-InPlatformID?                            N
+  MinimumSupportedPlatformVersion               N
+  MaximumSupportedPlatformVersion               N
+  Plug-InEngineID?                              N
+  MinimumSupportedEngineVersion                 N
+  MaximumSupportedEngineVersion                 N
+  Plug-InAPIID?                                 N
+  MinimumAPIVersion                             N
+  MaximumAPIVersion                             N
+  Software-OnlySupportFlag                      N
+  HardwareAcceleratorFlag                       N
+  Plug-InLocatorSet?                            N
+  AuthenticationFlag                            N
+  AssociatedMetadataDefinition?                 N
+  EventTrackEditRate                            N
+  DefaultFadeEditRate                           N
+  EditingEventComment                           N
+  EditingEventComment                           N
+  EditRate                                      N
+  OperationDefinitionID?                        N
+  Value?                                        N
+  EditHint?                                     N
+  OperationDataDefinition?                      N
+  OperationCategory?                            N
+  DisplayUnits                                  N
+  DisplayUnits                                  N
+  BypassOverride                                N
+  TimepointValue?                               N
+  BeginAnchor                                   N
+  BeginAnchor                                   N
+  EndAnchor                                     N
+  EndAnchor                                     N
+  FilmToVideoTransferDirection?                 N
+  FilmToVideoTransferKind?                      N
+  FilmToVideoTransferPhase?                     N
+  TeletextSubtitlesFlag                         N
+  SubtitleDatafileFlag                          N
+  ClosedCaptionSubtitlesFlag                    N
+  SampleIndex?                                  N
+  SourcePackageID?                              N
+  SourceTrackID                                 N
+  RelativeScope                                 N
+  RelativeTrack                                 N
+  ObjectClass?                                  N
+  EssenceContainerFormat?                       N
+  CodecDefinition?                              N
+  ParameterDefinition?                          N
+  Interpolation?                                N
+  ParameterDataType?                            N
+  CodecEssenceDescriptor?                       N
+  ContentStorage?                               N
+  Dictionary?                                   N
+  EssenceDescription?                           N
+  Sequence?                                     N
+  TransitionEffect?                             N
+  EffectRendering?                              N
+  InputSegment?                                 N
+  StillFrame?                                   N
+  Selected?                                     N
+  Annotation?                                   N
+  ManufacturerInformationObject?                N
+  CodecEssenceKinds?                            N
+  OperationParameters?                          N
+  DegradedEffects?                              N
+  Packages?                                     N
+  EssenceData?                                  N
+  OperationDefinitions?                         N
+  ParameterDefinitions?                         N
+  DataDefinitions?                              N
+  Plug-InDefinitions?                           N
+  CodecDefinitions?                             N
+  ContainerDefinitions?                         N
+  InterpolationDefinitions?                     N
+  AvailableRepresentations?                     N
+  InputSegments?                                N
+  EssenceLocators?                              N
+  IdentificationList?                           N
+  Tracks?                                       N
+  ControlPointList?                             N
+  PackageTracks?                                N
+  Alternates?                                   N
+  ComponentsInSequence?                         N
+  Parameters?                                   N
+  LinkedPackageID?                              N
+  ParentClass?                                  N
+  Properties?                                   N
+  IsConcrete                                    N
+  PropertyType?                                 N
+  LocalID                                       N
+  IsUniqueIdentifier                            N
+  ClassDefinitions?                             N
+  TypeDefinitions?                              N
+  TargetClassOfStrongReference?                 N
+  TargetClassOfWeakReference?                   N
+  EnumerationUnderlyingIntegerType?             N
+  FixedArrayElementType?                        N
+  VariableArrayElementType?                     N
+  SetElementType?                               N
+  StringElementType?                            N
+  StreamElementType?                            N
+  MemberTypes?                                  N
+  RenamedType?                                  N
+  DictionaryIdentifier?                         N
+  DictionaryDescription                         N
+  DictionaryDescription                         N
+  BlockContinuityCount                          N
+  StreamPositionIndicator                       N
+  Origin                                        N
+  StartTimeRelativeToReference                  N
+  StartTimecode                                 N
+  CutPoint                                      N
+  EventStart                                    N
+  ControlPointTime                              N
+  CreateDate                                    N
+  ModifyDate                                    N
+  ContainerLastModifyDate                       N
+  PackageLastModifyDate                         N
+  Duration                                      N
+  DefaultFadeDuration                           N
+  Fade-InDuration                               N
+  Fade-OutDuration                              N
+  TapeFormat?                                   N
+  OrganizationID                                N
+  GlobalNumber                                  N
+  DeviceIDKind                                  N
+  DeviceKind                                    N
+  DeviceKindCode                                N
+  PlatformDesignation                           N
+  PlatformModel                                 N
+  PlatformSerialNumber                          N
+  LocalTargetID                                 N
+  MagneticDiskNumber                            N
+  OpticalDiscNumber                             N
+  StreamID                                      N
+  TransportStreamID                             N
+  OrganizationalProgramNumber                   N
+  OrganizationalProgramNumber                   N
+  ItemDesignatorID?                             N
+  LocalFilePath                                 N
+  TitleKind                                     N
+  MainTitle                                     N
+  SecondaryTitle                                N
+  SeriesNumber                                  N
+  EpisodeNumber                                 N
+  SceneNumber                                   N
+  VersionTitle                                  N
+  MissionID                                     N
+  MissionID                                     N
+  RecordingLabelName                            N
+  RecordingLabelName                            N
+  CollectionName                                N
+  CollectionName                                N
+  OriginCode                                    N
+  MainCatalogNumber                             N
+  CatalogPrefixNumber                           N
+  SideNumber                                    N
+  RecordedTrackNumber                           N
+  SeriesinaSeriesGroupCount                     N
+  ProgrammingGroupKind                          N
+  PurchasingOrganizationName                    N
+  SalesContractNumber                           N
+  PurchasingDepartment                          N
+  ContractType                                  N
+  ContractTypeCode                              N
+  ContractClauseDescription                     N
+  ContractLineCode                              N
+  ContractLineName                              N
+  ContractTermsOfBusiness                       N
+  ContractInstallmentPercentage                 N
+  Jurisdiction                                  N
+  CopyrightStatus                               N
+  CopyrightOwnerName                            N
+  IntellectualPropertyDescription               N
+  IntellectualPropertyRights                    N
+  Rightsholder                                  N
+  RightsManagementAuthority                     N
+  RightsConditionDescription                    N
+  RightsConditionDescription                    N
+  CurrencyName                                  N
+  TotalPayment                                  N
+  PayeeAccountName                              N
+  PayeeAccountNumber                            N
+  PayeeAccountSortCode                          N
+  TotalIncome                                   N
+  PayerAccountName                              N
+  PayerAccountNumber                            N
+  PayerAccountSortCode                          N
+  SecurityClassification                        N
+  SecurityClassificationCaveats                 N
+  ClassifiedBy                                  N
+  ClassificationReason                          N
+  DeclassificationDate                          N
+  DerivedFrom                                   N
+  ClassificationComment                         N
+  ClassificationAndMarkingSystem                N
+  BroadcastOrganizationName                     N
+  BroadcastServiceName                          N
+  BroadcastMediumCode                           N
+  BroadcastRegion                               N
+  NatureOfPersonality                           N
+  ContributionStatus                            N
+  SupportorAdministrationStatus                 N
+  OrganizationKind                              N
+  ProductionOrganizationRole                    N
+  SupportOrganizationRole                       N
+  JobFunctionName                               N
+  JobFunctionCode                               N
+  RoleName                                      N
+  JobTitle                                      N
+  JobTitle                                      N
+  ContactKind                                   N
+  ContactDepartmentName                         N
+  FamilyName                                    N
+  FirstGivenName                                N
+  SecondGivenName                               N
+  ThirdGivenName                                N
+  PersonDescription                             N
+  PersonDescription                             N
+  MainName                                      N
+  SupplementaryName                             N
+  OrganizationMainName                          N
+  SupplementaryOrganizationName                 N
+  RegionCode                                    N
+  CountryName                                   N
+  CountryName                                   N
+  RegionName                                    N
+  RegionName                                    N
+  LanguageName                                  N
+  LanguageName                                  N
+  TerminatingFillerData                         N
+  TimingBiasCorrection                          N
+  TimingBiasCorrectionDescription               N
+  Genre                                         N
+  TargetAudience                                N
+  ProgramMaterialClassificationCode             N
+  Theme                                         N
+  SubjectName                                   N
+  SubjectName                                   N
+  Keywords                                      N
+  KeyFrameSampleCount                           N
+  Abstract                                      N
+  Purpose                                       N
+  Description                                   N
+  ColorDescriptor                               N
+  FormatDescriptor                              N
+  IntentDescriptor                              N
+  IntentDescriptor                              N
+  TextualDescriptionKind                        N
+  TextualDescriptionKind                        N
+  FestivalName                                  N
+  ObjectDescriptionCode                         N
+  DescriptionKind                               N
+  DescriptionKind                               N
+  DescriptiveComment                            N
+  DescriptiveComment                            N
+  ContextDescription                            N
+  ComputedKeywords                              N
+  ObjectIdentificationConfidence                N
+  ObjectHorizontalAverageDimension              N
+  ObjectVerticalAverageDimension                N
+  ObjectAreaDimension                           N
+  HorizontalActionSafePercentage                N
+  VerticalActionSafePercentage                  N
+  HorizontalGraphicsSafePercentage              N
+  VerticalGraphicsSafePercentage                N
+  PerceivedDisplayFormatName                    N
+  PerceivedDisplayFormatCode                    N
+  VideoColorKind                                N
+  PictureDisplayRate                            N
+  VideoAverageBitrate                           N
+  VideoFixedBitrate                             N
+  DigitalVideoFileFormat                        N
+  CodingLawName                                 N
+  AudioCodingSchemeCode                         N
+  AudioCodingSchemeName                         N
+  DigitalEncodingBitrate                        N
+  DataEssenceCodingID?                          N
+  StorageKind                                   N
+  StorageKind                                   N
+  StorageKindCode                               N
+  TapePartitionCapacity                         N
+  DiscPartitionCapacity                         N
+  FocalLength                                   N
+  FieldOfViewHorizontal                         N
+  FieldOfViewVertical                           N
+  SystemNameOrNumber                            N
+  LogoFlag                                      N
+  GraphicKind                                   N
+  GraphicUsageKind                              N
+  SignatureTuneFlag                             N
+  BackgroundMusicFlag                           N
+  ProductionScriptReference                     N
+  ProductionScriptReference                     N
+  TranscriptReference                           N
+  TranscriptReference                           N
+  HorizontalDatum                               N
+  VerticalDatum                                 N
+  DeviceLatitude                                N
+  DeviceLongitude                               N
+  FrameCenterLatitude                           N
+  FrameCenterLongitude                          N
+  CornerLatitudePoint1                          N
+  CornerLatitudePoint1                          N
+  CornerLatitudePoint2                          N
+  CornerLatitudePoint2                          N
+  CornerLatitudePoint3                          N
+  CornerLatitudePoint3                          N
+  CornerLatitudePoint4                          N
+  CornerLatitudePoint4                          N
+  CornerLongitudePoint1                         N
+  CornerLongitudePoint1                         N
+  CornerLongitudePoint2                         N
+  CornerLongitudePoint2                         N
+  CornerLongitudePoint3                         N
+  CornerLongitudePoint3                         N
+  CornerLongitudePoint4                         N
+  CornerLongitudePoint4                         N
+  SubjectDistance                               N
+  PlaceKeyword                                  N
+  ObjectCountryCode                             N
+  ObjectCountryCodeMethod                       N
+  CountryCodeMethod                             N
+  Non-USClassifyingCountryCode                  N
+  ReleasableCountryCode                         N
+  ObjectRegionName                              N
+  ShootingRegionName                            N
+  SettingRegionName                             N
+  CopyrightLicenseRegionName                    N
+  IntellectualPropertyLicenseRegionName         N
+  RoomNumber                                    N
+  StreetNumber                                  N
+  StreetName                                    N
+  PostalTown                                    N
+  CityName                                      N
+  StateOrProvinceOrCountyName                   N
+  PostalCode                                    N
+  CountryName                                   N
+  SettingRoomNumber                             N
+  SettingStreetNumberOrBuildingName             N
+  SettingStreetName                             N
+  SettingTownName                               N
+  SettingCityName                               N
+  SettingStateOrProvinceOrCountyName            N
+  SettingPostalCode                             N
+  SettingCountryName                            N
+  TelephoneNumber                               N
+  FaxNumber                                     N
+  E-MailAddress                                 N
+  SettingDescription                            N
+  POSIXMicroseconds                             N
+  EventElapsedTimeToStart                       N
+  EventElapsedTimeToEnd                         N
+  OrganizationIDKind                            N
+  OrganizationIDKind                            N
+  SMPTEUL?                                      N
+  EssenceContainerArray?                        N
+  EssenceStreamID                               N
+  IndexStreamID                                 N
+  WorkingTitle                                  N
+  WorkingTitle                                  N
+  OriginalTitle                                 N
+  OriginalTitle                                 N
+  ClipNumber                                    N
+  ClipNumber                                    N
+  DescriptiveMetadataTrackIDs                   N
+  IdentifierKind                                N
+  IdentifierValue                               N
+  OrganizationCode                              N
+  OrganizationCode                              N
+  SupplierIdentificationKind                    N
+  SupplierIdentificationValue                   N
+  SupplierAccountNumber                         N
+  SupplierAccountName                           N
+  SupplierAccountName                           N
+  EpisodeStartNumber                            N
+  EpisodeEndNumber                              N
+  PurchaserIdentificationKind                   N
+  PurchaserIdentificationValue                  N
+  PurchaserAccountNumber                        N
+  PurchaserAccountName                          N
+  PurchaserAccountName                          N
+  ContractType                                  N
+  ContractClauseDescription                     N
+  ContractLineName                              N
+  ContractTermsOfBusiness                       N
+  Jurisdiction                                  N
+  TotalCurrencyAmount                           N
+  InstallmentNumber                             N
+  IdentifierIssuingAuthority                    N
+  PublishingOrganizationName                    N
+  PublishingOrganizationName                    N
+  PublishingServiceName                         N
+  PublishingServiceName                         N
+  PublishingMediumName                          N
+  PublishingMediumName                          N
+  PublishingRegionName                          N
+  PublishingRegionName                          N
+  Salutation                                    N
+  HonorsAndQualifications                       N
+  OtherGivenNames                               N
+  OtherGivenNames                               N
+  AlternateName                                 N
+  AlternateName                                 N
+  ISO639TextLanguageCode                        N
+  ISO639CaptionsLanguageCode                    N
+  PrimarySpokenLanguageCode                     N
+  SecondarySpokenLanguageCode                   N
+  PrimaryOriginalLanguageCode                   N
+  SecondaryOriginalLanguageCode                 N
+  MajorVersion                                  N
+  MinorVersion                                  N
+  SectorSize                                    N
+  ElementLength                                 N
+  ThesaurusName                                 N
+  Cue-InWords                                   N
+  Cue-OutWords                                  N
+  KeypointKind                                  N
+  KeypointKind                                  N
+  KeypointValue                                 N
+  KeypointValue                                 N
+  FestivalName                                  N
+  AwardName                                     N
+  AwardName                                     N
+  AwardCategory                                 N
+  AwardCategory                                 N
+  SlateInformation                              N
+  LockedIndicator                               N
+  BitsPerAudioSample                            N
+  CaptionKind                                   N
+  CaptionKind                                   N
+  SliceCount                                    N
+  SliceNumber                                   N
+  ElementDelta                                  N
+  PositionTableIndexing                         N
+  SliceOffsetList?                              N
+  PosTableArray?                                N
+  StreamOffset                                  N
+  EditUnitFlags                                 N
+  TemporalOffset                                N
+  AnchorOffset                                  N
+  EditUnitLength                                N
+  HeaderByteCount                               N
+  IndexByteCount                                N
+  PackLength                                    N
+  IntegrationIndication                         N
+  EventIndication                               N
+  GraphicUsageKind                              N
+  PrimaryPackage?                               N
+  DescriptiveMetadataSets?                      N
+  DescriptiveMetadataSetReferences?             N
+  FileDescriptors?                              N
+  StreamPositionIndicator                       N
+  StreamPositionIndicator                       N
+  StreamPositionIndicator                       N
+  OffsetToMetadata                              N
+  OffsetToMetadata                              N
+  OffsetToIndexTable                            N
+  OffsetToIndexTable                            N
+  ByteOffset                                    N
+  ReversePlay                                   N
+  FirstNumberInSequence                         N
+  FirstNumberInSequence                         N
+  PreviousNumberInSequence                      N
+  PreviousNumberInSequence                      N
+  CurrentNumberInSequence                       N
+  CurrentNumberInSequence                       N
+  NextNumberInSequence                          N
+  NextNumberInSequence                          N
+  LastNumberInSequence                          N
+  LastNumberInSequence                          N
+  CentralTelephoneNumber                        N
+  MobileTelephoneNumber                         N
+  URL                                           N
+  LocationDescription                           N
+  LocationDescription                           N
+  LocationKind                                  N
+  LocationKind                                  N
+  UTCEventStartDateTime                         N
+  LocalEventStartDateTime                       N
+  UTCEventEndDateTime                           N
+  LocalEventEndDateTime                         N
+  KeyTimePoint                                  N
+  TimePeriodName                                N
+  SettingDateTime                               N
+  ContractDateTime                              N
+  RightsStartDateTime                           N
+  RightsStopDateTime                            N
+  PaymentDueDateTime                            N
+  ClipID                                        N
+  DeviceKind                                    N
+  DeviceAssetNumber                             N
+  IdentificationUL?                             N
+  OperationalPatternUL?                         N
+  EssenceContainers?                            N
+  DescriptiveMetadataSchemes?                   N
+  ProjectName                                   N
+  ProjectName                                   N
+  LocalTagValue                                 N
+  LocalTagUniqueID?                             N
+  BrandMainTitle                                N
+  BrandMainTitle                                N
+  BrandOriginalTitle                            N
+  BrandOriginalTitle                            N
+  FrameworkTitle                                N
+  FrameworkTitle                                N
+  SourceTrackIDs                                N
+  ShotTrackIDs                                  N
+  ProgrammingGroupKind                          N
+  ProgrammingGroupTitle                         N
+  ProgrammingGroupTitle                         N
+  IdentifierIssuingAuthority                    N
+  LinkingName                                   N
+  LinkingName                                   N
+  NameSuffix                                    N
+  NameSuffix                                    N
+  FormerFamilyName                              N
+  FormerFamilyName                              N
+  Nationality                                   N
+  Nationality                                   N
+  Citizenship                                   N
+  Citizenship                                   N
+  FrameworkTextLanguageCode                     N
+  KAGSize                                       N
+  ReversedByteOrder                             N
+  ItemName                                      N
+  ItemName                                      N
+  ItemValue                                     N
+  ItemValue                                     N
+  XMLDocumentText?                              N
+  XMLDocumentText                               N
+  XMLDocumentText                               N
+  XMLDocumentText?                              N
+  FrameworkThesaurusName                        N
+  FrameworkThesaurusName                        N
+  GroupSynopsis                                 N
+  GroupSynopsis                                 N
+  AnnotationSynopsis                            N
+  AnnotationSynopsis                            N
+  AnnotationDescription                         N
+  AnnotationDescription                         N
+  ScriptingKind                                 N
+  ScriptingKind                                 N
+  ScriptingText                                 N
+  ScriptingText                                 N
+  ShotDescription                               N
+  ShotDescription                               N
+  AnnotationKind                                N
+  AnnotationKind                                N
+  RelatedMaterialDescription                    N
+  RelatedMaterialDescription                    N
+  ClipKind                                      N
+  DeviceUsageDescription                        N
+  DeviceUsageDescription                        N
+  DisplayF2Offset                               N
+  StoredF2Offset                                N
+  ActiveFormatDescriptor                        N
+  LineNumber                                    N
+  ScanningDirection                             N
+  ComponentMaximumRef                           N
+  ComponentMinimumRef                           N
+  AlphaMaximumRef                               N
+  AlphaMinimumRef                               N
+  VideoPayloadIdentifier                        N
+  VideoPayloadIdentifier2002                    N
+  SingleSequenceFlag                            N
+  ConstantBPictureFlag                          N
+  CodedContentScanningKind                      N
+  LowDelayIndicator                             N
+  ClosedGOPIndicator                            N
+  IdenticalGOPIndicator                         N
+  MaximumGOPSize                                N
+  MaximumBPictureCount                          N
+  ProfileAndLevel                               N
+  Bitrate                                       N
+  ChannelCount                                  N
+  AudioSampleRate                               N
+  PeakEnvelope                                  N
+  PeakEnvelopeData?                             N
+  BlockAlign                                    N
+  SequenceOffset                                N
+  BlockStartOffset                              N
+  FileSecurityReport                            N
+  FileSecurityWave                              N
+  AverageBytesPerSecond                         N
+  AuxiliaryBitsMode                             N
+  ChannelStatusMode                             N
+  FixedChannelStatusData?                       N
+  UserDataMode?                                 N
+  FixedUserData?                                N
+  Emphasis                                      N
+  BextCodingHistory                             N
+  BextCodingHistory                             N
+  QltyBasicData                                 N
+  QltyBasicData                                 N
+  QltyStartOfModulation                         N
+  QltyStartOfModulation                         N
+  QltyQualityEvent                              N
+  QltyQualityEvent                              N
+  QltyEndOfModulation                           N
+  QltyEndOfModulation                           N
+  QltyQualityParameter                          N
+  QltyQualityParameter                          N
+  QltyOperatorComment                           N
+  QltyOperatorComment                           N
+  QltyCueSheet                                  N
+  QltyCueSheet                                  N
+  DialNorm                                      N
+  DataEssenceCoding                             N
+  DateTimeRate                                  N
+  DateTimeDropFrameFlag                         N
+  DateTimeEmbeddedFlag                          N
+  DateTimeKind?                                 N
+  DeltaEntryArray?                              N
+  PositionTableCount                            N
+  PositionTable?                                N
+  IndexEntryArray?                              N
+  SignalStandard                                N
+  DataDefinition?                               N
+  RecordedFormat                                N
+  GenerationCopyNumber                          N
+  GenerationCloneNumber                         N
+  ThemeMusicFlag                                N
+  InsertMusicFlag                               N
+  IndexEditRate                                 N
+  LinkedTrackID                                 N
+  EssenceContainerFormat?                       N
+  CodecDefinition?                              N
+  DescriptiveMetadataFramework?                 N
+  GroupSet?                                     N
+  BankDetailsSet?                               N
+  ImageFormatSet?                               N
+  ProcessingSet?                                N
+  ProjectSet?                                   N
+  ContactsListSet?                              N
+  AnnotationCueWordsSet?                        N
+  ShotCueWordsSet?                              N
+  AwardParticipantSets?                         N
+  ContractParticipantSets?                      N
+  PersonSets?                                   N
+  ParticipantOrganizationSets?                  N
+  PersonOrganizationSets?                       N
+  LocationSets?                                 N
+  TitlesSets?                                   N
+  GroupSets?                                    N
+  IdentificationSets?                           N
+  EpisodicItemSets?                             N
+  BrandingSets?                                 N
+  EventSets?                                    N
+  PublicationSets?                              N
+  AwardSets?                                    N
+  CaptionDescriptionSets?                       N
+  AnnotationSets?                               N
+  ProductionSettingPeriodSets?                  N
+  SceneSettingPeriodSets?                       N
+  ScriptingSets?                                N
+  ClassificationSets?                           N
+  SceneShotSets?                                N
+  ClipShotSets?                                 N
+  KeyPointSets?                                 N
+  ShotParticipantRoleSets?                      N
+  ShotPersonSets?                               N
+  OrganizationSets?                             N
+  ShotLocationSets?                             N
+  AddressSets?                                  N
+  CommunicationSets?                            N
+  ContractSets?                                 N
+  RightsSets?                                   N
+  PaymentsSets?                                 N
+  DeviceParametersSets?                         N
+  ClassificationNameValueSets?                  N
+  ContactNameValueSets?                         N
+  DeviceParameterNameValueSets?                 N
+  MetadataServerLocators?                       N
+  RelatedMaterialLocators?                      N
+  LocalTagEntries?                              N
+  TotalNumberInSequence                         N
+  RoomOrSuiteName                               N
+  RoomOrSuiteName                               N
+  BuildingName                                  N
+  BuildingName                                  N
+  URL                                           N
+  LocalFestivalDateTime                         N
+  ShotStartPosition                             N
+  IndexingStartPosition                         N
+  EventOrigin                                   N
+  SettingPeriodDescription                      N
+  SettingPeriodDescription                      N
+  IndexDuration                                 N
+  ShotDuration                                  N
+  ExtendedClipID                                N
+  ClipIDArray?                                  N
+  ExtendedClipIDArray?                          N
+  TrackNumberBatch                              N
+  ExtendedTextLanguageCode                      N
+  ExtendedCaptionsLanguageCode                  N
+  FrameworkExtendedTextLanguageCode             N
+  PrimaryExtendedSpokenLanguageCode             N
+  SecondaryExtendedSpokenLanguageCode           N
+  OriginalExtendedSpokenPrimaryLanguageCode     N
+  SecondaryOriginalExtendedSpokenLanguageCode   N
+  KLVMetadataSequence?                          N
+  PackageAttributes?                            N
+  ComponentAttributes?                          N
+  MPEG7BiMDecoderInitFrame1?                    N
+  MPEG7BiMDecoderInitFrame2?                    N
+  MPEG7BiMDecoderInitFrame3?                    N
+  MPEG7BiMDecoderInitFrame4?                    N
+  MPEG7BiMDecoderInitFrame5?                    N
+  MPEG7BiMDecoderInitFrame6?                    N
+  MPEG7BiMDecoderInitFrame7?                    N
+  MPEG7BiMDecoderInitFrame8?                    N
+  MPEG7BiMAccessUnitFrame1?                     N
+  MPEG7BiMAccessUnitFrame2?                     N
+  MPEG7BiMAccessUnitFrame3?                     N
+  MPEG7BiMAccessUnitFrame4?                     N
+  MPEG7BiMAccessUnitFrame5?                     N
+  MPEG7BiMAccessUnitFrame6?                     N
+  MPEG7BiMAccessUnitFrame7?                     N
+  MPEG7BiMAccessUnitFrame8?                     N
+  ComponentUserComments?                        N
+  ShotCommentKind                               N
+  ShotComment                                   N
+  SensorMode                                    N
+  ChannelAssignment?                            N
+  ContentPackageIndexArray?                     N
+  VideoIndexArray?                              N
+  ApproximateImageContainerSize                 N
+  MetadataEncodingSchemeCode                    N
+  MIMEMediaType                                 N
+  MIMEMediaType                                 N
+  FieldOfViewVerticalFP                         N
+  PackageUsageKind?                             N
+  ChannelID                                     N
+  ChannelIDs                                    N
+  KLVDataType?                                  N
+  KLVDataParentProperties?                      N
+  TaggedValueParentProperties?                  N
+  AnnotationParticipantSets?                    N
+  KLVDataDefinitions?                           N
+  TaggedValueDefinitions?                       N
+  AddressNameValueSets?                         N
+  NMEADocumentText                              N
+  PlatformRollAngle                             N
+  PlatformPitchAngle                            N
+  PlatformHeadingAngle                          N
+  AddressLine                                   N
+  AddressLine                                   N
+  PlaceName                                     N
+  PlaceName                                     N
+  GeographicalCoordinates?                      N
+  AstronomicalBodyName                          N
+  AstronomicalBodyName                          N
+  TimecodeArray?                                N
+  MarkIn                                        N
+  UserPosition                                  N
+  MarkOut                                       N
+  ClipCreationDateTime                          N
+  VideoClipDuration                             N
+  ParticipantID?                                N
+  ContactID?                                    N
+  DefaultNamespaceURI                           N
+  DefaultNamespaceURI                           N
+  NamespaceURI                                  N
+  NamespaceURI                                  N
+  NamespaceURIs                                 N
+  NamespaceURIs                                 N
+  HTMLDOCTYPE                                   N
+  HTMLDOCTYPE                                   N
+  NamespacePrefix                               N
+  NamespacePrefix                               N
+  NamespacePrefixes                             N
+  NamespacePrefixes                             N
+  RightsComment                                 N
+  RightsComment                                 N
+  NominationCategory                            N
+  NominationCategory                            N
+  PeakEnvelopeVersion                           N
+  PeakEnvelopeFormat                            N
+  PointsPerPeakValue                            N
+  PeakEnvelopeBlockSize                         N
+  PeakChannelCount                              N
+  PeakFrameCount                                N
+  PeakOfPeaksPosition                           N
+  PeakEnvelopeTimestamp                         N
+  PeakEnvelopeData?                             N
+  RIFFChunkID                                   N
+  RIFFChunkLength                               N
+  RIFFChunkData?                                N
+  MIMECharSet                                   N
+  MIMECharSet                                   N
+  MIMEEncoding                                  N
+  MIMEEncoding                                  N
+  MonoSourceTrackIDs                            N
+  CompositionRendering?                         N
+  CaptionsDescriptionParticipantSets?           N
+  EventAnnotationSets?                          N
+  ScriptingLocators?                            N
+  UnknownBWFChunks?                             N
+  CryptographicContextID?                       N
+  PlatformDesignation                           N
+  LocalTargetID                                 N
+  NITFLayerTargetID                             N
+  NITFLayerTargetID                             N
+  PackageName                                   N
+  RP217DataStreamPID                            N
+  RP217VideoStreamPID                           N
+  SourceOrganization                            N
+  OriginalProducerName                          N
+  SecurityClassification                        N
+  SecurityClassificationCaveats                 N
+  ClassificationComment                         N
+  CipherAlgorithm?                              N
+  CryptographicKeyID?                           N
+  EncryptedSourceValue?                         N
+  MICAlgorithm?                                 N
+  MIC?                                          N
+  ISO639-1LanguageCode                          N
+  JFIFMarkerDescription                         N
+  JFIFMarkerDescription                         N
+  HTMLMetaDescription                           N
+  HTMLMetaDescription                           N
+  MetadataItemName                              N
+  ColorPrimaries                                N
+  ColorPrimaries?                               N
+  ProductFormat                                 N
+  ProductFormat                                 N
+  SourceLength                                  N
+  ImageSourceDeviceKind                         N
+  SourceContainerFormat?                        N
+  SourceKey?                                    N
+  DynamicSourcePackageID?                       N
+  DynamicSourceTrackIDs                         N
+  SourceIndex?                                  N
+  SourceSpecies?                                N
+  SourceValue?                                  N
+  CryptographicContextObject?                   N
+  Sub-descriptors?                              N
+  EncryptedTrackFileID?                         N
+  CryptographicContextLink?                     N
+  PlaintextOffset                               N
+  TripletSequenceNumber                         N
+  BoundingRectangle?                            N
+  GeographicLocation?                           N
+  GeographicPolygonCoordinates?                 N
+  GeographicAreaNorthwest?                      N
+  GeographicAreaSoutheast?                      N
+  GeographicAreaSourceDatum                     N
+  GeographicPolygonSourceDatum                  N
+  CountryCodeMethod                             N
+  ClassifyingCountryCode                        N
+  ReleasableCountryCode                         N
+  UTCStartDateTime                              N
+  UTCInstantDateTime                            N
+  UTCInstantDateTime                            N
+  UTCLastModifyDate                             N
+  ToleranceMode?                                N
+  ToleranceWindow?                              N
+  ToleranceInterpolationMethod?                 N
+  VBILineCount                                  N
+  StoredVBILineNumber                           N
+  VBIWrappingType                               N
+  VBIPayloadSampleCount                         N
+  VBIPayloadByteArray                           N
+  ANCPacketCount                                N
+  StoredANCLineNumber                           N
+  ANCWrappingType                               N
+  ANCPayloadSampleCount                         N
+  ANCPayloadByteArray                           N
+  VBIPayloadSampleCoding                        N
+  ANCPayloadSampleCoding                        N
+  Rsiz                                          N
+  Xsiz                                          N
+  Ysiz                                          N
+  XOsiz                                         N
+  YOsiz                                         N
+  XTsiz                                         N
+  YTsiz                                         N
+  XTOsiz                                        N
+  YTOsiz                                        N
+  Csiz                                          N
+  PictureComponentSizing?                       N
+  CodingStyleDefault?                           N
+  QuantizationDefault?                          N
+  MPEGAudioBitrate                              N
+  CBEStartOffset                                N
+  VBEEndOffset                                  N
+  SubDescriptor?                                N
+  SubDescriptors?                               N
+  RootMetaDictionary?                           N
+  RootPreface?                                  N
+  RootObjectDirectory?                          N
+  RootFormatVersion                             N
+  FrameCenterElevation                          N
+  PackageMarkInPosition                         N
+  PackageMarkOutPosition                        N
+  Ad-ID?                                        N
+  ResourceID?                                   N
+  AncillaryResourceID?                          N
+  ApplicationSchemeBatch?                       N
+  RegisterKind?                                 N
+  RegisterVersion                               N
+  RegisterEditorName                            N
+  RegisterStatusKind?                           N
+  RegisterItemName                              N
+  RegisterItemDefinition                        N
+  RegisterItemSymbol?                           N
+  RegisterItemDefiningDocumentName              N
+  RegisterItemUL?                               N
+  RegisterItemNotes                             N
+  RegisterItemIntroductionVersion               N
+  RegisterItemHierarchyLevel                    N
+  RegisterEntryStatus?                          N
+  RegisterAction                                N
+  RegisterApproverName                          N
+  RegisterCreationTime                          N
+  RegistrantName                                N
+  RegisterItemOriginatorName                    N
+  RegisterUserName                              N
+  RegisterUserTime                              N
+  RegisterAdministrationNotes                   N
+  AFDAndBarData?                                N
+  PanScanInformation?                           N
+  VC-1InitializationMetadata?                   N
+  VC-1SingleSequence                            N
+  VC-1CodedContentType                          N
+  VC-1IdenticalGOP                              N
+  VC-1MaximumGOP                                N
+  VC-1BPictureCount                             N
+  VC-1AverageBitrate                            N
+  VC-1MaximumBitrate                            N
+  VC-1Profile                                   N
+  VC-1Level                                     N
+  LinkedTimecodeTrackID?                        N
+  SMPTE337MDataStreamNumber                     N
+  ApplicationScheme?                            N
+  DescriptiveMetadataScheme?                    N
+  UCSEncoding                                   N
+  LinkedApplicationPlug-InInstanceID?           N
+  LinkedDescriptiveFrameworkPlug-InID?          N
+  ApplicationPlug-InInstanceID?                 N
+  DescriptiveMetadataPlug-InID?                 N
+  ApplicationEnvironmentID                      N
+  DescriptiveMetadataApplicationEnvironmentID   N
+  LinkedDescriptiveObjectPlug-InID?             N
+  TimebaseReferenceTrackID                      N
+  ObjectClassDefinition?                        N
+  ApplicationPlug-InBatch?                      N
+  PackageMarker?                                N
+  PackageTimelineMarkerRef?                     N
+  RegisterAdministrationObject?                 N
+  RegisterEntryAdministrationObject?            N
+  GenericPayloads?                              N
+  RegisterEntryArray?                           N
+  RegisterAdministrationArray?                  N
+  ApplicationInformationArray?                  N
+  RegisterChildEntryArray?                      N
+  RegisterReleaseDateTime                       N
+  RegisterItemStatusChangeDateTime              N
+  OpenHeader                                    MXF Header
+  ClosedHeader                                  MXF Header
+  OpenCompleteHeader                            MXF Header
+  ClosedCompleteHeader                          MXF Header
+  OpenBodyPartition?                            N
+  ClosedBodyPartition?                          N
+  OpenCompleteBodyPartition?                    N
+  ClosedCompleteBodyPartition?                  N
+  Footer?                                       N
+  CompleteFooter?                               N
+  Primer                                        MXF
+  RandomIndexMetadataV10?                       N
+  RandomIndexMetadata?                          N
+  PartitionMetadata?                            N
+  StructuralComponent                           MXF
+  SequenceSet                                   MXF
+  SourceClip?                                   N
+  TimecodeComponent                             MXF
+  ContentStorageSet                             MXF
+  EssenceContainerDataSet                       MXF
+  FileDescriptor                                MXF
+  GenericPictureEssenceDescriptor               MXF
+  CDCIEssenceDescriptor                         MXF
+  RGBAEssenceDescriptor                         MXF
+  Preface                                       MXF
+  Identification                                MXF
+  NetworkLocator                                MXF
+  TextLocator                                   MXF
+  GenericPackage                                MXF
+  MaterialPackage                               MXF
+  SourcePackage                                 MXF
+  GenericTrack                                  MXF
+  EventTrack                                    MXF
+  StaticTrack                                   MXF
+  Track                                         MXF
+  DMSegment                                     MXF
+  GenericSoundEssenceDescriptor                 MXF
+  GenericDataEssenceDescriptor                  MXF
+  MultipleDescriptor                            MXF
+  DMSourceClip                                  MXF
+  AES3PCMDescriptor                             MXF
+  WaveAudioDescriptor                           MXF
+  MPEG2VideoDescriptor                          MXF
+  JPEG2000PictureSubDescriptor                  MXF
+  VBIDataDescriptor                             MXF
+  V10IndexTableSegment?                         N
+  IndexTableSegment?                            N
+  DMSet                                         MXF
+  DMFramework                                   MXF
+  ProductionFramework                           MXF
+  ClipFramework                                 MXF
+  SceneFramework                                MXF
+  Titles                                        MXF
+  Identification                                MXF
+  GroupRelationship                             MXF
+  Branding                                      MXF
+  Event                                         MXF
+  Publication                                   MXF
+  Award                                         MXF
+  CaptionDescription                            MXF
+  Annotation                                    MXF
+  SettingPeriod                                 MXF
+  Scripting                                     MXF
+  Classification                                MXF
+  Shot                                          MXF
+  KeyPoint                                      MXF
+  CueWords                                      MXF
+  Participant                                   MXF
+  ContactsList                                  MXF
+  Person                                        MXF
+  Organisation                                  MXF
+  Location                                      MXF
+  Address                                       MXF
+  Communications                                MXF
+  Contract                                      MXF
+  Rights                                        MXF
+  PictureFormat                                 MXF
+  DeviceParameters                              MXF
+  NameValue                                     MXF
+  Processing                                    MXF
+  Projects                                      MXF
+  CryptographicFramework                        MXF
+  CryptographicContext                          MXF
+  DefaultObject?                                N
+  CipherAlgorithmAES128CBC?                     N
+  HMACAlgorithmSHA1128?                         N
+  EncryptedContainerLabel?                      N
+  CryptographicFrameworkLabel?                  N
+
+=head3 MXF Header Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    MXFVersion                           N
+     24    FooterPosition                       N
+     32    HeaderSize                           N
+
+=head2 DV Tags
+
+The following tags are extracted from DV videos.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  AspectRatio                                   N
+  AudioBitsPerSample                            N
+  AudioChannels                                 N
+  AudioSampleRate                               N
+  Colorimetry                                   N
+  DateTimeOriginal                              N
+  Duration                                      N
+  FrameRate                                     N
+  ImageHeight                                   N
+  ImageWidth                                    N
+  TotalBitrate                                  N
+  VideoFormat                                   N
+  VideoScanType                                 N
+
+=head2 Flash Tags
+
+The information below is extracted from SWF (Shockwave Flash) files.  Tags
+with string ID's represent information extracted from the file header.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'Compressed'         Compressed               N
+  'Duration'           Duration                 N
+  'FlashVersion'       FlashVersion             N
+  'FrameCount'         FrameCount               N
+  'FrameRate'          FrameRate                N
+  'ImageHeight'        ImageHeight              N
+  'ImageWidth'         ImageWidth               N
+  0x0045               FileAttributes           N
+  0x004d               XMP                      XMP
+
+=head3 Flash FLV Tags
+
+Information is extracted from the following packets in FLV (Flash Video)
+files.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0008   Audio                                Flash Audio
+  0x0009   Video                                Flash Video
+  0x0012   Meta                                 Flash Meta
+
+=head3 Flash Audio Tags
+
+Information extracted from the Flash Audio header.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'Bit0-3' AudioEncoding                        N
+  'Bit4-5' AudioSampleRate                      N
+  'Bit6'   AudioBitsPerSample                   N
+  'Bit7'   AudioChannels                        N
+
+=head3 Flash Video Tags
+
+Information extracted from the Flash Video header.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'Bit4-7' VideoEncoding                        N
+
+=head3 Flash Meta Tags
+
+Below are a few observed FLV Meta tags, but ExifTool will attempt to extract
+information from any tag found.
+
+  Tag ID                   Tag Name             Writable
+  ------                   --------             --------
+  'audiocodecid'           AudioCodecID         N
+  'audiodatarate'          AudioBitrate         N
+  'audiodelay'             AudioDelay           N
+  'audiosamplerate'        AudioSampleRate      N
+  'audiosamplesize'        AudioSampleSize      N
+  'audiosize'              AudioSize            N
+  'bytelength'             ByteLength           N
+  'canSeekToEnd'           CanSeekToEnd         N
+  'canseekontime'          CanSeekOnTime        N
+  'createdby'              CreatedBy            N
+  'creationdate'           CreateDate           N
+  'cuePoints'              CuePoint             Flash CuePoint
+  'datasize'               DataSize             N
+  'duration'               Duration             N
+  'filesize'               FileSizeBytes        N
+  'framerate'              FrameRate            N
+  'hasAudio'               HasAudio             N
+  'hasCuePoints'           HasCuePoints         N
+  'hasKeyframes'           HasKeyFrames         N
+  'hasMetadata'            HasMetadata          N
+  'hasVideo'               HasVideo             N
+  'height'                 ImageHeight          N
+  'httphostheader'         HTTPHostHeader       N
+  'keyframesFilepositions' KeyFramePositions    N
+  'keyframesTimes'         KeyFramesTimes       N
+  'lastkeyframetimestamp'  LastKeyFrameTime     N
+  'lasttimestamp'          LastTimeStamp        N
+  'liveXML'                XMP                  XMP
+  'metadatacreator'        MetadataCreator      N
+  'metadatadate'           MetadataDate         N
+  'pmsg'                   Message              N
+  'purl'                   URL                  N
+  'sourcedata'             SourceData           N
+  'starttime'              StartTime            N
+  'stereo'                 Stereo               N
+  'totaldatarate'          TotalDataRate        N
+  'totalduration'          TotalDuration        N
+  'videocodecid'           VideoCodecID         N
+  'videodatarate'          VideoBitrate         N
+  'videosize'              VideoSize            N
+  'width'                  ImageWidth           N
+
+=head3 Flash CuePoint Tags
+
+These tag names are added to the CuePoint name to generate complete tag
+names like "CuePoint0Name".
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'name'               Name                     N
+  'parameters'         Parameter                Flash Parameter
+  'time'               Time                     N
+  'type'               Type                     N
+
+=head3 Flash Parameter Tags
+
+There are no pre-defined parameter tags, but ExifTool will extract any
+existing parameters, with tag names like "CuePoint0ParameterXxx".
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  [no tags known]
+
+=head2 Real Tags
+
+ExifTool recognizes three basic types of Real audio/video files: 1)
+RealMedia (RM, RV and RMVB), 2) RealAudio (RA), and 3) Real Metafile (RAM
+and RPM).
+
+=head3 Real Media Tags
+
+These B<Tag ID>'s are Chunk ID's used in RealMedia and RealVideo (RM, RV and
+RMVB) files.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'CONT'   CONT                                 Real ContentDescr
+  'MDPR'   MDPR                                 Real MediaProps
+  'PROP'   PROP                                 Real Properties
+  'RJMD'   RJMD                                 Real Metadata
+
+=head3 Real ContentDescr Tags
+
+  Sequence Tag Name                             Writable
+  -------- --------                             --------
+      0    TitleLen?                            N
+      1    Title                                N
+      2    AuthorLen?                           N
+      3    Author                               N
+      4    CopyrightLen?                        N
+      5    Copyright                            N
+      6    CommentLen?                          N
+      7    Comment                              N
+
+=head3 Real MediaProps Tags
+
+  Sequence Tag Name                             Writable
+  -------- --------                             --------
+      0    StreamNumber                         N
+      1    StreamMaxBitrate                     N
+      2    StreamAvgBitrate                     N
+      3    StreamMaxPacketSize                  N
+      4    StreamAvgPacketSize                  N
+      5    StreamStartTime                      N
+      6    StreamPreroll                        N
+      7    StreamDuration                       N
+      8    StreamNameLen?                       N
+      9    StreamName                           N
+     10    StreamMimeLen?                       N
+     11    StreamMimeType                       N
+     12    FileInfoLen?                         N
+     13    FileInfoLen2?                        N
+     14    FileInfoVersion                      N
+     15    PhysicalStreams?                     N
+     16    PhysicalStreamNumbers?               N
+     17    DataOffsets?                         N
+     18    NumRules?                            N
+     19    PhysicalStreamNumberMap?             N
+     20    NumProperties?                       N
+     21    FileInfoProperties                   Real FileInfo
+
+=head3 Real FileInfo Tags
+
+The following tags have been observed in the FileInfo properties, but any
+other existing information will also be extracted.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'Audiences'          Audiences                N
+  'Audio Format'       AudioFormat              N
+  'Content Rating'     ContentRating            N
+  'Creation Date'      CreateDate               N
+  'Description'        Description              N
+  'File ID'            FileID                   N
+  'Generated By'       Software                 N
+  'Indexable'          Indexable                N
+  'Keywords'           Keywords                 N
+  'Modification Date'  ModifyDate               N
+  'Target Audiences'   TargetAudiences          N
+  'Video Quality'      VideoQuality             N
+  'audioMode'          AudioMode                N
+  'videoMode'          VideoMode                N
+
+=head3 Real Properties Tags
+
+  Sequence Tag Name                             Writable
+  -------- --------                             --------
+      0    MaxBitrate                           N
+      1    AvgBitrate                           N
+      2    MaxPacketSize                        N
+      3    AvgPacketSize                        N
+      4    NumPackets                           N
+      5    Duration                             N
+      6    Preroll                              N
+      7    IndexOffset?                         N
+      8    DataOffset?                          N
+      9    NumStreams                           N
+     10    Flags                                N
+
+=head3 Real Metadata Tags
+
+The tags below represent information which has been observed in the Real
+Metadata format, but ExifTool will extract any information it finds in this
+format.  (As far as I can tell from the referenced documentation, string
+values should be plain text, but this is not the case for the only sample
+file I have been able to obtain containing this information.  These tags
+could also be split into separate sub-directories, but this will wait until
+I have better documentation or a more complete set of samples.)
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'Album/Name'         AlbumName                N
+  'Track/Category'     TrackCategory            N
+  'Track/Comments'     TrackComments            N
+  'Track/Lyrics'       TrackLyrics              N
+
+=head3 Real Audio Tags
+
+Tags in the following table reference information extracted from various
+versions of RealAudio (RA) files.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  '.ra3'   RA3                                  Real AudioV3
+  '.ra4'   RA4                                  Real AudioV4
+  '.ra5'   RA5                                  Real AudioV5
+
+=head3 Real AudioV3 Tags
+
+  Sequence Tag Name                             Writable
+  -------- --------                             --------
+      0    Channels                             N
+      1    Unknown?                             N
+      2    BytesPerMinute                       N
+      3    AudioBytes                           N
+      4    TitleLen?                            N
+      5    Title                                N
+      6    ArtistLen?                           N
+      7    Artist                               N
+      8    CopyrightLen?                        N
+      9    Copyright                            N
+     10    CommentLen?                          N
+     11    Comment                              N
+
+=head3 Real AudioV4 Tags
+
+  Sequence Tag Name                             Writable
+  -------- --------                             --------
+      0    FourCC1?                             N
+      1    AudioFileSize?                       N
+      2    Version2?                            N
+      3    HeaderSize?                          N
+      4    CodecFlavorID?                       N
+      5    CodedFrameSize?                      N
+      6    AudioBytes                           N
+      7    BytesPerMinute                       N
+      8    Unknown?                             N
+      9    SubPacketH?                          N
+     10    AudioFrameSize                       N
+     11    SubPacketSize?                       N
+     12    Unknown?                             N
+     13    SampleRate                           N
+     14    Unknown?                             N
+     15    BitsPerSample                        N
+     16    Channels                             N
+     17    FourCC2Len?                          N
+     18    FourCC2?                             N
+     19    FourCC3Len?                          N
+     20    FourCC3?                             N
+     21    Unknown?                             N
+     22    Unknown?                             N
+     23    TitleLen?                            N
+     24    Title                                N
+     25    ArtistLen?                           N
+     26    Artist                               N
+     27    CopyrightLen?                        N
+     28    Copyright                            N
+     29    CommentLen?                          N
+     30    Comment                              N
+
+=head3 Real AudioV5 Tags
+
+  Sequence Tag Name                             Writable
+  -------- --------                             --------
+      0    FourCC1?                             N
+      1    AudioFileSize?                       N
+      2    Version2?                            N
+      3    HeaderSize?                          N
+      4    CodecFlavorID?                       N
+      5    CodedFrameSize?                      N
+      6    AudioBytes                           N
+      7    BytesPerMinute                       N
+      8    Unknown?                             N
+      9    SubPacketH?                          N
+     10    FrameSize?                           N
+     11    SubPacketSize?                       N
+     12    SampleRate                           N
+     13    SampleRate2?                         N
+     14    BitsPerSample                        N
+     15    Channels                             N
+     16    Genr?                                N
+     17    FourCC3?                             N
+
+=head3 Real Metafile Tags
+
+Tags representing information extracted from Real Audio Metafile and
+RealMedia Plug-in Metafile (RAM and RPM) files.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'txt'    Text                                 N
+  'url'    URL                                  N
+
+=head2 RIFF Tags
+
+The RIFF container format is used various types of fines including WAV, AVI
+and WEBP.  According to the EXIF specification, Meta information is embedded
+in two types of RIFF C<LIST> chunks: C<INFO> and C<exif>, and information
+about the audio content is stored in the C<fmt > chunk.  As well as this
+information, some video information and proprietary manufacturer-specific
+information is also extracted.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'JUNK'               OlympusJunk              Olympus AVI
+                       CasioJunk                EXIF
+                       RicohJunk                Ricoh AVI
+                       PentaxJunk               Pentax Junk
+                       TextJunk                 N
+  'JUNQ'               OldXMP                   N
+  'LIST_INFO'          Info                     RIFF Info
+  'LIST_Tdat'          Tdat                     RIFF Tdat
+  'LIST_exif'          Exif                     RIFF Exif
+  'LIST_hdrl'          Hdrl                     RIFF Hdrl
+  'LIST_hydt'          PentaxData               Pentax AVI
+  'LIST_ncdt'          NikonData                Nikon AVI
+  '_PMX'               XMP                      XMP
+  'bext'               BroadcastExtension       RIFF BroadcastExt
+  'fmt '               AudioFormat              RIFF AudioFormat
+  'olym'               Olym                     Olympus WAV
+
+=head3 RIFF Info Tags
+
+RIFF INFO tags found in WAV audio and AVI video files.  Tags which are part
+of the EXIF 2.3 specification have an underlined Tag Name in the HTML
+version of this documentation.  Other tags are found in AVI files generated
+by some software.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'AGES'   Rated                                N
+  'CMNT'   Comment                              N
+  'CODE'   EncodedBy                            N
+  'COMM'   Comments                             N
+  'DIRC'   Directory                            N
+  'DISP'   SoundSchemeTitle                     N
+  'DTIM'   DateTimeOriginal                     N
+  'GENR'   Genre                                N
+  'IARL'   ArchivalLocation                     N
+  'IART'   Artist                               N
+  'IAS1'   FirstLanguage                        N
+  'IAS2'   SecondLanguage                       N
+  'IAS3'   ThirdLanguage                        N
+  'IAS4'   FourthLanguage                       N
+  'IAS5'   FifthLanguage                        N
+  'IAS6'   SixthLanguage                        N
+  'IAS7'   SeventhLanguage                      N
+  'IAS8'   EighthLanguage                       N
+  'IAS9'   NinthLanguage                        N
+  'IBSU'   BaseURL                              N
+  'ICAS'   DefaultAudioStream                   N
+  'ICDS'   CostumeDesigner                      N
+  'ICMS'   Commissioned                         N
+  'ICMT'   Comment                              N
+  'ICNM'   Cinematographer                      N
+  'ICNT'   Country                              N
+  'ICOP'   Copyright                            N
+  'ICRD'   DateCreated                          N
+  'ICRP'   Cropped                              N
+  'IDIM'   Dimensions                           N
+  'IDPI'   DotsPerInch                          N
+  'IDST'   DistributedBy                        N
+  'IEDT'   EditedBy                             N
+  'IENC'   EncodedBy                            N
+  'IENG'   Engineer                             N
+  'IGNR'   Genre                                N
+  'IKEY'   Keywords                             N
+  'ILGT'   Lightness                            N
+  'ILGU'   LogoURL                              N
+  'ILIU'   LogoIconURL                          N
+  'ILNG'   Language                             N
+  'IMBI'   MoreInfoBannerImage                  N
+  'IMBU'   MoreInfoBannerURL                    N
+  'IMED'   Medium                               N
+  'IMIT'   MoreInfoText                         N
+  'IMIU'   MoreInfoURL                          N
+  'IMUS'   MusicBy                              N
+  'INAM'   Title                                N
+  'IPDS'   ProductionDesigner                   N
+  'IPLT'   NumColors                            N
+  'IPRD'   Product                              N
+  'IPRO'   ProducedBy                           N
+  'IRIP'   RippedBy                             N
+  'IRTD'   Rating                               N
+  'ISBJ'   Subject                              N
+  'ISFT'   Software                             N
+  'ISGN'   SecondaryGenre                       N
+  'ISHP'   Sharpness                            N
+  'ISRC'   Source                               N
+  'ISRF'   SourceForm                           N
+  'ISTD'   ProductionStudio                     N
+  'ISTR'   Starring                             N
+  'ITCH'   Technician                           N
+  'IWMU'   WatermarkURL                         N
+  'IWRI'   WrittenBy                            N
+  'LANG'   Language                             N
+  'LOCA'   Location                             N
+  'PRT1'   Part                                 N
+  'PRT2'   NumberOfParts                        N
+  'RATE'   Rate                                 N
+  'STAR'   Starring                             N
+  'STAT'   Statistics                           N
+  'TAPE'   TapeName                             N
+  'TCDO'   EndTimecode                          N
+  'TCOD'   StartTimecode                        N
+  'TITL'   Title                                N
+  'TLEN'   Length                               N
+  'TORG'   Organization                         N
+  'TRCK'   TrackNumber                          N
+  'TURL'   URL                                  N
+  'TVER'   Version                              N
+  'VMAJ'   VegasVersionMajor                    N
+  'VMIN'   VegasVersionMinor                    N
+  'YEAR'   Year                                 N
+
+=head3 RIFF Tdat Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  [no tags known]
+
+=head3 RIFF Exif Tags
+
+These tags are part of the EXIF 2.3 specification for WAV audio files.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'ecor'   Make                                 N
+  'emdl'   Model                                N
+  'emnt'   MakerNotes                           N
+  'erel'   RelatedImageFile                     N
+  'etim'   TimeCreated                          N
+  'eucm'   UserComment                          N
+  'ever'   ExifVersion                          N
+
+=head3 RIFF Hdrl Tags
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'IDIT'               DateTimeOriginal         N
+  'ISMP'               Timecode                 N
+  'LIST_odml'          OpenDML                  RIFF OpenDML
+  'LIST_strl'          Stream                   RIFF Stream
+  'avih'               AVIHeader                RIFF AVIHeader
+
+=head3 RIFF OpenDML Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'dmlh'   ExtendedAVIHeader                    RIFF ExtAVIHdr
+
+=head3 RIFF ExtAVIHdr Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    TotalFrameCount                      N
+
+=head3 RIFF Stream Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  'strd'   StreamData                           RIFF StreamData
+  'strf'   AudioFormat                          RIFF AudioFormat
+           VideoFormat                          BMP
+  'strh'   StreamHeader                         RIFF StreamHeader
+  'strn'   StreamName                           N
+
+=head3 RIFF StreamData Tags
+
+This chunk is used to store proprietary information in AVI videos from some
+cameras.  The first 4 characters of the data are used as the Tag ID below.
+
+  Tag ID       Tag Name                         Writable
+  ------       --------                         --------
+  'AVIF'       AVIF                             EXIF
+  'CASI'       CasioData                        Casio AVI
+  'Zora'       VendorName                       N
+  'unknown'    UnknownData                      N
+
+=head3 RIFF AudioFormat Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    Encoding                             N
+      1    NumChannels                          N
+      2    SampleRate                           N
+      4    AvgBytesPerSec                       N
+      7    BitsPerSample                        N
+
+=head3 RIFF StreamHeader Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    StreamType                           N
+      1    AudioCodec                           N
+           VideoCodec                           N
+           Codec                                N
+      5    AudioSampleRate                      N
+           VideoFrameRate                       N
+           StreamSampleRate                     N
+      8    AudioSampleCount                     N
+           VideoFrameCount                      N
+           StreamSampleCount                    N
+     10    Quality                              N
+     11    SampleSize                           N
+
+=head3 RIFF AVIHeader Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    FrameRate                            N
+      1    MaxDataRate                          N
+      4    FrameCount                           N
+      6    StreamCount                          N
+      8    ImageWidth                           N
+      9    ImageHeight                          N
+
+=head3 RIFF BroadcastExt Tags
+
+Information found in the Broadcast Audio Extension chunk (see
+L<http://tech.ebu.ch/docs/tech/tech3285.pdf>).
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    Description                          N
+    256    Originator                           N
+    288    OriginatorReference                  N
+    320    DateTimeOriginal                     N
+    338    TimeReference                        N
+    346    BWFVersion                           N
+    602    CodingHistory                        N
+
+=head2 AIFF Tags
+
+Only the tags decoded by ExifTool are listed in this table.
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  '(c) '   Copyright                            N
+  'ANNO'   Annotation                           N
+  'AUTH'   Author                               N
+  'COMM'   Common                               AIFF Common
+  'COMT'   Comment                              AIFF Comment
+  'FVER'   FormatVersion                        AIFF FormatVers
+  'ID3 '   ID3                                  ID3
+  'NAME'   Name                                 N
+
+=head3 AIFF Common Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    NumChannels                          N
+      1    NumSampleFrames                      N
+      3    SampleSize                           N
+      4    SampleRate                           N
+      9    CompressionType                      N
+
+=head3 AIFF Comment Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0000   CommentTime                          N
+  0x0001   MarkerID                             N
+  0x0002   Comment                              N
+
+=head3 AIFF FormatVers Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    FormatVersionTime                    N
+
+=head2 ASF Tags
+
+The ASF format is used by Windows WMA and WMV files, and DIVX videos.  Tag
+ID's aren't listed because they are huge 128-bit GUID's that would ruin the
+formatting of this table.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  SimpleIndex                                   N
+  TimecodeIndex                                 N
+  Header                                        ASF Header
+  Data                                          N
+  XMP                                           XMP
+  Index                                         N
+  MediaIndex                                    N
+
+=head3 ASF Header Tags
+
+  Tag Name                                      Writable
+  --------                                      --------
+  Padding                                       N
+  ScriptCommand                                 N
+  ContentBranding                               ASF ContentBranding
+  ContentEncryption                             N
+  DigitalSignature                              N
+  ExtendedContentEncryption                     N
+  HeaderExtension                               ASF HeaderExtension
+  ContentDescription                            ASF ContentDescr
+  ErrorCorrection                               N
+  StreamBitrateProps                            N
+  CodecList                                     ASF CodecList
+  FileProperties                                ASF FileProperties
+  StreamProperties                              ASF StreamProperties
+  ExtendedContentDescr                          ASF ExtendedDescr
+  BitrateMutualExclusion                        N
+  Marker                                        N
+
+=head3 ASF ContentBranding Tags
+
+  Tag Name                                      Writable
+  --------                                      --------
+  BannerImageType                               N
+  BannerImage                                   N
+  BannerImageURL                                N
+  CopyrightURL                                  N
+
+=head3 ASF HeaderExtension Tags
+
+  Tag Name                                      Writable
+  --------                                      --------
+  ExtendedStreamProps                           N
+  AdvancedContentEncryption                     N
+  MetadataLibrary                               ASF Metadata
+  TimecodeIndexParms                            N
+  Compatibility                                 N
+  LanguageList                                  N
+  AdvancedMutualExcl                            N
+  BandwidthSharing                              N
+  Reserved1                                     N
+  Metadata                                      ASF Metadata
+  GroupMutualExclusion                          N
+  StreamPrioritization                          N
+  IndexParameters                               N
+
+=head3 ASF Metadata Tags
+
+  Tag Name                                      Writable
+  --------                                      --------
+  [no tags known]
+
+=head3 ASF ContentDescr Tags
+
+  Tag Name                                      Writable
+  --------                                      --------
+  Title                                         N
+  Author                                        N
+  Copyright                                     N
+  Description                                   N
+  Rating                                        N
+
+=head3 ASF CodecList Tags
+
+  Tag Name                                      Writable
+  --------                                      --------
+  AudioCodecDescription                         N
+  AudioCodecName                                N
+  OtherCodecDescription                         N
+  OtherCodecName                                N
+  VideoCodecDescription                         N
+  VideoCodecName                                N
+
+=head3 ASF FileProperties Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    FileID                               N
+     16    FileLength                           N
+     24    CreationDate                         N
+     32    DataPackets                          N
+     40    PlayDuration                         N
+     48    SendDuration                         N
+     56    Preroll                              N
+     64    Flags                                N
+     68    MinPacketSize                        N
+     72    MaxPacketSize                        N
+     76    MaxBitrate                           N
+
+=head3 ASF StreamProperties Tags
+
+Tags with index 54 and greater are conditional based on the StreamType.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    StreamType                           N
+     16    ErrorCorrectionType                  N
+     32    TimeOffset                           N
+     48    StreamNumber                         N
+     54    AudioCodecID                         N
+           ImageWidth                           N
+     56    AudioChannels                        N
+     58    AudioSampleRate                      N
+           ImageHeight                          N
+
+=head3 ASF ExtendedDescr Tags
+
+  Tag Name                                      Writable
+  --------                                      --------
+  ASFLeakyBucketPairs                           N
+  ASFPacketCount                                N
+  ASFSecurityObjectsSize                        N
+  AlbumArtist                                   N
+  AlbumCoverURL                                 N
+  AlbumTitle                                    N
+  AspectRatioX                                  N
+  AspectRatioY                                  N
+  AudioFileURL                                  N
+  AudioSourceURL                                N
+  Author                                        N
+  AuthorURL                                     N
+  AverageLevel                                  N
+  BannerImageData                               N
+  BannerImageType                               N
+  BannerImageURL                                N
+  BeatsPerMinute                                N
+  Bitrate                                       N
+  Broadcast                                     N
+  BufferAverage                                 N
+  Can_Skip_Backward                             N
+  Can_Skip_Forward                              N
+  Category                                      N
+  Codec                                         N
+  Composer                                      N
+  Conductor                                     N
+  ContainerFormat                               N
+  ContentDistributor                            N
+  ContentGroupDescription                       N
+  Copyright                                     N
+  CopyrightURL                                  N
+  CurrentBitrate                                N
+  DRM                                           N
+  DRM_ContentID                                 N
+  DRM_DRMHeader                                 N
+  DRM_DRMHeader_ContentDistributor              N
+  DRM_DRMHeader_ContentID                       N
+  DRM_DRMHeader_IndividualizedVersion           N
+  DRM_DRMHeader_KeyID                           N
+  DRM_DRMHeader_LicenseAcqURL                   N
+  DRM_DRMHeader_SubscriptionContentID           N
+  DRM_IndividualizedVersion                     N
+  DRM_KeyID                                     N
+  DRM_LASignatureCert                           N
+  DRM_LASignatureLicSrvCert                     N
+  DRM_LASignaturePrivKey                        N
+  DRM_LASignatureRootCert                       N
+  DRM_LicenseAcqURL                             N
+  DRM_V1LicenseAcqURL                           N
+  DVDID                                         N
+  Description                                   N
+  Director                                      N
+  Duration                                      N
+  EncodedBy                                     N
+  EncodingSettings                              N
+  EncodingTime                                  N
+  FileSize                                      N
+  Genre                                         N
+  GenreID                                       N
+  HasArbitraryDataStream                        N
+  HasAttachedImages                             N
+  HasAudio                                      N
+  HasFileTransferStream                         N
+  HasImage                                      N
+  HasScript                                     N
+  HasVideo                                      N
+  ISRC                                          N
+  InitialKey                                    N
+  IsVBR                                         N
+  Is_Protected                                  N
+  Is_Trusted                                    N
+  Language                                      N
+  Lyrics                                        N
+  Lyrics_Synchronised                           N
+  MCDI                                          N
+  MediaClassPrimaryID                           N
+  MediaClassSecondaryID                         N
+  MediaCredits                                  N
+  MediaIsDelay                                  N
+  MediaIsFinale                                 N
+  MediaIsLive                                   N
+  MediaIsPremiere                               N
+  MediaIsRepeat                                 N
+  MediaIsSAP                                    N
+  MediaIsStereo                                 N
+  MediaIsSubtitled                              N
+  MediaIsTape                                   N
+  MediaNetworkAffiliation                       N
+  MediaOriginalBroadcastDateTime                N
+  MediaOriginalChannel                          N
+  MediaStationCallSign                          N
+  MediaStationName                              N
+  ModifiedBy                                    N
+  Mood                                          N
+  NSC_Address                                   N
+  NSC_Description                               N
+  NSC_Email                                     N
+  NSC_Name                                      N
+  NSC_Phone                                     N
+  NumberOfFrames                                N
+  OptimalBitrate                                N
+  OriginalAlbumTitle                            N
+  OriginalArtist                                N
+  OriginalFilename                              N
+  OriginalLyricist                              N
+  OriginalReleaseTime                           N
+  OriginalReleaseYear                           N
+  ParentalRating                                N
+  ParentalRatingReason                          N
+  PartOfSet                                     N
+  PeakBitrate                                   N
+  PeakValue                                     N
+  Period                                        N
+  Picture                                       ASF Picture
+  PlaylistDelay                                 N
+  Producer                                      N
+  PromotionURL                                  N
+  ProtectionType                                N
+  Provider                                      N
+  ProviderCopyright                             N
+  ProviderRating                                N
+  ProviderStyle                                 N
+  Publisher                                     N
+  RadioStationName                              N
+  RadioStationOwner                             N
+  Rating                                        N
+  Seekable                                      N
+  SharedUserRating                              N
+  Signature_Name                                N
+  StreamTypeInfo                                N
+  Stridable                                     N
+  SubTitle                                      N
+  SubTitleDescription                           N
+  SubscriptionContentID                         N
+  Text                                          N
+  Title                                         N
+  ToolName                                      N
+  ToolVersion                                   N
+  Track                                         N
+  TrackNumber                                   N
+  UniqueFileIdentifier                          N
+  UserWebURL                                    N
+  VBRPeak                                       N
+  VideoClosedCaptioning                         N
+  VideoFrameRate                                N
+  VideoHeight                                   N
+  VideoWidth                                    N
+  WMADRCAverageReference                        N
+  WMADRCAverageTarget                           N
+  WMADRCPeakReference                           N
+  WMADRCPeakTarget                              N
+  WMCollectionGroupID                           N
+  WMCollectionID                                N
+  WMContentID                                   N
+  Writer                                        N
+  Year                                          N
+
+=head3 ASF Picture Tags
+
+  Tag Name                                      Writable
+  --------                                      --------
+  PictureType                                   N
+  PictureMimeType                               N
+  PictureDescription                            N
+  Picture                                       N
+
+=head2 DICOM Tags
+
+The DICOM format is based on the ACR-NEMA specification, but adds a file
+header and a number of new tags.  ExifTool will extract information from
+either type of file.  The Tag ID's in the following table are the tag group
+and element numbers in hexadecimal, as given in the DICOM specification (see
+L<http://medical.nema.org/>).  The table below contains tags from the DICOM
+2009 and earlier specifications plus some vendor-specific private tags.
+
+  Tag ID     Tag Name                           Writable
+  ------     --------                           --------
+  0002,0000  FileMetaInfoGroupLength            N
+  0002,0001  FileMetaInfoVersion                N
+  0002,0002  MediaStorageSOPClassUID            N
+  0002,0003  MediaStorageSOPInstanceUID         N
+  0002,0010  TransferSyntaxUID                  N
+  0002,0012  ImplementationClassUID             N
+  0002,0013  ImplementationVersionName          N
+  0002,0016  SourceApplicationEntityTitle       N
+  0002,0100  PrivateInformationCreatorUID       N
+  0002,0102  PrivateInformation                 N
+  0004,1130  FileSetID                          N
+  0004,1141  FileSetDescriptorFileID            N
+  0004,1142  SpecificCharacterSetOfFile         N
+  0004,1200  FirstDirectoryRecordOffset         N
+  0004,1202  LastDirectoryRecordOffset          N
+  0004,1212  FileSetConsistencyFlag             N
+  0004,1220  DirectoryRecordSequence            N
+  0004,1400  OffsetOfNextDirectoryRecord        N
+  0004,1410  RecordInUseFlag                    N
+  0004,1420  LowerLevelDirectoryEntityOffset    N
+  0004,1430  DirectoryRecordType                N
+  0004,1432  PrivateRecordUID                   N
+  0004,1500  ReferencedFileID                   N
+  0004,1504  MRDRDirectoryRecordOffset          N
+  0004,1510  ReferencedSOPClassUIDInFile        N
+  0004,1511  ReferencedSOPInstanceUIDInFile     N
+  0004,1512  ReferencedTransferSyntaxUIDInFile  N
+  0004,151A  ReferencedRelatedSOPClassUIDInFile N
+  0004,1600  NumberOfReferences                 N
+  0008,0000  IdentifyingGroupLength             N
+  0008,0001  LengthToEnd                        N
+  0008,0005  SpecificCharacterSet               N
+  0008,0006  LanguageCodeSequence               N
+  0008,0008  ImageType                          N
+  0008,0010  RecognitionCode                    N
+  0008,0012  InstanceCreationDate               N
+  0008,0013  InstanceCreationTime               N
+  0008,0014  InstanceCreatorUID                 N
+  0008,0016  SOPClassUID                        N
+  0008,0018  SOPInstanceUID                     N
+  0008,001A  RelatedGeneralSOPClassUID          N
+  0008,001B  OriginalSpecializedSOPClassUID     N
+  0008,0020  StudyDate                          N
+  0008,0021  SeriesDate                         N
+  0008,0022  AcquisitionDate                    N
+  0008,0023  ContentDate                        N
+  0008,0024  OverlayDate                        N
+  0008,0025  CurveDate                          N
+  0008,002A  AcquisitionDateTime                N
+  0008,0030  StudyTime                          N
+  0008,0031  SeriesTime                         N
+  0008,0032  AcquisitionTime                    N
+  0008,0033  ContentTime                        N
+  0008,0034  OverlayTime                        N
+  0008,0035  CurveTime                          N
+  0008,0040  DataSetType                        N
+  0008,0041  DataSetSubtype                     N
+  0008,0042  NuclearMedicineSeriesType          N
+  0008,0050  AccessionNumber                    N
+  0008,0052  QueryRetrieveLevel                 N
+  0008,0054  RetrieveAETitle                    N
+  0008,0056  InstanceAvailability               N
+  0008,0058  FailedSOPInstanceUIDList           N
+  0008,0060  Modality                           N
+  0008,0061  ModalitiesInStudy                  N
+  0008,0062  SOPClassesInStudy                  N
+  0008,0064  ConversionType                     N
+  0008,0068  PresentationIntentType             N
+  0008,0070  Manufacturer                       N
+  0008,0080  InstitutionName                    N
+  0008,0081  InstitutionAddress                 N
+  0008,0082  InstitutionCodeSequence            N
+  0008,0090  ReferringPhysicianName             N
+  0008,0092  ReferringPhysicianAddress          N
+  0008,0094  ReferringPhysicianTelephoneNumber  N
+  0008,0096  ReferringPhysicianIDSequence       N
+  0008,0100  CodeValue                          N
+  0008,0102  CodingSchemeDesignator             N
+  0008,0103  CodingSchemeVersion                N
+  0008,0104  CodeMeaning                        N
+  0008,0105  MappingResource                    N
+  0008,0106  ContextGroupVersion                N
+  0008,0107  ContextGroupLocalVersion           N
+  0008,010B  ContextGroupExtensionFlag          N
+  0008,010C  CodingSchemeUID                    N
+  0008,010D  ContextGroupExtensionCreatorUID    N
+  0008,010F  ContextIdentifier                  N
+  0008,0110  CodingSchemeIDSequence             N
+  0008,0112  CodingSchemeRegistry               N
+  0008,0114  CodingSchemeExternalID             N
+  0008,0115  CodingSchemeName                   N
+  0008,0116  ResponsibleOrganization            N
+  0008,0117  ContextUID                         N
+  0008,0201  TimezoneOffsetFromUTC              N
+  0008,1000  NetworkID                          N
+  0008,1010  StationName                        N
+  0008,1030  StudyDescription                   N
+  0008,1032  ProcedureCodeSequence              N
+  0008,103E  SeriesDescription                  N
+  0008,1040  InstitutionalDepartmentName        N
+  0008,1048  PhysiciansOfRecord                 N
+  0008,1049  PhysiciansOfRecordIDSequence       N
+  0008,1050  PerformingPhysicianName            N
+  0008,1052  PerformingPhysicianIDSequence      N
+  0008,1060  NameOfPhysicianReadingStudy        N
+  0008,1062  PhysicianReadingStudyIDSequence    N
+  0008,1070  OperatorsName                      N
+  0008,1072  OperatorIDSequence                 N
+  0008,1080  AdmittingDiagnosesDescription      N
+  0008,1084  AdmittingDiagnosesCodeSequence     N
+  0008,1090  ManufacturersModelName             N
+  0008,1100  ReferencedResultsSequence          N
+  0008,1110  ReferencedStudySequence            N
+  0008,1111  ReferencedProcedureStepSequence    N
+  0008,1115  ReferencedSeriesSequence           N
+  0008,1120  ReferencedPatientSequence          N
+  0008,1125  ReferencedVisitSequence            N
+  0008,1130  ReferencedOverlaySequence          N
+  0008,113A  ReferencedWaveformSequence         N
+  0008,1140  ReferencedImageSequence            N
+  0008,1145  ReferencedCurveSequence            N
+  0008,114A  ReferencedInstanceSequence         N
+  0008,1150  ReferencedSOPClassUID              N
+  0008,1155  ReferencedSOPInstanceUID           N
+  0008,115A  SOPClassesSupported                N
+  0008,1160  ReferencedFrameNumber              N
+  0008,1161  SimpleFrameList                    N
+  0008,1162  CalculatedFrameList                N
+  0008,1163  TimeRange                          N
+  0008,1164  FrameExtractionSequence            N
+  0008,1195  TransactionUID                     N
+  0008,1197  FailureReason                      N
+  0008,1198  FailedSOPSequence                  N
+  0008,1199  ReferencedSOPSequence              N
+  0008,1200  OtherReferencedStudiesSequence     N
+  0008,1250  RelatedSeriesSequence              N
+  0008,2110  LossyImageCompression              N
+  0008,2111  DerivationDescription              N
+  0008,2112  SourceImageSequence                N
+  0008,2120  StageName                          N
+  0008,2122  StageNumber                        N
+  0008,2124  NumberOfStages                     N
+  0008,2127  ViewName                           N
+  0008,2128  ViewNumber                         N
+  0008,2129  NumberOfEventTimers                N
+  0008,212A  NumberOfViewsInStage               N
+  0008,2130  EventElapsedTimes                  N
+  0008,2132  EventTimerNames                    N
+  0008,2133  EventTimerSequence                 N
+  0008,2134  EventTimeOffset                    N
+  0008,2135  EventCodeSequence                  N
+  0008,2142  StartTrim                          N
+  0008,2143  StopTrim                           N
+  0008,2144  RecommendedDisplayFrameRate        N
+  0008,2200  TransducerPosition                 N
+  0008,2204  TransducerOrientation              N
+  0008,2208  AnatomicStructure                  N
+  0008,2218  AnatomicRegionSequence             N
+  0008,2220  AnatomicRegionModifierSequence     N
+  0008,2228  PrimaryAnatomicStructureSequence   N
+  0008,2229  AnatomicStructureOrRegionSequence  N
+  0008,2230  AnatomicStructureModifierSequence  N
+  0008,2240  TransducerPositionSequence         N
+  0008,2242  TransducerPositionModifierSequence N
+  0008,2244  TransducerOrientationSequence      N
+  0008,2246  TransducerOrientationModifierSeq   N
+  0008,2253  AnatomicEntrancePortalCodeSeqTrial N
+  0008,2255  AnatomicApproachDirCodeSeqTrial    N
+  0008,2256  AnatomicPerspectiveDescrTrial      N
+  0008,2257  AnatomicPerspectiveCodeSeqTrial    N
+  0008,3001  AlternateRepresentationSequence    N
+  0008,3010  IrradiationEventUID                N
+  0008,4000  IdentifyingComments                N
+  0008,9007  FrameType                          N
+  0008,9092  ReferencedImageEvidenceSequence    N
+  0008,9121  ReferencedRawDataSequence          N
+  0008,9123  CreatorVersionUID                  N
+  0008,9124  DerivationImageSequence            N
+  0008,9154  SourceImageEvidenceSequence        N
+  0008,9205  PixelPresentation                  N
+  0008,9206  VolumetricProperties               N
+  0008,9207  VolumeBasedCalculationTechnique    N
+  0008,9208  ComplexImageComponent              N
+  0008,9209  AcquisitionContrast                N
+  0008,9215  DerivationCodeSequence             N
+  0008,9237  GrayscalePresentationStateSequence N
+  0008,9410  ReferencedOtherPlaneSequence       N
+  0008,9458  FrameDisplaySequence               N
+  0008,9459  RecommendedDisplayFrameRateInFloat N
+  0008,9460  SkipFrameRangeFlag                 N
+  0009,1001  FullFidelity                       N
+  0009,1002  SuiteID                            N
+  0009,1004  ProductID                          N
+  0009,1027  ImageActualDate                    N
+  0009,1030  ServiceID                          N
+  0009,1031  MobileLocationNumber               N
+  0009,10E3  EquipmentUID                       N
+  0009,10E6  GenesisVersionNow                  N
+  0009,10E7  ExamRecordChecksum                 N
+  0009,10E9  ActualSeriesDataTimeStamp          N
+  0010,0000  PatientGroupLength                 N
+  0010,0010  PatientName                        N
+  0010,0020  PatientID                          N
+  0010,0021  IssuerOfPatientID                  N
+  0010,0022  TypeOfPatientID                    N
+  0010,0030  PatientBirthDate                   N
+  0010,0032  PatientBirthTime                   N
+  0010,0040  PatientSex                         N
+  0010,0050  PatientInsurancePlanCodeSequence   N
+  0010,0101  PatientPrimaryLanguageCodeSeq      N
+  0010,0102  PatientPrimaryLanguageCodeModSeq   N
+  0010,1000  OtherPatientIDs                    N
+  0010,1001  OtherPatientNames                  N
+  0010,1002  OtherPatientIDsSequence            N
+  0010,1005  PatientBirthName                   N
+  0010,1010  PatientAge                         N
+  0010,1020  PatientSize                        N
+  0010,1030  PatientWeight                      N
+  0010,1040  PatientAddress                     N
+  0010,1050  InsurancePlanIdentification        N
+  0010,1060  PatientMotherBirthName             N
+  0010,1080  MilitaryRank                       N
+  0010,1081  BranchOfService                    N
+  0010,1090  MedicalRecordLocator               N
+  0010,2000  MedicalAlerts                      N
+  0010,2110  Allergies                          N
+  0010,2150  CountryOfResidence                 N
+  0010,2152  RegionOfResidence                  N
+  0010,2154  PatientTelephoneNumbers            N
+  0010,2160  EthnicGroup                        N
+  0010,2180  Occupation                         N
+  0010,21A0  SmokingStatus                      N
+  0010,21B0  AdditionalPatientHistory           N
+  0010,21C0  PregnancyStatus                    N
+  0010,21D0  LastMenstrualDate                  N
+  0010,21F0  PatientReligiousPreference         N
+  0010,2201  PatientSpeciesDescription          N
+  0010,2202  PatientSpeciesCodeSequence         N
+  0010,2203  PatientSexNeutered                 N
+  0010,2210  AnatomicalOrientationType          N
+  0010,2292  PatientBreedDescription            N
+  0010,2293  PatientBreedCodeSequence           N
+  0010,2294  BreedRegistrationSequence          N
+  0010,2295  BreedRegistrationNumber            N
+  0010,2296  BreedRegistryCodeSequence          N
+  0010,2297  ResponsiblePerson                  N
+  0010,2298  ResponsiblePersonRole              N
+  0010,2299  ResponsibleOrganization            N
+  0010,4000  PatientComments                    N
+  0010,9431  ExaminedBodyThickness              N
+  0011,1010  PatientStatus                      N
+  0012,0010  ClinicalTrialSponsorName           N
+  0012,0020  ClinicalTrialProtocolID            N
+  0012,0021  ClinicalTrialProtocolName          N
+  0012,0030  ClinicalTrialSiteID                N
+  0012,0031  ClinicalTrialSiteName              N
+  0012,0040  ClinicalTrialSubjectID             N
+  0012,0042  ClinicalTrialSubjectReadingID      N
+  0012,0050  ClinicalTrialTimePointID           N
+  0012,0051  ClinicalTrialTimePointDescription  N
+  0012,0060  ClinicalTrialCoordinatingCenter    N
+  0012,0062  PatientIdentityRemoved             N
+  0012,0063  DeidentificationMethod             N
+  0012,0064  DeidentificationMethodCodeSequence N
+  0012,0071  ClinicalTrialSeriesID              N
+  0012,0072  ClinicalTrialSeriesDescription     N
+  0012,0084  DistributionType                   N
+  0012,0085  ConsentForDistributionFlag         N
+  0018,0000  AcquisitionGroupLength             N
+  0018,0010  ContrastBolusAgent                 N
+  0018,0012  ContrastBolusAgentSequence         N
+  0018,0014  ContrastBolusAdministrationRoute   N
+  0018,0015  BodyPartExamined                   N
+  0018,0020  ScanningSequence                   N
+  0018,0021  SequenceVariant                    N
+  0018,0022  ScanOptions                        N
+  0018,0023  MRAcquisitionType                  N
+  0018,0024  SequenceName                       N
+  0018,0025  AngioFlag                          N
+  0018,0026  InterventionDrugInformationSeq     N
+  0018,0027  InterventionDrugStopTime           N
+  0018,0028  InterventionDrugDose               N
+  0018,0029  InterventionDrugSequence           N
+  0018,002A  AdditionalDrugSequence             N
+  0018,0030  Radionuclide                       N
+  0018,0031  Radiopharmaceutical                N
+  0018,0032  EnergyWindowCenterline             N
+  0018,0033  EnergyWindowTotalWidth             N
+  0018,0034  InterventionDrugName               N
+  0018,0035  InterventionDrugStartTime          N
+  0018,0036  InterventionSequence               N
+  0018,0037  TherapyType                        N
+  0018,0038  InterventionStatus                 N
+  0018,0039  TherapyDescription                 N
+  0018,003A  InterventionDescription            N
+  0018,0040  CineRate                           N
+  0018,0042  InitialCineRunState                N
+  0018,0050  SliceThickness                     N
+  0018,0060  KVP                                N
+  0018,0070  CountsAccumulated                  N
+  0018,0071  AcquisitionTerminationCondition    N
+  0018,0072  EffectiveDuration                  N
+  0018,0073  AcquisitionStartCondition          N
+  0018,0074  AcquisitionStartConditionData      N
+  0018,0075  AcquisitionEndConditionData        N
+  0018,0080  RepetitionTime                     N
+  0018,0081  EchoTime                           N
+  0018,0082  InversionTime                      N
+  0018,0083  NumberOfAverages                   N
+  0018,0084  ImagingFrequency                   N
+  0018,0085  ImagedNucleus                      N
+  0018,0086  EchoNumber                         N
+  0018,0087  MagneticFieldStrength              N
+  0018,0088  SpacingBetweenSlices               N
+  0018,0089  NumberOfPhaseEncodingSteps         N
+  0018,0090  DataCollectionDiameter             N
+  0018,0091  EchoTrainLength                    N
+  0018,0093  PercentSampling                    N
+  0018,0094  PercentPhaseFieldOfView            N
+  0018,0095  PixelBandwidth                     N
+  0018,1000  DeviceSerialNumber                 N
+  0018,1002  DeviceUID                          N
+  0018,1003  DeviceID                           N
+  0018,1004  PlateID                            N
+  0018,1005  GeneratorID                        N
+  0018,1006  GridID                             N
+  0018,1007  CassetteID                         N
+  0018,1008  GantryID                           N
+  0018,1010  SecondaryCaptureDeviceID           N
+  0018,1011  HardcopyCreationDeviceID           N
+  0018,1012  DateOfSecondaryCapture             N
+  0018,1014  TimeOfSecondaryCapture             N
+  0018,1016  SecondaryCaptureDeviceManufacturer N
+  0018,1017  HardcopyDeviceManufacturer         N
+  0018,1018  SecondaryCaptureDeviceModelName    N
+  0018,1019  SecondaryCaptureDeviceSoftwareVers N
+  0018,101A  HardcopyDeviceSoftwareVersion      N
+  0018,101B  HardcopyDeviceModelName            N
+  0018,1020  SoftwareVersion                    N
+  0018,1022  VideoImageFormatAcquired           N
+  0018,1023  DigitalImageFormatAcquired         N
+  0018,1030  ProtocolName                       N
+  0018,1040  ContrastBolusRoute                 N
+  0018,1041  ContrastBolusVolume                N
+  0018,1042  ContrastBolusStartTime             N
+  0018,1043  ContrastBolusStopTime              N
+  0018,1044  ContrastBolusTotalDose             N
+  0018,1045  SyringeCounts                      N
+  0018,1046  ContrastFlowRate                   N
+  0018,1047  ContrastFlowDuration               N
+  0018,1048  ContrastBolusIngredient            N
+  0018,1049  ContrastBolusConcentration         N
+  0018,1050  SpatialResolution                  N
+  0018,1060  TriggerTime                        N
+  0018,1061  TriggerSourceOrType                N
+  0018,1062  NominalInterval                    N
+  0018,1063  FrameTime                          N
+  0018,1064  CardiacFramingType                 N
+  0018,1065  FrameTimeVector                    N
+  0018,1066  FrameDelay                         N
+  0018,1067  ImageTriggerDelay                  N
+  0018,1068  MultiplexGroupTimeOffset           N
+  0018,1069  TriggerTimeOffset                  N
+  0018,106A  SynchronizationTrigger             N
+  0018,106C  SynchronizationChannel             N
+  0018,106E  TriggerSamplePosition              N
+  0018,1070  RadiopharmaceuticalRoute           N
+  0018,1071  RadiopharmaceuticalVolume          N
+  0018,1072  RadiopharmaceuticalStartTime       N
+  0018,1073  RadiopharmaceuticalStopTime        N
+  0018,1074  RadionuclideTotalDose              N
+  0018,1075  RadionuclideHalfLife               N
+  0018,1076  RadionuclidePositronFraction       N
+  0018,1077  RadiopharmaceuticalSpecActivity    N
+  0018,1078  RadiopharmaceuticalStartDateTime   N
+  0018,1079  RadiopharmaceuticalStopDateTime    N
+  0018,1080  BeatRejectionFlag                  N
+  0018,1081  LowRRValue                         N
+  0018,1082  HighRRValue                        N
+  0018,1083  IntervalsAcquired                  N
+  0018,1084  IntervalsRejected                  N
+  0018,1085  PVCRejection                       N
+  0018,1086  SkipBeats                          N
+  0018,1088  HeartRate                          N
+  0018,1090  CardiacNumberOfImages              N
+  0018,1094  TriggerWindow                      N
+  0018,1100  ReconstructionDiameter             N
+  0018,1110  DistanceSourceToDetector           N
+  0018,1111  DistanceSourceToPatient            N
+  0018,1114  EstimatedRadiographicMagnification N
+  0018,1120  GantryDetectorTilt                 N
+  0018,1121  GantryDetectorSlew                 N
+  0018,1130  TableHeight                        N
+  0018,1131  TableTraverse                      N
+  0018,1134  TableMotion                        N
+  0018,1135  TableVerticalIncrement             N
+  0018,1136  TableLateralIncrement              N
+  0018,1137  TableLongitudinalIncrement         N
+  0018,1138  TableAngle                         N
+  0018,113A  TableType                          N
+  0018,1140  RotationDirection                  N
+  0018,1141  AngularPosition                    N
+  0018,1142  RadialPosition                     N
+  0018,1143  ScanArc                            N
+  0018,1144  AngularStep                        N
+  0018,1145  CenterOfRotationOffset             N
+  0018,1146  RotationOffset                     N
+  0018,1147  FieldOfViewShape                   N
+  0018,1149  FieldOfViewDimensions              N
+  0018,1150  ExposureTime                       N
+  0018,1151  XRayTubeCurrent                    N
+  0018,1152  Exposure                           N
+  0018,1153  ExposureInMicroAmpSec              N
+  0018,1154  AveragePulseWidth                  N
+  0018,1155  RadiationSetting                   N
+  0018,1156  RectificationType                  N
+  0018,115A  RadiationMode                      N
+  0018,115E  ImageAreaDoseProduct               N
+  0018,1160  FilterType                         N
+  0018,1161  TypeOfFilters                      N
+  0018,1162  IntensifierSize                    N
+  0018,1164  ImagerPixelSpacing                 N
+  0018,1166  Grid                               N
+  0018,1170  GeneratorPower                     N
+  0018,1180  CollimatorGridName                 N
+  0018,1181  CollimatorType                     N
+  0018,1182  FocalDistance                      N
+  0018,1183  XFocusCenter                       N
+  0018,1184  YFocusCenter                       N
+  0018,1190  FocalSpots                         N
+  0018,1191  AnodeTargetMaterial                N
+  0018,11A0  BodyPartThickness                  N
+  0018,11A2  CompressionForce                   N
+  0018,1200  DateOfLastCalibration              N
+  0018,1201  TimeOfLastCalibration              N
+  0018,1210  ConvolutionKernel                  N
+  0018,1240  UpperLowerPixelValues              N
+  0018,1242  ActualFrameDuration                N
+  0018,1243  CountRate                          N
+  0018,1244  PreferredPlaybackSequencing        N
+  0018,1250  ReceiveCoilName                    N
+  0018,1251  TransmitCoilName                   N
+  0018,1260  PlateType                          N
+  0018,1261  PhosphorType                       N
+  0018,1300  ScanVelocity                       N
+  0018,1301  WholeBodyTechnique                 N
+  0018,1302  ScanLength                         N
+  0018,1310  AcquisitionMatrix                  N
+  0018,1312  InPlanePhaseEncodingDirection      N
+  0018,1314  FlipAngle                          N
+  0018,1315  VariableFlipAngleFlag              N
+  0018,1316  SAR                                N
+  0018,1318  DB-Dt                              N
+  0018,1400  AcquisitionDeviceProcessingDescr   N
+  0018,1401  AcquisitionDeviceProcessingCode    N
+  0018,1402  CassetteOrientation                N
+  0018,1403  CassetteSize                       N
+  0018,1404  ExposuresOnPlate                   N
+  0018,1405  RelativeXRayExposure               N
+  0018,1450  ColumnAngulation                   N
+  0018,1460  TomoLayerHeight                    N
+  0018,1470  TomoAngle                          N
+  0018,1480  TomoTime                           N
+  0018,1490  TomoType                           N
+  0018,1491  TomoClass                          N
+  0018,1495  NumberOfTomosynthesisSourceImages  N
+  0018,1500  PositionerMotion                   N
+  0018,1508  PositionerType                     N
+  0018,1510  PositionerPrimaryAngle             N
+  0018,1511  PositionerSecondaryAngle           N
+  0018,1520  PositionerPrimaryAngleIncrement    N
+  0018,1521  PositionerSecondaryAngleIncrement  N
+  0018,1530  DetectorPrimaryAngle               N
+  0018,1531  DetectorSecondaryAngle             N
+  0018,1600  ShutterShape                       N
+  0018,1602  ShutterLeftVerticalEdge            N
+  0018,1604  ShutterRightVerticalEdge           N
+  0018,1606  ShutterUpperHorizontalEdge         N
+  0018,1608  ShutterLowerHorizontalEdge         N
+  0018,1610  CenterOfCircularShutter            N
+  0018,1612  RadiusOfCircularShutter            N
+  0018,1620  VerticesOfPolygonalShutter         N
+  0018,1622  ShutterPresentationValue           N
+  0018,1623  ShutterOverlayGroup                N
+  0018,1624  ShutterPresentationColorCIELabVal  N
+  0018,1700  CollimatorShape                    N
+  0018,1702  CollimatorLeftVerticalEdge         N
+  0018,1704  CollimatorRightVerticalEdge        N
+  0018,1706  CollimatorUpperHorizontalEdge      N
+  0018,1708  CollimatorLowerHorizontalEdge      N
+  0018,1710  CenterOfCircularCollimator         N
+  0018,1712  RadiusOfCircularCollimator         N
+  0018,1720  VerticesOfPolygonalCollimator      N
+  0018,1800  AcquisitionTimeSynchronized        N
+  0018,1801  TimeSource                         N
+  0018,1802  TimeDistributionProtocol           N
+  0018,1803  NTPSourceAddress                   N
+  0018,2001  PageNumberVector                   N
+  0018,2002  FrameLabelVector                   N
+  0018,2003  FramePrimaryAngleVector            N
+  0018,2004  FrameSecondaryAngleVector          N
+  0018,2005  SliceLocationVector                N
+  0018,2006  DisplayWindowLabelVector           N
+  0018,2010  NominalScannedPixelSpacing         N
+  0018,2020  DigitizingDeviceTransportDirection N
+  0018,2030  RotationOfScannedFilm              N
+  0018,3100  IVUSAcquisition                    N
+  0018,3101  IVUSPullbackRate                   N
+  0018,3102  IVUSGatedRate                      N
+  0018,3103  IVUSPullbackStartFrameNumber       N
+  0018,3104  IVUSPullbackStopFrameNumber        N
+  0018,3105  LesionNumber                       N
+  0018,4000  AcquisitionComments                N
+  0018,5000  OutputPower                        N
+  0018,5010  TransducerData                     N
+  0018,5012  FocusDepth                         N
+  0018,5020  ProcessingFunction                 N
+  0018,5021  PostprocessingFunction             N
+  0018,5022  MechanicalIndex                    N
+  0018,5024  BoneThermalIndex                   N
+  0018,5026  CranialThermalIndex                N
+  0018,5027  SoftTissueThermalIndex             N
+  0018,5028  SoftTissueFocusThermalIndex        N
+  0018,5029  SoftTissueSurfaceThermalIndex      N
+  0018,5030  DynamicRange                       N
+  0018,5040  TotalGain                          N
+  0018,5050  DepthOfScanField                   N
+  0018,5100  PatientPosition                    N
+  0018,5101  ViewPosition                       N
+  0018,5104  ProjectionEponymousNameCodeSeq     N
+  0018,5210  ImageTransformationMatrix          N
+  0018,5212  ImageTranslationVector             N
+  0018,6000  Sensitivity                        N
+  0018,6011  SequenceOfUltrasoundRegions        N
+  0018,6012  RegionSpatialFormat                N
+  0018,6014  RegionDataType                     N
+  0018,6016  RegionFlags                        N
+  0018,6018  RegionLocationMinX0                N
+  0018,601A  RegionLocationMinY0                N
+  0018,601C  RegionLocationMaxX1                N
+  0018,601E  RegionLocationMaxY1                N
+  0018,6020  ReferencePixelX0                   N
+  0018,6022  ReferencePixelY0                   N
+  0018,6024  PhysicalUnitsXDirection            N
+  0018,6026  PhysicalUnitsYDirection            N
+  0018,6028  ReferencePixelPhysicalValueX       N
+  0018,602A  ReferencePixelPhysicalValueY       N
+  0018,602C  PhysicalDeltaX                     N
+  0018,602E  PhysicalDeltaY                     N
+  0018,6030  TransducerFrequency                N
+  0018,6031  TransducerType                     N
+  0018,6032  PulseRepetitionFrequency           N
+  0018,6034  DopplerCorrectionAngle             N
+  0018,6036  SteeringAngle                      N
+  0018,6038  DopplerSampleVolumeXPosRetired     N
+  0018,6039  DopplerSampleVolumeXPosition       N
+  0018,603A  DopplerSampleVolumeYPosRetired     N
+  0018,603B  DopplerSampleVolumeYPosition       N
+  0018,603C  TMLinePositionX0Retired            N
+  0018,603D  TMLinePositionX0                   N
+  0018,603E  TMLinePositionY0Retired            N
+  0018,603F  TMLinePositionY0                   N
+  0018,6040  TMLinePositionX1Retired            N
+  0018,6041  TMLinePositionX1                   N
+  0018,6042  TMLinePositionY1Retired            N
+  0018,6043  TMLinePositionY1                   N
+  0018,6044  PixelComponentOrganization         N
+  0018,6046  PixelComponentMask                 N
+  0018,6048  PixelComponentRangeStart           N
+  0018,604A  PixelComponentRangeStop            N
+  0018,604C  PixelComponentPhysicalUnits        N
+  0018,604E  PixelComponentDataType             N
+  0018,6050  NumberOfTableBreakPoints           N
+  0018,6052  TableOfXBreakPoints                N
+  0018,6054  TableOfYBreakPoints                N
+  0018,6056  NumberOfTableEntries               N
+  0018,6058  TableOfPixelValues                 N
+  0018,605A  TableOfParameterValues             N
+  0018,6060  RWaveTimeVector                    N
+  0018,7000  DetectorConditionsNominalFlag      N
+  0018,7001  DetectorTemperature                N
+  0018,7004  DetectorType                       N
+  0018,7005  DetectorConfiguration              N
+  0018,7006  DetectorDescription                N
+  0018,7008  DetectorMode                       N
+  0018,700A  DetectorID                         N
+  0018,700C  DateOfLastDetectorCalibration      N
+  0018,700E  TimeOfLastDetectorCalibration      N
+  0018,7010  DetectorExposuresSinceCalibration  N
+  0018,7011  DetectorExposuresSinceManufactured N
+  0018,7012  DetectorTimeSinceLastExposure      N
+  0018,7014  DetectorActiveTime                 N
+  0018,7016  DetectorActiveOffsetFromExposure   N
+  0018,701A  DetectorBinning                    N
+  0018,7020  DetectorElementPhysicalSize        N
+  0018,7022  DetectorElementSpacing             N
+  0018,7024  DetectorActiveShape                N
+  0018,7026  DetectorActiveDimensions           N
+  0018,7028  DetectorActiveOrigin               N
+  0018,702A  DetectorManufacturerName           N
+  0018,702B  DetectorManufacturersModelName     N
+  0018,7030  FieldOfViewOrigin                  N
+  0018,7032  FieldOfViewRotation                N
+  0018,7034  FieldOfViewHorizontalFlip          N
+  0018,7040  GridAbsorbingMaterial              N
+  0018,7041  GridSpacingMaterial                N
+  0018,7042  GridThickness                      N
+  0018,7044  GridPitch                          N
+  0018,7046  GridAspectRatio                    N
+  0018,7048  GridPeriod                         N
+  0018,704C  GridFocalDistance                  N
+  0018,7050  FilterMaterial                     N
+  0018,7052  FilterThicknessMinimum             N
+  0018,7054  FilterThicknessMaximum             N
+  0018,7060  ExposureControlMode                N
+  0018,7062  ExposureControlModeDescription     N
+  0018,7064  ExposureStatus                     N
+  0018,7065  PhototimerSetting                  N
+  0018,8150  ExposureTimeInMicroSec             N
+  0018,8151  XRayTubeCurrentInMicroAmps         N
+  0018,9004  ContentQualification               N
+  0018,9005  PulseSequenceName                  N
+  0018,9006  MRImagingModifierSequence          N
+  0018,9008  EchoPulseSequence                  N
+  0018,9009  InversionRecovery                  N
+  0018,9010  FlowCompensation                   N
+  0018,9011  MultipleSpinEcho                   N
+  0018,9012  MultiPlanarExcitation              N
+  0018,9014  PhaseContrast                      N
+  0018,9015  TimeOfFlightContrast               N
+  0018,9016  Spoiling                           N
+  0018,9017  SteadyStatePulseSequence           N
+  0018,9018  EchoPlanarPulseSequence            N
+  0018,9019  TagAngleFirstAxis                  N
+  0018,9020  MagnetizationTransfer              N
+  0018,9021  T2Preparation                      N
+  0018,9022  BloodSignalNulling                 N
+  0018,9024  SaturationRecovery                 N
+  0018,9025  SpectrallySelectedSuppression      N
+  0018,9026  SpectrallySelectedExcitation       N
+  0018,9027  SpatialPresaturation               N
+  0018,9028  Tagging                            N
+  0018,9029  OversamplingPhase                  N
+  0018,9030  TagSpacingFirstDimension           N
+  0018,9032  GeometryOfKSpaceTraversal          N
+  0018,9033  SegmentedKSpaceTraversal           N
+  0018,9034  RectilinearPhaseEncodeReordering   N
+  0018,9035  TagThickness                       N
+  0018,9036  PartialFourierDirection            N
+  0018,9037  CardiacSynchronizationTechnique    N
+  0018,9041  ReceiveCoilManufacturerName        N
+  0018,9042  MRReceiveCoilSequence              N
+  0018,9043  ReceiveCoilType                    N
+  0018,9044  QuadratureReceiveCoil              N
+  0018,9045  MultiCoilDefinitionSequence        N
+  0018,9046  MultiCoilConfiguration             N
+  0018,9047  MultiCoilElementName               N
+  0018,9048  MultiCoilElementUsed               N
+  0018,9049  MRTransmitCoilSequence             N
+  0018,9050  TransmitCoilManufacturerName       N
+  0018,9051  TransmitCoilType                   N
+  0018,9052  SpectralWidth                      N
+  0018,9053  ChemicalShiftReference             N
+  0018,9054  VolumeLocalizationTechnique        N
+  0018,9058  MRAcquisitionFrequencyEncodeSteps  N
+  0018,9059  Decoupling                         N
+  0018,9060  DecoupledNucleus                   N
+  0018,9061  DecouplingFrequency                N
+  0018,9062  DecouplingMethod                   N
+  0018,9063  DecouplingChemicalShiftReference   N
+  0018,9064  KSpaceFiltering                    N
+  0018,9065  TimeDomainFiltering                N
+  0018,9066  NumberOfZeroFills                  N
+  0018,9067  BaselineCorrection                 N
+  0018,9069  ParallelReductionFactorInPlane     N
+  0018,9070  CardiacRRIntervalSpecified         N
+  0018,9073  AcquisitionDuration                N
+  0018,9074  FrameAcquisitionDateTime           N
+  0018,9075  DiffusionDirectionality            N
+  0018,9076  DiffusionGradientDirectionSequence N
+  0018,9077  ParallelAcquisition                N
+  0018,9078  ParallelAcquisitionTechnique       N
+  0018,9079  InversionTimes                     N
+  0018,9080  MetaboliteMapDescription           N
+  0018,9081  PartialFourier                     N
+  0018,9082  EffectiveEchoTime                  N
+  0018,9083  MetaboliteMapCodeSequence          N
+  0018,9084  ChemicalShiftSequence              N
+  0018,9085  CardiacSignalSource                N
+  0018,9087  DiffusionBValue                    N
+  0018,9089  DiffusionGradientOrientation       N
+  0018,9090  VelocityEncodingDirection          N
+  0018,9091  VelocityEncodingMinimumValue       N
+  0018,9093  NumberOfKSpaceTrajectories         N
+  0018,9094  CoverageOfKSpace                   N
+  0018,9095  SpectroscopyAcquisitionPhaseRows   N
+  0018,9096  ParallelReductFactorInPlaneRetired N
+  0018,9098  TransmitterFrequency               N
+  0018,9100  ResonantNucleus                    N
+  0018,9101  FrequencyCorrection                N
+  0018,9103  MRSpectroscopyFOV-GeometrySequence N
+  0018,9104  SlabThickness                      N
+  0018,9105  SlabOrientation                    N
+  0018,9106  MidSlabPosition                    N
+  0018,9107  MRSpatialSaturationSequence        N
+  0018,9112  MRTimingAndRelatedParametersSeq    N
+  0018,9114  MREchoSequence                     N
+  0018,9115  MRModifierSequence                 N
+  0018,9117  MRDiffusionSequence                N
+  0018,9118  CardiacTriggerSequence             N
+  0018,9119  MRAveragesSequence                 N
+  0018,9125  MRFOV-GeometrySequence             N
+  0018,9126  VolumeLocalizationSequence         N
+  0018,9127  SpectroscopyAcquisitionDataColumns N
+  0018,9147  DiffusionAnisotropyType            N
+  0018,9151  FrameReferenceDateTime             N
+  0018,9152  MRMetaboliteMapSequence            N
+  0018,9155  ParallelReductionFactorOutOfPlane  N
+  0018,9159  SpectroscopyOutOfPlanePhaseSteps   N
+  0018,9166  BulkMotionStatus                   N
+  0018,9168  ParallelReductionFactSecondInPlane N
+  0018,9169  CardiacBeatRejectionTechnique      N
+  0018,9170  RespiratoryMotionCompTechnique     N
+  0018,9171  RespiratorySignalSource            N
+  0018,9172  BulkMotionCompensationTechnique    N
+  0018,9173  BulkMotionSignalSource             N
+  0018,9174  ApplicableSafetyStandardAgency     N
+  0018,9175  ApplicableSafetyStandardDescr      N
+  0018,9176  OperatingModeSequence              N
+  0018,9177  OperatingModeType                  N
+  0018,9178  OperatingMode                      N
+  0018,9179  SpecificAbsorptionRateDefinition   N
+  0018,9180  GradientOutputType                 N
+  0018,9181  SpecificAbsorptionRateValue        N
+  0018,9182  GradientOutput                     N
+  0018,9183  FlowCompensationDirection          N
+  0018,9184  TaggingDelay                       N
+  0018,9185  RespiratoryMotionCompTechDescr     N
+  0018,9186  RespiratorySignalSourceID          N
+  0018,9195  ChemicalShiftsMinIntegrateLimitHz  N
+  0018,9196  ChemicalShiftsMaxIntegrateLimitHz  N
+  0018,9197  MRVelocityEncodingSequence         N
+  0018,9198  FirstOrderPhaseCorrection          N
+  0018,9199  WaterReferencedPhaseCorrection     N
+  0018,9200  MRSpectroscopyAcquisitionType      N
+  0018,9214  RespiratoryCyclePosition           N
+  0018,9217  VelocityEncodingMaximumValue       N
+  0018,9218  TagSpacingSecondDimension          N
+  0018,9219  TagAngleSecondAxis                 N
+  0018,9220  FrameAcquisitionDuration           N
+  0018,9226  MRImageFrameTypeSequence           N
+  0018,9227  MRSpectroscopyFrameTypeSequence    N
+  0018,9231  MRAcqPhaseEncodingStepsInPlane     N
+  0018,9232  MRAcqPhaseEncodingStepsOutOfPlane  N
+  0018,9234  SpectroscopyAcqPhaseColumns        N
+  0018,9236  CardiacCyclePosition               N
+  0018,9239  SpecificAbsorptionRateSequence     N
+  0018,9240  RFEchoTrainLength                  N
+  0018,9241  GradientEchoTrainLength            N
+  0018,9295  ChemicalShiftsMinIntegrateLimitPPM N
+  0018,9296  ChemicalShiftsMaxIntegrateLimitPPM N
+  0018,9301  CTAcquisitionTypeSequence          N
+  0018,9302  AcquisitionType                    N
+  0018,9303  TubeAngle                          N
+  0018,9304  CTAcquisitionDetailsSequence       N
+  0018,9305  RevolutionTime                     N
+  0018,9306  SingleCollimationWidth             N
+  0018,9307  TotalCollimationWidth              N
+  0018,9308  CTTableDynamicsSequence            N
+  0018,9309  TableSpeed                         N
+  0018,9310  TableFeedPerRotation               N
+  0018,9311  SpiralPitchFactor                  N
+  0018,9312  CTGeometrySequence                 N
+  0018,9313  DataCollectionCenterPatient        N
+  0018,9314  CTReconstructionSequence           N
+  0018,9315  ReconstructionAlgorithm            N
+  0018,9316  ConvolutionKernelGroup             N
+  0018,9317  ReconstructionFieldOfView          N
+  0018,9318  ReconstructionTargetCenterPatient  N
+  0018,9319  ReconstructionAngle                N
+  0018,9320  ImageFilter                        N
+  0018,9321  CTExposureSequence                 N
+  0018,9322  ReconstructionPixelSpacing         N
+  0018,9323  ExposureModulationType             N
+  0018,9324  EstimatedDoseSaving                N
+  0018,9325  CTXRayDetailsSequence              N
+  0018,9326  CTPositionSequence                 N
+  0018,9327  TablePosition                      N
+  0018,9328  ExposureTimeInMilliSec             N
+  0018,9329  CTImageFrameTypeSequence           N
+  0018,9330  XRayTubeCurrentInMilliAmps         N
+  0018,9332  ExposureInMilliAmpSec              N
+  0018,9333  ConstantVolumeFlag                 N
+  0018,9334  FluoroscopyFlag                    N
+  0018,9335  SourceToDataCollectionCenterDist   N
+  0018,9337  ContrastBolusAgentNumber           N
+  0018,9338  ContrastBolusIngredientCodeSeq     N
+  0018,9340  ContrastAdministrationProfileSeq   N
+  0018,9341  ContrastBolusUsageSequence         N
+  0018,9342  ContrastBolusAgentAdministered     N
+  0018,9343  ContrastBolusAgentDetected         N
+  0018,9344  ContrastBolusAgentPhase            N
+  0018,9345  CTDIvol                            N
+  0018,9346  CTDIPhantomTypeCodeSequence        N
+  0018,9351  CalciumScoringMassFactorPatient    N
+  0018,9352  CalciumScoringMassFactorDevice     N
+  0018,9353  EnergyWeightingFactor              N
+  0018,9360  CTAdditionalXRaySourceSequence     N
+  0018,9401  ProjectionPixelCalibrationSequence N
+  0018,9402  DistanceSourceToIsocenter          N
+  0018,9403  DistanceObjectToTableTop           N
+  0018,9404  ObjectPixelSpacingInCenterOfBeam   N
+  0018,9405  PositionerPositionSequence         N
+  0018,9406  TablePositionSequence              N
+  0018,9407  CollimatorShapeSequence            N
+  0018,9412  XA-XRFFrameCharacteristicsSequence N
+  0018,9417  FrameAcquisitionSequence           N
+  0018,9420  XRayReceptorType                   N
+  0018,9423  AcquisitionProtocolName            N
+  0018,9424  AcquisitionProtocolDescription     N
+  0018,9425  ContrastBolusIngredientOpaque      N
+  0018,9426  DistanceReceptorPlaneToDetHousing  N
+  0018,9427  IntensifierActiveShape             N
+  0018,9428  IntensifierActiveDimensions        N
+  0018,9429  PhysicalDetectorSize               N
+  0018,9430  PositionOfIsocenterProjection      N
+  0018,9432  FieldOfViewSequence                N
+  0018,9433  FieldOfViewDescription             N
+  0018,9434  ExposureControlSensingRegionsSeq   N
+  0018,9435  ExposureControlSensingRegionShape  N
+  0018,9436  ExposureControlSensRegionLeftEdge  N
+  0018,9437  ExposureControlSensRegionRightEdge N
+  0018,9440  CenterOfCircExposControlSensRegion N
+  0018,9441  RadiusOfCircExposControlSensRegion N
+  0018,9447  ColumnAngulationPatient            N
+  0018,9449  BeamAngle                          N
+  0018,9451  FrameDetectorParametersSequence    N
+  0018,9452  CalculatedAnatomyThickness         N
+  0018,9455  CalibrationSequence                N
+  0018,9456  ObjectThicknessSequence            N
+  0018,9457  PlaneIdentification                N
+  0018,9461  FieldOfViewDimensionsInFloat       N
+  0018,9462  IsocenterReferenceSystemSequence   N
+  0018,9463  PositionerIsocenterPrimaryAngle    N
+  0018,9464  PositionerIsocenterSecondaryAngle  N
+  0018,9465  PositionerIsocenterDetRotAngle     N
+  0018,9466  TableXPositionToIsocenter          N
+  0018,9467  TableYPositionToIsocenter          N
+  0018,9468  TableZPositionToIsocenter          N
+  0018,9469  TableHorizontalRotationAngle       N
+  0018,9470  TableHeadTiltAngle                 N
+  0018,9471  TableCradleTiltAngle               N
+  0018,9472  FrameDisplayShutterSequence        N
+  0018,9473  AcquiredImageAreaDoseProduct       N
+  0018,9474  CArmPositionerTabletopRelationship N
+  0018,9476  XRayGeometrySequence               N
+  0018,9477  IrradiationEventIDSequence         N
+  0018,9504  XRay3DFrameTypeSequence            N
+  0018,9506  ContributingSourcesSequence        N
+  0018,9507  XRay3DAcquisitionSequence          N
+  0018,9508  PrimaryPositionerScanArc           N
+  0018,9509  SecondaryPositionerScanArc         N
+  0018,9510  PrimaryPositionerScanStartAngle    N
+  0018,9511  SecondaryPositionerScanStartAngle  N
+  0018,9514  PrimaryPositionerIncrement         N
+  0018,9515  SecondaryPositionerIncrement       N
+  0018,9516  StartAcquisitionDateTime           N
+  0018,9517  EndAcquisitionDateTime             N
+  0018,9524  ApplicationName                    N
+  0018,9525  ApplicationVersion                 N
+  0018,9526  ApplicationManufacturer            N
+  0018,9527  AlgorithmType                      N
+  0018,9528  AlgorithmDescription               N
+  0018,9530  XRay3DReconstructionSequence       N
+  0018,9531  ReconstructionDescription          N
+  0018,9538  PerProjectionAcquisitionSequence   N
+  0018,9601  DiffusionBMatrixSequence           N
+  0018,9602  DiffusionBValueXX                  N
+  0018,9603  DiffusionBValueXY                  N
+  0018,9604  DiffusionBValueXZ                  N
+  0018,9605  DiffusionBValueYY                  N
+  0018,9606  DiffusionBValueYZ                  N
+  0018,9607  DiffusionBValueZZ                  N
+  0018,9701  DecayCorrectionDateTime            N
+  0018,9715  StartDensityThreshold              N
+  0018,9722  TerminationTimeThreshold           N
+  0018,9725  DetectorGeometry                   N
+  0018,9727  AxialDetectorDimension             N
+  0018,9735  PETPositionSequence                N
+  0018,9739  NumberOfIterations                 N
+  0018,9740  NumberOfSubsets                    N
+  0018,9751  PETFrameTypeSequence               N
+  0018,9756  ReconstructionType                 N
+  0018,9758  DecayCorrected                     N
+  0018,9759  AttenuationCorrected               N
+  0018,9760  ScatterCorrected                   N
+  0018,9761  DeadTimeCorrected                  N
+  0018,9762  GantryMotionCorrected              N
+  0018,9763  PatientMotionCorrected             N
+  0018,9765  RandomsCorrected                   N
+  0018,9767  SensitivityCalibrated              N
+  0018,9801  DepthsOfFocus                      N
+  0018,9804  ExclusionStartDatetime             N
+  0018,9805  ExclusionDuration                  N
+  0018,9807  ImageDataTypeSequence              N
+  0018,9808  DataType                           N
+  0018,980B  AliasedDataType                    N
+  0018,A001  ContributingEquipmentSequence      N
+  0018,A002  ContributionDateTime               N
+  0018,A003  ContributionDescription            N
+  0019,1002  NumberOfCellsIInDetector           N
+  0019,1003  CellNumberAtTheta                  N
+  0019,1004  CellSpacing                        N
+  0019,100F  HorizFrameOfRef                    N
+  0019,1011  SeriesContrast                     N
+  0019,1012  LastPseq                           N
+  0019,1013  StartNumberForBaseline             N
+  0019,1014  EndNumberForBaseline               N
+  0019,1015  StartNumberForEnhancedScans        N
+  0019,1016  EndNumberForEnhancedScans          N
+  0019,1017  SeriesPlane                        N
+  0019,1018  FirstScanRas                       N
+  0019,1019  FirstScanLocation                  N
+  0019,101A  LastScanRas                        N
+  0019,101B  LastScanLoc                        N
+  0019,101E  DisplayFieldOfView                 N
+  0019,1023  TableSpeed                         N
+  0019,1024  MidScanTime                        N
+  0019,1025  MidScanFlag                        N
+  0019,1026  DegreesOfAzimuth                   N
+  0019,1027  GantryPeriod                       N
+  0019,102A  XRayOnPosition                     N
+  0019,102B  XRayOffPosition                    N
+  0019,102C  NumberOfTriggers                   N
+  0019,102E  AngleOfFirstView                   N
+  0019,102F  TriggerFrequency                   N
+  0019,1039  ScanFOVType                        N
+  0019,1040  StatReconFlag                      N
+  0019,1041  ComputeType                        N
+  0019,1042  SegmentNumber                      N
+  0019,1043  TotalSegmentsRequested             N
+  0019,1044  InterscanDelay                     N
+  0019,1047  ViewCompressionFactor              N
+  0019,104A  TotalNoOfRefChannels               N
+  0019,104B  DataSizeForScanData                N
+  0019,1052  ReconPostProcflag                  N
+  0019,1057  CTWaterNumber                      N
+  0019,1058  CTBoneNumber                       N
+  0019,105A  AcquisitionDuration                N
+  0019,105E  NumberOfChannels                   N
+  0019,105F  IncrementBetweenChannels           N
+  0019,1060  StartingView                       N
+  0019,1061  NumberOfViews                      N
+  0019,1062  IncrementBetweenViews              N
+  0019,106A  DependantOnNoViewsProcessed        N
+  0019,106B  FieldOfViewInDetectorCells         N
+  0019,1070  ValueOfBackProjectionButton        N
+  0019,1071  SetIfFatqEstimatesWereUsed         N
+  0019,1072  ZChanAvgOverViews                  N
+  0019,1073  AvgOfLeftRefChansOverViews         N
+  0019,1074  MaxLeftChanOverViews               N
+  0019,1075  AvgOfRightRefChansOverViews        N
+  0019,1076  MaxRightChanOverViews              N
+  0019,107D  SecondEcho                         N
+  0019,107E  NumberOfEchoes                     N
+  0019,107F  TableDelta                         N
+  0019,1081  Contiguous                         N
+  0019,1084  PeakSAR                            N
+  0019,1085  MonitorSAR                         N
+  0019,1087  CardiacRepetitionTime              N
+  0019,1088  ImagesPerCardiacCycle              N
+  0019,108A  ActualReceiveGainAnalog            N
+  0019,108B  ActualReceiveGainDigital           N
+  0019,108D  DelayAfterTrigger                  N
+  0019,108F  Swappf                             N
+  0019,1090  PauseInterval                      N
+  0019,1091  PulseTime                          N
+  0019,1092  SliceOffsetOnFreqAxis              N
+  0019,1093  CenterFrequency                    N
+  0019,1094  TransmitGain                       N
+  0019,1095  AnalogReceiverGain                 N
+  0019,1096  DigitalReceiverGain                N
+  0019,1097  BitmapDefiningCVs                  N
+  0019,1098  CenterFreqMethod                   N
+  0019,109B  PulseSeqMode                       N
+  0019,109C  PulseSeqName                       N
+  0019,109D  PulseSeqDate                       N
+  0019,109E  InternalPulseSeqName               N
+  0019,109F  TransmittingCoil                   N
+  0019,10A0  SurfaceCoilType                    N
+  0019,10A1  ExtremityCoilFlag                  N
+  0019,10A2  RawDataRunNumber                   N
+  0019,10A3  CalibratedFieldStrength            N
+  0019,10A4  SATFatWaterBone                    N
+  0019,10A5  ReceiveBandwidth                   N
+  0019,10A7  UserData01                         N
+  0019,10A8  UserData02                         N
+  0019,10A9  UserData03                         N
+  0019,10AA  UserData04                         N
+  0019,10AB  UserData05                         N
+  0019,10AC  UserData06                         N
+  0019,10AD  UserData07                         N
+  0019,10AE  UserData08                         N
+  0019,10AF  UserData09                         N
+  0019,10B0  UserData10                         N
+  0019,10B1  UserData11                         N
+  0019,10B2  UserData12                         N
+  0019,10B3  UserData13                         N
+  0019,10B4  UserData14                         N
+  0019,10B5  UserData15                         N
+  0019,10B6  UserData16                         N
+  0019,10B7  UserData17                         N
+  0019,10B8  UserData18                         N
+  0019,10B9  UserData19                         N
+  0019,10BA  UserData20                         N
+  0019,10BB  UserData21                         N
+  0019,10BC  UserData22                         N
+  0019,10BD  UserData23                         N
+  0019,10BE  ProjectionAngle                    N
+  0019,10C0  SaturationPlanes                   N
+  0019,10C1  SurfaceCoilIntensity               N
+  0019,10C2  SATLocationR                       N
+  0019,10C3  SATLocationL                       N
+  0019,10C4  SATLocationA                       N
+  0019,10C5  SATLocationP                       N
+  0019,10C6  SATLocationH                       N
+  0019,10C7  SATLocationF                       N
+  0019,10C8  SATThicknessR-L                    N
+  0019,10C9  SATThicknessA-P                    N
+  0019,10CA  SATThicknessH-F                    N
+  0019,10CB  PrescribedFlowAxis                 N
+  0019,10CC  VelocityEncoding                   N
+  0019,10CD  ThicknessDisclaimer                N
+  0019,10CE  PrescanType                        N
+  0019,10CF  PrescanStatus                      N
+  0019,10D0  RawDataType                        N
+  0019,10D2  ProjectionAlgorithm                N
+  0019,10D3  ProjectionAlgorithm                N
+  0019,10D5  FractionalEcho                     N
+  0019,10D6  PrepPulse                          N
+  0019,10D7  CardiacPhases                      N
+  0019,10D8  VariableEchoflag                   N
+  0019,10D9  ConcatenatedSAT                    N
+  0019,10DA  ReferenceChannelUsed               N
+  0019,10DB  BackProjectorCoefficient           N
+  0019,10DC  PrimarySpeedCorrectionUsed         N
+  0019,10DD  OverrangeCorrectionUsed            N
+  0019,10DE  DynamicZAlphaValue                 N
+  0019,10DF  UserData                           N
+  0019,10E0  UserData                           N
+  0019,10E2  VelocityEncodeScale                N
+  0019,10F2  FastPhases                         N
+  0019,10F9  TransmissionGain                   N
+  0020,0000  RelationshipGroupLength            N
+  0020,000D  StudyInstanceUID                   N
+  0020,000E  SeriesInstanceUID                  N
+  0020,0010  StudyID                            N
+  0020,0011  SeriesNumber                       N
+  0020,0012  AcquisitionNumber                  N
+  0020,0013  InstanceNumber                     N
+  0020,0014  IsotopeNumber                      N
+  0020,0015  PhaseNumber                        N
+  0020,0016  IntervalNumber                     N
+  0020,0017  TimeSlotNumber                     N
+  0020,0018  AngleNumber                        N
+  0020,0019  ItemNumber                         N
+  0020,0020  PatientOrientation                 N
+  0020,0022  OverlayNumber                      N
+  0020,0024  CurveNumber                        N
+  0020,0026  LookupTableNumber                  N
+  0020,0030  ImagePosition                      N
+  0020,0032  ImagePositionPatient               N
+  0020,0035  ImageOrientation                   N
+  0020,0037  ImageOrientationPatient            N
+  0020,0050  Location                           N
+  0020,0052  FrameOfReferenceUID                N
+  0020,0060  Laterality                         N
+  0020,0062  ImageLaterality                    N
+  0020,0070  ImageGeometryType                  N
+  0020,0080  MaskingImage                       N
+  0020,0100  TemporalPositionIdentifier         N
+  0020,0105  NumberOfTemporalPositions          N
+  0020,0110  TemporalResolution                 N
+  0020,0200  SynchronizationFrameOfReferenceUID N
+  0020,1000  SeriesInStudy                      N
+  0020,1001  AcquisitionsInSeries               N
+  0020,1002  ImagesInAcquisition                N
+  0020,1003  ImagesInSeries                     N
+  0020,1004  AcquisitionsInStudy                N
+  0020,1005  ImagesInStudy                      N
+  0020,1020  Reference                          N
+  0020,1040  PositionReferenceIndicator         N
+  0020,1041  SliceLocation                      N
+  0020,1070  OtherStudyNumbers                  N
+  0020,1200  NumberOfPatientRelatedStudies      N
+  0020,1202  NumberOfPatientRelatedSeries       N
+  0020,1204  NumberOfPatientRelatedInstances    N
+  0020,1206  NumberOfStudyRelatedSeries         N
+  0020,1208  NumberOfStudyRelatedInstances      N
+  0020,1209  NumberOfSeriesRelatedInstances     N
+  0020,31xx  SourceImageIDs                     N
+  0020,3401  ModifyingDeviceID                  N
+  0020,3402  ModifiedImageID                    N
+  0020,3403  ModifiedImageDate                  N
+  0020,3404  ModifyingDeviceManufacturer        N
+  0020,3405  ModifiedImageTime                  N
+  0020,3406  ModifiedImageDescription           N
+  0020,4000  ImageComments                      N
+  0020,5000  OriginalImageIdentification        N
+  0020,5002  OriginalImageIdentNomenclature     N
+  0020,9056  StackID                            N
+  0020,9057  InStackPositionNumber              N
+  0020,9071  FrameAnatomySequence               N
+  0020,9072  FrameLaterality                    N
+  0020,9111  FrameContentSequence               N
+  0020,9113  PlanePositionSequence              N
+  0020,9116  PlaneOrientationSequence           N
+  0020,9128  TemporalPositionIndex              N
+  0020,9153  TriggerDelayTime                   N
+  0020,9156  FrameAcquisitionNumber             N
+  0020,9157  DimensionIndexValues               N
+  0020,9158  FrameComments                      N
+  0020,9161  ConcatenationUID                   N
+  0020,9162  InConcatenationNumber              N
+  0020,9163  InConcatenationTotalNumber         N
+  0020,9164  DimensionOrganizationUID           N
+  0020,9165  DimensionIndexPointer              N
+  0020,9167  FunctionalGroupPointer             N
+  0020,9213  DimensionIndexPrivateCreator       N
+  0020,9221  DimensionOrganizationSequence      N
+  0020,9222  DimensionIndexSequence             N
+  0020,9228  ConcatenationFrameOffsetNumber     N
+  0020,9238  FunctionalGroupPrivateCreator      N
+  0020,9241  NominalPercentageOfCardiacPhase    N
+  0020,9245  NominalPercentOfRespiratoryPhase   N
+  0020,9246  StartingRespiratoryAmplitude       N
+  0020,9247  StartingRespiratoryPhase           N
+  0020,9248  EndingRespiratoryAmplitude         N
+  0020,9249  EndingRespiratoryPhase             N
+  0020,9250  RespiratoryTriggerType             N
+  0020,9251  RRIntervalTimeNominal              N
+  0020,9252  ActualCardiacTriggerDelayTime      N
+  0020,9253  RespiratorySynchronizationSequence N
+  0020,9254  RespiratoryIntervalTime            N
+  0020,9255  NominalRespiratoryTriggerDelayTime N
+  0020,9256  RespiratoryTriggerDelayThreshold   N
+  0020,9257  ActualRespiratoryTriggerDelayTime  N
+  0020,9301  ImagePositionVolume                N
+  0020,9302  ImageOrientationVolume             N
+  0020,9308  ApexPosition                       N
+  0020,9421  DimensionDescriptionLabel          N
+  0020,9450  PatientOrientationInFrameSequence  N
+  0020,9453  FrameLabel                         N
+  0020,9518  AcquisitionIndex                   N
+  0020,9529  ContributingSOPInstancesRefSeq     N
+  0020,9536  ReconstructionIndex                N
+  0021,1003  SeriesFromWhichPrescribed          N
+  0021,1005  GenesisVersionNow                  N
+  0021,1007  SeriesRecordChecksum               N
+  0021,1018  GenesisVersionNow                  N
+  0021,1019  AcqreconRecordChecksum             N
+  0021,1020  TableStartLocation                 N
+  0021,1035  SeriesFromWhichPrescribed          N
+  0021,1036  ImageFromWhichPrescribed           N
+  0021,1037  ScreenFormat                       N
+  0021,104A  AnatomicalReferenceForScout        N
+  0021,104F  LocationsInAcquisition             N
+  0021,1050  GraphicallyPrescribed              N
+  0021,1051  RotationFromSourceXRot             N
+  0021,1052  RotationFromSourceYRot             N
+  0021,1053  RotationFromSourceZRot             N
+  0021,1054  ImagePosition                      N
+  0021,1055  ImageOrientation                   N
+  0021,1056  IntegerSlop                        N
+  0021,1057  IntegerSlop                        N
+  0021,1058  IntegerSlop                        N
+  0021,1059  IntegerSlop                        N
+  0021,105A  IntegerSlop                        N
+  0021,105B  FloatSlop                          N
+  0021,105C  FloatSlop                          N
+  0021,105D  FloatSlop                          N
+  0021,105E  FloatSlop                          N
+  0021,105F  FloatSlop                          N
+  0021,1081  AutoWindowLevelAlpha               N
+  0021,1082  AutoWindowLevelBeta                N
+  0021,1083  AutoWindowLevelWindow              N
+  0021,1084  ToWindowLevelLevel                 N
+  0021,1090  TubeFocalSpotPosition              N
+  0021,1091  BiopsyPosition                     N
+  0021,1092  BiopsyTLocation                    N
+  0021,1093  BiopsyRefLocation                  N
+  0022,0001  LightPathFilterPassThroughWavelen  N
+  0022,0002  LightPathFilterPassBand            N
+  0022,0003  ImagePathFilterPassThroughWavelen  N
+  0022,0004  ImagePathFilterPassBand            N
+  0022,0005  PatientEyeMovementCommanded        N
+  0022,0006  PatientEyeMovementCommandCodeSeq   N
+  0022,0007  SphericalLensPower                 N
+  0022,0008  CylinderLensPower                  N
+  0022,0009  CylinderAxis                       N
+  0022,000A  EmmetropicMagnification            N
+  0022,000B  IntraOcularPressure                N
+  0022,000C  HorizontalFieldOfView              N
+  0022,000D  PupilDilated                       N
+  0022,000E  DegreeOfDilation                   N
+  0022,0010  StereoBaselineAngle                N
+  0022,0011  StereoBaselineDisplacement         N
+  0022,0012  StereoHorizontalPixelOffset        N
+  0022,0013  StereoVerticalPixelOffset          N
+  0022,0014  StereoRotation                     N
+  0022,0015  AcquisitionDeviceTypeCodeSequence  N
+  0022,0016  IlluminationTypeCodeSequence       N
+  0022,0017  LightPathFilterTypeStackCodeSeq    N
+  0022,0018  ImagePathFilterTypeStackCodeSeq    N
+  0022,0019  LensesCodeSequence                 N
+  0022,001A  ChannelDescriptionCodeSequence     N
+  0022,001B  RefractiveStateSequence            N
+  0022,001C  MydriaticAgentCodeSequence         N
+  0022,001D  RelativeImagePositionCodeSequence  N
+  0022,0020  StereoPairsSequence                N
+  0022,0021  LeftImageSequence                  N
+  0022,0022  RightImageSequence                 N
+  0022,0030  AxialLengthOfTheEye                N
+  0022,0031  OphthalmicFrameLocationSequence    N
+  0022,0032  ReferenceCoordinates               N
+  0022,0035  DepthSpatialResolution             N
+  0022,0036  MaximumDepthDistortion             N
+  0022,0037  AlongScanSpatialResolution         N
+  0022,0038  MaximumAlongScanDistortion         N
+  0022,0039  OphthalmicImageOrientation         N
+  0022,0041  DepthOfTransverseImage             N
+  0022,0042  MydriaticAgentConcUnitsSeq         N
+  0022,0048  AcrossScanSpatialResolution        N
+  0022,0049  MaximumAcrossScanDistortion        N
+  0022,004E  MydriaticAgentConcentration        N
+  0022,0055  IlluminationWaveLength             N
+  0022,0056  IlluminationPower                  N
+  0022,0057  IlluminationBandwidth              N
+  0022,0058  MydriaticAgentSequence             N
+  0023,1001  NumberOfSeriesInStudy              N
+  0023,1002  NumberOfUnarchivedSeries           N
+  0023,1010  ReferenceImageField                N
+  0023,1050  SummaryImage                       N
+  0023,1070  StartTimeSecsInFirstAxial          N
+  0023,1074  NoofUpdatesToHeader                N
+  0023,107D  IndicatesIfTheStudyHasCompleteInfo N
+  0025,1006  LastPulseSequenceUsed              N
+  0025,1007  ImagesInSeries                     N
+  0025,1010  LandmarkCounter                    N
+  0025,1011  NumberOfAcquisitions               N
+  0025,1014  IndicatesNoofUpdatesToHeader       N
+  0025,1017  SeriesCompleteFlag                 N
+  0025,1018  NumberOfImagesArchived             N
+  0025,1019  LastImageNumberUsed                N
+  0025,101A  PrimaryReceiverSuiteAndHost        N
+  0027,1006  ImageArchiveFlag                   N
+  0027,1010  ScoutType                          N
+  0027,101C  VmaMamp                            N
+  0027,101D  VmaPhase                           N
+  0027,101E  VmaMod                             N
+  0027,101F  VmaClip                            N
+  0027,1020  SmartScanOnOffFlag                 N
+  0027,1030  ForeignImageRevision               N
+  0027,1031  ImagingMode                        N
+  0027,1032  PulseSequence                      N
+  0027,1033  ImagingOptions                     N
+  0027,1035  PlaneType                          N
+  0027,1036  ObliquePlane                       N
+  0027,1040  RASLetterOfImageLocation           N
+  0027,1041  ImageLocation                      N
+  0027,1042  CenterRCoordOfPlaneImage           N
+  0027,1043  CenterACoordOfPlaneImage           N
+  0027,1044  CenterSCoordOfPlaneImage           N
+  0027,1045  NormalRCoord                       N
+  0027,1046  NormalACoord                       N
+  0027,1047  NormalSCoord                       N
+  0027,1048  RCoordOfTopRightCorner             N
+  0027,1049  ACoordOfTopRightCorner             N
+  0027,104A  SCoordOfTopRightCorner             N
+  0027,104B  RCoordOfBottomRightCorner          N
+  0027,104C  ACoordOfBottomRightCorner          N
+  0027,104D  SCoordOfBottomRightCorner          N
+  0027,1050  TableStartLocation                 N
+  0027,1051  TableEndLocation                   N
+  0027,1052  RASLetterForSideOfImage            N
+  0027,1053  RASLetterForAnteriorPosterior      N
+  0027,1054  RASLetterForScoutStartLoc          N
+  0027,1055  RASLetterForScoutEndLoc            N
+  0027,1060  ImageDimensionX                    N
+  0027,1061  ImageDimensionY                    N
+  0027,1062  NumberOfExcitations                N
+  0028,0000  ImagePresentationGroupLength       N
+  0028,0002  SamplesPerPixel                    N
+  0028,0003  SamplesPerPixelUsed                N
+  0028,0004  PhotometricInterpretation          N
+  0028,0005  ImageDimensions                    N
+  0028,0006  PlanarConfiguration                N
+  0028,0008  NumberOfFrames                     N
+  0028,0009  FrameIncrementPointer              N
+  0028,000A  FrameDimensionPointer              N
+  0028,0010  Rows                               N
+  0028,0011  Columns                            N
+  0028,0012  Planes                             N
+  0028,0014  UltrasoundColorDataPresent         N
+  0028,0030  PixelSpacing                       N
+  0028,0031  ZoomFactor                         N
+  0028,0032  ZoomCenter                         N
+  0028,0034  PixelAspectRatio                   N
+  0028,0040  ImageFormat                        N
+  0028,0050  ManipulatedImage                   N
+  0028,0051  CorrectedImage                     N
+  0028,005F  CompressionRecognitionCode         N
+  0028,0060  CompressionCode                    N
+  0028,0061  CompressionOriginator              N
+  0028,0062  CompressionLabel                   N
+  0028,0063  CompressionDescription             N
+  0028,0065  CompressionSequence                N
+  0028,0066  CompressionStepPointers            N
+  0028,0068  RepeatInterval                     N
+  0028,0069  BitsGrouped                        N
+  0028,0070  PerimeterTable                     N
+  0028,0071  PerimeterValue                     N
+  0028,0080  PredictorRows                      N
+  0028,0081  PredictorColumns                   N
+  0028,0082  PredictorConstants                 N
+  0028,0090  BlockedPixels                      N
+  0028,0091  BlockRows                          N
+  0028,0092  BlockColumns                       N
+  0028,0093  RowOverlap                         N
+  0028,0094  ColumnOverlap                      N
+  0028,0100  BitsAllocated                      N
+  0028,0101  BitsStored                         N
+  0028,0102  HighBit                            N
+  0028,0103  PixelRepresentation                N
+  0028,0104  SmallestValidPixelValue            N
+  0028,0105  LargestValidPixelValue             N
+  0028,0106  SmallestImagePixelValue            N
+  0028,0107  LargestImagePixelValue             N
+  0028,0108  SmallestPixelValueInSeries         N
+  0028,0109  LargestPixelValueInSeries          N
+  0028,0110  SmallestImagePixelValueInPlane     N
+  0028,0111  LargestImagePixelValueInPlane      N
+  0028,0120  PixelPaddingValue                  N
+  0028,0121  PixelPaddingRangeLimit             N
+  0028,0200  ImageLocation                      N
+  0028,0300  QualityControlImage                N
+  0028,0301  BurnedInAnnotation                 N
+  0028,0400  TransformLabel                     N
+  0028,0401  TransformVersionNumber             N
+  0028,0402  NumberOfTransformSteps             N
+  0028,0403  SequenceOfCompressedData           N
+  0028,0404  DetailsOfCoefficients              N
+  0028,04x2  CoefficientCoding                  N
+  0028,04x3  CoefficientCodingPointers          N
+  0028,0700  DCTLabel                           N
+  0028,0701  DataBlockDescription               N
+  0028,0702  DataBlock                          N
+  0028,0710  NormalizationFactorFormat          N
+  0028,0720  ZonalMapNumberFormat               N
+  0028,0721  ZonalMapLocation                   N
+  0028,0722  ZonalMapFormat                     N
+  0028,0730  AdaptiveMapFormat                  N
+  0028,0740  CodeNumberFormat                   N
+  0028,08x0  CodeLabel                          N
+  0028,08x2  NumberOfTables                     N
+  0028,08x3  CodeTableLocation                  N
+  0028,08x4  BitsForCodeWord                    N
+  0028,08x8  ImageDataLocation                  N
+  0028,0A02  PixelSpacingCalibrationType        N
+  0028,0A04  PixelSpacingCalibrationDescription N
+  0028,1040  PixelIntensityRelationship         N
+  0028,1041  PixelIntensityRelationshipSign     N
+  0028,1050  WindowCenter                       N
+  0028,1051  WindowWidth                        N
+  0028,1052  RescaleIntercept                   N
+  0028,1053  RescaleSlope                       N
+  0028,1054  RescaleType                        N
+  0028,1055  WindowCenterAndWidthExplanation    N
+  0028,1056  VOI_LUTFunction                    N
+  0028,1080  GrayScale                          N
+  0028,1090  RecommendedViewingMode             N
+  0028,1100  GrayLookupTableDescriptor          N
+  0028,1101  RedPaletteColorTableDescriptor     N
+  0028,1102  GreenPaletteColorTableDescriptor   N
+  0028,1103  BluePaletteColorTableDescriptor    N
+  0028,1111  LargeRedPaletteColorTableDescr     N
+  0028,1112  LargeGreenPaletteColorTableDescr   N
+  0028,1113  LargeBluePaletteColorTableDescr    N
+  0028,1199  PaletteColorTableUID               N
+  0028,1200  GrayLookupTableData                N
+  0028,1201  RedPaletteColorTableData           N
+  0028,1202  GreenPaletteColorTableData         N
+  0028,1203  BluePaletteColorTableData          N
+  0028,1211  LargeRedPaletteColorTableData      N
+  0028,1212  LargeGreenPaletteColorTableData    N
+  0028,1213  LargeBluePaletteColorTableData     N
+  0028,1214  LargePaletteColorLookupTableUID    N
+  0028,1221  SegmentedRedColorTableData         N
+  0028,1222  SegmentedGreenColorTableData       N
+  0028,1223  SegmentedBlueColorTableData        N
+  0028,1300  BreastImplantPresent               N
+  0028,1350  PartialView                        N
+  0028,1351  PartialViewDescription             N
+  0028,1352  PartialViewCodeSequence            N
+  0028,135A  SpatialLocationsPreserved          N
+  0028,1402  DataPathAssignment                 N
+  0028,1404  BlendingLUT1Sequence               N
+  0028,1406  BlendingWeightConstant             N
+  0028,1408  BlendingLookupTableData            N
+  0028,140C  BlendingLUT2Sequence               N
+  0028,140E  DataPathID                         N
+  0028,140F  RGBLUTTransferFunction             N
+  0028,1410  AlphaLUTTransferFunction           N
+  0028,2000  ICCProfile                         N
+  0028,2110  LossyImageCompression              N
+  0028,2112  LossyImageCompressionRatio         N
+  0028,2114  LossyImageCompressionMethod        N
+  0028,3000  ModalityLUTSequence                N
+  0028,3002  LUTDescriptor                      N
+  0028,3003  LUTExplanation                     N
+  0028,3004  ModalityLUTType                    N
+  0028,3006  LUTData                            N
+  0028,3010  VOILUTSequence                     N
+  0028,3110  SoftcopyVOILUTSequence             N
+  0028,4000  ImagePresentationComments          N
+  0028,5000  BiPlaneAcquisitionSequence         N
+  0028,6010  RepresentativeFrameNumber          N
+  0028,6020  FrameNumbersOfInterest             N
+  0028,6022  FrameOfInterestDescription         N
+  0028,6023  FrameOfInterestType                N
+  0028,6030  MaskPointers                       N
+  0028,6040  RWavePointer                       N
+  0028,6100  MaskSubtractionSequence            N
+  0028,6101  MaskOperation                      N
+  0028,6102  ApplicableFrameRange               N
+  0028,6110  MaskFrameNumbers                   N
+  0028,6112  ContrastFrameAveraging             N
+  0028,6114  MaskSubPixelShift                  N
+  0028,6120  TIDOffset                          N
+  0028,6190  MaskOperationExplanation           N
+  0028,7FE0  PixelDataProviderURL               N
+  0028,9001  DataPointRows                      N
+  0028,9002  DataPointColumns                   N
+  0028,9003  SignalDomainColumns                N
+  0028,9099  LargestMonochromePixelValue        N
+  0028,9108  DataRepresentation                 N
+  0028,9110  PixelMeasuresSequence              N
+  0028,9132  FrameVOILUTSequence                N
+  0028,9145  PixelValueTransformationSequence   N
+  0028,9235  SignalDomainRows                   N
+  0028,9411  DisplayFilterPercentage            N
+  0028,9415  FramePixelShiftSequence            N
+  0028,9416  SubtractionItemID                  N
+  0028,9422  PixelIntensityRelationshipLUTSeq   N
+  0028,9443  FramePixelDataPropertiesSequence   N
+  0028,9444  GeometricalProperties              N
+  0028,9445  GeometricMaximumDistortion         N
+  0028,9446  ImageProcessingApplied             N
+  0028,9454  MaskSelectionMode                  N
+  0028,9474  LUTFunction                        N
+  0028,9478  MaskVisibilityPercentage           N
+  0028,9501  PixelShiftSequence                 N
+  0028,9502  RegionPixelShiftSequence           N
+  0028,9503  VerticesOfTheRegion                N
+  0028,9506  PixelShiftFrameRange               N
+  0028,9507  LUTFrameRange                      N
+  0028,9520  ImageToEquipmentMappingMatrix      N
+  0028,9537  EquipmentCoordinateSystemID        N
+  0029,1004  LowerRangeOfPixels1a               N
+  0029,1005  LowerRangeOfPixels1b               N
+  0029,1006  LowerRangeOfPixels1c               N
+  0029,1007  LowerRangeOfPixels1d               N
+  0029,1008  LowerRangeOfPixels1e               N
+  0029,1009  LowerRangeOfPixels1f               N
+  0029,100A  LowerRangeOfPixels1g               N
+  0029,1015  LowerRangeOfPixels1h               N
+  0029,1016  LowerRangeOfPixels1i               N
+  0029,1017  LowerRangeOfPixels2                N
+  0029,1018  UpperRangeOfPixels2                N
+  0029,101A  LenOfTotHdrInBytes                 N
+  0029,1026  VersionOfTheHdrStruct              N
+  0029,1034  AdvantageCompOverflow              N
+  0029,1035  AdvantageCompUnderflow             N
+  0032,0000  StudyGroupLength                   N
+  0032,000A  StudyStatusID                      N
+  0032,000C  StudyPriorityID                    N
+  0032,0012  StudyIDIssuer                      N
+  0032,0032  StudyVerifiedDate                  N
+  0032,0033  StudyVerifiedTime                  N
+  0032,0034  StudyReadDate                      N
+  0032,0035  StudyReadTime                      N
+  0032,1000  ScheduledStudyStartDate            N
+  0032,1001  ScheduledStudyStartTime            N
+  0032,1010  ScheduledStudyStopDate             N
+  0032,1011  ScheduledStudyStopTime             N
+  0032,1020  ScheduledStudyLocation             N
+  0032,1021  ScheduledStudyLocationAETitle      N
+  0032,1030  ReasonForStudy                     N
+  0032,1031  RequestingPhysicianIDSequence      N
+  0032,1032  RequestingPhysician                N
+  0032,1033  RequestingService                  N
+  0032,1040  StudyArrivalDate                   N
+  0032,1041  StudyArrivalTime                   N
+  0032,1050  StudyCompletionDate                N
+  0032,1051  StudyCompletionTime                N
+  0032,1055  StudyComponentStatusID             N
+  0032,1060  RequestedProcedureDescription      N
+  0032,1064  RequestedProcedureCodeSequence     N
+  0032,1070  RequestedContrastAgent             N
+  0032,4000  StudyComments                      N
+  0038,0004  ReferencedPatientAliasSequence     N
+  0038,0008  VisitStatusID                      N
+  0038,0010  AdmissionID                        N
+  0038,0011  IssuerOfAdmissionID                N
+  0038,0016  RouteOfAdmissions                  N
+  0038,001A  ScheduledAdmissionDate             N
+  0038,001B  ScheduledAdmissionTime             N
+  0038,001C  ScheduledDischargeDate             N
+  0038,001D  ScheduledDischargeTime             N
+  0038,001E  ScheduledPatientInstitResidence    N
+  0038,0020  AdmittingDate                      N
+  0038,0021  AdmittingTime                      N
+  0038,0030  DischargeDate                      N
+  0038,0032  DischargeTime                      N
+  0038,0040  DischargeDiagnosisDescription      N
+  0038,0044  DischargeDiagnosisCodeSequence     N
+  0038,0050  SpecialNeeds                       N
+  0038,0060  ServiceEpisodeID                   N
+  0038,0061  IssuerOfServiceEpisodeID           N
+  0038,0062  ServiceEpisodeDescription          N
+  0038,0100  PertinentDocumentsSequence         N
+  0038,0300  CurrentPatientLocation             N
+  0038,0400  PatientInstitutionResidence        N
+  0038,0500  PatientState                       N
+  0038,0502  PatientClinicalTrialParticipSeq    N
+  0038,4000  VisitComments                      N
+  003A,0004  WaveformOriginality                N
+  003A,0005  NumberOfWaveformChannels           N
+  003A,0010  NumberOfWaveformSamples            N
+  003A,001A  SamplingFrequency                  N
+  003A,0020  MultiplexGroupLabel                N
+  003A,0200  ChannelDefinitionSequence          N
+  003A,0202  WaveformChannelNumber              N
+  003A,0203  ChannelLabel                       N
+  003A,0205  ChannelStatus                      N
+  003A,0208  ChannelSourceSequence              N
+  003A,0209  ChannelSourceModifiersSequence     N
+  003A,020A  SourceWaveformSequence             N
+  003A,020C  ChannelDerivationDescription       N
+  003A,0210  ChannelSensitivity                 N
+  003A,0211  ChannelSensitivityUnitsSequence    N
+  003A,0212  ChannelSensitivityCorrectionFactor N
+  003A,0213  ChannelBaseline                    N
+  003A,0214  ChannelTimeSkew                    N
+  003A,0215  ChannelSampleSkew                  N
+  003A,0218  ChannelOffset                      N
+  003A,021A  WaveformBitsStored                 N
+  003A,0220  FilterLowFrequency                 N
+  003A,0221  FilterHighFrequency                N
+  003A,0222  NotchFilterFrequency               N
+  003A,0223  NotchFilterBandwidth               N
+  003A,0230  WaveformDataDisplayScale           N
+  003A,0231  WaveformDisplayBkgCIELabValue      N
+  003A,0240  WaveformPresentationGroupSequence  N
+  003A,0241  PresentationGroupNumber            N
+  003A,0242  ChannelDisplaySequence             N
+  003A,0244  ChannelRecommendDisplayCIELabValue N
+  003A,0245  ChannelPosition                    N
+  003A,0246  DisplayShadingFlag                 N
+  003A,0247  FractionalChannelDisplayScale      N
+  003A,0248  AbsoluteChannelDisplayScale        N
+  003A,0300  MultiplexAudioChannelsDescrCodeSeq N
+  003A,0301  ChannelIdentificationCode          N
+  003A,0302  ChannelMode                        N
+  0040,0001  ScheduledStationAETitle            N
+  0040,0002  ScheduledProcedureStepStartDate    N
+  0040,0003  ScheduledProcedureStepStartTime    N
+  0040,0004  ScheduledProcedureStepEndDate      N
+  0040,0005  ScheduledProcedureStepEndTime      N
+  0040,0006  ScheduledPerformingPhysiciansName  N
+  0040,0007  ScheduledProcedureStepDescription  N
+  0040,0008  ScheduledProtocolCodeSequence      N
+  0040,0009  ScheduledProcedureStepID           N
+  0040,000A  StageCodeSequence                  N
+  0040,000B  ScheduledPerformingPhysicianIDSeq  N
+  0040,0010  ScheduledStationName               N
+  0040,0011  ScheduledProcedureStepLocation     N
+  0040,0012  PreMedication                      N
+  0040,0020  ScheduledProcedureStepStatus       N
+  0040,0031  LocalNamespaceEntityID             N
+  0040,0032  UniversalEntityID                  N
+  0040,0033  UniversalEntityIDType              N
+  0040,0035  IdentifierTypeCode                 N
+  0040,0036  AssigningFacilitySequence          N
+  0040,0100  ScheduledProcedureStepSequence     N
+  0040,0220  ReferencedNonImageCompositeSOPSeq  N
+  0040,0241  PerformedStationAETitle            N
+  0040,0242  PerformedStationName               N
+  0040,0243  PerformedLocation                  N
+  0040,0244  PerformedProcedureStepStartDate    N
+  0040,0245  PerformedProcedureStepStartTime    N
+  0040,0250  PerformedProcedureStepEndDate      N
+  0040,0251  PerformedProcedureStepEndTime      N
+  0040,0252  PerformedProcedureStepStatus       N
+  0040,0253  PerformedProcedureStepID           N
+  0040,0254  PerformedProcedureStepDescription  N
+  0040,0255  PerformedProcedureTypeDescription  N
+  0040,0260  PerformedProtocolCodeSequence      N
+  0040,0261  PerformedProtocolType              N
+  0040,0270  ScheduledStepAttributesSequence    N
+  0040,0275  RequestAttributesSequence          N
+  0040,0280  CommentsOnPerformedProcedureStep   N
+  0040,0281  ProcStepDiscontinueReasonCodeSeq   N
+  0040,0293  QuantitySequence                   N
+  0040,0294  Quantity                           N
+  0040,0295  MeasuringUnitsSequence             N
+  0040,0296  BillingItemSequence                N
+  0040,0300  TotalTimeOfFluoroscopy             N
+  0040,0301  TotalNumberOfExposures             N
+  0040,0302  EntranceDose                       N
+  0040,0303  ExposedArea                        N
+  0040,0306  DistanceSourceToEntrance           N
+  0040,0307  DistanceSourceToSupport            N
+  0040,030E  ExposureDoseSequence               N
+  0040,0310  CommentsOnRadiationDose            N
+  0040,0312  XRayOutput                         N
+  0040,0314  HalfValueLayer                     N
+  0040,0316  OrganDose                          N
+  0040,0318  OrganExposed                       N
+  0040,0320  BillingProcedureStepSequence       N
+  0040,0321  FilmConsumptionSequence            N
+  0040,0324  BillingSuppliesAndDevicesSequence  N
+  0040,0330  ReferencedProcedureStepSequence    N
+  0040,0340  PerformedSeriesSequence            N
+  0040,0400  CommentsOnScheduledProcedureStep   N
+  0040,0440  ProtocolContextSequence            N
+  0040,0441  ContentItemModifierSequence        N
+  0040,050A  SpecimenAccessionNumber            N
+  0040,0512  ContainerIdentifier                N
+  0040,051A  ContainerDescription               N
+  0040,0550  SpecimenSequence                   N
+  0040,0551  SpecimenIdentifier                 N
+  0040,0552  SpecimenDescriptionSequenceTrial   N
+  0040,0553  SpecimenDescriptionTrial           N
+  0040,0554  SpecimenUID                        N
+  0040,0555  AcquisitionContextSequence         N
+  0040,0556  AcquisitionContextDescription      N
+  0040,059A  SpecimenTypeCodeSequence           N
+  0040,0600  SpecimenShortDescription           N
+  0040,06FA  SlideIdentifier                    N
+  0040,071A  ImageCenterPointCoordinatesSeq     N
+  0040,072A  XOffsetInSlideCoordinateSystem     N
+  0040,073A  YOffsetInSlideCoordinateSystem     N
+  0040,074A  ZOffsetInSlideCoordinateSystem     N
+  0040,08D8  PixelSpacingSequence               N
+  0040,08DA  CoordinateSystemAxisCodeSequence   N
+  0040,08EA  MeasurementUnitsCodeSequence       N
+  0040,09F8  VitalStainCodeSequenceTrial        N
+  0040,1001  RequestedProcedureID               N
+  0040,1002  ReasonForRequestedProcedure        N
+  0040,1003  RequestedProcedurePriority         N
+  0040,1004  PatientTransportArrangements       N
+  0040,1005  RequestedProcedureLocation         N
+  0040,1006  PlacerOrderNumber-Procedure        N
+  0040,1007  FillerOrderNumber-Procedure        N
+  0040,1008  ConfidentialityCode                N
+  0040,1009  ReportingPriority                  N
+  0040,100A  ReasonForRequestedProcedureCodeSeq N
+  0040,1010  NamesOfIntendedRecipientsOfResults N
+  0040,1011  IntendedRecipientsOfResultsIDSeq   N
+  0040,1101  PersonIdentificationCodeSequence   N
+  0040,1102  PersonAddress                      N
+  0040,1103  PersonTelephoneNumbers             N
+  0040,1400  RequestedProcedureComments         N
+  0040,2001  ReasonForImagingServiceRequest     N
+  0040,2004  IssueDateOfImagingServiceRequest   N
+  0040,2005  IssueTimeOfImagingServiceRequest   N
+  0040,2006  PlacerOrderNum-ImagingServiceReq   N
+  0040,2007  FillerOrderNum-ImagingServiceReq   N
+  0040,2008  OrderEnteredBy                     N
+  0040,2009  OrderEntererLocation               N
+  0040,2010  OrderCallbackPhoneNumber           N
+  0040,2016  PlacerOrderNum-ImagingServiceReq   N
+  0040,2017  FillerOrderNum-ImagingServiceReq   N
+  0040,2400  ImagingServiceRequestComments      N
+  0040,3001  ConfidentialityOnPatientDataDescr  N
+  0040,4001  GenPurposeScheduledProcStepStatus  N
+  0040,4002  GenPurposePerformedProcStepStatus  N
+  0040,4003  GenPurposeSchedProcStepPriority    N
+  0040,4004  SchedProcessingApplicationsCodeSeq N
+  0040,4005  SchedProcedureStepStartDateAndTime N
+  0040,4006  MultipleCopiesFlag                 N
+  0040,4007  PerformedProcessingAppsCodeSeq     N
+  0040,4009  HumanPerformerCodeSequence         N
+  0040,4010  SchedProcStepModificationDateTime  N
+  0040,4011  ExpectedCompletionDateAndTime      N
+  0040,4015  ResultingGenPurposePerfProcStepSeq N
+  0040,4016  RefGenPurposeSchedProcStepSeq      N
+  0040,4018  ScheduledWorkitemCodeSequence      N
+  0040,4019  PerformedWorkitemCodeSequence      N
+  0040,4020  InputAvailabilityFlag              N
+  0040,4021  InputInformationSequence           N
+  0040,4022  RelevantInformationSequence        N
+  0040,4023  RefGenPurSchedProcStepTransUID     N
+  0040,4025  ScheduledStationNameCodeSequence   N
+  0040,4026  ScheduledStationClassCodeSequence  N
+  0040,4027  SchedStationGeographicLocCodeSeq   N
+  0040,4028  PerformedStationNameCodeSequence   N
+  0040,4029  PerformedStationClassCodeSequence  N
+  0040,4030  PerformedStationGeogLocCodeSeq     N
+  0040,4031  RequestedSubsequentWorkItemCodeSeq N
+  0040,4032  NonDICOMOutputCodeSequence         N
+  0040,4033  OutputInformationSequence          N
+  0040,4034  ScheduledHumanPerformersSequence   N
+  0040,4035  ActualHumanPerformersSequence      N
+  0040,4036  HumanPerformersOrganization        N
+  0040,4037  HumanPerformerName                 N
+  0040,4040  RawDataHandling                    N
+  0040,8302  EntranceDoseInMilliGy              N
+  0040,9094  RefImageRealWorldValueMappingSeq   N
+  0040,9096  RealWorldValueMappingSequence      N
+  0040,9098  PixelValueMappingCodeSequence      N
+  0040,9210  LUTLabel                           N
+  0040,9211  RealWorldValueLastValueMapped      N
+  0040,9212  RealWorldValueLUTData              N
+  0040,9216  RealWorldValueFirstValueMapped     N
+  0040,9224  RealWorldValueIntercept            N
+  0040,9225  RealWorldValueSlope                N
+  0040,A010  RelationshipType                   N
+  0040,A027  VerifyingOrganization              N
+  0040,A030  VerificationDateTime               N
+  0040,A032  ObservationDateTime                N
+  0040,A040  ValueType                          N
+  0040,A043  ConceptNameCodeSequence            N
+  0040,A050  ContinuityOfContent                N
+  0040,A073  VerifyingObserverSequence          N
+  0040,A075  VerifyingObserverName              N
+  0040,A078  AuthorObserverSequence             N
+  0040,A07A  ParticipantSequence                N
+  0040,A07C  CustodialOrganizationSequence      N
+  0040,A080  ParticipationType                  N
+  0040,A082  ParticipationDateTime              N
+  0040,A084  ObserverType                       N
+  0040,A088  VerifyingObserverIdentCodeSequence N
+  0040,A090  EquivalentCDADocumentSequence      N
+  0040,A0B0  ReferencedWaveformChannels         N
+  0040,A120  DateTime                           N
+  0040,A121  Date                               N
+  0040,A122  Time                               N
+  0040,A123  PersonName                         N
+  0040,A124  UID                                N
+  0040,A130  TemporalRangeType                  N
+  0040,A132  ReferencedSamplePositions          N
+  0040,A136  ReferencedFrameNumbers             N
+  0040,A138  ReferencedTimeOffsets              N
+  0040,A13A  ReferencedDateTime                 N
+  0040,A160  TextValue                          N
+  0040,A168  ConceptCodeSequence                N
+  0040,A170  PurposeOfReferenceCodeSequence     N
+  0040,A180  AnnotationGroupNumber              N
+  0040,A195  ModifierCodeSequence               N
+  0040,A300  MeasuredValueSequence              N
+  0040,A301  NumericValueQualifierCodeSequence  N
+  0040,A30A  NumericValue                       N
+  0040,A353  AddressTrial                       N
+  0040,A354  TelephoneNumberTrial               N
+  0040,A360  PredecessorDocumentsSequence       N
+  0040,A370  ReferencedRequestSequence          N
+  0040,A372  PerformedProcedureCodeSequence     N
+  0040,A375  CurrentRequestedProcEvidenceSeq    N
+  0040,A385  PertinentOtherEvidenceSequence     N
+  0040,A390  HL7StructuredDocumentRefSeq        N
+  0040,A491  CompletionFlag                     N
+  0040,A492  CompletionFlagDescription          N
+  0040,A493  VerificationFlag                   N
+  0040,A494  ArchiveRequested                   N
+  0040,A496  PreliminaryFlag                    N
+  0040,A504  ContentTemplateSequence            N
+  0040,A525  IdenticalDocumentsSequence         N
+  0040,A730  ContentSequence                    N
+  0040,B020  AnnotationSequence                 N
+  0040,DB00  TemplateIdentifier                 N
+  0040,DB06  TemplateVersion                    N
+  0040,DB07  TemplateLocalVersion               N
+  0040,DB0B  TemplateExtensionFlag              N
+  0040,DB0C  TemplateExtensionOrganizationUID   N
+  0040,DB0D  TemplateExtensionCreatorUID        N
+  0040,DB73  ReferencedContentItemIdentifier    N
+  0040,E001  HL7InstanceIdentifier              N
+  0040,E004  HL7DocumentEffectiveTime           N
+  0040,E006  HL7DocumentTypeCodeSequence        N
+  0040,E010  RetrieveURI                        N
+  0040,E011  RetrieveLocationUID                N
+  0042,0010  DocumentTitle                      N
+  0042,0011  EncapsulatedDocument               N
+  0042,0012  MIMETypeOfEncapsulatedDocument     N
+  0042,0013  SourceInstanceSequence             N
+  0042,0014  ListOfMIMETypes                    N
+  0043,1001  BitmapOfPrescanOptions             N
+  0043,1002  GradientOffsetInX                  N
+  0043,1003  GradientOffsetInY                  N
+  0043,1004  GradientOffsetInZ                  N
+  0043,1005  ImgIsOriginalOrUnoriginal          N
+  0043,1006  NumberOfEPIShots                   N
+  0043,1007  ViewsPerSegment                    N
+  0043,1008  RespiratoryRateBpm                 N
+  0043,1009  RespiratoryTriggerPoint            N
+  0043,100A  TypeOfReceiverUsed                 N
+  0043,100B  PeakRateOfChangeOfGradientField    N
+  0043,100C  LimitsInUnitsOfPercent             N
+  0043,100D  PSDEstimatedLimit                  N
+  0043,100E  PSDEstimatedLimitInTeslaPerSecond  N
+  0043,100F  Saravghead                         N
+  0043,1010  WindowValue                        N
+  0043,1011  TotalInputViews                    N
+  0043,1012  X-RayChain                         N
+  0043,1013  DeconKernelParameters              N
+  0043,1014  CalibrationParameters              N
+  0043,1015  TotalOutputViews                   N
+  0043,1016  NumberOfOverranges                 N
+  0043,1017  IBHImageScaleFactors               N
+  0043,1018  BBHCoefficients                    N
+  0043,1019  NumberOfBBHChainsToBlend           N
+  0043,101A  StartingChannelNumber              N
+  0043,101B  PpscanParameters                   N
+  0043,101C  GEImageIntegrity                   N
+  0043,101D  LevelValue                         N
+  0043,101E  DeltaStartTime                     N
+  0043,101F  MaxOverrangesInAView               N
+  0043,1020  AvgOverrangesAllViews              N
+  0043,1021  CorrectedAfterGlowTerms            N
+  0043,1025  ReferenceChannels                  N
+  0043,1026  NoViewsRefChansBlocked             N
+  0043,1027  ScanPitchRatio                     N
+  0043,1028  UniqueImageIden                    N
+  0043,1029  HistogramTables                    N
+  0043,102A  UserDefinedData                    N
+  0043,102B  PrivateScanOptions                 N
+  0043,102C  EffectiveEchoSpacing               N
+  0043,102D  StringSlopField1                   N
+  0043,102E  StringSlopField2                   N
+  0043,102F  RawDataType                        N
+  0043,1030  RawDataType                        N
+  0043,1031  RACordOfTargetReconCenter          N
+  0043,1032  RawDataType                        N
+  0043,1033  NegScanspacing                     N
+  0043,1034  OffsetFrequency                    N
+  0043,1035  UserUsageTag                       N
+  0043,1036  UserFillMapMSW                     N
+  0043,1037  UserFillMapLSW                     N
+  0043,1038  User25-48                          N
+  0043,1039  SlopInt6-9                         N
+  0043,1040  TriggerOnPosition                  N
+  0043,1041  DegreeOfRotation                   N
+  0043,1042  DASTriggerSource                   N
+  0043,1043  DASFpaGain                         N
+  0043,1044  DASOutputSource                    N
+  0043,1045  DASAdInput                         N
+  0043,1046  DASCalMode                         N
+  0043,1047  DASCalFrequency                    N
+  0043,1048  DASRegXm                           N
+  0043,1049  DASAutoZero                        N
+  0043,104A  StartingChannelOfView              N
+  0043,104B  DASXmPattern                       N
+  0043,104C  TGGCTriggerMode                    N
+  0043,104D  StartScanToXrayOnDelay             N
+  0043,104E  DurationOfXrayOn                   N
+  0043,1060  SlopInt10-17                       N
+  0043,1061  ScannerStudyEntityUID              N
+  0043,1062  ScannerStudyID                     N
+  0043,106f  ScannerTableEntry                  N
+  0044,0001  ProductPackageIdentifier           N
+  0044,0002  SubstanceAdministrationApproval    N
+  0044,0003  ApprovalStatusFurtherDescription   N
+  0044,0004  ApprovalStatusDateTime             N
+  0044,0007  ProductTypeCodeSequence            N
+  0044,0008  ProductName                        N
+  0044,0009  ProductDescription                 N
+  0044,000A  ProductLotIdentifier               N
+  0044,000B  ProductExpirationDateTime          N
+  0044,0010  SubstanceAdministrationDateTime    N
+  0044,0011  SubstanceAdministrationNotes       N
+  0044,0012  SubstanceAdministrationDeviceID    N
+  0044,0013  ProductParameterSequence           N
+  0044,0019  SubstanceAdminParameterSeq         N
+  0045,1001  NumberOfMacroRowsInDetector        N
+  0045,1002  MacroWidthAtISOCenter              N
+  0045,1003  DASType                            N
+  0045,1004  DASGain                            N
+  0045,1005  DASTemperature                     N
+  0045,1006  TableDirectionInOrOut              N
+  0045,1007  ZSmoothingFactor                   N
+  0045,1008  ViewWeightingMode                  N
+  0045,1009  SigmaRowNumberWhichRowsWereUsed    N
+  0045,100A  MinimumDasValueFoundInTheScanData  N
+  0045,100B  MaximumOffsetShiftValueUsed        N
+  0045,100C  NumberOfViewsShifted               N
+  0045,100D  ZTrackingFlag                      N
+  0045,100E  MeanZError                         N
+  0045,100F  ZTrackingMaximumError              N
+  0045,1010  StartingViewForRow2a               N
+  0045,1011  NumberOfViewsInRow2a               N
+  0045,1012  StartingViewForRow1a               N
+  0045,1013  SigmaMode                          N
+  0045,1014  NumberOfViewsInRow1a               N
+  0045,1015  StartingViewForRow2b               N
+  0045,1016  NumberOfViewsInRow2b               N
+  0045,1017  StartingViewForRow1b               N
+  0045,1018  NumberOfViewsInRow1b               N
+  0045,1019  AirFilterCalibrationDate           N
+  0045,101A  AirFilterCalibrationTime           N
+  0045,101B  PhantomCalibrationDate             N
+  0045,101C  PhantomCalibrationTime             N
+  0045,101D  ZSlopeCalibrationDate              N
+  0045,101E  ZSlopeCalibrationTime              N
+  0045,101F  CrosstalkCalibrationDate           N
+  0045,1020  CrosstalkCalibrationTime           N
+  0045,1021  IterboneOptionFlag                 N
+  0045,1022  PeristalticFlagOption              N
+  0046,0012  LensDescription                    N
+  0046,0014  RightLensSequence                  N
+  0046,0015  LeftLensSequence                   N
+  0046,0018  CylinderSequence                   N
+  0046,0028  PrismSequence                      N
+  0046,0030  HorizontalPrismPower               N
+  0046,0032  HorizontalPrismBase                N
+  0046,0034  VerticalPrismPower                 N
+  0046,0036  VerticalPrismBase                  N
+  0046,0038  LensSegmentType                    N
+  0046,0040  OpticalTransmittance               N
+  0046,0042  ChannelWidth                       N
+  0046,0044  PupilSize                          N
+  0046,0046  CornealSize                        N
+  0046,0060  DistancePupillaryDistance          N
+  0046,0062  NearPupillaryDistance              N
+  0046,0064  OtherPupillaryDistance             N
+  0046,0075  RadiusOfCurvature                  N
+  0046,0076  KeratometricPower                  N
+  0046,0077  KeratometricAxis                   N
+  0046,0092  BackgroundColor                    N
+  0046,0094  Optotype                           N
+  0046,0095  OptotypePresentation               N
+  0046,0100  AddNearSequence                    N
+  0046,0101  AddIntermediateSequence            N
+  0046,0102  AddOtherSequence                   N
+  0046,0104  AddPower                           N
+  0046,0106  ViewingDistance                    N
+  0046,0125  ViewingDistanceType                N
+  0046,0135  VisualAcuityModifiers              N
+  0046,0137  DecimalVisualAcuity                N
+  0046,0139  OptotypeDetailedDefinition         N
+  0046,0146  SpherePower                        N
+  0046,0147  CylinderPower                      N
+  0050,0004  CalibrationImage                   N
+  0050,0010  DeviceSequence                     N
+  0050,0014  DeviceLength                       N
+  0050,0015  ContainerComponentWidth            N
+  0050,0016  DeviceDiameter                     N
+  0050,0017  DeviceDiameterUnits                N
+  0050,0018  DeviceVolume                       N
+  0050,0019  InterMarkerDistance                N
+  0050,001B  ContainerComponentID               N
+  0050,0020  DeviceDescription                  N
+  0054,0010  EnergyWindowVector                 N
+  0054,0011  NumberOfEnergyWindows              N
+  0054,0012  EnergyWindowInformationSequence    N
+  0054,0013  EnergyWindowRangeSequence          N
+  0054,0014  EnergyWindowLowerLimit             N
+  0054,0015  EnergyWindowUpperLimit             N
+  0054,0016  RadiopharmaceuticalInformationSeq  N
+  0054,0017  ResidualSyringeCounts              N
+  0054,0018  EnergyWindowName                   N
+  0054,0020  DetectorVector                     N
+  0054,0021  NumberOfDetectors                  N
+  0054,0022  DetectorInformationSequence        N
+  0054,0030  PhaseVector                        N
+  0054,0031  NumberOfPhases                     N
+  0054,0032  PhaseInformationSequence           N
+  0054,0033  NumberOfFramesInPhase              N
+  0054,0036  PhaseDelay                         N
+  0054,0038  PauseBetweenFrames                 N
+  0054,0039  PhaseDescription                   N
+  0054,0050  RotationVector                     N
+  0054,0051  NumberOfRotations                  N
+  0054,0052  RotationInformationSequence        N
+  0054,0053  NumberOfFramesInRotation           N
+  0054,0060  RRIntervalVector                   N
+  0054,0061  NumberOfRRIntervals                N
+  0054,0062  GatedInformationSequence           N
+  0054,0063  DataInformationSequence            N
+  0054,0070  TimeSlotVector                     N
+  0054,0071  NumberOfTimeSlots                  N
+  0054,0072  TimeSlotInformationSequence        N
+  0054,0073  TimeSlotTime                       N
+  0054,0080  SliceVector                        N
+  0054,0081  NumberOfSlices                     N
+  0054,0090  AngularViewVector                  N
+  0054,0100  TimeSliceVector                    N
+  0054,0101  NumberOfTimeSlices                 N
+  0054,0200  StartAngle                         N
+  0054,0202  TypeOfDetectorMotion               N
+  0054,0210  TriggerVector                      N
+  0054,0211  NumberOfTriggersInPhase            N
+  0054,0220  ViewCodeSequence                   N
+  0054,0222  ViewModifierCodeSequence           N
+  0054,0300  RadionuclideCodeSequence           N
+  0054,0302  AdministrationRouteCodeSequence    N
+  0054,0304  RadiopharmaceuticalCodeSequence    N
+  0054,0306  CalibrationDataSequence            N
+  0054,0308  EnergyWindowNumber                 N
+  0054,0400  ImageID                            N
+  0054,0410  PatientOrientationCodeSequence     N
+  0054,0412  PatientOrientationModifierCodeSeq  N
+  0054,0414  PatientGantryRelationshipCodeSeq   N
+  0054,0500  SliceProgressionDirection          N
+  0054,1000  SeriesType                         N
+  0054,1001  Units                              N
+  0054,1002  CountsSource                       N
+  0054,1004  ReprojectionMethod                 N
+  0054,1100  RandomsCorrectionMethod            N
+  0054,1101  AttenuationCorrectionMethod        N
+  0054,1102  DecayCorrection                    N
+  0054,1103  ReconstructionMethod               N
+  0054,1104  DetectorLinesOfResponseUsed        N
+  0054,1105  ScatterCorrectionMethod            N
+  0054,1200  AxialAcceptance                    N
+  0054,1201  AxialMash                          N
+  0054,1202  TransverseMash                     N
+  0054,1203  DetectorElementSize                N
+  0054,1210  CoincidenceWindowWidth             N
+  0054,1220  SecondaryCountsType                N
+  0054,1300  FrameReferenceTime                 N
+  0054,1310  PrimaryCountsAccumulated           N
+  0054,1311  SecondaryCountsAccumulated         N
+  0054,1320  SliceSensitivityFactor             N
+  0054,1321  DecayFactor                        N
+  0054,1322  DoseCalibrationFactor              N
+  0054,1323  ScatterFractionFactor              N
+  0054,1324  DeadTimeFactor                     N
+  0054,1330  ImageIndex                         N
+  0054,1400  CountsIncluded                     N
+  0054,1401  DeadTimeCorrectionFlag             N
+  0060,3000  HistogramSequence                  N
+  0060,3002  HistogramNumberOfBins              N
+  0060,3004  HistogramFirstBinValue             N
+  0060,3006  HistogramLastBinValue              N
+  0060,3008  HistogramBinWidth                  N
+  0060,3010  HistogramExplanation               N
+  0060,3020  HistogramData                      N
+  0062,0001  SegmentationType                   N
+  0062,0002  SegmentSequence                    N
+  0062,0003  SegmentedPropertyCategoryCodeSeq   N
+  0062,0004  SegmentNumber                      N
+  0062,0005  SegmentLabel                       N
+  0062,0006  SegmentDescription                 N
+  0062,0008  SegmentAlgorithmType               N
+  0062,0009  SegmentAlgorithmName               N
+  0062,000A  SegmentIdentificationSequence      N
+  0062,000B  ReferencedSegmentNumber            N
+  0062,000C  RecommendedDisplayGrayscaleValue   N
+  0062,000D  RecommendedDisplayCIELabValue      N
+  0062,000E  MaximumFractionalValue             N
+  0062,000F  SegmentedPropertyTypeCodeSequence  N
+  0062,0010  SegmentationFractionalType         N
+  0064,0002  DeformableRegistrationSequence     N
+  0064,0003  SourceFrameOfReferenceUID          N
+  0064,0005  DeformableRegistrationGridSequence N
+  0064,0007  GridDimensions                     N
+  0064,0008  GridResolution                     N
+  0064,0009  VectorGridData                     N
+  0064,000F  PreDeformationMatrixRegistSeq      N
+  0064,0010  PostDeformationMatrixRegistSeq     N
+  0066,0001  NumberOfSurfaces                   N
+  0066,0002  SurfaceSequence                    N
+  0066,0003  SurfaceNumber                      N
+  0066,0004  SurfaceComments                    N
+  0066,0009  SurfaceProcessing                  N
+  0066,000A  SurfaceProcessingRatio             N
+  0066,000E  FiniteVolume                       N
+  0066,0010  Manifold                           N
+  0066,0011  SurfacePointsSequence              N
+  0066,0015  NumberOfSurfacePoints              N
+  0066,0016  PointCoordinatesData               N
+  0066,0017  PointPositionAccuracy              N
+  0066,0018  MeanPointDistance                  N
+  0066,0019  MaximumPointDistance               N
+  0066,001B  AxisOfRotation                     N
+  0066,001C  CenterOfRotation                   N
+  0066,001E  NumberOfVectors                    N
+  0066,001F  VectorDimensionality               N
+  0066,0020  VectorAccuracy                     N
+  0066,0021  VectorCoordinateData               N
+  0066,0023  TrianglePointIndexList             N
+  0066,0024  EdgePointIndexList                 N
+  0066,0025  VertexPointIndexList               N
+  0066,0026  TriangleStripSequence              N
+  0066,0027  TriangleFanSequence                N
+  0066,0028  LineSequence                       N
+  0066,0029  PrimitivePointIndexList            N
+  0066,002A  SurfaceCount                       N
+  0066,002F  AlgorithmFamilyCodeSequ            N
+  0066,0031  AlgorithmVersion                   N
+  0066,0032  AlgorithmParameters                N
+  0066,0034  FacetSequence                      N
+  0066,0036  AlgorithmName                      N
+  0070,0001  GraphicAnnotationSequence          N
+  0070,0002  GraphicLayer                       N
+  0070,0003  BoundingBoxAnnotationUnits         N
+  0070,0004  AnchorPointAnnotationUnits         N
+  0070,0005  GraphicAnnotationUnits             N
+  0070,0006  UnformattedTextValue               N
+  0070,0008  TextObjectSequence                 N
+  0070,0009  GraphicObjectSequence              N
+  0070,0010  BoundingBoxTopLeftHandCorner       N
+  0070,0011  BoundingBoxBottomRightHandCorner   N
+  0070,0012  BoundingBoxTextHorizJustification  N
+  0070,0014  AnchorPoint                        N
+  0070,0015  AnchorPointVisibility              N
+  0070,0020  GraphicDimensions                  N
+  0070,0021  NumberOfGraphicPoints              N
+  0070,0022  GraphicData                        N
+  0070,0023  GraphicType                        N
+  0070,0024  GraphicFilled                      N
+  0070,0040  ImageRotationRetired               N
+  0070,0041  ImageHorizontalFlip                N
+  0070,0042  ImageRotation                      N
+  0070,0050  DisplayedAreaTopLeftTrial          N
+  0070,0051  DisplayedAreaBottomRightTrial      N
+  0070,0052  DisplayedAreaTopLeft               N
+  0070,0053  DisplayedAreaBottomRight           N
+  0070,005A  DisplayedAreaSelectionSequence     N
+  0070,0060  GraphicLayerSequence               N
+  0070,0062  GraphicLayerOrder                  N
+  0070,0066  GraphicLayerRecDisplayGraysclValue N
+  0070,0067  GraphicLayerRecDisplayRGBValue     N
+  0070,0068  GraphicLayerDescription            N
+  0070,0080  ContentLabel                       N
+  0070,0081  ContentDescription                 N
+  0070,0082  PresentationCreationDate           N
+  0070,0083  PresentationCreationTime           N
+  0070,0084  ContentCreatorName                 N
+  0070,0086  ContentCreatorIDCodeSequence       N
+  0070,0100  PresentationSizeMode               N
+  0070,0101  PresentationPixelSpacing           N
+  0070,0102  PresentationPixelAspectRatio       N
+  0070,0103  PresentationPixelMagRatio          N
+  0070,0306  ShapeType                          N
+  0070,0308  RegistrationSequence               N
+  0070,0309  MatrixRegistrationSequence         N
+  0070,030A  MatrixSequence                     N
+  0070,030C  FrameOfRefTransformationMatrixType N
+  0070,030D  RegistrationTypeCodeSequence       N
+  0070,030F  FiducialDescription                N
+  0070,0310  FiducialIdentifier                 N
+  0070,0311  FiducialIdentifierCodeSequence     N
+  0070,0312  ContourUncertaintyRadius           N
+  0070,0314  UsedFiducialsSequence              N
+  0070,0318  GraphicCoordinatesDataSequence     N
+  0070,031A  FiducialUID                        N
+  0070,031C  FiducialSetSequence                N
+  0070,031E  FiducialSequence                   N
+  0070,0401  GraphicLayerRecomDisplayCIELabVal  N
+  0070,0402  BlendingSequence                   N
+  0070,0403  RelativeOpacity                    N
+  0070,0404  ReferencedSpatialRegistrationSeq   N
+  0070,0405  BlendingPosition                   N
+  0072,0002  HangingProtocolName                N
+  0072,0004  HangingProtocolDescription         N
+  0072,0006  HangingProtocolLevel               N
+  0072,0008  HangingProtocolCreator             N
+  0072,000A  HangingProtocolCreationDateTime    N
+  0072,000C  HangingProtocolDefinitionSequence  N
+  0072,000E  HangingProtocolUserIDCodeSequence  N
+  0072,0010  HangingProtocolUserGroupName       N
+  0072,0012  SourceHangingProtocolSequence      N
+  0072,0014  NumberOfPriorsReferenced           N
+  0072,0020  ImageSetsSequence                  N
+  0072,0022  ImageSetSelectorSequence           N
+  0072,0024  ImageSetSelectorUsageFlag          N
+  0072,0026  SelectorAttribute                  N
+  0072,0028  SelectorValueNumber                N
+  0072,0030  TimeBasedImageSetsSequence         N
+  0072,0032  ImageSetNumber                     N
+  0072,0034  ImageSetSelectorCategory           N
+  0072,0038  RelativeTime                       N
+  0072,003A  RelativeTimeUnits                  N
+  0072,003C  AbstractPriorValue                 N
+  0072,003E  AbstractPriorCodeSequence          N
+  0072,0040  ImageSetLabel                      N
+  0072,0050  SelectorAttributeVR                N
+  0072,0052  SelectorSequencePointer            N
+  0072,0054  SelectorSeqPointerPrivateCreator   N
+  0072,0056  SelectorAttributePrivateCreator    N
+  0072,0060  SelectorATValue                    N
+  0072,0062  SelectorCSValue                    N
+  0072,0064  SelectorISValue                    N
+  0072,0066  SelectorLOValue                    N
+  0072,0068  SelectorLTValue                    N
+  0072,006A  SelectorPNValue                    N
+  0072,006C  SelectorSHValue                    N
+  0072,006E  SelectorSTValue                    N
+  0072,0070  SelectorUTValue                    N
+  0072,0072  SelectorDSValue                    N
+  0072,0074  SelectorFDValue                    N
+  0072,0076  SelectorFLValue                    N
+  0072,0078  SelectorULValue                    N
+  0072,007A  SelectorUSValue                    N
+  0072,007C  SelectorSLValue                    N
+  0072,007E  SelectorSSValue                    N
+  0072,0080  SelectorCodeSequenceValue          N
+  0072,0100  NumberOfScreens                    N
+  0072,0102  NominalScreenDefinitionSequence    N
+  0072,0104  NumberOfVerticalPixels             N
+  0072,0106  NumberOfHorizontalPixels           N
+  0072,0108  DisplayEnvironmentSpatialPosition  N
+  0072,010A  ScreenMinimumGrayscaleBitDepth     N
+  0072,010C  ScreenMinimumColorBitDepth         N
+  0072,010E  ApplicationMaximumRepaintTime      N
+  0072,0200  DisplaySetsSequence                N
+  0072,0202  DisplaySetNumber                   N
+  0072,0203  DisplaySetLabel                    N
+  0072,0204  DisplaySetPresentationGroup        N
+  0072,0206  DisplaySetPresentationGroupDescr   N
+  0072,0208  PartialDataDisplayHandling         N
+  0072,0210  SynchronizedScrollingSequence      N
+  0072,0212  DisplaySetScrollingGroup           N
+  0072,0214  NavigationIndicatorSequence        N
+  0072,0216  NavigationDisplaySet               N
+  0072,0218  ReferenceDisplaySets               N
+  0072,0300  ImageBoxesSequence                 N
+  0072,0302  ImageBoxNumber                     N
+  0072,0304  ImageBoxLayoutType                 N
+  0072,0306  ImageBoxTileHorizontalDimension    N
+  0072,0308  ImageBoxTileVerticalDimension      N
+  0072,0310  ImageBoxScrollDirection            N
+  0072,0312  ImageBoxSmallScrollType            N
+  0072,0314  ImageBoxSmallScrollAmount          N
+  0072,0316  ImageBoxLargeScrollType            N
+  0072,0318  ImageBoxLargeScrollAmount          N
+  0072,0320  ImageBoxOverlapPriority            N
+  0072,0330  CineRelativeToRealTime             N
+  0072,0400  FilterOperationsSequence           N
+  0072,0402  FilterByCategory                   N
+  0072,0404  FilterByAttributePresence          N
+  0072,0406  FilterByOperator                   N
+  0072,0432  SynchronizedImageBoxList           N
+  0072,0434  TypeOfSynchronization              N
+  0072,0500  BlendingOperationType              N
+  0072,0510  ReformattingOperationType          N
+  0072,0512  ReformattingThickness              N
+  0072,0514  ReformattingInterval               N
+  0072,0516  ReformattingOpInitialViewDir       N
+  0072,0520  3DRenderingType                    N
+  0072,0600  SortingOperationsSequence          N
+  0072,0602  SortByCategory                     N
+  0072,0604  SortingDirection                   N
+  0072,0700  DisplaySetPatientOrientation       N
+  0072,0702  VOIType                            N
+  0072,0704  PseudoColorType                    N
+  0072,0706  ShowGrayscaleInverted              N
+  0072,0710  ShowImageTrueSizeFlag              N
+  0072,0712  ShowGraphicAnnotationFlag          N
+  0072,0714  ShowPatientDemographicsFlag        N
+  0072,0716  ShowAcquisitionTechniquesFlag      N
+  0072,0717  DisplaySetHorizontalJustification  N
+  0072,0718  DisplaySetVerticalJustification    N
+  0074,1000  UnifiedProcedureStepState          N
+  0074,1002  UPSProgressInformationSequence     N
+  0074,1004  UnifiedProcedureStepProgress       N
+  0074,1006  UnifiedProcedureStepProgressDescr  N
+  0074,1008  UnifiedProcedureStepComURISeq      N
+  0074,100a  ContactURI                         N
+  0074,100c  ContactDisplayName                 N
+  0074,1020  BeamTaskSequence                   N
+  0074,1022  BeamTaskType                       N
+  0074,1024  BeamOrderIndex                     N
+  0074,1030  DeliveryVerificationImageSequence  N
+  0074,1032  VerificationImageTiming            N
+  0074,1034  DoubleExposureFlag                 N
+  0074,1036  DoubleExposureOrdering             N
+  0074,1038  DoubleExposureMeterset             N
+  0074,103A  DoubleExposureFieldDelta           N
+  0074,1040  RelatedReferenceRTImageSequence    N
+  0074,1042  GeneralMachineVerificationSequence N
+  0074,1044  ConventionalMachineVerificationSeq N
+  0074,1046  IonMachineVerificationSequence     N
+  0074,1048  FailedAttributesSequence           N
+  0074,104A  OverriddenAttributesSequence       N
+  0074,104C  ConventionalControlPointVerifySeq  N
+  0074,104E  IonControlPointVerificationSeq     N
+  0074,1050  AttributeOccurrenceSequence        N
+  0074,1052  AttributeOccurrencePointer         N
+  0074,1054  AttributeItemSelector              N
+  0074,1056  AttributeOccurrencePrivateCreator  N
+  0074,1200  ScheduledProcedureStepPriority     N
+  0074,1202  WorklistLabel                      N
+  0074,1204  ProcedureStepLabel                 N
+  0074,1210  ScheduledProcessingParametersSeq   N
+  0074,1212  PerformedProcessingParametersSeq   N
+  0074,1216  UPSPerformedProcedureSequence      N
+  0074,1220  RelatedProcedureStepSequence       N
+  0074,1222  ProcedureStepRelationshipType      N
+  0074,1230  DeletionLock                       N
+  0074,1234  ReceivingAE                        N
+  0074,1236  RequestingAE                       N
+  0074,1238  ReasonForCancellation              N
+  0074,1242  SCPStatus                          N
+  0074,1244  SubscriptionListStatus             N
+  0074,1246  UPSListStatus                      N
+  0088,0130  StorageMediaFileSetID              N
+  0088,0140  StorageMediaFileSetUID             N
+  0088,0200  IconImageSequence                  N
+  0088,0904  TopicTitle                         N
+  0088,0906  TopicSubject                       N
+  0088,0910  TopicAuthor                        N
+  0088,0912  TopicKeywords                      N
+  0100,0410  SOPInstanceStatus                  N
+  0100,0420  SOPAuthorizationDateAndTime        N
+  0100,0424  SOPAuthorizationComment            N
+  0100,0426  AuthorizationEquipmentCertNumber   N
+  0400,0005  MACIDNumber                        N
+  0400,0010  MACCalculationTransferSyntaxUID    N
+  0400,0015  MACAlgorithm                       N
+  0400,0020  DataElementsSigned                 N
+  0400,0100  DigitalSignatureUID                N
+  0400,0105  DigitalSignatureDateTime           N
+  0400,0110  CertificateType                    N
+  0400,0115  CertificateOfSigner                N
+  0400,0120  Signature                          N
+  0400,0305  CertifiedTimestampType             N
+  0400,0310  CertifiedTimestamp                 N
+  0400,0401  DigitalSignaturePurposeCodeSeq     N
+  0400,0402  ReferencedDigitalSignatureSeq      N
+  0400,0403  ReferencedSOPInstanceMACSeq        N
+  0400,0404  MAC                                N
+  0400,0500  EncryptedAttributesSequence        N
+  0400,0510  EncryptedContentTransferSyntaxUID  N
+  0400,0520  EncryptedContent                   N
+  0400,0550  ModifiedAttributesSequence         N
+  0400,0561  OriginalAttributesSequence         N
+  0400,0562  AttributeModificationDateTime      N
+  0400,0563  ModifyingSystem                    N
+  0400,0564  SourceOfPreviousValues             N
+  0400,0565  ReasonForTheAttributeModification  N
+  1000,xxx0  EscapeTriplet                      N
+  1000,xxx1  RunLengthTriplet                   N
+  1000,xxx2  HuffmanTableSize                   N
+  1000,xxx3  HuffmanTableTriplet                N
+  1000,xxx4  ShiftTableSize                     N
+  1000,xxx5  ShiftTableTriplet                  N
+  1010,xxxx  ZonalMap                           N
+  2000,0010  NumberOfCopies                     N
+  2000,001E  PrinterConfigurationSequence       N
+  2000,0020  PrintPriority                      N
+  2000,0030  MediumType                         N
+  2000,0040  FilmDestination                    N
+  2000,0050  FilmSessionLabel                   N
+  2000,0060  MemoryAllocation                   N
+  2000,0061  MaximumMemoryAllocation            N
+  2000,0062  ColorImagePrintingFlag             N
+  2000,0063  CollationFlag                      N
+  2000,0065  AnnotationFlag                     N
+  2000,0067  ImageOverlayFlag                   N
+  2000,0069  PresentationLUTFlag                N
+  2000,006A  ImageBoxPresentationLUTFlag        N
+  2000,00A0  MemoryBitDepth                     N
+  2000,00A1  PrintingBitDepth                   N
+  2000,00A2  MediaInstalledSequence             N
+  2000,00A4  OtherMediaAvailableSequence        N
+  2000,00A8  SupportedImageDisplayFormatSeq     N
+  2000,0500  ReferencedFilmBoxSequence          N
+  2000,0510  ReferencedStoredPrintSequence      N
+  2010,0010  ImageDisplayFormat                 N
+  2010,0030  AnnotationDisplayFormatID          N
+  2010,0040  FilmOrientation                    N
+  2010,0050  FilmSizeID                         N
+  2010,0052  PrinterResolutionID                N
+  2010,0054  DefaultPrinterResolutionID         N
+  2010,0060  MagnificationType                  N
+  2010,0080  SmoothingType                      N
+  2010,00A6  DefaultMagnificationType           N
+  2010,00A7  OtherMagnificationTypesAvailable   N
+  2010,00A8  DefaultSmoothingType               N
+  2010,00A9  OtherSmoothingTypesAvailable       N
+  2010,0100  BorderDensity                      N
+  2010,0110  EmptyImageDensity                  N
+  2010,0120  MinDensity                         N
+  2010,0130  MaxDensity                         N
+  2010,0140  Trim                               N
+  2010,0150  ConfigurationInformation           N
+  2010,0152  ConfigurationInformationDescr      N
+  2010,0154  MaximumCollatedFilms               N
+  2010,015E  Illumination                       N
+  2010,0160  ReflectedAmbientLight              N
+  2010,0376  PrinterPixelSpacing                N
+  2010,0500  ReferencedFilmSessionSequence      N
+  2010,0510  ReferencedImageBoxSequence         N
+  2010,0520  ReferencedBasicAnnotationBoxSeq    N
+  2020,0010  ImageBoxPosition                   N
+  2020,0020  Polarity                           N
+  2020,0030  RequestedImageSize                 N
+  2020,0040  RequestedDecimate-CropBehavior     N
+  2020,0050  RequestedResolutionID              N
+  2020,00A0  RequestedImageSizeFlag             N
+  2020,00A2  DecimateCropResult                 N
+  2020,0110  BasicGrayscaleImageSequence        N
+  2020,0111  BasicColorImageSequence            N
+  2020,0130  ReferencedImageOverlayBoxSequence  N
+  2020,0140  ReferencedVOILUTBoxSequence        N
+  2030,0010  AnnotationPosition                 N
+  2030,0020  TextString                         N
+  2040,0010  ReferencedOverlayPlaneSequence     N
+  2040,0011  ReferencedOverlayPlaneGroups       N
+  2040,0020  OverlayPixelDataSequence           N
+  2040,0060  OverlayMagnificationType           N
+  2040,0070  OverlaySmoothingType               N
+  2040,0072  OverlayOrImageMagnification        N
+  2040,0074  MagnifyToNumberOfColumns           N
+  2040,0080  OverlayForegroundDensity           N
+  2040,0082  OverlayBackgroundDensity           N
+  2040,0090  OverlayMode                        N
+  2040,0100  ThresholdDensity                   N
+  2040,0500  ReferencedImageBoxSequence         N
+  2050,0010  PresentationLUTSequence            N
+  2050,0020  PresentationLUTShape               N
+  2050,0500  ReferencedPresentationLUTSequence  N
+  2100,0010  PrintJobID                         N
+  2100,0020  ExecutionStatus                    N
+  2100,0030  ExecutionStatusInfo                N
+  2100,0040  CreationDate                       N
+  2100,0050  CreationTime                       N
+  2100,0070  Originator                         N
+  2100,0140  DestinationAE                      N
+  2100,0160  OwnerID                            N
+  2100,0170  NumberOfFilms                      N
+  2100,0500  ReferencedPrintJobSequence         N
+  2110,0010  PrinterStatus                      N
+  2110,0020  PrinterStatusInfo                  N
+  2110,0030  PrinterName                        N
+  2110,0099  PrintQueueID                       N
+  2120,0010  QueueStatus                        N
+  2120,0050  PrintJobDescriptionSequence        N
+  2120,0070  ReferencedPrintJobSequence         N
+  2130,0010  PrintManagementCapabilitiesSeq     N
+  2130,0015  PrinterCharacteristicsSequence     N
+  2130,0030  FilmBoxContentSequence             N
+  2130,0040  ImageBoxContentSequence            N
+  2130,0050  AnnotationContentSequence          N
+  2130,0060  ImageOverlayBoxContentSequence     N
+  2130,0080  PresentationLUTContentSequence     N
+  2130,00A0  ProposedStudySequence              N
+  2130,00C0  OriginalImageSequence              N
+  2200,0001  LabelFromInfoExtractedFromInstance N
+  2200,0002  LabelText                          N
+  2200,0003  LabelStyleSelection                N
+  2200,0004  MediaDisposition                   N
+  2200,0005  BarcodeValue                       N
+  2200,0006  BarcodeSymbology                   N
+  2200,0007  AllowMediaSplitting                N
+  2200,0008  IncludeNonDICOMObjects             N
+  2200,0009  IncludeDisplayApplication          N
+  2200,000A  SaveCompInstancesAfterMediaCreate  N
+  2200,000B  TotalNumberMediaPiecesCreated      N
+  2200,000C  RequestedMediaApplicationProfile   N
+  2200,000D  ReferencedStorageMediaSequence     N
+  2200,000E  FailureAttributes                  N
+  2200,000F  AllowLossyCompression              N
+  2200,0020  RequestPriority                    N
+  3002,0002  RTImageLabel                       N
+  3002,0003  RTImageName                        N
+  3002,0004  RTImageDescription                 N
+  3002,000A  ReportedValuesOrigin               N
+  3002,000C  RTImagePlane                       N
+  3002,000D  XRayImageReceptorTranslation       N
+  3002,000E  XRayImageReceptorAngle             N
+  3002,0010  RTImageOrientation                 N
+  3002,0011  ImagePlanePixelSpacing             N
+  3002,0012  RTImagePosition                    N
+  3002,0020  RadiationMachineName               N
+  3002,0022  RadiationMachineSAD                N
+  3002,0024  RadiationMachineSSD                N
+  3002,0026  RTImageSID                         N
+  3002,0028  SourceToReferenceObjectDistance    N
+  3002,0029  FractionNumber                     N
+  3002,0030  ExposureSequence                   N
+  3002,0032  MetersetExposure                   N
+  3002,0034  DiaphragmPosition                  N
+  3002,0040  FluenceMapSequence                 N
+  3002,0041  FluenceDataSource                  N
+  3002,0042  FluenceDataScale                   N
+  3002,0051  FluenceMode                        N
+  3002,0052  FluenceModeID                      N
+  3004,0001  DVHType                            N
+  3004,0002  DoseUnits                          N
+  3004,0004  DoseType                           N
+  3004,0006  DoseComment                        N
+  3004,0008  NormalizationPoint                 N
+  3004,000A  DoseSummationType                  N
+  3004,000C  GridFrameOffsetVector              N
+  3004,000E  DoseGridScaling                    N
+  3004,0010  RTDoseROISequence                  N
+  3004,0012  DoseValue                          N
+  3004,0014  TissueHeterogeneityCorrection      N
+  3004,0040  DVHNormalizationPoint              N
+  3004,0042  DVHNormalizationDoseValue          N
+  3004,0050  DVHSequence                        N
+  3004,0052  DVHDoseScaling                     N
+  3004,0054  DVHVolumeUnits                     N
+  3004,0056  DVHNumberOfBins                    N
+  3004,0058  DVHData                            N
+  3004,0060  DVHReferencedROISequence           N
+  3004,0062  DVHROIContributionType             N
+  3004,0070  DVHMinimumDose                     N
+  3004,0072  DVHMaximumDose                     N
+  3004,0074  DVHMeanDose                        N
+  3006,0002  StructureSetLabel                  N
+  3006,0004  StructureSetName                   N
+  3006,0006  StructureSetDescription            N
+  3006,0008  StructureSetDate                   N
+  3006,0009  StructureSetTime                   N
+  3006,0010  ReferencedFrameOfReferenceSequence N
+  3006,0012  RTReferencedStudySequence          N
+  3006,0014  RTReferencedSeriesSequence         N
+  3006,0016  ContourImageSequence               N
+  3006,0020  StructureSetROISequence            N
+  3006,0022  ROINumber                          N
+  3006,0024  ReferencedFrameOfReferenceUID      N
+  3006,0026  ROIName                            N
+  3006,0028  ROIDescription                     N
+  3006,002A  ROIDisplayColor                    N
+  3006,002C  ROIVolume                          N
+  3006,0030  RTRelatedROISequence               N
+  3006,0033  RTROIRelationship                  N
+  3006,0036  ROIGenerationAlgorithm             N
+  3006,0038  ROIGenerationDescription           N
+  3006,0039  ROIContourSequence                 N
+  3006,0040  ContourSequence                    N
+  3006,0042  ContourGeometricType               N
+  3006,0044  ContourSlabThickness               N
+  3006,0045  ContourOffsetVector                N
+  3006,0046  NumberOfContourPoints              N
+  3006,0048  ContourNumber                      N
+  3006,0049  AttachedContours                   N
+  3006,0050  ContourData                        N
+  3006,0080  RTROIObservationsSequence          N
+  3006,0082  ObservationNumber                  N
+  3006,0084  ReferencedROINumber                N
+  3006,0085  ROIObservationLabel                N
+  3006,0086  RTROIIdentificationCodeSequence    N
+  3006,0088  ROIObservationDescription          N
+  3006,00A0  RelatedRTROIObservationsSequence   N
+  3006,00A4  RTROIInterpretedType               N
+  3006,00A6  ROIInterpreter                     N
+  3006,00B0  ROIPhysicalPropertiesSequence      N
+  3006,00B2  ROIPhysicalProperty                N
+  3006,00B4  ROIPhysicalPropertyValue           N
+  3006,00B6  ROIElementalCompositionSequence    N
+  3006,00B7  ROIElementalCompAtomicNumber       N
+  3006,00B8  ROIElementalCompAtomicMassFraction N
+  3006,00C0  FrameOfReferenceRelationshipSeq    N
+  3006,00C2  RelatedFrameOfReferenceUID         N
+  3006,00C4  FrameOfReferenceTransformType      N
+  3006,00C6  FrameOfReferenceTransformMatrix    N
+  3006,00C8  FrameOfReferenceTransformComment   N
+  3008,0010  MeasuredDoseReferenceSequence      N
+  3008,0012  MeasuredDoseDescription            N
+  3008,0014  MeasuredDoseType                   N
+  3008,0016  MeasuredDoseValue                  N
+  3008,0020  TreatmentSessionBeamSequence       N
+  3008,0021  TreatmentSessionIonBeamSequence    N
+  3008,0022  CurrentFractionNumber              N
+  3008,0024  TreatmentControlPointDate          N
+  3008,0025  TreatmentControlPointTime          N
+  3008,002A  TreatmentTerminationStatus         N
+  3008,002B  TreatmentTerminationCode           N
+  3008,002C  TreatmentVerificationStatus        N
+  3008,0030  ReferencedTreatmentRecordSequence  N
+  3008,0032  SpecifiedPrimaryMeterset           N
+  3008,0033  SpecifiedSecondaryMeterset         N
+  3008,0036  DeliveredPrimaryMeterset           N
+  3008,0037  DeliveredSecondaryMeterset         N
+  3008,003A  SpecifiedTreatmentTime             N
+  3008,003B  DeliveredTreatmentTime             N
+  3008,0040  ControlPointDeliverySequence       N
+  3008,0041  IonControlPointDeliverySequence    N
+  3008,0042  SpecifiedMeterset                  N
+  3008,0044  DeliveredMeterset                  N
+  3008,0045  MetersetRateSet                    N
+  3008,0046  MetersetRateDelivered              N
+  3008,0047  ScanSpotMetersetsDelivered         N
+  3008,0048  DoseRateDelivered                  N
+  3008,0050  TreatmentSummaryCalcDoseRefSeq     N
+  3008,0052  CumulativeDoseToDoseReference      N
+  3008,0054  FirstTreatmentDate                 N
+  3008,0056  MostRecentTreatmentDate            N
+  3008,005A  NumberOfFractionsDelivered         N
+  3008,0060  OverrideSequence                   N
+  3008,0061  ParameterSequencePointer           N
+  3008,0062  OverrideParameterPointer           N
+  3008,0063  ParameterItemIndex                 N
+  3008,0064  MeasuredDoseReferenceNumber        N
+  3008,0065  ParameterPointer                   N
+  3008,0066  OverrideReason                     N
+  3008,0068  CorrectedParameterSequence         N
+  3008,006A  CorrectionValue                    N
+  3008,0070  CalculatedDoseReferenceSequence    N
+  3008,0072  CalculatedDoseReferenceNumber      N
+  3008,0074  CalculatedDoseReferenceDescription N
+  3008,0076  CalculatedDoseReferenceDoseValue   N
+  3008,0078  StartMeterset                      N
+  3008,007A  EndMeterset                        N
+  3008,0080  ReferencedMeasuredDoseReferenceSeq N
+  3008,0082  ReferencedMeasuredDoseReferenceNum N
+  3008,0090  ReferencedCalculatedDoseRefSeq     N
+  3008,0092  ReferencedCalculatedDoseRefNumber  N
+  3008,00A0  BeamLimitingDeviceLeafPairsSeq     N
+  3008,00B0  RecordedWedgeSequence              N
+  3008,00C0  RecordedCompensatorSequence        N
+  3008,00D0  RecordedBlockSequence              N
+  3008,00E0  TreatmentSummaryMeasuredDoseRefSeq N
+  3008,00F0  RecordedSnoutSequence              N
+  3008,00F2  RecordedRangeShifterSequence       N
+  3008,00F4  RecordedLateralSpreadingDeviceSeq  N
+  3008,00F6  RecordedRangeModulatorSequence     N
+  3008,0100  RecordedSourceSequence             N
+  3008,0105  SourceSerialNumber                 N
+  3008,0110  TreatmentSessionAppSetupSeq        N
+  3008,0116  ApplicationSetupCheck              N
+  3008,0120  RecordedBrachyAccessoryDeviceSeq   N
+  3008,0122  ReferencedBrachyAccessoryDeviceNum N
+  3008,0130  RecordedChannelSequence            N
+  3008,0132  SpecifiedChannelTotalTime          N
+  3008,0134  DeliveredChannelTotalTime          N
+  3008,0136  SpecifiedNumberOfPulses            N
+  3008,0138  DeliveredNumberOfPulses            N
+  3008,013A  SpecifiedPulseRepetitionInterval   N
+  3008,013C  DeliveredPulseRepetitionInterval   N
+  3008,0140  RecordedSourceApplicatorSequence   N
+  3008,0142  ReferencedSourceApplicatorNumber   N
+  3008,0150  RecordedChannelShieldSequence      N
+  3008,0152  ReferencedChannelShieldNumber      N
+  3008,0160  BrachyControlPointDeliveredSeq     N
+  3008,0162  SafePositionExitDate               N
+  3008,0164  SafePositionExitTime               N
+  3008,0166  SafePositionReturnDate             N
+  3008,0168  SafePositionReturnTime             N
+  3008,0200  CurrentTreatmentStatus             N
+  3008,0202  TreatmentStatusComment             N
+  3008,0220  FractionGroupSummarySequence       N
+  3008,0223  ReferencedFractionNumber           N
+  3008,0224  FractionGroupType                  N
+  3008,0230  BeamStopperPosition                N
+  3008,0240  FractionStatusSummarySequence      N
+  3008,0250  TreatmentDate                      N
+  3008,0251  TreatmentTime                      N
+  300A,0002  RTPlanLabel                        N
+  300A,0003  RTPlanName                         N
+  300A,0004  RTPlanDescription                  N
+  300A,0006  RTPlanDate                         N
+  300A,0007  RTPlanTime                         N
+  300A,0009  TreatmentProtocols                 N
+  300A,000A  PlanIntent                         N
+  300A,000B  TreatmentSites                     N
+  300A,000C  RTPlanGeometry                     N
+  300A,000E  PrescriptionDescription            N
+  300A,0010  DoseReferenceSequence              N
+  300A,0012  DoseReferenceNumber                N
+  300A,0013  DoseReferenceUID                   N
+  300A,0014  DoseReferenceStructureType         N
+  300A,0015  NominalBeamEnergyUnit              N
+  300A,0016  DoseReferenceDescription           N
+  300A,0018  DoseReferencePointCoordinates      N
+  300A,001A  NominalPriorDose                   N
+  300A,0020  DoseReferenceType                  N
+  300A,0021  ConstraintWeight                   N
+  300A,0022  DeliveryWarningDose                N
+  300A,0023  DeliveryMaximumDose                N
+  300A,0025  TargetMinimumDose                  N
+  300A,0026  TargetPrescriptionDose             N
+  300A,0027  TargetMaximumDose                  N
+  300A,0028  TargetUnderdoseVolumeFraction      N
+  300A,002A  OrganAtRiskFullVolumeDose          N
+  300A,002B  OrganAtRiskLimitDose               N
+  300A,002C  OrganAtRiskMaximumDose             N
+  300A,002D  OrganAtRiskOverdoseVolumeFraction  N
+  300A,0040  ToleranceTableSequence             N
+  300A,0042  ToleranceTableNumber               N
+  300A,0043  ToleranceTableLabel                N
+  300A,0044  GantryAngleTolerance               N
+  300A,0046  BeamLimitingDeviceAngleTolerance   N
+  300A,0048  BeamLimitingDeviceToleranceSeq     N
+  300A,004A  BeamLimitingDevicePositionTol      N
+  300A,004B  SnoutPositionTolerance             N
+  300A,004C  PatientSupportAngleTolerance       N
+  300A,004E  TableTopEccentricAngleTolerance    N
+  300A,004F  TableTopPitchAngleTolerance        N
+  300A,0050  TableTopRollAngleTolerance         N
+  300A,0051  TableTopVerticalPositionTolerance  N
+  300A,0052  TableTopLongitudinalPositionTol    N
+  300A,0053  TableTopLateralPositionTolerance   N
+  300A,0055  RTPlanRelationship                 N
+  300A,0070  FractionGroupSequence              N
+  300A,0071  FractionGroupNumber                N
+  300A,0072  FractionGroupDescription           N
+  300A,0078  NumberOfFractionsPlanned           N
+  300A,0079  NumberFractionPatternDigitsPerDay  N
+  300A,007A  RepeatFractionCycleLength          N
+  300A,007B  FractionPattern                    N
+  300A,0080  NumberOfBeams                      N
+  300A,0082  BeamDoseSpecificationPoint         N
+  300A,0084  BeamDose                           N
+  300A,0086  BeamMeterset                       N
+  300A,0088  BeamDosePointDepth                 N
+  300A,0089  BeamDosePointEquivalentDepth       N
+  300A,008A  BeamDosePointSSD                   N
+  300A,00A0  NumberOfBrachyApplicationSetups    N
+  300A,00A2  BrachyAppSetupDoseSpecPoint        N
+  300A,00A4  BrachyApplicationSetupDose         N
+  300A,00B0  BeamSequence                       N
+  300A,00B2  TreatmentMachineName               N
+  300A,00B3  PrimaryDosimeterUnit               N
+  300A,00B4  SourceAxisDistance                 N
+  300A,00B6  BeamLimitingDeviceSequence         N
+  300A,00B8  RTBeamLimitingDeviceType           N
+  300A,00BA  SourceToBeamLimitingDeviceDistance N
+  300A,00BB  IsocenterToBeamLimitingDeviceDist  N
+  300A,00BC  NumberOfLeafJawPairs               N
+  300A,00BE  LeafPositionBoundaries             N
+  300A,00C0  BeamNumber                         N
+  300A,00C2  BeamName                           N
+  300A,00C3  BeamDescription                    N
+  300A,00C4  BeamType                           N
+  300A,00C6  RadiationType                      N
+  300A,00C7  HighDoseTechniqueType              N
+  300A,00C8  ReferenceImageNumber               N
+  300A,00CA  PlannedVerificationImageSequence   N
+  300A,00CC  ImagingDeviceSpecificAcqParams     N
+  300A,00CE  TreatmentDeliveryType              N
+  300A,00D0  NumberOfWedges                     N
+  300A,00D1  WedgeSequence                      N
+  300A,00D2  WedgeNumber                        N
+  300A,00D3  WedgeType                          N
+  300A,00D4  WedgeID                            N
+  300A,00D5  WedgeAngle                         N
+  300A,00D6  WedgeFactor                        N
+  300A,00D7  TotalWedgeTrayWaterEquivThickness  N
+  300A,00D8  WedgeOrientation                   N
+  300A,00D9  IsocenterToWedgeTrayDistance       N
+  300A,00DA  SourceToWedgeTrayDistance          N
+  300A,00DB  WedgeThinEdgePosition              N
+  300A,00DC  BolusID                            N
+  300A,00DD  BolusDescription                   N
+  300A,00E0  NumberOfCompensators               N
+  300A,00E1  MaterialID                         N
+  300A,00E2  TotalCompensatorTrayFactor         N
+  300A,00E3  CompensatorSequence                N
+  300A,00E4  CompensatorNumber                  N
+  300A,00E5  CompensatorID                      N
+  300A,00E6  SourceToCompensatorTrayDistance    N
+  300A,00E7  CompensatorRows                    N
+  300A,00E8  CompensatorColumns                 N
+  300A,00E9  CompensatorPixelSpacing            N
+  300A,00EA  CompensatorPosition                N
+  300A,00EB  CompensatorTransmissionData        N
+  300A,00EC  CompensatorThicknessData           N
+  300A,00ED  NumberOfBoli                       N
+  300A,00EE  CompensatorType                    N
+  300A,00F0  NumberOfBlocks                     N
+  300A,00F2  TotalBlockTrayFactor               N
+  300A,00F3  TotalBlockTrayWaterEquivThickness  N
+  300A,00F4  BlockSequence                      N
+  300A,00F5  BlockTrayID                        N
+  300A,00F6  SourceToBlockTrayDistance          N
+  300A,00F7  IsocenterToBlockTrayDistance       N
+  300A,00F8  BlockType                          N
+  300A,00F9  AccessoryCode                      N
+  300A,00FA  BlockDivergence                    N
+  300A,00FB  BlockMountingPosition              N
+  300A,00FC  BlockNumber                        N
+  300A,00FE  BlockName                          N
+  300A,0100  BlockThickness                     N
+  300A,0102  BlockTransmission                  N
+  300A,0104  BlockNumberOfPoints                N
+  300A,0106  BlockData                          N
+  300A,0107  ApplicatorSequence                 N
+  300A,0108  ApplicatorID                       N
+  300A,0109  ApplicatorType                     N
+  300A,010A  ApplicatorDescription              N
+  300A,010C  CumulativeDoseReferenceCoefficient N
+  300A,010E  FinalCumulativeMetersetWeight      N
+  300A,0110  NumberOfControlPoints              N
+  300A,0111  ControlPointSequence               N
+  300A,0112  ControlPointIndex                  N
+  300A,0114  NominalBeamEnergy                  N
+  300A,0115  DoseRateSet                        N
+  300A,0116  WedgePositionSequence              N
+  300A,0118  WedgePosition                      N
+  300A,011A  BeamLimitingDevicePositionSequence N
+  300A,011C  LeafJawPositions                   N
+  300A,011E  GantryAngle                        N
+  300A,011F  GantryRotationDirection            N
+  300A,0120  BeamLimitingDeviceAngle            N
+  300A,0121  BeamLimitingDeviceRotateDirection  N
+  300A,0122  PatientSupportAngle                N
+  300A,0123  PatientSupportRotationDirection    N
+  300A,0124  TableTopEccentricAxisDistance      N
+  300A,0125  TableTopEccentricAngle             N
+  300A,0126  TableTopEccentricRotateDirection   N
+  300A,0128  TableTopVerticalPosition           N
+  300A,0129  TableTopLongitudinalPosition       N
+  300A,012A  TableTopLateralPosition            N
+  300A,012C  IsocenterPosition                  N
+  300A,012E  SurfaceEntryPoint                  N
+  300A,0130  SourceToSurfaceDistance            N
+  300A,0134  CumulativeMetersetWeight           N
+  300A,0140  TableTopPitchAngle                 N
+  300A,0142  TableTopPitchRotationDirection     N
+  300A,0144  TableTopRollAngle                  N
+  300A,0146  TableTopRollRotationDirection      N
+  300A,0148  HeadFixationAngle                  N
+  300A,014A  GantryPitchAngle                   N
+  300A,014C  GantryPitchRotationDirection       N
+  300A,014E  GantryPitchAngleTolerance          N
+  300A,0180  PatientSetupSequence               N
+  300A,0182  PatientSetupNumber                 N
+  300A,0183  PatientSetupLabel                  N
+  300A,0184  PatientAdditionalPosition          N
+  300A,0190  FixationDeviceSequence             N
+  300A,0192  FixationDeviceType                 N
+  300A,0194  FixationDeviceLabel                N
+  300A,0196  FixationDeviceDescription          N
+  300A,0198  FixationDevicePosition             N
+  300A,0199  FixationDevicePitchAngle           N
+  300A,019A  FixationDeviceRollAngle            N
+  300A,01A0  ShieldingDeviceSequence            N
+  300A,01A2  ShieldingDeviceType                N
+  300A,01A4  ShieldingDeviceLabel               N
+  300A,01A6  ShieldingDeviceDescription         N
+  300A,01A8  ShieldingDevicePosition            N
+  300A,01B0  SetupTechnique                     N
+  300A,01B2  SetupTechniqueDescription          N
+  300A,01B4  SetupDeviceSequence                N
+  300A,01B6  SetupDeviceType                    N
+  300A,01B8  SetupDeviceLabel                   N
+  300A,01BA  SetupDeviceDescription             N
+  300A,01BC  SetupDeviceParameter               N
+  300A,01D0  SetupReferenceDescription          N
+  300A,01D2  TableTopVerticalSetupDisplacement  N
+  300A,01D4  TableTopLongitudinalSetupDisplace  N
+  300A,01D6  TableTopLateralSetupDisplacement   N
+  300A,0200  BrachyTreatmentTechnique           N
+  300A,0202  BrachyTreatmentType                N
+  300A,0206  TreatmentMachineSequence           N
+  300A,0210  SourceSequence                     N
+  300A,0212  SourceNumber                       N
+  300A,0214  SourceType                         N
+  300A,0216  SourceManufacturer                 N
+  300A,0218  ActiveSourceDiameter               N
+  300A,021A  ActiveSourceLength                 N
+  300A,0222  SourceEncapsulationNomThickness    N
+  300A,0224  SourceEncapsulationNomTransmission N
+  300A,0226  SourceIsotopeName                  N
+  300A,0228  SourceIsotopeHalfLife              N
+  300A,0229  SourceStrengthUnits                N
+  300A,022A  ReferenceAirKermaRate              N
+  300A,022B  SourceStrength                     N
+  300A,022C  SourceStrengthReferenceDate        N
+  300A,022E  SourceStrengthReferenceTime        N
+  300A,0230  ApplicationSetupSequence           N
+  300A,0232  ApplicationSetupType               N
+  300A,0234  ApplicationSetupNumber             N
+  300A,0236  ApplicationSetupName               N
+  300A,0238  ApplicationSetupManufacturer       N
+  300A,0240  TemplateNumber                     N
+  300A,0242  TemplateType                       N
+  300A,0244  TemplateName                       N
+  300A,0250  TotalReferenceAirKerma             N
+  300A,0260  BrachyAccessoryDeviceSequence      N
+  300A,0262  BrachyAccessoryDeviceNumber        N
+  300A,0263  BrachyAccessoryDeviceID            N
+  300A,0264  BrachyAccessoryDeviceType          N
+  300A,0266  BrachyAccessoryDeviceName          N
+  300A,026A  BrachyAccessoryDeviceNomThickness  N
+  300A,026C  BrachyAccessoryDevNomTransmission  N
+  300A,0280  ChannelSequence                    N
+  300A,0282  ChannelNumber                      N
+  300A,0284  ChannelLength                      N
+  300A,0286  ChannelTotalTime                   N
+  300A,0288  SourceMovementType                 N
+  300A,028A  NumberOfPulses                     N
+  300A,028C  PulseRepetitionInterval            N
+  300A,0290  SourceApplicatorNumber             N
+  300A,0291  SourceApplicatorID                 N
+  300A,0292  SourceApplicatorType               N
+  300A,0294  SourceApplicatorName               N
+  300A,0296  SourceApplicatorLength             N
+  300A,0298  SourceApplicatorManufacturer       N
+  300A,029C  SourceApplicatorWallNomThickness   N
+  300A,029E  SourceApplicatorWallNomTrans       N
+  300A,02A0  SourceApplicatorStepSize           N
+  300A,02A2  TransferTubeNumber                 N
+  300A,02A4  TransferTubeLength                 N
+  300A,02B0  ChannelShieldSequence              N
+  300A,02B2  ChannelShieldNumber                N
+  300A,02B3  ChannelShieldID                    N
+  300A,02B4  ChannelShieldName                  N
+  300A,02B8  ChannelShieldNominalThickness      N
+  300A,02BA  ChannelShieldNominalTransmission   N
+  300A,02C8  FinalCumulativeTimeWeight          N
+  300A,02D0  BrachyControlPointSequence         N
+  300A,02D2  ControlPointRelativePosition       N
+  300A,02D4  ControlPoint3DPosition             N
+  300A,02D6  CumulativeTimeWeight               N
+  300A,02E0  CompensatorDivergence              N
+  300A,02E1  CompensatorMountingPosition        N
+  300A,02E2  SourceToCompensatorDistance        N
+  300A,02E3  TotalCompTrayWaterEquivThickness   N
+  300A,02E4  IsocenterToCompensatorTrayDistance N
+  300A,02E5  CompensatorColumnOffset            N
+  300A,02E6  IsocenterToCompensatorDistances    N
+  300A,02E7  CompensatorRelStoppingPowerRatio   N
+  300A,02E8  CompensatorMillingToolDiameter     N
+  300A,02EA  IonRangeCompensatorSequence        N
+  300A,02EB  CompensatorDescription             N
+  300A,0302  RadiationMassNumber                N
+  300A,0304  RadiationAtomicNumber              N
+  300A,0306  RadiationChargeState               N
+  300A,0308  ScanMode                           N
+  300A,030A  VirtualSourceAxisDistances         N
+  300A,030C  SnoutSequence                      N
+  300A,030D  SnoutPosition                      N
+  300A,030F  SnoutID                            N
+  300A,0312  NumberOfRangeShifters              N
+  300A,0314  RangeShifterSequence               N
+  300A,0316  RangeShifterNumber                 N
+  300A,0318  RangeShifterID                     N
+  300A,0320  RangeShifterType                   N
+  300A,0322  RangeShifterDescription            N
+  300A,0330  NumberOfLateralSpreadingDevices    N
+  300A,0332  LateralSpreadingDeviceSequence     N
+  300A,0334  LateralSpreadingDeviceNumber       N
+  300A,0336  LateralSpreadingDeviceID           N
+  300A,0338  LateralSpreadingDeviceType         N
+  300A,033A  LateralSpreadingDeviceDescription  N
+  300A,033C  LateralSpreadingDevWaterEquivThick N
+  300A,0340  NumberOfRangeModulators            N
+  300A,0342  RangeModulatorSequence             N
+  300A,0344  RangeModulatorNumber               N
+  300A,0346  RangeModulatorID                   N
+  300A,0348  RangeModulatorType                 N
+  300A,034A  RangeModulatorDescription          N
+  300A,034C  BeamCurrentModulationID            N
+  300A,0350  PatientSupportType                 N
+  300A,0352  PatientSupportID                   N
+  300A,0354  PatientSupportAccessoryCode        N
+  300A,0356  FixationLightAzimuthalAngle        N
+  300A,0358  FixationLightPolarAngle            N
+  300A,035A  MetersetRate                       N
+  300A,0360  RangeShifterSettingsSequence       N
+  300A,0362  RangeShifterSetting                N
+  300A,0364  IsocenterToRangeShifterDistance    N
+  300A,0366  RangeShifterWaterEquivThickness    N
+  300A,0370  LateralSpreadingDeviceSettingsSeq  N
+  300A,0372  LateralSpreadingDeviceSetting      N
+  300A,0374  IsocenterToLateralSpreadingDevDist N
+  300A,0380  RangeModulatorSettingsSequence     N
+  300A,0382  RangeModulatorGatingStartValue     N
+  300A,0384  RangeModulatorGatingStopValue      N
+  300A,038A  IsocenterToRangeModulatorDistance  N
+  300A,0390  ScanSpotTuneID                     N
+  300A,0392  NumberOfScanSpotPositions          N
+  300A,0394  ScanSpotPositionMap                N
+  300A,0396  ScanSpotMetersetWeights            N
+  300A,0398  ScanningSpotSize                   N
+  300A,039A  NumberOfPaintings                  N
+  300A,03A0  IonToleranceTableSequence          N
+  300A,03A2  IonBeamSequence                    N
+  300A,03A4  IonBeamLimitingDeviceSequence      N
+  300A,03A6  IonBlockSequence                   N
+  300A,03A8  IonControlPointSequence            N
+  300A,03AA  IonWedgeSequence                   N
+  300A,03AC  IonWedgePositionSequence           N
+  300A,0401  ReferencedSetupImageSequence       N
+  300A,0402  SetupImageComment                  N
+  300A,0410  MotionSynchronizationSequence      N
+  300A,0412  ControlPointOrientation            N
+  300A,0420  GeneralAccessorySequence           N
+  300A,0421  GeneralAccessoryID                 N
+  300A,0422  GeneralAccessoryDescription        N
+  300A,0423  GeneralAccessoryType               N
+  300A,0424  GeneralAccessoryNumber             N
+  300C,0002  ReferencedRTPlanSequence           N
+  300C,0004  ReferencedBeamSequence             N
+  300C,0006  ReferencedBeamNumber               N
+  300C,0007  ReferencedReferenceImageNumber     N
+  300C,0008  StartCumulativeMetersetWeight      N
+  300C,0009  EndCumulativeMetersetWeight        N
+  300C,000A  ReferencedBrachyAppSetupSeq        N
+  300C,000C  ReferencedBrachyAppSetupNumber     N
+  300C,000E  ReferencedSourceNumber             N
+  300C,0020  ReferencedFractionGroupSequence    N
+  300C,0022  ReferencedFractionGroupNumber      N
+  300C,0040  ReferencedVerificationImageSeq     N
+  300C,0042  ReferencedReferenceImageSequence   N
+  300C,0050  ReferencedDoseReferenceSequence    N
+  300C,0051  ReferencedDoseReferenceNumber      N
+  300C,0055  BrachyReferencedDoseReferenceSeq   N
+  300C,0060  ReferencedStructureSetSequence     N
+  300C,006A  ReferencedPatientSetupNumber       N
+  300C,0080  ReferencedDoseSequence             N
+  300C,00A0  ReferencedToleranceTableNumber     N
+  300C,00B0  ReferencedBolusSequence            N
+  300C,00C0  ReferencedWedgeNumber              N
+  300C,00D0  ReferencedCompensatorNumber        N
+  300C,00E0  ReferencedBlockNumber              N
+  300C,00F0  ReferencedControlPointIndex        N
+  300C,00F2  ReferencedControlPointSequence     N
+  300C,00F4  ReferencedStartControlPointIndex   N
+  300C,00F6  ReferencedStopControlPointIndex    N
+  300C,0100  ReferencedRangeShifterNumber       N
+  300C,0102  ReferencedLateralSpreadingDevNum   N
+  300C,0104  ReferencedRangeModulatorNumber     N
+  300E,0002  ApprovalStatus                     N
+  300E,0004  ReviewDate                         N
+  300E,0005  ReviewTime                         N
+  300E,0008  ReviewerName                       N
+  4000,0000  TextGroupLength                    N
+  4000,0010  Arbitrary                          N
+  4000,4000  TextComments                       N
+  4008,0040  ResultsID                          N
+  4008,0042  ResultsIDIssuer                    N
+  4008,0050  ReferencedInterpretationSequence   N
+  4008,0100  InterpretationRecordedDate         N
+  4008,0101  InterpretationRecordedTime         N
+  4008,0102  InterpretationRecorder             N
+  4008,0103  ReferenceToRecordedSound           N
+  4008,0108  InterpretationTranscriptionDate    N
+  4008,0109  InterpretationTranscriptionTime    N
+  4008,010A  InterpretationTranscriber          N
+  4008,010B  InterpretationText                 N
+  4008,010C  InterpretationAuthor               N
+  4008,0111  InterpretationApproverSequence     N
+  4008,0112  InterpretationApprovalDate         N
+  4008,0113  InterpretationApprovalTime         N
+  4008,0114  PhysicianApprovingInterpretation   N
+  4008,0115  InterpretationDiagnosisDescription N
+  4008,0117  InterpretationDiagnosisCodeSeq     N
+  4008,0118  ResultsDistributionListSequence    N
+  4008,0119  DistributionName                   N
+  4008,011A  DistributionAddress                N
+  4008,0200  InterpretationID                   N
+  4008,0202  InterpretationIDIssuer             N
+  4008,0210  InterpretationTypeID               N
+  4008,0212  InterpretationStatusID             N
+  4008,0300  Impressions                        N
+  4008,4000  ResultsComments                    N
+  4FFE,0001  MACParametersSequence              N
+  50xx,0005  CurveDimensions                    N
+  50xx,0010  NumberOfPoints                     N
+  50xx,0020  TypeOfData                         N
+  50xx,0022  CurveDescription                   N
+  50xx,0030  AxisUnits                          N
+  50xx,0040  AxisLabels                         N
+  50xx,0103  DataValueRepresentation            N
+  50xx,0104  MinimumCoordinateValue             N
+  50xx,0105  MaximumCoordinateValue             N
+  50xx,0106  CurveRange                         N
+  50xx,0110  CurveDataDescriptor                N
+  50xx,0112  CoordinateStartValue               N
+  50xx,0114  CoordinateStepValue                N
+  50xx,1001  CurveActivationLayer               N
+  50xx,2000  AudioType                          N
+  50xx,2002  AudioSampleFormat                  N
+  50xx,2004  NumberOfChannels                   N
+  50xx,2006  NumberOfSamples                    N
+  50xx,2008  SampleRate                         N
+  50xx,200A  TotalTime                          N
+  50xx,200C  AudioSampleData                    N
+  50xx,200E  AudioComments                      N
+  50xx,2500  CurveLabel                         N
+  50xx,2600  ReferencedOverlaySequence          N
+  50xx,2610  ReferencedOverlayGroup             N
+  50xx,3000  CurveData                          N
+  5200,9229  SharedFunctionalGroupsSequence     N
+  5200,9230  PerFrameFunctionalGroupsSequence   N
+  5400,0100  WaveformSequence                   N
+  5400,0110  ChannelMinimumValue                N
+  5400,0112  ChannelMaximumValue                N
+  5400,1004  WaveformBitsAllocated              N
+  5400,1006  WaveformSampleInterpretation       N
+  5400,100A  WaveformPaddingValue               N
+  5400,1010  WaveformData                       N
+  5600,0010  FirstOrderPhaseCorrectionAngle     N
+  5600,0020  SpectroscopyData                   N
+  6000,0000  OverlayGroupLength                 N
+  60xx,0010  OverlayRows                        N
+  60xx,0011  OverlayColumns                     N
+  60xx,0012  OverlayPlanes                      N
+  60xx,0015  NumberOfFramesInOverlay            N
+  60xx,0022  OverlayDescription                 N
+  60xx,0040  OverlayType                        N
+  60xx,0045  OverlaySubtype                     N
+  60xx,0050  OverlayOrigin                      N
+  60xx,0051  ImageFrameOrigin                   N
+  60xx,0052  OverlayPlaneOrigin                 N
+  60xx,0060  OverlayCompressionCode             N
+  60xx,0061  OverlayCompressionOriginator       N
+  60xx,0062  OverlayCompressionLabel            N
+  60xx,0063  OverlayCompressionDescription      N
+  60xx,0066  OverlayCompressionStepPointers     N
+  60xx,0068  OverlayRepeatInterval              N
+  60xx,0069  OverlayBitsGrouped                 N
+  60xx,0100  OverlayBitsAllocated               N
+  60xx,0102  OverlayBitPosition                 N
+  60xx,0110  OverlayFormat                      N
+  60xx,0200  OverlayLocation                    N
+  60xx,0800  OverlayCodeLabel                   N
+  60xx,0802  OverlayNumberOfTables              N
+  60xx,0803  OverlayCodeTableLocation           N
+  60xx,0804  OverlayBitsForCodeWord             N
+  60xx,1001  OverlayActivationLayer             N
+  60xx,1100  OverlayDescriptorGray              N
+  60xx,1101  OverlayDescriptorRed               N
+  60xx,1102  OverlayDescriptorGreen             N
+  60xx,1103  OverlayDescriptorBlue              N
+  60xx,1200  OverlaysGray                       N
+  60xx,1201  OverlaysRed                        N
+  60xx,1202  OverlaysGreen                      N
+  60xx,1203  OverlaysBlue                       N
+  60xx,1301  ROIArea                            N
+  60xx,1302  ROIMean                            N
+  60xx,1303  ROIStandardDeviation               N
+  60xx,1500  OverlayLabel                       N
+  60xx,3000  OverlayData                        N
+  60xx,4000  OverlayComments                    N
+  7Fxx,0000  PixelDataGroupLength               N
+  7Fxx,0010  PixelData                          N
+  7Fxx,0011  VariableNextDataGroup              N
+  7Fxx,0020  VariableCoefficientsSDVN           N
+  7Fxx,0030  VariableCoefficientsSDHN           N
+  7Fxx,0040  VariableCoefficientsSDDN           N
+  FFFA,FFFA  DigitalSignaturesSequence          N
+  FFFC,FFFC  DataSetTrailingPadding             N
+  FFFE,E000  StartOfItem                        N
+  FFFE,E00D  EndOfItems                         N
+  FFFE,E0DD  EndOfSequence                      N
+
+=head2 HTML Tags
+
+Meta information extracted from the header of HTML and XHTML files.  This is
+a mix of information found in the C<META> elements, C<XML> element, and the
+C<TITLE> element.
+
+  Tag ID                      Tag Name          Writable
+  ------                      --------          --------
+  'abstract'                  Abstract          N
+  'author'                    Author            N
+  'classification'            Classification    N
+  'copyright'                 Copyright         N
+  'dc'                        DC                HTML dc
+  'description'               Description       N
+  'distribution'              Distribution      N
+  'doc-class'                 DocClass          N
+  'doc-rights'                DocRights         N
+  'doc-type'                  DocType           N
+  'formatter'                 Formatter         N
+  'generator'                 Generator         N
+  'googlebot'                 GoogleBot         N
+  'http-equiv'                HTTP-equiv        HTML equiv
+  'keywords'                  Keywords          N+
+  'mssmarttagspreventparsing' NoMSSmartTags     N
+  'ncc'                       NCC               HTML ncc
+  'o'                         Office            HTML Office
+  'originator'                Originator        N
+  'owner'                     Owner             N
+  'prod'                      Prod              HTML prod
+  'progid'                    ProgID            N
+  'rating'                    Rating            N
+  'refresh'                   Refresh           N
+  'resource-type'             ResourceType      N
+  'revisit-after'             RevisitAfter      N
+  'robots'                    Robots            N+
+  'title'                     Title             N
+  'vw96'                      VW96              HTML vw96
+
+=head3 HTML dc Tags
+
+Dublin Core schema tags (also used in XMP).
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'contributor'        Contributor              N+
+  'coverage'           Coverage                 N
+  'creator'            Creator                  N+
+  'date'               Date                     N+
+  'description'        Description              N
+  'format'             Format                   N
+  'identifier'         Identifier               N
+  'language'           Language                 N+
+  'publisher'          Publisher                N+
+  'relation'           Relation                 N+
+  'rights'             Rights                   N
+  'source'             Source                   N
+  'subject'            Subject                  N+
+  'title'              Title                    N
+  'type'               Type                     N+
+
+=head3 HTML equiv Tags
+
+These tags have a family 1 group name of "HTTP-equiv".
+
+  Tag ID                Tag Name                Writable
+  ------                --------                --------
+  'cache-control'       CacheControl            N
+  'content-disposition' ContentDisposition      N
+  'content-language'    ContentLanguage         N
+  'content-script-type' ContentScriptType       N
+  'content-style-type'  ContentStyleType        N
+  'content-type'        ContentType             N
+  'default-style'       DefaultStyle            N
+  'expires'             Expires                 N
+  'ext-cache'           ExtCache                N
+  'imagetoolbar'        ImageToolbar            N
+  'lotus'               Lotus                   N
+  'page-enter'          PageEnter               N
+  'page-exit'           PageExit                N
+  'pics-label'          PicsLabel               N
+  'pragma'              Pragma                  N
+  'refresh'             Refresh                 N
+  'reply-to'            ReplyTo                 N
+  'set-cookie'          SetCookie               N
+  'site-enter'          SiteEnter               N
+  'site-exit'           SiteExit                N
+  'vary'                Vary                    N
+  'window-target'       WindowTarget            N
+
+=head3 HTML ncc Tags
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'charset'            CharacterSet             N
+  'depth'              Depth                    N
+  'files'              Files                    N
+  'footnotes'          Footnotes                N
+  'generator'          Generator                N
+  'kbytesize'          KByteSize                N
+  'maxpagenormal'      MaxPageNormal            N
+  'multimediatype'     MultimediaType           N
+  'narrator'           Narrator                 N
+  'pagefront'          PageFront                N
+  'pagenormal'         PageNormal               N
+  'pagespecial'        PageSpecial              N
+  'prodnotes'          ProdNotes                N
+  'produceddate'       ProducedDate             N
+  'producer'           Producer                 N
+  'revision'           Revision                 N
+  'revisiondate'       RevisionDate             N
+  'setinfo'            SetInfo                  N
+  'sidebars'           Sidebars                 N
+  'sourcedate'         SourceDate               N
+  'sourceedition'      SourceEdition            N
+  'sourcepublisher'    SourcePublisher          N
+  'sourcerights'       SourceRights             N
+  'sourcetitle'        SourceTitle              N
+  'tocitems'           TOCItems                 N
+  'totaltime'          Duration                 N
+
+=head3 HTML Office Tags
+
+Tags written by Microsoft Office applications.
+
+  Tag ID                 Tag Name               Writable
+  ------                 --------               --------
+  'Author'               Author                 N
+  'Category'             Category               N
+  'Characters'           Characters             N
+  'CharactersWithSpaces' CharactersWithSpaces   N
+  'Company'              Company                N
+  'Created'              CreateDate             N
+  'Description'          Description            N
+  'Keywords'             Keywords               N
+  'LastAuthor'           LastAuthor             N
+  'LastPrinted'          LastPrinted            N
+  'LastSaved'            ModifyDate             N
+  'Lines'                Lines                  N
+  'Manager'              Manager                N
+  'Pages'                Pages                  N
+  'Paragraphs'           Paragraphs             N
+  'Revision'             RevisionNumber         N
+  'Subject'              Subject                N
+  'Template'             Template               N
+  'TotalTime'            TotalEditTime          N
+  'Version'              RevisionNumber         N
+  'Words'                Words                  N
+
+=head3 HTML prod Tags
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'recengineer'        RecEngineer              N
+  'reclocation'        RecLocation              N
+
+=head3 HTML vw96 Tags
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'objecttype'         ObjectType               N
+
+=head2 EXE Tags
+
+This module extracts information from various types of Windows, MacOS and
+Unix executable and library files.  The first table below lists information
+extracted from the header of Windows PE (Portable Executable) EXE files and
+DLL libraries.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    MachineType                          N
+      2    TimeStamp                            N
+     10    PEType                               N
+     11    LinkerVersion                        N
+     12    CodeSize                             N
+     14    InitializedDataSize                  N
+     16    UninitializedDataSize                N
+     18    EntryPoint                           N
+     30    OSVersion                            N
+     32    ImageVersion                         N
+     34    SubsystemVersion                     N
+     44    Subsystem                            N
+
+=head3 EXE PEVersion Tags
+
+Information extracted from the VS_VERSION_INFO structure of Windows PE
+files.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      2    FileVersionNumber                    N
+      4    ProductVersionNumber                 N
+      6    FileFlagsMask                        N
+      7    FileFlags                            N
+      8    FileOS                               N
+      9    ObjectFileType                       N
+     10    FileSubtype                          N
+
+=head3 EXE PEString Tags
+
+Resource strings found in Windows PE files.  The B<TagID>'s are not shown
+because they are the same as the B<Tag Name>.  ExifTool will extract any
+existing StringFileInfo tags even if not listed in this table.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  BuildDate                                     N
+  BuildVersion                                  N
+  CharacterSet                                  N
+  Comments                                      N
+  CompanyName                                   N
+  Copyright                                     N
+  FileDescription                               N
+  FileVersion                                   N
+  InternalName                                  N
+  LanguageCode                                  N
+  LegalCopyright                                N
+  LegalTrademarks                               N
+  OriginalFilename                              N
+  PrivateBuild                                  N
+  ProductName                                   N
+  ProductVersion                                N
+  SpecialBuild                                  N
+
+=head3 EXE MachO Tags
+
+Information extracted from Mach-O (Mac OS X) executable files and DYLIB
+libraries.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    CPUArchitecture                      N
+      1    CPUByteOrder                         N
+      2    CPUCount                             N
+      3    CPUType                              N+
+      4    CPUSubtype                           N+
+      5    ObjectFileType                       N
+
+=head3 EXE PEF Tags
+
+Information extracted from PEF (Classic MacOS) executable files and
+libraries.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      2    CPUArchitecture                      N
+      3    PEFVersion                           N
+      4    TimeStamp                            N
+
+=head3 EXE ELF Tags
+
+Information extracted from ELF (Unix) executable files and SO libraries.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      4    CPUArchitecture                      N
+      5    CPUByteOrder                         N
+     16    ObjectFileType                       N
+     18    CPUType                              N
+
+=head2 LNK Tags
+
+Information extracted from MS Shell Link (Windows shortcut) files.
+
+   Index       Tag Name                         Writable
+   -----       --------                         --------
+         20    Flags                            N
+         24    FileAttributes                   N
+         28    CreateDate                       N
+         36    AccessDate                       N
+         44    ModifyDate                       N
+         52    TargetFileSize                   N
+         56    IconIndex                        N
+         60    RunWindow                        N
+         64    HotKey                           N
+  0x00010000   ItemID                           LNK ItemID
+  0x00020000   LinkInfo                         LNK LinkInfo
+  0x00030004   Description                      N
+  0x00030008   RelativePath                     N
+  0x00030010   WorkingDirectory                 N
+  0x00030020   CommandLineArguments             N
+  0x00030040   IconFileName                     N
+  0xa0000000   UnknownData                      LNK UnknownData
+  0xa0000001   EnvVarData                       LNK UnknownData
+  0xa0000002   ConsoleData                      LNK ConsoleData
+  0xa0000003   TrackerData                      LNK TrackerData
+  0xa0000004   ConsoleFEData                    LNK ConsoleFEData
+  0xa0000005   SpecialFolderData                LNK UnknownData
+  0xa0000006   DarwinData                       LNK UnknownData
+  0xa0000007   IconEnvData                      LNK UnknownData
+  0xa0000008   ShimData                         LNK UnknownData
+  0xa0000009   PropertyStoreData                LNK UnknownData
+  0xa000000b   KnownFolderData                  LNK UnknownData
+  0xa000000c   VistaIDListData                  LNK UnknownData
+
+=head3 LNK ItemID Tags
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0032   Item0032                             LNK Item0032
+
+=head3 LNK Item0032 Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+     14    TargetFileDOSName                    N
+
+=head3 LNK LinkInfo Tags
+
+  Tag Name                                      Writable
+  --------                                      --------
+  CommonNetworkRelLink                          N
+  CommonPathSuffix                              N
+  DeviceName                                    N
+  DriveSerialNumber                             N
+  DriveType                                     N
+  LocalBasePath                                 N
+  NetName                                       N
+  NetProviderType                               N
+  VolumeID                                      N
+  VolumeLabel                                   N
+
+=head3 LNK UnknownData Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+  [no tags known]
+
+=head3 LNK ConsoleData Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      8    FillAttributes                       N
+     10    PopupFillAttributes                  N
+     12    ScreenBufferSize                     N
+     16    WindowSize                           N
+     20    WindowOrigin                         N
+     32    FontSize                             N
+     36    FontFamily                           N
+     40    FontWeight                           N
+     44    FontName                             N
+    108    CursorSize                           N
+    112    FullScreen                           N
+    116    QuickEdit                            N
+    120    InsertMode                           N
+    124    WindowOriginAuto                     N
+    128    HistoryBufferSize                    N
+    132    NumHistoryBuffers                    N
+    136    RemoveHistoryDuplicates              N
+
+=head3 LNK TrackerData Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+     16    MachineID                            N
+
+=head3 LNK ConsoleFEData Tags
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      8    CodePage                             N
+
+=head2 Font Tags
+
+This table contains a collection of tags found in font files of various
+formats.  ExifTool current recognizes OTF, TTF, TTC, DFONT, PFA, PFB, PFM,
+AFM, ACFM and AMFM font files.
+
+  Tag ID       Tag Name                         Writable
+  ------       --------                         --------
+  'AFM'        AFM                              Font AFM
+  'PFM'        PFMHeader                        Font PFM
+  'PSInfo'     PSFontInfo                       Font PSInfo
+  'fontname'   FontName                         N
+  'name'       Name                             Font Name
+  'numfonts'   NumFonts                         N
+  'postfont'   PostScriptFontName               N
+
+=head3 Font AFM Tags
+
+Tags extracted from Adobe Font Metrics files (AFM, ACFM and AMFM).
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'Ascender'           Ascender                 N
+  'CapHeight'          CapHeight                N
+  'CharacterSet'       CharacterSet             N
+  'Characters'         Characters               N
+  'Creation Date'      CreateDate               N
+  'Descender'          Descender                N
+  'EncodingScheme'     EncodingScheme           N
+  'EscChar'            EscChar                  N
+  'FamilyName'         FontFamily               N
+  'FontName'           FontName                 N
+  'FullName'           FullName                 N
+  'IsBaseFont'         IsBaseFont               N
+  'IsFixedV'           IsFixedV                 N
+  'MappingScheme'      MappingScheme            N
+  'Notice'             Notice                   N
+  'Version'            Version                  N
+  'Weight'             Weight                   N
+  'XHeight'            XHeight                  N
+
+=head3 Font PFM Tags
+
+Tags extracted from the PFM file header.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    PFMVersion                           N
+      6    Copyright                            N
+     66    FontType                             N
+     68    PointSize                            N
+     70    YResolution                          N
+     72    XResolution                          N
+     74    Ascent                               N
+     76    InternalLeading                      N
+     78    ExternalLeading                      N
+     80    Italic                               N
+     81    Underline                            N
+     82    Strikeout                            N
+     83    Weight                               N
+     85    CharacterSet                         N
+     86    PixWidth                             N
+     88    PixHeight                            N
+     90    PitchAndFamily                       N
+     91    AvgWidth                             N
+     93    MaxWidth                             N
+     95    FirstChar                            N
+     96    LastChar                             N
+     97    DefaultChar                          N
+     98    BreakChar                            N
+     99    WidthBytes                           N
+
+=head3 Font PSInfo Tags
+
+Tags extracted from PostScript font files (PFA and PFB).
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'Copyright'          Copyright                N
+  'FSType'             FSType                   N
+  'FamilyName'         FontFamily               N
+  'FontName'           FontName                 N
+  'FontType'           FontType                 N
+  'FullName'           FullName                 N
+  'ItalicAngle'        ItalicAngle              N
+  'Notice'             Notice                   N
+  'UnderlinePosition'  UnderlinePosition        N
+  'UnderlineThickness' UnderlineThickness       N
+  'Weight'             Weight                   N
+  'isFixedPitch'       IsFixedPitch             N
+  'version'            Version                  N
+
+=head3 Font Name Tags
+
+The following tags are extracted from the TrueType font "name" table found
+in OTF, TTF, TTC and DFONT files.  These tags support localized languages by
+adding a hyphen followed by a language code to the end of the tag name (ie.
+"Copyright-fr" or "Licence-en-US").  Tags with no language code use the
+default language of "en".
+
+  Tag ID   Tag Name                             Writable
+  ------   --------                             --------
+  0x0000   Copyright                            N
+  0x0001   FontFamily                           N
+  0x0002   FontSubfamily                        N
+  0x0003   FontSubfamilyID                      N
+  0x0004   FontName                             N
+  0x0005   NameTableVersion                     N
+  0x0006   PostScriptFontName                   N
+  0x0007   Trademark                            N
+  0x0008   Manufacturer                         N
+  0x0009   Designer                             N
+  0x000a   Description                          N
+  0x000b   VendorURL                            N
+  0x000c   DesignerURL                          N
+  0x000d   License                              N
+  0x000e   LicenseInfoURL                       N
+  0x0010   PreferredFamily                      N
+  0x0011   PreferredSubfamily                   N
+  0x0012   CompatibleFontName                   N
+  0x0013   SampleText                           N
+  0x0014   PostScriptFontName                   N
+  0x0015   WWSFamilyName                        N
+  0x0016   WWSSubfamilyName                     N
+
+=head2 RSRC Tags
+
+Tags extracted from Mac OS resource files and DFONT files.  These tags may
+also be extracted from the resource fork of any file in OS X, either by
+adding "/rsrc" to the filename to process the resource fork alone, or by
+using the ExtractEmbedded (-ee) option to process the resource fork as a
+sub-document of the main file.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  '8BIM'               PhotoshopInfo            Photoshop
+  'STR _0xbff3'        ApplicationMissingMsg    N
+  'STR _0xbff4'        CreatorApplication       N
+  'STR#_0x0080'        Keywords                 N
+  'TEXT_0x0080'        Description              N
+  'sfnt'               Font                     Font Name
+  'usro_0x0000'        OpenWithApplication      N
+  'vers_0x0001'        ApplicationVersion       N
+
+=head2 Rawzor Tags
+
+Rawzor files store compressed images of other formats. As well as the
+information listed below, exiftool uncompresses and extracts the meta
+information from the original image.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  CompressionFactor                             N
+  OriginalFileSize                              N
+  OriginalFileType                              N
+  RawzorCreatorVersion                          N
+  RawzorRequiredVersion                         N
+
+=head2 ZIP Tags
+
+The following tags are extracted from ZIP archives.  ExifTool also extracts
+additional meta information from compressed documents inside some ZIP-based
+files such Office Open XML (DOCX, PPTX and XLSX), Open Document (ODP, ODS
+and ODT), iWork (KEY, PAGES, NUMBERS), and Capture One Enhanced Image
+Package (EIP).  The ExifTool family 3 groups may be used to organize the
+output by embedded document number (ie. the exiftool C<-g3> option).
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      2    ZipRequiredVersion                   N
+      3    ZipBitFlag                           N
+      4    ZipCompression                       N
+      5    ZipModifyDate                        N
+      7    ZipCRC                               N
+      9    ZipCompressedSize                    N
+     11    ZipUncompressedSize                  N
+     15    ZipFileName                          N
+
+=head3 ZIP GZIP Tags
+
+These tags are extracted from GZIP (GNU ZIP) archives, but currently only
+for the first file in the archive.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      2    Compression                          N
+      3    Flags                                N
+      4    ModifyDate                           N
+      8    ExtraFlags                           N
+      9    OperatingSystem                      N
+     10    ArchivedFileName                     N
+     11    Comment                              N
+
+=head3 ZIP RAR Tags
+
+These tags are extracted from RAR archive files.
+
+   Index   Tag Name                             Writable
+   -----   --------                             --------
+      0    CompressedSize                       N
+      4    UncompressedSize                     N
+      8    OperatingSystem                      N
+     13    ModifyDate                           N
+     18    PackingMethod                        N
+     25    ArchivedFileName                     N
+
+=head2 RTF Tags
+
+This table lists standard tags of the RTF information group, but ExifTool
+will also extract any non-standard tags found in this group.  As well,
+ExifTool will extract any custom properties that are found.  See
+L<http://download.microsoft.com/download/2/f/5/2f599e18-07ee-4ec5-a1e7-f4e6a9423592/Word2007RTFSpec9.doc>
+for the specification.
+
+  Tag ID               Tag Name                 Writable
+  ------               --------                 --------
+  'author'             Author                   N
+  'buptim'             BackupTime               N
+  'category'           Category                 N
+  'comment'            Comment                  N
+  'company'            Company                  N
+  'copyright'          Copyright                N
+  'creatim'            CreateDate               N
+  'doccomm'            Comments                 N
+  'edmins'             TotalEditTime            N
+  'hlinkbase'          HyperlinkBase            N
+  'id'                 InternalIDNumber         N
+  'keywords'           Keywords                 N
+  'manager'            Manager                  N
+  'nofchars'           Characters               N
+  'nofcharsws'         CharactersWithSpaces     N
+  'nofpages'           Pages                    N
+  'nofwords'           Words                    N
+  'operator'           LastModifiedBy           N
+  'printim'            LastPrinted              N
+  'revtim'             ModifyDate               N
+  'subject'            Subject                  N
+  'title'              Title                    N
+  'vern'               InternalVersionNumber    N
+  'version'            RevisionNumber           N
+
+=head2 OOXML Tags
+
+The Office Open XML (OOXML) format was introduced with Microsoft Office 2007
+and is used by file types such as DOCX, PPTX and XLSX.  These are
+essentially ZIP archives containing XML files.  The table below lists some
+tags which have been observed in OOXML documents, but ExifTool will extract
+any tags found from XML files of the OOXML document properties ("docProps")
+directory.
+
+B<Tips:>
+
+1) Structural ZIP tags may be ignored (if desired) with C<--ZIP:all> on the
+command line.
+
+2) Tags may be grouped by their document number in the ZIP archive with the
+C<-g3> or C<-G3> option.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  AppVersion                                    N
+  Application                                   N
+  Characters                                    N
+  CharactersWithSpaces                          N
+  CheckedBy                                     N
+  Client                                        N
+  Company                                       N
+  DateCompleted                                 N
+  Department                                    N
+  Destination                                   N
+  Disposition                                   N
+  Division                                      N
+  DocSecurity                                   N
+  DocumentNumber                                N
+  Editor                                        N
+  ForwardTo                                     N
+  Group                                         N
+  HeadingPairs                                  N
+  HiddenSlides                                  N
+  HyperlinkBase                                 N
+  HyperlinksChanged                             N
+  Language                                      N
+  Lines                                         N
+  LinksUpToDate                                 N
+  MMClips                                       N
+  Mailstop                                      N
+  Manager                                       N
+  Matter                                        N
+  Notes                                         N
+  Office                                        N
+  Owner                                         N
+  Pages                                         N
+  Paragraphs                                    N
+  PresentationFormat                            N
+  Project                                       N
+  Publisher                                     N
+  Purpose                                       N
+  ReceivedFrom                                  N
+  RecordedBy                                    N
+  RecordedDate                                  N
+  Reference                                     N
+  ScaleCrop                                     N
+  SharedDoc                                     N
+  Slides                                        N
+  Source                                        N
+  Status                                        N
+  TelephoneNumber                               N
+  Template                                      N
+  TitlesOfParts                                 N
+  TotalEditTime                                 N
+  Typist                                        N
+  Words                                         N
+  Category                                      N
+  CreateDate                                    N
+  Keywords                                      N
+  LastModifiedBy                                N
+  LastPrinted                                   N
+  ModifyDate                                    N
+  RevisionNumber                                N
+
+=head2 iWork Tags
+
+The Apple iWork '09 file format is a ZIP archive containing XML files
+similar to the Office Open XML (OOXML) format.  Metadata tags in iWork
+files are extracted even if they don't appear below.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  Author                                        N
+  Comment                                       N
+  Copyright                                     N
+  Keywords                                      N
+  Projects                                      N+
+  Title                                         N
+
+=head2 Extra Tags
+
+The extra tags represent extra information extracted or generated by
+ExifTool that is not directly associated with another tag group.  The three
+writable "pseudo" tags (FileName, Directory and FileModifyDate) may be
+written without the need to rewrite the file since their values are not
+contained within the file data.  These "pseudo" tags belong to the family 1
+"System" group.
+
+  Tag Name                                      Writable
+  --------                                      --------
+  CanonVRD                                      Y!
+  Comment                                       Y
+  CurrentIPTCDigest                             N
+  Directory                                     Y!
+  EXIF                                          Y!
+  Error                                         N
+  ExifByteOrder                                 Y
+  ExifToolVersion                               N
+  ExifUnicodeByteOrder                          Y
+  FileModifyDate                                Y!
+  FileName                                      Y!
+  FilePermissions                               N
+  FileSize                                      N
+  FileType                                      N
+  Geosync                                       Y
+  Geotag                                        Y
+  Geotime                                       Y
+  ICC_Profile                                   Y!
+  ID3Size                                       N
+  ImageHeight                                   N
+  ImageWidth                                    N
+  JPEGDigest                                    N
+  MIMEType                                      N
+  MaxVal                                        N
+  Now                                           N
+  PreviewImage                                  Y
+  PreviewPNG                                    N
+  RAFVersion                                    N
+  ResourceForkSize                              N
+  Warning                                       N
+  XMP                                           Y!
+  XResolution                                   N
+  YResolution                                   N
+
+=head2 Composite Tags
+
+The values of the composite tags are B<Derived From> the values of other
+tags.  These are convenience tags which are calculated after all other
+information is extracted.
+
+  Tag Name             Derived From             Writable
+  --------             ------------             --------
+  Aperture             FNumber                  N
+                       ApertureValue
+  AudioBitrate         MPEG:MPEGAudioVersion    N
+                       MPEG:SampleRate
+                       MPEG:VBRBytes
+                       MPEG:VBRFrames
+  AutoFocus            Nikon:PhaseDetectAF      N
+                       Nikon:ContrastDetectAF
+  AvgBitrate           QuickTime::MovieDataSize N
+                       QuickTime::Duration
+  BlueBalance          WB_RGGBLevels            N
+                       WB_RGBGLevels
+                       WB_RBGGLevels
+                       WB_GRBGLevels
+                       WB_GRGBLevels
+                       WB_GBRGLevels
+                       WB_RGBLevels
+                       WB_RBLevels
+                       WBBlueLevel
+                       WBGreenLevel
+  CFAPattern           CFARepeatPatternDim      N
+                       CFAPattern2
+  CircleOfConfusion    ScaleFactor35efl         N
+  ConditionalFEC       FlashExposureComp        N
+                       FlashBits
+  DOF                  FocalLength              N
+                       Aperture
+                       CircleOfConfusion
+                       FocusDistance
+                       SubjectDistance
+                       ObjectDistance
+  DateCreated          Kodak:YearCreated        N
+                       Kodak:MonthDayCreated
+  DateTimeCreated      IPTC:DateCreated         N
+                       IPTC:TimeCreated
+  DateTimeOriginal     DateTimeCreated          N
+                       DateCreated
+                       TimeCreated
+  DateTimeOriginal     ID3:RecordingTime        N
+                       ID3:Year
+                       ID3:Date
+                       ID3:Time
+  DigitalCreationDateTime IPTC:DigitalCreationDate N
+                       IPTC:DigitalCreationTime
+  DigitalZoom          Canon:ZoomSourceWidth    N
+                       Canon:ZoomTargetWidth
+                       Canon:DigitalZoom
+  DriveMode            ContinuousDrive          N
+                       SelfTimer
+  Duration             FLAC:SampleRate          N
+                       FLAC:TotalSamples
+  Duration             FileSize                 N
+                       ID3Size
+                       MPEG:AudioBitrate
+                       MPEG:VideoBitrate
+                       MPEG:VBRFrames
+                       MPEG:SampleRate
+                       MPEG:MPEGAudioVersion
+  Duration             RIFF:FrameRate           N
+                       RIFF:FrameCount
+                       VideoFrameRate
+                       VideoFrameCount
+  Duration             RIFF:AvgBytesPerSec      N
+                       FileSize
+                       FrameCount
+                       VideoFrameCount
+  ExtenderStatus       Olympus:Extender         N
+                       Olympus:LensType
+                       MaxApertureValue
+  FOV                  FocalLength              N
+                       ScaleFactor35efl
+                       FocusDistance
+  FileNumber           DirectoryIndex           Y
+                       FileIndex
+  FlashType            FlashBits                N
+  FocalLength35efl     FocalLength              N
+                       ScaleFactor35efl
+  GPSAltitude          QuickTime:GPSCoordinates N
+  GPSAltitudeRef       QuickTime:GPSCoordinates N
+  GPSAltitude          GPS:GPSAltitude          N
+                       GPS:GPSAltitudeRef
+                       XMP:GPSAltitude
+                       XMP:GPSAltitudeRef
+  GPSDateTime          GPS:GPSDateStamp         N
+                       GPS:GPSTimeStamp
+  GPSLatitude          QuickTime:GPSCoordinates N
+  GPSLatitudeRef       XMP:GPSLatitude          N
+  GPSLatitude          GPS:GPSLatitude          N
+                       GPS:GPSLatitudeRef
+  GPSLongitude         QuickTime:GPSCoordinates N
+  GPSLongitudeRef      XMP:GPSLongitude         N
+  GPSLongitude         GPS:GPSLongitude         N
+                       GPS:GPSLongitudeRef
+  GPSPosition          GPSLatitude              N
+                       GPSLongitude
+  HyperfocalDistance   FocalLength              N
+                       Aperture
+                       CircleOfConfusion
+  IDCPreviewImage      IDCPreviewStart          N
+                       IDCPreviewLength
+  ISO                  Canon:CameraISO          N
+                       Canon:BaseISO
+                       Canon:AutoISO
+  ImageHeight          Main:PostScript:ImageData N
+                       PostScript:BoundingBox
+  ImageSize            ImageWidth               N
+                       ImageHeight
+                       ExifImageWidth
+                       ExifImageHeight
+  ImageWidth           Main:PostScript:ImageData N
+                       PostScript:BoundingBox
+  JpgFromRaw           JpgFromRawStart          Y
+                       JpgFromRawLength
+  Lens                 ShortFocal               N
+                       LongFocal
+  Lens35efl            ShortFocal               N
+                       LongFocal
+                       Lens
+                       ScaleFactor35efl
+  LensID               LensType                 N
+                       FocalLength
+                       MaxAperture
+                       MaxApertureValue
+                       ShortFocal
+                       LongFocal
+                       LensModel
+                       LensFocalRange
+  LensID               Nikon:LensIDNumber       N
+                       LensFStops
+                       MinFocalLength
+                       MaxFocalLength
+                       MaxApertureAtMinFocal
+                       MaxApertureAtMaxFocal
+                       MCUVersion
+                       Nikon:LensType
+  LensID               Ricoh:LensFirmware       N
+  LensSpec             Nikon:Lens               N
+                       Nikon:LensType
+  LightValue           Aperture                 N
+                       ShutterSpeed
+                       ISO
+  MPImage              MPImageStart             N
+                       MPImageLength
+                       MPImageType
+  OriginalDecisionData OriginalDecisionDataOffset Y!
+  OtherImage           OtherImageStart          N
+                       OtherImageLength
+  PreviewImage         PreviewImageStart        Y
+                       PreviewImageLength
+                       PreviewImageValid
+                       PreviewImageStart (1)
+                       PreviewImageLength (1)
+  PreviewImageSize     PreviewImageWidth        N
+                       PreviewImageHeight
+  PreviewImage         ScreenNail               N
+  RedBalance           WB_RGGBLevels            N
+                       WB_RGBGLevels
+                       WB_RBGGLevels
+                       WB_GRBGLevels
+                       WB_GRGBLevels
+                       WB_GBRGLevels
+                       WB_RGBLevels
+                       WB_RBLevels
+                       WBRedLevel
+                       WBGreenLevel
+  RedEyeReduction      CanonFlashMode           N
+                       FlashBits
+  Rotation             QuickTime:MatrixStructure N
+                       QuickTime:HandlerType
+  ScaleFactor35efl     FocalLength              N
+                       FocalLengthIn35mmFormat
+                       Composite:DigitalZoom
+                       FocalPlaneDiagonal
+                       FocalPlaneXSize
+                       FocalPlaneYSize
+                       FocalPlaneResolutionUnit
+                       FocalPlaneXResolution
+                       FocalPlaneYResolution
+                       ExifImageWidth
+                       ExifImageHeight
+                       CanonImageWidth
+                       CanonImageHeight
+                       ImageWidth
+                       ImageHeight
+  ShootingMode         CanonExposureMode        N
+                       EasyMode
+                       BulbDuration
+  ShutterCurtainHack   FlashBits                N
+                       ShutterCurtainSync
+  ShutterSpeed         ExposureTime             N
+                       ShutterSpeedValue
+                       BulbDuration
+  SubSecCreateDate     EXIF:CreateDate          N
+                       SubSecTimeDigitized
+  SubSecDateTimeOriginal EXIF:DateTimeOriginal  N
+                       SubSecTimeOriginal
+  SubSecModifyDate     EXIF:ModifyDate          N
+                       SubSecTime
+  ThumbnailImage       ThumbnailOffset          Y
+                       ThumbnailLength
+  WB_RGBLevels         KDC_IFD:WhiteBalance     N
+                       WB_RGBLevelsAuto
+                       WB_RGBLevelsFluorescent
+                       WB_RGBLevelsTungsten
+                       WB_RGBLevelsDaylight
+                       WB_RGBLevels4
+                       WB_RGBLevels5
+                       WB_RGBLevelsShade
+  WB_RGBLevels         KodakIFD:WhiteBalance    N
+                       WB_RGBMul0
+                       WB_RGBMul1
+                       WB_RGBMul2
+                       WB_RGBMul3
+                       WB_RGBCoeffs0
+                       WB_RGBCoeffs1
+                       WB_RGBCoeffs2
+                       WB_RGBCoeffs3
+                       KodakIFD:ColorTemperature
+                       Kodak:WB_RGBLevels
+  WB_RGGBLevels        Canon:WhiteBalance       N
+                       WB_RGGBLevelsAsShot
+                       WB_RGGBLevelsAuto
+                       WB_RGGBLevelsDaylight
+                       WB_RGGBLevelsCloudy
+                       WB_RGGBLevelsTungsten
+                       WB_RGGBLevelsFluorescent
+                       WB_RGGBLevelsFlash
+                       WB_RGGBLevelsCustom
+                       WB_RGGBLevelsShade
+                       WB_RGGBLevelsKelvin
+  WB_RGGBLevels        WB_RGGBLevelsUncorrected N
+                       WB_RGGBLevelsBlack
+  ZoomedPreviewImage   ZoomedPreviewStart       N
+                       ZoomedPreviewLength
+
+=head2 Shortcuts Tags
+
+Shortcut tags are convenience tags that represent one or more other tag
+names.  They are used like regular tags to read and write the information
+for a specified set of tags.
+
+The shortcut tags below have been pre-defined, but user-defined shortcuts
+may be added via the %Image::ExifTool::UserDefined::Shortcuts lookup in the
+=/.ExifTool_config file.  See the Image::ExifTool::Shortcuts documentation
+for more details.
+
+  Tag Name             Refers To                Writable
+  --------             ---------                --------
+  AllDates             DateTimeOriginal         Y
+                       CreateDate
+                       ModifyDate
+  Canon                FileName                 Y
+                       Model
+                       DateTimeOriginal
+                       ShootingMode
+                       ShutterSpeed
+                       Aperture
+                       MeteringMode
+                       ExposureCompensation
+                       ISO
+                       Lens
+                       FocalLength
+                       ImageSize
+                       Quality
+                       Flash
+                       FlashType
+                       ConditionalFEC
+                       RedEyeReduction
+                       ShutterCurtainHack
+                       WhiteBalance
+                       FocusMode
+                       Contrast
+                       Sharpness
+                       Saturation
+                       ColorTone
+                       ColorSpace
+                       LongExposureNoiseReduction
+                       FileSize
+                       FileNumber
+                       DriveMode
+                       OwnerName
+                       SerialNumber
+  Common               FileName                 Y
+                       FileSize
+                       Model
+                       DateTimeOriginal
+                       ImageSize
+                       Quality
+                       FocalLength
+                       ShutterSpeed
+                       Aperture
+                       ISO
+                       WhiteBalance
+                       Flash
+  CommonIFD0           IFD0:ImageDescription    Y
+                       IFD0:Make
+                       IFD0:Model
+                       IFD0:Software
+                       IFD0:ModifyDate
+                       IFD0:Artist
+                       IFD0:Copyright
+                       IFD0:Rating
+                       IFD0:RatingPercent
+                       IFD0:DNGLensInfo
+                       IFD0:PanasonicTitle
+                       IFD0:PanasonicTitle2
+                       IFD0:XPTitle
+                       IFD0:XPComment
+                       IFD0:XPAuthor
+                       IFD0:XPKeywords
+                       IFD0:XPSubject
+  MakerNotes           MakerNotes               Y
+                       MakerNoteCanon
+                       MakerNoteCasio
+                       MakerNoteCasio2
+                       MakerNoteFujiFilm
+                       MakerNoteGE
+                       MakerNoteGE2
+                       MakerNoteHP
+                       MakerNoteHP2
+                       MakerNoteHP4
+                       MakerNoteHP6
+                       MakerNoteISL
+                       MakerNoteJVC
+                       MakerNoteJVCText
+                       MakerNoteKodak1a
+                       MakerNoteKodak1b
+                       MakerNoteKodak2
+                       MakerNoteKodak3
+                       MakerNoteKodak4
+                       MakerNoteKodak5
+                       MakerNoteKodak6a
+                       MakerNoteKodak6b
+                       MakerNoteKodak7
+                       MakerNoteKodak8a
+                       MakerNoteKodak8b
+                       MakerNoteKodak9
+                       MakerNoteKodak10
+                       MakerNoteKodakUnknown
+                       MakerNoteKyocera
+                       MakerNoteMinolta
+                       MakerNoteMinolta2
+                       MakerNoteMinolta3
+                       MakerNoteNikon
+                       MakerNoteNikon2
+                       MakerNoteNikon3
+                       MakerNoteOlympus
+                       MakerNoteOlympus2
+                       MakerNoteLeica
+                       MakerNoteLeica2
+                       MakerNoteLeica3
+                       MakerNoteLeica4
+                       MakerNoteLeica5
+                       MakerNoteLeica6
+                       MakerNotePanasonic
+                       MakerNotePanasonic2
+                       MakerNotePentax
+                       MakerNotePentax2
+                       MakerNotePentax3
+                       MakerNotePentax4
+                       MakerNotePentax5
+                       MakerNotePhaseOne
+                       MakerNoteReconyx
+                       MakerNoteRicoh
+                       MakerNoteRicohText
+                       MakerNoteSamsung1a
+                       MakerNoteSamsung1b
+                       MakerNoteSamsung2
+                       MakerNoteSanyo
+                       MakerNoteSanyoC4
+                       MakerNoteSanyoPatch
+                       MakerNoteSigma
+                       MakerNoteSony
+                       MakerNoteSony2
+                       MakerNoteSony3
+                       MakerNoteSony4
+                       MakerNoteSonyEricsson
+                       MakerNoteSonySRF
+                       MakerNoteUnknownText
+                       MakerNoteUnknown
+  Nikon                Model                    Y
+                       SubSecDateTimeOriginal
+                       ShutterCount
+                       LensSpec
+                       FocalLength
+                       ImageSize
+                       ShutterSpeed
+                       Aperture
+                       ISO
+                       NoiseReduction
+                       ExposureProgram
+                       ExposureCompensation
+                       WhiteBalance
+                       WhiteBalanceFineTune
+                       ShootingMode
+                       Quality
+                       MeteringMode
+                       FocusMode
+                       ImageOptimization
+                       ToneComp
+                       ColorHue
+                       ColorSpace
+                       HueAdjustment
+                       Saturation
+                       Sharpness
+                       Flash
+                       FlashMode
+                       FlashExposureComp
+  Unsafe               IFD0:YCbCrPositioning    Y
+                       IFD0:YCbCrCoefficients
+                       IFD0:TransferFunction
+                       ExifIFD:ComponentsConfiguration
+                       ExifIFD:CompressedBitsPerPixel
+                       InteropIFD:InteropIndex
+                       InteropIFD:InteropVersion
+                       InteropIFD:RelatedImageWidth
+                       InteropIFD:RelatedImageHeight
+
+=head2 MWG Tags
+
+=head3 MWG Composite Tags
+
+The Metadata Working Group (MWG) recommendations provide a set of rules to
+allow certain overlapping EXIF, IPTC and XMP tags to be reconciled when
+reading, and synchronized when writing.  The ExifTool MWG module is designed
+to aid in the implementation of these recommendations.  (See
+L<http://www.metadataworkinggroup.org/> for the complete MWG technical
+specifications.)
+
+The table below lists special Composite tags which are used to access other
+tags based on the MWG 2.0 recommendations.  These tags are only accessible
+when the MWG module is loaded.  The MWG module is loaded automatically by
+the exiftool application if MWG is specified as a group for any tag on the
+command line, or manually with the C<-use MWG> option.  Via the API, the MWG
+module is loaded with "C<use Image::ExifTool::MWG>".
+
+When reading, the value of each MWG tag is B<Derived From> the specified
+tags based on the MWG guidelines.  When writing, the appropriate associated
+tags are written.  The value of the IPTCDigest tag is updated automatically
+when the IPTC is changed if either the IPTCDigest tag didn't exist
+beforehand or its value agreed with the original IPTC digest (indicating
+that the XMP is synchronized with the IPTC).  IPTC information is written
+only if the original file contained IPTC.
+
+Loading the MWG module activates "strict MWG conformance mode", which has
+the effect of causing EXIF, IPTC and XMP in non-standard locations to be
+ignored when reading, as per the MWG recommendations.  Instead, a "Warning"
+tag is generated when non-standard metadata is encountered.  This feature
+may be disabled by setting C<$Image::ExifTool::MWG::strict = 0> in the
+ExifTool config file (or from your Perl script when using the API).  Note
+that the behaviour when writing is not changed:  ExifTool always creates new
+records only in the standard location, but writes new tags to any
+EXIF/IPTC/XMP records that exist.
+
+A complication of the specification is that although the MWG:Creator
+property may consist of multiple values, the associated EXIF tag
+(EXIF:Artist) is only a simple string.  To resolve this discrepancy the MWG
+recommends a technique which allows a list of values to be stored in a
+string by using a semicolon-space separator (with quotes around values if
+necessary).  When the MWG module is loaded, ExifTool automatically
+implements this policy and changes EXIF:Artist to a list-type tag.
+
+  Tag Name             Derived From             Writable
+  --------             ------------             --------
+  City                 IPTC:City                Y
+                       XMP-photoshop:City
+                       CurrentIPTCDigest
+                       IPTCDigest
+  Copyright            EXIF:Copyright           Y
+                       IPTC:CopyrightNotice
+                       XMP-dc:Rights
+                       CurrentIPTCDigest
+                       IPTCDigest
+  Country              IPTC:Country-PrimaryLocationName Y
+                       XMP-photoshop:Country
+                       CurrentIPTCDigest
+                       IPTCDigest
+  CreateDate           EXIF:CreateDate          Y
+                       EXIF:SubSecTimeDigitized
+                       IPTC:DigitalCreationDate
+                       IPTC:DigitalCreationTime
+                       XMP-xmp:CreateDate
+                       CurrentIPTCDigest
+                       IPTCDigest
+  Creator              EXIF:Artist              Y+
+                       IPTC:By-line
+                       XMP-dc:Creator
+                       CurrentIPTCDigest
+                       IPTCDigest
+  DateTimeOriginal     EXIF:DateTimeOriginal    Y
+                       EXIF:SubSecTimeOriginal
+                       IPTC:DateCreated
+                       IPTC:TimeCreated
+                       XMP-photoshop:DateCreated
+                       CurrentIPTCDigest
+                       IPTCDigest
+  Description          EXIF:ImageDescription    Y
+                       IPTC:Caption-Abstract
+                       XMP-dc:Description
+                       CurrentIPTCDigest
+                       IPTCDigest
+  Keywords             IPTC:Keywords            Y+
+                       XMP-dc:Subject
+                       CurrentIPTCDigest
+                       IPTCDigest
+  Location             IPTC:Sub-location        Y
+                       XMP-iptcCore:Location
+                       CurrentIPTCDigest
+                       IPTCDigest
+  ModifyDate           EXIF:ModifyDate          Y
+                       EXIF:SubSecTime
+                       XMP-xmp:ModifyDate
+                       CurrentIPTCDigest
+                       IPTCDigest
+  Orientation          EXIF:Orientation         Y
+  Rating               XMP-xmp:Rating           Y
+  State                IPTC:Province-State      Y
+                       XMP-photoshop:State
+                       CurrentIPTCDigest
+                       IPTCDigest
+
+=head1 NOTES
+
+This document generated automatically by
+L<Image::ExifTool::BuildTagLookup|Image::ExifTool::BuildTagLookup>.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Unknown.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Unknown.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Unknown.pm	(revision 24799)
@@ -0,0 +1,66 @@
+#------------------------------------------------------------------------------
+# File:         Unknown.pm
+#
+# Description:  Unknown EXIF maker notes tags
+#
+# Revisions:    04/07/2004  - P. Harvey Created
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Unknown;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool::Exif;
+
+$VERSION = '1.13';
+
+# Unknown maker notes
+%Image::ExifTool::Unknown::Main = (
+    WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
+    CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
+    GROUPS => { 0 => 'MakerNotes', 1 => 'MakerUnknown', 2 => 'Camera' },
+
+    # this seems to be a common fixture, so look for it in unknown maker notes
+    0x0e00 => {
+        Name => 'PrintIM',
+        Description => 'Print Image Matching',
+        SubDirectory => {
+            TagTable => 'Image::ExifTool::PrintIM::Main',
+        },
+    },
+);
+
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Unknown - Unknown EXIF maker notes tags
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+Image::ExifTool has definitions for the maker notes from many manufacturers,
+however information can sometimes be extracted from unknown manufacturers if
+the maker notes are in standard IFD format.  This module contains the
+definitions necessary for Image::ExifTool to read the maker notes from
+unknown manufacturers.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/Unknown Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Vorbis.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Vorbis.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Vorbis.pm	(revision 24799)
@@ -0,0 +1,356 @@
+#------------------------------------------------------------------------------
+# File:         Vorbis.pm
+#
+# Description:  Read Ogg Vorbis meta information
+#
+# Revisions:    11/10/2006 - P. Harvey Created
+#
+# References:   1) http://www.xiph.org/vorbis/doc/
+#               2) http://flac.sourceforge.net/ogg_mapping.html
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Vorbis;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.03';
+
+my $MAX_PACKETS = 2;    # maximum packets to scan from each stream at start of file
+
+sub ProcessComments($$$);
+sub DecodeCoverArt($);
+
+# Vorbis comment tags
+%Image::ExifTool::Vorbis::Main = (
+    NOTES => q{
+        ExifTool extracts the following Vorbis information from Ogg files.  As well
+        as this, ExifTool also extracts FLAC and ID3 information from Ogg files.
+    },
+    1 => {
+        Name => 'Identification',
+        SubDirectory => { TagTable => 'Image::ExifTool::Vorbis::Identification' },
+    },
+    3 => {
+        Name => 'Comments',
+        SubDirectory => { TagTable => 'Image::ExifTool::Vorbis::Comments' },
+    },
+);
+
+%Image::ExifTool::Vorbis::Identification = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Audio' },
+    0 => {
+        Name => 'VorbisVersion',
+        Format => 'int32u',
+    },
+    4 => 'AudioChannels',
+    5 => {
+        Name => 'SampleRate',
+        Format => 'int32u',
+    },
+    9 => {
+        Name => 'MaximumBitrate',
+        Format => 'int32u',
+        RawConv => '$val || undef',
+        PrintConv => 'ConvertBitrate($val)',
+    },
+    13 => {
+        Name => 'NominalBitrate',
+        Format => 'int32u',
+        RawConv => '$val || undef',
+        PrintConv => 'ConvertBitrate($val)',
+    },
+    17 => {
+        Name => 'MinimumBitrate',
+        Format => 'int32u',
+        RawConv => '$val || undef',
+        PrintConv => 'ConvertBitrate($val)',
+    },
+);
+
+%Image::ExifTool::Vorbis::Comments = (
+    PROCESS_PROC => \&ProcessComments,
+    GROUPS => { 2 => 'Audio' },
+    NOTES => q{
+        The tags below are only some common tags found in the Vorbis comments of Ogg
+        Vorbis and Ogg FLAC audio files, however ExifTool will extract values from
+        any tag found, even if not listed here.
+    },
+    vendor    => { Notes => 'from comment header' },
+    TITLE     => { Name => 'Title' },
+    VERSION   => { Name => 'Version' },
+    ALBUM     => { Name => 'Album' },
+    TRACKNUMBER=>{ Name => 'TrackNumber' },
+    ARTIST    => { Name => 'Artist',       Groups => { 2 => 'Author' }, List => 1 },
+    PERFORMER => { Name => 'Performer',    Groups => { 2 => 'Author' }, List => 1 },
+    COPYRIGHT => { Name => 'Copyright',    Groups => { 2 => 'Author' } },
+    LICENSE   => { Name => 'License',      Groups => { 2 => 'Author' } },
+    ORGANIZATION=>{Name => 'Organization', Groups => { 2 => 'Author' } },
+    DESCRIPTION=>{ Name => 'Description' },
+    GENRE     => { Name => 'Genre' },
+    DATE      => { Name => 'Date',         Groups => { 2 => 'Time' } },
+    LOCATION  => { Name => 'Location',     Groups => { 2 => 'Location' } },
+    CONTACT   => { Name => 'Contact',      Groups => { 2 => 'Author' }, List => 1 },
+    ISRC      => { Name => 'ISRCNumber' },
+    COVERARTMIME => { Name => 'CoverArtMIMEType' },
+    COVERART  => {
+        Name => 'CoverArt',
+        Notes => 'base64-encoded image',
+        ValueConv => q{
+            require Image::ExifTool::XMP;
+            Image::ExifTool::XMP::DecodeBase64($val);
+        },
+    },
+    REPLAYGAIN_TRACK_PEAK => { Name => 'ReplayGainTrackPeak' },
+    REPLAYGAIN_TRACK_GAIN => { Name => 'ReplayGainTrackGain' },
+    REPLAYGAIN_ALBUM_PEAK => { Name => 'ReplayGainAlbumPeak' },
+    REPLAYGAIN_ALBUM_GAIN => { Name => 'ReplayGainAlbumGain' },
+    # observed in "Xiph.Org libVorbis I 20020717" ogg:
+    ENCODED_USING => { Name => 'EncodedUsing' },
+    ENCODED_BY  => { Name => 'EncodedBy' },
+    COMMENT     => { Name => 'Comment' },
+);
+
+#------------------------------------------------------------------------------
+# Process Vorbis Comments
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: 1 on success, otherwise returns 0 and sets a Warning
+sub ProcessComments($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my $dataPos = $$dirInfo{DataPos};
+    my $pos = $$dirInfo{DirStart} || 0;
+    my $end = $$dirInfo{DirLen} ? $pos + $$dirInfo{DirLen} : length $$dataPt;
+    my ($num, $index);
+
+    SetByteOrder('II');
+    for (;;) {
+        last if $pos + 4 > $end;
+        my $len = Get32u($dataPt, $pos);
+        last if $pos + 4 + $len > $end;
+        my $start = $pos + 4;
+        my $buff = substr($$dataPt, $start, $len);
+        $pos = $start + $len;
+        my ($tag, $val);
+        if (defined $num) {
+            $buff =~ /(.*?)=(.*)/s or last;
+            ($tag, $val) = ($1, $2);
+        } else {
+            $tag = 'vendor';
+            $val = $buff;
+            $num = ($pos + 4 < $end) ? Get32u($dataPt, $pos) : 0;
+            $exifTool->VPrint(0, "  + [Vorbis comments with $num entries]\n");
+            $pos += 4;
+        }
+        # add tag to table unless it exists already
+        unless ($$tagTablePtr{$tag}) {
+            my $name = ucfirst(lc($tag));
+            # remove invalid characters in tag name and capitalize following letters
+            $name =~ s/[^\w-]+(.?)/\U$1/sg;
+            $name =~ s/([a-z0-9])_([a-z])/$1\U$2/g;
+            Image::ExifTool::AddTagToTable($tagTablePtr, $tag, { Name => $name });
+        }
+        $exifTool->HandleTag($tagTablePtr, $tag, $exifTool->Decode($val, 'UTF8'),
+            Index   => $index,
+            DataPt  => $dataPt,
+            DataPos => $dataPos,
+            Start   => $start,
+            Size    => $len,
+        );
+        # all done if this was our last tag
+        $num-- or return 1;
+        $index = (defined $index) ? $index + 1 : 0;
+    }
+    $exifTool->Warn('Format error in Vorbis comments');
+    return 0;
+}
+
+#------------------------------------------------------------------------------
+# Process Ogg packet
+# Inputs: 0) ExifTool object ref, 1) data ref, 2) tag table ref
+# Returns: 1 on success
+sub ProcessPacket($$$)
+{
+    my ($exifTool, $dataPt, $tagTablePtr) = @_;
+    if ($$dataPt =~ /^(.)vorbis/s) {
+        my $tag = ord($1);
+        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
+        return 0 unless $tagInfo and $$tagInfo{SubDirectory};
+        my %dirInfo = (
+            DataPt => $dataPt,
+            DirName => $$tagInfo{Name},
+            DirStart => 7,
+        );
+        my $table = GetTagTable($tagInfo->{SubDirectory}->{TagTable});
+        return $exifTool->ProcessDirectory(\%dirInfo, $table);
+    }
+    return 0;
+}
+
+#------------------------------------------------------------------------------
+# Extract information from an Ogg Vorbis or Ogg FLAC file
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 on success, 0 if this wasn't a valid Ogg Vorbis file
+sub ProcessOGG($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+
+    # must first check for leading/trailing ID3 information
+    unless ($exifTool->{DoneID3}) {
+        require Image::ExifTool::ID3;
+        Image::ExifTool::ID3::ProcessID3($exifTool, $dirInfo) and return 1;
+    }
+    my $raf = $$dirInfo{RAF};
+    my $verbose = $exifTool->Options('Verbose');
+    my $out = $exifTool->Options('TextOut');
+    my ($success, $page, $packets, $streams) = (0,0,0,0);
+    my ($buff, $tagTablePtr, $flag, $stream, %val, $numFlac);
+
+    for (;;) {
+        # must read ahead to next page to see if it is a continuation
+        # (this code would be a lot simpler if the continuation flag
+        #  was on the leading instead of the trailing page!)
+        if ($raf and $raf->Read($buff, 28) == 28) {
+            # validate magic number
+            unless ($buff =~ /^OggS/) {
+                $success and $exifTool->Warn('Lost synchronization');
+                last;
+            }
+            unless ($success) {
+                # set file type and initialize on first page
+                $success = 1;
+                $exifTool->SetFileType();
+                SetByteOrder('II');
+                $tagTablePtr = GetTagTable('Image::ExifTool::Vorbis::Main');
+            }
+            $flag = Get8u(\$buff, 5);       # page flag
+            $stream = Get32u(\$buff, 14);   # stream serial number
+            ++$streams if $flag & 0x02;     # count start-of-stream pages
+            ++$packets unless $flag & 0x01; # keep track of packet count
+        } else {
+            # all done unless we have to process our last packet
+            last unless %val;
+            ($stream) = sort keys %val;     # take a stream
+            $flag = 0;                      # no continuation
+            undef $raf;                     # flag for done reading
+        }
+
+        if (defined $numFlac) {
+            # stop to process FLAC headers if we hit the end of file
+            last unless $raf;
+            --$numFlac; # one less header packet to read
+        } else {
+            # can finally process previous packet from this stream
+            # unless this is a continuation page
+            if (defined $val{$stream} and not $flag & 0x01) {
+                ProcessPacket($exifTool, \$val{$stream}, $tagTablePtr);
+                delete $val{$stream};
+                # only read the first $MAX_PACKETS packets from each stream
+                if ($packets > $MAX_PACKETS * $streams or not defined $raf) {
+                    last unless %val;   # all done (success!)
+                    next;               # process remaining stream(s)
+                }
+            }
+            # stop processing Ogg Vorbis if we have scanned enough packets
+            last if $packets > $MAX_PACKETS * $streams and not %val;
+        }
+
+        # continue processing the current page
+        my $pageNum = Get32u(\$buff, 18);   # page sequence number
+        my $nseg = Get8u(\$buff, 26);       # number of segments
+        # calculate total data length
+        my $dataLen = Get8u(\$buff, 27);
+        if ($nseg) {
+            $raf->Read($buff, $nseg-1) == $nseg-1 or last;
+            my @segs = unpack('C*', $buff);
+            # could check that all these (but the last) are 255...
+            foreach (@segs) { $dataLen += $_ }
+        }
+        if (defined $page) {
+            if ($page == $pageNum) {
+                ++$page;
+            } else {
+                $exifTool->Warn('Missing page(s) in Ogg file');
+                undef $page;
+            }
+        }
+        # read page data
+        $raf->Read($buff, $dataLen) == $dataLen or last;
+        if ($verbose > 1) {
+            printf $out "Page %d, stream 0x%x, flag 0x%x (%d bytes)\n",
+                   $pageNum, $stream, $flag, $dataLen;
+            $exifTool->VerboseDump(\$buff, DataPos => $raf->Tell() - $dataLen);
+        }
+        if (defined $val{$stream}) {
+            $val{$stream} .= $buff;     # add this continuation page
+        } elsif (not $flag & 0x01) {    # ignore remaining pages of a continued packet
+            # ignore the first page of any packet we aren't parsing
+            if ($buff =~ /^(.)vorbis/s and $$tagTablePtr{ord($1)}) {
+                $val{$stream} = $buff;      # save this page
+            } elsif ($buff =~ /^\x7fFLAC..(..)/s) {
+                $numFlac = unpack('n',$1);
+                $val{$stream} = substr($buff, 9);
+            }
+        }
+        if (defined $numFlac) {
+            # stop to process FLAC headers if we have them all
+            last if $numFlac <= 0;
+        } elsif (defined $val{$stream} and $flag & 0x04) {
+            # process Ogg Vorbis packet now if end-of-stream bit is set
+            ProcessPacket($exifTool, \$val{$stream}, $tagTablePtr);
+            delete $val{$stream};
+        }
+    }
+    if (defined $numFlac and defined $val{$stream}) {
+        # process FLAC headers as if it was a complete FLAC file
+        require Image::ExifTool::FLAC;
+        my %dirInfo = ( RAF => new File::RandomAccess(\$val{$stream}) );
+        Image::ExifTool::FLAC::ProcessFLAC($exifTool, \%dirInfo);
+    }
+    return $success;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Vorbis - Read Ogg Vorbis meta information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to extract meta
+information from Ogg Vorbis and Ogg FLAC audio files.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.xiph.org/vorbis/doc/>
+
+=item L<http://flac.sourceforge.net/ogg_mapping.html>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/Vorbis Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/WriteCanonRaw.pl
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/WriteCanonRaw.pl	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/WriteCanonRaw.pl	(revision 24799)
@@ -0,0 +1,636 @@
+#------------------------------------------------------------------------------
+# File:         WriteCanonRaw.pl
+#
+# Description:  Write Canon RAW (CRW and CR2) meta information
+#
+# Revisions:    01/25/2005 - P. Harvey Created
+#------------------------------------------------------------------------------
+package Image::ExifTool::CanonRaw;
+
+use strict;
+use vars qw($VERSION $AUTOLOAD %crwTagFormat);
+use Image::ExifTool::Fixup;
+
+# map for adding directories to CRW
+my %crwMap = (
+    XMP      => 'CanonVRD',
+    CanonVRD => 'Trailer',
+);
+
+# mappings to from RAW tagID to MakerNotes tagID
+# (Note: upper two bits of RawTagID are zero)
+my %mapRawTag = (
+  # RawTagID => Canon TagID
+    0x080b => 0x07, # CanonFirmwareVersion
+    0x0810 => 0x09, # OwnerName
+    0x0815 => 0x06, # CanonImageType
+    0x1028 => 0x03, # (unknown if no tag name specified)
+    0x1029 => 0x02, # FocalLength
+    0x102a => 0x04, # CanonShotInfo
+    0x102d => 0x01, # CanonCameraSettings
+    0x1033 => 0x0f, # CanonCustomFunctions (only verified for 10D)
+    0x1038 => 0x12, # CanonAFInfo
+    0x1039 => 0x13,
+    0x1093 => 0x93,
+    0x10a8 => 0xa8,
+    0x10a9 => 0xa9, # WhiteBalanceTable
+    0x10aa => 0xaa,
+    0x10ae => 0xae, # ColorTemperature
+    0x10b4 => 0xb4, # ColorSpace
+    0x10b5 => 0xb5,
+    0x10c0 => 0xc0,
+    0x10c1 => 0xc1,
+    0x180b => 0x0c, # SerialNumber
+    0x1817 => 0x08, # FileNumber
+    0x1834 => 0x10,
+    0x183b => 0x15,
+);
+# translation from Rotation to Orientation values
+my %mapRotation = (
+    0 => 1,
+    90 => 6,
+    180 => 3,
+    270 => 8,
+);
+
+
+#------------------------------------------------------------------------------
+# Initialize buffers for building MakerNotes from RAW data
+# Inputs: 0) ExifTool object reference
+sub InitMakerNotes($)
+{
+    my $exifTool = shift;
+    $exifTool->{MAKER_NOTE_INFO} = {
+        Entries => { },     # directory entries keyed by tagID
+        ValBuff => "\0\0\0\0", # value data buffer (start with zero nextIFD pointer)
+        FixupTags => { },   # flags for tags with data in value buffer
+    };
+}
+
+#------------------------------------------------------------------------------
+# Build maker notes from CanonRaw information
+# Inputs: 0) ExifTool object reference, 1) raw tag ID, 2) reference to tagInfo
+#         3) reference to value, 4) format name, 5) count
+# Notes: This will build the directory in the order the tags are found in the CRW
+# file, which isn't sequential (but Canon's version isn't sequential either...)
+sub BuildMakerNotes($$$$$$)
+{
+    my ($exifTool, $rawTag, $tagInfo, $valuePt, $formName, $count) = @_;
+
+    my $tagID = $mapRawTag{$rawTag} || return;
+    $formName or warn(sprintf "No format for tag 0x%x!\n",$rawTag), return;
+    # special case: ignore user comment because it gets saved in EXIF
+    # (and has the same raw tagID as CanonFileDescription)
+    return if $tagInfo and $$tagInfo{Name} eq 'UserComment';
+    my $format = $Image::ExifTool::Exif::formatNumber{$formName};
+    my $fsiz = $Image::ExifTool::Exif::formatSize[$format];
+    my $size = length($$valuePt);
+    my $value;
+    if ($count and $size != $count * $fsiz) {
+        if ($size < $count * $fsiz) {
+            warn sprintf("Value too short for raw tag 0x%x\n",$rawTag);
+            return;
+        }
+        # shorten value appropriately
+        $size = $count * $fsiz;
+        $value = substr($$valuePt, 0, $size);
+    } else {
+        $count = $size / $fsiz;
+        $value = $$valuePt;
+    }
+    my $offsetVal;
+    my $makerInfo = $exifTool->{MAKER_NOTE_INFO};
+    if ($size > 4) {
+        my $len = length $makerInfo->{ValBuff};
+        $offsetVal = Set32u($len);
+        $makerInfo->{ValBuff} .= $value;
+        # pad to an even number of bytes
+        $size & 0x01 and $makerInfo->{ValBuff} .= "\0";
+        # set flag indicating that this tag needs a fixup
+        $makerInfo->{FixupTags}->{$tagID} = 1;
+    } else {
+        $offsetVal = $value;
+        $size < 4 and $offsetVal .= "\0" x (4 - $size);
+    }
+    $makerInfo->{Entries}->{$tagID} = Set16u($tagID) . Set16u($format) .
+                                      Set32u($count) . $offsetVal;
+}
+
+#------------------------------------------------------------------------------
+# Finish building and save MakerNotes
+# Inputs: 0) ExifTool object reference
+sub SaveMakerNotes($)
+{
+    my $exifTool = shift;
+    # save maker notes
+    my $makerInfo = $exifTool->{MAKER_NOTE_INFO};
+    delete $exifTool->{MAKER_NOTE_INFO};
+    my $dirEntries = $makerInfo->{Entries};
+    my $numEntries = scalar(keys %$dirEntries);
+    my $fixup = new Image::ExifTool::Fixup;
+    return unless $numEntries;
+    # build the MakerNotes directory
+    my $makerNotes = Set16u($numEntries);
+    my $tagID;
+    # write the entries in proper tag order (even though Canon doesn't do this...)
+    foreach $tagID (sort { $a <=> $b } keys %$dirEntries) {
+        $makerNotes .= $$dirEntries{$tagID};
+        next unless $makerInfo->{FixupTags}->{$tagID};
+        # add fixup for this pointer
+        $fixup->AddFixup(length($makerNotes) - 4);
+    }
+    # save position of maker notes for pointer fixups
+    $fixup->{Shift} += length($makerNotes);
+    $exifTool->{MAKER_NOTE_FIXUP} = $fixup;
+    $exifTool->{MAKER_NOTE_BYTE_ORDER} = GetByteOrder();
+    # add value data
+    $makerNotes .= $makerInfo->{ValBuff};
+    # get MakerNotes tag info
+    my $tagTablePtr = Image::ExifTool::GetTagTable('Image::ExifTool::Exif::Main');
+    my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, 0x927c);
+    # save the MakerNotes
+    $exifTool->FoundTag($tagInfo, $makerNotes);
+    # save the garbage collection some work later
+    delete $makerInfo->{Entries};
+    delete $makerInfo->{ValBuff};
+    delete $makerInfo->{FixupTags};
+    # also generate Orientation tag since Rotation isn't transferred from RAW info
+    my $rotation = $exifTool->GetValue('Rotation', 'ValueConv');
+    if (defined $rotation and defined $mapRotation{$rotation}) {
+        $tagInfo = $exifTool->GetTagInfo($tagTablePtr, 0x112);
+        $exifTool->FoundTag($tagInfo, $mapRotation{$rotation});
+    }
+}
+
+#------------------------------------------------------------------------------
+# Check CanonRaw information
+# Inputs: 0) ExifTool object reference, 1) tagInfo hash reference,
+#         2) raw value reference
+# Returns: error string or undef (and may change value) on success
+sub CheckCanonRaw($$$)
+{
+    my ($exifTool, $tagInfo, $valPtr) = @_;
+    my $tagName = $$tagInfo{Name};
+    if ($tagName eq 'JpgFromRaw' or $tagName eq 'ThumbnailImage') {
+        unless ($$valPtr =~ /^\xff\xd8/ or $exifTool->Options('IgnoreMinorErrors')) {
+            return '[minor] Not a valid image';
+        }
+    } else {
+        my $format = $$tagInfo{Format};
+        my $count = $$tagInfo{Count};
+        unless ($format) {
+            my $tagType = ($$tagInfo{TagID} >> 8) & 0x38;
+            $format = $crwTagFormat{$tagType};
+        }
+        $format and return Image::ExifTool::CheckValue($valPtr, $format, $count);
+    }
+    return undef;
+}
+
+#------------------------------------------------------------------------------
+# Write CR2 file
+# Inputs: 0) ExifTool ref, 1) dirInfo reference (must have read first 16 bytes)
+#         2) tag table reference
+# Returns: true on success
+sub WriteCR2($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt} or return 0;
+    my $outfile = $$dirInfo{OutFile} or return 0;
+    $$dirInfo{RAF} or return 0;
+
+    # check CR2 signature
+    if ($$dataPt !~ /^.{8}CR\x02\0/s) {
+        my ($msg, $minor);
+        if ($$dataPt =~ /^.{8}CR/s) {
+            $msg = 'Unsupported Canon RAW file. May cause problems if rewritten';
+            $minor = 1;
+        } elsif ($$dataPt =~ /^.{8}\xba\xb0\xac\xbb/s) {
+            $msg = 'Can not currently write Canon 1D RAW images';
+        } else {
+            $msg = 'Unrecognized Canon RAW file';
+        }
+        return 0 if $exifTool->Error($msg, $minor);
+    }
+
+    # CR2 has a 16-byte header
+    $$dirInfo{NewDataPos} = 16;
+    my $newData = $exifTool->WriteDirectory($dirInfo, $tagTablePtr);
+    return 0 unless defined $newData;
+    unless ($$dirInfo{LastIFD}) {
+        $exifTool->Error("CR2 image IFD may not be deleted");
+        return 0;
+    }
+
+    if (length($newData)) {
+        # build 16 byte header for Canon RAW file
+        my $header = substr($$dataPt, 0, 16);
+        # set IFD0 pointer (may not be 16 if edited by PhotoMechanic)
+        Set32u(16, \$header, 4);
+        # last 4 bytes of header is pointer to last IFD
+        Set32u($$dirInfo{LastIFD}, \$header, 12);
+        Write($outfile, $header, $newData) or return 0;
+        undef $newData;     # free memory
+
+        # copy over image data now if necessary
+        if (ref $$dirInfo{ImageData}) {
+            $exifTool->CopyImageData($$dirInfo{ImageData}, $outfile) or return 0;
+            delete $$dirInfo{ImageData};
+        }
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Write CanonRaw (CRW) information
+# Inputs: 0) ExifTool object reference, 1) source dirInfo reference,
+#         2) tag table reference
+# Returns: true on success
+# Notes: Increments ExifTool CHANGED flag for each tag changed This routine is
+# different from all of the other write routines because Canon RAW files are
+# designed well!  So it isn't necessary to buffer the data in memory before
+# writing it out.  Therefore this routine doesn't return the directory data as
+# the rest of the Write routines do.  Instead, it writes to the dirInfo
+# OutFile on the fly --> much faster, efficient, and less demanding on memory!
+sub WriteCanonRaw($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    $exifTool or return 1;    # allow dummy access to autoload this package
+    my $blockStart = $$dirInfo{DirStart};
+    my $blockSize = $$dirInfo{DirLen};
+    my $raf = $$dirInfo{RAF} or return 0;
+    my $outfile = $$dirInfo{OutFile} or return 0;
+    my $outPos = $$dirInfo{OutPos} or return 0;
+    my $outBase = $outPos;
+    my $verbose = $exifTool->Options('Verbose');
+    my $out = $exifTool->Options('TextOut');
+    my ($buff, $tagInfo);
+
+    # 4 bytes at end of block give directory position within block
+    $raf->Seek($blockStart+$blockSize-4, 0) or return 0;
+    $raf->Read($buff, 4) == 4 or return 0;
+    my $dirOffset = Get32u(\$buff,0) + $blockStart;
+    $raf->Seek($dirOffset, 0) or return 0;
+    $raf->Read($buff, 2) == 2 or return 0;
+    my $entries = Get16u(\$buff,0);             # get number of entries in directory
+    # read the directory (10 bytes per entry)
+    $raf->Read($buff, 10 * $entries) == 10 * $entries or return 0;
+    my $newDir = '';
+
+    # get hash of new information keyed by tagID
+    my $newTags = $exifTool->GetNewTagInfoHash($tagTablePtr);
+
+    # generate list of tags to add or delete (currently, we only allow JpgFromRaw
+    # and ThumbnailImage, to be added or deleted from the root CanonRaw directory)
+    my (@addTags, %delTag);
+    if ($$dirInfo{Nesting} == 0) {
+        my $tagID;
+        foreach $tagID (keys %$newTags) {
+            my $permanent = $newTags->{$tagID}->{Permanent};
+            push(@addTags, $tagID) if defined($permanent) and not $permanent;
+        }
+    }
+
+    my $index;
+    for ($index=0; ; ++$index) {
+        my ($pt, $tag, $size, $valuePtr, $ptr, $value);
+        if ($index<$entries) {
+            $pt = 10 * $index;
+            $tag = Get16u(\$buff, $pt);
+            $size = Get32u(\$buff, $pt+2);
+            $valuePtr = Get32u(\$buff, $pt+6);
+            $ptr = $valuePtr + $blockStart;        # all pointers relative to block start
+        }
+        # add any required new tags
+        # NOTE: can't currently add tags where value is stored in directory
+        if (@addTags and (not defined($tag) or $tag >= $addTags[0])) {
+            my $addTag = shift @addTags;
+            $tagInfo = $$newTags{$addTag};
+            my $newVal = $exifTool->GetNewValues($tagInfo);
+            if (defined $newVal) {
+                # pad value to an even length (Canon ImageBrowser and ZoomBrowser
+                # version 6.1.1 have problems with odd-sized embedded JPEG images
+                # even if the value is padded to maintain alignment, so do this
+                # before calculating the size for the directory entry)
+                $newVal .= "\0" if length($newVal) & 0x01;
+                # add new directory entry
+                $newDir .= Set16u($addTag) . Set32u(length($newVal)) .
+                           Set32u($outPos - $outBase);
+                # write new value data
+                Write($outfile, $newVal) or return 0;
+                $outPos += length($newVal);     # update current position
+                $verbose > 1 and print $out "    + CanonRaw:$$tagInfo{Name}\n";
+                ++$exifTool->{CHANGED};
+            }
+            # set flag to delete this tag if found later
+            $delTag{$addTag} = 1;
+        }
+        last unless defined $tag;           # all done if no more directory entries
+        return 0 if $tag & 0x8000;          # top bit should not be set
+        my $tagID = $tag & 0x3fff;          # get tag ID
+        my $tagType = ($tag >> 8) & 0x38;   # get tag type
+        my $valueInDir = ($tag & 0x4000);   # flag for value in directory
+
+        my $tagInfo = $exifTool->GetTagInfo($tagTablePtr,$tagID);
+        my $format = $crwTagFormat{$tagType};
+        my ($count, $subdir);
+        if ($tagInfo) {
+            $subdir = $$tagInfo{SubDirectory};
+            $format = $$tagInfo{Format} if $$tagInfo{Format};
+            $count = $$tagInfo{Count};
+        }
+        if ($valueInDir) {
+            $size = 8;
+            $value = substr($buff, $pt+2, $size);
+            # set count to 1 by default for normal values in directory
+            $count = 1 if not defined $count and $format and
+                          $format ne 'string' and not $subdir;
+        } else {
+            if ($tagType==0x28 or $tagType==0x30) {
+                # this type of tag specifies a raw subdirectory
+                my $name;
+                $tagInfo and $name = $$tagInfo{Name};
+                $name or $name = sprintf("CanonRaw_0x%.4x", $tagID);
+                my %subdirInfo = (
+                    DirName  => $name,
+                    DataLen  => 0,
+                    DirStart => $ptr,
+                    DirLen   => $size,
+                    Nesting  => $$dirInfo{Nesting} + 1,
+                    RAF      => $raf,
+                    Parent   => $$dirInfo{DirName},
+                    OutFile  => $outfile,
+                    OutPos   => $outPos,
+                );
+                my $result = $exifTool->WriteDirectory(\%subdirInfo, $tagTablePtr);
+                return 0 unless $result;
+                # set size and pointer for this new directory
+                $size = $subdirInfo{OutPos} - $outPos;
+                $valuePtr = $outPos - $outBase;
+                $outPos = $subdirInfo{OutPos};
+            } else {
+                # verify that the value data is within this block
+                $valuePtr + $size <= $blockSize or return 0;
+                # read value from file
+                $raf->Seek($ptr, 0) or return 0;
+                $raf->Read($value, $size) == $size or return 0;
+            }
+        }
+        # set count from tagInfo count if necessary
+        if ($format and not $count) {
+            # set count according to format and size
+            my $fnum = $Image::ExifTool::Exif::formatNumber{$format};
+            my $fsiz = $Image::ExifTool::Exif::formatSize[$fnum];
+            $count = int($size / $fsiz);
+        }
+        # edit subdirectory if necessary
+        if ($tagInfo) {
+            if ($subdir and $$subdir{TagTable}) {
+                my $name = $$tagInfo{Name};
+                my $newTagTable = Image::ExifTool::GetTagTable($$subdir{TagTable});
+                return 0 unless $newTagTable;
+                my $subdirStart = 0;
+                #### eval Start ()
+                $subdirStart = eval $$subdir{Start} if $$subdir{Start};
+                my $dirData = \$value;
+                my %subdirInfo = (
+                    Name     => $name,
+                    DataPt   => $dirData,
+                    DataLen  => $size,
+                    DirStart => $subdirStart,
+                    DirLen   => $size - $subdirStart,
+                    Nesting  => $$dirInfo{Nesting} + 1,
+                    RAF      => $raf,
+                    Parent   => $$dirInfo{DirName},
+                );
+                #### eval Validate ($dirData, $subdirStart, $size)
+                if (defined $$subdir{Validate} and not eval $$subdir{Validate}) {
+                    $exifTool->Warn("Invalid $name data");
+                } else {
+                    $subdir = $exifTool->WriteDirectory(\%subdirInfo, $newTagTable);
+                    if (defined $subdir and length $subdir) {
+                        if ($subdirStart) {
+                            # add header before data directory
+                            $value = substr($value, 0, $subdirStart) . $subdir;
+                        } else {
+                            $value = $subdir;
+                        }
+                    }
+                }
+            } elsif ($$newTags{$tagID}) {
+                if ($delTag{$tagID}) {
+                    $verbose > 1 and print $out "    - CanonRaw:$$tagInfo{Name}\n";
+                    ++$exifTool->{CHANGED};
+                    next;   # next since we already added this tag
+                }
+                my $oldVal;
+                if ($format) {
+                    $oldVal = ReadValue(\$value, 0, $format, $count, $size);
+                } else {
+                    $oldVal = $value;
+                }
+                my $nvHash = $exifTool->GetNewValueHash($tagInfo);
+                if (Image::ExifTool::IsOverwriting($nvHash, $oldVal)) {
+                    my $newVal = Image::ExifTool::GetNewValues($nvHash);
+                    my $verboseVal;
+                    $verboseVal = $newVal if $verbose > 1;
+                    # convert to specified format if necessary
+                    if (defined $newVal and $format) {
+                        $newVal = WriteValue($newVal, $format, $count);
+                    }
+                    if (defined $newVal) {
+                        $value = $newVal;
+                        ++$exifTool->{CHANGED};
+                        $exifTool->VerboseValue("- CanonRaw:$$tagInfo{Name}", $oldVal);
+                        $exifTool->VerboseValue("+ CanonRaw:$$tagInfo{Name}", $verboseVal);
+                    }
+                }
+            }
+        }
+        if ($valueInDir) {
+            my $len = length $value;
+            if ($len < 8) {
+                # pad with original garbage in case it contained something useful
+                $value .= substr($buff, $pt+2+8-$len, 8-$len);
+            } elsif ($len > 8) {   # this shouldn't happen
+                warn "Value too long! -- trucated\n";
+                $value = substr($value, 0, 8);
+            }
+            # create new directory entry
+            $newDir .= Set16u($tag) . $value;
+            next;   # all done this entry
+        }
+        if (defined $value) {
+            # don't allow value to change length unless Writable is 'resize'
+            my $writable = $$tagInfo{Writable};
+            my $diff = length($value) - $size;
+            if ($diff) {
+                if ($writable and $writable eq 'resize') {
+                    $size += $diff; # allow size to change
+                } elsif ($diff > 0) {
+                    $value .= ("\0" x $diff);
+                } else {
+                    $value = substr($value, 0, $size);
+                }
+            }
+            # pad value if necessary to align on even-byte boundary (as per CIFF spec)
+            $value .= "\0" if $size & 0x01;
+            $valuePtr = $outPos - $outBase;
+            # write out value data
+            Write($outfile, $value) or return 0;
+            $outPos += length($value);  # update current position in outfile
+        }
+        # create new directory entry
+        $newDir .= Set16u($tag) . Set32u($size) . Set32u($valuePtr);
+    }
+    # add the directory counts and offset to the directory start,
+    $entries = length($newDir) / 10;
+    $newDir = Set16u($entries) . $newDir . Set32u($outPos - $outBase);
+    # write directory data
+    Write($outfile, $newDir) or return 0;
+
+    # update current output file position in dirInfo
+    $$dirInfo{OutPos} = $outPos + length($newDir);
+    # save outfile directory start (needed for rewriting VRD trailer)
+    $$dirInfo{OutDirStart} = $outPos - $outBase;
+
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# write Canon RAW (CRW) file
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 on success, 0 if this wasn't a valid CRW file,
+#          or -1 if a write error occurred
+sub WriteCRW($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $outfile = $$dirInfo{OutFile};
+    my $raf = $$dirInfo{RAF};
+    my $rtnVal = 0;
+    my ($buff, $err, $sig);
+
+    $raf->Read($buff,2) == 2    or return 0;
+    SetByteOrder($buff)         or return 0;
+    $raf->Read($buff,4) == 4    or return 0;
+    $raf->Read($sig,8) == 8     or return 0;   # get file signature
+    $sig =~ /^HEAP(CCDR|JPGM)/  or return 0;   # validate signature
+    my $type = $1;
+    my $hlen = Get32u(\$buff, 0);   # get header length
+
+    if ($exifTool->{DEL_GROUP}->{MakerNotes}) {
+        if ($type eq 'CCDR') {
+            $exifTool->Error("Can't delete MakerNotes group in CRW file");
+            return 0;
+        } else {
+            ++$exifTool->{CHANGED};
+            return 1;
+        }
+    }
+    # make XMP the preferred group for CRW files
+    if ($$exifTool{FILE_TYPE} eq 'CRW') {
+        $exifTool->InitWriteDirs(\%crwMap, 'XMP');
+    }
+
+    # write header
+    $raf->Seek(0, 0)            or return 0;
+    $raf->Read($buff, $hlen) == $hlen or return 0;
+    Write($outfile, $buff) or $err = 1;
+
+    $raf->Seek(0, 2)            or return 0;   # seek to end of file
+    my $filesize = $raf->Tell() or return 0;
+
+    # build directory information for main raw directory
+    my %dirInfo = (
+        DataLen  => 0,
+        DirStart => $hlen,
+        DirLen   => $filesize - $hlen,
+        Nesting  => 0,
+        RAF      => $raf,
+        Parent   => 'CRW',
+        OutFile  => $outfile,
+        OutPos   => $hlen,
+    );
+    # process the raw directory
+    my $tagTablePtr = Image::ExifTool::GetTagTable('Image::ExifTool::CanonRaw::Main');
+    my $success = $exifTool->WriteDirectory(\%dirInfo, $tagTablePtr);
+
+    my $trailPt;
+    while ($success) {
+        # check to see if trailer(s) exist(s)
+        my $trailInfo = Image::ExifTool::IdentifyTrailer($raf) or last;
+        # rewrite the trailer(s)
+        $buff = '';
+        $$trailInfo{OutFile} = \$buff;
+        $success = $exifTool->ProcessTrailers($trailInfo) or last;
+        $trailPt = $$trailInfo{OutFile};
+        # nothing to write if trailers were deleted
+        undef $trailPt if length($$trailPt) < 4;
+        last;
+    }
+    if ($success) {
+        # add CanonVRD trailer if writing as a block
+        $trailPt = $exifTool->AddNewTrailers($trailPt,'CanonVRD');
+        if (not $trailPt and $$exifTool{ADD_DIRS}{CanonVRD}) {
+            # create CanonVRD from scratch if necessary
+            my $outbuff = '';
+            my $saveOrder = GetByteOrder();
+            require Image::ExifTool::CanonVRD;
+            if (Image::ExifTool::CanonVRD::ProcessCanonVRD($exifTool, { OutFile => \$outbuff }) > 0) {
+                $trailPt = \$outbuff;
+            }
+            SetByteOrder($saveOrder);
+        }
+        # write trailer
+        if ($trailPt) {
+            # must append DirStart pointer to end of trailer
+            my $newDirStart = Set32u($dirInfo{OutDirStart});
+            my $len = length $$trailPt;
+            my $pad = ($len & 0x01) ? ' ' : ''; # add pad byte if necessary
+            Write($outfile, $pad, substr($$trailPt,0,$len-4), $newDirStart) or $err = 1;
+        }
+        $rtnVal = $err ? -1 : 1;
+    } else {
+        $exifTool->Error('Error rewriting CRW file');
+    }
+    return $rtnVal;
+}
+
+1; # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::WriteCanonRaw.pl - Write Canon RAW (CRW and CR2) information
+
+=head1 SYNOPSIS
+
+These routines are autoloaded by Image::ExifTool::CanonRaw.
+
+=head1 DESCRIPTION
+
+This file contains routines used by ExifTool to write Canon CRW and CR2
+files and metadata.
+
+=head1 NOTES
+
+The CRW format is a pleasure to work with.  All pointer offsets are relative
+to the start of the data for each directory.  If TIFF/EXIF had implemented
+pointers in this way, it would be MUCH easier to read and write TIFF/JPEG
+files, and would lead to far fewer problems with corrupted metadata.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::CanonRaw(3pm)|Image::ExifTool::CanonRaw>,
+L<Image::ExifTool(3pm)|Image::ExifTool>,
+L<http://owl.phy.queensu.ca/~phil/exiftool/canon_raw.html>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/WriteExif.pl
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/WriteExif.pl	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/WriteExif.pl	(revision 24799)
@@ -0,0 +1,3429 @@
+#------------------------------------------------------------------------------
+# File:         WriteExif.pl
+#
+# Description:  Write EXIF meta information
+#
+# Revisions:    12/13/2004 - P. Harvey Created
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Exif;
+
+use strict;
+use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber
+            %compression %photometricInterpretation %orientation);
+
+use Image::ExifTool::Fixup;
+
+sub InsertWritableProperties($$;$);
+
+# some information may be stored in different IFD's with the same meaning.
+# Use this lookup to decide when we should delete information that is stored
+# in another IFD when we write it to the preferred IFD.
+my %crossDelete = (
+    ExifIFD => 'IFD0',
+    IFD0    => 'ExifIFD',
+);
+
+# mandatory tag default values
+my %mandatory = (
+    IFD0 => {
+        0x011a => 72,       # XResolution
+        0x011b => 72,       # YResolution
+        0x0128 => 2,        # ResolutionUnit (inches)
+        0x0213 => 1,        # YCbCrPositioning (centered)
+      # 0x8769 => ????,     # ExifOffset
+    },
+    IFD1 => {
+        0x0103 => 6,        # Compression (JPEG)
+        0x011a => 72,       # XResolution
+        0x011b => 72,       # YResolution
+        0x0128 => 2,        # ResolutionUnit (inches)
+    },
+    ExifIFD => {
+        0x9000 => '0230',   # ExifVersion
+        0x9101 => "1 2 3 0",# ComponentsConfiguration
+        0xa000 => '0100',   # FlashpixVersion
+        0xa001 => 0xffff,   # ColorSpace (uncalibrated)
+      # 0xa002 => ????,     # ExifImageWidth
+      # 0xa003 => ????,     # ExifImageHeight
+    },
+    GPS => {
+        0x0000 => '2 3 0 0',# GPSVersionID
+    },
+    InteropIFD => {
+        0x0002 => '0100',   # InteropVersion
+    },
+);
+
+# The main EXIF table is unique because the tags from this table may appear
+# in many different directories.  For this reason, we introduce a
+# "WriteGroup" member to the tagInfo that tells us the preferred location
+# for writing each tag.  Here is the lookup for Writable flag (format)
+# and WriteGroup for all writable tags
+# - WriteGroup is ExifIFD unless otherwise specified
+# - Protected is 1 if the tag shouldn't be copied with SetNewValuesFromFile()
+my %writeTable = (
+    0x0001 => {             # InteropIndex
+        Protected => 1,
+        Writable => 'string',
+        WriteGroup => 'InteropIFD',
+    },
+    0x0002 => {             # InteropVersion
+        Protected => 1,
+        Writable => 'undef',
+        Mandatory => 1,
+        WriteGroup => 'InteropIFD',
+    },
+    0x000b => {             # ProcessingSoftware
+        Writable => 'string',
+        WriteGroup => 'IFD0',
+    },
+    0x00fe => {             # SubfileType
+        Protected => 1,
+        Writable => 'int32u',
+        WriteGroup => 'IFD0',
+    },
+    0x00ff => {             # OldSubfileType
+        Protected => 1,
+        Writable => 'int16u',
+        WriteGroup => 'IFD0',
+    },
+    0x0100 => {             # ImageWidth
+        Protected => 1,
+        Writable => 'int32u',
+        WriteGroup => 'IFD0',
+    },
+    0x0101 => {             # ImageHeight
+        Protected => 1,
+        Writable => 'int32u',
+        WriteGroup => 'IFD0',
+    },
+    0x0102 => {             # BitsPerSample
+        Protected => 1,
+        Writable => 'int16u',
+        WriteGroup => 'IFD0',
+        Count => -1, # can be 1 or 3: -1 means 'variable'
+    },
+    0x0103 => {             # Compression
+        Protected => 1,
+        Writable => 'int16u',
+        WriteGroup => 'IFD0',
+        Mandatory => 1,
+    },
+    0x0106 => {             # PhotometricInterpretation
+        Protected => 1,
+        Writable => 'int16u',
+        WriteGroup => 'IFD0',
+    },
+    0x0107 => {             # Thresholding
+        Protected => 1,
+        Writable => 'int16u',
+        WriteGroup => 'IFD0',
+    },
+    0x0108 => {             # CellWidth
+        Protected => 1,
+        Writable => 'int16u',
+        WriteGroup => 'IFD0',
+    },
+    0x0109 => {             # CellLength
+        Protected => 1,
+        Writable => 'int16u',
+        WriteGroup => 'IFD0',
+    },
+    0x010a => {             # FillOrder
+        Protected => 1,
+        Writable => 'int16u',
+        WriteGroup => 'IFD0',
+    },
+    0x010d => {             # DocumentName
+        Writable => 'string',
+        WriteGroup => 'IFD0',
+    },
+    0x010e => {             # ImageDescription
+        Writable => 'string',
+        WriteGroup => 'IFD0',
+    },
+    0x010f => {             # Make
+        Writable => 'string',
+        WriteGroup => 'IFD0',
+    },
+    0x0110 => {             # Model
+        Writable => 'string',
+        WriteGroup => 'IFD0',
+    },
+    0x0112 => {             # Orientation
+        Writable => 'int16u',
+        WriteGroup => 'IFD0',
+    },
+    0x0115 => {             # SamplesPerPixel
+        Protected => 1,
+        Writable => 'int16u',
+        WriteGroup => 'IFD0',
+    },
+    0x0116 => {             # RowsPerStrip
+        Protected => 1,
+        Writable => 'int32u',
+        WriteGroup => 'IFD0',
+    },
+    0x0118 => {             # MinSampleValue
+        Writable => 'int16u',
+        WriteGroup => 'IFD0',
+    },
+    0x0119 => {             # MaxSampleValue
+        Writable => 'int16u',
+        WriteGroup => 'IFD0',
+    },
+    0x011a => {             # XResolution
+        Writable => 'rational64u',
+        WriteGroup => 'IFD0',
+        Mandatory => 1,
+    },
+    0x011b => {             # YResolution
+        Writable => 'rational64u',
+        WriteGroup => 'IFD0',
+        Mandatory => 1,
+    },
+    0x011c => {             # PlanarConfiguration
+        Protected => 1,
+        Writable => 'int16u',
+        WriteGroup => 'IFD0',
+    },
+    0x011d => {             # PageName
+        Writable => 'string',
+        WriteGroup => 'IFD0',
+    },
+    0x011e => {             # XPosition
+        Writable => 'rational64u',
+        WriteGroup => 'IFD0',
+    },
+    0x011f => {             # YPosition
+        Writable => 'rational64u',
+        WriteGroup => 'IFD0',
+    },
+    0x0122 => {             # GrayResponseUnit
+        Writable => 'int16u',
+        WriteGroup => 'IFD0',
+    },
+    0x0128 => {             # ResolutionUnit
+        Writable => 'int16u',
+        WriteGroup => 'IFD0',
+        Mandatory => 1,
+    },
+    0x0129 => {             # PageNumber
+        Writable => 'int16u',
+        WriteGroup => 'IFD0',
+        Count => 2,
+    },
+    0x012d => {             # TransferFunction
+        Protected => 1,
+        Writable => 'int16u',
+        WriteGroup => 'IFD0',
+        Count => 768,
+    },
+    0x0131 => {             # Software
+        Writable => 'string',
+        WriteGroup => 'IFD0',
+    },
+    0x0132 => {             # ModifyDate
+        Writable => 'string',
+        Shift => 'Time',
+        WriteGroup => 'IFD0',
+        PrintConvInv => '$self->InverseDateTime($val,0)',
+    },
+    0x013b => {             # Artist
+        Writable => 'string',
+        WriteGroup => 'IFD0',
+    },
+    0x013c => {             # HostComputer
+        Writable => 'string',
+        WriteGroup => 'IFD0',
+    },
+    0x013d => {             # Predictor
+        Protected => 1,
+        Writable => 'int16u',
+        WriteGroup => 'IFD0',
+    },
+    0x013e => {             # WhitePoint
+        Writable => 'rational64u',
+        WriteGroup => 'IFD0',
+        Count => 2,
+    },
+    0x013f => {             # PrimaryChromaticities
+        Writable => 'rational64u',
+        WriteGroup => 'IFD0',
+        Count => 6,
+    },
+    0x0141 => {             # HalftoneHints
+        Writable => 'int16u',
+        WriteGroup => 'IFD0',
+        Count => 2,
+    },
+    0x0142 => {             # TileWidth
+        Protected => 1,
+        Writable => 'int32u',
+        WriteGroup => 'IFD0',
+    },
+    0x0143 => {             # TileLength
+        Protected => 1,
+        Writable => 'int32u',
+        WriteGroup => 'IFD0',
+    },
+    0x014c => {             # InkSet
+        Writable => 'int16u',
+        WriteGroup => 'IFD0',
+    },
+    0x0150 => {             # TargetPrinter
+        Writable => 'string',
+        WriteGroup => 'IFD0',
+    },
+    0x013c => {             # HostComputer
+        Writable => 'string',
+        WriteGroup => 'IFD0',
+    },
+    0x0211 => {             # YCbCrCoefficients
+        Protected => 1,
+        Writable => 'rational64u',
+        WriteGroup => 'IFD0',
+        Count => 3,
+    },
+    0x0212 => {             # YCbCrSubSampling
+        Protected => 1,
+        Writable => 'int16u',
+        WriteGroup => 'IFD0',
+        Count => 2,
+    },
+    0x0213 => {             # YCbCrPositioning
+        Protected => 1,
+        Writable => 'int16u',
+        WriteGroup => 'IFD0',
+        Mandatory => 1,
+    },
+    0x0214 => {             # ReferenceBlackWhite
+        Writable => 'rational64u',
+        WriteGroup => 'IFD0',
+        Count => 6,
+    },
+    0x1000 => {             # RelatedImageFileFormat
+        Protected => 1,
+        Writable => 'string',
+        WriteGroup => 'InteropIFD',
+    },
+    0x1001 => {             # RelatedImageWidth
+        Protected => 1,
+        Writable => 'int16u',
+        WriteGroup => 'InteropIFD',
+    },
+    0x1002 => {             # RelatedImageHeight (more commonly RelatedImageLength)
+        Protected => 1,
+        Writable => 'int16u',
+        WriteGroup => 'InteropIFD',
+    },
+    0x4746 => {             # Rating (MicrosoftPhoto)
+        Writable => 'int16u',
+        WriteGroup => 'IFD0',
+        Avoid => 1,
+    },
+    0x4749 => {             # RatingPercent (MicrosoftPhoto)
+        Writable => 'int16u',
+        WriteGroup => 'IFD0',
+        Avoid => 1,
+    },
+    0x8298 => {             # Copyright
+        Writable => 'string',
+        WriteGroup => 'IFD0',
+        RawConvInv => q{
+            if ($val =~ /(.*?)\s*[\n\r]+\s*(.*)/s) {
+                return $1 . "\0" unless length $2;
+                # photographer copyright set to ' ' if it doesn't exist, according to spec.
+                return((length($1) ? $1 : ' ') . "\0" . $2 . "\0");
+            }
+            return $val . "\0";
+        },
+    },
+#
+# Most of the tags below this belong in the ExifIFD...
+#
+    0x829a => {             # ExposureTime
+        Writable => 'rational64u',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    0x829d => {             # FNumber
+        Writable => 'rational64u',
+        PrintConvInv => '$val',
+    },
+    0x8546 => {             # SEMInfo
+        Writable => 'string',
+        WriteGroup => 'IFD0',
+    },
+    0x8822 => 'int16u',     # ExposureProgram
+    0x8824 => 'string',     # SpectralSensitivity
+    0x8827 => {             # ISO
+        Writable => 'int16u',
+        Count => -1,
+        PrintConvInv => '$val=~tr/,//d; $val',
+    },
+    0x882a => {             # TimeZoneOffset
+        Writable => 'int16s',
+        Count => -1, # can be 1 or 2
+        Notes => q{
+            1 or 2 values: 1. The time zone offset of DateTimeOriginal from GMT in
+            hours, 2. If present, the time zone offset of ModifyDate
+        },
+    },
+    0x882b => 'int16u',     # SelfTimerMode
+    0x8830 => 'int16u',     # SensitivityType
+    0x8831 => 'int32u',     # StandardOutputSensitivity
+    0x8832 => 'int32u',     # RecommendedExposureIndex
+    0x8833 => 'int32u',     # ISOSpeed
+    0x8834 => 'int32u',     # ISOSpeedLatitudeyyy
+    0x8835 => 'int32u',     # ISOSpeedLatitudezzz
+    0x9000 => {             # ExifVersion
+        Writable => 'undef',
+        Mandatory => 1,
+    },
+    0x9003 => {             # DateTimeOriginal
+        Writable => 'string',
+        Shift => 'Time',
+        PrintConvInv => '$self->InverseDateTime($val,0)',
+    },
+    0x9004 => {             # CreateDate
+        Writable => 'string',
+        Shift => 'Time',
+        PrintConvInv => '$self->InverseDateTime($val,0)',
+    },
+    0x9101 => {             # ComponentsConfiguration
+        Protected => 1,
+        Writable => 'undef',
+        Count => 4,
+        Mandatory => 1,
+        ValueConvInv => '$val=~tr/,//d; $val',  # (so we can copy from XMP with -n)
+    },
+    0x9102 => {             # CompressedBitsPerPixel
+        Protected => 1,
+        Writable => 'rational64u',
+    },
+    0x9201 => {             # ShutterSpeedValue
+        Writable => 'rational64s',
+        ValueConvInv => '$val>0 ? -log($val)/log(2) : -100',
+        # do eval to convert things like '1/100'
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    0x9202 => {             # ApertureValue
+        Writable => 'rational64u',
+        ValueConvInv => '$val>0 ? 2*log($val)/log(2) : 0',
+        PrintConvInv => '$val',
+    },
+    0x9203 => 'rational64s',# BrightnessValue
+    0x9204 => {             # ExposureCompensation
+        Writable => 'rational64s',
+        # do eval to convert things like '+2/3'
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    0x9205 => {             # MaxApertureValue
+        Writable => 'rational64u',
+        ValueConvInv => '$val>0 ? 2*log($val)/log(2) : 0',
+        PrintConvInv => '$val',
+    },
+    0x9206 => {             # SubjectDistance
+        Writable => 'rational64u',
+        PrintConvInv => '$val=~s/\s*m$//;$val',
+    },
+    0x9207 => 'int16u',     # MeteringMode
+    0x9208 => 'int16u',     # LightSource
+    0x9209 => 'int16u',     # Flash
+    0x920a => {             # FocalLength
+        Writable => 'rational64u',
+        PrintConvInv => '$val=~s/\s*mm$//;$val',
+    },
+    0x9211 => 'int32u',     # ImageNumber
+    0x9212 => 'string',     # SecurityClassification
+    0x9213 => 'string',     # ImageHistory
+    0x9214 => {             # SubjectArea
+        Writable => 'int16u',
+        Count => -1, # 2, 3 or 4 values
+    },
+#    0x927c => 'undef',      # MakerNotes
+    0x9286 => {             # UserComment
+        Writable => 'undef',
+        #  (starts with "ASCII\0\0\0", "UNICODE\0", "JIS\0\0\0\0\0" or "\0\0\0\0\0\0\0\0")
+        RawConvInv => 'Image::ExifTool::Exif::EncodeExifText($self,$val)',
+        # SHOULD ADD SPECIAL LOGIC TO ALLOW CONDITIONAL OVERWRITE OF
+        # "UNKNOWN" VALUES FILLED WITH SPACES
+    },
+    0x9290 => {             # SubSecTime
+        Writable => 'string',
+        # extract fractional seconds from a full date/time value
+        ValueConvInv => '$val=~/^(\d+)\s*$/ ? $1 : ($val=~/\.(\d+)/ ? $1 : undef)',
+    },
+    0x9291 => {             # SubSecTimeOriginal
+        Writable => 'string',
+        ValueConvInv => '$val=~/^(\d+)\s*$/ ? $1 : ($val=~/\.(\d+)/ ? $1 : undef)',
+    },
+    0x9292 => {             # SubSecTimeDigitized
+        Writable => 'string',
+        ValueConvInv => '$val=~/^(\d+)\s*$/ ? $1 : ($val=~/\.(\d+)/ ? $1 : undef)',
+    },
+    0x935c => {             # ImageSourceData
+        Writable => 'undef',
+        WriteGroup => 'IFD0',
+        Protected => 1,
+    },
+#    0x9928 => 'undef',      # Opto-ElectricConversionFactor
+    0x9c9b => {             # XPTitle
+        Writable => 'int8u',
+        WriteGroup => 'IFD0',
+        Notes => q{
+            tags 0x9c9b-0x9c9f are used by Windows Explorer; special characters
+            in these values are converted to UTF-8 by default, or Windows Latin1
+            with the -L option.  XPTitle is ignored by Windows Explorer if
+            ImageDescription exists
+        },
+        ValueConvInv => '$self->Encode($val,"UCS2","II") . "\0\0"',
+    },
+    0x9c9c => {             # XPComment
+        Writable => 'int8u',
+        WriteGroup => 'IFD0',
+        ValueConvInv => '$self->Encode($val,"UCS2","II") . "\0\0"',
+    },
+    0x9c9d => {             # XPAuthor
+        Writable => 'int8u',
+        WriteGroup => 'IFD0',
+        Notes => 'ignored by Windows Explorer if Artist exists',
+        ValueConvInv => '$self->Encode($val,"UCS2","II") . "\0\0"',
+    },
+    0x9c9e => {             # XPKeywords
+        Writable => 'int8u',
+        WriteGroup => 'IFD0',
+        ValueConvInv => '$self->Encode($val,"UCS2","II") . "\0\0"',
+    },
+    0x9c9f => {             # XPSubject
+        Writable => 'int8u',
+        WriteGroup => 'IFD0',
+        ValueConvInv => '$self->Encode($val,"UCS2","II") . "\0\0"',
+    },
+    0xa000 => {             # FlashpixVersion
+        Writable => 'undef',
+        Mandatory => 1,
+    },
+    0xa001 => {             # ColorSpace
+        Writable => 'int16u',
+        Mandatory => 1,
+    },
+    0xa002 => {             # ExifImageWidth (could also be int32u)
+        Writable => 'int16u',
+        Mandatory => 1,
+    },
+    0xa003 => {             # ExifImageHeight (could also be int32u)
+        Writable => 'int16u',
+        Mandatory => 1,
+    },
+    0xa004 => 'string',     # RelatedSoundFile
+    0xa20b => {             # FlashEnergy
+        Writable => 'rational64u',
+        Count => -1, # 1 or 2 (ref 12)
+    },
+#    0xa20c => 'undef',      # SpatialFrequencyResponse
+    0xa20e => 'rational64u',# FocalPlaneXResolution
+    0xa20f => 'rational64u',# FocalPlaneYResolution
+    0xa210 => 'int16u',     # FocalPlaneResolutionUnit
+    0xa214 => {             # SubjectLocation
+        Writable => 'int16u',
+        Count => 2,
+    },
+    0xa215 => 'rational64u',# ExposureIndex
+    0xa217 => 'int16u',     # SensingMethod
+    0xa300 => {             # FileSource
+        Writable => 'undef',
+        ValueConvInv => '($val=~/^\d+$/ and $val < 256) ? chr($val) : $val',
+    },
+    0xa301 => {             # SceneType
+        Writable => 'undef',
+        ValueConvInv => 'chr($val)',
+    },
+    0xa302 => {             # CFAPattern
+        Writable => 'undef',
+        PrintConvInv => 'Image::ExifTool::Exif::GetCFAPattern($val)',
+    },
+    0xa401 => 'int16u',     # CustomRendered
+    0xa402 => 'int16u',     # ExposureMode
+    0xa403 => 'int16u',     # WhiteBalance
+    0xa404 => 'rational64u',# DigitalZoomRatio
+    0xa405 => {             # FocalLengthIn35mmFormat
+        Writable => 'int16u',
+        PrintConvInv => '$val=~s/\s*mm$//;$val',
+    },
+    0xa406 => 'int16u',     # SceneCaptureType
+    0xa407 => 'int16u',     # GainControl
+    0xa408 => {             # Contrast
+        Writable => 'int16u',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertParameter($val)',
+    },
+    0xa409 => {             # Saturation
+        Writable => 'int16u',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertParameter($val)',
+    },
+    0xa40a => {             # Sharpness
+        Writable => 'int16u',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertParameter($val)',
+    },
+#    0xa40b => 'undef',      # DeviceSettingDescription
+    0xa40c => 'int16u',     # SubjectDistanceRange
+    0xa420 => 'string',     # ImageUniqueID
+    0xa430 => 'string',     # OwnerName
+    0xa431 => 'string',     # SerialNumber
+    0xa432 => {             # LensInfo
+        Writable => 'rational64u',
+        Count => 4,
+        PrintConvInv => \&ConvertLensInfo,
+    },
+    0xa433 => 'string',     # LensMake
+    0xa434 => 'string',     # LensModel
+    0xa435 => 'string',     # LensSerialNumber
+    0xa500 => 'rational64u',# Gamma
+#
+# DNG stuff (back in IFD0)
+#
+    0xc612 => {             # DNGVersion
+        Writable => 'int8u',
+        WriteGroup => 'IFD0',
+        Count => 4,
+        Protected => 1, # (confuses Apple Preview if written to a TIFF image)
+        PrintConvInv => '$val =~ tr/./ /; $val',
+    },
+    0xc613 => {             # DNGBackwardVersion
+        Writable => 'int8u',
+        WriteGroup => 'IFD0',
+        Count => 4,
+        Protected => 1,
+    },
+    0xc614 => {             # UniqueCameraModel
+        Writable => 'string',
+        WriteGroup => 'IFD0',
+    },
+    0xc615 => {             # LocalizedCameraModel
+        Writable => 'string',
+        WriteGroup => 'IFD0',
+        PrintConvInv => '$val',
+    },
+    0xc619 => {             # BlackLevelRepeatDim
+        Writable => 'int16u',
+        WriteGroup => 'SubIFD',
+        Count => 2,
+        Protected => 1,
+    },
+    0xc61a => {             # BlackLevel
+        Writable => 'rational64u',
+        WriteGroup => 'SubIFD',
+        Count => -1,
+        Protected => 1,
+    },
+    0xc61d => {             # WhiteLevel
+        Writable => 'int32u',
+        WriteGroup => 'SubIFD',
+        Count => -1,
+        Protected => 1,
+    },
+    0xc61e => {             # DefaultScale
+        Writable => 'rational64u',
+        WriteGroup => 'SubIFD',
+        Count => 2,
+        Protected => 1,
+    },
+    0xc61f => {             # DefaultCropOrigin
+        Writable => 'int32u',
+        WriteGroup => 'SubIFD',
+        Count => 2,
+        Protected => 1,
+    },
+    0xc620 => {             # DefaultCropSize
+        Writable => 'int32u',
+        WriteGroup => 'SubIFD',
+        Count => 2,
+        Protected => 1,
+    },
+    0xc621 => {             # ColorMatrix1
+        Writable => 'rational64s',
+        Count => -1,
+        WriteGroup => 'IFD0',
+        Protected => 1,
+    },
+    0xc622 => {             # ColorMatrix2
+        Writable => 'rational64s',
+        Count => -1,
+        WriteGroup => 'IFD0',
+        Protected => 1,
+    },
+    0xc623 => {             # CameraCalibration1
+        Writable => 'rational64s',
+        Count => -1,
+        WriteGroup => 'IFD0',
+        Protected => 1,
+    },
+    0xc624 => {             # CameraCalibration2
+        Writable => 'rational64s',
+        Count => -1,
+        WriteGroup => 'IFD0',
+        Protected => 1,
+    },
+    0xc625 => {             # ReductionMatrix1
+        Writable => 'rational64s',
+        Count => -1,
+        WriteGroup => 'IFD0',
+        Protected => 1,
+    },
+    0xc626 => {             # ReductionMatrix2
+        Writable => 'rational64s',
+        Count => -1,
+        WriteGroup => 'IFD0',
+        Protected => 1,
+    },
+    0xc627 => {             # AnalogBalance
+        Writable => 'rational64u',
+        Count => -1,
+        WriteGroup => 'IFD0',
+        Protected => 1,
+    },
+    0xc628 => {             # AsShotNeutral
+        Writable => 'rational64u',
+        WriteGroup => 'IFD0',
+        Count => -1,
+        Protected => 1,
+    },
+    0xc629 => {             # AsShotWhiteXY
+        Writable => 'rational64u',
+        WriteGroup => 'IFD0',
+        Count => 2,
+        Protected => 1,
+    },
+    0xc62a => {             # BaselineExposure
+        Writable => 'rational64s',
+        WriteGroup => 'IFD0',
+        Protected => 1,
+    },
+    0xc62b => {             # BaselineNoise
+        Writable => 'rational64u',
+        WriteGroup => 'IFD0',
+        Protected => 1,
+    },
+    0xc62c => {             # BaselineSharpness
+        Writable => 'rational64u',
+        WriteGroup => 'IFD0',
+        Protected => 1,
+    },
+    0xc62d => {             # BayerGreenSplit
+        Writable => 'int32u',
+        WriteGroup => 'SubIFD',
+        Protected => 1,
+    },
+    0xc62e => {             # LinearResponseLimit
+        Writable => 'rational64u',
+        WriteGroup => 'IFD0',
+        Protected => 1,
+    },
+    0xc62f => {             # CameraSerialNumber
+        Writable => 'string',
+        WriteGroup => 'IFD0',
+    },
+    0xc630 => {             # DNGLensInfo
+        Writable => 'rational64u',
+        WriteGroup => 'IFD0',
+        Count => 4,
+        PrintConvInv => \&ConvertLensInfo,
+    },
+    0xc631 => {             # ChromaBlurRadius
+        Writable => 'rational64u',
+        WriteGroup => 'SubIFD',
+        Protected => 1,
+    },
+    0xc632 => {             # AntiAliasStrength
+        Writable => 'rational64u',
+        WriteGroup => 'SubIFD',
+        Protected => 1,
+    },
+    0xc633 => {             # ShadowScale
+        Writable => 'rational64u',
+        WriteGroup => 'IFD0',
+        Protected => 1,
+    },
+    0xc635 => {             # MakerNoteSafety
+        Writable => 'int16u',
+        WriteGroup => 'IFD0',
+    },
+    0xc65a => {             # CalibrationIlluminant1
+        Writable => 'int16u',
+        WriteGroup => 'IFD0',
+        Protected => 1,
+    },
+    0xc65b => {             # CalibrationIlluminant2
+        Writable => 'int16u',
+        WriteGroup => 'IFD0',
+        Protected => 1,
+    },
+    0xc65c => {             # BestQualityScale
+        Writable => 'rational64u',
+        WriteGroup => 'SubIFD',
+        Protected => 1,
+    },
+    0xc65d => {             # RawDataUniqueID
+        Writable => 'int8u',
+        WriteGroup => 'IFD0',
+        Count => 16,
+        ValueConvInv => 'pack("H*", $val)',
+        Protected => 1,
+    },
+    0xc68b => {             # OriginalRawFileName
+        Writable => 'string',
+        WriteGroup => 'IFD0',
+        Protected => 1,
+    },
+    0xc68d => {             # ActiveArea
+        Writable => 'int32u',
+        WriteGroup => 'SubIFD',
+        Count => 4,
+        Protected => 1,
+    },
+    0xc68e => {             # MaskedAreas
+        Writable => 'int32u',
+        WriteGroup => 'SubIFD',
+        Count => 4,
+        Protected => 1,
+    },
+    0xc68f => {             # AsShotICCProfile (writable directory)
+        WriteGroup => 'IFD0',
+        Protected => 1,
+        WriteCheck => q{
+            require Image::ExifTool::ICC_Profile;
+            return Image::ExifTool::ICC_Profile::ValidateICC(\$val);
+        },
+    },
+    0xc690 => {             # AsShotPreProfileMatrix
+        Writable => 'rational64s',
+        Count => -1,
+        WriteGroup => 'IFD0',
+        Protected => 1,
+    },
+    0xc691 => {             # CurrentICCProfile (writable directory)
+        Writable => 'undef',
+        WriteGroup => 'IFD0',
+        Protected => 1,
+        WriteCheck => q{
+            require Image::ExifTool::ICC_Profile;
+            return Image::ExifTool::ICC_Profile::ValidateICC(\$val);
+        },
+    },
+    0xc692 => {             # CurrentPreProfileMatrix
+        Writable => 'rational64s',
+        Count => -1,
+        WriteGroup => 'IFD0',
+        Protected => 1,
+    },
+    0xc6bf => {             # ColorimetricReference
+        Writable => 'int16u',
+        WriteGroup => 'IFD0',
+        Protected => 1,
+    },
+    0xc6d2 => {             # PanasonicTitle (Panasonic DMC-TZ5, not a DNG tag)
+        Writable => 'undef',
+        WriteGroup => 'IFD0',
+        ValueConvInv => '$self->Encode($val,"UTF8")',
+    },
+    0xc6d3 => {             # PanasonicTitle2 (Panasonic DMC-FS7, not a DNG tag)
+        Writable => 'undef',
+        WriteGroup => 'IFD0',
+        ValueConvInv => '$self->Encode($val,"UTF8")',
+    },
+    0xc6f3 => {             # CameraCalibrationSig
+        Writable => 'string',
+        WriteGroup => 'IFD0',
+        Protected => 1,
+    },
+    0xc6f4 => {             # ProfileCalibrationSig
+        Writable => 'string',
+        WriteGroup => 'IFD0',
+        Protected => 1,
+    },
+    0xc6f6 => {             # AsShotProfileName
+        Writable => 'string',
+        WriteGroup => 'IFD0',
+        Protected => 1,
+    },
+    0xc6f7 => {             # NoiseReductionApplied
+        Writable => 'rational64u',
+        WriteGroup => 'SubIFD',
+        Protected => 1,
+    },
+    0xc6f8 => {             # ProfileName
+        Writable => 'string',
+        WriteGroup => 'IFD0',
+        Protected => 1,
+    },
+    0xc6f9 => {             # ProfileHueSatMapDims
+        Writable => 'int32u',
+        Count => 3,
+        WriteGroup => 'IFD0',
+        Protected => 1,
+    },
+    0xc6fa => {             # ProfileHueSatMapData1
+        Writable => 'float',
+        Count => -1,
+        WriteGroup => 'IFD0',
+        Protected => 1,
+    },
+    0xc6fb => {             # ProfileHueSatMapData2
+        Writable => 'float',
+        Count => -1,
+        WriteGroup => 'IFD0',
+        Protected => 1,
+    },
+    0xc6fc => {             # ProfileToneCurve
+        Writable => 'float',
+        Count => -1,
+        WriteGroup => 'IFD0',
+        Protected => 1,
+    },
+    0xc6fd => {             # ProfileEmbedPolicy
+        Writable => 'int32u',
+        WriteGroup => 'IFD0',
+        Protected => 1,
+    },
+    0xc6fe => {             # ProfileCopyright
+        Writable => 'string',
+        WriteGroup => 'IFD0',
+        Protected => 1,
+    },
+    0xc714 => {             # ForwardMatrix1
+        Writable => 'rational64s',
+        Count => -1,
+        WriteGroup => 'IFD0',
+        Protected => 1,
+    },
+    0xc715 => {             # ForwardMatrix2
+        Writable => 'rational64s',
+        Count => -1,
+        WriteGroup => 'IFD0',
+        Protected => 1,
+    },
+    0xc716 => {             # PreviewApplicationName
+        Writable => 'string',
+        WriteGroup => 'IFD0',
+        Protected => 1,
+    },
+    0xc717 => {             # PreviewApplicationVersion
+        Writable => 'string',
+        WriteGroup => 'IFD0',
+        Protected => 1,
+    },
+    0xc718 => {             # PreviewSettingsName
+        Writable => 'string',
+        WriteGroup => 'IFD0',
+        Protected => 1,
+    },
+    0xc719 => {             # PreviewSettingsDigest
+        Writable => 'int8u',
+        WriteGroup => 'IFD0',
+        Protected => 1,
+        ValueConvInv => 'pack("H*", $val)',
+    },
+    0xc71a => {             # PreviewColorSpace
+        Writable => 'int32u',
+        WriteGroup => 'IFD0',
+        Protected => 1,
+        PrintConv => {
+            0 => 'Unknown',
+            1 => 'Gray Gamma 2.2',
+            2 => 'sRGB',
+            3 => 'Adobe RGB',
+            4 => 'ProPhoto RGB',
+        },
+    },
+    0xc71b => {             # PreviewDateTime
+        Writable => 'string',
+        WriteGroup => 'IFD0',
+        Protected => 1,
+        ValueConvInv => q{
+            require Image::ExifTool::XMP;
+            return Image::ExifTool::XMP::FormatXMPDate($val);
+        },
+        PrintConvInv => '$self->InverseDateTime($val,1,1)',
+    },
+    0xc71c => {             # RawImageDigest
+        Writable => 'int8u',
+        WriteGroup => 'IFD0',
+        Protected => 1,
+        ValueConvInv => 'pack("H*", $val)',
+    },
+    0xc71d => {             # OriginalRawFileDigest
+        Writable => 'int8u',
+        WriteGroup => 'IFD0',
+        Protected => 1,
+        ValueConvInv => 'pack("H*", $val)',
+    },
+    0xc725 => {             # ProfileLookTableDims
+        Writable => 'int32u',
+        Count => 3,
+        WriteGroup => 'IFD0',
+        Protected => 1,
+    },
+    0xc726 => {             # ProfileLookTableData
+        Writable => 'float',
+        Count => -1,
+        WriteGroup => 'IFD0',
+        Protected => 1,
+    },
+    0xea1d => {             # OffsetSchema
+        Writable => 'int32s',
+    },
+    # tags produced by Photoshop Camera RAW
+    # (avoid creating these tags unless there is no other option)
+    0xfde8 => {
+        Name => 'OwnerName',
+        Avoid => 1,
+        Writable => 'string',
+        ValueConv => '$val=~s/.*: //;$val',
+        ValueConvInv => q{"Owner's Name: $val"},
+        Notes => q{
+            tags 0xfde8-0xfdea and 0xfe4c-0xfe58 are generated by Photoshop Camera RAW.
+            Some names are the same as other EXIF tags, but ExifTool will avoid writing
+            these unless they already exist in the file
+        },
+    },
+    0xfde9 => {
+        Name => 'SerialNumber',
+        Avoid => 1,
+        Writable => 'string',
+        ValueConv => '$val=~s/.*: //;$val',
+        ValueConvInv => q{"Serial Number: $val"},
+    },
+    0xfdea => {
+        Name => 'Lens',
+        Avoid => 1,
+        Writable => 'string',
+        ValueConv => '$val=~s/.*: //;$val',
+        ValueConvInv => q{"Lens: $val"},
+    },
+    0xfe4c => {
+        Name => 'RawFile',
+        Avoid => 1,
+        Writable => 'string',
+        ValueConv => '$val=~s/.*: //;$val',
+        ValueConvInv => q{"Raw File: $val"},
+    },
+    0xfe4d => {
+        Name => 'Converter',
+        Avoid => 1,
+        Writable => 'string',
+        ValueConv => '$val=~s/.*: //;$val',
+        ValueConvInv => q{"Converter: $val"},
+    },
+    0xfe4e => {
+        Name => 'WhiteBalance',
+        Avoid => 1,
+        Writable => 'string',
+        ValueConv => '$val=~s/.*: //;$val',
+        ValueConvInv => q{"White Balance: $val"},
+    },
+    0xfe51 => {
+        Name => 'Exposure',
+        Avoid => 1,
+        Writable => 'string',
+        ValueConv => '$val=~s/.*: //;$val',
+        ValueConvInv => q{"Exposure: $val"},
+    },
+    0xfe52 => {
+        Name => 'Shadows',
+        Avoid => 1,
+        Writable => 'string',
+        ValueConv => '$val=~s/.*: //;$val',
+        ValueConvInv => q{"Shadows: $val"},
+    },
+    0xfe53 => {
+        Name => 'Brightness',
+        Avoid => 1,
+        Writable => 'string',
+        ValueConv => '$val=~s/.*: //;$val',
+        ValueConvInv => q{"Brightness: $val"},
+    },
+    0xfe54 => {
+        Name => 'Contrast',
+        Avoid => 1,
+        Writable => 'string',
+        ValueConv => '$val=~s/.*: //;$val',
+        ValueConvInv => q{"Contrast: $val"},
+    },
+    0xfe55 => {
+        Name => 'Saturation',
+        Avoid => 1,
+        Writable => 'string',
+        ValueConv => '$val=~s/.*: //;$val',
+        ValueConvInv => q{"Saturation: $val"},
+    },
+    0xfe56 => {
+        Name => 'Sharpness',
+        Avoid => 1,
+        Writable => 'string',
+        ValueConv => '$val=~s/.*: //;$val',
+        ValueConvInv => q{"Sharpness: $val"},
+    },
+    0xfe57 => {
+        Name => 'Smoothness',
+        Avoid => 1,
+        Writable => 'string',
+        ValueConv => '$val=~s/.*: //;$val',
+        ValueConvInv => q{"Smoothness: $val"},
+    },
+    0xfe58 => {
+        Name => 'MoireFilter',
+        Avoid => 1,
+        Writable => 'string',
+        ValueConv => '$val=~s/.*: //;$val',
+        ValueConvInv => q{"Moire Filter: $val"},
+    },
+);
+
+# insert our writable properties into main EXIF tag table
+InsertWritableProperties(\%Image::ExifTool::Exif::Main, \%writeTable, \&CheckExif);
+
+#------------------------------------------------------------------------------
+# Inverse print conversion for LensInfo
+# Inputs: 0) lens info string
+# Returns: PrintConvInv of string
+sub ConvertLensInfo($)
+{
+    my $val = shift;
+    my @a = GetLensInfo($val, 1); # (allow unknown "?" values)
+    return @a ? join(' ', @a) : $val;
+}
+
+#------------------------------------------------------------------------------
+# Get binary CFA Pattern from a text string
+# Inputs: CFA pattern string (ie. '[Blue,Green][Green,Red]')
+# Returns: Binary CFA data or prints warning and returns undef on error
+sub GetCFAPattern($)
+{
+    my $val = shift;
+    my @rows = split /\]\s*\[/, $val;
+    @rows or warn("Rows not properly bracketed by '[]'\n"), return undef;
+    my @cols = split /,/, $rows[0];
+    @cols or warn("Colors not separated by ','\n"), return undef;
+    my $ny = @cols;
+    my $rtnVal = Set16u(scalar(@rows)) . Set16u(scalar(@cols));
+    my %cfaLookup = (red=>0, green=>1, blue=>2, cyan=>3, magenta=>4, yellow=>5, white=>6);
+    my $row;
+    foreach $row (@rows) {
+        @cols = split /,/, $row;
+        @cols == $ny or warn("Inconsistent number of colors in each row\n"), return undef;
+        foreach (@cols) {
+            tr/ \]\[//d;    # remove remaining brackets and any spaces
+            my $c = $cfaLookup{lc($_)};
+            defined $c or warn("Unknown color '$_'\n"), return undef;
+            $rtnVal .= Set8u($c);
+        }
+    }
+    return $rtnVal;
+}
+
+#------------------------------------------------------------------------------
+# validate raw values for writing
+# Inputs: 0) ExifTool ref, 1) tagInfo hash ref, 2) raw value ref
+# Returns: error string or undef (and possibly changes value) on success
+sub CheckExif($$$)
+{
+    my ($exifTool, $tagInfo, $valPtr) = @_;
+    my $format = $$tagInfo{Format} || $$tagInfo{Writable} || $tagInfo->{Table}{WRITABLE};
+    if (not $format or $format eq '1') {
+        if ($tagInfo->{Groups}{0} eq 'MakerNotes') {
+            return undef;   # OK to have no format for makernotes
+        } else {
+            return 'No writable format';
+        }
+    }
+    return Image::ExifTool::CheckValue($valPtr, $format, $$tagInfo{Count});
+}
+
+#------------------------------------------------------------------------------
+# encode exif ASCII/Unicode text from UTF8 or Latin
+# Inputs: 0) ExifTool ref, 1) text string
+# Returns: encoded string
+# Note: MUST be called Raw conversion time so the EXIF byte order is known!
+sub EncodeExifText($$)
+{
+    my ($exifTool, $val) = @_;
+    # does the string contain special characters?
+    if ($val =~ /[\x80-\xff]/) {
+        my $order = $exifTool->GetNewValues('ExifUnicodeByteOrder');
+        return "UNICODE\0" . $exifTool->Encode($val,'UCS2',$order);
+    } else {
+        return "ASCII\0\0\0$val";
+    }
+}
+
+#------------------------------------------------------------------------------
+# insert writable properties into main tag table
+# Inputs: 0) tag table ref, 1) reference to writable properties
+#         2) [optional] CHECK_PROC reference
+sub InsertWritableProperties($$;$)
+{
+    my ($tagTablePtr, $writeTablePtr, $checkProc) = @_;
+    my $tag;
+    $checkProc and $tagTablePtr->{CHECK_PROC} = $checkProc;
+    foreach $tag (keys %$writeTablePtr) {
+        my $writeInfo = $$writeTablePtr{$tag};
+        my @infoList = GetTagInfoList($tagTablePtr, $tag);
+        if (@infoList) {
+            my $tagInfo;
+            foreach $tagInfo (@infoList) {
+                if (ref $writeInfo) {
+                    my $key;
+                    foreach $key (%$writeInfo) {
+                        $$tagInfo{$key} = $$writeInfo{$key} unless defined $$tagInfo{$key};
+                    }
+                } else {
+                    $$tagInfo{Writable} = $writeInfo unless defined $$tagInfo{Writable};
+                }
+            }
+        } else {
+            Image::ExifTool::AddTagToTable($tagTablePtr, $tag, $writeInfo);
+        }
+    }
+}
+
+#------------------------------------------------------------------------------
+# rebuild maker notes to properly contain all value data
+# (some manufacturers put value data outside maker notes!!)
+# Inputs: 0) ExifTool object ref, 1) tag table ref, 2) dirInfo ref
+# Returns: new maker note data (and creates MAKER_NOTE_FIXUP), or undef on error
+sub RebuildMakerNotes($$$)
+{
+    my ($exifTool, $tagTablePtr, $dirInfo) = @_;
+    my $dirStart = $$dirInfo{DirStart};
+    my $dirLen = $$dirInfo{DirLen};
+    my $dataPt = $$dirInfo{DataPt};
+    my $dataPos = $$dirInfo{DataPos} || 0;
+    my $rtnValue;
+    my %subdirInfo = %$dirInfo;
+
+    delete $exifTool->{MAKER_NOTE_FIXUP};
+
+    # don't need to rebuild text, BinaryData or PreviewImage maker notes
+    my $tagInfo = $$dirInfo{TagInfo};
+    my $subdir = $$tagInfo{SubDirectory};
+    my $proc = $$subdir{ProcessProc} || $$tagTablePtr{PROCESS_PROC} || \&ProcessExif;
+    if (($proc ne \&ProcessExif and $$tagInfo{Name} =~ /Text/) or
+         $proc eq \&Image::ExifTool::ProcessBinaryData or
+        ($$tagInfo{PossiblePreview} and $dirLen > 6 and
+         substr($$dataPt, $dirStart, 3) eq "\xff\xd8\xff"))
+    {
+        return substr($$dataPt, $dirStart, $dirLen);
+    }
+    my $saveOrder = GetByteOrder();
+    my $loc = Image::ExifTool::MakerNotes::LocateIFD($exifTool,\%subdirInfo);
+    if (defined $loc) {
+        my $makerFixup = $subdirInfo{Fixup} = new Image::ExifTool::Fixup;
+        # create new exiftool object to rewrite the directory without changing it
+        my $newTool = new Image::ExifTool;
+        $newTool->Init();   # must do this before calling WriteDirectory()!
+        # don't copy over preview image
+        $newTool->SetNewValue(PreviewImage => '');
+        # copy all transient members over in case they are used for writing
+        # (Make, Model, etc)
+        foreach (grep /[a-z]/, keys %$exifTool) {
+            $$newTool{$_} = $$exifTool{$_};
+        }
+        # fix base offsets if specified
+        $newTool->Options(FixBase => $exifTool->Options('FixBase'));
+        # set GENERATE_PREVIEW_INFO flag so PREVIEW_INFO will be generated
+        $newTool->{GENERATE_PREVIEW_INFO} = 1;
+        # drop any large tags
+        $newTool->{DROP_TAGS} = 1;
+        # initialize other necessary data members
+        $newTool->{FILE_TYPE} = $exifTool->{FILE_TYPE};
+        $newTool->{TIFF_TYPE} = $exifTool->{TIFF_TYPE};
+        # rewrite maker notes
+        $rtnValue = $newTool->WriteDirectory(\%subdirInfo, $tagTablePtr);
+        if (defined $rtnValue and length $rtnValue) {
+            # add the dummy/empty preview image if necessary
+            if ($newTool->{PREVIEW_INFO}) {
+                $makerFixup->SetMarkerPointers(\$rtnValue, 'PreviewImage', length($rtnValue));
+                $rtnValue .= $newTool->{PREVIEW_INFO}{Data};
+                delete $newTool->{PREVIEW_INFO};
+            }
+            # add makernote header
+            if ($loc) {
+                my $hdr = substr($$dataPt, $dirStart, $loc);
+                # special case: convert Pentax/Samsung DNG maker notes to JPEG style
+                # (in JPEG, Pentax makernotes are absolute and start with "AOC\0")
+                if ($hdr =~ s/^(PENTAX |SAMSUNG)\0/AOC\0/) {
+                    # save fixup so we will adjust to absolute offsets when writing
+                    $exifTool->{MAKER_NOTE_FIXUP} = $makerFixup;
+                }
+                $rtnValue = $hdr . $rtnValue;
+                # adjust fixup for shift in start position
+                $makerFixup->{Start} += length $hdr;
+            }
+            # shift offsets according to original position of maker notes,
+            # and relative to the makernotes Base
+            $makerFixup->{Shift} += $dataPos + $dirStart +
+                                    $$dirInfo{Base} - $subdirInfo{Base};
+            # repair incorrect offsets if offsets were fixed
+            $makerFixup->{Shift} += $subdirInfo{FixedBy} || 0;
+            # fix up pointers to the specified offset
+            $makerFixup->ApplyFixup(\$rtnValue);
+            # save fixup information unless offsets were relative
+            unless ($subdirInfo{Relative}) {
+                # set shift so offsets are all relative to start of maker notes
+                $makerFixup->{Shift} -= $dataPos + $dirStart;
+                $exifTool->{MAKER_NOTE_FIXUP} = $makerFixup;    # save fixup for later
+            }
+        }
+    }
+    SetByteOrder($saveOrder);
+
+    return $rtnValue;
+}
+
+#------------------------------------------------------------------------------
+# Sort IFD directory entries
+# Inputs: 0) data reference, 1) directory start, 2) number of entries
+sub SortIFD($$$)
+{
+    my ($dataPt, $dirStart, $numEntries) = @_;
+    my ($index, %entries);
+    # split the directory into separate entries
+    my $newDir = '';
+    for ($index=0; $index<$numEntries; ++$index) {
+        my $entry = $dirStart + 2 + 12 * $index;
+        my $tagID = Get16u($dataPt, $entry);
+        my $entryData = substr($$dataPt, $entry, 12);
+        # silly software can pad directories with zero entries -- put these at the end
+        $tagID = 0x10000 unless $tagID or $index == 0;
+        # add new entry (allow for duplicate tag ID's, which shouldn't normally happen)
+        if ($entries{$tagID}) {
+            $entries{$tagID} .= $entryData;
+        } else {
+            $entries{$tagID} = $entryData;
+        }
+    }
+    # sort the directory entries
+    my @sortedTags = sort { $a <=> $b } keys %entries;
+    foreach (@sortedTags) {
+        $newDir .= $entries{$_};
+    }
+    # replace original directory with new, sorted one
+    substr($$dataPt, $dirStart + 2, 12 * $numEntries) = $newDir;
+}
+
+#------------------------------------------------------------------------------
+# Validate IFD entries (strict validation to test possible chained IFD's)
+# Inputs: 0) dirInfo ref (must have RAF set), 1) optional DirStart
+# Returns: true if IFD looks OK
+sub ValidateIFD($;$)
+{
+    my ($dirInfo, $dirStart) = @_;
+    my $raf = $$dirInfo{RAF} or return 0;
+    my $base = $$dirInfo{Base};
+    $dirStart = $$dirInfo{DirStart} || 0 unless defined $dirStart;
+    my $offset = $dirStart + ($$dirInfo{DataPos} || 0);
+    my ($buff, $index);
+    $raf->Seek($offset + $base, 0) and $raf->Read($buff,2) == 2 or return 0;
+    my $numEntries = Get16u(\$buff,0);
+    $numEntries > 1 and $numEntries < 64 or return 0;
+    my $len = 12 * $numEntries;
+    $raf->Read($buff, $len) == $len or return 0;
+    my $lastID = -1;
+    for ($index=0; $index<$numEntries; ++$index) {
+        my $entry = 12 * $index;
+        my $tagID = Get16u(\$buff, $entry);
+        $tagID > $lastID or $$dirInfo{AllowOutOfOrderTags} or return 0;
+        my $format = Get16u(\$buff, $entry+2);
+        $format > 0 and $format <= 13 or return 0;
+        my $count = Get32u(\$buff, $entry+4);
+        $count > 0 or return 0;
+        $lastID = $tagID;
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Get sorted list of offsets used in IFD
+# Inputs: 0) data ref, 1) directory start, 2) dataPos, 3) IFD entries, 4) tag table ref
+# Returns: 0) sorted list of offsets (only offsets after the end of the IFD)
+#          1) hash of list indices keyed by offset value
+# Notes: This is used in a patch to fix the count for tags in Kodak SubIFD3
+sub GetOffList($$$$$)
+{
+    my ($dataPt, $dirStart, $dataPos, $numEntries, $tagTablePtr) = @_;
+    my $ifdEnd = $dirStart + 2 + 12 * $numEntries + $dataPos;
+    my ($index, $offset, %offHash);
+    for ($index=0; $index<$numEntries; ++$index) {
+        my $entry = $dirStart + 2 + 12 * $index;
+        my $format = Get16u($dataPt, $entry + 2);
+        next if $format < 1 or $format > 13;
+        my $count = Get16u($dataPt, $entry + 4);
+        my $size = $formatSize[$format] * $count;
+        if ($size <= 4) {
+            my $tagID = Get16u($dataPt, $entry);
+            next unless ref $$tagTablePtr{$tagID} eq 'HASH' and $$tagTablePtr{$tagID}{FixCount};
+        }
+        my $offset = Get16u($dataPt, $entry + 8);
+        $offHash{$offset} = 1 if $offset >= $ifdEnd;
+    }
+    # set offset hash values to indices in list
+    my @offList = sort keys %offHash;
+    $index = 0;
+    foreach $offset (@offList) {
+        $offHash{$offset} = $index++;
+    }
+    return(\@offList, \%offHash);
+}
+
+#------------------------------------------------------------------------------
+# Update TIFF_END member if defined
+# Inputs: 0) ExifTool ref, 1) end of valid TIFF data
+sub UpdateTiffEnd($$)
+{
+    my ($exifTool, $end) = @_;
+    if (defined $exifTool->{TIFF_END} and
+        $exifTool->{TIFF_END} < $end)
+    {
+        $exifTool->{TIFF_END} = $end;
+    }
+}
+
+#------------------------------------------------------------------------------
+# Handle error while writing EXIF
+# Inputs: 0) ExifTool ref, 1) error string, 2) tag table ref
+# Returns: undef on fatal error, or '' if minor error is ignored
+sub ExifErr($$$)
+{
+    my ($exifTool, $errStr, $tagTablePtr) = @_;
+    # MakerNote errors are minor by default
+    my $minor = ($tagTablePtr->{GROUPS}{0} eq 'MakerNotes');
+    if ($tagTablePtr->{VARS} and $tagTablePtr->{VARS}{MINOR_ERRORS}) {
+        $exifTool->Warn("$errStr. IFD dropped.") and return '' if $minor;
+        $minor = 1;
+    }
+    return undef if $exifTool->Error($errStr, $minor);
+    return '';
+}
+
+#------------------------------------------------------------------------------
+# Read/Write IFD with TIFF-like header (used by DNG 1.2)
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: Reading: 1 on success, otherwise returns 0 and sets a Warning
+#          Writing: new data block or undef on error
+sub ProcessTiffIFD($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    $exifTool or return 1;    # allow dummy access
+    my $raf = $$dirInfo{RAF};
+    my $base = $$dirInfo{Base} || 0;
+    my $dirName = $$dirInfo{DirName};
+    my $magic = $dirInfo->{Subdir}{Magic} || 0x002a;
+    my $buff;
+
+    # structured with a TIFF-like header and relative offsets
+    $raf->Seek($base, 0) and $raf->Read($buff, 8) == 8 or return 0;
+    unless (SetByteOrder(substr($buff,0,2)) and Get16u(\$buff, 2) == $magic) {
+        my $msg = "Invalid $dirName header";
+        if ($$dirInfo{IsWriting}) {
+            $exifTool->Error($msg);
+            return undef;
+        } else {
+            $exifTool->Warn($msg);
+            return 0;
+        }
+    }
+    my $offset = Get32u(\$buff, 4);
+    my %dirInfo = (
+        DirName  => $$dirInfo{DirName},
+        Parent   => $$dirInfo{Parent},
+        Base     => $base,
+        DataPt   => \$buff,
+        DataLen  => length $buff,
+        DataPos  => 0,
+        DirStart => $offset,
+        DirLen   => length($buff) - $offset,
+        RAF      => $raf,
+        NewDataPos => 8,
+    );
+    if ($$dirInfo{IsWriting}) {
+        # rewrite the Camera Profile IFD
+        my $newDir = WriteExif($exifTool, \%dirInfo, $tagTablePtr);
+        # don't add header if error writing directory ($newDir is undef)
+        # or if directory is being deleted ($newDir is empty)
+        return $newDir unless $newDir;
+        # return directory with TIFF-like header
+        return GetByteOrder() . Set16u($magic) . Set32u(8) . $newDir;
+    }
+    if ($exifTool->{HTML_DUMP}) {
+        my $tip = sprintf("Byte order: %s endian\nIdentifier: 0x%.4x\n%s offset: 0x%.4x",
+                          (GetByteOrder() eq 'II') ? 'Little' : 'Big', $magic, $dirName, $offset);
+        $exifTool->HDump($base, 8, "$dirName header", $tip, 0);
+    }
+    return ProcessExif($exifTool, \%dirInfo, $tagTablePtr);
+}
+
+#------------------------------------------------------------------------------
+# Write EXIF directory
+# Inputs: 0) ExifTool object ref, 1) source dirInfo ref, 2) tag table ref
+# Returns: Exif data block (may be empty if no Exif data) or undef on error
+# Notes: Increments ExifTool CHANGED flag for each tag changed.  Also updates
+#        TIFF_END if defined with location of end of original TIFF image.
+# Returns IFD data in the following order:
+#   1. IFD0 directory followed by its data
+#   2. SubIFD directory followed by its data, thumbnail and image
+#   3. GlobalParameters, EXIF, GPS, Interop IFD's each with their data
+#   4. IFD1,IFD2,... directories each followed by their data
+#   5. Thumbnail and/or image data for each IFD, with IFD0 image last
+sub WriteExif($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    $exifTool or return 1;      # allow dummy access to autoload this package
+    my $origDirInfo = $dirInfo; # save original dirInfo
+    my $dataPt = $$dirInfo{DataPt};
+    unless ($dataPt) {
+        my $emptyData = '';
+        $dataPt = \$emptyData;
+    }
+    my $dataPos = $$dirInfo{DataPos} || 0;
+    my $dirStart = $$dirInfo{DirStart} || 0;
+    my $dataLen = $$dirInfo{DataLen} || length($$dataPt);
+    my $dirLen = $$dirInfo{DirLen} || ($dataLen - $dirStart);
+    my $base = $$dirInfo{Base} || 0;
+    my $firstBase = $base;
+    my $raf = $$dirInfo{RAF};
+    my $dirName = $$dirInfo{DirName} || 'unknown';
+    my $fixup = $$dirInfo{Fixup} || new Image::ExifTool::Fixup;
+    my $imageDataFlag = $$dirInfo{ImageData} || '';
+    my $verbose = $exifTool->Options('Verbose');
+    my $out = $exifTool->Options('TextOut');
+    my ($nextIfdPos, %offsetData, $inMakerNotes);
+    my (@offsetInfo, %xDelete);
+    my $deleteAll = 0;
+    my $newData = '';   # initialize buffer to receive new directory data
+    my @imageData;      # image data blocks to copy later if requested
+    my $name = $$dirInfo{Name};
+    $name = $dirName unless $name and $dirName eq 'MakerNotes' and $name !~ /^MakerNote/;
+
+    # allow multiple IFD's in IFD0-IFD1-IFD2... chain
+    $$dirInfo{Multi} = 1 if $dirName =~ /^(IFD0|SubIFD)$/ and not defined $$dirInfo{Multi};
+    $inMakerNotes = 1 if $tagTablePtr->{GROUPS}{0} eq 'MakerNotes';
+    my $ifd;
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# loop through each IFD
+#
+    for ($ifd=0; ; ++$ifd) {  # loop through multiple IFD's
+
+        # save pointer to start of this IFD within the newData
+        my $newStart = length($newData);
+        my @subdirs;    # list of subdirectory data and tag table pointers
+        # determine if directory is contained within our data
+        my $mustRead;
+        if ($dirStart < 0 or $dirStart > $dataLen-2) {
+            $mustRead = 1;
+        } elsif ($dirLen > 2) {
+            my $len = 2 + 12 * Get16u($dataPt, $dirStart);
+            $mustRead = 1 if $dirStart + $len > $dataLen;
+        }
+        # read IFD from file if necessary
+        if ($mustRead) {
+            if ($raf) {
+                # read the count of entries in this IFD
+                my $offset = $dirStart + $dataPos;
+                my ($buff, $buf2);
+                unless ($raf->Seek($offset + $base, 0) and $raf->Read($buff,2) == 2) {
+                    return ExifErr($exifTool, "Bad IFD or truncated file in $name", $tagTablePtr);
+                }
+                my $len = 12 * Get16u(\$buff,0);
+                # (also read next IFD pointer if available)
+                unless ($raf->Read($buf2, $len+4) >= $len) {
+                    return ExifErr($exifTool, "Error reading $name", $tagTablePtr);
+                }
+                $buff .= $buf2;
+                # make copy of dirInfo since we're going to modify it
+                my %newDirInfo = %$dirInfo;
+                $dirInfo = \%newDirInfo;
+                # update directory parameters for the newly loaded IFD
+                $dataPt = $$dirInfo{DataPt} = \$buff;
+                $dirStart = $$dirInfo{DirStart} = 0;
+                $dataPos = $$dirInfo{DataPos} = $offset;
+                $dataLen = $$dirInfo{DataLen} = length $buff;
+                $dirLen = $$dirInfo{DirLen} = $dataLen;
+                # only account for nextIFD pointer if we are going to use it
+                $len += 4 if $dataLen==$len+6 and ($$dirInfo{Multi} or $buff =~ /\0{4}$/);
+                UpdateTiffEnd($exifTool, $offset+$base+2+$len);
+            } elsif ($dirLen) {
+                # error if we can't load IFD (unless we are creating
+                # from scratch, in which case dirLen will be zero)
+                my $str = $exifTool->Options('IgnoreMinorErrors') ? 'Deleted bad' : 'Bad';
+                $exifTool->Error("$str $name directory", 1);
+            }
+        }
+        my ($index, $dirEnd, $numEntries);
+        if ($dirStart + 4 < $dataLen) {
+            $numEntries = Get16u($dataPt, $dirStart);
+            $dirEnd = $dirStart + 2 + 12 * $numEntries;
+            if ($dirEnd > $dataLen) {
+                return ExifErr($exifTool, "Truncated $name directory", $tagTablePtr);
+            }
+            # sort entries if necessary (but not in maker notes IFDs)
+            unless ($inMakerNotes) {
+                my $lastID = -1;
+                for ($index=0; $index<$numEntries; ++$index) {
+                    my $tagID = Get16u($dataPt, $dirStart + 2 + 12 * $index);
+                    # check for proper sequence (but ignore null entries at end)
+                    if ($tagID < $lastID and $tagID) {
+                        SortIFD($dataPt, $dirStart, $numEntries);
+                        $exifTool->Warn("Entries in $name were out of sequence. Fixed.",1);
+                        last;
+                    }
+                    $lastID = $tagID;
+                }
+            }
+        } else {
+            $numEntries = 0;
+            $dirEnd = $dirStart;
+        }
+
+        # loop through new values and accumulate all information for this IFD
+        my (%set, $tagInfo);
+        my $wrongDir = $crossDelete{$dirName};
+        foreach $tagInfo ($exifTool->GetNewTagInfoList($tagTablePtr)) {
+            my $tagID = $$tagInfo{TagID};
+            # evaluate conditional lists now if necessary
+            if (ref $tagTablePtr->{$tagID} eq 'ARRAY' or $$tagInfo{Condition}) {
+                my $curInfo = $exifTool->GetTagInfo($tagTablePtr, $tagID);
+                if (defined $curInfo and not $curInfo) {
+                    # need value to evaluate the condition
+                    my ($val) = $exifTool->GetNewValues($tagInfo);
+                    # must convert to binary for evaluating in Condition
+                    if ($$tagInfo{Format} and defined $val) {
+                        $val = WriteValue($val, $$tagInfo{Format}, $$tagInfo{Count});
+                    }
+                    if (defined $val) {
+                        my $fmt = $$tagInfo{Writable} || $$tagInfo{Format} || 'undef';
+                        my $cnt = $$tagInfo{Count} || 1;
+                        # always use old format/count for Condition in maker notes
+                        if ($inMakerNotes) {
+                            for ($index=0; $index<$numEntries; ++$index) {
+                                my $entry = $dirStart + 2 + 12 * $index;
+                                my $id = Get16u($dataPt, $entry);
+                                if ($id eq $tagID) {
+                                    my $f = Get16u($dataPt, $entry + 2);
+                                    if ($formatName[$f]) {
+                                        $fmt = $formatName[$f];
+                                        $cnt = Get32u($dataPt, $entry + 4);
+                                    }
+                                    last;
+                                }
+                            }
+                        }
+                        $curInfo = $exifTool->GetTagInfo($tagTablePtr, $tagID, \$val, $fmt, $cnt);
+                    }
+                }
+                # don't set this tag unless valid for the current condition
+                next unless defined $curInfo and $curInfo eq $tagInfo;
+            }
+            if ($$tagInfo{WriteCondition}) {
+                my $self = $exifTool;   # set $self to be used in eval
+                #### eval WriteCondition ($self)
+                unless (eval $$tagInfo{WriteCondition}) {
+                    $@ and warn $@;
+                    next;
+                }
+            }
+            my $nvHash = $exifTool->GetNewValueHash($tagInfo, $dirName);
+            unless ($nvHash) {
+                next unless $wrongDir;
+                # delete stuff from the wrong directory if setting somewhere else
+                $nvHash = $exifTool->GetNewValueHash($tagInfo, $wrongDir);
+                next unless Image::ExifTool::IsOverwriting($nvHash);
+                # don't cross delete if specifically deleting from the other directory
+                my $val = Image::ExifTool::GetNewValues($nvHash);
+                next if not defined $val and $nvHash->{WantGroup} and
+                        lc($nvHash->{WantGroup}) eq lc($wrongDir);
+                # remove this tag if found in this IFD
+                $xDelete{$tagID} = 1;
+            }
+            if ($set{$tagID}) {
+                # this tag is being set twice, which can happen if two Condition's
+                # were true for this tag.  Hopefully the only case where this can
+                # happen is the MakerNotes tag since it may store two very different
+                # types of information (MakerNotes and PreviewImage), but we want
+                # to store the MakerNotes if both are available
+                if ($tagID == 0x927c and $dirName =~ /^(ExifIFD|IFD0)$/) {
+                    next if $$tagInfo{Name} eq 'PreviewImage';
+                } else {
+                    $exifTool->Warn(sprintf("Multiple new values for $name tag 0x%.4x",$tagID));
+                }
+            }
+            $set{$tagID} = $tagInfo;
+        }
+        
+        # fix base offsets (some cameras incorrectly write maker notes in IFD0)
+        if ($dirName eq 'MakerNotes' and $$dirInfo{Parent} =~ /^(ExifIFD|IFD0)$/ and
+            $$exifTool{TIFF_TYPE} !~ /^(ARW|SR2)$/ and not $$exifTool{LeicaTrailerPos} and
+            Image::ExifTool::MakerNotes::FixBase($exifTool, $dirInfo))
+        {
+            # update local variables from fixed values
+            $base = $$dirInfo{Base};
+            $dataPos = $$dirInfo{DataPos};
+        }
+
+        # initialize variables to handle mandatory tags
+        my $mandatory = $mandatory{$dirName};
+        my ($allMandatory, $addMandatory);
+        if ($mandatory) {
+            # use X/Y resolution values from JFIF if available
+            if ($dirName eq 'IFD0' and defined $$exifTool{JFIFYResolution}) {
+                my %ifd0Vals = %$mandatory;
+                $ifd0Vals{0x011a} = $$exifTool{JFIFXResolution};
+                $ifd0Vals{0x011b} = $$exifTool{JFIFYResolution};
+                $ifd0Vals{0x0128} = $$exifTool{JFIFResolutionUnit} + 1;
+                $mandatory = \%ifd0Vals;
+            }
+            $allMandatory = $addMandatory = 0; # initialize to zero
+            # add mandatory tags if creating a new directory
+            unless ($numEntries) {
+                foreach (keys %$mandatory) {
+                    $set{$_} or $set{$_} = $$tagTablePtr{$_};
+                }
+            }
+        } else {
+            undef $deleteAll;   # don't remove directory (no mandatory entries)
+        }
+        my ($addDirs, @newTags);
+        if ($inMakerNotes) {
+            $addDirs = { };     # can't currently add new directories in MakerNotes
+            # allow non-permanent makernotes tags to be added
+            # (note: we may get into trouble if there are too many of these
+            #  because we allow out-of-order tags in MakerNote IFD's but our
+            #  logic to add new tags relies on ordered entries)
+            foreach (keys %set) {
+                my $perm = $set{$_}{Permanent};
+                push @newTags, $_ if defined $perm and not $perm;
+            }
+            @newTags = sort { $a <=> $b } @newTags if @newTags > 1;
+        } else {
+            # get a hash of directories we will be writing in this one
+            $addDirs = $exifTool->GetAddDirHash($tagTablePtr, $dirName);
+            # make a union of tags & dirs (can set whole dirs, like MakerNotes)
+            my %allTags = %set;
+            foreach (keys %$addDirs) {
+                $allTags{$_} = $$addDirs{$_};
+            }
+            # make sorted list of new tags to be added
+            @newTags = sort { $a <=> $b } keys(%allTags);
+        }
+        my $dirBuff = '';   # buffer for directory data
+        my $valBuff = '';   # buffer for value data
+        my @valFixups;      # list of fixups for offsets in valBuff
+        # fixup for offsets in dirBuff
+        my $dirFixup = new Image::ExifTool::Fixup;
+        my $entryBasedFixup;
+        my $lastTagID = -1;
+        my ($oldInfo, $oldFormat, $oldFormName, $oldCount, $oldSize, $oldValue, $oldImageData);
+        my ($readFormat, $readFormName, $readCount); # format for reading old value(s)
+        my ($entry, $valueDataPt, $valueDataPos, $valueDataLen, $valuePtr, $valEnd);
+        my ($offList, $offHash, $ignoreCount, $fixCount);
+        my $oldID = -1;
+        my $newID = -1;
+
+        # patch for Canon EOS 40D firmware 1.0.4 bug (incorrect directory counts)
+        if ($inMakerNotes and $$exifTool{Model} eq 'Canon EOS 40D') {
+            my $fmt = Get16u($dataPt, $dirStart + 2 + 12 * ($numEntries - 1) + 2);
+            if ($fmt < 1 or $fmt > 13) {
+                # adjust the number of directory entries
+                --$numEntries;
+                $dirEnd -= 12;
+                $ignoreCount = 1;
+            }
+        }
+#..............................................................................
+# loop through entries in new directory
+#
+        $index = 0;
+Entry:  for (;;) {
+
+            if (defined $oldID and $oldID == $newID) {
+#
+# read next entry from existing directory
+#
+                if ($index < $numEntries) {
+                    $entry = $dirStart + 2 + 12 * $index;
+                    $oldID = Get16u($dataPt, $entry);
+                    $readFormat = $oldFormat = Get16u($dataPt, $entry+2);
+                    $readCount = $oldCount = Get32u($dataPt, $entry+4);
+                    undef $oldImageData;
+                    if ($oldFormat < 1 or $oldFormat > 13) {
+                        # patch to preserve invalid directory entries in SubIFD3 of
+                        # various Kodak Z-series cameras (Z812, Z1085IS, Z1275)
+                        if ($dirName eq 'MakerNotes' and $$exifTool{Make}=~/KODAK/i and
+                            $$dirInfo{Name} and $$dirInfo{Name} eq 'SubIFD3')
+                        {
+                            $dirBuff .= substr($$dataPt, $entry, 12);
+                            goto WroteIt;
+                        }
+                        # don't write out null directory entry
+                        if ($oldFormat==0 and $index and $oldCount==0) {
+                            $ignoreCount = ($ignoreCount || 0) + 1;
+                            # must keep same directory size to avoid messing up our fixed offsets
+                            $dirBuff .= ("\0" x 12) if $$dirInfo{FixBase};
+WroteIt:                    ++$index;
+                            $newID = $oldID;    # pretend we wrote this
+                            next;
+                        }
+                        my $msg = "Bad format ($oldFormat) for $name entry $index";
+                        return ExifErr($exifTool, $msg, $tagTablePtr);
+                    }
+                    $readFormName = $oldFormName = $formatName[$oldFormat];
+                    $valueDataPt = $dataPt;
+                    $valueDataPos = $dataPos;
+                    $valueDataLen = $dataLen;
+                    $valuePtr = $entry + 8;
+                    # try direct method first for speed
+                    $oldInfo = $$tagTablePtr{$oldID};
+                    if (ref $oldInfo ne 'HASH' or $$oldInfo{Condition}) {
+                        # must get unknown tags too
+                        # (necessary so we don't miss a tag we want to Drop)
+                        my $unk = $exifTool->Options(Unknown => 1);
+                        $oldInfo = $exifTool->GetTagInfo($tagTablePtr, $oldID);
+                        $exifTool->Options(Unknown => $unk);
+                    }
+                    # patch incorrect count in Kodak SubIFD3 tags
+                    if ($oldCount < 2 and $oldInfo and $$oldInfo{FixCount}) {
+                        $offList or ($offList, $offHash) = GetOffList($dataPt, $dirStart, $dataPos,
+                                                                      $numEntries, $tagTablePtr);
+                        my $i = $$offHash{Get32u($dataPt, $valuePtr)};
+                        if (defined $i and $i < $#$offList) {
+                            $oldCount = int(($$offList[$i+1] - $$offList[$i]) / $formatSize[$oldFormat]);
+                            $fixCount = ($fixCount || 0) + 1 if $oldCount != $readCount;
+                        }
+                    }
+                    $oldSize = $oldCount * $formatSize[$oldFormat];
+                    my $readFromFile;
+                    if ($oldSize > 4) {
+                        $valuePtr = Get32u($dataPt, $valuePtr);
+                        # fix valuePtr if necessary
+                        if ($$dirInfo{FixOffsets}) {
+                            $valEnd or $valEnd = $dataPos + $dirStart + 2 + 12 * $numEntries + 4;
+                            my ($tagID, $size, $wFlag) = ($oldID, $oldSize, 1);
+                            #### eval FixOffsets ($valuePtr, $valEnd, $size, $tagID, $wFlag)
+                            eval $$dirInfo{FixOffsets};
+                            unless (defined $valuePtr) {
+                                unless ($$exifTool{DROP_TAGS}) {
+                                    my $tagStr = $oldInfo ? $$oldInfo{Name} : sprintf("tag 0x%x",$oldID);
+                                    return undef if $exifTool->Error("Bad $name offset for $tagStr", $inMakerNotes);
+                                }
+                                goto DropTag;
+                            }
+                        }
+                        # offset shouldn't point into TIFF or IFD header
+                        my $suspect = ($valuePtr < 8);
+                        # convert offset to pointer in $$dataPt
+                        if ($$dirInfo{EntryBased} or (ref $$tagTablePtr{$oldID} eq 'HASH' and
+                            $tagTablePtr->{$oldID}{EntryBased}))
+                        {
+                            $valuePtr += $entry;
+                        } else {
+                            $valuePtr -= $dataPos;
+                        }
+                        # value shouldn't overlap our directory
+                        $suspect = 1 if $valuePtr < $dirEnd and $valuePtr+$oldSize > $dirStart;
+                        # get value by seeking in file if we are allowed
+                        if ($valuePtr < 0 or $valuePtr+$oldSize > $dataLen) {
+                            my ($pos, $tagStr, $invalidPreview, $tmpInfo);
+                            if ($oldInfo) {
+                                $tagStr = $$oldInfo{Name};
+                            } elsif (defined $oldInfo) {
+                                $tmpInfo = $exifTool->GetTagInfo($tagTablePtr, $oldID, \ '', $oldFormName, $oldCount);
+                                $tagStr = $$tmpInfo{Name} if $tmpInfo;
+                            }
+                            $tagStr or $tagStr = sprintf("tag 0x%x",$oldID);
+                            # allow PreviewImage to run outside EXIF segment in JPEG images
+                            if (not $raf) {
+                                if ($tagStr eq 'PreviewImage') {
+                                    $raf = $exifTool->{RAF};
+                                    if ($raf) {
+                                        $pos = $raf->Tell();
+                                        if ($oldInfo and $$oldInfo{ChangeBase}) {
+                                            # adjust base offset for this tag only
+                                            #### eval ChangeBase ($dirStart,$dataPos)
+                                            my $newBase = eval $$oldInfo{ChangeBase};
+                                            $valuePtr += $newBase;
+                                        }
+                                    } else {
+                                        $invalidPreview = 1;
+                                    }
+                                } elsif ($tagStr eq 'MakerNoteLeica6') {
+                                    # save information about Leica makernote trailer
+                                    $$exifTool{LeicaTrailer} = {
+                                        TagInfo => $oldInfo || $tmpInfo,
+                                        Offset  => $base + $valuePtr + $dataPos,
+                                        Size    => $oldSize,
+                                    },
+                                    $invalidPreview = 2;
+                                    # remove SubDirectory to prevent processing (for now)
+                                    my %copy = %{$oldInfo || $tmpInfo};
+                                    delete $copy{SubDirectory};
+                                    delete $copy{MakerNotes};
+                                    $oldInfo = \%copy;
+                                }
+                            }
+                            if ($oldSize > BINARY_DATA_LIMIT and $$origDirInfo{ImageData} and
+                                (not defined $oldInfo or ($oldInfo and not $$oldInfo{SubDirectory})))
+                            {
+                                # copy huge data blocks later instead of loading into memory
+                                $oldValue = ''; # dummy empty value
+                                # copy this value later unless writing a new value
+                                unless ($set{$oldID}) {
+                                    my $pad = $oldSize & 0x01 ? 1 : 0;
+                                    # save block information to copy later (set directory offset later)
+                                    $oldImageData = [$base+$valuePtr+$dataPos, $oldSize, $pad];
+                                }
+                            } elsif ($raf) {
+                                my $success = ($raf->Seek($base+$valuePtr+$dataPos, 0) and
+                                               $raf->Read($oldValue, $oldSize) == $oldSize);
+                                if (defined $pos) {
+                                    $raf->Seek($pos, 0);
+                                    undef $raf;
+                                    # (sony A700 has 32-byte header on PreviewImage)
+                                    unless ($success and $oldValue =~ /^(\xff\xd8\xff|(.|.{33})\xd8\xff\xdb)/s) {
+                                        $invalidPreview = 1;
+                                        $success = 1;   # continue writing directory anyway
+                                    }
+                                }
+                                unless ($success) {
+                                    return undef if $exifTool->Error("Error reading value for $name entry $index", $inMakerNotes);
+                                    goto DropTag;
+                                }
+                            } elsif (not $invalidPreview) {
+                                return undef if $exifTool->Error("Bad $name offset for $tagStr", $inMakerNotes);
+                                goto DropTag;
+                            }
+                            if ($invalidPreview) {
+                                # set value for invalid preview
+                                if ($exifTool->{FILE_TYPE} eq 'JPEG') {
+                                    # define dummy value for preview (or Leica MakerNote) to write later
+                                    # (value must be larger than 4 bytes to generate PREVIEW_INFO,
+                                    # and an even number of bytes so it won't be padded)
+                                    $oldValue = 'LOAD_PREVIEW';
+                                } else {
+                                    $oldValue = 'none';
+                                    $oldSize = length $oldValue;
+                                }
+                                $valuePtr = 0;
+                            } else {
+                                UpdateTiffEnd($exifTool, $base+$valuePtr+$dataPos+$oldSize);
+                            }
+                            # update pointers for value just read from file
+                            $valueDataPt = \$oldValue;
+                            $valueDataPos = $valuePtr + $dataPos;
+                            $valueDataLen = $oldSize;
+                            $valuePtr = 0;
+                            $readFromFile = 1;
+                        }
+                        if ($suspect) {
+                            my $tagStr = $oldInfo ? $$oldInfo{Name} : sprintf('tag 0x%.4x', $oldID);
+                            my $str = "Suspicious $name offset for $tagStr";
+                            if ($inMakerNotes) {
+                                $exifTool->Warn($str, 1);
+                            } else {
+                                return undef if $exifTool->Error($str, 1);
+                            }
+                        }
+                    }
+                    # read value if we haven't already
+                    $oldValue = substr($$valueDataPt, $valuePtr, $oldSize) unless $readFromFile;
+                    # get tagInfo using value if necessary
+                    if (defined $oldInfo and not $oldInfo) {
+                        my $unk = $exifTool->Options(Unknown => 1);
+                        $oldInfo = $exifTool->GetTagInfo($tagTablePtr, $oldID, \$oldValue, $oldFormName, $oldCount);
+                        $exifTool->Options(Unknown => $unk);
+                    }
+                    # make sure we are handling the 'ifd' format properly
+                    if (($oldFormat == 13 or $oldFormat == 18) and
+                        (not $oldInfo or not $$oldInfo{SubIFD}))
+                    {
+                        my $str = sprintf('%s tag 0x%.4x IFD format not handled', $name, $oldID);
+                        $exifTool->Error($str, $inMakerNotes);
+                    }
+                    # override format we use to read the value if specified
+                    if ($oldInfo) {
+                        # check for tags which must be integers
+                        if (($$oldInfo{IsOffset} or $$oldInfo{SubIFD}) and
+                            not $intFormat{$oldFormName})
+                        {
+                            $exifTool->Error("Invalid format ($oldFormName) for $name $$oldInfo{Name}", $inMakerNotes);
+                            goto DropTag;
+                        }
+                        if ($$oldInfo{Drop} and $$exifTool{DROP_TAGS}) {
+                            # don't rewrite this tag
+DropTag:                    ++$index;
+                            $oldID = $newID;
+                            next;
+                        }
+                        if ($$oldInfo{Format}) {
+                            $readFormName = $$oldInfo{Format};
+                            $readFormat = $formatNumber{$readFormName};
+                            unless ($readFormat) {
+                                # we aren't reading in a standard EXIF format, so rewrite in old format
+                                $readFormName = $oldFormName;
+                                $readFormat = $oldFormat;
+                            }
+                            # adjust number of items to read if format size changed
+                            $readCount = $oldSize / $formatSize[$readFormat];
+                        }
+                    }
+                    if ($oldID <= $lastTagID and not $inMakerNotes) {
+                        my $str = $oldInfo ? "$$oldInfo{Name} tag" : sprintf('tag 0x%x',$oldID);
+                        if ($oldID == $lastTagID) {
+                            $exifTool->Warn("Duplicate $str in $name");;
+                        } else {
+                            $exifTool->Warn("\u$str out of sequence in $name");
+                        }
+                    }
+                    $lastTagID = $oldID;
+                    ++$index;               # increment index for next time
+                } else {
+                    undef $oldID;           # no more existing entries
+                }
+            }
+#
+# write out all new tags, up to and including this one
+#
+            $newID = $newTags[0];
+            my $isNew;  # -1=tag is old, 0=tag same as existing, 1=tag is new
+            if (not defined $oldID) {
+                last unless defined $newID;
+                $isNew = 1;
+            } elsif (not defined $newID) {
+                # maker notes will have no new tags defined
+                if ($set{$oldID}) {
+                    $newID = $oldID;
+                    $isNew = 0;
+                } else {
+                    $isNew = -1;
+                }
+            } else {
+                $isNew = $oldID <=> $newID;
+            }
+            my $newInfo = $oldInfo;
+            my $newFormat = $oldFormat;
+            my $newFormName = $oldFormName;
+            my $newCount = $oldCount;
+            my $ifdFormName;
+            my $newValue;
+            my $newValuePt = $isNew >= 0 ? \$newValue : \$oldValue;
+            my $isOverwriting;
+
+            if ($isNew >= 0) {
+                # add, edit or delete this tag
+                shift @newTags; # remove from list
+                if ($set{$newID}) {
+#
+# set the new tag value (or 'next' if deleting tag)
+#
+                    $newInfo = $set{$newID};
+                    $newCount = $$newInfo{Count};
+                    my ($val, $newVal, $n);
+                    my $nvHash = $exifTool->GetNewValueHash($newInfo, $dirName);
+                    if ($isNew > 0) {
+                        # don't create new entry unless requested
+                        if ($nvHash) {
+                            next unless Image::ExifTool::IsCreating($nvHash);
+                            if ($$newInfo{IsOverwriting}) {
+                                my $proc = $$newInfo{IsOverwriting};
+                                $isOverwriting = &$proc($exifTool, $nvHash, $val, \$newVal);
+                            } else {
+                                $isOverwriting = Image::ExifTool::IsOverwriting($nvHash);
+                            }
+                        } else {
+                            next if $xDelete{$newID};       # don't create if cross deleting
+                            $newVal = $$mandatory{$newID};  # get value for mandatory tag
+                            $isOverwriting = 1;
+                        }
+                        # convert using new format
+                        if ($$newInfo{Format}) {
+                            $newFormName = $$newInfo{Format};
+                            # use Writable flag to specify IFD format code
+                            $ifdFormName = $$newInfo{Writable};
+                        } else {
+                            $newFormName = $$newInfo{Writable};
+                            unless ($newFormName) {
+                                warn("No format for $name $$newInfo{Name}\n");
+                                next;
+                            }
+                        }
+                        $newFormat = $formatNumber{$newFormName};
+                    } elsif ($nvHash or $xDelete{$newID}) {
+                        unless ($nvHash) {
+                            $nvHash = $exifTool->GetNewValueHash($newInfo, $wrongDir);
+                        }
+                        # read value
+                        $val = ReadValue(\$oldValue, 0, $readFormName, $readCount, $oldSize);
+                        # determine write format (by default, use 'Writable' format)
+                        my $writable = $$newInfo{Writable};
+                        # (or use existing format if 'Writable' not specified)
+                        $writable = $oldFormName unless $writable and $writable ne '1';
+                        # (and override write format with 'Format' if specified)
+                        my $writeForm = $$newInfo{Format} || $writable;
+                        if ($writeForm ne $newFormName) {
+                            # write in specified format
+                            $newFormName = $writeForm;
+                            $newFormat = $formatNumber{$newFormName};
+                            # use different IFD format code if necessary
+                            if ($inMakerNotes) {
+                                # always preserve IFD format in maker notes
+                                $ifdFormName = $oldFormName;
+                            } elsif ($writable ne $newFormName) {
+                                # use specified IFD format
+                                $ifdFormName = $writable;
+                            }
+                        }
+                        if ($inMakerNotes and $readFormName ne 'string' and $readFormName ne 'undef') {
+                            # keep same size in maker notes unless string or binary
+                            $newCount = $oldCount * $formatSize[$oldFormat] / $formatSize[$newFormat];
+                        }
+                        if ($$newInfo{IsOverwriting}) {
+                            my $proc = $$newInfo{IsOverwriting};
+                            $isOverwriting = &$proc($exifTool, $nvHash, $val, \$newVal);
+                        } else {
+                            $isOverwriting = Image::ExifTool::IsOverwriting($nvHash, $val);
+                        }
+                    }
+                    if ($isOverwriting) {
+                        $newVal = Image::ExifTool::GetNewValues($nvHash) unless defined $newVal;
+                        # value undefined if deleting this tag
+                        # (also delete tag if cross-deleting and this isn't a date/time shift)
+                        if (not defined $newVal or ($xDelete{$newID} and not defined $$nvHash{Shift})) {
+                            if ($$newInfo{RawConvInv} and defined $$nvHash{Value}) {
+                                goto NoOverwrite;   # error in RawConvInv, so rewrite existing tag
+                            }
+                            unless ($isNew) {
+                                ++$exifTool->{CHANGED};
+                                $exifTool->VerboseValue("- $dirName:$$newInfo{Name}", $val);
+                            }
+                            next;
+                        }
+                        if ($newCount and $newCount < 0) {
+                            # set count to number of values if variable
+                            my @vals = split ' ',$newVal;
+                            $newCount = @vals;
+                        }
+                        # convert to binary format
+                        $newValue = WriteValue($newVal, $newFormName, $newCount);
+                        unless (defined $newValue) {
+                            $exifTool->Warn("Error writing $dirName:$$newInfo{Name}");
+                            goto NoOverwrite;
+                        }
+                        if (length $newValue) {
+                            # limit maximum value length in JPEG images
+                            # (max segment size is 65533 bytes and the min EXIF size is 96 incl an additional IFD entry)
+                            if ($$exifTool{FILE_TYPE} eq 'JPEG' and length($newValue) > 65436 and
+                                $$newInfo{Name} ne 'PreviewImage')
+                            {
+                                my $name = $$newInfo{MakerNotes} ? 'MakerNotes' : $$newInfo{Name};
+                                $exifTool->Warn("$name too large to write in JPEG segment");
+                                goto NoOverwrite;
+                            }
+                        } else {
+                            $exifTool->Warn("Can't write zero length $$newInfo{Name} in $tagTablePtr->{GROUPS}{1}");
+                            goto NoOverwrite;
+                        }
+                        if ($isNew >= 0) {
+                            $newCount = length($newValue) / $formatSize[$newFormat];
+                            ++$exifTool->{CHANGED};
+                            if (defined $allMandatory) {
+                                # not all mandatory if we are writing any tag specifically
+                                if ($nvHash) {
+                                    undef $allMandatory;
+                                    undef $deleteAll;
+                                } else {
+                                    ++$addMandatory;    # count mandatory tags that we added
+                                }
+                            }
+                            if ($verbose > 1) {
+                                $exifTool->VerboseValue("- $dirName:$$newInfo{Name}", $val) unless $isNew;
+                                my $str = $nvHash ? '' : ' (mandatory)';
+                                $exifTool->VerboseValue("+ $dirName:$$newInfo{Name}", $newVal, $str);
+                            }
+                        }
+                    } else {
+NoOverwrite:            next if $isNew > 0;
+                        $isNew = -1;        # rewrite existing tag
+                    }
+                    # set format for EXIF IFD if different than conversion format
+                    if ($ifdFormName) {
+                        $newFormName = $ifdFormName;
+                        $newFormat = $formatNumber{$newFormName};
+                    }
+
+                } elsif ($isNew > 0) {
+#
+# create new subdirectory
+#
+                    # newInfo may not be defined if we try to add a mandatory tag
+                    # to a directory that doesn't support it (ie. IFD1 in RW2 images)
+                    $newInfo = $$addDirs{$newID} or next;
+                    # make sure we don't try to generate a new MakerNotes directory
+                    # or a SubIFD
+                    next if $$newInfo{MakerNotes} or $$newInfo{Name} eq 'SubIFD';
+                    my $subTable;
+                    if ($newInfo->{SubDirectory}{TagTable}) {
+                        $subTable = Image::ExifTool::GetTagTable($newInfo->{SubDirectory}{TagTable});
+                    } else {
+                        $subTable = $tagTablePtr;
+                    }
+                    # create empty source directory
+                    my %sourceDir = (
+                        Parent => $dirName,
+                        Fixup => new Image::ExifTool::Fixup,
+                    );
+                    $sourceDir{DirName} = $newInfo->{Groups}{1} if $$newInfo{SubIFD};
+                    $newValue = $exifTool->WriteDirectory(\%sourceDir, $subTable);
+                    # only add new directory if it isn't empty
+                    next unless defined $newValue and length($newValue);
+                    # set the fixup start location
+                    if ($$newInfo{SubIFD}) {
+                        # subdirectory is referenced by an offset in value buffer
+                        my $subdir = $newValue;
+                        $newValue = Set32u(0xfeedf00d);
+                        push @subdirs, {
+                            DataPt => \$subdir,
+                            Table => $subTable,
+                            Fixup => $sourceDir{Fixup},
+                            Offset => length($dirBuff) + 8,
+                            Where => 'dirBuff',
+                        };
+                        $newFormName = 'int32u';
+                        $newFormat = $formatNumber{$newFormName};
+                    } else {
+                        # subdirectory goes directly into value buffer
+                        $sourceDir{Fixup}{Start} += length($valBuff);
+                        # use Writable to set format, otherwise 'undef'
+                        $newFormName = $$newInfo{Writable};
+                        unless ($newFormName and $formatNumber{$newFormName}) {
+                            $newFormName = 'undef';
+                        }
+                        $newFormat = $formatNumber{$newFormName};
+                        push @valFixups, $sourceDir{Fixup};
+                    }
+                } elsif ($$newInfo{Format} and $$newInfo{Writable} and $$newInfo{Writable} ne '1') {
+                    # use specified write format
+                    $newFormName = $$newInfo{Writable};
+                    $newFormat = $formatNumber{$newFormName};
+                }
+            }
+            if ($isNew < 0) {
+                # just rewrite existing tag
+                $newID = $oldID;
+                $newValue = $oldValue;
+                $newFormat = $oldFormat; # (just in case it changed)
+                $newFormName = $oldFormName;
+                # set offset of this entry in the directory so we can update the pointer
+                # and save block information to copy this large block later
+                if ($oldImageData) {
+                    $$oldImageData[3] = $newStart + length($dirBuff) + 2;
+                    push @imageData, $oldImageData;
+                    $$origDirInfo{ImageData} = \@imageData;
+                }
+            }
+            if ($newInfo) {
+#
+# load necessary data for this tag (thumbnail image, etc)
+#
+                if ($$newInfo{DataTag} and $isNew >= 0) {
+                    my $dataTag = $$newInfo{DataTag};
+                    # load data for this tag
+                    unless (defined $offsetData{$dataTag} or $dataTag eq 'LeicaTrailer') {
+                        # prefer tag from Composite table if it exists (otherwise
+                        # PreviewImage data would be taken from Extra tag)
+                        my $compInfo = $Image::ExifTool::Composite{$dataTag};
+                        $offsetData{$dataTag} = $exifTool->GetNewValues($compInfo || $dataTag);
+                        my $err;
+                        if (defined $offsetData{$dataTag}) {
+                            my $len = length $offsetData{$dataTag};
+                            if ($dataTag eq 'PreviewImage') {
+                                # must set DEL_PREVIEW flag now if preview fit into IFD
+                                $$exifTool{DEL_PREVIEW} = 1 if $len <= 4;
+                            } elsif ($exifTool->{FILE_TYPE} eq 'JPEG' and $len > 60000) {
+                                delete $offsetData{$dataTag};
+                                $err = "$dataTag not written (too large for JPEG segment)";
+                            }
+                        } else {
+                            $err = "$dataTag not found";
+                        }
+                        if ($err) {
+                            $exifTool->Warn($err) if $$newInfo{IsOffset};
+                            delete $set{$newID};    # remove from list of tags we are setting
+                            next;
+                        }
+                    }
+                }
+#
+# write maker notes
+#
+                if ($$newInfo{MakerNotes}) {
+                    # don't write new makernotes if we are deleting this group
+                    if ($exifTool->{DEL_GROUP}{MakerNotes} and
+                       ($exifTool->{DEL_GROUP}{MakerNotes} != 2 or $isNew <= 0))
+                    {
+                        if ($isNew <= 0) {
+                            ++$exifTool->{CHANGED};
+                            $verbose and print $out "  Deleting MakerNotes\n";
+                        }
+                        next;
+                    }
+                    my $saveOrder = GetByteOrder();
+                    if ($isNew >= 0 and $set{$newID}) {
+                        # we are writing a whole new maker note block
+                        # --> add fixup information if necessary
+                        my $nvHash = $exifTool->GetNewValueHash($newInfo, $dirName);
+                        if ($nvHash and $nvHash->{MAKER_NOTE_FIXUP}) {
+                            # must clone fixup because we will be shifting it
+                            my $makerFixup = $nvHash->{MAKER_NOTE_FIXUP}->Clone();
+                            my $valLen = length($valBuff);
+                            $makerFixup->{Start} += $valLen;
+                            push @valFixups, $makerFixup;
+                        }
+                    } else {
+                        # update maker notes if possible
+                        my %subdirInfo = (
+                            Base     => $base,
+                            DataPt   => $valueDataPt,
+                            DataPos  => $valueDataPos,
+                            DataLen  => $valueDataLen,
+                            DirStart => $valuePtr,
+                            DirLen   => $oldSize,
+                            DirName  => 'MakerNotes',
+                            Name     => $$newInfo{Name},
+                            Parent   => $dirName,
+                            TagInfo  => $newInfo,
+                            RAF      => $raf,
+                        );
+                        my ($subTable, $subdir, $loc, $writeProc, $notIFD);
+                        if ($$newInfo{SubDirectory}) {
+                            my $sub = $$newInfo{SubDirectory};
+                            $subdirInfo{FixBase} = 1 if $$sub{FixBase};
+                            $subdirInfo{FixOffsets} = $$sub{FixOffsets};
+                            $subdirInfo{EntryBased} = $$sub{EntryBased};
+                            $subdirInfo{NoFixBase} = 1 if defined $$sub{Base};
+                            $subdirInfo{AutoFix} = $$sub{AutoFix};
+                        }
+                        # get the proper tag table for these maker notes
+                        if ($oldInfo and $$oldInfo{SubDirectory}) {
+                            $subTable = $$oldInfo{SubDirectory}{TagTable};
+                            $subTable and $subTable = Image::ExifTool::GetTagTable($subTable);
+                            $writeProc = $$oldInfo{SubDirectory}{WriteProc};
+                            $notIFD = $$oldInfo{NotIFD};
+                        } else {
+                            $exifTool->Warn('Internal problem getting maker notes tag table');
+                        }
+                        $subTable or $subTable = $tagTablePtr;
+                        if ($writeProc and
+                            $writeProc eq \&Image::ExifTool::MakerNotes::WriteUnknownOrPreview and
+                            $oldValue =~ /^\xff\xd8\xff/)
+                        {
+                            $loc = 0;
+                        } elsif (not $notIFD) {
+                            # look for IFD-style maker notes
+                            $loc = Image::ExifTool::MakerNotes::LocateIFD($exifTool,\%subdirInfo);
+                        }
+                        if (defined $loc) {
+                            # we need fixup data for this subdirectory
+                            $subdirInfo{Fixup} = new Image::ExifTool::Fixup;
+                            # rewrite maker notes
+                            $subdir = $exifTool->WriteDirectory(\%subdirInfo, $subTable, $writeProc);
+                        } elsif ($$subTable{PROCESS_PROC} and
+                                 $$subTable{PROCESS_PROC} eq \&Image::ExifTool::ProcessBinaryData)
+                        {
+                            my $sub = $$oldInfo{SubDirectory};
+                            if (defined $$sub{Start}) {
+                                #### eval Start ($valuePtr)
+                                my $start = eval $$sub{Start};
+                                $loc = $start - $valuePtr;
+                                $subdirInfo{DirStart} = $start;
+                                $subdirInfo{DirLen} -= $loc;
+                            } else {
+                                $loc = 0;
+                            }
+                            # rewrite maker notes
+                            $subdir = $exifTool->WriteDirectory(\%subdirInfo, $subTable);
+                        } elsif (not $notIFD) {
+                            my $msg = 'Maker notes could not be parsed';
+                            if ($$exifTool{FILE_TYPE} eq 'JPEG') {
+                                $exifTool->Warn($msg, 1);
+                            } else {
+                                $exifTool->Error($msg, 1);
+                            }
+                        }
+                        if (defined $subdir) {
+                            next unless length $subdir;
+                            my $valLen = length($valBuff);
+                            # restore existing header and substitute the new
+                            # maker notes for the old value
+                            $newValue = substr($oldValue, 0, $loc) . $subdir;
+                            my $makerFixup = $subdirInfo{Fixup};
+                            my $previewInfo = $exifTool->{PREVIEW_INFO};
+                            if ($subdirInfo{Relative}) {
+                                # apply a one-time fixup to $loc since offsets are relative
+                                $makerFixup->{Start} += $loc;
+                                # shift all offsets to be relative to new base
+                                my $baseShift = $valueDataPos + $valuePtr + $base - $subdirInfo{Base};
+                                $makerFixup->{Shift} += $baseShift;
+                                $makerFixup->ApplyFixup(\$newValue);
+                                if ($previewInfo) {
+                                    # remove all but PreviewImage fixup (since others shouldn't change)
+                                    foreach (keys %{$makerFixup->{Pointers}}) {
+                                        /_PreviewImage$/ or delete $makerFixup->{Pointers}{$_};
+                                    }
+                                    # zero pointer so we can see how it gets shifted later
+                                    $makerFixup->SetMarkerPointers(\$newValue, 'PreviewImage', 0);
+                                    # set the pointer to the start of the EXIF information
+                                    # add preview image fixup to list of value fixups
+                                    $makerFixup->{Start} += $valLen;
+                                    push @valFixups, $makerFixup;
+                                    $previewInfo->{BaseShift} = $baseShift;
+                                    $previewInfo->{Relative} = 1;
+                                }
+                            # don't shift anything if relative flag set to zero (Pentax patch)
+                            } elsif (not defined $subdirInfo{Relative}) {
+                                # shift offset base if shifted in the original image or if FixBase
+                                # was used, but be careful of automatic FixBase with negative shifts
+                                # since they may lead to negative (invalid) offsets (casio_edit_problem.jpg)
+                                my $baseShift = $base - $subdirInfo{Base};
+                                if ($subdirInfo{AutoFix}) {
+                                    $baseShift = 0;
+                                } elsif ($subdirInfo{FixBase} and $baseShift < 0 and
+                                    # allow negative base shift if offsets are bigger (PentaxOptioWP.jpg)
+                                    (not $subdirInfo{MinOffset} or $subdirInfo{MinOffset} + $baseShift < 0))
+                                {
+                                    my $fixBase = $exifTool->Options('FixBase');
+                                    if (not defined $fixBase) {
+                                        my $str = $exifTool->Options('IgnoreMinorErrors') ? 'ignored' : 'fix or ignore?';
+                                        $exifTool->Error("MakerNotes offsets may be incorrect ($str)", 1);
+                                    } elsif ($fixBase eq '') {
+                                        $exifTool->Warn('Fixed incorrect MakerNotes offsets');
+                                        $baseShift = 0;
+                                    }
+                                }
+                                $makerFixup->{Start} += $valLen + $loc;
+                                $makerFixup->{Shift} += $baseShift;
+                                # permanently fix makernote offset errors
+                                $makerFixup->{Shift} += $subdirInfo{FixedBy} || 0;
+                                push @valFixups, $makerFixup;
+                                if ($previewInfo and not $previewInfo->{NoBaseShift}) {
+                                    $previewInfo->{BaseShift} = $baseShift;
+                                }
+                            }
+                            $newValuePt = \$newValue;   # write new value
+                        }
+                    }
+                    SetByteOrder($saveOrder);
+
+                # process existing subdirectory unless we are overwriting it entirely
+                } elsif ($$newInfo{SubDirectory} and $isNew <= 0 and not $isOverwriting
+                    # don't edit directory if Writable is set to 0
+                    and (not defined $$newInfo{Writable} or $$newInfo{Writable}))
+                {
+
+                    my $subdir = $$newInfo{SubDirectory};
+                    if ($$newInfo{SubIFD}) {
+#
+# rewrite existing sub IFD's
+#
+                        my $subTable = $tagTablePtr;
+                        if ($$subdir{TagTable}) {
+                            $subTable = Image::ExifTool::GetTagTable($$subdir{TagTable});
+                        }
+                        # determine directory name for this IFD
+                        my $subdirName = $newInfo->{Groups}{1} || $$newInfo{Name};
+                        # all makernotes directory names must be 'MakerNotes'
+                        $subdirName = 'MakerNotes' if $subTable->{GROUPS}{0} eq 'MakerNotes';
+                        # must handle sub-IFD's specially since the values
+                        # are actually offsets to subdirectories
+                        unless ($readCount) {   # can't have zero count
+                            return undef if $exifTool->Error("$name entry $index has zero count", 1);
+                            next;
+                        }
+                        my $writeCount = 0;
+                        my $i;
+                        $newValue = '';    # reset value because we regenerate it below
+                        for ($i=0; $i<$readCount; ++$i) {
+                            my $off = $i * $formatSize[$readFormat];
+                            my $pt = Image::ExifTool::ReadValue($valueDataPt, $valuePtr + $off,
+                                            $readFormName, 1, $oldSize - $off);
+                            my $subdirStart = $pt - $dataPos;
+                            my $subdirBase = $base;
+                            if ($$subdir{Base}) {
+                                my $start = $subdirStart + $dataPos;
+                                #### eval Base ($start,$base)
+                                $subdirBase += eval $$subdir{Base};
+                            }
+                            # add IFD number if more than one
+                            $subdirName =~ s/\d*$/$i/ if $i;
+                            my %subdirInfo = (
+                                Base     => $subdirBase,
+                                DataPt   => $dataPt,
+                                DataPos  => $dataPos - $subdirBase + $base,
+                                DataLen  => $dataLen,
+                                DirStart => $subdirStart,
+                                DirName  => $subdirName,
+                                Name     => $$newInfo{Name},
+                                TagInfo  => $newInfo,
+                                Parent   => $dirName,
+                                Fixup    => new Image::ExifTool::Fixup,
+                                RAF      => $raf,
+                                Subdir   => $subdir,
+                                # set ImageData only for 1st level SubIFD's
+                                ImageData=> $imageDataFlag eq 'Main' ? 'SubIFD' : undef,
+                            );
+                            # pass on header pointer only for certain sub IFD's
+                            $subdirInfo{HeaderPtr} = $$dirInfo{HeaderPtr} if $$newInfo{SubIFD} == 2;
+                            if ($$subdir{RelativeBase}) {
+                                # apply one-time fixup if offsets are relative (Sony IDC hack)
+                                delete $subdirInfo{Fixup};
+                                delete $subdirInfo{ImageData};
+                            }
+                            # is the subdirectory outside our current data?
+                            if ($subdirStart < 0 or $subdirStart + 2 > $dataLen) {
+                                if ($raf) {
+                                    # reset SubDirectory buffer (we will load it later)
+                                    my $buff = '';
+                                    $subdirInfo{DataPt} = \$buff;
+                                    $subdirInfo{DataLen} = 0;
+                                } else {
+                                    my @err = ("Can't read $subdirName data", $inMakerNotes);
+                                    if ($$subTable{VARS} and $subTable->{VARS}{MINOR_ERRORS}) {
+                                        $exifTool->Warn($err[0] . '. Ignored.');
+                                    } elsif ($exifTool->Error(@err)) {
+                                        return undef;
+                                    }
+                                    next Entry; # don't write this directory
+                                }
+                            }
+                            my $subdirData = $exifTool->WriteDirectory(\%subdirInfo, $subTable, $$subdir{WriteProc});
+                            unless (defined $subdirData) {
+                                # WriteDirectory should have issued an error, but check just in case
+                                $exifTool->Error("Error writing $subdirName") unless $$exifTool{VALUE}{Error};
+                                return undef;
+                            }
+                            unless (length $subdirData) {
+                                next unless $inMakerNotes;
+                                # don't delete MakerNote Sub-IFD's, write empty IFD instead
+                                $subdirData = "\0" x 6;
+                                # reset SubIFD ImageData and Fixup just to be safe
+                                delete $subdirInfo{ImageData};
+                                delete $subdirInfo{Fixup};
+                            }
+                            # handle data blocks that we will transfer later
+                            if (ref $subdirInfo{ImageData}) {
+                                push @imageData, @{$subdirInfo{ImageData}};
+                                $$origDirInfo{ImageData} = \@imageData;
+                            }
+                            # temporarily set value to subdirectory index
+                            # (will set to actual offset later when we know what it is)
+                            $newValue .= Set32u(0xfeedf00d);
+                            my ($offset, $where);
+                            if ($readCount > 1) {
+                                $offset = length($valBuff) + $i * 4;
+                                $where = 'valBuff';
+                            } else {
+                                $offset = length($dirBuff) + 8;
+                                $where = 'dirBuff';
+                            }
+                            # add to list of subdirectories we will append later
+                            push @subdirs, {
+                                DataPt    => \$subdirData,
+                                Table     => $subTable,
+                                Fixup     => $subdirInfo{Fixup},
+                                Offset    => $offset,
+                                Where     => $where,
+                                ImageData => $subdirInfo{ImageData},
+                            };
+                            ++$writeCount;  # count number of subdirs written
+                        }
+                        next unless length $newValue;
+                        # must change location of subdir offset if we deleted
+                        # a directory and only one remains
+                        if ($writeCount < $readCount and $writeCount == 1) {
+                            $subdirs[-1]{Where} = 'dirBuff';
+                            $subdirs[-1]{Offset} = length($dirBuff) + 8;
+                        }
+                        # set new format to int32u for IFD
+                        $newFormName = $$newInfo{FixFormat} || 'int32u';
+                        $newFormat = $formatNumber{$newFormName};
+                        $newValuePt = \$newValue;
+
+                    } elsif ((not defined $$subdir{Start} or
+                             $$subdir{Start} =~ /\$valuePtr/) and
+                             $$subdir{TagTable})
+                    {
+#
+# rewrite other existing subdirectories ('$valuePtr' type only)
+#
+                        # set subdirectory Start and Base
+                        my $subdirStart = $valuePtr;
+                        if ($$subdir{Start}) {
+                            #### eval Start ($valuePtr)
+                            $subdirStart = eval $$subdir{Start};
+                            # must adjust directory size if start changed
+                            $oldSize -= $subdirStart - $valuePtr;
+                        }
+                        my $subdirBase = $base;
+                        if ($$subdir{Base}) {
+                            my $start = $subdirStart + $valueDataPos;
+                            #### eval Base ($start,$base)
+                            $subdirBase += eval $$subdir{Base};
+                        }
+                        my $subFixup = new Image::ExifTool::Fixup;
+                        my %subdirInfo = (
+                            Base     => $subdirBase,
+                            DataPt   => $valueDataPt,
+                            DataPos  => $valueDataPos - $subdirBase + $base,
+                            DataLen  => $valueDataLen,
+                            DirStart => $subdirStart,
+                            DirName  => $$subdir{DirName},
+                            DirLen   => $oldSize,
+                            Parent   => $dirName,
+                            Fixup    => $subFixup,
+                            RAF      => $raf,
+                            TagInfo  => $newInfo,
+                        );
+                        unless ($oldSize) {
+                            # replace with dummy data if empty to prevent WriteDirectory
+                            # routines from accessing data they shouldn't
+                            my $tmp = '';
+                            $subdirInfo{DataPt} = \$tmp;
+                            $subdirInfo{DataLen} = 0;
+                            $subdirInfo{DirStart} = 0;
+                            $subdirInfo{DataPos} += $subdirStart;
+                        }
+                        my $subTable = Image::ExifTool::GetTagTable($$subdir{TagTable});
+                        my $oldOrder = GetByteOrder();
+                        SetByteOrder($$subdir{ByteOrder}) if $$subdir{ByteOrder};
+                        $newValue = $exifTool->WriteDirectory(\%subdirInfo, $subTable, $$subdir{WriteProc});
+                        SetByteOrder($oldOrder);
+                        if (defined $newValue) {
+                            my $hdrLen = $subdirStart - $valuePtr;
+                            if ($hdrLen) {
+                                $newValue = substr($$valueDataPt, $valuePtr, $hdrLen) . $newValue;
+                                $subFixup->{Start} += $hdrLen;
+                            }
+                            $newValuePt = \$newValue;
+                        }
+                        unless (defined $$newValuePt) {
+                            $exifTool->Error("Error writing $dirName:$$newInfo{Name}");
+                            return undef;
+                        }
+                        unless (length $$newValuePt) {
+                            # don't delete a previously empty makernote directory
+                            next if $oldSize or not $inMakerNotes;
+                        }
+                        if ($subFixup->{Pointers} and $subdirInfo{Base} == $base) {
+                            $subFixup->{Start} += length $valBuff;
+                            push @valFixups, $subFixup;
+                        } else {
+                            # apply fixup in case we added a header ($hdrLen above)
+                            $subFixup->ApplyFixup(\$newValue);
+                        }
+                    }
+
+                } elsif ($$newInfo{OffsetPair}) {
+#
+# keep track of offsets
+#
+                    my $dataTag = $$newInfo{DataTag} || '';
+                    if ($dataTag eq 'CanonVRD') {
+                        # must decide now if we will write CanonVRD information
+                        my $hasVRD;
+                        if ($exifTool->{NEW_VALUE}{$Image::ExifTool::Extra{CanonVRD}}) {
+                            # adding or deleting as a block
+                            $hasVRD = $exifTool->GetNewValues('CanonVRD') ? 1 : 0;
+                        } elsif ($exifTool->{DEL_GROUP}{CanonVRD} or
+                                 $exifTool->{DEL_GROUP}{Trailer})
+                        {
+                            $hasVRD = 0;    # deleting as a group
+                        } else {
+                            $hasVRD = ($$newValuePt ne "\0\0\0\0");
+                        }
+                        if ($hasVRD) {
+                            # add a fixup, and set this offset later
+                            $dirFixup->AddFixup(length($dirBuff) + 8, $dataTag);
+                        } else {
+                            # there is (or will soon be) no VRD information, so set pointer to zero
+                            $newValue = "\0" x length($$newValuePt);
+                            $newValuePt = \$newValue;
+                        }
+                    } elsif ($dataTag eq 'OriginalDecisionData') {
+                        # handle Canon OriginalDecisionData (no associated length tag)
+                        # - I'm going out of my way here to preserve data which is
+                        #   invalidated anyway by our edits
+                        my $odd;
+                        my $oddInfo = $Image::ExifTool::Composite{OriginalDecisionData};
+                        if ($oddInfo and $exifTool->{NEW_VALUE}{$oddInfo}) {
+                            $odd = $exifTool->GetNewValues($dataTag);
+                            if ($verbose > 1) {
+                                print $out "    - $dirName:$dataTag\n" if $$newValuePt ne "\0\0\0\0";
+                                print $out "    + $dirName:$dataTag\n" if $odd;
+                            }
+                            ++$exifTool->{CHANGED};
+                        } elsif ($$newValuePt ne "\0\0\0\0") {
+                            if (length($$newValuePt) == 4) {
+                                require Image::ExifTool::Canon;
+                                my $offset = Get32u($newValuePt,0);
+                                # absolute offset in JPEG images only
+                                $offset += $base unless $$exifTool{FILE_TYPE} eq 'JPEG';
+                                $odd = Image::ExifTool::Canon::ReadODD($exifTool, $offset);
+                                $odd = $$odd if ref $odd;
+                            } else {
+                                $exifTool->Error("Invalid $$newInfo{Name}",1);
+                            }
+                        }
+                        if ($odd) {
+                            my $newOffset = length($valBuff);
+                            # (ODD offset is absolute in JPEG, so add base offset!)
+                            $newOffset += $base if $$exifTool{FILE_TYPE} eq 'JPEG';
+                            $newValue = Set32u($newOffset);
+                            $dirFixup->AddFixup(length($dirBuff) + 8, $dataTag);
+                            $valBuff .= $odd;   # add original decision data
+                        } else {
+                            $newValue = "\0\0\0\0";
+                        }
+                        $newValuePt = \$newValue;
+                    } else {
+                        my $offsetInfo = $offsetInfo[$ifd];
+                        # save original values (for updating TIFF_END later)
+                        my @vals;
+                        if ($isNew <= 0) {
+                            my $oldOrder = GetByteOrder();
+                            # Minolta A200 stores these in the wrong byte order!
+                            SetByteOrder($$newInfo{ByteOrder}) if $$newInfo{ByteOrder};
+                            @vals = ReadValue(\$oldValue, 0, $readFormName, $readCount, $oldSize);
+                            SetByteOrder($oldOrder);
+                        }
+                        # only support int32 pointers (for now)
+                        if ($formatSize[$newFormat] != 4 and $$newInfo{IsOffset}) {
+                            $isNew > 0 and warn("Internal error (Offset not int32)"), return undef;
+                            $newCount != $readCount and warn("Wrong count!"), return undef;
+                            # change to int32
+                            $newFormName = 'int32u';
+                            $newFormat = $formatNumber{$newFormName};
+                            $newValue = WriteValue(join(' ',@vals), $newFormName, $newCount);
+                            unless (defined $newValue) {
+                                warn "Internal error writing offsets for $$newInfo{Name}\n";
+                                return undef;
+                            }
+                        }
+                        $offsetInfo or $offsetInfo = $offsetInfo[$ifd] = { };
+                        # save location of valuePtr in new directory
+                        # (notice we add 10 instead of 8 for valuePtr because
+                        # we will put a 2-byte count at start of directory later)
+                        my $ptr = $newStart + length($dirBuff) + 10;
+                        $newCount or $newCount = 1; # make sure count is set for offsetInfo
+                        # save value pointer and value count for each tag
+                        $offsetInfo->{$newID} = [$newInfo, $ptr, $newCount, \@vals, $newFormat];
+                    }
+
+                } elsif ($$newInfo{DataMember}) {
+
+                    # save any necessary data members (Make, Model, etc)
+                    my $formatStr = $newFormName;
+                    my $count = $newCount;
+                    # change to specified format if necessary
+                    if ($$newInfo{Format} and $$newInfo{Format} ne $formatStr) {
+                        $formatStr = $$newInfo{Format};
+                        my $format = $formatNumber{$formatStr};
+                        # adjust number of items for new format size
+                        $count = int(length($$newValuePt) / $formatSize[$format]) if $format;
+                    }
+                    my $val = ReadValue($newValuePt,0,$formatStr,$count,length($$newValuePt));
+                    my $conv = $$newInfo{RawConv};
+                    if ($conv) {
+                        # let the RawConv store the (possibly converted) data member
+                        if (ref $conv eq 'CODE') {
+                            &$conv($val, $exifTool);
+                        } else {
+                            my ($self, $tag, $taginfo) = ($exifTool, $$newInfo{Name}, $newInfo);
+                            #### eval RawConv ($self, $val, $tag, $tagInfo)
+                            eval $conv;
+                        }
+                    } else {
+                        $$exifTool{$$newInfo{DataMember}} = $val;
+                    }
+                }
+            }
+#
+# write out the directory entry
+#
+            my $newSize = length($$newValuePt);
+            my $fsize = $formatSize[$newFormat];
+            my $offsetVal;
+            $newCount = int(($newSize + $fsize - 1) / $fsize);  # set proper count
+            if ($newSize > 4) {
+                # zero-pad to an even number of bytes (required by EXIF standard)
+                # and make sure we are a multiple of the format size
+                while ($newSize & 0x01 or $newSize < $newCount * $fsize) {
+                    $$newValuePt .= "\0";
+                    ++$newSize;
+                }
+                my $entryBased;
+                if ($$dirInfo{EntryBased} or ($newInfo and $$newInfo{EntryBased})) {
+                    $entryBased = 1;
+                    $offsetVal = Set32u(length($valBuff) - length($dirBuff));
+                } else {
+                    $offsetVal = Set32u(length $valBuff);
+                }
+                my ($dataTag, $putFirst);
+                ($dataTag, $putFirst) = @$newInfo{'DataTag','PutFirst'} if $newInfo;
+                if ($dataTag) {
+                    if ($dataTag eq 'PreviewImage' and ($exifTool->{FILE_TYPE} eq 'JPEG' or
+                        $$exifTool{GENERATE_PREVIEW_INFO}))
+                    {
+                        # hold onto the PreviewImage until we can determine if it fits
+                        $exifTool->{PREVIEW_INFO} or $exifTool->{PREVIEW_INFO} = { };
+                        $exifTool->{PREVIEW_INFO}{Data} = $$newValuePt;
+                        $exifTool->{PREVIEW_INFO}{ChangeBase} = 1 if $$newInfo{ChangeBase};
+                        if ($$newInfo{IsOffset} and $$newInfo{IsOffset} eq '2') {
+                            $exifTool->{PREVIEW_INFO}{NoBaseShift} = 1;
+                        }
+                        # use original preview size if we will attempt to load it later
+                        $newCount = $oldCount if $$newValuePt eq 'LOAD_PREVIEW';
+                        $$newValuePt = '';
+                    } elsif ($dataTag eq 'LeicaTrailer' and $$exifTool{LeicaTrailer}) {
+                        $$newValuePt = '';
+                    }
+                }
+                if ($putFirst and $$dirInfo{HeaderPtr}) {
+                    my $hdrPtr = $$dirInfo{HeaderPtr};
+                    # place this value immediately after the TIFF header
+                    $offsetVal = Set32u(length $$hdrPtr);
+                    $$hdrPtr .= $$newValuePt;
+                } else {
+                    $valBuff .= $$newValuePt;       # add value data to buffer
+                    # must save a fixup pointer for every pointer in the directory
+                    if ($entryBased) {
+                        $entryBasedFixup or $entryBasedFixup = new Image::ExifTool::Fixup;
+                        $entryBasedFixup->AddFixup(length($dirBuff) + 8, $dataTag);
+                    } else {
+                        $dirFixup->AddFixup(length($dirBuff) + 8, $dataTag);
+                    }
+                }
+            } else {
+                $offsetVal = $$newValuePt;      # save value in offset if 4 bytes or less
+                # must pad value with zeros if less than 4 bytes
+                $newSize < 4 and $offsetVal .= "\0" x (4 - $newSize);
+            }
+            # write the directory entry
+            $dirBuff .= Set16u($newID) . Set16u($newFormat) .
+                        Set32u($newCount) . $offsetVal;
+            # update flag to keep track of mandatory tags
+            while (defined $allMandatory) {
+                if (defined $$mandatory{$newID}) {
+                    # values must correspond to mandatory values
+                    my $form = $$newInfo{Format} || $newFormName;
+                    my $mandVal = WriteValue($$mandatory{$newID}, $form, $newCount);
+                    if (defined $mandVal and $mandVal eq $$newValuePt) {
+                        ++$allMandatory;        # count mandatory tags
+                        last;
+                    }
+                }
+                undef $deleteAll;
+                undef $allMandatory;
+            }
+        }
+        if ($ignoreCount) {
+            my $y = $ignoreCount > 1 ? 'ies' : 'y';
+            $exifTool->Warn("Removed $ignoreCount invalid entr$y from $name", 1);
+        }
+        if ($fixCount) {
+            my $s = $fixCount > 1 ? 's' : '';
+            $exifTool->Warn("Fixed invalid count$s for $fixCount $name tag$s", 1);
+        }
+#..............................................................................
+# write directory counts and nextIFD pointer and add value data to end of IFD
+#
+        # determine now if there is or will be another IFD after this one
+        my $nextIfdOffset;
+        if ($dirEnd + 4 <= $dataLen) {
+            $nextIfdOffset = Get32u($dataPt, $dirEnd);
+        } else {
+            $nextIfdOffset = 0;
+        }
+        my $isNextIFD = ($$dirInfo{Multi} and ($nextIfdOffset or
+                        # account for the case where we will create the next IFD
+                        ($dirName eq 'IFD0' and $exifTool->{ADD_DIRS}{'IFD1'})));
+        # calculate number of entries in new directory
+        my $newEntries = length($dirBuff) / 12;
+        # delete entire directory if we deleted a tag and only mandatory tags remain or we
+        # attempted to create a directory with only mandatory tags and there is no nextIFD
+        if ($allMandatory and not $isNextIFD and ($newEntries < $numEntries or $numEntries == 0)) {
+            $newEntries = 0;
+            $dirBuff = '';
+            $valBuff = '';
+            undef $dirFixup;    # no fixups in this directory
+            ++$deleteAll if defined $deleteAll;
+            $verbose > 1 and print $out "    - $allMandatory mandatory tag(s)\n";
+            $exifTool->{CHANGED} -= $addMandatory;    # didn't change these after all
+        }
+        if ($ifd and not $newEntries) {
+            $verbose and print $out "  Deleting IFD1\n";
+            last;   # don't write IFD1 if empty
+        }
+        # apply one-time fixup for entry-based offsets
+        if ($entryBasedFixup) {
+            $entryBasedFixup->{Shift} = length($dirBuff) + 4;
+            $entryBasedFixup->ApplyFixup(\$dirBuff);
+            undef $entryBasedFixup;
+        }
+        # add directory entry count to start of IFD and next IFD pointer to end
+        # (temporarily set next IFD pointer to zero)
+        $newData .= Set16u($newEntries) . $dirBuff . Set32u(0);
+        # get position of value data in newData
+        my $valPos = length($newData);
+        # go back now and set next IFD pointer if this isn't the first IFD
+        if ($nextIfdPos) {
+            # set offset to next IFD
+            Set32u($newStart, \$newData, $nextIfdPos);
+            $fixup->AddFixup($nextIfdPos,'NextIFD');    # add fixup for this offset in newData
+        }
+        # remember position of 'next IFD' pointer so we can set it next time around
+        $nextIfdPos = $valPos - 4;
+        # add value data after IFD
+        $newData .= $valBuff;
+#
+# add any subdirectories, adding fixup information
+#
+        if (@subdirs) {
+            my $subdir;
+            foreach $subdir (@subdirs) {
+                my $len = length($newData);         # position of subdirectory in data
+                my $subdirFixup = $$subdir{Fixup};
+                if ($subdirFixup) {
+                    $$subdirFixup{Start} += $len;
+                    $fixup->AddFixup($subdirFixup);
+                }
+                my $imageData = $$subdir{ImageData};
+                my $blockSize = 0;
+                # must also update start position for ImageData fixups
+                if (ref $imageData) {
+                    my $blockInfo;
+                    foreach $blockInfo (@$imageData) {
+                        my ($pos, $size, $pad, $entry, $subFix) = @$blockInfo;
+                        if ($subFix) {
+                            $$subFix{Start} += $len;
+                            # save expected image data offset for calculating shift later
+                            $$subFix{BlockLen} = length(${$$subdir{DataPt}}) + $blockSize;
+                        }
+                        $blockSize += $size + $pad;
+                    }
+                }
+                $newData .= ${$$subdir{DataPt}};    # add subdirectory to our data
+                undef ${$$subdir{DataPt}};          # free memory now
+                # set the pointer
+                my $offset = $$subdir{Offset};
+                # if offset is in valBuff, it was added to the end of dirBuff
+                # (plus 4 bytes for nextIFD pointer)
+                $offset += length($dirBuff) + 4 if $$subdir{Where} eq 'valBuff';
+                $offset += $newStart + 2;           # get offset in newData
+                # check to be sure we got the right offset
+                unless (Get32u(\$newData, $offset) == 0xfeedf00d) {
+                    $exifTool->Error("Internal error while rewriting $name");
+                    return undef;
+                }
+                # set the offset to the subdirectory data
+                Set32u($len, \$newData, $offset);
+                $fixup->AddFixup($offset);  # add fixup for this offset in newData
+            }
+        }
+        # add fixup for all offsets in directory according to value data position
+        # (which is at the end of this directory)
+        if ($dirFixup) {
+            $dirFixup->{Start} = $newStart + 2;
+            $dirFixup->{Shift} = $valPos - $dirFixup->{Start};
+            $fixup->AddFixup($dirFixup);
+        }
+        # add valueData fixups, adjusting for position of value data
+        my $valFixup;
+        foreach $valFixup (@valFixups) {
+            $valFixup->{Start} += $valPos;
+            $fixup->AddFixup($valFixup);
+        }
+        # stop if no next IFD pointer
+        last unless $isNextIFD;   # stop unless scanning for multiple IFD's
+        if ($nextIfdOffset) {
+            # continue with next IFD
+            $dirStart = $nextIfdOffset - $dataPos;
+        } else {
+            # create IFD1 if necessary
+            $verbose and print $out "  Creating IFD1\n";
+            my $ifd1 = "\0" x 2;  # empty IFD1 data (zero entry count)
+            $dataPt = \$ifd1;
+            $dirStart = 0;
+            $dirLen = $dataLen = 2;
+        }
+        # increment IFD name
+        my $ifdNum = $dirName =~ s/(\d+)$// ? $1 : 0;
+        $dirName .= $ifdNum + 1;
+        $$exifTool{DIR_NAME} = $$exifTool{PATH}[-1] = $dirName;
+        next unless $nextIfdOffset;
+
+        # guard against writing the same directory twice
+        my $addr = $nextIfdOffset + $base;
+        if ($exifTool->{PROCESSED}{$addr}) {
+            $exifTool->Error("$name pointer references previous $exifTool->{PROCESSED}{$addr} directory", 1);
+            last;
+        }
+        $exifTool->{PROCESSED}{$addr} = $name;
+
+        if ($dirName eq 'SubIFD1' and not ValidateIFD($dirInfo, $dirStart)) {
+            if ($exifTool->{TIFF_TYPE} eq 'TIFF') {
+                $exifTool->Error('Ignored bad IFD linked from SubIFD', 1);
+            } elsif ($verbose) {
+                $exifTool->Warn('Ignored bad IFD linked from SubIFD');
+            }
+            last;   # don't write bad IFD
+        }
+        if ($exifTool->{DEL_GROUP}{$dirName}) {
+            $verbose and print $out "  Deleting $dirName\n";
+            $raf and $exifTool->Error("Deleting $dirName also deletes subsequent" .
+                                      " IFD's and possibly image data", 1);
+            ++$exifTool->{CHANGED};
+            if ($exifTool->{DEL_GROUP}{$dirName} == 2 and
+                $exifTool->{ADD_DIRS}{$dirName})
+            {
+                my $emptyIFD = "\0" x 2;    # start with empty IFD
+                $dataPt = \$emptyIFD;
+                $dirStart = 0;
+                $dirLen = $dataLen = 2;
+            } else {
+                last;   # don't write this IFD (or any subsequent IFD)
+            }
+        } else {
+            $verbose and print $out "  Rewriting $name\n";
+        }
+    }
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    # do our fixups now so we can more easily calculate offsets below
+    $fixup->ApplyFixup(\$newData);
+#
+# determine total block size for deferred data
+#
+    my $numBlocks = scalar @imageData;  # save this so we scan only existing blocks later
+    my $blockSize = 0;  # total size of blocks to copy later
+    my $blockInfo;
+    foreach $blockInfo (@imageData) {
+        my ($pos, $size, $pad) = @$blockInfo;
+        $blockSize += $size + $pad;
+    }
+#
+# copy over image data for IFD's, starting with the last IFD first
+#
+    if (@offsetInfo) {
+        my $ttwLen;     # length of MRW TTW segment
+        my @writeLater; # write image data last
+        for ($ifd=$#offsetInfo; $ifd>=-1; --$ifd) {
+            # build list of offsets to process
+            my @offsetList;
+            if ($ifd >= 0) {
+                my $offsetInfo = $offsetInfo[$ifd] or next;
+                # patch Panasonic RAW/RW2 StripOffsets/StripByteCounts if necessary
+                my $stripOffsets = $$offsetInfo{0x111};
+                if ($stripOffsets and $$stripOffsets[0]{PanasonicHack}) {
+                    require Image::ExifTool::PanasonicRaw;
+                    my $err = Image::ExifTool::PanasonicRaw::PatchRawDataOffset($offsetInfo, $raf, $ifd);
+                    $err and $exifTool->Error($err);
+                }
+                my $tagID;
+                # loop through all tags in reverse order so we save thumbnail
+                # data before main image data if both exist in the same IFD
+                foreach $tagID (reverse sort keys %$offsetInfo) {
+                    my $tagInfo = $offsetInfo->{$tagID}[0];
+                    next unless $$tagInfo{IsOffset}; # handle byte counts with offsets
+                    my $sizeInfo = $offsetInfo->{$$tagInfo{OffsetPair}};
+                    $sizeInfo or $exifTool->Error("No size tag for $dirName:$$tagInfo{Name}"), next;
+                    my $dataTag = $$tagInfo{DataTag};
+                    # write TIFF image data (strips or tiles) later if requested
+                    if ($raf and defined $$origDirInfo{ImageData} and
+                        ($tagID == 0x111 or $tagID == 0x144 or
+                          # also defer writing of other big data such as JpgFromRaw in NEF
+                          ($$sizeInfo[3][0] and
+                           # (calculate approximate combined size of all blocks)
+                           $$sizeInfo[3][0] * scalar(@{$$sizeInfo[3]}) > 1000000)) and
+                        # but don't defer writing if replacing with new value
+                        (not defined $dataTag or not defined $offsetData{$dataTag}))
+                    {
+                        push @writeLater, [ $offsetInfo->{$tagID}, $sizeInfo ];
+                    } else {
+                        push @offsetList, [ $offsetInfo->{$tagID}, $sizeInfo ];
+                    }
+                }
+            } else {
+                last unless @writeLater;
+                @offsetList = @writeLater;
+            }
+            my $offsetPair;
+            foreach $offsetPair (@offsetList) {
+                my ($tagInfo, $offsets, $count, $oldOffset) = @{$$offsetPair[0]};
+                my ($cntInfo, $byteCounts, $count2, $oldSize, $format) = @{$$offsetPair[1]};
+                # must be the same number of offset and byte count values
+                unless ($count == $count2) {
+                    $exifTool->Error("Offsets/ByteCounts disagree on count for $$tagInfo{Name}");
+                    return undef;
+                }
+                my $formatStr = $formatName[$format];
+                # follow pointer to value data if necessary
+                $count > 1 and $offsets = Get32u(\$newData, $offsets);
+                my $n = $count * $formatSize[$format];
+                $n > 4 and $byteCounts = Get32u(\$newData, $byteCounts);
+                if ($byteCounts < 0 or $byteCounts + $n > length($newData)) {
+                    $exifTool->Error("Error reading $$tagInfo{Name} byte counts");
+                    return undef;
+                }
+                # get offset base and data pos (abnormal for some preview images)
+                my ($dbase, $dpos, $wrongBase, $subIfdDataFixup);
+                if ($$tagInfo{IsOffset} eq '2') {
+                    $dbase = $firstBase;
+                    $dpos = $dataPos + $base - $firstBase;
+                } else {
+                    $dbase = $base;
+                    $dpos = $dataPos;
+                }
+                # use different base if necessary for some offsets (Minolta A200)
+                if ($$tagInfo{WrongBase}) {
+                    my $self = $exifTool;
+                    #### eval WrongBase ($self)
+                    $wrongBase = eval $$tagInfo{WrongBase} || 0;
+                    $dbase += $wrongBase;
+                    $dpos -= $wrongBase;
+                } else {
+                    $wrongBase = 0;
+                }
+                my $oldOrder = GetByteOrder();
+                my $dataTag = $$tagInfo{DataTag};
+                # use different byte order for values of this offset pair if required (Minolta A200)
+                SetByteOrder($$tagInfo{ByteOrder}) if $$tagInfo{ByteOrder};
+                # transfer the data referenced by all offsets of this tag
+                for ($n=0; $n<$count; ++$n) {
+                    my ($oldEnd, $size);
+                    if (@$oldOffset and @$oldSize) {
+                        # calculate end offset of this block
+                        $oldEnd = $$oldOffset[$n] + $$oldSize[$n];
+                        # update TIFF_END as if we read this data from file
+                        UpdateTiffEnd($exifTool, $oldEnd + $dbase);
+                    }
+                    my $offsetPos = $offsets + $n * 4;
+                    my $byteCountPos = $byteCounts + $n * $formatSize[$format];
+                    if ($$tagInfo{PanasonicHack}) {
+                        # use actual raw data length (may be different than StripByteCounts!)
+                        $size = $$oldSize[$n];
+                    } else {
+                        # use size of new data
+                        $size = ReadValue(\$newData, $byteCountPos, $formatStr, 1, 4);
+                    }
+                    my $offset = $$oldOffset[$n];
+                    if (defined $offset) {
+                        $offset -= $dpos;
+                    } elsif ($size != 0xfeedfeed) {
+                        $exifTool->Error('Internal error (no offset)');
+                        return undef;
+                    }
+                    my $newOffset = length($newData) - $wrongBase;
+                    my $buff;
+                    # look for 'feed' code to use our new data
+                    if ($size == 0xfeedfeed) {
+                        unless (defined $dataTag) {
+                            $exifTool->Error("No DataTag defined for $$tagInfo{Name}");
+                            return undef;
+                        }
+                        unless (defined $offsetData{$dataTag}) {
+                            $exifTool->Error("Internal error (no $dataTag)");
+                            return undef;
+                        }
+                        if ($count > 1) {
+                            $exifTool->Error("Can't modify $$tagInfo{Name} with count $count");
+                            return undef;
+                        }
+                        $buff = $offsetData{$dataTag};
+                        if ($formatSize[$format] != 4) {
+                            $exifTool->Error("$$cntInfo{Name} is not int32");
+                            return undef;
+                        }
+                        # set the data size
+                        $size = length($buff);
+                        Set32u($size, \$newData, $byteCountPos);
+                    } elsif ($ifd < 0) {
+                        # pad if necessary (but don't pad contiguous image blocks)
+                        my $pad = 0;
+                        ++$pad if $size & 0x01 and ($n+1 >= $count or not $oldEnd or
+                                  $oldEnd != $$oldOffset[$n+1]);
+                        # preserve original image padding if specified
+                        if ($$origDirInfo{PreserveImagePadding} and $n+1 < $count and
+                            $oldEnd and $$oldOffset[$n+1] > $oldEnd)
+                        {
+                            $pad = $$oldOffset[$n+1] - $oldEnd;
+                        }
+                        # copy data later
+                        push @imageData, [$offset+$dbase+$dpos, $size, $pad];
+                        $newOffset += $blockSize;   # data comes after other deferred data
+                        # create fixup for SubIFD ImageData
+                        if ($imageDataFlag eq 'SubIFD' and not $subIfdDataFixup) {
+                            $subIfdDataFixup = new Image::ExifTool::Fixup;
+                            $imageData[-1][4] = $subIfdDataFixup;
+                        }
+                        $size += $pad; # account for pad byte if necessary
+                        # return ImageData list
+                        $$origDirInfo{ImageData} = \@imageData;
+                    } elsif ($offset >= 0 and $offset+$size <= $dataLen) {
+                        # take data from old dir data buffer
+                        $buff = substr($$dataPt, $offset, $size);
+                    } elsif ($$exifTool{TIFF_TYPE} eq 'MRW') {
+                        # TTW segment must be an even 4 bytes long, so pad now if necessary
+                        my $n = length $newData;
+                        $buff = ($n & 0x03) ? "\0" x (4 - ($n & 0x03)) : '';
+                        $size = length($buff);
+                        # data exists after MRW TTW segment
+                        $ttwLen = length($newData) + $size unless defined $ttwLen;
+                        $newOffset = $offset + $dpos + $ttwLen - $dataLen;
+                    } elsif ($raf and $raf->Seek($offset+$dbase+$dpos,0) and
+                             $raf->Read($buff,$size) == $size)
+                    {
+                        # (data was read OK)
+                        # patch incorrect ThumbnailOffset in Sony A100 1.00 ARW images
+                        if ($$exifTool{TIFF_TYPE} eq 'ARW' and $$tagInfo{Name} eq 'ThumbnailOffset' and
+                            $$exifTool{Model} eq 'DSLR-A100' and $buff !~ /^\xff\xd8\xff/)
+                        {
+                            my $pos = $offset + $dbase + $dpos;
+                            my $try;
+                            if ($pos < 0x10000 and $raf->Seek($pos+0x10000,0) and
+                                $raf->Read($try,$size) == $size and $try =~ /^\xff\xd8\xff/)
+                            {
+                                $buff = $try;
+                                $exifTool->Warn('Adjusted incorrect A100 ThumbnailOffset', 1);
+                            } else {
+                                $exifTool->Error('Invalid ThumbnailImage');
+                            }
+                        }
+                    } elsif ($$tagInfo{Name} eq 'ThumbnailOffset' and $offset>=0 and $offset<$dataLen) {
+                        # Grrr.  The Canon 350D writes the thumbnail with an incorrect byte count
+                        my $diff = $offset + $size - $dataLen;
+                        $exifTool->Warn("ThumbnailImage runs outside EXIF data by $diff bytes (truncated)",1);
+                        # set the size to the available data
+                        $size -= $diff;
+                        unless (WriteValue($size, $formatStr, 1, \$newData, $byteCountPos)) {
+                            warn 'Internal error writing thumbnail size';
+                        }
+                        # get the truncated image
+                        $buff = substr($$dataPt, $offset, $size);
+                    } elsif ($$tagInfo{Name} eq 'PreviewImageStart' and $exifTool->{FILE_TYPE} eq 'JPEG') {
+                        # try to load the preview image using the specified offset
+                        undef $buff;
+                        my $r = $exifTool->{RAF};
+                        if ($r and not $raf) {
+                            my $tell = $r->Tell();
+                            # read and validate
+                            undef $buff unless $r->Seek($offset+$base+$dataPos,0) and
+                                               $r->Read($buff,$size) == $size and
+                                               $buff =~ /^.\xd8\xff[\xc4\xdb\xe0-\xef]/;
+                            $r->Seek($tell, 0) or $exifTool->Error('Seek error'), return undef;
+                        }
+                        # set flag if we must load PreviewImage
+                        $buff = 'LOAD_PREVIEW' unless defined $buff;
+                    } else {
+                        my $dataName = $dataTag || $$tagInfo{Name};
+                        return undef if $exifTool->Error("Error reading $dataName data in $name", $inMakerNotes);
+                        $buff = '';
+                    }
+                    if ($$tagInfo{Name} eq 'PreviewImageStart') {
+                        if ($$exifTool{FILE_TYPE} eq 'JPEG' and not $$tagInfo{MakerPreview}) {
+                            # hold onto the PreviewImage until we can determine if it fits
+                            $exifTool->{PREVIEW_INFO} or $exifTool->{PREVIEW_INFO} = { };
+                            $exifTool->{PREVIEW_INFO}{Data} = $buff;
+                            if ($$tagInfo{IsOffset} and $$tagInfo{IsOffset} eq '2') {
+                                $exifTool->{PREVIEW_INFO}{NoBaseShift} = 1;
+                            }
+                            $buff = '';
+                        } elsif ($$exifTool{TIFF_TYPE} eq 'ARW' and $$exifTool{Model}  eq 'DSLR-A100') {
+                            # the A100 double-references the same preview, so ignore the
+                            # second one (the offset and size will be patched later)
+                            next if $$exifTool{A100PreviewLength};
+                            $$exifTool{A100PreviewLength} = length $buff if defined $buff;
+                        }
+                    }
+                    # update offset accordingly and add to end of new data
+                    Set32u($newOffset, \$newData, $offsetPos);
+                    # add a pointer to fix up this offset value (marked with DataTag name)
+                    $fixup->AddFixup($offsetPos, $dataTag);
+                    # also add to subIfdDataFixup if necessary
+                    $subIfdDataFixup->AddFixup($offsetPos, $dataTag) if $subIfdDataFixup;
+                    # must also (sometimes) update StripOffsets in Panasonic RW2 images
+                    my $otherPos = $$offsetPair[0][5];
+                    if ($otherPos and $$tagInfo{PanasonicHack}) {
+                        Set32u($newOffset, \$newData, $otherPos);
+                        $fixup->AddFixup($otherPos, $dataTag);
+                    }
+                    if ($ifd >= 0) {
+                        # buff length must be even (Note: may have changed since $size was set)
+                        $buff .= "\0" if length($buff) & 0x01;
+                        $newData .= $buff;      # add this strip to the data
+                    } else {
+                        $blockSize += $size;    # keep track of total size
+                    }
+                }
+                SetByteOrder($oldOrder);
+            }
+        }
+        # verify that nothing else got written after determining TTW length
+        if (defined $ttwLen and $ttwLen != length($newData)) {
+            $exifTool->Error('Internal error writing MRW TTW');
+        }
+    }
+#
+# set offsets and generate fixups for tag values which were too large for memory
+#
+    $blockSize = 0;
+    foreach $blockInfo (@imageData) {
+        my ($pos, $size, $pad, $entry, $subFix) = @$blockInfo;
+        if (defined $entry) {
+            my $format = Get16u(\$newData, $entry + 2);
+            if ($format < 1 or $format > 13) {
+                $exifTool->Error('Internal error copying huge value');
+                last;
+            } else {
+                # set count and offset in directory entry
+                Set32u($size / $formatSize[$format], \$newData, $entry + 4);
+                Set32u(length($newData)+$blockSize, \$newData, $entry + 8);
+                $fixup->AddFixup($entry + 8);
+                # create special fixup for SubIFD data
+                if ($imageDataFlag eq 'SubIFD') {
+                    my $subIfdDataFixup = new Image::ExifTool::Fixup;
+                    $subIfdDataFixup->AddFixup($entry + 8);
+                    # save fixup in imageData list
+                    $$blockInfo[4] = $subIfdDataFixup; 
+                }
+                # must reset entry pointer so we don't use it again in a parent IFD!
+                $$blockInfo[3] = undef;
+            }
+        }
+        # apply additional shift required for contained SubIFD image data offsets
+        if ($subFix and defined $$subFix{BlockLen} and $numBlocks > 0) {
+            # our offset expects the data at the end of the SubIFD block (BlockLen + Start),
+            # but it will actually be at length($newData) + $blockSize.  So adjust
+            # accordingly (and subtract an extra Start because this shift is applied later)
+            $subFix->{Shift} += length($newData) - $$subFix{BlockLen} - 2 * $$subFix{Start} + $blockSize;
+            $subFix->ApplyFixup(\$newData);
+        }
+        $blockSize += $size + $pad;
+        --$numBlocks;
+    }
+#
+# apply final shift to new data position if this is the top level IFD
+#
+    unless ($$dirInfo{Fixup}) {
+        my $hdrPtr = $$dirInfo{HeaderPtr};
+        my $newDataPos = $hdrPtr ? length $$hdrPtr : $$dirInfo{NewDataPos} || 0;
+        # adjust CanonVRD offset to point to end of regular TIFF if necessary
+        # (NOTE: This will be incorrect if multiple trailers exist,
+        #  but it is unlikely that it could ever be correct in this case anyway.
+        #  Also, this doesn't work for JPEG images (but CanonDPP doesn't set
+        #  this when editing JPEG images anyway))
+        $fixup->SetMarkerPointers(\$newData, 'CanonVRD', length($newData) + $blockSize);
+        if ($newDataPos) {
+            $fixup->{Shift} += $newDataPos;
+            $fixup->ApplyFixup(\$newData);
+        }
+        # save fixup for adjusting Leica trailer offset if necessary
+        if ($$exifTool{LeicaTrailer}) {
+            my $trail = $$exifTool{LeicaTrailer};
+            $$trail{Fixup} or $$trail{Fixup} = new Image::ExifTool::Fixup;
+            $$trail{Fixup}->AddFixup($fixup);
+        }
+        # save fixup for PreviewImage in JPEG file if necessary
+        my $previewInfo = $exifTool->{PREVIEW_INFO};
+        if ($previewInfo) {
+            my $pt = \$previewInfo->{Data}; # image data or 'LOAD_PREVIEW' flag
+            # now that we know the size of the EXIF data, first test to see if our new image fits
+            # inside the EXIF segment (remember about the TIFF and EXIF headers: 8+6 bytes)
+            if (($$pt ne 'LOAD_PREVIEW' and length($$pt) + length($newData) + 14 <= 0xfffd and
+                not $previewInfo->{IsTrailer}) or
+                $previewInfo->{IsShort}) # must fit in this segment if using short pointers
+            {
+                # It fits! (or must exist in EXIF segment), so fixup the
+                # PreviewImage pointers and stuff the preview image in here
+                my $newPos = length($newData) + $newDataPos;
+                $newPos += ($previewInfo->{BaseShift} || 0);
+                if ($previewInfo->{Relative}) {
+                    # calculate our base by looking at how far the pointer got shifted
+                    $newPos -= $fixup->GetMarkerPointers(\$newData, 'PreviewImage');
+                }
+                $fixup->SetMarkerPointers(\$newData, 'PreviewImage', $newPos);
+                $newData .= $$pt;
+                delete $exifTool->{PREVIEW_INFO};   # done with our preview data
+                $exifTool->{DEL_PREVIEW} = 1;       # set flag to delete old preview
+            } else {
+                # Doesn't fit, or we still don't know, so save fixup information
+                # and put the preview at the end of the file
+                $previewInfo->{Fixup} or $previewInfo->{Fixup} = new Image::ExifTool::Fixup;
+                $previewInfo->{Fixup}->AddFixup($fixup);
+            }
+        } elsif (defined $newData and $deleteAll) {
+            $newData = '';  # delete both IFD0 and IFD1 since only mandatory tags remain
+        } elsif ($$exifTool{A100PreviewLength}) {
+            # save preview image start for patching A100 quirks later
+            $$exifTool{A100PreviewStart} = $fixup->GetMarkerPointers(\$newData, 'PreviewImage');
+        }
+        # save location of last IFD for use in Canon RAW header
+        if ($newDataPos == 16) {
+            my @ifdPos = $fixup->GetMarkerPointers(\$newData,'NextIFD');
+            $$origDirInfo{LastIFD} = pop @ifdPos;
+        }
+        # recrypt SR2 SubIFD data if necessary
+        my $key = $$exifTool{SR2SubIFDKey};
+        if ($key) {
+            my $start = $fixup->GetMarkerPointers(\$newData, 'SR2SubIFDOffset');
+            my $len = $$exifTool{SR2SubIFDLength};
+            # (must subtract 8 for size of TIFF header)
+            if ($start and $start - 8 + $len <= length $newData) {
+                require Image::ExifTool::Sony;
+                Image::ExifTool::Sony::Decrypt(\$newData, $start - 8, $len, $key);
+            }
+        }
+    }
+    # return empty string if no entries in directory
+    # (could be up to 10 bytes and still be empty)
+    $newData = '' if defined $newData and length($newData) < 12;
+
+    return $newData;    # return our directory data
+}
+
+1; # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::WriteExif.pl - Write EXIF meta information
+
+=head1 SYNOPSIS
+
+This file is autoloaded by Image::ExifTool::Exif.
+
+=head1 DESCRIPTION
+
+This file contains routines to write EXIF metadata.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::Exif(3pm)|Image::ExifTool::Exif>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/WriteIPTC.pl
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/WriteIPTC.pl	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/WriteIPTC.pl	(revision 24799)
@@ -0,0 +1,689 @@
+#------------------------------------------------------------------------------
+# File:         WriteIPTC.pl
+#
+# Description:  Write IPTC meta information
+#
+# Revisions:    12/15/2004 - P. Harvey Created
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::IPTC;
+
+use strict;
+
+# mandatory IPTC tags for each record
+my %mandatory = (
+    1 => {
+        0  => 4,        # EnvelopeRecordVersion
+    },
+    2 => {
+        0  => 4,        # ApplicationRecordVersion
+    },
+    3 => {
+        0  => 4,        # NewsPhotoVersion
+    },
+);
+
+# manufacturer strings for IPTCPictureNumber
+my %manufacturer = (
+    1 => 'Associated Press, USA',
+    2 => 'Eastman Kodak Co, USA',
+    3 => 'Hasselblad Electronic Imaging, Sweden',
+    4 => 'Tecnavia SA, Switzerland',
+    5 => 'Nikon Corporation, Japan',
+    6 => 'Coatsworth Communications Inc, Canada',
+    7 => 'Agence France Presse, France',
+    8 => 'T/One Inc, USA',
+    9 => 'Associated Newspapers, UK',
+    10 => 'Reuters London',
+    11 => 'Sandia Imaging Systems Inc, USA',
+    12 => 'Visualize, Spain',
+);
+
+my %iptcCharsetInv = ( 'UTF8' => "\x1b%G", 'UTF-8' => "\x1b%G" );
+
+# ISO 2022 Character Coding Notes
+# -------------------------------
+# Character set designation: (0x1b I F, or 0x1b I I F)
+# Initial character 0x1b (ESC)
+# Intermediate character I:
+#   0x28 ('(') - G0, 94 chars
+#   0x29 (')') - G1, 94 chars
+#   0x2a ('*') - G2, 94 chars
+#   0x2b ('+') - G3, 94 chars
+#   0x2c (',') - G1, 96 chars
+#   0x2d ('-') - G2, 96 chars
+#   0x2e ('.') - G3, 96 chars
+#   0x24 I ('$I') - multiple byte graphic sets (I from above)
+#   I 0x20 ('I ') - dynamically redefinable character sets
+# Final character:
+#   0x30 - 0x3f = private character set
+#   0x40 - 0x7f = standardized character set
+# Character set invocation:
+#   G0 : SI = 0x15
+#   G1 : SO = 0x14,             LS1R = 0x1b 0x7e ('~')
+#   G2 : LS2 = 0x1b 0x6e ('n'), LS2R = 0x1b 0x7d ('}')
+#   G3 : LS3 = 0x1b 0x6f ('o'), LS3R = 0x1b 0x7c ('|')
+#   (the locking shift "R" codes shift into 0x80-0xff space)
+# Single character invocation:
+#   G2 : SS2 = 0x1b 0x8e (or 0x4e in 7-bit)
+#   G3 : SS3 = 0x1b 0x8f (or 0x4f in 7-bit)
+# Control chars (designated and invoked)
+#   C0 : 0x1b 0x21 F (0x21 = '!')
+#   C1 : 0x1b 0x22 F (0x22 = '"')
+# Complete codes (control+graphics, designated and invoked)
+#   0x1b 0x25 F   (0x25 = '%')
+#   0x1b 0x25 I F
+#   0x1b 0x25 0x47 ("\x1b%G") - UTF-8
+#   0x1b 0x25 0x40 ("\x1b%@") - return to ISO 2022
+# -------------------------------
+
+#------------------------------------------------------------------------------
+# Inverse print conversion for CodedCharacterSet
+# Inputs: 0) value
+sub PrintInvCodedCharset($)
+{
+    my $val = shift;
+    my $code = $iptcCharsetInv{uc($val)};
+    unless ($code) {
+        if (($code = $val) =~ s/ESC /\x1b/g) {  # translate ESC chars
+            $code =~ s/, \x1b/\x1b/g;   # remove comma separators
+            $code =~ tr/ //d;           # remove spaces
+        } else {
+            warn "Bad syntax (use 'UTF8' or 'ESC X Y[, ...]')\n";
+        }
+    }
+    return $code;
+}
+
+#------------------------------------------------------------------------------
+# validate raw values for writing
+# Inputs: 0) ExifTool object ref, 1) tagInfo hash ref, 2) raw value ref
+# Returns: error string or undef (and possibly changes value) on success
+sub CheckIPTC($$$)
+{
+    my ($exifTool, $tagInfo, $valPtr) = @_;
+    my $format = $$tagInfo{Format} || $tagInfo->{Table}->{FORMAT} || '';
+    if ($format =~ /^int(\d+)/) {
+        my $bytes = int(($1 || 0) / 8);
+        if ($bytes ne 1 and $bytes ne 2 and $bytes ne 4) {
+            return "Can't write $bytes-byte integer";
+        }
+        my $val = $$valPtr;
+        unless (Image::ExifTool::IsInt($val)) {
+            return 'Not an integer' unless Image::ExifTool::IsHex($val);
+            $val = $$valPtr = hex($val);
+        }
+        my $n;
+        for ($n=0; $n<$bytes; ++$n) { $val >>= 8; }
+        return "Value too large for $bytes-byte format" if $val;
+    } elsif ($format =~ /^(string|digits|undef)\[?(\d+),?(\d*)\]?$/) {
+        my ($fmt, $minlen, $maxlen) = ($1, $2, $3);
+        my $len = length $$valPtr;
+        if ($fmt eq 'digits') {
+            return 'Non-numeric characters in value' unless $$valPtr =~ /^\d*$/;
+            if ($len < $minlen and $len) {
+                # left pad with zeros if necessary
+                $$valPtr = ('0' x ($minlen - $len)) . $$valPtr;
+                $len = $minlen;
+            }
+        }
+        if (defined $minlen) {
+            $maxlen or $maxlen = $minlen;
+            return "String too short (minlen is $minlen)" if $len < $minlen;
+            if ($len > $maxlen and not $exifTool->Options('IgnoreMinorErrors')) {
+                $$exifTool{CHECK_WARN} = "[minor] IPTC:$$tagInfo{Name} exceeds length limit (truncated)";
+                $$valPtr = substr($$valPtr, 0, $maxlen);
+            }
+        }
+    } else {
+        return "Bad IPTC Format ($format)";
+    }
+    return undef;
+}
+
+#------------------------------------------------------------------------------
+# format IPTC data for writing
+# Inputs: 0) ExifTool object ref, 1) tagInfo pointer,
+#         2) value reference (changed if necessary),
+#         3) reference to character set for translation (changed if necessary)
+#         4) record number, 5) flag set to read value (instead of write)
+sub FormatIPTC($$$$$;$)
+{
+    my ($exifTool, $tagInfo, $valPtr, $xlatPtr, $rec, $read) = @_;
+    my $format = $$tagInfo{Format} || $$tagInfo{Table}{FORMAT};
+    return unless $format;
+    if ($format =~ /^int(\d+)/) {
+        if ($read) {
+            my $len = length($$valPtr);
+            if ($len <= 8) {    # limit integer conversion to 8 bytes long
+                my $val = 0;
+                my $i;
+                for ($i=0; $i<$len; ++$i) {
+                    $val = $val * 256 + ord(substr($$valPtr, $i, 1));
+                }
+                $$valPtr = $val;
+            }
+        } else {
+            my $len = int(($1 || 0) / 8);
+            if ($len == 1) {        # 1 byte
+                $$valPtr = chr($$valPtr);
+            } elsif ($len == 2) {   # 2-byte integer
+                $$valPtr = pack('n', $$valPtr);
+            } else {                # 4-byte integer
+                $$valPtr = pack('N', $$valPtr);
+            }
+        }
+    } elsif ($format =~ /^string/) {
+        if ($rec == 1) {
+            if ($$tagInfo{Name} eq 'CodedCharacterSet') {
+                $$xlatPtr = HandleCodedCharset($exifTool, $$valPtr);
+            }
+        } elsif ($$xlatPtr and $rec < 7 and $$valPtr =~ /[\x80-\xff]/) {
+            TranslateCodedString($exifTool, $valPtr, $xlatPtr, $read);
+        }
+    }
+}
+
+#------------------------------------------------------------------------------
+# generate IPTC-format date
+# Inputs: 0) EXIF-format date string (YYYY:mm:dd) or date/time string
+# Returns: IPTC-format date string (YYYYmmdd), or undef and issue warning on error
+sub IptcDate($)
+{
+    my $val = shift;
+    unless ($val =~ s/.*(\d{4}):?(\d{2}):?(\d{2}).*/$1$2$3/s) {
+        warn "Invalid date format (use YYYY:mm:dd)\n";
+        undef $val;
+    }
+    return $val;
+}
+
+#------------------------------------------------------------------------------
+# generate IPTC-format time
+# Inputs: 0) EXIF-format time string (HH:MM:SS[+/-HH:MM]) or date/time string
+# Returns: IPTC-format time string (HHMMSS+HHMM), or undef and issue warning on error
+sub IptcTime($)
+{
+    my $val = shift;
+    if ($val =~ /(.*?)\b(\d{1,2})(:?)(\d{2})(:?)(\d{2})(\S*)\s*$/s and ($3 or not $5)) {
+        $val = sprintf("%.2d%.2d%.2d",$2,$4,$6);
+        my ($date, $tz) = ($1, $7);
+        if ($tz =~ /([+-]\d{1,2}):?(\d{2})/) {
+            $tz = sprintf("%+.2d%.2d",$1,$2);
+        } elsif ($tz =~ /Z/i) {
+            $tz = '+0000';  # UTC
+        } else {
+            # use local system timezone by default 
+            my (@tm, $time);
+            if ($date and $date =~ /^(\d{4}):(\d{2}):(\d{2})\s*$/ and eval 'require Time::Local') {
+                # we were given a date too, so determine the local timezone
+                # offset at the specified date/time
+                my @d = ($3,$2-1,$1-1900);
+                $val =~ /(\d{2})(\d{2})(\d{2})/;
+                @tm = ($3,$2,$1,@d);
+                $time = Image::ExifTool::TimeLocal(@tm);
+            } else {
+                # it is difficult to get the proper local timezone offset for this
+                # time because the date tag is written separately.  (The offset may be
+                # different on a different date due to daylight savings time.)  In this
+                # case the best we can do easily is to use the current timezone offset.
+                $time = time;
+                @tm = localtime($time);
+            }
+            ($tz = Image::ExifTool::TimeZoneString(\@tm, $time)) =~ tr/://d;
+        }
+        $val .= $tz;
+    } else {
+        warn "Invalid time format (use HH:MM:SS[+/-HH:MM])\n";
+        undef $val;     # time format error
+    }
+    return $val;
+}
+
+#------------------------------------------------------------------------------
+# Convert picture number
+# Inputs: 0) value
+# Returns: Converted value
+sub ConvertPictureNumber($)
+{
+    my $val = shift;
+    if ($val eq "\0" x 16) {
+        $val = 'Unknown';
+    } elsif (length $val >= 16) {
+        my @vals = unpack('nNA8n', $val);
+        $val = $vals[0];
+        my $manu = $manufacturer{$val};
+        $val .= " ($manu)" if $manu;
+        $val .= ', equip ' . $vals[1];
+        $vals[2] =~ s/(\d{4})(\d{2})(\d{2})/$1:$2:$3/;
+        $val .= ", $vals[2], no. $vals[3]";
+    } else {
+        $val = '<format error>'
+    }
+    return $val;
+}
+
+#------------------------------------------------------------------------------
+# Inverse picture number conversion
+# Inputs: 0) value
+# Returns: Converted value (or undef on error)
+sub InvConvertPictureNumber($)
+{
+    my $val = shift;
+    $val =~ s/\(.*\)//g;    # remove manufacturer description
+    $val =~ tr/://d;        # remove date separators
+    $val =~ tr/0-9/ /c;     # turn remaining non-numbers to spaces
+    my @vals = split ' ', $val;
+    if (@vals >= 4) {
+        $val = pack('nNA8n', @vals);
+    } elsif ($val =~ /unknown/i) {
+        $val = "\0" x 16;
+    } else {
+        undef $val;
+    }
+    return $val;
+}
+
+#------------------------------------------------------------------------------
+# Write IPTC data record
+# Inputs: 0) ExifTool object ref, 1) source dirInfo ref, 2) tag table ref
+# Returns: IPTC data block (may be empty if no IPTC data)
+# Notes: Increments ExifTool CHANGED flag for each tag changed
+sub DoWriteIPTC($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $verbose = $exifTool->Options('Verbose');
+    my $out = $exifTool->Options('TextOut');
+
+    # avoid editing IPTC directory unless necessary:
+    # - improves speed
+    # - avoids changing current MD5 digest unnecessarily
+    # - avoids adding mandatory tags unless some other IPTC is changed
+    unless (exists $$exifTool{EDIT_DIRS}{$$dirInfo{DirName}} or
+        # standard IPTC tags in other locations should be edited too (ie. AFCP_IPTC)
+        ($tagTablePtr = \%Image::ExifTool::IPTC::Main and exists $$exifTool{EDIT_DIRS}{IPTC}))
+    {
+        print $out "$$exifTool{INDENT}  [nothing changed]\n" if $verbose;
+        return undef;
+    }
+    my $dataPt = $$dirInfo{DataPt};
+    unless ($dataPt) {
+        my $emptyData = '';
+        $dataPt = \$emptyData;
+    }
+    my $start = $$dirInfo{DirStart} || 0;
+    my $dirLen = $$dirInfo{DirLen};
+    my ($tagInfo, %iptcInfo, $tag);
+
+    # start by assuming default IPTC encoding
+    my $xlat = $exifTool->Options('CharsetIPTC');
+    undef $xlat if $xlat eq $exifTool->Options('Charset');
+
+    # make sure our dataLen is defined (note: allow zero length directory)
+    unless (defined $dirLen) {
+        my $dataLen = $$dirInfo{DataLen};
+        $dataLen = length($$dataPt) unless defined $dataLen;
+        $dirLen = $dataLen - $start;
+    }
+    # quick check for improperly byte-swapped IPTC
+    if ($dirLen >= 4 and substr($$dataPt, $start, 1) ne "\x1c" and
+                         substr($$dataPt, $start + 3, 1) eq "\x1c")
+    {
+        $exifTool->Warn('IPTC data was improperly byte-swapped');
+        my $newData = pack('N*', unpack('V*', substr($$dataPt, $start, $dirLen) . "\0\0\0"));
+        $dataPt = \$newData;
+        $start = 0;
+        # NOTE: MUST NOT access $dirInfo DataPt, DirStart or DataLen after this!
+    }
+    # generate lookup so we can find the record numbers
+    my %recordNum;
+    foreach $tag (Image::ExifTool::TagTableKeys($tagTablePtr)) {
+        $tagInfo = $tagTablePtr->{$tag};
+        $$tagInfo{SubDirectory} or next;
+        my $table = $tagInfo->{SubDirectory}->{TagTable} or next;
+        my $subTablePtr = Image::ExifTool::GetTagTable($table);
+        $recordNum{$subTablePtr} = $tag;
+    }
+
+    # loop through new values and accumulate all IPTC information
+    # into lists based on their IPTC record type
+    foreach $tagInfo ($exifTool->GetNewTagInfoList()) {
+        my $table = $$tagInfo{Table};
+        my $record = $recordNum{$table};
+        # ignore tags we aren't writing to this directory
+        next unless defined $record;
+        $iptcInfo{$record} = [] unless defined $iptcInfo{$record};
+        push @{$iptcInfo{$record}}, $tagInfo;
+    }
+
+    # get sorted list of records used.  Might as well be organized and
+    # write our records in order of record number first, then tag number
+    my @recordList = sort { $a <=> $b } keys %iptcInfo;
+    my ($record, %set);
+    foreach $record (@recordList) {
+        # sort tagInfo lists by tagID
+        @{$iptcInfo{$record}} = sort { $$a{TagID} <=> $$b{TagID} } @{$iptcInfo{$record}};
+        # build hash of all tagIDs to set
+        foreach $tagInfo (@{$iptcInfo{$record}}) {
+            $set{$record}->{$$tagInfo{TagID}} = $tagInfo;
+        }
+    }
+    # run through the old IPTC data, inserting our records in
+    # sequence and deleting existing records where necessary
+    # (the IPTC specification states that records must occur in
+    # numerical order, but tags within records need not be ordered)
+    my $pos = $start;
+    my $tail = $pos;        # old data written up to this point
+    my $dirEnd = $start + $dirLen;
+    my $newData = '';
+    my $lastRec = -1;
+    my $lastRecPos = 0;
+    my $allMandatory = 0;
+    my %foundRec;           # found flags: 0x01-existed before, 0x02-deleted, 0x04-created
+    my $addNow;
+
+    for (;;$tail=$pos) {
+        # get next IPTC record from input directory
+        my ($id, $rec, $tag, $len, $valuePtr);
+        if ($pos + 5 <= $dirEnd) {
+            my $buff = substr($$dataPt, $pos, 5);
+            ($id, $rec, $tag, $len) = unpack("CCCn", $buff);
+            if ($id == 0x1c) {
+                if ($rec < $lastRec) {
+                    if ($rec == 0) {
+                        return undef if $exifTool->Warn("IPTC record 0 encountered, subsequent records ignored", 1);
+                        undef $rec;
+                        $pos = $dirEnd;
+                        $len = 0;
+                    } else {
+                        return undef if $exifTool->Warn("IPTC doesn't conform to spec: Records out of sequence", 1);
+                    }
+                }
+                # handle extended IPTC entry if necessary
+                $pos += 5;      # step to after field header
+                if ($len & 0x8000) {
+                    my $n = $len & 0x7fff;  # get num bytes in length field
+                    if ($pos + $n <= $dirEnd and $n <= 8) {
+                        # determine length (a big-endian, variable sized int)
+                        for ($len = 0; $n; ++$pos, --$n) {
+                            $len = $len * 256 + ord(substr($$dataPt, $pos, 1));
+                        }
+                    } else {
+                        $len = $dirEnd;     # invalid length
+                    }
+                }
+                $valuePtr = $pos;
+                $pos += $len;   # step $pos to next entry
+                # make sure we don't go past the end of data
+                # (this can only happen if original data is bad)
+                $pos = $dirEnd if $pos > $dirEnd;
+            } else {
+                undef $rec;
+            }
+        }
+        # write out all our records that come before this one
+        my $writeRec = (not defined $rec or $rec != $lastRec);
+        if ($writeRec or $addNow) {
+            for (;;) {
+                my $newRec = $recordList[0];
+                if ($addNow) {
+                    $tagInfo = $addNow;
+                } elsif (not defined $newRec or $newRec != $lastRec) {
+                    # handle mandatory tags in last record unless it was empty
+                    if (length $newData > $lastRecPos) {
+                        if ($allMandatory > 1) {
+                            # entire lastRec contained mandatory tags, and at least one tag
+                            # was deleted, so delete entire record unless we specifically
+                            # added a mandatory tag
+                            my $num = 0;
+                            foreach (keys %{$foundRec{$lastRec}}) {
+                                my $code = $foundRec{$lastRec}->{$_};
+                                $num = 0, last if $code & 0x04;
+                                ++$num if ($code & 0x03) == 0x01;
+                            }
+                            if ($num) {
+                                $newData = substr($newData, 0, $lastRecPos);
+                                $verbose > 1 and print $out "    - $num mandatory tags\n";
+                            }
+                        } elsif ($mandatory{$lastRec} and
+                                 $tagTablePtr eq \%Image::ExifTool::IPTC::Main)
+                        {
+                            # add required mandatory tags
+                            my $mandatory = $mandatory{$lastRec};
+                            my ($mandTag, $subTablePtr);
+                            foreach $mandTag (sort { $a <=> $b } keys %$mandatory) {
+                                next if $foundRec{$lastRec}->{$mandTag};
+                                unless ($subTablePtr) {
+                                    $tagInfo = $tagTablePtr->{$lastRec};
+                                    $tagInfo and $$tagInfo{SubDirectory} or warn("WriteIPTC: Internal error 1\n"), next;
+                                    $tagInfo->{SubDirectory}->{TagTable} or next;
+                                    $subTablePtr = Image::ExifTool::GetTagTable($tagInfo->{SubDirectory}->{TagTable});
+                                }
+                                $tagInfo = $subTablePtr->{$mandTag} or warn("WriteIPTC: Internal error 2\n"), next;
+                                my $value = $mandatory->{$mandTag};
+                                $exifTool->VerboseValue("+ IPTC:$$tagInfo{Name}", $value, ' (mandatory)');
+                                # apply necessary format conversions
+                                FormatIPTC($exifTool, $tagInfo, \$value, \$xlat, $lastRec);
+                                $len = length $value;
+                                # generate our new entry
+                                my $entry = pack("CCCn", 0x1c, $lastRec, $mandTag, length($value));
+                                $newData .= $entry . $value;    # add entry to new IPTC data
+                                # (don't mark as changed if just mandatory tags changed)
+                                # ++$exifTool->{CHANGED};
+                            }
+                        }
+                    }
+                    last unless defined $newRec;
+                    $lastRec = $newRec;
+                    $lastRecPos = length $newData;
+                    $allMandatory = 1;
+                }
+                unless ($addNow) {
+                    # compare current entry with entry next in line to write out
+                    # (write out our tags in numerical order even though
+                    # this isn't required by the IPTC spec)
+                    last if defined $rec and $rec <= $newRec;
+                    $tagInfo = ${$iptcInfo{$newRec}}[0];
+                }
+                my $newTag = $$tagInfo{TagID};
+                my $nvHash = $exifTool->GetNewValueHash($tagInfo);
+                # only add new values if...
+                my ($doSet, @values);
+                my $found = $foundRec{$newRec}->{$newTag} || 0;
+                if ($found & 0x02) {
+                    # ...tag existed before and was deleted (unless we already added it)
+                    $doSet = 1 unless $found & 0x04;
+                } elsif ($$tagInfo{List}) {
+                    # ...tag is List and it existed before or we are creating it
+                    $doSet = 1 if $found or Image::ExifTool::IsCreating($nvHash);
+                } else {
+                    # ...tag didn't exist before and we are creating it
+                    $doSet = 1 if not $found and Image::ExifTool::IsCreating($nvHash);
+                }
+                if ($doSet) {
+                    @values = Image::ExifTool::GetNewValues($nvHash);
+                    @values and $foundRec{$newRec}->{$newTag} = $found | 0x04;
+                    # write tags for each value in list
+                    my $value;
+                    foreach $value (@values) {
+                        $exifTool->VerboseValue("+ IPTC:$$tagInfo{Name}", $value);
+                        # reset allMandatory flag if a non-mandatory tag is written
+                        if ($allMandatory) {
+                            my $mandatory = $mandatory{$newRec};
+                            $allMandatory = 0 unless $mandatory and $mandatory->{$newTag};
+                        }
+                        # apply necessary format conversions
+                        FormatIPTC($exifTool, $tagInfo, \$value, \$xlat, $newRec);
+                        # (note: IPTC string values are NOT null terminated)
+                        $len = length $value;
+                        # generate our new entry
+                        my $entry = pack("CCC", 0x1c, $newRec, $newTag);
+                        if ($len <= 0x7fff) {
+                            $entry .= pack("n", $len);
+                        } else {
+                            # extended dataset tag
+                            $entry .= pack("nN", 0x8004, $len);
+                        }
+                        $newData .= $entry . $value;    # add entry to new IPTC data
+                        ++$exifTool->{CHANGED};
+                    }
+                }
+                # continue on with regular programming if done adding tag now
+                if ($addNow) {
+                    undef $addNow;
+                    next if $writeRec;
+                    last;
+                }
+                # remove this tagID from the sorted write list
+                shift @{$iptcInfo{$newRec}};
+                shift @recordList unless @{$iptcInfo{$newRec}};
+            }
+            if ($writeRec) {
+                # all done if no more records to write
+                last unless defined $rec;
+                # update last record variables
+                $lastRec = $rec;
+                $lastRecPos = length $newData;
+                $allMandatory = 1;
+            }
+        }
+        # set flag indicating we found this tag
+        $foundRec{$rec}->{$tag} = ($foundRec{$rec}->{$tag} || 0) || 0x01;
+        # write out this record unless we are setting it with a new value
+        $tagInfo = $set{$rec}->{$tag};
+        if ($tagInfo) {
+            my $nvHash = $exifTool->GetNewValueHash($tagInfo);
+            $len = $pos - $valuePtr;
+            my $val = substr($$dataPt, $valuePtr, $len);
+            my $oldXlat = $xlat;
+            FormatIPTC($exifTool, $tagInfo, \$val, \$xlat, $rec, 1);
+            if (Image::ExifTool::IsOverwriting($nvHash, $val)) {
+                $xlat = $oldXlat;   # don't change translation (not writing this value)
+                $exifTool->VerboseValue("- IPTC:$$tagInfo{Name}", $val);
+                ++$exifTool->{CHANGED};
+                # set deleted flag to indicate we found and deleted this tag
+                $foundRec{$rec}->{$tag} |= 0x02;
+                # increment allMandatory flag to indicate a tag was removed
+                $allMandatory and ++$allMandatory;
+                # write this tag now if overwriting an existing value
+                if ($$nvHash{Value} and @{$$nvHash{Value}} and @recordList and
+                    $recordList[0] == $rec and not $foundRec{$rec}->{$tag} & 0x04)
+                {
+                    $addNow = $tagInfo;
+                }
+                next;
+            }
+        } elsif ($rec == 1 and $tag == 90) {
+            # handle CodedCharacterSet tag
+            my $val = substr($$dataPt, $valuePtr, $pos - $valuePtr);
+            $xlat = HandleCodedCharset($exifTool, $val);
+        }
+        # reset allMandatory flag if a non-mandatory tag is written
+        if ($allMandatory) {
+            my $mandatory = $mandatory{$rec};
+            unless ($mandatory and $mandatory->{$tag}) {
+                $allMandatory = 0;
+            }
+        }
+        # write out the record
+        $newData .= substr($$dataPt, $tail, $pos-$tail);
+    }
+    # make sure the rest of the data is zero
+    if ($tail < $dirEnd) {
+        my $trailer = substr($$dataPt, $tail, $dirEnd-$tail);
+        if ($trailer =~ /[^\0]/) {
+            return undef if $exifTool->Warn('Unrecognized data in IPTC trailer', 1);
+        }
+    }
+    return $newData;
+}
+
+#------------------------------------------------------------------------------
+# Write IPTC data record and calculate NewIPTCDigest
+# Inputs: 0) ExifTool object ref, 1) source dirInfo ref, 2) tag table ref
+# Returns: IPTC data block (may be empty if no IPTC data)
+# Notes: Increments ExifTool CHANGED flag for each tag changed
+sub WriteIPTC($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    $exifTool or return 1;    # allow dummy access to autoload this package
+
+    my $newData = DoWriteIPTC($exifTool, $dirInfo, $tagTablePtr);
+
+    # calculate standard IPTC digests only if we are writing or deleting
+    # Photoshop:IPTCDigest with a value of 'new' or 'old'
+    while ($Image::ExifTool::Photoshop::iptcDigestInfo) {
+        my $nvHash = $exifTool->{NEW_VALUE}{$Image::ExifTool::Photoshop::iptcDigestInfo};
+        last unless defined $nvHash;
+        last unless IsStandardIPTC($exifTool->MetadataPath());
+        my @values = Image::ExifTool::GetNewValues($nvHash);
+        push @values, @{$$nvHash{DelValue}} if $$nvHash{DelValue};
+        my $new = grep /^new$/, @values;
+        my $old = grep /^old$/, @values;
+        last unless $new or $old;
+        unless (eval 'require Digest::MD5') {
+            $exifTool->Warn('Digest::MD5 must be installed to calculate IPTC digest');
+            last;
+        }
+        my $dataPt;
+        if ($new) {
+            if (defined $newData) {
+                $dataPt = \$newData;
+            } else {
+                $dataPt = $$dirInfo{DataPt};
+                if ($$dirInfo{DirStart} or length($$dataPt) != $$dirInfo{DirLen}) {
+                    my $buff = substr($$dataPt, $$dirInfo{DirStart}, $$dirInfo{DirLen});
+                    $dataPt = \$buff;
+                }
+            }
+            # set NewIPTCDigest data member unless IPTC is being deleted
+            $$exifTool{NewIPTCDigest} = Digest::MD5::md5($$dataPt) if length $$dataPt;
+        }
+        if ($old) {
+            if ($new and not defined $newData) {
+                $$exifTool{OldIPTCDigest} = $$exifTool{NewIPTCDigest};
+            } elsif ($$dirInfo{DataPt}) { #(may be undef if creating new IPTC)
+                $dataPt = $$dirInfo{DataPt};
+                if ($$dirInfo{DirStart} or length($$dataPt) != $$dirInfo{DirLen}) {
+                    my $buff = substr($$dataPt, $$dirInfo{DirStart}, $$dirInfo{DirLen});
+                    $dataPt = \$buff;
+                }
+                $$exifTool{OldIPTCDigest} = Digest::MD5::md5($$dataPt) if length $$dataPt;
+            }
+        }
+        last;
+    }
+    return $newData;
+}
+
+
+1; # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::WriteIPTC.pl - Write IPTC meta information
+
+=head1 SYNOPSIS
+
+This file is autoloaded by Image::ExifTool::IPTC.
+
+=head1 DESCRIPTION
+
+This file contains routines to write IPTC metadata, plus a few other
+seldom-used routines.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::IPTC(3pm)|Image::ExifTool::IPTC>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/WritePDF.pl
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/WritePDF.pl	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/WritePDF.pl	(revision 24799)
@@ -0,0 +1,758 @@
+#------------------------------------------------------------------------------
+# File:         WritePDF.pl
+#
+# Description:  Write PDF meta information
+#
+# Revisions:    12/08/2007 - P. Harvey Created
+#
+# References:   1) http://partners.adobe.com/public/developer/pdf/index_reference.html
+#
+# Notes:        The special "PDF-update" group can be deleted to revert exiftool updates
+#------------------------------------------------------------------------------
+package Image::ExifTool::PDF;
+
+use strict;
+use vars qw($lastFetched);
+
+sub WriteObject($$);
+sub EncodeString($);
+sub CryptObject($);
+
+# comments to mark beginning and end of ExifTool incremental update
+my $beginComment = '%BeginExifToolUpdate';
+my $endComment   = '%EndExifToolUpdate ';
+
+my $keyExt;     # crypt key extension
+my $pdfVer;     # version of PDF file we are currently writing
+
+# internal tags used in dictionary objects
+my %myDictTags = (
+    _tags => 1, _stream => 1, _decrypted => 1, _needCrypt => 1,
+    _filtered => 1, _entry_size => 1, _table => 1,
+);
+
+#------------------------------------------------------------------------------
+# Validate raw PDF values for writing (string date integer real boolean name)
+# Inputs: 0) ExifTool object ref, 1) tagInfo hash ref, 2) raw value ref
+# Returns: error string or undef (and possibly changes value) on success
+sub CheckPDF($$$)
+{
+    my ($exifTool, $tagInfo, $valPtr) = @_;
+    my $format = $$tagInfo{Writable} || $tagInfo->{Table}->{WRITABLE};
+    if (not $format) {
+        return 'No writable format';
+    } elsif ($format eq 'string') {
+        # convert to Unicode if necessary
+        if ($$valPtr =~ /[\x80-\xff]/) {
+            $$valPtr = "\xfe\xff" . $exifTool->Encode($$valPtr,'UCS2','MM');
+        }
+    } elsif ($format eq 'date') {
+        # be flexible about this for now
+        return 'Bad date format' unless $$valPtr =~ /^\d{4}/;
+    } elsif ($format eq 'integer') {
+        return 'Not an integer' unless Image::ExifTool::IsInt($$valPtr);
+    } elsif ($format eq 'real') {
+        return 'Not a real number' unless $$valPtr =~ /^[+-]?(?=\d|\.\d)\d*(\.\d*)?$/;
+    } elsif ($format eq 'boolean') {
+        $$valPtr = ($$valPtr and $$valPtr !~ /^f/i) ? 'true' : 'false';
+    } elsif ($format eq 'name') {
+        return 'Invalid PDF name' if $$valPtr =~ /\0/;
+    } else {
+        return "Invalid PDF format '$format'";
+    }
+    return undef;   # value is OK
+}
+
+#------------------------------------------------------------------------------
+# Format value for writing to PDF file
+# Inputs: 0) value, 1) format string (string,date,integer,real,boolean,name)
+# Returns: formatted value or undef on error
+# Notes: Called at write time, so $pdfVer may be checked
+sub WritePDFValue($$)
+{
+    my ($val, $format) = @_;
+    if (not $format) {
+        return undef;
+    } elsif ($format eq 'string') {
+        EncodeString(\$val);
+    } elsif ($format eq 'date') {
+        # convert date to "D:YYYYmmddHHMMSS+-HH'MM'" format
+        $val =~ s/([-+]\d{2}):(\d{2})/$1'$2'/;  # change timezone delimiters if necessary
+        $val =~ tr/ ://d;                       # remove spaces and colons
+        $val =  "D:$val";                       # add leading "D:"
+        EncodeString(\$val);
+    } elsif ($format =~ /^(integer|real|boolean)$/) {
+        # no reformatting necessary
+    } elsif ($format eq 'name') {
+        return undef if $val =~ /\0/;
+        if ($pdfVer >= 1.2) {
+            $val =~ s/([\t\n\f\r ()<>[\]{}\/%#])/sprintf('#%.2x',ord $1)/sge;
+        } else {
+            return undef if $val =~ /[\t\n\f\r ()<>[\]{}\/%]/;
+        }
+        $val = "/$val"; # add leading '/'
+    } else {
+        return undef;
+    }
+    return $val;
+}
+
+#------------------------------------------------------------------------------
+# Encode PDF string
+# Inputs: 0) reference to PDF string
+# Returns: (updates string with encoded data)
+sub EncodeString($)
+{
+    my $strPt = shift;
+    if (ref $$strPt eq 'ARRAY') {
+        my $str;
+        foreach $str (@{$$strPt}) {
+            EncodeString(\$str);
+        }
+        return;
+    }
+    Crypt($strPt, $keyExt, 1);  # encrypt if necessary
+    # encode as hex if we have any control characters (except tab)
+    if ($$strPt=~/[\x00-\x08\x0a-\x1f\x7f\xff]/) {
+        # encode as hex
+        my $str='';
+        my $len = length $$strPt;
+        my $i = 0;
+        for (;;) {
+            my $n = $len - $i or last;
+            $n = 40 if $n > 40; # break into reasonable-length lines
+            $str .= $/ if $i;
+            $str .= unpack('H*', substr($$strPt, $i, $n));
+            $i += $n;
+        }
+        $$strPt = "<$str>";
+    } else {
+        $$strPt =~ s/([()\\])/\\$1/g;   # must escape round brackets and backslashes
+        $$strPt = "($$strPt)";
+    }
+}
+
+#------------------------------------------------------------------------------
+# Encrypt an object
+# Inputs: 0) PDF object (encrypts in place)
+# Notes: Encrypts according to "_needCrypt" dictionary entry,
+#        then deletes "_needCrypt" when done
+sub CryptObject($)
+{
+    my $obj = $_[0];
+    if (not ref $obj) {
+        # only literal strings and hex strings are encrypted
+        if ($obj =~ /^[(<]/) {
+            undef $lastFetched; # (reset this just in case)
+            my $val = ReadPDFValue($obj);
+            EncodeString(\$val);
+            $_[0] = $val;
+        }
+    } elsif (ref $obj eq 'HASH') {
+        my $tag;
+        my $needCrypt = $$obj{_needCrypt};
+        foreach $tag (keys %$obj) {
+            next if $myDictTags{$tag};
+            # re-encrypt necessary objects only (others are still encrypted)
+            # (this is really annoying, but is necessary because objects stored
+            # in encrypted streams are decrypted when extracting, but strings stored
+            # as direct objects are decrypted later since they must be decoded
+            # before being decrypted)
+            if ($needCrypt) {
+                next unless defined $$needCrypt{$tag} ? $$needCrypt{$tag} : $$needCrypt{'*'};
+            }
+            CryptObject($$obj{$tag});
+        }
+        delete $$obj{_needCrypt};   # avoid re-re-crypting
+    } elsif (ref $obj eq 'ARRAY') {
+        my $val;
+        foreach $val (@$obj) {
+            CryptObject($val);
+        }
+    }
+}
+
+#------------------------------------------------------------------------------
+# Get free entries from xref stream dictionary that we wrote previously
+# Inputs: 0) xref dictionary reference
+# Returns: free entry hash (keys are object numbers, values are xref entry list refs)
+sub GetFreeEntries($)
+{
+    my $dict = shift;
+    my %xrefFree;
+    # from the start we have only written xref stream entries in 'CNn' format,
+    # so we can simplify things for now and only support this type of entry
+    my $w = $$dict{W};
+    if (ref $w eq 'ARRAY' and "@$w" eq '1 4 2') {
+        my $size = $$dict{_entry_size}; # this will be 7 for 'CNn'
+        my $index = $$dict{Index};
+        my $len = length $$dict{_stream};
+        # scan the table for free objects
+        my $num = scalar(@$index) / 2;
+        my $pos = 0;
+        my ($i, $j);
+        for ($i=0; $i<$num; ++$i) {
+            my $start = $$index[$i*2];
+            my $count = $$index[$i*2+1];
+            for ($j=0; $j<$count; ++$j) {
+                last if $pos + $size > $len;
+                my @t = unpack("x$pos CNn", $$dict{_stream});
+                # add entry if object was free
+                $xrefFree{$start+$j} = [ $t[1], $t[2], 'f' ] if $t[0] == 0;
+                $pos += $size;  # step to next entry
+            }
+        }
+    }
+    return \%xrefFree;
+}
+
+#------------------------------------------------------------------------------
+# Write PDF object
+# Inputs: 0) output file or scalar ref, 1) PDF object
+# Returns: true on success
+# Notes: inserts white space before object, but none afterward
+sub WriteObject($$)
+{
+    my ($outfile, $obj) = @_;
+    if (ref $obj eq 'SCALAR') {
+        Write($outfile, ' ', $$obj) or return 0;
+    } elsif (ref $obj eq 'ARRAY') {
+        # write array
+        Write($outfile, @$obj > 10 ? $/ : ' ', '[') or return 0;
+        my $item;
+        foreach $item (@$obj) {
+            WriteObject($outfile, $item) or return 0;
+        }
+        Write($outfile, ' ]') or return 0;
+    } elsif (ref $obj eq 'HASH') {
+        # write dictionary
+        my $tag;
+        Write($outfile, $/, '<<') or return 0;
+        # prepare object as required if it has a stream
+        if ($$obj{_stream}) {
+            # encrypt stream if necessary (must be done before determining Length)
+            CryptStream($obj, $keyExt) if $$obj{_decrypted};
+            # write "Length" entry in dictionary
+            $$obj{Length} = length $$obj{_stream};
+            push @{$$obj{_tags}}, 'Length';
+            # delete Filter-related entries since we don't yet write filtered streams
+            delete $$obj{Filter};
+            delete $$obj{DecodeParms};
+            delete $$obj{DL};
+        }
+        # don't write my internal entries
+        my %wrote = %myDictTags;
+        # write tags in original order, adding new ones later alphabetically
+        foreach $tag (@{$$obj{_tags}}, sort keys %$obj) {
+            # ignore already-written or missing entries
+            next if $wrote{$tag} or not defined $$obj{$tag};
+            Write($outfile, $/, "/$tag") or return 0;
+            WriteObject($outfile, $$obj{$tag}) or return 0;
+            $wrote{$tag} = 1;
+        }
+        Write($outfile, $/, '>>') or return 0;
+        if ($$obj{_stream}) {
+            # write object stream
+            # (a single 0x0d may not follow 'stream', so use 0x0d+0x0a here to be sure)
+            Write($outfile, $/, "stream\x0d\x0a") or return 0;
+            Write($outfile, $$obj{_stream}, $/, 'endstream') or return 0;
+        }
+    } else {
+        # write string, number, name or object reference
+        Write($outfile, ' ', $obj);
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Write PDF File
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 on success, 0 if not valid PDF file, -1 on write error
+# Notes: dictionary structure:  Main --+--> Info
+#                                      +--> Root --> Metadata
+sub WritePDF($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my $outfile = $$dirInfo{OutFile};
+    my ($buff, %capture, %newXRef, %newObj, $objRef);
+    my ($out, $id, $gen, $obj);
+
+    # make sure this is a PDF file
+    my $pos = $raf->Tell();
+    $raf->Read($buff, 10) >= 8 or return 0;
+    $buff =~ /^%PDF-(\d+\.\d+)/ or return 0;
+    $raf->Seek($pos, 0);
+
+    # create a new ExifTool object and use it to read PDF and XMP information
+    my $newTool = new Image::ExifTool;
+    $newTool->Options(List => 1);
+    $newTool->Options(Password => $exifTool->Options('Password'));
+    $$newTool{PDF_CAPTURE} = \%capture;
+    my $info = $newTool->ImageInfo($raf, 'XMP', 'PDF:*', 'Error', 'Warning');
+    # not a valid PDF file unless we got a version number
+    # (note: can't just check $$info{PDFVersion} due to possibility of XMP-pdf:PDFVersion)
+    my $vers = $newTool->GetInfo('PDF:PDFVersion');
+    ($pdfVer) = values %$vers;
+    $pdfVer or $exifTool->Error('Missing PDF:PDFVersion'), return 0;
+    # check version number
+    if ($pdfVer > 1.7) {
+        if ($pdfVer >= 2.0) {
+            $exifTool->Error("Can't yet write PDF version $pdfVer"); # (future major version changes)
+            return 1;
+        }
+        $exifTool->Warn("ExifTool is untested with PDF version $pdfVer files", 1);
+    }
+    # fail if we had any serious errors while extracting information
+    if ($capture{Error} or $$info{Error}) {
+        $exifTool->Error($capture{Error} || $$info{Error});
+        return 1;
+    }
+    # make sure we have everything we need to rewrite this file
+    foreach $obj (qw(Main Root xref)) {
+        next if $capture{$obj};
+        # any warning we received may give a clue about why this object is missing
+        $exifTool->Error($$info{Warning}) if $$info{Warning};
+        $exifTool->Error("Can't find $obj object");
+        return 1;
+    }
+
+    # copy file up to start of previous exiftool update or end of file
+    # (comment, startxref & EOF with 11-digit offsets and 2-byte newlines is 63 bytes)
+    $raf->Seek(-64,2) and $raf->Read($buff,64) and $raf->Seek(0,0) or return -1;
+    my $rtn = 1;
+    my $prevUpdate;
+    # (now $endComment is before "startxref", but pre-7.41 we wrote it after the EOF)
+    if ($buff =~ /$endComment(\d+)\s+(startxref\s+\d+\s+%%EOF\s+)?$/s) {
+        $prevUpdate = $1;
+        # rewrite the file up to the original EOF
+        Image::ExifTool::CopyBlock($raf, $outfile, $prevUpdate) or $rtn = -1;
+        # verify that we are now at the start of an ExifTool update
+        unless ($raf->Read($buff, length $beginComment) and $buff eq $beginComment) {
+            $exifTool->Error('Previous ExifTool update is corrupted');
+            return $rtn;
+        }
+        $raf->Seek($prevUpdate, 0) or $rtn = -1;
+        if ($exifTool->{DEL_GROUP}->{'PDF-update'}) {
+            $exifTool->VPrint(0, "  Reverted previous ExifTool updates\n");
+            ++$$exifTool{CHANGED};
+            return $rtn;
+        }
+    } elsif ($exifTool->{DEL_GROUP}->{'PDF-update'}) {
+        $exifTool->Error('File contains no previous ExifTool update');
+        return $rtn;
+    } else {
+        # rewrite the whole file
+        while ($raf->Read($buff, 65536)) {
+            Write($outfile, $buff) or $rtn = -1;
+        }
+    }
+    $out = $exifTool->Options('TextOut') if $exifTool->Options('Verbose');
+#
+# create our new PDF objects to write
+#
+    my $xref = $capture{xref};
+    my $mainDict = $capture{Main};
+    my $metaRef = $capture{Root}->{Metadata};
+    my $nextObject;
+
+    # start by finding reference for info object in case it was deleted
+    # in a previous edit so we can re-use it here if adding PDF Info
+    my $prevInfoRef;
+    if ($prevUpdate) {
+        unless ($capture{Prev}) {
+            $exifTool->Error("Can't locate trailer dictionary prior to last edit");
+            return $rtn;
+        }
+        $prevInfoRef = $capture{Prev}->{Info};
+        # start from previous size so the xref table doesn't continue
+        # to grow if we repeatedly add and delete the Metadata object
+        $nextObject = $capture{Prev}->{Size};
+        # don't re-use Meta reference if object was added in a previous update
+        undef $metaRef if $metaRef and $$metaRef=~/^(\d+)/ and $1 >= $nextObject;
+    } else {
+        $prevInfoRef = $$mainDict{Info};
+        $nextObject = $$mainDict{Size};
+    }
+
+    # delete entire PDF group if specified
+    my $infoChanged = 0;
+    if ($exifTool->{DEL_GROUP}->{PDF} and $capture{Info}) {
+        delete $capture{Info};
+        $info = { XMP => $$info{XMP} }; # remove extracted PDF tags
+        print $out "  Deleting PDF Info dictionary\n" if $out;
+        ++$infoChanged;
+    }
+
+    # create new Info dictionary if necessary
+    $capture{Info} = { _tags => [ ] } unless $capture{Info};
+    my $infoDict = $capture{Info};
+
+    # must pre-determine Info reference to be used in encryption
+    my $infoRef = $prevInfoRef || \ "$nextObject 0 R";
+    $keyExt = $$infoRef;
+
+    # must encrypt all values in dictionary if they came from an encrypted stream
+    CryptObject($infoDict) if $$infoDict{_needCrypt};
+    
+    # must set line separator before calling WritePDFValue()
+    local $/ = $capture{newline};
+
+    # rewrite PDF Info tags
+    my $newTags = $exifTool->GetNewTagInfoHash(\%Image::ExifTool::PDF::Info);
+    my $tagID;
+    foreach $tagID (sort keys %$newTags) {
+        my $tagInfo = $$newTags{$tagID};
+        my $nvHash = $exifTool->GetNewValueHash($tagInfo);
+        my (@vals, $deleted);
+        my $tag = $$tagInfo{Name};
+        my $val = $$info{$tag};
+        my $tagKey = $tag;
+        unless (defined $val) {
+            # must check for tag key with copy number
+            ($tagKey) = grep /^$tag/, keys %$info;
+            $val = $$info{$tagKey} if $tagKey;
+        }
+        if (defined $val) {
+            my @oldVals;
+            if (ref $val eq 'ARRAY') {
+                @oldVals = @$val;
+                $val = shift @oldVals;
+            }
+            for (;;) {
+                if (Image::ExifTool::IsOverwriting($nvHash, $val) > 0) {
+                    $deleted = 1;
+                    $exifTool->VerboseValue("- PDF:$tag", $val);
+                    ++$infoChanged;
+                } else {
+                    push @vals, $val;
+                }
+                last unless @oldVals;
+                $val = shift @oldVals;
+            }
+            # don't write this out if we deleted all values
+            delete $$infoDict{$tagID} unless @vals;
+        }
+        # decide whether we want to write this tag
+        # (always create native PDF information, so don't check IsCreating())
+        next unless $deleted or $$tagInfo{List} or not exists $$infoDict{$tagID};
+
+        # add new values to existing ones
+        my @newVals = Image::ExifTool::GetNewValues($nvHash);
+        if (@newVals) {
+            push @vals, @newVals;
+            ++$infoChanged;
+            if ($out) {
+                foreach $val (@newVals) {
+                    $exifTool->VerboseValue("+ PDF:$tag", $val);
+                }
+            }
+        }
+        unless (@vals) {
+            # remove this entry from the Info dictionary if no values remain
+            delete $$infoDict{$tagID};
+            next;
+        }
+        # format value(s) for writing to PDF file
+        my $writable = $$tagInfo{Writable} || $Image::ExifTool::PDF::Info{WRITABLE};
+        if (not $$tagInfo{List}) {
+            $val = WritePDFValue(shift @vals, $writable);
+        } elsif ($$tagInfo{List} eq 'array') {
+            foreach $val (@vals) {
+                $val = WritePDFValue($val, $writable);
+                defined $val or undef(@vals), last;
+            }
+            $val = @vals ? \@vals : undef;
+        } else {
+            $val = WritePDFValue(join($exifTool->Options('ListSep'), @vals), $writable);
+        }
+        if (defined $val) {
+            $$infoDict{$tagID} = $val;
+            ++$infoChanged;
+        } else {
+            $exifTool->Warn("Error converting $$tagInfo{Name} value");
+        }
+    }
+    if ($infoChanged) {
+        $$exifTool{CHANGED} += $infoChanged;
+    } elsif ($prevUpdate) {
+        # must still write Info dictionary if it was previously updated
+        my $oldPos = LocateObject($xref, $$infoRef);
+        $infoChanged = 1 if $oldPos and $oldPos > $prevUpdate;
+    }
+
+    # create new Info dictionary if necessary
+    if ($infoChanged) {
+        # increment object count if we used a new object here
+        if (scalar(keys %{$capture{Info}}) > 1) {
+            $newObj{$$infoRef} = $capture{Info};# save to write later
+            $$mainDict{Info} = $infoRef;        # add reference to trailer dictionary
+            ++$nextObject unless $prevInfoRef;
+        } else {
+            # remove Info from Main (trailer) dictionary
+            delete $$mainDict{Info};
+            # write free entry in xref table if Info existed prior to all edits
+            $newObj{$$infoRef} = '' if $prevInfoRef;
+        }
+    }
+
+    # rewrite XMP
+    my %xmpInfo = (
+        DataPt => $$info{XMP},
+        Parent => 'PDF',
+    );
+    my $xmpTable = Image::ExifTool::GetTagTable('Image::ExifTool::XMP::Main');
+    my $oldChanged = $$exifTool{CHANGED};
+    my $newXMP = $exifTool->WriteDirectory(\%xmpInfo, $xmpTable);
+    $newXMP = $$info{XMP} ? ${$$info{XMP}} : '' unless defined $newXMP;
+
+    # WriteDirectory() will increment CHANGED erroneously if non-existent
+    # XMP is deleted as a block -- so check for this
+    unless ($newXMP or $$info{XMP}) {
+        $$exifTool{CHANGED} = $oldChanged;
+        $exifTool->VPrint(0, "  (XMP not changed -- still empty)\n");
+    }
+    my ($metaChanged, $rootChanged);
+
+    if ($$exifTool{CHANGED} != $oldChanged and defined $newXMP) {
+        $metaChanged = 1;
+    } elsif ($prevUpdate and $capture{Root}->{Metadata}) {
+        # must still write Metadata dictionary if it was previously updated
+        my $oldPos = LocateObject($xref, ${$capture{Root}->{Metadata}});
+        $metaChanged = 1 if $oldPos and $oldPos > $prevUpdate;
+    }
+    if ($metaChanged) {
+        if ($newXMP) {
+            unless ($metaRef) {
+                # allocate new PDF object
+                $metaRef = \ "$nextObject 0 R";
+                ++$nextObject;
+                $capture{Root}->{Metadata} = $metaRef;
+                $rootChanged = 1;   # set flag to replace Root dictionary
+            }
+            # create the new metadata dictionary to write later
+            $newObj{$$metaRef} = {
+                Type       => '/Metadata',
+                Subtype    => '/XML',
+              # Length     => length $newXMP, (set by WriteObject)
+                _tags      => [ qw(Type Subtype) ],
+                _stream    => $newXMP,
+                _decrypted => 1, # (this will be ignored if EncryptMetadata is false)
+            };
+        } elsif ($capture{Root}->{Metadata}) {
+            # free existing metadata object
+            $newObj{${$capture{Root}->{Metadata}}} = '';
+            delete $capture{Root}->{Metadata};
+            $rootChanged = 1;   # set flag to replace Root dictionary
+        }
+    }
+    # add new Root dictionary if necessary
+    my $rootRef = $$mainDict{Root};
+    unless ($rootRef) {
+        $exifTool->Error("Can't find Root dictionary");
+        return $rtn;
+    }
+    if (not $rootChanged and $prevUpdate) {
+        # must still write Root dictionary if it was previously updated
+        my $oldPos = LocateObject($xref, $$rootRef);
+        $rootChanged = 1 if $oldPos and $oldPos > $prevUpdate;
+    }
+    $newObj{$$rootRef} = $capture{Root} if $rootChanged;
+#
+# write incremental update if anything was changed
+#
+    if ($$exifTool{CHANGED}) {
+        # remember position of original EOF
+        my $oldEOF = Tell($outfile);
+        Write($outfile, $beginComment) or $rtn = -1;
+
+        # write new objects
+        foreach $objRef (sort keys %newObj) {
+            $objRef =~ /^(\d+) (\d+)/ or $rtn = -1, last;
+            ($id, $gen) = ($1, $2);
+            if (not $newObj{$objRef}) {
+                ++$gen if $gen < 65535;
+                # write free entry in xref table
+                $newXRef{$id} = [ 0, $gen, 'f' ];
+                next;
+            }
+            # create new entry for xref table
+            $newXRef{$id} = [ Tell($outfile) + length($/), $gen, 'n' ];
+            $keyExt = "$id $gen obj";  # (must set for stream encryption)
+            Write($outfile, $/, $keyExt) or $rtn = -1;
+            WriteObject($outfile, $newObj{$objRef}) or $rtn = -1;
+            Write($outfile, $/, 'endobj') or $rtn = -1;
+        }
+
+        # Prev points to old xref table
+        $$mainDict{Prev} = $capture{startxref} unless $prevUpdate;
+
+        # add xref entry for head of free-object list
+        $newXRef{0} = [ 0, 65535, 'f' ];
+
+        # must insert free xref entries from previous exiftool update if applicable
+        if ($prevUpdate) {
+            my $mainFree;
+            # extract free entries from our previous Main xref stream
+            if ($$mainDict{Type} and $$mainDict{Type} eq '/XRef') {
+                $mainFree = GetFreeEntries($xref->{dicts}->[0]);
+            } else {
+                # free entries from Main xref table already captured for us
+                $mainFree = $capture{mainFree};
+            }
+            foreach $id (sort { $a <=> $b } keys %$mainFree) {
+                $newXRef{$id} = $$mainFree{$id} unless $newXRef{$id};
+            }
+        }
+
+        # connect linked list of free object in our xref table
+        my $prevFree = 0;
+        foreach $id (sort { $b <=> $a } keys %newXRef) { # (reverse sort)
+            next unless $newXRef{$id}->[2] eq 'f';  # skip if not free
+            # no need to add free entry for objects added by us
+            # in previous edits then freed again
+            if ($id >= $nextObject) {
+                delete $newXRef{$id};   # Note: deleting newXRef entry!
+                next;
+            }
+            $newXRef{$id}->[0] = $prevFree;
+            $prevFree = $id;
+        }
+
+        # prepare our main dictionary for writing
+        $$mainDict{Size} = $nextObject;    # update number of objects
+        # must change the ID if it exists
+        if (ref $$mainDict{ID} eq 'ARRAY' and @{$$mainDict{ID}} > 1) {
+            # increment first byte since this is an easy change to make
+            $id = $mainDict->{ID}->[1];
+            if ($id =~ /^<([0-9a-f]{2})/i) {
+                my $byte = unpack('H2',chr((hex($1) + 1) & 0xff));
+                substr($id, 1, 2) = $byte;
+            } elsif ($id =~ /^\((.)/s) {
+                substr($id, 1, 1) = chr((ord($1) + 1) & 0xff);
+            }
+            $mainDict->{ID}->[1] = $id;
+        }
+
+        # remember position of xref table in file (we will write this next)
+        my $startxref = Tell($outfile) + length($/);
+
+        # must write xref as a stream in xref-stream-only files
+        if ($$mainDict{Type} and $$mainDict{Type} eq '/XRef') {
+
+            # create entry for the xref stream object itself
+            $newXRef{$nextObject++} = [ Tell($outfile) + length($/), 0, 'n' ];
+            $$mainDict{Size} = $nextObject;
+            # create xref stream and Index entry
+            $$mainDict{W} = [ 1, 4, 2 ];    # int8u, int32u, int16u ('CNn')
+            $$mainDict{Index} = [ ];
+            $$mainDict{_stream} = '';
+            my @ids = sort { $a <=> $b } keys %newXRef;
+            while (@ids) {
+                my $startID = $ids[0];
+                for (;;) {
+                    $id = shift @ids;
+                    my ($pos, $gen, $type) = @{$newXRef{$id}};
+                    if ($pos > 0xffffffff) {
+                        $exifTool->Error('Huge files not yet supported');
+                        last;
+                    }
+                    $$mainDict{_stream} .= pack('CNn', $type eq 'f' ? 0 : 1, $pos, $gen);
+                    last if not @ids or $ids[0] != $id + 1;
+                }
+                # add Index entries for this section of the xref stream
+                push @{$$mainDict{Index}}, $startID, $id - $startID + 1;
+            }
+            # write the xref stream object
+            $keyExt = "$id 0 obj";  # (set anyway, but xref stream should NOT be encrypted)
+            Write($outfile, $/, $keyExt) or $rtn = -1;
+            WriteObject($outfile, $mainDict) or $rtn = -1;
+            Write($outfile, $/, 'endobj') or $rtn = -1;
+
+        } else {
+
+            # write new xref table
+            Write($outfile, $/, 'xref', $/) or $rtn = -1;
+            # lines must be exactly 20 bytes, so pad newline if necessary
+            my $endl = (length($/) == 1 ? ' ' : '') . $/;
+            my @ids = sort { $a <=> $b } keys %newXRef;
+            while (@ids) {
+                my $startID = $ids[0];
+                $buff = '';
+                for (;;) {
+                    $id = shift @ids;
+                    $buff .= sprintf("%.10d %.5d %s%s", @{$newXRef{$id}}, $endl);
+                    last if not @ids or $ids[0] != $id + 1;
+                }
+                # write this (contiguous-numbered object) section of the xref table
+                Write($outfile, $startID, ' ', $id - $startID + 1, $/, $buff) or $rtn = -1;
+            }
+
+            # write main (trailer) dictionary
+            Write($outfile, 'trailer') or $rtn = -1;
+            WriteObject($outfile, $mainDict) or $rtn = -1;
+        }
+        # write trailing comment (marker to allow edits to be reverted)
+        Write($outfile, $/, $endComment, $oldEOF, $/) or $rtn = -1;
+
+        # write pointer to main xref table and EOF marker
+        Write($outfile, 'startxref', $/, $startxref, $/, '%%EOF', $/) or $rtn = -1;
+
+    } elsif ($prevUpdate) {
+
+        # nothing new changed, so copy over previous incremental update
+        $raf->Seek($prevUpdate, 0) or $rtn = -1;
+        while ($raf->Read($buff, 65536)) {
+            Write($outfile, $buff) or $rtn = -1;
+        }
+    }
+    undef $newTool;
+    undef %capture;
+    return $rtn;
+}
+
+
+1; # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::WritePDF.pl - Write PDF meta information
+
+=head1 SYNOPSIS
+
+These routines are autoloaded by Image::ExifTool::PDF.
+
+=head1 DESCRIPTION
+
+This file contains routines to write PDF metadata.
+
+=head1 NOTES
+
+When writing a PDF, exiftool does not modify the existing data.  Instead,
+the PDF file is appended with an incremental update which can easily be
+removed to revert the file (by using ExifTool to delete the special
+C<PDF-update> pseudo group).
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://partners.adobe.com/public/developer/pdf/index_reference.html>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::PDF(3pm)|Image::ExifTool::PDF>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/WritePNG.pl
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/WritePNG.pl	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/WritePNG.pl	(revision 24799)
@@ -0,0 +1,328 @@
+#------------------------------------------------------------------------------
+# File:         WritePNG.pl
+#
+# Description:  Write PNG meta information
+#
+# Revisions:    09/16/2005 - P. Harvey Created
+#
+# References:   1) http://www.libpng.org/pub/png/spec/1.2/
+#------------------------------------------------------------------------------
+package Image::ExifTool::PNG;
+
+use strict;
+
+#------------------------------------------------------------------------------
+# Calculate CRC or update running CRC (ref 1)
+# Inputs: 0) data reference, 1) running crc to update (undef intially)
+#         2) data position (undef for 0), 3) data length (undef for all data),
+# Returns: updated CRC
+my @crcTable;
+sub CalculateCRC($;$$$)
+{
+    my ($dataPt, $crc, $pos, $len) = @_;
+    $crc = 0 unless defined $crc;
+    $pos = 0 unless defined $pos;
+    $len = length($$dataPt) - $pos unless defined $len;
+    $crc ^= 0xffffffff;         # undo 1's complement
+    # build lookup table unless done already
+    unless (@crcTable) {
+        my ($c, $n, $k);
+        for ($n=0; $n<256; ++$n) {
+            for ($k=0, $c=$n; $k<8; ++$k) {
+                $c = ($c & 1) ? 0xedb88320 ^ ($c >> 1) : $c >> 1;
+            }
+            $crcTable[$n] = $c;
+        }
+    }
+    # calculate the CRC
+    foreach (unpack("x${pos}C$len", $$dataPt)) {
+        $crc = $crcTable[($crc^$_) & 0xff] ^ ($crc >> 8);
+    }
+    return $crc ^ 0xffffffff;   # return 1's complement
+}
+
+#------------------------------------------------------------------------------
+# Encode data in ASCII Hex
+# Inputs: 0) input data reference
+# Returns: Hex-encoded data (max 72 chars per line)
+sub HexEncode($)
+{
+    my $dataPt = shift;
+    my $len = length($$dataPt);
+    my $hex = '';
+    my $pos;
+    for ($pos = 0; $pos < $len; $pos += 36) {
+        my $n = $len - $pos;
+        $n > 36 and $n = 36;
+        $hex .= unpack('H*',substr($$dataPt,$pos,$n)) . "\n";
+    }
+    return $hex;
+}
+
+#------------------------------------------------------------------------------
+# Write profile to tEXt or zTXt chunk (zTXt if Zlib is available)
+# Inputs: 0) outfile, 1) Raw profile type, 2) data ref
+#         3) profile header type (undef if not a text profile)
+# Returns: 1 on success
+sub WriteProfile($$$;$)
+{
+    my ($outfile, $rawType, $dataPt, $profile) = @_;
+    my ($buff, $prefix, $chunk, $deflate);
+    if (eval 'require Compress::Zlib') {
+        $deflate = Compress::Zlib::deflateInit();
+    }
+    if (not defined $profile) {
+        # write ICC profile as compressed iCCP chunk if possible
+        return 0 unless $deflate;
+        $buff = $deflate->deflate($$dataPt);
+        return 0 unless defined $buff;
+        $buff .= $deflate->flush();
+        my %rawTypeChunk = ( icm => 'iCCP' );
+        $chunk = $rawTypeChunk{$rawType} or return 0;
+        $prefix = "$rawType\0\0";
+        $dataPt = \$buff;
+    } else {
+        # write as ASCII-hex encoded profile in tEXt or zTXt chunk
+        my $txtHdr = sprintf("\n$profile profile\n%8d\n", length($$dataPt));
+        $buff = $txtHdr . HexEncode($dataPt);
+        $chunk = 'tEXt';         # write as tEXt if deflate not available
+        $prefix = "Raw profile type $rawType\0";
+        $dataPt = \$buff;
+        # write profile as zTXt chunk if possible
+        if ($deflate) {
+            my $buf2 = $deflate->deflate($buff);
+            if (defined $buf2) {
+                $dataPt = \$buf2;
+                $buf2 .= $deflate->flush();
+                $chunk = 'zTXt';
+                $prefix .= "\0";    # compression type byte (0=deflate)
+            }
+        }
+    }
+    my $hdr = pack('Na4', length($prefix) + length($$dataPt), $chunk) . $prefix;
+    my $crc = CalculateCRC(\$hdr, undef, 4);
+    $crc = CalculateCRC($dataPt, $crc);
+    return Write($outfile, $hdr, $$dataPt, pack('N',$crc));
+}
+
+#------------------------------------------------------------------------------
+# Add iCCP to the PNG image if necessary (must come before PLTE and IDAT)
+# Inputs: 0) ExifTool object ref, 1) output file or scalar ref
+# Returns: true on success
+sub Add_iCCP($$)
+{
+    my ($exifTool, $outfile) = @_;
+    if ($exifTool->{ADD_DIRS}->{ICC_Profile}) {
+        # write new ICC data
+        my $tagTablePtr = Image::ExifTool::GetTagTable('Image::ExifTool::ICC_Profile::Main');
+        my %dirInfo = ( Parent => 'PNG', DirName => 'ICC_Profile' );
+        my $buff = $exifTool->WriteDirectory(\%dirInfo, $tagTablePtr);
+        if (defined $buff and length $buff and WriteProfile($outfile, 'icm', \$buff)) {
+            $exifTool->VPrint(0, "Created ICC profile\n");
+            delete $exifTool->{ADD_DIRS}->{ICC_Profile}; # don't add it again
+        }
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Generate tEXt, zTXt or iTXt data for writing
+# Inputs: 0) ExifTool ref, 1) tagID, 2) tagInfo ref, 3) value string, 4) language code
+# Returns: chunk data (not including 8-byte chunk header)
+# Notes: Sets ExifTool TextChunkType member to the type of chunk written
+sub BuildTextChunk($$$$$)
+{
+    my ($exifTool, $tag, $tagInfo, $val, $lang) = @_;
+    my ($xtra, $compVal, $iTXt, $comp);
+    if ($$tagInfo{SubDirectory}) {
+        if ($$tagInfo{Name} eq 'XMP') {
+            $iTXt = 2;      # write as iTXt but flag to avoid encoding
+            # (never compress XMP)
+        } else {
+            $comp = 2;      # compress raw profile if possible
+        }
+    } else {
+        # compress if specified
+        $comp = 1 if $exifTool->Options('Compress');
+        if ($lang) {
+            $iTXt = 1;      # write as iTXt if it has a language code
+            $tag =~ s/-$lang$//;    # remove language code from tagID
+        } elsif ($$exifTool{OPTIONS}{Charset} ne 'Latin' and $val =~  /[\x80-\xff]/) {
+            $iTXt = 1;      # write as iTXt if it contains non-Latin special characters
+        }
+    }
+    if ($comp) {
+        my $warn;
+        if (eval 'require Compress::Zlib') {
+            my $deflate = Compress::Zlib::deflateInit();
+            $compVal = $deflate->deflate($val) if $deflate;
+            if (defined $compVal) {
+                $compVal .= $deflate->flush();
+                # only compress if it actually saves space
+                unless (length($compVal) < length($val)) {
+                    undef $compVal;
+                    $warn = 'uncompressed data is smaller';
+                }
+            } else {
+                $warn = 'deflate error';
+            }
+        } else {
+            $warn = 'Compress::Zlib not available';
+        }
+        # warn if any user-specified compression fails
+        if ($warn and $comp == 1) {
+            $exifTool->Warn("PNG:$$tagInfo{Name} not compressed ($warn)", 1);
+        }
+    }
+    # decide whether to write as iTXt, zTXt or tEXt
+    if ($iTXt) {
+        $$exifTool{TextChunkType} = 'iTXt';
+        $xtra = (defined $compVal ? "\x01\0" : "\0\0") . ($lang || '') . "\0\0";
+        # iTXt is encoded as UTF-8 (but note that XMP is already UTF-8)
+        $val = $exifTool->Encode($val, 'UTF8') if $iTXt == 1;
+    } elsif (defined $compVal) {
+        $$exifTool{TextChunkType} = 'zTXt';
+        $xtra = "\0";
+    } else {
+        $$exifTool{TextChunkType} = 'tEXt';
+        $xtra = '';
+    }
+    return $tag . "\0" . $xtra . (defined $compVal ? $compVal : $val);
+}
+
+#------------------------------------------------------------------------------
+# Add any outstanding new chunks to the PNG image
+# Inputs: 0) ExifTool object ref, 1) output file or scalar ref
+# Returns: true on success
+sub AddChunks($$)
+{
+    my ($exifTool, $outfile) = @_;
+    # write any outstanding PNG tags
+    my $addTags = $exifTool->{ADD_PNG};
+    delete $exifTool->{ADD_PNG};
+    my ($tag, $dir, $err, $tagTablePtr);
+
+    foreach $tag (sort keys %$addTags) {
+        my $tagInfo = $$addTags{$tag};
+        my $nvHash = $exifTool->GetNewValueHash($tagInfo);
+        # (always create native PNG information, so don't check IsCreating())
+        next unless Image::ExifTool::IsOverwriting($nvHash) > 0;
+        my $val = Image::ExifTool::GetNewValues($nvHash);
+        if (defined $val) {
+            my $data;
+            if ($$tagInfo{Table} eq \%Image::ExifTool::PNG::TextualData) {
+                $data = BuildTextChunk($exifTool, $tag, $tagInfo, $val, $$tagInfo{LangCode});
+                $data = $$exifTool{TextChunkType} . $data;
+                delete $$exifTool{TextChunkType};
+            } else {
+                $data = "$tag$val";
+            }
+            my $hdr = pack('N', length($data) - 4);
+            my $cbuf = pack('N', CalculateCRC(\$data, undef));
+            Write($outfile, $hdr, $data, $cbuf) or $err = 1;
+            $exifTool->VerboseValue("+ PNG:$$tagInfo{Name}", $val);
+            ++$exifTool->{CHANGED};
+        }
+    }
+    $addTags = { };     # prevent from adding tags again
+    # create any necessary directories
+    foreach $dir (sort keys %{$exifTool->{ADD_DIRS}}) {
+        my $buff;
+        my %dirInfo = (
+            Parent => 'PNG',
+            DirName => $dir,
+        );
+        if ($dir eq 'IFD0') {
+            $exifTool->VPrint(0, "Creating EXIF profile:\n");
+            $exifTool->{TIFF_TYPE} = 'APP1';
+            $tagTablePtr = Image::ExifTool::GetTagTable('Image::ExifTool::Exif::Main');
+            $buff = $exifTool->WriteDirectory(\%dirInfo, $tagTablePtr, \&Image::ExifTool::WriteTIFF);
+            if (defined $buff and length $buff) {
+                $buff = $Image::ExifTool::exifAPP1hdr . $buff;
+                WriteProfile($outfile, 'APP1', \$buff, 'generic') or $err = 1;
+            }
+        } elsif ($dir eq 'XMP') {
+            $exifTool->VPrint(0, "Creating XMP iTXt chunk:\n");
+            $tagTablePtr = Image::ExifTool::GetTagTable('Image::ExifTool::XMP::Main');
+            $dirInfo{ReadOnly} = 1;
+            $buff = $exifTool->WriteDirectory(\%dirInfo, $tagTablePtr);
+            if (defined $buff and length $buff and
+                # the packet is read-only (because of CRC)
+                Image::ExifTool::XMP::ValidateXMP(\$buff, 'r'))
+            {
+                # (previously, XMP was created as a non-standard XMP profile chunk)
+                # $buff = $Image::ExifTool::xmpAPP1hdr . $buff;
+                # WriteProfile($outfile, 'APP1', \$buff, 'generic') or $err = 1;
+                # (but now write XMP iTXt chunk according to XMP specification)
+                $buff = "iTXtXML:com.adobe.xmp\0\0\0\0\0" . $buff;
+                my $hdr = pack('N', length($buff) - 4);
+                my $cbuf = pack('N', CalculateCRC(\$buff, undef));
+                Write($outfile, $hdr, $buff, $cbuf) or $err = 1;
+            }
+        } elsif ($dir eq 'IPTC') {
+            $exifTool->VPrint(0, "Creating IPTC profile:\n");
+            # write new IPTC data
+            $tagTablePtr = Image::ExifTool::GetTagTable('Image::ExifTool::Photoshop::Main');
+            $buff = $exifTool->WriteDirectory(\%dirInfo, $tagTablePtr);
+            if (defined $buff and length $buff) {
+                WriteProfile($outfile, 'iptc', \$buff, 'IPTC') or $err = 1;
+            }
+        } elsif ($dir eq 'ICC_Profile') {
+            $exifTool->VPrint(0, "Creating ICC profile:\n");
+            # write new ICC data (only done if we couldn't create iCCP chunk)
+            $tagTablePtr = Image::ExifTool::GetTagTable('Image::ExifTool::ICC_Profile::Main');
+            $buff = $exifTool->WriteDirectory(\%dirInfo, $tagTablePtr);
+            if (defined $buff and length $buff) {
+                WriteProfile($outfile, 'icm', \$buff, 'ICC') or $err = 1;
+                $exifTool->Warn('Wrote ICC as a raw profile (no Compress::Zlib)');
+            }
+        }
+    }
+    $exifTool->{ADD_DIRS} = { };    # prevent from adding dirs again
+    return not $err;
+}
+
+
+1; # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::WritePNG.pl - Write PNG meta information
+
+=head1 SYNOPSIS
+
+These routines are autoloaded by Image::ExifTool::PNG.
+
+=head1 DESCRIPTION
+
+This file contains routines to write PNG metadata.
+
+=head1 NOTES
+
+Compress::Zlib is required to write compressed text.
+
+Existing text tags are always rewritten in their original form (compressed
+zTXt, uncompressed tEXt or internation iTXt), so pre-existing compressed
+information can only be modified if Compress::Zlib is available.
+
+Newly created textual information is written in uncompressed tEXt form by
+default, or as compressed zTXt if the Compress option is used and
+Compress::Zlib is available (but only if the resulting compressed data is
+smaller than the original text, which isn't always the case for short text
+strings).
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::PNG(3pm)|Image::ExifTool::PNG>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/WritePhotoshop.pl
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/WritePhotoshop.pl	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/WritePhotoshop.pl	(revision 24799)
@@ -0,0 +1,266 @@
+#------------------------------------------------------------------------------
+# File:         WritePhotoshop.pl
+#
+# Description:  Write Photoshop IRB meta information
+#
+# Revisions:    12/17/2004 - P. Harvey Created
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::Photoshop;
+
+use strict;
+
+#------------------------------------------------------------------------------
+# Strip resource name from value prepare resource name for writing into IRB
+# Inputs: 0) tagInfo ref, 1) resource name (padded pascal string), 2) new value ref
+# Returns: none (updates name and value if necessary)
+sub SetResourceName($$$)
+{
+    my ($tagInfo, $name, $valPt) = @_;
+    my $setName = $$tagInfo{SetResourceName};
+    if (defined $setName) {
+        # extract resource name from value
+        if ($$valPt =~ m{.*/#(.{0,255})#/$}s) {
+            $name = $1;
+            # strip name from value
+            $$valPt = substr($$valPt, 0, -4 - length($name));
+        } elsif ($setName eq '1') {
+            return;     # use old name
+        } else {
+            $name = $setName;
+        }
+        # convert to padded pascal string
+        $name = chr(length $name) . $name;
+        $name .= "\0" if length($name) & 0x01;
+        $_[1] = $name;  # return new name
+    }
+}
+
+#------------------------------------------------------------------------------
+# Write Photoshop IRB resource
+# Inputs: 0) ExifTool object reference, 1) source dirInfo reference,
+#         2) tag table reference
+# Returns: IRB resource data (may be empty if no Photoshop data)
+# Notes: Increments ExifTool CHANGED flag for each tag changed
+sub WritePhotoshop($$$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    $exifTool or return 1;    # allow dummy access to autoload this package
+    my $dataPt = $$dirInfo{DataPt};
+    unless ($dataPt) {
+        my $emptyData = '';
+        $dataPt = \$emptyData;
+    }
+    my $start = $$dirInfo{DirStart} || 0;
+    my $dirLen = $$dirInfo{DirLen} || (length($$dataPt) - $start);
+    my $dirEnd = $start + $dirLen;
+    my $newData = '';
+
+    # make a hash of new tag info, keyed on tagID
+    my $newTags = $exifTool->GetNewTagInfoHash($tagTablePtr);
+
+    my ($addDirs, $editDirs) = $exifTool->GetAddDirHash($tagTablePtr);
+
+    SetByteOrder('MM');     # Photoshop is always big-endian
+#
+# rewrite existing tags in the old directory, deleting ones as necessary
+# (the Photoshop directory entries aren't in any particular order)
+#
+    # Format: 0) Type, 4 bytes - '8BIM' (or the rare 'PHUT', 'DCSR' or 'AgHg')
+    #         1) TagID,2 bytes
+    #         2) Name, pascal string padded to even no. bytes
+    #         3) Size, 4 bytes - N
+    #         4) Data, N bytes
+    my ($pos, $value, $size, $tagInfo, $tagID);
+    for ($pos=$start; $pos+8<$dirEnd; $pos+=$size) {
+        # each entry must be on same even byte boundary as directory start
+        ++$pos if ($pos ^ $start) & 0x01;
+        my $type = substr($$dataPt, $pos, 4);
+        if ($type !~ /^(8BIM|PHUT|DCSR|AgHg)$/) {
+            $exifTool->Error("Bad Photoshop IRB resource");
+            undef $newData;
+            last;
+        }
+        $tagID = Get16u($dataPt, $pos + 4);
+        # get resource block name (pascal string padded to an even # of bytes)
+        my $namelen = 1 + Get8u($dataPt, $pos + 6);
+        ++$namelen if $namelen & 0x01;
+        if ($pos + $namelen + 10 > $dirEnd) {
+            $exifTool->Error("Bad APP13 resource block");
+            undef $newData;
+            last;
+        }
+        my $name = substr($$dataPt, $pos + 6, $namelen);
+        $size = Get32u($dataPt, $pos + 6 + $namelen);
+        $pos += $namelen + 10;
+        if ($size + $pos > $dirEnd) {
+            $exifTool->Error("Bad APP13 resource data size $size");
+            undef $newData;
+            last;
+        }
+        if ($$newTags{$tagID} and $type eq '8BIM') {
+            $tagInfo = $$newTags{$tagID};
+            delete $$newTags{$tagID};
+            my $nvHash = $exifTool->GetNewValueHash($tagInfo);
+            # check to see if we are overwriting this tag
+            $value = substr($$dataPt, $pos, $size);
+            my $isOverwriting = Image::ExifTool::IsOverwriting($nvHash, $value);
+            # handle special 'new' and 'old' values for IPTCDigest
+            if (not $isOverwriting and $tagInfo eq $iptcDigestInfo) {
+                if (grep /^new$/, @{$$nvHash{DelValue}}) {
+                    $isOverwriting = 1 if $$exifTool{NewIPTCDigest} and
+                                          $$exifTool{NewIPTCDigest} eq $value;
+                }
+                if (grep /^old$/, @{$$nvHash{DelValue}}) {
+                    $isOverwriting = 1 if $$exifTool{OldIPTCDigest} and
+                                          $$exifTool{OldIPTCDigest} eq $value;
+                }
+            }
+            if ($isOverwriting) {
+                $exifTool->VerboseValue("- Photoshop:$$tagInfo{Name}", $value);
+                # handle IPTCDigest specially because we want to write it last
+                # so the new IPTC digest will be known
+                if ($tagInfo eq $iptcDigestInfo) {
+                    $$newTags{$tagID} = $tagInfo;   # add later
+                    $value = undef;
+                } else {
+                    $value = Image::ExifTool::GetNewValues($nvHash);
+                }
+                ++$exifTool->{CHANGED};
+                next unless defined $value;     # next if tag is being deleted
+                # set resource name if necessary
+                SetResourceName($tagInfo, $name, \$value);
+                $exifTool->VerboseValue("+ Photoshop:$$tagInfo{Name}", $value);
+            }
+        } else {
+            if ($type eq '8BIM') {
+                $tagInfo = $$editDirs{$tagID};
+                unless ($tagInfo) {
+                    # process subdirectory anyway if writable (except EXIF to avoid recursion)
+                    # --> this allows IPTC to be processed if found here in TIFF images
+                    my $tmpInfo = $exifTool->GetTagInfo($tagTablePtr, $tagID);
+                    if ($tmpInfo and $$tmpInfo{SubDirectory} and
+                        $tmpInfo->{SubDirectory}->{TagTable} ne 'Image::ExifTool::Exif::Main')
+                    {
+                        my $table = Image::ExifTool::GetTagTable($tmpInfo->{SubDirectory}->{TagTable});
+                        $tagInfo = $tmpInfo if $$table{WRITE_PROC};
+                    }
+                }
+            }
+            if ($tagInfo) {
+                $$addDirs{$tagID} and delete $$addDirs{$tagID};
+                my %subdirInfo = (
+                    DataPt => $dataPt,
+                    DirStart => $pos,
+                    DataLen => $dirLen,
+                    DirLen => $size,
+                    Parent => $$dirInfo{DirName},
+                );
+                my $subTable = Image::ExifTool::GetTagTable($tagInfo->{SubDirectory}->{TagTable});
+                my $writeProc = $tagInfo->{SubDirectory}->{WriteProc};
+                my $newValue = $exifTool->WriteDirectory(\%subdirInfo, $subTable, $writeProc);
+                if (defined $newValue) {
+                    next unless length $newValue;   # remove subdirectory entry
+                    $value = $newValue;
+                    SetResourceName($tagInfo, $name, \$value);
+                } else {
+                    $value = substr($$dataPt, $pos, $size); # rewrite old directory
+                }
+            } else {
+                $value = substr($$dataPt, $pos, $size);
+            }
+        }
+        my $newSize = length $value;
+        # write this directory entry
+        $newData .= $type . Set16u($tagID) . $name . Set32u($newSize) . $value;
+        $newData .= "\0" if $newSize & 0x01;    # must null pad to even byte
+    }
+#
+# write any remaining entries we didn't find in the old directory
+# (might as well write them in numerical tag order)
+#
+    my @tagsLeft = sort { $a <=> $b } keys(%$newTags), keys(%$addDirs);
+    foreach $tagID (@tagsLeft) {
+        my $name = "\0\0";
+        if ($$newTags{$tagID}) {
+            $tagInfo = $$newTags{$tagID};
+            my $nvHash = $exifTool->GetNewValueHash($tagInfo);
+            $value = Image::ExifTool::GetNewValues($nvHash);
+            # handle new IPTCDigest value specially
+            if ($tagInfo eq $iptcDigestInfo and defined $value) {
+                if ($value eq 'new') {
+                    $value = $$exifTool{NewIPTCDigest};
+                } elsif ($value eq 'old') {
+                    $value = $$exifTool{OldIPTCDigest};
+                }
+                # (we already know we want to create this tag)
+            } else {
+                # don't add this tag unless specified
+                next unless Image::ExifTool::IsCreating($nvHash);
+            }
+            next unless defined $value;     # next if tag is being deleted
+            $exifTool->VerboseValue("+ Photoshop:$$tagInfo{Name}", $value);
+            ++$exifTool->{CHANGED};
+        } else {
+            $tagInfo = $$addDirs{$tagID};
+            # create new directory
+            my %subdirInfo = (
+                Parent => $$dirInfo{DirName},
+            );
+            my $subTable = Image::ExifTool::GetTagTable($tagInfo->{SubDirectory}->{TagTable});
+            my $writeProc = $tagInfo->{SubDirectory}->{WriteProc};
+            $value = $exifTool->WriteDirectory(\%subdirInfo, $subTable, $writeProc);
+            next unless $value;
+        }
+        # set resource name if necessary
+        SetResourceName($tagInfo, $name, \$value);
+        $size = length($value);
+        # write the new directory entry
+        $newData .= '8BIM' . Set16u($tagID) . $name . Set32u($size) . $value;
+        $newData .= "\0" if $size & 0x01;   # must null pad to even numbered byte
+        ++$exifTool->{CHANGED};
+    }
+    return $newData;
+}
+
+
+1; # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::WritePhotoshop.pl - Write Photoshop IRB meta information
+
+=head1 SYNOPSIS
+
+This file is autoloaded by Image::ExifTool::Photoshop.
+
+=head1 DESCRIPTION
+
+This file contains routines to write Photoshop metadata.
+
+=head1 NOTES
+
+Photoshop IRB blocks may have an associated resource name.  By default, the
+existing name is preserved when rewriting a resource, and an empty name is
+used when creating a new resource.  However, a different resource name may
+be specified by defining a C<SetResourceName> entry in the tag information
+hash.  With this defined, a new resource name may be appended to the value
+in the form "VALUE/#NAME#/" (the slashes and hashes are literal).  If
+C<SetResourceName> is anything other than '1', the value is used as a
+default resource name, and applied if no appended name is provided.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::Photoshop(3pm)|Image::ExifTool::Photoshop>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/WritePostScript.pl
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/WritePostScript.pl	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/WritePostScript.pl	(revision 24799)
@@ -0,0 +1,776 @@
+#------------------------------------------------------------------------------
+# File:         WritePostScript.pl
+#
+# Description:  Write PostScript meta information
+#
+# Revisions:    03/03/2006 - P. Harvey Created
+#
+# References:   (see references in PostScript.pm, plus:)
+#               1) http://www.adobe.com/products/postscript/pdfs/PLRM.pdf
+#               2) http://www-cdf.fnal.gov/offline/PostScript/PLRM2.pdf
+#               3) http://partners.adobe.com/public/developer/en/acrobat/sdk/pdf/pdf_creation_apis_and_specs/pdfmarkReference.pdf
+#               4) http://www.npes.org/standards/Tools/DCS20Spec.pdf
+#
+# Notes:        (see NOTES in POD doc below)
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::PostScript;
+
+use strict;
+
+# Structure of a DSC PS/EPS document:
+#
+#   %!PS-Adobe-3.0     [plus " EPSF-3.0" for EPS]
+#     <comments>
+#   %%EndComments      [optional]
+#   %%BeginXxxx
+#     <stuff to ignore>
+#   %%EndXxxx
+#   %%BeginProlog
+#     <prolog stuff>
+#   %%EndProlog
+#   %%BeginSetup
+#     <setup stuff>
+#   %%EndSetup
+#   %ImageData x x x x  [written by Photoshop]
+#   %BeginPhotoshop: xxxx
+#     <ascii-hex IRB information>
+#   %EndPhotosop
+#   %%BeginICCProfile: (name) <num> <type>
+#     <ICC Profile info>
+#   %%EndICCProfile
+#   %begin_xml_code
+#     <postscript code to define and read the XMP stream object>
+#   %begin_xml_packet: xxxx
+#     <XMP data>
+#   %end_xml_packet
+#     <postscript code to add XMP stream to dictionary>
+#   %end_xml_code
+#   %%Page: x x         [PS only (optional?)]
+#     <graphics commands>
+#   %%PageTrailer
+#   %%Trailer
+#     <a bit more code to bracket EPS content for distiller>
+#   %%EOF
+
+# map of where information is stored in PS image
+my %psMap = (
+    XMP          => 'PostScript',
+    Photoshop    => 'PostScript',
+    IPTC         => 'Photoshop',
+    EXIFInfo     => 'Photoshop',
+    IFD0         => 'EXIFInfo',
+    IFD1         => 'IFD0',
+    ICC_Profile  => 'PostScript',
+    ExifIFD      => 'IFD0',
+    GPS          => 'IFD0',
+    SubIFD       => 'IFD0',
+    GlobParamIFD => 'IFD0',
+    PrintIM      => 'IFD0',
+    InteropIFD   => 'ExifIFD',
+    MakerNotes   => 'ExifIFD',
+);
+
+
+#------------------------------------------------------------------------------
+# Write XMP directory to file, with begin/end tokens if necessary
+# Inputs: 0) outfile ref, 1) flags hash ref, 2-N) data to write
+# Returns: true on success
+sub WriteXMPDir($$@)
+{
+    my $outfile = shift;
+    my $flags = shift;
+    my $success = 1;
+    Write($outfile, "%begin_xml_code$/") or $success = 0 unless $$flags{WROTE_BEGIN};
+    Write($outfile, @_) or $success = 0;
+    Write($outfile, "%end_xml_code$/") or $success = 0 unless $$flags{WROTE_BEGIN};
+    return $success;
+}
+
+#------------------------------------------------------------------------------
+# Write a directory inside a PS document
+# Inputs: 0) ExifTool object ref, 1) output file reference,
+#         2) Directory name, 3) data reference, 4) flags hash ref
+# Returns: 0=error, 1=nothing written, 2=dir written ok
+sub WritePSDirectory($$$$$)
+{
+    my ($exifTool, $outfile, $dirName, $dataPt, $flags) = @_;
+    my $success = 2;
+    my $len = $dataPt ? length($$dataPt) : 0;
+    my $create = $len ? 0 : 1;
+    my %dirInfo = (
+        DataPt => $dataPt,
+        DataLen => $len,
+        DirStart => 0,
+        DirLen => $len,
+        DirName => $dirName,
+        Parent => 'PostScript',
+    );
+    # Note: $$flags{WROTE_BEGIN} may be 1 for XMP (it is always 0 for
+    # other dirs, but if 1, the begin/end markers were already written)
+#
+# prepare necessary postscript code to support embedded XMP
+#
+    my ($beforeXMP, $afterXMP, $reportedLen);
+    if ($dirName eq 'XMP' and $len) {
+        # isolate the XMP
+        pos($$dataPt) = 0;
+        unless ($$dataPt =~ /(.*)(<\?xpacket begin=.{7,13}W5M0MpCehiHzreSzNTczkc9d)/sg) {
+            $exifTool->Warn('No XMP packet start');
+            return WriteXMPDir($outfile, $flags, $$dataPt);
+        }
+        $beforeXMP = $1;
+        my $xmp = $2;
+        my $p1 = pos($$dataPt);
+        unless ($$dataPt =~ m{<\?xpacket end=.(w|r).\?>}sg) {
+            $exifTool->Warn('No XMP packet end');
+            return WriteXMPDir($outfile, $flags, $$dataPt);
+        }
+        my $p2 = pos($$dataPt);
+        $xmp .= substr($$dataPt, $p1, $p2-$p1);
+        $afterXMP = substr($$dataPt, $p2);
+        # determine if we can adjust the XMP size
+        if ($beforeXMP =~ /%begin_xml_packet: (\d+)/s) {
+            $reportedLen = $1;
+            my @matches= ($beforeXMP =~ /\b$reportedLen\b/sg);
+            undef $reportedLen unless @matches == 2;
+        }
+        # must edit in place if we can't reliably change the XMP length
+        $dirInfo{InPlace} = 1 unless $reportedLen;
+        # process XMP only
+        $dirInfo{DataLen} = $dirInfo{DirLen} = length $xmp;
+        $dirInfo{DataPt} = \$xmp;
+    }
+    my $tagTablePtr = Image::ExifTool::GetTagTable("Image::ExifTool::${dirName}::Main");
+    my $val = $exifTool->WriteDirectory(\%dirInfo, $tagTablePtr);
+    if (defined $val) {
+        $dataPt = \$val;    # use modified directory
+        $len = length $val;
+    } elsif ($dirName eq 'XMP') {
+        return 1 unless $len;
+        # just write the original XMP
+        return WriteXMPDir($outfile, $flags, $$dataPt);
+    }
+    unless ($len) {
+        return 1 if $create or $dirName ne 'XMP';   # nothing to create
+        # it would be really difficult to delete the XMP,
+        # so instead we write a blank XMP record
+        $val = <<EMPTY_XMP;
+<?xpacket begin='ï»¿' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool $Image::ExifTool::VERSION'>
+</x:xmpmeta>
+EMPTY_XMP
+        $val .= ((' ' x 100) . "\n") x 24 unless $exifTool->Options('Compact');
+        $val .= q{<?xpacket end='w'?>};
+        $dataPt = \$val;
+        $len = length $val;
+    }
+#
+# write XMP directory
+#
+    if ($dirName eq 'XMP') {
+        if ($create) {
+            # create necessary PS/EPS code to support XMP
+            $beforeXMP = <<HDR_END;
+/pdfmark where {pop true} {false} ifelse
+/currentdistillerparams where {pop currentdistillerparams
+/CoreDistVersion get 5000 ge } {false} ifelse
+and not {userdict /pdfmark /cleartomark load put} if
+[/NamespacePush pdfmark
+[/_objdef {exiftool_metadata_stream} /type /stream /OBJ pdfmark
+[{exiftool_metadata_stream} 2 dict begin /Type /Metadata def
+  /Subtype /XML def currentdict end /PUT pdfmark
+/MetadataString $len string def % exact length of metadata
+/TempString 100 string def
+/ConsumeMetadata {
+currentfile TempString readline pop pop
+currentfile MetadataString readstring pop pop
+} bind def
+ConsumeMetadata
+%begin_xml_packet: $len
+HDR_END
+            # note: use q() to get necessary linefeed before %end_xml_packet
+            $afterXMP = q(
+%end_xml_packet
+[{exiftool_metadata_stream} MetadataString /PUT pdfmark
+);
+            if ($$flags{EPS}) {
+                $afterXMP .= <<EPS_AFTER;
+[/Document 1 dict begin
+  /Metadata {exiftool_metadata_stream} def currentdict end /BDC pdfmark
+[/NamespacePop pdfmark
+EPS_AFTER
+                # write this at end of file
+                $$flags{TRAILER} = "[/EMC pdfmark$/";
+            } else { # PS
+                $afterXMP .= <<PS_AFTER;
+[{Catalog} {exiftool_metadata_stream} /Metadata pdfmark
+[/NamespacePop pdfmark
+PS_AFTER
+            }
+            $beforeXMP =~ s{\n}{$/}sg;  # use proper newline characters
+            $afterXMP =~ s{\n}{$/}sg;
+        } else {
+            # replace xmp size in PS code
+            $reportedLen and $beforeXMP =~ s/\b$reportedLen\b/$len/sg;
+        }
+        WriteXMPDir($outfile, $flags, $beforeXMP, $$dataPt, $afterXMP) or $success = 0;
+#
+# Write Photoshop or ICC_Profile directory
+#
+    } elsif ($dirName eq 'Photoshop' or $dirName eq 'ICC_Profile') {
+        my ($startToken, $endToken);
+        if ($dirName eq 'Photoshop') {
+            $startToken = "%BeginPhotoshop: $len";
+            $endToken = '%EndPhotoshop';
+        } else {
+            $startToken = '%%BeginICCProfile: (Photoshop Profile) -1 Hex';
+            $endToken = '%%EndICCProfile';
+        }
+        Write($outfile, $startToken, $/) or $success = 0;
+        # write as an ASCII-hex comment
+        my $i;
+        my $wid = 32;
+        for ($i=0; $i<$len; $i+=$wid) {
+            $wid > $len-$i and $wid = $len-$i;
+            my $dat = substr($$dataPt, $i, $wid);
+            Write($outfile, "% ", uc(unpack('H*',$dat)), $/) or $success = 0;
+        }
+        Write($outfile, $endToken, $/) or $success = 0;
+    } else {
+        $exifTool->Warn("Can't write PS directory $dirName");
+    }
+    undef $val;
+    return $success;
+}
+
+#------------------------------------------------------------------------------
+# Encode postscript tag/value
+# Inputs: 0) tag ID, 1) value
+# Returns: postscript comment
+# - adds brackets, escapes special characters, and limits line length
+sub EncodeTag($$)
+{
+    my ($tag, $val) = @_;
+    unless ($val =~ /^\d+$/) {
+        $val =~ s/([()\\])/\\$1/g;  # escape brackets and backslashes
+        $val =~ s/\n/\\n/g;         # escape newlines
+        $val =~ s/\r/\\r/g;         # escape carriage returns
+        $val =~ s/\t/\\t/g;         # escape tabs
+        # use octal escape codes for other control characters
+        $val =~ s/([\x00-\x1f\x7f\xff])/sprintf("\\%.3o",ord($1))/ge;
+        $val = "($val)";
+    }
+    my $line = "%%$tag: $val";
+    # postscript line limit is 255 characters
+    # --> split if necessary using continuation comment "%%+"
+    my $n;
+    for ($n=255; length($line)>$n; $n+=255+length($/)) {
+        substr($line, $n, 0) = "$/%%+";
+    }
+    return $line . $/;
+}
+
+#------------------------------------------------------------------------------
+# Write new tags information in comments section
+# Inputs: 0) ExifTool object ref, 1) output file ref, 2) reference to new tag hash
+# Returns: true on success
+sub WriteNewTags($$$)
+{
+    my ($exifTool, $outfile, $newTags) = @_;
+    my $success = 1;
+    my $tag;
+
+    # get XMP hint and remove from tags hash
+    my $xmpHint = $$newTags{XMP_HINT};
+    delete $$newTags{XMP_HINT};
+
+    foreach $tag (sort keys %$newTags) {
+        my $tagInfo = $$newTags{$tag};
+        my $nvHash = $exifTool->GetNewValueHash($tagInfo);
+        next unless Image::ExifTool::IsCreating($nvHash);
+        my $val = Image::ExifTool::GetNewValues($nvHash);
+        $exifTool->VerboseValue("+ PostScript:$$tagInfo{Name}", $val);
+        Write($outfile, EncodeTag($tag, $val)) or $success = 0;
+        ++$exifTool->{CHANGED};
+    }
+    # write XMP hint if necessary
+    Write($outfile, "%ADO_ContainsXMP: MainFirst$/") or $success = 0 if $xmpHint;
+
+    %$newTags = ();     # all done with new tags
+    return $success;
+}
+
+#------------------------------------------------------------------------------
+# check to be sure we haven't read past end of PS data in DOS-style file
+# Inputs: 0) RAF ref, 1) pointer to end of PS, 2) data
+# - modifies data and sets RAF to EOF if end of PS is reached
+sub CheckPSEnd($$$)
+{
+    my $pos = $_[0]->Tell();
+    if ($pos >= $_[1]) {
+        $_[0]->Seek(0, 2);   # seek to end of file so we can't read any more
+        $_[2] = substr($_[2], 0, length($_[2]) - $pos + $_[1]) if $pos > $_[1];
+    }
+}
+
+#------------------------------------------------------------------------------
+# Split into lines ending in any CR, LF or CR+LF combination
+# (this is annoying, and could be avoided if EPS files didn't mix linefeeds!)
+# Inputs: 0) data pointer, 1) reference to lines array
+# Notes: Updates data to contain next line and fills list with remaining lines
+sub SplitLine($$)
+{
+    my ($dataPt, $lines) = @_;
+    for (;;) {
+        my $endl;
+        # find the position of the first LF (\x0a)
+        $endl = pos($$dataPt), pos($$dataPt) = 0 if $$dataPt =~ /\x0a/g;
+        if ($$dataPt =~ /\x0d/g) { # find the first CR (\x0d)
+            if (defined $endl) {
+                # (remember, CR+LF is a DOS newline...)
+                $endl = pos($$dataPt) if pos($$dataPt) < $endl - 1;
+            } else {
+                $endl = pos($$dataPt);
+            }
+        } elsif (not defined $endl) {
+            push @$lines, $$dataPt;
+            last;
+        }
+        # split into separate lines
+        if (length $$dataPt == $endl) {
+            push @$lines, $$dataPt;
+            last;
+        } else {
+            push @$lines, substr($$dataPt, 0, $endl);
+            $$dataPt = substr($$dataPt, $endl);
+        }
+    }
+    $$dataPt = shift @$lines;   # set $$dataPt to first line
+}
+
+#------------------------------------------------------------------------------
+# Write PS file
+# Inputs: 0) ExifTool object reference, 1) source dirInfo reference
+# Returns: 1 on success, 0 if this wasn't a valid PS file,
+#          or -1 if a write error occurred
+sub WritePS($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    $exifTool or return 1;    # allow dummy access to autoload this package
+    my $tagTablePtr = Image::ExifTool::GetTagTable('Image::ExifTool::PostScript::Main');
+    my $raf = $$dirInfo{RAF};
+    my $outfile = $$dirInfo{OutFile};
+    my $verbose = $exifTool->Options('Verbose');
+    my $out = $exifTool->Options('TextOut');
+    my ($data, $buff, %flags, $err, $mode, $endToken);
+    my ($dos, $psStart, $psEnd, $psNewStart, $xmpHint);
+
+    $raf->Read($data, 4) == 4 or return 0;
+    return 0 unless $data =~ /^(%!PS|%!Ad|\xc5\xd0\xd3\xc6)/;
+
+    if ($data =~ /^%!Ad/) {
+        # I've seen PS files start with "%!Adobe-PS"...
+        return 0 unless $raf->Read($buff, 6) == 6 and $buff eq "obe-PS";
+        $data .= $buff;
+
+    } elsif ($data =~ /^\xc5\xd0\xd3\xc6/) {
+#
+# process DOS binary PS files
+#
+        # save DOS header then seek ahead and check PS header
+        $raf->Read($dos, 26) == 26 or return 0;
+        $dos = $data . $dos;
+        SetByteOrder('II');
+        $psStart = Get32u(\$dos, 4);
+        unless ($raf->Seek($psStart, 0) and
+                $raf->Read($data, 4) == 4 and $data eq '%!PS')
+        {
+            $exifTool->Error('Invalid PS header');
+            return 1;
+        }
+        $psEnd = $psStart + Get32u(\$dos, 8);
+        my $base = Get32u(\$dos, 20);
+        Set16u(0xffff, \$dos, 28);  # ignore checksum
+        if ($base) {
+            my %dirInfo = (
+                Parent => 'PS',
+                RAF => $raf,
+                Base => $base,
+                NoTiffEnd => 1, # no end-of-TIFF check
+            );
+            $buff = $exifTool->WriteTIFF(\%dirInfo);
+            SetByteOrder('II'); # (WriteTIFF may change this)
+            if ($buff) {
+                $buff = substr($buff, $base);   # remove header written by WriteTIFF()
+            } else {
+                # error rewriting TIFF, so just copy over original data
+                my $len = Get32u(\$dos, 24);
+                unless ($raf->Seek($base, 0) and $raf->Read($buff, $len) == $len) {
+                    $exifTool->Error('Error reading embedded TIFF');
+                    return 1;
+                }
+                $exifTool->Warn('Bad embedded TIFF');
+            }
+            Set32u(0, \$dos, 12);                   # zero metafile pointer
+            Set32u(0, \$dos, 16);                   # zero metafile length
+            Set32u(length($dos), \$dos, 20);        # set TIFF pointer
+            Set32u(length($buff), \$dos, 24);       # set TIFF length
+        } elsif (($base = Get32u(\$dos, 12)) != 0) {
+            # copy over metafile section
+            my $len = Get32u(\$dos, 16);
+            unless ($raf->Seek($base, 0) and $raf->Read($buff, $len) == $len) {
+                $exifTool->Error('Error reading metafile section');
+                return 1;
+            }
+            Set32u(length($dos), \$dos, 12);        # set metafile pointer
+        } else {
+            $buff = '';
+        }
+        $psNewStart = length($dos) + length($buff);
+        Set32u($psNewStart, \$dos, 4);  # set pointer to start of PS
+        Write($outfile, $dos, $buff) or $err = 1;
+        $raf->Seek($psStart + 4, 0);    # seek back to where we were
+    }
+#
+# rewrite PostScript data
+#
+    local $/ = GetInputRecordSeparator($raf);
+    unless ($/ and $raf->ReadLine($buff)) {
+        $exifTool->Error('Invalid PostScript data');
+        return 1;
+    }
+    $data .= $buff;
+    unless ($data =~ /^%!PS-Adobe-3\.(\d+)\b/ and $1 < 2) {
+        if ($exifTool->Error("Document does not conform to DSC spec. Metadata may be unreadable by other apps", 1)) {
+            return 1;
+        }
+    }
+    my $psRev = $1; # save PS revision number (3.x)
+    Write($outfile, $data) or $err = 1;
+    $flags{EPS} = 1 if $data =~ /EPSF/;
+
+    # get hash of new information keyed by tagID and directories to add/edit
+    my $newTags = $exifTool->GetNewTagInfoHash($tagTablePtr);
+
+    # figure out which directories we need to write (PostScript takes priority)
+    $exifTool->InitWriteDirs(\%psMap, 'PostScript');
+    my $addDirs = $exifTool->{ADD_DIRS};
+    my $editDirs = $exifTool->{EDIT_DIRS};
+    my %doneDir;
+
+    # set XMP hint flag (1 for adding, 0 for deleting, undef for no change)
+    $xmpHint = 1 if $$addDirs{XMP};
+    $xmpHint = 0 if $$exifTool{DEL_GROUP}{XMP};
+    $$newTags{XMP_HINT} = $xmpHint if $xmpHint;  # add special tag to newTags list
+
+    my (@lines, $changedNL);
+    my $altnl = ($/ eq "\x0d") ? "\x0a" : "\x0d";
+
+    for (;;) {
+        if (@lines) {
+            $data = shift @lines;
+        } else {
+            $raf->ReadLine($data) or last;
+            $dos and CheckPSEnd($raf, $psEnd, $data);
+            # split line if it contains other newline sequences
+            if ($data =~ /$altnl/) {
+                if (length($data) > 500000 and IsPC()) {
+                    # patch for Windows memory problem
+                    unless ($changedNL) {
+                        $changedNL = 1;
+                        my $t = $/;
+                        $/ = $altnl;
+                        $altnl = $t;
+                        $raf->Seek(-length($data), 1);
+                        next;
+                    }
+                } else {
+                    # split into separate lines
+                    SplitLine(\$data, \@lines);
+                }
+            }
+        }
+        undef $changedNL;
+        if ($endToken) {
+            # look for end token
+            if ($data =~ m/^$endToken\s*$/is) {
+                undef $endToken;
+                # found end: process this information
+                if ($mode) {
+                    $doneDir{$mode} and $exifTool->Error("Multiple $mode directories", 1);
+                    $doneDir{$mode} = 1;
+                    WritePSDirectory($exifTool, $outfile, $mode, \$buff, \%flags) or $err = 1;
+                    # write end token if we wrote the begin token
+                    Write($outfile, $data) or $err = 1 if $flags{WROTE_BEGIN};
+                    undef $buff;
+                } else {
+                    Write($outfile, $data) or $err = 1;
+                }
+            } else {
+                # buffer data in current begin/end block
+                if (not defined $mode) {
+                    # pick up XMP in unrecognized blocks for editing in place
+                    if ($data =~ /^<\?xpacket begin=.{7,13}W5M0MpCehiHzreSzNTczkc9d/ and
+                        $$editDirs{XMP})
+                    {
+                        $buff = $data;
+                        $mode = 'XMP';
+                    } else {
+                        Write($outfile, $data) or $err = 1;
+                    }
+                } elsif ($mode eq 'XMP') {
+                    $buff .= $data;
+                } else {
+                    # data is ASCII-hex encoded
+                    $data =~ tr/0-9A-Fa-f//dc;  # remove all but hex characters
+                    $buff .= pack('H*', $data); # translate from hex
+                }
+            }
+            next;
+        } elsif ($data =~ m{^(%{1,2})(Begin)(?!Object:)(.*?)[:\x0d\x0a]}i) {
+            # comments section is over... write any new tags now
+            WriteNewTags($exifTool, $outfile, $newTags) or $err = 1 if %$newTags;
+            undef $xmpHint;
+            # the beginning of a data block (can only write XMP and Photoshop)
+            my %modeLookup = (
+                _xml_code => 'XMP',
+                photoshop => 'Photoshop',
+                iccprofile => 'ICC_Profile',
+            );
+            $verbose > 1 and print $out "$2$3\n";
+            $endToken = $1 . ($2 eq 'begin' ? 'end' : 'End') . $3;
+            $mode = $modeLookup{lc($3)};
+            if ($mode and $$editDirs{$mode}) {
+                $buff = '';     # initialize buffer for this block
+                $flags{WROTE_BEGIN} = 0;
+            } else {
+                undef $mode;    # not editing this directory
+                Write($outfile, $data) or $err = 1;
+                $flags{WROTE_BEGIN} = 1;
+            }
+            next;
+        } elsif ($data =~ /^%%(?!Page:|PlateFile:|BeginObject:)(\w+): ?(.*)/s) {
+            # rewrite information from PostScript tags in comments
+            my ($tag, $val) = ($1, $2);
+            # handle Adobe Illustrator files specially
+            # - EVENTUALLY IT WOULD BE BETTER TO FIND ANOTHER IDENTIFICATION METHOD
+            #   (because Illustrator doesn't care if the Creator is changed)
+            if ($tag eq 'Creator' and $val =~ /^Adobe Illustrator/) {
+                # disable writing XMP to PS-format Adobe Illustrator files and
+                # older Illustrator EPS files becaues it confuses Illustrator
+                # (Illustrator 8 and older write PS-Adobe-3.0, newer write PS-Adobe-3.1)
+                if ($$editDirs{XMP} and $psRev == 0) {
+                    if ($flags{EPS}) {
+                        $exifTool->Warn("Can't write XMP to Illustrator 8 or older EPS files");
+                    } else {
+                        $exifTool->Warn("Can't write XMP to PS-format AI files");
+                    }
+                    # pretend like we wrote it already so we won't try to add it later
+                    $doneDir{XMP} = 1;
+                }
+                # don't allow "Creator" to be changed in Illustrator files
+                # (we need it to be able to recognize these files)
+                # --> find a better way to do this!
+                if ($$newTags{$tag}) {
+                    $exifTool->Warn("Can't change Postscript:Creator of Illustrator files");
+                    delete $$newTags{$tag};
+                }
+            }
+            if ($$newTags{$tag}) {
+                my $tagInfo = $$newTags{$tag};
+                delete $$newTags{$tag}; # write it then forget it
+                next unless ref $tagInfo;
+                # decode comment string (reading continuation lines if necessary)
+                $val = DecodeComment($val, $raf, \@lines, \$data);
+                $val = join $exifTool->Options('ListSep'), @$val if ref $val eq 'ARRAY';
+                my $nvHash = $exifTool->GetNewValueHash($tagInfo);
+                if (Image::ExifTool::IsOverwriting($nvHash, $val)) {
+                    $exifTool->VerboseValue("- PostScript:$$tagInfo{Name}", $val);
+                    $val = Image::ExifTool::GetNewValues($nvHash);
+                    ++$exifTool->{CHANGED};
+                    next unless defined $val;   # next if tag is being deleted
+                    $exifTool->VerboseValue("+ PostScript:$$tagInfo{Name}", $val);
+                    $data = EncodeTag($tag, $val);
+                }
+            }
+        # (note: Adobe InDesign doesn't put colon after %ADO_ContainsXMP -- doh!)
+        } elsif (defined $xmpHint and $data =~ m{^%ADO_ContainsXMP:? ?(.+?)[\x0d\x0a]*$}s) {
+            # change the XMP hint if necessary
+            if ($xmpHint) {
+                $data = "%ADO_ContainsXMP: MainFirst$/" if $1 eq 'NoMain';
+            } else {
+                $data = "%ADO_ContainsXMP: NoMain$/";
+            }
+            # delete XMP hint flags
+            delete $$newTags{XMP_HINT};
+            undef $xmpHint;
+        } else {
+            # look for end of comments section
+            if (%$newTags and ($data !~ /^%\S/ or
+                $data =~ /^%(%EndComments|%Page:|%PlateFile:|%BeginObject:|.*BeginLayer)/))
+            {
+                # write new tags at end of comments section
+                WriteNewTags($exifTool, $outfile, $newTags) or $err = 1;
+                undef $xmpHint;
+            }
+            # look for start of drawing commands (AI uses "%AI5_BeginLayer",
+            # and Helios uses "%%BeginObject:")
+            if ($data =~ /^%(%Page:|%PlateFile:|%BeginObject:|.*BeginLayer)/ or
+                $data !~ m{^(%.*|\s*)$}s)
+            {
+                # we have reached the first page or drawing command, so create necessary
+                # directories and copy the rest of the file, then all done
+                my $dir;
+                my $plateFile = ($data =~ /^%%PlateFile:/);
+                # create Photoshop first, then XMP if necessary
+                foreach $dir (qw{Photoshop ICC_Profile XMP}) {
+                    next unless $$editDirs{$dir} and not $doneDir{$dir};
+                    if ($plateFile) {
+                        # PlateFile comments may contain offsets so we can't edit these files!
+                        $exifTool->Warn("Can only edit PostScript information DCS Plate files");
+                        last;
+                    }
+                    next unless $$addDirs{$dir} or $dir eq 'XMP';
+                    $flags{WROTE_BEGIN} = 0;
+                    WritePSDirectory($exifTool, $outfile, $dir, undef, \%flags) or $err = 1;
+                    $doneDir{$dir} = 1;
+                }
+                # copy rest of file
+                if ($flags{TRAILER}) {
+                    # write trailer before %%EOF
+                    for (;;) {
+                        Write($outfile, $data) or $err = 1;
+                        if (@lines) {
+                            $data = shift @lines;
+                        } else {
+                            $raf->ReadLine($data) or undef($data), last;
+                            $dos and CheckPSEnd($raf, $psEnd, $data);
+                            if ($data =~ /[\x0d\x0a]%%EOF\b/g) {
+                                # split data before "%%EOF"
+                                # (necessary if data contains other newline sequences)
+                                my $pos = pos($data) - 5;
+                                push @lines, substr($data, $pos);
+                                $data = substr($data, 0, $pos);
+                            }
+                        }
+                        last if $data =~ /^%%EOF\b/;
+                    }
+                    Write($outfile, $flags{TRAILER}) or $err = 1;
+                }
+                # simply copy the rest of the file if any data is left
+                if (defined $data) {
+                    Write($outfile, $data) or $err = 1;
+                    Write($outfile, @lines) or $err = 1 if @lines;
+                    while ($raf->Read($data, 65536)) {
+                        $dos and CheckPSEnd($raf, $psEnd, $data);
+                        Write($outfile, $data) or $err = 1;
+                    }
+                }
+                last;   # all done!
+            }
+        }
+        # write new information or copy existing line
+        Write($outfile, $data) or $err = 1;
+    }
+    if ($dos and not $err) {
+        # must go back and set length of PS section in DOS header (very dumb design)
+        if (ref $outfile eq 'SCALAR') {
+            Set32u(length($$outfile) - $psNewStart, $outfile, 8);
+        } else {
+            my $pos = tell $outfile;
+            unless (seek($outfile, 8, 0) and
+                    print $outfile Set32u($pos - $psNewStart) and
+                    seek($outfile, $pos, 0))
+            {
+                $exifTool->Error("Can't write DOS-style PS files in non-seekable stream");
+                $err = 1;
+            }
+        }
+    }
+    # issue warning if we couldn't write any information
+    unless ($err) {
+        my (@notDone, $dir);
+        delete $$newTags{XMP_HINT};
+        push @notDone, 'PostScript' if %$newTags;
+        foreach $dir (qw{Photoshop ICC_Profile XMP}) {
+            push @notDone, $dir if $$editDirs{$dir} and not $doneDir{$dir} and
+                                   not $$exifTool{DEL_GROUP}{$dir};
+        }
+        @notDone and $exifTool->Warn("Couldn't write ".join('/',@notDone).' information');
+    }
+    $endToken and $exifTool->Error("File missing $endToken");
+    return $err ? -1 : 1;
+}
+
+
+1; # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::WritePostScript.pl - Write PostScript meta information
+
+=head1 SYNOPSIS
+
+This file is autoloaded by Image::ExifTool::PostScript.
+
+=head1 DESCRIPTION
+
+This file contains routines to write meta information in PostScript
+documents.  Six forms of meta information may be written:
+
+    1) PostScript comments (Adobe DSC specification)
+    2) XMP information embedded in a document-level XMP stream
+    3) EXIF information embedded in a Photoshop record
+    4) IPTC information embedded in a PhotoShop record
+    5) ICC_Profile information embedded in an ICCProfile record
+    6) TIFF information embedded in DOS-style binary header
+
+=head1 NOTES
+
+Currently, information is written only in the outer-level document.
+
+Photoshop will discard meta information in a PostScript document if it has
+to rasterize the image, and it will rasterize anything that doesn't contain
+the Photoshop-specific 'ImageData' tag.  So don't expect Photoshop to read
+any meta information added to EPS images that it didn't create.
+
+The following two acronyms may be confusing since they are so similar and
+have different meanings with respect to PostScript documents:
+
+    DSC = Document Structuring Conventions
+    DCS = Desktop Color Separation
+
+=head1 REFERENCES
+
+See references in L<PostScript.pm|Image::ExifTool::PostScript>, plus:
+
+=over 4
+
+=item L<http://www.adobe.com/products/postscript/pdfs/PLRM.pdf>
+
+=item L<http://www-cdf.fnal.gov/offline/PostScript/PLRM2.pdf>
+
+=item L<http://partners.adobe.com/public/developer/en/acrobat/sdk/pdf/pdf_creation_apis_and_specs/pdfmarkReference.pdf>
+
+=back
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Tim Kordick for his help testing the EPS writer.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::PostScript(3pm)|Image::ExifTool::PostScript>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/WriteXMP.pl
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/WriteXMP.pl	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/WriteXMP.pl	(revision 24799)
@@ -0,0 +1,1271 @@
+#------------------------------------------------------------------------------
+# File:         WriteXMP.pl
+#
+# Description:  Write XMP meta information
+#
+# Revisions:    12/19/2004 - P. Harvey Created
+#------------------------------------------------------------------------------
+package Image::ExifTool::XMP;
+
+use strict;
+use vars qw(%specialStruct %dateTimeInfo $xlatNamespace);
+
+use Image::ExifTool qw(:DataAccess :Utils);
+
+sub CheckXMP($$$);
+sub CaptureXMP($$$;$);
+sub SetPropertyPath($$;$$$$);
+
+my $debug = 0;
+my $numPadLines = 24;       # number of blank padding lines
+
+# when writing extended XMP, resources bigger than this get placed in their own
+# rdf:Description so they can be moved to the extended segments if necessary
+my $newDescThresh = 10240;  # 10 kB
+
+# individual resources and namespaces to place last in separate rdf:Description's
+# so they can be moved to extended XMP segments if required (see Oct. 2008 XMP spec)
+my %extendedRes = (
+    'photoshop:History' => 1,
+    'xap:Thumbnails' => 1,
+    'xmp:Thumbnails' => 1,
+    'crs' => 1,
+    'crss' => 1,
+);
+
+my $rdfDesc = 'rdf:Description';
+#
+# packet/xmp/rdf headers and trailers
+#
+my $pktOpen = "<?xpacket begin='\xef\xbb\xbf' id='W5M0MpCehiHzreSzNTczkc9d'?>\n";
+my $xmlOpen = "<?xml version='1.0' encoding='UTF-8'?>\n";
+my $xmpOpenPrefix = "<x:xmpmeta xmlns:x='$nsURI{x}'";
+my $rdfOpen = "<rdf:RDF xmlns:rdf='$nsURI{rdf}'>\n";
+my $rdfClose = "</rdf:RDF>\n";
+my $xmpClose = "</x:xmpmeta>\n";
+my $pktCloseW =  "<?xpacket end='w'?>"; # writable by default
+my $pktCloseR =  "<?xpacket end='r'?>";
+
+#------------------------------------------------------------------------------
+# Get XMP opening tag (and set x:xmptk appropriately)
+# Inputs: 0) ExifTool object ref
+# Returns: x:xmpmeta opening tag
+sub XMPOpen($)
+{
+    my $exifTool = shift;
+    my $nv = $exifTool->{NEW_VALUE}->{$Image::ExifTool::XMP::x{xmptk}};
+    my $tk;
+    if (defined $nv) {
+        $tk = Image::ExifTool::GetNewValues($nv);
+        $exifTool->VerboseValue(($tk ? '+' : '-') . ' XMP-x:XMPToolkit', $tk);
+        ++$exifTool->{CHANGED};
+    } else {
+        $tk = "Image::ExifTool $Image::ExifTool::VERSION";
+    }
+    my $str = $tk ? (" x:xmptk='" . EscapeXML($tk) . "'") : '';
+    return "$xmpOpenPrefix$str>\n";
+}
+
+#------------------------------------------------------------------------------
+# Validate XMP packet and set read or read/write mode
+# Inputs: 0) XMP data reference, 1) 'r' = read only, 'w' or undef = read/write
+# Returns: true if XMP is good (and adds packet header/trailer if necessary)
+sub ValidateXMP($;$)
+{
+    my ($xmpPt, $mode) = @_;
+    unless ($$xmpPt =~ /^\0*<\0*\?\0*x\0*p\0*a\0*c\0*k\0*e\0*t/) {
+        return '' unless $$xmpPt =~ /^<x(mp)?:x[ma]pmeta/;
+        # add required xpacket header/trailer
+        $$xmpPt = $pktOpen . $$xmpPt . $pktCloseW;
+    }
+    $mode = 'w' unless $mode;
+    my $end = substr($$xmpPt, -32, 32);
+    # check for proper xpacket trailer and set r/w mode if necessary
+    return '' unless $end =~ s/(e\0*n\0*d\0*=\0*['"]\0*)([rw])(\0*['"]\0*\?\0*>)/$1$mode$3/;
+    substr($$xmpPt, -32, 32) = $end if $2 ne $mode;
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Check XMP date values for validity and format accordingly
+# Inputs: 1) date string
+# Returns: XMP date/time string (or undef on error)
+sub FormatXMPDate($)
+{
+    my $val = shift;
+    my ($y, $m, $d, $t, $tz);
+    if ($val =~ /(\d{4}):(\d{2}):(\d{2}) (\d{2}:\d{2}(?::\d{2}(?:\.\d*)?)?)(.*)/) {
+        ($y, $m, $d, $t, $tz) = ($1, $2, $3, $4, $5);
+        $val = "$y-$m-${d}T$t";
+    } elsif ($val =~ /^\s*\d{4}(:\d{2}){0,2}\s*$/) {
+        # this is just a date (YYYY, YYYY-mm or YYYY-mm-dd)
+        $val =~ tr/:/-/;
+    } elsif ($val =~ /^\s*(\d{2}:\d{2}(?::\d{2}(?:\.\d*)?)?)(.*)\s*$/) {
+        # this is just a time
+        ($t, $tz) = ($1, $2);
+        $val = $t;
+    } else {
+        return undef;
+    }
+    if ($tz) {
+        $tz =~ /^(Z|[+-]\d{2}:\d{2})$/ or return undef;
+        $val .= $tz;
+    }
+    return $val;
+}
+
+#------------------------------------------------------------------------------
+# Check XMP values for validity and format accordingly
+# Inputs: 0) ExifTool object ref, 1) tagInfo hash ref, 2) raw value ref
+# Returns: error string or undef (and may change value) on success
+# Note: copies structured information to avoid conflicts with calling code
+sub CheckXMP($$$)
+{
+    my ($exifTool, $tagInfo, $valPtr) = @_;
+
+    if ($$tagInfo{Struct}) {
+        require 'Image/ExifTool/XMPStruct.pl';
+        my ($item, $err, $w, $warn);
+        unless (ref $$valPtr) {
+            ($$valPtr, $warn) = InflateStruct($valPtr);
+            # expect a structure HASH ref or ARRAY of structures
+            ref $$valPtr or return 'Improperly formed structure';
+        }
+        if (ref $$valPtr eq 'ARRAY') {
+            return 'Not a list tag' unless $$tagInfo{List};
+            my @copy = ( @{$$valPtr} ); # copy the list for ExifTool to use
+            $$valPtr = \@copy;          # return the copy
+            foreach $item (@copy) {
+                unless (ref $item eq 'HASH') {
+                    ($item, $w) = InflateStruct(\$item); # deserialize structure
+                    $w and $warn = $w;
+                    next if ref $item eq 'HASH';
+                    $err = 'Improperly formed structure';
+                    last;
+                }
+                ($item, $err) = CheckStruct($exifTool, $item, $$tagInfo{Struct});
+                last if $err;
+            }
+        } else {
+            ($$valPtr, $err) = CheckStruct($exifTool, $$valPtr, $$tagInfo{Struct});
+        }
+        $warn and $$exifTool{CHECK_WARN} = $warn;
+        return $err;
+    }
+    my $format = $tagInfo->{Writable};
+    # (if no format specified, value is a simple string)
+    if (not $format or $format eq 'string' or $format eq 'lang-alt') {
+        # convert value to UTF8 if necessary
+        if ($exifTool->{OPTIONS}->{Charset} ne 'UTF8') {
+            if ($$valPtr =~ /[\x80-\xff]/) {
+                # convert from Charset to UTF-8
+                $$valPtr = $exifTool->Encode($$valPtr,'UTF8');
+            }
+        } else {
+            # translate invalid XML characters to "."
+            $$valPtr =~ tr/\0-\x08\x0b\x0c\x0e-\x1f/./;
+            # fix any malformed UTF-8 characters
+            if (FixUTF8($valPtr) and not $$exifTool{WarnBadUTF8}) {
+                $exifTool->Warn('Malformed UTF-8 character(s)');
+                $$exifTool{WarnBadUTF8} = 1;
+            }
+        }
+        return undef;   # success
+    }
+    if ($format eq 'rational' or $format eq 'real') {
+        # make sure the value is a valid floating point number
+        unless (Image::ExifTool::IsFloat($$valPtr) or
+            # allow 'inf' and 'undef' rational values
+            ($format eq 'rational' and ($$valPtr eq 'inf' or
+             $$valPtr eq 'undef' or Image::ExifTool::IsRational($$valPtr))))
+        {
+            return 'Not a floating point number' 
+        }
+        if ($format eq 'rational') {
+            $$valPtr = join('/', Image::ExifTool::Rationalize($$valPtr));
+        }
+    } elsif ($format eq 'integer') {
+        # make sure the value is integer
+        if (Image::ExifTool::IsInt($$valPtr)) {
+            # no conversion required (converting to 'int' would remove leading '+')
+        } elsif (Image::ExifTool::IsHex($$valPtr)) {
+            $$valPtr = hex($$valPtr);
+        } else {
+            return 'Not an integer';
+        }
+    } elsif ($format eq 'date') {
+        my $newDate = FormatXMPDate($$valPtr);
+        return "Invalid date/time (use YYYY:mm:dd HH:MM:SS[.ss][+/-HH:MM|Z])" unless $newDate;
+        $$valPtr = $newDate;
+    } elsif ($format eq 'boolean') {
+        if (not $$valPtr or $$valPtr =~ /false/i or $$valPtr =~ /^no$/i) {
+            $$valPtr = 'False';
+        } else {
+            $$valPtr = 'True';
+        }
+    } elsif ($format eq '1') {
+        # this is the entire XMP data block
+        return 'Invalid XMP data' unless ValidateXMP($valPtr);
+    } else {
+        return "Unknown XMP format: $format";
+    }
+    return undef;   # success!
+}
+
+#------------------------------------------------------------------------------
+# Get PropertyPath for specified tagInfo
+# Inputs: 0) tagInfo reference
+# Returns: PropertyPath string
+sub GetPropertyPath($)
+{
+    my $tagInfo = shift;
+    SetPropertyPath($$tagInfo{Table}, $$tagInfo{TagID}) unless $$tagInfo{PropertyPath};
+    return $$tagInfo{PropertyPath};
+}
+
+#------------------------------------------------------------------------------
+# Set PropertyPath for specified tag (also for associated flattened tags and structure elements)
+# Inputs: 0) tagTable reference, 1) tagID, 2) tagID of parent structure,
+#         3) structure definition ref (or undef), 4) property list up to this point (or undef),
+#         5) flag set if any containing structure has a TYPE
+# Notes: also generates flattened tags if they don't already exist
+sub SetPropertyPath($$;$$$$)
+{
+    my ($tagTablePtr, $tagID, $parentID, $structPtr, $propList, $isType) = @_;
+    my $table = $structPtr || $tagTablePtr;
+    my $tagInfo = $$table{$tagID};
+
+    return if ref($tagInfo) ne 'HASH' or $$tagInfo{PropertyPath};
+
+    # don't override existing main table entry if already set by a Struct
+    if ($structPtr) {
+        $isType = 1 if $$structPtr{TYPE};
+    } else {
+        # use property path from original tagInfo if this is an alternate-language tag
+        my $srcInfo = $$tagInfo{SrcTagInfo};
+        $$tagInfo{PropertyPath} = GetPropertyPath($srcInfo) if $srcInfo;
+        return if $$tagInfo{PropertyPath};
+        # set property path for all flattened tags in structure if necessary
+        if ($$tagInfo{RootTagInfo}) {
+            SetPropertyPath($tagTablePtr, $$tagInfo{RootTagInfo}{TagID});
+            return if $$tagInfo{PropertyPath};
+            warn "Internal Error: Didn't set path from root for $tagID\n";
+        }
+    }
+    my $ns = $$tagInfo{Namespace} || $$table{NAMESPACE};
+    $ns or warn("No namespace for $tagID\n"), return;
+    my (@propList, $listType);
+    $propList and @propList = @$propList;
+    push @propList, "$ns:$tagID";
+    # lang-alt lists are handled specially, signified by Writable='lang-alt'
+    if ($$tagInfo{Writable} and $$tagInfo{Writable} eq 'lang-alt') {
+        $listType = 'Alt';
+        # remove language code from property path if it exists
+        $propList[-1] =~ s/-$$tagInfo{LangCode}$// if $$tagInfo{LangCode};
+        # handle lists of lang-alt lists (ie. XMP-plus:Custom tags)
+        if ($$tagInfo{List} and $$tagInfo{List} ne '1') {
+            push @propList, "rdf:$$tagInfo{List}", 'rdf:li 10';
+        }
+    } else {
+        $listType = $$tagInfo{List};
+    }
+    # add required properties if this is a list
+    push @propList, "rdf:$listType", 'rdf:li 10' if $listType and $listType ne '1';
+    # set PropertyPath for all flattened tags of this structure if necessary
+    # (note: don't do this for variable-namespace structures (undef NAMESPACE))
+    my $strTable = $$tagInfo{Struct};
+    if ($strTable and $$strTable{NAMESPACE}) {
+        # make sure the structure namespace has been registered
+        # (user-defined namespaces may not have been)
+        RegisterNamespace($strTable) if ref $$strTable{NAMESPACE};
+        my $tag;
+        foreach $tag (keys %$strTable) {
+            # ignore special fields and any lang-alt fields we may have added
+            next if $specialStruct{$tag} or $$strTable{$tag}{LangCode};
+            my $fullID = $parentID ? $parentID . ucfirst($tagID) : $tagID;
+            SetPropertyPath($tagTablePtr, $tag, $fullID, $strTable, \@propList, $isType);
+        }
+    }
+    # if this was a structure field and not a normal tag,
+    # we set PropertyPath in the corresponding flattened tag
+    if ($structPtr) {
+        my $flatID = $parentID . ucfirst($tagID);
+        $tagInfo = $$tagTablePtr{$flatID};
+        # create flattened tag now if necessary
+        # (could happen if we were just writing a structure)
+        unless ($tagInfo) {
+            $tagInfo = { Name => ucfirst($flatID), Flat => 1 };
+            Image::ExifTool::AddTagToTable($tagTablePtr, $flatID, $tagInfo);
+        }
+        # set StructType flag if any containing structure has a TYPE
+        $$tagInfo{StructType} = 1 if $isType;
+    }
+    # set property path for tagInfo in main table
+    $$tagInfo{PropertyPath} = join '/', @propList;
+}
+
+#------------------------------------------------------------------------------
+# Save XMP property name/value for rewriting
+# Inputs: 0) ExifTool object reference
+#         1) reference to array of XMP property path (last is current property)
+#         2) property value, 3) optional reference to hash of property attributes
+sub CaptureXMP($$$;$)
+{
+    my ($exifTool, $propList, $val, $attrs) = @_;
+    return unless defined $val and @$propList > 2;
+    if ($$propList[0] =~ /^x:x[ma]pmeta$/ and
+        $$propList[1] eq 'rdf:RDF' and
+        $$propList[2] =~ /$rdfDesc( |$)/)
+    {
+        # no properties to save yet if this is just the description
+        return unless @$propList > 3;
+        # ignore empty list properties
+        if ($$propList[-1] =~ /^rdf:(Bag|Seq|Alt)$/) {
+            $exifTool->Warn("Ignored empty $$propList[-1] list for $$propList[-2]", 1);
+            return;
+        }
+        # save information about this property
+        my $capture = $exifTool->{XMP_CAPTURE};
+        my $path = join('/', @$propList[3..$#$propList]);
+        if (defined $$capture{$path}) {
+            $exifTool->{XMP_ERROR} = "Duplicate XMP property: $path";
+        } else {
+            $$capture{$path} = [$val, $attrs || { }];
+        }
+    } elsif ($$propList[0] eq 'rdf:RDF' and
+             $$propList[1] =~ /$rdfDesc( |$)/)
+    {
+        # set flag so we don't write x:xmpmeta element
+        $exifTool->{XMP_NO_XMPMETA} = 1;
+        # add missing x:xmpmeta element and try again
+        unshift @$propList, 'x:xmpmeta';
+        CaptureXMP($exifTool, $propList, $val, $attrs);
+    } else {
+        $exifTool->{XMP_ERROR} = 'Improperly enclosed XMP property: ' . join('/',@$propList);
+    }
+}
+
+#------------------------------------------------------------------------------
+# Save information about resource containing blank node with nodeID
+# Inputs: 0) reference to blank node information hash
+#         1) reference to property list
+#         2) property value
+#         3) [optional] reference to attribute hash
+# Notes: This routine and ProcessBlankInfo() are also used for reading information, but
+#        are uncommon so are put in this file to reduce compile time for the common case
+sub SaveBlankInfo($$$;$)
+{
+    my ($blankInfo, $propListPt, $val, $attrs) = @_;
+
+    my $propPath = join '/', @$propListPt;
+    my @ids = ($propPath =~ m{ #([^ /]*)}g);
+    my $id;
+    # split the property path at each nodeID
+    foreach $id (@ids) {
+        my ($pre, $prop, $post) = ($propPath =~ m{^(.*?)/([^/]*) #$id((/.*)?)$});
+        defined $pre or warn("internal error parsing nodeID's"), next;
+        # the element with the nodeID should be in the path prefix for subject
+        # nodes and the path suffix for object nodes
+        unless ($prop eq $rdfDesc) {
+            if ($post) {
+                $post = "/$prop$post";
+            } else {
+                $pre = "$pre/$prop";
+            }
+        }
+        $blankInfo->{Prop}->{$id}->{Pre}->{$pre} = 1;
+        if ((defined $post and length $post) or (defined $val and length $val)) {
+            # save the property value and attributes for each unique path suffix
+            $blankInfo->{Prop}->{$id}->{Post}->{$post} = [ $val, $attrs, $propPath ];
+        }
+    }
+}
+
+#------------------------------------------------------------------------------
+# Process blank-node information
+# Inputs: 0) ExifTool object ref, 1) tag table ref,
+#         2) blank node information hash ref, 3) flag set for writing
+sub ProcessBlankInfo($$$;$)
+{
+    my ($exifTool, $tagTablePtr, $blankInfo, $isWriting) = @_;
+    $exifTool->VPrint(1, "  [Elements with nodeID set:]\n") unless $isWriting;
+    my ($id, $pre, $post);
+    # handle each nodeID separately
+    foreach $id (sort keys %{$$blankInfo{Prop}}) {
+        my $path = $blankInfo->{Prop}->{$id};
+        # flag all resource names so we can warn later if some are unused
+        my %unused;
+        foreach $post (keys %{$path->{Post}}) {
+            $unused{$post} = 1;
+        }
+        # combine property paths for all possible paths through this node
+        foreach $pre (sort keys %{$path->{Pre}}) {
+            # there will be no description for the object of a blank node
+            next unless $pre =~ m{/$rdfDesc/};
+            foreach $post (sort keys %{$path->{Post}}) {
+                my @propList = split m{/}, "$pre$post";
+                my ($val, $attrs) = @{$path->{Post}->{$post}};
+                if ($isWriting) {
+                    CaptureXMP($exifTool, \@propList, $val, $attrs);
+                } else {
+                    FoundXMP($exifTool, $tagTablePtr, \@propList, $val);
+                }
+                delete $unused{$post};
+            }
+        }
+        # save information from unused properties (if RDF is malformed like f-spot output)
+        if (%unused) {
+            $exifTool->Options('Verbose') and $exifTool->Warn('An XMP resource is about nothing');
+            foreach $post (sort keys %unused) {
+                my ($val, $attrs, $propPath) = @{$path->{Post}->{$post}};
+                my @propList = split m{/}, $propPath;
+                if ($isWriting) {
+                    CaptureXMP($exifTool, \@propList, $val, $attrs);
+                } else {
+                    FoundXMP($exifTool, $tagTablePtr, \@propList, $val);
+                }
+            }
+        }
+    }
+}
+
+#------------------------------------------------------------------------------
+# Convert path to namespace used in file (this is a pain, but the XMP
+# spec only suggests 'preferred' namespace prefixes...)
+# Inputs: 0) ExifTool object reference, 1) property path
+# Returns: conforming property path
+sub ConformPathToNamespace($$)
+{
+    my ($exifTool, $path) = @_;
+    my @propList = split('/',$path);
+    my $nsUsed = $exifTool->{XMP_NS};
+    my $prop;
+    foreach $prop (@propList) {
+        my ($ns, $tag) = $prop =~ /(.+?):(.*)/;
+        next if $$nsUsed{$ns};
+        my $uri = $nsURI{$ns};
+        unless ($uri) {
+            warn "No URI for namepace prefix $ns!\n";
+            next;
+        }
+        my $ns2;
+        foreach $ns2 (keys %$nsUsed) {
+            next unless $$nsUsed{$ns2} eq $uri;
+            # use the existing namespace prefix instead of ours
+            $prop = "$ns2:$tag";
+            last;
+        }
+    }
+    return join('/',@propList);
+}
+
+#------------------------------------------------------------------------------
+# Add necessary rdf:type element when writing structure
+# Inputs: 0) ExifTool ref, 1) tag table ref, 2) capture hash ref, 3) path string
+#         4) optional base path (already conformed to namespace) for elements in
+#            variable-namespace structures
+sub AddStructType($$$$;$)
+{
+    my ($exifTool, $tagTablePtr, $capture, $path, $basePath) = @_;
+    my @props = split '/', $path;
+    my %doneID;
+    for (;;) {
+        pop @props;
+        last unless @props;
+        my $tagID = GetXMPTagID(\@props);
+        next if $doneID{$tagID};
+        $doneID{$tagID} = 1;
+        my $tagInfo = $$tagTablePtr{$tagID};
+        last unless ref $tagInfo eq 'HASH';
+        if ($$tagInfo{Struct}) {
+            my $type = $$tagInfo{Struct}{TYPE};
+            if ($type) {
+                my $pat = $$tagInfo{PropertyPath};
+                $pat or warn("Missing PropertyPath in AddStructType\n"), last;
+                $pat = ConformPathToNamespace($exifTool, $pat);
+                $pat =~  s/ \d+/ \\d\+/g;
+                $path =~ /^($pat)/ or warn("Wrong path in AddStructType\n"), last;
+                my $p = $1 . '/rdf:type';
+                $p = "$basePath/$p" if $basePath;
+                $$capture{$p} = [ '', { 'rdf:resource' => $type } ] unless $$capture{$p};
+            }
+        }
+        last unless $$tagInfo{StructType};
+    }
+}
+
+#------------------------------------------------------------------------------
+# Utility routine to encode data in base64
+# Inputs: 0) binary data string
+# Returns:   base64-encoded string
+sub EncodeBase64($)
+{
+    # encode the data in 45-byte chunks
+    my $chunkSize = 45;
+    my $len = length $_[0];
+    my $str = '';
+    my $i;
+    for ($i=0; $i<$len; $i+=$chunkSize) {
+        my $n = $len - $i;
+        $n = $chunkSize if $n > $chunkSize;
+        # add uuencoded data to output (minus size byte, but including trailing newline)
+        $str .= substr(pack('u', substr($_[0], $i, $n)), 1);
+    }
+    # convert to base64 (remember that "\0" may be encoded as ' ' or '`')
+    $str =~ tr/` -_/AA-Za-z0-9+\//;
+    # convert pad characters at the end (remember to account for trailing newline)
+    my $pad = 3 - ($len % 3);
+    substr($str, -$pad-1, $pad) = ('=' x $pad) if $pad < 3;
+    return $str;
+}
+
+#------------------------------------------------------------------------------
+# sort tagInfo hash references by tag name
+sub ByTagName
+{
+    return $$a{Name} cmp $$b{Name};
+}
+
+#------------------------------------------------------------------------------
+# sort alphabetically, but with rdf:type first in the structure
+sub TypeFirst
+{
+    if ($a =~ /rdf:type$/) {
+        return substr($a, 0, -8) cmp $b unless $b =~ /rdf:type$/;
+    } elsif ($b =~ /rdf:type$/) {
+        return $a cmp substr($b, 0, -8);
+    }
+    return $a cmp $b;
+}
+
+#------------------------------------------------------------------------------
+# Limit size of XMP
+# Inputs: 0) ExifTool object ref, 1) XMP data ref (written up to start of $rdfClose),
+#         2) max XMP len, 3) rdf:about string, 4) list ref for description start offsets
+#         5) start offset of first description recommended for extended XMP
+# Returns: 0) extended XMP ref, 1) GUID and updates $$dataPt (or undef if no extended XMP)
+sub LimitXMPSize($$$$$$)
+{
+    my ($exifTool, $dataPt, $maxLen, $about, $startPt, $extStart) = @_;
+
+    # return straight away if it isn't too big
+    return undef if length($$dataPt) < $maxLen;
+
+    push @$startPt, length($$dataPt);  # add end offset to list
+    my $newData = substr($$dataPt, 0, $$startPt[0]);
+    my $guid = '0' x 32;
+    # write the required xmpNote:HasExtendedXMP property
+    $newData .= "\n <$rdfDesc rdf:about='$about'\n  xmlns:xmpNote='$nsURI{xmpNote}'>\n" .
+                  "  <xmpNote:HasExtendedXMP>$guid</xmpNote:HasExtendedXMP>\n" .
+                  " </$rdfDesc>\n";
+
+    my ($i, %descSize, $start);
+    # calculate all description block sizes
+    for ($i=1; $i<@$startPt; ++$i) {
+        $descSize{$$startPt[$i-1]} = $$startPt[$i] - $$startPt[$i-1];
+    }
+    pop @$startPt;    # remove end offset
+    # write the descriptions from smallest to largest, as many in main XMP as possible
+    my @descStart = sort { $descSize{$a} <=> $descSize{$b} } @$startPt;
+    my $extData = XMPOpen($exifTool) . $rdfOpen;
+    for ($i=0; $i<2; ++$i) {
+      foreach $start (@descStart) {
+        # write main XMP first (in order of size), then extended XMP afterwards (in order)
+        next if $i xor $start >= $extStart;
+        my $pt = (length($newData) + $descSize{$start} > $maxLen) ? \$extData : \$newData;
+        $$pt .= substr($$dataPt, $start, $descSize{$start});
+      }
+    }
+    $extData .= $rdfClose . $xmpClose;  # close rdf:RDF and x:xmpmeta
+    # calculate GUID from MD5 of extended XMP data
+    if (eval 'require Digest::MD5') {
+        $guid = uc unpack('H*', Digest::MD5::md5($extData));
+        $newData =~ s/0{32}/$guid/;     # update GUID in main XMP segment
+    }
+    $exifTool->VerboseValue('+ XMP-xmpNote:HasExtendedXMP', $guid);
+    $$dataPt = $newData;        # return main XMP block
+    return (\$extData, $guid);  # return extended XMP and its GUID
+}
+
+#------------------------------------------------------------------------------
+# Write XMP information
+# Inputs: 0) ExifTool object reference, 1) source dirInfo reference,
+#         2) [optional] tag table reference
+# Returns: with tag table: new XMP data (may be empty if no XMP data) or undef on error
+#          without tag table: 1 on success, 0 if not valid XMP file, -1 on write error
+# Notes: May set dirInfo InPlace flag to rewrite with specified DirLen
+#        May set dirInfo ReadOnly flag to write as read-only XMP ('r' mode and no padding)
+#        May set dirInfo Compact flag to force compact (drops 2kB of padding)
+#        May set dirInfo MaxDataLen to limit output data length -- this causes ExtendedXMP
+#          and ExtendedGUID to be returned in dirInfo if extended XMP was required
+sub WriteXMP($$;$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    $exifTool or return 1;    # allow dummy access to autoload this package
+    my $dataPt = $$dirInfo{DataPt};
+    my (%capture, %nsUsed, $xmpErr, $tagInfo, $about);
+    my $changed = 0;
+    my $xmpFile = (not $tagTablePtr);   # this is an XMP data file if no $tagTablePtr
+    # prefer XMP over other metadata formats in some types of files
+    my $preferred = $xmpFile || ($$exifTool{PreferredGroup} and $$exifTool{PreferredGroup} eq 'XMP');
+    my $verbose = $exifTool->Options('Verbose');
+    my $dirLen = $$dirInfo{DirLen};
+    $dirLen = length($$dataPt) if not defined $dirLen and $dataPt;
+#
+# extract existing XMP information into %capture hash
+#
+    # define hash in ExifTool object to capture XMP information (also causes
+    # CaptureXMP() instead of FoundXMP() to be called from ParseXMPElement())
+    #
+    # The %capture hash is keyed on the complete property path beginning after
+    # rdf:RDF/rdf:Description/.  The values are array references with the
+    # following entries: 0) value, 1) attribute hash reference.
+    $exifTool->{XMP_CAPTURE} = \%capture;
+    $exifTool->{XMP_NS} = \%nsUsed;
+    delete $exifTool->{XMP_NO_XMPMETA};
+    delete $exifTool->{XMP_NO_XPACKET};
+    delete $exifTool->{XMP_IS_XML};
+    delete $exifTool->{XMP_IS_SVG};
+
+    if ($xmpFile or $dirLen) {
+        delete $exifTool->{XMP_ERROR};
+        delete $exifTool->{XMP_ABOUT};
+        # extract all existing XMP information (to the XMP_CAPTURE hash)
+        my $success = ProcessXMP($exifTool, $dirInfo, $tagTablePtr);
+        # don't continue if there is nothing to parse or if we had a parsing error
+        unless ($success and not $exifTool->{XMP_ERROR}) {
+            my $err = $exifTool->{XMP_ERROR} || 'Error parsing XMP';
+            # may ignore this error only if we were successful
+            if ($xmpFile) {
+                my $raf = $$dirInfo{RAF};
+                # allow empty XMP data so we can create something from nothing
+                if ($success or not $raf->Seek(0,2) or $raf->Tell()) {
+                    # no error message if not an XMP file
+                    return 0 unless $exifTool->{XMP_ERROR};
+                    if ($exifTool->Error($err, $success)) {
+                        delete $exifTool->{XMP_CAPTURE};
+                        return 0;
+                    }
+                }
+            } else {
+                if ($exifTool->Warn($err, $success)) {
+                    delete $exifTool->{XMP_CAPTURE};
+                    return undef;
+                }
+            }
+        }
+        $tagInfo = $Image::ExifTool::XMP::rdf{about};
+        if (defined $exifTool->{NEW_VALUE}->{$tagInfo}) {
+            $about = Image::ExifTool::GetNewValues($exifTool->{NEW_VALUE}->{$tagInfo}) || '';
+            if ($verbose > 1) {
+                my $wasAbout = $exifTool->{XMP_ABOUT};
+                $exifTool->VerboseValue('- XMP-rdf:About', UnescapeXML($wasAbout)) if defined $wasAbout;
+                $exifTool->VerboseValue('+ XMP-rdf:About', $about);
+            }
+            $about = EscapeXML($about); # must escape for XML
+            ++$changed;
+        } else {
+            $about = $exifTool->{XMP_ABOUT} || '';
+        }
+        delete $exifTool->{XMP_ERROR};
+        delete $exifTool->{XMP_ABOUT};
+    } else {
+        $about = '';
+    }
+#
+# handle writing XMP as a block to XMP file
+#
+    if ($xmpFile) {
+        $tagInfo = $Image::ExifTool::Extra{XMP};
+        if ($tagInfo and $exifTool->{NEW_VALUE}->{$tagInfo}) {
+            my $rtnVal = 1;
+            my $newVal = Image::ExifTool::GetNewValues($exifTool->{NEW_VALUE}->{$tagInfo});
+            if (defined $newVal and length $newVal) {
+                $exifTool->VPrint(0, "  Writing XMP as a block\n");
+                ++$exifTool->{CHANGED};
+                Write($$dirInfo{OutFile}, $newVal) or $rtnVal = -1;
+            }
+            delete $exifTool->{XMP_CAPTURE};
+            return $rtnVal;
+        }
+    }
+#
+# delete groups in family 1 if requested
+#
+    if (%{$exifTool->{DEL_GROUP}} and (grep /^XMP-.+$/, keys %{$exifTool->{DEL_GROUP}} or
+        # (logic is a bit more complex for group names in exiftool XML files)
+        grep m{^http://ns.exiftool.ca/}, values %nsUsed))
+    {
+        my $del = $exifTool->{DEL_GROUP};
+        my $path;
+        foreach $path (keys %capture) {
+            my @propList = split('/',$path); # get property list
+            my ($tag, $ns) = GetXMPTagID(\@propList);
+            # translate namespace if necessary
+            $ns = $$xlatNamespace{$ns} if $$xlatNamespace{$ns};
+            my ($grp, @g);
+            # no "XMP-" added to most groups in exiftool RDF/XML output file
+            if ($nsUsed{$ns} and (@g = ($nsUsed{$ns} =~ m{^http://ns.exiftool.ca/(.*?)/(.*?)/}))) {
+                if ($g[1] =~ /^\d/) {
+                    $grp = "XML-$g[0]";
+                    #(all XML-* groups stored as uppercase DEL_GROUP key)
+                    my $ucg = uc $grp;
+                    next unless $$del{$ucg} or ($$del{'XML-*'} and not $$del{"-$ucg"});
+                } else {
+                    $grp = $g[1];
+                    next unless $$del{$grp} or ($$del{$g[0]} and not $$del{"-$grp"});
+                }
+            } else {
+                $grp = "XMP-$ns";
+                my $ucg = uc $grp;
+                next unless $$del{$ucg} or ($$del{'XMP-*'} and not $$del{"-$ucg"});
+            }
+            $exifTool->VerboseValue("- $grp:$tag", $capture{$path}->[0]);
+            delete $capture{$path};
+            ++$changed;
+        }
+    }
+    # delete HasExtendedXMP tag (we create it as needed)
+    my $hasExtTag = 'xmpNote:HasExtendedXMP';
+    if ($capture{$hasExtTag}) {
+        $exifTool->VerboseValue("- XMP-$hasExtTag", $capture{$hasExtTag}->[0]);
+        delete $capture{$hasExtTag};
+    }
+    # set $xmpOpen now to to handle xmptk tag first
+    my $xmpOpen = $exifTool->{XMP_NO_XMPMETA} ? '' : XMPOpen($exifTool);
+#
+# add, delete or change information as specified
+#
+    # get hash of all information we want to change
+    # (sorted by tag name so alternate languages come last)
+    my @tagInfoList = sort ByTagName $exifTool->GetNewTagInfoList();
+    foreach $tagInfo (@tagInfoList) {
+        next unless $exifTool->GetGroup($tagInfo, 0) eq 'XMP';
+        my $tag = $$tagInfo{TagID};
+        my $path = GetPropertyPath($tagInfo);
+        unless ($path) {
+            $exifTool->Warn("Can't write XMP:$tag (namespace unknown)");
+            next;
+        }
+        # skip tags that were handled specially
+        if ($path eq 'rdf:about' or $path eq 'x:xmptk') {
+            ++$changed;
+            next;
+        }
+        my $isStruct = $$tagInfo{Struct};
+        # change our property path namespace prefixes to conform
+        # to the ones used in this file
+        $path = ConformPathToNamespace($exifTool, $path);
+        # find existing property
+        my $cap = $capture{$path}; 
+        # MicrosoftPhoto screws up the case of some tags, and some other software,
+        # including Adobe software, has been known to write the wrong list type or
+        # not properly enclose properties in a list, so we check for this
+        # (NOTE: we don't currently do these tests when writing structures!
+        #  --> add this to DeleteStruct() below if it turns out to be a problem)
+        unless ($cap or $isStruct) {
+            my $regex = quotemeta $path;
+            # also allow for missing structure fields in lists of structures
+            $regex =~  s/ \d+/ \\d\+/g;
+            my $ok = $regex; # regular expression to match standard property names
+            # also check for incorrect list types which can cause problems
+            if ($regex =~ s{\\/rdf\\:(Bag|Seq|Alt)\\/}{/rdf:(Bag|Seq|Alt)/}g) {
+                # also look for missing bottom-level list
+                $regex =~ s{/rdf:\(Bag\|Seq\|Alt\)\/rdf\\:li\\ \\d\+$}{(/.*)?};
+            }
+            my @matches = sort grep m{^$regex$}i, keys %capture;
+            if (@matches) {
+                if ($matches[0] =~ /^$ok$/) {
+                    $path = $matches[0];    # use existing property path
+                    $cap = $capture{$path};
+                } else {
+                    # property list was wrong, so issue a warning and fix it
+                    my ($match, @fixed, %fixed, $err);
+                    foreach $match (@matches) {
+                        my $fixed = $path;
+                        # set list indices
+                        while ($match =~ / (\d+)/g) {
+                            my $idx = $1;
+                            # insert leading "X" so we don't replace this one again
+                            $fixed =~ s/ \d+/ X$idx/;
+                        }
+                        $fixed =~ s/ X/ /g if $fixed ne $path;  # remove "X"s
+                        $err = 1 if $capture{$fixed} or $fixed{$fixed};
+                        push @fixed, $fixed;
+                        $fixed{$fixed} = 1;
+                    }
+                    my $tg = $exifTool->GetGroup($tagInfo, 1) . ':' . $$tagInfo{Name};
+                    my $wrn = lc($path) eq lc($matches[0]) ? 'tag ID case' : 'list type';
+                    if ($err) {
+                        $exifTool->Warn("Incorrect $wrn for $tg conflicts with existing tag");
+                    } else {
+                        # fix the incorrect property paths for all values of this tag
+                        foreach $match (@matches) {
+                            my $fixed = shift @fixed;
+                            $capture{$fixed} = $capture{$match};
+                            delete $capture{$match};
+                        }
+                        $cap = $capture{$path} || $capture{$fixed[0]};
+                        $exifTool->Warn("Fixed incorrect $wrn for $tg", 1);
+                    }
+                }
+            }
+        }
+        my $nvHash = $exifTool->GetNewValueHash($tagInfo);
+        my $overwrite = Image::ExifTool::IsOverwriting($nvHash);
+        my $writable = $$tagInfo{Writable} || '';
+        my (%attrs, $deleted, $added);
+        # delete existing entry if necessary
+        if ($isStruct) {
+            require 'Image/ExifTool/XMPStruct.pl';
+            ($deleted, $added) = DeleteStruct($exifTool, \%capture, \$path, $nvHash, \$changed);
+        } elsif ($cap) {
+            # take attributes from old values if they exist
+            %attrs = %{$$cap[1]};
+            if ($overwrite) {
+                my ($delPath, $oldLang, $delLang, $addLang, @matchingPaths);
+                # check to see if this is an indexed list item
+                if ($path =~ / /) {
+                    my $pp;
+                    ($pp = $path) =~ s/ \d+/ \\d\+/g;
+                    @matchingPaths = sort grep(/^$pp$/, keys %capture);
+                } else {
+                    push @matchingPaths, $path;
+                }
+                foreach $path (@matchingPaths) {
+                    my ($val, $attrs) = @{$capture{$path}};
+                    if ($writable eq 'lang-alt') {
+                        unless (defined $addLang) {
+                            # add to lang-alt list by default if creating this tag from scratch
+                            $addLang = Image::ExifTool::IsCreating($nvHash) ? 1 : 0;
+                        }
+                        # get original language code (lc for comparisons)
+                        $oldLang = lc($$attrs{'xml:lang'} || 'x-default');
+                        if ($overwrite < 0) {
+                            my $newLang = lc($$tagInfo{LangCode} || 'x-default');
+                            next unless $oldLang eq $newLang;
+                            # only add new tag if we are overwriting this one
+                            # (note: this won't match if original XML contains CDATA!)
+                            $addLang = Image::ExifTool::IsOverwriting($nvHash, UnescapeXML($val));
+                            next unless $addLang;
+                        }
+                        # delete all if deleting "x-default" and writing with no LangCode
+                        # (XMP spec requires x-default language exist and be first in list)
+                        if ($oldLang eq 'x-default' and not $$tagInfo{LangCode}) {
+                            $delLang = 1;   # delete all languages
+                            $overwrite = 1; # force overwrite
+                        } elsif ($$tagInfo{LangCode} and not $delLang) {
+                            # only overwrite specified language
+                            next unless lc($$tagInfo{LangCode}) eq $oldLang;
+                        }
+                    } elsif ($overwrite < 0) {
+                        # only overwrite specific values
+                        # (note: this won't match if original XML contains CDATA!)
+                        next unless Image::ExifTool::IsOverwriting($nvHash, UnescapeXML($val));
+                    }
+                    if ($verbose > 1) {
+                        my $grp = $exifTool->GetGroup($tagInfo, 1);
+                        my $tagName = $$tagInfo{Name};
+                        $tagName =~ s/-$$tagInfo{LangCode}$// if $$tagInfo{LangCode};
+                        $tagName .= '-' . $$attrs{'xml:lang'} if $$attrs{'xml:lang'};
+                        $exifTool->VerboseValue("- $grp:$tagName", $val);
+                    }
+                    # save attributes and path from first deleted property
+                    # so we can replace it exactly
+                    unless ($delPath) {
+                        %attrs = %$attrs;
+                        $delPath = $path;
+                    }
+                    # delete this tag
+                    delete $capture{$path};
+                    ++$changed;
+                    # delete rdf:type tag if it is the only thing left in this structure
+                    if ($path =~ /^(.*)\// and $capture{"$1/rdf:type"}) {
+                        my $pp = $1;
+                        my @a = grep /^\Q$pp\E\/[^\/]+/, keys %capture;
+                        delete $capture{"$pp/rdf:type"} if @a == 1;
+                    }
+                }
+                next unless $delPath or $$tagInfo{List} or $addLang;
+                if ($delPath) {
+                    $path = $delPath;
+                    $deleted = 1;
+                } else {
+                    # don't change tag if we couldn't delete old copy
+                    # unless this is a list or an lang-alt tag
+                    next unless $$tagInfo{List} or $oldLang;
+                    # (match last index to put in same lang-alt list for Bag of lang-alt items)
+                    $path =~ m/.* (\d+)/g or warn "Internal error: no list index!\n", next;
+                    $added = $1;
+                }
+            } else {
+                # are never overwriting, so we must be adding to a list
+                # match the last index unless this is a list of lang-alt lists
+                my $pat = $writable eq 'lang-alt' ? '.* (\d+)(.*? \d+)' : '.* (\d+)';
+                if ($path =~ m/$pat/g) {
+                    $added = $1;
+                    # set position to end of matching index number
+                    pos($path) = pos($path) - length($2) if $2;
+                }
+            }
+            if (defined $added) {
+                my $len = length $added;
+                my $pos = pos($path) - $len;
+                my $nxt = substr($added, 1) + 1;
+                # always insert x-default lang-alt entry first (as per XMP spec)
+                # (need to test $overwrite because this will be a new lang-alt entry otherwise)
+                if ($overwrite and $writable eq 'lang-alt' and (not $$tagInfo{LangCode} or
+                    $$tagInfo{LangCode} eq 'x-default'))
+                {
+                    my $saveCap = $capture{$path};
+                    for (;;) {
+                        my $p = $path;
+                        substr($p, $pos, $len) = length($nxt) . $nxt;
+                        # increment index in the path of the existing item
+                        my $nextCap = $capture{$p};
+                        $capture{$p} = $saveCap;
+                        last unless $nextCap;
+                        $saveCap = $nextCap;
+                        ++$nxt;
+                    }
+                } else {
+                    # add to end of list
+                    for (;;) {
+                        my $try = length($nxt) . $nxt;
+                        substr($path, $pos, $len) = $try;
+                        last unless $capture{$path};
+                        $len = length $try;
+                        ++$nxt;
+                    }
+                }
+            }
+        }
+        # check to see if we want to create this tag
+        # (create non-avoided tags in XMP data files by default)
+        my $isCreating = (Image::ExifTool::IsCreating($nvHash) or $isStruct or
+                          ($preferred and not $$tagInfo{Avoid} and
+                            not defined $$nvHash{Shift}));
+
+        # don't add new values unless...
+            # ...tag existed before and was deleted, or we added it to a list
+        next unless $deleted or defined $added or
+            # ...tag didn't exist before and we are creating it
+            (not $cap and $isCreating);
+
+        # get list of new values (all done if no new values specified)
+        my @newValues = Image::ExifTool::GetNewValues($nvHash) or next;
+
+        # set language attribute for lang-alt lists
+        $attrs{'xml:lang'} = $$tagInfo{LangCode} || 'x-default' if $writable eq 'lang-alt';
+
+        # add new value(s) to %capture hash
+        my $subIdx;
+        for (;;) {
+            my $newValue = shift @newValues;
+            if ($isStruct) {
+                ++$changed if AddNewStruct($exifTool, $tagInfo, \%capture,
+                                           $path, $newValue, $$tagInfo{Struct});
+            } else {
+                $newValue = EscapeXML($newValue);
+                if ($$tagInfo{Resource}) {
+                    $capture{$path} = [ '', { %attrs, 'rdf:resource' => $newValue } ];
+                } else {
+                    $capture{$path} = [ $newValue, \%attrs ];
+                }
+                if ($verbose > 1) {
+                    my $grp = $exifTool->GetGroup($tagInfo, 1);
+                    $exifTool->VerboseValue("+ $grp:$$tagInfo{Name}", $newValue);
+                }
+                ++$changed;
+                # add rdf:type if necessary
+                if ($$tagInfo{StructType}) {
+                    AddStructType($exifTool, $$tagInfo{Table}, \%capture, $path);
+                }
+            }
+            last unless @newValues;
+            # match last index except for lang-alt items where we want to put each
+            # item in a different lang-alt list (so match the 2nd-last for these)
+            my $pat = $writable eq 'lang-alt' ? '.* (\d+)(.*? \d+)' : '.* (\d+)';
+            $path =~ m/$pat/g or warn("Internal error: no list index for $tag!\n"), next;
+            my $idx = $1;
+            my $len = length $1;
+            my $pos = pos($path) - $len - ($2 ? length $2 : 0);
+            # generate unique list sub-indices to store additional values in sequence
+            if ($subIdx) {
+                $idx = substr($idx, 0, -length($subIdx));   # remove old sub-index
+                $subIdx = substr($subIdx, 1) + 1;
+                $subIdx = length($subIdx) . $subIdx;
+            } else {
+                $subIdx = '10';
+            }
+            substr($path, $pos, $len) = $idx . $subIdx;
+        }
+    }
+    # remove the ExifTool members we created
+    delete $exifTool->{XMP_CAPTURE};
+    delete $exifTool->{XMP_NS};
+
+    my $maxDataLen = $$dirInfo{MaxDataLen};
+    # get DataPt again because it may have been set by ProcessXMP
+    $dataPt = $$dirInfo{DataPt};
+    # return now if we didn't change anything
+    unless ($changed or ($maxDataLen and $dataPt and defined $$dataPt and
+        length($$dataPt) > $maxDataLen))
+    {
+        return undef unless $xmpFile;   # just rewrite original XMP
+        Write($$dirInfo{OutFile}, $$dataPt) or return -1 if $dataPt and defined $$dataPt;
+        return 1;
+    }
+#
+# write out the new XMP information (serialize it)
+#
+    # start writing the XMP data
+    my $newData = '';
+    if ($$exifTool{XMP_NO_XPACKET}) {
+        # write BOM if flag is set
+        $newData .= "\xef\xbb\xbf" if $$exifTool{XMP_NO_XPACKET} == 2;
+    } else {
+        $newData .= $pktOpen;
+    }
+    $newData .= $xmlOpen if $$exifTool{XMP_IS_XML};
+    $newData .= $xmpOpen . $rdfOpen;
+
+    # initialize current property path list
+    my (@curPropList, @writeLast, @descStart, $extStart);
+    my (%nsCur, $prop, $n, $path);
+    my @pathList = sort TypeFirst keys %capture;
+    # order properties to write large values last if we have a MaxDataLen limit
+    if ($maxDataLen and @pathList) {
+        my @pathTmp;
+        my ($lastProp, $lastNS, $propSize) = ('', '', 0);
+        my @pathLoop = (@pathList, ''); # add empty path to end of list for loop
+        undef @pathList;
+        foreach $path (@pathLoop) {
+            $path =~ /^((\w*)[^\/]*)/;  # get path element ($1) and ns ($2)
+            if ($1 eq $lastProp) {
+                push @pathTmp, $path;   # accumulate all paths with same root
+            } else {
+                # put in list to write last if recommended or values are too large
+                if ($extendedRes{$lastProp} or $extendedRes{$lastNS} or
+                    $propSize > $newDescThresh)
+                {
+                    push @writeLast, @pathTmp;
+                } else {
+                    push @pathList, @pathTmp;
+                }
+                last unless $path;      # all done if we hit empty path
+                @pathTmp = ( $path );
+                ($lastProp, $lastNS, $propSize) = ($1, $2, 0);
+            }
+            $propSize += length $capture{$path}->[0];
+        }
+    }
+
+    # write out all properties
+    for (;;) {
+        my (%nsNew, $newDesc);
+        unless (@pathList) {
+            last unless @writeLast;
+            @pathList = @writeLast;
+            undef @writeLast;
+            $extStart = length $newData;
+            $newDesc = 1;   # start with a new description
+        }
+        $path = shift @pathList;
+        my @propList = split('/',$path); # get property list
+        # must open/close rdf:Description too
+        unshift @propList, $rdfDesc;
+        # make sure we have defined all necessary namespaces
+        foreach $prop (@propList) {
+            $prop =~ /(.*):/ or next;
+            $1 eq 'rdf' and next;       # rdf namespace already defined
+            my $uri = $nsUsed{$1};
+            unless ($uri) {
+                $uri = $nsURI{$1};      # we must have added a namespace
+                $uri or $xmpErr = "Undefined XMP namespace: $1", next;
+            }
+            $nsNew{$1} = $uri;
+            # need a new description if any new namespaces
+            $newDesc = 1 unless $nsCur{$1};
+        }
+        my $closeTo = 0;
+        if ($newDesc) {
+            # look forward to see if we will want to also open other namespaces
+            # at this level (this is necessary to keep lists and structures from
+            # being broken if a property introduces a new namespace; plus it
+            # improves formatting)
+            my ($path2, $ns2);
+            foreach $path2 (@pathList) {
+                my @ns2s = ($path2 =~ m{(?:^|/)([^/]+?):}g);
+                my $opening = 0;
+                foreach $ns2 (@ns2s) {
+                    next if $ns2 eq 'rdf';
+                    $nsNew{$ns2} and ++$opening, next;
+                    last unless $opening;
+                    # get URI for this existing or new namespace
+                    my $uri = $nsUsed{$ns2} || $nsURI{$ns2} or last;
+                    $nsNew{$ns2} = $uri; # also open this namespace
+                }
+                last unless $opening;
+            }
+        } else {
+            # find first property where the current path differs from the new path
+            for ($closeTo=0; $closeTo<@curPropList; ++$closeTo) {
+                last unless $closeTo < @propList;
+                last unless $propList[$closeTo] eq $curPropList[$closeTo];
+            }
+        }
+        # close out properties down to the common base path
+        while (@curPropList > $closeTo) {
+            ($prop = pop @curPropList) =~ s/ .*//;
+            $newData .= (' ' x scalar(@curPropList)) . " </$prop>\n";
+        }
+        if ($newDesc) {
+            # save rdf:Description start positions so we can reorder them if necessary
+            push @descStart, length($newData) if $maxDataLen;
+            # open the new description
+            $prop = $rdfDesc;
+            %nsCur = %nsNew;            # save current namespaces
+            $newData .= "\n <$prop rdf:about='$about'";
+            my @ns = sort keys %nsCur;
+            # generate et:toolkit attribute if this is an exiftool RDF/XML output file
+            if (@ns and $nsCur{$ns[0]} =~ m{^http://ns.exiftool.ca/}) {
+                $newData .= "\n  xmlns:et='http://ns.exiftool.ca/1.0/'" .
+                            " et:toolkit='Image::ExifTool $Image::ExifTool::VERSION'";
+            }
+            foreach (@ns) {
+                $newData .= "\n  xmlns:$_='$nsCur{$_}'";
+            }
+            $newData .= ">\n";
+            push @curPropList, $prop;
+        }
+        # loop over all values for this new property
+        my ($val, $attrs) = @{$capture{$path}};
+        $debug and print "$path = $val\n";
+        # open new properties
+        my $attr;
+        for ($n=@curPropList; $n<$#propList; ++$n) {
+            $prop = $propList[$n];
+            push @curPropList, $prop;
+            # remove list index if it exists
+            $prop =~ s/ .*//;
+            $attr = '';
+            if ($prop ne $rdfDesc and ($propList[$n+1] !~ /^rdf:/ or
+                ($propList[$n+1] eq 'rdf:type' and $n+1 == $#propList)))
+            {
+                # need parseType='Resource' to avoid new 'rdf:Description'
+                $attr = " rdf:parseType='Resource'";
+            }
+            $newData .= (' ' x scalar(@curPropList)) . "<$prop$attr>\n";
+        }
+        my $prop2 = pop @propList;  # get new property name
+        $prop2 =~ s/ .*//;          # remove list index if it exists
+        $newData .= (' ' x scalar(@curPropList)) . " <$prop2";
+        # write out attributes
+        foreach $attr (sort keys %$attrs) {
+            my $attrVal = $$attrs{$attr};
+            my $quot = ($attrVal =~ /'/) ? '"' : "'";
+            $newData .= " $attr=$quot$attrVal$quot";
+        }
+        $newData .= length $val ? ">$val</$prop2>\n" : "/>\n";
+    }
+    # close off any open elements
+    while ($prop = pop @curPropList) {
+        $prop =~ s/ .*//;   # remove list index if it exists
+        $newData .= (' ' x scalar(@curPropList)) . " </$prop>\n";
+    }
+    # limit XMP length and re-arrange if necessary to fit inside specified size
+    my $compact = $$dirInfo{Compact} || $exifTool->Options('Compact');
+    if ($maxDataLen) {
+        # adjust maxDataLen to allow room for closing elements
+        $maxDataLen -= length($rdfClose) + length($xmpClose) + length($pktCloseW);
+        $extStart or $extStart = length $newData;
+        my @rtn = LimitXMPSize($exifTool, \$newData, $maxDataLen, $about, \@descStart, $extStart);
+        # return extended XMP information in $dirInfo
+        $$dirInfo{ExtendedXMP} = $rtn[0];
+        $$dirInfo{ExtendedGUID} = $rtn[1];
+        # compact if necessary to fit
+        $compact = 1 if length($newData) + 101 * $numPadLines > $maxDataLen;
+    }
+#
+# close out the XMP, clean up, and return our data
+#
+    $newData .= $rdfClose;
+    $newData .= $xmpClose unless $exifTool->{XMP_NO_XMPMETA};
+
+    # remove the ExifTool members we created
+    delete $exifTool->{XMP_CAPTURE};
+    delete $exifTool->{XMP_NS};
+    delete $exifTool->{XMP_NO_XMPMETA};
+
+    # (the XMP standard recommends writing 2k-4k of white space before the
+    # packet trailer, with a newline every 100 characters)
+    unless ($$exifTool{XMP_NO_XPACKET}) {
+        my $pad = (' ' x 100) . "\n";
+        if ($$dirInfo{InPlace}) {
+            # pad to specified DirLen
+            my $len = length($newData) + length($pktCloseW);
+            if ($len > $dirLen) {
+                $exifTool->Warn('Not enough room to edit XMP in place');
+                return undef;
+            }
+            my $num = int(($dirLen - $len) / length($pad));
+            if ($num) {
+                $newData .= $pad x $num;
+                $len += length($pad) * $num;
+            }
+            $len < $dirLen and $newData .= (' ' x ($dirLen - $len - 1)) . "\n";
+        } elsif (not $compact and not $xmpFile and not $$dirInfo{ReadOnly}) {
+            $newData .= $pad x $numPadLines;
+        }
+        $newData .= ($$dirInfo{ReadOnly} ? $pktCloseR : $pktCloseW);
+    }
+    # return empty data if no properties exist and this is allowed
+    unless (%capture or $xmpFile or $$dirInfo{InPlace} or $$dirInfo{NoDelete}) {
+        $newData = '';
+    }
+    if ($xmpErr) {
+        if ($xmpFile) {
+            $exifTool->Error($xmpErr);
+            return -1;
+        }
+        $exifTool->Warn($xmpErr);
+        return undef;
+    }
+    $exifTool->{CHANGED} += $changed;
+    $debug > 1 and $newData and print $newData,"\n";
+    return $newData unless $xmpFile;
+    Write($$dirInfo{OutFile}, $newData) or return -1;
+    return 1;
+}
+
+
+1; # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::WriteXMP.pl - Write XMP meta information
+
+=head1 SYNOPSIS
+
+These routines are autoloaded by Image::ExifTool::XMP.
+
+=head1 DESCRIPTION
+
+This file contains routines to write XMP metadata.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::XMP(3pm)|Image::ExifTool::XMP>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Writer.pl
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Writer.pl	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Writer.pl	(revision 24799)
@@ -0,0 +1,5367 @@
+#------------------------------------------------------------------------------
+# File:         Writer.pl
+#
+# Description:  ExifTool write routines
+#
+# Notes:        Also contains some less used ExifTool functions
+#
+# URL:          http://owl.phy.queensu.ca/~phil/exiftool/
+#
+# Revisions:    12/16/2004 - P. Harvey Created
+#------------------------------------------------------------------------------
+
+package Image::ExifTool;
+
+use strict;
+
+use Image::ExifTool::TagLookup qw(FindTagInfo TagExists);
+use Image::ExifTool::Fixup;
+
+sub AssembleRational($$@);
+sub LastInList($);
+sub CreateDirectory($);
+sub RemoveNewValueHash($$$);
+sub RemoveNewValuesForGroup($$);
+sub GetWriteGroup1($$);
+sub Sanitize($$);
+sub ConvInv($$$$$;$$);
+
+my $loadedAllTables;    # flag indicating we loaded all tables
+
+# the following is a road map of where we write each directory
+# in the different types of files.
+my %tiffMap = (
+    IFD0         => 'TIFF',
+    IFD1         => 'IFD0',
+    XMP          => 'IFD0',
+    ICC_Profile  => 'IFD0',
+    ExifIFD      => 'IFD0',
+    GPS          => 'IFD0',
+    SubIFD       => 'IFD0',
+    GlobParamIFD => 'IFD0',
+    PrintIM      => 'IFD0',
+    IPTC         => 'IFD0',
+    Photoshop    => 'IFD0',
+    InteropIFD   => 'ExifIFD',
+    MakerNotes   => 'ExifIFD',
+    CanonVRD     => 'MakerNotes', # (so VRDOffset will get updated)
+    NikonCapture => 'MakerNotes', # (to allow delete by group)
+);
+my %exifMap = (
+    IFD1         => 'IFD0',
+    EXIF         => 'IFD0', # to write EXIF as a block
+    ExifIFD      => 'IFD0',
+    GPS          => 'IFD0',
+    SubIFD       => 'IFD0',
+    GlobParamIFD => 'IFD0',
+    PrintIM      => 'IFD0',
+    InteropIFD   => 'ExifIFD',
+    MakerNotes   => 'ExifIFD',
+    NikonCapture => 'MakerNotes', # (to allow delete by group)
+    # (no CanonVRD trailer allowed)
+);
+my %jpegMap = (
+    %exifMap, # covers all JPEG EXIF mappings
+    JFIF         => 'APP0',
+    CIFF         => 'APP0',
+    IFD0         => 'APP1',
+    XMP          => 'APP1',
+    ICC_Profile  => 'APP2',
+    FlashPix     => 'APP2',
+    Meta         => 'APP3',
+    MetaIFD      => 'Meta',
+    RMETA        => 'APP5',
+    Ducky        => 'APP12',
+    Photoshop    => 'APP13',
+    IPTC         => 'Photoshop',
+    MakerNotes   => ['ExifIFD', 'CIFF'], # (first parent is the default)
+    CanonVRD     => 'MakerNotes', # (so VRDOffset will get updated)
+    NikonCapture => 'MakerNotes', # (to allow delete by group)
+    Comment      => 'COM',
+);
+my %dirMap = (
+    JPEG => \%jpegMap,
+    TIFF => \%tiffMap,
+    ORF  => \%tiffMap,
+    RAW  => \%tiffMap,
+    EXIF => \%exifMap,
+);
+
+# groups we are allowed to delete
+# Notes:
+# 1) these names must either exist in %dirMap, or be translated in InitWriteDirs())
+# 2) any dependencies must be added to %excludeGroups
+my @delGroups = qw(
+    AFCP CanonVRD CIFF Ducky EXIF ExifIFD File FlashPix FotoStation GlobParamIFD
+    GPS ICC_Profile IFD0 IFD1 InteropIFD IPTC JFIF MakerNotes Meta MetaIFD MIE
+    NikonCapture PDF PDF-update PhotoMechanic Photoshop PNG PrintIM RMETA RSRC
+    SubIFD Trailer XML XML-* XMP XMP-*
+);
+# other group names of new tag values to remove when deleting an entire group
+my %removeGroups = (
+    IFD0    => [ 'EXIF', 'MakerNotes' ],
+    EXIF    => [ 'MakerNotes' ],
+    ExifIFD => [ 'MakerNotes', 'InteropIFD' ],
+    Trailer => [ 'CanonVRD' ], #(because we can add back CanonVRD as a block)
+);
+# related family 0/1 groups in @delGroups (and not already in %jpegMap)
+# that must be removed from delete list when excluding a group
+my %excludeGroups = (
+    EXIF         => [ qw(IFD0 IFD1 ExifIFD GPS MakerNotes GlobParamIFD InteropIFD PrintIM SubIFD) ],
+    IFD0         => [ 'EXIF' ],
+    IFD1         => [ 'EXIF' ],
+    ExifIFD      => [ 'EXIF' ],
+    GPS          => [ 'EXIF' ],
+    MakerNotes   => [ 'EXIF' ],
+    InteropIFD   => [ 'EXIF' ],
+    GlobParamIFD => [ 'EXIF' ],
+    PrintIM      => [ 'EXIF' ],
+    CIFF         => [ 'MakerNotes' ],
+    # technically correct, but very uncommon and not a good reason to avoid deleting trailer
+  # IPTC         => [ qw(AFCP FotoStation Trailer) ],
+    AFCP         => [ 'Trailer' ],
+    FotoStation  => [ 'Trailer' ],
+    CanonVRD     => [ 'Trailer' ],
+    PhotoMechanic=> [ 'Trailer' ],
+    MIE          => [ 'Trailer' ],
+);
+# group names to translate for writing
+my %translateWriteGroup = (
+    EXIF => 'ExifIFD',
+    Meta => 'MetaIFD',
+    File => 'Comment',
+    MIE  => 'MIE',
+);
+# names of valid EXIF and Meta directories:
+my %exifDirs = (
+    gps          => 'GPS',
+    exififd      => 'ExifIFD',
+    subifd       => 'SubIFD',
+    globparamifd => 'GlobParamIFD',
+    interopifd   => 'InteropIFD',
+    makernotes   => 'MakerNotes',
+    previewifd   => 'PreviewIFD', # (in MakerNotes)
+    metaifd      => 'MetaIFD', # Kodak APP3 Meta
+);
+# min/max values for integer formats
+my %intRange = (
+    'int8u'  => [0, 0xff],
+    'int8s'  => [-0x80, 0x7f],
+    'int16u' => [0, 0xffff],
+    'int16uRev' => [0, 0xffff],
+    'int16s' => [-0x8000, 0x7fff],
+    'int32u' => [0, 0xffffffff],
+    'int32s' => [-0x80000000, 0x7fffffff],
+);
+# lookup for file types with block-writable EXIF
+my %blockExifTypes = ( JPEG=>1, PNG=>1, JP2=>1, MIE=>1, EXIF=>1 );
+
+my $maxSegmentLen = 0xfffd;     # maximum length of data in a JPEG segment
+my $maxXMPLen = $maxSegmentLen; # maximum length of XMP data in JPEG
+
+# value separators when conversion list is used (in SetNewValue)
+my %listSep = ( PrintConv => '; ?', ValueConv => ' ' );
+
+# printConv hash keys to ignore when doing reverse lookup
+my %ignorePrintConv = ( OTHER => 1, BITMASK => 1, Notes => 1 );
+
+#------------------------------------------------------------------------------
+# Set tag value
+# Inputs: 0) ExifTool object reference
+#         1) tag key, tag name, or '*' (optionally prefixed by group name),
+#            or undef to reset all previous SetNewValue() calls
+#         2) new value (scalar, scalar ref or list ref), or undef to delete tag
+#         3-N) Options:
+#           Type => PrintConv, ValueConv or Raw - specifies value type
+#           AddValue => true to add to list of existing values instead of overwriting
+#           DelValue => true to delete this existing value value from a list
+#           Group => family 0 or 1 group name (case insensitive)
+#           Replace => 0, 1 or 2 - overwrite previous new values (2=reset)
+#           Protected => bitmask to write tags with specified protections
+#           EditOnly => true to only edit existing tags (don't create new tag)
+#           EditGroup => true to only edit existing groups (don't create new group)
+#           Shift => undef, 0, +1 or -1 - shift value if possible
+#           NoShortcut => true to prevent looking up shortcut tags
+#           CreateGroups => [internal use] createGroups hash ref from related tags
+#           ListOnly => [internal use] set only list or non-list tags
+#           SetTags => [internal use] hash ref to return tagInfo refs of set tags
+# Returns: number of tags set (plus error string in list context)
+# Notes: For tag lists (like Keywords), call repeatedly with the same tag name for
+#        each value in the list.  Internally, the new information is stored in
+#        the following members of the $self->{NEW_VALUE}{$tagInfo} hash:
+#           TagInfo - tag info ref
+#           DelValue - list ref for values to delete
+#           Value - list ref for values to add
+#           IsCreating - must be set for the tag to be added, otherwise just
+#                        changed if it already exists.  Set to 2 to not create group
+#           CreateGroups - hash of all family 0 group names where tag may be created
+#           WriteGroup - group name where information is being written (correct case)
+#           WantGroup - group name as specified in call to function (case insensitive)
+#           Next - pointer to next new value hash (if more than one)
+#           Self - ExifTool object reference
+#           Shift - shift value
+#           MAKER_NOTE_FIXUP - pointer to fixup if necessary for a maker note value
+sub SetNewValue($;$$%)
+{
+    local $_;
+    my ($self, $tag, $value, %options) = @_;
+    my ($err, $tagInfo);
+    my $verbose = $self->{OPTIONS}{Verbose};
+    my $out = $self->{OPTIONS}{TextOut};
+    my $protected = $options{Protected} || 0;
+    my $listOnly = $options{ListOnly};
+    my $setTags = $options{SetTags};
+    my $numSet = 0;
+
+    unless (defined $tag) {
+        # remove any existing set values
+        delete $self->{NEW_VALUE};
+        $self->{DEL_GROUP} = { };
+        $verbose > 1 and print $out "Cleared new values\n";
+        return 1;
+    }
+    # allow value to be scalar or list reference
+    if (ref $value) {
+        if (ref $value eq 'ARRAY') {
+            # (since value is an ARRAY, it will have more than one entry)
+            # set all list-type tags first
+            my $replace = $options{Replace};
+            foreach (@$value) {
+                my ($n, $e) = SetNewValue($self, $tag, $_, %options, ListOnly => 1);
+                $err = $e if $e;
+                $numSet += $n;
+                delete $options{Replace}; # don't replace earlier values in list
+            }
+            # and now set only non-list tags
+            $value = join $self->{OPTIONS}{ListSep}, @$value;
+            $options{Replace} = $replace;
+            $listOnly = $options{ListOnly} = 0;
+        } elsif (ref $value eq 'SCALAR') {
+            $value = $$value;
+        }
+    }
+    # un-escape as necessary and make sure the Perl UTF-8 flag is OFF for the value
+    # if perl is 5.6 or greater (otherwise our byte manipulations get corrupted!!)
+    $self->Sanitize(\$value) if defined $value and not ref $value;
+
+    # set group name in options if specified
+    if ($tag =~ /(.*):(.+)/) {
+        $options{Group} = $1 if $1 ne '*' and lc($1) ne 'all';
+        $tag = $2;
+    }
+    # allow trailing '#' for ValueConv value
+    $options{Type} = 'ValueConv' if $tag =~ s/#$//;
+    # ignore leading family number if 0 or 1 specified
+    if ($options{Group} and $options{Group} =~ /^(\d+)(.*)/ and $1 < 2) {
+        $options{Group} = $2;
+    }
+#
+# get list of tags we want to set
+#
+    my $wantGroup = $options{Group};
+    $tag =~ s/ .*//;    # convert from tag key to tag name if necessary
+    my @matchingTags = FindTagInfo($tag);
+    until (@matchingTags) {
+        if ($tag eq '*' or lc($tag) eq 'all') {
+            # set groups to delete
+            if (defined $value) {
+                $err = "Can't set value for all tags";
+            } else {
+                my (@del, $grp);
+                my $remove = ($options{Replace} and $options{Replace} > 1);
+                if ($wantGroup) {
+                    @del = grep /^$wantGroup$/i, @delGroups unless $wantGroup =~ /^XM[LP]-\*$/i;
+                    # remove associated groups when excluding from mass delete
+                    if (@del and $remove) {
+                        # remove associated groups in other family
+                        push @del, @{$excludeGroups{$del[0]}} if $excludeGroups{$del[0]};
+                        # remove upstream groups according to JPEG map
+                        my $dirName = $del[0];
+                        my @dirNames;
+                        for (;;) {
+                            my $parent = $jpegMap{$dirName};
+                            if (ref $parent) {
+                                push @dirNames, @$parent;
+                                $parent = pop @dirNames;
+                            }
+                            $dirName = $parent || shift @dirNames or last;
+                            push @del, $dirName;    # exclude this too
+                        }
+                    }
+                    # allow MIE groups to be deleted by number,
+                    # and allow any XMP family 1 group to be deleted
+                    push @del, uc($wantGroup) if $wantGroup =~ /^(MIE\d+|XM[LP]-[-\w]+)$/i;
+                } else {
+                    # push all groups plus '*', except IFD1 and a few others
+                    push @del, (grep !/^(IFD1|SubIFD|InteropIFD|GlobParamIFD|PDF-update)$/, @delGroups), '*';
+                }
+                if (@del) {
+                    ++$numSet;
+                    my @donegrps;
+                    my $delGroup = $self->{DEL_GROUP};
+                    foreach $grp (@del) {
+                        if ($remove) {
+                            my $didExcl;
+                            if ($grp =~ /^(XM[LP])(-.*)?$/) {
+                                my $x = $1;
+                                if ($grp eq $x) {
+                                    # exclude all related family 1 groups too
+                                    foreach (keys %$delGroup) {
+                                        next unless /^-?$x-/;
+                                        push @donegrps, $_ if /^$x/;
+                                        delete $$delGroup{$_};
+                                    }
+                                } elsif ($$delGroup{"$x-*"} and not $$delGroup{"-$grp"}) {
+                                    # must also exclude XMP or XML to prevent bulk delete
+                                    if ($$delGroup{$x}) {
+                                        push @donegrps, $x;
+                                        delete $$delGroup{$x};
+                                    }
+                                    # flag XMP/XML family 1 group for exclusion with leading '-'
+                                    $$delGroup{"-$grp"} = 1;
+                                    $didExcl = 1;
+                                }
+                            }
+                            if (exists $$delGroup{$grp}) {
+                                delete $$delGroup{$grp};
+                            } else {
+                                next unless $didExcl;
+                            }
+                        } else {
+                            $$delGroup{$grp} = 1;
+                            # add flag for XMP/XML family 1 groups if deleting all XMP
+                            if ($grp =~ /^XM[LP]$/) {
+                                $$delGroup{"$grp-*"} = 1;
+                                push @donegrps, "$grp-*";
+                            }
+                            # remove all of this group from previous new values
+                            $self->RemoveNewValuesForGroup($grp);
+                        }
+                        push @donegrps, $grp;
+                    }
+                    if ($verbose > 1 and @donegrps) {
+                        @donegrps = sort @donegrps;
+                        my $msg = $remove ? 'Excluding from deletion' : 'Deleting tags in';
+                        print $out "  $msg: @donegrps\n";
+                    }
+                } else {
+                    $err = "Not a deletable group: $wantGroup";
+                }
+            }
+        } else {
+            my $origTag = $tag;
+            my $langCode;
+            # allow language suffix of form "-en_CA" or "-<rfc3066>" on tag name
+            if ($tag =~ /^(\w+)-([a-z]{2})(_[a-z]{2})$/i or # MIE
+                $tag =~ /^(\w+)-([a-z]{2,3}|[xi])(-[a-z\d]{2,8}(-[a-z\d]{1,8})*)?$/i) # XMP/PNG
+            {
+                $tag = $1;
+                # normalize case of language codes
+                $langCode = lc($2);
+                $langCode .= (length($3) == 3 ? uc($3) : lc($3)) if $3;
+                my @newMatches = FindTagInfo($tag);
+                foreach $tagInfo (@newMatches) {
+                    # only allow language codes in tables which support them
+                    next unless $$tagInfo{Table};
+                    my $langInfoProc = $tagInfo->{Table}{LANG_INFO} or next;
+                    my $langInfo = &$langInfoProc($tagInfo, $langCode);
+                    push @matchingTags, $langInfo if $langInfo;
+                }
+                last if @matchingTags;
+            } else {
+                # look for a shortcut or alias
+                require Image::ExifTool::Shortcuts;
+                my ($match) = grep /^\Q$tag\E$/i, keys %Image::ExifTool::Shortcuts::Main;
+                undef $err;
+                if ($match and not $options{NoShortcut}) {
+                    if (@{$Image::ExifTool::Shortcuts::Main{$match}} == 1) {
+                        $tag = $Image::ExifTool::Shortcuts::Main{$match}[0];
+                        @matchingTags = FindTagInfo($tag);
+                        last if @matchingTags;
+                    } else {
+                        $options{NoShortcut} = 1;
+                        foreach $tag (@{$Image::ExifTool::Shortcuts::Main{$match}}) {
+                            my ($n, $e) = $self->SetNewValue($tag, $value, %options);
+                            $numSet += $n;
+                            $e and $err = $e;
+                        }
+                        undef $err if $numSet;  # no error if any set successfully
+                        return ($numSet, $err) if wantarray;
+                        $err and warn "$err\n";
+                        return $numSet;
+                    }
+                }
+            }
+            if (not TagExists($tag)) {
+                $err = "Tag '$origTag' does not exist";
+                $err .= ' or has a bad language code' if $origTag =~ /-/;
+            } elsif ($langCode) {
+                $err = "Tag '$tag' does not support alternate languages";
+            } elsif ($wantGroup) {
+                $err = "Sorry, $wantGroup:$origTag doesn't exist or isn't writable";
+            } else {
+                $err = "Sorry, $origTag is not writable";
+            }
+            $verbose > 2 and print $out "$err\n";
+        }
+        # all done
+        return ($numSet, $err) if wantarray;
+        $err and warn "$err\n";
+        return $numSet;
+    }
+    # get group name that we're looking for
+    my $foundMatch = 0;
+    my ($ifdName, $mieGroup);
+    if ($wantGroup) {
+        # set $ifdName if this group is a valid IFD or SubIFD name
+        if ($wantGroup =~ /^IFD(\d+)$/i) {
+            $ifdName = "IFD$1";
+        } elsif ($wantGroup =~ /^SubIFD(\d+)$/i) {
+            $ifdName = "SubIFD$1";
+        } elsif ($wantGroup =~ /^Version(\d+)$/i) {
+            $ifdName = "Version$1"; # Sony IDC VersionIFD
+        } elsif ($wantGroup =~ /^MIE(\d*-?)(\w+)$/i) {
+            $mieGroup = "MIE$1" . ucfirst(lc($2));
+        } else {
+            $ifdName = $exifDirs{lc($wantGroup)};
+            if (not $ifdName and $wantGroup =~ /^XMP\b/i) {
+                # must load XMP table to set group1 names
+                my $table = GetTagTable('Image::ExifTool::XMP::Main');
+                my $writeProc = $table->{WRITE_PROC};
+                $writeProc and &$writeProc();
+            }
+        }
+    }
+#
+# determine the groups for all tags found, and the tag with
+# the highest priority group
+#
+    my (@tagInfoList, @writeAlsoList, %writeGroup, %preferred, %tagPriority, $avoid, $wasProtected);
+    my $highestPriority = -1;
+    foreach $tagInfo (@matchingTags) {
+        $tag = $tagInfo->{Name};    # set tag so warnings will use proper case
+        my ($writeGroup, $priority);
+        if ($wantGroup) {
+            my $lcWant = lc($wantGroup);
+            # only set tag in specified group
+            $writeGroup = $self->GetGroup($tagInfo, 0);
+            unless (lc($writeGroup) eq $lcWant) {
+                if ($writeGroup eq 'EXIF' or $writeGroup eq 'SonyIDC') {
+                    next unless $ifdName;
+                    # can't yet write PreviewIFD tags
+                    $ifdName eq 'PreviewIFD' and ++$foundMatch, next;
+                    $writeGroup = $ifdName;  # write to the specified IFD
+                } elsif ($writeGroup eq 'MIE') {
+                    next unless $mieGroup;
+                    $writeGroup = $mieGroup; # write to specific MIE group
+                    # set specific write group with document number if specified
+                    if ($writeGroup =~ /^MIE\d+$/ and $tagInfo->{Table}{WRITE_GROUP}) {
+                        $writeGroup = $tagInfo->{Table}{WRITE_GROUP};
+                        $writeGroup =~ s/^MIE/$mieGroup/;
+                    }
+                } elsif (not $$tagInfo{AllowGroup} or $wantGroup !~ /^$$tagInfo{AllowGroup}$/i) {
+                    # allow group1 name to be specified
+                    my $grp1 = $self->GetGroup($tagInfo, 1);
+                    unless ($grp1 and lc($grp1) eq $lcWant) {
+                        # must also check group1 name directly in case it is different
+                        $grp1 = $tagInfo->{Groups}{1};
+                        next unless $grp1 and lc($grp1) eq $lcWant;
+                    }
+                }
+            }
+            $priority = 1000;   # highest priority since group was specified
+        }
+        ++$foundMatch;
+        # must do a dummy call to the write proc to autoload write package
+        # before checking Writable flag
+        my $table = $tagInfo->{Table};
+        my $writeProc = $table->{WRITE_PROC};
+        # load source table if this was a user-defined table
+        if ($$table{SRC_TABLE}) {
+            my $src = GetTagTable($$table{SRC_TABLE});
+            $writeProc = $$src{WRITE_PROC} unless $writeProc;
+        }
+        next unless $writeProc and &$writeProc();
+        # must still check writable flags in case of UserDefined tags
+        my $writable = $tagInfo->{Writable};
+        next unless $writable or ($table->{WRITABLE} and
+            not defined $writable and not $$tagInfo{SubDirectory});
+        # set specific write group (if we didn't already)
+        if (not $writeGroup or $translateWriteGroup{$writeGroup}) {
+            # use default write group
+            $writeGroup = $tagInfo->{WriteGroup} || $tagInfo->{Table}{WRITE_GROUP};
+            # use group 0 name if no WriteGroup specified
+            my $group0 = $self->GetGroup($tagInfo, 0);
+            $writeGroup or $writeGroup = $group0;
+            # get priority for this group
+            unless ($priority) {
+                $priority = $self->{WRITE_PRIORITY}{lc($writeGroup)};
+                unless ($priority) {
+                    $priority = $self->{WRITE_PRIORITY}{lc($group0)} || 0;
+                }
+            }
+        }
+        # don't write tag if protected
+        if ($tagInfo->{Protected}) {
+            my $prot = $tagInfo->{Protected} & ~$protected;
+            if ($prot) {
+                my %lkup = ( 1=>'unsafe', 2=>'protected', 3=>'unsafe and protected');
+                $wasProtected = $lkup{$prot};
+                if ($verbose > 1) {
+                    my $wgrp1 = $self->GetWriteGroup1($tagInfo, $writeGroup);
+                    print $out "Not writing $wgrp1:$tag ($wasProtected)\n";
+                }
+                next;
+            }
+        }
+        # set priority for this tag
+        $tagPriority{$tagInfo} = $priority;
+        if ($priority > $highestPriority) {
+            $highestPriority = $priority;
+            %preferred = ( $tagInfo => 1 );
+            $avoid = 0;
+            ++$avoid if $$tagInfo{Avoid};
+        } elsif ($priority == $highestPriority) {
+            # create all tags with highest priority
+            $preferred{$tagInfo} = 1;
+            ++$avoid if $$tagInfo{Avoid};
+        }
+        if ($$tagInfo{WriteAlso}) {
+            # store WriteAlso tags separately so we can set them first
+            push @writeAlsoList, $tagInfo;
+        } else {
+            push @tagInfoList, $tagInfo;
+        }
+        $writeGroup{$tagInfo} = $writeGroup;
+    }
+    # sort tag info list in reverse order of priority (higest number last)
+    # so we get the highest priority error message in the end
+    @tagInfoList = sort { $tagPriority{$a} <=> $tagPriority{$b} } @tagInfoList;
+    # must write any tags which also write other tags first
+    unshift @tagInfoList, @writeAlsoList if @writeAlsoList;
+
+    # don't create tags with priority 0 if group priorities are set
+    if ($highestPriority == 0 and %{$self->{WRITE_PRIORITY}}) {
+        undef %preferred;
+    }
+    # avoid creating tags with 'Avoid' flag set if there are other alternatives
+    if ($avoid and %preferred) {
+        if ($avoid < scalar(keys %preferred)) {
+            # just remove the 'Avoid' tags since there are other preferred tags
+            foreach $tagInfo (@tagInfoList) {
+                delete $preferred{$tagInfo} if $$tagInfo{Avoid};
+            }
+        } elsif ($highestPriority < 1000) {
+            # look for another priority tag to create instead
+            my $nextHighest = 0;
+            my @nextBestTags;
+            foreach $tagInfo (@tagInfoList) {
+                my $priority = $tagPriority{$tagInfo} or next;
+                next if $priority == $highestPriority;
+                next if $priority < $nextHighest;
+                next if $$tagInfo{Avoid} or $$tagInfo{Permanent};
+                next if $writeGroup{$tagInfo} eq 'MakerNotes';
+                if ($nextHighest < $priority) {
+                    $nextHighest = $priority;
+                    undef @nextBestTags;
+                }
+                push @nextBestTags, $tagInfo;
+            }
+            if (@nextBestTags) {
+                # change our preferred tags to the next best tags
+                undef %preferred;
+                foreach $tagInfo (@nextBestTags) {
+                    $preferred{$tagInfo} = 1;
+                }
+            }
+        }
+    }
+#
+# generate new value hash for each tag
+#
+    my ($prioritySet, $createGroups, %alsoWrote);
+
+    delete $$self{CHECK_WARN};  # reset CHECK_PROC warnings
+
+    # loop through all valid tags to find the one(s) to write
+    foreach $tagInfo (@tagInfoList) {
+        next if $alsoWrote{$tagInfo};   # don't rewrite tags we already wrote
+        # only process List or non-List tags if specified
+        next if defined $listOnly and ($listOnly xor $$tagInfo{List});
+        my $noConv;
+        my $writeGroup = $writeGroup{$tagInfo};
+        my $permanent = $$tagInfo{Permanent};
+        $writeGroup eq 'MakerNotes' and $permanent = 1 unless defined $permanent;
+        my $wgrp1 = $self->GetWriteGroup1($tagInfo, $writeGroup);
+        $tag = $tagInfo->{Name};    # get proper case for tag name
+        my $shift = $options{Shift};
+        if (defined $shift) {
+            # (can't currently shift List-type tags)
+            if ($tagInfo->{Shift} and not $tagInfo->{List}) {
+                unless ($shift) {
+                    # set shift according to AddValue/DelValue
+                    $shift = 1 if $options{AddValue};
+                    $shift = -1 if $options{DelValue};
+                }
+                if ($shift and (not defined $value or not length $value)) {
+                    # (now allow -= to be used for shiftable tag - v8.05)
+                    #$err = "No value for time shift of $wgrp1:$tag";
+                    #$verbose > 2 and print $out "$err\n";
+                    #next;
+                    undef $shift;
+                }
+            } elsif ($shift) {
+                $err = "$wgrp1:$tag is not shiftable";
+                $verbose > 2 and print $out "$err\n";
+                next;
+            }
+        }
+        my $val = $value;
+        if (defined $val) {
+            # check to make sure this is a List or Shift tag if adding
+            if ($options{AddValue} and not ($shift or $tagInfo->{List})) {
+                $err = "Can't add $wgrp1:$tag (not a List type)";
+                $verbose > 2 and print $out "$err\n";
+                next;
+            }
+            if ($shift) {
+                # add '+' or '-' prefix to indicate shift direction
+                $val = ($shift > 0 ? '+' : '-') . $val;
+                # check the shift for validity
+                require 'Image/ExifTool/Shift.pl';
+                my $err2 = CheckShift($tagInfo->{Shift}, $val);
+                if ($err2) {
+                    $err = "$err2 for $wgrp1:$tag";
+                    $verbose > 2 and print $out "$err\n";
+                    next;
+                }
+                $noConv = 1;    # no conversions if shifting tag
+            } elsif (not length $val and $options{DelValue}) {
+                $noConv = 1;    # no conversions for deleting empty value
+            } elsif (ref $val eq 'HASH' and not $$tagInfo{Struct}) {
+                $err = "Can't write a structure to $wgrp1:$tag";
+                $verbose > 2 and print $out "$err\n";
+                next;
+            }
+        } elsif ($permanent) {
+            # can't delete permanent tags, so set them to DelValue or empty string instead
+            if (defined $$tagInfo{DelValue}) {
+                $val = $$tagInfo{DelValue};
+                $noConv = 1;    # DelValue is the raw value, so no conversion necessary
+            } else {
+                $val = '';
+            }
+        } elsif ($options{AddValue} or $options{DelValue}) {
+            $err = "No value to add or delete in $wgrp1:$tag";
+            $verbose > 2 and print $out "$err\n";
+            next;
+        } else {
+            if ($tagInfo->{DelCheck}) {
+                #### eval DelCheck ($self, $tagInfo, $wantGroup)
+                my $err2 = eval $tagInfo->{DelCheck};
+                $@ and warn($@), $err2 = 'Error evaluating DelCheck';
+                if ($err2) {
+                    $err2 .= ' for' unless $err2 =~ /delete$/;
+                    $err = "$err2 $wgrp1:$tag";
+                    $verbose > 2 and print $out "$err\n";
+                    next;
+                } elsif (defined $err2) {
+                    ++$numSet;  # (allow other tags to be set using DelCheck as a hook)
+                    goto WriteAlso;
+                }
+            }
+            $noConv = 1;    # value is not defined, so don't do conversion
+        }
+        # apply inverse PrintConv and ValueConv conversions
+        # save ValueConv setting for use in ConvInv()
+        unless ($noConv) {
+            # set default conversion type used by ConvInv() and CHECK_PROC routines
+            $$self{ConvType} = $options{Type} || ($self->{OPTIONS}{PrintConv} ? 'PrintConv' : 'ValueConv');
+            my $e;
+            ($val,$e) = $self->ConvInv($val, $tagInfo, $tag, $wgrp1, $$self{ConvType}, $wantGroup);
+            if (defined $e) {
+                if ($e) {
+                    ($err = $e) =~ s/\$wgrp1/$wgrp1/g;
+                } else {
+                    ++$numSet;  # an empty error string causes error to be ignored
+                }
+            }
+        }
+        if (not defined $val and defined $value) {
+            # if value conversion failed, we must still add a NEW_VALUE
+            # entry for this tag it it was a DelValue
+            next unless $options{DelValue};
+            $val = 'xxx never delete xxx';
+        }
+        $self->{NEW_VALUE} or $self->{NEW_VALUE} = { };
+        if ($options{Replace}) {
+            # delete the previous new value
+            $self->GetNewValueHash($tagInfo, $writeGroup, 'delete');
+            # also delete related tag previous new values
+            if ($$tagInfo{WriteAlso}) {
+                my $wtag;
+                foreach $wtag (keys %{$$tagInfo{WriteAlso}}) {
+                    my ($n,$e) = $self->SetNewValue($wtag, undef, Replace=>2);
+                    $numSet += $n;
+                }
+            }
+            $options{Replace} == 2 and ++$numSet, next;
+        }
+
+        if (defined $val) {
+            # we are editing this tag, so create a NEW_VALUE hash entry
+            my $nvHash = $self->GetNewValueHash($tagInfo, $writeGroup, 'create');
+            $nvHash->{WantGroup} = $wantGroup;
+            # save maker note information if writing maker notes
+            if ($$tagInfo{MakerNotes}) {
+                $nvHash->{MAKER_NOTE_FIXUP} = $self->{MAKER_NOTE_FIXUP};
+            }
+            if ($options{DelValue} or $options{AddValue} or $shift) {
+                # flag any AddValue or DelValue by creating the DelValue list
+                $nvHash->{DelValue} or $nvHash->{DelValue} = [ ];
+                if ($shift) {
+                    # add shift value to list
+                    $nvHash->{Shift} = $val;
+                } elsif ($options{DelValue}) {
+                    # don't create if we are replacing a specific value
+                    $nvHash->{IsCreating} = 0 unless $val eq '' or $tagInfo->{List};
+                    # add delete value to list
+                    push @{$nvHash->{DelValue}}, ref $val eq 'ARRAY' ? @$val : $val;
+                    if ($verbose > 1) {
+                        my $verb = $permanent ? 'Replacing' : 'Deleting';
+                        my $fromList = $tagInfo->{List} ? ' from list' : '';
+                        my @vals = (ref $val eq 'ARRAY' ? @$val : $val);
+                        foreach (@vals) {
+                            if (ref $_ eq 'HASH') {
+                                require 'Image/ExifTool/XMPStruct.pl';
+                                $_ = Image::ExifTool::XMP::SerializeStruct($_);
+                            }
+                            print $out "$verb $wgrp1:$tag$fromList if value is '$_'\n";
+                        }
+                    }
+                }
+            }
+            # set priority flag to add only the high priority info
+            # (will only create the priority tag if it doesn't exist,
+            #  others get changed only if they already exist)
+            if ($preferred{$tagInfo} or $tagInfo->{Table}{PREFERRED}) {
+                if ($permanent or $shift) {
+                    # don't create permanent or Shift-ed tag but define IsCreating
+                    # so we know that it is the preferred tag
+                    $nvHash->{IsCreating} = 0;
+                } elsif (($tagInfo->{List} and not $options{DelValue}) or
+                         not ($nvHash->{DelValue} and @{$nvHash->{DelValue}}) or
+                         # also create tag if any DelValue value is empty ('')
+                         grep(/^$/,@{$nvHash->{DelValue}}))
+                {
+                    $nvHash->{IsCreating} = $options{EditOnly} ? 0 : ($options{EditGroup} ? 2 : 1);
+                    # add to hash of groups where this tag is being created
+                    $createGroups or $createGroups = $options{CreateGroups} || { };
+                    $$createGroups{$self->GetGroup($tagInfo, 0)} = 1;
+                    $nvHash->{CreateGroups} = $createGroups;
+                }
+            }
+            if (%{$self->{DEL_GROUP}} and $nvHash->{IsCreating}) {
+                my ($grp, @grps);
+                foreach $grp (keys %{$self->{DEL_GROUP}}) {
+                    next if $self->{DEL_GROUP}{$grp} == 2;
+                    # set flag indicating tags were written after this group was deleted
+                    $self->{DEL_GROUP}{$grp} = 2;
+                    push @grps, $grp;
+                }
+                if ($verbose > 1 and @grps) {
+                    @grps = sort @grps;
+                    print $out "  Writing new tags after deleting groups: @grps\n";
+                }
+            }
+            if ($shift or not $options{DelValue}) {
+                $nvHash->{Value} or $nvHash->{Value} = [ ];
+                if (not $tagInfo->{List}) {
+                    # not a List tag -- overwrite existing value
+                    $nvHash->{Value}[0] = $val;
+                } else {
+                    # add to existing list
+                    push @{$nvHash->{Value}}, ref $val eq 'ARRAY' ? @$val : $val;
+                }
+                if ($verbose > 1) {
+                    my $ifExists = $nvHash->{IsCreating} ?
+                                  ($nvHash->{IsCreating} == 2 ? " if $writeGroup exists" : '') :
+                                  (($nvHash->{DelValue} and @{$nvHash->{DelValue}}) ?
+                                   ' if tag was deleted' : ' if tag exists');
+                    my $verb = ($shift ? 'Shifting' : ($options{AddValue} ? 'Adding' : 'Writing'));
+                    print $out "$verb $wgrp1:$tag$ifExists\n";
+                }
+            }
+        } elsif ($permanent) {
+            $err = "Can't delete $wgrp1:$tag";
+            $verbose > 1 and print $out "$err\n";
+            next;
+        } elsif ($options{AddValue} or $options{DelValue}) {
+            $verbose > 1 and print $out "Adding/Deleting nothing does nothing\n";
+            next;
+        } else {
+            # create empty new value hash entry to delete this tag
+            $self->GetNewValueHash($tagInfo, $writeGroup, 'delete');
+            my $nvHash = $self->GetNewValueHash($tagInfo, $writeGroup, 'create');
+            $nvHash->{WantGroup} = $wantGroup;
+            $verbose > 1 and print $out "Deleting $wgrp1:$tag\n";
+        }
+        ++$numSet;
+        $$setTags{$tagInfo} = 1 if $setTags;
+        $prioritySet = 1 if $preferred{$tagInfo};
+WriteAlso:
+        # also write related tags
+        my $writeAlso = $$tagInfo{WriteAlso};
+        if ($writeAlso) {
+            my ($wtag, $n);
+            local $SIG{'__WARN__'} = \&SetWarning;
+            foreach $wtag (keys %$writeAlso) {
+                my %opts = (
+                    Type => 'ValueConv',
+                    Protected => $protected | 0x02,
+                    AddValue => $options{AddValue},
+                    DelValue => $options{DelValue},
+                    CreateGroups => $createGroups,
+                    SetTags => \%alsoWrote, # remember tags already written
+                );
+                undef $evalWarning;
+                #### eval WriteAlso ($val)
+                my $v = eval $writeAlso->{$wtag};
+                $@ and $evalWarning = $@;
+                unless ($evalWarning) {
+                    ($n,$evalWarning) = $self->SetNewValue($wtag, $v, %opts);
+                    $numSet += $n;
+                    # count this as being set if any related tag is set
+                    $prioritySet = 1 if $n and $preferred{$tagInfo};
+                }
+                if ($evalWarning and (not $err or $verbose > 2)) {
+                    my $str = CleanWarning();
+                    if ($str) {
+                        $str .= " for $wtag" unless $str =~ / for [-\w:]+$/;
+                        $str .= " in $wgrp1:$tag (WriteAlso)";
+                        $err or $err = $str;
+                        print $out "$str\n" if $verbose > 2;
+                    }
+                }
+            }
+        }
+    }
+    # print warning if we couldn't set our priority tag
+    if (defined $err and not $prioritySet) {
+        warn "$err\n" if $err and not wantarray;
+    } elsif (not $numSet) {
+        my $pre = $wantGroup ? ($ifdName || $wantGroup) . ':' : '';
+        if ($wasProtected) {
+            $err = "Tag '$pre$tag' is $wasProtected for writing";
+        } elsif ($foundMatch) {
+            $err = "Sorry, $pre$tag is not writable";
+        } else {
+            $err = "Tag '$pre$tag' does not exist";
+        }
+        $verbose > 2 and print $out "$err\n";
+        warn "$err\n" unless wantarray;
+    } elsif ($$self{CHECK_WARN}) {
+        $err = $$self{CHECK_WARN};
+        $verbose > 2 and print $out "$err\n";
+    } elsif ($err and not $verbose) {
+        undef $err;
+    }
+    return ($numSet, $err) if wantarray;
+    return $numSet;
+}
+
+#------------------------------------------------------------------------------
+# set new values from information in specified file
+# Inputs: 0) ExifTool object reference, 1) source file name or reference, etc
+#         2-N) List of tags to set (or all if none specified), or reference(s) to
+#         hash for options to pass to SetNewValue.  The Replace option defaults
+#         to 1 for SetNewValuesFromFile -- set this to 0 to allow multiple tags
+#         to be copied to a list
+# Returns: Hash of information set successfully (includes Warning or Error messages)
+# Notes: Tag names may contain a group prefix, a leading '-' to exclude from copy,
+#        and/or a trailing '#' to copy the ValueConv value.  The tag name '*' may
+#        be used to represent all tags in a group.  An optional destination tag
+#        may be specified with '>DSTTAG' ('DSTTAG<TAG' also works, but in this
+#        case the source tag may also be an expression involving tag names).
+sub SetNewValuesFromFile($$;@)
+{
+    local $_;
+    my ($self, $srcFile, @setTags) = @_;
+    my $key;
+
+    # get initial SetNewValuesFromFile options
+    my %opts = ( Replace => 1 );    # replace existing list items by default
+    while (ref $setTags[0] eq 'HASH') {
+        $_ = shift @setTags;
+        foreach $key (keys %$_) {
+            $opts{$key} = $_->{$key};
+        }
+    }
+    # expand shortcuts
+    @setTags and ExpandShortcuts(\@setTags);
+    my $srcExifTool = new Image::ExifTool;
+    my $options = $self->{OPTIONS};
+    # set options for our extraction tool
+    $srcExifTool->{TAGS_FROM_FILE} = 1;
+    # +------------------------------------------+
+    # ! DON'T FORGET!!  Must consider each new   !
+    # ! option to decide how it is handled here. !
+    # +------------------------------------------+
+    $srcExifTool->Options(
+        Binary      => 1,
+        Charset     => $$options{Charset},
+        CharsetID3  => $$options{CharsetID3},
+        CharsetIPTC => $$options{CharsetIPTC},
+        CharsetPhotoshop => $$options{CharsetPhotoshop},
+        Composite   => $$options{Composite},
+        CoordFormat => $$options{CoordFormat} || '%d %d %.8f', # copy coordinates at high resolution unless otherwise specified
+        DateFormat  => $$options{DateFormat},
+        Duplicates  => 1,
+        Escape      => $$options{Escape},
+        ExtractEmbedded => $$options{ExtractEmbedded},
+        FastScan    => $$options{FastScan},
+        FixBase     => $$options{FixBase},
+        IgnoreMinorErrors => $$options{IgnoreMinorErrors},
+        Lang        => $$options{Lang},
+        LargeFileSupport => $$options{LargeFileSupport},
+        List        => 1,
+        MakerNotes  => 1,
+        MissingTagValue => $$options{MissingTagValue},
+        Password    => $$options{Password},
+        PrintConv   => $$options{PrintConv},
+        ScanForXMP  => $$options{ScanForXMP},
+        StrictDate  => 1,
+        Struct      => ($$options{Struct} or not defined $$options{Struct}) ? 1 : 0,
+        Unknown     => $$options{Unknown},
+    );
+    my $printConv = $$options{PrintConv};
+    if ($opts{Type}) {
+        # save source type separately because it may be different than dst Type
+        $opts{SrcType} = $opts{Type};
+        # override PrintConv option with initial Type if given
+        $printConv = ($opts{Type} eq 'PrintConv' ? 1 : 0);
+        $srcExifTool->Options(PrintConv => $printConv);
+    }
+    my $srcType = $printConv ? 'PrintConv' : 'ValueConv';
+
+    # get all tags from source file (including MakerNotes block)
+    my $info = $srcExifTool->ImageInfo($srcFile);
+    return $info if $$info{Error} and $$info{Error} eq 'Error opening file';
+    delete $srcExifTool->{VALUE}{Error};  # delete so we can check this later
+
+    # sort tags in reverse order so we get priority tag last
+    my @tags = reverse sort keys %$info;
+    my $tag;
+#
+# simply transfer all tags from source image if no tags specified
+#
+    unless (@setTags) {
+        # transfer maker note information to this object
+        $self->{MAKER_NOTE_FIXUP} = $srcExifTool->{MAKER_NOTE_FIXUP};
+        $self->{MAKER_NOTE_BYTE_ORDER} = $srcExifTool->{MAKER_NOTE_BYTE_ORDER};
+        foreach $tag (@tags) {
+            # don't try to set errors or warnings
+            next if $tag =~ /^(Error|Warning)\b/;
+            # get approprite value type if necessary
+            if ($opts{SrcType} and $opts{SrcType} ne $srcType) {
+                $$info{$tag} = $srcExifTool->GetValue($tag, $opts{SrcType});
+            }
+            # set value for this tag
+            my ($n, $e) = $self->SetNewValue($tag, $$info{$tag}, %opts);
+            # delete this tag if we could't set it
+            $n or delete $$info{$tag};
+        }
+        return $info;
+    }
+#
+# transfer specified tags in the proper order
+#
+    # 1) loop through input list of tags to set, and build @setList
+    my (@setList, $set, %setMatches);
+    foreach (@setTags) {
+        if (ref $_ eq 'HASH') {
+            # update current options
+            foreach $key (keys %$_) {
+                $opts{$key} = $_->{$key};
+            }
+            next;
+        }
+        # make a copy of the current options for this setTag
+        # (also use this hash to store expression and wildcard flags, EXPR and WILD)
+        my $opts = { %opts };
+        $tag = lc($_);  # change tag/group names to all lower case
+        my ($fam, $grp, $dst, $dstGrp, $dstTag, $isExclude);
+        # handle redirection to another tag
+        if ($tag =~ /(.+?)\s*(>|<)\s*(.+)/) {
+            $dstGrp = '';
+            my $opt;
+            if ($2 eq '>') {
+                ($tag, $dstTag) = ($1, $3);
+                # flag add and delete (ie. '+<' and '-<') redirections
+                $opt = $1 if $tag =~ s/\s*([-+])$// or $dstTag =~ s/^([-+])\s*//;
+            } else {
+                ($tag, $dstTag) = ($3, $1);
+                $opt = $1 if $dstTag =~ s/\s*([-+])$//;
+                # handle expressions
+                if ($tag =~ /\$/) {
+                    $tag = $_;  # restore original case
+                    # recover leading whitespace (except for initial single space)
+                    $tag =~ s/(.+?)\s*(>|<) ?//;
+                    $$opts{EXPR} = 1; # flag this expression
+                    $grp = '';
+                } else {
+                    $opt = $1 if $tag =~ s/^([-+])\s*//;
+                }
+            }
+            # translate '+' and '-' to appropriate SetNewValue option
+            if ($opt) {
+                $$opts{{ '+' => 'AddValue', '-' => 'DelValue' }->{$opt}} = 1;
+                $$opts{Shift} = 0;  # shift if this is a date/time tag
+            }
+            ($dstGrp, $dstTag) = ($1, $2) if $dstTag =~ /(.*):(.+)/;
+            # ValueConv may be specified separately on the destination with '#'
+            $$opts{Type} = 'ValueConv' if $dstTag =~ s/#$//;
+            # ignore leading family number
+            $dstGrp = $2 if $dstGrp =~ /^(\d+)(.*)/ and $1 < 2;
+            # replace 'all' with '*' in tag and group names
+            $dstTag = '*' if $dstTag eq 'all';
+            $dstGrp = '*' if $dstGrp eq 'all';
+        }
+        unless ($$opts{EXPR}) {
+            $isExclude = ($tag =~ s/^-//);
+            if ($tag =~ /^([-\w]*?|\*):(.+)/) {
+                ($grp, $tag) = ($1, $2);
+                # separate leading family number
+                ($fam, $grp) = ($1, $2) if $grp =~ /^(\d+)(.*)/;
+            } else {
+                $grp = '';  # flag for don't care about group
+            }
+            # allow ValueConv to be specified by a '#' on the tag name
+            if ($tag =~ s/#$//) {
+                $$opts{SrcType} = 'ValueConv';
+                $$opts{Type} = 'ValueConv' unless $dstTag;
+            }
+            # replace 'all' with '*' in tag and group names
+            $tag = '*' if $tag eq 'all';
+            $grp = '*' if $grp eq 'all';
+            # allow wildcards in tag names
+            if ($tag =~ /[?*]/ and $tag ne '*') {
+                $$opts{WILD} = 1;   # set flag indicating wildcards were used
+                $tag =~ s/\*/[-\\w]*/g;
+                $tag =~ s/\?/[-\\w]/g;
+            }
+        }
+        # redirect, exclude or set this tag (Note: $grp is '' if we don't care)
+        if ($dstTag) {
+            # redirect this tag
+            $isExclude and return { Error => "Can't redirect excluded tag" };
+            if ($dstTag ne '*') {
+                if ($dstTag =~ /[?*]/) {
+                    if ($dstTag eq $tag) {
+                        $dstTag = '*';
+                    } else {
+                        return { Error => "Invalid use of wildcards in destination tag" };
+                    }
+                } elsif ($tag eq '*') {
+                    return { Error => "Can't redirect from all tags to one tag" };
+                }
+            }
+            # set destination group the same as source if necessary
+          # (removed in 7.72 so '-xmp:*>*:*' will preserve XMP family 1 groups)
+          # $dstGrp = $grp if $dstGrp eq '*' and $grp;
+            # write to specified destination group/tag
+            $dst = [ $dstGrp, $dstTag ];
+        } elsif ($isExclude) {
+            # implicitly assume '*' if first entry is an exclusion
+            unshift @setList, [ undef, '*', '*', [ '', '*' ], $opts ] unless @setList;
+            # exclude this tag by leaving $dst undefined
+        } else {
+            $dst = [ $grp, $$opts{WILD} ? '*' : $tag ]; # copy to same group
+        }
+        $grp or $grp = '*';     # use '*' for any group
+        # save in reverse order so we don't set tags before an exclude
+        unshift @setList, [ $fam, $grp, $tag, $dst, $opts ];
+    }
+    # 2) initialize lists of matching tags for each setTag
+    foreach $set (@setList) {
+        $$set[3] and $setMatches{$set} = [ ];
+    }
+    # 3) loop through all tags in source image and save tags matching each setTag
+    my %rtnInfo;
+    foreach $tag (@tags) {
+        # don't try to set errors or warnings
+        if ($tag =~ /^(Error|Warning)( |$)/) {
+            $rtnInfo{$tag} = $$info{$tag};
+            next;
+        }
+        # only set specified tags
+        my $lcTag = lc(GetTagName($tag));
+        my (@grp, %grp);
+        foreach $set (@setList) {
+            # check first for matching tag
+            unless ($$set[2] eq $lcTag or $$set[2] eq '*') {
+                # handle wildcards
+                next unless $$set[4]{WILD} and $lcTag =~ /^$$set[2]$/;
+            }
+            # then check for matching group
+            unless ($$set[1] eq '*') {
+                # get lower case group names if not done already
+                unless (@grp) {
+                    @grp = map(lc, $srcExifTool->GetGroup($tag));
+                    $grp{$_} = 1 foreach @grp;
+                }
+                # handle leading family number
+                if (defined $$set[0]) {
+                    next unless $grp[$$set[0]] and $$set[1] eq $grp[$$set[0]];
+                } else {
+                    next unless $grp{$$set[1]};
+                }
+            }
+            last unless $$set[3];   # all done if we hit an exclude
+            # add to the list of tags matching this setTag
+            push @{$setMatches{$set}}, $tag;
+        }
+    }
+    # 4) loop through each setTag in original order, setting new tag values
+    foreach $set (reverse @setList) {
+        # get options for SetNewValue
+        my $opts = $$set[4];
+        # handle expressions
+        if ($$opts{EXPR}) {
+            my $val = $srcExifTool->InsertTagValues(\@tags, $$set[2], 'Error');
+            unless (defined $val) {
+                # return warning if one of the tags didn't exist
+                $tag = NextTagKey(\%rtnInfo, 'Warning');
+                $rtnInfo{$tag} = $srcExifTool->GetValue('Error');
+                delete $srcExifTool->{VALUE}{Error};
+                next;
+            }
+            my ($dstGrp, $dstTag) = @{$$set[3]};
+            $$opts{Protected} = 1;
+            $$opts{Group} = $dstGrp if $dstGrp;
+            my @rtnVals = $self->SetNewValue($dstTag, $val, %$opts);
+            $rtnInfo{$dstTag} = $val if $rtnVals[0]; # tag was set successfully
+            next;
+        }
+        foreach $tag (@{$setMatches{$set}}) {
+            my ($val, $noWarn);
+            if ($$opts{SrcType} and $$opts{SrcType} ne $srcType) {
+                $val = $srcExifTool->GetValue($tag, $$opts{SrcType});
+            } else {
+                $val = $$info{$tag};
+            }
+            my ($dstGrp, $dstTag) = @{$$set[3]};
+            if ($dstGrp) {
+                if ($dstGrp eq '*') {
+                    $dstGrp = $srcExifTool->GetGroup($tag, 1);
+                    $noWarn = 1;    # don't warn on wildcard destinations
+                }
+                $$opts{Group} = $dstGrp;
+            } else {
+                delete $$opts{Group};
+            }
+            # transfer maker note information if setting this tag
+            if ($srcExifTool->{TAG_INFO}{$tag}{MakerNotes}) {
+                $self->{MAKER_NOTE_FIXUP} = $srcExifTool->{MAKER_NOTE_FIXUP};
+                $self->{MAKER_NOTE_BYTE_ORDER} = $srcExifTool->{MAKER_NOTE_BYTE_ORDER};
+            }
+            if ($dstTag eq '*') {
+                $dstTag = $tag;
+                $noWarn = 1;
+            }
+            # allow protected tags to be copied if specified explicitly
+            $$opts{Protected} = ($$set[2] eq '*' ? undef : 1);
+            # set value(s) for this tag
+            my ($rtn, $wrn) = $self->SetNewValue($dstTag, $val, %$opts);
+            if ($wrn and not $noWarn) {
+                # return this warning
+                $rtnInfo{NextTagKey(\%rtnInfo, 'Warning')} = $wrn;
+                $noWarn = 1;
+            }
+            $rtnInfo{$tag} = $val if $rtn;  # tag was set successfully
+        }
+    }
+    return \%rtnInfo;   # return information that we set
+}
+
+#------------------------------------------------------------------------------
+# Get new value(s) for tag
+# Inputs: 0) ExifTool object reference, 1) tag name or tagInfo hash ref
+#         2) optional pointer to return new value hash reference (not part of public API)
+#    or   0) new value hash reference (not part of public API)
+# Returns: List of new Raw values (list may be empty if tag is being deleted)
+# Notes: 1) Preferentially returns new value from Extra table if writable Extra tag exists
+# 2) Must call AFTER IsOverwriting() returns 1 to get proper value for shifted times
+# 3) Tag name is case sensitive and may be prefixed by family 0 or 1 group name
+sub GetNewValues($;$$)
+{
+    local $_;
+    my $nvHash;
+    if (ref $_[0] eq 'HASH') {
+        $nvHash = shift;
+    } else {
+        my ($self, $tag, $newValueHashPt) = @_;
+        if ($self->{NEW_VALUE}) {
+            my ($group, $tagInfo);
+            if (ref $tag) {
+                $nvHash = $self->GetNewValueHash($tag);
+            } elsif (defined($tagInfo = $Image::ExifTool::Extra{$tag}) and
+                     $$tagInfo{Writable})
+            {
+                $nvHash = $self->GetNewValueHash($tagInfo);
+            } else {
+                # separate group from tag name
+                $group = $1 if $tag =~ s/(.*)://;
+                my @tagInfoList = FindTagInfo($tag);
+                # decide which tag we want
+GNV_TagInfo:    foreach $tagInfo (@tagInfoList) {
+                    my $nvh = $self->GetNewValueHash($tagInfo) or next;
+                    # select tag in specified group if necessary
+                    while ($group and $group ne $$nvh{WriteGroup}) {
+                        my @grps = $self->GetGroup($tagInfo);
+                        if ($grps[0] eq $$nvh{WriteGroup}) {
+                            # check family 1 group only if WriteGroup is not specific
+                            last if $group eq $grps[1];
+                        } else {
+                            # otherwise check family 0 group
+                            last if $group eq $grps[0];
+                        }
+                        # step to next entry in list
+                        $nvh = $$nvh{Next} or next GNV_TagInfo;
+                    }
+                    $nvHash = $nvh;
+                    # give priority to the one we are creating
+                    last if defined $nvHash->{IsCreating};
+                }
+            }
+        }
+        # return new value hash if requested
+        $newValueHashPt and $$newValueHashPt = $nvHash;
+    }
+    if ($nvHash and $nvHash->{Value}) {
+        my $vals = $nvHash->{Value};
+        # do inverse raw conversion if necessary
+        if ($nvHash->{TagInfo}{RawConvInv}) {
+            my @copyVals = @$vals;  # modify a copy of the values
+            $vals = \@copyVals;
+            my $tagInfo = $$nvHash{TagInfo};
+            my $conv = $$tagInfo{RawConvInv};
+            my $self = $nvHash->{Self};
+            my ($val, $checkProc);
+            my $table = $tagInfo->{Table};
+            $checkProc = $$table{CHECK_PROC} if $table;
+            local $SIG{'__WARN__'} = \&SetWarning;
+            undef $evalWarning;
+            foreach $val (@$vals) {
+                if (ref($conv) eq 'CODE') {
+                    $val = &$conv($val, $self);
+                } else {
+                    #### eval RawConvInv ($self, $val, $taginfo)
+                    $val = eval $conv;
+                    $@ and $evalWarning = $@;
+                }
+                if ($evalWarning) {
+                    # an empty warning ("\n") ignores tag with no error
+                    if ($evalWarning ne "\n") {
+                        my $err = CleanWarning() . " in $$tagInfo{Name} (RawConvInv)";
+                        $self->Warn($err);
+                    }
+                    @$vals = ();
+                    last;
+                }
+                # must check value now
+                next unless $checkProc;
+                my $err = &$checkProc($self, $tagInfo, \$val);
+                if ($err or not defined $val) {
+                    $err or $err = 'Error generating raw value';
+                    $self->Warn("$err for $$tagInfo{Name}");
+                    @$vals = ();
+                    last;
+                }
+            }
+        }
+        # return our value(s)
+        return @$vals if wantarray;
+        return $$vals[0];
+    }
+    return () if wantarray;  # return empty list
+    return undef;
+}
+
+#------------------------------------------------------------------------------
+# Return the total number of new values set
+# Inputs: 0) ExifTool object reference
+# Returns: Scalar context) Number of new values that have been set
+#          List context) Number of new values, number of "pseudo" values
+# ("pseudo" values are those which don't require rewriting the file to change)
+sub CountNewValues($)
+{
+    my $self = shift;
+    my $newVal = $self->{NEW_VALUE};
+    my $num = 0;
+    my $tag;
+    if ($newVal) {
+        $num += scalar keys %$newVal;
+        # don't count "fake" tags (only in Extra table)
+        foreach $tag (qw{Geotag Geosync}) {
+            --$num if defined $$newVal{$Image::ExifTool::Extra{$tag}};
+        }
+    }
+    $num += scalar keys %{$self->{DEL_GROUP}};
+    return $num unless wantarray;
+    my $pseudo = 0;
+    if ($newVal) {
+        # (Note: all writable "pseudo" tags must be found in Extra table)
+        foreach $tag (qw{FileName Directory FileModifyDate}) {
+            ++$pseudo if defined $$newVal{$Image::ExifTool::Extra{$tag}};
+        }
+    }
+    return ($num, $pseudo);
+}
+
+#------------------------------------------------------------------------------
+# Save new values for subsequent restore
+# Inputs: 0) ExifTool object reference
+sub SaveNewValues($)
+{
+    my $self = shift;
+    my $newValues = $self->{NEW_VALUE};
+    my $key;
+    foreach $key (keys %$newValues) {
+        my $nvHash = $$newValues{$key};
+        while ($nvHash) {
+            $nvHash->{Save} = 1;  # set Save flag
+            $nvHash = $nvHash->{Next};
+        }
+    }
+    # initialize hash for saving overwritten new values
+    $self->{SAVE_NEW_VALUE} = { };
+    # make a copy of the delete group hash
+    if ($self->{DEL_GROUP}) {
+        my %delGrp = %{$self->{DEL_GROUP}};
+        $self->{SAVE_DEL_GROUP} = \%delGrp;
+    } else {
+        delete $self->{SAVE_DEL_GROUP};
+    }
+}
+
+#------------------------------------------------------------------------------
+# Restore new values to last saved state
+# Inputs: 0) ExifTool object reference
+# Notes: Restores saved new values, but currently doesn't restore them in the
+# original order, so there may be some minor side-effects when restoring tags
+# with overlapping groups. ie) XMP:Identifier, XMP-dc:Identifier
+sub RestoreNewValues($)
+{
+    my $self = shift;
+    my $newValues = $self->{NEW_VALUE};
+    my $savedValues = $self->{SAVE_NEW_VALUE};
+    my $key;
+    # 1) remove any new values which don't have the Save flag set
+    if ($newValues) {
+        my @keys = keys %$newValues;
+        foreach $key (@keys) {
+            my $lastHash;
+            my $nvHash = $$newValues{$key};
+            while ($nvHash) {
+                if ($nvHash->{Save}) {
+                    $lastHash = $nvHash;
+                } else {
+                    # remove this entry from the list
+                    if ($lastHash) {
+                        $lastHash->{Next} = $nvHash->{Next};
+                    } elsif ($nvHash->{Next}) {
+                        $$newValues{$key} = $nvHash->{Next};
+                    } else {
+                        delete $$newValues{$key};
+                    }
+                }
+                $nvHash = $nvHash->{Next};
+            }
+        }
+    }
+    # 2) restore saved new values
+    if ($savedValues) {
+        $newValues or $newValues = $self->{NEW_VALUE} = { };
+        foreach $key (keys %$savedValues) {
+            if ($$newValues{$key}) {
+                # add saved values to end of list
+                my $nvHash = LastInList($$newValues{$key});
+                $nvHash->{Next} = $$savedValues{$key};
+            } else {
+                $$newValues{$key} = $$savedValues{$key};
+            }
+        }
+        $self->{SAVE_NEW_VALUE} = { };  # reset saved new values
+    }
+    # 3) restore delete groups
+    if ($self->{SAVE_DEL_GROUP}) {
+        my %delGrp = %{$self->{SAVE_DEL_GROUP}};
+        $self->{DEL_GROUP} = \%delGrp;
+    } else {
+        delete $self->{DEL_GROUP};
+    }
+}
+
+#------------------------------------------------------------------------------
+# Set file modification time from FileModifyDate tag
+# Inputs: 0) ExifTool object reference, 1) file name or file ref
+#         2) modify time (-M) of original file (needed for time shift)
+# Returns: 1=time changed OK, 0=nothing done, -1=error setting time
+#          (and increments CHANGED flag if time was changed)
+sub SetFileModifyDate($$;$)
+{
+    my ($self, $file, $originalTime) = @_;
+    my $nvHash;
+    my $val = $self->GetNewValues('FileModifyDate', \$nvHash);
+    return 0 unless defined $val;
+    my $isOverwriting = IsOverwriting($nvHash);
+    return 0 unless $isOverwriting;
+    if ($isOverwriting < 0) {  # are we shifting time?
+        # use original time of this file if not specified
+        $originalTime = -M $file unless defined $originalTime;
+        return 0 unless defined $originalTime;
+        return 0 unless IsOverwriting($nvHash, $^T - $originalTime*(24*3600));
+        $val = $nvHash->{Value}[0]; # get shifted value
+    }
+    unless (utime($val, $val, $file)) {
+        $self->Warn('Error setting FileModifyDate');
+        return -1;
+    }
+    ++$self->{CHANGED};
+    $self->VerboseValue('+ FileModifyDate', $val);
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Change file name and/or directory from FileName and Directory tags
+# Inputs: 0) ExifTool object reference, 1) current file name (including path)
+#         2) New name (or undef to build from FileName and Directory tags)
+# Returns: 1=name changed OK, 0=nothing changed, -1=error changing name
+#          (and increments CHANGED flag if filename changed)
+# Notes: Will not overwrite existing file.  Creates directories as necessary.
+sub SetFileName($$;$)
+{
+    my ($self, $file, $newName) = @_;
+    my ($nvHash, $doName, $doDir);
+    # determine the new file name
+    unless (defined $newName) {
+        my $filename = $self->GetNewValues('FileName', \$nvHash);
+        $doName = 1 if defined $filename and IsOverwriting($nvHash, $file);
+        my $dir = $self->GetNewValues('Directory', \$nvHash);
+        $doDir = 1 if defined $dir and IsOverwriting($nvHash, $file);
+        return 0 unless $doName or $doDir;  # nothing to do
+        if ($doName) {
+            $newName = GetNewFileName($file, $filename);
+            $newName = GetNewFileName($newName, $dir) if $doDir;
+        } else {
+            $newName = GetNewFileName($file, $dir);
+        }
+    }
+    if (-e $newName) {
+        # don't replace existing file
+        $self->Warn("File '$newName' already exists");
+        return -1;
+    }
+    # create directory for new file if necessary
+    my $result;
+    if (($result = CreateDirectory($newName)) != 0) {
+        if ($result < 0) {
+            $self->Warn("Error creating directory for '$newName'");
+            return -1;
+        }
+        $self->VPrint(0, "Created directory for '$newName'");
+    }
+    # attempt to rename the file
+    unless (rename $file, $newName) {
+        local (*EXIFTOOL_SFN_IN, *EXIFTOOL_SFN_OUT);
+        # renaming didn't work, so copy the file instead
+        unless (open EXIFTOOL_SFN_IN, $file) {
+            $self->Warn("Error opening '$file'");
+            return -1;
+        }
+        unless (open EXIFTOOL_SFN_OUT, ">$newName") {
+            close EXIFTOOL_SFN_IN;
+            $self->Warn("Error creating '$newName'");
+            return -1;
+        }
+        binmode EXIFTOOL_SFN_IN;
+        binmode EXIFTOOL_SFN_OUT;
+        my ($buff, $err);
+        while (read EXIFTOOL_SFN_IN, $buff, 65536) {
+            print EXIFTOOL_SFN_OUT $buff or $err = 1;
+        }
+        close EXIFTOOL_SFN_OUT or $err = 1;
+        close EXIFTOOL_SFN_IN;
+        if ($err) {
+            unlink $newName;    # erase bad output file
+            $self->Warn("Error writing '$newName'");
+            return -1;
+        }
+        # preserve modification time
+        my $modTime = $^T - (-M $file) * (24 * 3600);
+        my $accTime = $^T - (-A $file) * (24 * 3600);
+        utime($accTime, $modTime, $newName);
+        # remove the original file
+        unlink $file or $self->Warn('Error removing old file');
+    }
+    ++$self->{CHANGED};
+    $self->VerboseValue('+ FileName', $newName);
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Write information back to file
+# Inputs: 0) ExifTool object reference,
+#         1) input filename, file ref, or scalar ref (or '' or undef to create from scratch)
+#         2) output filename, file ref, or scalar ref (or undef to overwrite)
+#         3) optional output file type (required only if input file is not specified
+#            and output file is a reference)
+# Returns: 1=file written OK, 2=file written but no changes made, 0=file write error
+sub WriteInfo($$;$$)
+{
+    local ($_, *EXIFTOOL_FILE2, *EXIFTOOL_OUTFILE);
+    my ($self, $infile, $outfile, $outType) = @_;
+    my (@fileTypeList, $fileType, $tiffType, $hdr, $seekErr, $type, $tmpfile);
+    my ($inRef, $outRef, $closeIn, $closeOut, $outPos, $outBuff, $eraseIn);
+    my $oldRaf = $self->{RAF};
+    my $rtnVal = 0;
+
+    # initialize member variables
+    $self->Init();
+
+    # first, save original file modify date if necessary
+    # (do this now in case we are modifying file in place and shifting date)
+    my ($nvHash, $originalTime);
+    my $fileModifyDate =  $self->GetNewValues('FileModifyDate', \$nvHash);
+    if (defined $fileModifyDate and IsOverwriting($nvHash) < 0 and
+        defined $infile and ref $infile ne 'SCALAR')
+    {
+        $originalTime = -M $infile;
+    }
+#
+# do quick in-place change of file dir/name or date if that is all we are doing
+#
+    my ($numNew, $numPseudo) = $self->CountNewValues();
+    if (not defined $outfile and defined $infile) {
+        my $newFileName =  $self->GetNewValues('FileName', \$nvHash);
+        if ($numNew == $numPseudo) {
+            $rtnVal = 2;
+            if (defined $fileModifyDate and (not ref $infile or UNIVERSAL::isa($infile,'GLOB'))) {
+                $self->SetFileModifyDate($infile) > 0 and $rtnVal = 1;
+            }
+            if (defined $newFileName and not ref $infile) {
+                $self->SetFileName($infile) > 0 and $rtnVal = 1;
+            }
+            return $rtnVal;
+        } elsif (defined $newFileName and length $newFileName) {
+            # can't simply rename file, so just set the output name if new FileName
+            # --> in this case, must erase original copy
+            if (ref $infile) {
+                $outfile = $newFileName;
+                # can't delete original
+            } elsif (IsOverwriting($nvHash, $infile)) {
+                $outfile = GetNewFileName($infile, $newFileName);
+                $eraseIn = 1; # delete original
+            }
+        }
+    }
+#
+# set up input file
+#
+    if (ref $infile) {
+        $inRef = $infile;
+        if (UNIVERSAL::isa($inRef,'GLOB')) {
+            seek($inRef, 0, 0); # make sure we are at the start of the file
+        } elsif ($] >= 5.006 and (eval 'require Encode; Encode::is_utf8($$inRef)' or $@)) {
+            # convert image data from UTF-8 to character stream if necessary
+            my $buff = $@ ? pack('C*',unpack('U0C*',$$inRef)) : Encode::encode('utf8',$$inRef);
+            if (defined $outfile) {
+                $inRef = \$buff;
+            } else {
+                $$inRef = $buff;
+            }
+        }
+    } elsif (defined $infile and $infile ne '') {
+        # write to a temporary file if no output file given
+        $outfile = $tmpfile = "${infile}_exiftool_tmp" unless defined $outfile;
+        if (open(EXIFTOOL_FILE2, $infile)) {
+            $fileType = GetFileType($infile);
+            @fileTypeList = GetFileType($infile);
+            $tiffType = $$self{FILE_EXT} = GetFileExtension($infile);
+            $self->VPrint(0, "Rewriting $infile...\n");
+            $inRef = \*EXIFTOOL_FILE2;
+            $closeIn = 1;   # we must close the file since we opened it
+        } else {
+            $self->Error('Error opening file');
+            return 0;
+        }
+    } elsif (not defined $outfile) {
+        $self->Error("WriteInfo(): Must specify infile or outfile\n");
+        return 0;
+    } else {
+        # create file from scratch
+        $outType = GetFileExtension($outfile) unless $outType or ref $outfile;
+        if (CanCreate($outType)) {
+            $fileType = $tiffType = $outType;   # use output file type if no input file
+            $infile = "$fileType file";         # make bogus file name
+            $self->VPrint(0, "Creating $infile...\n");
+            $inRef = \ '';      # set $inRef to reference to empty data
+        } elsif ($outType) {
+            $self->Error("Can't create $outType files");
+            return 0;
+        } else {
+            $self->Error("Can't create file (unknown type)");
+            return 0;
+        }
+    }
+    unless (@fileTypeList) {
+        if ($fileType) {
+            @fileTypeList = ( $fileType );
+        } else {
+            @fileTypeList = @fileTypes;
+            $tiffType = 'TIFF';
+        }
+    }
+#
+# set up output file
+#
+    if (ref $outfile) {
+        $outRef = $outfile;
+        if (UNIVERSAL::isa($outRef,'GLOB')) {
+            binmode($outRef);
+            $outPos = tell($outRef);
+        } else {
+            # initialize our output buffer if necessary
+            defined $$outRef or $$outRef = '';
+            $outPos = length($$outRef);
+        }
+    } elsif (not defined $outfile) {
+        # editing in place, so write to memory first
+        # (only when infile is a file ref or scalar ref)
+        $outBuff = '';
+        $outRef = \$outBuff;
+        $outPos = 0;
+    } elsif (-e $outfile) {
+        $self->Error("File already exists: $outfile");
+    } elsif (open(EXIFTOOL_OUTFILE, ">$outfile")) {
+        $outRef = \*EXIFTOOL_OUTFILE;
+        $closeOut = 1;  # we must close $outRef
+        binmode($outRef);
+        $outPos = 0;
+    } else {
+        my $tmp = $tmpfile ? ' temporary' : '';
+        $self->Error("Error creating$tmp file: $outfile");
+    }
+#
+# write the file
+#
+    until ($self->{VALUE}{Error}) {
+        # create random access file object (disable seek test in case of straight copy)
+        my $raf = new File::RandomAccess($inRef, 1);
+        $raf->BinMode();
+        if ($numNew == $numPseudo) {
+            $rtnVal = 1;
+            # just do a straight copy of the file (no "real" tags are being changed)
+            my $buff;
+            while ($raf->Read($buff, 65536)) {
+                Write($outRef, $buff) or $rtnVal = -1, last;
+            }
+            last;
+        } elsif (not ref $infile and ($infile eq '-' or $infile =~ /\|$/)) {
+            # patch for Windows command shell pipe
+            $raf->{TESTED} = -1;    # force buffering
+        } else {
+            $raf->SeekTest();
+        }
+       # $raf->Debug() and warn "  RAF debugging enabled!\n";
+        my $inPos = $raf->Tell();
+        $self->{RAF} = $raf;
+        my %dirInfo = (
+            RAF => $raf,
+            OutFile => $outRef,
+        );
+        $raf->Read($hdr, 1024) or $hdr = '';
+        $raf->Seek($inPos, 0) or $seekErr = 1;
+        my $wrongType;
+        until ($seekErr) {
+            $type = shift @fileTypeList;
+            # do quick test to see if this is the right file type
+            if ($magicNumber{$type} and length($hdr) and $hdr !~ /^$magicNumber{$type}/s) {
+                next if @fileTypeList;
+                $wrongType = 1;
+                last;
+            }
+            # save file type in member variable
+            $dirInfo{Parent} = $self->{FILE_TYPE} = $self->{PATH}[0] = $type;
+            # determine which directories we must write for this file type
+            $self->InitWriteDirs($type);
+            if ($type eq 'JPEG') {
+                $rtnVal = $self->WriteJPEG(\%dirInfo);
+            } elsif ($type eq 'TIFF') {
+                # disallow writing of some TIFF-based RAW images:
+                if (grep /^$tiffType$/, @{$noWriteFile{TIFF}}) {
+                    $fileType = $tiffType;
+                    undef $rtnVal;
+                } else {
+                    $dirInfo{Parent} = $tiffType;
+                    $rtnVal = $self->ProcessTIFF(\%dirInfo);
+                }
+            } elsif ($type eq 'GIF') {
+                require Image::ExifTool::GIF;
+                $rtnVal = Image::ExifTool::GIF::ProcessGIF($self,\%dirInfo);
+            } elsif ($type eq 'CRW') {
+                require Image::ExifTool::CanonRaw;
+                $rtnVal = Image::ExifTool::CanonRaw::WriteCRW($self, \%dirInfo);
+            } elsif ($type eq 'MRW') {
+                require Image::ExifTool::MinoltaRaw;
+                $rtnVal = Image::ExifTool::MinoltaRaw::ProcessMRW($self, \%dirInfo);
+            } elsif ($type eq 'RAF') {
+                require Image::ExifTool::FujiFilm;
+                $rtnVal = Image::ExifTool::FujiFilm::WriteRAF($self, \%dirInfo);
+            } elsif ($type eq 'ORF' or $type eq 'RAW') {
+                $rtnVal = $self->ProcessTIFF(\%dirInfo);
+            } elsif ($type eq 'X3F') {
+                require Image::ExifTool::SigmaRaw;
+                $rtnVal = Image::ExifTool::SigmaRaw::ProcessX3F($self, \%dirInfo);
+            } elsif ($type eq 'PNG') {
+                require Image::ExifTool::PNG;
+                $rtnVal = Image::ExifTool::PNG::ProcessPNG($self, \%dirInfo);
+            } elsif ($type eq 'MIE') {
+                require Image::ExifTool::MIE;
+                $rtnVal = Image::ExifTool::MIE::ProcessMIE($self, \%dirInfo);
+            } elsif ($type eq 'XMP') {
+                require Image::ExifTool::XMP;
+                $rtnVal = Image::ExifTool::XMP::WriteXMP($self, \%dirInfo);
+            } elsif ($type eq 'PPM') {
+                require Image::ExifTool::PPM;
+                $rtnVal = Image::ExifTool::PPM::ProcessPPM($self, \%dirInfo);
+            } elsif ($type eq 'PSD') {
+                require Image::ExifTool::Photoshop;
+                $rtnVal = Image::ExifTool::Photoshop::ProcessPSD($self, \%dirInfo);
+            } elsif ($type eq 'EPS' or $type eq 'PS') {
+                require Image::ExifTool::PostScript;
+                $rtnVal = Image::ExifTool::PostScript::WritePS($self, \%dirInfo);
+            } elsif ($type eq 'PDF') {
+                require Image::ExifTool::PDF;
+                $rtnVal = Image::ExifTool::PDF::WritePDF($self, \%dirInfo);
+            } elsif ($type eq 'ICC') {
+                require Image::ExifTool::ICC_Profile;
+                $rtnVal = Image::ExifTool::ICC_Profile::WriteICC($self, \%dirInfo);
+            } elsif ($type eq 'VRD') {
+                require Image::ExifTool::CanonVRD;
+                $rtnVal = Image::ExifTool::CanonVRD::ProcessVRD($self, \%dirInfo);
+            } elsif ($type eq 'JP2') {
+                require Image::ExifTool::Jpeg2000;
+                $rtnVal = Image::ExifTool::Jpeg2000::ProcessJP2($self, \%dirInfo);
+            } elsif ($type eq 'IND') {
+                require Image::ExifTool::InDesign;
+                $rtnVal = Image::ExifTool::InDesign::ProcessIND($self, \%dirInfo);
+            } elsif ($type eq 'EXIF') {
+                # go through WriteDirectory so block writes, etc are handled
+                my $tagTablePtr = GetTagTable('Image::ExifTool::Exif::Main');
+                my $buff = $self->WriteDirectory(\%dirInfo, $tagTablePtr, \&WriteTIFF);
+                if (defined $buff) {
+                    $rtnVal = Write($outRef, $buff) ? 1 : -1;
+                } else {
+                    $rtnVal = 0;
+                }
+            } else {
+                undef $rtnVal;  # flag that we don't write this type of file
+            }
+            # all done unless we got the wrong type
+            last if $rtnVal;
+            last unless @fileTypeList;
+            # seek back to original position in files for next try
+            $raf->Seek($inPos, 0) or $seekErr = 1, last;
+            if (UNIVERSAL::isa($outRef,'GLOB')) {
+                seek($outRef, 0, $outPos);
+            } else {
+                $$outRef = substr($$outRef, 0, $outPos);
+            }
+        }
+        # print file format errors
+        unless ($rtnVal) {
+            my $err;
+            if ($seekErr) {
+                $err = 'Error seeking in file';
+            } elsif ($fileType and defined $rtnVal) {
+                if ($self->{VALUE}{Error}) {
+                    # existing error message will do
+                } elsif ($fileType eq 'RAW') {
+                    $err = 'Writing this type of RAW file is not supported';
+                } else {
+                    if ($wrongType) {
+                        $err = "Not a valid $fileType";
+                        # do a quick check to see what this file looks like
+                        foreach $type (@fileTypes) {
+                            next unless $magicNumber{$type};
+                            next unless $hdr =~ /^$magicNumber{$type}/s;
+                            $err .= " (looks more like a $type)";
+                            last;
+                        }
+                    } else {
+                        $err = 'Format error in file';
+                    }
+                }
+            } elsif ($fileType) {
+                # get specific type of file from extension
+                $fileType = GetFileExtension($infile) if $infile and GetFileType($infile);
+                $err = "Writing of $fileType files is not yet supported";
+            } else {
+                $err = 'Writing of this type of file is not supported';
+            }
+            $self->Error($err) if $err;
+            $rtnVal = 0;    # (in case it was undef)
+        }
+       # $raf->Close();  # only used to force debug output
+        last;   # (didn't really want to loop)
+    }
+    # don't return success code if any error occurred
+    if ($rtnVal > 0) {
+        unless (Tell($outRef) or $self->{VALUE}{Error}) {
+            # don't write a file with zero length
+            if (defined $hdr and length $hdr) {
+                $self->Error("Can't delete all meta information from $type file");
+            } else {
+                $self->Error('Nothing to write');
+            }
+        }
+        $rtnVal = 0 if $self->{VALUE}{Error};
+    }
+
+    # rewrite original file in place if required
+    if (defined $outBuff) {
+        if ($rtnVal <= 0 or not $self->{CHANGED}) {
+            # nothing changed, so no need to write $outBuff
+        } elsif (UNIVERSAL::isa($inRef,'GLOB')) {
+            my $len = length($outBuff);
+            my $size;
+            $rtnVal = -1 unless
+                seek($inRef, 0, 2) and          # seek to the end of file
+                ($size = tell $inRef) >= 0 and  # get the file size
+                seek($inRef, 0, 0) and          # seek back to the start
+                print $inRef $outBuff and       # write the new data
+                ($len >= $size or               # if necessary:
+                eval 'truncate($inRef, $len)'); #  shorten output file
+        } else {
+            $$inRef = $outBuff;                 # replace original data
+        }
+        $outBuff = '';  # free memory but leave $outBuff defined
+    }
+    # close input file if we opened it
+    if ($closeIn) {
+        # errors on input file are significant if we edited the file in place
+        $rtnVal and $rtnVal = -1 unless close($inRef) or not defined $outBuff;
+        if ($rtnVal > 0) {
+            # copy Mac OS resource fork if it exists
+            if ($^O eq 'darwin' and -s "$infile/rsrc") {
+                if ($$self{DEL_GROUP} and $$self{DEL_GROUP}{RSRC}) {
+                    $self->VPrint(0,"Deleting Mac OS resource fork\n");
+                    ++$$self{CHANGED};
+                } else {
+                    $self->VPrint(0,"Copying Mac OS resource fork\n");
+                    my ($buf, $err);
+                    local (*SRC, *DST);
+                    if (open SRC, "$infile/rsrc") {
+                        if (open DST, ">$outfile/rsrc") {
+                            binmode SRC; # (not necessary for Darwin, but let's be thorough)
+                            binmode DST;
+                            while (read SRC, $buf, 65536) {
+                                print DST $buf or $err = 'copying', last;
+                            }
+                            close DST or $err or $err = 'closing';
+                        } else {
+                            # (this is normal if the destination filesystem isn't Mac OS)
+                            $self->Warn('Error creating Mac OS resource fork');
+                        }
+                        close SRC;
+                    } else {
+                        $err = 'opening';
+                    }
+                    $rtnVal = 0 if $err and $self->Error("Error $err Mac OS resource fork", 1);
+                }
+            }
+            # erase input file if renaming while editing information in place
+            unlink $infile or $self->Warn('Error erasing original file') if $eraseIn;
+        }
+    }
+    # close output file if we created it
+    if ($closeOut) {
+        # close file and set $rtnVal to -1 if there was an error
+        $rtnVal and $rtnVal = -1 unless close($outRef);
+        # erase the output file if we weren't successful
+        if ($rtnVal <= 0) {
+            unlink $outfile;
+        # else rename temporary file if necessary
+        } elsif ($tmpfile) {
+            CopyFileAttrs($infile, $tmpfile);   # copy attributes to new file
+            unless (rename($tmpfile, $infile)) {
+                # some filesystems won't overwrite with 'rename', so try erasing original
+                if (not unlink($infile)) {
+                    unlink $tmpfile;
+                    $self->Error('Error renaming temporary file');
+                    $rtnVal = 0;
+                } elsif (not rename($tmpfile, $infile)) {
+                    $self->Error('Error renaming temporary file after deleting original');
+                    $rtnVal = 0;
+                }
+            }
+        }
+    }
+    # set FileModifyDate if requested (and if possible!)
+    if (defined $fileModifyDate and $rtnVal > 0 and
+        ($closeOut or ($closeIn and defined $outBuff)) and
+        $self->SetFileModifyDate($closeOut ? $outfile : $infile, $originalTime) > 0)
+    {
+        ++$self->{CHANGED}; # we changed something
+    }
+    # check for write error and set appropriate error message and return value
+    if ($rtnVal < 0) {
+        $self->Error('Error writing output file') unless $$self{VALUE}{Error};
+        $rtnVal = 0;    # return 0 on failure
+    } elsif ($rtnVal > 0) {
+        ++$rtnVal unless $self->{CHANGED};
+    }
+    # set things back to the way they were
+    $self->{RAF} = $oldRaf;
+
+    return $rtnVal;
+}
+
+#------------------------------------------------------------------------------
+# Get list of all available tags for specified group
+# Inputs: 0) optional group name (or string of names separated by colons)
+# Returns: tag list (sorted alphabetically)
+# Notes: Can't get tags for specific IFD
+sub GetAllTags(;$)
+{
+    local $_;
+    my $group = shift;
+    my (%allTags, @groups);
+    @groups = split ':', $group if $group;
+
+    my $exifTool = new Image::ExifTool;
+    LoadAllTables();    # first load all our tables
+    my @tableNames = keys %allTables;
+
+    # loop through all tables and save tag names to %allTags hash
+    while (@tableNames) {
+        my $table = GetTagTable(pop @tableNames);
+        my $tagID;
+        foreach $tagID (TagTableKeys($table)) {
+            my @infoArray = GetTagInfoList($table,$tagID);
+            my $tagInfo;
+GATInfo:    foreach $tagInfo (@infoArray) {
+                my $tag = $$tagInfo{Name};
+                $tag or warn("no name for tag!\n"), next;
+                # don't list subdirectories unless they are writable
+                next if $$tagInfo{SubDirectory} and not $$tagInfo{Writable};
+                next if $$tagInfo{Hidden};  # ignore hidden tags
+                if (@groups) {
+                    my @tg = $exifTool->GetGroup($tagInfo);
+                    foreach $group (@groups) {
+                        next GATInfo unless grep /^$group$/i, @tg;
+                    }
+                }
+                $allTags{$tag} = 1;
+            }
+        }
+    }
+    return sort keys %allTags;
+}
+
+#------------------------------------------------------------------------------
+# Get list of all writable tags
+# Inputs: 0) optional group name (or names separated by colons)
+# Returns: tag list (sorted alphbetically)
+sub GetWritableTags(;$)
+{
+    local $_;
+    my $group = shift;
+    my (%writableTags, @groups);
+    @groups = split ':', $group if $group;
+
+    my $exifTool = new Image::ExifTool;
+    LoadAllTables();
+    my @tableNames = keys %allTables;
+
+    while (@tableNames) {
+        my $tableName = pop @tableNames;
+        my $table = GetTagTable($tableName);
+        # attempt to load Write tables if autoloaded
+        my @path = split(/::/,$tableName);
+        if (@path > 3) {
+            my $i = $#path - 1;
+            $path[$i] = "Write$path[$i]";   # add 'Write' before class name
+            my $module = join('::',@path[0..($#path-1)]);
+            eval "require $module"; # (fails silently if nothing loaded)
+        }
+        my $tagID;
+        foreach $tagID (TagTableKeys($table)) {
+            my @infoArray = GetTagInfoList($table,$tagID);
+            my $tagInfo;
+GWTInfo:    foreach $tagInfo (@infoArray) {
+                my $tag = $$tagInfo{Name};
+                $tag or warn("no name for tag!\n"), next;
+                my $writable = $$tagInfo{Writable};
+                next unless $writable or ($table->{WRITABLE} and
+                    not defined $writable and not $$tagInfo{SubDirectory});
+                next if $$tagInfo{Hidden};  # ignore hidden tags
+                if (@groups) {
+                    my @tg = $exifTool->GetGroup($tagInfo);
+                    foreach $group (@groups) {
+                        next GWTInfo unless grep /^$group$/i, @tg;
+                    }
+                }
+                $writableTags{$tag} = 1;
+            }
+        }
+    }
+    return sort keys %writableTags;
+}
+
+#------------------------------------------------------------------------------
+# Get list of all group names
+# Inputs: 1) Group family number
+# Returns: List of group names (sorted alphabetically)
+sub GetAllGroups($)
+{
+    local $_;
+    my $family = shift || 0;
+
+    $family == 3 and return('Doc#', 'Main');
+    $family == 4 and return('Copy#');
+
+    LoadAllTables();    # first load all our tables
+
+    my @tableNames = keys %allTables;
+
+    # loop through all tag tables and get all group names
+    my %allGroups;
+    while (@tableNames) {
+        my $table = GetTagTable(pop @tableNames);
+        my ($grps, $grp, $tag, $tagInfo);
+        $allGroups{$grp} = 1 if ($grps = $$table{GROUPS}) and ($grp = $$grps{$family});
+        foreach $tag (TagTableKeys($table)) {
+            my @infoArray = GetTagInfoList($table, $tag);
+            foreach $tagInfo (@infoArray) {
+                next unless ($grps = $$tagInfo{Groups}) and ($grp = $$grps{$family});
+                $allGroups{$grp} = 1;
+            }
+        }
+    }
+    return sort keys %allGroups;
+}
+
+#------------------------------------------------------------------------------
+# get priority group list for new values
+# Inputs: 0) ExifTool object reference
+# Returns: List of group names
+sub GetNewGroups($)
+{
+    my $self = shift;
+    return @{$self->{WRITE_GROUPS}};
+}
+
+#------------------------------------------------------------------------------
+# Get list of all deletable group names
+# Returns: List of group names (sorted alphabetically)
+sub GetDeleteGroups()
+{
+    return sort @delGroups;
+}
+
+#==============================================================================
+# Functions below this are not part of the public API
+
+#------------------------------------------------------------------------------
+# Un-escape string according to options settings and clear UTF-8 flag
+# Inputs: 0) ExifTool ref, 1) string ref or string ref ref
+# Notes: also de-references SCALAR values
+sub Sanitize($$)
+{
+    my ($self, $valPt) = @_;
+    # de-reference SCALAR references
+    $$valPt = $$$valPt if ref $$valPt eq 'SCALAR';
+    # make sure the Perl UTF-8 flag is OFF for the value if perl 5.6 or greater
+    # (otherwise our byte manipulations get corrupted!!)
+    if ($] >= 5.006 and (eval 'require Encode; Encode::is_utf8($$valPt)' or $@)) {
+        # repack by hand if Encode isn't available
+        $$valPt = $@ ? pack('C*',unpack('U0C*',$$valPt)) : Encode::encode('utf8',$$valPt);
+    }
+    # un-escape value if necessary
+    if ($$self{OPTIONS}{Escape}) {
+        # (XMP.pm and HTML.pm were require'd as necessary when option was set)
+        if ($$self{OPTIONS}{Escape} eq 'XML') {
+            $$valPt = Image::ExifTool::XMP::UnescapeXML($$valPt);
+        } elsif ($$self{OPTIONS}{Escape} eq 'HTML') {
+            $$valPt = Image::ExifTool::HTML::UnescapeHTML($$valPt);
+        }
+    }
+}
+
+#------------------------------------------------------------------------------
+# Apply inverse conversions
+# Inputs: 0) ExifTool ref, 1) value, 2) tagInfo (or Struct item) ref,
+#         3) tag name, 4) group 1 name, 5) conversion type (or undef),
+#         6) [optional] want group
+# Returns: 0) converted value, 1) error string (or undef on success)
+# Notes: Uses ExifTool "ConvType" member to specify conversion type
+sub ConvInv($$$$$;$$)
+{
+    my ($self, $val, $tagInfo, $tag, $wgrp1, $convType, $wantGroup) = @_;
+    my ($err, $type);
+
+Conv: for (;;) {
+        if (not defined $type) {
+            # split value into list if necessary
+            if ($$tagInfo{List}) {
+                my $listSplit = $$tagInfo{AutoSplit} || $self->{OPTIONS}{ListSplit};
+                if (defined $listSplit) {
+                    $listSplit = ',?\s+' if $listSplit eq '1' and $$tagInfo{AutoSplit};
+                    my @splitVal = split /$listSplit/, $val;
+                    $val = \@splitVal if @splitVal > 1;
+                }
+            }
+            $type = $convType || $$self{ConvType} || 'PrintConv';
+        } elsif ($type ne 'ValueConv') {
+            $type = 'ValueConv';
+        } else {    
+            # finally, do our value check
+            my ($err2, $v);
+            if ($tagInfo->{WriteCheck}) {
+                #### eval WriteCheck ($self, $tagInfo, $val)
+                $err2 = eval $tagInfo->{WriteCheck};
+                $@ and warn($@), $err2 = 'Error evaluating WriteCheck';
+            }
+            unless ($err2) {
+                my $table = $tagInfo->{Table};
+                if ($table and $table->{CHECK_PROC} and not $$tagInfo{RawConvInv}) {
+                    my $checkProc = $table->{CHECK_PROC};
+                    if (ref $val eq 'ARRAY') {
+                        # loop through array values
+                        foreach $v (@$val) {
+                            $err2 = &$checkProc($self, $tagInfo, \$v);
+                            last if $err2;
+                        }
+                    } else {
+                        $err2 = &$checkProc($self, $tagInfo, \$val);
+                    }
+                }
+            }
+            if (defined $err2) {
+                # skip writing this tag if error string is empty
+                $err2 or goto WriteAlso;
+                $err = "$err2 for $wgrp1:$tag";
+                $self->VPrint(2, "$err\n");
+                undef $val; # value was invalid
+            }
+            last;
+        }
+        my $conv = $tagInfo->{$type};
+        my $convInv = $tagInfo->{"${type}Inv"};
+        # nothing to do at this level if no conversion defined
+        next unless defined $conv or defined $convInv;
+
+        my (@valList, $index, $convList, $convInvList);
+        if (ref $val eq 'ARRAY') {
+            # handle ValueConv of ListSplit and AutoSplit values
+            @valList = @$val;
+            $val = $valList[$index = 0];
+        } elsif (ref $conv eq 'ARRAY' or ref $convInv eq 'ARRAY') {
+            # handle conversion lists
+            @valList = split /$listSep{$type}/, $val;
+            $val = $valList[$index = 0];
+            if (ref $conv eq 'ARRAY') {
+                $convList = $conv;
+                $conv = $$conv[0];
+            }
+            if (ref $convInv eq 'ARRAY') {
+                $convInvList = $convInv;
+                $convInv = $$convInv[0];
+            }
+        }
+        # loop through multiple values if necessary
+        for (;;) {
+            if ($convInv) {
+                # capture eval warnings too
+                local $SIG{'__WARN__'} = \&SetWarning;
+                undef $evalWarning;
+                if (ref($convInv) eq 'CODE') {
+                    $val = &$convInv($val, $self);
+                } else {
+                    #### eval PrintConvInv/ValueConvInv ($val, $self, $wantGroup)
+                    $val = eval $convInv;
+                    $@ and $evalWarning = $@;
+                }
+                if ($evalWarning) {
+                    # an empty warning ("\n") ignores tag with no error
+                    if ($evalWarning eq "\n") {
+                        $err = '' unless defined $err;
+                    } else {
+                        $err = CleanWarning() . " in $wgrp1:$tag (${type}Inv)";
+                        $self->VPrint(2, "$err\n");
+                    }
+                    undef $val;
+                    last Conv;
+                } elsif (not defined $val) {
+                    $err = "Error converting value for $wgrp1:$tag (${type}Inv)";
+                    $self->VPrint(2, "$err\n");
+                    last Conv;
+                }
+            } elsif ($conv) {
+                if (ref $conv eq 'HASH') {
+                    my ($multi, $lc);
+                    # insert alternate language print conversions if required
+                    if ($$self{CUR_LANG} and $type eq 'PrintConv' and
+                        ref($lc = $self->{CUR_LANG}{$tag}) eq 'HASH' and
+                        ($lc = $$lc{PrintConv}))
+                    {
+                        my %newConv;
+                        foreach (keys %$conv) {
+                            my $val = $$conv{$_};
+                            defined $$lc{$val} or $newConv{$_} = $val, next;
+                            $newConv{$_} = $self->Decode($$lc{$val}, 'UTF8');
+                        }
+                        if ($$conv{BITMASK}) {
+                            foreach (keys %{$$conv{BITMASK}}) {
+                                my $val = $$conv{BITMASK}{$_};
+                                defined $$lc{$val} or $newConv{BITMASK}{$_} = $val, next;
+                                $newConv{BITMASK}{$_} = $self->Decode($$lc{$val}, 'UTF8');
+                            }
+                        }
+                        $conv = \%newConv;
+                    }
+                    if ($$conv{BITMASK}) {
+                        my $lookupBits = $$conv{BITMASK};
+                        my ($val2, $err2) = EncodeBits($val, $lookupBits);
+                        if ($err2) {
+                            # ok, try matching a straight value
+                            ($val, $multi) = ReverseLookup($val, $conv);
+                            unless (defined $val) {
+                                $err = "Can't encode $wgrp1:$tag ($err2)";
+                                $self->VPrint(2, "$err\n");
+                                last Conv;
+                            }
+                        } elsif (defined $val2) {
+                            $val = $val2;
+                        } else {
+                            delete $$conv{BITMASK};
+                            ($val, $multi) = ReverseLookup($val, $conv);
+                            $$conv{BITMASK} = $lookupBits;
+                        }
+                    } else {
+                        ($val, $multi) = ReverseLookup($val, $conv);
+                    }
+                    unless (defined $val) {
+                        $err = "Can't convert $wgrp1:$tag (" .
+                               ($multi ? 'matches more than one' : 'not in') . " $type)";
+                        $self->VPrint(2, "$err\n");
+                        last Conv;
+                    }
+                } elsif (not $$tagInfo{WriteAlso}) {
+                    $err = "Can't convert value for $wgrp1:$tag (no ${type}Inv)";
+                    $self->VPrint(2, "$err\n");
+                    undef $val;
+                    last Conv;
+                }
+            }
+            last unless @valList;
+            $valList[$index] = $val;
+            if (++$index >= @valList) {
+                # leave AutoSplit lists in ARRAY form, or join conversion lists
+                $val = $$tagInfo{List} ? \@valList : join ' ', @valList;
+                last;
+            }
+            $conv = $$convList[$index] if $convList;
+            $convInv = $$convInvList[$index] if $convInvList;
+            $val = $valList[$index];
+        }
+    } # end ValueConv/PrintConv loop
+
+    return($val, $err);
+}
+
+#------------------------------------------------------------------------------
+# convert tag names to values in a string (ie. "${EXIF:ISO}x $$" --> "100x $")
+# Inputs: 0) ExifTool object ref, 1) reference to list of found tags
+#         2) string with embedded tag names, 3) Options:
+#               undef    - set missing tags to ''
+#              'Error'   - issue minor error on missing tag (and return undef)
+#              'Warn'    - issue minor warning on missing tag (and return undef)
+#               Hash ref - hash for return of tag/value pairs
+# Returns: string with embedded tag values (or '$info{TAGNAME}' entries with Hash ref option)
+# Notes:
+# - tag names are not case sensitive and may end with '#' for ValueConv value
+# - uses MissingTagValue option if set
+sub InsertTagValues($$$;$)
+{
+    my ($self, $foundTags, $line, $opt) = @_;
+    my $rtnStr = '';
+    while ($line =~ /(.*?)\$(\{?)([-\w]+|\$|\/)(.*)/s) {
+        my (@tags, $pre, $var, $bra, $val, $tg, @vals, $type);
+        ($pre, $bra, $var, $line) = ($1, $2, $3, $4);
+        # "$$" represents a "$" symbol, and "$/" is a newline
+        if ($var eq '$' or $var eq '/') {
+            $var = "\n" if $var eq '/';
+            $rtnStr .= "$pre$var";
+            $line =~ s/^\}// if $bra;
+            next;
+        }
+        # allow multiple group names
+        while ($line =~ /^:([-\w]+)(.*)/s) {
+            my $group = $var;
+            ($var, $line) = ($1, $2);
+            $var = "$group:$var";
+        }
+        # allow trailing '#' to indicate ValueConv value
+        $type = 'ValueConv' if $line =~ s/^#//;
+        # remove trailing bracket if there was a leading one
+        $line =~ s/^\}// if $bra;
+        push @tags, $var;
+        ExpandShortcuts(\@tags);
+        @tags or $rtnStr .= $pre, next;
+
+        for (;;) {
+            my $tag = shift @tags;
+            if ($tag =~ /(.*):(.+)/) {
+                my $group;
+                ($group, $tag) = ($1, $2);
+                # find the specified tag
+                my @matches = grep /^$tag(\s|$)/i, @$foundTags;
+                @matches = $self->GroupMatches($group, \@matches);
+                foreach $tg (@matches) {
+                    if (defined $val and $tg =~ / \((\d+)\)$/) {
+                        # take the most recently extracted tag
+                        my $tagNum = $1;
+                        next if $tag !~ / \((\d+)\)$/ or $1 > $tagNum;
+                    }
+                    $val = $self->GetValue($tg, $type);
+                    $tag = $tg;
+                    last unless $tag =~ / /;    # all done if we got our best match
+                }
+            } else {
+                # get the tag value
+                $val = $self->GetValue($tag, $type);
+                unless (defined $val) {
+                    # check for tag name with different case
+                    ($tg) = grep /^$tag$/i, @$foundTags;
+                    if (defined $tg) {
+                        $val = $self->GetValue($tg, $type);
+                        $tag = $tg;
+                    }
+                }
+            }
+            if (ref $val eq 'ARRAY') {
+                $val = join($self->{OPTIONS}{ListSep}, @$val);
+            } elsif (ref $val eq 'SCALAR') {
+                if ($self->{OPTIONS}{Binary} or $$val =~ /^Binary data/) {
+                    $val = $$val;
+                } else {
+                    $val = 'Binary data ' . length($$val) . ' bytes';
+                }
+            } elsif (not defined $val) {
+                last unless @tags;
+                next;
+            }
+            last unless @tags;
+            push @vals, $val;
+            undef $val;
+        }
+        if (@vals) {
+            push @vals, $val if defined $val;
+            $val = join '', @vals;
+        }
+        unless (defined $val or ref $opt) {
+            $val = $self->{OPTIONS}{MissingTagValue};
+            unless (defined $val) {
+                no strict 'refs';
+                return undef if $opt and &$opt($self, "Tag '$var' not defined", 1);
+                $val = '';
+            }
+        }
+        if (ref $opt eq 'HASH') {
+            $var .= '#' if $type;
+            $rtnStr .= "$pre\$info{'$var'}";
+            $$opt{$var} = $val;
+        } else {
+            $rtnStr .= "$pre$val";
+        }
+    }
+    return $rtnStr . $line;
+}
+
+#------------------------------------------------------------------------------
+# Is specified tag writable
+# Inputs: 0) tag name, case insensitive (optional group name currently ignored)
+# Returns: 0=exists but not writable, 1=writable, undef=doesn't exist
+sub IsWritable($)
+{
+    my $tag = shift;
+    $tag =~ s/^(.*)://; # ignore group name
+    my @tagInfo = FindTagInfo($tag);
+    unless (@tagInfo) {
+        return 0 if TagExists($tag);
+        return undef;
+    }
+    my $tagInfo;
+    foreach $tagInfo (@tagInfo) {
+        return 1 if $$tagInfo{Writable} or $tagInfo->{Table}{WRITABLE};
+        # must call WRITE_PROC to autoload writer because this may set the writable tag
+        my $writeProc = $tagInfo->{Table}{WRITE_PROC};
+        next unless $writeProc;
+        &$writeProc();  # dummy call to autoload writer
+        return 1 if $$tagInfo{Writable};
+    }
+    return 0;
+}
+
+#------------------------------------------------------------------------------
+# Create directory for specified file
+# Inputs: 0) complete file name including path
+# Returns: 1 = directory created, 0 = nothing done, -1 = error
+sub CreateDirectory($)
+{
+    local $_;
+    my $file = shift;
+    my $rtnVal = 0;
+    my $dir;
+    ($dir = $file) =~ s/[^\/]*$//;  # remove filename from path specification
+    if ($dir and not -d $dir) {
+        my @parts = split /\//, $dir;
+        $dir = '';
+        foreach (@parts) {
+            $dir .= $_;
+            if (length $dir and not -d $dir) {
+                # create directory since it doesn't exist
+                mkdir($dir, 0777) or return -1;
+                $rtnVal = 1;
+            }
+            $dir .= '/';
+        }
+    }
+    return $rtnVal;
+}
+
+#------------------------------------------------------------------------------
+# Copy file attributes from one file to another
+# Inputs: 0) source file name, 1) destination file name
+# Notes: eventually add support for extended attributes?
+sub CopyFileAttrs($$)
+{
+    my ($src, $dst) = @_;
+    my ($mode, $uid, $gid) = (stat($src))[2, 4, 5];
+    eval { chmod($mode & 07777, $dst) } if defined $mode;
+    eval { chown($uid, $gid, $dst) } if defined $uid and defined $gid;
+}
+
+#------------------------------------------------------------------------------
+# Get new file name
+# Inputs: 0) existing name, 1) new name
+# Returns: new file path name
+sub GetNewFileName($$)
+{
+    my ($oldName, $newName) = @_;
+    my ($dir, $name) = ($oldName =~ m{(.*/)(.*)});
+    ($dir, $name) = ('', $oldName) unless defined $dir;
+    if ($newName =~ m{/$}) {
+        $newName = "$newName$name"; # change dir only
+    } elsif ($newName !~ m{/}) {
+        $newName = "$dir$newName";  # change name only if newname doesn't specify dir
+    }                               # else change dir and name
+    return $newName;
+}
+
+#------------------------------------------------------------------------------
+# Get next available tag key
+# Inputs: 0) hash reference (keys are tag keys), 1) tag name
+# Returns: next available tag key
+sub NextTagKey($$)
+{
+    my ($info, $tag) = @_;
+    return $tag unless exists $$info{$tag};
+    my $i;
+    for ($i=1; ; ++$i) {
+        my $key = "$tag ($i)";
+        return $key unless exists $$info{$key};
+    }
+}
+
+#------------------------------------------------------------------------------
+# Reverse hash lookup
+# Inputs: 0) value, 1) hash reference
+# Returns: Hash key or undef if not found (plus flag for multiple matches in list context)
+sub ReverseLookup($$)
+{
+    my ($val, $conv) = @_;
+    return undef unless defined $val;
+    my $multi;
+    if ($val =~ /^Unknown\s*\((.*)\)$/i) {
+        $val = $1;    # was unknown
+        if ($val =~ /^0x([\da-fA-F]+)$/) {
+            $val = hex($val);   # convert hex value
+        }
+    } else {
+        my $qval = quotemeta $val;
+        my @patterns = (
+            "^$qval\$",         # exact match
+            "^(?i)$qval\$",     # case-insensitive
+            "^(?i)$qval",       # beginning of string
+            "(?i)$qval",        # substring
+        );
+        # hash entries to ignore in reverse lookup
+        my ($pattern, $found, $matches);
+PAT:    foreach $pattern (@patterns) {
+            $matches = scalar grep /$pattern/, values(%$conv);
+            next unless $matches;
+            # multiple matches are bad unless they were exact
+            if ($matches > 1 and $pattern !~ /\$$/) {
+                # don't match entries that we should ignore
+                foreach (keys %ignorePrintConv) {
+                    --$matches if defined $$conv{$_} and $$conv{$_} =~ /$pattern/;
+                }
+                last if $matches > 1;
+            }
+            foreach (sort keys %$conv) {
+                next if $$conv{$_} !~ /$pattern/ or $ignorePrintConv{$_};
+                $val = $_;
+                $found = 1;
+                last PAT;
+            }
+        }
+        unless ($found) {
+            # call OTHER conversion routine if available
+            $val = $$conv{OTHER} ? &{$$conv{OTHER}}($val,1,$conv) : undef;
+            $multi = 1 if $matches > 1;
+        }
+    }
+    return ($val, $multi) if wantarray;
+    return $val;
+}
+
+#------------------------------------------------------------------------------
+# Return true if we are deleting or overwriting the specified tag
+# Inputs: 0) new value hash reference
+#         1) optional tag value (before RawConv) if deleting specific values
+# Returns: >0 - tag should be overwritten
+#          =0 - the tag should be preserved
+#          <0 - not sure, we need the value to know
+sub IsOverwriting($;$)
+{
+    my ($nvHash, $val) = @_;
+    return 0 unless $nvHash;
+    # overwrite regardless if no DelValues specified
+    return 1 unless $$nvHash{DelValue};
+    # never overwrite if DelValue list exists but is empty
+    my $shift = $$nvHash{Shift};
+    return 0 unless @{$$nvHash{DelValue}} or defined $shift;
+    # return "don't know" if we don't have a value to test
+    return -1 unless defined $val;
+    # apply raw conversion if necessary
+    my $tagInfo = $$nvHash{TagInfo};
+    my $conv = $$tagInfo{RawConv};
+    if ($conv) {
+        local $SIG{'__WARN__'} = \&SetWarning;
+        undef $evalWarning;
+        if (ref $conv eq 'CODE') {
+            $val = &$conv($val, $$nvHash{Self});
+        } else {
+            my $self = $$nvHash{Self};
+            my $tag = $$tagInfo{Name};
+            #### eval RawConv ($self, $val, $tag, $tagInfo)
+            $val = eval $conv;
+            $@ and $evalWarning = $@;
+        }
+        return -1 unless defined $val;
+    }
+    # apply time shift if necessary
+    if (defined $shift) {
+        require 'Image/ExifTool/Shift.pl';
+        my $err = ApplyShift($$tagInfo{Shift}, $shift, $val, $nvHash);
+        if ($err) {
+            $nvHash->{Self}->Warn("$err when shifting $$tagInfo{Name}");
+            return 0;
+        }
+        # don't bother overwriting if value is the same
+        return 0 if $val eq $$nvHash{Value}[0];
+        return 1;
+    }
+    # return 1 if value matches a DelValue
+    my $delVal;
+    foreach $delVal (@{$$nvHash{DelValue}}) {
+        return 1 if $val eq $delVal;
+    }
+    return 0;
+}
+
+#------------------------------------------------------------------------------
+# Return true if we are creating the specified tag even if it didn't exist before
+# Inputs: 0) new value hash reference
+# Returns: true if we should add the tag
+sub IsCreating($)
+{
+    return $_[0]{IsCreating};
+}
+
+#------------------------------------------------------------------------------
+# Get write group for specified tag
+# Inputs: 0) new value hash reference
+# Returns: Write group name
+sub GetWriteGroup($)
+{
+    return $_[0]{WriteGroup};
+}
+
+#------------------------------------------------------------------------------
+# Get name of write group or family 1 group
+# Inputs: 0) ExifTool ref, 1) tagInfo ref, 2) write group name
+# Returns: Name of group for verbose message
+sub GetWriteGroup1($$)
+{
+    my ($self, $tagInfo, $writeGroup) = @_;
+    return $writeGroup unless $writeGroup =~ /^(MakerNotes|XMP|Composite)$/;
+    return $self->GetGroup($tagInfo, 1);
+}
+
+#------------------------------------------------------------------------------
+# Get new value hash for specified tagInfo/writeGroup
+# Inputs: 0) ExifTool object reference, 1) reference to tag info hash
+#         2) Write group name, 3) Options: 'delete' or 'create'
+# Returns: new value hash reference for specified write group
+#          (or first new value hash in linked list if write group not specified)
+sub GetNewValueHash($$;$$)
+{
+    my ($self, $tagInfo, $writeGroup, $opts) = @_;
+    my $nvHash = $self->{NEW_VALUE}{$tagInfo};
+
+    my %opts;   # quick lookup for options
+    $opts and $opts{$opts} = 1;
+    $writeGroup = '' unless defined $writeGroup;
+
+    if ($writeGroup) {
+        # find the new value in the list with the specified write group
+        while ($nvHash and $nvHash->{WriteGroup} ne $writeGroup) {
+            $nvHash = $nvHash->{Next};
+        }
+    }
+    # remove this entry if deleting, or if creating a new entry and
+    # this entry is marked with "Save" flag
+    if (defined $nvHash and ($opts{'delete'} or
+        ($opts{'create'} and $nvHash->{Save})))
+    {
+        if ($opts{'delete'}) {
+            $self->RemoveNewValueHash($nvHash, $tagInfo);
+            undef $nvHash;
+        } else {
+            # save a copy of this new value hash
+            my %copy = %$nvHash;
+            my $key;
+            # make copy of Value and DelValue lists
+            foreach $key (keys %copy) {
+                next unless ref $copy{$key} eq 'ARRAY';
+                $copy{$key} = [ @{$copy{$key}} ];
+            }
+            my $saveHash = $self->{SAVE_NEW_VALUE};
+            # add to linked list of saved new value hashes
+            $copy{Next} = $saveHash->{$tagInfo};
+            $saveHash->{$tagInfo} = \%copy;
+            delete $nvHash->{Save};   # don't save it again
+        }
+    }
+    if (not defined $nvHash and $opts{'create'}) {
+        # create a new entry
+        $nvHash = {
+            TagInfo => $tagInfo,
+            WriteGroup => $writeGroup,
+            Self => $self,
+        };
+        # add entry to our NEW_VALUE hash
+        if ($self->{NEW_VALUE}{$tagInfo}) {
+            # add to end of linked list
+            my $lastHash = LastInList($self->{NEW_VALUE}{$tagInfo});
+            $lastHash->{Next} = $nvHash;
+        } else {
+            $self->{NEW_VALUE}{$tagInfo} = $nvHash;
+        }
+    }
+    return $nvHash;
+}
+
+#------------------------------------------------------------------------------
+# Load all tag tables
+sub LoadAllTables()
+{
+    return if $loadedAllTables;
+
+    # load all of our non-referenced tables (first our modules)
+    my $table;
+    foreach $table (@loadAllTables) {
+        my $tableName = "Image::ExifTool::$table";
+        $tableName .= '::Main' unless $table =~ /:/;
+        GetTagTable($tableName);
+    }
+    # (then our special tables)
+    GetTagTable('Image::ExifTool::Extra');
+    GetTagTable('Image::ExifTool::Composite');
+    # recursively load all tables referenced by the current tables
+    my @tableNames = keys %allTables;
+    my %pushedTables;
+    while (@tableNames) {
+        $table = GetTagTable(shift @tableNames);
+        # call write proc if it exists in case it adds tags to the table
+        my $writeProc = $table->{WRITE_PROC};
+        $writeProc and &$writeProc();
+        # recursively scan through tables in subdirectories
+        foreach (TagTableKeys($table)) {
+            my @infoArray = GetTagInfoList($table,$_);
+            my $tagInfo;
+            foreach $tagInfo (@infoArray) {
+                my $subdir = $$tagInfo{SubDirectory} or next;
+                my $tableName = $$subdir{TagTable} or next;
+                # next if table already loaded or queued for loading
+                next if $allTables{$tableName} or $pushedTables{$tableName};
+                push @tableNames, $tableName;   # must scan this one too
+                $pushedTables{$tableName} = 1;
+            }
+        }
+    }
+    $loadedAllTables = 1;
+}
+
+#------------------------------------------------------------------------------
+# Remove new value hash from linked list (and save if necessary)
+# Inputs: 0) ExifTool object reference, 1) new value hash ref, 2) tagInfo ref
+sub RemoveNewValueHash($$$)
+{
+    my ($self, $nvHash, $tagInfo) = @_;
+    my $firstHash = $self->{NEW_VALUE}{$tagInfo};
+    if ($nvHash eq $firstHash) {
+        # remove first entry from linked list
+        if ($nvHash->{Next}) {
+            $self->{NEW_VALUE}{$tagInfo} = $nvHash->{Next};
+        } else {
+            delete $self->{NEW_VALUE}{$tagInfo};
+        }
+    } else {
+        # find the list element pointing to this hash
+        $firstHash = $firstHash->{Next} while $firstHash->{Next} ne $nvHash;
+        # remove from linked list
+        $firstHash->{Next} = $nvHash->{Next};
+    }
+    # save the existing entry if necessary
+    if ($nvHash->{Save}) {
+        my $saveHash = $self->{SAVE_NEW_VALUE};
+        # add to linked list of saved new value hashes
+        $nvHash->{Next} = $saveHash->{$tagInfo};
+        $saveHash->{$tagInfo} = $nvHash;
+    }
+}
+
+#------------------------------------------------------------------------------
+# Remove all new value entries for specified group
+# Inputs: 0) ExifTool object reference, 1) group name
+sub RemoveNewValuesForGroup($$)
+{
+    my ($self, $group) = @_;
+
+    return unless $self->{NEW_VALUE};
+
+    # make list of all groups we must remove
+    my @groups = ( $group );
+    push @groups, @{$removeGroups{$group}} if $removeGroups{$group};
+
+    my ($out, @keys, $hashKey);
+    $out = $self->{OPTIONS}{TextOut} if $self->{OPTIONS}{Verbose} > 1;
+
+    # loop though all new values, and remove any in this group
+    @keys = keys %{$self->{NEW_VALUE}};
+    foreach $hashKey (@keys) {
+        my $nvHash = $self->{NEW_VALUE}{$hashKey};
+        # loop through each entry in linked list
+        for (;;) {
+            my $nextHash = $nvHash->{Next};
+            my $tagInfo = $nvHash->{TagInfo};
+            my ($grp0,$grp1) = $self->GetGroup($tagInfo);
+            my $wgrp = $nvHash->{WriteGroup};
+            # use group1 if write group is not specific
+            $wgrp = $grp1 if $wgrp eq $grp0;
+            if (grep /^($grp0|$wgrp)$/i, @groups) {
+                $out and print $out "Removed new value for $wgrp:$$tagInfo{Name}\n";
+                # remove from linked list
+                $self->RemoveNewValueHash($nvHash, $tagInfo);
+            }
+            $nvHash = $nextHash or last;
+        }
+    }
+}
+
+#------------------------------------------------------------------------------
+# Get list of tagInfo hashes for all new data
+# Inputs: 0) ExifTool object reference, 1) optional tag table pointer
+# Returns: list of tagInfo hashes
+sub GetNewTagInfoList($;$)
+{
+    my ($self, $tagTablePtr) = @_;
+    my @tagInfoList;
+    my $nv = $self->{NEW_VALUE};
+    if ($nv) {
+        my $hashKey;
+        foreach $hashKey (keys %$nv) {
+            my $tagInfo = $nv->{$hashKey}{TagInfo};
+            next if $tagTablePtr and $tagTablePtr ne $tagInfo->{Table};
+            push @tagInfoList, $tagInfo;
+        }
+    }
+    return @tagInfoList;
+}
+
+#------------------------------------------------------------------------------
+# Get hash of tagInfo references keyed on tagID for a specific table
+# Inputs: 0) ExifTool object reference, 1-N) tag table pointers
+# Returns: hash reference
+sub GetNewTagInfoHash($@)
+{
+    my $self = shift;
+    my (%tagInfoHash, $hashKey);
+    my $nv = $self->{NEW_VALUE};
+    while ($nv) {
+        my $tagTablePtr = shift || last;
+        foreach $hashKey (keys %$nv) {
+            my $tagInfo = $nv->{$hashKey}{TagInfo};
+            next if $tagTablePtr and $tagTablePtr ne $tagInfo->{Table};
+            $tagInfoHash{$$tagInfo{TagID}} = $tagInfo;
+        }
+    }
+    return \%tagInfoHash;
+}
+
+#------------------------------------------------------------------------------
+# Get a tagInfo/tagID hash for subdirectories we need to add
+# Inputs: 0) ExifTool object reference, 1) parent tag table reference
+#         2) parent directory name (taken from GROUP0 of tag table if not defined)
+# Returns: Reference to Hash of subdirectory tagInfo references keyed by tagID
+#          (plus Reference to edit directory hash in list context)
+sub GetAddDirHash($$;$)
+{
+    my ($self, $tagTablePtr, $parent) = @_;
+    $parent or $parent = $tagTablePtr->{GROUPS}{0};
+    my $tagID;
+    my %addDirHash;
+    my %editDirHash;
+    my $addDirs = $self->{ADD_DIRS};
+    my $editDirs = $self->{EDIT_DIRS};
+    foreach $tagID (TagTableKeys($tagTablePtr)) {
+        my @infoArray = GetTagInfoList($tagTablePtr,$tagID);
+        my $tagInfo;
+        foreach $tagInfo (@infoArray) {
+            next unless $$tagInfo{SubDirectory};
+            # get name for this sub directory
+            # (take directory name from SubDirectory DirName if it exists,
+            #  otherwise Group0 name of SubDirectory TagTable or tag Group1 name)
+            my $dirName = $tagInfo->{SubDirectory}{DirName};
+            unless ($dirName) {
+                # use tag name for directory name and save for next time
+                $dirName = $$tagInfo{Name};
+                $tagInfo->{SubDirectory}{DirName} = $dirName;
+            }
+            # save this directory information if we are writing it
+            if ($$editDirs{$dirName} and $$editDirs{$dirName} eq $parent) {
+                $editDirHash{$tagID} = $tagInfo;
+                $addDirHash{$tagID} = $tagInfo if $$addDirs{$dirName};
+            }
+        }
+    }
+    return (\%addDirHash, \%editDirHash) if wantarray;
+    return \%addDirHash;
+}
+
+#------------------------------------------------------------------------------
+# Get localized version of tagInfo hash (used by MIE, XMP, PNG and QuickTime)
+# Inputs: 0) tagInfo hash ref, 1) locale code (ie. "en_CA" for MIE)
+# Returns: new tagInfo hash ref, or undef if invalid
+# - sets LangCode member in new tagInfo
+sub GetLangInfo($$)
+{
+    my ($tagInfo, $langCode) = @_;
+    # make a new tagInfo hash for this locale
+    my $table = $$tagInfo{Table};
+    my $tagID = $$tagInfo{TagID} . '-' . $langCode;
+    my $langInfo = $$table{$tagID};
+    unless ($langInfo) {
+        # make a new tagInfo entry for this locale
+        $langInfo = {
+            %$tagInfo,
+            Name => $$tagInfo{Name} . '-' . $langCode,
+            Description => Image::ExifTool::MakeDescription($$tagInfo{Name}) .
+                           " ($langCode)",
+            LangCode => $langCode,
+        };
+        AddTagToTable($table, $tagID, $langInfo);
+    }
+    return $langInfo;
+}
+
+#------------------------------------------------------------------------------
+# initialize ADD_DIRS and EDIT_DIRS hashes for all directories that need
+# need to be created or will have tags changed in them
+# Inputs: 0) ExifTool object reference, 1) file type string (or map hash ref)
+#         2) preferred family 0 group name for creating tags
+# Notes: The ADD_DIRS and EDIT_DIRS keys are the directory names, and the values
+#        are the names of the parent directories (undefined for a top-level directory)
+sub InitWriteDirs($$;$)
+{
+    my ($self, $fileType, $preferredGroup) = @_;
+    my $editDirs = $self->{EDIT_DIRS} = { };
+    my $addDirs = $self->{ADD_DIRS} = { };
+    my $fileDirs = $dirMap{$fileType};
+    unless ($fileDirs) {
+        return unless ref $fileType eq 'HASH';
+        $fileDirs = $fileType;
+    }
+    my @tagInfoList = $self->GetNewTagInfoList();
+    my ($tagInfo, $nvHash);
+
+    # save the preferred group
+    $$self{PreferredGroup} = $preferredGroup;
+
+    foreach $tagInfo (@tagInfoList) {
+        # cycle through all hashes in linked list
+        for ($nvHash=$self->GetNewValueHash($tagInfo); $nvHash; $nvHash=$$nvHash{Next}) {
+            # are we creating this tag? (otherwise just deleting or editing it)
+            my $isCreating = $nvHash->{IsCreating};
+            if ($isCreating) {
+                # if another group is taking priority, only create
+                # directory if specifically adding tags to this group
+                # or if this tag isn't being added to the priority group
+                $isCreating = 0 if $preferredGroup and
+                    $preferredGroup ne $self->GetGroup($tagInfo, 0) and
+                    $nvHash->{CreateGroups}{$preferredGroup};
+            } else {
+                # creating this directory if any tag is preferred and has a value
+                $isCreating = 1 if $preferredGroup and $$nvHash{Value} and
+                    $preferredGroup eq $self->GetGroup($tagInfo, 0);
+            }
+            # tag belongs to directory specified by WriteGroup, or by
+            # the Group0 name if WriteGroup not defined
+            my $dirName = $nvHash->{WriteGroup};
+            # remove MIE copy number(s) if they exist
+            if ($dirName =~ /^MIE\d*(-[a-z]+)?\d*$/i) {
+                $dirName = 'MIE' . ($1 || '');
+            }
+            my @dirNames;
+            while ($dirName) {
+                my $parent = $$fileDirs{$dirName};
+                if (ref $parent) {
+                    push @dirNames, reverse @$parent;
+                    $parent = pop @dirNames;
+                }
+                $$editDirs{$dirName} = $parent;
+                $$addDirs{$dirName} = $parent if $isCreating and $isCreating != 2;
+                $dirName = $parent || shift @dirNames
+            }
+        }
+    }
+    if (%{$self->{DEL_GROUP}}) {
+        # add delete groups to list of edited groups
+        foreach (keys %{$self->{DEL_GROUP}}) {
+            next if /^-/;   # ignore excluded groups
+            my $dirName = $_;
+            # translate necessary group 0 names
+            $dirName = $translateWriteGroup{$dirName} if $translateWriteGroup{$dirName};
+            # convert XMP group 1 names
+            $dirName = 'XMP' if $dirName =~ /^XMP-/;
+            my @dirNames;
+            while ($dirName) {
+                my $parent = $$fileDirs{$dirName};
+                if (ref $parent) {
+                    push @dirNames, reverse @$parent;
+                    $parent = pop @dirNames;
+                }
+                $$editDirs{$dirName} = $parent;
+                $dirName = $parent || shift @dirNames
+            }
+        }
+    }
+    # special case to edit JFIF to get resolutions if editing EXIF information
+    if ($$editDirs{IFD0} and $$fileDirs{JFIF}) {
+        $$editDirs{JFIF} = 'IFD1';
+        $$editDirs{APP0} = undef;
+    }
+
+    if ($self->{OPTIONS}{Verbose}) {
+        my $out = $self->{OPTIONS}{TextOut};
+        print $out "  Editing tags in: ";
+        foreach (sort keys %$editDirs) { print $out "$_ "; }
+        print $out "\n";
+        return unless $self->{OPTIONS}{Verbose} > 1;
+        print $out "  Creating tags in: ";
+        foreach (sort keys %$addDirs) { print $out "$_ "; }
+        print $out "\n";
+    }
+}
+
+#------------------------------------------------------------------------------
+# Write an image directory
+# Inputs: 0) ExifTool object reference, 1) source directory information reference
+#         2) tag table reference, 3) optional reference to writing procedure
+# Returns: New directory data or undefined on error
+sub WriteDirectory($$$;$)
+{
+    my ($self, $dirInfo, $tagTablePtr, $writeProc) = @_;
+    my ($out, $nvHash);
+
+    $tagTablePtr or return undef;
+    $out = $self->{OPTIONS}{TextOut} if $self->{OPTIONS}{Verbose};
+    # set directory name from default group0 name if not done already
+    my $dirName = $$dirInfo{DirName};
+    my $dataPt = $$dirInfo{DataPt};
+    my $grp0 = $tagTablePtr->{GROUPS}{0};
+    $dirName or $dirName = $$dirInfo{DirName} = $grp0;
+    if (%{$self->{DEL_GROUP}}) {
+        my $delGroup = $self->{DEL_GROUP};
+        # delete entire directory if specified
+        my $grp1 = $dirName;
+        my $delFlag = ($$delGroup{$grp0} or $$delGroup{$grp1});
+        if ($delFlag) {
+            unless ($blockExifTypes{$$self{FILE_TYPE}}) {
+                # restrict delete logic to prevent entire tiff image from being killed
+                # (don't allow IFD0 to be deleted, and delete only ExifIFD if EXIF specified)
+                if ($$self{FILE_TYPE} eq 'PSD') {
+                    # don't delete Photoshop directories from PSD image
+                    undef $grp1 if $grp0 eq 'Photoshop';
+                } elsif ($$self{FILE_TYPE} =~ /^(EPS|PS)$/) {
+                    # allow anything to be deleted from PostScript files
+                } elsif ($grp1 eq 'IFD0') {
+                    my $type = $self->{TIFF_TYPE} || $self->{FILE_TYPE};
+                    $$delGroup{IFD0} and $self->Warn("Can't delete IFD0 from $type",1);
+                    undef $grp1;
+                } elsif ($grp0 eq 'EXIF' and $$delGroup{$grp0}) {
+                    undef $grp1 unless $$delGroup{$grp1} or $grp1 eq 'ExifIFD';
+                }
+            }
+            if ($grp1) {
+                if ($dataPt or $$dirInfo{RAF}) {
+                    ++$self->{CHANGED};
+                    $out and print $out "  Deleting $grp1\n";
+                    # can no longer validate TIFF_END if deleting an entire IFD
+                    delete $self->{TIFF_END} if $dirName =~ /IFD/;
+                }
+                # don't add back into the wrong location
+                my $right = $$self{ADD_DIRS}{$grp1};
+                # (take care because EXIF directory name may be either EXIF or IFD0,
+                #  but IFD0 will be the one that appears in the directory map)
+                $right = $$self{ADD_DIRS}{IFD0} if not $right and $grp1 eq 'EXIF';
+                if ($delFlag == 2 and $right) {
+                    # also check grandparent because some routines create 2 levels in 1
+                    my $right2 = $$self{ADD_DIRS}{$right} || '';
+                    if (not $$dirInfo{Parent} or $$dirInfo{Parent} eq $right or
+                        $$dirInfo{Parent} eq $right2)
+                    {
+                        # create new empty directory
+                        my $data = '';
+                        my %dirInfo = (
+                            DirName    => $$dirInfo{DirName},
+                            Parent     => $$dirInfo{Parent},
+                            DirStart   => 0,
+                            DirLen     => 0,
+                            DataPt     => \$data,
+                            NewDataPos => $$dirInfo{NewDataPos},
+                            Fixup      => $$dirInfo{Fixup},
+                        );
+                        $dirInfo = \%dirInfo;
+                    } else {
+                        $self->Warn("Not recreating $grp1 in $$dirInfo{Parent} (should be in $right)",1);
+                        return '';
+                    }
+                } else {
+                    return '' unless $$dirInfo{NoDelete};
+                }
+            }
+        }
+    }
+    # use default proc from tag table if no proc specified
+    $writeProc or $writeProc = $$tagTablePtr{WRITE_PROC} or return undef;
+
+    # copy or delete new directory as a block if specified
+    my $blockName = $dirName;
+    $blockName = 'EXIF' if $blockName eq 'IFD0';
+    my $tagInfo = $Image::ExifTool::Extra{$blockName} || $$dirInfo{TagInfo};
+    while ($tagInfo and ($nvHash = $self->{NEW_VALUE}{$tagInfo}) and IsOverwriting($nvHash)) {
+        # protect against writing EXIF to wrong file types, etc
+        if ($blockName eq 'EXIF') {
+            unless ($blockExifTypes{$$self{FILE_TYPE}}) {
+                $self->Warn("Can't write EXIF as a block to $$self{FILE_TYPE} file");
+                last;
+            }
+            unless ($writeProc eq \&Image::ExifTool::WriteTIFF) {
+                # this could happen if we called WriteDirectory for an EXIF directory
+                # without going through WriteTIFF as the WriteProc, which would be bad
+                # because the EXIF block could end up with two TIFF headers
+                $self->Warn('Internal error writing EXIF -- please report');
+                last;
+            }
+        }
+        my $verb = 'Writing';
+        my $newVal = GetNewValues($nvHash);
+        unless (defined $newVal and length $newVal) {
+            $verb = 'Deleting';
+            $newVal = '';
+        }
+        $$dirInfo{BlockWrite} = 1;  # set flag indicating we did a block write
+        $out and print $out "  $verb $blockName as a block\n";
+        ++$self->{CHANGED};
+        return $newVal;
+    }
+    # guard against writing the same directory twice
+    if (defined $dataPt and defined $$dirInfo{DirStart} and defined $$dirInfo{DataPos}) {
+        my $addr = $$dirInfo{DirStart} + $$dirInfo{DataPos} + ($$dirInfo{Base}||0) + $$self{BASE};
+        # (Phase One P25 IIQ files have ICC_Profile duplicated in IFD0 and IFD1)
+        if ($self->{PROCESSED}{$addr} and ($dirName ne 'ICC_Profile' or $$self{TIFF_TYPE} ne 'IIQ')) {
+            if ($self->Error("$dirName pointer references previous $self->{PROCESSED}{$addr} directory", 1)) {
+                return undef;
+            } else {
+                $self->Warn("Deleting duplicate $dirName directory");
+                $out and print $out "  Deleting $dirName\n";
+                return '';  # delete the duplicate directory
+            }
+        }
+        $self->{PROCESSED}{$addr} = $dirName;
+    }
+    my $oldDir = $self->{DIR_NAME};
+    my $isRewriting = ($$dirInfo{DirLen} or (defined $dataPt and length $$dataPt) or $$dirInfo{RAF});
+    my $name;
+    if ($out) {
+        $name = ($dirName eq 'MakerNotes' and $$dirInfo{TagInfo}) ?
+                 $dirInfo->{TagInfo}{Name} : $dirName;
+        if (not defined $oldDir or $oldDir ne $name) {
+            my $verb = $isRewriting ? 'Rewriting' : 'Creating';
+            print $out "  $verb $name\n";
+        }
+    }
+    my $saveOrder = GetByteOrder();
+    my $oldChanged = $self->{CHANGED};
+    $self->{DIR_NAME} = $dirName;
+    push @{$self->{PATH}}, $$dirInfo{DirName};
+    $$dirInfo{IsWriting} = 1;
+    my $newData = &$writeProc($self, $dirInfo, $tagTablePtr);
+    pop @{$self->{PATH}};
+    # nothing changed if error occurred or nothing was created
+    $self->{CHANGED} = $oldChanged unless defined $newData and (length($newData) or $isRewriting);
+    $self->{DIR_NAME} = $oldDir;
+    SetByteOrder($saveOrder);
+    print $out "  Deleting $name\n" if $out and defined $newData and not length $newData;
+    return $newData;
+}
+
+#------------------------------------------------------------------------------
+# Uncommon utility routines to for reading binary data values
+# Inputs: 0) data reference, 1) offset into data
+sub Get64s($$)
+{
+    my ($dataPt, $pos) = @_;
+    my $pt = GetByteOrder() eq 'MM' ? 0 : 4;    # get position of high word
+    my $hi = Get32s($dataPt, $pos + $pt);       # preserve sign bit of high word
+    my $lo = Get32u($dataPt, $pos + 4 - $pt);
+    return $hi * 4294967296 + $lo;
+}
+sub Get64u($$)
+{
+    my ($dataPt, $pos) = @_;
+    my $pt = GetByteOrder() eq 'MM' ? 0 : 4;    # get position of high word
+    my $hi = Get32u($dataPt, $pos + $pt);       # (unsigned this time)
+    my $lo = Get32u($dataPt, $pos + 4 - $pt);
+    return $hi * 4294967296 + $lo;
+}
+# Decode extended 80-bit float used by Apple SANE and Intel 8087
+# (note: different than the IEEE standard 80-bit float)
+sub GetExtended($$)
+{
+    my ($dataPt, $pos) = @_;
+    my $pt = GetByteOrder() eq 'MM' ? 0 : 2;    # get position of exponent
+    my $exp = Get16u($dataPt, $pos + $pt);
+    my $sig = Get64u($dataPt, $pos + 2 - $pt);  # get significand as int64u
+    my $sign = $exp & 0x8000 ? -1 : 1;
+    $exp = ($exp & 0x7fff) - 16383 - 63; # (-63 to fractionalize significand)
+    return $sign * $sig * 2 ** $exp;
+}
+
+#------------------------------------------------------------------------------
+# Dump data in hex and ASCII to console
+# Inputs: 0) data reference, 1) length or undef, 2-N) Options:
+# Options: Start => offset to start of data (default=0)
+#          Addr => address to print for data start (default=DataPos+Start)
+#          DataPos => address of start of data
+#          Width => width of printout (bytes, default=16)
+#          Prefix => prefix to print at start of line (default='')
+#          MaxLen => maximum length to dump
+#          Out => output file reference
+#          Len => data length
+sub HexDump($;$%)
+{
+    my $dataPt = shift;
+    my $len    = shift;
+    my %opts   = @_;
+    my $start  = $opts{Start}  || 0;
+    my $addr   = $opts{Addr};
+    my $wid    = $opts{Width}  || 16;
+    my $prefix = $opts{Prefix} || '';
+    my $out    = $opts{Out}    || \*STDOUT;
+    my $maxLen = $opts{MaxLen};
+    my $datLen = length($$dataPt) - $start;
+    my $more;
+    $len = $opts{Len} if defined $opts{Len};
+
+    $addr = $start + ($opts{DataPos} || 0) unless defined $addr;
+    $len = $datLen unless defined $len;
+    if ($maxLen and $len > $maxLen) {
+        # print one line less to allow for $more line below
+        $maxLen = int(($maxLen - 1) / $wid) * $wid;
+        $more = $len - $maxLen;
+        $len = $maxLen;
+    }
+    if ($len > $datLen) {
+        print $out "$prefix    Warning: Attempted dump outside data\n";
+        print $out "$prefix    ($len bytes specified, but only $datLen available)\n";
+        $len = $datLen;
+    }
+    my $format = sprintf("%%-%ds", $wid * 3);
+    my $tmpl = 'H2' x $wid; # ('(H2)*' would have been nice, but older perl versions don't support it)
+    my $i;
+    for ($i=0; $i<$len; $i+=$wid) {
+        $wid > $len-$i and $wid = $len-$i, $tmpl = 'H2' x $wid;
+        printf $out "$prefix%8.4x: ", $addr+$i;
+        my $dat = substr($$dataPt, $i+$start, $wid);
+        my $s = join(' ', unpack($tmpl, $dat));
+        printf $out $format, $s;
+        $dat =~ tr /\x00-\x1f\x7f-\xff/./;
+        print $out "[$dat]\n";
+    }
+    $more and printf $out "$prefix    [snip $more bytes]\n";
+}
+
+#------------------------------------------------------------------------------
+# Print verbose tag information
+# Inputs: 0) ExifTool object reference, 1) tag ID
+#         2) tag info reference (or undef)
+#         3-N) extra parms:
+# Parms: Index => Index of tag in menu (starting at 0)
+#        Value => Tag value
+#        DataPt => reference to value data block
+#        DataPos => location of data block in file
+#        Size => length of value data within block
+#        Format => value format string
+#        Count => number of values
+#        Extra => Extra Verbose=2 information to put after tag number
+#        Table => Reference to tag table
+#        --> plus any of these HexDump() options: Start, Addr, Width
+sub VerboseInfo($$$%)
+{
+    my ($self, $tagID, $tagInfo, %parms) = @_;
+    my $verbose = $self->{OPTIONS}{Verbose};
+    my $out = $self->{OPTIONS}{TextOut};
+    my ($tag, $line, $hexID);
+
+    # generate hex number if tagID is numerical
+    if (defined $tagID) {
+        $tagID =~ /^\d+$/ and $hexID = sprintf("0x%.4x", $tagID);
+    } else {
+        $tagID = 'Unknown';
+    }
+    # get tag name
+    if ($tagInfo and $$tagInfo{Name}) {
+        $tag = $$tagInfo{Name};
+    } else {
+        my $prefix;
+        $prefix = $parms{Table}{TAG_PREFIX} if $parms{Table};
+        if ($prefix or $hexID) {
+            $prefix = 'Unknown' unless $prefix;
+            $tag = $prefix . '_' . ($hexID ? $hexID : $tagID);
+        } else {
+            $tag = $tagID;
+        }
+    }
+    my $dataPt = $parms{DataPt};
+    my $size = $parms{Size};
+    $size = length $$dataPt unless defined $size or not $dataPt;
+    my $indent = $self->{INDENT};
+
+    # Level 1: print tag/value information
+    $line = $indent;
+    my $index = $parms{Index};
+    if (defined $index) {
+        $line .= $index . ') ';
+        $line .= ' ' if length($index) < 2;
+        $indent .= '    '; # indent everything else to align with tag name
+    }
+    $line .= $tag;
+    if ($tagInfo and $$tagInfo{SubDirectory}) {
+        $line .= ' (SubDirectory) -->';
+    } else {
+        my $maxLen = 90 - length($line);
+        if (defined $parms{Value}) {
+            $line .= ' = ' . $self->Printable($parms{Value}, $maxLen);
+        } elsif ($dataPt) {
+            my $start = $parms{Start} || 0;
+            $line .= ' = ' . $self->Printable(substr($$dataPt,$start,$size), $maxLen);
+        }
+    }
+    print $out "$line\n";
+
+    # Level 2: print detailed information about the tag
+    if ($verbose > 1 and ($parms{Extra} or $parms{Format} or
+        $parms{DataPt} or defined $size or $tagID =~ /\//))
+    {
+        $line = $indent . '- Tag ';
+        if ($hexID) {
+            $line .= $hexID;
+        } else {
+            $tagID =~ s/([\0-\x1f\x7f-\xff])/sprintf('\\x%.2x',ord $1)/ge;
+            $line .= "'$tagID'";
+        }
+        $line .= $parms{Extra} if defined $parms{Extra};
+        my $format = $parms{Format};
+        if ($format or defined $size) {
+            $line .= ' (';
+            if (defined $size) {
+                $line .= "$size bytes";
+                $line .= ', ' if $format;
+            }
+            if ($format) {
+                $line .= $format;
+                $line .= '['.$parms{Count}.']' if $parms{Count};
+            }
+            $line .= ')';
+        }
+        $line .= ':' if $verbose > 2 and $parms{DataPt};
+        print $out "$line\n";
+    }
+
+    # Level 3: do hex dump of value
+    if ($verbose > 2 and $parms{DataPt}) {
+        $parms{Out} = $out;
+        $parms{Prefix} = $indent;
+        # limit dump length if Verbose < 5
+        $parms{MaxLen} = $verbose == 3 ? 96 : 2048 if $verbose < 5;
+        HexDump($dataPt, $size, %parms);
+    }
+}
+
+#------------------------------------------------------------------------------
+# Dump trailer information
+# Inputs: 0) ExifTool object ref, 1) dirInfo hash (RAF, DirName, DataPos, DirLen)
+# Notes: Restores current file position before returning
+sub DumpTrailer($$)
+{
+    my ($self, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my $curPos = $raf->Tell();
+    my $trailer = $$dirInfo{DirName} || 'Unknown';
+    my $pos = $$dirInfo{DataPos};
+    my $verbose = $self->{OPTIONS}{Verbose};
+    my $htmlDump = $self->{HTML_DUMP};
+    my ($buff, $buf2);
+    my $size = $$dirInfo{DirLen};
+    $pos = $curPos unless defined $pos;
+
+    # get full trailer size if not specified
+    for (;;) {
+        unless ($size) {
+            $raf->Seek(0, 2) or last;
+            $size = $raf->Tell() - $pos;
+            last unless $size;
+        }
+        $raf->Seek($pos, 0) or last;
+        if ($htmlDump) {
+            my $num = $raf->Read($buff, $size) or return;
+            my $desc = "$trailer trailer";
+            $desc = "[$desc]" if $trailer eq 'Unknown';
+            $self->HDump($pos, $num, $desc, undef, 0x08);
+            last;
+        }
+        my $out = $self->{OPTIONS}{TextOut};
+        printf $out "$trailer trailer (%d bytes at offset 0x%.4x):\n", $size, $pos;
+        last unless $verbose > 2;
+        my $num = $size;    # number of bytes to read
+        # limit size if not very verbose
+        if ($verbose < 5) {
+            my $limit = $verbose < 4 ? 96 : 512;
+            $num = $limit if $num > $limit;
+        }
+        $raf->Read($buff, $num) == $num or return;
+        # read the end of the trailer too if not done already
+        if ($size > 2 * $num) {
+            $raf->Seek($pos + $size - $num, 0);
+            $raf->Read($buf2, $num);
+        } elsif ($size > $num) {
+            $raf->Seek($pos + $num, 0);
+            $raf->Read($buf2, $size - $num);
+            $buff .= $buf2;
+            undef $buf2;
+        }
+        HexDump(\$buff, undef, Addr => $pos, Out => $out);
+        if (defined $buf2) {
+            print $out "    [snip ", $size - $num * 2, " bytes]\n";
+            HexDump(\$buf2, undef, Addr => $pos + $size - $num, Out => $out);
+        }
+        last;
+    }
+    $raf->Seek($curPos, 0);
+}
+
+#------------------------------------------------------------------------------
+# Dump unknown trailer information
+# Inputs: 0) ExifTool ref, 1) dirInfo ref (with RAF, DataPos and DirLen defined)
+# Notes: changes dirInfo elements
+sub DumpUnknownTrailer($$)
+{
+    my ($self, $dirInfo) = @_;
+    my $pos = $$dirInfo{DataPos};
+    my $endPos = $pos + $$dirInfo{DirLen};
+    # account for preview/MPF image trailer
+    my $prePos = $self->{VALUE}{PreviewImageStart} || $$self{PreviewImageStart};
+    my $preLen = $self->{VALUE}{PreviewImageLength} || $$self{PreviewImageLength};
+    my $tag = 'PreviewImage';
+    my $mpImageNum = 0;
+    my (%image, $lastOne);
+    for (;;) {
+        # add to Preview block list if valid and in the trailer
+        $image{$prePos} = [$tag, $preLen] if $prePos and $preLen and $prePos+$preLen > $pos;
+        last if $lastOne;   # checked all images
+        # look for MPF images (in the the proper order)
+        ++$mpImageNum;
+        $prePos = $self->{VALUE}{"MPImageStart ($mpImageNum)"};
+        if (defined $prePos) {
+            $preLen = $self->{VALUE}{"MPImageLength ($mpImageNum)"};
+        } else {
+            $prePos = $self->{VALUE}{'MPImageStart'};
+            $preLen = $self->{VALUE}{'MPImageLength'};
+            $lastOne = 1;
+        }
+        $tag = "MPImage$mpImageNum";
+    }
+    # dump trailer sections in order
+    $image{$endPos} = [ '', 0 ];    # add terminator "image"
+    foreach $prePos (sort { $a <=> $b } keys %image) {
+        if ($pos < $prePos) {
+            # dump unknown trailer data
+            $$dirInfo{DirName} = 'Unknown';
+            $$dirInfo{DataPos} = $pos;
+            $$dirInfo{DirLen} = $prePos - $pos;
+            $self->DumpTrailer($dirInfo);
+        }
+        ($tag, $preLen) = @{$image{$prePos}};
+        last unless $preLen;
+        # dump image if verbose (it is htmlDump'd by ExtractImage)
+        if ($self->{OPTIONS}{Verbose}) {
+            $$dirInfo{DirName} = $tag;
+            $$dirInfo{DataPos} = $prePos;
+            $$dirInfo{DirLen}  = $preLen;
+            $self->DumpTrailer($dirInfo);
+        }
+        $pos = $prePos + $preLen;
+    }
+}
+
+#------------------------------------------------------------------------------
+# Find last element in linked list
+# Inputs: 0) element in list
+# Returns: Last element in list
+sub LastInList($)
+{
+    my $element = shift;
+    while ($element->{Next}) {
+        $element = $element->{Next};
+    }
+    return $element;
+}
+
+#------------------------------------------------------------------------------
+# Print verbose directory information
+# Inputs: 0) ExifTool object reference, 1) directory name or dirInfo ref
+#         2) number of entries in directory (or 0 if unknown)
+#         3) optional size of directory in bytes
+sub VerboseDir($$;$$)
+{
+    my ($self, $name, $entries, $size) = @_;
+    return unless $self->{OPTIONS}{Verbose};
+    if (ref $name eq 'HASH') {
+        $size = $$name{DirLen} unless $size;
+        $name = $$name{Name} || $$name{DirName};
+    }
+    my $indent = substr($self->{INDENT}, 0, -2);
+    my $out = $self->{OPTIONS}{TextOut};
+    my $str = $entries ? " with $entries entries" : '';
+    $str .= ", $size bytes" if $size;
+    print $out "$indent+ [$name directory$str]\n";
+}
+
+#------------------------------------------------------------------------------
+# Print verbose value while writing
+# Inputs: 0) ExifTool object ref, 1) heading "ie. '+ IPTC:Keywords',
+#         2) value, 3) [optional] extra text after value
+sub VerboseValue($$$;$)
+{
+    return unless $_[0]{OPTIONS}{Verbose} > 1;
+    my ($self, $str, $val, $xtra) = @_;
+    my $out = $self->{OPTIONS}{TextOut};
+    $xtra or $xtra = '';
+    my $maxLen = 81 - length($str) - length($xtra);
+    $val = $self->Printable($val, $maxLen);
+    print $out "    $str = '$val'$xtra\n";
+}
+
+#------------------------------------------------------------------------------
+# Pack Unicode numbers into UTF8 string
+# Inputs: 0-N) list of Unicode numbers
+# Returns: Packed UTF-8 string
+sub PackUTF8(@)
+{
+    my @out;
+    while (@_) {
+        my $ch = pop;
+        unshift(@out, $ch), next if $ch < 0x80;
+        unshift(@out, 0x80 | ($ch & 0x3f));
+        $ch >>= 6;
+        unshift(@out, 0xc0 | $ch), next if $ch < 0x20;
+        unshift(@out, 0x80 | ($ch & 0x3f));
+        $ch >>= 6;
+        unshift(@out, 0xe0 | $ch), next if $ch < 0x10;
+        unshift(@out, 0x80 | ($ch & 0x3f));
+        $ch >>= 6;
+        unshift(@out, 0xf0 | ($ch & 0x07));
+    }
+    return pack('C*', @out);
+}
+
+#------------------------------------------------------------------------------
+# Unpack numbers from UTF8 string
+# Inputs: 0) UTF-8 string
+# Returns: List of Unicode numbers (sets $evalWarning on error)
+sub UnpackUTF8($)
+{
+    my (@out, $pos);
+    pos($_[0]) = $pos = 0;  # start at beginning of string
+    for (;;) {
+        my ($ch, $newPos, $val, $byte);
+        if ($_[0] =~ /([\x80-\xff])/g) {
+            $ch = ord($1);
+            $newPos = pos($_[0]) - 1;
+        } else {
+            $newPos = length $_[0];
+        }
+        # unpack 7-bit characters
+        my $len = $newPos - $pos;
+        push @out, unpack("x${pos}C$len",$_[0]) if $len;
+        last unless defined $ch;
+        $pos = $newPos + 1;
+        # minimum lead byte for 2-byte sequence is 0xc2 (overlong sequences
+        # not allowed), 0xf8-0xfd are restricted by RFC 3629 (no 5 or 6 byte
+        # sequences), and 0xfe and 0xff are not valid in UTF-8 strings
+        if ($ch < 0xc2 or $ch >= 0xf8) {
+            push @out, ord('?');    # invalid UTF-8
+            $evalWarning = 'Bad UTF-8';
+            next;
+        }
+        # decode 2, 3 and 4-byte sequences
+        my $n = 1;
+        if ($ch < 0xe0) {
+            $val = $ch & 0x1f;      # 2-byte sequence
+        } elsif ($ch < 0xf0) {
+            $val = $ch & 0x0f;      # 3-byte sequence
+            ++$n;
+        } else {
+            $val = $ch & 0x07;      # 4-byte sequence
+            $n += 2;
+        }
+        unless ($_[0] =~ /\G([\x80-\xbf]{$n})/g) {
+            pos($_[0]) = $pos;      # restore position
+            push @out, ord('?');    # invalid UTF-8
+            $evalWarning = 'Bad UTF-8';
+            next;
+        }
+        foreach $byte (unpack 'C*', $1) {
+            $val = ($val << 6) | ($byte & 0x3f);
+        }
+        push @out, $val;    # save Unicode character value
+        $pos += $n;         # position at end of UTF-8 character
+    }
+    return @out;
+}
+
+#------------------------------------------------------------------------------
+# Inverse date/time print conversion (reformat to YYYY:mm:dd HH:MM:SS[.ss][+-HH:MM|Z])
+# Inputs: 0) ExifTool object ref, 1) Date/Time string, 2) timezone flag:
+#               0     - remove timezone and sub-seconds if they exist
+#               1     - add timezone if it doesn't exist
+#               undef - leave timezone alone
+#         3) flag to allow date-only (YYYY, YYYY:mm or YYYY:mm:dd) or time without seconds
+# Returns: formatted date/time string (or undef and issues warning on error)
+# Notes: currently accepts different separators, but doesn't use DateFormat yet
+sub InverseDateTime($$;$$)
+{
+    my ($self, $val, $tzFlag, $dateOnly) = @_;
+    my ($rtnVal, $tz);
+    # strip off timezone first if it exists
+    if ($val =~ s/([+-])(\d{1,2}):?(\d{2})$//i) {
+        $tz = sprintf("$1%.2d:$3", $2);
+    } elsif ($val =~ s/Z$//i) {
+        $tz = 'Z';
+    } else {
+        $tz = '';
+    }
+    # strip of sub seconds
+    my $fs = $val =~ /(\.\d+)$/ ? $1 : '';
+    if ($val =~ /(\d{4})/g) {           # get YYYY
+        my $yr = $1;
+        my @a = ($val =~ /\d{2}/g);     # get mm, dd, HH, and maybe MM, SS
+        if (@a >= 3) {
+            my $ss = $a[4];             # get SS
+            push @a, '00' while @a < 5; # add MM, SS if not given
+            # add/remove timezone if necessary
+            if ($tzFlag) {
+                if (not $tz) {
+                    if (eval 'require Time::Local') {
+                        # determine timezone offset for this time
+                        my @args = ($a[4],$a[3],$a[2],$a[1],$a[0]-1,$yr-1900);
+                        my $diff = Time::Local::timegm(@args) - TimeLocal(@args);
+                        $tz = TimeZoneString($diff / 60);
+                    } else {
+                        $tz = 'Z';  # don't know time zone
+                    }
+                }
+            } elsif (defined $tzFlag) {
+                $tz = $fs = ''; # remove timezone and sub-seconds
+            }
+            if (defined $ss) {
+                $ss = ":$ss";
+            } elsif ($dateOnly) {
+                $ss = '';
+            } else {
+                $ss = ':00';
+            }
+            # construct properly formatted date/time string
+            $rtnVal = "$yr:$a[0]:$a[1] $a[2]:$a[3]$ss$fs$tz";
+        } elsif ($dateOnly) {
+            $rtnVal = join ':', $yr, @a;
+        }
+    }
+    $rtnVal or warn "Invalid date/time (use YYYY:mm:dd HH:MM:SS[.ss][+/-HH:MM|Z])\n";
+    return $rtnVal;
+}
+
+#------------------------------------------------------------------------------
+# Set byte order according to our current preferences
+# Inputs: 0) ExifTool object ref
+# Returns: new byte order ('II' or 'MM') and sets current byte order
+# Notes: takes the first of the following that is valid:
+#  1) ByteOrder option
+#  2) new value for ExifByteOrder
+#  3) makenote byte order from last file read
+#  4) big endian
+sub SetPreferredByteOrder($)
+{
+    my $self = shift;
+    my $byteOrder = $self->Options('ByteOrder') ||
+                    $self->GetNewValues('ExifByteOrder') ||
+                    $self->{MAKER_NOTE_BYTE_ORDER} || 'MM';
+    unless (SetByteOrder($byteOrder)) {
+        warn "Invalid byte order '$byteOrder'\n" if $self->Options('Verbose');
+        $byteOrder = $self->{MAKER_NOTE_BYTE_ORDER} || 'MM';
+        SetByteOrder($byteOrder);
+    }
+    return GetByteOrder();
+}
+
+#------------------------------------------------------------------------------
+# Assemble a continuing fraction into a rational value
+# Inputs: 0) numerator, 1) denominator
+#         2-N) list of fraction denominators, deepest first
+# Returns: numerator, denominator (in list context)
+sub AssembleRational($$@)
+{
+    @_ < 3 and return @_;
+    my ($num, $denom, $frac) = splice(@_, 0, 3);
+    return AssembleRational($frac*$num+$denom, $num, @_);
+}
+
+#------------------------------------------------------------------------------
+# Convert a floating point number (or 'inf' or 'undef' or a fraction) into a rational
+# Inputs: 0) floating point number, 1) optional maximum value (defaults to 0x7fffffff)
+# Returns: numerator, denominator (in list context)
+# Notes:
+# - the returned rational will be accurate to at least 8 significant figures if possible
+# - ie. an input of 3.14159265358979 returns a rational of 104348/33215,
+#   which equals    3.14159265392142 and is accurate to 10 significant figures
+# - these routines were a bit tricky, but fun to write!
+sub Rationalize($;$)
+{
+    my $val = shift;
+    return (1, 0) if $val eq 'inf';
+    return (0, 0) if $val eq 'undef';
+    return ($1,$2) if $val =~ m{^([-+]?\d+)/(\d+)$}; # accept fractional values
+    # Note: Just testing "if $val" doesn't work because '0.0' is true!  (ugghh!)
+    return (0, 1) if $val == 0;
+    my $sign = $val < 0 ? ($val = -$val, -1) : 1;
+    my ($num, $denom, @fracs);
+    my $frac = $val;
+    my $maxInt = shift || 0x7fffffff;
+    for (;;) {
+        my ($n, $d) = AssembleRational(int($frac + 0.5), 1, @fracs);
+        if ($n > $maxInt or $d > $maxInt) {
+            last if defined $num;
+            return ($sign, $maxInt) if $val < 1;
+            return ($sign * $maxInt, 1);
+        }
+        ($num, $denom) = ($n, $d);      # save last good values
+        my $err = ($n/$d-$val) / $val;  # get error of this rational
+        last if abs($err) < 1e-8;       # all done if error is small
+        my $int = int($frac);
+        unshift @fracs, $int;
+        last unless $frac -= $int;
+        $frac = 1 / $frac;
+    }
+    return ($num * $sign, $denom);
+}
+
+#------------------------------------------------------------------------------
+# Utility routines to for writing binary data values
+# Inputs: 0) value, 1) data ref, 2) offset
+# Notes: prototype is (@) so values can be passed from list if desired
+sub Set16s(@)
+{
+    my $val = shift;
+    $val < 0 and $val += 0x10000;
+    return Set16u($val, @_);
+}
+sub Set32s(@)
+{
+    my $val = shift;
+    $val < 0 and $val += 0xffffffff, ++$val;
+    return Set32u($val, @_);
+}
+sub SetRational64u(@) {
+    my ($numer,$denom) = Rationalize($_[0],0xffffffff);
+    my $val = Set32u($numer) . Set32u($denom);
+    $_[1] and substr(${$_[1]}, $_[2], length($val)) = $val;
+    return $val;
+}
+sub SetRational64s(@) {
+    my ($numer,$denom) = Rationalize($_[0]);
+    my $val = Set32s($numer) . Set32u($denom);
+    $_[1] and substr(${$_[1]}, $_[2], length($val)) = $val;
+    return $val;
+}
+sub SetRational32u(@) {
+    my ($numer,$denom) = Rationalize($_[0],0xffff);
+    my $val = Set16u($numer) . Set16u($denom);
+    $_[1] and substr(${$_[1]}, $_[2], length($val)) = $val;
+    return $val;
+}
+sub SetRational32s(@) {
+    my ($numer,$denom) = Rationalize($_[0],0x7fff);
+    my $val = Set16s($numer) . Set16u($denom);
+    $_[1] and substr(${$_[1]}, $_[2], length($val)) = $val;
+    return $val;
+}
+sub SetFixed16u(@) {
+    my $val = int(shift() * 0x100 + 0.5);
+    return Set16u($val, @_);
+}
+sub SetFixed16s(@) {
+    my $val = shift;
+    return Set16s(int($val * 0x100 + ($val < 0 ? -0.5 : 0.5)), @_);
+}
+sub SetFixed32u(@) {
+    my $val = int(shift() * 0x10000 + 0.5);
+    return Set32u($val, @_);
+}
+sub SetFixed32s(@) {
+    my $val = shift;
+    return Set32s(int($val * 0x10000 + ($val < 0 ? -0.5 : 0.5)), @_);
+}
+sub SetFloat(@) {
+    my $val = SwapBytes(pack('f',$_[0]), 4);
+    $_[1] and substr(${$_[1]}, $_[2], length($val)) = $val;
+    return $val;
+}
+sub SetDouble(@) {
+    # swap 32-bit words (ARM quirk) and bytes if necessary
+    my $val = SwapBytes(SwapWords(pack('d',$_[0])), 8);
+    $_[1] and substr(${$_[1]}, $_[2], length($val)) = $val;
+    return $val;
+}
+#------------------------------------------------------------------------------
+# hash lookups for writing binary data values
+my %writeValueProc = (
+    int8s => \&Set8s,
+    int8u => \&Set8u,
+    int16s => \&Set16s,
+    int16u => \&Set16u,
+    int16uRev => \&Set16uRev,
+    int32s => \&Set32s,
+    int32u => \&Set32u,
+    rational32s => \&SetRational32s,
+    rational32u => \&SetRational32u,
+    rational64s => \&SetRational64s,
+    rational64u => \&SetRational64u,
+    fixed16u => \&SetFixed16u,
+    fixed16s => \&SetFixed16s,
+    fixed32u => \&SetFixed32u,
+    fixed32s => \&SetFixed32s,
+    float => \&SetFloat,
+    double => \&SetDouble,
+    ifd => \&Set32u,
+);
+# verify that we can write floats on this platform
+{
+    my %writeTest = (
+        float =>  [ -3.14159, 'c0490fd0' ],
+        double => [ -3.14159, 'c00921f9f01b866e' ],
+    );
+    my $format;
+    my $oldOrder = GetByteOrder();
+    SetByteOrder('MM');
+    foreach $format (keys %writeTest) {
+        my ($val, $hex) = @{$writeTest{$format}};
+        # add floating point entries if we can write them
+        next if unpack('H*', &{$writeValueProc{$format}}($val)) eq $hex;
+        delete $writeValueProc{$format};    # we can't write them
+    }
+    SetByteOrder($oldOrder);
+}
+
+#------------------------------------------------------------------------------
+# write binary data value (with current byte ordering)
+# Inputs: 0) value, 1) format string
+#         2) optional number of values (1 or string length if not specified)
+#         3) optional data reference, 4) value offset
+# Returns: packed value (and sets value in data) or undef on error
+sub WriteValue($$;$$$$)
+{
+    my ($val, $format, $count, $dataPt, $offset) = @_;
+    my $proc = $writeValueProc{$format};
+    my $packed;
+
+    if ($proc) {
+        my @vals = split(' ',$val);
+        if ($count) {
+            $count = @vals if $count < 0;
+        } else {
+            $count = 1;   # assume 1 if count not specified
+        }
+        $packed = '';
+        while ($count--) {
+            $val = shift @vals;
+            return undef unless defined $val;
+            # validate numerical formats
+            if ($format =~ /^int/) {
+                return undef unless IsInt($val) or IsHex($val);
+            } elsif (not IsFloat($val)) {
+                return undef unless $format =~ /^rational/ and ($val eq 'inf' or
+                    $val eq 'undef' or IsRational($val));
+            }
+            $packed .= &$proc($val);
+        }
+    } elsif ($format eq 'string' or $format eq 'undef') {
+        $format eq 'string' and $val .= "\0";   # null-terminate strings
+        if ($count and $count > 0) {
+            my $diff = $count - length($val);
+            if ($diff) {
+                #warn "wrong string length!\n";
+                # adjust length of string to match specified count
+                if ($diff < 0) {
+                    if ($format eq 'string') {
+                        return undef unless $count;
+                        $val = substr($val, 0, $count - 1) . "\0";
+                    } else {
+                        $val = substr($val, 0, $count);
+                    }
+                } else {
+                    $val .= "\0" x $diff;
+                }
+            }
+        } else {
+            $count = length($val);
+        }
+        $dataPt and substr($$dataPt, $offset, $count) = $val;
+        return $val;
+    } else {
+        warn "Sorry, Can't write $format values on this platform\n";
+        return undef;
+    }
+    $dataPt and substr($$dataPt, $offset, length($packed)) = $packed;
+    return $packed;
+}
+
+#------------------------------------------------------------------------------
+# Encode bit mask (the inverse of DecodeBits())
+# Inputs: 0) value to encode, 1) Reference to hash for encoding (or undef)
+#         2) optional number of bits per word (defaults to 32), 3) total bits
+# Returns: bit mask or undef on error (plus error string in list context)
+sub EncodeBits($$;$$)
+{
+    my ($val, $lookup, $bits, $num) = @_;
+    $bits or $bits = 32;
+    $num or $num = $bits;
+    my $words = int(($num + $bits - 1) / $bits);
+    my @outVal = (0) x $words;
+    if ($val ne '(none)') {
+        my @vals = split /\s*,\s*/, $val;
+        foreach $val (@vals) {
+            my $bit;
+            if ($lookup) {
+                $bit = ReverseLookup($val, $lookup);
+                # (Note: may get non-numerical $bit values from Unknown() tags)
+                unless (defined $bit) {
+                    if ($val =~ /\[(\d+)\]/) { # numerical bit specification
+                        $bit = $1;
+                    } else {
+                        # don't return error string unless more than one value
+                        return undef unless @vals > 1 and wantarray;
+                        return (undef, "no match for '$val'");
+                    }
+                }
+            } else {
+                $bit = $val;
+            }
+            unless (IsInt($bit) and $bit < $num) {
+                return undef unless wantarray;
+                return (undef, IsInt($bit) ? 'bit number too high' : 'not an integer');
+            }
+            my $word = int($bit / $bits);
+            $outVal[$word] |= (1 << ($bit - $word * $bits));
+        }
+    }
+    return "@outVal";
+}
+
+#------------------------------------------------------------------------------
+# get current position in output file
+# Inputs: 0) file or scalar reference
+# Returns: Current position or -1 on error
+sub Tell($)
+{
+    my $outfile = shift;
+    if (UNIVERSAL::isa($outfile,'GLOB')) {
+        return tell($outfile);
+    } else {
+        return length($$outfile);
+    }
+}
+
+#------------------------------------------------------------------------------
+# write to file or memory
+# Inputs: 0) file or scalar reference, 1-N) list of stuff to write
+# Returns: true on success
+sub Write($@)
+{
+    my $outfile = shift;
+    if (UNIVERSAL::isa($outfile,'GLOB')) {
+        return print $outfile @_;
+    } elsif (ref $outfile eq 'SCALAR') {
+        $$outfile .= join('', @_);
+        return 1;
+    }
+    return 0;
+}
+
+#------------------------------------------------------------------------------
+# Write trailer buffer to file (applying fixups if necessary)
+# Inputs: 0) ExifTool object ref, 1) trailer dirInfo ref, 2) output file ref
+# Returns: 1 on success
+sub WriteTrailerBuffer($$$)
+{
+    my ($self, $trailInfo, $outfile) = @_;
+    if ($self->{DEL_GROUP}{Trailer}) {
+        $self->VPrint(0, "  Deleting trailer ($$trailInfo{Offset} bytes)\n");
+        ++$self->{CHANGED};
+        return 1;
+    }
+    my $pos = Tell($outfile);
+    my $trailPt = $$trailInfo{OutFile};
+    # apply fixup if necessary (AFCP requires this)
+    if ($$trailInfo{Fixup}) {
+        if ($pos > 0) {
+            # shift offsets to final AFCP location and write it out
+            $trailInfo->{Fixup}{Shift} += $pos;
+            $trailInfo->{Fixup}->ApplyFixup($trailPt);
+        } else {
+            $self->Error("Can't get file position for trailer offset fixup",1);
+        }
+    }
+    return Write($outfile, $$trailPt);
+}
+
+#------------------------------------------------------------------------------
+# Add trailers as a block
+# Inputs: 0) ExifTool object ref, 1) [optional] trailer data raf,
+#         1 or 2-N) trailer types to add (or none to add all)
+# Returns: new trailer ref, or undef
+# - increments CHANGED if trailer was added
+sub AddNewTrailers($;@)
+{
+    my ($self, @types) = @_;
+    my $trailPt;
+    ref $types[0] and $trailPt = shift @types;
+    $types[0] or shift @types; # (in case undef data ref is passed)
+    # add all possible trailers if none specified (currently only CanonVRD)
+    @types or @types = qw(CanonVRD);
+    # add trailers as a block
+    my $type;
+    foreach $type (@types) {
+        next unless $self->{NEW_VALUE}{$Image::ExifTool::Extra{$type}};
+        my $val = $self->GetNewValues($type) or next;
+        my $verb = $trailPt ? 'Writing' : 'Adding';
+        $self->VPrint(0, "  $verb $type as a block\n");
+        if ($trailPt) {
+            $$trailPt .= $val;
+        } else {
+            $trailPt = \$val;
+        }
+        ++$$self{CHANGED};
+    }
+    return $trailPt;
+}
+
+#------------------------------------------------------------------------------
+# Write segment, splitting up into multiple segments if necessary
+# Inputs: 0) file or scalar reference, 1) segment marker
+#         2) segment header, 3) segment data ref, 4) segment type
+# Returns: number of segments written, or 0 on error
+sub WriteMultiSegment($$$$;$)
+{
+    my ($outfile, $marker, $header, $dataPt, $type) = @_;
+    $type or $type = '';
+    my $len = length($$dataPt);
+    my $hdr = "\xff" . chr($marker);
+    my $count = 0;
+    my $maxLen = $maxSegmentLen - length($header);
+    $maxLen -= 2 if $type eq 'ICC'; # leave room for segment counters
+    my $num = int(($len + $maxLen - 1) / $maxLen);  # number of segments to write
+    my $n;
+    # write data, splitting into multiple segments if necessary
+    # (each segment gets its own header)
+    for ($n=0; $n<$len; $n+=$maxLen) {
+        ++$count;
+        my $size = $len - $n;
+        $size > $maxLen and $size = $maxLen;
+        my $buff = substr($$dataPt,$n,$size);
+        $size += length($header);
+        if ($type eq 'ICC') {
+            $buff = pack('CC', $count, $num) . $buff;
+            $size += 2;
+        }
+        # write the new segment with appropriate header
+        my $segHdr = $hdr . pack('n', $size + 2);
+        Write($outfile, $segHdr, $header, $buff) or return 0;
+    }
+    return $count;
+}
+
+#------------------------------------------------------------------------------
+# Write XMP segment(s) to JPEG file
+# Inputs: 0) ExifTool object ref, 1) outfile ref, 2) XMP data ref,
+#         3) extended XMP data ref, 4) 32-char extended XMP GUID (or undef if no extended data)
+# Returns: true on success, false on write error
+sub WriteMultiXMP($$$$$)
+{
+    my ($self, $outfile, $dataPt, $extPt, $guid) = @_;
+    my $success = 1;
+
+    # write main XMP segment
+    my $size = length($$dataPt) + length($xmpAPP1hdr);
+    if ($size > $maxXMPLen) {
+        $self->Error("XMP block too large for JPEG segment! ($size bytes)", 1);
+        return 1;
+    }
+    my $app1hdr = "\xff\xe1" . pack('n', $size + 2);
+    Write($outfile, $app1hdr, $xmpAPP1hdr, $$dataPt) or $success = 0;
+    # write extended XMP segment(s) if necessary
+    if (defined $guid) {
+        $size = length($$extPt);
+        my $maxLen = $maxXMPLen - 75; # maximum size without 75 byte header
+        my $off;
+        for ($off=0; $off<$size; $off+=$maxLen) {
+            # header(75) = signature(35) + guid(32) + size(4) + offset(4)
+            my $len = $size - $off;
+            $len = $maxLen if $len > $maxLen;
+            $app1hdr = "\xff\xe1" . pack('n', $len + 75 + 2);
+            $self->VPrint(0, "Writing extended XMP segment ($len bytes)\n");
+            Write($outfile, $app1hdr, $xmpExtAPP1hdr, $guid, pack('N2', $size, $off),
+                  substr($$extPt, $off, $len)) or $success = 0;
+        }
+    }
+    return $success;
+}
+
+#------------------------------------------------------------------------------
+# WriteJPEG : Write JPEG image
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 on success, 0 if this wasn't a valid JPEG file, or -1 if
+#          an output file was specified and a write error occurred
+sub WriteJPEG($$)
+{
+    my ($self, $dirInfo) = @_;
+    my $outfile = $$dirInfo{OutFile};
+    my $raf = $$dirInfo{RAF};
+    my ($ch,$s,$length);
+    my $verbose = $self->{OPTIONS}{Verbose};
+    my $out = $self->{OPTIONS}{TextOut};
+    my $rtnVal = 0;
+    my ($err, %doneDir);
+    my %dumpParms = ( Out => $out );
+    my ($writeBuffer, $oldOutfile); # used to buffer writing until PreviewImage position is known
+
+    # check to be sure this is a valid JPG file
+    return 0 unless $raf->Read($s,2) == 2 and $s eq "\xff\xd8";
+    $dumpParms{MaxLen} = 128 unless $verbose > 3;
+
+    delete $self->{PREVIEW_INFO};   # reset preview information
+    delete $self->{DEL_PREVIEW};    # reset flag to delete preview
+
+    Write($outfile, $s) or $err = 1;
+    # figure out what segments we need to write for the tags we have set
+    my $addDirs = $self->{ADD_DIRS};
+    my $editDirs = $self->{EDIT_DIRS};
+    my $delGroup = $self->{DEL_GROUP};
+    my $path = $$self{PATH};
+    my $pn = scalar @$path;
+
+    # set input record separator to 0xff (the JPEG marker) to make reading quicker
+    local $/ = "\xff";
+#
+# pre-scan image to determine if any create-able segment already exists
+#
+    my $pos = $raf->Tell();
+    my ($marker, @dirOrder, %dirCount);
+    Prescan: for (;;) {
+        # read up to next marker (JPEG markers begin with 0xff)
+        $raf->ReadLine($s) or last;
+        # JPEG markers can be padded with unlimited 0xff's
+        for (;;) {
+            $raf->Read($ch, 1) or last Prescan;
+            $marker = ord($ch);
+            last unless $marker == 0xff;
+        }
+        # SOS signifies end of meta information
+        if ($marker == 0xda) {
+            push(@dirOrder, 'SOS');
+            $dirCount{SOS} = 1;
+            last;
+        }
+        my $dirName;
+        # handle SOF markers: SOF0-SOF15, except DHT(0xc4), JPGA(0xc8) and DAC(0xcc)
+        if (($marker & 0xf0) == 0xc0 and ($marker == 0xc0 or $marker & 0x03)) {
+            last unless $raf->Seek(7, 1);
+        # read data for all markers except stand-alone
+        # markers 0x00, 0x01 and 0xd0-0xd7 (NULL, TEM, RST0-RST7)
+        } elsif ($marker!=0x00 and $marker!=0x01 and ($marker<0xd0 or $marker>0xd7)) {
+            # read record length word
+            last unless $raf->Read($s, 2) == 2;
+            my $len = unpack('n',$s);   # get data length
+            last unless defined($len) and $len >= 2;
+            $len -= 2;  # subtract size of length word
+            if (($marker & 0xf0) == 0xe0) {  # is this an APP segment?
+                my $n = $len < 64 ? $len : 64;
+                $raf->Read($s, $n) == $n or last;
+                $len -= $n;
+                # (Note: only necessary to recognize APP segments that we can create)
+                if ($marker == 0xe0) {
+                    $s =~ /^JFIF\0/         and $dirName = 'JFIF';
+                    $s =~ /^JFXX\0\x10/     and $dirName = 'JFXX';
+                } elsif ($marker == 0xe1) {
+                    $s =~ /^$exifAPP1hdr/   and $dirName = 'IFD0';
+                    $s =~ /^$xmpAPP1hdr/    and $dirName = 'XMP';
+                    $s =~ /^$xmpExtAPP1hdr/ and $dirName = 'XMP';
+                } elsif ($marker == 0xe2) {
+                    $s =~ /^ICC_PROFILE\0/  and $dirName = 'ICC_Profile';
+                } elsif ($marker == 0xec) {
+                    $s =~ /^Ducky/          and $dirName = 'Ducky';
+                } elsif ($marker == 0xed) {
+                    $s =~ /^$psAPP13hdr/    and $dirName = 'Photoshop';
+                }
+                # initialize doneDir as a flag that the directory exists
+                # (unless we are deleting it anyway)
+                $doneDir{$dirName} = 0 if defined $dirName and not $$delGroup{$dirName};
+            }
+            $raf->Seek($len, 1) or last;
+        }
+        $dirName or $dirName = JpegMarkerName($marker);
+        $dirCount{$dirName} = ($dirCount{$dirName} || 0) + 1;
+        push @dirOrder, $dirName;
+    }
+    unless ($marker and $marker == 0xda) {
+        $self->Error('Corrupted JPEG image');
+        return 1;
+    }
+    $raf->Seek($pos, 0) or $self->Error('Seek error'), return 1;
+#
+# re-write the image
+#
+    my ($combinedSegData, $segPos, %extendedXMP);
+    # read through each segment in the JPEG file
+    Marker: for (;;) {
+
+        # read up to next marker (JPEG markers begin with 0xff)
+        my $segJunk;
+        $raf->ReadLine($segJunk) or $segJunk = '';
+        # remove the 0xff but write the rest of the junk up to this point
+        chomp($segJunk);
+        Write($outfile, $segJunk) if length $segJunk;
+        # JPEG markers can be padded with unlimited 0xff's
+        for (;;) {
+            $raf->Read($ch, 1) or $self->Error('Format error'), return 1;
+            $marker = ord($ch);
+            last unless $marker == 0xff;
+        }
+        # read the segment data
+        my $segData;
+        # handle SOF markers: SOF0-SOF15, except DHT(0xc4), JPGA(0xc8) and DAC(0xcc)
+        if (($marker & 0xf0) == 0xc0 and ($marker == 0xc0 or $marker & 0x03)) {
+            last unless $raf->Read($segData, 7) == 7;
+        # read data for all markers except stand-alone
+        # markers 0x00, 0x01 and 0xd0-0xd7 (NULL, TEM, RST0-RST7)
+        } elsif ($marker!=0x00 and $marker!=0x01 and ($marker<0xd0 or $marker>0xd7)) {
+            # read record length word
+            last unless $raf->Read($s, 2) == 2;
+            my $len = unpack('n',$s);   # get data length
+            last unless defined($len) and $len >= 2;
+            $segPos = $raf->Tell();
+            $len -= 2;  # subtract size of length word
+            last unless $raf->Read($segData, $len) == $len;
+        }
+        # initialize variables for this segment
+        my $hdr = "\xff" . chr($marker);    # segment header
+        my $markerName = JpegMarkerName($marker);
+        my $dirName = shift @dirOrder;      # get directory name
+        $$path[$pn] = $markerName;
+#
+# create all segments that must come before this one
+# (nothing comes before SOI or after SOS)
+#
+        while ($markerName ne 'SOI') {
+            if (exists $$addDirs{JFIF} and not defined $doneDir{JFIF}) {
+                $doneDir{JFIF} = 1;
+                if ($verbose) {
+                    print $out "Creating APP0:\n";
+                    print $out "  Creating JFIF with default values\n";
+                }
+                my $jfif = "\x01\x02\x01\0\x48\0\x48\0\0";
+                SetByteOrder('MM');
+                my $tagTablePtr = GetTagTable('Image::ExifTool::JFIF::Main');
+                my %dirInfo = (
+                    DataPt   => \$jfif,
+                    DirStart => 0,
+                    DirLen   => length $jfif,
+                );
+                # must temporarily remove JFIF from DEL_GROUP so we can
+                # delete JFIF and add it back again in a single step
+                my $delJFIF = $$delGroup{JFIF};
+                delete $$delGroup{JFIF};
+                my $newData = $self->WriteDirectory(\%dirInfo, $tagTablePtr);
+                $$delGroup{JFIF} = $delJFIF if defined $delJFIF;
+                if (defined $newData and length $newData) {
+                    my $app0hdr = "\xff\xe0" . pack('n', length($newData) + 7);
+                    Write($outfile,$app0hdr,"JFIF\0",$newData) or $err = 1;
+                }
+            }
+            # don't create anything before APP0 or APP1 EXIF (containing IFD0)
+            last if $markerName eq 'APP0' or $dirCount{IFD0};
+            # EXIF information must come immediately after APP0
+            if (exists $$addDirs{IFD0} and not defined $doneDir{IFD0}) {
+                $doneDir{IFD0} = 1;
+                $verbose and print $out "Creating APP1:\n";
+                # write new EXIF data
+                $self->{TIFF_TYPE} = 'APP1';
+                my $tagTablePtr = GetTagTable('Image::ExifTool::Exif::Main');
+                my %dirInfo = (
+                    DirName => 'IFD0',
+                    Parent  => 'APP1',
+                );
+                my $buff = $self->WriteDirectory(\%dirInfo, $tagTablePtr, \&WriteTIFF);
+                if (defined $buff and length $buff) {
+                    my $size = length($buff) + length($exifAPP1hdr);
+                    if ($size <= $maxSegmentLen) {
+                        # switch to buffered output if required
+                        if (($$self{PREVIEW_INFO} or $$self{LeicaTrailer}) and not $oldOutfile) {
+                            $writeBuffer = '';
+                            $oldOutfile = $outfile;
+                            $outfile = \$writeBuffer;
+                            # account for segment, EXIF and TIFF headers
+                            $$self{PREVIEW_INFO}{Fixup}{Start} += 18 if $$self{PREVIEW_INFO};
+                            $$self{LeicaTrailer}{Fixup}{Start} += 18 if $$self{LeicaTrailer};
+                        }
+                        # write the new segment with appropriate header
+                        my $app1hdr = "\xff\xe1" . pack('n', $size + 2);
+                        Write($outfile,$app1hdr,$exifAPP1hdr,$buff) or $err = 1;
+                    } else {
+                        delete $self->{PREVIEW_INFO};
+                        $self->Warn("EXIF APP1 segment too large! ($size bytes)");
+                    }
+                }
+            }
+            # APP13 Photoshop segment next
+            last if $dirCount{Photoshop};
+            if (exists $$addDirs{Photoshop} and not defined $doneDir{Photoshop}) {
+                $doneDir{Photoshop} = 1;
+                $verbose and print $out "Creating APP13:\n";
+                # write new APP13 Photoshop record to memory
+                my $tagTablePtr = GetTagTable('Image::ExifTool::Photoshop::Main');
+                my %dirInfo = (
+                    Parent => 'APP13',
+                );
+                my $buff = $self->WriteDirectory(\%dirInfo, $tagTablePtr);
+                if (defined $buff and length $buff) {
+                    WriteMultiSegment($outfile, 0xed, $psAPP13hdr, \$buff) or $err = 1;
+                    ++$self->{CHANGED};
+                }
+            }
+            # then APP1 XMP segment
+            last if $dirCount{XMP};
+            if (exists $$addDirs{XMP} and not defined $doneDir{XMP}) {
+                $doneDir{XMP} = 1;
+                $verbose and print $out "Creating APP1:\n";
+                # write new XMP data
+                my $tagTablePtr = GetTagTable('Image::ExifTool::XMP::Main');
+                my %dirInfo = (
+                    Parent      => 'APP1',
+                    # specify MaxDataLen so XMP is split if required
+                    MaxDataLen  => $maxXMPLen - length($xmpAPP1hdr),
+                );
+                my $buff = $self->WriteDirectory(\%dirInfo, $tagTablePtr);
+                if (defined $buff and length $buff) {
+                    WriteMultiXMP($self, $outfile, \$buff, $dirInfo{ExtendedXMP},
+                                  $dirInfo{ExtendedGUID}) or $err = 1;
+                }
+            }
+            # then APP2 ICC_Profile segment
+            last if $dirCount{ICC_Profile};
+            if (exists $$addDirs{ICC_Profile} and not defined $doneDir{ICC_Profile}) {
+                $doneDir{ICC_Profile} = 1;
+                next if $$delGroup{ICC_Profile} and $$delGroup{ICC_Profile} != 2;
+                $verbose and print $out "Creating APP2:\n";
+                # write new ICC_Profile data
+                my $tagTablePtr = GetTagTable('Image::ExifTool::ICC_Profile::Main');
+                my %dirInfo = (
+                    Parent   => 'APP2',
+                );
+                my $buff = $self->WriteDirectory(\%dirInfo, $tagTablePtr);
+                if (defined $buff and length $buff) {
+                    WriteMultiSegment($outfile, 0xe2, "ICC_PROFILE\0", \$buff, 'ICC') or $err = 1;
+                    ++$self->{CHANGED};
+                }
+            }
+            # then APP12 Ducky segment
+            last if $dirCount{Ducky};
+            if (exists $$addDirs{Ducky} and not defined $doneDir{Ducky}) {
+                $doneDir{Ducky} = 1;
+                $verbose and print $out "Creating APP12 Ducky:\n";
+                # write new Ducky segment data
+                my $tagTablePtr = GetTagTable('Image::ExifTool::APP12::Ducky');
+                my %dirInfo = (
+                    Parent   => 'APP12',
+                );
+                my $buff = $self->WriteDirectory(\%dirInfo, $tagTablePtr);
+                if (defined $buff and length $buff) {
+                    my $size = length($buff) + 5;
+                    if ($size <= $maxSegmentLen) {
+                        # write the new segment with appropriate header
+                        my $app12hdr = "\xff\xec" . pack('n', $size + 2);
+                        Write($outfile, $app12hdr, 'Ducky', $buff) or $err = 1;
+                    } else {
+                        $self->Warn("Ducky APP12 segment too large! ($size bytes)");
+                    }
+                }
+            }
+            # finally, COM segment
+            last if $dirCount{COM};
+            if (exists $$addDirs{COM} and not defined $doneDir{COM}) {
+                $doneDir{COM} = 1;
+                next if $$delGroup{File} and $$delGroup{File} != 2;
+                my $newComment = $self->GetNewValues('Comment');
+                if (defined $newComment and length($newComment)) {
+                    if ($verbose) {
+                        print $out "Creating COM:\n";
+                        $self->VerboseValue('+ Comment', $newComment);
+                    }
+                    WriteMultiSegment($outfile, 0xfe, '', \$newComment) or $err = 1;
+                    ++$self->{CHANGED};
+                }
+            }
+            last;   # didn't want to loop anyway
+        }
+        # decrement counter for this directory since we are about to process it
+        --$dirCount{$dirName};
+#
+# rewrite existing segments
+#
+        # handle SOF markers: SOF0-SOF15, except DHT(0xc4), JPGA(0xc8) and DAC(0xcc)
+        if (($marker & 0xf0) == 0xc0 and ($marker == 0xc0 or $marker & 0x03)) {
+            $verbose and print $out "JPEG $markerName:\n";
+            Write($outfile, $hdr, $segData) or $err = 1;
+            next;
+        } elsif ($marker == 0xda) {             # SOS
+            pop @$path;
+            $verbose and print $out "JPEG SOS\n";
+            # write SOS segment
+            $s = pack('n', length($segData) + 2);
+            Write($outfile, $hdr, $s, $segData) or $err = 1;
+            my ($buff, $endPos, $trailInfo);
+            my $delPreview = $self->{DEL_PREVIEW};
+            $trailInfo = IdentifyTrailer($raf) unless $$delGroup{Trailer};
+            unless ($oldOutfile or $delPreview or $trailInfo or $$delGroup{Trailer}) {
+                # blindly copy the rest of the file
+                while ($raf->Read($buff, 65536)) {
+                    Write($outfile, $buff) or $err = 1, last;
+                }
+                $rtnVal = 1;  # success unless we have a file write error
+                last;         # all done
+            }
+            # write the rest of the image (as quickly as possible) up to the EOI
+            my $endedWithFF;
+            for (;;) {
+                my $n = $raf->Read($buff, 65536) or last Marker;
+                if (($endedWithFF and $buff =~ m/^\xd9/sg) or
+                    $buff =~ m/\xff\xd9/sg)
+                {
+                    $rtnVal = 1; # the JPEG is OK
+                    # write up to the EOI
+                    my $pos = pos($buff);
+                    Write($outfile, substr($buff, 0, $pos)) or $err = 1;
+                    $buff = substr($buff, $pos);
+                    last;
+                }
+                unless ($n == 65536) {
+                    $self->Error('JPEG EOI marker not found');
+                    last Marker;
+                }
+                Write($outfile, $buff) or $err = 1;
+                $endedWithFF = substr($buff, 65535, 1) eq "\xff" ? 1 : 0;
+            }
+            # remember position of last data copied
+            $endPos = $raf->Tell() - length($buff);
+            # rewrite trailers if they exist
+            if ($trailInfo) {
+                my $tbuf = '';
+                $raf->Seek(-length($buff), 1);  # seek back to just after EOI
+                $$trailInfo{OutFile} = \$tbuf;  # rewrite the trailer
+                $$trailInfo{ScanForAFCP} = 1;   # scan if necessary
+                $self->ProcessTrailers($trailInfo) or undef $trailInfo;
+            }
+            if (not $oldOutfile) {
+                # do nothing special
+            } elsif ($$self{LeicaTrailer}) {
+                my $trailLen;
+                if ($trailInfo) {
+                    $trailLen = $$trailInfo{DataPos} - $endPos;
+                } else {
+                    $raf->Seek(0, 2) or $err = 1;
+                    $trailLen = $raf->Tell() - $endPos;
+                }
+                my $fixup = $$self{LeicaTrailer}{Fixup};
+                $$self{LeicaTrailer}{TrailPos} = $endPos;
+                $$self{LeicaTrailer}{TrailLen} = $trailLen;
+                # get _absolute_ position of new Leica trailer
+                my $absPos = Tell($oldOutfile) + length($$outfile);
+                require Image::ExifTool::Panasonic;
+                my $dat = Image::ExifTool::Panasonic::ProcessLeicaTrailer($self, $absPos);
+                # allow some junk before Leica trailer (just in case)
+                my $junk = $$self{LeicaTrailerPos} - $endPos;
+                # set MakerNote pointer and size (subtract 10 for segment and EXIF headers)
+                $fixup->SetMarkerPointers($outfile, 'LeicaTrailer', length($$outfile) - 10 + $junk);
+                # use this fixup to set the size too (sneaky)
+                my $trailSize = defined($dat) ? length($dat) - $junk : $$self{LeicaTrailer}{Size};
+                $fixup->{Start} -= 4;  $fixup->{Shift} += 4;
+                $fixup->SetMarkerPointers($outfile, 'LeicaTrailer', $trailSize);
+                $fixup->{Start} += 4;  $fixup->{Shift} -= 4;
+                # clean up and write the buffered data
+                $outfile = $oldOutfile;
+                undef $oldOutfile;
+                Write($outfile, $writeBuffer) or $err = 1;
+                undef $writeBuffer;
+                if (defined $dat) {
+                    Write($outfile, $dat) or $err = 1;  # write new Leica trailer
+                    $delPreview = 1;                    # delete existing Leica trailer
+                }
+            } else {
+                # locate preview image and fix up preview offsets
+                my $scanLen = $$self{Make} =~ /Sony/i ? 65536 : 1024;
+                if (length($buff) < $scanLen) { # make sure we have enough trailer to scan
+                    my $buf2;
+                    $buff .= $buf2 if $raf->Read($buf2, $scanLen - length($buff));
+                }
+                # get new preview image position, relative to EXIF base
+                my $newPos = length($$outfile) - 10; # (subtract 10 for segment and EXIF headers)
+                my $junkLen;
+                # adjust position if image isn't at the start (ie. Olympus E-1/E-300)
+                if ($buff =~ m/(\xff\xd8\xff.|.\xd8\xff\xdb)/sg) {
+                    $junkLen = pos($buff) - 4;
+                    # Sony previewimage trailer has a 32 byte header
+                    $junkLen -= 32 if $$self{Make} =~/SONY/i and $junkLen > 32;
+                    $newPos += $junkLen;
+                }
+                # fix up the preview offsets to point to the start of the new image
+                my $previewInfo = $self->{PREVIEW_INFO};
+                delete $self->{PREVIEW_INFO};
+                my $fixup = $$previewInfo{Fixup};
+                $newPos += ($$previewInfo{BaseShift} || 0);
+                # adjust to absolute file offset if necessary (Samsung STMN)
+                $newPos += Tell($oldOutfile) + 10 if $$previewInfo{Absolute};
+                if ($$previewInfo{Relative}) {
+                    # adjust for our base by looking at how far the pointer got shifted
+                    $newPos -= $fixup->GetMarkerPointers($outfile, 'PreviewImage');
+                } elsif ($$previewInfo{ChangeBase}) {
+                    # Leica S2 uses relative offsets for the preview only (leica sucks)
+                    my $makerOffset = $fixup->GetMarkerPointers($outfile, 'LeicaTrailer');
+                    $newPos -= $makerOffset if $makerOffset;
+                }
+                $fixup->SetMarkerPointers($outfile, 'PreviewImage', $newPos);
+                # clean up and write the buffered data
+                $outfile = $oldOutfile;
+                undef $oldOutfile;
+                Write($outfile, $writeBuffer) or $err = 1;
+                undef $writeBuffer;
+                # write preview image
+                if ($$previewInfo{Data} ne 'LOAD_PREVIEW') {
+                    # write any junk that existed before the preview image
+                    Write($outfile, substr($buff,0,$junkLen)) or $err = 1 if $junkLen;
+                    # write the saved preview image
+                    Write($outfile, $$previewInfo{Data}) or $err = 1;
+                    delete $$previewInfo{Data};
+                    # (don't increment CHANGED because we could be rewriting existing preview)
+                    $delPreview = 1;    # remove old preview
+                }
+            }
+            # copy over preview image if necessary
+            unless ($delPreview) {
+                my $extra;
+                if ($trailInfo) {
+                    # copy everything up to start of first processed trailer
+                    $extra = $$trailInfo{DataPos} - $endPos;
+                } else {
+                    # copy everything up to end of file
+                    $raf->Seek(0, 2) or $err = 1;
+                    $extra = $raf->Tell() - $endPos;
+                }
+                if ($extra > 0) {
+                    if ($$delGroup{Trailer}) {
+                        $verbose and print $out "  Deleting unknown trailer ($extra bytes)\n";
+                        ++$self->{CHANGED};
+                    } else {
+                        # copy over unknown trailer
+                        $verbose and print $out "  Preserving unknown trailer ($extra bytes)\n";
+                        $raf->Seek($endPos, 0) or $err = 1;
+                        CopyBlock($raf, $outfile, $extra) or $err = 1;
+                    }
+                }
+            }
+            # write trailer if necessary
+            if ($trailInfo) {
+                $self->WriteTrailerBuffer($trailInfo, $outfile) or $err = 1;
+                undef $trailInfo;
+            }
+            last;   # all done parsing file
+
+        } elsif ($marker==0x00 or $marker==0x01 or ($marker>=0xd0 and $marker<=0xd7)) {
+            $verbose and $marker and print $out "JPEG $markerName:\n";
+            # handle stand-alone markers 0x00, 0x01 and 0xd0-0xd7 (NULL, TEM, RST0-RST7)
+            Write($outfile, $hdr) or $err = 1;
+            next;
+        }
+        #
+        # NOTE: A 'next' statement after this point will cause $$segDataPt
+        #       not to be written if there is an output file, so in this case
+        #       the $self->{CHANGED} flags must be updated
+        #
+        my $segDataPt = \$segData;
+        $length = length($segData);
+        if ($verbose) {
+            print $out "JPEG $markerName ($length bytes):\n";
+            if ($verbose > 2 and $markerName =~ /^APP/) {
+                HexDump($segDataPt, undef, %dumpParms);
+            }
+        }
+        my ($segType, $del);
+        # rewrite this segment only if we are changing a tag which is contained in its
+        # directory (or deleting '*', in which case we need to identify the segment type)
+        while (exists $$editDirs{$markerName} or $$delGroup{'*'}) {
+            my $oldChanged = $self->{CHANGED};
+            if ($marker == 0xe0) {              # APP0 (JFIF, CIFF)
+                if ($$segDataPt =~ /^JFIF\0/) {
+                    $segType = 'JFIF';
+                    $$delGroup{JFIF} and $del = 1, last;
+                    last unless $$editDirs{JFIF};
+                    SetByteOrder('MM');
+                    my $tagTablePtr = GetTagTable('Image::ExifTool::JFIF::Main');
+                    my %dirInfo = (
+                        DataPt   => $segDataPt,
+                        DataPos  => $segPos,
+                        DataLen  => $length,
+                        DirStart => 5,     # directory starts after identifier
+                        DirLen   => $length-5,
+                        Parent   => $markerName,
+                    );
+                    my $newData = $self->WriteDirectory(\%dirInfo, $tagTablePtr);
+                    if (defined $newData and length $newData) {
+                        $$segDataPt = "JFIF\0" . $newData;
+                    }
+                } elsif ($$segDataPt =~ /^JFXX\0\x10/) {
+                    $segType = 'JFXX';
+                    $$delGroup{JFIF} and $del = 1;
+                } elsif ($$segDataPt =~ /^(II|MM).{4}HEAPJPGM/s) {
+                    $segType = 'CIFF';
+                    $$delGroup{CIFF} and $del = 1, last;
+                    last unless $$editDirs{CIFF};
+                    my $newData = '';
+                    my %dirInfo = (
+                        RAF => new File::RandomAccess($segDataPt),
+                        OutFile => \$newData,
+                    );
+                    require Image::ExifTool::CanonRaw;
+                    if (Image::ExifTool::CanonRaw::WriteCRW($self, \%dirInfo) > 0) {
+                        if (length $newData) {
+                            $$segDataPt = $newData;
+                        } else {
+                            undef $segDataPt;
+                            $del = 1;   # delete this segment
+                        }
+                    }
+                }
+            } elsif ($marker == 0xe1) {         # APP1 (EXIF, XMP)
+                # check for EXIF data
+                if ($$segDataPt =~ /^$exifAPP1hdr/) {
+                    $segType = 'EXIF';
+                    $doneDir{IFD0} and $self->Warn('Multiple APP1 EXIF segments');
+                    $doneDir{IFD0} = 1;
+                    last unless $$editDirs{IFD0};
+                    # check del groups now so we can change byte order in one step
+                    if ($$delGroup{IFD0} or $$delGroup{EXIF}) {
+                        delete $doneDir{IFD0};  # delete so we will create a new one
+                        $del = 1;
+                        last;
+                    }
+                    # rewrite EXIF as if this were a TIFF file in memory
+                    my %dirInfo = (
+                        DataPt   => $segDataPt,
+                        DataPos  => $segPos,
+                        DirStart => 6,
+                        Base     => $segPos + 6,
+                        Parent   => $markerName,
+                        DirName  => 'IFD0',
+                    );
+                    # write new EXIF data to memory
+                    my $tagTablePtr = GetTagTable('Image::ExifTool::Exif::Main');
+                    my $buff = $self->WriteDirectory(\%dirInfo, $tagTablePtr, \&WriteTIFF);
+                    if (defined $buff) {
+                        # update segment with new data
+                        $$segDataPt = $exifAPP1hdr . $buff;
+                    } else {
+                        last Marker unless $self->Options('IgnoreMinorErrors');
+                        $self->{CHANGED} = $oldChanged; # nothing changed
+                    }
+                    # switch to buffered output if required
+                    if (($$self{PREVIEW_INFO} or $$self{LeicaTrailer}) and not $oldOutfile) {
+                        $writeBuffer = '';
+                        $oldOutfile = $outfile;
+                        $outfile = \$writeBuffer;
+                        # must account for segment, EXIF and TIFF headers
+                        $$self{PREVIEW_INFO}{Fixup}{Start} += 18 if $$self{PREVIEW_INFO};
+                        $$self{LeicaTrailer}{Fixup}{Start} += 18 if $$self{LeicaTrailer};
+                    }
+                    # delete segment if IFD contains no entries
+                    $del = 1 unless length($$segDataPt) > length($exifAPP1hdr);
+                # check for XMP data
+                } elsif ($$segDataPt =~ /^($xmpAPP1hdr|$xmpExtAPP1hdr)/) {
+                    $segType = 'XMP';
+                    $$delGroup{XMP} and $del = 1, last;
+                    $doneDir{XMP} = ($doneDir{XMP} || 0) + 1;
+                    last unless $$editDirs{XMP};
+                    if ($doneDir{XMP} + $dirCount{XMP} > 1) {
+                        # must assemble all XMP segments before writing
+                        my ($guid, $extXMP);
+                        if ($$segDataPt =~ /^$xmpExtAPP1hdr/) {
+                            # save extended XMP data
+                            if (length $$segDataPt < 75) {
+                                $extendedXMP{Error} = 'Truncated data';
+                            } else {
+                                my ($size, $off) = unpack('x67N2', $$segDataPt);
+                                $guid = substr($$segDataPt, 35, 32);
+                                # remember extended data for each GUID
+                                $extXMP = $extendedXMP{$guid};
+                                if ($extXMP) {
+                                    $size == $$extXMP{Size} or $extendedXMP{Error} = 'Invalid size';
+                                } else {
+                                    $extXMP = $extendedXMP{$guid} = { };
+                                }
+                                $$extXMP{Size} = $size;
+                                $$extXMP{$off} = substr($$segDataPt, 75);
+                            }
+                        } else {
+                            # save all main XMP segments (should normally be only one)
+                            $extendedXMP{Main} = [] unless $extendedXMP{Main};
+                            push @{$extendedXMP{Main}}, substr($$segDataPt, length $xmpAPP1hdr);
+                        }
+                        # continue processing only if we have read all the segments
+                        next Marker if $dirCount{XMP};
+                        # reconstruct an XMP super-segment
+                        $$segDataPt = $xmpAPP1hdr;
+                        $$segDataPt .= $_ foreach @{$extendedXMP{Main}};
+                        foreach $guid (sort keys %extendedXMP) {
+                            next unless length $guid == 32;     # ignore other keys
+                            $extXMP = $extendedXMP{$guid};
+                            next unless ref $extXMP eq 'HASH';  # (just to be safe)
+                            my $size = $$extXMP{Size};
+                            my (@offsets, $off);
+                            for ($off=0; $off<$size; ) {
+                                last unless defined $$extXMP{$off};
+                                push @offsets, $off;
+                                $off += length $$extXMP{$off};
+                            }
+                            if ($off == $size) {
+                                # add all XMP to super-segment
+                                $$segDataPt .= $$extXMP{$_} foreach @offsets;
+                            } else {
+                                $extendedXMP{Error} = 'Missing XMP data';
+                            }
+                        }
+                        $self->Error("$extendedXMP{Error} in extended XMP", 1) if $extendedXMP{Error};
+                    }
+                    my $start = length $xmpAPP1hdr;
+                    my $tagTablePtr = GetTagTable('Image::ExifTool::XMP::Main');
+                    my %dirInfo = (
+                        DataPt     => $segDataPt,
+                        DirStart   => $start,
+                        Parent     => $markerName,
+                        # limit XMP size and create extended XMP if necessary
+                        MaxDataLen => $maxXMPLen - length($xmpAPP1hdr),
+                    );
+                    my $newData = $self->WriteDirectory(\%dirInfo, $tagTablePtr);
+                    if (defined $newData) {
+                        undef %extendedXMP;
+                        if (length $newData) {
+                            # write multi-segment XMP (XMP plus extended XMP if necessary)
+                            WriteMultiXMP($self, $outfile, \$newData, $dirInfo{ExtendedXMP},
+                                          $dirInfo{ExtendedGUID}) or $err = 1;
+                            undef $$segDataPt;  # free the old buffer
+                            next Marker;
+                        } else {
+                            $$segDataPt = '';   # delete the XMP
+                        }
+                    } else {
+                        $self->{CHANGED} = $oldChanged;
+                        $verbose and print $out "    [XMP rewritten with no changes]\n";
+                        if ($doneDir{XMP} > 1) {
+                            # re-write original multi-segment XMP
+                            my ($dat, $guid, $extXMP, $off);
+                            foreach $dat (@{$extendedXMP{Main}}) {      # main XMP
+                                next unless length $dat;
+                                $s = pack('n', length($xmpAPP1hdr) + length($dat) + 2);
+                                Write($outfile, $hdr, $s, $xmpAPP1hdr, $dat) or $err = 1;
+                            }
+                            foreach $guid (sort keys %extendedXMP) {    # extended XMP
+                                next unless length $guid == 32;
+                                $extXMP = $extendedXMP{$guid};
+                                next unless ref $extXMP eq 'HASH';
+                                my $size = $$extXMP{Size} or next;
+                                for ($off=0; defined $$extXMP{$off}; $off += length $$extXMP{$off}) {
+                                    $s = pack('n', length($xmpExtAPP1hdr) + length($$extXMP{$off}) + 42);
+                                    Write($outfile, $hdr, $s, $xmpExtAPP1hdr, $guid,
+                                          pack('N2', $size, $off), $$extXMP{$off}) or $err = 1;
+                                }
+                            }
+                            undef $$segDataPt;  # free the old buffer
+                            undef %extendedXMP;
+                            next Marker;
+                        }
+                        # continue on to re-write original single-segment XMP
+                    }
+                    $del = 1 unless length $$segDataPt;
+                } elsif ($$segDataPt =~ /^http/ or $$segDataPt =~ /<exif:/) {
+                    $self->Warn('Ignored APP1 XMP segment with non-standard header', 1);
+                }
+            } elsif ($marker == 0xe2) {         # APP2 (ICC Profile, FPXR)
+                if ($$segDataPt =~ /^ICC_PROFILE\0/) {
+                    $segType = 'ICC_Profile';
+                    $$delGroup{ICC_Profile} and $del = 1, last;
+                    # must concatenate blocks of profile
+                    my $block_num = ord(substr($$segDataPt, 12, 1));
+                    my $blocks_tot = ord(substr($$segDataPt, 13, 1));
+                    $combinedSegData = '' if $block_num == 1;
+                    unless (defined $combinedSegData) {
+                        $self->Warn('APP2 ICC_Profile segments out of sequence');
+                        next Marker;
+                    }
+                    $combinedSegData .= substr($$segDataPt, 14);
+                    # continue accumulating segments unless this is the last
+                    next Marker unless $block_num == $blocks_tot;
+                    $doneDir{ICC_Profile} and $self->Warn('Multiple ICC_Profile records');
+                    $doneDir{ICC_Profile} = 1;
+                    $segDataPt = \$combinedSegData;
+                    $length = length $combinedSegData;
+                    my $tagTablePtr = GetTagTable('Image::ExifTool::ICC_Profile::Main');
+                    my %dirInfo = (
+                        DataPt   => $segDataPt,
+                        DataPos  => $segPos + 14,
+                        DataLen  => $length,
+                        DirStart => 0,
+                        DirLen   => $length,
+                        Parent   => $markerName,
+                    );
+                    my $newData = $self->WriteDirectory(\%dirInfo, $tagTablePtr);
+                    if (defined $newData) {
+                        undef $$segDataPt;  # free the old buffer
+                        $segDataPt = \$newData;
+                    }
+                    length $$segDataPt or $del = 1, last;
+                    # write as ICC multi-segment
+                    WriteMultiSegment($outfile, $marker, "ICC_PROFILE\0", $segDataPt, 'ICC') or $err = 1;
+                    undef $combinedSegData;
+                    undef $$segDataPt;
+                    next Marker;
+                } elsif ($$segDataPt =~ /^FPXR\0/) {
+                    $segType = 'FPXR';
+                    $$delGroup{FlashPix} and $del = 1;
+                }
+            } elsif ($marker == 0xe3) {         # APP3 (Kodak Meta)
+                if ($$segDataPt =~ /^(Meta|META|Exif)\0\0/) {
+                    $segType = 'Kodak Meta';
+                    $$delGroup{Meta} and $del = 1, last;
+                    $doneDir{Meta} and $self->Warn('Multiple APP3 Meta segments');
+                    $doneDir{Meta} = 1;
+                    last unless $$editDirs{Meta};
+                    # rewrite Meta IFD as if this were a TIFF file in memory
+                    my %dirInfo = (
+                        DataPt   => $segDataPt,
+                        DataPos  => $segPos,
+                        DirStart => 6,
+                        Base     => $segPos + 6,
+                        Parent   => $markerName,
+                        DirName  => 'Meta',
+                    );
+                    # write new data to memory
+                    my $tagTablePtr = GetTagTable('Image::ExifTool::Kodak::Meta');
+                    my $buff = $self->WriteDirectory(\%dirInfo, $tagTablePtr, \&WriteTIFF);
+                    if (defined $buff) {
+                        # update segment with new data
+                        $$segDataPt = substr($$segDataPt,0,6) . $buff;
+                    } else {
+                        last Marker unless $self->Options('IgnoreMinorErrors');
+                        $self->{CHANGED} = $oldChanged; # nothing changed
+                    }
+                    # delete segment if IFD contains no entries
+                    $del = 1 unless length($$segDataPt) > 6;
+                }
+            } elsif ($marker == 0xe5) {         # APP5 (Ricoh RMETA)
+                if ($$segDataPt =~ /^RMETA\0/) {
+                    $segType = 'Ricoh RMETA';
+                    $$delGroup{RMETA} and $del = 1;
+                }
+            } elsif ($marker == 0xec) {         # APP12 (Ducky)
+                if ($$segDataPt =~ /^Ducky/) {
+                    $segType = 'Ducky';
+                    $$delGroup{Ducky} and $del = 1, last;
+                    $doneDir{Ducky} and $self->Warn('Multiple APP12 Ducky segments');
+                    $doneDir{Ducky} = 1;
+                    last unless $$editDirs{Ducky};
+                    my $tagTablePtr = GetTagTable('Image::ExifTool::APP12::Ducky');
+                    my %dirInfo = (
+                        DataPt   => $segDataPt,
+                        DataPos  => $segPos,
+                        DataLen  => $length,
+                        DirStart => 5,     # directory starts after identifier
+                        DirLen   => $length-5,
+                        Parent   => $markerName,
+                    );
+                    my $newData = $self->WriteDirectory(\%dirInfo, $tagTablePtr);
+                    if (defined $newData) {
+                        undef $$segDataPt;  # free the old buffer
+                        # add header to new segment unless empty
+                        $newData = 'Ducky' . $newData if length $newData;
+                        $segDataPt = \$newData;
+                    } else {
+                        $self->{CHANGED} = $oldChanged;
+                    }
+                    $del = 1 unless length $$segDataPt;
+                }
+            } elsif ($marker == 0xed) {         # APP13 (Photoshop)
+                if ($$segDataPt =~ /^$psAPP13hdr/) {
+                    $segType = 'Photoshop';
+                    # add this data to the combined data if it exists
+                    if (defined $combinedSegData) {
+                        $combinedSegData .= substr($$segDataPt,length($psAPP13hdr));
+                        $segDataPt = \$combinedSegData;
+                        $length = length $combinedSegData;  # update length
+                    }
+                    # peek ahead to see if the next segment is photoshop data too
+                    if ($dirOrder[0] eq 'Photoshop') {
+                        # initialize combined data if necessary
+                        $combinedSegData = $$segDataPt unless defined $combinedSegData;
+                        next Marker;    # get the next segment to combine
+                    }
+                    if ($doneDir{Photoshop}) {
+                        $self->Warn('Multiple Photoshop records');
+                        # only rewrite the first Photoshop segment when deleting this group
+                        # (to remove multiples when deleting and adding back in one step)
+                        $$delGroup{Photoshop} and $del = 1, last;
+                    }
+                    $doneDir{Photoshop} = 1;
+                    # process APP13 Photoshop record
+                    my $tagTablePtr = GetTagTable('Image::ExifTool::Photoshop::Main');
+                    my %dirInfo = (
+                        DataPt   => $segDataPt,
+                        DataPos  => $segPos,
+                        DataLen  => $length,
+                        DirStart => 14,     # directory starts after identifier
+                        DirLen   => $length-14,
+                        Parent   => $markerName,
+                    );
+                    my $newData = $self->WriteDirectory(\%dirInfo, $tagTablePtr);
+                    if (defined $newData) {
+                        undef $$segDataPt;  # free the old buffer
+                        $segDataPt = \$newData;
+                    } else {
+                        $self->{CHANGED} = $oldChanged;
+                    }
+                    length $$segDataPt or $del = 1, last;
+                    # write as multi-segment
+                    WriteMultiSegment($outfile, $marker, $psAPP13hdr, $segDataPt) or $err = 1;
+                    undef $combinedSegData;
+                    undef $$segDataPt;
+                    next Marker;
+                }
+            } elsif ($marker == 0xfe) {         # COM (JPEG comment)
+                my $newComment;
+                unless ($doneDir{COM}) {
+                    $doneDir{COM} = 1;
+                    unless ($$delGroup{File} and $$delGroup{File} != 2) {
+                        my $tagInfo = $Image::ExifTool::Extra{Comment};
+                        my $nvHash = $self->GetNewValueHash($tagInfo);
+                        if (IsOverwriting($nvHash, $segData) or $$delGroup{File}) {
+                            $newComment = GetNewValues($nvHash);
+                        } else {
+                            delete $$editDirs{COM}; # we aren't editing COM after all
+                            last;
+                        }
+                    }
+                }
+                $self->VerboseValue('- Comment', $$segDataPt);
+                if (defined $newComment and length $newComment) {
+                    # write out the comments
+                    $self->VerboseValue('+ Comment', $newComment);
+                    WriteMultiSegment($outfile, 0xfe, '', \$newComment) or $err = 1;
+                } else {
+                    $verbose and print $out "  Deleting COM segment\n";
+                }
+                ++$self->{CHANGED};     # increment the changed flag
+                undef $segDataPt;       # don't write existing comment
+            }
+            last;   # didn't want to loop anyway
+        }
+        # delete necessary segments (including unknown segments if deleting all)
+        if ($del or ($$delGroup{'*'} and not $segType and $marker>=0xe0 and $marker<=0xef)) {
+            $segType = 'unknown' unless $segType;
+            $verbose and print $out "  Deleting $markerName $segType segment\n";
+            ++$self->{CHANGED};
+            next Marker;
+        }
+        # write out this segment if $segDataPt is still defined
+        if (defined $segDataPt) {
+            # write the data for this record (the data could have been
+            # modified, so recalculate the length word)
+            my $size = length($$segDataPt);
+            if ($size > $maxSegmentLen) {
+                $segType or $segType = 'Unknown';
+                $self->Error("$segType $markerName segment too large! ($size bytes)");
+                $err = 1;
+            } else {
+                $s = pack('n', length($$segDataPt) + 2);
+                Write($outfile, $hdr, $s, $$segDataPt) or $err = 1;
+            }
+            undef $$segDataPt;  # free the buffer
+        }
+    }
+    pop @$path if @$path > $pn;
+    # if oldOutfile is still set, there was an error copying the JPEG
+    $oldOutfile and return 0;
+    if ($rtnVal) {
+        # add any new trailers we are creating
+        my $trailPt = $self->AddNewTrailers();
+        Write($outfile, $$trailPt) or $err = 1 if $trailPt;
+    }
+    # set return value to -1 if we only had a write error
+    $rtnVal = -1 if $rtnVal and $err;
+    return $rtnVal;
+}
+
+#------------------------------------------------------------------------------
+# Validate an image for writing
+# Inputs: 0) ExifTool object reference, 1) raw value reference
+# Returns: error string or undef on success
+sub CheckImage($$)
+{
+    my ($self, $valPtr) = @_;
+    if (length($$valPtr) and $$valPtr!~/^\xff\xd8/ and not
+        $self->Options('IgnoreMinorErrors'))
+    {
+        return '[minor] Not a valid image';
+    }
+    return undef;
+}
+
+#------------------------------------------------------------------------------
+# check a value for validity
+# Inputs: 0) value reference, 1) format string, 2) optional count
+# Returns: error string, or undef on success
+# Notes: May modify value (if a count is specified for a string, it is null-padded
+# to the specified length, and floating point values are rounded to integer if required)
+sub CheckValue($$;$)
+{
+    my ($valPtr, $format, $count) = @_;
+    my (@vals, $val, $n);
+
+    if ($format eq 'string' or $format eq 'undef') {
+        return undef unless $count and $count > 0;
+        my $len = length($$valPtr);
+        if ($format eq 'string') {
+            $len >= $count and return 'String too long';
+        } else {
+            $len > $count and return 'Data too long';
+        }
+        if ($len < $count) {
+            $$valPtr .= "\0" x ($count - $len);
+        }
+        return undef;
+    }
+    if ($count and $count != 1) {
+        @vals = split(' ',$$valPtr);
+        $count < 0 and ($count = @vals or return undef);
+    } else {
+        $count = 1;
+        @vals = ( $$valPtr );
+    }
+    if (@vals != $count) {
+        my $str = @vals > $count ? 'Too many' : 'Not enough';
+        return "$str values specified ($count required)";
+    }
+    for ($n=0; $n<$count; ++$n) {
+        $val = shift @vals;
+        if ($format =~ /^int/) {
+            # make sure the value is integer
+            unless (IsInt($val)) {
+                if (IsHex($val)) {
+                    $val = $$valPtr = hex($val);
+                } else {
+                    # round single floating point values to the nearest integer
+                    return 'Not an integer' unless IsFloat($val) and $count == 1;
+                    $val = $$valPtr = int($val + ($val < 0 ? -0.5 : 0.5));
+                }
+            }
+            my $rng = $intRange{$format} or return "Bad int format: $format";
+            return "Value below $format minimum" if $val < $$rng[0];
+            # (allow 0xfeedfeed code as value for 16-bit pointers)
+            return "Value above $format maximum" if $val > $$rng[1] and $val != 0xfeedfeed;
+        } elsif ($format =~ /^rational/ or $format eq 'float' or $format eq 'double') {
+            # make sure the value is a valid floating point number
+            unless (IsFloat($val)) {
+                # allow 'inf', 'undef' and fractional rational values
+                if ($format =~ /^rational/) {
+                    next if $val eq 'inf' or $val eq 'undef';
+                    if ($val =~ m{^([-+]?\d+)/(\d+)$}) {
+                        next unless $1 < 0 and $format =~ /u$/;
+                        return 'Must be an unsigned rational';
+                    }
+                }
+                return 'Not a floating point number' 
+            }
+            if ($format =~ /^rational\d+u$/ and $val < 0) {
+                return 'Must be a positive number';
+            }
+        }
+    }
+    return undef;   # success!
+}
+
+#------------------------------------------------------------------------------
+# check new value for binary data block
+# Inputs: 0) ExifTool object ref, 1) tagInfo hash ref, 2) raw value ref
+# Returns: error string or undef (and may modify value) on success
+sub CheckBinaryData($$$)
+{
+    my ($self, $tagInfo, $valPtr) = @_;
+    my $format = $$tagInfo{Format};
+    unless ($format) {
+        my $table = $$tagInfo{Table};
+        if ($table and $$table{FORMAT}) {
+            $format = $$table{FORMAT};
+        } else {
+            # use default 'int8u' unless specified
+            $format = 'int8u';
+        }
+    }
+    my $count;
+    if ($format =~ /(.*)\[(.*)\]/) {
+        $format = $1;
+        $count = $2;
+        # can't evaluate $count now because we don't know $size yet
+        undef $count if $count =~ /\$size/;
+    }
+    return CheckValue($valPtr, $format, $count);
+}
+
+#------------------------------------------------------------------------------
+# Copy data block from RAF to output file in max 64kB chunks
+# Inputs: 0) RAF ref, 1) outfile ref, 2) block size
+# Returns: 1 on success, 0 on read error, undef on write error
+sub CopyBlock($$$)
+{
+    my ($raf, $outfile, $size) = @_;
+    my $buff;
+    for (;;) {
+        last unless $size > 0;
+        my $n = $size > 65536 ? 65536 : $size;
+        $raf->Read($buff, $n) == $n or return 0;
+        Write($outfile, $buff) or return undef;
+        $size -= $n;
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# copy image data from one file to another
+# Inputs: 0) ExifTool object reference
+#         1) reference to list of image data [ position, size, pad bytes ]
+#         2) output file ref
+# Returns: true on success
+sub CopyImageData($$$)
+{
+    my ($self, $imageDataBlocks, $outfile) = @_;
+    my $raf = $self->{RAF};
+    my ($dataBlock, $err);
+    my $num = @$imageDataBlocks;
+    $self->VPrint(0, "  Copying $num image data blocks\n") if $num;
+    foreach $dataBlock (@$imageDataBlocks) {
+        my ($pos, $size, $pad) = @$dataBlock;
+        $raf->Seek($pos, 0) or $err = 'read', last;
+        my $result = CopyBlock($raf, $outfile, $size);
+        $result or $err = defined $result ? 'read' : 'writ';
+        # pad if necessary
+        Write($outfile, "\0" x $pad) or $err = 'writ' if $pad;
+        last if $err;
+    }
+    if ($err) {
+        $self->Error("Error ${err}ing image data");
+        return 0;
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# write to binary data block
+# Inputs: 0) ExifTool object ref, 1) source dirInfo ref, 2) tag table ref
+# Returns: Binary data block or undefined on error
+sub WriteBinaryData($$$)
+{
+    my ($self, $dirInfo, $tagTablePtr) = @_;
+    $self or return 1;    # allow dummy access to autoload this package
+
+    # get default format ('int8u' unless specified)
+    my $dataPt = $$dirInfo{DataPt} or return undef;
+    my $defaultFormat = $$tagTablePtr{FORMAT} || 'int8u';
+    my $increment = FormatSize($defaultFormat);
+    unless ($increment) {
+        warn "Unknown format $defaultFormat\n";
+        return undef;
+    }
+    # extract data members first if necessary
+    my @varOffsets;
+    if ($$tagTablePtr{DATAMEMBER}) {
+        $$dirInfo{DataMember} = $$tagTablePtr{DATAMEMBER};
+        $$dirInfo{VarFormatData} = \@varOffsets;
+        $self->ProcessBinaryData($dirInfo, $tagTablePtr);
+        delete $$dirInfo{DataMember};
+        delete $$dirInfo{VarFormatData};
+    }
+    my $dirStart = $$dirInfo{DirStart} || 0;
+    my $dirLen = $$dirInfo{DirLen} || length($$dataPt) - $dirStart;
+    my $newData = substr($$dataPt, $dirStart, $dirLen) or return undef;
+    my $dirName = $$dirInfo{DirName};
+    my $varSize = 0;
+    my @varInfo = @varOffsets;
+    my $tagInfo;
+    $dataPt = \$newData;
+    foreach $tagInfo ($self->GetNewTagInfoList($tagTablePtr)) {
+        my $tagID = $tagInfo->{TagID};
+        # evaluate conditional tags now if necessary
+        if (ref $$tagTablePtr{$tagID} eq 'ARRAY' or $$tagInfo{Condition}) {
+            my $writeInfo = $self->GetTagInfo($tagTablePtr, $tagID);
+            next unless $writeInfo and $writeInfo eq $tagInfo;
+        }
+        # add offsets for variable-sized tags if necessary
+        while (@varInfo and $varInfo[0] < $tagID) {
+            shift @varInfo;             # discard index
+            $varSize = shift @varInfo;  # get accumulated variable size
+        }
+        my $count = 1;
+        my $format = $$tagInfo{Format};
+        my $entry = int($tagID) * $increment + $varSize; # relative offset of this entry
+        if ($format) {
+            if ($format =~ /(.*)\[(.*)\]/) {
+                $format = $1;
+                $count = $2;
+                my $size = $dirLen; # used in eval
+                # evaluate count to allow count to be based on previous values
+                #### eval Format size ($size, $self) - NOTE: %val not supported for writing
+                $count = eval $count;
+                $@ and warn($@), next;
+            } elsif ($format eq 'string') {
+                # string with no specified count runs to end of block
+                $count = ($dirLen > $entry) ? $dirLen - $entry : 0;
+            }
+        } else {
+            $format = $defaultFormat;
+        }
+        my $val = ReadValue($dataPt, $entry, $format, $count, $dirLen-$entry);
+        next unless defined $val;
+        my $nvHash = $self->GetNewValueHash($tagInfo);
+        next unless IsOverwriting($nvHash, $val);
+        my $newVal = GetNewValues($nvHash);
+        next unless defined $newVal;    # can't delete from a binary table
+        # only write masked bits if specified
+        my $mask = $$tagInfo{Mask};
+        $newVal = ($newVal & $mask) | ($val & ~$mask) if defined $mask;
+        # set the size
+        if ($$tagInfo{DataTag} and not $$tagInfo{IsOffset}) {
+            warn 'Internal error' unless $newVal == 0xfeedfeed;
+            my $data = $self->GetNewValues($$tagInfo{DataTag});
+            $newVal = length($data) if defined $data;
+            my $format = $$tagInfo{Format} || $$tagTablePtr{FORMAT} || 'int32u';
+            if ($format =~ /^int16/ and $newVal > 0xffff) {
+                $self->Error("$$tagInfo{DataTag} is too large (64 kB max. for this file)");
+            }
+        }
+        my $rtnVal = WriteValue($newVal, $format, $count, $dataPt, $entry);
+        if (defined $rtnVal) {
+            $self->VerboseValue("- $dirName:$$tagInfo{Name}", $val);
+            $self->VerboseValue("+ $dirName:$$tagInfo{Name}", $newVal);
+            ++$self->{CHANGED};
+        }
+    }
+    # add necessary fixups for any offsets
+    if ($$tagTablePtr{IS_OFFSET} and $$dirInfo{Fixup}) {
+        $varSize = 0;
+        @varInfo = @varOffsets;
+        my $fixup = $$dirInfo{Fixup};
+        my $tagID;
+        foreach $tagID (@{$tagTablePtr->{IS_OFFSET}}) {
+            $tagInfo = $self->GetTagInfo($tagTablePtr, $tagID) or next;
+            while (@varInfo and $varInfo[0] < $tagID) {
+                shift @varInfo;
+                $varSize = shift @varInfo;
+            }
+            my $entry = $tagID * $increment + $varSize; # (no offset to dirStart for new dir data)
+            next unless $entry <= $dirLen - 4;
+            # (Ricoh has 16-bit preview image offsets, so can't just assume int32u)
+            my $format = $$tagInfo{Format} || $$tagTablePtr{FORMAT} || 'int32u';
+            my $offset = ReadValue($dataPt, $entry, $format, 1, $dirLen-$entry);
+            # ignore if offset is zero (ie. Ricoh DNG uses this to indicate no preview)
+            next unless $offset;
+            $fixup->AddFixup($entry, $$tagInfo{DataTag}, $format);
+            # handle the preview image now if this is a JPEG file
+            next unless $self->{FILE_TYPE} eq 'JPEG' and $$tagInfo{DataTag} and
+                $$tagInfo{DataTag} eq 'PreviewImage' and defined $$tagInfo{OffsetPair};
+            # NOTE: here we assume there are no var-sized tags between the
+            # OffsetPair tags.  If this ever becomes possible we must recalculate
+            # $varSize for the OffsetPair tag here!
+            $entry = $$tagInfo{OffsetPair} * $increment + $varSize;
+            my $size = ReadValue($dataPt, $entry, $format, 1, $dirLen-$entry);
+            my $previewInfo = $self->{PREVIEW_INFO};
+            $previewInfo or $previewInfo = $self->{PREVIEW_INFO} = { };
+            # set flag indicating we are using short pointers
+            $$previewInfo{IsShort} = 1 unless $format eq 'int32u';
+            $$previewInfo{Absolute} = 1 if $$tagInfo{IsOffset} and $$tagInfo{IsOffset} eq '3';
+            # get the value of the Composite::PreviewImage tag
+            $$previewInfo{Data} = $self->GetNewValues($Image::ExifTool::Composite{PreviewImage});
+            unless (defined $$previewInfo{Data}) {
+                if ($offset >= 0 and $offset + $size <= $$dirInfo{DataLen}) {
+                    $$previewInfo{Data} = substr(${$$dirInfo{DataPt}},$offset,$size);
+                } else {
+                    $$previewInfo{Data} = 'LOAD_PREVIEW'; # flag to load preview later
+                }
+            }
+        }
+    }
+    # write any necessary SubDirectories
+    if ($$tagTablePtr{IS_SUBDIR}) {
+        $varSize = 0;
+        @varInfo = @varOffsets;
+        my $tagID;
+        foreach $tagID (@{$$tagTablePtr{IS_SUBDIR}}) {
+            my $tagInfo = $self->GetTagInfo($tagTablePtr, $tagID);
+            next unless defined $tagInfo;
+            while (@varInfo and $varInfo[0] < $tagID) {
+                shift @varInfo;
+                $varSize = shift @varInfo;
+            }
+            my $entry = int($tagID) * $increment + $varSize;
+            last if $entry >= $dirLen;
+            # get value for Condition if necessary
+            unless ($tagInfo) {
+                my $more = $dirLen - $entry;
+                $more = 128 if $more > 128;
+                my $v = substr($newData, $entry, $more);
+                $tagInfo = $self->GetTagInfo($tagTablePtr, $tagID, \$v);
+                next unless $tagInfo;
+            }
+            next unless $$tagInfo{SubDirectory}; # (just to be safe)
+            my %subdirInfo = ( DataPt => \$newData, DirStart => $entry );
+            my $subTablePtr = GetTagTable($tagInfo->{SubDirectory}{TagTable});
+            my $dat = $self->WriteDirectory(\%subdirInfo, $subTablePtr);
+            substr($newData, $entry) = $dat if defined $dat and length $dat;
+        }
+    }
+    return $newData;
+}
+
+#------------------------------------------------------------------------------
+# Write TIFF as a directory
+# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
+# Returns: New directory data or undefined on error
+sub WriteTIFF($$$)
+{
+    my ($self, $dirInfo, $tagTablePtr) = @_;
+    my $buff = '';
+    $$dirInfo{OutFile} = \$buff;
+    return $buff if $self->ProcessTIFF($dirInfo, $tagTablePtr) > 0;
+    return undef;
+}
+
+1; # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::Writer.pl - ExifTool routines for writing meta information
+
+=head1 SYNOPSIS
+
+These routines are autoloaded by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This module contains ExifTool write routines and other infrequently
+used routines.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/XMP.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/XMP.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/XMP.pm	(revision 24799)
@@ -0,0 +1,3320 @@
+#------------------------------------------------------------------------------
+# File:         XMP.pm
+#
+# Description:  Read XMP meta information
+#
+# Revisions:    11/25/2003 - P. Harvey Created
+#               10/28/2004 - P. Harvey Major overhaul to conform with XMP spec
+#               02/27/2005 - P. Harvey Also read UTF-16 and UTF-32 XMP
+#               08/30/2005 - P. Harvey Split tag tables into separate namespaces
+#               10/24/2005 - P. Harvey Added ability to parse .XMP files
+#               08/25/2006 - P. Harvey Added ability to handle blank nodes
+#               08/22/2007 - P. Harvey Added ability to handle alternate language tags
+#               09/26/2008 - P. Harvey Added Iptc4xmpExt tags (version 1.0 rev 2)
+#
+# References:   1) http://www.adobe.com/products/xmp/pdfs/xmpspec.pdf
+#               2) http://www.w3.org/TR/rdf-syntax-grammar/  (20040210)
+#               3) http://www.portfoliofaq.com/pfaq/v7mappings.htm
+#               4) http://www.iptc.org/IPTC4XMP/
+#               5) http://creativecommons.org/technology/xmp
+#                  --> changed to http://wiki.creativecommons.org/Companion_File_metadata_specification (2007/12/21)
+#               6) http://www.optimasc.com/products/fileid/xmp-extensions.pdf
+#               7) Lou Salkind private communication
+#               8) http://partners.adobe.com/public/developer/en/xmp/sdk/XMPspecification.pdf
+#               9) http://www.w3.org/TR/SVG11/
+#               10) http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart2.pdf (Oct 2008)
+#
+# Notes:      - Property qualifiers are handled as if they were separate
+#               properties (with no associated namespace).
+#
+#             - Currently, there is no special treatment of the following
+#               properties which could potentially affect the extracted
+#               information: xml:base, rdf:parseType (note that parseType
+#               Literal isn't allowed by the XMP spec).
+#
+#             - The family 2 group names will be set to 'Unknown' for any XMP
+#               tags not found in the XMP or Exif tag tables.
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::XMP;
+
+use strict;
+use vars qw($VERSION $AUTOLOAD @ISA @EXPORT_OK $xlatNamespace %nsURI %dateTimeInfo
+            %xmpTableDefaults %specialStruct %sDimensions %sArea %sColorant);
+use Image::ExifTool qw(:Utils);
+use Image::ExifTool::Exif;
+require Exporter;
+
+$VERSION = '2.37';
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(EscapeXML UnescapeXML);
+
+sub ProcessXMP($$;$);
+sub WriteXMP($$;$);
+sub CheckXMP($$$);
+sub ParseXMPElement($$$;$$$);
+sub DecodeBase64($);
+sub SaveBlankInfo($$$;$);
+sub ProcessBlankInfo($$$;$);
+sub ValidateXMP($;$);
+sub UnescapeChar($$);
+sub AddFlattenedTags($$);
+sub FormatXMPDate($);
+sub ConvertRational($);
+
+my %curNS;  # namespaces currently in effect while parsing the file
+
+# lookup for translating to ExifTool namespaces
+# Note: Use $xlatNamespace (only valid during processing) to do the translation
+my %stdXlatNS = (
+    # shorten ugly namespace prefixes
+    'Iptc4xmpCore' => 'iptcCore',
+    'Iptc4xmpExt' => 'iptcExt',
+    'photomechanic'=> 'photomech',
+    'MicrosoftPhoto' => 'microsoft',
+    'prismusagerights' => 'pur',
+);
+
+# translate ExifTool namespaces to standard XMP namespace prefixes
+my %xmpNS = (
+    # shorten ugly namespace prefixes
+    'iptcCore' => 'Iptc4xmpCore',
+    'iptcExt' => 'Iptc4xmpExt',
+    'photomechanic'=> 'photomech',
+    'microsoft' => 'MicrosoftPhoto',
+    # (prism changed their spec to now use 'pur')
+    # 'pur' => 'prismusagerights',
+);
+
+# Lookup to translate our namespace prefixes into URI's.  This list need
+# not be complete, but it must contain an entry for each namespace prefix
+# (NAMESPACE) for writable tags in the XMP tables or in structures
+%nsURI = (
+    aux       => 'http://ns.adobe.com/exif/1.0/aux/',
+    album     => 'http://ns.adobe.com/album/1.0/',
+    cc        => 'http://creativecommons.org/ns#', # changed 2007/12/21 - PH
+    crs       => 'http://ns.adobe.com/camera-raw-settings/1.0/',
+    crss      => 'http://ns.adobe.com/camera-raw-saved-settings/1.0/',
+    dc        => 'http://purl.org/dc/elements/1.1/',
+    exif      => 'http://ns.adobe.com/exif/1.0/',
+    iX        => 'http://ns.adobe.com/iX/1.0/',
+    pdf       => 'http://ns.adobe.com/pdf/1.3/',
+    pdfx      => 'http://ns.adobe.com/pdfx/1.3/',
+    photoshop => 'http://ns.adobe.com/photoshop/1.0/',
+    rdf       => 'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
+    rdfs      => 'http://www.w3.org/2000/01/rdf-schema#',
+    stDim     => 'http://ns.adobe.com/xap/1.0/sType/Dimensions#',
+    stArea    => 'http://ns.adobe.com/xap/1.0/sType/Area#',
+    stEvt     => 'http://ns.adobe.com/xap/1.0/sType/ResourceEvent#',
+    stFnt     => 'http://ns.adobe.com/xap/1.0/sType/Font#',
+    stJob     => 'http://ns.adobe.com/xap/1.0/sType/Job#',
+    stRef     => 'http://ns.adobe.com/xap/1.0/sType/ResourceRef#',
+    stVer     => 'http://ns.adobe.com/xap/1.0/sType/Version#',
+    stMfs     => 'http://ns.adobe.com/xap/1.0/sType/ManifestItem#',
+    tiff      => 'http://ns.adobe.com/tiff/1.0/',
+   'x'        => 'adobe:ns:meta/',
+    xmpG      => 'http://ns.adobe.com/xap/1.0/g/',
+    xmpGImg   => 'http://ns.adobe.com/xap/1.0/g/img/',
+    xmp       => 'http://ns.adobe.com/xap/1.0/',
+    xmpBJ     => 'http://ns.adobe.com/xap/1.0/bj/',
+    xmpDM     => 'http://ns.adobe.com/xmp/1.0/DynamicMedia/',
+    xmpMM     => 'http://ns.adobe.com/xap/1.0/mm/',
+    xmpRights => 'http://ns.adobe.com/xap/1.0/rights/',
+    xmpNote   => 'http://ns.adobe.com/xmp/note/',
+    xmpTPg    => 'http://ns.adobe.com/xap/1.0/t/pg/',
+    xmpidq    => 'http://ns.adobe.com/xmp/Identifier/qual/1.0/',
+    xmpPLUS   => 'http://ns.adobe.com/xap/1.0/PLUS/',
+    dex       => 'http://ns.optimasc.com/dex/1.0/',
+    mediapro  => 'http://ns.iview-multimedia.com/mediapro/1.0/',
+    Iptc4xmpCore => 'http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/',
+    Iptc4xmpExt => 'http://iptc.org/std/Iptc4xmpExt/2008-02-29/',
+    MicrosoftPhoto => 'http://ns.microsoft.com/photo/1.0',
+    MP1       => 'http://ns.microsoft.com/photo/1.1', #PH (MP1 is fabricated)
+    MP        => 'http://ns.microsoft.com/photo/1.2/',
+    MPRI      => 'http://ns.microsoft.com/photo/1.2/t/RegionInfo#',
+    MPReg     => 'http://ns.microsoft.com/photo/1.2/t/Region#',
+    lr        => 'http://ns.adobe.com/lightroom/1.0/',
+    DICOM     => 'http://ns.adobe.com/DICOM/',
+    svg       => 'http://www.w3.org/2000/svg',
+    et        => 'http://ns.exiftool.ca/1.0/',
+    # namespaces defined in XMP2.pl:
+    plus      => 'http://ns.useplus.org/ldf/xmp/1.0/',
+    prism     => 'http://prismstandard.org/namespaces/basic/2.1/',
+    prl       => 'http://prismstandard.org/namespaces/prl/2.1/',
+    pur       => 'http://prismstandard.org/namespaces/prismusagerights/2.1/',
+    acdsee    => 'http://ns.acdsee.com/iptc/1.0/',
+    digiKam   => 'http://www.digikam.org/ns/1.0/',
+    swf       => 'http://ns.adobe.com/swf/1.0',
+    cell      => 'http://developer.sonyericsson.com/cell/1.0/',
+   'mwg-rs'   => 'http://www.metadataworkinggroup.com/schemas/regions/',
+   'mwg-kw'   => 'http://www.metadataworkinggroup.com/schemas/keywords/',
+   'mwg-coll' => 'http://www.metadataworkinggroup.com/schemas/collections/',
+);
+
+# build reverse namespace lookup
+my %uri2ns;
+{
+    my $ns;
+    foreach $ns (keys %nsURI) {
+        $uri2ns{$nsURI{$ns}} = $ns;
+    }
+}
+
+# conversions for GPS coordinates
+sub ToDegrees
+{
+    require Image::ExifTool::GPS;
+    Image::ExifTool::GPS::ToDegrees($_[0], 1);
+}
+my %latConv = (
+    ValueConv    => \&ToDegrees,
+    RawConv => 'require Image::ExifTool::GPS; $val', # to load Composite tags and routines
+    ValueConvInv => q{
+        require Image::ExifTool::GPS;
+        Image::ExifTool::GPS::ToDMS($self, $val, 2, "N");
+    },
+    PrintConv    => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")',
+    PrintConvInv => \&ToDegrees,
+);
+my %longConv = (
+    ValueConv    => \&ToDegrees,
+    RawConv => 'require Image::ExifTool::GPS; $val',
+    ValueConvInv => q{
+        require Image::ExifTool::GPS;
+        Image::ExifTool::GPS::ToDMS($self, $val, 2, "E");
+    },
+    PrintConv    => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
+    PrintConvInv => \&ToDegrees,
+);
+%dateTimeInfo = (
+    # NOTE: Do NOT put "Groups" here because Groups hash must not be common!
+    Writable => 'date',
+    Shift => 'Time',
+    PrintConv => '$self->ConvertDateTime($val)',
+    PrintConvInv => '$self->InverseDateTime($val,undef,1)',
+);
+
+# XMP namespaces which we don't want to contribute to generated EXIF tag names
+# (Note: namespaces with non-standard prefixes aren't currently ignored)
+my %ignoreNamespace = ( 'x'=>1, rdf=>1, xmlns=>1, xml=>1, svg=>1, et=>1, office=>1 );
+
+# these are the attributes that we handle for properties that contain
+# sub-properties.  Attributes for simple properties are easy, and we
+# just copy them over.  These are harder since we don't store attributes
+# for properties without simple values.  (maybe this will change...)
+# (special attributes are indicated by a list reference of tag information)
+my %recognizedAttrs = (
+    'rdf:about' => [ 'Image::ExifTool::XMP::rdf', 'about', 'About' ],
+    'x:xmptk'   => [ 'Image::ExifTool::XMP::x',   'xmptk', 'XMPToolkit' ],
+    'x:xaptk'   => [ 'Image::ExifTool::XMP::x',   'xmptk', 'XMPToolkit' ],
+    'rdf:parseType' => 1,
+    'rdf:nodeID' => 1,
+    'et:toolkit' => 1,
+    'rdf:xmlns' => 1, # this is presumably the default namespace, which we currently ignore
+);
+
+# special tags in structures below
+# NOTE: this lookup is duplicated in TagLookup.pm!!
+%specialStruct = (
+    STRUCT_NAME => 1, # [optional] name of structure
+    NAMESPACE   => 1, # [mandatory] namespace prefix used for fields of this structure
+    NOTES       => 1, # [optional] notes for documentation about this structure
+    TYPE        => 1, # [optional] rdf:type resource for struct (if used, the StructType flag
+                      # will be set automatically for all derived flattened tags when writing)
+);
+# XMP structures (each structure is similar to a tag table so we can
+# recurse through them in SetPropertyPath() as if they were tag tables)
+# The main differences between structure field information and tagInfo hashes are:
+#   1) Field information hashes do not contain Name, Groups or Table entries, and
+#   2) The TagID entry is optional, and is used only if the key in the structure hash
+#      is different from the TagID (currently only true for alternate language fields)
+#   3) Field information hashes support a additional "Namespace" property.
+my %sResourceRef = (
+    STRUCT_NAME => 'ResourceRef',
+    NAMESPACE   => 'stRef',
+    documentID      => { },
+    instanceID      => { },
+    manager         => { },
+    managerVariant  => { },
+    manageTo        => { },
+    manageUI        => { },
+    renditionClass  => { },
+    renditionParams => { },
+    versionID       => { },
+    # added Oct 2008
+    alternatePaths  => { List => 'Seq' },
+    filePath        => { },
+    fromPart        => { },
+    lastModifyDate  => { %dateTimeInfo, Groups => { 2 => 'Time' } },
+    maskMarkers     => { PrintConv => { All => 'All', None => 'None' } },
+    partMapping     => { },
+    toPart          => { },
+    # added May 2010
+    originalDocumentID => { }, # (undocumented property written by Adobe InDesign)
+);
+my %sResourceEvent = (
+    STRUCT_NAME => 'ResourceEvent',
+    NAMESPACE   => 'stEvt',
+    action          => { },
+    instanceID      => { },
+    parameters      => { },
+    softwareAgent   => { },
+    when            => { %dateTimeInfo, Groups => { 2 => 'Time' } },
+    # added Oct 2008
+    changed         => { },
+);
+my %sJobRef = (
+    STRUCT_NAME => 'JobRef',
+    NAMESPACE   => 'stJob',
+    id          => { },
+    name        => { },
+    url         => { },
+);
+my %sVersion = (
+    STRUCT_NAME => 'Version',
+    NAMESPACE   => 'stVer',
+    comments    => { },
+    event       => { Struct => \%sResourceEvent },
+    modifier    => { },
+    modifyDate  => { %dateTimeInfo, Groups => { 2 => 'Time' } },
+    version     => { },
+);
+my %sThumbnail = (
+    STRUCT_NAME => 'Thumbnail',
+    NAMESPACE   => 'xmpGImg',
+    height      => { Writable => 'integer' },
+    width       => { Writable => 'integer' },
+   'format'     => { },
+    image       => {
+        ValueConv => 'Image::ExifTool::XMP::DecodeBase64($val)',
+        ValueConvInv => 'Image::ExifTool::XMP::EncodeBase64($val)',
+    },
+);
+my %sPageInfo = (
+    STRUCT_NAME => 'PageInfo',
+    NAMESPACE   => 'xmpGImg',
+    PageNumber  => { Writable => 'integer', Namespace => 'xmpTPg' }, # override default namespace
+    height      => { Writable => 'integer' },
+    width       => { Writable => 'integer' },
+   'format'     => { },
+    image       => {
+        ValueConv => 'Image::ExifTool::XMP::DecodeBase64($val)',
+        ValueConvInv => 'Image::ExifTool::XMP::EncodeBase64($val)',
+    },
+);
+#my %sIdentifierScheme = (
+#    NAMESPACE   => 'xmpidq',
+#    Scheme      => { }, # qualifier for xmp:Identifier only
+#);
+%sDimensions = (
+    STRUCT_NAME => 'Dimensions',
+    NAMESPACE   => 'stDim',
+    w           => { Writable => 'real' },
+    h           => { Writable => 'real' },
+    unit        => { },
+);
+%sArea = (
+    STRUCT_NAME => 'Area',
+    NAMESPACE   => 'stArea',
+   'x'          => { Writable => 'real' },
+   'y'          => { Writable => 'real' },
+    w           => { Writable => 'real' },
+    h           => { Writable => 'real' },
+    d           => { Writable => 'real' },
+    unit        => { },
+);
+%sColorant = (
+    STRUCT_NAME => 'Colorant',
+    NAMESPACE   => 'xmpG',
+    swatchName  => { },
+    mode        => { PrintConv => { CMYK=>'CMYK', RGB=>'RGB', LAB=>'Lab' } },
+    # note: do not implement closed choice for "type" because Adobe can't
+    # get the case right:  spec. says "PROCESS" but Indesign writes "Process"
+    type        => { },
+    cyan        => { Writable => 'real' },
+    magenta     => { Writable => 'real' },
+    yellow      => { Writable => 'real' },
+    black       => { Writable => 'real' },
+    red         => { Writable => 'integer' },
+    green       => { Writable => 'integer' },
+    blue        => { Writable => 'integer' },
+    L           => { Writable => 'real' },
+    A           => { Writable => 'integer' },
+    B           => { Writable => 'integer' },
+);
+my %sFont = (
+    STRUCT_NAME => 'Font',
+    NAMESPACE   => 'stFnt',
+    fontName    => { },
+    fontFamily  => { },
+    fontFace    => { },
+    fontType    => { },
+    versionString => { },
+    composite   => { Writable => 'boolean' },
+    fontFileName=> { },
+    childFontFiles => { List => 'Seq' },
+);
+my %sOECF = (
+    NAMESPACE   => 'exif',
+    STRUCT_NAME => 'OECF',
+    Columns     => { Writable => 'integer' },
+    Rows        => { Writable => 'integer' },
+    Names       => { List => 'Seq' },
+    Values      => { List => 'Seq', Writable => 'rational' },
+);
+
+# new LR2 crs structures (PH)
+my %sCorrectionMask = (
+    STRUCT_NAME => 'CorrectionMask',
+    NAMESPACE   => 'crs',
+    What         => { },
+    MaskValue    => { Writable => 'real' },
+    Radius       => { Writable => 'real' },
+    Flow         => { Writable => 'real' },
+    CenterWeight => { Writable => 'real' },
+    Dabs         => { List => 'Seq' },
+    ZeroX        => { Writable => 'real' },
+    ZeroY        => { Writable => 'real' },
+    FullX        => { Writable => 'real' },
+    FullY        => { Writable => 'real' },
+);
+my %sCorrection = (
+    STRUCT_NAME => 'Correction',
+    NAMESPACE   => 'crs',
+    What => { },
+    CorrectionAmount => { Writable => 'real' },
+    CorrectionActive => { Writable => 'boolean' },
+    LocalExposure    => { Writable => 'real' },
+    LocalSaturation  => { Writable => 'real' },
+    LocalContrast    => { Writable => 'real' },
+    LocalClarity     => { Writable => 'real' },
+    LocalSharpness   => { Writable => 'real' },
+    LocalBrightness  => { Writable => 'real' },
+    LocalToningHue   => { Writable => 'real' },
+    LocalToningSaturation => { Writable => 'real' },
+    CorrectionMasks  => { Struct => \%sCorrectionMask, List => 'Seq' },
+);
+
+# IPTC Extension 1.0 structures
+my %sLocationDetails = (
+    NAMESPACE   => 'Iptc4xmpExt',
+    STRUCT_NAME => 'LocationDetails',
+    City         => { },
+    CountryCode  => { },
+    CountryName  => { },
+    ProvinceState=> { },
+    Sublocation  => { },
+    WorldRegion  => { },
+);
+
+# main XMP tag table (tag ID's are used for the family 1 group names)
+%Image::ExifTool::XMP::Main = (
+    GROUPS => { 2 => 'Unknown' },
+    PROCESS_PROC => \&ProcessXMP,
+    WRITE_PROC => \&WriteXMP,
+    dc => {
+        Name => 'dc', # (otherwise generated name would be 'Dc')
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::dc' },
+    },
+    xmp => {
+        Name => 'xmp',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::xmp' },
+    },
+    xmpDM => {
+        Name => 'xmpDM',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::xmpDM' },
+    },
+    xmpRights => {
+        Name => 'xmpRights',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::xmpRights' },
+    },
+    xmpNote => {
+        Name => 'xmpNote',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::xmpNote' },
+    },
+    xmpMM => {
+        Name => 'xmpMM',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::xmpMM' },
+    },
+    xmpBJ => {
+        Name => 'xmpBJ',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::xmpBJ' },
+    },
+    xmpTPg => {
+        Name => 'xmpTPg',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::xmpTPg' },
+    },
+    pdf => {
+        Name => 'pdf',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::pdf' },
+    },
+    pdfx => {
+        Name => 'pdfx',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::pdfx' },
+    },
+    photoshop => {
+        Name => 'photoshop',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::photoshop' },
+    },
+    crs => {
+        Name => 'crs',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::crs' },
+    },
+    # crss - it would be difficult to add the ability to write this
+    aux => {
+        Name => 'aux',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::aux' },
+    },
+    tiff => {
+        Name => 'tiff',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::tiff' },
+    },
+    exif => {
+        Name => 'exif',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::exif' },
+    },
+    iptcCore => {
+        Name => 'iptcCore',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::iptcCore' },
+    },
+    iptcExt => {
+        Name => 'iptcExt',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::iptcExt' },
+    },
+    PixelLive => {
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::PixelLive' },
+    },
+    xmpPLUS => {
+        Name => 'xmpPLUS',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::xmpPLUS' },
+    },
+    plus => {
+        Name => 'plus',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::plus' },
+    },
+    cc => {
+        Name => 'cc',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::cc' },
+    },
+    dex => {
+        Name => 'dex',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::dex' },
+    },
+    photomech => {
+        Name => 'photomech',
+        SubDirectory => { TagTable => 'Image::ExifTool::PhotoMechanic::XMP' },
+    },
+    mediapro => {
+        Name => 'mediapro',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::MediaPro' },
+    },
+    microsoft => {
+        Name => 'microsoft',
+        SubDirectory => { TagTable => 'Image::ExifTool::Microsoft::XMP' },
+    },
+    MP => {
+        Name => 'MP',
+        SubDirectory => { TagTable => 'Image::ExifTool::Microsoft::MP' },
+    },
+    MP1 => {
+        Name => 'MP1',
+        SubDirectory => { TagTable => 'Image::ExifTool::Microsoft::MP1' },
+    },
+    lr => {
+        Name => 'lr',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::Lightroom' },
+    },
+    DICOM => {
+        Name => 'DICOM',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::DICOM' },
+    },
+    album => {
+        Name => 'album',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::Album' },
+    },
+    prism => {
+        Name => 'prism',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::prism' },
+    },
+    prl => {
+        Name => 'prl',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::prl' },
+    },
+    pur => {
+        Name => 'pur',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::pur' },
+    },
+    rdf => {
+        Name => 'rdf',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::rdf' },
+    },
+   'x' => {
+        Name => 'x',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::x' },
+    },
+    acdsee => {
+        Name => 'acdsee',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::acdsee' },
+    },
+    digiKam => {
+        Name => 'digiKam',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::digiKam' },
+    },
+    swf => {
+        Name => 'swf',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::swf' },
+    },
+    cell => {
+        Name => 'cell',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::cell' },
+    },
+   'mwg-rs' => {
+        Name => 'mwg-rs',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::mwg_rs' },
+    },
+   'mwg-kw' => {
+        Name => 'mwg-kw',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::mwg_kw' },
+    },
+   'mwg-coll' => {
+        Name => 'mwg-coll',
+        SubDirectory => { TagTable => 'Image::ExifTool::XMP::mwg_coll' },
+    },
+);
+
+#
+# Tag tables for all XMP schemas:
+#
+# Writable - only need to define this for writable tags if not plain text
+#            (boolean, integer, rational, real, date or lang-alt)
+# List - XMP list type (Bag, Seq or Alt, or set to 1 for elements in Struct lists --
+#        this is necessary to obtain proper list behaviour when reading/writing)
+#
+# (Note that family 1 group names are generated from the property namespace, not
+#  the group1 names below which exist so the groups will appear in the list.)
+#
+%xmpTableDefaults = (
+    WRITE_PROC => \&WriteXMP,
+    CHECK_PROC => \&CheckXMP,
+    WRITABLE => 'string',
+    LANG_INFO => \&GetLangInfo,
+);
+
+# rdf attributes extracted
+%Image::ExifTool::XMP::rdf = (
+    %xmpTableDefaults,
+    GROUPS => { 1 => 'XMP-rdf', 2 => 'Document' },
+    NAMESPACE   => 'rdf',
+    NOTES => q{
+        Most RDF attributes are handled internally, but the "about" attribute is
+        treated specially to allow it to be set to a specific value if required.
+    },
+    about => { Protected => 1 },
+);
+
+# x attributes extracted
+%Image::ExifTool::XMP::x = (
+    %xmpTableDefaults,
+    GROUPS => { 1 => 'XMP-x', 2 => 'Document' },
+    NAMESPACE   => 'x',
+    NOTES => qq{
+        The "x" namespace is used for the "xmpmeta" wrapper, and may contain an
+        "xmptk" attribute that is extracted as the XMPToolkit tag.  When writing,
+        the XMPToolkit tag is automatically generated by ExifTool unless
+        specifically set to another value.
+    },
+    xmptk => { Name => 'XMPToolkit', Protected => 1 },
+);
+
+# Dublin Core schema properties (dc)
+%Image::ExifTool::XMP::dc = (
+    %xmpTableDefaults,
+    GROUPS => { 1 => 'XMP-dc', 2 => 'Other' },
+    NAMESPACE   => 'dc',
+    TABLE_DESC => 'XMP Dublin Core',
+    NOTES => 'Dublin Core schema tags.',
+    contributor => { Groups => { 2 => 'Author' }, List => 'Bag' },
+    coverage    => { },
+    creator     => { Groups => { 2 => 'Author' }, List => 'Seq' },
+    date        => { Groups => { 2 => 'Time' },   List => 'Seq', %dateTimeInfo },
+    description => { Groups => { 2 => 'Image'  }, Writable => 'lang-alt' },
+   'format'     => { Groups => { 2 => 'Image'  } },
+    identifier  => { Groups => { 2 => 'Image'  } },
+    language    => { List => 'Bag' },
+    publisher   => { Groups => { 2 => 'Author' }, List => 'Bag' },
+    relation    => { List => 'Bag' },
+    rights      => { Groups => { 2 => 'Author' }, Writable => 'lang-alt' },
+    source      => { Groups => { 2 => 'Author' }, Avoid => 1 },
+    subject     => { Groups => { 2 => 'Image'  }, List => 'Bag' },
+    title       => { Groups => { 2 => 'Image'  }, Writable => 'lang-alt' },
+    type        => { Groups => { 2 => 'Image'  }, List => 'Bag' },
+);
+
+# XMP Basic schema properties (xmp, xap)
+%Image::ExifTool::XMP::xmp = (
+    %xmpTableDefaults,
+    GROUPS => { 1 => 'XMP-xmp', 2 => 'Image' },
+    NAMESPACE   => 'xmp',
+    NOTES => q{
+        XMP Basic schema tags.  If the older "xap", "xapBJ", "xapMM" or "xapRights"
+        namespace prefixes are found, they are translated to the newer "xmp",
+        "xmpBJ", "xmpMM" and "xmpRights" prefixes for use in family 1 group names.
+    },
+    Advisory    => { List => 'Bag' }, # (deprecated)
+    BaseURL     => { },
+    # (date/time tags not as reliable as EXIF)
+    CreateDate  => { Groups => { 2 => 'Time' }, %dateTimeInfo, Priority => 0 },
+    CreatorTool => { },
+    Identifier  => { Avoid => 1, List => 'Bag' },
+    Label       => { },
+    MetadataDate=> { Groups => { 2 => 'Time' }, %dateTimeInfo },
+    ModifyDate  => { Groups => { 2 => 'Time' }, %dateTimeInfo, Priority => 0 },
+    Nickname    => { },
+    Rating      => { Writable => 'real', Notes => 'a value from 0 to 5, or -1 for "rejected"' },
+    Thumbnails  => { Struct => \%sThumbnail, List => 'Alt' },
+    ThumbnailsHeight => { Name => 'ThumbnailHeight', Flat => 1 },
+    ThumbnailsWidth  => { Name => 'ThumbnailWidth',  Flat => 1 },
+    ThumbnailsFormat => { Name => 'ThumbnailFormat', Flat => 1 },
+    ThumbnailsImage  => { Name => 'ThumbnailImage',  Flat => 1, Avoid => 1 },
+    # the following written by Adobe InDesign, not part of XMP spec:
+    PageInfo        => { Struct => \%sPageInfo, List => 'Seq' },
+    PageInfoPageNumber=>{Name => 'PageImagePageNumber', Flat => 1 },
+    PageInfoHeight  => { Name => 'PageImageHeight', Flat => 1 },
+    PageInfoWidth   => { Name => 'PageImageWidth',  Flat => 1 },
+    PageInfoFormat  => { Name => 'PageImageFormat', Flat => 1 },
+    PageInfoImage   => { Name => 'PageImage',       Flat => 1 },
+);
+
+# XMP Rights Management schema properties (xmpRights, xapRights)
+%Image::ExifTool::XMP::xmpRights = (
+    %xmpTableDefaults,
+    GROUPS => { 1 => 'XMP-xmpRights', 2 => 'Author' },
+    NAMESPACE   => 'xmpRights',
+    NOTES => 'XMP Rights Management schema tags.',
+    Certificate     => { },
+    Marked          => { Writable => 'boolean' },
+    Owner           => { List => 'Bag' },
+    UsageTerms      => { Writable => 'lang-alt' },
+    WebStatement    => { },
+);
+
+# XMP Note schema properties (xmpNote)
+%Image::ExifTool::XMP::xmpNote = (
+    %xmpTableDefaults,
+    GROUPS => { 1 => 'XMP-xmpNote' },
+    NAMESPACE   => 'xmpNote',
+    NOTES => 'XMP Note schema tags.',
+    HasExtendedXMP => { Writable => 'boolean', Protected => 2 },
+);
+
+# XMP xmpMM ManifestItem struct (ref PH, written by Adobe PDF library 8.0)
+my %sManifestItem = (
+    NAMESPACE => 'stMfs',
+    STRUCT_NAME => 'ManifestItem',
+    linkForm            => { },
+    placedXResolution   => { Namespace => 'xmpMM', Writable => 'real' },
+    placedYResolution   => { Namespace => 'xmpMM', Writable => 'real' },
+    placedResolutionUnit=> { Namespace => 'xmpMM' },
+    reference           => { Struct => \%sResourceRef },
+);
+
+# the xmpMM Pantry
+my %sPantryItem = (
+    NAMESPACE => undef, # stores any top-level XMP tags
+    STRUCT_NAME => 'PantryItem',
+    NOTES => q{
+        This structure must have an InstanceID field, but may also contain any other
+        XMP properties.
+    },
+    InstanceID => { Namespace => 'xmpMM' },
+);
+
+# XMP Media Management schema properties (xmpMM, xapMM)
+%Image::ExifTool::XMP::xmpMM = (
+    %xmpTableDefaults,
+    GROUPS => { 1 => 'XMP-xmpMM', 2 => 'Other' },
+    NAMESPACE   => 'xmpMM',
+    TABLE_DESC => 'XMP Media Management',
+    NOTES => 'XMP Media Management schema tags.',
+    DerivedFrom     => { Struct => \%sResourceRef },
+    DocumentID      => { },
+    History         => { Struct => \%sResourceEvent, List => 'Seq' },
+    # we treat these like list items since History is a list
+    Ingredients     => { Struct => \%sResourceRef, List => 'Bag' },
+    InstanceID      => { }, #PH (CS3)
+    ManagedFrom     => { Struct => \%sResourceRef },
+    Manager         => { Groups => { 2 => 'Author' } },
+    ManageTo        => { Groups => { 2 => 'Author' } },
+    ManageUI        => { },
+    ManagerVariant  => { },
+    Manifest        => { Struct => \%sManifestItem, List => 'Bag' },
+    OriginalDocumentID=> { },
+    Pantry          => { Struct => \%sPantryItem, List => 'Bag' },
+    PreservedFileName => { },   # undocumented
+    RenditionClass  => { },
+    RenditionParams => { },
+    VersionID       => { },
+    Versions        => { Struct => \%sVersion, List => 'Seq' },
+    LastURL         => { }, # (deprecated)
+    RenditionOf     => { Struct => \%sResourceRef }, # (deprecated)
+    SaveID          => { Writable => 'integer' }, # (deprecated)
+);
+
+# XMP Basic Job Ticket schema properties (xmpBJ, xapBJ)
+%Image::ExifTool::XMP::xmpBJ = (
+    %xmpTableDefaults,
+    GROUPS => { 1 => 'XMP-xmpBJ', 2 => 'Other' },
+    NAMESPACE   => 'xmpBJ',
+    TABLE_DESC => 'XMP Basic Job Ticket',
+    NOTES => 'XMP Basic Job Ticket schema tags.',
+    # Note: JobRef is a List of structures.  To accomplish this, we set the XMP
+    # List=>'Bag', but since SubDirectory is defined, this tag isn't writable
+    # directly.  Then we need to set List=>1 for the members so the Writer logic
+    # will allow us to add list items.
+    JobRef => { Struct => \%sJobRef, List => 'Bag' },
+);
+
+# XMP Paged-Text schema properties (xmpTPg)
+%Image::ExifTool::XMP::xmpTPg = (
+    %xmpTableDefaults,
+    GROUPS => { 1 => 'XMP-xmpTPg', 2 => 'Image' },
+    NAMESPACE   => 'xmpTPg',
+    TABLE_DESC => 'XMP Paged-Text',
+    NOTES => 'XMP Paged-Text schema tags.',
+    MaxPageSize         => { Struct => \%sDimensions },
+    NPages              => { Writable => 'integer' },
+    Fonts               => { Struct => \%sFont, List => 'Bag' },
+    FontsFontName       => { Flat => 1, Name => 'FontName' },
+    FontsFontFamily     => { Flat => 1, Name => 'FontFamily' },
+    FontsFontFace       => { Flat => 1, Name => 'FontFace' },
+    FontsFontType       => { Flat => 1, Name => 'FontType' },
+    FontsVersionString  => { Flat => 1, Name => 'FontVersion' },
+    FontsComposite      => { Flat => 1, Name => 'FontComposite' },
+    FontsFontFileName   => { Flat => 1, Name => 'FontFileName' },
+    FontsChildFontFiles => { Flat => 1, Name => 'ChildFontFiles' },
+    Colorants           => { Struct => \%sColorant, List => 'Seq' },
+    ColorantsSwatchName => { Flat => 1, Name => 'ColorantSwatchName' },
+    ColorantsMode       => { Flat => 1, Name => 'ColorantMode' },
+    ColorantsType       => { Flat => 1, Name => 'ColorantType' },
+    ColorantsCyan       => { Flat => 1, Name => 'ColorantCyan' },
+    ColorantsMagenta    => { Flat => 1, Name => 'ColorantMagenta' },
+    ColorantsYellow     => { Flat => 1, Name => 'ColorantYellow' },
+    ColorantsBlack      => { Flat => 1, Name => 'ColorantBlack' },
+    ColorantsRed        => { Flat => 1, Name => 'ColorantRed' },
+    ColorantsGreen      => { Flat => 1, Name => 'ColorantGreen' },
+    ColorantsBlue       => { Flat => 1, Name => 'ColorantBlue' },
+    ColorantsL          => { Flat => 1, Name => 'ColorantL' },
+    ColorantsA          => { Flat => 1, Name => 'ColorantA' },
+    ColorantsB          => { Flat => 1, Name => 'ColorantB' },
+    PlateNames          => { List => 'Seq' },
+);
+
+# PDF schema properties (pdf)
+%Image::ExifTool::XMP::pdf = (
+    %xmpTableDefaults,
+    GROUPS => { 1 => 'XMP-pdf', 2 => 'Image' },
+    NAMESPACE   => 'pdf',
+    TABLE_DESC => 'XMP PDF',
+    NOTES => q{
+        Adobe PDF schema tags.  The official XMP specification defines only
+        Keywords, PDFVersion, Producer and Trapped.  The other tags are included
+        because they have been observed in PDF files, but some are avoided when
+        writing due to name conflicts with other XMP namespaces.
+    },
+    Author      => { Groups => { 2 => 'Author' } }, #PH
+    ModDate     => { Groups => { 2 => 'Time' }, %dateTimeInfo }, #PH
+    CreationDate=> { Groups => { 2 => 'Time' }, %dateTimeInfo }, #PH
+    Creator     => { Groups => { 2 => 'Author' }, Avoid => 1 },
+    Copyright   => { Groups => { 2 => 'Author' }, Avoid => 1 }, #PH
+    Marked      => { Avoid => 1, Writable => 'boolean' }, #PH
+    Subject     => { Avoid => 1 },
+    Title       => { Avoid => 1 },
+    Trapped     => { #PH
+        # remove leading '/' from '/True' or '/False'
+        ValueConv => '$val=~s{^/}{}; $val',
+        ValueConvInv => '"/$val"',
+        PrintConv => { True => 'True', False => 'False', Unknown => 'Unknown' },
+    },
+    Keywords    => { },
+    PDFVersion  => { },
+    Producer    => { Groups => { 2 => 'Author' } },
+);
+
+# PDF extension schema properties (pdfx)
+%Image::ExifTool::XMP::pdfx = (
+    %xmpTableDefaults,
+    GROUPS => { 1 => 'XMP-pdfx', 2 => 'Document' },
+    NAMESPACE   => 'pdfx',
+    NOTES => q{
+        PDF extension tags.  This namespace is used to store application-defined PDF
+        information, so there are no pre-defined tags.  User-defined tags must be
+        created to enable writing of XMP-pdfx information.
+    },
+);
+
+# Photoshop schema properties (photoshop)
+%Image::ExifTool::XMP::photoshop = (
+    %xmpTableDefaults,
+    GROUPS => { 1 => 'XMP-photoshop', 2 => 'Image' },
+    NAMESPACE   => 'photoshop',
+    TABLE_DESC => 'XMP Photoshop',
+    NOTES => 'Adobe Photoshop schema tags.',
+    AuthorsPosition => { Groups => { 2 => 'Author' } },
+    CaptionWriter   => { Groups => { 2 => 'Author' } },
+    Category        => { },
+    City            => { Groups => { 2 => 'Location' } },
+    ColorMode       => {
+        Writable => 'integer', # (as of July 2010 spec, courtesy of yours truly)
+        PrintConvColumns => 2,
+        PrintConv => {
+            0 => 'Bitmap',
+            1 => 'Grayscale',
+            2 => 'Indexed',
+            3 => 'RGB',
+            4 => 'CMYK',
+            7 => 'Multichannel',
+            8 => 'Duotone',
+            9 => 'Lab',
+        },
+    },
+    Country         => { Groups => { 2 => 'Location' } },
+    Credit          => { Groups => { 2 => 'Author' } },
+    DateCreated     => { Groups => { 2 => 'Time' }, %dateTimeInfo },
+    DocumentAncestors => {
+        List => 'bag',
+        Struct => {
+            STRUCT_NAME => 'Ancestor',
+            NAMESPACE   => 'photoshop',
+            AncestorID => { },
+        },
+    },
+    DocumentAncestorsAncestorID => { Name => 'DocumentAncestorID', Flat => 1 },
+    Headline        => { },
+    History         => { }, #PH (CS3)
+    ICCProfile      => { Name => 'ICCProfileName' }, #PH
+    Instructions    => { },
+    LegacyIPTCDigest=> { }, #PH
+    SidecarForExtension => { }, #PH (CS3)
+    Source          => { Groups => { 2 => 'Author' } },
+    State           => { Groups => { 2 => 'Location' } },
+    # the XMP spec doesn't show SupplementalCategories as a 'Bag', but
+    # that's the way Photoshop writes it [fixed in the June 2005 XMP spec].
+    # Also, it is incorrectly listed as "SupplementalCategory" in the
+    # IPTC Standard Photo Metadata docs (2008rev2 and July 2009rev1) - PH
+    SupplementalCategories  => { List => 'Bag' },
+    TextLayers => {
+        List => 'seq',
+        Struct => {
+            STRUCT_NAME => 'Layer',
+            NAMESPACE   => 'photoshop',
+            LayerName => { },
+            LayerText => { },
+        },
+    },
+    TextLayersLayerName => { Flat => 1, Name => 'TextLayerName' },
+    TextLayersLayerText => { Flat => 1, Name => 'TextLayerText' },
+    TransmissionReference   => { },
+    Urgency         => {
+        Writable => 'integer',
+        Notes => 'should be in the range 1-8 to conform with the XMP spec',
+        PrintConv => { # (same values as IPTC:Urgency)
+            0 => '0 (reserved)',              # (not standard XMP)
+            1 => '1 (most urgent)',
+            2 => 2,
+            3 => 3,
+            4 => 4,
+            5 => '5 (normal urgency)',
+            6 => 6,
+            7 => 7,
+            8 => '8 (least urgent)',
+            9 => '9 (user-defined priority)', # (not standard XMP)
+        },
+    },
+);
+
+# Photoshop Camera Raw Schema properties (crs) - (ref 8,PH)
+%Image::ExifTool::XMP::crs = (
+    %xmpTableDefaults,
+    GROUPS => { 1 => 'XMP-crs', 2 => 'Image' },
+    NAMESPACE   => 'crs',
+    TABLE_DESC => 'Photoshop Camera Raw Schema',
+    NOTES => 'Photoshop Camera Raw Schema tags.',
+    AlreadyApplied  => { Writable => 'boolean' }, #PH (written by LightRoom beta 4.1)
+    AutoBrightness  => { Writable => 'boolean' },
+    AutoContrast    => { Writable => 'boolean' },
+    AutoExposure    => { Writable => 'boolean' },
+    AutoShadows     => { Writable => 'boolean' },
+    BlueHue         => { Writable => 'integer' },
+    BlueSaturation  => { Writable => 'integer' },
+    Brightness      => { Writable => 'integer' },
+    CameraProfile   => { },
+    ChromaticAberrationB=> { Writable => 'integer' },
+    ChromaticAberrationR=> { Writable => 'integer' },
+    ColorNoiseReduction => { Writable => 'integer' },
+    Contrast        => { Writable => 'integer', Avoid => 1 },
+    Converter       => { }, #PH guess (found in EXIF)
+    CropTop         => { Writable => 'real' },
+    CropLeft        => { Writable => 'real' },
+    CropBottom      => { Writable => 'real' },
+    CropRight       => { Writable => 'real' },
+    CropAngle       => { Writable => 'real' },
+    CropWidth       => { Writable => 'real' },
+    CropHeight      => { Writable => 'real' },
+    CropUnits => {
+        Writable => 'integer',
+        PrintConv => {
+            0 => 'pixels',
+            1 => 'inches',
+            2 => 'cm',
+        },
+    },
+    Exposure        => { Writable => 'real' },
+    GreenHue        => { Writable => 'integer' },
+    GreenSaturation => { Writable => 'integer' },
+    HasCrop         => { Writable => 'boolean' },
+    HasSettings     => { Writable => 'boolean' },
+    LuminanceSmoothing  => { Writable => 'integer' },
+    MoireFilter     => { PrintConv => { Off=>'Off', On=>'On' } },
+    RawFileName     => { },
+    RedHue          => { Writable => 'integer' },
+    RedSaturation   => { Writable => 'integer' },
+    Saturation      => { Writable => 'integer', Avoid => 1 },
+    Shadows         => { Writable => 'integer' },
+    ShadowTint      => { Writable => 'integer' },
+    Sharpness       => { Writable => 'integer', Avoid => 1 },
+    Smoothness      => { Writable => 'integer' },
+    Temperature     => { Writable => 'integer', Avoid => 1, Name => 'ColorTemperature' },
+    Tint            => { Writable => 'integer' },
+    ToneCurve       => { List => 'Seq' },
+    ToneCurveName => {
+        PrintConv => {
+            Linear           => 'Linear',
+           'Medium Contrast' => 'Medium Contrast',
+           'Strong Contrast' => 'Strong Contrast',
+            Custom           => 'Custom',
+        },
+    },
+    Version         => { },
+    VignetteAmount  => { Writable => 'integer' },
+    VignetteMidpoint=> { Writable => 'integer' },
+    WhiteBalance    => {
+        Avoid => 1,
+        PrintConv => {
+           'As Shot'    => 'As Shot',
+            Auto        => 'Auto',
+            Daylight    => 'Daylight',
+            Cloudy      => 'Cloudy',
+            Shade       => 'Shade',
+            Tungsten    => 'Tungsten',
+            Fluorescent => 'Fluorescent',
+            Flash       => 'Flash',
+            Custom      => 'Custom',
+        },
+    },
+    # new tags observed in Adobe Lightroom output - PH
+    CameraProfileDigest         => { },
+    Clarity                     => { Writable => 'integer' },
+    ConvertToGrayscale          => { Writable => 'boolean' },
+    Defringe                    => { Writable => 'integer' },
+    FillLight                   => { Writable => 'integer' },
+    HighlightRecovery           => { Writable => 'integer' },
+    HueAdjustmentAqua           => { Writable => 'integer' },
+    HueAdjustmentBlue           => { Writable => 'integer' },
+    HueAdjustmentGreen          => { Writable => 'integer' },
+    HueAdjustmentMagenta        => { Writable => 'integer' },
+    HueAdjustmentOrange         => { Writable => 'integer' },
+    HueAdjustmentPurple         => { Writable => 'integer' },
+    HueAdjustmentRed            => { Writable => 'integer' },
+    HueAdjustmentYellow         => { Writable => 'integer' },
+    IncrementalTemperature      => { Writable => 'integer' },
+    IncrementalTint             => { Writable => 'integer' },
+    LuminanceAdjustmentAqua     => { Writable => 'integer' },
+    LuminanceAdjustmentBlue     => { Writable => 'integer' },
+    LuminanceAdjustmentGreen    => { Writable => 'integer' },
+    LuminanceAdjustmentMagenta  => { Writable => 'integer' },
+    LuminanceAdjustmentOrange   => { Writable => 'integer' },
+    LuminanceAdjustmentPurple   => { Writable => 'integer' },
+    LuminanceAdjustmentRed      => { Writable => 'integer' },
+    LuminanceAdjustmentYellow   => { Writable => 'integer' },
+    ParametricDarks             => { Writable => 'integer' },
+    ParametricHighlights        => { Writable => 'integer' },
+    ParametricHighlightSplit    => { Writable => 'integer' },
+    ParametricLights            => { Writable => 'integer' },
+    ParametricMidtoneSplit      => { Writable => 'integer' },
+    ParametricShadows           => { Writable => 'integer' },
+    ParametricShadowSplit       => { Writable => 'integer' },
+    SaturationAdjustmentAqua    => { Writable => 'integer' },
+    SaturationAdjustmentBlue    => { Writable => 'integer' },
+    SaturationAdjustmentGreen   => { Writable => 'integer' },
+    SaturationAdjustmentMagenta => { Writable => 'integer' },
+    SaturationAdjustmentOrange  => { Writable => 'integer' },
+    SaturationAdjustmentPurple  => { Writable => 'integer' },
+    SaturationAdjustmentRed     => { Writable => 'integer' },
+    SaturationAdjustmentYellow  => { Writable => 'integer' },
+    SharpenDetail               => { Writable => 'integer' },
+    SharpenEdgeMasking          => { Writable => 'integer' },
+    SharpenRadius               => { Writable => 'real' },
+    SplitToningBalance          => { Writable => 'integer' },
+    SplitToningHighlightHue     => { Writable => 'integer' },
+    SplitToningHighlightSaturation => { Writable => 'integer' },
+    SplitToningShadowHue        => { Writable => 'integer' },
+    SplitToningShadowSaturation => { Writable => 'integer' },
+    Vibrance                    => { Writable => 'integer' },
+    # new tags written by LR 1.4 (not sure in what version they first appeared)
+    GrayMixerRed                => { Writable => 'integer' },
+    GrayMixerOrange             => { Writable => 'integer' },
+    GrayMixerYellow             => { Writable => 'integer' },
+    GrayMixerGreen              => { Writable => 'integer' },
+    GrayMixerAqua               => { Writable => 'integer' },
+    GrayMixerBlue               => { Writable => 'integer' },
+    GrayMixerPurple             => { Writable => 'integer' },
+    GrayMixerMagenta            => { Writable => 'integer' },
+    RetouchInfo                 => { List => 'Seq' },
+    RedEyeInfo                  => { List => 'Seq' },
+    # new tags written by LR 2.0 (ref PH)
+    CropUnit => { # was the XMP documentation wrong with "CropUnits"??
+        Writable => 'integer',
+        PrintConv => {
+            0 => 'pixels',
+            1 => 'inches',
+            2 => 'cm',
+            # have seen a value of 3 here! - PH
+        },
+    },
+    PostCropVignetteAmount      => { Writable => 'integer' },
+    PostCropVignetteMidpoint    => { Writable => 'integer' },
+    PostCropVignetteFeather     => { Writable => 'integer' },
+    PostCropVignetteRoundness   => { Writable => 'integer' },
+    PostCropVignetteStyle       => { Writable => 'integer' },
+    # disable List behaviour of flattened Gradient/PaintBasedCorrections
+    # because these are nested in lists and the flattened tags can't
+    # do justice to this complex structure
+    GradientBasedCorrections => { Struct => \%sCorrection, List => 'Seq' },
+    GradientBasedCorrectionsWhat => {
+        Name => 'GradientBasedCorrWhat',
+        Flat => 1, List => 0,
+    },
+    GradientBasedCorrectionsCorrectionAmount => {
+        Name => 'GradientBasedCorrAmount',
+        Flat => 1, List => 0,
+    },
+    GradientBasedCorrectionsCorrectionActive => {
+        Name => 'GradientBasedCorrActive',
+        Flat => 1, List => 0,
+    },
+    GradientBasedCorrectionsLocalExposure => {
+        Name => 'GradientBasedCorrExposure',
+        Flat => 1, List => 0,
+    },
+    GradientBasedCorrectionsLocalSaturation => {
+        Name => 'GradientBasedCorrSaturation',
+        Flat => 1, List => 0,
+    },
+    GradientBasedCorrectionsLocalContrast => {
+        Name => 'GradientBasedCorrContrast',
+        Flat => 1, List => 0,
+    },
+    GradientBasedCorrectionsLocalClarity => {
+        Name => 'GradientBasedCorrClarity',
+        Flat => 1, List => 0,
+    },
+    GradientBasedCorrectionsLocalSharpness => {
+        Name => 'GradientBasedCorrSharpness',
+        Flat => 1, List => 0,
+    },
+    GradientBasedCorrectionsLocalBrightness => {
+        Name => 'GradientBasedCorrBrightness',
+        Flat => 1, List => 0,
+    },
+    GradientBasedCorrectionsLocalToningHue => {
+        Name => 'GradientBasedCorrHue',
+        Flat => 1, List => 0,
+    },
+    GradientBasedCorrectionsLocalToningSaturation => {
+        Name => 'GradientBasedCorrSaturation',
+        Flat => 1, List => 0,
+    },
+    GradientBasedCorrectionsCorrectionMasks => {
+        Name => 'GradientBasedCorrMasks',
+        Flat => 1
+    },
+    GradientBasedCorrectionsCorrectionMasksWhat => {
+        Name => 'GradientBasedCorrMaskWhat',
+        Flat => 1, List => 0,
+    },
+    GradientBasedCorrectionsCorrectionMasksMaskValue => {
+        Name => 'GradientBasedCorrMaskValue',
+        Flat => 1, List => 0,
+    },
+    GradientBasedCorrectionsCorrectionMasksRadius => {
+        Name => 'GradientBasedCorrMaskRadius',
+        Flat => 1, List => 0,
+    },
+    GradientBasedCorrectionsCorrectionMasksFlow => {
+        Name => 'GradientBasedCorrMaskFlow',
+        Flat => 1, List => 0,
+    },
+    GradientBasedCorrectionsCorrectionMasksCenterWeight => {
+        Name => 'GradientBasedCorrMaskCenterWeight',
+        Flat => 1, List => 0,
+    },
+    GradientBasedCorrectionsCorrectionMasksDabs => {
+        Name => 'GradientBasedCorrMaskDabs',
+        Flat => 1, List => 0,
+    },
+    GradientBasedCorrectionsCorrectionMasksZeroX => {
+        Name => 'GradientBasedCorrMaskZeroX',
+        Flat => 1, List => 0,
+    },
+    GradientBasedCorrectionsCorrectionMasksZeroY => {
+        Name => 'GradientBasedCorrMaskZeroY',
+        Flat => 1, List => 0,
+    },
+    GradientBasedCorrectionsCorrectionMasksFullX => {
+        Name => 'GradientBasedCorrMaskFullX',
+        Flat => 1, List => 0,
+    },
+    GradientBasedCorrectionsCorrectionMasksFullY => {
+        Name => 'GradientBasedCorrMaskFullY',
+        Flat => 1, List => 0,
+    },
+    PaintBasedCorrections => { Struct => \%sCorrection, List => 'Seq' },
+    PaintBasedCorrectionsWhat => {
+        Name => 'PaintCorrectionWhat',
+        Flat => 1, List => 0,
+    },
+    PaintBasedCorrectionsCorrectionAmount => {
+        Name => 'PaintCorrectionAmount',
+        Flat => 1, List => 0,
+    },
+    PaintBasedCorrectionsCorrectionActive => {
+        Name => 'PaintCorrectionActive',
+        Flat => 1, List => 0,
+    },
+    PaintBasedCorrectionsLocalExposure => {
+        Name => 'PaintCorrectionExposure',
+        Flat => 1, List => 0,
+    },
+    PaintBasedCorrectionsLocalSaturation => {
+        Name => 'PaintCorrectionSaturation',
+        Flat => 1, List => 0,
+    },
+    PaintBasedCorrectionsLocalContrast => {
+        Name => 'PaintCorrectionContrast',
+        Flat => 1, List => 0,
+    },
+    PaintBasedCorrectionsLocalClarity => {
+        Name => 'PaintCorrectionClarity',
+        Flat => 1, List => 0,
+    },
+    PaintBasedCorrectionsLocalSharpness => {
+        Name => 'PaintCorrectionSharpness',
+        Flat => 1, List => 0,
+    },
+    PaintBasedCorrectionsLocalBrightness => {
+        Name => 'PaintCorrectionBrightness',
+        Flat => 1, List => 0,
+    },
+    PaintBasedCorrectionsLocalToningHue => {
+        Name => 'PaintCorrectionHue',
+        Flat => 1, List => 0,
+    },
+    PaintBasedCorrectionsLocalToningSaturation => {
+        Name => 'PaintCorrectionSaturation',
+        Flat => 1, List => 0,
+    },
+    PaintBasedCorrectionsCorrectionMasks => {
+        Name => 'PaintBasedCorrectionMasks',
+        Flat => 1,
+    },
+    PaintBasedCorrectionsCorrectionMasksWhat => {
+        Name => 'PaintCorrectionMaskWhat',
+        Flat => 1, List => 0,
+    },
+    PaintBasedCorrectionsCorrectionMasksMaskValue => {
+        Name => 'PaintCorrectionMaskValue',
+        Flat => 1, List => 0,
+    },
+    PaintBasedCorrectionsCorrectionMasksRadius => {
+        Name => 'PaintCorrectionMaskRadius',
+        Flat => 1, List => 0,
+    },
+    PaintBasedCorrectionsCorrectionMasksFlow => {
+        Name => 'PaintCorrectionMaskFlow',
+        Flat => 1, List => 0,
+    },
+    PaintBasedCorrectionsCorrectionMasksCenterWeight => {
+        Name => 'PaintCorrectionMaskCenterWeight',
+        Flat => 1, List => 0,
+    },
+    PaintBasedCorrectionsCorrectionMasksDabs => {
+        Name => 'PaintCorrectionMaskDabs',
+        Flat => 1, List => 0,
+    },
+    PaintBasedCorrectionsCorrectionMasksZeroX => {
+        Name => 'PaintCorrectionMaskZeroX',
+        Flat => 1, List => 0,
+    },
+    PaintBasedCorrectionsCorrectionMasksZeroY => {
+        Name => 'PaintCorrectionMaskZeroY',
+        Flat => 1, List => 0,
+    },
+    PaintBasedCorrectionsCorrectionMasksFullX => {
+        Name => 'PaintCorrectionMaskFullX',
+        Flat => 1, List => 0,
+    },
+    PaintBasedCorrectionsCorrectionMasksFullY => {
+        Name => 'PaintCorrectionMaskFullY',
+        Flat => 1, List => 0,
+    },
+    # new tags written by LR 3 (thanks Wolfgang Guelcker)
+    ProcessVersion                       => { },
+    LensProfileEnable                    => { Writable => 'integer' },
+    LensProfileSetup                     => { },
+    LensProfileName                      => { },
+    LensProfileFilename                  => { },
+    LensProfileDigest                    => { },
+    LensProfileDistortionScale           => { Writable => 'integer' },
+    LensProfileChromaticAberrationScale  => { Writable => 'integer' },
+    LensProfileVignettingScale           => { Writable => 'integer' },
+    LensManualDistortionAmount           => { Writable => 'integer' },
+    PerspectiveVertical                  => { Writable => 'integer' },
+    PerspectiveHorizontal                => { Writable => 'integer' },
+    PerspectiveRotate                    => { Writable => 'real'    },
+    PerspectiveScale                     => { Writable => 'integer' },
+    CropConstrainToWarp                  => { Writable => 'integer' },      
+    LuminanceNoiseReductionDetail        => { Writable => 'integer' },
+    LuminanceNoiseReductionContrast      => { Writable => 'integer' },
+    ColorNoiseReductionDetail            => { Writable => 'integer' },
+    GrainAmount                          => { Writable => 'integer' },
+    GrainSize                            => { Writable => 'integer' },
+    GrainFrequency                       => { Writable => 'integer' },
+);
+
+# Tiff schema properties (tiff)
+%Image::ExifTool::XMP::tiff = (
+    %xmpTableDefaults,
+    GROUPS => { 1 => 'XMP-tiff', 2 => 'Image' },
+    NAMESPACE   => 'tiff',
+    PRIORITY => 0, # not as reliable as actual TIFF tags
+    TABLE_DESC => 'XMP TIFF',
+    NOTES => 'EXIF schema for TIFF tags.',
+    ImageWidth    => { Writable => 'integer' },
+    ImageLength   => { Writable => 'integer', Name => 'ImageHeight' },
+    BitsPerSample => { Writable => 'integer', List => 'Seq', AutoSplit => 1 },
+    Compression => {
+        Writable => 'integer',
+        SeparateTable => 'EXIF Compression',
+        PrintConv => \%Image::ExifTool::Exif::compression,
+    },
+    PhotometricInterpretation => {
+        Writable => 'integer',
+        PrintConv => \%Image::ExifTool::Exif::photometricInterpretation,
+    },
+    Orientation => {
+        Writable => 'integer',
+        PrintConv => \%Image::ExifTool::Exif::orientation,
+    },
+    SamplesPerPixel => { Writable => 'integer' },
+    PlanarConfiguration => {
+        Writable => 'integer',
+        PrintConv => {
+            1 => 'Chunky',
+            2 => 'Planar',
+        },
+    },
+    YCbCrSubSampling => { PrintConv => \%Image::ExifTool::JPEG::yCbCrSubSampling },
+    YCbCrPositioning => {
+        Writable => 'integer',
+        PrintConv => {
+            1 => 'Centered',
+            2 => 'Co-sited',
+        },
+    },
+    XResolution => { Writable => 'rational' },
+    YResolution => { Writable => 'rational' },
+    ResolutionUnit => {
+        Writable => 'integer',
+        Notes => 'the value 1 is not standard EXIF',
+        PrintConv => {
+            1 => 'None',
+            2 => 'inches',
+            3 => 'cm',
+        },
+    },
+    TransferFunction      => { Writable => 'integer',  List => 'Seq' },
+    WhitePoint            => { Writable => 'rational', List => 'Seq', AutoSplit => 1 },
+    PrimaryChromaticities => { Writable => 'rational', List => 'Seq', AutoSplit => 1 },
+    YCbCrCoefficients     => { Writable => 'rational', List => 'Seq', AutoSplit => 1 },
+    ReferenceBlackWhite   => { Writable => 'rational', List => 'Seq', AutoSplit => 1 },
+    DateTime => { # (EXIF tag named ModifyDate, but this exists in XMP-xmp)
+        Description => 'Date/Time Modified',
+        Groups => { 2 => 'Time' },
+        %dateTimeInfo,
+    },
+    ImageDescription => { Writable => 'lang-alt' },
+    Make      => { Groups => { 2 => 'Camera' } },
+    Model     => { Groups => { 2 => 'Camera' }, Description => 'Camera Model Name' },
+    Software  => { },
+    Artist    => { Groups => { 2 => 'Author' } },
+    Copyright => { Groups => { 2 => 'Author' }, Writable => 'lang-alt' },
+    NativeDigest => { }, #PH
+);
+
+# Exif schema properties (exif)
+%Image::ExifTool::XMP::exif = (
+    %xmpTableDefaults,
+    GROUPS => { 1 => 'XMP-exif', 2 => 'Image' },
+    NAMESPACE   => 'exif',
+    PRIORITY => 0, # not as reliable as actual EXIF tags
+    NOTES => 'EXIF schema for EXIF tags.',
+    ExifVersion     => { },
+    FlashpixVersion => { },
+    ColorSpace => {
+        Writable => 'integer',
+        # (some applications incorrectly write -1 as a long integer)
+        ValueConv => '$val == 0xffffffff ? 0xffff : $val',
+        ValueConvInv => '$val',
+        PrintConv => {
+            1 => 'sRGB',
+            2 => 'Adobe RGB',
+            0xffff => 'Uncalibrated',
+        },
+    },
+    ComponentsConfiguration => {
+        List => 'Seq',
+        Writable => 'integer',
+        AutoSplit => 1,
+        PrintConvColumns => 2,
+        PrintConv => {
+            0 => '-',
+            1 => 'Y',
+            2 => 'Cb',
+            3 => 'Cr',
+            4 => 'R',
+            5 => 'G',
+            6 => 'B',
+        },
+    },
+    CompressedBitsPerPixel => { Writable => 'rational' },
+    PixelXDimension  => { Name => 'ExifImageWidth',  Writable => 'integer' },
+    PixelYDimension  => { Name => 'ExifImageHeight', Writable => 'integer' },
+    MakerNote        => { },
+    UserComment      => { Writable => 'lang-alt' },
+    RelatedSoundFile => { },
+    DateTimeOriginal => {
+        Description => 'Date/Time Original',
+        Groups => { 2 => 'Time' },
+        %dateTimeInfo,
+    },
+    DateTimeDigitized => { # (EXIF tag named CreateDate, but this exists in XMP-xmp)
+        Description => 'Date/Time Digitized',
+        Groups => { 2 => 'Time' },
+        %dateTimeInfo,
+    },
+    ExposureTime => {
+        Writable => 'rational',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    FNumber => {
+        Writable => 'rational',
+        PrintConv => 'sprintf("%.1f",$val)',
+        PrintConvInv => '$val',
+    },
+    ExposureProgram => {
+        Groups => { 2 => 'Camera' },
+        Writable => 'integer',
+        PrintConv => {
+            0 => 'Not Defined',
+            1 => 'Manual',
+            2 => 'Program AE',
+            3 => 'Aperture-priority AE',
+            4 => 'Shutter speed priority AE',
+            5 => 'Creative (Slow speed)',
+            6 => 'Action (High speed)',
+            7 => 'Portrait',
+            8 => 'Landscape',
+        },
+    },
+    SpectralSensitivity => { Groups => { 2 => 'Camera' } },
+    ISOSpeedRatings => {
+        Name => 'ISO',
+        Writable => 'integer',
+        List => 'Seq',
+        AutoSplit => 1,
+    },
+    OECF => {
+        Name => 'Opto-ElectricConvFactor',
+        Groups => { 2 => 'Camera' },
+        Struct => \%sOECF,
+    },
+    OECFColumns => { Flat => 1 },
+    OECFRows    => { Flat => 1 },
+    OECFNames   => { Flat => 1 },
+    OECFValues  => { Flat => 1 },
+    ShutterSpeedValue => {
+        Writable => 'rational',
+        ValueConv => 'abs($val)<100 ? 1/(2**$val) : 0',
+        PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
+        ValueConvInv => '$val>0 ? -log($val)/log(2) : 0',
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
+    },
+    ApertureValue => {
+        Writable => 'rational',
+        ValueConv => 'sqrt(2) ** $val',
+        PrintConv => 'sprintf("%.1f",$val)',
+        ValueConvInv => '$val>0 ? 2*log($val)/log(2) : 0',
+        PrintConvInv => '$val',
+    },
+    BrightnessValue   => { Writable => 'rational' },
+    ExposureBiasValue => {
+        Name => 'ExposureCompensation',
+        Writable => 'rational',
+        PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
+        PrintConvInv => '$val',
+    },
+    MaxApertureValue => {
+        Groups => { 2 => 'Camera' },
+        Writable => 'rational',
+        ValueConv => 'sqrt(2) ** $val',
+        PrintConv => 'sprintf("%.1f",$val)',
+        ValueConvInv => '$val>0 ? 2*log($val)/log(2) : 0',
+        PrintConvInv => '$val',
+    },
+    SubjectDistance => {
+        Groups => { 2 => 'Camera' },
+        Writable => 'rational',
+        PrintConv => '$val =~ /^(inf|undef)$/ ? $val : "$val m"',
+        PrintConvInv => '$val=~s/\s*m$//;$val',
+    },
+    MeteringMode => {
+        Groups => { 2 => 'Camera' },
+        Writable => 'integer',
+        PrintConv => {
+            1 => 'Average',
+            2 => 'Center-weighted average',
+            3 => 'Spot',
+            4 => 'Multi-spot',
+            5 => 'Multi-segment',
+            6 => 'Partial',
+            255 => 'Other',
+        },
+    },
+    LightSource => {
+        Groups => { 2 => 'Camera' },
+        SeparateTable => 'EXIF LightSource',
+        PrintConv =>  \%Image::ExifTool::Exif::lightSource,
+    },
+    Flash => {
+        Groups => { 2 => 'Camera' },
+        Struct => {
+            STRUCT_NAME => 'Flash',
+            NAMESPACE   => 'exif',
+            Fired       => { Writable => 'boolean' },
+            Return => {
+                Writable => 'integer',
+                PrintConv => {
+                    0 => 'No return detection',
+                    2 => 'Return not detected',
+                    3 => 'Return detected',
+                },
+            },
+            Mode => {
+                Writable => 'integer',
+                PrintConv => {
+                    0 => 'Unknown',
+                    1 => 'On',
+                    2 => 'Off',
+                    3 => 'Auto',
+                },
+            },
+            Function    => { Writable => 'boolean' },
+            RedEyeMode  => { Writable => 'boolean' },
+        },
+    },
+    FocalLength=> {
+        Groups => { 2 => 'Camera' },
+        Writable => 'rational',
+        PrintConv => 'sprintf("%.1f mm",$val)',
+        PrintConvInv => '$val=~s/\s*mm$//;$val',
+    },
+    SubjectArea => { Writable => 'integer', List => 'Seq', AutoSplit => 1 },
+    FlashEnergy => { Groups => { 2 => 'Camera' }, Writable => 'rational' },
+    SpatialFrequencyResponse => {
+        Groups => { 2 => 'Camera' },
+        Struct => \%sOECF,
+    },
+    FocalPlaneXResolution => { Groups => { 2 => 'Camera' }, Writable => 'rational' },
+    FocalPlaneYResolution => { Groups => { 2 => 'Camera' }, Writable => 'rational' },
+    FocalPlaneResolutionUnit => {
+        Groups => { 2 => 'Camera' },
+        Writable => 'integer',
+        Notes => 'values 1, 4 and 5 are not standard EXIF',
+        PrintConv => {
+            1 => 'None', # (not standard EXIF)
+            2 => 'inches',
+            3 => 'cm',
+            4 => 'mm',   # (not standard EXIF)
+            5 => 'um',   # (not standard EXIF)
+        },
+    },
+    SubjectLocation => { Writable => 'integer', List => 'Seq', AutoSplit => 1 },
+    ExposureIndex   => { Writable => 'rational' },
+    SensingMethod => {
+        Groups => { 2 => 'Camera' },
+        Writable => 'integer',
+        Notes => 'values 1 and 6 are not standard EXIF',
+        PrintConv => {
+            1 => 'Monochrome area', # (not standard EXIF)
+            2 => 'One-chip color area',
+            3 => 'Two-chip color area',
+            4 => 'Three-chip color area',
+            5 => 'Color sequential area',
+            6 => 'Monochrome linear', # (not standard EXIF)
+            7 => 'Trilinear',
+            8 => 'Color sequential linear',
+        },
+    },
+    FileSource => {
+        Writable => 'integer',
+        PrintConv => {
+            1 => 'Film Scanner',
+            2 => 'Reflection Print Scanner',
+            3 => 'Digital Camera',
+        }
+    },
+    SceneType  => { Writable => 'integer', PrintConv => { 1 => 'Directly photographed' } },
+    CFAPattern => {
+        Struct => {
+            STRUCT_NAME => 'CFAPattern',
+            NAMESPACE   => 'exif',
+            Columns     => { Writable => 'integer' },
+            Rows        => { Writable => 'integer' },
+            Values      => { Writable => 'integer', List => 'Seq' },
+        },
+    },
+    CustomRendered => {
+        Writable => 'integer',
+        PrintConv => {
+            0 => 'Normal',
+            1 => 'Custom',
+        },
+    },
+    ExposureMode => {
+        Groups => { 2 => 'Camera' },
+        Writable => 'integer',
+        PrintConv => {
+            0 => 'Auto',
+            1 => 'Manual',
+            2 => 'Auto bracket',
+        },
+    },
+    WhiteBalance => {
+        Groups => { 2 => 'Camera' },
+        Writable => 'integer',
+        PrintConv => {
+            0 => 'Auto',
+            1 => 'Manual',
+        },
+    },
+    DigitalZoomRatio => { Writable => 'rational' },
+    FocalLengthIn35mmFilm => {
+        Name => 'FocalLengthIn35mmFormat',
+        Writable => 'integer',
+        Groups => { 2 => 'Camera' },
+        PrintConv => '"$val mm"',
+        PrintConvInv => '$val=~s/\s*mm$//;$val',
+    },
+    SceneCaptureType => {
+        Groups => { 2 => 'Camera' },
+        Writable => 'integer',
+        PrintConv => {
+            0 => 'Standard',
+            1 => 'Landscape',
+            2 => 'Portrait',
+            3 => 'Night',
+        },
+    },
+    GainControl => {
+        Groups => { 2 => 'Camera' },
+        Writable => 'integer',
+        PrintConv => {
+            0 => 'None',
+            1 => 'Low gain up',
+            2 => 'High gain up',
+            3 => 'Low gain down',
+            4 => 'High gain down',
+        },
+    },
+    Contrast => {
+        Groups => { 2 => 'Camera' },
+        Writable => 'integer',
+        PrintConv => {
+            0 => 'Normal',
+            1 => 'Low',
+            2 => 'High',
+        },
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertParameter($val)',
+    },
+    Saturation => {
+        Groups => { 2 => 'Camera' },
+        Writable => 'integer',
+        PrintConv => {
+            0 => 'Normal',
+            1 => 'Low',
+            2 => 'High',
+        },
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertParameter($val)',
+    },
+    Sharpness => {
+        Groups => { 2 => 'Camera' },
+        Writable => 'integer',
+        PrintConv => {
+            0 => 'Normal',
+            1 => 'Soft',
+            2 => 'Hard',
+        },
+        PrintConvInv => 'Image::ExifTool::Exif::ConvertParameter($val)',
+    },
+    DeviceSettingDescription => {
+        Groups => { 2 => 'Camera' },
+        Struct => {
+            STRUCT_NAME => 'DeviceSettings',
+            NAMESPACE   => 'exif',
+            Columns     => { Writable => 'integer' },
+            Rows        => { Writable => 'integer' },
+            Settings    => { List => 'Seq' },
+        },
+    },
+    SubjectDistanceRange => {
+        Groups => { 2 => 'Camera' },
+        Writable => 'integer',
+        PrintConv => {
+            0 => 'Unknown',
+            1 => 'Macro',
+            2 => 'Close',
+            3 => 'Distant',
+        },
+    },
+    ImageUniqueID   => { },
+    GPSVersionID    => { Groups => { 2 => 'Location' } },
+    GPSLatitude     => { Groups => { 2 => 'Location' }, %latConv },
+    GPSLongitude    => { Groups => { 2 => 'Location' }, %longConv },
+    GPSAltitudeRef  => {
+        Groups => { 2 => 'Location' },
+        Writable => 'integer',
+        PrintConv => {
+            0 => 'Above Sea Level',
+            1 => 'Below Sea Level',
+        },
+    },
+    GPSAltitude => {
+        Groups => { 2 => 'Location' },
+        Writable => 'rational',
+        RawConv => 'require Image::ExifTool::GPS; $val', # to load Composite tags and routines
+        # extricate unsigned decimal number from string
+        ValueConvInv => '$val=~/((?=\d|\.\d)\d*(?:\.\d*)?)/ ? $1 : undef',
+        PrintConv => '$val =~ /^(inf|undef)$/ ? $val : "$val m"',
+        PrintConvInv => '$val=~s/\s*m$//;$val',
+    },
+    GPSTimeStamp => {
+        Name => 'GPSDateTime',
+        Description => 'GPS Date/Time',
+        Groups => { 2 => 'Time' },
+        Notes => q{
+            a date/time tag called GPSTimeStamp by the XMP specification.  This tag is
+            renamed here to prevent direct copy from EXIF:GPSTimeStamp which is a
+            time-only tag.  Instead, the value of this tag should be taken from
+            Composite:GPSDateTime when copying from EXIF
+        },
+        %dateTimeInfo,
+    },
+    GPSSatellites   => { Groups => { 2 => 'Location' } },
+    GPSStatus => {
+        Groups => { 2 => 'Location' },
+        PrintConv => {
+            A => 'Measurement Active',
+            V => 'Measurement Void',
+        },
+    },
+    GPSMeasureMode => {
+        Groups => { 2 => 'Location' },
+        Writable => 'integer',
+        PrintConv => {
+            2 => '2-Dimensional',
+            3 => '3-Dimensional',
+        },
+    },
+    GPSDOP => { Groups => { 2 => 'Location' }, Writable => 'rational' },
+    GPSSpeedRef => {
+        Groups => { 2 => 'Location' },
+        PrintConv => {
+            K => 'km/h',
+            M => 'mph',
+            N => 'knots',
+        },
+    },
+    GPSSpeed => { Groups => { 2 => 'Location' }, Writable => 'rational' },
+    GPSTrackRef => {
+        Groups => { 2 => 'Location' },
+        PrintConv => {
+            M => 'Magnetic North',
+            T => 'True North',
+        },
+    },
+    GPSTrack => { Groups => { 2 => 'Location' }, Writable => 'rational' },
+    GPSImgDirectionRef => {
+        PrintConv => {
+            M => 'Magnetic North',
+            T => 'True North',
+        },
+    },
+    GPSImgDirection => { Groups => { 2 => 'Location' }, Writable => 'rational' },
+    GPSMapDatum     => { Groups => { 2 => 'Location' } },
+    GPSDestLatitude => { Groups => { 2 => 'Location' }, %latConv },
+    GPSDestLongitude=> { Groups => { 2 => 'Location' }, %longConv },
+    GPSDestBearingRef => {
+        Groups => { 2 => 'Location' },
+        PrintConv => {
+            M => 'Magnetic North',
+            T => 'True North',
+        },
+    },
+    GPSDestBearing => { Groups => { 2 => 'Location' }, Writable => 'rational' },
+    GPSDestDistanceRef => {
+        Groups => { 2 => 'Location' },
+        PrintConv => {
+            K => 'Kilometers',
+            M => 'Miles',
+            N => 'Nautical Miles',
+        },
+    },
+    GPSDestDistance => {
+        Groups => { 2 => 'Location' },
+        Writable => 'rational',
+    },
+    GPSProcessingMethod => { Groups => { 2 => 'Location' } },
+    GPSAreaInformation  => { Groups => { 2 => 'Location' } },
+    GPSDifferential => {
+        Groups => { 2 => 'Location' },
+        Writable => 'integer',
+        PrintConv => {
+            0 => 'No Correction',
+            1 => 'Differential Corrected',
+        },
+    },
+    NativeDigest => { }, #PH
+);
+
+# Auxiliary schema properties (aux) - not fully documented (ref PH)
+%Image::ExifTool::XMP::aux = (
+    %xmpTableDefaults,
+    GROUPS => { 1 => 'XMP-aux', 2 => 'Camera' },
+    NAMESPACE   => 'aux',
+    NOTES => 'Photoshop Auxiliary schema tags.',
+    Firmware        => { }, #7
+    FlashCompensation => { Writable => 'rational' }, #7
+    ImageNumber     => { }, #7
+    LensInfo        => { #7
+        Notes => '4 rational values giving focal and aperture ranges',
+        # convert to floating point values (or 'inf' or 'undef')
+        ValueConv => sub {
+            my $val = shift;
+            my @vals = split ' ', $val;
+            return $val unless @vals == 4;
+            foreach (@vals) {
+                ConvertRational($_) or return $val;
+            }
+            return join ' ', @vals;
+        },
+        ValueConvInv => sub {
+            my $val = shift;
+            my @vals = split ' ', $val;
+            return $val unless @vals == 4;
+            foreach (@vals) {
+                $_ eq 'inf' and $_ = '1/0', next;
+                $_ eq 'undef' and $_ = '0/0', next;
+                Image::ExifTool::IsFloat($_) or return $val;
+                my @a = Image::ExifTool::Rationalize($_);
+                $_ = join '/', @a;
+            }
+            return join ' ', @vals;
+        },
+        # convert to the form "12-20mm f/3.8-4.5" or "50mm f/1.4"
+        PrintConv => \&Image::ExifTool::Exif::PrintLensInfo,
+        PrintConvInv => \&Image::ExifTool::Exif::ConvertLensInfo,
+    },
+    Lens            => { },
+    OwnerName       => { }, #7
+    SerialNumber    => { },
+    LensID          => {
+        Priority => 0,
+        # prevent this from getting set from a LensID that has been converted
+        ValueConvInv => q{
+            warn "Expected one or more integer values" if $val =~ /[^\d ]/;
+            return $val;
+        },
+    },
+    ApproximateFocusDistance => { Writable => 'rational' }, #PH (LR3)
+);
+
+# IPTC Core schema properties (Iptc4xmpCore) (ref 4)
+%Image::ExifTool::XMP::iptcCore = (
+    %xmpTableDefaults,
+    GROUPS => { 1 => 'XMP-iptcCore', 2 => 'Author' },
+    NAMESPACE   => 'Iptc4xmpCore',
+    TABLE_DESC => 'XMP IPTC Core',
+    NOTES => q{
+        IPTC Core schema tags.  The actual IPTC Core namespace prefix is
+        "Iptc4xmpCore", which is the prefix recorded in the file, but ExifTool
+        shortens this for the "XMP-iptcCore" family 1 group name. (see
+        L<http://www.iptc.org/IPTC4XMP/>)
+    },
+    CountryCode         => { Groups => { 2 => 'Location' } },
+    CreatorContactInfo => {
+        Struct => {
+            STRUCT_NAME => 'ContactInfo',
+            NAMESPACE   => 'Iptc4xmpCore',
+            CiAdrCity   => { },
+            CiAdrCtry   => { },
+            CiAdrExtadr => { },
+            CiAdrPcode  => { },
+            CiAdrRegion => { },
+            CiEmailWork => { },
+            CiTelWork   => { },
+            CiUrlWork   => { },
+        },
+    },
+    CreatorContactInfoCiAdrCity   => { Flat => 1, Name => 'CreatorCity' },
+    CreatorContactInfoCiAdrCtry   => { Flat => 1, Name => 'CreatorCountry' },
+    CreatorContactInfoCiAdrExtadr => { Flat => 1, Name => 'CreatorAddress' },
+    CreatorContactInfoCiAdrPcode  => { Flat => 1, Name => 'CreatorPostalCode' },
+    CreatorContactInfoCiAdrRegion => { Flat => 1, Name => 'CreatorRegion' },
+    CreatorContactInfoCiEmailWork => { Flat => 1, Name => 'CreatorWorkEmail' },
+    CreatorContactInfoCiTelWork   => { Flat => 1, Name => 'CreatorWorkTelephone' },
+    CreatorContactInfoCiUrlWork   => { Flat => 1, Name => 'CreatorWorkURL' },
+    IntellectualGenre   => { Groups => { 2 => 'Other' } },
+    Location            => { Groups => { 2 => 'Location' } },
+    Scene               => { Groups => { 2 => 'Other' }, List => 'Bag' },
+    SubjectCode         => { Groups => { 2 => 'Other' }, List => 'Bag' },
+);
+
+# IPTC Extension schema properties (Iptc4xmpExt) (ref 4)
+%Image::ExifTool::XMP::iptcExt = (
+    %xmpTableDefaults,
+    GROUPS => { 1 => 'XMP-iptcExt', 2 => 'Author' },
+    NAMESPACE   => 'Iptc4xmpExt',
+    TABLE_DESC => 'XMP IPTC Extension',
+    NOTES => q{
+        IPTC Extension schema tags.  The actual namespace prefix is "Iptc4xmpExt",
+        but ExifTool shortens this for the "XMP-iptcExt" family 1 group name.
+        (see L<http://www.iptc.org/IPTC4XMP/>)
+    },
+    AddlModelInfo   => { Name => 'AdditionalModelInformation' },
+    ArtworkOrObject => {
+        Struct => {
+            STRUCT_NAME => 'ArtworkOrObjectDetails',
+            NAMESPACE   => 'Iptc4xmpExt',
+            AOCopyrightNotice => { },
+            AOCreator    => { List => 'Seq' },
+            AODateCreated=> { Groups => { 2 => 'Time' }, %dateTimeInfo },
+            AOSource     => { },
+            AOSourceInvNo=> { },
+            AOTitle      => { Writable => 'lang-alt' },
+        },
+        List => 'Bag',
+    },
+    ArtworkOrObjectAOCopyrightNotice=> { Flat => 1, Name => 'ArtworkCopyrightNotice' },
+    ArtworkOrObjectAOCreator        => { Flat => 1, Name => 'ArtworkCreator' },
+    ArtworkOrObjectAODateCreated    => { Flat => 1, Name => 'ArtworkDateCreated' },
+    ArtworkOrObjectAOSource         => { Flat => 1, Name => 'ArtworkSource' },
+    ArtworkOrObjectAOSourceInvNo    => { Flat => 1, Name => 'ArtworkSourceInventoryNo' },
+    ArtworkOrObjectAOTitle          => { Flat => 1, Name => 'ArtworkTitle' },
+    OrganisationInImageCode => { List => 'Bag' },
+    CVterm => {
+        Name => 'ControlledVocabularyTerm',
+        List => 'Bag',
+    },
+    LocationShown => {
+        Struct => \%sLocationDetails,
+        Groups => { 2 => 'Location' },
+        List => 'Bag',
+    },
+    ModelAge                => { List => 'Bag', Writable => 'integer' },
+    OrganisationInImageName => { List => 'Bag' },
+    PersonInImage           => { List => 'Bag' },
+    DigImageGUID            => { Name => 'DigitalImageGUID' },
+    DigitalSourcefileType   => {
+        Name => 'DigitalSourceFileType',
+        Notes => 'now deprecated -- replaced by DigitalSourceType',
+    },
+    DigitalSourceType       => { Name => 'DigitalSourceType' },
+    Event                   => { Writable => 'lang-alt' },
+    RegistryId => {
+        Struct => {
+            STRUCT_NAME => 'RegistryEntryDetails',
+            NAMESPACE   => 'Iptc4xmpExt',
+            RegItemId    => { },
+            RegOrgId     => { },
+        },
+        List => 'Bag',
+    },
+    RegistryIdRegItemId         => { Flat => 1, Name => 'RegistryItemID' },
+    RegistryIdRegOrgId          => { Flat => 1, Name => 'RegistryOrganisationID' },
+    IptcLastEdited          => { Groups => { 2 => 'Time' }, %dateTimeInfo },
+    LocationCreated => {
+        Struct => \%sLocationDetails,
+        Groups => { 2 => 'Location' },
+        List => 'Bag',
+    },
+    MaxAvailHeight  => { Writable => 'integer' },
+    MaxAvailWidth   => { Writable => 'integer' },
+);
+
+# Adobe Lightroom schema properties (lr) (ref PH)
+%Image::ExifTool::XMP::Lightroom = (
+    %xmpTableDefaults,
+    GROUPS => { 1 => 'XMP-lr', 2 => 'Image' },
+    NAMESPACE   => 'lr',
+    TABLE_DESC => 'XMP Adobe Lightroom',
+    NOTES => 'Adobe Lightroom "lr" schema tags.',
+    privateRTKInfo => { },
+    hierarchicalSubject => { List => 'Bag' },
+);
+
+# Adobe Album schema properties (album) (ref PH)
+%Image::ExifTool::XMP::Album = (
+    %xmpTableDefaults,
+    GROUPS => { 1 => 'XMP-album', 2 => 'Image' },
+    NAMESPACE   => 'album',
+    TABLE_DESC => 'XMP Adobe Album',
+    NOTES => 'Adobe Album schema tags.',
+    Notes => { },
+);
+
+# table to add tags in other namespaces
+%Image::ExifTool::XMP::other = (
+    GROUPS => { 2 => 'Unknown' },
+    LANG_INFO => \&GetLangInfo,
+);
+
+# Composite XMP tags
+%Image::ExifTool::XMP::Composite = (
+    # get latitude/logitude reference from XMP lat/long tags
+    # (used to set EXIF GPS position from XMP tags)
+    GPSLatitudeRef => {
+        Require => 'XMP:GPSLatitude',
+        ValueConv => q{
+            IsFloat($val[0]) and return $val[0] < 0 ? "S" : "N";
+            $val[0] =~ /.*([NS])/;
+            return $1;
+        },
+        PrintConv => {
+            N => 'North',
+            S => 'South',
+        },
+    },
+    GPSLongitudeRef => {
+        Require => 'XMP:GPSLongitude',
+        ValueConv => q{
+            IsFloat($val[0]) and return $val[0] < 0 ? "W" : "E";
+            $val[0] =~ /.*([EW])/;
+            return $1;
+        },
+        PrintConv => {
+            E => 'East',
+            W => 'West',
+        },
+    },
+);
+
+# add our composite tags
+Image::ExifTool::AddCompositeTags('Image::ExifTool::XMP');
+
+#------------------------------------------------------------------------------
+# AutoLoad our writer routines when necessary
+#
+sub AUTOLOAD
+{
+    return Image::ExifTool::DoAutoLoad($AUTOLOAD, @_);
+}
+
+#------------------------------------------------------------------------------
+# Escape necessary XML characters in UTF-8 string
+# Inputs: 0) string to be escaped
+# Returns: escaped string
+my %charName = ('"'=>'quot', '&'=>'amp', "'"=>'#39', '<'=>'lt', '>'=>'gt');
+sub EscapeXML($)
+{
+    my $str = shift;
+    $str =~ s/([&><'"])/&$charName{$1};/sg; # escape necessary XML characters
+    return $str;
+}
+
+#------------------------------------------------------------------------------
+# Unescape XML character references (entities and numerical)
+# Inputs: 0) string to be unescaped
+#         1) optional hash reference to convert entity names to numbers
+# Returns: unescaped string
+my %charNum = ('quot'=>34, 'amp'=>38, 'apos'=>39, 'lt'=>60, 'gt'=>62);
+sub UnescapeXML($;$)
+{
+    my ($str, $conv) = @_;
+    $conv = \%charNum unless $conv;
+    $str =~ s/&(#?\w+);/UnescapeChar($1,$conv)/sge;
+    return $str;
+}
+
+#------------------------------------------------------------------------------
+# Escape string for XML, ensuring valid XML and UTF-8
+# Inputs: 0) string
+# Returns: escaped string
+sub FullEscapeXML($)
+{
+    my $str = shift;
+    $str =~ s/([&><'"])/&$charName{$1};/sg; # escape necessary XML characters
+    $str =~ s/\\/&#92;/sg;                  # escape backslashes too
+    # then use C-escape sequences for invalid characters
+    if ($str =~ /[\0-\x1f]/ or IsUTF8(\$str) < 0) {
+        $str =~ s/([\0-\x1f\x80-\xff])/sprintf("\\x%.2x",ord $1)/sge;
+    }
+    return $str;
+}
+
+#------------------------------------------------------------------------------
+# Unescape XML/C escaped string
+# Inputs: 0) string
+# Returns: unescaped string
+sub FullUnescapeXML($)
+{
+    my $str = shift;
+    # unescape C escape sequences first
+    $str =~ s/\\x([\da-f]{2})/chr(hex($1))/sge;
+    my $conv = \%charNum;
+    $str =~ s/&(#?\w+);/UnescapeChar($1,$conv)/sge;
+    return $str;
+}
+
+#------------------------------------------------------------------------------
+# Convert XML character reference to UTF-8
+# Inputs: 0) XML character reference stripped of the '&' and ';' (ie. 'quot', '#34', '#x22')
+#         1) hash reference for looking up character numbers by name
+# Returns: UTF-8 equivalent (or original character on conversion error)
+sub UnescapeChar($$)
+{
+    my ($ch, $conv) = @_;
+    my $val = $$conv{$ch};
+    unless (defined $val) {
+        if ($ch =~ /^#x([0-9a-fA-F]+)$/) {
+            $val = hex($1);
+        } elsif ($ch =~ /^#(\d+)$/) {
+            $val = $1;
+        } else {
+            return "&$ch;"; # should issue a warning here? [no]
+        }
+    }
+    return chr($val) if $val < 0x80;   # simple ASCII
+    return pack('C0U', $val) if $] >= 5.006001;
+    return Image::ExifTool::PackUTF8($val);
+}
+
+#------------------------------------------------------------------------------
+# Does a string contain valid UTF-8 characters?
+# Inputs: 0) string reference
+# Returns: 0=regular ASCII, -1=invalid UTF-8, 1=valid UTF-8 with maximum 16-bit
+#          wide characters, 2=valid UTF-8 requiring 32-bit wide characters
+# Notes: Changes current string position
+sub IsUTF8($)
+{
+    my $strPt = shift;
+    pos($$strPt) = 0; # start at beginning of string
+    return 0 unless $$strPt =~ /([\x80-\xff])/g;
+    my $rtnVal = 1;
+    for (;;) {
+        my $ch = ord($1);
+        # minimum lead byte for 2-byte sequence is 0xc2 (overlong sequences
+        # not allowed), 0xf8-0xfd are restricted by RFC 3629 (no 5 or 6 byte
+        # sequences), and 0xfe and 0xff are not valid in UTF-8 strings
+        return -1 if $ch < 0xc2 or $ch >= 0xf8;
+        # determine number of bytes remaining in sequence
+        my $n;
+        if ($ch < 0xe0) {
+            $n = 1;
+        } elsif ($ch < 0xf0) {
+            $n = 2;
+        } else {
+            $n = 3;
+            # character code is greater than 0xffff if more than 2 extra bytes
+            # were required in the UTF-8 character
+            $rtnVal = 2;
+        }
+        return -1 unless $$strPt =~ /\G[\x80-\xbf]{$n}/g;
+        last unless $$strPt =~ /([\x80-\xff])/g;
+    }
+    return $rtnVal;
+}
+
+#------------------------------------------------------------------------------
+# Fix malformed UTF8 (by replacing bad bytes with '?')
+# Inputs: 0) string reference
+# Returns: true if string was fixed, and updates string
+sub FixUTF8($)
+{
+    my $strPt = shift;
+    my $fixed;
+    pos($$strPt) = 0; # start at beginning of string
+    for (;;) {
+        last unless $$strPt =~ /([\x80-\xff])/g;
+        my $ch = ord($1);
+        my $pos = pos($$strPt);
+        # (see comments in IsUTF8() above)
+        if ($ch >= 0xc2 and $ch < 0xf8) {
+            my $n = $ch < 0xe0 ? 1 : ($ch < 0xf0 ? 2 : 3);
+            next if $$strPt =~ /\G[\x80-\xbf]{$n}/g;
+        }
+        # replace bad character with '?'
+        substr($$strPt, $pos-1, 1) = '?';
+        pos($$strPt) = $fixed = $pos;
+    }
+    return $fixed;
+}
+
+#------------------------------------------------------------------------------
+# Utility routine to decode a base64 string
+# Inputs: 0) base64 string
+# Returns: reference to decoded data
+sub DecodeBase64($)
+{
+    local($^W) = 0; # unpack('u',...) gives bogus warning in 5.00[123]
+    my $str = shift;
+
+    # truncate at first unrecognized character (base 64 data
+    # may only contain A-Z, a-z, 0-9, +, /, =, or white space)
+    $str =~ s/[^A-Za-z0-9+\/= \t\n\r\f].*//s;
+    # translate to uucoded and remove padding and white space
+    $str =~ tr/A-Za-z0-9+\/= \t\n\r\f/ -_/d;
+
+    # convert the data to binary in chunks
+    my $chunkSize = 60;
+    my $uuLen = pack('c', 32 + $chunkSize * 3 / 4); # calculate length byte
+    my $dat = '';
+    my ($i, $substr);
+    # loop through the whole chunks
+    my $len = length($str) - $chunkSize;
+    for ($i=0; $i<=$len; $i+=$chunkSize) {
+        $substr = substr($str, $i, $chunkSize);     # get a chunk of the data
+        $dat .= unpack('u', $uuLen . $substr);      # decode it
+    }
+    $len += $chunkSize;
+    # handle last partial chunk if necessary
+    if ($i < $len) {
+        $uuLen = pack('c', 32 + ($len-$i) * 3 / 4); # recalculate length
+        $substr = substr($str, $i, $len-$i);        # get the last partial chunk
+        $dat .= unpack('u', $uuLen . $substr);      # decode it
+    }
+    return \$dat;
+}
+
+#------------------------------------------------------------------------------
+# Generate a name for this XMP tag
+# Inputs: 0) tag property name list ref, 1) array ref for receiving structure property list
+#         2) array for receiving namespace list
+# Returns: tagID and outtermost interesting namespace (or '' if no namespace)
+sub GetXMPTagID($;$$)
+{
+    my ($props, $structProps, $nsList) = @_;
+    my ($tag, $prop, $namespace);
+    foreach $prop (@$props) {
+        # split name into namespace and property name
+        # (Note: namespace can be '' for property qualifiers)
+        my ($ns, $nm) = ($prop =~ /(.*?):(.*)/) ? ($1, $2) : ('', $prop);
+        if ($ignoreNamespace{$ns}) {
+            # special case: don't ignore rdf numbered items
+            unless ($prop =~ /^rdf:(_\d+)$/) {
+                # save list index if necessary for structures
+                if ($structProps and @$structProps and $prop =~ /^rdf:li (\d+)$/) {
+                    push @{$$structProps[-1]}, $1;
+                }
+                next;
+            }
+            $tag .= $1 if defined $tag;
+        } else {
+            $nm =~ s/ .*//; # remove nodeID if it exists
+            # all uppercase is ugly, so convert it
+            if ($nm !~ /[a-z]/) {
+                my $xlatNS = $$xlatNamespace{$ns} || $ns;
+                my $info = $Image::ExifTool::XMP::Main{$xlatNS};
+                my $table;
+                if (ref $info eq 'HASH' and $info->{SubDirectory}) {
+                    $table = GetTagTable($info->{SubDirectory}{TagTable});
+                }
+                unless ($table and $table->{$nm}) {
+                    $nm = lc($nm);
+                    $nm =~ s/_([a-z])/\u$1/g;
+                }
+            }
+            if (defined $tag) {
+                $tag .= ucfirst($nm);       # add to tag name
+            } else {
+                $tag = $nm;
+            }
+            # save structure information if necessary
+            if ($structProps) {
+                push @$structProps, [ $nm ];
+                push @$nsList, $ns if $nsList;
+            }
+        }
+        # save namespace of first property to contribute to tag name
+        $namespace = $ns unless $namespace;
+    }
+    if (wantarray) {
+        return ($tag, $namespace || '');
+    } else {
+        return $tag;
+    }
+}
+
+#------------------------------------------------------------------------------
+# Register namespace for specified user-defined table
+# Inputs: 0) tag or structure table ref
+# Returns: namespace prefix
+sub RegisterNamespace($)
+{
+    my $table = shift;
+    return $$table{NAMESPACE} unless ref $$table{NAMESPACE};
+    my $nsRef = $$table{NAMESPACE};
+    # recognize as either a list or hash
+    my $ns;
+    if (ref $nsRef eq 'ARRAY') {
+        $ns = $$nsRef[0];
+        $nsURI{$ns} = $$nsRef[1];
+    } else { # must be a hash
+        my @ns = sort keys %$nsRef; # allow multiple namespace definitions
+        while (@ns) {
+            $ns = pop @ns;
+            if ($nsURI{$ns} and $nsURI{$ns} ne $$nsRef{$ns}) {
+                warn "User-defined namespace prefix '$ns' conflicts with existing namespace\n";
+            }
+            $nsURI{$ns} = $$nsRef{$ns};
+        }
+    }
+    return $$table{NAMESPACE} = $ns;
+}
+
+#------------------------------------------------------------------------------
+# Generate flattened tags and add to table
+# Inputs: 0) tag table ref, 1) tag ID for Struct tag in table
+# Returns: number of tags added (not counting those just initialized)
+# Notes: Must have verified that $$tagTablePtr{$tagID}{Struct} exists before calling this routine
+# - makes sure that the tagInfo Struct is a HASH reference
+sub AddFlattenedTags($$)
+{
+    local $_;
+    my ($tagTablePtr, $tagID) = @_;
+    my $tagInfo = $$tagTablePtr{$tagID};
+
+    $$tagInfo{Flattened} and return 0;  # only generate flattened tags once
+    $$tagInfo{Flattened} = 1;
+
+    my $strTable = $$tagInfo{Struct};
+    unless (ref $strTable) { # (allow a structure name for backward compatibility only)
+        my $strName = $strTable;
+        $strTable = $Image::ExifTool::UserDefined::xmpStruct{$strTable} or return 0;
+        $$strTable{STRUCT_NAME} or $$strTable{STRUCT_NAME} = $strName;
+        $$tagInfo{Struct} = $strTable;  # replace old-style name with HASH ref
+        delete $$tagInfo{SubDirectory}; # deprecated use of SubDirectory in Struct tags
+    }
+    # do not add flattened tags to variable-namespace structures
+    return 0 if exists $$strTable{NAMESPACE} and not defined $$strTable{NAMESPACE};
+
+    # get family 2 group name for this structure tag
+    my ($tagG2, $field);
+    $tagG2 = $$tagInfo{Groups}{2} if $$tagInfo{Groups};
+    $tagG2 or $tagG2 = $$tagTablePtr{GROUPS}{2};
+
+    my $count = 0;
+    foreach $field (keys %$strTable) {
+        next if $specialStruct{$field};
+        my $fieldInfo = $$strTable{$field};
+        next if $$fieldInfo{LangCode};  # don't flatten lang-alt tags
+        # build a tag ID for the corresponding flattened tag
+        my $fieldName = ucfirst($field);
+        my $flatID = $tagID . $fieldName;
+        my $flatInfo = $$tagTablePtr{$flatID};
+        if ($flatInfo) {
+            ref $flatInfo eq 'HASH' or warn("$flatInfo is not a HASH!\n"), next; # (to be safe)
+            # pre-defined flattened tags should have Flat flag set
+            if (not defined $$flatInfo{Flat} and $Image::ExifTool::debug) {
+                warn "Missing Flat flag for $$flatInfo{Name}\n";
+            }
+            $$flatInfo{Flat} = 0;
+            # copy all missing entries from field information
+            foreach (keys %$fieldInfo) {
+                # must not copy PropertyPath (but can't delete it afterwards
+                # because the flat tag may already have this set)
+                next if $_ eq 'PropertyPath';
+                $$flatInfo{$_} = $$fieldInfo{$_} unless defined $$flatInfo{$_};
+            }
+            # NOTE: Do NOT delete Groups because we need them if GotGroups was done
+            # --> just override group 2 later according to field group
+            # re-generate List flag unless it is set to 0
+            delete $$flatInfo{List} if $$flatInfo{List};
+        } else {
+            # generate new flattened tag information based on structure field
+            $flatInfo = { %$fieldInfo, Name => $$tagInfo{Name} . $fieldName, Flat => 0 };
+            # add new flattened tag to table
+            Image::ExifTool::AddTagToTable($tagTablePtr, $flatID, $flatInfo);
+            ++$count;
+        }
+        # propagate List flag (unless set to 0 in pre-defined flattened tag)
+        unless (defined $$flatInfo{List}) {
+            $$flatInfo{List} = $$fieldInfo{List} || 1 if $$fieldInfo{List} or $$tagInfo{List};
+        }
+        # set group 2 name from the first existing family 2 group in the:
+        # 1) structure field Groups, 2) structure table GROUPS, 3) structure tag Groups
+        if ($$fieldInfo{Groups} and $$fieldInfo{Groups}{2}) {
+            $$flatInfo{Groups}{2} = $$fieldInfo{Groups}{2};
+        } elsif ($$strTable{GROUPS} and $$strTable{GROUPS}{2}) {
+            $$flatInfo{Groups}{2} = $$strTable{GROUPS}{2};
+        } else {
+            $$flatInfo{Groups}{2} = $tagG2;
+        }
+        # save reference to top-level structure
+        $$flatInfo{RootTagInfo} = $$tagInfo{RootTagInfo} || $tagInfo;
+        # recursively generate flattened tags for sub-structures
+        next unless $$flatInfo{Struct};
+        length($flatID) > 150 and warn("Possible deep recursion for tag $flatID\n"), last;
+        # reset flattened tag just in case we flattened hierarchy in the wrong order
+        # because we must start from the outtermost structure to get the List flags right
+        # (this should only happen when building tag tables)
+        delete $$flatInfo{Flattened};
+        $count += AddFlattenedTags($tagTablePtr, $flatID);
+    }
+    return $count;
+}
+
+#------------------------------------------------------------------------------
+# Get localized version of tagInfo hash
+# Inputs: 0) tagInfo hash ref, 1) language code (ie. "x-default")
+# Returns: new tagInfo hash ref, or undef if invalid
+sub GetLangInfo($$)
+{
+    my ($tagInfo, $langCode) = @_;
+    # only allow alternate language tags in lang-alt lists
+    return undef unless $$tagInfo{Writable} and $$tagInfo{Writable} eq 'lang-alt';
+    $langCode =~ tr/_/-/;   # RFC 3066 specifies '-' as a separator
+    my $langInfo = Image::ExifTool::GetLangInfo($tagInfo, $langCode);
+    # save reference to source tagInfo hash in case we need to set the PropertyPath later
+    $$langInfo{SrcTagInfo} = $tagInfo;
+    return $langInfo;
+}
+
+#------------------------------------------------------------------------------
+# Get standard case for language code
+# Inputs: 0) Language code
+# Returns: Language code in standard case
+sub StandardLangCase($)
+{
+    my $lang = shift;
+    # make 2nd subtag uppercase only if it is 2 letters
+    return lc($1) . uc($2) . lc($3) if $lang =~ /^([a-z]{2,3}|[xi])(-[a-z]{2})\b(.*)/i;
+    return lc($lang);
+}
+
+#------------------------------------------------------------------------------
+# Scan for XMP in a file
+# Inputs: 0) ExifTool object ref, 1) RAF reference
+# Returns: 1 if xmp was found, 0 otherwise
+# Notes: Currently only recognizes UTF8-encoded XMP
+sub ScanForXMP($$)
+{
+    my ($exifTool, $raf) = @_;
+    my ($buff, $xmp);
+    my $lastBuff = '';
+
+    $exifTool->VPrint(0,"Scanning for XMP\n");
+    for (;;) {
+        defined $buff or $raf->Read($buff, 65536) or return 0;
+        unless (defined $xmp) {
+            $lastBuff .= $buff;
+            unless ($lastBuff =~ /(<\?xpacket begin=)/g) {
+                # must keep last 15 bytes to match 16-byte "xpacket begin" string
+                $lastBuff = length($buff) <= 15 ? $buff : substr($buff, -15);
+                undef $buff;
+                next;
+            }
+            $xmp = $1;
+            $buff = substr($lastBuff, pos($lastBuff));
+        }
+        my $pos = length($xmp) - 18;    # (18 = length("<?xpacket end...") - 1)
+        $xmp .= $buff;                  # add new data to our XMP
+        pos($xmp) = $pos if $pos > 0;   # set start for "xpacket end" scan
+        if ($xmp =~ /<\?xpacket end=['"][wr]['"]\?>/g) {
+            $buff = substr($xmp, pos($xmp));    # save data after end of XMP
+            $xmp = substr($xmp, 0, pos($xmp));  # isolate XMP
+            # check XMP for validity (not valid if it contains null bytes)
+            $pos = rindex($xmp, "\0") + 1 or last;
+            $lastBuff = substr($xmp, $pos);     # re-parse beginning after last null byte
+            undef $xmp;
+        } else {
+            undef $buff;
+        }
+    }
+    unless ($exifTool->{VALUE}{FileType}) {
+        $exifTool->{FILE_TYPE} = $exifTool->{FILE_EXT};
+        $exifTool->SetFileType('<unknown file containing XMP>');
+    }
+    my %dirInfo = (
+        DataPt => \$xmp,
+        DirLen => length $xmp,
+        DataLen => length $xmp,
+    );
+    ProcessXMP($exifTool, \%dirInfo);
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Convert XMP date/time to EXIF format
+# Inputs: 0) XMP date/time string, 1) set if we aren't sure this is a date
+# Returns: EXIF date/time
+sub ConvertXMPDate($;$)
+{
+    my ($val, $unsure) = @_;
+    if ($val =~ /^(\d{4})-(\d{2})-(\d{2})[T ](\d{2}:\d{2})(:\d{2})?\s*(\S*)$/) {
+        my $s = $5 || '';           # seconds may be missing
+        $val = "$1:$2:$3 $4$s$6";   # convert back to EXIF time format
+    } elsif (not $unsure and $val =~ /^(\d{4})(-\d{2}){0,2}/) {
+        $val =~ tr/-/:/;
+    }
+    return $val;
+}
+
+#------------------------------------------------------------------------------
+# Convert rational string value
+# Inputs: 0) string (converted to number, 'inf' or 'undef' on return if rational)
+# Returns: true if value was converted
+sub ConvertRational($)
+{
+    my $val = $_[0];
+    $val =~ m{^(-?\d+)/(-?\d+)$} or return undef;
+    if ($2) {
+        $_[0] = $1 / $2; # calculate quotient
+    } elsif ($1) {
+        $_[0] = 'inf';
+    } else {
+        $_[0] = 'undef';
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# We found an XMP property name/value
+# Inputs: 0) ExifTool object ref, 1) Pointer to tag table
+#         2) reference to array of XMP property names (last is current property)
+#         3) property value, 4) attribute hash ref (for 'xml:lang' or 'rdf:datatype')
+# Returns: 1 if valid tag was found
+sub FoundXMP($$$$;$)
+{
+    local $_;
+    my ($exifTool, $tagTablePtr, $props, $val, $attrs) = @_;
+    my ($lang, @structProps);
+    my ($tag, $ns) = GetXMPTagID($props, $exifTool->{OPTIONS}{Struct} ? \@structProps : undef);
+    return 0 unless $tag;   # ignore things that aren't valid tags
+
+    # translate namespace if necessary
+    $ns = $$xlatNamespace{$ns} if $$xlatNamespace{$ns};
+    my $info = $tagTablePtr->{$ns};
+    my ($table, $added, $xns, $tagID);
+    if ($info) {
+        $table = $info->{SubDirectory}{TagTable} or warn "Missing TagTable for $tag!\n";
+    } elsif ($$props[0] eq 'svg:svg') {
+        if (not $ns) {
+            # disambiguate MetadataID by adding back the 'metadata' we ignored
+            $tag = 'metadataId' if $tag eq 'id' and $$props[1] eq 'svg:metadata';
+            # use SVG namespace in SVG files if nothing better to use
+            $table = 'Image::ExifTool::XMP::SVG';
+        } elsif (not grep /^rdf:/, @$props) {
+            # only other SVG information if not inside RDF (call it XMP if in RDF)
+            $table = 'Image::ExifTool::XMP::otherSVG';
+        }
+    }
+
+    # look up this tag in the appropriate table
+    $table or $table = 'Image::ExifTool::XMP::other';
+    $tagTablePtr = GetTagTable($table);
+    if ($$tagTablePtr{NAMESPACE}) {
+        $tagID = $tag;
+    } else {
+        # add XMP namespace prefix to avoid collisions in variable-namespace tables
+        $xns = $xmpNS{$ns} || $ns;
+        $tagID = "$xns:$tag";
+        # add namespace to top-level structure property
+        $structProps[0][0] = "$xns:" . $structProps[0][0] if @structProps;
+    }
+    my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tagID);
+
+    $lang = $$attrs{'xml:lang'} if $attrs;
+
+    # must add a new tag table entry if this tag isn't pre-defined
+    # (or initialize from structure field if this is a pre-defined flattened tag)
+NoLoop:
+    while (not $tagInfo or $$tagInfo{Flat}) {
+        my (@tagList, @nsList);
+        GetXMPTagID($props, \@tagList, \@nsList);
+        my ($ta, $t, $ti, $addedFlat, $i, $j);
+        # build tag ID strings for each level in the property path
+        foreach $ta (@tagList) {
+            # insert tag ID in index 1 of tagList list
+            $t = $$ta[1] = $t ? $t . ucfirst($$ta[0]) : $$ta[0];
+            # generate flattened tags for top-level structure if necessary
+            next if defined $addedFlat;
+            $ti = $$tagTablePtr{$t} or next;
+            next unless ref $ti eq 'HASH' and $$ti{Struct};
+            $addedFlat = AddFlattenedTags($tagTablePtr, $t);
+            if ($tagInfo) {
+                # all done if we just wanted to initialize the flattened tag
+                if ($$tagInfo{Flat}) {
+                    warn "Orphan tagInfo with Flat flag set: $$tagInfo{Name}\n";
+                    delete $$tagInfo{Flat};
+                }
+                last NoLoop;
+            }
+            # all done if we generated the tag we are looking for
+            $tagInfo = $$tagTablePtr{$tagID} and last NoLoop if $addedFlat;
+        }
+        my $name = ucfirst($tag);
+
+        # search for the innermost containing structure
+        # (in case tag is an unknown field in a known structure)
+        # (only necessary if we found a structure above)
+        if (defined $addedFlat) {
+            my $t2 = '';
+            for ($i=$#tagList-1; $i>=0; --$i) {
+                $t = $tagList[$i][1];
+                $t2 = $tagList[$i+1][0] . ucfirst($t2); # build relative tag id
+                $ti = $$tagTablePtr{$t} or next;
+                next unless ref $ti eq 'HASH';
+                my $strTable = $$ti{Struct} or next;
+                $name = $$ti{Name} . ucfirst($t2);
+                # don't continue if structure is known but field is not
+                last if $$strTable{NAMESPACE} or not exists $$strTable{NAMESPACE};
+                # this is a variable-namespace structure, so we must:
+                # 1) get tagInfo from corresponding top-level XMP tag if it exists
+                # 2) add new entry in this tag table, but with namespace prefix on tag ID
+                my $n = $nsList[$i+1];  # namespace of structure field
+                # translate to standard ExifTool namespace
+                $n = $$xlatNamespace{$n} if $$xlatNamespace{$n};
+                my $xn = $xmpNS{$n} || $n;  # standard XMP namespace
+                # no need to continue with variable-namespace logic if
+                # we are in our own namespace (right?)
+                last if $xn eq ($$tagTablePtr{NAMESPACE} || '');
+                $tagID = "$xn:$tag";    # add namespace to avoid collisions
+                # change structure properties to add the standard XMP namespace
+                # prefix for this field (needed for variable-namespace fields)
+                if (@structProps) {
+                    $structProps[$i+1][0] = "$xn:" . $structProps[$i+1][0];
+                }
+                # copy tagInfo entries from the existing top-level XMP tag
+                my $tg = $Image::ExifTool::XMP::Main{$n};
+                last unless ref $tg eq 'HASH' and $$tg{SubDirectory};
+                my $tbl = GetTagTable($$tg{SubDirectory}{TagTable}) or last;
+                my $sti = $exifTool->GetTagInfo($tbl, $t2);
+                if (not $sti or $$sti{Flat}) {
+                    # again, we must initialize flattened tags if necessary
+                    # (but don't bother to recursively apply full logic to
+                    #  allow nest variable-namespace strucures until someone
+                    #  actually wants to do such a silly thing)
+                    my $t3 = '';
+                    for ($j=$i+1; $j<@tagList; ++$j) {
+                        $t3 = $tagList[$j][0] . ucfirst($t3);
+                        my $ti3 = $$tbl{$t3} or next;
+                        next unless ref $ti3 eq 'HASH' and $$ti3{Struct};
+                        last unless AddFlattenedTags($tbl, $t3);
+                        $sti = $$tbl{$t2};
+                        last;
+                    }
+                    last unless $sti;
+                }
+                $tagInfo = {
+                    %$sti,
+                    Name     => $$ti{Name} . $$sti{Name},
+                    WasAdded => 1,
+                };
+                # be careful not to copy elements we shouldn't...
+                delete $$tagInfo{Description}; # Description will be different
+                # can't copy group hash because group 1 will be different and
+                # we need to check this when writing tag to a specific group
+                delete $$tagInfo{Groups};
+                $$tagInfo{Groups}{2} = $$sti{Groups}{2} if $$sti{Groups};
+                last;
+            }
+        }
+        $tagInfo or $tagInfo = { Name => $name, WasAdded => 1 };
+
+        # add tag Namespace entry for tags in variable-namespace tables
+        $$tagInfo{Namespace} = $xns if $xns;
+        if ($curNS{$ns} and $curNS{$ns} =~ m{^http://ns.exiftool.ca/(.*?)/(.*?)/}) {
+            my %grps = ( 0 => $1, 1 => $2 );
+            # apply a little magic to recover original group names
+            # from this exiftool-written RDF/XML file
+            if ($grps{1} =~ /^\d/) {
+                # URI's with only family 0 are internal tags from the source file,
+                # so change the group name to avoid confusion with tags from this file
+                $grps{1} = "XML-$grps{0}";
+                $grps{0} = 'XML';
+            }
+            $$tagInfo{Groups} = \%grps;
+            # flag to avoid setting group 1 later
+            $$tagInfo{StaticGroup1} = 1;
+        }
+        # construct tag information for this unknown tag
+        # -> make this a List or lang-alt tag if necessary
+        if (@$props > 2 and $$props[-1] =~ /^rdf:li \d+$/ and
+            $$props[-2] =~ /^rdf:(Bag|Seq|Alt)$/)
+        {
+            if ($lang and $1 eq 'Alt') {
+                $$tagInfo{Writable} = 'lang-alt';
+            } else {
+                $$tagInfo{List} = $1;
+            }
+        # tried this, but maybe not a good idea for complex structures:
+        #} elsif (grep / /, @$props) {
+        #    $$tagInfo{List} = 1;
+        }
+        Image::ExifTool::AddTagToTable($tagTablePtr, $tagID, $tagInfo);
+        $added = 1;
+        last;
+    }
+    # decode value if necessary (et:encoding was used before exiftool 7.71)
+    if ($attrs) {
+        my $enc = $$attrs{'rdf:datatype'} || $$attrs{'et:encoding'};
+        if ($enc and $enc =~ /base64/) {
+            $val = DecodeBase64($val); # (now a value ref)
+            $val = $$val unless length $$val > 100 or $$val =~ /[\0-\x08\x0b\0x0c\x0e-\x1f]/;
+        }
+    }
+    if (defined $lang and lc($lang) ne 'x-default') {
+        $lang = StandardLangCase($lang);
+        my $langInfo = GetLangInfo($tagInfo, $lang);
+        $tagInfo = $langInfo if $langInfo;
+    }
+    # un-escape XML character entities (handling CDATA)
+    pos($val) = 0;
+    if ($val =~ /<!\[CDATA\[(.*?)\]\]>/sg) {
+        my $p = pos $val;
+        # unescape everything up to the start of the CDATA section
+        # (the length of "<[[CDATA[]]>" is 12 characters)
+        my $v = UnescapeXML(substr($val, 0, $p - length($1) - 12)) . $1;
+        while ($val =~ /<!\[CDATA\[(.*?)\]\]>/sg) {
+            my $p1 = pos $val;
+            $v .= UnescapeXML(substr($val, $p, $p1 - length($1) - 12)) . $1;
+            $p = $p1;
+        }
+        $val = $v . UnescapeXML(substr($val, $p));
+    } else {
+        $val = UnescapeXML($val);
+    }
+    # decode from UTF8
+    $val = $exifTool->Decode($val, 'UTF8');
+    # convert rational and date values to a more sensible format
+    my $fmt = $$tagInfo{Writable};
+    my $new = $$tagInfo{WasAdded};
+    if (($fmt or $new)) {
+        unless (($new or $fmt eq 'rational') and ConvertRational($val)) {
+            $val = ConvertXMPDate($val, $new) if $new or $fmt eq 'date';
+        }
+    }
+    # store the value for this tag
+    my $key = $exifTool->FoundTag($tagInfo, $val);
+    # save structure/list information if necessary
+    if (@structProps and (@structProps > 1 or defined $structProps[0][1])) {
+        $exifTool->{TAG_EXTRA}{$key}{Struct} = \@structProps;
+        $exifTool->{IsStruct} = 1;
+    }
+    if ($ns and not $$tagInfo{StaticGroup1}) {
+        # set group1 dynamically according to the namespace
+        $exifTool->SetGroup($key, "$tagTablePtr->{GROUPS}{0}-$ns");
+    }
+    if ($exifTool->{OPTIONS}{Verbose}) {
+        if ($added) {
+            my $g1 = $exifTool->GetGroup($key, 1);
+            $exifTool->VPrint(0, $exifTool->{INDENT}, "[adding $g1:$tag]\n");
+        }
+        my $tagID = join('/',@$props);
+        $exifTool->VerboseInfo($tagID, $tagInfo, Value=>$val);
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Recursively parse nested XMP data element
+# Inputs: 0) ExifTool object reference
+#         1) Pointer to tag table
+#         2) reference to XMP data
+#         3) start of xmp element
+#         4) reference to array of enclosing XMP property names (undef if none)
+#         5) reference to blank node information hash
+# Returns: Number of contained XMP elements
+sub ParseXMPElement($$$;$$$)
+{
+    my ($exifTool, $tagTablePtr, $dataPt, $start, $propListPt, $blankInfo) = @_;
+    my ($count, $nItems) = (0, 0);
+    my $isWriting = $exifTool->{XMP_CAPTURE};
+    my $isSVG = $$exifTool{XMP_IS_SVG};
+
+    # get our parse procs
+    my ($attrProc, $foundProc);
+    if ($$exifTool{XMPParseOpts}) {
+        $attrProc = $$exifTool{XMPParseOpts}{AttrProc};
+        $foundProc = $$exifTool{XMPParseOpts}{FoundProc} || \&FoundXMP;
+    } else {
+        $foundProc = \&FoundXMP;
+    }
+    $start or $start = 0;
+    $propListPt or $propListPt = [ ];
+
+    my $processBlankInfo;
+    # create empty blank node information hash if necessary
+    $blankInfo or $blankInfo = $processBlankInfo = { Prop => { } };
+    # keep track of current nodeID at this nesting level
+    my $oldNodeID = $$blankInfo{NodeID};
+
+    pos($$dataPt) = $start;
+    Element: for (;;) {
+        # reset nodeID before processing each element
+        my $nodeID = $$blankInfo{NodeID} = $oldNodeID;
+        # get next element
+        last unless $$dataPt =~ m/<([-\w:.\x80-\xff]+)(.*?)>/sg;
+        my ($prop, $attrs) = ($1, $2);
+        my $val = '';
+        # only look for closing token if this is not an empty element
+        # (empty elements end with '/', ie. <a:b/>)
+        if ($attrs !~ s/\/$//) {
+            my $nesting = 1;
+            for (;;) {
+# this match fails with perl 5.6.2 (perl bug!), but it works without
+# the '(.*?)', so do it the hard way instead...
+#                $$dataPt =~ m/(.*?)<\/$prop>/sg or last Element;
+#                my $val2 = $1;
+                my $pos = pos($$dataPt);
+                unless ($$dataPt =~ m/<\/$prop>/sg) {
+                    $exifTool->Warn("XMP format error (no closing tag for $prop)");
+                    last Element;
+                }
+                my $len = pos($$dataPt) - $pos - length($prop) - 3;
+                my $val2 = substr($$dataPt, $pos, $len);
+                # increment nesting level for each contained similar opening token
+                ++$nesting while $val2 =~ m/<$prop\b.*?(\/?)>/sg and $1 ne '/';
+                $val .= $val2;
+                --$nesting or last;
+                $val .= "</$prop>";
+            }
+        }
+        my $parseResource;
+        if ($prop eq 'rdf:li') {
+            # add index to list items so we can keep them in order
+            # (this also enables us to keep structure elements grouped properly
+            # for lists of structures, like JobRef)
+            # Note: the list index is prefixed by the number of digits so sorting
+            # alphabetically gives the correct order while still allowing a flexible
+            # number of digits -- this scheme allows up to 9 digits in the index,
+            # with index numbers ranging from 0 to 999999999.  The sequence is:
+            # 10,11,12-19,210,211-299,3100,3101-3999,41000...9999999999.
+            $prop .= ' ' . length($nItems) . $nItems;
+            ++$nItems;
+        } elsif ($prop eq 'rdf:Description') {
+            # trim comments and whitespace from rdf:Description properties only
+            $val =~ s/<!--.*?-->//g;
+            $val =~ s/^\s*(.*)\s*$/$1/;
+            # remove unnecessary rdf:Description elements since parseType='Resource'
+            # is more efficient (also necessary to make property path consistent)
+            $parseResource = 1 if grep /^rdf:Description$/, @$propListPt;
+        } elsif ($prop eq 'xmp:xmpmeta') {
+            # patch MicrosoftPhoto unconformity
+            $prop = 'x:xmpmeta';
+        }
+
+        # extract property attributes
+        my (%attrs, @attrs);
+        while ($attrs =~ m/(\S+?)\s*=\s*(['"])(.*?)\2/sg) {
+            push @attrs, $1;    # preserve order
+            $attrs{$1} = $3;
+        }
+
+        # hook for special parsing of attributes
+        $attrProc and &$attrProc(\@attrs, \%attrs, \$prop, \$val);
+            
+        # add nodeID to property path (with leading ' #') if it exists
+        if (defined $attrs{'rdf:nodeID'}) {
+            $nodeID = $$blankInfo{NodeID} = $attrs{'rdf:nodeID'};
+            delete $attrs{'rdf:nodeID'};
+            $prop .= ' #' . $nodeID;
+            undef $parseResource;   # can't ignore if this is a node
+        }
+
+        # push this property name onto our hierarchy list
+        push @$propListPt, $prop unless $parseResource;
+
+        if ($isSVG) {
+            # ignore everything but top level SVG tags and metadata unless Unknown set
+            unless ($exifTool->{OPTIONS}{Unknown} > 1 or $exifTool->{OPTIONS}{Verbose}) {
+                if (@$propListPt > 1 and $$propListPt[1] !~ /\b(metadata|desc|title)$/) {
+                    pop @$propListPt;
+                    next;
+                }
+            }
+            if ($prop eq 'svg' or $prop eq 'metadata') {
+                # add svg namespace prefix if missing to ignore these entries in the tag name
+                $$propListPt[-1] = "svg:$prop";
+            }
+        }
+
+        # handle properties inside element attributes (RDF shorthand format):
+        # (attributes take the form a:b='c' or a:b="c")
+        my ($shortName, $shorthand, $ignored);
+        foreach $shortName (@attrs) {
+            my $propName = $shortName;
+            my ($ns, $name);
+            if ($propName =~ /(.*?):(.*)/) {
+                $ns = $1;   # specified namespace
+                $name = $2;
+            } elsif ($prop =~ /(\S*?):/) {
+                $ns = $1;   # assume same namespace as parent
+                $name = $propName;
+                $propName = "$ns:$name";    # generate full property name
+            } else {
+                # a property qualifier is the only property name that may not
+                # have a namespace, and a qualifier shouldn't have attributes,
+                # but what the heck, let's allow this anyway
+                $ns = '';
+                $name = $propName;
+            }
+            # keep track of the namespace prefixes used
+            if ($ns eq 'xmlns') {
+                unless ($attrs{$shortName}) {
+                    $exifTool->WarnOnce("Duplicate namespace '$shortName'");
+                    next;
+                }
+                $curNS{$name} = $attrs{$shortName};
+                my $stdNS = $uri2ns{$attrs{$shortName}};
+                # translate namespace if non-standard (except 'x' and 'iX')
+                if ($stdNS and $name ne $stdNS and $stdNS ne 'x' and $stdNS ne 'iX') {
+                    # make a copy of the standard translations so we can modify it
+                    $xlatNamespace = { %stdXlatNS } if $xlatNamespace eq \%stdXlatNS;
+                    # translate this namespace prefix to the standard version
+                    $$xlatNamespace{$name} = $stdXlatNS{$stdNS} || $stdNS;
+                }
+            }
+            if ($isWriting) {
+                # keep track of our namespaces when writing
+                if ($ns eq 'xmlns') {
+                    my $stdNS = $uri2ns{$attrs{$shortName}};
+                    unless ($stdNS and ($stdNS eq 'x' or $stdNS eq 'iX')) {
+                        my $nsUsed = $exifTool->{XMP_NS};
+                        $$nsUsed{$name} = $attrs{$shortName} unless defined $$nsUsed{$name};
+                    }
+                    delete $attrs{$shortName};  # (handled by namespace logic)
+                    next;
+                } elsif ($recognizedAttrs{$propName}) {
+                    # save UUID to use same ID when writing
+                    if ($propName eq 'rdf:about') {
+                        if (not $exifTool->{XMP_ABOUT}) {
+                            $exifTool->{XMP_ABOUT} = $attrs{$shortName};
+                        } elsif ($exifTool->{XMP_ABOUT} ne $attrs{$shortName}) {
+                            $exifTool->Error("Different 'rdf:about' attributes not handled", 1);
+                        }
+                    }
+                    next;
+                }
+            }
+            my $shortVal = $attrs{$shortName};
+            if ($ignoreNamespace{$ns}) {
+                $ignored = $propName;
+                # handle special attributes (extract as tags only once if not empty)
+                if (ref $recognizedAttrs{$propName} and $shortVal) {
+                    my ($tbl, $id, $name) = @{$recognizedAttrs{$propName}};
+                    my $val = UnescapeXML($shortVal);
+                    unless (defined $$exifTool{VALUE}{$name} and $$exifTool{VALUE}{$name} eq $val) {
+                        $exifTool->HandleTag(GetTagTable($tbl), $id, $val);
+                    }
+                }
+                next;
+            }
+            delete $attrs{$shortName};  # don't re-use this attribute
+            push @$propListPt, $propName;
+            # save this shorthand XMP property
+            if (defined $nodeID) {
+                SaveBlankInfo($blankInfo, $propListPt, $shortVal);
+            } elsif ($isWriting) {
+                CaptureXMP($exifTool, $propListPt, $shortVal);
+            } else {
+                &$foundProc($exifTool, $tagTablePtr, $propListPt, $shortVal);
+            }
+            pop @$propListPt;
+            $shorthand = 1;
+        }
+        if ($isWriting) {
+            if (ParseXMPElement($exifTool, $tagTablePtr, \$val, 0, $propListPt, $blankInfo)) {
+                # undefine value since we found more properties within this one
+                undef $val;
+                # set an error on any ignored attributes here, because they will be lost
+                $exifTool->{XMP_ERROR} = "Can't handle XMP attribute '$ignored'" if $ignored;
+            }
+            if (defined $val and (length $val or not $shorthand)) {
+                if (defined $nodeID) {
+                    SaveBlankInfo($blankInfo, $propListPt, $val, \%attrs);
+                } else {
+                    CaptureXMP($exifTool, $propListPt, $val, \%attrs);
+                }
+            }
+        } else {
+            # if element value is empty, take value from 'resource' attribute
+            # (preferentially) or 'about' attribute (if no 'resource')
+            my $wasEmpty;
+            if ($val eq '' and ($attrs =~ /\bresource=(['"])(.*?)\1/ or
+                                $attrs =~ /\babout=(['"])(.*?)\1/))
+            {
+                $val = $2;
+                $wasEmpty = 1;
+            }
+            # look for additional elements contained within this one
+            if (!ParseXMPElement($exifTool, $tagTablePtr, \$val, 0, $propListPt, $blankInfo)) {
+                # there are no contained elements, so this must be a simple property value
+                # (unless we already extracted shorthand values from this element)
+                if (length $val or not $shorthand) {
+                    my $lastProp = $$propListPt[-1];
+                    if (defined $nodeID) {
+                        SaveBlankInfo($blankInfo, $propListPt, $val);
+                    } elsif ($lastProp eq 'rdf:type' and $wasEmpty) {
+                        # do not extract empty structure types (for now)
+                    } elsif ($lastProp =~ /^et:(desc|prt|val)$/ and ($count or $1 eq 'desc')) {
+                        # ignore et:desc, and et:val if preceeded by et:prt
+                        --$count;
+                    } else {
+                        &$foundProc($exifTool, $tagTablePtr, $propListPt, $val, \%attrs);
+                    }
+                }
+            }
+        }
+        pop @$propListPt unless $parseResource;
+        ++$count;
+    }
+#
+# process resources referenced by blank nodeID's
+#
+    if ($processBlankInfo and %{$$blankInfo{Prop}}) {
+        ProcessBlankInfo($exifTool, $tagTablePtr, $blankInfo, $isWriting);
+        %$blankInfo = ();   # free some memory
+    }
+    return $count;  # return the number of elements found at this level
+}
+
+#------------------------------------------------------------------------------
+# Process XMP data
+# Inputs: 0) ExifTool object reference, 1) DirInfo reference, 2) Pointer to tag table
+# Returns: 1 on success
+# Notes: The following flavours of XMP files are currently recognized:
+# - standard XMP with xpacket, x:xmpmeta and rdf:RDF elements
+# - XMP that is missing the xpacket and/or x:xmpmeta elements
+# - mutant Microsoft XMP with xmp:xmpmeta element
+# - XML files beginning with "<xml"
+# - SVG files that begin with "<svg" or "<!DOCTYPE svg"
+# - XMP and XML files beginning with a UTF-8 byte order mark
+# - UTF-8, UTF-16 and UTF-32 encoded XMP
+# - erroneously double-UTF8 encoded XMP
+# - otherwise valid files with leading XML comment
+sub ProcessXMP($$;$)
+{
+    my ($exifTool, $dirInfo, $tagTablePtr) = @_;
+    my $dataPt = $$dirInfo{DataPt};
+    my ($dirStart, $dirLen, $dataLen);
+    my ($buff, $fmt, $hasXMP, $isXML, $isRDF, $isSVG);
+    my $rtnVal = 0;
+    my $bom = 0;
+    undef %curNS;
+
+    # ignore non-standard XMP while in strict MWG compatibility mode
+    if ($Image::ExifTool::MWG::strict and not $$exifTool{XMP_CAPTURE} and
+        $$exifTool{FILE_TYPE} =~ /^(JPEG|TIFF|PSD)$/)
+    {
+        my $path = $exifTool->MetadataPath();
+        unless ($path =~ /^(JPEG-APP1-XMP|TIFF-IFD0-XMP|PSD-XMP)$/) {
+            $exifTool->Warn("Ignored non-standard XMP at $path");
+            return 1;
+        }
+    }
+    if ($dataPt) {
+        $dirStart = $$dirInfo{DirStart} || 0;
+        $dirLen = $$dirInfo{DirLen} || (length($$dataPt) - $dirStart);
+        $dataLen = $$dirInfo{DataLen} || length($$dataPt);
+    } else {
+        my $type;
+        # read information from XMP file
+        my $raf = $$dirInfo{RAF} or return 0;
+        $raf->Read($buff, 256) or return 0;
+        my ($buf2, $buf3, $double);
+        ($buf2 = $buff) =~ tr/\0//d;    # cheap conversion to UTF-8
+        # remove leading comments if they exist (ie. ImageIngester)
+        while ($buf2 =~ /^\s*<!--/) {
+            # remove the comment if it is complete
+            if ($buf2 =~ s/^\s*<!--.*?-->\s+//s) {
+                # continue with parsing if we have more than 128 bytes remaining
+                next if length $buf2 > 128;
+            } else {
+                # don't read more than 10k when looking for the end of comment
+                return 0 if length($buf2) > 10000;
+            }
+            $raf->Read($buf3, 256) or last; # read more data if available
+            $buff .= $buf3;
+            $buf3 =~ tr/\0//d;
+            $buf2 .= $buf3;
+        }
+        # check to see if this is XMP format
+        # (CS2 writes .XMP files without the "xpacket begin")
+        if ($buf2 =~ /^\s*(<\?xpacket begin=|<x(mp)?:x[ma]pmeta)/) {
+            $hasXMP = 1;
+        } else {
+            # also recognize XML files and .XMP files with BOM and without x:xmpmeta
+            if ($buf2 =~ /^(\xfe\xff)(<\?xml|<rdf:RDF|<x(mp)?:x[ma]pmeta)/g) {
+                $fmt = 'n';     # UTF-16 or 32 MM with BOM
+            } elsif ($buf2 =~ /^(\xff\xfe)(<\?xml|<rdf:RDF|<x(mp)?:x[ma]pmeta)/g) {
+                $fmt = 'v';     # UTF-16 or 32 II with BOM
+            } elsif ($buf2 =~ /^(\xef\xbb\xbf)?(<\?xml|<rdf:RDF|<x(mp)?:x[ma]pmeta)/g) {
+                $fmt = 0;       # UTF-8 with BOM or unknown encoding without BOM
+            } elsif ($buf2 =~ /^(\xfe\xff|\xff\xfe|\xef\xbb\xbf)(<\?xpacket begin=)/g) {
+                $double = $1;   # double-encoded UTF
+            } else {
+                return 0;       # not recognized XMP or XML
+            }
+            $bom = 1 if $1;
+            if ($2 eq '<?xml') {
+                if ($buf2 =~ /<x(mp)?:x[ma]pmeta/) {
+                    $hasXMP = 1;
+                } else {
+                    # identify SVG images by DOCTYPE if available
+                    if ($buf2 =~ /<!DOCTYPE\s+(\w+)/) {
+                        if ($1 eq 'svg') {
+                            $isSVG = 1;
+                        } elsif ($1 eq 'plist') {
+                            $type = 'PLIST';
+                        } else {
+                            return 0;
+                        }
+                    } elsif ($buf2 =~ /<svg[\s>]/) {
+                        $isSVG = 1;
+                    } elsif ($buf2 =~ /<rdf:RDF/) {
+                        $isRDF = 1;
+                    }
+                    if ($isSVG and $exifTool->{XMP_CAPTURE}) {
+                        $exifTool->Error("ExifTool does not yet support writing of SVG images");
+                        return 0;
+                    }
+                }
+                $isXML = 1;
+            } elsif ($2 eq '<rdf:RDF') {
+                $isRDF = 1;     # recognize XMP without x:xmpmeta element
+            }
+            if ($buff =~ /^\0\0/) {
+                $fmt = 'N';     # UTF-32 MM with or without BOM
+            } elsif ($buff =~ /^..\0\0/) {
+                $fmt = 'V';     # UTF-32 II with or without BOM
+            } elsif (not $fmt) {
+                if ($buff =~ /^\0/) {
+                    $fmt = 'n'; # UTF-16 MM without BOM
+                } elsif ($buff =~ /^.\0/) {
+                    $fmt = 'v'; # UTF-16 II without BOM
+                }
+            }
+        }
+        $raf->Seek(0, 2) or return 0;
+        my $size = $raf->Tell() or return 0;
+        $raf->Seek(0, 0) or return 0;
+        $raf->Read($buff, $size) == $size or return 0;
+        # decode the first layer of double-encoded UTF text
+        if ($double) {
+            $buff = substr($buff, length $double);  # remove leading BOM
+            Image::ExifTool::SetWarning(undef);     # clear old warning
+            local $SIG{'__WARN__'} = \&Image::ExifTool::SetWarning;
+            my $tmp;
+            # assume that character data has been re-encoded in UTF, so re-pack
+            # as characters and look for warnings indicating a false assumption
+            if ($double eq "\xef\xbb\xbf") {
+                require Image::ExifTool::Charset;
+                my $uni = Image::ExifTool::Charset::Decompose(undef,$buff,'UTF8');
+                $tmp = pack('C*', @$uni);
+            } else {
+                my $fmt = ($double eq "\xfe\xff") ? 'n' : 'v';
+                $tmp = pack('C*', unpack("$fmt*",$buff));
+            }
+            if (Image::ExifTool::GetWarning()) {
+                $exifTool->Warn('Superfluous BOM at start of XMP');
+            } else {
+                $exifTool->Warn('XMP is double UTF-encoded');
+                $buff = $tmp;   # use the decoded XMP
+            }
+            $size = length $buff;
+        }
+        $dataPt = \$buff;
+        $dirStart = 0;
+        $dirLen = $dataLen = $size;
+        unless ($type) {
+            if ($isSVG) {
+                $type = 'SVG';
+            } elsif ($isXML and not $hasXMP and not $isRDF) {
+                $type = 'XML';
+            }
+        }
+        $exifTool->SetFileType($type);
+    }
+
+    # take substring if necessary
+    if ($dataLen != $dirStart + $dirLen) {
+        $buff = substr($$dataPt, $dirStart, $dirLen);
+        $dataPt = \$buff;
+        $dirStart = 0;
+    }
+    # extract XMP as a block if specified
+    if (($exifTool->{REQ_TAG_LOOKUP}{xmp} or $exifTool->{OPTIONS}{Binary}) and not $isSVG) {
+        $exifTool->FoundTag('XMP', substr($$dataPt, $dirStart, $dirLen));
+    }
+    if ($exifTool->Options('Verbose') and not $exifTool->{XMP_CAPTURE}) {
+        $exifTool->VerboseDir($isSVG ? 'SVG' : 'XMP', 0, $dirLen);
+    }
+#
+# convert UTF-16 or UTF-32 encoded XMP to UTF-8 if necessary
+#
+    my $begin = '<?xpacket begin=';
+    pos($$dataPt) = $dirStart;
+    delete $$exifTool{XMP_IS_XML};
+    delete $$exifTool{XMP_IS_SVG};
+    if ($isXML or $isRDF) {
+        $$exifTool{XMP_IS_XML} = $isXML;
+        $$exifTool{XMP_IS_SVG} = $isSVG;
+        $$exifTool{XMP_NO_XPACKET} = 1 + $bom;
+    } elsif ($$dataPt =~ /\G\Q$begin\E/gc) {
+        delete $$exifTool{XMP_NO_XPACKET};
+    } elsif ($$dataPt =~ /<x(mp)?:x[ma]pmeta/gc) {
+        $$exifTool{XMP_NO_XPACKET} = 1 + $bom;
+    } else {
+        delete $$exifTool{XMP_NO_XPACKET};
+        # check for UTF-16 encoding (insert one \0 between characters)
+        $begin = join "\0", split //, $begin;
+        # must reset pos because it was killed by previous unsuccessful //g match
+        pos($$dataPt) = $dirStart;
+        if ($$dataPt =~ /\G(\0)?\Q$begin\E\0./g) {
+            # validate byte ordering by checking for U+FEFF character
+            if ($1) {
+                # should be big-endian since we had a leading \0
+                $fmt = 'n' if $$dataPt =~ /\G\xfe\xff/g;
+            } else {
+                $fmt = 'v' if $$dataPt =~ /\G\0\xff\xfe/g;
+            }
+        } else {
+            # check for UTF-32 encoding (with three \0's between characters)
+            $begin =~ s/\0/\0\0\0/g;
+            pos($$dataPt) = $dirStart;
+            if ($$dataPt !~ /\G(\0\0\0)?\Q$begin\E\0\0\0./g) {
+                $fmt = 0;   # set format to zero as indication we didn't find encoded XMP
+            } elsif ($1) {
+                # should be big-endian
+                $fmt = 'N' if $$dataPt =~ /\G\0\0\xfe\xff/g;
+            } else {
+                $fmt = 'V' if $$dataPt =~ /\G\0\0\0\xff\xfe\0\0/g;
+            }
+        }
+        defined $fmt or $exifTool->Warn('XMP character encoding error');
+    }
+    if ($fmt) {
+        # trim if necessary to avoid converting non-UTF data
+        if ($dirStart or $dirLen != length($$dataPt) - $dirStart) {
+            $buff = substr($$dataPt, $dirStart, $dirLen);
+            $dataPt = \$buff;
+        }
+        # convert into UTF-8
+        if ($] >= 5.006001) {
+            $buff = pack('C0U*', unpack("$fmt*",$$dataPt));
+        } else {
+            $buff = Image::ExifTool::PackUTF8(unpack("$fmt*",$$dataPt));
+        }
+        $dataPt = \$buff;
+        $dirStart = 0;
+        $dirLen = length $$dataPt;
+    }
+    # initialize namespace translation
+    $xlatNamespace = \%stdXlatNS;
+
+    # avoid scanning for XMP later in case ScanForXMP is set
+    $$exifTool{FoundXMP} = 1;
+
+    # set XMP parsing options
+    $$exifTool{XMPParseOpts} = $$dirInfo{XMPParseOpts};
+
+    # need to preserve list indices to be able to handle multi-dimensional lists
+    $$exifTool{NO_LIST} = 1 if $exifTool->Options('Struct');
+
+    # parse the XMP
+    $tagTablePtr or $tagTablePtr = GetTagTable('Image::ExifTool::XMP::Main');
+    $rtnVal = 1 if ParseXMPElement($exifTool, $tagTablePtr, $dataPt, $dirStart);
+
+    # return DataPt if successful in case we want it for writing
+    $$dirInfo{DataPt} = $dataPt if $rtnVal and $$dirInfo{RAF};
+
+    # restore structures if necessary
+    if ($$exifTool{IsStruct}) {
+        require 'Image/ExifTool/XMPStruct.pl';
+        RestoreStruct($exifTool);
+        delete $$exifTool{IsStruct};
+    }
+    # reset NO_LIST flag (must do this _after_ RestoreStruct() above)
+    delete $$exifTool{NO_LIST};
+
+    undef %curNS;
+    return $rtnVal;
+}
+
+
+1;  #end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::XMP - Read XMP meta information
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+XMP stands for Extensible Metadata Platform.  It is a format based on XML
+that Adobe developed for embedding metadata information in image files.
+This module contains the definitions required by Image::ExifTool to read XMP
+information.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.adobe.com/devnet/xmp/>
+
+=item L<http://www.w3.org/TR/rdf-syntax-grammar/>
+
+=item L<http://www.iptc.org/IPTC4XMP/>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/XMP Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/XMP2.pl
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/XMP2.pl	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/XMP2.pl	(revision 24799)
@@ -0,0 +1,1217 @@
+#------------------------------------------------------------------------------
+# File:         XMP2.pl
+#
+# Description:  Additional XMP schema definitions
+#
+# Revisions:    10/12/2008 - P. Harvey Created
+#
+# References:   1) PLUS - http://ns.useplus.org/
+#               2) PRISM - http://www.prismstandard.org/
+#               3) http://www.portfoliofaq.com/pfaq/v7mappings.htm
+#               5) http://creativecommons.org/technology/xmp
+#                  --> changed to http://wiki.creativecommons.org/Companion_File_metadata_specification (2007/12/21)
+#               6) http://www.optimasc.com/products/fileid/xmp-extensions.pdf
+#               9) http://www.w3.org/TR/SVG11/
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::XMP;
+
+use strict;
+use Image::ExifTool qw(:Utils);
+use Image::ExifTool::XMP;
+
+# structure definitions
+my %sCuePointParam = (
+    STRUCT_NAME => 'CuePointParam',
+    NAMESPACE   => 'xmpDM',
+    key         => { },
+    value       => { },
+);
+my %sMarker = (
+    STRUCT_NAME => 'Marker',
+    NAMESPACE   => 'xmpDM',
+    comment     => { },
+    duration    => { },
+    location    => { },
+    name        => { },
+    startTime   => { },
+    target      => { },
+    type        => { },
+    # added Oct 2008
+    cuePointParams => { Struct => \%sCuePointParam, List => 'Seq' },
+    cuePointType=> { },
+    probability => { Writable => 'real' },
+    speaker     => { },
+);
+my %sTime = (
+    STRUCT_NAME => 'Time',
+    NAMESPACE   => 'xmpDM',
+    scale       => { Writable => 'rational' },
+    value       => { Writable => 'integer' },
+);
+my %sTimecode = (
+    STRUCT_NAME => 'Timecode',
+    NAMESPACE   => 'xmpDM',
+    timeFormat  => {
+        PrintConv => {
+            '24Timecode' => '24 fps',
+            '25Timecode' => '25 fps',
+            '2997DropTimecode' => '29.97 fps (drop)',
+            '2997NonDropTimecode' => '29.97 fps (non-drop)',
+            '30Timecode' => '30 fps',
+            '50Timecode' => '50 fps',
+            '5994DropTimecode' => '59.94 fps (drop)',
+            '5994NonDropTimecode' => '59.94 fps (non-drop)',
+            '60Timecode' => '60 fps',
+            '23976Timecode' => '23.976 fps',
+        },
+    },
+    timeValue   => { },
+    value       => { Writable => 'integer' },
+);
+
+# XMP Dynamic Media schema properties (xmpDM)
+%Image::ExifTool::XMP::xmpDM = (
+    %xmpTableDefaults,
+    GROUPS => { 1 => 'XMP-xmpDM', 2 => 'Image' },
+    NAMESPACE => 'xmpDM',
+    NOTES => 'XMP Dynamic Media schema tags.',
+    absPeakAudioFilePath=> { },
+    album               => { },
+    altTapeName         => { },
+    altTimecode         => { Struct => \%sTimecode },
+    artist              => { Avoid => 1, Groups => { 2 => 'Author' } },
+    audioModDate        => { Groups => { 2 => 'Time' }, %dateTimeInfo },
+    audioSampleRate     => { Writable => 'integer' },
+    audioSampleType => {
+        PrintConv => {
+            '8Int' => '8-bit integer',
+            '16Int' => '16-bit integer',
+            '24Int' => '24-bit integer',
+            '32Int' => '32-bit integer',
+            '32Float' => '32-bit float',
+            'Compressed' => 'Compressed',
+            'Packed' => 'Packed',
+            'Other' => 'Other',
+        },
+    },
+    audioChannelType => {
+        PrintConv => {
+            'Mono' => 'Mono',
+            'Stereo' => 'Stereo',
+            '5.1' => '5.1',
+            '7.1' => '7.1',
+            '16 Channel' => '16 Channel',
+            'Other' => 'Other',
+        },
+    },
+    audioCompressor     => { },
+    beatSpliceParams => {
+        Struct => {
+            STRUCT_NAME => 'BeatSpliceStretch',
+            NAMESPACE   => 'xmpDM',
+            riseInDecibel       => { Writable => 'real' },
+            riseInTimeDuration  => { Struct => \%sTime },
+            useFileBeatsMarker  => { Writable => 'boolean' },
+        },
+    },
+    cameraAngle         => { },
+    cameraLabel         => { },
+    cameraModel         => { },
+    cameraMove          => { },
+    client              => { },
+    comment             => { Name => 'DMComment' },
+    composer            => { Groups => { 2 => 'Author' } },
+    contributedMedia => {
+        Struct => {
+            STRUCT_NAME => 'Media',
+            NAMESPACE   => 'xmpDM',
+            duration    => { Struct => \%sTime },
+            managed     => { Writable => 'boolean' },
+            path        => { },
+            startTime   => { Struct => \%sTime },
+            track       => { },
+            webStatement=> { },
+        },
+        List => 'Bag',
+    },
+    copyright       => { Avoid => 1, Groups => { 2 => 'Author' } }, # (deprecated)
+    director        => { },
+    directorPhotography => { },
+    duration        => { Struct => \%sTime },
+    engineer        => { },
+    fileDataRate    => { Writable => 'rational' },
+    genre           => { },
+    good            => { Writable => 'boolean' },
+    instrument      => { },
+    introTime       => { Struct => \%sTime },
+    key => {
+        PrintConvColumns => 3,
+        PrintConv => {
+            'C'  => 'C',  'C#' => 'C#', 'D'  => 'D',  'D#' => 'D#',
+            'E'  => 'E',  'F'  => 'F',  'F#' => 'F#', 'G'  => 'G',
+            'G#' => 'G#', 'A'  => 'A',  'A#' => 'A#', 'B'  => 'B',
+        },
+    },
+    logComment      => { },
+    loop            => { Writable => 'boolean' },
+    numberOfBeats   => { Writable => 'real' },
+    markers         => { Struct => \%sMarker, List => 'Seq' },
+    metadataModDate => { Groups => { 2 => 'Time' }, %dateTimeInfo },
+    outCue          => { Struct => \%sTime },
+    projectName     => { },
+    projectRef => {
+        Struct => {
+            STRUCT_NAME => 'ProjectLink',
+            NAMESPACE   => 'xmpDM',
+            path        => { },
+            type        => {
+                PrintConv => {
+                    movie => 'Movie',
+                    still => 'Still Image',
+                    audio => 'Audio',
+                    custom => 'Custom',
+                },
+            },
+        },
+    },
+    pullDown => {
+        PrintConvColumns => 2,
+        PrintConv => {
+            'WSSWW' => 'WSSWW',  'SSWWW' => 'SSWWW',
+            'SWWWS' => 'SWWWS',  'WWWSS' => 'WWWSS',
+            'WWSSW' => 'WWSSW',  'WWWSW' => 'WWWSW',
+            'WWSWW' => 'WWSWW',  'WSWWW' => 'WSWWW',
+            'SWWWW' => 'SWWWW',  'WWWWS' => 'WWWWS',
+        },
+    },
+    relativePeakAudioFilePath => { },
+    relativeTimestamp   => { Struct => \%sTime },
+    releaseDate         => { Groups => { 2 => 'Time' }, %dateTimeInfo },
+    resampleParams => {
+        Struct => {
+            STRUCT_NAME => 'ResampleStretch',
+            NAMESPACE   => 'xmpDM',
+            quality     => { PrintConv => { Low => 'Low', Medium => 'Medium', High => 'High' } },
+        },
+    },
+    scaleType => {
+        PrintConv => {
+            Major => 'Major',
+            Minor => 'Minor',
+            Both => 'Both',
+            Neither => 'Neither',
+        },
+    },
+    scene           => { Avoid => 1 },
+    shotDate        => { Groups => { 2 => 'Time' }, %dateTimeInfo },
+    shotDay         => { },
+    shotLocation    => { },
+    shotName        => { },
+    shotNumber      => { },
+    shotSize        => { },
+    speakerPlacement=> { },
+    startTimecode   => { Struct => \%sTimecode },
+    stretchMode     => {
+        PrintConv => {
+            'Fixed length' => 'Fixed length',
+            'Time-Scale' => 'Time-Scale',
+            'Resample' => 'Resample',
+            'Beat Splice' => 'Beat Splice',
+            'Hybrid' => 'Hybrid',
+        },
+    },
+    takeNumber      => { Writable => 'integer' },
+    tapeName        => { },
+    tempo           => { Writable => 'real' },
+    timeScaleParams => {
+        Struct => {
+            STRUCT_NAME => 'TimeScaleStretch',
+            NAMESPACE   => 'xmpDM',
+            frameOverlappingPercentage => { Writable => 'real' },
+            frameSize   => { Writable => 'real' },
+            quality     => { PrintConv => { Low => 'Low', Medium => 'Medium', High => 'High' } },
+        },
+    },
+    timeSignature   => {
+        PrintConvColumns => 3,
+        PrintConv => {
+            '2/4' => '2/4',  '3/4' => '3/4',  '4/4' => '4/4',
+            '5/4' => '5/4',  '7/4' => '7/4',  '6/8' => '6/8',
+            '9/8' => '9/8',  '12/8'=> '12/8', 'other' => 'other',
+        },
+    },
+    trackNumber     => { Writable => 'integer' },
+    Tracks => {
+        Struct => {
+            STRUCT_NAME => 'Track',
+            NAMESPACE   => 'xmpDM',
+            frameRate => { },
+            markers   => { Struct => \%sMarker, List => 'Seq' },
+            trackName => { },
+            trackType => { },
+        },
+        List => 'Bag',
+    },
+    videoAlphaMode => {
+        PrintConv => {
+            'straight' => 'Straight',
+            'pre-multiplied', => 'Pre-multiplied',
+            'none' => 'None',
+        },
+    },
+    videoAlphaPremultipleColor   => { Struct => \%sColorant },
+    videoAlphaUnityIsTransparent => { Writable => 'boolean' },
+    videoColorSpace     => {
+        PrintConv => {
+            'sRGB' => 'sRGB',
+            'CCIR-601' => 'CCIR-601',
+            'CCIR-709' => 'CCIR-709',
+        },
+    },
+    videoCompressor     => { },
+    videoFieldOrder => {
+        PrintConv => {
+            Upper => 'Upper',
+            Lower => 'Lower',
+            Progressive => 'Progressive',
+        },
+    },
+    videoFrameRate      => { },
+    videoFrameSize      => { Struct => \%sDimensions },
+    videoModDate        => { Groups => { 2 => 'Time' }, %dateTimeInfo },
+    videoPixelAspectRatio => { Writable => 'rational' },
+    videoPixelDepth => {
+        PrintConv => {
+            '8Int' => '8-bit integer',
+            '16Int' => '16-bit integer',
+            '24Int' => '24-bit integer',
+            '32Int' => '32-bit integer',
+            '32Float' => '32-bit float',
+            'Other' => 'Other',
+        },
+    },
+);
+
+#------------------------------------------------------------------------------
+# PLUS vocabulary conversions
+my %plusVocab = (
+    ValueConv => '$val =~ s{http://ns.useplus.org/ldf/vocab/}{}; $val',
+    ValueConvInv => '"http://ns.useplus.org/ldf/vocab/$val"',
+);
+
+# PLUS License Data Format 1.2.0 structures
+# (this seems crazy to me -- why did they define different ID/Name structures
+#  for each field rather than just re-using the same structure?)
+my %plusLicensee = (
+    STRUCT_NAME => 'Licensee',
+    NAMESPACE => 'plus',
+    TYPE => 'plus:LicenseeDetail',
+    LicenseeID  => { },
+    LicenseeName=> { },
+);
+my %plusEndUser = (
+    STRUCT_NAME => 'EndUser',
+    NAMESPACE   => 'plus',
+    TYPE => 'plus:EndUserDetail',
+    EndUserID   => { },
+    EndUserName => { },
+);
+my %plusLicensor = (
+    STRUCT_NAME => 'Licensor',
+    NAMESPACE   => 'plus',
+    TYPE => 'plus:LicensorDetail',
+    LicensorID              => { },
+    LicensorName            => { },
+    LicensorStreetAddress   => { },
+    LicensorExtendedAddress => { },
+    LicensorCity            => { },
+    LicensorRegion          => { },
+    LicensorPostalCode      => { },
+    LicensorCountry         => { },
+    LicensorTelephoneType1  => {
+        %plusVocab,
+        PrintConv => {
+            'work'  => 'Work',
+            'cell'  => 'Cell',
+            'fax'   => 'FAX',
+            'home'  => 'Home',
+            'pager' => 'Pager',
+        },
+    },
+    LicensorTelephone1      => { },
+    LicensorTelephoneType2  => {
+        %plusVocab,
+        PrintConv => {
+            'work'  => 'Work',
+            'cell'  => 'Cell',
+            'fax'   => 'FAX',
+            'home'  => 'Home',
+            'pager' => 'Pager',
+        },
+    },
+    LicensorTelephone2  => { },
+    LicensorEmail       => { },
+    LicensorURL         => { },
+);
+my %plusCopyrightOwner = (
+    STRUCT_NAME => 'CopyrightOwner',
+    NAMESPACE   => 'plus',
+    TYPE        => 'plus:CopyrightOwnerDetail',
+    CopyrightOwnerID    => { },
+    CopyrightOwnerName  => { },
+);
+my %plusImageCreator = (
+    STRUCT_NAME => 'ImageCreator',
+    NAMESPACE   => 'plus',
+    TYPE        => 'plus:ImageCreatorDetail',
+    ImageCreatorID      => { },
+    ImageCreatorName    => { },
+);
+my %plusImageSupplier = (
+    STRUCT_NAME => 'ImageSupplier',
+    NAMESPACE   => 'plus',
+    TYPE        => 'plus:ImageSupplierDetail',
+    ImageSupplierID     => { },
+    ImageSupplierName   => { },
+);
+
+# PLUS License Data Format 1.2.0 (plus) (ref 1)
+%Image::ExifTool::XMP::plus = (
+    %xmpTableDefaults,
+    GROUPS => { 0 => 'XMP', 1 => 'XMP-plus', 2 => 'Author' },
+    NAMESPACE => 'plus',
+    NOTES => q{
+        PLUS License Data Format 1.2.0 schema tags.  Note that all
+        controlled-vocabulary tags in this table (ie. tags with a fixed set of
+        values) have raw values which begin with "http://ns.useplus.org/ldf/vocab/",
+        but to reduce clutter this prefix has been removed from the values shown
+        below.  (see L<http://ns.useplus.org/>)
+    },
+    Version  => { Name => 'PLUSVersion' },
+    Licensee => {
+        Struct => \%plusLicensee,
+        List => 'Seq',
+    },
+    LicenseeLicenseeID   => { Flat => 1, Name => 'LicenseeID' },
+    LicenseeLicenseeName => { Flat => 1, Name => 'LicenseeName' },
+    EndUser => {
+        Struct => \%plusEndUser,
+        List => 'Seq',
+    },
+    EndUserEndUserID    => { Flat => 1, Name => 'EndUserID' },
+    EndUserEndUserName  => { Flat => 1, Name => 'EndUserName' },
+    Licensor => {
+        Struct => \%plusLicensor,
+        List => 'Seq',
+    },
+    LicensorLicensorID              => { Flat => 1, Name => 'LicensorID' },
+    LicensorLicensorName            => { Flat => 1, Name => 'LicensorName' },
+    LicensorLicensorStreetAddress   => { Flat => 1, Name => 'LicensorStreetAddress' },
+    LicensorLicensorExtendedAddress => { Flat => 1, Name => 'LicensorExtendedAddress' },
+    LicensorLicensorCity            => { Flat => 1, Name => 'LicensorCity' },
+    LicensorLicensorRegion          => { Flat => 1, Name => 'LicensorRegion' },
+    LicensorLicensorPostalCode      => { Flat => 1, Name => 'LicensorPostalCode' },
+    LicensorLicensorCountry         => { Flat => 1, Name => 'LicensorCountry' },
+    LicensorLicensorTelephoneType1  => { Flat => 1, Name => 'LicensorTelephoneType1' },
+    LicensorLicensorTelephone1      => { Flat => 1, Name => 'LicensorTelephone1' },
+    LicensorLicensorTelephoneType2  => { Flat => 1, Name => 'LicensorTelephoneType2' },
+    LicensorLicensorTelephone2      => { Flat => 1, Name => 'LicensorTelephone2' },
+    LicensorLicensorEmail           => { Flat => 1, Name => 'LicensorEmail' },
+    LicensorLicensorURL             => { Flat => 1, Name => 'LicensorURL' },
+    LicensorNotes               => { Writable => 'lang-alt' },
+    MediaSummaryCode            => { },
+    LicenseStartDate            => { %dateTimeInfo, Groups => { 2 => 'Time'} },
+    LicenseEndDate              => { %dateTimeInfo, Groups => { 2 => 'Time'} },
+    MediaConstraints            => { Writable => 'lang-alt' },
+    RegionConstraints           => { Writable => 'lang-alt' },
+    ProductOrServiceConstraints => { Writable => 'lang-alt' },
+    ImageFileConstraints => {
+        List => 'Bag',
+        %plusVocab,
+        PrintConv => {
+            'IF-MFN' => 'Maintain File Name',
+            'IF-MID' => 'Maintain ID in File Name',
+            'IF-MMD' => 'Maintain Metadata',
+            'IF-MFT' => 'Maintain File Type',
+        },
+    },
+    ImageAlterationConstraints => {
+        List => 'Bag',
+        %plusVocab,
+        PrintConv => {
+            'AL-CRP' => 'No Cropping',
+            'AL-FLP' => 'No Flipping',
+            'AL-RET' => 'No Retouching',
+            'AL-CLR' => 'No Colorization',
+            'AL-DCL' => 'No De-Colorization',
+            'AL-MRG' => 'No Merging',
+        },
+    },
+    ImageDuplicationConstraints => {
+        %plusVocab,
+        PrintConv => {
+            'DP-NDC' => 'No Duplication Constraints',
+            'DP-LIC' => 'Duplication Only as Necessary Under License',
+            'DP-NOD' => 'No Duplication',
+        },
+    },
+    ModelReleaseStatus => {
+        %plusVocab,
+        PrintConv => {
+            'MR-NON' => 'None',
+            'MR-NAP' => 'Not Applicable',
+            'MR-UMR' => 'Unlimited Model Releases',
+            'MR-LMR' => 'Limited or Incomplete Model Releases',
+        },
+    },
+    ModelReleaseID      => { List => 'Bag' },
+    MinorModelAgeDisclosure => {
+        %plusVocab,
+        PrintConv => {
+            'AG-UNK' => 'Age Unknown',
+            'AG-A25' => 'Age 25 or Over',
+            'AG-A24' => 'Age 24',
+            'AG-A23' => 'Age 23',
+            'AG-A22' => 'Age 22',
+            'AG-A21' => 'Age 21',
+            'AG-A20' => 'Age 20',
+            'AG-A19' => 'Age 19',
+            'AG-A18' => 'Age 18',
+            'AG-A17' => 'Age 17',
+            'AG-A16' => 'Age 16',
+            'AG-A15' => 'Age 15',
+            'AG-U14' => 'Age 14 or Under',
+        },
+    },
+    PropertyReleaseStatus => {
+        %plusVocab,
+        PrintConv => {
+            'PR-NON' => 'None',
+            'PR-NAP' => 'Not Applicable',
+            'PR-UPR' => 'Unlimited Property Releases',
+            'PR-LPR' => 'Limited or Incomplete Property Releases',
+        },
+    },
+    PropertyReleaseID  => { List => 'Bag' },
+    OtherConstraints   => { Writable => 'lang-alt' },
+    CreditLineRequired => {
+        %plusVocab,
+        PrintConv => {
+            'CR-NRQ' => 'Not Required',
+            'CR-COI' => 'Credit on Image',
+            'CR-CAI' => 'Credit Adjacent To Image',
+            'CR-CCA' => 'Credit in Credits Area',
+        },
+    },
+    AdultContentWarning => {
+        %plusVocab,
+        PrintConv => {
+            'CW-NRQ' => 'Not Required',
+            'CW-AWR' => 'Adult Content Warning Required',
+            'CW-UNK' => 'Unknown',
+        },
+    },
+    OtherLicenseRequirements    => { Writable => 'lang-alt' },
+    TermsAndConditionsText      => { Writable => 'lang-alt' },
+    TermsAndConditionsURL       => { },
+    OtherConditions             => { Writable => 'lang-alt' },
+    ImageType => {
+        %plusVocab,
+        PrintConv => {
+            'TY-PHO' => 'Photographic Image',
+            'TY-ILL' => 'Illustrated Image',
+            'TY-MCI' => 'Multimedia or Composited Image',
+            'TY-VID' => 'Video',
+            'TY-OTR' => 'Other',
+        },
+    },
+    LicensorImageID     => { },
+    FileNameAsDelivered => { },
+    ImageFileFormatAsDelivered => {
+        %plusVocab,
+        PrintConv => {
+            'FF-JPG' => 'JPEG Interchange Formats (JPG, JIF, JFIF)',
+            'FF-TIF' => 'Tagged Image File Format (TIFF)',
+            'FF-GIF' => 'Graphics Interchange Format (GIF)',
+            'FF-RAW' => 'Proprietary RAW Image Format',
+            'FF-DNG' => 'Digital Negative (DNG)',
+            'FF-EPS' => 'Encapsulated PostScript (EPS)',
+            'FF-BMP' => 'Windows Bitmap (BMP)',
+            'FF-PSD' => 'Photoshop Document (PSD)',
+            'FF-PIC' => 'Macintosh Picture (PICT)',
+            'FF-PNG' => 'Portable Network Graphics (PNG)',
+            'FF-WMP' => 'Windows Media Photo (HD Photo)',
+            'FF-OTR' => 'Other',
+        },
+    },
+    ImageFileSizeAsDelivered => {
+        %plusVocab,
+        PrintConv => {
+            'SZ-U01' => 'Up to 1 MB',
+            'SZ-U10' => 'Up to 10 MB',
+            'SZ-U30' => 'Up to 30 MB',
+            'SZ-U50' => 'Up to 50 MB',
+            'SZ-G50' => 'Greater than 50 MB',
+        },
+    },
+    CopyrightStatus => {
+        %plusVocab,
+        PrintConv => {
+            'CS-PRO' => 'Protected',
+            'CS-PUB' => 'Public Domain',
+            'CS-UNK' => 'Unknown',
+        },
+    },
+    CopyrightRegistrationNumber => { },
+    FirstPublicationDate        => { %dateTimeInfo, Groups => { 2 => 'Time'} },
+    CopyrightOwner              => { Struct => \%plusCopyrightOwner, List => 'Seq' },
+    CopyrightOwnerCopyrightOwnerID   => { Flat => 1, Name => 'CopyrightOwnerID' },
+    CopyrightOwnerCopyrightOwnerName => { Flat => 1, Name => 'CopyrightOwnerName' },
+    CopyrightOwnerImageID            => { },
+    ImageCreator => {
+        Struct => \%plusImageCreator,
+        List => 'Seq',
+    },
+    ImageCreatorImageCreatorID   => { Flat => 1, Name => 'ImageCreatorID' },
+    ImageCreatorImageCreatorName => { Flat => 1, Name => 'ImageCreatorName' },
+    ImageCreatorImageID          => { },
+    ImageSupplier => {
+        Struct => \%plusImageSupplier,
+        List => 'Seq',
+    },
+    ImageSupplierImageSupplierID   => { Flat => 1, Name => 'ImageSupplierID' },
+    ImageSupplierImageSupplierName => { Flat => 1, Name => 'ImageSupplierName' },
+    ImageSupplierImageID    => { },
+    LicenseeImageID         => { },
+    LicenseeImageNotes      => { Writable => 'lang-alt' },
+    OtherImageInfo          => { Writable => 'lang-alt' },
+    LicenseID               => { },
+    LicensorTransactionID   => { List => 'Bag' },
+    LicenseeTransactionID   => { List => 'Bag' },
+    LicenseeProjectReference=> { List => 'Bag' },
+    LicenseTransactionDate  => { %dateTimeInfo, Groups => { 2 => 'Time'} },
+    Reuse => {
+        %plusVocab,
+        PrintConv => {
+            'RE-REU' => 'Repeat Use',
+            'RE-NAP' => 'Not Applicable',
+        },
+    },
+    OtherLicenseDocuments   => { List => 'Bag' },
+    OtherLicenseInfo        => { Writable => 'lang-alt' },
+    # Note: these are Bag's of lang-alt lists -- a nested list tag!
+    Custom1     => { List => 'Bag', Writable => 'lang-alt' },
+    Custom2     => { List => 'Bag', Writable => 'lang-alt' },
+    Custom3     => { List => 'Bag', Writable => 'lang-alt' },
+    Custom4     => { List => 'Bag', Writable => 'lang-alt' },
+    Custom5     => { List => 'Bag', Writable => 'lang-alt' },
+    Custom6     => { List => 'Bag', Writable => 'lang-alt' },
+    Custom7     => { List => 'Bag', Writable => 'lang-alt' },
+    Custom8     => { List => 'Bag', Writable => 'lang-alt' },
+    Custom9     => { List => 'Bag', Writable => 'lang-alt' },
+    Custom10    => { List => 'Bag', Writable => 'lang-alt' },
+);
+
+#------------------------------------------------------------------------------
+# PRISM
+#
+# NOTE: The "Avoid" flag is set for all PRISM tags
+
+# my %obsolete = (
+#     Notes => 'obsolete in 2.0',
+#     ValueConvInv => sub {
+#         my ($val, $self) = @_;
+#         unless ($self->Options('IgnoreMinorErrors')) {
+#             warn "Warning: [minor] Attempt to write obsolete tag\n";
+#             return undef;
+#         }
+#         return $val;
+#     }
+# );
+
+# Publishing Requirements for Industry Standard Metadata 2.1 (prism) (ref 2)
+%Image::ExifTool::XMP::prism = (
+    %xmpTableDefaults,
+    GROUPS => { 0 => 'XMP', 1 => 'XMP-prism', 2 => 'Document' },
+    NAMESPACE => 'prism',
+    NOTES => q{
+        Publishing Requirements for Industry Standard Metadata 2.1 schema tags. (see
+        L<http://www.prismstandard.org/>)
+    },
+    aggregationType => { List => 'Bag' },
+    alternateTitle  => { List => 'Bag' },
+    byteCount       => { Writable => 'integer' },
+    channel         => { List => 'Bag' },
+    complianceProfile=>{ PrintConv => { three => 'Three' } },
+    copyright       => { Groups => { 2 => 'Author' } },
+    corporateEntity => { List => 'Bag' },
+    coverDate       => { %dateTimeInfo, Groups => { 2 => 'Time'} },
+    coverDisplayDate=> { },
+    creationDate    => { %dateTimeInfo, Groups => { 2 => 'Time'} },
+    dateRecieved    => { %dateTimeInfo, Groups => { 2 => 'Time'} },
+    distributor     => { },
+    doi             => { Name => 'DOI', Description => 'Digital Object Identifier' },
+    edition         => { },
+    eIssn           => { },
+    embargoDate     => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} },
+    endingPage      => { },
+    event           => { List => 'Bag' },
+    expirationDate  => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} },
+    genre           => { List => 'Bag' },
+    hasAlternative  => { List => 'Bag' },
+    hasCorrection   => { },
+    hasPreviousVersion => { },
+    hasTranslation  => { List => 'Bag' },
+    industry        => { List => 'Bag' },
+    isCorrectionOf  => { List => 'Bag' },
+    issn            => { Name => 'ISSN' },
+    issueIdentifier => { },
+    issueName       => { },
+    isTranslationOf => { },
+    keyword         => { List => 'Bag' },
+    killDate        => { %dateTimeInfo, Groups => { 2 => 'Time'} },
+    location        => { List => 'Bag' },
+    # metadataContainer => { }, (not valid for PRISM XMP)
+    modificationDate=> { %dateTimeInfo, Groups => { 2 => 'Time'} },
+    number          => { },
+    object          => { List => 'Bag' },
+    organization    => { List => 'Bag' },
+    originPlatform  => {
+        List => 'Bag',
+        PrintConv => {
+            email       => 'E-Mail',
+            mobile      => 'Mobile',
+            broadcast   => 'Broadcast',
+            web         => 'Web',
+           'print'      => 'Print',
+            recordableMedia => 'Recordable Media',
+            other       => 'Other',
+        },
+    },
+    pageRange       => { List => 'Bag' },
+    person          => { },
+    publicationDate => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} },
+    publicationName => { },
+    rightsAgent     => { },
+    section         => { },
+    startingPage    => { },
+    subsection1     => { },
+    subsection2     => { },
+    subsection3     => { },
+    subsection4     => { },
+    teaser          => { List => 'Bag' },
+    ticker          => { List => 'Bag' },
+    timePeriod      => { },
+    url             => { Name => 'URL', List => 'Bag' },
+    versionIdentifier => { },
+    volume          => { },
+    wordCount       => { Writable => 'integer' },
+    # new in PRISM 2.1
+    isbn            => { Name => 'ISBN' },
+# tags that existed in version 1.3
+#    category        => { %obsolete, List => 'Bag' },
+#    hasFormat       => { %obsolete, List => 'Bag' },
+#    hasPart         => { %obsolete, List => 'Bag' },
+#    isFormatOf      => { %obsolete, List => 'Bag' },
+#    isPartOf        => { %obsolete },
+#    isReferencedBy  => { %obsolete, List => 'Bag' },
+#    isRequiredBy    => { %obsolete, List => 'Bag' },
+#    isVersionOf     => { %obsolete },
+#    objectTitle     => { %obsolete, List => 'Bag' },
+#    receptionDate   => { %obsolete },
+#    references      => { %obsolete, List => 'Bag' },
+#    requires        => { %obsolete, List => 'Bag' },
+# tags in older versions
+#    page
+#    contentLength
+#    creationTime
+#    expirationTime
+#    hasVersion
+#    isAlternativeFor
+#    isBasedOn
+#    isBasisFor
+#    modificationTime
+#    publicationTime
+#    receptionTime
+#    releaseTime
+);
+
+# PRISM Rights Language 2.1 schema (prl) (ref 2)
+%Image::ExifTool::XMP::prl = (
+    %xmpTableDefaults,
+    GROUPS => { 0 => 'XMP', 1 => 'XMP-prl', 2 => 'Document' },
+    NAMESPACE => 'prl',
+    NOTES => q{
+        PRISM Rights Language 2.1 schema tags.  (see
+        L<http://www.prismstandard.org/>)
+    },
+    geography       => { List => 'Bag' },
+    industry        => { List => 'Bag' },
+    usage           => { List => 'Bag' },
+);
+
+# PRISM Usage Rights 2.1 schema (prismusagerights) (ref 2)
+%Image::ExifTool::XMP::pur = (
+    %xmpTableDefaults,
+    GROUPS => { 0 => 'XMP', 1 => 'XMP-pur', 2 => 'Document' },
+    NAMESPACE => 'pur',
+    NOTES => q{
+        Prism Usage Rights 2.1 schema tags.  (see L<http://www.prismstandard.org/>)
+    },
+    adultContentWarning => { List => 'Bag' },
+    agreement           => { List => 'Bag' },
+    copyright           => { Writable => 'lang-alt', Groups => { 2 => 'Author' } },
+    creditLine          => { List => 'Bag' },
+    embargoDate         => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} },
+    exclusivityEndDate  => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} },
+    expirationDate      => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} },
+    imageSizeRestriction=> { },
+    optionEndDate       => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} },
+    permissions         => { List => 'Bag' },
+    restrictions        => { List => 'Bag' },
+    reuseProhibited     => { Writable => 'boolean' },
+    rightsAgent         => { },
+    rightsOwner         => { },
+    usageFee            => { List => 'Bag' },
+);
+
+# DICOM schema properties (DICOM) (ref PH, written by CS3)
+%Image::ExifTool::XMP::DICOM = (
+    %xmpTableDefaults,
+    GROUPS => { 1 => 'XMP-DICOM', 2 => 'Image' },
+    NAMESPACE => 'DICOM',
+    NOTES => 'DICOM schema tags.',
+    # change some tag names to correspond with DICOM tags
+    PatientName             => { },
+    PatientID               => { },
+    PatientSex              => { },
+    PatientDOB => {
+        Name => 'PatientBirthDate',
+        Groups => { 2 => 'Time' },
+        %dateTimeInfo,
+    },
+    StudyID                 => { },
+    StudyPhysician          => { },
+    StudyDateTime           => { Groups => { 2 => 'Time' }, %dateTimeInfo },
+    StudyDescription        => { },
+    SeriesNumber            => { },
+    SeriesModality          => { },
+    SeriesDateTime          => { Groups => { 2 => 'Time' }, %dateTimeInfo },
+    SeriesDescription       => { },
+    EquipmentInstitution    => { },
+    EquipmentManufacturer   => { },
+);
+
+# PixelLive schema properties (PixelLive) (ref 3)
+%Image::ExifTool::XMP::PixelLive = (
+    GROUPS => { 1 => 'XMP-PixelLive', 2 => 'Image' },
+    NAMESPACE => 'PixelLive',
+    NOTES => q{
+        PixelLive schema tags.  These tags are not writable becase they are very
+        uncommon and I haven't been able to locate a reference which gives the
+        namespace URI.
+    },
+    AUTHOR    => { Name => 'Author',   Avoid => 1, Groups => { 2 => 'Author' } },
+    COMMENTS  => { Name => 'Comments', Avoid => 1 },
+    COPYRIGHT => { Name => 'Copyright',Avoid => 1, Groups => { 2 => 'Author' } },
+    DATE      => { Name => 'Date',     Avoid => 1, Groups => { 2 => 'Time' } },
+    GENRE     => { Name => 'Genre',    Avoid => 1 },
+    TITLE     => { Name => 'Title',    Avoid => 1 },
+);
+
+# ACDSee schema (acdsee) (ref PH)
+%Image::ExifTool::XMP::acdsee = (
+    %xmpTableDefaults,
+    GROUPS => { 0 => 'XMP', 1 => 'XMP-acdsee', 2 => 'Image' },
+    NAMESPACE => 'acdsee',
+    NOTES => q{
+        ACD Systems ACDSee schema tags.
+
+        (A note to software developers: Re-inventing your own private tags instead
+        of using the equivalent tags in standard XMP schemas defeats one of the most
+        valuable features of metadata: interoperability.  Your applications mumble
+        to themselves instead of speaking out for the rest of the world to hear.)
+    },
+    author     => { Avoid => 1, Groups => { 2 => 'Author' } },
+    caption    => { Avoid => 1 },
+    categories => { Avoid => 1 },
+    datetime   => { Avoid => 1, Groups => { 2 => 'Time' }, %dateTimeInfo },
+    keywords   => { Avoid => 1, List => 'Bag' },
+    notes      => { Avoid => 1 },
+    rating     => { Avoid => 1, Writable => 'real' }, # integer?
+    tagged     => { Avoid => 1, Writable => 'boolean' },
+    rpp => {
+        Name => 'RPP',
+        Writable => 'lang-alt',
+        Notes => 'raw processing settings in XML format',
+        Binary => 1,
+    },
+);
+
+# Picture Licensing Universal System schema properties (xmpPLUS)
+%Image::ExifTool::XMP::xmpPLUS = (
+    %xmpTableDefaults,
+    GROUPS => { 1 => 'XMP-xmpPLUS', 2 => 'Author' },
+    NAMESPACE => 'xmpPLUS',
+    NOTES => 'XMP Picture Licensing Universal System (PLUS) schema tags.',
+    CreditLineReq   => { Writable => 'boolean' },
+    ReuseAllowed    => { Writable => 'boolean' },
+);
+
+# Creative Commons schema properties (cc) (ref 5)
+%Image::ExifTool::XMP::cc = (
+    %xmpTableDefaults,
+    GROUPS => { 1 => 'XMP-cc', 2 => 'Author' },
+    NAMESPACE => 'cc',
+    NOTES => q{
+        Creative Commons schema tags.  (see
+        L<http://creativecommons.org/technology/xmp>)
+    },
+    license => { },
+    morePermissions => { },
+    attributionName => { },
+    attributionURL  => { },
+);
+
+# Description Explorer schema properties (dex) (ref 6)
+%Image::ExifTool::XMP::dex = (
+    %xmpTableDefaults,
+    GROUPS => { 1 => 'XMP-dex', 2 => 'Image' },
+    NAMESPACE => 'dex',
+    NOTES => q{
+        Description Explorer schema tags.  These tags are not very common.  The
+        Source and Rating tags are avoided when writing due to name conflicts with
+        other XMP tags.  (see L<http://www.optimasc.com/products/fileid/>)
+    },
+    crc32       => { Name => 'CRC32', Writable => 'integer' },
+    source      => { Avoid => 1 },
+    shortdescription => {
+        Name => 'ShortDescription',
+        Writable => 'lang-alt',
+    },
+    licensetype => {
+        Name => 'LicenseType',
+        PrintConv => {
+            unknown        => 'Unknown',
+            shareware      => 'Shareware',
+            freeware       => 'Freeware',
+            adware         => 'Adware',
+            demo           => 'Demo',
+            commercial     => 'Commercial',
+           'public domain' => 'Public Domain',
+           'open source'   => 'Open Source',
+        },
+    },
+    revision    => { },
+    rating      => { Avoid => 1 },
+    os          => { Name => 'OS', Writable => 'integer' },
+    ffid        => { Name => 'FFID' },
+);
+
+# iView MediaPro schema properties (mediapro) (ref PH)
+%Image::ExifTool::XMP::MediaPro = (
+    %xmpTableDefaults,
+    GROUPS => { 1 => 'XMP-mediapro', 2 => 'Image' },
+    NAMESPACE => 'mediapro',
+    NOTES => 'iView MediaPro schema tags.',
+    Event       => { },
+    Location    => {
+        Avoid => 1,
+        Groups => { 2 => 'Location' },
+        Notes => 'avoided due to conflict with XMP-iptcCore:Location',
+    },
+    Status      => { },
+    People      => { List => 'Bag' },
+    UserFields  => { List => 'Bag' },
+    CatalogSets => { List => 'Bag' },
+);
+
+# DigiKam schema tags (ref PH)
+%Image::ExifTool::XMP::digiKam = (
+    %xmpTableDefaults,
+    GROUPS => { 1 => 'XMP-digiKam', 2 => 'Image' },
+    NAMESPACE => 'digiKam',
+    NOTES => 'DigiKam schema tags.',
+    CaptionsAuthorNames    => { Writable => 'lang-alt' },
+    CaptionsDateTimeStamps => { Writable => 'lang-alt' },
+    TagsList               => { List => 'Seq' },
+);
+
+# SWF schema tags (ref PH)
+%Image::ExifTool::XMP::swf = (
+    %xmpTableDefaults,
+    GROUPS => { 1 => 'XMP-swf', 2 => 'Image' },
+    NAMESPACE => 'swf',
+    NOTES => 'Adobe SWF schema tags.',
+    type         => { Avoid => 1 },
+    bgalpha      => { Name => 'BackgroundAlpha', Writable => 'integer' },
+    forwardlock  => { Name => 'ForwardLock',     Writable => 'boolean' },
+    maxstorage   => { Name => 'MaxStorage',      Writable => 'integer' }, # (CS5)
+);
+
+# Sony Ericsson cell phone location tags
+# refs: http://www.opencellid.org/api
+# http://zonetag.research.yahoo.com/faq_location.php
+# http://www.cs.columbia.edu/sip/drafts/LIF%20TS%20101%20v2.0.0.pdf
+%Image::ExifTool::XMP::cell = (
+    %xmpTableDefaults,
+    GROUPS => { 1 => 'XMP-cell', 2 => 'Location' },
+    NAMESPACE => 'cell',
+    NOTES => 'Location tags written by some Sony Ericsson phones.',
+    mcc     => { Name => 'MobileCountryCode' },
+    mnc     => { Name => 'MobileNetworkCode' },
+    lac     => { Name => 'LocationAreaCode' },
+    cellid  => { Name => 'CellTowerID' },
+    cgi     => { Name => 'CellGlobalID' },
+    r       => { Name => 'CellR' }, # (what is this? Radius?)
+);
+
+my %sExtensions = (
+    STRUCT_NAME => 'Extensions',
+    NAMESPACE   => undef, # variable namespace
+    NOTES => q{
+        This structure may contain any top-level XMP tags, but none have been
+        pre-defined in ExifTool.  Without pre-defined flattened tag names,
+        RegionExtensions may be written only as a structure (ie.
+        C<{xmp-dc:creator=me,rating=5}>).  Fields for this structure are identified
+        using the standard ExifTool tag name (with optional leading group name,
+        and/or trailing language code, and/or trailing C<#> symbol to disable print
+        conversion).
+    },
+);
+my %sRegionStruct = (
+    STRUCT_NAME => 'RegionStruct',
+    NAMESPACE   => 'mwg-rs',
+    Area => { Struct => \%sArea },
+    Type => {
+        PrintConv => {
+            Face => 'Face',
+            Pet => 'Pet',
+            Focus => 'Focus',
+            BarCode => 'BarCode',
+        },
+    },
+    Name        => { },
+    Description => { },
+    FocusUsage  => {
+        PrintConv => {
+            EvaluatedUsed => 'Evaluated, Used',
+            EvaluatedNotUsed => 'Evaluated, Not Used',
+            NotEvaluatedNotUsed => 'Not Evaluated, Not Used',
+        },
+    },
+    BarCodeValue=> { },
+    Extensions  => { Struct => \%sExtensions },
+    seeAlso => { Namespace => 'rdfs', Resource => 1 },
+);
+my %sKeywordStruct4 = (
+    STRUCT_NAME => 'KeywordStruct4',
+    NAMESPACE   => 'mwg-kw',
+    Keyword   => { },
+    Applied   => { Writable => 'boolean' },
+);
+my %sKeywordStruct3 = (
+    STRUCT_NAME => 'KeywordStruct3',
+    NAMESPACE   => 'mwg-kw',
+    Keyword   => { },
+    Applied   => { Writable => 'boolean' },
+    Children  => { Struct => \%sKeywordStruct4, List => 'Bag' },
+);
+my %sKeywordStruct2 = (
+    STRUCT_NAME => 'KeywordStruct2',
+    NAMESPACE   => 'mwg-kw',
+    Keyword   => { },
+    Applied   => { Writable => 'boolean' },
+    Children  => { Struct => \%sKeywordStruct3, List => 'Bag' },
+);
+my %sKeywordStruct1 = (
+    STRUCT_NAME => 'KeywordStruct1',
+    NAMESPACE   => 'mwg-kw',
+    Keyword   => { },
+    Applied   => { Writable => 'boolean' },
+    Children  => { Struct => \%sKeywordStruct2, List => 'Bag' },
+);
+
+# MWG 2.0 region schema tags
+%Image::ExifTool::XMP::mwg_rs = (
+    %xmpTableDefaults,
+    GROUPS => { 1 => 'XMP-mwg-rs', 2 => 'Image' },
+    NAMESPACE => 'mwg-rs',
+    NOTES => q{
+        Image region metadata defined by the MWG 2.0 specification.  See
+        L<http://www.metadataworkinggroup.org/> for the official specification.
+    },
+    Regions => {
+        Name => 'RegionInfo',
+        Struct => {
+            STRUCT_NAME => 'RegionInfo',
+            NAMESPACE   => 'mwg-rs',
+            RegionList => { Struct => \%sRegionStruct, List => 'Bag' },
+            AppliedToDimensions => { Struct => \%sDimensions },
+        },
+    },
+    RegionsAppliedToDimensions  => { Flat => 1, Name => 'RegionAppliedToDimensions' },
+    RegionsAppliedToDimensionsW => { Flat => 1, Name => 'RegionAppliedToDimensionsW' },
+    RegionsAppliedToDimensionsH => { Flat => 1, Name => 'RegionAppliedToDimensionsH' },
+    RegionsAppliedToDimensionsUnit=>{Flat => 1, Name => 'RegionAppliedToDimensionsUnit' },
+    RegionsRegionList           => { Flat => 1, Name => 'RegionList' },
+    RegionsRegionListArea       => { Flat => 1, Name => 'RegionArea' },
+    RegionsRegionListAreaX      => { Flat => 1, Name => 'RegionAreaX' },
+    RegionsRegionListAreaY      => { Flat => 1, Name => 'RegionAreaY' },
+    RegionsRegionListAreaW      => { Flat => 1, Name => 'RegionAreaW' },
+    RegionsRegionListAreaH      => { Flat => 1, Name => 'RegionAreaH' },
+    RegionsRegionListAreaD      => { Flat => 1, Name => 'RegionAreaD' },
+    RegionsRegionListAreaUnit   => { Flat => 1, Name => 'RegionAreaUnit' },
+    RegionsRegionListType       => { Flat => 1, Name => 'RegionType' },
+    RegionsRegionListName       => { Flat => 1, Name => 'RegionName' },
+    RegionsRegionListDescription=> { Flat => 1, Name => 'RegionDescription' },
+    RegionsRegionListFocusUsage => { Flat => 1, Name => 'RegionFocusUsage' },
+    RegionsRegionListBarCodeValue=>{ Flat => 1, Name => 'RegionBarCodeValue' },
+    RegionsRegionListExtensions => { Flat => 1, Name => 'RegionExtensions' },
+    RegionsRegionListSeeAlso    => { Flat => 1, Name => 'RegionSeeAlso' },
+);
+
+# MWG 2.0 hierarchical keyword schema tags
+%Image::ExifTool::XMP::mwg_kw = (
+    %xmpTableDefaults,
+    GROUPS => { 1 => 'XMP-mwg-kw', 2 => 'Image' },
+    NAMESPACE => 'mwg-kw',
+    NOTES => q{
+        Hierarchical keywords metadata defined by the MWG 2.0 specification. 
+        ExifTool unrolls keyword structures to an arbitrary depth of 4 to allow
+        individual levels to be accessed with different tag names, and to avoid
+        infinite recursion.  See L<http://www.metadataworkinggroup.org/> for the
+        official specification.
+    },
+    # arbitrarily define only the first 4 levels of the keyword hierarchy
+    Keywords => {
+        Name => 'KeywordInfo',
+        Struct => {
+            STRUCT_NAME => 'KeywordInfo',
+            NAMESPACE   => 'mwg-kw',
+            Hierarchy => { Struct => \%sKeywordStruct1, List => 'Bag' },
+        },
+    },
+    KeywordsHierarchy => { Name => 'HierarchicalKeywords', Flat => 1 },
+    KeywordsHierarchyKeyword  => { Name => 'HierarchicalKeywords1', Flat => 1 },
+    KeywordsHierarchyApplied  => { Name => 'HierarchicalKeywords1Applied', Flat => 1 },
+    KeywordsHierarchyChildren => { Name => 'HierarchicalKeywords1Children', Flat => 1 },
+    KeywordsHierarchyChildrenKeyword  => { Name => 'HierarchicalKeywords2', Flat => 1 },
+    KeywordsHierarchyChildrenApplied  => { Name => 'HierarchicalKeywords2Applied', Flat => 1 },
+    KeywordsHierarchyChildrenChildren => { Name => 'HierarchicalKeywords2Children', Flat => 1 },
+    KeywordsHierarchyChildrenChildrenKeyword  => { Name => 'HierarchicalKeywords3', Flat => 1 },
+    KeywordsHierarchyChildrenChildrenApplied  => { Name => 'HierarchicalKeywords3Applied', Flat => 1 },
+    KeywordsHierarchyChildrenChildrenChildren => { Name => 'HierarchicalKeywords3Children', Flat => 1 },
+    KeywordsHierarchyChildrenChildrenChildrenKeyword => { Name => 'HierarchicalKeywords4', Flat => 1 },
+    KeywordsHierarchyChildrenChildrenChildrenApplied => { Name => 'HierarchicalKeywords4Applied', Flat => 1 },
+);
+
+# MWG 2.0 collections schema tags
+%Image::ExifTool::XMP::mwg_coll = (
+    %xmpTableDefaults,
+    GROUPS => { 1 => 'XMP-mwg-coll', 2 => 'Image' },
+    NAMESPACE => 'mwg-coll',
+    NOTES => q{
+        Collections metadata defined by the MWG 2.0 specification.  See
+        L<http://www.metadataworkinggroup.org/> for the official specification.
+    },
+    Collections => {
+        List => 'Bag',
+        Struct => {
+            STRUCT_NAME => 'CollectionInfo',
+            NAMESPACE   => 'mwg-coll',
+            CollectionName => { },
+            CollectionURI  => { },
+        },
+    },
+    CollectionsCollectionName => { Name => 'CollectionName', Flat => 1 },
+    CollectionsCollectionURI  => { Name => 'CollectionURI',  Flat => 1 },
+);
+
+# SVG schema properties (ref 9)
+%Image::ExifTool::XMP::SVG = (
+    GROUPS => { 0 => 'SVG', 1 => 'SVG', 2 => 'Image' },
+    NAMESPACE => 'svg',
+    LANG_INFO => \&GetLangInfo,
+    NOTES => q{
+        SVG (Scalable Vector Graphics) image tags.  By default, only the top-level
+        SVG and Metadata tags are extracted from these images, but all graphics tags
+        may be extracted by setting the Unknown option to 2 (-U on the command
+        line).  The SVG tags are not part of XMP as such, but are included with the
+        XMP module for convenience.  (see L<http://www.w3.org/TR/SVG11/>)
+    },
+    version    => 'SVGVersion',
+    id         => 'ID',
+    metadataId => 'MetadataID',
+    width      => 'ImageWidth',
+    height     => 'ImageHeight',
+);
+
+# table to add tags in other namespaces
+%Image::ExifTool::XMP::otherSVG = (
+    GROUPS => { 0 => 'SVG', 2 => 'Unknown' },
+    LANG_INFO => \&GetLangInfo,
+    NAMESPACE => undef, # variable namespace
+);
+
+# set "Avoid" flag for all PRISM tags
+my ($table, $key);
+foreach $table (
+    \%Image::ExifTool::XMP::prism,
+    \%Image::ExifTool::XMP::prl,
+    \%Image::ExifTool::XMP::pur)
+{
+    foreach $key (TagTableKeys($table)) {
+        $table->{$key}->{Avoid} = 1;
+    }
+}
+
+
+1;  #end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::XMP2.pl - Additional XMP schema definitions
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This file contains definitions for less common XMP schemas.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://ns.useplus.org/>
+
+=item L<http://www.prismstandard.org/>
+
+=item L<http://www.portfoliofaq.com/pfaq/v7mappings.htm>
+
+=item L<http://creativecommons.org/technology/xmp>
+
+=item L<http://www.optimasc.com/products/fileid/xmp-extensions.pdf>
+
+=item L<http://www.w3.org/TR/SVG11/>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/XMP Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/XMPStruct.pl
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/XMPStruct.pl	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/XMPStruct.pl	(revision 24799)
@@ -0,0 +1,786 @@
+#------------------------------------------------------------------------------
+# File:         XMPStruct.pl
+#
+# Description:  XMP structure support
+#
+# Revisions:    01/01/2011 - P. Harvey Created
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::XMP;
+
+use strict;
+use vars qw(%specialStruct $xlatNamespace);
+
+use Image::ExifTool qw(:Utils);
+use Image::ExifTool::XMP;
+
+sub SerializeStruct($;$);
+sub InflateStruct($;$);
+sub DumpStruct($;$);
+sub CheckStruct($$$);
+sub AddNewStruct($$$$$$);
+sub ConvertStruct($$$$;$);
+
+#------------------------------------------------------------------------------
+# Serialize a structure (or other object) into a simple string
+# Inputs: 0) HASH ref, ARRAY ref, or SCALAR, 1) closing bracket (or undef)
+# Returns: serialized structure string
+# ie) "{field=text with {braces|}|, and a comma, field2=val2,field3={field4=[a,b]}}"
+sub SerializeStruct($;$)
+{
+    my ($obj, $ket) = @_;
+    my ($key, $val, @vals, $rtnVal);
+
+    if (ref $obj eq 'HASH') {
+        foreach $key (sort keys %$obj) {
+            push @vals, $key . '=' . SerializeStruct($$obj{$key}, '}');
+        }
+        $rtnVal = '{' . join(',', @vals) . '}';
+    } elsif (ref $obj eq 'ARRAY') {
+        foreach $val (@$obj) {
+            push @vals, SerializeStruct($val, ']');
+        }
+        $rtnVal = '[' . join(',', @vals) . ']';
+    } elsif (defined $obj) {
+        $obj = $$obj if ref $obj eq 'SCALAR';
+        # escape necessary characters in string (closing bracket plus "," and "|")
+        my $pat = $ket ? "\\$ket|,|\\|" : ',|\\|';
+        ($rtnVal = $obj) =~  s/($pat)/|$1/g;
+        # also must escape opening bracket or whitespace at start of string
+        $rtnVal =~ s/^([\s\[\{])/|$1/;
+    } else {
+        $rtnVal = '';   # allow undefined list items
+    }
+    return $rtnVal;
+}
+
+#------------------------------------------------------------------------------
+# Inflate structure (or other object) from a serialized string
+# Inputs: 0) reference to object in string form (serialized using the '|' escape)
+#         1) extra delimiter for scalar values delimiters
+# Returns: 0) object as a SCALAR, HASH ref, or ARRAY ref (or undef on error),
+#          1) warning string (or undef)
+# Notes: modifies input string to remove parsed objects
+sub InflateStruct($;$)
+{
+    my ($obj, $delim) = @_;
+    my ($val, $warn, $part);
+
+    if ($$obj =~ s/^\s*\{//) {
+        my %struct;
+        while ($$obj =~ s/^\s*([-\w:]+#?)\s*=//s) {
+            my $tag = $1;
+            my ($v, $w) = InflateStruct($obj, '}');
+            $warn = $w if $w and not $warn;
+            return(undef, $warn) unless defined $v;
+            $struct{$tag} = $v;
+            # eat comma separator, or all done if there wasn't one
+            last unless $$obj =~ s/^\s*,//s;
+        }
+        # eat closing brace and warn if we didn't find one
+        unless ($$obj =~ s/^\s*\}//s or $warn) {
+            if (length $$obj) {
+                ($part = $$obj) =~ s/^\s*//s;
+                $part =~ s/[\x0d\x0a].*//s;
+                $part = substr($part,0,27) . '...' if length($part) > 30;
+                $warn = "Invalid structure field at '$part'";
+            } else {
+                $warn = 'Missing closing brace for structure';
+            }
+        }
+        $val = \%struct;
+    } elsif ($$obj =~ s/^\s*\[//) {
+        my @list;
+        for (;;) {
+            my ($v, $w) = InflateStruct($obj, ']');
+            $warn = $w if $w and not $warn;
+            return(undef, $warn) unless defined $v;
+            push @list, $v;
+            last unless $$obj =~ s/^\s*,//s;
+        }
+        # eat closing bracket and warn if we didn't find one
+        $$obj =~ s/^\s*\]//s or $warn or $warn = 'Missing closing bracket for list';
+        $val = \@list;
+    } else {
+        $$obj =~ s/^\s+//s; # remove leading whitespace
+        # read scalar up to specified delimiter (or "," if not defined)
+        $val = '';
+        $delim = $delim ? "\\$delim|,|\\||\$" : ',|\\||$';
+        for (;;) {
+            $$obj =~ s/^(.*?)($delim)//s and $val .= $1;
+            last unless $2;
+            $2 eq '|' or $$obj = $2 . $$obj, last;
+            $$obj =~ s/^(.)//s and $val .= $1;  # add escaped character
+        }
+    }
+    return($val, $warn);
+}
+
+#------------------------------------------------------------------------------
+# Get XMP language code from tag name string
+# Inputs: 0) tag name string
+# Returns: 0) separated tag name, 1) language code (in standard case), or '' if
+#          language code was 'x-default', or undef if the tag had no language code
+sub GetLangCode($)
+{
+    my $tag = shift;
+    if ($tag =~ /^(\w+)[-_]([a-z]{2,3}|[xi])([-_][a-z\d]{2,8}([-_][a-z\d]{1,8})*)?$/i) {
+        # normalize case of language codes
+        my ($tg, $langCode) = ($1, lc($2));
+        $langCode .= (length($3) == 3 ? uc($3) : lc($3)) if $3;
+        $langCode =~ tr/_/-/;   # RFC 3066 specifies '-' as a separator
+        $langCode = '' if lc($langCode) eq 'x-default';
+        return($tg, $langCode);
+    } else {
+        return($tag, undef);
+    }
+}
+
+#------------------------------------------------------------------------------
+# Debugging routine to dump a structure, list or scalar
+# Inputs: 0) scalar, ARRAY ref or HASH ref, 1) indent (or undef)
+sub DumpStruct($;$)
+{
+    local $_;
+    my ($obj, $indent) = @_;
+
+    $indent or $indent = '';
+    if (ref $obj eq 'HASH') {
+        print "{\n";
+        foreach (sort keys %$obj) {
+            print "$indent  $_ = ";
+            DumpStruct($$obj{$_}, "$indent  ");
+        }
+        print $indent, "},\n";
+    } elsif (ref $obj eq 'ARRAY') {
+        print "[\n";
+        foreach (@$obj) {
+            print "$indent  ";
+            DumpStruct($_, "$indent  ");
+        }
+        print $indent, "],\n",
+    } else {
+        print "\"$obj\",\n";
+    }
+}
+
+#------------------------------------------------------------------------------
+# Recursively validate structure fields (tags)
+# Inputs: 0) ExifTool ref, 1) Structure ref, 2) structure table definition ref
+# Returns: 0) validated structure ref, 1) error string, or undef on success
+# Notes:
+# - fixes field names in structure and applies inverse conversions to values
+# - copies structure to avoid interdependencies with calling code on referenced values
+# - handles lang-alt tags, and '#' on field names
+# - resets UTF-8 flag of SCALAR values
+# - un-escapes for XML or HTML as per Escape option setting
+sub CheckStruct($$$)
+{
+    my ($exifTool, $struct, $strTable) = @_;
+
+    my $strName = $$strTable{STRUCT_NAME} || RegisterNamespace($strTable);
+    ref $struct eq 'HASH' or return wantarray ? (undef, "Expecting $strName structure") : undef;
+
+    my ($key, $err, $warn, %copy, $rtnVal, $val);
+Key:
+    foreach $key (keys %$struct) {
+        my $tag = $key;
+        # allow trailing '#' to disable print conversion on a per-field basis
+        my ($type, $fieldInfo);
+        $type = 'ValueConv' if $tag =~ s/#$//;
+        $fieldInfo = $$strTable{$tag} unless $specialStruct{$tag};
+        # fix case of field name if necessary
+        unless ($fieldInfo) {
+            # (sort in reverse to get lower case (not special) tags first)
+            my ($fix) = reverse sort grep /^$tag$/i, keys %$strTable;
+            $fieldInfo = $$strTable{$tag = $fix} if $fix and not $specialStruct{$fix};
+        }
+        until (ref $fieldInfo eq 'HASH') {
+            # generate wildcard fields on the fly (ie. mwg-rs:Extensions)
+            unless ($$strTable{NAMESPACE}) {
+                my ($grp, $tg, $langCode);
+                ($grp, $tg) = $tag =~ /^(.+):(.+)/ ? (lc $1, $2) : ('', $tag);
+                undef $grp if $grp eq 'XMP'; # (a group of 'XMP' is implied)
+                require Image::ExifTool::TagLookup;
+                my @matches = Image::ExifTool::TagLookup::FindTagInfo($tg);
+                # also look for lang-alt tags
+                unless (@matches) {
+                    ($tg, $langCode) = GetLangCode($tg);
+                    @matches = Image::ExifTool::TagLookup::FindTagInfo($tg) if defined $langCode;
+                }
+                my ($tagInfo, $priority, $ti, $g1);
+                # find best matching tag
+                foreach $ti (@matches) {
+                    my @grps = $exifTool->GetGroup($ti);
+                    next unless $grps[0] eq 'XMP';
+                    next if $grp and $grp ne lc $grps[1];
+                    # must be lang-alt tag if we are writing an alternate language
+                    next if defined $langCode and not ($$ti{Writable} and $$ti{Writable} eq 'lang-alt');
+                    my $pri = $$ti{Priority} || 1;
+                    $pri -= 10 if $$ti{Avoid};
+                    next if defined $priority and $priority >= $pri;
+                    $priority = $pri;
+                    $tagInfo = $ti;
+                    $g1 = $grps[1];
+                }
+                $tagInfo or $warn =  "'$tag' is not a writable XMP tag", next Key;
+                GetPropertyPath($tagInfo);  # make sure property path is generated for this tag
+                $tag = $$tagInfo{Name};
+                $tag = "$g1:$tag" if $grp;
+                $tag .= "-$langCode" if $langCode;
+                $fieldInfo = $$strTable{$tag};
+                # create new structure field if necessary
+                $fieldInfo or $fieldInfo = $$strTable{$tag} = {
+                    %$tagInfo, # (also copies the necessary TagID and PropertyPath)
+                    Namespace => $$tagInfo{Table}{NAMESPACE},
+                    LangCode  => $langCode,
+                };
+                # delete stuff we don't need (shouldn't cause harm, but better safe than sorry)
+                # - need to keep StructType and Table in case we need to call AddStructType later
+                delete $$fieldInfo{Description};
+                delete $$fieldInfo{Groups};
+                last; # write this dynamically-generated field
+            }
+            # generate lang-alt fields on the fly (ie. Iptc4xmpExt:AOTitle)
+            my ($tg, $langCode) = GetLangCode($tag);
+            if (defined $langCode) {
+                $fieldInfo = $$strTable{$tg} unless $specialStruct{$tg};
+                unless ($fieldInfo) {
+                    my ($fix) = reverse sort grep /^$tg$/i, keys %$strTable;
+                    $fieldInfo = $$strTable{$tg = $fix} if $fix and not $specialStruct{$fix};
+                }
+                if (ref $fieldInfo eq 'HASH' and $$fieldInfo{Writable} and
+                    $$fieldInfo{Writable} eq 'lang-alt')
+                {
+                    my $srcInfo = $fieldInfo;
+                    $tag = $tg . '-' . $langCode if $langCode;
+                    $fieldInfo = $$strTable{$tag};
+                    # create new structure field if necessary
+                    $fieldInfo or $fieldInfo = $$strTable{$tag} = {
+                        %$srcInfo,
+                        TagID    => $tg,
+                        LangCode => $langCode,
+                    };
+                    last; # write this lang-alt field
+                }
+            }
+            $warn = "'$tag' is not a field of $strName";
+            next Key;
+        }
+        if (ref $$struct{$key} eq 'HASH') {
+            $$fieldInfo{Struct} or $warn = "$tag is not a structure in $strName", next Key;
+            # recursively check this structure
+            ($val, $err) = CheckStruct($exifTool, $$struct{$key}, $$fieldInfo{Struct});
+            $err and $warn = $err, next Key;
+            $copy{$tag} = $val;
+        } elsif (ref $$struct{$key} eq 'ARRAY') {
+            $$fieldInfo{List} or $warn = "$tag is not a list in $strName", next Key;
+            # check all items in the list
+            my ($item, @copy);
+            my $i = 0;
+            foreach $item (@{$$struct{$key}}) {
+                if (not ref $item) {
+                    $item = '' unless defined $item; # use empty string for missing items
+                    $$fieldInfo{Struct} and $warn = "$tag items are not valid structures", next Key;
+                    $exifTool->Sanitize(\$item);
+                    ($copy[$i],$err) = $exifTool->ConvInv($item,$fieldInfo,$tag,$strName,$type);
+                    $err and $warn = $err, next Key;
+                    $err = CheckXMP($exifTool, $fieldInfo, \$copy[$i]);
+                    $err and $warn = "$err in $strName $tag", next Key;
+                } elsif (ref $item eq 'HASH') {
+                    $$fieldInfo{Struct} or $warn = "$tag is not a structure in $strName", next Key;
+                    ($copy[$i], $err) = CheckStruct($exifTool, $item, $$fieldInfo{Struct});
+                    $err and $warn = $err, next Key;
+                } else {
+                    $warn = "Invalid value for $tag in $strName";
+                    next Key;
+                }
+                ++$i;
+            }
+            $copy{$tag} = \@copy;
+        } elsif ($$fieldInfo{Struct}) {
+            $warn = "Improperly formed structure in $strName $tag";
+        } else {
+            $exifTool->Sanitize(\$$struct{$key});
+            ($val,$err) = $exifTool->ConvInv($$struct{$key},$fieldInfo,$tag,$strName,$type);
+            $err and $warn = $err, next Key;
+            $err = CheckXMP($exifTool, $fieldInfo, \$val);
+            $err and $warn = "$err in $strName $tag", next Key;
+            # turn this into a list if necessary
+            $copy{$tag} = $$fieldInfo{List} ? [ $val ] : $val;
+        }
+    }
+    if (%copy) {
+        $rtnVal = \%copy;
+        undef $err;
+        $$exifTool{CHECK_WARN} = $warn if $warn;
+    } else {
+        $err = $warn || 'Structure has no fields';
+    }
+    return wantarray ? ($rtnVal, $err) : $rtnVal;
+}
+
+#------------------------------------------------------------------------------
+# Delete matching structures from existing linearized XMP
+# Inputs: 0) ExifTool ref, 1) capture hash ref, 2) structure path ref,
+#         3) new value hash ref, 4) reference to change counter
+# Returns: 0) delete flag, 1) list index of deleted structure if adding to list
+# Notes: updates path to new base path for structure to be added
+sub DeleteStruct($$$$$)
+{
+    my ($exifTool, $capture, $pathPt, $nvHash, $changed) = @_;
+    my ($deleted, $added, $p, $pp, $val, $delPath);
+    my (@structPaths, @matchingPaths, @delPaths);
+
+    # find all existing elements belonging to this structure
+    ($pp = $$pathPt) =~ s/ \d+/ \\d\+/g;
+    @structPaths = sort grep(/^$pp\//, keys %$capture);
+
+    # delete only structures with matching fields if necessary
+    if ($$nvHash{DelValue}) {
+        if (@{$$nvHash{DelValue}}) {
+            my $strTable = $$nvHash{TagInfo}{Struct};
+            # all fields must match corresponding elements in the same
+            # root structure for it to be deleted
+            foreach $val (@{$$nvHash{DelValue}}) {
+                next unless ref $val eq 'HASH';
+                my (%cap, $p2, %match);
+                next unless AddNewStruct(undef, undef, \%cap, $$pathPt, $val, $strTable);
+                foreach $p (keys %cap) {
+                    if ($p =~ / /) {
+                        ($p2 = $p) =~ s/ \d+/ \\d\+/g;
+                        @matchingPaths = sort grep(/^$p2$/, @structPaths);
+                    } else {
+                        push @matchingPaths, $p;
+                    }
+                    foreach $p2 (@matchingPaths) {
+                        $p2 =~ /^($pp)/ or next;
+                        # language attribute must also match if it exists
+                        my $attr = $cap{$p}[1];
+                        if ($$attr{'xml:lang'}) {
+                            my $a2 = $$capture{$p2}[1];
+                            next unless $$a2{'xml:lang'} and $$a2{'xml:lang'} eq $$attr{'xml:lang'};
+                        }
+                        if ($$capture{$p2}[0] eq $cap{$p}[0]) {
+                            # ($1 contains root path for this structure)
+                            $match{$1} = ($match{$1} || 0) + 1;
+                        }
+                    }
+                }
+                my $num = scalar(keys %cap);
+                foreach $p (keys %match) {
+                    # do nothing unless all fields matched the same structure
+                    next unless $match{$p} == $num;
+                    # delete all elements of this structure
+                    foreach $p2 (@structPaths) {
+                        push @delPaths, $p2 if $p2 =~ /^$p/;
+                    }
+                    # remember path of first deleted structure
+                    $delPath = $p if not $delPath or $delPath gt $p;
+                }
+            }
+        } # (else don't delete anything)
+    } elsif (@structPaths) {
+        @delPaths = @structPaths;   # delete all
+        $structPaths[0] =~ /^($pp)/;
+        $delPath = $1;
+    }
+    if (@delPaths) {
+        my $verbose = $exifTool->Options('Verbose');
+        @delPaths = sort @delPaths if $verbose > 1;
+        foreach $p (@delPaths) {
+            $exifTool->VerboseValue("- XMP-$p", $$capture{$p}[0]) if $verbose > 1;
+            delete $$capture{$p};
+            $deleted = 1;
+            ++$$changed;
+        }
+        $delPath or warn("Internal error 1 in DeleteStruct\n"), return(undef,undef);
+        $$pathPt = $delPath;    # return path of first element deleted
+    } else {
+        my $tagInfo = $$nvHash{TagInfo};
+        if ($$tagInfo{List}) {
+            # NOTE: we don't yet properly handle lang-alt elements!!!!
+            if (@structPaths) {
+                $structPaths[-1] =~ /^($pp)/ or warn("Internal error 2 in DeleteStruct\n"), return(undef,undef);
+                my $path = $1;
+                # (match last index to put in same lang-alt list for Bag of lang-alt items)
+                $path =~ m/.* (\d+)/g or warn("Internal error 3 in DeleteStruct\n"), return(undef,undef);
+                $added = $1;
+                # add after last item in list
+                my $len = length $added;
+                my $pos = pos($path) - $len;
+                my $nxt = substr($added, 1) + 1;
+                substr($path, $pos, $len) = length($nxt) . $nxt;
+                $$pathPt = $path;
+            } else {
+                $added = '10';
+            }
+        }
+    }
+    return($deleted, $added);
+}
+
+#------------------------------------------------------------------------------
+# Add new element to XMP capture hash
+# Inputs: 0) ExifTool ref, 1) TagInfo ref, 2) capture hash ref,
+#         3) resource path, 4) value ref, 5) hash ref for last used index numbers
+sub AddNewTag($$$$$$)
+{
+    my ($exifTool, $tagInfo, $capture, $path, $valPtr, $langIdx) = @_;
+    my $val = EscapeXML($$valPtr);
+    my %attrs;
+    # support writing RDF "resource" values
+    if ($$tagInfo{Resource}) {
+        $attrs{'rdf:resource'} = $val;
+        $val = '';
+    }
+    if ($$tagInfo{Writable} and $$tagInfo{Writable} eq 'lang-alt') {
+        # write the lang-alt tag
+        my $langCode = $$tagInfo{LangCode};
+        # add indexed lang-alt list properties
+        my $i = $$langIdx{$path} || 0;
+        $$langIdx{$path} = $i + 1; # save next list index
+        if ($i) {
+            my $idx = length($i) . $i;
+            $path =~ s/(.*) \d+/$1 $idx/;   # set list index
+        }
+        $attrs{'xml:lang'} = $langCode || 'x-default';
+    }
+    $$capture{$path} = [ $val, \%attrs ];
+    # print verbose message
+    if ($exifTool and $exifTool->Options('Verbose') > 1) {
+        $exifTool->VerboseValue("+ XMP-$path", $val);
+    }
+}
+
+#------------------------------------------------------------------------------
+# Add new structure to capture hash for writing
+# Inputs: 0) ExifTool object ref (or undef for no warnings),
+#         1) tagInfo ref (or undef if no ExifTool), 2) capture hash ref,
+#         3) base path, 4) struct ref, 5) struct hash ref
+# Returns: number of tags changed
+# Notes: Escapes values for XML
+sub AddNewStruct($$$$$$)
+{
+    my ($exifTool, $tagInfo, $capture, $basePath, $struct, $strTable) = @_;
+    my $verbose = $exifTool ? $exifTool->Options('Verbose') : 0;
+    my ($tag, %langIdx);
+
+    my $ns = $$strTable{NAMESPACE} || '';
+    my $changed = 0;
+
+    foreach $tag (sort keys %$struct) {
+        my $fieldInfo = $$strTable{$tag} or next;
+        my $val = $$struct{$tag};
+        my $propPath = $$fieldInfo{PropertyPath};
+        unless ($propPath) {
+            $propPath = ($$fieldInfo{Namespace} || $ns) . ':' . ($$fieldInfo{TagID} || $tag);
+            if ($$fieldInfo{List}) {
+                $propPath .= "/rdf:$$fieldInfo{List}/rdf:li 10";
+            }
+            if ($$fieldInfo{Writable} and $$fieldInfo{Writable} eq 'lang-alt') {
+                $propPath .= "/rdf:Alt/rdf:li 10";
+            }
+            $$fieldInfo{PropertyPath} = $propPath;  # save for next time
+        }
+        my $path = $basePath . '/' . ConformPathToNamespace($exifTool, $propPath);
+        my $addedTag;
+        if (ref $val eq 'HASH') {
+            my $subStruct = $$fieldInfo{Struct} or next;
+            $changed += AddNewStruct($exifTool, $tagInfo, $capture, $path, $val, $subStruct);
+        } elsif (ref $val eq 'ARRAY') {
+            next unless $$fieldInfo{List};
+            my $i = 0;
+            my ($item, $p);
+            # loop through all list items (note: can't yet write multi-dimensional lists)
+            foreach $item (@{$val}) {
+                if ($i) {
+                    # update first index in field property (may be list of lang-alt lists)
+                    $p = ConformPathToNamespace($exifTool, $propPath);
+                    my $idx = length($i) . $i;
+                    $p =~ s/ \d+/ $idx/;
+                    $p = "$basePath/$p";
+                } else {
+                    $p = $path;
+                }
+                if (ref $item eq 'HASH') {
+                    my $subStruct = $$fieldInfo{Struct} or next;
+                    AddNewStruct($exifTool, $tagInfo, $capture, $p, $item, $subStruct) or next;
+                } elsif (length $item) { # don't write empty items in list
+                    AddNewTag($exifTool, $fieldInfo, $capture, $p, \$item, \%langIdx);
+                    $addedTag = 1;
+                }
+                ++$changed;
+                ++$i;
+            }
+        } else {
+            AddNewTag($exifTool, $fieldInfo, $capture, $path, \$val, \%langIdx);
+            $addedTag = 1;
+            ++$changed;
+        }
+        # this is tricky, but we must add the rdf:type for contained structures
+        # in the case that a whole hierarchy was added at once by writing a
+        # flattened tag inside a variable-namespace structure
+        if ($addedTag and $$fieldInfo{StructType} and $$fieldInfo{Table}) {
+            AddStructType($exifTool, $$fieldInfo{Table}, $capture, $propPath, $basePath);
+        }
+    }
+    # add 'rdf:type' property if necessary
+    if ($$strTable{TYPE} and $changed) {
+        my $path = $basePath . '/' . ConformPathToNamespace($exifTool, "rdf:type");
+        unless ($$capture{$path}) {
+            $$capture{$path} = [ '', { 'rdf:resource' => $$strTable{TYPE} } ];
+            $exifTool->VerboseValue("+ XMP-$path", $$strTable{TYPE}) if $verbose > 1;
+        }
+    }
+    return $changed;
+}
+
+#------------------------------------------------------------------------------
+# Convert structure field values for printing
+# Inputs: 0) ExifTool ref, 1) tagInfo ref for structure tag, 2) value,
+#         3) conversion type: PrintConv, ValueConv or Raw (Both not allowed)
+#         4) tagID of parent structure (needed only if there was no flattened tag)
+# Notes: Makes a copy of the hash so any applied escapes won't affect raw values
+sub ConvertStruct($$$$;$)
+{
+    my ($exifTool, $tagInfo, $value, $type, $parentID) = @_;
+    if (ref $value eq 'HASH') {
+        my (%struct, $key);
+        my $table = $$tagInfo{Table};
+        $parentID = $$tagInfo{TagID} unless $parentID;
+        foreach $key (keys %$value) {
+            my $tagID = $parentID . ucfirst($key);
+            my $flatInfo = $$table{$tagID};
+            unless ($flatInfo) {
+                # handle variable-namespace structures
+                if ($key =~ /^XMP-(.*?:)(.*)/) {
+                    $tagID = $1 . $parentID . ucfirst($2);
+                    $flatInfo = $$table{$tagID};
+                }
+                $flatInfo or $flatInfo = $tagInfo;
+            }
+            my $v = $$value{$key};
+            if (ref $v) {
+                $v = ConvertStruct($exifTool, $flatInfo, $v, $type, $tagID);
+            } else {
+                $v = $exifTool->GetValue($flatInfo, $type, $v);
+            }
+            $struct{$key} = $v if defined $v;  # save the converted value
+        }
+        return \%struct;
+    } elsif (ref $value eq 'ARRAY') {
+        my (@list, $val);
+        foreach $val (@$value) {    
+            my $v = ConvertStruct($exifTool, $tagInfo, $val, $type, $parentID);
+            push @list, $v if defined $v;
+        }
+        return \@list;
+    } else {
+        return $exifTool->GetValue($tagInfo, $type, $value);
+    }
+}
+
+#------------------------------------------------------------------------------
+# Restore XMP structures in extracted information
+# Inputs: 0) ExifTool object ref
+# Notes: also restores lists (including multi-dimensional)
+sub RestoreStruct($)
+{
+    local $_;
+    my $exifTool = shift;
+    my ($key, %structs, %var, %lists, $si, %listKeys);
+    my $ex = $$exifTool{TAG_EXTRA};
+    foreach $key (keys %{$$exifTool{TAG_INFO}}) {
+        $$ex{$key} or next;
+        my ($err, $i);
+        my $structProps = $$ex{$key}{Struct} or next;
+        my $tagInfo = $$exifTool{TAG_INFO}{$key};   # tagInfo for flattened tag
+        my $table = $$tagInfo{Table};
+        my $prop = shift @$structProps;
+        my $tag = $$prop[0];
+        # get reference to structure tag (or normal list tag if not a structure)
+        my $strInfo = @$structProps ? $$table{$tag} : $tagInfo;
+        if ($strInfo) {
+            ref $strInfo eq 'HASH' or next; # (just to be safe)
+            if (@$structProps and not $$strInfo{Struct}) {
+                # this could happen for invalid XMP containing mixed lists
+                # (or for something like this -- what should we do here?:
+                # <meta:user-defined meta:name="License">test</meta:user-defined>)
+                $exifTool->Warn("$$strInfo{Name} is not a structure!");
+                next;
+            }
+        } else {
+            # create new entry in tag table for this structure
+            my $g1 = $$table{GROUPS}{0} || 'XMP';
+            my $name = $tag;
+            if ($tag =~ /(.+):(.+)/) {
+                my $ns;
+                ($ns, $name) = ($1, $2);
+                $ns = $$xlatNamespace{$ns} if $$xlatNamespace{$ns};
+                $g1 .= "-$ns";
+            }
+            $strInfo = {
+                Name => ucfirst $name,
+                Groups => { 1 => $g1 },
+                Struct => 'Unknown',
+            };
+            # add Struct entry if this is a structure
+            if (@$structProps) {
+                # this is a structure
+                $$strInfo{Struct} = { STRUCT_NAME => 'Unknown' } if @$structProps;
+            } elsif ($$tagInfo{LangCode}) {
+                # this is lang-alt list
+                $tag = $tag . '-' . $$tagInfo{LangCode};
+                $$strInfo{LangCode} = $$tagInfo{LangCode};
+            }
+            Image::ExifTool::AddTagToTable($table, $tag, $strInfo);
+        }
+        # use strInfo ref for base key to avoid collisions
+        $tag = $strInfo;
+        my $struct = \%structs;
+        my $oldStruct = $structs{$strInfo};
+        # (fyi: 'lang-alt' Writable type will be valid even if tag is not pre-defined)
+        my $writable = $$tagInfo{Writable} || '';
+        # walk through the stored structure property information
+        # to rebuild this structure
+        for (;;) {
+            my $index = $$prop[1];
+            if ($index and not @$structProps) {
+                # ignore this list if it is a simple lang-alt tag
+                if ($writable eq 'lang-alt') {
+                    pop @$prop; # remove lang-alt index
+                    undef $index if @$prop < 2;
+                }
+                # add language code if necessary
+                if ($$tagInfo{LangCode} and not ref $tag) {
+                    $tag = $tag . '-' . $$tagInfo{LangCode};
+                }
+            }
+            my $nextStruct = $$struct{$tag};
+            if (defined $index) {
+                # the field is a list
+                $index = substr $index, 1;  # remove digit count
+                if ($nextStruct) {
+                    ref $nextStruct eq 'ARRAY' or $err = 2, last;
+                    $struct = $nextStruct;
+                } else {
+                    $struct = $$struct{$tag} = [ ];
+                }
+                $nextStruct = $$struct[$index];
+                # descend into multi-dimensional lists
+                for ($i=2; $$prop[$i]; ++$i) {
+                    if ($nextStruct) {
+                        ref $nextStruct eq 'ARRAY' or last;
+                        $struct = $nextStruct;
+                    } else {
+                        $lists{$struct} = $struct;
+                        $struct = $$struct[$index] = [ ];
+                    }
+                    $nextStruct = $$struct[$index];
+                    $index = substr $$prop[$i], 1;
+                }
+                if (ref $nextStruct eq 'HASH') {
+                    $struct = $nextStruct;  # continue building sub-structure
+                } elsif (@$structProps) {
+                    $lists{$struct} = $struct;
+                    $struct = $$struct[$index] = { };
+                } else {
+                    $lists{$struct} = $struct;
+                    $$struct[$index] = $$exifTool{VALUE}{$key};
+                    last;
+                }
+            } else {
+                if ($nextStruct) {
+                    ref $nextStruct eq 'HASH' or $err = 3, last;
+                    $struct = $nextStruct;
+                } elsif (@$structProps) {
+                    $struct = $$struct{$tag} = { };
+                } else {
+                    $$struct{$tag} = $$exifTool{VALUE}{$key};
+                    last;
+                }
+            }
+            $prop = shift @$structProps or last;
+            $tag = $$prop[0];
+            if ($tag =~ /(.+):(.+)/) {
+                # tag in variable-namespace tables will have a leading
+                # XMP namespace on the tag name.  In this case, add
+                # the corresponding group1 name to the tag ID.
+                my ($ns, $name) = ($1, $2);
+                $ns = $$xlatNamespace{$ns} if $$xlatNamespace{$ns};
+                $tag = "XMP-$ns:" . ucfirst $name;
+            } else {
+                $tag = ucfirst $tag;
+            }
+        }
+        if ($err) {
+            # this may happen if we have a structural error in the XMP
+            # (like an improperly contained list for example)
+            $exifTool->Warn("Error $err placing $$tagInfo{Name} in structure", 1);
+            delete $structs{$strInfo} unless $oldStruct;
+        } elsif ($tagInfo eq $strInfo) {
+            # just a regular list tag
+            if ($oldStruct) {
+                # keep tag with lowest numbered key (well, not exactly, since
+                # "Tag (10)" is lt "Tag (2)", but at least "Tag" is lt
+                # everything else, and this is really what we care about)
+                my $k = $listKeys{$oldStruct};
+                $k lt $key and $exifTool->DeleteTag($key), next;
+                $exifTool->DeleteTag($k);   # remove tag with greater copy number
+            }
+            # replace existing value with new list
+            $$exifTool{VALUE}{$key} = $structs{$strInfo};
+            $listKeys{$structs{$strInfo}} = $key;   # save key for this list tag
+        } else {
+            # save strInfo ref and file order
+            $var{$strInfo} = [ $strInfo, $$exifTool{FILE_ORDER}{$key} ];
+            $exifTool->DeleteTag($key);
+        }
+    }
+    # fill in undefined items in lists.  In theory, undefined list items should
+    # be fine, but in practice the calling code may not check for this (and
+    # historically this wasn't necessary, so do this for backward compatibility)
+    foreach $si (keys %lists) {
+        defined $_ or $_ = '' foreach @{$lists{$si}};
+    }
+    # save new structure tags
+    foreach $si (keys %structs) {
+        next unless $var{$si};  # already handled regular lists
+        $key = $exifTool->FoundTag($var{$si}[0], '');
+        $$exifTool{VALUE}{$key} = $structs{$si};
+        $$exifTool{FILE_ORDER}{$key} = $var{$si}[1];
+    }
+}
+
+
+1;  #end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::XMPStruct.pl - XMP structure support
+
+=head1 SYNOPSIS
+
+This module is loaded automatically by Image::ExifTool when required.
+
+=head1 DESCRIPTION
+
+This file contains routines to provide read/write support of structured XMP
+information.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/XMP Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/ZIP.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/ZIP.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/ZIP.pm	(revision 24799)
@@ -0,0 +1,596 @@
+#------------------------------------------------------------------------------
+# File:         ZIP.pm
+#
+# Description:  Read ZIP archive meta information
+#
+# Revisions:    10/28/2007 - P. Harvey Created
+#
+# References:   1) http://www.pkware.com/documents/casestudies/APPNOTE.TXT
+#               2) http://www.cpanforum.com/threads/9046
+#               3) http://www.gzip.org/zlib/rfc-gzip.html
+#               4) http://DataCompression.info/ArchiveFormats/RAR202.txt
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::ZIP;
+
+use strict;
+use vars qw($VERSION $warnString);
+use Image::ExifTool qw(:DataAccess :Utils);
+
+$VERSION = '1.07';
+
+sub WarnProc($) { $warnString = $_[0]; }
+
+# file types for recognized Open Document "mimetype" values
+my %openDocType = (
+    'application/vnd.oasis.opendocument.presentation' => 'ODP',
+    'application/vnd.oasis.opendocument.spreadsheet'  => 'ODS',
+    'application/vnd.oasis.opendocument.text'         => 'ODT',
+);
+
+# ZIP metadata blocks
+%Image::ExifTool::ZIP::Main = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Other' },
+    FORMAT => 'int16u',
+    NOTES => q{
+        The following tags are extracted from ZIP archives.  ExifTool also extracts
+        additional meta information from compressed documents inside some ZIP-based
+        files such Office Open XML (DOCX, PPTX and XLSX), Open Document (ODP, ODS
+        and ODT), iWork (KEY, PAGES, NUMBERS), and Capture One Enhanced Image
+        Package (EIP).  The ExifTool family 3 groups may be used to organize the
+        output by embedded document number (ie. the exiftool C<-g3> option).
+    },
+    2 => 'ZipRequiredVersion',
+    3 => {
+        Name => 'ZipBitFlag',
+        PrintConv => '$val ? sprintf("0x%.4x",$val) : $val',
+    },
+    4 => {
+        Name => 'ZipCompression',
+        PrintConv => {
+            0 => 'None',
+            1 => 'Shrunk',
+            2 => 'Reduced with compression factor 1',
+            3 => 'Reduced with compression factor 2',
+            4 => 'Reduced with compression factor 3',
+            5 => 'Reduced with compression factor 4',
+            6 => 'Imploded',
+            7 => 'Tokenized',
+            8 => 'Deflated',
+            9 => 'Enhanced Deflate using Deflate64(tm)',
+           10 => 'Imploded (old IBM TERSE)',
+           12 => 'BZIP2',
+           14 => 'LZMA (EFS)',
+           18 => 'IBM TERSE (new)',
+           19 => 'IBM LZ77 z Architecture (PFS)',
+           96 => 'JPEG recompressed', #2
+           97 => 'WavPack compressed', #2
+           98 => 'PPMd version I, Rev 1',
+       },
+    },
+    5 => {
+        Name => 'ZipModifyDate',
+        Format => 'int32u',
+        Groups => { 2 => 'Time' },
+        ValueConv => sub {
+            my $val = shift;
+            return sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d',
+                ($val >> 25) + 1980, # year
+                ($val >> 21) & 0x0f, # month
+                ($val >> 16) & 0x1f, # day
+                ($val >> 11) & 0x1f, # hour
+                ($val >> 5)  & 0x3f, # minute
+                 $val        & 0x1f  # second
+            );
+        },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    7 => { Name => 'ZipCRC', Format => 'int32u', PrintConv => 'sprintf("0x%.8x",$val)' },
+    9 => { Name => 'ZipCompressedSize',    Format => 'int32u' },
+    11 => { Name => 'ZipUncompressedSize', Format => 'int32u' },
+    13 => {
+        Name => 'ZipFileNameLength',
+        # don't store a tag -- just extract the value for use with ZipFileName
+        Hidden => 1,
+        RawConv => '$$self{ZipFileNameLength} = $val; undef',
+    },
+    # 14 => 'ZipExtraFieldLength',
+    15 => {
+        Name => 'ZipFileName',
+        Format => 'string[$$self{ZipFileNameLength}]',
+    },
+);
+
+# GNU ZIP tags (ref 3)
+%Image::ExifTool::ZIP::GZIP = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Other' },
+    NOTES => q{
+        These tags are extracted from GZIP (GNU ZIP) archives, but currently only
+        for the first file in the archive.
+    },
+    2 => {
+        Name => 'Compression',
+        PrintConv => {
+            8 => 'Deflated',
+        },
+    },
+    3 => {
+        Name => 'Flags',
+        PrintConv => { BITMASK => {
+            0 => 'Text',
+            1 => 'CRC16',
+            2 => 'ExtraFields',
+            3 => 'FileName',
+            4 => 'Comment',
+        }},
+    },
+    4 => {
+        Name => 'ModifyDate',
+        Format => 'int32u',
+        Groups => { 2 => 'Time' },
+        ValueConv => 'ConvertUnixTime($val,1)',
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    8 => {
+        Name => 'ExtraFlags',
+        PrintConv => {
+            0 => '(none)',
+            2 => 'Maximum Compression',
+            4 => 'Fastest Algorithm',
+        },
+    },
+    9 => {
+        Name => 'OperatingSystem',
+        PrintConv => {
+            0 => 'FAT filesystem (MS-DOS, OS/2, NT/Win32)',
+            1 => 'Amiga',
+            2 => 'VMS (or OpenVMS)',
+            3 => 'Unix',
+            4 => 'VM/CMS',
+            5 => 'Atari TOS',
+            6 => 'HPFS filesystem (OS/2, NT)',
+            7 => 'Macintosh',
+            8 => 'Z-System',
+            9 => 'CP/M',
+            10 => 'TOPS-20',
+            11 => 'NTFS filesystem (NT)',
+            12 => 'QDOS',
+            13 => 'Acorn RISCOS',
+            255 => 'unknown',
+        },
+    },
+    10 => 'ArchivedFileName',
+    11 => 'Comment',
+);
+
+# RAR tags (ref 4)
+%Image::ExifTool::ZIP::RAR = (
+    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
+    GROUPS => { 2 => 'Other' },
+    NOTES => 'These tags are extracted from RAR archive files.',
+    0 => {
+        Name => 'CompressedSize',
+        Format => 'int32u',
+    },
+    4 => {
+        Name => 'UncompressedSize',
+        Format => 'int32u',
+    },
+    8 => {
+        Name => 'OperatingSystem',
+        PrintConv => {
+            0 => 'MS-DOS',
+            1 => 'OS/2',
+            2 => 'Win32',
+            3 => 'Unix',
+        },
+    },
+    13 => {
+        Name => 'ModifyDate',
+        Format => 'int32u',
+        Groups => { 2 => 'Time' },
+        ValueConv => sub {
+            my $val = shift;
+            return sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d',
+                ($val >> 25) + 1980, # year
+                ($val >> 21) & 0x0f, # month
+                ($val >> 16) & 0x1f, # day
+                ($val >> 11) & 0x1f, # hour
+                ($val >> 5)  & 0x3f, # minute
+                 $val        & 0x1f  # second
+            );
+        },
+        PrintConv => '$self->ConvertDateTime($val)',
+    },
+    18 => {
+        Name => 'PackingMethod',
+        PrintHex => 1,
+        PrintConv => {
+            0x30 => 'Stored',
+            0x31 => 'Fastest',
+            0x32 => 'Fast',
+            0x33 => 'Normal',
+            0x34 => 'Good Compression',
+            0x35 => 'Best Compression',
+        },
+    },
+    19 => {
+        Name => 'FileNameLength',
+        Format => 'int16u',
+        Hidden => 1,
+        RawConv => '$$self{FileNameLength} = $val; undef',
+    },
+    25 => {
+        Name => 'ArchivedFileName',
+        Format => 'string[$$self{FileNameLength}]',
+    },
+);
+
+#------------------------------------------------------------------------------
+# Extract information from a RAR file (ref 4)
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 on success, 0 if this wasn't a valid RAR file
+sub ProcessRAR($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my ($flags, $buff);
+
+    return 0 unless $raf->Read($buff, 7) and $buff eq "Rar!\x1a\x07\0";
+
+    $exifTool->SetFileType();
+    SetByteOrder('II');
+    my $tagTablePtr = GetTagTable('Image::ExifTool::ZIP::RAR');
+    my $docNum = 0;
+
+    for (;;) {
+        # read block header
+        $raf->Read($buff, 7) == 7 or last;
+        my ($type, $flags, $size) = unpack('xxCvv', $buff);
+        $size -= 7;
+        if ($flags & 0x8000) {
+            $raf->Read($buff, 4) == 4 or last;
+            $size += unpack('V',$buff) - 4;
+        }
+        last if $size < 0;
+        next unless $size;  # ignore blocks with no data
+        # don't try to read very large blocks unless LargeFileSupport is enabled
+        if ($size > 0x80000000 and not $exifTool->Options('LargeFileSupport')) {
+            $exifTool->Warn('Large block encountered. Aborting.');
+            last;
+        }
+        # process the block
+        if ($type == 0x74) { # file block
+            # read maximum 4 KB from a file block
+            my $n = $size > 4096 ? 4096 : $size;
+            $raf->Read($buff, $n) == $n or last;
+            # add compressed size to start of data so we can extract it with the other tags
+            $buff = pack('V',$size) . $buff;
+            $$exifTool{DOC_NUM} = ++$docNum;
+            $exifTool->ProcessDirectory({ DataPt => \$buff }, $tagTablePtr);
+            $size -= $n;
+        } elsif ($type == 0x75 and $size > 6) { # comment block
+            $raf->Read($buff, $size) == $size or last;
+            # save comment, only if "Stored" (this is untested)
+            if (Get8u(\$buff, 3) == 0x30) {
+                $exifTool->FoundTag('Comment', substr($buff, 6));
+            }
+            next;
+        }
+        # seek to the start of the next block
+        $raf->Seek($size, 1) or last if $size;
+    }
+    $$exifTool{DOC_NUM} = 0;
+
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Extract information from a GNU ZIP file (ref 3)
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 on success, 0 if this wasn't a valid GZIP file
+sub ProcessGZIP($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my ($flags, $buff);
+
+    return 0 unless $raf->Read($buff, 10) and $buff =~ /^\x1f\x8b\x08/;
+
+    $exifTool->SetFileType();
+    SetByteOrder('II');
+
+    my $tagTablePtr = GetTagTable('Image::ExifTool::ZIP::GZIP');
+    $exifTool->HandleTag($tagTablePtr, 2, Get8u(\$buff, 2));
+    $exifTool->HandleTag($tagTablePtr, 3, $flags = Get8u(\$buff, 3));
+    $exifTool->HandleTag($tagTablePtr, 4, Get32u(\$buff, 4));
+    $exifTool->HandleTag($tagTablePtr, 8, Get8u(\$buff, 8));
+    $exifTool->HandleTag($tagTablePtr, 9, Get8u(\$buff, 9));
+
+    # extract file name and comment if they exist
+    if ($flags & 0x18) {
+        if ($flags & 0x04) {
+            # skip extra field
+            $raf->Read($buff, 2) == 2 or return 1;
+            my $len = Get16u(\$buff, 0);
+            $raf->Read($buff, $len) == $len or return 1;
+        }
+        $raf->Read($buff, 4096) or return 1;
+        my $pos = 0;
+        my $tagID;
+        # loop for ArchivedFileName (10) and Comment (11) tags
+        foreach $tagID (10, 11) {
+            my $mask = $tagID == 10 ? 0x08 : 0x10;
+            next unless $flags & $mask;
+            my $end = $buff =~ /\0/g ? pos($buff) - 1 : length($buff);
+            # (the doc specifies the string should be ISO 8859-1,
+            # but in OS X it seems to be UTF-8, so don't translate
+            # it because I could just as easily screw it up)
+            my $str = substr($buff, $pos, $end - $pos);
+            $exifTool->HandleTag($tagTablePtr, $tagID, $str);
+            last if $end >= length $buff;
+            $pos = $end + 1;
+        }
+    }
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Call HandleTags for attributes of an Archive::Zip member
+# Inputs: 0) ExifTool object ref, 1) member ref, 2) optional tag table ref
+sub HandleMember($$;$)
+{
+    my ($exifTool, $member, $tagTablePtr) = @_;
+    $tagTablePtr or  $tagTablePtr = GetTagTable('Image::ExifTool::ZIP::Main');
+    $exifTool->HandleTag($tagTablePtr, 2, $member->versionNeededToExtract());
+    $exifTool->HandleTag($tagTablePtr, 3, $member->bitFlag());
+    $exifTool->HandleTag($tagTablePtr, 4, $member->compressionMethod());
+    $exifTool->HandleTag($tagTablePtr, 5, $member->lastModFileDateTime());
+    $exifTool->HandleTag($tagTablePtr, 7, $member->crc32());
+    $exifTool->HandleTag($tagTablePtr, 9, $member->compressedSize());
+    $exifTool->HandleTag($tagTablePtr, 11, $member->uncompressedSize());
+    $exifTool->HandleTag($tagTablePtr, 15, $member->fileName());
+}
+
+#------------------------------------------------------------------------------
+# Extract information from an ZIP file
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 on success, 0 if this wasn't a valid ZIP file
+sub ProcessZIP($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $raf = $$dirInfo{RAF};
+    my ($buff, $buf2, $zip, $docNum);
+
+    return 0 unless $raf->Read($buff, 30) and $buff =~ /^PK\x03\x04/;
+
+    my $tagTablePtr = GetTagTable('Image::ExifTool::ZIP::Main');
+
+    # use Archive::Zip if avilable
+    for (;;) {
+        unless (eval 'require Archive::Zip' and eval 'require IO::File') {
+            if ($$exifTool{FILE_EXT} and $$exifTool{FILE_EXT} ne 'ZIP') {
+                $exifTool->Warn("Install Archive::Zip to decode compressed ZIP information");
+            }
+            last;
+        }
+        # Archive::Zip requires a seekable IO::File object
+        my $fh = $raf->{FILE_PT};
+        if ($fh and seek($fh, 0, 0)) {
+            unless (eval 'require IO::File') {
+                # (this shouldn't happen because IO::File is a prerequisite of Archive::Zip)
+                $exifTool->Warn("Install IO::File to decode compressed ZIP information");
+                last;
+            }
+            bless $fh, 'IO::File';  # Archive::Zip expects an IO::File object
+        } elsif (eval 'require IO::String') {
+            # read the whole file into memory (what else can I do?)
+            $raf->Slurp();
+            $fh = new IO::String ${$raf->{BUFF_PT}};
+        } else {
+            my $type = $fh ? 'pipe or socket' : 'scalar reference';
+            $exifTool->Warn("Install IO::String to decode compressed ZIP information from a $type");
+            last;
+        }
+        $exifTool->VPrint(1, "  --- using Archive::Zip ---\n");
+        $zip = new Archive::Zip;
+        # catch all warnings! (Archive::Zip is bad for this)
+        local $SIG{'__WARN__'} = \&WarnProc;
+        my $status = $zip->readFromFileHandle($fh);
+        if ($status) {
+            undef $zip;
+            my %err = ( 1=>'Stream end error', 3=>'Format error', 4=>'IO error' );
+            my $err = $err{$status} || "Error $status";
+            $exifTool->Warn("$err reading ZIP file");
+            last;
+        }
+        $$dirInfo{ZIP} = $zip;
+
+        # check for an Office Open file (DOCX, etc)
+        # --> read '[Content_Types].xml' to determine the file type
+        my ($mime, @members);
+        my $cType = $zip->memberNamed('[Content_Types].xml');
+        if ($cType) {
+            ($buff, $status) = $zip->contents($cType);
+            if (not $status and $buff =~ /ContentType\s*=\s*(['"])([^"']+)\.main(\+xml)?\1/) {
+                $mime = $2;
+            }
+        }
+        # check for docProps if we couldn't find a MIME type
+        $mime or @members = $zip->membersMatching('^docProps/.*\.(xml|XML)$');
+        if ($mime or @members) {
+            $$dirInfo{MIME} = $mime;
+            require Image::ExifTool::OOXML;
+            Image::ExifTool::OOXML::ProcessDOCX($exifTool, $dirInfo);
+            delete $$dirInfo{MIME};
+            last;
+        }
+
+        # check for an EIP file
+        @members = $zip->membersMatching('^CaptureOne/.*\.(cos|COS)$');
+        if (@members) {
+            require Image::ExifTool::CaptureOne;
+            Image::ExifTool::CaptureOne::ProcessEIP($exifTool, $dirInfo);
+            last;
+        }
+
+        # check for an iWork file
+        @members = $zip->membersMatching('^(index\.(xml|apxl)|QuickLook/Thumbnail\.jpg)$');
+        if (@members) {
+            require Image::ExifTool::iWork;
+            Image::ExifTool::iWork::Process_iWork($exifTool, $dirInfo);
+            last;
+        }
+
+        # check for an Open Document file
+        my $mType = $zip->memberNamed('mimetype');
+        if ($mType) {
+            ($mime, $status) = $zip->contents($mType);
+            unless ($status) {
+                chomp $mime;
+                if ($openDocType{$mime}) {
+                    $exifTool->SetFileType($openDocType{$mime}, $mime);
+                    # extract Open Document metadata from "meta.xml"
+                    my $meta = $zip->memberNamed('meta.xml');
+                    if ($meta) {
+                        ($buff, $status) = $zip->contents($meta);
+                        unless ($status) {
+                            my %dirInfo = (
+                                DataPt => \$buff,
+                                DirLen => length $buff,
+                                DataLen => length $buff,
+                            );
+                            my $xmpTable = GetTagTable('Image::ExifTool::XMP::Main');
+                            $exifTool->ProcessDirectory(\%dirInfo, $xmpTable);
+                        }
+                    }
+                    # extract preview image(s) from "Thumbnails" directory
+                    my $type;
+                    my %tag = ( jpg => 'PreviewImage', png => 'PreviewPNG' );
+                    foreach $type ('jpg', 'png') {
+                        my $thumb = $zip->memberNamed("Thumbnails/thumbnail.$type");
+                        next unless $thumb;
+                        ($buff, $status) = $zip->contents($thumb);
+                        $exifTool->FoundTag($tag{$type}, $buff) unless $status;
+                    }
+                    last;
+                }
+            }
+        }
+
+        # otherwise just extract general ZIP information
+        $exifTool->SetFileType();
+        @members = $zip->members();
+        $docNum = 0;
+        my $member;
+        foreach $member (@members) {
+            $$exifTool{DOC_NUM} = ++$docNum;
+            HandleMember($exifTool, $member, $tagTablePtr);
+        }
+        last;
+    }
+    # all done if we processed this using Archive::Zip
+    if ($zip) {
+        delete $$dirInfo{ZIP};
+        delete $$exifTool{DOC_NUM};
+        return 1;
+    }
+#
+# process the ZIP file by hand (funny, but this seems easier than using Archive::Zip)
+#
+    $docNum = 0;
+    $exifTool->VPrint(1, "  -- processing as binary data --\n");
+    $raf->Seek(30, 0);
+    $exifTool->SetFileType();
+    SetByteOrder('II');
+
+    #  A.  Local file header:
+    #  local file header signature     0) 4 bytes  (0x04034b50)
+    #  version needed to extract       4) 2 bytes
+    #  general purpose bit flag        6) 2 bytes
+    #  compression method              8) 2 bytes
+    #  last mod file time             10) 2 bytes
+    #  last mod file date             12) 2 bytes
+    #  crc-32                         14) 4 bytes
+    #  compressed size                18) 4 bytes
+    #  uncompressed size              22) 4 bytes
+    #  file name length               26) 2 bytes
+    #  extra field length             28) 2 bytes
+    for (;;) {
+        my $len = Get16u(\$buff, 26) + Get16u(\$buff, 28);
+        $raf->Read($buf2, $len) == $len or last;
+
+        $$exifTool{DOC_NUM} = ++$docNum;
+        $buff .= $buf2;
+        my %dirInfo = (
+            DataPt => \$buff,
+            DataPos => $raf->Tell() - 30 - $len,
+            DataLen => 30 + $len,
+            DirStart => 0,
+            DirLen => 30 + $len,
+        );
+        $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+        my $flags = Get16u(\$buff, 6);
+        if ($flags & 0x08) {
+            # we don't yet support skipping stream mode data
+            # (when this happens, the CRC, compressed size and uncompressed
+            #  sizes are set to 0 in the header.  Instead, they are stored
+            #  after the compressed data with an optional header of 0x08074b50)
+            $exifTool->Warn('Stream mode data encountered, file list may be incomplete');
+            last;
+        }
+        $len = Get32u(\$buff, 18);      # file data length
+        $raf->Seek($len, 1) or last;    # skip file data
+        $raf->Read($buff, 30) == 30 and $buff =~ /^PK\x03\x04/ or last;
+    }
+    delete $$exifTool{DOC_NUM};
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::ZIP - Read ZIP archive meta information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to extract meta
+information from ZIP, GZIP and RAR archives.  This includes ZIP-based file
+types like DOCX, PPTX, XLSX, ODP, ODS, ODT and EIP.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 REFERENCES
+
+=over 4
+
+=item L<http://www.pkware.com/documents/casestudies/APPNOTE.TXT>
+
+=item L<http://www.gzip.org/zlib/rfc-gzip.html>
+
+=item L<http://DataCompression.info/ArchiveFormats/RAR202.txt>
+
+=back
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/ZIP Tags>,
+L<Image::ExifTool::TagNames/OOXML Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/iWork.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/iWork.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/iWork.pm	(revision 24799)
@@ -0,0 +1,223 @@
+#------------------------------------------------------------------------------
+# File:         iWork.pm
+#
+# Description:  Read Apple iWork '09 XML+ZIP files
+#
+# Revisions:    2009/11/11 - P. Harvey Created
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::iWork;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::XMP;
+use Image::ExifTool::ZIP;
+
+$VERSION = '1.02';
+
+# test for recognized iWork document extensions and outter XML elements
+my %iWorkType = (
+    # file extensions
+    NUMBERS => 'Apple Numbers',
+    PAGES   => 'Apple Pages',
+    KEY     => 'Apple Keynote',
+    KTH     => 'Apple Keynote Theme',
+    NMBTEMPLATE => 'Apple Numbers Template',
+    # we don't support double extensions --
+    # "PAGES.TEMPLATE" => 'Apple Pages Template',
+    # outter XML elements
+    'ls:document' => 'Apple Numbers',
+    'sl:document' => 'Apple Pages',
+    'key:presentation' => 'Apple Keynote',
+);
+
+# MIME types for iWork files (Apple has not registered these yet, but these
+# are my best guess after doing some googling.  I'm not 100% sure what "sff"
+# indicates, but I think it refers to the new "flattened" package format)
+my %mimeType = (
+    'Apple Numbers' => 'application/x-iwork-numbers-sffnumbers',
+    'Apple Pages'   => 'application/x-iwork-pages-sffpages',
+    'Apple Keynote' => 'application/x-iWork-keynote-sffkey',
+    'Apple Numbers Template' => 'application/x-iwork-numbers-sfftemplate',
+    'Apple Pages Template'   => 'application/x-iwork-pages-sfftemplate',
+    'Apple Keynote Theme'    => 'application/x-iWork-keynote-sffkth',
+);
+
+# iWork tags
+%Image::ExifTool::iWork::Main = (
+    GROUPS => { 0 => 'XML', 1 => 'XML', 2 => 'Document' },
+    PROCESS_PROC => \&Image::ExifTool::XMP::ProcessXMP,
+    VARS => { NO_ID => 1 },
+    NOTES => q{
+        The Apple iWork '09 file format is a ZIP archive containing XML files
+        similar to the Office Open XML (OOXML) format.  Metadata tags in iWork
+        files are extracted even if they don't appear below.
+    },
+    authors   => { Name => 'Author', Groups => { 2 => 'Author' } },
+    comment   => { },
+    copyright => { Groups => { 2 => 'Author' } },
+    keywords  => { },
+    projects  => { List => 1 },
+    title     => { },
+);
+
+#------------------------------------------------------------------------------
+# Generate a tag ID for this XML tag
+# Inputs: 0) tag property name list ref
+# Returns: tagID
+sub GetTagID($)
+{
+    my $props = shift;
+    return 0 if $$props[-1] =~ /^\w+:ID$/;  # ignore ID tags
+    return ($$props[0] =~ /.*?:(.*)/) ? $1 : $$props[0];
+}
+
+#------------------------------------------------------------------------------
+# We found an XMP property name/value
+# Inputs: 0) ExifTool object ref, 1) tag table ref
+#         2) reference to array of XMP property names (last is current property)
+#         3) property value, 4) attribute hash ref (not used here)
+# Returns: 1 if valid tag was found
+sub FoundTag($$$$;$)
+{
+    my ($exifTool, $tagTablePtr, $props, $val, $attrs) = @_;
+    return 0 unless @$props;
+    my $verbose = $exifTool->Options('Verbose');
+
+    $exifTool->VPrint(0, "  | - Tag '", join('/',@$props), "'\n") if $verbose > 1;
+
+    # un-escape XML character entities
+    $val = Image::ExifTool::XMP::UnescapeXML($val);
+    # convert from UTF8 to ExifTool Charset
+    $val = $exifTool->Decode($val, 'UTF8');
+    my $tag = GetTagID($props) or return 0;
+
+    # add any unknown tags to table
+    unless ($$tagTablePtr{$tag}) {
+        $exifTool->VPrint(0, "  [adding $tag]\n") if $verbose;
+        Image::ExifTool::AddTagToTable($tagTablePtr, $tag, { Name => ucfirst $tag });
+    }
+    # save the tag
+    $exifTool->HandleTag($tagTablePtr, $tag, $val);
+
+    return 1;
+}
+
+#------------------------------------------------------------------------------
+# Extract information from an iWork file
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1
+# Notes: Upon entry to this routine, the file type has already been verified
+# as ZIP and the dirInfo hash contains a 'ZIP' Archive::Zip object reference
+sub Process_iWork($$)
+{
+    my ($exifTool, $dirInfo) = @_;
+    my $zip = $$dirInfo{ZIP};
+    my ($type, $index, $indexFile, $status);
+
+    # try to determine the file type
+    local $SIG{'__WARN__'} = \&Image::ExifTool::ZIP::WarnProc;
+    # trust type given by file extension if available
+    $type = $iWorkType{$$exifTool{FILE_EXT}} if $$exifTool{FILE_EXT};
+    unless ($type) {
+        # read the index file
+        my @members = $zip->membersMatching('^index\.(xml|apxl)$');
+        if (@members) {
+            ($index, $status) = $zip->contents($members[0]);
+            unless ($status) {
+                $indexFile = $members[0]->fileName();
+                if ($index =~ /^\s*<\?xml version=[^<]+<(\w+:\w+)/s) {
+                    $type = $iWorkType{$1} if $iWorkType{$1};
+                }
+            }
+        }
+        $type or $type = 'ZIP';     # assume ZIP by default
+    }
+    $exifTool->SetFileType($type, $mimeType{$type});
+
+    my @members = $zip->members();
+    my $docNum = 0;
+    my $member;
+    foreach $member (@members) {
+        # get filename of this ZIP member
+        my $file = $member->fileName();
+        next unless defined $file;
+        $exifTool->VPrint(0, "File: $file\n");
+        # set the document number and extract ZIP tags
+        $$exifTool{DOC_NUM} = ++$docNum;
+        Image::ExifTool::ZIP::HandleMember($exifTool, $member);
+
+        # process only the index XML and JPEG thumbnail files
+        next unless $file =~ m{^(index\.(xml|apxl)|QuickLook/Thumbnail\.jpg)$}i;
+        # get the file contents if necessary
+        # (CAREFUL! $buff MUST be local since we hand off a value ref to PreviewImage)
+        my ($buff, $buffPt);
+        if ($indexFile and $indexFile eq $file) {
+            # use the index file we already loaded
+            $buffPt = \$index;
+        } else {
+            ($buff, $status) = $zip->contents($member);
+            $status and $exifTool->Warn("Error extracting $file"), next;
+            $buffPt = \$buff;
+        }
+        # extract JPEG as PreviewImage (should only be QuickLook/Thumbnail.jpg)
+        if ($file =~ /\.jpg$/) {
+            $exifTool->FoundTag('PreviewImage', $buffPt);
+            next;
+        }
+        # process "metadata" section of XML index file
+        next unless $$buffPt =~ /<(\w+):metadata>/g;
+        my $ns = $1;
+        my $p1 = pos $$buffPt;
+        next unless $$buffPt =~ m{</${ns}:metadata>}g;
+        # construct XML data from "metadata" section only
+        $$buffPt = '<?xml version="1.0"?>' . substr($$buffPt, $p1, pos($$buffPt)-$p1);
+        my %dirInfo = (
+            DataPt => $buffPt,
+            DirLen => length $$buffPt,
+            DataLen => length $$buffPt,
+            XMPParseOpts => {
+                FoundProc => \&FoundTag,
+            },
+        );
+        my $tagTablePtr = GetTagTable('Image::ExifTool::iWork::Main');
+        $exifTool->ProcessDirectory(\%dirInfo, $tagTablePtr);
+        undef $$buffPt; # (free memory now)
+    }
+    delete $$exifTool{DOC_NUM};
+    return 1;
+}
+
+1;  # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::iWork - Read Apple iWork '09 XML+ZIP files
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to extract meta
+information from Apple iWork '09 XML+ZIP files.
+
+=head1 AUTHOR
+
+Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/iWork Tags>,
+L<Image::ExifTool::TagNames/OOXML Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/Size.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/Size.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/Size.pm	(revision 24799)
@@ -0,0 +1,1140 @@
+###############################################################################
+#
+# This file copyright (c) 2000 by Randy J. Ray, all rights reserved
+#
+# Copying and distribution are permitted under the terms of the Artistic
+# License as distributed with Perl versions 5.005 and later.
+#
+###############################################################################
+#
+# Once upon a time, this code was lifted almost verbatim from wwwis by Alex
+# Knowles, alex@ed.ac.uk. Since then, even I barely recognize it. It has
+# contributions, fixes, additions and enhancements from all over the world.
+#
+# See the file README for change history.
+#
+###############################################################################
+
+package Image::Size;
+
+# require 5.6.0;
+require 5.006_000;
+
+use strict;
+use bytes;
+use Cwd ();
+use File::Spec ();
+use Symbol ();
+use AutoLoader 'AUTOLOAD';
+require Exporter;
+
+our (@ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS, $revision, $VERSION, $NO_CACHE,
+     $GIF_BEHAVIOR, %PCD_MAP, $PCD_SCALE, $read_in, $last_pos);
+
+BEGIN
+{
+
+    @ISA         = qw(Exporter);
+    @EXPORT      = qw(imgsize);
+    @EXPORT_OK   = qw(imgsize html_imgsize attr_imgsize $NO_CACHE $PCD_SCALE
+                      $GIF_BEHAVIOR);
+    %EXPORT_TAGS = ('all' => [ @EXPORT_OK ]);
+
+    $VERSION = "3.01";
+
+    # Default behavior for GIFs is to return the "screen" size
+    $GIF_BEHAVIOR = 0;
+
+}
+
+# This allows people to specifically request that the cache not be used
+$NO_CACHE = 0;
+
+# Package lexicals - invisible to outside world, used only in imgsize
+#
+# Cache of files seen, and mapping of patterns to the sizing routine
+my %cache = ();
+my %type_map = ( '^GIF8[7,9]a'              => \&gifsize,
+                 "^\xFF\xD8"                => \&jpegsize,
+                 "^\x89PNG\x0d\x0a\x1a\x0a" => \&pngsize,
+                 "^P[1-7]"                  => \&ppmsize, # also XVpics
+                 '\#define\s+\S+\s+\d+'     => \&xbmsize,
+                 '\/\* XPM \*\/'            => \&xpmsize,
+                 '^MM\x00\x2a'              => \&tiffsize,
+                 '^II\x2a\x00'              => \&tiffsize,
+                 '^BM'                      => \&bmpsize,
+                 '^8BPS'                    => \&psdsize,
+                 '^PCD_OPA'                 => \&pcdsize,
+                 '^FWS'                     => \&swfsize,
+                 '^CWS'                     => \&swfmxsize,
+                 "^\x8aMNG\x0d\x0a\x1a\x0a" => \&mngsize);
+# Kodak photo-CDs are weird. Don't ask me why, you really don't want details.
+%PCD_MAP = ( 'base/16' => [ 192,  128  ],
+             'base/4'  => [ 384,  256  ],
+             'base'    => [ 768,  512  ],
+             'base4'   => [ 1536, 1024 ],
+             'base16'  => [ 3072, 2048 ],
+             'base64'  => [ 6144, 4096 ] );
+# Default scale for PCD images
+$PCD_SCALE = 'base';
+
+#
+# These are lexically-scoped anonymous subroutines for reading the three
+# types of input streams. When the input to imgsize() is typed, then the
+# lexical "read_in" is assigned one of these, thus allowing the individual
+# routines to operate on these streams abstractly.
+#
+
+my $read_io = sub {
+    my $handle = shift;
+    my ($length, $offset) = @_;
+
+    if (defined($offset) && ($offset != $last_pos))
+    {
+        $last_pos = $offset;
+        return '' if (! seek($handle, $offset, 0));
+    }
+
+    my ($data, $rtn) = ('', 0);
+    $rtn = read $handle, $data, $length;
+    $data = '' unless ($rtn);
+    $last_pos = tell $handle;
+
+    $data;
+};
+
+my $read_buf = sub {
+    my $buf = shift;
+    my ($length, $offset) = @_;
+
+    if (defined($offset) && ($offset != $last_pos))
+    {
+        $last_pos = $offset;
+        return '' if ($last_pos > length($$buf));
+    }
+
+    my $data = substr($$buf, $last_pos, $length);
+    $last_pos += length($data);
+
+    $data;
+};
+
+sub imgsize
+{
+    my $stream = shift;
+
+    my ($handle, $header);
+    my ($x, $y, $id, $mtime, @list);
+    # These only used if $stream is an existant open FH
+    my ($save_pos, $need_restore) = (0, 0);
+    # This is for when $stream is a locally-opened file
+    my $need_close = 0;
+    # This will contain the file name, if we got one
+    my $file_name = undef;
+
+    $header = '';
+
+    if (ref($stream) eq "SCALAR")
+    {
+        $handle = $stream;
+        $read_in = $read_buf;
+        $header = substr(($$handle || ''), 0, 256);
+    }
+    elsif (ref $stream)
+    {
+        #
+        # I no longer require $stream to be in the IO::* space. So I'm assuming
+        # you don't hose yourself by passing a ref that can't do fileops. If
+        # you do, you fix it.
+        #
+        $handle = $stream;
+        $read_in = $read_io;
+        $save_pos = tell $handle;
+        $need_restore = 1;
+
+        #
+        # First alteration (didn't wait long, did I?) to the existant handle:
+        #
+        # assist dain-bramaged operating systems -- SWD
+        # SWD: I'm a bit uncomfortable with changing the mode on a file
+        # that something else "owns" ... the change is global, and there
+        # is no way to reverse it.
+        # But image files ought to be handled as binary anyway.
+        #
+        binmode($handle);
+        seek($handle, 0, 0);
+        read $handle, $header, 256;
+        seek($handle, 0, 0);
+    }
+    else
+    {
+        unless ($NO_CACHE)
+        {
+            $stream = File::Spec->catfile(Cwd::cwd(),$stream)
+                unless File::Spec->file_name_is_absolute($stream);
+            $mtime = (stat $stream)[9];
+            if (-e "$stream" and exists $cache{$stream})
+            {
+                @list = split(/,/, $cache{$stream}, 4);
+
+                # Don't return the cache if the file is newer.
+                return @list[1 .. 3] unless ($list[0] < $mtime);
+                # In fact, clear it
+                delete $cache{$stream};
+            }
+        }
+
+        #first try to open the stream
+        $handle = Symbol::gensym();
+        open($handle, "< $stream") or
+            return (undef, undef, "Can't open image file $stream: $!");
+
+        $need_close = 1;
+        # assist dain-bramaged operating systems -- SWD
+        binmode($handle);
+        read $handle, $header, 256;
+        seek($handle, 0, 0);
+        $read_in = $read_io;
+        $file_name = $stream;
+    }
+    $last_pos = 0;
+
+    #
+    # Oh pessimism... set the values of $x and $y to the error condition. If
+    # the grep() below matches the data to one of the known types, then the
+    # called subroutine will override these...
+    #
+    $id = "Data stream is not a known image file format";
+    $x  = undef;
+    $y  = undef;
+
+    grep($header =~ /$_/ && (($x, $y, $id) = &{$type_map{$_}}($handle)),
+         keys %type_map);
+
+    #
+    # Added as an afterthought: I'm probably not the only one who uses the
+    # same shaded-sphere image for several items on a bulleted list:
+    #
+    $cache{$stream} = join(',', $mtime, $x, $y, $id)
+        unless ($NO_CACHE or (ref $stream) or (! defined $x));
+
+    #
+    # If we were passed an existant file handle, we need to restore the
+    # old filepos:
+    #
+    seek($handle, $save_pos, 0) if $need_restore;
+    # ...and if we opened the file ourselves, we need to close it
+    close($handle) if $need_close;
+
+    #
+    # Image::Magick operates on file names.
+    #
+    if ($file_name && ! defined($x) && ! defined($y)) {
+        ($x, $y, $id) = imagemagick_size($file_name);
+    }
+
+
+    # results:
+    return (wantarray) ? ($x, $y, $id) : ();
+}
+
+sub imagemagick_size {
+    my $module_name;
+    # First see if we have already loaded Graphics::Magick or Image::Magick
+    # If so, just use whichever one is already loaded.
+    if (exists $INC{'Graphics/Magick.pm'}) {
+        $module_name = 'Graphics::Magick';
+    }
+    elsif (exists $INC{'Image/Magick.pm'}) {
+        $module_name = 'Image::Magick';
+    }
+
+    # If neither are already loaded, try loading either one.
+    elsif ( _load_magick_module('Graphics::Magick') ) {
+       $module_name = 'Graphics::Magick';
+    }
+    elsif ( _load_magick_module('Image::Magick') ) {
+       $module_name = 'Image::Magick';
+    }
+
+    if ($module_name) {
+        my ($file_name) = @_;
+        my $img = $module_name->new();
+        my $x = $img->Read($file_name);
+        # Image::Magick error handling is a bit weird, see
+        # <http://www.simplesystems.org/ImageMagick/www/perl.html#erro>
+        if("$x") {
+            return (undef, undef, "$x");
+        } else {
+            return ($img->Get('width', 'height', 'format'));
+        }
+
+    }
+    else {
+        return (undef, undef, "Data stream is not a known image file format");
+    }
+}
+
+# load Graphics::Magick or Image::Magick if one is not already loaded. 
+sub _load_magick_module {
+    my $module_name = shift;
+    eval {
+        local $SIG{__DIE__};
+        require $module_name;
+    };
+    return !$@;
+}
+
+
+sub html_imgsize
+{
+    my @args = imgsize(@_);
+
+    # Use lowercase and quotes so that it works with xhtml.
+    return ((defined $args[0]) ?
+            sprintf('width="%d" height="%d"', @args) :
+            undef);
+}
+
+sub attr_imgsize
+{
+    my @args = imgsize(@_);
+
+    return ((defined $args[0]) ?
+            (('-width', '-height', @args)[0, 2, 1, 3]) :
+            undef);
+}
+
+# This used only in gifsize:
+sub img_eof
+{
+    my $stream = shift;
+
+    return ($last_pos >= length($$stream)) if (ref($stream) eq "SCALAR");
+
+    eof $stream;
+}
+
+# Simple converter-routine used by SWF and CWS code
+sub _bin2int { unpack("N", pack("B32", substr("0" x 32 . shift, -32))); }
+
+=head1 NAME
+
+Image::Size - read the dimensions of an image in several popular formats
+
+=head1 SYNOPSIS
+
+    use Image::Size;
+    # Get the size of globe.gif
+    ($globe_x, $globe_y) = imgsize("globe.gif");
+    # Assume X=60 and Y=40 for remaining examples
+
+    use Image::Size 'html_imgsize';
+    # Get the size as 'width="X" height="Y"' for HTML generation
+    $size = html_imgsize("globe.gif");
+    # $size == 'width="60" height="40"'
+
+    use Image::Size 'attr_imgsize';
+    # Get the size as a list passable to routines in CGI.pm
+    @attrs = attr_imgsize("globe.gif");
+    # @attrs == ('-width', 60, '-height', 40)
+
+    use Image::Size;
+    # Get the size of an in-memory buffer
+    ($buf_x, $buf_y) = imgsize(\$buf);
+    # Assuming that $buf was the data, imgsize() needed a reference to a scalar
+
+=head1 DESCRIPTION
+
+The B<Image::Size> library is based upon the C<wwwis> script written by
+Alex Knowles I<(alex@ed.ac.uk)>, a tool to examine HTML and add 'width' and
+'height' parameters to image tags. The sizes are cached internally based on
+file name, so multiple calls on the same file name (such as images used
+in bulleted lists, for example) do not result in repeated computations.
+
+B<Image::Size> provides three interfaces for possible import:
+
+=over
+
+=item imgsize(I<stream>)
+
+Returns a three-item list of the X and Y dimensions (width and height, in
+that order) and image type of I<stream>. Errors are noted by undefined
+(B<undef>) values for the first two elements, and an error string in the third.
+The third element can be (and usually is) ignored, but is useful when
+sizing data whose type is unknown.
+
+=item html_imgsize(I<stream>)
+
+Returns the width and height (X and Y) of I<stream> pre-formatted as a single
+string C<'width="X" height="Y"'> suitable for addition into generated HTML IMG
+tags. If the underlying call to C<imgsize> fails, B<undef> is returned. The
+format returned is dually suited to both HTML and XHTML.
+
+=item attr_imgsize(I<stream>)
+
+Returns the width and height of I<stream> as part of a 4-element list useful
+for routines that use hash tables for the manipulation of named parameters,
+such as the Tk or CGI libraries. A typical return value looks like
+C<("-width", X, "-height", Y)>. If the underlying call to C<imgsize> fails,
+B<undef> is returned.
+
+=back
+
+By default, only C<imgsize()> is exported. Any one or combination of the three
+may be explicitly imported, or all three may be with the tag B<:all>.
+
+=head2 Input Types
+
+The sort of data passed as I<stream> can be one of three forms:
+
+=over
+
+=item string
+
+If an ordinary scalar (string) is passed, it is assumed to be a file name
+(either absolute or relative to the current working directory of the
+process) and is searched for and opened (if found) as the source of data.
+Possible error messages (see DIAGNOSTICS below) may include file-access
+problems.
+
+=item scalar reference
+
+If the passed-in stream is a scalar reference, it is interpreted as pointing
+to an in-memory buffer containing the image data.
+
+        # Assume that &read_data gets data somewhere (WWW, etc.)
+        $img = &read_data;
+        ($x, $y, $id) = imgsize(\$img);
+        # $x and $y are dimensions, $id is the type of the image
+
+=item Open file handle
+
+The third option is to pass in an open filehandle (such as an object of
+the C<IO::File> class, for example) that has already been associated with
+the target image file. The file pointer will necessarily move, but will be
+restored to its original position before subroutine end.
+
+        # $fh was passed in, is IO::File reference:
+        ($x, $y, $id) = imgsize($fh);
+        # Same as calling with filename, but more abstract.
+
+=back
+
+=head2 Recognized Formats
+
+Image::Size natively understands and sizes data in the following formats:
+
+=over 4
+
+=item GIF
+
+=item JPG
+
+=item XBM
+
+=item XPM
+
+=item PPM family (PPM/PGM/PBM)
+
+=item XV thumbnails
+
+=item PNG
+
+=item MNG
+
+=item TIF
+
+=item BMP
+
+=item PSD (Adobe PhotoShop)
+
+=item SWF (ShockWave/Flash)
+
+=item CWS (FlashMX, compressed SWF, Flash 6)
+
+=item PCD (Kodak PhotoCD, see notes below)
+
+=back
+
+Additionally, if the B<Image::Magick> module is present, the file types
+supported by it are also supported by Image::Size.  See also L<"CAVEATS">.
+
+When using the C<imgsize> interface, there is a third, unused value returned
+if the programmer wishes to save and examine it. This value is the identity of
+the data type, expressed as a 2-3 letter abbreviation as listed above. This is
+useful when operating on open file handles or in-memory data, where the type
+is as unknown as the size.  The two support routines ignore this third return
+value, so those wishing to use it must use the base C<imgsize> routine.
+
+Note that when the B<Image::Magick> fallback is used (for all non-natively
+supported files), the data type identity comes directly from the 'format'
+parameter reported by B<Image::Magick>, so it may not meet the 2-3 letter
+abbreviation format.  For example, a WBMP file might be reported as
+'Wireless Bitmap (level 0) image' in this case.
+
+=head2 Information Cacheing and C<$NO_CACHE>
+
+When a filename is passed to any of the sizing routines, the default behavior
+of the library is to cache the resulting information. The modification-time of
+the file is also recorded, to determine whether the cache should be purged and
+updated. This was originally added due to the fact that a number of CGI
+applications were using this library to generate attributes for pages that
+often used the same graphical element many times over.
+
+However, the cacheing can lead to problems when the files are generated
+dynamically, at a rate that exceeds the resolution of the modification-time
+value on the filesystem. Thus, the optionally-importable control variable
+C<$NO_CACHE> has been introduced. If this value is anything that evaluates to a
+non-false value (be that the value 1, any non-null string, etc.) then the
+cacheing is disabled until such time as the program re-enables it by setting
+the value to false.
+
+The parameter C<$NO_CACHE> may be imported as with the B<imgsize> routine, and
+is also imported when using the import tag B<C<:all>>. If the programmer
+chooses not to import it, it is still accessible by the fully-qualified package
+name, B<$Image::Size::NO_CACHE>.
+
+=head2 Sizing PhotoCD Images
+
+With version 2.95, support for the Kodak PhotoCD image format is
+included. However, these image files are not quite like the others. One file
+is the source of the image in any of a range of pre-set resolutions (all with
+the same aspect ratio). Supporting this here is tricky, since there is nothing
+inherent in the file to limit it to a specific resolution.
+
+The library addresses this by using a scale mapping, and requiring the user
+(you) to specify which scale is preferred for return. Like the C<$NO_CACHE>
+setting described earlier, this is an importable scalar variable that may be
+used within the application that uses B<Image::Size>. This parameter is called
+C<$PCD_SCALE>, and is imported by the same name. It, too, is also imported
+when using the tag B<C<:all>> or may be referenced as
+B<$Image::Size::PCD_SCALE>.
+
+The parameter should be set to one of the following values:
+
+        base/16
+        base/4
+        base
+        base4
+        base16
+        base64
+
+Note that not all PhotoCD disks will have included the C<base64>
+resolution. The actual resolutions are not listed here, as they are constant
+and can be found in any documentation on the PCD format. The value of
+C<$PCD_SCALE> is treated in a case-insensitive manner, so C<base> is the same
+as C<Base> or C<BaSe>. The default scale is set to C<base>.
+
+Also note that the library makes no effort to read enough of the PCD file to
+verify that the requested resolution is available. The point of this library
+is to read as little as necessary so as to operate efficiently. Thus, the only
+real difference to be found is in whether the orientation of the image is
+portrait or landscape. That is in fact all that the library extracts from the
+image file.
+
+=head2 Controlling Behavior with GIF Images
+
+GIF images present a sort of unusual situation when it comes to reading size.
+Because GIFs can be a series of sub-images to be isplayed as an animated
+sequence, what part does the user want to get the size for?
+
+When dealing with GIF files, the user may control the behavior by setting the
+global value B<$Image::Size::GIF_BEHAVIOR>. Like the PCD setting, this may
+be imported when loading the library. Three values are recognized by the
+GIF-handling code:
+
+=over 4
+
+=item 0
+
+This is the default value. When this value is chosen, the returned dimensions
+are those of the "screen". The "screen" is the display area that the GIF
+declares in the first data block of the file. No sub-images will be greater
+than this in size; if they are, the specification dictates that they be
+cropped to fit within the box.
+
+This is also the fastest method for sizing the GIF, as it reads the least
+amount of data from the image stream.
+
+=item 1
+
+If this value is set, then the size of the first sub-image within the GIF is
+returned. For plain (non-animated) GIF files, this would be the same as the
+screen (though it doesn't have to be, strictly-speaking).
+
+When the first image descriptor block is read, the code immediately returns,
+making this only slightly-less efficient than the previous setting.
+
+=item 2
+
+If this value is chosen, then the code loops through all the sub-images of the
+animated GIF, and returns the dimensions of the largest of them.
+
+This option requires that the full GIF image be read, in order to ensure that
+the largest is found.
+
+=back
+
+Any value outside this range will produce an error in the GIF code before any
+image data is read.
+
+The value of dimensions other than the view-port ("screen") is dubious.
+However, some users have asked for that functionality.
+
+=head1 DIAGNOSTICS
+
+The base routine, C<imgsize>, returns B<undef> as the first value in its list
+when an error has occured. The third element contains a descriptive
+error message.
+
+The other two routines simply return B<undef> in the case of error.
+
+=head1 MORE EXAMPLES
+
+The B<attr_imgsize> interface is also well-suited to use with the Tk
+extension:
+
+    $image = $widget->Photo(-file => $img_path, attr_imgsize($img_path));
+
+Since the C<Tk::Image> classes use dashed option names as C<CGI> does, no
+further translation is needed.
+
+This package is also well-suited for use within an Apache web server context.
+File sizes are cached upon read (with a check against the modified time of
+the file, in case of changes), a useful feature for a B<mod_perl> environment
+in which a child process endures beyond the lifetime of a single request.
+Other aspects of the B<mod_perl> environment cooperate nicely with this
+module, such as the ability to use a sub-request to fetch the full pathname
+for a file within the server space. This complements the HTML generation
+capabilities of the B<CGI> module, in which C<CGI::img> wants a URL but
+C<attr_imgsize> needs a file path:
+
+    # Assume $Q is an object of class CGI, $r is an Apache request object.
+    # $imgpath is a URL for something like "/img/redball.gif".
+    $r->print($Q->img({ -src => $imgpath,
+                        attr_imgsize($r->lookup_uri($imgpath)->filename) }));
+
+The advantage here, besides not having to hard-code the server document root,
+is that Apache passes the sub-request through the usual request lifecycle,
+including any stages that would re-write the URL or otherwise modify it.
+
+=head1 CAVEATS
+
+Caching of size data can only be done on inputs that are file names. Open
+file handles and scalar references cannot be reliably transformed into a
+unique key for the table of cache data. Buffers could be cached using the
+MD5 module, and perhaps in the future I will make that an option. I do not,
+however, wish to lengthen the dependancy list by another item at this time.
+
+As B<Image::Magick> operates on file names, not handles, the use of it is
+restricted to cases where the input to C<imgsize> is provided as file name.
+
+=head1 SEE ALSO
+
+The B<Image::Magick> and B<Image::Info> Perl modules at CPAN.
+
+=head1 AUTHORS
+
+Perl module interface by Randy J. Ray I<(rjray@blackperl.com)>, original
+image-sizing code by Alex Knowles I<(alex@ed.ac.uk)> and Andrew Tong
+I<(werdna@ugcs.caltech.edu)>, used with their joint permission.
+
+Some bug fixes submitted by Bernd Leibing I<(bernd.leibing@rz.uni-ulm.de)>.
+PPM/PGM/PBM sizing code contributed by Carsten Dominik
+I<(dominik@strw.LeidenUniv.nl)>. Tom Metro I<(tmetro@vl.com)> re-wrote the JPG
+and PNG code, and also provided a PNG image for the test suite. Dan Klein
+I<(dvk@lonewolf.com)> contributed a re-write of the GIF code.  Cloyce Spradling
+I<(cloyce@headgear.org)> contributed TIFF sizing code and test images. Aldo
+Calpini I<(a.calpini@romagiubileo.it)> suggested support of BMP images (which
+I I<really> should have already thought of :-) and provided code to work
+with. A patch to allow html_imgsize to produce valid output for XHTML, as
+well as some documentation fixes was provided by Charles Levert
+I<(charles@comm.polymtl.ca)>. The ShockWave/Flash support was provided by
+Dmitry Dorofeev I<(dima@yasp.com)>. Though I neglected to take note of who
+supplied the PSD (PhotoShop) code, a bug was identified by Alex Weslowski
+<aweslowski@rpinteractive.com>, who also provided a test image. PCD support
+was adapted from a script made available by Phil Greenspun, as guided to my
+attention by Matt Mueller I<mueller@wetafx.co.nz>. A thorough read of the
+documentation and source by Philip Newton I<Philip.Newton@datenrevision.de>
+found several typos and a small buglet. Ville Skyttä I<(ville.skytta@iki.fi)>
+provided the MNG and the Image::Magick fallback code.
+
+=cut
+
+1;
+
+__END__
+
+###########################################################################
+# Subroutine gets the size of the specified GIF
+###########################################################################
+sub gifsize
+{
+    my $stream = shift;
+
+    my ($cmapsize, $buf, $sh, $sw, $h, $w, $x, $y, $type);
+
+    my $gif_blockskip = sub {
+        my ($skip, $type) = @_;
+        my ($lbuf);
+
+        &$read_in($stream, $skip);        # Skip header (if any)
+        while (1)
+        {
+            if (&img_eof($stream))
+            {
+                return (undef, undef,
+                        "Invalid/Corrupted GIF (at EOF in GIF $type)");
+            }
+            $lbuf = &$read_in($stream, 1);        # Block size
+            last if ord($lbuf) == 0;     # Block terminator
+            &$read_in($stream, ord($lbuf));  # Skip data
+        }
+    };
+
+    return (undef, undef,
+            'Out-of-range value for $Image::Size::GIF_BEHAVIOR: ' .
+            $Image::Size::GIF_BEHAVIOR)
+        if ($Image::Size::GIF_BEHAVIOR > 2);
+
+    # Skip over the identifying string, since we already know this is a GIF
+    $type = &$read_in($stream, 6);
+    if (length($buf = &$read_in($stream, 7)) != 7 )
+    {
+        return (undef, undef, "Invalid/Corrupted GIF (bad header)");
+    }
+    ($sw, $sh, $x) = unpack("vv C", $buf);
+    if ($Image::Size::GIF_BEHAVIOR == 0)
+    {
+        return ($sw, $sh, 'GIF');
+    }
+
+    if ($x & 0x80)
+    {
+        $cmapsize = 3 * (2**(($x & 0x07) + 1));
+        if (! &$read_in($stream, $cmapsize))
+        {
+            return (undef, undef,
+                    "Invalid/Corrupted GIF (global color map too small?)");
+        }
+    }
+
+    # Before we start this loop, set $sw and $sh to 0s and use them to track
+    # the largest sub-image in the overall GIF.
+    $sw = $sh = 0;
+
+  FINDIMAGE:
+    while (1)
+    {
+        if (&img_eof($stream))
+        {
+            # At this point, if we haven't returned then the user wants the
+            # largest of the sub-images. So, if $sh and $sw are still 0s, then
+            # we didn't see even one Image Descriptor block. Otherwise, return
+            # those two values.
+            if ($sw and $sh)
+            {
+                return ($sw, $sh, 'GIF');
+            }
+            else
+            {
+                return (undef, undef,
+                        "Invalid/Corrupted GIF (no Image Descriptors)");
+            }
+        }
+        $buf = &$read_in($stream, 1);
+        ($x) = unpack("C", $buf);
+        if ($x == 0x2c)
+        {
+            # Image Descriptor (GIF87a, GIF89a 20.c.i)
+            if (length($buf = &$read_in($stream, 8)) != 8)
+            {
+                return (undef, undef,
+                        "Invalid/Corrupted GIF (missing image header?)");
+            }
+            ($x, $y) = unpack("x4 vv", $buf);
+            return ($x, $y, 'GIF') if ($Image::Size::GIF_BEHAVIOR == 1);
+            if ($x > $sw and $y > $sh)
+            {
+                $sw = $x;
+                $sh = $y;
+            }
+        }
+        if ($x == 0x21)
+        {
+            # Extension Introducer (GIF89a 23.c.i, could also be in GIF87a)
+            $buf = &$read_in($stream, 1);
+            ($x) = unpack("C", $buf);
+            if ($x == 0xF9)
+            {
+                # Graphic Control Extension (GIF89a 23.c.ii)
+                &$read_in($stream, 6);    # Skip it
+                next FINDIMAGE;       # Look again for Image Descriptor
+            }
+            elsif ($x == 0xFE)
+            {
+                # Comment Extension (GIF89a 24.c.ii)
+                &$gif_blockskip(0, "Comment");
+                next FINDIMAGE;       # Look again for Image Descriptor
+            }
+            elsif ($x == 0x01)
+            {
+                # Plain Text Label (GIF89a 25.c.ii)
+                &$gif_blockskip(13, "text data");
+                next FINDIMAGE;       # Look again for Image Descriptor
+            }
+            elsif ($x == 0xFF)
+            {
+                # Application Extension Label (GIF89a 26.c.ii)
+                &$gif_blockskip(12, "application data");
+                next FINDIMAGE;       # Look again for Image Descriptor
+            }
+            else
+            {
+                return (undef, undef,
+                        sprintf("Invalid/Corrupted GIF (Unknown " .
+                                "extension %#x)", $x));
+            }
+        }
+        else
+        {
+            return (undef, undef,
+                    sprintf("Invalid/Corrupted GIF (Unknown code %#x)",
+                            $x));
+        }
+    }
+}
+
+sub xbmsize
+{
+    my $stream = shift;
+
+    my $input;
+    my ($x, $y, $id) = (undef, undef, "Could not determine XBM size");
+
+    $input = &$read_in($stream, 1024);
+    if ($input =~ /^\#define\s*\S*\s*(\d+)\s*\n\#define\s*\S*\s*(\d+)/si)
+    {
+        ($x, $y) = ($1, $2);
+        $id = 'XBM';
+    }
+
+    ($x, $y, $id);
+}
+
+# Added by Randy J. Ray, 30 Jul 1996
+# Size an XPM file by looking for the "X Y N W" line, where X and Y are
+# dimensions, N is the total number of colors defined, and W is the width of
+# a color in the ASCII representation, in characters. We only care about X & Y.
+sub xpmsize
+{
+    my $stream = shift;
+
+    my $line;
+    my ($x, $y, $id) = (undef, undef, "Could not determine XPM size");
+
+    while ($line = &$read_in($stream, 1024))
+    {
+        next unless ($line =~ /"\s*(\d+)\s+(\d+)(\s+\d+\s+\d+){1,2}\s*"/s);
+        ($x, $y) = ($1, $2);
+        $id = 'XPM';
+        last;
+    }
+
+    ($x, $y, $id);
+}
+
+
+# pngsize : gets the width & height (in pixels) of a png file
+# cor this program is on the cutting edge of technology! (pity it's blunt!)
+#
+# Re-written and tested by tmetro@vl.com
+sub pngsize
+{
+    my $stream = shift;
+
+    my ($x, $y, $id) = (undef, undef, "could not determine PNG size");
+    my ($offset, $length);
+
+    # Offset to first Chunk Type code = 8-byte ident + 4-byte chunk length + 1
+    $offset = 12; $length = 4;
+    if (&$read_in($stream, $length, $offset) eq 'IHDR')
+    {
+        # IHDR = Image Header
+        $length = 8;
+        ($x, $y) = unpack("NN", &$read_in($stream, $length));
+        $id = 'PNG';
+    }
+
+    ($x, $y, $id);
+}
+
+# mngsize: gets the width and height (in pixels) of an MNG file.
+# See <URL:http://www.libpng.org/pub/mng/spec/> for the specification.
+#
+# Basically a copy of pngsize.
+sub mngsize
+{
+    my $stream = shift;
+
+    my ($x, $y, $id) = (undef, undef, "could not determine MNG size");
+    my ($offset, $length);
+
+    # Offset to first Chunk Type code = 8-byte ident + 4-byte chunk length + 1
+    $offset = 12; $length = 4;
+    if (&$read_in($stream, $length, $offset) eq 'MHDR')
+    {
+        # MHDR = Image Header
+        $length = 8;
+        ($x, $y) = unpack("NN", &$read_in($stream, $length));
+        $id = 'MNG';
+    }
+
+    ($x, $y, $id);
+}
+
+# jpegsize: gets the width and height (in pixels) of a jpeg file
+# Andrew Tong, werdna@ugcs.caltech.edu           February 14, 1995
+# modified slightly by alex@ed.ac.uk
+# and further still by rjray@blackperl.com
+# optimization and general re-write from tmetro@vl.com
+sub jpegsize
+{
+    my $stream = shift;
+
+    my $MARKER      = "\xFF";       # Section marker.
+
+    my $SIZE_FIRST  = 0xC0;         # Range of segment identifier codes
+    my $SIZE_LAST   = 0xC3;         #  that hold size info.
+
+    my ($x, $y, $id) = (undef, undef, "could not determine JPEG size");
+
+    my ($marker, $code, $length);
+    my $segheader;
+
+    # Dummy read to skip header ID
+    &$read_in($stream, 2);
+    while (1)
+    {
+        $length = 4;
+        $segheader = &$read_in($stream, $length);
+
+        # Extract the segment header.
+        ($marker, $code, $length) = unpack("a a n", $segheader);
+
+        # Verify that it's a valid segment.
+        if ($marker ne $MARKER)
+        {
+            # Was it there?
+            $id = "JPEG marker not found";
+            last;
+        }
+        elsif ((ord($code) >= $SIZE_FIRST) && (ord($code) <= $SIZE_LAST))
+        {
+            # Segments that contain size info
+            $length = 5;
+            ($y, $x) = unpack("xnn", &$read_in($stream, $length));
+            $id = 'JPG';
+            last;
+        }
+        else
+        {
+            # Dummy read to skip over data
+            &$read_in($stream, ($length - 2));
+        }
+    }
+
+    ($x, $y, $id);
+}
+
+# ppmsize: gets data on the PPM/PGM/PBM family.
+#
+# Contributed by Carsten Dominik <dominik@strw.LeidenUniv.nl>
+sub ppmsize
+{
+    my $stream = shift;
+
+    my ($x, $y, $id) = (undef, undef,
+                        "Unable to determine size of PPM/PGM/PBM data");
+    my $n;
+
+    my $header = &$read_in($stream, 1024);
+
+    # PPM file of some sort
+    $header =~ s/^\#.*//mg;
+    ($n, $x, $y) = ($header =~ /^(P[1-6])\s+(\d+)\s+(\d+)/s);
+    $id = "PBM" if $n eq "P1" || $n eq "P4";
+    $id = "PGM" if $n eq "P2" || $n eq "P5";
+    $id = "PPM" if $n eq "P3" || $n eq "P6";
+    if ($n eq 'P7')
+    {
+        # John Bradley's XV thumbnail pics (thanks to inwap@jomis.Tymnet.COM)
+        $id = 'XV';
+        ($x, $y) = ($header =~ /IMGINFO:(\d+)x(\d+)/s);
+    }
+
+    ($x, $y, $id);
+}
+
+# tiffsize: size a TIFF image
+#
+# Contributed by Cloyce Spradling <cloyce@headgear.org>
+sub tiffsize {
+    my $stream = shift;
+
+    my ($x, $y, $id) = (undef, undef, "Unable to determine size of TIFF data");
+
+    my $endian = 'n';           # Default to big-endian; I like it better
+    my $header = &$read_in($stream, 4);
+    $endian = 'v' if ($header =~ /II\x2a\x00/o); # little-endian
+
+    # Set up an association between data types and their corresponding
+    # pack/unpack specification.  Don't take any special pains to deal with
+    # signed numbers; treat them as unsigned because none of the image
+    # dimensions should ever be negative.  (I hope.)
+    my @packspec = ( undef,     # nothing (shouldn't happen)
+                     'C',       # BYTE (8-bit unsigned integer)
+                     undef,     # ASCII
+                     $endian,   # SHORT (16-bit unsigned integer)
+                     uc($endian), # LONG (32-bit unsigned integer)
+                     undef,     # RATIONAL
+                     'c',       # SBYTE (8-bit signed integer)
+                     undef,     # UNDEFINED
+                     $endian,   # SSHORT (16-bit unsigned integer)
+                     uc($endian), # SLONG (32-bit unsigned integer)
+                     );
+
+    my $offset = &$read_in($stream, 4, 4); # Get offset to IFD
+    $offset = unpack(uc($endian), $offset); # Fix it so we can use it
+
+    my $ifd = &$read_in($stream, 2, $offset); # Get number of directory entries
+    my $num_dirent = unpack($endian, $ifd); # Make it useful
+    $offset += 2;
+    $num_dirent = $offset + ($num_dirent * 12); # Calc. maximum offset of IFD
+
+    # Do all the work
+    $ifd = '';
+    my $tag = 0;
+    my $type = 0;
+    while (!defined($x) || !defined($y)) {
+        $ifd = &$read_in($stream, 12, $offset); # Get first directory entry
+        last if (($ifd eq '') || ($offset > $num_dirent));
+        $offset += 12;
+        $tag = unpack($endian, $ifd); # ...and decode its tag
+        $type = unpack($endian, substr($ifd, 2, 2)); # ...and the data type
+        # Check the type for sanity.
+        next if (($type > @packspec+0) || (!defined($packspec[$type])));
+        if ($tag == 0x0100) {   # ImageWidth (x)
+            # Decode the value
+            $x = unpack($packspec[$type], substr($ifd, 8, 4));
+        } elsif ($tag == 0x0101) {      # ImageLength (y)
+            # Decode the value
+            $y = unpack($packspec[$type], substr($ifd, 8, 4));
+        }
+    }
+
+    # Decide if we were successful or not
+    if (defined($x) && defined($y)) {
+        $id = 'TIF';
+    } else {
+        $id = '';
+        $id = 'ImageWidth ' if (!defined($x));
+        if (!defined ($y)) {
+            $id .= 'and ' if ($id ne '');
+            $id .= 'ImageLength ';
+        }
+        $id .= 'tag(s) could not be found';
+    }
+
+    ($x, $y, $id);
+}
+
+# bmpsize: size a Windows-ish BitMaP image
+#
+# Adapted from code contributed by Aldo Calpini <a.calpini@romagiubileo.it>
+sub bmpsize
+{
+    my $stream = shift;
+
+    my ($x, $y, $id) = (undef, undef, "Unable to determine size of BMP data");
+    my ($buffer);
+
+    $buffer = &$read_in($stream, 26);
+    ($x, $y) = unpack("x18VV", $buffer);
+    $id = 'BMP' if (defined $x and defined $y);
+
+    ($x, $y, $id);
+}
+
+# psdsize: determine the size of a PhotoShop save-file (*.PSD)
+sub psdsize
+{
+    my $stream = shift;
+
+    my ($x, $y, $id) = (undef, undef, "Unable to determine size of PSD data");
+    my ($buffer);
+
+    $buffer = &$read_in($stream, 26);
+    ($y, $x) = unpack("x14NN", $buffer);
+    $id = 'PSD' if (defined $x and defined $y);
+
+    ($x, $y, $id);
+}
+
+# swfsize: determine size of ShockWave/Flash files. Adapted from code sent by
+# Dmitry Dorofeev <dima@yasp.com>
+sub swfsize
+{
+    my $image  = shift;
+    my $header = &$read_in($image, 33);
+
+    my $ver = _bin2int(unpack 'B8', substr($header, 3, 1));
+    my $bs = unpack 'B133', substr($header, 8, 17);
+    my $bits = _bin2int(substr($bs, 0, 5));
+    my $x = int(_bin2int(substr($bs, 5+$bits, $bits))/20);
+    my $y = int(_bin2int(substr($bs, 5+$bits*3, $bits))/20);
+
+    return ($x, $y, 'SWF');
+}
+
+# Suggested by Matt Mueller <mueller@wetafx.co.nz>, and based on a piece of
+# sample Perl code by a currently-unknown author. Credit will be placed here
+# once the name is determined.
+sub pcdsize
+{
+    my $stream = shift;
+
+    my ($x, $y, $id) = (undef, undef, "Unable to determine size of PCD data");
+    my $buffer = &$read_in($stream, 0xf00);
+
+    # Second-tier sanity check
+    return ($x, $y, $id) unless (substr($buffer, 0x800, 3) eq 'PCD');
+
+    my $orient = ord(substr($buffer, 0x0e02, 1)) & 1; # Clear down to one bit
+    ($x, $y) = @{$Image::Size::PCD_MAP{lc $Image::Size::PCD_SCALE}}
+        [($orient ? (0, 1) : (1, 0))];
+
+    return ($x, $y, 'PCD');
+}
+
+# swfmxsize: determine size of compressed ShockWave/Flash MX files. Adapted
+# from code sent by Victor Kuriashkin <victor@yasp.com>
+sub swfmxsize
+{
+    require Compress::Zlib;
+
+    my ($image) = @_;
+    my $header = &$read_in($image, 1058);
+    my $ver = _bin2int(unpack 'B8', substr($header, 3, 1));
+
+    my ($d, $status) = Compress::Zlib::inflateInit();
+    $header = $d->inflate(substr($header, 8, 1024));
+
+    my $bs = unpack 'B133', substr($header, 0, 9);
+    my $bits = _bin2int(substr($bs, 0, 5));
+    my $x = int(_bin2int(substr($bs, 5+$bits, $bits))/20);
+    my $y = int(_bin2int(substr($bs, 5+$bits*3, $bits))/20);
+
+    return ($x, $y, 'CWS');
+}
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/MARC/Batch.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/MARC/Batch.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/MARC/Batch.pm	(revision 24799)
@@ -0,0 +1,155 @@
+package MARC::Batch;
+
+=head1 NAME
+
+MARC::Batch - Perl module for handling files of MARC::Record objects
+
+=cut
+
+use strict;
+use integer;
+eval 'use warnings' if $] >= 5.006;
+
+=head1 VERSION
+
+Version 1.10
+
+    $Id: Batch.pm 3430 2002-09-24 05:17:39Z jrm21 $
+
+=cut
+
+use vars '$VERSION'; $VERSION = '1.10';
+
+=head1 SYNOPSIS
+
+MARC::Batch hides all the file handling of files of C<MARC::Record>s.
+C<MARC::Record> still does the file I/O, but C<MARC::Batch> handles the
+multiple-file aspects.
+
+    use MARC::Batch;
+
+    my $batch = new MARC::Batch( 'USMARC', @files );
+    while ( my $marc = $batch->next ) {
+	print $marc->subfield(245,"a"), "\n";
+    }
+
+=head1 EXPORT
+
+None.  Everything is a class method.
+
+=head1 METHODS
+
+=head2 new( $type, [@files] )
+
+Create a C<MARC::Batch> object that will process C<@files>.
+
+C<$type> must be either "USMARC" or "MicroLIF".  If you want to specify 
+"MARC::File::USMARC" or "MARC::File::MicroLIF", that's OK, too.
+
+=cut
+
+sub new {
+    my $class = shift;
+    my $type = shift;
+
+    my $marcclass = ($type =~ /^MARC::File/) ? $type : "MARC::File::$type";
+
+    eval "require $marcclass";
+    die $@ if $@;
+
+    my @files = @_;
+
+    my $self = {
+	filelist =>	[@files],
+	filestack =>	[@files],
+	filename =>	undef,
+	marcclass =>	$marcclass,
+	file =>		undef,
+    };
+
+    bless $self, $class;
+
+    return $self;
+} # new()
+
+
+=head2 next()
+
+Read the next record from the files.  If the current file is at EOF, close
+it and open the next one.
+
+=cut
+
+sub next {
+    my $self = shift;
+
+    # If we have an open file, just use it and go.
+    if ( $self->{file} ) {
+	my $rec = $self->{file}->next();
+	return $rec if $rec;
+    }
+
+    $self->{file} = undef;
+
+    # Get the next file off the stack, if there is one
+    $self->{filename} = shift @{$self->{filestack}} or return undef;
+
+    # Instantiate a filename for it
+    my $marcclass = $self->{marcclass};
+    $self->{file} = $marcclass->in( $self->{filename} ) or return undef;
+
+    return $self->{file}->next();
+}
+
+=head2 filename()
+
+Returns the currently open filename
+
+=cut
+
+sub filename {
+    my $self = shift;
+
+    return $self->{filename};
+}
+
+=head2 warnings() 
+
+Returns any warnings that have accumulated while processing a particular 
+batch file. As a side effect the warning buffer will be cleared.
+
+=cut
+
+sub warnings {
+    my $self = shift;
+    my $file = $self->{file}; 
+    return(undef) if !$file;
+    return ($file->warnings());
+}
+
+
+1;
+
+__END__
+
+=head1 RELATED MODULES
+
+L<MARC::Record>, L<MARC::Lint>
+
+=head1 TODO
+
+None yet.  Send me your ideas and needs.
+
+=head1 LICENSE
+
+This code may be distributed under the same terms as Perl itself. 
+
+Please note that these modules are not products of or supported by the
+employers of the various contributors to the code.
+
+=head1 AUTHOR
+
+Andy Lester, E<lt>marc@petdance.comE<gt> or E<lt>alester@flr.follett.comE<gt>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/MARC/Field.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/MARC/Field.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/MARC/Field.pm	(revision 24799)
@@ -0,0 +1,487 @@
+package MARC::Field;
+
+use strict;
+use integer;
+eval 'use warnings' if $] >= 5.006;
+
+use constant SUBFIELD_INDICATOR => "\x1F";
+use constant END_OF_FIELD       => "\x1E";
+
+use vars qw( $ERROR );
+
+=head1 NAME
+
+MARC::Field - Perl extension for handling MARC fields
+
+=head1 VERSION
+
+Version 1.10
+
+    $Id: Field.pm 3430 2002-09-24 05:17:39Z jrm21 $
+
+=cut
+
+use vars '$VERSION'; $VERSION = '1.10';
+
+=head1 SYNOPSIS
+
+  use MARC::Field;
+
+  my $field = 
+  	MARC::Field->new( 
+		245, '1', '0',
+			'a' => 'Raccoons and ripe corn / ',
+			'c' => 'Jim Arnosky.'
+		);
+  $field->add_subfields( "a", "1st ed." );
+
+=head1 DESCRIPTION
+
+Defines MARC fields for use in the MARC::Record module.  I suppose
+you could use them on their own, but that wouldn't be very interesting.
+
+=head1 EXPORT
+
+None by default.  Any errors are stored in C<$MARC::Field::ERROR>, which
+C<$MARC::Record> usually bubbles up to C<$MARC::Record::ERROR>.
+
+=head1 METHODS
+
+=head2 C<new(tag,indicator1,indicator2,code,data[,code,data...])>
+
+  my $record = 
+  	MARC::Field->new( 
+		245, '1', '0',
+			'a' => 'Raccoons and ripe corn / ',
+			'c' => 'Jim Arnosky.'
+		);
+
+=cut
+
+sub new($) {
+	my $class = shift;
+	$class = ref($class) || $class;
+
+	my $tagno = shift;
+	($tagno =~ /^\d\d\d$/)
+		or return _gripe( "Tag \"$tagno\" is not a valid tag number." );
+
+	my $self = bless {
+		_tag => $tagno,
+		_warnings => [],
+		}, $class;
+	
+	if ( $tagno < 10 ) { 
+		$self->{_data} = shift;
+	} else {
+		for my $indcode ( qw( _ind1 _ind2 ) ) {
+			my $indicator = shift;
+			if ( $indicator !~ /^[0-9 ]$/ ) {
+				$self->_warn( "Invalid indicator \"$indicator\" forced to blank" ) unless ($indicator eq "");
+				$indicator = " ";
+			}
+			$self->{$indcode} = $indicator;
+		} # for
+		
+		(@_ >= 2)
+			or return _gripe( "Field $tagno must have at least one subfield" );
+
+		# Normally, we go thru add_subfields(), but internally we can cheat
+		$self->{_subfields} = [@_];
+	}
+
+	return $self;
+} # new()
+
+=head2 C<clone()>
+
+Makes a copy of the field.  Note that this is not just the same as saying
+
+    my $newfield = $field;
+
+since that just makes a copy of the reference.  To get a new object, you must
+
+    my $newfield = $field->clone;
+
+=cut
+
+sub clone {
+    my $self = shift;
+
+    my $tagno = $self->tag;
+
+    my $clone = 
+	bless {
+	    _tag => $tagno,
+	    _warnings => [],
+	}, ref($self);
+
+    if ( $tagno < 10 ) {
+	$clone->{_data} = $self->{_data};
+    } else {
+	$clone->{_ind1} = $self->{_ind1};
+	$clone->{_ind2} = $self->{_ind2};
+	$clone->{_subfields} = [@{$self->{_subfields}}]; 
+    }
+
+    return $clone;
+}
+
+=head2 C<update()>
+
+Allows you to change the values of the field. You can update indicators
+and subfields like this:
+
+  $field->update( ind2 => '4', a => 'The ballad of Abe Lincoln');
+
+The amount of items modified will be returned to you as a result of the
+method call.
+
+If you want to update a field that has no indicators or subfields (000-009)
+just call update() with one argument, the string that you would like to 
+set the field to. 
+
+  $field = $record->field( '003' );
+  $field->update('IMchF');
+
+Note: when doing subfield updates be aware that C<update()> will only 
+update the first occurrence. If you need to do anything more complicated
+you need to create a new field and use C<replace_with()>. 
+
+=cut
+
+sub update {
+
+  my $self = shift;
+
+  ## tags 000 - 009 don't have indicators or subfields
+  if ( $self->tag() < 10 ) {
+    $self->{_data} = shift;
+    return(1);
+  }
+  
+  ## otherwise we need to update subfields and indicators
+  my @data = @{$self->{_subfields}}; 
+  my $changes = 0;
+
+  while ( @_ ) {
+
+    my $arg = shift;
+    my $val = shift;
+
+    ## indicator update
+    if ($arg =~ /^ind[12]$/) {
+      $self->{"_$arg"} = $val;
+      $changes++;
+    }
+    ## subfield update
+    else {
+      for (my $i=0; $i<@data; $i=$i+2) {
+	if ($data[$i] eq $arg) {
+	  $data[$i+1] = $val;
+	  $changes++;
+	  last;
+	}
+      }
+    }
+
+  }
+
+  ## synchronize our subfields 
+  $self->{_subfields} = \@data;
+  return($changes);
+
+}
+
+=head2 C<replace_with()> 
+
+Allows you to replace an existing field with a new one. You need to pass 
+C<replace()> a MARC::Field object to replace the existing field with. For 
+example:
+
+  $field = $record->field('245');
+  my $new_field = new MARC::Field('245','0','4','The ballad of Abe Lincoln.');
+  $field->replace_with($new_field);
+
+=cut 
+
+sub replace_with {
+
+  my ($self,$new) = @_;
+  ref($new) =~ /^MARC::Field$/ 
+    or return _gripe("Must pass a MARC::Field object");
+
+  %$self = %$new;
+    
+}
+
+
+=head2 C<tag()>
+
+Returns the three digit tag for the field.
+
+=cut
+
+sub tag {
+	my $self = shift;
+	return $self->{_tag};
+}
+
+=head2 C<indicator(indno)>
+
+Returns the specified indicator.  Returns C<undef> and sets 
+C<$MARC::Field::ERROR> if the I<indno> is not 1 or 2, or if 
+the tag doesn't have indicators.
+
+=cut
+
+sub indicator($) {
+	my $self = shift;
+	my $indno = shift;
+
+	($self->tag >= 10)
+		or return _gripe( "Fields below 010 do not have indicators" );
+
+	if ( $indno == 1 ) {
+		return $self->{_ind1};
+	} elsif ( $indno == 2 ) {
+		return $self->{_ind2};
+	} else {
+		return _gripe( "Indicator number must be 1 or 2" );
+	}
+}
+
+
+
+=head2 C<subfield(code)>
+
+Returns the text from the first subfield matching the subfield code.
+If no matching subfields are found, C<undef> is returned.
+
+If the tag is less than an 010, C<undef> is returned and
+C<$MARC::Field::ERROR> is set.
+
+=cut
+
+sub subfield {
+	my $self = shift;
+	my $code_wanted = shift;
+
+	($self->tag >= 10)
+		or return _gripe( "Fields below 010 do not have subfields" );
+
+	my @data = @{$self->{_subfields}};
+	while ( defined( my $code = shift @data ) ) {
+		return shift @data if ( $code eq $code_wanted );
+		shift @data;
+	}
+
+	return undef;
+}
+
+=head2 C<subfields()>
+
+Returns all the subfields in the field.  What's returned is a list of 
+lists, where the inner list is a subfield code and the subfield data. 
+
+For example, this might be the subfields from a 245 field:
+
+	[
+	  [ 'a', 'Perl in a nutshell :' ],
+	  [ 'b', 'A desktop quick reference.' ],
+	]
+
+=cut
+
+sub subfields {
+	my $self = shift;
+
+	($self->tag >= 10)
+		or return _gripe( "Fields below 010 do not have subfields" );
+
+	my @list;
+	my @data = @{$self->{_subfields}};
+	while ( defined( my $code = shift @data ) ) {
+		push( @list, [$code, shift @data] );
+	}
+	return @list;
+}
+
+sub _gripe(@) {
+	$ERROR = join( "", @_ );
+
+	warn $ERROR;
+
+	return undef;
+}
+
+=head2 C<data()>
+
+Returns the data part of the field, if the tag number is less than 10.
+
+=cut
+
+sub data($) {
+	my $self = shift;
+
+	($self->{_tag} < 10)
+		or return _gripe( "data() is only for tags less than 10" );
+		
+	my $data = shift;
+	$self->{_data} = $data if defined( $data );
+
+	return $self->{_data};
+}
+
+=head2 C<add_subfields(code,text[,code,text ...])>
+
+Adds subfields to the end of the subfield list.
+
+Returns the number of subfields added, or C<undef> if there was an error.
+
+=cut
+
+sub add_subfields(@) {
+	my $self = shift;
+
+	($self->{_tag} >= 10)
+		or return _gripe( "Subfields are only for tags >= 10" );
+
+	push( @{$self->{_subfields}}, @_ );
+	return @_/2;
+}
+
+=head2 C<as_string()>
+
+Returns a string of all subfields run together, without the tag number.
+
+=cut
+
+sub as_string() {
+	my $self = shift;
+
+	return $self->{_data} if $self->tag < 10;
+
+	my @subs;
+
+	my @subdata = @{$self->{_subfields}};
+	while ( @subdata ) {
+		my $code = shift @subdata;
+		my $text = shift @subdata;
+		push( @subs, $text );
+	} # for
+
+	return join( " ", @subs );
+}
+
+
+=head2 C<as_formatted()>
+
+Returns a pretty string for printing in a MARC dump.
+
+=cut
+
+sub as_formatted() {
+	my $self = shift;
+
+	my @lines;
+
+	if ( $self->tag < 10 ) {
+		push( @lines, sprintf( "%03d     %s", $self->{_tag}, $self->{_data} ) );
+	} else {
+		my $hanger = sprintf( "%03d %1.1s%1.1s", $self->{_tag}, $self->{_ind1}, $self->{_ind2} );
+
+		my @subdata = @{$self->{_subfields}};
+		while ( @subdata ) {
+			my $code = shift @subdata;
+			my $text = shift @subdata;
+			push( @lines, sprintf( "%-6.6s _%1.1s%s", $hanger, $code, $text ) );
+			$hanger = "";
+		} # for
+	}
+
+
+
+	return join( "\n", @lines );
+}
+
+
+=head2 C<as_usmarc()>
+
+Returns a string for putting into a USMARC file.  It's really only
+useful by C<MARC::Record::as_usmarc()>.
+
+=cut
+
+sub as_usmarc() {
+	my $self = shift;
+
+	# Tags < 010 are pretty easy
+	if ( $self->tag < 10 ) {
+		return $self->data . END_OF_FIELD;
+	} else {
+		my @subs;
+		my @subdata = @{$self->{_subfields}};
+		while ( @subdata ) {
+			push( @subs, join( "", SUBFIELD_INDICATOR, shift @subdata, shift @subdata ) );
+		} # while
+
+		return join( "", 
+			$self->indicator(1),
+			$self->indicator(2),
+			@subs,
+			END_OF_FIELD,
+			);
+	}
+}
+
+=head2 C<warnings()>
+
+Returns the warnings that were created when the record was read.
+These are things like "Invalid indicators converted to blanks".
+
+The warnings are items that you might be interested in, or might
+not.  It depends on how stringently you're checking data.  If
+you're doing some grunt data analysis, you probably don't care.
+
+=cut
+
+sub warnings() {
+	my $self = shift;
+
+	return @{$self->{_warnings}};
+}
+
+# NOTE: _warn is an object method
+sub _warn($) {
+	my $self = shift;
+
+	push( @{$self->{_warnings}}, join( "", @_ ) );
+}
+
+1;
+
+__END__
+
+=head1 SEE ALSO
+
+See the "SEE ALSO" section for L<MARC::Record>.
+
+=head1 TODO
+
+See the "TODO" section for L<MARC::Record>.
+
+=cut
+
+=head1 LICENSE
+
+This code may be distributed under the same terms as Perl itself. 
+
+Please note that these modules are not products of or supported by the
+employers of the various contributors to the code.
+
+=head1 AUTHOR
+
+Andy Lester, E<lt>marc@petdance.comE<gt> or E<lt>alester@flr.follett.comE<gt>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/MARC/File.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/MARC/File.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/MARC/File.pm	(revision 24799)
@@ -0,0 +1,202 @@
+package MARC::File;
+
+=head1 NAME
+
+MARC::File - Base class for files of MARC records
+
+=cut
+
+use strict;
+use integer;
+eval 'use warnings' if $] >= 5.006;
+
+use vars qw( $ERROR );
+
+=head1 VERSION
+
+Version 1.10
+
+    $Id: File.pm 3430 2002-09-24 05:17:39Z jrm21 $
+
+=cut
+
+use vars '$VERSION'; $VERSION = '1.10';
+
+=head1 SYNOPSIS
+
+    use MARC::File::USMARC;
+
+    my $file = MARC::File::USMARC->in( $filename );
+    
+    while ( my $marc = $file->next() ) {
+	# Do something
+    }
+    $file->close();
+    undef $file;
+
+=head1 EXPORT
+
+None.  
+
+=head1 METHODS
+
+=head2 in()
+
+Opens a file for input.
+
+=cut
+
+sub in {
+    my $class = shift;
+    my $filename = shift;
+
+    my $self = {
+	filename => $filename,
+	_warnings => [],
+    };
+
+    bless $self, $class;
+
+    my $fh = eval { local *FH; open( FH, $filename ) or die; *FH{IO}; };
+
+    if ( $@ ) {
+	undef $self;
+	$MARC::File::ERROR = "Couldn't open $filename: $@";
+    } else {
+	$self->{fh} = $fh;
+    }
+	
+
+    return $self;
+} # new()
+
+sub out {
+    die "Not yet written";
+}
+
+=head2 next()
+
+Reads the next record from the file handle passed in. 
+
+=cut
+
+sub next {
+    my $self = shift;
+    my $rec = $self->_next();
+    return $rec ? $self->decode($rec) : undef;
+}
+
+=head2 skip()
+
+Skips over the next record in the file.  Same as C<next()>,
+without the overhead of parsing a record you're going to throw away
+anyway.
+
+Returns 1 or undef.
+
+=cut
+
+sub skip {
+    my $self = shift;
+
+    my $rec = $self->_next();
+
+    return $rec ? 1 : undef;
+}
+
+=head2 warnings()
+
+Simlilar to MARC::Record and MARC::Batch, warnings() will return any 
+warnings that have accumulated while processing this file; and as a 
+side-effect will clear the warnings buffer.
+
+=cut 
+
+sub warnings {
+    my $self = shift;
+    my @warnings = @{ $self->{_warnings} };
+    $self->{_warnings} = [];
+    return(@warnings);
+}
+
+sub close {
+    my $self = shift;
+
+    close( $self->{fh} );
+    delete $self->{fh};
+    delete $self->{filename};
+
+    return;
+}
+
+sub _unimplemented() {
+    my $self = shift;
+    my $method = shift;
+
+    warn "Method $method must be overridden";
+}
+
+sub write   { $_[0]->_unimplemented("write"); }
+sub decode  { $_[0]->_unimplemented("decode"); }
+
+# NOTE: _warn must be called as an object method
+
+sub _warn {
+    my ($self,$warning) = @_;
+    push( @{ $self->{_warnings} }, $warning );
+    return(undef);
+}
+
+# NOTE: _gripe can be called as an object method, or not.  Your choice.
+sub _gripe(@) {
+    my @parms = @_;
+    if ( @parms ) {
+	my $self = shift @parms;
+
+	if ( ref($self) =~ /^MARC::File/ ) {
+	    push( @parms, " at byte ", tell($self->{fh}) ) if $self->{fh};
+	    push( @parms, " in file ", $self->{filename} ) if $self->{filename};
+	} else {
+	    unshift( @parms, $self );
+	}
+
+	$ERROR = join( "", @parms );
+	warn $ERROR;
+    }
+
+    return(undef);
+}
+
+1;
+
+__END__
+
+=head1 RELATED MODULES
+
+L<MARC::Record>
+
+=head1 TODO
+
+=over 4
+
+=item * C<out()> method
+
+We only handle files for input right now.
+
+=back
+
+=cut
+
+=head1 LICENSE
+
+This code may be distributed under the same terms as Perl itself. 
+
+Please note that these modules are not products of or supported by the
+employers of the various contributors to the code.
+
+=head1 AUTHOR
+
+Andy Lester, E<lt>marc@petdance.comE<gt> or E<lt>alester@flr.follett.comE<gt>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/MARC/File/MicroLIF.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/MARC/File/MicroLIF.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/MARC/File/MicroLIF.pm	(revision 24799)
@@ -0,0 +1,128 @@
+package MARC::File::MicroLIF;
+
+=head1 NAME
+
+MARC::File::MicroLIF - MicroLIF-specific file handling
+
+=cut
+
+use strict;
+use integer;
+eval 'use warnings' if $] >= 5.006;
+
+use vars qw( $ERROR );
+
+=head1 VERSION
+
+Version 1.10
+
+    $Id: MicroLIF.pm 3430 2002-09-24 05:17:39Z jrm21 $
+
+=cut
+
+use vars '$VERSION'; $VERSION = '1.10';
+
+use MARC::File;
+use vars qw( @ISA ); @ISA = qw( MARC::File );
+
+use MARC::Record qw( LEADER_LEN );
+
+=head1 SYNOPSIS
+
+    use MARC::File::MicroLIF;
+
+    my $file = MARC::File::MicroLIF::in( $filename );
+    
+    while ( my $marc = $file->next() ) {
+	# Do something
+    }
+    $file->close();
+    undef $file;
+
+=head1 EXPORT
+
+None.  
+
+=head1 METHODS
+
+=cut
+
+sub _next {
+    my $self = shift;
+
+    my $fh = $self->{fh};
+
+    local $/ = "`\n";
+    
+    my $lifrec = <$fh>;
+
+    return $lifrec;
+}
+
+sub decode {
+    my $text = shift;
+    $text = shift if (ref($text)||$text) =~ /^MARC::File/; # Handle being called as a method
+
+    my $marc = MARC::Record->new();
+
+    my @lines = split( /\n/, $text );
+    for my $line ( @lines ) {
+	# Ignore the file header if the calling program hasn't already dealt with it
+	next if $line =~ /^HDR/;
+
+	($line =~ s/^(\d\d\d|LDR)//) or
+	return $marc->_gripe( "Invalid tag number: ", substr( $line, 0, 3 ) );
+	my $tagno = $1;
+
+	($line =~ s/\^$//) or $marc->_warn( "Tag $tagno is missing a trailing caret." );
+
+	if ( $tagno eq "LDR" ) {
+	    $marc->leader( substr( $line, 0, LEADER_LEN ) );
+	} elsif ( $tagno < 10 ) {
+	    $marc->add_fields( $tagno, $line );
+	} else {
+	    $line =~ s/^(.)(.)//;
+	    my ($ind1,$ind2) = ($1,$2);
+	    my @subfields;
+	    my @subfield_data_pairs = split( /_(?=[a-z0-9])/, $line );
+	    shift @subfield_data_pairs; # Leading _ makes an empty pair
+	    for my $pair ( @subfield_data_pairs ) {
+		my ($subfield,$data) = (substr( $pair, 0, 1 ), substr( $pair, 1 ));
+		push( @subfields, $subfield, $data );
+	    }
+	    $marc->add_fields( $tagno, $ind1, $ind2, @subfields );
+	}
+    } # for
+
+    return $marc;
+}
+
+1;
+
+__END__
+
+=head1 TODO
+
+=over 4
+
+=item * Squawks about the final field missing a caret
+
+=back
+
+=head1 RELATED MODULES
+
+L<MARC::File>
+
+=head1 LICENSE
+
+This code may be distributed under the same terms as Perl itself. 
+
+Please note that these modules are not products of or supported by the
+employers of the various contributors to the code.
+
+=head1 AUTHOR
+
+Andy Lester, E<lt>marc@petdance.comE<gt> or E<lt>alester@flr.follett.comE<gt>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/MARC/File/USMARC.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/MARC/File/USMARC.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/MARC/File/USMARC.pm	(revision 24799)
@@ -0,0 +1,287 @@
+package MARC::File::USMARC;
+
+=head1 NAME
+
+MARC::File::USMARC - USMARC-specific file handling
+
+=cut
+
+use strict;
+use integer;
+eval 'use bytes'    if $] >= 5.006;
+eval 'use warnings' if $] >= 5.006;
+
+use vars qw( $ERROR );
+
+=head1 VERSION
+
+Version 1.10
+
+    $Id: USMARC.pm 3430 2002-09-24 05:17:39Z jrm21 $
+
+=cut
+
+use vars '$VERSION'; $VERSION = '1.10';
+
+use MARC::File;
+use vars qw( @ISA ); @ISA = qw( MARC::File );
+
+use MARC::Record qw( LEADER_LEN );
+use constant SUBFIELD_INDICATOR	    => "\x1F";
+use constant END_OF_FIELD	    => "\x1E";
+use constant END_OF_RECORD	    => "\x1D";
+use constant DIRECTORY_ENTRY_LEN    => 12;
+
+=head1 SYNOPSIS
+
+    use MARC::File::USMARC;
+
+    my $file = MARC::File::USMARC::in( $filename );
+    
+    while ( my $marc = $file->next() ) {
+	# Do something
+    }
+    $file->close();
+    undef $file;
+
+=head1 EXPORT
+
+None.  
+
+=head1 METHODS
+
+=for internal
+
+Internal function to get the next raw record out of a file.
+
+=cut
+
+sub _next {
+    my $self = shift;
+
+    my $fh = $self->{fh};
+
+    my $reclen;
+    return undef if eof($fh);
+
+    local $/ = END_OF_RECORD;
+    my $usmarc = <$fh>;
+
+    if ( length($usmarc) < 5 ) {
+	$self->_warn( "Couldn't find record length" );
+	return $self->_next();
+    }
+
+    $reclen = substr($usmarc,0,5);
+
+    if ( $reclen !~ /^\d{5}$/ or $reclen != length($usmarc) ) {
+	$self->_warn( "Invalid record length \"$reclen\"" );
+	return $self->_next();
+    }
+
+    return $usmarc;
+}
+
+=head2 decode()
+
+Constructor for handling data from a USMARC file.  This function takes care of all
+the tag directory parsing & mangling.
+
+Any warnings or coercions can be checked in the C<warnings()> function.
+
+=cut
+
+sub decode {
+    my $text = shift;
+    $text = shift if (ref($text)||$text) =~ /^MARC::File/;
+
+    my $marc = MARC::Record->new();
+
+    # Check for an all-numeric record length
+    ($text =~ /^(\d{5})/)
+	or return $marc->_warn( "Record length \"", substr( $text, 0, 5 ), "\" is not numeric" );
+
+    my $reclen = $1;
+    ($reclen == length($text))
+	or return $marc->_gripe( "Invalid record length: Leader says $reclen bytes, but it's actually ", length( $text ) );
+
+    $marc->leader( substr( $text, 0, LEADER_LEN ) );
+    my @fields = split( END_OF_FIELD, substr( $text, LEADER_LEN ) );
+    my $dir = shift @fields or return $marc->_warn( "No directory found" );
+
+    (length($dir) % 12 == 0)
+	or return $marc->_gripe( "Invalid directory length" );
+    my $nfields = length($dir)/12;
+
+    my $finalfield = pop @fields;
+    # Check for the record terminator, and ignore it
+    ($finalfield eq END_OF_RECORD)
+    	or $marc->_gripe( "Invalid record terminator: \"$finalfield\"" );
+
+    # Walk thru the directories, and shift off the fields while we're at it
+    # Shouldn't be any non-digits anywhere in any directory entry
+    my @directory = unpack( "A3 A4 A5" x $nfields, $dir );
+    my @bad = grep /\D/, @directory;
+    if ( @bad ) { 
+	return $marc->_gripe( "Non-numeric entries in the tag directory: ", join( ", ", map { "\"$_\"" } @bad ) );
+    }
+
+    my $databytesused = 0;
+    while ( @directory ) {
+	my $tagno = shift @directory;
+	my $len = shift @directory;
+	my $offset = shift @directory;
+	my $tagdata = shift @fields;
+	warn "Specs: ", join( "|", $tagno, $len, $offset, $tagdata ), "\n" if $MARC::Record::DEBUG;
+
+	# Check directory validity
+	($tagno =~ /^\d\d\d$/)
+	    or return $marc->_gripe( "Invalid field number in directory: \"$tagno\"" );
+
+	($len == length($tagdata) + 1)
+	    or $marc->_warn( "Invalid length in the directory for tag $tagno" );
+
+	($offset == $databytesused)
+	    or $marc->_warn( "Directory offsets are out of whack" );
+	$databytesused += $len;
+
+	if ( $tagno < 10 ) {
+	    $marc->add_fields( $tagno, $tagdata )
+		or return undef; # We're relying on add_fields() having set $MARC::Record::ERROR
+	} else {
+	    my @subfields = split( SUBFIELD_INDICATOR, $tagdata );
+	    my $indicators = shift @subfields
+		or return $marc->_gripe( "No subfields found." );
+	    my ($ind1,$ind2);
+	    if ( $indicators =~ /^([0-9 ])([0-9 ])$/ ) {
+		($ind1,$ind2) = ($1,$2);
+	    } else {
+		$marc->_warn( "Invalid indicators \"$indicators\" forced to blanks\n" );
+		($ind1,$ind2) = (" "," ");
+	    }
+
+	    # Split the subfield data into subfield name and data pairs
+	    my @subfield_data = map { (substr($_,0,1),substr($_,1)) } @subfields;
+	    $marc->add_fields( $tagno, $ind1, $ind2, @subfield_data )
+		or return undef;
+	}
+    } # while
+
+    # Once we're done, there shouldn't be any fields left over: They should all have shifted off.
+    (@fields == 0)
+    	or return $marc->_gripe( "I've got leftover fields that weren't in the directory" );
+
+    return $marc;
+}
+
+=head2 update_leader()
+
+If any changes get made to the MARC record, the first 5 bytes of the
+leader (the length) will be invalid.  This function updates the 
+leader with the correct length of the record as it would be if
+written out to a file.
+
+=cut
+
+sub update_leader() {
+	my $self = shift;
+
+	my (undef,undef,$reclen,$baseaddress) = $self->_build_tag_directory();
+
+	$self->_set_leader_lengths( $reclen, $baseaddress );
+}
+
+=head2 _build_tag_directory()
+
+Function for internal use only: Builds the tag directory that gets
+put in front of the data in a MARC record.
+
+Returns two array references, and two lengths: The tag directory, and the data fields themselves,
+the length of all data (including the Leader that we expect will be added),
+and the size of the Leader and tag directory.
+
+=cut
+
+sub _build_tag_directory {
+	my $marc = shift;
+	$marc = shift if (ref($marc)||$marc) =~ /^MARC::File/;
+	die "Wanted a MARC::Record but got a ", ref($marc) unless ref($marc) eq "MARC::Record";
+
+	my @fields;
+	my @directory;
+
+	my $dataend = 0;
+	for my $field ( $marc->fields() ) {
+		# Dump data into proper format
+		my $str = $field->as_usmarc;
+		push( @fields, $str );
+
+		# Create directory entry
+		my $len = length $str;
+		my $direntry = sprintf( "%03d%04d%05d", $field->tag, $len, $dataend );
+		push( @directory, $direntry );
+		$dataend += $len;
+	}
+
+	my $baseaddress = 
+		LEADER_LEN +    # better be 24
+		( @directory * DIRECTORY_ENTRY_LEN ) +
+				# all the directory entries
+		1;           	# end-of-field marker
+
+
+	my $total = 
+		$baseaddress +	# stuff before first field
+		$dataend + 	# Length of the fields
+		1;		# End-of-record marker
+
+
+
+	return (\@fields, \@directory, $total, $baseaddress);
+}
+
+=head2 encode()
+
+Returns a string of characters suitable for writing out to a USMARC file,
+including the leader, directory and all the fields.
+
+=cut
+
+sub encode() {
+    my $marc = shift;
+    $marc = shift if (ref($marc)||$marc) =~ /^MARC::File/;
+
+    my ($fields,$directory,$reclen,$baseaddress) = _build_tag_directory($marc);
+    $marc->set_leader_lengths( $reclen, $baseaddress );
+
+    # Glomp it all together
+    return join("",$marc->leader, @$directory, END_OF_FIELD, @$fields, END_OF_RECORD);
+}
+
+1;
+
+__END__
+
+=head1 RELATED MODULES
+
+L<MARC::Record>
+
+=head1 TODO
+
+Make some sort of autodispatch so that you don't have to explicitly
+specify the MARC::File::X subclass, sort of like how DBI knows to
+use DBD::Oracle or DBD::Mysql.
+
+=head1 LICENSE
+
+This code may be distributed under the same terms as Perl itself. 
+
+Please note that these modules are not products of or supported by the
+employers of the various contributors to the code.
+
+=head1 AUTHOR
+
+Andy Lester, E<lt>marc@petdance.comE<gt> or E<lt>alester@flr.follett.comE<gt>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/MARC/Lint.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/MARC/Lint.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/MARC/Lint.pm	(revision 24799)
@@ -0,0 +1,764 @@
+package MARC::Lint;
+
+use strict;
+use integer;
+eval 'use warnings' if $] >= 5.006;
+
+=head1 NAME
+
+MARC::Lint - Perl extension for checking validity of MARC records
+
+=head1 VERSION
+
+Version 1.10
+
+    $Id: Lint.pm 3430 2002-09-24 05:17:39Z jrm21 $
+
+=cut
+
+use vars '$VERSION'; $VERSION = '1.10';
+
+use MARC::Record;
+use MARC::Field;
+
+=head1 SYNOPSIS
+
+  use MARC::Record;
+  use MARC::Lint;
+
+  my $linter = new MARC::Lint;
+  my $filename = shift;
+
+  open( IN, "<", $filename ) or die "Couldn't open $filename: $!\n";
+  binmode( IN ); # for the Windows folks
+  while ( !eof(IN) ) {
+  	my $marc = MARC::Record::next_from_file( *IN );
+	die $MARC::Record::ERROR unless $marc;
+
+	$linter->check_record( $marc );
+
+
+	# Print the title tag
+	print $marc->subfield(245,"a"), "\n";
+
+	# Print the errors that were found
+	print join( "\n", $linter->warnings ), "\n";
+  } # while
+
+  close IN or die "Error closing $filename: $!\n";
+
+Given the following MARC record:
+
+	LDR 00000nam  22002538a 4500
+	100 14 _aWall, Larry.
+	110 1  _aO'Reilly & Associates.
+	245 90 _aProgramming Perl /
+               _aBig Book of Perl /
+               _cLarry Wall, Tom Christiansen & Jon Orwant.
+	250    _a3rd ed.
+	250    _a3rd ed.
+	260    _aCambridge, Mass. :
+	       _bO'Reilly,
+	       _r2000.
+	590 4  _aPersonally signed by Larry.
+	856 43 _uhttp://www.perl.com/
+
+the following errors are generated:
+
+	1XX: Only one 1XX tag is allowed, but I found 2 of them.
+	100: Indicator 2 must be blank
+	245: Indicator 1 must be 0 or 1
+	245: Subfield _a is not repeatable.
+	250: Field is not repeatable.
+	260: Subfield _r is not valid.
+	260: Must have a subfield _c.
+	590: Indicator 1 must be blank
+	856: Indicator 2 must be blank, 0, 1, 2 or 8
+
+=head1 DESCRIPTION
+
+Module for checking validity of MARC records.  99% of the users will want to do 
+something like is shown in the synopsis.  The other intrepid 1% will overload the
+C<MARC::Lint> module's methods and provide their own special field-level checking.
+
+What this means is that if you have certain requirements, such as making sure that
+all 952 tags have a certain call number in them, you can write a function that 
+checks for that, and still get all the benefits of the MARC::Lint framework.
+
+=head1 EXPORT
+
+None.  Everything is done through objects.
+
+=head1 METHODS
+
+=head2 C<new()>
+
+No parms needed.  The C<MARC::Lint> object is little more than a list of warnings 
+and a bunch of rules.
+
+=cut
+
+sub new() {
+	my $class = shift;
+	$class = ref($class) || $class;
+
+	my $self = {
+		_warnings => [],
+	};
+	bless $self, $class;
+
+	$self->_read_rules();
+
+	return $self;
+}
+
+=head2 C<warnings()>
+
+Returns a list of warnings found by C<check_record()> and its brethren.
+
+=cut
+
+sub warnings {
+	my $self = shift;
+
+	return wantarray ? @{$self->{_warnings}} : scalar @{$self->{_warnings}};
+}
+
+=head2 C<clear_warnings()>
+
+Clear the list of warnings for this linter object.  It's automatically called
+when you call C<check_record()>.
+
+=cut
+
+sub clear_warnings {
+	my $self = shift;
+
+	$self->{_warnings} = [];
+}
+
+=head2 C<warn(str[,str...])>
+
+Create a warning message, built from strings passed, like a C<print> statement.
+
+Typically, you'll leave this to C<check_record()>, but industrious programmers
+may want to do their own checking as well.
+
+=cut
+
+sub warn {
+	my $self = shift;
+
+	push( @{$self->{_warnings}}, join( "", @_ ) );
+
+	return undef;
+}
+
+=head2 C<check_record(marc)>
+
+Does all sorts of lint-like checks on the MARC record I<marc>, both on the record as a whole,
+and on the individual fields & subfields.
+
+=cut
+
+sub check_record {
+	my $self = shift;
+	my $marc = shift;
+
+	$self->clear_warnings();
+
+	(ref($marc) eq "MARC::Record")
+		or return $self->warn( "Must pass a MARC::Record object to check_record" );
+
+	if ( (my @_1xx = $marc->field( "1XX" )) > 1 ) {
+		$self->warn( "1XX: Only one 1XX tag is allowed, but I found ", scalar @_1xx, " of them." );
+	}
+
+	if ( not $marc->field( 245 ) ) {
+		$self->warn( "245: No 245 tag." );
+	}
+
+
+	my %field_seen;
+	my $rules = $self->{_rules};
+	for my $field ( $marc->fields ) {
+		my $tagno = $field->tag;
+		my $tagrules = $rules->{$tagno} or next;
+
+		if ( $tagrules->{NR} && $field_seen{$tagno} ) { 
+			$self->warn( "$tagno: Field is not repeatable." );
+		}
+
+		if ( $tagno >= 10 ) {
+			for my $ind ( 1..2 ) {
+				my $indvalue = $field->indicator($ind);
+				if ( not ($indvalue =~ $tagrules->{"ind$ind" . "_regex"}) ) {
+					$self->warn( 
+						"$tagno: Indicator $ind must be ", 
+						$tagrules->{"ind$ind" . "_desc"}, 
+						" but it's \"$indvalue\"" 
+					);
+				}
+			}
+			
+			my %sub_seen;
+			for my $subfield ( $field->subfields ) {
+				my ($code,$data) = @$subfield;
+
+				my $rule = $tagrules->{$code};
+				if ( not defined $rule ) {
+					$self->warn( "$tagno: Subfield _$code is not allowed." );
+				} elsif ( ($rule eq "NR") && $sub_seen{$code} ) {
+					$self->warn( "$tagno: Subfield _$code is not repeatable." );
+				}
+
+				if ( $data =~ /[\t\r\n]/ ) {
+					$self->warn( "$tagno: Subfield _$code has an invalid control character" );
+				}
+
+				++$sub_seen{$code};
+			}
+		}
+
+		# Check to see if a check_xxx() function exists, and call it on the field if it does
+		my $checker = "check_$tagno";
+		if ( $self->can( $checker ) ) {
+			$self->$checker( $field );
+		}
+
+		++$field_seen{$tagno};
+	} # for
+
+	return;
+}
+
+=head2 C<check_I<xxx>(field)>
+
+Various functions to check the different fields.  If the function doesn't exist, 
+then it doesn't get checked.
+
+=cut
+
+sub check_245 {
+	my $self = shift;
+	my $field = shift;
+
+	if ( not $field->subfield( "a" ) ) {
+		$self->warn( "245: Must have a subfield _a." );
+	}
+}
+
+sub check_260 {
+	my $self = shift;
+	my $field = shift;
+
+	if ( not $field->subfield( "c" ) ) {
+		$self->warn( "260: Must have a subfield _c." );
+	}
+}
+
+
+=head1 SEE ALSO
+
+Check the docs for L<MARC::Record>.  All software links are there.
+
+=head1 TODO
+
+=over 4
+
+=item * ISBN and ISSN checking
+
+We can check the 020 and 022 fields with the C<Business::ISBN> and 
+C<Business::ISSN> modules, respectively.
+
+=back
+
+=head1 LICENSE
+
+This code may be distributed under the same terms as Perl itself. 
+
+Please note that these modules are not products of or supported by the
+employers of the various contributors to the code.
+
+=head1 AUTHOR
+
+Andy Lester, E<lt>marc@petdance.comE<gt> or E<lt>alester@flr.follett.comE<gt>
+
+=cut
+
+# Used only to read the stuff from __DATA__
+sub _read_rules() {
+	my $self = shift;
+	
+	my $tell = tell(DATA);  # Stash the position so we can reset it for next time
+
+	local $/ = "";
+	while ( my $lines = <DATA> ) {
+		$lines =~ s/\s+$//;
+		my @keyvals = split( /\s+/, $lines );
+
+		my $tagno = shift @keyvals;
+		my $repeatable = shift @keyvals;
+		
+		my @tag_range = ($tagno);
+		if ( $tagno =~ /^(\d\d)X/ ) {
+			my $base = $1;
+			@tag_range = ( "${base}0" .. "${base}9" );
+		}
+
+		# Handle the ranges of tags.
+		for my $currtag ( @tag_range ) {
+			$self->_parse_tag_rules( $currtag, $repeatable, @keyvals );
+		} # for
+		# I guess I could just have multiple references to the same tag, but I'm not that worried about memory
+	} # while
+
+	seek( DATA, $tell, 0 );
+}
+
+sub _parse_tag_rules {
+	my $self = shift;
+	my $tagno = shift;
+	my $repeatable = shift;
+	my @keyvals = @_;
+
+	my $rules = ($self->{_rules}->{$tagno} ||= {});
+	$rules->{$repeatable} = $repeatable;
+
+	while ( @keyvals ) {
+		my $key = shift @keyvals;
+		my $val = shift @keyvals;
+		
+		$rules->{$key} = $val;
+
+		# Do magic for indicators
+		if ( $key =~ /^ind/ ) {
+			my $desc;
+			my $regex;
+			
+			if ( $val eq "blank" ) {
+				$desc = "blank";
+				$regex = qr/^ $/;
+			} else {
+				$desc = _nice_list($val);
+				$val =~ s/^b/ /;
+				$regex = qr/^[$val]$/;
+			}
+
+		$rules->{$key."_desc"} = $desc;
+		$rules->{$key."_regex"} = $regex;
+		} # if indicator
+	} # while
+}
+
+
+sub _nice_list($) {
+	my $str = shift;
+
+	if ( $str =~ s/(\d)-(\d)/$1 thru $2/ ) {
+		return $str;
+	}
+
+	my @digits = split( //, $str );
+	$digits[0] = "blank" if $digits[0] eq "b";
+	my $last = pop @digits;
+	return join( ", ", @digits ) . " or $last";
+}
+
+sub _ind_regex($) {
+	my $str = shift;
+
+	return qr/^ $/ if $str eq "blank";
+
+	return qr/^[$str]$/;
+}
+
+
+1;
+
+__DATA__
+010	NR
+ind1	blank
+ind2	blank
+a	NR
+z	NR
+
+016	R
+ind1	b7
+ind2	blank
+a	NR
+z	R
+2	NR
+
+020	R
+ind1	blank
+ind2	blank
+a	R
+c	R
+
+022	R
+ind1	blank
+ind2	blank
+a	NR
+
+040	NR
+ind1	blank
+ind2	blank
+a	NR
+c	NR
+d	R
+
+100	NR
+ind1	013
+ind2	blank
+a	NR
+q	NR
+b	R
+c	R
+d	NR
+e	R
+
+110	NR
+ind1	012
+ind2	blank
+a	NR
+b	R
+
+111	NR
+ind1	012
+ind2	blank
+a	NR
+n	R	
+d	NR
+c	NR
+e	R
+
+130	NR
+ind1	0-9
+ind2	blank
+a	NR
+n	R
+p	R
+h	NR
+l	NR
+k	R
+s	NR
+f	NR
+
+240	NR
+ind1	01
+ind2	0-9
+
+245	NR
+ind1	01
+ind2	0-9
+a	NR
+n	R
+p	R
+h	NR
+b	NR
+s	NR
+c	NR
+
+246	NR
+ind1	0123
+ind2	012345678
+a	NR
+h	NR
+b	NR
+n	R
+p	R
+i	NR
+f	NR
+
+250	NR
+ind1	blank
+ind2	blank
+a	NR
+b	NR
+
+260	NR
+ind1	blank
+ind2	blank
+a	R
+b	R
+c	R
+
+300	NR
+ind1	blank
+ind2	blank
+a	R
+b	NR
+c	R
+e	NR
+
+440	R
+ind1	blank
+ind2	0-9
+a	NR
+n	R
+p	R
+v	NR
+
+490	R
+ind1	01
+ind2	blank
+a	R
+v	R
+
+500	R
+ind1	blank
+ind2	blank
+a	NR
+
+504	R
+ind1	blank
+ind2	blank
+a	NR
+
+505	R
+ind1	0128
+ind2	b0
+a	NR
+g	R
+r	R
+t	R
+
+520	R
+ind1	b018
+ind2	blank
+a	R
+b	R
+
+521	R
+ind1	b012348
+ind2	blank
+a	R
+b	NR
+
+526	R
+ind1	08
+ind2	blank
+a	NR
+b	NR
+c	NR
+d	NR
+i	NR
+x	R
+z	R
+
+538	R
+ind1	blank
+ind2	blank
+a	NR
+
+546	R
+ind1	blank
+ind2	blank
+a	NR
+
+586	R
+ind1	b8
+ind2	blank
+a	NR
+
+59X	R
+ind1	blank
+ind2	blank
+a	NR
+
+600	R
+ind1	013
+ind2	012567
+a	NR
+q	NR
+b	R
+c	R
+d	NR
+t	NR
+v	R
+x	R
+y	R
+z	R
+2	NR
+
+610	R
+ind1	012
+ind2	012567
+a	NR
+b	R
+t	NR
+v	R
+x	R
+y	R
+z	R
+2	NR
+
+611	R
+ind1	012
+ind2	012567
+a	NR
+n	R
+d	NR
+c	NR
+v	R
+x	R
+y	R
+z	R
+2	NR
+
+630	R
+ind1	0-9
+ind2	012567
+a	NR
+n	R
+p	R
+l	NR
+k	R
+s	NR
+f	NR
+v	R
+x	R
+y	R
+z	R
+2	NR
+
+650	R
+ind1	blank
+ind2	012567
+a	NR
+v	R
+x	R
+y	R
+z	R
+2	NR
+
+651	R
+ind1	blank
+ind2	012567
+a	NR
+v	R
+x	R
+y	R
+z	R
+2	NR
+
+655	R
+ind1	blank
+ind2	7
+a	NR
+v	R
+x	R
+y	R
+z	R
+2	NR
+
+658	R
+ind1	blank
+ind2	blank
+a	NR
+b	R
+c	NR
+d	NR
+2	NR
+
+69X	R
+ind1	blank
+ind2	blank
+a	NR
+v	R
+x	R
+y	R
+z	R
+
+700	R
+ind1	013
+ind2	b2
+a	NR
+q	NR
+b	R
+c	R
+d	NR
+k	R
+t	NR
+e	R
+f	NR
+
+710	R
+ind1	012
+ind2	b2
+a	NR
+b	R
+e	R
+t	NR
+
+711	R
+ind1	012
+ind2	b2
+a	NR
+n	R
+d	NR
+c	NR
+t	NR
+e	R
+
+730	R
+ind1	0-9
+ind2	b2
+a	NR
+n	R
+p	R
+h	NR
+l	NR
+k	R
+s	NR
+f	NR
+
+740	R
+ind1	0-9
+ind2	b2
+a	NR
+h	NR
+n	R
+p	R
+
+
+800	R
+ind1	013
+ind2	blank
+a	NR
+q	NR
+b	NR
+c	R
+d	NR
+t	NR
+e	R
+v	NR
+
+852	R
+ind1	b01234568
+ind2	b012
+a	NR
+b	R
+h	NR
+i	R
+k	NR
+m	NR
+t	NR
+p	NR
+9	NR
+
+856	R
+ind1	b012347
+ind2	b0128
+a	R
+b	NR
+d	R
+f	R
+h	NR
+i	R
+u	R
+x	R
+z	R
+2	NR
+3	NR
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/MARC/Record.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/MARC/Record.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/MARC/Record.pm	(revision 24799)
@@ -0,0 +1,705 @@
+package MARC::Record;
+
+=head1 NAME
+
+MARC::Record - Perl extension for handling MARC records
+
+=cut
+
+use strict;
+use integer;
+eval 'use warnings' if $] >= 5.006;
+
+use vars qw( $ERROR );
+
+use MARC::Field;
+
+=head1 VERSION
+
+Version 1.10
+
+    $Id: Record.pm 3430 2002-09-24 05:17:39Z jrm21 $
+
+=cut
+
+use vars '$VERSION'; $VERSION = '1.10';
+
+use Exporter;
+use vars qw( @ISA @EXPORTS @EXPORT_OK );
+@ISA = qw( Exporter );
+@EXPORTS = qw();
+@EXPORT_OK = qw( LEADER_LEN );
+
+use vars qw( $DEBUG ); $DEBUG = 0;
+
+use constant LEADER_LEN	=> 24;
+
+=head1 DESCRIPTION
+
+Module for handling MARC records as objects.  The file-handling stuff is
+in MARC::File::*.
+
+=head1 EXPORT
+
+None.  
+
+=head1 ERROR HANDLING
+
+Any errors generated are stored in C<$MARC::Record::ERROR>. 
+Warnings are kept with the record and accessible in the C<warnings()> method. 
+
+=head1 METHODS
+
+=head2 new()
+
+Base constructor for the class.  It just returns a completely empty record.
+To get real data, you'll need to populate it with fields, or use one of
+the MARC::File::* modules to read from a file.
+
+=cut
+
+sub new {
+    my $class = shift;
+    $class = ref($class) || $class; # Handle cloning
+    my $self = {
+	_leader => ' ' x 24,
+	_fields => [],
+	_warnings => [],
+    };
+    return bless $self, $class;
+} # new()
+
+
+
+
+=head2 fields()
+
+Returns a list of all the fields in the record. The list contains 
+a MARC::Field object for each field in the record.
+
+=cut
+
+sub fields() {
+    my $self = shift;
+    return @{$self->{_fields}};
+}
+
+=head2 field(tagspec(s))
+
+Returns a list of tags that match the field specifier, or in scalar
+context, just the first matching tag.
+
+The field specifier can be a simple number (i.e. "245"), or use the "X" 
+notation of wildcarding (i.e. subject tags are "6XX").
+
+=cut
+
+my %field_regex;
+
+sub field {
+    my $self = shift;
+    my @specs = @_;
+
+    my @list = ();
+    for my $tag ( @specs ) {
+	my $regex = $field_regex{ $tag };
+
+	# Compile & stash it if necessary
+	if ( not defined $regex ) {
+	    my $pattern = $tag;
+	    $pattern =~ s/X/\\d/g;
+	    $regex = qr/^$pattern$/;
+	    $field_regex{ $tag } = $regex;
+	} # not defined
+
+	for my $maybe ( $self->fields ) {
+	    if ( $maybe->tag =~ $regex ) {
+		return $maybe unless wantarray;
+
+		push( @list, $maybe );
+	    } # if
+	} # for $maybe
+    } # for $tag
+
+    return @list;
+}
+
+=head2 subfield(tag,subfield)
+
+Shortcut method for getting just a subfield for a tag.  These are equivalent:
+
+  my $title = $marc->field(245)->subfield("a");
+  my $title = $marc->subfield(245,"a");
+
+If either the field or subfield can't be found, C<undef> is returned.
+
+=cut
+
+sub subfield($$) {
+    my $self = shift;
+    my $tag = shift;
+    my $subfield = shift;
+
+    my $field = $self->field($tag) or return undef;
+    return $field->subfield($subfield);
+} # subfield()
+
+=head2 insert_grouped_field(C<$field>)
+
+Will insert the specified MARC::Field object into the record in 'grouped
+order' and return true (1) on success, and false (undef) on failure.
+For example, if a '650' field is inserted with insert_grouped_field()
+it will be inserted at the end of the 6XX group of tags. After some discussion
+on the perl4lib list it was descided that this is ordinarily what you will 
+want. If you would like to insert at a specific point in the record you can use 
+insert_fields_after() and insert_fields_before() methods which are described 
+below. 
+
+=cut 
+
+sub insert_grouped_field {
+    my ($self,$new) = @_;
+    _all_parms_are_fields($new) or return(_gripe('Argument must be MARC::Fieldobject'));
+
+    ## try to find the end of the field group and insert it there
+    my $limit = int($new->tag() / 100);
+    my $found = 0;
+    foreach my $field ($self->fields()) {
+	if ( int($field->tag() / 100) > $limit ) {
+	    $self->insert_field_before($field,$new);
+	    $found = 1;
+	    last;
+	}
+    }
+
+    ## if we couldn't find the end of the group, then we must not have 
+    ## any tags this high yet, so just append it
+    if (!$found) {
+	$self->append_fields($new); 
+    }
+
+    return(1);
+
+}
+
+=for internal
+
+=cut
+
+sub _all_parms_are_fields {
+    for ( @_ ) {
+	return 0 unless ref($_) eq 'MARC::Field';
+    }
+    return 1;
+}
+
+=head2 append_field(C<@fields>)
+
+Appends the field specified by C<$field> to the end of the record. 
+C<@fields> need to be MARC::Field objects.
+
+    my $field = MARC::Field->new('590','','','a' => 'My local note.');
+    $record->append_field($field);
+
+Returns the number of fields appended.
+
+=cut
+
+sub append_fields {
+    my $self = shift;
+
+    _all_parms_are_fields(@_) or return(_gripe('Arguments must be MARC::Field objects'));
+
+    push(@{ $self->{_fields} }, @_); 
+    return scalar @_;
+}
+
+=head2 insert_fields_before($before_field,@new_fields)
+
+Inserts the field specified by C<$new_field> before the field C<$before_field>.
+Returns the number of fields inserted, or undef on failures.
+Both C<$before_field> and all C<@new_fields> need to be MARC::Field objects.
+
+    my $before_field = $record->field('260');
+    my $new_field = MARC::Field->new('250','','','a' => '2nd ed.');
+    $record->insert_fields_before($before_field,$new_field);
+
+=cut
+
+sub insert_fields_before {
+    my $self = shift;
+
+    _all_parms_are_fields(@_) or return(_gripe('All arguments must be MARC::Field objects'));
+    my ($before,@new) = @_;
+
+    ## find position of $before
+    my $fields = $self->{_fields};
+    my $pos = 0;
+    foreach my $f (@$fields) {
+	last if ($f == $before);
+	$pos++;
+    }
+
+    ## insert before $before 
+    if ($pos >= @$fields) {
+	return(_gripe("Couldn't find field to insert before"));
+    }
+    splice(@$fields,$pos,0,@new);
+    return scalar @new;
+
+}
+
+=head2 insert_fields_after($after_field,@new_fields)
+
+Identical to L<insert_fields_before()>, but fields are added after C<$after_field>.
+
+=cut
+
+sub insert_fields_after {
+    my $self = shift;
+
+    _all_parms_are_fields(@_) or return(_gripe('All arguments must be MARC::Field objects'));
+    my ($after,@new) = @_;
+
+    ## find position of $after
+    my $fields = $self->{_fields};
+    my $pos = 0;
+    foreach my $f (@$fields) {
+	last if ($f == $after);
+	$pos++;
+    }
+
+    ## insert after $after
+    if ($pos+1 >= @$fields) { 
+	return(_gripe("Couldn't find field to insert after"));
+    }
+    splice(@$fields,$pos+1,0,@new);
+    return scalar @new;
+}
+
+=head2 delete_field(C<$field>)
+
+Deletes a field from the record.
+
+The field must have been retrieved from the record using the 
+C<field()> method.  For example, to delete a 526 tag if it exists:
+
+    my $tag526 = $marc->field( "526" );
+    if ( $tag526 ) {
+	$marc->delete_field( $tag526 );
+    }
+
+C<delete_field()> returns the number of fields that were deleted.
+This shouldn't be 0 unless you didn't get the tag properly.
+
+=cut
+
+sub delete_field {
+    my $self = shift;
+    my $deleter = shift;
+    my $list = $self->{_fields};
+
+    my $old_count = @$list;
+    @$list = grep { $_ != $deleter } @$list;
+    return $old_count - @$list;
+}
+
+=head2 as_usmarc()
+
+This is a wrapper around C<MARC::File::USMARC::encode()> for compatibility with
+older versions of MARC::Record.
+
+=cut
+
+sub as_usmarc() {
+    my $self = shift;
+
+    require MARC::File::USMARC;
+
+    return MARC::File::USMARC::encode( $self );
+}
+
+=head2 as_formatted()
+
+Returns a pretty string for printing in a MARC dump.
+
+=cut
+
+sub as_formatted() {
+    my $self = shift;
+	    
+    my @lines = ( "LDR " . ($self->{_leader} || "") );
+    for my $field ( @{$self->{_fields}} ) {
+	    push( @lines, $field->as_formatted() );
+    }
+
+    return join( "\n", @lines );
+} # as_formatted
+
+=head2 title()
+
+Returns the title from the 245 tag.
+Note that it is a string, not a MARC::Field record.
+
+=cut
+
+sub title() {
+    my $self = shift;
+
+    my $field = $self->field(245) or return "<no 245 tag found>";
+
+    return $field->as_string;
+}
+
+=head2 author()
+
+Returns the author from the 100, 110 or 111 tag.
+Note that it is a string, not a MARC::Field record.
+
+=cut
+
+sub author() {
+    my $self = shift;
+
+    for my $tag ( qw( 100 110 111 ) ) {
+	my $field = $self->field($tag);
+	return $field->as_string() if $field;
+    }
+
+    return "<No author tag found>";
+}
+
+=head2 leader([text])
+
+Returns the leader for the record.  Sets the leader if I<text> is defined.
+No error checking is done on the validity of the leader.
+
+=cut
+
+sub leader {
+    my $self = shift;
+    my $text = shift;
+
+    if ( defined $text ) {
+    	(length($text) eq 24)
+	    or $self->_warn( "Leader must be 24 bytes long" );
+	$self->{_leader} = $text;
+    } # set the leader
+
+    return $self->{_leader};
+} # leader()
+
+=head2 set_leader_lengths( $reclen, $baseaddr )
+
+Internal function for updating the leader's length and base address.
+
+=cut
+
+sub set_leader_lengths {
+    my $self = shift;
+    my $reclen = shift;
+    my $baseaddr = shift;
+    substr($self->{_leader},0,5)  = sprintf("%05d",$reclen);
+    substr($self->{_leader},12,5) = sprintf("%05d",$baseaddr);
+}
+
+=head2 clone( [field specs] )
+
+The C<clone()> method makes a copy of an existing MARC record and returns
+the new version.  Note that you cannot just say:
+
+    my $newmarc = $oldmarc;
+
+This just makes a copy of the reference, not a new object.  You must use
+the C<clone()> method like so:
+
+    my $newmarc = $oldmarc->clone;
+
+You can also specify field specs to filter down only a 
+certain subset of fields.  For instance, if you only wanted the
+title and ISBN tags from a record, you could do this:
+
+    my $small_marc = $marc->clone( 245, '020' );
+
+The order of the fields is preserved as it was in the original record.
+
+=cut
+
+sub clone {
+    my $self = shift;
+    my @keeper_tags = @_;
+
+    my $clone = $self->new();
+    $clone->{_leader} = $self->{_leader};
+
+    my $filtered = @keeper_tags ? [$self->field( @keeper_tags )] : undef;
+
+    for my $field ( $self->fields() ) {
+        if ( !$filtered || (grep {$field==$_} @$filtered ) ) {
+	    $clone->add_fields( $field->clone );
+        }
+    }
+
+    # XXX FIX THIS $clone->update_leader();
+
+    return $clone;
+}
+
+=head2 warnings()
+
+Returns the warnings that were created when the record was read.
+These are things like "Invalid indicators converted to blanks".
+
+The warnings are items that you might be interested in, or might
+not.  It depends on how stringently you're checking data.  If
+you're doing some grunt data analysis, you probably don't care.
+
+A side effect of calling warnings() is that the warning buffer will
+be cleared.
+
+=cut
+
+sub warnings() {
+    my $self = shift;
+    my @warnings = @{$self->{_warnings}};
+    $self->{_warnings} = []; 
+    return @warnings;
+}
+
+=head2 add_fields()
+
+C<add_fields()> is now deprecated, and users are encouraged to use C<append_field()>,
+C<insert_field_after()>, and C<insert_field_before()> since they do what you want 
+probably. It is still here though, for backwards compatability.
+
+C<add_fields()> adds MARC::Field objects to the end of the list.  Returns the 
+number of fields added, or C<undef> if there was an error.
+
+There are three ways of calling C<add_fields()> to add data to the record.
+
+=over 4
+
+=item 1 Create a MARC::Field object and add it
+
+  my $author = MARC::Field->new(
+	        100, "1", " ", a => "Arnosky, Jim."
+	        );
+  $marc->add_fields( $author );
+
+=item 2 Add the data fields directly, and let C<add_fields()> take care of the objectifying.
+
+  $marc->add_fields(
+        245, "1", "0",
+                a => "Raccoons and ripe corn /",
+                c => "Jim Arnosky.",
+        	);
+
+=item 3 Same as #2 above, but pass multiple fields of data in anonymous lists
+
+  $marc->add_fields(
+	[ 250, " ", " ", a => "1st ed." ],
+	[ 650, "1", " ", a => "Raccoons." ],
+	);
+
+=back
+
+=cut
+
+sub add_fields {
+    my $self = shift;
+
+    my $nfields = 0;
+    my $fields = $self->{_fields};
+
+    while ( my $parm = shift ) {
+	# User handed us a list of data (most common possibility)
+	if ( ref($parm) eq "" ) {
+	    my $field = MARC::Field->new( $parm, @_ )
+		    or return _gripe( $MARC::Field::ERROR );
+	    push( @$fields, $field );
+	    ++$nfields;
+	    last; # Bail out, we're done eating parms
+
+	# User handed us an object.
+	} elsif ( ref($parm) eq "MARC::Field" ) {
+	    push( @$fields, $parm );
+	    ++$nfields;
+
+	# User handed us an anonymous list of parms
+	} elsif ( ref($parm) eq "ARRAY" ) {
+	    my $field = MARC::Field->new(@$parm) 
+		or return _gripe( $MARC::Field::ERROR );
+	    push( @$fields, $field );
+	    ++$nfields;
+
+	} else {
+	    return _gripe( "Unknown parm of type", ref($parm), " passed to add_fields()" );
+	} # if
+
+    } # while
+
+    return $nfields;
+}
+
+=head2 new_from_usmarc( $marcblob )
+
+This is a wrapper around C<MARC::File::USMARC::decode()> for compatibility with
+older versions of MARC::Record.
+
+=cut
+
+sub new_from_usmarc {
+    my $blob = shift;
+    $blob = shift if (ref($blob) || ($blob eq "MARC::Record"));
+
+    require MARC::File::USMARC;
+
+    return MARC::File::USMARC::decode( $blob );
+}
+
+
+# NOTE: _warn is an object method
+sub _warn {
+    my $self = shift;
+
+    push( @{$self->{_warnings}}, join( "", @_ ) );
+}
+
+
+# NOTE: _gripe is NOT an object method
+sub _gripe {
+    $ERROR = join( "", @_ );
+
+    warn $ERROR;
+
+    return undef;
+}
+
+
+1;
+
+__END__
+
+=head1 DESIGN NOTES
+
+A brief discussion of why MARC::Record is done the way it is:
+
+=over 4
+
+=item * It's built for quick prototyping
+
+One of the areas Perl excels is in allowing the programmer to 
+create easy solutions quickly.  MARC::Record is designed along
+those same lines.  You want a program to dump all the 6XX
+tags in a file?  MARC::Record is your friend.
+
+=item * It's built for extensibility
+
+Currently, I'm using MARC::Record for analyzing bibliographic
+data, but who knows what might happen in the future?  MARC::Record
+needs to be just as adept at authority data, too.
+
+=item * It's designed around accessor methods
+
+I use method calls everywhere, and I expect calling programs to do
+the same, rather than accessing internal data directly.  If you
+access an object's hash fields on your own, future releases may
+break your code.
+
+=item * It's not built for speed
+
+One of the tradeoffs in using accessor methods is some overhead
+in the method calls.  Is this slow?  I don't know, I haven't measured.
+I would suggest that if you're a cycle junkie that you use
+Benchmark.pm to check to see where your bottlenecks are, and then
+decide if MARC::Record is for you.
+
+=back
+
+=head1 RELATED MODULES
+
+L<MARC::Record>, L<MARC::Lint>
+
+=head1 SEE ALSO
+
+=over 4
+
+=item * perl4lib (L<http://www.rice.edu/perl4lib/>)
+
+A mailing list devoted to the use of Perl in libraries.
+
+=item * Library Of Congress MARC pages (L<http://www.loc.gov/marc/>)
+
+The definitive source for all things MARC.
+
+
+=item * I<Understanding MARC Bibliographic> (L<http://lcweb.loc.gov/marc/umb/>)
+
+Online version of the free booklet.  An excellent overview of the MARC format.  Essential.
+
+
+=item * Tag Of The Month (L<http://www.tagofthemonth.com/>)
+
+Follett Software Company's
+(L<http://www.fsc.follett.com/>) monthly discussion of various MARC tags.
+
+=back
+
+=head1 TODO
+
+=over 4
+
+=item * Incorporate MARC.pm in the distribution.
+
+Combine MARC.pm and MARC::* into one distribution.
+
+=item * Podify MARC.pm
+
+=item * Allow regexes across the entire tag
+
+Imagine something like this:
+
+  my @sears_headings = $marc->tag_grep( /Sears/ );
+
+(from Mike O'Regan)
+
+=item * Insert a field in an arbitrary place in the record
+
+=item * Allow deleting a field
+
+  for my $field ( $record->field( "856" ) ) {
+	$record->delete_field( $field ) unless useful($field);
+	} # for
+
+(from Anne Highsmith hismith@tamu.edu)
+
+
+=item * Modifying an existing field
+
+=back
+
+=head1 IDEAS
+
+Ideas are things that have been considered, but nobody's actually asked for.
+
+=over 4
+
+=item * Create multiple output formats.
+
+These could be ASCII, XML, or MarcMaker.
+
+=back
+
+=head1 LICENSE
+
+This code may be distributed under the same terms as Perl itself. 
+
+Please note that these modules are not products of or supported by the
+employers of the various contributors to the code.
+
+=head1 AUTHOR
+
+Andy Lester, E<lt>marc@petdance.comE<gt> or E<lt>alester@flr.follett.comE<gt>
+
+=cut
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/MP3/Info.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/MP3/Info.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/MP3/Info.pm	(revision 24799)
@@ -0,0 +1,1563 @@
+package MP3::Info;
+use overload;
+use strict;
+use Carp;
+use Symbol;
+
+use vars qw(
+	@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $VERSION $REVISION
+	@mp3_genres %mp3_genres @winamp_genres %winamp_genres $try_harder
+	@t_bitrate @t_sampling_freq @frequency_tbl %v1_tag_fields
+	@v1_tag_names %v2_tag_names %v2_to_v1_names $AUTOLOAD
+	@mp3_info_fields
+);
+
+@ISA = 'Exporter';
+@EXPORT = qw(
+	set_mp3tag get_mp3tag get_mp3info remove_mp3tag
+	use_winamp_genres
+);
+@EXPORT_OK = qw(@mp3_genres %mp3_genres use_mp3_utf8);
+%EXPORT_TAGS = (
+	genres	=> [qw(@mp3_genres %mp3_genres)],
+	utf8	=> [qw(use_mp3_utf8)],
+	all	=> [@EXPORT, @EXPORT_OK]
+);
+
+# $Id: Info.pm 7488 2004-05-28 03:28:26Z davidb $
+($REVISION) = ' $Revision: 7488 $ ' =~ /\$Revision:\s+([^\s]+)/;
+$VERSION = '1.02';
+
+=pod
+
+=head1 NAME
+
+MP3::Info - Manipulate / fetch info from MP3 audio files
+
+=head1 SYNOPSIS
+
+	#!perl -w
+	use MP3::Info;
+	my $file = 'Pearls_Before_Swine.mp3';
+	set_mp3tag($file, 'Pearls Before Swine', q"77's",
+		'Sticks and Stones', '1990',
+		q"(c) 1990 77's LTD.", 'rock & roll');
+
+	my $tag = get_mp3tag($file) or die "No TAG info";
+	$tag->{GENRE} = 'rock';
+	set_mp3tag($file, $tag);
+
+	my $info = get_mp3info($file);
+	printf "$file length is %d:%d\n", $info->{MM}, $info->{SS};
+
+=cut
+
+{
+	my $c = -1;
+	# set all lower-case and regular-cased versions of genres as keys
+	# with index as value of each key
+	%mp3_genres = map {($_, ++$c, lc, $c)} @mp3_genres;
+
+	# do it again for winamp genres
+	$c = -1;
+	%winamp_genres = map {($_, ++$c, lc, $c)} @winamp_genres;
+}
+
+=pod
+
+	my $mp3 = new MP3::Info $file;
+	$mp3->title('Perls Before Swine');
+	printf "$file length is %s, title is %s\n",
+		$mp3->time, $mp3->title;
+
+
+=head1 DESCRIPTION
+
+=over 4
+
+=item $mp3 = MP3::Info-E<gt>new(FILE)
+
+OOP interface to the rest of the module.  The same keys
+available via get_mp3info and get_mp3tag are available
+via the returned object (using upper case or lower case;
+but note that all-caps "VERSION" will return the module
+version, not the MP3 version).
+
+Passing a value to one of the methods will set the value
+for that tag in the MP3 file, if applicable.
+
+=cut
+
+sub new {
+	my($pack, $file) = @_;
+
+	my $info = get_mp3info($file) or return undef;
+	my $tags = get_mp3tag($file) || { map { ($_ => undef) } @v1_tag_names };
+	my %self = (
+		FILE		=> $file,
+		TRY_HARDER	=> 0
+	);
+
+	@self{@mp3_info_fields, @v1_tag_names, 'file'} = (
+		@{$info}{@mp3_info_fields},
+		@{$tags}{@v1_tag_names},
+		$file
+	);
+
+	return bless \%self, $pack;
+}
+
+sub can {
+	my $self = shift;
+	return $self->SUPER::can(@_) unless ref $self;
+	my $name = uc shift;
+	return sub { $self->$name(@_) } if exists $self->{$name};
+	return undef;
+}
+
+sub AUTOLOAD {
+	my($self) = @_;
+	(my $name = uc $AUTOLOAD) =~ s/^.*://;
+
+	if (exists $self->{$name}) {
+		my $sub = exists $v1_tag_fields{$name}
+			? sub {
+				if (defined $_[1]) {
+					$_[0]->{$name} = $_[1];
+					set_mp3tag($_[0]->{FILE}, $_[0]);
+				}
+				return $_[0]->{$name};
+			}
+			: sub {
+				return $_[0]->{$name}
+			};
+
+		no strict 'refs';
+		*{$AUTOLOAD} = $sub;
+		goto &$AUTOLOAD;
+
+	} else {
+		carp(sprintf "No method '$name' available in package %s.",
+			__PACKAGE__);
+	}
+}
+
+sub DESTROY {
+
+}
+
+
+=item use_mp3_utf8([STATUS])
+
+Tells MP3::Info to (or not) return TAG info in UTF-8.
+TRUE is 1, FALSE is 0.  Default is FALSE.
+
+Will only be able to it on if Unicode::String is available.  ID3v2
+tags will be converted to UTF-8 according to the encoding specified
+in each tag; ID3v1 tags will be assumed Latin-1 and converted
+to UTF-8.
+
+Function returns status (TRUE/FALSE).  If no argument is supplied,
+or an unaccepted argument is supplied, function merely returns status.
+
+This function is not exported by default, but may be exported
+with the C<:utf8> or C<:all> export tag.
+
+=cut
+
+my $unicode_module = eval { require Unicode::String };
+my $UNICODE = 0;
+
+sub use_mp3_utf8 {
+	my($val) = @_;
+	if ($val == 1) {
+		$UNICODE = 1 if $unicode_module;
+	} elsif ($val == 0) {
+		$UNICODE = 0;
+	}
+	return $UNICODE;
+}
+
+=pod
+
+=item use_winamp_genres()
+
+Puts WinAmp genres into C<@mp3_genres> and C<%mp3_genres>
+(adds 68 additional genres to the default list of 80).
+This is a separate function because these are non-standard
+genres, but they are included because they are widely used.
+
+You can import the data structures with one of:
+
+	use MP3::Info qw(:genres);
+	use MP3::Info qw(:DEFAULT :genres);
+	use MP3::Info qw(:all);
+
+=cut
+
+sub use_winamp_genres {
+	%mp3_genres = %winamp_genres;
+	@mp3_genres = @winamp_genres;
+	return 1;
+}
+
+=pod
+
+=item remove_mp3tag (FILE [, VERSION, BUFFER])
+
+Can remove ID3v1 or ID3v2 tags.  VERSION should be C<1> for ID3v1,
+C<2> for ID3v2, and C<ALL> for both.
+
+For ID3v1, removes last 128 bytes from file if those last 128 bytes begin
+with the text 'TAG'.  File will be 128 bytes shorter.
+
+For ID3v2, removes ID3v2 tag.  Because an ID3v2 tag is at the
+beginning of the file, we rewrite the file after removing the tag data.
+The buffer for rewriting the file is 4MB.  BUFFER (in bytes) ca
+change the buffer size.
+
+Returns the number of bytes removed, or -1 if no tag removed,
+or undef if there is an error.
+
+=cut
+
+sub remove_mp3tag {
+	my($file, $version, $buf) = @_;
+	my($fh, $return);
+
+	$buf ||= 4096*1024;  # the bigger the faster
+	$version ||= 1;
+
+	if (not (defined $file && $file ne '')) {
+		$@ = "No file specified";
+		return undef;
+	}
+
+	if (not -s $file) {
+		$@ = "File is empty";
+		return undef;
+	}
+
+	if (ref $file) { # filehandle passed
+		$fh = $file;
+	} else {
+		$fh = gensym;
+		if (not open $fh, "+< $file\0") {
+			$@ = "Can't open $file: $!";
+			return undef;
+		}
+	}
+
+	binmode $fh;
+
+	if ($version eq 1 || $version eq 'ALL') {
+		seek $fh, -128, 2;
+		my $tell = tell $fh;
+		if (<$fh> =~ /^TAG/) {
+			truncate $fh, $tell or carp "Can't truncate '$file': $!";
+			$return += 128;
+		}
+	}
+
+	if ($version eq 2 || $version eq 'ALL') {
+		my $h = _get_v2head($fh);
+		if ($h) {
+			local $\;
+			seek $fh, 0, 2;
+			my $eof = tell $fh;
+			my $off = $h->{tag_size};
+
+			while ($off < $eof) {
+				seek $fh, $off, 0;
+				read $fh, my($bytes), $buf;
+				seek $fh, $off - $h->{tag_size}, 0;
+				print $fh $bytes;
+				$off += $buf;
+			}
+
+			truncate $fh, $eof - $h->{tag_size}
+				or carp "Can't truncate '$file': $!";
+			$return += $h->{tag_size};
+		}
+	}
+
+	_close($file, $fh);
+
+	return $return || -1;
+}
+
+
+=pod
+
+=item set_mp3tag (FILE, TITLE, ARTIST, ALBUM, YEAR, COMMENT, GENRE [, TRACKNUM])
+
+=item set_mp3tag (FILE, $HASHREF)
+
+Adds/changes tag information in an MP3 audio file.  Will clobber
+any existing information in file.
+
+Fields are TITLE, ARTIST, ALBUM, YEAR, COMMENT, GENRE.  All fields have
+a 30-byte limit, except for YEAR, which has a four-byte limit, and GENRE,
+which is one byte in the file.  The GENRE passed in the function is a
+case-insensitive text string representing a genre found in C<@mp3_genres>.
+
+Will accept either a list of values, or a hashref of the type
+returned by C<get_mp3tag>.
+
+If TRACKNUM is present (for ID3v1.1), then the COMMENT field can only be
+28 bytes.
+
+ID3v2 support may come eventually.  Note that if you set a tag on a file
+with ID3v2, the set tag will be for ID3v1[.1] only, and if you call
+C<get_mp3_tag> on the file, it will show you the (unchanged) ID3v2 tags,
+unless you specify ID3v1.
+
+=cut
+
+sub set_mp3tag {
+	my($file, $title, $artist, $album, $year, $comment, $genre, $tracknum) = @_;
+	my(%info, $oldfh, $ref, $fh);
+	local %v1_tag_fields = %v1_tag_fields;
+
+	# set each to '' if undef
+	for ($title, $artist, $album, $year, $comment, $tracknum, $genre,
+		(@info{@v1_tag_names}))
+		{$_ = defined() ? $_ : ''}
+
+	($ref) = (overload::StrVal($title) =~ /^(?:.*\=)?([^=]*)\((?:[^\(]*)\)$/)
+		if ref $title;
+	# populate data to hashref if hashref is not passed
+	if (!$ref) {
+		(@info{@v1_tag_names}) =
+			($title, $artist, $album, $year, $comment, $tracknum, $genre);
+
+	# put data from hashref into hashref if hashref is passed
+	} elsif ($ref eq 'HASH') {
+		%info = %$title;
+
+	# return otherwise
+	} else {
+		carp(<<'EOT');
+Usage: set_mp3tag (FILE, TITLE, ARTIST, ALBUM, YEAR, COMMENT, GENRE [, TRACKNUM])
+       set_mp3tag (FILE, $HASHREF)
+EOT
+		return undef;
+	}
+
+	if (not (defined $file && $file ne '')) {
+		$@ = "No file specified";
+		return undef;
+	}
+
+	if (not -s $file) {
+		$@ = "File is empty";
+		return undef;
+	}
+
+	# comment field length 28 if ID3v1.1
+	$v1_tag_fields{COMMENT} = 28 if $info{TRACKNUM};
+
+
+	# only if -w is on
+	if ($^W) {
+		# warn if fields too long
+		foreach my $field (keys %v1_tag_fields) {
+			$info{$field} = '' unless defined $info{$field};
+			if (length($info{$field}) > $v1_tag_fields{$field}) {
+				carp "Data too long for field $field: truncated to " .
+					 "$v1_tag_fields{$field}";
+			}
+		}
+
+		if ($info{GENRE}) {
+			carp "Genre `$info{GENRE}' does not exist\n"
+				unless exists $mp3_genres{$info{GENRE}};
+		}
+	}
+
+	if ($info{TRACKNUM}) {
+		$info{TRACKNUM} =~ s/^(\d+)\/(\d+)$/$1/;
+		unless ($info{TRACKNUM} =~ /^\d+$/ &&
+			$info{TRACKNUM} > 0 && $info{TRACKNUM} < 256) {
+			carp "Tracknum `$info{TRACKNUM}' must be an integer " .
+				"from 1 and 255\n" if $^W;
+			$info{TRACKNUM} = '';
+		}
+	}
+
+	if (ref $file) { # filehandle passed
+		$fh = $file;
+	} else {
+		$fh = gensym;
+		if (not open $fh, "+< $file\0") {
+			$@ = "Can't open $file: $!";
+			return undef;
+		}
+	}
+
+	binmode $fh;
+	$oldfh = select $fh;
+	seek $fh, -128, 2;
+	# go to end of file if no tag, beginning of file if tag
+	seek $fh, (<$fh> =~ /^TAG/ ? -128 : 0), 2;
+
+	# get genre value
+	$info{GENRE} = $info{GENRE} && exists $mp3_genres{$info{GENRE}} ?
+		$mp3_genres{$info{GENRE}} : 255;  # some default genre
+
+	local $\;
+	# print TAG to file
+	if ($info{TRACKNUM}) {
+		print pack "a3a30a30a30a4a28xCC", 'TAG', @info{@v1_tag_names};
+	} else {
+		print pack "a3a30a30a30a4a30C", 'TAG', @info{@v1_tag_names[0..4, 6]};
+	}
+
+	select $oldfh;
+
+	_close($file, $fh);
+
+	return 1;
+}
+
+=pod
+
+=item get_mp3tag (FILE [, VERSION, RAW_V2])
+
+Returns hash reference containing tag information in MP3 file.  The keys
+returned are the same as those supplied for C<set_mp3tag>, except in the
+case of RAW_V2 being set.
+
+If VERSION is C<1>, the information is taken from the ID3v1 tag (if present).
+If VERSION is C<2>, the information is taken from the ID3v2 tag (if present).
+If VERSION is not supplied, or is false, the ID3v1 tag is read if present, and
+then, if present, the ID3v2 tag information will override any existing ID3v1
+tag info.
+
+If RAW_V2 is C<1>, the raw ID3v2 tag data is returned, without any manipulation
+of text encoding.  The key name is the same as the frame ID (ID to name mappings
+are in the global %v2_tag_names).
+
+If RAW_V2 is C<2>, the ID3v2 tag data is returned, manipulating for Unicode if
+necessary, etc.  It also takes multiple values for a given key (such as comments)
+and puts them in an arrayref.
+
+If the ID3v2 version is older than ID3v2.2.0 or newer than ID3v2.4.0, it will
+not be read.
+
+Strings returned will be in Latin-1, unless UTF-8 is specified (L<use_mp3_utf8>),
+(unless RAW_V2 is C<1>).
+
+Also returns a TAGVERSION key, containing the ID3 version used for the returned
+data (if TAGVERSION argument is C<0>, may contain two versions).
+
+=cut
+
+sub get_mp3tag {
+	my($file, $ver, $raw_v2) = @_;
+	my($tag, $v1, $v2, $v2h, %info, @array, $fh);
+	$raw_v2 ||= 0;
+	$ver = !$ver ? 0 : ($ver == 2 || $ver == 1) ? $ver : 0;
+
+	if (not (defined $file && $file ne '')) {
+		$@ = "No file specified";
+		return undef;
+	}
+
+	if (not -s $file) {
+		$@ = "File is empty";
+		return undef;
+	}
+
+	if (ref $file) { # filehandle passed
+		$fh = $file;
+	} else {
+		$fh = gensym;
+		if (not open $fh, "< $file\0") {
+			$@ = "Can't open $file: $!";
+			return undef;
+		}
+	}
+
+	binmode $fh;
+
+	if ($ver < 2) {
+		seek $fh, -128, 2;
+		while(defined(my $line = <$fh>)) { $tag .= $line }
+
+		if ($tag =~ /^TAG/) {
+			$v1 = 1;
+			if (substr($tag, -3, 2) =~ /\000[^\000]/) {
+				(undef, @info{@v1_tag_names}) =
+					(unpack('a3a30a30a30a4a28', $tag),
+					ord(substr($tag, -2, 1)),
+					$mp3_genres[ord(substr $tag, -1)]);
+				$info{TAGVERSION} = 'ID3v1.1';
+			} else {
+				(undef, @info{@v1_tag_names[0..4, 6]}) =
+					(unpack('a3a30a30a30a4a30', $tag),
+					$mp3_genres[ord(substr $tag, -1)]);
+				$info{TAGVERSION} = 'ID3v1';
+			}
+			if ($UNICODE) {
+				for my $key (keys %info) {
+					next unless $info{$key};
+					my $u = Unicode::String::latin1($info{$key});
+					$info{$key} = $u->utf8;
+				}
+			}
+		} elsif ($ver == 1) {
+			_close($file, $fh);
+			$@ = "No ID3v1 tag found";
+			return undef;
+		}
+	}
+
+	($v2, $v2h) = _get_v2tag($fh);
+
+	unless ($v1 || $v2) {
+		_close($file, $fh);
+		$@ = "No ID3 tag found";
+		return undef;
+	}
+
+	if (($ver == 0 || $ver == 2) && $v2) {
+		if ($raw_v2 == 1 && $ver == 2) {
+			%info = %$v2;
+			$info{TAGVERSION} = $v2h->{version};
+		} else {
+			my $hash = $raw_v2 == 2 ? { map { ($_, $_) } keys %v2_tag_names } : \%v2_to_v1_names;
+			for my $id (keys %$hash) {
+				if (exists $v2->{$id}) {
+					if ($id =~ /^TCON?$/ && $v2->{$id} =~ /^.?\((\d+)\)/) {
+						$info{$hash->{$id}} = $mp3_genres[$1];
+					} else {
+						my $data1 = $v2->{$id};
+
+						# this is tricky ... if this is an arrayref,
+						# we want to only return one, so we pick the
+						# first one.  but if it is a comment, we pick
+						# the first one where the first charcter after
+						# the language is NULL and not an additional
+						# sub-comment, because that is most likely to be
+						# the user-supplied comment
+						if (ref $data1 && !$raw_v2) {
+							if ($id =~ /^COMM?$/) {
+								my($newdata) = grep /^(....\000)/, @{$data1};
+								$data1 = $newdata || $data1->[0];
+							} else {
+								$data1 = $data1->[0];
+							}
+						}
+
+						$data1 = [ $data1 ] if ! ref $data1;
+
+						for my $data (@$data1) {
+							$data =~ s/^(.)//; # strip first char (text encoding)
+							my $encoding = $1;
+							my $desc;
+							if ($id =~ /^COM[M ]?$/) {
+								$data =~ s/^(?:...)//;		# strip language
+								$data =~ s/^(.*?)\000+//;	# strip up to first NULL(s),
+												# for sub-comment
+								$desc = $1;
+							}
+
+							if ($UNICODE) {
+								if ($encoding eq "\001" || $encoding eq "\002") {  # UTF-16, UTF-16BE
+									my $u = Unicode::String::utf16($data);
+									$data = $u->utf8;
+									$data =~ s/^\xEF\xBB\xBF//;	# strip BOM
+								} elsif ($encoding eq "\000") {
+									my $u = Unicode::String::latin1($data);
+									$data = $u->utf8;
+								}
+							}
+
+							if ($raw_v2 == 2 && $desc) {
+								$data = { $desc => $data };
+							}
+
+							if ($raw_v2 == 2 && exists $info{$hash->{$id}}) {
+								if (ref $info{$hash->{$id}} eq 'ARRAY') {
+									push @{$info{$hash->{$id}}}, $data;
+								} else {
+									$info{$hash->{$id}} = [ $info{$hash->{$id}}, $data ];
+								}
+							} else {
+								$info{$hash->{$id}} = $data;
+							}
+						}
+					}
+				}
+			}
+			if ($ver == 0 && $info{TAGVERSION}) {
+				$info{TAGVERSION} .= ' / ' . $v2h->{version};
+			} else {
+				$info{TAGVERSION} = $v2h->{version};
+			}
+		}
+	}
+
+	unless ($raw_v2 && $ver == 2) {
+		foreach my $key (keys %info) {
+			if (defined $info{$key}) {
+				$info{$key} =~ s/\000+.*//g;
+				$info{$key} =~ s/\s+$//;
+			}
+		}
+
+		for (@v1_tag_names) {
+			$info{$_} = '' unless defined $info{$_};
+		}
+	}
+
+	if (keys %info && exists $info{GENRE} && ! defined $info{GENRE}) {
+		$info{GENRE} = '';
+	}
+
+	_close($file, $fh);
+
+	return keys %info ? {%info} : undef;
+}
+
+sub _get_v2tag {
+	my($fh) = @_;
+	my($off, $myseek, $myseek_22, $myseek_23, $v2, $h, $hlen, $num);
+	$h = {};
+
+	$v2 = _get_v2head($fh) or return;
+	if ($v2->{major_version} < 2) {
+		carp "This is $v2->{version}; " .
+		     "ID3v2 versions older than ID3v2.2.0 not supported\n"
+		     if $^W;
+		return;
+	}
+
+	if ($v2->{major_version} == 2) {
+		$hlen = 6;
+		$num = 3;
+	} else {
+		$hlen = 10;
+		$num = 4;
+	}
+
+	$myseek = sub {
+		seek $fh, $off, 0;
+		read $fh, my($bytes), $hlen;
+		return unless $bytes =~ /^([A-Z0-9]{$num})/
+			|| ($num == 4 && $bytes =~ /^(COM )/);  # stupid iTunes
+		my($id, $size) = ($1, $hlen);
+		my @bytes = reverse unpack "C$num", substr($bytes, $num, $num);
+		for my $i (0 .. ($num - 1)) {
+			$size += $bytes[$i] * 256 ** $i;
+		}
+		return($id, $size);
+	};
+
+	$off = $v2->{ext_header_size} + 10;
+
+	while ($off < $v2->{tag_size}) {
+		my($id, $size) = &$myseek or last;
+		seek $fh, $off + $hlen, 0;
+		read $fh, my($bytes), $size - $hlen;
+		if (exists $h->{$id}) {
+			if (ref $h->{$id} eq 'ARRAY') {
+				push @{$h->{$id}}, $bytes;
+			} else {
+				$h->{$id} = [$h->{$id}, $bytes];
+			}
+		} else {
+			$h->{$id} = $bytes;
+		}
+		$off += $size;
+	}
+
+	return($h, $v2);
+}
+
+
+=pod
+
+=item get_mp3info (FILE)
+
+Returns hash reference containing file information for MP3 file.
+This data cannot be changed.  Returned data:
+
+	VERSION		MPEG audio version (1, 2, 2.5)
+	LAYER		MPEG layer description (1, 2, 3)
+	STEREO		boolean for audio is in stereo
+
+	VBR		boolean for variable bitrate
+	BITRATE		bitrate in kbps (average for VBR files)
+	FREQUENCY	frequency in kHz
+	SIZE		bytes in audio stream
+
+	SECS		total seconds
+	MM		minutes
+	SS		leftover seconds
+	MS		leftover milliseconds
+	TIME		time in MM:SS
+
+	COPYRIGHT	boolean for audio is copyrighted
+	PADDING		boolean for MP3 frames are padded
+	MODE		channel mode (0 = stereo, 1 = joint stereo,
+			2 = dual channel, 3 = single channel)
+	FRAMES		approximate number of frames
+	FRAME_LENGTH	approximate length of a frame
+	VBR_SCALE	VBR scale from VBR header
+
+On error, returns nothing and sets C<$@>.
+
+=cut
+
+sub get_mp3info {
+	my($file) = @_;
+	my($off, $myseek, $byte, $eof, $h, $tot, $fh);
+
+	if (not (defined $file && $file ne '')) {
+		$@ = "No file specified";
+		return undef;
+	}
+
+	if (not -s $file) {
+		$@ = "File is empty";
+		return undef;
+	}
+
+	if (ref $file) { # filehandle passed
+		$fh = $file;
+	} else {
+		$fh = gensym;
+		if (not open $fh, "< $file\0") {
+			$@ = "Can't open $file: $!";
+			return undef;
+		}
+	}
+
+	$off = 0;
+	$tot = 4096;
+
+	$myseek = sub {
+		seek $fh, $off, 0;
+		read $fh, $byte, 4;
+	};
+
+	binmode $fh;
+	&$myseek;
+
+	if ($off == 0) {
+		if (my $id3v2 = _get_v2head($fh)) {
+			$tot += $off += $id3v2->{tag_size};
+			&$myseek;
+		}
+	}
+
+	$h = _get_head($byte);
+	until (_is_mp3($h)) {
+		$off++;
+		&$myseek;
+		$h = _get_head($byte);
+		if ($off > $tot && !$try_harder) {
+			_close($file, $fh);
+			$@ = "Couldn't find MP3 header (perhaps set " .
+			     '$MP3::Info::try_harder and retry)';
+			return undef;
+		}
+	}
+
+	my $vbr = _get_vbr($fh, $h, \$off);
+
+	seek $fh, 0, 2;
+	$eof = tell $fh;
+	seek $fh, -128, 2;
+	$off += 128 if <$fh> =~ /^TAG/ ? 1 : 0;
+
+	_close($file, $fh);
+
+	$h->{size} = $eof - $off;
+
+	return _get_info($h, $vbr);
+}
+
+sub _get_info {
+	my($h, $vbr) = @_;
+	my $i;
+
+	$i->{VERSION}	= $h->{IDR} == 2 ? 2 : $h->{IDR} == 3 ? 1 :
+				$h->{IDR} == 0 ? 2.5 : 0;
+	$i->{LAYER}	= 4 - $h->{layer};
+	$i->{VBR}	= defined $vbr ? 1 : 0;
+
+	$i->{COPYRIGHT}	= $h->{copyright} ? 1 : 0;
+	$i->{PADDING}	= $h->{padding_bit} ? 1 : 0;
+	$i->{STEREO}	= $h->{mode} == 3 ? 0 : 1;
+	$i->{MODE}	= $h->{mode};
+
+	$i->{SIZE}	= $vbr && $vbr->{bytes} ? $vbr->{bytes} : $h->{size};
+
+	my $mfs		= $h->{fs} / ($h->{ID} ? 144000 : 72000);
+	$i->{FRAMES}	= int($vbr && $vbr->{frames}
+				? $vbr->{frames}
+				: $i->{SIZE} / $h->{bitrate} / $mfs
+			  );
+
+	if ($vbr) {
+		$i->{VBR_SCALE}	= $vbr->{scale} if $vbr->{scale};
+		$h->{bitrate}	= $i->{SIZE} / $i->{FRAMES} * $mfs;
+		if (not $h->{bitrate}) {
+			$@ = "Couldn't determine VBR bitrate";
+			return undef;
+		}
+	}
+
+	$h->{'length'}	= ($i->{SIZE} * 8) / $h->{bitrate} / 10;
+	$i->{SECS}	= $h->{'length'} / 100;
+	$i->{MM}	= int $i->{SECS} / 60;
+	$i->{SS}	= int $i->{SECS} % 60;
+	$i->{MS}	= (($i->{SECS} - ($i->{MM} * 60) - $i->{SS}) * 1000);
+#	$i->{LF}	= ($i->{MS} / 1000) * ($i->{FRAMES} / $i->{SECS});
+#	int($i->{MS} / 100 * 75);  # is this right?
+	$i->{TIME}	= sprintf "%.2d:%.2d", @{$i}{'MM', 'SS'};
+
+	$i->{BITRATE}		= int $h->{bitrate};
+	# should we just return if ! FRAMES?
+	$i->{FRAME_LENGTH}	= int($h->{size} / $i->{FRAMES}) if $i->{FRAMES};
+	$i->{FREQUENCY}		= $frequency_tbl[3 * $h->{IDR} + $h->{sampling_freq}];
+
+	return $i;
+}
+
+sub _get_head {
+	my($byte) = @_;
+	my($bytes, $h);
+
+	$bytes = _unpack_head($byte);
+	@$h{qw(IDR ID layer protection_bit
+		bitrate_index sampling_freq padding_bit private_bit
+		mode mode_extension copyright original
+		emphasis version_index bytes)} = (
+		($bytes>>19)&3, ($bytes>>19)&1, ($bytes>>17)&3, ($bytes>>16)&1,
+		($bytes>>12)&15, ($bytes>>10)&3, ($bytes>>9)&1, ($bytes>>8)&1,
+		($bytes>>6)&3, ($bytes>>4)&3, ($bytes>>3)&1, ($bytes>>2)&1,
+		$bytes&3, ($bytes>>19)&3, $bytes
+	);
+
+	$h->{bitrate} = $t_bitrate[$h->{ID}][3 - $h->{layer}][$h->{bitrate_index}];
+	$h->{fs} = $t_sampling_freq[$h->{IDR}][$h->{sampling_freq}];
+
+	return $h;
+}
+
+sub _is_mp3 {
+	my $h = $_[0] or return undef;
+	return ! (	# all below must be false
+		 $h->{bitrate_index} == 0
+			||
+		 $h->{version_index} == 1
+			||
+		($h->{bytes} & 0xFFE00000) != 0xFFE00000
+			||
+		!$h->{fs}
+			||
+		!$h->{bitrate}
+			||
+		 $h->{bitrate_index} == 15
+			||
+		!$h->{layer}
+			||
+		 $h->{sampling_freq} == 3
+			||
+		 $h->{emphasis} == 2
+			||
+		!$h->{bitrate_index}
+			||
+		($h->{bytes} & 0xFFFF0000) == 0xFFFE0000
+			||
+		($h->{ID} == 1 && $h->{layer} == 3 && $h->{protection_bit} == 1)
+			||
+		($h->{mode_extension} != 0 && $h->{mode} != 1)
+	);
+}
+
+sub _get_vbr {
+	my($fh, $h, $roff) = @_;
+	my($off, $bytes, @bytes, $myseek, %vbr);
+
+	$off = $$roff;
+	@_ = ();	# closure confused if we don't do this
+
+	$myseek = sub {
+		my $n = $_[0] || 4;
+		seek $fh, $off, 0;
+		read $fh, $bytes, $n;
+		$off += $n;
+	};
+
+	$off += 4;
+
+	if ($h->{ID}) {	# MPEG1
+		$off += $h->{mode} == 3 ? 17 : 32;
+	} else {	# MPEG2
+		$off += $h->{mode} == 3 ? 9 : 17;
+	}
+
+	&$myseek;
+	return unless $bytes eq 'Xing';
+
+	&$myseek;
+	$vbr{flags} = _unpack_head($bytes);
+
+	if ($vbr{flags} & 1) {
+		&$myseek;
+		$vbr{frames} = _unpack_head($bytes);
+	}
+
+	if ($vbr{flags} & 2) {
+		&$myseek;
+		$vbr{bytes} = _unpack_head($bytes);
+	}
+
+	if ($vbr{flags} & 4) {
+		$myseek->(100);
+# Not used right now ...
+#		$vbr{toc} = _unpack_head($bytes);
+	}
+
+	if ($vbr{flags} & 8) { # (quality ind., 0=best 100=worst)
+		&$myseek;
+		$vbr{scale} = _unpack_head($bytes);
+	} else {
+		$vbr{scale} = -1;
+	}
+
+	$$roff = $off;
+	return \%vbr;
+}
+
+sub _get_v2head {
+	my $fh = $_[0] or return;
+	my($h, $bytes, @bytes);
+
+	# check first three bytes for 'ID3'
+	seek $fh, 0, 0;
+	read $fh, $bytes, 3;
+	return unless $bytes eq 'ID3';
+
+	# get version
+	read $fh, $bytes, 2;
+	$h->{version} = sprintf "ID3v2.%d.%d",
+		@$h{qw[major_version minor_version]} =
+			unpack 'c2', $bytes;
+
+	# get flags
+	read $fh, $bytes, 1;
+	if ($h->{major_version} == 2) {
+		@$h{qw[unsync compression]} =
+			(unpack 'b8', $bytes)[7, 6];
+		$h->{ext_header} = 0;
+		$h->{experimental} = 0;
+	} else {
+		@$h{qw[unsync ext_header experimental]} =
+			(unpack 'b8', $bytes)[7, 6, 5];
+	}
+
+	# get ID3v2 tag length from bytes 7-10
+	$h->{tag_size} = 10;	# include ID3v2 header size
+	read $fh, $bytes, 4;
+	@bytes = reverse unpack 'C4', $bytes;
+	foreach my $i (0 .. 3) {
+		# whoaaaaaa nellllllyyyyyy!
+		$h->{tag_size} += $bytes[$i] * 128 ** $i;
+	}
+
+	# get extended header size
+	$h->{ext_header_size} = 0;
+	if ($h->{ext_header}) {
+		$h->{ext_header_size} += 10;
+		read $fh, $bytes, 4;
+		@bytes = reverse unpack 'C4', $bytes;
+		for my $i (0..3) {
+			$h->{ext_header_size} += $bytes[$i] * 256 ** $i;
+		}
+	}
+
+	return $h;
+}
+
+sub _unpack_head {
+	unpack('l', pack('L', unpack('N', $_[0])));
+}
+
+sub _close {
+	my($file, $fh) = @_;
+	unless (ref $file) { # filehandle not passed
+		close $fh or carp "Problem closing '$file': $!";
+	}
+}
+
+BEGIN {
+	@mp3_genres = (
+		'Blues',
+		'Classic Rock',
+		'Country',
+		'Dance',
+		'Disco',
+		'Funk',
+		'Grunge',
+		'Hip-Hop',
+		'Jazz',
+		'Metal',
+		'New Age',
+		'Oldies',
+		'Other',
+		'Pop',
+		'R&B',
+		'Rap',
+		'Reggae',
+		'Rock',
+		'Techno',
+		'Industrial',
+		'Alternative',
+		'Ska',
+		'Death Metal',
+		'Pranks',
+		'Soundtrack',
+		'Euro-Techno',
+		'Ambient',
+		'Trip-Hop',
+		'Vocal',
+		'Jazz+Funk',
+		'Fusion',
+		'Trance',
+		'Classical',
+		'Instrumental',
+		'Acid',
+		'House',
+		'Game',
+		'Sound Clip',
+		'Gospel',
+		'Noise',
+		'AlternRock',
+		'Bass',
+		'Soul',
+		'Punk',
+		'Space',
+		'Meditative',
+		'Instrumental Pop',
+		'Instrumental Rock',
+		'Ethnic',
+		'Gothic',
+		'Darkwave',
+		'Techno-Industrial',
+		'Electronic',
+		'Pop-Folk',
+		'Eurodance',
+		'Dream',
+		'Southern Rock',
+		'Comedy',
+		'Cult',
+		'Gangsta',
+		'Top 40',
+		'Christian Rap',
+		'Pop/Funk',
+		'Jungle',
+		'Native American',
+		'Cabaret',
+		'New Wave',
+		'Psychadelic',
+		'Rave',
+		'Showtunes',
+		'Trailer',
+		'Lo-Fi',
+		'Tribal',
+		'Acid Punk',
+		'Acid Jazz',
+		'Polka',
+		'Retro',
+		'Musical',
+		'Rock & Roll',
+		'Hard Rock',
+	);
+
+	@winamp_genres = (
+		@mp3_genres,
+		'Folk',
+		'Folk-Rock',
+		'National Folk',
+		'Swing',
+		'Fast Fusion',
+		'Bebob',
+		'Latin',
+		'Revival',
+		'Celtic',
+		'Bluegrass',
+		'Avantgarde',
+		'Gothic Rock',
+		'Progressive Rock',
+		'Psychedelic Rock',
+		'Symphonic Rock',
+		'Slow Rock',
+		'Big Band',
+		'Chorus',
+		'Easy Listening',
+		'Acoustic',
+		'Humour',
+		'Speech',
+		'Chanson',
+		'Opera',
+		'Chamber Music',
+		'Sonata',
+		'Symphony',
+		'Booty Bass',
+		'Primus',
+		'Porn Groove',
+		'Satire',
+		'Slow Jam',
+		'Club',
+		'Tango',
+		'Samba',
+		'Folklore',
+		'Ballad',
+		'Power Ballad',
+		'Rhythmic Soul',
+		'Freestyle',
+		'Duet',
+		'Punk Rock',
+		'Drum Solo',
+		'Acapella',
+		'Euro-House',
+		'Dance Hall',
+		'Goa',
+		'Drum & Bass',
+		'Club-House',
+		'Hardcore',
+		'Terror',
+		'Indie',
+		'BritPop',
+		'Negerpunk',
+		'Polsk Punk',
+		'Beat',
+		'Christian Gangsta Rap',
+		'Heavy Metal',
+		'Black Metal',
+		'Crossover',
+		'Contemporary Christian',
+		'Christian Rock',
+		'Merengue',
+		'Salsa',
+		'Thrash Metal',
+		'Anime',
+		'JPop',
+		'Synthpop',
+	);
+
+	@t_bitrate = ([
+		[0, 32, 48, 56,  64,  80,  96, 112, 128, 144, 160, 176, 192, 224, 256],
+		[0,  8, 16, 24,  32,  40,  48,  56,  64,  80,  96, 112, 128, 144, 160],
+		[0,  8, 16, 24,  32,  40,  48,  56,  64,  80,  96, 112, 128, 144, 160]
+	],[
+		[0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448],
+		[0, 32, 48, 56,  64,  80,  96, 112, 128, 160, 192, 224, 256, 320, 384],
+		[0, 32, 40, 48,  56,  64,  80,  96, 112, 128, 160, 192, 224, 256, 320]
+	]);
+
+	@t_sampling_freq = (
+		[11025, 12000,  8000],
+		[undef, undef, undef],	# reserved
+		[22050, 24000, 16000],
+		[44100, 48000, 32000]
+	);
+
+	@frequency_tbl = map { $_ ? eval "${_}e-3" : 0 }
+		map { @$_ } @t_sampling_freq;
+
+	@mp3_info_fields = qw(
+		VERSION
+		LAYER
+		STEREO
+		VBR
+		BITRATE
+		FREQUENCY
+		SIZE
+		SECS
+		MM
+		SS
+		MS
+		TIME
+		COPYRIGHT
+		PADDING
+		MODE
+		FRAMES
+		FRAME_LENGTH
+		VBR_SCALE
+	);
+
+	%v1_tag_fields =
+		(TITLE => 30, ARTIST => 30, ALBUM => 30, COMMENT => 30, YEAR => 4);
+
+	@v1_tag_names = qw(TITLE ARTIST ALBUM YEAR COMMENT TRACKNUM GENRE);
+
+	%v2_to_v1_names = (
+		# v2.2 tags
+		'TT2' => 'TITLE',
+		'TP1' => 'ARTIST',
+		'TAL' => 'ALBUM',
+		'TYE' => 'YEAR',
+		'COM' => 'COMMENT',
+		'TRK' => 'TRACKNUM',
+		'TCO' => 'GENRE', # not clean mapping, but ...
+		# v2.3 tags
+		'TIT2' => 'TITLE',
+		'TPE1' => 'ARTIST',
+		'TALB' => 'ALBUM',
+		'TYER' => 'YEAR',
+		'COMM' => 'COMMENT',
+		'TRCK' => 'TRACKNUM',
+		'TCON' => 'GENRE',
+	);
+
+	%v2_tag_names = (
+		# v2.2 tags
+		'BUF' => 'Recommended buffer size',
+		'CNT' => 'Play counter',
+		'COM' => 'Comments',
+		'CRA' => 'Audio encryption',
+		'CRM' => 'Encrypted meta frame',
+		'ETC' => 'Event timing codes',
+		'EQU' => 'Equalization',
+		'GEO' => 'General encapsulated object',
+		'IPL' => 'Involved people list',
+		'LNK' => 'Linked information',
+		'MCI' => 'Music CD Identifier',
+		'MLL' => 'MPEG location lookup table',
+		'PIC' => 'Attached picture',
+		'POP' => 'Popularimeter',
+		'REV' => 'Reverb',
+		'RVA' => 'Relative volume adjustment',
+		'SLT' => 'Synchronized lyric/text',
+		'STC' => 'Synced tempo codes',
+		'TAL' => 'Album/Movie/Show title',
+		'TBP' => 'BPM (Beats Per Minute)',
+		'TCM' => 'Composer',
+		'TCO' => 'Content type',
+		'TCR' => 'Copyright message',
+		'TDA' => 'Date',
+		'TDY' => 'Playlist delay',
+		'TEN' => 'Encoded by',
+		'TFT' => 'File type',
+		'TIM' => 'Time',
+		'TKE' => 'Initial key',
+		'TLA' => 'Language(s)',
+		'TLE' => 'Length',
+		'TMT' => 'Media type',
+		'TOA' => 'Original artist(s)/performer(s)',
+		'TOF' => 'Original filename',
+		'TOL' => 'Original Lyricist(s)/text writer(s)',
+		'TOR' => 'Original release year',
+		'TOT' => 'Original album/Movie/Show title',
+		'TP1' => 'Lead artist(s)/Lead performer(s)/Soloist(s)/Performing group',
+		'TP2' => 'Band/Orchestra/Accompaniment',
+		'TP3' => 'Conductor/Performer refinement',
+		'TP4' => 'Interpreted, remixed, or otherwise modified by',
+		'TPA' => 'Part of a set',
+		'TPB' => 'Publisher',
+		'TRC' => 'ISRC (International Standard Recording Code)',
+		'TRD' => 'Recording dates',
+		'TRK' => 'Track number/Position in set',
+		'TSI' => 'Size',
+		'TSS' => 'Software/hardware and settings used for encoding',
+		'TT1' => 'Content group description',
+		'TT2' => 'Title/Songname/Content description',
+		'TT3' => 'Subtitle/Description refinement',
+		'TXT' => 'Lyricist/text writer',
+		'TXX' => 'User defined text information frame',
+		'TYE' => 'Year',
+		'UFI' => 'Unique file identifier',
+		'ULT' => 'Unsychronized lyric/text transcription',
+		'WAF' => 'Official audio file webpage',
+		'WAR' => 'Official artist/performer webpage',
+		'WAS' => 'Official audio source webpage',
+		'WCM' => 'Commercial information',
+		'WCP' => 'Copyright/Legal information',
+		'WPB' => 'Publishers official webpage',
+		'WXX' => 'User defined URL link frame',
+
+		# v2.3 tags
+		'AENC' => 'Audio encryption',
+		'APIC' => 'Attached picture',
+		'COMM' => 'Comments',
+		'COMR' => 'Commercial frame',
+		'ENCR' => 'Encryption method registration',
+		'EQUA' => 'Equalization',
+		'ETCO' => 'Event timing codes',
+		'GEOB' => 'General encapsulated object',
+		'GRID' => 'Group identification registration',
+		'IPLS' => 'Involved people list',
+		'LINK' => 'Linked information',
+		'MCDI' => 'Music CD identifier',
+		'MLLT' => 'MPEG location lookup table',
+		'OWNE' => 'Ownership frame',
+		'PCNT' => 'Play counter',
+		'POPM' => 'Popularimeter',
+		'POSS' => 'Position synchronisation frame',
+		'PRIV' => 'Private frame',
+		'RBUF' => 'Recommended buffer size',
+		'RVAD' => 'Relative volume adjustment',
+		'RVRB' => 'Reverb',
+		'SYLT' => 'Synchronized lyric/text',
+		'SYTC' => 'Synchronized tempo codes',
+		'TALB' => 'Album/Movie/Show title',
+		'TBPM' => 'BPM (beats per minute)',
+		'TCOM' => 'Composer',
+		'TCON' => 'Content type',
+		'TCOP' => 'Copyright message',
+		'TDAT' => 'Date',
+		'TDLY' => 'Playlist delay',
+		'TENC' => 'Encoded by',
+		'TEXT' => 'Lyricist/Text writer',
+		'TFLT' => 'File type',
+		'TIME' => 'Time',
+		'TIT1' => 'Content group description',
+		'TIT2' => 'Title/songname/content description',
+		'TIT3' => 'Subtitle/Description refinement',
+		'TKEY' => 'Initial key',
+		'TLAN' => 'Language(s)',
+		'TLEN' => 'Length',
+		'TMED' => 'Media type',
+		'TOAL' => 'Original album/movie/show title',
+		'TOFN' => 'Original filename',
+		'TOLY' => 'Original lyricist(s)/text writer(s)',
+		'TOPE' => 'Original artist(s)/performer(s)',
+		'TORY' => 'Original release year',
+		'TOWN' => 'File owner/licensee',
+		'TPE1' => 'Lead performer(s)/Soloist(s)',
+		'TPE2' => 'Band/orchestra/accompaniment',
+		'TPE3' => 'Conductor/performer refinement',
+		'TPE4' => 'Interpreted, remixed, or otherwise modified by',
+		'TPOS' => 'Part of a set',
+		'TPUB' => 'Publisher',
+		'TRCK' => 'Track number/Position in set',
+		'TRDA' => 'Recording dates',
+		'TRSN' => 'Internet radio station name',
+		'TRSO' => 'Internet radio station owner',
+		'TSIZ' => 'Size',
+		'TSRC' => 'ISRC (international standard recording code)',
+		'TSSE' => 'Software/Hardware and settings used for encoding',
+		'TXXX' => 'User defined text information frame',
+		'TYER' => 'Year',
+		'UFID' => 'Unique file identifier',
+		'USER' => 'Terms of use',
+		'USLT' => 'Unsychronized lyric/text transcription',
+		'WCOM' => 'Commercial information',
+		'WCOP' => 'Copyright/Legal information',
+		'WOAF' => 'Official audio file webpage',
+		'WOAR' => 'Official artist/performer webpage',
+		'WOAS' => 'Official audio source webpage',
+		'WORS' => 'Official internet radio station homepage',
+		'WPAY' => 'Payment',
+		'WPUB' => 'Publishers official webpage',
+		'WXXX' => 'User defined URL link frame',
+
+		# v2.4 additional tags
+		# note that we don't restrict tags from 2.3 or 2.4,
+		'ASPI' => 'Audio seek point index',
+		'EQU2' => 'Equalisation (2)',
+		'RVA2' => 'Relative volume adjustment (2)',
+		'SEEK' => 'Seek frame',
+		'SIGN' => 'Signature frame',
+		'TDEN' => 'Encoding time',
+		'TDOR' => 'Original release time',
+		'TDRC' => 'Recording time',
+		'TDRL' => 'Release time',
+		'TDTG' => 'Tagging time',
+		'TIPL' => 'Involved people list',
+		'TMCL' => 'Musician credits list',
+		'TMOO' => 'Mood',
+		'TPRO' => 'Produced notice',
+		'TSOA' => 'Album sort order',
+		'TSOP' => 'Performer sort order',
+		'TSOT' => 'Title sort order',
+		'TSST' => 'Set subtitle',
+
+		# grrrrrrr
+		'COM ' => 'Broken iTunes comments',
+	);
+}
+
+1;
+
+__END__
+
+=pod
+
+=back
+
+=head1 TROUBLESHOOTING
+
+If you find a bug, please send me a patch (see the project page in L<"SEE ALSO">).
+If you cannot figure out why it does not work for you, please put the MP3 file in
+a place where I can get it (preferably via FTP, or HTTP, or .Mac iDisk) and send me
+mail regarding where I can get the file, with a detailed description of the problem.
+
+If I download the file, after debugging the problem I will not keep the MP3 file
+if it is not legal for me to have it.  Just let me know if it is legal for me to
+keep it or not.
+
+
+=head1 TODO
+
+=over 4
+
+=item ID3v2 Support
+
+Still need to do more for reading tags, such as using Compress::Zlib to decompress
+compressed tags.  But until I see this in use more, I won't bother.  If something
+does not work properly with reading, follow the instructions above for
+troubleshooting.
+
+ID3v2 I<writing> is coming soon.
+
+=item Get data from scalar
+
+Instead of passing a file spec or filehandle, pass the
+data itself.  Would take some work, converting the seeks, etc.
+
+=item Padding bit ?
+
+Do something with padding bit.
+
+=item Test suite
+
+Test suite could use a bit of an overhaul and update.  Patches very welcome.
+
+=over 4
+
+=item *
+
+Revamp getset.t.  Test all the various get_mp3tag args.
+
+=item *
+
+Test Unicode.
+
+=item *
+
+Test OOP API.
+
+=item *
+
+Test error handling, check more for missing files, bad MP3s, etc.
+
+=back
+
+=item Other VBR
+
+Right now, only Xing VBR is supported.
+
+=back
+
+
+=head1 THANKS
+
+Edward Allen E<lt>allenej@c51844-a.spokn1.wa.home.comE<gt>,
+Vittorio Bertola E<lt>v.bertola@vitaminic.comE<gt>,
+Michael Blakeley E<lt>mike@blakeley.comE<gt>,
+Per Bolmstedt E<lt>tomten@kol14.comE<gt>,
+Tony Bowden E<lt>tony@tmtm.comE<gt>,
+Tom Brown E<lt>thecap@usa.netE<gt>,
+Sergio Camarena E<lt>scamarena@users.sourceforge.netE<gt>,
+Chris Dawson E<lt>cdawson@webiphany.comE<gt>,
+Luke Drumm E<lt>lukedrumm@mypad.comE<gt>,
+Kyle Farrell E<lt>kyle@cantametrix.comE<gt>,
+Jeffrey Friedl E<lt>jfriedl@yahoo.comE<gt>,
+brian d foy E<lt>comdog@panix.comE<gt>,
+Ben Gertzfield E<lt>che@debian.orgE<gt>,
+Brian Goodwin E<lt>brian@fuddmain.comE<gt>,
+Todd Hanneken E<lt>thanneken@hds.harvard.eduE<gt>,
+Todd Harris E<lt>harris@cshl.orgE<gt>,
+Woodrow Hill E<lt>asim@mindspring.comE<gt>,
+Kee Hinckley E<lt>nazgul@somewhere.comE<gt>,
+Roman Hodek E<lt>Roman.Hodek@informatik.uni-erlangen.deE<gt>,
+Peter Kovacs E<lt>kovacsp@egr.uri.eduE<gt>,
+Johann Lindvall,
+Peter Marschall E<lt>peter.marschall@mayn.deE<gt>,
+Trond Michelsen E<lt>mike@crusaders.noE<gt>,
+Dave O'Neill E<lt>dave@nexus.carleton.caE<gt>,
+Christoph Oberauer E<lt>christoph.oberauer@sbg.ac.atE<gt>,
+Jake Palmer E<lt>jake.palmer@db.comE<gt>,
+Andrew Phillips E<lt>asp@wasteland.orgE<gt>,
+David Reuteler E<lt>reuteler@visi.comE<gt>,
+John Ruttenberg E<lt>rutt@chezrutt.comE<gt>,
+Matthew Sachs E<lt>matthewg@zevils.comE<gt>,
+E<lt>scfc_de@users.sf.netE<gt>,
+Hermann Schwaerzler E<lt>Hermann.Schwaerzler@uibk.ac.atE<gt>,
+Chris Sidi E<lt>sidi@angband.orgE<gt>,
+Roland Steinbach E<lt>roland@support-system.comE<gt>,
+Stuart E<lt>schneis@users.sourceforge.netE<gt>,
+Jeffery Sumler E<lt>jsumler@mediaone.netE<gt>,
+Predrag Supurovic E<lt>mpgtools@dv.co.yuE<gt>,
+Bogdan Surdu E<lt>tim@go.roE<gt>,
+E<lt>tim@tim-landscheidt.deE<gt>,
+Pass F. B. Travis E<lt>pftravis@bellsouth.netE<gt>,
+Tobias Wagener E<lt>tobias@wagener.nuE<gt>,
+Ronan Waide E<lt>waider@stepstone.ieE<gt>,
+Andy Waite E<lt>andy@mailroute.comE<gt>,
+Ken Williams E<lt>ken@forum.swarthmore.eduE<gt>,
+Meng Weng Wong E<lt>mengwong@pobox.comE<gt>.
+
+
+=head1 AUTHOR AND COPYRIGHT
+
+Chris Nandor E<lt>pudge@pobox.comE<gt>, http://pudge.net/
+
+Copyright (c) 1998-2003 Chris Nandor.  All rights reserved.  This program is
+free software; you can redistribute it and/or modify it under the terms
+of the Artistic License, distributed with Perl.
+
+
+=head1 SEE ALSO
+
+=over 4
+
+=item MP3::Info Project Page
+
+	http://projects.pudge.net/
+
+=item mp3tools
+
+	http://www.zevils.com/linux/mp3tools/
+
+=item mpgtools
+
+	http://www.dv.co.yu/mpgscript/mpgtools.htm
+	http://www.dv.co.yu/mpgscript/mpeghdr.htm
+
+=item mp3tool
+
+	http://www.dtek.chalmers.se/~d2linjo/mp3/mp3tool.html
+
+=item ID3v2
+
+	http://www.id3.org/
+
+=item Xing Variable Bitrate
+
+	http://www.xingtech.com/support/partner_developer/mp3/vbr_sdk/
+
+=item MP3Ext
+
+	http://rupert.informatik.uni-stuttgart.de/~mutschml/MP3ext/
+
+=item Xmms
+
+	http://www.xmms.org/
+
+
+=back
+
+=head1 VERSION
+
+v1.02, Sunday, March 2, 2003
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Mail/Sendmail.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Mail/Sendmail.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Mail/Sendmail.pm	(revision 24799)
@@ -0,0 +1,802 @@
+package Mail::Sendmail;
+# Mail::Sendmail by Milivoj Ivkovic <mi\x40alma.ch>
+# see embedded POD documentation after __END__
+# or http://alma.ch/perl/mail.html
+
+=head1 NAME
+
+Mail::Sendmail v. 0.79 - Simple platform independent mailer
+
+=cut
+
+$VERSION = '0.79';
+
+# *************** Configuration you may want to change *******************
+# You probably want to set your SMTP server here (unless you specify it in
+# every script), and leave the rest as is. See pod documentation for details
+
+%mailcfg = (
+    # List of SMTP servers:
+    'smtp'    => [ qw( localhost ) ],
+    #'smtp'    => [ qw( mail.mydomain.com ) ], # example
+
+    'from'    => '', # default sender e-mail, used when no From header in mail
+
+    'mime'    => 1, # use MIME encoding by default
+
+    'retries' => 1, # number of retries on smtp connect failure
+    'delay'   => 1, # delay in seconds between retries
+
+    'tz'      => '', # only to override automatic detection
+    'port'    => 25, # change it if you always use a non-standard port
+    'debug'   => 0 # prints stuff to STDERR
+);
+
+# *******************************************************************
+
+require Exporter;
+use strict;
+use vars qw(
+            $VERSION
+            @ISA
+            @EXPORT
+            @EXPORT_OK
+            %mailcfg
+            $address_rx
+            $debug
+            $log
+            $error
+            $retry_delay
+            $connect_retries
+           );
+
+use Socket;
+use Time::Local; # for automatic time zone detection
+use Sys::Hostname; # for use of hostname in HELO
+
+# use MIME::QuotedPrint if available and configured in %mailcfg
+eval("use MIME::QuotedPrint");
+$mailcfg{'mime'} &&= (!$@);
+
+@ISA        = qw(Exporter);
+@EXPORT     = qw(&sendmail);
+@EXPORT_OK  = qw(
+                 %mailcfg
+                 time_to_date
+                 $address_rx
+                 $debug
+                 $log
+                 $error
+                );
+
+# regex for e-mail addresses where full=$1, user=$2, domain=$3
+# see pod documentation about this regex
+
+my $word_rx = '[\x21\x23-\x27\x2A-\x2B\x2D\x2F\w\x3D\x3F]+';
+my $user_rx = $word_rx         # valid chars
+             .'(?:\.' . $word_rx . ')*' # possibly more words preceded by a dot
+             ;
+my $dom_rx = '\w[-\w]*(?:\.\w[-\w]*)*'; # less valid chars in domain names
+my $ip_rx = '\[\d{1,3}(?:\.\d{1,3}){3}\]';
+
+$address_rx = '((' . $user_rx . ')\@(' . $dom_rx . '|' . $ip_rx . '))';
+; # v. 0.61
+
+sub time_to_date {
+    # convert a time() value to a date-time string according to RFC 822
+
+    my $time = $_[0] || time(); # default to now if no argument
+
+    my @months = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
+    my @wdays  = qw(Sun Mon Tue Wed Thu Fri Sat);
+
+    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)
+        = localtime($time);
+
+    my $TZ = $mailcfg{'tz'};
+    if ( $TZ eq "" ) {
+        # offset in hours
+        my $offset  = sprintf "%.1f", (timegm(localtime) - time) / 3600;
+        my $minutes = sprintf "%02d", abs( $offset - int($offset) ) * 60;
+        $TZ  = sprintf("%+03d", int($offset)) . $minutes;
+    }
+    return join(" ",
+                    ($wdays[$wday] . ','),
+                     $mday,
+                     $months[$mon],
+                     $year+1900,
+                     sprintf("%02d:%02d:%02d", $hour, $min, $sec),
+                     $TZ
+               );
+} # end sub time_to_date
+
+sub sendmail {
+
+    $error = '';
+    $log = "Mail::Sendmail v. $VERSION - "    . scalar(localtime()) . "\n";
+
+    my $CRLF = "\015\012";
+    local $/ = $CRLF;
+    local $\ = ''; # to protect us from outside settings
+    local $_;
+
+    my (%mail, $k,
+        $smtp, $server, $port, $connected, $localhost,
+        $fromaddr, $recip, @recipients, $to, $header,
+       );
+
+    # -------- a few internal subs ----------
+    sub fail {
+        # things to do before returning a sendmail failure
+        print STDERR @_ if $^W;
+        $error .= join(" ", @_) . "\n";
+        close S;
+        return 0;
+    }
+
+    sub socket_write {
+        my $i;
+        for $i (0..$#_) {
+            # accept references, so we don't copy potentially big data
+            my $data = ref($_[$i]) ? $_[$i] : \$_[$i];
+            if ($mailcfg{'debug'} > 5) {
+                if (length($$data) < 500) {
+                    print ">", $$data;
+                }
+                else {
+                    print "> [...", length($$data), " bytes sent ...]\n";
+                }
+            }
+            print(S $$data) || return 0;
+        }
+        1;
+    }
+
+    sub socket_read {
+        my $response; # for multi-line server responses
+        do {
+            chomp($_ = <S>);
+            print "<$_\n" if $mailcfg{'debug'} > 5;
+            if (/^[45]/ or !$_) {
+                return; # return false
+            }
+            $response .= $_;
+         } while (/^[\d]+-/);
+         return $response;
+    }
+    # -------- end of internal subs ----------
+
+    # all config keys to lowercase, to prevent typo errors
+    foreach $k (keys %mailcfg) {
+        if ($k =~ /[A-Z]/) {
+            $mailcfg{lc($k)} = $mailcfg{$k};
+        }
+    }
+
+    # redo mail hash, arranging keys case etc...
+    while (@_) {
+        $k = shift @_;
+        if (!$k and $^W) {
+            warn "Received false mail hash key: \'$k\'. Did you forget to put it in quotes?\n";
+        }
+
+        # arrange keys case
+        $k = ucfirst lc($k);
+
+        $k =~ s/\s*:\s*$//o; # kill colon (and possible spaces) at end, we add it later.
+        # uppercase also after "-", so people don't complain that headers case is different
+        # than in Outlook.
+        $k =~ s/-(.)/"-" . uc($1)/ge;
+        $mail{$k} = shift @_;
+    }
+
+    $smtp = $mail{'Smtp'} || $mail{'Server'};
+    unshift @{$mailcfg{'smtp'}}, $smtp if ($smtp and $mailcfg{'smtp'}->[0] ne $smtp);
+
+    # delete non-header keys, so we don't send them later as mail headers
+    # I like this syntax, but it doesn't seem to work with AS port 5.003_07:
+    # delete @mail{'Smtp', 'Server'};
+    # so instead:
+    delete $mail{'Smtp'}; delete $mail{'Server'};
+
+    $mailcfg{'port'} = $mail{'Port'} || $mailcfg{'port'} || 25;
+    delete $mail{'Port'};
+
+    {    # don't warn for undefined values below
+        local $^W = 0;
+        $mail{'Message'} = join("", $mail{'Message'}, $mail{'Body'}, $mail{'Text'});
+    }
+
+    # delete @mail{'Body', 'Text'};
+    delete $mail{'Body'}; delete $mail{'Text'};
+
+    # Extract 'From:' e-mail address to use as envelope sender
+
+    $fromaddr = $mail{'Sender'} || $mail{'From'} || $mailcfg{'from'};
+    delete $mail{'Sender'};
+    unless ($fromaddr =~ /$address_rx/) {
+        return fail("Bad or missing From address: \'$fromaddr\'");
+    }
+    $fromaddr = $1;
+
+    # add Date header if needed
+    $mail{Date} ||= time_to_date() ;
+    $log .= "Date: $mail{Date}\n";
+
+    # cleanup message, and encode if needed
+    $mail{'Message'} =~ s/\r\n/\n/go;     # normalize line endings, step 1 of 2 (next step after MIME encoding)
+
+    $mail{'Mime-Version'} ||= '1.0';
+    $mail{'Content-Type'} ||= 'text/plain; charset="iso-8859-1"';
+
+    unless ( $mail{'Content-Transfer-Encoding'}
+          || $mail{'Content-Type'} =~ /multipart/io )
+    {
+        if ($mailcfg{'mime'}) {
+            $mail{'Content-Transfer-Encoding'} = 'quoted-printable';
+            $mail{'Message'} = encode_qp($mail{'Message'});
+        }
+        else {
+            $mail{'Content-Transfer-Encoding'} = '8bit';
+            if ($mail{'Message'} =~ /[\x80-\xFF]/o) {
+                $error .= "MIME::QuotedPrint not present!\nSending 8bit characters, hoping it will come across OK.\n";
+                warn "MIME::QuotedPrint not present!\n",
+                     "Sending 8bit characters without encoding, hoping it will come across OK.\n"
+                     if $^W;
+            }
+        }
+    }
+
+    $mail{'Message'} =~ s/^\./\.\./gom;     # handle . as first character
+    $mail{'Message'} =~ s/\n/$CRLF/go; # normalize line endings, step 2.
+
+    # Get recipients
+    {    # don't warn for undefined values below
+        local $^W = 0;
+        $recip = join(", ", $mail{To}, $mail{Cc}, $mail{Bcc});
+    }
+
+    delete $mail{'Bcc'};
+
+    @recipients = ();
+    while ($recip =~ /$address_rx/go) {
+        push @recipients, $1;
+    }
+    unless (@recipients) {
+        return fail("No recipient!")
+    }
+
+    # get local hostname for polite HELO
+    $localhost = hostname() || 'localhost';
+
+    foreach $server ( @{$mailcfg{'smtp'}} ) {
+        # open socket needs to be inside this foreach loop on Linux,
+        # otherwise all servers fail if 1st one fails !??! why?
+        unless ( socket S, AF_INET, SOCK_STREAM, scalar(getprotobyname 'tcp') ) {
+            return fail("socket failed ($!)")
+        }
+
+        print "- trying $server\n" if $mailcfg{'debug'} > 1;
+
+        $server =~ s/\s+//go; # remove spaces just in case of a typo
+        # extract port if server name like "mail.domain.com:2525"
+        $port = ($server =~ s/:(\d+)$//o) ? $1 : $mailcfg{'port'};
+        $smtp = $server; # save $server for use outside foreach loop
+
+        my $smtpaddr = inet_aton $server;
+        unless ($smtpaddr) {
+            $error .= "$server not found\n";
+            next; # next server
+        }
+
+        my $retried = 0; # reset retries for each server
+        while ( ( not $connected = connect S, pack_sockaddr_in($port, $smtpaddr) )
+            and ( $retried < $mailcfg{'retries'} )
+              ) {
+            $retried++;
+            $error .= "connect to $server failed ($!)\n";
+            print "- connect to $server failed ($!)\n" if $mailcfg{'debug'} > 1;
+            print "retrying in $mailcfg{'delay'} seconds...\n" if $mailcfg{'debug'} > 1;
+            sleep $mailcfg{'delay'};
+        }
+
+        if ( $connected ) {
+            print "- connected to $server\n" if $mailcfg{'debug'} > 3;
+            last;
+        }
+        else {
+            $error .= "connect to $server failed\n";
+            print "- connect to $server failed, next server...\n" if $mailcfg{'debug'} > 1;
+            next; # next server
+        }
+    }
+
+    unless ( $connected ) {
+        return fail("connect to $smtp failed ($!) no (more) retries!")
+    };
+
+    {
+        local $^W = 0; # don't warn on undefined variables
+        # Add info to log variable
+        $log .= "Server: $smtp Port: $port\n"
+              . "From: $fromaddr\n"
+              . "Subject: $mail{Subject}\n"
+              . "To: ";
+    }
+
+    my($oldfh) = select(S); $| = 1; select($oldfh);
+
+    socket_read()
+        || return fail("Connection error from $smtp on port $port ($_)");
+    socket_write("HELO $localhost$CRLF")
+        || return fail("send HELO error");
+    socket_read()
+        || return fail("HELO error ($_)");
+    socket_write("MAIL FROM: <$fromaddr>$CRLF")
+        || return fail("send MAIL FROM: error");
+    socket_read()
+        || return fail("MAIL FROM: error ($_)");
+
+    foreach $to (@recipients) {
+        socket_write("RCPT TO: <$to>$CRLF")
+            || return fail("send RCPT TO: error");
+        socket_read()
+            || return fail("RCPT TO: error ($_)");
+        $log .= "$to\n    ";
+    }
+
+    # start data part
+
+    socket_write("DATA$CRLF")
+        || return fail("send DATA error");
+    socket_read()
+        || return fail("DATA error ($_)");
+
+    # print headers
+    foreach $header (keys %mail) {
+        next if $header eq "Message";
+        $mail{$header} =~ s/\s+$//o; # kill possible trailing garbage
+        socket_write("$header: $mail{$header}$CRLF")
+            || return fail("send $header: error");
+    };
+
+    #- test diconnecting from network here, to see what happens
+    #- print STDERR "DISCONNECT NOW!\n";
+    #- sleep 4;
+    #- print STDERR "trying to continue, expecting an error... \n";
+
+    # send message body (passed as a reference, in case it's big)
+    socket_write($CRLF, \$mail{'Message'}, "$CRLF.$CRLF")
+           || return fail("send message error");
+    socket_read()
+        || return fail("message transmission error ($_)");
+    $log .= "\nResult: $_";
+
+    # finish
+    socket_write("QUIT$CRLF")
+           || return fail("send QUIT error");
+    socket_read();
+    close S;
+
+    return 1;
+} # end sub sendmail
+
+1;
+__END__
+
+=head1 SYNOPSIS
+
+  use Mail::Sendmail;
+
+  %mail = ( To      => 'you@there.com',
+            From    => 'me@here.com',
+            Message => "This is a very short message"
+           );
+
+  sendmail(%mail) or die $Mail::Sendmail::error;
+
+  print "OK. Log says:\n", $Mail::Sendmail::log;
+
+=head1 DESCRIPTION
+
+Simple platform independent e-mail from your perl script. Only requires
+Perl 5 and a network connection.
+
+Mail::Sendmail contains mainly &sendmail, which takes a hash with the
+message to send and sends it. It is intended to be very easy to setup and
+use. See also L<"FEATURES"> below.
+
+=head1 INSTALLATION
+
+=over 4
+
+=item Best
+
+C<perl -MCPAN -e "install Mail::Sendmail">
+
+=item Traditional
+
+    perl Makefile.PL
+    make
+    make test
+    make install
+
+=item Manual
+
+Copy Sendmail.pm to Mail/ in your Perl lib directory.
+
+    (eg. c:\Perl\site\lib\Mail\
+     or  /usr/lib/perl5/site_perl/Mail/
+     or whatever it is on your system.
+     They are listed when you type C< perl -V >)
+
+=item ActivePerl's PPM
+
+ppm install --location=http://alma.ch/perl/ppm Mail-Sendmail
+
+But this way you don't get a chance to have a look at other files (Changes,
+Todo, test.pl, ...).
+
+=back
+
+At the top of Sendmail.pm, set your default SMTP server(s), unless you specify
+it with each message, or want to use the default (localhost).
+
+Install MIME::QuotedPrint. This is not required but strongly recommended.
+
+=head1 FEATURES
+
+Automatic time zone detection, Date: header, MIME quoted-printable encoding
+(if MIME::QuotedPrint installed), all of which can be overridden.
+
+Bcc: and Cc: support.
+
+Allows real names in From:, To: and Cc: fields
+
+Doesn't send an X-Mailer: header (unless you do), and allows you to send any
+header(s) you want.
+
+Configurable retries and use of alternate servers if your mail server is
+down
+
+Good plain text error reporting
+
+=head1 LIMITATIONS
+
+Headers are not encoded, even if they have accented characters.
+
+No suport for the SMTP AUTH extension.
+
+Since the whole message is in memory, it's not suitable for
+sending very big attached files.
+
+The SMTP server has to be set manually in Sendmail.pm or in your script,
+unless you have a mail server on localhost.
+
+Doesn't work on OpenVMS, I was told. Cannot test this myself.
+
+=head1 CONFIGURATION
+
+=over 4
+
+=item Default SMTP server(s)
+
+This is probably all you want to configure. It is usually done through
+I<$mailcfg{smtp}>, which you can edit at the top of the Sendmail.pm file.
+This is a reference to a list of SMTP servers. You can also set it from
+your script:
+
+C<unshift @{$Mail::Sendmail::mailcfg{'smtp'}} , 'my.mail.server';>
+
+Alternatively, you can specify the server in the I<%mail> hash you send
+from your script, which will do the same thing:
+
+C<$mail{smtp} = 'my.mail.server';>
+
+A future version will (hopefully) try to set useful defaults for you
+during the Makefile.PL.
+
+=item Other configuration settings
+
+See I<%mailcfg> under L<"DETAILS"> below for other configuration options.
+
+=back
+
+=head1 DETAILS
+
+=head2 sendmail()
+
+sendmail is the only thing exported to your namespace by default
+
+C<sendmail(%mail) || print "Error sending mail: $Mail::Sendmail::error\n";>
+
+It takes a hash containing the full message, with keys for all headers,
+body, and optionally for another non-default SMTP server and/or port.
+
+It returns 1 on success or 0 on error, and rewrites
+C<$Mail::Sendmail::error> and C<$Mail::Sendmail::log>.
+
+Keys are NOT case-sensitive.
+
+The colon after headers is not necessary.
+
+The Body part key can be called 'Body', 'Message' or 'Text'.
+
+The SMTP server key can be called 'Smtp' or 'Server'. If the connection to
+this one fails, the other ones in C<$mailcfg{smtp}> will still be tried.
+
+The following headers are added unless you specify them yourself:
+
+    Mime-Version: 1.0
+    Content-Type: 'text/plain; charset="iso-8859-1"'
+
+    Content-Transfer-Encoding: quoted-printable
+    or (if MIME::QuotedPrint not installed)
+    Content-Transfer-Encoding: 8bit
+
+    Date: [string returned by time_to_date()]
+
+If you wish to use an envelope sender address different than the
+From: address, set C<$mail{Sender}> in your %mail hash.
+
+The following are not exported by default, but you can still access them
+with their full name, or request their export on the use line like in:
+C<use Mail::Sendmail qw(sendmail $address_rx time_to_date);>
+
+=head2 Mail::Sendmail::time_to_date()
+
+convert time ( as from C<time()> ) to an RFC 822 compliant string for the
+Date header. See also L<"%Mail::Sendmail::mailcfg">.
+
+=head2 $Mail::Sendmail::error
+
+When you don't run with the B<-w> flag, the module sends no errors to
+STDERR, but puts anything it has to complain about in here. You should
+probably always check if it says something.
+
+=head2 $Mail::Sendmail::log
+
+A summary that you could write to a log file after each send
+
+=head2 $Mail::Sendmail::address_rx
+
+A handy regex to recognize e-mail addresses.
+
+A correct regex for valid e-mail addresses was written by one of the judges
+in the obfuscated Perl contest... :-) It is quite big. This one is an
+attempt to a reasonable compromise, and should accept all real-world
+internet style addresses. The domain part is required and comments or
+characters that would need to be quoted are not supported.
+
+  Example:
+    $rx = $Mail::Sendmail::address_rx;
+    if (/$rx/) {
+      $address=$1;
+      $user=$2;
+      $domain=$3;
+    }
+
+=head2 %Mail::Sendmail::mailcfg
+
+This hash contains all configuration options. You normally edit it once (if
+ever) in Sendmail.pm and forget about it, but you could also access it from
+your scripts. For readability, I'll assume you have imported it
+(with something like C<use Mail::Sendmail qw(sendmail %mailcfg)>).
+
+The keys are not case-sensitive: they are all converted to lowercase before
+use. Writing C<$mailcfg{Port} = 2525;> is OK: the default $mailcfg{port}
+(25) will be deleted and replaced with your new value of 2525.
+
+=over 4
+
+=item $mailcfg{smtp}
+
+C<$mailcfg{smtp} = [qw(localhost my.other.mail.server)];>
+
+This is a reference to a list of smtp servers, so if your main server is
+down, the module tries the next one. If one of your servers uses a special
+port, add it to the server name with a colon in front, to override the
+default port (like in my.special.server:2525).
+
+Default: localhost.
+
+=item $mailcfg{from}
+
+C<$mailcfg{from} = 'Mailing script me@mydomain.com';>
+
+From address used if you don't supply one in your script. Should not be of
+type 'user@localhost' since that may not be valid on the recipient's
+host.
+
+Default: undefined.
+
+=item $mailcfg{mime}
+
+C<$mailcfg{mime} = 1;>
+
+Set this to 0 if you don't want any automatic MIME encoding. You normally
+don't need this, the module should 'Do the right thing' anyway.
+
+Default: 1;
+
+=item $mailcfg{retries}
+
+C<$mailcfg{retries} = 1;>
+
+How many times should the connection to the same SMTP server be retried in
+case of a failure.
+
+Default: 1;
+
+=item $mailcfg{delay}
+
+C<$mailcfg{delay} = 1;>
+
+Number of seconds to wait between retries. This delay also happens before
+trying the next server in the list, if the retries for the current server
+have been exhausted. For CGI scripts, you want few retries and short delays
+to return with a results page before the http connection times out. For
+unattended scripts, you may want to use many retries and long delays to
+have a good chance of your mail being sent even with temporary failures on
+your network.
+
+Default: 1 (second);
+
+=item $mailcfg{tz}
+
+C<$mailcfg{tz} = '+0800';>
+
+Normally, your time zone is set automatically, from the difference between
+C<time()> and C<gmtime()>. This allows you to override automatic detection
+in cases where your system is confused (such as some Win32 systems in zones
+which do not use daylight savings time: see Microsoft KB article Q148681)
+
+Default: undefined (automatic detection at run-time).
+
+=item $mailcfg{port}
+
+C<$mailcfg{port} = 25;>
+
+Port used when none is specified in the server name.
+
+Default: 25.
+
+=item $mailcfg{debug}
+
+C<$mailcfg{debug} = 0;>
+
+Prints stuff to STDERR. Current maximum is 6, which prints the whole SMTP
+session, except data exceeding 500 bytes.
+
+Default: 0;
+
+=back
+
+=head2 $Mail::Sendmail::VERSION
+
+The package version number (you can not import this one)
+
+=head2 Configuration variables from previous versions
+
+The following global variables were used in version 0.74 for configuration.
+As from version 0.78_1, they are not supported anymore.
+Use the I<%mailcfg> hash if you need to access the configuration
+from your scripts.
+
+=over 4
+
+=item $Mail::Sendmail::default_smtp_server
+
+=item $Mail::Sendmail::default_smtp_port
+
+=item $Mail::Sendmail::default_sender
+
+=item $Mail::Sendmail::TZ
+
+=item $Mail::Sendmail::connect_retries
+
+=item $Mail::Sendmail::retry_delay
+
+=item $Mail::Sendmail::use_MIME
+
+=back
+
+=head1 ANOTHER EXAMPLE
+
+  use Mail::Sendmail;
+
+  print "Testing Mail::Sendmail version $Mail::Sendmail::VERSION\n";
+  print "Default server: $Mail::Sendmail::mailcfg{smtp}->[0]\n";
+  print "Default sender: $Mail::Sendmail::mailcfg{from}\n";
+
+  %mail = (
+      #To      => 'No to field this time, only Bcc and Cc',
+      #From    => 'not needed, use default',
+      Bcc     => 'Someone <him@there.com>, Someone else her@there.com',
+      # only addresses are extracted from Bcc, real names disregarded
+      Cc      => 'Yet someone else <xz@whatever.com>',
+      # Cc will appear in the header. (Bcc will not)
+      Subject => 'Test message',
+      'X-Mailer' => "Mail::Sendmail version $Mail::Sendmail::VERSION",
+  );
+
+
+  $mail{Smtp} = 'special_server.for-this-message-only.domain.com';
+  $mail{'X-custom'} = 'My custom additionnal header';
+  $mail{'mESSaGE : '} = "The message key looks terrible, but works.";
+  # cheat on the date:
+  $mail{Date} = Mail::Sendmail::time_to_date( time() - 86400 );
+
+  if (sendmail %mail) { print "Mail sent OK.\n" }
+  else { print "Error sending mail: $Mail::Sendmail::error \n" }
+
+  print "\n\$Mail::Sendmail::log says:\n", $Mail::Sendmail::log;
+ 
+Also see http://alma.ch/perl/Mail-Sendmail-FAQ.html for examples
+of HTML mail and sending attachments. 
+
+=head1 CHANGES
+
+Main changes since version 0.78:
+
+Added "/" (\x2F) as a valid character in mailbox part.
+
+Removed old configuration variables which are not used anymore
+since version 0.74.
+
+Added support for different envelope sender (through C<$mail{Sender}>)
+
+Changed case of headers: first character after "-" also uppercased
+
+Support for multi-line server responses
+
+Localized $\ and $_
+
+Some internal rewrites and documentation updates
+
+Fixed old bug of dot as 76th character on line disappearing.
+
+Fixed very old bug where port number was not extracted from
+stuff like 'my.server:2525'.
+
+Fixed time_to_date bug with negative half-hour zones (only Newfoundland?)
+
+Added seconds to date string
+
+Now uses Sys::Hostname to get the hostname for HELO. (This may break the
+module on some very old Win32 Perls where Sys::Hostname was broken)
+
+Enable full session output for debugging
+
+See the F<Changes> file for the full history. If you don't have it
+because you installed through PPM, you can also find the latest
+one on F<http://alma.ch/perl/scripts/Sendmail/Changes>.
+
+=head1 AUTHOR
+
+Milivoj Ivkovic <mi\x40alma.ch> ("\x40" is "@" of course)
+
+=head1 NOTES
+
+MIME::QuotedPrint is used by default on every message if available. It
+allows reliable sending of accented characters, and also takes care of
+too long lines (which can happen in HTML mails). It is available in the
+MIME-Base64 package at http://www.perl.com/CPAN/modules/by-module/MIME/ or
+through PPM.
+
+Look at http://alma.ch/perl/Mail-Sendmail-FAQ.html for additional
+info (CGI, examples of sending attachments, HTML mail etc...)
+
+You can use this module freely. (Someone complained this is too vague.
+So, more precisely: do whatever you want with it, but be warned that
+terrible things will happen to you if you use it badly, like for sending
+spam, or ...?)
+
+Thanks to the many users who sent me feedback, bug reports, suggestions, etc.
+And please excuse me if I forgot to answer your mail. I am not always reliabe
+in answering mail. I intend to set up a mailing list soon.
+
+Last revision: 06.02.2003. Latest version should be available on
+CPAN: F<http://www.cpan.org/modules/by-authors/id/M/MI/MIVKOVIC/>.
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Ogg/Vorbis/Header/PurePerl.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Ogg/Vorbis/Header/PurePerl.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Ogg/Vorbis/Header/PurePerl.pm	(revision 24799)
@@ -0,0 +1,674 @@
+package Ogg::Vorbis::Header::PurePerl;
+
+use 5.005;
+use strict;
+use warnings;
+
+use Fcntl qw/SEEK_END/;
+
+our $VERSION = '0.07';
+
+sub new 
+{
+    my $class = shift;
+    my $file = shift;
+
+    return load($class, $file);
+}
+
+sub load 
+{
+    my $class    = shift;
+    my $file     = shift;
+    my $from_new = shift;
+    my %data;
+    my $self;
+
+    # there must be a better way...
+    if ($class eq 'Ogg::Vorbis::Header::PurePerl')
+    {
+	$self = bless \%data, $class;
+    }
+    else
+    {
+	$self = $class;
+    }
+
+    if ($self->{'FILE_LOADED'})
+    {
+	return $self;
+    }
+
+    $self->{'FILE_LOADED'} = 1;
+
+    # check that the file exists and is readable
+    unless ( -e $file && -r _ )
+    {
+	warn "File does not exist or cannot be read.";
+	# file does not exist, can't do anything
+	return undef;
+    }
+    # open up the file
+    open FILE, $file;
+    # make sure dos-type systems can handle it...
+    binmode FILE;
+
+    $data{'filename'} = $file;
+    $data{'fileHandle'} = \*FILE;
+
+    _init(\%data);
+    _loadInfo(\%data);
+    _loadComments(\%data);
+    _calculateTrackLength(\%data);
+
+    close FILE;
+
+    return $self;
+}
+
+sub info 
+{
+    my $self = shift;
+    my $key = shift;
+
+    # if the user did not supply a key, return the entire hash
+    unless ($key)
+    {
+	return $self->{'INFO'};
+    }
+
+    # otherwise, return the value for the given key
+    return $self->{'INFO'}{lc $key};
+}
+
+sub comment_tags 
+{
+    my $self = shift;
+
+    return @{$self->{'COMMENT_KEYS'}};
+}
+
+sub comment 
+{
+    my $self = shift;
+    my $key = shift;
+
+    # if the user supplied key does not exist, return undef
+    unless($self->{'COMMENTS'}{lc $key})
+    {
+	return undef;
+    }
+
+    return @{$self->{'COMMENTS'}{lc $key}};
+}
+
+sub add_comments 
+{
+    warn "Ogg::Vorbis::Header::PurePerl add_comments() unimplemented.";
+}
+
+sub edit_comment 
+{
+    warn "Ogg::Vorbis::Header::PurePerl edit_comment() unimplemented.";
+}
+
+sub delete_comment 
+{
+    warn "Ogg::Vorbis::Header::PurePerl delete_comment() unimplemented.";
+}
+
+sub clear_comments 
+{
+    warn "Ogg::Vorbis::Header::PurePerl clear_comments() unimplemented.";
+}
+
+sub path 
+{
+    my $self = shift;
+
+    return $self->{'fileName'};
+}
+
+sub write_vorbis
+{
+    warn "Ogg::Vorbis::Header::PurePerl write_vorbis unimplemented.";
+}
+
+# "private" methods
+
+sub _init
+{
+    my $data = shift;
+    my $fh = $data->{'fileHandle'};
+    my $byteCount = 0;
+
+    # check the header to make sure this is actually an Ogg-Vorbis file
+    $byteCount = _checkHeader($data);
+
+    unless($byteCount)
+    {
+	# if it's not, we can't do anything
+	return undef;
+    }
+
+    $data->{'startInfoHeader'} = $byteCount;
+}
+
+sub _checkHeader
+{
+    my $data = shift;
+    my $fh = $data->{'fileHandle'};
+    my $buffer;
+    my $pageSegCount;
+    my $byteCount = 0; # stores how far into the file we've read,
+                       # so later reads into the file can skip right
+                       # past all of the header stuff
+
+    # check that the first four bytes are 'OggS'
+    read($fh, $buffer, 4);
+    if ($buffer ne 'OggS')
+    {
+	warn "This is not an Ogg bitstream (no OggS header).";
+	return undef;
+    }
+    $byteCount += 4;
+
+    # check the stream structure version (1 byte, should be 0x00)
+    read($fh, $buffer, 1);
+    if (ord($buffer) != 0x00)
+    {
+	warn "This is not an Ogg bitstream (invalid structure version).";
+	return undef;
+    }
+    $byteCount += 1;
+
+    # check the header type flag 
+    # This is a bitfield, so technically we should check all of the bits
+    # that could potentially be set. However, the only value this should
+    # possibly have at the beginning of a proper Ogg-Vorbis file is 0x02,
+    # so we just check for that. If it's not that, we go on anyway, but
+    # give a warning (this behavior may (should?) be modified in the future.
+    read($fh, $buffer, 1);
+    if (ord($buffer) != 0x02)
+    {
+	warn "Invalid header type flag (trying to go ahead anyway).";
+    }
+    $byteCount += 1;
+
+    # skip to the page_segments count
+    read($fh, $buffer, 20);
+    $byteCount += 20;
+    # we do nothing with this data
+
+    # read the number of page segments
+    read($fh, $buffer, 1);
+    $pageSegCount = ord($buffer);
+    $byteCount += 1;
+
+    # read $pageSegCount bytes, then throw 'em out
+    read($fh, $buffer, $pageSegCount);
+    $byteCount += $pageSegCount;
+
+    # check packet type. Should be 0x01 (for indentification header)
+    read($fh, $buffer, 1);
+    if (ord($buffer) != 0x01)
+    {
+	warn "Wrong vorbis header type, giving up.";
+	return undef;
+    }
+    $byteCount += 1;
+
+    # check that the packet identifies itself as 'vorbis'
+    read($fh, $buffer, 6);
+    if ($buffer ne 'vorbis')
+    {
+	warn "This does not appear to be a vorbis stream, giving up.";
+	return undef;
+    }
+    $byteCount += 6;
+
+    # at this point, we assume the bitstream is valid
+    return $byteCount;
+}
+
+sub _loadInfo
+{
+    my $data = shift;
+    my $start = $data->{'startInfoHeader'};
+    my $fh = $data->{'fileHandle'};
+    my $buffer;
+    my $byteCount = $start;
+    my %info;
+    
+    seek $fh, $start, 0;
+    
+    # read the vorbis version
+    read($fh, $buffer, 4);
+    $info{'version'} = _decodeInt($buffer);
+    $byteCount += 4;
+    
+    # read the number of audio channels
+    read($fh, $buffer, 1);
+    $info{'channels'} = ord($buffer);
+    $byteCount += 1;
+
+    # read the sample rate
+    read($fh, $buffer, 4);
+    $info{'rate'} = _decodeInt($buffer);
+    $byteCount += 4;
+    
+    # read the bitrate maximum
+    read($fh, $buffer, 4);
+    $info{'bitrate_upper'} = _decodeInt($buffer);
+    $byteCount += 4;
+
+    # read the bitrate nominal
+    read($fh, $buffer, 4);
+    $info{'bitrate_nominal'} = _decodeInt($buffer);
+    $byteCount += 4;
+
+    # read the bitrate minimal
+    read($fh, $buffer, 4);
+    $info{'bitrate_lower'} = _decodeInt($buffer);
+    $byteCount += 4;
+
+    # read the blocksize_0 and blocksize_1
+    read($fh, $buffer, 1);
+    # these are each 4 bit fields, whose actual value is 2 to the power
+    # of the value of the field
+    $info{'blocksize_0'} = 2 << ((ord($buffer) & 0xF0) >> 4);
+    $info{'blocksize_1'} = 2 << (ord($buffer) & 0x0F);
+    $byteCount += 1;
+
+    # read the framing_flag
+    read($fh, $buffer, 1);
+    $info{'framing_flag'} = ord($buffer);
+    $byteCount += 1;
+
+    # bitrate_window is -1 in the current version of vorbisfile
+    $info{'bitrate_window'} = -1;
+
+    $data->{'startCommentHeader'} = $byteCount;
+
+    $data->{'INFO'} = \%info;
+}
+
+sub _loadComments
+{
+    my $data = shift;
+    my $fh = $data->{'fileHandle'};
+    my $start = $data->{'startCommentHeader'};
+    my $buffer;
+    my $page_segments;
+    my $vendor_length;
+    my $user_comment_count;
+    my $byteCount = $start;
+    my %comments;
+
+    seek $fh, $start, 0;
+
+    # check that the first four bytes are 'OggS'
+    read($fh, $buffer, 4);
+    if ($buffer ne 'OggS')
+    {
+	warn "No comment header?";
+	return undef;
+    }
+    $byteCount += 4;
+
+    # skip over next ten bytes
+    read($fh, $buffer, 10);
+    $byteCount += 10;
+
+    # read the stream serial number
+    read($fh, $buffer, 4);
+    push @{$data->{'commentSerialNumber'}}, _decodeInt($buffer);
+    $byteCount += 4;
+
+    # read the page sequence number (should be 0x01)
+    read($fh, $buffer, 4);
+    if (_decodeInt($buffer) != 0x01)
+    {
+	warn "Comment header page sequence number is not 0x01: " + 
+	    _decodeInt($buffer);
+	warn "Going to keep going anyway.";
+    }
+    $byteCount += 4;
+
+    # and ignore the page checksum for now
+    read($fh, $buffer, 4);
+    $byteCount += 4;
+
+    # get the number of entries in the segment_table...
+    read($fh, $buffer, 1);
+    $page_segments = _decodeInt($buffer);
+    $byteCount += 1;
+    # then skip on past it
+    read($fh, $buffer, $page_segments);
+    $byteCount += $page_segments;
+
+    # check the header type (should be 0x03)
+    read($fh, $buffer, 1);
+    if (ord($buffer) != 0x03)
+    {
+	warn "Wrong header type: " . ord($buffer);
+    }    
+    $byteCount += 1;
+
+    # now we should see 'vorbis'
+    read($fh, $buffer, 6);
+    if ($buffer ne 'vorbis')
+    {
+	warn "Missing comment header. Should have found 'vorbis', found " .
+	    $buffer;
+    }
+    $byteCount += 6;
+
+    # get the vendor length
+    read($fh, $buffer, 4);
+    $vendor_length = _decodeInt($buffer);
+    $byteCount += 4;
+
+    # read in the vendor
+    read($fh, $buffer, $vendor_length);
+    $comments{'vendor'} = $buffer;
+    $byteCount += $vendor_length;
+
+    # read in the number of user comments
+    read($fh, $buffer, 4);
+    $user_comment_count = _decodeInt($buffer);
+    $byteCount += 4;
+
+    $data->{'COMMENT_KEYS'} = [];
+
+    # finally, read the comments
+    for (my $i = 0; $i < $user_comment_count; $i++)
+    {
+	# first read the length
+	read($fh, $buffer, 4);
+	my $comment_length = _decodeInt($buffer);
+	$byteCount += 4;
+
+	# then the comment itself
+	read($fh, $buffer, $comment_length);
+	$byteCount += $comment_length;
+
+	my ($key) = $buffer =~ /^([^=]+)/;
+	my ($value) = $buffer =~ /=(.*)$/;
+
+	push @{$comments{lc $key}}, $value;
+	push @{$data->{'COMMENT_KEYS'}}, lc $key;
+    }
+    
+    # read past the framing_bit
+    read($fh, $buffer, 1);
+    $byteCount += 1;
+
+    $data->{'INFO'}{'offset'} = $byteCount;
+
+    $data->{'COMMENTS'} = \%comments;
+}
+
+sub _calculateTrackLength
+{
+    my $data = shift;
+    my $fh = $data->{'fileHandle'};
+    my $buffer;
+    my $pageSize;
+    my $granule_position;
+
+    seek($fh,-8500,SEEK_END);  # that magic number is from vorbisfile.c
+    # in the constant CHUNKSIZE, which comes
+    # with the comment /* a shade over 8k;
+    # anyone using pages well over 8k gets
+    # what they deserve */
+
+    # we just keep looking through the headers until we get to the last one
+    # (there might be a couple of blocks here)
+    while(_findPage($fh))
+    {
+	# stream structure version - must be 0x00
+	read($fh, $buffer, 1);
+	if (ord($buffer) != 0x00)
+	{
+	    warn "Invalid stream structure version: " .
+		sprintf("%x", ord($buffer));
+	    return;
+ 	}
+
+ 	# header type flag
+ 	read($fh, $buffer, 1);
+ 	# we should check this, but for now we'll just ignore it
+
+ 	# absolute granule position - this is what we need!
+ 	read($fh, $buffer, 8);
+ 	$granule_position = _decodeInt($buffer);
+
+	# skip past stream_serial_number, page_sequence_number, and crc
+	read($fh, $buffer, 12);
+
+	# page_segments
+	read($fh, $buffer, 1);
+	my $page_segments = ord($buffer);
+
+	# reset pageSize
+	$pageSize = 0;
+	
+	# calculate approx. page size
+	for (my $i = 0; $i < $page_segments; $i++)
+	{
+	    read($fh, $buffer, 1);
+	    $pageSize += ord($buffer);
+	}
+
+	seek $fh, $pageSize, 1;
+    }
+
+    $data->{'INFO'}{'length'} = 
+	int($granule_position / $data->{'INFO'}{'rate'});
+}
+
+sub _findPage
+{
+    # search forward in the file for the 'OggS' page header
+    my $fh = shift;
+    my $char;
+    my $curStr = '';
+
+    while (read($fh, $char, 1))
+    {
+	$curStr = $char . $curStr;
+	$curStr = substr($curStr, 0, 4);
+
+	# we are actually looking for the string 'SggO' because we
+	# tack character on to our test string backwards, to make
+	# trimming it to 4 characters easier.
+	if ($curStr eq 'SggO')
+	{
+	    return 1;
+	}
+    }
+
+    return undef;
+}
+
+sub _decodeInt
+{
+    my $bytes = shift;
+    my $num = 0;
+    my @byteList = split //, $bytes;
+    my $numBytes = @byteList;
+    my $mult = 1;
+
+    for (my $i = 0; $i < $numBytes; $i ++)
+    {
+	$num += ord($byteList[$i]) * $mult;
+	$mult *= 256;
+    }
+
+    return $num;
+}
+
+sub _decodeInt5Bit
+{
+    my $byte = ord(shift);
+
+    $byte = $byte & 0xF8; # clear out the bottm 3 bits
+    $byte = $byte >> 3; # and shifted down to where it belongs
+
+    return $byte;
+}
+
+sub _decodeInt4Bit
+{
+    my $byte = ord(shift);
+
+    $byte = $byte & 0xFC; # clear out the bottm 4 bits
+    $byte = $byte >> 4; # and shifted down to where it belongs
+
+    return $byte;
+}
+
+sub _ilog
+{
+    my $x = shift;
+    my $ret = 0;
+
+    unless ($x > 0)
+    {
+	return 0;
+    }
+
+    while ($x > 0)
+    {
+	$ret++;
+	$x = $x >> 1;
+    }
+
+    return $ret;
+}
+
+1;
+__DATA__
+
+=head1 NAME
+
+Ogg::Vorbis::Header::PurePerl - An object-oriented interface to Ogg Vorbis
+information and comment fields, implemented entirely in Perl.  Intended to be 
+a drop in replacement for Ogg::Vobis::Header.
+
+Unlike Ogg::Vorbis::Header, this module will go ahead and fill in all of the
+information fields as soon as you construct the object.  In other words,
+the C<new> and C<load> constructors have identical behavior. 
+
+=head1 SYNOPSIS
+
+	use Ogg::Vorbis::Header::PurePerl;
+	my $ogg = Ogg::Vorbis::Header::PurePerl->new("song.ogg");
+	while (my ($k, $v) = each %{$ogg->info}) {
+		print "$k: $v\n";
+	}
+	foreach my $com ($ogg->comment_tags) {
+		print "$com: $_\n" foreach $ogg->comment($com);
+	}
+
+=head1 DESCRIPTION
+
+This module is intended to be a drop in replacement for Ogg::Vorbis::Header,
+implemented entirely in Perl.  It provides an object-oriented interface to
+Ogg Vorbis information and comment fields.  (NOTE: This module currently 
+supports only read operations).
+
+=head1 CONSTRUCTORS
+
+=head2 C<new ($filename)>
+
+Opens an Ogg Vorbis file, ensuring that it exists and is actually an
+Ogg Vorbis stream.  This method does not actually read any of the
+information or comment fields, and closes the file immediately. 
+
+=head2 C<load ([$filename])>
+
+Opens an Ogg Vorbis file, ensuring that it exists and is actually an
+Ogg Vorbis stream, then loads the information and comment fields.  This
+method can also be used without a filename to load the information
+and fields of an already constructed instance.
+
+=head1 INSTANCE METHODS
+
+=head2 C<info ([$key])>
+
+Returns a hashref containing information about the Ogg Vorbis file from
+the file's information header.  Hash fields are: version, channels, rate,
+bitrate_upper, bitrate_nominal, bitrate_lower, bitrate_window, and length.
+The bitrate_window value is not currently used by the vorbis codec, and 
+will always be -1.  
+
+The optional parameter, key, allows you to retrieve a single value from
+the object's hash.  Returns C<undef> if the key is not found.
+
+=head2 C<comment_tags ()>
+
+Returns an array containing the key values for the comment fields. 
+These values can then be passed to C<comment> to retrieve their values.
+
+=head2 C<comment ($key)>
+
+Returns an array of comment values associated with the given key.
+
+=head2 C<add_comments ($key, $value, [$key, $value, ...])>
+
+Unimplemented.
+
+=head2 C<edit_comment ($key, $value, [$num])>
+
+Unimplemented.
+
+=head2 C<delete_comment ($key, [$num])>
+
+Unimplemented.
+
+=head2 C<clear_comments ([@keys])>
+
+Unimplemented.
+
+=head2 C<write_vorbis ()>
+
+Unimplemented.
+
+=head2 C<path ()>
+
+Returns the path/filename of the file the object represents.
+
+=head1 NOTE
+
+This is ALPHA SOFTWARE.  It may very well be very broken.  Do not use it in
+a production environment.  You have been warned.
+
+=head1 ACKNOWLEDGEMENTS
+
+Dave Brown <cpan@dagbrown.com> made this module significantly faster
+at calculating the length of ogg files.
+
+Robert Moser II <rlmoser@earthlink.net> fixed a problem with files that
+have no comments.
+
+=head1 AUTHOR
+
+Andrew Molloy E<lt>amolloy@kaizolabs.comE<gt>
+
+=head1 COPYRIGHT
+
+Copyright (c) 2003, Andrew Molloy.  All Rights Reserved.
+
+This program is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.  A copy of this license is included
+with this module (LICENSE.GPL).
+
+=head1 SEE ALSO
+
+L<Ogg::Vorbis::Header>, L<Ogg::Vorbis::Decoder>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Sub/Override.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Sub/Override.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Sub/Override.pm	(revision 24799)
@@ -0,0 +1,302 @@
+package Sub::Override;
+
+use strict;
+use warnings;
+
+our $VERSION = '0.08';
+
+my $_croak = sub {
+    local *__ANON__ = '__ANON__croak';
+    my ( $proto, $message ) = @_;
+    require Carp;
+    Carp::croak($message);
+};
+
+my $_validate_code_slot = sub {
+    local *__ANON__ = '__ANON__validate_code_slot';
+    my ( $self, $code_slot ) = @_;
+    no strict 'refs';
+    unless ( defined *{$code_slot}{CODE} ) {
+        $self->$_croak("Cannot replace non-existent sub ($code_slot)");
+    }
+    return $self;
+};
+
+my $_validate_sub_ref = sub {
+    local *__ANON__ = '__ANON__validate_sub_ref';
+    my ( $self, $sub_ref ) = @_;
+    unless ( 'CODE' eq ref $sub_ref ) {
+        $self->$_croak("($sub_ref) must be a code reference");
+    }
+    return $self;
+};
+
+my $_normalize_sub_name = sub {
+    local *__ANON__ = '__ANON__normalize_sub_name';
+    my ( $self, $subname ) = @_;
+    if ( ( $subname || '' ) =~ /^\w+$/ ) { # || "" for suppressing test warnings
+        my $package = do {
+            my $call_level = 0;
+            my $this_package;
+            while ( !$this_package || __PACKAGE__ eq $this_package ) {
+                ($this_package) = caller($call_level);
+                $call_level++;
+            }
+            $this_package;
+        };
+        $subname = "${package}::$subname";
+    }
+    return $subname;
+};
+
+sub new {
+    my $class = shift;
+    my $self = bless {}, $class;
+    $self->replace(@_) if @_;
+    return $self;
+}
+
+# because override() was a better name and this is what it should have been
+# called.
+*override = *replace{CODE};
+
+sub replace {
+    my ( $self, $sub_to_replace, $new_sub ) = @_;
+    $sub_to_replace = $self->$_normalize_sub_name($sub_to_replace);
+    $self->$_validate_code_slot($sub_to_replace)->$_validate_sub_ref($new_sub);
+    {
+        no strict 'refs';
+        $self->{$sub_to_replace} ||= *$sub_to_replace{CODE};
+        no warnings 'redefine';
+        *$sub_to_replace = $new_sub;
+    }
+    return $self;
+}
+
+sub restore {
+    my ( $self, $name_of_sub ) = @_;
+    $name_of_sub = $self->$_normalize_sub_name($name_of_sub);
+    if ( !$name_of_sub && 1 == keys %$self ) {
+        ($name_of_sub) = keys %$self;
+    }
+    $self->$_croak(
+        sprintf 'You must provide the name of a sub to restore: (%s)' => join
+          ', ' => sort keys %$self )
+      unless $name_of_sub;
+    $self->$_croak("Cannot restore a sub that was not replaced ($name_of_sub)")
+      unless exists $self->{$name_of_sub};
+    no strict 'refs';
+    no warnings 'redefine';
+    *$name_of_sub = delete $self->{$name_of_sub};
+    return $self;
+}
+
+sub DESTROY {
+    my $self = shift;
+    no strict 'refs';
+    no warnings 'redefine';
+    while ( my ( $sub_name, $sub_ref ) = each %$self ) {
+        *$sub_name = $sub_ref;
+    }
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Sub::Override - Perl extension for easily overriding subroutines
+
+=head1 SYNOPSIS
+
+  use Sub::Override;
+
+  sub foo { 'original sub' };
+  print foo(); # prints 'original sub'
+
+  my $override = Sub::Override->new( foo => sub { 'overridden sub' } );
+  print foo(); # prints 'overridden sub'
+  $override->restore;
+  print foo(); # prints 'original sub'
+
+=head1 DESCRIPTION
+
+=head2 The Problem
+
+Sometimes subroutines need to be overridden.  In fact, your author does this
+constantly for tests.  Particularly when testing, using a Mock Object can be
+overkill when all you want to do is override one tiny, little function.
+
+Overriding a subroutine is often done with syntax similar to the following.
+
+ {
+   local *Some::sub = sub {'some behavior'};
+   # do something
+ }
+ # original subroutine behavior restored
+
+This has a few problems.
+
+ {
+   local *Get::some_feild = { 'some behavior' };
+   # do something
+ }
+
+In the above example, not only have we probably mispelled the subroutine name,
+but even if their had been a subroutine with that name, we haven't overridden
+it.  These two bugs can be subtle to detect.
+
+Further, if we're attempting to localize the effect by placing this code in a
+block, the entire construct is cumbersome.
+
+Hook::LexWrap also allows us to override sub behavior, but I can never remember
+the exact syntax.
+
+=head2 An easier way to replace subroutines
+
+Instead, C<Sub::Override> allows the programmer to simply name the sub to
+replace and to supply a sub to replace it with.
+
+  my $override = Sub::Override->new('Some::sub', sub {'new data'});
+
+  # which is equivalent to:
+  my $override = Sub::Override->new;
+  $override->replace('Some::sub', sub { 'new data' });
+
+You can replace multiple subroutines, if needed:
+
+  $override->replace('Some::sub1', sub { 'new data1' });
+  $override->replace('Some::sub2', sub { 'new data2' });
+  $override->replace('Some::sub3', sub { 'new data3' });
+
+If replacing the subroutine succeeds, the object is returned.  This allows the
+programmer to chain the calls, if this style of programming is preferred:
+
+  $override->replace('Some::sub1', sub { 'new data1' })
+           ->replace('Some::sub2', sub { 'new data2' })
+           ->replace('Some::sub3', sub { 'new data3' });
+
+A subroutine may be replaced as many times as desired.  This is most useful
+when testing how code behaves with multiple conditions.
+
+  $override->replace('Some::thing', sub { 0 });
+  is($object->foo, 'wibble', 'wibble is returned if Some::thing is false');
+
+  $override->replace('Some::thing', sub { 1 });
+  is($object->foo, 'puppies', 'puppies are returned if Some::thing is true');
+
+=head2 Restoring subroutines
+
+If the object falls out of scope, the original subs are restored.  However, if
+you need to restore a subroutine early, just use the restore method:
+
+  my $override = Sub::Override->new('Some::sub', sub {'new data'});
+  # do stuff
+  $override->restore;
+
+Which is somewhat equivalent to:
+
+  {
+    my $override = Sub::Override->new('Some::sub', sub {'new data'});
+    # do stuff
+  }
+
+If you have override more than one subroutine with an override object, you
+will have to explicitly name the subroutine you wish to restore:
+
+  $override->restore('This::sub');
+
+Note C<restore()> will always restore the original behavior of the subroutine
+no matter how many times you have overridden it.
+
+=head2 Which package is the subroutine in?
+
+Ordinarily, you want to fully qualify the subroutine by including the package
+name.  However, failure to fully qualify the subroutine name will assume the
+current package.
+
+  package Foo;
+  use Sub::Override;
+  sub foo { 23 };
+  my $override = Sub::Override->new( foo => sub { 42 } ); # assumes Foo::foo
+  print foo(); # prints 42
+  $override->restore;
+  print foo(); # prints 23
+
+=head1 METHODS
+
+=head2 new
+
+  my $sub = Sub::Override->new;
+  my $sub = Sub::Override->new($sub_name, $sub_ref);
+
+Creates a new C<Sub::Override> instance.  Optionally, you may override a 
+subroutine while creating a new object.
+
+=head2 replace
+
+ $sub->replace($sub_name, $sub_body);
+
+Temporarily replaces a subroutine with another subroutine.  Returns the
+instance, so chaining the method is allowed:
+
+ $sub->replace($sub_name, $sub_body)
+     ->replace($another_sub, $another_body);
+
+This method will C<croak> is the subroutine to be replaced does not exist.
+
+=head2 override
+
+ my $sub = Sub::Override->new;
+ $sub->override($sub_name, $sub_body);
+
+C<override> is an alternate name for C<replace>.  They are the same method.
+
+=cut
+
+=head2 restore
+
+ $sub->restore($sub_name);
+
+Restores the previous behavior of the subroutine.  This will happen
+automatically if the C<Sub::Override> object falls out of scope.
+
+=cut
+
+=head1 EXPORT
+
+None by default.
+
+=head1 BUGS
+
+Probably.  Tell me about 'em.
+
+=head1 SEE ALSO
+
+=over 4
+
+=item *
+Hook::LexWrap -- can also override subs, but with different capabilities
+
+=item *
+Test::MockObject -- use this if you need to alter an entire class
+
+=back
+
+=head1 AUTHOR
+
+Curtis "Ovid" Poe, C<< <ovid [at] cpan [dot] org> >>
+
+Reverse the name to email me.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (C) 2004-2005 by Curtis "Ovid" Poe
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself, either Perl version 5.8.2 or,
+at your option, any later version of Perl 5 you may have available.
+
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Sub/Uplevel.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Sub/Uplevel.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Sub/Uplevel.pm	(revision 24799)
@@ -0,0 +1,246 @@
+package Sub::Uplevel;
+
+use 5.006;
+
+use strict;
+use vars qw($VERSION @ISA @EXPORT);
+$VERSION = "0.14";
+
+# We have to do this so the CORE::GLOBAL versions override the builtins
+_setup_CORE_GLOBAL();
+
+require Exporter;
+@ISA = qw(Exporter);
+@EXPORT = qw(uplevel);
+
+=head1 NAME
+
+Sub::Uplevel - apparently run a function in a higher stack frame
+
+=head1 SYNOPSIS
+
+  use Sub::Uplevel;
+
+  sub foo {
+      print join " - ", caller;
+  }
+
+  sub bar {
+      uplevel 1, \&foo;
+  }
+
+  #line 11
+  bar();    # main - foo.plx - 11
+
+=head1 DESCRIPTION
+
+Like Tcl's uplevel() function, but not quite so dangerous.  The idea
+is just to fool caller().  All the really naughty bits of Tcl's
+uplevel() are avoided.
+
+B<THIS IS NOT THE SORT OF THING YOU WANT TO DO EVERYDAY>
+
+=over 4
+
+=item B<uplevel>
+
+  uplevel $num_frames, \&func, @args;
+
+Makes the given function think it's being executed $num_frames higher
+than the current stack level.  So when they use caller($frames) it
+will actually give caller($frames + $num_frames) for them.
+
+C<uplevel(1, \&some_func, @_)> is effectively C<goto &some_func> but
+you don't immediately exit the current subroutine.  So while you can't
+do this:
+
+    sub wrapper {
+        print "Before\n";
+        goto &some_func;
+        print "After\n";
+    }
+
+you can do this:
+
+    sub wrapper {
+        print "Before\n";
+        my @out = uplevel 1, &some_func;
+        print "After\n";
+        return @out;
+    }
+
+
+=cut
+
+our @Up_Frames; # uplevel stack
+
+sub uplevel {
+    my($num_frames, $func, @args) = @_;
+    
+    local @Up_Frames = ($num_frames, @Up_Frames );
+    return $func->(@args);
+}
+
+
+sub _setup_CORE_GLOBAL {
+    no warnings 'redefine';
+
+    *CORE::GLOBAL::caller = sub(;$) {
+        my $height = $_[0] || 0;
+
+        # shortcut if no uplevels have been called
+        # always add +1 to CORE::caller to skip this function's caller
+        return CORE::caller( $height + 1 ) if ! @Up_Frames;
+
+=begin _private
+
+So it has to work like this:
+
+    Call stack               Actual     uplevel 1
+CORE::GLOBAL::caller
+Carp::short_error_loc           0
+Carp::shortmess_heavy           1           0
+Carp::croak                     2           1
+try_croak                       3           2
+uplevel                         4            
+function_that_called_uplevel    5            
+caller_we_want_to_see           6           3
+its_caller                      7           4
+
+So when caller(X) winds up below uplevel(), it only has to use  
+CORE::caller(X+1) (to skip CORE::GLOBAL::caller).  But when caller(X)
+winds up no or above uplevel(), it's CORE::caller(X+1+uplevel+1).
+
+Which means I'm probably going to have to do something nasty like walk
+up the call stack on each caller() to see if I'm going to wind up   
+before or after Sub::Uplevel::uplevel().
+
+=end _private
+
+=begin _dagolden
+
+I found the description above a bit confusing.  Instead, this is the logic
+that I found clearer when CORE::GLOBAL::caller is invoked and we have to
+walk up the call stack:
+
+* if searching up to the requested height in the real call stack doesn't find
+a call to uplevel, then we can return the result at that height in the
+call stack
+
+* if we find a call to uplevel, we need to keep searching upwards beyond the
+requested height at least by the amount of upleveling requested for that
+call to uplevel (from the Up_Frames stack set during the uplevel call)
+
+* additionally, we need to hide the uplevel subroutine call, too, so we search
+upwards one more level for each call to uplevel
+
+* when we've reached the top of the search, we want to return that frame
+in the call stack, i.e. the requested height plus any uplevel adjustments
+found during the search
+
+=end _dagolden
+        
+=cut
+
+        my $saw_uplevel = 0;
+        my $adjust = 0;
+
+        # walk up the call stack to fight the right package level to return;
+        # look one higher than requested for each call to uplevel found
+        # and adjust by the amount found in the Up_Frames stack for that call
+
+        for ( my $up = 0; $up <= $height + $adjust; $up++ ) {
+            my @caller = CORE::caller($up + 1); 
+            if( defined $caller[0] && $caller[0] eq __PACKAGE__ ) {
+                # add one for each uplevel call seen
+                # and look into the uplevel stack for the offset
+                $adjust += 1 + $Up_Frames[$saw_uplevel];
+                $saw_uplevel++;
+            }
+        }
+
+        my @caller = CORE::caller($height + $adjust + 1);
+
+        if( wantarray ) {
+            if( !@_ ) {
+                @caller = @caller[0..2];
+            }
+            return @caller;
+        }
+        else {
+            return $caller[0];
+        }
+    }; # sub
+
+}
+
+=back
+
+=head1 EXAMPLE
+
+The main reason I wrote this module is so I could write wrappers
+around functions and they wouldn't be aware they've been wrapped.
+
+    use Sub::Uplevel;
+
+    my $original_foo = \&foo;
+
+    *foo = sub {
+        my @output = uplevel 1, $original_foo;
+        print "foo() returned:  @output";
+        return @output;
+    };
+
+If this code frightens you B<you should not use this module.>
+
+
+=head1 BUGS and CAVEATS
+
+Sub::Uplevel must be used as early as possible in your program's
+compilation.
+
+Well, the bad news is uplevel() is about 5 times slower than a normal
+function call.  XS implementation anyone?
+
+Blows over any CORE::GLOBAL::caller you might have (and if you do,
+you're just sick).
+
+
+=head1 HISTORY
+
+Those who do not learn from HISTORY are doomed to repeat it.
+
+The lesson here is simple:  Don't sit next to a Tcl programmer at the
+dinner table.
+
+
+=head1 THANKS
+
+Thanks to Brent Welch, Damian Conway and Robin Houston.
+
+
+=head1 AUTHORS
+
+David A Golden E<lt>dagolden@cpan.orgE<gt> (current maintainer)
+
+Michael G Schwern E<lt>schwern@pobox.comE<gt> (original author)
+
+=head1 LICENSE
+
+Copyright by Michael G Schwern, David A Golden
+
+This program is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+See http://www.perl.com/perl/misc/Artistic.html
+
+
+=head1 SEE ALSO
+
+PadWalker (for the similar idea with lexicals), Hook::LexWrap, 
+Tcl's uplevel() at http://www.scriptics.com/man/tcl8.4/TclCmd/uplevel.htm
+
+=cut
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Test/Exception.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Test/Exception.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Test/Exception.pm	(revision 24799)
@@ -0,0 +1,432 @@
+use strict;
+use warnings;
+
+package Test::Exception;
+use Test::Builder;
+use Sub::Uplevel qw( uplevel );
+use base qw( Exporter );
+use Carp;
+
+our $VERSION = '0.24';
+our @EXPORT = qw(dies_ok lives_ok throws_ok lives_and);
+
+my $Tester = Test::Builder->new;
+
+sub import {
+    my $self = shift;
+    if ( @_ ) {
+        my $package = caller;
+        $Tester->exported_to( $package );
+        $Tester->plan( @_ );
+    };
+    $self->export_to_level( 1, $self, $_ ) foreach @EXPORT;
+}
+
+=head1 NAME
+
+Test::Exception - Test exception based code
+
+=head1 SYNOPSIS
+
+  use Test::More tests => 5;
+  use Test::Exception;
+
+  # or if you don't need Test::More
+
+  use Test::Exception tests => 5;
+
+  # then...
+
+  # Check that something died
+  dies_ok { $foo->method1 } 'expecting to die';
+
+  # Check that something did not die
+  lives_ok { $foo->method2 } 'expecting to live';
+
+  # Check that the stringified exception matches given regex
+  throws_ok { $foo->method3 } qr/division by zero/, 'zero caught okay';
+
+  # Check an exception of the given class (or subclass) is thrown
+  throws_ok { $foo->method4 } 'Error::Simple', 'simple error thrown';
+  
+  # all Test::Exceptions subroutines are guaranteed to preserve the state 
+  # of $@ so you can do things like this after throws_ok and dies_ok
+  like $@, 'what the stringified exception should look like';
+
+  # Check that a test runs without an exception
+  lives_and { is $foo->method, 42 } 'method is 42';
+  
+  # or if you don't like prototyped functions
+  
+  dies_ok( sub { $foo->method1 }, 'expecting to die' );
+  lives_ok( sub { $foo->method2 }, 'expecting to live' );
+  throws_ok( sub { $foo->method3 }, qr/division by zero/,
+      'zero caught okay' );
+  throws_ok( sub { $foo->method4 }, 'Error::Simple', 
+      'simple error thrown' );
+  lives_and( sub { is $foo->method, 42 }, 'method is 42' );
+
+
+=head1 DESCRIPTION
+
+This module provides a few convenience methods for testing exception based code. It is built with L<Test::Builder> and plays happily with L<Test::More> and friends.
+
+If you are not already familiar with L<Test::More> now would be the time to go take a look.
+
+You can specify the test plan when you C<use Test::Exception> in the same way as C<use Test::More>. See L<Test::More> for details.
+
+=cut
+
+
+sub _try_as_caller {
+    my $coderef = shift;
+    eval { uplevel 3, $coderef };
+    return $@;
+};
+
+
+sub _is_exception {
+    my $exception = shift;
+    return ref $exception || $exception ne '';
+};
+
+
+sub _exception_as_string {
+    my ( $prefix, $exception ) = @_;
+    return "$prefix normal exit" unless _is_exception( $exception );
+    my $class = ref $exception;
+    $exception = "$class ($exception)" 
+            if $class && "$exception" !~ m/^\Q$class/;
+    chomp $exception;
+    return "$prefix $exception";
+};
+
+
+=over 4
+
+=item B<dies_ok>
+
+Checks that a piece of code dies, rather than returning normally. For example:
+
+    sub div {
+        my ( $a, $b ) = @_;
+        return $a / $b;
+    };
+
+    dies_ok { div( 1, 0 ) } 'divide by zero detected';
+
+    # or if you don't like prototypes
+    dies_ok( sub { div( 1, 0 ) }, 'divide by zero detected' );
+
+A true value is returned if the test succeeds, false otherwise. On exit $@ is guaranteed to be the cause of death (if any).
+
+The test description is optional, but recommended. 
+
+=cut
+
+
+sub dies_ok (&;$) {
+    my ( $coderef, $description ) = @_;
+    my $exception = _try_as_caller( $coderef );
+    my $ok = $Tester->ok( _is_exception($exception), $description );
+    $@ = $exception;
+    return $ok;
+}
+
+
+=item B<lives_ok>
+
+Checks that a piece of code exits normally, and doesn't die. For example:
+
+    sub read_file {
+        my $file = shift;
+        local $/;
+        open my $fh, '<', $file or die "open failed ($!)\n";
+        $file = <FILE>;
+        return $file;
+    };
+
+    my $file;
+    lives_ok { $file = read_file('test.txt') } 'file read';
+
+    # or if you don't like prototypes
+    lives_ok( sub { $file = read_file('test.txt') }, 'file read' );
+
+Should a lives_ok() test fail it produces appropriate diagnostic messages. For example:
+
+    not ok 1 - file read
+    #     Failed test (test.t at line 15)
+    # died: open failed (No such file or directory)
+
+A true value is returned if the test succeeds, false otherwise. On exit $@ is guaranteed to be the cause of death (if any).
+
+The test description is optional, but recommended. 
+
+=cut
+
+sub lives_ok (&;$) {
+    my ( $coderef, $description ) = @_;
+    my $exception = _try_as_caller( $coderef );
+    my $ok = $Tester->ok( ! _is_exception( $exception ), $description );
+	$Tester->diag( _exception_as_string( "died:", $exception ) ) unless $ok;
+    $@ = $exception;
+    return $ok;
+}
+
+
+=item B<throws_ok>
+
+Tests to see that a specific exception is thrown. throws_ok() has two forms: 
+
+  throws_ok BLOCK REGEX, TEST_DESCRIPTION
+  throws_ok BLOCK CLASS, TEST_DESCRIPTION
+
+In the first form the test passes if the stringified exception matches the give regular expression. For example:
+
+    throws_ok { read_file( 'unreadable' ) } qr/No file/, 'no file';
+
+If your perl does not support C<qr//> you can also pass a regex-like string, for example:
+
+    throws_ok { read_file( 'unreadable' ) } '/No file/', 'no file';
+
+The second form of throws_ok() test passes if the exception is of the same class as the one supplied, or a subclass of that class. For example:
+
+    throws_ok { $foo->bar } "Error::Simple", 'simple error';
+
+Will only pass if the C<bar> method throws an Error::Simple exception, or a subclass of an Error::Simple exception.
+
+You can get the same effect by passing an instance of the exception you want to look for. The following is equivalent to the previous example:
+
+    my $SIMPLE = Error::Simple->new;
+    throws_ok { $foo->bar } $SIMPLE, 'simple error';
+
+Should a throws_ok() test fail it produces appropriate diagnostic messages. For example:
+
+    not ok 3 - simple error
+    #     Failed test (test.t at line 48)
+    # expecting: Error::Simple exception
+    # found: normal exit
+
+Like all other Test::Exception functions you can avoid prototypes by passing a subroutine explicitly:
+
+    throws_ok( sub {$foo->bar}, "Error::Simple", 'simple error' );
+
+A true value is returned if the test succeeds, false otherwise. On exit $@ is guaranteed to be the cause of death (if any).
+
+A description of the exception being checked is used if no optional test description is passed.
+
+=cut
+
+
+sub throws_ok (&$;$) {
+    my ( $coderef, $expecting, $description ) = @_;
+    croak "throws_ok: must pass exception class/object or regex" 
+        unless defined $expecting;
+    $description = _exception_as_string( "threw", $expecting )
+    	unless defined $description;
+    my $exception = _try_as_caller( $coderef );
+    my $regex = $Tester->maybe_regex( $expecting );
+    my $ok = $regex 
+        ? ( $exception =~ m/$regex/ ) 
+        : eval { 
+            $exception->isa( ref $expecting ? ref $expecting : $expecting ) 
+        };
+    $Tester->ok( $ok, $description );
+    unless ( $ok ) {
+        $Tester->diag( _exception_as_string( "expecting:", $expecting ) );
+        $Tester->diag( _exception_as_string( "found:", $exception ) );
+    };
+    $@ = $exception;
+    return $ok;
+};
+
+
+=item B<lives_and>
+
+Run a test that may throw an exception. For example, instead of doing:
+
+  my $file;
+  lives_ok { $file = read_file('answer.txt') } 'read_file worked';
+  is $file, "42", 'answer was 42';
+
+You can use lives_and() like this:
+
+  lives_and { is read_file('answer.txt'), "42" } 'answer is 42';
+  # or if you don't like prototypes
+  lives_and(sub {is read_file('answer.txt'), "42"}, 'answer is 42');
+
+Which is the same as doing
+
+  is read_file('answer.txt'), "42\n", 'answer is 42';
+
+unless C<read_file('answer.txt')> dies, in which case you get the same kind of error as lives_ok()
+
+  not ok 1 - answer is 42
+  #     Failed test (test.t at line 15)
+  # died: open failed (No such file or directory)
+
+A true value is returned if the test succeeds, false otherwise. On exit $@ is guaranteed to be the cause of death (if any).
+
+The test description is optional, but recommended.
+
+=cut
+
+sub lives_and (&;$) {
+    my ( $test, $description ) = @_;
+    {
+        local $Test::Builder::Level = $Test::Builder::Level + 1;
+        my $ok = \&Test::Builder::ok;
+        no warnings;
+        local *Test::Builder::ok = sub {
+            $_[2] = $description unless defined $_[2];
+            $ok->(@_);
+        };
+        use warnings;
+        eval { $test->() } and return 1;
+    };
+    my $exception = $@;
+    if ( _is_exception( $exception ) ) {
+        $Tester->ok( 0, $description );
+        $Tester->diag( _exception_as_string( "died:", $exception ) );
+    };
+    $@ = $exception;
+    return;
+}
+
+=back
+
+
+=head1 SKIPPING TEST::EXCEPTION TESTS
+
+Sometimes we want to use Test::Exception tests in a test suite, but don't want to force the user to have Test::Exception installed. One way to do this is to skip the tests if Test::Exception is absent. You can do this with code something like this:
+
+  use strict;
+  use warnings;
+  use Test::More;
+  
+  BEGIN {
+      eval "use Test::Exception";
+      plan skip_all => "Test::Exception needed" if $@;
+  }
+  
+  plan tests => 2;
+  # ... tests that need Test::Exception ...
+
+Note that we load Test::Exception in a C<BEGIN> block ensuring that the subroutine prototypes are in place before the rest of the test script is compiled.
+
+
+=head1 BUGS
+
+None known at the time of writing. 
+
+If you find any please let me know by e-mail, or report the problem with L<http://rt.cpan.org/>.
+
+
+=head1 COMMUNITY
+
+=over 4
+
+=item perl-qa
+
+If you are interested in testing using Perl I recommend you visit L<http://qa.perl.org/> and join the excellent perl-qa mailing list. See L<http://lists.perl.org/showlist.cgi?name=perl-qa> for details on how to subscribe.
+
+=item perlmonks
+
+You can find users of Test::Exception, including the module author, on  L<http://www.perlmonks.org/>. Feel free to ask questions on Test::Exception there.
+
+=item CPAN::Forum
+
+The CPAN Forum is a web forum for discussing Perl's CPAN modules.   The Test::Exception forum can be found at L<http://www.cpanforum.com/dist/Test-Exception>.
+
+=item AnnoCPAN
+
+AnnoCPAN is a web site that allows community annotations of Perl module documentation. The Test::Exception annotations can be found at L<http://annocpan.org/~ADIE/Test-Exception/>.
+
+=back
+
+
+=head1 TO DO
+
+If you think this module should do something that it doesn't (or does something that it shouldn't) please let me know.
+
+You can see my current to do list at L<http://adrianh.tadalist.com/lists/public/15421>, with an RSS feed of changes at L<http://adrianh.tadalist.com/lists/feed_public/15421>.
+
+
+=head1 ACKNOWLEDGMENTS
+
+Thanks to chromatic and Michael G Schwern for the excellent Test::Builder, without which this module wouldn't be possible.
+
+Thanks to 
+Adam Kennedy,
+Andy Lester, 
+Aristotle, 
+Ben Prew, 
+Cees Hek,
+chromatic, 
+Curt Sampson,
+David Golden, 
+David Wheeler, 
+Janek Schleicher,
+Jim Keenan, 
+Jos I. Boumans, 
+Jost Krieger,
+Mark Fowler, 
+Michael G Schwern, 
+Paul McCann,
+Perrin Harkins, 
+Peter Scott, 
+Rob Muhlestein 
+Scott R. Godin,
+Steve Purkis,
+Steve, 
+Tim Bunce,
+and various anonymous folk for comments, suggestions, bug reports and patches.
+
+
+=head1 AUTHOR
+
+Adrian Howard <adrianh@quietstars.com>
+
+If you can spare the time, please drop me a line if you find this module useful.
+
+
+=head1 SEE ALSO
+
+=over 4
+
+=item L<Test::Builder>
+
+Support module for building test libraries.
+
+=item L<Test::Simple> & L<Test::More>
+
+Basic utilities for writing tests.
+
+=item L<Test::Warn> & L<Test::NoWarnings>
+
+Modules to help test warnings.
+
+=item L<http://qa.perl.org/test-modules.html>
+
+Overview of some of the many testing modules available on CPAN.
+
+=item L<http://del.icio.us/tag/Test::Exception>
+
+Delicious links on Test::Exception.
+
+=item L<http://del.icio.us/tag/perl+testing>
+
+Delicious links on perl testing.
+
+=back
+
+
+=head1 LICENCE
+
+Copyright 2002-2006 Adrian Howard, All Rights Reserved.
+
+This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
+
+=cut
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Win32/Shortcut.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Win32/Shortcut.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/Win32/Shortcut.pm	(revision 24799)
@@ -0,0 +1,352 @@
+package Win32::Shortcut;
+#######################################################################
+#
+# Win32::Shortcut - Perl Module for Shell Link Interface
+# ^^^^^^^^^^^^^^^
+# This module creates an object oriented interface to the Win32
+# Shell Links (IShellLink interface).
+#
+# Version: 0.03 (07 Apr 1997)
+#
+#######################################################################
+
+require Exporter;       # to export the constants to the main:: space
+require DynaLoader;     # to dynuhlode the module.
+
+@ISA= qw( Exporter DynaLoader );
+@EXPORT = qw(
+    SW_SHOWMAXIMIZED
+    SW_SHOWMINNOACTIVE
+    SW_SHOWNORMAL
+);
+
+
+#######################################################################
+# This AUTOLOAD is used to 'autoload' constants from the constant()
+# XS function.  If a constant is not found then control is passed
+# to the AUTOLOAD in AutoLoader.
+#
+
+sub AUTOLOAD {
+    my($constname);
+    ($constname = $AUTOLOAD) =~ s/.*:://;
+    #reset $! to zero to reset any current errors.
+    local $! = 0;
+    my $val = constant($constname, @_ ? $_[0] : 0);
+    if ($! != 0) {
+
+    # [dada] This results in an ugly Autoloader error
+
+    #if ($! =~ /Invalid/) {
+    #    $AutoLoader::AUTOLOAD = $AUTOLOAD;
+    #    goto &AutoLoader::AUTOLOAD;
+    #} else {
+    
+    # [dada] ... I prefer this one :)
+
+        ($pack, $file, $line) = caller;
+        undef $pack; # [dada] and get rid of "used only once" warning...
+        die "Win32::Shortcut::$constname is not defined, used at $file line $line.";
+
+    #}
+    }
+    eval "sub $AUTOLOAD { $val }";
+    goto &$AUTOLOAD;
+}
+
+
+#######################################################################
+# STATIC OBJECT PROPERTIES
+#
+$VERSION = "0.03";
+
+#######################################################################
+# PUBLIC METHODS
+#
+
+#======== ### CLASS CONSTRUCTOR
+sub new {
+#========
+    my($class, $file) = @_;
+    my $self = {}; 
+    my $ilink = 0; 
+    my $ifile = 0;
+
+    ($ilink, $ifile) = _Instance();
+
+    if($ilink and $ifile) {
+        $self->{'ilink'} = $ilink;
+        $self->{'ifile'} = $ifile;
+        bless $self;
+        # Initialize properties
+        $self->{'File'}             = "";
+        $self->{'Path'}             = "";
+        $self->{'Arguments'}        = "";
+        $self->{'WorkingDirectory'} = "";
+        $self->{'Description'}      = "";
+        $self->{'ShowCmd'}          = 0;
+        $self->{'Hotkey'}           = 0;
+        $self->{'IconLocation'}     = "";
+        $self->{'IconNumber'}       = 0;
+
+        $self->Load($file) if $file;
+        
+    } else {
+        return undef;
+    }
+    $self;
+}  
+
+#=========
+sub Load {
+#=========
+    my($self, $file) = @_;
+    return undef unless ref($self);
+  
+    my $result = _Load($self->{'ilink'}, $self->{'ifile'}, $file);
+
+    if(defined($result)) {
+  
+        # fill the properties of $self
+        $self->{'File'} = $file;
+        $self->{'Path'} = _GetPath($self->{'ilink'}, $self->{'ifile'},0);
+        $self->{'ShortPath'} = _GetPath($self->{'ilink'}, $self->{'ifile'},1);
+        $self->{'Arguments'} = _GetArguments($self->{'ilink'}, $self->{'ifile'});
+        $self->{'WorkingDirectory'} = _GetWorkingDirectory($self->{'ilink'}, $self->{'ifile'});
+        $self->{'Description'} = _GetDescription($self->{'ilink'}, $self->{'ifile'});
+        $self->{'ShowCmd'} = _GetShowCmd($self->{'ilink'}, $self->{'ifile'});
+        $self->{'Hotkey'} = _GetHotkey($self->{'ilink'}, $self->{'ifile'});
+        ($self->{'IconLocation'},
+         $self->{'IconNumber'}) = _GetIconLocation($self->{'ilink'}, $self->{'ifile'});
+    }
+    return $result;
+}
+
+
+#========
+sub Set {
+#========
+    my($self, $path, $arguments, $dir, $description, $show, $hotkey, 
+       $iconlocation, $iconnumber) = @_;
+    return undef unless ref($self);
+
+    $self->{'Path'}             = $path;
+    $self->{'Arguments'}        = $arguments;
+    $self->{'WorkingDirectory'} = $dir;
+    $self->{'Description'}      = $description;
+    $self->{'ShowCmd'}          = $show;
+    $self->{'Hotkey'}           = $hotkey;
+    $self->{'IconLocation'}     = $iconlocation;
+    $self->{'IconNumber'}       = $iconnumber;
+    return 1;
+}
+
+
+#=========
+sub Save {
+#=========
+    my($self, $file) = @_;
+    return undef unless ref($self);
+
+    return undef if not $file and not $self->{'File'};
+    $file = $self->{'File'} if not $file;
+
+    _SetPath($self->{'ilink'}, $self->{'ifile'}, $self->{'Path'});
+    _SetArguments($self->{'ilink'}, $self->{'ifile'}, $self->{'Arguments'});
+    _SetWorkingDirectory($self->{'ilink'}, $self->{'ifile'}, $self->{'WorkingDirectory'});
+    _SetDescription($self->{'ilink'}, $self->{'ifile'}, $self->{'Description'});
+    _SetShowCmd($self->{'ilink'}, $self->{'ifile'}, $self->{'ShowCmd'});
+    _SetHotkey($self->{'ilink'}, $self->{'ifile'}, $self->{'Hotkey'});
+    _SetIconLocation($self->{'ilink'}, $self->{'ifile'},
+                     $self->{'IconLocation'}, $self->{'IconNumber'});
+
+    my $result = _Save($self->{'ilink'}, $self->{'ifile'}, $file);
+    return $result;
+}
+
+#============
+sub Resolve {
+#============
+    my($self, $flags) = @_;
+    return undef unless ref($self);
+    $flags = 1 unless defined($flags);
+    my $result = _Resolve($self->{'ilink'}, $self->{'ifile'}, $flags);
+    return $result;
+}
+
+
+#==========
+sub Close {
+#==========
+    my($self) = @_;
+    return undef unless ref($self);
+
+    my $result = _Release($self->{'ilink'}, $self->{'ifile'});
+    $self->{'released'} = 1;
+    return $result;
+}
+
+#=========
+sub Path {
+#=========
+    my($self, $value) = @_;
+    return undef unless ref($self);
+
+    if(not defined($value)) {
+        return $self->{'Path'};
+    } else {
+        $self->{'Path'} = $value;
+    }
+    return $self->{'Path'};
+}
+
+#==============
+sub ShortPath {
+#==============
+    my($self) = @_;
+    return undef unless ref($self);
+    return $self->{'ShortPath'};
+}
+
+#==============
+sub Arguments {
+#==============
+    my($self, $value) = @_;
+    return undef unless ref($self);
+
+    if(not defined($value)) {
+        return $self->{'Arguments'};
+    } else {
+        $self->{'Arguments'} = $value;
+    }
+    return $self->{'Arguments'};
+}
+
+#=====================
+sub WorkingDirectory {
+#=====================
+    my($self, $value) = @_;
+    return undef unless ref($self);
+
+    if(not defined($value)) {
+        return $self->{'WorkingDirectory'};
+    } else {
+        $self->{'WorkingDirectory'} = $value;
+    }
+    return $self->{'WorkingDirectory'};
+}
+
+
+#================
+sub Description {
+#================
+    my($self, $value) = @_;
+    return undef unless ref($self);
+
+    if(not defined($value)) {
+        return $self->{'Description'};
+    } else {
+        $self->{'Description'} = $value;
+    }
+    return $self->{'Description'};
+}
+
+#============
+sub ShowCmd {
+#============
+    my($self, $value) = @_;
+    return undef unless ref($self);
+
+    if(not defined($value)) {
+        return $self->{'ShowCmd'};
+    } else {
+        $self->{'ShowCmd'} = $value;
+    }
+    return $self->{'ShowCmd'};
+}
+
+#===========
+sub Hotkey {
+#===========
+    my($self, $value) = @_;
+    return undef unless ref($self);
+
+    if(not defined($value)) {
+        return $self->{'Hotkey'};
+    } else {
+        $self->{'Hotkey'} = $value;
+    }
+    return $self->{'Hotkey'};
+}
+
+#=================
+sub IconLocation {
+#=================
+    my($self, $value) = @_;
+    return undef unless ref($self);
+
+    if(not defined($value)) {
+        return $self->{'IconLocation'};
+    } else {
+        $self->{'IconLocation'} = $value;
+    }
+    return $self->{'IconLocation'};
+}
+
+#===============
+sub IconNumber {
+#===============
+    my($self, $value) = @_;
+    return undef unless ref($self);
+
+    if(not defined($value)) {
+        return $self->{'IconNumber'};
+    } else {
+        $self->{'IconNumber'} = $value;
+    }
+    return $self->{'IconNumber'};
+}
+
+#============
+sub Version {
+#============
+    # [dada] to get rid of the "used only once" warning...
+    return $VERSION;
+}
+
+
+#######################################################################
+# PRIVATE METHODS
+#
+
+#============ ### CLASS DESTRUCTOR
+sub DESTROY {
+#============
+    my($self) = @_;
+
+    if(not $self->{'released'}) {
+        _Release($self->{'ilink'}, $self->{'ifile'});
+    }
+}
+
+#======== ### PACKAGE DESTRUCTOR
+sub END { 
+#========
+    # print "Exiting...\n";
+    _Exit(); 
+}
+
+#######################################################################
+# dynamically load in the Shortcut.pll module.
+#
+
+bootstrap Win32::Shortcut;
+
+# Preloaded methods go here.
+
+#Currently Autoloading is not implemented in Perl for win32
+# Autoload methods go after __END__, and are processed by the autosplit program.
+
+1;
+__END__
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/Rules.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/Rules.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/Rules.pm	(revision 24799)
@@ -0,0 +1,2084 @@
+package XML::Rules;
+
+use warnings;
+no warnings qw(uninitialized);
+use strict;
+use Carp;
+
+require Exporter;
+our @ISA = qw(Exporter);
+our @EXPORT_OK = qw(paths2rules);
+
+use XML::Parser::Expat;
+
+=head1 NAME
+
+XML::Rules - parse XML and specify what and how to keep/process for individual tags
+
+=head1 VERSION
+
+Version 1.05
+
+=cut
+
+our $VERSION = '1.05';
+
+=head1 SYNOPSIS
+
+    use XML::Rules;
+
+	$xml = <<'*END*';
+	<doc>
+	 <person>
+	  <fname>...</fname>
+	  <lname>...</lname>
+	  <email>...</email>
+	  <address>
+	   <street>...</street>
+	   <city>...</city>
+	   <country>...</country>
+	   <bogus>...</bogus>
+	  </address>
+	  <phones>
+	   <phone type="home">123-456-7890</phone>
+	   <phone type="office">663-486-7890</phone>
+	   <phone type="fax">663-486-7000</phone>
+	  </phones>
+	 </person>
+	 <person>
+	  <fname>...</fname>
+	  <lname>...</lname>
+	  <email>...</email>
+	  <address>
+	   <street>...</street>
+	   <city>...</city>
+	   <country>...</country>
+	   <bogus>...</bogus>
+	  </address>
+	  <phones>
+	   <phone type="office">663-486-7891</phone>
+	  </phones>
+	 </person>
+	</doc>
+	*END*
+
+	@rules = (
+		_default => sub {$_[0] => $_[1]->{_content}},
+			# by default I'm only interested in the content of the tag, not the attributes
+		bogus => undef,
+			# let's ignore this tag and all inner ones as well
+		address => sub {address => "$_[1]->{street}, $_[1]->{city} ($_[1]->{country})"},
+			# merge the address into a single string
+		phone => sub {$_[1]->{type} => $_[1]->{_content}},
+			# let's use the "type" attribute as the key and the content as the value
+		phones => sub {delete $_[1]->{_content}; %{$_[1]}},
+			# remove the text content and pass along the type => content from the child nodes
+		person => sub { # lets print the values, all the data is readily available in the attributes
+			print "$_[1]->{lname}, $_[1]->{fname} <$_[1]->{email}>\n";
+			print "Home phone: $_[1]->{home}\n" if $_[1]->{home};
+			print "Office phone: $_[1]->{office}\n" if $_[1]->{office};
+			print "Fax: $_[1]->{fax}\n" if $_[1]->{fax};
+			print "$_[1]->{address}\n\n";
+			return; # the <person> tag is processed, no need to remember what it contained
+		},
+	);
+	$parser = XML::Rules->new(rules => \@rules);
+	$parser->parse( $xml);
+
+=head1 INTRODUCTION
+
+There are several ways to extract data from XML. One that's often used is to read the whole file and transform it into a huge maze of objects and then write code like
+
+	foreach my $obj ($XML->forTheLifeOfMyMotherGiveMeTheFirstChildNamed("Peter")->pleaseBeSoKindAndGiveMeAllChildrenNamedSomethingLike("Jane")) {
+		my $obj2 = $obj->sorryToKeepBotheringButINeedTheChildNamed("Theophile");
+		my $birth = $obj2->whatsTheValueOfAttribute("BirthDate");
+		print "Theophile was bort at $birth\n";
+	}
+
+I'm exagerating of course, but you probably know what I mean. You can of course shorten the path and call just one method ... that is if you spend the time to learn one more "cool" thing starting with X. XPath.
+
+You can also use XML::Simple and generate an almost equaly huge maze of hashes and arrays ... which may make the code more or less complex. In either case you need to have enough memory
+to store all that data, even if you only need a piece here and there.
+
+Another way to parse the XML is to create some subroutines that handle the start and end tags and the text and whatever else may appear in the XML. Some modules will let you specify just one for start tag, one for text and one for end tag, others will let you install different handlers for different tags. The catch is that you have to build your data structures yourself, you have to know where you are, what tag is just open and what is the parent and it's parent etc. so that you could add the attributes and especially the text to the right place. And the handlers have to do everything as their side effect. Does anyone remember what do they say about side efects? They make the code hard to debug, they tend to change the code into a maze of interdependent snippets of code.
+
+So what's the difference in the way XML::Rules works? At the first glance, not much. You can also specify subroutines to be called for the tags encountered while parsing the XML, just like the other even based XML parsers. The difference is that you do not have to rely on sideeffects if all you want is to store the value of a tag. You simply return whatever you need from the current tag and the module will add it at the right place in the data structure it builds and will provide it to the handlers for the parent tag. And if the parent tag does return that data again it will be passed to its parent and so forth. Until we get to the level at which it's convenient to handle all the data we accumulated from the twig.
+
+Do we want to keep just the content and access it in the parent tag handler under a specific name?
+
+	foo => sub {return 'foo' => $_[1]->{_content}}
+
+Do we want to ornament the content a bit and add it to the parent tag's content?
+
+	u => sub {return '_' . $_[1]->{_content} . '_'}
+	strong =>  sub {return '*' . $_[1]->{_content} . '*'}
+	uc =>  sub {return uc($_[1]->{_content})}
+
+Do we want to merge the attributes into a string and access the string from the parent tag under a specified name?
+
+	address => sub {return 'Address' => "Street: $_[1]->{street} $_[1]->{bldngNo}\nCity: $_[1]->{city}\nCountry: $_[1]->{country}\nPostal code: $_[1]->{zip}"}
+
+and in this case the $_[1]->{street} may either be an attribute of the <address> tag or it may be ther result of the handler (rule)
+
+	street => sub {return 'street' => $_[1]->{_content}}
+
+and thus come from a child tag <street>. You may also use the rules to convert codes to values
+
+	our %states = (
+	  AL => 'Alabama',
+	  AK => 'Alaska',
+	  ...
+	);
+	...
+	state => sub {return 'state' => $states{$_[1]->{_content}}; }
+
+ or
+
+	address => sub {
+		if (exists $_[1]->{id}) {
+			$sthFetchAddress->execute($_[1]->{id});
+			my $addr = $sthFetchAddress->fetchrow_hashref();
+			$sthFetchAddress->finish();
+			return 'address' => $addr;
+		} else {
+			return 'address' => $_[1];
+		}
+	}
+
+so that you do not have to care whether there was
+
+	<address id="147"/>
+
+or
+
+	<address><street>Larry Wall's St.</street><streetno>478</streetno><city>Core</city><country>The Programming Republic of Perl</country></address>
+
+At each level in the tree structure serialized as XML you can decide what to keep, what to throw away, what to transform and then just return the stuff you care about and it will be available to the handler at the next level.
+
+=head1 CONSTRUCTOR
+
+	my $parser = XML::Rules->new(
+		rules => \@rules,
+		[ start_rules => \@start_rules, ]
+		[ stripspaces => 0 / 1 / 2 / 3   +   0 / 4   +   0 / 8, ]
+		[ normalisespaces => 0 / 1, ]
+		[ style => 'parser' / 'filter', ]
+		[ ident => '  ', [reformat_all => 0 / 1] ],
+		[ encode => 'encoding specification', ]
+		[ output_encoding => 'encoding specification', ]
+		[ namespaces => \%namespace2alias_mapping, ]
+		# and optionaly parameters passed to XML::Parser::Expat
+	);
+
+Options passed to XML::Parser::Expat : ProtocolEncoding Namespaces NoExpand Stream_Delimiter ErrorContext ParseParamEnt Base
+
+The "stripspaces" controls the handling of whitespace. Please see the C<Whitespace handling> bellow.
+
+The "style" specifies whether you want to build a parser used to extract stuff from the XML or filter/modify the XML. If you specify
+style => 'filter' then all tags for which you do not specify a subroutine rule or that occure inside such a tag are copied to the output filehandle
+passed to the ->filter() or ->filterfile() methods.
+
+The "ident" specifies what character(s) to use to ident the tags when filtering, by default the tags are not formatted in any way. If the
+"reformat_all" is not set then this affects only the tags that have a rule and their subtags. And in case of subtags only those that were
+added into the attribute hash by their rules, not those left in the _content array!
+
+The "warnoverwrite" instructs XML::Rules to issue a warning whenever the rule cause a key in a tag's hash to be overwritten by new
+data produced by the rule of a subtag. This happens eg. if a tag is repeated and its rule doesn't expect it.
+
+The "encode" allows you to ask the module to run all data through Encode::encode( 'encoding_specification', ...)
+before being passed to the rules. Otherwise all data comes as UTF8.
+
+The "output_encoding" on the other hand specifies in what encoding is the resulting data going to be, the default is again UTF8.
+This means that if you specify
+
+	encode => 'windows-1250',
+	output_encoding => 'utf8',
+
+and the XML is in ISO-8859-2 (Latin2) then the filter will 1) convert the content and attributes of the tags you are not interested in from Latin2
+directly to utf8 and output and 2) convert the content and attributes of the tags you want to process from Latin2 to Windows-1250, let you mangle
+the data and then convert the results to utf8 for the output.
+
+The C<encode> and C<output_enconding> affects also the C<$parser->toXML(...)>, if they are different then the data are converted from
+one encoding to the other.
+
+=head2 The Rules
+
+The rules option may be either an arrayref or a hashref, the module doesn't care, but if you want to use regexps to specify the groups of tags to be handled
+by the same rule you should use the array ref. The rules array/hash is made of pairs in form
+
+	tagspecification => action
+
+where the tagspecification may be either a name of a tag, a string containing comma or pipe ( "|" ) delimited list of tag names
+or a string containing a regexp enclosed in // with optional parameters or a qr// compiled regular expressions. The tag names and tag name lists
+take precedence to the regexps, the regexps are (in case of arrayref only!!!) tested in the order in which they are specified.
+
+These rules are evaluated/executed whenever a tag if fully parsed including all the content and child tags and they may access the content and attributes of the
+specified tag plus the stuff produced by the rules evaluated for the child tags.
+
+The action may be either
+
+	an undef or empty string = ignore the tag and all its children
+	a subroutine reference = the subroutine will be called to handle the tag data&contents
+		sub { my ($tagname, $attrHash, $contexArray, $parentDataArray, $parser) = @_; ...}
+	'content' = only the content of the tag is preserved and added to
+		the parent tag's hash as an attribute named after the tag
+		sub { $_[0] => $_[1]->{_content}}
+	'content trim' = only the content of the tag is preserved, trimmed and added to
+		the parent tag's hash as an attribute named after the tag
+		sub { s/^\s+//,s/\s+$// for ($_[1]->{_content}); $_[0] => $_[1]->{_content}}
+	'content array' = only the content of the tag is preserved and pushed
+		to the array pointed to by the attribute
+		sub { '@' . $_[0] => $_[1]->{_content}}
+	'as is' = the tag's hash is added to the parent tag's hash
+		as an attribute named after the tag
+		sub { $_[0] => $_[1]}
+	'as is trim' = the tag's hash is added to the parent tag's hash
+		as an attribute named after the tag, the content is trimmed
+		sub { $_[0] => $_[1]}
+	'as array' = the tag's hash is pushed to the attribute named after the tag
+		in the parent tag's hash
+		sub { '@'.$_[0] => $_[1]}
+	'as array trim' = the tag's hash is pushed to the attribute named after the tag
+		in the parent tag's hash, the content is trimmed
+		sub { '@'.$_[0] => $_[1]}
+	'no content' = the _content is removed from the tag's hash and the hash
+		is added to the parent's hash into the attribute named after the tag
+		sub { delete $_[1]->{_content}; $_[0] => $_[1]}
+	'no content array' = similar to 'no content' except the hash is pushed
+		into the array referenced by the attribute
+	'as array no content' = same as 'no content array'
+	'pass' = the tag's hash is dissolved into the parent's hash,
+		that is all tag's attributes become the parent's attributes.
+		The _content is appended to the parent's _content.
+		sub { %{$_[0]}}
+	'pass no content' = the _content is removed and the hash is dissolved
+		into the parent's hash.
+		sub { delete $_[1]->{_content}; %{$_[0]}}
+	'pass without content' = same as 'pass no content'
+	'raw' = the [tagname => attrs] is pushed to the parent tag's _content.
+		You would use this style if you wanted to be able to print
+		the parent tag as XML preserving the whitespace or other textual content
+		sub { [$_[0] => $_[1]]}
+	'raw extended' = the [tagname => attrs] is pushed to the parent tag's _content
+		and the attrs are added to the parent's attribute hash with ":$tagname" as the key
+		sub { (':'.$_[0] => $_[1], [$_[0] => $_[1]])};
+	'raw extended array' = the [tagname => attrs] is pushed to the parent tag's _content
+		and the attrs are pushed to the parent's attribute hash with ":$tagname" as the key
+		sub { ('@:'.$_[0] => $_[1], [$_[0] => $_[1]])};
+	'by <attrname>' = uses the value of the specified attribute as the key when adding the
+		attribute hash into the parent tag's hash. You can specify more names, in that case
+		the first found is used.
+		sub {delete($_[1]->{name}) => $_[1]}
+	'content by <attrname>' = uses the value of the specified attribute as the key when adding the
+		tags content into the parent tag's hash. You can specify more names, in that case
+		the first found is used.
+		sub {$_[1]->{name} => $_[1]->{_content}}
+	'no content by <attrname>' = uses the value of the specified attribute as the key when adding the
+		attribute hash into the parent tag's hash. The content is dropped. You can specify more names,
+		in that case the first found is used.
+		sub {delete($_[1]->{_content}); delete($_[1]->{name}) => $_[1]}
+	'==...' = replace the tag by the specified string. That is the string will be added to
+		the parent tag's _content
+		sub { return '...' }
+	'=...' = replace the tag contents by the specified string and forget the attributes.
+		sub { return $_[0] => '...' }
+
+You may also add " no xmlns" at the end of all those predefined rules to strip the namespace
+alias from the $_[0] (tag name).
+
+The subroutines in the rules specification receive five parameters:
+
+	$rule->( $tag_name, \%attrs, \@context, \@parent_data, $parser)
+
+It's OK to destroy the first two parameters, but you should treat the other three as read only
+or at least treat them with care!
+
+	$tag_name = string containing the tag name
+	\%attrs = hash containing the attributes of the tag plus the _content key
+		containing the text content of the tag. If it's not a leaf tag it may
+		also contain the data returned by the rules invoked for the child tags.
+	\@context = an array containing the names of the tags enclosing the current
+		one. The parent tag name is the last element of the array.
+	\@parent_data = an array containing the hashes with the attributes
+		and content read&produced for the enclosing tags so far.
+		You may need to access this for example to find out the version
+		of the format specified as an attribute of the root tag. You may
+		safely add, change or delete attributes in the hashes, but all bets
+		are off if you change the number or type of elements of this array!
+	$parser = the parser object.
+
+The subroutine may decide to handle the data and return nothing or
+tweak the data as necessary and return just the relevant bits. It may also
+load more information from elsewhere based on the ids found in the XML
+and provide it to the rules of the ancestor tags as if it was part of the XML.
+
+The possible return values of the subroutines are:
+
+1) nothing or undef or "" - nothing gets added to the parent tag's hash
+
+2) a single string - if the parent's _content is a string then the one produced by this rule is appended to the parent's _content.
+If the parent's _content is an array, then the string is push()ed to the array.
+
+3) a single reference - if the parent's _content is a string then it's changed to an array containing the original string and this reference.
+If the parent's _content is an array, then the string is push()ed to the array.
+
+4) an even numbered list - it's a list of key & value pairs to be added to the parent's hash.
+
+The handling of the attributes may be changed by adding '@', '%', '+', '*' or '.' before the attribute name.
+
+Without any "sigil" the key & value is added to the hash overwriting any previous values.
+
+The values for the keys starting with '@' are push()ed to the arrays referenced by the key name
+without the @. If there already is an attribute of the same name then the value will be preserved and will become
+the first element in the array.
+
+The values for the keys starting with '%' have to be either hash or array references. The key&value pairs
+in the referenced hash or array will be added to the hash referenced by the key. This is nice for rows of tags like this:
+
+  <field name="foo" value="12"/>
+  <field name="bar" value="24"/>
+
+if you specify the rule as
+
+  field => sub { '%fields' => [$_[1]->{name} => $_[1]->{value}]}
+
+then the parent tag's has will contain
+
+  fields => {
+    foo => 12,
+	bar => 24,
+  }
+
+The values for the keys starting with '+' are added to the current value, the ones starting with '.' are
+appended to the current value and the ones starting with '*' multiply the current value.
+
+5) an odd numbered list - the last element is appended or push()ed to the parent's _content, the rest is handled as in the previous case.
+
+
+Since 0.19 it's possible to specify several actions for a tag if you need to do something different based on the path to the tag like this:
+
+	tagname => [
+		'tag/path' => action,
+		'/root/tag/path' => action,
+		'/root/*/path' => action,
+		qr{^root/ns:[^/]+/par$} => action,
+		default_action
+	],
+
+The path is matched against the list of parent tags joined by slashes.
+
+=head2 The Start Rules
+
+Apart from the normal rules that get invoked once the tag is fully parsed, including the contents and child tags, you may want to
+attach some code to the start tag to (optionaly) skip whole branches of XML or set up attributes and variables. You may set up
+the start rules either in a separate parameter to the constructor or in the rules=> by prepending the tag name(s) by ^.
+
+These rules are in form
+
+	tagspecification => undef / '' / 'skip'	--> skip the element, including child tags
+	tagspecification => 1 / 'handle'	--> handle the element, may be needed
+		if you specify the _default rule.
+	tagspecification => \&subroutine
+
+The subroutines receive the same parameters as for the "end tag" rules except of course the _content, but their return value is treated differently.
+If the subroutine returns a false value then the whole branch enclosed by the current tag is skipped, no data are stored and no rules are
+executed. You may modify the hash referenced by $attr.
+
+Both types of rules are free to store any data they want in $parser->{pad}. This property is NOT emptied
+after the parsing!
+
+=head2 Whitespace handling
+
+There are two options that affect the whitespace handling: stripspaces and normalisespaces. The normalisespaces is a simple flag that controls
+whether multiple spaces/tabs/newlines are collapsed into a single space or not. The stripspaces is more complex, it's a bit-mask,
+an ORed combination of the following options:
+
+	0 - don't remove whitespace around tags
+	    (around tags means before the opening tag and after the closing tag, not in the tag's content!)
+	1 - remove whitespace before tags whose rules did not return any text content
+	    (the rule specified for the tag caused the data of the tag to be ignored,
+		processed them already or added them as attributes to parent's \%attr)
+	2 - remove whitespace around tags whose rules did not return any text content
+	3 - remove whitespace around all tags
+
+	0 - remove only whitespace-only content
+	    (that is remove the whitespace around <foo/> in this case "<bar>   <foo/>   </bar>"
+		but not this one "<bar>blah   <foo/>  blah</bar>")
+	4 - remove trailing/leading whitespace
+	    (remove the whitespace in both cases above)
+
+	0 - don't trim content
+	8 - do trim content
+		(That is for "<foo>  blah   </foo>" only pass to the rule {_content => 'blah'})
+
+
+That is if you have a data oriented XML in which each tag contains either text content or subtags, but not both,
+you want to use stripspaces => 3 or stripspaces => 3|4. This will not only make sure you don't need to bother
+with the whitespace-only _content of the tags with subtags, but will also make sure you do not keep on wasting
+memory while parsing a huge XML and processing the "twigs". Without that option the parent tag of
+the repeated tag would keep on accumulating unneeded whitespace in its _content.
+
+=cut
+
+sub new {
+	my $class = shift;
+	my %params = @_;
+	croak "Please specify the rules=> for the parser!" unless $params{rules} and ref($params{rules});
+
+	my $self = {rules => {}, start_rules => {}};
+	bless $self, $class;
+
+	my @rules = (ref($params{rules}) eq 'HASH' ? %{$params{rules}} : @{$params{rules}}); # dereference and copy
+	delete $params{rules};
+
+	my @start_rules;
+	if ($params{start_rules} and ref($params{start_rules})) {
+		@start_rules = ref($params{start_rules}) eq 'HASH' ? %{$params{start_rules}} : @{$params{start_rules}}; # dereference and copy
+	};
+	delete $params{start_rules};
+
+	for (my $i=0; $i <= $#rules; $i+=2) {
+		next unless $rules[$i] =~ s/^\^//;
+		push @start_rules, splice( @rules, $i, 2);
+		$i-=2;
+	}
+
+	$self->_split_rules( \@rules, 'rules', 'as is');
+	$self->_split_rules( \@start_rules, 'start_rules', 'handle');
+
+	$self->{for_parser} = {};
+	{ # extract the params for the XML::Parser::Expat constructor
+		my @for_parser = grep exists($params{$_}), qw(ProtocolEncoding Namespaces NoExpand Stream_Delimiter ErrorContext ParseParamEnt Base);
+		if (@for_parser) {
+			@{$self->{for_parser}}{@for_parser} = @params{@for_parser};
+			delete @params{@for_parser};
+		}
+	}
+
+	$self->{namespaces} = delete($params{namespaces});
+	if (defined($self->{namespaces})) {
+		croak 'XML::Rules->new( ... , namespaces => ...HERE...) must be a hash reference!'
+			unless ref($self->{namespaces}) eq 'HASH';
+		$self->{xmlns_map} = {};
+	}
+
+	$self->{style} = delete($params{style}) || 'parser';
+
+	$self->{opt}{lc $_} = $params{$_} for keys %params;
+
+	delete $self->{opt}{encode} if $self->{opt}{encode} =~ /^utf-?8$/i;
+	delete $self->{opt}{output_encoding} if $self->{opt}{output_encoding} =~ /^utf-?8$/i;
+
+	for (qw(normalisespace normalizespace normalizespaces)) {
+		last if defined($self->{opt}{normalisespaces});
+		$self->{opt}{normalisespaces} = $self->{opt}{$_};
+		delete $self->{opt}{$_};
+	}
+	$self->{opt}{normalisespaces} = 0 unless(defined($self->{opt}{normalisespaces}));
+	$self->{opt}{stripspaces} = 0 unless(defined($self->{opt}{stripspaces}));
+
+	require 'Encode.pm' if $self->{opt}{encode};
+	require 'Encode.pm' if $self->{opt}{output_encoding};
+
+	return $self;
+}
+
+sub _split_rules {
+	my ($self, $rules, $type, $default) = @_;
+
+	$self->{$type}{_default} = $default unless exists($self->{$type}{_default});
+
+	while (@$rules) {
+		my ($tag, $code) = (shift(@$rules), shift(@$rules));
+
+		if (ref($code) eq 'ARRAY') {
+			for( my $i = 0; $i < $#$code; $i+=2) {
+				$code->[$i] = _xpath2re($code->[$i]);
+			}
+			push @$code, $self->{$type}{_default} if @$code % 2 == 0; # add the default type if there's even number of items (path => code, path => code)
+		}
+
+		if ($tag =~ m{^/([^/].*)/([imosx]*)$}) { # string with a '/regexp/'
+			if ($2) {
+				push @{$self->{$type.'_re'}}, qr/(?$2)$1/;
+			} else {
+				push @{$self->{$type.'_re'}}, qr/$1/;
+			}
+			push @{$self->{$type.'_re_code'}}, $code;
+		} elsif (ref($tag) eq 'Regexp') { # a qr// created regexp
+			push @{$self->{$type.'_re'}}, $tag;
+			push @{$self->{$type.'_re_code'}}, $code;
+		} elsif ($tag =~ /[,\|]/) { # a , or | separated list
+			if ($tag =~ s/^\^//) {
+				my @tags = split(/\s*[,\|]\s*/, $tag);
+				$self->{$type}{'^'.$_} = $code for (@tags);
+			} else {
+				my @tags = split(/\s*[,\|]\s*/, $tag);
+				$self->{$type}{$_} = $code for (@tags);
+			}
+		} else { # a single tag
+			$self->{$type}{$tag} = $code;
+		}
+	}
+}
+
+sub _xpath2re {
+	my $s = shift;
+	return $s if ref($s);
+	for ($s) {
+		s/([\.\[\]+{}\-])/\\$1/g;
+		s{\*}{.+}g;
+		s{^//}{}s;
+		s{^/}{^}s;
+	}
+	return qr{$s$};
+}
+
+sub skip_rest {
+	die "[XML::Rules] skip rest\n";
+}
+
+sub return_nothing {
+	die "[XML::Rules] return nothing\n";
+}
+
+sub _run {
+	my $self = shift;
+	my $string = shift;
+	$self->{parameters} = shift;
+
+	$self->{parser} = XML::Parser::Expat->new( %{$self->{for_parser}});
+
+	$self->{parser}->setHandlers(
+		Start => _Start($self),
+		End => _End($self),
+		Char => _Char($self),
+		XMLDecl => _XMLDecl($self),
+	);
+
+	$self->{data} = [];
+	$self->{context} = [];
+	$self->{_ltrim} = [0];
+
+	if (! eval {
+		$self->{parser}->parse($string) and 1;
+	}) {
+		my $err = $@;
+		undef $@;
+
+		if ($err =~ /^\[XML::Rules\] skip rest/) {
+			my (undef, $handler) = $self->{parser}->setHandlers(End => undef);
+			foreach my $tag (reverse @{$self->{context} = []}) {
+				$handler->( $self->{parser}, $tag);
+			}
+		} else {
+
+			delete $self->{normal_handlers};
+			delete $self->{ignore_handlers};
+			delete $self->{parameters};
+			$self->{parser}->release();
+
+			$self->{data} = [];
+			$self->{context} = [];
+
+			if ($err =~ /^\[XML::Rules\] return nothing/) {
+				return;
+			}
+
+			$err =~ s/at \S+Rules\.pm line \d+$//
+				and croak $err or die $err;
+		}
+	};
+
+	delete $self->{normal_handlers};
+	delete $self->{ignore_handlers};
+	$self->{parser}->release();
+
+	delete $self->{parameters};
+	my $data; # return the accumulated data, without keeping a copy inside the object
+	($data, $self->{data}) = ($self->{data}[0], undef);
+	if (!defined(wantarray()) or ! keys(%$data)) {
+		return;
+
+	} elsif (keys(%$data) == 1 and exists(${$data}{_content})) {
+		if (ref(${$data}{_content}) eq 'ARRAY' and @{${$data}{_content}} == 1) {
+			return ${${$data}{_content}}[0]
+		} else {
+			return ${$data}{_content}
+		}
+
+	} else {
+		return $data;
+	}
+}
+
+
+sub parsestring;
+*parsestring = \&parse;
+sub parse {
+	my $self = shift;
+	croak("This XML::Rules object may only be used as a filter!") if ($self->{style} eq 'filter');
+	$self->_run(@_);
+}
+
+sub parsefile {
+	my $self = shift;
+	croak("This XML::Rules object may only be used as a filter!") if ($self->{style} eq 'filter');
+	my $filename = shift;
+	open my $IN, '<', $filename or croak "Cannot open '$filename' for reading: $^E";
+	return $self->_run($IN, @_);
+}
+
+
+sub filterstring;
+*filterstring = \&filter;
+sub filter {
+	my $self = shift;
+	croak("This XML::Rules object may only be used as a parser!") unless ($self->{style} eq 'filter');
+
+	my $XML = shift;
+	$self->{FH} = shift || select(); # either passed or the selected filehandle
+	if (!ref($self->{FH})) {
+		if ($self->{FH} =~ /^main::(?:STDOUT|STDERR)$/) {
+			# yeah, select sometimes returns the name of the filehandle, not the filehandle itself. eg. "main::STDOUT"
+			no strict;
+			$self->{FH} = \*{$self->{FH}};
+		} else {
+			open my $FH, '>', $self->{FH} or croak(qq{Failed to open "$self->{FH}" for writing: $^E});
+			$self->{FH} = $FH;
+		}
+	} elsif (ref($self->{FH}) eq 'SCALAR') {
+		open my $FH, '>', $self->{FH};
+		$self->{FH} = $FH;
+	}
+	if ($self->{opt}{output_encoding}) {
+		print {$self->{FH}} qq{<?xml version="1.0" encoding="$self->{opt}{output_encoding}"?>\n};
+	} else {
+		print {$self->{FH}} qq{<?xml version="1.0"?>\n};
+	}
+	$self->_run($XML, @_);
+	print {$self->{FH}} "\n";
+	delete $self->{FH};
+}
+
+sub filterfile {
+	my $self = shift;
+	croak("This XML::Rules object may only be used as a parser!") unless ($self->{style} eq 'filter');
+
+	my $filename = shift;
+	open my $IN, '<', $filename or croak "Cannot open '$filename' for reading: $^E";
+
+	$self->{FH} = shift || select(); # either passed or the selected filehandle
+	if (!ref($self->{FH})) {
+		if ($self->{FH} =~ /^main::(?:STDOUT|STDERR)$/) {
+			# yeah, select sometimes returns the name of the filehandle, not the filehandle itself. eg. "main::STDOUT"
+			no strict;
+			$self->{FH} = \*{$self->{FH}};
+		} else {
+			open my $FH, '>', $self->{FH} or croak(qq{Failed to open "$self->{FH}" for writing: $^E});
+			$self->{FH} = $FH;
+		}
+	} elsif (ref($self->{FH}) eq 'SCALAR') {
+		open $self->{FH}, '>', $self->{FH};
+	}
+	if ($self->{opt}{output_encoding}) {
+		print {$self->{FH}} qq{<?xml version="1.0" encoding="$self->{opt}{output_encoding}"?>\n};
+	} else {
+		print {$self->{FH}} qq{<?xml version="1.0"?>\n};
+	}
+	$self->_run($IN, @_);
+	print {$self->{FH}} "\n";
+	delete $self->{FH};
+}
+
+sub _XMLDecl {
+	my $self = shift;
+	return sub {
+		my ( $Parser, $Version, $Encoding, $Standalone) = @_;
+		$self->{opt}{original_encoding} = $Encoding
+	}
+}
+
+=begin comment
+
+start tag
+	& 3 = 3 -> rtrim parent's _content
+	& 8 = 8 -> $ltrim = 1
+
+string content
+	$ltrim -> ltrim the string, if not completely whitespace set $ltrim  0
+
+end tag
+	& 8 = 8 -> rtrim own content
+	& 3 = 3 -> $ltrim = 1
+	empty_returned_content and & 3 in (1,2) -> rtrim parent content
+	empty_returned_content and & 3  = 2 -> $ltrim
+
+=end comment
+
+=cut
+
+sub _rtrim {
+	my ($self, $attr, $more) = @_;
+
+	if ($more) {
+		if (ref $attr->{_content}) {
+			if (!ref($attr->{_content}[-1])) {
+				$attr->{_content}[-1] =~ s/\s+$//s;
+				pop @{$attr->{_content}} if $attr->{_content}[-1] eq '';
+				delete $attr->{_content} unless @{$attr->{_content}};
+			}
+		} else {
+			$attr->{_content} =~ s/\s+$//s;
+			delete $attr->{_content} if $attr->{_content} eq '';
+		}
+	} else {
+		if (ref $attr->{_content}) {
+			if (!ref($attr->{_content}[-1]) and $attr->{_content}[-1] =~ /^\s*$/s) {
+				pop @{$attr->{_content}} ;
+				delete $attr->{_content} unless @{$attr->{_content}};
+			}
+		} else {
+			delete $attr->{_content} if $attr->{_content}  =~ /^\s*$/s;
+		}
+	}
+}
+
+sub _Start {
+	my $self = shift;
+	my $encode = $self->{opt}{encode};
+	my $output_encoding = $self->{opt}{output_encoding};
+	return sub {
+		my ( $Parser, $Element , %Attr) = @_;
+
+		if (($self->{opt}{stripspaces} & 3) == 3) {
+			#rtrim parent
+#print "rtrim parent content in _Start\n";
+			if ($self->{data}[-1] and $self->{data}[-1]{_content}) {
+				$self->_rtrim( $self->{data}[-1], ($self->{opt}{stripspaces} & 4));
+			}
+		}
+		if ($self->{opt}{stripspaces} & 8) {
+#print "ltrim own content in _Start\n";
+			push @{$self->{_ltrim}}, 2;
+		} else {
+			push @{$self->{_ltrim}}, 0;
+		}
+
+		if ($self->{namespaces}) {
+			my %restore;
+			if (exists $Attr{xmlns}) { # find the default namespace
+#print "Found a xmlns attribute in $Element!\n";
+				$restore{''} = $self->{xmlns_map}{''};
+				if (!exists($self->{namespaces}{ $Attr{xmlns} })) {
+					warn qq{Unexpected namespace "$Attr{xmlns}" found in the XML!\n} unless exists $self->{namespaces}{'*'};
+					delete $self->{xmlns_map}{''};
+					delete $restore{''} unless defined($restore{''});
+					delete($Attr{xmlns});
+				} else {
+					$self->{xmlns_map}{''} = $self->{namespaces}{ delete($Attr{xmlns}) };
+				}
+			}
+			foreach my $attr (keys %Attr) { # find the namespace aliases
+				next unless $attr =~ /^xmlns:(.*)$/;
+				$restore{$1} = $self->{xmlns_map}{$1};
+				if (!exists($self->{namespaces}{ $Attr{$attr} })) {
+					warn qq{Unexpected namespace "$Attr{$attr}" found in the XML!\n} unless exists $self->{namespaces}{'*'};
+					delete $self->{xmlns_map}{$1};
+					delete $restore{$1} unless defined($restore{$1});
+					delete($Attr{$attr});
+				} else {
+					$self->{xmlns_map}{$1} = $self->{namespaces}{ delete($Attr{$attr}) };
+				}
+			}
+			if (%restore) {
+				push @{$self->{xmlns_restore}}, \%restore;
+			} else {
+				push @{$self->{xmlns_restore}}, undef;
+			}
+
+			if (%{$self->{xmlns_map}}) {
+#print "About to map aliases for $Element\n";
+				# add or map the alias for the tag
+				if ($Element =~ /^([^:]+):(.*)$/) {
+#print "Mapping an alias $1 for tag $Element\n";
+					if (exists($self->{xmlns_map}{$1})) {
+						if ($self->{xmlns_map}{$1} eq '') {
+							$Element = $2 ;
+						} else {
+							$Element = $self->{xmlns_map}{$1} . ':' . $2 ;
+						}
+					}
+#print " -> $Element\n";
+				} elsif (defined($self->{xmlns_map}{''}) and $self->{xmlns_map}{''} ne '') { # no namespace alias in the tag and there's a default
+#print "Adding default alias $self->{xmlns_map}{''}:\n";
+					$Element = $self->{xmlns_map}{''} . ':' . $Element;
+#print " -> $Element\n";
+				}
+
+				# map the aliases for the attributes
+				foreach my $attr (keys %Attr) {
+					next unless $attr =~ /^([^:]+):(.*)$/; # there's an alias
+					next unless exists($self->{xmlns_map}{$1}); # and there's a mapping
+					if ($self->{xmlns_map}{$1} eq '') {
+						$Attr{$2} = delete($Attr{$attr}); # rename the attribute
+					} else {
+						$Attr{$self->{xmlns_map}{$1} . ':' . $2} = delete($Attr{$attr}); # rename the attribute
+					}
+				}
+			}
+		} # /of namespace handling
+
+
+		my ( $start_rule, $end_rule) = map {
+			if ($self->{$_}{$Element} and ref($self->{$_}{$Element}) ne 'ARRAY') {
+				$self->{$_}{$Element}
+			} else {
+				$self->_find_rule( $_, $Element, $self->{context})
+			}
+		} ( 'start_rules', 'rules');
+
+		if ($start_rule ne 'handle'
+		and (
+			!$start_rule
+			or $start_rule eq 'skip'
+			or !$start_rule->($Element,\%Attr, $self->{context}, $self->{data}, $self)
+			)
+		) {
+			# ignore the tag and the ones below
+			if (exists $self->{ignore_handlers}) {
+#print "SETHANDLERS!\n";
+				$Parser->setHandlers(@{$self->{ignore_handlers}})
+			} else {
+				$self->{ignore_handlers} = [
+					Start => _StartIgnore($self),
+					Char => undef,
+					End => _EndIgnore($self),
+				];
+#print "SETHANDLERS2\n";
+				$self->{normal_handlers} = [$Parser->setHandlers(@{$self->{ignore_handlers}})];
+			}
+			$self->{ignore_level}=1;
+
+		} else {
+			# process the tag and the ones below
+			if ($encode) {
+				foreach my $value (values %Attr) {
+					$value = Encode::encode( $encode, $value);
+				}
+			}
+
+			push @{$self->{context}}, $Element;
+			push @{$self->{data}}, \%Attr;
+			$self->{lastempty} = 0;
+
+			if ($self->{style} eq 'filter') {
+				$self->{in_interesting}++ if ref($end_rule) or $end_rule =~ /^=/s; # is this tag interesting?
+
+				if (! $self->{in_interesting}) { # it neither this tag not an acestor is interesting, just copy the tag
+#print "Start:R ".$Parser->recognized_string()."\n";
+#print "Start:O ".$Parser->original_string()."\n";
+#print "Start:R ".$Parser->recognized_string()."\n";
+#print "Start:O ".$Parser->original_string()."\n";
+					if (! $output_encoding) {
+						print {$self->{FH}} $Parser->recognized_string();
+					} elsif ($output_encoding eq $self->{opt}{original_encoding}) {
+						print {$self->{FH}} $Parser->original_string();
+					} else {
+						print {$self->{FH}} $self->toXML($Element, \%Attr, "don't close");
+					}
+				}
+			}
+
+		}
+	}
+}
+
+sub _find_rule {
+	my ($self, $type, $Element, $path) = @_;
+
+	if (exists($self->{$type.'_re'})) {
+		for(my $i = 0; $i < @{$self->{$type.'_re'}}; $i++) {
+			if ($Element =~ $self->{$type.'_re'}[$i]) {
+				$self->{$type}{$Element} = $self->{$type.'_re_code'}[$i];
+				last;
+			}
+		}
+	}
+	if (! exists $self->{$type}{$Element}) {
+		$self->{$type}{$Element} = $self->{$type}{_default};
+	}
+
+	if (ref $self->{$type}{$Element} eq 'ARRAY') {
+		$path = join( '/', @$path);
+		for(my $i=0; $i < $#{$self->{$type}{$Element}}; $i+=2) {
+			if ($path =~ $self->{$type}{$Element}[$i]) {
+				return $self->{$type}{$Element}[$i+1];
+			}
+		}
+		return $self->{$type}{$Element}[-1];
+	} else {
+		return $self->{$type}{$Element};
+	}
+}
+
+sub _Char {
+	my $self = shift;
+	my $encode = $self->{opt}{encode};
+	return sub {
+		my ( $Parser, $String) = @_;
+
+		if ($self->{style} eq 'filter' and ! $self->{in_interesting}) {
+			if (! $self->{opt}{output_encoding}) {
+				print {$self->{FH}} $Parser->recognized_string();
+			} elsif ($self->{opt}{output_encoding} eq $self->{opt}{original_encoding}) {
+				print {$self->{FH}} $Parser->original_string();
+			} else {
+				print {$self->{FH}} encode($self->{opt}{output_encoding}, $Parser->recognized_string());
+			}
+			return;
+		}
+
+		if ($encode) {
+			$String = Encode::encode( $encode, $String);
+		}
+
+		if ($self->{_ltrim}[-1]) {
+#print "ltrim in $self->{context}[-1] ($String)\n";
+			if ($self->{_ltrim}[-1] == 2) {
+				$String =~ s/^\s+//s;
+				return if $String eq '';
+			} else {
+				return if $String =~ /^\s*$/s;
+			}
+			$self->{_ltrim}[-1] = 0;
+#print "  ($String)\n";
+		}
+		$String =~ s/\s+/ /gs if ($self->{opt}{normalisespaces});
+
+		if (!exists $self->{data}[-1]{_content}) {
+			$self->{data}[-1]{_content} = $String;
+		} elsif (!ref $self->{data}[-1]{_content}) {
+			if ($self->{opt}{normalisespaces} and $self->{data}[-1]{_content} =~ /\s$/ and $String =~ /^\s/) {
+				$String =~ s/^\s+//s;
+			}
+			$self->{data}[-1]{_content} .= $String;
+		} else {
+			if (ref $self->{data}[-1]{_content}[-1]) {
+				push @{$self->{data}[-1]{_content}}, $String;
+			} else {
+				if ($self->{opt}{normalisespaces} and $self->{data}[-1]{_content}[-1] =~ /\s$/ and $String =~ /^\s/) {
+					$String =~ s/^\s+//s;
+				}
+				$self->{data}[-1]{_content}[-1] .= $String;
+			}
+		}
+	}
+}
+
+sub _End {
+	my $self = shift;
+	return sub {
+		my ( $Parser, $Element) = @_;
+		$Element = pop @{$self->{context}}; # the element name may have been mangled by XMLNS aliasing
+
+		if ($self->{opt}{stripspaces} & 8) {
+#print "rtrim own content\n";
+			if ($self->{data}[-1] and $self->{data}[-1]{_content}) {
+				$self->_rtrim( $self->{data}[-1], 1);
+			}
+		}
+		pop(@{$self->{_ltrim}});
+
+		if ($self->{namespaces}) {
+			if (my $restore = pop @{$self->{xmlns_restore}}) { # restore the old default namespace and/or alias mapping
+				while (my ($their, $our)  = each %$restore) {
+					if (defined($our)) {
+						$self->{xmlns_map}{$their} = $our;
+					} else {
+						delete $self->{xmlns_map}{$their};
+					}
+				}
+			}
+		}
+
+		my ($rule) = map {
+			if ($self->{$_}{$Element} and ref($self->{$_}{$Element}) ne 'ARRAY') {
+				$self->{$_}{$Element}
+			} else {
+				$self->_find_rule( $_, $Element, $self->{context})
+			}
+		} ('rules');
+
+		my $data = pop @{$self->{data}};
+
+		my @results;
+		if (ref $rule or $rule =~ /^=/s) {
+			if ($rule =~ /^==(.*)$/s) { # change the whole tag to a string
+				@results = ($1);
+			} elsif ($rule =~ /^=(.*)$/s) { # change the contents to a string
+				@results = ($Element => $1);
+			} else {
+				@results = $rule->($Element, $data, $self->{context}, $self->{data}, $self);
+			}
+
+			if ($self->{style} eq 'filter') {
+
+				$self->{in_interesting}--;
+				if (!$self->{in_interesting}) {
+					if (@{$self->{data}}) {
+						print {$self->{FH}} $self->escape_value($self->{data}[-1]{_content});
+						delete $self->{data}[-1]{_content};
+					}
+					my $base;
+					if ($self->{opt}{ident} ne '') {
+						$base = $self->{opt}{ident} x scalar(@{$self->{context}});
+					}
+					@results and $results[0] =~ s/^[\@%\+\*\.]//;
+					while (@results) {
+#use Data::Dumper;
+#print "\@results=".Dumper(\@results)."\n";
+						if (ref($results[0])) {
+							croak(ref($results[0]) . " not supported as the return value of a filter") unless ref($results[0]) eq 'ARRAY';
+							if (@{$results[0]} ==2 and ref($results[0][1]) eq 'HASH') {
+								print {$self->{FH}} $self->toXML(@{$results[0]}[0,1], 0, $self->{opt}{ident}, $base);
+							} else {
+								foreach my $item (@{$results[0]}) {
+									if (ref($item)) {
+										croak(ref($item) . " not supported in the return value of a filter") unless ref($item) eq 'ARRAY';
+										croak("Empty array not supported in the return value of a filter") unless @$item;
+										if (@$item <= 2) {
+											print {$self->{FH}} $self->toXML(@{$item}[0,1], 0, $self->{opt}{ident}, $base);
+										} else { # we suppose the 3rd and following elements are parameters to ->toXML()
+											print {$self->{FH}} $self->toXML(@$item);
+										}
+									} else {
+										print {$self->{FH}} $self->escape_value($item);
+									}
+								}
+							}
+							shift(@results);
+						} else {
+							if (@results == 1) {
+								print {$self->{FH}} $self->escape_value($results[0]);
+								@results = ();last;
+							} else {
+								print {$self->{FH}} $self->toXML(shift(@results), shift(@results), 0, $self->{opt}{ident}, $base);
+							}
+						}
+					}
+				}
+			}
+		} elsif ($self->{style} eq 'filter' and ! $self->{in_interesting}) {
+#print "End: \$Element=$Element; \$Parser->recognized_string()=".$Parser->recognized_string()."; \$Parser->original_string()=".$Parser->original_string()."\n";
+die "Unexpected \$data->{content}={$data->{_content}} in filter outside interesting nodes!\n" if $data->{_content} ne '';
+				if (! $self->{opt}{output_encoding}) {
+					print {$self->{FH}} $Parser->recognized_string();
+				} elsif ($self->{opt}{output_encoding} eq $self->{opt}{original_encoding}) {
+					print {$self->{FH}} $Parser->original_string();
+				} else {
+					print {$self->{FH}} encode($self->{opt}{output_encoding}, $Parser->recognized_string());
+				}
+#			print {$self->{FH}} $self->escape_value($data->{_content})."</$Element>";
+
+		} else { # a predefined rule
+
+			if ($rule =~ s/(?:^| )no xmlns$//) {
+				$Element =~ s/^\w+://;
+				$rule = 'as_is' if $rule eq '';
+			}
+
+			if ($rule eq '') {
+				@results = ();
+			} elsif ($rule eq 'content') {
+				@results = ($Element => $data->{_content});
+			} elsif ($rule eq 'content trim') {
+				s/^\s+//,s/\s+$// for ($data->{_content});
+				@results = ($Element => $data->{_content});
+			} elsif ($rule eq 'content array') {
+				@results = ('@'.$Element => $data->{_content});
+			} elsif ($rule eq 'as is') {
+				@results = ($Element => $data);
+			} elsif ($rule eq 'as is trim') {
+				s/^\s+//,s/\s+$// for ($data->{_content});
+				@results = ($Element => $data);
+			} elsif ($rule eq 'as array') {
+				@results = ('@'.$Element => $data);
+			} elsif ($rule eq 'as array trim') {
+				s/^\s+//,s/\s+$// for ($data->{_content});
+				@results = ('@'.$Element => $data);
+			} elsif ($rule eq 'no content') {
+				delete ${$data}{_content}; @results = ($Element => $data);
+			} elsif ($rule eq 'no content array' or $rule eq 'as array no content') {
+				delete ${$data}{_content}; @results = ('@' . $Element => $data);
+
+			} elsif ($rule eq 'pass') {
+				@results = (%$data);
+			} elsif ($rule eq 'pass trim') {
+				s/^\s+//,s/\s+$// for ($data->{_content});
+				@results = (%$data);
+			} elsif ($rule eq 'pass no content' or $rule eq 'pass without content') {
+				delete ${$data}{_content}; @results = (%$data);
+
+			} elsif ($rule eq 'raw') {
+				@results = [$Element => $data];
+
+			} elsif ($rule eq 'raw extended') {
+				@results = (':'.$Element => $data, [$Element => $data]);
+
+			} elsif ($rule eq 'raw extended array') {
+				@results = ('@:'.$Element => $data, [$Element => $data]);
+
+			} elsif ($rule =~ /^((?:no )?content )?by\s+(\S+)$/) {
+				my ($cnt,$attr) = ($1,$2);
+				if ($cnt eq 'no content ') {
+					delete $data->{_content};
+				}
+				if ($attr =~ /,/) {
+					my @attr = split /,/, $attr;
+					foreach (@attr) {
+						next unless exists ($data->{$_});
+						if ($cnt eq 'content ') {
+							@results = ($data->{$_} => $data->{_content})
+						} else {
+							@results = (delete $data->{$_} => $data)
+						}
+						last;
+					}
+				} else {
+					if ($cnt eq 'content ') {
+						@results = ($data->{$attr} => $data->{_content})
+					} else {
+						@results = (delete $data->{$attr} => $data);
+					}
+				}
+
+			} else {
+				croak "Unknown predefined rule '$rule'!";
+			}
+		}
+
+		if (! @results or (@results % 2 == 0) or $results[-1] eq '') {
+			if ($self->{opt}{stripspaces} & 3 and @{$self->{data}} and $self->{data}[-1]{_content}) { # stripping some spaces, it's not root and it did not return content
+#print "maybe stripping some spaces in $Element, it's not root and it did not return content\n";
+				if (($self->{opt}{stripspaces} & 3) < 3 and $self->{data}[-1]{_content}) {
+					# rtrim parent content
+#print "  yes, rtrim parent '$self->{data}[-1]{_content}'\n";
+					$self->_rtrim( $self->{data}[-1], ($self->{opt}{stripspaces} & 4));
+#print "  result '$self->{data}[-1]{_content}'\n";
+				}
+
+				$self->{_ltrim}[-1] = (($self->{opt}{stripspaces} & 4) ? 2 : 1)
+					if ($self->{opt}{stripspaces} & 3) == 2;
+			}
+		} else {
+			$self->{_ltrim}[-1] = 0;
+		}
+		if (($self->{opt}{stripspaces} & 3) == 3) {
+			$self->{_ltrim}[-1] = (($self->{opt}{stripspaces} & 4) ? 2 : 1);
+		}
+
+
+		return unless scalar(@results) or scalar(@results) == 1 and ($results[0] eq '' or !defined($results[0]));
+
+		@{$self->{data}} = ({}) unless @{$self->{data}}; # oops we are already closing the root tag! We do need there to be at least one hashref in $self->{data}
+
+		if (scalar(@results) % 2) {
+			# odd number of items, last is content
+			my $value = pop(@results);
+			_add_content( $self->{data}[-1], $value);
+		}
+
+		while (@results) {
+			my ($key, $value) = ( shift(@results), shift(@results));
+			if ($key eq '_content') {
+				_add_content( $self->{data}[-1], $value);
+			} elsif ($key =~ s/^\@//) {
+				if (exists($self->{data}[-1]{$key}) and ref($self->{data}[-1]{$key}) ne 'ARRAY') {
+					$self->{data}[-1]{$key} = [$self->{data}[-1]{$key}, $value];
+				} else {
+					push @{$self->{data}[-1]{$key}}, $value;
+				}
+			} elsif ($key =~ s/^\+//) {
+				if (exists($self->{data}[-1]{$key})) {
+					$self->{data}[-1]{$key} += $value;
+				} else {
+					$self->{data}[-1]{$key} = $value;
+				}
+			} elsif ($key =~ s/^\*//) {
+				if (exists($self->{data}[-1]{$key})) {
+					$self->{data}[-1]{$key} *= $value;
+				} else {
+					$self->{data}[-1]{$key} = $value;
+				}
+			} elsif ($key =~ s/^\.//) {
+				if (exists($self->{data}[-1]{$key})) {
+					$self->{data}[-1]{$key} .= $value;
+				} else {
+					$self->{data}[-1]{$key} = $value;
+				}
+			} elsif ($key =~ s/^\%//) {
+				if (exists($self->{data}[-1]{$key})) {
+					if (ref($value) eq 'HASH') {
+						%{$self->{data}[-1]{$key}} = (%{$self->{data}[-1]{$key}}, %$value);
+					} elsif (ref($value) eq 'ARRAY') {
+						%{$self->{data}[-1]{$key}} = (%{$self->{data}[-1]{$key}}, @$value);
+					} else {
+						croak "The value of the rule return \%$key must be a hash or array ref!";
+					}
+				} else {
+					if (ref($value) eq 'HASH') {
+						$self->{data}[-1]{$key} = $value;
+					} elsif (ref($value) eq 'ARRAY') {
+						$self->{data}[-1]{$key} = {@$value};
+					} else {
+						croak "The value of the rule return \%$key must be a hash or array ref!";
+					}
+				}
+			} else {
+				warn "The attribute '$key' already exists for tag $self->{context}[-1].\n  old value: $self->{data}[-1]{$key}\n  new value: $value\n"
+					if ($self->{opt}{warnoverwrite} and exists $self->{data}[-1]{$key} and $self->{data}[-1]{$key} ne $value);
+				$self->{data}[-1]{$key} = $value;
+			}
+		}
+	}
+}
+
+sub _StartIgnore {
+	my ($self) = shift;
+	return sub {
+		$self->{ignore_level}++
+	}
+}
+
+sub _EndIgnore {
+	my ($self) = shift;
+	return sub {
+		return if --$self->{ignore_level};
+
+		$self->{parser}->setHandlers(@{$self->{normal_handlers}})
+	}
+}
+
+sub _add_content {
+	my ($hash, $value) = @_;
+	if (ref($value)) {
+		if (ref($hash->{_content})) {
+			# both are refs, push to @_content
+			push @{$hash->{_content}}, $value;
+		} elsif (exists($hash->{_content})) {
+			# result is ref, _content is not -> convert to an arrayref containing old _content and result
+			$hash->{_content} = [ $hash->{_content}, $value]
+		} else {
+			# result is ref, _content is not present
+			$hash->{_content} = [ $value]
+		}
+	} else {
+		if (ref($hash->{_content})) {
+			# _content is an arrayref, value is a string
+			if (ref $hash->{_content}[-1]) {
+				# the last element is a ref -> push
+				push @{$hash->{_content}}, $value;
+			} else {
+				# the last element is a string -> concatenate
+				$hash->{_content}[-1] .= $value;
+			}
+		} else {
+			# neither is ref, concatenate
+			$hash->{_content} .= $value;
+		}
+	}
+}
+
+=head1 METHODS
+
+=head2 parse
+
+	$parser->parse( $string [, $parameters]);
+	$parser->parse( $IOhandle [, $parameters]);
+
+Parses the XML in the string or reads and parses the XML from the opened IO handle,
+executes the rules as it encounters the closing tags and returns the resulting structure.
+
+The scalar or reference passed as the second parameter to the parse() method is assigned to
+$parser->{parameters} for the parsing of the file or string. Once the XML is parsed the key is
+deleted. This means that the $parser does not retain a reference to the $parameters after the parsing.
+
+=head2 parsestring
+
+	$parser->parsestring( $string [, $parameters]);
+
+Just an alias to ->parse().
+
+=head2 parsefile
+
+	$parser->parsefile( $filename [, $parameters]);
+
+Opens the specified file and parses the XML and executes the rules as it encounters
+the closing tags and returns the resulting structure.
+
+
+=head2 filter
+
+	$parser->filter( $string);
+	$parser->filter( $string, $OutputIOhandle [, $parameters]);
+	$parser->filter( $InputIOhandle, $OutputIOhandle [, $parameters]);
+	$parser->filter( $string, $OutputFilename [, $parameters]);
+	$parser->filter( $InputIOhandle, $OutputFilename [, $parameters]);
+	$parser->filter( $string, $StringReference [, $parameters]);
+	$parser->filter( $InputIOhandle, $StringReference [, $parameters]);
+
+Parses the XML in the string or reads and parses the XML from the opened IO handle,
+copies the tags that do not have a subroutine rule specified and do not occure under such a tag,
+executes the specified rules and prints the results to select()ed filehandle, $OutputFilename or
+$OutputIOhandle or stores them in the scalar referenced by $StringReference.
+
+The scalar or reference passed as the third parameter to the filter() method is assigned to
+$parser->{parameters} for the parsing of the file or string. Once the XML is parsed the key is
+deleted. This means that the $parser does not retain a reference to the $parameters after the parsing.
+
+=head2 filterstring
+
+	$parser->filterstring( ...);
+
+Just an alias to ->filter().
+
+=head2 filterfile
+
+	$parser->filterfile( $filename, $OutputIOhandle [, $parameters]);
+	$parser->filterfile( $filename, $OutputFilename [, $parameters]);
+
+Parses the XML in the specified file, copies the tags that do not have a subroutine rule specified
+and do not occure under such a tag, executes the specified rules and prints the results to select()ed
+filehandle, $OutputFilename or $OutputIOhandle or stores them in the scalar
+referenced by $StringReference.
+
+The scalar or reference passed as the third parameter to the filter() method is assigned to
+$parser->{parameters} for the parsing of the file or string. Once the XML is parsed the key is
+deleted. This means that the $parser does not retain a reference to the $parameters after the parsing.
+
+=cut
+
+sub escape_value {
+	my($self, $data, $level) = @_;
+
+	return '' unless(defined($data) and $data ne '');
+
+	if ($self->{opt}{output_encoding} ne $self->{opt}{encode}) {
+		$data = Encode::decode( $self->{opt}{encode}, $data) if $self->{opt}{encode};
+		$data = Encode::encode( $self->{opt}{output_encoding}, $data) if $self->{opt}{output_encoding};
+	}
+
+	$data =~ s/&/&amp;/sg;
+	$data =~ s/</&lt;/sg;
+	$data =~ s/>/&gt;/sg;
+	$data =~ s/"/&quot;/sg;
+
+	$level = $self->{opt}->{numericescape} unless defined $level;
+	return $data unless $level;
+
+	return $self->_numeric_escape($data, $level);
+}
+
+sub _numeric_escape {
+  my($self, $data, $level) = @_;
+
+  use utf8; # required for 5.6
+
+  if($self->{opt}->{numericescape} eq '2') {
+    $data =~ s/([^\x00-\x7F])/'&#' . ord($1) . ';'/gse;
+  }
+  else {
+    $data =~ s/([^\x00-\xFF])/'&#' . ord($1) . ';'/gse;
+  }
+
+  return $data;
+}
+
+=head2 escape_value
+
+	$parser->escape_value( $data [, $numericescape])
+
+This method escapes the $data for inclusion in XML, the $numericescape may be 0, 1 or 2
+and controls whether to convert 'high' (non ASCII) characters to XML entities.
+
+0 - default: no numeric escaping (OK if you're writing out UTF8)
+
+1 - only characters above 0xFF are escaped (ie: characters in the 0x80-FF range are not escaped), possibly useful with ISO8859-1 output
+
+2 - all characters above 0x7F are escaped (good for plain ASCII output)
+
+You can also specify the default value in the constructor
+
+	my $parser = XML::Rules->new(
+		...
+		NumericEscape => 2,
+	);
+
+=cut
+
+sub ToXML;*ToXML=\&toXML;
+sub toXML {
+	my ($self, $tag, $attrs, $no_close, $ident, $base) = @_;
+
+	my $prefix = (defined ($ident) ? "\n$base" : '');
+
+	$attrs = undef if (ref $attrs eq 'HASH' and ! %{$attrs}); # ->toXML( $tagname, {}, ...)
+
+	if ($tag eq '') {
+		if (! ref($attrs)) { # ->toXML( '', $string_content, ...)
+			return $self->escape_value($attrs);
+		} elsif (ref($attrs) eq 'ARRAY') {
+			if (@$attrs) {
+				return join( '', map {
+					if (!ref($_)) {
+						$self->escape_value($_)
+					} elsif (ref($_) eq 'ARRAY' and @$_ == 2) {
+						$self->toXML($_->[0], $_->[1])
+					} else {
+						croak "The content in XML::Rules->ToXML( '', here) must be a string or an arrayref containing strings and two element arrayrefs!";
+					}
+				} @$attrs);
+			} else {
+				return "<$attrs/>"
+			}
+		}
+	}
+
+	if (! ref($attrs)) { # ->toXML( $tagname, $string_content, ...)
+		if ($no_close) {
+			return "<$tag>" . $self->escape_value($attrs);
+		} elsif (! defined $attrs) {
+			return "<$tag/>";
+		} else {
+			return "<$tag>" . $self->escape_value($attrs) . "</$tag>";
+		}
+	} elsif (ref($attrs) eq 'ARRAY') {
+		return join( $prefix, map $self->toXML($tag, $_, 0, $ident, $base), @$attrs);
+	}
+
+
+	my $content = $attrs->{_content};
+	my $result = "<$tag";
+	my $subtags = '';
+	foreach my $key (sort keys %$attrs) {
+		next if $key =~ /^:/ or $key eq '_content';
+		if (ref $attrs->{$key}) {
+			if (ref $attrs->{$key} eq 'ARRAY') {
+				if (@{$attrs->{$key}}) {
+					foreach my $subtag (@{$attrs->{$key}}) {
+						$subtags .= $prefix . $ident . $self->toXML($key, $subtag, 0, $ident, $base.$ident);
+					}
+				} else {
+					$subtags .= $prefix . $ident . "<$key/>";
+				}
+			} elsif (ref $attrs->{$key} eq 'HASH') {
+				$subtags .= $prefix . $ident . $self->toXML($key, $attrs->{$key}, 0, $ident, $base.$ident)
+			} else {
+				croak(ref($attrs->{$key}) . " attributes not supported in XML::Rules->toXML()!");
+			}
+		} else {
+			$result .= qq{ $key="} . $self->escape_value($attrs->{$key}) . qq{"};
+		}
+	}
+	if (! defined $content and $subtags eq '') {
+		if ($no_close) {
+			return $result.">";
+		} else {
+			return $result."/>";
+		}
+
+	} elsif (!ref($content)) { # content is a string, not an array of strings and subtags
+		if ($no_close) {
+			return "$result>$subtags" . $self->escape_value($content);
+		} elsif ($content eq '' and $subtags ne '') {
+			return "$result>$subtags$prefix</$tag>";
+		} else {
+			return "$result>$subtags" . $self->escape_value($content) ."</$tag>";
+		}
+
+	} elsif (ref($content) eq 'ARRAY') {
+		$result .= ">$subtags";
+		foreach my $snippet (@$content) {
+			if (!ref($snippet)) {
+				$result .= $self->escape_value($snippet);
+			} elsif (ref($snippet) eq 'ARRAY') {
+				if (@$snippet == 2) {
+					$result .= $self->toXML($snippet->[0], $snippet->[1]);
+				} else {
+					croak("Arrays in _content must be in format [\$tagname => \\\%attrs, ...] in XML::Rules->toXML()!");
+				}
+			} else {
+				croak(ref($snippet) . " not supported in _content in XML::Rules->toXML()!");
+			}
+		}
+		if ($no_close) {
+			return $result;
+		} else {
+			return $result."</$tag>";
+		}
+	} else {
+		croak(ref($content) . " _content not supported in XML::Rules->toXML()!");
+	}
+}
+
+sub parentsToXML {
+	my ($self, $level) = @_;
+	my $tag_names = $self->{context};
+	my $tag_attrs = $self->{data};
+
+	$level = scalar(@$tag_names) unless $level;
+
+	my $result = '';
+	for (my $i = -1; -$i <= $level; $i--) {
+		$result = $self->toXML( ${$tag_names}[$i], ${$tag_attrs}[$i], 1) . $result;
+	}
+	return $result;
+}
+
+sub closeParentsToXML {
+	my ($self, $level) = @_;
+	my $tag_names = $self->{context};
+
+	if ($level) {
+		return '</' . join( '></', (reverse(@{$tag_names}))[0..$level-1]) . '>';
+	} else {
+		return '</' . join( '></', reverse(@$tag_names)) . '>';
+	}
+}
+
+=head2 toXML / ToXML
+
+	$xml = $parser->toXML( $tagname, \%attrs[, $do_not_close, $ident, $base])
+
+You may use this method to convert the datastructures created by parsing the XML into the XML format.
+Not all data structures may be printed! I'll add more docs later, for now please do experiment.
+
+The $ident and $base, if defined, turn on and control the pretty-printing. The $ident specifies the character(s)
+used for one level of identation, the base contains the identation of the current tag. That is if you want to include the data inside of
+
+	<data>
+		<some>
+			<subtag>$here</subtag>
+		</some>
+	</data>
+
+you will call
+
+	$parser->toXML( $tagname, \%attrs, 0, "\t", "\t\t\t");
+
+The method does NOT validate that the $ident and $base are whitespace only, but of course if it's not you end up with invalid
+XML. Newlines are added only before the start tag and (if the tag has only child tags and no content) before the closing tag,
+but not after the closing tag! Newlines are added even if the $ident is an empty string.
+
+=head2 parentsToXML
+
+	$xml = $parser->parentsToXML( [$level])
+
+Prints all or only the topmost $level ancestor tags, including the attributes and content (parsed so far),
+but without the closing tags. You may use this to print the header of the file you are parsing,
+followed by calling toXML() on a structure you build and then by closeParentsToXML() to close
+the tags left opened by parentsToXML(). You most likely want to use the style => 'filter' option
+for the constructor instead.
+
+=head2 closeParentsToXML
+
+	$xml = $parser->closeParentsToXML( [$level])
+
+Prints the closing tags for all or the topmost $level ancestor tags of the one currently processed.
+
+=head2 paths2rules
+
+	my $parser = XML::Rules->new(
+		rules => paths2rules {
+			'/root/subtag/tag' => sub { ...},
+			'/root/othertag/tag' => sub {...},
+			'tag' => sub{ ... the default code for this tag ...},
+			...
+		}
+	);
+
+This helper function converts a hash of "somewhat xpath-like" paths and subs/rules into the format required by the module.
+Due to backwards compatibility and efficiency I can't directly support paths in the rules and the direct syntax for their
+specification is a bit awkward. So if you need the paths and not the regexps, you may use this helper instead of:
+
+	my $parser = XML::Rules->new(
+		rules => {
+			'tag' => [
+				'/root/subtag' => sub { ...},
+				'/root/othertag' => sub {...},
+				sub{ ... the default code for this tag ...},
+			],
+			...
+		}
+	);
+
+=cut
+
+sub paths2rules {
+	my ($paths) = @_;
+
+	my %rules;
+	while ( my ($tag, $val) = each %$paths) {
+
+		if ($tag =~ m{^(.*)/(.*)$}) {
+			my ($path, $tagname) = ($1, $2);
+
+			if (exists $rules{$tagname} and ref($rules{$tagname}) eq 'ARRAY') {
+				if (@{$rules{$tagname}} % 2) {
+					push @{$rules{$tagname}}, $path, $val;
+				} else {
+					splice @{$rules{$tagname}}, -1, 0, $path, $val;
+				}
+			} else {
+				$rules{$tagname} = [ $path => $val]
+			}
+
+		} elsif (exists $rules{$tag} and ref($rules{$tag}) eq 'ARRAY') {
+			push @{$rules{$tag}}, $val;
+		} else {
+			$rules{$tag} = $val
+		}
+	}
+
+	return \%rules;
+}
+
+=head2 return_nothing
+
+Stop parsing the XML, forget any data we already have and return from the $parser->parse().
+This is only supposed to be used within rules and may be called both as a method and as
+an ordinary function (it's not exported).
+
+=head2 skip_rest
+
+Stop parsing the XML and return whatever data we already have from the $parser->parse().
+The rules for the currently opened tags are evaluated as if the XML contained all
+the closing tags in the right order.
+
+These two work via raising an exception, the exception is caught within the $parser->parse() and do not propagate outside.
+It's also safe to raise any other exception within the rules, the exception will be caught as well, the internal state of the $parser object
+is cleaned and the exception is rethrown.
+
+=head2 inferRulesFromExample
+
+	Dumper(XML::Rules::inferRulesFromExample( $fileOrXML, $fileOrXML, $fileOrXML, ...)
+	Dumper(XML::Rules->inferRulesFromExample( $fileOrXML, $fileOrXML, $fileOrXML, ...)
+	Dumper($parser->inferRulesFromExample( $fileOrXML, $fileOrXML, $fileOrXML, ...)
+
+The subroutine parses the listed files and infers the rules that would produce the minimal, but complete datastructure.
+It finds out what tags may be repeated, whether they contain text content, attributes etc. You may want to give
+the subroutine several examples to make sure it knows about all possibilities. You should use this once and store
+the generated rules in your script or even take this as the basis of a more specific set of rules.
+
+=cut
+
+sub inferRulesFromExample {
+	shift(@_) if $_[0] eq 'XML::Rules' or ref($_[0]);
+	my @files = @_;
+
+	my %rules;
+
+	my $parser = XML::Rules->new(
+		namespaces => { '*' => ''},
+		rules => {
+			_default => sub {
+				my ($tag, $attrs, $context, $parent_data, $parser) = @_;
+				my $repeated = (exists $parent_data->[-1] and exists $parent_data->[-1]{$tag});
+				my $has_content = (exists $attrs->{_content});
+				my $has_children = grep ref($_) eq 'HASH', values %$attrs;
+				my $has_attr = grep {$_ ne '_content' and !ref($attrs->{$_})} keys %$attrs;
+
+				my $rule = do {
+					if ($repeated) {
+						if ($has_content) {
+							if ($has_attr or $has_children) {
+								'as array'
+							} else {
+								'content array'
+							}
+						} else {
+							if ($has_attr or $has_children) {
+								'as array no content'
+							} else {
+								'content array'
+							}
+						}
+					} else {
+						if ($has_content) {
+							if ($has_attr or $has_children) {
+								'as is'
+							} else {
+								'content'
+							}
+						} else {
+							if ($has_attr or $has_children) {
+								'no content'
+							} else {
+								'content'
+							}
+						}
+					}
+				};
+
+				if (not exists $rules{$tag}) {
+					$rules{$tag} = $rule
+				} elsif($rules{$tag} ne $rule) {
+					# we've already seen the tag and it had different type
+					if ($rules{$tag} eq 'raw extended array') {
+					} elsif ($rule eq 'raw extended array') {
+						$rules{$tag} = 'raw extended array';
+					} elsif ($rules{$tag} eq 'raw extended' and $rule =~ /array/
+						or $rule eq 'raw extended' and $rules{$tag} =~ /array/) {
+						$rules{$tag} = 'raw extended array'
+					} elsif ($rules{$tag} eq 'as array' or $rule eq 'as array') {
+						$rules{$tag} = 'as array'
+					} elsif ($rules{$tag} eq 'content array' and $rule eq 'content'
+						or $rule eq 'content array' and $rules{$tag} eq 'content') {
+						$rules{$tag} = 'content array'
+					} elsif ($rules{$tag} eq 'content array' and $rule eq 'as array no content'
+						or $rule eq 'content array' and $rules{$tag} eq 'as array no content') {
+						$rules{$tag} = 'as array'
+					} elsif ($rules{$tag} eq 'content array' and $rule eq 'as is'
+						or $rule eq 'content array' and $rules{$tag} eq 'as is') {
+						$rules{$tag} = 'as array'
+					} elsif ($rules{$tag} eq 'content array' and $rule eq 'no content'
+						or $rule eq 'content array' and $rules{$tag} eq 'no content') {
+						$rules{$tag} = 'as array'
+					} elsif ($rules{$tag} eq 'as array no content' and $rule eq 'as is'
+						or $rule eq 'as array no content' and $rules{$tag} eq 'as is') {
+						$rules{$tag} = 'as array'
+					} elsif ($rules{$tag} eq 'as array no content' and $rule eq 'content'
+						or $rule eq 'as array no content' and $rules{$tag} eq 'content') {
+						$rules{$tag} = 'as array'
+					} elsif ($rules{$tag} eq 'as array no content' and $rule eq 'no content'
+						or $rule eq 'as array no content' and $rules{$tag} eq 'no content') {
+						$rules{$tag} = 'as array no content'
+					} elsif ($rules{$tag} eq 'as is' and ($rule eq 'no content' or $rule eq 'content')
+						or $rule eq 'as is' and ($rules{$tag} eq 'no content' or $rules{$tag} eq 'content')) {
+						$rules{$tag} = 'as is'
+					} elsif ($rules{$tag} eq 'content' and $rule eq 'no content'
+						or $rule eq 'content' and $rules{$tag} eq 'no content') {
+						$rules{$tag} = 'as is'
+					} else {
+						die "Unexpected combination of rules: old=$rules{$tag}, new=$rule for tag $tag\n";
+					}
+				}
+
+				if ($has_content and $has_children) { # the tag contains both text content and subtags!, need to use the raw extended rules
+					foreach my $child (grep ref($attrs->{$_}) eq 'HASH', keys %$attrs) {
+						next if $rules{$child} =~ /^raw extended/;
+						if ($rules{$child} =~ /array/) {
+							$rules{$child} = 'raw extended array'
+						} else {
+							$rules{$child} = 'raw extended'
+						}
+					}
+				}
+				return $tag => {};
+			}
+		},
+		stripspaces => 7,
+	);
+
+	for (@files) {
+		eval {
+			if (! ref($_) and $_ !~ /\n/ and $_ !~ /^\s*</) {
+				$parser->parsefile($_);
+			} else {
+				$parser->parse($_);
+			}
+		} or croak "Error parsing $_: $@\n";
+	}
+
+	my %short_rules;
+	foreach my $tag (sort keys %rules) {
+		push @{$short_rules{$rules{$tag}}}, $tag
+	}
+
+	foreach my $tags (values %short_rules) {
+		$tags = join ',', @$tags;
+	}
+	%short_rules = reverse %short_rules;
+
+	return \%short_rules;
+}
+
+=head2 inferRulesFromDTD
+
+	Dumper(XML::Rules::inferRulesFromDTD( $DTDfile, [$enableExtended]))
+	Dumper(XML::Rules->inferRulesFromDTD( $DTDfile, [$enableExtended]))
+	Dumper($parser->inferRulesFromDTD( $DTDfile, [$enableExtended]))
+
+The subroutine parses the DTD and infers the rules that would produce the minimal, but complete datastructure.
+It finds out what tags may be repeated, whether they contain text content, attributes etc. You may use this
+each time you are about to parse the XML, once and store the generated rules in your script or even take this
+as the basis of a more specific set of rules.
+
+With the second parameter set to a true value, the tags included in a mixed content will use the "raw extended"
+or "raw extended array" types instead of just "raw". This makes sure the tag data both stay at the right place in
+the content and are accessible easily from the parent tag's atrribute hash.
+
+This subroutine requires the XML::DTDParser module!
+
+=cut
+
+sub inferRulesFromDTD {
+	require XML::DTDParser;
+
+	my ($DTDfile, $enable_extended) = @_;
+
+	my $DTD = XML::DTDParser::ParseDTDFile($DTDfile);
+
+	my $has_mixed = 0;
+	foreach my $tag (values %$DTD) {
+		$tag->{is_mixed} = (($tag->{content} and $tag->{children}) ? 1 : 0)
+		 and $has_mixed = 1;
+	}
+
+	my %settings;
+	foreach my $tagname (keys %$DTD) {
+		my $tag = $DTD->{$tagname};
+
+		my $repeated = ($tag->{option} =~ /^[+*]$/ ? 1 : 0);
+		my $has_content = $tag->{content};
+
+		my $in_mixed = grep {$DTD->{$_}{is_mixed}} @{$tag->{parent}};
+
+		if ($in_mixed) {
+			if ($enable_extended) {
+				if ($repeated) {
+					$settings{$tagname} = "raw extended array"
+				} else {
+					$settings{$tagname} = "raw extended"
+				}
+			} else {
+				$settings{$tagname} = "raw"
+			}
+		} else {
+			if (exists $DTD->{attributes} or exists $tag->{children}) {
+				my @ids ;
+				if (exists $DTD->{attributes}) {
+					@ids = grep {$DTD->{attributes}{$_}[0] eq 'ID' and $DTD->{attributes}{$_}[0] eq '#REQUIRED'} keys %{$DTD->{attributes}};
+				}
+				if (scalar(@ids) == 1) {
+					if ($has_content) {
+						$settings{$tagname} = "by $ids[0]"
+					} else {
+						$settings{$tagname} = "no content by $ids[0]"
+					}
+				} else {
+					if ($has_content) {
+						if ($repeated) {
+							$settings{$tagname} = "as array"
+						} else {
+							$settings{$tagname} = "as is"
+						}
+					} else {
+						if ($repeated) {
+							$settings{$tagname} = "as array no content"
+						} else {
+							$settings{$tagname} = "no content"
+						}
+					}
+				}
+			} elsif ($repeated) {
+				$settings{$tagname} = "content array"
+			} else {
+				$settings{$tagname} = "content array"
+			}
+		}
+	}
+
+#	use Data::Dumper;
+#	print Dumper(\%settings);
+
+	my %compressed;
+	{
+		my %tmp;
+		while (my ($tag, $option) = each %settings) {
+			push @{$tmp{$option}}, $tag;
+		}
+
+		while (my ($option, $tags) = each %tmp) {
+			$compressed{join ',', @$tags} = $option
+		}
+	}
+
+	if ($has_mixed) {
+		$compressed{"#stripspaces"} = 0;
+	} else {
+		$compressed{"#stripspaces"} = 7;
+	}
+
+	return \%compressed;
+}
+
+=head1 Properties
+
+=head2 parameters
+
+You can pass a parameter (scalar or reference) to the parse...() or filter...() methods, this parameter
+is later available to the rules as $parser->{parameters}. The module will never use this parameter for
+any other purpose so you are free to use it for any purposes provided that you expect it to be reset by
+each call to parse...() or filter...() first to the passed value and then, after the parsing is complete, to undef.
+
+=head2 pad
+
+The $parser->{pad} key is specificaly reserved by the module as a place where the module users can
+store their data. The module doesn't and will not use this key in any way, doesn't set or reset it under any
+circumstances. If you need to share some data between the rules and do not want to use the structure built
+by applying the rules you are free to use this key.
+
+You should refrain from modifying or accessing other properties of the XML::Rules object!
+
+=head1 Namespace support
+
+By default the module doesn't handle namespaces in any way, it doesn't check for
+xmlns or xmlns:alias attributes and it doesn't strip or mangle the namespace aliases
+in tag or attribute names. This means that if you know for sure what namespace
+aliases will be used you can set up rules for tags including the aliases and unless
+someone decides to use a different alias or makes use of the default namespace
+change your script will work.
+
+If you do specify any namespace to alias mapping in the constructor it does
+start processing the namespace stuff. The xmlns and xmlns:alias attributes
+are stripped from the datastructures and the aliases are transformed from
+whatever the XML author decided to use to whatever your namespace mapping
+specifies. Aliases are also added to all tags that belong to a default namespace.
+
+Assuming the constructor parameters contain
+
+	namespaces => {
+		'http://my.namespaces.com/foo' => 'foo',
+		'http://my.namespaces.com/bar' => 'bar',
+	}
+
+and the XML looks like this:
+
+	<root>
+		<Foo xmlns="http://my.namespaces.com/foo">
+			<subFoo>Hello world</subfoo>
+		</Foo>
+		<other xmlns:b="http://my.namespaces.com/bar">
+			<b:pub>
+				<b:name>NaRuzku</b:name>
+				<b:address>at any crossroads</b:address>
+				<b:desc>Fakt <b>desnej</b> pajzl.</b:desc>
+			</b:pub>
+		</other>
+	</root>
+
+then the rules wil be called as if the XML looked like this:
+
+	<root>
+		<foo:Foo>
+			<foo:subFoo>Hello world</foo:subfoo>
+		</foo:Foo>
+		<other>
+			<bar:pub>
+				<bar:name>NaRuzku</bar:name>
+				<bar:address>at any crossroads</bar:address>
+				<bar:desc>Fakt <b>desnej</b> pajzl.</bar:desc>
+			</bar:pub>
+		</other>
+	</root>
+
+
+This means that the namespace handling will only normalize the aliases used.
+
+It is possible to specify an empty alias, so eg. in case you are processing a SOAP XML
+and know the tags defined by SOAP do not colide with the tags in the enclosed XML
+you may simplify the parsing by removing all namespace aliases.
+
+If the XML references a namespace not present in the map you will get a warning
+and the alias used for that namespace will be left intact! If you do not want to get the warnings specify
+a namespace with URI "*".
+
+
+=head1 HOW TO USE
+
+You may view the module either as a XML::Simple on steriods and use it to build a data structure
+similar to the one produced by XML::Simple with the added benefit of being able
+to specify what tags or attributes to ignore, when to take just the content, what to store as an array etc.
+
+Or you could view it as yet another event based XML parser that differs from all the others only in one thing.
+It stores the data for you so that you do not have to use globals or closures and wonder where to attach
+the snippet of data you just received onto the structure you are building.
+
+You can use it in a way similar to XML::Twig with simplify(), specify the rules to transform the lower
+level tags into a XML::Simple like (simplify()ed) structure and then handle the structure in the rule for
+the tag(s) you'd specify in XML::Twig's twig_roots.
+
+=head1 Unrelated tricks
+
+If you need to parse a XML file without the top-most tag (something that each and any sane person would allow,
+but the XML comitee did not), you can parse
+
+  <!DOCTYPE doc [<!ENTITY real_doc SYSTEM "$the_file_name">]><doc>&real_doc;</doc>
+
+instead.
+
+=head1 AUTHOR
+
+Jan Krynicky, C<< <Jenda at CPAN.org> >>
+
+=head1 BUGS
+
+Please report any bugs or feature requests to
+C<bug-xml-rules at rt.cpan.org>, or through the web interface at
+L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=XML-Rules>.
+I will be notified, and then you'll automatically be notified of progress on
+your bug as I make changes.
+
+=head1 SUPPORT
+
+You can find documentation for this module with the perldoc command.
+
+    perldoc XML::Rules
+
+You can also look for information at:
+
+=over 4
+
+=item * AnnoCPAN: Annotated CPAN documentation
+
+L<http://annocpan.org/dist/XML-Rules>
+
+=item * CPAN Ratings
+
+L<http://cpanratings.perl.org/d/XML-Rules>
+
+=item * RT: CPAN's request tracker
+
+L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=XML-Rules>
+
+=item * Search CPAN
+
+L<http://search.cpan.org/dist/XML-Rules>
+
+=item * PerlMonks
+
+Please see L<http://www.perlmonks.org/?node_id=581313> or
+L<http://www.perlmonks.org/?node=XML::Rules> for discussion.
+
+=back
+
+=head1 SEE ALSO
+
+L<XML::Twig>, L<XML::LibXML>, L<XML::Pastor>
+
+=head1 ACKNOWLEDGEMENTS
+
+The escape_value() method is taken with minor changes from XML::Simple.
+
+=head1 COPYRIGHT & LICENSE
+
+Copyright 2006-2007 Jan Krynicky, all rights reserved.
+
+This program is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=cut
+
+1; # End of XML::Rules
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath.pm	(revision 24799)
@@ -0,0 +1,553 @@
+# $Id: XPath.pm 7909 2004-08-06 05:11:55Z mdewsnip $
+
+package XML::XPath;
+
+use strict;
+use vars qw($VERSION $AUTOLOAD $revision);
+
+$VERSION = '1.13';
+
+$XML::XPath::Namespaces = 1;
+$XML::XPath::Debug = 0;
+
+use XML::XPath::XMLParser;
+use XML::XPath::Parser;
+use IO::File;
+
+# For testing
+#use Data::Dumper;
+#$Data::Dumper::Indent = 1;
+
+# Parameters for new()
+my @options = qw(
+        filename
+        parser
+        xml
+        ioref
+        context
+        );
+
+sub new {
+    my $proto = shift;
+    my $class = ref($proto) || $proto;
+
+    my(%args);
+    # Try to figure out what the user passed
+    if ($#_ == 0) { # passed a scalar
+        my $string = $_[0];
+        if ($string =~ m{<.*?>}s) { # it's an XML string
+            $args{'xml'} = $string;
+        } elsif (ref($string)) {    # read XML from file handle
+            $args{'ioref'} = $string;
+        } elsif ($string eq '-') {  # read XML from stdin
+            $args{'ioref'} = IO::File->new($string);
+        } else {                    # read XML from a file
+            $args{'filename'} = $string;
+        }
+    } else {        # passed a hash or hash reference
+        # just pass the parameters on to the XPath constructor
+        %args = ((ref($_[0]) eq "HASH") ? %{$_[0]} : @_);
+    }
+
+    if ($args{filename} && (!-e $args{filename} || !-r $args{filename})) {
+        die "Cannot open file '$args{filename}'";
+    }
+    my %hash = map(( "_$_" => $args{$_} ), @options);
+    $hash{path_parser} = XML::XPath::Parser->new();
+    return bless \%hash, $class;
+}
+
+sub find {
+    my $self = shift;
+    my $path = shift;
+    my $context = shift;
+    die "No path to find" unless $path;
+    
+    if (!defined $context) {
+        $context = $self->get_context;
+    }
+    if (!defined $context) {
+        # Still no context? Need to parse...
+        my $parser = XML::XPath::XMLParser->new(
+                filename => $self->get_filename,
+                xml => $self->get_xml,
+                ioref => $self->get_ioref,
+                parser => $self->get_parser,
+                );
+        $context = $parser->parse;
+        $self->set_context($context);
+#        warn "CONTEXT:\n", Data::Dumper->Dumpxs([$context], ['context']);
+    }
+    
+    my $parsed_path = $self->{path_parser}->parse($path);
+#    warn "\n\nPATH: ", $parsed_path->as_string, "\n\n";
+    
+#    warn "evaluating path\n";
+    return $parsed_path->evaluate($context);
+}
+
+# sub memsize {
+#     print STDERR @_, "\t";
+#     open(FH, '/proc/self/status');
+#     while(<FH>) {
+#         print STDERR $_ if /^VmSize/;
+#     }
+#     close FH;
+# }
+# 
+sub findnodes {
+    my $self = shift;
+    my ($path, $context) = @_;
+    
+    my $results = $self->find($path, $context);
+    
+    if ($results->isa('XML::XPath::NodeSet')) {
+        return wantarray ? $results->get_nodelist : $results;
+#        return $results->get_nodelist;
+    }
+    
+#    warn("findnodes returned a ", ref($results), " object\n") if $XML::XPath::Debug;
+    return wantarray ? () : XML::XPath::NodeSet->new();
+}
+
+sub matches {
+    my $self = shift;
+    my ($node, $path, $context) = @_;
+
+    my @nodes = $self->findnodes($path, $context);
+
+    if (grep { "$node" eq "$_" } @nodes) {
+        return 1;
+    }
+    return;
+}
+
+sub findnodes_as_string {
+    my $self = shift;
+    my ($path, $context) = @_;
+    
+    my $results = $self->find($path, $context);
+    
+    if ($results->isa('XML::XPath::NodeSet')) {
+        return join('', map { $_->toString } $results->get_nodelist);
+    }
+    elsif ($results->isa('XML::XPath::Node')) {
+        return $results->toString;
+    }
+    else {
+        return XML::XPath::Node::XMLescape($results->value);
+    }
+}
+
+sub findvalue {
+    my $self = shift;
+    my ($path, $context) = @_;
+    
+    my $results = $self->find($path, $context);
+    
+    if ($results->isa('XML::XPath::NodeSet')) {
+        return $results->to_literal;
+    }
+    
+    return $results;
+}
+
+sub exists
+{
+    my $self = shift;
+    my ($path, $context) = @_;
+    $path = '/' if (!defined $path);
+    my @nodeset = $self->findnodes($path, $context);
+    return 1 if (scalar( @nodeset ));
+    return 0;
+}
+
+sub getNodeAsXML {
+  my $self = shift;
+  my $node_path = shift;
+  $node_path = '/' if (!defined $node_path);
+  if (ref($node_path)) {
+    return $node_path->as_string();
+  } else {
+    return $self->findnodes_as_string($node_path);
+  }
+}
+
+sub getNodeText {
+  my $self = shift;
+  my $node_path = shift;
+  if (ref($node_path)) {
+    return $node_path->string_value();
+  } else {
+    return $self->findvalue($node_path);
+  }
+}
+
+sub setNodeText {
+  my $self = shift;
+  my($node_path, $new_text) = @_;
+  my $nodeset = $self->findnodes($node_path);
+  return undef if (!defined $nodeset); # could not find node
+  my @nodes = $nodeset->get_nodelist;
+  if ($#nodes < 0) {
+    if ($node_path =~ m|/@([^/]+)$|) {
+      # attribute not found, so try to create it
+      my $parent_path = $`;
+      my $attr = $1;
+      $nodeset = $self->findnodes($parent_path);
+      return undef if (!defined $nodeset); # could not find node
+      foreach my $node ($nodeset->get_nodelist) {
+        my $newnode = XML::XPath::Node::Attribute->new($attr, $new_text);
+        return undef if (!defined $newnode); # could not create new node
+        $node->appendAttribute($newnode);
+      }
+    } else {
+      return undef; # could not find node
+    }
+  }
+  foreach my $node (@nodes) {
+    if ($node->getNodeType == XML::XPath::Node::ATTRIBUTE_NODE) {
+      $node->setNodeValue($new_text);
+    } else {
+      foreach my $delnode ($node->getChildNodes()) {
+        $node->removeChild($delnode);
+      }
+      my $newnode = XML::XPath::Node::Text->new($new_text);
+      return undef if (!defined $newnode); # could not create new node
+      $node->appendChild($newnode);
+    }
+  }
+  return 1;
+}
+
+sub createNode {
+  my $self = shift;
+  my($node_path) = @_;
+  my $path_steps = $self->{path_parser}->parse($node_path);
+  my @path_steps = ();
+  foreach my $step (@{$path_steps->get_lhs()}) {
+    my $string = $step->as_string();
+    push(@path_steps, $string) if (defined $string && $string ne "");
+  }
+  my $prev_node = undef;
+  my $nodeset = undef;
+  my $nodes = undef;
+  my $p = undef;
+  my $test_path = "";
+  # Start with the deepest node, working up the path (right to left),
+  # trying to find a node that exists.
+  for ($p = $#path_steps; $p >= 0; $p--) {
+    my $path = $path_steps[$p];
+    $test_path = "(/" . join("/", @path_steps[0..$p]) . ")";
+    $nodeset = $self->findnodes($test_path);
+    return undef if (!defined $nodeset); # error looking for node
+    $nodes = $nodeset->size;
+    return undef if ($nodes > 1); # too many paths - path not specific enough
+    if ($nodes == 1) { # found a node -- need to create nodes below it
+      $prev_node = $nodeset->get_node(1);
+      last;
+    }
+  }
+  if (!defined $prev_node) {
+    my @root_nodes = $self->findnodes('/')->get_nodelist();
+    $prev_node = $root_nodes[0];
+  }
+  # We found a node that exists, or we'll start at the root.
+  # Create all lower nodes working left to right along the path.
+  for ($p++ ; $p <= $#path_steps; $p++) {
+    my $path = $path_steps[$p];
+    my $newnode = undef;
+    my($axis,$name) = ($path =~ /^(.*?)::(.*)$/);
+    if ($axis =~ /^child$/i) {
+      $newnode = XML::XPath::Node::Element->new($name);
+      return undef if (!defined $newnode); # could not create new node
+      $prev_node->appendChild($newnode);
+    } elsif ($axis =~ /^attribute$/i) {
+      $newnode = XML::XPath::Node::Attribute->new($name, "");
+      return undef if (!defined $newnode); # could not create new node
+      $prev_node->appendAttribute($newnode);
+    }
+    $prev_node = $newnode;
+  }
+  return $prev_node;
+}
+
+sub get_filename {
+    my $self = shift;
+    $self->{_filename};
+}
+
+sub set_filename {
+    my $self = shift;
+    $self->{_filename} = shift;
+}
+
+sub get_parser {
+    my $self = shift;
+    $self->{_parser};
+}
+
+sub set_parser {
+    my $self = shift;
+    $self->{_parser} = shift;
+}
+
+sub get_xml {
+    my $self = shift;
+    $self->{_xml};
+}
+
+sub set_xml {
+    my $self = shift;
+    $self->{_xml} = shift;
+}
+
+sub get_ioref {
+    my $self = shift;
+    $self->{_ioref};
+}
+
+sub set_ioref {
+    my $self = shift;
+    $self->{_ioref} = shift;
+}
+
+sub get_context {
+    my $self = shift;
+    $self->{_context};
+}
+
+sub set_context {
+    my $self = shift;
+    $self->{_context} = shift;
+}
+
+sub cleanup {
+    my $self = shift;
+    if ($XML::XPath::SafeMode) {
+        my $context = $self->get_context;
+        return unless $context;
+        $context->dispose;
+    }
+}
+
+sub set_namespace {
+    my $self = shift;
+    my ($prefix, $expanded) = @_;
+    $self->{path_parser}->set_namespace($prefix, $expanded);
+}
+
+sub clear_namespaces {
+    my $self = shift;
+    $self->{path_parser}->clear_namespaces();
+}
+
+1;
+__END__
+
+=head1 NAME
+
+XML::XPath - a set of modules for parsing and evaluating XPath statements
+
+=head1 DESCRIPTION
+
+This module aims to comply exactly to the XPath specification at
+http://www.w3.org/TR/xpath and yet allow extensions to be added in the
+form of functions. Modules such as XSLT and XPointer may need to do
+this as they support functionality beyond XPath.
+
+=head1 SYNOPSIS
+
+    use XML::XPath;
+    use XML::XPath::XMLParser;
+    
+    my $xp = XML::XPath->new(filename => 'test.xhtml');
+    
+    my $nodeset = $xp->find('/html/body/p'); # find all paragraphs
+    
+    foreach my $node ($nodeset->get_nodelist) {
+        print "FOUND\n\n", 
+            XML::XPath::XMLParser::as_string($node),
+            "\n\n";
+    }
+
+=head1 DETAILS
+
+There's an awful lot to all of this, so bear with it - if you stick it
+out it should be worth it. Please get a good understanding of XPath
+by reading the spec before asking me questions. All of the classes
+and parts herein are named to be synonimous with the names in the
+specification, so consult that if you don't understand why I'm doing
+something in the code.
+
+=head1 API
+
+The API of XML::XPath itself is extremely simple to allow you to get
+going almost immediately. The deeper API's are more complex, but you
+shouldn't have to touch most of that.
+
+=head2 new()
+
+This constructor follows the often seen named parameter method call.
+Parameters you can use are: filename, parser, xml, ioref and context.
+The filename parameter specifies an XML file to parse. The xml
+parameter specifies a string to parse, and the ioref parameter
+specifies an ioref to parse. The context option allows you to 
+specify a context node. The context node has to be in the format 
+of a node as specified in L<XML::XPath::XMLParser>. The 4 parameters
+filename, xml, ioref and context are mutually exclusive - you should
+only specify one (if you specify anything other than context, the
+context node is the root of your document).
+The parser option allows you to pass in an already prepared 
+XML::Parser object, to save you having to create more than one
+in your application (if, for example, you're doing more than just XPath).
+
+    my $xp = XML::XPath->new( context => $node );
+
+It is very much recommended that you use only 1 XPath object throughout 
+the life of your application. This is because the object (and it's sub-objects)
+maintain certain bits of state information that will be useful (such
+as XPath variables) to later calls to find(). It's also a good idea because
+you'll use less memory this way.
+
+=head2 I<nodeset> = find($path, [$context])
+
+The find function takes an XPath expression (a string) and returns either an
+XML::XPath::NodeSet object containing the nodes it found (or empty if
+no nodes matched the path), or one of XML::XPath::Literal (a string),
+XML::XPath::Number, or XML::XPath::Boolean. It should always return 
+something - and you can use ->isa() to find out what it returned. If you
+need to check how many nodes it found you should check $nodeset->size.
+See L<XML::XPath::NodeSet>. An optional second parameter of a context
+node allows you to use this method repeatedly, for example XSLT needs
+to do this.
+
+=head2 findnodes($path, [$context])
+
+Returns a list of nodes found by $path, optionally in context $context. 
+In scalar context returns an XML::XPath::NodeSet object.
+
+=head2 findnodes_as_string($path, [$context])
+
+Returns the nodes found reproduced as XML. The result is not guaranteed
+to be valid XML though.
+
+=head2 findvalue($path, [$context])
+
+Returns either a C<XML::XPath::Literal>, a C<XML::XPath::Boolean> or a
+C<XML::XPath::Number> object. If the path returns a NodeSet,
+$nodeset->to_literal is called automatically for you (and thus a
+C<XML::XPath::Literal> is returned). Note that
+for each of the objects stringification is overloaded, so you can just
+print the value found, or manipulate it in the ways you would a normal
+perl value (e.g. using regular expressions).
+
+=head2 exists($path, [$context])
+
+Returns true if the given path exists.
+
+=head2 matches($node, $path, [$context])
+
+Returns true if the node matches the path (optionally in context $context).
+
+=head2 getNodeText($path)
+
+Returns the text string for a particular XML node.  Returns a string,
+or undef if the node doesn't exist.
+
+=head2 setNodeText($path, $text)
+
+Sets the text string for a particular XML node.  The node can be an
+element or an attribute.  If the node to be set is an attribute, and
+the attribute node does not exist, it will be created automatically.
+
+=head2 createNode($path)
+
+Creates the node matching the path given.  If part of the path given, or
+all of the path do not exist, the necessary nodes will be created
+automatically.
+
+=head2 set_namespace($prefix, $uri)
+
+Sets the namespace prefix mapping to the uri.
+
+Normally in XML::XPath the prefixes in XPath node tests take their
+context from the current node. This means that foo:bar will always
+match an element <foo:bar> regardless of the namespace that the prefix
+foo is mapped to (which might even change within the document, resulting
+in unexpected results). In order to make prefixes in XPath node tests
+actually map to a real URI, you need to enable that via a call
+to the set_namespace method of your XML::XPath object.
+
+=head2 clear_namespaces()
+
+Clears all previously set namespace mappings.
+
+=head2 $XML::XPath::Namespaces
+
+Set this to 0 if you I<don't> want namespace processing to occur. This
+will make everything a little (tiny) bit faster, but you'll suffer for it,
+probably.
+
+=head1 Node Object Model
+
+See L<XML::XPath::Node>, L<XML::XPath::Node::Element>, 
+L<XML::XPath::Node::Text>, L<XML::XPath::Node::Comment>,
+L<XML::XPath::Node::Attribute>, L<XML::XPath::Node::Namespace>,
+and L<XML::XPath::Node::PI>.
+
+=head1 On Garbage Collection
+
+XPath nodes work in a special way that allows circular references, and 
+yet still lets Perl's reference counting garbage collector to clean up
+the nodes after use. This should be totally transparent to the user,
+with one caveat: B<If you free your tree before letting go of a sub-tree,
+consider that playing with fire and you may get burned>. What does this
+mean to the average user? Not much. Provided you don't free (or let go
+out of scope) either the tree you passed to XML::XPath->new, or if you
+didn't pass a tree, and passed a filename or IO-ref, then provided you
+don't let the XML::XPath object go out of scope before you let results
+of find() and its friends go out of scope, then you'll be fine. Even if
+you B<do> let the tree go out of scope before results, you'll probably
+still be fine. The only case where you may get stung is when the last
+part of your path/query is either an ancestor or parent axis. In that
+case the worst that will happen is you'll end up with a circular reference
+that won't get cleared until interpreter destruction time. You can get
+around that by explicitly calling $node->DESTROY on each of your result
+nodes, if you really need to do that.
+
+Mail me direct if that's not clear. Note that it's not doom and gloom. It's
+by no means perfect, but the worst that will happen is a long running process
+could leak memory. Most long running processes will therefore be able to
+explicitly be careful not to free the tree (or XML::XPath object) before
+freeing results. AxKit, an application that uses XML::XPath, does this and
+I didn't have to make any changes to the code - it's already sensible
+programming.
+
+If you I<really> don't want all this to happen, then set the variable
+$XML::XPath::SafeMode, and call $xp->cleanup() on the XML::XPath object
+when you're finished, or $tree->dispose() if you have a tree instead.
+
+=head1 Example
+
+Please see the test files in t/ for examples on how to use XPath.
+
+=head1 Support/Author
+
+This module is copyright 2000 AxKit.com Ltd. This is free
+software, and as such comes with NO WARRANTY. No dates are used in this
+module. You may distribute this module under the terms of either the
+Gnu GPL,  or the Artistic License (the same terms as Perl itself).
+
+For support, please subscribe to the Perl-XML mailing list at the URL 
+http://listserv.activestate.com/mailman/listinfo/perl-xml
+
+Matt Sergeant, matt@sergeant.org
+
+=head1 SEE ALSO
+
+L<XML::XPath::Literal>, L<XML::XPath::Boolean>, L<XML::XPath::Number>,
+L<XML::XPath::XMLParser>, L<XML::XPath::NodeSet>, L<XML::XPath::PerlSAX>,
+L<XML::XPath::Builder>.
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Boolean.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Boolean.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Boolean.pm	(revision 24799)
@@ -0,0 +1,73 @@
+# $Id: Boolean.pm 7909 2004-08-06 05:11:55Z mdewsnip $
+
+package XML::XPath::Boolean;
+use XML::XPath::Number;
+use XML::XPath::Literal;
+use strict;
+
+use overload
+		'""' => \&value,
+		'<=>' => \&cmp;
+
+sub True {
+	my $class = shift;
+	my $val = 1;
+	bless \$val, $class;
+}
+
+sub False {
+	my $class = shift;
+	my $val = 0;
+	bless \$val, $class;
+}
+
+sub value {
+	my $self = shift;
+	$$self;
+}
+
+sub cmp {
+	my $self = shift;
+	my ($other, $swap) = @_;
+	if ($swap) {
+		return $other <=> $$self;
+	}
+	return $$self <=> $other;
+}
+
+sub to_number { XML::XPath::Number->new($_[0]->value); }
+sub to_boolean { $_[0]; }
+sub to_literal { XML::XPath::Literal->new($_[0]->value ? "true" : "false"); }
+
+sub string_value { return $_[0]->to_literal->value; }
+
+1;
+__END__
+
+=head1 NAME
+
+XML::XPath::Boolean - Boolean true/false values
+
+=head1 DESCRIPTION
+
+XML::XPath::Boolean objects implement simple boolean true/false objects.
+
+=head1 API
+
+=head2 XML::XPath::Boolean->True
+
+Creates a new Boolean object with a true value.
+
+=head2 XML::XPath::Boolean->False
+
+Creates a new Boolean object with a false value.
+
+=head2 value()
+
+Returns true or false.
+
+=head2 to_literal()
+
+Returns the string "true" or "false".
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Builder.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Builder.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Builder.pm	(revision 24799)
@@ -0,0 +1,198 @@
+# $Id: Builder.pm 7909 2004-08-06 05:11:55Z mdewsnip $
+
+package XML::XPath::Builder;
+
+use strict;
+
+# to get array index constants
+use XML::XPath::Node;
+use XML::XPath::Node::Element;
+use XML::XPath::Node::Attribute;
+use XML::XPath::Node::Namespace;
+use XML::XPath::Node::Text;
+use XML::XPath::Node::PI;
+use XML::XPath::Node::Comment;
+
+use vars qw/$xmlns_ns $xml_ns/;
+
+$xmlns_ns = "http://www.w3.org/2000/xmlns/";
+$xml_ns = "http://www.w3.org/XML/1998/namespace";
+
+sub new {
+    my $class = shift;
+    my $self = ($#_ == 0) ? { %{ (shift) } } : { @_ };
+
+    bless $self, $class;
+}
+
+sub start_document {
+    my $self = shift;
+
+    $self->{IdNames} = {};
+    $self->{InScopeNamespaceStack} = [ { 
+            '_Default' => undef,
+            'xmlns' => $xmlns_ns,
+            'xml' => $xml_ns,
+        } ];
+    
+    $self->{NodeStack} = [ ];
+    
+    my $document = XML::XPath::Node::Element->new();
+    my $newns = XML::XPath::Node::Namespace->new('xml', $xml_ns);
+    $document->appendNamespace($newns);
+    $self->{current} = $self->{DOC_Node} = $document;
+}
+
+sub end_document {
+    my $self = shift;
+    
+    return $self->{DOC_Node};
+}
+
+sub characters {
+    my $self = shift;
+    my $sarg = shift;
+    my $text = $sarg->{Data};
+    
+    my $parent = $self->{current};
+    
+    my $last = $parent->getLastChild;
+    if ($last && $last->isTextNode) {
+        # append to previous text node
+        $last->appendText($text);
+        return;
+    }
+    
+    my $node = XML::XPath::Node::Text->new($text);
+    $parent->appendChild($node, 1);
+}
+
+sub start_element {
+    my $self = shift;
+    my $sarg = shift;
+    my $tag  = $sarg->{'Name'};
+    my $attr = $sarg->{'Attributes'};
+
+    push @{ $self->{InScopeNamespaceStack} },
+         { %{ $self->{InScopeNamespaceStack}[-1] } };
+    $self->_scan_namespaces(@_);
+    
+    my ($prefix, $namespace) = $self->_namespace($tag);
+    
+    my $node = XML::XPath::Node::Element->new($tag, $prefix);
+    
+    foreach my $name (keys %$attr) {
+	my $value = $attr->{$name};
+
+        if ($name =~ /^xmlns(:(.*))?$/) {
+            # namespace node
+            my $prefix = $2 || '#default';
+#            warn "Creating NS node: $prefix = $value\n";
+            my $newns = XML::XPath::Node::Namespace->new($prefix, $value);
+            $node->appendNamespace($newns);
+        }
+        else {
+	    my ($prefix, $namespace) = $self->_namespace($name);
+            undef $namespace unless $prefix;
+
+            my $newattr = XML::XPath::Node::Attribute->new($name, $value, $prefix);
+            $node->appendAttribute($newattr, 1);
+            if (exists($self->{IdNames}{$tag}) && ($self->{IdNames}{$tag} eq $name)) {
+    #            warn "appending Id Element: $val for ", $node->getName, "\n";
+                $self->{DOC_Node}->appendIdElement($value, $node);
+            }
+        }
+    }
+        
+    $self->{current}->appendChild($node, 1);
+    $self->{current} = $node;
+}
+
+sub end_element {
+    my $self = shift;
+    $self->{current} = $self->{current}->getParentNode;
+}
+
+sub processing_instruction {
+    my $self = shift;
+    my $pi = shift;
+    my $node = XML::XPath::Node::PI->new($pi->{Target}, $pi->{Data});
+    $self->{current}->appendChild($node, 1);
+}
+
+sub comment {
+    my $self = shift;
+    my $comment = shift;
+    my $node = XML::XPath::Node::Comment->new($comment->{Data});
+    $self->{current}->appendChild($node, 1);
+}
+
+sub _scan_namespaces {
+    my ($self, %attributes) = @_;
+
+    while (my ($attr_name, $value) = each %attributes) {
+	if ($attr_name eq 'xmlns') {
+	    $self->{InScopeNamespaceStack}[-1]{'_Default'} = $value;
+	} elsif ($attr_name =~ /^xmlns:(.*)$/) {
+	    my $prefix = $1;
+	    $self->{InScopeNamespaceStack}[-1]{$prefix} = $value;
+	}
+    }
+}
+
+sub _namespace {
+    my ($self, $name) = @_;
+
+    my ($prefix, $localname) = split(/:/, $name);
+    if (!defined($localname)) {
+	if ($prefix eq 'xmlns') {
+	    return '', undef;
+	} else {
+	    return '', $self->{InScopeNamespaceStack}[-1]{'_Default'};
+	}
+    } else {
+	return $prefix, $self->{InScopeNamespaceStack}[-1]{$prefix};
+    }
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+XML::XPath::Builder - SAX handler for building an XPath tree
+
+=head1 SYNOPSIS
+
+ use AnySAXParser;
+ use XML::XPath::Builder;
+
+ $builder = XML::XPath::Builder->new();
+ $parser = AnySAXParser->new( Handler => $builder );
+
+ $root_node = $parser->parse( Source => [SOURCE] );
+
+=head1 DESCRIPTION
+
+C<XML::XPath::Builder> is a SAX handler for building an XML::XPath
+tree.
+
+C<XML::XPath::Builder> is used by creating a new instance of
+C<XML::XPath::Builder> and providing it as the Handler for a SAX
+parser.  Calling `C<parse()>' on the SAX parser will return the
+root node of the tree built from that parse.
+
+=head1 AUTHOR
+
+Ken MacLeod, <ken@bitsko.slc.ut.us>
+
+=head1 SEE ALSO
+
+perl(1), XML::XPath(3)
+
+PerlSAX.pod in libxml-perl
+
+Extensible Markup Language (XML) <http://www.w3c.org/XML>
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Expr.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Expr.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Expr.pm	(revision 24799)
@@ -0,0 +1,619 @@
+# $Id: Expr.pm 7909 2004-08-06 05:11:55Z mdewsnip $
+
+package XML::XPath::Expr;
+use strict;
+
+sub new {
+    my $class = shift;
+    my ($pp) = @_;
+    bless { predicates => [], pp => $pp }, $class;
+}
+
+sub as_string {
+    my $self = shift;
+    local $^W; # Use of uninitialized value! grrr
+    my $string = "(" . $self->{lhs}->as_string;
+    $string .= " " . $self->{op} . " " if defined $self->{op};
+    $string .= $self->{rhs}->as_string if defined $self->{rhs};
+    $string .= ")";
+    foreach my $predicate (@{$self->{predicates}}) {
+        $string .= "[" . $predicate->as_string . "]";
+    }
+    return $string;
+}
+
+sub as_xml {
+    my $self = shift;
+    local $^W; # Use of uninitialized value! grrr
+    my $string;
+    if (defined $self->{op}) {
+        $string .= $self->op_xml();
+    }
+    else {
+        $string .= $self->{lhs}->as_xml();
+    }
+    foreach my $predicate (@{$self->{predicates}}) {
+        $string .= "<Predicate>\n" . $predicate->as_xml() . "</Predicate>\n";
+    }
+    return $string;
+}
+
+sub op_xml {
+    my $self = shift;
+    my $op = $self->{op};
+
+    my $tag;    
+    for ($op) {
+        /^or$/    && do {
+                    $tag = "Or";
+                };
+        /^and$/    && do {
+                    $tag = "And";
+                };
+        /^=$/    && do {
+                    $tag = "Equals";
+                };
+        /^!=$/    && do {
+                    $tag = "NotEquals";
+                };
+        /^<=$/    && do {
+                    $tag = "LessThanOrEquals";
+                };
+        /^>=$/    && do {
+                    $tag = "GreaterThanOrEquals";
+                };
+        /^>$/    && do {
+                    $tag = "GreaterThan";
+                };
+        /^<$/    && do {
+                    $tag = "LessThan";
+                };
+        /^\+$/    && do {
+                    $tag = "Plus";
+                };
+        /^-$/    && do {
+                    $tag = "Minus";
+                };
+        /^div$/    && do {
+                    $tag = "Div";
+                };
+        /^mod$/    && do {
+                    $tag = "Mod";
+                };
+        /^\*$/    && do {
+                    $tag = "Multiply";
+                };
+        /^\|$/    && do {
+                    $tag = "Union";
+                };
+    }
+    
+    return "<$tag>\n" . $self->{lhs}->as_xml() . $self->{rhs}->as_xml() . "</$tag>\n";
+}
+
+sub set_lhs {
+    my $self = shift;
+    $self->{lhs} = $_[0];
+}
+
+sub set_op {
+    my $self = shift;
+    $self->{op} = $_[0];
+}
+
+sub set_rhs {
+    my $self = shift;
+    $self->{rhs} = $_[0];
+}
+
+sub push_predicate {
+    my $self = shift;
+    
+    die "Only 1 predicate allowed on FilterExpr in W3C XPath 1.0"
+            if @{$self->{predicates}};
+    
+    push @{$self->{predicates}}, $_[0];
+}
+
+sub get_lhs { $_[0]->{lhs}; }
+sub get_rhs { $_[0]->{rhs}; }
+sub get_op { $_[0]->{op}; }
+
+sub evaluate {
+    my $self = shift;
+    my $node = shift;
+    
+    # If there's an op, result is result of that op.
+    # If no op, just resolve Expr
+    
+#    warn "Evaluate Expr: ", $self->as_string, "\n";
+    
+    my $results;
+    
+    if ($self->{op}) {
+        die ("No RHS of ", $self->as_string) unless $self->{rhs};
+        $results = $self->op_eval($node);
+    }
+    else {
+        $results = $self->{lhs}->evaluate($node);
+    }
+    
+    if (my @predicates = @{$self->{predicates}}) {
+        if (!$results->isa('XML::XPath::NodeSet')) {
+            die "Can't have predicates execute on object type: " . ref($results);
+        }
+        
+        # filter initial nodeset by each predicate
+        foreach my $predicate (@{$self->{predicates}}) {
+            $results = $self->filter_by_predicate($results, $predicate);
+        }
+    }
+    
+    return $results;
+}
+
+sub op_eval {
+    my $self = shift;
+    my $node = shift;
+    
+    my $op = $self->{op};
+    
+    for ($op) {
+        /^or$/    && do {
+                    return op_or($node, $self->{lhs}, $self->{rhs});
+                };
+        /^and$/    && do {
+                    return op_and($node, $self->{lhs}, $self->{rhs});
+                };
+        /^=$/    && do {
+                    return op_equals($node, $self->{lhs}, $self->{rhs});
+                };
+        /^!=$/    && do {
+                    return op_nequals($node, $self->{lhs}, $self->{rhs});
+                };
+        /^<=$/    && do {
+                    return op_le($node, $self->{lhs}, $self->{rhs});
+                };
+        /^>=$/    && do {
+                    return op_ge($node, $self->{lhs}, $self->{rhs});
+                };
+        /^>$/    && do {
+                    return op_gt($node, $self->{lhs}, $self->{rhs});
+                };
+        /^<$/    && do {
+                    return op_lt($node, $self->{lhs}, $self->{rhs});
+                };
+        /^\+$/    && do {
+                    return op_plus($node, $self->{lhs}, $self->{rhs});
+                };
+        /^-$/    && do {
+                    return op_minus($node, $self->{lhs}, $self->{rhs});
+                };
+        /^div$/    && do {
+                    return op_div($node, $self->{lhs}, $self->{rhs});
+                };
+        /^mod$/    && do {
+                    return op_mod($node, $self->{lhs}, $self->{rhs});
+                };
+        /^\*$/    && do {
+                    return op_mult($node, $self->{lhs}, $self->{rhs});
+                };
+        /^\|$/    && do {
+                    return op_union($node, $self->{lhs}, $self->{rhs});
+                };
+        
+        die "No such operator, or operator unimplemented in ", $self->as_string, "\n";
+    }
+}
+
+# Operators
+
+use XML::XPath::Boolean;
+
+sub op_or {
+    my ($node, $lhs, $rhs) = @_;
+    if($lhs->evaluate($node)->to_boolean->value) {
+        return XML::XPath::Boolean->True;
+    }
+    else {
+        return $rhs->evaluate($node)->to_boolean;
+    }
+}
+
+sub op_and {
+    my ($node, $lhs, $rhs) = @_;
+    if( ! $lhs->evaluate($node)->to_boolean->value ) {
+        return XML::XPath::Boolean->False;
+    }
+    else {
+        return $rhs->evaluate($node)->to_boolean;
+    }
+}
+
+sub op_equals {
+    my ($node, $lhs, $rhs) = @_;
+
+    my $lh_results = $lhs->evaluate($node);
+    my $rh_results = $rhs->evaluate($node);
+    
+    if ($lh_results->isa('XML::XPath::NodeSet') &&
+            $rh_results->isa('XML::XPath::NodeSet')) {
+        # True if and only if there is a node in the
+        # first set and a node in the second set such
+        # that the result of performing the comparison
+        # on the string-values of the two nodes is true.
+        foreach my $lhnode ($lh_results->get_nodelist) {
+            foreach my $rhnode ($rh_results->get_nodelist) {
+                if ($lhnode->string_value eq $rhnode->string_value) {
+                    return XML::XPath::Boolean->True;
+                }
+            }
+        }
+        return XML::XPath::Boolean->False;
+    }
+    elsif (($lh_results->isa('XML::XPath::NodeSet') ||
+            $rh_results->isa('XML::XPath::NodeSet')) &&
+            (!$lh_results->isa('XML::XPath::NodeSet') ||
+             !$rh_results->isa('XML::XPath::NodeSet'))) {
+        # (that says: one is a nodeset, and one is not a nodeset)
+        
+        my ($nodeset, $other);
+        if ($lh_results->isa('XML::XPath::NodeSet')) {
+            $nodeset = $lh_results;
+            $other = $rh_results;
+        }
+        else {
+            $nodeset = $rh_results;
+            $other = $lh_results;
+        }
+        
+        # True if and only if there is a node in the
+        # nodeset such that the result of performing
+        # the comparison on <type>(string_value($node))
+        # is true.
+        if ($other->isa('XML::XPath::Number')) {
+            foreach my $node ($nodeset->get_nodelist) {
+                if ($node->string_value == $other->value) {
+                    return XML::XPath::Boolean->True;
+                }
+            }
+        }
+        elsif ($other->isa('XML::XPath::Literal')) {
+            foreach my $node ($nodeset->get_nodelist) {
+                if ($node->string_value eq $other->value) {
+                    return XML::XPath::Boolean->True;
+                }
+            }
+        }
+        elsif ($other->isa('XML::XPath::Boolean')) {
+            if ($nodeset->to_boolean->value == $other->value) {
+                return XML::XPath::Boolean->True;
+            }
+        }
+
+        return XML::XPath::Boolean->False;
+    }
+    else { # Neither is a nodeset
+        if ($lh_results->isa('XML::XPath::Boolean') ||
+            $rh_results->isa('XML::XPath::Boolean')) {
+            # if either is a boolean
+            if ($lh_results->to_boolean->value == $rh_results->to_boolean->value) {
+                return XML::XPath::Boolean->True;
+            }
+            return XML::XPath::Boolean->False;
+        }
+        elsif ($lh_results->isa('XML::XPath::Number') ||
+                $rh_results->isa('XML::XPath::Number')) {
+            # if either is a number
+            local $^W; # 'number' might result in undef
+            if ($lh_results->to_number->value == $rh_results->to_number->value) {
+                return XML::XPath::Boolean->True;
+            }
+            return XML::XPath::Boolean->False;
+        }
+        else {
+            if ($lh_results->to_literal->value eq $rh_results->to_literal->value) {
+                return XML::XPath::Boolean->True;
+            }
+            return XML::XPath::Boolean->False;
+        }
+    }
+}
+
+sub op_nequals {
+    my ($node, $lhs, $rhs) = @_;
+    if (op_equals($node, $lhs, $rhs)->value) {
+        return XML::XPath::Boolean->False;
+    }
+    return XML::XPath::Boolean->True;
+}
+
+sub op_le {
+    my ($node, $lhs, $rhs) = @_;
+    op_gt($node, $rhs, $lhs);
+}
+
+sub op_ge {
+    my ($node, $lhs, $rhs) = @_;
+
+    my $lh_results = $lhs->evaluate($node);
+    my $rh_results = $rhs->evaluate($node);
+    
+    if ($lh_results->isa('XML::XPath::NodeSet') &&
+        $rh_results->isa('XML::XPath::NodeSet')) {
+
+        foreach my $lhnode ($lh_results->get_nodelist) {
+            foreach my $rhnode ($rh_results->get_nodelist) {
+                my $lhNum = XML::XPath::Number->new($lhnode->string_value);
+                my $rhNum = XML::XPath::Number->new($rhnode->string_value);
+                if ($lhNum->value >= $rhNum->value) {
+                    return XML::XPath::Boolean->True;
+                }
+            }
+        }
+        return XML::XPath::Boolean->False;
+    }
+    elsif (($lh_results->isa('XML::XPath::NodeSet') ||
+            $rh_results->isa('XML::XPath::NodeSet')) &&
+            (!$lh_results->isa('XML::XPath::NodeSet') ||
+             !$rh_results->isa('XML::XPath::NodeSet'))) {
+        # (that says: one is a nodeset, and one is not a nodeset)
+
+        my ($nodeset, $other);
+        my ($true, $false);
+        if ($lh_results->isa('XML::XPath::NodeSet')) {
+            $nodeset = $lh_results;
+            $other = $rh_results;
+            # we do this because unlike ==, these ops are direction dependant
+            ($false, $true) = (XML::XPath::Boolean->False, XML::XPath::Boolean->True);
+        }
+        else {
+            $nodeset = $rh_results;
+            $other = $lh_results;
+            # ditto above comment
+            ($true, $false) = (XML::XPath::Boolean->False, XML::XPath::Boolean->True);
+        }
+        
+        # True if and only if there is a node in the
+        # nodeset such that the result of performing
+        # the comparison on <type>(string_value($node))
+        # is true.
+        foreach my $node ($nodeset->get_nodelist) {
+            if ($node->to_number->value >= $other->to_number->value) {
+                return $true;
+            }
+        }
+        return $false;
+    }
+    else { # Neither is a nodeset
+        if ($lh_results->isa('XML::XPath::Boolean') ||
+            $rh_results->isa('XML::XPath::Boolean')) {
+            # if either is a boolean
+            if ($lh_results->to_boolean->to_number->value
+                    >= $rh_results->to_boolean->to_number->value) {
+                return XML::XPath::Boolean->True;
+            }
+        }
+        else {
+            if ($lh_results->to_number->value >= $rh_results->to_number->value) {
+                return XML::XPath::Boolean->True;
+            }
+        }
+        return XML::XPath::Boolean->False;
+    }
+}
+
+sub op_gt {
+    my ($node, $lhs, $rhs) = @_;
+
+    my $lh_results = $lhs->evaluate($node);
+    my $rh_results = $rhs->evaluate($node);
+    
+    if ($lh_results->isa('XML::XPath::NodeSet') &&
+        $rh_results->isa('XML::XPath::NodeSet')) {
+
+        foreach my $lhnode ($lh_results->get_nodelist) {
+            foreach my $rhnode ($rh_results->get_nodelist) {
+                my $lhNum = XML::XPath::Number->new($lhnode->string_value);
+                my $rhNum = XML::XPath::Number->new($rhnode->string_value);
+                if ($lhNum->value > $rhNum->value) {
+                    return XML::XPath::Boolean->True;
+                }
+            }
+        }
+        return XML::XPath::Boolean->False;
+    }
+    elsif (($lh_results->isa('XML::XPath::NodeSet') ||
+            $rh_results->isa('XML::XPath::NodeSet')) &&
+            (!$lh_results->isa('XML::XPath::NodeSet') ||
+             !$rh_results->isa('XML::XPath::NodeSet'))) {
+        # (that says: one is a nodeset, and one is not a nodeset)
+
+        my ($nodeset, $other);
+        my ($true, $false);
+        if ($lh_results->isa('XML::XPath::NodeSet')) {
+            $nodeset = $lh_results;
+            $other = $rh_results;
+            # we do this because unlike ==, these ops are direction dependant
+            ($false, $true) = (XML::XPath::Boolean->False, XML::XPath::Boolean->True);
+        }
+        else {
+            $nodeset = $rh_results;
+            $other = $lh_results;
+            # ditto above comment
+            ($true, $false) = (XML::XPath::Boolean->False, XML::XPath::Boolean->True);
+        }
+        
+        # True if and only if there is a node in the
+        # nodeset such that the result of performing
+        # the comparison on <type>(string_value($node))
+        # is true.
+        foreach my $node ($nodeset->get_nodelist) {
+            if ($node->to_number->value > $other->to_number->value) {
+                return $true;
+            }
+        }
+        return $false;
+    }
+    else { # Neither is a nodeset
+        if ($lh_results->isa('XML::XPath::Boolean') ||
+            $rh_results->isa('XML::XPath::Boolean')) {
+            # if either is a boolean
+            if ($lh_results->to_boolean->value > $rh_results->to_boolean->value) {
+                return XML::XPath::Boolean->True;
+            }
+        }
+        else {
+            if ($lh_results->to_number->value > $rh_results->to_number->value) {
+                return XML::XPath::Boolean->True;
+            }
+        }
+        return XML::XPath::Boolean->False;
+    }
+}
+
+sub op_lt {
+    my ($node, $lhs, $rhs) = @_;
+    op_gt($node, $rhs, $lhs);
+}
+
+sub op_plus {
+    my ($node, $lhs, $rhs) = @_;
+    my $lh_results = $lhs->evaluate($node);
+    my $rh_results = $rhs->evaluate($node);
+    
+    my $result =
+        $lh_results->to_number->value
+            +
+        $rh_results->to_number->value
+            ;
+    return XML::XPath::Number->new($result);
+}
+
+sub op_minus {
+    my ($node, $lhs, $rhs) = @_;
+    my $lh_results = $lhs->evaluate($node);
+    my $rh_results = $rhs->evaluate($node);
+    
+    my $result =
+        $lh_results->to_number->value
+            -
+        $rh_results->to_number->value
+            ;
+    return XML::XPath::Number->new($result);
+}
+
+sub op_div {
+    my ($node, $lhs, $rhs) = @_;
+    my $lh_results = $lhs->evaluate($node);
+    my $rh_results = $rhs->evaluate($node);
+
+    my $result = eval {
+        $lh_results->to_number->value
+            /
+        $rh_results->to_number->value
+            ;
+    };
+    if ($@) {
+        # assume divide by zero
+        # This is probably a terrible way to handle this! 
+        # Ah well... who wants to live forever...
+        return XML::XPath::Literal->new('Infinity');
+    }
+    return XML::XPath::Number->new($result);
+}
+
+sub op_mod {
+    my ($node, $lhs, $rhs) = @_;
+    my $lh_results = $lhs->evaluate($node);
+    my $rh_results = $rhs->evaluate($node);
+    
+    my $result =
+        $lh_results->to_number->value
+            %
+        $rh_results->to_number->value
+            ;
+    return XML::XPath::Number->new($result);
+}
+
+sub op_mult {
+    my ($node, $lhs, $rhs) = @_;
+    my $lh_results = $lhs->evaluate($node);
+    my $rh_results = $rhs->evaluate($node);
+    
+    my $result =
+        $lh_results->to_number->value
+            *
+        $rh_results->to_number->value
+            ;
+    return XML::XPath::Number->new($result);
+}
+
+sub op_union {
+    my ($node, $lhs, $rhs) = @_;
+    my $lh_result = $lhs->evaluate($node);
+    my $rh_result = $rhs->evaluate($node);
+    
+    if ($lh_result->isa('XML::XPath::NodeSet') &&
+            $rh_result->isa('XML::XPath::NodeSet')) {
+        my %found;
+        my $results = XML::XPath::NodeSet->new;
+        foreach my $lhnode ($lh_result->get_nodelist) {
+            $found{"$lhnode"}++;
+            $results->push($lhnode);
+        }
+        foreach my $rhnode ($rh_result->get_nodelist) {
+            $results->push($rhnode)
+                    unless exists $found{"$rhnode"};
+        }
+                $results->sort;
+        return $results;
+    }
+    die "Both sides of a union must be Node Sets\n";
+}
+
+sub filter_by_predicate {
+    my $self = shift;
+    my ($nodeset, $predicate) = @_;
+    
+    # See spec section 2.4, paragraphs 2 & 3:
+    # For each node in the node-set to be filtered, the predicate Expr
+    # is evaluated with that node as the context node, with the number
+    # of nodes in the node set as the context size, and with the
+    # proximity position of the node in the node set with respect to
+    # the axis as the context position.
+    
+    if (!ref($nodeset)) { # use ref because nodeset has a bool context
+        die "No nodeset!!!";
+    }
+    
+#    warn "Filter by predicate: $predicate\n";
+    
+    my $newset = XML::XPath::NodeSet->new();
+    
+    for(my $i = 1; $i <= $nodeset->size; $i++) {
+        # set context set each time 'cos a loc-path in the expr could change it
+        $self->{pp}->set_context_set($nodeset);
+        $self->{pp}->set_context_pos($i);
+        my $result = $predicate->evaluate($nodeset->get_node($i));
+        if ($result->isa('XML::XPath::Boolean')) {
+            if ($result->value) {
+                $newset->push($nodeset->get_node($i));
+            }
+        }
+        elsif ($result->isa('XML::XPath::Number')) {
+            if ($result->value == $i) {
+                $newset->push($nodeset->get_node($i));
+            }
+        }
+        else {
+            if ($result->to_boolean->value) {
+                $newset->push($nodeset->get_node($i));
+            }
+        }
+    }
+    
+    return $newset;
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Function.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Function.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Function.pm	(revision 24799)
@@ -0,0 +1,392 @@
+# $Id: Function.pm 7909 2004-08-06 05:11:55Z mdewsnip $
+
+package XML::XPath::Function;
+use XML::XPath::Number;
+use XML::XPath::Literal;
+use XML::XPath::Boolean;
+use XML::XPath::NodeSet;
+use XML::XPath::Node::Attribute;
+use strict;
+
+sub new {
+    my $class = shift;
+    my ($pp, $name, $params) = @_;
+    bless { 
+        pp => $pp, 
+        name => $name, 
+        params => $params 
+        }, $class;
+}
+
+sub as_string {
+    my $self = shift;
+    my $string = $self->{name} . "(";
+    my $second;
+    foreach (@{$self->{params}}) {
+        $string .= "," if $second++;
+        $string .= $_->as_string;
+    }
+    $string .= ")";
+    return $string;
+}
+
+sub as_xml {
+    my $self = shift;
+    my $string = "<Function name=\"$self->{name}\"";
+    my $params = "";
+    foreach (@{$self->{params}}) {
+        $params .= "<Param>" . $_->as_string . "</Param>\n";
+    }
+    if ($params) {
+        $string .= ">\n$params</Function>\n";
+    }
+    else {
+        $string .= " />\n";
+    }
+    
+    return $string;
+}
+
+sub evaluate {
+    my $self = shift;
+    my $node = shift;
+    if ($node->isa('XML::XPath::NodeSet')) {
+        $node = $node->get_node(1);
+    }
+    my @params;
+    foreach my $param (@{$self->{params}}) {
+        my $results = $param->evaluate($node);
+        push @params, $results;
+    }
+    $self->_execute($self->{name}, $node, @params);
+}
+
+sub _execute {
+    my $self = shift;
+    my ($name, $node, @params) = @_;
+    $name =~ s/-/_/g;
+    no strict 'refs';
+    $self->$name($node, @params);
+}
+
+# All functions should return one of:
+# XML::XPath::Number
+# XML::XPath::Literal (string)
+# XML::XPath::NodeSet
+# XML::XPath::Boolean
+
+### NODESET FUNCTIONS ###
+
+sub last {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "last: function doesn't take parameters\n" if (@params);
+    return XML::XPath::Number->new($self->{pp}->get_context_size);
+}
+
+sub position {
+    my $self = shift;
+    my ($node, @params) = @_;
+    if (@params) {
+        die "position: function doesn't take parameters [ ", @params, " ]\n";
+    }
+    # return pos relative to axis direction
+    return XML::XPath::Number->new($self->{pp}->get_context_pos);
+}
+
+sub count {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "count: Parameter must be a NodeSet\n" unless $params[0]->isa('XML::XPath::NodeSet');
+    return XML::XPath::Number->new($params[0]->size);
+}
+
+sub id {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "id: Function takes 1 parameter\n" unless @params == 1;
+    my $results = XML::XPath::NodeSet->new();
+    if ($params[0]->isa('XML::XPath::NodeSet')) {
+        # result is the union of applying id() to the
+        # string value of each node in the nodeset.
+        foreach my $node ($params[0]->get_nodelist) {
+            my $string = $node->string_value;
+            $results->append($self->id($node, XML::XPath::Literal->new($string)));
+        }
+    }
+    else { # The actual id() function...
+        my $string = $self->string($node, $params[0]);
+        $_ = $string->value; # get perl scalar
+        my @ids = split; # splits $_
+        foreach my $id (@ids) {
+            if (my $found = $node->getElementById($id)) {
+                $results->push($found);
+            }
+        }
+    }
+    return $results;
+}
+
+sub local_name {
+    my $self = shift;
+    my ($node, @params) = @_;
+    if (@params > 1) {
+        die "name() function takes one or no parameters\n";
+    }
+    elsif (@params) {
+        my $nodeset = shift(@params);
+        $node = $nodeset->get_node(1);
+    }
+    
+    return XML::XPath::Literal->new($node->getLocalName);
+}
+
+sub namespace_uri {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "namespace-uri: Function not supported\n";
+}
+
+sub name {
+    my $self = shift;
+    my ($node, @params) = @_;
+    if (@params > 1) {
+        die "name() function takes one or no parameters\n";
+    }
+    elsif (@params) {
+        my $nodeset = shift(@params);
+        $node = $nodeset->get_node(1);
+    }
+    
+    return XML::XPath::Literal->new($node->getName);
+}
+
+### STRING FUNCTIONS ###
+
+sub string {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "string: Too many parameters\n" if @params > 1;
+    if (@params) {
+        return XML::XPath::Literal->new($params[0]->string_value);
+    }
+    
+    # TODO - this MUST be wrong! - not sure now. -matt
+    return XML::XPath::Literal->new($node->string_value);
+    # default to nodeset with just $node in.
+}
+
+sub concat {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "concat: Too few parameters\n" if @params < 2;
+    my $string = join('', map {$_->string_value} @params);
+    return XML::XPath::Literal->new($string);
+}
+
+sub starts_with {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "starts-with: incorrect number of params\n" unless @params == 2;
+    my ($string1, $string2) = ($params[0]->string_value, $params[1]->string_value);
+    if (substr($string1, 0, length($string2)) eq $string2) {
+        return XML::XPath::Boolean->True;
+    }
+    return XML::XPath::Boolean->False;
+}
+
+sub contains {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "starts-with: incorrect number of params\n" unless @params == 2;
+    my $value = $params[1]->string_value;
+    if ($params[0]->string_value =~ /(.*?)\Q$value\E(.*)/) {
+        # $1 and $2 stored for substring funcs below
+        # TODO: Fix this nasty implementation!
+        return XML::XPath::Boolean->True;
+    }
+    return XML::XPath::Boolean->False;
+}
+
+sub substring_before {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "starts-with: incorrect number of params\n" unless @params == 2;
+    if ($self->contains($node, @params)->value) {
+        return XML::XPath::Literal->new($1); # hope that works!
+    }
+    else {
+        return XML::XPath::Literal->new('');
+    }
+}
+
+sub substring_after {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "starts-with: incorrect number of params\n" unless @params == 2;
+    if ($self->contains($node, @params)->value) {
+        return XML::XPath::Literal->new($2);
+    }
+    else {
+        return XML::XPath::Literal->new('');
+    }
+}
+
+sub substring {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "substring: Wrong number of parameters\n" if (@params < 2 || @params > 3);
+    my ($str, $offset, $len);
+    $str = $params[0]->string_value;
+    $offset = $params[1]->value;
+    $offset--; # uses 1 based offsets
+    if (@params == 3) {
+        $len = $params[2]->value;
+    }
+    return XML::XPath::Literal->new(substr($str, $offset, $len));
+}
+
+sub string_length {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "string-length: Wrong number of params\n" if @params > 1;
+    if (@params) {
+        return XML::XPath::Number->new(length($params[0]->string_value));
+    }
+    else {
+        return XML::XPath::Number->new(
+                length($node->string_value)
+                );
+    }
+}
+
+sub normalize_space {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "normalize-space: Wrong number of params\n" if @params > 1;
+    my $str;
+    if (@params) {
+        $str = $params[0]->string_value;
+    }
+    else {
+        $str = $node->string_value;
+    }
+    $str =~ s/^\s*//;
+    $str =~ s/\s*$//;
+    $str =~ s/\s+/ /g;
+    return XML::XPath::Literal->new($str);
+}
+
+sub translate {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "translate: Wrong number of params\n" if @params != 3;
+    local $_ = $params[0]->string_value;
+    my $find = $params[1]->string_value;
+    my $repl = $params[2]->string_value;
+    eval "tr/\\Q$find\\E/\\Q$repl\\E/d, 1" or die $@;
+    return XML::XPath::Literal->new($_);
+}
+
+### BOOLEAN FUNCTIONS ###
+
+sub boolean {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "boolean: Incorrect number of parameters\n" if @params != 1;
+    return $params[0]->to_boolean;
+}
+
+sub not {
+    my $self = shift;
+    my ($node, @params) = @_;
+    $params[0] = $params[0]->to_boolean unless $params[0]->isa('XML::XPath::Boolean');
+    $params[0]->value ? XML::XPath::Boolean->False : XML::XPath::Boolean->True;
+}
+
+sub true {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "true: function takes no parameters\n" if @params > 0;
+    XML::XPath::Boolean->True;
+}
+
+sub false {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "true: function takes no parameters\n" if @params > 0;
+    XML::XPath::Boolean->False;
+}
+
+sub lang {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "lang: function takes 1 parameter\n" if @params != 1;
+    my $lang = $node->findvalue('(ancestor-or-self::*[@xml:lang]/@xml:lang)[last()]');
+    my $lclang = lc($params[0]->string_value);
+    # warn("Looking for lang($lclang) in $lang\n");
+    if (substr(lc($lang), 0, length($lclang)) eq $lclang) {
+        return XML::XPath::Boolean->True;
+    }
+    else {
+        return XML::XPath::Boolean->False;
+    }
+}
+
+### NUMBER FUNCTIONS ###
+
+sub number {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "number: Too many parameters\n" if @params > 1;
+    if (@params) {
+        if ($params[0]->isa('XML::XPath::Node')) {
+            return XML::XPath::Number->new(
+                    $params[0]->string_value
+                    );
+        }
+        return $params[0]->to_number;
+    }
+    
+    return XML::XPath::Number->new( $node->string_value );
+}
+
+sub sum {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "sum: Parameter must be a NodeSet\n" unless $params[0]->isa('XML::XPath::NodeSet');
+    my $sum = 0;
+    foreach my $node ($params[0]->get_nodelist) {
+        $sum += $self->number($node)->value;
+    }
+    return XML::XPath::Number->new($sum);
+}
+
+sub floor {
+    my $self = shift;
+    my ($node, @params) = @_;
+    require POSIX;
+    my $num = $self->number($node, @params);
+    return XML::XPath::Number->new(
+            POSIX::floor($num->value));
+}
+
+sub ceiling {
+    my $self = shift;
+    my ($node, @params) = @_;
+    require POSIX;
+    my $num = $self->number($node, @params);
+    return XML::XPath::Number->new(
+            POSIX::ceil($num->value));
+}
+
+sub round {
+    my $self = shift;
+    my ($node, @params) = @_;
+    my $num = $self->number($node, @params);
+    require POSIX;
+    return XML::XPath::Number->new(
+            POSIX::floor($num->value + 0.5)); # Yes, I know the spec says don't do this...
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Literal.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Literal.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Literal.pm	(revision 24799)
@@ -0,0 +1,99 @@
+# $Id: Literal.pm 7909 2004-08-06 05:11:55Z mdewsnip $
+
+package XML::XPath::Literal;
+use XML::XPath::Boolean;
+use XML::XPath::Number;
+use strict;
+
+use overload 
+		'""' => \&value,
+		'cmp' => \&cmp;
+
+sub new {
+	my $class = shift;
+	my ($string) = @_;
+	
+#	$string =~ s/&quot;/"/g;
+#	$string =~ s/&apos;/'/g;
+	
+	bless \$string, $class;
+}
+
+sub as_string {
+	my $self = shift;
+	my $string = $$self;
+	$string =~ s/'/&apos;/g;
+	return "'$string'";
+}
+
+sub as_xml {
+    my $self = shift;
+    my $string = $$self;
+    return "<Literal>$string</Literal>\n";
+}
+
+sub value {
+	my $self = shift;
+	$$self;
+}
+
+sub cmp {
+	my $self = shift;
+	my ($cmp, $swap) = @_;
+	if ($swap) {
+		return $cmp cmp $$self;
+	}
+	return $$self cmp $cmp;
+}
+
+sub evaluate {
+	my $self = shift;
+	$self;
+}
+
+sub to_boolean {
+	my $self = shift;
+	return (length($$self) > 0) ? XML::XPath::Boolean->True : XML::XPath::Boolean->False;
+}
+
+sub to_number { return XML::XPath::Number->new($_[0]->value); }
+sub to_literal { return $_[0]; }
+
+sub string_value { return $_[0]->value; }
+
+1;
+__END__
+
+=head1 NAME
+
+XML::XPath::Literal - Simple string values.
+
+=head1 DESCRIPTION
+
+In XPath terms a Literal is what we know as a string.
+
+=head1 API
+
+=head2 new($string)
+
+Create a new Literal object with the value in $string. Note that &quot; and
+&apos; will be converted to " and ' respectively. That is not part of the XPath
+specification, but I consider it useful. Note though that you have to go
+to extraordinary lengths in an XML template file (be it XSLT or whatever) to
+make use of this:
+
+	<xsl:value-of select="&quot;I'm feeling &amp;quot;sad&amp;quot;&quot;"/>
+
+Which produces a Literal of:
+
+	I'm feeling "sad"
+
+=head2 value()
+
+Also overloaded as stringification, simply returns the literal string value.
+
+=head2 cmp($literal)
+
+Returns the equivalent of perl's cmp operator against the given $literal.
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/LocationPath.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/LocationPath.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/LocationPath.pm	(revision 24799)
@@ -0,0 +1,61 @@
+# $Id: LocationPath.pm 7909 2004-08-06 05:11:55Z mdewsnip $
+
+package XML::XPath::LocationPath;
+use XML::XPath::Root;
+use strict;
+
+sub new {
+	my $class = shift;
+	my $self = [];
+	bless $self, $class;
+}
+
+sub as_string {
+	my $self = shift;
+	my $string;
+	for (my $i = 0; $i < @$self; $i++) {
+		$string .= $self->[$i]->as_string;
+		$string .= "/" if $self->[$i+1];
+	}
+	return $string;
+}
+
+sub as_xml {
+    my $self = shift;
+    my $string = "<LocationPath>\n";
+    
+    for (my $i = 0; $i < @$self; $i++) {
+        $string .= $self->[$i]->as_xml;
+    }
+    
+    $string .= "</LocationPath>\n";
+    return $string;
+}
+
+sub set_root {
+	my $self = shift;
+	unshift @$self, XML::XPath::Root->new();
+}
+
+sub evaluate {
+	my $self = shift;
+	# context _MUST_ be a single node
+	my $context = shift;
+	die "No context" unless $context;
+	
+	# I _think_ this is how it should work :)
+	
+	my $nodeset = XML::XPath::NodeSet->new();
+	$nodeset->push($context);
+	
+	foreach my $step (@$self) {
+		# For each step
+		# evaluate the step with the nodeset
+		my $pos = 1;
+		$nodeset = $step->evaluate($nodeset);
+	}
+	
+	return $nodeset;
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Node.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Node.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Node.pm	(revision 24799)
@@ -0,0 +1,592 @@
+# $Id: Node.pm 7909 2004-08-06 05:11:55Z mdewsnip $
+
+package XML::XPath::Node;
+
+use strict;
+use vars qw(@ISA @EXPORT $AUTOLOAD %EXPORT_TAGS @EXPORT_OK);
+use Exporter;
+use Carp;
+@ISA = ('Exporter');
+
+sub UNKNOWN_NODE () {0;}
+sub ELEMENT_NODE () {1;}
+sub ATTRIBUTE_NODE () {2;}
+sub TEXT_NODE () {3;}
+sub CDATA_SECTION_NODE () {4;}
+sub ENTITY_REFERENCE_NODE () {5;}
+sub ENTITY_NODE () {6;}
+sub PROCESSING_INSTRUCTION_NODE () {7;}
+sub COMMENT_NODE () {8;}
+sub DOCUMENT_NODE () {9;}
+sub DOCUMENT_TYPE_NODE () {10;}
+sub DOCUMENT_FRAGMENT_NODE () {11;}
+sub NOTATION_NODE () {12;}
+
+# Non core DOM stuff
+sub ELEMENT_DECL_NODE () {13;}
+sub ATT_DEF_NODE () {14;}
+sub XML_DECL_NODE () {15;}
+sub ATTLIST_DECL_NODE () {16;}
+sub NAMESPACE_NODE () {17;}
+
+# per-node constants
+
+# All
+sub node_parent () { 0; }
+sub node_pos () { 1; }
+sub node_global_pos () { 2; }
+
+# Element
+sub node_prefix () { 3; }
+sub node_children () { 4; }
+sub node_name () { 5; }
+sub node_attribs () { 6; }
+sub node_namespaces () { 7; }
+sub node_ids () { 8; }
+
+# Char
+sub node_text () { 3; }
+
+# PI
+sub node_target () { 3; }
+sub node_data () { 4; }
+
+# Comment
+sub node_comment () { 3; }
+
+# Attribute
+# sub node_prefix () { 3; }
+sub node_key () { 4; }
+sub node_value () { 5; }
+
+# Namespaces
+# sub node_prefix () { 3; }
+sub node_expanded () { 4; }
+
+@EXPORT = qw(
+    UNKNOWN_NODE
+    ELEMENT_NODE
+    ATTRIBUTE_NODE
+    TEXT_NODE
+    CDATA_SECTION_NODE
+    ENTITY_REFERENCE_NODE
+    ENTITY_NODE
+    PROCESSING_INSTRUCTION_NODE
+    COMMENT_NODE
+    DOCUMENT_NODE
+    DOCUMENT_TYPE_NODE
+    DOCUMENT_FRAGMENT_NODE
+    NOTATION_NODE
+    ELEMENT_DECL_NODE
+    ATT_DEF_NODE
+    XML_DECL_NODE
+    ATTLIST_DECL_NODE
+    NAMESPACE_NODE
+    );
+
+@EXPORT_OK = qw(
+            node_parent
+            node_pos
+            node_global_pos
+            node_prefix
+            node_children
+            node_name
+            node_attribs
+            node_namespaces
+            node_text
+            node_target
+            node_data
+            node_comment
+            node_key
+            node_value
+            node_expanded
+                        node_ids
+        );
+
+%EXPORT_TAGS = (
+    'node_keys' => [
+        qw(
+            node_parent
+            node_pos
+            node_global_pos
+            node_prefix
+            node_children
+            node_name
+            node_attribs
+            node_namespaces
+            node_text
+            node_target
+            node_data
+            node_comment
+            node_key
+            node_value
+            node_expanded
+                        node_ids
+        ), @EXPORT,
+    ],
+);
+
+
+my $global_pos = 0;
+
+sub nextPos {
+    my $class = shift;
+    return $global_pos += 5;
+}
+
+sub resetPos {
+    $global_pos = 0;
+}
+
+my %DecodeDefaultEntity =
+(
+ '"' => "&quot;",
+ ">" => "&gt;",
+ "<" => "&lt;",
+ "'" => "&apos;",
+ "&" => "&amp;"
+);
+
+sub XMLescape {
+    my ($str, $default) = @_;
+    return undef unless defined $str;
+    $default ||= '';
+    
+    if ($XML::XPath::EncodeUtf8AsEntity) {
+        $str =~ s/([\xC0-\xDF].|[\xE0-\xEF]..|[\xF0-\xFF]...)|([$default])|(]]>)/
+        defined($1) ? XmlUtf8Decode ($1) : 
+        defined ($2) ? $DecodeDefaultEntity{$2} : "]]&gt;" /egsx;
+    }
+    else {
+        $str =~ s/([$default])|(]]>)/
+        defined ($1) ? $DecodeDefaultEntity{$1} : ']]&gt;' /gsex;
+    }
+
+#?? could there be references that should not be expanded?
+# e.g. should not replace &#nn; &#xAF; and &abc;
+#    $str =~ s/&(?!($ReName|#[0-9]+|#x[0-9a-fA-F]+);)/&amp;/go;
+
+    $str;
+}
+
+#
+# Opposite of XmlUtf8Decode plus it adds prefix "&#" or "&#x" and suffix ";"
+# The 2nd parameter ($hex) indicates whether the result is hex encoded or not.
+#
+sub XmlUtf8Decode
+{
+    my ($str, $hex) = @_;
+    my $len = length ($str);
+    my $n;
+
+    if ($len == 2) {
+        my @n = unpack "C2", $str;
+        $n = (($n[0] & 0x3f) << 6) + ($n[1] & 0x3f);
+    }
+    elsif ($len == 3) {
+        my @n = unpack "C3", $str;
+        $n = (($n[0] & 0x1f) << 12) + (($n[1] & 0x3f) << 6) + 
+            ($n[2] & 0x3f);
+    }
+    elsif ($len == 4) {
+        my @n = unpack "C4", $str;
+        $n = (($n[0] & 0x0f) << 18) + (($n[1] & 0x3f) << 12) + 
+            (($n[2] & 0x3f) << 6) + ($n[3] & 0x3f);
+    }
+    elsif ($len == 1) {    # just to be complete...
+        $n = ord ($str);
+    }
+    else {
+        die "bad value [$str] for XmlUtf8Decode";
+    }
+    $hex ? sprintf ("&#x%x;", $n) : "&#$n;";
+}
+
+sub new {
+    my $class = shift;
+    no strict 'refs';
+    my $impl = $class . "Impl";
+    my $this = $impl->new(@_);
+    if ($XML::XPath::SafeMode) {
+        return $this;
+    }
+    my $self = \$this;
+    return bless $self, $class;
+}
+
+sub AUTOLOAD {
+    my $method = $AUTOLOAD;
+    $method =~ s/.*:://;
+#    warn "AUTOLOAD $method!\n";
+    no strict 'refs';
+    *{$AUTOLOAD} = sub { 
+        my $self = shift;
+        my $olderror = $@; # store previous exceptions
+        my $obj = eval { $$self };
+        if ($@) {
+            if ($@ =~ /Not a SCALAR reference/) {
+                croak("No such method $method in " . ref($self));
+            }
+            croak $@;
+        }
+        if ($obj) {
+            # make sure $@ propogates if this method call was the result
+            # of losing scope because of a die().
+            if ($method =~ /^(DESTROY|del_parent_link)$/) {
+                $obj->$method(@_);
+                $@ = $olderror if $olderror;
+                return;
+            }
+            return $obj->$method(@_);
+        }
+    };
+    goto &$AUTOLOAD;
+}
+
+package XML::XPath::NodeImpl;
+
+use vars qw/@ISA $AUTOLOAD/;
+@ISA = ('XML::XPath::Node');
+
+sub new {
+    die "Virtual base method";
+}
+
+sub getNodeType {
+    my $self = shift;
+    return XML::XPath::Node::UNKNOWN_NODE;
+}
+
+sub isElementNode {}
+sub isAttributeNode {}
+sub isNamespaceNode {}
+sub isTextNode {}
+sub isProcessingInstructionNode {}
+sub isPINode {}
+sub isCommentNode {}
+
+sub getNodeValue {
+    return;
+}
+
+sub getValue {
+    shift->getNodeValue(@_);
+}
+
+sub setNodeValue {
+    return;
+}
+
+sub setValue {
+    shift->setNodeValue(@_);
+}
+
+sub getParentNode {
+    my $self = shift;
+    return $self->[XML::XPath::Node::node_parent];
+}
+
+sub getRootNode {
+    my $self = shift;
+    while (my $parent = $self->getParentNode) {
+        $self = $parent;
+    }
+    return $self;
+}
+
+sub getElementById {
+    my $self = shift;
+    my ($id) = @_;
+#    warn "getElementById: $id\n";
+    my $root = $self->getRootNode;
+    my $node = $root->[XML::XPath::Node::node_ids]{$id};
+#    warn "returning node: ", $node->getName, "\n";
+    return $node;
+}
+
+sub getName { }
+sub getData { }
+
+sub getChildNodes {
+    return wantarray ? () : [];
+}
+
+sub getChildNode {
+    return;
+}
+
+sub getAttribute {
+    return;
+}
+
+sub getAttributes {
+    return wantarray ? () : [];
+}
+
+sub getAttributeNodes {
+    shift->getAttributes(@_);
+}
+
+sub getNamespaceNodes {
+    return wantarray ? () : [];
+}
+
+sub getNamespace {
+    return;
+}
+
+sub getLocalName {
+    return;
+}
+
+sub string_value { return; }
+
+sub get_pos {
+    my $self = shift;
+    return $self->[XML::XPath::Node::node_pos];
+}
+
+sub set_pos {
+    my $self = shift;
+    $self->[XML::XPath::Node::node_pos] = shift;
+}
+
+sub get_global_pos {
+    my $self = shift;
+    return $self->[XML::XPath::Node::node_global_pos];
+}
+
+sub set_global_pos {
+    my $self = shift;
+    $self->[XML::XPath::Node::node_global_pos] = shift;
+}
+
+sub renumber {
+    my $self = shift;
+    my $search = shift;
+    my $diff = shift;
+    
+    foreach my $node ($self->findnodes($search)) {
+        $node->set_global_pos(
+                $node->get_global_pos + $diff
+                );
+    }
+}
+    
+sub insertAfter {
+    my $self = shift;
+    my $newnode = shift;
+    my $posnode = shift;
+
+    my $pos_number = eval { $posnode->[XML::XPath::Node::node_children][-1]->get_global_pos() + 1; };
+    if (!defined $pos_number) {
+        $pos_number = $posnode->get_global_pos() + 1;
+    }
+    
+    eval {
+        if ($pos_number == 
+                $posnode->findnodes(
+                    'following::node()'
+                    )->get_node(1)->get_global_pos()) {
+            $posnode->renumber('following::node()', +5);
+        }
+    };
+    
+    my $pos = $posnode->get_pos;
+    
+    $newnode->setParentNode($self);
+    splice @{$self->[XML::XPath::Node::node_children]}, $pos + 1, 0, $newnode;
+    
+    for (my $i = $pos + 1; $i < @{$self->[XML::XPath::Node::node_children]}; $i++) {
+        $self->[XML::XPath::Node::node_children][$i]->set_pos($i);
+    }
+    
+    $newnode->set_global_pos($pos_number);
+}
+
+sub insertBefore {
+    my $self = shift;
+    my $newnode = shift;
+    my $posnode = shift;
+    
+    my $pos_number = ($posnode->getPreviousSibling() || $posnode->getParentNode)->get_global_pos();
+    if ($pos_number == $posnode->get_global_pos()) {
+        $posnode->renumber('self::node() | descendant::node() | following::node()', +5);
+    }
+    
+    my $pos = $posnode->get_pos;
+    
+    $newnode->setParentNode($self);
+    splice @{$self->[XML::XPath::Node::node_children]}, $pos, 0, $newnode;
+    
+    for (my $i = $pos; $i < @{$self->[XML::XPath::Node::node_children]}; $i++) {
+        $self->[XML::XPath::Node::node_children][$i]->set_pos($i);
+    }
+    
+    $newnode->set_global_pos($pos_number);
+}
+
+sub getPreviousSibling {
+    my $self = shift;
+    my $pos = $self->[XML::XPath::Node::node_pos];
+    return unless $self->[XML::XPath::Node::node_parent];
+    return $self->[XML::XPath::Node::node_parent]->getChildNode($pos);
+}
+
+sub getNextSibling {
+    my $self = shift;
+    my $pos = $self->[XML::XPath::Node::node_pos];
+    return unless $self->[XML::XPath::Node::node_parent];
+    return $self->[XML::XPath::Node::node_parent]->getChildNode($pos + 2);
+}
+
+sub setParentNode {
+    my $self = shift;
+    my $parent = shift;
+#    warn "SetParent of ", ref($self), " to ", $parent->[XML::XPath::Node::node_name], "\n";
+    $self->[XML::XPath::Node::node_parent] = $parent;
+}
+
+sub del_parent_link {
+    my $self = shift;
+    $self->[XML::XPath::Node::node_parent] = undef;
+}
+
+sub dispose {
+    my $self = shift;
+    foreach my $kid ($self->getChildNodes) {
+        $kid->dispose;
+    }
+    foreach my $kid ($self->getAttributeNodes) {
+        $kid->dispose;
+    }
+    foreach my $kid ($self->getNamespaceNodes) {
+        $kid->dispose;
+    }
+    $self->[XML::XPath::Node::node_parent] = undef;
+}
+
+sub to_number {
+    my $num = shift->string_value;
+    return XML::XPath::Number->new($num);
+}
+
+sub find {
+    my $node = shift;
+    my ($path) = @_;
+    my $xp = XML::XPath->new(); # new is v. lightweight
+    return $xp->find($path, $node);
+}
+
+sub findvalue {
+    my $node = shift;
+    my ($path) = @_;
+    my $xp = XML::XPath->new();
+    return $xp->findvalue($path, $node);
+}
+
+sub findnodes {
+    my $node = shift;
+    my ($path) = @_;
+    my $xp = XML::XPath->new();
+    return $xp->findnodes($path, $node);
+}
+
+sub matches {
+    my $node = shift;
+    my ($path, $context) = @_;
+    my $xp = XML::XPath->new();
+    return $xp->matches($node, $path, $context);
+}
+
+sub to_sax {
+    my $self = shift;
+    unshift @_, 'Handler' if @_ == 1;
+    my %handlers = @_;
+    
+    my $doch = $handlers{DocumentHandler} || $handlers{Handler};
+    my $dtdh = $handlers{DTDHandler} || $handlers{Handler};
+    my $enth = $handlers{EntityResolver} || $handlers{Handler};
+
+    $self->_to_sax ($doch, $dtdh, $enth);
+}
+
+sub DESTROY {}
+
+use Carp;
+
+sub _to_sax {
+    carp "_to_sax not implemented in ", ref($_[0]);
+}
+
+1;
+__END__
+
+=head1 NAME
+
+XML::XPath::Node - internal representation of a node
+
+=head1 API
+
+The Node API aims to emulate DOM to some extent, however the API
+isn't quite compatible with DOM. This is to ease transition from
+XML::DOM programming to XML::XPath. Compatibility with DOM may
+arise once XML::DOM gets namespace support.
+
+=head2 new
+
+Creates a new node. See the sub-classes for parameters to pass to new().
+
+=head2 getNodeType
+
+Returns one of ELEMENT_NODE, TEXT_NODE, COMMENT_NODE, ATTRIBUTE_NODE,
+PROCESSING_INSTRUCTION_NODE or NAMESPACE_NODE. UNKNOWN_NODE is returned
+if the sub-class doesn't implement getNodeType - but that means
+something is broken! The constants are exported by default from
+XML::XPath::Node. The constants have the same numeric value as the
+XML::DOM versions.
+
+=head2 getParentNode
+
+Returns the parent of this node, or undef if this is the root node. Note
+that the root node is the root node in terms of XPath - not the root
+element node.
+
+=head2 to_sax ( $handler | %handlers )
+
+Generates sax calls to the handler or handlers. See the PerlSAX docs for
+details (not yet implemented correctly).
+
+=head1 MORE INFO
+
+See the sub-classes for the meaning of the rest of the API:
+
+=over 4
+
+=item *
+
+L<XML::XPath::Node::Element>
+
+=item *
+
+L<XML::XPath::Node::Attribute>
+
+=item *
+
+L<XML::XPath::Node::Namespace>
+
+=item *
+
+L<XML::XPath::Node::Text>
+
+=item *
+
+L<XML::XPath::Node::Comment>
+
+=item *
+
+L<XML::XPath::Node::PI>
+
+=back
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Node/Attribute.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Node/Attribute.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Node/Attribute.pm	(revision 24799)
@@ -0,0 +1,135 @@
+# $Id: Attribute.pm 7909 2004-08-06 05:11:55Z mdewsnip $
+
+package XML::XPath::Node::Attribute;
+
+use strict;
+use vars qw/@ISA/;
+
+@ISA = ('XML::XPath::Node');
+
+package XML::XPath::Node::AttributeImpl;
+
+use vars qw/@ISA/;
+@ISA = ('XML::XPath::NodeImpl', 'XML::XPath::Node::Attribute');
+use XML::XPath::Node ':node_keys';
+
+sub new {
+	my $class = shift;
+	my ($key, $val, $prefix) = @_;
+	
+        my $pos = XML::XPath::Node->nextPos;
+        
+        my @vals;
+        @vals[node_global_pos, node_prefix, node_key, node_value] =
+                ($pos, $prefix, $key, $val);
+	my $self = \@vals;
+        
+	bless $self, $class;
+	
+}
+
+sub getNodeType { ATTRIBUTE_NODE }
+
+sub isAttributeNode { 1; }
+
+sub getName {
+    my $self = shift;
+    $self->[node_key];
+}
+
+sub getLocalName {
+    my $self = shift;
+    my $local = $self->[node_key];
+    $local =~ s/.*://;
+    return $local;
+}
+
+sub getNodeValue {
+    my $self = shift;
+    $self->[node_value];
+}
+
+sub getData {
+    shift->getNodeValue(@_);
+}
+
+sub setNodeValue {
+    my $self = shift;
+    $self->[node_value] = shift;
+}
+
+sub getPrefix {
+	my $self = shift;
+	$self->[node_prefix];
+}
+
+sub string_value {
+	my $self = shift;
+	return $self->[node_value];
+}
+
+sub toString {
+	my $self = shift;
+	my $string = ' ';
+# 	if ($self->[node_prefix]) {
+# 		$string .= $self->[node_prefix] . ':';
+# 	}
+	$string .= join('',
+					$self->[node_key],
+					'="',
+					XML::XPath::Node::XMLescape($self->[node_value], '"&><'),
+					'"');
+	return $string;
+}
+
+sub getNamespace {
+    my $self = shift;
+    my ($prefix) = @_;
+    $prefix ||= $self->getPrefix;
+    if (my $parent = $self->getParentNode) {
+        return $parent->getNamespace($prefix);
+    }
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Attribute - a single attribute
+
+=head1 API
+
+=head2 new ( key, value, prefix )
+
+Create a new attribute node.
+
+=head2 getName
+
+Returns the key for the attribute
+
+=head2 getLocalName
+
+As getName above, but without namespace information
+
+=head2 getNodeValue / getData
+
+Returns the value
+
+=head2 setNodeValue
+
+Sets the value of the attribute node.
+
+=head2 getPrefix
+
+Returns the prefix
+
+=head2 getNamespace
+
+Return the namespace.
+
+=head2 toString
+
+Generates key="value", encoded correctly.
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Node/Comment.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Node/Comment.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Node/Comment.pm	(revision 24799)
@@ -0,0 +1,91 @@
+# $Id: Comment.pm 7909 2004-08-06 05:11:55Z mdewsnip $
+
+package XML::XPath::Node::Comment;
+
+use strict;
+use vars qw/@ISA/;
+
+@ISA = ('XML::XPath::Node');
+
+package XML::XPath::Node::CommentImpl;
+
+use vars qw/@ISA/;
+@ISA = ('XML::XPath::NodeImpl', 'XML::XPath::Node::Comment');
+use XML::XPath::Node ':node_keys';
+
+sub new {
+    my $class = shift;
+    my ($comment) = @_;
+    
+        my $pos = XML::XPath::Node->nextPos;
+        
+        my @vals;
+        @vals[node_global_pos, node_comment] =
+                ($pos, $comment);
+    my $self = \@vals;
+        
+    bless $self, $class;
+}
+
+sub getNodeType { COMMENT_NODE }
+
+sub isCommentNode { 1; }
+
+sub getNodeValue {
+    return shift->[node_comment];
+}
+
+sub getData {
+    shift->getNodeValue;
+}
+
+sub setNodeValue {
+    shift->[node_comment] = shift;
+}
+
+sub _to_sax {
+    my $self = shift;
+    my ($doch, $dtdh, $enth) = @_;
+    
+    $doch->comment( { Data => $self->getValue } );
+}
+
+sub comment_escape {
+    my $data = shift;
+    $data =~ s/--/&#45;&#45;/g;
+    return $data;
+}
+
+sub string_value {
+    my $self = shift;
+    return $self->[node_comment];
+}
+
+sub toString {
+    my $self = shift;
+    return '<!--' . comment_escape($self->[node_comment]) . '-->';
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Comment - an XML comment: <!--comment-->
+
+=head1 API
+
+=head2 new ( data )
+
+Create a new comment node.
+
+=head2 getValue / getData
+
+Returns the value in the comment
+
+=head2 toString
+
+Returns the comment with -- encoded as a numeric entity (if it
+exists in the comment text).
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Node/Element.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Node/Element.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Node/Element.pm	(revision 24799)
@@ -0,0 +1,503 @@
+# $Id: Element.pm 7909 2004-08-06 05:11:55Z mdewsnip $
+
+package XML::XPath::Node::Element;
+
+use strict;
+use vars qw/@ISA/;
+
+@ISA = ('XML::XPath::Node');
+
+package XML::XPath::Node::ElementImpl;
+
+use vars qw/@ISA/;
+@ISA = ('XML::XPath::NodeImpl', 'XML::XPath::Node::Element');
+use XML::XPath::Node ':node_keys';
+
+sub new {
+    my $class = shift;
+    my ($tag, $prefix) = @_;
+        
+    my $pos = XML::XPath::Node->nextPos;
+
+    my @vals;
+    @vals[node_global_pos, node_prefix, node_children, node_name, node_attribs] =
+            ($pos, $prefix, [], $tag, []);
+        
+    my $self = \@vals;
+    bless $self, $class;
+}
+
+sub getNodeType { ELEMENT_NODE }
+
+sub isElementNode { 1; }
+
+sub appendChild {
+    my $self = shift;
+    my $newnode = shift;
+    if (shift) { # called from internal to XML::XPath
+#    warn "AppendChild $newnode to $self\n";
+        push @{$self->[node_children]}, $newnode;
+        $newnode->setParentNode($self);
+        $newnode->set_pos($#{$self->[node_children]});
+    }
+    else {
+        if (@{$self->[node_children]}) {
+            $self->insertAfter($newnode, $self->[node_children][-1]);
+        }
+        else {
+            my $pos_number = $self->get_global_pos() + 1;
+            
+            if (my $brother = $self->getNextSibling()) { # optimisation
+                if ($pos_number == $brother->get_global_pos()) {
+                    $self->renumber('following::node()', +5);
+                }
+            }
+            else {
+                eval {
+                    if ($pos_number == 
+                            $self->findnodes(
+                                'following::node()'
+                                )->get_node(1)->get_global_pos()) {
+                        $self->renumber('following::node()', +5);
+                    }
+                };
+            }
+            
+            push @{$self->[node_children]}, $newnode;
+            $newnode->setParentNode($self);
+            $newnode->set_pos($#{$self->[node_children]});
+            $newnode->set_global_pos($pos_number);
+        }
+    }
+}
+
+sub removeChild {
+    my $self = shift;
+    my $delnode = shift;
+    
+    my $pos = $delnode->get_pos;
+    
+#    warn "removeChild: $pos\n";
+    
+#    warn "children: ", scalar @{$self->[node_children]}, "\n";
+    
+#    my $node = $self->[node_children][$pos];
+#    warn "child at $pos is: $node\n";
+    
+    splice @{$self->[node_children]}, $pos, 1;
+    
+#    warn "children now: ", scalar @{$self->[node_children]}, "\n";
+    
+    for (my $i = $pos; $i < @{$self->[node_children]}; $i++) {
+#        warn "Changing pos of child: $i\n";
+        $self->[node_children][$i]->set_pos($i);
+    }
+    
+    $delnode->del_parent_link;
+    
+}
+
+sub appendIdElement {
+    my $self = shift;
+    my ($val, $element) = @_;
+#    warn "Adding '$val' to ID hash\n";
+    $self->[node_ids]{$val} = $element;
+}
+
+sub DESTROY {
+    my $self = shift;
+#    warn "DESTROY ELEMENT: ", $self->[node_name], "\n";
+#    warn "DESTROY ROOT\n" unless $self->[node_name];
+    
+    foreach my $kid ($self->getChildNodes) {
+        $kid && $kid->del_parent_link;
+    }
+    foreach my $attr ($self->getAttributeNodes) {
+        $attr && $attr->del_parent_link;
+    }
+    foreach my $ns ($self->getNamespaceNodes) {
+        $ns && $ns->del_parent_link;
+    }
+#     $self->[node_children] = undef;
+#     $self->[node_attribs] = undef;
+#     $self->[node_namespaces] = undef;
+}
+
+sub getName {
+    my $self = shift;
+    $self->[node_name];
+}
+
+sub getTagName {
+    shift->getName(@_);
+}
+
+sub getLocalName {
+    my $self = shift;
+    my $local = $self->[node_name];
+    $local =~ s/.*://;
+    return $local;
+}
+
+sub getChildNodes {
+    my $self = shift;
+    return wantarray ? @{$self->[node_children]} : $self->[node_children];
+}
+
+sub getChildNode {
+    my $self = shift;
+    my ($pos) = @_;
+    if ($pos < 1 || $pos > @{$self->[node_children]}) {
+        return;
+    }
+    return $self->[node_children][$pos - 1];
+}
+
+sub getFirstChild {
+    my $self = shift;
+    return unless @{$self->[node_children]};
+    return $self->[node_children][0];
+}
+
+sub getLastChild {
+    my $self = shift;
+    return unless @{$self->[node_children]};
+    return $self->[node_children][-1];
+}
+
+sub getAttributeNode {
+    my $self = shift;
+    my ($name) = @_;
+    my $attribs = $self->[node_attribs];
+    foreach my $attr (@$attribs) {
+        return $attr if $attr->getName eq $name;
+    }
+}
+
+sub getAttribute {
+    my $self = shift;
+    my $attr = $self->getAttributeNode(@_);
+    if ($attr) {
+        return $attr->getValue;
+    }
+}
+
+sub getAttributes {
+    my $self = shift;
+    if ($self->[node_attribs]) {
+        return wantarray ? @{$self->[node_attribs]} : $self->[node_attribs];
+    }
+    return wantarray ? () : [];
+}
+
+sub appendAttribute {
+    my $self = shift;
+    my $attribute = shift;
+    
+    if (shift) { # internal call
+        push @{$self->[node_attribs]}, $attribute;
+        $attribute->setParentNode($self);
+        $attribute->set_pos($#{$self->[node_attribs]});
+    }
+    else {
+        my $node_num;
+        if (@{$self->[node_attribs]}) {
+            $node_num = $self->[node_attribs][-1]->get_global_pos() + 1;
+        }
+        else {
+            $node_num = $self->get_global_pos() + 1;
+        }
+        
+        eval {
+            if (@{$self->[node_children]}) {
+                if ($node_num == $self->[node_children][-1]->get_global_pos()) {
+                    $self->renumber('descendant::node() | following::node()', +5);
+                }
+            }
+            elsif ($node_num == 
+                    $self->findnodes('following::node()')->get_node(1)->get_global_pos()) {
+                $self->renumber('following::node()', +5);
+            }
+        };
+        
+        push @{$self->[node_attribs]}, $attribute;
+        $attribute->setParentNode($self);
+        $attribute->set_pos($#{$self->[node_attribs]});
+        $attribute->set_global_pos($node_num);
+        
+    }
+}
+
+sub removeAttribute {
+    my $self = shift;
+    my $attrib = shift;
+    
+    if (!ref($attrib)) {
+        $attrib = $self->getAttributeNode($attrib);
+    }
+    
+    my $pos = $attrib->get_pos;
+    
+    splice @{$self->[node_attribs]}, $pos, 1;
+    
+    for (my $i = $pos; $i < @{$self->[node_attribs]}; $i++) {
+        $self->[node_attribs][$i]->set_pos($i);
+    }
+    
+    $attrib->del_parent_link;
+}
+
+sub setAttribute {
+    my $self = shift;
+    my ($name, $value) = @_;
+    
+    if (my $attrib = $self->getAttributeNode($name)) {
+        $attrib->setNodeValue($value);
+        return $attrib;
+    }
+    
+    my ($nsprefix) = ($name =~ /^($XML::XPath::Parser::NCName):($XML::XPath::Parser::NCName)$/o);
+    
+    if ($nsprefix && !$self->getNamespace($nsprefix)) {
+        die "No namespace matches prefix: $nsprefix";
+    }
+    
+    my $newnode = XML::XPath::Node::Attribute->new($name, $value, $nsprefix);
+    $self->appendAttribute($newnode);
+}
+
+sub setAttributeNode {
+    my $self = shift;
+    my ($node) = @_;
+    
+    if (my $attrib = $self->getAttributeNode($node->getName)) {
+        $attrib->setNodeValue($node->getValue);
+        return $attrib;
+    }
+    
+    my ($nsprefix) = ($node->getName() =~ /^($XML::XPath::Parser::NCName):($XML::XPath::Parser::NCName)$/o);
+    
+    if ($nsprefix && !$self->getNamespace($nsprefix)) {
+        die "No namespace matches prefix: $nsprefix";
+    }
+    
+    $self->appendAttribute($node);
+}
+
+sub getNamespace {
+    my $self = shift;
+    my ($prefix) = @_;
+    $prefix ||= $self->getPrefix || '#default';
+    my $namespaces = $self->[node_namespaces] || [];
+    foreach my $ns (@$namespaces) {
+        return $ns if $ns->getPrefix eq $prefix;
+    }
+    my $parent = $self->getParentNode;
+    
+    return $parent->getNamespace($prefix) if $parent;
+}
+
+sub getNamespaces {
+    my $self = shift;
+    if ($self->[node_namespaces]) {
+        return wantarray ? @{$self->[node_namespaces]} : $self->[node_namespaces];
+    }
+    return wantarray ? () : [];
+}
+
+sub getNamespaceNodes { goto &getNamespaces }
+
+sub appendNamespace {
+    my $self = shift;
+    my ($ns) = @_;
+    push @{$self->[node_namespaces]}, $ns;
+    $ns->setParentNode($self);
+    $ns->set_pos($#{$self->[node_namespaces]});
+}
+
+sub getPrefix {
+    my $self = shift;
+    $self->[node_prefix];
+}
+
+sub getExpandedName {
+    my $self = shift;
+    warn "Expanded name not implemented for ", ref($self), "\n";
+    return;
+}
+
+sub _to_sax {
+    my $self = shift;
+    my ($doch, $dtdh, $enth) = @_;
+    
+    my $tag = $self->getName;
+    my @attr;
+    
+    for my $attr ($self->getAttributes) {
+        push @attr, $attr->getName, $attr->getValue;
+    }
+    
+    my $ns = $self->getNamespace($self->[node_prefix]);
+    if ($ns) {
+        $doch->start_element( 
+                { 
+                Name => $tag,
+                Attributes => { @attr },
+                NamespaceURI => $ns->getExpanded,
+                Prefix => $ns->getPrefix,
+                LocalName => $self->getLocalName,
+                }
+            );
+    }
+    else {
+        $doch->start_element(
+                {
+                Name => $tag,
+                Attributes => { @attr },
+                }
+            );
+    }
+    
+    for my $kid ($self->getChildNodes) {
+        $kid->_to_sax($doch, $dtdh, $enth);
+    }
+    
+    if ($ns) {
+        $doch->end_element( 
+                {
+                Name => $tag,
+                NamespaceURI => $ns->getExpanded,
+                Prefix => $ns->getPrefix,
+                LocalName => $self->getLocalName
+                }
+            );
+    }
+    else {
+        $doch->end_element( { Name => $tag } );
+    }
+}
+
+sub string_value {
+    my $self = shift;
+    my $string = '';
+    foreach my $kid (@{$self->[node_children]}) {
+        if ($kid->getNodeType == ELEMENT_NODE
+                || $kid->getNodeType == TEXT_NODE) {
+            $string .= $kid->string_value;
+        }
+    }
+    return $string;
+}
+
+sub toString {
+    my $self = shift;
+    my $norecurse = shift;
+    my $string = '';
+    if (! $self->[node_name] ) {
+            # root node
+            return join('', map { $_->toString($norecurse) } @{$self->[node_children]});
+    }
+    $string .= "<" . $self->[node_name];
+    
+        $string .= join('', map { $_->toString } @{$self->[node_namespaces]});
+    
+        $string .= join('', map { $_->toString } @{$self->[node_attribs]});
+    
+    if (@{$self->[node_children]}) {
+        $string .= ">";
+
+        if (!$norecurse) {
+                        $string .= join('', map { $_->toString($norecurse) } @{$self->[node_children]});
+        }
+        
+        $string .= "</" . $self->[node_name] . ">";
+    }
+    else {
+        $string .= " />";
+    }
+    
+    return $string;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Element - an <element>
+
+=head1 API
+
+=head2 new ( name, prefix )
+
+Create a new Element node with name "name" and prefix "prefix". The name
+be "prefix:local" if prefix is defined. I know that sounds wierd, but it
+works ;-)
+
+=head2 getName
+
+Returns the name (including "prefix:" if defined) of this element.
+
+=head2 getLocalName
+
+Returns just the local part of the name (the bit after "prefix:").
+
+=head2 getChildNodes
+
+Returns the children of this element. In list context returns a list. In
+scalar context returns an array ref.
+
+=head2 getChildNode ( pos )
+
+Returns the child at position pos.
+
+=head2 appendChild ( childnode )
+
+Appends the child node to the list of current child nodes.
+
+=head2 getAttribute ( name )
+
+Returns the attribute node with key name.
+
+=head2 getAttributes / getAttributeNodes
+
+Returns the attribute nodes. In list context returns a list. In scalar
+context returns an array ref.
+
+=head2 appendAttribute ( attrib_node)
+
+Appends the attribute node to the list of attributes (XML::XPath stores
+attributes in order).
+
+=head2 getNamespace ( prefix )
+
+Returns the namespace node by the given prefix
+
+=head2 getNamespaces / getNamespaceNodes
+
+Returns the namespace nodes. In list context returns a list. In scalar
+context returns an array ref.
+
+=head2 appendNamespace ( ns_node )
+
+Appends the namespace node to the list of namespaces.
+
+=head2 getPrefix
+
+Returns the prefix of this element
+
+=head2 getExpandedName
+
+Returns the expanded name of this element (not yet implemented right).
+
+=head2 string_value
+
+For elements, the string_value is the concatenation of all string_values
+of all text-descendants of the element node in document order.
+
+=head2 toString ( [ norecurse ] )
+
+Output (and all children) the node to a string. Doesn't process children
+if the norecurse option is a true value.
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Node/Namespace.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Node/Namespace.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Node/Namespace.pm	(revision 24799)
@@ -0,0 +1,99 @@
+# $Id: Namespace.pm 7909 2004-08-06 05:11:55Z mdewsnip $
+
+package XML::XPath::Node::Namespace;
+
+use strict;
+use vars qw/@ISA/;
+
+@ISA = ('XML::XPath::Node');
+
+package XML::XPath::Node::NamespaceImpl;
+
+use vars qw/@ISA/;
+@ISA = ('XML::XPath::NodeImpl', 'XML::XPath::Node::Namespace');
+use XML::XPath::Node ':node_keys';
+
+sub new {
+	my $class = shift;
+	my ($prefix, $expanded) = @_;
+	
+        my $pos = XML::XPath::Node->nextPos;
+        
+        my @vals;
+        @vals[node_global_pos, node_prefix, node_expanded] =
+                ($pos, $prefix, $expanded);
+	my $self = \@vals;
+        
+	bless $self, $class;
+}
+
+sub getNodeType { NAMESPACE_NODE }
+
+sub isNamespaceNode { 1; }
+
+sub getPrefix {
+	my $self = shift;
+	$self->[node_prefix];
+}
+
+sub getExpanded {
+	my $self = shift;
+	$self->[node_expanded];
+}
+
+sub getValue {
+	my $self = shift;
+	$self->[node_expanded];
+}
+
+sub getData {
+	my $self = shift;
+	$self->[node_expanded];
+}
+
+sub string_value {
+	my $self = shift;
+	$self->[node_expanded];
+}
+
+sub toString {
+	my $self = shift;
+	my $string = '';
+	return '' unless defined $self->[node_expanded];
+	if ($self->[node_prefix] eq '#default') {
+		$string .= ' xmlns="';
+	}
+	else {
+		$string .= ' xmlns:' . $self->[node_prefix] . '="';
+	}
+	$string .= XML::XPath::Node::XMLescape($self->[node_expanded], '"&<');
+	$string .= '"';
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Namespace - an XML namespace node
+
+=head1 API
+
+=head2 new ( prefix, expanded )
+
+Create a new namespace node, expanded is the expanded namespace URI.
+
+=head2 getPrefix
+
+Returns the prefix
+
+=head2 getExpanded
+
+Returns the expanded URI
+
+=head2 toString
+
+Returns a string that you can add to the list
+of attributes of an element: xmlns:prefix="expanded"
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Node/PI.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Node/PI.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Node/PI.pm	(revision 24799)
@@ -0,0 +1,81 @@
+# $Id: PI.pm 7909 2004-08-06 05:11:55Z mdewsnip $
+
+package XML::XPath::Node::PI;
+
+use strict;
+use vars qw/@ISA/;
+
+@ISA = ('XML::XPath::Node');
+
+package XML::XPath::Node::PIImpl;
+
+use vars qw/@ISA/;
+@ISA = ('XML::XPath::NodeImpl', 'XML::XPath::Node::PI');
+use XML::XPath::Node ':node_keys';
+
+sub new {
+	my $class = shift;
+	my ($target, $data) = @_;
+	
+        my $pos = XML::XPath::Node->nextPos;
+        
+        my @vals;
+        @vals[node_global_pos, node_target, node_data] = 
+                ($pos, $target, $data);
+	my $self = \@vals;
+	bless $self, $class;
+}
+
+sub getNodeType { PROCESSING_INSTRUCTION_NODE }
+
+sub isPINode { 1; }
+sub isProcessingInstructionNode { 1; }
+
+sub getTarget {
+	my $self = shift;
+	$self->[node_target];
+}
+
+sub getData {
+	my $self = shift;
+	$self->[node_data];
+}
+
+sub _to_sax {
+	my $self = shift;
+	my ($doch, $dtdh, $enth) = @_;
+	# PI's not supported in PerlSAX 1
+}
+
+sub string_value {
+	my $self = shift;
+	return $self->[node_data];
+}
+
+sub toString {
+	my $self = shift;
+	return "<?" . $self->[node_target] . " " . XML::XPath::Node::XMLescape($self->[node_data], ">") . "?>";
+}
+
+1;
+__END__
+
+=head1 NAME
+
+PI - an XML processing instruction node
+
+=head1 API
+
+=head2 new ( target, data )
+
+Create a new PI node.
+
+=head2 getTarget
+
+Returns the target
+
+=head2 getData
+
+Returns the data
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Node/Text.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Node/Text.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Node/Text.pm	(revision 24799)
@@ -0,0 +1,96 @@
+# $Id: Text.pm 7909 2004-08-06 05:11:55Z mdewsnip $
+
+package XML::XPath::Node::Text;
+
+use strict;
+use vars qw/@ISA/;
+
+@ISA = ('XML::XPath::Node');
+
+package XML::XPath::Node::TextImpl;
+
+use vars qw/@ISA/;
+@ISA = ('XML::XPath::NodeImpl', 'XML::XPath::Node::Text');
+use XML::XPath::Node ':node_keys';
+
+sub new {
+    my $class = shift;
+    my ($text) = @_;
+    
+        my $pos = XML::XPath::Node->nextPos;
+        
+        my @vals;
+        @vals[node_global_pos, node_text] = ($pos, $text);
+    my $self = \@vals;
+        
+    bless $self, $class;
+}
+
+sub getNodeType { TEXT_NODE }
+
+sub isTextNode { 1; }
+
+sub appendText {
+    my $self = shift;
+    my ($text) = @_;
+    $self->[node_text] .= $text;
+}
+
+sub getNodeValue {
+    my $self = shift;
+    $self->[node_text];
+}
+
+sub getData {
+    my $self = shift;
+    $self->[node_text];
+}
+
+sub setNodeValue {
+    my $self = shift;
+    $self->[node_text] = shift;
+}
+
+sub _to_sax {
+    my $self = shift;
+    my ($doch, $dtdh, $enth) = @_;
+    
+    $doch->characters( { Data => $self->getValue } );
+}
+
+sub string_value {
+    my $self = shift;
+    $self->[node_text];
+}
+
+sub toString {
+    my $self = shift;
+    XML::XPath::Node::XMLescape($self->[node_text], "<&");
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Text - an XML text node
+
+=head1 API
+
+=head2 new ( text )
+
+Create a new text node.
+
+=head2 getValue / getData
+
+Returns the text
+
+=head2 string_value
+
+Returns the text
+
+=head2 appendText ( text )
+
+Adds the given text string to this node.
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/NodeSet.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/NodeSet.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/NodeSet.pm	(revision 24799)
@@ -0,0 +1,184 @@
+# $Id: NodeSet.pm 7909 2004-08-06 05:11:55Z mdewsnip $
+
+package XML::XPath::NodeSet;
+use strict;
+
+use XML::XPath::Boolean;
+
+use overload 
+		'""' => \&to_literal,
+                'bool' => \&to_boolean,
+        ;
+
+sub new {
+	my $class = shift;
+	bless [], $class;
+}
+
+sub sort {
+    my $self = CORE::shift;
+    @$self = CORE::sort { $a->get_global_pos <=> $b->get_global_pos } @$self;
+    return $self;
+}
+
+sub pop {
+	my $self = CORE::shift;
+	CORE::pop @$self;
+}
+
+sub push {
+	my $self = CORE::shift;
+	my (@nodes) = @_;
+	CORE::push @$self, @nodes;
+}
+
+sub append {
+	my $self = CORE::shift;
+	my ($nodeset) = @_;
+	CORE::push @$self, $nodeset->get_nodelist;
+}
+
+sub shift {
+	my $self = CORE::shift;
+	CORE::shift @$self;
+}
+
+sub unshift {
+	my $self = CORE::shift;
+	my (@nodes) = @_;
+	CORE::unshift @$self, @nodes;
+}
+
+sub prepend {
+	my $self = CORE::shift;
+	my ($nodeset) = @_;
+	CORE::unshift @$self, $nodeset->get_nodelist;
+}
+
+sub size {
+	my $self = CORE::shift;
+	scalar @$self;
+}
+
+sub get_node { # uses array index starting at 1, not 0
+	my $self = CORE::shift;
+	my ($pos) = @_;
+	$self->[$pos - 1];
+}
+
+sub getRootNode {
+    my $self = CORE::shift;
+    return $self->[0]->getRootNode;
+}
+
+sub get_nodelist {
+	my $self = CORE::shift;
+	@$self;
+}
+
+sub to_boolean {
+	my $self = CORE::shift;
+	return (@$self > 0) ? XML::XPath::Boolean->True : XML::XPath::Boolean->False;
+}
+
+sub string_value {
+	my $self = CORE::shift;
+	return '' unless @$self;
+	return $self->[0]->string_value;
+}
+
+sub to_literal {
+	my $self = CORE::shift;
+	return XML::XPath::Literal->new(
+			join('', map { $_->string_value } @$self)
+			);
+}
+
+sub to_number {
+	my $self = CORE::shift;
+	return XML::XPath::Number->new(
+			$self->to_literal
+			);
+}
+
+1;
+__END__
+
+=head1 NAME
+
+XML::XPath::NodeSet - a list of XML document nodes
+
+=head1 DESCRIPTION
+
+An XML::XPath::NodeSet object contains an ordered list of nodes. The nodes
+each take the same format as described in L<XML::XPath::XMLParser>.
+
+=head1 SYNOPSIS
+
+	my $results = $xp->find('//someelement');
+	if (!$results->isa('XML::XPath::NodeSet')) {
+		print "Found $results\n";
+		exit;
+	}
+	foreach my $context ($results->get_nodelist) {
+		my $newresults = $xp->find('./other/element', $context);
+		...
+	}
+
+=head1 API
+
+=head2 new()
+
+You will almost never have to create a new NodeSet object, as it is all
+done for you by XPath.
+
+=head2 get_nodelist()
+
+Returns a list of nodes. See L<XML::XPath::XMLParser> for the format of
+the nodes.
+
+=head2 string_value()
+
+Returns the string-value of the first node in the list.
+See the XPath specification for what "string-value" means.
+
+=head2 to_literal()
+
+Returns the concatenation of all the string-values of all
+the nodes in the list.
+
+=head2 get_node($pos)
+
+Returns the node at $pos. The node position in XPath is based at 1, not 0.
+
+=head2 size()
+
+Returns the number of nodes in the NodeSet.
+
+=head2 pop()
+
+Equivalent to perl's pop function.
+
+=head2 push(@nodes)
+
+Equivalent to perl's push function.
+
+=head2 append($nodeset)
+
+Given a nodeset, appends the list of nodes in $nodeset to the end of the
+current list.
+
+=head2 shift()
+
+Equivalent to perl's shift function.
+
+=head2 unshift(@nodes)
+
+Equivalent to perl's unshift function.
+
+=head2 prepend($nodeset)
+
+Given a nodeset, prepends the list of nodes in $nodeset to the front of
+the current list.
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Number.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Number.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Number.pm	(revision 24799)
@@ -0,0 +1,87 @@
+# $Id: Number.pm 7909 2004-08-06 05:11:55Z mdewsnip $
+
+package XML::XPath::Number;
+use XML::XPath::Boolean;
+use XML::XPath::Literal;
+use strict;
+
+use overload
+        '""' => \&value,
+        '0+' => \&value,
+        '<=>' => \&cmp;
+
+sub new {
+    my $class = shift;
+    my $number = shift;
+    if ($number !~ /^\s*[+-]?(\d+(\.\d*)?|\.\d+)\s*$/) {
+        $number = undef;
+    }
+    else {
+        $number =~ s/^\s*(.*)\s*$/$1/;
+    }
+    bless \$number, $class;
+}
+
+sub as_string {
+    my $self = shift;
+    defined $$self ? $$self : 'NaN';
+}
+
+sub as_xml {
+    my $self = shift;
+    return "<Number>" . (defined($$self) ? $$self : 'NaN') . "</Number>\n";
+}
+
+sub value {
+    my $self = shift;
+    $$self;
+}
+
+sub cmp {
+    my $self = shift;
+    my ($other, $swap) = @_;
+    if ($swap) {
+        return $other <=> $$self;
+    }
+    return $$self <=> $other;
+}
+
+sub evaluate {
+    my $self = shift;
+    $self;
+}
+
+sub to_boolean {
+    my $self = shift;
+    return $$self ? XML::XPath::Boolean->True : XML::XPath::Boolean->False;
+}
+
+sub to_literal { XML::XPath::Literal->new($_[0]->as_string); }
+sub to_number { $_[0]; }
+
+sub string_value { return $_[0]->value }
+
+1;
+__END__
+
+=head1 NAME
+
+XML::XPath::Number - Simple numeric values.
+
+=head1 DESCRIPTION
+
+This class holds simple numeric values. It doesn't support -0, +/- Infinity,
+or NaN, as the XPath spec says it should, but I'm not hurting anyone I don't think.
+
+=head1 API
+
+=head2 new($num)
+
+Creates a new XML::XPath::Number object, with the value in $num. Does some
+rudimentary numeric checking on $num to ensure it actually is a number.
+
+=head2 value()
+
+Also as overloaded stringification. Returns the numeric value held.
+
+=cut
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Parser.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Parser.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Parser.pm	(revision 24799)
@@ -0,0 +1,821 @@
+# $Id: Parser.pm 7909 2004-08-06 05:11:55Z mdewsnip $
+
+package XML::XPath::Parser;
+
+use strict;
+use vars qw/
+        $NCName 
+        $QName 
+        $NCWild
+        $QNWild
+        $NUMBER_RE 
+        $NODE_TYPE 
+        $AXIS_NAME 
+        %AXES 
+        $LITERAL
+        %CACHE/;
+
+use XML::XPath::XMLParser;
+use XML::XPath::Step;
+use XML::XPath::Expr;
+use XML::XPath::Function;
+use XML::XPath::LocationPath;
+use XML::XPath::Variable;
+use XML::XPath::Literal;
+use XML::XPath::Number;
+use XML::XPath::NodeSet;
+
+# Axis name to principal node type mapping
+%AXES = (
+        'ancestor' => 'element',
+        'ancestor-or-self' => 'element',
+        'attribute' => 'attribute',
+        'namespace' => 'namespace',
+        'child' => 'element',
+        'descendant' => 'element',
+        'descendant-or-self' => 'element',
+        'following' => 'element',
+        'following-sibling' => 'element',
+        'parent' => 'element',
+        'preceding' => 'element',
+        'preceding-sibling' => 'element',
+        'self' => 'element',
+        );
+
+$NCName = '([A-Za-z_][\w\\.\\-]*)';
+$QName = "($NCName:)?$NCName";
+$NCWild = "${NCName}:\\*";
+$QNWild = "\\*";
+$NODE_TYPE = '((text|comment|processing-instruction|node)\\(\\))';
+$AXIS_NAME = '(' . join('|', keys %AXES) . ')::';
+$NUMBER_RE = '\d+(\\.\d*)?|\\.\d+';
+$LITERAL = '\\"[^\\"]*\\"|\\\'[^\\\']*\\\'';
+
+sub new {
+    my $class = shift;
+    my $self = bless {}, $class;
+    debug("New Parser being created.\n");
+    $self->{context_set} = XML::XPath::NodeSet->new();
+    $self->{context_pos} = undef; # 1 based position in array context
+    $self->{context_size} = 0; # total size of context
+    $self->clear_namespaces();
+    $self->{vars} = {};
+    $self->{direction} = 'forward';
+    $self->{cache} = {};
+    return $self;
+}
+
+sub get_var {
+    my $self = shift;
+    my $var = shift;
+    $self->{vars}->{$var};
+}
+
+sub set_var {
+    my $self = shift;
+    my $var = shift;
+    my $val = shift;
+    $self->{vars}->{$var} = $val;
+}
+
+sub set_namespace {
+    my $self = shift;
+    my ($prefix, $expanded) = @_;
+    $self->{namespaces}{$prefix} = $expanded;
+}
+
+sub clear_namespaces {
+    my $self = shift;
+    $self->{namespaces} = {};
+}
+
+sub get_namespace {
+    my $self = shift;
+    my ($prefix, $node) = @_;
+    if (my $ns = $self->{namespaces}{$prefix}) {
+        return $ns;
+    }
+    if (my $nsnode = $node->getNamespace($prefix)) {
+        return $nsnode->getValue();
+    }
+}
+
+sub get_context_set { $_[0]->{context_set}; }
+sub set_context_set { $_[0]->{context_set} = $_[1]; }
+sub get_context_pos { $_[0]->{context_pos}; }
+sub set_context_pos { $_[0]->{context_pos} = $_[1]; }
+sub get_context_size { $_[0]->{context_set}->size; }
+sub get_context_node { $_[0]->{context_set}->get_node($_[0]->{context_pos}); }
+
+sub my_sub {
+    return (caller(1))[3];
+}
+
+sub parse {
+    my $self = shift;
+    my $path = shift;
+    if ($CACHE{$path}) {
+        return $CACHE{$path};
+    }
+    my $tokens = $self->tokenize($path);
+
+    $self->{_tokpos} = 0;
+    my $tree = $self->analyze($tokens);
+    
+    if ($self->{_tokpos} < scalar(@$tokens)) {
+        # didn't manage to parse entire expression - throw an exception
+        die "Parse of expression $path failed - junk after end of expression: $tokens->[$self->{_tokpos}]";
+    }
+    
+    $CACHE{$path} = $tree;
+    
+    debug("PARSED Expr to:\n", $tree->as_string, "\n") if $XML::XPath::Debug;
+    
+    return $tree;
+}
+
+sub tokenize {
+    my $self = shift;
+    my $path = shift;
+    study $path;
+    
+    my @tokens;
+    
+    debug("Parsing: $path\n");
+    
+    # Bug: We don't allow "'@' NodeType" which is in the grammar, but I think is just plain stupid.
+
+    while($path =~ m/\G
+        \s* # ignore all whitespace
+        ( # tokens
+            $LITERAL|
+            $NUMBER_RE| # Match digits
+            \.\.| # match parent
+            \.| # match current
+            ($AXIS_NAME)?$NODE_TYPE| # match tests
+            processing-instruction|
+            \@($NCWild|$QName|$QNWild)| # match attrib
+            \$$QName| # match variable reference
+            ($AXIS_NAME)?($NCWild|$QName|$QNWild)| # match NCName,NodeType,Axis::Test
+            \!=|<=|\-|>=|\/\/|and|or|mod|div| # multi-char seps
+            [,\+=\|<>\/\(\[\]\)]| # single char seps
+            (?<!(\@|\(|\[))\*| # multiply operator rules (see xpath spec)
+            (?<!::)\*|
+            $ # match end of query
+        )
+        \s* # ignore all whitespace
+        /gcxso) {
+
+        my ($token) = ($1);
+
+        if (length($token)) {
+            debug("TOKEN: $token\n");
+            push @tokens, $token;
+        }
+        
+    }
+    
+    if (pos($path) < length($path)) {
+        my $marker = ("." x (pos($path)-1));
+        $path = substr($path, 0, pos($path) + 8) . "...";
+        $path =~ s/\n/ /g;
+        $path =~ s/\t/ /g;
+        die "Query:\n",
+            "$path\n",
+            $marker, "^^^\n",
+            "Invalid query somewhere around here (I think)\n";
+    }
+    
+    return \@tokens;
+}
+
+sub analyze {
+    my $self = shift;
+    my $tokens = shift;
+    # lexical analysis
+    
+    return Expr($self, $tokens);
+}
+
+sub match {
+    my ($self, $tokens, $match, $fatal) = @_;
+    
+    $self->{_curr_match} = '';
+    return 0 unless $self->{_tokpos} < @$tokens;
+
+    local $^W;
+    
+#    debug ("match: $match\n");
+    
+    if ($tokens->[$self->{_tokpos}] =~ /^$match$/) {
+        $self->{_curr_match} = $tokens->[$self->{_tokpos}];
+        $self->{_tokpos}++;
+        return 1;
+    }
+    else {
+        if ($fatal) {
+            die "Invalid token: ", $tokens->[$self->{_tokpos}], "\n";
+        }
+        else {
+            return 0;
+        }
+    }
+}
+
+sub Expr {
+    my ($self, $tokens) = @_;
+    
+    debug("in SUB\n");
+    
+    return OrExpr($self, $tokens);
+}
+
+sub OrExpr {
+    my ($self, $tokens) = @_;
+    
+    debug("in SUB\n");
+    
+    my $expr = AndExpr($self, $tokens); 
+    while (match($self, $tokens, 'or')) {
+        my $or_expr = XML::XPath::Expr->new($self);
+        $or_expr->set_lhs($expr);
+        $or_expr->set_op('or');
+
+        my $rhs = AndExpr($self, $tokens);
+
+        $or_expr->set_rhs($rhs);
+        $expr = $or_expr;
+    }
+    
+    return $expr;
+}
+
+sub AndExpr {
+    my ($self, $tokens) = @_;
+    
+    debug("in SUB\n");
+    
+    my $expr = EqualityExpr($self, $tokens);
+    while (match($self, $tokens, 'and')) {
+        my $and_expr = XML::XPath::Expr->new($self);
+        $and_expr->set_lhs($expr);
+        $and_expr->set_op('and');
+        
+        my $rhs = EqualityExpr($self, $tokens);
+        
+        $and_expr->set_rhs($rhs);
+        $expr = $and_expr;
+    }
+    
+    return $expr;
+}
+
+sub EqualityExpr {
+    my ($self, $tokens) = @_;
+    
+    debug("in SUB\n");
+    
+    my $expr = RelationalExpr($self, $tokens);
+    while (match($self, $tokens, '!?=')) {
+        my $eq_expr = XML::XPath::Expr->new($self);
+        $eq_expr->set_lhs($expr);
+        $eq_expr->set_op($self->{_curr_match});
+        
+        my $rhs = RelationalExpr($self, $tokens);
+        
+        $eq_expr->set_rhs($rhs);
+        $expr = $eq_expr;
+    }
+    
+    return $expr;
+}
+
+sub RelationalExpr {
+    my ($self, $tokens) = @_;
+    
+    debug("in SUB\n");
+    
+    my $expr = AdditiveExpr($self, $tokens);
+    while (match($self, $tokens, '(<|>|<=|>=)')) {
+        my $rel_expr = XML::XPath::Expr->new($self);
+        $rel_expr->set_lhs($expr);
+        $rel_expr->set_op($self->{_curr_match});
+        
+        my $rhs = AdditiveExpr($self, $tokens);
+        
+        $rel_expr->set_rhs($rhs);
+        $expr = $rel_expr;
+    }
+    
+    return $expr;
+}
+
+sub AdditiveExpr {
+    my ($self, $tokens) = @_;
+    
+    debug("in SUB\n");
+    
+    my $expr = MultiplicativeExpr($self, $tokens);
+    while (match($self, $tokens, '[\\+\\-]')) {
+        my $add_expr = XML::XPath::Expr->new($self);
+        $add_expr->set_lhs($expr);
+        $add_expr->set_op($self->{_curr_match});
+        
+        my $rhs = MultiplicativeExpr($self, $tokens);
+        
+        $add_expr->set_rhs($rhs);
+        $expr = $add_expr;
+    }
+    
+    return $expr;
+}
+
+sub MultiplicativeExpr {
+    my ($self, $tokens) = @_;
+    
+    debug("in SUB\n");
+    
+    my $expr = UnaryExpr($self, $tokens);
+    while (match($self, $tokens, '(\\*|div|mod)')) {
+        my $mult_expr = XML::XPath::Expr->new($self);
+        $mult_expr->set_lhs($expr);
+        $mult_expr->set_op($self->{_curr_match});
+        
+        my $rhs = UnaryExpr($self, $tokens);
+        
+        $mult_expr->set_rhs($rhs);
+        $expr = $mult_expr;
+    }
+    
+    return $expr;
+}
+
+sub UnaryExpr {
+    my ($self, $tokens) = @_;
+    
+    debug("in SUB\n");
+    
+    if (match($self, $tokens, '-')) {
+        my $expr = XML::XPath::Expr->new($self);
+        $expr->set_lhs(XML::XPath::Number->new(0));
+        $expr->set_op('-');
+        $expr->set_rhs(UnaryExpr($self, $tokens));
+        return $expr;
+    }
+    else {
+        return UnionExpr($self, $tokens);
+    }
+}
+
+sub UnionExpr {
+    my ($self, $tokens) = @_;
+    
+    debug("in SUB\n");
+    
+    my $expr = PathExpr($self, $tokens);
+    while (match($self, $tokens, '\\|')) {
+        my $un_expr = XML::XPath::Expr->new($self);
+        $un_expr->set_lhs($expr);
+        $un_expr->set_op('|');
+        
+        my $rhs = PathExpr($self, $tokens);
+        
+        $un_expr->set_rhs($rhs);
+        $expr = $un_expr;
+    }
+    
+    return $expr;
+}
+
+sub PathExpr {
+    my ($self, $tokens) = @_;
+
+    debug("in SUB\n");
+    
+    # PathExpr is LocationPath | FilterExpr | FilterExpr '//?' RelativeLocationPath
+    
+    # Since we are being predictive we need to find out which function to call next, then.
+        
+    # LocationPath either starts with "/", "//", ".", ".." or a proper Step.
+    
+    my $expr = XML::XPath::Expr->new($self);
+    
+    my $test = $tokens->[$self->{_tokpos}];
+    
+    # Test for AbsoluteLocationPath and AbbreviatedRelativeLocationPath
+    if ($test =~ /^(\/\/?|\.\.?)$/) {
+        # LocationPath
+        $expr->set_lhs(LocationPath($self, $tokens));
+    }
+    # Test for AxisName::...
+    elsif (is_step($self, $tokens)) {
+        $expr->set_lhs(LocationPath($self, $tokens));
+    }
+    else {
+        # Not a LocationPath
+        # Use FilterExpr instead:
+        
+        $expr = FilterExpr($self, $tokens);
+        if (match($self, $tokens, '//?')) {
+            my $loc_path = XML::XPath::LocationPath->new();
+            push @$loc_path, $expr;
+            if ($self->{_curr_match} eq '//') {
+                push @$loc_path, XML::XPath::Step->new($self, 'descendant-or-self', 
+                                        XML::XPath::Step::test_nt_node);
+            }
+            push @$loc_path, RelativeLocationPath($self, $tokens);
+            my $new_expr = XML::XPath::Expr->new($self);
+            $new_expr->set_lhs($loc_path);
+            return $new_expr;
+        }
+    }
+    
+    return $expr;
+}
+
+sub FilterExpr {
+    my ($self, $tokens) = @_;
+    
+    debug("in SUB\n");
+    
+    my $expr = PrimaryExpr($self, $tokens);
+    while (match($self, $tokens, '\\[')) {
+        # really PredicateExpr...
+        $expr->push_predicate(Expr($self, $tokens));
+        match($self, $tokens, '\\]', 1);
+    }
+    
+    return $expr;
+}
+
+sub PrimaryExpr {
+    my ($self, $tokens) = @_;
+
+    debug("in SUB\n");
+    
+    my $expr = XML::XPath::Expr->new($self);
+    
+    if (match($self, $tokens, $LITERAL)) {
+        # new Literal with $self->{_curr_match}...
+        $self->{_curr_match} =~ m/^(["'])(.*)\1$/;
+        $expr->set_lhs(XML::XPath::Literal->new($2));
+    }
+    elsif (match($self, $tokens, $NUMBER_RE)) {
+        # new Number with $self->{_curr_match}...
+        $expr->set_lhs(XML::XPath::Number->new($self->{_curr_match}));
+    }
+    elsif (match($self, $tokens, '\\(')) {
+        $expr->set_lhs(Expr($self, $tokens));
+        match($self, $tokens, '\\)', 1);
+    }
+    elsif (match($self, $tokens, "\\\$$QName")) {
+        # new Variable with $self->{_curr_match}...
+        $self->{_curr_match} =~ /^\$(.*)$/;
+        $expr->set_lhs(XML::XPath::Variable->new($self, $1));
+    }
+    elsif (match($self, $tokens, $QName)) {
+        # check match not Node_Type - done in lexer...
+        # new Function
+        my $func_name = $self->{_curr_match};
+        match($self, $tokens, '\\(', 1);
+        $expr->set_lhs(
+                XML::XPath::Function->new(
+                    $self,
+                    $func_name,
+                    Arguments($self, $tokens)
+                )
+            );
+        match($self, $tokens, '\\)', 1);
+    }
+    else {
+        die "Not a PrimaryExpr at ", $tokens->[$self->{_tokpos}], "\n";
+    }
+    
+    return $expr;
+}
+
+sub Arguments {
+    my ($self, $tokens) = @_;
+    
+    debug("in SUB\n");
+    
+    my @args;
+    
+    if($tokens->[$self->{_tokpos}] eq ')') {
+        return \@args;
+    }
+    
+    push @args, Expr($self, $tokens);
+    while (match($self, $tokens, ',')) {
+        push @args, Expr($self, $tokens);
+    }
+    
+    return \@args;
+}
+
+sub LocationPath {
+    my ($self, $tokens) = @_;
+
+    debug("in SUB\n");
+    
+    my $loc_path = XML::XPath::LocationPath->new();
+    
+    if (match($self, $tokens, '/')) {
+        # root
+        debug("SUB: Matched root\n");
+        push @$loc_path, XML::XPath::Root->new();
+        if (is_step($self, $tokens)) {
+            debug("Next is step\n");
+            push @$loc_path, RelativeLocationPath($self, $tokens);
+        }
+    }
+    elsif (match($self, $tokens, '//')) {
+        # root
+        push @$loc_path, XML::XPath::Root->new();
+        my $optimised = optimise_descendant_or_self($self, $tokens);
+        if (!$optimised) {
+            push @$loc_path, XML::XPath::Step->new($self, 'descendant-or-self',
+                                XML::XPath::Step::test_nt_node);
+            push @$loc_path, RelativeLocationPath($self, $tokens);
+        }
+        else {
+            push @$loc_path, $optimised, RelativeLocationPath($self, $tokens);
+        }
+    }
+    else {
+        push @$loc_path, RelativeLocationPath($self, $tokens);
+    }
+    
+    return $loc_path;
+}
+
+sub optimise_descendant_or_self {
+    my ($self, $tokens) = @_;
+    
+    debug("in SUB\n");
+    
+    my $tokpos = $self->{_tokpos};
+    
+    # // must be followed by a Step.
+    if ($tokens->[$tokpos+1] && $tokens->[$tokpos+1] eq '[') {
+        # next token is a predicate
+        return;
+    }
+    elsif ($tokens->[$tokpos] =~ /^\.\.?$/) {
+        # abbreviatedStep - can't optimise.
+        return;
+    }                                                                                              
+    else {
+        debug("Trying to optimise //\n");
+        my $step = Step($self, $tokens);
+        if ($step->{axis} ne 'child') {
+            # can't optimise axes other than child for now...
+            $self->{_tokpos} = $tokpos;
+            return;
+        }
+        $step->{axis} = 'descendant';
+        $step->{axis_method} = 'axis_descendant';
+        $self->{_tokpos}--;
+        $tokens->[$self->{_tokpos}] = '.';
+        return $step;
+    }
+}
+
+sub RelativeLocationPath {
+    my ($self, $tokens) = @_;
+    
+    debug("in SUB\n");
+    
+    my @steps;
+    
+    push @steps, Step($self, $tokens);
+    while (match($self, $tokens, '//?')) {
+        if ($self->{_curr_match} eq '//') {
+            my $optimised = optimise_descendant_or_self($self, $tokens);
+            if (!$optimised) {
+                push @steps, XML::XPath::Step->new($self, 'descendant-or-self',
+                                        XML::XPath::Step::test_nt_node);
+            }
+            else {
+                push @steps, $optimised;
+            }
+        }
+        push @steps, Step($self, $tokens);
+        if (@steps > 1 && 
+                $steps[-1]->{axis} eq 'self' && 
+                $steps[-1]->{test} == XML::XPath::Step::test_nt_node) {
+            pop @steps;
+        }
+    }
+    
+    return @steps;
+}
+
+sub Step {
+    my ($self, $tokens) = @_;
+
+    debug("in SUB\n");
+    
+    if (match($self, $tokens, '\\.')) {
+        # self::node()
+        return XML::XPath::Step->new($self, 'self', XML::XPath::Step::test_nt_node);
+    }
+    elsif (match($self, $tokens, '\\.\\.')) {
+        # parent::node()
+        return XML::XPath::Step->new($self, 'parent', XML::XPath::Step::test_nt_node);
+    }
+    else {
+        # AxisSpecifier NodeTest Predicate(s?)
+        my $token = $tokens->[$self->{_tokpos}];
+        
+        debug("SUB: Checking $token\n");
+        
+        my $step;
+        if ($token eq 'processing-instruction') {
+            $self->{_tokpos}++;
+            match($self, $tokens, '\\(', 1);
+            match($self, $tokens, $LITERAL);
+            $self->{_curr_match} =~ /^["'](.*)["']$/;
+            $step = XML::XPath::Step->new($self, 'child',
+                                    XML::XPath::Step::test_nt_pi,
+                        XML::XPath::Literal->new($1));
+            match($self, $tokens, '\\)', 1);
+        }
+        elsif ($token =~ /^\@($NCWild|$QName|$QNWild)$/o) {
+            $self->{_tokpos}++;
+                        if ($token eq '@*') {
+                            $step = XML::XPath::Step->new($self,
+                                    'attribute',
+                                    XML::XPath::Step::test_attr_any,
+                                    '*');
+                        }
+                        elsif ($token =~ /^\@($NCName):\*$/o) {
+                            $step = XML::XPath::Step->new($self,
+                                    'attribute',
+                                    XML::XPath::Step::test_attr_ncwild,
+                                    $1);
+                        }
+                        elsif ($token =~ /^\@($QName)$/o) {
+                            $step = XML::XPath::Step->new($self,
+                                    'attribute',
+                                    XML::XPath::Step::test_attr_qname,
+                                    $1);
+                        }
+        }
+        elsif ($token =~ /^($NCName):\*$/o) { # ns:*
+            $self->{_tokpos}++;
+            $step = XML::XPath::Step->new($self, 'child', 
+                                XML::XPath::Step::test_ncwild,
+                                $1);
+        }
+        elsif ($token =~ /^$QNWild$/o) { # *
+            $self->{_tokpos}++;
+            $step = XML::XPath::Step->new($self, 'child', 
+                                XML::XPath::Step::test_any,
+                                $token);
+        }
+        elsif ($token =~ /^$QName$/o) { # name:name
+            $self->{_tokpos}++;
+            $step = XML::XPath::Step->new($self, 'child', 
+                                XML::XPath::Step::test_qname,
+                                $token);
+        }
+        elsif ($token eq 'comment()') {
+                    $self->{_tokpos}++;
+            $step = XML::XPath::Step->new($self, 'child',
+                            XML::XPath::Step::test_nt_comment);
+        }
+        elsif ($token eq 'text()') {
+            $self->{_tokpos}++;
+            $step = XML::XPath::Step->new($self, 'child',
+                    XML::XPath::Step::test_nt_text);
+        }
+        elsif ($token eq 'node()') {
+            $self->{_tokpos}++;
+            $step = XML::XPath::Step->new($self, 'child',
+                    XML::XPath::Step::test_nt_node);
+        }
+        elsif ($token eq 'processing-instruction()') {
+            $self->{_tokpos}++;
+            $step = XML::XPath::Step->new($self, 'child',
+                    XML::XPath::Step::test_nt_pi);
+        }
+        elsif ($token =~ /^$AXIS_NAME($NCWild|$QName|$QNWild|$NODE_TYPE)$/o) {
+                    my $axis = $1;
+                    $self->{_tokpos}++;
+                    $token = $2;
+            if ($token eq 'processing-instruction') {
+                match($self, $tokens, '\\(', 1);
+                match($self, $tokens, $LITERAL);
+                $self->{_curr_match} =~ /^["'](.*)["']$/;
+                $step = XML::XPath::Step->new($self, $axis,
+                                        XML::XPath::Step::test_nt_pi,
+                            XML::XPath::Literal->new($1));
+                match($self, $tokens, '\\)', 1);
+            }
+            elsif ($token =~ /^($NCName):\*$/o) { # ns:*
+                $step = XML::XPath::Step->new($self, $axis, 
+                                    (($axis eq 'attribute') ? 
+                                    XML::XPath::Step::test_attr_ncwild
+                                        :
+                                    XML::XPath::Step::test_ncwild),
+                                    $1);
+            }
+            elsif ($token =~ /^$QNWild$/o) { # *
+                $step = XML::XPath::Step->new($self, $axis, 
+                                    (($axis eq 'attribute') ?
+                                    XML::XPath::Step::test_attr_any
+                                        :
+                                    XML::XPath::Step::test_any),
+                                    $token);
+            }
+            elsif ($token =~ /^$QName$/o) { # name:name
+                $step = XML::XPath::Step->new($self, $axis, 
+                                    (($axis eq 'attribute') ?
+                                    XML::XPath::Step::test_attr_qname
+                                        :
+                                    XML::XPath::Step::test_qname),
+                                    $token);
+            }
+            elsif ($token eq 'comment()') {
+                $step = XML::XPath::Step->new($self, $axis,
+                                XML::XPath::Step::test_nt_comment);
+            }
+            elsif ($token eq 'text()') {
+                $step = XML::XPath::Step->new($self, $axis,
+                        XML::XPath::Step::test_nt_text);
+            }
+            elsif ($token eq 'node()') {
+                $step = XML::XPath::Step->new($self, $axis,
+                        XML::XPath::Step::test_nt_node);
+            }
+            elsif ($token eq 'processing-instruction()') {
+                $step = XML::XPath::Step->new($self, $axis,
+                        XML::XPath::Step::test_nt_pi);
+            }
+            else {
+                die "Shouldn't get here";
+            }
+        }
+        else {
+            die "token $token doesn't match format of a 'Step'\n";
+        }
+        
+        while (match($self, $tokens, '\\[')) {
+            push @{$step->{predicates}}, Expr($self, $tokens);
+            match($self, $tokens, '\\]', 1);
+        }
+        
+        return $step;
+    }
+}
+
+sub is_step {
+    my ($self, $tokens) = @_;
+    
+    my $token = $tokens->[$self->{_tokpos}];
+    
+    return unless defined $token;
+        
+    debug("SUB: Checking if '$token' is a step\n");
+    
+        local $^W;
+        
+    if ($token eq 'processing-instruction') {
+        return 1;
+    }
+    elsif ($token =~ /^\@($NCWild|$QName|$QNWild)$/o) {
+        return 1;
+    }
+    elsif ($token =~ /^($NCWild|$QName|$QNWild)$/o && $tokens->[$self->{_tokpos}+1] ne '(') {
+        return 1;
+    }
+    elsif ($token =~ /^$NODE_TYPE$/o) {
+        return 1;
+    }
+    elsif ($token =~ /^$AXIS_NAME($NCWild|$QName|$QNWild|$NODE_TYPE)$/o) {
+        return 1;
+    }
+    
+    debug("SUB: '$token' not a step\n");
+
+    return;
+}
+
+sub debug {
+    return unless $XML::XPath::Debug;
+    
+    my ($pkg, $file, $line, $sub) = caller(1);
+    
+    $sub =~ s/^$pkg\:://;
+    
+    while (@_) {
+        my $x = shift;
+        $x =~ s/\bPKG\b/$pkg/g;
+        $x =~ s/\bLINE\b/$line/g;
+        $x =~ s/\bSUB\b/$sub/g;
+        print STDERR $x;
+    }
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/PerlSAX.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/PerlSAX.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/PerlSAX.pm	(revision 24799)
@@ -0,0 +1,166 @@
+# $Id: PerlSAX.pm 7909 2004-08-06 05:11:55Z mdewsnip $
+
+package XML::XPath::PerlSAX;
+use XML::XPath::XMLParser;
+use strict;
+
+sub new {
+	my $class = shift;
+	my %args = @_;
+	bless \%args, $class;
+}
+
+sub parse {
+	my $self = shift;
+
+	die "XML::XPath::PerlSAX: parser instance ($self) already parsing\n"
+		if (defined $self->{ParseOptions});
+
+	# If there's one arg and it's an array ref, assume it's a node we're parsing
+	my $args;
+	if (@_ == 1 && ref($_[0]) =~ /^(text|comment|element|namespace|attribute|pi)$/) {
+#		warn "Parsing node\n";
+		my $node = shift;
+#		warn "PARSING: $node ", XML::XPath::XMLParser::as_string($node), "\n\n";
+		$args = { Source => { Node => $node } };
+	}
+	else {
+		$args = (@_ == 1) ? shift : { @_ };
+	}
+
+	my $parse_options = { %$self, %$args };
+	$self->{ParseOptions} = $parse_options;
+
+	# ensure that we have at least one source
+	if (!defined $parse_options->{Source} ||
+		!defined $parse_options->{Source}{Node}) {
+		die "XML::XPath::PerlSAX: no source defined for parse\n";
+	}
+
+	# assign default Handler to any undefined handlers
+	if (defined $parse_options->{Handler}) {
+		$parse_options->{DocumentHandler} = $parse_options->{Handler}
+			if (!defined $parse_options->{DocumentHandler});
+	}
+
+	# ensure that we have a DocumentHandler
+	if (!defined $parse_options->{DocumentHandler}) {
+		die "XML::XPath::PerlSAX: no Handler or DocumentHandler defined for parse\n";
+	}
+
+	# cache DocumentHandler in self for callbacks
+	$self->{DocumentHandler} = $parse_options->{DocumentHandler};
+
+	if ((ref($parse_options->{Source}{Node}) eq 'element') &&
+			!($parse_options->{Source}{Node}->[node_parent])) {
+		# Got root node
+		$self->{DocumentHandler}->start_document( { } );
+		$self->parse_node($parse_options->{Source}{Node});
+		return $self->{DocumentHandler}->end_document( { } );
+	}
+	else {
+		$self->parse_node($parse_options->{Source}{Node});
+	}
+
+	# clean up parser instance
+	delete $self->{ParseOptions};
+	delete $self->{DocumentHandler};
+
+}
+
+sub parse_node {
+	my $self = shift;
+	my $node = shift;
+#	warn "parse_node $node\n";
+	if (ref($node) eq 'element' && $node->[node_parent]) {
+		# bundle up attributes
+		my @attribs;
+		foreach my $attr (@{$node->[node_attribs]}) {
+			if ($attr->[node_prefix]) {
+				push @attribs, $attr->[node_prefix] . ":" . $attr->[node_key];
+			}
+			else {
+				push @attribs, $attr->[node_key];
+			}
+			push @attribs, $attr->[node_value];
+		}
+		
+		$self->{DocumentHandler}->start_element(
+				{ Name => $node->[node_name],
+				  Attributes => \@attribs,
+				}
+			);
+		foreach my $kid (@{$node->[node_children]}) {
+			$self->parse_node($kid);
+		}
+		$self->{DocumentHandler}->end_element(
+				{
+					Name => $node->[node_name],
+				}
+			);
+	}
+	elsif (ref($node) eq 'text') {
+		$self->{DocumentHandler}->characters($node->[node_text]);
+	}
+	elsif (ref($node) eq 'comment') {
+		$self->{DocumentHandler}->comment($node->[node_comment]);
+	}
+	elsif (ref($node) eq 'pi') {
+		$self->{DocumentHandler}->processing_instruction(
+				{
+					Target => $node->[node_target],
+					Data => $node->[node_data]
+				}
+			);
+	}
+	elsif (ref($node) eq 'element') { # root node
+		# just do kids
+		foreach my $kid (@{$node->[node_children]}) {
+			$self->parse_node($kid);
+		}
+	}
+	else {
+		die "Unknown node type: '", ref($node), "' ", scalar(@$node), "\n";
+	}
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+XML::XPath::PerlSAX - A PerlSAX event generator for my wierd node structure
+
+=head1 SYNOPSIS
+
+	use XML::XPath;
+	use XML::XPath::PerlSAX;
+	use XML::DOM::PerlSAX;
+	
+	my $xp = XML::XPath->new(filename => 'test.xhtml');
+	my $paras = $xp->find('/html/body/p');
+	
+	my $handler = XML::DOM::PerlSAX->new();
+	my $generator = XML::XPath::PerlSAX->new( Handler => $handler );
+	
+	foreach my $node ($paras->get_nodelist) {
+		my $domtree = $generator->parse($node);
+		# do something with $domtree
+	}
+
+=head1 DESCRIPTION
+
+This module generates PerlSAX events to pass to a PerlSAX handler such
+as XML::DOM::PerlSAX. It operates specifically on my wierd tree format.
+
+Unfortunately SAX doesn't seem to cope with namespaces, so these are
+lost completely. I believe SAX2 is doing namespaces.
+
+=head1 Other
+
+The XML::DOM::PerlSAX handler I tried was completely broken (didn't even
+compile before I patched it a bit), so I don't know how correct this
+is or how far it will work.
+
+This software may only be distributed as part of the XML::XPath package.
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Root.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Root.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Root.pm	(revision 24799)
@@ -0,0 +1,36 @@
+# $Id: Root.pm 7909 2004-08-06 05:11:55Z mdewsnip $
+
+package XML::XPath::Root;
+use strict;
+use XML::XPath::XMLParser;
+use XML::XPath::NodeSet;
+
+sub new {
+	my $class = shift;
+	my $self; # actually don't need anything here - just a placeholder
+	bless \$self, $class;
+}
+
+sub as_string {
+	# do nothing
+}
+
+sub as_xml {
+    return "<Root/>\n";
+}
+
+sub evaluate {
+	my $self = shift;
+	my $nodeset = shift;
+	
+#	warn "Eval ROOT\n";
+	
+	# must only ever occur on 1 node
+	die "Can't go to root on > 1 node!" unless $nodeset->size == 1;
+	
+	my $newset = XML::XPath::NodeSet->new();
+	$newset->push($nodeset->get_node(1)->getRootNode());
+	return $newset;
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Step.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Step.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Step.pm	(revision 24799)
@@ -0,0 +1,519 @@
+# $Id: Step.pm 7909 2004-08-06 05:11:55Z mdewsnip $
+
+package XML::XPath::Step;
+use XML::XPath::Parser;
+use XML::XPath::Node;
+use strict;
+
+# the beginnings of using XS for this file...
+# require DynaLoader;
+# use vars qw/$VERSION @ISA/;
+# $VERSION = '1.0';
+# @ISA = qw(DynaLoader);
+# 
+# bootstrap XML::XPath::Step $VERSION;
+
+sub test_qname () { 0; } # Full name
+sub test_ncwild () { 1; } # NCName:*
+sub test_any () { 2; } # *
+
+sub test_attr_qname () { 3; } # @ns:attrib
+sub test_attr_ncwild () { 4; } # @nc:*
+sub test_attr_any () { 5; } # @*
+
+sub test_nt_comment () { 6; } # comment()
+sub test_nt_text () { 7; } # text()
+sub test_nt_pi () { 8; } # processing-instruction()
+sub test_nt_node () { 9; } # node()
+
+sub new {
+    my $class = shift;
+    my ($pp, $axis, $test, $literal) = @_;
+    my $axis_method = "axis_$axis";
+    $axis_method =~ tr/-/_/;
+    my $self = {
+        pp => $pp, # the XML::XPath::Parser class
+        axis => $axis,
+        axis_method => $axis_method,
+        test => $test,
+        literal => $literal,
+        predicates => [],
+        };
+    bless $self, $class;
+}
+
+sub as_string {
+    my $self = shift;
+    my $string = $self->{axis} . "::";
+
+    my $test = $self->{test};
+        
+    if ($test == test_nt_pi) {
+        $string .= 'processing-instruction(';
+        if ($self->{literal}->value) {
+            $string .= $self->{literal}->as_string;
+        }
+        $string .= ")";
+    }
+    elsif ($test == test_nt_comment) {
+        $string .= 'comment()';
+    }
+    elsif ($test == test_nt_text) {
+        $string .= 'text()';
+    }
+    elsif ($test == test_nt_node) {
+        $string .= 'node()';
+    }
+    elsif ($test == test_ncwild || $test == test_attr_ncwild) {
+        $string .= $self->{literal} . ':*';
+    }
+    else {
+        $string .= $self->{literal};
+    }
+    
+    foreach (@{$self->{predicates}}) {
+        next unless defined $_;
+        $string .= "[" . $_->as_string . "]";
+    }
+    return $string;
+}
+
+sub as_xml {
+    my $self = shift;
+    my $string = "<Step>\n";
+    $string .= "<Axis>" . $self->{axis} . "</Axis>\n";
+    my $test = $self->{test};
+    
+    $string .= "<Test>";
+    
+    if ($test == test_nt_pi) {
+        $string .= '<processing-instruction';
+        if ($self->{literal}->value) {
+            $string .= '>';
+            $string .= $self->{literal}->as_string;
+            $string .= '</processing-instruction>';
+        }
+        else {
+            $string .= '/>';
+        }
+    }
+    elsif ($test == test_nt_comment) {
+        $string .= '<comment/>';
+    }
+    elsif ($test == test_nt_text) {
+        $string .= '<text/>';
+    }
+    elsif ($test == test_nt_node) {
+        $string .= '<node/>';
+    }
+    elsif ($test == test_ncwild || $test == test_attr_ncwild) {
+        $string .= '<namespace-prefix>' . $self->{literal} . '</namespace-prefix>';
+    }
+    else {
+        $string .= '<nametest>' . $self->{literal} . '</nametest>';
+    }
+    
+    $string .= "</Test>\n";
+    
+    foreach (@{$self->{predicates}}) {
+        next unless defined $_;
+        $string .= "<Predicate>\n" . $_->as_xml() . "</Predicate>\n";
+    }
+    
+    $string .= "</Step>\n";
+    
+    return $string;
+}
+
+sub evaluate {
+    my $self = shift;
+    my $from = shift; # context nodeset
+    
+#    warn "Step::evaluate called with ", $from->size, " length nodeset\n";
+    
+    $self->{pp}->set_context_set($from);
+    
+    my $initial_nodeset = XML::XPath::NodeSet->new();
+    
+    # See spec section 2.1, paragraphs 3,4,5:
+    # The node-set selected by the location step is the node-set
+    # that results from generating an initial node set from the
+    # axis and node-test, and then filtering that node-set by
+    # each of the predicates in turn.
+    
+    # Make each node in the nodeset be the context node, one by one
+    for(my $i = 1; $i <= $from->size; $i++) {
+        $self->{pp}->set_context_pos($i);
+        $initial_nodeset->append($self->evaluate_node($from->get_node($i)));
+    }
+    
+#    warn "Step::evaluate initial nodeset size: ", $initial_nodeset->size, "\n";
+    
+    $self->{pp}->set_context_set(undef);
+
+    $initial_nodeset->sort;
+        
+    return $initial_nodeset;
+}
+
+# Evaluate the step against a particular node
+sub evaluate_node {
+    my $self = shift;
+    my $context = shift;
+    
+#    warn "Evaluate node: $self->{axis}\n";
+    
+#    warn "Node: ", $context->[node_name], "\n";
+    
+    my $method = $self->{axis_method};
+    
+    my $results = XML::XPath::NodeSet->new();
+    no strict 'refs';
+    eval {
+        $method->($self, $context, $results);
+    };
+    if ($@) {
+        die "axis $method not implemented [$@]\n";
+    }
+    
+#    warn("results: ", join('><', map {$_->string_value} @$results), "\n");
+    # filter initial nodeset by each predicate
+    foreach my $predicate (@{$self->{predicates}}) {
+        $results = $self->filter_by_predicate($results, $predicate);
+    }
+    
+    return $results;
+}
+
+sub axis_ancestor {
+    my $self = shift;
+    my ($context, $results) = @_;
+    
+    my $parent = $context->getParentNode;
+        
+    START:
+    return $results unless $parent;
+    if (node_test($self, $parent)) {
+        $results->push($parent);
+    }
+    $parent = $parent->getParentNode;
+    goto START;
+}
+
+sub axis_ancestor_or_self {
+    my $self = shift;
+    my ($context, $results) = @_;
+    
+    START:
+    return $results unless $context;
+    if (node_test($self, $context)) {
+        $results->push($context);
+    }
+    $context = $context->getParentNode;
+    goto START;
+}
+
+sub axis_attribute {
+    my $self = shift;
+    my ($context, $results) = @_;
+    
+    foreach my $attrib (@{$context->getAttributes}) {
+        if ($self->test_attribute($attrib)) {
+            $results->push($attrib);
+        }
+    }
+}
+
+sub axis_child {
+    my $self = shift;
+    my ($context, $results) = @_;
+    
+    foreach my $node (@{$context->getChildNodes}) {
+        if (node_test($self, $node)) {
+            $results->push($node);
+        }
+    }
+}
+
+sub axis_descendant {
+    my $self = shift;
+    my ($context, $results) = @_;
+
+    my @stack = $context->getChildNodes;
+
+    while (@stack) {
+        my $node = pop @stack;
+        if (node_test($self, $node)) {
+            $results->unshift($node);
+        }
+        push @stack, $node->getChildNodes;
+    }
+}
+
+sub axis_descendant_or_self {
+    my $self = shift;
+    my ($context, $results) = @_;
+    
+    my @stack = ($context);
+    
+    while (@stack) {
+        my $node = pop @stack;
+        if (node_test($self, $node)) {
+            $results->unshift($node);
+        }
+        push @stack, $node->getChildNodes;
+    }
+}
+
+sub axis_following {
+    my $self = shift;
+    my ($context, $results) = @_;
+    
+    START:
+
+    my $parent = $context->getParentNode;
+    return $results unless $parent;
+        
+    while ($context = $context->getNextSibling) {
+        axis_descendant_or_self($self, $context, $results);
+    }
+
+    $context = $parent;
+    goto START;
+}
+
+sub axis_following_sibling {
+    my $self = shift;
+    my ($context, $results) = @_;
+
+    while ($context = $context->getNextSibling) {
+        if (node_test($self, $context)) {
+            $results->push($context);
+        }
+    }
+}
+
+sub axis_namespace {
+    my $self = shift;
+    my ($context, $results) = @_;
+    
+    return $results unless $context->isElementNode;
+    foreach my $ns (@{$context->getNamespaces}) {
+        if ($self->test_namespace($ns)) {
+            $results->push($ns);
+        }
+    }
+}
+
+sub axis_parent {
+    my $self = shift;
+    my ($context, $results) = @_;
+    
+    my $parent = $context->getParentNode;
+    return $results unless $parent;
+    if (node_test($self, $parent)) {
+        $results->push($parent);
+    }
+}
+
+sub axis_preceding {
+    my $self = shift;
+    my ($context, $results) = @_;
+    
+    # all preceding nodes in document order, except ancestors
+    
+    START:
+
+    my $parent = $context->getParentNode;
+    return $results unless $parent;
+
+    while ($context = $context->getPreviousSibling) {
+        axis_descendant_or_self($self, $context, $results);
+    }
+    
+    $context = $parent;
+    goto START;
+}
+
+sub axis_preceding_sibling {
+    my $self = shift;
+    my ($context, $results) = @_;
+    
+    while ($context = $context->getPreviousSibling) {
+        if (node_test($self, $context)) {
+            $results->push($context);
+        }
+    }
+}
+
+sub axis_self {
+    my $self = shift;
+    my ($context, $results) = @_;
+    
+    if (node_test($self, $context)) {
+        $results->push($context);
+    }
+}
+    
+sub node_test {
+    my $self = shift;
+    my $node = shift;
+    
+    # if node passes test, return true
+    
+    my $test = $self->{test};
+
+    return 1 if $test == test_nt_node;
+        
+    if ($test == test_any) {
+        return 1 if $node->isElementNode && defined $node->getName;
+    }
+        
+    local $^W;
+
+    if ($test == test_ncwild) {
+        return unless $node->isElementNode;
+        my $match_ns = $self->{pp}->get_namespace($self->{literal}, $node);
+        if (my $node_nsnode = $node->getNamespace()) {
+            return 1 if $match_ns eq $node_nsnode->getValue;
+        }
+    }
+    elsif ($test == test_qname) {
+        return unless $node->isElementNode;
+        if ($self->{literal} =~ /:/) {
+            my ($prefix, $name) = split(':', $self->{literal}, 2);
+            my $match_ns = $self->{pp}->get_namespace($prefix, $node);
+            if (my $node_nsnode = $node->getNamespace()) {
+#                warn "match: '$self->{literal}' match NS: '$match_ns' got NS: '", $node_nsnode->getValue, "'\n";
+                return 1 if ($match_ns eq $node_nsnode->getValue) &&
+                        ($name eq $node->getLocalName);
+            }
+        }
+        else {
+#            warn "Node test: ", $node->getName, "\n";
+            return 1 if $node->getName eq $self->{literal};
+        }
+    }
+    elsif ($test == test_nt_text) {
+        return 1 if $node->isTextNode;
+    }
+    elsif ($test == test_nt_comment) {
+        return 1 if $node->isCommentNode;
+    }
+#     elsif ($test == test_nt_pi && !$self->{literal}) {
+#         warn "Unreachable code???";
+#         return 1 if $node->isPINode;
+#     }
+    elsif ($test == test_nt_pi) {
+        return unless $node->isPINode;
+        if (my $val = $self->{literal}->value) {
+            return 1 if $node->getTarget eq $val;
+        }
+        else {
+            return 1;
+        }
+    }
+    
+    return; # fallthrough returns false
+}
+
+sub test_attribute {
+    my $self = shift;
+    my $node = shift;
+    
+#    warn "test_attrib: '$self->{test}' against: ", $node->getName, "\n";
+#    warn "node type: $node->[node_type]\n";
+    
+    my $test = $self->{test};
+    
+    return 1 if ($test == test_attr_any) || ($test == test_nt_node);
+        
+    if ($test == test_attr_ncwild) {
+        my $match_ns = $self->{pp}->get_namespace($self->{literal}, $node);
+        if (my $node_nsnode = $node->getNamespace()) {
+            return 1 if $match_ns eq $node_nsnode->getValue;
+        }
+    }
+    elsif ($test == test_attr_qname) {
+        if ($self->{literal} =~ /:/) {
+            my ($prefix, $name) = split(':', $self->{literal}, 2);
+            my $match_ns = $self->{pp}->get_namespace($prefix, $node);
+            if (my $node_nsnode = $node->getNamespace()) {
+                return 1 if ($match_ns eq $node_nsnode->getValue) &&
+                        ($name eq $node->getLocalName);
+            }
+        }
+        else {
+            return 1 if $node->getName eq $self->{literal};
+        }
+    }
+    
+    return; # fallthrough returns false
+}
+
+sub test_namespace {
+    my $self = shift;
+    my $node = shift;
+    
+    # Not sure if this is correct. The spec seems very unclear on what
+    # constitutes a namespace test... bah!
+    
+    my $test = $self->{test};
+    
+    return 1 if $test == test_any; # True for all nodes of principal type
+    
+    if ($test == test_any) {
+        return 1;
+    }
+    elsif ($self->{literal} eq $node->getExpanded) {
+        return 1;
+    }
+    
+    return;
+}
+
+sub filter_by_predicate {
+    my $self = shift;
+    my ($nodeset, $predicate) = @_;
+    
+    # See spec section 2.4, paragraphs 2 & 3:
+    # For each node in the node-set to be filtered, the predicate Expr
+    # is evaluated with that node as the context node, with the number
+    # of nodes in the node set as the context size, and with the
+    # proximity position of the node in the node set with respect to
+    # the axis as the context position.
+    
+    if (!ref($nodeset)) { # use ref because nodeset has a bool context
+        die "No nodeset!!!";
+    }
+    
+#    warn "Filter by predicate: $predicate\n";
+    
+    my $newset = XML::XPath::NodeSet->new();
+    
+    for(my $i = 1; $i <= $nodeset->size; $i++) {
+        # set context set each time 'cos a loc-path in the expr could change it
+        $self->{pp}->set_context_set($nodeset);
+        $self->{pp}->set_context_pos($i);
+        my $result = $predicate->evaluate($nodeset->get_node($i));
+        if ($result->isa('XML::XPath::Boolean')) {
+            if ($result->value) {
+                $newset->push($nodeset->get_node($i));
+            }
+        }
+        elsif ($result->isa('XML::XPath::Number')) {
+            if ($result->value == $i) {
+                $newset->push($nodeset->get_node($i));
+            }
+        }
+        else {
+            if ($result->to_boolean->value) {
+                $newset->push($nodeset->get_node($i));
+            }
+        }
+    }
+    
+    return $newset;
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Twig.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Twig.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Twig.pm	(revision 24799)
@@ -0,0 +1,10940 @@
+# $Id: Twig.pm 7909 2004-08-06 05:11:55Z mdewsnip $
+#
+# Copyright (c) 1999-2004 Michel Rodriguez
+# All rights reserved.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+#
+
+# This is created in the caller's space
+BEGIN
+{ sub ::PCDATA { '#PCDATA' } 
+  sub ::CDATA  { '#CDATA'  } 
+}
+
+
+######################################################################
+package XML::Twig;
+######################################################################
+
+require 5.004;
+use strict; 
+use UNIVERSAL qw( isa ) ;
+
+use vars qw($VERSION @ISA %valid_option);
+use Carp;
+
+#start-extract twig_global
+
+# constants: element types
+use constant (PCDATA  => '#PCDATA');
+use constant (CDATA   => '#CDATA');
+use constant (PI      => '#PI');
+use constant (COMMENT => '#COMMENT');
+use constant (ENT     => '#ENT');
+
+# element classes
+use constant (ELT     => '#ELT');
+use constant (TEXT    => '#TEXT');
+
+# element properties
+use constant (ASIS    => '#ASIS');
+use constant (EMPTY   => '#EMPTY');
+
+#end-extract twig_global
+
+# used in parseurl to set the buffer size to the same size as in XML::Parser::Expat
+use constant (BUFSIZE => 32768);
+
+
+# used to store the gi's
+my %gi2index;   # gi => index
+my @index2gi;   # list of gi's
+my $SPECIAL_GI; # first non-special gi;
+my %base_ent;   # base entity character => replacement
+
+# flag, set to true if the weaken sub is available
+use vars qw( $weakrefs);
+
+#start-extract twig_global
+my $REG_NAME       = q{(?:(?:[^\W\d]|[:#])(?:[\w.-]*:)?[\w.-]*)};     # xml name
+my $REG_NAME_W     = q{(?:(?:[^\W\d_]|[:#])(?:[\w.-]*:)?[\w.-]*|\*)}; # name or wildcard (* or '')
+my $REG_REGEXP     = q{(?:/(?:[^\\/]|\\.)*/[eimsox]*)};   # regexp
+my $REG_REGEXP_EXP = q{(?:(?:[^\\/]|\\.)*)};              # content of a regexp
+my $REG_REGEXP_MOD = q{(?:[eimso]*)};                     # regexp modifiers
+my $REG_MATCH      = q{[!=]~};                            # match (or not)
+my $REG_STRING     = q{(?:"(?:[^\\"]|\\.)*"|'(?:[^\\']|\\.)*')};  # string (simple or double quoted)
+my $REG_NUMBER     = q{(?:\d+(?:\.\d*)?|\.\d+)};          # number
+my $REG_VALUE      = qq{(?:$REG_STRING|$REG_NUMBER)};     # value
+my $REG_OP         = q{=|==|!=|>|<|>=|<=|eq|ne|lt|gt|le|ge}; # op
+
+#end-extract twig_global
+
+my $parser_version;
+my( $FB_HTMLCREF, $FB_XMLCREF);
+
+
+BEGIN
+{ 
+$VERSION = '3.15';
+
+use XML::Parser;
+my $needVersion = '2.23';
+$parser_version= $XML::Parser::VERSION;
+croak "need at least XML::Parser version $needVersion" unless $parser_version >= $needVersion;
+
+if( $] >= 5.008) 
+  { eval "use Encode qw( :fallback_all)";
+    $FB_XMLCREF  = 0x0400; # Encode::FB_XMLCREF;
+    $FB_HTMLCREF = 0x0200; #Encode::FB_HTMLCREF;
+  }
+
+# test whether we can use weak references
+# set local empty signal handler to trap error messages
+{ local $SIG{__DIE__};
+  if( eval 'require Scalar::Util') { import Scalar::Util qw(weaken); $weakrefs= 1; }
+  elsif( eval 'require WeakRef')   { import WeakRef; $weakrefs= 1;                 }
+  else                             { $weakrefs= 0;                                 } 
+}
+
+import XML::Twig::Elt;
+import XML::Twig::Entity;
+import XML::Twig::Entity_list;
+
+# used to store the gi's
+# should be set for each twig really, at least when there are several
+# the init ensures that special gi's are always the same
+
+# gi => index
+# do NOT use => or the constants become quoted!
+%XML::Twig::gi2index=( PCDATA, 0, CDATA, 1, PI, 2, COMMENT, 3, ENT, 4); 
+# list of gi's
+@XML::Twig::index2gi=( PCDATA, CDATA, PI, COMMENT, ENT);
+
+# gi's under this value are special 
+$XML::Twig::SPECIAL_GI= @XML::Twig::index2gi;
+
+%XML::Twig::base_ent= ( '>' => '&gt;', '<' => '&lt;', '&' => '&amp;', "'" => '&apos;', '"' => '&quot;',);
+
+# now set some aliases
+*find_nodes           = *get_xpath;               # same as XML::XPath
+*findnodes            = *get_xpath;               # same as XML::LibXML
+*getElementsByTagName = *descendants;
+*descendants_or_self  = *descendants;             # valid in XML::Twig, not in XML::Twig::Elt
+*find_by_tag_name     = *descendants;
+*getElementById       = *elt_id;
+*getEltById           = *elt_id;
+*toString             = *sprint;
+}
+
+@ISA = qw(XML::Parser);
+
+# fake gi's used in twig_handlers and start_tag_handlers
+my $ALL    = '_all_';     # the associated function is always called
+my $DEFAULT= '_default_'; # the function is called if no other handler has been
+
+# some defaults
+my $COMMENTS_DEFAULT= 'keep';
+my $PI_DEFAULT      = 'keep';
+
+
+# handlers used in regular mode
+my %twig_handlers=( Start      => \&_twig_start, 
+                    End        => \&_twig_end, 
+                    Char       => \&_twig_char, 
+                    Entity     => \&_twig_entity, 
+                    XMLDecl    => \&_twig_xmldecl, 
+                    Doctype    => \&_twig_doctype, 
+                    Element    => \&_twig_element, 
+                    Attlist    => \&_twig_attlist, 
+                    CdataStart => \&_twig_cdatastart, 
+                    CdataEnd   => \&_twig_cdataend, 
+                    Proc       => \&_twig_pi,
+                    Comment    => \&_twig_comment,
+                    Default    => \&_twig_default,
+      );
+
+# handlers used when twig_roots is used and we are outside of the roots
+my %twig_handlers_roots=
+  ( Start      => \&_twig_start_check_roots, 
+    End        => \&_twig_end_check_roots, 
+    Doctype    => \&_twig_doctype, 
+    Char       => undef, Entity     => undef, XMLDecl    => \&_twig_xmldecl, 
+    Element    => undef, Attlist    => undef, CdataStart => undef, 
+    CdataEnd   => undef, Proc       => undef, Comment    => undef, 
+    Proc       => \&_twig_pi_check_roots,
+    Default    =>  sub {}, # hack needed for XML::Parser 2.27
+  );
+
+# handlers used when twig_roots and print_outside_roots are used and we are
+# outside of the roots
+my %twig_handlers_roots_print_2_30=
+  ( Start      => \&_twig_start_check_roots_print, 
+    End        => \&_twig_end_check_roots_print, 
+    Char       => \&_twig_print, 
+    # I have no idea why I should not be using this handler!
+    Entity     => \&_twig_print_entity, 
+    XMLDecl    => \&_twig_print,
+    Doctype   =>  \&_twig_print_doctype, # because recognized_string is broken here
+    # Element    => \&_twig_print, Attlist    => \&_twig_print, 
+    CdataStart => \&_twig_print, CdataEnd   => \&_twig_print, 
+    Proc       => \&_twig_print, Comment    => \&_twig_print, 
+    Default    => \&_twig_print_check_doctype,
+  );
+
+# handlers used when twig_roots, print_outside_roots and keep_encoding are used
+# and we are outside of the roots
+my %twig_handlers_roots_print_original_2_30=
+  ( Start      => \&_twig_start_check_roots_print_original, 
+    End        => \&_twig_end_check_roots_print_original, 
+    Char       => \&_twig_print_original, 
+    # I have no idea why I should not be using this handler!
+    #Entity     => \&_twig_print_original, 
+    ExternEnt  => \&_twig_print_entity,
+    XMLDecl    => \&_twig_print_original, 
+    Doctype    => \&_twig_print_original_doctype,  # because original_string is broken here
+    Element    => \&_twig_print_original, Attlist   => \&_twig_print_original,
+    CdataStart => \&_twig_print_original, CdataEnd  => \&_twig_print_original,
+    Proc       => \&_twig_print_original, Comment   => \&_twig_print_original,
+    Default    => \&_twig_print_original_check_doctype, 
+  );
+
+# handlers used when twig_roots and print_outside_roots are used and we are
+# outside of the roots
+my %twig_handlers_roots_print_2_27=
+  ( Start      => \&_twig_start_check_roots_print, 
+    End        => \&_twig_end_check_roots_print, 
+    Char       => \&_twig_print, 
+    # I have no idea why I should not be using this handler!
+    #Entity     => \&_twig_print, 
+    XMLDecl    => \&_twig_print, Doctype    => \&_twig_print, 
+    CdataStart => \&_twig_print, CdataEnd   => \&_twig_print, 
+    Proc       => \&_twig_print, Comment    => \&_twig_print, 
+    Default    => \&_twig_print, 
+  );
+
+# handlers used when twig_roots, print_outside_roots and keep_encoding are used
+# and we are outside of the roots
+my %twig_handlers_roots_print_original_2_27=
+  ( Start      => \&_twig_start_check_roots_print_original, 
+    End        => \&_twig_end_check_roots_print_original, 
+    Char       => \&_twig_print_original, 
+    # for some reason original_string is wrong here 
+    # this can be a problem if the doctype includes non ascii characters
+    XMLDecl    => \&_twig_print, Doctype    => \&_twig_print,
+    # I have no idea why I should not be using this handler!
+    Entity     => \&_twig_print, 
+    #Element    => undef, Attlist   => undef,
+    CdataStart => \&_twig_print_original, CdataEnd  => \&_twig_print_original,
+    Proc       => \&_twig_print_original, Comment   => \&_twig_print_original,
+    Default    => \&_twig_print_default, #  _twig_print_original does not work
+  );
+
+
+my %twig_handlers_roots_print= $parser_version > 2.27 
+                               ? %twig_handlers_roots_print_2_30 
+                               : %twig_handlers_roots_print_2_27; 
+my %twig_handlers_roots_print_original= $parser_version > 2.27 
+                               ? %twig_handlers_roots_print_original_2_30 
+                               : %twig_handlers_roots_print_original_2_27; 
+
+
+# handlers used when the finish_print method has been called
+my %twig_handlers_finish_print=
+  ( Start      => \&_twig_print, 
+    End        => \&_twig_print_end, Char       => \&_twig_print, 
+    Entity     => \&_twig_print, XMLDecl    => \&_twig_print, 
+    Doctype    => \&_twig_print, Element    => \&_twig_print, 
+    Attlist    => \&_twig_print, CdataStart => \&_twig_print, 
+    CdataEnd   => \&_twig_print, Proc       => \&_twig_print, 
+    Comment    => \&_twig_print, Default    => \&_twig_print, 
+  );
+
+# handlers used when the finish_print method has been called and the keep_encoding
+# option is used
+my %twig_handlers_finish_print_original=
+  ( Start      => \&_twig_print_original, End      => \&_twig_print_end_original, 
+    Char       => \&_twig_print_original, Entity   => \&_twig_print_original, 
+    XMLDecl    => \&_twig_print_original, Doctype  => \&_twig_print_original, 
+    Element    => \&_twig_print_original, Attlist  => \&_twig_print_original, 
+    CdataStart => \&_twig_print_original, CdataEnd => \&_twig_print_original, 
+    Proc       => \&_twig_print_original, Comment  => \&_twig_print_original, 
+    Default    => \&_twig_print_original, 
+  );
+
+# handlers used whithin ignored elements
+my %twig_handlers_ignore=
+  ( Start      => \&_twig_ignore_start, 
+    End        => \&_twig_ignore_end, 
+    Char       => undef, Entity     => undef, XMLDecl    => undef, 
+    Doctype    => undef, Element    => undef, Attlist    => undef, 
+    CdataStart => undef, CdataEnd   => undef, Proc       => undef, 
+    Comment    => undef, Default    => undef,
+  );
+
+
+# those handlers are only used if the entities are NOT to be expanded
+my %twig_noexpand_handlers= ( Default => \&_twig_default );
+
+my @saved_default_handler;
+
+my $ID= 'id'; # default value, set by the Id argument
+
+# all allowed options
+%valid_option=
+    ( # XML::Twig options
+      TwigHandlers          => 1, Id                    => 1,
+      TwigRoots             => 1, TwigPrintOutsideRoots => 1,
+      StartTagHandlers      => 1, EndTagHandlers        => 1,
+      ForceEndTagHandlersUsage => 1,
+      DoNotChainHandlers    => 1,
+      IgnoreElts            => 1,
+      CharHandler           => 1, KeepEncoding          => 1,
+      ParseStartTag         => 1, KeepAttsOrder         => 1,
+      LoadDTD               => 1, DTDHandler            => 1,
+      DoNotOutputDTD        => 1, NoProlog              => 1,
+      ExpandExternalEnts    => 1,
+      DiscardSpaces         => 1, KeepSpaces            => 1, 
+      DiscardSpacesIn       => 1, KeepSpacesIn          => 1, 
+      PrettyPrint           => 1, EmptyTags             => 1, 
+      Comments              => 1, Pi                    => 1, 
+      OutputFilter          => 1, InputFilter           => 1,
+      OutputTextFilter      => 1, 
+      OutputEncoding        => 1, 
+      EltClass              => 1,
+      MapXmlns              => 1, KeepOriginalPrefix    => 1,
+      # XML::Parser options
+      ErrorContext          => 1, ProtocolEncoding      => 1,
+      Namespaces            => 1, NoExpand              => 1,
+      Stream_Delimiter      => 1, ParseParamEnt         => 1,
+      NoLWP                 => 1, Non_Expat_Options     => 1,
+      Xmlns                 => 1,
+    );
+
+# predefined input and output filters
+use vars qw( %filter);
+%filter= ( html       => \&html_encode,
+           safe       => \&safe_encode,
+           safe_hex   => \&safe_encode_hex,
+         );
+
+sub new
+  { my ($class, %args) = @_;
+    my $handlers;
+
+    # change all nice_perlish_names into nicePerlishNames
+    %args= _normalize_args( %args);
+
+    # check options
+    unless( $args{MoreOptions})
+      { foreach my $arg (keys %args)
+        { carp "invalid option $arg" unless $valid_option{$arg}; }
+      }
+     
+    # a twig is really an XML::Parser
+    # my $self= XML::Parser->new(%args);
+    my $self;
+    $self= XML::Parser->new(%args);   
+    
+    bless $self, $class;
+
+    if( exists $args{TwigHandlers})
+      { $handlers= $args{TwigHandlers};
+        $self->setTwigHandlers( $handlers);
+        delete $args{TwigHandlers};
+      }
+
+    # take care of twig-specific arguments
+    if( exists $args{StartTagHandlers})
+      { $self->setStartTagHandlers( $args{StartTagHandlers});
+        delete $args{StartTagHandlers};
+      }
+
+    if( exists $args{DoNotChainHandlers})
+      { $self->{twig_do_not_chain_handlers}=  $args{DoNotChainHandlers}; }
+
+    if(  exists $args{IgnoreElts})
+      { $self->setIgnoreEltsHandlers( $args{IgnoreElts});
+        delete $args{IgnoreElts};
+      }
+
+    $self->{twig_elt_class}= $args{EltClass} || 'XML::Twig::Elt';
+    if( exists( $args{EltClass})) { delete $args{EltClass}; }
+
+    if( exists( $args{MapXmlns}))
+      { $self->{twig_map_xmlns}=  $args{MapXmlns};
+        $self->{Namespaces}=1;
+        delete $args{MapXmlns};
+      }
+
+    if( exists( $args{KeepOriginalPrefix}))
+      { $self->{twig_keep_original_prefix}= $args{KeepOriginalPrefix};
+        delete $args{KeepOriginalPrefix};
+      }
+
+    $self->{twig_dtd_handler}= $args{DTDHandler};
+    delete $args{DTDHandler};
+
+    if( $args{CharHandler})
+      { $self->setCharHandler( $args{CharHandler});
+        delete $args{CharHandler};
+      }
+
+    if( $args{LoadDTD})
+      { $self->{twig_read_external_dtd}= 1;
+        delete $args{LoadDTD};
+      }
+      
+    if( $args{ExpandExternalEnts})
+      { $self->set_expand_external_entities( 1);
+        $self->{twig_read_external_dtd}= 1; # implied by ExpandExternalEnts
+        delete $args{LoadDTD};
+        delete $args{ExpandExternalEnts};
+      }
+
+    # deal with TwigRoots argument, a hash of elements for which
+    # subtrees will be built (and associated handlers)
+     
+    if( $args{TwigRoots})
+      { $self->setTwigRoots( $args{TwigRoots});
+        delete $args{TwigRoots}; 
+      }
+    
+    if( $args{EndTagHandlers})
+      { unless ($self->{twig_roots} || $args{ForceEndTagHandlersUsage})
+          { croak "you should not use EndTagHandlers without TwigRoots\n",
+                  "if you want to use it anyway, normally because you have ",
+                  "a start_tag_handlers that calls 'ignore' and you want to ",
+                  "call an ent_tag_handlers at the end of the element, then ",
+                  "pass 'force_end_tag_handlers_usage => 1' as an argument ",
+                  "to new";
+          }
+                  
+        $self->setEndTagHandlers( $args{EndTagHandlers});
+        delete $args{EndTagHandlers};
+      }
+      
+    if( $args{TwigPrintOutsideRoots})
+      { croak "cannot use TwigPrintOutsideRoots without TwigRoots"
+          unless( $self->{twig_roots});
+        # if the arg is a filehandle then store it
+        if( _is_fh( $args{TwigPrintOutsideRoots}) )
+          { $self->{twig_output_fh}= $args{TwigPrintOutsideRoots}; }
+        $self->{twig_default_print}= $args{TwigPrintOutsideRoots};
+      }
+
+    if( $args{PrettyPrint})
+      { $self->set_pretty_print( $args{PrettyPrint}); }
+
+    if( $args{EmptyTags})
+      { $self->set_empty_tag_style( $args{EmptyTags}); }
+
+    # space policy
+    if( $args{KeepSpaces})
+      { croak "cannot use both keep_spaces and discard_spaces" if( $args{DiscardSpaces});
+        croak "cannot use both keep_spaces and keep_spaces_in" if( $args{KeepSpacesIn});
+        $self->{twig_keep_spaces}=1;
+        delete $args{KeepSpaces}; 
+      }
+    if( $args{DiscardSpaces})
+      { croak "cannot use both discard_spaces and keep_spaces_in" if( $args{KeepSpacesIn});
+        $self->{twig_discard_spaces}=1; 
+        delete $args{DiscardSpaces}; 
+      }
+    if( $args{KeepSpacesIn})
+      { croak "cannot use both keep_spaces_in and discard_spaces_in" if( $args{DiscardSpacesIn});
+        $self->{twig_discard_spaces}=1; 
+        $self->{twig_keep_spaces_in}={}; 
+        my @tags= @{$args{KeepSpacesIn}}; 
+        foreach my $tag (@tags) { $self->{twig_keep_spaces_in}->{$tag}=1; } 
+        delete $args{KeepSpacesIn}; 
+      }
+    if( $args{DiscardSpacesIn})
+      { $self->{twig_keep_spaces}=1; 
+        $self->{twig_discard_spaces_in}={}; 
+        my @tags= @{$args{DiscardSpacesIn}};
+        foreach my $tag (@tags) { $self->{twig_discard_spaces_in}->{$tag}=1; } 
+        delete $args{DiscardSpacesIn}; 
+      }
+    # discard spaces by default 
+    $self->{twig_discard_spaces}= 1 unless(  $self->{twig_keep_spaces});
+
+    $args{Comments}||= $COMMENTS_DEFAULT;
+    if( $args{Comments} eq 'drop')       { $self->{twig_keep_comments}= 0;    }
+    elsif( $args{Comments} eq 'keep')    { $self->{twig_keep_comments}= 1;    }
+    elsif( $args{Comments} eq 'process') { $self->{twig_process_comments}= 1; }
+    else { croak "wrong value for comments argument: '$args{Comments}' (should be 'drop', 'keep' or 'process')"; }
+    delete $args{Comments};
+
+    $args{Pi}||= $PI_DEFAULT;
+    if( $args{Pi} eq 'drop')       { $self->{twig_keep_pi}= 0;    }
+    elsif( $args{Pi} eq 'keep')    { $self->{twig_keep_pi}= 1;    }
+    elsif( $args{Pi} eq 'process') { $self->{twig_process_pi}= 1; }
+    else { croak "wrong value for pi argument: '$args{Pi}' (should be 'drop', 'keep' or 'process')"; }
+    delete $args{Pi};
+
+    if( $args{KeepEncoding})
+      { $self->{twig_keep_encoding}= $args{KeepEncoding};
+        # set it in XML::Twig::Elt so print functions know what to do
+        $self->set_keep_encoding( 1); 
+        $self->{parse_start_tag}= $args{ParseStartTag} || \&_parse_start_tag; 
+        delete $args{ParseStartTag} if defined( $args{ParseStartTag}) ;
+        delete $args{KeepEncoding};
+        $self->{NoExpand}= 1;
+      }
+    else
+      { $self->set_keep_encoding( 0);  
+        $self->{parse_start_tag}= $args{ParseStartTag} if( $args{ParseStartTag}); 
+      }
+
+    if( $args{OutputFilter})
+      { $self->set_output_filter( $args{OutputFilter}); 
+        delete $args{OutputFilter};
+      }
+    else
+      { $self->set_output_filter( 0); }
+
+    if( $args{OutputTextFilter})
+      { $self->set_output_text_filter( $args{OutputTextFilter}); 
+        delete $args{OutputTextFilter};
+      }
+    else
+      { $self->set_output_text_filter( 0); }
+
+
+    if( exists $args{KeepAttsOrder})
+      { $self->{keep_atts_order}= $args{KeepAttsOrder};
+        if( eval 'require Tie::IxHash') 
+          { import Tie::IxHash; 
+            $self->set_keep_atts_order(  $self->{keep_atts_order}); 
+          }
+        else 
+          { carp "Tie::IxHash not available, option  keep_atts_order not allowed"; }
+      }
+    else
+      { $self->set_keep_atts_order( 0); }
+
+    if( my $output_encoding= $args{OutputEncoding})
+      { $self->set_output_encoding( $output_encoding);
+        delete $args{OutputFilter};
+      }
+
+    if( $args{InputFilter})
+      { $self->set_input_filter(  $args{InputFilter}); 
+        delete  $args{InputFilter}; 
+      }
+
+    if( exists $args{Id}) { $ID= $args{Id}; delete $args{ID}; }
+
+    if( $args{NoExpand})
+      { $self->setHandlers( %twig_noexpand_handlers);
+        $self->{twig_no_expand}=1;
+      }
+
+    if( $args{NoProlog})
+      { $self->{no_prolog}= 1; 
+        delete $args{NoProlog}; 
+      }
+
+    if( $args{DoNotOutputDTD})
+      { $self->{no_dtd_output}= 1; 
+        delete $args{DoNotOutputDTD}; 
+      }
+
+    # set handlers
+    if( $self->{twig_roots})
+      { if( $self->{twig_default_print})
+          { if( $self->{twig_keep_encoding})
+              { $self->setHandlers( %twig_handlers_roots_print_original); }
+            else
+              { $self->setHandlers( %twig_handlers_roots_print);  }
+          }
+        else
+          { $self->setHandlers( %twig_handlers_roots); }
+      }
+    else
+      { $self->setHandlers( %twig_handlers); }
+
+    # XML::Parser::Expat does not like these handler to be set. So in order to 
+    # use the various sets of handlers on XML::Parser or XML::Parser::Expat
+    # objects when needed, these ones have to be set only once, here, at 
+    # XML::Parser level
+    $self->setHandlers( Init => \&_twig_init, Final => \&_twig_final);
+
+    $self->{twig_entity_list}= XML::Twig::Entity_list->new; 
+
+    $self->{twig_id}= $ID; 
+    $self->{twig_stored_spaces}='';
+
+    $self->{twig}= $self;
+    weaken( $self->{twig}) if( $weakrefs);
+
+    return $self;
+  }
+
+
+sub parseurl
+  { my $t= shift;
+    return $t->_parseurl( 0, @_);
+  }
+
+sub safe_parseurl
+  { my $t= shift;
+    return $t->_parseurl( 1, @_);
+  }
+
+# I should really add extra options to allow better configuration of the 
+# LWP::UserAgent object
+# this method forks: 
+#   - the child gets the data and copies it to the pipe,
+#   - the parent reads the stream and sends it to XML::Parser
+# the data is cut it chunks the size of the XML::Parser::Expat buffer
+# the method returns the twig and the status
+sub _parseurl
+  { my( $t, $safe, $url, $agent)= @_;
+    pipe( README, WRITEME) or croak  "cannot create connected pipes: $!";
+    if( my $pid= fork)
+      { # parent code: parse the incoming file
+        close WRITEME; # no need to write
+        my $result= $safe ? $t->safe_parse( \*README) : $t->parse( \*README);
+        close README;
+        return $@ ? 0 : $t;
+      }
+    else
+     { # child
+        close README; # no need to read
+        require LWP;  # so we can get LWP::UserAgent and HTTP::Request
+        $|=1;
+        $agent    ||= LWP::UserAgent->new;
+        my $request  = HTTP::Request->new( GET => $url);
+        # _pass_url_content is called with chunks of data the same size as
+        # the XML::Parser buffer 
+        my $response = $agent->request( $request, 
+                         sub { _pass_url_content( \*WRITEME, @_); }, BUFSIZE);
+        $response->is_success or croak "$url ", $response->message;
+        close WRITEME;
+        CORE::exit(); # CORE is there for mod_perl (which redefines exit)
+      }
+  }
+
+# get the (hopefully!) XML data from the URL and 
+sub _pass_url_content
+  { my( $fh, $data, $response, $protocol)= @_;
+    print $fh $data;
+  }
+
+sub add_options
+  { my %args= map { $_, 1 } @_;
+    %args= _normalize_args( %args);
+    foreach (keys %args) { $valid_option{$_}++; } 
+  }
+
+sub _twig_store_internal_dtd
+  { 
+    my( $p, $string)= @_;
+    my $t= $p->{twig};
+    $string= $p->original_string() if( $t->{twig_keep_encoding});
+    $t->{twig_doctype}->{internal} .= $string;
+  }
+
+sub _twig_stop_storing_internal_dtd
+  { my $p= shift;
+    if( @saved_default_handler && defined $saved_default_handler[1])
+      { $p->setHandlers( @saved_default_handler); }
+    else
+      { my $t= $p->{twig};
+        $p->setHandlers( Default => undef);
+      }
+  }
+
+
+sub _normalize_args
+  { my %normalized_args;
+    while( my $key= shift )
+      { $key= join '', map { ucfirst } split /_/, $key;
+        #$key= "Twig".$key unless( substr( $key, 0, 4) eq 'Twig');
+        $normalized_args{$key}= shift ;
+      }
+    return %normalized_args;
+  }    
+
+sub _is_fh { return unless $_[0]; return isa( $_[0], 'GLOB') || isa( $_[0], 'IO::Scalar'); }
+
+sub _set_handler
+  { my( $handlers, $path, $handler)= @_;
+
+    $handlers ||= {}; # create the handlers struct if necessary
+
+    my $prev_handler= $handlers->{handlers}->{$path} || undef;
+
+       _set_gi_handler              ( $handlers, $path, $handler, $prev_handler)
+    || _set_path_handler            ( $handlers, $path, $handler, $prev_handler)
+    || _set_subpath_handler         ( $handlers, $path, $handler, $prev_handler)
+    || _set_attribute_handler       ( $handlers, $path, $handler, $prev_handler)
+    || _set_star_att_handler        ( $handlers, $path, $handler, $prev_handler)
+    || _set_star_att_regexp_handler ( $handlers, $path, $handler, $prev_handler)
+    || _set_string_handler          ( $handlers, $path, $handler, $prev_handler)
+    || _set_attribute_regexp_handler( $handlers, $path, $handler, $prev_handler)
+    || _set_string_regexp_handler   ( $handlers, $path, $handler, $prev_handler)
+    || _set_pi_handler              ( $handlers, $path, $handler, $prev_handler)
+    || croak "unrecognized expression in handler: '$path'";
+
+
+    # this both takes care of the simple (gi) handlers and store
+    # the handler code reference for other handlers
+    $handlers->{handlers}->{$path}= $handler;
+
+    return $prev_handler;
+  }
+
+
+sub _set_gi_handler
+  { my( $handlers, $path, $handler, $prev_handler)= @_;
+    if( $path =~ m{^\s*($REG_NAME)\s*$}o )
+      { my $gi= $1;
+        $handlers->{handlers}->{gi}->{$gi}= $handler; 
+        return 1;
+      }
+    else 
+      { return 0; }
+  }
+
+sub _set_path_handler
+  { my( $handlers, $path, $handler, $prev_handler)= @_;
+    if( $path=~ m{^\s*(?:/$REG_NAME)*/($REG_NAME)\s*$}o)
+      { # a full path has been defined
+        # update the path_handlers count, knowing that
+        # either the previous or the new handler can be undef
+        $handlers->{path_handlers}->{gi}->{$1}-- if( $prev_handler);
+        if( $handler)
+         { $handlers->{path_handlers}->{gi}->{$1}++;
+           $handlers->{path_handlers}->{path}->{$path}= $handler;
+         }
+        return 1;
+      }
+    else 
+      { return 0; }
+  }
+
+sub _set_subpath_handler
+  { my( $handlers, $path, $handler, $prev_handler)= @_;
+    if( $path=~ m{^\s*(?:$REG_NAME/)+($REG_NAME)\s*$}o)
+      { # a partial path has been defined
+        # $1 is the "final" gi
+        $handlers->{subpath_handlers}->{gi}->{$1}-- if( $prev_handler);
+        if( $handler)
+         { $handlers->{subpath_handlers}->{gi}->{$1}++;
+           $handlers->{subpath_handlers}->{path}->{$path}= $handler;
+         }
+        return 1;
+      }
+    else 
+      { return 0; }
+  }
+
+sub _set_attribute_handler
+  { my( $handlers, $path, $handler, $prev_handler)= @_;
+    # check for attribute conditions
+    if( $path=~ m{^\s*($REG_NAME)          # elt
+                 \s*\[\s*\@                #    [@
+                 ($REG_NAME)\s*            #      att
+                 (?:=\s*($REG_STRING)\s*)? #           = value (optional)         
+                 \]\s*$}xo)                #                             ]  
+      { my( $gi, $att, $val)= ($1, $2, $3);
+        $val= substr( $val, 1, -1) if( defined $val); # remove the quotes
+        if( $prev_handler)
+          { # replace or remove the previous handler
+            my $i=0; # so we can splice the array if need be
+            foreach my $exp ( @{$handlers->{attcond_handlers_exp}->{$gi}})
+             { if( ($exp->{att} eq $att) && ( _eq( $exp->{val}, $val)) )
+                 { if( $handler) # just replace the handler
+                     { $exp->{handler}= $handler; }
+                   else          # remove the handler
+                     { $handlers->{attcond_handlers}->{$gi}--;
+                       splice( @{$handlers->{attcond_handlers_exp}->{$gi}}, $i, 1);
+                       last;
+                     }
+                 }
+               $i++;
+             }
+          }
+        elsif( $handler)
+          { # new handler only
+            $handlers->{attcond_handlers}->{$gi}++;
+            my $exp={att => $att, val => $val, handler => $handler};
+            $handlers->{attcond_handlers_exp}->{$gi} ||= [];
+            push @{$handlers->{attcond_handlers_exp}->{$gi}}, $exp;
+          }
+        return 1;
+      }
+    else 
+      { return 0; }
+  }
+
+
+sub _set_attribute_regexp_handler
+  { my( $handlers, $path, $handler, $prev_handler)= @_;
+    # check for attribute regexp conditions
+    if( $path=~ m{^\s*($REG_NAME)     # elt
+                 \s*\[\s*\@           #    [@
+                 ($REG_NAME)          #      att
+                 \s*=~\s*             #          =~
+                 /($REG_REGEXP_EXP)/  #             /regexp/
+                 ($REG_REGEXP_MOD)    #                     mods
+                 \s*]\s*$}gxo)        #                         ] 
+      { my( $gi, $att, $regexp, $mods)= ($1, $2, $3, $4);
+        $regexp= qr/(?$mods:$regexp)/;
+        if( $prev_handler)
+          { # replace or remove the previous handler
+            my $i=0; # so we can splice the array if need be
+            foreach my $exp ( @{$handlers->{attregexp_handlers_exp}->{$gi}})
+             { if( ($exp->{att} eq $att) && ($exp->{regexp} eq $regexp) )
+                 { if( $handler) # just replace the handler
+                     { $exp->{handler}= $handler; }
+                   else          # remove the handler
+                     { $handlers->{attregexp_handlers}->{$gi}--;
+                       splice( @{$handlers->{attregexp_handlers_exp}->{$gi}}, $i, 1);
+                       last;
+                     }
+                 }
+               $i++;
+             }
+          }
+        elsif( $handler)
+          { # new handler only
+            $handlers->{attregexp_handlers}->{$gi}++;
+            my $exp={att => $att, regexp => $regexp, handler => $handler};
+            $handlers->{attregexp_handlers_exp}->{$gi} ||= [];
+            push @{$handlers->{attregexp_handlers_exp}->{$gi}}, $exp;
+          }
+        return 1;
+      }
+    else 
+      { return 0; }
+  }
+
+sub _set_string_handler
+  { my( $handlers, $path, $handler, $prev_handler)= @_;
+    # check for string conditions
+    if( $path=~/^\s*($REG_NAME)            # elt
+                 \s*\[\s*string            #    [string
+                 \s*\(\s*($REG_NAME)?\s*\) #           (sub_elt)
+                 \s*=\s*                   #                     =
+                 ($REG_STRING)             #                       "text" (or 'text')
+                 \s*\]\s*$/ox)             #                              ] 
+      { my( $gi, $sub_elt, $text)= ($1, $2, $3);
+        $text= substr( $text, 1, -1) if( defined $text); # remove the quotes
+        if( $prev_handler)
+          { # replace or remove the previous handler
+            my $i=0; # so we can splice the array if need be
+            foreach my $exp ( @{$handlers->{text_handlers_exp}->{$gi}})
+             { if( ($exp->{text} eq $text) &&
+                   ( !$exp->{sub_elt} || ($exp->{sub_elt} eq $sub_elt) )
+                 )
+                 { if( $handler) # just replace the handler
+                     { $exp->{handler}= $handler; }
+                   else          # remove the handler
+                     { $handlers->{text_handlers}->{$gi}--;
+                       splice( @{$handlers->{text_handlers_exp}->{$gi}}, $i, 1);
+                       last;
+                     }
+                 }
+               $i++;
+             }
+          }
+        elsif( $handler)
+          { # new handler only
+            $handlers->{text_handlers}->{$gi}++;
+            my $exp={sub_elt => $sub_elt, text => $text, handler => $handler};
+            $handlers->{text_handlers_exp}->{$gi} ||= [];
+            push @{$handlers->{text_handlers_exp}->{$gi}}, $exp;
+          }
+        return 1;
+      }
+    else 
+      { return 0; 
+      }
+  }
+
+
+sub _set_string_regexp_handler
+  { my( $handlers, $path, $handler, $prev_handler)= @_;
+    # check for string regexp conditions
+    if( $path=~m{^\s*($REG_NAME)        # (elt)
+                 \s*\[\s*string         #    [string
+                 \s*\(\s*($REG_NAME?)\) #           (sub_elt)
+                 \s*=~\s*               #              =~ 
+                 /($REG_REGEXP_EXP)/    #                 /(regexp)/
+                 \s*($REG_REGEXP_MOD)?  #                         (mods)
+                 \s*\]\s*$}ox)          #                             ]   (or ')
+      { my( $gi, $sub_elt, $regexp, $mods)= ($1, $2, $3, $4);
+        $mods||="";
+        $regexp= qr/(?$mods:$regexp)/;
+        if( $prev_handler)
+          { # replace or remove the previous handler
+            my $i=0; # so we can splice the array if need be
+            foreach my $exp ( @{$handlers->{regexp_handlers_exp}->{$gi}})
+             { if( ($exp->{regexp} eq $regexp) &&
+                   ( !$exp->{sub_elt} || ($exp->{sub_elt} eq $sub_elt) )
+                 )
+                 { if( $handler) # just replace the handler
+                     { $exp->{handler}= $handler;  
+                     }
+                   else          # remove the handler
+                     { $handlers->{regexp_handlers}->{$gi}--;
+                       splice( @{$handlers->{regexp_handlers_exp}->{$gi}}, $i, 1);
+                       last;
+                     }
+                 }
+               $i++;
+             }
+          }
+        elsif( $handler)
+          { # new handler only
+            $handlers->{regexp_handlers}->{$gi}++;
+            my $exp= {sub_elt => $sub_elt, regexp => $regexp, handler => $handler};
+            $handlers->{regexp_handlers_exp}->{$gi} ||= [];
+            push @{$handlers->{regexp_handlers_exp}->{$gi}}, $exp;
+          }
+        return 1;
+      }
+    else 
+      { return 0; 
+      }
+  }
+
+
+sub _set_star_att_handler
+  { my( $handlers, $path, $handler, $prev_handler)= @_;
+    # check for *[@att="val"] or *[@att] conditions
+    if( $path=~/^(?:\s*\*)?         # * (optional)
+                 \s*\[\s*\@         #    [@
+                 ($REG_NAME)        #      att
+                 (?:\s*=\s*         #         = 
+                 ($REG_STRING))?    #           string
+                     \s*\]\s*$/ox)  #                 ]  
+      { my( $att, $val)= ($1, $2);
+        $val= substr( $val, 1, -1) if( defined $val); # remove the quotes from the string
+        if( $prev_handler)
+          { # replace or remove the previous handler
+            my $i=0; # so we can splice the array if need be
+            foreach my $exp ( @{$handlers->{att_handlers_exp}->{$att}})
+             { if( ($exp->{att} eq $att) && ( !defined( $val) || _eq( $exp->{val}, $val) ) )
+                 { if( $handler) # just replace the handler
+                     { $exp->{handler}= $handler; }
+                   else          # remove the handler
+                     { splice( @{$handlers->{att_handlers_exp}->{$att}}, $i, 1);
+                   $handlers->{att_handlers}->{$att}--;
+                       last;
+                     }
+                 }
+               $i++;
+             }
+          }
+        elsif( $handler)
+          { # new handler only
+            $handlers->{att_handlers}->{$att}++;
+            my $exp={att => $att, val => $val, handler => $handler};
+            $handlers->{att_handlers_exp}->{$att} ||= [];
+            push @{$handlers->{att_handlers_exp}->{$att}}, $exp;
+          }
+        return 1;
+      }
+    else 
+      { return 0; 
+      }
+  }
+
+sub _set_star_att_regexp_handler
+  { my( $handlers, $path, $handler, $prev_handler)= @_;
+    # check for *[@att=~ /regexp/] conditions
+    if( $path=~ m{^(?:\s*\*)?             # * (optional)
+                   \s*\[\s*\@             #  [@
+                   ($REG_NAME)            #    att
+                   \s*=~\s*               #        =~ 
+                   /($REG_REGEXP_EXP)/    #           /(regexp)/
+                   \s*($REG_REGEXP_MOD)?  #                     (mods)
+                   \s*\]\s*$}ox)          #                           ]  
+      { my( $att, $regexp, $mods)= ($1, $2, $3);
+        $mods||="";
+        $regexp= qr/(?$mods:$regexp)/;
+        if( $prev_handler)
+          { # replace or remove the previous handler
+            my $i=0; # so we can splice the array if need be
+            foreach my $exp ( @{$handlers->{att_regexp_handlers_exp}->{$att}})
+             { if( $exp->{regexp} eq $regexp)
+                 { if( $handler) # just replace the handler
+                     { $exp->{handler}= $handler;  
+                     }
+                   else          # remove the handler
+                     { splice( @{$handlers->{att_regexp_handlers_exp}->{$att}}, $i, 1);
+                   $handlers->{att_regexp_handlers}--;
+                       last;
+                     }
+                 }
+               $i++;
+             }
+          }
+        elsif( $handler)
+          { # new handler only
+            my $exp= { regexp => $regexp, handler => $handler};
+            $handlers->{regexp_handlers_exp}->{$att} ||= [];
+            push @{$handlers->{att_regexp_handlers_exp}->{$att}}, $exp;
+            $handlers->{att_regexp_handlers}++;
+          }
+        return 1;
+      }
+    else 
+      { return 0; 
+      }
+  }
+
+
+sub _set_pi_handler
+  { my( $handlers, $path, $handler, $prev_handler)= @_;
+    # PI conditions ( '?target' => \&handler or '?' => \&handler
+    #             or '#PItarget' => \&handler or '#PI' => \&handler)
+    if( $path=~ /^\s*(?:\?|#PI)\s*(?:([^\s]*)\s*)$/)
+      { my $target= $1 || '';
+        # update the path_handlers count, knowing that
+        # either the previous or the new handler can be undef
+        $handlers->{pi_handlers}->{$1}= $handler;
+        return 1;
+      }
+    else 
+      { return 0; 
+      }
+  }
+
+# just like eq except that undef values do not trigger warnings
+sub _eq
+  { my( $val1, $val2)= @_;
+    if( !defined $val1) { return !defined $val2 }
+    if( !defined $val2) { return 0; }
+    return $val1 eq $val2;
+  }
+
+sub setCharHandler
+  { my( $t, $handler)= @_;
+    $t->{twig_char_handler}= $handler;
+  }
+
+
+sub _reset_handlers
+  { my $handlers= shift;
+    delete $handlers->{handlers};
+    delete $handlers->{path_handlers};
+    delete $handlers->{subpath_handlers};
+    $handlers->{attcond_handlers_exp}=[] if( $handlers->{attcond_handlers});
+    delete $handlers->{attcond_handlers};
+  }
+  
+sub _set_handlers
+  { my $handlers= shift || return;
+    my $set_handlers= {};
+    foreach my $path (keys %{$handlers})
+      { _set_handler( $set_handlers, $path, $handlers->{$path}); }
+    return $set_handlers;
+  }
+    
+
+sub setTwigHandler
+  { my( $t, $path, $handler)= @_;
+    $t->{twig_handlers} ||={};
+    return _set_handler( $t->{twig_handlers}, $path, $handler);
+  }
+
+sub setTwigHandlers
+  { my( $t, $handlers)= @_;
+    my $previous_handlers= $t->{twig_handlers} || undef;
+    _reset_handlers( $t->{twig_handlers});
+    $t->{twig_handlers}= _set_handlers( $handlers);
+    return $previous_handlers;
+  }
+
+sub setStartTagHandler
+  { my( $t, $path, $handler)= @_;
+    $t->{twig_starttag_handlers}||={};
+    return _set_handler( $t->{twig_starttag_handlers}, $path, $handler);
+  }
+
+sub setStartTagHandlers
+  { my( $t, $handlers)= @_;
+    my $previous_handlers= $t->{twig_starttag_handlers} || undef;
+    _reset_handlers( $t->{twig_starttag_handlers});
+    $t->{twig_starttag_handlers}= _set_handlers( $handlers);
+    return $previous_handlers;
+   }
+
+sub setIgnoreEltsHandler
+  { my( $t, $path, $action)= @_;
+    $t->{twig_ignore_elts_handlers}||={};
+    return _set_handler( $t->{twig_ignore_elts_handlers}, $path, $action );
+  }
+
+sub setIgnoreEltsHandlers
+  { my( $t, $handlers)= @_;
+    my $previous_handlers= $t->{twig_ignore_elts_handlers} || undef;
+    _reset_handlers( $t->{twig_ignore_elts_handlers});
+    $t->{twig_ignore_elts_handlers}= _set_handlers( $handlers);
+    return $previous_handlers;
+   }
+
+sub setEndTagHandler
+  { my( $t, $path, $handler)= @_;
+    $t->{twig_endtag_handlers}||={};
+    return _set_handler( $t->{twig_endtag_handlers}, $path,$handler);
+  }
+
+sub setEndTagHandlers
+  { my( $t, $handlers)= @_;
+    my $previous_handlers= $t->{twig_endtag_handlers} || undef;
+    _reset_handlers( $t->{twig_endtag_handlers});
+    $t->{twig_endtag_handlers}= _set_handlers( $handlers);
+    return $previous_handlers;
+   }
+
+# a little more complex: set the twig_handlers only if a code ref is given
+sub setTwigRoots
+  { my( $t, $handlers)= @_;
+    my $previous_roots= $t->{twig_roots} || undef;
+    _reset_handlers($t->{twig_roots});
+    $t->{twig_roots}= _set_handlers( $handlers);
+    foreach my $path (keys %{$handlers})
+      { $t->{twig_handlers}||= {};
+        _set_handler( $t->{twig_handlers}, $path, $handlers->{$path})
+          if( isa( $handlers->{$path}, 'CODE')); 
+      }
+    return $previous_roots;
+  }
+
+# just store the reference to the expat object in the twig
+sub _twig_init
+  { 
+    my $p= shift;
+    my $t=$p->{twig};
+    $t->{twig_parser}= $p; 
+    weaken( $t->{twig_parser}) if( $weakrefs);
+    $t->{twig_parsing}=1;
+    # in case they had been created by a previous parse
+    delete $t->{twig_dtd};
+    delete $t->{twig_doctype};
+    delete $t->{twig_xmldecl};
+    # if needed set the output filehandle
+    $t->_set_fh_to_twig_output_fh();
+  }
+
+# uses eval to catch the parser's death
+sub safe_parse
+  { my( $t, $str)= @_;
+    eval { $t->parse( $str); } ;
+    return $@ ? 0 : $t;
+  }
+
+sub safe_parsefile
+  { my( $t, $file)= @_;
+    eval { $t->parsefile( $file); } ;
+    return $@ ? 0 : $t;
+  }
+
+
+sub _add_or_discard_stored_spaces
+  { my $t= shift;
+    my %option= @_;
+    
+    if( $t->{twig_stored_spaces} || $option{force} || $t->{twig_preserve_space})
+      { if( $t->{twig_current}->is_pcdata)
+          { $t->{twig_current}->append_pcdata($t->{twig_stored_spaces}); }
+        else
+          { my $current_gi= $t->{twig_current}->gi;
+            unless( defined( $t->{twig_space_policy}->{$current_gi}))
+              { $t->{twig_space_policy}->{$current_gi}= _space_policy( $t, $current_gi); }
+
+            if( $t->{twig_space_policy}->{$current_gi} ||  $option{force} || $t->{twig_preserve_space})
+              { _insert_pcdata( $t, $t->{twig_stored_spaces} ); }
+
+            $t->{twig_stored_spaces}='';
+          }
+      }
+  }
+
+# the default twig handlers, which build the tree
+sub _twig_start
+  { 
+    my ($p, $gi, @att)= @_;
+    my $t=$p->{twig};
+
+    # empty the stored pcdata (space stored in case they are really part of 
+    # a pcdata element) or stored it if the space policy dictades so
+    # create a pcdata element with the spaces if need be
+    _add_or_discard_stored_spaces( $t);
+    my $parent= $t->{twig_current};
+
+    # if we were parsing PCDATA then we exit the pcdata
+    if( $t->{twig_in_pcdata})
+      { $t->{twig_in_pcdata}= 0;
+        delete $parent->{'twig_current'};
+        $parent= $parent->{parent};
+      }
+
+    # if we choose to keep the encoding then we need to parse the tag
+    if( my $func = $t->{parse_start_tag})
+      { ($gi, @att)= &$func($p->original_string); }
+    
+    # filter the input data if need be  
+    if( my $filter= $t->{twig_input_filter})
+      { $gi= $filter->( $gi);
+        @att= map { $filter->($_) } @att; 
+      }
+
+    if( $t->{twig_map_xmlns}) 
+      { 
+        foreach my $new_prefix ( $p->new_ns_prefixes)
+          { my $uri= $t->parser->expand_ns_prefix( $new_prefix);
+            # replace the prefix if it is mapped
+            if( !$t->{twig_keep_original_prefix} && (my $mapped_prefix= $t->{twig_map_xmlns}->{$uri}))
+              { $new_prefix= $mapped_prefix; }
+            # now put the namespace declaration back in the element
+            if( $new_prefix eq '#default')
+              { push @att, "xmlns" =>  $uri; } 
+            else
+              { push @att, "xmlns:$new_prefix" =>  $uri; } 
+          }
+
+        if( $t->{twig_keep_original_prefix})
+          { # things become more complex: we need to find the original prefix
+            # and store both prefixes
+            my $ns_info= $t->_ns_info( $gi);
+            my $map_att;
+            if( $ns_info->{mapped_prefix})
+              { $gi= "$ns_info->{mapped_prefix}:$gi";
+                $map_att->{$ns_info->{mapped_prefix}}= $ns_info->{prefix};
+              }
+            my $att_name=1;
+            foreach( @att) 
+              { if( $att_name) 
+                  { 
+                    my $ns_info= $t->_ns_info( $_);
+                    if( $ns_info->{mapped_prefix})
+                      { $_= "$ns_info->{mapped_prefix}:$_";
+                        $map_att->{$ns_info->{mapped_prefix}}= $ns_info->{prefix};
+                      }
+                    $att_name=0; 
+                  }
+                else           
+                  {  $att_name=1; }
+              }
+            push @att, '#original_gi', $map_att if( $map_att);
+          }
+        else
+          { $gi= $t->_replace_prefix( $gi); 
+            my $att_name=1;
+            foreach( @att) 
+              { if( $att_name) { $_= $t->_replace_prefix( $_); $att_name=0; }
+                else           {  $att_name=1; }
+              }
+          }
+      }
+
+    my $elt= $t->{twig_elt_class}->new( $gi);
+    $elt->set_atts( @att);
+ 
+    delete $parent->{'twig_current'} if( $parent);
+    $t->{twig_current}= $elt;
+    $elt->{'twig_current'}=1;
+
+    if( $parent)
+      { my $prev_sibling= $parent->{last_child};
+        if( $prev_sibling) 
+          { $prev_sibling->{next_sibling}=  $elt; 
+            $elt->set_prev_sibling( $prev_sibling);
+          }
+
+        $elt->set_parent( $parent);
+        $parent->{first_child}=  $elt unless( $parent->{first_child}); 
+        $parent->set_last_child( $elt);
+      }
+    else 
+      { # processing root
+        $t->set_root( $elt);
+        # call dtd handlerif need be
+        $t->{twig_dtd_handler}->($t, $t->{twig_dtd})
+          if( defined $t->{twig_dtd_handler});
+      
+        # set this so we can catch external entities
+        # (the handler was modified during DTD processing)
+        if( $t->{twig_default_print})
+          { $p->setHandlers( Default => \&_twig_print); }
+        elsif( $t->{twig_roots})
+          { $p->setHandlers( Default => sub { return }); }
+        else
+          { $p->setHandlers( Default => \&_twig_default); }
+      }
+   
+    $elt->{empty}=  $p->recognized_string=~ m{/\s*>$}s ? 1 : 0;
+
+    $elt->{extra_data}= $t->{extra_data} if( $t->{extra_data});
+    $t->{extra_data}='';
+
+    # if the element is ID-ed then store that info
+    my $id= $elt->{'att'}->{$ID};
+    if( $id) { $t->{twig_id_list}->{$id}= $elt; 
+               weaken( $t->{twig_id_list}->{$id}) if( $weakrefs);
+             }
+
+
+    # call user handler if need be
+    if( $t->{twig_starttag_handlers})
+      { # call all appropriate handlers
+        my @handlers= _handler( $t, $t->{twig_starttag_handlers}, $gi, $elt);
+    
+        local $_= $elt;
+    
+        foreach my $handler ( @handlers)
+          { $handler->($t, $elt) || last; }
+        # call _all_ handler if needed
+        if( my $all= $t->{twig_starttag_handlers}->{handlers}->{$ALL})
+          { $all->($t, $elt); }
+      }
+
+    # check if the tag is in the list of tags to be ignored
+    if( $t->{twig_ignore_elts_handlers})
+      { my @handlers= _handler( $t, $t->{twig_ignore_elts_handlers}, $gi, $elt);
+        # only the first handler counts, it contains the action (discard/print/string)
+        if( @handlers) { my $action= shift @handlers; $t->ignore( $action); }
+      }
+
+    if( $elt->{'att'}->{'xml:space'} && (  $elt->{'att'}->{'xml:space'} eq 'preserve')) { $t->{twig_preserve_space}++; }
+
+  }
+
+# extract prefix, local_name, uri, mapped_prefix from a name
+# will only work if called from a start or end tag handler
+sub _ns_info
+  { my( $t, $name)= @_;
+    my $ns_info={};
+    my $p= $t->parser;
+    $ns_info->{uri}= $p->namespace( $name); 
+    return $ns_info unless( $ns_info->{uri});
+
+    $ns_info->{prefix}= _a_proper_ns_prefix( $p, $ns_info->{uri});
+    $ns_info->{mapped_prefix}= $t->{twig_map_xmlns}->{$ns_info->{uri}} || $ns_info->{prefix};
+
+    return $ns_info;
+  }
+    
+sub _a_proper_ns_prefix
+  { my( $p, $uri)= @_;
+    foreach my $prefix ($p->current_ns_prefixes)
+      { if( $p->expand_ns_prefix( $prefix) eq $uri)
+          { return $prefix; }
+      }
+  }
+
+
+# the default function to parse a start tag (in keep_encoding mode)
+# can be overridden with the parse_start_tag method
+# only works for 1-byte character sets
+sub _parse_start_tag
+  { my $string= shift;
+    my( $gi, @atts);
+
+    # get the gi (between < and the first space, / or > character)
+    #if( $string=~ s{^<\s*([^\s>/]*)[\s>/]*}{}s)
+    if( $string=~ s{^<\s*($REG_NAME)[\s>/]}{}s)
+      { $gi= $1; }
+    else
+      { croak "error parsing tag '$string'"; }
+    while( $string=~ s{^([^\s=]*)\s*=\s*(["'])(.*?)\2\s*}{}s)
+      { push @atts, $1, $3; }
+    return $gi, @atts;
+  }
+
+sub set_root
+  { my( $t, $elt)= @_;
+    $t->{twig_root}= $elt;
+    $elt->{twig}= $t;
+    weaken(  $elt->{twig}) if( $weakrefs);
+  }
+
+sub _twig_end($$;@)
+  { 
+    my ($p, $gi)  = @_;
+    my $t=$p->{twig};
+
+    if( $t->{twig_map_xmlns}) { $gi= $t->_replace_prefix( $gi); }
+  
+    _add_or_discard_stored_spaces( $t);
+ 
+    # the new twig_current is the parent
+    my $elt= $t->{twig_current};
+    delete $elt->{'twig_current'};
+
+    # if we were parsing PCDATA then we exit the pcdata too
+    if( $t->{twig_in_pcdata})
+      { $t->{twig_in_pcdata}= 0;
+        $elt= $elt->{parent} if($elt->{parent});
+        delete $elt->{'twig_current'};
+      }
+
+    # parent is the new current element
+    my $parent= $elt->{parent};
+    $parent->{'twig_current'}=1 if( $parent);
+    $t->{twig_current}= $parent;
+
+    $elt->{extra_data_before_end_tag}= $t->{extra_data} if( $t->{extra_data}); 
+    $t->{extra_data}='';
+
+    if( $t->{twig_handlers})
+      { # look for handlers
+        my @handlers= _handler( $t, $t->{twig_handlers}, $gi, $elt);
+
+        local $_= $elt; # so we can use $_ in the handlers
+    
+        foreach my $handler ( @handlers)
+          { $handler->($t, $elt) || last; }
+        # call _all_ handler if needed
+        if( my $all= $t->{twig_handlers}->{handlers}->{$ALL})
+          { $all->($t, $elt); }
+      }
+
+    # if twig_roots is set for the element then set appropriate handler
+    if(  $t->{twig_root_depth} and ($p->depth == $t->{twig_root_depth}) )
+      { if( $t->{twig_default_print})
+          { # select the proper fh (and store the currently selected one)
+            $t->_set_fh_to_twig_output_fh(); 
+            if( $t->{twig_keep_encoding})
+              { $p->setHandlers( %twig_handlers_roots_print_original); }
+            else
+              { $p->setHandlers( %twig_handlers_roots_print); }
+          }
+        else
+          { $p->setHandlers( %twig_handlers_roots); }
+      }
+
+    if( $elt->{'att'}->{'xml:space'} && (  $elt->{'att'}->{'xml:space'} eq 'preserve')) { $t->{twig_preserve_space}--; }
+  }
+
+# return the list of handler that can be activated for an element 
+# (either of CODE ref's or 1's for twig_roots)
+
+sub _handler
+  { my( $t, $handlers, $gi, $elt)= @_;
+
+    my @found_handlers=();
+    my $found_handler;
+
+    # warning: $elt can be either 
+    # - a regular element
+    # - a ref to the attribute hash (when called for an element 
+    #   for which the XML::Twig::Elt has not been built, outside 
+    #   of the twig_roots)
+    # - a string (case of an entity in keep_encoding mode)
+
+    # check for an attribute expression with no gi
+    if( $handlers->{att_handlers})
+      { my %att_handlers= %{$handlers->{att_handlers_exp}};
+        foreach my $att ( keys %att_handlers)
+          { my $att_val;
+            # get the attribute value
+            if( ref $elt eq 'HASH')
+              { $att_val= $elt->{$att}; }     # $elt is the atts hash
+            elsif( isa( $elt,'XML::Twig::Elt'))
+              { $att_val= $elt->{'att'}->{$att}; }  # $elt is an element
+                if( defined $att_val)
+                  { my @cond= @{$handlers->{att_handlers_exp}->{$att}};
+                    foreach my $cond (@cond)
+                      {  # 2 cases: either there is a val and the att value should be equal to it
+                         #          or there is no val (condition was gi[@att]), just for the att to be defined 
+                    if( !defined $cond->{val} || ($att_val eq $cond->{val}) )  
+                      { push @found_handlers, $cond->{handler};}
+                  }
+              }
+          }
+      }
+
+    # check for an attribute regexp expression with no gi
+    if( $handlers->{att_regexp_handlers})
+      { my %att_handlers= %{$handlers->{att_regexp_handlers_exp}};
+        foreach my $att ( keys %att_handlers)
+          { my $att_val;
+            # get the attribute value
+            if( ref $elt eq 'HASH')
+              { $att_val= $elt->{$att}; }     # $elt is the atts hash
+            elsif( isa( $elt,'XML::Twig::Elt'))
+              { $att_val= $elt->{'att'}->{$att}; }  # $elt is an element
+
+            if( defined $att_val)
+              { my @cond= @{$handlers->{att_regexp_handlers_exp}->{$att}};
+                foreach my $cond (@cond)
+                  { if( $att_val=~ $cond->{regexp})  
+                      { push @found_handlers, $cond->{handler};}
+                  }
+              }
+          }
+      }
+
+    # check for a text expression
+    if( $handlers->{text_handlers}->{$gi})
+      { my @text_handlers= @{$handlers->{text_handlers_exp}->{$gi}};
+        foreach my $exp ( @text_handlers)
+          { if (!$exp->{sub_elt})
+              { push @found_handlers, $exp->{handler}
+                  if $elt->text eq $exp->{text};
+              }
+            else
+              { foreach my $child ($elt->children($exp->{sub_elt}))
+                  { if( $child->text eq $exp->{text})
+                      { push @found_handlers, $exp->{handler};
+                        last;
+                      }
+                  }
+              }
+          }
+      }
+
+    # check for a text regexp expression
+    if( $handlers->{regexp_handlers}->{$gi})
+      { my @regexp_handlers= @{$handlers->{regexp_handlers_exp}->{$gi}};
+        foreach my $exp ( @regexp_handlers)
+          { if( !$exp->{sub_elt})
+              { push @found_handlers, $exp->{handler}
+                  if $elt->text =~ $exp->{regexp};
+              }
+            else
+              { foreach my $child ($elt->children($exp->{sub_elt}))
+                  { if( $child->text =~ $exp->{regexp})
+                      { push @found_handlers, $exp->{handler};
+                        last;
+                      }
+                  }
+              }
+          }
+      }
+
+    # check for an attribute expression
+    if( $handlers->{attcond_handlers}->{$gi})
+      { my @attcond_handlers= @{$handlers->{attcond_handlers_exp}->{$gi}};
+        foreach my $exp ( @attcond_handlers)
+          { my $att_val;
+        # get the attribute value
+        if( ref $elt eq 'HASH')
+          { $att_val= $elt->{$exp->{att}}; }    # $elt is the atts hash
+        else
+          { $att_val= $elt->{'att'}->{$exp->{att}}; }# $elt is an element
+
+        # 2 cases: either there is a val and the att value should be equal to it
+        #          or there is no val (condition was gi[@att]), just for the att to be defined 
+        if( defined $att_val && ( !defined $exp->{val} || ($att_val eq $exp->{val}) ) ) 
+              { push @found_handlers, $exp->{handler}; }
+          }
+      }
+
+    # check for an attribute regexp
+    if( $handlers->{attregexp_handlers}->{$gi})
+      { my @attregexp_handlers= @{$handlers->{attregexp_handlers_exp}->{$gi}};
+        foreach my $exp ( @attregexp_handlers)
+          { my $att_val;
+        # get the attribute value
+        if( ref $elt eq 'HASH')
+          { $att_val= $elt->{$exp->{att}}; }    # $elt is the atts hash
+        else
+          { $att_val= $elt->{'att'}->{$exp->{att}}; }# $elt is an element
+
+        if( defined $att_val && ( ($att_val=~  $exp->{regexp}) ) ) 
+              { push @found_handlers, $exp->{handler}; }
+          }
+      }
+
+    # check for a full path
+    if( defined $handlers->{path_handlers}->{gi}->{$gi})
+      { my $path= $t->path( $gi); 
+        if( defined( $found_handler= $handlers->{path_handlers}->{path}->{$path}) )
+          { push @found_handlers, $found_handler; }
+      }
+
+    # check for a partial path
+    if( $handlers->{subpath_handlers}->{gi}->{$gi})
+      { my $path= $t->path( $gi);
+        while( $path)
+          { # test each sub path
+            if( defined( $found_handler= $handlers->{subpath_handlers}->{path}->{$path}) )
+              { push @found_handlers, $found_handler; }
+             $path=~ s{^[^/]*/?}{}; # remove initial gi and /
+          }
+      }
+
+    # check for a gi (simple gi's are stored directly in the handlers field)
+    if( defined $handlers->{handlers}->{gi}->{$gi})
+      { push @found_handlers, $handlers->{handlers}->{gi}->{$gi}; }
+
+    # if no handler found call default handler if defined
+    if( !@found_handlers && defined $handlers->{handlers}->{$DEFAULT})
+      { push @found_handlers, $handlers->{handlers}->{$DEFAULT}; }
+
+    if( @found_handlers and $t->{twig_do_not_chain_handlers}) 
+      { @found_handlers= ($found_handlers[0]); }
+
+    return @found_handlers; # empty if no handler found
+
+  }
+
+
+sub _replace_prefix
+  { my( $t, $name)= @_;
+    my $p= $t->parser;
+    my $uri= $p->namespace( $name);
+    # try to get the namespace rom default if none is found (for attributes)
+    # this should probably be an option
+    if( !$uri and( $name!~/^xml/)) { $uri= $p->expand_ns_prefix( '#default'); }
+    if( $uri)
+      { if (my $mapped_prefix= $t->{twig_map_xmlns}->{$uri})
+          { return "$mapped_prefix:$name"; }
+        else
+          { my $prefix= _a_proper_ns_prefix( $p, $uri);
+            return $prefix ? "$prefix:$name" : $name; 
+          }
+      }
+    else
+      { return $name; }
+  }
+
+sub _twig_char
+  { 
+    my ($p, $string)= @_;
+    my $t=$p->{twig}; 
+
+    # if keep_encoding was set then use the original string instead of
+    # the parsed (UTF-8 converted) one
+    if( $t->{twig_keep_encoding})
+      { $string= $p->original_string(); }
+
+    if( $t->{twig_input_filter})
+      { $string= $t->{twig_input_filter}->( $string); }
+
+    if( $t->{twig_char_handler})
+      { $string= $t->{twig_char_handler}->( $string); }
+
+    my $elt= $t->{twig_current};
+
+    if(    $t->{twig_in_cdata})
+      { # text is the continuation of a previously created pcdata
+        $elt->{cdata}.=  $t->{twig_stored_spaces}.$string; } 
+    elsif( $t->{twig_in_pcdata})
+      { # text is the continuation of a previously created cdata
+        $elt->{pcdata}.=  $string; 
+      } 
+    else
+      { # text is just space, which might be discarded later
+        if( $string=~/\A\s*\Z/s)
+          { if( $t->{extra_data})
+              { # we got extra data (comment, pi), lets add the spaces to it
+                $t->{extra_data} .= $string; 
+              }
+            else
+              { # no extra data, just store the spaces
+                $t->{twig_stored_spaces}.= $string;
+              }
+          } 
+        else
+          { my $new_elt= _insert_pcdata( $t, $t->{twig_stored_spaces}.$string);
+            delete $elt->{'twig_current'};
+            $new_elt->{'twig_current'}=1;
+            $t->{twig_current}= $new_elt;
+            $t->{twig_in_pcdata}=1;
+            $new_elt->{extra_data}= $t->{extra_data} if( $t->{extra_data});
+            $t->{extra_data}='';
+          }
+      }
+  }
+
+sub _twig_cdatastart
+  { 
+    my $p= shift;
+    my $t=$p->{twig};
+
+    $t->{twig_in_cdata}=1;
+    my $cdata=  $t->{twig_elt_class}->new( '#CDATA');
+    my $twig_current= $t->{twig_current};
+
+    if( $t->{twig_in_pcdata})
+      { # create the node as a sibling of the #PCDATA
+        $cdata->set_prev_sibling( $twig_current);
+        $twig_current->{next_sibling}=  $cdata;
+        my $parent= $twig_current->{parent};
+        $cdata->set_parent( $parent);
+        $parent->set_last_child( $cdata);
+        $t->{twig_in_pcdata}=0;
+      }
+    else
+      { # we have to create a PCDATA element if we need to store spaces
+        if( $t->_space_policy($XML::Twig::index2gi[$twig_current->{'gi'}]) && $t->{twig_stored_spaces})
+          { _insert_pcdata( $t, $t->{twig_stored_spaces}); }
+        $t->{twig_stored_spaces}='';
+      
+        # create the node as a child of the current element      
+        $cdata->set_parent( $twig_current);
+        if( my $prev_sibling= $twig_current->{last_child})
+          { $cdata->set_prev_sibling( $prev_sibling);
+            $prev_sibling->{next_sibling}=  $cdata;
+          }
+        else
+          { $twig_current->{first_child}=  $cdata; }
+        $twig_current->set_last_child( $cdata);
+      
+      }
+
+    delete $twig_current->{'twig_current'};
+    $t->{twig_current}= $cdata;
+    $cdata->{'twig_current'}=1;
+  }
+
+sub _twig_cdataend
+  { 
+    my $p= shift;
+    my $t=$p->{twig};
+
+    $t->{twig_in_cdata}=0;
+
+    my $elt= $t->{twig_current};
+    delete $elt->{'twig_current'};
+    my $cdata= $elt->{cdata};
+    $elt->{cdata}=  $cdata;
+
+    if( $t->{twig_handlers})
+      { # look for handlers
+        my @handlers= _handler( $t, $t->{twig_handlers}, CDATA, $elt);
+        local $_= $elt; # so we can use $_ in the handlers
+        foreach my $handler ( @handlers) { $handler->($t, $elt) || last; }
+      }
+
+    $elt= $elt->{parent};
+    $t->{twig_current}= $elt;
+    $elt->{'twig_current'}=1;
+  }
+
+sub _twig_pi
+  { 
+    my( $p, $target, $data)= @_;
+    my $t=$p->{twig};
+    return unless( $t->{twig_process_pi} || $t->{twig_keep_pi});
+
+    if( $t->{twig_input_filter})
+      { $target = $t->{twig_input_filter}->( $target) ;
+        $data   = $t->{twig_input_filter}->( $data)   ;
+      }
+
+    my $twig_current= $t->{twig_current};    # always defined
+
+    # if pi's are to be kept then we piggiback them to the current element
+    if( $t->{twig_keep_pi})
+      {  
+        if( my $handler= $t->{twig_handlers}->{pi_handlers}->{$target})
+          { $t->{extra_data}.= $handler->( $t, $target, $data); }
+        elsif( $handler= $t->{twig_handlers}->{pi_handlers}->{''})
+          { $t->{extra_data}.= $handler->( $t, $target, $data); }
+        else
+          { if( $t->{twig_stored_spaces})
+              { $t->{extra_data}.= $t->{twig_stored_spaces};
+                $t->{twig_stored_spaces}= '';
+              }
+            # then the recognized/original string (input filtered if needed)
+            my $extra_data= $XML::Twig::Elt::keep_encoding ?  $p->recognized_string() : $p->original_string();
+            $extra_data= $t->{twig_input_filter}->( $extra_data) if( $t->{twig_input_filter});
+            $t->{extra_data}.= $extra_data;
+            return;
+          }
+
+      }
+    else
+      { # pi's are processed
+        my $pi=  $t->{twig_elt_class}->new( PI);
+        $pi->set_pi( $target, $data);
+
+        unless( $t->root)
+          {  _pi_handlers( $t, $pi, $target);
+            _add_prolog_data( $t, $pi); 
+            return;
+          }
+
+        if( $t->{twig_in_pcdata})
+          { # create the node as a sibling of the #PCDATA
+            $pi->paste_after( $twig_current);
+            $t->{twig_in_pcdata}=0;
+          }
+        else
+          { # we have to create a PCDATA element if we need to store spaces
+            if( $t->_space_policy($XML::Twig::index2gi[$twig_current->{'gi'}]) && $t->{twig_stored_spaces})
+              { _insert_pcdata( $t, $t->{twig_stored_spaces}); }
+            $t->{twig_stored_spaces}='';
+            # create the node as a child of the current element
+            $pi->paste_last_child( $twig_current);
+          }
+    
+        delete $twig_current->{'twig_current'};
+        my $parent= $pi->{parent}; 
+        $t->{twig_current}= $parent;
+        $parent->{'twig_current'}=1;
+
+        _pi_handlers( $t, $pi, $target);
+      }
+
+  }
+
+sub _pi_handlers
+  { my( $t, $pi, $target)= @_;
+    if( my $handler= $t->{twig_handlers}->{pi_handlers}->{$target})
+      { local $_= $pi; $handler->( $t, $pi); }
+    elsif( $handler= $t->{twig_handlers}->{pi_handlers}->{''})
+      { local $_= $pi; $handler->( $t, $pi); }
+  }
+
+
+sub _twig_comment
+  { 
+    my( $p, $comment_text)= @_;
+    my $t=$p->{twig};
+    return unless( $t->{twig_process_comments} || $t->{twig_keep_comments});
+
+    my $twig_current= $t->{twig_current};    # always defined
+
+    # if comments are to be kept then we piggiback them to the current element
+    if( $t->{twig_keep_comments})
+      { # first add spaces
+        if( $t->{twig_stored_spaces})
+              { $t->{extra_data}.= $t->{twig_stored_spaces};
+                $t->{twig_stored_spaces}= '';
+              }
+        # then the recognized/original string (input filtered if needed)
+        my $extra_data= $XML::Twig::Elt::keep_encoding ?  $p->recognized_string() : $p->original_string();
+        $extra_data= $t->{twig_input_filter}->( $extra_data) if( $t->{twig_input_filter});
+        $t->{extra_data}.= $extra_data;
+        return;
+      }
+
+    $comment_text= $t->{twig_input_filter}->( $comment_text) if( $t->{twig_input_filter});
+
+    my $comment=  $t->{twig_elt_class}->new( COMMENT);
+    $comment->{comment}=  $comment_text;
+
+    unless( $t->root) 
+      { _add_prolog_data( $t, $comment);
+        _comment_handler( $t, $comment);
+        return;
+      }
+
+    if( $t->{twig_in_pcdata})
+      { # create the node as a sibling of the #PCDATA
+        $comment->paste_after( $twig_current);
+        $t->{twig_in_pcdata}=0;
+      }
+    else
+      { # we have to create a PCDATA element if we need to store spaces
+        if( $t->_space_policy($XML::Twig::index2gi[$twig_current->{'gi'}]) && $t->{twig_stored_spaces})
+          { _insert_pcdata( $t, $t->{twig_stored_spaces}); }
+        $t->{twig_stored_spaces}='';
+        # create the node as a child of the current element
+        $comment->paste_last_child( $twig_current);
+
+      }
+    _comment_handler( $t, $comment);
+
+    delete $twig_current->{'twig_current'};
+
+    my $parent= $comment->{parent};
+    $t->{twig_current}= $parent;
+    $parent->{'twig_current'}=1;
+
+  }
+
+sub _comment_handler
+  { my( $t, $comment)= @_;
+    if( $t->{twig_handlers}->{handlers}->{gi}->{'#COMMENT'})
+      { # look for handlers
+        local $_= $comment;
+        my @handlers= _handler( $t, $t->{twig_handlers}, '#COMMENT', $comment);
+        foreach my $handler ( @handlers)
+          { $handler->($t, $comment) || last; }
+      }
+  }
+
+
+sub _add_prolog_data
+  { my($t, $prolog_data)= @_;
+    # comment before the first element
+    $t->{prolog_data} ||= $t->{twig_elt_class}->new( '#PROLOG_DATA');
+    # create the node as a child of the current element
+    $prolog_data->paste_last_child( $t->{prolog_data});
+  }
+  
+sub _twig_final
+  { 
+    my $p= shift;
+    my $t=$p->{twig};
+
+    # restore the selected filehandle if needed
+    $t->_set_fh_to_selected_fh();
+
+    select $t->{twig_original_selected_fh} if($t->{twig_original_selected_fh}); # probably dodgy
+
+    # tries to clean-up (probably not very well at the moment)
+    undef $p->{twig};
+    undef $t->{twig_parser};
+
+    undef $t->{twig_parsing};
+
+    return $t;
+  }
+
+sub _insert_pcdata
+  { my( $t, $string)= @_;
+    # create a new #PCDATA element
+    my $parent= $t->{twig_current};    # always defined
+    my $elt=  $t->{twig_elt_class}->new( PCDATA);
+    $elt->{pcdata}=  $string;
+    my $prev_sibling= $parent->{last_child};
+    if( $prev_sibling) 
+      { $prev_sibling->{next_sibling}=  $elt; 
+        $elt->set_prev_sibling( $prev_sibling);
+      }
+    else
+      { $parent->{first_child}=  $elt; }
+
+    $elt->set_parent( $parent);
+    $parent->set_last_child( $elt);
+    $t->{twig_stored_spaces}='';
+    return $elt;
+  }
+
+sub _space_policy
+  { my( $t, $gi)= @_;
+    my $policy;
+    $policy=0 if( $t->{twig_discard_spaces});
+    $policy=1 if( $t->{twig_keep_spaces});
+    $policy=1 if( $t->{twig_keep_spaces_in}
+               && $t->{twig_keep_spaces_in}->{$gi});
+    $policy=0 if( $t->{twig_discard_spaces_in} 
+               && $t->{twig_discard_spaces_in}->{$gi});
+    return $policy;
+  }
+
+
+sub _twig_entity($$$$$$)
+  { 
+    my( $p, $name, $val, $sysid, $pubid, $ndata)= @_;
+    my $t=$p->{twig};
+    my $ent=XML::Twig::Entity->new( $name, $val, $sysid, $pubid, $ndata);
+    $t->{twig_entity_list}->add( $ent);
+    if( $parser_version > 2.27) 
+      { # this is really ugly, but with some versions of XML::Parser the value 
+        # of the entity is not properly returned by the default handler
+        my $ent_decl= $ent->text;
+        if( $t->{twig_keep_encoding})
+          { if( defined $ent->{val} && ($ent_decl !~ /["']/))
+              { my $val=  $ent->{val};
+                $ent_decl .= $val =~ /"/ ? qq{'$val' } : qq{"$val" }; 
+              }
+				    # for my solaris box (perl 5.6.1, XML::Parser 2.31, expat?)
+            $t->{twig_doctype}->{internal}=~ s{<!ENTITY\s+$name\s+$}{substr( $ent_decl, 0, -1)}e;
+          }
+        $t->{twig_doctype}->{internal} .= $ent_decl 
+          unless( $t->{twig_doctype}->{internal}=~ m{<!ENTITY\s+$name\s+});
+      }
+  }
+
+sub _twig_xmldecl
+  { 
+    my $p= shift;
+    my $t=$p->{twig};
+    $t->{twig_xmldecl}||={};                 # could have been set by set_output_encoding
+    $t->{twig_xmldecl}->{version}= shift;
+    $t->{twig_xmldecl}->{encoding}= shift; 
+    $t->{twig_xmldecl}->{standalone}= shift;
+  }
+
+sub _twig_doctype
+  { 
+    my( $p, $name, $sysid, $pub, $internal)= @_;
+    my $t=$p->{twig};
+    $t->{twig_doctype}||= {};                   # create 
+    $t->{twig_doctype}->{name}= $name;          # always there
+    $t->{twig_doctype}->{sysid}= $sysid;        #  
+    $t->{twig_doctype}->{pub}= $pub;            #  
+
+    # now let's try to cope with XML::Parser 2.28 and above
+    if( $parser_version > 2.27)
+      { @saved_default_handler= $p->setHandlers( Default     => \&_twig_store_internal_dtd,
+                                                 Entity      => \&_twig_entity,
+                                               );
+      $p->setHandlers( DoctypeFin  => \&_twig_stop_storing_internal_dtd);
+      $t->{twig_doctype}->{internal}='';
+      }
+    else            
+      # for XML::Parser before 2.28
+      { $t->{twig_doctype}->{internal}=$internal; }
+
+    # now check if we want to get the DTD info
+    if( $t->{twig_read_external_dtd} && $sysid)
+      { # let's build a fake document with an internal DTD
+        # is this portable?
+        my $tmpfile= "twig_tmp$$";
+        open( TMP, ">$tmpfile") 
+          or croak "cannot create temp file $tmpfile: $!";
+        print TMP "<!DOCTYPE $name [\n";   # print the doctype
+        # slurp the DTD
+          { open( DTD, "<$sysid") 
+              or croak "cannot open dtd file $sysid: $!";
+            local $/= undef;
+            my $dtd= <DTD>;
+            close DTD;
+            print TMP $dtd;                 # add the dtd
+          }
+        print TMP "]>";                     # close the dtd
+        print TMP "<dummy></dummy>\n";      # XML::Parser needs an element
+
+        close TMP;
+       
+        $t->save_global_state();            # save the globals (they will be reset by the following new)  
+        my $t_dtd= XML::Twig->new;          # create a temp twig
+        $t->restore_global_state();
+        $t_dtd->parsefile( $tmpfile);       # parse it
+        $t->{twig_dtd}= $t_dtd->{twig_dtd}; # grab the dtd info
+        #$t->{twig_dtd_is_external}=1;
+        $t->{twig_entity_list}= $t_dtd->{twig_entity_list}; # grab the entity info
+
+        unlink $tmpfile;
+      }
+
+  }
+
+sub _twig_element
+  { 
+    my( $p, $name, $model)= @_;
+    my $t=$p->{twig};
+    $t->{twig_dtd}||= {};                      # may create the dtd 
+    $t->{twig_dtd}->{model}||= {};             # may create the model hash 
+    $t->{twig_dtd}->{elt_list}||= [];          # ordered list of elements 
+    push @{$t->{twig_dtd}->{elt_list}}, $name; # store the elt
+    $t->{twig_dtd}->{model}->{$name}= $model;  # store the model
+    if( ($parser_version > 2.27) && ($t->{twig_doctype}->{internal}=~ m{(^|>)\s*$}) ) 
+      { my $text= $XML::Twig::Elt::keep_encoding ? $p->original_string : $p->recognized_string; 
+        unless( $text)
+          { # this version of XML::Parser does not return the text in the *_string method
+            # we need to rebuild it
+            $text= "<!ELEMENT $name $model>";
+          }
+        $t->{twig_doctype}->{internal} .= $text;
+      }
+  }
+
+sub _twig_attlist
+  { 
+    my( $p, $el, $att, $type, $default, $fixed)= @_;
+    my $t=$p->{twig};
+    $t->{twig_dtd}||= {};                      # create dtd if need be 
+    $t->{twig_dtd}->{$el}||= {};               # create elt if need be 
+    #$t->{twig_dtd}->{$el}->{att}||= {};        # create att if need be 
+    if( ($parser_version > 2.27) && ($t->{twig_doctype}->{internal}=~ m{(^|>)\s*$}) ) 
+      { my $text= $XML::Twig::Elt::keep_encoding ? $p->original_string : $p->recognized_string; 
+        unless( $text)
+          { # this version of XML::Parser does not return the text in the *_string method
+            # we need to rebuild it
+            my $att_decl="$att $type";
+            $att_decl .= " #FIXED"   if( $fixed);
+            $att_decl .= " $default" if( $default);
+            # 2 cases: there is already an attlist on that element or not
+            if( $t->{twig_dtd}->{att}->{$el})
+              { # there is already an attlist, add to it
+                $t->{twig_doctype}->{internal}=~ s{(<!ATTLIST\s*$el )(.*?)\n?>}
+                                                  { "$1$2\n" . ' ' x length( $1) . "$att_decl\n>"}es;
+              }
+            else
+              { # create the attlist
+                 $t->{twig_doctype}->{internal}.= "<!ATTLIST $el $att_decl>"
+              }
+          }
+      }
+    $t->{twig_dtd}->{att}->{$el}->{$att}= {} ;
+    $t->{twig_dtd}->{att}->{$el}->{$att}->{type}= $type; 
+    $t->{twig_dtd}->{att}->{$el}->{$att}->{default}= $default; 
+    $t->{twig_dtd}->{att}->{$el}->{$att}->{fixed}= $fixed; 
+  }
+
+sub _twig_default
+  { 
+    my( $p, $string)= @_;
+    
+    my $t= $p->{twig};
+    
+    # process only if we have an entity
+    return unless( $string=~ m{^&([^;]*);$});
+    # the entity has to be pure pcdata, or we have a problem
+    my $ent;
+    if( $t->{twig_keep_encoding}) 
+      { _twig_char( $p, $string); 
+        $ent= substr( $string, 1, -1);
+      }
+    else
+      { $ent= _twig_insert_ent( $t, $string); 
+      }
+  }
+    
+sub _twig_insert_ent
+  { 
+    my( $t, $string)=@_;
+
+    my $twig_current= $t->{twig_current};
+
+    my $ent=  $t->{twig_elt_class}->new( '#ENT');
+    $ent->{ent}=  $string;
+
+    _add_or_discard_stored_spaces( $t, force => 0);
+    
+    if( $t->{twig_in_pcdata})
+      { # create the node as a sibling of the #PCDATA
+
+        $ent->set_prev_sibling( $twig_current);
+        $twig_current->{next_sibling}=  $ent;
+        my $parent= $twig_current->{parent};
+        $ent->set_parent( $parent);
+        $parent->set_last_child( $ent);
+        # the twig_current is now the parent
+        delete $twig_current->{'twig_current'};
+        $t->{twig_current}= $parent;
+        # we left pcdata
+        $t->{twig_in_pcdata}=0;
+      }
+    else
+      { # create the node as a child of the current element
+        $ent->set_parent( $twig_current);
+        if( my $prev_sibling= $twig_current->{last_child})
+          { $ent->set_prev_sibling( $prev_sibling);
+            $prev_sibling->{next_sibling}=  $ent;
+          }
+        else
+          { $twig_current->{first_child}=  $ent; }
+        $twig_current->set_last_child( $ent);
+      }
+
+    return $ent;
+  }
+
+sub parser
+  { return $_[0]->{twig_parser}; }
+
+# returns the declaration text (or a default one)
+sub xmldecl
+  { my $t= shift;
+    return '' unless( $t->{twig_xmldecl} || $t->{output_encoding});
+    my $decl_string;
+    my $decl= $t->{twig_xmldecl};
+    if( $decl)
+      { my $version= $decl->{version};
+        $decl_string= q{<?xml};
+        $decl_string .= qq{ version="$version"};
+
+        # encoding can either have been set (in $decl->{output_encoding})
+        # or come from the document (in $decl->{encoding})
+        if( $t->{output_encoding})
+          { my $encoding= $t->{output_encoding};
+            $decl_string .= qq{ encoding="$encoding"};
+          }
+        elsif( $decl->{encoding})
+          { my $encoding= $decl->{encoding};
+            $decl_string .= qq{ encoding="$encoding"};
+          }
+    
+        if( defined( $decl->{standalone}))
+          { $decl_string .= q{ standalone="};  
+            $decl_string .= $decl->{standalone} ? "yes" : "no";  
+            $decl_string .= q{"}; 
+          }
+      
+        $decl_string .= "?>\n";
+      }
+    else
+      { my $encoding= $t->{output_encoding};
+        $decl_string= qq{<?xml version="1.0" encoding="$encoding"?>};
+      }
+      
+    my $output_filter= XML::Twig::Elt::output_filter();
+    return $output_filter ? $output_filter->( $decl_string) : $decl_string;
+  }
+
+# returns the doctype text (or none)
+# that's the doctype just has it was in the original document
+sub doctype
+  { my $t= shift;
+    my $doctype= $t->{twig_doctype} or return '';
+    my $string= "<!DOCTYPE " . $doctype->{name};
+    $string  .= qq{ SYSTEM "$doctype->{sysid}"} if( $doctype->{sysid});
+    $string  .= qq{ PUBLIC  "$doctype->{pub}" } if( $doctype->{pub});
+    if( $doctype->{internal})
+      { # !@#$%^&* code to deal with various expat/XML::Parser versions
+        $string.= " [" unless( $doctype->{internal}=~ m{^\s*\[});
+        $string.= " " if( $doctype->{internal}=~ m{^\[});
+        $string  .= $doctype->{internal};
+        $string=~ s{\n?]?>?$}{\n]>};
+      }
+    return $string;
+  }
+
+sub set_doctype
+  { my( $t, $name, $system, $public, $internal)= @_;
+    $t->{twig_doctype}= {};
+    my $doctype= $t->{twig_doctype};
+    $doctype->{name}     = $name     if( defined $name);
+    $doctype->{sysid}    = $system   if( defined $system);
+    $doctype->{pub}      = $public   if( defined $public);
+    $doctype->{internal} = $internal if( defined $internal);
+  }
+
+# return the dtd object
+sub dtd
+  { my $t= shift;
+    return $t->{twig_dtd};
+  }
+
+# return an element model, or the list of element models
+sub model
+  { my $t= shift;
+    my $elt= shift;
+    return $t->dtd->{model}->{$elt} if( $elt);
+    return sort keys %{$t->dtd->{model}};
+  }
+
+        
+# return the entity_list object 
+sub entity_list($)
+  { my $t= shift;
+    return $t->{twig_entity_list};
+  }
+
+# return the list of entity names 
+sub entity_names($)
+  { my $t= shift;
+    return sort keys %{$t->{twig_entity_list}} ;
+  }
+
+# return the entity object 
+sub entity($$)
+  { my $t= shift;
+    my $entity_name= shift;
+    return $t->{twig_entity_list}->{$entity_name};
+  }
+
+
+sub print_prolog
+  { my $t= shift;
+    my $fh=  _is_fh($_[0])  ? shift : undef;
+    if( $fh) { print $fh $t->prolog( @_); }
+    else     { print $t->prolog( @_);     }
+  }
+
+sub prolog
+  { my $t= shift;
+    my %args= _normalize_args( @_);
+    my $prolog='';
+
+    return $prolog if( $t->{no_prolog});
+
+    my $update_dtd = $args{UpdateDTD} || '';
+
+    $prolog .= $t->xmldecl;
+    return $prolog if( defined( $t->{no_dtd_output}) or !(defined $t->{twig_doctype}));
+    my $doctype= $t->{twig_doctype};
+    if( $update_dtd)
+      { 
+        if( defined $doctype->{sysid}  )  
+          { $prolog .= "<!DOCTYPE ".$doctype->{name};
+            $prolog .= " PUBLIC  \"$doctype->{pub}\""  if( $doctype->{pub});
+            $prolog .= " SYSTEM \"$doctype->{sysid}\"" if( $doctype->{sysid} && !$doctype->{pub});
+            $prolog .= "[\n";
+            $prolog .= $t->{twig_entity_list}->text;
+            $prolog .= "]>\n";
+          }
+        else
+          { my $dtd= $t->{'twig_dtd'};
+            $prolog .= $t->dtd_text;
+          }            
+      }
+    else
+      { 
+        $prolog .= "<!DOCTYPE ". $doctype->{name}  if( $doctype->{name});
+        $prolog .= " PUBLIC \"$doctype->{pub}\""  if( $doctype->{pub});
+        $prolog .= " SYSTEM" if( $doctype->{sysid} && !$doctype->{pub});
+        $prolog .= ' "' . $doctype->{sysid} . '"'  if( $doctype->{sysid}); 
+        if( my $internal= $doctype->{internal}) 
+          { # add opening and closing brackets if not already there
+            # plus some spaces and newlines for a nice formating
+            # I test it here because I can't remember which version of
+            # XML::Parser need it or not, so this is actually quite safe
+            $internal=~ s{^\s*(\[\s*)?}{ [\n};
+            $internal=~ s{\s*(\]\s*(>\s*)?)?\s*$}{\n]>\n};
+            $prolog .=  $internal; 
+          }
+      }
+
+    # terrible hack, as I can't figure out in which case the darn prolog
+    # should get an extra >
+    $prolog=~ s/(>\s*)*$/>\n/;
+
+    my $output_filter= XML::Twig::Elt::output_filter();
+    return $output_filter ? $output_filter->( $prolog) : $prolog;
+  }
+
+sub _print_prolog_data
+  { my $t= shift;
+    my $fh=  _is_fh($_[0])  ? shift : undef;
+    if( $fh) { print $fh $t->_prolog_data( @_); }
+    else     { print $t->_prolog_data( @_);     }
+  }
+
+sub _prolog_data
+  { my $t= shift;
+    return''  unless( $t->{prolog_data});
+    my $prolog_data_text='';
+    foreach ( $t->{prolog_data}->children)
+      { $prolog_data_text .= $_->sprint . "\n"; }
+    return$ prolog_data_text;
+  }
+
+sub print
+  { my $t= shift;
+    my $fh=  _is_fh( $_[0])  ? shift : undef;
+    my %args= _normalize_args( @_);
+
+    my $old_pretty;
+    if( defined $args{PrettyPrint})
+      { $old_pretty= $t->set_pretty_print( $args{PrettyPrint}); 
+        delete $args{PrettyPrint};
+      }
+
+     my $old_empty_tag_style;
+     if( defined $args{EmptyTags})
+      { $old_empty_tag_style= $t->set_empty_tag_style( $args{EmptyTags}); 
+        delete $args{EmptyTags};
+      }
+
+    if( $fh) 
+      { $t->print_prolog( $fh, %args); 
+        $t->_print_prolog_data( $fh, %args);
+      }
+    else 
+      { $t->print_prolog( %args);
+        $t->_print_prolog_data( %args);
+      }
+
+    $t->{twig_root}->print( $fh) if( $t->{twig_root});
+    $t->set_pretty_print( $old_pretty) if( defined $old_pretty); 
+    $t->set_empty_tag_style( $old_empty_tag_style) if( defined $old_empty_tag_style); 
+  }
+
+
+sub flush
+  { my $t= shift;
+    my $fh=  _is_fh( $_[0]) ? shift : undef;
+    my $old_select= defined $fh ? select $fh : undef;
+    my $up_to= ref $_[0] ? shift : undef;
+    my %args= _normalize_args( @_);
+
+    my $old_pretty;
+    if( defined $args{PrettyPrint})
+      { $old_pretty= $t->set_pretty_print( $args{PrettyPrint}); 
+        delete $args{PrettyPrint};
+      }
+
+     my $old_empty_tag_style;
+     if( $args{EmptyTags})
+      { $old_empty_tag_style= $t->set_empty_tag_style( $args{EmptyTags}); 
+        delete $args{EmptyTags};
+      }
+
+
+    # the "real" last element processed, as _twig_end has closed it
+    my $last_elt;
+    if( $up_to)
+      { $last_elt= $up_to; }
+    elsif( $t->{twig_current})
+      { $last_elt= $t->{twig_current}->_last_child; }
+    else
+      { $last_elt= $t->{twig_root}; }
+
+    # flush the DTD unless it has ready flushed (ie root has been flushed)
+    my $elt= $t->{twig_root};
+    $t->print_prolog( %args) unless( $elt->_flushed);
+
+    while( $elt)
+      { my $next_elt; 
+        if( $last_elt && $last_elt->in( $elt))
+          { 
+            unless( $elt->_flushed) 
+              { # just output the front tag
+                print $elt->start_tag();
+                $elt->_set_flushed;
+              }
+            $next_elt= $elt->{first_child};
+          }
+        else
+          { # an element before the last one or the last one,
+            $next_elt= $elt->{next_sibling};  
+            $elt->_flush();
+            $elt->delete; 
+            last if( $last_elt && ($elt == $last_elt));
+          }
+        $elt= $next_elt;
+      }
+    select $old_select if( defined $old_select);
+    $t->set_pretty_print( $old_pretty) if( defined $old_pretty); 
+    $t->set_empty_tag_style( $old_empty_tag_style) if( defined $old_empty_tag_style); 
+  }
+
+
+# flushes up to an element
+# this method just reorders the arguments and calls flush
+sub flush_up_to
+  { my $t= shift;
+    my $up_to= shift;
+    if( _is_fh( $_[0]))
+      { my $fh=  shift;
+        $t->flush( $fh, $up_to, @_);
+      }
+    else
+      { $t->flush( $up_to, @_); }
+  }
+
+    
+# same as print except the entire document text is returned as a string
+sub sprint
+  { my $t= shift;
+    my %args= _normalize_args( @_);
+
+    my $old_pretty;
+    if( defined $args{PrettyPrint})
+      { $old_pretty= $t->set_pretty_print( $args{PrettyPrint}); 
+        delete $args{PrettyPrint};
+      }
+
+     my $old_empty_tag_style;
+     if( defined $args{EmptyTags})
+      { $old_empty_tag_style= $t->set_empty_tag_style( $args{EmptyTags}); 
+        delete $args{EmptyTags};
+      }
+      
+    my $prolog= $t->prolog( %args) || '';
+    my $prolog_data= $t->_prolog_data( %args) || '';
+    
+    my $string=  $prolog . $prolog_data . $t->{twig_root}->sprint;
+
+    $t->set_pretty_print( $old_pretty) if( defined $old_pretty); 
+    $t->set_empty_tag_style( $old_empty_tag_style) if( defined $old_empty_tag_style); 
+
+    return $string;
+  }
+    
+
+# this method discards useless elements in a tree
+# it does the same thing as a flush except it does not print it
+# the second argument is an element, the last purged element
+# (this argument is usually set through the purge_up_to method)
+sub purge
+  { my $t= shift;
+    my $up_to= shift;
+
+    # the "real" last element processed, as _twig_end has closed it
+    my $last_elt;
+    if( $up_to)
+      { $last_elt= $up_to; }
+    elsif( $t->{twig_current})
+      { $last_elt= $t->{twig_current}->_last_child; }
+    else
+      { $last_elt= $t->{twig_root}; }
+    
+    my $elt= $t->{twig_root};
+
+    while( $elt)
+      { my $next_elt; 
+        if( $last_elt && $last_elt->in( $elt))
+          { $elt->_set_flushed;
+            $next_elt= $elt->{first_child};
+          }
+        else
+          { # an element before the last one or the last one,
+            $next_elt= $elt->{next_sibling};  
+            $elt->delete; 
+            last if( $elt == $last_elt);
+          }
+        $elt= $next_elt;
+      }
+  }
+    
+# flushes up to an element. This method just calls purge
+sub purge_up_to
+  { my $t= shift;
+    my $up_to= shift;
+    $t->purge( $up_to);
+  }
+
+sub root
+  { return $_[0]->{twig_root}; }
+
+#start-extract twig_document (used to generate XML::(DOM|GDOME)::Twig)
+sub first_elt
+  { my( $t, $cond)= @_;
+    my $root= $t->root || return undef;
+    return $root if( $root->passes( $cond));
+    return $root->next_elt( $cond); 
+  }
+
+sub next_n_elt
+  { my( $t, $offset, $cond)= @_;
+    $offset -- if( $t->root->matches( $cond) );
+    return $t->root->next_n_elt( $offset, $cond);
+  }
+
+sub get_xpath
+  { my $twig= shift;
+    if( isa( $_[0], 'ARRAY'))
+      { my $elt_array= shift;
+        return _unique_elts( map { $_->get_xpath( @_) } @$elt_array);
+      }
+    else
+      { return $twig->root->get_xpath( @_); }
+  }
+
+# get a list of elts and return a sorted list of unique elts
+sub _unique_elts
+  { my @sorted= sort { $a ->cmp( $b) } @_;
+    my @unique;
+    while( my $current= shift @sorted)
+      { push @unique, $current unless( @unique && ($unique[-1] == $current)); }
+    return @unique;
+  }
+
+sub findvalue
+  { my $twig= shift;
+    if( isa( $_[0], 'ARRAY'))
+      { my $elt_array= shift;
+        return join( '', map { $_->findvalue( @_) } @$elt_array);
+      }
+    else
+      { return $twig->root->findvalue( @_); }
+  }
+
+sub set_id_seed
+  { my $t= shift;
+    XML::Twig::Elt->set_id_seed( @_);
+  }
+
+
+# return a list with just the root
+# if a condition is given then return an empty list unless the root matches
+sub children
+  { my( $t, $cond)= @_;
+    my $root= $t->root;
+    unless( $cond && !($root->passes( $cond)) )
+      { return ($root); }
+    else
+      { return (); }
+  }
+
+sub _children
+  { return ($_[0]->root); }
+
+sub descendants
+  { my( $t, $cond)= @_;
+    my $root= $t->root;
+    if( $root->passes( $cond) )
+      { return ($root, $root->descendants( $cond)); }
+    else
+      { return ( $root->descendants( $cond)); }
+  }
+
+sub simplify
+  { my $t= shift;
+    $t->root->simplify( @_);
+  }
+
+sub subs_text
+  { my $t= shift;
+    $t->root->subs_text( @_);
+  }
+
+#end-extract twig_document
+
+sub set_keep_encoding
+  { return XML::Twig::Elt::set_keep_encoding( @_); }
+
+sub set_expand_external_entities
+  { return XML::Twig::Elt::set_expand_external_entities( @_); }
+
+# WARNING: at the moment the id list is not updated reliably
+sub elt_id
+  { return $_[0]->{twig_id_list}->{$_[1]}; }
+
+# change it in ALL twigs at the moment
+sub change_gi 
+  { my( $twig, $old_gi, $new_gi)= @_;
+    my $index;
+    return unless($index= $XML::Twig::gi2index{$old_gi});
+    $XML::Twig::index2gi[$index]= $new_gi;
+    delete $XML::Twig::gi2index{$old_gi};
+    $XML::Twig::gi2index{$new_gi}= $index;
+  }
+
+
+# builds the DTD from the stored (possibly updated) data
+sub dtd_text
+  { my $t= shift;
+    my $dtd= $t->{twig_dtd};
+    my $doctype= $t->{twig_doctype} or return '';
+    my $string= "<!DOCTYPE ".$doctype->{name};
+
+    unless( $parser_version > 3.27) { $string .= " [\n"; }
+
+    foreach my $gi (@{$dtd->{elt_list}})
+      { $string.= "<!ELEMENT $gi ".$dtd->{model}->{$gi}.">\n" ;
+        if( $dtd->{att}->{$gi})
+          { my $attlist= $dtd->{att}->{$gi};
+            $string.= "<!ATTLIST $gi\n";
+            foreach my $att ( sort keys %{$attlist})
+              { $string.= "   $att $attlist->{$att}->{type} ".
+                            "$attlist->{$att}->{default}"; 
+                if( $attlist->{$att}->{fixed})
+                  { $string .= " #FIXED"};
+                $string.= "\n";
+              }
+            $string.= ">\n";
+          }
+      }
+    $string.= $t->entity_list->text if( $t->entity_list);
+    $string.= "\n]>\n";
+    return $string;
+  }
+        
+# prints the DTD from the stored (possibly updated) data
+sub dtd_print
+  { my $t= shift;
+    my $fh=  _is_fh( $_[0])  ? shift : undef;
+    if( $fh) { print $fh $t->dtd_text; }
+    else     { print $t->dtd_text; }
+  }
+
+# build the subs that call directly expat
+BEGIN
+  { my @expat_methods= qw( depth in_element within_element context
+                           current_line current_column current_byte
+                           recognized_string original_string 
+                           xpcroak xpcarp 
+                           xml_escape
+                           base current_element element_index 
+                           position_in_context);
+    foreach my $method (@expat_methods)
+      { no strict 'refs';
+        *{$method}= sub { my $t= shift;
+                          croak "calling $method after parsing is finished" 
+                                 unless( $t->{twig_parsing}); 
+                          return $t->{twig_parser}->$method(@_); 
+                        };
+      }
+  }
+
+sub path
+  { my( $t, $gi)= @_;
+    return "/" . join( "/", ($t->{twig_parser}->context, $gi));
+  }
+
+sub finish
+  { my $t= shift;
+    return $t->{twig_parser}->finish;
+  }
+
+# just finish the parse by printing the rest of the document
+sub finish_print
+  { my( $t, $fh)= @_;
+    my $old_fh;
+    unless( defined $fh)
+      { $t->_set_fh_to_twig_output_fh(); }
+    elsif( defined $fh)
+      { $old_fh= select $fh; 
+        $t->{twig_original_selected_fh}= $old_fh if( $old_fh); 
+      }
+    
+    my $p=$t->{twig_parser};
+    if( $t->{twig_keep_encoding})
+      { $p->setHandlers( %twig_handlers_finish_print); }
+    else
+      { $p->setHandlers( %twig_handlers_finish_print_original); }
+  }
+
+sub output_filter { return XML::Twig::Elt::output_filter( @_); }
+sub set_output_filter { return XML::Twig::Elt::set_output_filter( @_); }
+
+sub output_text_filter { return XML::Twig::Elt::output_text_filter( @_); }
+sub set_output_text_filter { return XML::Twig::Elt::set_output_text_filter( @_); }
+
+sub set_input_filter
+  { my( $t, $input_filter)= @_;
+    my $old_filter= $t->{twig_input_filter};
+      if( !$input_filter || isa( $input_filter, 'CODE') )
+        { $t->{twig_input_filter}= $input_filter; }
+      elsif( $input_filter eq 'latin1')
+        {  $t->{twig_input_filter}= latin1(); }
+      elsif( $filter{$input_filter})
+        {  $t->{twig_input_filter}= $filter{$input_filter}; }
+      else
+        { croak "invalid input filter: $input_filter"; }
+      
+      return $old_filter;
+    }
+
+sub set_empty_tag_style
+  { return XML::Twig::Elt::set_empty_tag_style( @_); }
+
+sub set_pretty_print
+  { return XML::Twig::Elt::set_pretty_print( @_); }
+
+sub set_quote
+  { return XML::Twig::Elt::set_quote( @_); }
+
+sub set_indent
+  { return XML::Twig::Elt::set_indent( @_); }
+
+sub set_keep_atts_order
+  { shift; return XML::Twig::Elt::set_keep_atts_order( @_); }
+
+sub keep_atts_order
+  { return XML::Twig::Elt::keep_atts_order( @_); }
+
+# save and restore package globals (the ones in XML::Twig::Elt)
+sub save_global_state
+  { my $t= shift;
+    $t->{twig_saved_state}= XML::Twig::Elt::global_state();
+  }
+
+sub restore_global_state
+  { my $t= shift;
+    XML::Twig::Elt::set_global_state( $t->{twig_saved_state});
+  }
+
+sub global_state
+  { return XML::Twig::Elt::global_state(); }
+
+sub set_global_state
+  {  return XML::Twig::Elt::set_global_state( $_[1]); }
+
+sub dispose
+  { my $t= shift;
+    $t->DESTROY;
+  }
+  
+sub DESTROY
+  { my $t= shift;
+    if( $t->{twig_root} && isa(  $t->{twig_root}, 'XML::Twig')) 
+      { $t->{twig_root}->delete } 
+
+# added to break circular references
+    undef $t->{twig};
+    undef $t->{twig_root}->{twig} if( $t->{twig_root});
+    undef $t->{twig_parser};
+    
+    $t={}; # prevents memory leaks (especially when using mod_perl)
+    undef $t;
+  }        
+
+
+#
+#  non standard handlers
+#
+
+# kludge: expat 1.95.2 calls both Default AND Doctype handlers
+# so if the default handler finds '<!DOCTYPE' then it must 
+# unset itself (_twig_print_doctype will reset it)
+sub _twig_print_check_doctype
+  { 
+    my $p= shift;
+    my $string= $p->recognized_string();
+    if( $string eq '<!DOCTYPE') 
+      { $p->setHandlers( Default => undef); 
+        $p->{twig}->{expat_1_95_2}=1; 
+      }
+    else                        
+      { print $string; }
+    
+  }
+
+#sub twig_buffer_original
+#  { my $p= shift; 
+#    my $t= $p->{twig};
+#    $t->{twig_buffered_string}= $p->original_string(); 
+#  }
+
+sub _twig_print
+  { print $_[0]->recognized_string(); }
+
+sub _twig_print_default
+  { my( $p, $string)= @_;
+    print $p->recognized_string();
+  }
+
+# recognized_string does not seem to work for entities, go figure!
+# so this handler is not used 
+sub _twig_print_entity
+  { my $p= shift; }
+
+# account for the case where the element is empty
+sub _twig_print_end
+  { my $p= shift; 
+    print $p->recognized_string();
+  }
+
+
+# kludge: expat 1.95.2 calls both Default AND Doctype handlers
+# so if the default handler finds '<!DOCTYPE' then it must 
+# unset itself (_twig_print_doctype will reset it)
+sub _twig_print_original_check_doctype
+  { 
+    my $p= shift;
+    my $string= $p->original_string();
+    if( $string eq '<!DOCTYPE') 
+      { $p->setHandlers( Default => undef); 
+        $p->{twig}->{expat_1_95_2}=1; 
+      }
+    else                        
+      { print $string; }
+    
+  }
+
+sub _twig_print_original
+  { print $_[0]->original_string(); }
+
+
+sub _twig_print_original_doctype
+  { 
+    my(  $p, $name, $sysid, $pubid, $internal)= @_;
+    if( $name)
+      { # with recent versions of XML::Parser original_string does not work,
+        # hence we need to rebuild the doctype declaration
+        my $doctype='';
+        $doctype .= qq{<!DOCTYPE $name}    if( $name);
+        $doctype .=  qq{ PUBLIC  "$pubid"}  if( $pubid);
+        $doctype .=  qq{ SYSTEM}            if( $sysid && !$pubid);
+        $doctype .=  qq{ "$sysid"}          if( $sysid); 
+        $doctype .=  qq{>} unless( $p->{twig}->{expat_1_95_2});
+        print $doctype;
+      }
+    $p->setHandlers( Default => \&_twig_print_original);
+  }
+
+sub _twig_print_doctype
+  { 
+    my(  $p, $name, $sysid, $pubid, $internal)= @_;
+    if( $name)
+      { # with recent versions of XML::Parser original_string does not work,
+        # hence we need to rebuild the doctype declaration
+        my $doctype='';
+        $doctype .= qq{<!DOCTYPE $name}    if( $name);
+        $doctype .=  qq{ PUBLIC  "$pubid"}  if( $pubid);
+        $doctype .=  qq{ SYSTEM}            if( $sysid && !$pubid);
+        $doctype .=  qq{ "$sysid"}          if( $sysid); 
+        $doctype .=  qq{>} unless( $p->{twig}->{expat_1_95_2});
+        print $doctype;
+      }
+    $p->setHandlers( Default => \&_twig_print_original);
+  }
+
+
+
+
+sub _twig_print_original_default
+  { 
+    my $p= shift;
+    print $p->original_string();
+  }
+
+# account for the case where the element is empty
+sub _twig_print_end_original
+  { my $p= shift;
+    print $p->original_string();
+  }
+
+sub _twig_start_check_roots
+  { 
+    my( $p, $gi, %att)= @_;
+    my $t= $p->{twig};
+
+    if( _handler( $t, $t->{twig_roots}, $gi, \%att))
+      { 
+        $p->setHandlers( %twig_handlers); # restore regular handlers
+        $t->{twig_root_depth}= $p->depth; 
+        _twig_start( $p, $gi, %att);
+      }
+    elsif( $p->depth == 0)
+      { _twig_start( $p, $gi, %att); }
+    elsif( $t->{twig_starttag_handlers})
+      { # look for start tag handlers
+        my @handlers= _handler( $t, $t->{twig_starttag_handlers}, $gi, \%att);
+        foreach my $handler ( @handlers)
+          { $handler->($t, $gi, %att) || last; }
+      }
+  }
+
+sub _twig_start_check_roots_print
+  { 
+    my( $p, $gi, %att)= @_;
+    my $t= $p->{twig};
+
+    if( _handler( $t, $t->{twig_roots}, $gi, \%att))
+      { $p->setHandlers( %twig_handlers); # restore regular handlers
+        $t->_set_fh_to_selected_fh();      # select the proper output fh
+        $t->{twig_root_depth}= $p->depth; 
+        _twig_start( $p, $gi, %att);
+      }
+    elsif( $p->depth == 0)
+      { if( my $fh= $t->{twig_output_fh})
+          { print $fh $p->recognized_string(); }
+        else
+          { print $p->recognized_string(); }
+      
+        _twig_start( $p, $gi, %att);
+        $t->_set_fh_to_twig_output_fh();
+      }
+    elsif( $t->{twig_starttag_handlers})
+      { # look for start tag handlers
+        my @handlers= _handler( $t, $t->{twig_starttag_handlers}, $gi, \%att);
+        my $last_handler_res;
+        $t->_set_fh_to_selected_fh() if( @handlers);     # select the proper output fh
+        foreach my $handler ( @handlers)
+          { $last_handler_res= $handler->($t, $gi, %att);
+            last unless $last_handler_res;
+          }
+        $t->_set_fh_to_twig_output_fh() if( @handlers);  # re-select the twig output fh
+        print $p->recognized_string() if( !@handlers || $last_handler_res);   
+      }
+    else
+      { print $p->recognized_string(); }  
+  }
+
+sub _twig_start_check_roots_print_original
+  { 
+    my( $p, $gi, %att)= @_;
+    my $t= $p->{twig};
+
+    if( _handler( $t, $t->{twig_roots}, $gi, \%att))
+      { $p->setHandlers( %twig_handlers); # restore regular handlers
+        $t->_set_fh_to_selected_fh();      # select the proper output fh
+        $t->{twig_root_depth}= $p->depth; 
+        _twig_start( $p, $gi, %att);
+      }
+    elsif( $p->depth == 0)
+      { if( my $fh= $t->{twig_output_fh})
+          { print $fh $p->original_string(); }
+        else
+          { print $p->original_string(); }
+
+        _twig_start( $p, $gi, %att);
+        $t->_set_fh_to_twig_output_fh();
+      }
+    elsif( $t->{twig_starttag_handlers})
+      { # look for start tag handlers
+        my @handlers= _handler( $t, $t->{twig_starttag_handlers}, $gi, \%att);
+        my $last_handler_res;
+        $t->_set_fh_to_selected_fh() if( @handlers);     # select the proper output fh
+        foreach my $handler ( @handlers)
+          { $last_handler_res= $handler->($t, $gi, %att);
+            last unless( $last_handler_res);
+          }
+        $t->_set_fh_to_twig_output_fh() if( @handlers);  # re-select the twig output fh
+        print $p->original_string() if( !@handlers || $last_handler_res);   
+      }
+    else
+      { print $p->original_string(); }
+  }
+
+sub _twig_end_check_roots
+  { 
+    my( $p, $gi)= @_;
+    my $t= $p->{twig};
+    if( $t->{twig_endtag_handlers})
+      { # look for end tag handlers
+        my @handlers= _handler( $t, $t->{twig_endtag_handlers}, $gi, {});
+        my $last_handler_res=1;
+        foreach my $handler ( @handlers)
+          { $last_handler_res= $handler->($t, $gi) || last; }
+      }
+
+    if( $p->depth == 0)
+      { _twig_end( $p, $gi); }
+  }
+
+sub _twig_end_check_roots_print
+  { 
+    my( $p, $gi, %att)= @_;
+    my $t= $p->{twig};
+    if( $t->{twig_endtag_handlers})
+      { # look for start tag handlers
+        my @handlers= _handler( $t, $t->{twig_endtag_handlers}, $gi, {});
+        my $last_handler_res=1;
+        $t->_set_fh_to_selected_fh() if( @handlers);     # select the proper output fh
+        foreach my $handler ( @handlers)
+          { $last_handler_res= $handler->($t, $gi) || last; }
+        $t->_set_fh_to_twig_output_fh() if( @handlers);  # re-select the twig output fh
+        return unless $last_handler_res;
+      }
+    print $p->recognized_string();  
+    $t->_set_fh_to_selected_fh() if( $p->depth == 0);
+    if( $p->depth == 0)
+      { _twig_end( $p, $gi);  }
+  }
+
+sub _twig_end_check_roots_print_original
+  { 
+    my( $p, $gi, %att)= @_;
+    my $t= $p->{twig};
+    if( $t->{twig_endtag_handlers})
+      { # look for start tag handlers
+        my @handlers= _handler( $t, $t->{twig_endtag_handlers}, $gi, {});
+        my $last_handler_res=1;
+        $t->_set_fh_to_selected_fh() if( @handlers);     # select the proper output fh
+        foreach my $handler ( @handlers)
+          { $last_handler_res= $handler->($t, $gi) || last; }
+        $t->_set_fh_to_twig_output_fh() if( @handlers);  # re-select the twig output fh
+        return unless $last_handler_res;
+      }
+    print $p->original_string();
+    $t->_set_fh_to_selected_fh() if( $p->depth == 0);
+    if( $p->depth == 0)
+      { _twig_end( $p, $gi);  }
+  }
+
+sub _twig_pi_check_roots
+  { my( $p, $target, $data)= @_;
+    my $t= $p->{twig};
+    if( my $handler=    $t->{twig_handlers}->{pi_handlers}->{$target}
+                     || $t->{twig_handlers}->{pi_handlers}->{''}
+      )
+      { _twig_pi( @_); }
+  }
+
+
+sub _twig_ignore_start
+  { 
+    my( $p, $gi)= @_;
+    my $t= $p->{twig};
+    return unless( $gi eq $t->{twig_ignore_gi});
+    $t->{twig_ignore_level}++;
+    my $action= $t->{twig_ignore_action};
+    if( $action eq 'print' )
+      { _twig_print_original( @_); }
+#    elsif( $action eq 'string' )
+#      { $t->{twig_buffered_string} .= $p->original_string(); }
+  }
+
+sub _twig_ignore_end
+  { 
+    my( $p, $gi)= @_;
+    my $t= $p->{twig};
+
+    my $action= $t->{twig_ignore_action};
+
+    if( $action eq 'print')
+      { _twig_print_original( $p, $gi); }
+#    elsif( $action eq 'string')
+#      { $t->{twig_buffered_string} .= $p->original_string(); }
+
+    return unless( $gi eq $t->{twig_ignore_gi});
+
+    $t->{twig_ignore_level}--;
+
+    unless( $t->{twig_ignore_level})
+      { $t->{twig_ignore_elt}->delete; 
+        $p->setHandlers( @{$t->{twig_saved_handlers}});
+        # test for handlers
+        if( $t->{twig_endtag_handlers})
+          { # look for end tag handlers
+            my @handlers= _handler( $t, $t->{twig_endtag_handlers}, $gi, {});
+            my $last_handler_res=1;
+            foreach my $handler ( @handlers)
+              { $last_handler_res= $handler->($t, $gi) || last; }
+          }
+      };
+  }
+    
+sub ignore
+  { my $t= shift;
+    my $elt;
+
+    # get the element (default: current elt)
+    if( $_[0] && isa( $_[0], 'XML::Twig::Elt'))
+      { $elt= shift; }
+    else
+      { $elt = $t->{twig_current}; }
+
+    my $action= shift || 1; 
+    $t->{twig_ignore_action}= $action;
+
+    $t->{twig_ignore_elt}= $elt;     # save it
+    $t->{twig_ignore_gi}= $XML::Twig::index2gi[$elt->{'gi'}];  # save its gi
+    $t->{twig_ignore_level}++;
+    my $p= $t->{twig_parser};
+    my @saved_handlers= $p->setHandlers( %twig_handlers_ignore); # set handlers
+    if( $action eq 'print')
+      { $p->setHandlers( Default => \&_twig_print_original); }
+#    elsif( $action eq 'string')
+#      { # not used at the moment
+#        $t->{twig_buffered_string}='';
+#        $p->setHandlers( Default => \&twig_buffer_original);
+#      }
+
+    $t->{twig_saved_handlers}= \@saved_handlers;        # save current handlers
+  }
+
+# select $t->{twig_output_fh} and store the current selected fh 
+sub _set_fh_to_twig_output_fh
+  { my $t= shift;
+    my $output_fh= $t->{twig_output_fh};
+    if( $output_fh && !$t->{twig_output_fh_selected})
+      { # there is an output fh
+        $t->{twig_selected_fh}= select(); # store the currently selected fh
+        $t->{twig_output_fh_selected}=1;
+        select $output_fh;                # select the output fh for the twig
+      }
+  }
+
+# select the fh that was stored in $t->{twig_selected_fh} 
+# (before $t->{twig_output_fh} was selected)
+sub _set_fh_to_selected_fh
+  { my $t= shift;
+    return unless( $t->{twig_output_fh});
+    my $selected_fh= $t->{twig_selected_fh};
+    $t->{twig_output_fh_selected}=0;
+    select $selected_fh;
+    return;
+  }
+  
+
+sub encoding
+  { return $_[0]->{twig_xmldecl}->{encoding} if( $_[0]->{twig_xmldecl}); }
+
+sub set_encoding
+  { my( $t, $encoding)= @_;
+    $t->{twig_xmldecl} ||={};
+    $t->set_xml_version( "1.0") unless( $t->xml_version);
+    $t->{twig_xmldecl}->{encoding}= $encoding;
+    return $t;
+  }
+
+sub output_encoding
+  { return $_[0]->{output_encoding}; }
+  
+sub set_output_encoding
+  { my( $t, $encoding)= @_;
+    $t->set_output_filter( _encoding_filter( $encoding)) if( $encoding);
+    return $t->{output_encoding}= $encoding;
+  }
+
+sub xml_version
+  { return $_[0]->{twig_xmldecl}->{version} if( $_[0]->{twig_xmldecl}); }
+
+sub set_xml_version
+  { my( $t, $version)= @_;
+    $t->{twig_xmldecl} ||={};
+    return $t->{twig_xmldecl}->{version}= $version;
+  }
+
+sub standalone
+  { return $_[0]->{twig_xmldecl}->{standalone} if( $_[0]->{twig_xmldecl}); }
+
+sub set_standalone
+  { my( $t, $standalone)= @_;
+    $t->{twig_xmldecl} ||={};
+    $t->set_xml_version( "1.0") unless( $t->xml_version);
+    return $t->{twig_xmldecl}->{standalone}= $standalone;
+  }
+
+
+# SAX methods
+
+sub toSAX1
+  { croak "cannot use toSAX1 while parsing (use flush_toSAX1)" if (defined $_[0]->{twig_parser});
+    shift(@_)->_toSAX(@_, \&XML::Twig::Elt::_start_tag_data_SAX1,
+                          \&XML::Twig::Elt::_end_tag_data_SAX1
+             ); }
+
+sub toSAX2
+  { croak "cannot use toSAX2 while parsing (use flush_toSAX2)" if (defined $_[0]->{twig_parser});
+    shift(@_)->_toSAX(@_, \&XML::Twig::Elt::_start_tag_data_SAX2,
+                          \&XML::Twig::Elt::_end_tag_data_SAX2
+             ); }
+
+
+sub _toSAX
+  { my( $t, $handler, $start_tag_data, $end_tag_data) = @_;
+
+    if( my $start_document =  $handler->can( 'start_document'))
+      { $start_document->( $handler); }
+    
+    $t->_prolog_toSAX( $handler);
+    
+    $t->root->_toSAX( $handler, $start_tag_data, $end_tag_data)  if( $t->root);
+    if( my $end_document =  $handler->can( 'end_document'))
+      { $end_document->( $handler); }
+  }
+
+
+sub flush_toSAX1
+  { shift(@_)->_flush_toSAX(@_, \&XML::Twig::Elt::_start_tag_data_SAX1,
+                               \&XML::Twig::Elt::_end_tag_data_SAX1
+             ); }
+
+sub flush_toSAX2
+  { shift(@_)->_flush_toSAX(@_, \&XML::Twig::Elt::_start_tag_data_SAX2,
+                               \&XML::Twig::Elt::_end_tag_data_SAX2
+             ); }
+
+sub _flush_toSAX
+  { my( $t, $handler, $start_tag_data, $end_tag_data, $up_to)= @_;
+
+    # the "real" last element processed, as _twig_end has closed it
+    my $last_elt;
+    if( $up_to)
+      { $last_elt= $up_to; }
+    elsif( $t->{twig_current})
+      { $last_elt= $t->{twig_current}->_last_child; }
+    else
+      { $last_elt= $t->{twig_root}; }
+
+    my $elt= $t->{twig_root};
+    unless( $elt->_flushed)
+      { # init unless already done (ie root has been flushed)
+        if( my $start_document =  $handler->can( 'start_document'))
+          { $start_document->( $handler); }
+        # flush the DTD
+        $t->_prolog_toSAX( $handler) 
+      }
+
+    while( $elt)
+      { my $next_elt; 
+        if( $last_elt && $last_elt->in( $elt))
+          { 
+            unless( $elt->_flushed) 
+              { # just output the front tag
+                if( my $start_element = $handler->can( 'start_element'))
+                 { if( my $tag_data= $start_tag_data->( $elt))
+                     { $start_element->( $handler, $tag_data); }
+                 }
+                $elt->_set_flushed;
+              }
+            $next_elt= $elt->{first_child};
+          }
+        else
+          { # an element before the last one or the last one,
+            $next_elt= $elt->{next_sibling};  
+            $elt->_toSAX( $handler, $start_tag_data, $end_tag_data);
+            $elt->delete; 
+            last if( $last_elt && ($elt == $last_elt));
+          }
+        $elt= $next_elt;
+      }
+    if( !$t->{twig_parsing}) 
+      { if( my $end_document =  $handler->can( 'end_document'))
+          { $end_document->( $handler); }
+      }
+  }
+
+
+sub _prolog_toSAX
+  { my( $t, $handler)= @_;
+    $t->_xmldecl_toSAX( $handler);
+    $t->_DTD_toSAX( $handler);
+  }
+
+sub _xmldecl_toSAX
+  { my( $t, $handler)= @_;
+    my $decl= $t->{twig_xmldecl};
+    my $data= { Version    => $decl->{version},
+                Encoding   => $decl->{encoding},
+                Standalone => $decl->{standalone},
+          };
+    if( my $xml_decl= $handler->can( 'xml_decl'))
+      { $xml_decl->( $handler, $data); }
+  }
+                
+sub _DTD_toSAX
+  { my( $t, $handler)= @_;
+    my $doctype= $t->{twig_doctype};
+    return unless( $doctype);
+    my $data= { Name     => $doctype->{name},
+                PublicId => $doctype->{pub},
+                SystemId => $doctype->{sysid},
+              };
+
+    if( my $start_dtd= $handler->can( 'start_dtd'))
+      { $start_dtd->( $handler, $data); }
+
+    # I should call code to export the internal subset here 
+    
+    if( my $end_dtd= $handler->can( 'end_dtd'))
+      { $end_dtd->( $handler); }
+  }
+
+# input/output filters
+
+sub latin1 
+  { local $SIG{__DIE__};
+    if( eval 'require Encode')
+      { import Encode; 
+        return encode_convert( 'ISO-8859-15');
+      }
+    elsif( eval 'require Text::Iconv;')
+      { 
+        return iconv_convert( 'ISO-8859-15');
+      }
+    elsif( eval 'require Unicode::Map8 && require Unicode::String;')
+      { 
+        return unicode_convert( 'ISO-8859-15'); 
+      }
+    else
+      { return \&regexp2latin1; }
+  }
+
+sub _encoding_filter
+  { 
+      { local $SIG{__DIE__};
+        my $encoding= $_[1] || $_[0];
+        if( eval 'require Encode')
+          { import Encode; 
+            my $sub= encode_convert( $encoding);
+            return $sub;
+          }
+        if( eval 'require Text::Iconv;')
+          { return iconv_convert( $encoding); }
+        elsif( eval 'require Unicode::Map8 && require Unicode::String;')
+          { return unicode_convert( $encoding); }
+        }
+    croak "Encode, Text::Iconv or Unicode::Map8 and Unicode::String need to be installed ",
+          "in order to use encoding options";
+  }
+
+# shamelessly lifted from XML::TyePYX (works only with XML::Parse 2.27)
+sub regexp2latin1
+  { my $text=shift;
+    $text=~s{([\xc0-\xc3])(.)}{ my $hi = ord($1);
+                                my $lo = ord($2);
+                                chr((($hi & 0x03) <<6) | ($lo & 0x3F))
+                              }ge;
+    return $text;
+  }
+
+
+sub html_encode
+  { require HTML::Entities;
+    return HTML::Entities::encode_entities($_[0] );
+  }
+
+sub safe_encode
+  {   my $str= shift;
+      if( $] < 5.008)
+        { $str =~ s{([\xC0-\xDF].|[\xE0-\xEF]..|[\xF0-\xFF]...)}
+                   {_XmlUtf8Decode($1)}egs; 
+        }
+      else
+        { $str= encode( ascii => $str, $FB_HTMLCREF); }
+      return $str;
+  }
+
+sub safe_encode_hex
+  {   my $str= shift;
+      if( $] < 5.008)
+        { $str =~ s{([\xC0-\xDF].|[\xE0-\xEF]..|[\xF0-\xFF]...)}
+                   {_XmlUtf8Decode($1, 1)}egs; 
+        }
+      else
+        { $str= encode( ascii => $str, $FB_XMLCREF); }
+      return $str;
+  }
+
+# this one shamelessly lifted from XML::DOM
+# does NOT work on 5.8.0
+sub _XmlUtf8Decode
+  { my ($str, $hex) = @_;
+    my $len = length ($str);
+    my $n;
+
+    if ($len == 2)
+      { my @n = unpack "C2", $str;
+        $n = (($n[0] & 0x3f) << 6) + ($n[1] & 0x3f);
+      }
+    elsif ($len == 3)
+      { my @n = unpack "C3", $str;
+        $n = (($n[0] & 0x1f) << 12) + (($n[1] & 0x3f) << 6) + ($n[2] & 0x3f);
+      }
+    elsif ($len == 4)
+      { my @n = unpack "C4", $str;
+        $n = (($n[0] & 0x0f) << 18) + (($n[1] & 0x3f) << 12) 
+           + (($n[2] & 0x3f) << 6) + ($n[3] & 0x3f);
+      }
+    elsif ($len == 1)    # just to be complete...
+      { $n = ord ($str); }
+    else
+      { croak "bad value [$str] for _XmlUtf8Decode"; }
+
+    my $char= $hex ? sprintf ("&#x%x;", $n) : "&#$n;";
+    return $char;
+}
+
+
+sub unicode_convert
+  { my $enc= $_[1] ? $_[1] : $_[0]; # so the method can be called on the twig or directly
+    require Unicode::Map8;
+    require Unicode::String;
+    import Unicode::String qw(utf8);
+    my $sub= eval q{
+            { my $cnv;
+              BEGIN {  $cnv= Unicode::Map8->new($enc) 
+                           or croak "Can't create converter to $enc";
+                    }
+              sub { return  $cnv->to8 (utf8($_[0])->ucs2); } 
+            } 
+                   };
+    unless( $sub) { croak $@; }
+    return $sub;
+  }
+
+sub iconv_convert
+  { my $enc= $_[1] ? $_[1] : $_[0]; # so the method can be called on the twig or directly
+    require Text::Iconv;
+    my $sub= eval q{
+            { my $cnv;
+              BEGIN { $cnv = Text::Iconv->new( 'utf8', $enc) 
+                           or croak "Can't create iconv converter to $enc";
+                    }
+              sub { return  $cnv->convert( $_[0]); } 
+            }       
+                   };
+    unless( $sub)
+      { if( $@=~ m{^Unsupported conversion: Invalid argument})
+          { croak "Unsupported encoding: $enc"; }
+        else
+          { croak $@; }
+      }
+
+    return $sub;
+  }
+
+sub encode_convert
+  { my $enc= $_[1] ? $_[1] : $_[0]; # so the method can be called on the twig or directly
+    my $sub=  eval qq{sub { return encode( "$enc", \$_[0]); } };
+    croak "can't create Encode-based filter: $@" unless( $sub);
+    return $sub;
+  }
+
+
+# XML::XPath compatibility
+sub getRootNode        { return $_[0]; }
+sub getParentNode      { return undef; }
+sub getChildNodes      { my @children= ($_[0]->root); return wantarray ? @children : \@children; }
+
+
+1;
+
+######################################################################
+package XML::Twig::Entity_list;
+######################################################################
+use UNIVERSAL qw( isa ) ;
+
+sub new
+  { my $class = shift;
+    my $self={};
+
+    bless $self, $class;
+    return $self;
+
+  }
+
+sub add_new_ent
+  { my $list= shift;
+    my $ent= XML::Twig::Entity->new( @_);
+    $list->add( $ent);
+  }
+
+sub add
+  { my( $list, $ent)= @_;
+    $list->{$ent->{name}}= $ent;
+  }
+
+# can be called with an entity or with an entity name
+sub delete
+  { my $list= shift;
+    if( isa( ref $_[0], 'XML::Twig::Entity'))
+      { # the second arg is an entity
+        my $ent= shift;
+        delete $list->{$ent->{name}};
+      }
+    else
+      { # the second arg was not entity, must be a string then
+        my $name= shift;
+        delete $list->{$name};
+      }
+  }
+
+sub print
+  { my ($ent_list, $fh)= @_;
+    my $old_select= defined $fh ? select $fh : undef;
+
+    foreach my $ent_name ( sort keys %{$ent_list})
+      { my $ent= $ent_list->{$ent_name};
+        # we have to test what the entity is or un-defined entities can creep in
+        $ent->print() if( isa( $ent, 'XML::Twig::Entity'));
+      }
+    select $old_select if( defined $old_select);
+  }
+
+sub text
+  { my ($ent_list)= @_;
+    return join "\n", map { $ent_list->{$_}->text} sort keys %{$ent_list};
+  }
+
+sub list
+  { my ($ent_list)= @_;
+    return map { $ent_list->{$_} } sort keys %$ent_list;
+  }
+
+1;
+
+######################################################################
+package XML::Twig::Entity;
+######################################################################
+use UNIVERSAL qw( isa ) ;
+
+sub new
+  { my( $ent, $name, $val, $sysid, $pubid, $ndata)= @_;
+
+    my $self={};
+
+    $self->{name}= $name;
+    if( $val)
+      { $self->{val}= $val; }
+    else
+      { $self->{sysid}= $sysid;
+        $self->{pubid}= $pubid;
+        $self->{ndata}= $ndata;
+      }
+    bless $self;
+    return $self;
+  }
+
+sub name  { return $_[0]->{name}; }
+sub val   { return $_[0]->{val}; }
+sub sysid { return $_[0]->{sysid}; }
+sub pubid { return $_[0]->{pubid}; }
+sub ndata { return $_[0]->{ndata}; }
+
+sub print
+  { my ($ent, $fh)= @_;
+    if( $fh) { print $fh $ent->text . "\n"; }
+    else     { print $ent->text . "\n"; }
+  }
+
+
+sub text
+  { my ($ent)= @_;
+    if( exists $ent->{'val'})
+      { if( $ent->{'val'}=~ /"/)
+          { return "<!ENTITY $ent->{'name'} '$ent->{'val'}'>"; }
+        return "<!ENTITY $ent->{'name'} \"$ent->{'val'}\">";
+      }
+    elsif( $ent->{'sysid'})
+      { my $text= "<!ENTITY $ent->{'name'} ";
+        $text .= "SYSTEM \"$ent->{'sysid'}\" " if( $ent->{'sysid'});
+        $text .= "PUBLIC \"$ent->{'pubid'}\" " if( $ent->{'pubid'});
+        $text .= "NDATA $ent->{'ndata'}"        if( $ent->{'ndata'});
+        $text .= ">";
+        return $text;
+      }
+  }
+
+                
+1;
+
+######################################################################
+package XML::Twig::Elt;
+######################################################################
+use Carp;
+use UNIVERSAL qw( isa ) ;
+
+use constant  PCDATA  => '#PCDATA'; 
+use constant  CDATA   => '#CDATA'; 
+use constant  PI      => '#PI'; 
+use constant  COMMENT => '#COMMENT'; 
+use constant  ENT     => '#ENT'; 
+
+use constant  ASIS    => '#ASIS';    # pcdata elements not to be XML-escaped
+
+use constant  ELT     => '#ELT'; 
+use constant  TEXT    => '#TEXT'; 
+use constant  EMPTY   => '#EMPTY'; 
+
+use constant CDATA_START    => "<![CDATA[";
+use constant CDATA_END      => "]]>";
+use constant PI_START       => "<?";
+use constant PI_END         => "?>";
+use constant COMMENT_START  => "<!--";
+use constant COMMENT_END    => "-->";
+
+use constant XMLNS_URI      => 'http://www.w3.org/2000/xmlns/';
+my $XMLNS_URI               = XMLNS_URI;
+
+
+BEGIN
+  { # set some aliases for methods
+    *tag           = *gi; 
+    *name          = *gi; 
+    *set_tag       = *set_gi; 
+    *set_name      = *set_gi; 
+    *find_nodes    = *get_xpath; # as in XML::DOM
+    *findnodes     = *get_xpath; # as in XML::LibXML
+    *field         = *first_child_text;
+    *trimmed_field = *first_child_trimmed_text;
+    *is_field      = *contains_only_text;
+    *is            = *passes;
+    *matches       = *passes;
+    *has_child     = *first_child;
+    *has_children  = *first_child;
+    *all_children_pass = *all_children_are;
+    *all_children_match= *all_children_are;
+    *getElementsByTagName= *descendants;
+    *find_by_tag_name= *descendants_or_self;
+  
+    *first_child_is  = *first_child_matches;
+    *last_child_is   = *last_child_matches;
+    *next_sibling_is = *next_sibling_matches;
+    *prev_sibling_is = *prev_sibling_matches;
+    *next_elt_is     = *next_elt_matches;
+    *prev_elt_is     = *prev_elt_matches;
+    *parent_is       = *parent_matches;
+    *child_is        = *child_matches;
+
+    *sort_children_by_value= *sort_children_on_value;
+
+    *has_atts= *att_nb;
+
+    # imports from XML::Twig
+    *_is_fh= *XML::Twig::_is_fh;
+
+    # XML::XPath compatibility
+    *string_value       = *text;
+    *toString           = *sprint;
+    *getName            = *gi;
+    *getRootNode        = *twig;  
+    *getNextSibling     = *_next_sibling;
+    *getPreviousSibling = *_prev_sibling;
+    *isElementNode      = *is_elt;
+    *isTextNode         = *is_text;
+    *isPI               = *is_pi;
+    *isPINode           = *is_pi;
+    *isProcessingInstructionNode= *is_pi;
+    *isComment          = *is_comment;
+    *isCommentNode      = *is_comment;
+    *getTarget          = *target;
+
+    # try using weak references
+    # test whether we can use weak references
+    { local $SIG{__DIE__};
+      if( eval 'require Scalar::Util')
+        { import Scalar::Util qw(weaken); }
+      elsif( eval 'require WeakRef')
+        { import WeakRef; }
+    }
+}
+
+ 
+# can be called as XML::Twig::Elt->new( [[$gi, $atts, [@content]])
+# - gi is an optional gi given to the element
+# - $atts is a hashref to attributes for the element
+# - @content is an optional list of text and elements that will
+#   be inserted under the element 
+sub new 
+  { my $class= shift;
+    $class= ref $class || $class;
+    my $elt  = {};
+    bless ($elt, $class);
+
+    return $elt unless @_;
+
+    # if a gi is passed then use it
+    my $gi= shift;
+    $elt->set_gi( $gi);
+
+
+    my $atts= ref $_[0] eq 'HASH' ? shift : undef;
+
+    if( $gi eq PCDATA)
+      { $elt->{pcdata}=  shift; }
+    elsif( $gi eq ENT)
+      { $elt->{ent}=  shift; }
+    elsif( $gi eq CDATA)
+      { $elt->{cdata}=  shift; }
+    elsif( $gi eq COMMENT)
+      { $elt->{comment}=  shift; }
+    elsif( $gi eq PI)
+      { $elt->set_pi( shift, shift); }
+    else
+      { # the rest of the arguments are the content of the element
+        if( @_)
+          { $elt->set_content( @_); }
+        else
+          { $elt->{empty}=  1;    }
+      }
+
+    if( $atts)
+      { # the attribute hash can be used to pass the asis status 
+        if( defined $atts->{'#ASIS'})  { $elt->set_asis(  $atts->{'#ASIS'} ); delete $atts->{'#ASIS'};  }
+        if( defined $atts->{'#EMPTY'}) { $elt->{empty}=  $atts->{'#EMPTY'}; delete $atts->{'#EMPTY'}; }
+        $elt->set_atts( $atts) if( keys %$atts);
+      }
+
+    return $elt;
+  }
+
+# this function creates an XM:::Twig::Elt from a string
+# it is quite clumsy at the moment, as it just creates a
+# new twig then returns its root
+# there might also be memory leaks there
+# additional arguments are passed to new XML::Twig
+sub parse
+  { my $class= shift;
+    my $string= shift;
+    my %args= @_;
+    my $t= XML::Twig->new(%args);
+    $t->parse( $string);
+    my $elt= $t->root;
+    # clean-up the node 
+    delete $elt->{twig};         # get rid of the twig data
+    delete $elt->{twig_current}; # better get rid of this too
+    return $elt;
+  }
+    
+
+sub set_gi 
+  { my ($elt, $gi)= @_;
+    unless( defined $XML::Twig::gi2index{$gi})
+      { # new gi, create entries in %gi2index and @index2gi
+        push  @XML::Twig::index2gi, $gi;
+        $XML::Twig::gi2index{$gi}= $#XML::Twig::index2gi;
+      }
+    $elt->{gi}= $XML::Twig::gi2index{$gi};
+    return $elt; 
+  }
+
+sub gi  { return $XML::Twig::index2gi[$_[0]->{gi}]; }
+
+sub local_name 
+  { my $elt= shift;
+    return _local_name( $XML::Twig::index2gi[$elt->{'gi'}]);
+  }
+
+sub ns_prefix
+  { my $elt= shift;
+    return _ns_prefix( $XML::Twig::index2gi[$elt->{'gi'}]);
+  }
+
+# namespace prefix for any qname (can be used for elements or attributes)
+sub _ns_prefix
+  { my $qname= shift;
+    if( $qname=~ m{^([^:]*):})
+      { return $1; }
+    else
+      { return( ''); } # should it be '' ?
+  }
+
+# local name for any qname (can be used for elements or attributes)
+sub _local_name
+  { my $qname= shift;
+    (my $local= $qname)=~ s{^[^:]*:}{};
+    return $local;
+  }
+
+BEGIN 
+  { my %DEFAULT_NS= ( xml   => "http://www.w3.org/XML/1998/namespace",
+                      xmlns => "http://www.w3.org/2000/xmlns/",
+                    );
+ 
+    #sub get_namespace
+    sub namespace
+      { my $elt= shift;
+        my $prefix= defined $_[0] ? shift() : $elt->ns_prefix;
+        my $ns_att= $prefix ? "xmlns:$prefix" : "xmlns";
+        my $expanded= $DEFAULT_NS{$prefix} || $elt->inherit_att( $ns_att) || '';
+        return $expanded;
+      }
+  }
+
+
+# return #ELT for an element and #PCDATA... for others
+sub get_type
+  { my $gi_nb= $_[0]->{gi}; # the number, not the string
+    return ELT if( $gi_nb >= $XML::Twig::SPECIAL_GI);
+    return $_[0]->gi;
+  }
+
+# return the gi if it's a "real" element, 0 otherwise
+sub is_elt
+  { return $_[0]->gi if(  $_[0]->{gi} >=  $XML::Twig::SPECIAL_GI);
+    return 0;
+  }
+
+
+sub is_pcdata
+  { my $elt= shift;
+    return (exists $elt->{'pcdata'});
+  }
+
+sub is_cdata
+  { my $elt= shift;
+    return (exists $elt->{'cdata'});
+  }
+
+sub is_pi
+  { my $elt= shift;
+    return (exists $elt->{'target'});
+  }
+
+sub is_comment
+  { my $elt= shift;
+    return (exists $elt->{'comment'});
+  }
+
+sub is_ent
+  { my $elt= shift;
+    return (exists $elt->{ent} || $elt->{ent_name});
+  }
+
+
+sub is_text
+  { my $elt= shift;
+    return (exists( $elt->{'pcdata'}) || (exists $elt->{'cdata'}));
+  }
+
+sub is_empty
+  { return $_[0]->{empty} || 0; }
+
+sub set_empty
+  { $_[0]->{empty}= defined( $_[1]) ? $_[1] : 1; return $_[0]; }
+
+sub set_not_empty
+  { delete $_[0]->{empty} if( ($_[0]->{'empty'} || 0)); return $_[0]; }
+
+
+sub set_asis
+  { my $elt=shift;
+
+    foreach my $descendant ($elt, $elt->_descendants )
+      { $descendant->{asis}= 1;
+        if( (exists $descendant->{'cdata'}))
+          { $descendant->set_gi( PCDATA);
+            $descendant->{pcdata}=  $descendant->{cdata};
+          }
+
+      }
+    return $elt;
+  }
+
+sub set_not_asis
+  { my $elt=shift;
+    foreach my $descendant ($elt, $elt->descendants)
+      { delete $descendant->{asis} if $descendant->{asis};}
+    return $elt;
+  }
+
+sub is_asis
+  { return $_[0]->{asis}; }
+
+sub closed 
+  { my $elt= shift;
+    my $t= $elt->twig || return;
+    my $curr_elt= $t->{twig_current};
+    return unless( $curr_elt);
+    return $curr_elt->in( $elt);
+  }
+
+sub set_pcdata 
+  { delete $_[0]->{empty};
+    $_[0]->{'pcdata'}= $_[1];
+    return $_[0]; 
+  }
+
+sub append_pcdata
+  { delete $_[0]->{empty};
+    $_[0]->{'pcdata'}.= $_[1];
+    return $_[0]; 
+  }
+
+sub pcdata        { return $_[0]->{pcdata}; }
+
+
+sub append_extra_data 
+  {  $_[0]->{extra_data}.= $_[1];
+     return $_[0]; 
+  }
+sub set_extra_data 
+  { $_[0]->{extra_data}= $_[1];
+    return $_[0]; 
+  }
+sub extra_data { return $_[0]->{extra_data}; }
+
+sub set_target 
+  { $_[0]->{'target'}= $_[1];
+    return $_[0]; 
+     
+  }
+sub target { return $_[0]->{target}; }
+
+sub set_data 
+  { $_[0]->{'data'}= $_[1]; 
+    return $_[0];
+  }
+sub data { return $_[0]->{data}; }
+
+sub set_pi
+  { $_[0]->{target}=  $_[1];
+    $_[0]->{data}=  $_[2];
+    return $_[0]; 
+  }
+
+sub pi_string { return PI_START . $_[0]->{target} . " " . $_[0]->{data} . PI_END; }
+
+sub set_comment    { $_[0]->{comment}= $_[1]; return $_[0]; }
+sub comment        { return $_[0]->{comment}; }
+sub comment_string { return COMMENT_START . $_[0]->{comment} . COMMENT_END; }
+
+sub set_ent  { $_[0]->{ent}= $_[1]; return $_[0]; }
+sub ent      { return $_[0]->{ent}; }
+sub ent_name { return substr( $_[0]->{ent}, 1, -1);}
+
+sub set_cdata 
+  { delete $_[0]->{empty};
+    $_[0]->{'cdata'}= $_[1]; 
+    return $_[0];
+  }
+
+sub append_cdata
+  { $_[0]->{'cdata'}.= $_[1]; 
+    return $_[0];
+  }
+sub cdata { return $_[0]->{'cdata'}; }
+sub cdata_string
+  { my $cdata= $_[0]->{cdata};
+    return defined $cdata ? CDATA_START . $cdata . CDATA_END : '';
+  }
+
+#start-extract twig_node
+sub contains_only_text
+  { my $elt= shift;
+    return 0 unless $elt->is_elt;
+    foreach my $child ($elt->children)
+      { return 0 if $child->is_elt; }
+    return $elt;
+  } 
+  
+sub contains_only
+  { my( $elt, $exp)= @_;
+    my @children= $elt->children;
+    foreach my $child (@children)
+      { return 0 unless $child->is( $exp); }
+    return @children;
+  } 
+
+sub contains_a_single
+  { my( $elt, $exp)= @_;
+    my $child= $elt->{first_child} or return 0;
+    return 0 unless $child->matches( $exp);
+    return 0 if( $child->{next_sibling});
+    return $child;
+  } 
+
+
+
+sub root 
+  { my $elt= shift;
+    while( $elt->{parent}) { $elt= $elt->{parent}; }
+    return $elt;
+  }
+#end-extract twig_node
+
+sub twig 
+  { my $elt= shift;
+    my $root= $elt->root;
+    return $root->{twig};
+  }
+
+
+#start-extract twig_node
+
+# returns undef or the element, depending on whether $elt passes $cond
+# $cond can be
+# - empty: the element passes the condition
+# - ELT ('#ELT'): the element passes the condition if it is a "real" element
+# - TEXT ('#TEXT'): the element passes if it is a CDATA or PCDATA element
+# - a string with an XPath condition (only a subset of XPath is actually
+#   supported).
+# - a regexp: the element passes if its gi matches the regexp
+# - a code ref: the element passes if the code, applied on the element,
+#   returns true
+
+my %cond_cache; # expression => coderef
+
+sub reset_cond_cache { %cond_cache=(); }
+
+{ 
+   sub _install_cond
+    { my $cond= shift;
+      my $sub;
+      my $test;
+
+      my $original_cond= $cond;
+
+      my $not= ($cond=~ s{^\s*!}{}) ? '!' : '';
+
+      if( ref $cond eq 'CODE') { return $cond; }
+    
+      if( ref $cond eq 'Regexp')
+        { $test = qq{(\$_[0]->gi=~ /$cond/)}; }
+      else
+        { # the condition is a string
+          if( $cond eq ELT)     
+            { $test = qq{\$_[0]->is_elt}; }
+          elsif( $cond eq TEXT) 
+            { $test = qq{\$_[0]->is_text}; }
+          elsif( $cond=~ m{^\s*($REG_NAME_W)\s*$}o)                  
+            { # gi
+              if( $1 ne '*')
+                { # 2 options, depending on whether the gi exists in gi2index
+                  # start optimization
+                  my $gi= $XML::Twig::gi2index{$1};
+                  if( $gi)
+                    { # the gi exists, use its index as a faster shortcut
+                      $test = qq{ \$_[0]->{gi} eq "$XML::Twig::gi2index{$1}"};
+                    }
+                  else
+                  # end optimization
+                    { # it does not exist (but might be created later), compare the strings
+                      $test = qq{ \$_[0]->gi eq "$1"}; 
+                    }
+                }
+              else
+                { $test = qq{ (1) } }
+            }
+          elsif( $cond=~ m{^\s*($REG_REGEXP)\s*$}o)
+            { # /regexp/
+              $test = qq{ \$_[0]->gi=~ $1 }; 
+            }
+          elsif( $cond=~ m{^\s*($REG_NAME_W)?\s*\[\s*(\!\s*)?\@($REG_NAME)\s*\]\s*$}o)
+            { # gi[@att]
+              my( $gi, $not, $att)= ($1, $2, $3);
+              $not||='';
+              if( $gi && ($gi ne '*'))
+                { $test = qq{    (\$_[0]->gi eq "$gi") 
+                              && $not(defined \$_[0]->{'att'}->{"$att"})
+                            };
+                }
+              else
+                { $test = qq{ $not (defined \$_[0]->{'att'}->{"$att"})}; }
+             }
+          elsif( $cond=~ m{^\s*($REG_NAME_W)?\s*  # $1
+                           \[\s*(-?)\s*(\d+)\s*\] #   [$2]
+                           \s*$}xo
+               )
+            { my( $gi, $neg, $index)= ($1, $2, $3);
+              my $siblings= $neg ? q{$_[0]->_next_siblings} : q{$_[0]->_prev_siblings};
+              if( $gi && ($gi ne '*')) 
+                { $test= qq{((\$_[0]->gi eq "$gi") && (scalar( grep { \$_->gi eq "$gi" } $siblings) + 1 == $index))}; }
+              else
+                { $test= qq{(scalar( $siblings) + 1 == $index)}; }
+            }
+          elsif( $cond=~ m{^\s*($REG_NAME_W)?\s*  # $1
+                           \[\@($REG_NAME)        #   [@$2
+                           \s*($REG_OP)\s*        #        = (or other op) $3
+                          ($REG_VALUE)            #          "$4" or '$4'
+                          \s*\]\s*$}xo)           #                       ]
+            { # gi[@att="val"]
+              my( $gi, $att, $op, $string)= ($1, $2, _op( $3), $4);
+              if( $gi && ($gi ne '*'))
+                { $test = qq{    (\$_[0]->gi eq "$gi") 
+                              && (defined \$_[0]->{'att'}->{"$att"}) 
+                              && ( \$_[0]->{'att'}->{"$att"} $op $string) 
+                            }; 
+                }
+              else
+                { $test = qq{    (defined \$_[0]->{'att'}->{"$att"}) 
+                              && ( \$_[0]->{'att'}->{"$att"} $op $string) 
+                            };
+                }
+            }
+          elsif( $cond=~ m{^\s*($REG_NAME_W)?\s*  # $1
+                           \[\@($REG_NAME)        #   [@$2
+                           \s*($REG_OP)\s*        #        = (or other op) $3
+                           ($REG_VALUE)           #          "$4" or '$4'
+                           \s*(and|or)\s*         #              and or or ($5)
+                           \@($REG_NAME)          #                  @$6
+                           \s*($REG_OP)\s*        #                      = (or other op) $7
+                           ($REG_VALUE)           #                        "$8" or '$8'
+                           \s*\]\s*$}xo)          #                       ]
+            { # gi[@att="val"]
+              my( $gi, $att1, $op1, $string1, $connector, $att2, $op2, $string2)= ($1, $2, _op( $3), $4, $5, $6, _op( $7), $8);
+              if( $gi && ($gi ne '*'))
+                { $test = qq{ (   (\$_[0]->gi eq "$gi") 
+                                and ( ( (defined \$_[0]->{'att'}->{"$att1"})  and( \$_[0]->{'att'}->{"$att1"} $op1 $string1) )
+                                        $connector 
+                                      ( (defined \$_[0]->{'att'}->{"$att2"})  and( \$_[0]->{'att'}->{"$att2"} $op2 $string2) )
+                                    )
+                              )
+                            }; 
+                }
+              else
+                { $test = qq{ ( ( (defined \$_[0]->{'att'}->{"$att1"}) and ( \$_[0]->{'att'}->{"$att1"} $op1 $string1) )
+                               $connector 
+                                ( (defined \$_[0]->{'att'}->{"$att2"})  and( \$_[0]->{'att'}->{"$att2"} $op2 $string2) )
+                              )
+                            };
+                }
+            }
+          elsif( $cond=~ m{^\s*\.([\w-]+)\s*$}o)
+            { # .class
+              my $class= $1;
+              $test = qq{(\$_[0]->in_class( "$class")) }; 
+            }
+          elsif( $cond=~ m{^\s*($REG_NAME_W)?\s*  # $1
+                           \[\@($REG_NAME)        #   [@$2
+                           \s*($REG_MATCH)\s*     #        =~ or !~ ($3)
+                           ($REG_REGEXP)          #           /$4/
+                           \s*\]\s*$}xo)          #                ]
+            { # gi[@att=~ /regexp/] or gi[@att!~/regexp/]
+              my( $gi, $att, $match, $regexp)= ($1, $2, $3, $4);
+              if( $gi && ($gi ne '*'))
+                { $test = qq{    (\$_[0]->gi eq "$gi") 
+                              && (   defined \$_[0]->{'att'}->{"$att"}) 
+                              && ( \$_[0]->{'att'}->{"$att"} $match $regexp)
+                            }; 
+                }
+              else
+                { # *[@att=~/regexp/ or *[@att!~/regexp/
+                  $test = qq{(    defined \$_[0]->{'att'}->{"$att"}) 
+                               && ( \$_[0]->{'att'}->{"$att"} $match $regexp)
+                            };
+                }
+            }
+          elsif( $cond=~ m{^\s*\@($REG_NAME)\s*$}o)
+            { # @att (or !@att)
+              my( $att)= ($1);
+              $test = qq{ (defined \$_[0]->{'att'}->{"$att"})}; 
+            }
+          elsif( $cond=~ m{^\s*                   
+                           \@($REG_NAME)        #   @$1
+                           \s*($REG_OP)\s*      #       = (or other op) $2
+                           ($REG_VALUE)         #         "$3" or '$3'
+                           \s*$}xo)                                 
+            { # @att="val"
+              my( $att, $op, $string)= ( $1, _op( $2), $3);
+              $test = qq{    (defined \$_[0]->{'att'}->{"$att"}) 
+                          && ( \$_[0]->{'att'}->{"$att"} $op $string) 
+                        };
+             }
+          elsif( $cond=~ m{^\s*                   
+                           \@($REG_NAME)        #   @$1
+                           \s*($REG_OP)\s*      #       = (or other op) $2
+                           ($REG_VALUE)         #         "$3" or '$3'
+                           \s*(and|or)\s*       #              and or or ($4)
+                           \@($REG_NAME)        #   @$5
+                           \s*($REG_OP)\s*      #       = (or other op) $6
+                           ($REG_VALUE)         #         "$7" or '$7'
+                           \s*$}xo)                                 
+            { # @att="val"
+              my( $att1, $op1, $string1, $connector, $att2, $op2, $string2 )= ( $1, _op( $2), $3, $4, $5, _op( $6), $7);
+              $test = qq{ ( (    (defined \$_[0]->{'att'}->{"$att1"}) 
+                              && ( \$_[0]->{'att'}->{"$att1"} $op1 $string1) 
+                            )
+                            $connector
+                            (    (defined \$_[0]->{'att'}->{"$att2"}) 
+                              && ( \$_[0]->{'att'}->{"$att2"} $op2 $string2) 
+                            )
+                          )
+                        };
+             }
+          elsif( $cond=~ m{^\s*
+                           \@($REG_NAME)        #   [@$1
+                           \s*(=~|!~)\s*        #        =~ or !~ ($2)
+                          ($REG_REGEXP)         #           /$3/
+                          \s*\s*$}xo)           #                ]
+            { # @att=~ /regexp/ or @att!~/regexp/
+              my( $att, $match, $regexp)= ( $2, $3, $4);
+              $test = qq{(    defined \$_[0]->{'att'}->{"$att"}) 
+                           && ( \$_[0]->{'att'}->{"$att"} $match $regexp)
+                        };
+            }
+          elsif( $cond=~ m{^\s*($REG_NAME_W)?\s*            # $1
+                           \[\s*(?:text|string)(?:\(\s*\))? #   [string()
+                           \s*($REG_OP)\s*                  #            = or other op ($2)
+                           ($REG_VALUE)                     #              "$3" or '$3'
+                           \s*\]\s*$}xo)                    #                          ]
+            { # gi[string()= "val"]
+              my ($gi, $op, $text)= ($1, _op( $2), $3);
+              if( $gi && ($gi ne '*'))
+                { $test = qq{(\$_[0]->gi eq "$gi") && ( \$_[0]->text eq $text)}; }
+              else
+                { $test = qq{ \$_[0]->text eq $text }; }
+            }
+          elsif( $cond=~ m{^\s*($REG_NAME_W)?\s*            # $1
+                           \[\s*(?:text|string)(?:\(\s*\))? #   [string()
+                           \s*($REG_MATCH)\s*               #             =~ or !~ ($2)
+                           ($REG_REGEXP)                    #               /$3/
+                           \s*\]\s*$}xo)                    #                   ]
+            { # gi[string()=~ /regexp/]
+              my( $gi, $match, $regexp)= ($1, $2, $3);
+              if( $gi && ($gi ne '*'))
+                { $test = qq{(\$_[0]->gi eq "$gi") && ( \$_[0]->text $match $regexp) }; }
+              else
+                { $test = qq{ \$_[0]->text $match $regexp }; }
+            }
+          elsif( $cond=~ m{^\s*($REG_NAME_W)?\s*            # $1
+                           \[\s*(?:text|string)\s*\(\s*     #   [string(
+                           ($REG_NAME)\s*\)                 #            $2)
+                           \s*($REG_OP)\s*                  #                = or other op $3
+                           ($REG_VALUE)                     #                  "$4" or '$4'
+                           \s*\]\s*$}xo)                    #                      ]
+            { # gi[string(gi2)= "text"]
+              my ($gi, $gi2, $op, $text)= ($1, $2, _op($3), $4);
+              $text=~ s/([{}])/\\$1/g;
+              if( $gi && ($gi ne '*'))
+                { $test = qq{    (\$_[0]->gi eq "$gi") 
+                              && ( \$_[0]->first_child( qq{$gi2\[text() $op $text]}))
+                            };
+                }
+              else
+                { $test = qq{ \$_[0]->first_child(qq{$gi2\[text() $op $text]}) } ; }
+            }
+          elsif( $cond=~ m{^\s*($REG_NAME_W)?\s*     # $1
+                           \[\s*(?:text|string)\(\s* #   [string(
+                           ($REG_NAME)\s*\)          #         $2)
+                           \s*(=~|!~)\s*             #            =~ or !~ ($3)
+                           ($REG_REGEXP)             #              /$4/
+                           \s*\]\s*$}xo)             #                  ]
+            { # gi[string(gi2)=~ /regexp/]
+              my( $gi, $gi2, $match, $regexp)= ($1, $2, $3, $4);
+              if( $gi && ($gi ne '*'))
+                { $test = qq{   (\$_[0]->gi eq "$gi") 
+                             && ( \$_[0]->field( "$gi2") $match $regexp)
+                            };
+                }
+              else
+                { $test = qq{\$_[0]->field( "$gi2") $match $regexp}; }
+            }
+          else
+            { croak "wrong condition '$original_cond'"; }
+        }
+
+      my $s= eval "sub { return \$_[0] if( $not($test)) }";
+      if( $@) 
+        { croak "wrong navigation condition $original_cond ($@);" }
+      return $s;
+    }
+
+  sub _op
+    { my $op= shift;
+      if(    $op eq '=')  { $op= 'eq'; }
+      elsif( $op eq '!=') { $op= 'ne'; }
+      return $op;
+    }
+ 
+  sub passes
+    { my( $elt, $cond)= @_;
+      return $elt unless $cond;
+      my $sub= ($cond_cache{$cond} ||= _install_cond( $cond));
+      return $sub->( $elt);
+    }
+}
+# end-extract twig_nodes
+
+sub set_parent 
+  { $_[0]->{parent}= $_[1];
+    weaken( $_[0]->{parent}) if( $XML::Twig::weakrefs);
+  }
+
+#start-extract twig_node
+sub parent
+  { my $elt= shift;
+    my $cond= shift || return $elt->{parent};
+    do { $elt= $elt->{parent} || return; } until (!$elt || $elt->passes( $cond));
+    return $elt;
+  }
+#end-extract twig_node
+
+sub set_first_child 
+  { delete $_[0]->{empty};
+    $_[0]->{'first_child'}= $_[1]; 
+  }
+
+#start-extract twig_node
+sub first_child
+  { my $elt= shift;
+    my $cond= shift || return $elt->{first_child};
+    my $child= $elt->{first_child};
+    my $test_cond= ($cond_cache{$cond} ||= _install_cond( $cond));
+    while( $child && !$test_cond->( $child)) 
+       { $child= $child->{next_sibling}; }
+    return $child;
+  }
+#end-extract twig_node
+  
+sub _first_child   { return $_[0]->{first_child};  }
+sub _last_child    { return $_[0]->{last_child};   }
+sub _next_sibling  { return $_[0]->{next_sibling}; }
+sub _prev_sibling  { return $_[0]->{prev_sibling}; }
+sub _parent        { return $_[0]->{parent};       }
+sub _next_siblings { my $elt= shift; my @siblings; while( $elt= $elt->{next_sibling}) { push @siblings, $elt; } return @siblings; }
+sub _prev_siblings { my $elt= shift; my @siblings; while( $elt= $elt->{prev_sibling}) { push @siblings, $elt; } return @siblings; }
+
+# sets a field
+# arguments $record, $cond, @content
+sub set_field
+  { my $record = shift;
+    my $cond = shift;
+    my $child= $record->first_child( $cond);
+    if( $child)
+      { $child->set_content( @_); }
+    else
+      { if( $cond=~ m{^\s*($REG_NAME)})
+          { my $gi= $1;
+            $child= $record->insert_new_elt( last_child => $gi, @_); 
+          }
+        else
+          { croak "can't create a field name from $cond"; }
+      } 
+    return $child;
+  }
+
+sub set_last_child 
+  { delete $_[0]->{empty};
+    $_[0]->{'last_child'}= $_[1];
+    weaken( $_[0]->{'last_child'}) if( $XML::Twig::weakrefs);
+  }
+
+#start-extract twig_node
+sub last_child
+  { my $elt= shift;
+    my $cond= shift || return $elt->{last_child};
+    my $test_cond= ($cond_cache{$cond} ||= _install_cond( $cond));
+    my $child= $elt->{last_child};
+    while( $child && !$test_cond->( $child) )
+      { $child= $child->{prev_sibling}; }
+    return $child
+  }
+#end-extract twig_node
+
+
+sub set_prev_sibling 
+  { $_[0]->{'prev_sibling'}= $_[1]; 
+    weaken( $_[0]->{'prev_sibling'}) if( $XML::Twig::weakrefs); 
+  }
+
+#start-extract twig_node
+sub prev_sibling
+  { my $elt= shift;
+    my $cond= shift || return $elt->{prev_sibling};
+    my $test_cond= ($cond_cache{$cond} ||= _install_cond( $cond));
+    my $sibling= $elt->{prev_sibling};
+    while( $sibling && !$test_cond->( $sibling) )
+          { $sibling= $sibling->{prev_sibling}; }
+    return $sibling;
+  }
+#end-extract twig_node
+
+sub set_next_sibling { $_[0]->{'next_sibling'}= $_[1]; }
+
+#start-extract twig_node
+sub next_sibling
+  { my $elt= shift;
+    my $cond= shift || return $elt->{next_sibling};
+    my $test_cond= ($cond_cache{$cond} ||= _install_cond( $cond));
+    my $sibling= $elt->{next_sibling};
+    while( $sibling && !$test_cond->( $sibling) )
+          { $sibling= $sibling->{next_sibling}; }
+    return $sibling;
+  }
+
+# methods dealing with the class attribute, convenient if you work with xhtml
+sub class     { my( $elt)= @_; return $elt->{'att'}->{'class'}; }
+sub set_class { my( $elt, $class)= @_; $elt->set_att( class => $class); }
+
+# adds a class to an element
+sub add_to_class
+  { my( $elt, $new_class)= @_;
+    return $elt unless $new_class;
+    my $class= $elt->class;
+    my %class= $class ? map { $_ => 1 } split /\s+/, $class : ();
+    $class{$new_class}= 1;
+    $elt->set_class( join( ' ', sort keys %class));
+  }
+
+sub att_to_class      { my( $elt, $att)= @_; $elt->set_class( $elt->{'att'}->{$att}); }
+sub add_att_to_class  { my( $elt, $att)= @_; $elt->add_to_class( $elt->{'att'}->{$att}); }
+sub move_att_to_class { my( $elt, $att)= @_; $elt->add_to_class( $elt->{'att'}->{$att});
+                        $elt->del_att( $att); 
+                      }
+sub tag_to_class      { my( $elt)= @_; $elt->set_class( $elt->tag);    }
+sub add_tag_to_class  { my( $elt)= @_; $elt->add_to_class( $elt->tag); }
+sub set_tag_class     { my( $elt, $new_tag)= @_; $elt->add_tag_to_class; $elt->set_tag( $new_tag); }
+
+sub in_class          
+  { my( $elt, $class)= @_;
+    my $elt_class= $elt->class;
+    return unless( defined $elt_class);
+    return $elt->class=~ m{(?:^|\s)\Q$class\E(?:\s|$)} ? $elt : 0;
+  }
+
+#end-extract twig_node
+
+# get or set all attributes
+sub set_atts 
+  { my $elt= shift;
+    my %atts;
+    tie %atts, 'Tie::IxHash' if( keep_atts_order());
+    if( isa( $_[0] || '', 'HASH'))
+      { while( my( $att, $value)= each %{$_[0]}) { $atts{$att}= $value; } 
+      }
+    else
+      { %atts= @_; }
+    $elt->{'att'}= \%atts;
+    return $elt;
+  }
+
+sub atts      { return $_[0]->{att};           }
+sub att_names { return sort keys %{$_[0]->{att}};   }
+sub del_atts  { $_[0]->{att}={}; return $_[0]; }
+
+# get or set a single attribute (set works for several atts)
+sub set_att 
+  { my $elt= shift;
+    
+    unless( $elt->{att})
+      { $elt->{att}={};
+        tie %{$elt->{att}}, 'Tie::IxHash' if( keep_atts_order());
+      }
+
+    while(@_) { my( $att, $val)= (shift, shift);
+                $elt->{att}->{$att}= $val;
+          }
+    return $elt;
+  }
+sub att { return $_[0]->{att}->{$_[1]}; }
+sub del_att 
+  { my $elt= shift;
+    while( @_) { delete $elt->{'att'}->{shift()}; }
+    return $elt;
+  }
+
+# delete an attribute from all descendants of an element
+sub strip_att
+  { my( $elt, $att)= @_;
+    $_->del_att( $att) foreach ($elt->descendants_or_self( qq{*[\@$att]}));
+  }
+
+sub change_att_name
+  { my( $elt, $old_name, $new_name)= @_;
+    my $value= $elt->{'att'}->{$old_name};
+    return $elt unless( defined $value);
+    $elt->del_att( $old_name)
+        ->set_att( $new_name => $value);
+    return $elt;
+  }
+
+sub set_twig_current { $_[0]->{twig_current}=1; }
+sub del_twig_current { delete $_[0]->{twig_current}; }
+
+
+# get or set the id attribute
+sub set_id 
+  { my( $elt, $id)= @_;
+    $elt->set_att($ID, $id); 
+    my $t= $elt->twig || return;
+    $elt->twig->{twig_id_list}->{$id}= $elt;
+    weaken(  $elt->twig->{twig_id_list}->{$id}) if( $XML::Twig::weakrefs);
+  }
+
+sub id { return $_[0]->{att}->{$ID}; }
+
+# methods used to add ids to elements that don't have one
+BEGIN 
+{ my $id_nb   = "0001";
+  my $id_seed = "twig_id_";
+
+  sub set_id_seed
+    { $id_seed= $_[1]; $id_nb=1; }
+
+  sub add_id
+    { my $elt= shift;
+      $elt->set_id( $id_seed . $id_nb++) unless( $elt->{'att'}->{$ID});
+    }
+
+}
+
+
+
+# delete the id attribute and remove the element from the id list
+sub del_id 
+  { my $elt= shift;
+    my $id= $elt->{'att'}->{$ID} or return;
+    my $t= $elt->twig && delete $elt->twig->{twig_id_list}->{$id};
+    delete $elt->{'att'}->{$ID}; 
+  }
+
+# return the list of children
+#start-extract twig_node
+sub children
+  { my $elt= shift;
+    my @children;
+    my $child= $elt->first_child( @_);
+    while( $child) 
+      { push @children, $child;
+        $child= $child->next_sibling( @_);
+      } 
+    return @children;
+  }
+
+sub _children
+  { my $elt= shift;
+    my @children=();
+    my $child= $elt->_first_child();
+    while( $child) 
+      { push @children, $child;
+        $child= $child->{next_sibling};
+      } 
+    return @children;
+  }
+
+sub children_copy
+  { my $elt= shift;
+    my @children;
+    my $child= $elt->first_child( @_);
+    while( $child) 
+      { push @children, $child->copy;
+        $child= $child->next_sibling( @_);
+      } 
+    return @children;
+  }
+
+
+sub children_count
+  { my $elt= shift;
+    my $cond= shift;
+    my $count=0;
+    my $child= $elt->{first_child};
+    while( $child)
+      { $count++ if( $child->passes( $cond)); 
+        $child= $child->{next_sibling};
+      }
+    return $count;
+  }
+
+sub children_text
+  { my $elt= shift;
+    return map { $_->text} $elt->children( @_);
+  }
+
+sub all_children_are
+  { my( $parent, $cond)= @_;
+    foreach my $child ($parent->children)
+      { return 0 unless( $child->passes( $cond)); }
+    return 1;
+  }
+
+
+sub ancestors
+  { my( $elt, $cond)= @_;
+    my @ancestors;
+    while( $elt->{parent})
+      { $elt= $elt->{parent};
+        push @ancestors, $elt
+          if( $elt->passes( $cond));
+      }
+    return @ancestors;
+  }
+
+sub ancestors_or_self
+  { my( $elt, $cond)= @_;
+    my @ancestors;
+    while( $elt)
+      { push @ancestors, $elt
+          if( $elt->passes( $cond));
+        $elt= $elt->{parent};
+      }
+    return @ancestors;
+  }
+
+
+sub _ancestors
+  { my( $elt, $include_self)= @_;
+    my @ancestors= $include_self ? ($elt) : ();
+    while( $elt= $elt->{parent})
+      { push @ancestors, $elt;
+      }
+    return @ancestors;
+  }
+
+
+sub inherit_att
+  { my $elt= shift;
+    my $att= shift;
+    my %tags= map { ($_, 1) } @_;
+
+    do 
+      { if(   (defined $elt->{'att'}->{$att})
+           && ( !%tags || $tags{$XML::Twig::index2gi[$elt->{'gi'}]})
+          )
+          { return $elt->{'att'}->{$att}; }
+      } while( $elt= $elt->{parent});
+    return undef;
+  }
+
+
+sub current_ns_prefixes
+  { my $elt= shift;
+    my %prefix;
+    $prefix{''}=1 if( $elt->namespace( ''));
+    while( $elt)
+      { my @ns= grep { !m{^xml} } map { m{^([^:]+):} } ($XML::Twig::index2gi[$elt->{'gi'}], $elt->att_names);
+        $prefix{$_}=1 foreach (@ns);
+        $elt= $elt->{parent};
+      }
+
+    return sort keys %prefix;
+  }
+
+# kinda counter-intuitive actually:
+# the next element is found by looking for the next open tag after from the
+# current one, which is the first child, if it exists, or the next sibling
+# or the first next sibling of an ancestor
+# optional arguments are: 
+#   - $subtree_root: a reference to an element, when the next element is not 
+#                    within $subtree_root anymore then next_elt returns undef
+#   - $gi: a gi, next_elt returns the next element of this gi
+                 
+sub next_elt
+  { my $elt= shift;
+    my $subtree_root= 0;
+    $subtree_root= shift if( defined $_[0] and (isa( $_[0], 'XML::Twig::Elt')));
+    my $cond= shift;
+    my $next_elt;
+
+    my $ind;                                                              # optimization
+    my $test_cond;
+    if( $cond)                                                            # optimization
+      { unless( defined( $ind= $XML::Twig::gi2index{$cond}) )             # optimization
+          { $test_cond= ($cond_cache{$cond} ||= _install_cond( $cond)); } # optimization
+      }                                                                   # optimization
+    
+    do
+      { if( $next_elt= $elt->{first_child})
+          { # simplest case: the elt has a child
+          }
+         elsif( $next_elt= $elt->{next_sibling}) 
+          { # no child but a next sibling (just check we stay within the subtree)
+          
+            # case where elt is subtree_root, is empty and has a sibling
+            return undef if( $subtree_root && ($elt == $subtree_root));
+            
+          }
+        else
+          { # case where the element has no child and no next sibling:
+            # get the first next sibling of an ancestor, checking subtree_root 
+          
+            # case where elt is subtree_root, is empty and has no sibling
+            return undef if( $subtree_root && ($elt == $subtree_root));
+             
+            # backtrack until we find a parent with a next sibling
+            $next_elt= $elt->{parent} || return undef;
+            until( $next_elt->{next_sibling})
+              { return undef if( $subtree_root && ($subtree_root == $next_elt));
+                $next_elt= $next_elt->{parent} || return undef;
+              }
+            return undef if( $subtree_root && ($subtree_root == $next_elt)); 
+            $next_elt= $next_elt->{next_sibling};   
+          }  
+      $elt= $next_elt;                   # just in case we need to loop
+    } until(    ! defined $elt 
+             || ! defined $cond 
+         || (defined $ind       && ($elt->{gi} eq $ind))   # optimization
+         || (defined $test_cond && ($test_cond->( $elt)))
+               );
+    
+      return $elt;
+      }
+
+# counter-intuitive too:
+# the previous element is found by looking
+# for the first open tag backwards from the current one
+# it's the last descendant of the previous sibling 
+# if it exists, otherwise it's simply the parent
+sub prev_elt
+  { my $elt= shift;
+    my $cond= shift;
+    # get prev elt
+    my $prev_elt;
+    do
+      { if( $prev_elt= $elt->{prev_sibling})
+          { while( $prev_elt->{last_child})
+              { $prev_elt= $prev_elt->{last_child}; }
+          }
+        else
+          { $prev_elt= $elt->{parent} || return; }
+        $elt= $prev_elt;     # in case we need to loop 
+      } until( $elt->passes( $cond));
+
+    return $prev_elt;
+  }
+
+
+sub next_n_elt
+  { my $elt= shift;
+    my $offset= shift;
+    foreach (1..$offset)
+      { $elt= $elt->next_elt( @_) || return undef; }
+    return $elt;
+  }
+
+# checks whether $elt is included in $ancestor, returns 1 in that case
+sub in
+  { my ($elt, $ancestor)= @_;
+    if( isa( $ancestor, 'XML::Twig::Elt'))
+      { # element
+        while( $elt= $elt->{parent}) { return $elt if( $elt ==  $ancestor); } 
+      }
+    else
+      { # condition
+        while( $elt= $elt->{parent}) { return $elt if( $elt->matches( $ancestor)); } 
+      }
+    return 0;           
+  }
+
+sub first_child_text  
+  { my $elt= shift;
+    my $dest=$elt->first_child(@_) or return '';
+    return $dest->text;
+  }
+  
+sub first_child_trimmed_text  
+  { my $elt= shift;
+    my $dest=$elt->first_child(@_) or return '';
+    return $dest->trimmed_text;
+  }
+  
+sub first_child_matches
+  { my $elt= shift;
+    my $dest= $elt->{first_child} or return undef;
+    return $dest->passes( @_);
+  }
+  
+sub last_child_text  
+  { my $elt= shift;
+    my $dest=$elt->last_child(@_) or return '';
+    return $dest->text;
+  }
+  
+sub last_child_trimmed_text  
+  { my $elt= shift;
+    my $dest=$elt->last_child(@_) or return '';
+    return $dest->trimmed_text;
+  }
+  
+sub last_child_matches
+  { my $elt= shift;
+    my $dest= $elt->{last_child} or return undef;
+    return $dest->passes( @_);
+  }
+  
+sub child_text
+  { my $elt= shift;
+    my $dest=$elt->child(@_) or return '';
+    return $dest->text;
+  }
+  
+sub child_trimmed_text
+  { my $elt= shift;
+    my $dest=$elt->child(@_) or return '';
+    return $dest->trimmed_text;
+  }
+  
+sub child_matches
+  { my $elt= shift;
+    my $nb= shift;
+    my $dest= $elt->child( $nb) or return undef;
+    return $dest->passes( @_);
+  }
+
+sub prev_sibling_text  
+  { my $elt= shift;
+    my $dest=$elt->prev_sibling(@_) or return '';
+    return $dest->text;
+  }
+  
+sub prev_sibling_trimmed_text  
+  { my $elt= shift;
+    my $dest=$elt->prev_sibling(@_) or return '';
+    return $dest->trimmed_text;
+  }
+  
+sub prev_sibling_matches
+  { my $elt= shift;
+    my $dest= $elt->{prev_sibling} or return undef;
+    return $dest->passes( @_);
+  }
+  
+sub next_sibling_text  
+  { my $elt= shift;
+    my $dest=$elt->next_sibling(@_) or return '';
+    return $dest->text;
+  }
+  
+sub next_sibling_trimmed_text  
+  { my $elt= shift;
+    my $dest=$elt->next_sibling(@_) or return '';
+    return $dest->trimmed_text;
+  }
+  
+sub next_sibling_matches
+  { my $elt= shift;
+    my $dest= $elt->{next_sibling} or return undef;
+    return $dest->passes( @_);
+  }
+  
+sub prev_elt_text  
+  { my $elt= shift;
+    my $dest=$elt->prev_elt(@_) or return '';
+    return $dest->text;
+  }
+  
+sub prev_elt_trimmed_text  
+  { my $elt= shift;
+    my $dest=$elt->prev_elt(@_) or return '';
+    return $dest->trimmed_text;
+  }
+  
+sub prev_elt_matches
+  { my $elt= shift;
+    my $dest= $elt->prev_elt or return undef;
+    return $dest->passes( @_);
+  }
+  
+sub next_elt_text  
+  { my $elt= shift;
+    my $dest=$elt->next_elt(@_) or return '';
+    return $dest->text;
+  }
+  
+sub next_elt_trimmed_text  
+  { my $elt= shift;
+    my $dest=$elt->next_elt(@_) or return '';
+    return $dest->trimmed_text;
+  }
+  
+sub next_elt_matches
+  { my $elt= shift;
+    my $dest= $elt->next_elt or return undef;
+    return $dest->passes( @_);
+  }
+  
+sub parent_text  
+  { my $elt= shift;
+    my $dest=$elt->parent(@_) or return '';
+    return $dest->text;
+  }
+  
+sub parent_trimmed_text  
+  { my $elt= shift;
+    my $dest=$elt->parent(@_) or return '';
+    return $dest->trimmed_text;
+  }
+  
+sub parent_matches
+  { my $elt= shift;
+    my $dest= $elt->{parent} or return undef;
+    return $dest->passes( @_);
+  }
+ 
+sub is_first_child
+  { my $elt= shift;
+    my $parent= $elt->{parent} or return 0;
+    my $first_child= $parent->first_child( @_) or return 0;
+    return ($first_child == $elt) ? $elt : 0;
+  }
+ 
+sub is_last_child
+  { my $elt= shift;
+    my $parent= $elt->{parent} or return 0;
+    my $last_child= $parent->last_child( @_) or return 0;
+    return ($last_child == $elt) ? $elt : 0;
+  }
+
+# returns the depth level of the element
+# if 2 parameter are used then counts the 2cd element name in the
+# ancestors list
+sub level
+  { my( $elt, $cond)= @_;
+   
+    my $level=0;
+    my $name=shift || '';
+    while( $elt= $elt->{parent}) { $level++ if( !$cond || $elt->matches( $cond)); }
+    return $level;           
+  }
+
+# checks whether $elt has an ancestor that satisfies $cond, returns the ancestor
+sub in_context
+  { my ($elt, $cond, $level)= @_;
+    $level= -1 unless( $level) ;  # $level-- will never hit 0
+
+    while( $level)
+      { $elt= $elt->{parent} or return;
+        if( $elt->matches( $cond)) { return $elt; }
+        $level--;
+      }
+  }
+
+
+sub _descendants
+  { my( $subtree_root, $include_self)= @_;
+    my @descendants= $include_self ? ($subtree_root) : ();
+
+    my $elt= $subtree_root; 
+    my $next_elt;   
+ 
+    MAIN: while( 1)  
+      { if( $next_elt= $elt->{first_child})
+          { # simplest case: the elt has a child
+          }
+        elsif( $next_elt= $elt->{next_sibling}) 
+          { # no child but a next sibling (just check we stay within the subtree)
+          
+            # case where elt is subtree_root, is empty and has a sibling
+            last MAIN if( $elt == $subtree_root);
+          }
+        else
+          { # case where the element has no child and no next sibling:
+            # get the first next sibling of an ancestor, checking subtree_root 
+                
+            # case where elt is subtree_root, is empty and has no sibling
+            last MAIN if( $elt == $subtree_root);
+               
+            # backtrack until we find a parent with a next sibling
+            $next_elt= $elt->{parent} || last;
+            until( $next_elt->{next_sibling})
+              { last MAIN if( $subtree_root == $next_elt);
+                $next_elt= $next_elt->{parent} || last MAIN;
+              }
+            last MAIN if( $subtree_root == $next_elt); 
+            $next_elt= $next_elt->{next_sibling};   
+          }  
+        $elt= $next_elt || last MAIN;
+        push @descendants, $elt;
+      }
+    return @descendants;
+  }
+
+
+sub descendants
+  { my( $subtree_root, $cond)= @_;
+    my @descendants=(); 
+    my $elt= $subtree_root;
+    
+    # this branch is pure optimisation for speed: if $cond is a gi replace it
+    # by the index of the gi and loop here 
+    # start optimization
+    my $ind;
+    if( !$cond || ( defined ( $ind= $XML::Twig::gi2index{$cond})) )
+      {
+        my $next_elt;
+
+        while( 1)  
+          { if( $next_elt= $elt->{first_child})
+                { # simplest case: the elt has a child
+                }
+             elsif( $next_elt= $elt->{next_sibling}) 
+              { # no child but a next sibling (just check we stay within the subtree)
+           
+                # case where elt is subtree_root, is empty and has a sibling
+                last if( $subtree_root && ($elt == $subtree_root));
+              }
+            else
+              { # case where the element has no child and no next sibling:
+                # get the first next sibling of an ancestor, checking subtree_root 
+                
+                # case where elt is subtree_root, is empty and has no sibling
+                last if( $subtree_root && ($elt == $subtree_root));
+               
+                # backtrack until we find a parent with a next sibling
+                $next_elt= $elt->{parent} || last undef;
+                until( $next_elt->{next_sibling})
+                  { last if( $subtree_root && ($subtree_root == $next_elt));
+                    $next_elt= $next_elt->{parent} || last;
+                  }
+                last if( $subtree_root && ($subtree_root == $next_elt)); 
+                $next_elt= $next_elt->{next_sibling};   
+              }  
+            $elt= $next_elt || last;
+            push @descendants, $elt if( !$cond || ($elt->{gi} eq $ind));
+          }
+      }
+    else
+    # end optimization
+      { # branch for a complex condition: use the regular (slow but simple) way
+        while( $elt= $elt->next_elt( $subtree_root, $cond))
+          { push @descendants, $elt; }
+      }
+    return @descendants;
+  }
+
+ 
+sub descendants_or_self
+  { my( $elt, $cond)= @_;
+    my @descendants= $elt->passes( $cond) ? ($elt) : (); 
+    push @descendants, $elt->descendants( $cond);
+    return @descendants;
+  }
+  
+sub sibling
+  { my $elt= shift;
+    my $nb= shift;
+    if( $nb > 0)
+      { foreach( 1..$nb)
+          { $elt= $elt->next_sibling( @_) or return undef; }
+      }
+    elsif( $nb < 0)
+      { foreach( 1..(-$nb))
+          { $elt= $elt->prev_sibling( @_) or return undef; }
+      }
+    else # $nb == 0
+      { return $elt->passes( $_[0]); }
+    return $elt;
+  }
+
+sub sibling_text
+  { my $elt= sibling( @_);
+    return $elt ? $elt->text : undef;
+  }
+
+
+sub child
+  { my $elt= shift;
+    my $nb= shift;
+    if( $nb >= 0)
+      { $elt= $elt->first_child( @_) or return undef;
+        foreach( 1..$nb)
+          { $elt= $elt->next_sibling( @_) or return undef; }
+      }
+    else
+      { $elt= $elt->last_child( @_) or return undef;
+        foreach( 2..(-$nb))
+          { $elt= $elt->prev_sibling( @_) or return undef; }
+      }
+    return $elt;
+  }
+
+sub prev_siblings
+  { my $elt= shift;
+    my @siblings=();
+    while( $elt= $elt->prev_sibling( @_))
+      { unshift @siblings, $elt; }
+    return @siblings;
+  }
+
+sub pos
+  { my $elt= shift;
+    return 0 if ($_[0] && !$elt->matches( @_));
+    my $pos=1;
+    $pos++ while( $elt= $elt->prev_sibling( @_));
+    return $pos;
+  }
+
+
+sub next_siblings
+  { my $elt= shift;
+    my @siblings=();
+    while( $elt= $elt->next_sibling( @_))
+      { push @siblings, $elt; }
+    return @siblings;
+  }
+
+# used by get_xpath: parses the xpath expression and generates a sub that performs the
+# search
+sub _install_xpath
+  { my( $xpath_exp, $type)= @_;
+    my $original_exp= $xpath_exp;
+    my $sub= 'my $elt= shift; my @results;';
+    
+    # grab the root if expression starts with a /
+    if( $xpath_exp=~ s{^/}{})
+      { $sub .= '@results= ($elt->twig);'; }
+    elsif( $xpath_exp=~ s{^\./}{})
+      { $sub .= '@results= ($elt);'; }
+    else
+      { $sub .= '@results= ($elt);'; }
+
+
+    while( $xpath_exp &&
+           $xpath_exp=~s{^\s*(/?)                            
+                          # the xxx=~/regexp/ is a pain as it includes /  
+                          (\s*((\*|$REG_NAME|\.)\s*)?\[\s*(string\(\s*\)|\@$REG_NAME)\s*$REG_MATCH  
+                            \s*$REG_REGEXP\s*\]\s* 
+                          # or a regular condition, with no / excepts \/
+                          |([^\\/]|\\.)*
+                          )
+                          (/|$)}{}xo)
+
+      { my $wildcard= $1;
+        my $sub_exp= $2; 
+        
+        # grab a parent
+        if( $sub_exp eq '..')
+          { croak "error in xpath expression $original_exp" if( $wildcard);
+            $sub .= '@results= map { $_->{parent}} @results;';
+          }
+    # test the element itself
+    elsif( $sub_exp=~ m{^\.(.*)$}s)
+      { $sub .= "\@results= grep { \$_->matches( q{$1}) } \@results;" }
+        # grab children
+        elsif( $sub_exp=~ m{($REG_NAME_W)?\s*                # * or a gi    ($1)
+                            (?:
+                \[\s*                             #  [
+                  (
+                (?:string\(\s*\)|\@$REG_NAME) #    regexp condition 
+                   \s*$REG_MATCH\s*$REG_REGEXP\s*  # or
+                        |[^\]]*                       #    regular condition 
+                  )
+                            \]                                #   ]
+                             )?\s*$}xs)        
+          { my $gi= $1; 
+            if( !$1 or $1 eq '*') { $gi=''; }
+            my $cond= $2; 
+            if( $cond) { $cond=~ s{^\s*}{}; $cond=~ s{\s*$}{}; }
+            my $function;
+            
+
+            # "special" conditions, that return just one element
+            if( $cond && ($cond =~ m{^((-\s*)?\d+)$}) )
+              { my $offset= $1;
+                $offset-- if( $offset > 0);
+                $function=  $wildcard ? "next_n_elt( $offset, '$gi')" 
+                                      : "child( $offset, '$gi')";
+                $sub .= "\@results= map { \$_->$function } \@results;"
+              }
+            elsif( $cond && ($cond =~ m{^last\s*\(\s*\)$}) )
+              { croak "error in xpath expression $original_exp, cant use // and last()"
+                  if( $wildcard);
+                 $sub .= "\@results= map { \$_->last_child( '$gi') } \@results;";
+              }
+            else
+              { # go down and get the children or descendants
+                unless ( defined $gi)
+                  { if( $wildcard)
+                      { $sub .= '@results= map { $_->descendants  } @results;' }
+                    else
+                      { $sub .= '@results= map { $_->children } @results;'; }
+                  }
+                else
+                  { if( $wildcard)
+                      { $sub .= "\@results= map { \$_->descendants( '$gi')  } \@results;";  }            
+                    else
+                      { $sub .= "\@results= map { \$_->children( '$gi')  } \@results;"; }
+                  } 
+                # now filter using the condition
+                if( $cond)
+                  { my $op='';
+                    my $test="";
+                    do
+                      { if( $op)
+                          { $cond=~ s{^\s*$op\s*}{};
+                            $op= lc( $op);
+                            $test .= $op;
+                          }
+                       if( $cond =~ s{^string\(\s*\)\s*=\s*($REG_STRING)\s*}{}o)  # string()="string" cond
+                          { $test .= "\$_->text eq $1"; 
+                          }
+                       elsif( $cond =~ s{^string\(\s*\)\s*($REG_MATCH)\s*($REG_REGEXP)\s*}{}o)  # string()=~/regex/ cond
+                          { my( $match, $regexp)= ($1, $2);
+                            $test .= "\$_->text $match $regexp"; 
+                          }
+                       elsif( $cond=~ s{^@($REG_NAME)\s*($REG_OP)\s*($REG_STRING|$REG_NUMBER)}{}o)  # @att="val" cond
+                          { my( $att, $oper, $val)= ($1, _op( $2), $3);
+                            $test .= qq{((defined \$_->{'att'}->{"$att"})  && (\$_->{'att'}->{"$att"} $oper $val))};
+                          }
+                       elsif( $cond =~ s{^@($REG_NAME)\s*($REG_MATCH)\s*($REG_REGEXP)\s*}{}o)  # @att=~/regex/ cond XXX
+                          { my( $att, $match, $regexp)= ($1, $2, $3);
+                            $test .= qq{((defined \$_->{'att'}->{"$att"})  && (\$_->{'att'}->{"$att"} $match $regexp))};; 
+                          }
+                       elsif( $cond=~ s{^@($REG_NAME)\s*}{}o)                      # @att cond
+                          { 
+                            $test .= qq{(defined \$_->{'att'}->{"$1"})};
+                          }
+                       elsif( $cond=~ s{^\s*(\d+)\s*}{}o)                          # positive number condition
+                          { 
+                            $test .= qq{(\$_->prev_siblings( \$_->gi) == $1)};
+                          }
+                       elsif( $cond=~ s{^\s*-\s*(\d+)\s*}{}o)                      # negative number condition
+                          { 
+                            $test .= qq{(\$_->next_siblings( \$_->gi) == $1)};
+                          }
+                       } while( ($op)=($cond=~ m{^\s*(and|or)\s*}i));
+                     croak "error in xpath expression $original_exp at $cond" if( $cond);
+                     $sub .= "\@results= grep { $test } \@results;";
+                   }
+              }
+          }
+      }
+
+    if( $xpath_exp)
+      { croak "error in xpath expression $original_exp around $xpath_exp"; }
+      
+    $sub .= "return \@results; ";
+    my $s= eval "sub { $sub }";
+    if( $@) { croak "error in xpath expression $original_exp ($@);" }
+    return( $s); 
+   }
+        
+{ # extremely elaborate caching mechanism
+  my %xpath; # xpath_expression => subroutine_code;  
+  sub get_xpath
+    { my( $elt, $xpath_exp, $offset)= @_;
+      my $sub= ($xpath{$xpath_exp} ||= _install_xpath( $xpath_exp));
+      return $sub->( $elt) unless( defined $offset); 
+      my @res= $sub->( $elt);
+      return $res[$offset];
+    }
+    1; # so the module returns 1 as this is the last BEGIN block in the file
+}
+
+
+sub findvalue
+  { my $elt= shift;
+    return join '', map { $_->text } $elt->get_xpath( @_);
+  }
+
+#end-extract twig_node
+
+
+# XML::XPath compatibility
+sub getElementById     { return $_[0]->twig->elt_id( $_[1]); }
+sub getChildNodes      { my @children= $_[0]->children; return wantarray ? @children : \@children; }
+
+sub _flushed     { return $_[0]->{flushed}; }
+sub _set_flushed { $_[0]->{flushed}=1;      }
+sub _del_flushed { delete $_[0]->{flushed}; }
+
+
+sub cut
+  { my $elt= shift;
+    my( $parent, $prev_sibling, $next_sibling, $last_elt);
+
+    # you can't cut the root, sorry
+    unless( $parent= $elt->{parent}) 
+      { return; }
+    # it we cut the current element then its parent becomes the current elt
+    if( $elt->{twig_current})
+      { my $twig_current= $elt->{parent};
+        my $t= $elt->twig;
+        $t->{twig_current}= $twig_current;
+        $twig_current->{'twig_current'}=1;
+        delete $elt->{'twig_current'};
+      }
+
+    if( $parent->{first_child} == $elt)
+      { $parent->{first_child}=  $elt->{next_sibling};
+        $parent->{empty}= 1 unless( $elt->{next_sibling});
+      }
+    $parent->set_last_child( $elt->{prev_sibling}) 
+      if( $parent->{last_child} == $elt);
+
+    if( $prev_sibling= $elt->{prev_sibling})
+      { $prev_sibling->{next_sibling}=  $elt->{next_sibling}; }
+    if( $next_sibling= $elt->{next_sibling})
+      { $next_sibling->set_prev_sibling( $elt->{prev_sibling}); }
+
+
+    $elt->set_parent( undef);
+    $elt->set_prev_sibling( undef);
+    $elt->{next_sibling}=  undef;
+
+    return $elt;
+  }
+
+sub cut_children
+  { my( $elt, $exp)= @_;
+    my @children= $elt->children( $exp);
+    foreach (@children) { $_->cut; }
+    return @children;
+  }
+
+sub erase
+  { my $elt= shift;
+    #you cannot erase the current element
+    if( $elt->{twig_current})
+      { croak "trying to erase an element before it has been completely parsed"; }
+    unless( $elt->{parent})
+      { # trying to erase the root (of a twig or of a cut/new element)
+        my @children= $elt->children;
+        unless( @children == 1)
+          { croak "can only erase an element with no parent if it has a single child"; }
+        my $child= shift @children;
+        $child->set_parent( undef);
+        my $twig= $elt->twig;
+        $twig->set_root( $child);
+      }
+    else     
+      { # normal case
+        my @children= $elt->children;
+        if( @children)
+          { # elt has children, move them up
+            if( $elt->{prev_sibling})
+              { # connect first child to previous sibling
+                $elt->{first_child}->set_prev_sibling( $elt->{prev_sibling});      
+                $elt->{prev_sibling}->set_next_sibling( $elt->{first_child}); 
+              }
+            else
+              { # elt was the first child
+                $elt->{parent}->set_first_child( $elt->{first_child});
+              }
+            if( $elt->{next_sibling})
+              { # connect last child to next sibling
+                $elt->{last_child}->set_next_sibling( $elt->{next_sibling});      
+                $elt->{next_sibling}->set_prev_sibling( $elt->{last_child}); 
+              }
+            else
+              { # elt was the last child
+                $elt->{parent}->set_last_child( $elt->{last_child});
+              }
+            # update parent for all siblings
+            foreach my $child (@children)
+              { $child->set_parent( $elt->{parent}); }
+            # elt is not referenced any more, so it will be DESTROYed
+            # so we'd better break the links to its children
+            undef $elt->{'first_child'};
+            undef $elt->{'last_child'};
+            undef $elt->{'parent'};
+            undef $elt->{'prev_sibling'};
+            undef $elt->{'next_sibling'};
+          }
+          { # elt had no child, delete it
+             $elt->delete;
+          }
+    
+        return $elt;
+      }
+
+  }
+        
+
+BEGIN
+  { my %method= ( before      => \&paste_before,
+                  after       => \&paste_after,
+                  first_child => \&paste_first_child,
+                  last_child  => \&paste_last_child,
+                  within      => \&paste_within,
+        );
+    
+    # paste elt somewhere around ref
+    # pos can be first_child (default), last_child, before, after or within
+    sub paste
+      { my $elt= shift;
+        if( $elt->{parent}) 
+          { croak "cannot paste an element that belongs to a tree"; }
+        my $pos;
+        my $ref;
+        if( ref $_[0]) 
+          { $pos= 'first_child'; 
+            croak "wrong argument order in paste, should be $_[1] first" if($_[1]); 
+          }
+        else
+          { $pos= shift; }
+
+        if( my $method= $method{$pos})
+          { unless( ref $_[0]) { croak "Destination undefined in paste"; }
+            unless( isa( $_[0], "XML::Twig::Elt"))
+              { croak "wrong argument type in paste, should be XML::Twig::Elt"; }
+            # check here so error message lists the caller file/line
+            if( !$ref->{parent} && ($method=~ m{^(before|after)}) ) { croak "cannot paste $1 root"; }
+            $elt->$method( @_); 
+          }
+        else
+          { croak "tried to paste in wrong position '$pos', allowed positions " . 
+              " are 'first_child', 'last_child', 'before', 'after' and "    .
+              "'within'";
+          }
+        return $elt;
+      }
+  
+
+    sub paste_before
+      { my( $elt, $ref)= @_;
+        my( $parent, $prev_sibling, $next_sibling );
+        unless( $ref->{parent}) { croak "cannot paste before root"; }
+        $parent= $ref->{parent};
+        $prev_sibling= $ref->{prev_sibling};
+        $next_sibling= $ref;
+
+        $elt->set_parent( $parent);
+        $parent->{first_child}=  $elt if( $parent->{first_child} == $ref);
+
+        $prev_sibling->{next_sibling}=  $elt if( $prev_sibling);
+        $elt->set_prev_sibling( $prev_sibling);
+
+        $next_sibling->set_prev_sibling( $elt);
+        $elt->{next_sibling}=  $ref;
+        return $elt;
+      }
+     
+     sub paste_after
+      { my( $elt, $ref)= @_;
+        my( $parent, $prev_sibling, $next_sibling );
+        unless( $ref->{parent}) { croak "cannot paste after root"; }
+        $parent= $ref->{parent};
+        $prev_sibling= $ref;
+        $next_sibling= $ref->{next_sibling};
+
+        $elt->set_parent( $parent);
+        $parent->set_last_child( $elt) if( $parent->{last_child}== $ref);
+
+        $prev_sibling->{next_sibling}=  $elt;
+        $elt->set_prev_sibling( $prev_sibling);
+
+        $next_sibling->set_prev_sibling( $elt) if( $next_sibling);
+        $elt->{next_sibling}=  $next_sibling;
+        return $elt;
+
+      }
+
+    sub paste_first_child
+      { my( $elt, $ref)= @_;
+        my( $parent, $prev_sibling, $next_sibling );
+        $parent= $ref;
+        $next_sibling= $ref->{first_child};
+        delete $ref->{empty};
+
+        $elt->set_parent( $parent);
+        $parent->{first_child}=  $elt;
+        $parent->set_last_child( $elt) unless( $parent->{last_child});
+
+        $elt->set_prev_sibling( undef);
+
+        $next_sibling->set_prev_sibling( $elt) if( $next_sibling);
+        $elt->{next_sibling}=  $next_sibling;
+        return $elt;
+      }
+      
+    sub paste_last_child
+      { my( $elt, $ref)= @_;
+        my( $parent, $prev_sibling, $next_sibling );
+        $parent= $ref;
+        $prev_sibling= $ref->{last_child};
+        delete $ref->{empty};
+
+        $elt->set_parent( $parent);
+        $parent->set_last_child( $elt);
+        $parent->{first_child}=  $elt unless( $parent->{first_child});
+
+        $elt->set_prev_sibling( $prev_sibling);
+        $prev_sibling->{next_sibling}=  $elt if( $prev_sibling);
+
+        $elt->{next_sibling}=  undef;
+        return $elt;
+      }
+
+    sub paste_within
+      { my( $elt, $ref, $offset)= @_;
+        my $text= $ref->is_text ? $ref : $ref->next_elt( '#TEXT', $ref);
+        my $new= $text->split_at( $offset);
+        $elt->paste_before( $new);
+        return $elt;
+      }
+  }
+
+# load an element into a structure similar to XML::Simple's
+sub simplify
+  { my $elt= shift;
+
+    # normalize option names
+    my %options= @_;
+    %options= map { my ($key, $val)= ($_, $options{$_});
+                       $key=~ s{(\w)([A-Z])}{$1_\L$2}g;
+                       $key => $val
+                     } keys %options;
+
+    # check options
+    my @allowed_options= qw( keyattr forcearray noattr content_key
+                             var var_regexp variables var_attr 
+                             erase group_tags forcecontent
+                             normalise_space normalize_space
+                   );
+    my %allowed_options= map { $_ => 1 } @allowed_options;
+    foreach my $option (keys %options)
+      { warn "invalid option $option\n" unless( $allowed_options{$option}); }
+
+    $options{normalise_space} ||= $options{normalize_space} || 0;
+    
+    $options{content_key} ||= 'content';
+    if( $options{content_key}=~ m{^-})
+      { # need to remove the - and to activate extra folding
+        $options{content_key}=~ s{^-}{};
+        $options{extra_folding}= 1;
+      }
+    else
+      { $options{extra_folding}= 0; }
+   
+    $options{forcearray} ||=0; 
+    if( isa( $options{forcearray}, 'ARRAY'))
+      { my %forcearray_tags= map { $_ => 1 } @{$options{forcearray}};
+        $options{forcearray_tags}= \%forcearray_tags;
+        $options{forcearray}= 0;
+      }
+
+    $options{erase}||= $options{group_tags}; # for compat with XML::Simple
+    if( isa( $options{erase}, 'ARRAY'))
+      { my %erase_tags= map { $_ => 1 } @{$options{erase}};
+        $options{erase}= \%erase_tags;
+      }
+
+    $options{keyattr}     ||= ['name', 'key', 'id'];
+    if( ref $options{keyattr} eq 'ARRAY')
+      { foreach my $keyattr (@{$options{keyattr}})
+          { my( $prefix, $att)= ($keyattr=~ m{^([+-])?(.*)});
+            $prefix ||= '';
+            $options{key_for_all}->{$att}= 1;
+            $options{remove_key_for_all}->{$att}=1 unless( $prefix eq '+');
+            $options{prefix_key_for_all}->{$att}=1 if( $prefix eq '-');
+          }
+      }
+    elsif( ref $options{keyattr} eq 'HASH')
+      { while( my( $elt, $keyattr)= each %{$options{keyattr}})
+         { my( $prefix, $att)= ($keyattr=~ m{^([+-])?(.*)});
+           $prefix ||='';
+           $options{key_for_elt}->{$elt}= $att;
+           $options{remove_key_for_elt}->{"$elt#$att"}=1 unless( $prefix);
+           $options{prefix_key_for_elt}->{"$elt#$att"}=1 if( $prefix eq '-');
+         }
+      }
+       
+
+    $options{var}||= $options{var_attr}; # for compat with XML::Simple
+    if( $options{var}) { $options{var_values}= {}; }
+    else               { $options{var}='';         }
+
+    if( $options{variables}) 
+      { $options{var}||= 1;
+        $options{var_values}= $options{variables};
+      }
+
+    if( $options{var_regexp} and !$options{var})
+      { warn "var option not used, var_regexp option ignored\n"; }
+    $options{var_regexp} ||= '\$\{?(\w+)\}?';
+      
+    $elt->_simplify( \%options);
+ 
+ }
+
+sub _simplify
+  { my( $elt, $options)= @_;
+
+    my $data;
+
+    my $gi= $XML::Twig::index2gi[$elt->{'gi'}];
+    my @children= $elt->children;
+    my %atts= $options->{noattr} ? () : %{$elt->atts};
+    my $nb_atts= keys %atts;
+    my $nb_children= $elt->children_count + $nb_atts;
+
+    my %nb_children;
+    foreach (@children)   { $nb_children{$_->tag}++; }
+    foreach (keys %atts)  { $nb_children{$_}++;      }
+
+    my $arrays; # tag => array where elements are stored
+
+
+    # store children
+    foreach my $child (@children)
+      { if( $child->is_text)
+          { # generate with a content key
+            my $text= $elt->_text_with_vars( $options);
+            $text= _normalize_space( $text) if( $options->{normalise_space} >= 2);
+            if(    $options->{force_content}
+                || $nb_atts 
+              )
+              { $data->{$options->{content_key}}= $text; }
+            else
+              { $data= $text; }
+          }
+        else
+          { # element with sub elements
+            my $child_gi= $XML::Twig::index2gi[$child->{'gi'}];
+
+            my $child_data= $child->_simplify( $options);
+
+            # first see if we need to simplify further the child data
+            # because of grouped tags
+            if( my $grouped_tag= $options->{group_tags}->{$child_gi})
+              { # check that the child data is a hash with a single field
+                unless(    (ref( $child_data) eq 'HASH')
+                        && (keys %$child_data == 1)
+                        && defined ( my $grouped_child_data= $child_data->{$grouped_tag})
+                      )
+                  { die "error in grouped tag $child_gi"; }
+                else
+                  { $child_data=  $grouped_child_data; }
+              }
+            # because of extra folding
+            if( $options->{extra_folding})
+              { if(    (ref( $child_data) eq 'HASH')
+                    && (keys %$child_data == 1)
+                    && defined( my $content= $child_data->{$options->{content_key}})
+                  )
+                  { $child_data= $content; }
+              }
+
+
+            if( my $keyatt= $child->_key_attr( $options))
+              { # element with key
+                my $key= $child->{'att'}->{$keyatt};
+                $key= _normalize_space( $key) if( $options->{normalise_space} >= 1);
+                $data->{$child_gi}->{$key}= $child_data;
+              }
+            elsif(      $options->{forcearray}
+                   ||   $options->{forcearray_tags}->{$child_gi}
+                   || ( $nb_children{$child_gi} > 1)
+                 )
+              { # element to store in an array
+                $data->{$child_gi} ||= [];
+                push @{$data->{$child_gi}}, $child_data;
+              }
+            else
+              { # element to store as a hash field
+                $data->{$child_gi}= $child_data;
+              }
+
+          }
+    }
+
+    # store atts
+    # TODO: deal with att that already have an element by that name
+    foreach my $att (keys %atts)
+      { # do not store if the att is a key that needs to be removed
+        if(    $options->{remove_key_for_all}->{$att}
+            || $options->{remove_key_for_elt}->{"$gi#$att"}
+          )
+          { next; }
+
+        my $att_text= _replace_vars_in_text( $atts{$att}, $options);
+        $att_text= _normalize_space( $att_text) if( $options->{normalise_space} >= 2);
+        
+        if(    $options->{prefix_key_for_all}->{$att}
+            || $options->{prefix_key_for_elt}->{"$gi#$att"}
+          )
+          { # prefix the att
+            $data->{"-$att"}= $att_text;
+          } 
+        else
+          { # normal case
+            $data->{$att}= $att_text; 
+          }
+      }
+    
+    return $data;
+  }
+
+sub _key_attr
+  { my( $elt, $options)=@_;
+    return if( $options->{noattr});
+    if( $options->{key_for_all})
+      { foreach my $att ($elt->att_names)
+          { if( $options->{key_for_all}->{$att})
+              { return $att; }
+          }
+      }
+    elsif( $options->{key_for_elt})
+      { if( my $key_for_elt= $options->{key_for_elt}->{$XML::Twig::index2gi[$elt->{'gi'}]} )
+          { return $key_for_elt if( defined( $elt->{'att'}->{$key_for_elt})); }
+      }
+    return;
+  }
+
+sub _text_with_vars
+  { my( $elt, $options)= @_;
+    my $text;
+    if( $options->{var}) 
+      { $text= _replace_vars_in_text( $elt->text, $options); 
+        $elt->_store_var( $options);
+      }
+     else
+      { $text= $elt->text; }
+    return $text;
+  }
+
+
+sub _normalize_space
+  { my $text= shift;
+    $text=~ s{\s+}{ }sg;
+    $text=~ s{^\s}{};
+    $text=~ s{\s$}{};
+    return $text;
+  }
+
+
+sub att_nb
+  { return 0 unless( my $atts= $_[0]->atts);
+    return scalar keys %$atts;
+  }
+    
+sub has_no_atts
+  { return 1 unless( my $atts= $_[0]->atts);
+    return scalar keys %$atts ? 0 : 1;
+ }
+    
+sub _replace_vars_in_text
+  { my( $text, $options)= @_;
+
+    $text=~ s{($options->{var_regexp})}
+             { if( defined( my $value= $options->{var_values}->{$2}))
+                 { $value }
+               else
+                 { warn "unknown variable $2\n";
+                   $1
+                 }
+             }gex;
+    return $text;
+  }
+
+sub _store_var
+  { my( $elt, $options)= @_;
+    if( defined (my $var_name= $elt->{'att'}->{$options->{var}}))
+       { $options->{var_values}->{$var_name}= $elt->text; 
+       }
+  }
+
+
+# split a text element at a given offset
+sub split_at
+  { my( $elt, $offset)= @_;
+    my $text_elt= $elt->is_text ? $elt : $elt->first_child( TEXT) || return '';
+    my $string= $text_elt->text; 
+    my $left_string= substr( $string, 0, $offset);
+    my $right_string= substr( $string, $offset);
+    $text_elt->{pcdata}=  $left_string;
+    my $new_elt= XML::Twig::Elt->new( $XML::Twig::index2gi[$elt->{'gi'}], $right_string);
+    $new_elt->paste( after => $elt);
+    return $new_elt;
+  }
+
+    
+# split an element or its text descendants into several, in place
+# all elements (new and untouched) are returned
+sub split    
+  { my $elt= shift;
+    my @text_chunks;
+    my @result;
+    if( $elt->is_text) { @text_chunks= ($elt); }
+    else               { @text_chunks= $elt->descendants( '#TEXT'); }
+    foreach my $text_chunk (@text_chunks)
+      { push @result, $text_chunk->_split( 1, @_); }
+    return @result;
+  }
+
+# split an element or its text descendants into several, in place
+# created elements (those which match the regexp) are returned
+sub mark
+  { my $elt= shift;
+    my @text_chunks;
+    my @result;
+    if( $elt->is_text) { @text_chunks= ($elt); }
+    else               { @text_chunks= $elt->descendants( '#TEXT'); }
+    foreach my $text_chunk (@text_chunks)
+      { push @result, $text_chunk->_split( 0, @_); }
+    return @result;
+  }
+
+# split a single text element
+# return_all defines what is returned: if it is true 
+# only returns the elements created by matches in the split regexp
+# otherwise all elements (new and untouched) are returned
+
+{ my $encode_is_loaded=0;   # so we only load Encode once in 5.8.0+
+ 
+  sub _split
+    { my $elt= shift;
+      my $return_all= shift;
+      my( $regexp, $tag, $atts)= @_;
+      my @result;                                 # the returned list of elements
+      my $text= $elt->text;
+      my $gi= $XML::Twig::index2gi[$elt->{'gi'}];
+      $tag||= $elt->parent( '#ELT')->gi;          # default: same tag as the current one
+      $atts ||= {};                               # default: no attributes
+  
+      # 2 uses: if split matches then the first substring reuses $elt
+      #         once a split has occured then the last match needs to be put in
+      #         a new element      
+      my $replaced= 0;
+
+      while( $text=~/(.*?)(?:($regexp)|$)/sg)
+        { # $1 is the pre-regexp match
+          # $2 is the string that matches the regexp (if true then the regexp 
+          #    matched, otherwise no match)
+          # $3...$n are captured by the regexp (and should be wrapped in tag)
+          if( defined $2 || $replaced)
+            { # the regexp matched this time ($2) or previously ($replaced)
+              unless( $replaced)
+                { # first match in $elt, re-use $elt for the first sub-string
+                  $elt->set_text( _utf8_ify( $1));
+                  $replaced++;                     # note that there was a match
+                  push @result, $elt if( $return_all);
+                }
+              else
+                { # match, not the first one, create a new text ($gi) element
+                  my $pre_match= _utf8_ify( $1);
+                  my $new_text= XML::Twig::Elt->new( $gi, $pre_match);
+                  $new_text->paste( 'after', $elt); # paste it after $elt
+                  $elt= $new_text;                  # $elt: element to paste after
+                  push @result, $elt if( $return_all);
+                }
+              # now deal with matches captured in the regexp
+              no strict( 'refs');                   # needed to access $3...$n
+              for( my $match_nb=3; defined $$match_nb; $match_nb++)
+                { # create new element, text is the match
+                  my %atts= %$atts; # or the same atts is used for all matches!
+                  my $match= _utf8_ify( $$match_nb);
+                  my $new_text= XML::Twig::Elt->new( $tag, \%atts, $match);
+                  $new_text->paste( 'after', $elt); # paste it after the current
+                  $elt= $new_text;                  # it becomes the current elt
+                  push @result, $elt;
+                }
+            }
+          else
+            { # the regep did not match at all, $elt is not changed
+              push @result, $elt if( $return_all);
+            }
+        } 
+      return @result; # return all elements
+   }
+
+  # evil hack needed in 5.8.0, the utf flag is not set on $<n>...
+  sub _utf8_ify
+    { my $string= shift;
+      if( $] > 5.007 and !keep_encoding()) 
+        { unless( $encode_is_loaded) { require Encode; import Encode; $encode_is_loaded++; }
+          Encode::_utf8_on( $string); # the flag should be set but is not
+        }
+      return $string;
+    }
+
+
+}
+
+{ my %replace_sub; # cache for complex expressions (expression => sub)
+
+  sub subs_text
+    { my( $elt, $regexp, $replace)= @_;
+  
+      my $replacement_string;
+      my $is_string= _is_string( $replace);
+      foreach my $text_elt ($elt->descendants_or_self( '#TEXT'))
+        { if( $is_string)
+            { my $text= $text_elt->text;
+              $text=~ s{$regexp}{ _replace_var( $replace, $1, $2, $3, $4, $5, $6, $7, $8, $9)}egx;
+              $text_elt->set_text( $text);
+           }
+          else
+            { my $replace_sub= ( $replace_sub{$replace} ||= _install_replace_sub( $replace)); 
+              my $text= $text_elt->text;
+              my $pos=0;  # used to skip text that was previously matched
+              while( my( $pre_match_string, $match_string, @var)= ($text=~ m{(.*?)($regexp)}g))
+                { my $match_start  = length( $pre_match_string);
+                  my $match        = $text_elt->split_at( $match_start + $pos);
+                  my $match_length = length( $match_string);
+                  my $post_match   = $match->split_at( $match_length);
+                  $replace_sub->( $match, @var);
+                  # merge previous text with current one
+                  my $next_sibling;
+                  if(    ($next_sibling= $text_elt->{next_sibling})
+                      && ($XML::Twig::index2gi[$text_elt->{'gi'}] eq $XML::Twig::index2gi[$next_sibling->{'gi'}])
+                    )
+                    { $text_elt->merge_text( $next_sibling); }
+                  # go to next 
+                  $text_elt= $post_match;
+                  $text= $post_match->text;
+                  # merge last text element with next one if needed,
+                  # the match will be against the non-matched text,
+                  # so $pos is used to skip the merged part
+                  my $prev_sibling;
+                  if(    ($prev_sibling=  $post_match->{prev_sibling})
+                      && ($XML::Twig::index2gi[$post_match->{'gi'}] eq $XML::Twig::index2gi[$prev_sibling->{'gi'}])
+                    )
+                    { $pos= length( $prev_sibling->text);
+                      $post_match->merge_text(  $prev_sibling);
+                    }
+                }
+            }
+        }
+      return $elt;
+    }
+
+
+  sub _is_string
+    { return ($_[0]=~ m{&e[ln]t}) ? 0: 1 }
+
+  sub _replace_var
+    { my( $string, @var)= @_;
+      unshift @var, undef;
+      $string=~ s{\$(\d)}{$var[$1]}g;
+      return $string;
+    }
+
+  sub _install_replace_sub
+    { my $replace_exp= shift;
+      my @item= split m{(&e[ln]t\s*\([^)]*\))}, $replace_exp;
+      my $sub= q{ my( $match, @var)= @_; unshift @var, undef; my $new; };
+      my( $gi, $exp);
+      foreach my $item (@item)
+        { if(    $item=~ m{^&elt\s*\(([^)]*)\)})
+            { $exp= $1;
+            }
+          elsif( $item=~ m{^&ent\s*\(\s*([^\s)]*)\s*\)})
+            { $exp= " '#ENT' => $1"; }
+          else
+            { $exp= qq{ '#PCDATA' => "$item"}; }
+          $exp=~ s{\$(\d)}{\$var[$1]}g; # replace references to matches
+          $sub.= qq{ \$new= XML::Twig::Elt->new( $exp); };
+          $sub .= q{ $new->paste( before => $match); };
+        }
+      $sub .= q{ $match->delete; };
+      #$sub=~ s/;/;\n/g;
+      my $coderef= eval "sub { $sub }";
+      if( $@) { croak( "invalid replacement expression $replace_exp: ",$@); }
+      return $coderef;
+    }
+
+  }
+
+
+sub merge_text
+  { my( $e1, $e2)= @_;
+    croak "invalid merge: can only merge 2 elements" 
+        unless( isa( $e2, 'XML::Twig::Elt'));
+    croak "invalid merge: can only merge 2 text elements" 
+        unless( $e1->is_text && $e2->is_text && ($e1->gi eq $e2->gi));
+    $e1->set_text( $e1->text . $e2->text);
+    $e2->delete;
+    return $e1;
+  }
+
+
+# recursively copy an element and returns the copy (can be huge and long)
+sub copy
+  { my $elt= shift;
+    my $copy= XML::Twig::Elt->new( $XML::Twig::index2gi[$elt->{'gi'}]);
+
+    $copy->set_extra_data( $elt->extra_data) if( $elt->extra_data);
+    $copy->set_asis                          if( $elt->is_asis);
+    if( ($elt->{'empty'} || 0)) { $copy->{empty}= 1; } # do not swap or speedup will mess up this                         
+
+    if( (exists $elt->{'pcdata'}))
+      { $copy->{pcdata}=  $elt->{pcdata}; }
+    elsif( (exists $elt->{'cdata'}))
+      { $copy->{cdata}=  $elt->{cdata}; }
+    elsif( (exists $elt->{'target'}))
+      { $copy->set_pi( $elt->{target}, $elt->{data}); }
+    elsif( (exists $elt->{'comment'}))
+      { $copy->{comment}=  $elt->{comment}; }
+    elsif( (exists $elt->{'ent'}))
+      { $copy->{ent}=  $elt->{ent}; }
+    else
+      { my @children= $elt->children;
+        if( my $atts= $elt->atts)
+          { my %atts= %{$atts}; # we want to do a real copy of the attributes
+            $copy->set_atts( \%atts);
+          }
+        foreach my $child (@children)
+          { my $child_copy= $child->copy;
+            $child_copy->paste( 'last_child', $copy);
+          }
+      }
+    return $copy;
+  }
+
+sub delete
+  { my $elt= shift;
+    $elt->cut;
+    $elt->DESTROY unless( $XML::Twig::weakrefs);
+    return undef;
+  }
+
+{ my $current_twig;
+  sub DESTROY
+    { my $elt= shift;
+
+      return if( $XML::Twig::weakrefs);
+
+      foreach( @{[$elt->children]}) { $_->XML::Twig::Elt::DESTROY; }
+      # the id reference needs to be destroyed
+      $elt->del_id if( $ID && exists $elt->{att}->{$ID});
+      undef $elt;
+    }
+}
+
+
+# to be called only from a start_tag_handler: ignores the current element
+sub ignore
+  { my $elt= shift;
+    my $t= $elt->twig;
+    $t->ignore( $elt, @_);
+  }
+
+BEGIN {
+  my $pretty=0;
+  my $quote='"';
+  my $INDENT= '  ';
+  my $empty_tag_style= 0;
+  my $keep_encoding= 0;
+  my $expand_external_entities= 0;
+  my $keep_atts_order=0;
+
+  my ($NSGMLS, $NICE, $INDENTED, $INDENTEDC, $RECORD1, $RECORD2)= (1..6);
+
+  my %pretty_print_style=
+    ( none       => 0,          # no added \n
+      nsgmls     => $NSGMLS,    # nsgmls-style, \n in tags
+      # below this line styles are UNSAFE (the generated XML can be invalid)
+      nice       => $NICE,      # \n after open/close tags except when the 
+                                # element starts with text
+      indented   => $INDENTED,  # nice plus idented
+      indented_c => $INDENTEDC, # slightly more compact than indented (closing
+                                # tags are on the same line)
+      record_c   => $RECORD1,   # for record-like data (compact)
+      record     => $RECORD2,   # for record-like data  (not so compact)
+    );
+
+  my ($HTML, $EXPAND)= (1..2);
+  my %empty_tag_style=
+    ( normal => 0,        # <tag/>
+      html   => $HTML,    # <tag />
+      xhtml  => $HTML,    # <tag />
+      expand => $EXPAND,  # <tag></tag>
+    );
+
+  my %quote_style=
+    ( double  => '"',    
+      single  => "'", 
+      # smart  => "smart", 
+    );
+
+  my $xml_space_preserve; # set when an element includes xml:space="preserve"
+
+  my $output_filter;      # filters the entire output (including < and >)
+  my $output_text_filter; # filters only the text part (tag names, attributes, pcdata)
+
+  # returns those pesky "global" variables so you can switch between twigs 
+  sub global_state
+    { return
+       { pretty                    => $pretty,
+         quote                     => $quote,
+         indent                    => $INDENT,
+         empty_tag_style           => $empty_tag_style,
+         keep_encoding             => $keep_encoding,
+         expand_external_entities  => $expand_external_entities,
+         output_filter             => $output_filter,
+         output_text_filter        => $output_text_filter,
+         keep_atts_order           => $keep_atts_order,
+        };
+    }
+
+  # restores the global variables
+  sub set_global_state
+    { my $state= shift;
+      $pretty                   = $state->{pretty};
+      $quote                    = $state->{quote};
+      $INDENT                   = $state->{indent};
+      $empty_tag_style          = $state->{empty_tag_style};
+      $keep_encoding            = $state->{keep_encoding};
+      $expand_external_entities = $state->{expand_external_entities};
+      $output_filter            = $state->{output_filter};
+      $output_text_filter       = $state->{output_text_filter};
+      $keep_atts_order          = $state->{keep_atts_order};
+    }
+
+  # set the pretty_print style (in $pretty) and returns the old one
+  # can be called from outside the package with 2 arguments (elt, style)
+  # or from inside with only one argument (style)
+  # the style can be either a string (one of the keys of %pretty_print_style
+  # or a number (presumably an old value saved)
+  sub set_pretty_print
+    { my $style= lc( defined $_[1] ? $_[1] : $_[0]); # so we cover both cases 
+      my $old_pretty= $pretty;
+      if( $style=~ /^\d+$/)
+        { croak "invalid pretty print style $style"
+        unless( $style < keys %pretty_print_style);
+        $pretty= $style;
+    }
+      else
+        { croak "invalid pretty print style '$style'"
+            unless( exists $pretty_print_style{$style});
+          $pretty= $pretty_print_style{$style};
+    }
+      return $old_pretty;
+    }
+  
+  
+  # set the empty tag style (in $empty_tag_style) and returns the old one
+  # can be called from outside the package with 2 arguments (elt, style)
+  # or from inside with only one argument (style)
+  # the style can be either a string (one of the keys of %empty_tag_style
+  # or a number (presumably an old value saved)
+  sub set_empty_tag_style
+    { my $style= lc( defined $_[1] ? $_[1] : $_[0]); # so we cover both cases 
+      my $old_style= $empty_tag_style;
+      if( $style=~ /^\d+$/)
+        { croak "invalid empty tag style $style"
+        unless( $style < keys %empty_tag_style);
+        $empty_tag_style= $style;
+    }
+      else
+        { croak "invalid empty tag style '$style'"
+            unless( exists $empty_tag_style{$style});
+          $empty_tag_style= $empty_tag_style{$style};
+    }
+      return $old_style;
+    }
+      
+  sub set_quote
+    { my $style= $_[1] || $_[0];
+      my $old_quote= $quote;
+      croak "invalid quote '$style'" unless( exists $quote_style{$style});
+      $quote= $quote_style{$style};
+      return $old_quote;
+    }
+      
+  sub set_indent
+    { my $new_value= defined $_[1] ? $_[1] : $_[0];
+      my $old_value= $INDENT;
+      $INDENT= $new_value;
+      return $old_value;
+    }
+       
+  sub set_keep_encoding
+    { my $new_value= defined $_[1] ? $_[1] : $_[0];
+      my $old_value= $keep_encoding;
+      $keep_encoding= $new_value;
+      return $old_value;
+    
+   }
+
+  sub keep_encoding { return $keep_encoding; } # so I can use elsewhere in the module
+
+  sub output_filter      { return $output_filter; }
+  sub output_text_filter { return $output_text_filter; }
+
+  sub set_output_filter
+    { my $new_value= defined $_[1] ? $_[1] : $_[0]; # can be called in object/non-object mode
+      # if called in object mode with no argument, the filter is undefined
+      if( isa( $new_value, 'XML::Twig::Elt') || isa( $new_value, 'XML::Twig')) { undef $new_value; }
+      my $old_value= $output_filter;
+      if( !$new_value || isa( $new_value, 'CODE') )
+        { $output_filter= $new_value; }
+      elsif( $new_value eq 'latin1')
+        { $output_filter= XML::Twig::latin1();
+        }
+      elsif( $XML::Twig::filter{$new_value})
+        {  $output_filter= $XML::Twig::filter{$new_value}; }
+      else
+        { croak "invalid output filter '$new_value'"; }
+      
+      return $old_value;
+    }
+       
+  sub set_output_text_filter
+    { my $new_value= defined $_[1] ? $_[1] : $_[0]; # can be called in object/non-object mode
+      # if called in object mode with no argument, the filter is undefined
+      if( isa( $new_value, 'XML::Twig::Elt') || isa( $new_value, 'XML::Twig')) { undef $new_value; }
+      my $old_value= $output_text_filter;
+      if( !$new_value || isa( $new_value, 'CODE') )
+        { $output_text_filter= $new_value; }
+      elsif( $new_value eq 'latin1')
+        { $output_text_filter= XML::Twig::latin1();
+        }
+      elsif( $XML::Twig::filter{$new_value})
+        {  $output_text_filter= $XML::Twig::filter{$new_value}; }
+      else
+        { croak "invalid output text filter '$new_value'"; }
+      
+      return $old_value;
+    }
+       
+  sub set_expand_external_entities
+    { my $new_value= defined $_[1] ? $_[1] : $_[0];
+      my $old_value= $expand_external_entities;
+      $expand_external_entities= $new_value;
+      return $old_value;
+    }
+       
+  sub set_keep_atts_order
+    { my $new_value= defined $_[1] ? $_[1] : $_[0];
+      my $old_value= $keep_atts_order;
+      $keep_atts_order= $new_value;
+      return $old_value;
+    
+   }
+
+  sub keep_atts_order { return $keep_atts_order; } # so I can use elsewhere in the module
+
+  # $elt is an element to print
+  # $pretty is an optional value, if true a \n is printed after the <
+
+  my %empty_should_be_expanded= ( script => 1);
+
+  sub start_tag
+    { my $elt= shift;
+  
+      return if( $elt->{gi}<$XML::Twig::SPECIAL_GI);
+
+      my $extra_data= $elt->{extra_data} || '';
+
+      my $gi= $XML::Twig::index2gi[$elt->{'gi'}];
+
+      my $ns_map= $elt->{'att'}->{'#original_gi'};
+      if( $ns_map) { $gi= _restore_original_prefix( $ns_map, $gi); }
+ 
+      if( $output_text_filter) { $gi= $output_text_filter->( $gi); }
+
+      my $tag="<" . $gi;
+  
+      # get the attribute and their values
+      my $att= $elt->atts;
+      if( $att)
+        { foreach my $att_name ( $keep_atts_order ?  keys %{$att} : sort keys %{$att}) 
+           { # skip private attributes (they start with #)
+             next if( (substr( $att_name, 0, 1) eq '#'));
+
+             $tag .=  $pretty==$NSGMLS ? "\n" : ' ';
+
+             my $output_att_name= $ns_map ? _restore_original_prefix( $ns_map, $att_name) : $att_name;
+             if( $output_text_filter) { $output_att_name=  $output_text_filter->( $output_att_name); }
+
+             $tag .= $output_att_name . '=' . $quote . $elt->att_xml_string( $att_name, $quote) . $quote; 
+           }
+        } 
+  
+      $tag .= "\n" if($pretty==$NSGMLS);
+
+      if( $elt->{empty})
+        { if( !$empty_tag_style)
+            { $tag .= "/>";     }
+          elsif( ($empty_tag_style eq $HTML) && ! $empty_should_be_expanded{$XML::Twig::index2gi[$elt->{'gi'}]})
+            { $tag .= " />";  }
+          else #  $empty_tag_style eq $EXPAND
+            { $tag .= "></" . $XML::Twig::index2gi[$elt->{'gi'}] .">";  }
+        }
+      else
+        { $tag .= ">"; }
+
+      if( (substr( $XML::Twig::index2gi[$elt->{'gi'}], 0, 1) eq '#')) { $tag= ''; }
+
+      unless( $pretty) { return $extra_data . $tag  }
+
+      my $prefix='';
+      my $return='';   # '' or \n is to be printed before the tag
+      my $indent=0;    # number of indents before the tag
+
+      if( $pretty==$RECORD1)
+        { my $level= $elt->level;
+          $return= "\n" if( $level < 2);
+          $indent= 1 if( $level == 1);
+        }
+
+     elsif( $pretty==$RECORD2)
+        { $return= "\n";
+          $indent= $elt->level;
+        }
+
+      elsif( $pretty==$NICE)
+        { my $parent= $elt->{parent};
+          unless( !$parent || $parent->{contains_text}) 
+            { $return= "\n"; }
+          $elt->{contains_text}= 1 if( ($parent && $parent->{contains_text})
+                                     || $elt->contains_text);
+        }
+
+      elsif( ($pretty==$INDENTED) || ($pretty==$INDENTEDC))
+        { my $parent= $elt->{parent};
+          unless( !$parent || $parent->{contains_text}) 
+            { $return= "\n"; 
+              $indent= $elt->level; 
+            }
+          $elt->{contains_text}= 1 if( ($parent && $parent->{contains_text})
+                                     || $elt->contains_text);
+        }
+
+      if( $return || $indent)
+        { # check for elements in which spaces should be kept
+          my $t= $elt->twig;
+          return $extra_data . $tag if( $xml_space_preserve);
+          if( $t && $t->{twig_keep_spaces_in})
+            { foreach my $ancestor ($elt->ancestors)
+                { return $extra_data . $tag if( $t->{twig_keep_spaces_in}->{$XML::Twig::index2gi[$ancestor->{'gi'}]}) }
+                }
+        
+              $prefix= $INDENT x $indent;
+              if( $extra_data)
+                { $extra_data=~ s{\s+$}{};
+                  $extra_data= $prefix .  $extra_data . $return;
+                }
+        }
+
+      return $return . $extra_data . $prefix . $tag;
+    }
+  
+  sub end_tag
+    { my $elt= shift;
+      return  '' if( ($elt->{gi}<$XML::Twig::SPECIAL_GI) || ($elt->{'empty'} || 0));
+      my $tag= "<";
+      $tag.= "\n" if($pretty==$NSGMLS);
+
+      my $gi= $XML::Twig::index2gi[$elt->{'gi'}];
+
+      if( my $map= $elt->{'att'}->{'#original_gi'}) { $gi= _restore_original_prefix( $map, $gi); }
+
+      if( $output_text_filter) { $gi= $output_text_filter->( $XML::Twig::index2gi[$elt->{'gi'}]); } 
+      $tag .=  "/$gi>";
+
+      $tag = ($elt->{extra_data_before_end_tag} || '') . $tag;
+
+      if( (substr( $XML::Twig::index2gi[$elt->{'gi'}], 0, 1) eq '#')) { $tag= ''; }
+
+      return $tag unless $pretty;
+
+      my $prefix='';
+      my $return=0;    # 1 if a \n is to be printed before the tag
+      my $indent=0;    # number of indents before the tag
+
+      if( $pretty==$RECORD1)
+        { $return= 1 if( $elt->level == 0);
+        }
+
+     elsif( $pretty==$RECORD2)
+        { unless( $elt->contains_text)
+            { $return= 1 ;
+              $indent= $elt->level;
+            }
+        }
+
+      elsif( $pretty==$NICE)
+        { my $parent= $elt->{parent};
+          if( (    ($parent && !$parent->{contains_text}) || !$parent )
+            && ( !$elt->{contains_text}  
+             && ($elt->{has_flushed_child} || $elt->_first_child())           
+           )
+         )
+            { $return= 1; }
+        }
+
+      elsif( $pretty==$INDENTED)
+        { my $parent= $elt->{parent};
+          if( (    ($parent && !$parent->{contains_text}) || !$parent )
+            && ( !$elt->{contains_text}  
+             && ($elt->{has_flushed_child} || $elt->_first_child())           
+           )
+         )
+            { $return= 1; 
+              $indent= $elt->level; 
+            }
+        }
+
+      if( $return || $indent)
+        { # check for elements in which spaces should be kept
+          my $t= $elt->twig;
+          return $tag if( $xml_space_preserve);
+          if( $t && $t->{twig_keep_spaces_in})
+            { foreach my $ancestor ($elt, $elt->ancestors)
+                { return $tag if( $t->{twig_keep_spaces_in}->{$XML::Twig::index2gi[$ancestor->{'gi'}]}) }
+            }
+      
+          $prefix= "\n" if( $return);
+          $prefix.= $INDENT x $indent;
+    }
+
+      # add a \n at the end of the document (after the root element)
+      $tag .= "\n" unless( $elt->{parent});
+  
+      return $prefix . $tag;
+    }
+
+  sub _restore_original_prefix
+    { my( $map, $name)= @_;
+      my $prefix= _ns_prefix( $name);
+      if( my $original_prefix= $map->{$prefix})
+        { if( $original_prefix eq '#default')
+            { $name=~ s{^$prefix:}{}; }
+          else
+            { $name=~ s{^$prefix(?=:)}{$original_prefix}; }
+        }
+      return $name;
+    }
+
+  # $elt is an element to print
+  # $fh is an optional filehandle to print to
+  # $pretty is an optional value, if true a \n is printed after the < of the
+  # opening tag
+  sub print
+    { my $elt= shift;
+  
+      my $pretty;
+      my $fh= _is_fh( $_[0]) ? shift : undef;
+      my $old_select= defined $fh ? select $fh : undef;
+      my $old_pretty= defined ($pretty= shift) ? set_pretty_print( $pretty) : undef;
+
+      $xml_space_preserve= 1 if( ($elt->inherit_att( 'xml:space') || '') eq 'preserve');
+ 
+      #$elt->_print;
+      print $elt->_sprint;
+
+      $xml_space_preserve= 0;
+    
+      select $old_select if( defined $old_select);
+      set_pretty_print( $old_pretty) if( defined $old_pretty);
+    }
+      
+  
+  # same as output but does not output the start tag if the element
+  # is marked as flushed
+  sub flush
+    { my $elt= shift;
+      $elt->twig->flush( @_);
+    }
+  
+  sub _flush
+    { my $elt= shift;
+  
+      my $pretty;
+      my $fh=  _is_fh( $_[0]) ? shift : undef;
+      my $old_select= defined $fh ? select $fh : undef;
+      my $old_pretty= defined ($pretty= shift) ? set_pretty_print( $pretty) : undef;
+
+      $xml_space_preserve= 1 if( ($elt->inherit_att( 'xml:space') || '') eq 'preserve');
+
+      $elt->__flush();
+
+      $xml_space_preserve= 0;
+
+      select $old_select if( defined $old_select);
+      set_pretty_print( $old_pretty) if( defined $old_pretty);
+    }
+
+  sub __flush
+    { my $elt= shift;
+  
+      # in case there's some comments or PI's piggybacking
+      #if( $elt->{extra_data})
+      #  { print $output_filter ? $output_filter->($elt->{extra_data}) 
+      #                         : $elt->{extra_data};
+      #  }
+
+      if( $elt->{gi} >= $XML::Twig::SPECIAL_GI)
+        { my $preserve= ($elt->{'att'}->{'xml:space'} || '') eq 'preserve';
+          $xml_space_preserve++ if $preserve;
+          unless( $elt->_flushed)
+            { print $elt->start_tag();
+            }
+      
+          # flush the children
+          my @children= $elt->children;
+          foreach my $child (@children)
+            { $child->_flush( $pretty); 
+        }
+          print $elt->end_tag;
+          $xml_space_preserve-- if $preserve;
+          # used for pretty printing
+          if( my $parent= $elt->{parent}) { $parent->{has_flushed_child}= 1; }
+        }
+      else # text or special element
+        { my $text;
+          if( (exists $elt->{'pcdata'}))     { $text= $elt->pcdata_xml_string; 
+                                     if( my $parent= $elt->{parent}) 
+                                       { $parent->{contains_text}= 1; }
+                                   }
+          elsif( (exists $elt->{'cdata'}))   { $text= $elt->cdata_string;        
+                                     if( my $parent= $elt->{parent}) 
+                                       { $parent->{contains_text}= 1; }
+                                   }
+          elsif( (exists $elt->{'target'}))      { $text= $elt->pi_string;          }
+          elsif( (exists $elt->{'comment'})) { $text= $elt->comment_string;     }
+          elsif( (exists $elt->{'ent'}))     { $text= $elt->ent_string;         }
+
+          print $output_filter ? $output_filter->( $text) : $text;
+        }
+    }
+  
+
+  sub xml_text
+    { my $elt= shift;
+      my $string='';
+
+      if( $elt->{gi} >= $XML::Twig::SPECIAL_GI)
+        { # sprint the children
+          my $child= $elt->{first_child}||'';
+          while( $child)
+            { $string.= $child->xml_text;
+              $child= $child->{next_sibling};
+            }
+        }
+      elsif( (exists $elt->{'pcdata'}))  { $string .= $output_filter ?  $output_filter->($elt->pcdata_xml_string) 
+                                                           : $elt->pcdata_xml_string; 
+                               }
+      elsif( (exists $elt->{'cdata'}))   { $string .= $output_filter ?  $output_filter->($elt->cdata_xml_string)  
+                                                           : $elt->cdata_string;      
+                               }
+      elsif( (exists $elt->{'ent'}))     { $string .= $elt->ent_string; }
+
+      return $string;
+    }
+
+
+  # same as print but except... it does not print but rather returns the string
+  # if the second parameter is set then only the content is returned, not the
+  # start and end tags of the element (but the tags of the included elements are
+  # returned)
+  sub sprint
+    { my $elt= shift;
+
+      $xml_space_preserve= 1 if( ($elt->inherit_att( 'xml:space') || '') eq 'preserve');
+
+      my $sprint= $output_filter ? $output_filter->( $elt->_sprint( @_)) : $elt->_sprint( @_);
+
+      $xml_space_preserve= 0;
+
+      return $sprint;
+
+    }
+  
+  sub _sprint
+    { my $elt= shift;
+      my $no_tag= shift || 0;
+      # in case there's some comments or PI's piggybacking
+      my $string='';
+      #if( $elt->{extra_data} && !$no_tag)
+      #  { $string= $elt->{extra_data};
+      #  }
+
+      if( $elt->{gi} >= $XML::Twig::SPECIAL_GI)
+        {
+          my $preserve= ($elt->{'att'}->{'xml:space'} || '') eq 'preserve';
+          $xml_space_preserve++ if $preserve;
+
+          $string.= $elt->start_tag unless( $no_tag);
+      
+          # sprint the children
+          my $child= $elt->{first_child}||'';
+          while( $child)
+            { $string.= $child->_sprint;
+              $child= $child->{next_sibling};
+            }
+          $string.= $elt->end_tag unless( $no_tag);
+          $xml_space_preserve-- if $preserve;
+        }
+      else
+        { $string .= $elt->{extra_data} || '';
+             if( (exists $elt->{'pcdata'}))  { $string .= $elt->pcdata_xml_string; }
+          elsif( (exists $elt->{'cdata'}))   { $string .= $elt->cdata_string;      }
+          elsif( (exists $elt->{'target'}))      { $string .= $elt->pi_string;         }
+          elsif( (exists $elt->{'comment'})) { $string .= $elt->comment_string;    }
+          elsif( (exists $elt->{'ent'}))     { $string .= $elt->ent_string;        }
+        }
+
+      return $string;
+    }
+
+  # just a shortcut to $elt->sprint( 1)
+  sub xml_string
+    { $_[0]->sprint( 1); }
+
+  sub pcdata_xml_string 
+    { my $string='';
+      if( defined( $string= $_[0]->{pcdata}) )
+        { $string=~ s/([&<])/$XML::Twig::base_ent{$1}/g
+            unless( $keep_encoding || $_[0]->{asis}); 
+        }
+      return $output_text_filter ? $output_text_filter->( $string) : $string;
+    }
+  
+  sub att_xml_string 
+    { my $elt= shift;
+      my $att= shift;
+      my $quote= shift || '"';
+      my $string='';
+      if( defined ($string= $elt->{att}->{$att}))
+        { $string=~ s/([$quote<&])/$XML::Twig::base_ent{$1}/g
+            unless( $keep_encoding); 
+        }
+      return $output_text_filter ? $output_text_filter->( $string) : $string;
+    }
+
+  sub ent_string 
+    { my $ent= shift;
+      my $ent_text= $ent->{ent};
+      my( $t, $el, $ent_string);
+      if(    $expand_external_entities
+          && ($t= $ent->twig) 
+          && ($el= $t->entity_list)
+          && ($ent_string= $el->{$ent->ent_name}->{val})
+        )
+       { return $ent_string; }
+  
+       return $ent_text; 
+    }
+
+  # returns just the text, no tags, for an element
+  sub text
+    { my $elt= shift;
+      my $string;
+  
+      if( (exists $elt->{'pcdata'}))     { return  $elt->{pcdata};   }
+      elsif( (exists $elt->{'cdata'}))   { return  $elt->{cdata};    }
+      elsif( (exists $elt->{'target'}))      { return  $elt->pi_string;}
+      elsif( (exists $elt->{'comment'})) { return  $elt->{comment};  }
+      elsif( (exists $elt->{'ent'}))     { return  $elt->{ent} ;     }
+  
+      my $child= $elt->{first_child} ||'';
+      while( $child)
+        { $string.= defined($child->text) ? $child->text : '';
+          $child= $child->{next_sibling};
+        }
+      unless( defined $string) { $string=''; }
+  
+      return $output_text_filter ? $output_text_filter->( $string) : $string;
+    }
+
+  sub trimmed_text
+    { my $elt= shift;
+      my $text= $elt->text;
+      $text=~ s{\s+}{ }sg;
+      $text=~ s{^\s*}{};
+      $text=~ s{\s*$}{};
+      return $text;
+    }
+
+  # remove cdata sections (turns them into regular pcdata) in an element 
+  sub remove_cdata 
+    { my $elt= shift;
+      foreach my $cdata ($elt->descendants_or_self( CDATA))
+        { if( $keep_encoding)
+            { my $data= $cdata->{cdata};
+              $data=~ s{([&<"'])}{$XML::Twig::base_ent{$1}}g;
+              $cdata->{pcdata}=  $data;
+            }
+          else
+            { $cdata->{pcdata}=  $cdata->{cdata}; }
+          $cdata->set_gi( PCDATA);
+          undef $cdata->{cdata};
+        }
+    }
+
+sub _is_private      { return _is_private_name( $_[0]->gi); }
+sub _is_private_name { return $_[0]=~ m{^#};                }
+
+
+} # end of block containing package globals ($pretty_print, $quotes, keep_encoding...)
+
+
+# SAX export methods
+sub toSAX1
+  { _toSAX(@_, \&_start_tag_data_SAX1, \&_end_tag_data_SAX1); }
+
+sub toSAX2
+  { _toSAX(@_, \&_start_tag_data_SAX2, \&_end_tag_data_SAX2); }
+
+sub _toSAX
+  { my( $elt, $handler, $start_tag_data, $end_tag_data)= @_;
+    if( $elt->{gi} >= $XML::Twig::SPECIAL_GI)
+      { my $data= $start_tag_data->( $elt);
+        _start_prefix_mapping( $elt, $handler, $data);
+        if( $data && (my $start_element = $handler->can( 'start_element')))
+          { $start_element->( $handler, $data) unless( $elt->_flushed); }
+      
+        foreach my $child ($elt->children)
+          { $child->_toSAX( $handler, $start_tag_data, $end_tag_data); }
+
+        if( (my $data= $end_tag_data->( $elt)) && (my $end_element = $handler->can( 'end_element')) )
+          { $end_element->( $handler, $data); }
+        _end_prefix_mapping( $elt, $handler);
+      }
+    else # text or special element
+      { if( (exists $elt->{'pcdata'}) && (my $characters= $handler->can( 'characters')))
+          { $characters->( $handler, { Data => $elt->{pcdata} });  }
+        elsif( (exists $elt->{'cdata'}))  
+          { if( my $start_cdata= $handler->can( 'start_cdata'))
+              { $start_cdata->( $handler); }
+            if( my $characters= $handler->can( 'characters'))
+              { $characters->( $handler, {Data => $elt->{cdata} });  }
+            if( my $end_cdata= $handler->can( 'end_cdata'))
+              { $end_cdata->( $handler); }
+          }
+        elsif( ((exists $elt->{'target'}))  && (my $pi= $handler->can( 'processing_instruction')))
+          { $pi->( $handler, { Target =>$elt->{target}, Data => $elt->{data} });  }
+        elsif( ((exists $elt->{'comment'}))  && (my $comment= $handler->can( 'comment')))
+          { $comment->( $handler, { Data => $elt->{comment} });  }
+        elsif( ((exists $elt->{'ent'})))
+          { 
+            if( my $se=   $handler->can( 'skipped_entity'))
+              { $se->( $handler, { Name => $elt->ent_name });  }
+            elsif( my $characters= $handler->can( 'characters'))
+              { if( defined $elt->ent_string)
+                  { $characters->( $handler, {Data => $elt->ent_string});  }
+                else
+                  { $characters->( $handler, {Data => $elt->ent_name});  }
+              }
+          }
+      
+      }
+  }
+  
+sub _start_tag_data_SAX1
+  { my( $elt)= @_;
+    my $name= $XML::Twig::index2gi[$elt->{'gi'}];
+    return if( (substr( $XML::Twig::index2gi[$elt->{'gi'}], 0, 1) eq '#'));
+    my $attributes={};
+    my $atts= $elt->atts;
+    while( my( $att, $value)= each %$atts)
+      { $attributes->{$att}= $value unless( (substr( $att, 0, 1) eq '#')); }
+    my $data= { Name => $name, Attributes => $attributes};
+    return $data;
+  }
+
+sub _end_tag_data_SAX1
+  { my( $elt)= @_;
+    return if( (substr( $XML::Twig::index2gi[$elt->{'gi'}], 0, 1) eq '#'));
+    return  { Name => $XML::Twig::index2gi[$elt->{'gi'}] };
+  } 
+  
+sub _start_tag_data_SAX2
+  { my( $elt)= @_;
+    my $data={};
+    
+    my $name= $XML::Twig::index2gi[$elt->{'gi'}];
+    return if( (substr( $XML::Twig::index2gi[$elt->{'gi'}], 0, 1) eq '#'));
+    $data->{Name}         = $name;
+    $data->{Prefix}       = $elt->ns_prefix; 
+    $data->{LocalName}    = $elt->local_name;
+    $data->{NamespaceURI} = $elt->namespace;
+
+    # save a copy of the data so we can re-use it for the end tag
+    my %sax2_data= %$data;
+    $elt->{twig_elt_SAX2_data}= \%sax2_data;
+   
+    # add the attributes
+    $data->{Attributes}= $elt->_atts_to_SAX2;
+
+    return $data;
+  }
+
+sub _atts_to_SAX2
+  { my $elt= shift;
+    my $SAX2_atts= {};
+    foreach my $att (keys %{$elt->atts})
+      { 
+        next if( (substr( $att, 0, 1) eq '#'));
+        my $SAX2_att={};
+        $SAX2_att->{Name}         = $att;
+        $SAX2_att->{Prefix}       = _ns_prefix( $att); 
+        $SAX2_att->{LocalName}    = _local_name( $att);
+        $SAX2_att->{NamespaceURI} = $elt->namespace( $SAX2_att->{Prefix});
+        $SAX2_att->{Value}        = $elt->{'att'}->{$att};
+        my $SAX2_att_name= "{$SAX2_att->{NamespaceURI}}$SAX2_att->{LocalName}";
+
+        $SAX2_atts->{$SAX2_att_name}= $SAX2_att;
+      }
+    return $SAX2_atts;
+  }
+
+sub _start_prefix_mapping
+  { my( $elt, $handler, $data)= @_;
+    if( my $start_prefix_mapping= $handler->can( 'start_prefix_mapping')
+        and my @new_prefix_mappings= grep { /^\{[^}]*\}xmlns/ || /^\{$XMLNS_URI\}/ } keys %{$data->{Attributes}}
+      )
+      { foreach my $prefix (@new_prefix_mappings)
+          { my $prefix_string= $data->{Attributes}->{$prefix}->{LocalName};
+            if( $prefix_string eq 'xmlns') { $prefix_string=''; }
+            my $prefix_data=
+              {  Prefix       => $prefix_string,
+                 NamespaceURI => $data->{Attributes}->{$prefix}->{Value}
+              };
+            $start_prefix_mapping->( $handler, $prefix_data);
+            $elt->{twig_end_prefix_mapping} ||= [];
+            push @{$elt->{twig_end_prefix_mapping}}, $prefix_string;
+          }
+      }
+  }
+
+sub _end_prefix_mapping
+  { my( $elt, $handler)= @_;
+    if( my $end_prefix_mapping= $handler->can( 'end_prefix_mapping'))
+      { foreach my $prefix (@{$elt->{twig_end_prefix_mapping}})
+          { $end_prefix_mapping->( $handler, { Prefix => $prefix} ); }
+      }
+  }
+             
+sub _end_tag_data_SAX2
+  { my( $elt)= @_;
+    return if( (substr( $XML::Twig::index2gi[$elt->{'gi'}], 0, 1) eq '#'));
+    return $elt->{twig_elt_SAX2_data};
+  } 
+
+
+
+#start-extract twig_node
+sub contains_text
+  { my $elt= shift;
+    my $child= $elt->{first_child};
+    while ($child)
+      { return 1 if( $child->is_text || (exists $child->{'ent'})); 
+        $child= $child->{next_sibling};
+      }
+    return 0;
+  }
+
+#end-extract twig_node
+
+# creates a single pcdata element containing the text as child of the element
+# options: 
+#   - force_pcdata: when set to a true value forces the text to be in a#PCDATA
+#                   even if the original element was a #CDATA
+sub set_text
+  { my( $elt, $string, %option)= @_;
+
+    if( $XML::Twig::index2gi[$elt->{'gi'}] eq PCDATA) 
+      { return $elt->{pcdata}=  $string; }
+    elsif( $XML::Twig::index2gi[$elt->{'gi'}] eq CDATA)  
+      { if( $option{force_pcdata})
+          { $elt->set_gi( PCDATA);
+            $elt->{cdata}= '';
+            return $elt->{pcdata}=  $string;
+      }
+    else
+      { return $elt->{cdata}=  $string; }
+      }
+
+    foreach my $child (@{[$elt->children]})
+      { $child->delete; }
+
+    my $pcdata= XML::Twig::Elt->new( PCDATA, $string);
+    $pcdata->paste( $elt);
+
+    delete $elt->{empty};
+
+    return $elt;
+  }
+
+# set the content of an element from a list of strings and elements
+sub set_content
+  { my $elt= shift;
+
+    return $elt unless defined $_[0];
+
+    # attributes can be given as a hash (passed by ref)
+    if( ref $_[0] eq 'HASH')
+      { my $atts= shift;
+        $elt->del_atts; # usually useless but better safe than sorry
+        $elt->set_atts( $atts);
+        return  $elt unless defined $_[0];
+      }
+
+    # check next argument for #EMPTY
+    if( !(ref $_[0]) && ($_[0] eq EMPTY) ) 
+      { $elt->{empty}= 1; return $elt; }
+
+    # case where we really want to do a set_text, the element is '#PCDATA'
+    # and we only want to add text in it
+    if( ($XML::Twig::index2gi[$elt->{'gi'}] eq PCDATA) && ($#_ == 0) && !( ref $_[0]))
+      { $elt->{pcdata}=  $_[0];
+        return $elt;
+      }
+    elsif( ($XML::Twig::index2gi[$elt->{'gi'}] eq CDATA) && ($#_ == 0) && !( ref $_[0]))
+      { $elt->{cdata}=  $_[0];
+        return $elt;
+      }
+
+    # delete the children
+    # WARNING: potential problem here if the children are used
+    # somewhere else (where?). Will be solved when I use weak refs
+    foreach my $child (@{[$elt->children]})
+      { $child->delete; }
+
+    foreach my $child (@_)
+      { if( isa( $child, 'XML::Twig::Elt'))
+          { # argument is an element
+            $child->paste( 'last_child', $elt);
+          }
+        else
+          { # argument is a string
+            if( (my $pcdata= $elt->{last_child}) && $elt->{last_child}->is_pcdata)
+              { # previous child is also pcdata: just concatenate
+                $pcdata->{pcdata}=  $pcdata->{pcdata} . $child 
+              }
+            else
+              { # previous child is not a string: creat a new pcdata element
+                $pcdata= XML::Twig::Elt->new( PCDATA, $child);
+                $pcdata->paste( 'last_child', $elt);  
+              }
+          }
+      }
+
+    delete $elt->{empty};
+
+    return $elt;
+  }
+
+# inserts an element (whose gi is given) as child of the element
+# all children of the element are now children of the new element
+# returns the new element
+sub insert
+  { my ($elt, @args)= @_;
+    # first cut the children
+    my @children= $elt->children;
+    foreach my $child (@children)
+      { $child->cut; }
+    # insert elements
+    while( my $gi= shift @args)
+      { my $new_elt= XML::Twig::Elt->new( $gi);
+        # add attributes if needed
+        if( defined( $args[0]) && ( isa( $args[0], 'HASH')) )
+          { $new_elt->set_atts( shift @args); }
+        # paste the element
+        $new_elt->paste( $elt);
+        delete $elt->{empty};
+        $elt= $new_elt;
+      }
+    # paste back the children
+    foreach my $child (@children)
+      { $child->paste( 'last_child', $elt); }
+    return $elt;
+  }
+
+# insert a new element 
+# $elt->insert_new_element( $opt_position, $gi, $opt_atts_hash, @opt_content); 
+# the element is created with the same syntax as new
+# position is the same as in paste, first_child by default
+sub insert_new_elt
+  { my $elt= shift;
+    my $position= $_[0];
+    if(     ($position eq 'before') || ($position eq 'after')
+         || ($position eq 'first_child') || ($position eq 'last_child'))
+      { shift; }
+    else
+      { $position= 'first_child'; }
+
+    my $new_elt= $elt->new( @_);
+    $new_elt->paste( $position, $elt);
+    return $new_elt;
+  }
+
+# wraps an element in elements which gi's are given as arguments
+# $elt->wrap_in( 'td', 'tr', 'table') wraps the element as a single
+# cell in a table for example
+# returns the new element
+sub wrap_in
+  { my $elt= shift;
+    while( my $gi = shift @_)
+      { my $new_elt = XML::Twig::Elt->new( $gi);
+        if( $elt->{twig_current})
+          { my $t= $elt->twig;
+            $t->{twig_current}= $new_elt;
+            delete $elt->{'twig_current'};
+            $new_elt->{'twig_current'}=1;
+          }
+
+        if( my $parent= $elt->{parent})
+          { $new_elt->set_parent( $parent); 
+            $parent->{first_child}=  $new_elt if( $parent->{first_child} == $elt);
+            $parent->set_last_child( $new_elt)  if( $parent->{last_child} == $elt);
+          }
+        else
+          { # wrapping the root
+            my $twig= $elt->twig;
+            if( $twig && $twig->root && ($twig->root eq $elt) )
+              { $twig->{twig_root}= $new_elt; }
+          }
+
+        if( my $prev_sibling= $elt->{prev_sibling})
+          { $new_elt->set_prev_sibling( $prev_sibling);
+            $prev_sibling->{next_sibling}=  $new_elt;
+          }
+
+        if( my $next_sibling= $elt->{next_sibling})
+          { $new_elt->{next_sibling}=  $next_sibling;
+            $next_sibling->set_prev_sibling( $new_elt);
+          }
+        $new_elt->{first_child}=  $elt;
+        $new_elt->set_last_child( $elt);
+
+        $elt->set_parent( $new_elt);
+        $elt->set_prev_sibling( undef);
+        $elt->{next_sibling}=  undef;
+
+        # add the attributes if the next argument is a hash ref
+        if( defined( $_[0]) && (isa( $_[0], 'HASH')) )
+          { $new_elt->set_atts( shift @_); }
+
+        $elt= $new_elt;
+      }
+      
+    return $elt;
+  }
+
+sub replace
+  { my( $elt, $ref)= @_;
+    if( my $parent= $ref->{parent})
+      { $elt->set_parent( $parent);
+        $parent->{first_child}=  $elt if( $parent->{first_child} == $ref);
+        $parent->set_last_child( $elt)  if( $parent->{last_child} == $ref);
+      }
+    if( my $prev_sibling= $ref->{prev_sibling})
+      { $elt->set_prev_sibling( $prev_sibling);
+        $prev_sibling->{next_sibling}=  $elt;
+      }
+    if( my $next_sibling= $ref->{next_sibling})
+      { $elt->{next_sibling}=  $next_sibling;
+        $next_sibling->set_prev_sibling( $elt);
+      }
+   
+    $ref->set_parent( undef);
+    $ref->set_prev_sibling( undef);
+    $ref->{next_sibling}=  undef;
+    return $ref;
+  }
+
+sub replace_with
+  { my $ref= shift;
+    my $elt= shift;
+    $elt->replace( $ref);
+    foreach my $new_elt (reverse @_)
+      { $new_elt->paste( after => $elt); }
+    return $elt;
+  }
+
+
+#start-extract twig_node
+# move an element, same syntax as paste, except the element is first cut
+sub move
+  { my $elt= shift;
+    $elt->cut;
+    $elt->paste( @_);
+    return $elt;
+  }
+#end-extract twig_node
+
+
+# adds a prefix to an element, creating a pcdata child if needed
+sub prefix
+  { my ($elt, $prefix, $option)= @_;
+    my $asis= ($option && ($option eq 'asis')) ? 1 : 0;
+    if( (exists $elt->{'pcdata'}) 
+        && (($asis && $elt->{asis}) || (!$asis && ! $elt->{asis}))
+      )
+      { $elt->{pcdata}=  $prefix . $elt->{pcdata}; }
+    elsif( $elt->{first_child} && $elt->{first_child}->is_pcdata
+        && (   ($asis && $elt->{first_child}->{asis}) 
+            || (!$asis && ! $elt->{first_child}->{asis}))
+         )
+      { $elt->{first_child}->set_pcdata( $prefix . $elt->{first_child}->pcdata); }
+    else
+      { my $new_elt= XML::Twig::Elt->new( PCDATA, $prefix);
+        $new_elt->paste( $elt);
+        $new_elt->set_asis if( $asis);
+      }
+    return $elt;
+  }
+
+# adds a suffix to an element, creating a pcdata child if needed
+sub suffix
+  { my ($elt, $suffix, $option)= @_;
+    my $asis= ($option && ($option eq 'asis')) ? 1 : 0;
+    if( (exists $elt->{'pcdata'})
+        && (($asis && $elt->{asis}) || (!$asis && ! $elt->{asis}))
+      )
+      { $elt->{pcdata}=  $elt->{pcdata} . $suffix; }
+    elsif( $elt->{last_child} && $elt->{last_child}->is_pcdata
+        && (   ($asis && $elt->{last_child}->{asis}) 
+            || (!$asis && ! $elt->{last_child}->{asis}))
+         )
+      { $elt->{last_child}->set_pcdata( $elt->{last_child}->pcdata . $suffix); }
+    else
+      { my $new_elt= XML::Twig::Elt->new( PCDATA, $suffix);
+        $new_elt->paste( 'last_child', $elt);
+        $new_elt->set_asis if( $asis);
+      }
+    return $elt;
+  }
+
+#start-extract twig_node
+# create a path to an element ('/root/.../gi)
+sub path
+  { my $elt= shift;
+    my @context= ( $elt, $elt->ancestors);
+    return "/" . join( "/", reverse map {$_->gi} @context);
+  }
+
+sub xpath
+  { my $elt= shift;
+    my $xpath;
+    foreach my $ancestor (reverse $elt->ancestors_or_self)
+      { my $gi= $XML::Twig::index2gi[$ancestor->{'gi'}];
+        $xpath.= "/$gi";
+        my $index= $ancestor->prev_siblings( $gi) + 1;
+        unless( ($index == 1) && !$ancestor->next_sibling( $gi))
+          { $xpath.= "[$index]"; }
+      }
+    return $xpath;
+  }
+
+# methods used mainly by wrap_children
+
+# return a string with the 
+# for an element <foo><elt att="val">...</elt><elt2/><elt>...</elt></foo>
+# returns '<elt att="val"><elt2><elt>'
+sub _stringify_struct
+  { my( $elt, %opt)= @_;
+    my $string;
+    my $pretty_print= XML::Twig::Elt::set_pretty_print( 'none');
+    foreach my $child ($elt->children)
+      { $child->add_id; $string .= $child->start_tag; }
+    XML::Twig::Elt::set_pretty_print( $pretty_print);
+    return $string;
+  }
+
+# wrap a series of elements in a new one
+sub _wrap_range
+  { my $elt= shift;
+    my $gi= shift;
+    my $atts= isa( $_[0], 'HASH') ? shift : undef;
+    my $range= shift; # the string with the tags to wrap
+
+    my $t= $elt->twig;
+
+    # get the tags to wrap
+    my @to_wrap;
+    while( $range=~ m{<\w+\s+[^>]*id=("[^"]*"|'[^']*')[^>]*>}g)
+      { push @to_wrap, $t->elt_id( substr( $1, 1, -1)); }
+
+    return '' unless @to_wrap;
+    
+    my $to_wrap= shift @to_wrap;
+    my %atts= %$atts;
+    my $new_elt= $to_wrap->wrap_in( $gi, \%atts);
+    $_->move( last_child => $new_elt) foreach (@to_wrap);
+
+    return '';
+  }
+    
+# wrap children matching a regexp in a new element
+sub wrap_children
+  { my( $elt, $regexp, $gi, $atts)= @_;
+
+    $atts ||={};
+
+    my $elt_as_string= $elt->_stringify_struct; # stringify the elt structure
+    $regexp=~ s{(<[^>]*>)}{_match_expr( $1)}eg; # in the regexp, replace gi's by the proper regexp 
+    $elt_as_string=~ s{($regexp)}{$elt->_wrap_range( $gi, $atts, $1)}eg; # then do the actual replace
+  
+    return $elt; 
+  }
+
+sub _match_expr
+  { my $tag= shift;
+    my( $gi, %atts)= XML::Twig::_parse_start_tag( $tag);
+    return _match_tag( $gi, %atts);
+  }
+
+
+sub _match_tag
+  { my( $elt, %atts)= @_;
+    my $string= "<$elt\\b";
+    foreach my $key (sort keys %atts)
+      { my $val= $atts{$key};
+        $val= "\Q$val\E";
+       # my $val= qq{\Q$atts{$key}\E};
+        $string.= qq{[^>]*$key=(?:"$val"|'$val')};
+      }
+    $string.=  qq{[^>]*>};
+    return "(?:$string)";
+  }
+
+sub field_to_att
+  { my( $elt, $cond, $att)= @_;
+    $att ||= $cond;
+    my $child= $elt->first_child( $cond) or return undef;
+    $elt->set_att( $att => $child->text);
+    $child->cut;
+    return $elt;
+  }
+
+sub att_to_field
+  { my( $elt, $att, $tag)= @_;
+    $tag ||= $att;
+    my $child= $elt->insert_new_elt( first_child => $tag, $elt->{'att'}->{$att});
+    $elt->del_att( $att);
+    return $elt;
+  }
+
+# sort children methods
+
+sub sort_children_on_field
+  { my $elt   = shift;
+    my $field = shift;
+    my $get_key= sub { return $_[0]->field( $field) };
+    return $elt->sort_children( $get_key, @_); 
+  }
+
+sub sort_children_on_att
+  { my $elt = shift;
+    my $att = shift;
+    my $get_key= sub { return $_[0]->{'att'}->{$att} };
+    return $elt->sort_children( $get_key, @_); 
+  }
+
+sub sort_children_on_value
+  { my $elt   = shift;
+    #my $get_key= eval qq{ sub { return \$_[0]->text } };
+    my $get_key= \&text;
+    return $elt->sort_children( $get_key, @_); 
+  }
+
+
+sub sort_children
+  { my( $elt, $get_key, %opt)=@_;
+    $opt{order} ||= 'normal';
+    $opt{type}  ||= 'alpha';
+    my( $par_a, $par_b)= ($opt{order} eq 'reverse') ? qw( b a) : qw ( a b) ;
+    my $op= ($opt{type} eq 'numeric') ? '<=>' : 'cmp' ;
+    my @children= $elt->cut_children;
+    if( $opt{type} eq 'numeric')
+      {  @children= map  { $_->[1] }
+                    sort { $a->[0] <=> $b->[0] }
+                    map  { [ $get_key->( $_), $_] } @children;
+      }
+    elsif( $opt{type} eq 'alpha')
+      {  @children= map  { $_->[1] }
+                    sort { $a->[0] cmp $b->[0] }
+                    map  { [ $get_key->( $_), $_] } @children;
+      }
+    else
+      { croak "wrong sort type '$opt{type}', should be either 'alpha' or 'numeric'"; }
+
+    @children= reverse @children if( $opt{order} eq 'reverse');
+    $elt->set_content( @children);
+  }
+
+
+# comparison methods
+
+sub before
+  { my( $a, $b)=@_;
+    if( $a->cmp( $b) == -1) { return 1; } else { return 0; }
+  }
+
+sub after
+  { my( $a, $b)=@_;
+    if( $a->cmp( $b) == 1) { return 1; } else { return 0; }
+  }
+
+sub lt
+  { my( $a, $b)=@_;
+    return 1 if( $a->cmp( $b) == -1);
+    return 0;
+  }
+
+sub le
+  { my( $a, $b)=@_;
+    return 1 unless( $a->cmp( $b) == 1);
+    return 0;
+  }
+
+sub gt
+  { my( $a, $b)=@_;
+    return 1 if( $a->cmp( $b) == 1);
+    return 0;
+  }
+
+sub ge
+  { my( $a, $b)=@_;
+    return 1 unless( $a->cmp( $b) == -1);
+    return 0;
+  }
+
+
+sub cmp
+  { my( $a, $b)=@_;
+
+    # easy cases
+    return  0 if( $a == $b);    
+    return  1 if( $a->in($b)); # a starts after b 
+    return -1 if( $b->in($a)); # a starts before b
+
+    # ancestors does not include the element itself
+    my @a_pile= ($a, $a->ancestors); 
+    my @b_pile= ($b, $b->ancestors);
+
+    # the 2 elements are not in the same twig
+    return undef unless( $a_pile[-1] == $b_pile[-1]);
+
+    # find the first non common ancestors (they are siblings)
+    my $a_anc= pop @a_pile;
+    my $b_anc= pop @b_pile;
+
+    while( $a_anc == $b_anc) 
+      { $a_anc= pop @a_pile;
+        $b_anc= pop @b_pile;
+      }
+
+    # from there move left and right and figure out the order
+    my( $a_prev, $a_next, $b_prev, $b_next)= ($a_anc, $a_anc, $b_anc, $b_anc);
+    while()
+      { $a_prev= $a_prev->{prev_sibling} || return( -1);
+        return 1 if( $a_prev == $b_next);
+        $a_next= $a_next->{next_sibling} || return( 1);
+        return -1 if( $a_next == $b_prev);
+        $b_prev= $b_prev->{prev_sibling} || return( 1);
+        return -1 if( $b_prev == $a_next);
+        $b_next= $b_next->{next_sibling} || return( -1);
+        return 1 if( $b_next == $a_prev);
+      }
+  }
+    
+#end-extract twig_node
+
+1;
+
+
+__END__
+
+=head1 NAME
+
+XML::Twig - A perl module for processing huge XML documents in tree mode.
+
+=head1 SYNOPSIS
+
+Small documents (loaded in memory as a tree):
+
+  my $twig=XML::Twig->new();    # create the twig
+  $twig->parsefile( 'doc.xml'); # build it
+  my_process( $twig);           # use twig methods to process it 
+  $twig->print;                 # output the twig
+
+Huge documents (processed in combined stream/tree mode):
+
+  # at most one div will be loaded in memory
+  my $twig=XML::Twig->new(   
+    twig_handlers => 
+      { title   => sub { $_->set_gi( 'h2') }, # change title tags to h2
+        para    => sub { $_->set_gi( 'p')  }, # change para to p
+        hidden  => sub { $_->delete;       }, # remove hidden elements
+        list    => \&my_list_process,         # process list elements
+        div     => sub { $_[0]->flush;     }, # output and free memory
+      },
+    pretty_print => 'indented',               # output will be nicely formatted
+    empty_tags   => 'html',                   # outputs <empty_tag />
+                         );
+    $twig->flush;                             # flush the end of the document
+
+See L<XML::Twig 101|XML::Twig 101> for other ways to use the module, as a 
+filter for example
+
+Note that this documentation is intended as a reference to the module. A 
+tutorial is available at http://www.xmltwig.com/xmltwig/tutorial/index.html
+and a FAQ is at http://www.xmltwig.com/xmltwig/XML-Twig-FAQ.html
+
+=head1 DESCRIPTION
+
+This module provides a way to process XML documents. It is build on top
+of C<XML::Parser>.
+
+The module offers a tree interface to the document, while allowing you
+to output the parts of it that have been completely processed.
+
+It allows minimal resource (CPU and memory) usage by building the tree
+only for the parts of the documents that need actual processing, through the 
+use of the C<L<twig_roots|twig_roots> > and 
+C<L<twig_print_outside_roots|twig_print_outside_roots> > options. The 
+C<L<finish|finish> > and C<L<finish_print|finish_print> > methods also help 
+to increase performances.
+
+XML::Twig tries to make simple things easy so it tries its best to takes care 
+of a lot of the (usually) annoying (but sometimes necessary) features that 
+come with XML and XML::Parser.
+
+=head1 XML::Twig 101
+
+XML::Twig can be used either on "small" XML documents (that fit in memory)
+or on huge ones, by processing parts of the document and outputting or
+discarding them once they are processed.
+
+
+=head2 Loading an XML document and processing it
+
+  my $t= XML::Twig->new();
+  $t->parse( '<d><title>title</title><para>p 1</para><para>p 2</para></d>');
+  my $root= $t->root;
+  $root->set_gi( 'html');               # change doc to html
+  $title= $root->first_child( 'title'); # get the title
+  $title->set_gi( 'h1');                # turn it into h1
+  my @para= $root->children( 'para');   # get the para children
+  foreach my $para (@para)
+    { $para->set_gi( 'p'); }            # turn them into p
+  $t->print;                            # output the document
+
+Other useful methods include:
+
+L<att|att>: C<< $elt->{'att'}->{'foo'} >> return the C<foo> attribute for an 
+element,
+
+L<set_att|set_att> : C<< $elt->set_att( foo => "bar") >> sets the C<foo> 
+attribute to the C<bar> value,
+
+L<next_sibling|next_sibling>: C<< $elt->{next_sibling} >> return the next sibling
+in the document (in the example C<< $title->{next_sibling} >> is the first
+C<para>, you can also (and actually should) use 
+C<< $elt->next_sibling( 'para') >> to get it 
+
+The document can also be transformed through the use of the L<cut|cut>, 
+L<copy|copy>, L<paste|paste> and L<move|move> methods: 
+C<< $title->cut; $title->paste( after => $p); >> for example
+
+And much, much more, see L<Elt|"Elt">.
+
+=head2 Processing an XML document chunk by chunk
+
+One of the strengths of XML::Twig is that it let you work with files that do 
+not fit in memory (BTW storing an XML document in memory as a tree is quite
+memory-expensive, the expansion factor being often around 10).
+
+To do this you can define handlers, that will be called once a specific 
+element has been completely parsed. In these handlers you can access the
+element and process it as you see fit, using the navigation and the
+cut-n-paste methods, plus lots of convenient ones like C<L<prefix|prefix> >.
+Once the element is completely processed you can then C<L<flush|flush> > it, 
+which will output it and free the memory. You can also C<L<purge|purge> > it 
+if you don't need to output it (if you are just extracting some data from 
+the document for example). The handler will be called again once the next 
+relevant element has been parsed.
+
+  my $t= XML::Twig->new( twig_handlers => 
+                          { section => \&section,
+                            para   => sub { $_->set_tag( 'p');
+                          },
+                       );
+  $t->parsefile( 'doc.xml');
+  $t->flush; # don't forget to flush one last time in the end or anything
+             # after the last </section> tag will not be output 
+    
+  # the handler is called once a section is completely parsed, ie when 
+  # the end tag for section is found, it receives the twig itself and
+  # the element (including all its sub-elements) as arguments
+  sub section 
+    { my( $t, $section)= @_;      # arguments for all twig_handlers
+      $section->set_tag( 'div');  # change the tag name.4, my favourite method...
+      # let's use the attribute nb as a prefix to the title
+      my $title= $section->first_child( 'title'); # find the title
+      my $nb= $title->{'att'}->{'nb'}; # get the attribute
+      $title->prefix( "$nb - ");  # easy isn't it?
+      $section->flush;            # outputs the section and frees memory
+    }
+
+        
+There is of course more to it: you can trigger handlers on more elaborate 
+conditions than just the name of the element, C<section/title> for example.
+
+  my $t= XML::Twig->new( twig_handlers => 
+                           { 'section/title' => sub { $_->print } }
+                       )
+                  ->parsefile( 'doc.xml');
+
+Here C<< sub { $_->print } >> simply prints the current element (C<$_> is aliased
+to the element in the handler).
+
+You can also trigger a handler on a test on an attribute:
+
+  my $t= XML::Twig->new( twig_handlers => 
+                      { 'section[@level="1"]' => sub { $_->print } }
+                       );
+                  ->parsefile( 'doc.xml');
+
+You can also use C<L<start_tag_handlers|start_tag_handlers> > to process an 
+element as soon as the start tag is found. Besides C<L<prefix|prefix> > you
+can also use C<L<suffix|suffix> >, 
+
+=head2 Processing just parts of an XML document
+
+The twig_roots mode builds only the required sub-trees from the document
+Anything outside of the twig roots will just be ignored:
+
+  my $t= XML::Twig->new( 
+       # the twig will include just the root and selected titles 
+           twig_roots   => { 'section/title' => \&print_n_purge,
+                             'annex/title'   => \&print_n_purge
+           }
+                      );
+  $t->parsefile( 'doc.xml');
+  
+  sub print_n_purge 
+    { my( $t, $elt)= @_;
+      print $elt->text;    # print the text (including sub-element texts)
+      $t->purge;           # frees the memory
+    }
+
+You can use that mode when you want to process parts of a documents but are
+not interested in the rest and you don't want to pay the price, either in
+time or memory, to build the tree for the it.
+
+
+=head2 Building an XML filter
+
+You can combine the C<twig_roots> and the C<twig_print_outside_roots> options to 
+build filters, which let you modify selected elements and will output the rest 
+of the document as is.
+
+This would convert prices in $ to prices in Euro in a document:
+
+  my $t= XML::Twig->new( 
+           twig_roots   => { 'price' => \&convert, },   # process prices 
+           twig_print_outside_roots => 1,               # print the rest
+                      );
+  $t->parsefile( 'doc.xml');
+ 
+  sub convert 
+    { my( $t, $price)= @_;
+      my $currency=  $price->{'att'}->{'currency'};          # get the currency
+      if( $currency eq 'USD')
+        { $usd_price= $price->text;                     # get the price
+          # %rate is just a conversion table 
+          my $euro_price= $usd_price * $rate{usd2euro};
+          $price->set_text( $euro_price);               # set the new price
+          $price->set_att( currency => 'EUR');          # don't forget this!
+        }
+      $price->print;                                    # output the price
+    }
+
+=head2 XML::Twig and various versions of Perl, XML::Parser and expat:
+
+Before being uploaded to CPAN, XML::Twig 3.14 has been tested under the 
+following environments:
+
+=over 4
+
+=item linux-x86
+
+perl 5.6.2 to 5.9.1, expat 1.95.2 to 1.95.7, XML::Parser 2.31, 2.33 and 2.34
+perl 5.6.2, XML::Parser 2.27 (which comes with its own version of expat)
+
+=item Mac OS X (10.2)
+
+Mac OS X: same as linux-x86, plus perl 5.5.4
+
+=item Solaris
+
+perl 5.6.1, expat 1.95.2, XML::Parser 2.31
+
+=item Windows 98
+
+perl 5.6.1 (Activestate build 635), XML::Parser 2.27
+perl 5.8.2 (Activestate build 808), XML::Parser 2.34
+
+Note that with Windows 98 and Perl 5.6.1 C<nmake> may freeze while trying to copy
+the tools (xml_grep, xml_print and xml_spellcheck), so you have to answer no 
+when asked if you want to install them.
+
+=back
+
+See L<http://testers.cpan.org/search?request=dist&dist=XML-Twig> for the
+CPAN testers reports on XML::Twig
+
+XML::Twig does B<NOT> work with expat 1.95.4
+XML::Twig only works with XML::Parser 2.27 in perl 5.6.*  
+XML::Parser 2.28 does not really work
+
+When in doubt, upgrade expat, XML::Parser and Scalar::Util
+
+=head1 Simplifying XML processing
+
+=over 4
+
+=item Whitespaces
+
+Whitespaces that look non-significant are discarded, this behaviour can be 
+controlled using the C<L<keep_spaces|keep_spaces> >, 
+C<L<keep_spaces_in|keep_spaces_in> > and 
+C<L<discard_spaces_in|discard_spaces_in> > options.
+
+=item Encoding
+
+You can specify that you want the output in the same encoding as the input
+(provided you have valid XML, which means you have to specify the encoding
+either in the document or when you create the Twig object) using the 
+C<L<keep_encoding|keep_encoding> > option
+
+You can also use C<L<output_encoding>> to convert the internal UTF-8 format
+to the required encoding.
+
+=item Comments and Processing Instructions (PI)
+
+Comments and PI's can be hidden from the processing, but still appear in the
+output (they are carried by the "real" element closer to them)
+
+=item Pretty Printing
+
+XML::Twig can output the document pretty printed so it is easier to read for
+us humans.
+
+=item Surviving an untimely death
+
+XML parsers are supposed to react violently when fed improper XML. 
+XML::Parser just dies.
+
+XML::Twig provides the C<L<safe_parse|safe_parse> > and the 
+C<L<safe_parsefile|safe_parsefile> > methods which wrap the parse in an eval
+and return either the parsed twig or 0 in case of failure.
+
+=item Private attributes
+
+Attributes with a name starting with # (illegal in XML) will not be
+output, so you can safely use them to store temporary values during
+processing. Note that you can store anything in a private attribute, 
+not just text, it's just a regular Perl variable, so a reference to
+an object or a huge data structure is perfectly fine.
+
+=back
+
+=head1 CLASSES
+
+XML::Twig uses a very limited number of classes. The ones you are most likely to use
+are C<L<XML::Twig>> of course, which represents a complete XML document, including the 
+document itself (the root of the document itself is C<L<root>>), its handlers, its
+input or output filters... The other main class is C<L<XML::Twig::Elt>>, which models 
+an XML element. Element here has a very wide definition: it can be a regular element, or
+but also text, with an element C<L<tag>> of C<#PCDATA> (or C<#CDATA>), an entity (tag is
+C<#ENT>), a Processing Instruction (C<#PI>), a comment (C<#COMMENT>). 
+
+Those are the 2 commonly used classes.
+
+You might want to look the C<L<elt_class>> option if you want to subclass C<XML::Twig::Elt>.
+
+Attributes are just attached to their parent element, they are not objects per se. (Please
+use the provided methods C<L<att>> and C<L<set_att>> to access them, if you access them
+as a hash, then your code becomes implementaion de[endant and might break in the future).
+
+Other classes that are seldom used are C<L<XML::Twig::Entity_list>> and C<L<XML::Twig::Entity>>.
+
+If you use C<L<XML::Twig::XPath>> instead of C<XML::Twig>, elements are then created as
+C<L<XML::Twig::XPath::Elt>>
+
+
+=head1 METHODS
+
+=head2 XML::Twig 
+
+A twig is a subclass of XML::Parser, so all XML::Parser methods can be
+called on a twig object, including parse and parsefile.
+C<setHandlers> on the other hand cannot be used, see C<L<BUGS|BUGS> >
+
+
+=over 4
+
+=item new 
+
+This is a class method, the constructor for XML::Twig. Options are passed
+as keyword value pairs. Recognized options are the same as XML::Parser,
+plus some XML::Twig specifics.
+
+New Options:
+
+=over 4
+
+=item twig_handlers
+
+This argument replaces the corresponding XML::Parser argument. It consists
+of a hash C<{ expression => \&handler}> where expression is a 
+I<generic_attribute_condition>, I<string_condition>,
+an I<attribute_condition>,I<full_path>, a I<partial_path>, a I<gi>,
+I<_default_> or I<_all_>.
+
+The idea is to support a usefull but efficient (thus limited) subset of
+XPATH. A fuller expression set will be supported in the future, as users
+ask for more and as I manage to implement it efficiently. This will never
+encompass all of XPATH due to the streaming nature of parsing (no lookahead
+after the element end tag).
+
+A B<generic_attribute_condition> is a condition on an attribute, in the form
+C<*[@att="val"]> or C<*[@att]>, simple quotes can be used instead of double 
+quotes and the leading '*' is actually optional. No matter what the gi of the
+element is, the handler will be triggered either if the attribute has the 
+specified value or if it just exists. 
+
+A B<string_condition> is a condition on the content of an element, in the form
+C<gi[string()="foo"]>, simple quotes can be used instead of double quotes, at 
+the moment you cannot escape the quotes (this will be added as soon as I
+dig out my copy of Mastering Regular Expressions from its storage box).
+The text returned is, as per what I (and Matt Sergeant!) understood from
+the XPATH spec the concatenation of all the text in the element, excluding
+all markup. Thus to call a handler on the elementC<< <p>text <b>bold</b></p> >>
+the appropriate condition is C<p[string()="text bold"]>. Note that this is not
+exactly conformant to the XPATH spec, it just tries to mimic it while being
+still quite concise. 
+
+A extension of that notation is C<gi[string(B<child_gi>)="foo"]> where the
+handler will be called if a child of a C<gi> element has a text value of 
+C<foo>.  At the moment only direct children of the C<gi> element are checked.
+If you need to test on descendants of the element let me know. The fix is
+trivial but would slow down the checks, so I'd like to keep it the way it is.
+
+A B<regexp_condition> is a condition on the content of an element, in the form
+C<gi[string()=~ /foo/"]>. This is the same as a string condition except that
+the text of the element is matched to the regexp. The C<i>, C<m>, C<s> and C<o>
+modifiers can be used on the regexp.
+
+The C<< gi[string(B<child_gi>)=~ /foo/"] >> extension is also supported.
+
+An B<attribute_condition> is a simple condition of an attribute of the
+current element in the form C<gi[@att="val"]> (simple quotes can be used
+instead of double quotes, you can escape quotes either). 
+If several attribute_condition are true the same element all the handlers
+can be called in turn (in the order in which they were first defined).
+If the C<="val"> part is ommited ( the condition is then C<gi[@att]>) then
+the handler is triggered if the attribute actually exists for the element,
+no matter what it's value is.
+
+A B<full_path> looks like C<'/doc/section/chapter/title'>, it starts with
+a / then gives all the gi's to the element. The handler will be called if
+the path to the current element (in the input document) is exactly as
+defined by the C<full_path>.
+
+A B<partial_path> is like a full_path except it does not start with a /:
+C<'chapter/title'> for example. The handler will be called if the path to
+the element (in the input document) ends as defined in the C<partial_path>.
+
+B<WARNING>: (hopefully temporary) at the moment C<string_condition>, 
+C<regexp_condition> and C<attribute_condition> are only supported on a 
+simple gi, not on a path.
+
+A B<gi> (generic identifier) is just a tag name.
+
+#CDATA can be used to call a handler for a CDATA.
+
+A special gi B<_all_> is used to call a function for each element.
+The special gi B<_default_> is used to call a handler for each element
+that does NOT have a specific handler.
+
+The order of precedence to trigger a handler is: 
+I<generic_attribute_condition>, I<string_condition>, I<regexp_condition>, 
+I<attribute_condition>, I<full_path>, longer I<partial_path>, shorter 
+I<partial_path>, I<gi>, I<_default_> . 
+
+B<Important>: once a handler has been triggered if it returns 0 then no other
+handler is called, exept a C<_all_> handler which will be called anyway.
+
+If a handler returns a true value and other handlers apply, then the next
+applicable handler will be called. Repeat, rince, lather..; The exception
+to that rule is when the C<L<do_not_chain_handlers|do_not_chain_handlers>>
+option is set, in which case only the first handler will be called.
+
+Note that it might be a good idea to explicitely return a short true value
+(like 1) from handlers: this ensures that other applicable handlers are 
+called even if the last statement for the handler happens to evaluate to
+false. This might also speedup the code by avoiding the result of the last 
+statement of the code to be copied and passed to the code managing handlers.
+It can really pay to have 1 instead of a long string returned.
+
+When an element is CLOSED the corresponding handler is called, with 2
+arguments: the twig and the C<L</Element|/Element> >. The twig includes the 
+document tree that has been built so far, the element is the complete sub-tree
+for the element. This means that handlers for inner elements are called before
+handlers for outer elements.
+
+C<$_> is also set to the element, so it is easy to write inline handlers like
+
+  para => sub { $_->change_gi( 'p'); }
+
+Text is stored in elements where gi is #PCDATA (due to mixed content, text
+and sub-element in an element there is no way to store the text as just an
+attribute of the enclosing element).
+
+B<Warning>: if you have used purge or flush on the twig the element might not
+be complete, some of its children might have been entirely flushed or purged,
+and the start tag might even have been printed (by C<flush>) already, so changing
+its gi might not give the expected result.
+
+More generally, the I<full_path>, I<partial_path> and I<gi> expressions are
+evaluated against the input document. Which means that even if you have changed
+the gi of an element (changing the gi of a parent element from a handler for
+example) the change will not impact the expression evaluation. Attributes in
+I<attribute_condition> are different though. As the initial value of attribute
+is not stored the handler will be triggered if the B<current> attribute/value
+pair is found when the element end tag is found. Although this can be quite
+confusing it should not impact most of users, and allow others to play clever
+tricks with temporary attributes. Let me know if this is a problem for you.
+
+
+=item twig_roots
+
+This argument let's you build the tree only for those elements you are
+interested in. 
+
+  Example: my $t= XML::Twig->new( twig_roots => { title => 1, subtitle => 1});
+           $t->parsefile( file);
+           my $t= XML::Twig->new( twig_roots => { 'section/title' => 1});
+           $t->parsefile( file);
+
+
+return a twig containing a document including only C<title> and C<subtitle> 
+elements, as children of the root element.
+
+You can use I<generic_attribute_condition>, I<attribute_condition>,
+I<full_path>, I<partial_path>, I<gi>, I<_default_> and I<_all_> to 
+trigger the building of the twig. 
+I<string_condition> and I<regexp_condition> cannot be used as the content 
+of the element, and the string, have not yet been parsed when the condition
+is checked.
+
+B<WARNING>: path are checked for the document. Even if the C<twig_roots> option
+is used they will be checked against the full document tree, not the virtual
+tree created by XML::Twig
+
+
+B<WARNING>: twig_roots elements should NOT be nested, that would hopelessly
+confuse XML::Twig ;--(
+
+Note: you can set handlers (twig_handlers) using twig_roots
+  Example: my $t= XML::Twig->new( twig_roots => 
+                                   { title    => sub { $_{1]->print;}, 
+                                     subtitle => \&process_subtitle 
+                                   }
+                               );
+           $t->parsefile( file);
+ 
+
+=item twig_print_outside_roots
+
+To be used in conjunction with the C<twig_roots> argument. When set to a true 
+value this will print the document outside of the C<twig_roots> elements.
+
+ Example: my $t= XML::Twig->new( twig_roots => { title => \&number_title },
+                                twig_print_outside_roots => 1,
+                               );
+           $t->parsefile( file);
+           { my $nb;
+           sub number_title
+             { my( $twig, $title);
+               $nb++;
+               $title->prefix( "$nb "; }
+               $title->print;
+             }
+           }
+               
+
+This example prints the document outside of the title element, calls 
+C<number_title> for each C<title> element, prints it, and then resumes printing
+the document. The twig is built only for the C<title> elements. 
+
+If the value is a reference to a file handle then the document outside the
+C<twig_roots> elements will be output to this file handle:
+
+  open( OUT, ">out_file") or die "cannot open out file out_file:$!";
+  my $t= XML::Twig->new( twig_roots => { title => \&number_title },
+                         # default output to OUT
+                         twig_print_outside_roots => \*OUT, 
+                       );
+
+         { my $nb;
+           sub number_title
+             { my( $twig, $title);
+               $nb++;
+               $title->prefix( "$nb "; }
+               $title->print( \*OUT);    # you have to print to \*OUT here
+             }
+           }
+
+
+=item start_tag_handlers
+
+A hash C<{ expression => \&handler}>. Sets element handlers that are called when
+the element is open (at the end of the XML::Parser C<Start> handler). The handlers
+are called with 2 params: the twig and the element. The element is empty at 
+that point, its attributes are created though. 
+
+You can use I<generic_attribute_condition>, I<attribute_condition>,
+I<full_path>, I<partial_path>, I<gi>, I<_default_>  and I<_all_> to trigger 
+the handler. 
+
+I<string_condition> and I<regexp_condition> cannot be used as the content of 
+the element, and the string, have not yet been parsed when the condition is 
+checked.
+
+The main uses for those handlers are to change the tag name (you might have to 
+do it as soon as you find the open tag if you plan to C<flush> the twig at some
+point in the element, and to create temporary attributes that will be used
+when processing sub-element with C<twig_hanlders>. 
+
+You should also use it to change tags if you use C<flush>. If you change the tag 
+in a regular C<twig_handler> then the start tag might already have been flushed. 
+
+B<Note>: C<start_tag> handlers can be called outside of C<twig_roots> if this 
+argument is used, in this case handlers are called with the following arguments:
+C<$t> (the twig), C<$gi> (the gi of the element) and C<%att> (a hash of the 
+attributes of the element). 
+
+If the C<twig_print_outside_roots> argument is also used then the start tag
+will be printed if the last handler called returns a C<true> value, if it
+does not then the start tag will B<not> be printed (so you can print a
+modified string yourself for example);
+
+Note that you can use the L<ignore|ignore> method in C<start_tag_handlers> 
+(and only there). 
+
+=item end_tag_handlers
+
+A hash C<{ expression => \&handler}>. Sets element handlers that are called when
+the element is closed (at the end of the XML::Parser C<End> handler). The handlers
+are called with 2 params: the twig and the gi of the element. 
+
+I<twig_handlers> are called when an element is completely parsed, so why have 
+this redundant option? There is only one use for C<end_tag_handlers>: when using
+the C<twig_roots> option, to trigger a handler for an element B<outside> the roots.
+It is for example very useful to number titles in a document using nested 
+sections: 
+
+  my @no= (0);
+  my $no;
+  my $t= XML::Twig->new( 
+          start_tag_handlers => 
+           { section => sub { $no[$#no]++; $no= join '.', @no; push @no, 0; } },
+          twig_roots         => 
+           { title   => sub { $_[1]->prefix( $no); $_[1]->print; } },
+          end_tag_handlers   => { section => sub { pop @no;  } },
+          twig_print_outside_roots => 1
+                      );
+   $t->parsefile( $file);
+
+Using the C<end_tag_handlers> argument without C<twig_roots> will result in an
+error.
+
+=item do_not_chain_handlers
+
+If this option is set to a true value, then only one handler will be called for
+each element, even if several satisfy the condition
+
+Note that the C<_all_> handler will still be called regardeless
+
+=item ignore_elts
+
+This option lets you ignore elements when building the twig. This is useful 
+in cases where you cannot use C<twig_roots> to ignore elements, for example if
+the element to ignore is a sibling of elements you are interested in.
+
+Example:
+
+  my $twig= XML::Twig->new( ignore_elts => { elt => 1 });
+  $twig->parsefile( 'doc.xml');
+
+This will build the complete twig for the document, except that all C<elt> 
+elements (and their children) will be left out.
+
+
+=item char_handler
+
+A reference to a subroutine that will be called every time C<PCDATA> is found.
+
+=item elt_class
+
+The name of a class used to store elements. this class should inherit from
+C<XML::Twig::Elt> (and by default it is C<XML::Twig::Elt>). This option is used
+to subclass the element class and extend it with new methods.
+
+This option is needed because during the parsing of the XML, elements are created
+by C<XML::Twig>, without any control from the user code.
+
+=item keep_atts_order
+
+Setting this option to a true value causes the attribute hash to be tied to
+a Tie::IxHash object.
+This means that Tie::IxHash needs to be installe for this option to be 
+available. It also means that the hash keeps its order, so you will get 
+the attributes in order. This allows outputing the attributes in the same 
+order as they were in the original document.
+
+=item keep_encoding
+
+This is a (slightly?) evil option: if the XML document is not UTF-8 encoded and
+you want to keep it that way, then setting keep_encoding will use theC<Expat> 
+original_string method for character, thus keeping the original encoding, as 
+well as the original entities in the strings.
+
+See the C<t/test6.t> test file to see what results you can expect from the 
+various encoding options.
+
+B<WARNING>: if the original encoding is multi-byte then attribute parsing will
+be EXTREMELY unsafe under any Perl before 5.6, as it uses regular expressions
+which do not deal properly with multi-byte characters. You can specify an 
+alternate function to parse the start tags with the C<parse_start_tag> option 
+(see below)
+
+B<WARNING>: this option is NOT used when parsing with the non-blocking parser 
+(C<parse_start>, C<parse_more>, parse_done methods) which you probably should 
+not use with XML::Twig anyway as they are totally untested!
+
+=item output_encoding
+
+This option generates an output_filter using C<Encode>,  C<Text::Iconv> or 
+C<Unicode::Map8> and C<Unicode::Strings>, and sets the encoding in the XML
+declaration. This is the easiest way to deal with encodings, if you need 
+more sophisticated features, look at C<output_filter> below
+
+
+=item output_filter
+
+This option is used to convert the character encoding of the output document.
+It is passed either a string corresponding to a predefined filter or
+a subroutine reference. The filter will be called every time a document or 
+element is processed by the "print" functions (C<print>, C<sprint>, C<flush>). 
+
+Pre-defined filters: 
+
+=over 4 
+
+=item latin1 
+
+uses either C<Encode>, C<Text::Iconv> or C<Unicode::Map8> and C<Unicode::String>
+or a regexp (which works only with XML::Parser 2.27), in this order, to convert 
+all characters to ISO-8859-1 (aka latin1)
+
+=item html
+
+does the same conversion as C<latin1>, plus encodes entities using
+C<HTML::Entities> (oddly enough you will need to have HTML::Entities intalled 
+for it to be available). This should only be used if the tags and attribute 
+names themselves are in US-ASCII, or they will be converted and the output will
+not be valid XML any more
+
+=item safe
+
+converts the output to ASCII (US) only  plus I<character entities> (C<&#nnn;>) 
+this should be used only if the tags and attribute names themselves are in 
+US-ASCII, or they will be converted and the output will not be valid XML any 
+more
+
+=item safe_hex
+
+same as C<safe> except that the character entities are in hexa (C<&#xnnn;>)
+
+=item encode_convert ($encoding)
+
+Return a subref that can be used to convert utf8 strings to C<$encoding>).
+Uses C<Encode>.
+
+   my $conv = XML::Twig::encode_convert( 'latin1');
+   my $t = XML::Twig->new(output_filter => $conv);
+
+=item iconv_convert ($encoding)
+
+this function is used to create a filter subroutine that will be used to 
+convert the characters to the target encoding using C<Text::Iconv> (which needs
+to be installed, look at the documentation for the module and for the
+C<iconv> library to find out which encodings are available on your system)
+
+   my $conv = XML::Twig::iconv_convert( 'latin1');
+   my $t = XML::Twig->new(output_filter => $conv);
+
+=item unicode_convert ($encoding)
+
+this function is used to create a filter subroutine that will be used to 
+convert the characters to the target encoding using  C<Unicode::Strings> 
+and C<Unicode::Map8> (which need to be installed, look at the documentation 
+for the modules to find out which encodings are available on your system)
+
+   my $conv = XML::Twig::unicode_convert( 'latin1');
+   my $t = XML::Twig->new(output_filter => $conv);
+
+=back
+
+The C<text> and C<att> methods do not use the filter, so their 
+result are always in unicode.
+
+Those predeclared filters are based on subroutines that can be used
+by themselves (as C<XML::Twig::foo>). 
+
+=over 4
+
+=item html_encode ($string)
+
+Use C<HTML::Entities> to encode a utf8 string
+
+=item safe_encode ($string)
+
+Use either a regexp (perl < 5.8) or C<Encode> to encode non-ascii characters
+in the string in C<< &#<nnnn>; >> format
+
+=item safe_encode_hex ($string)
+
+Use either a regexp (perl < 5.8) or C<Encode> to encode non-ascii characters
+in the string in C<< &#x<nnnn>; >> format
+
+=item regexp2latin1 ($string)
+
+Use a regexp to encode a utf8 string into latin 1 (ISO-8859-1). Does not
+work with Perl 5.8.0!
+
+=back
+
+=item output_text_filter
+
+same as output_filter, except it doesn't apply to the brackets and quotes 
+around attribute values. This is useful for all filters that could change
+the tagging, basically anything that does not just change the encoding of
+the output. C<html>, C<safe> and C<safe_hex> are better used with this option.
+
+=item input_filter
+
+This option is similar to C<output_filter> except the filter is applied to 
+the characters before they are stored in the twig, at parsing time.
+
+=item parse_start_tag
+
+If you use the C<keep_encoding> option then this option can be used to replace
+the default parsing function. You should provide a coderef (a reference to a 
+subroutine) as the argument, this subroutine takes the original tag (given
+by XML::Parser::Expat C<original_string()> method) and returns a gi and the
+attributes in a hash (or in a list attribute_name/attribute value).
+
+=item expand_external_ents
+
+When this option is used external entities (that are defined) are expanded
+when the document is output using "print" functions such as C<L<print> >,
+C<L<sprint|sprint> >, C<L<flush|flush> > and C<L<xml_string|xml_string> >. 
+Note that in the twig the entity will be stored as an element whith a 
+gi 'C<#ENT>', the entity will not be expanded there, so you might want to 
+process the entities before outputting it. 
+
+=item load_DTD
+
+If this argument is set to a true value, C<parse> or C<parsefile> on the twig
+will load  the DTD information. This information can then be accessed through 
+the twig, in a C<DTD_handler> for example. This will load even an external DTD.
+
+Note that to do this the module will generate a temporary file in the current
+directory. If this is a problem let me know and I will add an option to
+specify an alternate directory.
+
+See L<DTD Handling|DTD Handling> for more information
+
+=item DTD_handler
+
+Set a handler that will be called once the doctype (and the DTD) have been 
+loaded, with 2 arguments, the twig and the DTD.
+
+=item no_prolog
+
+Does not output a prolog (XML declaration and DTD)
+
+=item id
+
+This optional argument gives the name of an attribute that can be used as
+an ID in the document. Elements whose ID is known can be accessed through
+the elt_id method. id defaults to 'id'.
+See C<L<BUGS|BUGS> >
+
+=item discard_spaces
+
+If this optional argument is set to a true value then spaces are discarded
+when they look non-significant: strings containing only spaces are discarded.
+This argument is set to true by default.
+
+=item keep_spaces
+
+If this optional argument is set to a true value then all spaces in the
+document are kept, and stored as C<PCDATA>.
+C<keep_spaces> and C<discard_spaces> cannot be both set.
+
+=item discard_spaces_in
+
+This argument sets C<keep_spaces> to true but will cause the twig builder to
+discard spaces in the elements listed.
+
+The syntax for using this argument is:
+ 
+  XML::Twig->new( discard_spaces_in => [ 'elt1', 'elt2']);
+
+=item keep_spaces_in
+
+This argument sets C<discard_spaces> to true but will cause the twig builder to
+keep spaces in the elements listed.
+
+The syntax for using this argument is: 
+
+  XML::Twig->new( keep_spaces_in => [ 'elt1', 'elt2']);
+
+=item pretty_print
+
+Set the pretty print method, amongst 'C<none>' (default), 'C<nsgmls>', 
+'C<nice>', 'C<indented>', 'C<indented_c>', 'C<record>' and 'C<record_c>'
+
+pretty_print formats:
+
+=over 4
+
+=item none
+
+The document is output as one ling string, with no line breaks except those 
+found within text elements
+
+=item nsgmls
+
+Line breaks are inserted in safe places: that is within tags, between a tag 
+and an attribute, between attributes and before the > at the end of a tag.
+
+This is quite ugly but better than C<none>, and it is very safe, the document 
+will still be valid (conforming to its DTD).
+
+This is how the SGML parser C<sgmls> splits documents, hence the name.
+
+=item nice
+
+This option inserts line breaks before any tag that does not contain text (so
+element with textual content are not broken as the \n is the significant).
+
+B<WARNING>: this option leaves the document well-formed but might make it
+invalid (not conformant to its DTD). If you have elements declared as
+
+  <!ELEMENT foo (#PCDATA|bar)>
+
+then a C<foo> element including a C<bar> one will be printed as
+
+  <foo>
+  <bar>bar is just pcdata</bar>
+  </foo>
+
+This is invalid, as the parser will take the line break after the C<foo> tag 
+as a sign that the element contains PCDATA, it will then die when it finds the 
+C<bar> tag. This may or may not be important for you, but be aware of it!
+
+=item indented
+
+Same as C<nice> (and with the same warning) but indents elements according to 
+their level 
+
+=item indented_c
+
+Same as C<indented> but a little more compact: the closing tags are on the 
+same line as the preceeding text
+
+=item record
+
+This is a record-oriented pretty print, that display data in records, one field 
+per line (which looks a LOT like C<indented>)
+
+=item record_c
+
+Stands for record compact, one record per line
+
+=back
+
+
+=item empty_tags
+
+Set the empty tag display style ('C<normal>', 'C<html>' or 'C<expand>').
+
+=item comments
+
+Set the way comments are processed: 'C<drop>' (default), 'C<keep>' or 
+'C<process>' 
+
+Comments processing options:
+
+=over 4
+
+=item drop
+
+drops the comments, they are not read, nor printed to the output
+
+=item keep
+
+comments are loaded and will appear on the output, they are not 
+accessible within the twig and will not interfere with processing
+though
+
+B<Bug>: comments in the middle of a text element such as 
+
+  <p>text <!-- comment --> more text --></p>
+
+are output at the end of the text:
+
+  <p>text  more text <!-- comment --></p>
+
+=item process
+
+comments are loaded in the twig and will be treated as regular elements 
+(their C<gi> is C<#COMMENT>) this can interfere with processing if you
+expect C<< $elt->{first_child} >> to be an element but find a comment there.
+Validation will not protect you from this as comments can happen anywhere.
+You can use C<< $elt->first_child( 'gi') >> (which is a good habit anyway)
+to get where you want. 
+
+Consider using C<process> if you are outputing SAX events from XML::Twig.
+
+=back
+
+=item pi
+
+Set the way processing instructions are processed: 'C<drop>', 'C<keep>' 
+(default) or 'C<process>'
+
+Note that you can also set PI handlers in the C<twig_handlers> option: 
+
+  '?'       => \&handler
+  '?target' => \&handler 2
+
+The handlers will be called with 2 parameters, the twig and the PI element if
+C<pi> is set to C<process>, and with 3, the twig, the target and the data if
+C<pi> is set to C<keep>. Of course they will not be called if C<pi> is set to 
+C<drop>.
+
+If C<pi> is set to C<keep> the handler should return a string that will be used
+as-is as the PI text (it should look like "C< <?target data?> >" or '' if you
+want to remove the PI), 
+
+Only one handler will be called, C<?target> or C<?> if no specific handler for
+that target is available.
+
+=item map_xmlns 
+
+This option is passed a hashref that maps uri's to prefixes. The prefixes in
+the document will be replaced by the ones in the map. The mapped prefixes can
+(actually have to) be used to trigger handlers, navigate or query the document.
+
+Here is an example:
+
+  my $t= XML::Twig->new( map_xmlns => {'http://www.w3.org/2000/svg' => "svg"},
+                         twig_handlers => 
+                           { 'svg:circle' => sub { $_->set_att( r => 20) } },
+                         pretty_print => 'indented', 
+                       )
+                  ->parse( '<doc xmlns:gr="http://www.w3.org/2000/svg">
+                              <gr:circle cx="10" cy="90" r="10"/>
+                           </doc>'
+                         )
+                  ->print;
+
+This will output:
+
+  <doc xmlns:svg="http://www.w3.org/2000/svg">
+     <svg:circle cx="10" cy="90" r="20"/>
+  </doc>
+
+Note that this only works when working on the entire twig. If you use C<twig_roots>
+then the namespace processing is not done. I have to keep something to do for the
+next release ;--)
+
+
+=item keep_original_prefix
+
+When used with C<L<map_xmlns>> this option will make C<XML::Twig> use the original
+namespace prefixes when outputing a document. The mapped prefix will still be used
+for triggering handlers and in navigation and query methods.
+
+  my $t= XML::Twig->new( map_xmlns => {'http://www.w3.org/2000/svg' => "svg"},
+                         twig_handlers => 
+                           { 'svg:circle' => sub { $_->set_att( r => 20) } },
+                         keep_original_prefix => 1,
+                         pretty_print => 'indented', 
+                       )
+                  ->parse( '<doc xmlns:gr="http://www.w3.org/2000/svg">
+                              <gr:circle cx="10" cy="90" r="10"/>
+                           </doc>'
+                         )
+                  ->print;
+
+This will output:
+
+  <doc xmlns:gr="http://www.w3.org/2000/svg">
+     <gr:circle cx="10" cy="90" r="20"/>
+  </doc>
+
+=back
+
+B<Note>: I _HATE_ the Java-like name of arguments used by most XML modules.
+So in pure TIMTOWTDI fashion all arguments can be written either as
+C<UglyJavaLikeName> or as C<readable_perl_name>: C<twig_print_outside_roots>
+or C<TwigPrintOutsideRoots> (or even C<twigPrintOutsideRoots> {shudder}). 
+XML::Twig normalizes them before processing them.
+
+=item parse (SOURCE [, OPT => OPT_VALUE [...]])
+
+This method is inherited from XML::Parser.
+The C<SOURCE> parameter should either be a string containing the whole XML
+document, or it should be an open C<IO::Handle>. Constructor options to
+C<XML::Parser::Expat> given as keyword-value pairs may follow theC<SOURCE> 
+parameter. These override, for this call, any options or attributes passed
+through from the XML::Parser instance.
+
+A die call is thrown if a parse error occurs. Otherwise it will return 
+the twig built by the parse. Use C<safe_parse> if you want the parsing
+to return even when an error occurs.
+
+=item parsestring
+
+This is just an alias for C<parse> for backwards compatibility.
+
+=item parsefile (FILE [, OPT => OPT_VALUE [...]])
+
+This method is inherited from XML::Parser.
+
+Open C<FILE> for reading, then call C<parse> with the open handle. The file
+is closed no matter how C<parse> returns. 
+
+A C<die> call is thrown if a parse error occurs. Otherwise it will return 
+the twig built by the parse. Use C<safe_parsefile> if you want the parsing
+to return even when an error occurs.
+
+=item parseurl ($url $optional_user_agent)
+
+Gets the data from C<$url> and parse it. Note that the data is piped to the
+parser in chunks the size of the XML::Parser::Expat buffer, so memory 
+consumption and hopefully speed are optimal.
+
+If the C<$optional_user_agent> argument is used then it is used, otherwise a
+new one is created.
+
+=item safe_parse ( SOURCE [, OPT => OPT_VALUE [...]])
+
+This method is similar to C<parse> except that it wraps the parsing in an
+C<eval> block. It returns the twig on success and 0 on failure (the twig object
+also contains the parsed twig). C<$@> contains the error message on failure.
+
+Note that the parsing still stops as soon as an error is detected, there is
+no way to keep going after an error.
+
+=item safe_parsefile (FILE [, OPT => OPT_VALUE [...]])
+
+This method is similar to C<parsefile> except that it wraps the parsing in an
+C<eval> block. It returns the twig on success and 0 on failure (the twig object
+also contains the parsed twig) . C<$@> contains the error message on failure
+
+Note that the parsing still stops as soon as an error is detected, there is
+no way to keep going after an error.
+
+=item safe_parseurl ($url $optional_user_agent)
+
+Same as C<parseurl> except that it wraps the parsing in an C<eval> block. It 
+returns the twig on success and 0 on failure (the twig object also contains
+the parsed twig) . C<$@> contains the error message on failure
+
+=item parser
+
+This method returns the C<expat> object (actually the XML::Parser::Expat object) 
+used during parsing. It is useful for example to call XML::Parser::Expat methods
+on it. To get the line of a tag for example use C<< $t->parser->current_line >>.
+
+=item setTwigHandlers ($handlers)
+
+Set the twig_handlers. C<$handlers> is a reference to a hash similar to the
+one in the C<twig_handlers> option of new. All previous handlers are unset.
+The method returns the reference to the previous handlers.
+
+=item setTwigHandler ($exp $handler)
+
+Set a single twig_handler for elements matching C<$exp>. C<$handler> is a 
+reference to a subroutine. If the handler was previously set then the reference 
+to the previous handler is returned.
+
+=item setStartTagHandlers ($handlers)
+
+Set the start_tag handlers. C<$handlers> is a reference to a hash similar to the
+one in the C<start_tag_handlers> option of new. All previous handlers are unset.
+The method returns the reference to the previous handlers.
+
+=item setStartTagHandler ($exp $handler)
+
+Set a single start_tag handlers for elements matching C<$exp>. C<$handler> is a 
+reference to a subroutine. If the handler was previously set then the reference
+to the previous handler is returned.
+
+=item setEndTagHandlers ($handlers)
+
+Set the end_tag handlers. C<$handlers> is a reference to a hash similar to the
+one in the C<end_tag_handlers> option of new. All previous handlers are unset.
+The method returns the reference to the previous handlers.
+
+=item setEndTagHandler ($exp $handler)
+
+Set a single end_tag handlers for elements matching C<$exp>. C<$handler> is a 
+reference to a subroutine. If the handler was previously set then the 
+reference to the previous handler is returned.
+
+=item setTwigRoots ($handlers)
+
+Same as using the C<L<twig_roots>> option when creating the twig
+
+=item setCharHandler ($exp $handler)
+
+Set a C<char_handler>
+
+=item setIgnoreEltsHandler ($exp)
+
+Set a C<ignore_elt> handler (elements that match C<$exp> will be ignored
+
+=item setIgnoreEltsHandlers ($exp)
+
+Set all C<ignore_elt> handlers (previous handlers are replaced)
+
+=item dtd
+
+Return the dtd (an L<XML::Twig::DTD> object) of a twig
+
+=item xmldecl
+
+Return the XML declaration for the document, or a default one if it doesn't
+have one
+
+=item doctype
+
+Return the doctype for the document
+
+=item dtd_text
+
+Return the DTD text
+
+=item dtd_print
+
+Print the DTD
+
+=item model ($tag)
+
+Return the model (in the DTD) for the element C<$tag>
+
+=item root
+
+Return the root element of a twig
+
+=item set_root ($elt)
+
+Set the root of a twig
+
+=item first_elt ($optional_condition)
+
+Return the first element matching C<$optional_condition> of a twig, if
+no condition is given then the root is returned
+
+=item elt_id        ($id)
+
+Return the element whose C<id> attribute is $id
+
+=item getEltById
+
+Same as C<L<elt_id>>
+
+=item encoding
+
+This method returns the encoding of the XML document, as defined by the 
+C<encoding> attribute in the XML declaration (ie it is C<undef> if the attribute
+is not defined)
+
+=item set_encoding
+
+This method sets the value of the C<encoding> attribute in the XML declaration. 
+Note that if the document did not have a declaration it is generated (with
+an XML version of 1.0)
+
+=item xml_version
+
+This method returns the XML version, as defined by the C<version> attribute in 
+the XML declaration (ie it is C<undef> if the attribute is not defined)
+
+=item set_xml_version
+
+This method sets the value of the C<version> attribute in the XML declaration. 
+If the declaration did not exist it is created.
+
+=item standalone
+
+This method returns the value of the C<standalone> declaration for the document
+
+=item set_standalone
+
+This method sets the value of the C<standalone> attribute in the XML 
+declaration.  Note that if the document did not have a declaration it is 
+generated (with an XML version of 1.0)
+
+=item set_output_encoding
+
+Set the C<encoding> "attribute" in the XML declaration
+
+=item set_doctype ($name, $system, $public, $internal)
+
+Set the doctype of the element. If an argument is C<undef> (or not present)
+then its former value is retained, if a false ('' or 0) value is passed then
+the former value is deleted;
+
+=item entity_list
+
+Return the entity list of a twig
+
+=item entity_names
+
+Return the list of all defined entities
+
+=item entity ($entity_name)
+
+Return the entity 
+
+=item change_gi      ($old_gi, $new_gi)
+
+Performs a (very fast) global change. All elements C<$old_gi> are now 
+C<$new_gi>.
+
+See C<L<BUGS|BUGS> >
+
+=item flush            ($optional_filehandle, $options)
+
+Flushes a twig up to (and including) the current element, then deletes
+all unnecessary elements from the tree that's kept in memory.
+C<flush> keeps track of which elements need to be open/closed, so if you
+flush from handlers you don't have to worry about anything. Just keep 
+flushing the twig every time you're done with a sub-tree and it will
+come out well-formed. After the whole parsing don't forget toC<flush> 
+one more time to print the end of the document.
+The doctype and entity declarations are also printed.
+
+flush take an optional filehandle as an argument.
+
+options: use the C<update_DTD> option if you have updated the (internal) DTD 
+and/or the entity list and you want the updated DTD to be output 
+
+The C<pretty_print> option sets the pretty printing of the document.
+
+   Example: $t->flush( Update_DTD => 1);
+            $t->flush( \*FILE, Update_DTD => 1);
+            $t->flush( \*FILE);
+
+
+=item flush_up_to ($elt, $optional_filehandle, %options)
+
+Flushes up to the C<$elt> element. This allows you to keep part of the
+tree in memory when you C<flush>.
+
+options: see flush.
+
+=item purge
+
+Does the same as a C<flush> except it does not print the twig. It just deletes
+all elements that have been completely parsed so far.
+
+=item purge_up_to ($elt)
+
+Purges up to the C<$elt> element. This allows you to keep part of the tree in 
+memory when you C<purge>.
+
+=item print            ($optional_filehandle, %options)
+
+Prints the whole document associated with the twig. To be used only AFTER the
+parse.
+ 
+options: see C<flush>.
+
+=item sprint
+
+Return the text of the whole document associated with the twig. To be used only
+AFTER the parse.
+
+options: see C<flush>.
+
+=item toSAX1 ($handler)
+
+Send SAX events for the twig to the SAX1 handler C<$handler>
+
+=item toSAX2 ($handler)
+
+Send SAX events for the twig to the SAX2 handler C<$handler>
+
+=item flush_toSAX1 ($handler)
+
+Same as flush, except that SAX events are sent to the SAX1 handler
+C<$handler> instead of the twig being printed
+
+=item flush_toSAX2 ($handler)
+
+Same as flush, except that SAX events are sent to the SAX2 handler
+C<$handler> instead of the twig being printed
+
+=item ignore
+
+This method can B<only> be called in C<start_tag_handlers>. It causes the 
+element to be skipped during the parsing: the twig is not built for this 
+element, it will not be accessible during parsing or after it. The element 
+will not take up any memory and parsing will be faster.
+
+Note that this method can also be called on an element. If the element is a 
+parent of the current element then this element will be ignored (the twig will
+not be built any more for it and what has already been built will be deleted)
+
+
+=item set_pretty_print  ($style)
+
+Set the pretty print method, amongst 'C<none>' (default), 'C<nsgmls>', 
+'C<nice>', 'C<indented>', 'C<record>' and 'C<record_c>'
+
+B<WARNING:> the pretty print style is a B<GLOBAL> variable, so once set it's
+applied to B<ALL> C<print>'s (and C<sprint>'s). Same goes if you use XML::Twig
+with C<mod_perl> . This should not be a problem as the XML that's generated 
+is valid anyway, and XML processors (as well as HTML processors, including
+browsers) should not care. Let me know if this is a big problem, but at the
+moment the performance/cleanliness trade-off clearly favors the global 
+approach.
+
+=item set_empty_tag_style  ($style)
+
+Set the empty tag display style ('C<normal>', 'C<html>' or 'C<expand>'). As 
+with C<L<set_pretty_print>> this sets a global flag.  
+
+C<normal> outputs an empty tag 'C<< <tag/> >>', C<html> adds a space 
+'C<< <tag /> >>' and C<expand> outputs 'C<< <tag></tag> >>'
+
+=item print_prolog     ($optional_filehandle, %options)
+
+Prints the prolog (XML declaration + DTD + entity declarations) of a document.
+
+options: see C<L<flush>>.
+
+=item prolog     ($optional_filehandle, %options)
+
+Return the prolog (XML declaration + DTD + entity declarations) of a document.
+
+options: see C<L<flush>>.
+
+=item finish
+
+Call Expat C<finish> method.
+Unsets all handlers (including internal ones that set context), but expat
+continues parsing to the end of the document or until it finds an error.
+It should finish up a lot faster than with the handlers set.
+
+=item finish_print
+
+Stop twig processing, flush the twig and proceed to finish printing the 
+document as fast as possible. Use this method when modifying a document and 
+the modification is done. 
+
+=item set_expand_external_entities
+
+Same as using the C<L<expand_external_ents>> option when creating the twig
+
+=item set_input_filter
+
+Same as using the C<L<input_filter>> option when creating the twig
+
+=item set_keep_atts_order
+
+Same as using the C<L<keep_atts_order>> option when creating the twig
+
+=item set_keep_encoding
+
+Same as using the C<L<keep_encoding>> option when creating the twig
+
+=item set_output_filter
+
+Same as using the C<L<output_filter>> option when creating the twig
+
+=item set_output_text_filter
+
+Same as using the C<L<output_text_filter>> option when creating the twig
+
+=item Methods inherited from XML::Parser::Expat
+
+A twig inherits all the relevant methods from XML::Parser::Expat. These 
+methods can only be used during the parsing phase (they will generate
+a fatal error otherwise).
+
+Inherited methods are:
+
+=over 4
+
+=item depth
+
+Returns the size of the context list.
+
+=item in_element
+
+Returns true if NAME is equal to the name of the innermost curâ
+rently opened element. If namespace processing is being used and
+you want to check against a name that may be in a namespace, then
+use the generate_ns_name method to create the NAME argument.
+
+=item within_element
+
+Returns the number of times the given name appears in the context
+list.  If namespace processing is being used and you want to check
+against a name that may be in a namespace, then use the generâ
+ate_ns_name method to create the NAME argument.
+
+=item context
+
+Returns a list of element names that represent open elements, with
+the last one being the innermost. Inside start and end tag hanâ
+dlers, this will be the tag of the parent element.
+
+=item current_line
+
+Returns the line number of the current position of the parse.
+
+=item current_column
+
+Returns the column number of the current position of the parse.
+
+=item current_byte
+
+Returns the current position of the parse.
+
+=item position_in_context
+
+Returns a string that shows the current parse position. LINES
+should be an integer >= 0 that represents the number of lines on
+either side of the current parse line to place into the returned
+string.
+
+=item base ([NEWBASE])
+
+Returns the current value of the base for resolving relative URIs.
+If NEWBASE is supplied, changes the base to that value.
+
+=item current_element
+
+Returns the name of the innermost currently opened element. Inside
+start or end handlers, returns the parent of the element associated
+with those tags.
+
+=item element_index
+
+Returns an integer that is the depth-first visit order of the curâ
+rent element. This will be zero outside of the root element. For
+example, this will return 1 when called from the start handler for
+the root element start tag.
+
+=item recognized_string
+
+Returns the string from the document that was recognized in order
+to call the current handler. For instance, when called from a start
+handler, it will give us the the start-tag string. The string is
+encoded in UTF-8.  This method doesn't return a meaningful string
+inside declaration handlers.
+
+=item original_string
+
+Returns the verbatim string from the document that was recognized
+in order to call the current handler. The string is in the original
+document encoding. This method doesn't return a meaningful string
+inside declaration handlers.
+
+=item xpcroak
+
+Concatenate onto the given message the current line number within
+the XML document plus the message implied by ErrorContext. Then
+croak with the formed message.
+
+=item xpcarp 
+
+Concatenate onto the given message the current line number within
+the XML document plus the message implied by ErrorContext. Then
+carp with the formed message.
+
+=item xml_escape(TEXT [, CHAR [, CHAR ...]])
+
+Returns TEXT with markup characters turned into character entities.
+Any additional characters provided as arguments are also turned
+into character references where found in TEXT.
+
+(this method is broken on some versions of expat/XML::Parser)
+
+=back
+
+=item path ($gi)
+
+Return the element context in a form similar to XPath's short
+form: 'C</root/gi1/../gi>'
+
+=item get_xpath  ( $optional_array_ref, $xpath, $optional_offset)
+
+Performs a C<get_xpath> on the document root (see <Elt|"Elt">)
+
+If the C<$optional_array_ref> argument is used the array must contain
+elements. The C<$xpath> expression is applied to each element in turn 
+and the result is union of all results. This way a first query can be
+refined in further steps.
+
+
+=item find_nodes ( $optional_array_ref, $xpath, $optional_offset)
+
+same as C<get_xpath> 
+
+=item findnodes ( $optional_array_ref, $xpath, $optional_offset)
+
+same as C<get_xpath> (similar to the XML::LibXML method)
+
+=item findvalue ( $optional_array_ref, $xpath, $optional_offset)
+
+Return the C<join> of all texts of the results of appling C<L<get_xpath>>
+to the node (similar to the XML::LibXML method)
+
+=item subs_text ($regexp, $replace)
+
+subs_text does text substitution on the whole document, similar to perl's 
+C< s///> operator.
+
+=item dispose
+
+Useful only if you don't have C<Scalar::Util> or C<WeakRef> installed.
+
+Reclaims properly the memory used by an XML::Twig object. As the object has
+circular references it never goes out of scope, so if you want to parse lots 
+of XML documents then the memory leak becomes a problem. Use
+C<< $twig->dispose >> to clear this problem.
+
+=back 
+
+
+=head2 XML::Twig::Elt
+
+=over 4
+
+=item new          ($optional_gi, $optional_atts, @optional_content)
+
+The C<gi> is optional (but then you can't have a content ), the C<$optional_atts> 
+argument is a refreference to a hash of attributes, the content can be just a 
+string or a list of strings and element. A content of 'C<#EMPTY>' creates an empty 
+element;
+
+ Examples: my $elt= XML::Twig::Elt->new();
+           my $elt= XML::Twig::Elt->new( para => { align => 'center' });  
+           my $elt= XML::Twig::Elt->new( para => { align => 'center' }, 'foo');  
+           my $elt= XML::Twig::Elt->new( br   => '#EMPTY');
+           my $elt= XML::Twig::Elt->new( 'para');
+           my $elt= XML::Twig::Elt->new( para => 'this is a para');  
+           my $elt= XML::Twig::Elt->new( para => $elt3, 'another para'); 
+
+The strings are not parsed, the element is not attached to any twig.
+
+B<WARNING>: if you rely on ID's then you will have to set the id yourself. At
+this point the element does not belong to a twig yet, so the ID attribute
+is not known so it won't be strored in the ID list.
+
+Note that C<#COMMENT>, C<#PCDATA> or C<#CDATA> are valid tag names, that will 
+create text elements.
+
+To create an element C<foo> containing a CDATA section:
+
+           my $foo= XML::Twig::Elt->new( '#CDATA' => "content of the CDATA section")
+                                  ->wrap_in( 'foo');
+
+=item parse         ($string, %args)
+
+Creates an element from an XML string. The string is actually
+parsed as a new twig, then the root of that twig is returned.
+The arguments in C<%args> are passed to the twig.
+As always if the parse fails the parser will die, so use an
+eval if you want to trap syntax errors.
+
+As obviously the element does not exist beforehand this method has to be 
+called on the class: 
+
+  my $elt= parse XML::Twig::Elt( "<a> string to parse, with <sub/>
+                                  <elements>, actually tons of </elements>
+                  h</a>");
+
+=item print         ($optional_filehandle, $optional_pretty_print_style)
+
+Prints an entire element, including the tags, optionally to a 
+C<$optional_filehandle>, optionally with a C<$pretty_print_style>.
+
+The print outputs XML data so base entities are escaped.
+
+=item sprint       ($elt, $optional_no_enclosing_tag)
+
+Return the xml string for an entire element, including the tags. 
+If the optional second argument is true then only the string inside the 
+element is returned (the start and end tag for $elt are not).
+The text is XML-escaped: base entities (& and < in text, & < and " in
+attribute values) are turned into entities.
+
+=item gi                       
+
+Return the gi of the element (the gi is the C<generic identifier> the tag
+name in SGML parlance).
+
+C<tag> and C<name> are synonyms of C<gi>.
+
+=item tag
+
+Same as C<L<gi|gi>>
+
+=item name
+
+Same as C<L<gi|gi>>
+
+=item set_gi         ($gi)
+
+Set the gi (tag) of an element
+
+=item set_tag        ($tag)
+
+Set the tag (=C<L<gi|gi>>) of an element
+
+=item set_name       ($name)
+
+Set the name (=C<L<gi|gi>>) of an element
+
+=item root 
+
+Return the root of the twig in which the element is contained.
+
+=item twig 
+
+Return the twig containing the element. 
+
+=item parent        ($optional_condition)
+
+Return the parent of the element, or the first ancestor matching the 
+C<$optional_condition>
+
+=item first_child   ($optional_condition)
+
+Return the first child of the element, or the first child matching the 
+C<$optional_condition>
+
+=item has_child ($optional_condition)
+
+Return the first child of the element, or the first child matching the 
+C<$optional_condition> (same as L<first_child>)
+
+=item has_children ($optional_condition)
+
+Return the first child of the element, or the first child matching the 
+C<$optional_condition> (same as L<first_child>)
+
+
+=item first_child_text   ($optional_condition)
+
+Return the text of the first child of the element, or the first child
+ matching the C<$optional_condition>
+If there is no first_child then returns ''. This avoids getting the
+child, checking for its existence then getting the text for trivial cases.
+
+Similar methods are available for the other navigation methods: 
+
+=over 4
+
+=item last_child_text
+
+=item prev_sibling_text
+
+=item next_sibling_text
+
+=item prev_elt_text
+
+=item next_elt_text
+
+=item child_text
+
+=item parent_text
+
+=back
+
+All this methods also exist in "trimmed" variant: 
+
+=over 4
+
+=item first_child_trimmed_text
+
+=item last_child_trimmed_text
+
+=item prev_sibling_trimmed_text
+
+=item next_sibling_trimmed_text
+
+=item prev_elt_trimmed_text
+
+=item next_elt_trimmed_text
+
+=item child_trimmed_text
+
+=item parent_trimmed_text
+
+=back
+
+=item field         ($optional_condition)
+
+Same method as C<first_child_text> with a different name
+
+=item trimmed_field         ($optional_condition)
+
+Same method as C<first_child_trimmed_text> with a different name
+
+=item set_field ($condition, $optional_atts, @list_of_elt_and_strings)
+
+Set the content of the first child of the element that matches
+C<$condition>, the rest of the arguments is tha same as for C<L<set_content>>
+
+If no child matches C<$condition> _and_ if C<$condition> is a valid
+XML element name, then a new element by that name is created and 
+inserted as the last child.
+
+=item first_child_matches   ($optional_condition)
+
+Return the element if the first child of the element (if it exists) passes
+the C<$optional_condition> C<undef> otherwise
+
+  if( $elt->first_child_matches( 'title')) ... 
+
+is equivalent to
+
+  if( $elt->{first_child} && $elt->{first_child}->passes( 'title')) 
+
+C<first_child_is> is an other name for this method
+
+Similar methods are available for the other navigation methods: 
+
+=over 4
+
+=item last_child_matches
+
+=item prev_sibling_matches
+
+=item next_sibling_matches
+
+=item prev_elt_matches
+
+=item next_elt_matches
+
+=item child_matches
+
+=item parent_matches
+
+=back
+
+=item is_first_child ($optional_condition)
+
+returns true (the element) if the element is the first child of its parent
+(optionaly that satisfies the C<$optional_condition>)
+
+=item is_last_child ($optional_condition)
+
+returns true (the element) if the element is the first child of its parent
+(optionaly that satisfies the C<$optional_condition>)
+
+=item prev_sibling  ($optional_condition)
+
+Return the previous sibling of the element, or the previous sibling matching
+C<$optional_condition>
+
+=item next_sibling  ($optional_condition)
+
+Return the next sibling of the element, or the first one matching 
+C<$optional_condition>.
+
+=item next_elt     ($optional_elt, $optional_condition)
+
+Return the next elt (optionally matching C<$optional_condition>) of the element. This 
+is defined as the next element which opens after the current element opens.
+Which usually means the first child of the element.
+Counter-intuitive as it might look this allows you to loop through the
+whole document by starting from the root.
+
+The C<$optional_elt> is the root of a subtree. When the C<next_elt> is out of the
+subtree then the method returns undef. You can then walk a sub tree with:
+
+  my $elt= $subtree_root;
+  while( $elt= $elt->next_elt( $subtree_root)
+    { # insert processing code here
+    }
+
+=item prev_elt     ($optional_condition)
+
+Return the previous elt (optionally matching C<$optional_condition>) of the
+element. This is the first element which opens before the current one.
+It is usually either the last descendant of the previous sibling or
+simply the parent
+
+=item next_n_elt   ($offset, $optional_condition)
+
+Return the C<$offset>-th element that matches the C<$optional_condition> 
+
+=item children     ($optional_condition)
+
+Return the list of children (optionally which matches C<$optional_condition>) of 
+the element. The list is in document order.
+
+=item children_count ($optional_condition)
+
+Return the number of children of the element (optionally which matches 
+C<$optional_condition>)
+
+=item children_text ($optional_condition)
+
+Return an array containing the text of children of the element (optionally 
+which matches C<$optional_condition>)
+
+=item children_copy ($optional_condition)
+
+Return a list of elements that are copies of the children of the element, 
+optionally which matches C<$optional_condition>
+
+=item descendants     ($optional_condition)
+
+Return the list of all descendants (optionally which matches 
+C<$optional_condition>) of the element. This is the equivalent of the 
+C<getElementsByTagName> of the DOM (by the way, if you are really a DOM 
+addict, you can use C<getElementsByTagName> instead)
+
+=item getElementsByTagName ($optional_condition)
+
+Same as C<L<descendants>>
+
+=item find_by_tag_name ($optional_condition)
+
+Same as C<L<descendants>>
+
+=item descendants_or_self ($optional_condition)
+
+Same as C<L<descendants>> except that the element itself is included in the list
+if it matches the C<$optional_condition> 
+
+=item ancestors    ($optional_condition)
+
+Return the list of ancestors (optionally matching C<$optional_condition>) of the 
+element.  The list is ordered from the innermost ancestor to the outtermost one
+
+NOTE: the element itself is not part of the list, in order to include it 
+you will have to use ancestors_or_self
+
+=item ancestors_or_self     ($optional_condition)
+
+Return the list of ancestors (optionally matching C<$optional_condition>) of the 
+element, including the element (if it matches the condition>).  
+The list is ordered from the innermost ancestor to the outtermost one
+
+=item passes ($condition)
+
+Return the element if it passes the C<$condition> 
+
+=item att          ($att)
+
+Return the value of attribute C<$att> or C<undef>
+
+=item set_att      ($att, $att_value)
+
+Set the attribute of the element to the given value
+
+You can actually set several attributes this way:
+
+  $elt->set_att( att1 => "val1", att2 => "val2");
+
+=item del_att      ($att)
+
+Delete the attribute for the element
+
+You can actually delete several attributes at once:
+
+  $elt->del_att( 'att1', 'att2', 'att3');
+
+=item cut
+
+Cut the element from the tree. The element still exists, it can be copied
+or pasted somewhere else, it is just not attached to the tree anymore.
+
+=item cut_children ($optional_condition)
+
+Cut all the children of the element (or all of those which satisfy the
+C<$optional_condition>).
+
+Return the list of children 
+
+=item copy        ($elt)
+
+Return a copy of the element. The copy is a "deep" copy: all sub elements of 
+the element are duplicated.
+
+=item paste       ($optional_position, $ref)
+
+Paste a (previously C<cut> or newly generated) element. Die if the element
+already belongs to a tree.
+
+The element is pasted 
+
+Example:
+
+  my $t= XML::Twig->new->parse( 'doc.xml')
+  my $toc= $t->root->new( 'toc');
+  $toc->paste( $t->root); # $toc is pasted as first child of the root 
+  foreach my $title ($t->findnodes( '/doc/section/title'))
+    { my $title_toc= $title->copy;
+      # paste $title_toc as the last child of toc
+      $title_toc->paste( last_child => $toc) 
+    }
+
+Position options:
+
+=over 4
+
+=item first_child (default)
+
+The element is pasted as the first child of C<$ref>
+
+=item last_child
+
+The element is pasted as the last child of C<$ref>
+
+=item before
+
+The element is pasted before C<$ref>, as its previous sibling.
+
+=item after
+
+The element is pasted after C<$ref>, as its next sibling.
+
+=item within
+
+In this case an extra argument, C<$offset>, should be supplied. The element
+will be pasted in the reference element (or in its first text child) at the
+given offset. To achieve this the reference element will be split at the 
+offset.
+
+=back
+
+Note that you can call directly the underlying method:
+
+=over 4
+
+=item paste_before
+
+=item paste_after
+
+=item paste_first_child
+
+=item paste_last_child
+
+=item paste_within
+
+=back
+
+=item move       ($optional_position, $ref)
+
+Move an element in the tree.
+This is just a C<cut> then a C<paste>.  The syntax is the same as C<paste>.
+
+=item replace       ($ref)
+
+Replaces an element in the tree. Sometimes it is just not possible toC<cut> 
+an element then C<paste> another in its place, so C<replace> comes in handy.
+The calling element replaces C<$ref>.
+
+=item replace_with   (@elts)
+
+Replaces the calling element with one or more elements 
+
+=item delete
+
+Cut the element and frees the memory.
+
+=item prefix       ($text, $optional_option)
+
+Add a prefix to an element. If the element is a C<PCDATA> element the text
+is added to the pcdata, if the elements first child is a C<PCDATA> then the
+text is added to it's pcdata, otherwise a new C<PCDATA> element is created 
+and pasted as the first child of the element.
+
+If the option is C<asis> then the prefix is added asis: it is created in
+a separate C<PCDATA> element with an C<asis> property. You can then write:
+
+  $elt1->prefix( '<b>', 'asis');
+
+to create a C<< <b> >> in the output of C<print>.
+
+=item suffix       ($text, $optional_option)
+
+Add a suffix to an element. If the element is a C<PCDATA> element the text
+is added to the pcdata, if the elements last child is a C<PCDATA> then the
+text is added to it's pcdata, otherwise a new PCDATA element is created 
+and pasted as the last child of the element.
+
+If the option is C<asis> then the suffix is added asis: it is created in
+a separate C<PCDATA> element with an C<asis> property. You can then write:
+
+  $elt2->suffix( '</b>', 'asis');
+
+=item simplify (%options)
+
+Return a data structure suspiciously similar to XML::Simple's. Options are
+identical to XMLin options, see XML::Simple doc for more details (or use
+DATA::dumper or YAML to dump the data structure)
+
+=over 4
+
+=item keyattr 
+
+=item forcearray 
+
+=item noattr 
+
+=item content_key
+                             
+=item variables (%var_hash)
+
+%var_hash is a hash { name => value }
+
+This option allows variables in the XML to be expanded when the file is read. (there is no facility for putting the variable names back if you regenerate XML using XMLout).
+
+A 'variable' is any text of the form ${name} (or $name) which occurs in an attribute value or in the text content of an element. If 'name' matches a key in the supplied hashref, ${name} will be replaced with the corresponding value from the hashref. If no matching key is found, the variable will not be replaced. 
+
+=item var_att ($attribute_name)
+
+This option gives the name of an attribute that will be used to create 
+variables in the XML:
+
+  <dirs>
+    <dir name="prefix">/usr/local</dir>
+    <dir name="exec_prefix">$prefix/bin</dir>
+  </dirs>
+
+use C<< var => 'name' >> to get $prefix replaced by /usr/local in the
+generated data structure  
+
+By default variables are captured by the following regexp: /$(\w+)/
+    
+=item var_regexp (regexp)
+
+This option changes the regexp used to capture variables. The variable
+name should be in $1
+
+=item group_tags ([<tag1>, <tag2>...])
+
+Option used to simplify the structure: elements listed will not be used.
+Their children will be, they will be considered children of the element
+parent.
+
+If the element is:
+
+  <config host="laptop.xmltwig.com">
+    <server>localhost</server>
+    <dirs>
+      <dir name="base">/home/mrodrigu/standards</dir>
+      <dir name="tools">$base/tools</dir>
+    </dirs>
+    <templates>
+      <template name="std_def">std_def.templ</template>
+      <template name="dummy">dummy</template>
+    </templates>
+  </config>
+
+Then callin simplify with C<< erase => [ 'dirs', 'templates'] >> makes the
+data structure be exactly as if the start and end tags for C<dirs> and
+C<templates> were not there.
+
+A YAML dump of the structure 
+
+  base: '/home/mrodrigu/standards'
+  host: laptop.xmltwig.com
+  server: localhost
+  template:
+    - std_def.templ
+    - dummy.templ
+  tools: '$base/tools'
+
+
+=back
+
+=item split_at        ($offset)
+
+Split a text (C<PCDATA> or C<CDATA>) element in 2 at C<$offset>, the original
+element now holds the first part of the string and a new element holds the
+right part. The new element is returned
+
+If the element is not a text element then the first text child of the element
+is split
+
+=item split        ( $optional_regexp, $optional_tag, $optional_attribute_ref)
+
+Split the text descendants of an element in place, the text is split using 
+the regexp, if the regexp includes () then the matched separators will be 
+wrapped in C<$optional_tag>, with C<$optional_attribute_ref> attributes
+
+if $elt is C<< <p>tati tata <b>tutu tati titi</b> tata tati tata</p> >>
+
+  $elt->split( qr/(ta)ti/, 'foo', {type => 'toto'} )
+
+will change $elt to
+
+  <p><foo type="toto">ta</foo> tata <b>tutu <foo type="toto">ta</foo>
+      titi</b> tata <foo type="toto">ta</foo> tata</p> 
+
+The regexp can be passed either as a string or as C<qr//> (perl 5.005 and 
+later), it defaults to \s+ just as the C<split> built-in (but this would be 
+quite a useless behaviour without the C<$optional_tag> parameter)
+
+C<$optional_tag> defaults to PCDATA or CDATA, depending on the initial element
+type
+
+The list of descendants is returned (including un-touched original elements 
+and newly created ones)
+
+=item mark        ( $regexp, $optional_tag, $optional_attribute_ref)
+
+This method behaves exactly as L<split|split>, except only the newly created 
+elements are returned
+
+=item wrap_children ( $regexp_string, $tag, $optional_att, $optional_value)
+
+Wrap the children of the element that match the regexp in an element C<$tag>.
+If C<$optional_att> and C<$optional_value> are passed then the new element will
+have an attribute C<$optional_att> with a value C<$optional_value>.
+
+Note that elements might get extra C<id> attributes in the process. See L<add_id>.
+Use L<strip_att> to remove unwanted id's. 
+
+Here is an example:
+
+If the element C<$elt> has the following content:
+
+  <elt>
+   <p>para 1</p>
+   <l_l1_1>list 1 item 1 para 1</l_l1_1>
+     <l_l1>list 1 item 1 para 2</l_l1>
+   <l_l1_n>list 1 item 2 para 1 (only para)</l_l1_n>
+   <l_l1_n>list 1 item 3 para 1</l_l1_n>
+     <l_l1>list 1 item 3 para 2</l_l1>
+     <l_l1>list 1 item 3 para 3</l_l1>
+   <l_l1_1>list 2 item 1 para 1</l_l1_1>
+     <l_l1>list 2 item 1 para 2</l_l1>
+   <l_l1_n>list 2 item 2 para 1 (only para)</l_l1_n>
+   <l_l1_n>list 2 item 3 para 1</l_l1_n>
+     <l_l1>list 2 item 3 para 2</l_l1>
+     <l_l1>list 2 item 3 para 3</l_l1>
+  </elt>
+
+Then the code
+
+  $elt->wrap_children( q{<l_l1_1><l_l1>*} , li => { type => "ul1" });
+  $elt->wrap_children( q{<l_l1_n><l_l1>*} , li => { type => "ul" });
+
+  $elt->wrap_children( q{<li type="ul1"><li type="ul">+}, "ul");
+  $elt->strip_att( 'id');
+  $elt->strip_att( 'type');
+  $elt->print;
+
+will output:
+
+  <elt>
+     <p>para 1</p>
+     <ul>
+       <li>
+         <l_l1_1>list 1 item 1 para 1</l_l1_1>
+         <l_l1>list 1 item 1 para 2</l_l1>
+       </li>
+       <li>
+         <l_l1_n>list 1 item 2 para 1 (only para)</l_l1_n>
+       </li>
+       <li>
+         <l_l1_n>list 1 item 3 para 1</l_l1_n>
+         <l_l1>list 1 item 3 para 2</l_l1>
+         <l_l1>list 1 item 3 para 3</l_l1>
+       </li>
+     </ul>
+     <ul>
+       <li>
+         <l_l1_1>list 2 item 1 para 1</l_l1_1>
+         <l_l1>list 2 item 1 para 2</l_l1>
+       </li>
+       <li>
+         <l_l1_n>list 2 item 2 para 1 (only para)</l_l1_n>
+       </li>
+       <li>
+         <l_l1_n>list 2 item 3 para 1</l_l1_n>
+         <l_l1>list 2 item 3 para 2</l_l1>
+         <l_l1>list 2 item 3 para 3</l_l1>
+       </li>
+     </ul>
+  </elt>
+
+=item subs_text ($regexp, $replace)
+
+subs_text does text substitution, similar to perl's C< s///> operator.
+
+C<$regexp> must be a perl regexp, created with the C<qr> operatot.
+
+C<$replace> can include C<$1, $2>... from the C<$regexp>. It can also be
+used to create element and entities, by using 
+C<< &elt( tag => { att => val }, text) >> (similar syntax as C<L<new>>) and
+C<< &ent( name) >>.
+
+Here is a rather complex example:
+
+  $elt->subs_text( qr{(?<!do not )link to (http://([^\s,]*))},
+                   'see &elt( a =>{ href => $1 }, $2)'
+                 );
+
+This will replace text like I<link to http://www.xmltwig.com> by 
+I<< see <a href="www.xmltwig.com">www.xmltwig.com</a> >>, but not
+I<do not link to...>
+
+Generating entities (here replacing spaces with &nbsp;):
+
+  $elt->subs_text( qr{ }, '&ent( "&nbsp;")');
+
+or, using a variable:
+
+  my $ent="&nbsp;";
+  $elt->subs_text( qr{ }, "&ent( '$ent')");
+
+Note that the substitution is always global, as in using the C<g> modifier
+in a perl substitution, and that it is performed on all text descendants
+of the element.
+
+=item add_id
+
+Add an id to the element.
+
+The id is an attribute (C<id> by default, see the C<id> option for XML::Twig
+C<new> to change it. Use an id starting with C<#> to get an id that's not 
+output by L<print>, L<flush> or L<sprint>) that allows you to use the
+L<elt_id> method to get the element easily.
+
+=item set_id_seed ($prefix)
+
+by default the id generated by C<L<add_id>> is C<< twig_id_<nnnn> >>, 
+C<set_id_seed> changes the prefix to C<$prefix> and resets the number
+to 1
+
+=item strip_att ($att)
+
+Remove the attribute C<$att> from all descendants of the element (including 
+the element)
+
+=item change_att_name ($old_name, $new_name)
+
+Change the name of the attribute from C<$old_name> to C<$new_name>. If there is no
+attribute C<$old_name> nothing happens.
+
+=item sort_children_on_value( %options)
+
+Sort the children of the element in place according to their text.
+All children are sorted. 
+
+Return the element, with its children sorted.
+
+
+L<%options> are
+
+  type  : numeric |  alpha     (default: alpha)
+  order : normal  |  reverse   (default: normal)
+
+Return the element, with its children sorted
+
+
+=item sort_children_on_att ($att, %options)
+
+Sort the children of the  element in place according to attribute C<$att>. 
+C<%options> are the same as for L<C<sort_children_on_value>>
+
+Return the element.
+
+
+=item sort_children_on_field ($gi, %options)
+
+Sort the children of the element in place, according to the field C<$gi> (the 
+text of the first child of the child with this gi). C<%options> are the same
+as for L<C<sort_children_on_value>>.
+
+Return the element, with its children sorted
+
+
+=item sort_children( $get_key, %options) 
+
+Sort the children of the element in place. The C<$get_key> argument is
+a reference to a function that returns the sort key when passed an element.
+
+For example:
+
+  $elt->sort_children( sub { $_[0]->{'att'}->{"nb"} + $_[0]->text }, 
+                       type => 'numeric', order => 'reverse'
+                     );
+
+=item field_to_att ($cond, $att)
+
+Turn the text of the first sub-element matched by C<$cond> into the value of 
+attribute C<$att> of the element. If C<$att> is ommited then C<$cond> is used 
+as the name of the attribute, which makes sense only if C<$cond> is a valid
+element (and attribute) name.
+
+The sub-element is then cut.
+
+=item att_to_field ($att, $gi)
+
+Take the value of attribute C<$att> and create a sub-element C<$gi> as first
+child of the element. If C<$gi> is ommited then C<$att> is used as the name of
+the sub-element. 
+
+
+=item get_xpath  ($xpath, $optional_offset)
+
+Return a list of elements satisfying the C<$xpath>. C<$xpath> is an XPATH-like 
+expression.
+
+A subset of the XPATH abbreviated syntax is covered:
+
+  gi
+  gi[1] (or any other positive number)
+  gi[last()]
+  gi[@att] (the attribute exists for the element)
+  gi[@att="val"]
+  gi[@att=~ /regexp/]
+  gi[att1="val1" and att2="val2"]
+  gi[att1="val1" or att2="val2"]
+  gi[string()="toto"] (returns gi elements which text (as per the text method) 
+                       is toto)
+  gi[string()=~/regexp/] (returns gi elements which text (as per the text 
+                          method) matches regexp)
+  expressions can start with / (search starts at the document root)
+  expressions can start with . (search starts at the current element)
+  // can be used to get all descendants instead of just direct children
+  * matches any gi
+  
+So the following examples from the 
+F<XPath recommendationL<http://www.w3.org/TR/xpath.html#path-abbrev>> work:
+
+  para selects the para element children of the context node
+  * selects all element children of the context node
+  para[1] selects the first para child of the context node
+  para[last()] selects the last para child of the context node
+  */para selects all para grandchildren of the context node
+  /doc/chapter[5]/section[2] selects the second section of the fifth chapter 
+     of the doc 
+  chapter//para selects the para element descendants of the chapter element 
+     children of the context node
+  //para selects all the para descendants of the document root and thus selects
+     all para elements in the same document as the context node
+  //olist/item selects all the item elements in the same document as the 
+     context node that have an olist parent
+  .//para selects the para element descendants of the context node
+  .. selects the parent of the context node
+  para[@type="warning"] selects all para children of the context node that have
+     a type attribute with value warning 
+  employee[@secretary and @assistant] selects all the employee children of the
+     context node that have both a secretary attribute and an assistant 
+     attribute
+
+
+The elements will be returned in the document order.
+
+If C<$optional_offset> is used then only one element will be returned, the one 
+with the appropriate offset in the list, starting at 0
+
+Quoting and interpolating variables can be a pain when the Perl syntax and the 
+XPATH syntax collide, so here are some more examples to get you started:
+
+  my $p1= "p1";
+  my $p2= "p2";
+  my @res= $t->get_xpath( "p[string( '$p1') or string( '$p2')]");
+
+  my $a= "a1";
+  my @res= $t->get_xpath( "//*[@att=\"$a\"]);
+
+  my $val= "a1";
+  my $exp= "//p[ \@att='$val']"; # you need to use \@ or you will get a warning
+  my @res= $t->get_xpath( $exp);
+
+Note that the only supported regexps delimiters are / and that you must 
+backslash all / in regexps AND in regular strings.
+
+XML::Twig does not provide natively full XPATH support, but you can use 
+XML::Twig does not provide natively full XPATH support, but you can use 
+C<L<XML::Twig::XPath>> to get C<findnodes> to use C<XML::XPath> as the
+XPath engine, with full coverage of the spec.
+
+C<L<XML::Twig::XPath>> to get C<findnodes> to use C<XML::XPath> as the
+XPath engine, with full coverage of the spec.
+
+=item find_nodes
+
+same asC<get_xpath> 
+
+=item findnodes
+
+same asC<get_xpath> 
+
+
+=item text
+
+Return a string consisting of all the C<PCDATA> and C<CDATA> in an element, 
+without any tags. The text is not XML-escaped: base entities such as C<&> 
+and C<< < >> are not escaped.
+
+=item trimmed_text
+
+Same as C<text> except that the text is trimmed: leading and trailing spaces
+are discarded, consecutive spaces are collapsed
+
+=item set_text        ($string)
+
+Set the text for the element: if the element is a C<PCDATA>, just set its
+text, otherwise cut all the children of the element and create a single
+C<PCDATA> child for it, which holds the text.
+
+=item insert         ($gi1, [$optional_atts1], $gi2, [$optional_atts2],...)
+
+For each gi in the list inserts an element C<$gi> as the only child of the 
+element.  The element gets the optional attributes inC<< $optional_atts<n>. >> 
+All children of the element are set as children of the new element.
+The upper level element is returned.
+
+  $p->insert( table => { border=> 1}, 'tr', 'td') 
+
+put C<$p> in a table with a visible border, a single C<tr> and a single C<td> 
+and return the C<table> element:
+
+  <p><table border="1"><tr><td>original content of p</td></tr></table></p>
+
+=item wrap_in        (@gi)
+
+Wrap elements C<$gi> as the successive ancestors of the element, returns the 
+new element.
+$elt->wrap_in( 'td', 'tr', 'table') wraps the element as a single cell in a 
+table for example.
+
+=item insert_new_elt ($opt_position, $gi, $opt_atts_hashref, @opt_content)
+
+Combines a C<L<new|new> > and a C<L<paste|paste> >: creates a new element using 
+C<$gi>, C<$opt_atts_hashref >and C<@opt_content> which are arguments similar 
+to those for C<new>, then paste it, using C<$opt_position> or C<'first_child'>,
+relative to C<$elt>.
+
+Return the newly created element
+
+=item erase
+
+Erase the element: the element is deleted and all of its children are
+pasted in its place.
+
+=item set_content    ( $optional_atts, @list_of_elt_and_strings)
+                     ( $optional_atts, '#EMPTY')
+
+Set the content for the element, from a list of strings and
+elements.  Cuts all the element children, then pastes the list
+elements as the children.  This method will create a C<PCDATA> element
+for any strings in the list.
+
+The C<$optional_atts> argument is the ref of a hash of attributes. If this
+argument is used then the previous attributes are deleted, otherwise they
+are left untouched. 
+
+B<WARNING>: if you rely on ID's then you will have to set the id yourself. At
+this point the element does not belong to a twig yet, so the ID attribute
+is not known so it won't be strored in the ID list.
+
+A content of 'C<#EMPTY>' creates an empty element;
+
+=item namespace ($optional_prefix)
+
+Return the URI of the namespace that C<$optional_prefix> or the element name
+belongs to. If the name doesn't belong to any namespace, C<undef> is returned.
+
+=item local_name
+
+Return the local name (without the prefix) for the element
+
+=item ns_prefix
+
+Return the namespace prefix for the element
+
+=item current_ns_prefixes
+
+Returna list of namespace prefixes valid for the element. The order of the
+prefixes in the list has no meaning. If the default namespace is currently 
+bound, '' appears in the list.
+
+
+=item inherit_att  ($att, @optional_gi_list)
+
+Return the value of an attribute inherited from parent tags. The value
+returned is found by looking for the attribute in the element then in turn
+in each of its ancestors. If the C<@optional_gi_list> is supplied only those
+ancestors whose gi is in the list will be checked. 
+
+=item all_children_are ($optional_condition)
+
+return 1 if all children of the element pass the C<$optional_condition>, 
+0 otherwise
+
+=item level       ($optional_condition)
+
+Return the depth of the element in the twig (root is 0).
+If C<$optional_condition> is given then only ancestors that match the condition are 
+counted.
+ 
+B<WARNING>: in a tree created using the C<twig_roots> option this will not return
+the level in the document tree, level 0 will be the document root, level 1 
+will be the C<twig_roots> elements. During the parsing (in a C<twig_handler>)
+you can use the C<depth> method on the twig object to get the real parsing depth.
+
+=item in           ($potential_parent)
+
+Return true if the element is in the potential_parent (C<$potential_parent> is 
+an element)
+
+=item in_context   ($cond, $optional_level)
+
+Return true if the element is included in an element which passes C<$cond>
+optionally within C<$optional_level> levels. The returned value is the 
+including element.
+
+=item pcdata
+
+Return the text of a C<PCDATA> element or C<undef> if the element is not 
+C<PCDATA>.
+
+=item pcdata_xml_string
+
+Return the text of a PCDATA element or undef if the element is not PCDATA. 
+The text is "XML-escaped" ('&' and '<' are replaced by '&amp;' and '&lt;')
+
+=item set_pcdata     ($text)
+
+Set the text of a C<PCDATA> element. 
+
+=item append_pcdata  ($text)
+
+Add the text at the end of a C<PCDATA> element.
+
+=item is_cdata
+
+Return 1 if the element is a C<CDATA> element, returns 0 otherwise.
+
+=item is_text
+
+Return 1 if the element is a C<CDATA> or C<PCDATA> element, returns 0 otherwise.
+
+=item cdata
+
+Return the text of a C<CDATA> element or C<undef> if the element is not 
+C<CDATA>.
+
+=item cdata_string
+
+Return the XML string of a C<CDATA> element, including the opening and
+closing markers.
+
+=item set_cdata     ($text)
+
+Set the text of a C<CDATA> element. 
+
+=item append_cdata  ($text)
+
+Add the text at the end of a C<CDATA> element.
+
+=item remove_cdata
+
+Turns all C<CDATA> sections in the element into regular C<PCDATA> elements. This is useful
+when converting XML to HTML, as browsers do not support CDATA sections. 
+
+=item extra_data 
+
+Return the extra_data (comments and PI's) attached to an element
+
+=item set_extra_data     ($extra_data)
+
+Set the extra_data (comments and PI's) attached to an element
+
+=item append_extra_data  ($extra_data)
+
+Append extra_data to the existing extra_data before the element (if no
+previous extra_data exists then it is created)
+
+=item set_asis
+
+Set a property of the element that causes it to be output without being XML
+escaped by the print functions: if it contains C<< a < b >> it will be output
+as such and not as C<< a &lt; b >>. This can be useful to create text elements
+that will be output as markup. Note that all C<PCDATA> descendants of the 
+element are also marked as having the property (they are the ones taht are
+actually impacted by the change).
+
+If the element is a C<CDATA> element it will also be output asis, without the
+C<CDATA> markers. The same goes for any C<CDATA> descendant of the element
+
+=item set_not_asis
+
+Unsets the C<asis> property for the element and its text descendants.
+
+=item is_asis
+
+Return the C<asis> property status of the element ( 1 or C<undef>)
+
+=item closed                   
+
+Return true if the element has been closed. Might be usefull if you are
+somewhere in the tree, during the parse, and have no idea whether a parent
+element is completely loaded or not.
+
+=item get_type
+
+Return the type of the element: 'C<#ELT>' for "real" elements, or 'C<#PCDATA>',
+'C<#CDATA>', 'C<#COMMENT>', 'C<#ENT>', 'C<#PI>'
+
+=item is_elt
+
+Return the gi if the element is a "real" element, or 0 if it is C<PCDATA>, 
+C<CDATA>...
+
+=item contains_only_text
+
+Return 1 if the element does not contain any other "real" element
+
+=item contains_only ($exp)
+
+Return the list of children if all children of the element match
+the expression C<$exp> 
+
+  if( $para->contains_only( 'tt')) { ... }
+
+=item contains_a_single ($exp)
+
+If the element contains a single child that matches the expression C<$exp>
+returns that element. Otherwise returns 0.
+
+=item is_field
+
+same as C<contains_only_text> 
+
+=item is_pcdata
+
+Return 1 if the element is a C<PCDATA> element, returns 0 otherwise.
+
+=item is_ent
+
+Return 1 if the element is an entity (an unexpanded entity) element, 
+return 0 otherwise.
+
+=item is_empty
+
+Return 1 if the element is empty, 0 otherwise
+
+=item set_empty
+
+Flags the element as empty. No further check is made, so if the element
+is actually not empty the output will be messed. The only effect of this 
+method is that the output will be C<< <gi att="value""/> >>.
+
+=item set_not_empty
+
+Flags the element as not empty. if it is actually empty then the element will
+be output as C<< <gi att="value""></gi> >>
+
+=item is_pi
+
+Return 1 if the element is a processing instruction (C<#PI>) element,
+return 0 otherwise.
+
+=item target
+
+Return the target of a processing instruction
+
+=item set_target ($target)
+
+Set the target of a processing instruction
+
+=item data
+
+Return the data part of a processing instruction
+
+=item set_data ($data)
+
+Set the data of a processing instruction
+
+=item set_pi ($target, $data)
+
+Set the target and data of a processing instruction
+
+=item pi_string
+
+Return the string form of a processing instruction
+(C<< <?target data?> >>)
+
+=item is_comment
+
+Return 1 if the element is a comment (C<#COMMENT>) element,
+return 0 otherwise.
+
+=item set_comment ($comment_text)
+
+Set the text for a comment
+
+=item comment
+
+Return the content of a comment (just the text, not the C<< <!-- >>
+and C<< --> >>)
+
+=item comment_string 
+
+Return the XML string for a comment (C<< <!-- comment --> >>)
+
+=item set_ent ($entity)
+
+Set an (non-expanded) entity (C<#ENT>). C<$entity>) is the entity
+text (C<&ent;>)
+
+=item ent
+
+Return the entity for an entity (C<#ENT>) element (C<&ent;>)
+
+=item ent_name
+
+Return the entity name for an entity (C<#ENT>) element (C<ent>)
+
+=item ent_string
+
+Return the entity, either expanded if the expanded version is available,
+or non-expanded (C<&ent;>) otherwise
+
+=item child ($offset, $optional_condition)
+
+Return the C<$offset>-th child of the element, optionally the C<$offset>-th 
+child that matches C<$optional_condition>. The children are treated as a list, so 
+C<< $elt->child( 0) >> is the first child, while C<< $elt->child( -1) >> is 
+the last child.
+
+=item child_text ($offset, $optional_condition)
+
+Return the text of a child or C<undef> if the sibling does not exist. Arguments
+are the same as child.
+
+=item last_child    ($optional_condition)
+
+Return the last child of the element, or the last child matching 
+C<$optional_condition> (ie the last of the element children matching
+the condition).
+
+=item last_child_text   ($optional_condition)
+
+Same as C<first_child_text> but for the last child.
+
+=item sibling  ($offset, $optional_condition)
+
+Return the next or previous C<$offset>-th sibling of the element, or the 
+C<$offset>-th one matching C<$optional_condition>. If C<$offset> is negative then a 
+previous sibling is returned, if $offset is positive then  a next sibling is 
+returned. C<$offset=0> returns the element if there is no condition or
+if the element matches the condition>, C<undef> otherwise.
+
+=item sibling_text ($offset, $optional_condition)
+
+Return the text of a sibling or C<undef> if the sibling does not exist. 
+Arguments are the same as C<sibling>.
+
+=item prev_siblings ($optional_condition)
+
+Return the list of previous siblings (optionaly matching C<$optional_condition>)
+for the element. The elements are ordered in document order.
+
+=item next_siblings ($optional_condition)
+
+Return the list of siblings (optionaly matching C<$optional_condition>)
+following the element. The elements are ordered in document order.
+
+=item pos ($optional_condition)
+
+Return the position of the element in the children list. The first child has a
+position of 1 (as in XPath).
+
+If the C<$optional_condition> is given then only siblings that match the condition 
+are counted. If the element itself does not match the  condition then
+0 is returned.
+
+=item atts
+
+Return a hash ref containing the element attributes
+
+=item set_atts      ({att1=>$att1_val, att2=> $att2_val... })
+
+Set the element attributes with the hash ref supplied as the argument
+
+=item del_atts
+
+Deletes all the element attributes.
+
+=item att_nb
+
+Return the number of attributes for the element
+
+=item has_atts
+
+Return true if the element has attributes (in fact return the number of
+attributes, thus being an alias to C<L<att_nb>>
+
+=item has_no_atts
+
+Return true if the element has no attributes, false (0) otherwise
+
+=item att_names
+
+return a list of the attribute names for the element
+
+=item att_xml_string ($att, $optional_quote)
+
+Return the attribute value, where '&', '<' and $quote (" by default)
+are XML-escaped
+
+if C<$optional_quote> is passed then it is used as the quote.
+
+=item set_id       ($id)
+
+Set the C<id> attribute of the element to the value.
+See C<L<elt_id|elt_id> > to change the id attribute name
+
+=item id
+
+Gets the id attribute value
+
+=item del_id       ($id)
+
+Deletes the C<id> attribute of the element and remove it from the id list
+for the document
+
+=item class
+
+Return the C<class> attribute for the element (methods on the C<class>
+attribute are quite convenient when dealing with XHTML, or plain XML that
+will eventually be displayed using CSS)
+
+=item set_class ($class)
+
+Set the C<class> attribute for the element to C<$class>
+
+=item add_to_class ($class)
+
+Add C<$class> to the element C<class> attribute: the new class is added
+only if it is not already present. Note that classes are sorted alphabetically,
+so the C<class> attribute can be changed even if the class is already there
+
+=item att_to_class ($att)
+
+Set the C<class> attribute to the value of attribute C<$att>
+
+=item add_att_to_class ($att)
+
+Add the value of attribute C<$att> to the C<class> attribute of the element
+
+=item move_att_to_class ($att)
+
+Add the value of attribute C<$att> to the C<class> attribute of the element
+and delete the attribute
+
+=item tag_to_class
+
+Set the C<class> attribute of the element to the element tag
+
+=item add_tag_to_class
+
+Add the element tag to its C<class> attribute
+
+=item set_tag_class ($new_tag)
+
+Add the element tag to its C<class> attribute and sets the tag to C<$new_tag>
+
+=item in_class ($class)
+
+Return true (C<1>) if the element is in the class C<$class> (if C<$class> is
+one of the tokens in the element C<class> attribute)
+
+=item DESTROY
+
+Frees the element from memory.
+
+=item start_tag
+
+Return the string for the start tag for the element, including 
+the C<< /> >> at the end of an empty element tag
+
+=item end_tag
+
+Return the string for the end tag of an element.  For an empty
+element, this returns the empty string ('').
+
+=item xml_string
+
+Equivalent to C<< $elt->sprint( 1) >>, returns the string for the entire 
+element, excluding the element's tags (but nested element tags are present)
+
+=item xml_text 
+
+Return the text of the element, encoded (and processed by the current 
+C<L<output_filter>> or C<L<output_encoding>> options, without any tag.
+
+=item set_pretty_print ($style)
+
+Set the pretty print method, amongst 'C<none>' (default), 'C<nsgmls>', 
+'C<nice>', 'C<indented>', 'C<record>' and 'C<record_c>'
+
+pretty_print styles:
+
+=over 4
+
+=item none
+
+the default, no C<\n> is used
+
+=item nsgmls
+
+nsgmls style, with C<\n> added within tags
+
+=item nice
+
+adds C<\n> wherever possible (NOT SAFE, can lead to invalid XML)
+
+=item indented
+
+same as C<nice> plus indents elements (NOT SAFE, can lead to invalid XML) 
+
+=item record
+
+table-oriented pretty print, one field per line 
+
+=item record_c
+
+table-oriented pretty print, more compact than C<record>, one record per line 
+
+=back
+
+=item set_empty_tag_style ($style)
+
+Set the method to output empty tags, amongst 'C<normal>' (default), 'C<html>',
+and 'C<expand>', 
+
+=item set_indent ($string)
+
+Set the indentation for the indented pretty print style (default is 2 spaces)
+
+=item set_quote ($quote)
+
+Set the quotes used for attributes. can be 'C<double>' (default) or 'C<single>'
+
+=item cmp       ($elt)
+
+  Compare the order of the 2 elements in a twig.
+
+  C<$a> is the <A>..</A> element, C<$b> is the <B>...</B> element
+  
+  document                        $a->cmp( $b)
+  <A> ... </A> ... <B>  ... </B>     -1
+  <A> ... <B>  ... </B> ... </A>     -1
+  <B> ... </B> ... <A>  ... </A>      1
+  <B> ... <A>  ... </A> ... </B>      1
+   $a == $b                           0
+   $a and $b not in the same tree   undef
+
+=item before       ($elt)
+
+Return 1 if C<$elt> starts before the element, 0 otherwise. If the 2 elements 
+are not in the same twig then return C<undef>.
+
+    if( $a->cmp( $b) == -1) { return 1; } else { return 0; }
+
+=item after       ($elt)
+
+Return 1 if $elt starts after the element, 0 otherwise. If the 2 elements 
+are not in the same twig then return C<undef>.
+
+    if( $a->cmp( $b) == -1) { return 1; } else { return 0; }
+
+=item other comparison methods
+
+=over 4
+
+=item lt
+
+=item le
+
+=item gt
+
+=item ge
+
+=back
+
+=item path
+
+Return the element context in a form similar to XPath's short
+form: 'C</root/gi1/../gi>'
+
+=item xpath
+
+Return a unique XPath expression that can be used to find the element
+again. 
+
+It looks like C</doc/sect[3]/title>: unique elements do not have an index,
+the others do.
+
+=item private methods
+
+Low-level methods on the twig:
+
+=over 4
+
+=item set_parent        ($parent)
+
+=item set_first_child   ($first_child)
+
+=item set_last_child    ($last_child)
+
+=item set_prev_sibling  ($prev_sibling)
+
+=item set_next_sibling  ($next_sibling)
+
+=item set_twig_current
+
+=item del_twig_current
+
+=item twig_current
+
+=item flush
+
+This method should NOT be used, always flush the twig, not an element.
+
+=item contains_text
+
+=back
+
+Those methods should not be used, unless of course you find some creative 
+and interesting, not to mention useful, ways to do it.
+
+=back
+
+=head2 cond
+
+Most of the navigation functions accept a condition as an optional argument
+The first element (or all elements for C<L<children|children> > or 
+C<L<ancestors|ancestors> >) that passes the condition is returned.
+
+The condition is a single step of an XPath expression using the XPath subset
+defined by C<L<get_xpath>>. Additional conditions are:
+
+The condition can be 
+
+=over 4
+
+=item #ELT
+
+return a "real" element (not a PCDATA, CDATA, comment or pi element) 
+
+=item #TEXT
+
+return a PCDATA or CDATA element
+
+=item regular expression
+
+return an element whose gi matches the regexp. The regexp has to be created 
+with C<qr//> (hence this is available only on perl 5.005 and above)
+
+=item code reference
+
+applies the code, passing the current element as argument, if the code returns
+true then the element is returned, if it returns false then the code is applied
+to the next candidate.
+
+=back
+
+=head2 XML::Twig::XPath
+
+XML::Twig implements a subset of XPath through the C<L<get_xpath>> method. 
+
+If you want to use the whole XPath power, then you can use C<XML::Twig::XPath>
+instead. In this case C<XML::Twig> uses C<XML::XPath> to execute XPath queries.
+You will of course need C<XML::XPath> installed to be able to use C<XML::Twig::XPath>.
+
+See L<XML::XPath> for more information.
+
+The methods you can use are:
+
+=over 4
+
+=item findnodes              ($path)
+
+return a list of nodes found by C<$path>.
+
+=item findnodes_as_string    ($path)
+
+return the nodes found reproduced as XML. The result is not guaranteed
+to be valid XML though.
+
+=item findvalue              ($path)
+
+return the concatenation of the text content of the result nodes
+
+=back
+
+In order for C<XML::XPath> to be used as the XPath engine the following methods
+are included in C<XML::Twig>:
+
+in XML::Twig
+
+=over 4
+
+=item getRootNode
+
+=item getParentNode
+
+=item getChildNodes 
+
+=back
+
+in XML::Twig::Elt
+
+=over 4
+
+=item string_value
+
+=item toString
+
+=item getName
+
+=item getRootNode
+
+=item getNextSibling
+
+=item getPreviousSibling
+
+=item isElementNode
+
+=item isTextNode
+
+=item isPI
+
+=item isPINode
+
+=item isProcessingInstructionNode
+
+=item isComment
+
+=item isCommentNode
+
+=item getTarget 
+
+=item getChildNodes 
+
+=item getElementById
+
+=back
+
+=head2 XML::Twig::XPath::Elt
+
+The methods you can use are the same as on C<XML::Twig::XPath> elements:
+
+=over 4
+
+=item findnodes              ($path)
+
+return a list of nodes found by C<$path>.
+
+=item findnodes_as_string    ($path)
+
+return the nodes found reproduced as XML. The result is not guaranteed
+to be valid XML though.
+
+=item findvalue              ($path)
+
+return the concatenation of the text content of the result nodes
+
+=back
+
+
+=head2 XML::Twig::Entity_list
+
+=over 4
+
+=item new
+
+Create an entity list.
+
+=item add         ($ent)
+
+Add an entity to an entity list.
+
+=item add_new_ent ($name, $val, $sysid, $pubid, $ndata)
+
+Create a new entity and add it to the entity list
+
+=item delete     ($ent or $gi).
+
+Delete an entity (defined by its name or by the Entity object)
+from the list.
+
+=item print      ($optional_filehandle)
+
+Print the entity list.
+
+=item list
+
+Return the list as an array
+
+=back
+
+
+=head2 XML::Twig::Entity
+
+=over 4
+
+=item new        ($name, $val, $sysid, $pubid, $ndata)
+
+Same arguments as the Entity handler for XML::Parser.
+
+=item print       ($optional_filehandle)
+
+Print an entity declaration.
+
+=item name 
+
+Return the name of the entity
+
+=item val  
+
+Return the value of the entity
+
+=item sysid
+
+Return the system id for the entity (for NDATA entities)
+
+=item pubid
+
+Return the public id for the entity (for NDATA entities)
+
+=item ndata
+
+Return true if the entity is an NDATA entity
+
+=item text
+
+Return the entity declaration text.
+
+=back
+
+
+=head1 EXAMPLES
+
+Additional examples (and a complete tutorial) can be found  on the
+F<XML::Twig PageL<http://www.xmltwig.com/xmltwig/>>
+
+To figure out what flush does call the following script with an
+XML file and an element name as arguments
+
+  use XML::Twig;
+
+  my ($file, $elt)= @ARGV;
+  my $t= XML::Twig->new( twig_handlers => 
+      { $elt => sub {$_[0]->flush; print "\n[flushed here]\n";} });
+  $t->parsefile( $file, ErrorContext => 2);
+  $t->flush;
+  print "\n";
+
+
+=head1 NOTES
+
+=head2 Subclassing XML::Twig
+
+Useful methods:
+
+=over 4
+
+=item elt_class
+
+In order to subclass C<XML::Twig> you will probably need to subclass also
+C<L<XML::Twig::Elt>>. Use the C<elt_class> option when you create the
+C<XML::Twig> object to get the elements created in a different class
+(which should be a subclass of C<XML::Twig::Elt>.
+
+=item add_options
+
+If you inherit C<XML::Twig> new method but want to add more options to it
+you can use this method to prevent XML::Twig to issue warnings for those
+additional options.
+
+=back
+
+=head2 DTD Handling
+
+There are 3 possibilities here.  They are:
+
+=over 4
+
+=item No DTD
+
+No doctype, no DTD information, no entity information, the world is simple...
+
+=item Internal DTD
+
+The XML document includes an internal DTD, and maybe entity declarations.
+
+If you use the load_DTD option when creating the twig the DTD information and
+the entity declarations can be accessed.
+
+The DTD and the entity declarations will be C<flush>'ed (or C<print>'ed) either
+as is (if they have not been modified) or as reconstructed (poorly, comments 
+are lost, order is not kept, due to it's content this DTD should not be viewed 
+by anyone) if they have been modified. You can also modify them directly by 
+changing the C<< $twig->{twig_doctype}->{internal} >> field (straight from 
+XML::Parser, see the C<Doctype> handler doc)
+
+=item External DTD
+
+The XML document includes a reference to an external DTD, and maybe entity 
+declarations.
+
+If you use the C<load_DTD> when creating the twig the DTD information and the 
+entity declarations can be accessed. The entity declarations will be
+C<flush>'ed (or C<print>'ed) either as is (if they have not been modified) or
+as reconstructed (badly, comments are lost, order is not kept).
+
+You can change the doctype through the C<< $twig->set_doctype >> method and 
+print the dtd through the C<< $twig->dtd_text >> or C<< $twig->dtd_print >>
+ methods.
+
+If you need to modify the entity list this is probably the easiest way to do it.
+
+=back
+
+
+=head2 Flush
+
+If you set handlers and use C<flush>, do not forget to flush the twig one
+last time AFTER the parsing, or you might be missing the end of the document.
+
+Remember that element handlers are called when the element is CLOSED, so
+if you have handlers for nested elements the inner handlers will be called
+first. It makes it for example trickier than it would seem to number nested
+clauses.
+
+
+
+=head1 BUGS
+
+=over 4
+
+=item entity handling
+
+Due to XML::Parser behaviour, non-base entities in attribute values disappear:
+C<att="val&ent;"> will be turned into C<< att => val >>, unless you use the 
+C<keep_encoding> argument to C<< XML::Twig->new >> 
+
+=item DTD handling
+
+Basically the DTD handling methods are competely bugged. No one uses them and
+it seems very difficult to get them to work in all cases, including with 
+several slightly incompatible versions of XML::Parser and of libexpat.
+
+So use XML::Twig with standalone documents, or with documents refering to an
+external DTD, but don't expect it to properly parse and even output back the
+DTD.
+
+=item memory leak
+
+If you use a lot of twigs you might find that you leak quite a lot of memory
+(about 2Ks per twig). You can use the C<L<dispose|dispose> > method to free 
+that memory after you are done.
+
+If you create elements the same thing might happen, use the C<L<delete|delete>>
+method to get rid of them.
+
+Alternatively installing the C<Scalar::Util> (or C<WeakRef>) module on a version 
+of Perl that supports it (>5.6.0) will get rid of the memory leaks automagically.
+
+=item ID list
+
+The ID list is NOT updated when ID's are modified or elements cut or
+deleted.
+
+=item change_gi
+
+This method will not function properly if you do:
+
+     $twig->change_gi( $old1, $new);
+     $twig->change_gi( $old2, $new);
+     $twig->change_gi( $new, $even_newer);
+
+=item sanity check on XML::Parser method calls
+
+XML::Twig should really prevent calls to some XML::Parser methods, especially 
+the C<setHandlers> method.
+
+=item pretty printing
+
+Pretty printing (at least using the 'C<indented>' style) is hard to get right! 
+Only elements that belong to the document will be properly indented. Printing 
+elements that do not belong to the twig makes it impossible for XML::Twig to 
+figure out their depth, and thus their indentation level.
+
+Also there is an anavoidable bug when using C<flush> and pretty printing for
+elements with mixed content that start with an embedded element:
+
+  <elt><b>b</b>toto<b>bold</b></elt>
+
+  will be output as 
+
+  <elt>
+    <b>b</b>toto<b>bold</b></elt>
+
+if you flush the twig when you find the C<< <b> >> element
+  
+
+=back
+
+=head1 Globals
+
+These are the things that can mess up calling code, especially if threaded.
+They might also cause problem under mod_perl. 
+
+=over 4
+
+=item Exported constants
+
+Whether you want them or not you get them! These are subroutines to use
+as constant when creating or testing elements
+
+  PCDATA  return '#PCDATA'
+  CDATA   return '#CDATA'
+  PI      return '#PI', I had the choice between PROC and PI :--(
+
+=item Module scoped values: constants
+
+these should cause no trouble:
+
+  %base_ent= ( '>' => '&gt;',
+               '<' => '&lt;',
+               '&' => '&amp;',
+               "'" => '&apos;',
+               '"' => '&quot;',
+             );
+  CDATA_START   = "<![CDATA[";
+  CDATA_END     = "]]>";
+  PI_START      = "<?";
+  PI_END        = "?>";
+  COMMENT_START = "<!--";
+  COMMENT_END   = "-->";
+
+pretty print styles
+
+  ( $NSGMLS, $NICE, $INDENTED, $RECORD1, $RECORD2)= (1..5);
+
+empty tag output style
+
+  ( $HTML, $EXPAND)= (1..2);
+
+=item Module scoped values: might be changed
+
+Most of these deal with pretty printing, so the worst that can
+happen is probably that XML output does not look right, but is
+still valid and processed identically by XML processors.
+
+C<$empty_tag_style> can mess up HTML bowsers though and changing C<$ID> 
+would most likely create problems.
+
+  $pretty=0;           # pretty print style
+  $quote='"';          # quote for attributes
+  $INDENT= '  ';       # indent for indented pretty print
+  $empty_tag_style= 0; # how to display empty tags
+  $ID                  # attribute used as a gi ('id' by default)
+
+=item Module scoped values: definitely changed
+
+These 2 variables are used to replace gi's by an index, thus 
+saving some space when creating a twig. If they really cause
+you too much trouble, let me know, it is probably possible to
+create either a switch or at least a version of XML::Twig that 
+does not perform this optimisation.
+
+  %gi2index;     # gi => index
+  @index2gi;     # list of gi's
+
+=back
+
+If you need to manipulate all those values, you can use the following methods on the
+XML::Twig object:
+
+=over 4
+
+=item global_state
+
+Return a hasref with all the global variables used by XML::Twig
+
+The hash has the following fields:  C<pretty>, C<quote>, C<indent>, 
+C<empty_tag_style>, C<keep_encoding>, C<expand_external_entities>, 
+C<output_filter>, C<output_text_filter>, C<keep_atts_order>
+
+=item set_global_state ($state)
+
+Set the global state, C<$state> is a hashref
+
+=item save_global_state
+
+Save the current global state
+
+=item restore_global_state
+
+Restore the previously saved (using C<Lsave_global_state>> state
+
+=back
+
+=head1 TODO 
+
+=over 4
+
+=item SAX handlers
+
+Allowing XML::Twig to work on top of any SAX parser
+
+=item multiple twigs are not well supported
+
+A number of twig features are just global at the moment. These include
+the ID list and the "gi pool" (if you use C<change_gi> then you change the gi 
+for ALL twigs).
+
+A future version will try to support this while trying not to be to
+hard on performance (at least when a single twig is used!).
+
+
+=back
+
+
+=head1 AUTHOR
+
+Michel Rodriguez <mirod@xmltwig.com>
+
+=head1 LICENSE
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+Bug reports should be sent using:
+F<RTL<http://rt.cpan.org/NoAuth/Bugs.html?Dist=XML-Twig>>
+
+Comments can be sent to mirod@xmltwig.com
+
+The XML::Twig page is at L<http://www.xmltwig.com/xmltwig/>
+It includes the development version of the module, a slightly better version 
+of the documentation, examples, a tutorial and a: 
+F<Processing XML efficiently with Perl and XML::Twig: 
+L<http://www.xmltwig.com/xmltwig/tutorial/index.html>>
+
+=head1 SEE ALSO
+
+XML::Parser,XML::Parser::Expat, Encode, Text::Iconv, Scalar::Utils
+
+
+=cut
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Variable.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Variable.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/Variable.pm	(revision 24799)
@@ -0,0 +1,43 @@
+# $Id: Variable.pm 7909 2004-08-06 05:11:55Z mdewsnip $
+
+package XML::XPath::Variable;
+use strict;
+
+# This class does NOT contain 1 instance of a variable
+# see the XML::XPath::Parser class for the instances
+# This class simply holds the name of the var
+
+sub new {
+    my $class = shift;
+    my ($pp, $name) = @_;
+    bless { name => $name, path_parser => $pp }, $class;
+}
+
+sub as_string {
+    my $self = shift;
+    '\$' . $self->{name};
+}
+
+sub as_xml {
+    my $self = shift;
+    return "<Variable>" . $self->{name} . "</Variable>\n";
+}
+
+sub get_value {
+    my $self = shift;
+    $self->{path_parser}->get_var($self->{name});
+}
+
+sub set_value {
+    my $self = shift;
+    my ($val) = @_;
+    $self->{path_parser}->set_var($self->{name}, $val);
+}
+
+sub evaluate {
+    my $self = shift;
+    my $val = $self->get_value;
+    return $val;
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/XMLParser.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/XMLParser.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/XML/XPath/XMLParser.pm	(revision 24799)
@@ -0,0 +1,385 @@
+# $Id: XMLParser.pm 7909 2004-08-06 05:11:55Z mdewsnip $
+
+package XML::XPath::XMLParser;
+
+use strict;
+
+use XML::Parser;
+#use XML::XPath;
+use XML::XPath::Node;
+use XML::XPath::Node::Element;
+use XML::XPath::Node::Text;
+use XML::XPath::Node::Comment;
+use XML::XPath::Node::PI;
+use XML::XPath::Node::Attribute;
+use XML::XPath::Node::Namespace;
+
+my @options = qw(
+        filename
+        xml
+        parser
+        ioref
+        );
+
+my ($_current, $_namespaces_on);
+my %IdNames;
+
+use vars qw/$xmlns_ns $xml_ns/;
+
+$xmlns_ns = "http://www.w3.org/2000/xmlns/";
+$xml_ns = "http://www.w3.org/XML/1998/namespace";
+
+sub new {
+    my $proto = shift;
+    my $class = ref($proto) || $proto;
+    my %args = @_;
+    my %hash = map(( "_$_" => $args{$_} ), @options);
+    bless \%hash, $class;
+}
+
+sub parse {
+    my $self = shift;
+    
+    $self->{IdNames} = {};
+    $self->{InScopeNamespaceStack} = [ { 
+            '_Default' => undef,
+            'xmlns' => $xmlns_ns,
+            'xml' => $xml_ns,
+        } ];
+    
+    $self->{NodeStack} = [ ];
+    
+    $self->set_xml($_[0]) if $_[0];
+    
+    my $parser = $self->get_parser || XML::Parser->new(
+            ErrorContext => 2,
+            ParseParamEnt => 1,
+            );
+    
+    $parser->setHandlers(
+            Init => sub { $self->parse_init(@_) },
+            Char => sub { $self->parse_char(@_) },
+            Start => sub { $self->parse_start(@_) },
+            End => sub { $self->parse_end(@_) },
+            Final => sub { $self->parse_final(@_) },
+            Proc => sub { $self->parse_pi(@_) },
+            Comment => sub { $self->parse_comment(@_) },
+            Attlist => sub { $self->parse_attlist(@_) },
+            );
+    
+    my $toparse;
+    if ($toparse = $self->get_filename) {
+        return $parser->parsefile($toparse);
+    }
+    else {
+        return $parser->parse($self->get_xml || $self->get_ioref);
+    }
+}
+
+sub parsefile {
+    my $self = shift;
+    my ($filename) = @_;
+    $self->set_filename($filename);
+    $self->parse;
+}
+
+sub parse_init {
+    my $self = shift;
+    my $e = shift;
+    my $document = XML::XPath::Node::Element->new();
+    my $newns = XML::XPath::Node::Namespace->new('xml', $xml_ns);
+    $document->appendNamespace($newns);
+    $self->{current} = $self->{DOC_Node} = $document;
+}
+
+sub parse_final {
+    my $self = shift;
+    return $self->{DOC_Node};
+}
+
+sub parse_char {
+    my $self = shift;
+    my $e = shift;
+    my $text = shift;
+    
+    my $parent = $self->{current};
+    
+    my $last = $parent->getLastChild;
+    if ($last && $last->isTextNode) {
+        # append to previous text node
+        $last->appendText($text);
+        return;
+    }
+    
+    my $node = XML::XPath::Node::Text->new($text);
+    $parent->appendChild($node, 1);
+}
+
+sub parse_start {
+    my $self = shift;
+    my $e = shift;
+    my $tag = shift;
+    
+    push @{ $self->{InScopeNamespaceStack} },
+         { %{ $self->{InScopeNamespaceStack}[-1] } };
+    $self->_scan_namespaces(@_);
+    
+    my ($prefix, $namespace) = $self->_namespace($tag);
+    
+    my $node = XML::XPath::Node::Element->new($tag, $prefix);
+    
+    my @attributes;
+    for (my $ii = 0; $ii < $#_; $ii += 2) {
+	my ($name, $value) = ($_[$ii], $_[$ii+1]);
+        if ($name =~ /^xmlns(:(.*))?$/) {
+            # namespace node
+            my $prefix = $2 || '#default';
+#            warn "Creating NS node: $prefix = $value\n";
+            my $newns = XML::XPath::Node::Namespace->new($prefix, $value);
+            $node->appendNamespace($newns);
+        }
+        else {
+	    my ($prefix, $namespace) = $self->_namespace($name);
+            undef $namespace unless $prefix;
+
+            my $newattr = XML::XPath::Node::Attribute->new($name, $value, $prefix);
+            $node->appendAttribute($newattr, 1);
+            if (exists($self->{IdNames}{$tag}) && ($self->{IdNames}{$tag} eq $name)) {
+    #            warn "appending Id Element: $val for ", $node->getName, "\n";
+                $self->{DOC_Node}->appendIdElement($value, $node);
+            }
+        }
+    }
+        
+    $self->{current}->appendChild($node, 1);
+    $self->{current} = $node;
+}
+
+sub parse_end {
+    my $self = shift;
+    my $e = shift;
+    $self->{current} = $self->{current}->getParentNode;
+}
+
+sub parse_pi {
+    my $self = shift;
+    my $e = shift;
+    my ($target, $data) = @_;
+    my $node = XML::XPath::Node::PI->new($target, $data);
+    $self->{current}->appendChild($node, 1);
+}
+
+sub parse_comment {
+    my $self = shift;
+    my $e = shift;
+    my ($data) = @_;
+    my $node = XML::XPath::Node::Comment->new($data);
+    $self->{current}->appendChild($node, 1);
+}
+
+sub parse_attlist {
+    my $self = shift;
+    my $e = shift;
+    my ($elname, $attname, $type, $default, $fixed) = @_;
+    if ($type eq 'ID') {
+        $self->{IdNames}{$elname} = $attname;
+    }
+}
+
+sub _scan_namespaces {
+    my ($self, %attributes) = @_;
+
+    while (my ($attr_name, $value) = each %attributes) {
+	if ($attr_name eq 'xmlns') {
+	    $self->{InScopeNamespaceStack}[-1]{'_Default'} = $value;
+	} elsif ($attr_name =~ /^xmlns:(.*)$/) {
+	    my $prefix = $1;
+	    $self->{InScopeNamespaceStack}[-1]{$prefix} = $value;
+	}
+    }
+}
+
+sub _namespace {
+    my ($self, $name) = @_;
+
+    my ($prefix, $localname) = split(/:/, $name);
+    if (!defined($localname)) {
+	if ($prefix eq 'xmlns') {
+	    return '', undef;
+	} else {
+	    return '', $self->{InScopeNamespaceStack}[-1]{'_Default'};
+	}
+    } else {
+	return $prefix, $self->{InScopeNamespaceStack}[-1]{$prefix};
+    }
+}
+
+sub as_string {
+    my $node = shift;
+    $node->toString;
+}
+
+sub get_parser { shift->{_parser}; }
+sub get_filename { shift->{_filename}; }
+sub get_xml { shift->{_xml}; }
+sub get_ioref { shift->{_ioref}; }
+
+sub set_parser { $_[0]->{_parser} = $_[1]; }
+sub set_filename { $_[0]->{_filename} = $_[1]; }
+sub set_xml { $_[0]->{_xml} = $_[1]; }
+sub set_ioref { $_[0]->{_ioref} = $_[1]; }
+
+1;
+
+__END__
+
+=head1 NAME
+
+XML::XPath::XMLParser - The default XML parsing class that produces a node tree
+
+=head1 SYNOPSIS
+
+    my $parser = XML::XPath::XMLParser->new(
+                filename => $self->get_filename,
+                xml => $self->get_xml,
+                ioref => $self->get_ioref,
+                parser => $self->get_parser,
+            );
+    my $root_node = $parser->parse;
+
+=head1 DESCRIPTION
+
+This module generates a node tree for use as the context node for XPath processing.
+It aims to be a quick parser, nothing fancy, and yet has to store more information
+than most parsers. To achieve this I've used array refs everywhere - no hashes.
+I don't have any performance figures for the speedups achieved, so I make no
+appologies for anyone not used to using arrays instead of hashes. I think they
+make good sense here where we know the attributes of each type of node.
+
+=head1 Node Structure
+
+All nodes have the same first 2 entries in the array: node_parent
+and node_pos. The type of the node is determined using the ref() function.
+The node_parent always contains an entry for the parent of the current
+node - except for the root node which has undef in there. And node_pos is the
+position of this node in the array that it is in (think: 
+$node == $node->[node_parent]->[node_children]->[$node->[node_pos]] )
+
+Nodes are structured as follows:
+
+=head2 Root Node
+
+The root node is just an element node with no parent.
+
+    [
+      undef, # node_parent - check for undef to identify root node
+      undef, # node_pos
+      undef, # node_prefix
+      [ ... ], # node_children (see below)
+    ]
+
+=head2 Element Node
+
+    [
+      $parent, # node_parent
+      <position in current array>, # node_pos
+      'xxx', # node_prefix - namespace prefix on this element
+      [ ... ], # node_children
+      'yyy', # node_name - element tag name
+      [ ... ], # node_attribs - attributes on this element
+      [ ... ], # node_namespaces - namespaces currently in scope
+    ]
+
+=head2 Attribute Node
+
+    [
+      $parent, # node_parent - the element node
+      <position in current array>, # node_pos
+      'xxx', # node_prefix - namespace prefix on this element
+      'href', # node_key - attribute name
+      'ftp://ftp.com/', # node_value - value in the node
+    ]
+
+=head2 Namespace Nodes
+
+Each element has an associated set of namespace nodes that are currently
+in scope. Each namespace node stores a prefix and the expanded name (retrieved
+from the xmlns:prefix="..." attribute).
+
+    [
+      $parent,
+      <pos>,
+      'a', # node_prefix - the namespace as it was written as a prefix
+      'http://my.namespace.com', # node_expanded - the expanded name.
+    ]
+
+=head2 Text Nodes
+
+    [
+      $parent,
+      <pos>,
+      'This is some text' # node_text - the text in the node
+    ]
+
+=head2 Comment Nodes
+
+    [
+      $parent,
+      <pos>,
+      'This is a comment' # node_comment
+    ]
+
+=head2 Processing Instruction Nodes
+
+    [
+      $parent,
+      <pos>,
+      'target', # node_target
+      'data', # node_data
+    ]
+
+=head1 Usage
+
+If you feel the need to use this module outside of XML::XPath (for example
+you might use this module directly so that you can cache parsed trees), you
+can follow the following API:
+
+=head2 new
+
+The new method takes either no parameters, or any of the following parameters:
+
+        filename
+        xml
+        parser
+        ioref
+
+This uses the familiar hash syntax, so an example might be:
+
+    use XML::XPath::XMLParser;
+    
+    my $parser = XML::XPath::XMLParser->new(filename => 'example.xml');
+
+The parameters represent a filename, a string containing XML, an XML::Parser
+instance and an open filehandle ref respectively. You can also set or get all
+of these properties using the get_ and set_ functions that have the same
+name as the property: e.g. get_filename, set_ioref, etc.
+
+=head2 parse
+
+The parse method generally takes no parameters, however you are free to
+pass either an open filehandle reference or an XML string if you so require.
+The return value is a tree that XML::XPath can use. The parse method will
+die if there is an error in your XML, so be sure to use perl's exception
+handling mechanism (eval{};) if you want to avoid this.
+
+=head2 parsefile
+
+The parsefile method is identical to parse() except it expects a single
+parameter that is a string naming a file to open and parse. Again it
+returns a tree and also dies if there are XML errors.
+
+=head1 NOTICES
+
+This file is distributed as part of the XML::XPath module, and is copyright
+2000 Fastnet Software Ltd. Please see the documentation for the module as a
+whole for licencing information.
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/auto/Image/Size/autosplit.ix
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/auto/Image/Size/autosplit.ix	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/cpan/auto/Image/Size/autosplit.ix	(revision 24799)
@@ -0,0 +1,29 @@
+# Index created by AutoSplit for lib/Image/Size.pm
+#    (file acts as timestamp)
+package Image::Size;
+sub gifsize 
+;
+sub xbmsize 
+;
+sub xpmsize 
+;
+sub pngsize 
+;
+sub mngsize 
+;
+sub jpegsize 
+;
+sub ppmsize 
+;
+sub tiffsize  ;
+sub bmpsize 
+;
+sub psdsize 
+;
+sub swfsize 
+;
+sub pcdsize 
+;
+sub swfmxsize 
+;
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/dbutil/gdbm.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/dbutil/gdbm.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/dbutil/gdbm.pm	(revision 24799)
@@ -0,0 +1,266 @@
+###########################################################################
+#
+# dbutil::gdbm -- utility functions for writing to gdbm databases
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2009
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package dbutil::gdbm;
+
+use strict;
+
+use dbutil::gdbmtxtgz;
+
+# -----------------------------------------------------------------------------
+#   GDBM IMPLEMENTATION
+# -----------------------------------------------------------------------------
+
+sub open_infodb_write_handle
+{
+  my $infodb_file_path = shift(@_);
+  my $opt_append = shift(@_);
+
+  # note the use of locking enabled txt2db [jmt12]
+  # also, we assume the path is correct to find the executable [jmt12]
+  my $txt2db_exe = "txt2dbl" . &util::get_os_exe();
+  #my $txt2db_exe = "txt2db" . &util::get_os_exe();
+  my $infodb_file_handle = undef;
+  my $cmd = "\"$txt2db_exe\"";
+  if ((defined $opt_append) && ($opt_append eq "append")) {
+      $cmd .= " -append";
+  }
+  $cmd .= " \"$infodb_file_path\"";
+
+  # Why? Why do you hate me? [jmt12]
+#  if (!-e "$txt2db_exe")
+#  {
+#      print STDERR "Error: Unable to find $txt2db_exe\n";
+#      return undef;
+#  }
+
+  if(!open($infodb_file_handle, "| $cmd"))
+  {
+
+      print STDERR "Error: Failed to open pipe to $cmd\n";
+      print STDERR "       $!\n";
+      return undef;
+  }
+
+  binmode($infodb_file_handle,":utf8");
+
+  return $infodb_file_handle;
+}
+
+
+
+sub close_infodb_write_handle
+{
+  my $infodb_handle = shift(@_);
+  close($infodb_handle);
+}
+
+
+sub get_infodb_file_path
+{
+  my $collection_name = shift(@_);
+  my $infodb_directory_path = shift(@_);
+
+  my $infodb_file_extension = ".gdb";
+  my $infodb_file_name = &util::get_dirsep_tail($collection_name) . $infodb_file_extension;
+  return &util::filename_cat($infodb_directory_path, $infodb_file_name);
+}
+
+
+sub read_infodb_file
+{
+  my $infodb_file_path = shift(@_);
+  my $infodb_map = shift(@_);
+
+  # note the use of locking enabled db2txt [jmt12]
+  open (PIPEIN, "db2txtl \"$infodb_file_path\" |") 
+      || die "couldn't open pipe from db2txt \$infodb_file_path\"\n";
+
+  binmode(PIPEIN,":utf8");
+
+  my $infodb_line = "";
+  my $infodb_key = "";
+  my $infodb_value = "";
+  while (defined ($infodb_line = <PIPEIN>))
+  {
+    if ($infodb_line =~ /^\[([^\]]+)\]$/)
+    {
+      $infodb_key = $1;
+    }
+    elsif ($infodb_line =~ /^-{70}$/)
+    {
+      $infodb_map->{$infodb_key} = $infodb_value;
+      $infodb_key = "";
+      $infodb_value = "";
+    }
+    else
+    {
+      $infodb_value .= $infodb_line;
+    }
+  }
+
+  close (PIPEIN);
+}
+
+sub read_infodb_keys
+{
+  my $infodb_file_path = shift(@_);
+  my $infodb_map = shift(@_);
+
+  die("[gdbmkeys] not implemented for parallel building");
+
+  open (PIPEIN, "gdbmkeys \"$infodb_file_path\" |") 
+      || die "couldn't open pipe from gdbmkeys \$infodb_file_path\"\n";
+
+  binmode(PIPEIN,":utf8");
+
+  my $infodb_line = "";
+  my $infodb_key = "";
+  my $infodb_value = "";
+  while (defined ($infodb_line = <PIPEIN>))
+  {
+      chomp $infodb_line; # remove end of line 
+
+      $infodb_map->{$infodb_line} = 1;
+  }
+
+  close (PIPEIN);
+}
+
+sub write_infodb_entry
+{
+  # With infodb_handle already set up, works the same as _gdbm_txtgz version
+  &dbutil::gdbmtxtgz::write_infodb_entry(@_);
+}
+
+sub write_infodb_rawentry
+{
+  # With infodb_handle already set up, works the same as _gdbm_txtgz version
+  &dbutil::gdbmtxtgz::write_infodb_rawentry(@_);
+}
+
+
+sub set_infodb_entry_OLD
+{
+    my $infodb_file_path = shift(@_);
+    my $infodb_key = shift(@_);
+    my $infodb_map = shift(@_);
+  
+    # Protect metadata values that go inside quotes for gdbmset
+    foreach my $k (keys %$infodb_map) {
+	  my @escaped_v = ();
+	  foreach my $v (@{$infodb_map->{$k}}) {
+	    if ($k eq "contains") {
+		  # protect quotes in ".2;".3 etc
+		  $v =~ s/\"/\\\"/g;
+		  push(@escaped_v, $v);
+	    }
+	    else {
+		  my $ev = &ghtml::unescape_html($v);
+		  $ev =~ s/\"/\\\"/g;
+		  push(@escaped_v, $ev);
+	    }
+	  }
+	  $infodb_map->{$k} = \@escaped_v;
+	}
+	
+    # Generate the record string
+    my $serialized_infodb_map = &dbutil::convert_infodb_hash_to_string($infodb_map);
+##    print STDERR "**** ser dr\n$serialized_infodb_map\n\n\n";
+
+    die("[gdbmset] not implemented for parallel building");
+
+    # Store it into GDBM
+    my $cmd = "gdbmset \"$infodb_file_path\" \"$infodb_key\" \"$serialized_infodb_map\"";
+    my $status = system($cmd);
+
+    return $status;
+  
+}
+
+
+
+sub set_infodb_entry
+{
+    my $infodb_file_path = shift(@_);
+    my $infodb_key = shift(@_);
+    my $infodb_map = shift(@_);
+  
+    # HTML escape anything that is not part of the "contains" metadata value
+    foreach my $k (keys %$infodb_map) {
+	  my @escaped_v = ();
+	  foreach my $v (@{$infodb_map->{$k}}) {
+	    if ($k eq "contains") {
+		  push(@escaped_v, $v);
+	    }
+	    else {
+		  my $ev = &ghtml::unescape_html($v);
+		  push(@escaped_v, $ev);
+	    }
+	  }
+	  $infodb_map->{$k} = \@escaped_v;
+	}
+	
+    # Generate the record string
+    my $serialized_infodb_map = &dbutil::convert_infodb_hash_to_string($infodb_map);
+###    print STDERR "**** ser dr\n$serialized_infodb_map\n\n\n";
+
+    # Store it into GDBM using 'txt2db -append' which despite its name
+    # actually replaces the record if it already exists
+
+    # note the use of locking enabled txt2db [jmt12]
+    my $cmd = "txt2dbl -append \"$infodb_file_path\"";
+
+    my $status = undef;
+    if(!open(GOUT, "| $cmd"))
+    {
+	print STDERR "Error: gdbm::set_infodb_entry() failed to open pipe to: $cmd\n";
+	print STDERR "       $!\n";
+	$status = -1;
+    }
+    else {
+	binmode(GOUT,":utf8");
+	
+	print GOUT "[$infodb_key]\n";
+	print GOUT "$serialized_infodb_map\n";
+
+	close(GOUT);
+	$status = 0; # as in exit status of cmd OK
+    }
+
+    return $status;  
+}
+
+
+sub delete_infodb_entry
+{
+  # With infodb_handle already set up, works the same as _gdbm_txtgz version
+  &dbutil::gdbmtxtgz::delete_infodb_entry(@_);
+}
+
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/dbutil/gdbmserver.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/dbutil/gdbmserver.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/dbutil/gdbmserver.pm	(revision 24799)
@@ -0,0 +1,345 @@
+###########################################################################
+#
+# dbutil::gdbmserver -- utility functions for writing to gdbm databases but
+#                       implemented as a server with a single, persistent
+#                       connection
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2009
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package dbutil::gdbmserver;
+
+use strict;
+use warnings;
+
+# We're going to have to delve into locking (a little) to prevent multiple
+# threads trying to launch the server at once
+use Fcntl qw(:flock);
+
+use GDBMClient;
+use util;
+
+my $hyphen70 = '-' x 70;
+my $debug = 0;
+
+# We have a global reference to all of the GDBM Server lockfiles that this
+# instance has created (as we'll be responsible for closing them)
+my %created_server_lockfile_paths;
+# Keep track of the lockfiles for server we have added ourselves as listeners
+# to.
+my %listener_server_lockfile_paths;
+# We also have a global of all of the listeners we have assigned as we'll
+# be responsible for removing them.
+my %registered_listeners;
+
+sub _spawnClient
+{
+  my ($infodb_file_path) = @_;
+  # 1. Check whether the server is already running by trying to locate the
+  #    server 'lock' file.
+  my ($infodb_file, $extension) = $infodb_file_path =~ /([^\\\/]+)\.(db|gdb)/i;
+  my $server_lockfile_path =  &util::filename_cat($ENV{'GSDLHOME'},'tmp','gdbmserver-' . $infodb_file . '.lock');
+  #rint " * Searching for lockfile: " . $server_lockfile_path . "\n";
+  # We need to lock here to ensure only one thread enters the following code,
+  # sees a missing GDBMServer, and launches it
+  my $tmp_lockfile_path = &util::filename_cat($ENV{'GSDLHOME'},'tmp','dbutil-gdbmserver.lock');
+  open(TMPFH, '>', $tmp_lockfile_path) or die ("Error! Failed to open file for writing: " . $tmp_lockfile_path . "\nReason: " . $! . "\n");
+  flock(TMPFH, LOCK_EX) or die("Error! Cannot lock file exclusively: " . $tmp_lockfile_path . "\nReason: " . $! . "\n");
+  print TMPFH localtime();
+  # - If the file doesn't exist...
+  if (!-e $server_lockfile_path)
+  {
+    # ...start it!
+    my $launch_cmd = 'GDBMServer.pl "' . $$ . '" "' . $infodb_file_path . '"';
+    print "* Starting GDBMServer for: " . $infodb_file_path . "\n";
+    # @note I once had the below pipe ending with 2>&1 |, but that then blocks
+    #       indefinitely when looping and reading <SERVERIN>.
+    open(SERVERIN, $launch_cmd . ' |') or die("Error! Failed to run launch command: " . $launch_cmd . "\nReason: " . $! . "\n");
+    # read all the output from the server
+    my $line = '';
+    my $server_lock_file_created = 0;
+    while ($line = <SERVERIN>)
+    {
+      # - watch for the line indicating a lock file has been created and
+      #   populated with a sexy port number
+      if ($line =~ /Server now listening/)
+      {
+        $server_lock_file_created = 1;
+      }
+      # - we could also watch for errors here
+      if ($debug)
+      {
+        if ($line !~ /\n/)
+        {
+          $line .= "\n";
+        }
+        $|++; # autoflush
+        print "[gdbmserver] $line";
+        $|--; # disable autoflush
+      }
+    }
+    close(SERVERIN);
+    if (!$server_lock_file_created)
+    {
+      die("Error! GDBMServer failed to create lock file. Check server logs.");
+    }
+    # record this for later
+    $created_server_lockfile_paths{$server_lockfile_path} = 1;
+  }
+  flock(TMPFH, LOCK_UN);
+  close($tmp_lockfile_path);
+  unlink($tmp_lockfile_path);
+  # record this for later
+  $listener_server_lockfile_paths{$server_lockfile_path} = $infodb_file_path;
+  return GDBMClient->new($server_lockfile_path);
+}
+
+END
+{
+  # we ask the server to shutdown, but only the 'creator' thread will actually
+  # be able to, and only once all listeners have deregistered.
+  foreach my $server_lockfile_path (keys (%listener_server_lockfile_paths))
+  {
+    my $infodb_file_path = $listener_server_lockfile_paths{$server_lockfile_path};
+    my $gdbm_client_handle = GDBMClient->new($server_lockfile_path);
+    # Deregister all of our registered listeners
+    foreach my $listener_suffix (keys(%registered_listeners))
+    {
+      $gdbm_client_handle->removeListener($listener_suffix);
+    }
+    # ask the servers we created to shut down (all other threads will have
+    # this request ignored)
+    if (defined $created_server_lockfile_paths{$infodb_file_path})
+    {
+      print "* Attempting to stop GDBMServer for: " . $infodb_file_path . "\n";
+    }
+    $gdbm_client_handle->query('!stop:' . $$);
+  }
+  # we should now wait until all of our server_lockfiles have actually been
+  # removed (otherwise people could mistakenly run import/build again
+  # immediately and things *might* go pearshaped).
+  foreach my $server_lockfile_path (keys (%created_server_lockfile_paths))
+  {
+    # While the file exists, we should wait
+    print "* Waiting for GDBMServer [" . $server_lockfile_path . "] to exit...";
+    if (-e $server_lockfile_path)
+    {
+      while (-e $server_lockfile_path)
+      {
+        print ".";
+        sleep(1);
+      }
+    }
+    print " Done!\n";
+  }
+}
+
+# -----------------------------------------------------------------------------
+#   GDBM SERVER IMPLEMENTATION
+# -----------------------------------------------------------------------------
+sub open_infodb_write_handle
+{
+  my $infodb_file_path = shift(@_);
+  my $opt_append = shift(@_);
+  if (defined $opt_append && $opt_append ne "append")
+  {
+    print "Warning! GDBM modes other than 'append' not supported for GDBMServer.\n";
+  }
+  my $gdbm_client_handle = &_spawnClient($infodb_file_path);
+  # Register this client on the server if necessary
+  $gdbm_client_handle->addListener('w');
+  $registered_listeners{'w'} = 1;
+  # and pass the handle to client around
+  return $gdbm_client_handle;
+}
+
+# /** Destructor or near enough.
+#  /*
+sub close_infodb_write_handle
+{
+  my $gdbm_client_handle = shift(@_);
+}
+# /** close_infodb_write_handle($infodb_handle) **/
+
+# /** @function get_info_db_file_path
+#  *  Exactly the same as vanilla GDBM - as we are still using a GDBM database
+#  *  just accessing it via a persistant server
+#  */
+sub get_infodb_file_path
+{
+  my $collection_name = shift(@_);
+  my $infodb_directory_path = shift(@_);
+  my $create_server = shift(@_);
+
+  my $infodb_file_extension = ".gdb";
+  my $infodb_file_name = &util::get_dirsep_tail($collection_name) . $infodb_file_extension;
+  my $infodb_file_path = &util::filename_cat($infodb_directory_path, $infodb_file_name);
+
+  # Special Case for GDBMServer
+  if (defined $create_server && $create_server == 1)
+  {
+    my $gdbm_client_handle = &_spawnClient($infodb_file_path);
+    # Register this client on the server if necessary
+    $gdbm_client_handle->addListener('i');
+    $registered_listeners{'i'} = 1;
+  }
+
+  # Resuming our regular programming
+  return $infodb_file_path;
+}
+
+sub read_infodb_file
+{
+  my $infodb_file_path = shift(@_);
+  my $infodb_map = shift(@_);
+  my $gdbm_client_handle = &_spawnClient($infodb_file_path);
+  $gdbm_client_handle->addListener('r');
+  $registered_listeners{'r'} = 1;
+  # retrieves all the keys in the form:
+  # [key1]\n[key2]\n[key3]\n...[keyn]
+  my $raw_infodb_keys = $gdbm_client_handle->query('[*]?');
+
+  my @infodb_keys = split(/\r?\n/, $raw_infodb_keys);
+  foreach my $infodb_key (@infodb_keys)
+  {
+    if ($infodb_key =~ /.+/ && $infodb_key !~ /-{70}/)
+    {
+      # lookup each key
+      my $infodb_value = $gdbm_client_handle->query('[' . $infodb_key . ']?');
+      # store it
+      $infodb_map->{$infodb_key} = $infodb_value;
+    }
+  }
+}
+
+sub read_infodb_keys
+{
+  my $infodb_file_path = shift(@_);
+  my $infodb_map = shift(@_);
+  # spawn client (creating server as necessary)
+  my $gdbm_client_handle = &_spawnClient($infodb_file_path);
+  # register ourself as listener
+  $gdbm_client_handle->addListener('k');
+  $registered_listeners{'k'} = 1;
+  # retrieves all the keys in the form:
+  # [key1]\n[key2]\n[key3]\n...[keyn]
+  my $raw_infodb_keys = $gdbm_client_handle->query('[*]?');
+  my @infodb_keys = split(/\r?\n/, $raw_infodb_keys);
+  foreach my $infodb_key (@infodb_keys)
+  {
+    if ($infodb_key =~ /.+/ && $infodb_key !~ /-{70}/)
+    {
+      $infodb_map->{$infodb_key} = 1;
+    }
+  }
+}
+
+sub write_infodb_entry
+{
+  my $gdbm_client_handle = shift(@_);
+  my $infodb_key = shift(@_);
+  my $infodb_map = shift(@_);
+  # - build up the gdbm command
+  my $gdbm_command = "[" . $infodb_key . "]+\n";
+  foreach my $infodb_value_key (keys(%$infodb_map))
+  {
+    foreach my $infodb_value (@{$infodb_map->{$infodb_value_key}})
+    {
+      if ($infodb_value =~ /-{70,}/)
+      {
+        # if value contains 70 or more hyphens in a row we need to escape them
+        # to prevent txt2db from treating them as a separator
+        $infodb_value =~ s/-/&\#045;/gi;
+      }
+      $gdbm_command .= "<" . $infodb_value_key . ">" . $infodb_value . "\n";
+    }
+  }
+  $gdbm_command .= $hyphen70 . "\n";
+  # - ask the client to transmit the command to the server
+  $gdbm_client_handle->query($gdbm_command);
+}
+
+sub write_infodb_rawentry
+{
+  my $gdbm_client_handle = shift(@_);
+  my $infodb_key = shift(@_);
+  my $infodb_val = shift(@_);
+  # - build up the gdbm command
+  my $gdbm_command = "[" . $infodb_key . "]\n";
+  $gdbm_command .= $infodb_val . "\n";
+  $gdbm_command .= $hyphen70 . "\n";
+  # - ask the client to transmit the command to the server
+  $gdbm_client_handle->query($gdbm_command);
+  return 1;
+}
+
+sub set_infodb_entry
+{
+  my $infodb_file_path = shift(@_);
+  my $infodb_key = shift(@_);
+  my $infodb_map = shift(@_);
+  # spawn client (creating server as necessary)
+  my $gdbm_client_handle = &_spawnClient($infodb_file_path);
+  $gdbm_client_handle->addListener('s');
+  $registered_listeners{'s'} = 1;
+  # Protect metadata values that go inside quotes for gdbmset
+  foreach my $k (keys %$infodb_map)
+  {
+    my @escaped_v = ();
+    foreach my $v (@{$infodb_map->{$k}})
+    {
+      if ($k eq "contains")
+      {
+        # protect quotes in ".2;".3 etc
+        $v =~ s/\"/\\\"/g;
+        push(@escaped_v, $v);
+      }
+      else
+      {
+        my $ev = &ghtml::unescape_html($v);
+        $ev =~ s/\"/\\\"/g;
+        push(@escaped_v, $ev);
+      }
+    }
+    $infodb_map->{$k} = \@escaped_v;
+  }
+  # Generate the record string (GDBM command)
+  my $gdbm_command = "[" . $infodb_key . "]\n";
+  $gdbm_command .= &dbutil::convert_infodb_hash_to_string($infodb_map) . "\n";
+  $gdbm_command .= $hyphen70 . "\n";
+  # Send command to server
+  $gdbm_client_handle->query($gdbm_command);
+}
+
+sub delete_infodb_entry
+{
+  my $gdbm_client_handle = shift(@_);
+  my $infodb_key = shift(@_);
+  # - create command
+  my $gdbm_command = "[" . $infodb_key . "]-\n";
+  # - and send
+  $gdbm_client_handle->query($gdbm_command);
+}
+
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/dbutil/gdbmtxtgz.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/dbutil/gdbmtxtgz.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/dbutil/gdbmtxtgz.pm	(revision 24799)
@@ -0,0 +1,213 @@
+###########################################################################
+#
+# dbutil::gdbmtxtgz -- utility functions for writing to gdbm-txtgz databases
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2009
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package dbutil::gdbmtxtgz;
+
+use strict;
+
+
+
+# -----------------------------------------------------------------------------
+#   GDBM TXT-GZ IMPLEMENTATION
+# -----------------------------------------------------------------------------
+
+sub open_infodb_write_handle
+{
+  # Keep infodb in GDBM neutral form => save data as compressed text file, 
+  # read for txt2db to be run on it later (i.e. by the runtime system,
+  # first time the collection is ever accessed).  This makes it easier
+  # distribute pre-built collections to various architectures.
+  #
+  # NB: even if two architectures are little endian (e.g. Intel and 
+  # ARM procesors) GDBM does *not* guarantee that the database generated on 
+  # one will work on the other
+
+  my $infodb_file_path = shift(@_);
+
+  # Greenstone ships with gzip for windows, on $PATH
+
+  my $infodb_file_handle = undef;
+  if (!open($infodb_file_handle, "| gzip - > \"$infodb_file_path\""))
+  {
+      print STDERR "Error: Failed to open pipe to gzip - > \"$infodb_file_path\"\n";
+      print STDERR "       $!\n";
+      return undef;
+  }
+  binmode($infodb_file_handle,":utf8");
+  return $infodb_file_handle;
+}
+
+
+sub close_infodb_write_handle
+{
+  my $infodb_handle = shift(@_);
+
+  close($infodb_handle);
+}
+
+
+sub get_infodb_file_path
+{
+  my $collection_name = shift(@_);
+  my $infodb_directory_path = shift(@_);
+
+  my $infodb_file_name = &util::get_dirsep_tail($collection_name).".txt.gz";
+  return &util::filename_cat($infodb_directory_path, $infodb_file_name);
+}
+
+
+sub read_infodb_file
+{
+  my $infodb_file_path = shift(@_);
+  my $infodb_map = shift(@_);
+
+  my $cmd = "gzip --decompress --to-stdout \"$infodb_file_path\"";
+
+  open (PIPEIN, "$cmd |") 
+  || die "Error: Couldn't open pipe from gzip: $!\n  $cmd\n";
+
+  binmode(PIPEIN,":utf8");
+  my $infodb_line = "";
+  my $infodb_key = "";
+  my $infodb_value = "";
+  while (defined ($infodb_line = <PIPEIN>))
+  {
+    if ($infodb_line =~ /^\[([^\]]+)\]$/)
+    {
+      $infodb_key = $1;
+    }
+    elsif ($infodb_line =~ /^-{70}$/)
+    {
+      $infodb_map->{$infodb_key} = $infodb_value;
+      $infodb_key = "";
+      $infodb_value = "";
+    }
+    else
+    {
+      $infodb_value .= $infodb_line;
+    }
+  }
+
+  close (PIPEIN);
+}
+
+
+sub read_infodb_keys
+{
+  my $infodb_file_path = shift(@_);
+  my $infodb_map = shift(@_);
+
+  my $cmd = "gzip --decompress --to-stdout \"$infodb_file_path\"";
+
+  open (PIPEIN, "$cmd |") 
+  || die "Error: Couldn't open pipe from gzip: $!\n  $cmd\n";
+
+  binmode(PIPEIN,":utf8");
+  my $infodb_line = "";
+  my $infodb_key = "";
+  while (defined ($infodb_line = <PIPEIN>))
+  {
+    if ($infodb_line =~ /^\[([^\]]+)\]$/)
+    {
+      $infodb_key = $1;
+    }
+    elsif ($infodb_line =~ /^-{70}$/)
+    {
+      $infodb_map->{$infodb_key} = 1;
+      $infodb_key = "";
+    }
+  }
+
+  close (PIPEIN);
+}
+
+    
+sub write_infodb_entry
+{
+
+  my $infodb_handle = shift(@_);
+  my $infodb_key = shift(@_);
+  my $infodb_map = shift(@_);
+  
+  print $infodb_handle "[$infodb_key]\n";
+  foreach my $infodb_value_key (keys(%$infodb_map))
+  {
+    foreach my $infodb_value (@{$infodb_map->{$infodb_value_key}})
+    {
+      if ($infodb_value =~ /-{70,}/)
+      {
+        # if value contains 70 or more hyphens in a row we need to escape them
+        # to prevent txt2db from treating them as a separator
+        $infodb_value =~ s/-/&\#045;/gi;
+      }
+      print $infodb_handle "<$infodb_value_key>" . $infodb_value . "\n";
+    }
+  }
+  print $infodb_handle '-' x 70, "\n";
+}
+
+
+    
+sub write_infodb_rawentry
+{
+
+  my $infodb_handle = shift(@_);
+  my $infodb_key = shift(@_);
+  my $infodb_val = shift(@_);
+  
+  print $infodb_handle "[$infodb_key]\n";
+  print $infodb_handle "$infodb_val\n";
+  print $infodb_handle '-' x 70, "\n";
+}
+
+ sub set_infodb_entry
+{
+  my $infodb_file_path = shift(@_);
+  my $infodb_key = shift(@_);
+  my $infodb_map = shift(@_);
+  
+  print STDERR "***** gdbmtxtgz::set_infodb_entry() not implemented yet!\n";
+}
+
+
+
+sub delete_infodb_entry
+{
+
+  my $infodb_handle = shift(@_);
+  my $infodb_key = shift(@_);
+  
+
+  # A minus at the end of a key (after the ]) signifies 'delete'
+  print $infodb_handle "[$infodb_key]-\n"; 
+
+  # The 70 minus signs are also needed, to help make the parsing by db2txt simple
+  print $infodb_handle '-' x 70, "\n";
+}
+
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/dbutil/jdbm.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/dbutil/jdbm.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/dbutil/jdbm.pm	(revision 24799)
@@ -0,0 +1,227 @@
+###########################################################################
+#
+# dbutil::jdbm -- utility functions for writing to jdbm databases
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2009
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package dbutil::jdbm;
+
+use strict;
+
+
+# -----------------------------------------------------------------------------
+#   JDBM IMPLEMENTATION
+# -----------------------------------------------------------------------------
+
+# When DBUtil::* is properly structured with inheritence, then
+# much of this code (along with GDBM and GDBM-TXT-GZ) can be grouped into
+# a shared base class.  Really it is only the the command that needs to 
+# be constructed that changes between much of the code that is used
+
+
+sub open_infodb_write_handle
+{
+  my $infodb_file_path = shift(@_);
+  my $opt_append = shift(@_);
+
+  my $jdbmwrap_jar = &util::filename_cat($ENV{'GSDLHOME'},"bin","java", "JDBMWrapper.jar");
+  my $jdbm_jar = &util::filename_cat($ENV{'GSDLHOME'},"lib","java", "jdbm.jar");
+
+  my $classpath = &util::pathname_cat($jdbmwrap_jar,$jdbm_jar);
+
+  my $infodb_file_handle = undef;
+  my $txt2jdb_cmd = "java -cp \"$classpath\" Txt2Jdb";
+
+  if ((defined $opt_append) && ($opt_append eq "append")) {
+      $txt2jdb_cmd .= " -append";
+  }
+  
+  # Lop off file extension, as JDBM does not expect this to be present
+  $infodb_file_path =~ s/\.jdb$//;
+
+  $txt2jdb_cmd .= " \"$infodb_file_path\"";
+
+  if (!open($infodb_file_handle, "| $txt2jdb_cmd"))
+  {
+      print STDERR "Error: Failed to open pipe to $txt2jdb_cmd";
+      print STDERR "       $!\n";
+      return undef;
+  }
+  
+  binmode($infodb_file_handle,":utf8");
+  return $infodb_file_handle;
+}
+
+
+
+sub close_infodb_write_handle
+{
+  my $infodb_handle = shift(@_);
+
+  close($infodb_handle);
+}
+
+
+sub get_infodb_file_path
+{
+  my $collection_name = shift(@_);
+  my $infodb_directory_path = shift(@_);
+
+  my $infodb_file_extension = ".jdb";
+  my $infodb_file_name = &util::get_dirsep_tail($collection_name) . $infodb_file_extension;
+  return &util::filename_cat($infodb_directory_path, $infodb_file_name);
+}
+
+
+sub read_infodb_file
+{
+  my $infodb_file_path = shift(@_);
+  my $infodb_map = shift(@_);
+
+  my $jdbmwrap_jar = &util::filename_cat($ENV{'GSDLHOME'},"bin","java", "JDBMWrapper.jar");
+  my $jdbm_jar = &util::filename_cat($ENV{'GSDLHOME'},"lib","java", "jdbm.jar");
+
+  my $classpath = &util::pathname_cat($jdbmwrap_jar,$jdbm_jar);
+
+  my $jdb2txt_cmd = "java -cp \"$classpath\" Jdb2Txt";
+
+  open (PIPEIN, "$jdb2txt_cmd \"$infodb_file_path\" |") || die "couldn't open pipe from db2txt \$infodb_file_path\"\n";
+  binmode(PIPEIN,":utf8");
+  my $infodb_line = "";
+  my $infodb_key = "";
+  my $infodb_value = "";
+  while (defined ($infodb_line = <PIPEIN>))
+  {
+    if ($infodb_line =~ /^\[([^\]]+)\]$/)
+    {
+      $infodb_key = $1;
+    }
+    elsif ($infodb_line =~ /^-{70}$/)
+    {
+      $infodb_map->{$infodb_key} = $infodb_value;
+      $infodb_key = "";
+      $infodb_value = "";
+    }
+    else
+    {
+      $infodb_value .= $infodb_line;
+    }
+  }
+
+  close (PIPEIN);
+}
+
+sub read_infodb_keys
+{
+  my $infodb_file_path = shift(@_);
+  my $infodb_map = shift(@_);
+
+  my $jdbmwrap_jar = &util::filename_cat($ENV{'GSDLHOME'},"bin","java", "JDBMWrapper.jar");
+  my $jdbm_jar = &util::filename_cat($ENV{'GSDLHOME'},"lib","java", "jdbm.jar");
+
+  my $classpath = &util::pathname_cat($jdbmwrap_jar,$jdbm_jar);
+
+  my $jdbkeys_cmd = "java -cp \"$classpath\" JdbKeys";
+
+  open (PIPEIN, "$jdbkeys_cmd \"$infodb_file_path\" |") || die "couldn't open pipe from jdbmkeys \$infodb_file_path\"\n";
+  binmode(PIPEIN,":utf8");
+  my $infodb_line = "";
+  my $infodb_key = "";
+  my $infodb_value = "";
+  while (defined ($infodb_line = <PIPEIN>))
+  {
+      chomp $infodb_line; # remove end of line 
+
+      $infodb_map->{$infodb_line} = 1;
+  }
+
+  close (PIPEIN);
+}
+
+
+    
+sub write_infodb_entry
+{
+
+  my $infodb_handle = shift(@_);
+  my $infodb_key = shift(@_);
+  my $infodb_map = shift(@_);
+  
+  print $infodb_handle "[$infodb_key]\n";
+  foreach my $infodb_value_key (keys(%$infodb_map))
+  {
+    foreach my $infodb_value (@{$infodb_map->{$infodb_value_key}})
+    {
+      if ($infodb_value =~ /-{70,}/)
+      {
+        # if value contains 70 or more hyphens in a row we need to escape them
+        # to prevent txt2db from treating them as a separator
+        $infodb_value =~ s/-/&\#045;/gi;
+      }
+      print $infodb_handle "<$infodb_value_key>" . $infodb_value . "\n";
+    }
+  }
+  print $infodb_handle '-' x 70, "\n";
+}
+
+
+sub write_infodb_rawentry
+{
+
+  my $infodb_handle = shift(@_);
+  my $infodb_key = shift(@_);
+  my $infodb_val = shift(@_);
+  
+  print $infodb_handle "[$infodb_key]\n";
+  print $infodb_handle "$infodb_val\n";
+  print $infodb_handle '-' x 70, "\n";
+}
+
+
+sub set_infodb_entry
+{
+  my $infodb_file_path = shift(@_);
+  my $infodb_key = shift(@_);
+  my $infodb_map = shift(@_);
+  
+  print STDERR "***** jdbm::set_infodb_entry() not implemented yet!\n";
+}
+
+
+sub delete_infodb_entry
+{
+  my $infodb_handle = shift(@_);
+  my $infodb_key = shift(@_);
+  
+  # A minus at the end of a key (after the ]) signifies 'delete'
+  print $infodb_handle "[$infodb_key]-\n"; 
+
+  # The 70 minus signs are also needed, to help make the parsing by db2txt simple
+  print $infodb_handle '-' x 70, "\n";
+}
+
+
+
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/dbutil/mssql.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/dbutil/mssql.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/dbutil/mssql.pm	(revision 24799)
@@ -0,0 +1,314 @@
+###########################################################################
+#
+# dbutil::mssql -- utility functions for writing to mssql databases
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2009
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package dbutil::mssql;
+
+use Encode;
+use strict;
+
+
+
+# -----------------------------------------------------------------------------
+#   MSSQL IMPLEMENTATION
+# -----------------------------------------------------------------------------
+
+my $mssql_collection_name = "";
+my $mssql_data_table_name = "";
+my $mssql_document_metadata_table_name = "";
+
+
+sub open_infodb_write_handle
+{
+  my $infodb_file_path = shift(@_);
+
+  # You might have to install the DBD::ADO module from CPAN
+  #================================================================#
+  # Uncomment this if you want to use MSSQL!!!
+  # By the way, MSSQL only works on a Windows machine...
+  #================================================================#
+  #use DBI;
+  #use DBD::ADO;
+  #Win32::OLE->Option(CP => Win32::OLE::CP_UTF8);
+
+  # The hard coded server connection thingy which should be placed
+  # in some configuration file.
+  # If you have problem connecting to your MS SQL server:
+  # 1. Check if your MSSQL server has been started.
+  # 2. Check if the TCP/IP connection has been enabled.
+  # 3. Use telnet to the server 
+  # (don't forget to specify the port, which can be found in the configuration manager)
+  # If none of the above helped, the you need to start googling then.
+  my $host = "localhost,1660"; # Need to look up your SQL server and see what port is it using.
+  my $user = "sa";
+  my $pwd = "[When installing the MSSQL, you will be asked to input a password for the sa user, use that password]";
+  my $database = "[Create a database in MSSQL and use it here]";
+  
+  # Create the unique name for the table
+  # We do not want to change the database for the current running index
+  # Therefore we use timestamp and collection short name to create an unqiue name
+  my $cur_time = time();
+  my $unique_key = $mssql_collection_name . "_" . $cur_time;
+  $mssql_data_table_name = "data_" . $unique_key;
+  $mssql_document_metadata_table_name = "document_metadata_" . $unique_key;
+  print STDERR "MSSQL: Creating unique table name. Unique ID:[" . $unique_key . "]\n";
+      
+  # Store these information into the infodbfile  
+  open(FH, ">" . $infodb_file_path);
+  print FH "mss-host\t" . $host . "\n";
+  print FH "username\t" . $user . "\n";
+  print FH "password\t" . $pwd . "\n";
+  print FH "database\t" . $database . "\n";
+  print FH "tableid\t" . $unique_key . "\n";
+  close(FH);
+  print STDERR "MSSQL: Saving db info into :[" . $infodb_file_path . "]\n";
+
+  # Make the connection
+  my $dsn = "Provider=SQLNCLI;Server=$host;Database=$database";
+  my $infodb_handle = DBI->connect("dbi:ADO:$dsn", $user, $pwd, { RaiseError => 1, AutoCommit => 1}) || return undef;
+  print STDERR "MSSQL: Connect to MS SQL database. DSN:[" . $dsn . "]\n";
+
+  # Make sure the data table has been created.
+  my $data_table_checker_array = dbgetarray($infodb_handle, "SELECT name FROM sysobjects WHERE name = '" . $mssql_data_table_name . "' AND OBJECTPROPERTY(id,'IsUserTable') = 1");
+  if (scalar(@{$data_table_checker_array}) == 0)
+  {
+    dbquery($infodb_handle, "CREATE TABLE " . $mssql_data_table_name . " (one_key NVARCHAR(50) UNIQUE, one_value NVARCHAR(MAX))");
+  }
+  print STDERR "MSSQL: Making sure the data table(" . $mssql_data_table_name . ") exists\n";
+    
+  # Make sure the document_metadata table has been created.
+  my $document_metadata_table_checker_array = dbgetarray($infodb_handle, "SELECT name FROM sysobjects WHERE name = '" . $mssql_document_metadata_table_name . "' AND OBJECTPROPERTY(id,'IsUserTable') = 1");
+  if (scalar(@{$document_metadata_table_checker_array}) == 0)
+  {
+    dbquery($infodb_handle, "CREATE TABLE " . $mssql_document_metadata_table_name . " (id INTEGER IDENTITY(1,1) PRIMARY KEY, docOID NVARCHAR(50), element NVARCHAR(MAX), value NVARCHAR(MAX))");
+    dbquery($infodb_handle, "CREATE INDEX dmd ON " . $mssql_document_metadata_table_name . "(docOID)");
+  } 
+  print STDERR "MSSQL: Making sure the document_metadata table(" . $mssql_data_table_name . ") exists.\n";
+  
+  return $infodb_handle;
+}
+
+
+sub close_infodb_write_handle
+{
+  my $infodb_handle = shift(@_);    
+  
+  $infodb_handle->disconnect();
+}
+
+
+sub get_infodb_file_path
+{
+  my $collection_name = shift(@_);
+  my $infodb_directory_path = shift(@_);
+
+  my $infodb_file_extension = ".mssqldbinfo";
+  my $infodb_file_name = &util::get_dirsep_tail($collection_name) . $infodb_file_extension;
+  
+  # This will be used in the open_infodb_write_handle function
+  $mssql_collection_name =  $collection_name;
+
+  return &util::filename_cat($infodb_directory_path, $infodb_file_name);
+}
+
+
+sub read_infodb_file
+{
+  my $infodb_file_path = shift(@_);
+  my $infodb_map = shift(@_);
+
+  print STDERR "******* mssql::read_infodb_file() TO BE IMPLEMENTED!\n";
+  print STDERR "******* See sqlite.pm for comparable implementation that has been coded up!\n";
+}
+
+sub read_infodb_keys
+{
+  my $infodb_file_path = shift(@_);
+  my $infodb_map = shift(@_);
+
+  print STDERR "******* mssql::read_infodb_keys() TO BE IMPLEMENTED!\n";
+  print STDERR "******* See sqlite.pm for comparable implementation that has been coded up!\n";
+}
+
+
+sub write_infodb_entry
+{
+  my $infodb_handle = shift(@_);
+  my $infodb_key = shift(@_);
+  my $infodb_map = shift(@_);
+  
+  # Add the key -> value mapping into the "data" table
+  my $infodb_entry_value = "";
+  foreach my $infodb_value_key (keys(%$infodb_map))
+  {
+    foreach my $infodb_value (@{$infodb_map->{$infodb_value_key}})
+    {
+      $infodb_entry_value .= "<$infodb_value_key>" . &Encode::decode_utf8($infodb_value) . "\n";
+    }
+  }
+  
+  # Prepare the query
+  my $safe_infodb_key = &mssql_safe($infodb_key);
+  my $query = "INSERT INTO " . $mssql_data_table_name . " (one_key, one_value) VALUES (N'" . $safe_infodb_key . "', N'" . &mssql_safe($infodb_entry_value) . "')";
+  dbquery($infodb_handle, $query);
+  
+  # If this infodb entry is for a document, add all the interesting document metadata to the
+  # "document_metadata" table (for use by the dynamic classifiers)
+  if ($infodb_key !~ /\./ && $infodb_entry_value =~ /\<doctype\>doc\n/)
+  {
+    dbquery($infodb_handle, "DELETE FROM " . $mssql_document_metadata_table_name . " WHERE docOID=N'" . $safe_infodb_key . "'");
+    
+    foreach my $infodb_value_key (keys(%$infodb_map))
+    {            
+      # We're not interested in most of the automatically added document metadata
+      next if ($infodb_value_key eq "archivedir" ||
+               $infodb_value_key eq "assocfilepath" ||
+               $infodb_value_key eq "childtype" ||
+               $infodb_value_key eq "contains" ||
+               $infodb_value_key eq "docnum" ||
+               $infodb_value_key eq "doctype" ||
+               $infodb_value_key eq "Encoding" ||
+               $infodb_value_key eq "FileSize" ||
+               $infodb_value_key eq "hascover" ||
+               $infodb_value_key eq "hastxt" ||
+               $infodb_value_key eq "lastmodified" ||
+               $infodb_value_key eq "metadataset" ||
+               $infodb_value_key eq "thistype" ||
+               $infodb_value_key =~ /^metadatafreq\-/ ||
+               $infodb_value_key =~ /^metadatalist\-/);
+      foreach my $infodb_value (@{$infodb_map->{$infodb_value_key}})
+      {
+        $infodb_handle->{LongReadLen} = 65535; # Added for the encoding issue
+        my $query = "INSERT INTO " . $mssql_document_metadata_table_name . " (docOID, element, value) VALUES (N'" . $safe_infodb_key . "', N'" . &mssql_safe(&Encode::decode_utf8($infodb_value_key)) . "', N'" . &mssql_safe(&Encode::decode_utf8($infodb_value)) . "')";
+        dbquery($infodb_handle, $query);
+      }
+    }
+  }
+}
+
+
+sub write_infodb_rawentry
+{
+  my $infodb_handle = shift(@_);
+  my $infodb_key = shift(@_);
+  my $infodb_val = shift(@_);
+  
+  # Prepare the query
+  my $safe_infodb_key = &mssql_safe($infodb_key);
+  my $query = "INSERT INTO " . $mssql_data_table_name . " (one_key, one_value) VALUES (N'" . $safe_infodb_key . "', N'" . &mssql_safe($infodb_val) . "')";
+  dbquery($infodb_handle, $query);
+}
+
+
+ sub set_infodb_entry
+{
+  my $infodb_file_path = shift(@_);
+  my $infodb_key = shift(@_);
+  my $infodb_map = shift(@_);
+  
+  print STDERR "***** mssql::set_infodb_entry() not implemented yet!\n";
+}
+
+sub delete_infodb_entry
+{
+  my $infodb_handle = shift(@_);
+  my $infodb_key = shift(@_);
+  
+  # Delete the key from the "data" table
+
+  
+  # Prepare the query
+  my $safe_infodb_key = &mssql_safe($infodb_key);
+  my $query = "DELETE FROM " . $mssql_data_table_name . " WHERE one_key=N'" . $safe_infodb_key . "'";
+  dbquery($infodb_handle, $query);
+  
+  # If this infodb entry is for a document, add all the interesting document metadata to the
+  # "document_metadata" table (for use by the dynamic classifiers)
+  if ($infodb_key !~ /\./)
+  {
+      # Possible for there not to be a docOID matching this infodb_key
+      # (entries are only made when <doctype> == doc
+      # Attempt to delete it, and don't complain if one isn't found
+
+      dbquery($infodb_handle, "DELETE FROM " . $mssql_document_metadata_table_name . " WHERE docOID=N'" . $safe_infodb_key . "'");
+      
+  }
+}
+
+
+
+sub mssql_safe
+{
+  my $value = shift(@_);
+  
+  # Escape any single quotes in the value
+  $value =~ s/\'/\'\'/g;
+  
+  return $value;
+}
+
+
+sub dbquery
+{
+  my $infodb_handle = shift(@_);
+  my $sql_query = shift(@_);
+
+  # Execute the SQL statement
+  my $statement_handle = $infodb_handle->prepare($sql_query);
+  $statement_handle->execute();
+  if ($statement_handle->err) 
+  {
+    print STDERR "Error:" . $statement_handle->errstr . "\n";
+    return undef;
+  }
+  
+  return $statement_handle;
+}
+
+
+sub dbgetarray
+{
+  my $infodb_handle = shift(@_);
+  my $sql_query = shift(@_);
+  
+  my $statement_handle = dbquery($infodb_handle, $sql_query);
+  my $return_array = [];
+  
+  # Iterate through the results and push them into an array
+  if (!defined($statement_handle)) 
+  {
+    return [];
+  }
+  
+  while ((my $temp_hash = $statement_handle->fetchrow_hashref()))
+  {
+    push(@$return_array, $temp_hash);
+  }
+
+  return $return_array; 
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/dbutil/sqlite.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/dbutil/sqlite.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/dbutil/sqlite.pm	(revision 24799)
@@ -0,0 +1,369 @@
+###########################################################################
+#
+# dbutil::sqlite -- utility functions for writing to sqlite databases
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2009-2010  DL Consulting Ltd.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package dbutil::sqlite;
+
+use strict;
+
+# Please set $db_fast to 1 if you wish to enable faster I/O to the database by using
+# optimisations such as PRAGMA journal_mode (MEMORY instead of DELETE) and synchronous (OFF instead of FULL)
+# Please be aware that in this case it will be less secure and the database file
+# may become corrupted if the if the operating system crashes or the computer loses
+# power before that data has been written to the disk surface.
+# But the speed gain is about 50x
+my $db_fast = 0;
+
+# Set to 1 to enable Write Ahead Logging - which is supposed to allow multiple
+# readers/writers on a SQLite database (overridden by db_fast).
+my $db_wal = 0;
+
+
+# -----------------------------------------------------------------------------
+#   SQLITE IMPLEMENTATION
+# -----------------------------------------------------------------------------
+
+sub open_infodb_write_handle
+{
+  my $infodb_file_path = shift(@_);
+  my $opt_append = shift(@_);
+ 
+  my $sqlite3_exe = &util::filename_cat($ENV{'GSDLHOME'},"bin",$ENV{'GSDLOS'}, "sqlite3" . &util::get_os_exe());
+  my $infodb_handle = undef;
+
+  if (!-e "$sqlite3_exe")
+  {
+      print STDERR "Error: Unable to find $sqlite3_exe\n";
+      return undef;
+  } 
+
+  # running sqlite3 with the pragma journal_mode=memory, causes sqlite to print out the 
+  # word "memory". While this is not a problem usually, in our case, this ends up going out
+  # to the web page first, as part of the web page's headers, thus ruining the web page
+  # which causes an Internal Server Error (500). Therefore, we redirect sqlite's output to
+  # the nul device instead. 
+  my $nul_device="";
+  if($db_fast || $db_wal) {
+	if($ENV{'GSDLOS'} =~ m/windows/) {
+		$nul_device=">NUL";
+	} else {
+		$nul_device=">/dev/null"; # linux, mac
+	}
+  }  
+  
+  if(!open($infodb_handle, "| \"$sqlite3_exe\" \"$infodb_file_path\"$nul_device"))
+  {
+      print STDERR "Error: Failed to open pipe to \"$sqlite3_exe\" \"$infodb_file_path\"\n";
+      print STDERR "       $!\n";
+      return undef;
+  }
+
+  binmode($infodb_handle,":utf8");
+  
+   # Add extra optimisations, less secure but with a massive gain in performance with large databases which are often uptaded
+   # They should be set before the transaction begins
+  if (defined $db_fast && $db_fast == 1) {
+	print $infodb_handle "PRAGMA synchronous=OFF;\n";
+	print $infodb_handle "PRAGMA journal_mode=MEMORY;\n";
+  }
+  # Allow parallel readers/writers by using a Write Ahead Logger
+  elsif ($db_wal)
+  {
+    print $infodb_handle "PRAGMA journal_mode=WAL;\n";
+  }
+
+  # This is very important for efficiency, otherwise each command will be actioned one at a time
+  print $infodb_handle "BEGIN TRANSACTION;\n";
+  
+
+
+  if (!(defined $opt_append) || ($opt_append ne "append")) {
+    print $infodb_handle "DROP TABLE IF EXISTS data;\n";
+	print $infodb_handle "DROP TABLE IF EXISTS document_metadata;\n";
+  }
+   
+  print $infodb_handle "CREATE TABLE IF NOT EXISTS data (key TEXT PRIMARY KEY, value TEXT);\n";
+  print $infodb_handle "CREATE TABLE IF NOT EXISTS document_metadata (id INTEGER PRIMARY KEY, docOID TEXT, element TEXT, value TEXT);\n";
+
+  # This is crucial for efficiency when importing large amounts of data
+  print $infodb_handle "CREATE INDEX IF NOT EXISTS dmd ON document_metadata(docOID);\n";
+
+  return $infodb_handle;
+}
+
+
+sub close_infodb_write_handle
+{
+  my $infodb_handle = shift(@_);
+
+  # This is crucial for efficient queries on the database!
+  print $infodb_handle "CREATE INDEX IF NOT EXISTS dme ON document_metadata(element);\n";
+  
+  # Close the transaction we began after opening the file
+  print $infodb_handle "END TRANSACTION;\n";
+
+  close($infodb_handle);
+}
+
+
+sub read_infodb_cmd
+{
+  my $infodb_file_path = shift(@_);
+  my $sqlcmd = shift(@_);
+
+  my $result = "";
+
+  my $sqlite3_exe = &util::filename_cat($ENV{'GSDLHOME'},"bin",$ENV{'GSDLOS'}, "sqlite3" . &util::get_os_exe());
+  my $infodb_handle = undef;
+  my $cmd = "\"$sqlite3_exe\" \"$infodb_file_path\" \"$sqlcmd\"";
+
+  if (!-e "$sqlite3_exe" || !open($infodb_handle, "$cmd |"))
+  {
+      print STDERR "Unable to execute: $cmd\n";
+      print STDERR "$!\n";
+  }
+  else {
+
+      binmode($infodb_handle, ":utf8");
+      my $line;
+      while (defined($line=<$infodb_handle>)) {
+	  $result .= $line;
+      }
+
+      close($infodb_handle);
+  }
+
+  return $result;
+}
+
+sub get_infodb_file_path
+{
+  my $collection_name = shift(@_);
+  my $infodb_directory_path = shift(@_);
+
+  my $infodb_file_extension = ".db";
+  my $infodb_file_name = &util::get_dirsep_tail($collection_name) . $infodb_file_extension;
+  return &util::filename_cat($infodb_directory_path, $infodb_file_name);
+}
+
+
+sub read_infodb_file
+{
+  my $infodb_file_path = shift(@_);
+  my $infodb_map = shift(@_);
+
+
+  my $keys_str = read_infodb_cmd($infodb_file_path,"SELECT key FROM data ORDER BY key;");
+
+  my @keys = split(/\n/,$keys_str);
+
+  foreach my $k (@keys) {
+      
+      my $k_safe = &sqlite_safe($k);
+      my $select_val_cmd = "SELECT value FROM data WHERE key='$k_safe';";
+
+      my $val_str = read_infodb_cmd($infodb_file_path,$select_val_cmd);
+
+      $infodb_map->{$k} = $val_str;
+  }
+
+}
+
+
+sub read_infodb_keys
+{
+  my $infodb_file_path = shift(@_);
+  my $infodb_map = shift(@_);
+
+
+  my $keys_str = read_infodb_cmd($infodb_file_path,"SELECT key FROM data;");
+
+  my @keys = split(/\n/,$keys_str);
+
+  foreach my $key (@keys)
+  {
+      $infodb_map->{$key} = 1;
+  }
+}
+
+sub read_infodb_rawentry
+{
+  my $infodb_file_path = shift(@_);
+  my $infodb_key = shift(@_);
+
+  
+  my $key_safe = &sqlite_safe($infodb_key);
+  my $select_val_cmd = "SELECT value FROM data WHERE key='$key_safe';";
+
+  my $val_str = read_infodb_cmd($infodb_file_path,$select_val_cmd);
+
+  return $val_str
+}
+
+sub read_infodb_entry
+{
+  my $infodb_file_path = shift(@_);
+  my $infodb_key = shift(@_);
+
+  my $val_str = read_infodb_rawentry($infodb_file_path,$infodb_key);
+  
+  my $rec_hash = &dbutil::convert_infodb_string_to_hash($val_str);
+
+  return $rec_hash;
+}
+
+
+sub write_infodb_entry
+{
+  my $infodb_handle = shift(@_);
+  my $infodb_key = shift(@_);
+  my $infodb_map = shift(@_);
+  
+
+  # Add the key -> value mapping into the "data" table
+  my $infodb_entry_value = "";
+  foreach my $infodb_value_key (keys(%$infodb_map))
+  {
+    foreach my $infodb_value (@{$infodb_map->{$infodb_value_key}})
+    {
+      $infodb_entry_value .= "<$infodb_value_key>" . $infodb_value . "\n";
+    }
+  }
+  
+  my $safe_infodb_key = &sqlite_safe($infodb_key);
+  print $infodb_handle "INSERT OR REPLACE INTO data (key, value) VALUES ('" . $safe_infodb_key . "', '" . &sqlite_safe($infodb_entry_value) . "');\n";
+
+  # If this infodb entry is for a document, add all the interesting document metadata to the
+  #   "document_metadata" table (for use by the dynamic classifiers)
+  if ($infodb_key !~ /\./ && $infodb_entry_value =~ /\<doctype\>doc\n/)
+  {
+	
+    print $infodb_handle "DELETE FROM document_metadata WHERE docOID='" . $safe_infodb_key . "';\n";
+	
+    foreach my $infodb_value_key (keys(%$infodb_map))
+    {
+      # We're not interested in most of the automatically added document metadata
+      next if ($infodb_value_key eq "archivedir" ||
+               $infodb_value_key eq "assocfilepath" ||
+               $infodb_value_key eq "childtype" ||
+               $infodb_value_key eq "contains" ||
+               $infodb_value_key eq "docnum" ||
+               $infodb_value_key eq "doctype" ||
+               $infodb_value_key eq "Encoding" ||
+               $infodb_value_key eq "FileSize" ||
+               $infodb_value_key eq "hascover" ||
+               $infodb_value_key eq "hastxt" ||
+               $infodb_value_key eq "lastmodified" ||
+               $infodb_value_key eq "metadataset" ||
+               $infodb_value_key eq "thistype" ||
+               $infodb_value_key =~ /^metadatafreq\-/ ||
+               $infodb_value_key =~ /^metadatalist\-/);
+
+      foreach my $infodb_value (@{$infodb_map->{$infodb_value_key}})
+      {
+		 print $infodb_handle "INSERT INTO document_metadata (docOID, element, value) VALUES ('" . $safe_infodb_key . "', '" . &sqlite_safe($infodb_value_key) . "', '" . &sqlite_safe($infodb_value) . "');\n";
+      }
+    }
+  }
+
+	 #### DEBUGGING
+	#my $new_file = "D:\\sql.txt";
+	#open(FOUT, ">>$new_file") or die "Unable to open $new_file for writing out sql statements...ERROR: $!\n";
+    #print FOUT "BEGIN;\n".$insertStatementsBuffer."\nEND;\n";
+    #close(FOUT);
+	#print STDERR $insertStatementsBuffer; 
+	 #### END DEBUGGING
+}
+
+sub write_infodb_rawentry
+{
+  my $infodb_handle = shift(@_);
+  my $infodb_key = shift(@_);
+  my $infodb_val = shift(@_);
+
+  my $safe_infodb_key = &sqlite_safe($infodb_key);
+  print $infodb_handle "INSERT OR REPLACE INTO data (key, value) VALUES ('" . $safe_infodb_key . "', '" . &sqlite_safe($infodb_val) . "');\n";
+}
+
+
+sub set_infodb_entry
+{
+  my $infodb_file_path = shift(@_);
+  my $infodb_key = shift(@_);
+  my $infodb_map = shift(@_);
+  my $infodb_handle = open_infodb_write_handle($infodb_file_path, "append");
+
+  if (!defined $infodb_handle) {
+      print STDERR "Error: Failed to open infodb write handle\n";
+	  return -1;
+  }
+  else {
+	  write_infodb_entry($infodb_handle,$infodb_key,$infodb_map);
+      close_infodb_write_handle($infodb_handle);
+  }
+  # Not currently checking for errors on write to DB
+  return 0;
+
+}
+
+
+
+sub delete_infodb_entry
+{
+  my $infodb_handle = shift(@_);
+  my $infodb_key = shift(@_);
+
+  # Delete the key from the "data" table
+
+  my $safe_infodb_key = &sqlite_safe($infodb_key);
+
+  print $infodb_handle "DELETE FROM data WHERE key='" . $safe_infodb_key . "';\n";
+
+  # If this infodb entry is for a document, delete the
+  #   "document_metadata" table entry also (for use by the dynamic classifiers)
+  if ($infodb_key !~ /\./)
+  {
+      # Possible for there not to be a docOID matching this infodb_key
+      # (entries are only made when <doctype> == doc
+      # Attempt to delete it, and don't complain if one isn't found
+
+      print $infodb_handle "DELETE FROM document_metadata WHERE docOID='" . $safe_infodb_key . "';\n";
+
+  }
+}
+
+
+sub sqlite_safe
+{
+  my $value = shift(@_);
+
+  # Escape any single quotes in the value
+  $value =~ s/\'/\'\'/g;
+
+  return $value;
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/doc.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/doc.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/doc.pm	(revision 24799)
@@ -0,0 +1,1243 @@
+###########################################################################
+#
+# doc.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistr   te it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# base class to hold documents
+
+package doc;
+eval {require bytes};
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+#    unshift (@INC, "$ENV{'GSDLHOME'}/perllib/dynamic/lib/site_perl/5.005/i686-linux");
+}
+
+use strict;
+use unicode;
+use util;
+use ghtml;
+use File::stat;
+##use hashdoc;
+use docprint;
+
+# the document type may be indexed_doc, nonindexed_doc, or
+# classification
+
+our $OIDcount = 0;
+
+# rename_method can be 'url', 'none', 'base64'
+sub new {
+    my $class = shift (@_);
+    my ($source_filename, $doc_type, $rename_method) = @_;
+
+
+    my $self = bless {'associated_files'=>[],
+		      'subsection_order'=>[],
+		      'next_subsection'=>1,
+		      'subsections'=>{},
+		      'metadata'=>[],
+		      'text'=>"",
+		      'OIDtype'=>"hash"}, $class;
+
+    # used to set lastmodified here, but this can screw up the HASH ids, so
+    # the docsave processor now calls set_lastmodified
+
+    $self->set_source_path($source_filename);
+    
+    if (defined $source_filename) {
+	$source_filename = &util::filename_within_collection($source_filename);
+	print STDERR "****** doc.pm::new(): no file rename method provided\n" unless $rename_method;
+	$self->set_source_filename ($source_filename, $rename_method);
+    }
+
+    $self->set_doc_type ($doc_type) if defined $doc_type;
+
+    return $self;
+}
+
+
+sub set_source_path
+{
+    my $self = shift @_;
+    my ($source_filename) = @_;
+
+    if (defined $source_filename) {
+	# On Windows the source_filename can be in terse DOS format
+	# e.g. test~1.txt
+
+	$self->{'terse_source_path'} = $source_filename;
+
+	if (-e $source_filename) {
+	    # See if we can do better for Windows with a filename
+	    if ($ENV{'GSDLOS'} =~ /^windows$/i) {
+		require Win32;
+		$self->{'source_path'} = Win32::GetLongPathName($source_filename);
+	    }
+	    else {
+		# For Unix-based systems, there is no difference between the two
+		$self->{'source_path'} = $source_filename;
+	    }
+	}
+	else {
+	    print STDERR "Warning: In doc::set_source_path(), file\n";
+	    print STDERR "           $source_filename\n";
+	    print STDERR "         does not exist\n";
+	    
+	    # (default) Set it to whatever we were given
+	    $self->{'source_path'} = $source_filename;
+	}	
+    }
+    else {
+	# Previous code for setting source_path allowed for
+	# it to be undefined, so continue this practice
+	$self->{'terse_source_path'} = undef;
+	$self->{'source_path'} = undef;
+    }
+}
+
+
+sub get_source_path
+{
+    my $self = shift @_;
+
+    return $self->{'terse_source_path'};
+}
+
+# set lastmodified for OAI purposes, added by GRB, moved by kjdon
+sub set_oailastmodified {
+    my $self = shift (@_);
+
+    my $source_path = $self->{'terse_source_path'};
+   
+    if (defined $source_path && (-e $source_path)) {
+	my $current_time = time;
+
+	my ($seconds, $minutes, $hours, $day_of_month, $month, $year,
+	    $wday, $yday, $isdst) = localtime($current_time);
+
+	my $date_modified = sprintf("%d%02d%02d",1900+$year,$month+1,$day_of_month);
+
+	$self->add_utf8_metadata($self->get_top_section(), "oailastmodified", $current_time);
+	$self->add_utf8_metadata($self->get_top_section(), "oailastmodifieddate", $date_modified);
+    } 
+}
+
+# no longer used for OAI purposes, since lastmodified is not what we want as the
+# Datestamp of a document. This doc metadata may be useful for general purposes.
+sub set_lastmodified {
+    my $self = shift (@_);
+
+    my $source_path = $self->{'terse_source_path'};
+   
+    if (defined $source_path && (-e $source_path)) {
+
+      	my $file_stat = stat($source_path);
+	my $mtime = $file_stat->mtime;
+	my ($seconds, $minutes, $hours, $day_of_month, $month, $year,
+	    $wday, $yday, $isdst) = localtime($mtime);
+
+	my $date_modified = sprintf("%d%02d%02d",1900+$year,$month+1,$day_of_month);
+
+	$self->add_utf8_metadata($self->get_top_section(), "lastmodified", $mtime);
+	$self->add_utf8_metadata($self->get_top_section(), "lastmodifieddate", $date_modified);
+    } 
+}
+
+# clone the $self object
+sub duplicate {
+    my $self = shift (@_);
+
+    my $newobj = {};
+    
+    foreach my $k (keys %$self) {
+	$newobj->{$k} = &clone ($self->{$k});
+    }
+
+    bless $newobj, ref($self);
+    return $newobj;
+}
+
+sub clone {
+    my ($from) = @_;
+    my $type = ref ($from);
+
+    if ($type eq "HASH") {
+	my $to = {};
+	foreach my $key (keys %$from) {
+	    $to->{$key} = &clone ($from->{$key});
+	}
+	return $to;
+    } elsif ($type eq "ARRAY") {
+	my $to = [];
+	foreach my $v (@$from) {
+	    push (@$to, &clone ($v));
+	}
+	return $to;
+    } else {
+	return $from;
+    }
+}
+
+sub set_OIDtype {
+    my $self = shift (@_);
+    my ($type, $metadata) = @_;
+
+    if (defined $type && $type =~ /^(hash|hash_on_file|hash_on_ga_xml|incremental|dirname|assigned)$/) {
+	$self->{'OIDtype'} = $type;
+    } else {
+	$self->{'OIDtype'} = "hash";
+    }
+
+    if ($type =~ /^assigned$/) {
+	if (defined $metadata) {
+	    $self->{'OIDmetadata'} = $metadata;
+	} else {
+	    $self->{'OIDmetadata'} = "dc.Identifier";
+	}
+    }
+}
+
+# rename_method can be 'url', 'none', 'base64'
+sub set_source_filename {
+    my $self = shift (@_);
+    my ($source_filename, $rename_method) = @_;
+
+    # Since the gsdlsourcefilename element goes into the doc.xml it has 
+    # to be utf8. However, it should also *represent* the source filename 
+    # (in the import directory) which may not be utf8 at all. 
+    # For instance, if this meta element (gsdlsourcefilename) will be used 
+    # by other applications that parse doc.xml in order to locate 
+    # gsdlsourcefilename. Therefore, the solution is to URLencode or base64 
+    # encode the real filename as this is a binary-to-text encoding meaning
+    # that the resulting string is ASCII (utf8). Decoding will give the original.
+    
+#    print STDERR "******URL/base64 encoding the gsdl_source_filename $source_filename ";
+
+    # URLencode just the gsdl_source_filename, not the directory. Then prepend dir 
+    $source_filename = $self->encode_filename($source_filename, $rename_method);
+#    my ($srcfilename,$dirname,$suffix) 
+#	= &File::Basename::fileparse($source_filename, "\\.[^\\.]+\$");
+#    print STDERR "-> $srcfilename -> ";
+#    $srcfilename = &util::rename_file($srcfilename.$suffix, $rename_method);
+#    $source_filename = &util::filename_cat($dirname, $srcfilename);
+#    print STDERR "$source_filename\n";
+	
+    $self->set_utf8_metadata_element ($self->get_top_section(), 
+				 "gsdlsourcefilename", 
+				 $source_filename);
+}
+
+sub encode_filename {
+    my $self = shift (@_);
+    my ($source_filename, $rename_method) = @_;
+
+     my ($srcfilename,$dirname,$suffix) 
+	= &File::Basename::fileparse($source_filename, "\\.[^\\.]+\$");
+#    print STDERR "-> $srcfilename -> ";
+    $srcfilename = &util::rename_file($srcfilename.$suffix, $rename_method);
+    $source_filename = &util::filename_cat($dirname, $srcfilename);
+
+    return $source_filename;
+}
+
+sub set_converted_filename {
+    my $self = shift (@_);
+    my ($converted_filename) = @_;
+
+    # we know the converted filename is utf8
+    $self->set_utf8_metadata_element ($self->get_top_section(), 
+				 "gsdlconvertedfilename", 
+				 $converted_filename);
+}
+
+# returns the source_filename as it was provided
+sub get_unmodified_source_filename {
+    my $self = shift (@_);
+
+    return $self->{'terse_source_path'};
+}
+
+# returns the source_filename with whatever rename_method was given
+sub get_source_filename {
+    my $self = shift (@_);
+
+    return $self->get_metadata_element ($self->get_top_section(), "gsdlsourcefilename");
+}
+
+
+
+# returns converted filename if available else returns source filename
+sub get_filename_for_hashing {
+    my $self = shift (@_);
+
+    my $filename = $self->get_metadata_element ($self->get_top_section(), "gsdlconvertedfilename");
+
+    if (!defined $filename) {
+	my $plugin_name = $self->get_metadata_element ($self->get_top_section(), "Plugin");
+	# if NULPlug processed file, then don't give a filename
+	if (defined $plugin_name && $plugin_name eq "NULPlug") {
+	    $filename = undef;
+	} else { # returns the URL encoded source filename!
+	    $filename = $self->get_metadata_element ($self->get_top_section(), "gsdlsourcefilename");
+	}
+    }
+
+    if (!&util::filename_is_absolute($filename)) {
+	$filename = &util::filename_cat($ENV{'GSDLCOLLECTDIR'},$filename);
+    }
+
+    return $filename;
+}
+
+sub set_doc_type {
+    my $self = shift (@_);
+    my ($doc_type) = @_;
+
+    $self->set_metadata_element ($self->get_top_section(), 
+				 "gsdldoctype", 
+				 $doc_type);
+}
+
+# returns the gsdldoctype as it was provided
+# the default of "indexed_doc" is used if no document
+# type was provided
+sub get_doc_type {
+    my $self = shift (@_);
+
+    my $doc_type = $self->get_metadata_element ($self->get_top_section(), "gsdldoctype");
+    return $doc_type if (defined $doc_type);
+    return "indexed_doc";
+}
+
+
+# look up the reference to the a particular section
+sub _lookup_section {
+    my $self = shift (@_);
+    my ($section) = @_;
+
+    my ($num);
+    my $sectionref = $self;
+
+    while (defined $section && $section ne "") {
+	
+	($num, $section) = $section =~ /^\.?(\d+)(.*)$/;
+	
+	$num =~ s/^0+(\d)/$1/ if defined $num ; # remove leading 0s
+	
+	$section = "" unless defined $section;
+	
+
+	if (defined $num && defined $sectionref->{'subsections'}->{$num}) {
+	    $sectionref = $sectionref->{'subsections'}->{$num};
+	} else {
+	    return undef;
+	}
+    }
+    
+    return $sectionref;
+}
+
+# calculate OID by hashing the contents of the document
+sub _calc_OID {
+    my $self = shift (@_);
+    my ($filename) = @_;
+
+
+    my $osexe = &util::get_os_exe();
+
+    my $hashfile_exe = &util::filename_cat($ENV{'GSDLHOME'},"bin",
+					   $ENV{'GSDLOS'},"hashfile$osexe");
+
+    my $result = "NULL";
+
+    
+    if (-e "$hashfile_exe") {
+#	$result = `\"$hashfile_exe\" \"$filename\"`;
+#	$result = `hashfile$osexe \"$filename\" 2>&1`;
+	$result = `hashfile$osexe \"$filename\"`;
+
+	($result) = $result =~ /:\s*([0-9a-f]+)/i;
+    } else {
+	print STDERR "doc::_calc_OID $hashfile_exe could not be found\n";
+    }
+    return "HASH$result";
+}
+
+# methods dealing with OID, not groups of them.
+
+# if $OID is not provided one is calculated
+sub set_OID {
+    my $self = shift (@_);
+    my ($OID) = @_;
+    
+    my $use_hash_oid = 0;
+    # if an OID wasn't provided calculate one
+    if (!defined $OID) {
+	$OID = "NULL";
+	if ($self->{'OIDtype'} =~ /^hash/) {
+	    $use_hash_oid = 1;
+	} elsif ($self->{'OIDtype'} eq "incremental") {
+	    $OID = "D" . $OIDcount;
+	    $OIDcount ++;
+	  
+	} elsif ($self->{'OIDtype'} eq "dirname") {
+	    $OID = 'J';
+	    my $filename = $self->get_source_filename();
+	    if (defined($filename)) { # && -e $filename) {
+		$OID = &File::Basename::dirname($filename);
+		if (defined $OID) {
+		    $OID = 'J'.&File::Basename::basename($OID);
+		    $OID = &util::tidy_up_oid($OID);
+		} else {
+		    print STDERR "Failed to find base for filename ($filename)...generating hash id\n";
+		    $use_hash_oid = 1;
+		}
+	    } else {
+		print STDERR "Failed to find filename, generating hash id\n";
+		$use_hash_oid = 1;
+	    }    
+	    
+	} elsif ($self->{'OIDtype'} eq "assigned") {
+	    my $identifier = $self->get_metadata_element ($self->get_top_section(), $self->{'OIDmetadata'});
+	    if (defined $identifier && $identifier ne "") {
+		$OID = $identifier;
+		$OID = &util::tidy_up_oid($OID);
+	    } else {
+		# need a hash id
+		print STDERR "no $self->{'OIDmetadata'} metadata found, generating hash id\n";
+		$use_hash_oid = 1;
+	    }
+	    	    
+	} else {
+	    $use_hash_oid = 1;
+	}
+
+	if ($use_hash_oid) {
+	    my $hash_on_file = 1; 
+	    if ($self->{'OIDtype'} eq "hash_on_ga_xml") {
+		$hash_on_file = 0;
+	    }
+	    if ($hash_on_file) {
+		# "hash" OID - feed file to hashfile.exe
+		my $filename = $self->get_filename_for_hashing();
+		
+		# -z: don't want to hash on the file if it is zero size
+		if (defined($filename) && -e $filename && !-z $filename) {
+		    $OID = $self->_calc_OID ($filename);
+		} else {
+		    $hash_on_file = 0;
+		}
+	    }
+	    if (!$hash_on_file) {
+		my $filename = &util::get_tmp_filename();
+		if (!open (OUTFILE, ">:utf8", $filename)) {
+		    print STDERR "doc::set_OID could not write to $filename\n";
+		} else {
+		    my $doc_text = &docprint::get_section_xml($self, $self->get_top_section());
+		    print OUTFILE $doc_text;
+		    close (OUTFILE);
+		}
+		$OID = $self->_calc_OID ($filename);
+		&util::rm ($filename);
+	    }
+	}
+    }
+    $self->set_metadata_element ($self->get_top_section(), "Identifier", $OID);
+}
+
+# this uses hashdoc (embedded c thingy) which is faster but still 
+# needs a little work to be suffiently stable
+sub ___set_OID {
+    my $self = shift (@_);
+    my ($OID) = @_;
+
+    # if an OID wasn't provided then calculate hash value based on document
+    if (!defined $OID) 
+    {
+	my $hash_text = &docprint::get_section_xml($self, $self->get_top_section());
+	my $hash_len = length($hash_text);
+
+        $OID = &hashdoc::buffer($hash_text,$hash_len);
+    }
+
+    $self->set_metadata_element ($self->get_top_section(), "Identifier", $OID);
+}
+
+# returns the OID for this document
+sub get_OID {
+    my $self = shift (@_);
+    my $OID = $self->get_metadata_element ($self->get_top_section(), "Identifier");
+    return $OID if (defined $OID);
+    return "NULL";
+}
+
+sub delete_OID {
+    my $self = shift (@_);
+    
+    $self->set_metadata_element ($self->get_top_section(), "Identifier", "NULL");
+}
+
+
+# methods for manipulating section names
+
+# returns the name of the top-most section (the top
+# level of the document
+sub get_top_section {
+    my $self = shift (@_);
+    
+    return "";
+}
+
+# returns a section
+sub get_parent_section {
+    my $self = shift (@_);
+    my ($section) = @_;
+
+    $section =~ s/(^|\.)\d+$//;
+
+    return $section;
+}
+
+# returns the first child section (or the end child 
+# if there isn't any)
+sub get_begin_child {
+    my $self = shift (@_);
+    my ($section) = @_;
+
+    my $section_ptr = $self->_lookup_section($section);
+    return "" unless defined $section_ptr;
+
+    if (defined $section_ptr->{'subsection_order'}->[0]) {
+	return "$section.$section_ptr->{'subsection_order'}->[0]";
+    }
+
+    return $self->get_end_child ($section);
+}
+
+# returns the next child of a parent section
+sub get_next_child {
+    my $self = shift (@_);
+    my ($section) = @_;
+    
+    my $parent_section = $self->get_parent_section($section);
+    my $parent_section_ptr = $self->_lookup_section($parent_section);
+    return undef unless defined $parent_section_ptr;
+
+    my ($section_num) = $section =~ /(\d+)$/;
+    return undef unless defined $section_num;
+
+    my $i = 0;
+    my $section_order = $parent_section_ptr->{'subsection_order'};
+    while ($i < scalar(@$section_order)) {
+	last if $section_order->[$i] eq $section_num;
+	$i++;
+    }
+
+    $i++; # the next child
+    if ($i < scalar(@$section_order)) {
+	return $section_order->[$i] if $parent_section eq "";
+	return "$parent_section.$section_order->[$i]";
+    }
+
+    # no more sections in this level
+    return undef;
+}
+
+# returns a reference to a list of children
+sub get_children {
+    my $self = shift (@_);
+    my ($section) = @_;
+
+    my $section_ptr = $self->_lookup_section($section);
+    return [] unless defined $section_ptr;
+
+    my @children = @{$section_ptr->{'subsection_order'}};
+
+    map {$_ = "$section.$_"; $_ =~ s/^\.+//;} @children;
+    return \@children;
+}
+
+# returns the child section one past the last one (which
+# is coded as "0")
+sub get_end_child {
+    my $self = shift (@_);
+    my ($section) = @_;
+
+    return $section . ".0" unless $section eq "";
+    return "0";
+}
+
+# returns the next section in book order
+sub get_next_section {
+    my $self = shift (@_);
+    my ($section) = @_;
+
+    return undef unless defined $section;
+
+    my $section_ptr = $self->_lookup_section($section);
+    return undef unless defined $section_ptr;
+
+    # first try to find first child
+    if (defined $section_ptr->{'subsection_order'}->[0]) {
+	return $section_ptr->{'subsection_order'}->[0] if ($section eq "");
+	return "$section.$section_ptr->{'subsection_order'}->[0]";
+    }
+
+    do {
+	# try to find sibling
+	my $next_child = $self->get_next_child ($section);
+	return $next_child if (defined $next_child);
+
+	# move up one level
+	$section = $self->get_parent_section ($section);
+    } while $section =~ /\d/;
+
+    return undef;
+}
+
+sub is_leaf_section {
+    my $self = shift (@_);
+    my ($section) = @_;
+
+    my $section_ptr = $self->_lookup_section($section);
+    return 1 unless defined $section_ptr;
+
+    return (scalar (@{$section_ptr->{'subsection_order'}}) == 0);
+}
+
+# methods for dealing with sections
+
+# returns the name of the inserted section
+sub insert_section {
+    my $self = shift (@_);
+    my ($before_section) = @_;
+
+    # get the child to insert before and its parent section
+    my $parent_section = "";
+    my $before_child = "0";
+    my @before_section = split (/\./, $before_section);
+    if (scalar(@before_section) > 0) {
+	$before_child = pop (@before_section);
+	$parent_section = join (".", @before_section);
+    }
+
+    my $parent_section_ptr = $self->_lookup_section($parent_section);
+    if (!defined $parent_section_ptr) {
+	print STDERR "doc::insert_section couldn't find parent section " .
+	    "$parent_section\n";
+	return;
+    }
+
+    # get the next section number
+    my $section_num = $parent_section_ptr->{'next_subsection'}++;
+
+    my $i = 0;
+    while ($i < scalar(@{$parent_section_ptr->{'subsection_order'}}) &&
+	   $parent_section_ptr->{'subsection_order'}->[$i] ne $before_child) {
+	$i++;
+    }
+    
+    # insert the section number into the order list
+    splice (@{$parent_section_ptr->{'subsection_order'}}, $i, 0, $section_num);
+
+    # add this section to the parent section
+    my $section_ptr = {'subsection_order'=>[],
+		       'next_subsection'=>1,
+		       'subsections'=>{},
+		       'metadata'=>[],
+		       'text'=>""};
+    $parent_section_ptr->{'subsections'}->{$section_num} = $section_ptr;
+
+    # work out the full section number
+    my $section = $parent_section;
+    $section .= "." unless $section eq "";
+    $section .= $section_num;
+    
+    return $section;
+}
+
+# creates a pre-named section
+sub create_named_section {
+    my $self = shift (@_);
+    my ($mastersection) = @_;
+
+    my ($num);
+    my $section = $mastersection;
+    my $sectionref = $self;
+
+    while ($section ne "") {
+	($num, $section) = $section =~ /^\.?(\d+)(.*)$/;
+	$num =~ s/^0+(\d)/$1/; # remove leading 0s
+	$section = "" unless defined $section;
+	
+	if (defined $num) {
+	    if (!defined $sectionref->{'subsections'}->{$num}) {
+		push (@{$sectionref->{'subsection_order'}}, $num);
+		$sectionref->{'subsections'}->{$num} = {'subsection_order'=>[],
+							'next_subsection'=>1,
+							'subsections'=>{},
+							'metadata'=>[],
+							'text'=>""};
+		if ($num >= $sectionref->{'next_subsection'}) {
+		    $sectionref->{'next_subsection'} = $num + 1;
+		}
+	    }
+	    $sectionref = $sectionref->{'subsections'}->{$num};
+
+	} else {
+	    print STDERR "doc::create_named_section couldn't create section ";
+	    print STDERR "$mastersection\n";
+	    last;
+	}
+    }
+}
+
+# returns a reference to a list of subsections
+sub list_subsections {
+    my $self = shift (@_);
+    my ($section) = @_;
+
+    my $section_ptr = $self->_lookup_section ($section);
+    if (!defined $section_ptr) {
+	print STDERR "doc::list_subsections couldn't find section $section\n";
+	return [];
+    }
+
+    return [@{$section_ptr->{'subsection_order'}}];
+}
+
+sub delete_section {
+    my $self = shift (@_);
+    my ($section) = @_;
+
+#    my $section_ptr = {'subsection_order'=>[],
+#		       'next_subsection'=>1,
+#		       'subsections'=>{},
+#		       'metadata'=>[],
+#		       'text'=>""};
+
+    # if this is the top section reset everything
+    if ($section eq "") {
+	$self->{'subsection_order'} = [];
+	$self->{'subsections'} = {};
+	$self->{'metadata'} = [];
+	$self->{'text'} = "";
+	return;
+    }
+
+    # find the parent of the section to delete
+    my $parent_section = "";
+    my $child = "0";
+    my @section = split (/\./, $section);
+    if (scalar(@section) > 0) {
+	$child = pop (@section);
+	$parent_section = join (".", @section);
+    }
+
+    my $parent_section_ptr = $self->_lookup_section($parent_section);
+    if (!defined $parent_section_ptr) {
+	print STDERR "doc::delete_section couldn't find parent section " .
+	    "$parent_section\n";
+	return;
+    }
+
+    # remove this section from the subsection_order list
+    my $i = 0;
+    while ($i < scalar (@{$parent_section_ptr->{'subsection_order'}})) {
+	if ($parent_section_ptr->{'subsection_order'}->[$i] eq $child) {
+	    splice (@{$parent_section_ptr->{'subsection_order'}}, $i, 1);
+	    last;
+	}
+	$i++;
+    }
+
+    # remove this section from the subsection hash
+    if (defined ($parent_section_ptr->{'subsections'}->{$child})) {
+	undef $parent_section_ptr->{'subsections'}->{$child};
+    }
+}
+
+#--
+# methods for dealing with metadata
+
+# set_metadata_element and get_metadata_element are for metadata
+# which should only have one value. add_meta_data and get_metadata
+# are for metadata which can have more than one value.
+
+# returns the first metadata value which matches field
+
+# This version of get metadata element works much like the one above,
+# except it allows for the namespace portion of a metadata element to
+# be ignored, thus if you are searching for dc.Title, the first piece
+# of matching metadata ending with the name Title (once any namespace
+# is removed) would be returned.
+# 28-11-2003 John Thompson
+sub get_metadata_element {
+    my $self = shift (@_);
+    my ($section, $field, $ignore_namespace) = @_;
+    my ($data);
+
+    $ignore_namespace = 0 unless defined $ignore_namespace;
+
+    my $section_ptr = $self->_lookup_section($section);
+    if (!defined $section_ptr) {
+	print STDERR "doc::get_metadata_element couldn't find section ", $section, "\n";
+	return;
+    }
+
+    # Remove any namespace if we are being told to ignore them
+    if($ignore_namespace) {
+	$field =~ s/^.*\.//; #$field =~ s/^\w*\.//;
+    }
+
+    foreach $data (@{$section_ptr->{'metadata'}}) {
+
+	my $data_name = $data->[0];
+
+	# Remove any namespace if we are being told to ignore them
+	if($ignore_namespace) {
+	    $data_name =~ s/^.*\.//; #$data_name =~ s/^\w*\.//;
+	}
+	# we always remove ex. (but not any subsequent namespace) - ex. maybe there in doc_obj, but we will never ask for it.
+	$data_name =~ s/^ex\.([^.]+)$/$1/; #$data_name =~ s/^ex\.//; 
+	
+	return $data->[1] if (scalar(@$data) >= 2 && $data_name eq $field);
+    }
+	
+    return undef; # was not found
+}
+
+# returns a list of the form [value1, value2, ...]
+sub get_metadata {
+    my $self = shift (@_);
+    my ($section, $field, $ignore_namespace) = @_;
+    my ($data);
+
+    $ignore_namespace = 0 unless defined $ignore_namespace;
+
+    my $section_ptr = $self->_lookup_section($section);
+    if (!defined $section_ptr) {
+        print STDERR "doc::get_metadata couldn't find section ",
+	    $section, "\n";
+        return;
+    }
+
+    # Remove any namespace if we are being told to ignore them
+    if($ignore_namespace) {
+	$field =~ s/^.*\.//;
+    }
+
+    my @metadata = ();
+    foreach $data (@{$section_ptr->{'metadata'}}) {
+
+	my $data_name = $data->[0];
+
+	# Remove any namespace if we are being told to ignore them
+	if($ignore_namespace) {
+	    $data_name =~ s/^.*\.//;
+	}	
+	# we always remove ex. (but not any subsequent namespace) - ex. maybe there in doc_obj, but we will never ask for it.
+	$data_name =~ s/^ex\.([^.]+)$/$1/;
+
+        push (@metadata, $data->[1]) if ($data_name eq $field);
+    }
+
+    return \@metadata;
+}
+
+sub get_metadata_hashmap {
+	my $self = shift (@_);
+	my ($section, $opt_namespace) = @_;
+	
+	my $section_ptr = $self->_lookup_section($section);
+	if (!defined $section_ptr) {
+            print STDERR "doc::get_metadata couldn't find section ",
+            $section, "\n";
+            return;
+        }
+
+	my $metadata_hashmap = {};
+	foreach my $data (@{$section_ptr->{'metadata'}}) {
+            my $metaname = $data->[0];
+          
+            if ((!defined $opt_namespace) || ($metaname =~ m/^$opt_namespace\./)) {
+                if (!defined $metadata_hashmap->{$metaname}) {
+                    $metadata_hashmap->{$metaname} = [];
+                  }
+                my $metaval_list = $metadata_hashmap->{$metaname};
+                push(@$metaval_list, $data->[1]); 
+              }
+          }
+	
+	return $metadata_hashmap;
+}
+
+# returns a list of the form [[field,value],[field,value],...]
+sub get_all_metadata {
+    my $self = shift (@_);
+    my ($section) = @_;
+
+    my $section_ptr = $self->_lookup_section($section);
+    if (!defined $section_ptr) {
+	print STDERR "doc::get_all_metadata couldn't find section ", $section, "\n";
+	return;
+    }
+    
+    return $section_ptr->{'metadata'};
+}
+
+# $value is optional
+sub delete_metadata {
+    my $self = shift (@_);
+    my ($section, $field, $value) = @_;
+
+    my $section_ptr = $self->_lookup_section($section);
+    if (!defined $section_ptr) {
+	print STDERR "doc::delete_metadata couldn't find section ", $section, "$field\n";
+	return;
+    }
+
+    my $i = 0;
+    while ($i < scalar (@{$section_ptr->{'metadata'}})) {
+	if (($section_ptr->{'metadata'}->[$i]->[0] eq $field) &&
+	    (!defined $value || $section_ptr->{'metadata'}->[$i]->[1] eq $value)) {
+	    splice (@{$section_ptr->{'metadata'}}, $i, 1);
+	} else {
+	    $i++;
+	}
+    }
+}
+
+sub delete_all_metadata {
+    my $self = shift (@_);
+    my ($section) = @_;
+
+    my $section_ptr = $self->_lookup_section($section);
+    if (!defined $section_ptr) {
+	print STDERR "doc::delete_all_metadata couldn't find section ", $section, "\n";
+	return;
+    }
+    
+    $section_ptr->{'metadata'} = [];
+}
+
+sub set_metadata_element {
+    my $self = shift (@_);
+    my ($section, $field, $value) = @_;
+
+    $self->set_utf8_metadata_element ($section, $field, 
+				      &unicode::ascii2utf8(\$value));
+}
+
+# set_utf8_metadata_element assumes the text has already been
+# converted to the UTF-8 encoding.
+sub set_utf8_metadata_element {
+    my $self = shift (@_);
+    my ($section, $field, $value) = @_;
+
+    $self->delete_metadata ($section, $field);
+    $self->add_utf8_metadata ($section, $field, $value);
+}
+
+
+# add_metadata assumes the text is in (extended) ascii form. For
+# text which has already been converted to the UTF-8 format use
+# add_utf8_metadata.
+sub add_metadata {
+    my $self = shift (@_);
+    my ($section, $field, $value) = @_;
+
+    $self->add_utf8_metadata ($section, $field,
+			      &unicode::ascii2utf8(\$value));
+}
+
+sub add_utf8_metadata {
+    my $self = shift (@_);
+    my ($section, $field, $value) = @_;
+
+#    my ($cpackage,$cfilename,$cline,$csubr,$chas_args,$cwantarray) = caller(1);
+#    my ($lcfilename) = ($cfilename =~ m/([^\\\/]*)$/);
+#    print STDERR "** Calling method: $lcfilename:$cline $cpackage->$csubr\n";
+
+    my $section_ptr = $self->_lookup_section($section);
+    if (!defined $section_ptr) {
+	print STDERR "doc::add_utf8_metadata couldn't find section ", $section, "\n";
+	return;
+    }
+    if (!defined $value) {
+	print STDERR "doc::add_utf8_metadata undefined value for $field\n";
+	return;
+    }
+    if (!defined $field) {
+	print STDERR "doc::add_utf8_metadata undefined metadata type \n";
+	return;
+    }
+    
+    #print STDERR "###$field=$value\n";
+
+    # For now, supress this check.  Given that text data read in is now 
+    # Unicode aware, then the following block of code can (ironically enough) 
+    # cause our unicode compliant string to be re-encoded (leading to
+    # a double-encoded UTF-8 string, which we definitely don't want!).
+    
+
+    # double check that the value is utf-8
+#    if (!&unicode::check_is_utf8($value)) {
+#	print STDERR "doc::add_utf8_metadata - warning: '$field''s value $value wasn't utf8.";
+#	&unicode::ensure_utf8(\$value);
+#	print STDERR " Tried converting to utf8: $value\n";
+#    }
+
+    push (@{$section_ptr->{'metadata'}}, [$field, $value]);
+}
+
+
+# methods for dealing with text
+
+# returns the text for a section
+sub get_text {
+    my $self = shift (@_);
+    my ($section) = @_;
+
+    my $section_ptr = $self->_lookup_section($section);
+    if (!defined $section_ptr) {
+	print STDERR "doc::get_text couldn't find section " .
+	    "$section\n";
+	return "";
+    }
+
+    return $section_ptr->{'text'};
+}
+
+# returns the (utf-8 encoded) length of the text for a section
+sub get_text_length {
+    my $self = shift (@_);
+    my ($section) = @_;
+
+    my $section_ptr = $self->_lookup_section($section);
+    if (!defined $section_ptr) {
+	print STDERR "doc::get_text_length couldn't find section " .
+	    "$section\n";
+	return 0;
+    }
+
+    return length ($section_ptr->{'text'});
+}
+
+# returns the total length for all the sections
+sub get_total_text_length {
+    my $self = shift (@_);
+
+    my $section = $self->get_top_section(); 
+    my $length = 0;
+    while (defined $section) {
+	$length += $self->get_text_length($section);
+	$section = $self->get_next_section($section);
+    }
+    return $length;
+}
+
+sub delete_text {
+    my $self = shift (@_);
+    my ($section) = @_;
+
+    my $section_ptr = $self->_lookup_section($section);
+    if (!defined $section_ptr) {
+	print STDERR "doc::delete_text couldn't find section " .
+	    "$section\n";
+	return;
+    }
+
+    $section_ptr->{'text'} = "";
+}
+
+# add_text assumes the text is in (extended) ascii form. For
+# text which has been already converted to the UTF-8 format
+# use add_utf8_text.
+sub add_text {
+    my $self = shift (@_);
+    my ($section, $text) = @_;
+
+    # convert the text to UTF-8 encoded unicode characters
+    # and add the text
+    $self->add_utf8_text($section, &unicode::ascii2utf8(\$text));
+}
+
+
+# add_utf8_text assumes the text to be added has already
+# been converted to the UTF-8 encoding. For ascii text use
+# add_text
+sub add_utf8_text {
+    my $self = shift (@_);
+    my ($section, $text) = @_;
+
+    my $section_ptr = $self->_lookup_section($section);
+    if (!defined $section_ptr) {
+	print STDERR "doc::add_utf8_text couldn't find section " .
+	    "$section\n";
+	return;
+    }
+
+    $section_ptr->{'text'} .= $text;
+}
+
+# returns the Source meta, which is the utf8 filename generated.
+# Added a separate method here for convenience
+sub get_source {
+    my $self = shift (@_);
+    return $self->get_metadata_element ($self->get_top_section(), "Source");
+}
+
+# returns the SourceFile meta, which is the url reference to the URL-encoded
+# version of Source (the utf8 filename). Added a separate method here for convenience
+sub get_sourcefile {
+    my $self = shift (@_);
+    return $self->get_metadata_element ($self->get_top_section(), "SourceFile");
+}
+
+# Get the actual name of the assocfile, a url-encoded string derived from SourceFile.
+# The SourceFile meta is the (escaped) url reference to the url-encoded assocfile.
+sub get_assocfile_from_sourcefile {
+    my $self = shift (@_);
+    
+    # get the SourceFile meta, which is a *URL* to a file on the filesystem
+    my $top_section = $self->get_top_section();
+    my $source_file = $self->get_metadata_element($top_section, "SourceFile");
+
+    # get the actual filename as it exists on the filesystem which this url refers to
+    $source_file = &unicode::url_to_filename($source_file); 
+    my ($assocfilename) = $source_file =~ /([^\\\/]+)$/;
+    return $assocfilename;
+}
+
+# methods for dealing with associated files
+
+# a file is associated with a document, NOT a section.
+# if section is defined it is noted in the data structure
+# only so that files associated from a particular section
+# may be removed later (using delete_section_assoc_files)
+sub associate_file {
+    my $self = shift (@_);
+    my ($real_filename, $assoc_filename, $mime_type, $section) = @_;
+    $mime_type = &ghtml::guess_mime_type ($real_filename) unless defined $mime_type;
+
+    # remove all associated files with the same name
+    $self->delete_assoc_file ($assoc_filename);
+
+    # Too harsh a requirement
+    # Definitely get HTML docs, for example, with some missing
+    # support files
+#    if (!&util::fd_exists($real_filename)) {
+#	print STDERR "****** doc::associate_file(): Failed to find the file $real_filename\n";
+#	exit -1;
+#    }
+
+#    print STDERR "**** is the following a UTF8 rep of *real* filename?\n   $real_filename\n";
+#    print STDERR "****##### so, ensure it is before storing?!?!?\n";
+##    my $utf8_filename = Encode::encode("utf8",$filename);
+
+    push (@{$self->{'associated_files'}}, 
+	  [$real_filename, $assoc_filename, $mime_type, $section]);
+}
+
+# returns a list of associated files in the form
+#   [[real_filename, assoc_filename, mimetype], ...]
+sub get_assoc_files {
+    my $self = shift (@_);
+
+    return $self->{'associated_files'};
+}
+
+# the following two methods used to keep track of original associated files
+# for incremental building. eg a txt file used by an item file does not end
+# up as an assoc file for the doc.xml, but it needs to be recorded as a source
+# file for incremental build
+sub associate_source_file {
+    my $self = shift (@_);
+    my ($full_filename) = @_;
+
+    push (@{$self->{'source_assoc_files'}}, $full_filename);
+
+}
+
+sub get_source_assoc_files {
+    my $self = shift (@_);
+
+    return $self->{'source_assoc_files'};
+ 
+
+}
+sub metadata_file {
+    my $self = shift (@_);
+    my ($real_filename, $filename) = @_;
+    
+    push (@{$self->{'metadata_files'}}, 
+	  [$real_filename, $filename]);
+}
+
+# used for writing out the archiveinf-doc info database, to list all the metadata files
+sub get_meta_files {
+    my $self = shift (@_);
+
+    return $self->{'metadata_files'};
+}
+
+sub delete_section_assoc_files {
+    my $self = shift (@_);
+    my ($section) = @_;
+
+    my $i=0;
+    while ($i < scalar (@{$self->{'associated_files'}})) {
+	if (defined $self->{'associated_files'}->[$i]->[3] &&
+	    $self->{'associated_files'}->[$i]->[3] eq $section) {
+	    splice (@{$self->{'associated_files'}}, $i, 1);
+	} else {
+	    $i++;
+	}
+    }
+}
+
+sub delete_assoc_file {
+    my $self = shift (@_);
+    my ($assoc_filename) = @_;
+
+    my $i=0;
+    while ($i < scalar (@{$self->{'associated_files'}})) {
+	if ($self->{'associated_files'}->[$i]->[1] eq $assoc_filename) {
+	    splice (@{$self->{'associated_files'}}, $i, 1);
+	} else {
+	    $i++;
+	}
+    }
+}
+
+sub reset_nextsection_ptr {
+    my $self = shift (@_);
+    my ($section) = @_;
+    
+    my $section_ptr = $self->_lookup_section($section);
+    $section_ptr->{'next_subsection'} = 1;
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/docprint.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/docprint.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/docprint.pm	(revision 24799)
@@ -0,0 +1,84 @@
+###########################################################################
+#
+# docprint.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2006 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# This is used to output an XML representation of a doc_obj - this will be 
+# Greenstone XML format.
+# This is used by GreenstoneXMLPlugout and doc.pm
+
+package docprint;
+
+use strict;
+
+sub get_section_xml {
+    
+    my ($doc_obj, $section) = @_;
+
+    my $section_ptr = $doc_obj->_lookup_section ($section);
+    return "" unless defined $section_ptr;
+
+    my $all_text = "<Section>\n";
+    $all_text .= "  <Description>\n";
+    
+    # output metadata
+    foreach my $data (@{$section_ptr->{'metadata'}}) {
+	my $escaped_value = &escape_text($data->[1]);
+	$all_text .= '    <Metadata name="' . $data->[0] . '">' . $escaped_value . "</Metadata>\n";
+    }
+
+    $all_text .= "  </Description>\n";
+
+    # output the text
+    $all_text .= "  <Content>";
+    $all_text .= &escape_text($section_ptr->{'text'});
+    $all_text .= "</Content>\n";
+    
+    # output all the subsections
+    foreach my $subsection (@{$section_ptr->{'subsection_order'}}) {
+	$all_text .= &get_section_xml($doc_obj, "$section.$subsection");
+    }
+    
+    $all_text .=  "</Section>\n";
+
+    # make sure no nasty control characters have snuck through
+    # (XML::Parser will barf on anything it doesn't consider to be
+    # valid UTF-8 text, including things like \c@, \cC etc.)
+    $all_text =~ s/[\x00-\x09\x0B\x0C\x0E-\x1F]//g;
+
+    return $all_text;
+}
+
+sub escape_text {
+    my ($text) = @_;
+    # special characters in the xml encoding
+    $text =~ s/&&/& &/g;
+    $text =~ s/&/&amp;/g; # this has to be first...
+    $text =~ s/</&lt;/g;
+    $text =~ s/>/&gt;/g;
+    $text =~ s/\"/&quot;/g;
+
+    return $text;
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/docproc.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/docproc.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/docproc.pm	(revision 24799)
@@ -0,0 +1,94 @@
+###########################################################################
+#
+# docproc.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# document processors are used by the document reader plugins
+# to do some processing on some documents
+
+package docproc;
+
+use strict;
+
+
+sub new {
+    my ($class) = @_;
+    my $self = {};
+
+    $self->{'OIDtype'} = "hash";
+    $self->{'saveas'} = "GreenstoneXML";  # default
+
+    return bless $self, $class;
+}
+
+sub process {
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+
+    die "docproc::process function must be implemented in sub classes\n";
+}
+
+# OIDtype may be "hash" or "incremental" or "dirname" or "assigned"
+sub set_OIDtype {
+    my $self = shift (@_);
+    my ($type, $metadata) = @_;
+
+    if ($type =~ /^(hash|incremental|dirname|assigned)$/) {
+	$self->{'OIDtype'} = $type;
+    } else {
+	$self->{'OIDtype'} = "hash";
+    }
+    if ($type =~ /^assigned$/) {
+	if (defined $metadata) {
+	    $self->{'OIDmetadata'} = $metadata;
+	} else {
+	    $self->{'OIDmetadata'} = "dc.Identifier";
+	}
+    }
+}
+
+sub set_saveas {
+    my $self = shift (@_);
+    my ($saveas) = @_;
+
+    $self->{'saveas'} = $saveas;
+
+}
+
+sub set_saveas_version {
+    my $self = shift (@_);
+    my ($saveas_version) = @_;
+
+    $self->{'saveas_version'} = $saveas_version;
+
+}
+
+
+1;
+
+
+
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/download.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/download.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/download.pm	(revision 24799)
@@ -0,0 +1,91 @@
+###########################################################################
+#
+# download.pm -- functions to handle using download modules
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2005 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package download;
+
+use strict; # to pick up typos and undeclared variables...
+no strict 'refs'; # ...but allow filehandles to be variables and vice versa
+no strict 'subs';
+
+##require util;
+use util;
+use gsprintf 'gsprintf';
+
+
+sub load_download {
+    my ($download_name,$download_options) = @_;
+
+    my ($download_obj);
+
+    my $coldownloadname ="";
+
+    if ($ENV{'GSDLCOLLECTDIR'}){
+   
+	$coldownloadname = &util::filename_cat($ENV{'GSDLCOLLECTDIR'}, 
+					      "perllib","downloaders", 
+					      "${download_name}.pm");
+
+    }
+   
+    my $maindownloadname = &util::filename_cat($ENV{'GSDLHOME'},
+					       "perllib","downloaders", 
+					       "${download_name}.pm");
+
+    if (-e $coldownloadname) { require $coldownloadname;}
+    elsif (-e $maindownloadname ) { require $maindownloadname; }
+    else {
+	&gsprintf(STDERR, "{download.could_not_find_download}\n",
+		 $download_name);
+	die "\n";
+    }
+
+    eval ("\$download_obj = new \$download_name([],\$download_options)");
+    die "$@" if $@;
+ 
+    return $download_obj;
+}
+
+sub process {
+    my ($download_obj,$options) = @_;
+    # options: This is a hash map which maps to 
+    #                   downloadfrom's arguments
+    #                   $options->{'cache_dir'}
+    #                   $options->{'download_mode'}
+    #                   $options->{'gli_call'}
+    #                   $options->{'info'}
+    $download_obj->setIsGLI($options->{'gli'});
+
+    ($download_obj->download($options) == 1)?
+	return "true":
+	return "false";
+}
+
+sub get_information {
+    my ($download_obj) = @_;
+    
+    $download_obj->url_information();
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/downloaders/BaseDownload.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/downloaders/BaseDownload.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/downloaders/BaseDownload.pm	(revision 24799)
@@ -0,0 +1,250 @@
+###########################################################################
+#
+# BaseDownload.pm -- base class for all the Download modules
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2006 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package BaseDownload;
+
+eval {require bytes};
+
+use strict;
+no strict 'subs';
+
+use gsprintf 'gsprintf';
+use printusage;
+use parse2;
+
+# suppress the annoying "subroutine redefined" warning that various
+# gets cause under perl 5.6
+$SIG{__WARN__} = sub {warn($_[0]) unless ($_[0] =~ /Subroutine\s+\S+\sredefined/)};
+
+my $arguments = [];
+
+my $options = { 'name'     => "BaseDownload",
+		'desc'     => "{BaseDownload.desc}",
+		'abstract' => "yes",
+		'inherits' => "no" };
+
+sub new 
+{
+    my $class = shift (@_);
+    my ($downloadlist,$args,$hashArgOptLists) = @_;
+    push(@$downloadlist, $class);
+    my $strDownloadName = (defined $downloadlist->[0]) ? $downloadlist->[0] : $class;
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = {};
+    $self->{'download_type'} = $strDownloadName;
+    $self->{'option_list'} = $hashArgOptLists->{"OptList"};
+    $self->{"info_only"} = 0;
+
+    # Check if gsdlinfo is in the argument list or not - if it is, don't parse 
+    # the args, just return the object.  
+    foreach my $strArg (@{$args})
+    {
+	if($strArg eq "-gsdlinfo")
+	{
+	    $self->{"info_only"} = 1;
+	    return bless $self, $class;
+	}
+    }
+    
+    delete $self->{"info_only"};
+    
+    if(parse2::parse($args,$hashArgOptLists->{"ArgList"},$self) == -1)
+    {
+	my $classTempClass = bless $self, $class;
+	print STDERR "<BadDownload d=$self->{'download_name'}>\n";
+	&gsprintf(STDERR, "\n{BaseDownload.bad_general_option}\n", $self->{'download_name'});
+	$classTempClass->print_txt_usage("");  # Use default resource bundle
+	die "\n";
+    }
+
+    return bless $self, $class;
+
+}
+
+sub download
+{
+    my ($self) = shift (@_);
+    my ($hashGeneralOptions) = @_;
+    &error("download","No download specified for $hashGeneralOptions->{download_mode}.\n");
+}
+
+
+sub print_xml_usage
+{
+    my $self = shift(@_);
+    my $header = shift(@_);
+    my $high_level_information_only = shift(@_);
+    
+    # XML output is always in UTF-8
+    gsprintf::output_strings_in_UTF8;
+
+    if ($header) {
+	&PrintUsage::print_xml_header("download");
+    }
+    $self->print_xml($high_level_information_only);
+}
+
+
+sub print_xml
+{
+    my $self = shift(@_);
+    my $high_level_information_only = shift(@_);
+
+    my $optionlistref = $self->{'option_list'};
+    my @optionlist = @$optionlistref;
+    my $downloadoptions = shift(@$optionlistref);
+    return if (!defined($downloadoptions));
+
+    gsprintf(STDERR, "<DownloadInfo>\n");
+    gsprintf(STDERR, "  <Name>$downloadoptions->{'name'}</Name>\n");
+    my $desc = gsprintf::lookup_string($downloadoptions->{'desc'});
+    $desc =~ s/</&amp;lt;/g; # doubly escaped
+    $desc =~ s/>/&amp;gt;/g;
+    gsprintf(STDERR, "  <Desc>$desc</Desc>\n");
+    gsprintf(STDERR, "  <Abstract>$downloadoptions->{'abstract'}</Abstract>\n");
+    gsprintf(STDERR, "  <Inherits>$downloadoptions->{'inherits'}</Inherits>\n");
+    unless (defined($high_level_information_only)) {
+	gsprintf(STDERR, "  <Arguments>\n");
+	if (defined($downloadoptions->{'args'})) {
+	    &PrintUsage::print_options_xml($downloadoptions->{'args'});
+	}
+	gsprintf(STDERR, "  </Arguments>\n");
+
+	# Recurse up the download hierarchy
+	$self->print_xml();
+    }
+    gsprintf(STDERR, "</DownloadInfo>\n");
+}
+
+
+sub print_txt_usage
+{
+    my $self = shift(@_);
+
+    # Print the usage message for a download (recursively)
+    my $descoffset = $self->determine_description_offset(0);
+    $self->print_download_usage($descoffset, 1);
+}
+
+sub determine_description_offset
+{
+    my $self = shift(@_);
+    my $maxoffset = shift(@_);
+
+    my $optionlistref = $self->{'option_list'};
+    my @optionlist = @$optionlistref;
+    my $downloadoptions = pop(@$optionlistref);
+    return $maxoffset if (!defined($downloadoptions));
+
+    # Find the length of the longest option string of this download
+    my $downloadargs = $downloadoptions->{'args'};
+    if (defined($downloadargs)) {
+	my $longest = &PrintUsage::find_longest_option_string($downloadargs);
+	if ($longest > $maxoffset) {
+	    $maxoffset = $longest;
+	}
+    }
+
+    # Recurse up the download hierarchy
+    $maxoffset = $self->determine_description_offset($maxoffset);
+    $self->{'option_list'} = \@optionlist;
+    return $maxoffset;
+}
+
+
+sub print_download_usage
+{
+    my $self = shift(@_);
+    my $descoffset = shift(@_);
+    my $isleafclass = shift(@_);
+
+    my $optionlistref = $self->{'option_list'};
+    my @optionlist = @$optionlistref;
+    my $downloadoptions = shift(@$optionlistref);
+    return if (!defined($downloadoptions));
+
+    my $downloadname = $downloadoptions->{'name'};
+    my $downloadargs = $downloadoptions->{'args'};
+    my $downloaddesc = $downloadoptions->{'desc'};
+
+    # Produce the usage information using the data structure above
+    if ($isleafclass) {
+	if (defined($downloaddesc)) {
+	    gsprintf(STDERR, "$downloaddesc\n\n");
+	}
+	gsprintf(STDERR, " {common.usage}: download $downloadname [{common.options}]\n\n");
+    }
+
+    # Display the download options, if there are some
+    if (defined($downloadargs)) {
+	# Calculate the column offset of the option descriptions
+	my $optiondescoffset = $descoffset + 2;  # 2 spaces between options & descriptions
+
+	if ($isleafclass) {
+	    gsprintf(STDERR, " {common.specific_options}:\n");
+	}
+	else {
+	    gsprintf(STDERR, " {common.general_options}:\n", $downloadname);
+	}
+
+	# Display the download options
+	&PrintUsage::print_options_txt($downloadargs, $optiondescoffset);
+    }
+
+    # Recurse up the download hierarchy
+    $self->print_download_usage($descoffset, 0);
+    $self->{'option_list'} = \@optionlist;
+}
+
+sub url_information
+{
+    my ($self) = @_;
+    print STDERR "There is no extra information provided for this Download.\n";
+    return "";
+}
+
+# method to set whether or not we're running the download scripts from GLI
+sub setIsGLI()
+{
+    my ($self, $is_gli) = @_; 
+
+    $self->{'gli'} = $is_gli;
+}
+
+sub error
+{
+      my ($strFunctionName,$strError) = @_;
+    {
+	print "An error occurred in BaseDownload.pm\n".
+	    "In Function: ".$strFunctionName."\n".
+	    "Error Message: ".$strError."\n";
+	exit(-1);
+    }  
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/downloaders/MediaWikiDownload.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/downloaders/MediaWikiDownload.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/downloaders/MediaWikiDownload.pm	(revision 24799)
@@ -0,0 +1,322 @@
+###########################################################################
+#
+# MediaWikiDownload.pm -- downloader for wiki pages
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package MediaWikiDownload;
+
+eval {require bytes};
+
+# suppress the annoying "subroutine redefined" warning that various
+# plugins cause under perl 5.6
+$SIG{__WARN__} = sub {warn($_[0]) unless ($_[0] =~ /Subroutine\s+\S+\sredefined/)};
+
+use WgetDownload;
+
+sub BEGIN {
+    @MediaWikiDownload::ISA = ('WgetDownload');
+}
+
+use strict; # every perl program should have this!
+no strict 'refs'; # make an exception so we can use variables as filehandles
+
+my $arguments = 
+    [ { 'name' => "url", 
+	'disp' => "{WebDownload.url_disp}",
+	'desc' => "{WebDownload.url}",
+	'type' => "string",
+	'reqd' => "yes"},
+      { 'name' => "depth", 
+	'disp' => "{WebDownload.depth_disp}",
+	'desc' => "{WebDownload.depth}",
+	'type' => "int",
+	'deft' => "0",
+	"range" => "0,",
+	'reqd' => "no"},
+      { 'name' => "below", 
+	'disp' => "{WebDownload.below_disp}",
+	'desc' => "{WebDownload.below}",
+	'type' => "flag",
+	'reqd' => "no"},
+      { 'name' => "within", 
+	'disp' => "{WebDownload.within_disp}",
+	'desc' => "{WebDownload.within}",
+	'type' => "flag",
+	'reqd' => "no"},     
+      { 'name' => "reject_files",
+	'disp' => "{MediaWikiDownload.reject_filetype_disp}",
+	'desc' => "{MediaWikiDownload.reject_filetype}",
+	'type' => "string",
+	'reqd' => "no",
+	'deft' => "*action=*,*diff=*,*oldid=*,*printable*,*Recentchangeslinked*,*Userlogin*,*Whatlinkshere*,*redirect*,*Special:*,Talk:*,Image:*,*.ppt,*.pdf,*.zip,*.doc"},
+      { 'name' => "exclude_directories",
+	'disp' => "{MediaWikiDownload.exclude_directories_disp}",
+	'desc' => "{MediaWikiDownload.exclude_directories}",
+	'type' => "string",
+	'reqd' => "no",
+	'deft' => "/wiki/index.php/Special:Recentchangeslinked,/wiki/index.php/Special:Whatlinkshere,/wiki/index.php/Talk:Creating_CD"},
+      ];
+
+my $options = { 'name'     => "MediaWikiDownload",
+		'desc'     => "{MediaWikiDownload.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+my $wget_options = "";
+
+my $self;
+
+sub new 
+{
+    my ($class) = shift (@_);
+    my ($getlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$getlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+     my $self = new WgetDownload($getlist,$inputargs,$hashArgOptLists);
+    
+    return bless $self, $class;
+}
+
+
+sub download
+{
+    my ($self) = shift (@_);
+    my ($hashGeneralOptions) = @_;
+  
+    # Download options
+    my $strOptions = $self->generateOptionsString();
+    my $strWgetOptions = $self->getWgetOptions();
+      
+    # Setup the command for using wget
+    $wget_options = "-N -k -x -t 2 -P \"". $hashGeneralOptions->{"cache_dir"}."\" $strWgetOptions $strOptions ";
+    my $cmdWget = "-N -k -x -t 2 -P \"". $hashGeneralOptions->{"cache_dir"}."\" $strWgetOptions $strOptions " . $self->{'url'};
+    
+    # Download the web pages
+    # print "Strat download from $self->{'url'}...\n";
+    print STDERR "<<Undefined Maximum>>\n";
+
+    my $strResponse = $self->useWget($cmdWget,1);
+ 
+    # if ($strResponse ne ""){print "$strResponse\n";}
+        
+    print STDERR "Finish download from $self->{'url'}\n";
+    
+    # check css files for HTML pages are downloaded as well
+    $self->{'url'} =~ /http:\/\/([^\/]*)\//;        
+    my $base_url = &util::filename_cat($hashGeneralOptions->{"cache_dir"}, $1);    
+    &check_file($base_url, $self);
+        
+    print STDERR "<<Finished>>\n";
+  
+    return 1;
+}
+
+sub check_file 
+{    
+    my $dir = shift;
+    my ($self) = shift;
+    
+    local *DIR; 
+     
+    opendir DIR, $dir or return;
+    
+    my @contents = grep { $_ ne '.' and $_ ne '..' } readdir DIR;
+    
+    closedir DIR;
+    
+    foreach (@contents) {
+      # broad-first search
+      &check_file("$dir/$_", $self);
+      
+      # read in every HTML page and check the css associated with import statement already exists.
+      &check_imported_css($self, "$dir/$_");
+    }
+} 
+
+sub check_imported_css
+{
+    my ($self) = shift(@_);    
+    my $downloaded_file = shift(@_);
+            
+    $downloaded_file =~ /(.+)(\/|\\)cache(\/|\\)([^\/\\]+)(\/|\\)/;
+    
+    # external website url, to make up the stylesheet urls
+    my $base_website_url = $4;
+    
+    # the cache download file directory
+    my $base_dir = "$1$2cache$3$4" if defined $base_website_url;
+    
+    if($downloaded_file=~/(.+)\.(html|htm)/) {
+      my $content = "";
+      if(open(INPUT, "<$downloaded_file")){
+	while(my $line = <INPUT>){
+          $content .= $line;
+	}
+        close(INPUT);
+      }
+      
+      my @css_files;
+      my @css_files_paths;
+      my $css_file_count = 0;
+      while($content =~ /<style type="text\/css"(.+)?import "(.+)?"/ig){
+	$css_files[$css_file_count] = $base_website_url . $2 if defined $2;
+        $css_files_paths[$css_file_count] = $base_dir . $2 if defined $2;
+        $css_file_count++;
+      }
+      
+      for($css_file_count=0; $css_file_count<scalar(@css_files); $css_file_count++) {        
+        my $css_file = "http://" . $css_files[$css_file_count];
+        my $css_file_path = $css_files_paths[$css_file_count];
+        
+        # trim the ? mark append to the end of a stylesheet
+        $css_file =~ s/\?([^\/\.\s]+)$//isg;         
+        $css_file_path =~ s/\?([^\/\.\s]+)$//isg;         
+        
+        # do nothing if the css file existed
+        next if(-e $css_file_path);
+        
+        # otherwise use Wget to download the css files
+        my $cmdWget = $wget_options . $css_file;        
+        my $strResponse = $self->useWget($cmdWget,1);
+        
+        print STDERR "Downloaded associated StyleSheet : $css_file\n";
+      }
+    }
+}
+
+
+sub generateOptionsString
+{
+    my ($self) = @_;
+    my $strOptions;
+
+    (defined $self) || &error("generateOptionsString","No \$self is defined!!\n");
+    (defined $self->{'depth'})|| &error("generateOptionsString","No depth is defined!!\n");   
+    
+    # -r for recursive downloading
+    # -E to append a 'html' suffix to a file of type 'application/xhtml+xml' or 'text/html'
+    $strOptions .="-r -E ";
+
+    # -X exclude file directories
+    if($self->{'exclude_directories'}==1) {
+	$strOptions .="-X " . $self->{'exclude_directories'};
+    } else {
+	$strOptions .="-X /wiki/index.php/Special:Recentchangeslinked,/wiki/index.php/Special:Whatlinkshere,/wiki/index.php/Talk:Creating_CD ";
+    }	
+
+    # -R reject file list, reject files with these text in their names
+    if($self->{'reject_files'}==1) {
+	$strOptions .="-R " . $self->{'reject_files'};
+    } else {
+	$strOptions .="-R *action=*,*diff=*,*oldid=*,*printable*,*Recentchangeslinked*,*Userlogin*,*Whatlinkshere*,*redirect*,*Special:*,Talk:*,Image:* ";
+    }    
+    
+    if($self->{'depth'} == 0){
+	$strOptions .= " ";
+    } elsif($self->{'depth'} > 0) {
+	$strOptions .= "-l ".$self->{'depth'}." "; # already got -r
+    } else {
+	$self->error("setupOptions","Incorrect Depth is defined!!\n");
+    }
+
+    if($self->{'below'})  {
+	$strOptions .="-np ";
+    }
+
+    # if($self->{'html_only'}) {
+	# $strOptions .="-A .html,.htm,.shm,.shtml,.asp,.php,.cgi,*?*=* ";
+    # } else{
+	# $strOptions .="-p ";
+    #}
+
+    if (!$self->{'within'}){
+	$strOptions .="-H ";
+    }    
+    
+    return $strOptions;  
+}
+
+sub url_information
+{
+    my ($self) = shift (@_);
+
+    my $strOptions = $self->getWgetOptions();
+
+    my $strBaseCMD = $strOptions." -q -O - \"$self->{'url'}\"";
+
+  
+    my $strIdentifyText = $self->useWget($strBaseCMD);
+    
+    if (!defined $strIdentifyText or $strIdentifyText eq ""  ){
+		print STDERR "Server information is unavailable.\n";
+		print STDERR "<<Finished>>\n";
+		return;  
+    }
+
+    while ($strIdentifyText =~ m/^(.*)<title>(.*?)<\/title>(.*)$/s)  {
+		$strIdentifyText = $1.$3;
+		print STDERR "Page Title: $2\n";
+    }
+  
+    while ($strIdentifyText =~ m/^(.*)<meta (.*?)>(.*)$/s)  {
+	$strIdentifyText = $1.$3;
+	my $strTempString = $2;
+	print STDERR "\n";
+
+	while($strTempString =~ m/(.*?)=[\"|\'](.*?)[\"|\'](.*?)$/s){
+	    # Store the infromation in to variable, since next time when we do 
+	    # regular expression, we will lost all the $1, $2, $X....
+	    $strTempString = $3;
+	    my $strMetaName = $1;
+	    my $strMetaContain = $2;
+	    
+	    # Take out the extra space in the beginning of the string.
+	    $strMetaName =~ s/^([" "])+//m;
+	    $strMetaContain =~ s/^([" "])+//m;
+              
+	    print STDERR "$strMetaName: $strMetaContain\n\n";           
+	}
+    }
+
+    print STDERR "<<Finished>>\n";
+
+}
+
+
+sub error
+{
+    my ($strFunctionName,$strError) = @_;
+    {
+	print "Error occoured in MediaWikiDownload.pm\n".
+	    "In Function:".$strFunctionName."\n".
+	    "Error Message:".$strError."\n";
+	exit(-1);
+    }
+}
+
+1;
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/downloaders/OAIDownload.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/downloaders/OAIDownload.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/downloaders/OAIDownload.pm	(revision 24799)
@@ -0,0 +1,644 @@
+###########################################################################
+#
+# OAIDownload.pm -- base class for all the import plugins
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package OAIDownload;
+
+eval {require bytes};
+
+# suppress the annoying "subroutine redefined" warning that various
+# plugins cause under perl 5.6
+$SIG{__WARN__} = sub {warn($_[0]) unless ($_[0] =~ /Subroutine\s+\S+\sredefined/)};
+
+use strict;
+
+use WgetDownload;
+use XMLParser;
+
+use POSIX qw(tmpnam);
+use util;
+
+sub BEGIN {
+    @OAIDownload::ISA = ('WgetDownload');
+}
+
+my $arguments = 
+    [ { 'name' => "url", 
+	'disp' => "{OAIDownload.url_disp}",
+	'desc' => "{OAIDownload.url}",
+	'type' => "string",
+	'reqd' => "yes"},
+      { 'name' => "metadata_prefix", 
+	'disp' => "{OAIDownload.metadata_prefix_disp}",
+	'desc' => "{OAIDownload.metadata_prefix}",
+	'type' => "string",
+	'deft' => "oai_dc",
+	'reqd' => "no"},
+      { 'name' => "set", 
+	'disp' => "{OAIDownload.set_disp}",
+	'desc' => "{OAIDownload.set}",
+	'type' => "string",
+	'reqd' => "no"},
+      { 'name' => "get_doc",
+	'disp' => "{OAIDownload.get_doc_disp}",
+	'desc' => "{OAIDownload.get_doc}",
+	'type' => "flag",
+	'reqd' => "no"},
+      { 'name' => "get_doc_exts",
+	'disp' => "{OAIDownload.get_doc_exts_disp}",
+	'desc' => "{OAIDownload.get_doc_exts}",
+	'type' => "string",
+	'deft' => "doc,pdf,ppt",
+	'reqd' => "no"},
+      { 'name' => "max_records", 
+	'disp' => "{OAIDownload.max_records_disp}",
+	'desc' => "{OAIDownload.max_records}",
+	'type' => "int",
+	'deft' => "500",
+	'range' => "1,",
+	'reqd' => "no"} ];
+
+my $options = { 'name'     => "OAIDownload",
+		'desc'     => "{OAIDownload.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+##my $self;
+
+#### my $strWgetOptions="";
+
+sub new 
+{
+    my ($class) = shift (@_);
+    my ($getlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$getlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new WgetDownload($getlist,$inputargs,$hashArgOptLists);
+
+    if ($self->{'info_only'}) {
+	# don't worry about any options etc
+	return bless $self, $class;
+    }
+
+    my $parser = new XML::Parser('Style' => 'Stream',
+                                 'PluginObj' => $self,
+				 'Handlers' => {'Char' => \&Char,
+						'Start' => \&OAI_StartTag,
+						'End' => \&OAI_EndTag
+						});
+    $self->{'parser'} = $parser;
+    
+    # make sure the tmp directory that we will use later exists
+    my $tmp_dir = "$ENV{GSDLHOME}/tmp";
+    if (! -e $tmp_dir) {
+	&util::mk_dir($tmp_dir);
+    }
+    
+
+    # set up hashmap for individual items in get_doc_exts
+    # to make testing for matches easier
+
+    $self->{'lookup_exts'} = {};
+    my $get_doc_exts = $self->{'get_doc_exts'};
+
+    if ((defined $get_doc_exts) && ($get_doc_exts ne "")) {
+	my @exts = split(/,\s*/,$get_doc_exts);
+	foreach my $e (@exts) {
+	    $self->{'lookup_exts'}->{lc($e)} = 1;
+	}
+    }
+
+
+    return bless $self, $class;
+}
+
+sub download
+{
+    my ($self) = shift (@_);
+    my ($hashGeneralOptions) = @_;
+
+##    my $cmdWget = $strWgetOptions;
+  
+    my $strOutputDir ="";
+    $strOutputDir = $hashGeneralOptions->{"cache_dir"};
+    my $strBasURL = $self->{'url'};
+    my $intMaxRecords = $self->{'max_records'};
+    my $blnDownloadDoc = $self->{'get_doc'};
+
+    print STDERR "<<Defined Maximum>>\n";
+
+    my $strIDs = $self->getOAIIDs($strBasURL);
+ 
+    if($strIDs eq "")
+    {
+	print STDERR "Error: No IDs found\n";
+	return 0;
+    }
+
+    my $aryIDs = $self->parseOAIIDs($strIDs);
+    my $intIDs = 0;
+    if($self->{'max_records'} < scalar(@$aryIDs))
+    {
+	$intIDs = $self->{'max_records'};
+    }
+    else
+    {
+	$intIDs = scalar(@$aryIDs);
+    }
+    print STDERR "<<Total number of record(s):$intIDs>>\n";
+
+    $self->getOAIRecords($aryIDs, $strOutputDir, $strBasURL, $intMaxRecords, $blnDownloadDoc);
+
+#    my $tmp_file = &util::filename_cat($ENV{'GSDLHOME'},"tmp","oai.tmp");
+#    &util::rm($tmp_file); 
+
+    return 1;
+}
+
+sub getOAIIDs
+{
+    my ($self,$strBasURL) = @_;
+##    my ($cmdWget);
+     
+    my $wgetOptions = $self->getWgetOptions();
+
+    my $cmdWget = $wgetOptions;
+  
+    print STDERR  "Gathering OAI identifiers.....\n";
+
+    my $metadata_prefix = $self->{'metadata_prefix'};
+    $cmdWget .= " -q -O - \"$strBasURL?verb=ListIdentifiers&metadataPrefix=$metadata_prefix";
+
+    # if $set specified, add it in to URL
+    my $set = $self->{'set'};
+    $cmdWget .= "&set=$set" if ($set ne "");
+
+    $cmdWget .= "\" ";
+
+    my $accumulated_strIDs = "";
+    my $strIDs =  $self->useWget($cmdWget);
+
+    if (!defined $strIDs or $strIDs eq ""  ){
+	print STDERR "Server information is unavailable.\n";
+	print STDERR "<<Finished>>\n";
+        return;  
+    }
+    if ($self->{'forced_quit'}) {
+	return $strIDs;
+    }
+
+    print STDERR "<<Download Information>>\n";
+    
+    $self->parse_xml($strIDs);
+
+    $accumulated_strIDs = $strIDs;
+
+    while ($strIDs =~ m/<resumptionToken.*?>\s*(.*?)\s*<\/resumptionToken>/) {
+	# top up list with further requests for IDs
+
+	my $resumption_token = $1;
+
+	$cmdWget = $wgetOptions;
+
+	$cmdWget .= " -q -O - \"$strBasURL?verb=ListIdentifiers&resumptionToken=$resumption_token\"";
+
+	$strIDs =  $self->useWget($cmdWget);
+	if ($self->{'forced_quit'}) {
+	    return $accumulated_strIDs;
+	}
+
+	$self->parse_xml($strIDs);
+
+	$accumulated_strIDs .= $strIDs;
+
+	my @accumulated_identifiers 
+	    = ($accumulated_strIDs =~ m/<identifier>(.*?)<\/identifier>/sg);
+
+	my $num_acc_identifiers = scalar(@accumulated_identifiers);
+	if ($num_acc_identifiers > $self->{'max_records'}) {
+	    last;
+	}
+    }
+
+    return $accumulated_strIDs;
+}
+
+sub parseOAIIDs
+{   
+    my ($self,$strIDs) = @_;
+
+    print STDERR "Parsing OAI identifiers.....\n";
+    $strIDs =~ s/^.*?<identifier>/<identifier>/s;
+    $strIDs =~ s/^(.*<\/identifier>).*$/$1/s;
+
+    my @aryIDs = ();
+
+    while ($strIDs =~ m/<identifier>(.*?)<\/identifier>(.*)$/s)
+    {
+	$strIDs = $2;
+	push(@aryIDs,$1);
+    }
+    
+    return \@aryIDs;
+} 
+
+sub dirFileSplit
+{
+    my ($self,$strFile) = @_;
+
+    my @aryDirs = split("[/\]",$strFile);
+   
+    my $strLocalFile = pop(@aryDirs);
+    my $strSubDirs = join("/",@aryDirs);
+
+    return ($strSubDirs,$strLocalFile);
+}
+
+sub getOAIDoc
+{
+    my ($self,$strRecord, $oai_rec_filename) = @_;
+ 
+    print  STDERR "Gathering source documents.....\n";
+    # look out for identifier tag in metadata section
+   
+    if ($strRecord =~ m/<metadata>(.*)<\/metadata>/s)
+    {
+	my $strMetaTag = $1;
+	my $had_valid_url = 0;
+	my $count = 1;
+	while ($strMetaTag =~ s/<(dc:)?identifier>(.*?)<\/(dc:)?identifier>//is)
+	{
+	    my $doc_id_url = $2;
+	    print STDERR "Found doc url: $doc_id_url\n";
+	    next if ($doc_id_url !~ m/^(https?|ftp):\/\//);
+
+	    my $orig_doc_id_url = $doc_id_url;
+	    $had_valid_url = 1;
+
+	    my ($doc_dir_url_prefix,$doc_id_tail) = ($doc_id_url =~ m/^(.*)\/(.*?)$/);
+	    my $faked_ext = 0;
+	    my $primary_doc_match = 0;
+
+	    my ($id_file_ext) = ($doc_id_tail =~ m/\.([^\.]+)$/);
+
+	    if (defined $id_file_ext) {
+		# cross-check this filename extension with get_doc_exts option
+		# if provided
+		my $lookup_exts = $self->{'lookup_exts'};
+
+		if (defined $lookup_exts->{lc($id_file_ext)}) {
+		    # this initial URL matches requirement
+		    $primary_doc_match = 1;
+		}
+	    }
+	    else {
+		$faked_ext = 1;
+		$id_file_ext = "html";
+	    }
+
+		
+	    if ((!$primary_doc_match) && ($id_file_ext =~ m/^html?$/i)) {
+		# Download this doc if HTML, scan through it looking for a link
+		# that does match get_doc_exts
+		
+
+		# 1. Generate a tmp name
+		my $tmp_filename = &util::get_tmp_filename();
+
+		# 2. Download it
+		my $wget_opts2 = $self->getWgetOptions();
+		my $wget_cmd2 = "$wget_opts2 --convert-links -O \"$tmp_filename\" \"$doc_id_url\"";
+		my ($stdout_and_err2,$error2,$follow2) =  $self->useWgetMonitored($wget_cmd2);
+		return $strRecord if $self->{'forced_quit'};
+
+		if($error2 ne "")
+		{
+		    print STDERR "Error occured while retrieving OAI source documents (1): $error2\n";
+		    #exit(-1);
+		    next; 
+		}
+
+		if (defined $follow2) {
+		    # src url was "redirected" to another place
+		    # => pick up on this and make it the new doc_id_url
+		    $doc_id_url = $follow2;
+		}
+
+		my $primary_doc_html = "";
+		if (open(HIN,"<$tmp_filename")) {
+		    my $line;
+		    while (defined ($line = <HIN>)) {
+			$primary_doc_html .= $line;
+		    }
+		    close(HIN);
+
+		    # 3. Scan through it looking for match
+		    # 
+		    # if got match, change $doc_id_url to this new URL and
+		    # $id_file_ext to 'match' 
+		    
+		    my @href_links = ($primary_doc_html =~ m/href="(.*?)"/gsi);
+
+		    my $lookup_exts = $self->{'lookup_exts'};
+
+		    foreach my $href (@href_links) {
+			my ($ext) = ($href =~ m/\.([^\.]+)$/);
+
+			if ((defined $ext) && (defined $lookup_exts->{$ext})) {
+
+			    if ($href !~ m/^(https?|ftp):\/\//) {
+				# link is within current site
+				my ($site_domain) = ($doc_id_url =~ m/^((?:https?|ftp):\/\/.*?)\//);
+
+				$href = "$site_domain$href";
+			    }
+
+			    $doc_id_url = $href;
+			    $id_file_ext = $ext;
+			    last;
+			}
+		    }
+		}
+		else {
+		    print STDERR "Error occurred while retrieving OAI source documents (2):\n";
+		    print STDERR "$!\n";
+		}
+
+		if (-e $tmp_filename) {
+		    &util::rm($tmp_filename); 
+		}
+	    }
+
+	    my $download_doc_filename = $oai_rec_filename;
+	    my $new_extension = "\-$count\.$id_file_ext";
+	    $count++;
+	    #$download_doc_filename =~ s/\.oai$/\.$id_file_ext/;
+	    $download_doc_filename =~ s/\.oai$/$new_extension/;
+	    my ($unused,$download_doc_file) = $self->dirFileSplit($download_doc_filename);
+
+	    # may have &apos; in url - others??
+	    my $safe_doc_id_url = $doc_id_url;
+	    $safe_doc_id_url =~ s/&apos;/\'/g;
+
+	    my $wget_opts = $self->getWgetOptions();
+	    my $wget_cmd = "$wget_opts --convert-links -O \"$download_doc_filename\" \"$safe_doc_id_url\"";
+	    
+	    my ($stdout_and_err,$errors,$follow) =  $self->useWgetMonitored($wget_cmd);
+	    return $strRecord if $self->{'forced_quit'};
+
+	    if($errors ne "")
+	    {
+		print STDERR "Error occured while retriving OAI souce documents (3):\n";
+		print STDERR "$errors\n";
+		#exit(-1);
+		next;
+	    }
+
+	    
+	    $strRecord =~ s/<metadata>(.*?)<((?:dc:)?identifier)>$orig_doc_id_url<\/((?:dc:)?identifier)>(.*?)<\/metadata>/<metadata>$1<${2}>$orig_doc_id_url<\/${2}>\n   <gi.Sourcedoc>$download_doc_file<\/gi.Sourcedoc>$4<\/metadata>/s;
+	}
+
+	if (!$had_valid_url)
+	{
+	    print  STDERR "\tNo source document URL is specified in the OAI record (No (dc:)?identifier is provided)\n";
+	}
+    }
+    else
+    {
+	print  STDERR "\tNo source document URL is specified in the OAI record (No metadata field is provided)\n";
+    }
+
+    return $strRecord;
+}
+
+sub getOAIRecords
+{
+    my ($self,$aryIDs, $strOutputDir, $strBasURL, $intMaxRecords, $blnDownloadDoc) = @_;
+
+    my $intDocCounter = 0;
+
+    my $metadata_prefix = $self->{'metadata_prefix'};
+
+    foreach my $strID ( @$aryIDs)
+    {
+	print  STDERR "Gathering OAI record with ID $strID.....\n";
+	   
+	my $wget_opts = $self->getWgetOptions();
+	my $cmdWget= "$wget_opts -q -O - \"$strBasURL?verb=GetRecord&metadataPrefix=$metadata_prefix&identifier=$strID\"";
+	
+	my $strRecord =  $self->useWget($cmdWget);
+
+	my @fileDirs = split(":",$strID);  
+	my $local_id = pop @fileDirs;
+
+	# setup directories
+
+        $strOutputDir  =~ s/"//g; #"
+
+        my $host =$self->{'url'}; 
+  
+        $host =~ s/https?:\/\///g;
+
+        $host =~ s/:.*//g; 
+
+	my $strFileURL = "$strOutputDir/$host/$local_id.oai";
+
+
+	# prepare subdirectory for record (if needed)
+	my ($strSubDirPath,$unused) = ("", "");
+
+       	($strSubDirPath,$unused) = $self->dirFileSplit($strFileURL);
+   
+	&util::mk_all_dir($strSubDirPath);
+
+	my $ds = &util::get_dirsep();
+	
+	if($blnDownloadDoc)
+	{
+	    $strRecord = $self->getOAIDoc($strRecord,$strFileURL);
+	}
+
+	# save record 
+	open (OAIOUT,">$strFileURL")
+	    || die "Unable to save oai metadata record: $!\n";
+	print OAIOUT $strRecord;
+	close(OAIOUT);
+
+        print STDERR "Saving records to $strFileURL\n";
+        print STDERR "<<Done>>\n";
+	$intDocCounter ++;	
+	last if ($intDocCounter >= $intMaxRecords);
+    }
+
+    ($intDocCounter >= $intMaxRecords) ? 
+	print  STDERR "Reached maximum download records, use -max_records to set the maximum.\n": 
+	print  STDERR "Complete download meta record from $strBasURL\n";
+
+       print STDERR "<<Finished>>\n";
+}
+
+sub url_information
+{
+    my ($self) = shift (@_);
+    if(!defined $self){ die "System Error: No \$self defined for url_information in OAIDownload\n";}
+    
+    my $wgetOptions = $self->getWgetOptions();
+    my $strBaseCMD = $wgetOptions." -q -O - \"$self->{'url'}?_OPTS_\"";
+ 
+    my $strIdentify = "verb=Identify";
+    my $strListSets = "verb=ListSets";
+    my $strListMdFormats = "verb=ListMetadataFormats";
+
+    my $strIdentifyCMD = $strBaseCMD;
+    $strIdentifyCMD =~ s/_OPTS_/$strIdentify/;	
+
+    my $strIdentifyText = $self->useWget($strIdentifyCMD);
+
+     if (!defined $strIdentifyText or $strIdentifyText eq ""  ){
+	print STDERR "Server information is unavailable.\n";
+	print STDERR "<<Finished>>\n";
+        return;  
+    }
+
+    print STDERR "General information:\n";
+    $self->parse_xml($strIdentifyText);
+    print STDERR "\n";
+
+    print STDERR "=" x 10, "\n";
+    print STDERR "Metadata Format Information (metadataPrefix):\n";
+    print STDERR "=" x 10, "\n";
+
+    my $strListMdFormatsCMD = $strBaseCMD;
+    $strListMdFormatsCMD =~ s/_OPTS_/$strListMdFormats/;	
+    my $strListMdFormatsText = $self->useWget($strListMdFormatsCMD);
+
+    $self->parse_xml($strListMdFormatsText);
+    print STDERR "\n";
+
+    print STDERR "=" x 10, "\n";
+    print STDERR "List Information:\n";
+    print STDERR "=" x 10, "\n";
+
+    my $strListSetCMD = $strBaseCMD;
+    $strListSetCMD =~ s/_OPTS_/$strListSets/;	
+    my $strListSetsText = $self->useWget($strListSetCMD);
+
+    $self->parse_xml($strListSetsText);
+}
+
+sub parse_xml
+{    
+    my ($self) = shift (@_);
+    my ($xml_text) = @_;
+   
+    #### change this to work directly from $xml_text
+
+    #Open a temporary file to store OAI information, and store the information to the temp file
+    my $name = &util::filename_cat($ENV{GSDLHOME},"tmp","oai.tmp"); 
+
+    open(*OAIOUT,"> $name");
+	
+    print OAIOUT $xml_text;
+    close(OAIOUT);
+
+    $self->{'temp_file_name'} = $name;
+
+##    print STDERR "**** xml text = $xml_text\n";
+
+    eval {
+	$self->{'parser'}->parsefile("$name");
+##	$self->{'parser'}->parse($xml_text);
+    };
+    
+    if ($@) {
+	die "OAI: Parsed file $name is not a well formed XML file ($@)\n";
+##	die "OAI: Parsed text is not a well formed XML file ($@)\n";
+    }
+
+    unlink($self->{'temp_file_name'}) or die "Could not unlink $self->{'temp_file_name'}: $!";
+}
+
+####END 
+#{
+#    if($self->{'info'})
+#    {
+#	unlink($self->{'temp_file_name'}) or die "Could not unlink $self->{'temp_file_name'}: $!";
+#    }
+#}
+
+# This Char function overrides the one in XML::Parser::Stream to overcome a
+# problem where $expat->{Text} is treated as the return value, slowing
+# things down significantly in some cases.
+sub Char {   
+    use bytes;  # Necessary to prevent encoding issues with XML::Parser 2.31+
+    $_[0]->{'Text'} .= $_[1];
+
+    my $self = $_[0]->{'PluginObj'};
+    if ((defined $self->{'subfield'} && ($self->{'subfield'} ne ""))) {
+	$self->{'text'} .= $_[1];
+	$self->{'text'} =~ s/[\n]|([ ]{2,})//g;
+	if($self->{'text'} ne "")
+	{	    
+	    print STDERR " $self->{'subfield'}:($self->{'text'})\n";
+	}
+    }
+    return undef;
+}
+
+sub OAI_StartTag
+{
+    my ($expat, $element, %attr) = @_;
+
+    my $self = $expat->{'PluginObj'};
+    $self->{'subfield'} = $element;
+    
+}
+
+sub OAI_EndTag
+{
+    my ($expat, $element) = @_;
+
+    my $self = $expat->{'PluginObj'};
+    $self->{'text'} = "";
+    $self->{'subfield'} = "";
+}
+
+sub error
+{
+    my ($self,$strFunctionName,$strError) = @_;
+    {
+	print "Error occoured in OAIDownload.pm\n".
+	    "In Function:".$strFunctionName."\n".
+	    "Error Message:".$strError."\n";
+	exit(-1);
+    }
+}
+
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/downloaders/SRWDownload.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/downloaders/SRWDownload.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/downloaders/SRWDownload.pm	(revision 24799)
@@ -0,0 +1,205 @@
+###########################################################################
+#
+# SRWDownload.pm -- base class for all the import plugins
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package SRWDownload;
+
+eval {require bytes};
+
+# suppress the annoying "subroutine redefined" warning that various
+# plugins cause under perl 5.6
+$SIG{__WARN__} = sub {warn($_[0]) unless ($_[0] =~ /Subroutine\s+\S+\sredefined/)};
+
+use strict;
+
+use Z3950Download;
+use IPC::Open2;
+
+sub BEGIN {
+    @SRWDownload::ISA = ('Z3950Download');
+}
+
+my $arguments = [
+		 ];
+
+my $options = { 'name'     => "SRWDownload",
+		'desc'     => "{SRWDownload.desc}",
+		'abstract' => "no",
+		'inherits' => "yes"
+		};
+
+
+sub new 
+{
+    my ($class) = shift (@_);
+    my ($getlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$getlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new Z3950Download($getlist,$inputargs,$hashArgOptLists);
+
+    if ($self->{'info_only'}) {
+	# don't worry about any options etc
+	return bless $self, $class;
+    }
+
+    # Must set $self->{'url'}, since GLI use $self->{'url'} to calculate the log file name!
+    $self->{'url'} = $self->{'host'}.":".$self->{'port'};
+    return bless $self, $class;
+}
+
+sub download
+{
+    my ($self) = shift (@_);
+    my ($hashGeneralOptions) = @_;
+    my ($strOpen,$strBase,$strFind,$strResponse,$intAmount,$intMaxRecords,$strRecords);
+
+    # If the url contains just the host and port (as it would for Z39.50), then prepend
+    # the http protocol. Otherwise the download is stuck in an infinite loop for SRW/SRU
+    $self->{'url'} = "http://$self->{'url'}"  if $self->{'url'} !~ m/^http/;
+    my $url = $self->{'url'};
+
+    print STDERR "<<Defined Maximum>>\n";
+
+    $strOpen = $self->start_yaz($url);
+    
+    print STDERR "Opening connection to \"$self->{'url'}\"\n";
+    print STDERR "Access database: \"$self->{'database'}\"\n";
+    $self->run_command_without_output("base $self->{'database'}");
+    $self->run_command_without_output("querytype prefix");
+    print STDERR "Searching for keyword: \"$self->{'find'}\"\n";
+
+    $intAmount =$self->findAmount($self->{'find'});
+
+    if($intAmount <= 0)
+    {
+	($intAmount == -1)? 
+	    print STDERR "Something wrong with the arguments,downloading can not be performed\n" : 
+		print STDERR "No Record is found\n";
+	print STDERR "<<Finished>>\n";
+	return 0;
+    }
+    $intMaxRecords = ($self->{'max_records'} > $intAmount)? $intAmount : $self->{'max_records'};
+    print STDERR "<<Total number of record(s):$intMaxRecords>>\n";
+   
+    $strRecords = $self->getRecords($intMaxRecords);
+
+    $self->saveRecords($strRecords,$hashGeneralOptions->{'cache_dir'},$intMaxRecords);
+    print STDERR "Closing connection...\n";
+    
+    $self->quit_yaz();
+    return 1;
+}
+
+
+sub saveRecords
+{
+    my ($self,$strRecords,$strOutputDir,$intMaxRecords) = @_;
+
+    # setup directories
+    # Currently only gather the MARC format
+    $strRecords ="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<collection>$strRecords</collection>";  
+    my $strFileName =  $self->generateFileName($intMaxRecords);
+    my $host = $self->{'host'};
+    $host =~ s/http:\/\///;
+    $strOutputDir  =~ s/"//g; #"
+    my $strOutputFile = &util::filename_cat($strOutputDir,$host,"$strFileName.xml");
+ 
+    # prepare subdirectory for record (if needed)
+
+    my ($strSubDirPath,$unused) = $self->dirFileSplit($strOutputFile);
+    &util::mk_all_dir($strSubDirPath);
+
+    print STDERR "Saving records to \"$strOutputFile\"\n";
+
+    # save record 
+    open (ZOUT,">$strOutputFile")
+	|| die "Unable to save oai metadata record: $!\n";
+    print ZOUT $strRecords;
+    close(ZOUT);
+}
+
+sub get {
+   my ($self,$strShow,$numRecord) = @_;  
+
+   $self->run_command_without_output($strShow); 
+
+   my $strFullOutput="";
+   my $count=0;
+   my $readRecord = 0;
+   my $endRecord = 0;
+
+   my $output = $self->{'YAZOUT'};
+   my $strLine;
+
+   while ($strLine = <$output>)    #while (defined ($strLine = <$output>)) 
+   {
+       last if ($count >= $numRecord && $endRecord); # done, if we've reached the end of the last record
+
+       last if($strLine =~ m/^HTTP ERROR/i);
+
+       if ($strLine =~ m/pos=[\d]*/i ) { 
+           $count++;
+	   $readRecord = 1;
+	   $endRecord = 0;
+	   next;
+       }
+
+       if ($strLine =~ m/<\/record>/i ) { # end tag of record
+	   $endRecord = 1;
+       }
+
+       next if(!$readRecord);
+
+       $strFullOutput .= $strLine;     
+   }
+
+   return $strFullOutput;
+}
+
+sub url_information{
+   my ($self) = @_;
+
+   my $url = $self->{'url'};
+
+   $url =~ s#http://##; 
+
+  return $self->SUPER::url_information($url);  
+
+}
+
+sub error
+{
+    my ($self, $strFunctionName,$strError) = @_;
+    {
+	print STDERR "Error occoured in SRWDownload.pm\n".
+	    "In Function:".$strFunctionName."\n".
+	    "Error Message:".$strError."\n";
+	exit(-1);
+    }
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/downloaders/WebDownload.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/downloaders/WebDownload.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/downloaders/WebDownload.pm	(revision 24799)
@@ -0,0 +1,246 @@
+###########################################################################
+#
+# WebDownload.pm -- base class for all the import plugins
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package WebDownload;
+
+eval {require bytes};
+
+# suppress the annoying "subroutine redefined" warning that various
+# plugins cause under perl 5.6
+$SIG{__WARN__} = sub {warn($_[0]) unless ($_[0] =~ /Subroutine\s+\S+\sredefined/)};
+
+use WgetDownload;
+
+sub BEGIN {
+    @WebDownload::ISA = ('WgetDownload');
+}
+
+use strict; # every perl program should have this!
+no strict 'refs'; # make an exception so we can use variables as filehandles
+
+my $arguments = 
+    [ { 'name' => "url", 
+	'disp' => "{WebDownload.url_disp}",
+	'desc' => "{WebDownload.url}",
+	'type' => "string",
+	'reqd' => "yes"},
+      { 'name' => "depth", 
+	'disp' => "{WebDownload.depth_disp}",
+	'desc' => "{WebDownload.depth}",
+	'type' => "int",
+	'deft' => "0",
+	"range" => "0,",
+	'reqd' => "no"},
+      { 'name' => "below", 
+	'disp' => "{WebDownload.below_disp}",
+	'desc' => "{WebDownload.below}",
+	'type' => "flag",
+	'reqd' => "no"},
+      { 'name' => "within", 
+	'disp' => "{WebDownload.within_disp}",
+	'desc' => "{WebDownload.within}",
+	'type' => "flag",
+	'reqd' => "no"},
+      { 'name' => "html_only", 
+	'disp' => "{WebDownload.html_only_disp}",
+	'desc' => "{WebDownload.html_only}",
+	'type' => "flag",
+	'reqd' => "no"}
+      ];
+
+my $options = { 'name'     => "WebDownload",
+		'desc'     => "{WebDownload.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+
+my $self;
+
+sub new 
+{
+    my ($class) = shift (@_);
+    my ($getlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$getlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new WgetDownload($getlist,$inputargs,$hashArgOptLists);
+    
+    return bless $self, $class;
+}
+
+sub download
+{
+    my ($self) = shift (@_);
+    my ($hashGeneralOptions) = @_;
+
+  
+    # Download options
+    my $strOptions = $self->generateOptionsString();
+    my $strWgetOptions = $self->getWgetOptions();
+      
+    # Setup the command for using wget
+    my $cache_dir = "";
+    if($hashGeneralOptions->{'cache_dir'}) { # don't provide the prefix-dir flag to wget unless the cache_dir is specified
+	if ($ENV{'GSDLOS'} eq "windows") {    
+	    $cache_dir = "-P \"".$hashGeneralOptions->{'cache_dir'}."\" ";
+	}
+	else {
+	    $cache_dir = "-P ".$hashGeneralOptions->{'cache_dir'};
+	}
+    }
+    #my $cmdWget = "-N -k -x -t 2 -P \"".$hashGeneralOptions->{"cache_dir"}."\" $strWgetOptions $strOptions ".$self->{'url'};
+    my $cmdWget = "-N -k -x -t 2  $strWgetOptions $strOptions $cache_dir " .$self->{'url'};   
+
+    # Download the web pages
+    # print "Start download from $self->{'url'}...\n";
+    print STDERR "<<Undefined Maximum>>\n";
+    
+    if ($ENV{'GSDLOS'} eq "windows") {
+	my $strResponse = $self->useWget($cmdWget,1);
+    } else {
+	my $strResponse = $self->useWget($cmdWget,1,$hashGeneralOptions->{"cache_dir"} );
+	
+    }
+    
+    # if ($strResponse ne ""){print "$strResponse\n";}
+     print STDERR "Finish download from $self->{'url'}\n";
+
+    print STDERR "<<Finished>>\n";
+  
+    return 1;
+}
+
+sub generateOptionsString
+{
+    my ($self) = @_;
+    my $strOptions;
+
+    (defined $self) || &error("generateOptionsString","No \$self is defined!!\n");
+    (defined $self->{'depth'})|| &error("generateOptionsString","No depth is defined!!\n");
+    
+   
+    if($self->{'depth'} == 0)
+    {
+	$strOptions .= " ";
+    }
+    elsif($self->{'depth'} > 0)
+    {
+	$strOptions .= "-r -l ".$self->{'depth'}." ";
+    }
+    else
+    {
+	$self->error("setupOptions","Incorrect Depth is defined!!\n");
+    }
+
+    if($self->{'below'})
+    {
+	$strOptions .="-np ";
+    }
+
+     if($self->{'html_only'})
+    {
+	$strOptions .="-A .html,.htm,.shm,.shtml,.asp,.php,.cgi,*?*=* ";
+    }
+    else{
+
+	$strOptions .="-p ";
+    }
+
+    if (!$self->{'within'}){
+	$strOptions .="-H ";
+    }
+
+    return $strOptions;
+  
+}
+
+sub url_information
+{
+    my ($self) = shift (@_);
+
+    my $strOptions = $self->getWgetOptions();
+
+    my $strBaseCMD = $strOptions." -q -O - \"$self->{'url'}\"";
+
+  
+    my $strIdentifyText = $self->useWget($strBaseCMD);
+    
+    if (!defined $strIdentifyText or $strIdentifyText eq ""  ){
+	print STDERR "Server information is unavailable.\n";
+	print STDERR "<<Finished>>\n";
+         return;  
+    }
+
+    while ($strIdentifyText =~ m/^(.*)<title>(.*?)<\/title>(.*)$/si)
+    {
+	$strIdentifyText = $1.$3;
+	print STDERR "Page Title: $2\n";
+    }
+  
+    while ($strIdentifyText =~ m/^(.*)<meta (.*?)>(.*)$/si)
+    {
+	$strIdentifyText = $1.$3;
+	my $strTempString = $2;
+	print STDERR "\n";
+
+	while($strTempString =~ m/(.*?)=[\"|\'](.*?)[\"|\'](.*?)$/si)
+	{
+	    # Store the infromation in to variable, since next time when we do 
+	    # regular expression, we will lost all the $1, $2, $X....
+	    $strTempString = $3;
+	    my $strMetaName = $1;
+	    my $strMetaContain = $2;
+	    
+	    # Take out the extra space in the beginning of the string.
+	    $strMetaName =~ s/^([" "])+//m;
+	    $strMetaContain =~ s/^([" "])+//m;
+              
+	    print STDERR "$strMetaName: $strMetaContain\n\n";
+           
+	}
+
+    }
+
+    print STDERR "<<Finished>>\n";
+
+}
+
+
+sub error
+{
+    my ($strFunctionName,$strError) = @_;
+    {
+	print "Error occoured in WebDownload.pm\n".
+	    "In Function:".$strFunctionName."\n".
+	    "Error Message:".$strError."\n";
+	exit(-1);
+    }
+}
+
+1;
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/downloaders/WgetDownload.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/downloaders/WgetDownload.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/downloaders/WgetDownload.pm	(revision 24799)
@@ -0,0 +1,539 @@
+###########################################################################
+#
+# WgetDownload.pm -- Download base module that handles calling Wget
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2006 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package WgetDownload;
+
+eval {require bytes};
+
+# suppress the annoying "subroutine redefined" warning that various
+# plugins cause under perl 5.6
+$SIG{__WARN__} = sub {warn($_[0]) unless ($_[0] =~ /Subroutine\s+\S+\sredefined/)};
+
+use BaseDownload;
+use strict;
+use Cwd;
+use IPC::Open3;
+use IO::Select;
+use IO::Socket;
+
+
+sub BEGIN {
+    @WgetDownload::ISA = ('BaseDownload');
+}
+
+my $arguments = 
+     [ { 'name' => "proxy_on", 
+	'desc' => "{WgetDownload.proxy_on}",
+	'type' => "flag",
+	'reqd' => "no",
+	'hiddengli' => "yes"},
+      { 'name' => "proxy_host",  
+	'desc' => "{WgetDownload.proxy_host}",         
+	'type' => "string",
+	'reqd' => "no",
+	'hiddengli' => "yes"},
+      { 'name' => "proxy_port", 
+	'desc' => "{WgetDownload.proxy_port}",         
+	'type' => "string",
+	'reqd' => "no",
+	'hiddengli' => "yes"},
+      { 'name' => "user_name",  
+	'desc' => "{WgetDownload.user_name}",         
+	'type' => "string",
+	'reqd' => "no",
+	'hiddengli' => "yes"},
+      { 'name' => "user_password", 
+	'desc' => "{WgetDownload.user_password}",         
+	'type' => "string",
+	'reqd' => "no",
+	'hiddengli' => "yes"}];
+
+my $options = { 'name'     => "WgetDownload",
+		'desc'     => "{WgetDownload.desc}",
+		'abstract' => "yes",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+
+# Declaring file global variables related to the wget child process so that 
+# the termination signal handler for SIGTERM can close the streams and tidy
+# up before ending the child process.
+my $childpid;
+my ($chld_out, $chld_in);
+my ($serverSocket, $read_set);
+
+# The port this script's server socket will be listening on, to handle 
+# incoming signals from GLI to terminate wget. This is also file global, 
+# since OAIDownload.pm will make several calls on wget using the same 
+# instance of this script and we want to reuse whatever port GLI gave us.
+my $port; 
+
+# When this script is called from the command line, this handler will be called
+# if this process is killed or abruptly ends due to receiving one of the
+# terminating signals that this handler is registered to deal with.
+sub abrupt_end_handler {
+    my $termination_signal = shift (@_);
+
+    if(defined $childpid) {
+	close($chld_out);
+	close($chld_in);
+	
+	print STDOUT "Received termination signal: $termination_signal\n";
+
+	# Send TERM signal to child process to terminate it. Sending the INT signal doesn't work
+	# See http://perldoc.perl.org/perlipc.html#Signals 
+	# Warning on using kill at http://perldoc.perl.org/perlfork.html
+	kill("TERM", $childpid); 
+
+	# If the SIGTERM sent on Linux calls this handler, we want to make
+	# sure any socket connection is closed.
+	# Otherwise sockets are only used when this script is run from GLI
+	# in which case the handlers don't really get called.
+	if(defined $serverSocket) {
+	    $read_set->remove($serverSocket) if defined $read_set;
+	    close($serverSocket);
+	}
+    }
+
+    exit(0);
+}
+
+# Registering a handler for when termination signals SIGINT and SIGTERM are received to stop
+# the wget child process. SIGTERM--generated by Java's Process.destroy()--is the default kill
+# signal (kill -15) on Linux, while SIGINT is generated upon Ctrl-C (also on Windows). 
+# Note that SIGKILL can't be handled as the handler won't get called for it. More information: 
+# http://affy.blogspot.com/p5be/ch13.htm
+# http://perldoc.perl.org/perlipc.html#Signals
+$SIG{'INT'} = \&abrupt_end_handler;
+$SIG{'TERM'} = \&abrupt_end_handler;
+
+sub new {
+    my ($class) = shift (@_);
+    my ($getlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$getlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new BaseDownload($getlist,$inputargs,$hashArgOptLists);
+
+    return bless $self, $class;
+}
+
+sub checkWgetSetup
+{
+    my ($self,$blnGliCall) = @_;
+    #TODO: proxy detection??
+    
+    if((!$blnGliCall) && $self->{'proxy_on'})
+    {
+	&checkProxySetup($self);
+    }
+    &checkURL($self); 
+}
+
+sub getWgetOptions
+{
+    my ($self) = @_;
+    my $strOptions = "";
+    
+    if ($self->{'proxy_on'} && $self->{'proxy_host'} && $self->{'proxy_port'})
+    {
+
+	$strOptions .= " -e httpproxy=$self->{'proxy_host'}:$self->{'proxy_port'} ";
+
+	if ($self->{'user_name'} && $self->{'user_password'})
+	{
+	    $strOptions .= "--proxy-user=$self->{'user_name'}"." --proxy-passwd=$self->{'user_password'}";
+	}
+    }
+
+    if ($self->{'proxy_on'}) {
+	$strOptions .= " --proxy ";
+    }
+
+    return $strOptions;
+}
+
+# Checking for proxy setup: proxy server, proxy port, proxy username and password.
+sub checkProxySetup
+{
+    my ($self) = @_;
+    ($self->{'proxy_on'}) || &error("checkProxySetup","The proxy is not on? How could that be happening?");
+    # Setup .wgetrc by using $self->{'proxy_host'} and $self->{'proxy_port'}
+    # Test if the connection is successful. If the connection wasn't successful then ask user to supply username and password.
+
+}
+
+# Returns true if the wget status needs to be monitored through sockets
+# (if a socket is used to communicate with the Java program on when to
+# terminate wget). True if we are running gli, or if the particular type
+# of WgetDownload is *not* OAIDownload (in that case, the original way of 
+# terminating the perl script from Java terminated wget as well).
+sub dealingWithSockets() {
+    my ($self) = @_;
+    return (defined $self->{'gli'} && $self->{'gli'} && !defined $port && ref($self) ne "OAIDownload");
+                       # use ref($self) to find the classname of an object
+}
+
+
+sub useWget
+{
+    #local $| = 1; # autoflush stdout buffer
+    #print STDOUT "*** Start of subroutine useWget in $0\n";
+
+    my ($self, $cmdWget,$blnShow, $working_dir) = @_;
+
+    my ($strReadIn,$strLine,$command);
+    $strReadIn = "" unless defined $strReadIn;
+
+    my $current_dir = cwd();
+    my $changed_dir = 0;
+    if (defined $working_dir && -e $working_dir) {
+	chdir "$working_dir";
+	$changed_dir = 1;
+    }
+
+    # When we are running this script through GLI, the SIGTERM signal handler 
+    # won't get called on Windows when wget is to be prematurely terminated. 
+    # Instead, when wget has to be terminated in the middle of execution, GLI will
+    # connect to a serverSocket here to communicate when it's time to stop wget.
+    if($self->dealingWithSockets()) {
+
+	$port = <STDIN>; # gets a port on localhost that's not yet in use
+	chomp($port);
+	
+	$serverSocket = IO::Socket::INET->new( Proto     => 'tcp',
+					       LocalPort => $port,
+					       Listen    => 1,
+					       Reuse     => 1);
+    
+	die "can't setup server" unless $serverSocket;
+	#print STDOUT "[Serversocket $0 accepting clients at port $port]\n";
+
+	$read_set = new IO::Select();         # create handle set for reading
+	$read_set->add($serverSocket);        # add the main socket to the set
+    }
+
+    my $wget_file_path = &util::filename_cat($ENV{'GSDLHOME'}, "bin", $ENV{'GSDLOS'}, "wget");
+    $command = "\"$wget_file_path\" $cmdWget";
+    #print STDOUT "Command is: $command\n";
+
+    # Wget's output needs to be monitored to find out when it has naturally termianted.
+    # Wget's output is sent to its STDERR so we can't use open2 without doing 2>&1.
+    # On linux, 2>&1 launches a subshell which then launches wget, meaning that killing
+    # the childpid does not kill wget on Linux but the subshell that launched it instead. 
+    # Therefore, we use open3. Though the child process wget sends output only to its stdout, 
+    # using open3 says chld_err is undefined and the output of wget only comes in chld_out(!)
+    # However that may be, it works with open3. But to avoid the confusion of managing and
+    # closing an extra unused handle, a single handle is used instead for both the child's
+    # stderr and stdout.
+
+    # Both open2 and open3 don't return on failure, but raise an exception. The handling
+    # of the exception is described on p.568 of the Perl Cookbook
+    eval { 
+	$childpid = open3($chld_in, $chld_out, $chld_out, $command);
+    };
+    if ($@) {
+	if($@ =~ m/^open3/) {
+	    die "open3 failed in $0: $!\n$@\n";	    
+	}
+	die "Tried to launch open3 in $0, got unexpected exception: $@";
+    }
+
+    my $loop = 1;
+    while($loop)
+    {
+	if (defined(my $strLine=<$chld_out>)) { # we're reading in from child process' stdout
+	    if($blnShow) {
+		print STDERR "$strLine\n";
+	    }
+	    $strReadIn .= $strLine;
+	} 
+	else { # wget finished, terminate naturally
+	    #print STDOUT "\nPerl: open2 command, input stream closed. Wget terminated naturally.\n";
+	    close($chld_in);
+	    close($chld_out);
+	    waitpid $childpid, 0;
+	    $loop = 0;
+	    
+	    $childpid = undef;
+	    if(defined $port) {
+		$read_set->remove($serverSocket);
+		close($serverSocket);
+	    }
+	}
+
+	# if we run this script from the command-line (as opposed to from GLI), 
+	# then we're not working with sockets and can therefore can skip the next bits
+	next unless(defined $port);
+
+	# http://www.perlfect.com/articles/select.shtml
+	# "multiplex between several filehandles within a single thread of control, 
+	# thus creating the effect of parallelism in the handling of I/O."
+	my @rh_set = $read_set->can_read(0.002); # every 2 ms check if there's a client socket connecting
+
+	# take all readable handles in turn
+	foreach my $rh (@rh_set) {
+	    if($rh == $serverSocket) {
+		my $client = $rh->accept();
+		#$client->autoflush(1); # autoflush output buffer - don't put this back in: output split irregularly over lines
+		print $client "Talked to ServerSocket (port $port). Connection accepted\n";
+		
+		# Read from the client (getting rid of the trailing newline)
+		# Has the client sent the <<STOP>> signal?
+		my $signal = <$client>;
+		chomp($signal); 
+		if($signal eq "<<STOP>>") {
+		    print $client "Perl received STOP signal (on port $port): stopping wget\n";
+		    $loop = 0;                          # out of outer while loop
+		    $self->{'forced_quit'} = 1;         # subclasses need to know we're quitting
+		    
+		    # Sometimes the wget process takes some time to start up. If the STOP signal
+		    # was sent, don't try to terminate the process until we know it is running. 
+		    # Otherwise wget may start running after we tried to kill it. Wait 5 seconds
+		    # for it to start up, checking for whether it is running in order to kill it.
+		    for(my $seconds = 1; $seconds <= 5; $seconds++) {
+			if(kill(0, $childpid)) { 
+			    # If kill(0, $childpid) returns true, then the process is running
+			    # and we need to kill it.
+			    close($chld_in);
+			    close($chld_out);
+			    kill("TERM", $childpid);
+			    
+			    $childpid = undef;
+			    
+			    # Stop monitoring the read_handle and close the serverSocket 
+			    # (the Java end will close the client socket that Java opened)
+			    $read_set->remove($rh);     #$read_set->remove($serverSocket);
+			    close($rh); 	        #close($serverSocket);
+			    print $client "Perl terminated wget and is about to exit\n";
+			    last;                           # out of inner for loop
+			}
+			else { # the process may just be starting up, wait
+			    sleep(1);
+			}
+		    }
+		    last;                               # out of foreach loop
+		}
+	    }
+	}
+    }
+
+    if ($changed_dir) {
+	chdir $current_dir;
+    }
+    
+    return $strReadIn;
+}
+
+
+sub useWgetMonitored
+{
+    #local $| = 1; # autoflush stdout buffer
+    #print STDOUT "*** Start of subroutine useWgetMonitored in $0\n";
+
+    my ($self, $cmdWget,$blnShow, $working_dir) = @_;
+
+
+    my $current_dir = cwd();
+    my $changed_dir = 0;
+    if (defined $working_dir && -e $working_dir) {
+	chdir "$working_dir";
+	$changed_dir = 1;
+    }
+
+    # When we are running this script through GLI, the SIGTERM signal handler 
+    # won't get called on Windows when wget is to be prematurely terminated. 
+    # Instead, when wget has to be terminated in the middle of execution, GLI will
+    # connect to a serverSocket here to communicate when it's time to stop wget.
+    if($self->dealingWithSockets()) {
+
+	$port = <STDIN>; # gets a port on localhost that's not yet in use
+	chomp($port);
+	
+	$serverSocket = IO::Socket::INET->new( Proto     => 'tcp',
+					       LocalPort => $port,
+					       Listen    => 1,
+					       Reuse     => 1);
+    
+	die "can't setup server" unless $serverSocket;
+	#print STDOUT "[Serversocket $0 accepting clients at port $port]\n";
+
+	$read_set = new IO::Select();         # create handle set for reading
+	$read_set->add($serverSocket);        # add the main socket to the set
+    }
+
+    my $wget_file_path = &util::filename_cat($ENV{'GSDLHOME'}, "bin", $ENV{'GSDLOS'}, "wget");
+    my $command = "\"$wget_file_path\" $cmdWget";
+    #print STDOUT "Command is: $command\n";
+
+    eval {     # see p.568 of Perl Cookbook
+	$childpid = open3($chld_in, $chld_out, $chld_out, $command);
+    };
+    if ($@) {
+	if($@ =~ m/^open3/) {
+	    die "open3 failed in $0: $!\n$@\n";	    
+	}
+	die "Tried to launch open3 in $0, got unexpected exception: $@";
+    }
+
+    my $full_text = "";
+    my $error_text = "";
+    my @follow_list = ();
+    my $line;
+
+    my $loop = 1;
+    while($loop)
+    {
+	if (defined($line=<$chld_out>)) { # we're reading in from child process' stdout
+	    if((defined $blnShow) && $blnShow)
+	    {
+		print STDERR "$line";
+	    }
+	    
+	    if ($line =~ m/^Location:\s*(.*?)\s*\[following\]\s*$/i) {
+		my $follow_url = $1;
+		push(@follow_list,$follow_url);
+	    }
+	    
+	    if ($line =~ m/ERROR\s+\d+/) {
+		$error_text .= $line;
+	    }
+	    
+	    $full_text .= $line;
+	} 
+	else { # wget finished, terminate naturally
+	    #print STDERR "\nPerl: open2 command, input stream closed. Wget terminated naturally.\n";
+	    close($chld_in);
+	    close($chld_out);
+	    # Program terminates only when the following line is included 
+	    # http://perldoc.perl.org/IPC/Open2.html explains why this is necessary
+	    # it prevents the child from turning into a "zombie process".
+	    # While the wget process terminates without it, this perl script does not: 
+	    # the DOS prompt is not returned without it.
+	    waitpid $childpid, 0;
+	    $loop = 0;
+	    
+	    $childpid = undef;
+	    if(defined $port) {
+		$read_set->remove($serverSocket);
+		close($serverSocket);
+	    }
+	}
+
+	# if we run this script from the command-line (as opposed to from GLI), 
+	# then we're not working with sockets and can therefore can skip the next bits
+	next unless(defined $port);
+
+	# http://www.perlfect.com/articles/select.shtml
+	# "multiplex between several filehandles within a single thread of control, 
+	# thus creating the effect of parallelism in the handling of I/O."
+	my @rh_set = $read_set->can_read(0.002); # every 2 ms check if there's a client socket connecting
+
+	# take all readable handles in turn
+	foreach my $rh (@rh_set) {
+	    if($rh == $serverSocket) {
+		my $client = $rh->accept();
+		#$client->autoflush(1); # autoflush output buffer - don't put this back in: splits output irregularly over multilines
+		print $client "Talked to ServerSocket (port $port). Connection accepted\n";
+		
+		# Read from the client (getting rid of trailing newline)
+		# Has the client sent the <<STOP>> signal?
+		my $signal = <$client>;
+		chomp($signal); 
+		if($signal eq "<<STOP>>") {
+		    print $client "Perl received STOP signal (on port $port): stopping wget\n";
+		    $loop = 0;                          # out of outer while loop
+		    $self->{'forced_quit'} = 1;         # subclasses need to know we're quitting
+		    
+		    # Sometimes the wget process takes some time to start up. If the STOP signal
+		    # was sent, don't try to terminate the process until we know it is running. 
+		    # Otherwise wget may start running after we tried to kill it. Wait 5 seconds
+		    # for it to start up, checking for whether it is running in order to kill it.
+		    for(my $seconds = 1; $seconds <= 5; $seconds++) {
+			if(kill(0, $childpid)) { 
+			    # If kill(0, $childpid) returns true, then the process is running
+			    # and we need to kill it.
+			    close($chld_in);
+			    close($chld_out);
+			    kill("TERM", $childpid);
+			    
+			    $childpid = undef;
+			    
+			    # Stop monitoring the read_handle and close the serverSocket 
+			    # (the Java end will close the client socket that Java opened)
+			    $read_set->remove($rh);     #$read_set->remove($serverSocket);
+			    close($rh); 	        #close($serverSocket);
+			    print $client "Perl terminated wget and is about to exit\n";
+			    last;                           # out of inner for loop
+			}
+			else { # the process may just be starting up, wait
+			    sleep(1);
+			}
+		    }
+		    last;                               # out of foreach loop
+		}
+	    }
+	}
+    }
+
+    my $command_status = $?;
+    if ($command_status != 0) {
+	$error_text .= "Exit error: $command_status";
+    }
+
+    if ($changed_dir) {
+	chdir $current_dir;
+    }
+    
+    my $final_follow = pop(@follow_list); # might be undefined, but that's OK
+    
+    return ($full_text,$error_text,$final_follow);
+}
+
+
+# TODO: Check if the URL is valid?? Not sure what should be in this function yet!!
+sub checkURL
+{
+    my ($self) = @_;
+    if ($self->{'url'} eq "")
+    {
+	&error("checkURL","no URL is specified!! Please specifies the URL for downloading.");
+    }
+}
+
+sub error
+{
+    my ($strFunctionName,$strError) = @_;
+    {
+	print "Error occoured in WgetDownload.pm\n".
+	    "In Function:".$strFunctionName."\n".
+	    "Error Message:".$strError."\n";
+	exit(-1);
+    }
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/downloaders/Z3950Download.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/downloaders/Z3950Download.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/downloaders/Z3950Download.pm	(revision 24799)
@@ -0,0 +1,417 @@
+###########################################################################
+#
+# WebDownload.pm -- base class for all the import plugins
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package Z3950Download;
+
+eval {require bytes};
+
+# suppress the annoying "subroutine redefined" warning that various
+# plugins cause under perl 5.6
+$SIG{__WARN__} = sub {warn($_[0]) unless ($_[0] =~ /Subroutine\s+\S+\sredefined/)};
+
+use strict;
+
+use BaseDownload;
+use IPC::Open2;
+use POSIX ":sys_wait_h"; # for waitpid, http://perldoc.perl.org/functions/waitpid.html
+
+sub BEGIN {
+    @Z3950Download::ISA = ('BaseDownload');
+}
+
+my $arguments = 
+    [  { 'name' => "host", 
+	'disp' => "{Z3950Download.host_disp}",
+	'desc' => "{Z3950Download.host}",
+	'type' => "string",
+	'reqd' => "yes"},
+      { 'name' => "port", 
+	'disp' => "{Z3950Download.port_disp}",
+	'desc' => "{Z3950Download.port}",
+	'type' => "string",
+	'reqd' => "yes"},
+      { 'name' => "database", 
+	'disp' => "{Z3950Download.database_disp}",
+	'desc' => "{Z3950Download.database}",
+      	'type' => "string",
+	'reqd' => "yes"},
+      { 'name' => "find", 
+	'disp' => "{Z3950Download.find_disp}",
+	'desc' => "{Z3950Download.find}",
+	'type' => "string",
+	'deft' => "",
+	'reqd' => "yes"},
+      { 'name' => "max_records", 
+	'disp' => "{Z3950Download.max_records_disp}",
+	'desc' => "{Z3950Download.max_records}",
+	'type' => "int",
+	'deft' => "500",
+	'reqd' => "no"}];
+
+my $options = { 'name'     => "Z3950Download",
+		'desc'     => "{Z3950Download.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+
+sub new 
+{
+    my ($class) = shift (@_);
+    my ($getlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$getlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new BaseDownload($getlist,$inputargs,$hashArgOptLists);
+
+    if ($self->{'info_only'}) {
+	# don't worry about any options etc
+	return bless $self, $class;
+    }
+
+    # Must set $self->{'url'}, since GLI use $self->{'url'} to calculate the log file name!
+    $self->{'url'} = $self->{'host'}.":".$self->{'port'};
+
+    $self->{'yaz'} = &util::filename_cat($ENV{'GSDLHOME'}, "bin", $ENV{'GSDLOS'}, "yaz-client");
+    
+    return bless $self, $class;
+
+}
+
+sub download
+{
+    my ($self) = shift (@_);
+    my ($hashGeneralOptions) = @_;
+    my ($strOpen,$strBase,$strFind,$strResponse,$intAmount,$intMaxRecords,$strRecords);
+
+    my $url = $self->{'url'};
+ 
+    print STDERR "<<Defined Maximum>>\n";
+ 
+    $strOpen = $self->start_yaz($url);
+
+    print STDERR "Access database: \"$self->{'database'}\"\n";
+    $self->run_command_without_output("base $self->{'database'}");
+    print STDERR "Searching for keyword: \"$self->{'find'}\"\n";
+    $intAmount = $self->findAmount($self->{'find'});
+
+    if($intAmount <= 0)
+    {
+	($intAmount == -1)? 
+	    print STDERR "Something wrong with the arguments,downloading can not be performed\n": 
+		print STDERR "No Record is found\n";
+	print STDERR "<<Finished>>\n";
+	return 0;
+    }
+    $intMaxRecords = ($self->{'max_records'} > $intAmount)? $intAmount : $self->{'max_records'};
+    print STDERR "<<Total number of record(s):$intMaxRecords>>\n";
+    $strRecords = "Records: $intMaxRecords\n".$self->getRecords($intMaxRecords);
+   
+    $self->saveRecords($strRecords,$hashGeneralOptions->{'cache_dir'},$intMaxRecords);
+    print STDERR "Closing connection...\n";
+
+    $self->quit_yaz();
+    return 1;
+}
+
+
+sub start_yaz 
+{
+    my ($self, $url) = @_;    
+
+    print STDERR "Opening connection to $url\n";
+     
+    my $yaz = $self->{'yaz'};
+    
+    my $childpid = open2(*YAZOUT, *YAZIN, $yaz)
+	or (print STDERR "<<Finished>>\n" and die "can't open pipe to yaz-client: $!");
+    $self->{'pid'} = $childpid;
+    $self->{'YAZOUT'} = *YAZOUT;
+    $self->{'YAZIN'} = *YAZIN;
+
+    my $strOpen = $self->open_connection("open $url");  
+
+    if (!$strOpen) {
+        print STDERR "Cannot connect to $url\n"; 
+        print STDERR "<<Finished>>\n";  
+	return 0;
+    }
+    return $strOpen;
+}
+
+sub quit_yaz 
+{
+    my ($self) = shift (@_);
+
+    # can't send a "close" cmd to close the database here, since the close command is only
+    # recognised by Z3950, not by SRW. (This method is also used by the subclass for SRW.)
+
+    print STDERR "<<Finished>>\n";
+
+    # need to send the quit command, else yaz-client is still running in the background
+    $self->run_command_without_output("quit");
+    close($self->{'YAZIN'}); # close the input to yaz. It also flushes quit command to yaz.
+
+    # make sure nothing is being output by yaz
+    # flush the yaz-client process' outputstream, else we'll be stuck in an infinite
+    # loop waiting for the process to quit.
+    my $output = $self->{'YAZOUT'};
+    my $line;
+    while (defined ($line = <$output>)) { 
+	if($line !~ m/\w/s) { # print anything other than plain whitespace in case it is important
+	    print STDERR "***### $line";
+	}
+    }
+
+    close($self->{'YAZOUT'});
+
+    # Is the following necessary? The PerlDoc on open2 (http://perldoc.perl.org/IPC/Open2.html)
+    # says that waitpid must be called to "reap the child process", or otherwise it will hang
+    # around like a zombie process in the background. Adding it here makes the code work as 
+    # before, but it is certainly necessary to call waitpid on wget (see WgetDownload.pm).
+    # http://perldoc.perl.org/functions/waitpid.html
+    my $kidpid;
+    do {
+	$kidpid = waitpid($self->{'pid'}, WNOHANG);
+    } while $kidpid > 0; # waiting for pid to become -1
+}
+
+sub open_connection{
+  my ($self,$strCommand) =  (@_);
+  
+  $self->run_command($strCommand);  
+
+  my $out = $self->{'YAZOUT'}; 
+
+  my $opening_line = <$out>;
+  
+  return ($opening_line =~ m/Connecting...OK/i)? 1: 0; 
+ 
+}
+
+sub findAmount
+{
+    my ($self) = shift (@_);
+    my($strFindTarget) = @_;
+    my $strResponse = $self->run_command_with_output("find $strFindTarget","^Number of hits:");
+   return ($strResponse =~ m/^Number of hits: (\d+)/m)? $1:-1;    
+}
+
+sub getRecords
+{
+    my ($self) = shift (@_);
+    my ($intMaxRecords) = @_;
+    my ($strShow,$intStartNumber,$numRecords,$strResponse,$strRecords,$intRecordsLeft);
+
+    $intStartNumber = 1;
+    $intRecordsLeft = $intMaxRecords;
+    $numRecords = 0;
+    $strResponse ="";
+
+    while ($intRecordsLeft > 0)
+    {
+	if($intRecordsLeft > 50)
+	{
+	   
+	    print STDERR "Yaz is Gathering records: $intStartNumber - ".($intStartNumber+49)."\n";
+	    $numRecords = 50;
+	    $strShow = "show $intStartNumber+50";
+	    $intStartNumber = $intStartNumber + 50;
+	    $intRecordsLeft = $intRecordsLeft - 50;
+             
+	}
+	else
+	{
+	    $numRecords = $intRecordsLeft;
+	    print STDERR "Yaz is Gathering records: $intStartNumber - ".($intStartNumber+$intRecordsLeft-1)."\n";
+	    $strShow = "show $intStartNumber+$intRecordsLeft";
+	    $intRecordsLeft = 0;
+	   
+           }
+	
+	$strResponse .= $self->get($strShow,$numRecords);
+         
+	if ($strResponse eq ""){
+	    print STDERR "<<ERROR: failed to get $numRecords records>>\n";
+	}
+	else{
+	    print STDERR "<<Done:$numRecords>>\n";
+	}
+    }
+
+    return  "$strResponse\n";
+	
+}
+
+sub saveRecords
+{
+    my ($self,$strRecords,$strOutputDir,$intMaxRecords) = @_;
+
+    # setup directories
+    # Currently only gather the MARC format
+    my $strFileName = $self->generateFileName($intMaxRecords);
+
+    $strOutputDir  =~ s/"//g; #"
+
+    my $strOutputFile = &util::filename_cat($strOutputDir,$self->{'host'},"$strFileName.marc");
+     # prepare subdirectory for record (if needed)
+    my ($strSubDirPath,$unused) = $self->dirFileSplit($strOutputFile);
+ 
+    &util::mk_all_dir($strSubDirPath);
+  
+    print STDERR "Saving records to \"$strOutputFile\"\n";
+
+    # save record 
+    open (ZOUT,">$strOutputFile")
+	|| die "Unable to save Z3950 record: $!\n";
+    print ZOUT $strRecords;
+    close(ZOUT);
+}
+
+
+sub run_command_with_output
+{
+    my ($self,$strCMD,$strStopRE) =@_;
+   
+    $self->run_command($strCMD); 
+   
+    return $self->get_output($strStopRE);
+ 
+}
+
+sub get{
+   my ($self,$strShow,$numRecord) = @_;  
+
+   $self->run_command($strShow);  
+   
+   my $strFullOutput="";
+   my $count=0;
+   my $readRecord = 0;
+   
+   my $output = $self->{'YAZOUT'};
+   while (my $strLine = <$output>)
+   {
+   
+       if ($strLine =~ m/Records: ([\d]*)/i ){ 
+	   $readRecord = 1;
+	   next;  
+       }
+      
+      return $strFullOutput if ($strLine =~ m/nextResultSetPosition|Not connected/i);
+        
+      next if(!$readRecord);
+      
+      $strFullOutput .= $strLine;     
+  }
+   
+}
+
+sub run_command_without_output
+{
+     my ($self) = shift (@_);
+    my ($strCMD) = @_;
+
+    $self->run_command($strCMD);
+}
+
+sub run_command
+{
+    my ($self,$strCMD) = @_; 
+ 
+    my $input = $self->{'YAZIN'};
+
+    print $input "$strCMD\n";  
+}
+
+sub get_output{
+    my ($self,$strStopRE) = @_;  
+
+    if (!defined $strStopRE){return "";}
+    else
+    {
+	my $strFullOutput;
+        my $output = $self->{'YAZOUT'};
+	while (my $strLine = <$output>)
+	{
+           $strFullOutput .= $strLine;   
+	   if($strLine =~ m/^$strStopRE|Not connected/i){return $strFullOutput;}
+	}
+    }
+}
+
+sub generateFileName
+{
+    my ($self,$intMaxRecords) = @_;
+    my $strFileName = ($self->{'database'})."_".($self->{'find'})."_".($intMaxRecords);
+ 
+}
+
+sub dirFileSplit
+{
+    my ($self,$strFile) = @_;
+
+    my @aryDirs = split(/[\/\\]/,$strFile);
+   
+    my $strLocalFile = pop(@aryDirs);
+    my $strSubDirs = join("/",@aryDirs);
+
+    return ($strSubDirs,$strLocalFile);
+}
+
+sub url_information
+{
+   my ($self,$url) = @_;
+
+   $url = $self->{'url'} unless defined $url;
+
+   my $strOpen = $self->start_yaz();
+
+   $strOpen = $self->run_command_with_output("open $url","^Options");  
+
+   $strOpen =~ s/Z> //g;
+   $strOpen =~ s/Elapsed:.*//g;
+
+   print STDERR $strOpen; 
+
+   $self->quit_yaz();
+
+   return 0;
+
+}
+
+sub error
+{
+    my ($self,$strFunctionName,$strError) = @_;
+    {
+	print STDERR "Error occoured in Z3950Download.pm\n".
+	    "In Function:".$strFunctionName."\n".
+	    "Error Message:".$strError."\n";
+	exit(-1);
+    }
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/encodings.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/encodings.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/encodings.pm	(revision 24799)
@@ -0,0 +1,117 @@
+###########################################################################
+#
+# encodings.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2001 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# Each encoding supported by the Greenstone build-time software should be
+# specified in the following hash table ($encodings).
+
+package encodings;
+
+use strict;
+
+# $encodings takes the form:
+# --> identifier --> name      --> The full display name of the encoding.
+#                --> mapfile   --> The ump file associated with the encoding
+#                --> double    --> 1 if it's a double byte encoding
+#                --> converter --> If the encoding needs a specialized conversion
+#                                  routine this is the name of that routine.
+
+$encodings::encodings = {
+    'iso_8859_1' => {'name' => 'Latin1 (western languages)', 'mapfile' => '8859_1.ump'},
+
+    'iso_8859_2' => {'name' => 'Latin2 (central and eastern european languages)',
+		     'mapfile' => '8859_2.ump'},
+
+    'iso_8859_3' => {'name' => 'Latin3', 'mapfile' => '8859_3.ump'},
+
+    'iso_8859_4' => {'name' => 'Latin4', 'mapfile' => '8859_4.ump'},
+
+    'iso_8859_5' => {'name' => 'Cyrillic', 'mapfile' => '8859_5.ump'},
+
+    'iso_8859_6' => {'name' => 'Arabic', 'mapfile' => '8859_6.ump'},
+
+    'iso_8859_7' => {'name' => 'Greek', 'mapfile' => '8859_7.ump'},
+
+    'iso_8859_8' => {'name' => 'Hebrew', 'mapfile' => '8859_8.ump'},
+
+    'iso_8859_9' => {'name' => 'Turkish', 'mapfile' => '8859_9.ump'},
+
+    'iso_8859_15' => {'name' => 'Latin15 (revised western)', 'mapfile' => '8859_15.ump'},
+
+    'windows_1250' => {'name' => 'Windows codepage 1250 (WinLatin2)',
+		       'mapfile' => 'win1250.ump'},
+
+    'windows_1251' => {'name' => 'Windows codepage 1251 (WinCyrillic)',
+		       'mapfile' => 'win1251.ump'},
+
+    'windows_1252' => {'name' => 'Windows codepage 1252 (WinLatin1)',
+		       'mapfile' => 'win1252.ump'},
+
+    'windows_1253' => {'name' => 'Windows codepage 1253 (WinGreek)', 
+		       'mapfile' => 'win1253.ump'},
+
+    'windows_1254' => {'name' => 'Windows codepage 1254 (WinTurkish)',
+		       'mapfile' => 'win1254.ump'},
+
+    'windows_1255' => {'name' => 'Windows codepage 1255 (WinHebrew)', 
+		       'mapfile' => 'win1255.ump'},
+
+    'windows_1256' => {'name' => 'Windows codepage 1256 (WinArabic)', 
+		       'mapfile' => 'win1256.ump'},
+
+    'windows_1257' => {'name' => 'Windows codepage 1257 (WinBaltic)',
+		       'mapfile' => 'win1257.ump'},
+
+    'windows_1258' => {'name' => 'Windows codepage 1258 (Vietnamese)',
+		       'mapfile' => 'win1258.ump'},
+
+    'windows_874' => {'name' => 'Windows codepage 874 (Thai)', 'mapfile' => 'win874.ump'},
+
+    'dos_437' => {'name' => 'DOS codepage 437 (US English)', 'mapfile' => 'dos437.ump'},
+
+    'dos_850' => {'name' => 'DOS codepage 850 (Latin 1)', 'mapfile' => 'dos850.ump'},
+
+    'dos_852' => {'name' => 'DOS codepage 852 (Central European)', 'mapfile' => 'dos852.ump'},
+
+    'dos_866' => {'name' => 'DOS codepage 866 (Cyrillic)', 'mapfile' => 'dos866.ump'},
+
+    'koi8_r' => {'name' => 'Cyrillic', 'mapfile' => 'koi8_r.ump'},
+
+    'koi8_u' => {'name' => 'Cyrillic (Ukrainian)', 'mapfile' => 'koi8_u.ump'},
+
+    'iscii_de' => {'name' => 'ISCII Devanagari', 'mapfile' => 'iscii_de.ump'},
+
+    'shift_jis' => {'name' => 'Japanese (Shift-JIS)', 'mapfile' => 'shiftjis.ump',
+		    'converter' => 'shiftjis2unicode'},
+
+    'euc_jp' => {'name' => 'Japanese (EUC)', 'mapfile' => 'euc_jp.ump'},
+
+    'korean' => {'name' => 'Korean (Unified Hangul Code - i.e. a superset of EUC-KR)',
+		 'mapfile' => 'uhc.ump'},
+
+    'gb' => {'name' => 'Chinese Simplified (GB)', 'mapfile' => 'gbk.ump'},
+
+    'big5' => {'name' => 'Chinese Traditional (Big5)', 'mapfile' => 'big5.ump'}
+
+};
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/expinfo.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/expinfo.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/expinfo.pm	(revision 24799)
@@ -0,0 +1,192 @@
+###########################################################################
+#
+# expinfo.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# modified by: Chi-Yu Huang
+# This module stores information about the export directory. At the moment
+# this information just consists of the file name (relative to the
+# directory the export information file is in) and its OID.
+
+# This module assumes there is a one to one correspondance between
+# a file in the export directory and an OID.
+
+package expinfo;
+
+
+use strict;
+
+
+sub new {
+    my ($class) = @_;
+    my $self = {'info'=>{},
+		'order'=>[]};
+
+    return bless $self, $class;
+}
+
+sub load_info {
+    my $self = shift (@_);
+    my ($filename) = @_;
+
+    $self->{'info'} = {};
+ 
+    if (-e $filename) {
+	open (INFILE, $filename) || 
+	    die "expinfo::load_info couldn't read $filename\n";
+
+	my ($line, @line);
+	while (defined ($line = <INFILE>)) {
+	    $line =~ s/\cM|\cJ//g; # remove end-of-line characters
+	    @line = split ("\t", $line); # filename, 
+	    if (scalar(@line) >= 2) {
+		$self->add_info (@line);
+	    }
+	}
+	close (INFILE);
+    }
+}
+
+sub save_info {
+    my $self = shift (@_);
+    my ($filename) = @_;
+
+    my ($OID, $info);
+
+    open (OUTFILE, ">$filename") || 
+	die "expinfo::save_info couldn't write $filename\n";
+
+    foreach $info (@{$self->get_OID_list()}) {
+	if (defined $info) {
+	    print OUTFILE join("\t", @$info), "\n";
+	}
+    }
+    close (OUTFILE);
+}
+
+sub delete_info {
+    my $self = shift (@_);
+    my ($OID) = @_;
+
+    if (defined $self->{'info'}->{$OID}) {
+	delete $self->{'info'}->{$OID};
+	
+	my $i = 0;
+	while ($i < scalar (@{$self->{'order'}})) {
+	    if ($self->{'order'}->[$i]->[0] eq $OID) {
+		splice (@{$self->{'order'}}, $i, 1);
+		last;
+	    }
+	    $i ++;
+	}
+    }
+}
+
+sub add_info {
+    my $self = shift (@_);
+    my ($OID, $doc_file, $index_status, $sortmeta) = @_;
+    $sortmeta = "" unless defined $sortmeta;
+
+    if (! defined($OID)) {
+	# only happens when no files can be processed?
+	return undef;
+    }
+
+    print STDERR "**** adding info $OID\n";
+
+    if (defined $self->{'info'}->{$OID}) {
+	# test to see if we are in a reindex situation
+
+	my $existing_status_info = $self->get_status_info($OID);
+
+	if ($existing_status_info eq "D") {
+	    # yes, we're in a reindexing situation
+	    $self->delete_info ($OID);
+
+
+	    # force setting to "reindex"
+	    $index_status = "R";
+
+	}
+	else {
+	    # some other, possibly erroneous, situation has arisen
+	    # where the document already seems to exist
+	    print STDERR "Warning: $OID already exists with index status $existing_status_info\n";
+	    print STDERR "         Deleting previous version\n";
+
+	    $self->delete_info ($OID);
+	}
+    }
+
+    $self->{'info'}->{$OID} = [$doc_file,$index_status];
+    push (@{$self->{'order'}}, [$OID, $sortmeta]);
+}
+
+# returns a list of the form [[OID, doc_file], ...]
+sub get_OID_list {
+    my $self = shift (@_);
+
+    my ($OID);
+    my @list = ();
+
+    foreach $OID (sort {$a->[1] cmp $b->[1]} @{$self->{'order'}}) {
+	push (@list, [$OID->[0], $self->{'info'}->{$OID->[0]}->[0]]);
+    }
+    return \@list;
+}
+
+# returns a list of the form [[doc_file, OID], ...]
+sub get_file_list {
+    my $self = shift (@_);
+
+    my ($OID);
+    my @list = ();
+
+    foreach $OID (sort {$a->[1] cmp $b->[1]} @{$self->{'order'}}) {
+	push (@list, [$self->{'info'}->{$OID->[0]}->[0], $OID->[0]]);
+    }
+    return \@list;
+}
+
+
+# returns a list of the form [doc_file]
+sub get_info {
+    my $self = shift (@_);
+    my ($OID) = @_;
+
+    if (defined $self->{'info'}->{$OID}) {
+	return $self->{'info'}->{$OID};
+    }
+
+    return undef;
+}
+
+
+# returns the number of documents so far
+sub size {
+    my $self = shift (@_);
+    return (scalar(@{$self->{'order'}}));
+}
+
+1;
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/extrabuilder.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/extrabuilder.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/extrabuilder.pm	(revision 24799)
@@ -0,0 +1,134 @@
+###########################################################################
+#
+# extrauilder.pm -- inherited from basebuilder, to provide a netural
+#                   layer upon which to base extra extension buliders.
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# With Greenstone extensions increasingly working with multimedia indexing
+# this package has been devised to provide a layer that is more neutral to
+# the indexing steps performed.  It does this by overriding several methods
+# in basebulider.pm that as specific to text-indexing
+
+
+package extrabuilder;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+use basebuilder;
+
+sub BEGIN {
+    @extrabuilder::ISA = ('basebuilder');
+}
+
+
+sub new {
+    my $class = shift(@_);
+
+    my $self = new basebuilder (@_);
+    $self = bless $self, $class;
+
+    return $self;
+
+}
+
+# stuff has been moved here from new, so we can use subclass methods
+sub initXX {
+    my $self = shift(@_);
+
+    # Override base method to be null to neutral about builderproc indexing
+    return;    
+}
+
+sub deinitXX {
+    my $self = shift (@_);
+
+    # Override base method to be null to be neutral about builderproc indexing
+    return;    
+}
+
+sub generate_index_list {
+    my $self = shift (@_);
+
+    # needs to be defined, due to being called from basebuilder->init()
+
+    return;
+}
+
+sub set_sections_index_document_metadata {
+    my $self = shift (@_);
+    my ($index) = @_;
+
+    # Override base method to null to be neutral about builderproc indexing
+    return;    
+}
+
+
+sub set_strip_html {
+    my $self = shift (@_);
+    my ($strip) = @_;
+
+    # Override base method to be neutral about builderproc indexing
+    
+    $self->{'strip_html'} = $strip;
+    return;    
+}
+
+sub compress_text {
+    my $self = shift (@_);
+    my ($textindex) = @_;
+
+    # Override base method to null to be neutral about builderproc indexing
+    return;    
+}
+
+
+sub build_indexes {
+    my $self = shift (@_);
+    my ($indexname) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    # Override base method to null to be neutral about builderproc indexing
+    return;    
+}
+
+sub make_infodatabase {
+    my $self = shift (@_);
+    my $outhandle = $self->{'outhandle'};
+
+    # Override base method to null to be neutral about builderproc indexing
+    return;    
+}
+
+sub make_auxiliary_files {
+    my $self = shift (@_);
+    my ($index);
+    my $build_cfg = {};
+
+    # Override base method to null to be neutral about builderproc indexing
+    return;    
+}
+
+  
+1;
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/extrabuildproc.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/extrabuildproc.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/extrabuildproc.pm	(revision 24799)
@@ -0,0 +1,50 @@
+##########################################################################
+#
+# extrabuildproc.pm -- 
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# This document processor outputs a document for indexing (should be 
+# implemented by subclass) and storing in the database
+
+package extrabuildproc;
+
+use strict; 
+
+use basebuildproc;
+
+
+BEGIN {
+    @extrabuildproc::ISA = ('basebuildproc');
+}
+
+sub new()
+  {
+    my $class = shift @_;
+    my $self = new basebuildproc (@_);
+
+    return bless $self, $class;
+}
+
+
+1;
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/g2futil.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/g2futil.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/g2futil.pm	(revision 24799)
@@ -0,0 +1,431 @@
+package g2futil;
+
+
+BEGIN 
+{
+    if (!defined $ENV{'FEDORA_HOME'}) {
+	print STDERR "Error: Environment variable FEDORA_HOME not set.\n";
+	exit 1;
+    }
+
+    my $fedora_client_bin = &util::filename_cat($ENV{'FEDORA_HOME'},"client","bin");
+    &util::envvar_append("PATH",$fedora_client_bin);
+}
+
+use strict;
+use util;
+
+sub run_cmd_old
+{
+    my ($cmd,$verbosity,$tolerate_error) = @_;
+
+    if (($verbosity == 0) 
+	|| (defined $tolerate_error && ($tolerate_error eq "tolerate_error"))) {
+	if($ENV{'GSDLOS'} =~ /^windows$/i) {
+	    $cmd .= " > nul";
+	} else {
+	    $cmd .= " > /dev/null";
+	}
+    }
+    
+    if ($verbosity >= 2) {
+	print "Running command:\n";
+	print "$cmd\n";
+    }
+
+    my $status = system($cmd);
+
+    if ($verbosity >= 2) {
+	print "Exit status = ", $status/256, "\n";
+    }
+
+    if ((!defined $tolerate_error) || ($tolerate_error ne "tolerate_error")) {
+	if ($status>0) {
+	    print STDERR "Error executing:\n$cmd\n";
+	    print STDERR "$!\n";
+	}
+    }
+
+    return $status;
+}
+
+
+sub run_cmd
+{
+    my ($prog,$arguments,$verbosity,$tolerate_error) = @_;
+
+    my $cmd_status = undef;
+
+    my $script_ext = ($ENV{'GSDLOS'} =~ m/^windows/) ? ".bat" : ".sh";
+
+    if ($prog =~ m/^fedora-/) {
+	$prog .= $script_ext;
+    }
+    if (($prog =~ m/.pl$/i) && ($ENV{'GSDLOS'} =~ m/^windows/)) {
+	$prog ="\"".&util::get_perl_exec()."\" -S $prog";
+    }
+ 
+    my $cmd = "$prog $arguments";
+
+###    print "*** cmd = $cmd\n";
+
+    if (open(CMD,"$cmd 2>&1 |"))
+    {
+	my $result = "";
+	my $line;
+	while (defined ($line = <CMD>))
+	{	
+	    $result .= $line;	    
+
+	    if ((!defined $tolerate_error) || ($tolerate_error ne "tolerate_error"))
+	    {
+		print $line;
+	    }
+
+
+	}
+	
+	close(CMD);
+	
+	$cmd_status = $?;
+
+	if ($cmd_status == 0) {
+	    # Check for any lines in result begining 'Error:'
+	    
+	    if ($result =~ m/^Error\s*:/m) {
+		# Fedora script generated an error, but did not exit
+		# with an error status => artificially raise one
+
+		$cmd_status = -1;
+	    }
+	}
+
+	if ($cmd_status != 0) {
+
+	    if ((!defined $tolerate_error) || ($tolerate_error ne "tolerate_error"))
+	    {
+		print STDERR "Error: processing command failed.  Exit status $cmd_status\n";
+		
+		if ($verbosity >= 2) {
+		    print STDERR "  Command was: $cmd\n";
+		}
+		if ($verbosity >= 3) {
+		    print STDERR "result: $result\n";
+		}
+
+	    }
+	}
+    }
+    else 
+    {
+	print STDERR "Error: failed to execute $cmd\n";
+    }
+
+
+    return $cmd_status;
+}
+
+
+sub run_datastore_info
+{
+    my ($pid,$options) = @_;
+
+    my $verbosity = $options->{'verbosity'};
+
+    my $hostname = $options->{'hostname'};
+    my $port     = $options->{'port'};
+    my $username = $options->{'username'};
+    my $password = $options->{'password'};
+    my $protocol = $options->{'protocol'};
+
+    my $prog = "fedora-dsinfo";
+    my $arguments = "$hostname $port $username $password $pid $protocol";
+    my $status = run_cmd($prog,$arguments,$verbosity,"tolerate_error");
+
+    return $status;
+}
+
+sub run_purge
+{
+    my ($pid,$options) = @_;
+
+    my $verbosity = $options->{'verbosity'};
+
+    my $hostname = $options->{'hostname'};
+    my $port     = $options->{'port'};
+    my $username = $options->{'username'};
+    my $password = $options->{'password'};
+    my $protocol = $options->{'protocol'};
+
+    my $server = "$hostname:$port";
+
+    my $prog = "fedora-purge";
+    my $arguments = "$server $username $password $pid $protocol";
+    $arguments .= " \\\n \"Automated_purge_by_g2f_script\"";
+
+    my $status = run_cmd($prog,$arguments,$verbosity);
+
+    return $status;
+}
+
+sub run_ingest
+{
+    my ($docmets_filename,$options) = @_;
+
+    my $verbosity = $options->{'verbosity'};
+
+    my $hostname = $options->{'hostname'};
+    my $port     = $options->{'port'};
+    my $username = $options->{'username'};
+    my $password = $options->{'password'};
+    my $protocol = $options->{'protocol'};
+
+    my $server = "$hostname:$port";
+
+    my $prog = "fedora-ingest";
+
+    my $type = undef;
+    
+    if ($ENV{'FEDORA_VERSION'} =~ m/^2/) { # checking if major version is 2
+    	$type = "metslikefedora1";
+    }
+    else {
+	$type = "info:fedora/fedora-system:METSFedoraExt-1.1";
+    }
+
+    my $arguments = "file \"$docmets_filename\" $type $server $username $password $protocol";
+    $arguments .= " \\\n \"Automated_purge_by_g2f_script\"";
+
+    my $status = run_cmd($prog,$arguments,$verbosity);
+
+    return $status;
+}
+
+
+sub rec_get_all_hash_dirs
+{
+    my ($full_dir,$all_dirs) = @_;
+
+    if (opendir(DIR, $full_dir)) {
+	my @sub_dirs = grep { ($_ !~ /^\./) && (-d &util::filename_cat($full_dir,$_)) } readdir(DIR);
+	closedir DIR;
+
+	my @hash_dirs = grep { $_ =~ m/\.dir$/ } @sub_dirs;
+	my @rec_dirs = grep { $_ !~ m/\.dir$/ } @sub_dirs;
+	
+	foreach my $hd (@hash_dirs) {
+	    my $full_hash_dir = &util::filename_cat($full_dir,$hd);
+	    push(@$all_dirs,$full_hash_dir);
+	}
+
+	foreach my $rd (@rec_dirs) {
+	    my $full_rec_dir = &util::filename_cat($full_dir,$rd);
+	    rec_get_all_hash_dirs($full_rec_dir,$all_dirs);
+	}	    
+    }
+}
+
+sub get_all_hash_dirs
+{
+    my ($start_dir,$maxdocs) = @_;
+    
+    my @all_dirs = ();
+    rec_get_all_hash_dirs($start_dir,\@all_dirs);
+
+    if ((defined $maxdocs) && ($maxdocs ne "")) {
+	my @maxdoc_dirs = ();
+	for (my $i=0; $i<$maxdocs; $i++) {
+	    push(@maxdoc_dirs,shift(@all_dirs));
+	}
+	@all_dirs = @maxdoc_dirs;
+    }
+
+    return @all_dirs;
+}
+
+sub get_hash_id
+{
+    my ($hash_dir) = @_;
+
+    my $hash_id = undef;
+
+    my $docmets_filename = &util::filename_cat($hash_dir,"docmets.xml");
+
+    if (open(DIN,"<$docmets_filename"))
+    {
+	while (defined (my $line = <DIN>))
+	{
+	    if ($line =~ m/<dc:identifier>(.*?)<\/dc:identifier>/)
+	    {
+		$hash_id = $1;
+		last;
+	    }
+	}
+    
+	close(DIN);
+    }
+    else
+    {
+	print STDERR "Warning: Unable to open \"$docmets_filename\"\n";
+    }
+
+    return $hash_id;
+
+}
+
+
+# Subroutine to write the gsdl.xml file in FEDORA_HOME/tomcat/conf/Catalina/<host/localhost>/
+# This xml file will tell Fedora where to find the parent folder of the GS collect dir
+# so that it can obtain the FedoraMETS files for ingestion. 
+# It depends on the Fedora server being on the same machine as the Greenstone server that 
+# this code is part of.
+sub write_gsdl_xml_file
+{
+    my ($fedora_host, $collect_dir, $options) = @_;
+    my $verbosity = $options->{'verbosity'};
+    my $hostname = $options->{'hostname'};
+    my $port     = $options->{'port'};
+    my $protocol = $options->{'protocol'};
+
+    print STDERR "Ensuring that a correct gsdl.xml file exists on the Fedora server end\n";
+    # The top of this file has already made sure that FEDORA_HOME is set, but for GS3
+    # CATALINA_HOME is set to GS' own tomcat. Since we'll be working with fedora, we need
+    # to temporarily set CATALINA_HOME to fedora's tomcat. (Catalina is undefined for GS2.)
+    my $gs_catalina_home = $ENV{'CATALINA_HOME'} if defined $ENV{'CATALINA_HOME'};
+    $ENV{'CATALINA_HOME'} = &util::filename_cat($ENV{'FEDORA_HOME'}, "tomcat");
+    
+    # 1. Find out which folder to write to: fedora_host or localhost 
+    # whichever contains fedora.xml is the one we want (if none, exit with error value?)
+    my $fedora_home = $ENV{'FEDORA_HOME'};
+    my $base_path = &util::filename_cat($fedora_home, "tomcat", "conf", "Catalina");
+
+    my $host_path = &util::filename_cat($base_path, $fedora_host);
+    my $xmlFile = &util::filename_cat($host_path, "fedora.xml");
+    if (!-e $xmlFile) {
+	# check if the folder localhost contains fedoraXML
+	$host_path = &util::filename_cat($base_path, "localhost");
+	$xmlFile = &util::filename_cat($host_path, "fedora.xml");
+	if(!-e $xmlFile) {
+	    # try putting gsdl in this folder, but still print a warning
+	    print STDERR "$host_path does not contain file fedora.xml. Hoping gsdl.xml belongs there anyway\n";
+	}
+    }
+
+    # 2. Construct the string we are going write to the gsdl.xml file
+    # a. get the parent directory of collect_dir by removinbg the word 
+    # "collect" from it and any optional OS-type slash at the end. 
+    # (Path slash direction does not matter here.)
+    my $collectParentDir = $collect_dir;
+    $collectParentDir =~ s/collect(\/|\\)?//;
+  
+    # b. Use the collectParentDir to create the contents of gsdl.xml
+    my $greenstone_url_prefix = &util::get_greenstone_url_prefix(); # would have the required slash at front
+    my $gsdlXMLcontents = "<?xml version='1.0' encoding='utf-8'?>\n<Context docBase=\"";
+    $gsdlXMLcontents = $gsdlXMLcontents.$collectParentDir."\" path=\"$greenstone_url_prefix\"></Context>";
+    
+    # 3. If there is already a gsdl.xml file in host_path, compare the string we
+    # want to write with what is already in there. If they're the same, we can return
+    $xmlFile = &util::filename_cat($host_path, "gsdl.xml");
+    if(-e $xmlFile) {
+	# such a file exists, so read the contents
+	unless(open(FIN, "<$xmlFile")) { 
+	    print STDERR "g2f-import.pl: Unable to open existing $xmlFile for comparing...Recoverable. $!\n";
+	    # doesn't matter, we'll just overwrite it then
+	}    
+	my $xml_contents;
+	{
+	    local $/ = undef;        # Read entire file at once
+	    $xml_contents = <FIN>;   # Now file is read in as one single 'line'
+	}
+	close(FIN); # close the file
+	if($xml_contents eq $gsdlXMLcontents) { 
+	    print STDERR "Fedora links to the FLI import folder through gsdl.xml.\n";
+	    # it already contains what we want, we're done
+	    return "gsdl.xml";
+	}
+    }
+
+    # 4. If we're here, the contents of gsdl.xml need to be updated:
+    # a. First stop the fedora server
+    my $script_ext = ($ENV{'GSDLOS'} =~ m/^windows/) ? ".bat" : ".sh";
+    my $stop_tomcat = &util::filename_cat($fedora_home, "tomcat", "bin", "shutdown".$script_ext);
+    # execute the command 
+    $! = 0; # does this initialise the return value?
+    my $status = system($stop_tomcat);
+    if ($status!=0) { # to get the actual exit value, divide by 256, but not useful here
+	# possible tomcat was already stopped - it's not the end of the world
+	print STDERR "Failed to stop Fedora server. Perhaps it was not running. $!\n";
+	print "Exit status = ", $status/256, "\n";
+    }
+
+    # b. overwrite the file that has outdated contents with the contents we just constructed
+    unless(open(FOUT, ">$xmlFile")) {  # create or overwrite gsdl.xml file
+	die "g2f-import.pl: Unable to open $xmlFile for telling Fedora where the collect dir is...ERROR: $!\n";
+    }
+    # write out the updated contents and close the file
+    print FOUT $gsdlXMLcontents;
+    close(FOUT);
+
+    # c. Restart the fedora server
+    my $start_tomcat = &util::filename_cat($fedora_home, "tomcat", "bin", "startup".$script_ext);
+    $! = 0;
+    $status = system($start_tomcat);
+    if ($status!=0) { 
+	print STDERR "Failed to restart the Fedora server... ERROR: $!\n";
+	print "Exit status = ", $status/256, "\n";
+    }
+
+    # reset CATALINA_HOME to GS' Tomcat (it is undefined for GS2 since GS2 has no tomcat):
+    $ENV{'CATALINA_HOME'} = $gs_catalina_home if defined $gs_catalina_home;
+    
+    # Starting up the Fedora server takes a long time. We need to wait for the server to be
+    # ready before import can continue, because g2f-import relies on an up-and-running Fedora
+    # server to purge the collection from it while g2f-build.pl needs a ready Fedora server 
+    # in order to make it ingest the FedoraMETS. Sleeping is not sufficient (#sleep 10;) since
+    # the subsequent steps depend on a proper server restart.
+    # Dr Bainbridge's suggestion: test the server is ready with a call to wget.
+    
+    # Wget tries to retrieve the fedora search page (protocol://host:port/fedora/search)
+    # 20 times, waiting 3 seconds between each failed attempt. If it ultimately fails, we
+    # print a message to the user.
+    # The wget --spider option makes it check that the page is merely there rather than 
+    # downloading it (see http://www.gnu.org/software/wget/manual/wget.html#Download-Options)
+    # -q is for quiet, --tries for the number of retries, --waitretry is the number of seconds
+    # between each attempt. Usually wget returns the contents of the page, but in our case it
+    # will return 0 for success since we are not downloading.
+
+    print STDERR "Fedora server restarted. Waiting for it to become ready...\n";
+    #print STDERR "****$protocol://$hostname:$port/fedora/search\n";
+    $! = 0;
+    #my $fedoraServerReady = system("wget -q --spider --waitretry=10 --tries=20 $protocol://$hostname:$port/fedora/search");
+
+    # The retries above won't work if the server isn't running: 
+    # http://www.gnu.org/software/wget/manual/wget.html
+    #'--tries=number'
+    # Set number of retries to number. Specify 0 or 'inf' for infinite retrying. The default is to retry 20 times, 
+    # with the exception of fatal errors like "connection refused" or "not found" (404), which ARE NOT RETRIED.
+
+    # retry fedora server every second for a total of 20 times until the server is ready
+    my $fedoraServerReady = 0;
+    my $count = 0;
+    do {
+	$fedoraServerReady = system("wget -q --spider $protocol://$hostname:$port/fedora/search");
+	if($fedoraServerReady != 0) {
+	    sleep(1);
+	    $count++;
+	    #print STDERR "$count second(s)\n";
+	}
+    } while($fedoraServerReady != 0 && $count < 20);
+
+    if($fedoraServerReady != 0) {
+	print STDERR "Fedora server is still not ready... ERROR: $!\n";
+	print "Exit status = ", $fedoraServerReady/256, "\n";
+	die "Exiting....\n";
+    }
+
+    # return some indication that things went well
+    return "gsdl.xml";
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/gflock.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/gflock.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/gflock.pm	(revision 24799)
@@ -0,0 +1,55 @@
+###########################################################################
+#
+# gflock.pm - an attempt to use flock only on those platforms
+# on which it's supported (i.e. everything but Windows 95/98)
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package gflock;
+
+use Fcntl ':flock';
+use strict;
+
+# returns true if successful (or if OS is a form of windows other than NT)
+sub lock {
+    my ($handle) = @_;
+
+    if ($ENV{'GSDLOS'} eq "windows" && !Win32::IsWinNT()) {
+	return 1;
+    } else {
+	return flock($handle, LOCK_EX);
+    }
+}
+
+# returns true if successful (or if OS is a form of windows other than NT)
+sub unlock {
+    my ($handle) = @_;
+
+    if ($ENV{'GSDLOS'} eq "windows" && !Win32::IsWinNT()) {
+	return 1;
+    } else {
+	return flock($handle, LOCK_UN);
+    }
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/ghtml.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/ghtml.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/ghtml.pm	(revision 24799)
@@ -0,0 +1,313 @@
+###########################################################################
+#
+# ghtml.pm -- this used to be called html.pm but it clashed
+# with the existing html module under windows
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package ghtml;
+
+use strict;
+use unicode;
+
+# htmlsafe(TEXT)
+# 
+# Converts SGML meta characters in TEXT to entity references.
+# 
+sub htmlsafe
+{
+    $_[0] =~ s/&/&amp;/osg;
+    $_[0] =~ s/</&lt;/osg;
+    $_[0] =~ s/>/&gt;/osg;
+    $_[0] =~ s/\"/&quot;/osg;
+}
+
+# unescape_html(TEXT)
+# 
+# Converts HTML entities into their original form.
+# 
+sub unescape_html
+{
+    my ($html) = @_;
+
+    $html =~ s/&amp;/&/osg;
+    $html =~ s/&lt;/</osg;
+    $html =~ s/&gt;/>/osg;
+    $html =~ s/&quot;/\"/osg;
+
+    return $html;
+}
+
+# urlsafe(TEXT)
+# 
+# Converts characters not allowed in a URL to their hex representation.
+# 
+sub urlsafe
+{
+    # protect any hash's that are part of an entity, e.g. &#097;
+    $_[0] =~ s/&#(.*?);/&%23$1;/g;
+
+    # and the usual suspects
+    $_[0] =~ s/[\x09\x20\x22\x3c\x3e\x5b\x5c\x5d\x5e\x60\x7b\x7c\x7d\x7e\?\=\&\+_\/]/sprintf("%%%2x", ord($&))/gse;
+}
+
+
+# named entry to the standard html font
+my %charnetosf = ("Agrave"=> "192",  "Aacute"=> "193",  "Acirc" => "194",  "Atilde"=> "195",
+	       "Auml"  => "196",  "Aring" => "197",  "AElig" => "198",  "Ccedil"=> "199",
+	       "Egrave"=> "200",  "Eacute"=> "201",  "Ecirc" => "202",  "Euml"  => "203",
+	       "Igrave"=> "204",  "Iacute"=> "205",  "Icirc" => "206",  "Iuml"  => "207",
+	       "ETH"   => "208",  "Ntilde"=> "209",  "Ograve"=> "210",  "Oacute"=> "211",
+	       "Ocirc" => "212",  "Otilde"=> "213",  "Ouml"  => "214",  
+	       "Oslash"=> "216",  "Ugrave"=> "217",  "Uacute"=> "218",  "Ucirc" => "219",
+	       "Uuml"  => "220",  "Yacute"=> "221",  "THORN" => "222",  "szlig" => "223",
+	       "agrave"=> "224",  "aacute"=> "225",  "acirc" => "226",  "atilde"=> "227",
+	       "auml"  => "228",  "aring" => "229",  "aelig" => "230",  "ccedil"=> "231",
+	       "egrave"=> "232",  "eacute"=> "233",  "ecirc" => "234",  "euml"  => "235",
+	       "igrave"=> "236",  "iacute"=> "237",  "icirc" => "238",  "iuml"  => "239",
+	       "eth"   => "240",  "ntilde"=> "241",  "ograve"=> "242",  "oacute"=> "243",
+	       "ocirc" => "244",  "otilde"=> "245",  "ouml"  => "246",  
+	       "oslash"=> "248",  "ugrave"=> "249",  "uacute"=> "250",  "ucirc" => "251",
+	       "uuml"  => "252",  "yacute"=> "253",  "thorn" => "254",  "yuml"  => "255");
+
+my %symnetosf = ("quot"  => "34",   "amp"   => "38",   "lt"    => "60",   "gt"    => "62",
+	      "nbsp"  => "160",  "iexcl" => "161",  "cent"  => "162",  "pound" => "163",
+	      "curren"=> "164",  "yen"   => "165",  "brvbar"=> "166",  "sect"  => "167",
+	      "uml"   => "168",  "copy"  => "169",  "ordf"  => "170",  "laquo" => "171",
+	      "not"   => "172",  "shy"   => "173",  "reg"   => "174",  "macr"  => "175",
+	      "deg"   => "176",  "plusmn"=> "177",  "sup2"  => "178",  "sup3"  => "179",
+	      "acute" => "180",  "micro" => "181",  "para"  => "182",  "middot"=> "183",
+	      "cedil" => "184",  "sup1"  => "185",  "ordm"  => "186",  "raquo" => "187",
+	      "frac14"=> "188",  "frac12"=> "189",  "frac34"=> "190",  "iquest"=> "191",
+	      "times" => "215",  "divide"=> "247");
+
+
+
+# standard font to plain text
+my %sftotxt = ("32"  => " ",  "33"  => "!",  "34"  => "\"",  "35"  => "\#",  "36"  => "\$",
+	    "37"  => "\%", "38"  => "&",  "39"  => "'",   "40"  => "(",   "41"  => ")",
+	    "42"  => "*",  "43"  => "+",  "44"  => ",",   "45"  => "-",   "46"  => ".",
+	    "47"  => "/",  "48"  => "0",  "49"  => "1",   "50"  => "2",   "51"  => "3",
+	    "52"  => "4",  "53"  => "5",  "54"  => "6",   "55"  => "7",   "56"  => "8",
+	    "57"  => "9",  "58"  => ":",  "59"  => ";",   "60"  => "<",   "61"  => "=",
+	    "62"  => ">",  "63"  => "?",  "64"  => "\@",  "65"  => "A",   "66"  => "B",
+	    "57"  => "9",  "58"  => ":",  "59"  => ";",   "61"  => "=",
+	    "63"  => "?",  "64"  => "\@", "65"  => "A",  "66"  => "B",
+	    "67"  => "C",  "68"  => "D",  "69"  => "E",   "70"  => "F",   "71"  => "G",
+	    "72"  => "H",  "73"  => "I",  "74"  => "J",   "75"  => "K",   "76"  => "L",
+	    "77"  => "M",  "78"  => "N",  "79"  => "O",   "80"  => "P",   "81"  => "Q",
+	    "82"  => "R",  "83"  => "S",  "84"  => "T",   "85"  => "U",   "86"  => "V",
+	    "87"  => "W",  "88"  => "X",  "89"  => "Y",   "90"  => "Z",   "91"  => "[",
+	    "92"  => "\\", "93"  => "]",  "94"  => "^",   "95"  => "_",   "96"  => "`",
+	    "97"  => "a",  "98"  => "b",  "99"  => "c",   "100" => "d",   "101" => "e",
+	    "102" => "f",  "103" => "g",  "104" => "h",   "105" => "i",   "106" => "j",
+	    "107" => "k",  "108" => "l",  "109" => "m",   "110" => "n",   "111" => "o",
+	    "112" => "p",  "113" => "q",  "114" => "r",   "115" => "s",   "116" => "t",
+	    "117" => "u",  "118" => "v",  "119" => "w",   "120" => "x",   "121" => "y",
+	    "122" => "z",  "123" => "{",  "124" => "|",   "125" => "}",   "126" => "~",
+	    "130" => ",",  "131" => "f",  "132" => "\"",   "133" => "...", "139" => "<",
+	    "140" => "OE", "145" => "'",  "146" => "'",   "147" => "\"",   "148" => "\"",
+	    "149" => "o",  "150" => "--", "151" => "-",   "152" => "~",   "153" => "TM",
+	    "155" => ">",  "156" => "oe", "159" => "Y",   "160" => " ",   "178" => "2",
+	    "179" => "3",  "185" => "1",  "188" => "1/4", "189" => "1/2", "190" => "3/4",
+	    "192" => "A",  "193" => "A",  "194" => "A",   "195" => "A",   "196" => "A",
+	    "197" => "A",  "198" => "AE", "199" => "C",   "200" => "E",   "201" => "E",
+	    "202" => "E",  "203" => "E",  "204" => "I",   "205" => "I",   "206" => "I",
+	    "207" => "I",  "208" => "D",  "209" => "N",   "210" => "O",   "211" => "O",
+	    "212" => "O",  "213" => "O",  "214" => "O",   "215" => "*",   "216" => "O",
+	    "217" => "U",  "218" => "U",  "219" => "U",   "220" => "U",   "221" => "Y",
+	    "223" => "ss", "224" => "a",  "225" => "a",   "226" => "a",   "227" => "a",
+	    "228" => "a",  "229" => "a",  "230" => "ae",  "231" => "c",   "232" => "e",
+	    "233" => "e",  "234" => "e",  "235" => "e",   "236" => "i",   "237" => "i",
+	    "238" => "i",  "239" => "i",  "241" => "n",   "242" => "o",   "243" => "o",
+	    "244" => "o",  "245" => "o",  "246" => "o",   "247" => "/",   "248" => "o",
+	    "249" => "u",  "250" => "u",  "251" => "u",   "252" => "u",   "253" => "y",
+	    "255" => "y",  "8218" => ",");
+
+
+my %mime_type = ("ai"=>"application/postscript", "aif"=>"audio/x-aiff", 
+		     "aifc"=>"audio/x-aiff", "aiff"=>"audio/x-aiff", 
+		     "au"=>"audio/basic", "avi"=>"video/x-msvideo",
+		     "bcpio"=>"application/x-bcpio", "bin"=>"application/octet-stream", 
+		     "cdf"=>"application/x-netcdf", "class"=>"application/octet-stream", 
+		     "cpio"=>"application/x-cpio", "cpt"=>"application/mac-compactpro",
+		     "csh"=>"application/x-csh", "dcr"=>"application/x-director", 
+		     "dir"=>"application/x-director", "dms"=>"application/octet-stream", 
+		     "doc"=>"application/msword", "dvi"=>"application/x-dvi",
+		     "dxr"=>"application/x-director", "eps"=>"application/postscript", 
+		     "etx"=>"text/x-setext",
+		     "exe"=>"application/octet-stream", "gif"=>"image/gif",
+		     "gtar"=>"application/x-gtar", "hdf"=>"application/x-hdf",
+		     "hqx"=>"application/mac-binhex40", "htm"=>"text/html",
+		     "html"=>"text/html", "ice"=>"x-conference/x-cooltalk",
+		     "ief"=>"image/ief", "jpe"=>"image/jpeg",
+		     "jpeg"=>"image/jpeg", "jpg"=>"image/jpeg",
+		     "kar"=>"audio/midi", "latex"=>"application/x-latex",
+		     "lha"=>"application/octet-stream", "lzh"=>"application/octet-stream",
+		     "man"=>"application/x-troff-man", "mcf"=>"image/vasa",
+		     "me"=>"application/x-troff-me", "mid"=>"audio/midi",
+		     "midi"=>"audio/midi", "mif"=>"application/x-mif",
+		     "mov"=>"video/quicktime", "movie"=>"video/x-sgi-movie",
+		     "mp2"=>"audio/mpeg", "mpe"=>"video/mpeg",
+		     "mpeg"=>"video/mpeg", "mpg"=>"video/mpeg",
+		     "mpga"=>"audio/mpeg", "ms"=>"application/x-troff-ms",
+		     "nc"=>"application/x-netcdf", "oda"=>"application/oda",
+		     "pbm"=>"image/x-portable-bitmap", "pdb"=>"chemical/x-pdb",
+		     "pdf"=>"application/pdf", "pgm"=>"image/x-portable-graymap",
+		     "png"=>"image/png", "pnm"=>"image/x-portable-anymap",
+		     "ppm"=>"image/x-portable-pixmap",
+		     "ppt"=>"application/vnd.ms-powerpoint",
+		     "ps"=>"application/postscript", "qt"=>"video/quicktime",
+		     "ra"=>"audio/x-realaudio", "ram"=>"audio/x-pn-realaudio",
+		     "ras"=>"image/x-cmu-raster", "rgb"=>"image/x-rgb",
+		     "roff"=>"application/x-troff", "rpm"=>"audio/x-pn-realaudio-plugin",
+		     "rtf"=>"application/rtf", "rtx"=>"text/richtext",
+		     "sgm"=>"text/x-sgml", "sgml"=>"text/x-sgml",
+		     "sh"=>"application/x-sh", "shar"=>"application/x-shar",
+		     "sit"=>"application/x-stuffit", "skd"=>"application/x-koan",
+		     "skm"=>"application/x-koan", "skp"=>"application/x-koan",
+		     "skt"=>"application/x-koan", "snd"=>"audio/basic",
+		     "src"=>"application/x-wais-source", "sv4cpio"=>"application/x-sv4cpio",
+		     "sv4crc"=>"application/x-sv4crc", "t"=>"application/x-troff",
+		     "tar"=>"application/x-tar", "tcl"=>"application/x-tcl",
+		     "tex"=>"application/x-tex", "texi"=>"application/x-texinfo",
+		     "texinfo"=>"application/x-texinfo", "tif"=>"image/tiff",
+		     "tiff"=>"image/tiff", "tr"=>"application/x-troff",
+		     "tsv"=>"text/tab-separated-values", "txt"=>"text/plain",
+		     "ustar"=>"application/x-ustar", "vcd"=>"application/x-cdlink",
+		     "vrml"=>"x-world/x-vrml", "wav"=>"audio/x-wav",
+		     "wrl"=>"x-world/x-vrml", "xbm"=>"image/x-xbitmap",
+		     "xls"=>"application/vnd.ms-excel",
+		     "xpm"=>"image/x-xpixmap", "xwd"=>"image/x-xwindowdump",
+		     "xyz"=>"chemical/x-pdb", "zip"=>"application/zip");
+
+
+# returns the character as a raw utf-8 character. It assumes that the
+# & and ; have been stripped off the string.
+sub getcharequiv {
+    my ($entity, $convertsymbols, $and_decode) = @_;
+
+    my $char_equiv = undef;
+
+    # a numeric entity
+    my $code = undef;
+    if ($entity =~ m/^\#0*(\d+)$/) {
+	$code=$1;
+    }
+    elsif ($entity =~ m/^\#x([0-9A-F]+)$/i) {
+	$code=hex($1);
+    }
+
+    if (defined $code) {
+	# non-standard Microsoft breakage, as usual
+	if ($code < 0x9f) { # code page 1252 uses reserved bytes
+	    if ($code == 0x91) {$code=0x2018} # 145 = single left quote
+	    elsif ($code == 0x92) {$code=0x2019} # 146 = single right quote
+	    elsif ($code == 0x93) {$code=0x201c} # 147 = double left quote
+	    elsif ($code == 0x94) {$code=0x201d} # 148 = double right quote
+	    # ...
+	}	
+	$char_equiv = &unicode::unicode2utf8([$code]);
+    }
+    
+    # a named character entity
+    elsif (defined $charnetosf{$entity}) {
+	$char_equiv = &unicode::unicode2utf8([$charnetosf{$entity}]);
+    }
+
+    # a named symbol entity
+    elsif ($convertsymbols && defined $symnetosf{$entity}) {
+	$char_equiv = &unicode::unicode2utf8([$symnetosf{$entity}]);
+    }
+
+    if (!defined $char_equiv) {
+	return "&$entity;"; # unknown character
+    }
+    else {
+	if ((defined $and_decode) && ($and_decode)) {
+	    $char_equiv = Encode::decode("utf8",$char_equiv);
+	}
+	return $char_equiv;
+    }
+}
+
+# convert character entities from named equivalents to html font
+sub convertcharentities {
+    # args: the text that you want to convert
+
+    $_[0] =~ s/&([^;]+);/&getcharequiv($1,0)/gse;
+}
+
+# convert any entities from named equivalents to html font
+sub convertallentities {
+    # args: the text that you want to convert
+
+    $_[0] =~ s/&([^;]+);/&getcharequiv($1,1)/gse;
+}
+
+sub html2txt {
+    # args: the text that you want converted to ascii, 
+    # and whether to strip out sgml tags
+
+    # strip out sgml tags if needed
+    $_[0] =~ s/<[^>]*>//g if $_[1];
+
+    # convert the char entities to the standard html font
+    &convertcharentities($_[0]); 
+    
+    # convert the html character set to a plain ascii character set
+    my $pos = 0;
+    while ($pos < length($_[0])) {
+	my $charnum = ord(substr($_[0], $pos, 1));
+	if ($charnum >= 32) { # only convert characters above #32
+	    my $replacechars = " ";
+	    $replacechars = $sftotxt{$charnum} if defined $sftotxt{$charnum};
+	    substr($_[0], $pos, 1) = $replacechars;
+	    $pos += length ($replacechars);
+
+	} else {
+	    $pos ++;
+	}
+    }
+}  
+
+
+# look for mime.types (eg in /etc, or apache/conf directories), or have a look
+# at <ftp://ftp.iana.org/in-notes/iana/assignments/media-types/> for defaults.
+sub guess_mime_type {
+    my ($filename) = @_;
+    # make the filename lowercase, since the mimetypes hashmap looks for lowercase
+    $filename = lc($filename);
+
+    my ($fileext) = $filename =~ /\.(\w+)$/;
+    return "unknown" unless defined $fileext;
+
+    # else
+    my $mimetype =  $mime_type{$fileext};
+    return $mimetype if (defined $mimetype);
+
+    return "unknown";
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/giget.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/giget.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/giget.pm	(revision 24799)
@@ -0,0 +1,276 @@
+use strict;
+use util;
+
+
+sub readin_html 
+{
+    my ($html_fname) = @_;
+
+    open(HIN,"<$html_fname") 
+	|| die "Unable to open $html_fname: $!\n";
+    
+    my $html_text;
+    my $line;
+    while (defined ($line=<HIN>)) {
+	$html_text .= $line;
+    }
+    close(HIN);
+
+    return $html_text;
+}
+
+sub stripout_anchortags
+{
+    my ($html_text) = @_;
+
+    my @anchor_tags = ($html_text =~ m/(<a\s+.*?>)+/gs);
+
+    return @anchor_tags;
+} 
+
+
+sub print_tags
+{
+    my (@tags) = @_;
+
+    my $a;
+    foreach $a ( @tags) {
+	print "$a\n";
+    }
+}
+
+sub filter_tags
+{
+    my ($filter_text,@tags) = @_;
+
+    my @filtered_tags = ();
+
+    my $t;
+    foreach $t (@tags) {
+	if ($t =~ m/$filter_text/x) {
+	    push(@filtered_tags,$t);
+	}
+    }
+
+    return @filtered_tags;
+}
+
+sub extract_urls {
+    my (@tags) = @_;
+
+    my @urls = ();
+
+    my $t;
+    foreach $t (@tags) {
+	if ($t =~ m/href=([^ ]+)/i) {
+	    my $url = $1;
+	    $url =~ s/&amp;/&/g;
+	    push(@urls,$url);
+	}
+    }
+
+    return @urls;
+}
+
+sub get_gi_page
+{
+    my ($cgi_base,$cgi_call,$downloadto_fname) = @_;
+
+    my $full_url = "$cgi_base$cgi_call";
+    
+    if ((!-e $downloadto_fname) || (-z $downloadto_fname)) {
+	my $cmd = "wget -nv -T 10 -nc -U \"Mozilla\" -O \"$downloadto_fname\" \"$full_url\"";
+##	print STDERR "*** wget cmd:\n $cmd\n";
+
+    `$cmd`;
+    }
+
+    if (-z $downloadto_fname) { 
+	print STDERR "Warning: downloaded file 0 bytes!\n";
+    }
+}
+
+
+sub parse_gi_search_page 
+{
+    my ($ga_base,$search_term_dir,$downloaded_fname,$currpage_url) = @_;
+
+    my $nextpage_url = undef;
+
+    my @imgref_urls = ();
+
+    my $downloaded_text = readin_html($downloaded_fname);
+    if (defined $downloaded_text) {
+	my @anchor_tags = stripout_anchortags($downloaded_text);
+	
+	my @thumbimg_tags = filter_tags("imgres\\?",@anchor_tags);
+	my @nextpage_tags = filter_tags("images\\?.*?start=\\d+",@anchor_tags);
+	
+	my @thumbimg_urls = extract_urls(@thumbimg_tags);
+	my @nextpage_urls = extract_urls(@nextpage_tags);
+
+	my $curr_start = 0;
+	if ($currpage_url =~ m/start=(\d+)/) {
+	    $curr_start = $1;
+	}
+
+	my $pot_url;
+	foreach $pot_url (@nextpage_urls) {
+	
+	    my ($next_start) = ($pot_url =~ m/start=(\d+)/);
+	    if ($next_start>$curr_start) {
+		$nextpage_url = $pot_url;
+		last;
+	    }
+	}
+
+#	print "-" x 40, "\n";
+	my $c = 1;
+	my $p = 1;
+
+	foreach my $tvu (@thumbimg_urls) {
+	    my ($img_url) = ($tvu =~ m/imgurl=([^&]*)/);
+	    $img_url =~ s/%25/%/g;
+
+	    my ($imgref_url) = ($tvu =~ m/imgrefurl=([^&]*)/);
+##	    print STDERR "****imgref_url = $imgref_url\n";
+	    $imgref_url =~ s/%25/%/g;
+	    
+	    my ($img_ext) = ($img_url =~ m/\.(\w+)$/);
+	    $img_ext = lc($img_ext);
+
+	    # remove http:// if there, so later we can explicitly add it in
+	    $img_url =~ s/^http:\/\///; 
+
+	    print "Downloading image url http://$img_url\n";
+	    my $output_fname = "$search_term_dir/img_$c.$img_ext";
+
+	    get_gi_page("http://",$img_url,$output_fname);
+
+	    if (-s $output_fname == 0) {
+		unlink $output_fname;
+	    }
+	    else {
+		my $command = "\"".&util::get_perl_exec()."\" -S gs-magick.pl identify \"$output_fname\" 2>&1";
+		my $result = `$command`;
+		
+		my $status = $?;
+		# need to shift the $? exit code returned by system() by 8 bits and
+		# then convert it to a signed value to work out whether it is indeed > 0
+		#$status >>= 8;
+		#$status = (($status & 0x80) ? -(0x100 - ($status & 0xFF)) : $status);
+		#if($status > 0 ) {
+		if($status != 0 ) { 
+		    print STDERR "**** NOT JPEG: output_fname \n";
+		    unlink $output_fname;
+		} 
+		else {
+		    
+		    my $type =   'unknown';
+		    my $width =  'unknown';
+		    my $height = 'unknown';
+		    
+		    my $image_safe = quotemeta $output_fname;
+		    if ($result =~ /^$image_safe (\w+) (\d+)x(\d+)/) {
+			$type = $1;
+			$width = $2;
+			$height = $3;
+		    }
+		    
+		    my $imagick_cmd = "\"".&util::get_perl_exec()."\" -S gs-magick.pl";
+		    
+		    if (($width ne "unknown") && ($height ne "unknown")) {
+			if (($width>200) || ($height>200)) {
+			    `$imagick_cmd convert \"$output_fname\" -resize 200x200 /tmp/x.jpg`;
+			    `/bin/mv /tmp/x.jpg \"$output_fname\"`;
+			}
+		    }
+		    $c++;
+		}
+	    }
+
+	    push(@imgref_urls,$imgref_url);
+
+	    last if ($c==3); # Only take first 2
+
+	    $p++;
+
+	    if ($p==20) {
+		print STDERR "*** Unable to get enough images after 20 passes\n";
+		last;
+	    }
+
+
+	}
+
+	if (defined $nextpage_url) {
+	    print "Next page URL:\n";
+	    print_tags($nextpage_url);
+	}
+#	print "-" x 40, "\n";
+    }
+
+    return ($nextpage_url, \@imgref_urls);
+}
+
+sub make_search_term_safe
+{
+    my ($search_terms) = @_;
+
+    my $search_term_safe = join("+",@$search_terms);
+    $search_term_safe =~ s/\"/%22/g;
+    $search_term_safe =~ s/ /+/g;
+
+    return $search_term_safe;
+}
+
+sub gi_query_url
+{
+    my ($search_term) = @_;
+
+    my $search_term_safe = make_search_term_safe($search_term);
+
+    my $nextpage_url 
+	= "/images?as_filetype=jpg&imgc=color\&ie=UTF-8\&oe=UTF-8\&hl=en\&btnG=Google+Search";
+    $nextpage_url .= "\&q=$search_term_safe";
+
+    return $nextpage_url;
+}
+
+sub gi_url_base
+{
+    return "http://images.google.com";
+}
+
+sub giget
+{
+    my ($search_terms,$output_dir) = @_;
+    my $imgref_urls = [];
+
+    if (!-e $output_dir) {
+	mkdir($output_dir);
+    
+    }
+	
+    print STDERR "Searching Google Images for: ", join(", ",@$search_terms), "\n";
+
+    my $gi_base = gi_url_base();
+    my $nextpage_url = gi_query_url($search_terms);
+    
+    my $respage_fname = "$output_dir/respage1.html";
+    get_gi_page($gi_base,$nextpage_url,$respage_fname);
+    
+    ($nextpage_url, $imgref_urls) 
+	= parse_gi_search_page($gi_base,$output_dir,
+			       $respage_fname,$nextpage_url);
+#    else {
+#	print STDERR "  Images already mirrored\n";
+#    }
+
+    print STDERR "-" x 40, "\n";
+
+    return $imgref_urls;
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/gsprintf.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/gsprintf.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/gsprintf.pm	(revision 24799)
@@ -0,0 +1,312 @@
+###########################################################################
+#
+# gsprintf.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+use strict;
+no strict 'refs';
+
+package gsprintf;
+require Exporter;
+@gsprintf::ISA=qw(Exporter);
+
+use unicode;
+use util;
+
+use Cwd;
+
+@gsprintf::EXPORT_OK = qw(gsprintf); # functions we can export into namespace
+
+
+# Language-specific resource bundle
+my %specialresourcebundle = ();
+our $specialoutputencoding; # our, so that it can be changed outside.
+
+# Default resource bundle
+my %defaultresourcebundle;
+my $defaultoutputencoding;
+
+# English resource bundle
+my %englishresourcebundle;
+my $englishoutputencoding;
+
+# Ignore the OutputEncoding strings in the resource bundles and output all text in UTF-8
+my $outputstringsinUTF8 = 0;
+
+
+sub gsprintf
+{
+    my ($handle, $text_string, @text_arguments) = @_;
+
+    # Return unless the required arguments were supplied
+    return unless (defined($handle) && defined($text_string));
+    
+    # Look up all the strings in the dictionary
+    $text_string =~ s/(\{[^\}]+\})/&lookup_string($1)/eg;
+
+    # Resolve the string arguments using sprintf, then write out to the handle
+    print $handle sprintf($text_string, @text_arguments);
+}
+
+
+sub lookup_string
+{
+    my ($stringkey) = @_;
+    return "" unless defined $stringkey;
+    # Try the language-specific resource bundle first
+    my $utf8string = $specialresourcebundle{$stringkey};
+    my $outputencoding = $specialoutputencoding;
+
+    # Try the default resource bundle next
+    if (!defined($utf8string)) {
+	# Load the default resource bundle if it is not already loaded
+	&load_default_resource_bundle() if (!%defaultresourcebundle);
+	
+	$utf8string = $defaultresourcebundle{$stringkey};
+	$outputencoding = $defaultoutputencoding;
+    }
+    
+    # Try the English resource bundle last
+    if (!defined($utf8string)) {
+	# Load the English resource bundle if it is not already loaded
+	&load_english_resource_bundle() if (!%englishresourcebundle);
+	
+	$utf8string = $englishresourcebundle{$stringkey};
+	$outputencoding = $englishoutputencoding;
+    }
+    
+    # No matching string was found, so just return the key
+    if (!defined($utf8string)) {
+	return $stringkey;
+    }
+    
+    # Return the string matching the key
+    return $utf8string if (!defined($outputencoding) || $outputstringsinUTF8
+			   || $outputencoding eq "utf8");
+    
+    # If an 8-bit output encoding has been defined, encode the string appropriately
+    my $encoded=unicode::unicode2singlebyte(&unicode::utf82unicode($utf8string), $outputencoding);
+    
+    # If we successfully encoded it, return it
+    if ($encoded) { return $encoded }
+    
+    # Otherwise, we can't convert to the requested encoding. return the utf8?
+    $specialoutputencoding='utf8';
+    return $utf8string;
+}
+
+
+sub load_language_specific_resource_bundle
+{
+    my $language = shift(@_);
+    
+    # Read the specified resource bundle
+    my $resourcebundlename = "strings_" . $language . ".properties";
+    
+    %specialresourcebundle 
+	= &read_resource_bundle_and_extensions($ENV{'GSDLHOME'},"perllib",$resourcebundlename);
+    return if (!%specialresourcebundle);
+    
+    # Read the output encoding to use from the resource bundle
+    if ($ENV{'GSDLOS'} =~ /windows/) {
+	$specialoutputencoding = $specialresourcebundle{"{OutputEncoding.windows}"};
+    }
+    else {
+	# see if there is an encoding set in the appropriate locale env var
+	
+	foreach my $envvar ('LC_ALL', 'LANG') {
+	    if (!exists $ENV{$envvar}) { next }
+	    my $locale=$ENV{$envvar};
+	    if ($locale !~ /^\w+\.(.+)$/) { next }
+	    my $enc=lc($1);
+	    $enc =~ s/-/_/g;
+	    if ($enc eq 'utf_8') { $enc='utf8' } # normalise to this name
+	    $specialoutputencoding = $enc;
+	    return;
+	}
+	$specialoutputencoding = $specialresourcebundle{"{OutputEncoding.unix}"};
+    }
+}
+
+
+sub load_default_resource_bundle
+{
+    # Read the default resource bundle
+    my $resourcebundlename = "strings.properties";
+
+    %defaultresourcebundle = &read_resource_bundle_and_extensions($ENV{'GSDLHOME'},"perllib",$resourcebundlename);
+
+    if (!%defaultresourcebundle) {
+        # $! will still have the error value for the last failed syscall
+        print STDERR "$! $resourcebundlename\n";
+	# set something so we don't bother trying to load it again
+	$defaultresourcebundle{0}=undef; 
+        return;
+    }
+    
+    # Read the output encoding to use from the resource bundle
+    if ($ENV{'GSDLOS'} =~ /windows/) {
+	$defaultoutputencoding = $defaultresourcebundle{"{OutputEncoding.windows}"};
+    }
+    else {
+	$defaultoutputencoding = $defaultresourcebundle{"{OutputEncoding.unix}"};
+    }
+}
+
+
+sub load_english_resource_bundle
+{
+    # Ensure the English resource bundle hasn't already been loaded
+    if (%specialresourcebundle && $specialresourcebundle{"{Language.code}"} eq "en") {
+	%englishresourcebundle = %specialresourcebundle;
+	$englishoutputencoding = $specialoutputencoding;
+    }
+    
+    if ($defaultresourcebundle{"{Language.code}"} &&
+        $defaultresourcebundle{"{Language.code}"} eq "en") {
+	%englishresourcebundle = %defaultresourcebundle;
+	$englishoutputencoding = $defaultoutputencoding;
+    }
+    
+    # Read the English resource bundle
+    my $resourcebundlename = "strings_en.properties";
+
+    %englishresourcebundle 
+	= &read_resource_bundle_and_extensions($ENV{'GSDLHOME'},"perllib",$resourcebundlename);
+    return if (!%englishresourcebundle);
+    
+    # Read the output encoding to use from the resource bundle
+    if ($ENV{'GSDLOS'} =~ /windows/) {
+	$englishoutputencoding = $englishresourcebundle{"{OutputEncoding.windows}"};
+    }
+    else {
+	$englishoutputencoding = $englishresourcebundle{"{OutputEncoding.unix}"};
+    }
+}
+
+
+sub read_resource_bundle_and_extensions
+{
+    my ($bundle_base,$primary_dir,$resourcename) = @_;
+
+    my $primary_resourcebundlefile 
+	= &util::filename_cat($bundle_base,$primary_dir,$resourcename);
+
+    my $resourcebundle = read_resource_bundle($primary_resourcebundlefile);
+    return if (!defined $resourcebundle);
+
+    if (defined $ENV{'GSDLEXTS'}) {
+	my @extensions = split(/:/,$ENV{'GSDLEXTS'});
+	foreach my $e (@extensions) {	
+	    my $ext_base
+		= &util::filename_cat($bundle_base,"ext",$e);
+	    
+	    my $ext_resourcebundlefile 
+		= &util::filename_cat($ext_base,$primary_dir,$resourcename);
+	    
+	    # can ignore return value (will be same reference to $resourcebundle)
+	    read_resource_bundle($ext_resourcebundlefile,$resourcebundle);
+	}
+    }
+    if (defined $ENV{'GSDL3EXTS'}) {
+	my @extensions = split(/:/,$ENV{'GSDL3EXTS'});
+	foreach my $e (@extensions) {	
+	    my $ext_base
+		= &util::filename_cat($ENV{'GSDL3SRCHOME'},"ext",$e);
+	    
+	    my $ext_resourcebundlefile 
+		= &util::filename_cat($ext_base,$primary_dir,$resourcename);
+	    
+	    # can ignore return value (will be same reference to $resourcebundle)
+	    read_resource_bundle($ext_resourcebundlefile,$resourcebundle);
+	}
+    }
+    
+    return %$resourcebundle;
+}
+
+
+sub read_resource_bundle
+{
+    my ($resourcebundlefilepath,$resourcebundle) = @_;
+
+    if (!open(RESOURCE_BUNDLE, "<$resourcebundlefilepath")) {
+	# When called for the first time (primary resource), $resourcebundle
+	# is not defined (=undef). If the file does not exist, then we return
+	# this 'undef' to signal it was not found
+	# For an extension resource bundle, if it does not exist this
+	# is not so serious (in fact quite likely) => return what we 
+	# have built up so far
+	
+	return $resourcebundle;
+    }
+
+    if (!defined $resourcebundle) {	
+	# resource files exists, so exect some content to be stored
+	$resourcebundle = {};
+    }
+    
+    # Load this resource bundle
+    my @resourcebundlelines = <RESOURCE_BUNDLE>;
+    close(RESOURCE_BUNDLE);
+
+    # Parse the resource bundle
+
+    foreach my $line (@resourcebundlelines) {
+        # Remove any trailing whitespace
+        $line =~ s/(\s*)$//;
+
+        # Ignore comments and empty lines
+        if ($line !~ /^\#/ && $line ne "") {
+            # Parse key (everything up to the first colon)
+            if ($line =~ m/^([^:]+):(.+)$/) {
+                my $linekey = "{" . $1 . "}";
+                my $linetext = $2;
+                $linetext =~ s/(\s*)\#\s+Updated\s+(\d?\d-\D\D\D-\d\d\d\d).*$//i;
+
+                # Map key to text
+                $resourcebundle->{$linekey} = $linetext;
+            }
+        }
+    }
+
+    return $resourcebundle;
+}
+
+
+sub output_strings_in_UTF8
+{
+    $outputstringsinUTF8 = 1;
+}
+
+
+sub debug_unicode_string
+{
+    join("",
+     map { $_ > 255 ?                      # if wide character...
+           sprintf("\\x{%04X}", $_) :  # \x{...}
+           chr($_)          
+           } unpack("U*", $_[0]));         # unpack Unicode characters
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/inexport.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/inexport.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/inexport.pm	(revision 24799)
@@ -0,0 +1,1311 @@
+###########################################################################
+#
+# inexport.pm -- useful class to support import.pl and export.pl
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package inexport;
+
+use strict;
+
+no strict 'refs'; # allow filehandles to be variables and vice versa
+no strict 'subs'; # allow barewords (eg STDERR) as function arguments
+
+use arcinfo;
+use colcfg;
+use dbutil;
+use doc;
+use plugin;
+use plugout;
+use manifest;
+use inexport;
+use util;
+use scriptutil;
+use FileHandle;
+use gsprintf 'gsprintf';
+use printusage;
+use parse2;
+
+use File::Basename;
+
+sub new 
+{
+    my $class = shift (@_);
+    my ($mode,$argv,$options,$opt_listall_options) = @_;
+
+    my $self = { 'xml' => 0, 'mode' => $mode };
+
+    # general options available to all plugins
+    my $arguments = $options->{'args'};
+    my $intArgLeftinAfterParsing = parse2::parse($argv,$arguments,$self,"allow_extra_options");
+    # Parse returns -1 if something has gone wrong
+    if ($intArgLeftinAfterParsing == -1)
+    {
+	&PrintUsage::print_txt_usage($options, "{import.params}");
+	die "\n";
+    }
+    
+    my $language = $self->{'language'};
+    # If $language has been specified, load the appropriate resource bundle
+    # (Otherwise, the default resource bundle will be loaded automatically)
+    if ($language && $language =~ /\S/) {
+	&gsprintf::load_language_specific_resource_bundle($language);
+    }
+
+    if ($self->{'listall'}) {
+	if ($self->{'xml'}) {
+	    &PrintUsage::print_xml_usage($opt_listall_options);
+	}
+	else
+	{
+	    &PrintUsage::print_txt_usage($opt_listall_options,"{export.params}");
+	}
+	die "\n";
+    }
+
+
+    if ($self->{'xml'}) {
+        &PrintUsage::print_xml_usage($options);
+	print "\n";
+	return bless $self, $class;
+    }
+
+    if ($self->{'gli'}) { # the gli wants strings to be in UTF-8
+	&gsprintf::output_strings_in_UTF8; 
+    }
+    
+    # now check that we had exactly one leftover arg, which should be 
+    # the collection name. We don't want to do this earlier, cos 
+    # -xml arg doesn't need a collection name
+    # Or if the user specified -h, then we output the usage also
+
+    if ($intArgLeftinAfterParsing != 1 || (@$argv && $argv->[0] =~ /^\-+h/))
+    {
+	&PrintUsage::print_txt_usage($options, "{import.params}");
+	die "\n";
+    }
+
+    $self->{'close_out'} = 0;
+    my $out = $self->{'out'};
+    if ($out !~ /^(STDERR|STDOUT)$/i) {
+	open (OUT, ">$out") ||
+	    (&gsprintf(STDERR, "{common.cannot_open_output_file}: $!\n", $out) && die);
+	$out = 'inexport::OUT';
+	$self->{'close_out'} = 1;
+    }
+    $out->autoflush(1);
+    $self->{'out'} = $out;
+
+    # @ARGV should be only one item, the name of the collection
+    $self->{'collection'} = shift @$argv;
+
+    if ((defined $self->{'jobs'}) && ($self->{'jobs'}>1)) {
+	require ParallelInexport;
+    }
+
+    return bless $self, $class;
+}
+
+# Simplified version of the contstructor for use with CGI scripts
+sub newCGI 
+{
+    my $class = shift (@_);
+    my ($mode,$collect,$gsdl_cgi,$opt_site) = @_;
+
+    my $self = { 'xml' => 0, 'mode' => $mode };
+
+    $self->{'out'} = STDERR;
+    
+	if (defined $gsdl_cgi) {
+		$self->{'site'} = $opt_site;
+		my $collect_dir = $gsdl_cgi->get_collection_dir($opt_site);
+		$self->{'collectdir'} = $collect_dir;
+	}
+	else {	
+		$self->{'site'} = "";
+		$self->{'collectdir'} = &util::filename_cat($ENV{'GSDLHOME'},"collect");
+	}
+    $self->{'faillog'} = "";
+   
+    $self->{'collection'} = $collect;
+
+    return bless $self, $class;
+}
+sub get_collection
+{
+    my $self = shift @_;
+    
+    return $self->{'collection'};
+}
+
+
+sub read_collection_cfg
+{
+    my $self = shift @_;
+    my ($collection,$options) = @_;
+
+    my $collectdir = $self->{'collectdir'};
+    my $site       = $self->{'site'};
+    my $out        = $self->{'out'};
+	 
+    if (($collection = &colcfg::use_collection($site, $collection, $collectdir)) eq "") {
+	&PrintUsage::print_txt_usage($options, "{import.params}");
+	die "\n";
+    }
+
+    # add collection's perllib dir  into include path in 
+    # case we have collection specific modules
+    my $collection_perllib_path = $ENV{'GSDLCOLLECTDIR'} . '/perllib';
+    my $inc_paths = join(':', @INC);
+    if ($inc_paths !~ /$collection_perllib_path/)
+    {
+      unshift (@INC, $collection_perllib_path); # [jmt12]
+    }
+
+    # check that we can open the faillog
+    my $faillog = $self->{'faillog'};
+    if ($faillog eq "") {
+	$faillog = &util::filename_cat($ENV{'GSDLCOLLECTDIR'}, "etc", "fail.log");
+    }
+    open (FAILLOG, ">$faillog") ||
+	(&gsprintf(STDERR, "{import.cannot_open_fail_log}\n", $faillog) && die);
+
+    
+    my $faillogname = $faillog;
+    $faillog = 'inexport::FAILLOG';
+    $faillog->autoflush(1);
+    $self->{'faillog'} = $faillog;
+    $self->{'faillogname'} = $faillogname;
+
+    # Read in the collection configuration file.
+    my ($config_filename, $gs_mode) = &colcfg::get_collect_cfg_name($out);
+    my $collectcfg = &colcfg::read_collection_cfg ($config_filename, $gs_mode);
+
+    return ($config_filename,$collectcfg);
+}
+
+sub set_collection_options
+{
+    my $self = shift @_;
+    my ($collectcfg) = @_;
+
+    my $inexport_mode = $self->{'mode'};
+
+    my $verbosity  = $self->{'verbosity'};
+    my $debug      = $self->{'debug'};
+    my $importdir  = $self->{'importdir'};
+    my $archivedir = $self->{'archivedir'} || $self->{'exportdir'} || "";
+    my $out        = $self->{'out'};
+
+    # If the infodbtype value wasn't defined in the collect.cfg file, use the default
+    if (!defined($collectcfg->{'infodbtype'}))
+    {
+      $collectcfg->{'infodbtype'} = &dbutil::get_default_infodb_type();
+    }
+    if ($collectcfg->{'infodbtype'} eq "gdbm-txtgz") {
+	# we can't use the text version for archives dbs.
+	$collectcfg->{'infodbtype'} = "gdbm";
+    }
+    if (defined $collectcfg->{'importdir'} && $importdir eq "") {
+	$importdir = $collectcfg->{'importdir'};
+    }
+    if (defined $collectcfg->{'archivedir'} && $archivedir eq "") {
+	$archivedir = $collectcfg->{'archivedir'};
+    }
+    # fill in the default import and archives directories if none
+    # were supplied, turn all \ into / and remove trailing /
+    $importdir = &util::filename_cat ($ENV{'GSDLCOLLECTDIR'}, "import") if $importdir eq "";
+    $importdir =~ s/[\\\/]+/\//g;
+    $importdir =~ s/\/$//;
+    if (!-e $importdir) {
+	&gsprintf($out, "{import.no_import_dir}\n\n", $importdir);
+	die "\n";
+    }
+    $self->{'importdir'} = $importdir;
+
+    if ($archivedir eq "") {
+	if ($inexport_mode eq "import") {
+	    $archivedir = &util::filename_cat ($ENV{'GSDLCOLLECTDIR'}, "archives");
+	}
+	elsif ($inexport_mode eq "export") {
+	    $archivedir = &util::filename_cat ($ENV{'GSDLCOLLECTDIR'}, "export");
+	}
+	else {
+	    print STDERR "Warning: Unrecognized import/export mode '$inexport_mode'\n";
+	    print STDERR "         Defaulting to 'archives' for file output\n";
+	    $archivedir = &util::filename_cat ($ENV{'GSDLCOLLECTDIR'}, "archives");
+	}
+    }
+
+    $archivedir =~ s/[\\\/]+/\//g;
+    $archivedir =~ s/\/$//;
+    $self->{'archivedir'} = $archivedir;
+
+    if ($verbosity !~ /\d+/) {
+	if (defined $collectcfg->{'verbosity'} && $collectcfg->{'verbosity'} =~ /\d+/) {
+	    $verbosity = $collectcfg->{'verbosity'};
+	} else {
+	    $verbosity = 2; # the default
+	}
+    }
+    $self->{'verbosity'} = $verbosity;
+
+    if (defined $collectcfg->{'manifest'} && $self->{'manifest'} eq "") {
+	$self->{'manifest'} = $collectcfg->{'manifest'};
+    }
+
+    if (defined $collectcfg->{'gzip'} && !$self->{'gzip'}) {
+	if ($collectcfg->{'gzip'} =~ /^true$/i) {
+	    $self->{'gzip'} = 1;
+	}
+    }
+
+    if ($self->{'maxdocs'} !~ /\-?\d+/) {
+	if (defined $collectcfg->{'maxdocs'} && $collectcfg->{'maxdocs'} =~ /\-?\d+/) {
+	    $self->{'maxdocs'} = $collectcfg->{'maxdocs'};
+	} else {
+	    $self->{'maxdocs'} = -1; # the default
+	}
+    }
+
+    if ((defined $self->{'groupsize'}) && ($self->{'groupsize'} == 1)) {
+	if (defined $collectcfg->{'groupsize'} && $collectcfg->{'groupsize'} =~ /\d+/) {
+	    $self->{'groupsize'} = $collectcfg->{'groupsize'};
+	}
+    }
+
+    if (!defined $self->{'OIDtype'} 
+	|| ($self->{'OIDtype'} !~ /^(hash|incremental|assigned|dirname)$/ )) {
+	if (defined $collectcfg->{'OIDtype'} 
+	    && $collectcfg->{'OIDtype'} =~ /^(hash|incremental|assigned|dirname)$/) {
+	    $self->{'OIDtype'} = $collectcfg->{'OIDtype'};
+	} else {
+	    $self->{'OIDtype'} = "hash"; # the default
+	}
+    }
+
+    if ((!defined $self->{'OIDmetadata'}) || ($self->{'OIDmetadata'} eq "")) {
+	if (defined $collectcfg->{'OIDmetadata'}) {
+	    $self->{'OIDmetadata'} = $collectcfg->{'OIDmetadata'};
+	} else {
+	    $self->{'OIDmetadata'} = "dc.Identifier"; # the default
+	}
+    }
+
+    my $sortmeta = $self->{'sortmeta'};
+    if (defined $collectcfg->{'sortmeta'} && (!defined $sortmeta || $sortmeta eq "")) {
+	$sortmeta = $collectcfg->{'sortmeta'};
+    }
+    # sortmeta cannot be used with group size
+    $sortmeta = undef unless defined $sortmeta && $sortmeta =~ /\S/;
+    if (defined $sortmeta && $self->{'groupsize'} > 1) {
+	&gsprintf($out, "{import.cannot_sort}\n\n");
+	$sortmeta = undef;
+    }
+    $self->{'sortmeta'} = $sortmeta;
+
+    if (defined $collectcfg->{'removeprefix'} && $self->{'removeprefix'} eq "") {
+	$self->{'removeprefix'} = $collectcfg->{'removeprefix'};
+    }
+    
+    if (defined $collectcfg->{'removesuffix'} && $self->{'removesuffix'} eq "") {
+	$self->{'removesuffix'} = $collectcfg->{'removesuffix'};
+    }
+    if (defined $collectcfg->{'debug'} && $collectcfg->{'debug'} =~ /^true$/i) {
+	$self->{'debug'} = 1;
+    }
+    if (defined $collectcfg->{'gli'} && $collectcfg->{'gli'} =~ /^true$/i) {
+	$self->{'gli'} = 1;
+    }
+    $self->{'gli'} = 0 unless defined $self->{'gli'};
+       
+    # check keepold and removeold
+    my $checkdir = ($inexport_mode eq "import") ? "archives" : "export";
+
+    my ($removeold, $keepold, $incremental, $incremental_mode) 
+	= &scriptutil::check_removeold_and_keepold($self->{'removeold'}, $self->{'keepold'}, 
+						   $self->{'incremental'}, $checkdir, 
+						   $collectcfg);
+
+    $self->{'removeold'}        = $removeold;
+    $self->{'keepold'}          = $keepold;
+    $self->{'incremental'}      = $incremental;
+    $self->{'incremental_mode'} = $incremental_mode;
+
+    # Since this wasted my morning, let's at least warn a user that manifest
+    # files now *only* work if keepold is set. [jmt12]
+    if ($self->{'manifest'} && !$self->{'keepold'})
+    {
+      print STDERR "Warning: -manifest flag should not be specified without also setting -keepold or -incremental. Ignoring.\n";
+    }
+}
+
+sub process_files
+{
+    my $self = shift @_;
+    my ($config_filename,$collectcfg) = @_;
+
+    my $inexport_mode = $self->{'mode'};
+
+    my $verbosity   = $self->{'verbosity'};
+    my $debug       = $self->{'debug'};
+
+    my $importdir   = $self->{'importdir'};
+    my $archivedir = $self->{'archivedir'} || $self->{'exportdir'};
+
+    my $incremental = $self->{'incremental'};
+    my $incremental_mode = $self->{'incremental_mode'};
+
+    my $removeold   = $self->{'removeold'};
+    my $keepold     = $self->{'keepold'};
+
+    my $saveas      = $self->{'saveas'};
+    my $OIDtype     = $self->{'OIDtype'};
+    my $OIDmetadata = $self->{'OIDmetadata'};
+
+    my $out         = $self->{'out'};
+    my $faillog     = $self->{'faillog'};
+
+    my $maxdocs     = $self->{'maxdocs'};
+    my $gzip        = $self->{'gzip'};
+    my $groupsize   = $self->{'groupsize'};
+    my $sortmeta    = $self->{'sortmeta'};
+
+    my $removeprefix = $self->{'removeprefix'};
+    my $removesuffix = $self->{'removesuffix'};
+
+    my $gli          = $self->{'gli'};
+
+    my $jobs         = $self->{'jobs'};
+    my $epoch        = $self->{'epoch'};
+
+    # related to export
+    my $xsltfile         = $self->{'xsltfile'};
+    my $group_marc       = $self->{'group_marc'};
+    my $mapping_file     = $self->{'mapping_file'};
+    my $xslt_mets        = $self->{'xslt_mets'};
+    my $xslt_txt         = $self->{'xslt_txt'};
+    my $fedora_namespace = $self->{'fedora_namespace'};
+    my $metadata_prefix  = $self->{'metadata_prefix'};
+
+    if ($inexport_mode eq "import") {
+	print STDERR "<Import>\n" if $gli;
+    }
+    else {
+	print STDERR "<export>\n" if $gli;
+    }
+
+    my $manifest_lookup = new manifest($collectcfg->{'infodbtype'},$archivedir);
+    if ($self->{'manifest'} ne "") {
+	my $manifest_filename = $self->{'manifest'};
+
+	if (!&util::filename_is_absolute($manifest_filename)) {
+	    $manifest_filename = &util::filename_cat ($ENV{'GSDLCOLLECTDIR'}, $manifest_filename);
+	}
+
+	$self->{'manifest'} =~ s/[\\\/]+/\//g;
+	$self->{'manifest'} =~ s/\/$//;
+
+	$manifest_lookup->parse($manifest_filename);
+    }
+
+    my $manifest = $self->{'manifest'};
+
+    # load all the plugins
+    my $plugins = [];
+    if (defined $collectcfg->{'plugin'}) {
+	$plugins = $collectcfg->{'plugin'};
+    }
+
+    my $plugin_incr_mode = $incremental_mode;
+    if ($manifest ne "") {
+	# if we have a manifest file, then we pretend we are fully incremental for plugins
+	$plugin_incr_mode = "all";
+    }
+    #some global options for the plugins
+    my @global_opts = ();
+
+    my $pluginfo = &plugin::load_plugins ($plugins, $verbosity, $out, $faillog, \@global_opts, $plugin_incr_mode);
+    if (scalar(@$pluginfo) == 0) {
+	&gsprintf($out, "{import.no_plugins_loaded}\n");
+	die "\n";
+    }
+
+    # remove the old contents of the archives directory (and tmp
+    # directory) if needed
+
+    if ($removeold) {
+	if (-e $archivedir) {
+	    &gsprintf($out, "{import.removing_archives}\n");
+	    &util::rm_r ($archivedir);
+	}
+	my $tmpdir = &util::filename_cat ($ENV{'GSDLCOLLECTDIR'}, "tmp");
+	$tmpdir =~ s/[\\\/]+/\//g;
+	$tmpdir =~ s/\/$//;
+	if (-e $tmpdir) {
+	    &gsprintf($out, "{import.removing_tmpdir}\n");
+	    &util::rm_r ($tmpdir);
+	}
+    }
+
+    # create the archives dir if needed
+    &util::mk_all_dir($archivedir);
+
+    # read the archive information file
+
+    # BACKWARDS COMPATIBILITY: Just in case there are old .ldb/.bdb files (won't do anything for other infodbtypes)
+    &util::rename_ldb_or_bdb_file(&util::filename_cat($archivedir, "archiveinf-doc"));
+    &util::rename_ldb_or_bdb_file(&util::filename_cat($archivedir, "archiveinf-src"));
+
+    # Warning! Black magic follows. When the following functions are called on
+    # the GDBMServer class they will actually prompt the running of the Server
+    # and attach themselves as a listener (even though they don't do anything)
+    # This is done so that, in parallel importing, the server will persist
+    # until the top level import.pl (which will be the first this that calls
+    # this function) completes.
+    my $arcinfo_doc_filename = &dbutil::get_infodb_file_path($collectcfg->{'infodbtype'}, "archiveinf-doc", $archivedir, 1);
+    my $arcinfo_src_filename = &dbutil::get_infodb_file_path($collectcfg->{'infodbtype'}, "archiveinf-src", $archivedir, 1);
+
+    my $archive_info = new arcinfo ($collectcfg->{'infodbtype'});
+    $archive_info->load_info ($arcinfo_doc_filename);
+
+    if ($manifest eq "") {
+	# Load in list of files in import folder from last import (if present)
+	$archive_info->load_prev_import_filelist ($arcinfo_src_filename);
+    }
+
+    ####Use Plugout####
+    my $plugout; 
+
+    if ($inexport_mode eq "import") {
+	if (defined $collectcfg->{'plugout'}) {
+	    # If a plugout was specified in the collect.cfg file, assume it is sensible
+	    # We can't check the name because it could be anything, if it is a custom plugout
+	    $plugout = $collectcfg->{'plugout'};
+	}
+	else{
+	    if ($saveas !~ /^(GreenstoneXML|GreenstoneMETS)$/) {
+		push @$plugout,"GreenstoneXMLPlugout";
+	    }
+	    else{
+		push @$plugout,$saveas."Plugout";
+	    }
+	}
+    }
+    else {
+	if (defined $collectcfg->{'plugout'} && $collectcfg->{'plugout'} =~ /^(.*METS|DSpace|MARCXML)Plugout/) {
+	    $plugout = $collectcfg->{'plugout'};
+	}
+	else{
+	    if ($saveas !~ /^(GreenstoneMETS|FedoraMETS|DSpace|MARCXML)$/) {
+		push @$plugout,"GreenstoneMETSPlugout";
+	    }
+	    else{
+		push @$plugout,$saveas."Plugout";
+	    }
+	}
+    }
+    
+    my $plugout_name = $plugout->[0];
+
+    push @$plugout,("-output_info",$archive_info)  if (defined $archive_info); 
+    push @$plugout,("-verbosity",$verbosity)       if (defined $verbosity);
+    push @$plugout,("-debug")                      if ($debug);
+    push @$plugout,("-group_size",$groupsize)      if (defined $groupsize);
+    push @$plugout,("-gzip_output")                if ($gzip);
+    push @$plugout,("-output_handle",$out)         if (defined $out);
+
+    push @$plugout,("-xslt_file",$xsltfile)        if (defined $xsltfile && $xsltfile ne "");
+
+    if ($plugout_name =~ m/^MARCXMLPlugout$/) {
+	push @$plugout,("-group")                      if ($group_marc);
+	push @$plugout,("-mapping_file",$mapping_file) if (defined $mapping_file && $mapping_file ne "");
+    }
+    if ($plugout_name =~ m/^.*METSPlugout$/) {
+	push @$plugout,("-xslt_mets",$xslt_mets)       if (defined $xslt_mets && $xslt_mets ne "");
+	push @$plugout,("-xslt_txt",$xslt_txt)         if (defined $xslt_txt && $xslt_txt ne "");
+    }
+
+    if ($plugout_name eq "FedoraMETSPlugout") {
+	push @$plugout,("-fedora_namespace",$fedora_namespace) if (defined $fedora_namespace && $fedora_namespace ne "");
+    }
+	
+	if ($plugout_name eq "DSpacePlugout") {
+	push @$plugout,("-metadata_prefix",$metadata_prefix) if (defined $metadata_prefix && $metadata_prefix ne "");	
+	}
+
+    my $processor = &plugout::load_plugout($plugout);                        
+    $processor->setoutputdir ($archivedir);
+    $processor->set_sortmeta ($sortmeta, $removeprefix, $removesuffix) if defined $sortmeta;
+    $processor->set_OIDtype ($OIDtype, $OIDmetadata);
+    
+    &plugin::begin($pluginfo, $importdir, $processor, $maxdocs, $gli);
+    
+    if ($removeold) {
+    	# occasionally, plugins may want to do something on remove
+    	# old, eg pharos image indexing
+	&plugin::remove_all($pluginfo, $importdir, $processor, $maxdocs, $gli);
+    }
+
+    # process the import directory
+    my $block_hash = {};
+    $block_hash->{'new_files'} = {};
+    $block_hash->{'reindex_files'} = {};
+    # All of these are set somewhere else, so it's kinda nice to define them
+    # here. [jmt12]
+    $block_hash->{'all_files'} = {};
+    $block_hash->{'deleted_files'} = {};
+    $block_hash->{'file_blocks'} = {};
+    $block_hash->{'metadata_files'} = {};
+    $block_hash->{'shared_fileroot'} = '';
+    # My new flag so we can tell we had a manifest way down in the plugins
+    # [jmt12]
+    $block_hash->{'manifest'} = 'false';
+    my $metadata = {};
+    
+    # global blocking pass may set up some metadata
+    # - when we have a manifest file we don't do this -unless- the collection
+    #   configuration indicates this collection contains complex (inherited)
+    #   metadata. [jmt12]
+    if ($manifest eq '' || (defined $collectcfg->{'complexmeta'} && $collectcfg->{'complexmeta'} eq 'true'))
+    {
+      &plugin::file_block_read($pluginfo, $importdir, "", $block_hash, $metadata, $gli);
+    }
+    else
+    {
+      print "Skipping global file scan due to manifest and complexmeta configuration\n";
+    }
+    
+    if ($manifest ne "") {
+
+      $block_hash->{'manifest'} = 'true';
+
+	# 
+	# 1. Process delete files first
+	# 
+	my @deleted_files = keys %{$manifest_lookup->{'delete'}};
+	my @full_deleted_files = ();
+
+	# ensure all filenames are absolute
+	foreach my $df (@deleted_files) {
+	    my $full_df =
+		(&util::filename_is_absolute($df)) 
+		? $df
+		: &util::filename_cat($importdir,$df);
+
+	    if (-d $full_df) {
+		&add_dir_contents_to_list($full_df, \@full_deleted_files);
+	    } else {
+		push(@full_deleted_files,$full_df);
+	    }
+	}
+	
+	&plugin::remove_some($pluginfo, $collectcfg->{'infodbtype'}, $archivedir, \@full_deleted_files);
+	mark_docs_for_deletion($archive_info,{},
+			       \@full_deleted_files,
+			       $archivedir, $verbosity, "delete");
+
+
+	# 
+	# 2. Now files for reindexing
+	# 
+
+	my @reindex_files = keys %{$manifest_lookup->{'reindex'}};
+	my @full_reindex_files = ();
+	# ensure all filenames are absolute
+	foreach my $rf (@reindex_files) {	    
+	    my $full_rf =
+		(&util::filename_is_absolute($rf)) 
+		? $rf
+		: &util::filename_cat($importdir,$rf);
+
+	    if (-d $full_rf) {
+		&add_dir_contents_to_list($full_rf, \@full_reindex_files);
+	    } else {
+		push(@full_reindex_files,$full_rf);
+	    }
+	}
+	
+	&plugin::remove_some($pluginfo, $collectcfg->{'infodbtype'}, $archivedir, \@full_reindex_files);
+	mark_docs_for_deletion($archive_info,{},\@full_reindex_files, $archivedir,$verbosity, "reindex");
+
+	# And now to ensure the new version of the file processed by 
+	# appropriate plugin, we need to add it to block_hash reindex list
+	foreach my $full_rf (@full_reindex_files) {
+	    $block_hash->{'reindex_files'}->{$full_rf} = 1;
+	}
+
+
+	# 
+	# 3. Now finally any new files - add to block_hash new_files list
+	# 
+
+	my @new_files = keys %{$manifest_lookup->{'index'}};
+	my @full_new_files = ();
+
+	foreach my $nf (@new_files) {
+	    # ensure filename is absolute
+	    my $full_nf =
+		(&util::filename_is_absolute($nf)) 
+		? $nf
+		: &util::filename_cat($importdir,$nf);
+
+	    if (-d $full_nf) {
+		&add_dir_contents_to_list($full_nf, \@full_new_files);
+	    } else {
+		push(@full_new_files,$full_nf);
+	    }
+	}
+
+	my $arcinfo_src_filename = &dbutil::get_infodb_file_path($collectcfg->{'infodbtype'}, "archiveinf-src", $archivedir);
+      # need to check this file exists before trying to read it. [jmt12]
+      if (-e $arcinfo_src_filename)
+      {
+	my $arcinfodb_map = {};
+	&dbutil::read_infodb_file($collectcfg->{'infodbtype'}, $arcinfo_src_filename, $arcinfodb_map);
+	foreach my $f (@full_new_files) {
+	    # check that we haven't seen it already
+	    if (defined $arcinfodb_map->{$f}) {
+		# TODO make better warning
+		print STDERR "Warning: $f already in src archive, \n";
+	    } else {
+		$block_hash->{'new_files'}->{$f} = 1;
+	    }
+	}
+	undef $arcinfodb_map;
+      }
+      # no existing files - so we can just add all the ones that need adding.
+      # [jmt12]
+      else
+      {
+        foreach my $f (@full_new_files)
+        {
+          $block_hash->{'new_files'}->{$f} = 1;
+        }
+      }
+
+      # If we are not using complex inherited metadata (and thus have skipped
+      # the global file scan) we need to at least scan the directory of the
+      # files being indexed/reindexed. [jmt12]
+      if (!defined $collectcfg->{'complexmeta'} || $collectcfg->{'complexmeta'} ne 'true')
+      {
+        my @all_files_to_import = (keys %{$block_hash->{'reindex_files'}}, keys %{$block_hash->{'new_files'}});
+        foreach my $file_to_import (@all_files_to_import)
+        {
+          my $dir_to_import = $file_to_import;
+          $dir_to_import =~ s/[^\\\/]*$//;
+          # - one day we may need to manually scan this directory for child
+          #   directories and somehow explicitly block them from being
+          #   recursed.
+          if (-d $dir_to_import)
+          {
+            &plugin::file_block_read($pluginfo, $dir_to_import, '', $block_hash, $metadata, $gli);
+          }
+        }
+      }
+    }
+    else {
+	# if incremental, we read through the import folder to see whats changed.
+
+	if ($incremental || $incremental_mode eq "onlyadd") {
+	    prime_doc_oid_count($archivedir);
+
+	    # Can now work out which files were new, already existed, and have
+	    # been deleted
+	    
+	    new_vs_old_import_diff($archive_info,$block_hash,$importdir,
+				   $archivedir,$verbosity,$incremental_mode);
+	    
+	    my @new_files = sort keys %{$block_hash->{'new_files'}};
+	    if (scalar(@new_files>0)) {
+		print STDERR "New files and modified metadata files since last import:\n  ";
+		print STDERR join("\n  ",@new_files), "\n";
+	    }
+
+	    if ($incremental) {
+               # only look for deletions if we are truely incremental
+		my @deleted_files = sort keys %{$block_hash->{'deleted_files'}};
+		# Filter out any in gsdl/tmp area
+		my @filtered_deleted_files = ();
+		my $gsdl_tmp_area = &util::filename_cat($ENV{'GSDLHOME'}, "tmp");
+		my $collect_tmp_area = &util::filename_cat($ENV{'GSDLCOLLECTDIR'}, "tmp");
+		$gsdl_tmp_area = &util::filename_to_regex($gsdl_tmp_area);
+		$collect_tmp_area = &util::filename_to_regex($collect_tmp_area);
+			      
+		foreach my $df (@deleted_files) {
+		    next if ($df =~ m/^$gsdl_tmp_area/);
+		    next if ($df =~ m/^$collect_tmp_area/);
+		    
+		    push(@filtered_deleted_files,$df);
+		}		
+		
+
+		@deleted_files = @filtered_deleted_files;
+		
+		if (scalar(@deleted_files)>0) {
+		    print STDERR "Files deleted since last import:\n  ";
+		    print STDERR join("\n  ",@deleted_files), "\n";
+		
+		
+		    &plugin::remove_some($pluginfo, $collectcfg->{'infodbtype'}, $archivedir, \@deleted_files);
+		    
+		    mark_docs_for_deletion($archive_info,$block_hash,\@deleted_files, $archivedir,$verbosity, "delete");
+		}
+		
+		my @reindex_files = sort keys %{$block_hash->{'reindex_files'}};
+		
+		if (scalar(@reindex_files)>0) {
+		    print STDERR "Files to reindex since last import:\n  ";
+		    print STDERR join("\n  ",@reindex_files), "\n";
+		    &plugin::remove_some($pluginfo, $collectcfg->{'infodbtype'}, $archivedir, \@reindex_files);
+		    mark_docs_for_deletion($archive_info,$block_hash,\@reindex_files, $archivedir,$verbosity, "reindex");
+		}
+				
+	    }	    
+	}
+    }
+
+    # Check for existence of the file that's to contain earliestDateStamp in archivesdir
+    # Do nothing if the file already exists (file exists on incremental build).
+    # If the file doesn't exist, as happens on full build, create it and write out the current datestamp into it
+    # In buildcol, read the file's contents and set the earliestdateStamp in GS2's build.cfg / GS3's buildconfig.xml
+    # In doc.pm have set_oaiLastModified similar to set_lastmodified, and create the doc fields 
+    # oailastmodified and oailastmodifieddate
+    my $earliestDatestampFile = &util::filename_cat($archivedir, "earliestDatestamp");
+    if (!-f $earliestDatestampFile && -d $archivedir) {
+	my $current_time_in_seconds = time; # in seconds
+
+	if(open(FOUT, ">$earliestDatestampFile")) {
+	    # || (&gsprintf(STDERR, "{common.cannot_open}: $!\n", $earliestDatestampFile) && die);
+	    print FOUT $current_time_in_seconds;
+	    close(FOUT);
+	}
+	else {
+	    &gsprintf(STDERR, "{import.cannot_write_earliestdatestamp}\n", $earliestDatestampFile);
+	}
+
+    }
+
+    # now, whichever mode we are in, we can process the entire import folder
+    if ((defined $jobs) && ($jobs > 1))
+    { 
+	# if jobs are set to >1, run in parallel using MPI helper
+	# [hs, 1 july 2010]
+	&ParallelInexport::farm_out_processes($jobs, $epoch, $importdir, $block_hash, 
+					      $self->{'collection'}, $self->{'site'}); 
+    }
+    else
+    {
+	&plugin::read ($pluginfo, $importdir, "", $block_hash, $metadata, $processor, $maxdocs, 0, $gli);
+    }
+    
+    
+    if ($saveas eq "FedoraMETS") {
+	# create collection "doc obj" for Fedora that contains
+	# collection-level metadata
+	
+	my $doc_obj = new doc($config_filename,"nonindexed_doc","none");
+	$doc_obj->set_OID("collection");
+	
+	my $col_name = undef;
+	my $col_meta = $collectcfg->{'collectionmeta'};
+	
+	if (defined $col_meta) {	    
+	    store_collectionmeta($col_meta,"collectionname",$doc_obj); # in GS3 this is a collection's name
+	    store_collectionmeta($col_meta,"collectionextra",$doc_obj); # in GS3 this is a collection's description	    
+	}
+	$processor->process($doc_obj);
+    }
+
+    &plugin::end($pluginfo, $processor);
+
+    &plugin::deinit($pluginfo, $processor);
+
+    # Store the value of OIDCount (used in doc.pm) so it can be
+    # restored correctly to this value on an incremental build
+    store_doc_oid_count($archivedir);
+
+    # write out the archive information file
+    $processor->close_file_output() if (defined $groupsize) && ($groupsize > 1);
+    $processor->close_group_output() if $processor->is_group();
+
+    # for backwards compatability with archvies.inf file
+    if ($arcinfo_doc_filename =~ m/(contents)|(\.inf)$/) {
+	$archive_info->save_info($arcinfo_doc_filename);
+    }
+    else {
+	$archive_info->save_revinfo_db($arcinfo_src_filename);
+    }
+
+    return $pluginfo;
+}
+
+
+sub generate_statistics
+{
+    my $self = shift @_;
+    my ($pluginfo) = @_;
+
+    my $inexport_mode = $self->{'mode'};
+
+    my $statsfile   = $self->{'statsfile'};
+    my $out         = $self->{'out'};
+    my $faillogname = $self->{'faillogname'};
+    my $gli         = $self->{'gli'};
+    my $jobs        = $self->{'jobs'};
+
+    # write out import stats
+
+    if ((!defined $jobs) || ($jobs == 1))
+    {
+	# only output statistics if there are multiple jobs
+	# [hs, 1 july 2010]
+
+	my $close_stats = 0;
+	if ($statsfile !~ /^(STDERR|STDOUT)$/i) {
+	    if (open (STATS, ">$statsfile")) {
+		$statsfile = 'inexport::STATS';
+		$close_stats = 1;
+	    } else {
+		&gsprintf($out, "{import.cannot_open_stats_file}", $statsfile);
+		&gsprintf($out, "{import.stats_backup}\n");
+		$statsfile = 'STDERR';
+	    }
+	}
+	
+	&gsprintf($out, "\n");
+	&gsprintf($out, "*********************************************\n");
+	&gsprintf($out, "{$inexport_mode.complete}\n");
+	&gsprintf($out, "*********************************************\n");
+	
+	&plugin::write_stats($pluginfo, $statsfile, $faillogname, $gli);
+	if ($close_stats) {
+	    close STATS;
+	}
+    }
+
+    close OUT if $self->{'close_out'};
+    close FAILLOG;
+}
+
+
+sub store_collectionmeta
+{
+    my ($collectionmeta,$field,$doc_obj) = @_;
+    
+    my $section = $doc_obj->get_top_section();
+    
+    my $field_hash = $collectionmeta->{$field};
+    
+    foreach my $k (keys %$field_hash)
+    {
+	my $val = $field_hash->{$k};
+	
+	### print STDERR "*** $k = $field_hash->{$k}\n";
+	
+	my $md_label = "ex.$field";
+	
+	
+	if ($k =~ m/^\[l=(.*?)\]$/)
+	{
+	    
+	    my $md_suffix = $1;
+	    $md_label .= "^$md_suffix";
+	}
+	
+	
+	$doc_obj->add_utf8_metadata($section,$md_label, $val);
+	
+	# see collConfigxml.pm: GS2's "collectionextra" is called "description" in GS3,
+	# while "collectionname" in GS2 is called "name" in GS3.
+	# Variable $nameMap variable in collConfigxml.pm maps between GS2 and GS3
+	if (($md_label eq "ex.collectionname^en") || ($md_label eq "ex.collectionname"))
+	{
+	    $doc_obj->add_utf8_metadata($section,"dc.Title", $val);
+	}
+	
+    }
+}
+
+
+sub oid_count_file {
+    my ($archivedir) = @_;
+    return &util::filename_cat ($archivedir, "OIDcount");
+}
+
+
+sub prime_doc_oid_count
+{
+    my ($archivedir) = @_;
+    my $oid_count_filename = &oid_count_file($archivedir);
+
+    if (-e $oid_count_filename) {
+	if (open(OIDIN,"<$oid_count_filename")) {
+	    my $OIDcount = <OIDIN>;
+	    chomp $OIDcount;	    
+	    close(OIDIN);
+
+	    $doc::OIDcount = $OIDcount;	    
+	}
+	else {	    
+	    &gsprintf(STDERR, "{import.cannot_read_OIDcount}\n", $oid_count_filename);
+	}
+    }
+    
+}
+
+sub store_doc_oid_count
+{
+    # Use the file "OIDcount" in the archives directory to record
+    # what value doc.pm got up to
+
+    my ($archivedir) = @_;
+    my $oid_count_filename = &oid_count_file($archivedir);
+
+
+    if (open(OIDOUT,">$oid_count_filename")) {
+	print OIDOUT $doc::OIDcount, "\n";
+	    
+	close(OIDOUT);
+    }
+    else {
+	&gsprintf(STDERR, "{import.cannot_write_OIDcount}\n", $oid_count_filename);
+    }
+}
+
+
+
+sub new_vs_old_import_diff
+{
+    my ($archive_info,$block_hash,$importdir,$archivedir,$verbosity,$incremental_mode) = @_;
+
+    # Get the infodbtype value for this collection from the arcinfo object
+    my $infodbtype = $archive_info->{'infodbtype'};
+
+    # in this method, we want to know if metadata files are modified or not.
+    my $arcinfo_doc_filename = &dbutil::get_infodb_file_path($infodbtype, "archiveinf-doc", $archivedir);
+
+    my $archiveinf_timestamp = -M $arcinfo_doc_filename;
+
+    # First convert all files to absolute form
+    # This is to support the situation where the import folder is not
+    # the default
+    
+    my $prev_all_files = $archive_info->{'prev_import_filelist'};
+    my $full_prev_all_files = {};
+
+    foreach my $prev_file (keys %$prev_all_files) {
+
+	if (!&util::filename_is_absolute($prev_file)) {
+	    my $full_prev_file = &util::filename_cat($ENV{'GSDLCOLLECTDIR'},$prev_file);
+	    $full_prev_all_files->{$full_prev_file} = $prev_file;
+	}
+	else {
+	    $full_prev_all_files->{$prev_file} = $prev_file;
+	}
+    }
+
+
+    # Figure out which are the new files, existing files and so
+    # by implication the files from the previous import that are not
+    # there any more => mark them for deletion
+    foreach my $curr_file (keys %{$block_hash->{'all_files'}}) {
+	
+	my $full_curr_file = $curr_file;
+
+	# entry in 'all_files' is moved to either 'existing_files', 
+	# 'deleted_files', 'new_files', or 'new_or_modified_metadata_files'
+
+	if (!&util::filename_is_absolute($curr_file)) {
+	    # add in import dir to make absolute
+	    $full_curr_file = &util::filename_cat($importdir,$curr_file);
+	}
+
+	# figure out if new file or not
+	if (defined $full_prev_all_files->{$full_curr_file}) {
+	    # delete it so that only files that need deleting are left
+	    delete $full_prev_all_files->{$full_curr_file};
+	    
+	    # had it before. is it a metadata file?
+	    if ($block_hash->{'metadata_files'}->{$full_curr_file}) {
+		
+		# is it modified??
+		if (-M $full_curr_file < $archiveinf_timestamp) {
+		    print STDERR "*** Detected a *modified metadata* file: $full_curr_file\n" if $verbosity >= 2;
+		    # its newer than last build
+		    $block_hash->{'new_or_modified_metadata_files'}->{$full_curr_file} = 1;
+		}
+	    }
+	    else {
+		if ($incremental_mode eq "all") {
+		    
+		    # had it before
+		    $block_hash->{'existing_files'}->{$full_curr_file} = 1;
+		    
+		}
+		else {
+		    # Warning in "onlyadd" mode, but had it before!
+		    print STDERR "Warning: File $full_curr_file previously imported.\n";
+		    print STDERR "         Treating as new file\n";
+		    
+		    $block_hash->{'new_files'}->{$full_curr_file} = 1;
+		    
+		}
+	    }
+	}
+	else {
+	    if ($block_hash->{'metadata_files'}->{$full_curr_file}) {
+		# the new file is the special sort of file greenstone uses
+		# to attach metadata to src documents
+		# i.e metadata.xml 
+		# (but note, the filename used is not constrained in 
+		# Greenstone to always be this)
+
+		print STDERR "*** Detected *new* metadata file: $full_curr_file\n" if $verbosity >= 2;
+		$block_hash->{'new_or_modified_metadata_files'}->{$full_curr_file} = 1;
+	    }
+	    else {
+		$block_hash->{'new_files'}->{$full_curr_file} = 1;
+	    }
+	}
+
+	
+	delete $block_hash->{'all_files'}->{$curr_file};
+    }
+
+
+
+
+    # Deal with complication of new or modified metadata files by forcing
+    # everything from this point down in the file hierarchy to
+    # be freshly imported.  
+    #
+    # This may mean files that have not changed are reindexed, but does
+    # guarantee by the end of processing all new metadata is correctly
+    # associated with the relevant document(s).
+
+    foreach my $new_mdf (keys %{$block_hash->{'new_or_modified_metadata_files'}}) {
+	my ($fileroot,$situated_dir,$ext) = fileparse($new_mdf, "\\.[^\\.]+\$");
+
+	$situated_dir =~ s/[\\\/]+$//; # remove tailing slashes
+	$situated_dir =~ s/\\/\\\\/g;  # need to protect windows slash \ in regular expression
+	
+	# Go through existing_files, and mark anything that is contained
+	# within 'situated_dir' to be reindexed (in case some of the metadata
+	# attaches to one of these files)
+
+	my $reindex_files = [];
+
+	foreach my $existing_f (keys %{$block_hash->{'existing_files'}}) {
+	
+	    if ($existing_f =~ m/^$situated_dir/) {
+
+		print STDERR "**** Existing file $existing_f\nis located within\n$situated_dir\n";
+
+		push(@$reindex_files,$existing_f);
+		$block_hash->{'reindex_files'}->{$existing_f} = 1;
+		delete $block_hash->{'existing_files'}->{$existing_f};
+
+	    }
+	}
+	
+	# metadata file needs to be in new_files list so parsed by MetadataXMLPlug
+	# (or equivalent)
+	$block_hash->{'new_files'}->{$new_mdf} = 1; 
+
+    }
+
+    # go through remaining existing files and work out what has changed and needs to be reindexed.
+    my @existing_files = sort keys %{$block_hash->{'existing_files'}};
+
+    my $reindex_files = [];
+
+    foreach my $existing_filename (@existing_files) {
+	if (-M $existing_filename < $archiveinf_timestamp) {
+	    # file is newer than last build
+	    
+	    my $existing_file = $existing_filename;
+	    #my $collectdir = &util::filename_cat($ENV{'GSDLCOLLECTDIR'});
+
+	    #my $collectdir_resafe = &util::filename_to_regex($collectdir);
+	    #$existing_file =~ s/^$collectdir_resafe(\\|\/)?//;
+	    
+	    print STDERR "**** Reindexing existing file: $existing_file\n";
+
+	    push(@$reindex_files,$existing_file);
+	    $block_hash->{'reindex_files'}->{$existing_filename} = 1;
+	}
+
+    }
+
+    
+    # By this point full_prev_all_files contains the files
+    # mentioned in archiveinf-src.db but are not in the 'import'
+    # folder (or whatever was specified through -importdir ...)
+
+    # This list can contain files that were created in the 'tmp' or
+    # 'cache' areas (such as screen-size and thumbnail images).
+    #
+    # In building the final list of files to delete, we test to see if
+    # it exists on the filesystem and if it does (unusual for a "normal" 
+    # file in import, but possible in the case of 'tmp' files), 
+    # supress it from going into the final list
+
+    my $collectdir = $ENV{'GSDLCOLLECTDIR'};
+
+    my @deleted_files = values %$full_prev_all_files;
+    map { my $curr_file = $_;
+	  my $full_curr_file = $curr_file;
+
+	  if (!&util::filename_is_absolute($curr_file)) {
+	      # add in import dir to make absolute
+
+	      $full_curr_file = &util::filename_cat($collectdir,$curr_file);
+	  }
+
+
+	  if (!-e $full_curr_file) {
+	      $block_hash->{'deleted_files'}->{$curr_file} = 1;
+	  }
+      } @deleted_files;
+
+
+
+}
+
+
+# this is used to delete "deleted" docs, and to remove old versions of "changed" docs
+# $mode is 'delete' or 'reindex'
+sub mark_docs_for_deletion
+{
+    my ($archive_info,$block_hash,$deleted_files,$archivedir,$verbosity,$mode) = @_;
+
+    my $mode_text = "deleted from index";
+    if ($mode eq "reindex") {
+	$mode_text = "reindexed";
+    }
+
+    # Get the infodbtype value for this collection from the arcinfo object
+    my $infodbtype = $archive_info->{'infodbtype'};
+
+    my $arcinfo_doc_filename = &dbutil::get_infodb_file_path($infodbtype, "archiveinf-doc", $archivedir);
+    my $arcinfo_src_filename = &dbutil::get_infodb_file_path($infodbtype, "archiveinf-src", $archivedir);
+
+
+    # record files marked for deletion in arcinfo
+    foreach my $file (@$deleted_files) {
+	# use 'archiveinf-src' info database file to look up all the OIDs
+	# that this file is used in (note in most cases, it's just one OID)
+	
+	my $src_rec = &dbutil::read_infodb_entry($infodbtype, $arcinfo_src_filename, $file);
+	my $oids = $src_rec->{'oid'};
+	my $file_record_deleted = 0;
+
+	# delete the src record
+	my $src_infodb_file_handle = &dbutil::open_infodb_write_handle($infodbtype, $arcinfo_src_filename, "append");
+	&dbutil::delete_infodb_entry($infodbtype, $src_infodb_file_handle, $file);
+	&dbutil::close_infodb_write_handle($infodbtype, $src_infodb_file_handle);
+
+
+	foreach my $oid (@$oids) {
+
+	    # find the source doc (the primary file that becomes this oid)
+	    my $doc_rec = &dbutil::read_infodb_entry($infodbtype, $arcinfo_doc_filename, $oid);
+	    my $doc_source_file = $doc_rec->{'src-file'}->[0];
+	    if (!&util::filename_is_absolute($doc_source_file)) {
+		$doc_source_file = &util::filename_cat($ENV{'GSDLCOLLECTDIR'},$doc_source_file);
+	    }
+
+	    if ($doc_source_file ne $file) {
+		# its an associated or metadata file
+		
+		# mark source doc for reimport as one of its assoc files has changed or deleted
+		$block_hash->{'reindex_files'}->{$doc_source_file} = 1;
+		
+	    }
+	    my $curr_status = $archive_info->get_status_info($oid);
+	    if (defined($curr_status) && (($curr_status ne "D"))) {
+		if ($verbosity>1) {
+		    print STDERR "$oid ($doc_source_file) marked to be $mode_text on next buildcol.pl\n";
+		}
+		# mark oid for deletion (it will be deleted or reimported)
+		$archive_info->set_status_info($oid,"D");
+		my $val = &dbutil::read_infodb_rawentry($infodbtype, $arcinfo_doc_filename, $oid);
+		$val =~ s/^<index-status>(.*)$/<index-status>D/m;
+
+		my $val_rec = &dbutil::convert_infodb_string_to_hash($val);
+		my $doc_infodb_file_handle = &dbutil::open_infodb_write_handle($infodbtype, $arcinfo_doc_filename, "append");
+
+		&dbutil::write_infodb_entry($infodbtype, $doc_infodb_file_handle, $oid, $val_rec);
+		&dbutil::close_infodb_write_handle($infodbtype, $doc_infodb_file_handle);
+	    }
+	}
+	
+    }
+
+    # now go through and check that we haven't marked any primary
+    # files for reindex (because their associated files have
+    # changed/deleted) when they have been deleted themselves. only in
+    # delete mode.
+
+    if ($mode eq "delete") {
+	foreach my $file (@$deleted_files) {
+	    if (defined $block_hash->{'reindex_files'}->{$file}) {
+		delete $block_hash->{'reindex_files'}->{$file};
+	    }
+	}
+    }
+
+
+}
+
+sub add_dir_contents_to_list {
+
+    my ($dirname, $list) = @_;
+ 
+    # Recur over directory contents.
+    my (@dir, $subfile);
+    
+    # find all the files in the directory
+    if (!opendir (DIR, $dirname)) {
+	print STDERR "inexport: WARNING - couldn't read directory $dirname\n";
+	return -1; # error in processing
+    }
+    @dir = readdir (DIR);
+    closedir (DIR);
+    
+    for (my $i = 0; $i < scalar(@dir); $i++) {
+	my $subfile = $dir[$i];
+	next if ($subfile =~ m/^\.\.?$/);
+	next if ($subfile =~ /^\.svn$/);
+	my $full_file = &util::filename_cat($dirname, $subfile);
+	if (-d $full_file) {
+	    &add_dir_contents_to_list($full_file, $list);
+	} else {
+	    push (@$list, $full_file);
+	}
+    }
+	
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/iso639.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/iso639.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/iso639.pm	(revision 24799)
@@ -0,0 +1,347 @@
+# mapping to and from iso 639 two letter language symbols
+
+package iso639;
+
+use strict;
+
+%iso639::fromiso639 = (
+	       'aa' => 'Afar',
+	       'ab' => 'Abkhazian',
+	       'af' => 'Afrikaans',
+	       'am' => 'Amharic',
+	       'ar' => 'Arabic',
+	       'as' => 'Assamese',
+	       'ay' => 'Aymara',
+	       'az' => 'Azerbaijani',
+
+	       'ba' => 'Bashkir',
+	       'be' => 'Byelorussian',
+	       'bg' => 'Bulgarian',
+	       'bh' => 'Bihari',
+	       'bi' => 'Bislama',
+	       'bn' => 'Bengali; Bangla',
+	       'bo' => 'Tibetan',
+	       'br' => 'Breton',
+
+	       'ca' => 'Catalan',
+	       'co' => 'Corsican',
+	       'cs' => 'Czech',
+	       'cy' => 'Welsh',
+
+	       'da' => 'Danish',
+	       'de' => 'German',
+	       'dz' => 'Bhutani',	       
+	       'dv' => 'Dhivehi',
+
+	       'el' => 'Greek',
+	       'en' => 'English',
+	       'eo' => 'Esperanto',
+	       'es' => 'Spanish',
+	       'et' => 'Estonian',
+	       'eu' => 'Basque',
+
+	       'fa' => 'Persian',
+	       'fi' => 'Finnish',
+	       'fj' => 'Fiji',
+	       'fo' => 'Faroese',
+	       'fr' => 'French',
+	       'fy' => 'Frisian',
+
+	       'ga' => 'Irish',
+	       'gd' => 'Scots Gaelic',
+	       'gl' => 'Galician',
+	       'gn' => 'Guarani',
+	       'gu' => 'Gujarati',
+
+	       'ha' => 'Hausa',
+	       'he' => 'Hebrew',
+	       'hi' => 'Hindi',
+	       'hr' => 'Croatian',
+	       'hu' => 'Hungarian',
+	       'hy' => 'Armenian',
+
+	       'ia' => 'Interlingua',
+	       'id' => 'Indonesian',
+	       'ie' => 'Interlingue',
+	       'ik' => 'Inupiak',
+	       'is' => 'Icelandic',
+	       'it' => 'Italian',
+	       'iu' => 'Inuktitut',
+
+	       'ja' => 'Japanese',
+	       'jv' => 'Javanese',
+
+	       'ka' => 'Georgian',
+	       'kk' => 'Kazakh',
+	       'kl' => 'Greenlandic',
+	       'km' => 'Cambodian',
+	       'kn' => 'Kannada',
+	       'ko' => 'Korean',
+	       'ks' => 'Kashmiri',
+	       'ku' => 'Kurdish',
+	       'ky' => 'Kirghiz',
+
+	       'la' => 'Latin',
+	       'ln' => 'Lingala',
+	       'lo' => 'Laotian',
+	       'lt' => 'Lithuanian',
+	       'lv' => 'Latvian, Lettish',
+
+	       'mg' => 'Malagasy',
+	       'mi' => 'Maori',
+	       'mk' => 'Macedonian',
+	       'ml' => 'Malayalam',
+	       'mn' => 'Mongolian',
+	       'mo' => 'Moldavian',
+	       'mr' => 'Marathi',
+	       'ms' => 'Malay',
+	       'mt' => 'Maltese',
+	       'my' => 'Burmese',
+
+	       'na' => 'Nauru',
+	       'ne' => 'Nepali',
+	       'nl' => 'Dutch',
+	       'no' => 'Norwegian',
+
+	       'oc' => 'Occitan',
+	       'om' => '(Afan) Oromo',
+	       'or' => 'Oriya',
+
+	       'pa' => 'Punjabi',
+	       'pl' => 'Polish',
+
+	       'prs'=> 'Dari',
+	       'ps' => 'Pushto',
+
+	       'pt' => 'Portuguese',
+
+	       'qu' => 'Quechua',
+	       'rm' => 'Rhaeto-Romance',
+	       'rn' => 'Kirundi',
+	       'ro' => 'Romanian',
+	       'ru' => 'Russian',
+	       'rw' => 'Kinyarwanda',
+
+	       'sa' => 'Sanskrit',
+	       'sd' => 'Sindhi',
+	       'sg' => 'Sangro',
+	       'sh' => 'Serbo-Croatian',
+	       'si' => 'Sinhalese',
+	       'sk' => 'Slovak',
+	       'sl' => 'Slovenian',
+	       'sm' => 'Samoan',
+	       'sn' => 'Shona',
+	       'so' => 'Somali',
+	       'sq' => 'Albanian',
+	       'sr' => 'Serbian',
+	       'ss' => 'Siswati',
+	       'st' => 'Sesotho',
+	       'su' => 'Sudanese',
+	       'sv' => 'Swedish',
+	       'sw' => 'Swahili',
+
+	       'ta' => 'Tamil',
+	       'te' => 'Telugu',
+	       'tg' => 'Tajik',
+	       'th' => 'Thai',
+	       'ti' => 'Tigrinya',
+	       'tk' => 'Turkmen',
+	       'tl' => 'Tagalog',
+	       'tn' => 'Setswana',
+	       'to' => 'Tonga',
+	       'tr' => 'Turkish',
+	       'ts' => 'Tsonga',
+	       'tt' => 'Tatar',
+	       'tw' => 'Twi',
+
+	       'ug' => 'Uigur',
+	       'uk' => 'Ukrainian',
+	       'ur' => 'Urdu',
+	       'uz' => 'Uzbek',
+
+	       'vi' => 'Vietnamese',
+	       'vo' => 'Volapuk',
+
+	       'wo' => 'Wolof',
+
+	       'xh' => 'Xhosa',
+
+	       'yi' => 'Yiddish',
+	       'yo' => 'Yoruba',
+
+	       'za' => 'Zhuang',
+	       'zh' => 'Chinese',
+	       'zu' => 'Zulu'
+	       );
+
+%iso639::toiso639 = (
+	     'afar' => 'aa',
+	     'abkhazian' => 'ab',
+	     'afrikaans' => 'af',
+	     'amharic' => 'am',
+	     'arabic' => 'ar',
+	     'assamese' => 'as',
+	     'aymara' => 'ay',
+	     'azerbaijani' => 'az',
+
+	     'bashkir' => 'ba',
+	     'byelorussian' => 'be',
+	     'bulgarian' => 'bg',
+	     'bihari' => 'bh',
+	     'bislama' => 'bi',
+	     'bengali' => 'bn',
+	     'bangla' => 'bn',
+	     'tibetan' => 'bo',
+	     'breton' => 'br',
+
+	     'catalan' => 'ca',
+	     'corsican' => 'co',
+	     'czech' => 'cs',
+	     'welsh' => 'cy',
+
+	     'danish' => 'da',
+	     'german' => 'de',
+	     'dhivehi' => 'dv',
+	     'bhutani' => 'dz',
+
+	     'greek' => 'el',
+	     'english' => 'en',
+	     'esperanto' => 'eo',
+	     'spanish' => 'es',
+	     'estonian' => 'et',
+	     'basque' => 'eu',
+
+	     'persian' => 'fa',
+	     'finnish' => 'fi',
+	     'fiji' => 'fj',
+	     'faroese' => 'fo',
+	     'french' => 'fr',
+	     'frisian' => 'fy',
+
+	     'irish' => 'ga',
+	     'scots_gaelic' => 'gd',
+	     'galician' => 'gl',
+	     'guarani' => 'gn',
+	     'gujarati' => 'gu',
+
+	     'hausa' => 'ha',
+	     'hebrew' => 'he',
+	     'hindi' => 'hi',
+	     'croatian' => 'hr',
+	     'hungarian' => 'hu',
+	     'armenian' => 'hy',
+
+	     'interlingua' => 'ia',
+	     'indonesian' => 'id',
+	     'interlingue' => 'ie',
+	     'inupiak' => 'ik',
+	     'icelandic' => 'is',
+	     'italian' => 'it',
+	     'inuktitut' => 'iu',
+
+	     'japanese' => 'ja',
+	     'javanese' => 'jv',
+
+	     'georgian' => 'ka',
+	     'kazakh' => 'kk',
+	     'greenlandic' => 'kl',
+	     'cambodian' => 'km',
+	     'kannada' => 'kn',
+	     'korean' => 'ko',
+	     'kashmiri' => 'ks',
+	     'kurdish' => 'ku',
+	     'kirghiz' => 'ky',
+
+	     'latin' => 'la',
+	     'lingala' => 'ln',
+	     'laotian' => 'lo',
+	     'lithuanian' => 'lt',
+	     'latvian' => 'lv',
+	     'lettish' => 'lv',
+
+	     'malagasy' => 'mg',
+	     'maori' => 'mi',
+	     'macedonian' => 'mk',
+	     'malayalam' => 'ml',
+	     'mongolian' => 'mn',
+	     'moldavian' => 'mo',
+	     'marathi' => 'mr',
+	     'malay' => 'ms',
+	     'maltese' => 'mt',
+	     'burmese' => 'my',
+
+	     'nauru' => 'na',
+	     'nepali' => 'ne',
+	     'dutch' => 'nl',
+	     'norwegian' => 'no',
+
+	     'occitan' => 'oc',
+	     '(afan)_oromo' => 'om',
+	     'oriya' => 'or',
+
+	     'punjabi' => 'pa',
+	     'polish' => 'pl',
+	     'pashto' => 'ps',
+	     'pushto' => 'ps',
+	     'dari'	  => 'prs',
+	     'portuguese' => 'pt',
+
+	     'quechua' => 'qu',
+
+	     'rhaeto-romance' => 'rm',
+	     'kirundi' => 'rn',
+	     'romanian' => 'ro',
+	     'russian' => 'ru',
+	     'kinyarwanda' => 'rw',
+	     
+	     'sanskrit' => 'sa',
+	     'sindhi' => 'sd',
+	     'sangro' => 'sg',
+	     'serbo-croatian' => 'sh',
+	     'sinhalese' => 'si',
+	     'slovak' => 'sk',
+	     'slovenian' => 'sl',
+	     'samoan' => 'sm',
+	     'shona' => 'sn',
+	     'somali' => 'so',
+	     'albanian' => 'sq',
+	     'serbian' => 'sr',
+	     'siswati' => 'ss',
+	     'sesotho' => 'st',
+	     'sudanese' => 'su',
+	     'swedish' => 'sv',
+	     'swahili' => 'sw',
+
+	     'tamil' => 'ta',
+	     'telugu' => 'te',
+	     'tajik' => 'tg',
+	     'thai' => 'th',
+	     'tigrinya' => 'ti',
+	     'turkmen' => 'tk',
+	     'tagalog' => 'tl',
+	     'setswana' => 'tn',
+	     'tonga' => 'to',
+	     'turkish' => 'tr',
+	     'tsonga' => 'ts',
+	     'tatar' => 'tt',
+	     'twi' => 'tw',
+
+	     'uigur' => 'ug',
+	     'ukrainian' => 'uk',
+	     'urdu' => 'ur',
+	     'uzbek' => 'uz',
+
+	     'vietnamese' => 'vi',
+	     'volapuk' => 'vo',
+
+	     'wolof' => 'wo',
+	     
+	     'xhosa' => 'xh',
+
+	     'yiddish' => 'yi',
+	     'yoruba' => 'yo',
+
+	     'zhuang' => 'za',
+	     'chinese' => 'zh',
+	     'zul' => 'zu',
+	     );
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/lucenebuilder.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/lucenebuilder.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/lucenebuilder.pm	(revision 24799)
@@ -0,0 +1,516 @@
+###########################################################################
+#
+# lucenebuilder.pm -- perl wrapper for building index with Lucene
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+###########################################################################
+# /*
+#  *  @version 1.0 Initial implementation of incremental building
+#  *  @version 2.0 Incremental building assistance added, including
+#  *               remove_document_from_database which implements the granddad's
+#  *               empty function to call the lucene_passes.pl and full_lucene_passes_exe
+#  *               so there is one place in the code that works out where the
+#  *               perl script is. John Rowe
+#  *
+#  *  @author David Bainbridge and Katherine Don, Waikato DL Research group
+#  *  @author John Rowe, DL Consulting Ltd.
+#  *  @author John Thompson, DL Consulting Ltd.
+#  */
+###########################################################################
+
+package lucenebuilder;
+
+# Use same basic XML structure setup by mgppbuilder/mgppbuildproc
+
+use mgppbuilder;
+use strict; 
+no strict 'refs';
+use util;
+
+sub BEGIN {
+    @lucenebuilder::ISA = ('mgppbuilder');
+}
+
+# /**
+#  *  @author  John Thompson, DL Consulting Ltd.
+#  */
+sub new {
+    my $class = shift(@_);
+    my $self = new mgppbuilder (@_);
+    $self = bless $self, $class;
+
+    $self->{'buildtype'} = "lucene";
+    
+    # If ENABLE_LUCENE was turned off during GS compilation, then we won't be able to
+    # continue. Check for existence of LuceneWrapper to see if Lucene was disabled.
+    my $lucene = &util::filename_cat($ENV{'GSDLHOME'},"bin","java","LuceneWrapper.jar");
+    if (! -f $lucene) {
+	die "***** ERROR: $lucene does not exist\n";	  
+    }
+  
+    # Do we need to put exe on the end?
+    my $exe = &util::get_os_exe ();
+    my $scriptdir = "$ENV{'GSDLHOME'}/bin/script";
+
+    # So where is lucene_passes.pl anyway?
+    my $lucene_passes_script = &util::filename_cat($scriptdir, "lucene_passes.pl");
+
+    # So tack perl on the beginning to ensure execution
+    $self->{'full_lucene_passes'} = "$lucene_passes_script";
+    if ($exe eq ".exe")
+    {
+	$self->{'full_lucene_passes_exe'} = "perl$exe \"$lucene_passes_script\"";
+    }
+    else
+    {
+	$self->{'full_lucene_passes_exe'} = "\"".&util::get_perl_exec()."\" -S \"$lucene_passes_script\"";
+    }
+
+    return $self;
+}
+# /** new() **/
+
+sub is_incremental_capable
+{
+    # lucene can do incremental building
+
+    return 1;
+}
+
+sub init_for_incremental_build {
+    my $self = shift (@_);
+
+    # we want to read in indexfieldmap and indexfields from existing build.cfg
+    # so that we know what has already been indexed
+    my $buildcfg = $self->read_build_cfg();
+    return unless defined $buildcfg;
+
+    my $field;
+    if (defined $buildcfg->{'indexfields'}) {
+	foreach $field (@{$buildcfg->{'indexfields'}}) {
+	    $self->{'buildproc'}->{'indexfields'}->{$field} = 1;
+	}
+    }
+
+    if (defined $buildcfg->{'indexfieldmap'}) {
+	foreach $field (@{$buildcfg->{'indexfieldmap'}}) {
+	    my ($f, $v) = $field =~ /^(.*)\-\>(.*)$/;
+	    $self->{'buildproc'}->{'indexfieldmap'}->{$f} = $v;
+	}
+    }	    
+}
+
+# lucene has none of these options
+sub generate_index_options {
+    my $self = shift (@_);
+
+    $self->SUPER::generate_index_options();
+    
+    $self->{'casefold'} = 0;
+    $self->{'stem'} = 0;
+    $self->{'accentfold'} = 0; 
+    $self->{'stemindexes'} = 0;
+}    
+
+sub default_buildproc {
+    my $self  = shift (@_);
+
+    return "lucenebuildproc";
+}
+
+# this writes a nice version of the text docs
+sub compress_text
+{
+    my $self = shift (@_);
+    # we don't do anything if we don't want compressed text
+    return if $self->{'no_text'};
+
+    my ($textindex) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    # the text directory
+    my $text_dir = &util::filename_cat($self->{'build_dir'}, "text");
+    my $build_dir = &util::filename_cat($self->{'build_dir'},"");
+    &util::mk_all_dir ($text_dir);
+
+    my $osextra = "";
+    if ($ENV{'GSDLOS'} =~ /^windows$/i)
+    {
+	$text_dir =~ s@/@\\@g;
+    }
+    else
+    {
+	if ($outhandle ne "STDERR")
+	{
+	    # so lucene_passes doesn't print to stderr if we redirect output
+	    $osextra .= " 2>/dev/null";
+	}
+    }
+
+    # get any os specific stuff
+    my $scriptdir = "$ENV{'GSDLHOME'}/bin/script";
+
+    # Find the perl script to call to run lucene
+    my $full_lucene_passes = $self->{'full_lucene_passes'};
+    my $full_lucene_passes_exe = $self->{'full_lucene_passes_exe'};
+
+    my $lucene_passes_sections = "Doc";
+
+    my ($handle);
+
+    if ($self->{'debug'})
+    {
+	$handle = *STDOUT;
+    }
+    else
+    {
+        print STDERR "Full Path:     $full_lucene_passes\n";
+        print STDERR "Executable:    $full_lucene_passes_exe\n";
+        print STDERR "Sections:      $lucene_passes_sections\n";
+        print STDERR "Build Dir:     $build_dir\n";
+        print STDERR "Cmd:           $full_lucene_passes_exe text $lucene_passes_sections \"$build_dir\" \"dummy\"   $osextra\n";
+	if (!-e "$full_lucene_passes" ||
+	    !open($handle, "| $full_lucene_passes_exe text $lucene_passes_sections \"$build_dir\" \"dummy\"   $osextra"))
+	{
+	    print STDERR "<FatalError name='NoRunLucenePasses'/>\n</Stage>\n" if $self->{'gli'};
+	    die "lucenebuilder::build_index - couldn't run $full_lucene_passes_exe\n";
+	}
+    }
+
+    # stored text is always Doc and Sec levels    
+    my $levels = { 'document' => 1, 'section' => 1 };
+    # always do database at section level
+    my $db_level = "section"; 
+
+    # set up the document processr
+    $self->{'buildproc'}->set_output_handle ($handle);
+    $self->{'buildproc'}->set_mode ('text');
+    $self->{'buildproc'}->set_index ($textindex);
+    $self->{'buildproc'}->set_indexing_text (0);
+    #$self->{'buildproc'}->set_indexfieldmap ($self->{'indexfieldmap'});
+    $self->{'buildproc'}->set_levels ($levels);
+    $self->{'buildproc'}->set_db_level ($db_level);
+    $self->{'buildproc'}->reset();
+    &plugin::begin($self->{'pluginfo'}, $self->{'source_dir'},
+		   $self->{'buildproc'}, $self->{'maxdocs'});
+    &plugin::read ($self->{'pluginfo'}, $self->{'source_dir'},
+		   "", {}, {}, $self->{'buildproc'}, $self->{'maxdocs'}, 0, $self->{'gli'});
+    &plugin::end($self->{'pluginfo'});
+    close ($handle) unless $self->{'debug'};
+    $self->print_stats();
+
+    print STDERR "</Stage>\n" if $self->{'gli'};
+}
+
+sub build_indexes {
+    my $self = shift (@_);
+    my ($indexname, $indexlevel) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    $self->pre_build_indexes($indexname);
+
+    my $indexes = [];
+    if (defined $indexname && $indexname =~ /\w/) {
+	push @$indexes, $indexname;
+    } else {
+	$indexes = $self->{'collect_cfg'}->{'indexes'};
+    }
+
+    # Determine what level of index we want to build (may be controlled by user
+    # configuration)
+    if ($indexlevel =~ /paragraph/)
+    {
+      print $outhandle "WARNING: Paragraph level indexing not supported by Lucene. Ignoring index\n";
+    }
+    my $indexlevels = [];
+    foreach my $level (keys %{$self->{'levels'}})
+    {
+      # have we got para index?
+      if ($level =~ /paragraph/)
+      {
+       	print $outhandle "WARNING: Paragraph level indexing not supported by Lucene. Ignoring index\n";
+      }
+      elsif (defined $indexlevel && $indexlevel =~ /\w/)
+      {
+        # - we only build the desired level
+        if ($indexlevel eq $level)
+        {
+          push (@{$indexlevels}, $level);
+        }
+      }
+      else
+      {
+        print "Adding all levels include: $level\n";
+        push (@{$indexlevels}, $level);
+      }
+    }
+
+    # Create the mapping between the index descriptions
+    # and their directory names (includes subcolls and langs)
+    $self->{'index_mapping'} = $self->create_index_mapping ($indexes);
+
+    # build each of the indexes
+    foreach my $index (@$indexes) {
+
+	if ($self->want_built($index)) {
+
+	    my $idx = $self->{'index_mapping'}->{$index};
+	    foreach my $level (@{$indexlevels}) {
+		next if $level =~ /paragraph/; # we don't do para indexing
+		my ($pindex) = $level =~ /^(.)/;
+		# should probably check that new name with level
+		# is unique ... but currently (with doc sec and para)
+		# each has unique first letter.
+		$self->{'index_mapping'}->{$index} = $pindex.$idx;
+
+		my $llevel = $mgppbuilder::level_map{$level};
+		print $outhandle "\n*** building index $index at level $llevel in subdirectory " .
+		    "$self->{'index_mapping'}->{$index}\n" if ($self->{'verbosity'} >= 1);
+		print STDERR "<Stage name='Index' source='$index' level=$llevel>\n" if $self->{'gli'};
+
+		$self->build_index($index,$llevel);
+	    }
+	    $self->{'index_mapping'}->{$index} = $idx;
+
+	} else {
+	    print $outhandle "\n*** ignoring index $index\n" if ($self->{'verbosity'} >= 1);
+	}
+    }
+
+    $self->post_build_indexes();
+}
+
+
+sub build_index {
+    my $self = shift (@_);
+    my ($index,$llevel) = @_;
+    my $outhandle = $self->{'outhandle'};
+    my $build_dir = $self->{'build_dir'};
+
+    # get the full index directory path and make sure it exists
+    my $indexdir = $self->{'index_mapping'}->{$index};
+    &util::mk_all_dir (&util::filename_cat($build_dir, $indexdir));
+
+    # get any os specific stuff
+    my $exedir = "$ENV{'GSDLHOME'}/bin/$ENV{'GSDLOS'}";
+    my $scriptdir = "$ENV{'GSDLHOME'}/bin/script";
+
+    # Find the perl script to call to run lucene
+    my $full_lucene_passes = $self->{'full_lucene_passes'};
+    my $full_lucene_passes_exe = $self->{'full_lucene_passes_exe'};
+
+    # define the section names for lucenepasses
+    # define the section names and possibly the doc name for lucenepasses
+    my $lucene_passes_sections = $llevel;
+
+    my $opt_create_index = ($self->{'incremental'}) ? "" : "-removeold";
+
+    my $osextra = "";
+    if ($ENV{'GSDLOS'} =~ /^windows$/i) {
+	$build_dir =~ s@/@\\@g;
+    } else {
+	if ($outhandle ne "STDERR") {
+	    # so lucene_passes doesn't print to stderr if we redirect output
+	    $osextra .= " 2>/dev/null";
+	}
+    }
+
+    # get the index expression if this index belongs
+    # to a subcollection
+    my $indexexparr = [];
+    my $langarr = [];
+
+    # there may be subcollection info, and language info.
+    my ($fields, $subcollection, $language) = split (":", $index);
+    my @subcollections = ();
+    @subcollections = split /,/, $subcollection if (defined $subcollection);
+
+    foreach $subcollection (@subcollections) {
+	if (defined ($self->{'collect_cfg'}->{'subcollection'}->{$subcollection})) {
+	    push (@$indexexparr, $self->{'collect_cfg'}->{'subcollection'}->{$subcollection});
+	}
+    }
+
+    # add expressions for languages if this index belongs to
+    # a language subcollection - only put languages expressions for the
+    # ones we want in the index
+    my @languages = ();
+    my $languagemetadata = "Language";
+    if (defined ($self->{'collect_cfg'}->{'languagemetadata'})) {
+	$languagemetadata = $self->{'collect_cfg'}->{'languagemetadata'};
+    }
+    @languages = split /,/, $language if (defined $language);
+    foreach my $language (@languages) {
+	my $not=0;
+	if ($language =~ s/^\!//) {
+	    $not = 1;
+	}
+	if($not) {
+	    push (@$langarr, "!$language");
+	} else {
+	    push (@$langarr, "$language");
+	}
+    }
+
+    # Build index dictionary. Uses verbatim stem method
+    print $outhandle "\n    creating index dictionary (lucene_passes -I1)\n"  if ($self->{'verbosity'} >= 1);
+    print STDERR "<Phase name='CreatingIndexDic'/>\n" if $self->{'gli'};
+    my ($handle);
+
+    if ($self->{'debug'}) {
+	$handle = *STDOUT;
+    } else {
+	print STDERR "Cmd: $full_lucene_passes_exe $opt_create_index index $lucene_passes_sections \"$build_dir\" \"$indexdir\"   $osextra\n";
+	if (!-e "$full_lucene_passes" ||
+	    !open($handle, "| $full_lucene_passes_exe $opt_create_index index $lucene_passes_sections \"$build_dir\" \"$indexdir\"   $osextra")) {
+	    print STDERR "<FatalError name='NoRunLucenePasses'/>\n</Stage>\n" if $self->{'gli'};
+	    die "lucenebuilder::build_index - couldn't run $full_lucene_passes_exe\n";
+	}
+    }
+
+    my $store_levels = $self->{'levels'};
+    my $db_level = "section"; #always
+    my $dom_level = "";
+    foreach my $key (keys %$store_levels) {
+	if ($mgppbuilder::level_map{$key} eq $llevel) {
+	    $dom_level = $key;
+	}
+    }
+    if ($dom_level eq "") {
+	print STDERR "Warning: unrecognized tag level $llevel\n";
+	$dom_level = "document";
+    }
+
+    my $local_levels = { $dom_level => 1 }; # work on one level at a time
+
+    # set up the document processr
+    $self->{'buildproc'}->set_output_handle ($handle);
+    $self->{'buildproc'}->set_mode ('text');
+    $self->{'buildproc'}->set_index ($index, $indexexparr);
+    $self->{'buildproc'}->set_index_languages ($languagemetadata, $langarr) if (defined $language);
+    $self->{'buildproc'}->set_indexing_text (1);
+    #$self->{'buildproc'}->set_indexfieldmap ($self->{'indexfieldmap'});
+    $self->{'buildproc'}->set_levels ($local_levels);
+    $self->{'buildproc'}->set_db_level($db_level);
+    $self->{'buildproc'}->reset();
+    &plugin::read ($self->{'pluginfo'}, $self->{'source_dir'},
+		   "", {}, {}, $self->{'buildproc'}, $self->{'maxdocs'}, 0, $self->{'gli'});
+    close ($handle) unless $self->{'debug'};
+
+    $self->print_stats();
+
+    $self->{'buildproc'}->set_levels ($store_levels);
+    print STDERR "</Stage>\n" if $self->{'gli'};
+}
+
+# /** A modified version of the basebuilder.pm's function that generates the
+#  *  information database from the GA documents. We need to change this
+#  *  so that if we've been asked to do an incremental build we only add
+#  *  metadata to autohierarchy classifiers via the IncrementalBuildUtils
+#  *  module. All other classifiers and metadata will be ignored.
+#  */
+# This was added to utilize DLC's incremental updating of Hierarchy classifiers. They are heading towards just using dynamic classifiers, and we do not want to use this code either. So now, we just use basebuilder's version of make_infodatabase
+sub make_infodatabase_dlc
+{
+    my $self = shift (@_);
+    my $outhandle = $self->{'outhandle'};
+
+    # Get info database file path
+    my $text_directory_path = &util::filename_cat($self->{'build_dir'}, "text");
+    my $infodb_file_path = &dbutil::get_infodb_file_path($self->{'infodbtype'}, $self->{'collection'}, $text_directory_path);
+
+    # If we aren't doing an incremental addition, then we just call the super-
+    # classes version
+    # Note: Incremental addition can only occur if an information database
+    #       already exists. If it doesn't, let the super classes function be
+    #       called once to generate it.
+    if (!$self->{'incremental'} || !-e $infodb_file_path)
+    {
+        # basebuilder::make_infodatabase(@_);
+        # Note: this doesn't work as the direct reference means all the $self
+        #       data is lost.
+        $self->basebuilder::make_infodatabase(@_);
+        return;
+    }
+
+    # Carry on with an incremental addition
+    print $outhandle "\n*** performing an incremental addition to the info database\n" if ($self->{'verbosity'} >= 1);
+    print STDERR "<Stage name='CreateInfoData'>\n" if $self->{'gli'};
+
+    # 1. Init all the classifiers
+    &classify::init_classifiers ($self->{'classifiers'});
+    # 2. Init the buildproc settings.
+    #    Note: we still need this to process any associated files - but we
+    #    don't expect to pipe anything to the database so we can do away with the
+    #    complex output handle.
+    my $assocdir = &util::filename_cat($self->{'build_dir'}, "assoc");
+    &util::mk_all_dir ($assocdir);
+    $self->{'buildproc'}->set_mode ('incinfodb'); # Very Important
+    $self->{'buildproc'}->set_assocdir ($assocdir);
+    # 3. Read in all the metadata from the files in the archives directory using
+    #    the GAPlug and using ourselves as the document processor!
+    &plugin::read ($self->{'pluginfo'}, $self->{'source_dir'}, "", {}, {}, $self->{'buildproc'}, $self->{'maxdocs'},0, $self->{'gli'});
+
+    print STDERR "</Stage>\n" if $self->{'gli'};
+}
+
+# /** Lucene specific document removal function. This works by calling lucene_passes.pl with
+#  *  -remove and the document id on the command line.
+#  *
+#  *  @param oid is the document identifier to be removed.
+#  *
+#  *  @author John Rowe, DL Consulting Ltd.
+#  */
+sub remove_document_from_database
+{
+    my ($self, $oid) = @_;
+    # Find the perl script to call to run lucene
+    my $full_lucene_passes_exe = $self->{'full_lucene_passes_exe'};
+    # Call lucene_passes.pl with -remove and the document ID on the command line
+    `$full_lucene_passes_exe -remove "$oid"`;
+}
+# /** remove_document_from_database **/
+
+# The three main 'modes' in Lucene builds are completely independent, while
+# index building can be further split by level (some there be more than
+# one level)
+sub prepare_build_recipe
+{
+  my ($self, $collection, $recipe) = @_;
+  my $outhandle = $self->{'outhandle'};
+  my $verbosity = $self->{'verbosity'};
+  # 1. Compressing the text
+  push(@{$recipe}, {'command'=>'buildcol.pl -keepold -verbosity ' . $verbosity . ' -mode compress_text ' . $collection});
+  # 2. Info database building
+  push(@{$recipe}, {'command'=>'buildcol.pl -keepold -verbosity ' . $verbosity . ' -mode infodb ' . $collection});
+  # 3. Now one command each for each level of index required
+  foreach my $level (keys %{$self->{'levels'}})
+  {
+    push(@{$recipe}, {'command'=>'buildcol.pl -keepold -verbosity ' . $verbosity . ' -mode build_index -indexlevel ' . $level . ' ' . $collection});
+  }
+  # Complete!
+}
+
+1;
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/lucenebuildproc.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/lucenebuildproc.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/lucenebuildproc.pm	(revision 24799)
@@ -0,0 +1,588 @@
+###########################################################################
+#
+# lucenebuildproc.pm -- perl wrapper for building index with Lucene
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package lucenebuildproc;
+
+# This document processor outputs a document
+# for lucene to process
+
+# Use same basic XML structure setup by mgppbuilder/mgppbuildproc
+
+use mgppbuildproc;
+use ghtml;
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+
+use IncrementalBuildUtils;
+
+sub BEGIN {
+    @lucenebuildproc::ISA = ('mgppbuildproc');
+}
+
+
+sub new {
+    my $class = shift @_;
+    my $self = new mgppbuildproc (@_);
+
+    $self->{'numincdocs'} = 0;
+
+    return bless $self, $class;
+}
+
+
+sub is_incremental_capable
+{
+    my $self = shift (@_);
+
+    # Unlike MG and MGPP, Lucene supports incremental building
+    return 1;
+}
+
+
+sub textedit {
+    my $self = shift (@_);
+    my ($doc_obj,$file,$edit_mode) = @_;
+
+    my $lucenehandle = $self->{'output_handle'};
+    my $outhandle = $self->{'outhandle'};
+
+    # only output this document if it is one to be indexed
+    return if ($doc_obj->get_doc_type() ne "indexed_doc");
+
+    # skip this document if in "compress-text" mode and asked to delete it
+    return if (!$self->get_indexing_text() && ($edit_mode eq "delete"));
+
+    my $indexed_doc = $self->is_subcollection_doc($doc_obj);
+
+    # this is another document
+    if (($edit_mode eq "add") || ($edit_mode eq "update")) {
+	$self->{'num_docs'} += 1;
+    }
+    else {
+	$self->{'num_docs'} -= 1;
+    }
+
+    # get the parameters for the output
+    # split on : just in case there is subcoll and lang stuff
+    my ($fields) = split (/:/, $self->{'index'});
+
+    my $doc_tag_name = $mgppbuildproc::level_map{'document'};
+
+    my $levels = $self->{'levels'};
+    my $ldoc_level = $levels->{'document'};
+    my $lsec_level = $levels->{'section'};
+
+    # gs2_id should be depricated #####
+    my $gs2_id = "";
+    if ($ldoc_level)
+    {
+	if ($self->{'db_level'} eq 'document')
+	{
+	    $gs2_id = $self->{'num_docs'};
+	}
+        else
+	{
+	    # default is section level
+	    $gs2_id = $self->{'num_sections'} + 1;
+	}
+    }
+    my $gs2_docOID = $doc_obj->get_OID();
+    my $documenttag = undef;
+    my $documentendtag = undef;
+
+    #$documenttag = "<$doc_tag_name xmlns:gs2=\"http://www.greenstone.org/gs2\" file=\"$file\" gs2:id=\"$gs2_id\" gs2:docOID=\"$gs2_docOID\" gs2:mode=\"$edit_mode\">\n";
+    $documenttag = "<$doc_tag_name xmlns:gs2=\"http://www.greenstone.org/gs2\" file=\"$file\"  gs2:docOID=\"$gs2_docOID\" gs2:mode=\"$edit_mode\">\n";
+    $documentendtag = "\n</$doc_tag_name>\n";
+
+    my $sec_tag_name = "";
+    if ($lsec_level)
+    {
+	$sec_tag_name = $mgppbuildproc::level_map{'section'};
+    }
+
+    my $doc_section = 0; # just for this document
+
+    my $text = "";
+    $text .= $documenttag;
+    # get the text for this document
+    my $section = $doc_obj->get_top_section();
+    while (defined $section)
+    {
+	# update a few statistics
+	$doc_section++;
+	$self->{'num_sections'}++;
+
+	my $sec_gs2_id = $self->{'num_sections'};
+	my $sec_gs2_docOID = $gs2_docOID;
+	$sec_gs2_docOID .= ".$section" if ($section ne "");
+
+	# if we are doing subcollections, then some docs shouldn't be indexed.
+	# but we need to put the section tag placeholders in there so the
+	# sections match up with database
+	my $indexed_section = $doc_obj->get_metadata_element($section, "gsdldoctype") || "indexed_section";
+	if (($indexed_doc == 0) || ($indexed_section ne "indexed_section" && $indexed_section ne "indexed_doc")) {
+	    if ($sec_tag_name ne "") {
+		#$text .= "\n<$sec_tag_name gs2:id=\"$sec_gs2_id\" gs2:docOID=\"$sec_gs2_docOID\" gs2:mode=\"ignore\">\n";
+		$text .= "\n<$sec_tag_name  gs2:docOID=\"$sec_gs2_docOID\" gs2:mode=\"ignore\">\n";
+		$text .= "\n</$sec_tag_name>\n" 
+	    }
+            $section = $doc_obj->get_next_section($section);
+	    next;
+          }
+
+	if ($sec_tag_name ne "")
+	{
+	    #$text .= "\n<$sec_tag_name gs2:id=\"$sec_gs2_id\" gs2:docOID=\"$sec_gs2_docOID\" gs2:mode=\"$edit_mode\">\n";
+	    $text .= "\n<$sec_tag_name  gs2:docOID=\"$sec_gs2_docOID\" gs2:mode=\"$edit_mode\">\n";
+	}
+
+	if (($edit_mode eq "add") || ($edit_mode eq "update")) {
+	    $self->{'num_bytes'} += $doc_obj->get_text_length ($section);
+	}
+	else {
+	    # delete
+	    $self->{'num_bytes'} -= $doc_obj->get_text_length ($section);
+	}
+
+
+	# has the user added a 'metadata' index?
+	my $all_metadata_specified = 0;
+	# which fields have already been indexed? (same as fields, but in a map)
+	my $specified_fields = {};
+	
+	# do we have an allfields index??
+	my $allfields_index = 0;
+	# collect up all the text for it in here
+	my $allfields_text = "";
+	foreach my $field (split (/;/, $fields)) {
+	    if ($field eq "allfields") {
+		$allfields_index = 1;
+	    } elsif ($field eq "metadata") {
+		$all_metadata_specified = 1;
+	    }
+	}
+	
+	foreach my $field (split (/;/, $fields)) {
+	    
+	    # only deal with this field if it doesn't start with top or
+	    # this is the first section
+	    my $real_field = $field;
+	    next if (($real_field =~ s/^top//) && ($doc_section != 1));
+	    
+	    # process these two later
+	    next if ($real_field eq "allfields" || $real_field eq "metadata");
+	    
+	    #individual metadata and or text specified - could be a comma separated list
+	    $specified_fields->{$real_field} = 1;
+	    my $shortname="";
+	    my $new_field = 0; # have we found a new field name?
+	    if (defined $self->{'indexfieldmap'}->{$real_field}) {
+		$shortname = $self->{'indexfieldmap'}->{$real_field};
+	    }
+	    else {
+		$shortname = $self->create_shortname($real_field);
+		$new_field = 1;
+	    }
+
+	    my @metadata_list = (); # put any metadata values in here
+	    my $section_text = ""; # put the text in here
+	    foreach my $submeta (split /,/, $real_field) {
+		if ($submeta eq "text") {
+		    # no point in indexing text more than once
+		    if ($section_text eq "") {
+			$section_text = $doc_obj->get_text($section);
+			if ($self->{'indexing_text'}) {
+			    # we always strip html
+			    $section_text = $self->preprocess_text($section_text, 1, "");
+			}
+			else { 
+			    # leave html stuff in, but escape the tags
+			    &ghtml::htmlsafe($section_text);
+			}
+		    }
+		}
+		else {
+		    $submeta =~ s/^ex\.([^.]+)$/$1/; #strip off ex. iff it's the only metadata set prefix (will leave ex.dc.* intact)
+
+		    # its a metadata element
+		    my @section_metadata = @{$doc_obj->get_metadata ($section, $submeta)};
+		    if ($section ne $doc_obj->get_top_section() && $self->{'indexing_text'} && defined ($self->{'sections_index_document_metadata'})) {
+			if ($self->{'sections_index_document_metadata'} eq "always" || ( scalar(@section_metadata) == 0 && $self->{'sections_index_document_metadata'} eq "unless_section_metadata_exists")) {
+			    push (@section_metadata, @{$doc_obj->get_metadata ($doc_obj->get_top_section(), $submeta)});
+			}
+		    }
+		    push (@metadata_list, @section_metadata);
+		}
+	    } # for each field in this one index
+	    
+
+	    # now we add the text and/or metadata into new_text
+	    if ($section_text ne "" || scalar(@metadata_list)) {
+		my $new_text = "";
+		
+		if ($section_text ne "") {
+		    $new_text .= "$section_text ";
+		}
+		
+		foreach my $item (@metadata_list) {
+		    &ghtml::htmlsafe($item);
+		    $new_text .= "$item ";
+		}
+
+		if ($allfields_index) {
+		    $allfields_text .= $new_text;
+		}
+
+		if ($self->{'indexing_text'}) {
+		    # add the tag
+		    $new_text = "<$shortname index=\"1\">$new_text</$shortname>";
+		}
+		# filter the text
+		$new_text = $self->filter_text ($field, $new_text);
+
+		if (($edit_mode eq "add") || ($edit_mode eq "update")) {
+		    $self->{'num_processed_bytes'} += length ($new_text);
+		    $text .= "$new_text";
+		}
+		else {
+		    # delete
+		    $self->{'num_processed_bytes'} -= length ($new_text);
+		}
+		
+
+		if ($self->{'indexing_text'} && $new_field) {
+		    # we need to add to the list in indexfields
+		    
+		    $self->{'indexfieldmap'}->{$real_field} = $shortname;
+		    $self->{'indexfieldmap'}->{$shortname} = 1;
+		}
+		
+	    }
+	    
+	} # foreach field
+
+   	if ($all_metadata_specified) {
+	    
+	    my $new_text = "";
+	    my $shortname = "";
+	    my $metadata = $doc_obj->get_all_metadata ($section);
+	    foreach my $pair (@$metadata) {
+		my ($mfield, $mvalue) = (@$pair);
+		# no value
+		next unless defined $mvalue && $mvalue ne "";
+		# we have already indexed this
+		next if defined ($specified_fields->{$mfield});
+		# check fields here, maybe others dont want - change to use dontindex!!
+		next if ($mfield eq "Identifier" || $mfield eq "classifytype" || $mfield eq "assocfilepath");
+		next if ($mfield =~ /^gsdl/);
+		
+		&ghtml::htmlsafe($mvalue);
+		
+		if (defined $self->{'indexfieldmap'}->{$mfield}) {
+		    $shortname = $self->{'indexfieldmap'}->{$mfield};
+		}
+		else {
+		    $shortname = $self->create_shortname($mfield);
+		    $self->{'indexfieldmap'}->{$mfield} = $shortname;
+		    $self->{'indexfieldmap'}->{$shortname} = 1;
+		}	   
+		$new_text .= "<$shortname index=\"1\">$mvalue</$shortname>\n";
+		if ($allfields_index) {
+		    $allfields_text .= "$mvalue ";
+		}
+
+		if (!defined $self->{'indexfields'}->{$mfield}) {
+		    $self->{'indexfields'}->{$mfield} = 1;
+		}				    
+	    
+	    }
+	    # filter the text
+	    $new_text = $self->filter_text ("metadata", $new_text);
+	    
+	    if (($edit_mode eq "add") || ($edit_mode eq "update")) {
+		$self->{'num_processed_bytes'} += length ($new_text);
+		$text .= "$new_text";
+	    }
+	    else {
+		# delete
+		$self->{'num_processed_bytes'} -= length ($new_text);
+	    }	    
+	}
+
+	if ($allfields_index) {
+	    # add the index name mapping
+	    $self->{'indexfieldmap'}->{"allfields"} = "ZZ";
+	    $self->{'indexfieldmap'}->{"ZZ"} = 1;
+	    
+	    my $new_text = "<ZZ index=\"1\">$allfields_text</ZZ>\n";
+	    # filter the text
+	    $new_text = $self->filter_text ("allfields", $new_text);
+	    
+	    if (($edit_mode eq "add") || ($edit_mode eq "update")) {
+		$self->{'num_processed_bytes'} += length ($new_text);
+		$text .= "$new_text";
+	    }
+	    else {
+		# delete
+		$self->{'num_processed_bytes'} -= length ($new_text);
+	    }
+	}
+	    
+	$text .= "\n</$sec_tag_name>\n" if ($sec_tag_name ne "");
+
+        $section = $doc_obj->get_next_section($section);
+    } # while defined section
+
+    print $lucenehandle "$text\n$documentendtag";
+
+##    if ($edit_mode eq "delete") {	
+##       print STDERR "$text\n$documentendtag";
+##    }
+
+}
+
+sub text {
+    my $self = shift (@_);
+    my ($doc_obj,$file) = @_;
+
+    $self->textedit($doc_obj,$file,"add");
+}
+
+sub textreindex
+{
+    my $self = shift (@_);
+    my ($doc_obj,$file) = @_;
+
+    $self->textedit($doc_obj,$file,"update");
+}
+
+sub textdelete
+{
+    my $self = shift (@_);
+    my ($doc_obj,$file) = @_;
+
+    $self->textedit($doc_obj,$file,"delete");
+}
+
+
+
+
+
+# /** We make this builder pretend to be a document processor so we can get
+#  *  information back from the plugins.
+#  *
+#  *  @param  $self    A reference to this Lucene builder
+#  *  @param  $doc_obj A reference to a document object representing what was
+#  *                   parsed by the GAPlug
+#  *  @param  $file    The name of the file parsed as a string
+#  *
+#  *  @author John Thompson, DL Consulting Ltd
+#  */
+sub process()
+  {
+    my $self = shift (@_);
+    my ($doc_obj, $file) = @_;
+
+    # If this is called from any stage other than an incremental infodb we want
+    # to pass through to the superclass of build
+    if ($self->get_mode() eq "incinfodb")
+      {
+        print STDERR "*** Processing a document added using INCINFODB ***\n" if ($self->{'verbosity'} > 3);
+        my ($archivedir) = $file =~ /^(.*?)(?:\/|\\)[^\/\\]*$/;
+        $archivedir = "" unless defined $archivedir;
+        $archivedir =~ s/\\/\//g;
+        $archivedir =~ s/^\/+//;
+        $archivedir =~ s/\/+$//;
+
+        # Number of files
+        print STDERR "There are " . scalar(@{$doc_obj->get_assoc_files()}) . " associated documents...\n" if ($self->{'verbosity'} > 3);
+
+        # resolve the final filenames of the files associated with this document
+        $self->assoc_files ($doc_obj, $archivedir);
+
+        # is this a paged or a hierarchical document
+        my ($thistype, $childtype) = $self->get_document_type ($doc_obj);
+
+        # Determine the actual docnum by checking if we've processed any
+        # previous incrementally added documents. If so, carry on from there.
+        # Otherwise we set the counter to be the same as the number of
+        # sections encountered during the previous build
+        if ($self->{'numincdocs'} == 0)
+          {
+            $self->{'numincdocs'} = $self->{'starting_num_sections'} + 1;
+          }
+
+        my $section = $doc_obj->get_top_section ();
+        print STDERR "+ top section: '$section'\n" if ($self->{'verbosity'} > 3);
+        my $doc_OID = $doc_obj->get_OID();
+        my $url = "";
+        while (defined $section)
+          {
+            print STDERR "+ processing section: '$section'\n" if ($self->{'verbosity'} > 3);
+            # Attach all the other metadata to this document
+            # output the fact that this document is a document (unless doctype
+            # has been set to something else from within a plugin
+            my $dtype = $doc_obj->get_metadata_element ($section, "doctype");
+            if (!defined $dtype || $dtype !~ /\w/)
+              {
+                #$doc_obj->add_utf8_metadata($section, "doctype", $dtype);
+		  $doc_obj->add_utf8_metadata($section, "doctype", "doc");
+              }
+            # output whether this node contains text
+            if ($doc_obj->get_text_length($section) > 0)
+              {
+                $doc_obj->add_utf8_metadata($section, "hastxt", 1);
+              }
+            else
+              {
+                $doc_obj->add_utf8_metadata($section, "hastxt", 0);
+              }
+
+            # output archivedir if at top level
+            if ($section eq $doc_obj->get_top_section())
+              {
+                $doc_obj->add_utf8_metadata($section, "archivedir", $archivedir);
+		$doc_obj->add_utf8_metadata($section, "thistype", $thistype);
+              }
+
+            # output a list of children
+            my $children = $doc_obj->get_children ($section);
+            if (scalar(@$children) > 0)
+              {
+                $doc_obj->add_utf8_metadata($section, "childtype", $childtype);
+                my @contains = ();
+                foreach my $child (@$children)
+                  {
+                    if ($child =~ /^.*?\.(\d+)$/)
+                      {
+                        push (@contains, "\".$1");
+                      }
+                    else
+                      {
+                        push (@contains, "\".$child");
+                      }
+                  }
+                $doc_obj->add_utf8_metadata($section, "contains", join(";", @contains));
+              }
+            #output the matching doc number
+            print STDERR "+ docnum=" . $self->{'numincdocs'} . "\n" if ($self->{'verbosity'} > 3);
+            $doc_obj->add_utf8_metadata($section, "docnum", $self->{'numincdocs'});
+
+            $self->{'numincdocs'}++;
+            $section = $doc_obj->get_next_section($section);
+            # if no sections wanted, only add the docs
+            last if ($self->{'db_level'} eq "document");
+          }
+        print STDERR "\n*** incrementally add metadata from document at: " . $file . "\n" if ($self->{'verbosity'} > 3);
+        &IncrementalBuildUtils::addDocument($self->{'collection'}, $self->{'infodbtype'}, $doc_obj, $doc_obj->get_top_section());
+      }
+    else
+      {
+        $self->mgppbuildproc::process(@_);
+      }
+  }
+# /** process() **/
+
+
+# Following methods seem to be no different to those defined in basebuildproc.pm
+# From inspection, it looks like these ones can be removed
+
+
+sub get_num_docs {
+    my $self = shift (@_);
+    #rint STDERR "get_num_docs(): $self->{'num_docs'}\n";
+    return $self->{'num_docs'};
+}
+
+sub get_num_sections {
+    my $self = shift (@_);
+    #rint STDERR "get_num_sections(): $self->{'num_sections'}\n";
+    return $self->{'num_sections'};
+}
+
+# num_bytes is the actual number of bytes in the collection
+# this is normally the same as what's processed during text compression
+sub get_num_bytes {
+    my $self = shift (@_);
+    #rint STDERR "get_num_bytes(): $self->{'num_bytes'}\n";
+    return $self->{'num_bytes'};
+}
+
+
+# This is similar to mgppbuildproc's preprocess_text but adds extra spaces
+# Otherwise the removal of tags below might lead to Lucene turning
+#   "...farming</p>\n<p>EDWARD.." into "farmingedward"
+#     (example from demo collection b20cre)
+# Many thanks to John Thompson, DL Consulting Ltd. (www.dlconsulting.com)
+sub preprocess_text
+{
+    my $self = shift (@_);
+    my ($text, $strip_html, $para) = @_;
+    # at this stage, we do not do paragraph tags unless have strip_html -
+    # it will result in a huge mess of non-xml
+    return unless $strip_html;
+
+    my $new_text = $text;
+
+    # if we have <pre> tags, we can have < > inside them, need to delete
+    # the <> before stripping tags
+    $new_text =~ s/<pre>(.*?)<\/pre>/$self->remove_gtlt($1,$para)/gse;
+
+    if ($para eq "") {
+       # just remove all tags
+       $new_text =~ s/<[^>]*>/ /gs;
+    } else {
+       # strip all tags except <p> tags which get turned into $para
+       $new_text =~ s/<([^>]*)>/$self->process_tags($1, $para)/gse;
+    }
+
+    # It's important that we remove name entities because otherwise the text passed to Lucene for indexing
+    #   may not be valid XML (eg. if HTML-only entities like &nbsp; are used)
+    $new_text =~ s/&\w{1,10};//g;
+    # Remove stray '&' characters, except in &#nnnn; or &#xhhhh; entities (which are valid XML)
+    $new_text =~ s/&([^\#])/ $1/g;
+
+    return $new_text;
+}
+
+sub delete_assoc_files 
+{
+    my $self = shift (@_);
+    my ($archivedir, $edit_mode) = @_;
+
+    $self->basebuildproc::delete_assoc_files(@_);
+    
+    if ($edit_mode eq "delete") {
+	# if we are deleting the doc, then also delete the lucene text  version
+	my $assoc_dir = &util::filename_cat($self->{'build_dir'},"text", $archivedir);
+	if (-d $assoc_dir) {
+	    &util::rm_r($assoc_dir);
+	} 
+    }
+}
+1;
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/manifest.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/manifest.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/manifest.pm	(revision 24799)
@@ -0,0 +1,260 @@
+###########################################################################
+#
+# manifest.pm --
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2006-2010 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+
+package manifest;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+use XMLParser;
+use dbutil;
+
+our $self;
+
+sub new {
+    my ($class) = shift (@_);
+    my ($infodbtype,$archivedir) = @_;
+
+    $self = {} ;
+
+    $self->{'index'} = {};
+    $self->{'reindex'} = {};
+    $self->{'delete'} = {};
+
+    my $arcinfo_doc_filename 
+	= &dbutil::get_infodb_file_path($infodbtype, "archiveinf-doc", $archivedir);
+
+    if (-e $arcinfo_doc_filename) {
+	# Only store the infodb-doc filename if it exists
+	# If it doesn't exist then this means the collection has not been
+	#   built yet (or else the archives folder has been deleted).
+	#   Either way we have no way to look up which files
+	#   are associated with an OID.  If we we encounter an OID
+	#   tag later on, we will use the fact that this field is
+	#   not defined to issue a warning
+
+	$self->{'_arcinfo-doc-filename'} = $arcinfo_doc_filename;
+	$self->{'_infodbtype'} = $infodbtype;
+    }
+
+    return bless $self, $class;
+}
+
+sub parse
+{
+    my ($self) = shift (@_);
+    my ($filename) = @_;
+
+    my $parser = new XML::Parser('Style' => 'Stream',
+                                 'Handlers' => {'Char' => \&Char,
+                                                'XMLDecl' => \&XMLDecl,
+                                                'Entity' => \&Entity,
+                                                'Doctype' => \&Doctype,
+                                                'Default' => \&Default
+                                                });
+
+    $parser->parsefile($filename);
+}
+
+sub StartDocument {$self->xml_start_document(@_);}
+sub XMLDecl {$self->xml_xmldecl(@_);}
+sub Entity {$self->xml_entity(@_);}
+sub Doctype {$self->xml_doctype(@_);}
+sub StartTag {$self->xml_start_tag(@_);}
+sub EndTag {$self->xml_end_tag(@_);}
+sub Text {$self->xml_text(@_);}
+sub PI {$self->xml_pi(@_);}
+sub EndDocument {$self->xml_end_document(@_);}
+sub Default {$self->xml_default(@_);}
+
+# This Char function overrides the one in XML::Parser::Stream to overcome a
+# problem where $expat->{Text} is treated as the return value, slowing
+# things down significantly in some cases.
+sub Char {
+    use bytes;  # Necessary to prevent encoding issues with XML::Parser 2.31+
+    $_[0]->{'Text'} .= $_[1];
+    return undef;
+}
+
+# Called at the beginning of the XML document.
+sub xml_start_document {
+    my $self = shift(@_);
+    my ($expat) = @_;
+
+}
+
+# Called for XML declarations
+sub xml_xmldecl {
+    my $self = shift(@_);
+    my ($expat, $version, $encoding, $standalone) = @_;
+}
+
+# Called for XML entities
+sub xml_entity {
+  my $self = shift(@_);
+  my ($expat, $name, $val, $sysid, $pubid, $ndata) = @_;
+}
+
+# Called for DOCTYPE declarations - use die to bail out if this doctype
+# is not meant for this plugin
+sub xml_doctype {
+    my $self = shift(@_);
+    my ($expat, $name, $sysid, $pubid, $internal) = @_;
+    die "Manifest Cannot process XML document with DOCTYPE of $name";
+}
+
+# Called for every start tag. The $_ variable will contain a copy of the
+# tag and the %_ variable will contain the element's attributes.
+sub xml_start_tag
+{
+    my $self = shift(@_);
+    my ($expat, $element) = @_;
+
+    if (($element eq "Filename") || ($element eq "OID"))
+    {
+	$self->{'item-val'} = "";
+    }
+    elsif ($element eq "Manifest") {
+    }
+    else
+    {
+	if (defined($self->{'file-type'}))
+	{
+	    print STDERR "Warning: Malformed XML manifest\n";
+	    print STDERR "         Unrecognized element $element nested inside " . $self->{'file-type'} . ".\n";
+	}
+	else {
+	    my $filetype = lc($element);
+	    $self->{'file-type'} = $filetype;
+	    if (!defined $self->{$filetype}) {
+		print STDERR "Warning: <$element> is not one of the registered tags for manifest format.\n";
+	    }
+	}
+
+    }
+}
+
+# Called for every end tag. The $_ variable will contain a copy of the tag.
+sub xml_end_tag
+{
+    my $self = shift(@_);
+    my ($expat, $element) = @_;
+
+    if ($element eq "Filename")
+    {
+	my $filetype = $self->{'file-type'};
+	my $filename  = $self->{'item-val'};
+
+	$self->{$filetype}->{$filename} = 1;
+	$self->{'item-val'} = undef;
+    }
+    elsif ($element eq "OID") {
+	# look up src and assoc filenames used by this doc oid
+
+	my $filetype = $self->{'file-type'};
+	my $oid  = $self->{'item-val'};
+
+	if (defined $self->{'_infodbtype'}) {
+	    
+
+	    my $infodbtype = $self->{'_infodbtype'};
+	    my $arcinfo_doc_filename = $self->{'_arcinfo-doc-filename'};
+	    
+	    my $doc_rec = &dbutil::read_infodb_entry($infodbtype, $arcinfo_doc_filename, $oid);
+	    
+	    my $doc_source_file = $doc_rec->{'src-file'}->[0];
+	    my $assoc_files = $doc_rec->{'assoc-file'};
+	    my @all_files = ($doc_source_file);
+	    push(@all_files,@$assoc_files) if defined $assoc_files;
+		
+	    foreach my $filename (@all_files) {
+		
+		if (!&util::filename_is_absolute($filename)) {
+		    $filename = &util::filename_cat($ENV{'GSDLCOLLECTDIR'},$filename);
+		}
+
+		$self->{$filetype}->{$filename} = 1;
+	    }
+	}
+	else {
+	    print STDERR "Warning: No archiveinf-doc database in archives directory.\n";
+	    print STDERR "         Unable to look up source files that constitute document $oid.\n";
+	}
+
+	$self->{'item-val'} = undef;
+    }
+    else
+    {
+	$self->{'file-type'} = undef;
+    }
+}
+
+# Called just before start or end tags with accumulated non-markup text in
+# the $_ variable.
+sub xml_text {
+    my $self = shift(@_);
+    my ($expat) = @_;
+
+    if (defined $self->{'item-val'}) {
+	my $text = $_;
+	chomp($text);
+
+	$text =~ s/^\s+//;
+	$text =~ s/\s+$//;	
+	
+	$self->{'item-val'} .= $text if ($text !~ m/^\s*$/);
+    }
+}
+
+# Called for processing instructions. The $_ variable will contain a copy
+# of the pi.
+sub xml_pi {
+    my $self = shift(@_);
+    my ($expat, $target, $data) = @_;
+}
+
+# Called at the end of the XML document.
+sub xml_end_document {
+    my $self = shift(@_);
+    my ($expat) = @_;
+
+    if (defined $self->{'import'}) {
+	print STDERR "Warning: <Import> tag is deprecated.\n";
+	print STDERR "         Processing data as if it were tagged as <Index>\n";
+	$self->{'index'} = $self->{'import'};
+    }
+
+}
+
+# Called for any characters not handled by the above functions.
+sub xml_default {
+    my $self = shift(@_);
+    my ($expat, $text) = @_;
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/marcmapping.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/marcmapping.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/marcmapping.pm	(revision 24799)
@@ -0,0 +1,146 @@
+###########################################################################
+#
+# marcmapping.pm -- code to read in the marc mapping files
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2008 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package marcmapping;
+
+sub parse_marc_metadata_mapping
+{
+    my ($mm_file_or_files, $outhandle) = @_;
+
+    my $metadata_mapping = {};
+
+    if (ref ($mm_file_or_files) eq 'ARRAY') {
+	my $mm_files = $mm_file_or_files;
+
+	# Need to process files in reverse order.  This is so in the
+	# case where we have both a "collect" and "main" version,
+	# the "collect" one tops up the main one
+
+	my $mm_file;
+	while ($mm_file = pop(@$mm_files)) {
+	    &_parse_marc_metadata_mapping($mm_file,$metadata_mapping, $outhandle);
+	}
+    }
+    else {
+	my $mm_file = $mm_file_or_files;
+	&_parse_marc_metadata_mapping($mm_file,$metadata_mapping, $outhandle);
+    }
+
+    return $metadata_mapping;
+}
+
+sub _parse_marc_metadata_mapping
+{
+    my ($mm_file,$metadata_mapping, $outhandle) = @_;
+
+    if (open(MMIN, "<$mm_file"))
+    {
+	my $l=0;
+	my $line;
+	while (defined($line=<MMIN>))
+	{
+	    $l++;
+	    chomp $line;
+	    $line =~ s/#.*$//; # strip out any comments, including end of line
+	    next if ($line =~ m/^\s*$/); 
+	    $line =~ s/\s+$//; # remove any white space at end of line
+
+	    my $parse_error_count = 0;
+	    if ($line =~ m/^-(\d+)\s*$/) {
+		# special "remove" rule syntax
+		my $marc_info = $1;
+		if (defined $metadata_mapping->{$marc_info}) {
+		    delete $metadata_mapping->{$marc_info};
+		}
+		else {
+		    print $outhandle "Parse Warning: Did not find pre-existing rule $marc_info to remove";
+		    print $outhandle " on line $l of $mm_file:\n";
+		    print $outhandle "  $line\n";
+		}
+	    }
+	    elsif ($line =~ m/^(.*?)->\s*([\w\.\^]+)$/)
+	    {
+		my $lhs = $1;
+		my $gsdl_info = $2;
+
+		my @fields = split(/,\s*/,$lhs);
+		my $f;
+		while ($f  = shift (@fields)) {
+		    $f =~ s/\s+$//; # remove any white space at end of line
+
+		    if ($f =~ m/^(\d+)\-(\d+)$/) {
+			# number range => generate number in range and
+			# push on to array
+			push(@fields,$1..$2);
+			next;
+		    }
+
+		    if ($f =~ m/^(\d+)((?:(?:\$|\^)\w)*)\s*$/) {
+
+			my $marc_info = $1;
+			my $opt_sub_fields = $2;
+
+			if ($opt_sub_fields ne "") {			
+			    my @sub_fields = split(/\$|\^/,$opt_sub_fields);
+			    shift @sub_fields; # skip first entry, which is blank
+
+			    foreach my $sub_field (@sub_fields) {
+				$metadata_mapping->{$marc_info."\$".$sub_field} = $gsdl_info;
+			    }
+			}
+			else {
+			    # no subfields to worry about
+			    $marc_info =~ s/\^/\$/;
+			    $metadata_mapping->{$marc_info} = $gsdl_info;
+			}
+		    }
+		    else {
+			$parse_error_count++;
+		    }
+		}
+	    }
+	    else
+	    {
+		$parse_error_count++;
+	    }
+
+	    if ($parse_error_count>0) {
+		
+		print $outhandle "Parse Error: $parse_error_count syntax error(s) on line $l of $mm_file:\n";
+		print $outhandle "  $line\n";
+	    }
+	}
+	close(MMIN);
+    }
+    else
+    {
+	print $outhandle "Unable to open $mm_file: $!\n";
+    }
+}
+
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/metadatautil.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/metadatautil.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/metadatautil.pm	(revision 24799)
@@ -0,0 +1,144 @@
+###########################################################################
+#
+# metadatautil.pm -- various useful utilities for dealing with metadata
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2006 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package metadatautil;
+
+use strict;
+
+sub combine_metadata_structures { 
+    my ($mdref1, $mdref2) = @_;
+    my ($key, $value1, $value2);
+
+    foreach $key (keys %$mdref2) {
+
+	$value1 = $mdref1->{$key};
+	$value2 = $mdref2->{$key};
+	
+	# If there is no existing value for this metadata field in 
+	# $mdref1, so we simply copy the value from $mdref2 over.
+	if (!defined $value1) {
+	    $mdref1->{$key} = &clonedata($value2);
+	} 
+	# Otherwise we have to add the new values to the existing ones.
+	# If the second structure is accumulated, then acculate all the
+	# values into the first structure
+	elsif ((ref $value2) eq "ARRAY") {
+	    # If the first metadata element is a scalar we have to 
+	    # convert it into an array before we add anything more.
+	    if ((ref $value1) ne 'ARRAY') {
+		$mdref1->{$key} = [$value1];
+		$value1 = $mdref1->{$key};
+	    }
+	    # Now add the value(s) from the second array to the first
+	    $value2 = &clonedata($value2);
+	    push @$value1, @$value2;
+	} 
+	# Finally, If the second structure is not an array reference, we
+	# know it is in override mode, so override the first structure.
+	else {
+	    $mdref1->{$key} = &clonedata($value2);
+	}
+    }
+}
+
+
+# Make a "cloned" copy of a metadata value.  
+# This is trivial for a simple scalar value,
+# but not for an array reference.
+
+sub clonedata {
+    my ($value) = @_;
+    my $result;
+
+    if ((ref $value) eq 'ARRAY') {
+	$result = [];
+	foreach my $item (@$value) {
+	    push @$result, $item;
+	}
+    } else {
+	$result = $value;
+    }
+    return $result;
+}
+
+sub format_metadata_as_table {
+    my ($metadata, $remove_namespace) = @_;
+    
+    my $text = "<table cellpadding=\"4\" cellspacing=\"0\">\n";
+    
+    foreach my $field (sort keys(%$metadata)) {
+	# $metadata->{$field} may be an array reference
+	if ($field eq "gsdlassocfile_tobe") {
+	    # ignore
+	} else {
+	    my $no_ns = $field;
+	    if ($remove_namespace) {
+		$no_ns =~ s/^\w+\.//;
+	    }
+	    if (ref ($metadata->{$field}) eq "ARRAY") {
+		map { 
+		    $text .= "<tr><td valign=top><nobr><b>$no_ns</b></nobr></td><td>".$_."</td></tr>";
+		} @{$metadata->{$field}};
+	    } else {
+		$text .= "<tr><td valign=top><nobr><b>$no_ns</b></nobr></td><td valign=top>$metadata->{$field}</td></tr>\n";
+	    }
+	}
+
+    }
+    $text .= "</table>\n";
+    return $text;
+}
+
+
+sub store_saved_metadata
+{
+    my ($plug,$mname,$mvalue,$md_accumulate) = @_;
+
+    if (defined $plug->{'saved_metadata'}->{$mname}) {
+	if ($md_accumulate) {
+	    # accumulate mode - add value to existing value(s)
+	    if (ref ($plug->{'saved_metadata'}->{$mname}) eq "ARRAY") {
+		push (@{$plug->{'saved_metadata'}->{$mname}}, $mvalue);
+	    } else {
+		$plug->{'saved_metadata'}->{$mname} = 
+		    [$plug->{'saved_metadata'}->{$mname}, $mvalue];
+	    }
+	} else {
+	    # override mode
+	    $plug->{'saved_metadata'}->{$mname} = $mvalue;
+	}
+    } else {
+	if ($md_accumulate) {
+	    # accumulate mode - add value into (currently empty) array
+	    $plug->{'saved_metadata'}->{$mname} = [$mvalue];
+	} else {
+	    # override mode
+	    $plug->{'saved_metadata'}->{$mname} = $mvalue;
+	}
+    }
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/mgbuilder.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/mgbuilder.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/mgbuilder.pm	(revision 24799)
@@ -0,0 +1,591 @@
+###########################################################################
+#
+# mgbuilder.pm -- MGBuilder object
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package mgbuilder;
+
+use basebuilder;
+use plugin;
+use strict; no strict 'refs';
+use util;
+
+
+BEGIN {
+    @mgbuilder::ISA = ('basebuilder');
+}
+
+
+my %wanted_index_files = ('td'=>1,
+		       't'=>1,
+		       'idb'=>1,
+		       'ib1'=>1,
+		       'ib2'=>1,
+		       'ib3'=>1,
+		       'i'=>1,
+		       'ip'=>1,
+		       'tiw'=>1,
+		       'wa'=>1);
+
+my $maxdocsize = $basebuilder::maxdocsize;
+
+
+sub new {
+    my $class = shift(@_);
+
+    my $self = new basebuilder (@_);
+    $self = bless $self, $class;
+
+    $self->{'buildtype'} = "mg";
+    return $self;
+}
+
+sub default_buildproc {
+    my $self  = shift (@_);
+
+    return "mgbuildproc";
+}
+
+sub generate_index_list {
+    my $self = shift (@_);
+
+    if (!defined($self->{'collect_cfg'}->{'indexes'})) {
+	$self->{'collect_cfg'}->{'indexes'} = [];
+    }
+    if (scalar(@{$self->{'collect_cfg'}->{'indexes'}}) == 0) {
+	# no indexes have been specified so we'll build a "dummy:text" index
+	push (@{$self->{'collect_cfg'}->{'indexes'}}, "dummy:text");	
+    }
+    # remove any ex. but only if there are no other metadata prefixes
+    my @orig_indexes = @{$self->{'collect_cfg'}->{'indexes'}};
+    $self->{'collect_cfg'}->{'indexes'} = [];
+    foreach my $index (@orig_indexes) {
+	#$index =~ s/ex\.([^.,:]+)(,|:|$)/$1$2/g; # doesn't preserve flex.Image, which is turned into fl.Image 
+	$index =~ s/(,|:)/$1 /g;
+	$index =~ s/(^| )ex\.([^.,:]+)(,|:|$)/$1$2$3/g;
+	$index =~ s/(,|:) /$1/g;
+
+	push (@{$self->{'collect_cfg'}->{'indexes'}}, $index);
+    }
+}
+
+sub generate_index_options {
+    my $self = shift (@_);
+    $self->SUPER::generate_index_options();
+    
+    $self->{'casefold'} = 0;
+    $self->{'stem'} = 0;
+    $self->{'accentfold'} = 0; #not yet implemented for mg
+    
+    if (!defined($self->{'collect_cfg'}->{'indexoptions'})) {
+	# just use default options
+	$self->{'casefold'} = 1;
+	$self->{'stem'} = 1;
+	
+    } else {
+	foreach my $option (@{$self->{'collect_cfg'}->{'indexoptions'}}) {
+	    if ($option =~ /stem/) {
+		$self->{'stem'} = 1;
+	    } elsif ($option =~ /casefold/) {
+		$self->{'casefold'} = 1;
+	    }
+	}
+    }
+    
+    # now we record this for the build cfg
+    $self->{'stemindexes'} = 0;
+    if ($self->{'casefold'}) {
+	$self->{'stemindexes'} += 1;
+    }
+    if ($self->{'stem'}) {
+	$self->{'stemindexes'} += 2;
+    }
+
+
+}
+
+sub compress_text {
+    my $self = shift (@_);
+    my ($textindex) = @_;
+    my $exedir = "$ENV{'GSDLHOME'}/bin/$ENV{'GSDLOS'}";
+    my $exe = &util::get_os_exe ();
+    my $mg_passes_exe = &util::filename_cat($exedir, "mg_passes$exe");
+    my $mg_compression_dict_exe = &util::filename_cat($exedir, "mg_compression_dict$exe");
+    my $outhandle = $self->{'outhandle'};
+
+    my $maxnumeric = $self->{'maxnumeric'};
+
+    &util::mk_all_dir (&util::filename_cat($self->{'build_dir'}, "text"));
+
+    my $collect_tail = &util::get_dirsep_tail($self->{'collection'});
+    my $basefilename = &util::filename_cat("text",$collect_tail);
+    my $fulltextprefix = &util::filename_cat ($self->{'build_dir'}, $basefilename);
+
+    my $osextra = "";
+    if ($ENV{'GSDLOS'} =~ /^windows$/i) {
+	$fulltextprefix =~ s@/@\\@g;
+    } else {
+	$osextra = " -d /";
+    }
+
+    print $outhandle "\n*** creating the compressed text\n" if ($self->{'verbosity'} >= 1);
+    print STDERR "<Stage name='CompressText'>\n" if $self->{'gli'};
+
+    # collect the statistics for the text
+    # -b $maxdocsize sets the maximum document size to be 12 meg
+    print $outhandle "\n    collecting text statistics\n"  if ($self->{'verbosity'} >= 1);
+    print STDERR "<Phase name='CollectTextStats'/>\n" if $self->{'gli'};
+
+    my ($handle);
+    if ($self->{'debug'}) {
+	$handle = *STDOUT;
+    }
+    else {
+	if (!-e "$mg_passes_exe" || 
+	    !open($handle, "| mg_passes$exe -f \"$fulltextprefix\" -b $maxdocsize -T1 -M $maxnumeric $osextra")) {
+	    print STDERR "<FatalError name='NoRunMGPasses'>\n</Stage>\n" if $self->{'gli'};
+	    die "mgbuilder::compress_text - couldn't run $mg_passes_exe\n";
+	}
+    }
+
+    $self->{'buildproc'}->set_output_handle ($handle);
+    $self->{'buildproc'}->set_mode ('text');
+    $self->{'buildproc'}->set_index ($textindex);
+    $self->{'buildproc'}->set_indexing_text (0);
+
+
+    if ($self->{'no_text'}) {
+	$self->{'buildproc'}->set_store_text(0);
+    } else {
+	$self->{'buildproc'}->set_store_text(1);
+    }
+    $self->{'buildproc'}->reset();
+
+    &plugin::begin($self->{'pluginfo'}, $self->{'source_dir'}, 
+		   $self->{'buildproc'}, $self->{'maxdocs'});
+    &plugin::read ($self->{'pluginfo'}, $self->{'source_dir'}, 
+		   "", {}, {}, $self->{'buildproc'}, $self->{'maxdocs'}, 0, $self->{'gli'});
+    &plugin::end($self->{'pluginfo'});
+    
+
+    close ($handle) unless $self->{'debug'};
+
+    $self->print_stats();
+
+    # create the compression dictionary
+    # the compression dictionary is built by assuming the stats are from a seed
+    # dictionary (-S), if a novel word is encountered it is spelled out (-H),
+    # and the resulting dictionary must be less than 5 meg with the most frequent
+    # words being put into the dictionary first (-2 -k 5120)
+    if (!$self->{'debug'}) {
+	print $outhandle "\n    creating the compression dictionary\n"  if ($self->{'verbosity'} >= 1);
+	print STDERR "<Phase name='CreatingCompress'/>\n" if $self->{'gli'};
+	if (!-e "$mg_compression_dict_exe") {
+	    die "mgbuilder::compress_text - couldn't run $mg_compression_dict_exe\n";
+	}
+	system ("mg_compression_dict$exe -f \"$fulltextprefix\" -S -H -2 -k 5120 $osextra");
+
+	# -b $maxdocsize sets the maximum document size to be 12 meg
+	if (!-e "$mg_passes_exe" || 
+	    !open ($handle, "| mg_passes$exe -f \"$fulltextprefix\" -b $maxdocsize -T2 -M $maxnumeric $osextra")) {
+	    print STDERR "<FatalError name='NoRunMGPasses'/>\n</Stage>\n" if $self->{'gli'};
+	    die "mgbuilder::compress_text - couldn't run $mg_passes_exe\n";
+	}
+    }
+    else {
+	print STDERR "<Phase name='SkipCreatingComp'/>\n" if $self->{'gli'};
+    }
+
+    $self->{'buildproc'}->set_output_handle ($handle);
+    $self->{'buildproc'}->reset();
+
+    # compress the text
+    print $outhandle "\n    compressing the text\n"  if ($self->{'verbosity'} >= 1);
+    print STDERR "<Phase name='CompressingText'/>\n" if $self->{'gli'};
+
+    &plugin::read ($self->{'pluginfo'}, $self->{'source_dir'}, 
+		   "", {}, {}, $self->{'buildproc'}, $self->{'maxdocs'}, 0, $self->{'gli'});
+
+    close ($handle) unless $self->{'debug'};
+
+    $self->print_stats();
+    print STDERR "</Stage>\n" if $self->{'gli'};
+}
+
+
+# creates directory names for each of the index descriptions
+sub create_index_mapping {
+    my $self = shift (@_);
+    my ($indexes) = @_;
+
+    my %mapping = ();
+    $mapping{'indexmaporder'} = [];
+    $mapping{'subcollectionmaporder'} = [];
+    $mapping{'languagemaporder'} = [];
+    
+    # dirnames is used to check for collisions. Start this off
+    # with the manditory directory names
+    my %dirnames = ('text'=>'text',
+		    'extra'=>'extra');
+    my %pnames = ('index' => {}, 'subcollection' => {}, 'languages' => {});
+    foreach my $index (@$indexes) {
+	my ($level, $gran, $subcollection, $languages) = split (":", $index);
+
+	# the directory name starts with the first character of the index level
+	my ($pindex) = $level =~ /^(.)/;
+
+	# next comes a processed version of the index
+	$pindex .= $self->process_field ($gran); 
+	$pindex = lc ($pindex);
+
+	# next comes a processed version of the subcollection if there is one.
+	my $psub = $self->process_field ($subcollection);
+	$psub = lc ($psub);
+
+	# next comes a processed version of the language if there is one.
+	my $plang = $self->process_field ($languages);
+	$plang = lc ($plang);
+
+	my $dirname = $pindex . $psub . $plang;
+
+	# check to be sure all index names are unique
+	while (defined ($dirnames{$dirname})) {
+	    $dirname = $self->make_unique (\%pnames, $index, \$pindex, \$psub, \$plang);
+	}
+	$mapping{$index} = $dirname;
+
+	# store the mapping orders as well as the maps
+	# also put index, subcollection and language fields into the mapping thing - 
+	# (the full index name (eg document:text:subcol:lang) is not used on
+	# the query page) -these are used for collectionmeta later on
+	if (!defined $mapping{'indexmap'}{"$level:$gran"}) {
+	    $mapping{'indexmap'}{"$level:$gran"} = $pindex;
+	    push (@{$mapping{'indexmaporder'}}, "$level:$gran");
+	    if (!defined $mapping{"$level:$gran"}) {
+		$mapping{"$level:$gran"} = $pindex;
+	    }
+	}
+	if ($psub =~ /\w/ && !defined ($mapping{'subcollectionmap'}{$subcollection})) {
+	    $mapping{'subcollectionmap'}{$subcollection} = $psub;
+	    push (@{$mapping{'subcollectionmaporder'}}, $subcollection);
+	    $mapping{$subcollection} = $psub;
+	}
+	if ($plang =~ /\w/ && !defined ($mapping{'languagemap'}{$languages})) {
+	    $mapping{'languagemap'}{$languages} = $plang;
+	    push (@{$mapping{'languagemaporder'}}, $languages);
+	    $mapping{$languages} = $plang;
+	}
+	$dirnames{$dirname} = $index;
+	$pnames{'index'}->{$pindex} = "$level:$gran";
+	$pnames{'subcollection'}->{$psub} = $subcollection;
+	$pnames{'languages'}->{$plang} = $languages;
+    }
+
+    return \%mapping;
+}
+
+
+sub make_unique {
+    my $self = shift (@_);
+    my ($namehash, $index, $indexref, $subref, $langref) = @_;
+    my ($level, $gran, $subcollection, $languages) = split (":", $index);
+
+    if ($namehash->{'index'}->{$$indexref} ne "$level:$gran") {
+	$self->get_next_version ($indexref);
+    } elsif ($namehash->{'subcollection'}->{$$subref} ne $subcollection) {
+	$self->get_next_version ($subref);
+    } elsif ($namehash->{'languages'}->{$$langref} ne $languages) {
+	$self->get_next_version ($langref);
+    }
+    return "$$indexref$$subref$$langref";
+}	
+
+sub build_index {
+    my $self = shift (@_);
+    my ($index) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    # get the full index directory path and make sure it exists
+    my $indexdir = $self->{'index_mapping'}->{$index};
+    &util::mk_all_dir (&util::filename_cat($self->{'build_dir'}, $indexdir));
+
+    my $collect_tail = &util::get_dirsep_tail($self->{'collection'});
+    my $fullindexprefix = &util::filename_cat ($self->{'build_dir'}, $indexdir, 
+					       $collect_tail);
+    my $fulltextprefix = &util::filename_cat ($self->{'build_dir'}, "text", 
+					       $collect_tail);
+
+    # get any os specific stuff
+    my $exedir = "$ENV{'GSDLHOME'}/bin/$ENV{'GSDLOS'}";
+    my $exe = &util::get_os_exe ();
+    my $mg_passes_exe = &util::filename_cat($exedir, "mg_passes$exe");
+    my $mg_perf_hash_build_exe = 
+	&util::filename_cat($exedir, "mg_perf_hash_build$exe");
+    my $mg_weights_build_exe = 
+	&util::filename_cat ($exedir, "mg_weights_build$exe");
+    my $mg_invf_dict_exe = 
+	&util::filename_cat ($exedir, "mg_invf_dict$exe");
+    my $mg_stem_idx_exe =
+	&util::filename_cat ($exedir, "mg_stem_idx$exe");
+
+    my $maxnumeric = $self->{'maxnumeric'};
+
+    my $osextra = "";
+    if ($ENV{'GSDLOS'} =~ /^windows$/i) {
+	$fullindexprefix =~ s@/@\\@g;
+    } else {
+	$osextra = " -d /";
+	if ($outhandle ne "STDERR") {
+	    # so mg_passes doesn't print to stderr if we redirect output
+	    $osextra .= " 2>/dev/null";
+	}
+    }
+
+    # get the index level from the index description
+    # the index will be level 2 unless we are building a
+    # paragraph level index
+    my $index_level = 2;
+    $index_level = 3 if $index =~ /^paragraph/i;
+
+    # get the index expression if this index belongs
+    # to a subcollection
+    my $indexexparr = [];
+    my $langarr = [];
+    # there may be subcollection info, and language info. 
+    my ($level, $fields, $subcollection, $language) = split (":", $index);
+    my @subcollections = ();
+    @subcollections = split /,/, $subcollection if (defined $subcollection);
+
+    foreach my $subcollection (@subcollections) {
+	if (defined ($self->{'collect_cfg'}->{'subcollection'}->{$subcollection})) {
+	    push (@$indexexparr, $self->{'collect_cfg'}->{'subcollection'}->{$subcollection});
+	} 
+    }
+    
+    # add expressions for languages if this index belongs to
+    # a language subcollection - only put languages expressions for the 
+    # ones we want in the index
+
+    my @languages = ();
+    my $languagemetadata = "Language";
+    if (defined ($self->{'collect_cfg'}->{'languagemetadata'})) {
+	$languagemetadata = $self->{'collect_cfg'}->{'languagemetadata'};
+    }
+    @languages = split /,/, $language if (defined $language);
+    foreach my $language (@languages) {
+	my $not=0;
+	if ($language =~ s/^\!//) {
+	    $not = 1;
+	}
+	if($not) {
+	    push (@$langarr, "!$language");
+	} else {
+	    push (@$langarr, "$language");
+	}
+    }
+    
+    # Build index dictionary. Uses verbatim stem method
+    print $outhandle "\n    creating index dictionary\n"  if ($self->{'verbosity'} >= 1);
+    print STDERR "<Phase name='CreatingIndexDic'/>\n" if $self->{'gli'};
+    my ($handle);
+    if ($self->{'debug'}) {
+	$handle = *STDOUT;
+    }
+    else {
+	if (!-e "$mg_passes_exe" || 
+	    !open($handle, "| mg_passes$exe -f \"$fullindexprefix\" -b $maxdocsize " .
+		   "-$index_level -m 32 -s 0 -G -t 10 -N1 -M $maxnumeric $osextra")) {
+	    print STDERR "<FatalError name='NoRunMGPasses'/>\n</Stage>\n" if $self->{'gli'};
+	    die "mgbuilder::build_index - couldn't run $mg_passes_exe\n";
+	}
+    }
+	
+    # set up the document processor
+    $self->{'buildproc'}->set_output_handle ($handle);
+    $self->{'buildproc'}->set_mode ('text');
+    $self->{'buildproc'}->set_index ($index, $indexexparr);
+    $self->{'buildproc'}->set_index_languages ($languagemetadata, $langarr) if (defined $language);
+    $self->{'buildproc'}->set_indexing_text (1);
+    $self->{'buildproc'}->set_store_text(1);
+
+    $self->{'buildproc'}->reset();
+    &plugin::read ($self->{'pluginfo'}, $self->{'source_dir'}, 
+		   "", {}, {}, $self->{'buildproc'}, $self->{'maxdocs'},0, $self->{'gli'});
+    close ($handle) unless $self->{'debug'};
+
+    $self->print_stats();
+
+    # now we check to see if the required files have been produced - if not we quit building this index so the whole process doesn't crap out.
+    # we check on the .id file - index dictionary
+    my $dict_file = "$fullindexprefix.id";
+    if (!-e $dict_file) {
+	print $outhandle "mgbuilder::build_index - Couldn't create index $index\n";
+	$self->{'notbuilt'}->{$index}=1;
+	return;
+    }
+    if (!$self->{'debug'}) {
+	# create the perfect hash function
+	if (!-e "$mg_perf_hash_build_exe") {
+	    print STDERR "<FatalError name='NoRunMGHash'/>\n</Stage>\n" if $self->{'gli'};
+	    die "mgbuilder::build_index - couldn't run $mg_perf_hash_build_exe\n";
+	}
+	system ("mg_perf_hash_build$exe -f \"$fullindexprefix\" $osextra");
+
+	if (!-e "$mg_passes_exe" || 
+	    !open ($handle, "| mg_passes$exe -f \"$fullindexprefix\" -b $maxdocsize " .
+		   "-$index_level -c 3 -G -t 10 -N2 -M $maxnumeric $osextra")) {
+	    print STDERR "<FatalError name='NoRunMGPasses'/>\n</Stage>\n" if $self->{'gli'};
+	    die "mgbuilder::build_index - couldn't run $mg_passes_exe\n";
+	}
+    }
+    
+    # invert the text
+    print $outhandle "\n    inverting the text\n"  if ($self->{'verbosity'} >= 1);
+    print STDERR "<Phase name='InvertingText'/>\n" if $self->{'gli'};
+
+    $self->{'buildproc'}->set_output_handle ($handle);
+    $self->{'buildproc'}->reset();
+
+    &plugin::read ($self->{'pluginfo'}, $self->{'source_dir'}, 
+		   "", {}, {}, $self->{'buildproc'}, $self->{'maxdocs'},0, $self->{'gli'});
+
+   
+    $self->print_stats ();
+
+    if (!$self->{'debug'}) {
+
+	close ($handle);
+	
+	# create the weights file
+	print $outhandle "\n    create the weights file\n"  if ($self->{'verbosity'} >= 1);
+	print STDERR "<Phase name='CreateTheWeights'/>\n" if $self->{'gli'};
+	if (!-e "$mg_weights_build_exe") {
+	    print STDERR "<FatalError name='NoRunMGWeights'/>\n</Stage>\n" if $self->{'gli'};
+	    die "mgbuilder::build_index - couldn't run $mg_weights_build_exe\n";
+	}
+	system ("mg_weights_build$exe -f \"$fullindexprefix\" -t \"$fulltextprefix\" $osextra");
+
+	# create 'on-disk' stemmed dictionary
+	print $outhandle "\n    creating 'on-disk' stemmed dictionary\n"  if ($self->{'verbosity'} >= 1);
+	print STDERR "<Phase name='CreateStemmedDic'/>\n" if $self->{'gli'};
+	if (!-e "$mg_invf_dict_exe") {
+	    print STDERR "<FatalError name='NoRunMGInvf'/>\n</Stage>\n" if $self->{'gli'};
+	    die "mgbuilder::build_index - couldn't run $mg_invf_dict_exe\n";
+	}
+	system ("mg_invf_dict$exe -f \"$fullindexprefix\" $osextra");
+
+
+	# creates stem index files for the various stemming methods
+	print $outhandle "\n    creating stem indexes\n"  if ($self->{'verbosity'} >= 1);
+	print STDERR "<Phase name='CreatingStemIndx'/>\n" if $self->{'gli'};
+	if (!-e "$mg_stem_idx_exe") {
+	    print STDERR "<FatalError name='NoRunMGStem'/>\n</Stage>\n" if $self->{'gli'};
+	    die "mgbuilder::build_index - couldn't run $mg_stem_idx_exe\n";
+	}
+	# currently mg wont work if we don't generate all the stem idexes
+	# so we generate them whatever, but don't advertise the fact
+	#if ($self->{'casefold'}) {
+	system ("mg_stem_idx$exe -b 4096 -s1 -f \"$fullindexprefix\" $osextra");
+	#}
+	#if ($self->{'stem'}) {
+	system ("mg_stem_idx$exe -b 4096 -s2 -f \"$fullindexprefix\" $osextra");
+	#}
+	#if ($self->{'casefold'} && $self->{'stem'}) {
+	system ("mg_stem_idx$exe -b 4096 -s3 -f \"$fullindexprefix\" $osextra");
+	#}
+
+	# remove unwanted files
+	my $tmpdir = &util::filename_cat ($self->{'build_dir'}, $indexdir);
+	opendir (DIR, $tmpdir) || die
+	    "mgbuilder::build_index - couldn't read directory $tmpdir\n";
+	foreach my $file (readdir(DIR)) {
+	    next if $file =~ /^\./;
+	    my ($suffix) = $file =~ /\.([^\.]+)$/;
+	    if (defined $suffix && !defined $wanted_index_files{$suffix}) {
+		# delete it!
+		print $outhandle "deleting $file\n" if $self->{'verbosity'} > 2;
+		&util::rm (&util::filename_cat ($tmpdir, $file));
+	    }
+	}
+	closedir (DIR);
+    }
+    print STDERR "</Stage>\n" if $self->{'gli'};
+}
+
+sub build_cfg_extra {
+   my $self = shift(@_);
+   my ($build_cfg) = @_;
+   
+    # get additional stats from mg
+    my $exedir = "$ENV{'GSDLHOME'}/bin/$ENV{'GSDLOS'}";
+    my $exe = &util::get_os_exe ();
+    my $mgstat_exe = &util::filename_cat($exedir, "mgstat$exe");
+
+    my $collect_tail = &util::get_dirsep_tail($self->{'collection'});
+    my $input_file = &util::filename_cat ("text", $collect_tail);
+    if (!-e "$mgstat_exe" || !open (PIPEIN, "mgstat$exe -d \"$self->{'build_dir'}\" -f \"$input_file\" |")) {
+	my $outhandle = $self->{'outhandle'};
+	print $outhandle "Warning: Couldn't open pipe to $mgstat_exe to get additional stats\n";
+    } else {
+	my $line = "";
+	while (defined ($line = <PIPEIN>)) {
+	    if ($line =~ /^Words in collection \[dict\]\s+:\s+(\d+)/) {
+		($build_cfg->{'numwords'}) = $1;
+	    } elsif ($line =~ /^Documents\s+:\s+(\d+)/) {
+		($build_cfg->{'numsections'}) = $1;
+	    }
+	}
+	close PIPEIN;
+    }
+}
+
+# MG is the most 'complex' recipe we currently support. While the compress text
+# and infodb phases can be run in parallel, the indexes cannot be built until
+# after the compress text phase is complete.
+sub prepare_build_recipe
+{
+  my ($self, $collection, $recipe) = @_;
+  my $outhandle = $self->{'outhandle'};
+  my $verbosity = $self->{'verbosity'};
+  # 1. We start by building up the array of indexes, as we'll need to add them
+  #    as child tasks to the compress text phase
+  my $index_tasks = ();
+  my $indexes = $self->{'collect_cfg'}->{'indexes'};
+  foreach my $index (@{$indexes})
+  {
+    push(@{$index_tasks}, {'command'=>'buildcol.pl -keepold -verbosity ' . $verbosity . ' -mode build_index -indexname ' . $index . ' ' . $collection});
+  }
+  # 2. Compressing the text - this time with dependent tasks
+  push(@{$recipe}, {
+                    'command'=>'buildcol.pl -keepold -verbosity ' . $verbosity . ' -mode compress_text ' . $collection,
+                    'children'=>$index_tasks
+                   });
+  # 3. Info database building
+  push(@{$recipe}, {'command'=>'buildcol.pl -keepold -verbosity ' . $verbosity . ' -mode infodb ' . $collection});
+  # Complete!
+}
+
+1;
+
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/mgbuildproc.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/mgbuildproc.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/mgbuildproc.pm	(revision 24799)
@@ -0,0 +1,143 @@
+###########################################################################
+#
+# mgbuildproc.pm -- 
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# This document processor outputs a document
+# for mg to process
+
+package mgbuildproc;
+
+
+use basebuildproc;
+use strict;
+
+
+BEGIN {
+    @mgbuildproc::ISA = ('basebuildproc');
+}
+
+sub new {
+    my $class = shift @_;
+    my $self = new basebuildproc (@_);
+    return bless $self, $class;
+}
+
+
+sub find_paragraphs {
+    $_[1] =~ s/(<p\b)/\cC$1/gi;
+}
+
+sub text {
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+    my $handle = $self->{'output_handle'};
+    
+    # only output this document if it is one to be indexed
+    return if ($doc_obj->get_doc_type() ne "indexed_doc");
+    
+    # see if this document belongs to this subcollection
+    my $indexed_doc = $self->is_subcollection_doc($doc_obj);
+
+    # this is another document
+    $self->{'num_docs'} += 1;
+
+    # get the parameters for the output
+    my ($level, $fields) = split (/:/, $self->{'index'});
+    $fields =~ s/\ball\b/Title,Creator,text/;
+    $fields =~ s/\btopall\b/topTitle,topCreator,toptext/;
+
+    my $doc_section = 0; # just for this document
+    my $text = "";
+    my $text_extra = "";
+
+    # get the text for this document
+    my $section = $doc_obj->get_top_section();
+    while (defined $section) {
+	# update a few statistics
+	$doc_section++;
+	$self->{'num_sections'} += 1;
+
+	my $indexed_section = $doc_obj->get_metadata_element($section, "gsdldoctype") || "indexed_section";
+	if (($indexed_doc) && ($indexed_section eq "indexed_section" || $indexed_section eq "indexed_doc")) {
+	    $self->{'num_bytes'} += $doc_obj->get_text_length ($section);
+	    foreach my $field (split (/,/, $fields)) {
+		# only deal with this field if it doesn't start with top or
+		# this is the first section
+		my $real_field = $field;
+		if (!($real_field =~ s/^top//) || ($doc_section == 1)) {
+		    my $new_text = "";
+		    if ($level eq "dummy") {
+			# a dummy index is a special case used when no
+			# indexes are specified (since there must always be
+			# at least one index or we can't retrieve the
+			# compressed text) - we add a small amount of text
+			# to these dummy indexes which will never be seen
+			# but will overcome mg's problems with building
+			# empty indexes
+			$new_text = "this is dummy text to stop mg barfing";
+			$self->{'num_processed_bytes'} += length ($new_text);
+
+		    } elsif ($real_field eq "text") {
+			$new_text = $doc_obj->get_text ($section) if $self->{'store_text'};
+			$self->{'num_processed_bytes'} += length ($new_text);
+			$new_text =~ s/[\cB\cC]//g;
+			$self->find_paragraphs($new_text);
+			
+		    } else {
+			my $first = 1;
+			$real_field =~ s/^ex\.([^.]+)$/$1/; # remove ex. namespace iff it's the only namespace prefix (will leave ex.dc.* intact)
+			my @section_metadata = @{$doc_obj->get_metadata ($section, $real_field)};
+			if ($level eq "section" && $section ne $doc_obj->get_top_section() && $self->{'indexing_text'} && defined ($self->{'sections_index_document_metadata'})) {
+			    if ($self->{'sections_index_document_metadata'} eq "always" || ( scalar(@section_metadata) == 0 && $self->{'sections_index_document_metadata'} eq "unless_section_metadata_exists")) {
+				push (@section_metadata, @{$doc_obj->get_metadata ($doc_obj->get_top_section(), $real_field)});
+			    }
+			}
+			foreach my $meta (@section_metadata) {
+			    $meta =~ s/[\cB\cC]//g;
+			    $self->{'num_processed_bytes'} += length ($meta);
+			    $new_text .= "\cC" unless $first;
+			    $new_text .= $meta if $self->{'store_text'};
+			    $first = 0;
+			}
+		    }
+		    
+		    # filter the text
+		    $new_text = $self->filter_text ($field, $new_text);
+
+		    $text .= "$new_text\cC";
+		}
+	    }
+	}
+	
+	if ($level eq "document") { $text_extra .= "\cB"; }
+	else { $text .= "\cB"; }
+	
+	$section = $doc_obj->get_next_section($section);
+    }
+
+    print $handle "$text$text_extra";
+}
+
+1;
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/mgppbuilder.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/mgppbuilder.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/mgppbuilder.pm	(revision 24799)
@@ -0,0 +1,859 @@
+###########################################################################
+#
+# mgppbuilder.pm -- MGBuilder object
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package mgppbuilder;
+
+use basebuilder;
+use colcfg;
+use plugin;
+use strict; no strict 'refs';
+use util;
+
+
+sub BEGIN {
+    @mgppbuilder::ISA = ('basebuilder');
+}
+
+
+
+our %level_map = ('document'=>'Doc',
+	      'section'=>'Sec',
+	      'paragraph'=>'Para',
+	      'Doc'=>'_textdocument_',
+	      'Sec'=>'_textsection_',
+	      'Para'=>'_textparagraph_');
+
+our %wanted_index_files = ('td'=>1,
+		       't'=>1,
+		       'tl'=>1,
+		       'ti'=>1,
+		       'idb'=>1,
+		       'ib1'=>1,
+		       'ib2'=>1,
+		       'ib3'=>1,
+		       'ib4'=>1,
+		       'ib5'=>1,
+		       'ib6'=>1,
+		       'ib7'=>1,
+		       'i'=>1,
+		       'il'=>1,
+		       'w'=>1,
+		       'wa'=>1);
+
+
+my $maxdocsize = $basebuilder::maxdocsize;
+
+sub new {
+    my $class = shift(@_);
+
+    my $self = new basebuilder (@_);
+    $self = bless $self, $class;
+
+    #$self->{'indexfieldmap'} = \%static_indexfield_map;
+
+    # get the levels (Section, Paragraph) for indexing and compression
+    $self->{'levels'} = {};
+    $self->{'levelorder'} = ();
+    if (defined $self->{'collect_cfg'}->{'levels'}) {
+        foreach my $level ( @{$self->{'collect_cfg'}->{'levels'}} ){
+	    $level =~ tr/A-Z/a-z/;
+            $self->{'levels'}->{$level} = 1;
+	    push (@{$self->{'levelorder'}}, $level);
+        }
+    } else { # default to document
+	$self->{'levels'}->{'document'} = 1;
+	push (@{$self->{'levelorder'}}, 'document');
+    }
+    
+    $self->{'buildtype'} = "mgpp";
+
+    return $self;
+}
+
+sub generate_index_list {
+    my $self  = shift (@_);
+    
+    # sort out the indexes
+    #indexes are specified with spaces, but we put them into one index
+    my $indexes = $self->{'collect_cfg'}->{'indexes'};
+    if (defined $indexes) {
+	$self->{'collect_cfg'}->{'indexes'} = [];
+
+	# remove any ex. from index spec but iff it is the only namespace in the metadata name
+	my @indexes_copy = @$indexes; # make a copy, as 'map' changes entry in array
+	#map { $_ =~ s/(^|,|;)ex\.([^.]+)$/$1$2/; } @indexes_copy; # No. Will replace metanames like flex.Image with fl.Image
+	map { $_ =~ s/(,|;)/$1 /g; } @indexes_copy; # introduce a space after every separator
+	map { $_ =~ s/(^| )ex\.([^.,:]+)(,|;|$)/$1$2$3/g; } @indexes_copy; # replace all <ex.> at start of metanames or <, ex.> when in a comma separated list
+	map { $_ =~ s/(,|:) /$1/g; } @indexes_copy; # remove space introduced after every separator
+	my $single_index = join(';', @indexes_copy).";";
+
+	push (@{$self->{'collect_cfg'}->{'indexes'}}, $single_index);
+    }
+}
+
+sub generate_index_options {
+    my $self = shift (@_);
+
+    $self->SUPER::generate_index_options();
+
+    $self->{'casefold'} = 0;
+    $self->{'stem'} = 0;
+    $self->{'accentfold'} = 0; 
+    
+    if (!defined($self->{'collect_cfg'}->{'indexoptions'})) {
+	# just use default options
+	$self->{'casefold'} = 1;
+	$self->{'stem'} = 1;
+	$self->{'accentfold'} = 1;
+    } else {
+	foreach my $option (@{$self->{'collect_cfg'}->{'indexoptions'}}) {
+	    if ($option =~ /stem/) {
+		$self->{'stem'} = 1;
+	    } elsif ($option =~ /casefold/) {
+		$self->{'casefold'} = 1;
+	    } elsif ($option =~ /accentfold/) {
+		$self->{'accentfold'} = 1;
+	    }
+	}
+    }
+    
+    # now we record this for the build cfg
+    $self->{'stemindexes'} = 0;
+    if ($self->{'casefold'}) {
+	$self->{'stemindexes'} += 1;
+    }
+    if ($self->{'stem'}) {
+	$self->{'stemindexes'} += 2;
+    }
+    if ($self->{'accentfold'}) {
+	$self->{'stemindexes'} += 4;
+    }
+    
+}
+
+sub default_buildproc {
+    my $self  = shift (@_);
+
+    return "mgppbuildproc";
+}
+
+sub compress_text {
+
+    my $self = shift (@_);
+
+    # we don't do anything if we don't want compressed text
+    return if $self->{'no_text'};
+    
+    my ($textindex) = @_;
+
+    my $exedir = "$ENV{'GSDLHOME'}/bin/$ENV{'GSDLOS'}";
+    my $exe = &util::get_os_exe ();
+    my $mgpp_passes_exe = &util::filename_cat($exedir, "mgpp_passes$exe");
+    my $mgpp_compression_dict_exe = &util::filename_cat($exedir, "mgpp_compression_dict$exe");
+    my $outhandle = $self->{'outhandle'};
+
+    my $maxnumeric = $self->{'maxnumeric'};
+    
+    &util::mk_all_dir (&util::filename_cat($self->{'build_dir'}, "text"));
+
+    my $collect_tail = &util::get_dirsep_tail($self->{'collection'});
+    my $basefilename = &util::filename_cat("text",$collect_tail);
+    my $fulltextprefix = &util::filename_cat ($self->{'build_dir'}, $basefilename);
+    
+    my $osextra = "";
+    if ($ENV{'GSDLOS'} =~ /^windows$/i) {
+	$fulltextprefix =~ s@/@\\@g;
+    } 
+    else {
+	$osextra = " -d /";
+    }
+
+
+    # define the section names and possibly the doc name for mgpasses
+    # the compressor doesn't need to know about paragraphs - never want to 
+    # retrieve them
+    
+    # always use Doc and Sec levels
+    my $mgpp_passes_sections = "-J ". $level_map{"document"} ." -K " . $level_map{"section"} ." ";
+
+    print $outhandle "\n*** creating the compressed text\n" if ($self->{'verbosity'} >= 1);
+    print STDERR "<Stage name='CompressText'>\n" if $self->{'gli'};
+
+    # collect the statistics for the text
+    # -b $maxdocsize sets the maximum document size to be 12 meg
+    print $outhandle "\n    collecting text statistics (mgpp_passes -T1)\n"  if ($self->{'verbosity'} >= 1);
+    print STDERR "<Phase name='CollectTextStats'/>\n" if $self->{'gli'};
+
+    my ($handle);
+    if ($self->{'debug'}) {
+	$handle = *STDOUT;
+    }
+    else {
+	if (!-e "$mgpp_passes_exe" || 
+	    !open($handle, "| mgpp_passes$exe  -M $maxnumeric $mgpp_passes_sections -f \"$fulltextprefix\" -T1 $osextra")) {
+	    print STDERR "<FatalError name='NoRunMGPasses'>\n</Stage>\n" if $self->{'gli'};
+	    die "mgppbuilder::compress_text - couldn't run $mgpp_passes_exe\n";
+	}
+    }
+    
+    my $db_level = "section";
+
+    $self->{'buildproc'}->set_output_handle ($handle);
+    $self->{'buildproc'}->set_mode ('text');
+    $self->{'buildproc'}->set_index ($textindex);
+    $self->{'buildproc'}->set_indexing_text (0);
+    #$self->{'buildproc'}->set_indexfieldmap ($self->{'indexfieldmap'});
+    $self->{'buildproc'}->set_levels ($self->{'levels'});                      
+    $self->{'buildproc'}->set_db_level ($db_level);                       
+    $self->{'buildproc'}->reset();
+    &plugin::begin($self->{'pluginfo'}, $self->{'source_dir'}, 
+		   $self->{'buildproc'}, $self->{'maxdocs'});
+    &plugin::read ($self->{'pluginfo'}, $self->{'source_dir'}, 
+		   "", {}, {}, $self->{'buildproc'}, $self->{'maxdocs'}, 0, $self->{'gli'});
+    &plugin::end($self->{'pluginfo'});
+
+    close ($handle) unless $self->{'debug'};
+
+    $self->print_stats();
+
+    # create the compression dictionary
+    # the compression dictionary is built by assuming the stats are from a seed
+    # dictionary (-S), if a novel word is encountered it is spelled out (-H),
+    # and the resulting dictionary must be less than 5 meg with the most 
+    # frequent words being put into the dictionary first (-2 -k 5120)
+    # note: these options are left over from mg version
+    if (!$self->{'debug'}) {
+	print $outhandle "\n    creating the compression dictionary\n"  if ($self->{'verbosity'} >= 1);
+	print STDERR "<Phase name='CreatingCompress'/>\n" if $self->{'gli'};
+	if (!-e "$mgpp_compression_dict_exe") {
+	    print STDERR "<FatalError name='NoRunMGCompress'/>\n</Stage>\n" if $self->{'gli'};
+	    die "mgppbuilder::compress_text - couldn't run $mgpp_compression_dict_exe\n";
+	}
+	system ("mgpp_compression_dict$exe -f \"$fulltextprefix\" -S -H -2 -k 5120 $osextra");
+
+	if (!$self->{'debug'}) {
+	    if (!-e "$mgpp_passes_exe" || 
+		!open ($handle, "| mgpp_passes$exe  -M $maxnumeric $mgpp_passes_sections -f \"$fulltextprefix\" -T2 $osextra")) {
+		print STDERR "<FatalError name='NoRunMGPasses'/>\n</Stage>\n" if $self->{'gli'};
+		die "mgppbuilder::compress_text - couldn't run $mgpp_passes_exe\n";
+	    }
+	}
+    }
+    else {
+	print STDERR "<Phase name='SkipCreatingComp'/>\n" if $self->{'gli'};
+    }
+
+    $self->{'buildproc'}->set_output_handle ($handle);
+    $self->{'buildproc'}->reset();
+
+    # compress the text
+    print $outhandle "\n    compressing the text (mgpp_passes -T2)\n"  if ($self->{'verbosity'} >= 1);
+    print STDERR "<Phase name='CompressingText'/>\n" if $self->{'gli'};
+
+    &plugin::read ($self->{'pluginfo'}, $self->{'source_dir'}, 
+		   "", {}, {}, $self->{'buildproc'}, $self->{'maxdocs'}, 0, $self->{'gli'});
+    close ($handle) unless $self->{'debug'};
+
+    $self->print_stats();
+    print STDERR "</Stage>\n" if $self->{'gli'};
+}
+
+
+sub post_build_indexes {
+    my $self = shift(@_);
+
+    #define the final field lists
+    $self->make_final_field_list();
+}    
+
+# creates directory names for each of the index descriptions
+sub create_index_mapping {
+    my $self = shift (@_);
+    my ($indexes) = @_;
+
+    my %mapping = ();
+
+    return \%mapping if !(scalar @$indexes);
+
+    $mapping{'indexmaporder'} = [];
+    $mapping{'subcollectionmaporder'} = [];
+    $mapping{'languagemaporder'} = [];
+    
+    # dirnames is used to check for collisions. Start this off
+    # with the manditory directory names
+    my %dirnames = ('text'=>'text',
+		    'extra'=>'extra');
+    my %pnames = ('index' => {}, 'subcollection' => {}, 'languages' => {});
+
+    foreach my $index (@$indexes) {
+	my ($fields, $subcollection, $languages) = split (":", $index);
+	
+	# we only ever have one index, and its called 'idx'
+	my $pindex = 'idx';
+	
+	# next comes a processed version of the subcollection if there is one.
+	my $psub = $self->process_field ($subcollection);
+	$psub = lc ($psub);
+
+	# next comes a processed version of the language if there is one.
+	my $plang = $self->process_field ($languages);
+	$plang = lc ($plang);
+
+	my $dirname = $pindex . $psub . $plang;
+
+	# check to be sure all index names are unique
+	while (defined ($dirnames{$dirname})) {
+	    $dirname = $self->make_unique (\%pnames, $index, \$pindex, \$psub, \$plang);
+	}
+
+	$mapping{$index} = $dirname;
+
+	# store the mapping orders as well as the maps
+	# also put index, subcollection and language fields into the mapping thing - 
+	# (the full index name (eg text:subcol:lang) is not used on
+	# the query page) -these are used for collectionmeta later on
+	if (!defined $mapping{'indexmap'}{"$fields"}) {
+	    $mapping{'indexmap'}{"$fields"} = $pindex;
+	    push (@{$mapping{'indexmaporder'}}, "$fields");
+	    if (!defined $mapping{"$fields"}) {
+		$mapping{"$fields"} = $pindex;
+	    }	
+	}
+	if ($psub =~ /\w/ && !defined ($mapping{'subcollectionmap'}{$subcollection})) {
+	    $mapping{'subcollectionmap'}{$subcollection} = $psub;
+	    push (@{$mapping{'subcollectionmaporder'}}, $subcollection);
+	    $mapping{$subcollection} = $psub;
+	}
+	if ($plang =~ /\w/ && !defined ($mapping{'languagemap'}{$languages})) {
+	    $mapping{'languagemap'}{$languages} = $plang;
+	    push (@{$mapping{'languagemaporder'}}, $languages);
+	    $mapping{$languages} = $plang;
+	}
+	$dirnames{$dirname} = $index;
+	$pnames{'index'}->{$pindex} = "$fields";
+	$pnames{'subcollection'}->{$psub} = $subcollection;
+	$pnames{'languages'}->{$plang} = $languages;
+    }
+
+    return \%mapping;
+}
+
+sub make_unique {
+    my $self = shift (@_);
+    my ($namehash, $index, $indexref, $subref, $langref) = @_;
+    my ($fields, $subcollection, $languages) = split (":", $index);
+
+    if ($namehash->{'index'}->{$$indexref} ne "$fields") {
+	$self->get_next_version ($indexref);
+    } elsif ($namehash->{'subcollection'}->{$$subref} ne $subcollection) {
+	$self->get_next_version ($subref);
+    } elsif ($namehash->{'languages'}->{$$langref} ne $languages) {
+	$self->get_next_version ($langref);
+    }
+    return "$$indexref$$subref$$langref";
+}	
+
+
+sub build_index {
+    my $self = shift (@_);
+    my ($index) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    # get the full index directory path and make sure it exists
+    my $indexdir = $self->{'index_mapping'}->{$index};
+    &util::mk_all_dir (&util::filename_cat($self->{'build_dir'}, $indexdir));
+
+    my $collect_tail = &util::get_dirsep_tail($self->{'collection'});
+    my $fullindexprefix = &util::filename_cat ($self->{'build_dir'}, 
+					       $indexdir, 
+					       $collect_tail);
+    my $fulltextprefix = &util::filename_cat ($self->{'build_dir'}, "text", 
+					       $collect_tail);
+
+    # get any os specific stuff
+    my $exedir = "$ENV{'GSDLHOME'}/bin/$ENV{'GSDLOS'}";
+
+    my $exe = &util::get_os_exe ();
+    my $mgpp_passes_exe = &util::filename_cat($exedir, "mgpp_passes$exe");
+
+    # define the section names for mgpasses
+    my $mgpp_passes_sections = "-J ". $level_map{"document"} ." -K " . $level_map{"section"} ." ";
+    if ($self->{'levels'}->{'paragraph'}) {
+	$mgpp_passes_sections .= "-K " . $level_map{'paragraph'}. " ";
+    }
+
+    my $mgpp_perf_hash_build_exe = 
+	&util::filename_cat($exedir, "mgpp_perf_hash_build$exe");
+    my $mgpp_weights_build_exe = 
+	&util::filename_cat ($exedir, "mgpp_weights_build$exe");
+    my $mgpp_invf_dict_exe = 
+	&util::filename_cat ($exedir, "mgpp_invf_dict$exe");
+    my $mgpp_stem_idx_exe =
+	&util::filename_cat ($exedir, "mgpp_stem_idx$exe");
+
+    my $maxnumeric = $self->{'maxnumeric'};
+
+    my $osextra = "";
+    if ($ENV{'GSDLOS'} =~ /^windows$/i) {
+	$fullindexprefix =~ s@/@\\@g;
+    } else {
+	$osextra = " -d /";
+	if ($outhandle ne "STDERR") {
+	    # so mgpp_passes doesn't print to stderr if we redirect output
+	    $osextra .= " 2>/dev/null";
+	}
+    }
+ 
+    # get the index expression if this index belongs
+    # to a subcollection
+    my $indexexparr = [];
+    my $langarr = [];
+    # there may be subcollection info, and language info. 
+    my ($fields, $subcollection, $language) = split (":", $index);
+    my @subcollections = ();
+    @subcollections = split /,/, $subcollection if (defined $subcollection);
+
+    foreach $subcollection (@subcollections) {
+	if (defined ($self->{'collect_cfg'}->{'subcollection'}->{$subcollection})) {
+	    push (@$indexexparr, $self->{'collect_cfg'}->{'subcollection'}->{$subcollection});
+	} 
+    }
+    
+    # add expressions for languages if this index belongs to
+    # a language subcollection - only put languages expressions for the 
+    # ones we want in the index
+    
+    my @languages = ();
+    my $languagemetadata = "Language";
+    if (defined ($self->{'collect_cfg'}->{'languagemetadata'})) {
+	$languagemetadata = $self->{'collect_cfg'}->{'languagemetadata'};
+    }
+    @languages = split /,/, $language if (defined $language);
+    foreach my $language (@languages) {
+	my $not=0;
+	if ($language =~ s/^\!//) {
+	    $not = 1;
+	}
+	if($not) {
+	    push (@$langarr, "!$language");
+	} else {
+	    push (@$langarr, "$language");
+	}
+    }
+
+    # Build index dictionary. Uses verbatim stem method
+    print $outhandle "\n    creating index dictionary (mgpp_passes -I1)\n"  if ($self->{'verbosity'} >= 1);
+    print STDERR "<Phase name='CreatingIndexDic'/>\n" if $self->{'gli'};
+    my ($handle);
+    if ($self->{'debug'}) {
+	$handle = *STDOUT;
+    }
+    else {
+	if (!-e "$mgpp_passes_exe" || 
+	    !open($handle, "| mgpp_passes$exe -M $maxnumeric $mgpp_passes_sections -f \"$fullindexprefix\" -I1 $osextra")) {
+	    print STDERR "<FatalError name='NoRunMGPasses'/>\n</Stage>\n" if $self->{'gli'};
+	    die "mgppbuilder::build_index - couldn't run $mgpp_passes_exe\n";
+	}
+    }
+	    
+    # db_level is always section
+    my $db_level = "section";
+
+    # set up the document processr
+    $self->{'buildproc'}->set_output_handle ($handle);
+    $self->{'buildproc'}->set_mode ('text');
+    $self->{'buildproc'}->set_index ($index, $indexexparr);
+    $self->{'buildproc'}->set_index_languages ($languagemetadata, $langarr) if (defined $language);
+    $self->{'buildproc'}->set_indexing_text (1);
+    #$self->{'buildproc'}->set_indexfieldmap ($self->{'indexfieldmap'});
+    $self->{'buildproc'}->set_levels ($self->{'levels'}); 
+    $self->{'buildproc'}->set_db_level ($db_level);   
+    
+    $self->{'buildproc'}->reset();
+
+    &plugin::read ($self->{'pluginfo'}, $self->{'source_dir'}, 
+		   "", {}, {}, $self->{'buildproc'}, $self->{'maxdocs'}, 0, $self->{'gli'});
+    close ($handle) unless $self->{'debug'};
+
+    $self->print_stats();
+
+    # now we check to see if the required files have been produced - if not we quit building this index so the whole process doesn't crap out.
+    # we check on the .id file - index dictionary
+    my $dict_file = "$fullindexprefix.id";
+    if (!-e $dict_file) {
+	print $outhandle "mgppbuilder::build_index - Couldn't create index $index\n";
+	print STDERR "<Warning name='NoIndex'/>\n</Stage>\n" if $self->{'gli'};
+	$self->{'notbuilt'}->{$index}=1;
+	return;
+    }
+
+    if (!$self->{'debug'}) {
+	# create the perfect hash function
+	if (!-e "$mgpp_perf_hash_build_exe") {
+	    print STDERR "<FatalError name='NoRunMGHash'/>\n</Stage>\n" if $self->{'gli'};
+	    die "mgppbuilder::build_index - couldn't run $mgpp_perf_hash_build_exe\n";
+	}
+	system ("mgpp_perf_hash_build$exe -f \"$fullindexprefix\" $osextra");
+
+	if (!-e "$mgpp_passes_exe" || 
+	    !open ($handle, "| mgpp_passes$exe -M $maxnumeric $mgpp_passes_sections -f \"$fullindexprefix\" -I2 $osextra")) {
+	    print STDERR "<FatalError name='NoRunMGPasses'/>\n</Stage>\n" if $self->{'gli'};
+	    die "mgppbuilder::build_index - couldn't run $mgpp_passes_exe\n";
+	}
+    }
+    
+    # invert the text
+    print $outhandle "\n    inverting the text (mgpp_passes -I2)\n"  if ($self->{'verbosity'} >= 1);
+    print STDERR "<Phase name='InvertingText'/>\n" if $self->{'gli'};
+
+    $self->{'buildproc'}->set_output_handle ($handle);
+    $self->{'buildproc'}->reset();
+
+    &plugin::read ($self->{'pluginfo'}, $self->{'source_dir'}, 
+		   "", {}, {}, $self->{'buildproc'}, $self->{'maxdocs'}, 0, $self->{'gli'});
+
+    $self->print_stats ();
+    
+    if (!$self->{'debug'}) {
+
+	close ($handle);
+	
+	# create the weights file
+	print $outhandle "\n    create the weights file\n"  if ($self->{'verbosity'} >= 1);
+	print STDERR "<Phase name='CreateTheWeights'/>\n" if $self->{'gli'};
+	if (!-e "$mgpp_weights_build_exe") {
+	    print STDERR "<FatalError name='NoRunMGWeights'/>\n</Stage>\n" if $self->{'gli'};
+	    die "mgppbuilder::build_index - couldn't run $mgpp_weights_build_exe\n";
+	}
+	system ("mgpp_weights_build$exe -f \"$fullindexprefix\" $osextra");
+
+	# create 'on-disk' stemmed dictionary
+	print $outhandle "\n    creating 'on-disk' stemmed dictionary\n"  if ($self->{'verbosity'} >= 1);
+	if (!-e "$mgpp_invf_dict_exe") {
+	    print STDERR "<FatalError name='NoRunMGInvf'/>\n</Stage>\n" if $self->{'gli'};
+	    die "mgppbuilder::build_index - couldn't run $mgpp_invf_dict_exe\n";
+	}
+	system ("mgpp_invf_dict$exe -f \"$fullindexprefix\" $osextra" );
+
+
+	# creates stem index files for the various stemming methods
+	print $outhandle "\n    creating stem indexes\n"  if ($self->{'verbosity'} >= 1);
+	print STDERR "<Phase name='CreatingStemIndx'/>\n" if $self->{'gli'};
+	if (!-e "$mgpp_stem_idx_exe") {
+	    print STDERR "<FatalError name='NoRunMGStem'/>\n</Stage>\n" if $self->{'gli'};
+	    die "mgppbuilder::build_index - couldn't run $mgpp_stem_idx_exe\n";
+	}
+	my $accent_folding_enabled = 1;
+	if ($self->{'accentfold'}) {
+	    # the first time we do this, we test for accent folding enabled
+	    if (system ("mgpp_stem_idx$exe -b 4096 -s4 -f \"$fullindexprefix\" $osextra") == 2) {
+		# accent folding has not been enabled in mgpp
+		$accent_folding_enabled = 0;
+		$self->{'stemindexes'} -= 4;
+	    }
+	}
+	if ($self->{'casefold'}) {
+	    system ("mgpp_stem_idx$exe -b 4096 -s1 -f \"$fullindexprefix\" $osextra");
+	    if ($accent_folding_enabled && $self->{'accentfold'}) {
+		system ("mgpp_stem_idx$exe -b 4096 -s5 -f \"$fullindexprefix\" $osextra");
+	    }
+	}
+	if ($self->{'stem'}) {
+	    system ("mgpp_stem_idx$exe -b 4096 -s2 -f \"$fullindexprefix\" $osextra");
+	    if ($accent_folding_enabled && $self->{'accentfold'}) {
+		system ("mgpp_stem_idx$exe -b 4096 -s6 -f \"$fullindexprefix\" $osextra");
+	    }
+	}
+	if ($self->{'casefold'} && $self->{'stem'}) {
+	    system ("mgpp_stem_idx$exe -b 4096 -s3 -f \"$fullindexprefix\" $osextra");
+	    if ($accent_folding_enabled && $self->{'accentfold'}) {
+		system ("mgpp_stem_idx$exe -b 4096 -s7 -f \"$fullindexprefix\" $osextra");
+	    }
+	}
+
+	# remove unwanted files
+	my $tmpdir = &util::filename_cat ($self->{'build_dir'}, $indexdir);
+	opendir (DIR, $tmpdir) || die
+	    "mgppbuilder::build_index - couldn't read directory $tmpdir\n";
+	foreach my $file (readdir(DIR)) {
+	    next if $file =~ /^\./;
+	    my ($suffix) = $file =~ /\.([^\.]+)$/;
+	    if (defined $suffix && !defined $wanted_index_files{$suffix}) {
+		# delete it!
+		print $outhandle "deleting $file\n" if $self->{'verbosity'} > 2;
+		#&util::rm (&util::filename_cat ($tmpdir, $file));
+	    }
+	}
+	closedir (DIR);
+    }
+    print STDERR "</Stage>\n" if $self->{'gli'};
+}   
+
+
+sub get_collection_meta_indexes
+{
+    my $self = shift(@_);
+    my $collection_infodb = shift(@_);
+
+    # define the indexed field mapping if not already done so 
+    # (i.e. if infodb called separately from build_index)
+    if (!defined $self->{'build_cfg'}) {
+	$self->read_final_field_list();
+    }
+
+    # first do the collection meta stuff - everything without a dot
+    my $collmetadefined = 0;
+    my $metadata_entry;
+    if (defined $self->{'collect_cfg'}->{'collectionmeta'}) {
+	$collmetadefined = 1;
+    }
+
+    #add the index field macros to [collection]
+    # eg <TI>Title
+    #    <SU>Subject
+    # these now come from collection meta. if that is not defined, uses the metadata name
+    my $collmeta = "";
+    if (defined $self->{'build_cfg'}->{'indexfields'}) {
+	foreach my $longfield (@{$self->{'build_cfg'}->{'indexfields'}}){
+	    my $shortfield = $self->{'buildproc'}->{'indexfieldmap'}->{$longfield};
+	    next if $shortfield eq 1;
+	    
+	    # we need to check if some coll meta has been defined - don't output 
+	    # any that have
+	    $collmeta = ".$longfield";
+	    if (!$collmetadefined || !defined $self->{'collect_cfg'}->{'collectionmeta'}->{$collmeta}) {
+		if ($longfield eq "allfields") {
+		    $collection_infodb->{$shortfield} = [ "_query:textallfields_" ];
+		} elsif ($longfield eq "text") {
+		    $collection_infodb->{$shortfield} = [ "_query:texttextonly_" ];
+		} else {
+		    $collection_infodb->{$shortfield} = [ $longfield ];
+		}
+	    }
+	}
+    }
+
+    # now add the level names
+    my $level_entry = "";
+    foreach my $level (@{$self->{'collect_cfg'}->{'levels'}}) {
+	$collmeta = ".$level"; # based on the original specification
+	$level =~ tr/A-Z/a-z/; # make it lower case
+	my $levelid = $level_map{$level}; # find the actual value we used in the index
+	if (!$collmetadefined || !defined $self->{'collect_cfg'}->{'collectionmeta'}->{$collmeta}) {
+	    # use the default macro
+	    $collection_infodb->{$levelid} = [ $level_map{$levelid} ];
+	}
+    }
+    
+    # now add subcoll meta
+    my $subcoll_entry = "";
+    my $shortname = "";
+    my $one_entry = "";
+    foreach my $subcoll (@{$self->{'index_mapping'}->{'subcollectionmaporder'}}) {
+	$shortname = $self->{'index_mapping'}->{$subcoll};
+	if (!$collmetadefined || !defined $self->{'collect_cfg'}->{'collectionmeta'}->{".$subcoll"}) {
+	    $collection_infodb->{$shortname} = [ $subcoll ];
+	}
+    }
+
+    # now add language meta
+    my $lang_entry = "";
+    foreach my $lang (@{$self->{'index_mapping'}->{'languagemaporder'}}) {
+	$shortname = $self->{'index_mapping'}->{$lang};
+	if (!$collmetadefined || !defined $self->{'collect_cfg'}->{'collectionmeta'}->{".$lang"}) {
+	    $collection_infodb->{$shortname} = [ $lang ];
+	}
+    }
+}
+
+
+# default is to output the metadata sets (prefixes) used in collection
+sub output_collection_meta
+{
+    my $self = shift(@_);
+    my $infodb_handle = shift(@_);
+
+    my %collection_infodb = ();
+    $self->get_collection_meta_sets(\%collection_infodb);
+    $self->get_collection_meta_indexes(\%collection_infodb);
+    &dbutil::write_infodb_entry($self->{'infodbtype'}, $infodb_handle, "collection", \%collection_infodb);
+}
+
+
+# at the end of building, we have an indexfieldmap with all the mappings,
+# plus some extras, and indexmap with any indexes in it that weren't
+# specified in the index definition.  We want to make an ordered list of
+# fields that are indexed, and a list of mappings that are used. This will
+# be used for the build.cfg file, and for collection meta definition we
+# store these in a build.cfg bit
+sub make_final_field_list {
+    my $self = shift (@_);
+    
+    $self->{'build_cfg'} = {};
+    
+    # store the indexfieldmap information
+    my @indexfieldmap = ();
+    my @indexfields = ();
+    my $specifiedfields = {};
+    my @specifiedfieldorder = ();
+
+    # go through the index definition and add each thing to a map, so we
+    # can easily check if it is already specified - when doing the
+    # metadata, we print out all the individual fields, but some may
+    # already be specified in the index definition, so we dont want to add
+    # those again.
+
+    my $field;
+    foreach $field (@{$self->{'collect_cfg'}->{'indexes'}}) {
+	# remove subcoll stuff
+	my $parts = $field;
+	$parts =~ s/:.*$//;
+	# *************
+	my @fs = split(';', $parts);
+	foreach my $f(@fs) {
+	    if (!defined $specifiedfields->{$f}) {
+		$specifiedfields->{$f}=1;
+		push (@specifiedfieldorder, "$f");
+	    }
+	}
+    }
+    
+    #add all fields bit 
+    my $ifm = $self->{'buildproc'}->{'indexfieldmap'};
+    
+    foreach $field (@specifiedfieldorder) {
+	if ($field eq "metadata") {
+	    foreach my $newfield (keys %{$self->{'buildproc'}->{'indexfields'}}) {
+		if (!defined $specifiedfields->{$newfield}) {
+		    push (@indexfieldmap, "$newfield\-\>$self->{'buildproc'}->{'indexfieldmap'}->{$newfield}");
+		    push (@indexfields, "$newfield");
+		}
+	    }
+
+	} elsif ($field eq 'text') {
+	    push (@indexfieldmap, "text\-\>TX");
+	    push (@indexfields, "text");
+	} elsif ($field eq 'allfields') {
+	    push (@indexfieldmap, "allfields\-\>ZZ");
+	    push (@indexfields, "allfields");
+	} else {
+	    # we only add in the ones that have been processed
+	    if (defined $ifm->{$field}) {
+		push (@indexfieldmap, "$field\-\>$ifm->{$field}");
+		push (@indexfields, "$field");
+	    }
+	}
+    }
+
+    if (scalar @indexfieldmap) {
+	$self->{'build_cfg'}->{'indexfieldmap'} = \@indexfieldmap;
+    }
+
+    if (scalar @indexfields) {
+	$self->{'build_cfg'}->{'indexfields'} = \@indexfields;
+    }
+}
+
+
+# recreate the field list from the build.cfg file, look first in building,
+# then in index to find it. if there is no build.cfg, we can't do the field
+# list (there is unlikely to be any index anyway.)
+sub read_final_field_list {
+    my $self = shift (@_);
+    $self->{'build_cfg'} = {};
+    my @indexfieldmap = ();
+    my @indexfields = ();
+    my @indexmap = ();
+
+    # we read the stuff in from the build.cfg file - if its there
+    my $buildcfg = $self->read_build_cfg();
+    return unless defined $buildcfg;
+
+    my $field;
+    if (defined $buildcfg->{'indexfields'}) {
+	foreach $field (@{$buildcfg->{'indexfields'}}) {
+	    push (@indexfields, "$field");
+	}
+    }
+
+    if (defined $buildcfg->{'indexfieldmap'}) {
+	foreach $field (@{$buildcfg->{'indexfieldmap'}}) {
+	    push (@indexfieldmap, "$field");
+	    my ($f, $v) = $field =~ /^(.*)\-\>(.*)$/;
+	    $self->{'buildproc'}->{'indexfieldmap'}->{$f} = $v;
+	}
+    }	    
+
+    if (defined $buildcfg->{'indexmap'}) {
+	foreach $field (@{$buildcfg->{'indexmap'}}) {
+	    push (@indexmap, "$field");
+	}
+    }	    
+
+    $self->{'build_cfg'}->{'indexfieldmap'} = \@indexfieldmap;
+    $self->{'build_cfg'}->{'indexfields'} = \@indexfields;
+    $self->{'build_cfg'}->{'indexmap'} = \@indexmap;
+}
+
+
+sub build_cfg_extra {
+    my $self = shift (@_);
+    my ($build_cfg) = @_;
+
+    $build_cfg->{'numsections'} = $self->{'buildproc'}->get_num_sections();
+    
+    # store the level info
+    my @indexlevels = ();
+    my @levelmap = ();
+    foreach my $l (@{$self->{'levelorder'}}) {
+	push (@indexlevels, $level_map{$l});
+	push (@levelmap, "$l\-\>$level_map{$l}");
+    }
+    $build_cfg->{'indexlevels'} = \@indexlevels;
+    $build_cfg->{'levelmap'} = \@levelmap;
+
+    # text level (and database level) is always section
+    $build_cfg->{'textlevel'} = $level_map{'section'};
+   
+}
+
+# The three main 'modes' in MGPP builds are completely independent
+sub prepare_build_recipe
+{
+  my ($self, $collection, $recipe) = @_;
+  my $outhandle = $self->{'outhandle'};
+  my $verbosity = $self->{'verbosity'};
+  # 1. Compressing the text
+  push(@{$recipe}, {'command'=>'buildcol.pl -keepold -verbosity ' . $verbosity . ' -mode compress_text ' . $collection});
+  # 2. Build the indexes
+  push(@{$recipe}, {'command'=>'buildcol.pl -keepold -verbosity ' . $verbosity . ' -mode build_index ' . $collection});
+  # 3. Info database building
+  push(@{$recipe}, {'command'=>'buildcol.pl -keepold -verbosity ' . $verbosity . ' -mode infodb ' . $collection});
+  # Complete!
+}
+
+1;
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/mgppbuildproc.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/mgppbuildproc.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/mgppbuildproc.pm	(revision 24799)
@@ -0,0 +1,463 @@
+###########################################################################
+#
+# mgppbuildproc.pm -- 
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# This document processor outputs a document
+# for mgpp to process
+
+
+package mgppbuildproc;
+
+use basebuildproc;
+use cnseg;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+
+BEGIN {
+    @mgppbuildproc::ISA = ('basebuildproc');
+}
+
+#this must be the same as in mgppbuilder
+our %level_map = ('document'=>'Doc',
+		  'section'=>'Sec',
+		  'paragraph'=>'Para');
+
+# change this so a user can add their own ones in via a file or cfg
+#add AND, OR, NOT NEAR to this list - these cannot be used as field names
+#also add the level names (Doc, Sec, Para)
+our %static_indexfield_map = ('Title'=>'TI',
+			  'TI'=>1,
+			  'Subject'=>'SU',
+			  'SU'=>1,
+			  'Creator'=>'CR',
+			  'CR'=>1,
+			  'Organization'=>'ORG',
+			  'ORG'=>1,
+			  'Source'=>'SO',
+			  'SO'=>1,
+			  'Howto'=>'HT',
+			  'HT'=>1,
+			  'ItemTitle'=>'IT',
+			  'IT'=>1,
+			  'ProgNumber'=>'PN',
+			  'PN'=>1,
+			  'People'=>'PE',
+			  'PE'=>1,
+			  'Coverage'=>'CO',
+			  'CO'=>1,
+			  'allfields'=>'ZZ',
+			  'ZZ'=>1,
+			  'text'=>'TX',
+			  'TX'=>1,
+			  'AND'=>1,
+			  'OR'=>1,
+			  'NOT'=>1,
+			  'NEAR'=>1,
+			  'Doc'=>1,
+			  'Sec'=>1,
+			  'Para'=>1);
+
+
+sub new {
+    my $class = shift @_;
+    my $self = new basebuildproc (@_);
+
+    # use a different index specification to the default
+    $self->{'index'} = "text";
+
+    $self->{'dontindex'} = {};
+    $self->{'indexfieldmap'} = {};
+    $self->{'indexfields'} = {}; # only put in the ones that are not specified directly in the index
+    $self->{'strip_html'}=1;
+    
+    return bless $self, $class;
+}
+
+
+#sub set_indexfieldmap {
+#    my $self = shift (@_);
+#    my ($indexmap) = @_;
+
+#    $self->{'default_index_field_mapping'} = $indexmap;
+    #$self->{'indexfieldmap'} = $indexmap;
+#}
+
+sub get_indexfieldmap {
+    my $self = shift (@_);
+
+    return $self->{'indexfieldmap'};
+}
+
+sub set_levels {
+    my $self = shift (@_);
+    my ($levels) = @_;
+
+    $self->{'levels'} = $levels;
+}
+
+sub set_strip_html {
+    my $self = shift (@_);
+    my ($strip) = @_;
+    $self->{'strip_html'}=$strip;
+}
+
+#sub find_paragraphs {
+#    $_[1] =~ s/(<p\b)/<Paragraph>$1/gi;
+#}
+
+sub remove_gtlt {
+    my $self =shift(@_);
+    my ($text, $para) = @_;
+    $text =~s/[<>]//g;
+    return "$para$text$para";
+}
+
+sub process_tags {
+    my $self = shift(@_);
+    my ($text, $para) = @_;
+    if ($text =~ /^p\b/i) {
+	return $para;
+    }
+    return "";
+}
+
+sub preprocess_text {
+    my $self = shift (@_);
+    my ($text, $strip_html, $para) = @_;
+    # at this stage, we do not do paragraph tags unless have strip_html - 
+    # it will result in a huge mess of non-xml
+    return unless $strip_html;
+    
+    my $new_text = $text;
+    
+    # if we have <pre> tags, we can have < > inside them, need to delete 
+    # the <> before stripping tags
+    $new_text =~ s/<pre>(.*?)<\/pre>/$self->remove_gtlt($1,$para)/gse;
+   
+    if ($para eq "") {
+	# just remove all tags
+	$new_text =~ s/<[^>]*>//gs;
+    } else {
+	# strip all tags except <p> tags which get turned into $para
+	$new_text =~ s/<([^>]*)>/$self->process_tags($1, $para)/gse;
+	
+    }
+    return $new_text;
+}
+#this function strips the html tags from the doc if ($strip_html) and
+# if ($para) replaces <p> with <Paragraph> tags.
+# if both are false, the original text is returned
+#assumes that <pre> and </pre> have no spaces, and removes all < and > inside
+#these tags
+sub preprocess_text_old_and_slow {
+    my $self = shift (@_);
+    my ($text, $strip_html, $para) = @_;
+    my ($outtext) = "";
+    if ($strip_html) { 
+	while ($text =~ /<([^>]*)>/ && $text ne "") {
+	    
+	    my $tag = $1;
+	    $outtext .= $`." "; #add everything before the matched tag
+	    $text = $'; #'everything after the matched tag
+	    if ($para && $tag =~ /^\s*p\s/i) {
+		$outtext .= $para;
+	    }
+	    elsif ($tag =~ /^pre$/) { # a pre tag
+		$text =~ /<\/pre>/; # find the closing pre tag
+		my $tmp_text = $`; #everything before the closing pre tag
+		$text = $'; #'everything after the </pre>
+		$tmp_text =~ s/[<>]//g; # remove all < and >
+		$outtext.= $tmp_text . " ";
+	    }
+	}
+    
+	$outtext .= $text; # add any remaining text
+	return $outtext;
+    } #if strip_html
+
+    #if ($para) {
+	#$text =~ s/(<p\b)/$para$1/gi;
+	#return $text;
+   # }
+    return $text;
+}
+	
+sub text {
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+    my $handle = $self->{'output_handle'};
+    my $outhandle = $self->{'outhandle'};
+
+    # only output this document if it is one to be indexed
+    return if ($doc_obj->get_doc_type() ne "indexed_doc");
+    
+    my $indexed_doc = $self->is_subcollection_doc($doc_obj);
+    
+    # this is another document
+    $self->{'num_docs'} += 1;
+
+    # get the parameters for the output
+    # split on : just in case there is subcoll and lang stuff
+    my ($fields) = split (/:/, $self->{'index'});
+
+    # we always do text and index on Doc and Sec levels
+    my ($documenttag) = "\n<". $level_map{'document'} . ">\n";
+    my ($documentendtag) = "\n</". $level_map{'document'} . ">\n";
+    my ($sectiontag) = "\n<". $level_map{'section'} . ">\n";
+    my ($sectionendtag) = "\n</". $level_map{'section'} . ">\n";
+
+    my ($paratag) = "";
+    
+    # paragraph tags will only be used for indexing (can't retrieve 
+    # paragraphs), and can ony be used if we are stripping HTML tags
+    if ($self->{'indexing_text'} && $self->{'levels'}->{'paragraph'}) {
+	if ($self->{'strip_html'}) {
+	    $paratag = "<". $level_map{'paragraph'} . ">";
+	} else {
+	    print $outhandle "Paragraph level can not be used with no_strip_html!. Not indexing Paragraphs.\n";
+	}
+    }
+
+    my $doc_section = 0; # just for this document
+    
+    my $text = $documenttag;
+   
+    # get the text for this document
+    my $section = $doc_obj->get_top_section();
+    
+    while (defined $section) {
+	# update a few statistics
+	$doc_section++;
+	$self->{'num_sections'} += 1;
+	$text .= "$sectiontag";
+	
+	my $indexed_section = $doc_obj->get_metadata_element($section, "gsdldoctype") || "indexed_section";
+	if (($indexed_doc == 0) || ($indexed_section ne "indexed_section" && $indexed_section ne "indexed_doc")) {
+	    # we are not actually indexing anything for this document,
+	    # but we want to keep the section numbers the same, so we just
+	    # output section tags for each section (which is done above)
+	    $text .= "$sectionendtag";
+	    $section = $doc_obj->get_next_section($section);
+	    next;
+	}
+	
+	$self->{'num_bytes'} += $doc_obj->get_text_length ($section);
+
+	# has the user added a 'metadata' index?
+	my $all_metadata_specified = 0; 
+	# which fields have already been indexed? (same as fields, but in a map)
+	my $specified_fields = {};
+	foreach my $field (split (/;/, $fields)) {
+	    # only deal with this field if it doesn't start with top or
+	    # this is the first section
+	    my $real_field = $field;
+	    next if (($real_field =~ s/^top//) && ($doc_section != 1));
+	    
+	    my $new_text = ""; 
+
+	    # we get allfields by default - do nothing except add into the map
+	    if ($real_field eq "allfields") {
+		$self->{'indexfieldmap'}->{"allfields"} = "ZZ";
+		$self->{'indexfieldmap'}->{"ZZ"} = 1;
+	    }
+	    
+	    # metadata - output all metadata we know about except gsdl stuff
+	    # each metadata is in a separate index field
+	    if ($real_field eq "metadata") { 
+		# we will process this later, so we are not reindexing metadata already indexed
+		$all_metadata_specified = 1;
+	    }
+	    
+	    else {
+		
+		#individual metadata and or text specified - could be 
+		# a comma separated list
+		$specified_fields->{$real_field} = 1;
+		my $shortname="";
+		my $new_field = 0; # have we found a new field name?
+
+		if (defined $self->{'indexfieldmap'}->{$real_field}) {
+		    $shortname = $self->{'indexfieldmap'}->{$real_field};
+		}
+		else {
+		    $shortname = $self->create_shortname($real_field);
+		    $new_field = 1; # we want to record this shortname, but only if we have actually found some metadata values
+		}
+		my @metadata_list = (); # put any meta values in here
+		my $section_text = ""; # put any text in here
+		foreach my $submeta (split /,/, $real_field) {
+		    if ($submeta eq "text") { 
+			# no point in indexing text more than once
+			if ($section_text eq "") {
+			    $section_text = $doc_obj->get_text($section);
+			    if ($self->{'indexing_text'}) {
+				if ($paratag ne "") {
+				    # we fiddle around with splitting text into paragraphs
+				    $section_text = $self->preprocess_text($section_text, $self->{'strip_html'}, "</$shortname>$paratag<$shortname>");
+				}
+				else {
+				    $section_text = $self->preprocess_text($section_text, $self->{'strip_html'}, "");
+				}
+			    }
+			}
+		    }
+		    else {
+			$submeta =~ s/^ex\.([^.]+)$/$1/; #strip off ex. iff it's the only metadata set prefix (will leave ex.dc.* intact)
+			# its a metadata element
+			my @section_metadata = @{$doc_obj->get_metadata ($section, $submeta)};
+			if ($section ne $doc_obj->get_top_section() && $self->{'indexing_text'} && defined ($self->{'sections_index_document_metadata'})) {
+			    if ($self->{'sections_index_document_metadata'} eq "always" || ( scalar(@section_metadata) == 0 && $self->{'sections_index_document_metadata'} eq "unless_section_metadata_exists")) {
+				push (@section_metadata, @{$doc_obj->get_metadata ($doc_obj->get_top_section(), $submeta)});
+			    }
+			}
+			push (@metadata_list, @section_metadata);
+		    }
+		} # for each field in index
+
+
+		# now we add the text and/or the metadata into new_text
+		if ($section_text ne "" || scalar(@metadata_list)) {
+		    if ($self->{'indexing_text'}) {
+			# only add tags in if indexing
+			$new_text .= "$paratag<$shortname>";
+		    }
+		    if ($section_text ne "") {
+			$new_text .= "$section_text ";
+			if ($self->{'indexing_text'} && $paratag ne "" && scalar(@metadata_list)) {
+			    $new_text .= "</$shortname>$paratag<$shortname>";
+			}
+		    }
+		    foreach my $item (@metadata_list) {
+			$new_text .= "$item ";
+		    }
+		    if ($self->{'indexing_text'}) {
+			# only add tags in if indexing
+			$new_text .= "</$shortname>";
+		    }
+		    if ($self->{'indexing_text'} && $new_field) {
+			# we need to add to the list in indexfields
+
+			$self->{'indexfieldmap'}->{$real_field} = $shortname;
+			$self->{'indexfieldmap'}->{$shortname} = 1;
+		    }
+		}
+	    }
+
+	    # filter the text
+	    $new_text = $self->filter_text ($field, $new_text);
+	    
+	    $self->{'num_processed_bytes'} += length ($new_text);
+	    $text .= "$new_text";
+	} # foreach field
+	
+   	if ($all_metadata_specified) {
+	    my $new_text = "";
+	    my $shortname = "";
+	    my $metadata = $doc_obj->get_all_metadata ($section);
+	    foreach my $pair (@$metadata) {
+		my ($mfield, $mvalue) = (@$pair);
+		# no value
+		next unless defined $mvalue && $mvalue ne "";
+		# we have already indexed this
+		next if defined ($specified_fields->{$mfield});
+		# check fields here, maybe others dont want - change to use dontindex!!
+		next if ($mfield eq "Identifier" || $mfield eq "classifytype" || $mfield eq "assocfilepath");
+		next if ($mfield =~ /^gsdl/);
+		
+			
+		if (defined $self->{'indexfieldmap'}->{$mfield}) {
+		    $shortname = $self->{'indexfieldmap'}->{$mfield};
+		}
+		else {
+		    $shortname = $self->create_shortname($mfield);
+		    $self->{'indexfieldmap'}->{$mfield} = $shortname;
+		    $self->{'indexfieldmap'}->{$shortname} = 1;
+		}	   
+		$new_text .= "$paratag<$shortname>$mvalue</$shortname>\n";
+		if (!defined $self->{'indexfields'}->{$mfield}) {
+		    $self->{'indexfields'}->{$mfield} = 1;
+		}				    
+	    
+	    }
+	    # filter the text
+	    $new_text = $self->filter_text ("metadata", $new_text);
+	    
+	    $self->{'num_processed_bytes'} += length ($new_text);
+	    $text .= "$new_text";
+
+	    
+	}
+    
+	$text .= "$sectionendtag";
+	$section = $doc_obj->get_next_section($section);
+    } # while defined section
+    print $handle "$text\n$documentendtag"; 
+    #print STDERR "***********\n$text\n***************\n";
+    
+}
+
+#chooses the first two letters or digits for the shortname
+#now ignores non-letdig characters
+sub create_shortname {
+    my $self = shift(@_);
+    
+    my ($realname) = @_;
+    # try our predefined static mapping
+    if (defined $static_indexfield_map{$realname}) {
+	return $static_indexfield_map{$realname};
+    }
+    #try the first two chars
+    my $shortname;
+    if ($realname =~ /^[^\w]*(\w)[^\w]*(\w)/) {
+	$shortname = "$1$2";
+    } else {
+	# there aren't two letdig's in the field - try arbitrary combinations
+	$realname = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+	$shortname = "AB";
+    }
+    $shortname =~ tr/a-z/A-Z/;
+
+    #if already used, take the first and third letdigs and so on
+    my $count = 1;
+    while (defined $self->{'indexfieldmap'}->{$shortname} || defined $static_indexfield_map{$shortname}) {
+	if ($realname =~ /^[^\w]*(\w)([^\w]*\w){$count}[^\w]*(\w)/) {
+	    $shortname = "$1$3";
+	    $count++;
+	    $shortname =~ tr/a-z/A-Z/;
+	
+	}
+	else {
+	    #remove up to and incl the first letdig
+	    $realname =~ s/^[^\w]*\w//;
+	    $count = 0;
+	}
+    }
+
+    return $shortname;
+}
+
+1;
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/multiread.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/multiread.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/multiread.pm	(revision 24799)
@@ -0,0 +1,344 @@
+###########################################################################
+#
+# multiread.pm --
+#
+# Copyright (C) 1999 DigiLib Systems Limited, NZ
+# Copyright (C) 2005 New Zealand Digital Library project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# the multiread object will read in a number of encodings,
+# the results are always returned in the utf-8 format
+
+# encodings currently supported are
+#
+# utf8             - either utf8 or unicode (automatically detected)
+# unicode          - 2-byte UCS (does endian detection)
+#
+# plus all encodings in the "encodings" package
+
+package multiread;
+
+eval {require bytes};
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+use unicode;
+
+sub new {
+    my ($class) = @_;
+
+    my $self = {'handle'    => "",
+		'first'     => 1,
+		'encoding'  => "utf8",
+		'bigendian' => 1};
+
+    return bless $self, $class;
+}
+
+# set_handle expects the file to be already open but
+# not read yet
+sub set_handle {
+    my $self = shift;
+    $self->{'handle'} = shift;
+    binmode( $self->{'handle'} );
+    $self->{'first'} = 1;
+    $self->{'encoding'} = "utf8";
+    $self->{'bigendian'} = 1;
+}
+
+# set_encoding should be called after set_handle
+sub set_encoding {
+    my $self = shift;
+    $self->{'encoding'} = shift;
+}
+
+sub get_encoding {
+    my $self = shift (@_);
+    return $self->{'encoding'};
+}
+
+# undef will be returned if the eof has been reached
+# the result will always be returned in utf-8
+
+sub read_unicode_char {
+    my $self = shift (@_);
+
+    # make sure we have a file handle
+    return undef if ($self->{'handle'} eq "");
+    my $handle = $self->{'handle'};
+
+    if ($self->{'encoding'} eq "utf8") {
+	# utf-8 text, how many characters we get depends 
+	# on what we find
+	my $c1 = "";
+	my $c2 = "";
+	my $c3 = "";
+
+	while (!eof ($handle)) {
+	    $c1 = ord (getc ($handle));
+
+	    if ($c1 <= 0x7f) {
+		# one byte character
+		return chr ($c1);
+
+	    } elsif ($c1 >= 0xc0 && $c1 <= 0xdf) {
+		# two byte character
+		$c2 = getc ($handle) if (!eof ($handle));
+		return chr ($c1) . $c2;
+
+	    } elsif ($c1 >= 0xe0 && $c1 <= 0xef) {
+		# three byte character
+		$c2 = getc ($handle) if (!eof ($handle));
+		$c3 = getc ($handle) if (!eof ($handle));
+		return chr ($c1) . $c2 . $c3;
+	    }
+
+	    # if we get here there was an error in the file, we should
+	    # be able to recover from it however, maybe the file is in
+	    # another encoding
+	}
+
+	return undef if (eof ($handle));
+    }
+
+    if ($self->{'encoding'} eq "unicode") {
+	# unicode text, get the next two characters
+	return undef if (eof ($handle));
+	my $c1 = ord (getc ($handle));
+	return undef if (eof ($handle));
+	my $c2 = ord (getc ($handle));
+
+	return &unicode::unicode2utf8 ([(($self->{'bigendian'}) ? ($c1*256+$c2) : ($c2*256+$c1))]);
+    }
+
+    return undef;
+}
+
+
+sub unicodechar_to_ord
+{
+    my $self = shift (@_);
+    my ($unicode_text) = @_;
+
+    my $bigendian_ord_array = [];
+
+    my @unicodechar_array = ($unicode_text =~ m/(..)/g);
+
+    foreach my $pair (@unicodechar_array) {
+	# for each 2 byte pair       
+	my $c1=ord(substr($pair,0,1));
+	my $c2=ord(substr($pair,1,1));
+
+	my $be_ord = ($self->{'bigendian'}) ? $c1*256+$c2 : $c2*256+$c1;
+	push(@$bigendian_ord_array,$be_ord);
+    }
+
+    return $bigendian_ord_array;
+}
+
+
+# undef will be returned if the eof has been reached
+# the result will always be returned in utf-8
+sub read_line {
+    my $self = shift (@_);
+
+    # make sure we have a file handle
+    return undef if ($self->{'handle'} eq "");
+
+    my $handle = $self->{'handle'};
+
+    if ($self->{'encoding'} eq "utf8") {
+	# utf-8 line
+	return <$handle>;
+    }
+
+    if ($self->{'encoding'} eq "unicode") {
+	# unicode line
+	my $c = "";
+	my ($c1, $c2) = ("", "");
+	my $out = "";
+	while (read ($handle, $c, 2) == 2) {
+	    $c1 = ord (substr ($c, 0, 1));
+	    $c2 = ord (substr ($c, 1, 1));
+	    $c = &unicode::unicode2utf8([(($self->{'bigendian'}) ? ($c1*256+$c2) : ($c2*256+$c1))]);
+	    $out .= $c;
+	    last if ($c eq "\n");
+	}
+
+	return $out if (length ($out) > 0);
+	return undef;
+    }
+
+    if ($self->{'encoding'} eq "iso_8859_1") {
+	# we'll use ascii2utf8() for this as it's faster than going
+	# through convert2unicode()
+	my $line = "";
+	if (defined ($line = <$handle>)) {
+	    return &unicode::ascii2utf8 (\$line);
+	}
+    }
+
+    # everything else uses unicode::convert2unicode
+    my $line = "";
+    if (defined ($line = <$handle>)) {
+	return &unicode::unicode2utf8 (&unicode::convert2unicode ($self->{'encoding'}, \$line));
+    }
+
+    return undef;
+}
+
+
+
+# this will look for a Byte Order Marker at the start of the file, and
+# set the encoding appropriately if there is one, returning any
+# non-marker text on the first line (or returns undef).
+sub find_unicode_bom {
+    my $self=shift;
+
+    my $non_bom_text=""; # to return if we read in 'real' text
+
+    if ($self->{'first'} == 0) { return }
+
+    # make sure we have a file handle
+    return if ($self->{'handle'} eq "");
+    my $handle = $self->{'handle'};
+
+    $self->{'first'} = 0;
+
+    my $gc = getc ($handle);
+    my $b1 = ord($gc);
+    my $b2;
+    my $b3;
+
+    if ($b1 == 0xfe || $b1 == 0xff) {
+	$b2 = ord (getc ($handle)) if (!eof ($handle));
+	if ($b1 == 0xff && $b2 == 0xfe) {
+	    $self->{'encoding'} = "unicode";
+	    $self->{'bigendian'} = 0;
+	    return;
+	} elsif ($b1 == 0xfe && $b2 == 0xff) {
+	    $self->{'encoding'} = "unicode";
+	    $self->{'bigendian'} = 1;
+	    return;
+	} elsif ($b1 == 0xef && $b2 == 0xbb) {
+	    $b3 = ord(getc($handle));
+	    if ($b3 == 0xbf) {
+		$self->{'encoding'} = "utf8";
+		$self->{'bigendian'} = 1;
+		return;
+	    }
+	    else {
+		# put back all three bytes
+		$handle->ungetc($b3);
+		$handle->ungetc($b2);
+		$handle->ungetc($b1); return;
+
+	    }
+	}
+	else {
+	    # put back two bytes read
+	    $handle->ungetc($b2);
+	    $handle->ungetc($b1); return;
+	}
+    } else { # $b1 != fe or ff
+	# put back the one byte read
+	$handle->ungetc($b1); return;
+    }
+}
+
+
+sub read_file_no_decoding
+{
+    my $self = shift (@_);
+    my ($outputref) = @_;
+
+    # make sure we have a file handle
+    return if ($self->{'handle'} eq "");
+
+    my $handle = $self->{'handle'};
+
+    # if encoding is set to utf8 or unicode, sniff to see if there is a 
+    # byte order marker
+    if ($self->{'first'} &&
+	($self->{'encoding'} eq "utf8" || $self->{'encoding'} eq 'unicode')) {
+
+	# this will change $self's encoding if there is a BOM (but won't consume any characters)
+	$self->find_unicode_bom(); 
+    }
+
+    undef $/;
+    $$outputref .=  <$handle>;
+    $/ = "\n";
+
+}
+
+
+# will convert entire contents of file to utf8 and append result to $outputref
+# this may be a slightly faster way to get the contents of a file than by 
+# recursively calling read_line()
+sub decode_text {
+    my $self = shift (@_);
+
+    my ($raw_text,$decoded_text_ref) = @_;
+
+    if ($self->{'encoding'} eq "utf8") {
+	# Nothing to do, raw text is in utf 8
+	$$decoded_text_ref .= $raw_text;
+	return;
+    }
+
+    if ($self->{'encoding'} eq "unicode") {
+	my $unicode_array = $self->unicodechar_to_ord($raw_text);
+	$$decoded_text_ref .= &unicode::unicode2utf8($unicode_array);
+	return;
+    }
+
+    if ($self->{'encoding'} eq "iso_8859_1" || $self->{'encoding'} eq "ascii") {
+	# we'll use ascii2utf8() for this as it's faster than going
+	# through convert2unicode()
+	$$decoded_text_ref .= &unicode::ascii2utf8 (\$raw_text);
+	return;
+    }
+
+    # everything else uses unicode::convert2unicode
+    my $unicode_text = &unicode::convert2unicode ($self->{'encoding'}, \$raw_text);
+
+    $$decoded_text_ref .= &unicode::unicode2utf8 ($unicode_text);
+
+###    print STDERR "!!! decoded ", join(":",map { ord($_) } split(//,$$decoded_text_ref)), "\n";
+}
+
+
+
+# will convert entire contents of file to utf8 and append result to $outputref
+# this may be a slightly faster way to get the contents of a file than by 
+# recursively calling read_line()
+sub read_file {
+    my $self = shift (@_);
+    my ($outputref) = @_;
+
+    # While unusual, $raw_text is initialized to $$outputref
+    # to be consistent with code before refactoring
+    my $raw_text = $$outputref; 
+
+    $self->read_file_no_decoding(\$raw_text);
+    $self->decode_text($raw_text,$outputref);
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/muread.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/muread.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/muread.pm	(revision 24799)
@@ -0,0 +1,152 @@
+###########################################################################
+#
+# muread.pm -- read a marked-up file
+#
+# Copyright (C) 1999 DigiLib Systems Limited, NZ
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+
+package muread;
+
+use strict;
+use unicode;
+use multiread;
+
+sub new {
+    my ($class) = @_;
+
+    my $self = {'filename'=>"",
+		'encoding'=>"",
+		'handle'=>"",
+		'reader'=>"",
+		'buffer'=>""};
+
+    return bless $self, $class;
+}
+
+# returns a new tag with a tag name and any options
+sub parse_tag {
+    my $self = shift (@_);
+    my ($orgtagtext) = @_;
+    my $tagtext = $orgtagtext;
+    my $newtag = {};
+    my $misformed = 0;
+
+#    print STDERR "parsing \"$tagtext\"\n";
+
+    # get tag name (if there is one)
+    if ($tagtext =~ /^(\w+)/) {
+	$newtag->{'_tagname'} = $1;
+	$tagtext =~ s/^(\w+)//;
+    } else {
+	print STDERR "muread::parse_tag error - no tag name found\n";
+    }
+
+    # get the tag arguments
+    while ($tagtext =~ /\S/) {
+	$tagtext =~ s/^\s+//s;
+	if ($tagtext =~ /^(\w+)\s*=\s*\"([^\"]*)\"/s) {
+	    $newtag->{$1} = (defined $2) ? $2 : "";
+	    $tagtext =~ s/^\w+\s*=\s*\"[^\"]*\"//s;
+
+	} else {
+	    if (!$misformed) {
+		print STDERR "muread::parse_tag error - miss-formed tag <$orgtagtext>\n";
+		$misformed = 1;
+	    }
+	    $tagtext =~ s/^\S+//s;
+	}
+    }
+
+    return $newtag;
+}
+
+sub read_tag_content {
+    my $self = shift (@_);
+    my ($tag) = @_;
+
+    # all tags contain a _tagname except the tag for the document
+
+    my $line = "";
+    while (1) {
+	# deal with preceeding text
+	if ($self->{'buffer'} =~ /^([^<]+)</s) {
+	    # add preceeding text
+	    $tag->{'_contains'} = [] unless defined $tag->{'_contains'};
+	    push (@{$tag->{'_contains'}}, {'_text'=>$1});
+
+	    $self->{'buffer'} =~ s/^[^<]+</</s;
+	}
+
+	if ($self->{'buffer'} =~ /^<([^>\/]+)>/s) {
+	    # add info from this tag
+	    my $tagtext = $1;
+	    my $newtag = $self->parse_tag ($tagtext);
+	    push (@{$tag->{'_contains'}}, $newtag);
+	    $self->{'buffer'} =~ s/^<[^>\/]+>//s;
+	    
+	    # deal with the contents of this tag
+	    $self->read_tag_content ($newtag);
+
+	} elsif ($self->{'buffer'} =~ /^<\/([^>\/]+)>/s) {
+	    my $tagname = $1;
+	    $self->{'buffer'} =~ s/^<\/[^>\/]+>//s;
+
+	    # check that this tag is the right tag
+	    if (!defined $tag->{'_tagname'} || $tag->{'_tagname'} ne $tagname) {
+		print STDERR "muread::read_tag_content error - mismatched tag </$tagname>, " .
+		    "expected </$tag->{'_tagname'}>\n";
+	    } else {
+		return;
+	    }
+	} elsif (defined ($line = $self->{'reader'}->read_line())) {
+	    $self->{'buffer'} .= $line;
+	} else {
+	    if ($self->{'buffer'} =~ /\S/) {
+		print STDERR "muread::read_tag_content error - can't parse text \"$self->{'buffer'}\"\n";
+	    }
+	    last;
+	}
+    }
+    
+    if (defined $tag->{'_tagname'}) {
+	print STDERR "muread::read_tag_content error - eof reached before closing " .
+	    "tag \"$tag->{'_tagname'}\" found\n";
+    }
+}
+
+sub read_file {
+    my $self = shift (@_);
+    ($self->{'handle'}, $self->{'filename'}, $self->{'encoding'}) = @_;
+    $self->{'encoding'} = "utf8" unless defined $self->{'encoding'};
+
+    my $doc = {};
+
+    # get reader set up
+    $self->{'reader'} = new multiread ();
+    $self->{'reader'}->set_handle ($self->{'handle'});
+    $self->{'reader'}->set_encoding ($self->{'encoding'});
+
+    # read in the file
+    $self->read_tag_content ($doc);
+
+    $self->{'handle'} = "";
+    return $doc;
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/parsargv.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/parsargv.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/parsargv.pm	(revision 24799)
@@ -0,0 +1,241 @@
+###########################################################################
+#
+# parseargv.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package parsargv;
+
+use strict;
+
+# 
+# parse(ARGVREF, [SPEC, VARREF] ...)
+# 
+# Parse command line arguments.
+# 
+# ARGVREF is an array reference, usually to @ARGV.  The remaining
+# arguments are paired (SPEC, VARREF).  SPEC is a specification string
+# for a particular argument; VARREF is a variable reference that will
+# receive the argument.
+# 
+# SPEC is in one of the following forms:
+# 
+# ARG/REGEX/DEFAULT ARG is the name of command line argument.  REGEX is
+#     a regular expression that gives legal values for the argument.
+#     DEFAULT is the default value assigned to VARREF if the option does
+#     not appear on the command line.  Example
+# 
+# 
+# ARG/REGEX ARG and REGEX are as above.  Since no default is given, ARG
+#     must appear on the command line; if it doesn't, parse() returns 0.
+# 
+# ARG ARG is as above.  ARG is a boolean option.  VARREF is assigned 0 if ARG
+#     is not on the command line; 1 otherwise.
+# 
+# SPEC may start with a punctuation character, in which case this
+# character will be used instead of '/' as a delimiter.  Useful when '/'
+# is needed in the REGEX part.
+# 
+# VARREF is a reference to a scalar or an array.  If VARREF is an array
+# reference, then multiple command line options are allowed an append.  Example:
+# 
+# 	Command line: -day mon -day fri
+# 
+# 	parse(\@ARGV, "day/(mon|tue|wed|thu|fri)", \@days)
+# 
+# 	days => ('mon', 'fri')
+# 
+# Returns 0 if there was an error, nonzero otherwise.
+# 
+
+ 
+sub parse
+{
+    my $arglist = shift;
+    my ($spec, $var);
+    my %option;
+
+    my @rest = @_;
+
+
+    # if the last argument is the string "allow_extra_options" then options
+    # in \@rest without a corresponding SPEC will be ignored (i.e. the "$arg is
+    # not a valid option" error won't occur)\n";
+    my $allow_extra_options = pop @rest;
+    if (defined ($allow_extra_options)) {
+	if ($allow_extra_options eq "allow_extra_options") {
+	    $allow_extra_options = 1;
+	} else {
+	    # put it back where we got it
+	    push (@rest, $allow_extra_options);
+	    $allow_extra_options = 0;
+	}
+    } else {
+	$allow_extra_options = 0;
+    }
+
+    while (($spec, $var) = splice(@rest, 0, 2))
+        {
+	  
+	die "Variable for $spec is not a valid type."
+	    unless ref($var) eq 'SCALAR' || ref($var) eq 'ARRAY'
+	    || (ref($var) eq 'REF' && ref($$var) eq 'GLOB');
+
+	my $delimiter;
+	if ($spec !~ /^\w/)
+	{
+	    $delimiter = substr($spec, 0, 1);
+	    $spec = substr($spec, 1);
+	}
+	else
+	{
+	    $delimiter = '/';
+	}
+	my ($name, $regex, $default) = split(/$delimiter/, $spec, 3);
+	
+	
+	if ($name)
+	{   
+	    if ($default && $default !~ /$regex/)
+	    {
+		die "Default value for $name doesn't match regex ($spec).";
+	    }
+	    $option{$name} = {'name' => $name,
+			      'regex' => $regex,
+			      'default' => $default,
+			      'varref' => $var,
+			      'set' => 0};
+	}
+	else
+	{
+	    die "Invalid argument ($spec) for parsargv.";
+	}
+    }
+
+    my @argv;
+    my $arg;
+    my $parse_options = 1;
+    my $errors = 0;
+
+    while ($arg = shift(@$arglist))
+    {
+	if ($parse_options && $arg eq '--')
+	{
+	    $parse_options = 0;
+	    next;
+	}
+
+	if ($parse_options && $arg =~ /^-+\w/)
+	{
+	    $arg =~ s/^-+//;
+
+	    if (defined $option{$arg})
+	    {
+		&process_arg($option{$arg}, $arglist, \$errors);
+	    }
+	    elsif (!$allow_extra_options)
+	    {
+		print STDOUT "$arg is not a valid option.\n";
+		$errors++;
+	    }
+	}
+	else
+	{
+	    push(@argv, $arg);
+	}
+    }
+    @$arglist = @argv;
+
+    foreach $arg (keys %option)
+    {
+	if ($option{$arg}->{'set'} == 0)
+	{
+	    if (defined $option{$arg}->{'default'})
+	    {
+		&set_var($option{$arg}, $option{$arg}->{'default'});
+	    }
+	    elsif (!$option{$arg}->{'regex'})
+	    {
+		&set_var($option{$arg}, 0)
+	    }
+	    elsif (ref($option{$arg}->{'varref'}) ne 'ARRAY')
+	    {
+		print STDOUT "Missing command line argument -$arg.\n";
+		$errors++;
+	    }
+	}
+    }
+    return $errors == 0;
+}
+
+sub process_arg
+{
+    my ($option, $arglist, $errors) = @_;
+
+    if ($option->{'regex'} && @$arglist > 0 && $arglist->[0] !~ /^-+\w/)
+    {
+	if ($arglist->[0] =~ /$option->{'regex'}/)
+	{
+	    &set_var($option, shift(@$arglist));
+	}
+	else
+	{
+	    print STDOUT  "Bad value for -$option->{'name'} argument.\n";
+	    $$errors++;
+	}
+    }
+    elsif (!$option->{'regex'})
+    {
+	&set_var($option, 1);
+    }
+    else
+    {
+	print STDOUT "No value given for -$option->{'name'}.\n";
+	$$errors++;
+    }
+}
+
+sub set_var
+{
+    my ($option, $value) = @_;
+    my $type = ref($option->{'varref'});
+
+    if ($type eq 'SCALAR')
+    {
+	${$option->{'varref'}} = $value;
+    }
+    elsif ($type eq 'ARRAY')
+    {
+	push(@{$option->{'varref'}}, $value);
+    }
+    $option->{'set'} = 1;
+}
+
+1;
+
+
+
+
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/parse2.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/parse2.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/parse2.pm	(revision 24799)
@@ -0,0 +1,381 @@
+###########################################################################
+#
+# parse2.pm --
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2005-2010 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+
+#Last: Keeping doing the processArg for handing different type of arguments
+
+#parse2(\@_,$arguments,$self )
+
+package parse2;
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    die "GSDLOS not set\n" unless defined $ENV{'GSDLOS'};
+
+    my $current_library_paths = join(":",@INC);
+    my $gsdl_perllib_path = $ENV{'GSDLHOME'} . '/perllib';
+    if ($current_library_paths !~ /$gsdl_perllib_path/)
+    {
+      unshift (@INC, $gsdl_perllib_path); # [jmt12]
+    }
+    my $gsdl_cpan_path = $gsdl_perllib_path . '/cpan';
+    if ($current_library_paths !~ /$gsdl_cpan_path/)
+    {
+      unshift (@INC, $gsdl_cpan_path); # [jmt12]
+    }
+}
+
+use strict;
+use util;
+
+
+
+#--Local Util Functions----------------------------
+#-----------------------------------------
+# Name: transformArg
+# Parameters: 1.(Array pointer of plugin pre-defined argument list)
+# Pre-condition: Call this function and pass a array pointer of argument list.
+# Post-condition: This function will transform the array to a hash table 
+#                 with "Argument name" as its key
+# Return value: Return a hash table of plugin pre-defined argument 
+#               list with "argument name" as the key
+#-----------------------------------------
+sub transformArg
+{
+    my ($aryptSysArguList) = @_;
+    my %hashArg;
+    
+    foreach my $hashOneArg (@{$aryptSysArguList})
+    {
+	if(!(defined $hashArg{$hashOneArg->{"name"}}))
+	{
+	    $hashArg{$hashOneArg->{"name"}} = $hashOneArg;
+	}
+    }
+    return %hashArg;
+}
+
+sub checkRange
+{
+    my ($strRange,$intInputArg,$strArgName) = @_;
+    my @aryRange = split(",",$strRange);
+    if(defined $aryRange[0])
+    {
+	if($intInputArg < $aryRange[0])
+	{
+	    print STDERR " Parameter Parsing Error (Incorrect Range): when parse argument parameter for \"-$strArgName\"\n";
+	    return 0;
+	}
+	else
+	{
+	    if(scalar(@aryRange) == 2)
+	    { 
+		if($intInputArg > $aryRange[1])
+		{
+		    print STDERR " Parameter Parsing Error (Incorrect Range): when parse argument parameter for \"-$strArgName\"\n";
+		    return 0;
+		}
+	    }
+	}
+    }
+    else{ die " System error: minimum range is not defined. Possible mistyping in Argument list for $strArgName\n";}
+    return 1;
+}
+
+sub checkCharLength
+{
+    my ($intCharLength,$intInputArg,$strArgName) = @_;
+    if($intCharLength =~ m/\d/)
+    {
+	if(length($intInputArg) != $intCharLength)
+	{ 
+	    print STDERR " Parameter Parsing Error (Incorrect Char_Length): when parse argument parameter for \"-$strArgName\"\n";
+	    return 0;
+	}
+    }
+    else
+    {
+	die " System error: incorrect char_length. Possible mistyping in Argument list for $strArgName\n";
+    }
+    return 1;
+}
+#-----------------------------------------
+# Name: processArg
+# Parameters: 1.(Hash pointer of one argument)
+#             2.(Array pointer of the user given argument)
+#             3.(Hash pointer of user given arguments' values)
+# Pre-condition: Given a argument ($hashOneArg) 
+# Post-condition: System will check whether it need to get parameter 
+#                 from $aryptInputArguList or not, and also check the 
+#                 given parameter is following the argument description
+# Return value: 1 is parsing successful, 0 is failed.
+#-----------------------------------------
+sub processArg
+{
+    my ($hashOneArg,$aryptInputArguList,$hashInputArg) = @_;
+
+    # Since these two variables are going to be 
+    # used a lot, store them with some better names.
+    my $strArgName = $hashOneArg->{"name"};
+    my $strArgType = $hashOneArg->{"type"};
+
+    # If the argument type is "flag" then 
+    # set it to 1(which is "true") 
+    if($strArgType eq "flag")
+    {
+	$hashInputArg->{$strArgName} = 1;
+    }
+
+    # If the argument type is "int" then
+    # gets the next argument from $aryptInputArguList 
+    # and check whether it is a digit
+    # TODO: check its "range" and "char_length"
+    elsif($strArgType eq "int")
+    {
+	my $intInputArg = shift(@{$aryptInputArguList});
+	if ($intInputArg =~ /\d+/)
+	{
+	    $hashInputArg->{$strArgName} = $intInputArg;
+	}
+	else
+	{
+	    print STDERR " Error: occur in parse2.pm::processArg()\n Unmatched Argument: -$strArgName with type $strArgType\n";
+	    return 0;
+	}
+    }
+
+    # If the argument type is "enum" then
+    elsif($strArgType eq "enum")
+    {
+	if(defined $hashOneArg->{"list"})
+	{
+	    my $aryptList = $hashOneArg->{"list"};
+	    my $blnCheckInList = "false";
+	    my $strInputArg = shift(@{$aryptInputArguList});
+	    foreach my $hashEachItem (@$aryptList)
+	    {
+		if($strInputArg eq $hashEachItem->{"name"})
+		{
+		    $blnCheckInList = "true";
+		}
+		last if($blnCheckInList eq "true");
+	    }
+	    if($blnCheckInList ne "true")
+	    {
+		print STDERR " Error: occur in parse2.pm::processArg()\n Unknown Enum List Type: -$strArgName with parameter: $strInputArg\n";
+		return 0;
+	    } else {
+		$hashInputArg->{$strArgName} = $strInputArg;
+	    }
+	    
+	}
+	else
+	{
+	    print STDERR " Error: occur in parse2.pm::processArg(2)\n Unknown Type: -$strArgName with type $strArgType\n";
+	    return 0;
+	}
+    }
+
+    # If the argument type is "string" or "metadata" or "quotestr" then
+    # just shift the next argument from $aryptInputArguList
+    # TODO: make sure if there is any checking required for this two types
+    elsif($strArgType eq "string" || $strArgType eq "enumstring" || $strArgType eq "quotestr" || $strArgType eq "metadata" || $strArgType eq "regexp" || $strArgType eq "url")
+    {
+	$hashInputArg->{$strArgName}= shift(@{$aryptInputArguList});
+    }
+    
+    # Report any undefined types
+    else
+    {
+	print STDERR " Error: occur in parse2.pm::processArg(3)\n Unknown Type: -$strArgName with type $strArgType\n";
+	return 0;
+    }
+    
+    return 1;
+}
+
+#--Main Parsing Function----------------------------
+#-----------------------------------------
+# Name: parse
+# Parameters: 1.(Array pointer of the user given argument)
+#             2.(Array pointer of plugin pre-defined argument list)  
+#             3.(Hash pointer, where we store all the argument value)
+# Pre-condition: Plugin gives the parameters to parse function in parse2 
+# Post-condition: Store all the default or user given values to the hash->{$ArgumentName}.
+#                 Since hash may be a plugin $self, plugin will have every values we set.
+#             4. Optional "allow_extra_options" argument. If this is set, then
+#                its ok to have arguments that are not in the predefined list
+# Return value: -1 if parsing is unsuccessful
+#                other value for success. This will be 0 unless "allow_extra_options" is set, in which case it will be the number of extra arguments found. 
+#-----------------------------------------
+sub parse
+{
+    # Get the user supplied arguments pointer "\@_"
+    my $aryptUserArguList = shift; 
+
+    # Check if allow extra arguments
+    my $blnAllowExtraOptions = "false";
+    
+    if(scalar(@_) == 3)
+    { 
+	my $strAllowExtraOptions = pop @_;
+	
+	if ($strAllowExtraOptions eq "allow_extra_options") 
+	{
+	    $blnAllowExtraOptions = "true";    
+	} 
+    }
+    
+    my ($aryptSysArguList,$self) = @_;
+    my %hashArg;
+    my %hashInputArg;
+    my @ExtraOption;
+
+    # Transform the system argument (predefined the code) 
+    # from array to hash table for increasing performance
+    %hashArg = &transformArg($aryptSysArguList);
+
+    # Process each User input argument and store the 
+    # information into hashInputArg
+    while (my $strOneArg = shift(@{$aryptUserArguList}))
+    {
+	# Check whether it start with a "-" sign
+	if ($strOneArg =~ /^-+\w/)
+	{
+	    # If it is start with a "-" sign then take it off
+	    $strOneArg =~ s/^-+//;
+
+	    # If the inputed argument is defined in the argument 
+	    # list from this plugin then process
+	    
+	    if(defined $hashArg{$strOneArg})
+	    {
+		#$%^
+		#print "($strOneArg) is processed\n";
+		# Process this argument and store the related 
+		# information in %hashInputArg
+		if(processArg($hashArg{$strOneArg},$aryptUserArguList,\%hashInputArg) == 0){ 
+		    print STDERR "<BadArgumentValue a=$strOneArg>\n";
+		    return -1;}
+	    }
+	    
+	    # Else check if it allows extra options, if yes 
+	    # then push it to a new array, else return fault
+	    else
+	    {
+		if($blnAllowExtraOptions eq "true")
+		{
+		    push(@ExtraOption,"-$strOneArg");
+		}
+		else
+		{
+		    print STDERR "<BadArgument a=$strOneArg>\n";
+		    print STDERR " Error: occur in parse2.pm::parse()\n Extra Arguments: $strOneArg\n";
+		    return -1;
+		}
+	    }
+	}
+	
+	# This part follow the previous parsing system. 
+	# It doesn't return error message even user
+	# gave a invalid argument.
+	else
+	{
+	    if($blnAllowExtraOptions eq "true")
+	    {
+		push(@ExtraOption,$strOneArg);
+	    }
+	    else
+	    {
+		print STDERR " Error: occur in parse2.pm::parse()\n Invalid Argument: $strOneArg\n";
+		return -1;
+	    }
+	}
+    }
+
+    # Store the extra option back 
+    # to the user given argument list.
+    @$aryptUserArguList = @ExtraOption;
+    
+    # Now we go through all the pre defined arguments, 
+    # if the user has specified the arguments then just 
+    # set to whatever they set. Otherwise use the default value
+    foreach my $hashOneArg (@{$aryptSysArguList})
+    {
+	my $strArgName = $hashOneArg->{"name"};
+
+	# If the strArgName has defined in the %hashInputArg, 
+	# this means users has give this argument, store the 
+	# user given to self->{"$strArgName"}
+	if(defined $hashInputArg{$strArgName})
+	{
+	    if(defined $hashOneArg->{"range"}) 
+	    {
+		if(checkRange($hashOneArg->{"range"},$hashInputArg{$strArgName},$strArgName) == 0){ return -1;}
+	    }
+	    if(defined $hashOneArg->{"char_length"})
+	    {
+		if(checkCharLength($hashOneArg->{"char_length"},$hashInputArg{$strArgName},$strArgName) == 0){ return -1;}
+	    }
+	    $self->{"$strArgName"} = $hashInputArg{"$strArgName"};
+	}
+	elsif (!defined $self->{$strArgName}) 
+	{
+	    # don't want to override default with superclass value
+	  
+	    # Else use the default value of the arguments, 
+	    # if there is no default value, then it must be a flag, 
+	    # then set it to 0 (which is false)
+	
+	    if(defined $hashOneArg->{"deft"})
+	    {
+		$self->{"$strArgName"} = $hashOneArg->{"deft"};
+	    }
+	    else
+	    {
+		if($hashOneArg->{"type"} eq "flag"){ 
+		    $self->{"$strArgName"} = 0;
+		}
+		else {
+		    # all other cases, use "" as default
+		    $self->{"$strArgName"} = "";
+		}
+	    }
+	}
+    }
+
+    # If allow_extra_options is set, then return the number of arguments left in the argument list.
+    if($blnAllowExtraOptions eq "true")
+    {
+	return scalar(@$aryptUserArguList);
+    }
+    else
+    {
+	return 0;
+    }
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/parse3.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/parse3.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/parse3.pm	(revision 24799)
@@ -0,0 +1,363 @@
+#Last: Keeping doing the processArg for handing different type of arguments
+
+#parse3(\@_,$arguments,$self )
+
+package parse3;
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    die "GSDLOS not set\n" unless defined $ENV{'GSDLOS'};
+
+    my $current_library_paths = join(":",@INC);
+    my $gsdl_perllib_path = $ENV{'GSDLHOME'} . '/perllib';
+    if ($current_library_paths !~ /$gsdl_perllib_path/)
+    {
+      unshift (@INC, $gsdl_perllib_path); # [jmt12]
+    }
+    my $gsdl_cpan_path = $gsdl_perllib_path . '/cpan';
+    if ($current_library_paths !~ /$gsdl_cpan_path/)
+    {
+      unshift (@INC, $gsdl_cpan_path); # [jmt12]
+    }
+}
+
+use util;
+
+
+
+#--Local Util Functions----------------------------
+#-----------------------------------------
+# Name: transformArg
+# Parameters: 1.(Array pointer of plugin pre-defined argument list)
+# Pre-condition: Call this function and pass a array pointer of argument list.
+# Post-condition: This function will transform the array to a hash table 
+#                 with "Argument name" as its key
+# Return value: Return a hash table of plugin pre-defined argument 
+#               list with "argument name" as the key
+#-----------------------------------------
+sub transformArg
+{
+    my ($aryptSysArguList) = @_;
+    my %hashArg;
+    
+    foreach my $hashOneArg (@{$aryptSysArguList})
+    {
+	if(!(defined $hashArg{$hashOneArg->{"name"}}))
+	{
+	    $hashArg{$hashOneArg->{"name"}} = $hashOneArg;
+	}
+    }
+    return %hashArg;
+}
+
+sub checkRange
+{
+    my ($strRange,$intInputArg,$strArgName) = @_;
+    my @aryRange = split(",",$strRange);
+    if(defined $aryRange[0])
+    {
+	if($intInputArg < $aryRange[0])
+	{
+	    print STDERR " Parameter Parsing Error (Incorrect Range): when parse argument parameter for \"-$strArgName\"\n";
+	    return 0;
+	}
+	else
+	{
+	    if(scalar(@aryRange) == 2)
+	    { 
+		if($intInputArg > $aryRange[1])
+		{
+		    print STDERR " Parameter Parsing Error (Incorrect Range): when parse argument parameter for \"-$strArgName\"\n";
+		    return 0;
+		}
+	    }
+	}
+    }
+    else{ die " System error: minimum range is not defined. Possible mistyping in Argument list for $strArgName\n";}
+    return 1;
+}
+
+sub checkCharLength
+{
+    my ($intCharLength,$intInputArg,$strArgName) = @_;
+    if($intCharLength =~ m/\d/)
+    {
+	if(length($intInputArg) != $intCharLength)
+	{ 
+	    print STDERR " Parameter Parsing Error (Incorrect Char_Length): when parse argument parameter for \"-$strArgName\"\n";
+	    return 0;
+	}
+    }
+    else
+    {
+	die " System error: incorrect char_length. Possible mistyping in Argument list for $strArgName\n";
+    }
+    return 1;
+}
+#-----------------------------------------
+# Name: processArg
+# Parameters: 1.(Hash pointer of one argument)
+#             2.(Array pointer of the user given argument)
+#             3.(Hash pointer of user given arguments' values)
+# Pre-condition: Given a argument ($hashOneArg) 
+# Post-condition: System will check whether it need to get parameter 
+#                 from $aryptInputArguList or not, and also check the 
+#                 given parameter is following the argument description
+# Return value: 1 is parsing successful, 0 is failed.
+#-----------------------------------------
+sub processArg
+{
+    my ($hashOneArg,$aryptInputArguList,$hashInputArg) = @_;
+
+    # Since these two variables are going to be 
+    # used a lot, store them with some better names.
+    my $strArgName = $hashOneArg->{"name"};
+    my $strArgType = $hashOneArg->{"type"};
+
+    # If the argument type is "flag" then 
+    # set it to 1(which is "true") 
+    if($strArgType eq "flag")
+    {
+	$hashInputArg->{$strArgName} = 1;
+    }
+
+    # If the argument type is "int" then
+    # gets the next argument from $aryptInputArguList 
+    # and check whether it is a digit
+    # TODO: check its "range" and "char_length"
+    elsif($strArgType eq "int")
+    {
+	my $intInputArg = shift(@{$aryptInputArguList});
+	if ($intInputArg =~ /\d+/)
+	{
+	    $hashInputArg->{$strArgName} = $intInputArg;
+	}
+	else
+	{
+	    print STDERR " Error: occur in parse3.pm::processArg()\n Unmatched Argument: -$strArgName with type $strArgType\n";
+	    return 0;
+	}
+    }
+
+    # If the argument type is "enum" then
+    elsif($strArgType eq "enum")
+    {
+	if(defined $hashOneArg->{"list"})
+	{
+	    my $aryptList = $hashOneArg->{"list"};
+	    my $blnCheckInList = "false";
+	    my $strInputArg = shift(@{$aryptInputArguList});
+	    foreach my $hashEachItem (@$aryptList)
+	    {
+		if($strInputArg eq $hashEachItem->{"name"})
+		{
+		    $blnCheckInList = "true";
+		}
+		last if($blnCheckInList eq "true");
+	    }
+	    if($blnCheckInList ne "true")
+	    {
+		print STDERR " Error: occur in parse3.pm::processArg()\n Unknown Enum List Type: -$strArgName with parameter: $strInputArg\n";
+		return 0;
+	    } else {
+		$hashInputArg->{$strArgName} = $strInputArg;
+	    }
+	    
+	}
+	else
+	{
+	    print STDERR " Error: occur in parse3.pm::processArg(2)\n Unknown Type: -$strArgName with type $strArgType\n";
+	    return 0;
+	}
+    }
+
+    # If the argument type is "string" or "metadata" then
+    # just shift the next argument from $aryptInputArguList
+    # TODO: make sure if there is any checking required for this two types
+    elsif($strArgType eq "string" || $strArgType eq "metadata" || $strArgType eq "regexp" || $strArgType eq "url")
+    {
+	$hashInputArg->{$strArgName}= shift(@{$aryptInputArguList});
+    }
+    #if the argument type is "quotestr", then the next several arguments must be shifted from $aryptInputArugList
+    #lets see if we can detect an end double quote
+    elsif($strArgType eq "quotestr") 
+    {
+	my $tmpstr = shift(@{$aryptInputArguList}); 
+	$hashInputArg->{$strArgName} = ""; 
+	while($tmpstr !~ /\"$/)  {
+             $hashInputArg->{$strArgName} = $hashInputArg->{$strArgName}." ".$tmpstr; 
+	     $tmpstr = shift(@{$aryptInputArguList}); 
+        }
+        $hashInputArg->{$strArgName} = $hashInputArg->{$strArgName}." ".$tmpstr; 
+    }
+    else
+    {
+	print STDERR " Error: occur in parse3.pm::processArg(3)\n Unknown Type: -$strArgName with type $strArgType\n";
+	return 0;
+    }
+    
+    return 1;
+}
+
+#--Main Parsing Function----------------------------
+#-----------------------------------------
+# Name: parse
+# Parameters: 1.(Array pointer of the user given argument)
+#             2.(Array pointer of plugin pre-defined argument list)  
+#             3.(Hash pointer, where we store all the argument value)
+# Pre-condition: Plugin gives the parameters to parse function in parse3 
+# Post-condition: Store all the default or user given values to the hash->{$ArgumentName}.
+#                 Since hash may be a plugin $self, plugin will have every values we set.
+#             4. Optional "allow_extra_options" argument. If this is set, then
+#                its ok to have arguments that are not in the predefined list
+# Return value: -1 if parsing is unsuccessful
+#                other value for success. This will be 0 unless "allow_extra_options" is set, in which case it will be the number of extra arguments found. 
+#-----------------------------------------
+sub parse
+{
+    # Get the user supplied arguments pointer "\@_"
+    my $aryptUserArguList = shift; 
+
+    # Check if allow extra arguments
+    my $blnAllowExtraOptions = "false";
+    
+    if(scalar(@_) == 3)
+    { 
+	my $strAllowExtraOptions = pop @_;
+	
+	if ($strAllowExtraOptions eq "allow_extra_options") 
+	{
+	    $blnAllowExtraOptions = "true";    
+	} 
+    }
+    
+    my ($aryptSysArguList,$self) = @_;
+    my %hashArg;
+    my %hashInputArg;
+    my @ExtraOption;
+
+    # Transform the system argument (predefined the code) 
+    # from array to hash table for increasing performance
+    %hashArg = &transformArg($aryptSysArguList);
+
+    # Process each User input argument and store the 
+    # information into hashInputArg
+    while (my $strOneArg = shift(@{$aryptUserArguList}))
+    {
+	# Check whether it start with a "-" sign
+	if ($strOneArg =~ /^-+\w/)
+	{
+	    # If it is start with a "-" sign then take it off
+	    $strOneArg =~ s/^-+//;
+
+	    # If the inputed argument is defined in the argument 
+	    # list from this plugin then process
+	    
+	    if(defined $hashArg{$strOneArg})
+	    {
+		#$%^
+		#print "($strOneArg) is processed\n";
+		# Process this argument and store the related 
+		# information in %hashInputArg
+		if(processArg($hashArg{$strOneArg},$aryptUserArguList,\%hashInputArg) == 0){ 
+		    print STDERR "<BadArgumentValue a=$strOneArg>\n";
+		    return -1;}
+	    }
+	    
+	    # Else check if it allows extra options, if yes 
+	    # then push it to a new array, else return fault
+	    else
+	    {
+		if($blnAllowExtraOptions eq "true")
+		{
+		    push(@ExtraOption,"-$strOneArg");
+		}
+		else
+		{
+		    print STDERR "<BadArgument a=$strOneArg>\n";
+		    print STDERR " Error: occur in parse3.pm::parse()\n Extra Arguments: $strOneArg\n";
+		    return -1;
+		}
+	    }
+	}
+	
+	# This part follow the previous parsing system. 
+	# It doesn't return error message even user
+	# gave a invalid argument.
+	else
+	{
+	    if($blnAllowExtraOptions eq "true")
+	    {
+		push(@ExtraOption,$strOneArg);
+	    }
+	    else
+	    {
+		print STDERR " Error: occur in parse3.pm::parse()\n Invalid Argument: $strOneArg\n";
+		return -1;
+	    }
+	}
+    }
+
+    # Store the extra option back 
+    # to the user given argument list.
+    @$aryptUserArguList = @ExtraOption;
+    
+    # Now we go through all the pre defined arguments, 
+    # if the user has specified the arguments then just 
+    # set to whatever they set. Otherwise use the default value
+    foreach my $hashOneArg (@{$aryptSysArguList})
+    {
+	my $strArgName = $hashOneArg->{"name"};
+
+	# If the strArgName has defined in the %hashInputArg, 
+	# this means users has give this argument, store the 
+	# user given to self->{"$strArgName"}
+	if(defined $hashInputArg{$strArgName})
+	{
+	    if(defined $hashOneArg->{"range"}) 
+	    {
+		if(checkRange($hashOneArg->{"range"},$hashInputArg{$strArgName},$strArgName) == 0){ return -1;}
+	    }
+	    if(defined $hashOneArg->{"char_length"})
+	    {
+		if(checkCharLength($hashOneArg->{"char_length"},$hashInputArg{$strArgName},$strArgName) == 0){ return -1;}
+	    }
+	    $self->{"$strArgName"} = $hashInputArg{"$strArgName"};
+	}
+	elsif (!defined $self->{$strArgName}) 
+	{
+	    # don't want to override default with superclass value
+	  
+	    # Else use the default value of the arguments, 
+	    # if there is no default value, then it must be a flag, 
+	    # then set it to 0 (which is false)
+	
+	    if(defined $hashOneArg->{"deft"})
+	    {
+		$self->{"$strArgName"} = $hashOneArg->{"deft"};
+	    }
+	    else
+	    {
+		if($hashOneArg->{"type"} eq "flag"){ 
+		    $self->{"$strArgName"} = 0;
+		}
+		else {
+		    # all other cases, use "" as default
+		    $self->{"$strArgName"} = "";
+		}
+	    }
+	}
+    }
+
+    # If allow_extra_options is set, then return the number of arguments left in the argument list.
+    if($blnAllowExtraOptions eq "true")
+    {
+	return scalar(@$aryptUserArguList);
+    }
+    else
+    {
+	return 0;
+    }
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugin.pm	(revision 24799)
@@ -0,0 +1,474 @@
+###########################################################################
+#
+# plugin.pm -- functions to handle using plugins
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package plugin;
+
+
+use strict; # to pick up typos and undeclared variables...
+no strict 'refs'; # ...but allow filehandles to be variables and vice versa
+no strict 'subs';
+
+require util;
+use gsprintf 'gsprintf';
+
+# mapping from old plugin names to new ones for backwards compatibility
+# can remove at sometime in future when we no longer want to support old xxPlug names in the config file
+my $plugin_name_map = {
+    'GAPlug' => 'GreenstoneXMLPlugin',
+    'ArcPlug' => 'ArchivesInfPlugin',
+    'RecPlug' => 'DirectoryPlugin',
+    'TEXTPlug' => 'TextPlugin',
+    'XMLPlug' => 'ReadXMLFile',
+    'EMAILPlug' => 'EmailPlugin',
+    'SRCPlug' => 'SourceCodePlugin',
+    'NULPlug' => 'NulPlugin',
+    'W3ImgPlug' => 'HTMLImagePlugin',
+    'PagedImgPlug' => 'PagedImagePlugin',
+    'METSPlug' => 'GreenstoneMETSPlugin',
+    'PPTPlug' => 'PowerPointPlugin',
+    'PSPlug' => 'PostScriptPlugin',
+    'DBPlug' => 'DatabasePlugin'
+    };
+
+# global variables
+my $stats = {'num_processed' => 0,
+	     'num_blocked' => 0,
+	     'num_not_processed' => 0,
+	     'num_not_recognised' => 0,
+	     'num_archives' => 0
+	     };
+
+#globaloptions contains any options that should be passed to all plugins
+my ($verbosity, $outhandle, $failhandle, $globaloptions);
+
+sub get_valid_pluginname {
+    my ($pluginname) = @_;
+    my $valid_name = $pluginname;
+    if (defined $plugin_name_map->{$pluginname}) {
+	$valid_name = $plugin_name_map->{$pluginname};
+    } elsif ($pluginname =~ /Plug$/) {
+	$valid_name =~ s/Plug/Plugin/;
+	
+    }
+    return $valid_name;
+}
+
+sub load_plugin_require
+{
+    my ($pluginname) = @_;
+
+    my @check_list = ();
+
+    # pp_plugname shorthand for 'perllib' 'plugin' '$pluginname.pm' 
+    my $pp_plugname 
+	= &util::filename_cat('perllib', 'plugins', "${pluginname}.pm");
+    my $collectdir = $ENV{'GSDLCOLLECTDIR'};
+
+    # find the plugin
+    if (defined($ENV{'GSDLCOLLECTION'}))
+    {
+	my $customplugname 
+	    = &util::filename_cat($collectdir, "custom",$ENV{'GSDLCOLLECTION'},
+				  $pp_plugname);
+	push(@check_list,$customplugname);
+    }
+
+    my $colplugname = &util::filename_cat($collectdir, $pp_plugname);
+    push(@check_list,$colplugname);
+
+    if (defined $ENV{'GSDLEXTS'}) {
+
+	my $ext_prefix = &util::filename_cat($ENV{'GSDLHOME'}, "ext");
+
+	my @extensions = split(/:/,$ENV{'GSDLEXTS'});
+	foreach my $e (@extensions) {
+	    my $extplugname = &util::filename_cat($ext_prefix, $e, $pp_plugname);
+	    push(@check_list,$extplugname);
+
+	}
+    }
+    if (defined $ENV{'GSDL3EXTS'}) {
+
+	my $ext_prefix = &util::filename_cat($ENV{'GSDL3SRCHOME'}, "ext");
+
+	my @extensions = split(/:/,$ENV{'GSDL3EXTS'});
+	foreach my $e (@extensions) {
+	    my $extplugname = &util::filename_cat($ext_prefix, $e, $pp_plugname);
+	    push(@check_list,$extplugname);
+
+	}
+    }
+
+
+    my $mainplugname = &util::filename_cat($ENV{'GSDLHOME'}, $pp_plugname);
+    push(@check_list,$mainplugname);
+
+    my $success=0;
+    foreach my $plugname (@check_list) {
+	if (-e $plugname) {
+	    require $plugname;
+	    $success=1;
+	    last;
+	}
+    }
+
+    if (!$success) {
+	&gsprintf(STDERR, "{plugin.could_not_find_plugin}\n",
+		  $pluginname);
+	die "\n";
+    }
+}
+
+sub load_plugin_for_info {
+    my ($pluginname) = shift @_;
+    $pluginname = &get_valid_pluginname($pluginname);
+    load_plugin_require($pluginname);
+
+    # create a plugin object
+    my ($plugobj);
+    my $options = "-gsdlinfo";
+    
+    eval ("\$plugobj = new \$pluginname([],[$options])");
+    die "$@" if $@;
+
+    return $plugobj;
+}
+
+sub load_plugins {
+    my ($plugin_list) = shift @_;
+    my $incremental_mode;
+    ($verbosity, $outhandle, $failhandle, $globaloptions, $incremental_mode) = @_; # globals
+    my @plugin_objects = ();
+    $verbosity = 2 unless defined $verbosity;
+    $outhandle = 'STDERR' unless defined $outhandle;
+    $failhandle = 'STDERR' unless defined $failhandle;
+
+    my $inc_paths = join(':', @INC);
+    my $colplugindir = &util::filename_cat($ENV{'GSDLCOLLECTDIR'},"perllib/plugins");
+    if ($inc_paths !~ /$colplugindir/)
+    {
+      unshift (@INC, $colplugindir); # [jmt12]
+    }
+
+    map { $_ = "\"$_\""; } @$globaloptions;
+    my $globals = join (",", @$globaloptions);
+
+    foreach my $pluginoptions (@$plugin_list) {
+	my $pluginname = shift @$pluginoptions;
+	next unless defined $pluginname;
+	$pluginname = &get_valid_pluginname($pluginname);
+	load_plugin_require($pluginname);
+
+	# create a plugin object
+	my ($plugobj);
+	map { $_ = "\"$_\""; } @$pluginoptions;
+	my $options = join (",", @$pluginoptions);
+	if ($globals) {
+	    if (@$pluginoptions) {
+		$options .= ",";
+	    }
+	    $options .= "$globals";
+	}
+	# need to escape backslash before putting in to the eval
+	# but watch out for any \" (which shouldn't be further escaped)
+	$options =~ s/\\([^"])/\\\\$1/g; #"
+	$options =~ s/\$/\\\$/g;
+
+	eval ("\$plugobj = new \$pluginname([],[$options])");
+	die "$@" if $@;
+	
+	# initialize plugin
+	$plugobj->init($verbosity, $outhandle, $failhandle);
+	
+	$plugobj->set_incremental($incremental_mode);
+
+	# add this object to the list
+	push (@plugin_objects, $plugobj);
+    }
+
+    return \@plugin_objects;
+}
+
+
+sub begin {
+    my ($pluginfo, $base_dir, $processor, $maxdocs, $gli) = @_;
+
+    map { $_->{'gli'} = $gli; } @$pluginfo;
+    map { $_->begin($pluginfo, $base_dir, $processor, $maxdocs); } @$pluginfo;
+}
+
+ sub remove_all {
+    my ($pluginfo, $base_dir, $processor, $maxdocs) = @_;
+
+    map { $_->remove_all($pluginfo, $base_dir, $processor, $maxdocs); } @$pluginfo;
+}
+  
+sub remove_some {
+    my ($pluginfo, $infodbtype, $archivedir, $deleted_files) = @_;
+    return if (scalar(@$deleted_files)==0);
+    $infodbtype = "gdbm" if $infodbtype eq "gdbm-txtgz";
+    my $arcinfo_src_filename = &dbutil::get_infodb_file_path($infodbtype, "archiveinf-src", $archivedir);
+
+    foreach my $file (@$deleted_files) {
+	# use 'archiveinf-src' info database to look up all the OIDs
+	# that this file is used in (note in most cases, it's just one OID)
+	
+	my $src_rec = &dbutil::read_infodb_entry($infodbtype, $arcinfo_src_filename, $file);
+	my $oids = $src_rec->{'oid'};
+	my $rv;
+	foreach my $plugobj (@$pluginfo) {
+
+	    $rv = $plugobj->remove_one($file, $oids, $archivedir);
+	    if (defined $rv && $rv != -1) {
+		return $rv;
+	    } # else undefined (was not recognised by the plugin) or there was an error, try the next one
+	}
+	return 0;
+    }
+
+}
+sub file_block_read {
+    my ($pluginfo, $base_dir, $file, $block_hash, $metadata, $gli) = @_;
+
+
+    $gli = 0 unless defined $gli;
+
+    my $rv = 0;
+    my $glifile = $file;
+    
+    $glifile =~ s/^[\/\\]+//; # file sometimes starts with a / so get rid of it
+    
+    # Announce to GLI that we are handling a file
+    print STDERR "<File n='$glifile'>\n" if $gli;
+    
+    # the .kill file is a handy (if not very elegant) way of aborting 
+    # an import.pl or buildcol.pl process
+    if (-e &util::filename_cat ($ENV{'GSDLCOLLECTDIR'}, ".kill")) {
+	gsprintf($outhandle, "{plugin.kill_file}\n");
+	die "\n";
+    }
+    
+    foreach my $plugobj (@$pluginfo) {
+
+      	$rv = $plugobj->file_block_read($pluginfo, $base_dir, $file, $block_hash, $metadata, $gli); 
+	#last if (defined $rv && $rv==1); # stop this file once we have found something to 'process' it
+    }
+    
+}
+
+
+sub metadata_read {
+    my ($pluginfo, $base_dir, $file, $block_hash, 
+	$extrametakeys, $extrametadata, $extrametafile, 
+	$processor, $gli, $aux) = @_;
+
+    $gli = 0 unless defined $gli;
+
+    my $rv = 0;
+    my $glifile = $file;
+    
+    $glifile =~ s/^[\/\\]+//; # file sometimes starts with a / so get rid of it
+    
+    # Announce to GLI that we are handling a file
+    print STDERR "<File n='$glifile'>\n" if $gli;
+    
+    # the .kill file is a handy (if not very elegant) way of aborting 
+    # an import.pl or buildcol.pl process
+    if (-e &util::filename_cat ($ENV{'GSDLCOLLECTDIR'}, ".kill")) {
+	gsprintf($outhandle, "{plugin.kill_file}\n");
+	die "\n";
+    }
+
+    my $had_error = 0;
+    # pass this file by each of the plugins in turn until one
+    # is found which will process it
+    # read must return:
+    # undef - could not recognise
+    # -1 - tried but error
+    # 0 - blocked
+    # anything else for successful processing
+	
+    foreach my $plugobj (@$pluginfo) {
+
+	$rv = $plugobj->metadata_read($pluginfo, $base_dir, $file, $block_hash,
+			     $extrametakeys, $extrametadata, $extrametafile,
+			     $processor, $gli, $aux);
+
+	if (defined $rv) {
+	    if ($rv == -1) {
+	        # an error has occurred
+		$had_error = 1;
+		print STDERR "<ProcessingError n='$glifile'>\n" if $gli;
+	    } else {
+        	return $rv;
+	    }
+	} # else undefined - was not recognised by the plugin
+    }
+
+    return 0;
+}
+
+sub read {
+    my ($pluginfo, $base_dir, $file, $block_hash, $metadata, $processor, $maxdocs, $total_count, $gli, $aux) = @_;
+
+    $maxdocs = -1 unless defined $maxdocs && $maxdocs =~ /\d/;
+    $total_count = 0 unless defined $total_count && $total_count =~ /\d/;
+    $gli = 0 unless defined $gli;
+
+    my $rv = 0;
+    my $glifile = $file;
+    
+    $glifile =~ s/^[\/\\]+//; # file sometimes starts with a / so get rid of it
+    
+    # Announce to GLI that we are handling a file
+    print STDERR "<File n='$glifile'>\n" if $gli;
+    
+    # the .kill file is a handy (if not very elegant) way of aborting 
+    # an import.pl or buildcol.pl process
+    if (-e &util::filename_cat ($ENV{'GSDLCOLLECTDIR'}, ".kill")) {
+	gsprintf($outhandle, "{plugin.kill_file}\n");
+	die "\n";
+    }
+
+    my $had_error = 0;
+    # pass this file by each of the plugins in turn until one
+    # is found which will process it
+    # read must return:
+    # undef - could not recognise
+    # -1 - tried but error
+    # 0 - blocked
+    # anything else for successful processing
+	
+    foreach my $plugobj (@$pluginfo) {
+
+      	$rv = $plugobj->read($pluginfo, $base_dir, $file, 
+			     $block_hash, $metadata, $processor, $maxdocs, 
+			     $total_count, $gli, $aux);
+
+	if (defined $rv) {
+	    if ($rv == -1) {
+	        # an error has occurred
+		$had_error = 1;
+	    } else {
+        	return $rv;
+	    }
+	} # else undefined - was not recognised by the plugin
+    }
+
+    if ($had_error) {
+	# was recognised but couldn't be processed
+	if ($verbosity >= 2) {
+	    gsprintf($outhandle, "{plugin.no_plugin_could_process}\n", $file);
+	}
+	# tell the GLI that it was not processed
+	print STDERR "<NonProcessedFile n='$glifile'>\n" if $gli;
+      
+	gsprintf($failhandle, "$file: {plugin.no_plugin_could_process_this_file}\n");
+	$stats->{'num_not_processed'} ++;
+    } else {
+	# was not recognised
+	if ($verbosity >= 2) {
+	    gsprintf($outhandle, "{plugin.no_plugin_could_recognise}\n",$file);
+	}
+	# tell the GLI that it was not processed
+	print STDERR "<NonRecognisedFile n='$glifile'>\n" if $gli;
+	
+	gsprintf($failhandle, "$file: {plugin.no_plugin_could_recognise_this_file}\n");
+	$stats->{'num_not_recognised'} ++;
+    }
+    return 0;
+}
+
+# write out some general stats that the plugins have compiled - note that
+# the buildcol.pl process doesn't currently call this process so the stats
+# are only output after import.pl -
+sub write_stats {
+    my ($pluginfo, $statshandle, $faillog, $gli) = @_;
+
+    $gli = 0 unless defined $gli;
+
+    foreach my $plugobj (@$pluginfo) {
+	$plugobj->compile_stats($stats);
+    }
+
+    my $total = $stats->{'num_processed'} + $stats->{'num_blocked'} + 
+	$stats->{'num_not_processed'} + $stats->{'num_not_recognised'};
+
+    print STDERR "<ImportComplete considered='$total' processed='$stats->{'num_processed'}' blocked='$stats->{'num_blocked'}' ignored='$stats->{'num_not_recognised'}' failed='$stats->{'num_not_processed'}'>\n" if $gli;
+
+    if ($total == 1) {
+	gsprintf($statshandle, "* {plugin.one_considered}\n");
+    } else {
+	gsprintf($statshandle, "* {plugin.n_considered}\n", $total);
+    }
+    if ($stats->{'num_archives'}) {
+	if ($stats->{'num_archives'} == 1) {
+	    gsprintf($statshandle, "   ({plugin.including_archive})\n");
+	}
+	else {
+	    gsprintf($statshandle, "   ({plugin.including_archives})\n",
+		     $stats->{'num_archives'});
+	}
+    }
+    if ($stats->{'num_processed'} == 1) {
+	gsprintf($statshandle, "* {plugin.one_included}\n");
+    } else {
+	gsprintf($statshandle, "* {plugin.n_included}\n", $stats->{'num_processed'});
+    }
+    if ($stats->{'num_not_recognised'}) {
+	if ($stats->{'num_not_recognised'} == 1) {
+	    gsprintf($statshandle, "* {plugin.one_unrecognised}\n");
+	} else {
+	    gsprintf($statshandle, "* {plugin.n_unrecognised}\n",
+		     $stats->{'num_not_recognised'});
+	}
+
+    }
+    if ($stats->{'num_not_processed'}) {
+	if ($stats->{'num_not_processed'} == 1) {
+	    gsprintf($statshandle, "* {plugin.one_rejected}\n");
+	} else {
+	    gsprintf($statshandle, "* {plugin.n_rejected}\n",
+		     $stats->{'num_not_processed'});
+	}
+    }
+    if ($stats->{'num_not_processed'} || $stats->{'num_not_recognised'}) {
+	gsprintf($statshandle, " {plugin.see_faillog}\n", $faillog);
+    }
+}
+
+sub end {
+    my ($pluginfo, $processor) = @_;
+    map { $_->end($processor); } @$pluginfo;
+}
+
+sub deinit {
+    my ($pluginfo, $processor) = @_;
+   
+
+    map { $_->deinit($processor); } @$pluginfo;
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/AcronymExtractor.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/AcronymExtractor.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/AcronymExtractor.pm	(revision 24799)
@@ -0,0 +1,180 @@
+###########################################################################
+#
+# AcronymExtractor - helper plugin that extacts acronyms from text 
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2008 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package AcronymExtractor;
+
+use acronym;
+use PrintInfo;
+use strict;
+
+BEGIN {
+    @AcronymExtractor::ISA = ('PrintInfo');
+}
+
+my $arguments = [
+      { 'name' => "extract_acronyms",
+	'desc' => "{AcronymExtractor.extract_acronyms}",
+	'type' => "flag",
+	'reqd' => "no" },
+      { 'name' => "markup_acronyms",
+	'desc' => "{AcronymExtractor.markup_acronyms}",
+	'type' => "flag",
+	'reqd' => "no" } ];
+
+my $options = { 'name'     => "AcronymExtractor",
+		'desc'     => "{AcronymExtractor.desc}",
+		'abstract' => "yes",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new PrintInfo($pluginlist, $inputargs, $hashArgOptLists,1);
+
+    return bless $self, $class;
+
+}
+
+
+# initialise metadata extractors
+sub initialise_acronym_extractor {
+    my $self = shift (@_);
+
+    if ($self->{'extract_acronyms'} || $self->{'markup_acronyms'}) {
+	&acronym::initialise_acronyms();
+    }
+}
+
+# finalise metadata extractors
+sub finalise_acronym_extractor {
+    my $self = shift (@_);
+
+    if ($self->{'extract_acronyms'} || $self->{'markup_acronyms'}) {
+	&acronym::finalise_acronyms();
+    }
+}
+
+# extract metadata
+sub extract_acronym_metadata {
+
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+    
+
+    if ($self->{'extract_acronyms'}) {
+	my $thissection = $doc_obj->get_top_section();
+	while (defined $thissection) {
+	    my $text = $doc_obj->get_text($thissection);
+	    $self->extract_acronyms (\$text, $doc_obj, $thissection) if $text =~ /./;
+	    $thissection = $doc_obj->get_next_section ($thissection);
+	}
+    }
+    
+    if ($self->{'markup_acronyms'}) {
+	my $thissection = $doc_obj->get_top_section();
+	while (defined $thissection) {
+	    my $text = $doc_obj->get_text($thissection);
+	    $text = $self->markup_acronyms ($text, $doc_obj, $thissection);
+	    $doc_obj->delete_text($thissection);
+	    $doc_obj->add_text($thissection, $text);
+	    $thissection = $doc_obj->get_next_section ($thissection);
+	}
+    }
+
+}
+
+
+
+# extract acronyms from a section in a document. progress is 
+# reported to outhandle based on the verbosity. both the Acronym
+# and the AcronymKWIC metadata items are created. 
+
+sub extract_acronyms {
+    my $self = shift (@_);
+    my ($textref, $doc_obj, $thissection) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    # print $outhandle " extracting acronyms ...\n" 
+    gsprintf($outhandle, " {AcronymExtractor.extracting_acronyms}...\n")
+	if ($self->{'verbosity'} > 2);
+
+    my $acro_array =  &acronym::acronyms($textref);
+    
+    foreach my $acro (@$acro_array) {
+
+	#check that this is the first time ...
+	my $seen_before = "false";
+	my $previous_data = $doc_obj->get_metadata($thissection, "Acronym");
+	foreach my $thisAcro (@$previous_data) {
+	    if ($thisAcro eq $acro->to_string()) {
+		$seen_before = "true";
+		if ($self->{'verbosity'} >= 4) {
+		    gsprintf($outhandle, " {AcronymExtractor.already_seen} " .
+			     $acro->to_string() . "\n");
+		}
+	    }
+	}
+
+	if ($seen_before eq "false") {
+	    #write it to the file ...
+	    $acro->write_to_file();
+
+	    #do the normal acronym
+	    $doc_obj->add_utf8_metadata($thissection, "Acronym",  $acro->to_string());
+	    gsprintf($outhandle, " {AcronymExtractor.adding} ".$acro->to_string()."\n")
+		if ($self->{'verbosity'} > 3);
+	}
+    }
+
+    gsprintf($outhandle, " {AcronymExtractor.done_acronym_extract}\n")
+	if ($self->{'verbosity'} > 2);
+}
+
+sub markup_acronyms {
+    my $self = shift (@_);
+    my ($text, $doc_obj, $thissection) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    gsprintf($outhandle, " {AcronymExtractor.marking_up_acronyms}...\n")
+	if ($self->{'verbosity'} > 2);
+
+    #self is passed in to check for verbosity ...
+    $text = &acronym::markup_acronyms($text, $self);
+
+    gsprintf($outhandle, " {AcronymExtractor.done_acronym_markup}\n")
+	if ($self->{'verbosity'} > 2);
+
+    return $text;
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/ArchivesInfPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/ArchivesInfPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/ArchivesInfPlugin.pm	(revision 24799)
@@ -0,0 +1,330 @@
+###########################################################################
+#
+# ArchivesInfPlugin.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# plugin which reads through an archives.inf (or archiveinf-doc info database equivalent)
+# -- i.e. the file generated in the archives directory when an import is done),
+# processing each file it finds
+
+package ArchivesInfPlugin;
+
+use util;
+use doc;
+use PrintInfo;
+use plugin;
+use arcinfo;
+use gsprintf;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+
+BEGIN {
+    @ArchivesInfPlugin::ISA = ('PrintInfo');
+}
+
+my $arguments = [
+      { 'name' => "reversesort",
+	'desc' => "{ArchivesInfPlugin.reversesort}",
+	'type' => "flag",
+	'reqd' => "no",
+	'modegli' => "2" },
+
+		 ];
+
+my $options = { 'name'     => "ArchivesInfPlugin",
+		'desc'     => "{ArchivesInfPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+	        'args' => $arguments};
+         
+sub gsprintf
+{
+    return &gsprintf::gsprintf(@_);
+}
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new PrintInfo($pluginlist, $inputargs, $hashArgOptLists);
+
+    return bless $self, $class;
+}
+
+# called once, at the start of processing
+sub init {
+    my $self = shift (@_);
+    my ($verbosity, $outhandle, $failhandle) = @_;
+
+    # verbosity is passed through from the processor
+    $self->{'verbosity'} = $verbosity;
+
+    # as are the outhandle and failhandle
+    $self->{'outhandle'} = $outhandle if defined $outhandle;
+    $self->{'failhandle'} = $failhandle;
+
+}
+
+sub deinit {
+    my ($self) = @_;
+
+    my $archive_info = $self->{'archive_info'};
+    my $verbosity = $self->{'verbosity'};
+    my $outhandle = $self->{'outhandle'};
+
+    if (defined $archive_info) {
+        # Get the infodbtype value for this collection from the arcinfo object
+        my $infodbtype = $archive_info->{'infodbtype'};
+	my $archive_info_filename = $self->{'archive_info_filename'};
+	my $infodb_file_handle = &dbutil::open_infodb_write_handle($infodbtype, $archive_info_filename, "append");
+
+       	my $file_list = $archive_info->get_file_list();
+
+	foreach my $subfile (@$file_list) {	    
+	    my $doc_oid = $subfile->[1];
+
+	    my $index_status = $archive_info->get_status_info($doc_oid);
+
+	    if ($index_status eq "D") {
+		# delete
+		$archive_info->delete_info($doc_oid);
+		&dbutil::delete_infodb_entry($infodbtype, $infodb_file_handle, $doc_oid);
+
+		my $doc_file = $subfile->[0];
+		my $base_dir =$self->{'base_dir'};
+
+		my $doc_filename = &util::filename_cat($base_dir,$doc_file);
+
+		my ($doc_tailname, $doc_dirname, $suffix) 
+		    = File::Basename::fileparse($doc_filename, "\\.[^\\.]+\$");
+
+		print $outhandle "Removing $doc_dirname\n" if ($verbosity>2);
+
+		&util::rm_r($doc_dirname);
+
+
+	    }
+	    elsif ($index_status =~ m/^(I|R)$/) {
+		# mark as "been indexed"
+		$archive_info->set_status_info($doc_oid,"B");
+	    }
+	}
+
+	&dbutil::close_infodb_write_handle($infodbtype, $infodb_file_handle);
+	$archive_info->save_info($archive_info_filename);
+    }
+}
+
+# called at the beginning of each plugin pass (import has one, buildin has many)
+sub begin {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $processor, $maxdocs) = @_;
+
+    $self->{'base_dir'} = $base_dir;
+}
+
+sub remove_all {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $processor, $maxdocs) = @_;
+}
+
+sub remove_one {
+    my $self = shift (@_);
+    my ($file, $oids, $archivedir) = @_;
+    return undef; # only called during import at this stage, this will never be processing a file
+    
+}
+
+
+# called at the end of each plugin pass
+sub end {
+    my ($self) = shift (@_);
+
+}
+
+
+# return 1 if this class might recurse using $pluginfo
+sub is_recursive {
+    my $self = shift (@_);
+
+    return 1;
+}
+
+
+sub compile_stats {
+    my $self = shift(@_);
+    my ($stats) = @_;
+}
+
+# We don't do metadata_read
+sub metadata_read {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $block_hash, 
+	$extrametakeys, $extrametadata, $extrametafile,
+	$processor, $gli, $aux) = @_;
+
+    return undef;
+}
+
+sub file_block_read {
+
+    my $self = shift (@_);  
+    my ($pluginfo, $base_dir, $file, $block_hash, $metadata, $gli) = @_;
+
+    if ($file eq "OIDcount") {
+	my ($filename_full_path, $filename_no_path) 
+	    = &util::get_full_filenames($base_dir, $file);
+	&util::block_filename($block_hash,$filename_full_path);
+	return 1;
+    }
+
+    # otherwise, we don't do any file blocking
+
+    return undef;
+}
+
+
+# return number of files processed, undef if can't process
+# Note that $base_dir might be "" and that $file might 
+# include directories
+sub read {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $block_hash, $metadata, $processor, $maxdocs,$total_count, $gli) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    my $count = 0;
+
+    # This function only makes sense at build-time
+    return if (ref($processor) !~ /buildproc$/i);
+
+    # Get the infodbtype value for this collection from the buildproc object
+    my $infodbtype = $processor->{'infodbtype'};
+    $infodbtype = "gdbm" if $infodbtype eq "gdbm-txtgz";
+    
+    # see if this has a archives information file within it
+##    my $archive_info_filename = &util::filename_cat($base_dir,$file,"archives.inf");
+    my $archive_info_filename = &dbutil::get_infodb_file_path($infodbtype, "archiveinf-doc", &util::filename_cat($base_dir, $file));
+
+    if (-e $archive_info_filename) {
+
+	# found an archives.inf file
+	&gsprintf($outhandle, "ArchivesInfPlugin: {common.processing} $archive_info_filename\n") if $self->{'verbosity'} > 1;
+
+	# read in the archives information file
+	my $archive_info = new arcinfo($infodbtype);
+	$self->{'archive_info'} = $archive_info;
+	$self->{'archive_info_filename'} = $archive_info_filename;
+	if ($self->{'reversesort'}) {
+	    $archive_info->reverse_sort();
+	}
+	
+	$archive_info->load_info ($archive_info_filename);
+	
+	my $file_list = $archive_info->get_file_list();
+
+	# process each file
+	foreach my $subfile (@$file_list) {
+
+	    last if ($maxdocs != -1 && ($total_count + $count) >= $maxdocs);
+
+	    my $tmp = &util::filename_cat ($file, $subfile->[0]);
+	    next if $tmp eq $file;
+
+	    my $doc_oid = $subfile->[1];
+	    my $index_status = $archive_info->get_status_info($doc_oid);
+
+	    my $curr_mode = $processor->get_mode();
+	    my $new_mode = $curr_mode;
+
+	    # Start by assuming we want to process the file...
+	    my $process_file = 1;
+
+	    # ...unless the build processor is incremental capable and -incremental was specified, in which case we need to check its index_status flag
+	    if ($processor->is_incremental_capable() && $self->{'incremental'})
+	    {
+	        # Check to see if the file needs indexing
+		if ($index_status eq "B")
+		{
+		    # Don't process this file as it has already been indexed
+		    $process_file = 0;
+		}
+		elsif ($index_status eq "D") {
+		    # Need to be delete it from the index.
+		    $new_mode = $curr_mode."delete";
+		    $process_file = 1;
+		}
+		elsif ($index_status eq "R") {
+		    # Need to be reindexed/replaced
+		    $new_mode = $curr_mode."reindex";
+
+		    $process_file = 1;
+		}
+	    }
+	    # ... or we're being asked to delete it (in which case skip it)
+	    elsif ($index_status eq "D") {
+		# Non-incremental Delete
+		# It's already been deleted from the archives directory
+		# (done during import.pl)
+		# => All we need to do here is not process it
+
+		$process_file = 0;
+	    }
+
+	    if (!$processor->is_incremental_capable() && $self->{'incremental'}) {
+		# Nag feature
+		if (!defined $self->{'incremental-warning'}) {
+		    print $outhandle "\n";
+		    print $outhandle "Warning: command-line option '-incremental' used with *non-incremental*\n";
+		    print $outhandle "         processor '", ref $processor, "'. Some conflicts may arise.\n";
+		    print $outhandle "\n";
+		    sleep 10;
+		    $self->{'incremental-warning'} = 1;
+		}
+	    }
+
+	    if ($process_file) {
+		# note: metadata is not carried on to the next level
+		
+		$processor->set_mode($new_mode) if ($new_mode ne $curr_mode);
+
+		$count += &plugin::read ($pluginfo, $base_dir, $tmp, $block_hash, {}, $processor, $maxdocs, ($total_count+$count), $gli);
+
+		$processor->set_mode($curr_mode) if ($new_mode ne $curr_mode);
+	    }
+	}
+
+	return $count;
+    }
+
+
+    # wasn't an archives directory, someone else will have to process it
+    return undef;
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/AutoExtractMetadata.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/AutoExtractMetadata.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/AutoExtractMetadata.pm	(revision 24799)
@@ -0,0 +1,150 @@
+###########################################################################
+#
+# AutoExtractMetadata.pm -- base plugin for all plugins that want to do metadata extraction from text and/or metadata 
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2008 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# This plugin uses the supporting Extractors to add metadata extraction 
+# functionality to BasePlugin.
+
+
+package AutoExtractMetadata;
+
+use strict; 
+no strict 'subs';
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+use BasePlugin;
+use AcronymExtractor;
+use KeyphraseExtractor;
+use EmailAddressExtractor;
+use DateExtractor;
+use GISExtractor;
+
+sub BEGIN {
+    @AutoExtractMetadata::ISA = ( 'BasePlugin', 'AcronymExtractor', 'KeyphraseExtractor', 'EmailAddressExtractor', 'DateExtractor','GISExtractor' );
+}
+
+my $arguments = [
+		 {'name' => "first",
+		  'desc' => "{AutoExtractMetadata.first}",
+		  'type' => "string",
+		  'reqd' => "no" }
+		 ];
+
+
+my $options = { 'name'     => "AutoExtractMetadata",
+		'desc'     => "{AutoExtractMetadata.desc}",
+		'abstract' => "yes",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+
+sub new {
+
+    # Start the AutoExtractMetadata Constructor
+    my $class = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists,$auxiliary) = @_;
+    push(@$pluginlist, $class);
+    
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    # load up the options and args for the supporting plugins
+    new AcronymExtractor($pluginlist, $inputargs, $hashArgOptLists);
+    new KeyphraseExtractor($pluginlist, $inputargs, $hashArgOptLists);
+    new EmailAddressExtractor($pluginlist, $inputargs, $hashArgOptLists);
+    new DateExtractor($pluginlist, $inputargs, $hashArgOptLists);
+    new GISExtractor($pluginlist, $inputargs, $hashArgOptLists);
+    my $self = new BasePlugin($pluginlist, $inputargs, $hashArgOptLists,$auxiliary);
+
+    return bless $self, $class;
+    
+}
+
+sub begin {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $processor, $maxdocs) = @_;
+
+    $self->SUPER::begin(@_);
+
+    #initialise those extractors that need initialisation
+    $self->initialise_acronym_extractor();
+    $self->initialise_gis_extractor();
+
+}
+
+sub end {
+    # potentially called at the end of each plugin pass 
+    # import.pl only has one plugin pass, but buildcol.pl has multiple ones
+
+    my ($self) = @_;
+    # finalise those extractors that need finalisation
+    $self->finalise_acronym_extractor();
+}
+
+# here is where we call methods from the supporting extractor plugins 
+sub auto_extract_metadata {
+    my $self = shift(@_);
+    my ($doc_obj) = @_;
+
+    if ($self->{'first'}) {
+	my $thissection = $doc_obj->get_top_section();
+	while (defined $thissection) {
+	    my $text = $doc_obj->get_text($thissection);
+	    $self->extract_first_NNNN_characters (\$text, $doc_obj, $thissection) if $text =~ /./;
+	    $thissection = $doc_obj->get_next_section ($thissection);
+	}
+    }
+    $self->extract_acronym_metadata($doc_obj);
+    $self->extract_keyphrase_metadata($doc_obj);
+    $self->extract_email_metadata($doc_obj);
+    $self->extract_date_metadata($doc_obj);
+    $self->extract_gis_metadata($doc_obj);
+
+}
+
+
+# FIRSTNNN: extract the first NNN characters as metadata
+sub extract_first_NNNN_characters {
+    my $self = shift (@_);
+    my ($textref, $doc_obj, $thissection) = @_;
+    
+    foreach my $size (split /,/, $self->{'first'}) {
+	my $tmptext =  $$textref;
+	$tmptext =~ s/^\s+//;
+	$tmptext =~ s/\s+$//;
+	$tmptext =~ s/\s+/ /gs;
+	$tmptext = substr ($tmptext, 0, $size);
+	$tmptext =~ s/\s\S*$/&#8230;/;
+	$doc_obj->add_utf8_metadata ($thissection, "First$size", $tmptext);
+    }
+}
+
+sub clean_up_after_doc_obj_processing {
+    my $self = shift(@_);
+
+    $self->SUPER::clean_up_after_doc_obj_processing();
+    $self->GISExtractor::clean_up_temp_files();
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/AutoLoadConverters.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/AutoLoadConverters.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/AutoLoadConverters.pm	(revision 24799)
@@ -0,0 +1,174 @@
+package AutoLoadConverters;
+
+use strict;
+no strict 'refs';
+no strict 'subs';
+
+use PrintInfo;
+
+use gsprintf 'gsprintf';
+
+sub BEGIN {
+    @AutoLoadConverters::ISA = ('PrintInfo');
+}
+
+# the dynamic conversion args will get added here
+my $arguments = [];
+
+my $options = { 'name'     => "AutoLoadConverters",
+		'desc'     => "{AutoLoadConverters.desc}",
+		'abstract' => "yes",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+sub dynamically_load_converter
+{
+    my ($autoPackage, $calling_class) = @_;
+
+    my $settings = {};
+    
+    my ($autoName)  = ($autoPackage =~ m/(^.*)Converter$/);
+    my $autoVar = lc($autoName);
+    $settings->{'converter_name'} = $autoName;
+    $settings->{'converter_var'} = $autoVar;
+    
+    eval("require $autoPackage");
+    if ($@) {
+	# Useful debugging statement if there is a syntax error in the plugin
+	#print STDERR "$@\n";
+	$settings->{'converter_installed'} = 0;
+	$settings->{'conversion_available'} = 0;
+    }
+    else {
+	# found the converter
+	$settings->{'conversion_installed'} = 1;
+	print STDERR "AutoLoadConverters: $autoName Extension to Greenstone detected for $calling_class\n";
+	# but can it run???
+	if (eval "\$${autoPackage}::${autoVar}_conversion_available") {
+	    $settings->{'conversion_available'} = 1;
+	    push(@AutoLoadConverters::ISA, $autoPackage);
+
+	} else {
+	    $settings->{'conversion_available'} = 0;
+	    print STDERR "... but it appears to be broken\n";
+	    &gsprintf(STDERR, "AutoLoadConverters: {AutoloadConverter.noconversionavailable}");
+	    my $dictentry_reason
+		= eval "$autoPackage\.\$${autoPackage}::no_${autoVar}_conversion_reason";
+
+	    &gsprintf(STDERR, " ({$dictentry_reason})\n");
+
+	}
+    }
+
+    if ($settings->{'conversion_available'}) {
+
+	my $opt_conversion_args = 
+	    [ { 'name' => "$autoVar\_conversion",
+		'desc' => "{$autoPackage.$autoVar\_conversion}",
+		'type' => "flag",
+		'reqd' => "no" } ];
+
+	$settings->{'converter_arguments'} = $opt_conversion_args;
+
+    }
+    return $settings;
+
+
+}
+
+####
+# This plugin takes an extra initial parameter in its constructor (compared 
+#   with the norm).  The extra parameter is an array of converters 
+# it should  try to dynamically load
+#####
+
+sub new {
+
+    # Start the AutoExtractMetadata Constructor
+    my $class = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists,$autoPackages, $auxiliary) = @_;
+    
+    push(@$pluginlist, $class);
+    my $classPluginName = $pluginlist->[0];
+
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    # this static list is just for pluginfo on AutoLoadConverters - we will try to explicitly load all packages 
+    $autoPackages = ["OpenOfficeConverter", "PDFBoxConverter"] unless defined $autoPackages;
+
+    my @self_array = ();
+    my $temporary_self = {};
+    $temporary_self->{'converter_list'} = [];
+    push (@self_array, $temporary_self);
+    foreach my $packageName (@$autoPackages) {
+	my $package_settings = &dynamically_load_converter($packageName, $classPluginName);
+	my $available_var = $package_settings->{'converter_var'}."_available";
+	if ($package_settings->{'conversion_available'}) {
+	    push(@$arguments, @{$package_settings->{'converter_arguments'}});
+	    my $package_self = eval "new $packageName(\$pluginlist, \$inputargs, \$hashArgOptLists,1);";
+	    push (@self_array, $package_self);
+	    $temporary_self->{$available_var} = 1;
+	    push(@{$temporary_self->{'converter_list'}}, $packageName);
+	} else {
+	    $temporary_self->{$available_var} = 0;
+	}
+    }
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    my $self;
+    my $pi_self = new PrintInfo($pluginlist, $inputargs, $hashArgOptLists, 1);
+    push (@self_array, $pi_self);
+    $self = BasePlugin::merge_inheritance(@self_array);
+
+    return bless $self, $class;
+}
+
+sub init {
+    my $self = shift (@_);
+
+    foreach my $converter (@{$self->{'converter_list'}}) {
+	eval "\$self->${converter}::init(\@_);";
+    }
+
+}
+
+sub begin {
+    my $self = shift (@_);
+
+    foreach my $converter(@{$self->{'converter_list'}}) {
+	eval "\$self->${converter}::begin(\@_);";
+    }
+}
+
+sub deinit {
+    my $self = shift (@_);
+
+    foreach my $converter (@{$self->{'converter_list'}}) {
+	eval "\$self->${converter}::deinit(\@_);";
+    }
+
+}
+
+sub tmp_area_convert_file {
+    my $self = shift (@_);
+    my ($output_ext, $input_filename, $textref) = @_;
+
+    foreach my $converter(@{$self->{'converter_list'}}) {
+	my ($var) = ($converter =~ m/(^.*)Converter$/);
+	$var = lc($var);
+	if ($self->{"${var}_conversion"}) {
+	    my ($result, $result_str, $new_filename) 
+		= eval "\$self->${converter}::convert(\$input_filename, \$output_ext);";
+	    if ($result != 0) {
+		return $new_filename;
+	    }
+	    my $outhandle=$self->{'outhandle'};
+	    print $outhandle "$converter Conversion error\n";
+	    print $outhandle $result_str;
+	    return "";
+	}
+    }
+    
+    # if got here, no converter was specified in plugin args
+    return $self->ConvertBinaryFile::tmp_area_convert_file(@_);
+    
+}
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/BaseMediaConverter.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/BaseMediaConverter.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/BaseMediaConverter.pm	(revision 24799)
@@ -0,0 +1,235 @@
+###########################################################################
+#
+# BaseMediaConverter - helper plugin that provide base functionality for 
+#                  image/video conversion using ImageMagick/ffmpeg
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2008 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+package BaseMediaConverter;
+
+use PrintInfo;
+
+use convertutil;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+use gsprintf 'gsprintf';
+
+BEGIN {
+    @BaseMediaConverter::ISA = ('PrintInfo');
+}
+
+my $arguments = [
+      { 'name' => "enable_cache",
+	'desc' => "{BaseMediaConverter.enable_cache}",
+	'type' => "flag",
+	'reqd' => "no",
+	}
+
+		 ];
+
+my $options = { 'name' => "BaseMediaConverter",
+		'desc' => "{BaseMediaConverter.desc}",
+		'abstract' => "yes",
+		'inherits' => "yes",
+		'args' => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists,$auxiliary) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new PrintInfo($pluginlist, $inputargs, $hashArgOptLists, $auxiliary);
+
+    return bless $self, $class;
+}
+
+sub begin {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $processor, $maxdocs) = @_;
+
+    # Save base_dir for use in file cache
+    $self->{'base_dir'} = $base_dir;
+}
+
+
+sub init_cache_for_file
+{
+    my $self = shift @_;
+    my ($filename) = @_;
+
+    my $verbosity = $self->{'verbosity'};
+    my $outhandle = $self->{'outhandle'};
+    my $base_dir = $self->{'base_dir'};
+
+    my $collect_dir = $ENV{'GSDLCOLLECTDIR'};
+    $collect_dir =~ s/\\/\//g; # Work in Unix style world
+    
+##    print STDERR "**** base_dir = ", $base_dir, "\n";
+ 
+    # Work out relative filename within 'base_dir'
+    $filename =~ s/\\/\//g;
+    my ($file) = ($filename =~ m/^$base_dir(.*?)$/);
+    
+    if (!defined $file) {
+	# Perhaps the filename is taken from within cache_dir area?
+	my $prev_cached_dir = $self->{'cached_dir'};
+	($file) = ($filename =~ m/^$prev_cached_dir(.*?)$/);
+    }
+
+    $file =~ s/^\/|\\//; # get rid of leading slash from relative filename
+
+
+    # Setup cached_dir and file_root
+
+    my ($file_root, $dirname, $suffix)
+	= &File::Basename::fileparse($file, "\\.[^\\.]+\$");
+
+
+    # if dirname is in collections tmp area, remove collect_dir prefix
+    $dirname =~ s/^$collect_dir//;
+
+    if ($ENV{'GSDLOS'} eq "windows") {
+	# if dirname starts with Windows drive letter, strip it off
+	$dirname =~ s/^[a-z]:\///i;
+    }
+
+    my $base_output_dir = &util::filename_cat($collect_dir,"cached",$dirname);
+
+    if (!-e $base_output_dir ) {
+	print $outhandle "Creating directory $base_output_dir\n"
+	    if ($verbosity>2);
+
+	&util::mk_all_dir($base_output_dir);
+    }
+
+    my $output_dir = &util::filename_cat($base_output_dir,$file_root);
+
+    if (!-e $output_dir) {
+	print $outhandle "Creating directory $output_dir\n"
+	    if ($verbosity>2);
+
+	&util::mk_dir($output_dir);
+    }
+
+    $self->{'cached_dir'} = $output_dir;
+    $self->{'cached_file_root'} = $file_root;    
+}
+
+
+
+sub run_general_cmd
+{
+    my $self = shift @_;
+    my ($command,$print_info) = @_;
+
+
+    if (!defined $print_info->{'verbosity'}) {
+	$print_info->{'verbosity'} = $self->{'verbosity'};
+    }
+
+    if (!defined $print_info->{'outhandle'}) {
+	$print_info->{'outhandle'} = $self->{'outhandle'};
+    }
+
+    
+    return &convertutil::run_general_cmd(@_);
+}
+
+
+sub regenerate_general_cmd
+{
+    my $self = shift @_;
+    my ($command,$ifilename,$ofilename,$print_info) = @_;
+
+    if (!defined $print_info->{'verbosity'}) {
+	$print_info->{'verbosity'} = $self->{'verbosity'};
+    }
+
+    if (!defined $print_info->{'outhandle'}) {
+	$print_info->{'outhandle'} = $self->{'outhandle'};
+    }
+
+    return &convertutil::regenerate_general_cmd(@_);
+}
+
+
+
+sub run_uncached_general_cmd
+{
+    my $self = shift @_;
+
+    my ($command,$ifilename,$ofilename,$print_info) = @_;
+
+    return $self->run_general_cmd($command,$print_info);
+}
+
+
+
+sub run_cached_general_cmd
+{
+    my $self = shift @_;
+
+    my ($command,$ifilename,$ofilename,$print_info) = @_;
+
+    if (!defined $print_info->{'verbosity'}) {
+	$print_info->{'verbosity'} = $self->{'verbosity'};
+    }
+
+    if (!defined $print_info->{'outhandle'}) {
+	$print_info->{'outhandle'} = $self->{'outhandle'};
+    }
+
+    return &convertutil::run_cached_general_cmd(@_);
+}
+
+
+
+sub autorun_general_cmd
+{
+    my $self = shift @_;
+
+    my ($command,$ifilename,$ofilename,$print_info) = @_;
+
+    my $result;
+    my $regenerated;
+    my $had_error;
+
+    if ($self->{'enable_cache'}) {
+	($regenerated,$result,$had_error)
+	    = $self->run_cached_general_cmd($command,$ifilename,$ofilename,$print_info);
+    }
+    else {
+	$regenerated = 1; # always true for a command that is always run
+	($result,$had_error)
+	    = $self->run_general_cmd($command,$print_info);
+    }
+
+    return ($regenerated,$result,$had_error);
+}
+
+
+#
+1;	
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/BasePlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/BasePlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/BasePlugin.pm	(revision 24799)
@@ -0,0 +1,1439 @@
+###########################################################################
+#
+# BasePlugin.pm -- base class for all the import plugins
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999-2005 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package BasePlugin;
+
+use strict; 
+no strict 'subs';
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+use File::Basename;
+use Encode;
+use Unicode::Normalize 'normalize';
+
+use encodings;
+use unicode;
+use doc;
+use ghtml;
+use gsprintf 'gsprintf';
+
+use PrintInfo;
+
+BEGIN {
+    @BasePlugin::ISA = ( 'PrintInfo' );
+}
+
+# the different methods that can be applied when renaming
+# imported documents and their associated files
+our $file_rename_method_list = 
+    [ { 'name' => "url",
+	'desc' => "{BasePlugin.rename_method.url}" },
+      { 'name' => "base64",
+	'desc' => "{BasePlugin.rename_method.base64}" }, 
+      { 'name' => "none",
+	'desc' => "{BasePlugin.rename_method.none}", 
+	'hiddengli' => "yes" } ];
+
+our $encoding_list =
+    [ { 'name' => "ascii",
+	'desc' => "{BasePlugin.encoding.ascii}" },
+      { 'name' => "utf8",
+	'desc' => "{BasePlugin.encoding.utf8}" },
+      { 'name' => "unicode",
+	'desc' => "{BasePlugin.encoding.unicode}" } ];
+
+
+my $e = $encodings::encodings;
+foreach my $enc (sort {$e->{$a}->{'name'} cmp $e->{$b}->{'name'}} keys (%$e)) 
+{
+    my $hashEncode =
+    {'name' => $enc,
+     'desc' => $e->{$enc}->{'name'}};
+    
+    push(@{$encoding_list},$hashEncode);
+}
+
+our $encoding_plus_auto_list = 
+    [ { 'name' => "auto",
+	'desc' => "{BasePlugin.filename_encoding.auto}" },
+      { 'name' => "auto-language-analysis",
+	'desc' => "{BasePlugin.filename_encoding.auto_language_analysis}" }, # textcat
+      { 'name' => "auto-filesystem-encoding",
+	'desc' => "{BasePlugin.filename_encoding.auto_filesystem_encoding}" }, # locale
+      { 'name' => "auto-fl",
+	'desc' => "{BasePlugin.filename_encoding.auto_fl}" }, # locale followed by textcat
+      { 'name' => "auto-lf",
+	'desc' => "{BasePlugin.filename_encoding.auto_lf}" } ]; # texcat followed by locale 
+
+push(@{$encoding_plus_auto_list},@{$encoding_list});
+
+our $oidtype_list = 
+    [ { 'name' => "auto",
+	'desc' => "{BasePlugin.OIDtype.auto}" },
+      { 'name' => "hash",
+        'desc' => "{import.OIDtype.hash}" },
+      { 'name' => "hash_on_ga_xml",
+        'desc' => "{import.OIDtype.hash_on_ga_xml}" },
+      { 'name' => "assigned",
+        'desc' => "{import.OIDtype.assigned}" },
+      { 'name' => "incremental",
+        'desc' => "{import.OIDtype.incremental}" },
+      { 'name' => "dirname",
+        'desc' => "{import.OIDtype.dirname}" } ];
+
+my $arguments =
+    [ { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'deft' => "",
+	'reqd' => "no" },
+      { 'name' => "no_blocking",
+	'desc' => "{BasePlugin.no_blocking}",
+	'type' => "flag",
+	'reqd' => "no"},
+      { 'name' => "block_exp",
+	'desc' => "{BasePlugin.block_exp}",
+	'type' => "regexp",
+	'deft' => "",
+	'reqd' => "no" },
+      { 'name' => "store_original_file",
+	'desc' => "{BasePlugin.store_original_file}",
+	'type' => "flag",
+	'reqd' => "no" },
+      { 'name' => "associate_ext",
+	'desc' => "{BasePlugin.associate_ext}",
+	'type' => "string",
+	'reqd' => "no" },
+      { 'name' => "associate_tail_re",
+	'desc' => "{BasePlugin.associate_tail_re}",
+	'type' => "string",
+	'reqd' => "no" },
+      { 'name' => "OIDtype",
+	'desc' => "{import.OIDtype}",
+	'type' => "enum",
+	'list' => $oidtype_list,
+	# leave default empty so we can tell if its been set or not - if not set will use option from import.pl
+	'deft' => "auto",
+	'reqd' => "no" },
+      { 'name' => "OIDmetadata",
+	'desc' => "{import.OIDmetadata}",
+	'type' => "metadata",
+	'deft' => "dc.Identifier",
+	'reqd' => "no" },      
+#      { 'name' => "use_as_doc_identifier",
+#	'desc' => "{BasePlugin.use_as_doc_identifier}",
+#	'type' => "string",
+#	'reqd' => "no" ,
+#	'deft' => "" } ,
+      { 'name' => "no_cover_image",
+	'desc' => "{BasePlugin.no_cover_image}",
+	'type' => "flag",
+	'reqd' => "no" },
+      { 'name' => "filename_encoding",
+	'desc' => "{BasePlugin.filename_encoding}",
+	'type' => "enum",
+	'deft' => "auto",
+	'list' => $encoding_plus_auto_list,
+	'reqd' => "no" },
+      { 'name' => "smart_block",
+        'desc' => "{common.deprecated}. {BasePlugin.smart_block}",
+        'type' => "flag",
+        'reqd' => "no",
+	'hiddengli' => "yes" }, # deprecated, but leave in for old collections
+      { 'name' => "file_rename_method",
+	'desc' => "{BasePlugin.file_rename_method}",
+	'type' => "enum",
+	'deft' => &get_default_file_rename_method(), # by default rename imported files and assoc files using this encoding
+	'list' => $file_rename_method_list,
+	'reqd' => "no"
+	}
+      
+      ];
+
+
+my $options = { 'name'     => "BasePlugin",
+		'desc'     => "{BasePlugin.desc}",
+		'abstract' => "yes",
+		'inherits' => "no",
+		'args'     => $arguments };
+
+sub new {
+
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists,$auxiliary) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new PrintInfo($pluginlist, $inputargs, $hashArgOptLists,$auxiliary);
+    
+    if ($self->{'info_only'}) {
+        # don't worry about any options etc
+        return bless $self, $class;
+    }
+
+    if ($self->{'smart_block'}) {
+	print STDERR "WARNING: -smart_block option has been deprecated and is no longer useful\n";
+    }
+    $self->{'smart_block'} = undef;
+
+    my $plugin_name = (defined $pluginlist->[0]) ? $pluginlist->[0] : $class;
+    $self->{'plugin_type'} = $plugin_name;
+
+    # remove ex. from OIDmetadata iff it's the only namespace prefix
+    $self->{'OIDmetadata'} =~ s/^ex\.([^.]+)$/$1/ if defined $self->{'OIDmetadata'};
+    $self->{'num_processed'} = 0;
+    $self->{'num_not_processed'} = 0;
+    $self->{'num_blocked'} = 0;
+    $self->{'num_archives'} = 0;
+    $self->{'cover_image'} = 1; # cover image is on by default
+    $self->{'cover_image'} = 0 if ($self->{'no_cover_image'});
+    $self->{'can_process_directories'} = 0;
+    #$self->{'option_list'} = $hashArgOptLists->{"OptList"};
+    
+    my $associate_ext = $self->{'associate_ext'};
+    if ((defined $associate_ext) && ($associate_ext ne "")) {
+
+	my $associate_tail_re = $self->{'associate_tail_re'};
+	if ((defined $associate_tail_re) && ($associate_tail_re ne "")) {
+	    my $outhandle = $self->{'outhandle'};
+	    print $outhandle "Warning: can only specify 'associate_ext' or 'associate_tail_re'\n";
+	    print $outhandle "         defaulting to 'associate_tail_re'\n";
+	}
+	else {
+	    my @exts = split(/,/,$associate_ext);
+
+	    my @exts_bracketed = map { $_ = "(?:\\.$_)" } @exts;
+	    my $associate_tail_re = join("|",@exts_bracketed);
+	    $self->{'associate_tail_re'} = $associate_tail_re;
+	}
+
+	delete $self->{'associate_ext'};
+    }
+
+    return bless $self, $class;
+
+}
+
+sub merge_inheritance
+{
+    my $self = {};
+    my @child_selfs = @_;
+
+    foreach my $child_self (@child_selfs) {	
+	foreach my $key (keys %$child_self) {
+	    if (defined $self->{$key}) {
+		if ($self->{$key} ne $child_self->{$key}) {
+#		    print STDERR "Warning: Conflicting value in multiple inheritance for '$key'\n";
+#		    print STDERR "Existing stored value = $self->{$key}\n";
+#		    print STDERR "New (child) value     = $child_self->{$key}\n";
+#		    print STDERR "Keeping existing value\n";
+		    # Existing value seems to be option specified in collect.cfg
+
+		    ### $self->{$key} = $child_self->{$key};
+		    
+		}
+		else {
+##		    print STDERR "****Info: Value $self->{$key} for $key already defined through multiple inheritance as the same value\n";
+		}
+
+	    }
+	    else {
+		$self->{$key} = $child_self->{$key};
+	    }
+	}
+    }
+
+    return $self;	
+}
+
+# initialize BasePlugin options
+# if init() is overridden in a sub-class, remember to call BasePlugin::init()
+sub init {
+    my $self = shift (@_);
+    my ($verbosity, $outhandle, $failhandle) = @_;
+
+    # verbosity is passed through from the processor
+    $self->{'verbosity'} = $verbosity;
+
+    # as are the outhandle and failhandle
+    $self->{'outhandle'} = $outhandle if defined $outhandle;
+    $self->{'failhandle'} = $failhandle;
+#    $self->SUPER::init(@_);
+    
+    # set process_exp and block_exp to defaults unless they were
+    # explicitly set
+
+    if ((!$self->is_recursive()) and 
+	(!defined $self->{'process_exp'}) || ($self->{'process_exp'} eq "")) {
+
+	$self->{'process_exp'} = $self->get_default_process_exp ();
+	if ($self->{'process_exp'} eq "") {
+	    warn ref($self) . " Warning: Non-recursive plugin has no process_exp\n";
+	}
+    }
+
+    if ((!defined $self->{'block_exp'}) || ($self->{'block_exp'} eq "")) {
+	$self->{'block_exp'} = $self->get_default_block_exp ();
+    }
+
+}
+
+sub begin {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $processor, $maxdocs) = @_;
+
+    if ($self->{'OIDtype'} eq "auto") {
+	# hasn't been set in the plugin, use the processor values
+	$self->{'OIDtype'} = $processor->{'OIDtype'};
+	$self->{'OIDmetadata'} = $processor->{'OIDmetadata'};
+    }
+    if ($self->{'OIDtype'} eq "hash") {
+	# should we hash on the file or on the doc xml??
+	$self->{'OIDtype'} = $self->get_oid_hash_type();
+	if ($self->{'OIDtype'} !~ /^(hash_on_file|hash_on_ga_xml)$/) {
+	    $self->{'OIDtype'} = "hash_on_file";
+	}
+    }
+}
+
+# This is called once if removeold is set with import.pl. Most plugins will do
+# nothing but if a plugin does any stuff outside of creating doc obj, then 
+# it may need to clear something.
+sub remove_all {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $processor, $maxdocs) = @_;
+}
+
+# This is called per document for docs that have been deleted from the 
+# collection. Most plugins will do nothing
+# but if a plugin does any stuff outside of creating doc obj, then it may need
+# to clear something.
+sub remove_one {
+    my $self = shift (@_);
+    
+    my ($file, $oids, $archivedir) = @_;
+    return 0 if $self->can_process_this_file($file);
+    return undef;
+}
+
+sub end {
+    # potentially called at the end of each plugin pass 
+    # import.pl only has one plugin pass, but buildcol.pl has multiple ones
+
+    my ($self) = shift (@_);
+}
+
+sub deinit {
+    # called only once, after all plugin passes have been done
+
+    my ($self) = @_;
+}
+
+# default hashing type is to hash on the original file (or converted file)
+# override this to return hash_on_ga_xml for filetypes where hashing on the 
+# file is no good eg video
+sub get_oid_hash_type {
+
+    my $self = shift (@_);
+
+    return "hash_on_file";
+}
+
+
+# this function should be overridden to return 1
+# in recursive plugins
+sub is_recursive {
+    my $self = shift (@_);
+
+    return 0; 
+}
+
+sub get_default_block_exp {
+    my $self = shift (@_);
+
+    return "";
+}
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+    return "";
+}
+
+
+# rename imported files and assoc files using URL encoding by default
+# as this will work for most plugins and give more legible filenames
+sub get_default_file_rename_method() {
+    my $self = shift (@_);
+    return "url";
+}
+
+# returns this plugin's active (possibly user-selected) file_rename_method
+sub get_file_rename_method() {
+    my $self = shift (@_);
+    my $rename_method = $self->{'file_rename_method'};
+    if($rename_method) {
+	return $rename_method;
+    } else {	
+	return $self->get_default_file_rename_method();
+    }
+}
+
+# default implementation is to do nothing
+sub store_block_files {
+    
+    my $self =shift (@_);
+    my ($filename_full_path, $block_hash) = @_;
+
+}
+
+# put files to block into hash 
+sub use_block_expressions {
+
+    my $self =shift (@_);
+    my ($filename_full_path, $block_hash) = @_;
+
+    $filename_full_path = &util::upgrade_if_dos_filename($filename_full_path);
+
+    if ($self->{'block_exp'} ne "" && $filename_full_path =~ /$self->{'block_exp'}/) {
+	&util::block_filename($block_hash,$filename_full_path);
+    }
+
+}
+
+#default implementation is to block a file with same name as this, but extension jpg or JPG, if cover_images is on.
+sub block_cover_image
+{
+    my $self =shift;
+    my ($filename, $block_hash) = @_;
+
+    $filename = &util::upgrade_if_dos_filename($filename);
+
+    if ($self->{'cover_image'}) {
+	my $coverfile = $filename;
+	$coverfile =~ s/\.[^\\\/\.]+$/\.jpg/;
+
+	if (!&util::fd_exists($coverfile)) {
+	    $coverfile =~ s/jpg$/JPG/;
+	} 	
+	if (&util::fd_exists($coverfile)) {
+	    &util::block_filename($block_hash,$coverfile);
+	} 
+    }
+
+    return;
+}
+
+
+# discover all the files that should be blocked by this plugin
+# check the args ...
+sub file_block_read {
+
+    my $self = shift (@_);  
+    my ($pluginfo, $base_dir, $file, $block_hash, $metadata, $gli) = @_;
+    # Keep track of filenames with same root but different extensions
+    # Used to support -associate_ext and the more generalised
+    # -associate_tail_re
+    my ($filename_full_path, $filename_no_path) = &util::get_full_filenames($base_dir, $file);
+
+    if (!-d $filename_full_path) {
+	$block_hash->{'all_files'}->{$file} = 1;
+    }
+
+    my $associate_tail_re = $self->{'associate_tail_re'};
+    if ((defined $associate_tail_re) && ($associate_tail_re ne "")) {
+	my ($file_prefix,$file_ext) 
+	    = &util::get_prefix_and_tail_by_regex($filename_full_path,$associate_tail_re);
+	if ((defined $file_prefix) && (defined $file_ext)) {
+	    my $shared_fileroot = $block_hash->{'shared_fileroot'};
+	    if (!defined $shared_fileroot->{$file_prefix}) {
+		my $file_prefix_rec = { 'tie_to'  => undef, 
+				        'exts'    => {} };
+		$shared_fileroot->{$file_prefix} = $file_prefix_rec;
+	    }
+	    
+	    my $file_prefix_rec = $shared_fileroot->{$file_prefix};
+
+	    if ($self->can_process_this_file($filename_full_path)) {
+		# This is the document the others should be tied to
+		$file_prefix_rec->{'tie_to'} = $file_ext;
+	    }
+	    else {
+		if ($file_ext =~ m/$associate_tail_re$/) {
+		    # this file should be associated to the main one
+		    $file_prefix_rec->{'exts'}->{$file_ext} = 1;
+		}
+	    }
+
+	}
+    }
+
+    # check block expressions
+    $self->use_block_expressions($filename_full_path, $block_hash) unless $self->{'no_blocking'};
+
+    # now check whether we are actually processing this
+    if (!-f $filename_full_path || !$self->can_process_this_file($filename_full_path)) {
+	return undef; # can't recognise
+    }
+    
+    # if we have a block_exp, then this overrides the normal 'smart' blocking
+    $self->store_block_files($filename_full_path, $block_hash) unless ($self->{'no_blocking'} || $self->{'block_exp'} ne "");
+
+    # block the cover image if there is one
+    if ($self->{'cover_image'}) {
+	$self->block_cover_image($filename_full_path, $block_hash); 
+    }
+    
+    return 1;
+}
+
+# plugins that rely on more than process_exp (eg XML plugins) can override this method
+sub can_process_this_file {
+    my $self = shift(@_);
+    my ($filename) = @_;
+
+    if (-d $filename && !$self->{'can_process_directories'}) {
+	return 0;
+    }
+
+    if ($self->{'process_exp'} ne "" && $filename =~ /$self->{'process_exp'}/) {
+	return 1;
+    }
+    return 0;
+    
+}
+
+# Even if a plugin can extract metadata in its metadata_read pass,
+# make the default return 'undef' so processing of the file continues
+# down the pipeline, so other plugins can also have the opportunity to
+# locate metadata and set it up in the extrametakeys variables that
+# are passed around.
+
+sub can_process_this_file_for_metadata {
+    my $self = shift(@_);
+
+    return undef;
+}
+
+
+# just converts path as is to utf8.
+sub filepath_to_utf8 {
+    my $self = shift (@_);  
+    my ($file, $file_encoding) = @_;
+    my $filemeta = $file;
+
+    my $filename_encoding = $self->{'filename_encoding'}; # filename encoding setting
+
+    # Whenever filename-encoding is set to any of the auto settings, we
+    # check if the filename is already in UTF8. If it is, then we're done.
+    if($filename_encoding =~ m/auto/) {
+	if(&unicode::check_is_utf8($filemeta)) 
+	{
+	    $filename_encoding = "utf8";
+	    return $filemeta;
+	} 
+    }
+    
+    # Auto setting, but filename is not utf8
+    if ($filename_encoding eq "auto") 
+    {
+	# try textcat
+	$filename_encoding = $self->textcat_encoding($filemeta);
+	
+	# check the locale next
+	$filename_encoding = $self->locale_encoding() if $filename_encoding eq "undefined";
+	
+	
+	# now try the encoding of the document, if available
+	if ($filename_encoding eq "undefined" && defined $file_encoding) {
+	    $filename_encoding = $file_encoding;
+	}
+
+    }
+
+    elsif ($filename_encoding eq "auto-language-analysis") 
+    {	
+	$filename_encoding = $self->textcat_encoding($filemeta);
+
+	# now try the encoding of the document, if available
+	if ($filename_encoding eq "undefined" && defined $file_encoding) {
+	    $filename_encoding = $file_encoding;
+	} 
+    }
+
+    elsif ($filename_encoding eq "auto-filesystem-encoding") 
+    {	
+	# try locale
+	$filename_encoding = $self->locale_encoding();
+    }
+
+    elsif ($filename_encoding eq "auto-fl") 
+    {
+	# filesystem-encoding (locale) then language-analysis (textcat)
+	$filename_encoding = $self->locale_encoding();
+	
+	# try textcat
+	$filename_encoding = $self->textcat_encoding($filemeta) if $filename_encoding eq "undefined";
+	
+	# else assume filename encoding is encoding of file content, if that's available
+	if ($filename_encoding eq "undefined" && defined $file_encoding) {
+	    $filename_encoding = $file_encoding;
+	}
+    }
+    
+    elsif ($filename_encoding eq "auto-lf") 
+    {
+	# language-analysis (textcat) then filesystem-encoding (locale)
+	$filename_encoding = $self->textcat_encoding($filemeta);
+	
+	# guess filename encoding from encoding of file content, if available
+	if ($filename_encoding eq "undefined" && defined $file_encoding) {
+	    $filename_encoding = $file_encoding;
+	}
+
+	# try locale
+	$filename_encoding = $self->locale_encoding() if $filename_encoding eq "undefined";
+    }
+    
+    # if still undefined, use utf8 as fallback
+    if ($filename_encoding eq "undefined") {
+	$filename_encoding = "utf8";
+    }
+
+    #print STDERR "**** UTF8 encoding the filename $filemeta ";
+    
+    # if the filename encoding is set to utf8 but it isn't utf8 already--such as when
+    # 1. the utf8 fallback is used, or 2. if the system locale is used and happens to
+    # be always utf8 (in which case the filename's encoding is also set as utf8 even 
+    # though the filename need not be if it originates from another system)--in such
+    # cases attempt to make the filename utf8 to match.
+    if($filename_encoding eq "utf8" && !&unicode::check_is_utf8($filemeta)) {
+	&unicode::ensure_utf8(\$filemeta);
+    }
+
+    # convert non-unicode encodings to utf8
+    if ($filename_encoding !~ m/(?:ascii|utf8|unicode)/) {
+	$filemeta = &unicode::unicode2utf8(
+					   &unicode::convert2unicode($filename_encoding, \$filemeta)
+					   );
+    }
+
+    #print STDERR " from encoding $filename_encoding -> $filemeta\n";
+    return $filemeta;
+}
+
+# gets the filename with no path, converts to utf8, and then dm safes it.
+# filename_encoding set by user
+sub filename_to_utf8_metadata
+{
+    my $self = shift (@_);  
+    my ($file, $file_encoding) = @_;
+
+    my $outhandle = $self->{'outhandle'};
+
+    print $outhandle "****!!!!**** BasePlugin::filename_to_utf8_metadata now deprecated\n";
+    my ($cpackage,$cfilename,$cline,$csubr,$chas_args,$cwantarray) = caller(0);
+    print $outhandle "Calling method: $cfilename:$cline $cpackage->$csubr\n";
+
+
+    my ($filemeta) = $file =~ /([^\\\/]+)$/; # getting the tail of the filepath (skips all string parts containing slashes upto the end)
+    $filemeta = $self->filepath_to_utf8($filemeta, $file_encoding);
+
+    return $filemeta;
+}
+
+sub locale_encoding {
+    my $self = shift(@_);
+    
+    if (!defined $self->{'filesystem_encoding'}) {
+	$self->{'filesystem_encoding'} = $self->get_filesystem_encoding();
+    }
+
+    #print STDERR "*** filename encoding determined based on locale: " . $self->{'filesystem_encoding'} . "\n";
+    return $self->{'filesystem_encoding'}; # can be the string "undefined"
+}
+
+sub textcat_encoding {
+    my $self = shift(@_);
+    my ($filemeta) = @_;
+
+    # analyse filenames without extensions and digits (and trimmed of
+    # surrounding whitespace), so that irrelevant chars don't confuse
+    # textcat
+    my $strictfilemeta = $filemeta;
+    $strictfilemeta =~ s/\.[^\.]+$//g;
+    $strictfilemeta =~ s/\d//g;
+    $strictfilemeta =~ s/^\s*//g;
+    $strictfilemeta =~ s/\s*$//g;
+    
+    my $filename_encoding = $self->encoding_from_language_analysis($strictfilemeta);
+    if(!defined $filename_encoding) {
+	$filename_encoding = "undefined";
+    }
+
+    return $filename_encoding; # can be the string "undefined"
+}
+
+# performs textcat
+sub encoding_from_language_analysis {
+    my $self = shift(@_);
+    my ($text) = @_;
+
+    my $outhandle = $self->{'outhandle'};
+    my $best_encoding = undef;
+    
+    # get the language/encoding of the textstring using textcat
+    require textcat;  # Only load the textcat module if it is required
+    $self->{'textcat'} = new textcat() unless defined($self->{'textcat'});
+    my $results = $self->{'textcat'}->classify_cached_filename(\$text);
+
+
+    if (scalar @$results < 0) { 
+	return undef;
+    }
+    
+    # We have some results, we choose the first
+    my ($language, $encoding) = $results->[0] =~ /^([^-]*)(?:-(.*))?$/;
+    
+    $best_encoding = $encoding;
+    if (!defined $best_encoding) {
+	return undef;
+    } 
+    
+    if (defined $best_encoding && $best_encoding =~ m/^iso_8859/ && &unicode::check_is_utf8($text)) {
+	# the text is valid utf8, so assume that's the real encoding (since textcat is based on probabilities)
+	$best_encoding = 'utf8';
+    }
+    
+    
+    # check for equivalents where textcat doesn't have some encodings...
+    # eg MS versions of standard encodings
+    if (defined $best_encoding && $best_encoding =~ /^iso_8859_(\d+)/) {
+	my $iso = $1; # which variant of the iso standard?
+	# iso-8859 sets don't use chars 0x80-0x9f, windows codepages do
+	if ($text =~ /[\x80-\x9f]/) {
+	    # Western Europe
+	    if ($iso == 1 or $iso == 15) { $best_encoding = 'windows_1252' }
+	    elsif ($iso == 2) {$best_encoding = 'windows_1250'} # Central Europe
+	    elsif ($iso == 5) {$best_encoding = 'windows_1251'} # Cyrillic
+	    elsif ($iso == 6) {$best_encoding = 'windows_1256'} # Arabic
+	    elsif ($iso == 7) {$best_encoding = 'windows_1253'} # Greek
+	    elsif ($iso == 8) {$best_encoding = 'windows_1255'} # Hebrew
+	    elsif ($iso == 9) {$best_encoding = 'windows_1254'} # Turkish
+	}
+    }
+    
+    if (defined $best_encoding && $best_encoding !~ /^(ascii|utf8|unicode)$/ &&
+	!defined $encodings::encodings->{$best_encoding}) 
+    {
+	if ($self->{'verbosity'}) { 
+	    gsprintf($outhandle, "BasePlugin: {ReadTextFile.unsupported_encoding}\n", $text, $best_encoding, "undef");
+	}
+	$best_encoding = undef;
+    }
+    
+    return $best_encoding;
+}
+
+# uses locale
+sub get_filesystem_encoding 
+{
+
+    my $self = shift(@_);
+
+    my $outhandle = $self->{'outhandle'};
+    my $filesystem_encoding = undef;
+
+    eval {
+	# Works for Windows as well, returning the DOS code page in use	
+	use POSIX qw(locale_h);
+	
+	# With only one parameter, setlocale retrieves the 
+	# current value
+	my $current_locale = setlocale(LC_CTYPE);
+	
+	my $char_encoding = undef;
+	if ($current_locale =~ m/\./) {
+	    ($char_encoding) = ($current_locale =~ m/^.*\.(.*?)$/);
+	    $char_encoding = lc($char_encoding);
+	}
+	else {
+	    if ($current_locale =~ m/^(posix|c)$/i) {
+		$char_encoding = "ascii";
+	    }
+	}
+
+	if (defined $char_encoding) {
+	    if ($char_encoding =~ m/^(iso)(8859)-?(\d{1,2})$/) {
+		$char_encoding = "$1\_$2\_$3";
+	    }
+
+	    $char_encoding =~ s/-/_/g;
+	    $char_encoding =~ s/^utf_8$/utf8/;
+	    
+	    if ($char_encoding =~ m/^\d+$/) {
+		if (defined $encodings::encodings->{"windows_$char_encoding"}) {
+		    $char_encoding = "windows_$char_encoding";
+		}
+		elsif (defined $encodings::encodings->{"dos_$char_encoding"}) {
+		    $char_encoding = "dos_$char_encoding";
+		}
+	    }
+	    
+	    if (($char_encoding =~ m/(?:ascii|utf8|unicode)/) 
+		|| (defined $encodings::encodings->{$char_encoding})) {
+		$filesystem_encoding = $char_encoding;
+	    }
+	    else {
+		print $outhandle "Warning: Unsupported character encoding '$char_encoding' from locale '$current_locale'\n";
+	    }
+	}
+	
+
+    };
+    if ($@) {
+	print $outhandle "$@\n";
+	print $outhandle "Warning: Unable to establish locale.  Will assume filesystem is UTF-8\n";
+	
+    }
+
+    return $filesystem_encoding;
+}
+
+
+
+sub deduce_filename_encoding
+{
+    my $self = shift (@_);  
+    my ($file,$metadata,$plugin_filename_encoding) = @_;
+
+    my $gs_filename_encoding = $metadata->{"gs.filenameEncoding"};
+    my $deduced_filename_encoding = undef;
+    
+    # Start by looking for manually assigned metadata
+    if (defined $gs_filename_encoding) {
+	if (ref ($gs_filename_encoding) eq "ARRAY") {
+	    my $outhandle = $self->{'outhandle'};
+	    
+	    $deduced_filename_encoding = $gs_filename_encoding->[0];
+	    
+	    my $num_vals = scalar(@$gs_filename_encoding);
+	    if ($num_vals>1) {
+		print $outhandle "Warning: gs.filenameEncoding multiply defined for $file\n";
+		print $outhandle "         Selecting first value: $deduced_filename_encoding\n";
+	    }
+	} 
+	else {
+	    $deduced_filename_encoding = $gs_filename_encoding;
+	}
+    }
+    
+    if (!defined $deduced_filename_encoding || ($deduced_filename_encoding =~ m/^\s*$/)) {
+	# Look to see if plugin specifies this value
+
+	if (defined $plugin_filename_encoding) {
+	    # First look to see if we're using any of the "older" (i.e. deprecated auto-... plugin options)
+	    if ($plugin_filename_encoding =~ m/^auto-.*$/) {
+		my $outhandle = $self->{'outhandle'};
+		print $outhandle "Warning: $plugin_filename_encoding is no longer supported\n";
+		print $outhandle "         default to 'auto'\n";
+		$self->{'filename_encoding'} = $plugin_filename_encoding = "auto";
+	    }
+	    
+	    if ($plugin_filename_encoding ne "auto") {
+		# We've been given a specific filenamne encoding
+		# => so use it!
+		$deduced_filename_encoding = $plugin_filename_encoding;
+	    }
+	}
+    }
+    
+    if (!defined $deduced_filename_encoding || ($deduced_filename_encoding =~ m/^\s*$/)) {
+
+	# Look to file system to provide a character encoding
+
+	# If Windows NTFS, then -- assuming we work with long file names got through
+	# Win32::GetLongFilePath() -- then the underlying file system is UTF16
+
+	if ($ENV{'GSDLOS'} =~ m/^windows$/i) {
+	    # Can do better than working with the DOS character encoding returned by locale	    
+	    $deduced_filename_encoding = "unicode";
+	}
+	else {
+	    # Unix of some form or other
+
+	    # See if we can determine the file system encoding through locale
+	    $deduced_filename_encoding = $self->locale_encoding();
+	    
+	    # if locale shows us filesystem is utf8, check to see filename is consistent
+	    # => if not, then we have an "alien" filename on our hands
+
+	    if (defined $deduced_filename_encoding && $deduced_filename_encoding =~ m/^utf-?8$/i) {
+		if (!&unicode::check_is_utf8($file)) {
+		    # "alien" filename, so revert
+		    $deduced_filename_encoding = undef;
+		}
+	    }
+	}
+    }
+    
+#    if (!defined $deduced_filename_encoding || ($deduced_filename_encoding =~ m/^\s*$/)) {
+#		# Last chance, apply textcat to deduce filename encoding
+#		$deduced_filename_encoding = $self->textcat_encoding($file);
+#    }
+
+    if ($self->{'verbosity'}>3) {
+	my $outhandle = $self->{'outhandle'};
+
+	if (defined $deduced_filename_encoding) {
+	    print $outhandle "  Deduced filename encoding as: $deduced_filename_encoding\n";
+	}
+	else {
+	    print $outhandle "  No filename encoding deduced\n";
+	}
+    }
+    
+    return $deduced_filename_encoding;
+}
+
+
+
+
+# Notionally written to be called once for each document, it is however safe to
+# call multiple times (as in the case of ImagePlugin) which calls this later on
+# after the original image has potentially been converted to a *new* source image
+# format (e.g. TIFF to PNG)
+
+sub set_Source_metadata {
+    my $self = shift (@_);  
+    my ($doc_obj, $raw_filename, $filename_encoding, $section) = @_;
+    
+    # 1. Sets the filename (Source) for display encoded as Unicode if possible,
+    #    and (as a fallback) using %xx if not for non-ascii chars
+    # 2. Sets the url ref (SourceFile) to the URL encoded version
+    #    of filename for generated files
+    
+    my ($unused_full_rf, $raw_file) = &util::get_full_filenames("", $raw_filename);
+
+    my $this_section = (defined $section)? $section : $doc_obj->get_top_section();
+
+    my $octet_file = $raw_file;
+
+    # UTF-8 version of filename
+#    if ((defined $ENV{"DEBUG_UNICODE"}) && ($ENV{"DEBUG_UNICODE"})) {
+#	print STDERR "**** Setting Source Metadata given: $octet_file\n";
+#    }
+    
+    # Deal with (on Windows) raw filenames that are in their
+    # abbreviated DOS form
+
+    if ($ENV{'GSDLOS'} =~ m/^windows$/i) {
+	if ((defined $filename_encoding) && ($filename_encoding eq "unicode")) {
+	    if (-e $raw_filename) {
+		my $unicode_filename = Win32::GetLongPathName($raw_filename);
+		
+		my $unused_full_uf;
+		($unused_full_uf, $octet_file) = &util::get_full_filenames("", $unicode_filename);
+	    }
+	}
+    }
+
+    my $url_encoded_filename;
+    if ((defined $filename_encoding) && ($filename_encoding ne "ascii")) {
+	# => Generate a pretty print version of filename that is mapped to Unicode
+	
+	# Use filename_encoding to map raw filename to a Perl unicode-aware string 
+	$url_encoded_filename = decode($filename_encoding,$octet_file);		
+    }
+    else {
+	# otherwise generate %xx encoded version of filename for char > 127
+	$url_encoded_filename = &unicode::raw_filename_to_url_encoded($octet_file);
+    }
+    
+#    if ((defined $ENV{"DEBUG_UNICODE"}) && ($ENV{"DEBUG_UNICODE"})) {
+#	print STDERR "****** saving Source as:             $url_encoded_filename\n";
+#    }
+
+    # In the case of converted files and (generalized) exploded documents, there
+    # will already be a source filename => store as OrigSource before overriding
+    my $orig_source = $doc_obj->get_metadata_element ($this_section, "Source");
+    if ((defined $orig_source) && ($orig_source !~ m/^\s*$/)) {
+	$doc_obj->set_utf8_metadata_element($this_section, "OrigSource", $orig_source); 
+    }
+        
+    # Source is the UTF8 display name - not necessarily the name of the file on the system
+    if ($ENV{'GSDLOS'} =~ m/^darwin$/i) {
+	# on Darwin want all display strings to be in composed form, then can search on that
+	$url_encoded_filename = normalize('C', $url_encoded_filename); # Normalisation Form 'C' (composition)
+    }
+    $doc_obj->set_utf8_metadata_element($this_section, "Source", $url_encoded_filename); 
+
+    
+    my $renamed_raw_file = &util::rename_file($raw_file, $self->{'file_rename_method'});
+    # If using URL encoding, then SourceFile is the url-reference to url-encoded
+    # renamed_raw_url: it's a url that refers to the actual file on the system
+    my $renamed_raw_url = &unicode::filename_to_url($renamed_raw_file);
+
+    $doc_obj->set_utf8_metadata_element($this_section, "SourceFile",
+					$renamed_raw_url);
+
+#    if ((defined $ENV{"DEBUG_UNICODE"}) && ($ENV{"DEBUG_UNICODE"})) {
+#	print STDERR "****** saving SourceFile as:         $renamed_raw_url\n";
+#    }
+}
+
+# this should be called by all plugins to set the oid of the doc obj, rather
+# than calling doc_obj->set_OID directly
+sub add_OID {
+    my $self = shift (@_);  
+    my ($doc_obj) = @_;
+
+    $doc_obj->set_OIDtype($self->{'OIDtype'}, $self->{'OIDmetadata'});
+
+    # see if there is a plugin specific set_OID function
+    if (defined ($self->can('set_OID'))) {
+	$self->set_OID(@_); # pass through doc_obj and any extra arguments
+    }
+    else {
+	# use the default set_OID() in doc.pm
+	$doc_obj->set_OID();
+    }
+
+}
+
+# The BasePlugin read_into_doc_obj() function. This function does all the
+# right things to make general options work for a given plugin.  It doesn't do anything with the file other than setting reads in
+# a file and sets up a slew of metadata all saved in doc_obj, which
+# it then returns as part of a tuple (process_status,doc_obj)
+#
+# Much of this functionality used to reside in read, but it was broken
+# down into a supporting routine to make the code more flexible.  
+#
+# recursive plugins (e.g. RecPlug) and specialized plugins like those
+# capable of processing many documents within a single file (e.g.
+# GMLPlug) will normally want to implement their own version of
+# read_into_doc_obj()
+#
+# Note that $base_dir might be "" and that $file might 
+# include directories
+
+# currently blocking has been done before it gets here - does this affect secondary plugin stuff??
+sub read_into_doc_obj {
+    my $self = shift (@_);  
+    my ($pluginfo, $base_dir, $file, $block_hash, $metadata, $processor, $maxdocs, $total_count, $gli) = @_;
+
+    my $outhandle = $self->{'outhandle'};
+
+    # should we move this to read? What about secondary plugins?
+    my $pp_file = &util::prettyprint_file($base_dir,$file,$gli);
+    print STDERR "<Processing n='$file' p='$self->{'plugin_type'}'>\n" if ($gli);
+    print $outhandle "$self->{'plugin_type'} processing $pp_file\n"
+	if $self->{'verbosity'} > 1;
+
+    my ($filename_full_path, $filename_no_path) = &util::get_full_filenames($base_dir, $file);
+    
+    # create a new document
+    my $doc_obj = new doc ($filename_full_path, "indexed_doc", $self->{'file_rename_method'});
+    my $top_section = $doc_obj->get_top_section();
+
+    $doc_obj->add_utf8_metadata($top_section, "Plugin", "$self->{'plugin_type'}");
+    $doc_obj->add_utf8_metadata($top_section, "FileSize", (-s $filename_full_path));
+    
+
+    my $plugin_filename_encoding = $self->{'filename_encoding'};
+    my $filename_encoding = $self->deduce_filename_encoding($file,$metadata,$plugin_filename_encoding);
+    $self->set_Source_metadata($doc_obj,$filename_full_path,$filename_encoding,$top_section);
+
+    # plugin specific stuff - what args do we need here??
+    unless (defined ($self->process($pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli))) {
+	print STDERR "<ProcessingError n='$file'>\n" if ($gli);
+	return -1;
+    }
+    
+    # include any metadata passed in from previous plugins 
+    # note that this metadata is associated with the top level section
+    my $section = $doc_obj->get_top_section();
+    # can we merge these two methods??
+    $self->add_associated_files($doc_obj, $filename_full_path);
+    $self->extra_metadata ($doc_obj, $section, $metadata);
+    $self->auto_extract_metadata($doc_obj);
+
+    # if we haven't found any Title so far, assign one
+    # this was shifted to here from inside read()
+    $self->title_fallback($doc_obj,$section,$filename_no_path);
+    
+    $self->add_OID($doc_obj);
+    
+    $self->post_process_doc_obj($pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli);
+    return (1,$doc_obj);
+}
+
+sub post_process_doc_obj {
+    my $self = shift (@_);  
+    my ($pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+
+    return 1;
+}
+
+sub add_dummy_text {
+    my $self = shift(@_);
+    my ($doc_obj, $section) = @_;
+
+    # add NoText metadata so we can hide this dummy text in format statements
+    $doc_obj->add_metadata($section, "NoText", "1");
+    $doc_obj->add_text($section, &gsprintf::lookup_string("{BasePlugin.dummy_text}",1));
+    
+}
+
+# does nothing. Can be overridden by subclass
+sub auto_extract_metadata {
+    my $self = shift(@_);
+    my ($doc_obj) = @_;
+}
+
+# adds cover image, associate_file options stuff. Should be called by sub class
+# read_into_doc_obj
+sub add_associated_files {
+    my $self = shift(@_);
+    # whatis filename??
+    my ($doc_obj, $filename) = @_;
+    
+    # add in the cover image
+    if ($self->{'cover_image'}) {
+	$self->associate_cover_image($doc_obj, $filename);
+    }
+    # store the original (used for eg TextPlugin to store the original for OAI)
+    if ($self->{'store_original_file'}) {
+	$self->associate_source_file($doc_obj, $filename);
+    }
+    
+
+}
+
+# implement this if you are extracting metadata for other documents
+sub metadata_read {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $block_hash, 
+	$extrametakeys, $extrametadata, $extrametafile,
+	$processor, $gli, $aux) = @_;
+    
+    # can we process this file??
+    my ($filename_full_path, $filename_no_path) = &util::get_full_filenames($base_dir, $file);
+    return undef unless $self->can_process_this_file_for_metadata($filename_full_path);
+
+    return 1; # we recognise the file, but don't actually do anything with it
+}
+
+
+# The BasePlugin read() function. This function calls read_into_doc_obj()
+# to ensure all the right things to make general options work for a
+# given plugin are done. It then calls the process() function which
+# does all the work specific to a plugin (like the old read functions
+# used to do). Most plugins should define their own process() function
+# and let this read() function keep control.  
+#
+# recursive plugins (e.g. RecPlug) and specialized plugins like those
+# capable of processing many documents within a single file (e.g.
+# GMLPlug) might want to implement their own version of read(), but
+# more likely need to implement their own version of read_into_doc_obj()
+#
+# Return number of files processed, undef if can't recognise, -1 if can't
+# process
+
+sub read {
+    my $self = shift (@_);  
+    my ($pluginfo, $base_dir, $file, $block_hash, $metadata, $processor, $maxdocs, $total_count, $gli) = @_;
+
+    # can we process this file??
+    my ($filename_full_path, $filename_no_path) = &util::get_full_filenames($base_dir, $file);
+
+    return undef unless $self->can_process_this_file($filename_full_path);
+    
+    my ($process_status,$doc_obj) = $self->read_into_doc_obj(@_);
+    
+    if ((defined $process_status) && ($process_status == 1)) {
+	
+	# process the document
+	$processor->process($doc_obj);
+
+	$self->{'num_processed'} ++;
+	undef $doc_obj; 
+    }
+    # delete any temp files that we may have created
+    $self->clean_up_after_doc_obj_processing();
+
+
+    # if process_status == 1, then the file has been processed.
+    return $process_status;
+
+}
+
+# returns undef if file is rejected by the plugin
+sub process {
+    my $self = shift (@_);
+    my ($textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+
+    gsprintf(STDERR, "BasePlugin::process {common.must_be_implemented}\n");
+
+    my ($cpackage,$cfilename,$cline,$csubr,$chas_args,$cwantarray) = caller(1);
+    print STDERR "Calling method: $cfilename:$cline $cpackage->$csubr\n";
+
+    die "\n";
+
+    return undef; # never gets here
+}
+
+# overwrite this method to delete any temp files that we have created
+sub clean_up_after_doc_obj_processing {
+    my $self = shift(@_);
+
+}
+
+# write_file -- used by ConvertToPlug, for example in post processing
+#
+# where should this go, is here the best place??
+sub utf8_write_file {
+    my $self = shift (@_);
+    my ($textref, $filename) = @_;
+    
+    if (!open (FILE, ">:utf8", $filename)) {
+	gsprintf(STDERR, "ConvertToPlug::write_file {ConvertToPlug.could_not_open_for_writing} ($!)\n", $filename);
+	die "\n";
+    }
+    print FILE $$textref;
+    
+    close FILE;
+}
+
+
+sub filename_based_title
+{
+    my $self = shift (@_);
+    my ($file) = @_;
+
+    my $file_derived_title = $file;
+    $file_derived_title =~ s/_/ /g;
+    $file_derived_title =~ s/\.[^.]+$//;
+
+    return $file_derived_title;
+}
+
+
+sub title_fallback
+{
+    my $self = shift (@_);
+    my ($doc_obj,$section,$file) = @_;
+
+    if (!defined $doc_obj->get_metadata_element ($section, "Title") 
+	|| $doc_obj->get_metadata_element($section, "Title") eq "") {
+
+	my $source_file = $doc_obj->get_metadata_element($section, "Source");
+	my $file_derived_title;
+	if (defined $source_file) {
+	    $file_derived_title =  $self->filename_based_title($source_file);
+	}
+	else {
+	    # pp = pretty print
+	    my $pp_file = (defined $source_file) ? $source_file : $file;
+
+	    my $raw_title = $self->filename_based_title($file);
+	    my $file_derived_title = &unicode::raw_filename_to_url_encoded($raw_title);
+	}
+
+
+	if (!defined $doc_obj->get_metadata_element ($section, "Title")) {
+	    $doc_obj->add_utf8_metadata ($section, "Title", $file_derived_title);
+	}
+	else {
+	    $doc_obj->set_utf8_metadata_element ($section, "Title", $file_derived_title);
+	} 
+    }
+    
+}
+
+# add any extra metadata that's been passed around from one
+# plugin to another.
+# extra_metadata uses add_utf8_metadata so it expects metadata values
+# to already be in utf8
+sub extra_metadata {
+    my $self = shift (@_);
+    my ($doc_obj, $cursection, $metadata) = @_;
+
+    my $associate_tail_re = $self->{'associate_tail_re'};
+
+    foreach my $field (keys(%$metadata)) {
+	# $metadata->{$field} may be an array reference
+	if ($field eq "gsdlassocfile_tobe") {
+	    # 'gsdlassocfile_tobe' is artificially introduced metadata
+	    # that is used to signal that certain additional files should
+	    # be tied to this document.  Useful in situations where a
+	    # metadata pass in the plugin pipeline works out some files
+	    # need to be associated with a document, but the document hasn't
+	    # been formed yet.
+	    my $equiv_form = "";
+	    foreach my $gaf (@{$metadata->{$field}}) {
+		my ($full_filename,$mimetype) = ($gaf =~ m/^(.*):(.*):$/);
+		my ($tail_filename) = ($full_filename =~ /^.*[\/\\](.+?)$/);
+		
+		# we need to make sure the filename is valid utf-8 - we do 
+		# this by url or base64 encoding it
+		# $tail_filename is the name that we store the file as
+		$tail_filename = &util::rename_file($tail_filename, $self->{'file_rename_method'});
+		$doc_obj->associate_file($full_filename,$tail_filename,$mimetype);
+		$doc_obj->associate_source_file($full_filename);
+		# If the filename is url_encoded, we need to encode the % signs 
+		# in the filename, so that it works in a url
+		my $url_tail_filename = &unicode::filename_to_url($tail_filename);
+		# work out extended tail extension (i.e. matching tail re)
+
+		my ($file_prefix,$file_extended_ext) 
+		    = &util::get_prefix_and_tail_by_regex($tail_filename,$associate_tail_re);
+		my ($pre_doc_ext) = ($file_extended_ext =~ m/^(.*)\..*$/);
+		my ($doc_ext) = ($tail_filename =~ m/^.*\.(.*)$/);
+
+##		my $start_doclink = "<a href=\"_httpprefix_/collect/[collection]/index/assoc/{Or}{[parent(Top):assocfilepath],[assocfilepath]}/$url_tail_filename\">";
+		my $start_doclink = "<a href=\'_httpprefix_/collect/[collection]/index/assoc/[assocfilepath]/$url_tail_filename\'>";
+		my $start_doclink_gs3 = "<a href=\'_httpprefix_/collect/[collection]/index/assoc/[assocfilepath]/$url_tail_filename\'>";
+
+		my $srcicon = "_icon".$doc_ext."_";
+		my $end_doclink = "</a>";
+		
+		my $assoc_form = "$start_doclink\{If\}{$srcicon,$srcicon,$doc_ext\}$end_doclink";
+
+		$doc_obj->add_utf8_metadata ($cursection, "equivDocLink", $start_doclink);
+		$doc_obj->add_utf8_metadata ($cursection, "equivDocIcon", $srcicon);
+		$doc_obj->add_utf8_metadata ($cursection, "/equivDocLink", $end_doclink);
+
+		if (defined $pre_doc_ext && $pre_doc_ext ne "") {
+		    # for metadata such as [mp3._edited] [mp3._full] ...
+		    $doc_obj->add_utf8_metadata ($cursection, "$doc_ext.$pre_doc_ext", $assoc_form); 
+		}
+
+		# for multiple metadata such as [mp3.assoclink]
+		$doc_obj->add_utf8_metadata ($cursection, "$doc_ext.assoclink", $assoc_form); 
+
+		$equiv_form .= " $assoc_form";	
+	    }
+	    $doc_obj->add_utf8_metadata ($cursection, "equivlink", $equiv_form); 
+	}
+	elsif ($field eq "gsdlzipfilename") {
+	    # special case for when files have come out of a zip. source_path 
+	    # (used for archives dbs and keeping track for incremental import)
+	    # must be set to the zip file name
+	    my $zip_filename = $metadata->{$field};
+	    # overwrite the source_path
+	    $doc_obj->set_source_path($zip_filename);
+	    # and set the metadata
+	    $zip_filename = &util::filename_within_collection($zip_filename);
+	    $zip_filename = $doc_obj->encode_filename($zip_filename, $self->{'file_rename_method'});
+	    $doc_obj->add_utf8_metadata ($cursection, $field, $zip_filename);
+	}
+	elsif (ref ($metadata->{$field}) eq "ARRAY") {
+	    map { 
+		$doc_obj->add_utf8_metadata ($cursection, $field, $_); 
+	    } @{$metadata->{$field}};
+	} else {
+	    $doc_obj->add_utf8_metadata ($cursection, $field, $metadata->{$field}); 
+	}
+    }
+}
+
+
+sub compile_stats {
+    my $self = shift(@_);
+    my ($stats) = @_;
+
+    $stats->{'num_processed'} += $self->{'num_processed'};
+    $stats->{'num_not_processed'} += $self->{'num_not_processed'};
+    $stats->{'num_archives'} += $self->{'num_archives'};
+
+}
+sub associate_source_file {
+    my $self = shift(@_);
+    
+    my ($doc_obj, $filename) = @_;
+    my $cursection = $doc_obj->get_top_section();
+    my $assocfilename = $doc_obj->get_assocfile_from_sourcefile();
+    
+    $doc_obj->associate_file($filename, $assocfilename, undef, $cursection);
+    # srclink_file is now deprecated because of the "_" in the metadataname. Use srclinkFile
+    $doc_obj->add_utf8_metadata ($cursection, "srclink_file", $doc_obj->get_sourcefile());
+    $doc_obj->add_utf8_metadata ($cursection, "srclinkFile", $doc_obj->get_sourcefile());
+}
+
+sub associate_cover_image {
+    my $self = shift(@_);
+    my ($doc_obj, $filename) = @_;
+
+    my $upgraded_filename = &util::upgrade_if_dos_filename($filename);
+
+    $filename =~ s/\.[^\\\/\.]+$/\.jpg/;
+    $upgraded_filename =~ s/\.[^\\\/\.]+$/\.jpg/;
+
+    if (exists $self->{'covers_missing_cache'}->{$upgraded_filename}) {
+	# don't stat() for existence e.g. for multiple document input files
+	# (eg SplitPlug)
+	return;
+    }
+
+    my $top_section=$doc_obj->get_top_section();
+
+    if (&util::fd_exists($upgraded_filename)) {
+	$doc_obj->associate_source_file($filename);
+    	$doc_obj->associate_file($filename, "cover.jpg", "image/jpeg");
+	$doc_obj->add_utf8_metadata($top_section, "hascover",  1);
+    } else {
+	my $upper_filename = $filename;
+	my $upgraded_upper_filename = $upgraded_filename;
+
+	$upper_filename =~ s/jpg$/JPG/;
+	$upgraded_upper_filename =~ s/jpg$/JPG/;
+
+	if (&util::fd_exists($upgraded_upper_filename)) {
+	    $doc_obj->associate_source_file($upper_filename);
+	    $doc_obj->associate_file($upper_filename, "cover.jpg",
+				     "image/jpeg");
+	    $doc_obj->add_utf8_metadata($top_section, "hascover",  1);
+	} else {
+	    # file doesn't exist, so record the fact that it's missing so
+	    # we don't stat() again (stat is slow)
+	    $self->{'covers_missing_cache'}->{$upgraded_filename} = 1;
+	}
+    }
+
+}
+
+
+# Overridden by exploding plugins (eg. ISISPlug)
+sub clean_up_after_exploding
+{
+    my $self = shift(@_);
+}
+
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/BibTexPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/BibTexPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/BibTexPlugin.pm	(revision 24799)
@@ -0,0 +1,832 @@
+###########################################################################
+#
+# BibTexPlugin.pm - a plugin for bibliography records in BibTex format
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright 2000 Gordon W. Paynter
+# Copyright 1999-2001 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+
+# BibTexPlugin reads bibliography files in BibTex format.
+#
+# by Gordon W. Paynter (gwp@cs.waikato.ac.nz), November 2000
+# Based on ReferPlug.  See ReferPlug for geneology.
+#
+# BibTexPlugin creates a document object for every reference a the file.
+# It is a subclass of SplitTextFile, so if there are multiple records, all
+# are read.
+#
+# Modified Dec 2001 by John McPherson:
+#  *  some modifications submitted by Sergey Yevtushenko
+#                      <sergey@intellektik.informatik.tu-darmstadt.de>
+#  *  some non-ascii char support (ie mostly Latin)
+
+
+package BibTexPlugin;
+
+use SplitTextFile;
+use MetadataRead;
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+# BibTexPlugin is a sub-class of SplitTextFile.
+sub BEGIN {
+    @BibTexPlugin::ISA = ('MetadataRead', 'SplitTextFile');
+}
+
+my $arguments = 
+    [ { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'reqd' => "no",
+	'deft' => &get_default_process_exp() },
+      { 'name' => "split_exp",
+	'desc' => "{SplitTextFile.split_exp}",
+	'type' => "regexp",
+	'deft' => &get_default_split_exp(),
+	'reqd' => "no" }
+      ];
+
+my $options = { 'name'     => "BibTexPlugin",
+		'desc'     => "{BibTexPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'explodes' => "yes",
+		'args'     => $arguments };
+
+# This plugin processes files with the suffix ".bib"
+sub get_default_process_exp {
+    return q^(?i)\.bib$^;
+}
+
+# This plugin splits the input text at blank lines
+sub get_default_split_exp {
+    return q^\n+(?=@)^;
+}
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new SplitTextFile($pluginlist, $inputargs, $hashArgOptLists);
+
+    return bless $self, $class;
+}
+
+
+
+# The process function reads a single bibliographic record and stores
+# it as a new document.
+
+sub process {
+    my $self = shift (@_);
+    my ($textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    my $cursection = $doc_obj->get_top_section();
+    $self->{'key'} = "default";
+
+    # Check that we're dealing with a valid BibTex record
+    return undef unless ($$textref =~ /^@\w+\{.*\}/s);
+
+    # Ignore things we can't use
+    return 0 if ($$textref =~ /^\@String/);
+
+    # This hash translates BibTex field names into metadata names.  The
+    # BibTex names are taken from the "Local Guide to Latex" Graeme
+    # McKinstry.  Metadata names are consistent with ReferPlug.
+
+    # The author metadata will be stored as one "Creator" entry, but will
+    # also be split up into several individual "Author" fields.
+
+    my %field = (
+		 'address', 'PublisherAddress',
+		 'author', 'Creator',
+		  
+		 'booktitle', 'Booktitle',
+		 'chapter', 'Chapter',
+		 'edition', 'Edition',
+		 'editor', 'Editor', 
+		 'institution', 'Publisher',
+		 'journal', 'Journal',
+		 'month', 'Month',
+		 'number', 'Number',
+		 'pages', 'Pages',
+		 'publisher', 'Publisher',
+		 'school', 'Publisher',
+		 'title', 'Title',
+		 'volume', 'Volume',
+		 'year', 'Year', # Can't use "Date" as this implies DDDDMMYY!
+
+		 'keywords', 'Keywords',
+		 'abstract', 'Abstract',
+		 'copyright', 'Copyright',
+		 'note', 'Note',
+		 'url', 'URL',
+		 );
+
+    # Metadata fields 
+    my %metadata;
+    my ($EntryType, $Creator, $Keywords, $text);
+
+    my $verbosity = $self->{'verbosity'};
+    $verbosity = 0 unless $verbosity;
+
+    # Make sure the text has exactly one entry per line -
+    # append line to previous if it doesn't start with "  <key> = "
+
+    my @input_lines=split(/\r?\n/, $$textref);
+    my @all_lines;
+    my $entry_line=shift @input_lines;
+    foreach my $input_line (@input_lines) {
+	if ($input_line =~ m/^\s*\w+\s*=\s*/) {
+	    # this is a new key
+	    push(@all_lines, $entry_line);
+	    $entry_line=$input_line;
+	} else {
+	    # this is a continuation of previous line
+	    $entry_line .= " " . $input_line;
+	}
+	
+    }
+    # add final line, removing trailing '}'
+    $entry_line =~ s/\}\s*$//;
+    push(@all_lines, $entry_line);
+    push(@all_lines, "}");
+
+    # Read and process each line in the bib file.
+    my ($entryname, $name, $value, $line);
+    foreach $line (@all_lines) {
+
+	# Add each line.  Most lines consist of a field identifer and
+	# then data, and we simply store them, though we treat some
+	# of the fields a bit differently.
+
+	$line =~ s/\s+/ /g;
+	$text .= "$line\n";
+
+
+	print "Processing line = $line \n" if $verbosity>=4;
+
+	# The first line is special, it contains the reference type and OID
+	if ($line =~ /\@(\w+)\W*\{\W*([\*\.\w\d:-]*)\W*$/) {
+	    $EntryType = $1;
+	    my $EntryID = (defined $2) ? $2 : "default";
+	    print "** $EntryType - \"$EntryID\" \n"
+		if ($verbosity >= 4);
+
+	    next;
+	}
+	if ($line =~ /\@/) {
+	    print $outhandle "bibtexplug: suspect line in bibtex file: $line\n"
+		if ($verbosity >= 2);
+	    print $outhandle "bibtexplug: if that's the start of a new bibtex record ammend regexp in bibtexplug::process()\n"
+		if ($verbosity >= 2);
+	}
+	
+	# otherwise, parse the metadata out of this line
+	next unless ($line =~ /^\s*(\w+)\s*=\s*(.*)/);
+	$entryname = lc($1);
+	$value = $2;
+	$value =~ s/,?\s*$//; # remove trailing comma and space
+	if ($value =~ /^"/ && $value =~ /"$/) {
+	    # remove surrounding " marks
+	    $value =~ s/^"//; $value =~ s/"$//;
+	} elsif ($value =~ /^\{/ && $value =~ /\}$/) {
+	    # remove surrounding {} marks
+	    $value =~ s/^\{//; $value =~ s/\}$//;
+	}
+	# special case for year - we only want a 4 digit year, not 
+	# "circa 2004" etc
+	if ($entryname=~ /^year$/i) {
+	    if ($value=~ /(\d{4})/) {
+		$value=$1;
+		$metadata{$entryname} .= "$value";
+	    }
+	} 
+	else {
+	    
+	    $value = &process_latex($value);
+	    # Add this line of metadata
+	    $metadata{$entryname} .= "$value";	
+	}
+    }
+
+    # Add the Entry type as metadata
+    $doc_obj->add_utf8_metadata ($cursection, "EntryType", $EntryType);
+    
+    #Add the fileformat as metadata
+    $doc_obj->add_metadata($cursection, "FileFormat", "BibTex");
+
+
+    # Add the various field as metadata
+    foreach my $entryname (keys %metadata) {
+	next unless (defined $field{$entryname});
+	next unless (defined $metadata{$entryname});	
+	
+	$name = $field{$entryname};
+	$value = $metadata{$entryname};
+
+	if ($name =~ /^Month/) {
+	    $value=expand_month($value);
+	}
+
+	# Several special operatons on metadata follow
+	
+	# Add individual keywords.
+	# The full set of keywords will be added, in due course, as "Keywords".
+	# However, we also want to add them as individual "Keyword" metadata elements.
+	if ($entryname eq "keywords") {
+	    my @keywordlist = split(/,/, $value);
+	    foreach my $k (@keywordlist) {
+		$k = lc($k); 
+		$k =~ s/\s*$//; 
+		$k =~ s/^\s*//; 
+		if ($k =~ /\w/) {
+		    $doc_obj->add_utf8_metadata ($cursection, "Keyword", $k);
+		}
+	    } 
+	}
+	
+	# Add individual authors
+	# The author metadata will be stored as one "Creator" entry, but we
+	# also want to split it into several individual "Author" fields in
+	# "Lastname, Firstnames" format so we can browse it.
+	if ($entryname eq "author") { #added also comparison with editor
+	   
+	    # take care of "et al."...
+	    my $etal='';
+	    if ($value =~ s/\s+(and\s+others|et\.?\s+al\.?)\s*$//i) {
+		$etal=' <em>et. al.</em>';
+	    }
+	    # und here for german language...
+	    # don't use brackets in pattern, else the matched bit becomes
+	    # an element in the list!
+	    my @authorlist = split(/\s+and\s+|\s+und\s+/, $value); 
+	    my @formattedlist = ();
+	    foreach $a (@authorlist) {
+		$a =~ s/\s*$//; 
+		$a =~ s/^\s*//; 
+		# Reformat and add author name
+		next if $a=~ /^\s*$/;
+		
+		# names are "First von Last", "von Last, First"
+		# or "von Last, Jr, First". See the "BibTeXing" manual, page 16
+		my $first="";
+		my $vonlast="";
+		my $jr="";
+
+		if ($a =~ /,/) {
+		    my @parts=split(/,\s*/, $a);
+		    $first = pop @parts;
+		    if (scalar(@parts) == 2) {
+			$jr = pop @parts;
+		    }
+		    $vonlast=shift @parts;
+		    if (scalar(@parts) > 0) {
+			print $outhandle "BibTexPlugin: couldn't parse name $a\n";
+			# but we continue anyway...
+		    }
+		} else { # First von Last
+		    my @words = split(/ /, $a);
+		    while (scalar(@words) > 1 && $words[0] !~ /^[a-z]{2..}/) {
+			$first .= " " . shift (@words);
+		    }
+		    $first =~ s/^\s//;
+		    $vonlast = join (' ', @words); # whatever's left...
+		}
+		my $von="";
+		my $last="";
+		if ($vonlast =~ m/^[a-z]/) { # lowercase implies "von"
+		    $vonlast =~ s/^(([a-z]\w+\s+)+)//;
+		    $von = $1;
+		    if (!defined ($von)) {
+			# some non-English names do start with lowercase
+			# eg "Marie desJardins". Also we can get typos...
+			print $outhandle "BibTexPlugin: couldn't parse surname $vonlast\n";
+			$von="";
+			if ($vonlast =~ /^[a-z]+$/) {
+			    # if it's all lowercase, uppercase 1st.
+			    $vonlast =~ s/^(.)/\u$1/;
+
+			}
+		    }
+		    $von =~ s/\s*$//;
+		    $last=$vonlast;
+		} else {
+		    $last=$vonlast;
+		}
+		my $wholename="$first $von $last $jr";
+		$wholename =~ s/\s+/ /g; # squeeze multiple spaces
+		$wholename =~ s/ $//;
+		push (@formattedlist, $wholename);
+		my $fullname = "$last";
+		$fullname .= " $jr" if ($jr);
+		$fullname .= ", $first";
+		$fullname .= " $von" if ($von);
+
+		# Add each name to set of Authors
+		$doc_obj->add_utf8_metadata ($cursection, "Author", $fullname);
+	    }
+
+	    # Only want at most one "and" in the Creator field
+	    if (scalar(@formattedlist) > 2) {
+		my $lastauthor=pop @formattedlist;
+		$value=join(', ', @formattedlist);
+		$value.=" and $lastauthor";
+	    } else { # 1 or 2 authors...
+		$value=join(" and ",@formattedlist);
+	    }
+	    $value.=$etal; # if there was "et al."
+	}
+
+	# Books and Journals are additionally marked for display purposes
+	if ($entryname eq "booktitle") {
+	    $doc_obj->add_utf8_metadata($cursection, "BookConfOnly", 1);
+	} elsif ($entryname eq "journal") {
+	    $doc_obj->add_utf8_metadata($cursection, "JournalsOnly", 1); 
+	}
+
+	# Add the various fields as metadata	
+	$doc_obj->add_utf8_metadata ($cursection, $name, $value); 
+    
+    }
+
+    # for books and journals...
+    if (!exists $metadata{'title'}) {
+	my $name=$field{'title'}; # get Greenstone metadata name
+	my $value;
+	if (exists $metadata{'booktitle'}) {
+	    $value=$metadata{'booktitle'};
+	} elsif (exists $metadata{'journal'}) {
+	    $value=$metadata{'journal'};
+	}
+	if ($value) {
+	    $doc_obj->add_utf8_metadata ($cursection, $name, $value); 
+	}
+    }
+
+    # Add Date (yyyymmdd) metadata
+    if (defined ($metadata{'year'}) ) {
+	my $date=$metadata{'year'};
+	chomp $date;
+	my $month=$metadata{'month'};
+	if (defined($month)) {
+	    # month is currently 3 letter code or a range...
+	    $month = expand_month($month);
+	    # take the first month found... might not find one!
+	    $month =~ m/_textmonth(\d\d)_/;
+	    $month = $1;
+	}
+	if (!defined($month)) {
+	    $month="00";
+	}
+	$date .= "${month}00";
+	$doc_obj->add_utf8_metadata($cursection, "Date", $date); 
+}
+
+#    # Add the text in BibTex format (all fields)
+    if ($text =~ /\w/) {
+
+	$text =~ s@&@&amp;@g;
+	$text =~ s@<@&lt;@g;
+	$text =~ s@>@&gt;@g;
+	$text =~ s@\n@<br/>\n@g;
+	$text =~ s@\\@\\\\@g;
+
+	$doc_obj->add_utf8_text ($cursection, $text);
+    }
+
+    return 1;
+}
+
+
+
+
+# convert email addresses and URLs into links
+sub convert_urls_into_links{
+   my ($text) = @_;
+ 
+   $text =~ s/([\w\d\.\-]+@[\w\d\.\-]+)/<a href=\"mailto:$1\">$1<\/a>/g;
+   $text =~ s/(http:\/\/[\w\d\.\-]+[\/\w\d\.\-]*)/<a href=\"$1\">$1<\/a>/g;
+
+   return $text;
+}
+
+# Clean up whitespace and convert \n charaters to <BR> or <P>
+sub clean_up_whitespaces{
+   my ($text) = @_;
+
+   $text =~ s/%%%%%/<BR> <BR>/g;
+   $text =~ s/ +/ /g;
+   $text =~ s/\s*$//; 
+   $text =~ s/^\s*//; 
+   $text =~ s/\n/\n<BR>/g;
+   $text =~ s/<BR>\s*<BR>/<P>/g;
+
+   return $text;
+}
+
+
+sub convert_problem_characters_without_ampersand{
+    my ($text) = @_;
+    $text =~ s/</&lt;/g;
+    $text =~ s/>/&gt;/g;
+    
+    $text =~ s/\'\'/\"/g; #Latex -specific conversion
+    $text =~ s/\`\`/\"/g; #Latex -specific conversion
+
+    $text =~ s/\"/&quot;/g;
+    $text =~ s/\'/&#8217;/g;
+    $text =~ s/\`/&#8216;/g;
+
+#    $text =~ s/\+/ /g;
+#    $text =~ s/\(/ /g;
+#    $text =~ s/\)/ /g;
+
+    $text =~ s/\\/\\\\/g;
+
+#    $text =~ s/\./\\\./g;
+
+    return $text;
+}
+
+# Convert a text string into HTML.
+
+# The HTML is going to be inserted into a GML file, so we have to be
+# careful not to use symbols like ">", which occurs frequently in email
+# messages (and use &gt instead.
+
+# This function also turns URLs and email addresses into links, and
+# replaces carriage returns with <BR> tags (and multiple carriage returns
+# with <P> tags).
+
+sub text_into_html {
+    my ($text) = @_;
+
+    # Convert problem characters into HTML symbols
+    $text =~ s/&/&amp;/g;
+
+    $text = &convert_problem_characters_without_ampersand( $text );
+
+    # convert email addresses and URLs into links
+    $text = &convert_urls_into_links( $text );
+
+    $text = &clean_up_whitespaces( $text );
+
+    return $text;
+}
+
+
+sub expand_month {
+    my $text=shift;
+
+    # bibtex style files expand abbreviations for months.
+    # Entries can contain more than one month (eg ' month = jun # "-" # aug, ')
+    $text =~ s/jan/_textmonth01_/g;
+    $text =~ s/feb/_textmonth02_/g;
+    $text =~ s/mar/_textmonth03_/g;
+    $text =~ s/apr/_textmonth04_/g;
+    $text =~ s/may/_textmonth05_/g;
+    $text =~ s/jun/_textmonth06_/g;
+    $text =~ s/jul/_textmonth07_/g;
+    $text =~ s/aug/_textmonth08_/g;
+    $text =~ s/sep/_textmonth09_/g;
+    $text =~ s/oct/_textmonth10_/g;
+    $text =~ s/nov/_textmonth11_/g;
+    $text =~ s/dec/_textmonth12_/g;
+
+    return $text;
+}
+
+
+# Convert accented characters, remove { }, interprete some commands....
+# Note!! This is not comprehensive! Also assumes Latin -> Unicode!
+sub process_latex {
+    my ($text) = @_;
+      
+    # note - this is really ugly, but it works. There may be a prettier way
+    # of mapping latex accented chars to utf8, but we just brute force it here.
+    # Also, this isn't complete - not every single possible accented letter
+    # is in here yet, but most of the common ones are.
+
+    my %utf8_chars =
+	(
+	 # acutes
+	 '\'a' => chr(0xc3).chr(0xa1),
+	 '\'c' => chr(0xc4).chr(0x87),
+	 '\'e' => chr(0xc3).chr(0xa9),
+	 '\'i' => chr(0xc3).chr(0xad),
+	 '\'l' => chr(0xc3).chr(0xba),
+	 '\'n' => chr(0xc3).chr(0x84),
+	 '\'o' => chr(0xc3).chr(0xb3),
+	 '\'r' => chr(0xc5).chr(0x95),
+	 '\'s' => chr(0xc5).chr(0x9b),
+	 '\'u' => chr(0xc3).chr(0xba),
+	 '\'y' => chr(0xc3).chr(0xbd),
+	 '\'z' => chr(0xc5).chr(0xba),
+	 # graves
+	 '`a' => chr(0xc3).chr(0xa0),
+	 '`A' => chr(0xc3).chr(0x80),
+	 '`e' => chr(0xc3).chr(0xa8),
+	 '`E' => chr(0xc3).chr(0x88),
+	 '`i' => chr(0xc3).chr(0xac),
+	 '`I' => chr(0xc3).chr(0x8c),
+	 '`o' => chr(0xc3).chr(0xb2),
+	 '`O' => chr(0xc3).chr(0x92),
+	 '`u' => chr(0xc3).chr(0xb9),
+	 '`U' => chr(0xc3).chr(0x99),
+	 # circumflex
+	 '^a' => chr(0xc3).chr(0xa2),
+	 '^A' => chr(0xc3).chr(0x82),
+	 '^c' => chr(0xc4).chr(0x89),
+	 '^C' => chr(0xc4).chr(0x88),
+	 '^e' => chr(0xc3).chr(0xaa),
+	 '^E' => chr(0xc3).chr(0x8a),
+	 '^g' => chr(0xc4).chr(0x9d),
+	 '^G' => chr(0xc4).chr(0x9c),
+	 '^h' => chr(0xc4).chr(0xa5),
+	 '^H' => chr(0xc4).chr(0xa4),
+	 '^i' => chr(0xc3).chr(0xae),
+	 '^I' => chr(0xc3).chr(0x8e),
+	 '^j' => chr(0xc4).chr(0xb5),
+	 '^J' => chr(0xc4).chr(0xb4),
+	 '^o' => chr(0xc3).chr(0xb4),
+	 '^O' => chr(0xc3).chr(0x94),
+	 '^s' => chr(0xc5).chr(0x9d),
+	 '^S' => chr(0xc5).chr(0x9c),
+	 '^u' => chr(0xc3).chr(0xa2),
+	 '^U' => chr(0xc3).chr(0xbb),
+	 '^w' => chr(0xc5).chr(0xb5),
+	 '^W' => chr(0xc5).chr(0xb4),
+	 '^y' => chr(0xc5).chr(0xb7),
+	 '^Y' => chr(0xc5).chr(0xb6),
+	 
+	 # diaeresis
+	 '"a' => chr(0xc3).chr(0xa4),
+	 '"A' => chr(0xc3).chr(0x84),
+	 '"e' => chr(0xc3).chr(0xab),
+	 '"E' => chr(0xc3).chr(0x8b),
+	 '"\\\\i' => chr(0xc3).chr(0xaf),
+	 '"\\\\I' => chr(0xc3).chr(0x8f),
+	 '"o' => chr(0xc3).chr(0xb6),
+	 '"O' => chr(0xc3).chr(0x96),
+	 '"u' => chr(0xc3).chr(0xbc),
+	 '"U' => chr(0xc3).chr(0x9c),
+	 '"y' => chr(0xc3).chr(0xbf),
+	 '"Y' => chr(0xc3).chr(0xb8),
+	 # tilde
+	 '~A' => chr(0xc3).chr(0x83),
+	 '~N' => chr(0xc3).chr(0x91),
+	 '~O' => chr(0xc3).chr(0x95),
+	 '~a' => chr(0xc3).chr(0xa3),
+	 '~n' => chr(0xc3).chr(0xb1),
+	 '~o' => chr(0xc3).chr(0xb5),
+	 # caron - handled specially
+	 # double acute
+	 # ring
+	 # dot
+	 '.c' => chr(0xc4).chr(0x8b),
+	 '.C' => chr(0xc4).chr(0x8a),
+	 '.e' => chr(0xc4).chr(0x97),
+	 '.E' => chr(0xc4).chr(0x96),
+	 '.g' => chr(0xc4).chr(0xa1),
+	 '.G' => chr(0xc4).chr(0xa0),
+	 '.I' => chr(0xc4).chr(0xb0),
+	 '.z' => chr(0xc5).chr(0xbc),
+	 '.Z' => chr(0xc5).chr(0xbb),
+	 # macron
+	 '=a' => chr(0xc4).chr(0x81),
+	 '=A' => chr(0xc4).chr(0x80),
+	 '=e' => chr(0xc4).chr(0x93),
+	 '=E' => chr(0xc4).chr(0x92),
+	 '=i' => chr(0xc4).chr(0xab),
+	 '=I' => chr(0xc4).chr(0xaa),
+	 '=o' => chr(0xc4).chr(0x8d),
+	 '=O' => chr(0xc4).chr(0x8c),
+	 '=u' => chr(0xc4).chr(0xab),
+	 '=U' => chr(0xc4).chr(0xaa),
+	 
+	 # stroke - handled specially - see below
+	 
+	 # cedilla - handled specially
+	 );
+    
+# these are one letter latex commands - we make sure they're not a longer
+# command name. eg {\d} is d+stroke, so careful of \d
+    my %special_utf8_chars = 
+	(
+	 # breve
+	 'u g' => chr(0xc4).chr(0x9f),
+	 'u G' => chr(0xc4).chr(0x9e),
+	 'u i' => chr(0xc4).chr(0xad),
+	 'u I' => chr(0xc4).chr(0xac),
+	 'u o' => chr(0xc5).chr(0x8f),
+	 'u O' => chr(0xc5).chr(0x8e),
+	 'u u' => chr(0xc5).chr(0xad),
+	 'u U' => chr(0xc5).chr(0xac),
+	 # caron
+	 'v c' => chr(0xc4).chr(0x8d),
+	 'v C' => chr(0xc4).chr(0x8c),
+	 'v n' => chr(0xc5).chr(0x88),
+	 'v N' => chr(0xc5).chr(0x87),
+	 'v s' => chr(0xc5).chr(0xa1),
+	 'v S' => chr(0xc5).chr(0xa5),
+	 'v z' => chr(0xc5).chr(0xbe),
+	 'v Z' => chr(0xc5).chr(0xbd),
+	 # cedilla
+	 'c c' => chr(0xc3).chr(0xa7),
+	 'c C' => chr(0xc3).chr(0x87),
+	 'c g' => chr(0xc4).chr(0xa3),
+	 'c G' => chr(0xc4).chr(0xa2),
+	 'c k' => chr(0xc4).chr(0xb7),
+	 'c K' => chr(0xc4).chr(0xb6),
+	 'c l' => chr(0xc4).chr(0xbc),
+	 'c L' => chr(0xc4).chr(0xbb),
+	 'c n' => chr(0xc5).chr(0x86),
+	 'c N' => chr(0xc5).chr(0x85),
+	 'c r' => chr(0xc5).chr(0x97),
+	 'c R' => chr(0xc5).chr(0x96),
+	 'c s' => chr(0xc5).chr(0x9f),
+	 'c S' => chr(0xc5).chr(0x9e),
+	 'c t' => chr(0xc5).chr(0xa3),
+	 'c T' => chr(0xc5).chr(0xa2),
+	 # double acute / Hungarian accent
+	 'H O' => chr(0xc5).chr(0x90),
+	 'H o' => chr(0xc5).chr(0x91),
+	 'H U' => chr(0xc5).chr(0xb0),
+	 'H u' => chr(0xc5).chr(0xb1),
+	 
+	 # stroke 
+	 'd' => chr(0xc4).chr(0x91),
+	 'D' => chr(0xc4).chr(0x90),
+	 'h' => chr(0xc4).chr(0xa7),
+#	 'H' => chr(0xc4).chr(0xa6), # !! this normally(!!?) means Hung. umlaut
+	 'i' => chr(0xc4).chr(0xb1), # dotless lowercase i
+	 'l' => chr(0xc5).chr(0x82),
+	 'L' => chr(0xc5).chr(0x81),
+	 'o' => chr(0xc3).chr(0xb8),
+	 'O' => chr(0xc3).chr(0x98),
+	 't' => chr(0xc5).chr(0xa7),
+	 'T' => chr(0xc5).chr(0xa6),
+	 # german ss/szlig/sharp s
+	 'ss' => chr(0xc3).chr(0x9f),
+	 );
+    
+    # convert latex-style accented characters.
+
+    # remove space (if any) between \ and letter to accent (eg {\' a})
+
+    $text =~ s@(\\[`'="^~\.])\s(\w)@$1$2@g; #`
+		   
+    # remove {} around a single character (eg \'{e})
+    $text =~ s@(\\[`'="^~\.]){(\w)}@{$1$2}@g; #`
+
+    # \, is another way of doing cedilla \c
+    $text =~ s@\\,(.)@\\c $1@g;
+
+    # remove {} around a single character for special 1 letter commands -
+    # need to insert a space. Eg \v{s}  ->  {\v s}
+    $text =~ s@(\\[uvcH]){(\w)}@{$1 $2}@g;
+
+    # only do if the text contains a '\' character. 
+    if ($text =~ m|\\|) {
+	# "normal" accents - ie non-alpha latex tag
+	while ($text =~ m@\\([`'="^~\.])([\w])@) { #`
+	    my $tex="$1$2"; my $char="$2";
+	    my $replacement=$utf8_chars{$tex};
+	    if (!defined($replacement)) {
+		print STDERR "BibTexPlugin: Warning: unknown latex accent \"$tex\" in \"$text\"\n";
+		$replacement=$char;
+	    }
+	    $text =~ s/\\\Q$tex/$replacement/g;
+	}
+
+        # where the following letter matters (eg "sm\o rrebr\o d", \ss{})
+        # only do the change if immediately followed by a space, }, {, or \
+	# one letter accents ( + ss)
+        while ($text =~ m@\\([DdhiLlOoTt]|ss)[{}\s\"\\]@) {
+	    my $tex=$1;
+	    my $replacement=$special_utf8_chars{$tex};
+	    if (!defined($replacement)) {
+		print STDERR "BibTexPlugin: Warning: unknown latex accent \"$tex\" in \"$text\"\n";
+		$replacement=$tex;
+	    }
+	    $text =~ s/\\$tex([{}\s\"\\])/$replacement$1/g;
+
+	}
+
+	# one letter latex accent commands that affect following letter
+        while ($text =~ m@\\([uvcH]) ([\w])@) {
+          my $tex="$1 $2"; my $char="$2";
+          my $replacement=$special_utf8_chars{$tex};
+          if (!defined($replacement)) {
+	      print STDERR "BibTexPlugin: Warning: unknown latex accent \"$tex\" in \"$text\"\n";
+	      $replacement=$char;
+	  }
+          $text =~ s/\\$tex/$replacement/g;
+        }
+    }
+
+    # escape html-sensitive characters
+    $text =~ s@&@&amp;@g;
+    $text =~ s@<@&lt;@g;
+    $text =~ s@>@&gt;@g;
+    $text =~ s/''/"/g; # Latex-specific
+    $text =~ s/``/"/g; # Latex-specific
+    # greenstone-specific
+    $text =~ s@\[@&\#91;@g;
+    $text =~ s@\]@&\#93;@g;
+
+    # remove latex commands
+
+    # explicitly recognised commands
+    $text =~ s@\\ldots@&hellip;@g;
+
+    # maths mode
+    $text =~ s@\$(.*?)\$@&process_latex_math($1)@ge;
+
+    # remove all other commands with optional arguments...
+    $text =~ s@\\\w+(\[.*?\])?\s*@@g;
+    # $text =~ s@\\noopsort{[^}]+\}@@g;
+    # $text =~ s@\\\w+{(([^}]*[^\\])*)}@$1@g; # all other commands
+    
+    # remove latex groupings { } (but not \{ or \} )
+    while ($text =~ s/([^\\])[\{\}]/$1/g) {;} # needed for "...}{..."
+    $text =~ s/^\{//; # remove { if first char
+    
+    # latex characters
+    # spaces - nobr space (~), opt break (\-), append ("#" - bibtex only)
+    $text =~ s/([^\\])~+/$1 /g; # non-breaking space  "~"
+    # optional break "\-"
+    if ($text =~ m/[^&]\#/) { # concat macros (bibtex) but not HTML codes
+	# the non-macro bits have quotes around them - we just remove quotes
+	$text =~ s/([^&])[\"\#]/$1/g;
+    }
+    # dashes. Convert (m|n)-dash into single dash for html.
+    $text =~ s@\-\-+@\-@g;
+
+    # quoted { } chars
+    $text =~ s@\\{@{@g;
+    $text =~ s@\\}@}@g;
+
+    # finally to protect against macro language...
+    $text =~ s@\\@\\\\@g;
+
+    return $text;
+}
+
+
+sub process_latex_math {
+    my $text = shift;
+
+    $text =~ s@\\infty@infinity@g;       # or unicode 0x221E...
+    $text =~ s@\^{(.*?)}@<sup>$1</sup>@g; # superscript
+    $text =~ s@\^([^\{])@<sup>$1</sup>@g;
+    $text =~ s@\_{(.*?)}@<sub>$1</sub>@g; # subscript
+    $text =~ s@\_([^\{])@<sub>$1</sub>@g;
+
+    # put all other command names in italics
+    $text =~ s@\\([\w]+)@<i>$1</i>@g;
+
+    return $text;
+}
+
+sub add_OID {
+    my $self = shift (@_);
+    my ($doc_obj, $id, $segment_number) = @_;
+    
+    if ( $self->{'key'} eq "default") {
+	$self->SUPER::add_OID(@_);
+#	$doc_obj->set_OID("$id\_$segment_number");
+    } else {
+	$doc_obj->set_OID($self->{'key'});
+    }
+}
+
+1;
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/BookPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/BookPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/BookPlugin.pm	(revision 24799)
@@ -0,0 +1,246 @@
+###########################################################################
+#
+# BookPlugin.pm (formally called HBSPlug) -- plugin for processing simple
+# html (or text) books
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# creates multi-level document from document containing 
+# <<TOC>> level tags. Metadata for each section is taken from any
+# other tags on the same line as the <<TOC>>. e.g. <<Title>>xxxx<</Title>>
+# sets Title metadata.
+
+# Everything else between TOC tags is treated as simple html (i.e. no 
+# processing of html links or any other HTMLPlug type stuff is done).
+
+# expects input files to have a .hb file extension by default (this can be 
+# changed by adding a -process_exp option
+
+# a file with the same name as the hb file but a .jpg extension is
+# taken as the cover image (jpg files are blocked by this plugin)
+
+# BookPlugin is a simplification (and extension) of the HBPlug used
+# by the Humanity Library collections. BookPlugin is faster as it expects
+# the input files to be cleaner (The input to the HDL collections
+# contains lots of excess html tags around <<TOC>> tags, uses <<I>>
+# tags to specify images, and simply takes all text between <<TOC>>
+# tags and start of text to be Title metadata). If you're marking up
+# documents to be displayed in the same way as the HDL collections,
+# use this plugin instead of HBPlug.
+
+package BookPlugin;
+
+use AutoExtractMetadata;
+use util;
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+sub BEGIN {
+    @BookPlugin::ISA = ('AutoExtractMetadata');
+}
+
+my $arguments = 
+    [ { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'reqd' => "no",
+	'deft' => &get_default_process_exp() },
+      { 'name' => "block_exp",
+	'desc' => "{BasePlugin.block_exp}",
+	'type' => "regexp",
+	'reqd' => "no",
+	'deft' => &get_default_block_exp() } ];
+
+my $options = { 'name'     => "BookPlugin",
+		'desc'     => "{BookPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new AutoExtractMetadata($pluginlist, $inputargs, $hashArgOptLists);
+
+    return bless $self, $class;
+}
+
+sub get_default_block_exp {
+    my $self = shift (@_);
+
+    return q^\.jpg$^;
+}
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+    return q^(?i)\.hb$^;
+}
+
+# do plugin specific processing of doc_obj
+sub process {
+    my $self = shift (@_);
+    my ($textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    print STDERR "<Processing n='$file' p='BookPlugin'>\n" if ($gli);
+    print $outhandle "BookPlugin: processing $file\n" 
+	if $self->{'verbosity'} > 1;
+    
+    my $cursection = $doc_obj->get_top_section();
+
+    # Add FileFormat as the metadata
+    $doc_obj->add_metadata($doc_obj->get_top_section(),"FileFormat", "Book");
+
+    my $filename = &util::filename_cat($base_dir, $file);
+    my $absdir = $filename;
+    $absdir =~ s/[^\/\\]*$//;
+
+    # add the cover image
+    my $coverimage = $filename;
+    $coverimage =~ s/\.[^\.]*$/\.jpg/i;
+    $doc_obj->associate_file($coverimage, "cover.jpg", "image/jpeg");
+
+    my $title = "";
+
+    # remove any leading rubbish
+    $$textref =~ s/^.*?(<<TOC)/$1/ios;
+    
+    my $curtoclevel = 1;
+    my $firstsection = 1;
+    my $toccount = 0;
+    while ($$textref =~ /\w/) {
+	$$textref =~ s/^<<TOC(\d+)>>([^\n]*)\n(.*?)(<<TOC|\Z)/$4/ios;
+	my $toclevel = $1;
+	my $metadata = $2;
+	my $sectiontext = $3;
+
+	if ($toclevel == 2) {
+	    $toccount ++;
+	}
+	
+	# close any sections below the current level and
+	# create a new section (special case for the firstsection)
+	while (($curtoclevel > $toclevel) ||
+	       (!$firstsection && $curtoclevel == $toclevel)) {
+	    $cursection = $doc_obj->get_parent_section ($cursection);
+	    $curtoclevel--;
+	}
+	if ($curtoclevel+1 < $toclevel) {
+	    print $outhandle "WARNING - jump in toc levels in $filename " . 
+		"from $curtoclevel to $toclevel\n";
+	}
+	while ($curtoclevel < $toclevel) {
+	    $curtoclevel++;
+	    $cursection = 
+		$doc_obj->insert_section($doc_obj->get_end_child($cursection));
+	}
+
+	# sort out metadata
+	while ($metadata =~ s/^.*?<<([^>]*)>>(.*?)<<[^>]*>>//) {
+	    my $metakey = $1;
+	    my $metavalue = $2;
+
+	    if ($metavalue ne "" && $metakey ne "") {
+		# make sure key fits in with gsdl naming scheme 
+		$metakey =~ tr/[A-Z]/[a-z]/;
+		$metakey = ucfirst ($metakey);
+		$doc_obj->add_utf8_metadata ($cursection, $metakey, $metavalue);
+	    }
+	}
+
+	# remove header rubbish
+	$sectiontext =~ s/^.*?<body[^>]*>//ios;
+
+	# and any other unwanted tags
+	$sectiontext =~ s/<(\/p|\/html|\/body)>//isg;
+
+	# fix up the image links
+	$sectiontext =~ s/(<img[^>]*?src\s*=\s*\"?)([^\">]+)(\"?[^>]*>)/
+	    &replace_image_links($absdir, $doc_obj, $1, $2, $3)/isge;
+
+	# add the text
+	$doc_obj->add_utf8_text($cursection, $sectiontext);
+
+	$firstsection = 0;
+
+	$$textref =~ s/^\s+//s;
+    }
+
+    return 1;
+}
+
+sub replace_image_links {
+    my $self = shift (@_);
+    my ($dir, $doc_obj, $front, $link, $back) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    my ($filename, $error);
+    my $foundimage = 0;
+    
+    $link =~ s/\/\///;
+    my ($imagetype) = $link =~ /([^\.]*)$/;
+    $imagetype =~ tr/[A-Z]/[a-z]/;
+    if ($imagetype eq "jpg") {$imagetype = "jpeg";}
+    if ($imagetype !~ /^(jpeg|gif|png)$/) {
+	print $outhandle "BookPlugin: Warning - unknown image type ($imagetype)\n";
+    }
+    my ($imagefile) = $link =~ /([^\/]*)$/;
+    my ($imagepath) = $link =~ /^[^\/]*(.*)$/;
+
+    if (defined $imagepath && $imagepath =~ /\w/) {
+	# relative link
+	$filename = &util::filename_cat ($dir, $imagepath);
+	if (-e $filename) {
+	    $doc_obj->associate_file ($filename, $imagefile, "image/$imagetype");
+	    $foundimage = 1;
+	} else {
+	    $error = "BookPlugin: Warning - couldn't find image file $imagefile in either $filename or";
+	}
+    }
+
+    if (!$foundimage) {
+	$filename = &util::filename_cat ($dir, $imagefile);
+	if (-e $filename) {
+	    $doc_obj->associate_file ($filename, $imagefile, "image/$imagetype");    
+	    $foundimage = 1;
+	} elsif (defined $error) {
+	    print $outhandle "$error $filename\n";
+	} else {
+	    print $outhandle "BookPlugin: Warning - couldn't find image file $imagefile in $filename\n";
+	}
+    }
+
+    if ($foundimage) {
+	return "${front}_httpdocimg_/${imagefile}${back}";
+    } else {
+	return "";
+    }
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/CONTENTdmPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/CONTENTdmPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/CONTENTdmPlugin.pm	(revision 24799)
@@ -0,0 +1,822 @@
+###########################################################################
+#
+# CONTENTdmPlugin.pm -- reasonably with-it pdf plugin
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999-2001 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+package CONTENTdmPlugin;
+
+use ConvertBinaryFile;
+use ReadXMLFile;
+
+use unicode;
+use ghtml;
+
+use strict;
+no strict 'refs'; # so we can use a var for filehandles (eg STDERR)
+
+
+use XMLParser;
+
+# inherit ReadXMLFile for the apply_xslt method
+sub BEGIN {
+    @CONTENTdmPlugin::ISA = ('ConvertBinaryFile', 'ReadXMLFile');
+}
+
+
+my $convert_to_list =
+    [ 
+#      {	'name' => "auto",
+#	'desc' => "{ConvertBinaryFile.convert_to.auto}" },
+#      {	'name' => "html",
+#	'desc' => "{ConvertBinaryFile.convert_to.html}" },
+#      {	'name' => "text",
+#	'desc' => "{ConvertBinaryFile.convert_to.text}" },
+      { 'name' => "pagedimg",
+	'desc' => "{ConvertBinaryFile.convert_to.pagedimg}"},
+      ];
+
+
+
+my $arguments = 
+      [
+       { 'name' => "convert_to",
+	'desc' => "{ConvertBinaryFile.convert_to}",
+	'type' => "enum",
+	'reqd' => "yes",
+	'list' => $convert_to_list, 
+	'deft' => "html" },	 
+      { 'name' => "xslt",
+	'desc' => "{ReadXMLFile.xslt}",
+	'type' => "string",
+	'deft' => "",
+	'reqd' => "no" },
+       { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'deft' => &get_default_process_exp(),
+	'reqd' => "no" },
+      { 'name' => "block_exp",
+	'desc' => "{BasePlugin.block_exp}",
+	'type' => "regexp",
+	'deft' => &get_default_block_exp() }
+];
+
+my $options = { 'name'     => "CONTENTdmPlugin",
+		'desc'     => "{CONTENTdmPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		# CONTENTdmPlugin is one of the few ConvertBinaryFile subclasses whose source doc can't be replaced by a GS-generated html
+		'srcreplaceable' => "no",
+		'args'     => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@$inputargs,"-title_sub");
+    push(@$inputargs,'^(Page\s+\d+)?(\s*1\s+)?');
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my @arg_array = @$inputargs;
+    my $self = new ConvertBinaryFile($pluginlist,$inputargs,$hashArgOptLists);
+    
+    if ($self->{'info_only'}) {
+	# don't worry about any options etc
+	return bless $self, $class;
+    }
+
+    my $parser = new XML::Parser('Style' => 'Stream',
+				 'Pkg' => 'ReadXMLFile',
+				 'PluginObj' => $self,
+				 'Handlers' => {'Char' => \&ReadXMLFile::Char,
+						'XMLDecl' => \&ReadXMLFile::XMLDecl,
+						'Entity'  => \&ReadXMLFile::Entity,
+						'Doctype' => \&ReadXMLFile::Doctype,
+						'Default' => \&ReadXMLFile::Default
+						});  
+    $self->{'parser'} = $parser;
+
+
+    $self->{'rdf_desc'} = undef;
+    $self->{'about_key'} = undef;
+    $self->{'metadata_name'} = undef;
+    $self->{'metadata_value'} = undef;
+
+    # do we only allow one option??
+    $self->{'convert_to'} = "pagedimg";
+    $self->{'convert_to_plugin'} = "PagedImagePlugin";
+    $self->{'convert_to_ext'} = "jpg";
+    
+    my $secondary_plugin_name = $self->{'convert_to_plugin'};
+    my $secondary_plugin_options = $self->{'secondary_plugin_options'};
+
+    if (!defined $secondary_plugin_options->{$secondary_plugin_name}) {
+	$secondary_plugin_options->{$secondary_plugin_name} = [];
+    }
+    my $specific_options = $secondary_plugin_options->{$secondary_plugin_name};
+
+    push(@$specific_options, "-title_sub", '^(Page\s+\d+)?(\s*1\s+)?');
+    push(@$specific_options, "-create_thumbnail", "true", "-create_screenview", "true");
+    push(@$specific_options, "-file_rename_method", "none");
+    push(@$specific_options, "-processing_tmp_files");
+
+#    my $secondary_plugin_options = $self->{'secondary_plugin_options'};
+
+#    if (!defined $secondary_plugin_options->{'PagedImagePlugin'}){
+#	$secondary_plugin_options->{'PagedImagePlugin'} = [];
+#    }
+#    my $pagedimg_options = $secondary_plugin_options->{'PagedImagePlugin'}; 
+#    push(@$pagedimg_options, "-title_sub", '^(Page\s+\d+)?(\s*1\s+)?');
+#    push(@$pagedimg_options, "-create_thumbnail", "true", "-create_screenview", "true");
+#    push(@$pagedimg_options, "-file_rename_method", "none");
+#    push(@$pagedimg_options, "-processing_tmp_files");
+    $self = bless $self, $class;
+    $self->load_secondary_plugins($class,$secondary_plugin_options,$hashArgOptLists);
+    return $self;
+}
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+    return q^(?i)\.rdf$^;
+}
+
+sub get_default_block_exp {
+    return q^(?i)\.(jpg|jpeg|gif)$^;
+}
+
+
+
+sub rdf_desc_to_id
+{
+    my $self = shift (@_);
+    my ($rdf_desc) = @_;
+
+    my $rdf_id = {};
+
+    # initialise any .cpd (=complex multi page) structures 
+
+    foreach my $about_key (keys %{$rdf_desc}) {
+	if ($about_key =~ m/\.cpd$/) {
+	    my $about = $rdf_desc->{$about_key};
+	    my $id    = $about->{'dc:identifier'};
+
+	    if ($id =~ m/^\s*$/) {
+		# missing id, make one up based on about attribute
+
+		my ($tailname, $dirname, $suffix)
+		    = &File::Basename::fileparse($about_key, "\\.[^\\.]+\$");
+
+		$id = "about:$tailname";
+	    }
+
+	    $rdf_id->{$id} = $about;
+	    $rdf_id->{$id}->{'ex:filename'} = $about_key;
+	    $rdf_id->{$id}->{'ex:type'} = "complex";
+	    $rdf_id->{$id}->{'pages'} = [];
+	}
+
+    }
+
+    # now add in *non* .cpd items
+
+    foreach my $about_key (keys %{$rdf_desc}) {
+	if ($about_key !~ m/\.cpd$/) {
+	    my $about = $rdf_desc->{$about_key};	    
+	    my $id    = $about->{'dc:identifier'};
+
+
+	    if ($id =~ m/^\s*$/) {
+		# missing id, make one up based on about attribute
+
+		my ($tailname, $dirname, $suffix)
+		    = &File::Basename::fileparse($about_key, "\\.[^\\.]+\$");
+
+		$id = "about:$tailname";
+	    }
+
+	    if (defined $rdf_id->{$id}) {
+		$about->{'ex:filename'} = $about_key;
+
+		# dealing with complex multi-page situation
+		# Add to existing structure
+
+		my $pages = $rdf_id->{$id}->{'pages'};
+		push(@$pages,$about)
+	    }
+	    else {
+		# New entry
+
+		$rdf_id->{$id} = $about;
+		$rdf_id->{$id}->{'ex:type'} = "simple";	    
+		$rdf_id->{$id}->{'ex:filename'} = $about_key;
+	    }
+	}
+	
+    }
+
+    return $rdf_id;
+}
+
+
+sub metadata_table_txt_file
+{
+    my $self = shift (@_);
+    my ($output_root,$page_num) = @_;
+
+    my $txt_filename = $output_root."_page_$page_num.txt";
+
+    my ($tailname, $dirname, $suffix)
+	= &File::Basename::fileparse($txt_filename, "\\.[^\\.]+\$");
+
+    my $txt_file = "$tailname$suffix";
+
+    return $txt_file;
+}
+
+
+sub output_metadata_table 
+{
+    my $self = shift (@_);
+    my ($page,$page_num,$tmp_dirname,$txt_file) = @_;
+    
+    my $txt_filename = &util::filename_cat($tmp_dirname,$txt_file);
+
+    open(TOUT,">$txt_filename") 
+	|| die "Error: unable to write metadata data out as txt file $txt_filename: $!\n";
+    
+    print TOUT $page->{'MetadataTable'};
+    delete $page->{'MetadataTable'};
+
+    close (TOUT);
+}
+
+
+sub rdf_id_to_item_file
+{
+    my $self = shift (@_);
+    my ($rdf_id,$tmp_dirname,$output_root) = @_;
+
+    my $item_file_list = [];
+    
+    foreach my $id (keys %{$rdf_id}) {
+
+	my $id_safe = $id;
+	$id_safe =~ s/ /-/g;
+
+	my $output_filename = $output_root."_$id_safe.item";
+	open(FOUT,">$output_filename") 
+	    || die "Unable to open $output_filename: $!\n";
+	
+
+	print FOUT "<PagedDocument>\n";
+
+	my $rdf_doc = $rdf_id->{$id};
+	foreach my $metadata_name (keys %$rdf_doc) {
+
+
+	    next if ($metadata_name eq "pages");
+
+	    my $metadata_value = $rdf_doc->{$metadata_name};
+
+	    # convert ns:name to ns.Name
+	    $metadata_name =~ s/^(.*?):(.*)/$1\.\u$2/; 
+
+	    print FOUT "  <Metadata name=\"$metadata_name\">$metadata_value</Metadata>\n";
+	}
+
+	if ($rdf_doc->{'ex:type'} eq "complex") {
+	    my $pages = $rdf_doc->{'pages'};
+	    my $page_num = 1;
+
+	    foreach my $page (@$pages) {
+
+		my $imgfile = $page->{'ex:filename'};
+		if ($imgfile =~ m/(http|ftp):/) {
+		    $imgfile = "empty.jpg";
+		}
+		else {
+		    $imgfile = &util::filename_cat("..","import",$imgfile);
+		}
+		
+		my $txt_file 
+		    = $self->metadata_table_txt_file($output_root,$page_num);
+
+		$self->output_metadata_table($page,$page_num,
+					     $tmp_dirname,$txt_file);
+
+
+		print FOUT "  <Page pagenum=\"$page_num\" imgfile=\"$imgfile\" txtfile=\"$txt_file\">\n";
+
+		foreach my $metadata_name (keys %$page) {
+		
+		    my $metadata_value = $rdf_doc->{$metadata_name};
+		    # convert ns:name to ns.Name
+		    $metadata_name =~ s/^(.*?):(.*)/$1\.\u$2/; 
+
+		    print FOUT "  <Metadata name=\"$metadata_name\">$metadata_value</Metadata>\n";
+		}
+		
+
+		$page_num++;
+
+
+		print FOUT "  </Page>\n";
+	    }
+	}
+	else {
+	    # simple
+	    # duplicate top-level metadata for now plus image to bind to
+
+	    my $imgfile = $rdf_doc->{'ex:filename'};
+	    if ($imgfile =~ m/(http|ftp):/) {
+		$imgfile = "empty.jpg";
+	    }
+	    else {
+		$imgfile = &util::filename_cat("..","import",$imgfile);
+	    }
+
+
+	    my $txt_file = $self->metadata_table_txt_file($output_root,1);
+	    $self->output_metadata_table($rdf_doc,1,$tmp_dirname,$txt_file);
+
+	    print FOUT "  <Page pagenum=\"1\" imgfile=\"$imgfile\" txtfile=\"$txt_file\">\n";	    
+	    foreach my $metadata_name (keys %$rdf_doc) {
+
+		my $metadata_value = $rdf_doc->{$metadata_name};
+		
+		# convert ns:name to ns.Name
+		$metadata_name =~ s/^(.*?):(.*)/$1\.\u$2/; 
+
+		print FOUT "  <Metadata name=\"$metadata_name\">$metadata_value</Metadata>\n";
+	    }
+	    print FOUT "  </Page>\n";
+
+	}
+
+	print FOUT "</PagedDocument>\n";
+	close(FOUT);
+
+	push(@$item_file_list,$output_filename);
+
+    }
+    
+
+    return $item_file_list;
+}
+
+
+
+sub xml_area_convert_file
+{
+    my $self = shift (@_);
+    my ($input_filename, $tmp_dirname, $output_root) = @_;
+
+    eval {
+	# Build up hash table/tree of all records
+
+	my $xslt = $self->{'xslt'};
+	if (defined $xslt && ($xslt ne "")) {
+	    # perform xslt
+	    my $transformed_xml = $self->apply_xslt($xslt,$input_filename);
+
+	    open(TOUT,">/tmp/tout.xml") 
+		|| die "Unable to open /tmp/tout.xml: $!\n";
+	    print TOUT $transformed_xml;
+	    close(TOUT);
+
+
+	    # feed transformed file (now in memory as string) into XML parser
+	    $self->{'parser'}->parse($transformed_xml);
+	}
+	else {
+	    $self->{'parser'}->parsefile($input_filename);
+	}
+    };
+  
+    if ($@) {
+
+	# parsefile may either croak somewhere in XML::Parser (e.g. because
+	# the document is not well formed) or die somewhere in XMLPlug or a
+	# derived plugin (e.g. because we're attempting to process a
+	# document whose DOCTYPE is not meant for this plugin). For the
+	# first case we'll print a warning and continue, for the second
+	# we'll just continue quietly
+
+	print STDERR "**** Error is: $@\n";
+
+	my $file = $self->{'file'};
+
+	my ($msg) = $@ =~ /Carp::croak\(\'(.*?)\'\)/;
+	if (defined $msg) {	
+	    my $outhandle = $self->{'outhandle'};
+	    my $plugin_name = ref ($self);
+	    print $outhandle "$plugin_name failed to process $file ($msg)\n";
+	}
+
+	my $gli = $self->{'gli'};
+
+	# reset ourself for the next document
+	$self->{'section_level'}=0;
+	print STDERR "<ProcessingError n='$file'>\n" if ($gli);
+	return ("fail",undef); # error during processing
+    }
+
+    my $rdf_desc = $self->{'rdf_desc'};    
+
+#    foreach my $about_key (keys %{$rdf_desc}) {
+#	my $about = $rdf_desc->{$about_key};
+#	foreach my $metadata_name (keys %{$about}) {
+#
+#	    my $metadata_value = $about->{$metadata_name};
+##	    print STDERR " $metadata_name: $metadata_value\n";
+#	}
+#    }
+
+
+    # Merge entries with same name
+
+
+    my $merged_rdf_id = $self->rdf_desc_to_id($rdf_desc);
+
+#    foreach my $about_key (keys %{$merged_rdf_id}) {
+#	my $about = $merged_rdf_id->{$about_key};
+#	foreach my $metadata_name (keys %{$about}) {
+#
+#	    my $metadata_value = $about->{$metadata_name};
+##	    print STDERR " $metadata_name: $metadata_value\n";
+#	}
+#    }
+
+
+
+    my $item_files = $self->rdf_id_to_item_file($merged_rdf_id,$tmp_dirname, 
+						$output_root);
+
+    return ("item",$item_files);
+}
+
+
+# Override ConvertBinaryFile tmp_area_convert_file() to provide solution specific 
+# to CONTENTdm
+#
+# A better (i.e. in the future) solution would be to see if this can be
+# shifted into gsConvert.pl so there is no need to override the
+# default tmp_area_convert_file()
+
+
+sub tmp_area_convert_file {
+    my $self = shift (@_);
+    my ($output_ext, $input_filename, $textref) = @_;
+
+    # is textref ever used?!?
+
+    my $outhandle = $self->{'outhandle'};
+    my $convert_to = $self->{'convert_to'};
+    my $failhandle = $self->{'failhandle'};
+    my $convert_to_ext = $self->{'convert_to_ext'};
+    
+    # softlink to collection tmp dir
+    my $tmp_dirname 
+	= &util::filename_cat($ENV{'GSDLCOLLECTDIR'}, "tmp");
+    &util::mk_dir($tmp_dirname) if (!-e $tmp_dirname);
+
+    # derive tmp filename from input filename
+    my ($tailname, $dirname, $suffix)
+	= &File::Basename::fileparse($input_filename, "\\.[^\\.]+\$");
+
+    # Remove any white space from filename -- no risk of name collision, and
+    # makes later conversion by utils simpler. Leave spaces in path...
+    # tidy up the filename with space, dot, hyphen between
+    $tailname =~ s/\s+//g; 
+    $tailname =~ s/\.+//g;
+    $tailname =~ s/\-+//g;
+
+    $tailname = $self->SUPER::filepath_to_utf8($tailname) unless &unicode::check_is_utf8($tailname);
+    $suffix = lc($suffix);
+    my $tmp_filename = &util::filename_cat($tmp_dirname, "$tailname$suffix");
+
+    &util::soft_link($input_filename, $tmp_filename);
+    my $verbosity = $self->{'verbosity'};
+    if ($verbosity > 0) {
+	print $outhandle "Converting $tailname$suffix to $convert_to format\n";
+    }
+
+    my $errlog = &util::filename_cat($tmp_dirname, "err.log");
+    
+    # call xml_area_convert_file rather than gsConvert.pl
+
+    my $output_root = &util::filename_cat($tmp_dirname, "$tailname");
+
+    my ($output_type,$item_files) 
+	= $self->xml_area_convert_file($tmp_filename,$tmp_dirname,$output_root);
+
+
+    my $fakeimg_filename = &util::filename_cat($dirname, "empty.jpg");
+    my $fakeimg_tmp_filename = &util::filename_cat($tmp_dirname, "empty.jpg");
+
+    print STDERR "***** No source image identified with item\n";
+
+    print STDERR "***** Using default \"no image available\" $fakeimg_filename -> $fakeimg_tmp_filename\n";
+
+    &util::soft_link($fakeimg_filename, $fakeimg_tmp_filename);
+   
+    # continue as before ...
+
+    # remove symbolic link to original file
+    &util::rm($tmp_filename);
+
+    # Check STDERR here
+    chomp $output_type;
+    if ($output_type eq "fail") {
+	print $outhandle "Could not convert $tailname$suffix to $convert_to format\n";
+	print $failhandle "$tailname$suffix: " . ref($self) . " failed to convert to $convert_to\n";
+	$self->{'num_not_processed'} ++;
+	if (-s "$errlog") {
+	    open(ERRLOG, "$errlog");
+	    while (<ERRLOG>) {
+		print $outhandle "$_";
+	    }
+	    print $outhandle "\n";
+	    close ERRLOG;
+	}
+	&util::rm("$errlog") if (-e "$errlog");
+	return [];
+    }
+
+    # store the *actual* output type and return the output filename
+    # it's possible we requested conversion to html, but only to text succeeded
+    #$self->{'convert_to_ext'} = $output_type;
+    if ($output_type =~ /html/i) {
+	$self->{'converted_to'} = "HTML";
+    } elsif ($output_type =~ /te?xt/i) {
+	$self->{'converted_to'} = "Text";
+    } elsif ($output_type =~ /item/i){
+	$self->{'converted_to'} = "PagedImage";
+    }
+
+    
+    return $item_files;
+}
+
+
+
+
+# Override ConvertBinaryFile (ie BasePlugin) read
+# Needed so multiple .item files generated are sent down secondary plugin 
+# and the resulting doc_objs all processed.
+
+sub read {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $block_hash, $metadata, $processor, $maxdocs, $total_count, $gli) = @_;
+
+
+    $self->{'gli'} = $gli;
+    $self->{'file'} = $file;
+
+    my $successful_rv = -1;
+
+    my $outhandle = $self->{'outhandle'};
+    
+    my ($filename_full_path, $filename_no_path) = &util::get_full_filenames($base_dir, $file);
+    return undef unless $self->can_process_this_file($filename_full_path);
+
+    $file =~ s/^[\/\\]+//; # $file often begins with / so we'll tidy it up
+
+    # read() deviates at this point from ConvertBinaryFile
+    # Need to work with list of filename returned
+
+    my $output_ext = $self->{'convert_to_ext'};
+    my $conv_filename_list = [];
+
+    $conv_filename_list = $self->tmp_area_convert_file($output_ext, $filename_full_path);
+
+    if (scalar(@$conv_filename_list)==0) {
+	return -1;
+    } # had an error, will be passed down pipeline 
+
+    foreach my $conv_filename ( @$conv_filename_list ) {
+	if (! -e "$conv_filename") {return -1;} 
+	$self->{'conv_filename'} = $conv_filename; # is this used anywhere?
+	$self->convert_post_process($conv_filename);
+    
+	my $secondary_plugins =  $self->{'secondary_plugins'};
+	my $num_secondary_plugins = scalar(keys %$secondary_plugins);
+
+	if ($num_secondary_plugins == 0) {
+	    print $outhandle "Warning: No secondary plugin to use in conversion.  Skipping $file\n";
+	    return 0; # effectively block it
+	}
+
+	my @plugin_names = keys %$secondary_plugins;
+	my $plugin_name = shift @plugin_names;
+	
+	if ($num_secondary_plugins > 1) {
+	    print $outhandle "Warning: Multiple secondary plugins not supported yet!  Choosing $plugin_name\n.";
+	}
+	
+	my $secondary_plugin = $secondary_plugins->{$plugin_name};
+
+	# note: metadata is not carried on to the next level
+	my ($rv,$doc_obj) 
+	    = $secondary_plugin->read_into_doc_obj ($pluginfo,"", $conv_filename, 
+						    $block_hash, $metadata, $processor, $maxdocs, $total_count,
+						    $gli);
+
+	print STDERR "**** $conv_filename => returned rv = $rv\n";
+
+	if ((defined $rv) && ($rv>=0)) {
+	    $successful_rv = 1;
+	}
+
+	# Override previous gsdlsourcefilename set by secondary plugin
+	my $collect_file = &util::filename_within_collection($filename_full_path);
+	my $collect_conv_file = &util::filename_within_collection($conv_filename);
+	$doc_obj->set_source_filename ($collect_file, $self->{'file_rename_method'}); 
+	$doc_obj->set_converted_filename($collect_conv_file);
+	
+	my ($filemeta) = $file =~ /([^\\\/]+)$/;
+	my $plugin_filename_encoding = $self->{'filename_encoding'};
+    my $filename_encoding = $self->deduce_filename_encoding($file,$metadata,$plugin_filename_encoding);
+	$self->set_Source_metadata($doc_obj, $filename_full_path, $filename_encoding);
+	$doc_obj->set_utf8_metadata_element($doc_obj->get_top_section(), "Plugin", "$self->{'plugin_type'}");
+	$doc_obj->set_utf8_metadata_element($doc_obj->get_top_section(), "FileSize", (-s $filename_full_path));
+	
+	if ($self->{'cover_image'}) {
+	    $self->associate_cover_image($doc_obj, $filename_full_path);
+	}
+	
+	# do plugin specific processing of doc_obj
+	unless (defined ($self->process(undef, $pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli))) {
+	    print STDERR "***** process returned undef: $base_dir $file\n";
+	    print STDERR "<ProcessingError n='$file'>\n" if ($gli);
+	    return -1;
+	}
+	# do any automatic metadata extraction
+	$self->auto_extract_metadata ($doc_obj);
+
+	# have we found a Title??
+	$self->title_fallback($doc_obj,$doc_obj->get_top_section(),$filemeta);
+
+	# add an OID
+	$self->add_OID($doc_obj);
+	# process the document
+	$processor->process($doc_obj);
+
+	$self->{'num_processed'} ++;
+    }
+
+    return $successful_rv;
+}
+
+sub process {
+
+    return 1;
+}
+
+# do we need this? sec pluginn process would have already been called as part of read_into_doc_obj??
+sub process_old {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+
+    
+    my $secondary_plugins =  $self->{'secondary_plugins'};
+    my @plugin_names = keys %$secondary_plugins;
+    my $plugin_name = shift @plugin_names; # already checked there is only one
+	
+    my $secondary_plugin = $secondary_plugins->{$plugin_name};
+	
+    my $result = $secondary_plugin->process(@_);
+
+    return $result;
+}
+
+
+# Called at the beginning of the XML document.
+sub xml_start_document {
+    my $self = shift(@_);
+    my ($expat) = @_;
+
+    $self->{'rdf_desc'} = {};
+}
+
+
+# Called for DOCTYPE declarations - use die to bail out if this doctype
+# is not meant for this plugin
+sub xml_doctype {
+    my $self = shift(@_);
+    my ($expat, $name, $sysid, $pubid, $internal) = @_;
+
+    die "" if ($name !~ /^rdf:RDF$/);
+
+    my $outhandle = $self->{'outhandle'};
+    print $outhandle "CONTENTdmPlugin: processing $self->{'file'}\n" if $self->{'verbosity'} > 1;
+
+}
+
+# Called for every start tag. The $_ variable will contain a copy of the
+# tag and the %_ variable will contain the element's attributes.
+sub xml_start_tag {
+    my $self = shift(@_);
+    my ($expat, $element) = @_;
+
+    if ($element eq "rdf:Description") {
+
+	my $about_key = $_{'about'};
+
+	my $rdf_desc = $self->{'rdf_desc'};
+	$rdf_desc->{$about_key} = {};
+
+	$self->{'about_key'}  = $about_key;
+	$self->{'index_text'} = "";
+	$self->{'pp_text'}    = "<table width=\"100%\">\n";
+
+
+    }
+    elsif (defined $self->{'about_key'}) {	
+	$self->{'metadata_name'} = $element;
+	$self->{'metadata_value'} = "";
+    }
+
+}
+
+# Called for every end tag. The $_ variable will contain a copy of the tag.
+sub xml_end_tag {
+    my $self = shift(@_);
+    my ($expat, $element) = @_;
+
+    if ($element eq "rdf:Description") {
+	$self->{'pp_text'} .= "</table>\n";
+	## ghtml::htmlsafe($self->{'pp_text'});
+
+
+	my $about_key = $self->{'about_key'};
+	my $about = $self->{'rdf_desc'}->{$about_key};
+	$about->{'IndexText'}     = $self->{'index_text'};
+	$about->{'MetadataTable'} = $self->{'pp_text'};
+
+
+	$self->{'about_key'}   = undef;
+	$self->{'index_text'}  = undef;
+	$self->{'pp_text'}     = undef;
+
+    }
+    elsif (defined $self->{'metadata_name'}) {
+	my $metadata_name = $self->{'metadata_name'};
+	if ($element eq $metadata_name) {
+	    my $metadata_value = $self->{'metadata_value'};
+
+	    my $about_key = $self->{'about_key'};
+	    my $about = $self->{'rdf_desc'}->{$about_key};
+	    $about->{$metadata_name} = $metadata_value;
+
+	    $self->{'index_text'} .= "$metadata_value\n";
+	    $self->{'pp_text'} .= "  <tr><td>$metadata_name</td><td>$metadata_value</td></tr>\n";
+
+	    $self->{'metadata_name'}  = undef;
+	    $self->{'metadata_value'} = undef;
+	}
+    }
+}
+
+# Called just before start or end tags with accumulated non-markup text in
+# the $_ variable.
+sub xml_text {
+    my $self = shift(@_);
+    my ($expat) = @_;
+
+    if (defined $self->{'metadata_name'}) {
+	$self->{'metadata_value'} .= $_;
+    }
+}
+
+# Called at the end of the XML document.
+sub xml_end_document {
+    my $self = shift(@_);
+    my ($expat) = @_;
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/CSVPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/CSVPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/CSVPlugin.pm	(revision 24799)
@@ -0,0 +1,180 @@
+###########################################################################
+#
+# CSVPlugin.pm -- A plugin for files in comma-separated value format
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright 2006 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package CSVPlugin;
+
+
+use SplitTextFile;
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+
+# CSVPlugin is a sub-class of SplitTextFile.
+sub BEGIN {
+    @CSVPlugin::ISA = ('SplitTextFile');
+}
+
+
+my $arguments = 
+    [ { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'reqd' => "no",
+	'deft' => &get_default_process_exp() },
+      { 'name' => "split_exp",
+	'desc' => "{SplitTextFile.split_exp}",
+	'type' => "regexp",
+	'reqd' => "no",
+	'deft' => &get_default_split_exp(),
+        'hiddengli' => "yes" }
+      ];
+
+
+my $options = { 'name'     => "CSVPlugin",
+		'desc'     => "{CSVPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'explodes' => "yes",
+		'args'     => $arguments };
+
+
+# This plugin processes files with the suffix ".csv"
+sub get_default_process_exp {
+    return q^(?i)(\.csv)$^;
+}
+
+    
+# This plugin splits the input text by line
+sub get_default_split_exp {
+    return q^\r?\n^;
+}
+
+
+sub new
+{
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}}, @{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}}, $options);
+
+    my $self = new SplitTextFile($pluginlist, $inputargs, $hashArgOptLists);
+
+    return bless $self, $class;
+}
+
+
+sub read_file
+{
+    my $self = shift (@_);
+    my ($filename, $encoding, $language, $textref) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    # Read the CSV file content
+    open(FILE, $filename);
+    my $reader = new multiread();
+    $reader->set_handle('CSVPlugin::FILE');
+    $reader->set_encoding($encoding);
+    $reader->read_file($textref);
+    close(FILE);
+
+    # Remove any blank lines so the data is split and processed properly
+    $$textref =~ s/\n(\s*)\n/\n/g;
+
+    # The first line contains the metadata element names
+    $$textref =~ s/^(.*?)\r?\n//;
+    my @csv_file_fields = ();
+    my $csv_file_field_line = $1 . ",";  # To make the regular expressions simpler
+    while ($csv_file_field_line ne "") {
+	# Handle quoted values
+	if ($csv_file_field_line =~ s/^\"(.*?)\"\,//) {
+	    my $csv_file_field = $1;
+	    $csv_file_field =~ s/ //g;  # Remove any spaces from the field names
+	    push(@csv_file_fields, $csv_file_field);
+	}
+	# Normal comma-separated case
+	elsif ($csv_file_field_line =~ s/^(.*?)\,//) {
+	    my $csv_file_field = $1;
+	    $csv_file_field =~ s/ //g;  # Remove any spaces from the field names
+	    push(@csv_file_fields, $csv_file_field);
+	}
+	# The line must be formatted incorrectly
+	else {
+	    print STDERR "Error: Badly formatted CSV field line: $csv_file_field_line.\n";
+	    last;
+	}
+    }
+    $self->{'csv_file_fields'} = \@csv_file_fields;
+}
+
+
+sub process
+{
+    my $self = shift (@_);
+    my ($textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    my $section = $doc_obj->get_top_section();
+    my $csv_line = $$textref;
+    my @csv_file_fields = @{$self->{'csv_file_fields'}};
+
+    # Add the raw line as the document text
+    $doc_obj->add_utf8_text($section, $csv_line);
+
+    # Build a hash of metadata name to metadata value for this line
+    my $i = 0;
+    $csv_line .= ",";  # To make the regular expressions simpler
+    while ($csv_line ne "") {
+	# Metadata values containing commas are quoted
+	if ($csv_line =~ s/^\"(.*?)\"\,//) {
+	    # Only bother with non-empty values
+	    if ($1 ne "" && defined($csv_file_fields[$i])) {
+		$doc_obj->add_utf8_metadata($section, $csv_file_fields[$i], $1);
+	    }
+	}
+	# Normal comma-separated case
+	elsif ($csv_line =~ s/^(.*?)\,//) {
+	    # Only bother with non-empty values
+	    if ($1 ne "" && defined($csv_file_fields[$i])) {
+		$doc_obj->add_utf8_metadata($section, $csv_file_fields[$i], $1);
+	    }
+	}
+	# The line must be formatted incorrectly
+	else {
+	    print STDERR "Error: Badly formatted CSV line: $csv_line.\n";
+	    last;
+	}
+
+	$i++;
+    }
+
+    # Record was processed successfully
+    return 1;
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/ConvertBinaryFile.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/ConvertBinaryFile.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/ConvertBinaryFile.pm	(revision 24799)
@@ -0,0 +1,504 @@
+###########################################################################
+#
+# ConvertBinaryFile.pm -- plugin that facilitates conversion of binary files
+# through gsConvert.pl 
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# This plugin is inherited by such plugins as WordPlugin, PowerPointPlugin, 
+# PostScriptPlugin, 
+# RTFPlugin and PDFPlugin. It facilitates the conversion of these document types 
+# to either HTML, Text or a series of images. It works by dynamically loading 
+# an appropriate secondary plugin (HTMLPlug, StructuredHTMLPlug, 
+# PagedImagePlugin or TextPlugin) based on the plugin argument 'convert_to'. 
+
+package ConvertBinaryFile;
+
+use AutoExtractMetadata;
+use ghtml;
+use HTMLPlugin;
+use TextPlugin;
+use PagedImagePlugin;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+no strict 'subs';
+use util;
+
+
+sub BEGIN {
+    @ConvertBinaryFile::ISA = ('AutoExtractMetadata');
+}
+
+my $convert_to_list =
+    [ {	'name' => "auto",
+	'desc' => "{ConvertBinaryFile.convert_to.auto}" },
+      {	'name' => "html",
+	'desc' => "{ConvertBinaryFile.convert_to.html}" },
+      {	'name' => "text",
+	'desc' => "{ConvertBinaryFile.convert_to.text}" }
+      ];
+
+my $arguments =
+    [ { 'name' => "convert_to",
+	'desc' => "{ConvertBinaryFile.convert_to}",
+	'type' => "enum",
+	'reqd' => "yes",
+	'list' => $convert_to_list, 
+	'deft' => "auto" },
+      { 'name' => "keep_original_filename",
+	'desc' => "{ConvertBinaryFile.keep_original_filename}",
+	'type' => "flag" },
+      { 'name' => "title_sub",
+	'desc' => "{HTMLPlugin.title_sub}",
+	'type' => "string", 
+	#'type' => "regexp",
+	'deft' => "" },
+      { 'name' => "apply_fribidi",
+	'desc' => "{ConvertBinaryFile.apply_fribidi}",
+	'type' => "flag",
+	'reqd' => "no" },
+      { 'name' => "use_strings",
+	'desc' => "{ConvertBinaryFile.use_strings}",
+	'type' => "flag",
+	'reqd' => "no" },
+      ];
+
+my $options = { 'name'     => "ConvertBinaryFile",
+		'desc'     => "{ConvertBinaryFile.desc}",
+		'abstract' => "yes",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+
+sub load_secondary_plugins
+{
+    my $self = shift (@_);
+    my ($class,$input_args,$hashArgOptLists) = @_;
+
+    my @convert_to_list = split(",",$self->{'convert_to_plugin'});
+    my $secondary_plugins = {};
+    # find the plugin
+
+    foreach my $convert_to (@convert_to_list) {
+	# load in "convert_to" plugin package
+	my $plugin_class = $convert_to;
+	my $plugin_package = $plugin_class.".pm";
+
+	my $colplugname = undef;
+	if (defined $ENV{'GSDLCOLLECTDIR'}) {
+	    $colplugname = &util::filename_cat($ENV{'GSDLCOLLECTDIR'},
+					       "perllib","plugins", 
+					       $plugin_package);
+	}
+
+	my $mainplugname = &util::filename_cat($ENV{'GSDLHOME'},
+					       "perllib","plugins", 
+					       $plugin_package);
+
+	if ((defined $colplugname) && (-e $colplugname)) { require $colplugname;}
+	elsif (-e $mainplugname) { require $mainplugname; }
+	else {
+	    &gsprintf(STDERR, "{plugin.could_not_find_plugin}\n",
+		      $plugin_class);
+	    die "\n";
+	}
+
+	# call its constructor with extra options that we've worked out!
+	my $arglist = $input_args->{$plugin_class};
+
+	my ($secondary_plugin);
+	eval("\$secondary_plugin = new $plugin_class([],\$arglist)");
+	die "$@" if $@;
+	$secondary_plugins->{$plugin_class} = $secondary_plugin;
+    }
+    $self->{'secondary_plugins'} = $secondary_plugins;
+}
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+    my $classPluginName = (defined $pluginlist->[0]) ? $pluginlist->[0] : $class;
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new AutoExtractMetadata($pluginlist, $inputargs, $hashArgOptLists);
+   
+    return bless $self, $class;
+}
+
+# should be called by subclasses after checking and setting 
+# $self->{'convert_to'}
+sub set_standard_convert_settings {
+    my $self =shift (@_);
+    
+    my $convert_to = $self->{'convert_to'};
+    if ($convert_to eq "auto") {
+	$convert_to = "html";
+	$self->{'convert_to'} = "html";
+    }
+
+    if ($convert_to =~ /^html/) { # may be html or html_multi
+	$self->{'convert_to_plugin'} = "HTMLPlugin";
+	$self->{'convert_to_ext'} = "html";
+    } elsif ($convert_to eq "text") {
+	$self->{'convert_to_plugin'} = "TextPlugin";
+	$self->{'convert_to_ext'} = "txt";
+    } elsif ($convert_to eq "structuredhtml") {
+	$self->{'convert_to_plugin'} = "StructuredHTMLPlugin";
+	$self->{'convert_to_ext'} = "html";
+    } elsif ($convert_to =~ /^pagedimg/) {
+	$self->{'convert_to_plugin'} = "PagedImagePlugin";
+	my ($convert_to_ext) = $convert_to =~ /pagedimg\_(jpg|gif|png)/i;
+	$convert_to_ext = 'jpg' unless defined $convert_to_ext;
+	$self->{'convert_to_ext'} = $convert_to_ext;
+    }
+
+}
+sub init {
+    my $self = shift (@_);
+    my ($verbosity, $outhandle, $failhandle) = @_;
+
+    $self->SUPER::init($verbosity,$outhandle,$failhandle);
+
+    my $secondary_plugins =  $self->{'secondary_plugins'};
+
+    foreach my $plug_name (keys %$secondary_plugins) {
+	my $plugin = $secondary_plugins->{$plug_name};
+	$plugin->init($verbosity,$outhandle,$failhandle);
+    }
+}
+
+sub deinit {
+    # called only once, after all plugin passes have been done
+
+    my ($self) = @_;
+
+    my $secondary_plugins =  $self->{'secondary_plugins'};
+
+    foreach my $plug_name (keys %$secondary_plugins) {
+	my $plugin = $secondary_plugins->{$plug_name};
+	$plugin->deinit();
+    }
+}
+
+sub convert_post_process
+{
+    # by default do no post processing
+    return;
+}
+
+
+# Run conversion utility on the input file.  
+#
+# The conversion takes place in a collection specific 'tmp' directory so 
+# that we don't accidentally damage the input.
+#
+# The desired output type is indicated by $output_ext.  This is usually
+# something like "html" or "word", but can be "best" (or the empty string)
+# to indicate that the conversion utility should do the best it can.
+sub tmp_area_convert_file {
+    my $self = shift (@_);
+    my ($output_ext, $input_filename, $textref) = @_;
+    
+    my $outhandle = $self->{'outhandle'};
+    my $convert_to = $self->{'convert_to'};
+    my $failhandle = $self->{'failhandle'};
+    my $convert_to_ext = $self->{'convert_to_ext'};
+    
+
+    my $upgraded_input_filename = &util::upgrade_if_dos_filename($input_filename);
+
+    # derive tmp filename from input filename
+    my ($tailname, $dirname, $suffix)
+	= &File::Basename::fileparse($upgraded_input_filename, "\\.[^\\.]+\$");
+
+    # softlink to collection tmp dir
+    my $tmp_dirname = &util::get_timestamped_tmp_folder();
+    if (defined $tmp_dirname) {
+	$self->{'tmp_dir'} = $tmp_dirname;
+    } else {
+	$tmp_dirname = $dirname;
+    }
+    
+#    # convert to utf-8 otherwise we have problems with the doc.xml file later on
+#    my $utf8_tailname = (&unicode::check_is_utf8($tailname)) ? $tailname : $self->filepath_to_utf8($tailname);
+
+    # make sure filename to be used can be stored OK in a UTF-8 compliant doc.xml file
+     my $utf8_tailname = &unicode::raw_filename_to_utf8_url_encoded($tailname);
+
+
+    # URLEncode this since htmls with images where the html filename is utf8 don't seem
+    # to work on Windows (IE or Firefox), as browsers are looking for filesystem-encoded
+    # files on the filesystem.
+    $utf8_tailname = &util::rename_file($utf8_tailname, $self->{'file_rename_method'}, "without_suffix");
+
+    my $lc_suffix = lc($suffix);
+    my $tmp_filename = &util::filename_cat($tmp_dirname, "$utf8_tailname$lc_suffix");
+    
+    # If gsdl is remote, we're given relative path to input file, of the form import/tailname.suffix
+    # But we can't softlink to relative paths. Therefore, we need to ensure that
+    # the input_filename is the absolute path, see http://perldoc.perl.org/File/Spec.html
+    my $ensure_path_absolute = 1; # true
+    &util::soft_link($input_filename, $tmp_filename, $ensure_path_absolute);
+    my $verbosity = $self->{'verbosity'};
+    if ($verbosity > 0) {
+	print $outhandle "Converting $tailname$suffix to $convert_to format\n";
+    }
+
+    my $errlog = &util::filename_cat($tmp_dirname, "err.log");
+    
+    # Execute the conversion command and get the type of the result,
+    # making sure the converter gives us the appropriate output type
+    my $output_type=$self->{'convert_to'};
+#    if ($convert_to =~ m/PagedImage/i) {
+#	$output_type = lc($convert_to)."_".lc($convert_to_ext);
+#    } else {
+#	$output_type = lc($convert_to);
+#    }
+
+    my $cmd = "\"".&util::get_perl_exec()."\" -S gsConvert.pl -verbose $verbosity ";
+    if (defined $self->{'convert_options'}) {
+	$cmd .= $self->{'convert_options'} . " ";
+    }
+    if ($self->{'use_strings'}) {
+      $cmd .= "-use_strings ";
+    }
+    $cmd .= "-errlog \"$errlog\" -output $output_type \"$tmp_filename\"";
+    print STDERR "calling cmd $cmd\n";
+    $output_type = `$cmd`;
+	
+    # remove symbolic link to original file
+    &util::rm($tmp_filename);
+    
+    # Check STDERR here
+    chomp $output_type;
+    if ($output_type eq "fail") {
+	print $outhandle "Could not convert $tailname$suffix to $convert_to format\n";
+	print $failhandle "$tailname$suffix: " . ref($self) . " failed to convert to $convert_to\n";
+	# The following  meant that if a conversion failed, the document would be counted twice - do we need it for anything?
+	#$self->{'num_not_processed'} ++;
+	if (-s "$errlog") {
+	    open(ERRLOG, "$errlog");
+	    while (<ERRLOG>) {
+		print $outhandle "$_";
+	    }
+	    print $outhandle "\n";
+	    close ERRLOG;
+	}
+	&util::rm("$errlog") if (-e "$errlog");
+	return "";
+    }
+
+    # store the *actual* output type and return the output filename
+    # it's possible we requested conversion to html, but only to text succeeded
+    #$self->{'convert_to_ext'} = $output_type;
+    if ($output_type =~ /html/i) {
+	$self->{'converted_to'} = "HTML";
+    } elsif ($output_type =~ /te?xt/i) {
+	$self->{'converted_to'} = "Text";
+    } elsif ($output_type =~ /item/i){
+	$self->{'converted_to'} = "PagedImage";
+    }
+    
+    my $output_filename = $tmp_filename;
+    if ($output_type =~ /item/i) {
+	# running under windows
+	if ($ENV{'GSDLOS'} =~ /^windows$/i) {
+	    $output_filename = $tmp_dirname . "\\$tailname\\" . $tailname . ".$output_type";
+	} else {
+	    $output_filename = $tmp_dirname . "\/$tailname\/" . $tailname . ".$output_type";
+	}
+    } else {
+	$output_filename =~ s/$lc_suffix$/.$output_type/;
+    }
+    
+    return $output_filename;
+}
+
+
+# Override BasPlug read_into_doc_obj - we need to call secondary plugin stuff
+sub read_into_doc_obj {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $block_hash, $metadata, $processor, $maxdocs, $total_count, $gli) = @_;
+
+    my $outhandle = $self->{'outhandle'};
+
+    my ($filename_full_path, $filename_no_path) = &util::get_full_filenames($base_dir, $file);
+
+    my $output_ext = $self->{'convert_to_ext'};
+    my $conv_filename = "";
+    $conv_filename = $self->tmp_area_convert_file($output_ext, $filename_full_path);
+        
+    if ("$conv_filename" eq "") {return -1;} # had an error, will be passed down pipeline 
+    if (! -e "$conv_filename") {return -1;} 
+    $self->{'conv_filename'} = $conv_filename;
+    $self->convert_post_process($conv_filename);
+
+    # Run the "fribidi" (http://fribidi.org) Unicode Bidirectional Algorithm program over the converted file
+    # Added for fixing up Persian PDFs after being processed by pdftohtml, but may be useful in other cases too
+    if ($self->{'apply_fribidi'} && $self->{'converted_to'} =~ /(HTML|Text)/) {
+	my $fribidi_command = "fribidi \"$conv_filename\" >\"${conv_filename}.tmp\"";
+	if (system($fribidi_command) != 0) {
+	    print STDERR "ERROR: Cannot run fribidi on \"$conv_filename\".\n";
+	}
+	else {
+	    &util::mv("${conv_filename}.tmp", $conv_filename);
+	}	
+    }
+	
+    my $secondary_plugins =  $self->{'secondary_plugins'};
+    my $num_secondary_plugins = scalar(keys %$secondary_plugins);
+
+    if ($num_secondary_plugins == 0) {
+	print $outhandle "Warning: No secondary plugin to use in conversion.  Skipping $file\n";
+	return 0; # effectively block it
+    }
+
+    my @plugin_names = keys %$secondary_plugins;
+    my $plugin_name = shift @plugin_names;
+	
+    if ($num_secondary_plugins > 1) {
+	print $outhandle "Warning: Multiple secondary plugins not supported yet!  Choosing $plugin_name\n.";
+    }
+   
+    my $secondary_plugin = $secondary_plugins->{$plugin_name};
+
+    # note: metadata is not carried on to the next level
+## **** I just replaced $metadata with {} in following
+    my ($rv,$doc_obj) 
+	= $secondary_plugin->read_into_doc_obj ($pluginfo,"", $conv_filename, $block_hash, {}, $processor, $maxdocs, $total_count, $gli);
+
+    if ((!defined $rv) || ($rv<1)) {
+	# wasn't processed
+	return $rv;
+    }
+    
+    # Override previous gsdlsourcefilename set by secondary plugin
+    my $collect_file = &util::filename_within_collection($filename_full_path);
+    my $collect_conv_file = &util::filename_within_collection($conv_filename);
+    $doc_obj->set_source_filename ($collect_file, $self->{'file_rename_method'}); 
+    ## set_source_filename does not set the doc_obj source_path which is used in archives dbs for incremental
+    # build. so set it manually.
+    $doc_obj->set_source_path($filename_full_path);
+    $doc_obj->set_converted_filename($collect_conv_file);
+
+	my $plugin_filename_encoding = $self->{'filename_encoding'};
+    my $filename_encoding = $self->deduce_filename_encoding($file,$metadata,$plugin_filename_encoding);
+    $self->set_Source_metadata($doc_obj, $filename_full_path, $filename_encoding);
+        
+    $doc_obj->set_utf8_metadata_element($doc_obj->get_top_section(), "Plugin", "$self->{'plugin_type'}");
+    $doc_obj->set_utf8_metadata_element($doc_obj->get_top_section(), "FileSize", (-s $filename_full_path));
+
+    # ****
+    my ($tailname, $dirname, $suffix)
+	= &File::Basename::fileparse($filename_full_path, "\\.[^\\.]+\$");
+    $doc_obj->set_utf8_metadata_element($doc_obj->get_top_section(), "FilenameRoot", $tailname);
+
+    # do plugin specific processing of doc_obj
+    unless (defined ($self->process($pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli))) {
+	print STDERR "<ProcessingError n='$file'>\n" if ($gli);
+	return -1;
+    }
+
+    my $topsection = $doc_obj->get_top_section();
+    $self->add_associated_files($doc_obj, $filename_full_path);
+
+    # extra_metadata is already called by sec plugin in process??
+    $self->extra_metadata($doc_obj, $topsection, $metadata); # do we need this here??
+    # do any automatic metadata extraction
+    $self->auto_extract_metadata ($doc_obj);
+
+    # have we found a Title??
+    $self->title_fallback($doc_obj,$topsection,$filename_no_path);
+
+    $self->add_OID($doc_obj);
+
+    return (1, $doc_obj);
+
+}
+
+sub process {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+
+    return $self->process_type($base_dir, $file, $doc_obj);
+}
+
+# do plugin specific processing of doc_obj for doc_ext type
+sub process_type {
+    my $self = shift (@_);
+    my ($base_dir, $file, $doc_obj) = @_;
+    
+    # need to check that not empty
+    my ($doc_ext) = $file =~ /\.(\w+)$/;
+    $doc_ext = lc($doc_ext);
+    my $file_type = "unknown";
+    $file_type = $self->{'file_type'} if defined $self->{'file_type'};
+    
+    # associate original file with doc object
+    my $cursection = $doc_obj->get_top_section();
+    my $filename = &util::filename_cat($base_dir, $file);
+    my $assocfilename = "doc.$doc_ext";
+    if ($self->{'keep_original_filename'} == 1) {
+	# this should be the same filename that was used for the Source and SourceFile metadata, 
+	# as we will use SourceFile in the srclink (below)
+	$assocfilename = $doc_obj->get_assocfile_from_sourcefile();
+    }
+
+    $doc_obj->associate_file($filename, $assocfilename, undef, $cursection);
+
+    # We use set instead of add here because we only want one value
+    $doc_obj->set_utf8_metadata_element($cursection, "FileFormat", $file_type);
+    my $srclink_filename = "doc.$doc_ext";
+    if ($self->{'keep_original_filename'} == 1) {
+	$srclink_filename = $doc_obj->get_sourcefile();
+    }
+    # srclink_file is now deprecated because of the "_" in the metadataname. Use srclinkFile
+    $doc_obj->add_utf8_metadata ($cursection, "srcicon",  "_icon".$doc_ext."_"); 
+    $doc_obj->add_utf8_metadata ($cursection, "srclink_file", $srclink_filename);
+    $doc_obj->add_utf8_metadata ($cursection, "srclinkFile", $srclink_filename);
+    return 1;
+}
+
+sub clean_up_after_doc_obj_processing {
+     my $self = shift(@_);
+
+     my $tmp_dir = $self->{'tmp_dir'};
+     if (defined $tmp_dir && -d $tmp_dir) {
+	 ##print STDERR "**** Suppressing clean up of tmp dir\n";
+	 &util::rm_r($tmp_dir);
+	 $self->{'tmp_dir'} = undef;
+     }
+     
+
+}
+1;
+
+
+
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/ConvertToRogPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/ConvertToRogPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/ConvertToRogPlugin.pm	(revision 24799)
@@ -0,0 +1,457 @@
+###########################################################################
+#
+# ConvertToRogPlugin.pm -- plugin that inherits from RogPlugin
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+
+package ConvertToRogPlugin;
+
+use RogPlugin;
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+use util;
+
+sub BEGIN {
+    @ConvertToRogPlugin::ISA = ('RogPlugin');
+}
+
+my $arguments = [
+		 ];
+my $options = { 'name'     => "ConvertToRogPlugin",
+		'desc'     => "{ConvertToRogPlugin.desc}",
+		'abstract' => "yes",
+		'inherits' => "yes" };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new RogPlugin($pluginlist, $inputargs, $hashArgOptLists);
+
+    $self->{'convert_to'} = "Rog";
+    $self->{'convert_to_ext'} = "rog";
+
+    return bless $self, $class;
+}
+
+
+sub begin {
+    my $self = shift (@_);
+    
+    $self->SUPER::begin(@_);
+
+    $self->{'docnum'} = 0;
+}
+
+sub end {
+    my ($self) = @_;
+
+    # nothing to do, but keep symmetric with begin function
+    $self->SUPER::end(@_);
+}
+
+
+# Run conversion utility on the input file.  
+#
+# The conversion takes place in a collection specific 'tmp' directory so 
+# that we don't accidentally damage the input.
+#
+# The desired output type is indicated by $output_ext.  This is usually
+# something like "html" or "word", but can be "best" (or the empty string)
+# to indicate that the conversion utility should do the best it can.
+
+sub tmp_area_convert_file {
+    my $self = shift (@_);
+    my ($output_ext, $input_filename, $textref) = @_;
+
+    my $outhandle = $self->{'outhandle'};
+    my $convert_to = $self->{'convert_to'};
+    my $failhandle = $self->{'failhandle'};
+
+    # softlink to collection tmp dir
+    my $tmp_dirname 
+	= &util::filename_cat($ENV{'GSDLCOLLECTDIR'}, "tmp");
+    &util::mk_dir($tmp_dirname) if (!-e $tmp_dirname);
+
+    # derive tmp filename from input filename
+    my ($tailname, $dirname, $suffix)
+	= &File::Basename::fileparse($input_filename, "\\.[^\\.]+\$");
+
+    # Remove any white space from filename -- no risk of name collision, and
+    # makes later conversion by utils simpler. Leave spaces in path...
+    $tailname =~ s/\s+//g;
+    $tailname = $self->SUPER::filepath_to_utf8($tailname) unless &unicode::check_is_utf8($tailname);
+
+    my $tmp_filename = &util::filename_cat($tmp_dirname, "$tailname$suffix");
+
+    &util::soft_link($input_filename, $tmp_filename);
+
+    my $verbosity = $self->{'verbosity'};
+    if ($verbosity > 0) {
+	print $outhandle "Converting $tailname$suffix to $convert_to format\n";
+    }
+
+    my $errlog = &util::filename_cat($tmp_dirname, "err.log");
+    
+    # Execute the conversion command and get the type of the result,
+    # making sure the converter gives us the appropriate output type
+    my $output_type = lc($convert_to);
+    my $cmd = "\"".&util::get_perl_exec()."\" -S gsMusicConvert.pl -verbose $verbosity -errlog \"$errlog\" -output $output_type \"$tmp_filename\"";
+    $output_type = `$cmd`;
+
+    # remove symbolic link to original file
+    &util::rm($tmp_filename);
+
+    # Check STDERR here
+    chomp $output_type;
+    if ($output_type eq "fail") {
+	print $outhandle "Could not convert $tailname$suffix to $convert_to format\n";
+	print $failhandle "$tailname$suffix: " . ref($self) . " failed to convert to $convert_to\n";
+	$self->{'num_not_processed'} ++;
+	if (-s "$errlog") {
+	    open(ERRLOG, "$errlog");
+	    while (<ERRLOG>) {
+		print $outhandle "$_";
+	    }
+	    print $outhandle "\n";
+	    close ERRLOG;
+	}
+	&util::rm("$errlog") if (-e "$errlog");
+	return "";
+    }
+
+    # store the *actual* output type and return the output filename
+    # it's possible we requested conversion to html, but only to text succeeded
+
+    $self->{'convert_to_ext'} = $output_type;
+    $self->{'converted_to'} = "Rog";
+
+    my $output_filename = $tmp_filename;
+
+    $output_filename =~ s/$suffix$//;
+
+    return $output_filename;
+}
+
+
+# Remove collection specific tmp directory and all its contents.
+
+sub cleanup_tmp_area {
+    my $self = shift (@_);
+
+    my $tmp_dirname 
+	= &util::filename_cat($ENV{'GSDLCOLLECTDIR'}, "tmp");
+    &util::rm_r($tmp_dirname);
+    &util::mk_dir($tmp_dirname);
+}
+
+
+# Exact copy of read_rog_record from RogPlugin 
+# Needed for FILE in right scope
+
+sub read_rog_record
+{
+    my ($self,$file_buffer, $docnum, $seclevel) = @_;
+
+    my $next_line = $file_buffer->{'next_line'};
+
+    return 0 if (!defined $next_line);
+
+    if ($next_line eq "")
+    {
+	my $line;
+	while(defined($line=<FILE>))  
+	{
+	    $line =~ s/\r$//;
+	    $file_buffer->{'line_no'}++;
+	    next if ($line =~ m/^\#/);
+	    $next_line = $line;
+	    last;
+	}
+    }
+	    
+    if ($next_line !~ m/^song( +)\"([^\"]*)\"( +)\"([^\"]*)\"( +)(\d+)( *)$/) 
+    {
+	print STDERR "Error: Malformed Rog file: $next_line";
+	return 0;
+    }
+    else
+    {
+	# init default values
+	$file_buffer->{'song'}->{'tempo'}    = 120;
+	$file_buffer->{'song'}->{'ks_type'}  = 0;
+	$file_buffer->{'song'}->{'ks_num'}   = 0;
+	$file_buffer->{'song'}->{'metadata'} = [];
+	$file_buffer->{'song'}->{'content'}  = "";
+	
+	$file_buffer->{'song'}->{'subcol'} = $2;
+	$file_buffer->{'song'}->{'title'}  = $4;
+	$file_buffer->{'song'}->{'tval'}   = $6;
+
+	chomp($next_line);
+	my $content = $next_line;
+	if (defined $docnum) 
+	{
+	    $content.= " $docnum $seclevel";
+	}
+	$content .= "\n";
+
+	$file_buffer->{'song'}->{'content'} = $content;
+
+
+	my $line;
+	while(defined($line=<FILE>))  
+	{
+	    $line =~ s/\r$//;
+
+	    $file_buffer->{'line_no'}++;
+	    next if ($line =~ m/^\#/);
+	
+	    if ($line =~ m/^song/) 
+	    {	
+		$file_buffer->{'next_line'} = $line;
+		return 1;
+	    }
+	    elsif ($line =~ m/^tempo( +)(\d+)( *)$/) 
+	    {
+		$file_buffer->{'song'}->{'tempo'} = $2;
+		$file_buffer->{'song'}->{'content'} .= $line;
+	    } 
+	    elsif ($line =~ m/^keysig( +)(\d+)( +)(\d+)( *)$/) 
+	    {
+		$file_buffer->{'song'}->{'ks_type'} = $2;
+		$file_buffer->{'song'}->{'ks_num'}  = $4;
+		$file_buffer->{'song'}->{'content'} .= $line;	   
+	    } 
+	    elsif ($line =~ m/^timesig( +)(\d+)( +)(\d+)( *)$/) 
+	    {
+		$file_buffer->{'song'}->{'ts_numer'} = $2;
+		$file_buffer->{'song'}->{'ts_denom'} = $4;
+		$file_buffer->{'song'}->{'content'} .= $line;
+	    }
+	    elsif ($line =~ m/^metadata ([^:]*): (.*)/)
+	    {
+		push(@{$file_buffer->{'song'}->{'metadata'}},[$1,$2]);
+		$file_buffer->{'song'}->{'content'} .= $line;
+	    }
+	    else
+	    {
+		$file_buffer->{'song'}->{'content'} .= $line;
+	    }
+	}
+	
+	$file_buffer->{'next_line'} = undef;
+    }
+
+    return 1;
+}
+
+# Override RogPlugin function so rog files are stored as sections (not docs)
+
+sub process_rog_record
+{
+    my ($self,$doc_obj,$cursection,$song) = @_;
+
+    $cursection = 
+	$doc_obj->insert_section($cursection);
+    $self->{'docnum'}++;
+
+    my $title = $song->{'title'};
+    my $title_safe = $title;
+    $title_safe =~ s/\'/\\\\&apos;/g;
+
+    # add metadata 
+    $doc_obj->add_metadata($cursection, "Tempo",         $song->{'tempo'}); 
+    $doc_obj->add_metadata($cursection, "KeySigType",    $song->{'ks_type'}); 
+    $doc_obj->add_metadata($cursection, "KeySigNum",     $song->{'ks_num'}); 
+    $doc_obj->add_metadata($cursection, "SubCollection", $song->{'subcol'}); 
+    $doc_obj->add_metadata($cursection, "Title",         $title); 
+    $doc_obj->add_metadata($cursection, "TitleSafe",     $title_safe); 
+    $doc_obj->add_metadata($cursection, "TVal",          $song->{'tval'}); 
+
+    foreach my $md ( @{$song->{'metadata'}} )
+    {
+	$doc_obj->add_metadata($cursection, $md->[0], $md->[1]); 
+    }
+
+    # add contents as text
+    $doc_obj->add_text($cursection,$song->{'content'});
+
+    return $cursection;
+}
+
+
+
+# Override BasePlugin read
+# We don't want to get language encoding stuff until after we've converted
+# our file to Rog format
+sub read {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $block_hash, $metadata, $processor, $maxdocs, $total_count, $gli) = @_;
+
+    my $outhandle = $self->{'outhandle'};
+
+    my ($filename_full_path, $filename_no_path) = &util::get_full_filenames($base_dir, $file);
+    return undef unless $self->can_process_this_file($filename_full_path);
+ 
+    $file =~ s/^[\/\\]+//; # $file often begins with / so we'll tidy it up
+
+    # read in file ($text will be in utf8)
+    my $text = "";
+
+    my $output_ext = $self->{'convert_to_ext'};
+    my $conv_filename = $self->tmp_area_convert_file($output_ext, $filename_full_path);
+
+    if ("$conv_filename" eq "") {return 0;} # allows continue on errors
+    $self->{'conv_filename'} = $conv_filename;
+
+
+    # create a new document
+    #my $doc_obj = new doc ($conv_filename, "indexed_doc");
+    # the original filename is used now
+    my $doc_obj = new doc ($filename_full_path, "indexed_doc", $self->{'file_rename_method'});
+    # the converted filename is set separately
+    $doc_obj->set_converted_filename($conv_filename);
+
+    my $topsection = $doc_obj->get_top_section();
+    my $cursection = $topsection;
+
+    $self->{'docnum'}++;
+    my $docnum = $self->{'docnum'};
+
+    my ($filemeta) = $file =~ /([^\\\/]+)$/;
+	my $plugin_filename_encoding = $self->{'filename_encoding'};
+    my $filename_encoding = $self->deduce_filename_encoding($file,$metadata,$plugin_filename_encoding);
+    $self->set_Source_metadata($doc_obj, $conv_filename, $filename_encoding);
+    
+    if ($self->{'cover_image'}) {
+	$self->associate_cover_image($doc_obj, $filename_full_path);
+    }
+    $doc_obj->add_utf8_metadata($doc_obj->get_top_section(), "Plugin", "$self->{'plugin_type'}");
+    $doc_obj->add_utf8_metadata($doc_obj->get_top_section(), "FileSize", (-s $filename_full_path));
+
+    my $track_no = "1";
+    my $rog_filename = "$conv_filename$track_no.$output_ext";
+    while (1)
+    {
+	last unless open (FILE, $rog_filename) ;
+
+	my $file_buffer = { line_no => 0, next_line => "", song => {} };
+	
+	while ($self->read_rog_record($file_buffer, $docnum, $track_no))
+	{
+	    my $song = $file_buffer->{'song'};
+	    my $content = $song->{'content'};
+	    $content =~ s/^song\w+(.*)$/song $1 X.$track_no/;
+	    
+	    $cursection 
+		= $self->process_rog_record($doc_obj,$cursection,
+					    $file_buffer->{'song'});
+	}
+
+	close FILE;
+
+	$track_no++;
+	$rog_filename = "$conv_filename$track_no.$output_ext";
+    }
+
+    print STDERR "\n";
+
+    # include any metadata passed in from previous plugins 
+    # note that this metadata is associated with the top level section
+    $self->extra_metadata ($doc_obj, $doc_obj->get_top_section(), $metadata);
+    # do plugin specific processing of doc_obj
+    unless (defined ($self->process(\$text, $pluginfo, $base_dir, $file, $metadata, $doc_obj))) {
+	print STDERR "<ProcessingError n='$file'>\n" if ($gli);
+	return -1;
+    }
+    # do any automatic metadata extraction
+    $self->auto_extract_metadata ($doc_obj);
+    # add an OID
+    $self->add_OID($doc_obj);
+
+    my $oid = $doc_obj->get_OID();
+    my $appletlink = "<a href=\"javascript:meldexout(\'$oid\','[TitleSafe]')\">";
+
+    $doc_obj->add_utf8_metadata ($topsection, "audiolink",  $appletlink); 
+    $doc_obj->add_utf8_metadata ($topsection, "audioicon",  "_iconaudio_"); 
+    $doc_obj->add_utf8_metadata ($topsection, "/audiolink", "</a>"); 
+
+    # if no title metadata defined, set it to filename minus extension
+    my $existing_title = $doc_obj->get_metadata_element($topsection,"Title");
+    if (!defined $existing_title) 
+    {
+	my $title = $doc_obj->get_metadata_element($topsection,"Source");
+	$title =~ s/\..*?$//g;
+	$doc_obj->add_utf8_metadata ($topsection, "Title", $title); 
+
+	my $title_safe = $title;
+	$title_safe =~ s/\'/\\\\&apos;/g;
+	$doc_obj->add_utf8_metadata ($topsection, "TitleSafe", $title_safe); 
+    }
+
+    # process the document
+    $processor->process($doc_obj);
+    $self->cleanup_tmp_area();
+
+    $self->{'num_processed'} ++;
+
+    return 1;
+}
+
+
+# do plugin specific processing of doc_obj for HTML type
+sub process_type {
+    my $self = shift (@_);
+    my ($doc_ext, $textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj) = @_;
+    
+    my $conv_filename = $self->{'conv_filename'};
+    my $tmp_dirname = File::Basename::dirname($conv_filename);
+    my $tmp_tailname = File::Basename::basename($conv_filename);
+    
+    my $converted_to = $self->{'converted_to'};
+    my $ret_val = 1;    
+
+#   $ret_val = &RogPlugin::process($self, $textref, $pluginfo,
+#				 $tmp_dirname, $tmp_tailname,
+#				 $metadata, $doc_obj);
+
+    # associate original file with doc object
+    my $cursection = $doc_obj->get_top_section();
+    my $filename = &util::filename_cat($base_dir, $file);
+    $doc_obj->associate_file($filename, "doc.$doc_ext", undef, $cursection);
+
+    # srclink_file is now deprecated because of the "_" in the metadataname. Use srclinkFile
+    $doc_obj->add_metadata ($cursection, "srclink_file", "doc.$doc_ext"); 
+    $doc_obj->add_metadata ($cursection, "srclinkFile", "doc.$doc_ext"); 
+    $doc_obj->add_utf8_metadata ($cursection, "srcicon",  "_icon".$doc_ext."_"); 
+
+    return $ret_val;
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/DSpacePlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/DSpacePlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/DSpacePlugin.pm	(revision 24799)
@@ -0,0 +1,427 @@
+
+###########################################################################
+#
+# DSpacePlugin.pm -- plugin for importing a collection from DSpace 
+# 
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2004 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+
+# This plugin takes "contents" and dublin_core.xml file, which contain 
+# Metadata and lists of associated files for a particular document
+# and produces a document containing sections, one for each page.
+# The files should be named "contents" and "dublin_core.xml".  For each of 
+# document in DSpace, it is stored in one directory
+#
+# The format of the "contents" file is as follows:
+# 
+# File.type      bundle:ORIGINAL
+# license.txt    bundle:LICENSE
+# The format of the "dublin_core.xml" file is as follows:
+# The first line contains any metadata for the whole document
+# <dublin_core>
+# eg.
+# <dcvalue element="Title" qualifier="">Snail farming</dcvalue>
+# <dcvalue element="date" qualifier="">2004-10-15</dcvalue>
+#
+
+package DSpacePlugin;
+
+use ReadTextFile;
+use plugin;
+use XMLParser;
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+sub BEGIN {
+    @DSpacePlugin::ISA = ('ReadTextFile');
+}
+
+my $arguments =
+    [ { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "string",
+	'deft' => &get_default_process_exp(),
+	'reqd' => "no" },
+      { 'name' => "only_first_doc",
+	'desc' => "{DSpacePlugin.only_first_doc}",
+	'type' => "flag",
+	'reqd' => "no" },
+      { 'name' => "first_inorder_ext",
+	'desc' => "{DSpacePlugin.first_inorder_ext}",
+	'type' => "string",
+	'reqd' => "no" },
+      { 'name' => "first_inorder_mime",
+	'desc' => "{DSpacePlugin.first_inorder_mime}",
+	'type' => "flag",
+	'reqd' => "no" },
+      { 'name' => "block_exp",
+	'desc' => "{BasePlugin.block_exp}",
+	'type' => "regexp",
+	'deft' => &get_default_block_exp(),
+	'reqd' => "no" }];
+
+
+my $options = { 'name'     => "DSpacePlugin",
+		'desc'     => "{DSpacePlugin.desc}",
+		'inherits' => "yes",
+		'abstract' => "no",
+		'args'     => $arguments };
+
+
+my $primary_doc_lookup = { 'text/html' => '(?i)\.(gif|jpe?g|jpe|jpg|png|css)$' };
+
+# Important variation to regular plugin structure.  Need to declare
+# $self as global variable to file so XMLParser callback routines
+# can access the content of the object. 
+my ($self); 
+
+sub new {
+    my ($class) = shift (@_); 
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    $self = new ReadTextFile($pluginlist, $inputargs, $hashArgOptLists);
+    
+    if ($self->{'info_only'}) {
+	# don't worry about creating the XML parser as all we want is the 
+	# list of plugin options
+	return bless $self, $class;
+    }
+
+    #create XML::Parser object for parsing dublin_core.xml files
+    my $parser = new XML::Parser('Style' => 'Stream',
+				 'Handlers' => {'Char' => \&Char,
+						'Doctype' => \&Doctype
+						});
+    $self->{'parser'} = $parser;
+    $self->{'extra_blocks'} = {};
+
+    return bless $self, $class;
+}
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+    return q^(?i)(contents)$^;
+}
+
+# want to block all files except the "contents"
+sub get_default_block_exp {
+    my $self = shift (@_);
+    
+    # Block handle and txt files if present. Specifically don't block dublin_core xml
+    return q^(?i)(handle|\.tx?t)$^;
+}
+
+sub store_block_files_BACKUP
+{
+    # Option of making blocking sensitive to files that are in directory
+    # This subroutine is not currently used! (relies on default block expression stopping all handle and .txt files)
+
+    my $self =shift (@_);
+    my ($filename_full_path, $block_hash) = @_;
+
+    my ($tailname, $contents_basedir, $suffix) = &File::Basename::fileparse($filename_full_path, "\\.[^\\.]+\$");
+    my $handle_filename = &util::filename_cat($contents_basedir,"handle");
+
+    if (&util::fd_exists($handle_filename)) {
+	&util::block_filename($block_hash,$handle_filename);
+    }
+}
+
+sub read_content
+{
+    my $self = shift (@_);
+    my ($dir, $only_first_doc, $first_inorder_ext, $first_inorder_mime, $mimetype_list) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    my @fnamemime_list = ();
+    my @assocmime_list = ();
+
+    my $content_fname = &util::filename_cat($dir,"contents");
+
+    open(CIN,"<$content_fname") 
+	|| die "Unable to open $content_fname: $!\n";
+    
+    my $line;
+    my $pos = 0;
+
+    while (defined ($line = <CIN>)) {
+	if ($line =~ m/^(.*)\s+bundle:ORIGINAL\s*$/) {
+	    my $fname = $1;
+	    my $mtype = $mimetype_list->[$pos];
+	    my $fm_rec = { 'file' => $fname, 'mimetype' => $mtype};
+	    push(@fnamemime_list,$fm_rec);
+	    $pos++;
+	}
+    }
+    close CIN;
+
+    if ($only_first_doc){
+	my ($first_fname, @rest_fnames) = @fnamemime_list;
+	@fnamemime_list = ($first_fname);
+	@assocmime_list = @rest_fnames;
+    }
+
+    # allow user to specify the types of files (inorder)they would like to assign as
+    # a primary bitstream
+    if ($first_inorder_ext) {
+	# parse user-define file extension names
+	my @extfiles_list = split /,/, $first_inorder_ext;
+	my (@rest_fnames) = @fnamemime_list;
+	my @matched_list = ();
+	foreach my $file_ext (@extfiles_list) {
+	    $pos = 0;
+	    foreach my $allfiles (@fnamemime_list){
+		$allfiles->{'file'} =~ /^(.*)\.(.*?)$/;
+		my $allfiles_ext = $2;
+
+		if ($allfiles_ext =~ /$file_ext/) {
+		    print $outhandle "Existing file:$allfiles->{'file'} match the user-define File Extension:$file_ext\n";
+		    push (@matched_list, $allfiles);
+
+		    # delete the matched extension file from the array
+		    splice(@rest_fnames,$pos,1);
+
+		    return (\@matched_list, \@rest_fnames);
+
+		}
+		$pos++;
+	    }
+	}
+    }
+    
+    if ($first_inorder_mime) {
+	# parse user-define file mimetype
+	my @file_mime_list = split /,/, $first_inorder_mime;
+	my (@rest_fnames) = @fnamemime_list;
+	my @matched_list = ();
+	foreach my $file_mime (@file_mime_list) {
+	    $pos = 0;
+	    foreach my $allfiles (@fnamemime_list){
+		my $allfiles_mime = $allfiles->{'mimetype'};
+
+		if ($allfiles_mime =~ /$file_mime/) {
+		    print $outhandle "Existing file:$allfiles->{'file'} match the user-defined File MimeType:$file_mime\n";
+		    push (@matched_list, $allfiles);
+
+		    # delete the matched MIMEType file from the array
+		    splice(@rest_fnames,$pos,1);
+		    return (\@matched_list, \@rest_fnames);
+		}
+		$pos++;
+	    }
+	}
+    }
+    return (\@fnamemime_list, \@assocmime_list);
+}
+
+
+sub filemime_list_to_re
+{
+    my $self = shift (@_);
+    my ($fnamemime_list) = @_;
+
+    my @fname_list = map { "(".$_->{'file'}.")" } @$fnamemime_list;
+    my $fname_re = join("|",@fname_list);
+    $fname_re =~ s/\./\\\./g;
+
+    return $fname_re;
+}
+
+# Read dublin_core metadata from DSpace collection 
+sub metadata_read {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $block_hash, 
+	$extrametakeys, $extrametadata, $extrametafile,
+	$processor, $gli, $aux) = @_;
+
+    my $only_first_doc = $self->{'only_first_doc'};
+    my $first_inorder_ext = $self->{'first_inorder_ext'};
+    my $first_inorder_mime = $self->{'first_inorder_mime'};
+    
+    my $outhandle = $self->{'outhandle'};
+    
+    my $filename = &util::filename_cat($base_dir, $file);
+    # return 0 if $self->{'block_exp'} ne "" && $filename =~ /$self->{'block_exp'}/;
+    
+    if ($filename !~ /dublin_core\.xml$/ || !-f $filename) {
+	return undef;
+    }
+    
+    print $outhandle "DSpacePlugin: extracting metadata from $file\n"
+	if $self->{'verbosity'} > 1;
+    
+    my ($dir) = $filename =~ /^(.*?)[^\/\\]*$/;
+
+    eval {
+	$self->{'parser'}->parsefile($filename);
+    };
+    
+    if ($@) {
+	die "DSpacePlugin: ERROR $filename is not a well formed dublin_core.xml file ($@)\n";
+    }
+
+    my $mimetype_list = $self->{'saved_metadata'}->{'ex.dc.Format^mimetype'};
+    my ($doc_file_mimes, $assoc_file_mimes) = $self->read_content($dir, $only_first_doc, $first_inorder_ext, 
+								  $first_inorder_mime, $mimetype_list);
+
+    my $file_re = $self->filemime_list_to_re($doc_file_mimes);
+
+    if ($only_first_doc || $first_inorder_ext || $first_inorder_mime) {	
+	foreach my $afm ( @$assoc_file_mimes ) {
+ 	    my $full_af = &util::filename_cat($dir,$afm->{'file'});
+	    $self->{'extra_blocks'}->{$full_af} = 1;
+	}
+    }
+    push(@$extrametakeys,$file_re);
+
+    # See Format's Extent section in http://dublincore.org/documents/usageguide/qualifiers.shtml
+    # it could specify duration, size or even dimensions of the resource. It may be a useful piece
+    # of metadata to preserve after all.
+    #if (defined $self->{'saved_metadata'}->{'ex.dc.Format^extent'}) {
+	#delete $self->{'saved_metadata'}->{'ex.dc.Format^extent'};
+    #}
+
+    if (defined $mimetype_list) {
+	delete $self->{'saved_metadata'}->{'ex.dc.Format^mimetype'};
+
+	# Temporarily store associate file info in metadata table
+	# This will be removed in 'extra_metadata' in BasePlugin and used
+	# to perform the actual file association (once the doc obj has
+	# been formed
+
+	my $main_doc = $doc_file_mimes->[0];
+	my $md_mimetype = $main_doc->{'mimetype'};
+
+	my $pd_lookup = $primary_doc_lookup->{$md_mimetype};
+
+	if (defined $pd_lookup) {
+	    my $filter_re = $pd_lookup;
+	    @$assoc_file_mimes = grep { $_->{'file'} !~ m/$filter_re/ }  @$assoc_file_mimes;
+	}
+
+	my @gsdlassocfile_tobe 
+	    = map { &util::filename_cat($dir,$_->{'file'}) .":".$_->{'mimetype'}.":" } @$assoc_file_mimes if @$assoc_file_mimes;
+	$self->{'saved_metadata'}->{'gsdlassocfile_tobe'} = \@gsdlassocfile_tobe;
+
+    }
+    
+    $extrametadata->{$file_re} = $self->{'saved_metadata'};
+
+    return 1;
+}
+
+
+# The DSpacePlugin read() function. We are not actually reading any documents 
+# here, just blocking ones that have been processed by metadata read.
+#
+# Returns 0 for a file its blocking, undef for any other
+sub read {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $block_hash, $metadata, $processor, $maxdocs, $total_count, $gli) = @_;
+    my $outhandle = $self->{'outhandle'};
+    
+    # Block all files except contents
+    my $filename = &util::filename_cat($base_dir, $file);
+    return 0 if $self->{'block_exp'} ne "" && $filename =~ /$self->{'block_exp'}/;
+
+    my $assocfile = $metadata->{'assocfile'};
+
+    return 0 if (($filename =~ /dublin_core\.xml$/) || ($filename =~ /contents$/));
+    return 0 if (defined $self->{'extra_blocks'}->{$filename});
+    return undef;
+}
+
+sub Doctype {
+    my ($expat, $name, $sysid, $pubid, $internal) = @_;
+
+    die if ($name !~ /^dublin_core$/);
+}
+
+sub StartTag {
+    my ($expat, $element) = @_;
+    if ($element eq "dublin_core") {
+	$self->{'saved_metadata'} = {};
+    } elsif ($element eq "dcvalue") {
+	my $metaname = $_{'element'};
+	my $qualifier = $_{'qualifier'}||"";
+	if ($metaname ne "description" || $qualifier ne "provenance") {
+	    $metaname .= "^$qualifier" if ($qualifier ne "none" && $qualifier ne "");
+	    $self->{'metaname'} = "ex.dc.\u$metaname";
+	}
+    }
+}
+
+sub EndTag {
+    my ($expat, $element) = @_;
+    
+    if ($element eq "dcvalue") {
+	$self->{'metaname'} = "";
+    }
+}
+
+sub Text {
+    if (defined ($self->{'metaname'}) && $self->{'metaname'} ne "") {
+	# $_ == Metadata content
+	my $mname = $self->{'metaname'};
+	my $mvalue = prepareMetadataValue($_);
+	if (defined $self->{'saved_metadata'}->{$mname}) {
+	    # accumulate - add value to existing value(s)
+	    if (ref ($self->{'saved_metadata'}->{$mname}) eq "ARRAY") {
+		push (@{$self->{'saved_metadata'}->{$mname}}, $mvalue);
+	    } else {
+		$self->{'saved_metadata'}->{$mname} = 
+		    [$self->{'saved_metadata'}->{$mname}, $mvalue];
+	    }
+	} else {
+	    # accumulate - add value into (currently empty) array
+	    $self->{'saved_metadata'}->{$mname} = [$mvalue];
+	}
+
+    }
+}
+
+# Prepare DSpace metadata for using with Greenstone.
+# Some value must be escaped.
+sub prepareMetadataValue {
+	my ($value) = @_;
+	
+	$value =~ s/\[/&#091;/g;
+	$value =~ s/\]/&#093;/g;
+	
+	return $value;
+ }
+# This Char function overrides the one in XML::Parser::Stream to overcome a
+# problem where $expat->{Text} is treated as the return value, slowing
+# things down significantly in some cases.
+sub Char {
+    use bytes;  # Necessary to prevent encoding issues with XML::Parser 2.31+
+    $_[0]->{'Text'} .= $_[1];
+    return undef;
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/DatabasePlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/DatabasePlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/DatabasePlugin.pm	(revision 24799)
@@ -0,0 +1,379 @@
+###########################################################################
+#
+# DatabasePlugin.pm -- plugin to import records from a database
+# 
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2003 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# A plugin that imports records from a database. This uses perl's DBI module, 
+# which includes back-ends for mysql, postgresql, comma separated values (CSV),
+# MS Excel, ODBC, sybase, etc... Extra modules may need to be installed to 
+# use this. See <GSDLHOME>/etc/packages/example.dbi for an example config file.
+#
+
+# Written by John McPherson for the NZDL project
+# Mar, Apr 2003
+
+package DatabasePlugin;
+
+use strict;
+no strict 'refs'; # allow variable as a filehandle
+
+use AutoExtractMetadata;
+use MetadataRead;
+use unicode;
+
+sub BEGIN {
+    @DatabasePlugin::ISA = ('MetadataRead', 'AutoExtractMetadata');
+}
+
+my $arguments =
+    [ { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'deft' => &get_default_process_exp(),
+	'reqd' => "no" }];
+
+my $options = { 'name'     => "DatabasePlugin",
+		'desc'     => "{DatabasePlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new AutoExtractMetadata($pluginlist, $inputargs, $hashArgOptLists);
+
+    return bless $self, $class;
+}
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+    return q^(?i)\.dbi$^;
+}
+
+sub read {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $block_hash, $metadata, $processor, $maxdocs,$total_count,$gli) = @_;
+        
+     #see if we can handle the passed file...
+    my ($filename_full_path, $filename_no_path) = &util::get_full_filenames($base_dir, $file);
+    return undef unless $self->can_process_this_file($filename_full_path);
+    
+    my $outhandle = $self->{'outhandle'};
+    my $verbosity = $self->{'verbosity'};
+
+    print STDERR "<Processing n='$file' p='DatabasePlugin'>\n" if ($gli);
+    print $outhandle "DatabasePlugin: processing $file\n" 
+	if $self->{'verbosity'} > 1;
+   
+    require DBI; # database independent stuff
+
+    # calculate the document hash, for document ids
+    my $hash="0";
+
+   
+    # default options - may be overridden by config file
+    my $language=undef;
+    my $encoding=undef;
+    my $dbplug_debug=0;
+    my $username='';
+    my $password='';
+
+    # these settings must be set by the config file:
+    my $db=undef;
+
+    # get id of pages from "nonempty", get latest version number from 
+    # "recent", and then get pagename from "page" and content from "version" !
+
+    my $sql_query_prime = undef ;
+    my $sql_query = undef ;
+
+    my %db_to_greenstone_fields=();
+    my %callbacks=();
+
+
+    # read in config file.
+    if (!open (CONF, $filename_full_path)) {
+	    print $outhandle "DatabasePlugin: can't read $filename_full_path: $!\n";
+	    return 0;
+    } 
+   
+    my $line;
+    my $statement="";
+    my $callback="";
+    while (defined($line=<CONF>)) {
+	chomp $line;
+	$line .= " "; # for multi-line statements - don't conjoin!
+	$line =~ s/\s*\#.*$//mg; # remove comments
+	$statement .= $line;
+
+	if ($line =~ /^\}\s*$/ && $callback) { # ends the callback
+	    $callback .= $statement ; $statement = "";
+	    # try to check that the function is "safe"
+	    if ($callback  =~ /\b(?:system|open|pipe|readpipe|qx|kill|eval|do|use|require|exec|fork)\b/ ||
+		$callback =~ /[\`]|\|\-/) {
+		# no backticks or functions that start new processes allowed
+		print $outhandle "DatabasePlugin: bad function in callback\n";
+		return 0;
+	    }
+	    $callback =~ s/sub (\w+?)_callback/sub/;
+	    my $fieldname = $1;
+	    my $ret = eval "\$callbacks{'$fieldname'} = $callback ; 1";
+	    if (!defined($ret)) {
+		print $outhandle "DatabasePlugin: error eval'ing callback: $@\n";
+		exit(1);
+	    }
+	    $callback="";
+	    print $outhandle "DatabasePlugin: callback registered for '$fieldname'\n"
+	        if $dbplug_debug;
+	} elsif ($callback) {
+	    # add this line to the callback function
+	    $callback .= $statement;
+	    $statement = "";
+	} elsif ($statement =~ m/;\s*$/) { # ends with ";"
+	    # check that it is safe
+	    # assignment
+	    if ($statement =~ m~(\$\w+)\s* = \s*
+		(\d		# digits
+		 | ".*?(?<!\\)" # " up to the next " not preceded by a \
+		 | '.*?(?<!\\)' # ' up to the next ' not preceded by a \
+		)\s*;~x ||      # /x means ignore comments and whitespace in rx
+		$statement =~ m~(\%\w+)\s*=\s*(\([\w\s\"\',:=>]+\))\s*;~ ) {   
+		# evaluate the assignment, return 1 on success "
+		if (!eval "$1=$2; 1") {
+		    my $err=$@;
+		    chomp $err;
+		    $err =~ s/\.$//; # remove a trailing .
+		    print $outhandle "DatabasePlugin: error evaluating `$statement'\n";
+		    print $outhandle " $err (in $filename_full_path)\n";
+		    return 0; # there was an error reading the config file
+		}
+	    } elsif ($statement =~ /sub \w+_callback/) {
+		# this is the start of a callback function definition
+		$callback = $statement;
+		$statement = "";
+	    } else {
+		print $outhandle "DatabasePlugin: skipping statement `$statement'\n";
+	    }
+	    $statement = "";
+	}
+    }
+    close CONF;
+
+    
+    if (!defined($db)) {
+	print $outhandle "DatabasePlugin: error: $filename_full_path does not specify a db!\n";
+	return 0;
+    }
+    if (!defined($sql_query)) {
+    	print $outhandle "DatabasePlugin: error: no SQL query specified!\n";
+	return 0;
+    }
+    # connect to database
+    my $dbhandle=DBI->connect($db, $username, $password);
+
+    if (!defined($dbhandle)) {
+	die "DatabasePlugin: could not connect to database, exiting.\n";
+    }
+    if (defined($dbplug_debug) && $dbplug_debug==1) {
+	print $outhandle "DatabasePlugin (debug): connected ok\n";
+    }
+
+    my $statement_hand;
+
+    # The user gave 2 sql statements to execute?
+    if ($sql_query_prime) {
+	    $statement_hand=$dbhandle->prepare($sql_query_prime);
+	    $statement_hand->execute;
+	    if ($statement_hand->err) {
+		    print $outhandle "Error: " . $statement_hand->errstr . "\n";
+		    return undef;
+	    }
+    }
+
+  
+    $statement_hand=$dbhandle->prepare($sql_query);
+    $statement_hand->execute;
+    if ($statement_hand->err) {
+    	print $outhandle "Error:" . $statement_hand->errstr . "\n";
+	return undef;
+    }
+
+    # get the array-ref for the field names and cast it to array
+    my @field_names;
+    @field_names=@{ $statement_hand->{NAME} };
+
+    foreach my $fieldname (@field_names) {
+	if (defined($db_to_greenstone_fields{$fieldname})) {
+	    if (defined($dbplug_debug) && $dbplug_debug==1) {
+		print $outhandle "DatabasePlugin (debug): mapping db field "
+		    . "'$fieldname' to "
+			. $db_to_greenstone_fields{$fieldname} . "\n";
+	    }
+	    $fieldname=$db_to_greenstone_fields{$fieldname};
+	}
+    }
+
+    # get rows
+
+    my $count = 0;
+    my @row_array;
+
+    @row_array=$statement_hand->fetchrow_array; # fetchrow_hashref?
+
+    my $base_oid = undef;
+    while (scalar(@row_array)) {
+	if (defined($dbplug_debug) && $dbplug_debug==1) {
+	    print $outhandle "DatabasePlugin (debug): retrieved a row from query\n";
+	}
+
+	# create a new document
+	my $doc_obj = new doc ($filename_full_path, "indexed_doc", $self->{'file_rename_method'});
+
+	my $cursection = $doc_obj->get_top_section();
+
+	# if $language not set in config file, will use BasePlugin's default
+	if (defined($language)) {
+	    $doc_obj->add_utf8_metadata($cursection, "Language", $language);
+	}
+	# if $encoding not set in config file, will use BasePlugin's default
+	if (defined($encoding)) {
+	    # allow some common aliases
+	    if ($encoding =~ m/^utf[-_]8$/i) {$encoding="utf8"}
+	    $encoding =~ s/-/_/g; # greenstone uses eg iso_8859_1
+	    $doc_obj->add_utf8_metadata($cursection, "Encoding", $encoding);
+	}
+
+	my $plugin_filename_encoding = $self->{'filename_encoding'};
+	my $filename_encoding = $self->deduce_filename_encoding($file,$metadata,$plugin_filename_encoding);
+	$self->set_Source_metadata($doc_obj, $filename_full_path, $filename_encoding);
+
+	if ($self->{'cover_image'}) {
+	    $self->associate_cover_image($doc_obj, $filename_full_path);
+	}
+	$doc_obj->add_utf8_metadata($doc_obj->get_top_section(), "Plugin", "$self->{'plugin_type'}");
+
+	$doc_obj->add_metadata($doc_obj->get_top_section(), "FileFormat", "DB");
+
+	# include any metadata passed in from previous plugins 
+	# note that this metadata is associated with the top level section
+	$self->extra_metadata ($doc_obj, $cursection,
+			       $metadata);
+
+	# do any automatic metadata extraction
+	$self->auto_extract_metadata ($doc_obj);
+
+	my $unique_id=undef;
+
+	foreach my $fieldname (@field_names) {
+	    my $fielddata=shift @row_array;
+
+	    if (! defined($fielddata) ) {
+	    	next; # this field was "" or NULL
+	    }
+	    # use the specified encoding, defaulting to utf-8
+	    if (defined($encoding) && $encoding ne "ascii"
+	    	&& $encoding ne "utf8") {
+	      $fielddata=&unicode::unicode2utf8(
+	      	&unicode::convert2unicode($encoding, \$fielddata)
+					       );
+	    }
+	    # see if we have a ****_callback() function defined
+	    if (exists $callbacks{$fieldname}) {
+		my $funcptr = $callbacks{$fieldname};
+		$fielddata = &$funcptr($fielddata);
+	    }
+
+	    if ($fieldname eq "text") {
+		# add as document text
+		$fielddata=~s@<@&lt;@g;
+		$fielddata=~s@>@&gt;@g; # for xml protection...
+		$fielddata=~s@_@\\_@g; # for macro language protection...
+		$doc_obj->add_utf8_text($cursection, $fielddata);
+	    } elsif ($fieldname eq "Identifier") {
+		# use as greenstone's unique record id
+		if ($fielddata =~ /^\d+$/) {
+		    # don't allow IDs that are completely numeric
+		    $unique_id="id" . $fielddata;
+		} else {
+		    $unique_id=$fielddata;
+		}
+	    } else {
+		# add as document metadata
+		$fielddata=~s/\[/&#91;/g;
+		$fielddata=~s/\]/&#93;/g;
+		$doc_obj->add_utf8_metadata($cursection,
+					    $fieldname, $fielddata);
+
+	    }
+	}
+
+
+	if (!defined $unique_id) {
+	    if (!defined $base_oid) {
+		$self->add_OID($doc_obj);
+		$base_oid = $doc_obj->get_OID(); 
+	    }
+	    $doc_obj->set_OID($base_oid."s$count");
+	} else {
+	    # use our id from the database...
+	    $doc_obj->set_OID($unique_id);
+	}
+
+
+        # process the document
+	$processor->process($doc_obj);
+
+	$count++;
+
+	# get next row
+	@row_array=$statement_hand->fetchrow_array; # fetchrow_hashref?
+    } # end of row_array is not empty
+
+    # check "$sth->err" if empty array for error
+    if ($statement_hand->err) {
+	print $outhandle "DatabasePlugin: received error: \"" .
+	    $statement_hand->errstr . "\"\n";
+    }
+
+    # clean up connection to database
+    $statement_hand->finish();
+    $dbhandle->disconnect();
+
+    # num of input files, rather than documents created?
+    $self->{'num_processed'}++;
+
+    if (defined($dbplug_debug) && $dbplug_debug==1) {
+        print $outhandle "DatabasePlugin: imported $count DB records as documents.\n";
+    }
+    $count;
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/DateExtractor.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/DateExtractor.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/DateExtractor.pm	(revision 24799)
@@ -0,0 +1,104 @@
+###########################################################################
+#
+# DateExtractor - helper plugin that extracts historical dates from text
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2008 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package DateExtractor;
+
+use DateExtract;
+use PrintInfo;
+use strict;
+
+BEGIN {
+    @DateExtractor::ISA = ('PrintInfo');
+}
+
+my $arguments = [
+      { 'name' => "extract_historical_years",
+	'desc' => "{DateExtractor.extract_historical_years}",
+	'type' => "flag",
+	'reqd' => "no" },
+      { 'name' => "maximum_year",
+	'desc' => "{DateExtractor.maximum_year}",
+	'type' => "int",
+	'deft' => (localtime)[5]+1900,
+	'char_length' => "4",
+	#'range' => "2,100",
+	'reqd' => "no"},
+      { 'name' => "maximum_century",
+	'desc' => "{DateExtractor.maximum_century}",
+	'type' => "string",
+	'deft' => "-1",
+	'reqd' => "no" },
+      { 'name' => "no_bibliography",
+	'desc' => "{DateExtractor.no_bibliography}",
+	'type' => "flag",
+	'reqd' => "no"},
+		 ];
+
+my $options = { 'name'     => "DateExtractor",
+		'desc'     => "{DateExtractor.desc}",
+		'abstract' => "yes",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new PrintInfo($pluginlist, $inputargs, $hashArgOptLists, 1);
+
+    return bless $self, $class;
+
+}
+
+
+# extract metadata
+sub extract_date_metadata {
+
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+    
+    if($self->{'extract_historical_years'}) {
+	my $thissection = $doc_obj->get_top_section();
+	while (defined $thissection) {
+
+	    my $text = $doc_obj->get_text($thissection);
+	    &DateExtract::get_date_metadata($text, $doc_obj, 
+					    $thissection, 
+					    $self->{'no_bibliography'}, 
+					    $self->{'maximum_year'}, 
+					    $self->{'maximum_century'});
+	    $thissection = $doc_obj->get_next_section ($thissection);
+	}
+    }
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/DirectoryPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/DirectoryPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/DirectoryPlugin.pm	(revision 24799)
@@ -0,0 +1,706 @@
+###########################################################################
+#
+# DirectoryPlugin.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# DirectoryPlugin is a plugin which recurses through directories processing
+# each file it finds - which basically means passing it down the plugin 
+# pipeline
+
+package DirectoryPlugin;
+
+use PrintInfo;
+use plugin;
+use util;
+use metadatautil;
+
+use File::Basename;
+use strict;
+no strict 'refs';
+no strict 'subs';
+
+use Encode;
+
+BEGIN {
+    @DirectoryPlugin::ISA = ('PrintInfo');
+}
+
+my $arguments =
+    [ { 'name' => "block_exp",
+	'desc' => "{BasePlugin.block_exp}",
+	'type' => "regexp",
+	'deft' => &get_default_block_exp(),
+	'reqd' => "no" },
+      # this option has been deprecated. leave it here for now so we can warn people not to use it
+      { 'name' => "use_metadata_files",
+	'desc' => "{DirectoryPlugin.use_metadata_files}",
+	'type' => "flag",
+	'reqd' => "no",
+	'hiddengli' => "yes" },
+      { 'name' => "recheck_directories",
+	'desc' => "{DirectoryPlugin.recheck_directories}",
+	'type' => "flag",
+	'reqd' => "no" } ];
+    
+my $options = { 'name'     => "DirectoryPlugin",
+		'desc'     => "{DirectoryPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new PrintInfo($pluginlist, $inputargs, $hashArgOptLists);
+    
+    if ($self->{'info_only'}) {
+	# don't worry about any options or initialisations etc
+	return bless $self, $class;
+    }
+
+    # we have left this option in so we can warn people who are still using it
+    if ($self->{'use_metadata_files'}) {
+	die "ERROR: DirectoryPlugin -use_metadata_files option has been deprecated. Please remove the option and add MetadataXMLPlug to your plugin list instead!\n";
+    }
+	
+    $self->{'num_processed'} = 0;
+    $self->{'num_not_processed'} = 0;
+    $self->{'num_blocked'} = 0;
+    $self->{'num_archives'} = 0;
+
+    $self->{'subdir_extrametakeys'} = {};
+
+    return bless $self, $class;
+}
+
+# called once, at the start of processing
+sub init {
+    my $self = shift (@_);
+    my ($verbosity, $outhandle, $failhandle) = @_;
+
+    # verbosity is passed through from the processor
+    $self->{'verbosity'} = $verbosity;
+
+    # as are the outhandle and failhandle
+    $self->{'outhandle'} = $outhandle if defined $outhandle;
+    $self->{'failhandle'} = $failhandle;
+
+}
+
+# called once, after all passes have finished
+sub deinit {
+    my ($self) = @_;
+
+}
+
+# called at the beginning of each plugin pass (import has one, building has many)
+sub begin {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $processor, $maxdocs) = @_;
+
+    # Only lookup timestamp info for import.pl, and only if incremental is set
+    my $proc_package_name = ref $processor;
+    if ($proc_package_name !~ /buildproc$/ && $self->{'incremental'} == 1) {
+        # Get the infodbtype value for this collection from the arcinfo object
+        my $infodbtype = $processor->getoutputinfo()->{'infodbtype'};
+	$infodbtype = "gdbm" if $infodbtype eq "gdbm-txtgz"; # in archives, cannot use txtgz version
+	my $output_dir = $processor->getoutputdir();
+    	my $archives_inf = &dbutil::get_infodb_file_path($infodbtype, "archiveinf-doc", $output_dir);
+
+	if ( -e $archives_inf ) {
+	    $self->{'inf_timestamp'} = -M $archives_inf;
+	}
+    }
+}
+
+sub remove_all {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $processor, $maxdocs) = @_;
+
+}
+
+
+sub remove_one {
+    my $self = shift (@_);
+    my ($file, $oids, $archivedir) = @_;
+    return undef; # this will never be called for directories (will it??)
+
+}
+
+
+# called at the end of each plugin pass
+sub end {
+    my ($self) = shift (@_);
+
+}
+
+
+
+# return 1 if this class might recurse using $pluginfo
+sub is_recursive {
+    my $self = shift (@_);
+    
+    return 1;
+}
+
+sub get_default_block_exp {
+    my $self = shift (@_);
+    
+    return '(?i)(CVS|\.svn|Thumbs\.db|OIDcount|~)$';
+}
+
+sub check_directory_path {
+
+    my $self = shift(@_);
+    my ($dirname) = @_;
+    
+    return undef unless (-d $dirname);
+
+    return 0 if ($self->{'block_exp'} ne "" && $dirname =~ /$self->{'block_exp'}/);
+
+    my $outhandle = $self->{'outhandle'};
+    
+    # check to make sure we're not reading the archives or index directory
+    my $gsdlhome = quotemeta($ENV{'GSDLHOME'});
+    if ($dirname =~ m/^$gsdlhome\/.*?\/import.*?\/(archives|index)$/) {
+	print $outhandle "DirectoryPlugin: $dirname appears to be a reference to a Greenstone collection, skipping.\n";
+        return 0;
+    }
+    
+    # check to see we haven't got a cyclic path...
+    if ($dirname =~ m%(/.*){,41}%) {
+	print $outhandle "DirectoryPlugin: $dirname is 40 directories deep, is this a recursive path? if not increase constant in DirectoryPlugin.pm.\n";
+	return 0;
+    }
+    
+    # check to see we haven't got a cyclic path...
+    if ($dirname =~ m%.*?import/(.+?)/import/\1.*%) {
+	print $outhandle "DirectoryPlugin: $dirname appears to be in a recursive loop...\n";
+	return 0;
+    }
+
+    return 1;
+}
+
+# this may be called more than once
+sub sort_out_associated_files {
+
+    my $self = shift (@_);
+    my ($block_hash) = @_;
+    if (!scalar (keys %{$block_hash->{'shared_fileroot'}})) {
+	return;
+    }
+
+    $self->{'assocfile_info'} = {} unless defined $self->{'assocfile_info'};
+    my $metadata = $self->{'assocfile_info'};
+    foreach my $prefix (keys %{$block_hash->{'shared_fileroot'}}) {
+	my $record = $block_hash->{'shared_fileroot'}->{$prefix};
+
+	my $tie_to = $record->{'tie_to'};
+	my $exts = $record->{'exts'};
+	
+	if ((defined $tie_to) && (scalar (keys %$exts) > 0)) {
+	    # set up fileblocks and assocfile_tobe
+	    my $base_file = "$prefix$tie_to";
+	    $metadata->{$base_file} = {} unless defined $metadata->{$base_file};
+	    my $base_file_metadata = $metadata->{$base_file};
+	    
+	    $base_file_metadata->{'gsdlassocfile_tobe'} = [] unless defined $base_file_metadata->{'gsdlassocfile_tobe'};
+	    my $assoc_tobe = $base_file_metadata->{'gsdlassocfile_tobe'};
+	    foreach my $e (keys %$exts) {
+		# block the file
+		&util::block_filename($block_hash,"$prefix$e");
+		# set up as an associatd file
+		print STDERR "  $self->{'plugin_type'}: Associating $prefix$e with $tie_to version\n";
+		my $mime_type = ""; # let system auto detect this
+		push(@$assoc_tobe,"$prefix$e:$mime_type:"); 
+
+	    }
+	}
+    } # foreach record
+
+    $block_hash->{'shared_fileroot'} = undef;
+    $block_hash->{'shared_fileroot'} = {};
+
+}
+
+
+# do block exp OR special blocking ???
+
+sub file_is_blocked {
+    my $self = shift (@_);
+    my ($block_hash, $filename_full_path) = @_;
+
+    $filename_full_path = &util::upgrade_if_dos_filename($filename_full_path);
+###    print STDERR "*** DirectoryPlugin::file_is_blocked $filename_full_path\n";
+
+    if ($ENV{'GSDLOS'} =~ m/^windows$/) {
+	# on windows, all block paths are lowercased.
+	my $lower_filename = lc ($filename_full_path);
+	if (defined $block_hash->{'file_blocks'}->{$lower_filename}) {
+	    $self->{'num_blocked'} ++;
+	    return 1;
+	}
+    }
+    else {
+	if (defined $block_hash->{'file_blocks'}->{$filename_full_path}) {
+	    $self->{'num_blocked'} ++;
+	    return 1;
+	}
+    }
+    # check Directory plugin's own block_exp 
+    if ($self->{'block_exp'} ne "" && $filename_full_path =~ /$self->{'block_exp'}/) {
+	$self->{'num_blocked'} ++;
+	return 1; # blocked
+    }
+    return 0;
+}
+
+
+
+sub file_block_read {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $block_hash, $metadata, $gli) = @_;
+
+    my $outhandle = $self->{'outhandle'};
+    my $verbosity = $self->{'verbosity'};
+    
+    # Calculate the directory name and ensure it is a directory and
+    # that it is not explicitly blocked.
+    my $dirname = $file;
+    $dirname = &util::filename_cat ($base_dir, $file) if $base_dir =~ /\w/;
+
+    my $directory_ok = $self->check_directory_path($dirname);
+    return $directory_ok unless (defined $directory_ok && $directory_ok == 1);
+
+    print $outhandle "Global file scan checking directory: $dirname\n" if ($verbosity > 0);
+
+    $block_hash->{'all_files'} = {} unless defined $block_hash->{'all_files'};
+    $block_hash->{'metadata_files'} = {} unless defined $block_hash->{'metadata_files'};
+
+    $block_hash->{'file_blocks'} = {} unless defined $block_hash->{'file_blocks'};
+    $block_hash->{'shared_fileroot'} = {} unless defined $block_hash->{'shared_fileroot'};
+
+     # Recur over directory contents.
+    my (@dir, $subfile);
+    #my $count = 0;
+    
+    print $outhandle "DirectoryPlugin block: getting directory $dirname\n" if ($verbosity > 2);
+    
+    # find all the files in the directory
+    if (!opendir (DIR, $dirname)) {
+	if ($gli) {
+	    print STDERR "<ProcessingError n='$file' r='Could not read directory $dirname'>\n";
+	}
+	print $outhandle "DirectoryPlugin: WARNING - couldn't read directory $dirname\n";
+	return -1; # error in processing
+    }
+    @dir = readdir (DIR);
+    closedir (DIR);
+    
+    for (my $i = 0; $i < scalar(@dir); $i++) {
+	my $raw_subfile = $dir[$i];
+	next if ($raw_subfile =~ m/^\.\.?$/);
+
+	my $this_file_base_dir = $base_dir;
+	my $raw_file_subfile = &util::filename_cat($file, $raw_subfile);
+
+	# Recursively read each $raw_subfile
+	print $outhandle "DirectoryPlugin block recurring: $raw_file_subfile\n" if ($verbosity > 2);
+	
+	#$count += &plugin::file_block_read ($pluginfo, $this_file_base_dir,
+
+	&plugin::file_block_read ($pluginfo, $this_file_base_dir,
+				  $raw_file_subfile,
+				  $block_hash, $metadata, $gli);
+	
+    }
+    $self->sort_out_associated_files($block_hash);
+    #return $count;
+	return 1;
+    
+}
+
+# We don't do metadata_read
+sub metadata_read {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $block_hash, 
+	$extrametakeys, $extrametadata, $extrametafile,
+	$processor, $gli, $aux) = @_;
+
+    return undef;
+}
+
+
+# return number of files processed, undef if can't process
+# Note that $base_dir might be "" and that $file might 
+# include directories
+
+# This function passes around metadata hash structures.  Metadata hash
+# structures are hashes that map from a (scalar) key (the metadata element
+# name) to either a scalar metadata value or a reference to an array of
+# such values.
+
+sub read {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $block_hash, $in_metadata, $processor, $maxdocs, $total_count, $gli) = @_;
+
+    my $outhandle = $self->{'outhandle'};
+    my $verbosity = $self->{'verbosity'};
+    
+    # Calculate the directory name and ensure it is a directory and
+    # that it is not explicitly blocked.
+    my $dirname;
+    if ($file eq "") {
+	$dirname = $base_dir;
+    } else {
+	$dirname = $file;
+	$dirname = &util::filename_cat ($base_dir, $file) if $base_dir =~ /\w/;
+    }
+
+    my $directory_ok = $self->check_directory_path($dirname);
+    return $directory_ok unless (defined $directory_ok && $directory_ok == 1);
+        
+    if (($verbosity > 2) && ((scalar keys %$in_metadata) > 0)) {
+        print $outhandle "DirectoryPlugin: metadata passed in: ", 
+	join(", ", keys %$in_metadata), "\n";
+    }
+    
+
+    # Recur over directory contents.
+    my (@dir, $subfile);
+    
+    print $outhandle "DirectoryPlugin read: getting directory $dirname\n" if ($verbosity > 2);
+    
+    # find all the files in the directory
+    if (!opendir (DIR, $dirname)) {
+	if ($gli) {
+	    print STDERR "<ProcessingError n='$file' r='Could not read directory $dirname'>\n";
+	}
+	print $outhandle "DirectoryPlugin: WARNING - couldn't read directory $dirname\n";
+	return -1; # error in processing
+    }
+    @dir = readdir (DIR);
+    map { $_ = &unicode::raw_filename_to_url_encoded($_) } @dir;
+    closedir (DIR);
+
+    # Re-order the files in the list so any directories ending with .all are moved to the end
+    for (my $i = scalar(@dir) - 1; $i >= 0; $i--) {
+	if (-d &util::filename_cat($dirname, $dir[$i]) && $dir[$i] =~ /\.all$/) {
+	    push(@dir, splice(@dir, $i, 1));
+	}
+    }
+
+    # setup the metadata structures. we do a metadata_read pass to see if there is any additional metadata, then pass it to read
+    
+    my $additionalmetadata = 0;      # is there extra metadata available?
+    my %extrametadata;               # maps from filespec to extra metadata keys
+    my %extrametafile;               # maps from filespec to the metadata.xml (or similar) file it came from
+    my @extrametakeys;               # keys of %extrametadata in order read
+
+
+    my $os_dirsep = &util::get_os_dirsep();
+    my $dirsep    = &util::get_dirsep();
+    my $base_dir_regexp = $base_dir;
+    $base_dir_regexp =~ s/\//$os_dirsep/g;
+    my $local_dirname = $dirname;
+    
+    $local_dirname =~ s/^$base_dir_regexp($os_dirsep)*//;
+    # if we are in import folder, then local_dirname will be empty
+    if ($local_dirname ne "") {
+	# look for extra metadata passed down from higher folders 
+	$local_dirname .= $dirsep;
+	if (defined $self->{'subdir_extrametakeys'}->{$local_dirname}) {
+	    my $extrakeys = $self->{'subdir_extrametakeys'}->{$local_dirname};
+	    foreach my $ek (@$extrakeys) {
+		my $extrakeys_re  = $ek->{'re'};
+		my $extrakeys_md  = $ek->{'md'};
+		my $extrakeys_mf  = $ek->{'mf'};
+		push(@extrametakeys,$extrakeys_re);
+		$extrametadata{$extrakeys_re} = $extrakeys_md;
+		$extrametafile{$extrakeys_re} = $extrakeys_mf;
+	    }
+	    delete($self->{'subdir_extrametakeys'}->{$local_dirname});
+	}
+    }
+    # apply metadata pass for each of the files in the directory -- ignore
+    # maxdocs here
+    my $num_files = scalar(@dir);
+    for (my $i = 0; $i < scalar(@dir); $i++) {
+	my $subfile = $dir[$i];
+	next if ($subfile =~ m/^\.\.?$/);
+
+	my $this_file_base_dir = $base_dir;
+	my $raw_subfile = &unicode::url_encoded_to_raw_filename($subfile);
+
+	my $raw_file_subfile = &util::filename_cat($file, $raw_subfile);
+	my $raw_full_filename = &util::filename_cat($this_file_base_dir, $raw_file_subfile);
+
+	if ($self->file_is_blocked($block_hash,$raw_full_filename)) {
+	    print STDERR "DirectoryPlugin: file $raw_full_filename was blocked for metadata_read\n" if ($verbosity > 2);
+	    next;
+	}
+
+        # If we are processing a manifest file, then we don't have to guess at
+        # what metadata source files to process. Only process those that appear
+        # in the metadata_files list in the block_hash. [jmt12]
+        if ($block_hash->{'manifest'} eq 'true' 
+            && !-d $raw_full_filename
+            && !$block_hash->{'metadata_files'}->{$raw_full_filename})
+        {
+          print $outhandle "**** Not in manifest. Ignoring metadata in $subfile\n" if ($verbosity > 3);
+          next;
+        }
+
+	
+	# Recursively read each $raw_subfile
+	print $outhandle "DirectoryPlugin metadata recurring: $raw_subfile\n" if ($verbosity > 2);
+	
+	&plugin::metadata_read ($pluginfo, $this_file_base_dir,
+				$raw_file_subfile,$block_hash,
+				\@extrametakeys, \%extrametadata,
+				\%extrametafile,
+				$processor, $gli);
+	$additionalmetadata = 1;
+    }
+
+    # filter out any extrametakeys that mention subdirectories and store
+    # for later use (i.e. when that sub-directory is being processed)
+    foreach my $ek (@extrametakeys) {
+	my ($subdir_re,$extrakey_dir) = &File::Basename::fileparse($ek);
+	$extrakey_dir =~ s/\\\./\./g; # remove RE syntax for .
+	$extrakey_dir =~ s/\\\\/\\/g; # remove RE syntax for \
+
+	my $dirsep_re = &util::get_re_dirsep();
+
+	my $ek_non_re = $ek;
+	$ek_non_re =~ s/\\\./\./g; # remove RE syntax for .
+	$ek_non_re =~ s/\\\\/\\/g; # remove RE syntax for \
+	if ($ek_non_re =~ m/$dirsep_re/) { # specifies at least one directory
+	    my $md = $extrametadata{$ek};
+	    my $mf = $extrametafile{$ek};
+
+	    my $subdir_extrametakeys = $self->{'subdir_extrametakeys'};
+
+	    my $subdir_rec = { 're' => $subdir_re, 'md' => $md, 'mf' => $mf };
+
+	    # when its looked up, it must be relative to the base dir
+	    push(@{$subdir_extrametakeys->{"$local_dirname$extrakey_dir"}},$subdir_rec);
+	    #push(@{$subdir_extrametakeys->{"$extrakey_dir"}},$subdir_rec);
+	}
+    }
+    
+    # import each of the files in the directory
+    my $count=0;
+    for (my $i = 0; $i <= scalar(@dir); $i++) {
+	# When every file in the directory has been done, pause for a moment (figuratively!)
+	# If the -recheck_directories argument hasn't been provided, stop now (default)
+	# Otherwise, re-read the contents of the directory to check for new files
+	#   Any new files are added to the @dir list and are processed as normal
+	#   This is necessary when documents to be indexed are specified in bibliographic DBs
+	#   These files are copied/downloaded and stored in a new folder at import time
+	if ($i == $num_files) {
+	    last unless $self->{'recheck_directories'};
+
+	    # Re-read the files in the directory to see if there are any new files
+	    last if (!opendir (DIR, $dirname));
+	    my @dirnow = readdir (DIR);
+	    map { $_ = &unicode::raw_filename_to_url_encoded($_) } @dirnow;
+	    closedir (DIR);
+
+	    # We're only interested if there are more files than there were before
+	    last if (scalar(@dirnow) <= scalar(@dir));
+
+	    # Any new files are added to the end of @dir to get processed by the loop
+	    my $j;
+	    foreach my $subfilenow (@dirnow) {
+		for ($j = 0; $j < $num_files; $j++) {
+		    last if ($subfilenow eq $dir[$j]);
+		}
+		if ($j == $num_files) {
+		    # New file
+		    push(@dir, $subfilenow);
+		}
+	    }
+	    # When the new files have been processed, check again
+	    $num_files = scalar(@dir);
+	}
+
+	my $subfile = $dir[$i];
+	last if ($maxdocs != -1 && ($count + $total_count) >= $maxdocs);
+	next if ($subfile =~ /^\.\.?$/);
+
+	my $this_file_base_dir = $base_dir;
+	my $raw_subfile = &unicode::url_encoded_to_raw_filename($subfile);
+
+	my $raw_file_subfile = &util::filename_cat($file, $raw_subfile);
+	my $raw_full_filename 
+	    = &util::filename_cat($this_file_base_dir,$raw_file_subfile);
+
+	if ($self->file_is_blocked($block_hash,$raw_full_filename)) {
+	    print STDERR "DirectoryPlugin: file $raw_full_filename was blocked for read\n" if ($verbosity > 2);
+	    next;
+	}
+	#print STDERR "processing $raw_full_filename\n";
+	# Follow Windows shortcuts
+	if ($raw_subfile =~ /(?i)\.lnk$/ && $ENV{'GSDLOS'} =~ /^windows$/i) {
+	    require Win32::Shortcut;
+	    my $shortcut = new Win32::Shortcut(&util::filename_cat($dirname, $raw_subfile));
+	    if ($shortcut) {
+		# The file to be processed is now the target of the shortcut
+		$this_file_base_dir = "";
+		$file = "";
+		$raw_subfile = $shortcut->Path;
+	    }
+	}
+
+	# check for a symlink pointing back to a leading directory
+	if (-d "$dirname/$raw_subfile" && -l "$dirname/$raw_subfile") {
+	    # readlink gives a "fatal error" on systems that don't implement
+	    # symlinks. This assumes the the -l test above would fail on those.
+	    my $linkdest=readlink "$dirname/$raw_subfile";
+	    if (!defined ($linkdest)) {
+		# system error - file not found?
+		warn "DirectoryPlugin: symlink problem - $!";
+	    } else {
+		# see if link points to current or a parent directory
+		if ($linkdest =~ m@^[\./\\]+$@ ||
+		    index($dirname, $linkdest) != -1) {
+		    warn "DirectoryPlugin: Ignoring recursive symlink ($dirname/$raw_subfile -> $linkdest)\n";
+		    next;
+		    ;
+		}
+	    }
+	}
+
+	print $outhandle "DirectoryPlugin: preparing metadata for $raw_subfile\n" if ($verbosity > 2);
+
+	# Make a copy of $in_metadata to pass to $raw_subfile
+	my $out_metadata = {};
+	&metadatautil::combine_metadata_structures($out_metadata, $in_metadata);
+
+	# check the assocfile_info
+	if (defined $self->{'assocfile_info'}->{$raw_full_filename}) {
+	    &metadatautil::combine_metadata_structures($out_metadata, $self->{'assocfile_info'}->{$raw_full_filename});
+	}
+
+	# $subfile by this point is url-encoded => all ASCII chars => no need to encode as UTF8
+
+	# Next add metadata read in XML files (if it is supplied)
+	if ($additionalmetadata == 1) {
+	    foreach my $filespec (@extrametakeys) {
+		## use the url-encoded filename to do the filename comparison
+
+		if ($subfile =~ /^$filespec$/) {
+		    print $outhandle "File \"$subfile\" matches filespec \"$filespec\"\n" 
+			if ($verbosity > 2);
+		    my $mdref = $extrametadata{$filespec};
+		    my $mfref = $extrametafile{$filespec};
+
+		    # Add the list files where the metadata came from
+		    # into the metadata table so we can track this
+		    # This mechanism is similar to how gsdlassocfile works
+
+		    my @metafile_pair = ();
+		    foreach my $l (keys %$mfref) {
+			my $f = $mfref->{$l};
+			push (@metafile_pair, "$f : $l");
+		    }
+
+		    $mdref->{'gsdlmetafile'} = \@metafile_pair;
+
+		    &metadatautil::combine_metadata_structures($out_metadata, $mdref);
+		}
+	    }
+	}
+
+        # So, here's my problem. I have an empty archives directory, and a 
+        # manifest file that says to add 1 out of 2 documents in the import
+        # directory. The directory scan finds both files, and doc 1 is in
+        # new_files, so that is all good. But doc 2 is also processed, and
+        # without any blocking or other rule, also gets imported.
+        # If we are processing a Manifest then files (not docs) that aren't in
+        # either the new files or reindex files are skipped.
+        # We'll also test for metadata files here, even though they should
+        # have been handled above - just in case we have the weird case where
+        # a file is both a metadata source and a file in its own right. [jmt12]
+        if ($block_hash->{'manifest'} eq 'true' 
+            && !-d $raw_full_filename
+            && !$block_hash->{'new_files'}->{$raw_full_filename}
+            && !$block_hash->{'reindex_files'}->{$raw_full_filename}
+            && !$block_hash->{'metadata_files'}->{$raw_full_filename})
+        {
+          print $outhandle "**** Not in manifest. Skipping $subfile\n" if ($verbosity > 3);
+          next;
+        }
+
+	if (defined $self->{'inf_timestamp'}) {
+	    # Look to see if it's a completely new file
+
+	    if (!$block_hash->{'new_files'}->{$raw_full_filename}) {
+		# Not a new file, must be an existing file
+		# Let' see if it's newer than the last import.pl
+
+
+		if (! -d $raw_full_filename) {
+		    if (!$block_hash->{'reindex_files'}->{$raw_full_filename}) {
+			# filename has been around for longer than inf_timestamp
+			print $outhandle "**** Skipping $subfile\n" if ($verbosity >3);
+			next;
+		    }
+		    else {
+			# Remove old folder in archives (might hash to something different)
+			# *** should be doing this on a Del one as well
+			# but leave folder name?? and ensure hashs to
+			# same again??
+
+			# Then let through as new doc??
+
+			# mark to doc-oids that rely on it for re-indexing
+		    }
+		}
+	    }
+        }
+
+	# Recursively read each $subfile
+	print $outhandle "DirectoryPlugin recurring: $subfile\n" if ($verbosity > 2);
+	
+	$count += &plugin::read ($pluginfo, $this_file_base_dir,
+				 $raw_file_subfile, $block_hash,
+				 $out_metadata, $processor, $maxdocs, ($total_count + $count), $gli);
+    }
+
+    return $count;
+}
+
+sub compile_stats {
+    my $self = shift(@_);
+    my ($stats) = @_;
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/EmailAddressExtractor.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/EmailAddressExtractor.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/EmailAddressExtractor.pm	(revision 24799)
@@ -0,0 +1,129 @@
+###########################################################################
+#
+# EmailAddressExtractor - helper plugin that extracts email addresses from text
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2008 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package EmailAddressExtractor;
+
+use PrintInfo;
+use strict;
+
+BEGIN {
+    @EmailAddressExtractor::ISA = ('PrintInfo');
+}
+
+my $arguments = [
+      { 'name' => "extract_email",
+	'desc' => "{EmailAddressExtractor.extract_email}",
+	'type' => "flag",
+	'reqd' => "no" },
+      { 'name' => "new_extract_email",
+	'desc' => "",
+	'type' => "flag",
+	'reqd' => "no",
+	'hiddengli' => "yes" } 
+		 ];
+
+my $options = { 'name'     => "EmailAddressExtractor",
+		'desc'     => "{EmailAddressExtractor.desc}",
+		'abstract' => "yes",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new PrintInfo($pluginlist, $inputargs, $hashArgOptLists, 1);
+
+    return bless $self, $class;
+
+}
+
+# extract metadata
+sub extract_email_metadata {
+
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+    
+    if ($self->{'extract_email'}) {
+	my $thissection = $doc_obj->get_top_section();
+	while (defined $thissection) {
+	    my $text = $doc_obj->get_text($thissection);
+	    $self->extract_email (\$text, $doc_obj, $thissection) if $text =~ /./;
+	    $thissection = $doc_obj->get_next_section ($thissection);
+	}
+    } 
+
+}
+
+sub extract_email {
+    my $self = shift (@_);
+    my ($textref, $doc_obj, $thissection) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    gsprintf($outhandle, " {EmailAddressExtractor.extracting_emails}...\n")
+	if ($self->{'verbosity'} > 2);
+    
+    my @email = ($$textref =~ m/([-a-z0-9\.@+_=]+@(?:[-a-z0-9]+\.)+(?:com|org|edu|mil|int|net|[a-z][a-z]))/g);
+    @email = sort @email;
+    
+#    if($self->{"new_extract_email"} == 0)
+#    {
+#    my @email2 = ();
+#    foreach my $address (@email) 
+#   {
+#	if (!(join(" ",@email2) =~ m/(^| )$address( |$)/ )) 
+#	    {
+#		push @email2, $address;
+#		$doc_obj->add_utf8_metadata ($thissection, "EmailAddress", $address);
+#		# print $outhandle "  extracting $address\n" 
+#		&gsprintf($outhandle, "  {AutoExtractMetadata.extracting} $address\n")
+#		    if ($self->{'verbosity'} > 3);
+#	    }
+#	}
+#    }
+#    else
+#    {
+    my $hashExistMail = {};
+    foreach my $address (@email) {
+	if (!(defined $hashExistMail->{$address}))
+	{
+	    $hashExistMail->{$address} = 1;
+	    $doc_obj->add_utf8_metadata ($thissection, "EmailAddress", $address);
+	    gsprintf($outhandle, "  {AutoExtractMetadata.extracting} $address\n")
+		if ($self->{'verbosity'} > 3);
+	}
+    }
+    gsprintf($outhandle, " {EmailAddressExtractor.done_email_extract}\n")
+	if ($self->{'verbosity'} > 2);
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/EmailPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/EmailPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/EmailPlugin.pm	(revision 24799)
@@ -0,0 +1,1213 @@
+###########################################################################
+#
+# EmailPlugin.pm - a plugin for parsing email files
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999-2002 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+
+
+# EmailPlugin
+#
+# by Gordon Paynter (gwp@cs.waikato.ac.nz)
+#
+# Email plug reads email files.  These are named with a simple
+# number (i.e. as they appear in maildir folders) or with the 
+# extension .mbx (for mbox mail file format)
+#
+# Document text:
+#   The document text consists of all the text 
+#   after the first blank line in the document.
+#
+# Metadata (not Dublin Core!):
+#   $Headers      All the header content (optional, not stored by default)
+#   $Subject      Subject: header
+#   $To           To: header
+#   $From         From: header
+#   $FromName     Name of sender (where available)
+#   $FromAddr     E-mail address of sender
+#   $DateText     Date: header
+#   $Date         Date: header in GSDL format (eg: 19990924)
+#
+#   $Title	  made up of Subject, Date and Sender (for default formatting)
+#   $InReplyTo    Message id of the one this replies to
+#
+# John McPherson - June/July 2001
+# added (basic) MIME support and quoted-printable and base64 decodings.
+# Minor fixes for names that are actually email addresses (ie <...> was lost)
+#
+# See:  * RFC 822  - ARPA Internet Text Messages
+#       * RFC 2045 - Multipurpose Internet Mail Extensions (MIME) -part1
+#       * RFC 2046 - MIME (part 2)  Media Types (and multipart messages)
+#       * RFC 2047 - MIME (part 3)  Message Header Extensions
+#       * RFC 1806 - Content Dispositions (ie inline/attachment)
+
+
+package EmailPlugin;
+
+use strict;
+no strict "refs"; # so we can use a variable as a filehandle for print $out
+
+
+use SplitTextFile;
+use unicode;  # gs conv functions
+use gsprintf 'gsprintf'; # translations
+
+use sorttools;
+use util;
+
+sub BEGIN {
+    @EmailPlugin::ISA = ('SplitTextFile');
+}
+
+my $extended_oidtype_list = 
+    [ {'name' => "message_id",
+       'desc' => "{EmailPlugin.OIDtype.message_id}" }
+      ];
+
+# add in all the standard options from BasePlugin
+unshift (@$extended_oidtype_list, @{$BasePlugin::oidtype_list});
+
+my $arguments = 
+    [ { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'reqd' => "no",
+	'deft' => &get_default_process_exp() },
+      { 'name' => "no_attachments",
+	'desc' => "{EmailPlugin.no_attachments}",
+	'type' => "flag",
+	'reqd' => "no" },
+      { 'name' => "headers",
+	'desc' => "{EmailPlugin.headers}",
+	'type' => "flag",
+	'reqd' => "no" },
+      { 'name' => "OIDtype",
+	'desc' => "{import.OIDtype}",
+	'type' => "enum",
+	'list' => $extended_oidtype_list,
+	'deft' => "message_id",
+	'reqd' => "no" },
+      { 'name' => "OIDmetadata",
+	'desc' => "{import.OIDmetadata}",
+	'type' => "metadata",
+	'deft' => "dc.Identifier",
+	'reqd' => "no" },
+      { 'name' => "split_exp",
+	'desc' => "{EmailPlugin.split_exp}",
+	'type' => "regexp",
+	'reqd' => "no",
+	'deft' => &get_default_split_exp() } 
+      ];
+
+my $options = { 'name'     => "EmailPlugin",
+		'desc'     => "{EmailPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new SplitTextFile($pluginlist, $inputargs, $hashArgOptLists);
+
+    $self->{'assoc_filenames'} = {}; # to save attach names so we don't clobber
+    $self->{'tmp_file_paths'} = (); # list of tmp files to delete after processing is finished
+
+    # this might not actually be true at read-time, but after processing
+    # it should all be utf8.
+    $self->{'input_encoding'}="utf8";
+    return bless $self, $class;
+}
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+    # mbx/email for mailbox file format, \d+ for maildir (each message is
+    # in a separate file, with a unique number for filename)
+    # mozilla and IE will save individual mbx format files with a ".eml" ext.
+    return q@([\\/]\d+|\.(mbx|email|eml))$@;
+}
+
+# This plugin splits the mbox mail files at lines starting with From<sp>
+# It is supposed to be "\n\nFrom ", but this isn't always used.
+# add \d{4} so that the line ends in a year (in case the text has an
+# unescaped "From " at the start of a line).
+sub get_default_split_exp {
+    return q^\nFrom .*\d{4}\n^;
+    
+}
+
+sub can_process_this_file {
+    my $self = shift(@_);
+    my ($filename) = @_;
+
+    # avoid any confusion between filenames matching \d+ (which are by default
+    # matched by EmailPlugin) and directories that match \d+ (which should not)
+
+    return 0 if (-d $filename); 
+
+    if ($self->{'process_exp'} ne "" && $filename =~ /$self->{'process_exp'}/) {
+	return 1;
+    }
+    return 0;
+    
+}
+
+
+# do plugin specific processing of doc_obj
+sub process {
+
+    my $self = shift (@_);
+    my ($textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    # Check that we're dealing with a valid mail file
+    # mbox message files start with "From "
+    # maildir messages usually start with Return-Path and Delivered-To
+    # mh is very similar to maildir
+    my $startoffile=substr($$textref,0,256);
+    if (($startoffile !~ /^(From )/) &&
+	($startoffile !~ /^(From|To|Envelope.*|Received|Return-Path|Date|Subject|Content\-.*|MIME-Version|Forwarded):/im)) {
+	return undef;
+    }
+
+    my $cursection = $doc_obj->get_top_section();
+
+    #
+    # Parse the document's text and extract metadata
+    #
+
+    # Protect backslashes
+    $$textref =~ s@\\@\\\\@g;
+
+    # Separate header from body of message
+    my $Headers = $$textref;
+    $Headers =~ s/\r?\n\r?\n(.*)$//s;
+    $$textref = $1;
+    $Headers .= "\n";
+    
+    # Unfold headers - see rfc822
+    $Headers =~ s/\r?\n[\t\ ]+/ /gs;
+    # Extract basic metadata from header
+    my @headers = ("From", "To", "Subject", "Date");
+    my %raw;
+    foreach my $name (@headers) {
+	$raw{$name} = "No $name value";
+    }
+
+    # Get a default encoding for the header - RFC says should be ascii...
+    my $default_header_encoding="iso_8859_1";
+
+    # We don't know what character set is the user's default...
+    # We could use textcat to guess... for now we'll look at mime content-type
+#    if ($Headers =~ /([[:^ascii:]])/) {
+#    }
+    if ($Headers =~ /^Content\-type:.*charset=\"?([a-z0-9\-_]+)/mi) {
+	$default_header_encoding=$1;
+	$default_header_encoding =~ s@\-@_@g;
+	$default_header_encoding =~ tr/A-Z/a-z/;
+    }
+
+
+    # Examine each line of the headers
+    my ($line, $name, $value);
+    my @parts;
+    foreach $line (split(/\n/, $Headers)) {
+	
+	# Ignore lines with no content or which begin with whitespace
+	next unless ($line =~ /:/);
+	next if ($line =~ /^\s/);
+
+	# Find out what metadata is on this line
+	@parts = split(/:/, $line);
+	$name = shift @parts;
+        # get fieldname in canonical form - first cap, then lower case.
+	$name =~ tr/A-Z/a-z/;
+        # uppercase the first character according to the current locale
+	$name=~s/(.+)/\u$1/;
+	next unless $name;
+	next unless ($raw{$name});
+
+	# Find the value of that metadata
+	$value = join(":", @parts);
+	$value =~ s/^\s+//;
+	$value =~ s/\s+$//;
+	# decode header values, using either =?<charset>?[BQ]?<data>?= (rfc2047) or default_header_encoding
+	$self->decode_header_value($default_header_encoding, \$value);
+	
+	# Store the metadata
+	$value =~ s@_@\\_@g; # protect against GS macro language
+	$raw{$name} = $value;
+    }
+
+    # Extract the name and e-mail address from the From metadata
+    my $frommeta = $raw{"From"};
+    my $fromnamemeta;
+    my $fromaddrmeta;
+
+    $frommeta =~ s/\s*$//;  # Remove trailing space, if any
+
+    if ($frommeta =~ m/(.+)\s*<(.+)>/) {
+	$fromnamemeta=$1;
+	$fromaddrmeta=$2;
+    } elsif ($frommeta =~ m/(.+@.+)\s+\((.*)\)/) {
+	$fromnamemeta=$2;
+	$fromaddrmeta=$1;
+    } elsif ($frommeta =~ m/(.+)\s+at\s+(.+)\s+\((.*)\)/) {
+	$fromnamemeta=$3;
+	$fromaddrmeta="$1&#64;$2";
+    }
+
+    if (!defined($fromaddrmeta)) {
+	$fromaddrmeta=$frommeta;
+    }
+    $fromaddrmeta=~s/<//; $fromaddrmeta=~s/>//;
+    # minor attempt to prevent spam-bots from harvesting addresses...
+    $fromaddrmeta=~s/@/&#64;/;
+
+    $doc_obj->add_utf8_metadata ($cursection, "FromAddr", $fromaddrmeta);
+
+    if (defined($fromnamemeta) && $fromnamemeta) { # must be > 0 long
+	$fromnamemeta =~ s/\"//g;  # remove quotes
+	$fromnamemeta =~ s/\s+$//; # remove trailing whitespace
+    }
+    else {
+	$fromnamemeta = $fromaddrmeta;
+    }
+    # if name is an address
+    $fromnamemeta =~ s/<//g; $fromnamemeta =~ s/>//g;
+    $fromnamemeta=~s/@/&#64\;/;
+    $doc_obj->add_utf8_metadata ($cursection, "FromName", $fromnamemeta);
+
+    $raw{"From"}=$frommeta;
+
+    # Process Date information
+    if ($raw{"Date"} !~ /No Date/) {
+	$raw{"DateText"} = $raw{"Date"};
+	
+	# Convert the date text to internal date format
+	$value = $raw{"Date"};
+	# proper mbox format: Tue, 07 Jan 2003 17:27:42 +1300
+	my ($day, $month, $year) = $value =~ /(\d?\d)\s([A-Z][a-z][a-z])\s(\d\d\d?\d?)/;
+	if (!defined($day) || !defined($month) || !defined ($year)) {
+	    # try monthly archive format: Wed Apr 23 00:26:08 2008
+	    ($month,$day, $year) = $value =~ /([A-Z][a-z][a-z])\s\s?(\d?\d)\s\d\d:\d\d:\d\d\s(\d\d\d\d)/;
+	}
+
+	# make some assumptions about the year formatting...
+	# some (old) software thinks 2001 is 101, some think 2001 is 01
+	if ($year < 20) { $year += 2000; } # assume not really 1920...
+	elsif ($year < 150) { $year += 1900; } # assume not really 2150...
+	$raw{"Date"} = &sorttools::format_date($day, $month, $year);
+	
+    } else {
+	# We have not extracted a date
+	$raw{"DateText"} = "Unknown.";
+	$raw{"Date"} = "19000000";
+    }
+
+    # Add extracted metadata to document object
+    foreach my $name (keys %raw) {
+	$value = $raw{$name};
+	if ($value) {
+	    # assume subject, etc headers have no special HTML meaning.
+	    $value = &text_into_html($value);
+	    # escape [] so it isn't re-interpreted as metadata
+	    $value =~ s/\[/&#91;/g; $value =~ s/\]/&#93;/g;
+	} else {
+	    $value = "No $name field";
+	}
+	$doc_obj->add_utf8_metadata ($cursection, $name, $value);
+    }
+
+
+    # extract a message ID from the headers, if there is one, and we'll use
+    # that as the greenstone doc ID. Having a predictable ID means we can
+    # link to other messages, eg from In-Reply-To or References headers...
+    if ($Headers =~ m@^Message-ID:(.+)$@mi) {
+	my $id=escape_msg_id($1);
+	$doc_obj->{'msgid'}=$id;
+    }
+    # link to another message, if this is a reply
+    if ($Headers =~ m@^In-Reply-To:(.+)$@mi) {
+	my $id=escape_msg_id($1);
+	$doc_obj->add_utf8_metadata ($cursection, 'InReplyTo', $id);
+    } elsif ($Headers =~ m@^References:.*\s([^\s]+)$@mi) {
+	# References can have multiple, get the last one
+	my $id=escape_msg_id($1);
+	# not necessarily in-reply-to, but same thread...
+	$doc_obj->add_utf8_metadata ($cursection, 'InReplyTo', $id);
+    }
+
+
+
+    my $mimetype="text/plain";
+    my $mimeinfo="";
+    my $charset = $default_header_encoding;
+    # Do MIME and encoding stuff. Allow \s in mimeinfo in case there is
+    # more than one parameter given to Content-type.
+    # eg: Content-type: text/plain; charset="us-ascii"; format="flowed"
+    if ($Headers =~ m@^content\-type:\s*([\w\.\-/]+)\s*(\;\s*.+)?\s*$@mi)
+	{
+	    $mimetype=$1;
+	    $mimetype =~ tr/[A-Z]/[a-z]/;
+
+	    if ($mimetype eq "text") { # for pre-RFC2045 messages (c. 1996)
+		$mimetype = "text/plain";
+	    }
+
+	    $mimeinfo=$2;
+	    if (!defined $mimeinfo) {
+		$mimeinfo="";
+	    } else { # strip leading and trailing stuff
+		$mimeinfo =~ s/^\;\s*//;
+		$mimeinfo =~ s/\s*$//;
+	    }
+	    if ($mimeinfo =~ /charset=\"([^\"]+)\"/i) {
+	      $charset = $1;
+	    }
+	}
+
+    my $transfer_encoding="7bit";
+    if ($Headers =~ /^content-transfer-encoding:\s*([^\s]+)\s*$/mi) {
+	$transfer_encoding=$1;
+    }
+
+    if ($mimetype eq "text/html") {
+	$$textref= $self->text_from_part($$textref, $Headers);
+    } elsif ($mimetype ne "text/plain") {
+	$self->{'doc_obj'} = $doc_obj; # in case we need to associate files...
+	$$textref=$self->text_from_mime_message($mimetype,$mimeinfo,$default_header_encoding,$$textref);
+    } else { # mimetype eq text/plain
+
+	if ($transfer_encoding =~ /quoted\-printable/) {
+	    $$textref=qp_decode($$textref);
+	} elsif ($transfer_encoding =~ /base64/) {
+	    $$textref=base64_decode($$textref);
+	}
+	$self->convert2unicode($charset, $textref);
+
+	$$textref = &text_into_html($$textref);
+	$$textref =~ s@_@\\_@g; # protect against GS macro language
+
+    }
+
+    
+    if ($self->{'headers'} && $self->{'headers'} == 1) {
+	# Add "All headers" metadata
+	$Headers = &text_into_html($Headers);
+
+	$Headers = "No headers" unless ($Headers =~ /\w/);
+	$Headers =~ s/@/&#64\;/g;
+	# escape [] so it isn't re-interpreted as metadata
+	$Headers =~ s/\[/&#91;/g; $Headers =~ s/\]/&#93;/g;
+	$self->convert2unicode($charset, \$Headers);
+
+	$Headers =~ s@_@\\_@g; # protect against GS macro language
+	$doc_obj->add_utf8_metadata ($cursection, "Headers", $Headers);
+    }
+
+
+    # Add Title metadata
+    my $Title = text_into_html($raw{'Subject'});
+    $Title .= "<br>From: " . text_into_html($fromnamemeta);
+    $Title .= "<br>Date: " . text_into_html($raw{'DateText'});
+    $Title =~ s/\[/&#91;/g; $Title =~ s/\]/&#93;/g;
+
+    $doc_obj->add_utf8_metadata ($cursection, "Title", $Title);
+	
+    # Add FileFormat metadata
+    $doc_obj->add_metadata($cursection, "FileFormat", "EMAIL");
+
+    # Add text to document object
+    $$textref = "No message" unless ($$textref =~ /\w/);
+
+    $doc_obj->add_utf8_text($cursection, $$textref);
+
+    return 1;
+}
+
+# delete any temp files that we have created
+sub clean_up_after_doc_obj_processing {
+    my $self = shift(@_);
+    
+    foreach my $tmp_file_path (@{$self->{'tmp_file_paths'}}) {
+        if (-e $tmp_file_path) {
+            &util::rm($tmp_file_path);
+        }
+    }
+    
+}
+
+# Convert a text string into HTML.
+#
+# The HTML is going to be inserted into a GML file, so 
+# we have to be careful not to use symbols like ">",
+# which ocurs frequently in email messages (and use
+# &gt instead.
+#
+# This function also turns links and email addresses into hyperlinks,
+# and replaces carriage returns with <BR> tags (and multiple carriage
+# returns with <P> tags).
+
+
+sub text_into_html {
+    my ($text) = @_;
+
+    # Convert problem characters into HTML symbols
+    $text =~ s/&/&amp;/g;
+    $text =~ s/</&lt;/g;
+    $text =~ s/>/&gt;/g;
+    $text =~ s/\"/&quot;/g;
+
+    # convert email addresses and URIs into links
+# don't markup email addresses for now
+#    $text =~ s/([\w\d\.\-]+@[\w\d\.\-]+)/<a href=\"mailto:$1\">$1<\/a>/g;
+
+    # try to munge email addresses a little bit...
+    $text =~ s/@/&#64;/;
+    # assume hostnames are \.\w\- only, then might have a trailing '/.*'
+    # assume URI doesn't finish with a '.'
+    $text =~ s@((http|ftp|https)://[\w\-]+(\.[\w\-]+)*/?((&amp;|\.|\%[a-f0-9]{2})?[\w\?\=\-_/~]+)*(\#[\w\.\-_]*)?)@<a href=\"$1\">$1<\/a>@gi;
+
+
+    # Clean up whitespace and convert \n charaters to <BR> or <P>
+    $text =~ s/ +/ /g;
+    $text =~ s/\s*$//g; 
+    $text =~ s/^\s*//g;
+    $text =~ s/\n/\n<br>/g;
+    $text =~ s/<br>\s*<br>/<p>/gi;
+
+    return $text;
+}
+
+
+
+
+#Process a MIME message.
+# the textref we are given DOES NOT include the header.
+sub text_from_mime_message {
+    my $self = shift(@_);
+    my ($mimetype,$mimeinfo,$default_header_encoding,$text)=(@_);
+    my $outhandle=$self->{'outhandle'};
+    # Check for multiparts - $mimeinfo will be a boundary
+    if ($mimetype =~ /multipart/) {
+	my $boundary="";
+	if ($mimeinfo =~ m@boundary=(\"[^\"]+\"|[^\s]+)\s*$@im) {
+	    $boundary=$1;
+	    if ($boundary =~ m@^\"@) {
+		$boundary =~ s@^\"@@; $boundary =~ s@\"$@@;
+	    }
+	} else {
+	    print $outhandle "EmailPlugin: (warning) couldn't parse MIME boundary\n";
+	}
+	# parts start with "--$boundary"
+	# message ends with "--$boundary--"
+	# RFC says boundary is <70 chars, [A-Za-z'()+_,-./:=?], so escape any
+	# that perl might want to interpolate. Also allows spaces...
+	$boundary=~s/\\/\\\\/g;
+	$boundary=~s/([\?\+\.\(\)\:\/\'])/\\$1/g;
+	my @message_parts = split("\r?\n\-\-$boundary", "\n$text");
+	# remove first "part" and last "part" (final --)
+	shift @message_parts;
+	my $last=pop @message_parts;
+	# if our boundaries are a bit dodgy and we only found 1 part...
+	if (!defined($last)) {$last="";}
+	# make sure it is only -- and whitespace
+	if ($last !~ /^\-\-\s*$/ms) {
+	    print $outhandle "EmailPlugin: (warning) last part of MIME message isn't empty\n";
+	}
+	foreach my $message_part (@message_parts) {
+	    # remove the leading newline left from split.
+	    $message_part=~s/^\r?\n//;
+	}
+	if ($mimetype eq "multipart/alternative") {
+	    # check for an HTML version first, then TEXT, otherwise use first.
+	    my $part_text="";
+	    foreach my $message_part (@message_parts) {
+		if ($message_part =~ m@^content\-type:\s*text/html@i)
+		{
+		    # Use the HTML version
+		    $part_text = $self->text_from_part($message_part);
+		    $mimetype="text/html";
+		    last;
+		}
+	    }
+	    if ($part_text eq "") { # try getting a text part instead
+		foreach my $message_part (@message_parts) {
+		    if ($message_part =~ m@^content\-type:\s*text/plain@i)
+		    {
+			# Use the plain version
+			$part_text = $self->text_from_part($message_part);
+			if ($part_text =~/[^\s]/) {
+			    $part_text = text_into_html($part_text);
+			}
+			$mimetype="text/plain";
+			last;
+		    }
+		}
+	    }
+	    if ($part_text eq "") { #use first part (no html/text part found)
+		$part_text = $self->text_from_part(shift @message_parts);
+		$part_text = text_into_html($part_text);
+	    }
+	    if ($part_text eq "") { # we couldn't get anything!!!
+		# or it was an empty message...
+		# do nothing...
+		gsprintf($outhandle, "{ReadTextFile.empty_file} - empty body?\n");
+	    } else {
+		$text = $part_text;
+	    }
+	} elsif ($mimetype =~ m@multipart/(mixed|digest|related|signed)@) {
+	    $text = "";
+	    # signed is for PGP/GPG messages... the last part is a hash
+	    if ($mimetype =~ m@multipart/signed@) {
+		pop @message_parts;
+	    }
+	    my $is_first_part=1;
+	    foreach my $message_part (@message_parts) {
+		if ($is_first_part && $text ne "") {$is_first_part=0;}
+
+		if ($mimetype eq "multipart/digest") {
+		    # default type - RTFRFC!! Set if not already set
+		    $message_part =~ m@^(.*)\n\r?\n@s;
+		    my $part_header=$1;
+		    if ($part_header !~ m@^content-type@mi) {
+			$message_part="Content-type: message/rfc822\n"
+			    . $message_part; # prepend default type
+		    }
+		}
+
+		$text .= $self->process_multipart_part($default_header_encoding,
+						       $message_part,
+						       $is_first_part);
+	    } # foreach message part.
+	} else {
+	    # we can't handle this multipart type (not mixed or alternative)
+	    # the RFC also mentions "parallel".
+	}
+    } # end of ($mimetype =~ multipart)
+    elsif ($mimetype =~ m@message/rfc822@) {
+	my $msg_header = $text;
+	$msg_header =~ s/\r?\n\r?\n(.*)$//s;
+	$text = $1;
+
+	if ($msg_header =~ /^content\-type:\s*([\w\.\-\/]+)\s*\;?\s*(.+?)\s*$/mi)
+	{
+	    $mimetype=$1;
+	    $mimeinfo=$2;
+	    $mimetype =~ tr/[A-Z]/[a-z]/;
+
+	    my $msg_text;
+	    if ($mimetype =~ m@multipart/@) {
+		$msg_text = $self->text_from_mime_message($mimetype, $mimeinfo,
+						   $default_header_encoding,
+						   $text);
+	    } else {
+		$msg_text=$self->text_from_part($text,$msg_header);
+	    }
+
+	    my $brief_header=text_into_html(get_brief_headers($msg_header));
+	    $text= "\n<b>&lt;&lt;attached message&gt;&gt;</b><br>";
+	    $text.= "<table><tr><td width=\"5%\"> </td>\n";
+	    $text.="<td>" . $brief_header . "\n</p>" . $msg_text 
+		. "</td></tr></table>";
+	}
+    } else {
+	# we don't do any processing of the content.
+    }
+
+    return $text;
+}
+
+
+
+# used for turning a message id into a more friendly string for greenstone
+sub escape_msg_id {
+#msgid
+    my $id=shift;
+    chomp $id; $id =~ s!\s!!g; # remove spaces
+    $id =~ s![<>\[\]]!!g; # remove [ ] < and >
+    $id =~ s![_&]!-!g; # replace symbols that might cause problems
+    $id =~ s!\.!-!g; # . means section to greenstone doc ids!
+    $id =~ s!@!-!g; # replace @ symbol, to avoid spambots
+    return $id;
+}
+
+
+
+sub process_multipart_part {
+    my $self = shift;
+    my $default_header_encoding = shift;
+    my $message_part = shift;
+    my $is_first_part = shift;
+
+    my $return_text="";
+    my $part_header=$message_part;
+    my $part_body;
+    if ($message_part=~ /^\s*\n/) {
+	# no header... use defaults
+	$part_body=$message_part;
+	$part_header="Content-type: text/plain; charset=us-ascii";
+    } elsif ($part_header=~s/\r?\n\r?\n(.*)$//s) {
+	$part_body=$1;
+    } else {
+	# something's gone wrong...
+	$part_header="";
+	$part_body=$message_part;
+    }
+    
+    $part_header =~ s/\r?\n[\t\ ]+/ /gs; #unfold
+    my $part_content_type="";
+    my $part_content_info="";
+
+    if ($part_header =~ m@^content\-type:\s*([\w\.\-/]+)\s*(\;.*)?$@mi) {
+	$part_content_type=$1; $part_content_type =~ tr/A-Z/a-z/;
+	$part_content_info=$2;
+	if (!defined($part_content_info)) {
+	    $part_content_info="";
+	} else {
+	    $part_content_info =~ s/^\;\s*//;
+	    $part_content_info =~ s/\s*$//;
+	}
+    }
+    my $filename="";
+    if ($part_header =~ m@name=\"?([^\"\n]+)\"?@mis) {
+	$filename=$1;
+	$filename =~ s@\r?\s*$@@; # remove trailing space, if any
+	# decode the filename
+	$self->decode_header_value($default_header_encoding, \$filename);
+
+    }
+    
+    # disposition - either inline or attachment.
+    # NOT CURRENTLY USED - we display all text types instead...
+    # $part_header =~ /^content\-disposition:\s*([\w+])/mis;
+    
+    # add <<attachment>> to each part except the first...
+    if (!$is_first_part) {
+	$return_text.="\n<p><hr><strong>&lt;&lt;attachment&gt;&gt;";
+	# add part info header
+	my $header_text = "<br>Type: $part_content_type<br>\n";
+	if ($filename ne "") {
+	    $header_text .= "Filename: $filename\n";
+	}
+	$header_text =~ s@_@\\_@g;
+	$return_text .= $header_text . "</strong></p>\n<p>\n";
+    }
+
+    if ($part_content_type =~ m@text/@)
+    {
+	# $message_part includes the mime part headers
+	my $part_text = $self->text_from_part($message_part);
+	if ($part_content_type !~ m@text/(ht|x)ml@) {
+	    $part_text = text_into_html($part_text);
+	}
+	if ($part_text eq "") {
+	    $part_text = ' ';
+	}
+	$return_text .= $part_text;
+    } elsif ($part_content_type =~ m@message/rfc822@) {
+	# This is a forwarded message
+	my $message_part_headers=$part_body;
+	$message_part_headers=~s/\r?\n\r?\n(.*)$//s;
+	my $message_part_body=$1;
+	$message_part_headers =~ s/\r?\n[\t\ ]+/ /gs; #unfold
+	
+	my $rfc822_formatted_body=""; # put result in here
+	if ($message_part_headers =~
+	    /^content\-type:\s*([\w\.\-\/]+)\s*(\;.*)?$/ims)
+	{
+	    # The message header uses MIME flags
+	    my $message_content_type=$1;
+	    my $message_content_info=$2;
+	    if (!defined($message_content_info)) {
+		$message_content_info="";
+	    } else {
+		$message_content_info =~ s/^\;\s*//;
+		$message_content_info =~ s/\s*$//;
+	    }
+	    $message_content_type =~ tr/A-Z/a-z/;
+	    if ($message_content_type =~ /multipart/) {
+		$rfc822_formatted_body=
+		    $self->text_from_mime_message($message_content_type,
+						  $message_content_info,
+						  $default_header_encoding,
+						  $message_part_body);
+	    } else {
+		$message_part_body=$self->text_from_part($part_body,
+							$message_part_headers);
+		$rfc822_formatted_body=text_into_html($message_part_body);
+	    }
+	} else {
+	    # message doesn't use MIME flags
+	    $rfc822_formatted_body=text_into_html($message_part_body);
+	    $rfc822_formatted_body =~ s@_@\\_@g;
+	}
+	# Add the returned text to the output
+	# don't put all the headers...
+#	$message_part_headers =~ s/^(X\-.*|received|message\-id|return\-path):.*\n//img;
+	my $brief_headers=get_brief_headers($message_part_headers);
+	$return_text.=text_into_html($brief_headers);
+	$return_text.="</p><p>\n";
+	$return_text.=$rfc822_formatted_body;
+	$return_text.="</p>\n";
+	# end of message/rfc822
+    } elsif ($part_content_type =~ /multipart/) { 
+	# recurse again
+	
+	my $tmptext= $self->text_from_mime_message($part_content_type,
+						   $part_content_info,
+						   $default_header_encoding,
+						   $part_body);
+	$return_text.=$tmptext;
+    } else {
+	# this part isn't text/* or another message...
+	if ($is_first_part) {
+	    # this is the first part of a multipart, or only part!
+	    $return_text="\n<p><hr><strong>&lt;&lt;attachment&gt;&gt;";
+	    # add part info header
+	    my $header_text="<br>Type: $part_content_type<br>\n";
+	    $header_text.="Filename: $filename</strong></p>\n<p>\n";
+	    $header_text =~ s@_@\\_@g;
+	    $return_text.=$header_text;
+	}
+	
+	# save attachment by default
+	if (!$self->{'no_attachments'}
+	    && $filename ne "") { # this part has a file...
+	    my $encoding="8bit";
+	    if ($part_header =~
+		/^content-transfer-encoding:\s*(\w+)/mi ) {
+		$encoding=$1; $encoding =~ tr/A-Z/a-z/;
+	    }
+	    my $tmpdir=&util::filename_cat($ENV{'GSDLHOME'}, "tmp");
+	    my $save_filename=$filename;
+	    
+	    # make sure we don't clobber files with same name;
+	    # need to keep state between .mbx files
+	    my $assoc_files=$self->{'assoc_filenames'};
+	    if ($assoc_files->{$filename}) { # it's been set...
+		$assoc_files->{$filename}++;
+		$filename =~ m/(.+)\.(\w+)$/;
+		my ($filestem, $ext)=($1,$2);
+		$save_filename="${filestem}_"
+		    . $assoc_files->{$filename} . ".$ext";
+	    } else { # first file with this name
+		$assoc_files->{$filename}=1;
+	    }
+	    my $tmp_filename = &util::filename_cat($tmpdir, $save_filename);
+	    open (SAVE, ">$tmp_filename") ||
+		warn "EMAILPlug: Can't save attachment as $tmp_filename: $!";
+	    binmode(SAVE); # needed on Windows
+	    my $part_text = $message_part;
+	    $part_text =~ s/(.*?)\r?\n\r?\n//s; # remove header
+	    if ($encoding eq "base64") {
+		print SAVE base64_decode($part_text);
+	    } elsif ($encoding eq "quoted-printable") {
+		print SAVE qp_decode($part_text);
+	    } else { # 7bit, 8bit, binary, etc...
+		print SAVE $part_text;
+	    }
+	    close SAVE;
+	    my $doc_obj=$self->{'doc_obj'};
+	    $doc_obj->associate_file("$tmp_filename",
+				     "$save_filename",
+				     $part_content_type # mimetype
+				     );
+	    # add this file to the list of tmp files for deleting later
+	    push(@{$self->{'tmp_file_paths'}}, $tmp_filename);
+
+	    my $outhandle=$self->{'outhandle'};
+	    print $outhandle "EmailPlugin: saving attachment \"$filename\"\n"; #
+	    
+	    # be nice if "download" was a translatable macro :(
+	    $return_text .="<a href=\"_httpdocimg_/$save_filename\">download</a>";
+	} # end of save attachment
+    } # end of !text/message part
+
+
+    return $return_text;
+}
+
+
+# Return only the "important" headers from a set of message headers
+sub get_brief_headers {
+    my $msg_header = shift;
+    my $brief_header = "";
+
+    # Order matters!
+    if ($msg_header =~ /^(From:.*)$/im) {$brief_header.="$1\n";}
+    if ($msg_header =~ /^(To:.*)$/im) {$brief_header.="$1\n";}
+    if ($msg_header =~ /^(Cc:.*)$/im) {$brief_header.="$1\n";}
+    if ($msg_header =~ /^(Subject:.*)$/im) {$brief_header.="$1\n";}
+    if ($msg_header =~ /^(Date:.*)$/im) {$brief_header.="$1\n";}
+
+    return $brief_header;
+}
+
+
+# Process a MIME part. Return "" if we can't decode it.
+# should only be called for parts with type "text/*" ?
+# Either pass the entire mime part (including the part's header),
+# or pass the mime part's text and optionally the part's header.
+sub text_from_part {
+    my $self = shift;
+    my $text = shift || '';
+    my $part_header = shift;
+
+
+    my $type="text/plain"; # default, overridden from part header
+    my $charset=undef;     # convert2unicode() will guess if necessary
+
+    if (! $part_header) { # no header argument was given. check the body
+	$part_header = $text;
+	# check for empty part header (leading blank line)
+	if ($text =~ /^\s*\r?\n/) {
+	    $part_header="Content-type: text/plain; charset=us-ascii";
+	} else {
+	    $part_header =~ s/\r?\n\r?\n(.*)$//s;
+	    $text=$1; if (!defined($text)) {$text="";}
+	}
+	$part_header =~ s/\r?\n[\t ]+/ /gs; #unfold
+    }
+
+    if ($part_header =~
+	/content\-type:\s*([\w\.\-\/]+).*?charset=\"?([^\;\"\s]+)\"?/is) {
+	$type=$1;
+	$charset=$2;
+    }
+    my $encoding="";
+    if ($part_header =~ /^content\-transfer\-encoding:\s*([^\s]+)/mis) {
+	$encoding=$1; $encoding=~tr/A-Z/a-z/;
+    }
+    # Content-Transfer-Encoding is per-part
+    if ($encoding ne "") {
+	if ($encoding =~ /quoted\-printable/) {
+	    $text=qp_decode($text);
+	} elsif ($encoding =~ /base64/) {
+	    $text=base64_decode($text);
+	} elsif ($encoding !~ /[78]bit/) { # leave 7/8 bit as is.
+	    # rfc2045 also allows binary, which we ignore (for now).
+	    my $outhandle=$self->{'outhandle'};
+	    print $outhandle "EmailPlugin: unknown transfer encoding: $encoding\n";
+	    return "";
+	}
+    }
+
+    if ($type eq "text/html") {
+	# only get stuff between <body> tags, or <html> tags.
+	$text =~ s@^.*<html[^>]*>@@is;
+	$text =~ s@</html>.*$@@is;
+	$text =~ s/^.*?<body[^>]*>//si;
+	$text =~ s/<\/body>.*$//si;
+    }
+    elsif ($type eq "text/xml") {
+	$text=~s/</&lt;/g;$text=~s/>/&gt;/g;
+	$text="<pre>\n$text\n</pre>\n";
+    }
+    # convert to unicode
+    $self->convert2unicode($charset, \$text);
+    $text =~ s@_@\\_@g; # protect against GS macro language
+    return $text;
+}
+
+
+
+
+# decode quoted-printable text
+sub qp_decode {
+    my $text=shift;
+
+    # if a line ends with "=\s*", it is a soft line break, otherwise
+    # keep in any newline characters.
+
+    $text =~ s/=\s*\r?\n//mg;
+    $text =~ s/=([0-9A-Fa-f]{2})/chr (hex "0x$1")/eg;
+    return $text;
+}
+
+# decode base64 text. This is fairly slow (since it's interpreted perl rather
+# than compiled XS stuff like in the ::MIME modules, but this is more portable
+# for us at least).
+# see rfc2045 for description, but basically, bits 7 and 8 are set to zero;
+# 4 bytes of encoded text become 3 bytes of binary - remove 2 highest bits
+# from each encoded byte.
+
+
+sub base64_decode {
+    my $enc_text = shift;
+# A=>0, B=>1, ..., '+'=>62, '/'=>63
+# also '=' is used for padding at the end, but we remove it anyway.
+    my $mimechars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+# map each MIME char into it's value, for more efficient lookup.
+    my %index;
+    map { $index{$_} = index ($mimechars, $_) } (split ('', $mimechars));
+# remove all non-base64 chars. eval to get variable in transliteration...
+# also remove '=' - we'll assume (!!) that there are no errors in the encoding
+    eval "\$enc_text =~ tr|$mimechars||cd";
+    my $decoded="";
+    while (length ($enc_text)>3)
+    { 
+	my $fourchars=substr($enc_text,0,4,"");
+	my @chars=(split '',$fourchars);
+	$decoded.=chr( $index{$chars[0]}        << 2 | $index{$chars[1]} >> 4);
+	$decoded.=chr( ($index{$chars[1]} & 15) << 4 | $index{$chars[2]} >> 2);
+	$decoded.=chr( ($index{$chars[2]} & 3 ) << 6 |  $index{$chars[3]});
+    } 
+# if there are any input chars left, there are either
+# 2 encoded bytes (-> 1 raw byte) left or 3 encoded (-> 2 raw) bytes left.
+    my @chars=(split '',$enc_text);
+    if (length($enc_text)) {
+	$decoded.=chr($index{$chars[0]} << 2 | (int $index{$chars[1]} >> 4));
+    } 
+    if (length($enc_text)==3) {
+	$decoded.=chr( ($index{$chars[1]} & 15) << 4 | $index{$chars[2]} >> 2);
+    }
+    return $decoded;
+}
+
+# returns 0 if valid utf-8, 1 if invalid
+sub is_utf8 {
+    my $self = shift;
+    my $textref = shift;
+
+    $$textref =~ m/^/g; # to set \G
+    my $badbytesfound=0;
+    while ($$textref =~ m!\G.*?([\x80-\xff]+)!sg) {
+	my $highbytes=$1;
+	my $highbyteslength=length($highbytes);
+	# replace any non utf8 complaint bytes
+	$highbytes =~ /^/g; # set pos()
+	while ($highbytes =~
+	       m!\G (?: [\xc0-\xdf][\x80-\xbf] | # 2 byte utf-8
+		     [\xe0-\xef][\x80-\xbf]{2} | # 3 byte
+		     [\xf0-\xf7][\x80-\xbf]{3} | # 4 byte
+		     [\xf8-\xfb][\x80-\xbf]{4} | # 5 byte
+		     [\xfc-\xfd][\x80-\xbf]{5}   # 6 byte
+		     )*([\x80-\xff])? !xg
+	       ) {
+	    my $badbyte=$1;
+	    if (!defined $badbyte) {next} # hit end of string
+	    return 1;
+	}
+    }
+    return 0;
+}
+
+# words with non ascii characters in header values must be encoded in the 
+# following manner =?<charset>?[BQ]?<data>?= (rfc2047)
+
+sub decode_header_value {
+    my $self = shift(@_);
+    my ($default_header_encoding, $textref) = @_;
+    
+    if (!$$textref) {
+	# nothing to do!
+	return;
+    }
+    my $value = $$textref;
+    # decode headers if stored using =?<charset>?[BQ]?<data>?= (rfc2047)
+    if ($value =~ /=\?.*\?[BbQq]\?.*\?=/) {
+	my $original_value=$value;
+	my $encoded=$value;
+	$value="";
+	# we should ignore spaces between consecutive encoded-texts
+	$encoded =~ s@\?=\s+=\?@\?==\?@g;
+	while ($encoded =~ s/(.*?)=\?([^\?]*)\?([bq])\?([^\?]+)\?=//i) {
+	    my ($charset, $encoding, $data)=($2,$3,$4);
+	    my ($decoded_data);
+	    my $leading_chars = "$1";
+	    $self->convert2unicode($default_header_encoding, \$leading_chars);
+	    $value.=$leading_chars; 
+	    
+	    $data=~s/^\s*//; $data=~s/\s*$//; # strip whitespace from ends
+	    chomp $data;
+	    $encoding =~ tr/BQ/bq/;
+	    if ($encoding eq "q") { # quoted printable
+		$data =~ s/_/\ /g;  # from rfc2047 (sec 4.2.2)
+		$decoded_data=qp_decode($data);
+		# qp_decode adds \n, which is default for body text
+		chomp($decoded_data);
+	    } else { # base 64
+		$decoded_data=base64_decode($data);
+	    }
+	    $self->convert2unicode($charset, \$decoded_data);
+	    $value .= $decoded_data;
+	} # end of while loop
+	
+	# get any trailing characters
+	$self->convert2unicode($default_header_encoding, \$encoded);
+	$value.=$encoded;
+	
+	if ($value =~ /^\s*$/) { # we couldn't extract anything...
+	    $self->convert2unicode($default_header_encoding,
+				   \$original_value);
+	    $value=$original_value;
+	}
+	$$textref = $value;
+    } # end of if =?...?=
+    
+    # In the absense of other charset information, assume the
+    # header is the default (usually "iso_8859_1") and convert to unicode.
+    else {
+	$self->convert2unicode($default_header_encoding, $textref);
+    }   
+    
+}
+
+
+
+sub convert2unicode {
+  my $self = shift(@_);
+  my ($charset, $textref) = @_;
+
+  if (!$$textref) {
+      # nothing to do!
+      return;
+  }
+
+  if (! defined $charset) {
+      # check if we have valid utf-8
+      if ($self->is_utf8($textref)) { $charset = "utf8" }
+
+      # default to latin
+      $charset = "iso_8859_1" if ! defined($charset);
+  }
+
+  # first get our character encoding name in the right form.
+  $charset =~ tr/A-Z/a-z/; # lowercase
+  $charset =~ s/\-/_/g;
+  if ($charset =~ /gb_?2312/) { $charset="gb" }
+  # assumes EUC-KR, not ISO-2022 !?
+  $charset =~ s/^ks_c_5601_1987/korean/;
+  if ($charset eq 'utf_8') {$charset='utf8'}
+
+  my $outhandle = $self->{'outhandle'};
+
+  if ($charset eq "utf8") {
+      # no conversion needed, but lets check that it's valid utf8
+      # see utf-8 manpage for valid ranges
+      $$textref =~ m/^/g; # to set \G
+      my $badbytesfound=0;
+      while ($$textref =~ m!\G.*?([\x80-\xff]+)!sg) {
+	  my $highbytes=$1;
+	  my $highbyteslength=length($highbytes);
+	  # replace any non utf8 complaint bytes
+	  $highbytes =~ /^/g; # set pos()
+	  while ($highbytes =~
+		 m!\G (?: [\xc0-\xdf][\x80-\xbf] | # 2 byte utf-8
+		       [\xe0-\xef][\x80-\xbf]{2} | # 3 byte
+		       [\xf0-\xf7][\x80-\xbf]{3} | # 4 byte
+		       [\xf8-\xfb][\x80-\xbf]{4} | # 5 byte
+		       [\xfc-\xfd][\x80-\xbf]{5}   # 6 byte
+		       )*([\x80-\xff])? !xg
+		 ) {
+	      my $badbyte=$1;
+	      if (!defined $badbyte) {next} # hit end of string
+	      my $pos=pos($highbytes);
+	      substr($highbytes, $pos-1, 1, "\xc2\x80");
+	      # update the position to continue searching (for \G)
+	      pos($highbytes) = $pos+1; # set to just after the \x80
+	      $badbytesfound=1;
+	  }
+	  if ($badbytesfound==1) {
+	      # claims to be utf8, but it isn't!
+	      print $outhandle "EmailPlugin: Headers claim utf-8 but bad bytes "
+		  . "detected and removed.\n";
+
+	      my $replength=length($highbytes);
+	      my $textpos=pos($$textref);
+	      # replace bad bytes with good bytes
+	      substr( $$textref, $textpos-$replength,
+		      $replength, $highbytes);
+	      # update the position to continue searching (for \G)
+	      pos($$textref)=$textpos+($replength-$highbyteslength);
+	  }
+      }
+      return;
+  }
+
+  # It appears that we can't always trust ascii text so we'll treat it
+  # as iso-8859-1 (letting characters above 0x80 through without
+  # converting them to utf-8 will result in invalid XML documents
+  # which can't be parsed at build time).
+  $charset = "iso_8859_1" if ($charset eq "us_ascii" || $charset eq "ascii");
+
+  if ($charset eq "iso_8859_1") {
+      # test if the mailer lied, and it has win1252 chars in it...
+      # 1252 has characters between 0x80 and 0x9f, 8859-1 doesn't
+      if ($$textref =~ m/[\x80-\x9f]/) {
+	  print $outhandle "EmailPlugin: Headers claim ISO charset but MS ";
+	  print $outhandle "codepage 1252 detected.\n";
+	  $charset = "windows_1252";
+      }
+  }
+  my $utf8_text=&unicode::unicode2utf8(&unicode::convert2unicode($charset,$textref));
+
+  if ($utf8_text ne "") {
+      $$textref=$utf8_text;
+  } else {
+      # we didn't get any text... unsupported encoding perhaps? Or it is
+      # empty anyway. We'll try to continue, assuming 8859-1. We could strip
+      # characters out here if this causes problems...
+      my $outhandle=$self->{'outhandle'};
+      print $outhandle "EmailPlugin: falling back to iso-8859-1\n";
+      $$textref=&unicode::unicode2utf8(&unicode::convert2unicode("iso_8859_1",$textref));
+
+  }
+}
+
+sub get_base_OID {
+    my $self = shift(@_);
+    my ($doc_obj) = @_;
+
+    if ($self->{'OIDtype'} eq "message_id") {
+	# temporarily set OIDtype to hash to get a base id
+	$self->{'OIDtype'} = "hash_on_ga_xml";
+	my $id = $self->SUPER::get_base_OID(@_);
+	$self->{'OIDtype'} = "message_id";
+	return $id;
+    }
+    return $self->SUPER::get_base_OID(@_);
+}
+
+
+sub add_OID {
+    my $self = shift (@_);
+    my ($doc_obj, $id, $segment_number) = @_;
+    if ($self->{'OIDtype'} eq "message_id" && exists $doc_obj->{'msgid'} ) {
+	$doc_obj->set_OID($doc_obj->{'msgid'});
+    }
+    else {
+	$doc_obj->set_OID("$id\_$segment_number");
+    }
+}
+
+
+# Perl packages have to return true if they are run.
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/EmbeddedMetadataPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/EmbeddedMetadataPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/EmbeddedMetadataPlugin.pm	(revision 24799)
@@ -0,0 +1,407 @@
+###########################################################################
+#
+# EmbeddedMetadataPlugin.pm -- A plugin for EXIF
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright 2007 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+
+package EmbeddedMetadataPlugin;
+
+use BasePlugin;
+
+use Encode;
+use Image::ExifTool qw(:Public);
+use strict;
+
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+
+sub BEGIN
+{
+	@EmbeddedMetadataPlugin::ISA = ('BasePlugin');
+	binmode(STDERR, ":utf8");
+}
+
+my $encoding_plus_auto_list = [{ 
+		'name' => "auto",
+		'desc' => "{ReadTextFile.input_encoding.auto}" }];
+push(@{$encoding_plus_auto_list},@{$BasePlugin::encoding_list});
+
+my $arguments = [{ 
+	'name' => "metadata_field_separator",
+	'desc' => "{HTMLPlugin.metadata_field_separator}",
+	'type' => "string",
+	'deft' => "" 
+	},{ 
+	'name' => "input_encoding",
+	'desc' => "{ReadTextFile.input_encoding}",
+	'type' => "enum",
+	'list' => $encoding_plus_auto_list,
+	'reqd' => "no",
+	'deft' => "auto" 
+	},{
+	'name' => "join_before_split",
+	'desc' => "{EmbeddedMetadataPlugin.join_before_split}",
+	'type' => "flag"
+	},{
+	'name' => "join_character",
+	'desc' => "{EmbeddedMetadataPlugin.join_character}",
+	'type' => "string",
+	'deft' => " "
+	},{
+	'name' => "trim_whitespace",
+	'desc' => "{EmbeddedMetadataPlugin.trim_whitespace}",
+	'type' => "enum",
+	'list' => [{'name' => "true", 'desc' => "{common.true}"}, {'name' => "false", 'desc' => "{common.false}"}],
+	'deft' => "true"
+	},{
+	'name' => "set_filter_list",
+	'desc' => "{EmbeddedMetadataPlugin.set_filter_list}",
+	'type' => "string"
+	},{
+	'name' => "set_filter_regexp",
+	'desc' => "{EmbeddedMetadataPlugin.set_filter_regexp}",
+	'type' => "string",
+	'deft' => ".*" #If changing this default, also need to update the constructor
+	}];
+
+my $options = { 
+	'name'     => "EmbeddedMetadataPlugin",
+	'desc'     => "{EmbeddedMetadataPlugin.desc}",
+	'abstract' => "no",
+	'inherits' => "yes",
+	'args'     => $arguments };
+
+sub new()
+{
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    if(defined $arguments){ push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});}
+    if(defined $options) { push(@{$hashArgOptLists->{"OptList"}},$options)};
+
+    my $self = new BasePlugin($pluginlist, $inputargs, $hashArgOptLists);
+
+    # Create a new Image::ExifTool object
+    my $exifTool = new Image::ExifTool;
+    $exifTool->Options(Duplicates => 0);
+	$exifTool->Options(PrintConv => 0);
+    $exifTool->Options(Unknown => 1);
+    $exifTool->Options('Verbose');
+    $self->{'exiftool'} = $exifTool;
+	
+	my $setFilterList = $self->{'set_filter_list'};
+	my $setFilterRegexp = $self->{'set_filter_regexp'};
+	if ((defined $setFilterList) && ($setFilterList ne ""))
+	{
+		if ((defined $setFilterRegexp) && ($setFilterRegexp ne ".*") && ($setFilterRegexp ne ""))
+		{
+			my $outhandle = $self->{'outhandle'};
+			print $outhandle "Warning: can only specify 'set_filter_list' or 'set_filter_regexp'\n";
+			print $outhandle "         defaulting to 'set_filter_list'\n";
+		}
+
+		my @sets = split(/,/,$setFilterList);
+		my @sets_bracketed;
+		foreach my $s (@sets)
+		{
+			$s =~ s/^(ex\.)?(.*)$/(ex.$2)/;
+			push (@sets_bracketed, $s);
+		}
+
+		my $setFilterRegexp = join("|",@sets_bracketed);
+		$self->{'set_filter_regexp'} = $setFilterRegexp;
+	}
+
+    return bless $self, $class;
+}
+
+
+# Need to think some more about this
+sub get_default_process_exp()
+{
+    return ".*";
+    #q^(?i)\.(wma|wmv|jpe?g|gif)$^;
+}
+
+
+# This plugin doesn't block any files 
+#sub get_default_block_exp()
+#{
+#    return '';
+#}
+
+# plugins that rely on more than process_exp (eg XML plugins) can override this method
+sub can_process_this_file {
+    my $self = shift(@_);
+
+    # we process metadata, not the file 
+    return 0;    
+}
+
+# Even if a plugin can extract metadata in its metadata_read pass,
+# make the default return 'undef' so processing of the file continues
+# down the pipeline, so other plugins can also have the opportunity to
+# locate metadata and set it up in the extrametakeys variables that
+# are passed around.
+
+sub can_process_this_file_for_metadata {
+    my $self = shift(@_);
+
+    # this plugin will look for metadata in any file through its
+    # metadata_read(). Returning undef here means anything else further
+    # down the pipeline can do the same
+
+    return undef;
+}
+
+sub checkAgainstFilters
+{
+	my $self = shift(@_);
+	my $name = shift(@_);
+	
+	my $setFilterRegexp = $self->{'set_filter_regexp'};
+	if((defined $setFilterRegexp) && ($setFilterRegexp ne ""))
+	{
+		return ($name =~ m/($setFilterRegexp)/i);
+	}
+	else
+	{
+		return 1;
+	}
+}
+
+sub extractEmbeddedMetadata()
+{
+    my $self = shift(@_);
+    my ($file, $filename, $extrametadata, $extrametakeys) = @_;
+ 
+    my %exif_metadata = ();
+
+    my $verbosity = $self->{'verbosity'};
+    my $outhandle = $self->{'outhandle'};
+
+    my $metadata_count = 0;
+    
+    my $separator = $self->{'metadata_field_separator'};
+    if ($separator eq "") {
+		undef $separator;
+    }
+
+    my @group_list = Image::ExifTool::GetAllGroups(0);
+    foreach my $group (@group_list) {
+##	print STDERR "**** group = $group\n";
+
+		# Extract meta information from an image
+		$self->{'exiftool'}->Options(Group0 => [$group]);
+		$self->{'exiftool'}->ExtractInfo($filename);
+
+		# Get list of tags in the order they were found in the file
+		my @tag_list = $self->{'exiftool'}->GetFoundTags('File');
+		foreach my $tag (@tag_list) {
+
+            # Strip any numbering suffix
+			$tag =~ s/^([^\s]+)\s.*$/$1/i;
+			my $value = $self->{'exiftool'}->GetValue($tag);
+			if (defined $value && $value =~ /[a-z0-9]+/i) {
+				my $field = "ex.$group.$tag";
+		
+				my $encoding = $self->{'input_encoding'};
+				if($encoding eq "auto")
+				{
+					$encoding = "utf8"
+				}
+
+				if (!defined $exif_metadata{$field})
+				{
+					$exif_metadata{$field} = [];
+				}
+
+				$field = Encode::decode($encoding,$field);
+				my $metadata_done = 0;
+				if (ref $value eq 'SCALAR') {
+					if ($$value =~ /^Binary data/) {
+						$value = "($$value)";
+					}
+                    else {
+						my $len = length($$value);
+						$value = "(Binary data $len bytes)";
+					}
+				}
+				elsif (ref $value eq 'ARRAY') {
+					$metadata_done = 1;
+					
+					my $allvals = "";
+					foreach my $v (@$value) {
+						$v = Encode::decode($encoding,$v);
+						
+						if(!$self->{'join_before_split'}){
+							if (defined $separator) {
+								my @vs = split($separator, $v);
+								foreach my $val (@vs) {
+									if ($val =~ /\S/) {
+										push (@{$exif_metadata{$field}}, $self->gsSafe($val)) if $self->checkAgainstFilters($field);
+										++$metadata_count;
+									}
+								}
+							}
+							else
+							{
+								push (@{$exif_metadata{$field}}, $self->gsSafe($v)) if $self->checkAgainstFilters($field);
+								++$metadata_count;
+							}
+						}
+						else{
+							if($allvals ne ""){
+								$allvals = $allvals . $self->{'join_character'};
+							}
+							$allvals = $allvals . $v;
+						}
+					}
+					
+					if($self->{'join_before_split'}){
+						if (defined $separator) {
+							my @vs = split($separator, $allvals);
+							foreach my $val (@vs) {
+								if ($val =~ /\S/) {
+									push (@{$exif_metadata{$field}}, $self->gsSafe($val)) if $self->checkAgainstFilters($field);
+									++$metadata_count;
+								}
+							}
+						}
+						else
+						{
+							push (@{$exif_metadata{$field}}, $self->gsSafe($allvals)) if $self->checkAgainstFilters($field);
+							++$metadata_count;
+						}
+					}
+				}
+				else {
+					$value = Encode::decode($encoding,$value);
+					if (defined $separator) {
+						my @vs = split($separator, $value);
+						$metadata_done = 1;
+						foreach my $v (@vs) {
+							if ($v =~ /\S/) {
+								push (@{$exif_metadata{$field}}, $self->gsSafe($v)) if $self->checkAgainstFilters($field);
+								++$metadata_count; 
+							}
+						}
+					}
+				}
+				if (!$metadata_done) {
+					push (@{$exif_metadata{$field}}, $self->gsSafe($value)) if $self->checkAgainstFilters($field);
+					++$metadata_count;
+				}
+			}
+		}
+	}
+
+    if ($metadata_count > 0) {
+		print $outhandle " Extracted $metadata_count pieces of metadata from $filename EXIF block\n";
+    }
+
+    # Protect windows directory chars \
+    $file = &util::filename_to_regex($file);
+    
+    # Associate the metadata now
+
+    if (defined $extrametadata->{$file}) {
+	print STDERR "\n****  Need to merge new metadata with existing stored metadata: file = $file\n" if $verbosity > 2;
+
+	my $file_metadata_table =     $extrametadata->{$file};
+
+	foreach my $metaname (keys %exif_metadata) {
+	    # will create new entry if one does not already exist
+	    push(@{$file_metadata_table->{$metaname}}, @{$exif_metadata{$metaname}});	    
+	}
+
+	# no need to push $file on to $extrametakeys as it is already in the list
+    }
+    else {
+	$extrametadata->{$file} = \%exif_metadata;
+	push(@$extrametakeys, $file);
+    }
+
+}
+
+
+sub metadata_read
+{
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $block_hash, 
+	$extrametakeys, $extrametadata, $extrametafile,
+	$processor, $gli, $aux) = @_;
+ 
+    my ($filename_full_path, $filename_no_path) = &util::get_full_filenames($base_dir, $file);
+    
+    # we don't want to process directories
+    if (!-f $filename_full_path) {
+	return undef;
+    }
+    print STDERR "\n<Processing n='$file' p='EmbeddedMetadataPlugin'>\n" if ($gli);
+    print STDERR "EmbeddedMetadataPlugin: processing $file\n" if ($self->{'verbosity'}) > 1;
+    
+    $self->extractEmbeddedMetadata($filename_no_path,$filename_full_path,
+				   $extrametadata,$extrametakeys);
+    
+    return undef;
+}
+
+sub read
+{
+    return undef;
+}
+
+sub process
+{
+    # not used
+    return undef;
+}
+
+sub gsSafe() {
+	my $self = shift(@_);
+	my ($text) = @_;
+	
+	# Replace potentially problematic characters
+	$text =~ s/\(/&#40;/g;
+	$text =~ s/\)/&#41;/g;
+	$text =~ s/,/&#44;/g;
+	$text =~ s/\</&#60;/g;
+	$text =~ s/\>/&#62;/g;
+	$text =~ s/\[/&#91;/g;
+	$text =~ s/\]/&#93;/g;
+	$text =~ s/\{/&#123;/g;
+	$text =~ s/\}/&#125;/g;
+	# Done
+	
+	if ($self->{'trim_whitespace'} eq "true"){
+		$text =~ s/^\s+//;
+		$text =~ s/\s+$//;
+	}
+	
+	return $text;
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/ExcelPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/ExcelPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/ExcelPlugin.pm	(revision 24799)
@@ -0,0 +1,192 @@
+###########################################################################
+#
+# ExcelPlugin.pm -- plugin for importing Microsoft Excel files.
+#  (basic version supports versions 95 and 97)
+#  (through OpenOffice extension, supports all contempoary formats)
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2002 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package ExcelPlugin;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+no strict 'subs';
+use gsprintf 'gsprintf';
+
+use AutoLoadConverters;
+use ConvertBinaryFile;
+
+sub BEGIN {
+    @ExcelPlugin::ISA = ('ConvertBinaryFile', 'AutoLoadConverters');
+}
+
+my $openoffice_available = 0;
+
+my $arguments = 
+    [ { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'reqd' => "no",
+	'deft' => "&get_default_process_exp()"  # delayed (see below)
+	}
+      ];
+
+my $options = { 'name'     => "ExcelPlugin",
+		'desc'     => "{ExcelPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'srcreplaceable' => "yes", # Source docs in Excel format can be replaced with GS-generated html
+		'args'     => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+    
+    # this bit needs to happen later after the arguments array has been 
+    # finished - used for parsing the input args.
+    # push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    # this one needs to go in first, to get the print info in the right order
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $auto_converter_self = new AutoLoadConverters($pluginlist,$inputargs,$hashArgOptLists,["OpenOfficeConverter"],1);
+
+    if ($auto_converter_self->{'openoffice_available'}) {
+	$openoffice_available = 1;
+    } 
+
+    # evaluate the default for process_exp  - it needs to be delayed till here so we know if openoffice is available or not. But needs to be done before parsing the args.
+    foreach my $a (@$arguments) {
+	if ($a->{'name'} eq "process_exp") {
+	    my $eval_expr = $a->{'deft'};
+	    $a->{'deft'} = eval "$eval_expr";
+	    last;
+	}
+    }
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    my $cbf_self = new ConvertBinaryFile($pluginlist, $inputargs, $hashArgOptLists);
+    my $self = BasePlugin::merge_inheritance($auto_converter_self, $cbf_self);
+
+    
+    if ($self->{'info_only'}) {
+	# don't worry about any options etc
+	return bless $self, $class;
+    }
+
+    $self = bless $self, $class;
+    $self->{'file_type'} = "Excel";
+
+    my $outhandle = $self->{'outhandle'};
+
+    # check convert_to
+    if ($self->{'convert_to'} eq "auto") {
+	$self->{'convert_to'} = "html";
+    }
+
+    # set convert_to_plugin and convert_to_ext
+    $self->set_standard_convert_settings();
+
+    my $secondary_plugin_name = $self->{'convert_to_plugin'};
+    my $secondary_plugin_options = $self->{'secondary_plugin_options'};
+
+    if (!defined $secondary_plugin_options->{$secondary_plugin_name}) {
+	$secondary_plugin_options->{$secondary_plugin_name} = [];
+    }
+    my $specific_options = $secondary_plugin_options->{$secondary_plugin_name};
+
+    push(@$specific_options,"-extract_language") if $self->{'extract_language'};
+    push(@$specific_options, "-file_rename_method", "none");
+
+    if ($secondary_plugin_name eq "HTMLPlugin") {
+	push(@$specific_options, "-processing_tmp_files");
+    }
+    
+    $self->load_secondary_plugins($class,$secondary_plugin_options,$hashArgOptLists);
+    return $self;    
+}
+
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+    if ($openoffice_available) {
+	return q^(?i)\.(xls|xlsx|ods)$^;
+    }
+
+    return q^(?i)\.xls$^;
+}
+ 
+sub init {
+    my $self = shift (@_);
+
+    # ConvertBinaryFile init
+    $self->SUPER::init(@_);
+    $self->AutoLoadConverters::init(@_);
+
+}
+
+sub begin {
+    my $self = shift (@_);
+
+    $self->AutoLoadConverters::begin(@_);
+    $self->SUPER::begin(@_);
+
+}
+
+sub deinit {
+    my $self = shift (@_);
+    
+    $self->AutoLoadConverters::deinit(@_);
+    $self->SUPER::deinit(@_);
+
+}
+
+sub tmp_area_convert_file {
+
+    my $self = shift (@_);
+    return $self->AutoLoadConverters::tmp_area_convert_file(@_);
+
+}
+   
+sub convert_post_process_old
+{
+    my $self = shift (@_);
+    my ($conv_filename) = @_;
+    
+    my $outhandle=$self->{'outhandle'};
+    
+    my ($language, $encoding) = $self->textcat_get_language_encoding ($conv_filename);
+    
+    # read in file ($text will be in utf8)
+    my $text = "";
+    $self->read_file ($conv_filename, $encoding, $language, \$text);
+    
+    # turn any high bytes that aren't valid utf-8 into utf-8.
+    #unicode::ensure_utf8(\$text);
+    
+    # Write it out again!
+    #$self->utf8_write_file (\$text, $conv_filename);
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/FOXPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/FOXPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/FOXPlugin.pm	(revision 24799)
@@ -0,0 +1,303 @@
+###########################################################################
+#
+# FOXPlugin.pm
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# plugin to process a Foxbase dbt file. This plugin provides the basic
+# functionality to read in the dbt and dbf files and process each record.
+# This general plugin should be overridden for a particular database to process
+# the appropriate fields in the file.
+
+package FOXPlugin;
+
+use BasePlugin;
+use util;
+use doc;
+use unicode;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+
+sub BEGIN {
+    @FOXPlugin::ISA = ('BasePlugin');
+}
+
+my $arguments =
+    [ { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'reqd' => "no",
+	'deft' => &get_default_process_exp() },
+      { 'name' => "block_exp",
+	'desc' => "{BasePlugin.block_exp}",
+	'type' => "regexp",
+	'reqd' => "no",
+	'deft' => &get_default_block_exp() } ];
+
+my $options = { 'name'     => "FOXPlugin",
+		'desc'     => "{FOXPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new BasePlugin($pluginlist, $inputargs, $hashArgOptLists);
+
+    return bless $self, $class;
+}
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+    return q^(?i)\.dbf$^;
+}
+
+#dbt files are processed at the same time as dbf files
+sub get_default_block_exp {
+    my $self = shift (@_);
+
+    return q^(?i)\.dbt$^;
+}
+
+# return number of files processed, undef if can't process
+# Note that $base_dir might be "" and that $file might 
+# include directories
+sub read {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $block_hash, $metadata, $processor, $maxdocs, $total_count, $gli) = @_;
+ 
+    # can we process this file??
+    my ($filename_full_path, $filename_no_path) = &util::get_full_filenames($base_dir, $file);
+    return undef unless $self->can_process_this_file($filename_full_path);
+
+    print STDERR "<Processing n='$file' p='FOXPlugin'>\n" if ($gli);
+    print STDERR "FOXPlugin: processing $file\n" if $self->{'verbosity'} > 1;
+
+    my ($parent_dir) = $filename_full_path =~ /^(.*)\/[^\/]+\.dbf$/i;
+
+    # open the file
+    if (!open (FOXBASEIN, $filename_full_path)) {
+	if ($gli) {
+	    print STDERR "<ProcessingError n='$file' r='Could not read $filename_full_path'>\n";
+	}
+	print STDERR "FOXPlugin::read - couldn't read $filename_full_path\n";
+	return -1; # error in processing
+    }
+
+    # read in the database header
+    my ($temp, %dbf);
+    
+    # read in information about dbt file
+    if (read (FOXBASEIN, $temp, 32) < 32) {
+	if ($gli) {
+	    print STDERR "<ProcessingError n='$file' r='EOF while reading database header'>\n";
+	}
+	print STDERR "FOXPlugin::read - eof while reading database header\n";
+	close (FOXBASEIN);
+	return -1;
+    }
+    
+    # unpack the header
+    ($dbf{'hasdbt'},
+     $dbf{'modyear'}, $dbf{'modmonth'}, $dbf{'modday'},
+     $dbf{'numrecords'}, $dbf{'headerlen'}, 
+     $dbf{'recordlen'}) = unpack ("CCCCVvv", $temp);
+    
+    # process hasdbt
+    if ($dbf{'hasdbt'} == 131) {
+	$dbf{'hasdbt'} = 1;
+    } elsif ($dbf{'hasdbt'} == 3 || $dbf{'hasdbt'} == 48) {
+	$dbf{'hasdbt'} = 0;
+    } else {
+	if ($gli) {
+	    print STDERR "<ProcessingError n='$file' r='Does not seem to be a Foxbase file'>\n";
+	}
+	print STDERR "FOXPlugin:read - $filename_full_path doesn't seem to be a Foxbase file\n";
+	return -1;
+    }
+
+    # read in the field description
+    $dbf{'numfields'} = 0;
+    $dbf{'fieldinfo'} = [];
+    while (read (FOXBASEIN, $temp, 1) > 0) {
+	last if ($temp eq "\x0d");
+	last if (read (FOXBASEIN, $temp, 31, 1) < 31);
+
+	my %field = ();
+	$field{'name'} = $self->extracttext($temp, 11);
+	($field{'type'}, $field{'pos'}, $field{'len'}, $field{'dp'}) 
+	    = unpack ("x11a1VCC", $temp);
+
+	push (@{$dbf{'fieldinfo'}}, \%field);
+
+	$dbf{'numfields'} ++;
+    }
+
+    # open the dbt file if we need to
+    my $dbtfullname = $filename_full_path;
+    if ($filename_full_path =~ /f$/) {
+	$dbtfullname =~ s/f$/t/;
+    } else {
+	$dbtfullname =~ s/F$/T/;
+    }
+    if ($dbf{'hasdbt'} && !open (DBTIN, $dbtfullname)) {
+	if ($gli) {
+	    print STDERR "<ProcessingError n='$file' r='Could not read $dbtfullname'>\n";
+	}
+	print STDERR "FOXPlugin::read - couldn't read $dbtfullname\n";
+	close (FOXBASEIN);
+	return -1;
+    }
+
+    # read in and process each record in the database
+    my $numrecords = 0;
+    while (($numrecords < $dbf{'numrecords'}) && 
+	   (read (FOXBASEIN, $temp, $dbf{'recordlen'}) == $dbf{'recordlen'})) {
+
+	# create a new record
+	my $record = [];
+	
+	foreach my $field (@{$dbf{'fieldinfo'}}) {
+	    my $fieldvalue = "";
+	    
+	    if ($field->{'type'} eq "M" && $dbf{'hasdbt'}) {
+		# a memo field, look up this field in the dbt file
+		my $seekpos = substr ($temp, $field->{'pos'}, $field->{'len'});
+
+		$seekpos =~ s/^\s*//;
+		$seekpos = 0 unless $seekpos =~ /^\d+$/;
+		
+		$seekpos = $seekpos * 512;
+
+		if ($seekpos == 0) {
+		    # there is no memo field
+
+		} elsif (seek (DBTIN, $seekpos, 0)) {
+		    while (read (DBTIN, $fieldvalue, 512, length($fieldvalue)) > 0) {
+			last if ($fieldvalue =~ /\cZ/);
+		    }
+
+		    # remove everything after the control-Z
+		    substr($fieldvalue, index($fieldvalue, "\cZ")) = "";
+
+		} else {
+		    print STDERR "\nERROR - seek (to $seekpos) failed\n";
+		}
+
+	    } else {
+		# a normal field
+		$fieldvalue = substr ($temp, $field->{'pos'}, $field->{'len'});
+	    }
+
+	    push (@$record, {%$field, 'value'=>$fieldvalue});
+	}
+
+	# process this record
+	$self->process_record ($pluginfo, $base_dir, $file, $metadata, $processor, 
+			       $numrecords, $record);
+	
+	# finished another record...
+	$numrecords++;
+    }
+
+    # close the dbt file if we need to
+    if ($dbf{'hasdbt'}) {
+	close (DBTIN);
+    }
+
+    # close the dbf file
+    close (FOXBASEIN);
+
+    # finished processing
+    return 1;
+}
+
+
+# will extract a string from some larger string, making it
+# conform to a number of constraints
+sub extracttext {
+    my $self = shift (@_);
+    my ($text, $maxlen, $offset, $stopstr) = @_;
+    $offset = 0 unless defined $offset;
+    $stopstr = "\x00" unless defined $stopstr;
+    
+    # decide where the string finishes
+    my $end = index ($text, $stopstr, $offset);
+    $end = length ($text) if $end < 0;
+    $end = $offset+$maxlen if (defined $maxlen) && ($end-$offset > $maxlen);
+    
+    return "" if ($end <= $offset);
+    return substr ($text, $offset, $end-$offset);
+}
+
+
+# process_record should be overriden for a particular type
+# of database. This default version outputs an html document
+# containing all the fields in the record as a table.
+# It also assumes that the text is in utf-8.
+sub process_record {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $metadata, $processor, $numrecords, $record) = @_;
+
+    # create a new document
+    my $doc_obj = new doc ($file, "indexed_doc", $self->{'file_rename_method'});
+
+    $doc_obj->add_utf8_metadata($doc_obj->get_top_section(), "Plugin", "$self->{'plugin_type'}");
+    my $section = $doc_obj->get_top_section();
+
+    $doc_obj->add_metadata($section, "FileFormat", "FOX");
+    $doc_obj->add_metadata($section, "FileSize",   (-s $file));
+
+    # start of document
+    $doc_obj->add_utf8_text($section, "<table>\n");
+
+    # add each field
+    foreach my $field (@$record) {
+	if (defined ($field->{'name'}) && defined ($field->{'value'})) {
+	    $doc_obj->add_utf8_text($section, "  <tr>\n");
+	    $doc_obj->add_utf8_text($section, "    <td>$field->{'name'}</td>\n");
+	    $doc_obj->add_utf8_text($section, "    <td>$field->{'value'}</td>\n");
+	    $doc_obj->add_utf8_text($section, "  </tr>\n");
+	}
+    }
+
+    # end of document
+    $doc_obj->add_utf8_text($section, "</table>\n");
+
+    # add an object id
+    $self->add_OID($doc_obj);
+
+    # process the document
+    $processor->process($doc_obj);
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/FavouritesPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/FavouritesPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/FavouritesPlugin.pm	(revision 24799)
@@ -0,0 +1,111 @@
+###########################################################################
+#
+# FavouritesPlug.pm -- Plugin for Internet Explorer Favourites files
+#                      By Stephen De Gabrielle
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2005 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+# hacked together by Stephen De Gabrielle from various plugins 
+# especially SRCPlug by John McPherson Nov 2000
+
+package FavouritesPlugin;
+
+use ReadTextFile;
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+sub BEGIN {
+    @FavouritesPlugin::ISA = ('ReadTextFile');
+}
+
+my $arguments =
+    [ { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'deft' => &get_default_process_exp(),
+	'reqd' => "no" } ];
+
+my $options = { 'name'     => "FavouritesPlugin",
+		'desc'     => "{FavouritesPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+
+sub new {
+    my ($class) = shift(@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new ReadTextFile($pluginlist, $inputargs, $hashArgOptLists);
+
+    return bless $self, $class;
+}
+
+
+sub get_default_process_exp
+{
+    # URL is extension for single bookmarks under windows.
+    return q^(?i)\.URL$^;
+}
+
+
+# do plugin specific processing of doc_obj
+sub process {
+    my $self = shift (@_);
+    my ($textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    my $section = $doc_obj->get_top_section();
+
+    # don't want mg to turn escape chars into actual values
+    $$textref =~ s/\\/\\\\/g;
+
+    # use filename (minus the .url extension) as the title
+    my $title = $file;
+    $title =~ s/.url$//i;
+    $doc_obj->add_utf8_metadata($section, "Title", $title);
+
+    # get the URL from the file
+    my ($url) = ($$textref =~ m/^URL=(http.+)/mg);
+    $doc_obj->add_metadata($section, "URL", $url);
+
+    # Add weblink metadata for an automatic link to the webpage
+    $doc_obj->add_utf8_metadata($section, "weblink", "<a href=\"$url\">");
+    $doc_obj->add_utf8_metadata($section, "webicon", "_iconworld_");
+    $doc_obj->add_utf8_metadata($section, "/weblink", "</a>");
+
+    # Tidy up the favourite text to look a bit nicer
+    $$textref =~ s/^\\n/<p>/g;
+    $$textref =~ s/\[/<p><strong>/g;
+    $$textref =~ s/\]/<\/strong><p>/g;
+    $$textref =~ s/^Modified=(.+)$/<strong>Modified<\/strong>$1<p>/g;
+    $doc_obj->add_utf8_text($section, "$$textref");
+
+    $doc_obj->add_metadata($section, "FileFormat", "Favourite");
+    return 1;
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/GISExtractor.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/GISExtractor.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/GISExtractor.pm	(revision 24799)
@@ -0,0 +1,350 @@
+###########################################################################
+#
+# GISExtractor.pm -- extension base class to enhance plugins with GIS capabilities
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package GISExtractor;
+
+use PrintInfo;
+
+use util;
+
+use gsprintf 'gsprintf';
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+no strict 'subs';
+
+#field categories in DataBase files
+#$LAT = 3;
+#$LONG = 4;
+my $FC = 9;
+my $DSG = 10;
+#$CC1 = 12;
+my $FULL_NAME = 22;
+
+BEGIN {
+    @GISExtractor::ISA = ('PrintInfo');
+}
+
+
+my $arguments = 
+    [ { 'name' => "extract_placenames",
+	'desc' => "{GISExtractor.extract_placenames}",
+	'type' => "flag",
+	'reqd' => "no" },
+      { 'name' => "gazetteer",
+	'desc' => "{GISExtractor.gazetteer}",
+	'type' => "string",
+	'reqd' => "no" },
+      { 'name' => "place_list",
+	'desc' => "{GISExtractor.place_list}",
+	'type' => "flag",
+	'reqd' => "no" } ];
+
+
+my $options = { 'name'     => "GISExtractor",
+		'desc'     => "{GISExtractor.desc}",
+		'abstract' => "yes",
+		'inherits' => "yes",
+		'args' => $arguments };
+
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    # can we indicate that these are not available if the map data is not there??
+    #if (has_mapdata()) {
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+    #}
+
+    my $self = new PrintInfo($pluginlist, $inputargs, $hashArgOptLists, 1);
+
+    return bless $self, $class;
+
+}
+
+sub initialise_gis_extractor {
+    my $self = shift (@_);
+
+    if ($self->{'extract_placenames'}) {
+	
+	my $outhandle = $self->{'outhandle'};
+	
+	my $places_ref 
+	    = $self->loadGISDatabase($outhandle,$self->{'gazetteer'});
+	
+	if (!defined $places_ref) {
+	    print $outhandle "Warning: Error loading mapdata gazetteer \"$self->{'gazetteer'}\"\n";
+	    print $outhandle "         No placename extraction will take place.\n";
+	    $self->{'extract_placenames'} = undef;
+	}
+	else {
+	    $self->{'places'} = $places_ref;
+	}
+    }
+    
+    
+}
+
+sub extract_gis_metadata
+{
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+    
+    if ($self->{'extract_placenames'}) {
+	my $thissection = $doc_obj->get_top_section();
+	while (defined $thissection) {
+	    my $text = $doc_obj->get_text($thissection);
+	    $self->extract_placenames (\$text, $doc_obj, $thissection) if $text =~ /./;
+	    $thissection = $doc_obj->get_next_section ($thissection);
+	}
+    } 
+
+}
+
+sub has_mapdata
+{
+    my $db_dir = &util::filename_cat($ENV{'GSDLHOME'}, "lamp", "data");
+    return ( -d $db_dir );
+}
+
+
+#returns a hash table of names from database files (specified in collect.cfg). 
+sub loadGISDatabase {
+    my $self = shift (@_);
+    my ($outhandle,$datasets) = @_;
+    my @dbase = map{$_ = $_ . ".txt";} split(/,/, $datasets);
+    if(scalar(@dbase)==0) { #default is to include all databases
+	@dbase=("UK.txt", "NZ.txt", "NF.txt", "CA.txt", "AS.txt", "GM.txt", "BE.txt", "IN.txt", "JA.txt", "USA.txt");
+    }
+    my $counter=0;
+    my %places = ();
+    my @cats = ();	
+    while($counter <= $#dbase){ #loop through all the databases
+	my $folder = $dbase[$counter];
+	$folder =~ s/(.*?)\.txt/$1/;
+####		my $dbName = &util::filename_cat($ENV{'GSDLHOME'}, "etc", "mapdata", "data", $folder, $dbase[$counter]);
+	my $dbName = &util::filename_cat($ENV{'GSDLHOME'}, "lamp", "data", $folder, $dbase[$counter]);
+	if (!open(FILEIN, "<$dbName")) {
+	    print $outhandle "Unable to open database $dbName: $!\n";
+	    return undef;
+	}
+	
+	my $line = <FILEIN>; #database category details.
+	my @catdetails = split("\t", $line);
+	
+	while ( defined($line = <FILEIN>)){ #stores all place names in file as keys in hash array %places
+	    @cats = split("\t", $line);
+	    if( #eliminating "bad" place names without missing real ones
+		($cats[$FC] eq "A" && !($cats[$DSG] =~ /ADMD|ADM2|PRSH/))
+		||($cats[$FC] eq "P" && ($cats[$DSG] =~ /PPLA|PPLC|PPLS/)) 
+		||($cats[$FC] eq "H" && ($cats[$DSG] =~ /BAY|LK/)) 
+		||($cats[$FC] eq "L" && !($cats[$DSG] =~ /LCTY|RGN/)) 
+		||($cats[$FC] eq "T" && ($cats[$DSG] =~ /CAPE|ISL|GRGE/))
+		||($dbase[$counter] eq "USA.txt" && ($cats[$DSG] =~ /ppl|island/))
+		){$places{$cats[$FULL_NAME]} = [@cats];}
+			@cats = ();	
+	}	
+	close(FILEIN);
+	$counter++;	
+    }	
+    return \%places;
+}
+
+#returns a unique hash array of all the places found in a document, along with coordinates, description and country data
+sub getPlaces {
+    my $self = shift @_;
+
+    my ($textref, $places) = @_;
+	my %tempPlaces = ();	
+	
+	foreach my $plc (%$places){ #search for an occurrence of each place in the text
+		if($$textref =~ m/(\W)$plc(\W)/){
+			$tempPlaces{$plc} = $places->{$plc};
+		}
+	}
+	#make sure each place is only there once
+	my %uniquePlaces = ();
+	foreach my $p (keys %tempPlaces) {	
+		if(!defined($uniquePlaces{$p})){
+			$uniquePlaces{$p} = $tempPlaces{$p};
+		}
+	}
+	return \%uniquePlaces;
+}
+
+
+
+
+#returns a lowercase version of the place, with no spaces
+sub placename_to_anchorname {
+    my $self = shift (@_);
+    my ($placename) = @_;
+    my $p_tag = lc($placename);
+    $p_tag =~ s/\s+//g;
+    return $p_tag;
+}
+
+#takes a place from the text and wraps an anchor tag, a hyperlink tag and an image tag around it
+sub anchor_wrapper {
+	my ($p, $p_counter_ref, $path) = @_;
+	my $image = "/gsdlgis/gisimages/nextplace.gif";
+	my $endTag = "</a>";
+	my $hrefTag = "<a href=";
+	$$p_counter_ref++;
+	my $next = $$p_counter_ref + 1;
+	my $p_tag = placename_to_anchorname($p);
+	my $place_anchor = "<a name=\"" . $p_tag . $$p_counter_ref . "\">" . $endTag; 
+	my $popup_anchor = $hrefTag . "'" . $path . "'>" . $p . $endTag;
+	my $image_anchor = $hrefTag . "#" . $p_tag . $next . "><img src=\"" . $image . "\" name=\"img" . $p_tag . $$p_counter_ref . "\" border=\"0\">" . $endTag;
+	return $place_anchor . $popup_anchor . $image_anchor;
+}
+
+#takes dangerous place names and checks if they are part of another placename or not.
+sub place_name_check {
+	my ($pre, $preSpace, $p, $postSpace, $post, $p_counter_ref, $path, $y) = @_;
+	if($pre =~ /$y/ || $post =~ /$y/) {return $pre . $preSpace . $p . $postSpace . $post;}
+	$pre = $pre . $preSpace;
+	$post = $postSpace . $post;
+	return $pre . &anchor_wrapper("", $p, "", $p_counter_ref, $path) . $post;
+}
+
+sub extract_placenames {
+    my $self = shift (@_);
+    my ($textref, $doc_obj, $thissection) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    my $GSDLHOME = $ENV{'GSDLHOME'};
+    #field categories in DataBase file for extract_placenames.
+    my $LAT = 3;
+    my $LONG = 4;
+    my $CC1 = 12;
+
+    
+    &gsprintf($outhandle, " {GISExtractor.extracting_placenames}...\n")
+	if ($self->{'verbosity'} > 2);
+
+    #get all the places found in the document	
+    my $uniquePlaces = $self->getPlaces($textref, $self->{'places'});
+       
+    #finds 'dangerous' placenames (eg York and New York). Dangerous because program will find "York" within "New York"  
+    my %danger = ();    
+    foreach my $x (keys %$uniquePlaces){
+	foreach my $y (keys %$uniquePlaces){
+		if(($y =~ m/ /) && ($y =~ m/$x/) && ($y ne $x)){
+			$y =~ s/($x\s)|(\s$x)//;
+			$danger{$x} = $y;
+		}
+	}
+    }  
+      
+    #creates a list of clickable placenames at top of page, linked to first occurrence of name, and reads them into a file 
+    my $tempfname = $doc_obj;
+    $tempfname =~ s/.*\(0x(.*)\)/$1/;
+    my $names = "";
+    my $filename = "tmpfile" . $tempfname;
+    my $tempfile = &util::filename_cat($GSDLHOME, "tmp", $filename);
+    open(FOUT, ">$tempfile") || die "Unable to create a temp file: $!";	
+    foreach my $name (sort (keys %$uniquePlaces)){
+	if(!defined($danger{$name})){
+		my $name_tag = placename_to_anchorname($name);
+		print FOUT "$name\t" . $uniquePlaces->{$name}->[$LONG] . "\t" . $uniquePlaces->{$name}->[$LAT] . "\n";
+		if($self->{'place_list'}) {$names = $names . "<a href=\"#" . $name_tag . "1\">" . $name . "</a>" . "\n";}
+	}
+    }
+    close(FOUT);
+    $doc_obj->associate_file($tempfile, "places.txt", "text/plain");
+    $self->{'places_filename'} = $tempfile;
+    
+    my %countries = ();
+    
+    foreach my $p (keys %$uniquePlaces){
+	my $place = $p;
+	$place =~ s/\s+|\n+|\r+|\t+/(\\s+)/g;
+	my $cap_place = uc($place);	
+	my $long = $uniquePlaces->{$p}->[$LONG];
+	my $lat = $uniquePlaces->{$p}->[$LAT];
+	my $country = $uniquePlaces->{$p}->[$CC1];
+	my $path = "javascript:popUp(\"$long\",\"$lat\",\"$p\",\"$country\")";
+	my $p_counter = 0;
+	
+	if(!defined($danger{$p})){	
+		#adds html tags to each place name
+		$$textref =~ s/\b($place|$cap_place)\b/&anchor_wrapper($1,\$p_counter,$path)/sge;
+	} 
+	#else {
+	#$y = $danger{$p};
+	#$$textref =~ s/(\w+)(\s+?)($place|$cap_place)(\s+?)(\w+)/&place_name_check($1,$2,$3,$4,$5,\$p_counter,$path, $y)/sge;  
+	#}
+	
+	#edits the last place's image, and removes image if place only occurres once.
+	my $p_tag = placename_to_anchorname($p);
+	$p_counter++;
+	$$textref =~ s/#$p_tag$p_counter(><img src="\/gsdl\/images\/)nextplace.gif/#${p_tag}1$1firstplace.gif/;
+	$$textref =~ s/<img src="\/gsdl\/images\/firstplace.gif" name="img$p_tag(1)" border="0">//;
+	
+	#this line removes apostrophes from placenames (they break the javascript function)
+	$$textref =~ s/(javascript:popUp.*?)(\w)'(\w)/$1$2$3/g; #' (to get emacs colours back)
+		
+	#for displaying map of document, count num of places from each country
+	if(defined($countries{$country})){$countries{$country}++;}
+	else{$countries{$country} = 1;}
+
+	#adds placename to metadata
+	$doc_obj->add_utf8_metadata ($thissection, "Placename", $p);	
+	&gsprintf($outhandle, "  {AutoExtractMetadata.extracting} $p\n")
+		if ($self->{'verbosity'} > 3); 
+    }
+    #finding the country that most places are from, in order to display map of the document
+    my $max = 0;
+    my $CNTRY = "";
+    foreach my $c_key (keys %countries){
+	if($countries{$c_key} > $max){
+		$max = $countries{$c_key};
+		$CNTRY = $c_key;
+	}
+    }
+    #allows user to view map with all places from the document on it
+####    my $places_filename = &util::filename_cat($GSDLHOME, "collect", "_cgiargc_", "index", "assoc", "_thisOID_", "places.txt");
+    my $places_filename = &util::filename_cat("collect", "_cgiargc_", "index", "assoc", "_thisOID_", "places.txt");
+    my $docmap = "<a href='javascript:popUp(\"$CNTRY\",\"$places_filename\")'>View map for this document<\/a><br><br>\n";
+    $$textref = $docmap . $names . "<br>" . $$textref;
+    
+    $doc_obj->delete_text($thissection);
+    $doc_obj->add_utf8_text($thissection, $$textref);
+    &gsprintf($outhandle, " {GISExtractor.done_places_extract}\n")
+	if ($self->{'verbosity'} > 2);
+}
+
+sub clean_up_temp_files {
+    my $self = shift(@_);
+    
+    if(defined($self->{'places_filename'}) && -e $self->{'places_filename'}){
+	&util::rm($self->{'places_filename'});
+    }
+    $self->{'places_filename'} = undef;
+
+}
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/GreenstoneMETSPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/GreenstoneMETSPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/GreenstoneMETSPlugin.pm	(revision 24799)
@@ -0,0 +1,348 @@
+###########################################################################
+#
+# GreenstoneMETSPlugin.pm
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2001 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# Processes GreenstoneArchive METS documents. Note that this plugin does no
+# syntax checking (though the XML::Parser module tests for
+# well-formedness). It's assumed that the GreenstoneArchive files conform
+# to their DTD.
+
+
+package GreenstoneMETSPlugin;
+
+use Encode;
+use ghtml;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+use ReadXMLFile;
+use XML::XPath;
+use XML::XPath::XMLParser;
+
+sub BEGIN {
+    @GreenstoneMETSPlugin::ISA = ('ReadXMLFile');
+}
+
+my $arguments = [ { 'name' => "process_exp",
+		    'desc' => "{BasePlugin.process_exp}",
+		    'type' => "regexp",
+		    'reqd' => "no",
+		    'deft' => &get_default_process_exp()
+		    }
+		  ];
+
+my $options = { 'name'     => "GreenstoneMETSPlugin",
+		'desc'     => "{GreenstoneMETSPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+ 
+
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+    return q^(?i)docmets\.xml$^;
+}
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    # have no args - do we still want this?
+    #push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new ReadXMLFile($pluginlist, $inputargs, $hashArgOptLists);
+
+    $self->{'section'} = "";
+    $self->{'section_level'} = 0;
+    $self->{'metadata_name'} = "";
+    $self->{'metadata_value'} = "";
+    $self->{'content'} = "";
+
+    return bless $self, $class;
+}
+
+sub xml_start_document {
+    my $self = shift (@_);
+    my ($expat, $element) =  @_;
+
+    $self->{'section'} = "";
+    $self->{'section_level'} = 0;
+    $self->{'metadata_name'} = "";
+    $self->{'metadata_value'} = "";
+    $self->{'content'} = "";
+
+    #**defined a dmdSection Table
+    $self->{'dmdSec_table'}={};
+
+    #**defined a fileSection Table
+    $self->{'fileSec_table'}={};
+
+    #***open doctxt.xml and read the data in 
+    my $filename = $self->{'filename'};
+    
+    $filename =~ s/docmets.xml$/doctxt.xml/;
+   
+    if (!open (FILEIN, "<:utf8", $filename)) {
+   	print STDERR "Warning: unable to open the $filename\n";
+	$self->{'xmltxt'} = "";
+    }
+    else {
+	my $xml_text = "";
+	while (defined (my $line = <FILEIN>)) {
+	    if ($line !~ m/^<!DOCTYPE.*>/) {
+		$xml_text .= $line;
+	    }
+	}
+
+        my $xml_parser = XML::XPath->new (xml=> $xml_text);
+	#my $xml_tree = $xml_parser->parse ($xml_text);
+
+	#eval {$self->{'parser_text'}->parse};
+	$self->{'parsed_xml'} = $xml_parser;
+    }
+    my $outhandle = $self->{'outhandle'};
+    print $outhandle "GreenstoneMETSPlugin: processing $self->{'file'}\n" if $self->{'verbosity'} > 1;
+    print STDERR "<Processing n='$self->{'file'}' p='GreenstoneMETSPlugin'>\n" if ($self->{'gli'});
+
+}
+
+sub xml_end_document {
+}
+
+sub xml_doctype {
+}
+
+sub xml_start_tag {
+    my $self = shift(@_);
+    my ($expat, $element) = @_;
+    $self->{'element'} = $element;
+    #**deal with dmdSection
+    if ($element =~ /^(mets:)?dmdSec$/ || $element =~ /(gsdl3:)?Metadata$/){ 
+	$self->xml_dmd_start_tag (@_);
+    } elsif ($element =~ /^(mets:)?file$/) {
+	# only store the file_id for sections with text. Not for default ids (assoc files)
+	if ($_{'ID'} =~ m/FILE(.*)/) {
+	    $self->{'file_Id'} = $1;
+	}
+	else {
+	    undef $self->{'file_Id'};
+	}
+    } elsif ($element =~ /^(mets:)?FLocat$/){
+	#***deal with fileSection
+	$self->xml_fileloc_start_tag (@_);
+    } elsif ($element =~ /^(mets:)?div$/){
+	#***deal with StrucMap Section
+	$self->xml_strucMap_start_tag (@_);
+    }
+}
+
+sub xml_dmd_start_tag {
+    my $self = shift (@_);
+    my ($expat, $element) = @_;
+
+    if ($element =~ /^(mets:)?dmdSec$/){
+  	my ($section_num) = ($_{'ID'} =~ m/DM(.*)/);
+	$self->{'dmdSec_table'}->{"$section_num"}=[];
+	$self->{'dmdSec_table'}->{'section_num'}=$section_num;
+    } elsif ($element =~ /^(gsdl3:)?Metadata$/) {
+	$self->{'metadata_name'} = $_{'name'};
+    }
+}
+
+sub xml_fileloc_start_tag {
+    my $self = shift (@_);
+    my ($expat, $element) = @_;
+
+    my $xlink = $_{'xlink:href'};
+    if (!defined $xlink) {
+	# try without namespace
+	$xlink = $_{'href'};
+    }
+    #my ($section_num) = ($_{'ID'} =~ m/^FLOCAT(.*)$/);
+    my $section_num = $self->{'file_Id'};
+    return if (!defined $section_num); 
+
+    $self->{'fileSec_table'}->{"$section_num"}=[];
+    $self->{'fileSec_table'}->{'section_num'}=$section_num;
+    
+    my ($filename,$xpath_expr)=($xlink =~ m/^file:(.*)\#xpointer\((.*)\)$/);
+    my $nodeset = $self->{'parsed_xml'}->findnodes ($xpath_expr);
+    my $node_size= $nodeset->size;
+    
+    if ($node_size==0) {
+	print STDERR "Warning: no text associated with XPATH $xpath_expr\n";
+    }
+    else {
+	foreach my $node ($nodeset->get_nodelist) {
+	    my $xml_content = XML::XPath::XMLParser::as_string($node);
+	    my $unescaped_xml_content = &ghtml::unescape_html($xml_content);
+	    my $section_content={'section_content'=> $unescaped_xml_content};
+	    
+	    my $content_list = $self->{'fileSec_table'}->{"$section_num"};
+	    push (@$content_list, $section_content);
+	}
+    }
+}
+
+sub xml_strucMap_start_tag {
+    my $self = shift (@_);
+    my ($expat, $element) = @_;
+
+
+    my ($section_num) = ($_{'ID'} =~ m/DS(.*)/);
+
+    if ($_{'ID'} ne "DSAll"){
+	if ($self->{'section_level'}==0) {
+	    $self->open_document();
+	} else {
+	    my $doc_obj = $self->{'doc_obj'};
+	    $self->{'section'}=
+		$doc_obj->insert_section($doc_obj->get_end_child($self->{'section'}));
+	}
+	$self->{'section_level'}++;
+	
+	#***Add metadata from dmdSection
+	my $md_list = $self->{'dmdSec_table'}->{"$section_num"};
+	
+	foreach my $md_pair (@$md_list){
+	    # text read in by XML::Parser is in Perl's binary byte value
+	    # form ... need to explicitly make it UTF-8
+
+	    my $metadata_name = decode("utf8",$md_pair->{'metadata_name'});
+	    my $metadata_value = decode("utf8",$md_pair->{'metadata_value'});
+
+	    $self->{'doc_obj'}->add_utf8_metadata($self->{'section'}, 
+						  $metadata_name, $metadata_value);
+	}
+	
+	#*** Add content from fileSection
+	my $content_list = $self->{'fileSec_table'}->{"$section_num"};
+	
+	foreach my $section_content (@$content_list){
+	    # Don't need to decode $content as this has been readin in
+	    # through XPath which (unlike XML::Parser) correctly sets
+	    # the string to be UTF8 rather than a 'binary' string of bytes
+	    my $content = $section_content->{'section_content'};
+
+	    $self->{'doc_obj'}->add_utf8_text($self->{'section'},$content);
+	}
+    }
+}
+
+sub get_doctype {
+    my $self = shift(@_);
+    
+    return "mets:mets";
+}
+
+sub xml_end_tag {
+    my $self = shift(@_);
+    my ($expat, $element) = @_;
+
+    if ($element =~ /^(gsdl3:)?Metadata$/) {
+	my $section_num = $self->{'dmdSec_table'}->{'section_num'};
+	my $metadata_name=$self->{'metadata_name'};
+	my $metadata_value=$self->{'metadata_value'};
+
+	my $md_pair={'metadata_name' => $metadata_name,
+		     'metadata_value'=> $metadata_value};
+
+	my $md_list = $self->{'dmdSec_table'}->{"$section_num"};
+
+	push(@$md_list,$md_pair);
+      
+	$self->{'metadata_name'} = "";
+	$self->{'metadata_value'} = "";
+    } elsif ($element =~ /^(mets:)?file$/){
+	$self->{'file_id'} = "";
+    }
+    
+    
+    #*** StrucMap Section
+    if ($element =~ /^(mets:)?div$/) {
+	$self->{'section_level'}--;
+	$self->{'section'} = $self->{'doc_obj'}->get_parent_section($self->{'section'});
+	$self->close_document() if $self->{'section_level'}==0;
+    }
+    $self->{'element'} = "";
+}
+
+sub xml_text {
+    my $self = shift(@_);
+    my ($expat) = @_; 
+
+    if ($self->{'element'} =~ /^(gsdl3:)?Metadata$/) {
+   	$self->{'metadata_value'} .= $_;
+    }
+}
+
+sub open_document {
+    my $self = shift(@_);
+
+    # create a new document
+    $self->{'doc_obj'} = new doc ();
+    $self->{'section'} = "";
+}
+
+sub close_document {
+    my $self = shift(@_);
+    
+    # add the associated files
+    my $assoc_files = 
+	$self->{'doc_obj'}->get_metadata($self->{'doc_obj'}->get_top_section(), "gsdlassocfile");
+
+    # for when "assocfilepath" isn't the same directory that doc.xml is in...
+    my $assoc_filepath_list= $self->{'doc_obj'}->get_metadata($self->{'doc_obj'}->get_top_section(), "assocfilepath");
+
+    my $assoc_filepath=shift (@$assoc_filepath_list);
+    if (defined ($assoc_filepath)) {
+	# make absolute rather than relative...
+	$self->{'filename'} =~ m@^(.*[\\/]archives)@;
+	$assoc_filepath = "$1/$assoc_filepath/";
+    } else {
+	$assoc_filepath = $self->{'filename'};
+	$assoc_filepath =~ s/[^\\\/]*$//;
+    }
+
+    foreach my $assoc_file_info (@$assoc_files) {
+	my ($assoc_file, $mime_type, $dir) = split (":", $assoc_file_info);
+	my $real_dir = &util::filename_cat($assoc_filepath, $assoc_file),
+	my $assoc_dir = (defined $dir && $dir ne "") 
+	    ? &util::filename_cat($dir, $assoc_file) : $assoc_file;
+	$self->{'doc_obj'}->associate_file($real_dir, $assoc_dir, $mime_type);
+    }
+    $self->{'doc_obj'}->delete_metadata($self->{'doc_obj'}->get_top_section(), "gsdlassocfile");
+
+    # process the document
+    $self->{'processor'}->process($self->{'doc_obj'}, $self->{'file'});
+}
+
+
+1;
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/GreenstoneXMLPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/GreenstoneXMLPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/GreenstoneXMLPlugin.pm	(revision 24799)
@@ -0,0 +1,351 @@
+
+###########################################################################
+#
+# GreenstoneXMLPlugin.pm
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2001 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# Processes GreenstoneArchive XML documents. Note that this plugin does no
+# syntax checking (though the XML::Parser module tests for
+# well-formedness). It's assumed that the GreenstoneArchive files conform
+# to their DTD.
+
+package GreenstoneXMLPlugin;
+
+use Encode;
+use File::Basename;
+
+use ReadXMLFile;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+sub BEGIN {
+    @GreenstoneXMLPlugin::ISA = ('ReadXMLFile');
+}
+
+
+
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+    return q^(?i)doc\.xml$^;
+}
+
+my $arguments =
+    [ { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'deft' => &get_default_process_exp(),
+	'reqd' => "no" } ];
+
+my $options = { 'name'     => "GreenstoneXMLPlugin",
+		'desc'     => "{GreenstoneXMLPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+	        'args'     => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new ReadXMLFile($pluginlist, $inputargs, $hashArgOptLists);
+
+    $self->{'section'} = "";
+    $self->{'section_level'} = 0;
+    $self->{'metadata_name'} = "";
+    $self->{'metadata_value'} = "";
+    $self->{'content'} = "";
+    $self->{'metadata_read_store'} = {};
+
+#    # Currently used to store information for previous values controls. In
+#    # the next contract I'll move to using information directly from Lucene.
+#    $self->{'sqlfh'} = 0;
+   
+    return bless $self, $class;
+}
+
+
+
+
+sub metadata_read {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $block_hash, 
+	$extrametakeys, $extrametadata, $extrametafile,
+	$processor, $gli, $aux) = @_;
+
+    my $outhandle = $self->{'outhandle'};
+
+    # can we process this file??
+    my ($filename_full_path, $filename_no_path) = &util::get_full_filenames($base_dir, $file);
+    return undef unless $self->can_process_this_file($filename_full_path);
+
+    $file =~ s/^[\/\\]+//; # $file often begins with / so we'll tidy it up
+    
+    print $outhandle "GreenstoneXMLlugin: setting up block list for $file\n"
+	if $self->{'verbosity'} > 1;
+
+    my $line;
+    if (open(GIN,"<:utf8",$filename_full_path)) {
+
+	while (defined($line=<GIN>)) {
+	    if ($line =~ m@<Metadata\s+name="gsdlassocfile">([^:]*):(?:[^:]*):(?:[^:]*)</Metadata>@) {
+		my $gsdl_assoc_file = $1;
+
+		my $dirname = dirname($filename_full_path);
+		my $full_gsdl_assoc_filename = &util::filename_cat($dirname,$gsdl_assoc_file);
+		if ($self->{'verbosity'}>2) {
+		    print $outhandle "  Storing block list item: $full_gsdl_assoc_filename\n";
+		}
+
+		&util::block_filename($block_hash,$full_gsdl_assoc_filename);		
+	    }
+	}
+
+	close(GIN);
+    }
+    else {
+	
+	print $outhandle "Error: Failed to open $file in GreenstoneXMLPlugin::metadata_read()\n";
+	print $outhandle "       $!\n";
+    }
+
+
+    $self->{'metadata_read_store'}->{$filename_full_path} = 1;
+
+    return 1;
+}
+
+
+sub xml_start_document {
+}
+
+sub xml_end_document {
+}
+
+sub get_doctype {
+    my $self = shift(@_);
+    
+    return "(Greenstone)?Archive";
+}
+
+
+sub xml_doctype {
+    my $self = shift(@_);
+
+    my ($expat, $name, $sysid, $pubid, $internal) = @_;
+
+    # allow the short-lived and badly named "GreenstoneArchive" files to be processed
+    # as well as the "Archive" files which should now be created by import.pl
+    die "" if ($name !~ /^(Greenstone)?Archive$/);
+
+    my $outhandle = $self->{'outhandle'};
+    print $outhandle "GreenstoneXMLPlugin: processing $self->{'file'}\n" if $self->{'verbosity'} > 1;
+    print STDERR "<Processing n='$self->{'file'}' p='GreenstoneXMLPlugin'>\n" if $self->{'gli'};
+
+}
+
+
+sub xml_start_tag {
+    my $self = shift(@_);
+    my ($expat, $element) = @_;
+
+    $self->{'element'} = $element;
+    if ($element eq "Section") {
+	if ($self->{'section_level'} == 0) {
+	    $self->open_document();
+       	} else {
+	    my $doc_obj = $self->{'doc_obj'};
+	    $self->{'section'} = 
+		$doc_obj->insert_section($doc_obj->get_end_child($self->{'section'}));
+	}
+	
+	$self->{'section_level'} ++;
+    }
+    elsif ($element eq "Metadata") {
+	$self->{'metadata_name'} = $_{'name'};
+    }
+}
+
+sub xml_end_tag {
+    my $self = shift(@_);
+    my ($expat, $element) = @_;
+
+    if ($element eq "Section") {
+	$self->{'section_level'} --;
+	$self->{'section'} = $self->{'doc_obj'}->get_parent_section ($self->{'section'});
+	$self->close_document() if $self->{'section_level'} == 0;
+    }
+    elsif ($element eq "Metadata") {
+	# text read in by XML::Parser is in Perl's binary byte value
+	# form ... need to explicitly make it UTF-8
+
+
+	my $metadata_name = decode("utf-8",$self->{'metadata_name'});
+	my $metadata_value = decode("utf-8",$self->{'metadata_value'});
+
+	$self->{'doc_obj'}->add_utf8_metadata($self->{'section'}, 
+					      $metadata_name,$metadata_value);
+
+        # Ensure this value is added to the allvalues database in gseditor.
+        # Note that the database constraints prevent multiple occurances of the
+        # same key-value pair.
+        # We write these out to a file, so they can all be commited in one
+        # transaction
+        #if (!$self->{'sqlfh'})
+        #  {
+        #    my $sql_file = $ENV{'GSDLHOME'} . "/collect/lld/tmp/gseditor.sql";
+        #    # If the file doesn't already exist, open it and begin a transaction
+        #    my $sql_fh;
+        #    if (!-e $sql_file)
+        #      {
+        #        open($sql_fh, ">" . $sql_file);
+        #        print $sql_fh "BEGIN TRANSACTION;\n";
+        #      }
+        #    else
+        #      {
+        #        open($sql_fh, ">>" . $sql_file);
+        #      }
+        #    print STDERR "Opened SQL log\n";
+        #    $self->{'sqlfh'} = $sql_fh;
+        #  }
+
+        #my $mvalue = $self->{'metadata_value'};
+        #$mvalue =~ s/\'/\'\'/g;
+        #$mvalue =~ s/_claimantsep_/ \& /g;
+
+        #my $fh = $self->{'sqlfh'};
+        #if ($fh)
+        #  {
+        #    print $fh "INSERT INTO allvalues (mkey, mvalue) VALUES ('" . $self->{'metadata_name'} . "', '" . $mvalue . "');\n";
+        #  }
+
+        # Clean Up
+	$self->{'metadata_name'} = "";
+	$self->{'metadata_value'} = "";
+    }
+    elsif ($element eq "Content" && $self->{'content'} ne "") {
+
+	# text read in by XML::Parser is in Perl's binary byte value
+	# form ... need to explicitly make it UTF-8
+	my $content = decode("utf-8",$self->{'content'});
+
+	$self->{'doc_obj'}->add_utf8_text($self->{'section'}, $content);
+	$self->{'content'} = "";
+    }
+    $self->{'element'} = "";
+}
+
+sub xml_text {
+    my $self = shift(@_);
+    my ($expat) = @_;
+
+    if ($self->{'element'} eq "Metadata") {
+	$self->{'metadata_value'} .= $_;
+    }
+    elsif ($self->{'element'} eq "Content") {
+	$self->{'content'} .= $_;
+    }
+}
+
+sub open_document {
+    my $self = shift(@_);
+
+    my $filename = $self->{'filename'};
+
+    # create a new document
+    if (defined $self->{'metadata_read_store'}->{$filename}) {
+	# Being processed as part of *import* phase 
+	# (i.e. was in import directory)
+	$self->SUPER::open_document(@_);
+	delete $self->{'metadata_read_store'}->{$filename};
+    }
+    else {
+	# Otherwise being processed as part of the *buildcol* phase 
+	# (i.e. named directly by ArchiveInf plugin)
+	$self->{'doc_obj'} = new doc();
+    }
+
+    $self->{'section'} = "";
+}
+
+sub close_document {
+    my $self = shift(@_);
+
+    # add the associated files
+    my $assoc_files = 
+	$self->{'doc_obj'}->get_metadata($self->{'doc_obj'}->get_top_section(), "gsdlassocfile");
+
+    # for when "assocfilepath" isn't the same directory that doc.xml is in...
+    my $assoc_filepath_list= $self->{'doc_obj'}->get_metadata($self->{'doc_obj'}->get_top_section(), "assocfilepath");
+
+    my $assoc_filepath=shift (@$assoc_filepath_list);
+
+    #rint STDERR "Filename is: " . $self->{'filename'} . "\n";
+    #rint STDERR "Initially my assoc_filepath is: $assoc_filepath\n";
+    #rint STDERR "Custom archive dir is: " . $self->{'base_dir'} . "\n";
+    # Correct the assoc filepath if one is defined
+    if (defined ($assoc_filepath))
+      {
+        # Check whether the assoc_filepath already includes the base dir
+        if (index($assoc_filepath, $self->{'base_dir'}) == -1)
+          {
+            # And if not, append it so as to make this absolute
+            $assoc_filepath = &util::filename_cat($self->{'base_dir'}, $assoc_filepath);
+          }
+      }
+    else
+      {
+	$assoc_filepath = $self->{'filename'};
+	$assoc_filepath =~ s/[^\\\/]*$//;
+      }
+    #rint STDERR "Goned and made it absolute: $assoc_filepath\n";
+
+    foreach my $assoc_file_info (@$assoc_files) {
+	my ($assoc_file, $mime_type, $dir) = split (":", $assoc_file_info);
+        #rint STDERR "assoc_file: $assoc_file\n";
+        #rint STDERR "mime_type: $mime_type\n";
+        #rint STDERR "dir: $dir\n";
+	my $real_dir = &util::filename_cat($assoc_filepath, $assoc_file),
+	my $assoc_dir = (defined $dir && $dir ne "") 
+	    ? &util::filename_cat($dir, $assoc_file) : $assoc_file;
+	$self->{'doc_obj'}->associate_file($real_dir, $assoc_dir, $mime_type);
+        #rint STDERR "According to me the real assoc_filepath is: $real_dir\n";
+    }
+    $self->{'doc_obj'}->delete_metadata($self->{'doc_obj'}->get_top_section(), "gsdlassocfile");
+
+    # process the document
+    $self->{'processor'}->process($self->{'doc_obj'}, $self->{'file'});
+
+    $self->{'num_processed'} ++;
+    undef $self->{'doc_obj'};
+}
+
+
+1;
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/HBPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/HBPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/HBPlugin.pm	(revision 24799)
@@ -0,0 +1,332 @@
+###########################################################################
+#
+# HBPlugin.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# plugin which processes an HTML book directory
+
+# This plugin is used by the Humanity Library collections and does not handle
+# input encodings other than ascii or extended ascii
+
+# this code is kind of ugly and could no doubt be made to run faster, by leaving
+# it in this state I hope to encourage people to make their collections use
+# HBSPlug instead ;-)
+
+# Use HBSPlug if creating a new collection and marking up files like the
+# Humanity Library collections. HBSPlug accepts all input encodings but
+# expects the marked up files to be cleaner than those used by the
+# Humanity Library collections
+
+package HBPlugin;
+
+use ghtml;
+use BasePlugin;
+use unicode;
+use util;
+use doc;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+sub BEGIN {
+    @HBPlugin::ISA = ('BasePlugin');
+}
+my $encoding_list =     
+    [ { 'name' => "ascii",
+	'desc' => "{BasePlugin.encoding.ascii}" },
+      { 'name' => "iso_8859_1",
+	'desc' => "{HBPlugin.encoding.iso_8859_1}" } ];
+ 
+my $arguments = 
+    [ { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'reqd' => "no",
+	'deft' => &get_default_process_exp() },
+      { 'name' => "input_encoding",
+	'desc' => "{ReadTextFile.input_encoding}",
+	'type' => "enum",
+	'deft' => "iso_8859_1",
+	'list' => $encoding_list,
+	'reqd' => "no" }
+      ];
+
+my $options = { 'name'     => "HBPlugin",
+		'desc'     => "{HBPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new BasePlugin($pluginlist, $inputargs, $hashArgOptLists);
+
+    return bless $self, $class;
+}
+
+# this is included only to prevent warnings being printed out 
+# from BasePlugin::init. The process_exp is not used by this plugin
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+    return "This plugin does not use a process_exp\n";
+}
+
+
+sub HB_read_html_file {
+    my $self = shift (@_);
+    my ($htmlfile, $text) = @_;
+
+    # load in the file
+    if (!open (FILE, $htmlfile)) {
+	my $outhandle = $self->{'outhandle'};
+	print $outhandle "ERROR - could not open $htmlfile\n";
+	return;
+    }
+
+    my $foundbody = 0;
+    $self->HB_gettext (\$foundbody, $text, "FILE");
+    close FILE;
+
+    # just in case there was no <body> tag
+    if (!$foundbody) {
+	$foundbody = 1;
+	open (FILE, $htmlfile) || return;
+	$self->HB_gettext (\$foundbody, $text, "FILE");	
+	close FILE;
+    }
+    # text is in utf8
+}
+
+# converts the text to utf8, as ghtml does that for &eacute; etc.
+sub HB_gettext {
+    my $self = shift (@_);
+    my ($foundbody, $text, $handle) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    my $line = "";
+    while (defined ($line = <$handle>)) {
+	# look for body tag
+	if (!$$foundbody) {
+	    if ($line =~ s/^.*<body[^>]*>//i) {
+		$$foundbody = 1;
+	    } else {
+		next;
+	    }
+	}
+	
+	# check for symbol fonts
+	if ($line =~ /<font [^>]*?face\s*=\s*\"?(\w+)\"?/i) {
+	    my $font = $1;
+	    print $outhandle "HBPlugin::HB_gettext - warning removed font $font\n" 
+		if ($font !~ /^arial$/i);
+	}
+
+	$line =~ s/<\/p>//ig;   # remove </p> tags
+	$line =~ s/<\/?(body|html|font)\b[^>]*>//ig; # remove any unwanted tags
+
+	$$text .= $line;
+    }
+    #
+    if ($self->{'input_encoding'} eq "iso_8859_1") {
+	# convert to utf-8
+	$$text=&unicode::unicode2utf8(&unicode::convert2unicode("iso_8859_1", $text));
+    }
+    # convert any alphanumeric character entities to their utf-8
+    # equivalent for indexing purposes
+    &ghtml::convertcharentities ($$text);
+
+    $$text =~ s/\s+/ /g; # remove \n's
+}
+
+sub HB_clean_section {
+    my $self = shift (@_);
+    my ($section) = @_;
+
+    # remove tags without a starting tag from the section
+    my ($tag, $tagstart);
+    while ($section =~ /<\/([^>]{1,10})>/) {
+	$tag = $1;
+	$tagstart = index($section, "<$tag");
+	last if (($tagstart >= 0) && ($tagstart < index($section, "<\/$tag")));
+	$section =~ s/<\/$tag>//;
+    }
+    
+    # remove extra paragraph tags
+    while ($section =~ s/<p\b[^>]*>\s*<p\b/<p/ig) {}
+    
+    # remove extra stuff at the end of the section
+    while ($section =~ s/(<u>|<i>|<b>|<p\b[^>]*>|&nbsp;|\s)$//i) {}
+    
+    # add a newline at the beginning of each paragraph
+    $section =~ s/(.)\s*<p\b/$1\n\n<p/gi;
+    
+    # add a newline every 80 characters at a word boundary
+    # Note: this regular expression puts a line feed before
+    # the last word in each section, even when it is not
+    # needed.
+    $section =~ s/(.{1,80})\s/$1\n/g;
+    
+    # fix up the image links
+    $section =~ s/<img[^>]*?src=\"?([^\">]+)\"?[^>]*>/
+	<center><img src=\"_httpdocimg_\/$1\"><\/center><br>/ig;
+    $section =~ s/&lt;&lt;I&gt;&gt;\s*([^\.]+\.(png|jpg|gif))/
+	<center><img src=\"_httpdocimg_\/$1\"><\/center><br>/ig;
+
+    return $section;
+}
+
+
+sub shorten {
+    my $self = shift (@_);
+    my ($text) = @_;
+
+    return "\"$text\"" if (length($text) < 100);
+
+    return "\"" . substr ($text, 0, 50) . "\" ... \"" . 
+	substr ($text, length($text)-50) . "\"";
+}
+
+# return number of files processed, undef if can't process
+# Note that $base_dir might be "" and that $file might 
+# include directories
+sub read {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $block_hash, $metadata, $processor, $maxdocs, $total_count, $gli) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    # get the html filename and see if this is an HTML Book...
+    my $jobnumber = $file;
+    if ($file =~ /[\\\/]/) {
+	($jobnumber) = $file =~ /[\\\/]([^\\\/]+)$/;
+    }
+    return undef unless defined $jobnumber;
+    my $htmlfile = &util::filename_cat($base_dir, $file, "$jobnumber.htm");
+    return undef unless -e $htmlfile;
+
+    print STDERR "<Processing n='$file' p='HBPlugin'>\n" if ($gli);
+    print $outhandle "HBPlugin: processing $file\n";
+
+    # read in the file and do basic html cleaning (removing header etc)
+    my $html = "";
+    $self->HB_read_html_file ($htmlfile, \$html);
+    # html is in utf8
+
+    # create a new document
+    my $doc_obj = new doc ($file, "indexed_doc", $self->{'file_rename_method'});
+
+    # copy the book cover if it exists
+    my $bookcover = &util::filename_cat($base_dir, $file, "$jobnumber.jpg");
+    $doc_obj->associate_file($bookcover, "cover.jpg", "image/jpeg");
+    $doc_obj->add_utf8_metadata($doc_obj->get_top_section(), "Plugin", "$self->{'plugin_type'}");
+    $doc_obj->add_utf8_metadata($doc_obj->get_top_section(), "FileFormat", "HB");
+    $doc_obj->add_utf8_metadata($doc_obj->get_top_section(), "FileSize", (-s $htmlfile));
+
+    my $cursection = $doc_obj->get_top_section();
+    
+    # add metadata for top level of document
+    foreach my $field (keys(%$metadata)) {
+	# $metadata->{$field} may be an array reference
+	if (ref ($metadata->{$field}) eq "ARRAY") {
+	    map {
+		$doc_obj->add_utf8_metadata($cursection, $field, $_);
+	    } @{$metadata->{$field}};
+	} else {
+	    $doc_obj->add_utf8_metadata($cursection, $field, $metadata->{$field}); 
+	}
+    }
+
+    # process the file one section at a time
+    my $curtoclevel = 1;
+    my $firstsection = 1;
+    while (length ($html) > 0) {
+	if ($html =~ s/^.*?(?:<p\b[^>]*>)?((<b>|<i>|<u>|\s)*)&lt;&lt;TOC(\d+)&gt;&gt;\s*(.*?)<p\b/<p/i) {
+	    my $toclevel = $3;
+	    my $title = $4;
+	    my $sectiontext = "";
+	    if ($html =~ s/^(.*?)((?:<p\b[^>]*>)?((<b>|<i>|<u>|\s)*)&lt;&lt;TOC\d+&gt;&gt;)/$2/i) {
+		$sectiontext = $1;
+	    } else {
+		$sectiontext = $html;
+		$html = "";
+	    }
+
+	    # remove tags and extra spaces from the title
+	    $title =~ s/<\/?[^>]+>//g;
+	    $title =~ s/^\s+|\s+$//g;
+
+	    # close any sections below the current level and
+	    # create a new section (special case for the firstsection)
+	    while (($curtoclevel > $toclevel) ||
+		   (!$firstsection && $curtoclevel == $toclevel)) {
+		$cursection = $doc_obj->get_parent_section ($cursection);
+		$curtoclevel--;
+	    }
+	    if ($curtoclevel+1 < $toclevel) {
+		print $outhandle "WARNING - jump in toc levels in $htmlfile " . 
+		    "from $curtoclevel to $toclevel\n";
+	    }
+	    while ($curtoclevel < $toclevel) {
+		$curtoclevel++;
+		$cursection = 
+		    $doc_obj->insert_section($doc_obj->get_end_child($cursection));
+	    }
+
+	    # add the metadata to this section
+	    $doc_obj->add_utf8_metadata($cursection, "Title", $title);
+
+	    # clean up the section html
+	    $sectiontext = $self->HB_clean_section($sectiontext);
+
+	    # associate any files
+	    map { $doc_obj->associate_file(&util::filename_cat ($base_dir, $file, $1), $1)
+		      if /_httpdocimg_\/([^\"]+)\"/; 0; }
+	         split (/(_httpdocimg_\/[^\"]+\")/, $sectiontext);
+
+	    # add the text for this section
+	    $doc_obj->add_utf8_text ($cursection, $sectiontext);
+	} else {
+	    print $outhandle "WARNING - leftover text\n" , $self->shorten($html), 
+	    "\nin $htmlfile\n";
+	    last;
+	}
+	$firstsection = 0;
+    }
+
+    # add a OID
+    $self->add_OID($doc_obj);
+
+    # process the document
+    $processor->process($doc_obj, &util::filename_cat($file, "$jobnumber.htm"));
+        
+    return 1; # processed the file
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/HTMLImagePlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/HTMLImagePlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/HTMLImagePlugin.pm	(revision 24799)
@@ -0,0 +1,1076 @@
+###########################################################################
+#
+# HTMLImagePlugin.pm -- Context-based image indexing plugin for HTML documents
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2001 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# DESCRIPTION:
+#
+#  Extracts images and associated text and metadata from
+#  web pages as individual documents for indexing. Thumbnails
+#  are created from each image for browsing purposes.
+#
+#  Options are available for configuring the aggressiveness of the
+#  associated text extraction mechanisms. A higher level of
+#  aggressiveness will extract more text and consequently
+#  may mean lower accuracy (precision); however, it may also 
+#  retrieve more of the relevant images from the collection (recall). 
+#  Lower levels of aggressiveness maybe result in slightly faster
+#  collection builds at the import stage.
+#
+#  HTMLImagePlugin is a subclass of HTMLPlug (i.e. it will index pages also 
+#  if required). It can be used in place of HTMLPlugin to index both
+#  pages and their images.
+#
+# REQUIREMENTS:
+#   
+#  The ImageMagick image manipulation is used to create
+#  thumbnails and extract some image metadata. (Available 
+#  from http://www.imagemagick.org/)
+#
+#  Unix:
+#    Many Linux distributions contain ImageMagick.
+#
+#  Windows:
+#    ImageMagick can be downloaded from the website above.
+#    Make sure the system path includes the ImageMagick binaries
+#    before using HTMLImagePlugin.
+#
+#    NOTE: NT/2000/XP contain a filesystem utility 'convert.exe' 
+#    with the same name as the image conversion utility. The
+#    ImageMagick FAQ recommends renaming the filesystem
+#    utility (e.g. to 'fsconvert.exe') to avoid this clash.
+#
+# USAGE:  
+#
+#  An image document consists of metadata elements:
+#
+#   OriginalFilename, FilePath, Filename, FileExt, FileSize,
+#   Width, Height, URL, PageURL, ThumbURL, CacheURL, CachePageURL
+#   ImageText, PageTitle
+#
+#  Most of these are only useful in format strings (e.g. ThumbURL, 
+#  Filename, URL, PageURL, CachePageURL). 
+#
+#  ImageText, as the name suggests contains the indexable text.
+#  (unless using the -document_text plugin option)
+#
+#  Since image documents are made up of metadata elements 
+#  alone, format strings are needed to display them properly. 
+#  NOTE: The receptionist will only display results (e.g. thumbnails)
+#  in 4 columns if the format string begins with "<td><table>".
+#
+#  The example below takes the user to the image within the
+#  source HTML document rather than using a format string
+#  on DocumentText to display the image document itself.
+#
+#  Example collect.cfg:
+#
+#   ...
+#
+#   indexes document:ImageText document:text
+#   defaultindex document:ImageText
+#  
+#   collectionmeta .document:ImageText "images"
+#   collectionmeta .document:text "documents"
+#
+#   ...
+#
+#   plugin HTMLImagePlugin -index_pages -aggressiveness 6
+#
+#   ...
+#  
+#   format SearchVList '<td>{If}{[Title],[link][icon]&nbsp;[Title][[/link],
+#    <table><tr><td align="center"><a href="[CachePageURL]">
+#    <img src="[ThumbURL]"></a></td></tr><tr><td align="center">
+#    <a href="[CachePageURL]"><font size="-1">[OriginalFilename]</font></a>
+#    <br>[Width]x[Height]</td></tr></table>}</td>'
+#
+#   ...
+#
+ 
+package HTMLImagePlugin;
+
+use HTMLPlugin;
+use ghtml;
+use unicode;
+use util;
+use strict; # 'subs';
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+sub BEGIN {
+    @HTMLImagePlugin::ISA = qw( HTMLPlugin );
+}
+
+my $aggressiveness_list = 
+    [ { 'name' => "1",
+	'desc' => "{HTMLImagePlugin.aggressiveness.1}" },
+      { 'name' => "2",
+	'desc' => "{HTMLImagePlugin.aggressiveness.2}" },
+      { 'name' => "3",
+	'desc' => "{HTMLImagePlugin.aggressiveness.3}" },
+      { 'name' => "4",
+	'desc' => "{HTMLImagePlugin.aggressiveness.4}" },
+      { 'name' => "5",
+	'desc' => "{HTMLImagePlugin.aggressiveness.5}" },
+      { 'name' => "6",
+	'desc' => "{HTMLImagePlugin.aggressiveness.6}" },
+      { 'name' => "7",
+	'desc' => "{HTMLImagePlugin.aggressiveness.7}" },
+      { 'name' => "8",
+	'desc' => "{HTMLImagePlugin.aggressiveness.8}" },
+      { 'name' => "9",
+	'desc' => "{HTMLImagePlugin.aggressiveness.9}" } ];
+
+my $arguments =
+    [ { 'name' => "aggressiveness",
+	'desc' => "{HTMLImagePlugin.aggressiveness}",
+	'type' => "int",
+	'list' => $aggressiveness_list,
+	'deft' => "3",
+	'reqd' => "no" },
+      { 'name' => "index_pages",
+	'desc' => "{HTMLImagePlugin.index_pages}",
+	'type' => "flag",
+	'reqd' => "no" },
+      { 'name' => "no_cache_images",
+	'desc' => "{HTMLImagePlugin.no_cache_images}",
+	'type' => "flag",
+	'reqd' => "no" },
+      { 'name' => "min_size",
+	'desc' => "{HTMLImagePlugin.min_size}",
+	'type' => "int",
+	'deft' => "2000",
+	'reqd' => "no" },
+      { 'name' => "min_width",
+	'desc' => "{HTMLImagePlugin.min_width}",
+	'type' => "int",
+	'deft' => "50",
+	'reqd' => "no" },
+      { 'name' => "min_height",
+	'desc' => "{HTMLImagePlugin.min_height}",
+	'type' => "int",
+	'deft' => "50",
+	'reqd' => "no" },
+      { 'name' => "thumb_size",
+	'desc' => "{HTMLImagePlugin.thumb_size}",
+	'type' => "int",
+	'deft' => "100",
+	'reqd' => "no" },
+      { 'name' => "convert_params",
+	'desc' => "{HTMLImagePlugin.convert_params}",
+	'type' => "string",
+	'deft' => "",
+	'reqd' => "no" },
+      { 'name' => "min_near_text",
+	'desc' => "{HTMLImagePlugin.min_near_text}",
+	'type' => "int",
+	'deft' => "10",
+	'reqd' => "no" },
+      { 'name' => "max_near_text",
+	'desc' => "{HTMLImagePlugin.max_near_text}",
+	'type' => "int",
+	'deft' => "400",
+	'reqd' => "no" },
+      { 'name' => "smallpage_threshold",
+	'desc' => "{HTMLImagePlugin.smallpage_threshold}",
+	'type' => "int",
+	'deft' => "2048",
+	'reqd' => "no" },
+      { 'name' => "textrefs_threshold",
+	'desc' => "{HTMLImagePlugin.textrefs_threshold}",
+	'type' => "int",
+	'deft' => "2",
+	'reqd' => "no" },
+      { 'name' => "caption_length",
+	'desc' => "{HTMLImagePlugin.caption_length}",
+	'type' => "int",
+	'deft' => "80",
+	'reqd' => "no" },
+      { 'name' => "neartext_length",
+	'desc' => "{HTMLImagePlugin.neartext_length}",
+	'type' => "int",
+	'deft' => "300",
+	'reqd' => "no" },
+      { 'name' => "document_text",
+	'desc' => "{HTMLImagePlugin.document_text}",
+	'type' => "flag",
+	'reqd' => "no" } ];
+
+my $options = { 'name'     => "HTMLImagePlugin",
+		'desc'     => "{HTMLImagePlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new HTMLPlugin($pluginlist, $inputargs, $hashArgOptLists);
+
+    # init class variables
+    $self->{'textref'} = undef; # init by read_file fn
+    $self->{'htdoc_obj'} = undef; # init by process fn
+    $self->{'htpath'} = undef; # init by process fn
+    $self->{'hturl'} = undef; # init by process fn
+    $self->{'plaintext'} = undef; # HTML stripped version - only init if needed by raw_neartext sub
+    $self->{'smallpage'} = 0; # set by process fn
+    $self->{'images_indexed'} = undef; # num of images indexed - if 1 or 2 then we know page is small
+    $self->{'initialised'} = undef; # flag (see set_extraction_options())
+
+    return bless $self, $class;
+}
+
+# if indexing pages, let HTMLPlugin do it's stuff
+# image extraction done through read()
+sub process {
+    my $self = shift(@_);
+    my ($textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+    $self->{'imglist'} = ();
+    if ( $self->{'index_pages'} ) {
+	my $ok = $self->SUPER::process($textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli);
+	if ( ! $ok ) { return $ok }
+	$self->{'htdoc_obj'} = $doc_obj;
+    }
+    # else use URL for referencing
+    #if ( $file =~ /(.*)[\/\\]/ ) { $self->{'htpath'} = $1; } else { $self->{'htpath'} = $file; }
+
+    $self->{'htpath'} = $base_dir if (-d $base_dir);
+    if ( $file =~ /(.*)[\/\\]/ ) { $self->{'htpath'} .= "/$1"; }
+    $self->{'htpath'} =~ s/\\/\//g;  # replace \ with /
+
+    $self->{'hturl'} = "http://$file";
+    $self->{'hturl'} =~ s/\\/\//g; # for windows
+    ($self->{'filename'}) = $file =~ /.*[\/\\](.*)/;
+    ($self->{'base_path'}) = $file =~ /(.*)[\/\\]/i;
+    if ( ( -s "$base_dir/$file") <= $self->{'smallpage_threshold'} ) {
+	$self->{'smallpage'} = 1;
+    } else { $self->{'smallpage'} = 0; }
+
+    if ( defined($self->{'initialised'}) ) { return 1; }
+    else {
+	$self->{'initialised'} = $self->set_extraction_options($base_dir =~ /^(.*?)\/import/i);
+	return $self->{'initialised'};
+    }
+}
+
+# get complex configuration options from configuration files
+# -- $GSDLCOLLECTION/etc/HTMLImagePlugin.cfg (tag sets for aggr 2+)
+# -- $GSDLHOME/etc/packages/phind/stopword/en/brown.sw (stopwords for aggr 5+)
+
+# If there's no HTMLImagePlugin.cfg file we'll use the following default values
+my $defaultcfg = '
+<delimitertagset>
+  <setname>Caption</setname>
+  <taggroup>font</taggroup>
+  <taggroup>tt</taggroup>
+  <taggroup>small</taggroup>
+  <taggroup>b</taggroup>
+  <taggroup>i</taggroup>
+  <taggroup>u</taggroup>
+  <taggroup>em</taggroup>
+  <taggroup>td</taggroup>
+  <taggroup>li</taggroup>
+  <taggroup>a</taggroup>
+  <taggroup>p</taggroup>
+  <taggroup>tr</taggroup>
+  <taggroup>center</taggroup>
+  <taggroup>div</taggroup>
+  <taggroup>caption</taggroup>
+  <taggroup>br</taggroup>
+  <taggroup>ul</taggroup>
+  <taggroup>ol</taggroup>
+  <taggroup>table</taggroup>
+  <taggroup>hr</taggroup>
+</delimitertagset>
+
+<delimitertagset>
+  <setname>Neartext</setname>
+  <taggroup>tr|hr|table|h\d|img|body</taggroup>
+  <taggroup>td|tr|hr|table|h\d|img|body</taggroup>
+  <taggroup>p|br|td|tr|hr|table|h\d|img|body</taggroup>
+  <taggroup>font|p|i|b|em|img</taggroup>
+</delimitertagset>
+';
+
+sub set_extraction_options() {
+    my ($self, $collpath) = @_;
+    my ($filepath);
+
+    print {$self->{'outhandle'}} "HTMLImagePlugin: Initialising\n"
+	if $self->{'verbosity'} > 1;
+    # etc/HTMLImagePlugin.cfg (XML)
+    # tag sets for captions and neartext
+    if ( $self->{'aggressiveness'} > 1 && $self->{'aggressiveness'} != 9 ) {
+	$self->{'delims'} = [];
+	$self->{'cdelims'} = [];
+	my ($cfg, @tagsets, $tagset, $type, @delims);
+
+	$filepath = "$collpath/etc/HTMLImagePlugin.cfg";
+	if ( open CFG, "<$filepath" ) {
+	    while (<CFG>) { $cfg .= $_ }
+	    close CFG;
+	} else {
+	    $cfg = $defaultcfg;
+	}
+
+	(@tagsets) = 
+	    $cfg =~ /<delimitertagset>(.*?)<\/delimitertagset>/igs;
+	foreach $tagset ( @tagsets ) {
+	    ($type) = $tagset =~ /<setname>(.*?)<\/setname>/i;
+	    if ( lc($type) eq "caption" ) {
+		(@{$self->{'cdelims'}}) = $tagset =~ /<taggroup>(.*?)<\/taggroup>/igs;
+	    }
+	    elsif ( lc($type) eq "neartext" ) {
+		(@{$self->{'delims'}}) = $tagset =~ /<taggroup>(.*?)<\/taggroup>/igs;
+	    }
+	}
+
+	# output a warning if there seem to be no delimiters
+	if ( scalar(@{$self->{'cdelims'}} == 0)) {
+	    print {$self->{'outhandle'}} "HTMLImagePlugin: Warning: no caption delimiters found in $filepath\n";
+	}
+	if ( scalar(@{$self->{'delims'}} == 0)) {
+	    print {$self->{'outhandle'}} "HTMLImagePlugin: Warning: no neartext delimiters found in $filepath\n";
+	}
+    }
+    
+    # get stop words for textual reference extraction
+    # TODO: warnings scroll off. Would be best to output them again at end of import
+    if ( $self->{'aggressiveness'} >=5 && $self->{'aggressiveness'} != 9 ) {
+	$self->{'stopwords'} = ();
+	$filepath = &util::filename_cat($ENV{'GSDLHOME'}, "etc", "packages", "phind", "stopword", "en", "brown.sw");
+	if ( open STOPWORDS, "<$filepath" ) {
+	    while ( <STOPWORDS> ) {
+		chomp;
+		$self->{'stopwords'}{$_} = 1;
+	    }
+	    close STOPWORDS;
+	} else {
+	    print {$self->{'outhandle'}} "HTMLImagePlugin: Warning: couldn't open stopwords file at $filepath ($!)\n";
+	}
+	
+    }
+
+    if ( $self->{'neartext_length'} > $self->{'max_near_text'} ) {
+	$self->{'max_near_text'} = $self->{'neartext_length'} * 1.33;
+	print {$self->{'outhandle'}} "HTMLImagePlugin: Warning: adjusted max_text to $self->{'max_near_text'}\n";
+    } 
+    if ( $self->{'caption_length'} > $self->{'max_near_text'} ) {
+	$self->{'max_near_text'} = $self->{'caption_length'} * 1.33;
+	print {$self->{'outhandle'}} "HTMLImagePlugin: Warning: adjusted max_text to $self->{'max_near_text'}\n";
+    }
+
+    return 1;
+}
+
+# return number of files processed, undef if can't recognise, -1 if 
+# cant process
+# Note that $base_dir might be "" and that $file might 
+# include directories
+sub read {
+    my ($self, $pluginfo, $base_dir, $file, $block_hash, $metadata, $processor, $maxdocs, $total_count, $gli) = (@_);
+    my ($doc_obj, $section, $filepath, $imgtag, $pos, $context, $numdocs, $tndir, $imgs);
+    # forward normal read (runs HTMLPlugin if index_pages T)
+    my $ok =  $self->SUPER::read($pluginfo, $base_dir, $file, $block_hash, $metadata, $processor, $maxdocs, $total_count, $gli); 
+    if ( ! $ok ) { return $ok } # what is this returning??
+
+    my $outhandle = $self->{'outhandle'};
+    my $textref = $self->{'textref'};
+    my $htdoc_obj = $self->{'htdoc_obj'};
+    $numdocs = 0;
+    $base_dir =~ /(.*)\/.*/;
+    $tndir = "$1/archives/thumbnails"; # TODO: this path shouldn't be hardcoded?
+    &util::mk_all_dir($tndir) unless -e "$tndir"; 
+
+    $imgs = \%{$self->{'imglist'}};
+    my $nimgs = $self->get_img_list($textref);
+    $self->{'images_indexed'} = $nimgs;
+    if ( $nimgs > 0 ) {
+	my @fplist = (sort { $imgs->{$a}{'pos'} <=> $imgs->{$b}{'pos'} } keys %{$imgs});
+	my $i = 0;
+	foreach $filepath ( @fplist ) {
+	    $pos = $imgs->{$filepath}{'pos'}; 
+	    $context = substr ($$textref, $pos - 50, $pos + 50); # grab context (quicker)
+	    ($imgtag) = ($context =~ /(<(?:img|a|body)\s[^>]*$filepath[^>]*>)/is );
+	    if (! defined($imgtag)) { $imgtag = $filepath }
+	    print $outhandle "HTMLImagePlugin: extracting $filepath\n"
+		if ( $self->{'verbosity'} > 1 );
+	    $doc_obj = new doc ("", "indexed_doc", $self->{'file_rename_method'});
+	    $section = $doc_obj->get_top_section();
+	    my $prevpos = ( $i == 0 ? 0 : $imgs->{$fplist[$i - 1]}{'pos'});
+	    my $nextpos = ( $i >= ($nimgs -1) ? -1 : $imgs->{$fplist[$i + 1]}{'pos'} );
+
+	    $self->extract_image_info($imgtag, $filepath, $textref, $doc_obj, $section, $tndir, $prevpos, $nextpos);
+            $processor->process($doc_obj);
+	    $numdocs++;
+	    $i++;
+	}
+	return $numdocs;
+    } else {
+	print $outhandle "HTMLImagePlugin: No images from $file indexed\n"
+	    if ( $self->{'verbosity'} > 2 );
+	return 1;
+    }
+    
+}
+
+# for every valid image tag
+# 1. extract related text and image metadata
+# 2. add this as document meta-data
+# 3. add assoc image(s) as files
+#
+sub extract_image_info {
+    my $self = shift (@_);
+    my ($tag, $id, $textref, $doc_obj, $section, $tndir, $prevpos, $nextpos) = (@_);
+    my ($filename, $orig_fp, $fn, $ext, $reltext, $relreltext, $crcid, $imgs,
+	$thumbfp, $pagetitle, $alttext,	$filepath, $aggr);
+
+    my $imagick_cmd = "\"".&util::get_perl_exec()."\" -S gs-magick.pl";
+
+    $aggr = $self->{'aggressiveness'};
+    $imgs = \%{$self->{'imglist'}};
+    $filepath = $imgs->{$id}{'relpath'}; 
+    ($filename) = $filepath =~ /([^\/\\]+)$/s;
+    ($orig_fp) = "$self->{'base_path'}/$filepath"; 
+    $orig_fp =~ tr/+/ /;
+    $orig_fp =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # translate %2E to space, etc
+    $orig_fp =~ s/\\/\//g;
+    $filepath = "$self->{'htpath'}/$filepath";
+    my ($onlyfn) = $filename =~ /([^\\\/]*)$/;
+    ($fn, $ext) = $onlyfn =~ /(.*)\.(.*)/;
+    $fn = lc $fn; $ext = lc $ext;
+    ($reltext) = "<tr><td>GifComment</td><td>" . `$imagick_cmd identify $filepath -ping -format "%c"` . "</td></tr>\n"
+        if ($ext eq "gif");
+    $reltext .= "<tr><td>FilePath</td><td>$orig_fp</td></tr>\n";
+
+    if ($ENV{'GSDLOS'} =~ /^windows$/i) {
+	$crcid = "$fn.$ext." . $self->{'next_crcid'}++;
+    } else { 
+	($crcid) = `cksum $filepath` =~ /^(\d+)/; 
+    }
+    
+    $thumbfp = "$tndir/tn_$crcid.jpg";
+    `$imagick_cmd convert -flatten -filter Hanning $self->{'convert_params'} -geometry "$self->{'thumb_size'}x$self->{'thumb_size'}>" $filepath $thumbfp` unless -e $thumbfp;
+    if ( ! (-e $thumbfp) ) {
+	print STDERR "HTMLImagePlugin: 'convert' failed. Check ImageMagicK binaries are installed and working correctly\n"; return 0; 
+    }
+    
+    # shove in full text (tag stripped or unstripped) if settings require it
+    if ( $aggr == 10) {
+	$reltext = "<tr><td>AllPage</td><td>" . $$textref . "</td><tr>\n";   # level 10 (all text, verbatim)
+    } else {
+	$pagetitle = $self->get_meta_value("title", $textref);
+	($alttext) = $tag =~ /\salt\s*=\s*(?:\"|\')(.+?)(?:\"|\')/is;
+	if ( defined($alttext) && length($alttext) > 1) {
+	    $reltext .= "<tr><td>ALTtext</td><td>$alttext</td></tr>\n"; }
+	$reltext .= "<tr><td>SplitCapitalisation</td><td>" . 
+	    $self->split_filepath($orig_fp) . "</td></tr>\n";
+
+	# get caption/tag based near text (if appropriate)
+	if ( $aggr > 1 ) {
+	    if ( $aggr >= 2 ) {
+		$reltext .= 
+		    $self->extract_caption_text($tag, $textref, $prevpos, $imgs->{$id}{'pos'}, $nextpos);
+		$relreltext = $reltext;
+	    } 
+	    # repeat the filepath, alt-text, caption, etc
+	    if ( $aggr == 8 ) {
+		$reltext .= $relreltext; 
+	    }
+	    if ( $aggr >= 3 ) {
+		$reltext .= 
+		    $self->extract_near_text($tag, $textref, $prevpos, $imgs->{$id}{'pos'}, $nextpos);
+	    }
+	
+	    # get page metadata (if appropriate)
+	    if ( $aggr >= 6 || ( $aggr >= 2 && 
+						     ( $self->{'images_indexed'} < 2 || 
+						       ($self->{'smallpage'} == 1 && $self->{'images_indexed'} < 6 )))) {	
+		$reltext .= $self->get_page_metadata($textref);
+	    }
+	    # textual references
+	    if ( $aggr  == 5 || $aggr >= 7) {
+		if ( length($relreltext) > ($self->{'caption_length'} * 2) )  {
+		    $reltext .= $self->get_textrefs($relreltext, $textref, $prevpos, $imgs->{$id}{'pos'}, $nextpos); }
+		else {
+		    $reltext .= $self->get_textrefs($reltext, $textref, $prevpos, $imgs->{$id}{'pos'}, $nextpos); 
+		}
+	    }
+	} # aggr > 1
+    } # aggr != 10
+    
+    $doc_obj->set_OID($crcid); 
+    $doc_obj->associate_file($thumbfp, "$fn.thumb.jpg", undef, $section);
+    $doc_obj->add_metadata($section, "OriginalFilename", $filename);
+    $doc_obj->add_metadata($section, "FilePath", $orig_fp);
+    $doc_obj->add_metadata($section, "Filename", $fn);
+    $doc_obj->add_metadata($section, "FileExt", $ext);
+    $doc_obj->add_metadata($section, "FileSize", $imgs->{$id}{'filesize'});
+    $doc_obj->add_metadata($section, "Width", $imgs->{$id}{'width'});
+    $doc_obj->add_metadata($section, "Height", $imgs->{$id}{'height'});
+    $doc_obj->add_metadata($section, "URL", "http://$orig_fp");
+    $doc_obj->add_metadata($section, "PageURL", $self->{'hturl'});
+    $doc_obj->add_metadata($section, "PageTitle", $pagetitle);
+    $doc_obj->add_metadata($section, "ThumbURL", 
+			   "_httpprefix_/collect/[collection]/index/assoc/[assocfilepath]/$fn.thumb.jpg");
+    $doc_obj->add_metadata($section, "FileFormat", "W3Img");
+
+    if ( $self->{'document_text'} ) {
+	$doc_obj->add_utf8_text($section, "<table border=1>\n$reltext</table>");
+    } else {
+	$doc_obj->add_metadata($section, "ImageText", "<table border=1>\n$reltext</table>\n");
+    }
+    
+    if ( $self->{'index_pages'} ) {
+	my ($cache_url) = "_httpdoc_&d=" . $self->{'htdoc_obj'}->get_OID();
+	if ( $imgs->{$id}{'anchored'} ) {
+	    my $a_name = $id;
+	    $a_name =~ s/[\/\\\:\&]/_/g;
+	    $cache_url .=  "#gsdl_$a_name" ;
+	}
+	$doc_obj->add_utf8_metadata($section, "CachePageURL", $cache_url);
+    }
+    if ( ! $self->{'no_cache_images'} ) {
+	$onlyfn = lc $onlyfn;
+	$doc_obj->associate_file($filepath, $onlyfn, undef, $section);
+	$doc_obj->add_utf8_metadata($section, "CacheURL", 
+			       "_httpprefix_/collect/[collection]/index/assoc/[assocfilepath]/$onlyfn");
+    }
+    return 1;
+}
+
+sub get_page_metadata {
+    my ($self, $textref) = (@_);
+    my (@rval);
+    $rval[0] = $self->get_meta_value("title", $textref);
+    $rval[1] = $self->get_meta_value("keywords", $textref);
+    $rval[2] = $self->get_meta_value("description", $textref);
+    $rval[3] = $self->{'filename'};
+
+    return wantarray ? @rval : "<tr><td>PageMeta</td><td>@rval</td></tr>\n" ;
+}
+
+# turns LargeCatFish into Large,Cat,Fish so MG sees the separate words
+sub split_filepath {
+    my ($self, $filepath) = (@_);
+    my (@words) = $filepath =~ /([A-Z][a-z]+)/g; 
+    return join(',', @words);
+}
+
+# finds and extracts sentences
+# that seem to be on the same topic
+# as other related text (correlations)
+# and textual references (e.g. in figure 3 ...)
+sub get_textrefs {
+    my ($self, $reltext, $textref, $prevpos, $pos, $nextpos) = (@_);
+    my ($maxtext, $mintext, $startpos, $context_size, $context);
+
+    my (@relwords, @refwords, %sentences, @pagemeta);
+
+    # extract larger context
+    $maxtext = $self->{'max_near_text'};
+    $startpos = $pos - ($maxtext * 4);
+    $context_size = $maxtext*10;
+    if ($startpos < $prevpos ) { $startpos = $prevpos }
+    if ($nextpos != -1 && $context_size > ( $nextpos - $startpos )) { $context_size = ($nextpos - $startpos) }
+    $context = substr ( $$textref, $startpos, $context_size );
+    $context =~ s/<.*?>//gs;
+    $context =~ s/^.*>(.*)/$1/gs;
+    $context =~ s/(.*)<.*$/$1/gs;
+
+    # get page meta-data (if not already included)
+    if ( $self->{'aggressiveness'} == 5 && ! $self->{'smallpage'} ) {
+	@pagemeta = $self->get_page_metadata($textref);
+	foreach my $value ( @pagemeta ) {
+	    $context .= "$value."; # make each into psuedo-sentence
+	}
+    }
+
+    # TODO: this list is not exhaustive
+    @refwords = ( '(?:is|are)? ?(?:show(?:s|n)|demonstrate(?:d|s)|explains|features) (?:in|by|below|above|here)', 
+		  '(?:see)? (?:figure|table)? (?:below|above)');    
+
+    # extract general references
+    foreach my $rw ( @refwords ) {
+	while ( $context =~ /[\.\?\!\,](.*?$rw\W.*?[\.\?\!\,])/ig ) {
+	    my $sentence = $1;
+	    $sentence =~ s/\s+/ /g;
+	    $sentences{$sentence}+=2;
+	}
+    }
+    # extract specific (figure, table) references by number
+    my ($fignum) = $context =~ /[\.\?\!].*?(?:figure|table)s?[\-\_\ \.](\d+\w*)\W.*?[\.\?\!]/ig;
+    if ( $fignum ) {
+	foreach my $rw ( @refwords ) {
+	    while ( $context =~ /[\.\?\!](.*?(figure|table)[\-\_\ \.]$fignum\W.*?[\.\?\!])/ig ) {
+		my $sentence = $1;
+		$sentence =~ s/\s+/ /g;
+		$sentences{$sentence}+=4;
+	    }
+	}
+    }
+
+    # sentences with occurances of important words
+    @relwords = $reltext =~ /([a-zA-Z]{4,})/g; # take out small words
+    foreach my $word ( @relwords ) {
+	if ( $self->{'stopwords'}{$word} ) { next } # skip stop words
+	while ( $context =~ /([^\.\?\!]*?$word\W.*?[\.\?\!])/ig ) {
+	    my $sentence = $1;
+	    $sentence =~ s/\s+/ /g;
+	    $sentences{$sentence}++;
+	}
+    }
+    foreach my $sentence ( keys %sentences ) {
+	if ($sentences{$sentence} < $self->{'textrefs_threshold'}) {
+	    delete $sentences{$sentence};
+	}
+    }
+    my ($rval) = join "<br>\n", (keys %sentences);
+    if ( $rval && length($rval) > 5 ) {
+	return ( "<tr><td>TextualReferences</td><td>" . $rval . "</td></tr>\n") }
+    else { return "" }
+}
+
+# handles caption extraction
+# calling the extractor with different
+# tags and choosing the best candidate caption
+sub extract_caption_text {
+    my ($self, $tag, $textref, $prevpos, $pos, $nextpos) = (@_);
+    my (@neartext, $len, $hdelim, $mintext, $goodlen,
+	$startpos, $context, $context_size);
+    
+    $mintext = $self->{'min_near_text'};
+    $goodlen = $self->{'caption_length'};
+
+    # extract a context to extract near text from (faster)
+    $context_size = $self->{'max_near_text'}*3;
+    $startpos = $pos - ($context_size / 2);
+    if ($startpos < $prevpos ) { $startpos = $prevpos }
+    if ($nextpos != -1 && $context_size > ( $nextpos - $startpos )) 
+    { $context_size = ($nextpos - $startpos) }
+
+    $context = substr ( $$textref, $startpos, $context_size );
+    $context =~ s/<!--.*?-->//gs;
+    $context =~ s/^.*-->(.*)/$1/gs;
+    $context =~ s/(.*)<!--.*$/$1/gs;
+
+    # try stepping through markup delimiter sets
+    # and selecting the best one
+    foreach $hdelim ( @{ $self->{'cdelims'} } ) {
+	@neartext = $self->extract_caption($tag, $hdelim, \$context);
+	$len = length(join("", @neartext));
+	last if ($len >= $mintext && $len <= $goodlen);
+    }
+    # reject if well over reasonable length
+    if ( $len > $goodlen ) {
+	@neartext = [];
+    }
+    $neartext[0] = " " if (! defined $neartext[0]);
+    $neartext[1] = " " if (! defined $neartext[1]);
+    return "<tr><td>Caption</td><td>" . (join ",",  @neartext) . "</td></tr>\n"; # TODO: the | is for testing purposes
+} # end extract_caption_text
+
+# the previous section header often gives a bit
+# of context to the section that the image is
+# in (invariably the header is before/above the image)
+# so extract the text of the closest header above the image
+#
+# this fn just gets all the headers above the image, within the context window
+sub get_prev_header {
+    my ($self, $pos, $textref) = (@_);
+    my ($rhtext);
+    while ( $$textref =~ /<h\d>(.*?)<\/h\d>/sig ) {
+	# only headers before image
+	if ((pos $$textref) < $pos) {
+	    $rhtext .= "$1, ";
+	}
+    } 
+    if ( $rhtext ) { return "Header($rhtext)" }
+    else { return "" }
+}
+
+# not the most robust tag stripping 
+# regexps (see perl.com FAQ) but good enough
+#
+# used by caption & tag-based near text algorithms
+sub strip_tags {
+    my ( $self, $value ) = @_;
+    if ( ! defined($value) ) { $value = "" } # handle nulls
+    else {
+	$value =~ s/<.*?>//gs; # strip all html tags
+	$value =~ s/\s+/\ /g; # remove extra whitespace
+	$value =~ s/\&\w+\;//g; # remove &nbsp; etc
+    }
+    return $value;
+}
+
+# uses the given tag(s) to identify
+# the caption near to the image
+# (below, above or both below and above)
+sub extract_caption {
+    my ($self, $tag, $bound_tag, $contextref) = (@_);
+    my (@nt, $n, $etag, $gotcap);
+    return ("", "") if ( ! ($$contextref =~ /\Q$tag/) );
+
+    $nt[0] = $`;
+    $nt[1] = $';
+    $gotcap = 0;
+
+    # look before the image for a boundary tag
+    ($etag, $nt[0]) = $nt[0] =~ /<($bound_tag)[\s]?.*?>(.*?)$/is;
+    # if bound_tag too far from the image, then prob not caption
+    # (note: have to allow for tags, so multiply by 3
+    if ( $etag && length($nt[0]) < ($self->{'caption_length'} * 3) ) { 
+	if ( $nt[0] =~ /<\/$etag>/si ) {
+	    # the whole caption is above the image: <tag>text</tag><img>
+	    ($nt[0]) =~ /<(?:$etag)[\s]?.*?>(.*?)<\/$etag>/is;
+	    $nt[0] = $self->strip_tags($nt[0]);
+	    if ( length($nt[0]) > $self->{'min_near_text'} ) { 
+		$gotcap = 1;
+		$nt[1] = ""; 
+	    }
+
+	} elsif ( $nt[1] =~ /<\/$etag>/si) {
+	    # the caption tag covers image: <tag>text?<img>text?</tag>
+	    ($nt[1]) = $nt[1] =~ /(.*?)<\/$etag>/si;
+	    $nt[0] = $self->strip_tags($nt[0] . $nt[1]);
+	    if ( length($nt[0]) > $self->{'min_near_text'} ) { 
+		$gotcap = 2;
+		$nt[1] = "";
+	    }
+	}
+    }
+    # else try below the image
+    if ( ! $gotcap ) { 
+	# the caption is after the image: <img><tag>text</tag>
+	($etag, $nt[1]) = $nt[1] =~ /^.*?<($bound_tag)[\s]?.*?>(.*)/is;
+	if ( $etag && $nt[1] =~ /<\/$etag>/s) {
+	    ($nt[1]) = $nt[1] =~ /(.*?)<\/$etag>/si;
+	    $gotcap = 3;
+	    $nt[0] = "";
+	    $nt[1] = $self->strip_tags($nt[1]);
+	} 
+    }
+    if ( ! $gotcap ) { $nt[0] = $nt[1] = "" }
+    else {
+	# strip part-tags
+	$nt[0] =~ s/^.*>//s;
+	$nt[1] =~ s/<.*$//s;
+    }
+    my ($type);
+    if ( $gotcap == 0 ) { return ("nocaption", "") }
+    elsif ( $gotcap == 1 ) { $type = "captionabove:" }
+    elsif ( $gotcap == 2 ) { $type = "captioncovering:" }
+    elsif ( $gotcap == 3 ) { $type = "captionbelow:" }
+    return ($type, $nt[0], $nt[1]);
+}
+
+# tag-based near text
+# 
+# tries different tag sets
+# and chooses the best one
+sub extract_near_text {
+    my ($self, $tag, $textref, $prevpos, $pos, $nextpos) = (@_);
+    my (@neartext, $len, $hdelim, $maxtext, $mintext, $goodlen,
+	@bestlen, @best, $startpos, $context, $context_size,
+	$dist, $bdist, $best1, $i, $nt);
+    $bestlen[0] = $bestlen[1] = 0; $bestlen[2] = $bdist = 999999;
+    $best[0] = $best[1] = $best[2] = "";
+    $maxtext = $self->{'max_near_text'};
+    $mintext = $self->{'min_near_text'};
+    $goodlen = $self->{'neartext_length'}; 
+
+    # extract a context to extract near text from (faster)
+    $context_size = $maxtext*4;
+    $startpos = $pos - ($context_size / 2);
+    if ($startpos < $prevpos ) { $startpos = $prevpos }
+    if ($nextpos != -1 && $context_size > ( $nextpos - $startpos )) 
+    { $context_size = ($nextpos - $startpos) }
+    $context = substr ( $$textref, $startpos, $context_size );
+    $context =~ s/<!--.*?-->//gs;
+    $context =~ s/^.*-->(.*)/$1/gs;
+    $context =~ s/(.*)<!--.*$/$1/gs;
+
+    # try stepping through markup delimiter sets
+    # and selecting the best one
+    foreach $hdelim ( @{ $self->{'delims'} } ) {
+	@neartext = $self->extract_tagged_neartext($tag, $hdelim, \$context);
+	$nt = join("", @neartext);
+	$len = length($nt);
+	# Priorities:
+	# 1. Greater than mintext 
+	# 2. Less than maxtext 
+	# 3. Closest to goodlen
+	if ( $len <= $goodlen && $len > $bestlen[0] ) {
+	    $bestlen[0] = $len;
+	    $best[0] = $hdelim;
+	} elsif ( $len >= $maxtext && $len < $bestlen[2] ) {
+	    $bestlen[2] = $len;
+	    $best[2] = $hdelim;
+	} elsif ( $len >= $bestlen[0] && $len <= $bestlen[2] ) {
+	    $dist = abs($goodlen - $len);
+	    if ( $dist < $bdist ) {
+		$bestlen[1] = $len;
+		$best[1] = $hdelim;
+		$bdist = $dist;
+	    }
+	}
+    }
+    $best1 = 2;
+    foreach $i ( 0..2 ) {
+	if ( $bestlen[$i] == 999999 ) { $bestlen[$i] = 0 }
+	$dist = abs($goodlen - $bestlen[$i]);
+	if ( $bestlen[$i] > $mintext && $dist <= $bdist ) {
+	    $best1 = $i;
+	    $bdist = $dist;
+	}
+    }
+    @neartext = $self->extract_tagged_neartext($tag, $best[$best1], \$context);
+    if ( $bestlen[$best1] > $maxtext ) {
+	# truncate on word boundary if too much text
+	my $hmax = $maxtext / 2;
+	($neartext[0]) = $neartext[0] =~ /([^\s]*.{1,$hmax})$/s;
+	($neartext[1]) = $neartext[1] =~ /^(.{1,$hmax}[^\s]*)/s;
+    } elsif ( $bestlen[$best1] < $mintext ) {
+	# use plain text extraction if tags failed (e.g. usable tag outside context)
+	print {$self->{'outhandle'}} "HTMLImagePlugin: Fallback to plain-text extraction for $tag\n" 
+	    if $self->{'verbosity'} > 2;
+	$neartext[0] = "<tr><td>RawNeartext</td><td>" . $self->extract_raw_neartext($tag, $textref) . "</td></tr>";
+	$neartext[1] = "";
+    }
+    # get previous header if available
+    $neartext[0] .= "<br>\n" . 
+	$self->get_prev_header($pos, \$context) if ( $self->{'aggressiveness'} >= 4 );
+    $neartext[0] = " " if (! defined $neartext[0]);
+    $neartext[1] = " " if (! defined $neartext[1]);
+
+    return "<tr><td>NearText</td><td>" . (join "|",  @neartext) . "</td></tr>\n"; # TODO: the | is for testing purposes
+} # end extract_near_text
+
+# actually captures tag-based
+# near-text given a tag set
+sub extract_tagged_neartext {
+    my ($self, $tag, $bound_tag, $textref) = (@_);
+    return "" if ( ! ($$textref =~ /\Q$tag/) );
+    my (@nt, $delim, $pre_tag, $n);
+    $nt[0] = $`;
+    $nt[1] = $';
+
+    # get text after previous image tag
+    $nt[0] =~ s/.*<($bound_tag)[^>]*>(.*)/$2/is; # get rid of preceding text
+    if (defined($1)) { $delim = $1 }    
+    $pre_tag = $bound_tag;
+
+    if (defined($delim)) {
+	# we want to try and use the end tag of the previous delimiter
+	# (put it on the front of the list)
+	$pre_tag =~ s/(^|\|)($delim)($|\|)//i; # take it out
+	$pre_tag =~ s/\|\|/\|/i; # replace || with |
+	$pre_tag = $delim . "|" . $pre_tag; # put it on the front
+    }
+    
+    # get text before next image tag
+    $nt[1] =~ s/<\/?(?:$pre_tag)[^>]*>.*//is; # get rid of stuff after first delimiter
+
+    # process related text
+    for $n (0..1) {
+	if ( defined($nt[$n]) ) {
+	    $nt[$n] =~ s/<.*?>//gs; # strip all html tags
+	    $nt[$n] =~ s/\s+/\ /gs; # remove extra whitespace
+	    $nt[$n] =~ s/\&\w+\;//sg; # remove &nbsp; etc
+	    # strip part-tags
+	    if ( $n == 0 ) { $nt[0] =~ s/^.*>//s }
+	    if ( $n == 1 ) { $nt[1] =~ s/<.*$//s }
+	} else { $nt[$n] = ""; } # handle nulls
+    }
+    return @nt;
+}
+
+# this function is fall-back
+# if tags aren't suitable.
+#
+# extracts a fixed length of characters
+# either side of image tag (on word boundary)
+sub extract_raw_neartext {
+    my ($self, $tag, $textref) = (@_);
+    my ($rawtext, $startpos, $fp);
+    my $imgs = \%{$self->{'imglist'}};
+    ($fp) = $tag =~ /([\w\\\/]+\.(?:gif|jpe?g|png))/is;
+    if (! $fp) { return " " };
+    # if the cached, plain-text version isn't there, then create it
+    $self->init_plaintext($textref) unless defined($self->{'plaintext'});
+
+    # take the closest maxtext/2 characters 
+    # either side of the tag (by word boundary)
+    return "" if ( ! exists $imgs->{$fp}{'rawpos'} );
+    $startpos = $imgs->{$fp}{'rawpos'} - (($self->{'max_near_text'} / 2) + 20);
+    if ( $startpos < 0 ) { $startpos = 0 }
+    $rawtext = substr $self->{'plaintext'}, $startpos, $self->{'max_near_text'} + 20;
+    $rawtext =~ s/\s\s/ /g;
+
+    return $rawtext;
+}
+
+# init plaintext variable for HTML-stripped version 
+# (for full text index/raw assoc text extraction)
+sub init_plaintext {
+    my ($self, $textref) = (@_);
+    my ($page, $fp);
+    my $imgs = \%{$self->{'imglist'}};
+    $page = $$textref; # make a copy of original
+
+    # strip tags around image filenames so they don't get zapped
+    $page =~ s/<\w+\s+.*?([\w\/\\]+\.(?:gif|jpe?g|png))[^>]*>/\"$1\"/gsi;
+    $page =~ s/<.*?>//gs;
+    $page =~ s/&nbsp;/ /gs;
+    $page =~ s/&amp;/&/gs; #TODO: more &zzz; replacements (except &lt;, $gt;)
+
+    # get positions and strip images
+    while ( $page =~ /([^\s\'\"]+\.(jpe?g|gif|png))/ig ) {
+	$fp = $1;
+	if ( $imgs->{$fp}{'exists'} ) {
+	    $imgs->{$fp}{'rawpos'} = pos $page;
+	}
+	$page =~ s/\"$fp\"//gs;
+    }
+    $self->{'plaintext'} = $page;
+}
+
+# finds and filters images based on size 
+# (dimensions, height, filesize) and existence
+#
+# looks for image filenames (.jpg, .gif, etc)
+# and checks for existence on disk 
+# (hence supports most JavaScript images)
+sub get_img_list {
+    my $self = shift (@_);
+    my ($textref) = (@_);
+    my ($filepath, $relpath, $abspath, $pos, $num, $width, $height, $filesize);
+    my $imgs = \%{$self->{'imglist'}};
+    while ( $$textref =~ /([^\s\'\"]+\.(jpe?g|gif|png))/ig ) {
+	$filepath = $1;
+	$pos = pos $$textref;
+	next if ( $imgs->{$filepath}{'relpath'} );
+        $relpath = $filepath;
+	$relpath =~ s/^http\:\/\///; # remove http:// in case we have mirrored it
+	$relpath =~ s/\\/\//g;  # replace \ with /
+	$relpath =~ s/^\.\///s; # make "./filepath" into "filepath"
+	$imgs->{$filepath}{'relpath'} = $relpath;
+	$abspath = "$self->{'htpath'}/$relpath";
+
+	if (! -e $abspath) { next }
+
+	# can't modify real filepath var because it
+	# then can't be located in the page for tag recognition later
+	my $imagick_cmd = "\"".&util::get_perl_exec()."\" -S gs-magick.pl";
+	($width, $height) = 
+	    `$imagick_cmd identify $abspath -ping -format "%wx%h"` =~ /^(\d*)x(\d*)$/m;
+	if (! ($width && $height)) { 
+	    print STDERR "HTMLImagePlugin: ($abspath) 'identify' failed. Check ImageMagicK binaries are installed and working correctly\n"; next;
+	}
+	$filesize = (-s $abspath);
+	if ( $filesize >= $self->{'min_size'} 
+	    && ( $width >= $self->{'min_width'} ) 
+	    && ( $height >= $self->{'min_height'} ) ) {
+	    
+	   $imgs->{$filepath}{'exists'} = 1;
+	   $imgs->{$filepath}{'pos'} = $pos;
+	   $imgs->{$filepath}{'width'} = $width;
+	   $imgs->{$filepath}{'height'} = $height;
+	   $imgs->{$filepath}{'filesize'} = $filesize;
+       } else {
+	   print {$self->{'outhandle'}} "HTMLImagePlugin: skipping $self->{'base_path'}/$relpath: $filesize, $width x $height\n" 
+	       if $self->{'verbosity'} > 2;
+       }
+    }
+    $num = 0;
+    foreach my $i ( keys %{$imgs} ) {
+	if ( $imgs->{$i}{'pos'} ) {
+	    $num++;
+	} else { delete $imgs->{$i} }
+    }
+    return $num;
+}
+
+# make the text available to the read function
+# by making it an object variable
+sub read_file {
+    my ($self, $filename, $encoding, $language, $textref) = @_;
+    $self->SUPER::read_file($filename, $encoding, $language, $textref);
+
+    # if HTMLplug has run through, then it will
+    # have replaced references so we have to 
+    # make a copy of the text before processing
+    if ( $self->{'index_pages'} ) {
+	$self->{'text'} = $$textref;
+	$self->{'textref'} = \($self->{'text'});
+    } else {
+	$self->{'textref'} = $textref;
+    }
+    $self->{'plaintext'} = undef;
+}
+
+# HTMLPlugin only extracts meta-data if it is specified in plugin options
+# hence a special function to do it here
+sub get_meta_value {
+    my ($self, $name, $textref) = @_;
+    my ($value);
+    $name = lc $name;
+    if ($name eq "title") {
+	($value) = $$textref =~ /<title>(.*?)<\/title>/is
+    } else {
+	my $qm = "(?:\"|\')";
+	($value) = $$textref =~ /<meta name\s*=\s*$qm?$name$qm?\s+content\s*=\s*$qm?(.*?)$qm?\s*>/is
+    }
+    $value = "" unless $value;
+    return $value;
+}
+
+# make filename an anchor reference
+# so we can go straight to the image
+# within the cached version of the source page
+# (augment's HTMLPlugin sub)
+sub replace_images {
+    my $self = shift (@_);
+    my ($front, $link, $back, $base_dir, 
+	$file, $doc_obj, $section) = @_;
+    $link =~ s/\"//g;
+    my ($a_name) = $link;
+    $a_name =~ s/[\/\\\:\&]/_/g;
+    # keep a list so we don't repeat the same anchor
+    if ( ! $self->{'imglist'}{$link}{'anchored'} ) {
+	$front = "<a name=\"gsdl_$a_name\">$front";
+	$back = "$back</a>";
+	$self->{'imglist'}{$link}{'anchored'} = 1;
+    }
+    return $self->SUPER::replace_images($front, $link, $back, $base_dir, 
+				     $file, $doc_obj, $section);
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/HTMLPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/HTMLPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/HTMLPlugin.pm	(revision 24799)
@@ -0,0 +1,1858 @@
+###########################################################################
+#
+# HTMLPlugin.pm -- basic html plugin
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# 
+# Note that this plugin handles frames only in a very simple way
+# i.e. each frame is treated as a separate document. This means
+# search results will contain links to individual frames rather
+# than linking to the top level frameset.
+# There may also be some problems caused by the _parent target
+# (it's removed by this plugin)
+#
+
+package HTMLPlugin;
+
+use Encode;
+use Unicode::Normalize 'normalize';
+
+use ReadTextFile;
+use HBPlugin;
+use ghtml;
+use unicode;
+use util;
+use XMLParser;
+
+use Image::Size;
+use File::Copy;
+
+sub BEGIN {
+    @HTMLPlugin::ISA = ('ReadTextFile', 'HBPlugin');
+}
+
+use strict; # every perl program should have this!
+no strict 'refs'; # make an exception so we can use variables as filehandles
+
+my $arguments =
+    [ { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'deft' =>  &get_default_process_exp() },
+      { 'name' => "block_exp",
+	'desc' => "{BasePlugin.block_exp}",
+	'type' => 'regexp',
+	'deft' =>  &get_default_block_exp() },
+      { 'name' => "nolinks",
+	'desc' => "{HTMLPlugin.nolinks}",
+	'type' => "flag" },
+      { 'name' => "keep_head",
+	'desc' => "{HTMLPlugin.keep_head}",
+	'type' => "flag" },
+      { 'name' => "no_metadata",
+	'desc' => "{HTMLPlugin.no_metadata}",
+	'type' => "flag" },
+      { 'name' => "metadata_fields",
+	'desc' => "{HTMLPlugin.metadata_fields}",
+	'type' => "string",
+	'deft' => "Title" },
+      { 'name' => "metadata_field_separator",
+	'desc' => "{HTMLPlugin.metadata_field_separator}",
+	'type' => "string",
+	'deft' => "" },
+      { 'name' => "hunt_creator_metadata",
+	'desc' => "{HTMLPlugin.hunt_creator_metadata}",
+	'type' => "flag" },
+      { 'name' => "file_is_url",
+	'desc' => "{HTMLPlugin.file_is_url}",
+	'type' => "flag" },
+      { 'name' => "assoc_files",
+	'desc' => "{HTMLPlugin.assoc_files}",
+	'type' => "regexp",
+	'deft' => &get_default_block_exp() },
+      { 'name' => "rename_assoc_files",
+	'desc' => "{HTMLPlugin.rename_assoc_files}",
+	'type' => "flag" },
+      { 'name' => "title_sub",
+	'desc' => "{HTMLPlugin.title_sub}",
+	'type' => "string", 
+	'deft' => "" },
+      { 'name' => "description_tags",
+	'desc' => "{HTMLPlugin.description_tags}",
+	'type' => "flag" },
+      # retain this for backward compatibility (w3mir option was replaced by
+      # file_is_url)
+      { 'name' => "w3mir",
+#	'desc' => "{HTMLPlugin.w3mir}",
+	'type' => "flag",
+	'hiddengli' => "yes"},
+      { 'name' => "no_strip_metadata_html",
+	'desc' => "{HTMLPlugin.no_strip_metadata_html}",
+	'type' => "string",
+	'deft' => "",
+	'reqd' => "no"},
+      { 'name' => "sectionalise_using_h_tags",
+	'desc' => "{HTMLPlugin.sectionalise_using_h_tags}",
+	'type' => "flag" },
+      { 'name' => "use_realistic_book",
+        'desc' => "{HTMLPlugin.tidy_html}",
+	'type' => "flag"},
+      { 'name' => "old_style_HDL",
+        'desc' => "{HTMLPlugin.old_style_HDL}",
+	'type' => "flag"},
+      {'name' => "processing_tmp_files",
+       'desc' => "{BasePlugin.processing_tmp_files}",
+       'type' => "flag",
+       'hiddengli' => "yes"}
+      ];
+
+my $options = { 'name'     => "HTMLPlugin",
+		'desc'     => "{HTMLPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+    
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+    
+
+    my $self = new ReadTextFile($pluginlist,$inputargs,$hashArgOptLists);
+    
+    if ($self->{'w3mir'}) {
+	$self->{'file_is_url'} = 1;
+    }
+    $self->{'aux_files'} = {};
+    $self->{'dir_num'} = 0;
+    $self->{'file_num'} = 0;
+    
+    return bless $self, $class;
+}
+
+# may want to use (?i)\.(gif|jpe?g|jpe|png|css|js(?:@.*)?)$
+# if have eg <script language="javascript" src="img/lib.js@123">
+# blocking is now done by reading through the file and recording all the 
+# images and other files
+sub get_default_block_exp {
+    my $self = shift (@_);
+    
+    #return q^(?i)\.(gif|jpe?g|jpe|jpg|png|css)$^;
+    return "";
+}
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+    
+    # the last option is an attempt to encode the concept of an html query ...
+    return q^(?i)(\.html?|\.shtml|\.shm|\.asp|\.php\d?|\.cgi|.+\?.+=.*)$^;
+}
+
+sub store_block_files
+{
+    my $self =shift (@_);
+    my ($filename_full_path, $block_hash) = @_;
+
+    my $html_fname = $filename_full_path;
+    
+    my ($language, $content_encoding) = $self->textcat_get_language_encoding ($filename_full_path);
+    $self->{'store_content_encoding'}->{$filename_full_path} = $content_encoding;
+
+    # read in file ($text will be in utf8)
+    my $raw_text = "";
+    $self->read_file_no_decoding($filename_full_path, \$raw_text);
+
+    my $textref = \$raw_text;
+    my $opencom = '(?:<!--|&lt;!(?:&mdash;|&#151;|--))';
+    my $closecom = '(?:-->|(?:&mdash;|&#151;|--)&gt;)';
+    $$textref =~ s/$opencom(.*?)$closecom//gs;
+
+    # Convert entities to their UTF8 equivalents
+    $$textref =~ s/&(lt|gt|amp|quot|nbsp);/&z$1;/go;
+    $$textref =~ s/&([^;]+);/&ghtml::getcharequiv($1,1,0)/gseo; # on this occassion, want it left as utf8
+    $$textref =~ s/&z(lt|gt|amp|quot|nbsp);/&$1;/go;
+
+    my $attval = "\\\"[^\\\"]+\\\"|[^\\s>]+";
+    my @img_matches = ($$textref =~ m/<img[^>]*?src\s*=\s*($attval)[^>]*>/igs);
+    my @usemap_matches = ($$textref =~ m/<img[^>]*?usemap\s*=\s*($attval)[^>]*>/igs);
+    my @link_matches = ($$textref =~ m/<link[^>]*?href\s*=\s*($attval)[^>]*>/igs);
+    my @embed_matches = ($$textref =~ m/<embed[^>]*?src\s*=\s*($attval)[^>]*>/igs);
+    my @tabbg_matches = ($$textref =~ m/<(?:body|table|tr|td)[^>]*?background\s*=\s*($attval)[^>]*>/igs);
+    my @script_matches = ($$textref =~ m/<script[^>]*?src\s*=\s*($attval)[^>]*>/igs);
+
+    if(!defined $self->{'unicode_to_original_filename'}) { 
+	# maps from utf8 converted link name -> original filename referrred to by (possibly URL-encoded) src url
+	$self->{'unicode_to_original_filename'} = {};
+    }
+
+    foreach my $raw_link (@img_matches, @usemap_matches, @link_matches, @embed_matches, @tabbg_matches, @script_matches) {
+
+	# remove quotes from link at start and end if necessary
+	if ($raw_link =~ m/^\"/) {
+	    $raw_link =~ s/^\"//;
+	    $raw_link =~ s/\"$//;
+	}
+
+	# remove any anchor names, e.g. foo.html#name becomes foo.html 
+	# but watch out for any #'s that are part of entities, such as &#x3B1;
+	$raw_link =~ s/([^&])\#.*$/$1/s; 
+
+	# some links may just be anchor names
+	next unless ($raw_link =~ /\S+/);
+
+	if ($raw_link !~ m@^/@ && $raw_link !~ m/^([A-Z]:?)\\/i) {
+	    # Turn relative file path into full path
+	    my $dirname = &File::Basename::dirname($filename_full_path);
+	    $raw_link = &util::filename_cat($dirname, $raw_link);
+	}
+	$raw_link = $self->eval_dir_dots($raw_link);
+
+	# this is the actual filename on the filesystem (that the link refers to)
+	my $url_original_filename = $self->opt_url_decode($raw_link);
+
+	my ($uses_bytecodes,$exceeds_bytecodes) = &unicode::analyze_raw_string($url_original_filename);
+
+	if ($exceeds_bytecodes) {
+	    # We have a link to a file name that is more complicated than a raw byte filename
+	    # What we do next depends on the operating system we are on
+
+	    if ($ENV{'GSDLOS'} =~ /^(linux|solaris)$/i) {
+		# Assume we're dealing with a UTF-8 encoded filename
+		$url_original_filename = encode("utf8", $url_original_filename);
+	    }
+	    elsif ($ENV{'GSDLOS'} =~ /^darwin$/i) {
+		# HFS+ is UTF8 with decompostion
+		$url_original_filename = encode("utf8", $url_original_filename);
+		$url_original_filename = normalize('D', $url_original_filename); # Normalization Form D (decomposition)		
+	    }
+	    elsif ($ENV{'GSDLOS'} =~ /^windows$/i) {
+		# Don't need to do anything as later code maps Windows
+		# unicode filenames to DOS short filenames when needed		
+	    }
+	    else {
+		my $outhandle = $self->{'outhandle'};
+		print $outhandle "Warning: Unrecognized operating system ", $ENV{'GSDLOS'}, "\n";
+		print $outhandle "         in raw file system encoding of: $raw_link\n";
+		print $outhandle "         Assuming filesystem is UTF-8 based.\n";
+		$url_original_filename = encode("utf8", $url_original_filename);
+	    }
+	}
+
+	# Convert the (currently raw) link into its Unicode version. 
+	# Store the Unicode link along with the url_original_filename
+	my $unicode_url_original_filename = "";
+	$self->decode_text($raw_link,$content_encoding,$language,\$unicode_url_original_filename);
+
+
+	$self->{'unicode_to_original_filename'}->{$unicode_url_original_filename} = $url_original_filename;
+
+
+	if ($url_original_filename ne $unicode_url_original_filename) {
+	    my $outhandle = $self->{'outhandle'};
+	    
+	    print $outhandle "URL Encoding $url_original_filename\n";
+	    print $outhandle " ->$unicode_url_original_filename\n";
+
+	    # Allow for possibility of raw byte version and Unicode versions of file
+	    &util::block_filename($block_hash,$unicode_url_original_filename);
+	}
+
+	# $url_original_filename = &util::upgrade_if_dos_filename($url_original_filename);
+	&util::block_filename($block_hash,$url_original_filename);
+		
+    }
+}
+
+# Given a filename in any encoding, will URL decode it to get back the original filename
+# in the original encoding. Because this method is intended to work out the *original* 
+# filename*, it does not URL decode any filename if a file by the name of the *URL-encoded*
+# string already exists in the local folder.
+#
+sub opt_url_decode {
+    my $self = shift (@_);
+    my ($raw_link) = @_;
+
+
+    # Replace %XX's in URL with decoded value if required.
+    # Note that the filename may include the %XX in some situations
+
+##    if ($raw_link =~ m/\%[A-F0-9]{2}/i) {
+
+    if (($raw_link =~ m/\%[A-F0-9]{2}/i) || ($raw_link =~ m/\&\#x[0-9A-F]+;/i) || ($raw_link =~ m/\&\#[0-9]+;/i)) {
+	if (!-e $raw_link) {
+	    $raw_link = &unicode::url_decode($raw_link,1);
+	}
+    } 
+    
+    return $raw_link;
+}
+
+sub read_into_doc_obj 
+{
+    my $self = shift (@_);  
+    my ($pluginfo, $base_dir, $file, $block_hash, $metadata, $processor, $maxdocs, $total_count, $gli) = @_;
+        
+    my ($filename_full_path, $filename_no_path) = &util::get_full_filenames($base_dir, $file);
+
+    # Lookup content_encoding worked out in file_block pass for this file
+    # Store it under the local name 'content_encoding' so its nice and 
+    # easy to access
+    $self->{'content_encoding'} = $self->{'store_content_encoding'}->{$filename_full_path};
+
+    # get the input file
+    my $input_filename = $file;
+    my ($tailname, $dirname, $suffix) = &File::Basename::fileparse($input_filename, "\\.[^\\.]+\$");
+    $suffix = lc($suffix);   
+    my $tidy_filename;
+    if (($self->{'use_realistic_book'}) || ($self->{'old_style_HDL'}))
+    {
+	# because the document has to be sectionalized set the description tags 
+	$self->{'description_tags'} = 1;
+	
+	# set the file to be tidied
+	$input_filename = &util::filename_cat($base_dir,$file) if $base_dir =~ m/\w/;
+	
+	# get the tidied file
+	#my $tidy_filename = $self->tmp_tidy_file($input_filename);
+	$tidy_filename = $self->convert_tidy_or_oldHDL_file($input_filename);
+	
+	# derive tmp filename from input filename
+	my ($tailname, $dirname, $suffix) = &File::Basename::fileparse($tidy_filename, "\\.[^\\.]+\$");
+	
+	# set the new input file and base_dir to be from the tidied file
+	$file = "$tailname$suffix";
+	$base_dir = $dirname;
+    }
+    
+    # call the parent read_into_doc_obj
+    my ($process_status,$doc_obj) = $self->SUPER::read_into_doc_obj($pluginfo, $base_dir, $file, $block_hash, $metadata, $processor, $maxdocs, $total_count, $gli);
+    if (($self->{'use_realistic_book'}) || ($self->{'old_style_HDL'}))
+    {
+	# now we need to reset the filenames in the doc obj so that the converted filenames are not used
+	my $collect_file = &util::filename_within_collection($filename_full_path);
+	$doc_obj->set_source_filename ($collect_file, $self->{'file_rename_method'}); 
+	## set_source_filename does not set the doc_obj source_path which is used in archives dbs for incremental
+	# build. So set it manually.
+	$doc_obj->set_source_path($filename_full_path);
+	my $collect_conv_file = &util::filename_within_collection($tidy_filename);
+	$doc_obj->set_converted_filename($collect_conv_file);
+
+	my $plugin_filename_encoding = $self->{'filename_encoding'};
+	my $filename_encoding = $self->deduce_filename_encoding($file,$metadata,$plugin_filename_encoding);
+	$self->set_Source_metadata($doc_obj, $filename_full_path, $filename_encoding);
+    }
+
+    delete $self->{'store_content_encoding'}->{$filename_full_path};
+    $self->{'content_encoding'} = undef;
+
+    return ($process_status,$doc_obj);
+}
+
+# do plugin specific processing of doc_obj
+sub process {
+    my $self = shift (@_);
+    my ($textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    if ($ENV{'GSDLOS'} =~ m/^windows/i) {
+	# this makes life so much easier... perl can cope with unix-style '/'s.
+	$base_dir =~ s@(\\)+@/@g; 
+	$file =~ s@(\\)+@/@g;     
+    }
+
+    my $filename = &util::filename_cat($base_dir,$file);
+    my $upgraded_base_dir = &util::upgrade_if_dos_filename($base_dir);
+    my $upgraded_filename = &util::upgrade_if_dos_filename($filename);
+
+    if ($ENV{'GSDLOS'} =~ m/^windows/i) {
+	# And again
+	$upgraded_base_dir =~ s@(\\)+@/@g;	
+	$upgraded_filename =~ s@(\\)+@/@g;
+	
+	# Need to make sure there is a '/' on the end of upgraded_base_dir
+	if (($upgraded_base_dir ne "") && ($upgraded_base_dir !~ m/\/$/)) {
+	    $upgraded_base_dir .= "/";
+	}
+    }
+    my $upgraded_file = &util::filename_within_directory($upgraded_filename,$upgraded_base_dir);
+    
+    # reset per-doc stuff...
+    $self->{'aux_files'} = {};
+    $self->{'dir_num'} = 0;
+    $self->{'file_num'} = 0;
+
+    # process an HTML file where sections are divided by headings tags (H1, H2 ...)
+    # you can also include metadata in the format (X can be any number)
+    # <hX>Title<!--gsdl-metadata
+    #	<Metadata name="name1">value1</Metadata>
+    #	...
+    #	<Metadata name="nameN">valueN</Metadata>
+    #--></hX>
+    if ($self->{'sectionalise_using_h_tags'}) {
+	# description_tags should allways be activated because we convert headings to description tags
+	$self->{'description_tags'} = 1;
+
+	my $arrSections = [];
+	$$textref =~ s/<h([0-9]+)[^>]*>(.*?)<\/h[0-9]+>/$self->process_heading($1, $2, $arrSections, $upgraded_file)/isge;
+
+	if (scalar(@$arrSections)) {
+	    my $strMetadata = $self->update_section_data($arrSections, -1);
+	    if (length($strMetadata)) {
+		$strMetadata = '<!--' . $strMetadata . "\n-->\n</body>";
+		$$textref =~ s/<\/body>/$strMetadata/ig;
+	    }
+	}
+    }
+
+    my $cursection = $doc_obj->get_top_section();
+
+    $self->extract_metadata ($textref, $metadata, $doc_obj, $cursection)
+	unless $self->{'no_metadata'} || $self->{'description_tags'};
+
+    # Store URL for page as metadata - this can be used for an
+    # altavista style search interface. The URL won't be valid
+    # unless the file structure contains the domain name (i.e.
+    # like when w3mir is used to download a website).
+
+    # URL metadata (even invalid ones) are used to support internal
+    # links, so even if 'file_is_url' is off, still need to store info
+
+    my ($tailname,$dirname) = &File::Basename::fileparse($upgraded_file);
+
+#    my $utf8_file = $self->filename_to_utf8_metadata($file);
+#    $utf8_file =~ s/&\#095;/_/g;
+#    variable below used to be utf8_file
+
+    my $url_encoded_file = &unicode::raw_filename_to_url_encoded($tailname);
+    my $utf8_url_encoded_file = &unicode::raw_filename_to_utf8_url_encoded($tailname);
+
+    my $web_url = "http://";
+    my $utf8_web_url = "http://";
+    if(defined $dirname) { # local directory
+        # Check for "ftp" in the domain name of the directory
+        #  structure to determine if this URL should be a ftp:// URL
+        # This check is not infallible, but better than omitting the
+        #  check, which would cause all files downloaded from ftp sites
+        #  via mirroring with wget to have potentially erroneous http:// URLs
+        #  assigned in their metadata
+        if ($dirname =~ /^[^\/]*ftp/i)
+	{
+	  $web_url = "ftp://";
+	  $utf8_web_url = "ftp://";
+	}
+	$dirname = $self->eval_dir_dots($dirname);
+	$dirname .= &util::get_dirsep() if $dirname ne ""; # if there's a directory, it should end on "/"
+
+	$web_url = $web_url.$dirname.$url_encoded_file; 
+	$utf8_web_url = $utf8_web_url.$dirname.$utf8_url_encoded_file; 
+    } else {
+	$web_url = $web_url.$url_encoded_file;
+	$utf8_web_url = $utf8_web_url.$utf8_url_encoded_file;
+    }
+    $web_url =~ s/\\/\//g;
+    $utf8_web_url =~ s/\\/\//g;
+
+    if ((defined $ENV{"DEBUG_UNICODE"}) && ($ENV{"DEBUG_UNICODE"})) {
+	print STDERR "*******DEBUG: upgraded_file:       $upgraded_file\n";
+	print STDERR "*******DEBUG: adding URL metadata: $utf8_url_encoded_file\n";
+    }
+
+
+    $doc_obj->add_utf8_metadata($cursection, "URL", $web_url);
+    $doc_obj->add_utf8_metadata($cursection, "UTF8URL", $utf8_web_url);
+
+    if ($self->{'file_is_url'}) {
+	$doc_obj->add_metadata($cursection, "weblink", "<a href=\"$web_url\">");
+	$doc_obj->add_metadata($cursection, "webicon", "_iconworld_");
+	$doc_obj->add_metadata($cursection, "/weblink", "</a>");
+    }
+
+    if ($self->{'description_tags'}) {
+	# remove the html header - note that doing this here means any
+	# sections defined within the header will be lost (so all <Section>
+	# tags must appear within the body of the HTML)
+	my ($head_keep) = ($$textref =~ m/^(.*?)<body[^>]*>/is);
+
+	$$textref =~ s/^.*?<body[^>]*>//is;
+	$$textref =~ s/(<\/body[^>]*>|<\/html[^>]*>)//isg;
+
+	my $opencom = '(?:<!--|&lt;!(?:&mdash;|&#151;|--))';
+	my $closecom = '(?:-->|(?:&mdash;|&#151;|--)&gt;)';
+
+	my $lt = '(?:<|&lt;)';
+	my $gt = '(?:>|&gt;)';
+	my $quot = '(?:"|&quot;|&rdquo;|&ldquo;)';
+
+	my $dont_strip = '';
+	if ($self->{'no_strip_metadata_html'}) {
+	    ($dont_strip = $self->{'no_strip_metadata_html'}) =~ s{,}{|}g;
+	}
+
+	my $found_something = 0; my $top = 1;
+	while ($$textref =~ s/^(.*?)$opencom(.*?)$closecom//s) {
+	    my $text = $1;
+	    my $comment = $2;
+	    if (defined $text) {
+		# text before a comment - note that getting to here
+		# doesn't necessarily mean there are Section tags in
+		# the document
+		$self->process_section(\$text, $upgraded_base_dir, $upgraded_file, $doc_obj, $cursection);
+	    }
+	    while ($comment =~ s/$lt(.*?)$gt//s) {
+		my $tag = $1;
+		if ($tag eq "Section") {
+		    $found_something = 1;
+		    $cursection = $doc_obj->insert_section($doc_obj->get_end_child($cursection)) unless $top;
+		    $top = 0;
+		} elsif ($tag eq "/Section") {
+		    $found_something = 1;
+		    $cursection = $doc_obj->get_parent_section ($cursection);
+		} elsif ($tag =~ m/^Metadata name=$quot(.*?)$quot/s) {
+		    my $metaname = $1;
+		    my $accumulate = $tag =~ m/mode=${quot}accumulate${quot}/ ? 1 : 0;
+		    $comment =~ s/^(.*?)$lt\/Metadata$gt//s;
+		    my $metavalue = $1;
+		    $metavalue =~ s/^\s+//;
+		    $metavalue =~ s/\s+$//;
+                    # assume that no metadata value intentionally includes
+                    # carriage returns or HTML tags (if they're there they
+                    # were probably introduced when converting to HTML from
+                    # some other format).
+		    # actually some people want to have html tags in their
+		    # metadata.
+		    $metavalue =~ s/[\cJ\cM]/ /sg;
+		    $metavalue =~ s/<[^>]+>//sg
+			unless $dont_strip && ($dont_strip eq 'all' || $metaname =~ m/^($dont_strip)$/);
+		    $metavalue =~ s/\s+/ /sg;
+		    if ($metaname =~ /\./) { # has a namespace
+			$metaname = "ex.$metaname";
+		    }
+		    if ($accumulate) {
+			$doc_obj->add_utf8_metadata($cursection, $metaname, $metavalue);
+		    } else {
+			$doc_obj->set_utf8_metadata_element($cursection, $metaname, $metavalue);	
+		    }
+		} elsif ($tag eq "Description" || $tag eq "/Description") {
+		    # do nothing with containing Description tags
+		} else {
+		    # simple HTML tag (probably created by the conversion
+		    # to HTML from some other format) - we'll ignore it and
+		    # hope for the best ;-)
+		}
+	    }
+	}
+	if ($cursection ne "") {
+	    print $outhandle "HTMLPlugin: WARNING: $upgraded_file contains unmatched <Section></Section> tags\n";
+	}
+
+	$$textref =~ s/^.*?<body[^>]*>//is;
+	$$textref =~ s/(<\/body[^>]*>|<\/html[^>]*>)//isg;
+	if ($$textref =~ m/\S/) {
+	    if (!$found_something) {
+		if ($self->{'verbosity'} > 2) {
+		    print $outhandle "HTMLPlugin: WARNING: $upgraded_file appears to contain no Section tags so\n";
+		    print $outhandle "          will be processed as a single section document\n";
+		}
+
+		# go ahead and process single-section document
+		$self->process_section($textref, $upgraded_base_dir, $upgraded_file, $doc_obj, $cursection);
+
+		# if document contains no Section tags we'll go ahead
+		# and extract metadata (this won't have been done
+		# above as the -description_tags option prevents it)
+		my $complete_text = $head_keep.$doc_obj->get_text($cursection);
+		$self->extract_metadata (\$complete_text, $metadata, $doc_obj, $cursection) 
+		    unless $self->{'no_metadata'};
+
+	    } else {
+		print $outhandle "HTMLPlugin: WARNING: $upgraded_file contains the following text outside\n";
+		print $outhandle "          of the final closing </Section> tag. This text will\n";
+		print $outhandle "          be ignored.";
+
+		my ($text);
+		if (length($$textref) > 30) {
+		    $text = substr($$textref, 0, 30) . "...";
+		} else {
+		    $text = $$textref;
+		}
+		$text =~ s/\n/ /isg;
+		print $outhandle " ($text)\n";
+	    }
+	} elsif (!$found_something) {
+
+	    if ($self->{'verbosity'} > 2) {
+		# may get to here if document contained no valid Section
+		# tags but did contain some comments. The text will have
+		# been processed already but we should print the warning
+		# as above and extract metadata
+		print $outhandle "HTMLPlugin: WARNING: $upgraded_file appears to contain no Section tags and\n";
+		print $outhandle "          is blank or empty.  Metadata will be assigned if present.\n";
+	    }
+
+	    my $complete_text = $head_keep.$doc_obj->get_text($cursection);
+	    $self->extract_metadata (\$complete_text, $metadata, $doc_obj, $cursection) 
+		unless $self->{'no_metadata'};
+	}
+	
+    } else {
+
+	# remove header and footer
+	if (!$self->{'keep_head'} || $self->{'description_tags'}) {
+	    $$textref =~ s/^.*?<body[^>]*>//is;
+	    $$textref =~ s/(<\/body[^>]*>|<\/html[^>]*>)//isg;
+	}
+
+
+	# single section document
+	$self->process_section($textref, $upgraded_base_dir, $upgraded_file, $doc_obj, $cursection);
+    }
+
+    return 1;
+}
+
+
+sub process_heading
+{
+    my ($self, $nHeadNo, $strHeadingText, $arrSections, $file) = @_;
+    $strHeadingText = '' if (!defined($strHeadingText));
+
+    my $strMetadata = $self->update_section_data($arrSections, int($nHeadNo));
+
+    my $strSecMetadata = '';
+    while ($strHeadingText =~ s/<!--gsdl-metadata(.*?)-->//is)
+    {
+	$strSecMetadata .= $1;
+    }
+
+    $strHeadingText =~ s/^\s+//g;
+    $strHeadingText =~ s/\s+$//g;
+    $strSecMetadata =~ s/^\s+//g;
+    $strSecMetadata =~ s/\s+$//g;
+
+    $strMetadata .= "\n<Section>\n\t<Description>\n\t\t<Metadata name=\"Title\">" . $strHeadingText . "</Metadata>\n";
+
+    if (length($strSecMetadata)) {
+	$strMetadata .= "\t\t" . $strSecMetadata . "\n";
+    }
+
+    $strMetadata .= "\t</Description>\n";
+
+    return "<!--" . $strMetadata . "-->";
+}
+
+
+sub update_section_data
+{
+    my ($self, $arrSections, $nCurTocNo) = @_;
+    my ($strBuffer, $nLast, $nSections) = ('', 0, scalar(@$arrSections));
+
+    if ($nSections == 0) {
+	push @$arrSections, $nCurTocNo;
+	return $strBuffer;
+    }
+    $nLast = $arrSections->[$nSections - 1];
+    if ($nCurTocNo > $nLast) {
+	push @$arrSections, $nCurTocNo;
+	return $strBuffer;
+    }
+    for(my $i = $nSections - 1; $i >= 0; $i--) {
+	if ($nCurTocNo <= $arrSections->[$i]) {
+	    $strBuffer .= "\n</Section>";
+	    pop @$arrSections;
+	}
+    }
+    push @$arrSections, $nCurTocNo;
+    return $strBuffer;
+}
+
+
+# note that process_section may be called multiple times for a single
+# section (relying on the fact that add_utf8_text appends the text to any
+# that may exist already).
+sub process_section {
+    my $self = shift (@_);
+    my ($textref, $base_dir, $file, $doc_obj, $cursection) = @_;
+    # trap links
+    if (!$self->{'nolinks'}) {
+	# usemap="./#index" not handled correctly => change to "#index"
+##	$$textref =~ s/(<img[^>]*?usemap\s*=\s*[\"\']?)([^\"\'>\s]+)([\"\']?[^>]*>)/
+
+##	my $opencom = '(?:<!--|&lt;!(?:&mdash;|&#151;|--))';
+##	my $closecom = '(?:-->|(?:&mdash;|&#151;|--)&gt;)';
+
+	$$textref =~ s/(<img[^>]*?usemap\s*=\s*)((?:[\"][^\"]+[\"])|(?:[\'][^\']+[\'])|(?:[^\s\/>]+))([^>]*>)/
+	    $self->replace_usemap_links($1, $2, $3)/isge;
+
+	$$textref =~ s/(<(?:a|area|frame|link|script)\s+[^>]*?\s*(?:href|src)\s*=\s*)((?:[\"][^\"]+[\"])|(?:[\'][^\']+[\'])|(?:[^\s\/>]+))([^>]*>)/
+	    $self->replace_href_links ($1, $2, $3, $base_dir, $file, $doc_obj, $cursection)/isge; 
+	
+##	$$textref =~ s/($opencom.*?)?+(<(?:a|area|frame|link|script)\s+[^>]*?\s*(?:href|src)\s*=\s*)((?:[\"][^\"]+[\"])|(?:[\'][^\']+[\'])|(?:[^\s\/>]+))([^>]*>)(.*?$closecom)?+/
+#	    $self->replace_href_links ($1, $2, $3, $4, $5, $base_dir, $file, $doc_obj, $cursection)/isge;
+    }
+
+    # trap images
+
+    # Previously, by default, HTMLPlugin would embed <img> tags inside anchor tags
+    # i.e. <a href="image><img src="image"></a> in order to overcome a problem that
+    # turned regular text succeeding images into links. That is, by embedding <imgs>
+    # inside <a href=""></a>, the text following images were no longer misbehaving.
+    # However, there would be many occasions whereby images were not meant to link
+    # to their source images but where the images would link to another web page.
+    # To allow this, the no_image_links option was introduced: it would prevent
+    # the behaviour of embedding images into links that referenced the source images.
+
+    # Somewhere along the line, the problem of normal text turning into links when 
+    # such text followed images which were not embedded in <a href=""></a> ceased 
+    # to occur. This is why the following lines have been commented out (as well as 
+    # two lines in replace_images). They appear to no longer apply.
+
+    # If at any time, there is a need for having images embedded in <a> anchor tags,
+    # then it might be better to turn that into an HTMLPlugin option rather than make
+    # it the default behaviour. Also, eventually, no_image_links needs to become
+    # a deprecated option for HTMLPlugin as it has now become the default behaviour.
+
+    #if(!$self->{'no_image_links'}){
+    $$textref =~ s/(<(?:img|embed|table|tr|td)[^>]*?(?:src|background)\s*=\s*)((?:[\"][^\"]+[\"])|(?:[\'][^\']+[\'])|(?:[^\s\/>]+))([^>]*>)/
+	$self->replace_images ($1, $2, $3, $base_dir, $file, $doc_obj, $cursection)/isge;
+    #}
+
+    # add text to document object
+    # turn \ into \\ so that the rest of greenstone doesn't think there
+    # is an escape code following. (Macro parsing loses them...)
+    $$textref =~ s/\\/\\\\/go;
+    
+    $doc_obj->add_utf8_text($cursection, $$textref);
+}
+
+sub replace_images {
+    my $self = shift (@_);
+    my ($front, $link, $back, $base_dir, 
+	$file, $doc_obj, $section) = @_;
+
+    # remove quotes from link at start and end if necessary
+    if ($link=~/^[\"\']/) {
+	$link=~s/^[\"\']//;
+	$link=~s/[\"\']$//;
+	$front.='"';
+	$back="\"$back";
+    }
+
+    $link =~ s/\n/ /g;
+
+    # Hack to overcome Windows wv 0.7.1 bug that causes embedded images to be broken
+    # If the Word file path has spaces in it, wv messes up and you end up with
+    #   absolute paths for the images, and without the "file://" prefix
+    # So check for this special case and massage the data to be correct
+    if ($ENV{'GSDLOS'} =~ m/^windows/i && $self->{'plugin_type'} eq "WordPlug" && $link =~ m/^[A-Za-z]\:\\/) {
+	$link =~ s/^.*\\([^\\]+)$/$1/;
+    }
+    
+    my ($href, $hash_part, $rl) = $self->format_link ($link, $base_dir, $file);
+
+    my $img_file =  $self->add_file ($href, $rl, $hash_part, $base_dir, $doc_obj, $section);
+
+#    print STDERR "**** link = $link\n**** href = $href\n**** img_file = $img_file, rl = $rl\n";
+
+    my $anchor_name = $img_file;
+    #$anchor_name =~ s/^.*\///;
+    #$anchor_name = "<a name=\"$anchor_name\" ></a>";
+
+    my $image_link = $front . $img_file .$back;
+    return $image_link;
+
+    # The reasons for why the following two lines are no longer necessary can be 
+    # found in subroutine process_section
+    #my $anchor_link = "<a href=\"$img_file\" >".$image_link."</a>";  
+    #return $anchor_link;	
+    
+    #return $front . $img_file . $back . $anchor_name;
+}
+
+sub replace_href_links {
+    my $self = shift (@_);
+    my ($front, $link, $back, $base_dir, $file, $doc_obj, $section) = @_;
+
+    # remove quotes from link at start and end if necessary
+    if ($link=~/^[\"\']/) {
+	$link=~s/^[\"\']//;
+	$link=~s/[\"\']$//;
+	$front.='"';
+	$back="\"$back";
+    }
+
+    # attempt to sort out targets - frames are not handled 
+    # well in this plugin and some cases will screw things
+    # up - e.g. the _parent target (so we'll just remove 
+    # them all ;-)
+    $front =~ s/(target=\"?)_top(\"?)/$1_gsdltop_$2/is;
+    $back =~ s/(target=\"?)_top(\"?)/$1_gsdltop_$2/is;
+    $front =~ s/target=\"?_parent\"?//is;
+    $back =~ s/target=\"?_parent\"?//is;
+
+    return $front . $link . $back if $link =~ m/^\#/s;
+    $link =~ s/\n/ /g;
+
+    # Find file referred to by $link on file system 
+    # This is more complicated than it sounds when char encodings
+    # is taken in to account
+    my ($href, $hash_part, $rl) = $self->format_link ($link, $base_dir, $file);
+
+    # href may use '\'s where '/'s should be on Windows
+    $href =~ s/\\/\//g;
+    my ($filename) = $href =~ m/^(?:.*?):(?:\/\/)?(.*)/;
+    
+
+    ##### leave all these links alone (they won't be picked up by intermediate 
+    ##### pages). I think that's safest when dealing with frames, targets etc.
+    ##### (at least until I think of a better way to do it). Problems occur with
+    ##### mailto links from within small frames, the intermediate page is displayed
+    ##### within that frame and can't be seen. There is still potential for this to
+    ##### happen even with html pages - the solution seems to be to somehow tell
+    ##### the browser from the server side to display the page being sent (i.e. 
+    ##### the intermediate page) in the top level window - I'm not sure if that's 
+    ##### possible - the following line should probably be deleted if that can be done
+    return $front . $link . $back if $href =~ m/^(mailto|news|gopher|nntp|telnet|javascript):/is;
+
+    if (($rl == 0) || ($filename =~ m/$self->{'process_exp'}/) || 
+	($href =~ m/\/$/) || ($href =~ m/^(mailto|news|gopher|nntp|telnet|javascript):/i)) {
+
+	if ($ENV{'GSDLOS'} =~ m/^windows$/) {
+
+	    # Don't do any encoding for now, as not clear what
+	    # the right thing to do is to support filename
+	    # encoding on Windows when they are not UTF16
+	    # 
+	}
+	else {
+	    # => Unix-based system
+
+	    # If web page didn't give encoding, then default to utf8
+	    my $content_encoding= $self->{'content_encoding'} || "utf8";
+
+	    if ((defined $ENV{"DEBUG_UNICODE"}) && ($ENV{"DEBUG_UNICODE"})) {
+		print STDERR "**** Encoding with '$content_encoding', href: $href\n";
+	    }
+
+	    # on Darwin, the unicode filenames are stored on the file
+	    # system in decomposed form, so any href link (including when 
+	    # URL-encoded) should refer to the decomposed name of the file
+	    if ($ENV{'GSDLOS'} =~ /^darwin$/i) {
+		$href = normalize('D', $href); # Normalization Form D (decomposition) 
+	    }
+
+	    $href = encode($content_encoding,$href);
+	}
+
+	$href = &unicode::raw_filename_to_utf8_url_encoded($href);	
+	$href = &unicode::filename_to_url($href);
+
+	&ghtml::urlsafe ($href);
+
+	if ((defined $ENV{"DEBUG_UNICODE"}) && ($ENV{"DEBUG_UNICODE"})) {
+		print STDERR "******DEBUG: href=$href\n";    
+	}
+
+
+	return $front . "_httpextlink_&amp;rl=" . $rl . "&amp;href=" . $href . $hash_part . $back;
+    } else {
+	# link is to some other type of file (e.g., an image) so we'll
+	# need to associate that file
+	return $front . $self->add_file ($href, $rl, $hash_part, $base_dir, $doc_obj, $section) . $back;
+    }
+}
+
+sub add_file {
+    my $self = shift (@_);
+    my ($href, $rl, $hash_part, $base_dir, $doc_obj, $section) = @_;
+    my ($newname);
+
+    my $filename = $href;
+    if ($base_dir eq "") {
+	if ($ENV{'GSDLOS'} =~ m/^windows$/i) {
+	    # remove http://
+	    $filename =~ s/^[^:]*:\/\///;
+	}
+	else {
+	    # remove http:/ thereby leaving one slash at the start as
+	    # part of full pathname
+	    $filename =~ s/^[^:]*:\///;
+	}
+    }
+    else {
+	# remove http://
+	$filename =~ s/^[^:]*:\/\///;
+    }
+
+    $filename = &util::filename_cat($base_dir, $filename);
+
+    if (($self->{'use_realistic_book'}) || ($self->{'old_style_HDL'})) {
+	# we are processing a tidytmp file - want paths to be in import
+	$filename =~ s/([\\\/])tidytmp([\\\/])/$1import$2/;
+    }
+
+    # Replace %XX's in URL with decoded value if required. Note that the
+    # filename may include the %XX in some situations. If the *original*
+    # file's name was in URL encoding, the following method will not decode
+    # it.
+    my $unicode_filename = $filename;
+    my $opt_decode_unicode_filename = $self->opt_url_decode($unicode_filename);
+
+    # wvWare can generate <img src="StrangeNoGraphicData"> tags, but with no
+    # (it seems) accompanying file
+    if ($opt_decode_unicode_filename =~ m/StrangeNoGraphicData$/) { return ""; }
+
+    my $content_encoding= $self->{'content_encoding'} || "utf8";
+
+    if ($ENV{'GSDLOS'} =~ /^(linux|solaris)$/i) {
+	# The filenames that come through the HTML file have been decoded
+	# into Unicode aware Perl strings.  Need to convert them back
+	# to their initial raw-byte encoding to match the file that
+	# exists on the file system
+	$filename = encode($content_encoding, $opt_decode_unicode_filename);
+    }
+    elsif ($ENV{'GSDLOS'} =~ /^darwin$/i) {
+	# HFS+ is UTF8 with decompostion
+	$filename = encode($content_encoding, $opt_decode_unicode_filename);
+	$filename = normalize('D', $filename); # Normalization Form D (decomposition)
+
+    }
+    elsif ($ENV{'GSDLOS'} =~ /^windows$/i) {
+	my $long_filename = Win32::GetLongPathName($opt_decode_unicode_filename);
+
+	if (defined $long_filename) {
+	    my $short_filename = Win32::GetLongPathName($long_filename);
+	    $filename = $short_filename;
+	}
+#	else {
+#	    print STDERR "***** failed to map href to real file:\n";
+#	    print STDERR "****** $href -> $opt_decode_unicode_filename\n";
+#	}
+    }
+    else {
+	my $outhandle = $self->{'outhandle'};
+	print $outhandle "Warning: Unrecognized operating system ", $ENV{'GSDLOS'}, "\n";
+	print $outhandle "         in file system encoding of href: $href\n";
+	print $outhandle "         No character encoding done.\n";
+    }
+
+
+    # some special processing if the intended filename was converted to utf8, but
+    # the actual file still needs to be renamed
+    if (!&util::fd_exists($filename)) {
+	# try the original filename stored in map
+	if ((defined $ENV{"DEBUG_UNICODE"}) && ($ENV{"DEBUG_UNICODE"})) {
+		print STDERR "******!! orig filename did not exist: $filename\n";
+	}
+
+##	print STDERR "**** trying to look up unicode_filename: $unicode_filename\n";
+
+	my $original_filename = $self->{'unicode_to_original_filename'}->{$unicode_filename};
+
+	if ((defined $ENV{"DEBUG_UNICODE"}) && ($ENV{"DEBUG_UNICODE"})) {
+		print STDERR "******   From lookup unicode_filename, now trying for: $original_filename\n";
+	}
+
+	if (defined $original_filename && -e $original_filename) {
+		if ((defined $ENV{"DEBUG_UNICODE"}) && ($ENV{"DEBUG_UNICODE"})) {
+			print STDERR "******   Found match!\n";
+		}
+	    $filename = $original_filename;
+	}
+    }
+    
+    my ($ext) = $filename =~ m/(\.[^\.]*)$/;
+
+    if ($rl == 0) {
+	if ((!defined $ext) || ($ext !~ m/$self->{'assoc_files'}/)) {
+	    return "_httpextlink_&amp;rl=0&amp;el=prompt&amp;href=" . $href . $hash_part;
+	}
+	else {
+	    return "_httpextlink_&amp;rl=0&amp;el=direct&amp;href=" . $href . $hash_part;
+	}
+    }
+
+    if ((!defined $ext) || ($ext !~ m/$self->{'assoc_files'}/)) {
+	return "_httpextlink_&amp;rl=" . $rl . "&amp;href=" . $href . $hash_part;
+    }
+    # add the original image file as a source file
+    if (!$self->{'processing_tmp_files'} ) {
+	$doc_obj->associate_source_file($filename);
+    }
+    if ($self->{'rename_assoc_files'}) {
+	if (defined $self->{'aux_files'}->{$href}) {
+	    $newname = $self->{'aux_files'}->{$href}->{'dir_num'} . "/" .
+		$self->{'aux_files'}->{$href}->{'file_num'} . $ext;
+	} else {
+	    $newname = $self->{'dir_num'} . "/" . $self->{'file_num'} . $ext;
+	    $self->{'aux_files'}->{$href} = {'dir_num' => $self->{'dir_num'}, 'file_num' => $self->{'file_num'}};
+	    $self->inc_filecount ();
+	}
+	$doc_obj->associate_file($filename, $newname, undef, $section);
+	return "_httpdocimg_/$newname";
+    } else {
+	if(&unicode::is_url_encoded($unicode_filename)) {
+	    # use the possibly-decoded filename instead to avoid double URL encoding
+	    ($newname) = $filename =~ m/([^\/\\]*)$/;
+	} else {
+	    ($newname) = $unicode_filename =~ m/([^\/\\]*)$/;
+	}
+
+	# Make sure this name uses only ASCII characters. 
+	# We use either base64 or URL encoding, as these preserve original encoding
+	$newname = &util::rename_file($newname, $self->{'file_rename_method'});
+
+###	print STDERR "***** associating $filename (raw-byte/utf8)-> $newname\n";
+	$doc_obj->associate_file($filename, $newname, undef, $section);
+
+	# Since the generated image will be URL-encoded to avoid file-system/browser mess-ups
+	# of filenames, URL-encode the additional percent signs of the URL-encoded filename
+	my $newname_url = $newname;
+	$newname_url = &unicode::filename_to_url($newname_url);
+	return "_httpdocimg_/$newname_url";	
+    }
+}
+
+
+sub format_link {
+    my $self = shift (@_);
+    my ($link, $base_dir, $file) = @_;
+
+    # strip off hash part, e.g. #foo, but watch out for any entities, e.g. &#x3B1;
+    my ($before_hash, $hash_part) = $link =~ m/^(.*?[^&])(\#.*)?$/;
+	
+    $hash_part = "" if !defined $hash_part;
+    if (!defined $before_hash || $before_hash !~ m/[\w\.\/]/) {
+		my $outhandle = $self->{'outhandle'};
+		print $outhandle "HTMLPlugin: ERROR - badly formatted tag ignored ($link)\n"
+			if $self->{'verbosity'};
+		return ($link, "", 0);
+    }
+	
+    if ($before_hash =~ s@^((?:http|https|ftp|file|mms)://)@@i) {
+		my $type = $1;
+
+	if ($link =~ m/^(http|ftp):/i) {
+	    # Turn url (using /) into file name (possibly using \ on windows)
+	    my @http_dir_split = split('/', $before_hash);
+	    $before_hash = &util::filename_cat(@http_dir_split);
+	}
+
+	$before_hash = $self->eval_dir_dots($before_hash);
+	
+	my $linkfilename = &util::filename_cat ($base_dir, $before_hash);
+	
+	my $rl = 0;
+	$rl = 1 if (-e $linkfilename);
+
+	# make sure there's a slash on the end if it's a directory
+	if ($before_hash !~ m/\/$/) {
+	    $before_hash .= "/" if (-d $linkfilename);
+	}
+	return ($type . $before_hash, $hash_part, $rl);
+	
+    } elsif ($link !~ m/^(mailto|news|gopher|nntp|telnet|javascript):/i && $link !~ m/^\//) {
+
+	if ($before_hash =~ s@^/@@ || $before_hash =~ m/\\/) {
+
+	    # the first directory will be the domain name if file_is_url
+	    # to generate archives, otherwise we'll assume all files are
+	    # from the same site and base_dir is the root
+
+	    if ($self->{'file_is_url'}) {
+		my @dirs = split /[\/\\]/, $file;
+		my $domname = shift (@dirs);
+		$before_hash = &util::filename_cat($domname, $before_hash);
+		$before_hash =~ s@\\@/@g; # for windows
+	    }
+	    else
+	    {
+		# see if link shares directory with source document
+		# => turn into relative link if this is so!
+		
+		if ($ENV{'GSDLOS'} =~ m/^windows/i) {
+		    # too difficult doing a pattern match with embedded '\'s...
+		    my $win_before_hash=$before_hash;
+		    $win_before_hash =~ s@(\\)+@/@g;
+		    # $base_dir is already similarly "converted" on windows.
+		    if ($win_before_hash =~ s@^$base_dir/@@o) {
+			# if this is true, we removed a prefix
+			$before_hash=$win_before_hash;
+		    }
+		}
+		else {
+		    # before_hash has lost leading slash by this point,
+		    # -> add back in prior to substitution with $base_dir
+		    $before_hash = "/$before_hash"; 
+
+		    $before_hash = &util::filename_cat("",$before_hash);
+		    $before_hash =~ s@^$base_dir/@@;
+		}
+	    }
+	} else {
+	    # Turn relative file path into full path
+	    my $dirname = &File::Basename::dirname($file);
+	    $before_hash = &util::filename_cat($dirname, $before_hash);
+	    $before_hash = $self->eval_dir_dots($before_hash);	    	    
+	}
+
+	my $linkfilename = &util::filename_cat ($base_dir, $before_hash); 
+
+
+#	print STDERR "**** linkfilename = $linkfilename\n";
+#	if (!&util::fd_exists($linkfilename)) {
+#	    print STDERR "***** Warning: Could not find $linkfilename\n";
+#	}
+
+
+	# make sure there's a slash on the end if it's a directory
+	if ($before_hash !~ m/\/$/) {
+	    $before_hash .= "/" if (-d $linkfilename);
+	}
+
+#	print STDERR "*** returning: $before_hash\n";
+
+	return ("http://" . $before_hash, $hash_part, 1);
+    } else {
+	# mailto, news, nntp, telnet, javascript or gopher link
+	return ($before_hash, "", 0);
+    }
+}
+
+sub extract_first_NNNN_characters {
+    my $self = shift (@_);
+    my ($textref, $doc_obj, $thissection) = @_;
+    
+    foreach my $size (split /,/, $self->{'first'}) {
+	my $tmptext =  $$textref;
+	# skip to the body
+	$tmptext =~ s/.*<body[^>]*>//i;
+	# remove javascript
+	$tmptext =~ s@<script.*?</script>@ @sig;
+	$tmptext =~ s/<[^>]*>/ /g;
+	$tmptext =~ s/&nbsp;/ /g;
+	$tmptext =~ s/^\s+//;
+	$tmptext =~ s/\s+$//;
+	$tmptext =~ s/\s+/ /gs;
+	$tmptext = &unicode::substr ($tmptext, 0, $size);
+	$tmptext =~ s/\s\S*$/&#8230;/; # adds an ellipse (...)
+	$doc_obj->add_utf8_metadata ($thissection, "First$size", $tmptext);
+    }
+}
+
+
+sub extract_metadata {
+    my $self = shift (@_);
+    my ($textref, $metadata, $doc_obj, $section) = @_;
+    my $outhandle = $self->{'outhandle'};
+    # if we don't want metadata, we may as well not be here ...
+    return if (!defined $self->{'metadata_fields'});
+    
+    my $separator = $self->{'metadata_field_separator'};
+    if ($separator eq "") {
+	undef $separator;
+    }
+
+    # metadata fields to extract/save. 'key' is the (lowercase) name of the
+    # html meta, 'value' is the metadata name for greenstone to use
+    my %find_fields = ();
+
+    my %creator_fields = (); # short-cut for lookups
+
+
+    foreach my $field (split /,/, $self->{'metadata_fields'}) {
+        $field =~ s/^\s+//; # remove leading whitespace
+        $field =~ s/\s+$//; # remove trailing whitespace
+	
+	# support tag<tagname>
+	if ($field =~ m/^(.*?)\s*<(.*?)>$/) {
+	    # "$2" is the user's preferred gs metadata name
+	    $find_fields{lc($1)}=$2; # lc = lowercase
+	} else { # no <tagname> for mapping
+	    # "$field" is the user's preferred gs metadata name
+	    $find_fields{lc($field)}=$field; # lc = lowercase
+	}
+    }
+
+    if (defined $self->{'hunt_creator_metadata'} &&
+	$self->{'hunt_creator_metadata'} == 1 ) {
+	my @extra_fields =
+	    (
+	     'author',
+	     'author.email',
+	     'creator',
+	     'dc.creator',
+	     'dc.creator.corporatename',
+	     );
+
+	# add the creator_metadata fields to search for
+	foreach my $field (@extra_fields) {
+	    $creator_fields{$field}=0; # add to lookup hash
+	}
+    }
+
+
+    # find the header in the html file, which has the meta tags
+    $$textref =~ m@<head>(.*?)</head>@si;
+
+    my $html_header=$1;
+
+    # go through every <meta... tag defined in the html and see if it is
+    # one of the tags we want to match.
+    
+    # special case for title - we want to remember if its been found
+    my $found_title = 0;
+    # this assumes that ">" won't appear. (I don't think it's allowed to...)
+    $html_header =~ m/^/; # match the start of the string, for \G assertion
+    
+    while ($html_header =~ m/\G.*?<meta(.*?)>/sig) {
+	my $metatag=$1;
+	my ($tag, $value);
+
+	# find the tag name
+	$metatag =~ m/(?:name|http-equiv)\s*=\s*([\"\'])?(.*?)\1/is;
+	$tag=$2;
+	# in case they're not using " or ', but they should...
+	if (! $tag) {
+	    $metatag =~ m/(?:name|http-equiv)\s*=\s*([^\s\>]+)/is;
+	    $tag=$1;
+	}
+
+	if (!defined $tag) {
+	    print $outhandle "HTMLPlugin: can't find NAME in \"$metatag\"\n";
+	    next;
+	}
+	
+	# don't need to assign this field if it was passed in from a previous 
+	# (recursive) plugin
+	if (defined $metadata->{$tag}) {next}
+
+	# find the tag content
+	$metatag =~ m/content\s*=\s*([\"\'])?(.*?)\1/is;
+	$value=$2;
+
+	# The following code assigns the metaname to value if value is
+	# empty. Why would we do this?
+	#if (! $value) {
+	#    $metatag =~ m/(?:name|http-equiv)\s*=\s*([^\s\>]+)/is;
+	#    $value=$1;
+	#}
+	if (!defined $value || $value eq "") {
+	    print $outhandle "HTMLPlugin: can't find VALUE in <meta $metatag >\n" if ($self->{'verbosity'} > 2);
+	    next;
+	}
+	
+	# clean up and add
+	$value =~ s/\s+/ /gs;
+	chomp($value); # remove trailing \n, if any
+	if (exists $creator_fields{lc($tag)}) {
+	    # map this value onto greenstone's "Creator" metadata
+	    $tag='Creator';
+	} elsif (!exists $find_fields{lc($tag)}) {
+	    next; # don't want this tag
+	} else {
+	    # get the user's preferred capitalisation
+	    $tag = $find_fields{lc($tag)};
+	}
+	if (lc($tag) eq "title") {
+	    $found_title = 1;
+	}
+
+	if ($self->{'verbosity'} > 2) {
+	    print $outhandle " extracted \"$tag\" metadata \"$value\"\n";
+	}
+
+	if ($tag =~ /\./) {
+	    # there is a . so has a namespace, add ex.
+	    $tag = "ex.$tag";
+	}
+	if (defined $separator) {
+	    my @values = split($separator, $value);
+	    foreach my $v (@values) {
+		$doc_obj->add_utf8_metadata($section, $tag, $v) if $v =~ /\S/;
+	    }
+	}
+	else {
+	    $doc_obj->add_utf8_metadata($section, $tag, $value);
+	}
+    }
+    
+    # TITLE: extract the document title
+    if (exists $find_fields{'title'} && !$found_title) {
+	# we want a title, and didn't find one in the meta tags
+	# see if there's a <title> tag
+	my $title;
+	my $from = ""; # for debugging output only
+	if ($html_header =~ m/<title[^>]*>([^<]+)<\/title[^>]*>/is) {
+	    $title = $1;
+	    $from = "<title> tags";
+	}
+
+	if (!defined $title) {
+	    $from = "first 100 chars";
+	    # if no title use first 100 or so characters
+	    $title = $$textref;
+	    $title =~ s/^\xFE\xFF//; # Remove unicode byte order mark	    
+	    $title =~ s/^.*?<body>//si;
+	    # ignore javascript!
+	    $title =~ s@<script.*?</script>@ @sig;
+	    $title =~ s/<\/([^>]+)><\1>//g; # (eg) </b><b> - no space
+	    $title =~ s/<[^>]*>/ /g; # remove all HTML tags
+	    $title = substr ($title, 0, 100);
+	    $title =~ s/\s\S*$/.../;
+	}
+	$title =~ s/<[^>]*>/ /g; # remove html tags
+	$title =~ s/&nbsp;/ /g;
+	$title =~ s/(?:&nbsp;|\xc2\xa0)/ /g; # utf-8 for nbsp...
+	$title =~ s/\s+/ /gs; # collapse multiple spaces
+	$title =~ s/^\s*//;   # remove leading spaces
+	$title =~ s/\s*$//;   # remove trailing spaces
+
+	$title =~ s/^$self->{'title_sub'}// if ($self->{'title_sub'});
+	$title =~ s/^\s+//s; # in case title_sub introduced any...
+	$doc_obj->add_utf8_metadata ($section, "Title", $title);
+	print $outhandle " extracted Title metadata \"$title\" from $from\n" 
+	    if ($self->{'verbosity'} > 2);
+    } 
+    
+    # add FileFormat metadata
+    $doc_obj->add_metadata($section,"FileFormat", "HTML");
+
+    # Special, for metadata names such as tagH1 - extracts
+    # the text between the first <H1> and </H1> tags into "H1" metadata.
+
+    foreach my $field (keys %find_fields) {
+	if ($field !~ m/^tag([a-z0-9]+)$/i) {next}
+	my $tag = $1;
+	if ($$textref =~ m@<$tag[^>]*>(.*?)</$tag[^>]*>@g) {
+	    my $content = $1;
+	    $content =~ s/&nbsp;/ /g;
+	    $content =~ s/<[^>]*>/ /g;
+	    $content =~ s/^\s+//;
+	    $content =~ s/\s+$//;
+	    $content =~ s/\s+/ /gs;
+	    if ($content) {
+		$tag=$find_fields{"tag$tag"}; # get the user's capitalisation
+		$tag =~ s/^tag//i;
+		$doc_obj->add_utf8_metadata ($section, $tag, $content);
+		print $outhandle " extracted \"$tag\" metadata \"$content\"\n" 
+		    if ($self->{'verbosity'} > 2);
+	    }
+	}
+    }    
+}
+
+
+# evaluate any "../" to next directory up
+# evaluate any "./" as here
+sub eval_dir_dots {
+    my $self = shift (@_);
+    my ($filename) = @_;
+    my $dirsep_os = &util::get_os_dirsep();
+    my @dirsep = split(/$dirsep_os/,$filename);
+
+    my @eval_dirs = ();
+    foreach my $d (@dirsep) {
+	if ($d eq "..") {
+	    pop(@eval_dirs);
+	    
+	} elsif ($d eq ".") {
+	    # do nothing!
+
+	} else {
+	    push(@eval_dirs,$d);
+	}
+    }
+
+    # Need to fiddle with number of elements in @eval_dirs if the
+    # first one is the empty string.  This is because of a
+    # modification to util::filename_cat that supresses the addition
+    # of a leading '/' character (or \ if windows) (intended to help
+    # filename cat with relative paths) if the first entry in the
+    # array is the empty string.  Making the array start with *two*
+    # empty strings is a way to defeat this "smart" option.
+    #
+    if (scalar(@eval_dirs) > 0) {
+	if ($eval_dirs[0] eq ""){
+	    unshift(@eval_dirs,"");
+	}
+    }
+    
+    my $evaluated_filename = (scalar @eval_dirs > 0) ? &util::filename_cat(@eval_dirs) : "";
+    return $evaluated_filename;
+}
+
+sub replace_usemap_links {
+    my $self = shift (@_);
+    my ($front, $link, $back) = @_;
+
+    # remove quotes from link at start and end if necessary
+    if ($link=~/^[\"\']/) {
+	$link=~s/^[\"\']//;
+	$link=~s/[\"\']$//;
+	$front.='"';
+	$back="\"$back";
+    }
+
+    $link =~ s/^\.\///;
+    return $front . $link . $back;
+}
+
+sub inc_filecount {
+    my $self = shift (@_);
+
+    if ($self->{'file_num'} == 1000) {
+	$self->{'dir_num'} ++;
+	$self->{'file_num'} = 0;
+    } else {
+	$self->{'file_num'} ++;
+    }
+}
+
+
+# Extend read_file so that strings like &eacute; are
+# converted to UTF8 internally.  
+#
+# We don't convert &lt; or &gt; or &amp; or &quot; in case
+# they interfere with the GML files
+
+sub read_file {
+    my $self = shift(@_);
+    my ($filename, $encoding, $language, $textref) = @_;
+
+    $self->SUPER::read_file($filename, $encoding, $language, $textref);
+
+    # Convert entities to their Unicode code-point equivalents
+    $$textref =~ s/&(lt|gt|amp|quot|nbsp);/&z$1;/go;
+    $$textref =~ s/&([^;]+);/&ghtml::getcharequiv($1,1,1)/gseo;
+    $$textref =~ s/&z(lt|gt|amp|quot|nbsp);/&$1;/go;
+
+}
+
+sub HB_read_html_file {
+    my $self = shift (@_);
+    my ($htmlfile, $text) = @_;
+    
+    # load in the file
+    if (!open (FILE, $htmlfile)) {
+	print STDERR "ERROR - could not open $htmlfile\n";
+	return;
+    }
+
+    my $foundbody = 0;
+    $self->HB_gettext (\$foundbody, $text, "FILE");
+    close FILE;
+    
+    # just in case there was no <body> tag
+    if (!$foundbody) {
+	$foundbody = 1;
+	open (FILE, $htmlfile) || return;
+	$self->HB_gettext (\$foundbody, $text, "FILE");	
+	close FILE;
+    }
+    # text is in utf8
+}		
+
+# converts the text to utf8, as ghtml does that for &eacute; etc.
+sub HB_gettext {
+    my $self = shift (@_);
+    my ($foundbody, $text, $handle) = @_;
+    
+    my $line = "";
+    while (defined ($line = <$handle>)) {
+	# look for body tag
+	if (!$$foundbody) {
+	    if ($line =~ s/^.*<body[^>]*>//i) {
+		$$foundbody = 1;
+	    } else {
+		next;
+	    }
+	}
+	
+	# check for symbol fonts
+	if ($line =~ m/<font [^>]*?face\s*=\s*\"?(\w+)\"?/i) {
+	    my $font = $1;
+	    print STDERR "HBPlug::HB_gettext - warning removed font $font\n" 
+		if ($font !~ m/^arial$/i);
+	}
+
+	$$text .= $line;
+    }
+
+    if ($self->{'input_encoding'} eq "iso_8859_1") {
+	# convert to utf-8
+	$$text=&unicode::unicode2utf8(&unicode::convert2unicode("iso_8859_1", $text));
+    }
+    # convert any alphanumeric character entities to their utf-8
+    # equivalent for indexing purposes
+    #&ghtml::convertcharentities ($$text);
+
+    $$text =~ s/\s+/ /g; # remove \n's
+
+    # At this point $$text is a binary byte string
+    # => turn it into a Unicode aware string, so full
+    # Unicode aware pattern matching can be used.
+    # For instance: 's/\x{0101}//g' or '[[:upper:]]'
+    # 
+
+    $$text = decode("utf8",$$text);
+}
+
+sub HB_clean_section {
+    my $self = shift (@_);
+    my ($section) = @_;
+
+    # remove tags without a starting tag from the section
+    my ($tag, $tagstart);
+    while ($section =~ m/<\/([^>]{1,10})>/) {
+	$tag = $1;
+	$tagstart = index($section, "<$tag");
+	last if (($tagstart >= 0) && ($tagstart < index($section, "<\/$tag")));
+	$section =~ s/<\/$tag>//;
+    }
+    
+    # remove extra paragraph tags
+    while ($section =~ s/<p\b[^>]*>\s*<p\b/<p/ig) {}
+    
+    # remove extra stuff at the end of the section
+    while ($section =~ s/(<u>|<i>|<b>|<p\b[^>]*>|&nbsp;|\s)$//i) {}
+    
+    # add a newline at the beginning of each paragraph
+    $section =~ s/(.)\s*<p\b/$1\n\n<p/gi;
+    
+    # add a newline every 80 characters at a word boundary
+    # Note: this regular expression puts a line feed before
+    # the last word in each section, even when it is not
+    # needed.
+    $section =~ s/(.{1,80})\s/$1\n/g;
+    
+    # fix up the image links
+    $section =~ s/<img[^>]*?src=\"?([^\">]+)\"?[^>]*>/
+	<center><img src=\"$1\" \/><\/center><br\/>/ig;
+    $section =~ s/&lt;&lt;I&gt;&gt;\s*([^\.]+\.(png|jpg|gif))/
+	<center><img src=\"$1\" \/><\/center><br\/>/ig;
+
+    return $section;
+}
+
+# Will convert the oldHDL format to the new HDL format (using the Section tag)	
+sub convert_to_newHDLformat
+{
+    my $self = shift (@_);
+    my ($file,$cnfile) = @_;
+    my $input_filename = $file;
+    my $tmp_filename = $cnfile;
+    
+    # write HTML tmp file with new HDL format
+    open (PROD, ">$tmp_filename") || die("Error Writing to File: $tmp_filename $!");
+    
+    # read in the file and do basic html cleaning (removing header etc)
+    my $html = "";
+    $self->HB_read_html_file ($input_filename, \$html);
+    
+    # process the file one section at a time
+    my $curtoclevel = 1;
+    my $firstsection = 1;
+    my $toclevel = 0;
+    while (length ($html) > 0) {
+	if ($html =~ s/^.*?(?:<p\b[^>]*>)?((<b>|<i>|<u>|\s)*)&lt;&lt;TOC(\d+)&gt;&gt;\s*(.*?)<p\b/<p/i) {
+	    $toclevel = $3;
+	    my $title = $4;
+	    my $sectiontext = "";
+	    if ($html =~ s/^(.*?)((?:<p\b[^>]*>)?((<b>|<i>|<u>|\s)*)&lt;&lt;TOC\d+&gt;&gt;)/$2/i) {
+		$sectiontext = $1;
+	    } else {
+		$sectiontext = $html;
+		$html = "";
+	    }
+
+	    # remove tags and extra spaces from the title
+	    $title =~ s/<\/?[^>]+>//g;
+	    $title =~ s/^\s+|\s+$//g;
+
+	    # close any sections below the current level and
+	    # create a new section (special case for the firstsection)
+	    print PROD "<!--\n";
+	    while (($curtoclevel > $toclevel) ||
+		   (!$firstsection && $curtoclevel == $toclevel)) {
+		$curtoclevel--;
+		print PROD "</Section>\n";
+	    }
+	    if ($curtoclevel+1 < $toclevel) {
+		print STDERR "WARNING - jump in toc levels in $input_filename " . 
+		    "from $curtoclevel to $toclevel\n";
+	    }
+	    while ($curtoclevel < $toclevel) {
+		$curtoclevel++;
+	    }
+
+	    if ($curtoclevel == 1) {
+	    	# add the header tag
+		print PROD "-->\n";
+    		print PROD "<HTML>\n<HEAD>\n<TITLE>$title</TITLE>\n</HEAD>\n<BODY>\n";
+		print PROD "<!--\n";
+	    }
+	    
+	    print PROD "<Section>\n\t<Description>\n\t\t<Metadata name=\"Title\">$title</Metadata>\n\t</Description>\n";
+	    
+	    print PROD "-->\n";
+	    
+	    # clean up the section html
+	    $sectiontext = $self->HB_clean_section($sectiontext);
+
+	    print PROD "$sectiontext\n";	 
+
+	} else {
+	    print STDERR "WARNING - leftover text\n" , $self->shorten($html), 
+	    "\nin $input_filename\n";
+	    last;
+	}
+	$firstsection = 0;
+    }
+    
+    print PROD "<!--\n";
+    while ($curtoclevel > 0) {
+	$curtoclevel--;
+	print PROD "</Section>\n";
+    }
+    print PROD "-->\n";
+    
+    close (PROD) || die("Error Closing File: $tmp_filename $!");
+    
+    return $tmp_filename;
+}		
+
+sub shorten {
+    my $self = shift (@_);
+    my ($text) = @_;
+
+    return "\"$text\"" if (length($text) < 100);
+
+    return "\"" . substr ($text, 0, 50) . "\" ... \"" . 
+	substr ($text, length($text)-50) . "\"";
+}
+
+sub convert_tidy_or_oldHDL_file
+{
+    my $self = shift (@_);
+    my ($file) = @_;
+    my $input_filename = $file;
+    
+    if (-d $input_filename)
+    {
+    	return $input_filename;
+    }
+    
+    # get the input filename
+    my ($tailname, $dirname, $suffix) = &File::Basename::fileparse($input_filename, "\\.[^\\.]+\$");
+    my $base_dirname = $dirname;
+    $suffix = lc($suffix);   
+    
+    # derive tmp filename from input filename
+    # Remove any white space from filename -- no risk of name collision, and
+    # makes later conversion by utils simpler. Leave spaces in path...
+    # tidy up the filename with space, dot, hyphen between
+    $tailname =~ s/\s+//g; 
+    $tailname =~ s/\.+//g;
+    $tailname =~ s/\-+//g;
+    # convert to utf-8 otherwise we have problems with the doc.xml file
+    # later on
+    &unicode::ensure_utf8(\$tailname);
+    
+    # softlink to collection tmp dir
+    my $tmp_dirname = &util::filename_cat($ENV{'GSDLCOLLECTDIR'}, "tidytmp");
+    &util::mk_dir($tmp_dirname) if (!-e $tmp_dirname);
+    
+    my $test_dirname = "";
+    my $f_separator = &util::get_os_dirsep();
+    
+    if ($dirname =~ m/import$f_separator/)
+    {
+    	$test_dirname = $'; #'
+	
+	#print STDERR "init $'\n";
+	
+	while ($test_dirname =~ m/[$f_separator]/)
+	{
+	    my $folderdirname = $`;
+	    $tmp_dirname = &util::filename_cat($tmp_dirname,$folderdirname);
+	    &util::mk_dir($tmp_dirname) if (!-e $tmp_dirname);
+	    $test_dirname = $'; #'
+	}
+    }
+    
+    my $tmp_filename = &util::filename_cat($tmp_dirname, "$tailname$suffix");
+    
+    # tidy or convert the input file if it is a HTML-like file or it is accepted by the process_exp
+    if (($suffix eq ".htm") || ($suffix eq ".html") || ($suffix eq ".shtml"))
+    {   
+    	#convert the input file to a new style HDL
+    	my $hdl_output_filename = $input_filename;
+    	if ($self->{'old_style_HDL'})
+    	{
+	    $hdl_output_filename = &util::filename_cat($tmp_dirname, "$tailname$suffix");
+	    $hdl_output_filename = $self->convert_to_newHDLformat($input_filename,$hdl_output_filename);
+    	}
+	
+	#just for checking copy all other file from the base dir to tmp dir if it is not exists
+	opendir(DIR,$base_dirname) or die "Can't open base directory : $base_dirname!";
+	my @files = grep {!/^\.+$/} readdir(DIR);
+	close(DIR);
+
+	foreach my $file (@files) 
+	{
+	    my $src_file = &util::filename_cat($base_dirname,$file);
+	    my $dest_file = &util::filename_cat($tmp_dirname,$file);
+	    if ((!-e $dest_file) && (!-d $src_file))
+	    {
+		# just copy the original file back to the tmp directory
+		copy($src_file,$dest_file) or die "Can't copy file $src_file to $dest_file $!";
+	    }
+	}
+	
+	# tidy the input file
+	my $tidy_output_filename = $hdl_output_filename;
+	if ($self->{'use_realistic_book'})
+	{
+	    $tidy_output_filename = &util::filename_cat($tmp_dirname, "$tailname$suffix");
+	    $tidy_output_filename = $self->tmp_tidy_file($hdl_output_filename,$tidy_output_filename);
+	}
+	$tmp_filename = $tidy_output_filename;
+    }
+    else
+    {
+    	if (!-e $tmp_filename)
+	{
+	    # just copy the original file back to the tmp directory
+	    copy($input_filename,$tmp_filename) or die "Can't copy file $input_filename to $tmp_filename $!";
+	}
+    }
+    
+    return $tmp_filename;
+}
+
+
+# Will make the html input file as a proper XML file with removed font tag and
+# image size added to the img tag.
+# The tidying process takes place in a collection specific 'tmp' directory so 
+# that we don't accidentally damage the input.
+sub tmp_tidy_file 
+{
+    my $self = shift (@_);
+    my ($file,$cnfile) = @_;
+    my $input_filename = $file;
+    my $tmp_filename = $cnfile;
+    
+    # get the input filename
+    my ($tailname, $dirname, $suffix) = &File::Basename::fileparse($input_filename, "\\.[^\\.]+\$");
+
+    require HTML::TokeParser::Simple;
+    
+    # create HTML parser to decode the input file
+    my $parser = HTML::TokeParser::Simple->new($input_filename);
+
+    # write HTML tmp file without the font tag and image size are added to the img tag
+    open (PROD, ">$tmp_filename") || die("Error Writing to File: $tmp_filename $!");
+    while (my $token = $parser->get_token())
+    {
+	# is it an img tag
+	if ($token->is_start_tag('img'))
+	{
+	    # get the attributes
+	    my $attr = $token->return_attr;
+
+	    # get the full path to the image
+	    my $img_file = &util::filename_cat($dirname,$attr->{src});
+	    
+	    # set the width and height attribute
+	    ($attr->{width}, $attr->{height}) = imgsize($img_file);
+
+	    # recreate the tag
+	    print PROD "<img";
+	    print PROD map { qq { $_="$attr->{$_}"} } keys %$attr;
+	    print PROD ">";
+	}
+	# is it a font tag
+	else 
+	{
+	    if (($token->is_start_tag('font')) || ($token->is_end_tag('font')))
+	    {
+		# remove font tag
+		print PROD "";
+	    }
+	    else
+	    {
+		# print without changes
+		print PROD $token->as_is;
+	    }
+	}
+    }
+    close (PROD) || die("Error Closing File: $tmp_filename $!");
+
+    # run html-tidy on the tmp file to make it a proper XML file
+
+    my $outhandle = $self->{'outhandle'};
+    print $outhandle "Converting HTML to be XML compliant:\n";
+
+    my $tidy_cmd = "tidy";
+    $tidy_cmd .= " -q" if ($self->{'verbosity'} <= 2);
+    $tidy_cmd .= " -raw -wrap 0 -asxml \"$tmp_filename\"";
+    if ($self->{'verbosity'} <= 2) {
+	if ($ENV{'GSDLOS'} =~ m/^windows/i) {
+	    $tidy_cmd .= " 2>nul";
+	}
+	else {
+	    $tidy_cmd .= " 2>/dev/null";
+	}
+	print $outhandle "  => $tidy_cmd\n";
+    }
+
+    my $tidyfile = `$tidy_cmd`;
+
+    # write result back to the tmp file
+    open (PROD, ">$tmp_filename") || die("Error Writing to File: $tmp_filename $!");
+    print PROD $tidyfile;
+    close (PROD) || die("Error Closing File: $tmp_filename $!");
+    
+    # return the output filename
+    return $tmp_filename;
+} 
+
+sub associate_cover_image
+{
+    my $self = shift(@_);
+    my ($doc_obj, $filename) = @_;
+    if (($self->{'use_realistic_book'}) || ($self->{'old_style_HDL'}))
+    {
+	# we will have cover image in tidytmp, but want it from import
+	$filename =~ s/([\\\/])tidytmp([\\\/])/$1import$2/;
+    }
+    $self->SUPER::associate_cover_image($doc_obj, $filename);
+}
+
+    
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/ISISPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/ISISPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/ISISPlugin.pm	(revision 24799)
@@ -0,0 +1,447 @@
+###########################################################################
+#
+# ISISPlugin.pm -- A plugin for CDS/ISIS databases
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright 1999-2004 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package ISISPlugin;
+
+
+use multiread;
+use SplitTextFile;
+use MetadataRead;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+# ISISPlugin is a sub-class of SplitTextFile.
+# methods with identical signatures take precedence in the order given in the ISA list.
+sub BEGIN {
+    @ISISPlugin::ISA = ('MetadataRead', 'SplitTextFile');
+}
+
+
+my $arguments = 
+    [ { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'reqd' => "no",
+	'deft' => &get_default_process_exp() },
+      { 'name' => "block_exp",
+	'desc' => "{BasePlugin.block_exp}",
+	'type' => "regexp",
+	'reqd' => "no",
+	'deft' => &get_default_block_exp(),
+	'hiddengli' => "yes" },
+      { 'name' => "split_exp",
+	'desc' => "{SplitTextFile.split_exp}",
+	'type' => "regexp",
+	'reqd' => "no",
+	'deft' => &get_default_split_exp(),
+        'hiddengli' => "yes" },
+
+      # The interesting options
+      { 'name' => "entry_separator",
+	'desc' => "{ISISPlugin.entry_separator}",
+	'type' => "string",
+	'reqd' => "no",
+	'deft' => "<br>" },
+      { 'name' => "subfield_separator",
+	'desc' => "{ISISPlugin.subfield_separator}",
+	'type' => "string",
+	'reqd' => "no",
+	'deft' => ", " }
+      ];
+
+my $options = { 'name'     => "ISISPlugin",
+		'desc'     => "{ISISPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'explodes' => "yes",
+		'args'     => $arguments };
+
+
+# This plugin processes files with the suffix ".mst"
+sub get_default_process_exp {
+    return q^(?i)(\.mst)$^;
+}
+
+
+# This plugin blocks files with the suffix ".fdt" and ".xrf"
+sub get_default_block_exp {
+    return q^(?i)(\.fdt|\.xrf)$^;
+    #return "";
+}
+
+    
+# This plugin splits the input text at the "----------" lines
+sub get_default_split_exp {
+    return q^\r?\n----------\r?\n^;
+}
+
+
+sub new
+{
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new SplitTextFile($pluginlist, $inputargs, $hashArgOptLists);
+
+    if ($self->{'info_only'}) {
+	# don't worry about any options etc
+	return bless $self, $class;
+    }
+
+    # isis plug doesn't care about encoding - it assumes ascii unless the user
+    # has specified an encoding
+    if ($self->{'input_encoding'} eq "auto") {
+	$self->{'input_encoding'} = "ascii";
+    }
+    return bless $self, $class;
+}
+
+# we block the corresponding fdt and xrf
+# a pain on windows. blocks xxx.FDT, but if actual file is xx.fdt then 
+# complains that no plugin can process it. Have put it back to using 
+# block exp for now
+# This works now, as are doing case insenstive blocking on windows. However,
+# a pain for GLI as will not know what plugin processes the fdt and xrf.
+# if add to process expression, then get more problems.
+sub store_block_files_tmp {
+    
+    my $self =shift (@_);
+    my ($filename_full_path, $block_hash) = @_;
+    print STDERR "in store block files\n";
+    $self->check_auxiliary_files($filename_full_path);
+    if (-e $self->{'fdt_file_path'}) {
+	print STDERR "$self->{'fdt_file_path'}\n";
+	my $fdt_file = $self->{'fdt_file_path'};
+	&util::block_filename($block_hash,$fdt_file);
+    }
+    if (-e $self->{'xrf_file_path'}) {
+	print STDERR "$self->{'xrf_file_path'}\n";
+	my $xrf_file = $self->{'xrf_file_path'};
+	&util::block_filename($block_hash,$xrf_file);
+    }
+    
+
+}
+
+sub check_auxiliary_files {
+    my $self = shift (@_);
+    my ($filename) = @_;
+
+    my ($database_file_path_root) = ($filename =~ /(.*)\.mst$/i);
+    # Check the associated .fdt and .xrf files exist
+    $self->{'fdt_file_path'} = $database_file_path_root . ".FDT";
+    if (!-e $self->{'fdt_file_path'}) {
+	$self->{'fdt_file_path'} = $database_file_path_root . ".fdt";
+    }
+    $self->{'xrf_file_path'} = $database_file_path_root . ".XRF";
+    if (!-e $self->{'xrf_file_path'}) {
+	$self->{'xrf_file_path'} = $database_file_path_root . ".xrf";
+    }
+}
+    
+
+sub read_file
+{
+    my $self = shift (@_);
+    my ($filename, $encoding, $language, $textref) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    my ($database_file_path_root) = ($filename =~ /(.*)\.mst$/i);
+    my $mst_file_path_relative = $filename;
+    $mst_file_path_relative =~ s/^.+import.(.*?)$/$1/;
+
+    # Check the associated .fdt and .xrf files exist
+    $self->check_auxiliary_files($filename);
+    
+    if (!-e $self->{'fdt_file_path'}) {
+	print STDERR "<ProcessingError n='$mst_file_path_relative' r='Could not find ISIS FDT file $self->{'fdt_file_path'}'>\n" if ($self->{'gli'});
+	print $outhandle "Error: Could not find ISIS FDT file " . $self->{'fdt_file_path'} . ".\n";
+	return;
+    }
+    if (!-e $self->{'xrf_file_path'}) {
+	print STDERR "<ProcessingError n='$mst_file_path_relative' r='Could not find ISIS XRF file $self->{'xrf_file_path'}'>\n" if ($self->{'gli'});
+	print $outhandle "Error: Could not find ISIS XRF file " . $self->{'xrf_file_path'} . ".\n";
+	return;
+    }
+
+    # The text to split is exported from the database by the IsisGdl program
+    open(FILE, "IsisGdl \"$filename\" |");
+
+    my $reader = new multiread();
+    $reader->set_handle('ISISPlugin::FILE');
+    $reader->set_encoding($encoding);
+    $reader->read_file($textref);
+
+    close(FILE);
+
+    # Parse the associated ISIS database Field Definition Table file (.fdt)
+    my %fdt_mapping = &parse_field_definition_table($self->{'fdt_file_path'}, $encoding);
+    $self->{'fdt_mapping'} = \%fdt_mapping;
+
+    # Remove the line at the start, and any blank lines, so the data is split and processed properly
+    $$textref =~ s/^----------\n//;
+    $$textref =~ s/\n\n/\n/g;
+}
+
+
+sub process
+{
+    my $self = shift (@_);
+    my ($textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    # store the auxiliary files so we know which ones were used
+    # (mst file becomes the source file)
+    $doc_obj->associate_source_file($self->{'fdt_file_path'});
+    $doc_obj->associate_source_file($self->{'xrf_file_path'});
+
+    my $section = $doc_obj->get_top_section();
+    my $fdt_mapping = $self->{'fdt_mapping'};
+    my $subfield_separator = $self->{'subfield_separator'};
+    my $entry_separator = $self->{'entry_separator'};
+    my $isis_record_html_metadata_value = "<table cellpadding=\"4\" cellspacing=\"0\">";
+
+    # Process each line of the ISIS record, one at a time
+    foreach my $line (split(/\n/, $$textref)) {
+	$line =~ s/(\s*)$//;  # Remove any nasty whitespace (very important for Windows)
+	$line =~ /^tag=(.*) data=(.+)$/;
+	my $tag = $1;
+	my $tag_data = $2;
+        # print STDERR "\nTag: $tag, Data: $tag_data\n";
+
+	# Convert the tag number into a name, and remove any invalid characters
+	my $raw_metadata_name = $fdt_mapping->{$tag}{'name'} || "";
+	$raw_metadata_name =~ s/[,&\#\.\-\/]/ /g;
+	next if ($raw_metadata_name eq "");
+
+	# Metadata field names: title case, then remove spaces
+	my $metadata_name = "";
+	foreach my $word (split(/\s+/, $raw_metadata_name)) {
+	    substr($word, 0, 1) =~ tr/a-z/A-Z/;
+	    $metadata_name .= $word;
+	}
+
+	my $all_metadata_name = $metadata_name . "^all";
+	my $all_metadata_value = "";
+
+	# Handle repeatable fields
+	if ($fdt_mapping->{$tag}{'repeatable'}) {
+	    # Multiple values are separated using the '%' character
+	    foreach my $raw_metadata_value (split(/%/, $tag_data)) {
+		my $metadata_value = "";
+
+		# Handle subfields
+		while ($raw_metadata_value ne "") {
+		    # If there is a subfield specifier, parse it off
+		    my $sub_metadata_name = $metadata_name;
+		    if ($raw_metadata_value =~ s/^\^// && $raw_metadata_value =~ s/^([a-z])//) {
+			$sub_metadata_name .= "^$1";
+		    }
+
+		    # Parse the value off and add it as metadata
+		    $raw_metadata_value =~ s/^([^\^]*)//;
+		    my $sub_metadata_value = &escape_metadata_value($1);
+
+		    # print STDERR "Sub metadata name: $sub_metadata_name, value: $sub_metadata_value\n";
+		    if ($sub_metadata_name ne $metadata_name) {
+			$doc_obj->add_utf8_metadata($section, $sub_metadata_name, $sub_metadata_value); 
+		    }
+
+		    # If this tag has subfields and this is the first, use the value for the CDS/ISIS ^* field
+		    if ($fdt_mapping->{$tag}{'subfields'} ne "" && $metadata_value eq "") {
+			$doc_obj->add_utf8_metadata($section, $metadata_name . "^*", $sub_metadata_value); 
+		    }
+
+		    $metadata_value .= $subfield_separator unless ($metadata_value eq "");
+		    $metadata_value .= $sub_metadata_value;
+		}
+
+		# Add the metadata value
+		# print STDERR "Metadata name: $metadata_name, value: $metadata_value\n";
+		$doc_obj->add_utf8_metadata($section, $metadata_name, $metadata_value); 
+
+		$all_metadata_value .= $entry_separator unless ($all_metadata_value eq "");
+		$all_metadata_value .= $metadata_value;
+	    }
+	}
+
+	# Handle non-repeatable fields
+	else {
+	    my $raw_metadata_value = $tag_data;
+	    my $metadata_value = "";
+
+	    # Handle subfields
+	    while ($raw_metadata_value ne "") {
+		# If there is a subfield specifier, parse it off
+		my $sub_metadata_name = $metadata_name;
+		if ($raw_metadata_value =~ s/^\^// && $raw_metadata_value =~ s/^([a-z])//) {
+		    $sub_metadata_name .= "^$1";
+		}
+
+		# Parse the value off and add it as metadata
+		$raw_metadata_value =~ s/^([^\^]*)//;
+		my $sub_metadata_value = $1;
+
+		# Deal with the case when multiple values are specified using <...>
+		if ($sub_metadata_value =~ /\<(.+)\>/) {
+		    my $sub_sub_metadata_name = $sub_metadata_name . "^sub";
+		    my $tmp_sub_metadata_value = $sub_metadata_value;
+		    while ($tmp_sub_metadata_value =~ s/\<(.+?)\>//) {
+			my $sub_sub_metadata_value = $1;
+			$doc_obj->add_utf8_metadata($section, $sub_sub_metadata_name, $sub_sub_metadata_value); 
+		    }
+		}
+		# Deal with the legacy case when multiple values are specified using /.../
+		elsif ($sub_metadata_value =~ /\/(.+)\//) {
+		    my $sub_sub_metadata_name = $sub_metadata_name . "^sub";
+		    my $tmp_sub_metadata_value = $sub_metadata_value;
+		    while ($tmp_sub_metadata_value =~ s/\/(.+?)\///) {
+			my $sub_sub_metadata_value = $1;
+			$doc_obj->add_utf8_metadata($section, $sub_sub_metadata_name, $sub_sub_metadata_value); 
+		    }
+		}
+
+		# Escape the metadata value so it appears correctly in the final collection
+		$sub_metadata_value = &escape_metadata_value($sub_metadata_value);
+
+		# print STDERR "Sub metadata name: $sub_metadata_name, value: $sub_metadata_value\n";
+		if ($sub_metadata_name ne $metadata_name) {
+		    $doc_obj->add_utf8_metadata($section, $sub_metadata_name, $sub_metadata_value); 
+		}
+
+		# If this tag has subfields and this is the first, use the value for the CDS/ISIS ^* field
+		if ($fdt_mapping->{$tag}{'subfields'} ne "" && $metadata_value eq "") {
+		    $doc_obj->add_utf8_metadata($section, $metadata_name . "^*", $sub_metadata_value); 
+		}
+
+		$metadata_value .= $subfield_separator unless ($metadata_value eq "");
+		$metadata_value .= $sub_metadata_value;
+	    }
+
+	    # Add the metadata value
+	    # print STDERR "Metadata name: $metadata_name, value: $metadata_value\n";
+	    $doc_obj->add_utf8_metadata($section, $metadata_name, $metadata_value); 
+
+	    $all_metadata_value .= $entry_separator unless ($all_metadata_value eq "");
+	    $all_metadata_value .= $metadata_value;
+	}
+
+	# Add the "^all" metadata value
+	# print STDERR "All metadata name: $all_metadata_name, value: $all_metadata_value\n";
+	$doc_obj->add_utf8_metadata($section, $all_metadata_name, $all_metadata_value); 
+
+	$isis_record_html_metadata_value .= "<tr><td valign=top><nobr><b>" . $fdt_mapping->{$tag}{'name'} . "</b></nobr></td><td valign=top>" . $all_metadata_value . "</td></tr>";
+    }
+
+    # Add a reasonably formatted HTML table view of the record as the document text
+    $isis_record_html_metadata_value .= "</table>";
+    $doc_obj->add_utf8_text($section, $isis_record_html_metadata_value);
+
+    # Add the full raw record as metadata
+    my $isis_raw_record_metadata_value = &escape_metadata_value($$textref);
+    $doc_obj->add_utf8_metadata($section, "ISISRawRecord", $isis_raw_record_metadata_value);
+
+    # Add FileFormat metadata
+    $doc_obj->add_utf8_metadata($section, "FileFormat", "CDS/ISIS");
+
+    # Record was processed successfully
+    return 1;
+}
+
+
+sub parse_field_definition_table
+{
+    my $fdtfilename = shift(@_);
+    my $encoding = shift(@_);
+
+    my %fdtmapping = ();
+
+    open(FDT_FILE, "<$fdtfilename") || die "Error: Could not open file $fdtfilename.\n";
+
+    my $fdtfiletext = "";
+    my $reader = new multiread();
+    $reader->set_handle('ISISPlugin::FDT_FILE');
+    $reader->set_encoding($encoding);
+    $reader->read_file($fdtfiletext);
+
+    my $amongstdefinitions = 0;
+    foreach my $fdtfileline (split(/\n/, $$fdtfiletext)) {
+	$fdtfileline =~ s/(\s*)$//;  # Remove any nasty spaces at the end of the lines
+
+	if ($amongstdefinitions) {
+	    my $fieldname      = &unicode::substr($fdtfileline,  0, 30);
+	    my $fieldsubfields = &unicode::substr($fdtfileline, 30, 20);
+	    my $fieldspecs     = &unicode::substr($fdtfileline, 50, 50);
+
+	    # Remove extra spaces
+	    $fieldname =~ s/(\s*)$//;
+	    $fieldsubfields =~ s/(\s*)$//;
+	    $fieldspecs =~ s/(\s*)$//;
+
+	    # Map from tag number to metadata field title, subfields, and repeatability
+	    my $fieldtag = (split(/ /, $fieldspecs))[0];
+	    my $fieldrepeatable = (split(/ /, $fieldspecs))[3];
+	    $fdtmapping{$fieldtag} = { 'name' => $fieldname,
+				       'subfields' => $fieldsubfields,
+				       'repeatable' => $fieldrepeatable };
+	}
+	elsif ($fdtfileline eq "***") {
+	    $amongstdefinitions = 1;
+	}
+    }
+
+    close(FDT_FILE);
+
+    return %fdtmapping;
+}
+
+
+sub escape_metadata_value
+{
+    my $value = shift(@_);
+    $value =~ s/\</&lt;/g;
+    $value =~ s/\>/&gt;/g;
+    $value =~ s/\\/\\\\/g;
+    return $value;
+}
+
+
+sub clean_up_after_exploding
+{
+    my $self = shift(@_);
+
+    # Delete the FDT and XRF files too
+    &util::rm($self->{'fdt_file_path'});
+    &util::rm($self->{'xrf_file_path'});
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/ImageConverter.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/ImageConverter.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/ImageConverter.pm	(revision 24799)
@@ -0,0 +1,527 @@
+###########################################################################
+#
+# ImageConverter - helper plugin that does image conversion using ImageMagick
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2008 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+package ImageConverter;
+
+use BaseMediaConverter;
+
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+use util;
+use gsprintf 'gsprintf';
+
+BEGIN {
+    @ImageConverter::ISA = ('BaseMediaConverter');
+}
+
+# When used with multiple builder+buildproc, plugins loaded multiple times
+# => use this 'our' var to ensure only see the warning about ImageMagick once
+our $given_image_conversion_warning = 0;
+
+my $arguments = [
+      { 'name' => "create_thumbnail",
+	'desc' => "{ImageConverter.create_thumbnail}",
+	'type' => "enum",
+	'list' => [{'name' => "true", 'desc' => "{common.true}"},
+		   {'name' => "false", 'desc' => "{common.false}"}],
+	'deft' => "true",
+	'reqd' => "no" },
+      { 'name' => "thumbnailsize",
+	'desc' => "{ImageConverter.thumbnailsize}",
+	'type' => "int",
+	'deft' => "100",
+	'range' => "1,",
+	'reqd' => "no" },
+      { 'name' => "thumbnailtype",
+	'desc' => "{ImageConverter.thumbnailtype}",
+	'type' => "string",
+	'deft' => "gif",
+	'reqd' => "no" },
+      { 'name' => "noscaleup",
+	'desc' => "{ImageConverter.noscaleup}",
+	'type' => "flag",
+	'reqd' => "no" },
+      { 'name' => "create_screenview",
+	'desc' => "{ImageConverter.create_screenview}",
+	'type' => "enum",
+	'list' => [{'name' => "true", 'desc' => "{common.true}"},
+		   {'name' => "false", 'desc' => "{common.false}"}],
+	'deft' => "true",
+	'reqd' => "no" },
+      { 'name' => "screenviewsize",
+	'desc' => "{ImageConverter.screenviewsize}",
+	'type' => "int",
+	'deft' => "500",
+	'range' => "1,",
+	'reqd' => "no" },
+      { 'name' => "screenviewtype",
+	'desc' => "{ImageConverter.screenviewtype}",
+	'type' => "string",
+	'deft' => "jpg",
+	'reqd' => "no" },
+      { 'name' => "converttotype",
+	'desc' => "{ImageConverter.converttotype}",
+	'type' => "string",
+	'deft' => "",
+	'reqd' => "no" },
+      { 'name' => "minimumsize",
+	'desc' => "{ImageConverter.minimumsize}",
+	'type' => "int",
+	'deft' => "100",
+	'range' => "1,",
+	'reqd' => "no" }
+		 ];
+
+my $options = { 'name' => "ImageConverter",
+		'desc' => "{ImageConverter.desc}",
+		'abstract' => "yes",
+		'inherits' => "yes",
+		'args' => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new BaseMediaConverter($pluginlist, $inputargs, $hashArgOptLists, 1);
+
+
+    return bless $self, $class;
+
+}
+
+# needs to be called after BasePlugin init, so that outhandle is set up.
+sub init {
+    my $self = shift(@_);
+
+    $self->{'tmp_file_paths'} = ();
+
+    # Check that ImageMagick is installed and available on the path 
+    my $image_conversion_available = 1;
+    my $no_image_conversion_reason = "";
+    # None of this works very well on Windows 95/98...
+    if ($ENV{'GSDLOS'} eq "windows" && !Win32::IsWinNT()) {
+	$image_conversion_available = 0;
+	$no_image_conversion_reason = "win95notsupported";
+    } else {
+	my $imagick_cmd = "\"".&util::get_perl_exec()."\" -S gs-magick.pl";
+	my $result = `$imagick_cmd identify -help 2>&1`;
+	my $return_value = $?;
+
+	# When testing against non-zero return_value ($?), need to shift by 8 
+	# and convert it to its signed value. Linux returns -1 and Windows returns 
+	# 256 for "program not found". The signed equivalents are -1 and 1 respectively.
+	$return_value >>= 8;
+	$return_value = (($return_value & 0x80) ? -(0x100 - ($return_value & 0xFF)) : $return_value);
+
+	if ( ($ENV{'GSDLOS'} eq "windows" && $return_value == 1) || $return_value == -1) {  # Linux and Windows return different values for "program not found"
+	    $image_conversion_available = 0;
+	    $no_image_conversion_reason = "imagemagicknotinstalled";
+	}
+    }
+    $self->{'image_conversion_available'} = $image_conversion_available;
+    $self->{'no_image_conversion_reason'} = $no_image_conversion_reason;
+
+    if ($self->{'image_conversion_available'} == 0) {
+	if (!$given_image_conversion_warning) {
+	    my $outhandle = $self->{'outhandle'};
+	    &gsprintf($outhandle, "ImageConverter: {ImageConverter.noconversionavailable} ({ImageConverter.".$self->{'no_image_conversion_reason'}."})\n");
+	    $given_image_conversion_warning = 1;
+	}
+    }
+       
+}
+	
+
+# convert image to new type if converttotype is set
+# generate thumbnails if required
+# generate screenview if required
+# discover image metadata
+# filename_no_path must be in utf8 and url-encoded
+sub generate_images {
+    my $self = shift(@_);
+    my ($filename_full_path, $filename_encoded_full_path, $doc_obj, $section, $filename_encoding) = @_;
+
+    my ($unused_fefp,$filename_encoded_no_path)
+	= util::get_full_filenames("",$filename_encoded_full_path);
+
+    # The following is potentially very muddled thinking (but currently seems to work)
+    # generate_images currently called from ImagePlugin and PagedImagePlugin
+    my $filename_no_path = $filename_encoded_no_path; 
+
+    # check image magick status
+    return 0 if $self->{'image_conversion_available'} == 0;
+
+    # check the filenames
+    return 0 if ($filename_no_path eq "" || !-f $filename_full_path);
+
+    if ($self->{'enable_cache'}) {
+	$self->init_cache_for_file($filename_full_path);
+    }
+    if ($self->{'store_file_paths'}) {
+	$self->{'orig_file'} = "";
+	$self->{'thumb_file'} = "";
+	$self->{'screen_file'} = "";
+    }
+    my $verbosity = $self->{'verbosity'};
+    my $outhandle = $self->{'outhandle'};
+
+    # check the size of the image against minimum size if specified
+    my $minimumsize = $self->{'minimumsize'};
+    if (defined $minimumsize && (-s $filename_full_path < $minimumsize)) {
+        print $outhandle "ImageConverter: \"$filename_full_path\" too small, skipping\n"
+	    if ($verbosity > 1);
+	return 0; # or is there a better return value??
+    }
+    
+    my $filehead = $filename_no_path;
+    $filehead =~ s/\.([^\.]*)$//; # filename with no extension
+    my $assocfilemeta = "[assocfilepath]";
+    if ($section ne $doc_obj->get_top_section()) {
+	$assocfilemeta = "[parent(Top):assocfilepath]";
+    }
+
+    # The images that will get generated may contain percent signs in their src filenames
+    # Encode those percent signs themselves so that urls to the imgs refer to them correctly 
+    my $url_to_filehead = &unicode::filename_to_url($filehead);
+    my $url_to_filename_no_path = &unicode::filename_to_url($filename_no_path);
+    
+    # Convert the image to a new type (if required).
+    my $converttotype = $self->{'converttotype'};
+    my $type = "unknown";
+
+    if ($converttotype ne "" && $filename_full_path !~ m/$converttotype$/) {
+#	#    $doc_obj->add_utf8_metadata($section, "Image", $utf8_filename_meta);
+
+	my ($result, $converted_filename_full_path)
+	    = $self->convert($filename_full_path, $converttotype, "", "CONVERTTYPE");
+
+	$type = $converttotype;
+	$filename_full_path = $converted_filename_full_path;
+	$filename_no_path = "$filehead.$type";
+	$url_to_filename_no_path = "$url_to_filehead.$type";
+	if ($self->{'store_file_paths'}) {
+	    $self->{'orig_file'} = $converted_filename_full_path;
+	}
+    }
+
+    # add Image metadata 
+    $doc_obj->add_utf8_metadata($section, "Image", $url_to_filename_no_path); # url to generated image
+
+    # here we overwrite the original with the potentially converted one
+#    $doc_obj->set_utf8_metadata_element($section, "Source", &unicode::url_decode($filename_no_path)); # displayname of generated image
+#    $doc_obj->set_utf8_metadata_element($section, "SourceFile", $url_to_filename_no_path); # displayname of generated image
+
+#    $self->set_Source_metadata($doc_obj,$url_to_filename_no_path,undef);
+
+    my $raw_filename_full_path = &unicode::url_decode($filename_encoded_full_path);
+    $self->set_Source_metadata($doc_obj,$raw_filename_full_path,
+			       $filename_encoding, $section);
+
+
+    # use identify to get info about the (possibly converted) image
+    my ($image_type, $image_width, $image_height, $image_size) 
+	= &identify($filename_full_path, $outhandle, $verbosity);
+
+    if ($image_type ne " ") {
+	$type = $self->correct_mime_type($image_type);
+    }
+
+    #overwrite the ones added in BasePlugin
+    $doc_obj->set_metadata_element ($section, "FileFormat", $type);
+    $doc_obj->set_metadata_element ($section, "FileSize",   $image_size);
+
+    $doc_obj->add_metadata ($section, "ImageType",   $image_type);
+    $doc_obj->add_metadata ($section, "ImageWidth",  $image_width);
+    $doc_obj->add_metadata ($section, "ImageHeight", $image_height);
+    $doc_obj->add_metadata ($section, "ImageSize",   $image_size);
+
+    if ((defined $self->{'MaxImageWidth'}) 
+	&& ($image_width > $self->{'MaxImageWidth'})) {
+	$self->{'MaxImageWidth'} = $image_width;
+    }
+    if ((defined $self->{'MaxImageHeight'})
+	&& ($image_height > $self->{'MaxImageHeight'})) {
+	$self->{'MaxImageHeight'} = $image_height;
+    }
+
+    # srclink_file is now deprecated because of the "_" in the metadataname. Use srclinkFile
+    $doc_obj->add_metadata ($section, "srclink_file", $url_to_filename_no_path);
+    $doc_obj->add_metadata ($section, "srclinkFile", $url_to_filename_no_path);
+    $doc_obj->add_metadata ($section, "srcicon", "<img src=\"_httpprefix_/collect/[collection]/index/assoc/$assocfilemeta/[srclinkFile]\" width=\"[ImageWidth]\" height=\"[ImageHeight]\">");
+
+    # Add the image as an associated file
+    $doc_obj->associate_file($filename_full_path, $filename_no_path, "image/$type", $section);
+
+    if ($self->{'create_thumbnail'} eq "true") {
+	$self->create_thumbnail($filename_full_path, $filehead, $doc_obj, $section, $assocfilemeta, $url_to_filehead);
+    }
+    if ($self->{'create_screenview'} eq "true") {
+	$self->create_screenview($filename_full_path, $filehead, $doc_obj, $section, $assocfilemeta, $url_to_filehead, $image_width, $image_height);
+    }
+
+    return 1;
+}
+
+sub create_thumbnail {
+    my $self = shift(@_);
+    my ($original_file, $filehead, $doc_obj, $section, $assocfilemeta, $url_to_filehead) = @_;
+    $url_to_filehead = $filehead unless defined $url_to_filehead; 
+
+    my $thumbnailsize = $self->{'thumbnailsize'};
+    my $thumbnailtype = $self->correct_mime_type($self->{'thumbnailtype'});
+
+    # Generate the thumbnail with convert
+    my ($result,$thumbnailfile) 
+	= $self->convert($original_file, $thumbnailtype, "-geometry $thumbnailsize" . "x$thumbnailsize", "THUMB");
+    
+    # Add the thumbnail as an associated file ...
+    if (-e "$thumbnailfile") { 
+	$doc_obj->associate_file("$thumbnailfile", $filehead."_thumb.$thumbnailtype", 
+				 "image/$thumbnailtype",$section); # name of generated image
+	$doc_obj->add_metadata ($section, "ThumbType", $thumbnailtype);
+	$doc_obj->add_utf8_metadata ($section, "Thumb", $url_to_filehead."_thumb.$thumbnailtype"); # url to generated image
+	
+	$doc_obj->add_metadata ($section, "thumbicon", "<img src=\"_httpprefix_/collect/[collection]/index/assoc/$assocfilemeta/[Thumb]\" width=[ThumbWidth] height=[ThumbHeight]>");
+    
+	
+	# Extract Thumbnail metadata from convert output
+	if ($result =~ m/[0-9]+x[0-9]+=>([0-9]+)x([0-9]+)/) {
+	    $doc_obj->add_metadata ($section, "ThumbWidth", $1);
+	    $doc_obj->add_metadata ($section, "ThumbHeight", $2);
+	}
+	if ($self->{'store_file_paths'}) {
+	    $self->{'thumb_file'} = $thumbnailfile;
+	}
+
+    } else {
+	my $outhandle = $self->{'outhandle'};
+	print $outhandle "Couldn't find thumbnail $thumbnailfile\n";
+
+    }
+}
+
+sub create_screenview {
+    
+    my $self = shift(@_);
+    my ($original_file, $filehead, $doc_obj, $section, $assocfilemeta, $url_to_filehead, $image_width, $image_height) = @_;
+    $url_to_filehead = $filehead unless defined $url_to_filehead; 
+
+    my $screenviewsize = $self->{'screenviewsize'};
+    my $screenviewtype = $self->correct_mime_type($self->{'screenviewtype'});
+
+    # Scale the image, unless the original image is smaller than the screenview size and -noscaleup is set
+    my $scale_option = "-geometry $screenviewsize" . "x$screenviewsize";
+    if ($self->{'noscaleup'} && $image_width < $screenviewsize && $image_height < $screenviewsize)
+    {
+	$scale_option = "";
+    }
+    
+    # make the screenview image
+    my ($result,$screenviewfilename) 
+	= $self->convert($original_file, $screenviewtype, $scale_option, "SCREEN");    
+    
+    #add the screenview as an associated file ...
+    if (-e "$screenviewfilename") { 
+	$doc_obj->associate_file("$screenviewfilename", $filehead."_screen.$screenviewtype", "image/$screenviewtype",$section); # name of generated image
+	$doc_obj->add_metadata ($section, "ScreenType", $screenviewtype);
+	$doc_obj->add_utf8_metadata ($section, "Screen", $url_to_filehead."_screen.$screenviewtype"); # url to generated image
+	
+	$doc_obj->add_metadata ($section, "screenicon", "<img src=\"_httpprefix_/collect/[collection]/index/assoc/$assocfilemeta/[Screen]\" width=[ScreenWidth] height=[ScreenHeight]>");
+
+	# get screenview dimensions, size and type
+	if ($result =~ m/[0-9]+x[0-9]+=>([0-9]+)x([0-9]+)/) {
+	    $doc_obj->add_metadata ($section, "ScreenWidth", $1);
+	    $doc_obj->add_metadata ($section, "ScreenHeight", $2);
+	} elsif ($result =~ m/([0-9]+)x([0-9]+)/) {
+	    #if the image hasn't changed size, the previous regex doesn't match
+	    $doc_obj->add_metadata ($section, "ScreenWidth", $1);
+	    $doc_obj->add_metadata ($section, "ScreenHeight", $2);
+	}
+
+	if ($self->{'store_file_paths'}) {
+	    $self->{'screen_file'} = $screenviewfilename;
+	}
+
+    } else {
+	my $outhandle = $self->{'outhandle'};
+	print $outhandle "Couldn't find screenview file $screenviewfilename\n";
+
+    }
+
+}
+
+
+
+sub convert {
+    my $self = shift(@_);
+    my $source_file_path = shift(@_);
+    my $target_file_type = shift(@_);
+    my $convert_options  = shift(@_) || "";
+    my $convert_id       = shift(@_) || "";
+    my $cache_mode       = shift(@_) || "";
+
+    my $outhandle = $self->{'outhandle'};
+    my $verbosity = $self->{'verbosity'};
+
+    my $source_file_no_path = &File::Basename::basename($source_file_path);
+
+    # Determine the full name and path of the output file
+    my $target_file_path;
+    if ($self->{'enable_cache'}) {
+	my $cached_image_dir = $self->{'cached_dir'};
+	my $image_root = $self->{'cached_file_root'};
+	$image_root .= "_$convert_id" if ($convert_id ne "");
+	my $image_file = "$image_root.$target_file_type";
+	$target_file_path = &util::filename_cat($cached_image_dir,$image_file);
+    }
+    else {
+	$target_file_path = &util::get_tmp_filename($target_file_type);
+	push(@{$self->{'tmp_file_paths'}}, $target_file_path);
+
+	# Output filename used to be parsed from result line:
+	#   my ($ofilename) = ($result =~ m/=>(.*\.$target_file_type)/);
+	# by the function that called 'convert'
+	# but this is no longer needed, as output filename is now
+	# explicitly passed back
+    }
+
+    # Generate and run the convert command
+    my $convert_command = "\"".&util::get_perl_exec()."\" -S gs-magick.pl convert -interlace plane -verbose $convert_options \"$source_file_path\" \"$target_file_path\"";
+
+    my $print_info = { 'message_prefix' => $convert_id,
+		       'message' => "Converting image $source_file_no_path to: $convert_id $target_file_type" };
+    $print_info->{'cache_mode'} = $cache_mode if ($cache_mode ne "");
+
+    my ($regenerated,$result,$had_error) 
+	= $self->autorun_general_cmd($convert_command,$source_file_path,$target_file_path,$print_info);
+
+    return ($result,$target_file_path);
+}
+
+sub convert_without_result {
+    my $self = shift(@_);
+
+    my $source_file_path = shift(@_);
+    my $target_file_type = shift(@_);
+    my $convert_options  = shift(@_) || "";
+    my $convert_id       = shift(@_) || "";
+
+    return $self->convert($source_file_path,$target_file_type,
+			  $convert_options,$convert_id,"without_result");
+}
+
+
+# Discover the characteristics of an image file with the ImageMagick
+# "identify" command.
+
+sub identify { 
+    my ($image, $outhandle, $verbosity) = @_;
+
+    # Use the ImageMagick "identify" command to get the file specs
+    my $command = "\"".&util::get_perl_exec()."\" -S gs-magick.pl identify \"$image\" 2>&1";
+    print $outhandle "$command\n" if ($verbosity > 2);
+    my $result = '';
+    $result = `$command`;
+    print $outhandle "$result\n" if ($verbosity > 3);
+
+    # Read the type, width, and height
+    my $type =   'unknown';
+    my $width =  'unknown';
+    my $height = 'unknown';
+
+    my $image_safe = quotemeta $image;
+    if ($result =~ /^$image_safe (\w+) (\d+)x(\d+)/) {
+	$type = $1;
+	$width = $2;
+	$height = $3;
+    }
+
+    # Read the size
+    my $size = "unknown";
+    if ($result =~ m/^.* ([0-9]+)b/) {
+	$size = $1;
+    }
+    elsif ($result =~ m/^.* ([0-9]+)(\.([0-9]+))?kb?/) {
+	$size = 1024 * $1;
+	if (defined($2)) {
+	    $size = $size + (1024 * $2);
+	    # Truncate size (it isn't going to be very accurate anyway)
+	    $size = int($size);
+	}
+    }
+    elsif ($result =~ m/^.* ([0-9]+)(\.([0-9]+))?mb?/) {
+	$size = 1024 * 1024 * $1;
+        if (defined($2)) {
+	    $size = $size + (1024 * 1024 * $2);
+            # Truncate size (it isn't going to be very accurate anyway)
+            $size = int($size);
+        }
+     }
+    elsif ($result =~ m/^.* (([0-9]+)(\.([0-9]+))?e\+([0-9]+))(kb|b)?/) {
+	# Deals with file sizes on Linux of type "3.4e+02kb" where e+02 is 1*10^2.
+	# 3.4e+02 therefore evaluates to 3.4 x 1 x 10^2 = 340kb.
+	# Programming languages including Perl know how that 3.4e+02 is a number,
+	# so we don't need to do any calculations.
+	$size = $1*1; # turn the string into a number by multiplying it by 1
+	       #if we did $size = $1; $size would be merely the string "3.4e+02"
+	$size = int($size); # truncate size
+    }
+    print $outhandle "file: $image:\t $type, $width, $height, $size\n" 
+	if ($verbosity > 2);
+
+    # Return the specs
+    return ($type, $width, $height, $size);
+}
+
+sub clean_up_temporary_files {
+    my $self = shift(@_);
+
+    foreach my $tmp_file_path (@{$self->{'tmp_file_paths'}}) {
+	if (-e $tmp_file_path) {
+	    &util::rm($tmp_file_path);
+	}
+    }
+   
+}
+
+# image/jpg is not a valid mime-type, it ought to be image/jpeg. 
+# Sometimes JPEG is passed in also, want to keep things lowercase just in case.
+sub correct_mime_type {
+    my $self = shift(@_);
+    my ($file_extension) = @_;
+    
+    $file_extension = lc($file_extension);
+    $file_extension =~ s/jpg/jpeg/s; 
+
+    return $file_extension;
+}
+
+1;	
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/ImagePlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/ImagePlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/ImagePlugin.pm	(revision 24799)
@@ -0,0 +1,174 @@
+###########################################################################
+#
+# ImagePlugin.pm -- for processing standalone images
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package ImagePlugin;
+
+use BasePlugin;
+use ImageConverter;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+no strict 'subs';
+
+use gsprintf 'gsprintf';
+
+sub BEGIN {
+    @ImagePlugin::ISA = ('BasePlugin', 'ImageConverter');
+}
+
+my $arguments =
+    [ { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'deft' => &get_default_process_exp(),
+	'reqd' => "no" },
+      ];
+
+my $options = { 'name'     => "ImagePlugin",
+		'desc'     => "{ImagePlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    
+    new ImageConverter($pluginlist, $inputargs, $hashArgOptLists);
+    my $self = new BasePlugin($pluginlist, $inputargs, $hashArgOptLists);
+
+    return bless $self, $class;
+}
+
+sub init {
+    my $self = shift (@_);
+    my ($verbosity, $outhandle, $failhandle) = @_;
+
+    $self->SUPER::init(@_);
+    $self->ImageConverter::init();
+    $self->{'cover_image'} = 0; # makes no sense for images
+}
+
+sub begin {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $processor, $maxdocs) = @_;
+
+    $self->SUPER::begin(@_);
+    $self->ImageConverter::begin(@_);
+}
+
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+	# from .jpf and onwards below, the file extensions are for JPEG2000
+    return q^(?i)\.(jpe?g|gif|png|bmp|xbm|tif?f|jpf|jpx|jp2|jpc|j2k|pnm|pgx)$^; 
+}
+
+# this makes no sense for images
+sub block_cover_image
+{
+    my $self =shift (@_);
+    my ($filename) = @_;
+
+    return;
+}
+
+# do plugin specific processing of doc_obj
+sub process {
+    my $self = shift (@_);
+    # options??
+    my ($pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+
+    my $outhandle = $self->{'outhandle'};
+    my ($filename_full_path, $filename_no_path) = &util::get_full_filenames($base_dir, $file);
+	
+    if ($self->{'image_conversion_available'} == 1)
+    {
+		my $plugin_filename_encoding = $self->{'filename_encoding'};
+		my $filename_encoding = $self->deduce_filename_encoding($file,$metadata,$plugin_filename_encoding);
+		
+		my $url_encoded_full_filename 
+		    = &unicode::raw_filename_to_url_encoded($filename_full_path);
+
+		# should we check the return value?
+		$self->generate_images($filename_full_path, 
+				       $url_encoded_full_filename, 
+				       $doc_obj, $doc_obj->get_top_section(),$filename_encoding); 
+		
+    }
+    else
+    {
+		if ($gli) {
+			&gsprintf(STDERR, "<Warning p='ImagePlugin' r='{ImageConverter.noconversionavailable}: {ImageConverter.".$self->{'no_image_conversion_reason'}."}'>");
+		}
+		# all we do is add the original image as an associated file, and set up srclink etc
+		my $assoc_file = $doc_obj->get_assocfile_from_sourcefile();
+		my $section = $doc_obj->get_top_section();
+		
+		$doc_obj->associate_file($filename_full_path, $assoc_file, "", $section);
+		
+		# srclink_file is now deprecated because of the "_" in the metadataname. Use srclinkFile
+		$doc_obj->add_metadata ($section, "srclink_file", $doc_obj->get_sourcefile()); 
+		$doc_obj->add_metadata ($section, "srclinkFile", $doc_obj->get_sourcefile()); 
+		# We don't know the size of the image, but the browser should display it at full size
+		$doc_obj->add_metadata ($section, "srcicon", "<img src=\"_httpprefix_/collect/[collection]/index/assoc/[assocfilepath]/[srclinkFile]\">");
+		
+		# Add a fake thumbnail icon with the full-sized image scaled down by the browser
+		$doc_obj->add_metadata ($section, "thumbicon", "<img src=\"_httpprefix_/collect/[collection]/index/assoc/[assocfilepath]/[srclinkFile]\" width=\"" . $self->{'thumbnailsize'} . "\">");
+    }
+    #we have no text - adds dummy text and NoText metadata
+    $self->add_dummy_text($doc_obj, $doc_obj->get_top_section());
+	
+    return 1;
+	
+}
+
+
+sub clean_up_after_doc_obj_processing {
+    my $self = shift(@_);
+    
+    $self->ImageConverter::clean_up_temporary_files();
+}
+
+1;
+
+
+
+
+
+
+
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/IndexPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/IndexPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/IndexPlugin.pm	(revision 24799)
@@ -0,0 +1,158 @@
+###########################################################################
+#
+# IndexPlugin.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# This recursive plugin processes an index.txt file. 
+# The index.txt file should contain the list of files to be
+# included in the collection followed by any extra metadata to
+# be associated with each file.
+
+# The index.txt file should be formatted as follows:
+# The first line may be a key (beginning with key:)
+# to name the metadata fields
+# (e.g. key: Subject Organization Date) 
+# The following lines will contain a filename followed 
+# by the value that metadata entry is to be set to.
+# (e.g. 'irma/iw097e 3.2 unesco 1993' will associate the
+# metadata Subject=3.2, Organization=unesco, and Date=1993
+# with the file irma/iw097e if the above key line was used)
+
+# Note that if any of the metadata fields use the Hierarchy
+# classifier plugin then the value they're set to should
+# correspond to the first field (the descriptor) in the
+# appropriate classification file.
+
+# Metadata values may be named separately using a tag 
+# (e.g. <Subject>3.2) and this will override any name 
+# given to them by the key line.
+# If there's no key line any unnamed metadata value will be
+# named 'Subject'.
+
+package IndexPlugin;
+
+use plugin;
+use BasePlugin;
+use doc;
+use util;
+use cfgread;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+sub BEGIN {
+    @IndexPlugin::ISA = ('BasePlugin');
+}
+
+#my $arguments = [
+#		 ];
+
+my $options = { 'name'     => "IndexPlugin",
+		'desc'     => "{IndexPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes" };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    #push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new BasePlugin($pluginlist, $inputargs, $hashArgOptLists);
+
+    return bless $self, $class;
+}
+
+# return 1 if this class might recurse using $pluginfo
+sub is_recursive {
+    my $self = shift (@_);
+    
+    return 1;
+}
+
+# return number of files processed, undef if can't process
+# Note that $base_dir might be "" and that $file might 
+# include directories
+sub read {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $block_hash, $metadata, $processor, $maxdocs, $total_count, $gli) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    my $indexfile = &util::filename_cat($base_dir, $file, "index.txt");
+    if (!-f $indexfile) {
+	# not a directory containing an index file
+	return undef;
+    }
+
+    # found an index.txt file
+    print STDERR "<Processing n='$file' p='IndexPlugin'>\n" if ($gli);
+    print $outhandle "IndexPlugin: processing $indexfile\n";
+
+    # read in the index.txt
+    my $list = &cfgread::read_cfg_file ($indexfile, undef, '^[^#]\w');
+    my @fields = ();
+    # see if there's a 'key:' line
+    if (defined $list->{'key:'}) {
+	@fields = @{$list->{'key:'}};
+    }
+
+    my $index_base_dir = &util::filename_cat($base_dir, $file);
+
+    # process each document
+    my $count = 0;
+    foreach my $docfile (keys (%$list)) {
+	last if ($maxdocs != -1 && ($total_count + $count) >= $maxdocs);
+	$metadata = {}; # at present we can do this as metadata
+	                # will always be empty when it arrives
+	                # at this plugin - this might cause 
+	                # problems if things change though
+
+	# note that $list->{$docfile} is an array reference
+	if ($docfile !~ /key:/i) {
+	    my $i = 0;
+	    for ($i = 0; $i < scalar (@{$list->{$docfile}}); $i ++) {
+		if ($list->{$docfile}->[$i] =~ /^<([^>]+)>(.+)$/) {
+		    unless (defined ($metadata->{$1})) {
+			$metadata->{$1} = [];
+		    } 
+		    push (@{$metadata->{$1}}, $2);
+		} elsif (scalar @fields >= $i) {
+		    unless (defined ($metadata->{$fields[$i]})) {
+			$metadata->{$fields[$i]} = [];
+		    } 
+		    push (@{$metadata->{$fields[$i]}}, $list->{$docfile}->[$i]);
+		} else {
+		    $metadata->{'Subject'} = $list->{$docfile};
+		}
+	    }
+	    $count += &plugin::read ($pluginfo, $index_base_dir, $docfile, $block_hash, $metadata, $processor, $maxdocs, ($total_count +$count), $gli);
+	}
+    }
+
+    return $count; # was processed
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/KeyphraseExtractor.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/KeyphraseExtractor.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/KeyphraseExtractor.pm	(revision 24799)
@@ -0,0 +1,145 @@
+###########################################################################
+#
+# KeyphraseExtractor - helper plugin to extract key phrases
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2008 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package KeyphraseExtractor;
+
+use Kea;
+use PrintInfo;
+use gsprintf 'gsprintf';
+
+use strict;
+no strict 'subs';
+
+BEGIN {
+    @KeyphraseExtractor::ISA = ('PrintInfo');
+}
+
+my $arguments = [
+      { 'name' => "extract_keyphrases",
+	'desc' => "{KeyphraseExtractor.extract_keyphrases}",
+	'type' => "flag",
+	'reqd' => "no" },
+      { 'name' => "extract_keyphrases_kea4",
+	'desc' => "{KeyphraseExtractor.extract_keyphrases_kea4}",
+	'type' => "flag",
+	'reqd' => "no" },
+      { 'name' => "extract_keyphrase_options",
+	'desc' => "{KeyphraseExtractor.extract_keyphrase_options}",
+	'type' => "string",
+	'deft' => "",
+	'reqd' => "no" }
+		 ];
+
+my $options = { 'name'     => "KeyphraseExtractor",
+		'desc'     => "{KeyphraseExtractor.desc}",
+		'abstract' => "yes",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new PrintInfo($pluginlist, $inputargs, $hashArgOptLists, 1);
+
+    return bless $self, $class;
+
+}
+# extract metadata
+sub extract_keyphrase_metadata {
+
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+
+    if ($self->{'extract_keyphrases'} || $self->{'extract_keyphrases_kea4'}) {
+	$self->extract_keyphrases($doc_obj);
+    }
+
+}
+
+
+#adding kea keyphrases
+sub extract_keyphrases
+{
+    my $self = shift(@_);
+    my $doc_obj = shift(@_);
+
+    # Use Kea 3.0 unless 4.0 has been specified
+    my $kea_version = "3.0";
+    if ($self->{'extract_keyphrases_kea4'}) {
+	$kea_version = "4.0";
+    }
+
+    # Check that Kea exists, and tell the user where to get it if not
+    my $keahome = &Kea::get_Kea_directory($kea_version);
+    if (!-e $keahome) {
+	gsprintf(STDERR, "{KeyphraseExtractor.missing_kea}\n", $keahome, $kea_version);
+	return;
+    }
+
+    my $thissection = $doc_obj->get_top_section();
+    my $text = "";
+    my $list;
+
+    #loop through sections to gather whole doc
+    while (defined $thissection) { 
+	my $sectiontext = $doc_obj->get_text($thissection);   
+	$text = $text.$sectiontext;
+	$thissection = $doc_obj->get_next_section ($thissection);
+    } 
+   
+    if($self->{'extract_keyphrase_options'}) { #if kea options flag is set, call Kea with specified options 
+	$list = &Kea::extract_KeyPhrases ($kea_version, $text, $self->{'extract_keyphrase_options'});
+    } else { #otherwise call Kea with no options
+	$list = &Kea::extract_KeyPhrases ($kea_version, $text);
+    }
+ 
+    if ($list){
+	# if a list of kea keyphrases was returned (ie not empty)
+	if ($self->{'verbosity'}) {
+	    gsprintf(STDERR, "{KeyphraseExtractor.keyphrases}: $list\n");
+	}
+
+	#add metadata to top section
+	$thissection = $doc_obj->get_top_section(); 
+
+	# add all key phrases as one metadata
+	$doc_obj->add_metadata($thissection, "Keyphrases", $list);
+
+	# add individual key phrases as multiple metadata
+	foreach my $keyphrase (split(',', $list)) {
+	    $keyphrase =~ s/^\s+|\s+$//g;
+	    $doc_obj->add_metadata($thissection, "Keyphrase", $keyphrase);
+	}
+    }
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/LOMPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/LOMPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/LOMPlugin.pm	(revision 24799)
@@ -0,0 +1,717 @@
+###########################################################################
+#
+# LOMPlugin.pm -- plugin for import the collection from LOM
+# 
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2005 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+### Note this plugin currently can't download source documents from outside if you are behind a firewall.
+# Unless, you set the http_proxy environment variable to be your proxy server, 
+# and set proxy_user and proxy_password in .wgetrc file in home directory. 
+# (does that work on windows??)
+
+package LOMPlugin;
+
+use ReadTextFile;
+use MetadataPass;
+use MetadataRead;
+use XMLParser;
+use Cwd;
+
+# methods with identical signatures take precedence in the order given in the ISA list.
+sub BEGIN {
+    @ISA = ('MetadataRead', 'ReadTextFile', 'MetadataPass');
+}
+
+use strict; # every perl program should have this!
+no strict 'refs'; # make an exception so we can use variables as filehandles
+
+
+my $arguments =
+    [ { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "string",
+	'deft' => &get_default_process_exp(),
+	'reqd' => "no" },
+      { 'name' => "root_tag",
+	'desc' => "{LOMPlugin.root_tag}",
+	'type' => "regexp",
+	'deft' => q/^(?i)lom$/,
+	'reqd' => "no" },
+      { 'name' => "check_timestamp",
+	'desc' => "{LOMPlugin.check_timestamp}",
+	'type' => "flag" },
+      { 'name' => "download_srcdocs",
+	'desc' => "{LOMPlugin.download_srcdocs}",
+	'type' => "regexp",
+	'deft' => "",
+	'reqd' => "no" }];
+
+my $options = { 'name'     => "LOMPlugin",
+		'desc'     => "{LOMPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+
+
+my ($self);
+sub new {
+    my $class = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+    
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+   
+    $self = new ReadTextFile($pluginlist, $inputargs, $hashArgOptLists);
+
+    if ($self->{'info_only'}) {
+	# don't worry about creating the XML parser as all we want is the 
+	# list of plugin options
+	return bless $self, $class;
+    }
+
+    #create XML::Parser object for parsing dublin_core.xml files
+    my $parser = new XML::Parser('Style' => 'Stream',
+				 'Handlers' => {'Char' => \&Char,
+						'Doctype' => \&Doctype
+						});
+    $self->{'parser'} = $parser;
+
+    $self->{'extra_blocks'} = {};
+
+    return bless $self, $class;
+}
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+    return q^(?i)\.xml$^;
+}
+
+
+sub can_process_this_file {
+    my $self = shift(@_);
+    my ($filename) = @_;
+
+    if ($self->SUPER::can_process_this_file($filename) && $self->check_doctype($filename)) {
+	return 1; # its a file for us
+    }
+    return 0;
+}
+
+sub metadata_read {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $block_hash, 
+	$extrametakeys, $extrametadata, $extrametafile,
+	$processor, $gli, $aux) = @_;
+
+    my $outhandle = $self->{'outhandle'};
+
+    # can we process this file??
+    my ($filename_full_path, $filename_no_path) = &util::get_full_filenames($base_dir, $file);
+    return undef unless $self->can_process_this_file_for_metadata($filename_full_path);
+
+    $file =~ s/^[\/\\]+//; # $file often begins with / so we'll tidy it up
+    
+    print $outhandle "LOMPlugin: extracting metadata from $file\n"
+	if $self->{'verbosity'} > 1;
+
+    my ($dir,$tail) = $filename_full_path =~ /^(.*?)([^\/\\]*)$/;
+    $self->{'output_dir'} = $dir;
+
+    eval {
+	$self->{'parser'}->parsefile($filename_full_path);
+    };
+    
+    if ($@) {
+	print $outhandle "LOMPlugin: skipping $filename_full_path as not conformant to LOM syntax\n" if ($self->{'verbosity'} > 1);
+	print $outhandle "\n Perl Error:\n $@\n" if ($self->{'verbosity'}>2);
+	return 0;
+    }
+
+    $self->{'output_dir'} = undef;
+
+    my $file_re;
+    my $lom_srcdoc = $self->{'lom_srcdoc'};
+
+    if (defined $lom_srcdoc) {
+	my $dirsep = &util::get_re_dirsep();
+	$lom_srcdoc =~ s/^$base_dir($dirsep)//;
+	$self->{'extra_blocks'}->{$file}++;
+	$file_re = $lom_srcdoc;
+    }
+    else {
+	$file_re = $tail;
+    }
+    $file_re = &util::filename_to_regex($file_re);
+    $self->{'lom_srcdoc'} = undef; # reset for next file to be processed
+
+    push(@$extrametakeys,$file_re);
+    $extrametadata->{$file_re} = $self->{'saved_metadata'};
+    if (defined $lom_srcdoc) {
+	# copied from oaiplugin
+	if (!defined $extrametafile->{$file_re}) {
+	    $extrametafile->{$file_re} = {};
+	}
+	 #maps the file to full path
+	$extrametafile->{$file_re}->{$file} = $filename_full_path;
+    }
+	
+    return 1;
+}
+
+sub check_doctype {
+    $self = shift (@_);
+    
+    my ($filename) = @_;
+    
+    if (open(XMLIN,"<$filename")) {
+	my $doctype = $self->{'root_tag'};
+	## check whether the doctype has the same name as the root element tag
+	while (defined (my $line = <XMLIN>)) {
+	    ## find the root element
+	    if ($line =~ /<([\w\d:]+)[\s>]/){
+		my $root = $1;
+		if ($root !~ $doctype){
+		    close(XMLIN);
+		    return 0;
+		}
+		else {
+		    close(XMLIN); 
+		    return 1;
+		}
+	    }
+	}
+	close(XMLIN);
+    }
+    
+    return undef; # haven't found a valid line
+    
+}
+
+sub read_file {
+    my $self = shift (@_);
+    my ($filename, $encoding, $language, $textref) = @_;
+
+    my $metadata_table = $self->{'metadata_table'};
+
+    my $rawtext = $metadata_table->{'rawtext'};
+
+    delete $metadata_table->{'rawtext'};
+
+    $$textref = $rawtext;
+}
+
+sub read {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $block_hash, $metadata, $processor, $maxdocs, $total_count, $gli) = @_;
+
+    my $outhandle = $self->{'outhandle'};
+
+    return 0 if (defined $self->{'extra_blocks'}->{$file});
+
+    # can we process this file??
+    my ($filename_full_path, $filename_no_path) = &util::get_full_filenames($base_dir, $file);
+    return undef unless $self->can_process_this_file($filename_full_path);
+
+    $self->{'metadata_table'} = $metadata;
+
+    my $lom_language = $metadata->{'lom_language'};
+
+    my $store_input_encoding;
+    my $store_extract_language;
+    my $store_default_language;
+    my $store_default_encoding;
+
+    if (defined $lom_language) {
+	delete $metadata->{'lom_language'};
+
+	$store_input_encoding   = $self->{'input_encoding'};
+	$store_extract_language = $self->{'extract_language'};
+	$store_default_language = $self->{'default_language'};
+	$store_default_encoding = $self->{'default_encoding'};
+
+	$self->{'input_encoding'}   = "utf8";
+	$self->{'extract_language'} = 0;
+	$self->{'default_language'} = $lom_language;
+	$self->{'default_encoding'} = "utf8";
+    }
+
+    my $rv = $self->SUPER::read(@_);
+
+    if (defined $lom_language) {	
+	$self->{'input_encoding'}   = $store_input_encoding;
+	$self->{'extract_language'} = $store_extract_language;
+	$self->{'default_language'} = $store_default_language;
+	$self->{'default_encoding'} = $store_default_encoding;
+    }
+
+    $self->{'metadata_table'} = undef;
+
+    return $rv;
+}
+
+# do plugin specific processing of doc_obj
+sub process {
+    my $self = shift (@_);
+    my ($textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    my $cursection = $doc_obj->get_top_section();
+    $doc_obj->add_utf8_text($cursection, $$textref);
+
+    return 1;
+}
+
+sub Doctype {
+    my ($expat, $name, $sysid, $pubid, $internal) = @_;
+
+    my $root_tag = $self->{'root_tag'};
+
+    if ($name !~ /$root_tag/) {	
+	die "Root tag $name does not match regular expression $root_tag";
+    }
+}
+
+sub StartTag {
+    my ($expat, $element) = @_;
+
+    my %attr = %_;
+    
+    my $raw_tag = "&lt;$element";
+    map { $raw_tag .= " $_=\"$attr{$_}\""; } keys %attr;
+    $raw_tag .= "&gt;";
+
+    if ($element =~ m/$self->{'root_tag'}/) {
+	$self->{'raw_text'} = $raw_tag;
+
+	$self->{'saved_metadata'} = {};
+	$self->{'metaname_stack'} = [];
+	$self->{'lom_datatype'} = "";
+	$self->{'lom_language'} = undef;
+	$self->{'metadatatext'} = "<table class=\"metadata\" width=\"_pagewidth_\" >\n";
+    }
+    else {
+	my $xml_depth = scalar(@{$self->{'metaname_stack'}});
+	$self->{'raw_text'} .= "\n"; 
+	$self->{'raw_text'} .= "&nbsp;&nbsp;" x $xml_depth; 
+	$self->{'raw_text'} .= $raw_tag;
+
+	my $metaname_stack = $self->{'metaname_stack'};
+	push(@$metaname_stack,$element);
+	if (scalar(@$metaname_stack)==1) {
+	    # top level LOM category
+	    my $style = "class=\"metadata\"";
+	    my $open_close
+		= "<a id=\"${element}opencloselink\" href=\"javascript:hideTBodyArea('$element')\">\n";
+	    $open_close
+		.= "<img id=\"${element}openclose\" border=\"0\" src=\"_httpopenmdicon_\"></a>\n";
+
+	    my $header_line = "  <tr $style ><th $style colspan=\"3\">$open_close \u$element</th></tr>\n";
+	    my $md_tbody = "<tbody id=\"$element\">\n";
+
+	    $self->{'mdheader'}     = $header_line;
+	    $self->{'mdtbody'}      = $md_tbody;
+	    $self->{'mdtbody_text'} = "";
+	}
+    }
+}
+
+sub EndTag {
+    my ($expat, $element) = @_;
+
+    my $raw_tag = "&lt;/$element&gt;";
+    
+    if ($element =~ m/$self->{'root_tag'}/) {
+	$self->{'raw_text'} .= $raw_tag;
+
+	my $metadatatext = $self->{'metadatatext'};
+	$metadatatext .= "</table>";
+
+	my $raw_text = $self->{'raw_text'};
+
+	$self->{'saved_metadata'}->{'MetadataTable'} =  $metadatatext;
+	$self->{'metadatatext'} = "";
+
+	$self->{'saved_metadata'}->{'rawtext'} =  $raw_text;
+	$self->{'raw_text'} = "";
+
+	if (defined $self->{'lom_language'}) {
+	    $self->{'saved_metadata'}->{'lom_language'} = $self->{'lom_language'};
+	    $self->{'lom_language'} = undef;
+	}
+    }
+    else {
+	my $metaname_stack = $self->{'metaname_stack'};
+
+	if (scalar(@$metaname_stack)==1) {
+	    my $header_line = $self->{'mdheader'};
+	    my $tbody_start = $self->{'mdtbody'};
+	    my $tbody_text  = $self->{'mdtbody_text'};
+	    if ($tbody_text !~ m/^\s*$/s) {
+		my $tbody_end = "</tbody>\n";
+		my $table_chunk 
+		    = $header_line.$tbody_start.$tbody_text.$tbody_end;
+
+		$self->{'metadatatext'} .= $table_chunk;
+	    }
+	    $self->{'mdtheader'}    = "";
+	    $self->{'mdtbody'}      = "";
+	    $self->{'mdtbody_text'} = "";
+	}
+
+	pop(@$metaname_stack);
+
+	my $xml_depth = scalar(@{$self->{'metaname_stack'}});
+	$self->{'raw_text'} .= "\n"; 
+	$self->{'raw_text'} .= "&nbsp;&nbsp;" x $xml_depth; 
+	$self->{'raw_text'} .= $raw_tag;
+    }
+}
+
+sub process_datatype_info
+{
+    my $self = shift(@_);
+    my ($metaname_stack,$md_content) = @_;
+
+    my @without_dt_stack = @$metaname_stack; # without datatype stack
+
+    my $innermost_element = $without_dt_stack[$#without_dt_stack];
+
+    # Loose last item if encoding datatype information
+    if ($innermost_element =~ m/^(lang)?string$/) {
+	$self->{'lom_datatype'} = $innermost_element;
+
+	pop @without_dt_stack;
+	$innermost_element = $without_dt_stack[$#without_dt_stack];
+    }
+    elsif ($innermost_element =~ m/^date(Time)?$/i) { 
+	if ($innermost_element =~ m/^date$/i) {
+	    $self->{'lom_datatype'} = "dateTime";
+	}
+	else {
+	    $self->{'lom_datatype'} = $innermost_element;
+
+	    pop @without_dt_stack;
+	    $innermost_element = $without_dt_stack[$#without_dt_stack];
+	}
+
+	if ($md_content =~ m/^(\d{1,2})\s*(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\w*\s*(\d{4})/i) {
+	    my ($day,$mon,$year) = ($1,$2,$3);
+	    
+	    my %month_lookup = ( 'jan' =>  1, 'feb' =>  2, 'mar' =>  3,
+				 'apr' =>  4, 'may' =>  5, 'jun' =>  6,
+				 'jul' =>  7, 'aug' =>  8, 'sep' =>  9,
+				 'oct' => 10, 'nov' => 11, 'dec' => 12 );
+
+	    my $mon_num = $month_lookup{lc($mon)};
+
+	    $md_content = sprintf("%d%02d%02d",$year,$mon_num,$day);
+	}
+
+	$md_content =~ s/\-//g;
+    }
+
+    if ($innermost_element eq "source") {
+	$self->{'lom_source'} = $md_content;
+    }
+    elsif ($innermost_element eq "value") {
+	$self->{'lom_value'} = $md_content;
+    }
+
+    return (\@without_dt_stack,$innermost_element,$md_content);
+}
+
+sub reset_datatype_info
+{
+    my $self = shift(@_);
+
+    $self->{'lom_datatype'} = "";
+}
+
+
+sub pretty_print_text
+{
+    my $self = shift(@_);
+    
+    my ($pretty_print_text) = @_;
+
+##    $metavalue_utf8 = &util::hyperlink_text($metavalue_utf8);
+    $pretty_print_text = &util::hyperlink_text($pretty_print_text);
+	
+####    $pretty_print_text =~ s/(BEGIN:vCard.*END:vCard)/<pre>$1<\/pre>/sg;
+
+    if ($self->{'lom_datatype'} eq "dateTime") {
+	if ($pretty_print_text =~ m/^(\d{4})(\d{2})(\d{2})$/) {
+	    $pretty_print_text = "$1-$2-$3";
+	}
+    }
+
+    return $pretty_print_text;
+}
+
+sub pretty_print_table_tr
+{
+    my $self = shift (@_);
+    my ($without_dt_stack) = @_;
+
+    my $style = "class=\"metadata\"";
+
+    my $innermost_element = $without_dt_stack->[scalar(@$without_dt_stack)-1];
+    my $outermost_element = $without_dt_stack->[0];
+
+    # Loose top level stack item (already named in pretty print table)
+    my @pretty_print_stack = @$without_dt_stack;
+    shift @pretty_print_stack; 
+
+    if ($innermost_element eq "source") {
+	return if (!defined $self->{'lom_value'});
+    }
+
+    if ($innermost_element eq "value") {
+	return if (!defined $self->{'lom_source'});
+    }
+
+    my $pretty_print_text = "";
+
+    if (($innermost_element eq "value") || ($innermost_element eq "source")) {
+	my $source = $self->{'lom_source'};
+	my $value  = $self->pretty_print_text($self->{'lom_value'});
+
+	$self->{'lom_source'} = undef;
+	$self->{'lom_value'} = undef;
+
+	pop @pretty_print_stack;
+	
+	$pretty_print_text = "<td $style>$source</td><td $style>$value</td>";
+    }
+    else {
+	$pretty_print_text = $self->pretty_print_text($_);
+	$pretty_print_text = "<td $style colspan=2>$pretty_print_text</td>";
+    }
+    my $pretty_print_fmn = join(' : ',map { "\u$_"; } @pretty_print_stack);
+
+
+    # my $tr_attr = "id=\"$outermost_element\" style=\"display:block;\"";
+    my $tr_attr = "$style id=\"$outermost_element\"";
+
+    my $mdtext_line = "  <tr $tr_attr><td $style><nobr>$pretty_print_fmn</nobr></td>$pretty_print_text</tr>\n";
+    $self->{'mdtbody_text'} .= $mdtext_line;
+}
+
+
+sub check_for_language
+{
+    my $self = shift(@_);
+    my ($innermost_element,$md_content) = @_;
+
+    # Look for 'language' tag
+    if ($innermost_element eq "language") {
+	my $lom_lang = $self->{'lom_language'};
+	
+	if (defined $lom_lang) {
+	    my $new_lom_lang = $md_content;
+	    $new_lom_lang =~ s/-.*//; # remove endings like -US or -GB
+
+	    if ($lom_lang ne $new_lom_lang) {
+		my $outhandle = $self->{'outhandle'};
+		
+		print $outhandle "Warning: Conflicting general language in record\n";
+		print $outhandle "         $new_lom_lang (previous value for language = $lom_lang)\n";
+	    }
+	    # otherwise, existing value OK => do nothing
+	}
+	else {
+	    $lom_lang = $md_content;
+	    $lom_lang =~ s/-.*//; # remove endings like -US or -GB
+	    
+	    $self->{'lom_language'} = $lom_lang;
+	}
+    }
+}
+
+sub found_specific_identifier
+{
+    my $self = shift(@_);
+    my ($specific_id,$full_mname,$md_content) = @_;
+
+    my $found_id = 0;
+    if ($full_mname eq $specific_id) {
+	if ($md_content =~ m/^(http|ftp):/) {
+	    $found_id = 1;
+	}
+    }
+
+    return $found_id;
+}
+
+sub download_srcdoc
+{
+    my $self = shift(@_);
+    my ($doc_url) = @_;
+
+    my $outhandle  = $self->{'outhandle'};
+    my $output_dir = $self->{'output_dir'};
+
+    $output_dir = &util::filename_cat($output_dir,"_gsdldown.all");
+
+    if (! -d $output_dir) {
+	mkdir $output_dir;
+    }
+
+    my $re_dirsep = &util::get_re_dirsep();
+    my $os_dirsep = &util::get_dirsep();
+
+    my $file_url = $doc_url;
+    $file_url =~ s/$re_dirsep/$os_dirsep/g;
+    $file_url =~ s/^(http|ftp):\/\///;
+    $file_url .= "index.html" if ($file_url =~ m/\/$/);
+
+    my $full_file_url = &util::filename_cat($output_dir,$file_url);
+    # the path to srcdoc will be used later in extrametadata to associate
+    # the lom metadata with the document. Needs to be relative to current
+    # directory.
+    my $srcdoc_path = &util::filename_cat("_gsdldown.all", $file_url);
+    my $check_timestamp = $self->{'check_timestamp'};
+    my $status;
+
+    if (($check_timestamp) || (!$check_timestamp && !-e $full_file_url)) {
+	if (!-e $full_file_url) {
+	    print $outhandle "Mirroring $doc_url\n";
+	}
+	else {
+	    print $outhandle "Checking to see if update needed for $doc_url\n";
+	}
+
+	# on linux, if we pass an absolute path as -P arg to wget, then it 
+	# stuffs up the 
+	# URL rewriting in the file. Need a relative path or none, so now
+	# we change working directory first.
+	my $changed_dir = 0;
+	my $current_dir = cwd();
+	my $wget_cmd = "";
+	if ($ENV{'GSDLOS'} ne "windows") {
+	    $changed_dir = 1;
+	    
+	    chdir "$output_dir";
+	    $wget_cmd = "wget -nv  --timestamping -k -p \"$doc_url\"";
+	} else {
+	    $wget_cmd = "wget -nv -P \"$output_dir\" --timestamping -k -p \"$doc_url\""; 
+	}
+	##print STDERR "**** wget = $wget_cmd\n";
+
+	
+	$status = system($wget_cmd);
+	if ($changed_dir) {
+	    chdir $current_dir;
+	}
+	if ($status==0) {
+	    $self->{'lom_srcdoc'} = $srcdoc_path; 	
+	}
+	else {
+	    $self->{'lom_srcdoc'} = undef;
+	    print $outhandle "Error: failed to execute $wget_cmd\n";
+	}
+    }
+    else {
+	# not time-stamping and file already exists
+	$status=0;
+	$self->{'lom_srcdoc'} = $srcdoc_path; 	
+    }
+
+    return $status==0;
+    
+}
+
+
+sub check_for_identifier
+{
+    my $self = shift(@_);
+    my ($full_mname,$md_content) = @_;
+
+    my $success = 0;
+
+    my $download_re = $self->{'download_srcdocs'};
+    if (($download_re ne "") && $md_content =~ m/$download_re/) {
+	
+	if ($self->found_specific_identifier("general^identifier^entry",$full_mname,$md_content)) {
+	    $success = $self->download_srcdoc($md_content);
+	}
+
+	if (!$success) {
+	    if ($self->found_specific_identifier("technical^location",$full_mname,$md_content)) {
+		$success = $self->download_srcdoc($md_content);
+	    }
+	}
+    }
+
+    return $success;
+}
+
+
+sub Text {
+    if ($_ !~ m/^\s*$/) {
+	#
+	# Work out indentations and line wraps for raw XML
+	#
+	my $xml_depth = scalar(@{$self->{'metaname_stack'}})+1;
+	my $indent = "&nbsp;&nbsp;" x $xml_depth; 
+	
+	my $formatted_text = "\n".$_;
+
+	# break into lines < 80 chars on space
+	$formatted_text =~ s/(.{50,80})\s+/$1\n/mg; 
+	$formatted_text =~ s/^/$indent/mg;
+	## $formatted_text =~ s/\s+$//s;
+
+	$self->{'raw_text'} .= $formatted_text;
+    }
+
+    my $metaname_stack = $self->{'metaname_stack'};
+    if (($_ !~ /^\s*$/) && (scalar(@$metaname_stack)>0)) {
+
+	my ($without_dt_stack,$innermost_element,$md_content)
+	    = $self->process_datatype_info($metaname_stack,$_);
+
+	$self->pretty_print_table_tr($without_dt_stack);
+
+	my $full_mname = join('^',@{$without_dt_stack});
+	$self->set_filere_metadata(lc($full_mname),$md_content);
+
+	$self->check_for_language($innermost_element,$md_content);
+	$self->check_for_identifier($full_mname,$md_content); # source doc
+
+	$self->reset_datatype_info();
+    }
+}
+
+# This Char function overrides the one in XML::Parser::Stream to overcome a
+# problem where $expat->{Text} is treated as the return value, slowing
+# things down significantly in some cases.
+sub Char {
+  $_[0]->{'Text'} .= $_[1];
+  return undef;
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/LaTeXPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/LaTeXPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/LaTeXPlugin.pm	(revision 24799)
@@ -0,0 +1,755 @@
+###########################################################################
+#
+# LaTeXPlugin.pm
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Written by John McPherson
+# Copyright (C) 2004 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+###########################################################################
+
+# todo:
+#  \includegraphics
+#  parse/remove tex \if ... macros
+
+package LaTeXPlugin;
+
+# System complains about $arguments if the strict is set
+use strict;
+no strict 'refs'; # so we can print to a handle named by a variable
+
+# greenstone packages
+use ReadTextFile;
+use MetadataRead;
+use unicode;
+use util;
+
+my $arguments =
+    [ { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'reqd' => "no",
+	'deft' => &get_default_process_exp() } ];
+
+my $options = { 'name'     => "LaTeXPlugin",
+		'desc'     => "{LaTeXPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+sub BEGIN {
+    @LaTeXPlugin::ISA = ('MetadataRead', 'ReadTextFile');
+}
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new ReadTextFile($pluginlist, $inputargs, $hashArgOptLists);
+
+    $self->{'aux_files'} = {};
+    $self->{'dir_num'} = 0;
+    $self->{'file_num'} = 0;
+    return bless $self, $class;
+}
+
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+    return q^\.tex$^;
+}
+
+sub get_default_block_exp {
+    # assume any .eps files are part of the latex stuff
+    return '\.(?:eps)$';
+}
+
+
+sub process {
+    my $self = shift (@_);
+    my ($textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+
+    my $start=substr($$textref, 0, 200); # first 200 bytes
+
+    if ($start !~ m~\\ (?:documentclass | documentstyle | input | section 
+			| chapter | contents | begin) ~x) {
+	# this doesn't look like latex...
+	return undef;
+    }
+    my $outhandle = $self->{'outhandle'};
+
+    my $cursection = $doc_obj->get_top_section();
+
+    ###### clean up text ######
+    $$textref =~ s/\r$//mg;  # remove dos ^M
+    $$textref =~ s/%.*$//mg; # remove comments
+
+    # convert to utf-8 if not already - assume non ascii => iso-8859-1/latin
+
+    $$textref =~ s@(?<=[[:ascii:]])\xA0+@\xc2\xa0@g; # latin nonbreaking space
+    # check that both sides are ascii, so we don't screw up utf-8 chars
+    $$textref =~ s@ (?<=[[:ascii:]])([\x80-\xff])(?=[[:ascii:]]) @
+	unicode::ascii2utf8($1) @egx; # takes "extended ascii" (ie latin)
+
+
+    ###### find metadata ######
+
+    ## FileFormat metadata ##
+    $doc_obj->add_metadata($cursection, "FileFormat", "LaTeX");
+
+    ### title metadata ###
+    $$textref =~ m@\\title\s*{(.*?)}@s;
+    my $title = $1;
+    if (!$title) {
+	# no title tag. look for a chapter/section heading
+	$$textref =~ m@\\(?:chapter|section)\s*{(.*?)}@s; # will get 1st match
+	$title = $1;
+    }
+    if (!$title) {
+	# no chapter/section heading tags either... use filename
+	$title = $file;
+	$title =~ s/\.tex$//i;
+	$title =~ s/[-_.]/ /g; # turn punctuation into spaces
+    }
+    if ($title) {
+	$title =~ s@\\\\@ @g; # embedded newlines
+	$title = $self->process_latex($title); # no "-html" for title eg in browser
+	$doc_obj->add_utf8_metadata($cursection, "Title", $title);
+    }
+
+    ### creator/individual author metadata ###
+    $$textref =~ m@\\author\s*{((?:{.*?}|.*?)+)}\s*$@sm;
+    my $authors=$1;
+    if ($authors) {
+	# take care of "et al."...
+	$authors =~ s/(\s+et\.?\s+al\.?)\s*$//;
+	my $etal=$1;
+	$etal="" if (!defined ($etal));
+
+	my @authorlist=parse_authors($self, $authors);
+
+	foreach my $author (@authorlist) {
+	    # Add each name to set of Authors
+	    $doc_obj->add_utf8_metadata ($cursection, "Author", $author);
+	}
+
+	# Only want at most one "and" in the Creator field
+	my $creator_str="";
+	if (scalar(@authorlist) > 2) {
+	    my $lastauthor=pop @authorlist;
+	    $creator_str=join(', ', @authorlist);
+	    $creator_str.=" and $lastauthor";
+	} else { # 1 or 2 authors...
+	    $creator_str=join(" and ",@authorlist);
+	}
+	$creator_str.=$etal; # if there was "et al."
+    	$doc_obj->add_utf8_metadata($cursection, "Creator", $creator_str);
+    }
+    ### end of author metadata ###
+
+    ###### process latex for the main text ######
+    $$textref =~ s/^.*?\\begin{document}//s;
+    $$textref =~ s/\\end{document}.*?$//s;
+    $$textref = $self->process_latex("-html",$$textref);
+    $doc_obj->add_utf8_text($cursection, $$textref);
+
+    return 1;
+}
+
+
+# returns a list of author names
+sub parse_authors {
+    my $self=shift;
+    my $authors=shift;
+
+    my $outhandle=$self->{'outhandle'};
+
+    $authors =~ s/\n/ /g; # remove newlines
+	
+    # some people do this for affiliation footnote/dagger
+    $authors =~ s@\$.*?\$@@g; # remove maths from author :(
+
+    # und here for german language...
+    # don't use brackets in pattern, else the matched bit becomes
+    # an element in the list!
+    my @authorlist = split(/\s+and\s+|\s+und\s+/, $authors);
+    my @formattedlist = ();
+    foreach my $author (@authorlist) {
+	$author =~ s/\s*$//; 
+	$author =~ s/^\s*//; 
+	# Reformat and add author name
+	next if $author=~ /^\s*$/;
+
+	# names are "First von Last", "von Last, First"
+	# or "von Last, Jr, First". See the "BibTeXing" manual, page 16
+	my $first="";
+	my $vonlast="";
+	my $jr="";
+	    
+	if ($author =~ /,/) {
+	    my @parts=split(/,\s*/, $author);
+	    $first = pop @parts;
+	    if (scalar(@parts) == 2) {
+		$jr = pop @parts;
+	    }
+	    $vonlast=shift @parts;
+	    if (scalar(@parts) > 0) {
+		print $outhandle $self->{'plugin_type'} .
+		    ": couldn't parse name $author\n";
+		# but we continue anyway...
+	    }
+	} else { # First von Last
+	    my @words = split(/ /, $author);
+	    while (scalar(@words) > 1 && $words[0] !~ /^[a-z]{2..}/) {
+		$first .= " " . shift (@words);
+	    }
+	    $first =~ s/^\s//;
+	    $vonlast = join (' ', @words); # whatever's left...
+	}
+	my $von="";
+	my $last="";
+	if ($vonlast =~ m/^[a-z]/) { # lowercase implies "von"
+	    $vonlast =~ s/^(([a-z]\w+\s+)+)//;
+	    $von = $1;
+	    if (!defined ($von)) {
+		# some non-English names do start with lowercase
+		# eg "Marie desJardins". Also we can get typos...
+		print $outhandle "BibTexPlug: couldn't parse surname $vonlast\n";
+		$von="";
+		if ($vonlast =~ /^[a-z]+$/) {
+		    # if it's all lowercase, uppercase 1st.
+		    $vonlast =~ s/^(.)/\u$1/;
+		}
+	    }
+	    $von =~ s/\s*$//;
+	    $last=$vonlast;
+	} else {
+	    $last=$vonlast;
+	}
+	my $wholename="$first $von $last $jr";
+	$wholename =~ s/ $//; $wholename =~ s/\s+/ /g;
+#	my $fullname = "$last";
+#	$fullname .= " $jr" if ($jr);
+#	$fullname .= ", $first";
+#	$fullname .= " $von" if ($von);
+	push (@formattedlist, $wholename);
+    }
+    return @formattedlist;
+}
+
+
+## following functions based on bibtex plugin ##
+# not actually used at the moment, but might be useful in future?
+sub expand_month {
+    my $text=shift;
+
+    # bibtex style files expand abbreviations for months.
+    # Entries can contain more than one month (eg ' month = jun # "-" # aug, ')
+    $text =~ s/jan/_textmonth01_/g;
+    $text =~ s/feb/_textmonth02_/g;
+    $text =~ s/mar/_textmonth03_/g;
+    $text =~ s/apr/_textmonth04_/g;
+    $text =~ s/may/_textmonth05_/g;
+    $text =~ s/jun/_textmonth06_/g;
+    $text =~ s/jul/_textmonth07_/g;
+    $text =~ s/aug/_textmonth08_/g;
+    $text =~ s/sep/_textmonth09_/g;
+    $text =~ s/oct/_textmonth10_/g;
+    $text =~ s/nov/_textmonth11_/g;
+    $text =~ s/dec/_textmonth12_/g;
+
+    return $text;
+}
+
+
+# If you want basic html formatting (eg \emph -> <em>, \bf, etc), give "-html"
+# as the first argument to this function.
+#
+# Convert accented characters, remove { }, interprete some commands....
+# Note!! This is not comprehensive! Also assumes Latin -> Unicode!
+
+# Also, it sucks quite a bit for complicated/nested commands since it doesn't
+# match { with the corresponding }, only the nearest }
+
+sub process_latex {
+    my $self=shift;
+    my $text=shift;
+
+    my $outhandle=$self->{'outhandle'};
+
+    my $html_markup=0;
+    if ($text =~ /^\-html/) {
+	$html_markup=1;
+	$text=shift;
+    }
+
+    if (! $text) {
+	return $text;
+    }
+    # escape html-sensitive characters
+    $text =~ s@&@&amp;@g;
+    $text =~ s@<@&lt;@g;
+    $text =~ s@>@&gt;@g;
+ 
+    # do this before accents, since \= means something different in tabbing
+    # also \> is a tab stop too, and \\ is newline
+    sub do_tabbing {
+	my $tabbing=shift;
+	$tabbing =~ s!^.*\\kill\s*$!!mg; # \kill sets tab stops, kills line
+	$tabbing =~ s~\\(?:=|&gt;)~\xc2\xa0~g; # replace with nbsp
+	$tabbing =~ s~[\\][\\](?:\[.*?\])?\s*$~<br/>~mg;
+	return "<br/>" . $tabbing . "<br/>\n";
+    }
+    $text =~ s@\\begin{tabbing}(.*?)\\end{tabbing}@do_tabbing($1)@ges;
+    sub do_tabular {
+	my $tabular=shift;
+	$tabular =~ s~(?<!\\)\s*&amp;\s*~</td><td>~g;
+	$tabular =~ s~[\\][\\]\s*~</td></tr>\n <tr><td>~g;
+	$tabular =~ s~\\hline~~g; # for now...
+	$tabular =~ s~<td>\s*\\multicolumn{(\d+)}{.*?}~<td colspan="$1">~g;
+	return "<table border=\"1\">\n <tr><td>"
+	    . $tabular . "</td></tr></table>\n";
+    }
+    $text =~ s@\\begin{tabular}(?:\[.*?\])?{.*?}(.*?)\\end{tabular} @
+    		do_tabular($1)  @xges;
+
+    $text =~ s@[\\][\\]\s*\n@ @g; # fold lines ending with \\
+
+    # process maths mode before accents... things like \, mean different!
+    # maths mode
+    $text =~ s@\$\$(.*?)\$\$ 
+	@ process_latex_math($html_markup,$1)
+	@xsge; # multi-line maths: $$ .... $$
+
+    $text =~ s@([^\\])\$(.*?[^\\])\$
+	@$1.process_latex_math($html_markup,$2)@xsge;
+
+
+    # is this an amstext environment, or just custom for that input file?
+    $text =~ s@\\begin{(algorithm)}(.*?)\\end{\1}@remove_equals($2)@ges;
+
+    # convert latex-style accented characters.
+    $self->latex_accents_to_utf8(\$text);
+
+    # replace quotes with utf-8
+
+    $text =~ s/``/\xe2\xc0\x9c/g; # Latex-specific, left-dbl quote (&ldquo;)
+    $text =~ s/''/\xe2\xc0\x9d/g; # Latex-specific, right-dbl quote (&rdquo;)
+    $text =~ s/`/\xe2\xc0\x98/g; # single left quote
+    $text =~ s/'/\xe2\xc0\x99/g; # single right quote
+
+    ###### remove/replace latex commands ######
+    ### commands that expand to something that gets displayed ###
+    $text =~ s~\\ldots~&hellip;~g;
+    $text =~ s~\\hrule~<hr/>\n~g;
+    $text =~ s~\\maketitle~ ~;
+    ### space commands ###
+    $text =~ s~\\[vh]skip\s+\S+~~g;
+    $text =~ s~\\vspace\*?{.*?}~<div>&nbsp;</div>~g; # vertical space
+    $text =~ s~\\\w+skip~ ~g; # \smallskip \medskip \bigskip \baselineskip etc
+    $text =~ s~\\noindent\b~~g;
+    # newpage, etc
+    $text =~ s~\\(?:clearemptydoublepage|newpage)~~g;
+    ### counters, contents, environments, labels, etc ###
+    $text =~ s~\\(?:addcontentsline){.*?}{.*?}{.*}~~g;
+    $text =~ s~\s*\\begin{itemize}\s*~\n<ul>\n~g;
+    $text =~ s~\s*\\end{itemize}\s*~</li></ul>\n~g;
+    $text =~ s~\s*\\begin{enumerate}\s*~<ol>\n~g;
+    $text =~ s~\s*\\end{enumerate}\s*~</li></ol>\n~g;
+    if ($text =~ s~\s*\\item~</li>\n<li>~g) {
+	# (count for first list item)
+	$text =~ s~<([ou])l>\s*</li>\s*~<$1l>~g;
+    }
+    $text =~ s~\\(?:label|begin|end){.*?}\s*\n?~ ~g; # remove tag and contents
+    $text =~ s~\\(?:tableofcontents|listoffigures)~ ~g;
+    ### font sizes/styles ###
+    $text =~ s~\\(?:tiny|small|footnotesize|normalsize|large|Large|huge|Huge)\b~~g;
+
+    if ($html_markup) {
+	$text =~ s~\\section\*?{([^\}]+)}\s*\n?~<H1>$1</H1>\n~g;
+	$text =~ s~\\subsection\*?{(.*?)}\s*\n?~<H2>$1</H2>\n~g;
+	$text =~ s~{\\tt\s*(.*?)}~<tt>$1</tt>~g;
+	$text =~ s~\\(?:texttt|tt|ttseries)\s*{(.*?)}~<tt>$1</tt>~g;
+	$text =~ s~\\emph{(.*?)}~<em>$1</em>~g;
+	$text =~ s~{\\(?:em|it)\s*(.*?)}~<em>$1</em>~g;
+	$text =~ s~{\\(?:bf|bfseries)\s*(.*?)}~<strong>$1</strong>~g;
+	$text =~ s~\\(?:textbf|bf|bfseries)\s*{(.*?)}~<strong>$1</strong>~g;
+    } else {
+	# remove tags for text-only
+	$text =~ s~\\(?:textbf|bf|bfseries|em|emph|tt|rm|texttt)\b~ ~g;
+    }
+    $text =~ s ~ {\\sc\s+(.*?)} ~
+		{<span style="font-variant:\ small-caps">$1</span>} ~gx;
+    # ignore these font tags (if there are any left)
+    # sf is sans-serif
+    $text =~ s~\\(?:mdseries|textmd|bfseries|textbf|sffamily|sf|sc)\b~ ~;
+    #### end font-related stuff ####
+
+    ### remove all other commands with optional arguments... ###
+    # don't remove commands without { }....
+    # $text =~ s~\\\w+(\[.*?\])?\s*~~g;
+    # $text =~ s~\\noopsort{[^}]+\}~~g;
+    # verbatim
+    $text =~ s~\\verb(.)(.*?)\1~verb_text($1)~ge;
+    # remove tags, keep contents for \tag[optional]{contents}
+    while ($text =~ s~\\\w+(\[.*?\])?{([^}]+)}~$2 ~g) {;} # all other commands
+    
+    # remove latex groupings { } (but not \{ or \} )
+    while ($text =~ s/([^\\])[\{\}]/$1/g) {;} # needed for "...}{..."
+    $text =~ s/^\{//; # remove { if first char
+
+    # latex characters
+    # spaces - nobr space (~), opt break (\-), append ("#" - bibtex only)
+    $text =~ s/([^\\])~+/$1 /g; # non-breaking space  "~"
+    # optional break "\-"
+    if ($text =~ m/[^&]\#/) { # concat macros (bibtex) but not HTML codes
+	# the non-macro bits have quotes around them - we just remove quotes
+	# XXX bibtex and latex differ here (for the '#' char)...
+	$text =~ s/([^&])[\"\#]/$1/g;
+    }
+    # dashes. Convert (m|n)-dash into single dash for html.
+    $text =~ s~\-\-+~\-~g;
+
+    # quoted { } chars
+    $text =~ s~\\{~{~g;
+    $text =~ s~\\}~}~g;
+
+    # spaces
+    $text =~ s~\\ ~ ~g;
+
+    # finally to protect against macro language...
+    # greenstone-specific
+    $text =~ s~\[~&\#91;~g;
+    $text =~ s~\]~&\#93;~g;
+    $text =~ s~(?<!\\)([\\_])~\\$1~g;
+
+    if ($html_markup) {
+	$text =~ s~\n{2,}~\n</p>\n<p>~g;
+	return "<p>$text</p>";
+    }
+
+    return $text;
+}
+
+# only used by process_latex for \verb....
+sub verb_text {
+    my $verbatim=shift;
+    $verbatim =~ s/([{}_])/\\$1/g;
+    return $verbatim;
+}
+# only used by process_latex_math
+# returns a unicode char if applicable, otherwise ascii
+sub math_fraction {
+    my $num=$1;
+    my $denom=$2;
+
+    if ($num==1 && $denom==2) {return chr(0xc2).chr(0xbd)}
+    if ($num==1 && $denom==4) {return chr(0xc2).chr(0xbc)}
+    if ($num==3 && $denom==4) {return chr(0xc2).chr(0xbe)}
+    return "$num/$denom";
+}
+
+sub process_latex_math {
+
+    my $text = pop; # if given one or two args, this is the last one...
+    my $html_markup=pop; # if given two args, this is the first one else undef
+
+    $text =~ s~\\,~ ~g; # forces a space?
+    $text =~ s~\\infty~infinity~g;             # or unicode 0x221E...
+
+# use this one when more things can read 3-byte utf8 values like this!
+#    $text =~ s~\\cup\b~\xe2\xc8\xaa~g; # union operator - unicode 0x222a
+    $text =~ s~\\cup\b~ U ~g;
+
+    $text =~ s~\\frac\s*{(.+?)}{(.+?)}~math_fraction($1,$2)~ge;
+
+    if ($html_markup) {
+	$text =~ s~\^{(.*?)}~<sup>$1</sup>~g;  # a^b superscript
+	$text =~ s~\^([^\{])~<sup>$1</sup>~g;
+	$text =~ s~\_{(.*?)}~<sub>$1</sub>~g;  # a_b subscript
+	$text =~ s~\_([^\{])~<sub>$1</sub>~g;
+	
+	$text =~ s~\\ldots~&hellip;~g;         # use html named entity for now
+
+	# put all other command names in italics for now
+	$text =~ s~\\([\w]+)~<i>$1</i> ~g;
+    }
+
+    # special cases, for some input files
+    if ($text =~ m~^\\\w+$~) {
+	$text="{" . $text . "}";
+    }
+
+    return $text;
+}
+
+
+
+sub latex_accents_to_utf8 {
+
+    # note - this is really ugly, but it works. There may be a prettier way
+    # of mapping latex accented chars to utf8, but we just brute force it here.
+    # Also, this isn't complete - not every single possible accented letter
+    # is in here yet, but most of the common ones are.
+
+    my %utf8_chars =
+	(
+	 # acutes
+	 '\'a' => chr(0xc3).chr(0xa1),
+	 '\'c' => chr(0xc4).chr(0x87),
+	 '\'e' => chr(0xc3).chr(0xa9),
+	 '\'i' => chr(0xc3).chr(0xad),
+	 '\'l' => chr(0xc3).chr(0xba),
+	 '\'n' => chr(0xc3).chr(0x84),
+	 '\'o' => chr(0xc3).chr(0xb3),
+	 '\'r' => chr(0xc5).chr(0x95),
+	 '\'s' => chr(0xc5).chr(0x9b),
+	 '\'u' => chr(0xc3).chr(0xba),
+	 '\'y' => chr(0xc3).chr(0xbd),
+	 '\'z' => chr(0xc5).chr(0xba),
+	 # graves
+	 '`a' => chr(0xc3).chr(0xa0),
+	 '`A' => chr(0xc3).chr(0x80),
+	 '`e' => chr(0xc3).chr(0xa8),
+	 '`E' => chr(0xc3).chr(0x88),
+	 '`i' => chr(0xc3).chr(0xac),
+	 '`I' => chr(0xc3).chr(0x8c),
+	 '`o' => chr(0xc3).chr(0xb2),
+	 '`O' => chr(0xc3).chr(0x92),
+	 '`u' => chr(0xc3).chr(0xb9),
+	 '`U' => chr(0xc3).chr(0x99),
+	 # circumflex
+	 '^a' => chr(0xc3).chr(0xa2),
+	 '^A' => chr(0xc3).chr(0x82),
+	 '^c' => chr(0xc4).chr(0x89),
+	 '^C' => chr(0xc4).chr(0x88),
+	 '^e' => chr(0xc3).chr(0xaa),
+	 '^E' => chr(0xc3).chr(0x8a),
+	 '^g' => chr(0xc4).chr(0x9d),
+	 '^G' => chr(0xc4).chr(0x9c),
+	 '^h' => chr(0xc4).chr(0xa5),
+	 '^H' => chr(0xc4).chr(0xa4),
+	 '^i' => chr(0xc3).chr(0xae),
+	 '^I' => chr(0xc3).chr(0x8e),
+	 '^j' => chr(0xc4).chr(0xb5),
+	 '^J' => chr(0xc4).chr(0xb4),
+	 '^o' => chr(0xc3).chr(0xb4),
+	 '^O' => chr(0xc3).chr(0x94),
+	 '^s' => chr(0xc5).chr(0x9d),
+	 '^S' => chr(0xc5).chr(0x9c),
+	 '^u' => chr(0xc3).chr(0xa2),
+	 '^U' => chr(0xc3).chr(0xbb),
+	 '^w' => chr(0xc5).chr(0xb5),
+	 '^W' => chr(0xc5).chr(0xb4),
+	 '^y' => chr(0xc5).chr(0xb7),
+	 '^Y' => chr(0xc5).chr(0xb6),
+	 
+	 # diaeresis
+	 '"a' => chr(0xc3).chr(0xa4),
+	 '"A' => chr(0xc3).chr(0x84),
+	 '"e' => chr(0xc3).chr(0xab),
+	 '"E' => chr(0xc3).chr(0x8b),
+	 '"i' => chr(0xc3).chr(0xaf),
+	 '"I' => chr(0xc3).chr(0x8f),
+	 '"\\\\i' => chr(0xc3).chr(0xaf),
+	 '"\\\\I' => chr(0xc3).chr(0x8f),
+	 '"o' => chr(0xc3).chr(0xb6),
+	 '"O' => chr(0xc3).chr(0x96),
+	 '"u' => chr(0xc3).chr(0xbc),
+	 '"U' => chr(0xc3).chr(0x9c),
+	 '"y' => chr(0xc3).chr(0xbf),
+	 '"Y' => chr(0xc3).chr(0xb8),
+	 # tilde
+	 '~A' => chr(0xc3).chr(0x83),
+	 '~N' => chr(0xc3).chr(0x91),
+	 '~O' => chr(0xc3).chr(0x95),
+	 '~a' => chr(0xc3).chr(0xa3),
+	 '~n' => chr(0xc3).chr(0xb1),
+	 '~o' => chr(0xc3).chr(0xb5),
+	 # caron - handled specially
+	 # double acute
+	 # ring
+	 # dot
+	 '.c' => chr(0xc4).chr(0x8b),
+	 '.C' => chr(0xc4).chr(0x8a),
+	 '.e' => chr(0xc4).chr(0x97),
+	 '.E' => chr(0xc4).chr(0x96),
+	 '.g' => chr(0xc4).chr(0xa1),
+	 '.G' => chr(0xc4).chr(0xa0),
+	 '.I' => chr(0xc4).chr(0xb0),
+	 '.z' => chr(0xc5).chr(0xbc),
+	 '.Z' => chr(0xc5).chr(0xbb),
+	 # macron
+	 '=a' => chr(0xc4).chr(0x81),
+	 '=A' => chr(0xc4).chr(0x80),
+	 '=e' => chr(0xc4).chr(0x93),
+	 '=E' => chr(0xc4).chr(0x92),
+	 '=i' => chr(0xc4).chr(0xab),
+	 '=I' => chr(0xc4).chr(0xaa),
+	 '=o' => chr(0xc4).chr(0x8d),
+	 '=O' => chr(0xc4).chr(0x8c),
+	 '=u' => chr(0xc4).chr(0xab),
+	 '=U' => chr(0xc4).chr(0xaa),
+	 
+	 # stroke - handled specially - see below
+	 
+	 # cedilla - handled specially
+	 );
+    
+# these are one letter latex commands - we make sure they're not a longer
+# command name. eg {\d} is d+stroke, so careful of \d
+    my %special_utf8_chars = 
+	(
+	 # breve
+	 'u g' => chr(0xc4).chr(0x9f),
+	 'u G' => chr(0xc4).chr(0x9e),
+	 'u i' => chr(0xc4).chr(0xad),
+	 'u I' => chr(0xc4).chr(0xac),
+	 'u o' => chr(0xc5).chr(0x8f),
+	 'u O' => chr(0xc5).chr(0x8e),
+	 'u u' => chr(0xc5).chr(0xad),
+	 'u U' => chr(0xc5).chr(0xac),
+	 'u z' => chr(0xc5).chr(0xbe), # !!! no such char, but common mistake
+	 'u Z' => chr(0xc5).chr(0xbd), # used instead of v Z !!!
+	 # caron
+	 'v c' => chr(0xc4).chr(0x8d),
+	 'v C' => chr(0xc4).chr(0x8c),
+	 'v n' => chr(0xc5).chr(0x88),
+	 'v N' => chr(0xc5).chr(0x87),
+	 'v s' => chr(0xc5).chr(0xa1),
+	 'v S' => chr(0xc5).chr(0xa5),
+	 'v z' => chr(0xc5).chr(0xbe),
+	 'v Z' => chr(0xc5).chr(0xbd),
+	 # cedilla
+	 'c c' => chr(0xc3).chr(0xa7),
+	 'c C' => chr(0xc3).chr(0x87),
+	 'c g' => chr(0xc4).chr(0xa3),
+	 'c G' => chr(0xc4).chr(0xa2),
+	 'c k' => chr(0xc4).chr(0xb7),
+	 'c K' => chr(0xc4).chr(0xb6),
+	 'c l' => chr(0xc4).chr(0xbc),
+	 'c L' => chr(0xc4).chr(0xbb),
+	 'c n' => chr(0xc5).chr(0x86),
+	 'c N' => chr(0xc5).chr(0x85),
+	 'c r' => chr(0xc5).chr(0x97),
+	 'c R' => chr(0xc5).chr(0x96),
+	 'c s' => chr(0xc5).chr(0x9f),
+	 'c S' => chr(0xc5).chr(0x9e),
+	 'c t' => chr(0xc5).chr(0xa3),
+	 'c T' => chr(0xc5).chr(0xa2),
+	 # double acute / Hungarian accent
+	 'H O' => chr(0xc5).chr(0x90),
+	 'H o' => chr(0xc5).chr(0x91),
+	 'H U' => chr(0xc5).chr(0xb0),
+	 'H u' => chr(0xc5).chr(0xb1),
+	 
+	 # stroke 
+	 'd' => chr(0xc4).chr(0x91),
+	 'D' => chr(0xc4).chr(0x90),
+	 'h' => chr(0xc4).chr(0xa7),
+#	 'H' => chr(0xc4).chr(0xa6), # !! this normally(!!?) means Hung. umlaut
+	 'i' => chr(0xc4).chr(0xb1), # dotless lowercase i
+	 'l' => chr(0xc5).chr(0x82),
+	 'L' => chr(0xc5).chr(0x81),
+	 'o' => chr(0xc3).chr(0xb8),
+	 'O' => chr(0xc3).chr(0x98),
+	 't' => chr(0xc5).chr(0xa7),
+	 'T' => chr(0xc5).chr(0xa6),
+
+         # other special chars
+         'ss' => chr(0xc3).chr(0x9f), # german ss/szlig/sharp s
+         'aa' =>,chr(0xc3).chr(0xa5), # scandanavian/latin a with ring
+	 );
+
+    my $self=shift;
+    my $textref=shift;
+
+    my $outhandle=$self->{'outhandle'};
+    my $text=$$textref;
+    
+    # remove space (if any) between \ and letter to accent (eg {\' a})
+    $text =~ s!(\\[`'="^~\.])\s(\w)\b!$1$2!g;   # for emacs indenting... `]);
+
+    # remove {} around a single character (eg \'{e})
+    $text =~ s!(\\[`'="^~\.]){(\w)}!{$1$2}!g;  # for emacs indenting... `]);
+
+    ## only in bibtex... not in latex proper?!
+    ### \, is another way of doing cedilla \c
+    ##$text =~ s~\\,(.)~\\c $1~g;
+
+    # remove {} around a single character for special 1 letter commands -
+    # need to insert a space. Eg \v{s}  ->  {\v s}
+    $text =~ s~(\\[uvcH]){(\w)}~{$1 $2}~g;
+
+    # only do if the text contains a '\' character. 
+    if ($text =~ m|\\|) {
+	# "normal" accents - ie non-alpha latex tag
+	# xxx used to have ([\w]\b)@ (for word boundary)
+	while ($text =~ m/\\([`'="^~\.])([\w])/) {      # for emacs `])){
+	    my $tex="$1$2"; my $char="$2";
+	    my $replacement=$utf8_chars{$tex};
+	    if (!defined($replacement)) {
+		$text =~ m~(.{20}\\\Q$tex\E.{20})~s;
+		print $outhandle . $self->{'plugin_type'} .
+		    ": Warning: unknown latex accent \"$tex\""
+		    . " in \"$1\"\n";
+		$replacement=$char;
+	    }
+	    $text =~ s/\\\Q$tex/$replacement/g;
+	}
+
+        # where the following letter matters (eg "sm\o rrebr\o d", \ss{})
+        # only do the change if immediately followed by a space, }, {, or \
+	# one letter accents ( + ss / aa)
+        while ($text =~ m~\\([DdhiLlOoTt]|ss|aa)[{}\s\"\\]~) {
+	    my $tex=$1;
+	    my $replacement=$special_utf8_chars{$tex};
+	    if (!defined($replacement)) {
+		$text =~ m~(.{20}\\\Q$tex\E.{20})~s;
+		print $outhandle $self->{'plugin_type'} .
+		    ": Warning: unknown latex accent \"$tex\""
+		    . " in \"$1\"\n";
+		$replacement=$tex;
+	    }
+	    ($text =~ s/{\\$tex}/$replacement/g) or
+		$text =~ s/\\$tex([{}\s\"\\])/$replacement$1/g;
+
+	}
+
+	# one letter latex accent commands that affect following letter
+        while ($text =~ m~\\([uvcH]) ([\w])~) {
+          my $tex="$1 $2"; my $char="$2";
+          my $replacement=$special_utf8_chars{$tex};
+          if (!defined($replacement)) {
+	      $text =~ m~(.{20}\\\Q$tex\E.{20})~s;
+	      print  $outhandle $self->{'plugin_type'} .
+		  ": Warning: unknown latex accent \"$tex\""
+		  . " in \"$1\"\n";
+	      $replacement=$char;
+	  }
+          $text =~ s/\\$tex/$replacement/g;
+        }
+    }
+    $textref=\$text;
+}
+
+
+# modules must return true
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/MARCPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/MARCPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/MARCPlugin.pm	(revision 24799)
@@ -0,0 +1,465 @@
+###########################################################################
+#
+# MARCPlugin.pm -- basic MARC plugin
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2002 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package MARCPlugin;
+
+use SplitTextFile;
+use MetadataRead;
+
+use unicode;
+use util;
+use marcmapping;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+# methods defined in superclasses that have the same signature take
+# precedence in the order given in the ISA list. We want MetaPlugins to
+# call MetadataRead's can_process_this_file_for_metadata(), rather than
+# calling BasePlugin's version of the same method, so list inherited 
+# superclasses in this order.
+sub BEGIN {
+    @MARCPlugin::ISA = ('MetadataRead', 'SplitTextFile'); 
+
+    # ensure Greenstone's CPAN is on the path (but check first) [jmt12]
+    my $inc_paths = join(':', @INC);
+    my $gsdl_perllib_path = $ENV{'GSDLHOME'} . '/perllib/cpan';
+    if ($inc_paths !~ /$gsdl_perllib_path/)
+    {
+      unshift (@INC, $gsdl_perllib_path);
+    }
+}
+
+my $arguments = 
+    [ { 'name' => "metadata_mapping",
+	'desc' => "{common.deprecated} {MARCPlugin.metadata_mapping}",
+	'type' => "string",
+	'deft' => "",
+	'hiddengli' => "yes", # deprecated in favour of 'metadata_mapping_file'
+	'reqd' => "no" },
+      { 'name' => "metadata_mapping_file",
+	'desc' => "{MARCXMLPlugin.metadata_mapping_file}",
+	'type' => "string",
+	'deft' => "marc2dc.txt",
+	'reqd' => "no" },
+      { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'reqd' => "no",
+	'deft' => &get_default_process_exp() },
+      { 'name' => "split_exp",
+	'desc' => "{SplitTextFile.split_exp}",
+	'type' => "regexp",
+	'reqd' => "no",
+	'deft' => &get_default_split_exp() } 
+      ];
+
+my $options = { 'name'     => "MARCPlugin",
+		'desc'     => "{MARCPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'explodes' => "yes",
+		'args'     => $arguments };
+
+require MARC::Record;  
+require MARC::Batch;  
+#use MARC::Record;  
+#use MARC::Batch;
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+ 
+	# this does nothing yet, but if member vars are ever added
+	# to MetadataRead, will need to do this anyway:
+	#new MetadataRead($pluginlist, $inputargs, $hashArgOptLists);
+    my $self = new SplitTextFile($pluginlist, $inputargs, $hashArgOptLists);
+
+    if ($self->{'info_only'}) {
+	# don't worry about the options
+	return bless $self, $class;
+    }
+    # 'metadata_mapping' was used in two ways in the plugin: as a plugin
+    # option (filename) and as a datastructure to represent the mapping.
+    # In MARXXMLPlug (written later) the two are separated: filename is
+    # represented through 'metadata_mapping_file' and the data-structure
+    # mapping left as 'metadata_mapping'
+    # 'metadata_mapping' still present (but hidden in GLI) for
+    # backwards compatibility, but 'metadata_mapping_file' is used by
+    # preference
+
+    if ($self->{'metadata_mapping'} ne "") {
+	print STDERR "MARCPlugin WARNING:: the metadata_mapping option is set but has been deprecated. Please use metadata_mapping_file option instead\n";
+	# If the old version is set, use it. 
+	$self->{'metadata_mapping_file'} = $self->{'metadata_mapping'};
+    }
+    $self->{'metadata_mapping'} = undef;
+    $self->{'type'} = "";
+    return bless $self, $class;
+}
+
+sub init {
+    my $self = shift (@_);
+    my ($verbosity, $outhandle, $failhandle) = @_;
+
+    ## the mapping file has already been loaded
+    if (defined $self->{'metadata_mapping'} ){ 
+	$self->SUPER::init(@_);
+	return;
+    }
+
+    # read in the metadata mapping files
+    my $mm_files = &util::locate_config_files($self->{'metadata_mapping_file'});
+    if (scalar(@$mm_files)==0)
+    {
+	my $msg = "MARCPlugin ERROR: Can't locate mapping file \"" .
+	    $self->{'metadata_mapping_file'} . "\".\n " .
+		"    No metadata will be extracted from MARC files.\n";
+
+	print $outhandle $msg;
+	print $failhandle $msg;
+	$self->{'metadata_mapping'} = undef;
+	# We pick up the error in process() if there is no $mm_file
+	# If we exit here, then pluginfo.pl will exit too!
+    }
+    else {
+	$self->{'metadata_mapping'} = &marcmapping::parse_marc_metadata_mapping($mm_files, $outhandle);
+    }
+
+    ##map { print STDERR $_."=>".$self->{'metadata_mapping'}->{$_}."\n"; } keys %{$self->{'metadata_mapping'}};
+
+    $self->SUPER::init(@_);
+}
+
+
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+    return q^(?i)(\.marc)$^;
+}
+
+
+sub get_default_split_exp {
+    # \r\n for msdos eol, \n for unix
+    return q^\r?\n\s*\r?\n|\[\w+\]Record type: USmarc^;
+}
+
+
+
+# The bulk of this function is based on read_line in multiread.pm
+# Unable to use read_line original because it expects to get its input
+# from a file.  Here the line to be converted is passed in as a string
+
+sub to_utf8
+{
+    my $self = shift (@_);
+    my ($encoding, $line) = @_;
+
+    if ($encoding eq "utf8") {
+	# nothing needs to be done
+	return $line;
+    }
+
+    if ($encoding eq "iso_8859_1") {
+	# we'll use ascii2utf8() for this as it's faster than going
+	# through convert2unicode()
+	return &unicode::ascii2utf8 (\$line);
+    }
+
+    # everything else uses unicode::convert2unicode
+    return &unicode::unicode2utf8 (&unicode::convert2unicode ($encoding, \$line));
+}
+
+
+sub read_file {
+    my $self = shift (@_);
+    my ($filename, $encoding, $language, $textref) = @_;
+
+    my $outhandle = $self->{'outhandle'};
+    
+    if (! defined($self->{'metadata_mapping'}))
+    {
+	# print a warning
+	print $outhandle "MARCPlugin: no metadata mapping file! Can't extract metadata from $filename\n";
+    }
+
+    $self->{'readfile_encoding'}->{$filename} = $encoding;
+
+       
+    if (!-r $filename)
+    {
+	print $outhandle "Read permission denied for $filename\n" if $self->{'verbosity'};
+	return;
+    }
+
+    ##handle ascii marc
+    #test whether this is ascii marc file 
+    if (open (FILE, $filename)) {
+	while (defined (my $line = <FILE>)) {
+	    $$textref .= $line;
+	   if ($line =~ /\[\w+\]Record type:/){
+	       undef $/;
+	       $$textref .= <FILE>;
+	       $/ = "\n";
+	       $self->{'type'} = "ascii";
+	       close FILE;
+	       return;
+	   }
+	}
+	close FILE;	
+    }
+
+      
+    $$textref = "";
+    my @marc_entries = ();
+ 
+    my $batch = new MARC::Batch( 'USMARC', $filename );
+    while ( my $marc = $batch->next ) 
+    {
+      	push(@marc_entries,$marc);
+	$$textref .= $marc->as_formatted();
+	$$textref .= "\n\n"; # for SplitTextFile - see default_split_exp above...
+    }
+
+    $self->{'marc_entries'}->{$filename} = \@marc_entries;
+}
+
+
+
+# do plugin specific processing of doc_obj
+# This gets done for each record found by SplitTextFile in marc files.
+sub process {
+    my $self = shift (@_);
+    my ($textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+
+    my $outhandle = $self->{'outhandle'};
+    my $filename = &util::filename_cat($base_dir, $file);
+
+    my $cursection = $doc_obj->get_top_section();
+
+    # Add fileFormat as the metadata
+    $doc_obj->add_metadata($cursection, "FileFormat", "MARC");
+    
+    my $marc_entries = $self->{'marc_entries'}->{$filename};
+    my $marc = shift(@$marc_entries);
+
+    my $encoding = $self->{'readfile_encoding'}->{$filename};
+
+    if (defined ($self->{'metadata_mapping'}) ) {
+	if ($self->{'type'} ne "ascii" ){   
+	    $self->extract_metadata ($marc, $metadata, $encoding, $doc_obj, $cursection);
+	}
+	else{
+	    $self->extract_ascii_metadata ($$textref,$metadata,$doc_obj, $cursection);
+	}
+    }
+
+    # add spaces after the sub-field markers, for word boundaries
+    $$textref =~ s/^(.{6} _\w)/$1 /gm;
+
+    # add text to document object
+    $$textref =~ s/</&lt;/g;
+    $$textref =~ s/>/&gt;/g;
+
+    $$textref = $self->to_utf8($encoding,$$textref);
+
+    print $outhandle "  Adding Marc Record:\n",substr($$textref,0,40), " ...\n"
+	if $self->{'verbosity'} > 2;
+
+    # line wrapping
+    $$textref = &wrap_text_in_columns($$textref, 64);
+    $$textref = "<pre>\n" . $$textref . "</pre>\n"; # HTML formatting...
+
+    $doc_obj->add_utf8_text($cursection, $$textref);
+
+    return 1;
+}
+
+sub wrap_text_in_columns
+{
+    my ($text, $columnwidth) = @_;
+    my $newtext = "";
+    my $linelength = 0;
+    
+    # Break the text into words, and display one at a time
+    my @words = split(/ /, $text);
+
+    foreach my $word (@words) {
+	# If printing this word would exceed the column end, start a new line
+	if (($linelength + length($word)) >= $columnwidth) {
+	    $newtext .= "\n";
+	    $linelength = 0;
+	}
+	
+	# Write the word
+	$newtext .= " $word";
+	if ($word =~ /\n/) {
+	    $linelength = 0;
+	} else {
+	    $linelength = $linelength + length(" $word");
+	}
+    }
+
+    $newtext .= "\n";
+    return $newtext;
+}
+
+
+sub extract_metadata
+{
+    my $self = shift (@_);
+ 
+    my ($marc, $metadata, $encoding, $doc_obj, $section) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    if (!defined $marc){
+	return;
+    }
+
+    my $metadata_mapping = $self->{'metadata_mapping'};;
+
+    foreach my $marc_field ( keys %$metadata_mapping )
+    {
+	my $gsdl_field = $metadata_mapping->{$marc_field};
+	
+	# have we got a subfield?
+	my $subfield = undef;
+	if ($marc_field =~ /(\d\d\d)(?:\$|\^)?(\w)/){
+	    $marc_field = $1;
+	    $subfield = $2;
+	}
+	if (defined $subfield) {
+	    my $meta_value = $marc->subfield($marc_field, $subfield);
+	    if (defined $meta_value) {
+		# Square brackets in metadata values need to be escaped so they don't confuse Greenstone/GLI
+		$meta_value =~ s/\[/&\#091;/g;
+		$meta_value =~ s/\]/&\#093;/g;
+		my $metavalue_str = $self->to_utf8($encoding, $meta_value);
+		$doc_obj->add_utf8_metadata ($section, $gsdl_field, $metavalue_str);
+	    }
+	}
+	else
+	{
+	    foreach my $meta_value_obj ($marc->field($marc_field))
+	    {
+		my $meta_value = $meta_value_obj->as_string();
+
+		# Square brackets in metadata values need to be escaped so they don't confuse Greenstone/GLI
+		$meta_value =~ s/\[/&\#091;/g;
+		$meta_value =~ s/\]/&\#093;/g;
+		my $metavalue_str = $self->to_utf8($encoding, $meta_value);
+		$doc_obj->add_utf8_metadata ($section, $gsdl_field, $metavalue_str);
+	    }
+	}
+    }
+}
+
+
+sub extract_ascii_metadata 
+{
+    my $self = shift (@_);
+
+    my ($text, $metadata,$doc_obj, $section) = @_;
+    my $outhandle = $self->{'outhandle'};
+    my $metadata_mapping = $self->{'metadata_mapping'};
+    ## get fields
+    my @fields = split(/[\n\r]+/,$text);
+    my $marc_mapping ={};
+
+    foreach my $field (@fields){
+	if ($field ne ""){
+	    $field =~ /^(\d\d\d)\s/;
+	    my $code = $1;
+	    $field = $'; #'
+	    ##get subfields
+	    my @subfields = split(/\$/,$field);
+	    my $i=0;
+	    $marc_mapping->{$code} = [];  
+	    foreach my $subfield (@subfields){
+		if ($i == 0){
+		    ##print STDERR $subfield."\n";
+		    push(@{$marc_mapping->{$code}},"info");
+		    push(@{$marc_mapping->{$code}},$subfield);
+		    	 
+		    $i++;
+		} 
+		 else{
+		     $subfield =~ /(\w)\s/;
+		     ##print STDERR "$1=>$'\n";
+		     push(@{$marc_mapping->{$code}},$1);
+                     push(@{$marc_mapping->{$code}},$'); #'
+		 }
+	    }
+	}
+    }
+
+
+     foreach my $marc_field ( keys %$metadata_mapping )
+    {
+		
+	my $matched_field = $marc_mapping->{$marc_field};
+ 	my $subfield = undef;
+
+	if (defined $matched_field){
+	    ## test whether this field has subfield
+	    if ($marc_field =~ /\d\d\d(\w)/){
+		$subfield = $1;
+	    }
+	    my $metaname = $metadata_mapping->{$marc_field};
+ 
+	    my $metavalue;
+	    if (defined $subfield){
+		my %mapped_subfield = {@$matched_field};
+		$metavalue = $mapped_subfield{$subfield};
+	    }
+	    else{ ## get all values except info
+		my $i =0;
+		foreach my $value (@$matched_field){
+		    if ($i%2 != 0 and $i != 1){
+			$metavalue .= $value." ";
+		    }
+		    $i++;
+		}
+	    }
+	    
+	    ## escape [ and ]
+	    $metavalue =~ s/\[/\\\[/g;
+	    $metavalue =~ s/\]/\\\]/g;
+	    ##print STDERR  "$metaname=$metavalue\n";
+   	    $doc_obj->add_metadata ($section, $metaname, $metavalue) ;		 	
+	}
+       
+    }
+
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/MARCXMLPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/MARCXMLPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/MARCXMLPlugin.pm	(revision 24799)
@@ -0,0 +1,524 @@
+###########################################################################
+#
+# MARCXMLPlugin.pm
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2001 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# Processes MARCXML documents. Note that this plugin does no
+# syntax checking (though the XML::Parser module tests for
+# well-formedness).
+
+package MARCXMLPlugin;
+
+use ReadXMLFile;
+use ReadTextFile;
+use MetadataRead;
+use marcmapping;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+# methods with identical signatures take precedence in the order given in the ISA list.
+sub BEGIN {
+    @MARCXMLPlugin::ISA = ('MetadataRead', 'ReadXMLFile', 'ReadTextFile');
+}
+
+my $arguments = [{'name' => "metadata_mapping_file",
+		  'desc' => "{MARCXMLPlugin.metadata_mapping_file}",
+		  'type' => "string",
+		  'deft' => "marc2dc.txt",
+		  'reqd' => "no" },
+		 { 'name' => "process_exp",
+		   'desc' => "{BasePlugin.process_exp}",
+		   'type' => "regexp",
+		   'deft' => &get_default_process_exp(),
+		   'reqd' => "no" }];
+
+my $options = { 'name'     => "MARCXMLPlugin",
+		'desc'     => "{MARCXMLPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments 
+		};
+
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+    
+    # we want to be able to use the textcat methods from ReadTextFile
+    # to get the language and encoding
+    new ReadTextFile($pluginlist, $inputargs, $hashArgOptLists, 1);
+
+    my $self = new ReadXMLFile($pluginlist, $inputargs, $hashArgOptLists);
+        
+    # we want to strip namespaces, so have to create a new XML parser
+    my $parser = new XML::Parser('Style' => 'Stream',
+                                 'Pkg' => 'ReadXMLFile',
+                                 'PluginObj' => $self,
+				 'Namespaces' => 1, # strip out namespaces
+				 'Handlers' => {'Char' => \&ReadXMLFile::Char,
+						'XMLDecl' => \&ReadXMLFile::XMLDecl,
+						'Entity'  => \&ReadXMLFile::Entity,
+						'Doctype' => \&ReadXMLFile::Doctype,
+						'Default' => \&ReadXMLFile::Default
+                                 });
+
+    $self->{'parser'} = $parser;
+
+    $self->{'content'} = "";
+    $self->{'xmlcontent'} = "";
+    $self->{'record_count'} = 1;
+    $self->{'language'} = "";
+    $self->{'encoding'} = "";
+    $self->{'marc_mapping'} = {};
+    $self->{'current_code'} = "";
+    $self->{'current_tag'} = "";
+    $self->{'current_element'} = "";
+    $self->{'metadata_mapping'} = undef;
+    $self->{'num_processed'} = 0;
+    $self->{'indent'} = 0;
+
+    return bless $self, $class;
+}
+
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+    return q^(?i)\.xml$^;
+}
+
+sub get_doctype {
+    my $self = shift(@_);
+    
+    return "collection";
+}
+
+
+sub init {
+    my $self = shift (@_);
+    my ($verbosity, $outhandle, $failhandle) = @_;
+    
+    ## the mapping file has already been loaded
+    if (defined $self->{'metadata_mapping'} ){ 
+	$self->SUPER::init(@_);
+	return;
+    }
+
+    # read in the metadata mapping file
+    my $mm_file = &util::locate_config_file($self->{'metadata_mapping_file'}); 
+
+    if (! defined $mm_file)
+    {
+	my $msg = "MARCXMLPlugin ERROR: Can't locate mapping file \"" .
+	    $self->{'metadata_mapping_file'} . "\".\n " .
+		"    No metadata will be extracted from MARCXML files.\n";
+
+	print $outhandle $msg;
+	print $failhandle $msg;
+	$self->{'metadata_mapping'} = undef;
+	# We pick up the error in process() if there is no $mm_file
+	# If we exit here, then pluginfo.pl will exit too!
+    }
+    else {
+	$self->{'metadata_mapping'} = &marcmapping::parse_marc_metadata_mapping($mm_file, $outhandle);
+    }
+
+
+    ##map { print STDERR $_."=>".$self->{'metadata_mapping'}->{$_}."\n"; } keys %{$self->{'metadata_mapping'}};
+
+    $self->SUPER::init(@_);
+}
+
+# Called for DOCTYPE declarations - use die to bail out if this doctype
+# is not meant for this plugin
+sub xml_doctype {
+    my $self = shift(@_);
+
+    my ($expat, $name, $sysid, $pubid, $internal) = @_;
+   return;
+
+}
+
+
+sub xml_start_document {
+    my $self = shift(@_);
+
+    my ($expat, $name, $sysid, $pubid, $internal) = @_;
+
+      
+    my $file = $self->{'file'};
+    my $filename = $self->{'filename'};
+       
+    my ($language, $encoding) = $self->textcat_get_language_encoding ($filename);
+
+    $self->{'language'} = $language;
+    $self->{'encoding'} = $encoding;
+    $self->{'element_count'} = 1;
+    $self->{'indent'} = 0;
+    my $outhandle = $self->{'outhandle'};
+    print $outhandle "MARCXMLPlugin: processing $self->{'file'}\n" if $self->{'verbosity'} > 1;
+    print STDERR "<Processing n='$self->{'file'}' p='MARCXMLPlugin'>\n" if $self->{'gli'};
+
+    # reset the base id
+    $self->{'base_oid'} = undef;
+ 
+}
+
+sub xml_end_document {
+
+}
+
+sub xml_start_tag {
+    my $self = shift;
+    my $expat = shift;
+    my $element = shift;  
+
+    my $text = $_;
+    my $escaped_text =  $self->escape_text($_); 
+  
+    $self->{'current_element'} = $element;
+
+    ##get all atributes of this element and store it in a map name=>value    
+    my %attr_map = (); 
+    my $attrstring = $_;
+    while ($attrstring =~ /(\w+)=\"(\w+)\"/){
+	$attr_map{$1}=$2;
+	$attrstring = $'; #'
+    }
+
+
+    my $processor = $self->{'processor'};
+	my $metadata  = $self->{'metadata'};
+
+    ##create a new document for each record 
+    if ($element eq "record") {
+        my $filename = $self->{'filename'};
+	my $language = $self->{'language'};
+        my $encoding = $self->{'encoding'};
+	my $file = $self->{'file'};
+	my $doc_obj = new doc($filename, undef, $self->{'file_rename_method'});
+	$doc_obj->add_utf8_metadata($doc_obj->get_top_section(), "Language", $language);
+	$doc_obj->add_utf8_metadata($doc_obj->get_top_section(), "Encoding", $encoding);
+
+	my ($filemeta) = $file =~ /([^\\\/]+)$/;
+	my $plugin_filename_encoding = $self->{'filename_encoding'};
+    my $filename_encoding = $self->deduce_filename_encoding($file,$metadata,$plugin_filename_encoding);
+	$self->set_Source_metadata($doc_obj, $filename, $filename_encoding);
+
+	$doc_obj->add_utf8_metadata($doc_obj->get_top_section(), "SourceSegment", "$self->{'record_count'}");
+        if ($self->{'cover_image'}) {
+	    $self->associate_cover_image($doc_obj, $filename);
+	}
+	$doc_obj->add_utf8_metadata($doc_obj->get_top_section(), "Plugin", "$self->{'plugin_type'}");
+	$doc_obj->add_metadata($doc_obj->get_top_section(), "FileFormat", "MARCXML");
+
+	my $outhandle = $self->{'outhandle'};
+	print $outhandle "Record $self->{'record_count'}\n" if $self->{'verbosity'} > 1; 
+
+        $self->{'record_count'}++;
+        $self->{'doc_obj'} = $doc_obj;       
+	$self->{'num_processed'}++;
+	if (!defined $self->{'base_oid'}) {
+	    $self->SUPER::add_OID($doc_obj);
+	    $self->{'base_oid'} = $doc_obj->get_OID();
+	}
+	
+
+    }
+    
+    ## get the marc code, for example 520
+     if ($element eq "datafield") {
+    	 if (defined $attr_map{'tag'} and $attr_map{'tag'} ne ""){
+	     $self->{'current_tag'} = $attr_map{tag};  
+	 }
+     }
+
+
+    ## append the subcode to the marc code for example 520a or 520b 
+    if ($element eq "subfield"){
+   	if (defined $attr_map{'code'} and $attr_map{'code'} ne "" and $self->{'current_tag'} ne ""){
+	    $self->{'current_code'} = $attr_map{'code'};
+	}
+    }
+
+   if ($element eq "record"){
+        $self->{'indent'} = 0;
+        $self->{'content'} = "";
+        $self->{'xmlcontent'} = "";
+    }
+    else {
+         if ($element ne "subfield"){
+              $self->{'indent'} = 1;
+         }
+         else{
+           $self->{'indent'} = 2;
+         }
+    }
+    
+
+    if ($element eq "collection") {
+	# remember the full start tag for <collection ...>
+	# This is needed to wrap around each <record> when generating its associate MARCXML file
+
+        $self->{'xmlcollectiontag'} = $text;
+    }
+    else {
+        $self->{'content'} .= "<br/>" if ($element ne "record");
+        $self->{'content'} .= $self->calculate_indent($self->{'indent'}).$escaped_text;
+        $self->{'xmlcontent'} .= $text;
+   }
+    
+}
+
+
+
+sub xml_end_tag {
+    my $self = shift(@_);
+    my ($expat, $element) = @_;
+
+    my $text = $_;
+    my $escaped_text =  $self->escape_text($_); 
+ 
+    if ($element eq "record" and defined $self->{'doc_obj'}) {
+	# process the document
+	my $processor = $self->{'processor'};
+	my $doc_obj = $self->{'doc_obj'};
+        $self->{'content'} .= "<br/>".$escaped_text;
+        $self->{'xmlcontent'} .= $text;
+      
+
+	my $top_section = $doc_obj->get_top_section();
+
+	my $tmp_marcxml_filename = &util::get_tmp_filename("xml");
+	if (open (XMLOUT,">$tmp_marcxml_filename")) {
+
+	    print XMLOUT "<?xml-stylesheet type=\"text/xsl\" href=\"MARC21slim2English.xsl\"?>\n";	    
+	    my $xml_content = $self->{'xmlcontent'};
+
+	    $xml_content = $self->{'xmlcollectiontag'}.$xml_content."</collection>";
+
+	    print XMLOUT $xml_content;
+
+	    close(XMLOUT);
+
+	    $doc_obj->associate_file($tmp_marcxml_filename,"marcxml.xml","text/xml", $top_section);
+	    
+	    # assicate xsl style file for presentation as HTML
+	    my $xsl_filename = &util::filename_cat($ENV{'GSDLHOME'},"etc","MARC21slim2English.xsl");
+	    $doc_obj->associate_file($xsl_filename,"MARC21slim2English.xsl","text/xml", $top_section);
+
+	}
+	else {
+	    my $outhandle = $self->{'outhandle'};
+	    print $outhandle "Warning: Unable for write out associated MARCXML file $tmp_marcxml_filename\n";
+	}
+	
+	# include any metadata passed in from previous plugins 
+	# note that this metadata is associated with the top level section
+	
+	$self->extra_metadata ($doc_obj, 
+			       $doc_obj->get_top_section(), 
+			       $self->{'metadata'});
+	
+
+	$self->add_OID($doc_obj, $self->{'base_oid'}, $self->{'record_count'});
+
+	$doc_obj->add_utf8_text($doc_obj->get_top_section(),$self->{'content'});
+        $processor->process($doc_obj);
+
+        ##clean up
+	$self->{'content'} = "";  
+	$self->{'xmlcontent'} = "";  
+	$self->{'doc_obj'} = undef;
+        return;
+    }
+
+    ## map the xmlmarc to gsdl metadata
+    if ($element eq "datafield" and defined $self->{'doc_obj'} and defined $self->{'marc_mapping'} and defined $self->{'metadata_mapping'}){
+	my $metadata_mapping = $self->{'metadata_mapping'};
+	my $marc_mapping = $self->{'marc_mapping'};
+	my $doc_obj = $self->{'doc_obj'};
+
+	##print STDERR "**** Marc Record\n";
+      ##map { print STDERR $_."=>".$marc_mapping->{$_}."\n"; } keys %$marc_mapping;
+	##print STDERR "**** Metadata Mapping\n";
+      ##map { print STDERR $_."=>".$metadata_mapping->{$_}."\n"; } keys %$metadata_mapping;
+
+
+	foreach my $marc_field (keys %$metadata_mapping){
+
+	    ## test whether this field has subfield
+	    my $subfield = undef;
+	    if ($marc_field =~ /(\d\d\d)(?:\$|\^)?(\w)/){
+		$marc_field = $1;
+		$subfield = $2;
+	    }
+
+	    my $matched_field = $marc_mapping->{$marc_field}; 
+
+	    if (defined $matched_field) {
+
+		my $meta_name  = undef;
+		my $meta_value = undef;
+
+		if (defined $subfield){
+		    $meta_name = $metadata_mapping->{$marc_field."\$".$subfield};
+
+		    $meta_value = $matched_field->{$subfield};
+		    
+		    if (!defined $meta_value) {
+			# record read in does not have the specified subfield
+			next;
+		    }
+		}
+		else {
+		    $meta_name = $metadata_mapping->{$marc_field};
+		    
+		    # no subfield => get all the values
+		    my $first = 1;
+		    foreach my $value (sort keys %{$matched_field}) {
+			if ($first) {
+			    $meta_value = $matched_field->{$value};
+			    $first = 0;
+			} else {
+			    $meta_value .= " " . $matched_field->{$value};
+			}
+		    }
+
+		}
+		
+		## escape [ and ]
+		$meta_value =~ s/\[/\\\[/g;
+		$meta_value =~ s/\]/\\\]/g;
+		##print STDERR  "$meta_name=$meta_value\n";
+		$doc_obj->add_utf8_metadata($doc_obj->get_top_section(),$meta_name, $meta_value);
+		
+	    }		    
+			
+	}
+
+	##clean up
+	$self->{'marc_mapping'} = undef;
+	$self->{'current_tag'} = "";
+    }
+  
+   if ($element eq "datafield"){
+       $self->{'indent'} = 1;
+       $self->{'content'} .= "<br/>".$self->calculate_indent($self->{'indent'}).$escaped_text;
+       $self->{'xmlcontent'} .= $text;
+   }
+    else{
+	$self->{'content'} .= $escaped_text;   
+	$self->{'xmlcontent'} .= $text;   
+    }
+     
+}
+
+sub add_OID {
+    my $self = shift (@_);
+    my ($doc_obj, $id, $record_number) = @_;
+
+    my $full_id = $id . "r" . $record_number;
+    if ($self->{'OIDtype'} eq "assigned") {
+	my $identifier = $doc_obj->get_metadata_element ($doc_obj->get_top_section(), $self->{'OIDmetadata'});
+	if (defined $identifier && $identifier ne "") {
+	    $full_id = $identifier;
+	    $full_id = &util::tidy_up_oid($full_id);
+	}
+    }
+    $doc_obj->set_OID($full_id);
+}
+
+sub xml_text {
+    my $self = shift(@_);
+    my ($expat) = @_;
+
+    my $text = $_;
+    my $escaped_text = $self->escape_text($_);
+
+    # protect against & in raw text file
+    $text =~ s/&/&amp;/g; # can't have & in raw form, even in 'raw' xml text
+
+    ## store the text of a marc code, for exapmle 520a=>A poem about....
+    if ($self->{'current_element'} eq "subfield" and $self->{'current_code'} ne "" and $_ ne "" ){
+	##stored it in the marc_mapping 
+
+	my $current_tag  = $self->{'current_tag'};
+	my $current_code = $self->{'current_code'};
+
+     	$self->{'marc_mapping'}->{$current_tag}->{$current_code} .= $_;
+
+	$self->{'current_code'} = "";
+    }
+    
+    $self->{'content'} .= $escaped_text;
+    $self->{'xmlcontent'} .= $text;
+   
+}
+
+sub calculate_indent{
+   my ($self,$num) = @_;
+
+   my $indent ="";
+  
+   for (my $i=0; $i<$num;$i++){
+       $indent .= "&nbsp;&nbsp;&nbsp;&nbsp;";
+    } 
+ 
+   return $indent;
+
+}
+
+sub escape_text {
+    my ($self,$text) = @_;
+    # special characters in the xml encoding
+    $text =~ s/&/&amp;/g; # this has to be first...
+    $text =~ s/</&lt;/g;
+    $text =~ s/>/&gt;/g;
+    $text =~ s/\"/&quot;/g;
+
+    return $text;
+}
+
+
+sub unescape_text {
+    my ($self,$text) = @_;
+    # special characters in the xml encoding
+    $text =~ s/&lt;/</g;
+    $text =~ s/&gt;/>/g;
+    $text =~ s/&quot;/\"/g;
+
+    $text =~ s/&/&amp;/g; # can't have & in raw form, even in unescaped xml!
+
+    return $text;
+}
+
+
+1;
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/MP3Plugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/MP3Plugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/MP3Plugin.pm	(revision 24799)
@@ -0,0 +1,369 @@
+###########################################################################
+#
+# MP3Plugin.pm -- Plugin for MP3 files (MPEG audio layer 3).
+#
+# A component of the Greenstone digital library software from the New
+# Zealand Digital Library Project at the University of Waikato, New
+# Zealand.
+#
+# Copyright (C) 2001 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+
+package MP3Plugin;
+
+use BasePlugin;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+no strict 'subs';
+
+use MP3::Info;
+
+require giget;
+
+sub BEGIN {
+    @MP3Plugin::ISA = ('BasePlugin');
+}
+
+my $arguments =
+    [ { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'deft' => &get_default_process_exp(),
+	'reqd' => "no" },
+      { 'name' => "assoc_images",
+        'desc' => "{MP3Plugin.assoc_images}",
+        'type' => "flag",
+        'deft' => "",
+        'reqd' => "no" },
+      { 'name' => "applet_metadata",
+	'desc' => "{MP3Plugin.applet_metadata}",
+	'type' => "flag",
+	'deft' => "" },
+      { 'name' => "metadata_fields",
+	'desc' => "{MP3Plugin.metadata_fields}",
+	'type' => "string",
+	'deft' => "Title,Artist,Genre" },
+      { 'name' => "file_rename_method",
+	'desc' => "{BasePlugin.file_rename_method}",
+	'type' => "enum",
+	'deft' => &get_default_file_rename_method(), # by default rename imported files and assoc files using this encoding
+	'list' => $BasePlugin::file_rename_method_list,
+	'reqd' => "no"
+      } ];
+
+my $options = { 'name'     => "MP3Plugin",
+		'desc'     => "{MP3Plugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new BasePlugin($pluginlist, $inputargs, $hashArgOptLists);
+
+    return bless $self, $class;
+}
+
+sub get_default_process_exp {
+    return q^(?i)\.mp3$^;
+}
+
+# rename imported files and assoc files using base64 encoding by default
+# so that the urls generated will always work with media files even when
+# opened in external applications (when wmv file names contain spaces in
+# them and they get url-encoded, wmv player fails to open the doubly url-
+# encoded url reference to the url-encoded filename). 
+sub get_default_file_rename_method() {
+    return "base64";
+}
+
+# we don't want to hash on the file
+sub get_oid_hash_type {
+    my $self = shift (@_);
+    return "hash_on_ga_xml";
+}
+
+sub process {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+
+    my ($filename_full_path, $filename_no_path) = &util::get_full_filenames($base_dir, $file);
+
+    # associate the file with the document
+    if ($self->associate_mp3_file($filename_full_path, $filename_no_path, $doc_obj) != 1)
+    {
+	print "MP3Plugin: couldn't process \"$filename_full_path\"\n";
+	return 0;
+    }
+   
+    my $text = &gsprintf::lookup_string("{BasePlugin.dummy_text}",1);
+    if ($self->{'assoc_images'}) {
+	$text .= "[img1]<br>";
+	$text .= "[img2]<br>";
+    }
+    $doc_obj->add_utf8_text($doc_obj->get_top_section(), $text);
+    $doc_obj->add_metadata ($doc_obj->get_top_section(), "NoText",    "1");
+
+}
+
+sub gen_mp3applet {
+
+    my ($mp3_filename) = @_;
+
+    my $applet_html = '
+<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
+        WIDTH = "59"
+        HEIGHT = "32"
+        codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0">
+<PARAM NAME = CODE VALUE = "javazoom.jlGui.TinyPlayer" >
+<PARAM NAME = ARCHIVE VALUE = "_httpcollection_/tinyplayer.jar,_httpcollection_/jl10.jar" >
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+<PARAM NAME = "skin" VALUE ="_httpcollection_/skins/Digitalized">
+<PARAM NAME = "autoplay" VALUE ="yes">
+<PARAM NAME = "bgcolor" VALUE ="638182">
+<PARAM NAME = "audioURL" VALUE ="MP3FILENAME">
+<COMMENT>
+<EMBED type="application/x-java-applet;version=1.3"
+       CODE = "javazoom.jlGui.TinyPlayer"
+       ARCHIVE = "_httpcollection_/tinyplayer.jar,_httpcollection_/jl10.jar"
+       WIDTH = "59"
+       HEIGHT = "32"
+       skin = "_httpcollection_/skins/Digitalized"
+       autoplay = "yes"
+       bgcolor = "638182"
+       audioURL = "MP3FILENAME"
+       scriptable=false
+       pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html">
+<NOEMBED>
+</COMMENT>
+</NOEMBED></EMBED>
+</OBJECT>
+';
+
+    $applet_html =~ s/MP3FILENAME/$mp3_filename/g;
+
+    return $applet_html;
+}
+
+
+
+# Associate the mp3 file with the new document
+
+sub associate_mp3_file {
+    my $self = shift (@_);
+    my $filename = shift (@_);   # filename with full path
+    my $file = shift (@_);       # filename without path
+    my $doc_obj = shift (@_);
+    
+    my $verbosity = $self->{'verbosity'};
+    my $outhandle = $self->{'outhandle'};
+
+    # check the filename is okay
+    return 0 if ($file eq "" || $filename eq "");
+
+    # Add the file metadata.
+    # $assoc_url will be the srcurl. Since it is URL encoded here, it will be
+    # able to cope with special characters--including spaces--in mp3 filenames.
+    # the assocfilename generated will be a URL encoded version of the utf8 filename
+    my $assoc_url = $doc_obj->get_sourcefile(); 
+    my $dst_file = $doc_obj->get_assocfile_from_sourcefile();
+
+    # Add the file as an associated file ...
+    my $section = $doc_obj->get_top_section();
+    my $mime_type = $self->{'mime_type'} || "audio/mp3";
+    my $assoc_field = $self->{'assoc_field'} || "mp3";
+    my $assoc_name = $file;
+    $assoc_name =~ s/\.mp3$//;
+
+    $doc_obj->associate_file($filename, $dst_file, $mime_type, $section);
+    $doc_obj->add_metadata ($section, $assoc_field, $assoc_name);
+    $doc_obj->add_metadata ($section, "srcurl", $assoc_url);
+
+    my $mp3_info = get_mp3info($filename);
+    my $mp3_tags = get_mp3tag($filename,0,2);
+
+    my $metadata_fields = $self->{'metadata_fields'};
+
+    if ($metadata_fields eq "*") {
+	# Locate all info and tag metadata
+
+	foreach my $ki ( keys %$mp3_info ) {
+	    my $mp3_metavalue = $mp3_info->{$ki};
+
+	    if ($mp3_metavalue !~ m/^\s*$/s) {
+		my $mp3_metaname = "ex.id3.".lc($ki);
+		$doc_obj->add_metadata ($section, $mp3_metaname, $mp3_metavalue);
+	    }
+	}
+
+	foreach my $kt ( keys %$mp3_tags ) {
+	    my $mp3_metavalue = $mp3_tags->{$kt};
+	    
+	    if ($mp3_metavalue !~ m/^\s*$/s) {
+		my $kt_len = length($kt);
+		my $kt_initial_cap = uc(substr($kt,0,1)).lc(substr($kt,1,$kt_len-1));
+		my $mp3_metaname = "ex.id3.".$kt_initial_cap;
+		
+		$doc_obj->add_metadata ($section, $mp3_metaname, $mp3_metavalue);
+	    }
+	}
+    }
+    else {
+
+	# Restrict metadata to that specifically given
+	foreach my $field (split /,/, $metadata_fields) {
+
+	    # check info
+	    if (defined $mp3_info->{$field}) {
+
+		my $mp3i_metavalue = $mp3_info->{$field};
+		
+		if ($mp3i_metavalue !~ m/^\s*$/s) {
+		    my $mp3i_metaname = "ex.id3.".lc($field);
+		    $doc_obj->add_metadata ($section, $mp3i_metaname, $mp3i_metavalue);
+		}
+	    }
+
+	    # check tags
+	    if (defined $mp3_tags->{uc($field)}) {
+
+		my $mp3t_metavalue = $mp3_tags->{uc($field)};
+		
+		if ($mp3t_metavalue !~ m/^\s*$/s) {
+		    my $mp3t_metaname = "ex.id3.".$field;
+		    
+		    $doc_obj->add_metadata ($section, $mp3t_metaname, $mp3t_metavalue);
+		}
+	    }
+	    
+	}
+    }
+
+    $doc_obj->add_metadata ($section, "FileFormat", "MP3");
+    
+    $doc_obj->add_metadata ($section, "srcicon", "_iconmp3_");
+    # srclink_file is now deprecated because of the "_" in the metadataname. Use srclinkFile
+    $doc_obj->add_metadata ($section, "srclink_file", $assoc_url);
+    $doc_obj->add_metadata ($section, "srclinkFile", $assoc_url);
+    my $applet_metadata = $self->{'applet_metadata'};
+    if (defined $applet_metadata && $applet_metadata ) {
+	my $applet_html 
+	    = gen_mp3applet("_httpprefix_/collect/[collection]/index/assoc/[assocfilepath]/[srcurl]");
+	$doc_obj->add_metadata ($section, "mp3applet", $applet_html);
+    }
+
+    my $assoc_images = $self->{'assoc_images'};
+    if (defined $assoc_images && $assoc_images) {
+	my @search_terms = ();
+
+	my $title  = $mp3_tags->{'TITLE'};
+	my $artist = $mp3_tags->{'ARTIST'};
+
+	if (defined $title && $title ne "") {
+
+	    push(@search_terms,$title);
+
+	    if (defined $artist && $artist ne "") {
+		push(@search_terms,$artist);
+	    }
+	}
+	else {
+	    push(@search_terms,$assoc_name);
+	}
+
+	push(@search_terms,"song");
+
+	my $output_dir = $filename;
+	$output_dir =~ s/\.\w+$//;
+
+	my ($imgref_urls) = giget(\@search_terms,$output_dir);
+
+	my $gi_base = gi_url_base();
+	my $gi_query_url = gi_query_url(\@search_terms);
+
+	$doc_obj->add_metadata ($section, "giquery", "<a href=\"$gi_base$gi_query_url\" target=giwindow>");
+	$doc_obj->add_metadata ($section, "/giquery", "</a>");
+
+	for (my $i=1; $i<=2; $i++) {
+	    my $img_filename = "$output_dir/img_$i.jpg";
+	    my $dst_file = "img_$i.jpg";
+
+	    if (-e $img_filename) {
+		$doc_obj->associate_file($img_filename, $dst_file, "image/jpeg", $section);
+
+		my $srcurl = "src=\"_httpprefix_/collect/[collection]/index/assoc/[assocfilepath]/$dst_file\"";
+
+		$doc_obj->add_metadata ($section, "img$i", 
+					"<img $srcurl>");
+		$doc_obj->add_metadata ($section, "smallimg$i", 
+					"<img $srcurl width=100>");
+
+		my $imgref_url = $imgref_urls->[$i-1];
+
+		$doc_obj->add_metadata ($section, "imgref$i", "<a href=\"$imgref_url\" target=giwindow>");
+		$doc_obj->add_metadata ($section, "/imgref$i", "</a>");
+	    }
+
+	}
+
+
+    }
+
+    return 1;
+}
+
+
+# we want to use ex.id3.Title if its there, otherwise we'll use BasePlugin method
+sub title_fallback
+{
+    my $self = shift (@_);
+    my ($doc_obj,$section,$file) = @_;
+
+    if (!defined $doc_obj->get_metadata_element ($section, "Title")) {
+	my $mp3_title = $doc_obj->get_metadata_element ($section, "ex.id3.Title");
+	if (defined $mp3_title) {
+	    $doc_obj->add_metadata ($section, "Title", $mp3_title);
+	}
+	else {
+	    $self->BasePlugin::title_fallback($doc_obj, $section, $file);
+	}
+    }
+}
+
+
+1;
+
+
+
+
+
+
+
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/MediaWikiPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/MediaWikiPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/MediaWikiPlugin.pm	(revision 24799)
@@ -0,0 +1,665 @@
+###########################################################################
+#
+# MediaWikiPlugin.pm -- html plugin with extra facilities for wiki page 
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+# This plugin is to process an HTML file from a MediaWiki website which downloaded by 
+# the MediaWikiDownload plug. This plugin will trim MediaWiki functional sections like 
+# login, discussion, history, etc. Only the navigation and search section could be preserved. 
+# Searchbox will be modified to search the Greenstone collection instead of the website.
+# It also can automatically add the table of contents on the website's Main_Page to the 
+# collection's Home page. 
+
+package MediaWikiPlugin;
+
+use HTMLPlugin;
+use unicode;
+
+use strict; # every perl program should have this!
+no strict 'refs'; # make an exception so we can use variables as filehandles
+
+
+sub BEGIN {
+    @MediaWikiPlugin::ISA = ('HTMLPlugin');        
+}
+
+my $arguments = 
+    [          
+     # show the table of contents on collection's home page
+     { 'name' => "show_toc",
+       'desc' => "{MediaWikiPlugin.show_toc}",
+       'type' => "flag",
+       'reqd' => "no"},
+     # set to delete the table of contents section on each MediaWiki page
+     { 'name' => "delete_toc",
+       'desc' => "{MediaWikiPlugin.delete_toc}",
+       'type' => "flag",
+       'reqd' => "no"},
+     # regexp to match the table of contents
+     { 'name' => "toc_exp",
+       'desc' => "{MediaWikiPlugin.toc_exp}",
+       'type' => "regexp",
+       'reqd' => "no",
+       'deft' => "<table([^>]*)id=(\\\"|')toc(\\\"|')(.|\\n)*?</table>\\n" },        
+     # set to delete the navigation section
+     { 'name' => "delete_nav",
+       'desc' => "{MediaWikiPlugin.delete_nav}",
+       'type' => "flag",
+       'reqd' => "no",
+       'deft' => ""}, 
+     # regexp to match the navigation section    
+     { 'name' => "nav_div_exp",
+       'desc' => "{MediaWikiPlugin.nav_div_exp}",
+       'type' => "regexp",
+       'reqd' => "no",
+       'deft' => "<div([^>]*)id=(\\\"|')p-navigation(\\\"|')(.|\\n)*?<\/div>" },
+     # set to delete the searchbox section
+     { 'name' => "delete_searchbox",
+       'desc' => "{MediaWikiPlugin.delete_searchbox}",
+       'type' => "flag",
+       'reqd' => "no",
+       'deft' => ""},
+     # regexp to match the searchbox section
+     { 'name' => "searchbox_div_exp",
+       'desc' => "{MediaWikiPlugin.searchbox_div_exp}",
+       'type' => "regexp",
+       'reqd' => "no",
+       'deft' => "<div([^>]*)id=(\\\"|')p-search(\\\"|')(.|\\n)*?<\/div>"},     
+     # regexp to match title suffix
+     # can't use the title_sub option in HTMLPlugin instead
+     # because title_sub always matches from the begining      
+     { 'name' => "remove_title_suffix_exp",
+       'desc' => "{MediaWikiPlugin.remove_title_suffix_exp}",
+       'type' => "regexp",
+       'reqd' => "no",
+       'deft' => ""}
+     ];
+
+my $options = { 'name'     => "MediaWikiPlugin",
+		'desc'     => "{MediaWikiPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+    
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+    
+    my $self = new HTMLPlugin($pluginlist, $inputargs, $hashArgOptLists);    
+    return bless $self, $class;
+}
+
+
+
+sub process {
+    my $self = shift (@_);
+    my ($textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    my @head_and_body = split(/<body/i,$$textref);
+    my $head = shift(@head_and_body);
+    my $body_text = join("<body", @head_and_body);      
+    
+    $head =~ m/<title>(.+)<\/title>/i;
+    my $doctitle = $1 if defined $1;    
+    
+    if (defined $self->{'metadata_fields'} && $self->{'metadata_fields'}=~ /\S/) {
+	my @doc_properties = split(/<xml>/i,$head);
+	my $doc_heading = shift(@doc_properties);
+	my $rest_doc_properties = join(" ", @doc_properties);
+	
+	my @extracted_metadata = split(/<\/xml>/i, $rest_doc_properties);
+	my $extracted_metadata = shift (@extracted_metadata);
+	$self->extract_metadata($extracted_metadata, $metadata, $doc_obj);
+    }
+    
+    # set the title here if we haven't found it yet
+    if (!defined $doc_obj->get_metadata_element ($doc_obj->get_top_section(), "Title")) {    
+	if (defined $doctitle && $doctitle =~ /\S/) {        	    
+            # remove suffix in title if required
+            my $remove_suffix_exp = $self->{'remove_title_suffix_exp'};
+	    if (defined $remove_suffix_exp && $remove_suffix_exp =~ /\S/){
+	       $doctitle =~ s/$remove_suffix_exp//i;
+	    }	    
+	    $doc_obj->add_utf8_metadata($doc_obj->get_top_section(), "Title", $doctitle);
+	} else {
+	    $self->title_fallback($doc_obj,$doc_obj->get_top_section(),$file);
+	}
+    }
+
+    # we are only interested in the column-contents div <div id="column-content">
+    # remove header section, it may contain header images or additional search boxes
+    my $header_exp = "<div([^>]*)id=(\"|')container(\"|')([^>]*)>(.|\\n)*<div([^>]*)id=(\"|')column-content";
+    if($body_text =~ /$header_exp/){
+	    $body_text =~ s/$header_exp/<div$1id='container'$4><div$6id='column-content/isg;
+	} else {				
+		$header_exp = "(.|\\n)*?<div([^>]*)?id=(\"|')column-content";
+                if($body_text =~ /$header_exp/){
+                  $body_text =~ s/$header_exp/<div$2id='column-content/i;                
+                }
+	}
+    
+    # remove timeline
+    $body_text =~ s/<div([^>]*)class=("|')smwtimeline("|')[\s\S]*?<\/div>//mg;
+    
+    # remove extra bits
+    my $extra_bits = "Retrieved from(.+)</a>\"";
+    $body_text =~ s/$extra_bits//isg;
+    
+    $body_text =~ s/(<p[^>]*><span[^>]*><o:p>&nbsp;<\/o:p><\/span><\/p>)//isg;
+    $body_text =~ s/(<p[^>]*><o:p>&nbsp;<\/o:p><\/p>)//isg;
+    $body_text =~ s/<!\[if !vml\]>/<![if vml]>/g; 
+    $body_text =~ s/(&nbsp;)+/&nbsp;/sg;
+    
+    # get rid of the [edit] buttons
+    $body_text =~ s/\[<a([^>]*)>edit<\/a>]//g;
+    # get rid of the last time edit information at the bottom
+    $body_text =~ s/<a href="([^>]*)edit([^>]*)"([^>]*?)>(\w+)<\/a> \d\d:\d\d,([\s|\w]*?)\(PST\)//g;    
+    # get rid of the (Redirected from ...)
+    $body_text =~ s/\(Redirected from <a ([^>]*)>(\w|\s)*?<\/a>\)//isg;  
+    
+    # escape texts macros
+    $body_text =~ s/_([^\s]*)_/_<span>$1<\/span>_/isg;
+    # may change the links, like Greenstone_Documentation_All.html, then change back
+    $body_text =~ s/<a([^>]*)_<span>([^>]*)<\/span>_/<a$1_$2_/isg;
+    
+    # define file delimiter for different platforms
+    my $file_delimiter;
+    if ($ENV{'GSDLOS'} =~ /^windows$/i) {
+       $file_delimiter = "\\";
+    } else {
+       $file_delimiter = "/";	        
+    }    
+    
+    # IMPORTANT: different delimiter for $base_dir and $file
+    # $base_dir use forward slash for both windows and linux
+    # print "\nbase_dir : $base_dir\n\n"; # windows: C:/Program Files/Greenstone2.73/collect/wiki/import    
+                                        # linux: /research/lh92/greenstone/greenstone2.73/collect/wiki/import
+    # $file use different delimiters : forward slash for linux; backward slash for windows
+    # print "\nfile : $file\n\n";         # windows: greenstone.sourceforge.net\wiki\index.php\Access_Processing_using_DBPlugin.html    
+                                        # linux: greenstone.sourceforge.net/wiki/index.php/Using_GreenstoneWiki.html
+    
+    # get the base url for the MediaWiki website
+    my $safe_delimiter = &safe_escape_regexp($file_delimiter);
+    my @url_dirs=split($safe_delimiter, $file);
+    my $url_base = $url_dirs[0];    
+        
+    # Re-check css files associated with MediaWiki pages
+    if(defined $base_dir && $base_dir ne ""){ 	
+	my @css_files;
+	my $css_file_count = 0;
+	
+	# find all the stylesheets imported with @import statement	
+	while($head =~ m"<style type=\"text/css\"(.+)import \"(.+)\""ig){
+	    $css_files[$css_file_count++] = $2 if defined $2;
+	}
+	    
+	# download the stylesheets if we haven't downloaded them yet
+        # add prefix to each style elmement, comment out the body element
+        # and copy the files to collection's style folder 
+	for ($css_file_count = 0; $css_file_count < scalar(@css_files); $css_file_count++) {	    
+	    
+	    my $css_file = $css_files[$css_file_count];	      
+	    
+	    # remove prefix gli/cache directory	                
+            $css_file =~ s/^(.+)gli(\\|\/)cache(\\|\/)//i;
+                        
+            # change the \ delimiter in $css_file to / for consistency
+            $css_file =~ s/\\/\//isg;
+            if($css_file !~ /$url_base/) {
+              $css_file = $url_base . $css_file;  
+            }
+            
+            # trim the ? mark append to the end of a stylesheet
+	    $css_file =~ s/\?(.+)$//isg;  
+	   
+            my $css_file_path = &util::filename_cat($base_dir, $css_file);	    
+	    
+	    # do nothing if we have already downloaded the css files
+	    if (! -e $css_file_path) {		
+	     
+             # check the stylesheet's directory in the import folder
+             # if the directory doesn't exist, create one            
+	     my @dirs = split(/\//i,$css_file);	    
+	     my $path_check = "$base_dir/";            
+	     for (my $i = 0; $i < (scalar(@dirs)-1); $i++) {
+		$path_check .= $dirs[$i] . "/";	
+		mkdir($path_check) if (! -d $path_check );
+	     }
+	     
+             # NOTE: wget needs configuration to directly access Internet
+             # These files should already downloaded if we used the MediaWikiDownload             
+	     # downloading            
+	     $css_file = "http://$css_file";	    
+             print "\ndownloading : " . $css_file . "\n\n";
+	     system("wget", "--non-verbose", "$css_file", "--output-document=$css_file_path");
+	     if ($? != 0) {
+              print "[ERROR] Download Failed! Make sure WGet connects to Internet directly \n";
+              print "[ERROR] OR ues the MediaWikiDownload in the GLI DownloadPanel to download from a MediaWiki website\n";
+              unlink("$css_file_path");
+             }
+            } # done with download
+		
+	    # add a prefix "#wikispecificstyle" to each element
+	    # because we want to preserve this website's formats and don't want to mess up with Greenstone formats
+            # so we will wrap the web page with a div with id = wikispecificstyle
+            my $css_content;
+	    if(open(INPUT, "<$css_file_path")){		
+		while(my $line = <INPUT>){
+                    # comment out the body element because we change the body to div
+                    $line =~ s/^(\s*)body(\s*){(\s*)$/$1\/*body$2*\/{$3/isg;
+                    
+                    if($line =~ m/^(.+)\{/i || $line =~ m/^(\s)*#/i){                    
+                      if($line !~ m/wikispecificstyle/i){
+                        $line = "#wikispecificstyle " . $line;
+                      } 
+                    }
+                    
+		    $css_content .= $line;
+		}
+		close(INPUT);			
+		open(OUTPUT, ">$css_file_path");
+		print OUTPUT $css_content;
+		close(OUTPUT);
+	    }
+            
+            # Copy the modified stylesheets to collection's style folder
+            # for future customization
+            my $style_dir = $base_dir;
+            $style_dir =~ s/import$/style/;
+            $css_file =~ m/(.*)\/(.*)$/;
+            $style_dir = &util::filename_cat($style_dir, $2);            
+            
+            if(open(OUTPUT, ">$style_dir")){	
+              print OUTPUT $css_content;
+              close(OUTPUT);
+            }
+	}
+    }    
+    
+    
+    # by default, only preserve navigation box and search box
+    # others like toolbox, interaction, languages box, will be removed  
+    
+    # extract the larger part -- footer section
+    my $print_footer = "<div class=\"printfooter\">(.|\n)+</body>";
+    $body_text =~ /$print_footer/;
+    my $footer = "";
+    $footer = $& if defined $&;
+    $footer =~ s/<\/body>//isg;
+    
+    # trim the comments first    
+    $footer =~ s/<!--[\s\S]*?--[ \t\n\r]*>//isg;
+    
+    # contain sections that are to be preserved
+    my $preserve_sections = "";   
+    
+    # process the navigation section    
+    my $nav_match_exp = "<div([^>]*)id=(\"|')p-navigation(\"|')(.|\n)*?<\/div>";
+    if (defined $self->{'nav_div_exp'}) {
+      $nav_match_exp = $self->{'nav_div_exp'} if ($self->{'nav_div_exp'} =~ /\S/) ;
+    }
+        
+    if (defined $self->{'delete_nav'} && ($self->{'delete_nav'} eq "1")) {	
+        # do nothing	
+    } else {      
+      if ($footer =~ m/$nav_match_exp/ig) {
+        $preserve_sections = $& ;
+      } else {
+        print $outhandle "Can't find the navigation section with : $nav_match_exp\n";
+      }
+      # if($preserve_sections =~/\S/){
+      #  $preserve_sections .= "</div>";
+      # }            
+    }          
+            
+    # process the searchbox section        
+    my $searchbox_exp = "<div([^>]*)id=(\"|')p-search(\"|')(.|\\n)*?<\/div>";
+    if(defined $self->{'searchbox_div_exp'}) {                
+        $searchbox_exp = $self->{'searchbox_div_exp'} if ($self->{'searchbox_div_exp'} =~ /\S/);
+    }    
+                        
+    my $searchbox_section = "";    
+    $footer =~ m/$searchbox_exp/ig;
+    $searchbox_section = $& if defined $&;    
+    
+    # make the searchbox form work in Greenstone
+    if($searchbox_section =~ /\S/){        
+        # replace action
+        $searchbox_section =~ s/action="([^>]*)"/action="_gwcgi_"/isg;
+                
+        # remove buttons
+        $searchbox_section =~ s/name="search"/name="q"/isg;
+        $searchbox_section =~ s/name="go"//isg;
+        $searchbox_section =~ s/name="fulltext"//isg;
+                
+        # get collection name from $base_dir for c param        
+        $base_dir =~ m/\/collect\/(.+)\//i;
+        my $collection_name = "";
+        $collection_name = $1 if defined $1;
+        
+        # add Greenstone search params
+        my $hidden_params = "<input type=\"hidden\" name=\"a\" value=\"q\"/>\n" 
+            ."<input type=\"hidden\" name=\"c\" value=\"$collection_name\"/>\n";
+            # ."<input type=\"hidden\" name=\"fqf\" value=\"TX\"/>\n"
+            # ."<input type=\"hidden\" name=\"r\" value=\"1\">\n";
+        
+        $searchbox_section =~ s/<form([^>]*)>/<form$1>\n$hidden_params/isg;         
+        
+        # $searchbox_section .= "</div>";
+    } else {
+      print $outhandle "Can't find the searchbox section with : $searchbox_section\n";
+    }        
+    
+    # either delete or replace the searchbox 
+    if(defined $self->{'delete_searchbox'} && $self->{'delete_searchbox'} eq "1") {
+        # do nothing        
+    } else {
+        $preserve_sections .= "\n$searchbox_section\n";
+    } 
+    
+    if($preserve_sections ne ""){
+      $preserve_sections = "<div id=\"column-one\">\n" . $preserve_sections . "\n</div>\n";
+    }
+    $preserve_sections = "</div></div></div>\n" . $preserve_sections . "\n</body>";   
+            
+    $body_text =~ s/$print_footer/$preserve_sections/isg;
+    
+    
+    # delete other forms in the page
+    my @forms;
+    my $form_count = 0;
+    while($body_text =~ m/<form([^>]*)name=("|')([^>"']*)?("|')/isg){
+        next if($3 eq "searchform");
+        $forms[$form_count++] = $&;        
+    }
+    foreach my $form (@forms) {      
+      $body_text =~ s/$form[\s\S]*?<\/form>//m;
+    }
+    
+    # process links. 
+    # because current WGET 1.10 the -k and -E option doesn't work together
+    # need to 'manually' convert the links to relative links
+    # Dealing with 3 types of links:
+    # -- outgoing links
+    #   -- if we have downloaded the target files, link to the internal version (relative link)
+    #   -- otherwise, link to the external version (absolute links)
+    # -- in-page links (relative link)
+    
+    # NOTE: (important)
+    #   must use the MediaWikiDownload in GLI Download Panel to download files from a MediaWiki website
+    #   otherwise, the internal links may have problems
+    
+    # remove the title attribute of <a> tag
+    $body_text =~ s/<a([^>]*)title="(.*?)"/<a$1/isg;
+    
+    # extract all the links
+    my @links;
+    my $link_count = 0;    
+    while($body_text =~ m/(href|src)="([^>\s]*)$url_base\/([^>\s]*)"/ig){        
+        $links[$link_count++] = "$1=\"$2$url_base/$3\"";		
+    }
+    
+    foreach my $cur_link (@links) {     
+        # escape greedy match + character
+        $cur_link =~ s/\+/\\+/isg;
+        
+        $cur_link =~ m/(.+)"([^>]*)$url_base\/([^>\s]*)"/;          
+        my $external_file_path = "$1\"http://$url_base/$3\"";
+           
+        $body_text =~ s/$cur_link/$external_file_path/i; 
+    }
+             
+    # tag links to new wiki pages as red    
+    $body_text =~ s/<a([^>]*)class="new"([^>]*)>/<a$1style="color:red"$2)>/gi;
+    
+    # tag links to pages external of the MediaWiki website as blue
+    $body_text =~ s/<a([^>]*)class='external text'([^>]*)>/<a$1style="color:blue"$2)>/gi;
+        
+    
+    # process the table-of-contents section
+    # if 'show_toc' is set, add Main_Page's toc to the collection's About page, change extra.dm file     
+    # 1. read _content_ macro from about.dm
+    # 2. append the toc, change all links to the Greenstone internal format for relative links 
+    # 3. write to the extra.dm
+    # TODO: we assume the _about:content_ hasn't been specified before
+    #	    so needs to add function to handle when the macro is already in the extra.dm	   
+    if($self->{'show_toc'}==1 && $file =~ m/Main_Page.(html|htm)$/){
+    
+      # extract toc of the Main_Page           	 
+      my $mainpage_toc = "";  
+      my $toc_exp = "<table([^>]*)id=(\"|')toc(\"|')(.|\\n)*</table>\\n";
+      if($self->{'toc_exp'} =~ /\S/){
+         $toc_exp = $self->{'toc_exp'};	     
+      }
+      if($body_text =~ /$toc_exp/){                      	
+        $mainpage_toc = $&;
+      }
+        
+      if($mainpage_toc =~ /\S/) {
+        
+        # change the in-page links to relative links, for example, change <a href="#section1"> to 
+        # <a href="_httpquery_&a=extlink&rl=1&href=http://www.mediawikisite.com/Main_Page.html#section1">           
+        my $file_url_format = $file;
+        $file_url_format =~ s/\\/\//isg; 
+	$file_url_format = "http://" . $file_url_format;
+	   
+        # encode as URL, otherwise doesn't work on Windows
+        $file_url_format =~ s/([^A-Za-z0-9])/sprintf("%%%02X", ord($1))/seg;
+	$mainpage_toc =~ s/<a href="([^>"#]*)#([^>"]*)"/<a href="_httpquery_&a=extlink&rl=1&href=$file_url_format#$2"/isg;
+        
+        
+        # read the collection's extra.dm    
+        my $macro_path = $base_dir;
+        $macro_path =~ s/import$/macros/;    	
+    	my $extradm_file = &util::filename_cat($macro_path, "extra.dm");        
+        
+        my $extra_dm = "";
+        if(open(INPUT, "<$extradm_file")){    	            
+	    while(my $line = <INPUT>){
+		$extra_dm .= $line;
+	    }	    	
+        } else {
+            print $outhandle "can't open file $extradm_file\n";
+        }
+        close(INPUT);
+        
+        # check whether we have changed the macros
+        my @packages = split("package ", $extra_dm);
+        my $about_package = "";
+        foreach my $package (@packages) {
+          $about_package = "package " . $package if($package =~ /^about/);
+        }      
+                
+        my $update_extra_dm = 0;        
+        
+        if( $about_package =~ /\S/ && $about_package =~ m/_content_(\s*){/ && $about_package =~ m/$mainpage_toc/){  
+	   print $outhandle "_content_ macro already changed!!!!\n";
+	}
+        # if extra.dm doesn't have an "about package"
+        elsif ($about_package !~ /\S/) {          
+          # read _content_ macro from $GSDLHOME/macros/about.dm file          
+	  my $global_about_package = $self->read_content_from_about_dm();	    
+            
+          # create the extra _content_ macro for this collection           
+          # add the original content of the _content_ macro
+          $global_about_package =~ m/{(.|\n)*<\/div>\n\n/;
+          
+          # append the new about package to extra.dm
+          $extra_dm .= "\n\npackage about\n_content_$&\n\n";
+          $extra_dm .= "<div class=\"section\">\n$mainpage_toc\n</div>\n</div>\n}";
+          
+          $update_extra_dm = 1;
+        } 
+        # the about package exists, but either doesn't have the _content_ macro or 
+        # the _content_ macro doesn't contain the toc
+        else {        
+          # check if there is a content macro   
+          my $content_macro_existed = 0;
+          $content_macro_existed = ($about_package =~ /(\s*|\n)_content_(\s*){/);
+            
+          # if there is one
+          # append a new section div for toc to the end of the document section                    
+          if($content_macro_existed ==1) {
+            $about_package =~ /(\s*|\n)_content_(\s*){(.|\n)*?}/;
+            my $content_macro = $&;                          
+            my $new_content_macro = $content_macro;
+            $new_content_macro =~ s/<div[^>]*class="document">(.|\n)*<\/div>/<div$1class="document">$2\n\n<div class="section">\n$mainpage_toc\n<\/div>\n<\/div>/;              
+            $extra_dm =~ s/$content_macro/$new_content_macro/mg;                                    
+          }
+          # otherwise, append _content_ macro to the about package
+          else {
+            my $new_about_package = $about_package;            
+            my $content_macro = &read_content_from_about_dm();
+            $content_macro =~ m/{(.|\n)*<\/div>\n\n/;            
+            
+            $new_about_package .= "\n\n_content_$&\n\n";
+            $new_about_package .= "<div class=\"section\">\n$mainpage_toc\n</div>\n</div>\n}";              
+            $extra_dm =~ s/$about_package/$new_about_package/mg;   
+          } 
+          
+          # either the case, we need to update the extra.dm         
+          $update_extra_dm = 1;
+         }          
+                  
+         if($update_extra_dm==1){
+            # write to the extra.dm file of the collection
+            if (open(OUTPUT, ">$extradm_file")) {
+                print OUTPUT $extra_dm;
+            } else {
+                print "can't open $extradm_file\n";
+            }
+            close(OUTPUT);
+         }
+      } else {
+        print $outhandle "Main_Page doesn't have a table-of-contents section\n";
+      }
+    }
+	
+    # If delete_toc is set, remove toc and tof contents.    
+    if (defined $self->{'delete_toc'} && ($self->{'delete_toc'} == 1)){
+	if (defined $self->{'toc_exp'} && $self->{'toc_exp'} =~ /\S/){		
+          # print "\nit matches toc_exp !!\n" if $body_text =~ /$self->{'toc_exp'}/;
+          if ($body_text =~ /$self->{'toc_exp'}/) {
+	    $body_text =~ s/$self->{'toc_exp'}//i;	    
+          }
+	}
+    }        
+    
+    $$textref = "<body" . $body_text;
+    
+    # Wrap the whole page with <div id="wikispecificstyle"></div>
+    # keep the style of this website and don't mess up with the Greenstone styles
+    $$textref =~ s/<body([^>]*)>/$&\n<div id="wikispecificstyle">\n/is;
+    $$textref =~ s/<\/body>/<\/div><\/body>/is;     
+	       
+    $self->SUPER::process(@_);
+    
+    return 1;
+}
+
+
+sub extract_metadata 
+{
+    my $self = shift (@_);
+    my ($textref, $metadata, $doc_obj) = @_;
+    my $outhandle = $self->{'outhandle'};
+    
+    return if (!defined $textref);
+
+    # metadata fields to extract/save. 'key' is the (lowercase) name of the
+    # html meta, 'value' is the metadata name for greenstone to use
+    my %find_fields = ();
+    my ($tag,$value);
+
+    my $orig_field = "";
+    foreach my $field (split /,/, $self->{'metadata_fields'}) {
+	# support tag<tagname>
+	if ($field =~ /^(.*?)<(.*?)>$/) {
+	    # "$2" is the user's preferred gs metadata name
+	    $find_fields{lc($1)}=$2; # lc = lowercase
+	    $orig_field = $1;
+	} else { # no <tagname> for mapping
+	    # "$field" is the user's preferred gs metadata name
+	    $find_fields{lc($field)}=$field; # lc = lowercase
+	    $orig_field = $field;
+	}
+
+	if ($textref =~ m/<o:$orig_field>(.*)<\/o:$orig_field>/i){
+	    $tag = $orig_field;
+	    $value = $1;
+	    if (!defined $value || !defined $tag){
+		#print $outhandle "MediaWikiPlugin: can't find VALUE in \"$tag\"\n";
+		next;
+	    } else {
+		# clean up and add
+		chomp($value); # remove trailing \n, if any
+		$tag = $find_fields{lc($tag)};
+		#print $outhandle " extracted \"$tag\" metadata \"$value\"\n" 
+		#    if ($self->{'verbosity'} > 2);
+		$doc_obj->add_utf8_metadata($doc_obj->get_top_section(), $tag, $value);
+	    }
+	}
+    }
+}
+
+sub safe_escape_regexp
+{
+  my $regexp = shift (@_);
+  
+  # if ($ENV{'GSDLOS'} =~ /^windows$/i) {
+    $regexp =~ s/\\/\\\\/isg;    
+  #} else {
+    $regexp =~ s/\//\\\//isg;         
+  #}
+  return $regexp;
+}
+
+sub read_content_from_about_dm
+{
+    my $self = shift(@_);
+
+  my $about_macro_file = &util::filename_cat($ENV{'GSDLHOME'}, "macros", "about.dm");
+  my $about_page_content = "";
+  if (open(INPUT, "<$about_macro_file")){
+    while (my $line=<INPUT>){
+      $about_page_content .= $line;
+    }
+  } else {
+      my $outhandle = $self->{'outhandle'};
+    print $outhandle "can't open file $about_macro_file\n";
+  }    		
+  close(INPUT);
+            
+  # extract the _content_ macro
+  $about_page_content =~ m/_content_ {(.|\n)*<\/div>\n\n<\/div>\n}/i;
+  $about_page_content = $&;
+  
+  return $about_page_content;
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/MediainfoOGVPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/MediainfoOGVPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/MediainfoOGVPlugin.pm	(revision 24799)
@@ -0,0 +1,235 @@
+###########################################################################
+#
+# MediainfoOGVPlugin.pm -- Plugin for OGV multimedia files
+#
+# A component of the Greenstone digital library software from the New
+# Zealand Digital Library Project at the University of Waikato, New
+# Zealand.
+#
+# Copyright (C) 2010 Arnaud Yvan
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# MediainfoOGVPlugin - a plugin for OGV multimedia files
+# contributed to Greenstone by Arnaud Yvan
+
+# This is a simple Plugin for importing OGV multimedia files.
+# Mediainfo will retrieve the metadata of the file. A fictional document will
+# be created for every such file, and the file itself will be passed
+# to Greenstone as the "associated file" of the document.
+
+# Here's an example where it is useful: I have a collection of
+# ogg movie files with names like conference_20080402.ogv.
+# I add this line to the collection configuration file:
+
+# plugin MediainfoOGVPlugin -process_exp "*.ogv" -assoc_field "movie"
+
+# A document is created for each movie, with the associated movie
+# file's name in the "movie" metadata field.
+
+# The plugin also add some metadata :
+# Duration (in seconds), filesize, title, artist, location, organization,
+# date, contact, copyright.
+
+
+
+package MediainfoOGVPlugin;
+
+use BasePlugin;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+no strict 'subs';
+
+sub BEGIN {
+    @MediainfoOGVPlugin::ISA = ('BasePlugin');
+}
+
+my $arguments  =  
+    [ { 'name' => "process_exp",
+        'desc' => "{BasePlugin.process_exp}",
+        'type' => "regexp",
+        'deft' => &get_default_process_exp(),
+        'reqd' => "no" },
+      { 'name' => "assoc_field",
+	'desc' => "{MediainfoOGVPlugin.assoc_field}",
+	'type' => "string",
+	'deft' => "Movie",
+	'reqd' => "no" },
+      ];
+
+my $options = { 'name'     => "MediainfoOGVPlugin",
+		'desc'     => "{MediainfoOGVPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new BasePlugin($pluginlist, $inputargs, $hashArgOptLists);
+
+    return bless $self, $class;
+}
+
+sub init {
+    my $self = shift(@_);
+    my ($verbosity, $outhandle, $failhandle) = @_;
+
+    $self->BasePlugin::init($verbosity, $outhandle, $failhandle);   
+
+    # Check that Mediainfo is installed and available on the path (except for Windows 95/98)
+    if (!($ENV{'GSDLOS'} eq "windows" && !Win32::IsWinNT())) {
+	my $result = `mediainfo 2>&1`;
+	if ($? == -1 || $? == 256) {  # Linux and Windows return different values for "program not found"
+	    $self->{'mediainfo_not_installed'} = 1;
+	}
+    }
+
+}
+sub get_default_process_exp {
+    return q^(?i)\.ogv$^;
+}
+
+# MediainfoOGVPlugin processing of doc_obj.
+
+sub process {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+
+    #print STDERR "\n\n**** START of processing MediainfoOGVPlugin\n\n";
+
+    my ($filename_full_path, $filename_no_path) = &util::get_full_filenames($base_dir, $file);
+    my $outhandle = $self->{'outhandle'};
+    my $verbosity = $self->{'verbosity'};
+
+    # check the filename is okay - do we need this??
+    if ($filename_full_path eq "" || $filename_no_path eq "") {
+        print $outhandle "MediainfoOGVPlugin: couldn't process \"$filename_no_path\"\n";
+        return undef;
+    }
+
+    # Add the file as an associated file ...
+    my $section = $doc_obj->get_top_section();
+    my $file_format = "ogv";
+    my $mime_type = "video/ogg";
+    my $assoc_field = $self->{'assoc_field'};
+
+    # The assocfilename is the url-encoded version of the utf8 filename
+    my $assoc_file = $doc_obj->get_assocfile_from_sourcefile();
+
+    $doc_obj->associate_file($filename_full_path, $assoc_file, $mime_type, $section);
+    $doc_obj->add_metadata ($section, "FileFormat", $file_format);
+    $doc_obj->add_metadata ($section, "dc.Format", $file_format);
+    $doc_obj->add_metadata ($section, "MimeType", $mime_type);
+    $doc_obj->add_utf8_metadata ($section, $assoc_field, $doc_obj->get_source()); # Source metadata is already in utf8
+
+    # srclink_file is now deprecated because of the "_" in the metadataname. Use srclinkFile
+    $doc_obj->add_metadata ($section, "srclink_file", $doc_obj->get_sourcefile());
+    $doc_obj->add_metadata ($section, "srclinkFile", $doc_obj->get_sourcefile());
+    $doc_obj->add_metadata ($section, "srcicon", "_iconogg_");
+
+    # we have no text - add dummy text and NoText metadata
+    $self->add_dummy_text($doc_obj, $section);
+
+    if (defined $self->{'mediainfo_not_installed'}) {
+	# can't do any extracted
+	print STDERR "Mediainfo not installed, so can't extract metadata\n";
+	return 1;
+    }
+
+    
+    # Retrieve the file metadata
+    my $command = "mediainfo --inform=\"General;%Duration/String2%|%Duration%|%FileSize/String2%|%Performer%|%Title%|%Recorded_Date%|%Recorded/Location%|%Producer%|%Copyright%|%LICENSE%|%Publisher%\" \"$filename_full_path\"";
+    print $outhandle "$command\n" if ($verbosity > 2);
+    
+    # execute the mediainfo command and store the output of execution in $videodata
+    # my $video_metadata = `$command`; # backticks operator way
+    # Another way to execute the command: better experience with this than with backticks operator above:
+    # use open() to read the output of executing the command (which is piped through to a handle using the | operator)
+    my $video_metadata;
+    if (open(VMIN,"$command|")) {
+        my $line;
+	
+	# we read a line of output at a time
+        while (defined ($line=<VMIN>)) {
+	    #print STDERR "***** line = $line\n";
+	    
+	    $video_metadata .= $line;
+        }
+	
+        close(VMIN);
+    }
+    
+    print $outhandle "$video_metadata\n" if ($verbosity > 2);
+
+    # There are 10 fields separated by |, split these into ordered, individual-named variables
+    my ($FormattedDuration,$Duration,$Filesize,$Artist,$Title,$Date,$Location,$Organization,$Copyright,$License,$Contact) = split(/\|/,$video_metadata);
+    $Duration = int($Duration/1000);
+    $Artist =~ s/\\047/\'/g; # Perl's way of doing: $artist = `echo $artist | sed \"s/\\047/'/g\"`;
+    $Title =~ s/\\047/\'/g; # $title = `echo $title | sed \"s/\\047/'/g\"`;
+
+    print $outhandle "RESULT = $FormattedDuration\n$Duration\n$Filesize\n$Artist\n$Title\n$Date\n$Location\n$Organization\n$Copyright\n$License\n$Contact\n" if ($verbosity > 2);
+    
+ 
+    $doc_obj->add_metadata ($section, "FormattedDuration", $FormattedDuration);
+    $doc_obj->add_metadata ($section, "Duration", $Duration);
+ 
+
+    $doc_obj->add_metadata($section,"FileSize",$Filesize);
+    $doc_obj->add_utf8_metadata($section,"dc.Creator",$Artist);
+    $doc_obj->add_utf8_metadata($section,"Artist",$Artist);
+    $doc_obj->add_utf8_metadata($section,"dc.Title",$Title);
+    $doc_obj->add_utf8_metadata($section,"Title",$Title);
+    $doc_obj->add_utf8_metadata($section,"dc.Date",$Date);
+    $doc_obj->add_utf8_metadata($section,"Date",$Date);
+    $doc_obj->add_utf8_metadata($section,"dc.Coverage",$Location);
+    $doc_obj->add_utf8_metadata($section,"Location",$Location);
+    $doc_obj->add_utf8_metadata($section,"dc.Publisher",$Organization);
+    $doc_obj->add_utf8_metadata($section,"Organization",$Organization);
+    $doc_obj->add_utf8_metadata($section,"dc.Rights",$Copyright);
+    $doc_obj->add_utf8_metadata($section,"Copyright",$Copyright);
+    $doc_obj->add_utf8_metadata($section,"dc.accessRights",$License);
+    $doc_obj->add_utf8_metadata($section,"License",$License);
+    $doc_obj->add_utf8_metadata($section,"dc.Contributor",$Contact);
+    $doc_obj->add_utf8_metadata($section,"Contact",$Contact);
+ 
+
+    #print STDERR "\n\n**** END of MediainfoOGVPlugin\n\n";
+    
+    return 1;
+}
+
+
+1;
+
+
+
+
+
+
+
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/MetadataCSVPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/MetadataCSVPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/MetadataCSVPlugin.pm	(revision 24799)
@@ -0,0 +1,220 @@
+###########################################################################
+#
+# MetadataCSVPlugin.pm -- A plugin for metadata in comma-separated value format
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright 2006 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package MetadataCSVPlugin;
+
+
+use BasePlugin;
+use MetadataRead;
+
+use strict;
+no strict 'refs';
+use multiread;
+
+
+# methods with identical signatures take precedence in the order given in the ISA list.
+sub BEGIN {
+    @MetadataCSVPlugin::ISA = ('MetadataRead', 'BasePlugin');
+}
+
+
+my $arguments = [
+      { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'reqd' => "no",
+	'deft' => &get_default_process_exp() }
+
+];
+
+
+my $options = { 'name'     => "MetadataCSVPlugin",
+		'desc'     => "{MetadataCSVPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+
+sub new
+{
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new BasePlugin($pluginlist, $inputargs, $hashArgOptLists);
+
+    return bless $self, $class;
+}
+
+
+sub get_default_process_exp
+{
+    return q^(?i)\.csv$^;
+}
+
+sub file_block_read {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $block_hash, $metadata, $gli) = @_;
+
+    my ($filename_full_path, $filename_no_path) = &util::get_full_filenames($base_dir, $file);
+
+    if (!-f $filename_full_path || !$self->can_process_this_file($filename_full_path)) {
+	return undef; # can't recognise
+    }
+
+    # set this so we know this is a metadata file - needed for incremental 
+    # build
+    # if this file changes, then we need to reimport everything
+    $block_hash->{'metadata_files'}->{$filename_full_path} = 1;
+
+    return 1;
+}
+
+sub metadata_read
+{
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $block_hash, 
+	$extrametakeys, $extrametadata, $extrametafile,
+	$processor, $gli, $aux) = @_;
+
+    # Read metadata from CSV files
+    my $filename = &util::filename_cat($base_dir, $file);
+    if ($filename !~ /\.csv$/ || !-f $filename) {
+	return undef;
+    }
+    print STDERR "\n<Processing n='$file' p='MetadataCSVPlugin'>\n" if ($gli);
+    print STDERR "MetadataCSVPlugin: processing $file\n" if ($self->{'verbosity'}) > 1;
+
+    my $outhandle = $self->{'outhandle'};
+    my $failhandle = $self->{'failhandle'};
+
+    # add the file to the block list so that it won't be processed in read, as we will do all we can with it here
+    &util::block_filename($block_hash,$filename);
+
+    # Read the CSV file to get the metadata
+    my $csv_file_content;
+    open(CSV_FILE, "$filename");
+    my $csv_file_reader = new multiread();
+    $csv_file_reader->set_handle('MetadataCSVPlugin::CSV_FILE');
+    $csv_file_reader->read_file(\$csv_file_content);
+    close(CSV_FILE);
+
+    # Split the file into lines and read the first line (contains the metadata names)
+    $csv_file_content =~ s/\r/\n/g;  # Handle non-Unix line endings
+    $csv_file_content =~ s/\n+/\n/g;
+    my @csv_file_lines = split(/\n/, $csv_file_content);
+    my $csv_file_field_line = shift(@csv_file_lines);
+    my @csv_file_fields = split(/\,/, $csv_file_field_line);
+    my $found_filename_field = 0;
+    for (my $i = 0; $i < scalar(@csv_file_fields); $i++) {
+	# Remove any spaces from the field names
+	$csv_file_fields[$i] =~ s/ //g;
+	if ($csv_file_fields[$i] eq "Filename") {
+	    $found_filename_field = 1;
+	}
+    }
+
+    if (!$found_filename_field) {
+	$self->print_error($outhandle, $failhandle, $gli, $filename, "No Filename field in CSV file");
+	return -1; # error
+    }
+    # Read each line of the file and assign the metadata appropriately
+    foreach my $csv_line (@csv_file_lines) {
+	# Ignore lines containing only whitespace
+	next if ($csv_line =~ /^\s*$/);
+	my $orig_csv_line = $csv_line;
+	# Build a hash of metadata name to metadata value for this line
+	my %csv_line_metadata;
+	my $i = 0;
+	$csv_line .= ",";  # To make the regular expressions simpler
+	while ($csv_line ne "") {
+	    # Metadata values containing commas are quoted
+	    if ($csv_line =~ s/^\"(.*?)\"\,//) {
+		# Only bother with non-empty values
+		if ($1 ne "" && defined($csv_file_fields[$i])) {
+		    if (!defined $csv_line_metadata{$csv_file_fields[$i]}) {
+			$csv_line_metadata{$csv_file_fields[$i]} = [];
+		    }
+		    push (@{$csv_line_metadata{$csv_file_fields[$i]}}, $1);
+		}
+	    }
+	    # Normal comma-separated case
+	    elsif ($csv_line =~ s/^(.*?)\,//) {
+		# Only bother with non-empty values
+		if ($1 ne "" && defined($csv_file_fields[$i])) {
+		    if (!defined $csv_line_metadata{$csv_file_fields[$i]}) {
+			$csv_line_metadata{$csv_file_fields[$i]} = [];
+		    }
+		    push (@{$csv_line_metadata{$csv_file_fields[$i]}}, $1);
+		}
+	    }
+	    # The line must be formatted incorrectly
+	    else {
+		$self->print_error($outhandle, $failhandle, $gli, $filename, "Badly formatted CSV line: $csv_line");
+		last;
+	    }
+
+	    $i++;
+	}
+
+	# We can't associate any metadata without knowing the file to associate it with
+	my $csv_line_filename_array = $csv_line_metadata{"Filename"};
+	if (!defined $csv_line_filename_array) {
+	    $self->print_error($outhandle, $failhandle, $gli, $filename, "No Filename metadata in CSV line: $orig_csv_line");
+	    next;
+	}
+	my $csv_line_filename = shift(@$csv_line_filename_array);
+	delete $csv_line_metadata{"Filename"};
+
+
+ 	# Associate the metadata now
+	$csv_line_filename = &util::filename_to_regex($csv_line_filename);
+
+ 	$extrametadata->{$csv_line_filename} = \%csv_line_metadata;
+ 	push(@$extrametakeys, $csv_line_filename);
+	# record which file the metadata came from 
+	if (!defined $extrametafile->{$csv_line_filename}) {
+	    $extrametafile->{$csv_line_filename} = {};
+	}
+	# maps the file to full path
+	$extrametafile->{$csv_line_filename}->{$file} = $filename;
+    }
+}
+
+sub print_error
+{
+
+    my $self = shift(@_);
+    my ($outhandle, $failhandle, $gli, $file, $error) = @_;
+
+    print $outhandle "MetadataCSVPlugin Error: $file: $error\n";
+    print $failhandle "MetadataCSVPlugin Error: $file: $error\n";
+    print STDERR "<ProcessingError n='$file' r='$error'/>\n" if ($gli);
+}
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/MetadataPass.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/MetadataPass.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/MetadataPass.pm	(revision 24799)
@@ -0,0 +1,158 @@
+###########################################################################
+#
+# MetadataPass.pm -- class to enhance plugins with generic metadata capabilities
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package MetadataPass;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+use PrintInfo; # uses PrintInfo, but is not inherited
+
+
+my $options = { 'name'     => "MetadataPass",
+		'desc'     => "{MetadataPass.desc}",
+		'abstract' => "yes",
+		'inherits' => "no" };
+
+
+sub new {
+    my $class = shift (@_);
+    my $plugin_name = shift (@_);
+
+    my $self = {};
+    $self->{'plugin_type'} = "MetadataPass";
+
+    $self->{'option_list'} = [ $options ];
+
+    return bless $self, $class;
+}
+
+sub init {
+}
+
+sub print_xml_usage
+{
+    PrintInfo::print_xml_usage(@_);
+}
+
+sub print_xml
+{
+    PrintInfo::print_xml(@_);
+}
+
+sub set_incremental
+{
+    PrintInfo::set_incremental(@_);
+}
+
+sub reset_saved_metadata {
+    my $self = shift(@_);
+
+    $self->{'saved_metadata'} = {};
+}
+
+
+sub get_saved_metadata {
+    my $self = shift(@_);
+    
+    return $self->{'saved_metadata'};
+}
+
+sub open_prettyprint_metadata_table
+{
+    my $self = shift(@_);
+
+    my $att   = "width=100% cellspacing=2";
+    my $style = "style=\'border-bottom: 4px solid #000080\'";
+
+    $self->{'ppmd_table'} = "\n<table $att $style>";
+}
+
+sub add_prettyprint_metadata_line 
+{
+    my $self = shift(@_);
+    my ($metaname, $metavalue_utf8) = @_;
+
+    $metavalue_utf8 = &util::hyperlink_text($metavalue_utf8);
+
+    $self->{'ppmd_table'} .= "  <tr bgcolor=#b5d3cd>\n";
+    $self->{'ppmd_table'} .= "    <td width=30%>\n";
+    $self->{'ppmd_table'} .= "      $metaname\n";
+    $self->{'ppmd_table'} .= "    </td>\n";
+    $self->{'ppmd_table'} .= "    <td>\n";
+    $self->{'ppmd_table'} .= "      $metavalue_utf8\n";
+    $self->{'ppmd_table'} .= "    </td>\n";
+    $self->{'ppmd_table'} .= "  </tr>\n";
+
+}
+
+sub close_prettyprint_metadata_table
+{
+    my $self = shift(@_);
+    $self->{'ppmd_table'} .= "</table>\n";
+
+    $self->set_filere_metadata("prettymd",$self->{'ppmd_table'});
+    $self->{'ppmd_table'} = undef;
+}
+
+sub set_filere_metadata
+{
+    my $self = shift(@_);
+    my ($full_mname,$md_content) = @_;
+
+    if (defined $self->{'saved_metadata'}->{$full_mname}) {
+	# accumulate - add value to existing value(s)
+	if (ref ($self->{'saved_metadata'}->{$full_mname}) eq "ARRAY") {
+	    push (@{$self->{'saved_metadata'}->{$full_mname}}, $md_content);
+	} else {
+	    $self->{'saved_metadata'}->{$full_mname} = 
+		[$self->{'saved_metadata'}->{$full_mname}, $md_content];
+	}
+    } else {
+	# accumulate - add value into (currently empty) array
+	$self->{'saved_metadata'}->{$full_mname} = [$md_content];
+    }
+}
+
+
+sub get_filere_metadata
+{
+    my $self = shift(@_);
+    my ($full_mname) = @_;
+
+    return $self->{'saved_metadata'}->{$full_mname};
+}
+
+sub get_filere_metadata_head
+{
+    my $self = shift(@_);
+    my ($full_mname) = @_;
+    
+    return $self->{'saved_metadata'}->{$full_mname}->[0];
+}
+
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/MetadataRead.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/MetadataRead.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/MetadataRead.pm	(revision 24799)
@@ -0,0 +1,83 @@
+###########################################################################
+#
+# MetadataRead - like a Java interface that defines that a subclass is
+# a Plugin that extracts Metadata
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2008 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package MetadataRead;
+
+use PrintInfo;
+use strict;
+
+# MetadataRead is an abstract superclass that does not inherit from anything else.
+# It exists solely to define the can_process_this_file_for_metadata() method in
+# such a way that those MetadataPlugins that inherit from MetadataRead don't need 
+# to define this method and will always process the files associated with them for 
+# metadata and other plugins in the pipeline won't be passed these files anymore.
+
+# MetadataRead defines method can_process_this_file_for_metadata() with identical
+# signature to BasePlugin. (MetadataRead doesn't inherit from BasePlugin, so it's
+# not 'overriding' it.) Subclasses of MetadataRead that want to use this method 
+# definition can override their inherited BasePlugin version of the method by 
+# listing MetadataRead as the *first* superclass they inherit from in the ISA list.
+# This is the way Perl resolves conflicting method definitions.
+
+my $arguments = [];
+
+my $options = { 'name'     => "MetadataRead",
+		'desc'     => "{MetadataRead.desc}",
+		'abstract' => "yes",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists,$auxiliary) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+	# Like PrintInfo, MetadataRead has no superclass,
+	# so $self is intialised to an empty array.
+	my $self = {};
+    return bless $self, $class;
+
+}
+
+# MetadataPlugins that inherit from MetadataRead will by default
+# process all the metadata in files whose extensions match. 
+# Override this method in a subclass to return undef if other 
+# files should also be allowed to process the metadata therafter.
+sub can_process_this_file_for_metadata {
+    my $self = shift(@_);
+
+#	print STDERR "********* MetadataRead::can_process_this_file_for_metadata() called.\n";
+	
+    return $self->can_process_this_file(@_);
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/MetadataXMLPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/MetadataXMLPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/MetadataXMLPlugin.pm	(revision 24799)
@@ -0,0 +1,408 @@
+###########################################################################
+#
+# MetadataXMLPlugin.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2006 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# MetadataXMLPlugin process metadata.xml files in a collection
+
+# Here's an example of a metadata file that uses three FileSet structures
+# (ignore the # characters):
+
+#<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+#<!DOCTYPE DirectoryMetadata SYSTEM "http://greenstone.org/dtd/DirectoryMetadata/1.0/DirectoryMetadata.dtd">
+#<DirectoryMetadata>
+#  <FileSet>
+#    <FileName>nugget.*</FileName>
+#    <Description>
+#      <Metadata name="Title">Nugget Point, The Catlins</Metadata>
+#      <Metadata name="Place" mode="accumulate">Nugget Point</Metadata>
+#    </Description>
+#  </FileSet>
+#  <FileSet>
+#    <FileName>nugget-point-1.jpg</FileName>
+#    <Description>
+#      <Metadata name="Title">Nugget Point Lighthouse, The Catlins</Metadata>
+#      <Metadata name="Subject">Lighthouse</Metadata>
+#    </Description>
+#  </FileSet>
+#  <FileSet>
+#    <FileName>kaka-point-dir</FileName>
+#    <Description>
+#      <Metadata name="Title">Kaka Point, The Catlins</Metadata>
+#    </Description>
+#  </FileSet>
+#</DirectoryMetadata>
+
+# Metadata elements are read and applied to files in the order they appear
+# in the file.
+#
+# The FileName element describes the subfiles in the directory that the
+# metadata applies to as a perl regular expression (a FileSet group may
+# contain multiple FileName elements). So, <FileName>nugget.*</FileName>
+# indicates that the metadata records in the following Description block
+# apply to every subfile that starts with "nugget".  For these files, a
+# Title metadata element is set, overriding any old value that the Title
+# might have had.
+#
+# Occasionally, we want to have multiple metadata values applied to a
+# document; in this case we use the "mode=accumulate" attribute of the
+# particular Metadata element.  In the second metadata element of the first
+# FileSet above, the "Place" metadata is accumulating, and may therefore be
+# given several values.  If we wanted to override these values and use a
+# single metadata element again, we could set the mode attribute to
+# "override" instead.  Remember: every element is assumed to be in override
+# mode unless you specify otherwise, so if you want to accumulate metadata
+# for some field, every occurance must have "mode=accumulate" specified.
+#
+# The second FileSet element above applies to a specific file, called
+# nugget-point-1.jpg.  This element overrides the Title metadata set in the
+# first FileSet, and adds a "Subject" metadata field.
+#
+# The third and final FileSet sets metadata for a subdirectory rather than
+# a file.  The metadata specified (a Title) will be passed into the
+# subdirectory and applied to every file that occurs in the subdirectory
+# (and to every subsubdirectory and its contents, and so on) unless the
+# metadata is explictly overridden later in the import.
+
+package MetadataXMLPlugin;
+
+use strict;
+no strict 'refs';
+
+use Encode;
+
+use BasePlugin;
+use util;
+use metadatautil;
+
+sub BEGIN {
+    @MetadataXMLPlugin::ISA = ('BasePlugin');
+
+    # ensure Greenstone's CPAN is on the path (but check first) [jmt12]
+    my $inc_paths = join(':', @INC);
+    my $gsdl_perllib_path = $ENV{'GSDLHOME'} . '/perllib/cpan';
+    if ($inc_paths !~ /$gsdl_perllib_path/)
+    {
+      unshift (@INC, $gsdl_perllib_path);
+    }
+}
+
+use XMLParser;
+
+my $arguments = [
+      { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'reqd' => "no",
+	'deft' => &get_default_process_exp() }
+
+];
+
+my $options = { 'name'     => "MetadataXMLPlugin",
+		'desc'     => "{MetadataXMLPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new BasePlugin($pluginlist, $inputargs, $hashArgOptLists);
+
+    if ($self->{'info_only'}) {
+	# don't worry about any options or initialisations etc
+	return bless $self, $class;
+    }
+	
+    # The following used to be passed in as a parameter to XML::Parser,
+    # if the version of perl was greater than or equal to 5.8. 
+    # The svn commit comment explaining the reason for adding this was
+    # not very clear and also said that it was quick fix and hadn't
+    # been tested under windows. 
+    # More recent work has been to make strings in Perl "Unicode-aware"
+    # and so this line might actually be potentially harmful, however
+    # it is not the case that we encountered an actual error leading to
+    # its removal, rather it has been eliminated in an attempt to tighten
+    # up the code. For example, this protocol encoding is not used in
+    # ReadXMLFile.
+    # 'ProtocolEncoding' => 'ISO-8859-1',
+
+    # create XML::Parser object for parsing metadata.xml files
+    my $parser = new XML::Parser('Style' => 'Stream',							  
+                                  'Pkg' => 'MetadataXMLPlugin',
+                                  'PluginObj' => $self,
+					'Handlers' => {'Char' => \&Char,
+						 'Doctype' => \&Doctype
+						 });
+
+    $self->{'parser'} = $parser;
+    $self->{'in_filename'} = 0;
+    
+    
+    return bless $self, $class;
+}
+
+
+sub get_default_process_exp
+{
+    return q^metadata\.xml$^;
+}
+
+sub get_doctype {
+    my $self = shift(@_);
+    
+    return "(Greenstone)?DirectoryMetadata"
+}
+
+sub can_process_this_file {
+    my $self = shift(@_);
+    my ($filename) = @_;
+
+    if (-f $filename && $self->SUPER::can_process_this_file($filename) && $self->check_doctype($filename)) {
+	return 1; # its a file for us
+    }
+    return 0;
+}
+
+sub check_doctype {
+    my $self = shift (@_);
+    
+    my ($filename) = @_;
+
+    if (open(XMLIN,"<$filename")) {
+	my $doctype = $self->get_doctype();
+	## check whether the doctype has the same name as the root element tag
+	while (defined (my $line = <XMLIN>)) {
+	    ## find the root element
+	    if ($line =~ /<([\w\d:]+)[\s>]/){
+		my $root = $1;
+		if ($root !~ $doctype){
+		    close(XMLIN);
+		    return 0;
+		}
+		else {
+		    close(XMLIN); 
+		    return 1;
+		}
+	    }
+	}
+	close(XMLIN);
+    }
+    
+    return undef; # haven't found a valid line
+    
+}
+
+sub file_block_read {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $block_hash, $metadata, $gli) = @_;
+	
+    my $filename_full_path = &util::filename_cat($base_dir, $file);
+    return undef unless $self->can_process_this_file($filename_full_path);    
+
+	if ($ENV{'GSDLOS'} =~ m/^windows$/) {
+		
+		my $lower_drive = $filename_full_path;
+		$lower_drive =~ s/^([A-Z]):/\l$1:/i;
+		
+		my $upper_drive = $filename_full_path;
+		$upper_drive =~ s/^([A-Z]):/\u$1:/i;
+		
+		$block_hash->{'metadata_files'}->{$lower_drive} = 1;
+		$block_hash->{'metadata_files'}->{$upper_drive} = 1;		
+	}
+	else {
+		$block_hash->{'metadata_files'}->{$filename_full_path} = 1;
+	}
+
+    return 1;
+}
+
+sub metadata_read
+{
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $block_hash, 
+	$extrametakeys, $extrametadata,$extrametafile,
+	$processor, $gli, $aux) = @_;
+
+    my $filename = &util::filename_cat($base_dir, $file);
+    return undef unless $self->can_process_this_file($filename);    
+	
+    $self->{'metadata-file'} = $file;
+    $self->{'metadata-filename'} = $filename;
+	
+    my $outhandle = $self->{'outhandle'};
+    
+    print STDERR "\n<Processing n='$file' p='MetadataXMLPlugin'>\n" if ($gli);
+    print $outhandle "MetadataXMLPlugin: processing $file\n" if ($self->{'verbosity'})> 1;
+    # add the file to the block list so that it won't be processed in read, as we will do all we can with it here
+    &util::block_filename($block_hash,$filename);
+
+    $self->{'metadataref'} = $extrametadata;
+    $self->{'metafileref'} = $extrametafile;
+    $self->{'metakeysref'} = $extrametakeys;
+    
+    eval {
+	$self->{'parser'}->parsefile($filename);
+    };
+
+    if ($@) {
+	print STDERR "**** Error is: $@\n";
+	my $plugin_name = ref ($self);
+	my $failhandle = $self->{'failhandle'};
+	print $outhandle "$plugin_name failed to process $file ($@)\n";
+	print $failhandle "$plugin_name failed to process $file ($@)\n";
+	print STDERR "<ProcessingError n='$file'>\n" if ($gli);
+	return -1; #error
+    }
+
+    return 1;
+
+}
+
+
+# Updated by Jeffrey 2010/04/16 @ DL Consulting Ltd.
+# Get rid off the global $self as it cause problems when there are 2+ MetadataXMLPlugin in your collect.cfg...
+# For example when you have an OAIMetadataXMLPlugin that is a child of MetadataXMLPlugin
+sub Doctype {$_[0]->{'PluginObj'}->xml_doctype(@_);}
+sub StartTag {$_[0]->{'PluginObj'}->xml_start_tag(@_);}
+sub EndTag {$_[0]->{'PluginObj'}->xml_end_tag(@_);}
+sub Text {$_[0]->{'PluginObj'}->xml_text(@_);}
+
+
+sub xml_doctype {
+    my $self = shift(@_);
+    my ($expat, $name, $sysid, $pubid, $internal) = @_;
+
+    # allow the short-lived and badly named "GreenstoneDirectoryMetadata" files 
+    # to be processed as well as the "DirectoryMetadata" files which should now
+    # be created by import.pl
+    die if ($name !~ /^(Greenstone)?DirectoryMetadata$/);
+}
+
+sub xml_start_tag {
+    my $self = shift(@_);
+    my ($expat, $element) = @_;
+	
+    if ($element eq "FileSet") {
+	$self->{'saved_targets'} = [];
+	$self->{'saved_metadata'} = {};
+    }
+    elsif ($element eq "FileName") {
+	$self->{'in_filename'} = 1;
+    }
+    elsif ($element eq "Metadata") {
+	$self->{'metadata_name'} = $_{'name'};
+	$self->{'metadata_value'} = "";
+	if ((defined $_{'mode'}) && ($_{'mode'} eq "accumulate")) {
+	    $self->{'metadata_accumulate'} = 1;
+	} else {
+	    $self->{'metadata_accumulate'} = 0;
+	}
+    }
+}
+
+sub xml_end_tag {
+    my $self = shift(@_);
+    my ($expat, $element) = @_;
+
+    if ($element eq "FileSet") {
+	foreach my $target (@{$self->{'saved_targets'}}) {
+	    my $file_metadata = $self->{'metadataref'}->{$target};
+	    my $saved_metadata = $self->{'saved_metadata'};
+
+	    if (!defined $file_metadata) {
+		$self->{'metadataref'}->{$target} = $saved_metadata;
+
+		# not had target before
+		push (@{$self->{'metakeysref'}}, $target);
+	    }
+	    else {
+		&metadatautil::combine_metadata_structures($file_metadata,$saved_metadata);
+	    }
+
+	    
+	    # now record which metadata.xml file it came from
+
+	    my $file = $self->{'metadata-file'};
+	    my $filename = $self->{'metadata-filename'};
+
+	    if (!defined $self->{'metafileref'}->{$target}) {
+	    	$self->{'metafileref'}->{$target} = {};
+	    }
+
+	    $self->{'metafileref'}->{$target}->{$file} = $filename
+	}
+    }
+    elsif ($element eq "FileName") {
+	$self->{'in_filename'} = 0;
+    }
+    elsif ($element eq "Metadata") {
+	# text read in by XML::Parser is in Perl's binary byte value
+	# form ... need to explicitly make it UTF-8
+	
+	my $metadata_name = decode("utf-8",$self->{'metadata_name'});
+	my $metadata_value = decode("utf-8",$self->{'metadata_value'});
+	
+	&metadatautil::store_saved_metadata($self,
+					    $metadata_name, $metadata_value, 
+					    $self->{'metadata_accumulate'});
+	$self->{'metadata_name'} = "";
+    }
+
+}
+
+sub xml_text {
+    my $self = shift(@_);
+
+    if ($self->{'in_filename'}) {
+	# $_ == FileName content
+	push (@{$self->{'saved_targets'}}, $_);
+    }
+    elsif (defined ($self->{'metadata_name'}) && $self->{'metadata_name'} ne "") {
+	# $_ == Metadata content
+	$self->{'metadata_value'} = $_;
+    }
+}
+
+# This Char function overrides the one in XML::Parser::Stream to overcome a
+# problem where $expat->{Text} is treated as the return value, slowing
+# things down significantly in some cases.
+sub Char {
+    use bytes;  # Necessary to prevent encoding issues with XML::Parser 2.31+ 
+
+#    if ($]<5.008) {
+#	use bytes;  # Necessary to prevent encoding issues with XML::Parser 2.31+ and Perl 5.6
+#    }
+    $_[0]->{'Text'} .= $_[1];
+    return undef;
+}
+
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/NulPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/NulPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/NulPlugin.pm	(revision 24799)
@@ -0,0 +1,126 @@
+###########################################################################
+#
+# NulPlugin.pm -- Plugin for dummy (.nul) files
+#
+# A component of the Greenstone digital library software from the New
+# Zealand Digital Library Project at the University of Waikato, New
+# Zealand.
+#
+# Copyright (C) 2005 Katherine Don
+# Copyright (C) 2005 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# NulPlugin - a plugin for dummy files
+
+# This is a simple Plugin for importing dummy files, along with
+# their metadata.  A fictional document will
+# be created for every such file, and the metadata added to it.
+
+# This is used mainly for the null files resulting from exploding metadata
+# databases
+
+package NulPlugin;
+
+use BasePlugin;
+use MetadataRead;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+sub BEGIN {
+    @NulPlugin::ISA = ('MetadataRead', 'BasePlugin');
+}
+
+my $arguments = 
+    [ { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'reqd' => "no",
+	'deft' => &get_default_process_exp() },
+      { 'name' => "assoc_field",
+	'desc' => "{NulPlugin.assoc_field}",
+	'type' => "string",
+	'deft' => "null_file",
+	'reqd' => "no" },
+      { 'name' => "add_metadata_as_text",
+	'desc' => "{NulPlugin.add_metadata_as_text}",
+	'type' => "flag" },
+      { 'name' => "remove_namespace_for_text",
+	'desc' => "{NulPlugin.remove_namespace_for_text}",
+	'type' => "flag" }
+      ];
+
+my $options = { 'name'     => "NulPlugin",
+		'desc'     => "{NulPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+                 'args'     => $arguments };
+
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new BasePlugin($pluginlist, $inputargs, $hashArgOptLists);
+    
+    return bless $self, $class;
+}
+
+sub get_default_process_exp {
+    return '(?i)\.nul$';
+}
+
+# NulPlugin specific processing of doc_obj. 
+sub process {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+    
+    my $topsection = $doc_obj->get_top_section();
+       
+    my $assoc_field = $self->{'assoc_field'}; # || "null_file"; TODO, check this
+    $doc_obj->add_metadata ($topsection, $assoc_field, $file);
+
+    # format the metadata passed in (presumably from metadata.xml)
+    my $text = "";
+    if ($self->{'add_metadata_as_text'}) {
+	$text = &metadatautil::format_metadata_as_table($metadata, $self->{'remove_namespace_for_text'});
+	$doc_obj->add_utf8_text($topsection, $text);
+    } else {
+	$self->add_dummy_text($doc_obj, $topsection);
+    }
+    
+    return 1;
+}
+
+
+1;
+
+
+
+
+
+
+
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/OAIMetadataXMLPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/OAIMetadataXMLPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/OAIMetadataXMLPlugin.pm	(revision 24799)
@@ -0,0 +1,217 @@
+###########################################################################
+#
+# OAIMetadataXMLPlugin.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2010 DL Consulting Ltd
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# OAIMetadataXMLPlugin is a child of MetadataXMLPlugin
+# It processes the metadata.xml file just like MetadataXMLPlugin.
+# Additionally, it uses the "dc.Identifier" field and extracts OAI metadata from the specified OAI server (-oai_server_http_path)
+
+package OAIMetadataXMLPlugin;
+
+use strict;
+no strict 'refs';
+
+use MetadataXMLPlugin;
+
+sub BEGIN {
+  @OAIMetadataXMLPlugin::ISA = ('MetadataXMLPlugin');
+
+  # ensure Greenstone's CPAN is on the path (but check first) [jmt12]
+  my $inc_paths = join(':', @INC);
+  my $gsdl_perllib_path = $ENV{'GSDLHOME'} . '/perllib/cpan';
+  if ($inc_paths !~ /$gsdl_perllib_path/)
+  {
+    unshift (@INC, $gsdl_perllib_path);
+  }
+}
+
+my $arguments = [
+                 { 'name' => "oai_server_http_path",
+                   'desc' => "{OAIMetadataXMLPlugin.oai_server_http_path}",
+                   'type' => "string",
+                   'deft' => "" },
+                 
+                 { 'name' => "metadata_prefix",
+                   'desc' => "{OAIMetadataXMLPlugin.metadata_prefix}",
+                   'type' => "string",
+                   'deft' => "oai_dc" },
+                 
+                 # If koha_mode flag is specified, the plugin will try to generate the oaiextracted.koharecordlink metadata
+                 # This metadata contains the link back to Koha document
+                 { 'name' => "koha_mode",
+                   'desc' => "{OAIMetadataXMLPlugin.koha_mode}",
+                   'type' => "flag",
+                   'reqd' => "no" },
+                ];
+
+my $options = { 'name'     => "OAIMetadataXMLPlugin",
+		'desc'     => "{OAIMetadataXMLPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+
+sub new 
+{
+  my ($class) = shift (@_);
+  my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+  push(@$pluginlist, $class);
+  
+  push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+  push(@{$hashArgOptLists->{"OptList"}},$options);
+  
+  my $self = new MetadataXMLPlugin($pluginlist, $inputargs, $hashArgOptLists);
+  
+  return bless $self, $class;
+}
+
+
+sub metadata_read
+{
+  my $self = shift (@_);
+  my ($pluginfo, $base_dir, $file, $block_hash, $extrametakeys, $extrametadata,$extrametafile, $processor, $gli, $aux) = @_;
+  
+  # Read in the normal metadata.xml file
+  $self->SUPER::metadata_read(@_); 
+  
+  my $outhandle = $self->{'outhandle'};
+
+  #======================================================================#
+  # Checks to make sure the OAI-PMH server is connectable [START]
+  #======================================================================#
+  print $outhandle "OAIMetadataXMLPlugin: Checking OAI server (" . $self->{"oai_server_http_path"} . ") connection\n" if ($self->{'verbosity'})> 1;
+  
+  # Checks to make sure LWP (5.64) is available, it should always be available if you have Perl installed
+  # However if you are using the Greenstone's cut-down version of Perl, this LWP module will not be included
+  eval { require LWP };
+  if ($@)
+  { 
+    print STDERR "Error: Failed to load Perl module LWP: $@\n"; 
+    return;
+  }
+  
+  # Create the LWP module
+  my $browser = LWP::UserAgent->new;
+  my $response = $browser->get($self->{"oai_server_http_path"});
+  
+  # Do not go further if the OAI server is not accessible
+  if (!$response->is_success)
+  {
+    print $outhandle "OAIMetadataXMLPlugin: Error! OAI server (" . $self->{"oai_server_http_path"} . ") unavailable\n";
+    return;
+  }
+  #======================================================================#
+  # Checks to make sure the OAI-PMH server is connectable [END]
+  #======================================================================#
+
+  #======================================================================#
+  # Process each fileset [START]
+  #======================================================================#
+  foreach my $one_file (@{$extrametakeys})
+  {
+    # Don't harvest file sets that don't have dc.Identifier set, "dc.Identifier" is usde as the key between Greenstone and OAI Server!
+    next if (!defined($extrametadata->{$one_file}->{"dc.Identifier"}->[0]) || $extrametadata->{$one_file}->{"dc.Identifier"}->[0] eq "");
+
+    #======================================================================#
+    # Only try to harvest file set with dc.Identifier specified. [START]
+    #======================================================================#
+    # The dc.Identifier has to be the same as the OAI record identifier 
+    my $oai_identifier = $extrametadata->{$one_file}->{"dc.Identifier"}->[0];
+    
+    # Now, let's get the OAI metadata
+    my $request = $self->{"oai_server_http_path"} . "?verb=GetRecord&identifier=" . $oai_identifier. "&metadataPrefix=" . $self->{"metadata_prefix"};
+    print $outhandle "OAIMetadataXMLPlugin: OAI Harvesting Request (" . $request . ")\n";
+    $response = undef;
+    $response = $browser->get($request);
+    die "OAIMetadataXMLPlugin: This should never be happening - \"get\" should always be successful unless the OAI server was temporary down (some kind of race condition)\n" unless ($response->is_success);
+    my $reponse_content = $response->content();
+    
+    # Check to make sure there is no error in the OAI response
+    if ($reponse_content =~ /\<error\scode\=[\"\']([^\"\']+)[\"\']>([^\<]*)\<\/error\>/)     
+    {
+      print $outhandle "OAIMetadataXMLPlugin: Failed to retrive OAI record (" . $oai_identifier . "). ErrorCode: [$1] ErrorMessage: [$2], skip.\n";
+      next;
+    }
+    print $outhandle "OAIMetadataXMLPlugin: OAI record (" . $oai_identifier . ") found.\n";
+    
+    # Get the oai metadata (We will need to extend this code to support future metadataPrefix)
+    my $oai_content = undef;
+
+    # Special Note for KOHA OAI Server: there is an error in the KOHA's OAI-PMH server (it is still under development at the time when I am writting this)
+    # The metadata set should be oai_dc:dc tag, but they incorrectly output the tag as oaidc:dc (which doesn't match with the metadataPrefix)
+    if ($self->{"metadata_prefix"} eq "oai_dc" && $reponse_content =~ /\<oai\_?dc:dc[^\>]+\>(.*?)\<\/oai\_?dc\:dc\>/s)
+    {
+      $oai_content = $1;
+    }
+    else
+    {
+      my $reg_match = "\<" . $self->{"metadata_prefix"} . "\:" . $self->{"metadata_prefix"} . "[^\>]+\>(.*?)\<\/" . $self->{"metadata_prefix"} . "\:" . $self->{"metadata_prefix"} . "\>";
+      if ($reponse_content =~ /$reg_match/s)
+      {
+        $oai_content = $1;
+      }
+      else
+      {
+        print $outhandle "OAIMetadataXMLPlugin: Failed to match " . $self->{"metadata_prefix"} . ":" . $self->{"metadata_prefix"} . " metadata set, skip\n " . $reponse_content . "\n";
+        next;
+      }
+    }
+    
+    # Get each metadata field and value
+    while ($oai_content =~ /\<([^\>]+)\>([^\<]+)\<\/[^\>]+\>/g)
+    {
+      my $field_name = "oaiextracted." . lc($1);
+      my $value = $2;
+      
+      # Special hack for Koha data from Nitesh
+      # Some of their data contain "  \" as the value... that is pretty wrong.
+      # If the value is empty, ignore it.
+      if ($value =~ /^[^\w]*$/)
+      {
+        print STDERR "Ignore value:[" . $value . "]\n";
+        next;
+      }
+      
+      # Special case for identifier
+      if ($self->{"koha_mode"} == 1 && $1 eq "identifier" && $2 =~ /https?\:\/\//)
+      {
+        $field_name = "oaiextracted.koharecordlink";
+        
+        # Koha OAI server is not up-to-date... so it was still pointing to the old interface
+        # This might need change over once they update the Koha OAI server
+        $value =~ s/\/opac\/opac\-detail\.pl\?bib\=/\/catalogue\/detail\.pl\?biblionumber\=/;
+      }
+      $extrametadata->{$one_file}->{$field_name} = [] if (!defined($extrametadata->{$one_file}->{$field_name}));
+      push(@{$extrametadata->{$one_file}->{$field_name}}, $value); 
+    }
+    #======================================================================#
+    # Only try to harvest file set with dc.Identifier specified. [END]
+    #======================================================================#
+  }
+  #======================================================================#
+  # Process each fileset [END]
+  #======================================================================#
+}
+  
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/OAIPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/OAIPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/OAIPlugin.pm	(revision 24799)
@@ -0,0 +1,558 @@
+###########################################################################
+#
+# OAIPlug.pm -- basic Open Archives Initiative (OAI) plugin
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package OAIPlugin;
+
+use unicode;
+use util;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+use ReadXMLFile;
+use ReadTextFile; # needed for subroutine textcat_get_language_encoding
+use metadatautil;
+use MetadataRead;
+
+# methods with identical signatures take precedence in the order given in the ISA list.
+sub BEGIN {
+    @OAIPlugin::ISA = ('MetadataRead', 'ReadXMLFile', 'ReadTextFile');
+}
+
+my $set_list =
+    [ { 'name' => "auto",
+	'desc' => "{OAIPlugin.metadata_set.auto}" },
+      { 'name' => "dc",
+	'desc' => "{OAIPlugin.metadata_set.dc}" } 
+      ];
+
+my $arguments = 
+    [ { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'reqd' => "no",
+	'deft' => &get_default_process_exp() },
+      { 'name' => "metadata_set",
+	'desc' => "{OAIPlugin.metadata_set}",
+	'type' => "enumstring",
+	'reqd' => "no",
+	'list' => $set_list,
+	'deft' => "dc" },
+      { 'name' => "document_field",
+	'desc' => "{OAIPlugin.document_field}",
+	'type' => "metadata",
+	'reqd' => "no",
+	'deft' => "gi.Sourcedoc" }
+      ];
+
+my $options = { 'name'     => "OAIPlugin",
+		'desc'     => "{OAIPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'explodes' => "yes",
+		'args'     => $arguments };
+
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    new ReadTextFile($pluginlist, $inputargs, $hashArgOptLists,1);
+    my $self = new ReadXMLFile($pluginlist, $inputargs, $hashArgOptLists);
+
+    if ($self->{'info_only'}) {
+	# don't worry about modifying options
+	return bless $self, $class;
+    }
+    # trim any ex. from document field iff it's the only metadata namespace prefix    
+    $self->{'document_field'} =~ s/^ex\.([^.]+)$/$1/;
+    return bless $self, $class;
+}
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+    return q^(?i)(\.oai)$^;
+}
+
+sub get_doctype {
+    my $self = shift(@_);
+    
+    return "OAI-PMH";
+}
+
+sub xml_start_document {
+    my $self = shift (@_);
+    $self->{'in_metadata_node'} = 0;
+    $self->{'rawxml'} = "";
+    $self->{'saved_metadata'} = {};
+}
+
+sub xml_end_document {
+}
+
+sub xml_doctype {
+    my $self = shift(@_);
+
+    my ($expat, $name, $sysid, $pubid, $internal) = @_;
+
+    ##die "" if ($name !~ /^OAI-PMH$/);
+
+    my $outhandle = $self->{'outhandle'};
+    print $outhandle "OAIPlugin: processing $self->{'file'}\n" if $self->{'verbosity'} > 1;
+    print STDERR "<Processing n='$self->{'file'}' p='OAIPlugin'>\n" if $self->{'gli'};
+
+}
+
+
+sub xml_start_tag {
+    my $self = shift(@_);
+    my ($expat,$element) = @_;
+
+    my %attr_hash = %_;
+
+    my $attr = "";
+    map { $attr .= " $_=$attr_hash{$_}"; } keys %attr_hash;
+
+    $self->{'rawxml'} .= "<$element$attr>";
+
+    if ($element eq "metadata") {
+	$self->{'in_metadata_node'} = 1;
+	$self->{'metadata_xml'} = "";
+    }
+
+    if ($self->{'in_metadata_node'}) {
+	$self->{'metadata_xml'} .= "<$element$attr>";
+    }
+}
+
+sub xml_end_tag {
+    my $self = shift(@_);
+    my ($expat, $element) = @_;
+
+    $self->{'rawxml'} .= "</$element>";
+
+    if ($self->{'in_metadata_node'}) {
+	$self->{'metadata_xml'} .= "</$element>";
+    }
+
+    if ($element eq "metadata") {
+	my $textref = \$self->{'metadata_xml'};
+	#my $metadata = $self->{'metadata'};
+	my $metadata = $self->{'saved_metadata'};
+	$self->extract_oai_metadata($textref,$metadata);
+
+	$self->{'in_metadata_node'} = 0;	
+    }
+
+
+}
+
+sub xml_text {
+    my $self = shift(@_);
+    my ($expat) = @_;
+
+    $self->{'rawxml'} .= $_;
+
+    if ($self->{'in_metadata_node'}) {
+	$self->{'metadata_xml'} .= $_;
+    }
+}
+
+
+sub metadata_read {
+    my $self = shift (@_);  
+
+    my ($pluginfo, $base_dir, $file, $block_hash, 
+	$extrametakeys, $extrametadata, $extrametafile,
+	$processor, $gli, $aux) = @_;
+
+    # can we process this file??
+    my ($filename_full_path, $filename_no_path) = &util::get_full_filenames($base_dir, $file);
+    return undef unless $self->can_process_this_file_for_metadata($filename_full_path);
+    
+    if (!$self->parse_file($filename_full_path, $file, $gli)) {
+	$self->{'saved_metadata'} = undef;
+	return undef;
+    }
+
+    my $new_metadata = $self->{'saved_metadata'};
+    $self->{'saved_metadata'} = undef;
+
+    # add the pretty metadata table as metadata
+    my $ppmd_table = $self->{'ppmd_table'};
+    $new_metadata->{'prettymd'} = $ppmd_table;
+    $self->{'ppmd_table'} = undef;
+      
+    my $document_metadata_field = $self->{'document_field'};
+    my $url_array = $new_metadata->{$document_metadata_field};
+    if (!defined $url_array) {
+	# try ex.
+	$url_array = $new_metadata->{"ex.$document_metadata_field"};
+    }
+    my $num_urls = (defined $url_array) ? scalar(@$url_array) : 0;
+    ##print STDERR "$num_urls urls for $file\n";
+    my $srcdoc_exists = 0;
+    my $srcdoc_pos = 0;
+    my $filename_dir = &util::filename_head($filename_full_path);
+    
+    # filenames in extrametadata must be relative to current dir, as 
+    # DirectoryPlugin adds path info on itself
+    my ($filename_for_metadata) = $file =~ /([^\\\/]+)$/; # this assumes there will only be one record per oai file - is this always the case??
+    for (my $i=0; $i<$num_urls; $i++) {
+	
+	if ($url_array->[$i] !~ m/^(https?|ftp):/) {
+	    
+	    my $src_filename = &util::filename_cat($filename_dir, $url_array->[$i]);
+	    if (-e $src_filename) {
+		$srcdoc_pos = $i;
+		$srcdoc_exists = 1;
+		# get the slashes the right way, use filename_cat
+		$filename_for_metadata = &util::filename_cat($url_array->[$i]);
+		last;
+	    }
+	}
+    }
+    
+    if ($srcdoc_exists) {
+	$self->{'oai-files'}->{$file}->{'srcdoc_exists'} = 1;
+    }
+    else {
+	# save the rawxml for the source document
+	$self->{'oai-files'}->{$file}->{'srcdoc_exists'} = 0;
+	$self->{'oai-files'}->{$file}->{'rawxml'} = $self->{'rawxml'};
+	$self->{'rawxml'} = "";
+    }
+    
+    # return all the metadata we have extracted to the caller.
+    # Directory plug will pass it back in at read time, so we don't need to extract it again.
+    # extrametadata keys should be regular expressions
+    $filename_for_metadata = &util::filename_to_regex($filename_for_metadata);
+    $extrametadata->{$filename_for_metadata} = $new_metadata;
+    push(@$extrametakeys, $filename_for_metadata);
+    if ($srcdoc_exists) {
+	if (!defined $extrametafile->{$filename_for_metadata}) {
+	    $extrametafile->{$filename_for_metadata} = {};
+	}
+	 #maps the file to full path
+	$extrametafile->{$filename_for_metadata}->{$file} = $filename_full_path;
+    }
+    return 1;
+    
+}
+
+
+sub read {
+    my $self = shift (@_);  
+    
+    my ($pluginfo, $base_dir, $file, $block_hash, $metadata, $processor, $maxdocs, $total_count, $gli) = @_;
+
+    if (!defined $self->{'oai-files'}->{$file}) {
+	return undef;
+    }
+        
+    my $srcdoc_exists = $self->{'oai-files'}->{$file}->{'srcdoc_exists'};
+    if ($srcdoc_exists) {
+	# do nothing more - all the metadata has been extracted and associated with the srcdoc
+	# no more need to access details of this $file => tidy up as you go
+	delete $self->{'oai-files'}->{$file};
+	return 0; # not processed here, but don't pass on to rest of plugins
+    }
+
+    my $filename = $file;
+    $filename = &util::filename_cat ($base_dir, $file) if $base_dir =~ /\w/;
+
+    # Do encoding stuff on metadata
+    my ($language, $encoding) = $self->textcat_get_language_encoding ($filename);
+
+    # create a new document
+    my $doc_obj = new doc ($filename, "indexed_doc", $self->{'file_rename_method'});
+    my $top_section = $doc_obj->get_top_section;
+    my $plugin_type = $self->{'plugin_type'};
+    
+    my ($filemeta) = $file =~ /([^\\\/]+)$/;
+    my $plugin_filename_encoding = $self->{'filename_encoding'};
+    my $filename_encoding = $self->deduce_filename_encoding($file,$metadata,$plugin_filename_encoding);
+    $self->set_Source_metadata($doc_obj, $filename, $filename_encoding);
+
+    $doc_obj->add_utf8_metadata($top_section, "Language", $language);
+    $doc_obj->add_utf8_metadata($top_section, "Encoding", $encoding);
+    $doc_obj->add_utf8_metadata($top_section, "Plugin", $plugin_type);
+    $doc_obj->add_metadata($top_section, "FileFormat", "OAI");
+    $doc_obj->add_metadata($top_section, "FileSize", (-s $filename));
+    
+    # include any metadata passed in from previous plugins 
+    # note that this metadata is associated with the top level section
+    # this will include all the metadata from the oai file that we extracted
+    # during metadata_read
+    $self->extra_metadata ($doc_obj, $doc_obj->get_top_section(), $metadata);
+    
+    # do plugin specific processing of doc_obj
+    my $text = $self->{'oai-files'}->{$file}->{'rawxml'};
+    delete $self->{'oai-files'}->{$file};
+
+    unless (defined ($self->process(\$text, $pluginfo, $base_dir, $file, $metadata, $doc_obj))) {
+	print STDERR "<ProcessingError n='$file'>\n" if ($gli);
+	return -1;
+    }
+    
+    # do any automatic metadata extraction
+    $self->auto_extract_metadata ($doc_obj);
+    
+    # add an OID
+    $self->add_OID($doc_obj);
+        
+    # process the document
+    $processor->process($doc_obj);
+    
+    $self->{'num_processed'} ++;
+    
+    return 1; # processed the file
+}
+
+
+# do plugin specific processing of doc_obj
+sub process {
+    my $self = shift (@_);
+    my ($textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    print STDERR "<Processing n='$file' p='OAIPlugin'>\n" if ($gli);
+    print $outhandle "OAIPlugin: processing $file\n"
+	if $self->{'verbosity'} > 1;
+
+    my $cursection = $doc_obj->get_top_section();
+
+##    $self->extract_metadata ($textref, $metadata, $doc_obj, $cursection);
+
+    # add text to document object
+
+#    $$textref =~ s/<(.*?)>/$1 /g;
+    $$textref =~ s/</&lt;/g;
+    $$textref =~ s/>/&gt;/g;
+    $$textref =~ s/\[/&#91;/g;
+    $$textref =~ s/\]/&#93;/g;
+
+    $doc_obj->add_utf8_text($cursection, $$textref);
+
+    return 1;
+}
+
+
+# Improvement is to merge this with newer version in MetadataPass
+
+sub open_prettyprint_metadata_table
+{
+    my $self = shift(@_);
+
+    my $att   = "width=100% cellspacing=2";
+    my $style = "style=\'border-bottom: 4px solid #000080\'";
+
+	$self->{'ppmd_table'} = "\n<table $att $style>";
+}
+
+sub add_prettyprint_metadata_line 
+{
+    my $self = shift(@_);
+    my ($metaname, $metavalue_utf8) = @_;
+
+    $metavalue_utf8 = &util::hyperlink_text($metavalue_utf8);
+
+    $self->{'ppmd_table'} .= "  <tr bgcolor=#b5d3cd>\n";
+    $self->{'ppmd_table'} .= "    <td width=30%>\n";
+    $self->{'ppmd_table'} .= "      $metaname\n";
+    $self->{'ppmd_table'} .= "    </td>\n";
+    $self->{'ppmd_table'} .= "    <td>\n";
+    $self->{'ppmd_table'} .= "      $metavalue_utf8\n";
+    $self->{'ppmd_table'} .= "    </td>\n";
+    $self->{'ppmd_table'} .= "  </tr>\n";
+
+}
+
+sub close_prettyprint_metadata_table
+{
+    my $self = shift(@_);
+
+    $self->{'ppmd_table'} .= "</table>\n";
+}
+
+my $qualified_dc_mapping = {
+    "alternative" => "dc.title",
+    "tableOfContents" => "dc.description",
+    "abstract" => "dc.description",
+    "created" => "dc.date",
+    "valid" => "dc.date",
+    "available" => "dc.date",
+    "issued" => "dc.date",
+    "modified" => "dc.date",
+    "dateAccepted" => "dc.date",
+    "dateCopyrighted" => "dc.date",
+    "dateSubmitted" => "dc.date",
+    "extent" => "dc.format",
+    "medium" => "dc.format",
+    "isVersionOf" => "dc.relation",
+    "hasVersion" => "dc.relation",
+    "isReplacedBy" => "dc.relation",
+    "replaces" => "dc.relation",
+    "isRequiredBy" => "dc.relation",
+    "requires" => "dc.relation",
+    "isPartOf" => "dc.relation",
+    "hasPart" => "dc.relation",
+    "isReferencedBy" => "dc.relation",
+    "references" => "dc.relation",
+    "isFormatOf" => "dc.relation",
+    "hasFormat" => "dc.relation",
+    "conformsTo" => "dc.relation",
+    "spatial" => "dc.coverage",
+    "temporal" => "dc.coverage",
+# these are now top level elements in our qualified dc metadata set
+#	"audience" => "dc.any",
+#	"accrualMethod" => "dc.any",
+#	"accrualPeriodicity" => "dc.any",
+#	"accrualPolicy" => "dc.any",
+#	"instructionalMethod" => "dc.any",
+#	"provenance" => "dc.any",
+#	"rightsHolder" => "dc.any",
+    "mediator" => "dc.audience",
+    "educationLevel" => "dc.audience",
+    "accessRights" => "dc.rights",
+    "license" => "dc.rights",
+    "bibliographicCitation" => "dc.identifier"
+    };
+
+sub remap_dc_metadata
+{
+    my $self = shift(@_);
+
+    my ($metaname) = @_;
+
+    my ($prefix,$name) = ($metaname =~ m/^(.*?)\.(.*?)$/);
+    
+    if (defined $qualified_dc_mapping->{$name}) {
+	
+	return $qualified_dc_mapping->{$name}."^".$name;
+    }
+    
+    
+    return $metaname; # didn't get a match, return param passed in unchanged
+}
+
+
+sub extract_oai_metadata {
+    my $self = shift (@_);
+    my ($textref, $metadata) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    $self->open_prettyprint_metadata_table();
+
+    if ($$textref =~ m/<metadata\s*>(.*?)<\/metadata\s*>/s)
+    {
+	my $metadata_text = $1;
+
+	# locate and remove outermost tag (ignoring any attribute information in top-level tag)
+	my ($outer_tagname,$inner_metadata_text) = ($metadata_text =~ m/<([^ >]+).*?>(.*?)<\/\1>/s);
+	# split tag into namespace and tag name
+	my($namespace,$top_level_prefix) = ($outer_tagname =~ m/^(.*?):(.*?)$/);
+	# sometimes, the dc namespace is not specified as the prefix in each element (like <dc:title>)
+	# but is rather defined in the wrapper element containing the various dc meta elements,
+	# like <dc><title></title><creator></creator></dc>.
+	# In such a case, we use this wrapper element as the top_level_prefix
+	
+	# if there was no prefix, then the tag itself becomes the top_level_prefix
+	if(!defined $top_level_prefix && defined $outer_tagname) {
+	    $top_level_prefix = $outer_tagname;
+	}
+
+	#process each element one by one
+	while ($inner_metadata_text =~ m/<([^ >]+).*?>(.*?)<\/\1>(.*)/s)
+	{
+
+	    my $metaname = $1;
+	    my $metavalue = $2;
+	    $inner_metadata_text = $3;
+
+	    # greenstone uses . for namespace, while oai uses :
+	    $metaname =~ s/:/\./;
+	    # if there is no namespace, then we use the outer tag name or 
+	    # namespace for this element
+	    if ($metaname !~ m/\./)
+	    {
+		$metaname = "$top_level_prefix.$metaname";
+	    }
+	    
+	    # if metadata set is auto, leave as is, otherwise convert to 
+	    # specified namespace
+	    if ($self->{'metadata_set'} ne "auto") {
+		if ($metaname !~ /^gi\./) { # hack to not overwrite gi metadata
+		    $metaname =~ s/^([^\.]*)\./$self->{'metadata_set'}\./;
+		    if ($self->{'metadata_set'} eq "dc") {
+			# convert qualified dc terms to gs version, e.g.
+			# spatial becomes coverage^spatial
+			$metaname = $self->remap_dc_metadata($metaname);
+		    }
+		}
+	    }
+
+	    # uppercase the first char of the name
+	    $metaname =~ s/\.(.)/\.\u$1/;
+	    $metavalue =~ s/\[/&#91;/g;
+	    $metavalue =~ s/\]/&#93;/g;
+
+	    # so that GLI can see this metadata, store here as ex.dc.Title etc
+	    my $ex_metaname = $metaname;
+	    $ex_metaname =~ s/^ex\.//; # remove any pre-existing ex. prefix
+	    $ex_metaname = "ex.$ex_metaname"; # at last can prefix ex.
+
+	    if (defined $metadata->{$ex_metaname})
+	    {
+		push(@{$metadata->{$ex_metaname}},$metavalue);
+
+	    }
+	    else
+	    {
+		$metadata->{$ex_metaname} = [ $metavalue ];
+	    }
+
+	    # but don't add ex to the pretty print line
+	    $self->add_prettyprint_metadata_line($metaname, $metavalue);
+	    
+	}
+    }
+
+    $self->close_prettyprint_metadata_table();
+}
+
+## we know from the file extension, so doesn't need to check the doctype
+sub check_doctype {
+
+    return 1;
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/OggVorbisPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/OggVorbisPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/OggVorbisPlugin.pm	(revision 24799)
@@ -0,0 +1,154 @@
+###########################################################################
+#
+# OggVorbisPlug.pm -- A plugin for Ogg Vorbis audio files
+#
+# Original code by Christy Kuo
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright 1999-2004 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package OggVorbisPlugin;
+
+
+use BasePlugin;
+use Ogg::Vorbis::Header::PurePerl;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+no strict 'subs';
+
+sub BEGIN {
+    @OggVorbisPlugin::ISA = ('BasePlugin');
+}
+
+
+my $arguments =
+    [ { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "string",
+	'deft' => &get_default_process_exp(),
+	'reqd' => "no" },
+      { 'name' => "add_technical_metadata",
+	'desc' => "{OggVorbisPlugin.add_technical_metadata}",
+	'type' => "flag",
+	'deft' => "" }, 
+      { 'name' => "file_rename_method",
+	'desc' => "{BasePlugin.file_rename_method}",
+	'type' => "enum",
+	'deft' => &get_default_file_rename_method(), # by default rename imported files and assoc files using this encoding
+	'list' => $BasePlugin::file_rename_method_list,
+	'reqd' => "no"
+      } ];
+
+my $options = { 'name'     => "OggVorbisPlugin",
+		'desc'     => "{OggVorbisPlugin.desc}",
+		'inherits' => "yes",
+		'abstract' => "no",
+		'args'     => $arguments };
+
+
+# This plugin processes exported Ogg Vorbis files with the suffix ".ogg"
+sub get_default_process_exp
+{
+    return q^(?i)(\.ogg)$^;
+}
+
+# rename imported media files using base64 encoding by default
+# so that the urls generated will always work with external apps
+sub get_default_file_rename_method() {
+    return "base64";
+}
+
+sub new
+{
+    my ($class) = shift(@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+    
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+    
+    my $self = new BasePlugin($pluginlist, $inputargs, $hashArgOptLists);
+    
+    return bless $self, $class;
+}
+
+# we don't want to hash on the file
+sub get_oid_hash_type {
+    my $self = shift (@_);
+    return "hash_on_ga_xml";
+}
+
+sub process
+{
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+
+    my ($filename_full_path, $filename_no_path) = &util::get_full_filenames($base_dir, $file);
+
+    my $top_section = $doc_obj->get_top_section();
+    # Extract metadata
+    my $ogg = Ogg::Vorbis::Header::PurePerl->new($filename_full_path);
+
+    # Comments added to the file
+    foreach my $key ($ogg->comment_tags())
+    {
+	# Convert key to title case
+	my $keytc = uc(substr($key, 0, 1)) . substr($key, 1, length($key));
+	foreach my $value ($ogg->comment($key))
+	{
+	    if (defined $value && $value ne "") {
+		$doc_obj->add_metadata($top_section, $keytc, $value);
+	    }
+	}
+    }
+
+    # Technical data (optional)
+    if ($self->{'add_technical_metadata'}) {
+	foreach my $key (keys %{$ogg->info})
+	{
+	    # Convert key to title case
+	    my $keytc = uc(substr($key, 0, 1)) . substr($key, 1, length($key));
+	    my $value = $ogg->info->{$key};
+	    if (defined $value && $value ne "") {
+		$doc_obj->add_metadata($top_section, $keytc, $value);
+	    }
+	}
+    }
+
+    $doc_obj->add_metadata ($top_section, "FileFormat", "OggVorbis");
+    # srclink_file is now deprecated because of the "_" in the metadataname. Use srclinkFile
+    $doc_obj->add_metadata ($top_section, "srclink_file", $doc_obj->get_sourcefile());
+    $doc_obj->add_metadata ($top_section, "srclinkFile", $doc_obj->get_sourcefile());
+    $doc_obj->add_metadata ($top_section, "srcicon", "_iconogg_");
+
+    # add dummy text and NoText metadata which can be used to suppress the dummy text
+    $self->add_dummy_text($doc_obj, $top_section);
+
+    # Add the actual file as an associated file
+    my $assoc_file = $doc_obj->get_assocfile_from_sourcefile();
+    $doc_obj->associate_file($filename_full_path, $assoc_file, "VORBIS", $top_section);
+
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/OpenDocumentPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/OpenDocumentPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/OpenDocumentPlugin.pm	(revision 24799)
@@ -0,0 +1,315 @@
+###########################################################################
+#
+# OpenDocumentPlugin.pm -- The Open Document plugin
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2001 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# Processes OASIS Open Document format.
+# Word processing document: .odt, template: .ott 
+# Spreadsheet document: .ods, template: .ots
+# Presentation document: .odp, template: .otp
+# Graphics document: .odg, template: .otg
+# Formulas document: .odf, template: .otf (not supported)
+
+#This basically extracts any text out of the document, but not much else. 
+
+# this inherits ReadXMLFile, and therefore offers -xslt option, but does
+# nothing with it.
+
+package OpenDocumentPlugin;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+use ReadXMLFile;
+use XML::XPath;
+use XML::XPath::XMLParser;
+use Cwd;
+use util;
+use ghtml;
+
+sub BEGIN {
+    @OpenDocumentPlugin::ISA = ('ReadXMLFile');
+}
+
+our @filesProcess = ( "content.xml" , "meta.xml" );
+
+my $arguments = [
+		 { 'name' => "process_exp",
+		   'desc' => "{BasePlugin.process_exp}",
+		   'type' => "regexp",
+		   'deft' =>  &get_default_process_exp() }
+		 ];
+
+my $options = { 'name'     => "OpenDocumentPlugin",
+		'desc'     => "{OpenDocumentPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments};
+
+sub get_default_process_exp { return q^(?i)\.o(?:d|t)(?:t|s|p|g)$^; }
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new ReadXMLFile($pluginlist, $inputargs, $hashArgOptLists);
+
+    $self->{'section'} = "";
+    $self->{'office:meta'} = "";
+    
+    return bless $self, $class;
+}
+
+# want to use BasePlugin's version of this, not ReadXMLFile's
+sub can_process_this_file {
+    my $self = shift(@_);
+    
+    return $self->BasePlugin::can_process_this_file(@_);
+}
+
+sub get_doctype {
+    my $self = shift(@_);
+    
+    return "manifest:manifest";
+}
+
+sub xml_doctype {
+    my $self = shift(@_);
+    my ($expat, $name, $sysid, $pubid, $internal) = @_;
+    die "The only valid doctype is manifest, $name is not valid" if ($name ne "manifest:manifest");
+}
+
+# Called for every start tag. The $_ variable will contain a copy of the
+# tag and the %_ variable will contain the element's attributes.
+sub xml_start_tag {
+    my $self = shift(@_);
+    my ($expat, $element) = @_;
+    my %atts  = %_;
+    $self->{'office:meta'} = $element if $self->{'office:meta'} eq "Start";
+    if($element eq 'office:text') {
+	$self->{'collectedText'} = "";
+    }elsif($element eq 'office:meta') {
+	$self->{'collectedText'} = "";
+	$self->{'office:meta'} = "Start";
+    }elsif($element eq 'meta:document-statistic'){
+	foreach my $att (keys %atts) {
+	    $self->{'doc_obj'}->add_utf8_metadata("",$att,$atts{$att});
+	}
+	
+    }
+}
+
+sub xml_end_tag {
+    my $self = shift(@_);
+    my ($expat, $element) = @_;
+    
+    if($element eq 'office:text') {
+	$self->{'doc_obj'}->add_utf8_text("",$self->{'collectedText'});
+	$self->{'collectedText'} = "";
+    }elsif($element eq $self->{'office:meta'}) {
+	if( $self->{'collectedText'} ne "") {
+	    $self->{'doc_obj'}->add_utf8_metadata("",$self->{'office:meta'},$self->{'collectedText'});
+	    $self->{'doc_obj'}->add_utf8_metadata("","Title",$self->{'collectedText'}) if $self->{'office:meta'} =~ m/:title$/;
+	    $self->{'doc_obj'}->add_utf8_metadata("","Language",$self->{'collectedText'}) if $self->{'office:meta'} =~ m/:language$/;
+	    $self->{'doc_obj'}->add_utf8_metadata("","GENERATOR",$self->{'collectedText'}) if $self->{'office:meta'} =~ m/:generator$/;
+	    
+    	}
+	$self->{'collectedText'} = "";
+        $self->{'office:meta'} = "Start";
+    }elsif($element eq 'office:meta'){
+	$self->{'office:meta'} = "";
+    }elsif($element eq 'office:body'){
+	#some documents have text in other places that should probably be indexed if we can't find any doc text
+	
+	if( defined $self->{'collectedText'} && $self->{'collectedText'} ne "" && $self->{'doc_obj'}->get_text("") eq "") {
+	    $self->{'doc_obj'}->add_utf8_text("",$self->{'collectedText'});
+	}
+    }
+}
+
+sub xml_text {
+    my $self = shift(@_);
+    my ($expat) = @_;
+    if($_ =~ m/\w/i) {
+	$self->{'collectedText'} .= "<br/>" if $self->{'collectedText'} ne "";
+	$self->{'collectedText'} .= "$_";
+    }
+}
+
+#trap start and end document so we do not get our doc_obj closed too soon
+sub xml_start_document {}
+sub xml_end_document {}
+
+sub read {
+    my $self = shift (@_);  
+   
+    my ($pluginfo, $base_dir, $file, $block_hash, $metadata, $processor, $maxdocs, $total_count, $gli) = @_;
+
+    # can we process this file??
+    my ($filename_full_path, $filename_no_path) = &util::get_full_filenames($base_dir, $file);
+    return undef unless $self->can_process_this_file($filename_full_path);
+
+    my $outhandle = $self->{'outhandle'};
+    # Report that we're processing the file
+    print STDERR "<Processing n='$file' p='OpenDocumentPlugin'>\n" if ($gli);
+    print $outhandle "OpenDocumentPlugin: processing $file\n"
+  	if ($self->{'verbosity'}) > 1;
+
+    $file =~ s/^[\/\\]+//; # $file often begins with / so we'll tidy it up
+    $self->{'file'} = $file;
+    $self->{'filename'} = $filename_full_path;
+    $self->{'filename_no_path'} = $filename_no_path;
+    $self->{'processor'} = $processor;
+    $self->{'metadata'} = $metadata;
+    
+    eval{
+	my ($file_only) = $file =~ /([^\\\/]*)$/;
+	my $tmpdir = &util::get_tmp_filename ();
+	&util::mk_all_dir ($tmpdir);
+	
+	$self->open_document();
+	
+	# save current working directory
+	my $cwd = getcwd();
+	chdir ($tmpdir) || die "Unable to change to $tmpdir";
+	&util::cp ($filename_full_path, $tmpdir);
+	
+	$self->unzip ("\"$file_only\"");
+	foreach my $xmlFile (@OpenDocumentPlugin::filesProcess) {
+	    if (-e $xmlFile) {
+		$self->{'parser'}->parsefile($xmlFile);
+	    }
+	}
+	$self->close_document($filename_full_path,$file_only);
+	
+	chdir ($cwd) || die "Unable to change back to $cwd";
+	&util::rm_r ($tmpdir);
+	
+    };
+    
+    if ($@) {
+
+	# parsefile may either croak somewhere in XML::Parser (e.g. because
+	# the document is not well formed) or die somewhere in ReadXMLFile or a
+	# derived plugin (e.g. because we're attempting to process a
+	# document whose DOCTYPE is not meant for this plugin). For the
+	# first case we'll print a warning and continue, for the second
+	# we'll just continue quietly
+
+	print STDERR "**** Error is: $@\n";
+
+	my ($msg) = $@ =~ /Carp::croak\(\'(.*?)\'\)/;
+	if (defined $msg) {	
+	    my $plugin_name = ref ($self);
+	    print $outhandle "$plugin_name failed to process $file ($msg)\n";
+	}
+
+	# reset ourself for the next document
+	print STDERR "<ProcessingError n='$file'>\n" if ($gli);
+	return -1; # error during processing
+    }
+
+    return 1;
+}
+
+sub unzip {
+    my $self = shift (@_);
+    my ($file) = @_;
+
+    system ("unzip $file");
+    &util::rm ($file) if -e $file;
+}
+
+sub close_document() {
+    my $self = shift(@_);
+    my ($filename,$file_only) = @_;
+    
+    my $doc_obj = $self->{'doc_obj'};  
+    my $mimetype = $self->get_mimetype();
+
+    $file_only = $doc_obj->get_assocfile_from_sourcefile(); # url-encoded filename in archives
+    $doc_obj->associate_file($filename, $file_only, $mimetype, "");
+    $doc_obj->associate_file("Thumbnails/thumbnail.png", "thumbnail.png", "image/png", "");
+    my $doc_ext = $filename;
+    $doc_ext =~ s/.*\.od(.)/od$1/;
+    
+    # We use set instead of add here because we only want one value
+    $doc_obj->set_utf8_metadata_element("", "FileFormat", "Open Document");
+
+    #setup to doclink thingi
+    # srclink_file is now deprecated because of the "_" in the metadataname. Use srclinkFile
+    $doc_obj->add_metadata ("", "srclink_file", $doc_obj->get_sourcefile());
+    $doc_obj->add_metadata ("", "srclinkFile", $doc_obj->get_sourcefile());
+    $doc_obj->add_utf8_metadata ("", "srcicon",  "<img border=\"0\" align=\"absmiddle\" src=\"_httpprefix_/collect/[collection]/index/assoc/[assocfilepath]/thumbnail.png\" alt=\"View the Open document\" title=\"View the Open document\">"); 
+
+	my $plugin_filename_encoding = $self->{'filename_encoding'};
+    my $filename_encoding = $self->deduce_filename_encoding($file_only,$self->{'metadata'},$plugin_filename_encoding);
+
+    $self->set_Source_metadata($doc_obj, $filename, $filename_encoding);
+    $doc_obj->set_utf8_metadata_element("", "FileSize", (-s $filename));
+     
+    # include any metadata passed in from previous plugins 
+    # note that this metadata is associated with the top level section
+    $self->extra_metadata ($doc_obj, 
+			   $doc_obj->get_top_section(), 
+			   $self->{'metadata'});
+    
+    # add a Title if none has been found yet
+    $self->title_fallback($doc_obj,"",$file_only);
+   
+    # add an OID
+    $self->add_OID($doc_obj);
+    
+    $doc_obj->add_utf8_metadata("", "Plugin", "$self->{'plugin_type'}");
+
+    # process the document
+    $self->{'processor'}->process($doc_obj);
+    
+    $self->{'num_processed'} ++;
+    return 1;
+}
+
+sub get_mimetype(){
+    my $filename = "mimetype";
+    if (!open (FILEIN,"<$filename")){
+   	print STDERR "Warning: unable to open the $filename\n";
+	return "Unknown OpenDocument Format";
+    }
+    else {
+	my $text = "";
+	while (defined (my $line = <FILEIN>)) {
+	   $text .= $line;   
+	}
+	close(FILEIN);
+	return $text;
+    }
+}
+1;
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/PDFPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/PDFPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/PDFPlugin.pm	(revision 24799)
@@ -0,0 +1,435 @@
+###########################################################################
+#
+# PDFPlugin.pm -- reasonably with-it pdf plugin
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999-2001 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+package PDFPlugin;
+
+use strict;
+no strict 'refs'; # so we can use a var for filehandles (e.g. STDERR)
+
+use ReadTextFile;
+use unicode;
+
+use AutoLoadConverters;
+use ConvertBinaryFile;
+
+@PDFPlugin::ISA = ('ConvertBinaryFile', 'AutoLoadConverters', 'ReadTextFile');
+
+
+my $convert_to_list =
+    [ {	'name' => "auto",
+	'desc' => "{ConvertBinaryFile.convert_to.auto}" },
+      {	'name' => "html",
+	'desc' => "{ConvertBinaryFile.convert_to.html}" },
+      {	'name' => "text",
+	'desc' => "{ConvertBinaryFile.convert_to.text}" },
+      { 'name' => "pagedimg_jpg",
+	'desc' => "{ConvertBinaryFile.convert_to.pagedimg_jpg}"},
+      { 'name' => "pagedimg_gif",
+	'desc' => "{ConvertBinaryFile.convert_to.pagedimg_gif}"},
+      { 'name' => "pagedimg_png",
+	'desc' => "{ConvertBinaryFile.convert_to.pagedimg_png}"}, 
+      ];
+
+
+my $arguments = 
+    [
+     { 'name' => "convert_to",
+       'desc' => "{ConvertBinaryFile.convert_to}",
+       'type' => "enum",
+       'reqd' => "yes",
+       'list' => $convert_to_list, 
+       'deft' => "html" },	 
+     { 'name' => "process_exp",
+       'desc' => "{BasePlugin.process_exp}",
+       'type' => "regexp",
+       'deft' => &get_default_process_exp(),
+       'reqd' => "no" },
+     { 'name' => "block_exp",
+       'desc' => "{BasePlugin.block_exp}",
+       'type' => "regexp",
+       'deft' => &get_default_block_exp() },
+     { 'name' => "metadata_fields",
+       'desc' => "{HTMLPlugin.metadata_fields}",
+       'type' => "string",
+       'deft' => "Title,Author,Subject,Keywords" },
+      { 'name' => "metadata_field_separator",
+	'desc' => "{HTMLPlugin.metadata_field_separator}",
+	'type' => "string",
+	'deft' => "" },
+     { 'name' => "noimages",
+       'desc' => "{PDFPlugin.noimages}",
+       'type' => "flag" },
+     { 'name' => "allowimagesonly",
+       'desc' => "{PDFPlugin.allowimagesonly}",
+       'type' => "flag" },
+     { 'name' => "complex",
+       'desc' => "{PDFPlugin.complex}",
+       'type' => "flag" },
+     { 'name' => "nohidden",
+       'desc' => "{PDFPlugin.nohidden}",
+       'type' => "flag" },
+     { 'name' => "zoom",
+       'desc' => "{PDFPlugin.zoom}",
+       'deft' => "2",
+       'range' => "1,3", # actually the range is 0.5-3 
+       'type' => "int" },
+     { 'name' => "use_sections",
+       'desc' => "{PDFPlugin.use_sections}",
+       'type' => "flag" },
+     { 'name' => "description_tags",
+       'desc' => "{HTMLPlugin.description_tags}",
+       'type' => "flag" }
+     ];
+
+my $options = { 'name'     => "PDFPlugin",
+		'desc'     => "{PDFPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'srcreplaceable' => "yes", # Source docs in PDF can be replaced with GS-generated html		
+		'args'     => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@$inputargs,"-title_sub");
+    push(@$inputargs,'^(Page\s+\d+)?(\s*1\s+)?');
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $auto_converter_self = new AutoLoadConverters($pluginlist,$inputargs,$hashArgOptLists,["PDFBoxConverter"],1);
+    my $cbf_self = new ConvertBinaryFile($pluginlist, $inputargs, $hashArgOptLists);
+    my $self = BasePlugin::merge_inheritance($auto_converter_self, $cbf_self);
+    
+    if ($self->{'info_only'}) {
+	# don't worry about any options etc
+	return bless $self, $class;
+    }
+    
+    $self = bless $self, $class;
+    $self->{'file_type'} = "PDF";
+
+    # these are passed through to gsConvert.pl by ConvertBinaryFile.pm
+    my $zoom = $self->{"zoom"};
+    $self->{'convert_options'} = "-pdf_zoom $zoom";
+    $self->{'convert_options'} .= " -pdf_complex" if $self->{"complex"};
+    $self->{'convert_options'} .= " -pdf_nohidden" if $self->{"nohidden"};
+    $self->{'convert_options'} .= " -pdf_ignore_images" if $self->{"noimages"};
+    $self->{'convert_options'} .= " -pdf_allow_images_only" if $self->{"allowimagesonly"};
+
+    # check convert_to
+    if ($self->{'convert_to'} eq "text" && $ENV{'GSDLOS'} =~ /^windows$/i) {
+	print STDERR "Windows does not support pdf to text. PDFs will be converted to HTML instead\n";
+	$self->{'convert_to'} = "html";
+    }
+    elsif ($self->{'convert_to'} eq "auto") {
+	# choose html ?? is this the best option
+	$self->{'convert_to'} = "html";
+    }
+    # set convert_to_plugin and convert_to_ext
+    $self->set_standard_convert_settings();
+
+    my $secondary_plugin_name = $self->{'convert_to_plugin'};
+    my $secondary_plugin_options = $self->{'secondary_plugin_options'};
+
+    if (!defined $secondary_plugin_options->{$secondary_plugin_name}) {
+	$secondary_plugin_options->{$secondary_plugin_name} = [];
+    }
+    my $specific_options = $secondary_plugin_options->{$secondary_plugin_name};
+
+    # following title_sub removes "Page 1" added by pdftohtml, and a leading
+    # "1", which is often the page number at the top of the page. Bad Luck
+    # if your document title actually starts with "1 " - is there a better way?
+    push(@$specific_options , "-title_sub", '^(Page\s+\d+)?(\s*1\s+)?');
+    my $associate_tail_re = $self->{'associate_tail_re'};
+    if ((defined $associate_tail_re) && ($associate_tail_re ne "")) {
+	push(@$specific_options, "-associate_tail_re", $associate_tail_re);
+    }
+    push(@$specific_options, "-file_rename_method", "none");
+    
+    if ($secondary_plugin_name eq "HTMLPlugin") {
+	# pdftohtml always produces utf8 - What about pdfbox???
+	# push(@$specific_options, "-input_encoding", "utf8");
+	push(@$specific_options, "-extract_language") if $self->{'extract_language'};
+	push(@$specific_options, "-processing_tmp_files");
+	# Instruct HTMLPlug (when eventually accessed through read_into_doc_obj) 
+	# to extract these metadata fields from the HEAD META fields
+	if (defined $self->{'metadata_fields'} && $self->{'metadata_fields'} =~ /\S/) {
+	    push(@$specific_options,"-metadata_fields",$self->{'metadata_fields'});
+	} else {
+	    push(@$specific_options,"-metadata_fields","Title,GENERATOR,date,author<Creator>");
+	}
+	if (defined $self->{'metadata_field_separator'} && $self->{'metadata_field_separator'} =~ /\S/) {
+	    push(@$specific_options,"-metadata_field_separator",$self->{'metadata_field_separator'});
+	}
+	if ($self->{'use_sections'} || $self->{'description_tags'}) {
+	    $self->{'description_tags'} = 1;
+	    push(@$specific_options, "-description_tags");
+	}
+    }
+    elsif ($secondary_plugin_name eq "PagedImagePlugin") {
+	push(@$specific_options, "-screenviewsize", "1000");
+	push(@$specific_options, "-enable_cache");
+	push(@$specific_options, "-processing_tmp_files");
+    }
+
+    $self = bless $self, $class;
+    $self->load_secondary_plugins($class,$secondary_plugin_options,$hashArgOptLists);
+    return $self;
+}
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+    return q^(?i)\.pdf$^;
+}
+
+# so we don't inherit HTMLPlug's block exp...
+sub get_default_block_exp {
+    return "";
+}
+
+sub init {
+    my $self = shift (@_);
+
+    # ConvertBinaryFile init
+    $self->SUPER::init(@_);
+    $self->AutoLoadConverters::init(@_);
+
+}
+
+sub begin {
+    my $self = shift (@_);
+
+    $self->AutoLoadConverters::begin(@_);
+    $self->SUPER::begin(@_);
+
+}
+
+sub deinit {
+    my $self = shift (@_);
+    
+    $self->AutoLoadConverters::deinit(@_);
+    $self->SUPER::deinit(@_);
+
+}
+  
+# By setting hashing to be on ga xml this ensures that two 
+# PDF files that are identical except for the metadata
+# to hash to different values. Without this, when each PDF
+# file is converted to HTML there is a chance that they 
+# will both be *identical* if the conversion utility does
+# not embed the metadata in the generated HTML. This is
+# certainly the case when PDFBOX is being used. 
+
+# This change makes this convert to based plugin more 
+# consistent with the original vision that the same document 
+# with different metadata should
+# be seen as different.
+
+sub get_oid_hash_type {
+    my $self = shift (@_);
+    return "hash_on_ga_xml";
+}
+  
+  
+sub tmp_area_convert_file {
+
+    my $self = shift (@_);
+    return $self->AutoLoadConverters::tmp_area_convert_file(@_);
+
+}
+
+sub convert_post_process
+{
+    my $self = shift (@_);
+    my ($conv_filename) = @_;
+
+    my $outhandle=$self->{'outhandle'};
+
+    #$self->{'input_encoding'} = "utf8"; # The output is always in utf8 (is it?? it is for html, but what about other types?)
+    #my ($language, $encoding) = $self->textcat_get_language_encoding ($conv_filename);
+
+    # read in file ($text will be in utf8)
+    my $text = "";
+    # encoding will be utf8 for html files - what about other types? will we do this step for them anyway?
+    $self->read_file ($conv_filename, "utf8", "", \$text);
+
+    # To support the use_sections option with PDFBox: Greenstone splits PDFs into pages for 
+    # sections. The PDFPlugin code wants each new page to be prefixed with <a name=pagenum></a>,
+    # which it then splits on to generate page-based sections. However, that's not what PDFBox 
+    # generates in its HTML output. Fortunately, PDFBox does have its own page-separator: it
+    # embeds each page in an extra div. The div opener is: 
+    # <div style=\"page-break-before:always; page-break-after:always\">
+    # The PDFPlugin now looks for this and prefixes <a name=0></a> to each such div. (The 
+    # pagenumber is fixed at 0 since I'm unable to work out how to increment the pagenum during 
+    # a regex substitution even with regex extensions on.) Later, when we process each section 
+    # to get the pagenum, PDFBox's output for this is pre-processed by having a loopcounter 
+    # that increments the pagenum for each subsequent section.
+
+    #$pdfbox_pageheader="\<div style=\"page-break-before:always; page-break-after:always\">";
+    my $loopcounter = 0; # used later on!
+    $text =~ s@\<div style=\"page-break-before:always; page-break-after:always\">@<a name=$loopcounter></a><div style=\"page-break-before:always; page-break-after:always\">@g;
+
+
+    # Calculate number of pages based on <a ...> tags (we have a <a name=1> etc
+    # for each page).  Metadata based on this calculation not set until process()
+    # 
+    # Note: this is done even if we are not breaking the document into pages as it might
+    # be useful to give an indication of document length in browser through setting
+    # num_pages as metadata.
+    my @pages = ($text =~ m/\<[Aa] name=\"?\w+\"?>/ig); #<div style=\"?page-break-before:always; page-break-after:always\"?>
+    my $num_pages = scalar(@pages);
+    $self->{'num_pages'} = $num_pages;
+
+    if ($self->{'use_sections'}
+	&& $self->{'converted_to'} eq "HTML") {
+
+	print $outhandle "PDFPlugin: Calculating sections...\n";
+
+	# we have "<a name=1></a>" etc for each page
+	# it may be <A name=
+	my @sections = split('<[Aa] name=', $text);
+
+	my $top_section = "";
+
+	if (scalar (@sections) == 1) { #only one section - no split!
+	    print $outhandle "PDFPlugin: warning - no sections found\n";
+	} else {
+	    $top_section .= shift @sections; # keep HTML header etc as top_section
+	}
+
+	# handle first section specially for title? Or all use first 100...
+	
+	my $title = $sections[0];
+	$title =~ s/^\"?\w+\"?>//; # specific for pdftohtml...
+	$title =~ s/<\/([^>]+)><\1>//g; # (eg) </b><b> - no space
+	$title =~ s/<[^>]*>/ /g;
+	$title =~ s/(?:&nbsp;|\xc2\xa0)/ /g; # utf-8 for nbsp...
+	$title =~ s/^\s+//s;
+	$title =~ s/\s+$//;
+	$title =~ s/\s+/ /gs;
+	$title =~ s/^$self->{'title_sub'}// if ($self->{'title_sub'});
+	$title =~ s/^\s+//s; # in case title_sub introduced any...
+	$title = substr ($title, 0, 100);
+	$title =~ s/\s\S*$/.../;
+
+
+	if (scalar (@sections) == 1) { # no sections found
+	    $top_section .= $sections[0];
+	    @sections=();
+	} else {
+	    $top_section .= "<!--<Section>\n<Metadata name=\"Title\">$title</Metadata>\n-->\n <!--</Section>-->\n";
+	}
+
+	# add metadata per section...
+	foreach my $section (@sections) {
+	    # section names are not always just digits, may be like "outline"
+	    $section =~ s@^\"?(\w+)\"?></a>@@; # leftover from split expression...
+
+	    $title = $1; # Greenstone does magic if sections are titled digits
+
+	    # A title of pagenum=0 means use_sections is being applied on output from PDFBox,
+	    # which didn't originally have a <a name=incremented pagenumber></a> to split each page. 
+	    # Our Perl code then prefixed <a name=0></a> to it. Now need to increment the pagenum here:
+	    if($loopcounter > 0 || ($title eq 0 && $loopcounter == 0)) { # implies use_sections with PDFBox
+		$title = ++$loopcounter;
+	    }
+
+	    if (! defined($title) ) {
+		print STDERR "no title: $section\n";
+		$title = " "; # get rid of the undefined warning in next line
+	    }
+	    my $newsection = "<!-- from PDFPlugin -->\n<!-- <Section>\n";
+	    $newsection .= "<Metadata name=\"Title\">" . $title
+		. "</Metadata>\n--><br />\n";
+	    $newsection .= $section;
+	    $newsection .= "<!--</Section>-->\n";
+	    $section = $newsection;
+	}
+
+	$text=join('', ($top_section, @sections));
+    }
+
+    if ($self->{'use_sections'}
+	&& $self->{'converted_to'} eq "text") {
+	print STDERR "**** When converting PDF to text, cannot apply use_sections\n";
+    }
+
+
+    # The following should no longer be needed, now that strings
+    # read in are Unicode aware (in the Perl sense) rather than
+    # raw binary strings that just happen to be UTF-8 compliant
+
+    # turn any high bytes that aren't valid utf-8 into utf-8.
+##    unicode::ensure_utf8(\$text);
+
+    # Write it out again!
+    $self->utf8_write_file (\$text, $conv_filename);
+}
+
+
+# do plugin specific processing of doc_obj for HTML type
+sub process {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+
+    my $result = $self->process_type($base_dir,$file,$doc_obj);
+
+    # fix up the extracted date metadata to be in Greenstone date format,
+    # and fix the capitalisation of 'date'
+    my $cursection = $doc_obj->get_top_section();
+    foreach my $datemeta (@{$doc_obj->get_metadata($cursection, "date")}) {
+	$doc_obj->delete_metadata($cursection, "date", $datemeta);
+
+	# We're just interested in the date bit, not the time
+	# some pdf creators (eg "Acrobat 5.0 Scan Plug-in for Windows")
+	# set a /CreationDate, and set /ModDate to 000000000. pdftohtml
+	# extracts the ModDate, so it is 0...
+	$datemeta =~ /(\d+)-(\d+)-(\d+)/;
+	my ($year, $month, $day) = ($1,$2,$3);
+	if (defined($year) && defined($month) && defined($day)) {
+	    if ($year == 0) {next}
+	    if ($year < 100) {$year += 1900} # just to be safe
+	    if ($month =~ /^\d$/) {$month="0$month"} # single digit
+	    if ($day =~ /^\d$/) {$day="0$day"} # single digit
+	    my $date="$year$month$day";
+	    $doc_obj->add_utf8_metadata($cursection, "Date", $date);
+	}
+    }
+
+    $doc_obj->add_utf8_metadata($cursection, "NumPages", $self->{'num_pages'}) if defined $self->{'num_pages'};
+    
+    if ($self->{'use_sections'} && $self->{'converted_to'} eq "HTML") {
+	# we explicitly make it a paged document, cos greenstone won't get it
+	# right if any section has an empty title, or one with letters in it
+	$doc_obj->set_utf8_metadata_element ($cursection, "gsdlthistype", "Paged");
+    }
+
+    return $result;
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/PagedImagePlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/PagedImagePlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/PagedImagePlugin.pm	(revision 24799)
@@ -0,0 +1,761 @@
+###########################################################################
+#
+# PagedImagePlugin.pm -- plugin for sets of images and OCR text that
+#  make up a document
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# PagedImagePlugin
+# processes sequences of images, with optional OCR text
+#
+# This plugin takes *.item files, which contain metadata and lists of image 
+# files, and produces a document containing sections, one for each page.
+# The files should be named something.item, then you can have more than one 
+# book in a directory. You will need to create these files, one for each
+# document/book.
+#
+#There are two formats for the item files: a plain text format, and an xml 
+#format. You can use either format, and can have both formats in the same 
+#collection if you like. If you use the plain format, you must not start the 
+#file off with <PagedDocument>
+
+#### PLAIN FORMAT
+# The format of the xxx.item file is as follows:
+# The first lines contain any metadata for the whole document
+# <metadata-name>metadata-value
+# eg.
+# <Title>Snail farming
+# <Date>19230102
+# Then comes a list of pages, one page per line, each line has the format
+#
+# pagenum:imagefile:textfile:r
+#
+# page num and imagefile are required. pagenum is used for the Title 
+# of the section, and in the display is shown as page <pagenum>. 
+# imagefile is the image for the page. textfile is an optional text 
+# file containing the OCR (or any) text for the page - this gets added 
+# as the text for the section. r is optional, and signals that the image 
+# should be rotated 180deg. Eg use this if the image has been made upside down.
+# So an example item file looks like:
+# <Title>Snail farming
+# <Date>19960403
+# 1:p1.gif:p1.txt:
+# 2:p2.gif::
+# 3:p3.gif:p3.txt:
+# 3b:p3b.gif:p3b.txt:r
+# The second page has no text, the fourth page is a back page, and 
+# should be rotated.
+# 
+
+#### XML FORMAT
+# The xml format looks like the following
+#<PagedDocument>
+#<Metadata name="Title">The Title of the entire document</Metadata>
+#<Page pagenum="1" imgfile="xxx.jpg" txtfile="yyy.txt">
+#<Metadata name="Title">The Title of this page</Metadata>
+#</Page>
+#... more pages
+#</PagedDocument>
+#PagedDocument contains a list of Pages, Metadata and PageGroups. Any metadata 
+#that is not inside another tag will belong to the document.
+#Each Page has a pagenum (not used at the moment), an imgfile and/or a txtfile.
+#These are both optional - if neither is used, the section will have no content.
+#Pages can also have metadata associated with them.
+#PageGroups can be introduced at any point - they can contain Metadata and Pages and other PageGroups. They are used to introduce hierarchical structure into the document.
+#For example
+#<PagedDocument>
+#<PageGroup>
+#<Page>
+#<Page>
+#</PageGroup>
+#<Page>
+#</PagedDocument>
+#would generate a structure like
+#X
+#--X
+#  --X
+#  --X
+#--X
+#PageGroup tags can also have imgfile/textfile metadata if you like - this way they get some content themselves.
+
+#Currently the XML structure doesn't work very well with the paged document type, unless you use numerical Titles for each section.
+#There is still a bit of work to do on this format:
+#* enable other text file types, eg html, pdf etc
+#* make the document paging work properly
+#* add pagenum as Title unless a Title is present?
+
+# All the supplemetary image amd text files should be in the same folder as 
+# the .item file.
+#
+# To display the images instead of the document text, you can use [srcicon] 
+# in the DocumentText format statement.
+# For example, 
+#
+# format DocumentText "<center><table width=_pagewidth_><tr><td>[srcicon]</td></tr></table></center>"
+#
+# To have it create thumbnail size images, use the '-create_thumbnail' option.
+# To have it create medium size images for display, use the '-create_screenview'
+# option. As usual, running 
+# 'perl -S pluginfo.pl PagedImagePlugin' will list all the options.
+
+# If you want the resulting documents to be presented with a table of 
+# contents, use '-documenttype hierarchy', otherwise they will have 
+# next and previous arrows, and a goto page X box. 
+
+# If you have used -create_screenview, you can also use [screenicon] in the format
+# statement to display the smaller image.  Here is an example  that switches 
+# between the two: 
+#
+# format DocumentText "<center><table width=_pagewidth_><tr><td>{If}{_cgiargp_ eq full,<a href='_httpdocument_&d=_cgiargd_&p=small'>Switch to small version.</a>,<a href='_httpdocument_&d=_cgiargd_&p=full'>Switch to fullsize version</a>}</td></tr><tr><td>{If}{_cgiargp_ eq full,<a href='_httpdocument_&d=_cgiargd_&p=small' title='Switch to small version'>[srcicon]</a>,<a href='_httpdocument_&d=_cgiargd_&p=full' title='Switch to fullsize version'>[screenicon]</a>}</td></tr></table></center>"
+#
+# Additional metadata can be added into the .item files, alternatively you can 
+# use normal metadata.xml files, with the name of the xxx.item file as the 
+# FileName (only for document level metadata).
+
+package PagedImagePlugin;
+
+use Encode;
+use ReadXMLFile;
+use ReadTextFile;
+use ImageConverter;
+use MetadataRead;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+sub BEGIN {
+    @PagedImagePlugin::ISA = ('MetadataRead', 'ReadXMLFile', 'ReadTextFile', 'ImageConverter');
+}
+
+my $type_list =
+    [ { 'name' => "paged",
+        'desc' => "{PagedImagePlugin.documenttype.paged}" },
+      { 'name' => "hierarchy",
+        'desc' => "{PagedImagePlugin.documenttype.hierarchy}" } ];
+
+my $arguments =
+    [ { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "string",
+	'deft' => &get_default_process_exp(),
+	'reqd' => "no" },
+      { 'name' => "title_sub",
+	'desc' => "{HTMLPlugin.title_sub}",
+	'type' => "string", 
+	'deft' => "" },
+      { 'name' => "headerpage",
+	'desc' => "{PagedImagePlugin.headerpage}",
+	'type' => "flag",
+	'reqd' => "no" },
+      { 'name' => "documenttype",
+	'desc' => "{PagedImagePlugin.documenttype}",
+	'type' => "enum",
+	'list' => $type_list,
+	'deft' => "paged",
+	'reqd' => "no" },
+      {'name' => "processing_tmp_files",
+       'desc' => "{BasePlugin.processing_tmp_files}",
+       'type' => "flag",
+       'hiddengli' => "yes"}
+];
+
+
+my $options = { 'name'     => "PagedImagePlugin",
+		'desc'     => "{PagedImagePlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+    
+    my $imc_self = new ImageConverter($pluginlist, $inputargs, $hashArgOptLists);
+    my $rtf_self = new ReadTextFile($pluginlist, $inputargs, $hashArgOptLists, 1);
+    my $rxf_self = new ReadXMLFile($pluginlist, $inputargs, $hashArgOptLists);
+
+    my $self = BasePlugin::merge_inheritance($imc_self,$rtf_self,$rxf_self);
+
+    # Update $self used by XML::Parser so it finds callback functions 
+    # such as start_document here and not in ReadXMLFile (which is what
+    # $self was when new XML::Parser was done)
+    #
+    # If the $self returned by this constructor is the same as the one
+    # used in ReadXMLFile (e.g. in the GreenstoneXMLPlugin) then this step isn't necessary
+    #
+    # Consider embedding this type of assignment into merge_inheritance
+    # to help catch all cases?
+
+    $rxf_self->{'parser'}->{'PluginObj'} = $self;
+
+    return bless $self, $class;
+}
+
+
+sub init {
+    my $self = shift (@_);
+    my ($verbosity, $outhandle, $failhandle) = @_;
+
+    $self->SUPER::init(@_);
+    $self->ImageConverter::init();
+}
+
+sub begin {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $processor, $maxdocs) = @_;
+
+    $self->SUPER::begin(@_);
+    $self->ImageConverter::begin(@_);
+}
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+    return q^\.item$^;
+}
+
+sub get_doctype {
+    my $self = shift(@_);
+    
+    return "PagedDocument";
+}
+
+
+# want to use BasePlugin's version of this, not ReadXMLFile's
+sub can_process_this_file {
+    my $self = shift(@_);
+    return $self->BasePlugin::can_process_this_file(@_);
+}
+
+# instead of a block exp, now we scan the file and record all text and img files mentioned there for blocking.
+sub store_block_files
+{
+    my $self = shift (@_);
+    my ($filename_full_path, $block_hash) = @_;
+
+    my $xml_version = $self->is_xml_item_file($filename_full_path);
+    
+    # do we need to do this? 
+    # does BOM interfere just with XML parsing? In that case don't need it here
+    # if we do it here, we are modifying the file before we have worked out if
+    # its new or not, so it will always be reimported.
+    #$self->tidy_item_file($filename_full_path);
+
+    my ($dir, $file) = $filename_full_path =~ /^(.*?)([^\/\\]*)$/;
+    if ($xml_version) {
+
+	# do something
+	$self->scan_xml_for_files_to_block($filename_full_path, $dir, $block_hash);
+    } else {
+	
+	$self->scan_item_for_files_to_block($filename_full_path, $dir, $block_hash);
+    }
+	
+}
+
+# we want to use BasePlugin's read, not ReadXMLFile's
+sub read
+{
+    my $self = shift (@_);
+
+    $self->BasePlugin::read(@_);
+}
+
+
+
+sub read_into_doc_obj {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $block_hash, $metadata, $processor, $maxdocs, $total_count, $gli) = @_;
+    my $outhandle = $self->{'outhandle'};
+    my $verbosity = $self->{'verbosity'};
+    
+    my ($filename_full_path, $filename_no_path) = &util::get_full_filenames($base_dir, $file);
+
+    print $outhandle "PagedImagePlugin processing \"$filename_full_path\"\n"
+	if $verbosity > 1;
+    print STDERR "<Processing n='$file' p='PagedImagePlugin'>\n" if ($gli);
+    
+    $self->{'MaxImageWidth'} = 0;
+    $self->{'MaxImageHeight'} = 0;
+    
+    # here we need to decide if we have an old text .item file, or a new xml 
+    # .item file
+    my $xml_version = $self->is_xml_item_file($filename_full_path);
+
+    $self->tidy_item_file($filename_full_path);
+    
+    my $doc_obj;
+    if ($xml_version) {
+	# careful checking needed here!! are we using local xml handlers or super ones
+	$self->ReadXMLFile::read($pluginfo, $base_dir, $file, $block_hash, $metadata, $processor, $maxdocs, $total_count, $gli);
+	$doc_obj = $self->{'doc_obj'};
+    } else {
+	my ($dir);
+	($dir, $file) = $filename_full_path =~ /^(.*?)([^\/\\]*)$/;
+
+	#process the .item file
+	$doc_obj = $self->process_item($filename_full_path, $dir, $file, $processor, $metadata);
+	
+    }
+
+    my $section = $doc_obj->get_top_section();
+        
+    $doc_obj->add_utf8_metadata($section, "Plugin", "$self->{'plugin_type'}");
+    $doc_obj->add_metadata($section, "FileFormat", "PagedImage");
+
+    # include any metadata passed in from previous plugins 
+    # note that this metadata is associated with the top level section
+    $self->add_associated_files($doc_obj, $filename_full_path);
+    $self->extra_metadata ($doc_obj, $section, $metadata);
+    $self->auto_extract_metadata ($doc_obj);
+
+    # if we haven't found any Title so far, assign one
+    $self->title_fallback($doc_obj,$section,$filename_no_path);
+
+    $self->add_OID($doc_obj);
+    return (1,$doc_obj);
+}
+
+# for now, the test is if the first non-empty line is <PagedDocument>, then its xml
+sub is_xml_item_file {
+    my $self = shift(@_);
+    my ($filename) = @_;
+
+    my $xml_version = 0;
+    open (ITEMFILE, $filename) || die "couldn't open $filename\n";
+
+    my $line = "";
+    my $num = 0;
+
+    $line = <ITEMFILE>;
+    while (defined ($line) && ($line !~ /\w/)) {
+	$line = <ITEMFILE>;
+    }
+
+    if (defined $line) {
+	chomp $line;
+	if ($line =~ /<PagedDocument/) {
+	    $xml_version = 1;
+	}
+    } 
+
+    close ITEMFILE; 
+    return $xml_version;
+}
+
+sub tidy_item_file {
+    my $self = shift(@_);
+    my ($filename) = @_;
+
+    open (ITEMFILE, $filename) || die "couldn't open $filename\n";
+    my $backup_filename = "backup.item";
+    open (BACKUP,">$backup_filename")|| die "couldn't write to $backup_filename\n";
+    my $line = "";
+    $line = <ITEMFILE>;
+    $line =~ s/^\xEF\xBB\xBF//; # strip BOM
+    $line =~ s/\x0B+//ig;
+    $line =~ s/&/&amp;/g;
+    print BACKUP ($line);
+    #Tidy up the item file some metadata title contains \vt-vertical tab
+    while ($line = <ITEMFILE>) {
+	$line =~ s/\x0B+//ig;
+	$line =~ s/&/&amp;/g;
+	print BACKUP ($line);
+    }
+    close ITEMFILE;
+    close BACKUP;
+    &File::Copy::copy ($backup_filename, $filename);
+    &util::rm($backup_filename);
+
+}
+
+sub rotate_image {
+    my $self = shift (@_);
+    my ($filename_full_path) = @_;
+    
+    my ($this_filetype) = $filename_full_path =~ /\.([^\.]*)$/;
+    my $result = $self->convert($filename_full_path, $this_filetype, "-rotate 180", "ROTATE");
+    my ($new_filename) = ($result =~ /=>(.*\.$this_filetype)/);
+    if (-e "$new_filename") {
+	return $new_filename;
+    }
+    # somethings gone wrong
+    return $filename_full_path;
+
+}
+
+sub process_image {
+    my $self = shift(@_);
+    my ($filename_full_path, $filename_no_path, $doc_obj, $section, $rotate) = @_;
+    # check the filenames
+    return 0 if ($filename_no_path eq "" || !-f $filename_full_path);
+ 
+    # remember that this image file was one of our source files, but only 
+    # if we are not processing a tmp file
+    if (!$self->{'processing_tmp_files'} ) {
+	$doc_obj->associate_source_file($filename_full_path);
+    }
+    # do rotation
+    if  ((defined $rotate) && ($rotate eq "r")) {
+	# we get a new temporary file which is rotated
+	$filename_full_path = $self->rotate_image($filename_full_path);
+    }
+    
+    # do generate images
+    my $result = 0;
+    if ($self->{'image_conversion_available'} == 1) {
+	# do we need to convert $filename_no_path to utf8/url encoded? 
+	# We are already reading in from a file, what encoding is it in???
+	my $url_encoded_full_filename 
+	    = &unicode::raw_filename_to_url_encoded($filename_full_path);
+	$result = $self->generate_images($filename_full_path, $url_encoded_full_filename, $doc_obj, $section);
+    }
+    #overwrite one set in ImageConverter
+    $doc_obj->set_metadata_element ($section, "FileFormat", "PagedImage");
+    return $result;
+}
+
+
+sub xml_start_tag {
+    my $self = shift(@_);
+    my ($expat, $element) = @_;
+    $self->{'element'} = $element;
+    
+    my $doc_obj = $self->{'doc_obj'};
+    if ($element eq "PagedDocument") {
+	$self->{'current_section'} = $doc_obj->get_top_section();
+    } elsif ($element eq "PageGroup" || $element eq "Page") {
+	# create a new section as a child
+	$self->{'current_section'} = $doc_obj->insert_section($doc_obj->get_end_child($self->{'current_section'}));
+	$self->{'num_pages'}++;
+	# assign pagenum as  what??
+	my $pagenum = $_{'pagenum'}; #TODO!!
+	if (defined $pagenum) {
+	    $doc_obj->set_utf8_metadata_element($self->{'current_section'}, 'PageNum', $pagenum);
+	}
+	my ($imgfile) = $_{'imgfile'};
+	if (defined $imgfile) {
+	    # *****
+	    # What about support for rotate image (e.g. old ':r' notation)? 
+	    $self->process_image($self->{'xml_file_dir'}.$imgfile, $imgfile, $doc_obj, $self->{'current_section'});
+	}
+	my ($txtfile) = $_{'txtfile'};
+	if (defined($txtfile)&& $txtfile ne "") {
+	    $self->process_text ($self->{'xml_file_dir'}.$txtfile, $txtfile, $doc_obj, $self->{'current_section'});
+  	} else {
+	    $self->add_dummy_text($doc_obj, $self->{'current_section'});
+	}
+    } elsif ($element eq "Metadata") {
+	$self->{'metadata_name'} = $_{'name'};
+    }
+}
+
+sub xml_end_tag {
+    my $self = shift(@_);
+    my ($expat, $element) = @_;
+    
+    my $doc_obj = $self->{'doc_obj'};
+    if ($element eq "Page" || $element eq "PageGroup") {
+	# if Title hasn't been assigned, set PageNum as Title
+	if (!defined $doc_obj->get_metadata_element ($self->{'current_section'}, "Title") && defined $doc_obj->get_metadata_element ($self->{'current_section'}, "PageNum" )) {
+	    $doc_obj->add_utf8_metadata ($self->{'current_section'}, "Title", $doc_obj->get_metadata_element ($self->{'current_section'}, "PageNum" ));
+	}
+	# move the current section back to the parent
+	$self->{'current_section'} = $doc_obj->get_parent_section($self->{'current_section'});
+    } elsif ($element eq "Metadata") {
+	
+	# text read in by XML::Parser is in Perl's binary byte value
+	# form ... need to explicitly make it UTF-8		
+	my $meta_name = decode("utf-8",$self->{'metadata_name'});
+	my $metadata_value = decode("utf-8",$self->{'metadata_value'});
+	
+	if ($meta_name =~ /\./) {
+	    $meta_name = "ex.$meta_name";
+	}
+	
+	$doc_obj->add_utf8_metadata ($self->{'current_section'}, $meta_name, $metadata_value);
+	$self->{'metadata_name'} = "";
+	$self->{'metadata_value'} = "";
+
+    }
+    # otherwise we ignore the end tag
+}
+
+
+sub xml_text {
+    my $self = shift(@_);
+    my ($expat) = @_; 
+
+    if ($self->{'element'} eq "Metadata" && $self->{'metadata_name'}) {
+   	$self->{'metadata_value'} .= $_;
+    }
+}
+
+sub xml_doctype {
+}
+
+sub open_document {
+    my $self = shift(@_);
+    
+    # create a new document
+    $self->{'doc_obj'} = new doc ($self->{'filename'}, "indexed_doc", $self->{'file_rename_method'});
+    # TODO is file filenmae_no_path??
+    $self->set_initial_doc_fields($self->{'doc_obj'}, $self->{'filename'}, $self->{'processor'}, $self->{'metadata'});
+
+    my ($dir, $file) = $self->{'filename'} =~ /^(.*?)([^\/\\]*)$/;
+    $self->{'xml_file_dir'} = $dir;
+    $self->{'num_pages'} = 0;
+
+}
+
+sub close_document {
+    my $self = shift(@_);
+    my $doc_obj = $self->{'doc_obj'};
+    
+    # add numpages metadata
+    my $topsection = $doc_obj->get_top_section();
+
+    $doc_obj->set_utf8_metadata_element ($topsection, 'NumPages', $self->{'num_pages'});
+
+    $doc_obj->set_utf8_metadata_element($topsection,"MaxImageWidth",$self->{'MaxImageWidth'});
+    $doc_obj->set_utf8_metadata_element($topsection,"MaxImageHeight",$self->{'MaxImageHeight'});
+    $self->{'MaxImageWidth'} = undef;
+    $self->{'MaxImageHeight'} = undef;
+    
+}
+
+
+sub set_initial_doc_fields {
+    my $self = shift(@_);
+    my ($doc_obj, $filename_full_path, $processor, $metadata) = @_;
+
+    my $topsection = $doc_obj->get_top_section();
+
+    if ($self->{'documenttype'} eq 'paged') {
+	# set the gsdlthistype metadata to Paged - this ensures this document will
+	# be treated as a Paged doc, even if Titles are not numeric
+	$doc_obj->set_utf8_metadata_element ($topsection, "gsdlthistype", "Paged");
+    } else {
+	$doc_obj->set_utf8_metadata_element ($topsection, "gsdlthistype", "Hierarchy");
+    }
+
+    my $plugin_filename_encoding = $self->{'filename_encoding'};
+    my $filename_encoding = $self->deduce_filename_encoding($filename_full_path,$metadata,$plugin_filename_encoding);
+    $self->set_Source_metadata($doc_obj, $filename_full_path, $filename_encoding);
+   
+    # if we want a header page, we need to add some text into the top section, otherwise this section will become invisible
+    if ($self->{'headerpage'}) {
+	$self->add_dummy_text($doc_obj, $topsection);
+    }
+}
+
+sub scan_xml_for_files_to_block
+{
+    my $self = shift (@_);
+    my ($filename_full_path, $dir, $block_hash) = @_;
+
+    open (ITEMFILE, $filename_full_path) || die "couldn't open $filename_full_path to work out which files to block\n";
+    my $line = "";
+    while (defined ($line = <ITEMFILE>)) {
+	next unless $line =~ /\w/;
+
+	if ($line =~ /imgfile=\"([^\"]+)\"/) {
+	    &util::block_filename($block_hash,&util::filename_cat($dir,$1));
+	}
+	if ($line =~ /txtfile=\"([^\"]+)\"/) {
+	    &util::block_filename($block_hash,&util::filename_cat($dir,$1));
+	}
+    }
+    close ITEMFILE;
+    
+}
+
+sub scan_item_for_files_to_block
+{
+    my $self = shift (@_);
+    my ($filename_full_path, $dir, $block_hash) = @_;
+
+    open (ITEMFILE, $filename_full_path) || die "couldn't open $filename_full_path to work out which files to block\n";
+    my $line = "";
+    while (defined ($line = <ITEMFILE>)) {
+	next unless $line =~ /\w/;
+	chomp $line;
+	next if $line =~ /^#/; # ignore comment lines
+	next if ($line =~ /^<([^>]*)>\s*(.*?)\s*$/); # ignore metadata lines 
+	# line should be like page:imagefilename:textfilename:r 
+	$line =~ s/^\s+//; #remove space at the front
+	$line =~ s/\s+$//; #remove space at the end
+	my ($pagenum, $imgname, $txtname, $rotate) = split /:/, $line;
+	    
+	# find the image file if there is one
+	if (defined $imgname && $imgname ne "") {
+	    &util::block_filename($block_hash, &util::filename_cat( $dir,$imgname));
+	}
+	# find the text file if there is one
+	if (defined $txtname && $txtname ne "") {
+	    &util::block_filename($block_hash, &util::filename_cat($dir,$txtname));
+	}
+    }
+    close ITEMFILE;
+
+}
+
+sub process_item {
+    my $self = shift (@_);
+    my ($filename_full_path, $dir, $filename_no_path, $processor, $metadata) = @_;
+
+    my $doc_obj = new doc ($filename_full_path, "indexed_doc", $self->{'file_rename_method'});
+    $self->set_initial_doc_fields($doc_obj, $filename_full_path, $processor, $metadata);
+    my $topsection = $doc_obj->get_top_section();
+    open (ITEMFILE, $filename_full_path) || die "couldn't open $filename_full_path\n";
+    my $line = "";
+    my $num = 0;
+    while (defined ($line = <ITEMFILE>)) {
+	
+	# Since process_item is called not on an XML item file, but a text item file
+	# don't decode into UTF8 the text that was read in, since it's already UTF-8	
+	#$line = decode("utf-8",$line);
+	
+	next unless $line =~ /\w/;
+	chomp $line;
+	next if $line =~ /^#/; # ignore comment lines
+	if ($line =~ /^<([^>]*)>\s*(.*?)\s*$/) {
+	    my $meta_name = $1;
+	    my $meta_value = $2;
+	    if ($meta_name =~ /\./) {
+		$meta_name = "ex.$meta_name";
+	    }
+	    $doc_obj->set_utf8_metadata_element ($topsection, $meta_name, $meta_value);
+	    #$meta->{$1} = $2;
+	} else {
+	    $num++;
+	    # line should be like page:imagefilename:textfilename:r - the r is optional -> means rotate the image 180 deg
+	    $line =~ s/^\s+//; #remove space at the front
+	    $line =~ s/\s+$//; #remove space at the end
+	    my ($pagenum, $imgname, $txtname, $rotate) = split /:/, $line;
+	    
+	    # create a new section for each image file
+	    my $cursection = $doc_obj->insert_section($doc_obj->get_end_child($topsection));
+	    # the page number becomes the Title
+	    $doc_obj->set_utf8_metadata_element($cursection, 'Title', $pagenum);
+	 
+	    # process the image for this page if there is one
+	    if (defined $imgname && $imgname ne "") {
+		my $result1 = $self->process_image($dir.$imgname, $imgname, $doc_obj, $cursection, $rotate);
+		if (!defined $result1)
+		{
+		    print "PagedImagePlugin: couldn't process image \"$dir$imgname\" for item \"$filename_full_path\"\n";
+		}
+	    }
+	    # process the text file if one is there
+	    if (defined $txtname && $txtname ne "") {
+		my $result2 = $self->process_text ($dir.$txtname, $txtname, $doc_obj, $cursection);
+               
+		if (!defined $result2) {
+		    print "PagedImagePlugin: couldn't process text file \"$dir.$txtname\" for item \"$filename_full_path\"\n";
+		    $self->add_dummy_text($doc_obj, $cursection);
+		}
+	    } else {
+		# otherwise add in some dummy text 
+		$self->add_dummy_text($doc_obj, $cursection);
+	    }
+	}
+    }
+    
+    close ITEMFILE;
+
+    # add numpages metadata
+    $doc_obj->set_utf8_metadata_element ($topsection, 'NumPages', "$num");
+
+    $doc_obj->set_utf8_metadata_element($topsection,"MaxImageWidth",$self->{'MaxImageWidth'});
+    $doc_obj->set_utf8_metadata_element($topsection,"MaxImageHeight",$self->{'MaxImageHeight'});
+    $self->{'MaxImageWidth'} = undef;
+    $self->{'MaxImageHeight'} = undef;
+
+
+    return $doc_obj;
+}
+
+sub process_text {
+    my $self = shift (@_);
+    my ($filename_full_path, $file, $doc_obj, $cursection) = @_;
+    
+    # check that the text file exists!!
+    if (!-f $filename_full_path) {
+	print "PagedImagePlugin: ERROR: File $filename_full_path does not exist, skipping\n";
+	return 0;
+    }
+
+    # remember that this text file was one of our source files, but only 
+    # if we are not processing a tmp file
+    if (!$self->{'processing_tmp_files'} ) {
+	$doc_obj->associate_source_file($filename_full_path);
+    }
+    # Do encoding stuff
+    my ($language, $encoding) = $self->textcat_get_language_encoding ($filename_full_path);
+
+    my $text="";
+    &ReadTextFile::read_file($self, $filename_full_path, $encoding, $language, \$text); # already decoded as utf8
+    if (!length ($text)) {
+	# It's a bit unusual but not out of the question to have no text, so just give a warning
+        print "PagedImagePlugin: WARNING: $filename_full_path contains no text\n";
+    }
+
+    # we need to escape the escape character, or else mg will convert into
+    # eg literal newlines, instead of leaving the text as '\n'
+    $text =~ s/\\/\\\\/g; # macro language
+    $text =~ s/_/\\_/g; # macro language
+
+
+    if ($text =~ m/<html.*?>\s*<head.*?>.*<\/head>\s*<body.*?>(.*)<\/body>\s*<\/html>\s*$/is) {
+	# looks like HTML input
+	# no need to escape < and > or put in <pre> tags
+
+	$text = $1;
+
+	# add text to document object
+	$doc_obj->add_utf8_text($cursection, "$text");
+    }
+    else {
+	$text =~ s/</&lt;/g;
+	$text =~ s/>/&gt;/g;
+
+	# insert preformat tags and add text to document object
+	$doc_obj->add_utf8_text($cursection, "<pre>\n$text\n</pre>");
+    }
+
+    
+    return 1;
+}
+
+
+sub clean_up_after_doc_obj_processing {
+    my $self = shift(@_);
+    
+    $self->ImageConverter::clean_up_temporary_files();
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/PostScriptPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/PostScriptPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/PostScriptPlugin.pm	(revision 24799)
@@ -0,0 +1,260 @@
+###########################################################################
+#
+# PostScriptPlugin.pm -- plugin to process PostScript files
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package PostScriptPlugin;
+
+use ConvertBinaryFile;
+use ReadTextFile; # for read_file in convert_post_process. do we need it?
+use sorttools;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+sub BEGIN {
+    @PostScriptPlugin::ISA = ('ConvertBinaryFile', 'ReadTextFile');
+}
+
+my $convert_to_list =
+    [ {	'name' => "auto",
+	'desc' => "{ConvertBinaryFile.convert_to.auto}" },
+      {	'name' => "text",
+	'desc' => "{ConvertBinaryFile.convert_to.text}" },
+      { 'name' => "pagedimg_jpg",
+	'desc' => "{ConvertBinaryFile.convert_to.pagedimg_jpg}" },
+      { 'name' => "pagedimg_gif",
+	'desc' => "{ConvertBinaryFile.convert_to.pagedimg_gif}" },
+      { 'name' => "pagedimg_png",
+	'desc' => "{ConvertBinaryFile.convert_to.pagedimg_png}" }
+      ];
+
+my $arguments =
+    [ { 'name' => "convert_to",
+	'desc' => "{ConvertBinaryFile.convert_to}",
+	'type' => "enum",
+	'reqd' => "yes",
+	'list' => $convert_to_list, 
+	'deft' => "text" },
+      { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'deft' => &get_default_process_exp(),
+	'reqd' => "no" },
+      { 'name' => "block_exp",
+	'desc' => "{BasePlugin.block_exp}",
+	'type' => 'regexp',
+	'deft' => &get_default_block_exp() },
+      { 'name' => "extract_date",
+	'desc' => "{PostScriptPlugin.extract_date}",
+	'type' => "flag" },
+      { 'name' => "extract_pages",
+	'desc' => "{PostScriptPlugin.extract_pages}",
+	'type' => "flag" },
+      { 'name' => "extract_title",
+	'desc' => "{PostScriptPlugin.extract_title}",
+	'type' => "flag" } ];
+
+my $options = { 'name'     => "PostScriptPlugin",
+		'desc'     => "{PostScriptPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'srcreplaceable' => "yes", # Source docs in postscript format can be replaced with GS-generated html
+		'args'     => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@$inputargs,"-title_sub");
+    push(@$inputargs,'^(Page\s+\d+)?(\s*1\s+)?');
+    
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+    
+    my $self = new ConvertBinaryFile($pluginlist, $inputargs, $hashArgOptLists);
+
+    if ($self->{'info_only'}) {
+	# don't worry about any options etc
+	return bless $self, $class;
+    }
+
+    $self->{'file_type'} = "PS";
+
+    if ($self->{'convert_to'} eq "auto") {
+	$self->{'convert_to'} = "text";
+    }
+
+    # set convert_to_plugin and convert_to_ext
+    $self->set_standard_convert_settings();
+    my $secondary_plugin_name = $self->{'convert_to_plugin'};
+    my $secondary_plugin_options = $self->{'secondary_plugin_options'};
+
+    if (!defined $secondary_plugin_options->{$secondary_plugin_name}) {
+	$secondary_plugin_options->{$secondary_plugin_name} = [];
+    }
+    my $specific_options = $secondary_plugin_options->{$secondary_plugin_name};
+
+    # following title_sub removes "Page 1" added by ps2ascii, and a leading
+    # "1", which is often the page number at the top of the page. Bad Luck
+    # if your document title actually starts with "1 " - is there a better way?
+    push(@$specific_options, "-title_sub", '^(Page\s+\d+)?(\s*1\s+)?');
+    push(@$specific_options, "-file_rename_method", "none");
+    
+    if ($secondary_plugin_name eq "TextPlugin") {
+	push(@$specific_options, "-input_encoding", "utf8");
+	push(@$specific_options,"-extract_language") if $self->{'extract_language'};
+    } elsif ($secondary_plugin_name eq "PagedImagePlugin") {
+	push(@$specific_options, "-processing_tmp_files");
+    }
+
+    $self = bless $self, $class;
+    # used for convert_post_process
+    $self->{'input_encoding'} = "auto";
+    $self->{'default_encoding'} = "utf8";
+
+    $self->load_secondary_plugins($class,$secondary_plugin_options, $hashArgOptLists);
+
+    return $self;
+}
+
+
+sub get_default_block_exp {
+    my $self = shift (@_);
+
+    return q^(?i)\.(eps)$^;
+}
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+    return q^(?i)\.ps$^;
+}
+
+# this has been commented out in other plugins. do we need it here?
+# ps files are converted to images (item file should be in utf8) or text (uses pstoascii), so we shouldn't need to ensure utf8
+sub convert_post_process
+{
+    my $self = shift (@_);
+    my ($conv_filename) = @_;
+    
+    my $outhandle=$self->{'outhandle'};
+    
+    my ($language, $encoding) = $self->textcat_get_language_encoding ($conv_filename);
+    
+    # read in file ($text will be in utf8)
+    my $text = "";
+    $self->read_file ($conv_filename, $encoding, $language, \$text);
+    
+    # turn any high bytes that aren't valid utf-8 into utf-8.
+    unicode::ensure_utf8(\$text);
+    
+    # Write it out again!
+    $self->utf8_write_file (\$text, $conv_filename);
+}
+
+sub extract_metadata_from_postscript {
+    my $self = shift (@_);
+
+    my ($filename,$doc) = @_;
+
+    my $section = $doc->get_top_section();
+
+    my $title_found = 0;
+    my $pages_found = 0;
+    my $date_found = 0;
+
+    print STDERR "PostScriptPlugin: extracting PostScript metadata from \"$filename\"\n" 
+	if $self->{'verbosity'} > 1;
+
+    open(INPUT, "<$filename");
+    my $date;
+
+    while(my $line =<INPUT>) {
+	if ($self->{'extract_title'} && !$title_found) {
+	    foreach my $word ($line =~ m|Title: ([-A-Za-z0-9@/\/\(\):,. ]*)|g) {
+		my $new_word = $word; 
+		$new_word =~ s/\(Untitled\)//i;
+		$new_word =~ s/\(Microsoft Word\)//i;
+		$new_word =~ s/Microsoft Word//i;
+		$new_word =~ s/^\(//i;
+		$new_word =~ s/\)$//i;
+		$new_word =~ s/^ - //i;
+		if ($new_word ne "") {
+		    $doc->add_utf8_metadata($section, "Title", $new_word );
+		    $title_found = 1;
+		}
+	    }
+	}
+	if ($self->{'extract_date'} && !$date_found) {
+            foreach my $word ($line =~ m/(Creation[-A-Za-z0-9@\/\(\):,. ]*)/g) {
+                if ($word =~ m/ ([A-Za-z][A-Za-z][A-Za-z]) ([0-9 ][0-9])  ?[0-9: ]+ ([0-9]{4})/) {
+                    $date = &sorttools::format_date($2,$1,$3);
+		    if (defined $date) {
+			$doc->add_utf8_metadata($section, "Date", $date );
+		    }
+                }
+                if ($word =~ m/D:([0-9]{4})([0-9]{2})([0-9]{2})[0-9]{6}\)/) {
+                    $date = &sorttools::format_date($3,$2,$1);
+		    if (defined $date) {
+			$doc->add_utf8_metadata($section, "Date", $date );
+		    }
+                }
+                if ($word =~ m/CreationDate: ([0-9]{4}) ([A-Za-z][A-Za-z][A-Za-z]) ([0-9 ][0-9]) [0-9:]*/) {
+                    $date = &sorttools::format_date($3,$2,$1);
+		    if (defined $date) {
+			$doc->add_utf8_metadata($section, "Date", $date );
+		    }
+                }
+		$date_found = 1;
+            }
+	}
+	if ($self->{'extract_pages'} && !$pages_found) {
+	    foreach my $word ($line =~ m/(Pages: [0-9]*)/g) {
+                my $digits = $word;
+                $digits =~ s/[^0-9]//g;
+		if ($digits ne "" && $digits ne "0") {
+		    $doc->add_utf8_metadata($section, "Pages", $digits );
+		    $pages_found = 1;
+		}
+            }
+	}
+    }
+}
+
+# do plugin specific processing of doc_obj 
+sub process {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+
+    my $filename = &util::filename_cat($base_dir,$file);
+    $self->extract_metadata_from_postscript($filename, $doc_obj);
+
+    return $self->SUPER::process(@_);
+
+}
+
+
+1;
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/PowerPointPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/PowerPointPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/PowerPointPlugin.pm	(revision 24799)
@@ -0,0 +1,478 @@
+###########################################################################
+#
+# PowerPointPlugin.pm -- plugin for importing Microsoft PowerPoint files.
+#  (basic version supports versions 95 and 97)
+#  (through OpenOffice extension, supports all contemporary formats)
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2002 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package PowerPointPlugin;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+no strict 'subs';
+
+use gsprintf 'gsprintf';
+
+use AutoLoadConverters;
+use ConvertBinaryFile;
+
+sub BEGIN {
+    @PowerPointPlugin::ISA = ('ConvertBinaryFile', 'AutoLoadConverters');
+}
+
+my $openoffice_available = 0;
+
+my $windows_convert_to_list =
+    [ {	'name' => "auto",
+	'desc' => "{ConvertBinaryFile.convert_to.auto}" },
+      {	'name' => "html",
+	'desc' => "{ConvertBinaryFile.convert_to.html}" },
+      {	'name' => "text",
+	'desc' => "{ConvertBinaryFile.convert_to.text}" },
+      { 'name' => "pagedimg_jpg",
+	'desc' => "{PowerPointPlugin.convert_to.pagedimg_jpg}" },
+      { 'name' => "pagedimg_gif",
+	'desc' => "{PowerPointPlugin.convert_to.pagedimg_gif}" },
+      { 'name' => "pagedimg_png",
+	'desc' => "{PowerPointPlugin.convert_to.pagedimg_png}" }
+      ];
+
+my $openoffice_convert_to_list = 
+    [ {	'name' => "auto",
+	'desc' => "{ConvertBinaryFile.convert_to.auto}" },
+      {	'name' => "html_multi",
+	'desc' => "{PowerPointPlugin.convert_to.html_multi}" },
+      {	'name' => "text",
+	'desc' => "{ConvertBinaryFile.convert_to.text}" },
+      { 'name' => "pagedimg",
+	'desc' => "{PowerPointPlugin.convert_to.pagedimg}" }
+      ];
+
+my $openoffice_extra_convert_to_list = 
+    [ {	'name' => "html_multi",
+	'desc' => "{PowerPointPlugin.convert_to.html_multi}" },
+      { 'name' => "pagedimg",
+	'desc' => "{PowerPointPlugin.convert_to.pagedimg}" }
+      ];
+
+my $arguments = 
+    [ { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'reqd' => "no",
+	'deft' => "&get_default_process_exp()",  # delayed (see below)
+	}
+      ];
+
+my $opt_windows_args = 
+    [ { 'name' => "convert_to",
+	'desc' => "{ConvertBinaryFile.convert_to}",
+	'type' => "enum",
+	'reqd' => "yes",
+	'list' => $windows_convert_to_list, 
+	'deft' => "html" },
+      { 'name' => "windows_scripting",
+	'desc' => "{PowerPointPlugin.windows_scripting}",
+	'type' => "flag",
+	'reqd' => "no" }
+      ];
+
+my $opt_office_args = 
+    [ { 'name' => "convert_to",
+	'desc' => "{ConvertBinaryFile.convert_to}",
+	'type' => "enum",
+	'reqd' => "yes",
+	'list' => $openoffice_convert_to_list, 
+	'deft' => "html" }
+      ];
+
+my $options = { 'name'     => "PowerPointPlugin",
+		'desc'     => "{PowerPointPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'srcreplaceable' => "yes", # Source docs in PPT format can be replaced with GS-generated html
+	        'args'     => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    # this bit needs to happen later after the arguments array has been 
+    # finished - used for parsing the input args.
+    # push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    # this one needs to go in first, to get the print info in the right order
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $auto_converter_self = new AutoLoadConverters($pluginlist,$inputargs,$hashArgOptLists,["OpenOfficeConverter"],1);
+
+    if ($ENV{'GSDLOS'} =~ m/^windows$/i) {
+ 	if ($auto_converter_self->{'openoffice_available'}) {
+	    # add openoffice convert_to options into list
+	    push (@$windows_convert_to_list, @$openoffice_extra_convert_to_list);
+	}
+	push(@$arguments,@$opt_windows_args);
+    }
+    elsif ($auto_converter_self->{'openoffice_available'}) {
+	push (@$arguments,@$opt_office_args);
+	$openoffice_available = 1;
+    }
+    # TODO need to do the case where they are both enabled!!! what will the convert to list be???
+
+    # evaluate the default for process_exp  - it needs to be delayed till here so we know if openoffice is available or not. But needs to be done before parsing the args.
+    foreach my $a (@$arguments) {
+	if ($a->{'name'} eq "process_exp") {
+	    my $eval_expr = $a->{'deft'};
+	    $a->{'deft'} = eval "$eval_expr";
+	    last;
+	}
+    }
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+
+    my $cbf_self = new ConvertBinaryFile($pluginlist, $inputargs, $hashArgOptLists);
+    my $self = BasePlugin::merge_inheritance($auto_converter_self, $cbf_self);
+
+    if ($self->{'info_only'}) {
+	# don't worry about any options etc
+	return bless $self, $class;
+    }
+
+    $self = bless $self, $class;
+    $self->{'file_type'} = "PPT";
+
+    if ($self->{'convert_to'} eq "auto") {
+	if ($self->{'windows_scripting'}) {
+	    $self->{'convert_to'} = "pagedimg_jpg";
+	}
+	else {
+	    $self->{'convert_to'} = "html";
+	}
+    }
+
+   my $outhandle = $self->{'outhandle'};
+
+    # can't have windows_scripting and openoffice_conversion at the same time
+    if ($self->{'windows_scripting'} && $self->{'openoffice_conversion'}) {
+	print $outhandle "Warning: Cannot have -windows_scripting and -openoffice_conversion\n";
+	print $outhandle "         on at the same time.  Defaulting to -windows_scripting\n";
+	$self->{'openoffice_conversion'} = 0;
+    }
+    
+    #these are passed through to gsConvert.pl by ConvertBinaryFile.pm
+    $self->{'convert_options'} = "-windows_scripting" if $self->{'windows_scripting'};
+
+    # set convert_to_plugin and convert_to_ext
+    $self->set_standard_convert_settings();
+
+    my $secondary_plugin_name = $self->{'convert_to_plugin'};
+    my $secondary_plugin_options = $self->{'secondary_plugin_options'};
+
+    if (!defined $secondary_plugin_options->{$secondary_plugin_name}) {
+	$secondary_plugin_options->{$secondary_plugin_name} = [];
+    }
+    my $specific_options = $secondary_plugin_options->{$secondary_plugin_name};
+
+    push(@$specific_options, "-file_rename_method", "none");
+    push(@$specific_options, "-extract_language") if $self->{'extract_language'};
+
+    if ($secondary_plugin_name eq "HTMLPlugin") {
+	push(@$specific_options, "-processing_tmp_files");
+	push(@$specific_options,"-metadata_fields","Title,GENERATOR,date,author<Creator>");
+    }
+    elsif ($secondary_plugin_name eq "PagedImagePlugin") {
+	push(@$specific_options, "-processing_tmp_files");
+	#is this true??
+	push(@$specific_options,"-input_encoding", "utf8");
+	if ($self->{'openoffice_conversion'}) {
+	    push(@$specific_options, "-create_thumbnail", "false", "-create_screenview", "false");
+	}
+    }
+
+    $self = bless $self, $class;
+
+    $self->load_secondary_plugins($class,$secondary_plugin_options,$hashArgOptLists);
+    return $self;
+}
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+    if ($openoffice_available) {
+	return q^(?i)\.(ppt|pptx|odp)$^;
+    }
+
+    return q^(?i)\.ppt$^;
+}
+
+sub init {
+    my $self = shift (@_);
+
+    # ConvertBinaryFile init
+    $self->SUPER::init(@_);
+    $self->AutoLoadConverters::init(@_);
+
+}
+
+sub begin {
+    my $self = shift (@_);
+
+    $self->AutoLoadConverters::begin(@_);
+    $self->SUPER::begin(@_);
+
+}
+
+sub deinit {
+    my $self = shift (@_);
+    
+    $self->AutoLoadConverters::deinit(@_);
+    $self->SUPER::deinit(@_);
+
+}
+
+# override AutoLoadConverters version, as we need to do more stuff once its converted if we are converting to item file
+sub tmp_area_convert_file {
+    my $self = shift (@_);
+    my ($output_ext, $input_filename, $textref) = @_;
+
+    if ($self->{'openoffice_conversion'}) {
+	if ($self->{'convert_to'} eq "pagedimg") {
+	    $output_ext = "html"; # first convert to html
+	}
+	my ($result, $result_str, $new_filename) = $self->OpenOfficeConverter::convert($input_filename, $output_ext);
+	if ($result == 0) {
+	    my $outhandle=$self->{'outhandle'};
+	    print $outhandle "OpenOfficeConverter Conversion error\n";
+	    print $outhandle $result_str;
+	    return "";
+
+	}
+	#print STDERR "result = $result\n";
+	if ($self->{'convert_to'} eq "pagedimg") {
+	    my $item_filename = $self->generate_item_file($new_filename);
+	    return $item_filename;
+	}
+	return $new_filename;
+
+    }
+    else {
+	return $self->ConvertBinaryFile::tmp_area_convert_file(@_);
+    }
+    # get tmp filename
+}
+
+# override default read in some situations, as the conversion of ppt to html results in many files, and we want them all to be processed.
+sub read {
+    my $self = shift (@_);  
+    my ($pluginfo, $base_dir, $file, $block_hash, $metadata, $processor, $maxdocs, $total_count, $gli) = @_;
+
+    # can we process this file??
+    my ($filename_full_path, $filename_no_path) = &util::get_full_filenames($base_dir, $file);
+
+    return undef unless $self->can_process_this_file($filename_full_path);
+    
+    # we are only doing something special for html_multi
+    if (!($self->{'openoffice_conversion'} && $self->{'convert_to'} eq "html_multi")) {
+	return $self->BasePlugin::read(@_);
+    }
+    my $outhandle = $self->{'outhandle'};
+    print STDERR "<Processing n='$file' p='$self->{'plugin_type'}'>\n" if ($gli);
+    print $outhandle "$self->{'plugin_type'} processing $file\n"
+	    if $self->{'verbosity'} > 1;
+
+    my $conv_filename = $self->tmp_area_convert_file("html", $filename_full_path);
+    if ("$conv_filename" eq "") {return -1;} # had an error, will be passed down pipeline 
+    if (! -e "$conv_filename") {return -1;} 
+
+    my ($tailname, $html_dirname, $suffix)
+	= &File::Basename::fileparse($conv_filename, "\\.[^\\.]+\$");
+
+    my $collect_file = &util::filename_within_collection($filename_full_path);
+    my $dirname_within_collection = &util::filename_within_collection($html_dirname);
+    my $secondary_plugin = $self->{'secondary_plugins'}->{"HTMLPlugin"};
+
+    my @dir;
+    if (!opendir (DIR, $html_dirname)) {
+	print $outhandle "PowerPointPlugin: Couldn't read directory $html_dirname\n";
+	# just process the original file
+	@dir = ("$tailname.$suffix");
+	
+    } else {
+	@dir = readdir (DIR);
+	closedir (DIR);
+    }
+
+    foreach my $file (@dir) {
+	next unless $file =~ /\.html$/;
+	
+	my ($rv, $doc_obj) = 
+	    $secondary_plugin->read_into_doc_obj ($pluginfo,"", &util::filename_cat($html_dirname,$file), $block_hash, {}, $processor, $maxdocs, $total_count, $gli);
+	if ((!defined $rv) || ($rv<1)) {
+	    # wasn't processed
+	    return $rv;
+	}
+
+	# next block copied from ConvertBinaryFile
+	# from here ...
+	# Override previous gsdlsourcefilename set by secondary plugin
+	
+	$doc_obj->set_source_filename ($collect_file, $self->{'file_rename_method'}); 
+	## set_source_filename does not set the doc_obj source_path which is used in archives dbs for incremental
+	# build. so set it manually.
+	$doc_obj->set_source_path($filename_full_path);
+	$doc_obj->set_converted_filename(&util::filename_cat($dirname_within_collection, $file));
+	
+	my $plugin_filename_encoding = $self->{'filename_encoding'};
+    my $filename_encoding = $self->deduce_filename_encoding($file,$metadata,$plugin_filename_encoding);
+	$self->set_Source_metadata($doc_obj, $filename_full_path,$filename_encoding);
+        
+	$doc_obj->set_utf8_metadata_element($doc_obj->get_top_section(), "Plugin", "$self->{'plugin_type'}");
+	$doc_obj->set_utf8_metadata_element($doc_obj->get_top_section(), "FileSize", (-s $filename_full_path));
+
+	
+	my ($tailname, $dirname, $suffix)
+	    = &File::Basename::fileparse($filename_full_path, "\\.[^\\.]+\$");
+	$doc_obj->set_utf8_metadata_element($doc_obj->get_top_section(), "FilenameRoot", $tailname);
+	
+
+	my $topsection = $doc_obj->get_top_section();
+	$self->add_associated_files($doc_obj, $filename_full_path);
+	
+	# extra_metadata is already called by sec plugin in process??
+	$self->extra_metadata($doc_obj, $topsection, $metadata); # do we need this here??
+	# do any automatic metadata extraction
+	$self->auto_extract_metadata ($doc_obj);
+	
+	# have we found a Title??
+	$self->title_fallback($doc_obj,$topsection,$filename_no_path);
+	
+	# use the one generated by HTMLPlugin, otherwise they all end up with same id.
+	#$self->add_OID($doc_obj);
+	# to here...
+
+	# process it
+	$processor->process($doc_obj);
+	undef $doc_obj;
+    }
+    $self->{'num_processed'} ++;
+
+#    my ($process_status,$doc_obj) = $self->read_into_doc_obj(@_);
+    
+#    if ((defined $process_status) && ($process_status == 1)) {
+	
+	# process the document
+#	$processor->process($doc_obj);
+
+#	$self->{'num_processed'} ++;
+#	undef $doc_obj; 
+#    }
+    # delete any temp files that we may have created
+    $self->clean_up_after_doc_obj_processing();
+
+
+    # if process_status == 1, then the file has been processed.
+    return 1;
+
+}
+
+sub generate_item_file
+{
+    my $self = shift(@_);
+    my ($input_filename) = @_;
+    my $outhandle = $self->{'outhandle'};
+    my ($tailname, $dirname, $suffix)
+	= &File::Basename::fileparse($input_filename, "\\.[^\\.]+\$");
+
+    # find all the files in the directory
+    if (!opendir (DIR, $dirname)) {
+	print $outhandle "PowerPointPlugin: Couldn't read directory $dirname\n";
+	return $input_filename;
+    }
+
+    my @dir = readdir (DIR);
+    closedir (DIR);
+
+    # start the item file
+    my $itemfile_name = &util::filename_cat($dirname, "$tailname.item");
+
+    # encoding specification????
+    if (!open (ITEMFILE, ">$itemfile_name")) {
+	print $outhandle "PowerPOintPlugin: Couldn't open $itemfile_name for writing\n";
+    }
+    print ITEMFILE "<GeneratedBy>PowerPointPlugin\n";
+    # print the first page
+    my @sorted_dir = sort alphanum_sort @dir;
+    for (my $i = 0; $i < scalar(@sorted_dir); $i++) {
+	my $file = $sorted_dir[$i];
+	if ($file =~ /^img(\d+)\.jpg$/) {
+	    my $num = $1;
+	    $self->tidy_up_html(&util::filename_cat($dirname, "text$num.html"));
+	    print ITEMFILE "$num:img$num.jpg:text$num.html:\n";
+	}
+    }
+    close ITEMFILE;
+    return $itemfile_name;
+
+    
+}
+
+# want to sort img1, img2, ...img10, img11 etc.
+sub alphanum_sort {
+    
+    my ($a_txt, $a_num) = $a =~ /^([^\d]*)(\d*)/;
+    my ($b_txt, $b_num) = $b =~ /^([^\d]*)(\d*)/;
+    
+    if ($a_txt ne $b_txt) { return ($a cmp $b) };
+    return ($a_num <=> $b_num);
+}
+
+# Want to remove the line that links to first page, last page, next page, text etc.
+sub tidy_up_html {
+
+    my $self = shift(@_);
+    my ($filename) = @_;
+    return unless (-f $filename);
+    my $backup_filename = "$filename.bak";
+
+    &File::Copy::copy($filename, $backup_filename);
+
+    open (ORIGINAL, $backup_filename) || return;
+    open(HTMLFILE, ">$filename") || return;
+
+    my $line ="";
+    while ($line = <ORIGINAL>) {
+	if ($line =~ /\<body\>/) {
+	    print HTMLFILE $line;
+	    $line = <ORIGINAL>;
+	    next if $line =~ /\<center\>/;
+	}
+	next if $line =~ /First page/;
+	print HTMLFILE ($line);
+    }
+
+    close HTMLFILE;
+    close ORIGINAL;
+}
+1;
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/PrintInfo.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/PrintInfo.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/PrintInfo.pm	(revision 24799)
@@ -0,0 +1,288 @@
+###########################################################################
+#
+# PrintInfo - most base plugin
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2008 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+## Most basic plugin, just handles parsing the arguments and printing out descriptions. Used for plugins and Extractor plugins
+
+package PrintInfo;
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+}
+
+eval {require bytes};
+eval "require diagnostics"; # some perl distros (eg mac) don't have this
+
+# suppress the annoying "subroutine redefined" warning that various
+# plugins cause under perl 5.6
+$SIG{__WARN__} = sub {warn($_[0]) unless ($_[0] =~ /Subroutine\s+\S+\sredefined/)};
+
+use strict;
+no strict 'subs';
+
+use gsprintf 'gsprintf';
+use parse2;
+use printusage;
+
+my $arguments = [];
+
+my $options = { 'name'     => "PrintInfo",
+		'desc'     => "{PrintInfo.desc}",
+		'abstract' => "yes",
+		'inherits' => "no",
+		'args'     => $arguments };
+
+# $auxiliary_plugin argument passed in by "on-the-side" plugin helpers such as Extractors and ImageConverter. We don't want parsing of args done by them.
+sub new 
+{
+    my $class = shift (@_);
+    my ($pluginlist,$args,$hashArgOptLists, $auxiliary) = @_;
+    my $plugin_name = (defined $pluginlist->[0]) ? $pluginlist->[0] : $class;
+
+    if ($plugin_name eq $class) {
+	push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+	push(@{$hashArgOptLists->{"OptList"}},$options);
+    }
+    my $self = {};
+    $self->{'outhandle'} = STDERR;
+    $self->{'option_list'} = $hashArgOptLists->{"OptList"};
+    $self->{"info_only"} = 0;
+
+    # Check if gsdlinfo is in the argument list or not - if it is, don't parse 
+    # the args, just return the object.  
+    foreach my $strArg (@{$args})
+    {
+	if($strArg eq "-gsdlinfo")
+	{
+	    $self->{"info_only"} = 1;
+	    return bless $self, $class;
+	}
+    }
+    
+    if (defined $auxiliary) { # don't parse the args here
+	return bless $self, $class;
+    }
+
+    if(parse2::parse($args,$hashArgOptLists->{"ArgList"},$self) == -1)
+    {
+	my $classTempClass = bless $self, $class;
+	print STDERR "<BadPlugin p=$plugin_name>\n";
+	&gsprintf(STDERR, "\n{PrintInfo.bad_general_option}\n", $plugin_name);
+	$classTempClass->print_txt_usage("");  # Use default resource bundle
+	die "\n";
+    }
+
+    delete $self->{"info_only"};
+    # else parsing was successful.
+
+    $self->{'plugin_type'} = $plugin_name;
+ 
+    return bless $self, $class;
+    
+}   
+
+#sub init {
+#}
+
+sub set_incremental {
+    my $self = shift(@_);
+    my ($incremental_mode) = @_;
+
+    if (!defined $incremental_mode) {
+	$self->{'incremental'} = 0;
+	$self->{'incremental_mode'} = "none";
+    }
+    elsif ($incremental_mode eq "all") {
+	$self->{'incremental'} = 1;
+	$self->{'incremental_mode'} = "all";
+    }
+    else {
+	# none, onlyadd
+	$self->{'incremental'} = 0;
+	$self->{'incremental_mode'} = $incremental_mode;
+    }	
+}
+
+sub get_arguments
+{
+    my $self = shift(@_);
+    my $optionlistref = $self->{'option_list'};
+    my @optionlist = @$optionlistref;
+    my $pluginoptions = pop(@$optionlistref);
+    my $pluginarguments = $pluginoptions->{'args'};
+    return $pluginarguments;
+}
+
+
+sub print_xml_usage
+{
+    my $self = shift(@_);
+    my $header = shift(@_);
+    my $high_level_information_only = shift(@_);
+    
+    # XML output is always in UTF-8
+    gsprintf::output_strings_in_UTF8;
+
+    if ($header) {
+	&PrintUsage::print_xml_header("plugin");
+    }
+    $self->print_xml($high_level_information_only);
+}
+
+
+sub print_xml
+{
+    my $self = shift(@_);
+    my $high_level_information_only = shift(@_);
+
+    my $optionlistref = $self->{'option_list'};
+    my @optionlist = @$optionlistref;
+    my $pluginoptions = shift(@$optionlistref);
+    return if (!defined($pluginoptions));
+
+    # Find the process and block default expressions in the plugin arguments
+    my $process_exp = "";
+    my $block_exp = "";
+    if (defined($pluginoptions->{'args'})) {
+	foreach my $option (@{$pluginoptions->{'args'}}) {
+	    if ($option->{'name'} eq "process_exp") {
+		$process_exp = $option->{'deft'};
+	    }
+	    if ($option->{'name'} eq "block_exp") {
+		$block_exp = $option->{'deft'};
+	    }
+	}
+    }
+
+    gsprintf(STDERR, "<PlugInfo>\n");
+    gsprintf(STDERR, "  <Name>$pluginoptions->{'name'}</Name>\n");
+    my $desc = gsprintf::lookup_string($pluginoptions->{'desc'});
+    $desc =~ s/</&amp;lt;/g; # doubly escaped
+    $desc =~ s/>/&amp;gt;/g;
+    gsprintf(STDERR, "  <Desc>$desc</Desc>\n");
+    gsprintf(STDERR, "  <Abstract>$pluginoptions->{'abstract'}</Abstract>\n");
+    gsprintf(STDERR, "  <Inherits>$pluginoptions->{'inherits'}</Inherits>\n");
+    gsprintf(STDERR, "  <Processes>$process_exp</Processes>\n");
+    gsprintf(STDERR, "  <Blocks>$block_exp</Blocks>\n");
+    gsprintf(STDERR, "  <Explodes>" . ($pluginoptions->{'explodes'} || "no") . "</Explodes>\n");
+    # adding new option that works with replace_srcdoc_with_html.pl
+    gsprintf(STDERR, "  <SourceReplaceable>" . ($pluginoptions->{'srcreplaceable'} || "no") . "</SourceReplaceable>\n");
+    unless (defined($high_level_information_only)) {
+	gsprintf(STDERR, "  <Arguments>\n");
+	if (defined($pluginoptions->{'args'})) {
+	    &PrintUsage::print_options_xml($pluginoptions->{'args'});
+	}
+	gsprintf(STDERR, "  </Arguments>\n");
+
+	# Recurse up the plugin hierarchy
+	$self->print_xml();
+    }
+    gsprintf(STDERR, "</PlugInfo>\n");
+}
+
+
+sub print_txt_usage
+{
+    my $self = shift(@_);
+    # Print the usage message for a plugin (recursively)
+    my $descoffset = $self->determine_description_offset(0);
+    $self->print_plugin_usage($descoffset, 1);
+}
+
+
+sub determine_description_offset
+{
+    my $self = shift(@_);
+    my $maxoffset = shift(@_);
+
+    my $optionlistref = $self->{'option_list'};
+    my @optionlist = @$optionlistref;
+    my $pluginoptions = shift(@$optionlistref);
+    return $maxoffset if (!defined($pluginoptions));
+
+    # Find the length of the longest option string of this plugin
+    my $pluginargs = $pluginoptions->{'args'};
+    if (defined($pluginargs)) {
+	my $longest = &PrintUsage::find_longest_option_string($pluginargs);
+	if ($longest > $maxoffset) {
+	    $maxoffset = $longest;
+	}
+    }
+
+    # Recurse up the plugin hierarchy
+    $maxoffset = $self->determine_description_offset($maxoffset);
+    $self->{'option_list'} = \@optionlist;
+    return $maxoffset;
+}
+
+
+sub print_plugin_usage
+{
+    my $self = shift(@_);
+    my $descoffset = shift(@_);
+    my $isleafclass = shift(@_);
+
+    my $optionlistref = $self->{'option_list'};
+    my @optionlist = @$optionlistref;
+    my $pluginoptions = shift(@$optionlistref);
+    return if (!defined($pluginoptions));
+
+    my $pluginname = $pluginoptions->{'name'};
+    my $pluginargs = $pluginoptions->{'args'};
+    my $plugindesc = $pluginoptions->{'desc'};
+
+    # Produce the usage information using the data structure above
+    if ($isleafclass) {
+	if (defined($plugindesc)) {
+	    gsprintf(STDERR, "$plugindesc\n\n");
+	}
+	gsprintf(STDERR, " {common.usage}: plugin $pluginname [{common.options}]\n\n");
+    }
+
+    # Display the plugin options, if there are some
+    if (defined($pluginargs)) {
+	# Calculate the column offset of the option descriptions
+	my $optiondescoffset = $descoffset + 2;  # 2 spaces between options & descriptions
+
+	if ($isleafclass) {
+	    gsprintf(STDERR, " {common.specific_options}:\n");
+	}
+	else {
+	    gsprintf(STDERR, " {common.general_options}:\n", $pluginname);
+	}
+
+	# Display the plugin options
+	&PrintUsage::print_options_txt($pluginargs, $optiondescoffset);
+    }
+
+    # Recurse up the plugin hierarchy
+    $self->print_plugin_usage($descoffset, 0);
+    $self->{'option_list'} = \@optionlist;
+}
+
+
+1;
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/ProCitePlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/ProCitePlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/ProCitePlugin.pm	(revision 24799)
@@ -0,0 +1,253 @@
+###########################################################################
+#
+# ProCitePlugin.pm -- A plugin for (exported) ProCite databases
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright 1999-2004 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package ProCitePlugin;
+
+
+use multiread;
+use SplitTextFile;
+use MetadataRead;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+# ProCitePlugin is a sub-class of SplitTextFile
+sub BEGIN {
+    @ProCitePlugin::ISA = ('MetadataRead', 'SplitTextFile');
+}
+
+
+my $arguments = 
+    [ { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'reqd' => "no",
+	'deft' => &get_default_process_exp() },
+      { 'name' => "split_exp",
+	'desc' => "{SplitTextFile.split_exp}",
+	'type' => "regexp",
+	'deft' => &get_default_split_exp(),
+	'reqd' => "no" },
+      
+      # The interesting options
+      { 'name' => "entry_separator",
+	'desc' => "{ProCitePlugin.entry_separator}",
+	'type' => "string",
+	'reqd' => "no",
+	'deft' => "//" },
+      ];
+
+my $options = { 'name'     => "ProCitePlugin",
+		'desc'     => "{ProCitePlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'explodes' => "yes",
+		'args'     => $arguments };
+
+
+# This plugin processes exported ProCite files with the suffix ".txt"
+sub get_default_process_exp
+{
+    return q^(?i)(\.txt)$^;
+}
+
+
+# This plugin splits the input text at every line
+sub get_default_split_exp
+{
+    return q^\n^;
+}
+
+
+sub new
+{
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new SplitTextFile($pluginlist, $inputargs, $hashArgOptLists);
+
+    return bless $self, $class;
+}
+
+
+my %crazy_workform_mapping =
+    ( "A", "Book, Long Form",
+      "B", "Book, Short Form",
+      "C", "Journal, Long Form",
+      "D", "Journal, Short Form",
+      "E", "Report",
+      "F", "Newspaper",
+      "G", "Dissertation",
+      "H", "Trade Catalog",
+      "I", "Letter (Correspondence)",
+      "J", "Manuscript",
+      "K", "Conference Proceedings",
+      "L", "Map",
+      "M", "Music Score",
+      "N", "Sound Recording",
+      "O", "Motion Picture",
+      "P", "Audiovisual Material",
+      "Q", "Video Recording",
+      "R", "Art Work",
+      "S", "Computer Program",
+      "T", "Data File" );
+
+
+sub read_file
+{
+    my $self = shift (@_);
+    my ($filename, $encoding, $language, $textref) = @_;
+    
+    # Store the workform definitions for this file
+    my %workform_definitions = ();
+
+    # Read the contents of the file into $textref
+    open(PROCITE_FILE, "<$filename");
+    my $reader = new multiread();
+    $reader->set_handle ('ProCitePlugin::PROCITE_FILE');
+    $reader->set_encoding ($encoding);
+    $reader->read_file ($textref);
+    close(PROCITE_FILE);
+
+    # Read the workform definitions at the start of the file
+    while ($$textref =~ /^\<Workform Definition\>/) {
+	# Remove the workform definition line so it is not processed later as a record
+	$$textref =~ s/^\<Workform Definition\>(.*)\n//;
+	my $workform_definition = $1;
+	# Parse the workform definitions and store them for later
+	$workform_definition =~ s/^\"([^\"]*)\",//;
+	my $workform_name = $1;
+	my @workform_values;
+	while ($workform_definition !~ /^\s*$/) {
+	    $workform_definition =~ s/^\"([^\"]*)\",?//;
+	    my $workform_field = $1;
+	    push(@workform_values, $workform_field);
+	}
+	
+	# Remember this workform definition for when we're reading the records
+	$workform_definitions{$workform_name} = \@workform_values;
+    }
+
+    $self->{'workform_definitions'}->{$filename} = \%workform_definitions;
+}
+
+
+sub process
+{
+    my $self = shift (@_);
+    my ($textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+
+    my $outhandle = $self->{'outhandle'};
+    my $filename = &util::filename_cat($base_dir, $file);
+    my $cursection = $doc_obj->get_top_section();
+
+    # Build up an HTML view of the record for easy display at run-time
+    my $html_record = "<table>";
+
+    # Read the record's workform indicator and record number
+    #$$textref =~ s/^\"([^\"]*)\",\"([^\"]*)\",//;
+    $$textref =~  s/^\"([^\"]*)\",//;
+    my $workform_indicator = $1;
+
+    # some procite files have a record number next
+    
+    my $recordnum = $$textref =~ s/^\"(\d*)\",//;
+    $recordnum = "undefined" unless defined $recordnum;
+
+    # If necessary, map the workform indicator into something useful
+    if ($crazy_workform_mapping{$workform_indicator}) {
+	$workform_indicator = $crazy_workform_mapping{$workform_indicator};
+    }
+
+    # Check we know about the workform of this record
+    my %workform_definitions = %{$self->{'workform_definitions'}->{$filename}};
+    if (!$workform_definitions{$workform_indicator}) {
+	print STDERR "Unknown workform $workform_indicator!\n";
+	return 0;
+    }
+
+    # Store the full record as the document text
+    $doc_obj->add_utf8_text($cursection, $$textref);
+
+    # Store workform and record number as metadata
+    $doc_obj->add_utf8_metadata($cursection, "Workform", $workform_indicator);
+    $doc_obj->add_utf8_metadata($cursection, "RecordNumber", $recordnum);
+    
+    # Store FileFormat metadata
+    $doc_obj->add_metadata($cursection, "FileFormat", "ProCite");
+
+    $html_record .= "<tr><td valign=top><b>Record Number: </b></td><td valign=top>$recordnum</td></tr>";
+
+    my @workform_values = @{$workform_definitions{$workform_indicator}};
+
+    # Read each field (surrounded by quotes) of the record
+    my $fieldnum = 0;
+    while ($$textref !~ /^\s*$/) {
+	$$textref =~ s/^\"([^\"]*)\",?//;
+	my $field_value_raw = $1;
+
+	# Add non-empty metadata values to the document
+	unless ($field_value_raw eq "") {
+	    # Add the display name of the metadata field for format statement convenience
+	    my $field_name = $workform_values[$fieldnum];
+	    #unless ($field_name eq "---") {
+	#	my $meta_name = "Field" . ($fieldnum + 1) . "Name";
+	#	$doc_obj->add_utf8_metadata($cursection, $meta_name, $field_name);
+	 #   }
+	    if ($field_name eq "---") {
+		$field_name = "Field" . ($fieldnum + 1);
+	    }
+	    $html_record .= "<tr><td valign=top><b>$field_name: </b></td><td valign=top>";
+
+	    # Multiple metadata values are separated with "//"
+	    #foreach my $field_value (split(/\/\//, $field_value_raw)) {
+	    foreach my $field_value (split($self->{'entry_separator'}, $field_value_raw)) {
+		#my $meta_name = "Field" . ($fieldnum + 1) . "Value";
+		#$doc_obj->add_utf8_metadata($cursection, $meta_name, $field_value);
+		$doc_obj->add_utf8_metadata($cursection, $field_name, $field_value);
+		$html_record .= $field_value . "<br>";
+	    }
+
+	    $html_record .= "</td></tr>";
+	}
+
+	$fieldnum++;
+    }
+
+    $html_record .= "</table>";
+    # Store HTML view of record as metadata
+    $doc_obj->add_utf8_metadata($cursection, "HTMLDisplay", $html_record);
+
+    # Record was processed successfully
+    return 1;
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/RTFPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/RTFPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/RTFPlugin.pm	(revision 24799)
@@ -0,0 +1,115 @@
+###########################################################################
+#
+# RTFPlugin.pm -- plugin for importing Rich Text Format files.
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2001 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package RTFPlugin;
+
+use ConvertBinaryFile;
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+sub BEGIN {
+    @RTFPlugin::ISA = ('ConvertBinaryFile');
+}
+
+# currently only converts to HTML
+my $convert_to_list =
+    [ {	'name' => "html",
+	'desc' => "{ConvertBinaryFile.convert_to.html}" } ];
+
+my $arguments =
+    [ { 'name' => "convert_to",
+	'desc' => "{ConvertBinaryFile.convert_to}",
+	'type' => "enum",
+	'reqd' => "yes",
+	'list' => $convert_to_list, 
+	'deft' => "html" },
+      { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'deft' => &get_default_process_exp(),
+	'reqd' => "no" },
+      { 'name' => "description_tags",
+	'desc' => "{HTMLPlugin.description_tags}",
+	'type' => "flag" }
+];
+
+my $options = { 'name'     => "RTFPlugin",
+		'desc'     => "{RTFPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'srcreplaceable' => "yes", # Source docs in rtf can be replaced with GS-generated html
+		'args'     => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+ 
+    my $self = new ConvertBinaryFile($pluginlist, $inputargs, $hashArgOptLists);
+
+    if ($self->{'info_only'}) {
+	# don't worry about any options etc
+	return bless $self, $class;
+    }
+
+    $self->{'file_type'} = "RTF";
+
+    # set convert_to_plugin and convert_to_ext
+    $self->set_standard_convert_settings();
+    my $secondary_plugin_name = $self->{'convert_to_plugin'};
+    my $secondary_plugin_options = $self->{'secondary_plugin_options'};
+
+    if (!defined $secondary_plugin_options->{$secondary_plugin_name}) {
+	$secondary_plugin_options->{$secondary_plugin_name} = [];
+    }
+    my $specific_options = $secondary_plugin_options->{$secondary_plugin_name};
+    
+    push(@$specific_options, "-file_rename_method", "none");
+    push(@$specific_options, "-extract_language") if $self->{'extract_language'};
+    if ($secondary_plugin_name eq "TextPlugin") {
+	push(@$specific_options, "-input_encoding", "utf8");
+    }
+    elsif ($secondary_plugin_name eq "HTMLPlugin") {
+	push(@$specific_options, "-description_tags") if $self->{'description_tags'};
+	push(@$specific_options, "-processing_tmp_files");
+    }
+
+    $self = bless $self, $class;
+
+    $self->load_secondary_plugins($class,$secondary_plugin_options, $hashArgOptLists);
+
+    return $self;
+}
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+    return q^(?i)\.rtf$^;
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/ReadTextFile.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/ReadTextFile.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/ReadTextFile.pm	(revision 24799)
@@ -0,0 +1,574 @@
+###########################################################################
+#
+# ReadTxtFile.pm -- base class for import plugins that have plain text files
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999-2005 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package ReadTextFile;
+
+use strict; 
+no strict 'subs';
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+use Encode;
+
+use multiread;
+use encodings;
+use unicode;
+use textcat;
+use doc;
+use ghtml;
+use gsprintf 'gsprintf';
+
+use AutoExtractMetadata;
+
+sub BEGIN {
+    @ReadTextFile::ISA = ( 'AutoExtractMetadata' );
+}
+
+my $encoding_plus_auto_list = 
+    [ { 'name' => "auto",
+	'desc' => "{ReadTextFile.input_encoding.auto}" } ];
+push(@{$encoding_plus_auto_list},@{$BasePlugin::encoding_list});
+
+my $arguments =
+    [ { 'name' => "input_encoding",
+	'desc' => "{ReadTextFile.input_encoding}",
+	'type' => "enum",
+	'list' => $encoding_plus_auto_list,
+	'reqd' => "no" ,
+	'deft' => "auto" } ,
+      { 'name' => "default_encoding",
+	'desc' => "{ReadTextFile.default_encoding}",
+	'type' => "enum",
+	'list' => $BasePlugin::encoding_list,
+	'reqd' => "no",
+        'deft' => "utf8" },
+      { 'name' => "extract_language",
+	'desc' => "{ReadTextFile.extract_language}",
+	'type' => "flag",
+	'reqd' => "no" },
+      { 'name' => "default_language",
+	'desc' => "{ReadTextFile.default_language}",
+	'type' => "string",
+	'deft' => "en",
+	'reqd' => "no" }
+      ];
+
+
+my $options = { 'name'     => "ReadTextFile",
+		'desc'     => "{ReadTextFile.desc}",
+		'abstract' => "yes",
+		'inherits' => "no",
+		'args'     => $arguments };
+
+
+
+sub new {
+    my $class = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists, $auxiliary) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new AutoExtractMetadata($pluginlist, $inputargs, $hashArgOptLists, $auxiliary);
+
+    return bless $self, $class;
+    
+}
+
+
+
+# The ReadTextFile read_into_doc_obj() function. This function does all the
+# right things to make general options work for a given plugin.  It reads in
+# a file and sets up a slew of metadata all saved in doc_obj, which
+# it then returns as part of a tuple (process_status,doc_obj)
+#
+# Much of this functionality used to reside in read, but it was broken
+# down into a supporting routine to make the code more flexible.  
+#
+# recursive plugins (e.g. RecPlug) and specialized plugins like those
+# capable of processing many documents within a single file (e.g.
+# GMLPlug) will normally want to implement their own version of
+# read_into_doc_obj()
+#
+# Note that $base_dir might be "" and that $file might 
+# include directories
+sub read_into_doc_obj {
+    my $self = shift (@_);  
+    my ($pluginfo, $base_dir, $file, $block_hash, $metadata, $processor, $maxdocs, $total_count, $gli) = @_;
+
+    my $outhandle = $self->{'outhandle'};
+    # should we move this to read? What about secondary plugins?
+    print STDERR "<Processing n='$file' p='$self->{'plugin_type'}'>\n" if ($gli);
+    my $pp_file = &util::prettyprint_file($base_dir,$file,$gli);
+    print $outhandle "$self->{'plugin_type'} processing $pp_file\n"
+	    if $self->{'verbosity'} > 1;
+
+    my ($filename_full_path, $filename_no_path) =  &util::get_full_filenames($base_dir, $file);
+
+    # Do encoding stuff
+    my ($language, $content_encoding) = $self->textcat_get_language_encoding ($filename_full_path);
+    if ($self->{'verbosity'} > 2) {
+	print $outhandle "ReadTextFile: reading $file as ($content_encoding,$language)\n";
+    }
+
+    # create a new document
+    my $doc_obj = new doc ($filename_full_path, "indexed_doc", $self->{'file_rename_method'});
+    my $top_section = $doc_obj->get_top_section();
+
+    # this should look at the plugin option too...
+    $doc_obj->add_utf8_metadata($top_section, "Plugin", "$self->{'plugin_type'}");
+    $doc_obj->add_utf8_metadata($top_section, "FileSize", (-s $filename_full_path));
+
+    my $plugin_filename_encoding = $self->{'filename_encoding'};
+    my $filename_encoding = $self->deduce_filename_encoding($file,$metadata,$plugin_filename_encoding);
+    $self->set_Source_metadata($doc_obj, $filename_full_path, $filename_encoding);
+
+    $doc_obj->add_utf8_metadata($top_section, "Language", $language);
+    $doc_obj->add_utf8_metadata($top_section, "Encoding", $content_encoding);
+    
+    # read in file ($text will be in utf8)
+    my $text = "";
+    $self->read_file ($filename_full_path, $content_encoding, $language, \$text);
+
+    if (!length ($text)) {
+	if ($gli) {
+	    print STDERR "<ProcessingError n='$file' r='File contains no text'>\n";
+	}
+	gsprintf($outhandle, "$self->{'plugin_type'}: {ReadTextFile.file_has_no_text}\n", $filename_full_path) if $self->{'verbosity'};
+
+	my $failhandle = $self->{'failhandle'};
+	gsprintf($failhandle, "$file: " . ref($self) . ": {ReadTextFile.empty_file}\n");
+	# print $failhandle "$file: " . ref($self) . ": file contains no text\n";
+	$self->{'num_not_processed'} ++;
+
+	return (0,undef); # what should we return here?? error but don't want to pass it on
+    }
+   
+    # do plugin specific processing of doc_obj
+    unless (defined ($self->process (\$text, $pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli))) {
+	$text = '';
+	undef $text;
+	print STDERR "<ProcessingError n='$file'>\n" if ($gli);
+	return (-1,undef);
+    }
+    $text='';
+    undef $text;
+   
+    # include any metadata passed in from previous plugins 
+    # note that this metadata is associated with the top level section
+    $self->add_associated_files($doc_obj, $filename_full_path);
+    $self->extra_metadata ($doc_obj, $top_section, $metadata);
+
+     # do any automatic metadata extraction
+    $self->auto_extract_metadata ($doc_obj);
+
+
+    # if we haven't found any Title so far, assign one
+    $self->title_fallback($doc_obj,$top_section,$filename_no_path);
+
+    $self->add_OID($doc_obj);
+    
+    return (1,$doc_obj);
+}
+
+# uses the multiread package to read in the entire file pointed to
+# by filename and loads the resulting text into $$textref. Input text
+# may be in any of the encodings handled by multiread, output text
+# will be in utf8
+sub read_file {
+    my $self = shift (@_);
+    my ($filename, $encoding, $language, $textref) = @_;
+
+    if (!-r $filename)
+    {
+	my $outhandle = $self->{'outhandle'};
+	gsprintf($outhandle, "{ReadTextFile.read_denied}\n", $filename) if $self->{'verbosity'};
+	# print $outhandle "Read permission denied for $filename\n" if $self->{'verbosity'};
+	return;
+    }
+    $$textref = "";
+    if (!open (FILE, $filename)) {
+	gsprintf(STDERR, "ReadTextFile::read_file {ReadTextFile.could_not_open_for_reading} ($!)\n", $filename);
+	die "\n";
+    }
+     
+    if ($encoding eq "ascii") {
+	# Replace file 'slurp' with faster implementation
+	sysread(FILE, $$textref, -s FILE);
+	
+	# The old slow way of reading in a file
+	#undef $/;
+	#$$textref = <FILE>;
+	#$/ = "\n";
+    } else {
+	my $reader = new multiread();
+	$reader->set_handle ('ReadTextFile::FILE');
+	$reader->set_encoding ($encoding);
+	$reader->read_file ($textref);
+    }
+
+    # At this point $$textref is a binary byte string
+    # => turn it into a Unicode aware string, so full
+    # Unicode aware pattern matching can be used.
+    # For instance: 's/\x{0101}//g' or '[[:upper:]]'
+    # 
+
+    $$textref = decode("utf8",$$textref);
+
+    close FILE;
+}
+
+
+# Not currently used
+sub UNUSED_read_file_usingPerlsEncodeModule {
+##sub read_file {
+    my $self = shift (@_);
+    my ($filename, $encoding, $language, $textref) = @_;
+
+    if (!-r $filename)
+    {
+        my $outhandle = $self->{'outhandle'};
+        gsprintf($outhandle, "{ReadTextFile.read_denied}\n", $filename) if $self->{'verbosity'};
+        # print $outhandle "Read permission denied for $filename\n" if $self->{'verbosity'};
+        return;
+    }
+    $$textref = "";
+    if (!open (FILE, $filename)) {
+        gsprintf(STDERR, "ReadTextFile::read_file {ReadTextFile.could_not_open_f
+or_reading} ($!)\n", $filename);
+        die "\n";
+    }
+
+    my $store_slash = $/;
+    undef $/;
+    my $text = <FILE>;
+    $/ = $store_slash;
+
+    $$textref = decode($encoding,$text);
+
+    close FILE;
+}
+
+
+sub read_file_no_decoding {
+    my $self = shift (@_);
+    my ($filename, $textref) = @_;
+
+    if (!-r $filename)
+    {
+	my $outhandle = $self->{'outhandle'};
+	gsprintf($outhandle, "{ReadTextFile.read_denied}\n", $filename) if $self->{'verbosity'};
+	# print $outhandle "Read permission denied for $filename\n" if $self->{'verbosity'};
+	return;
+    }
+    $$textref = "";
+    if (!open (FILE, $filename)) {
+	gsprintf(STDERR, "ReadTextFile::read_file {ReadTextFile.could_not_open_for_reading} ($!)\n", $filename);
+	die "\n";
+    }
+     
+    my $reader = new multiread();
+    $reader->set_handle ('ReadTextFile::FILE');
+    $reader->read_file_no_decoding ($textref);
+    
+    $self->{'reader'} = $reader;
+
+    close FILE;
+}
+
+
+sub decode_text {
+    my $self = shift (@_);
+    my ($raw_text, $encoding, $language, $textref) = @_;
+
+    my $reader = $self->{'reader'};
+    if (!defined $reader) {
+	gsprintf(STDERR, "ReadTextFile::decode_text needs to call ReadTextFile::read_file_no_decoding first\n");
+    }
+    else {
+	$reader->set_encoding($encoding);
+	$reader->decode_text($raw_text,$textref);
+
+	# At this point $$textref is a binary byte string
+	# => turn it into a Unicode aware string, so full
+	# Unicode aware pattern matching can be used.
+	# For instance: 's/\x{0101}//g' or '[[:upper:]]'	
+	
+	$$textref = decode("utf8",$$textref);
+    }
+}
+
+
+sub textcat_get_language_encoding {
+    my $self = shift (@_);
+    my ($filename) = @_;
+
+    my ($language, $encoding, $extracted_encoding);
+    if ($self->{'input_encoding'} eq "auto") {
+        # use textcat to automatically work out the input encoding and language
+        ($language, $encoding) = $self->get_language_encoding ($filename);
+    } elsif ($self->{'extract_language'}) {
+	# use textcat to get language metadata
+        ($language, $extracted_encoding) = $self->get_language_encoding ($filename);
+        $encoding = $self->{'input_encoding'};
+	# don't print this message for english... english in utf8 is identical
+	# to english in iso-8859-1 (except for some punctuation). We don't have
+	# a language model for en_utf8, so textcat always says iso-8859-1!
+        if ($extracted_encoding ne $encoding && $language ne "en" && $self->{'verbosity'}) {
+	    my $plugin_name = ref ($self);
+	    my $outhandle = $self->{'outhandle'};
+	    gsprintf($outhandle, "$plugin_name: {ReadTextFile.wrong_encoding}\n", $filename, $encoding, $extracted_encoding);
+        }
+    } else {
+        $language = $self->{'default_language'};
+        $encoding = $self->{'input_encoding'}; 
+    }
+    
+#    print STDERR "**** language encoding of contents of file $filename:\n\t****$language $encoding\n";
+
+    return ($language, $encoding);
+}
+
+
+# Uses textcat to work out the encoding and language of the text in 
+# $filename. All html tags are removed before processing.
+# returns an array containing "language" and "encoding"
+sub get_language_encoding {
+    my $self = shift (@_);
+    my ($filename) = @_;
+    my $outhandle = $self->{'outhandle'};
+    my $unicode_format = "";
+    my $best_language = "";
+    my $best_encoding = "";
+    
+
+    # read in file
+    if (!open (FILE, $filename)) {
+	gsprintf(STDERR, "ReadTextFile::get_language_encoding {ReadTextFile.could_not_open_for_reading} ($!)\n", $filename);
+	# this is a pretty bad error, but try to continue anyway
+	return ($self->{'default_language'}, $self->{'input_encoding'});
+    }
+    undef $/;
+    my $text = <FILE>;
+    $/ = "\n";
+    close FILE;
+
+    # check if first few bytes have a Byte Order Marker
+    my $bom=substr($text,0,2); # check 16bit unicode
+    if ($bom eq "\xff\xfe") { # little endian 16bit unicode
+	$unicode_format="unicode";
+    } elsif ($bom eq "\xfe\xff") { # big endian 16bit unicode
+	$unicode_format="unicode";
+    } else {
+	$bom=substr($text,0,3); # check utf-8
+	if ($bom eq "\xef\xbb\xbf") { # utf-8 coded FEFF bom
+	    $unicode_format="utf8";
+#	} elsif ($bom eq "\xef\xbf\xbe") { # utf-8 coded FFFE bom. Error!?
+#	    $unicode_format="utf8";
+	}
+    }
+    
+    my $found_html_encoding = 0;
+    # handle html files specially
+    # XXX this doesn't match plugins derived from HTMLPlug (except ConvertTo)
+    if (ref($self) eq 'HTMLPlugin' ||
+	(exists $self->{'converted_to'} && $self->{'converted_to'} eq 'HTML')){
+
+	# remove comments in head, including multiline ones, so that we don't match on 
+	# inactive tags (those that are nested inside comments)
+	my ($head) = ($text =~ m/<head>(.*)<\/head>/si);
+	$head = "" unless defined $head; # some files are not proper HTML eg php files
+	$head =~ s/<!--.*?-->//sg;
+
+	# remove <title>stuff</title> -- as titles tend often to be in English
+	# for foreign language documents
+	$text =~ s!<title>.*?</title>!!si;
+
+	# see if this html file specifies its encoding
+	if ($text =~ /^<\?xml.*encoding="(.+?)"/) {
+	    $best_encoding = $1;
+	}
+	# check the meta http-equiv charset tag
+	elsif ($head =~ m/<meta http-equiv.*content-type.*charset=(.+?)\"/si) {		       
+	    $best_encoding = $1;
+	}
+	if ($best_encoding) { # we extracted an encoding
+	    $best_encoding =~ s/-+/_/g;
+	    $best_encoding = lc($best_encoding); # lowercase
+	    if ($best_encoding eq "utf_8") { $best_encoding = "utf8" }
+	    $found_html_encoding = 1;
+	    # We shouldn't be modifying this here!!
+	    #$self->{'input_encoding'} = $best_encoding;
+	}
+        
+	# remove all HTML tags
+	$text =~ s/<[^>]*>//sg;
+    }
+
+    # don't need to do textcat if we know the encoding now AND don't need to extract language
+    if($found_html_encoding && !$self->{'extract_language'}) { # encoding specified in html file
+	$best_language = $self->{'default_language'};
+    }
+
+    else { # need to use textcat to get either the language, or get both language and encoding
+	$self->{'textcat'} = new textcat() if (!defined($self->{'textcat'}));
+	
+	if($found_html_encoding) { # know encoding, find language by limiting search to known encoding
+	    my $results = $self->{'textcat'}->classify_contents_for_encoding(\$text, $filename, $best_encoding);
+	    
+	    my $language;
+	    ($language) = $results->[0] =~ m/^([^-]*)(?:-(?:.*))?$/ if (scalar @$results > 0);
+
+	    if (!defined $language || scalar @$results > 3) {
+		# if there were too many results even when restricting results by encoding,
+		# or if there were no results, use default language with the known encoding
+		$best_language = $self->use_default_language($filename);
+	    } 
+	    else { # fewer than 3 results means textcat is more certain, use the first result
+		$best_language = $language;		
+	    } 
+	}
+	else { # don't know encoding or language yet, therefore we use textcat
+	    my $results = $self->{'textcat'}->classify_contents(\$text, $filename);
+	    
+	    # if textcat returns 3 or less possibilities we'll use the first one in the list
+	    if (scalar @$results <= 3) { # results will be > 0 when we don't constrain textcat by an encoding
+		my ($language, $encoding) = $results->[0] =~ m/^([^-]*)(?:-(.*))?$/;
+
+		$language = $self->use_default_language($filename) unless defined $language;
+		$encoding = $self->use_default_encoding($filename) unless defined $encoding;
+
+		$best_language = $language;
+		$best_encoding = $encoding;
+	    }
+	    else { # if (scalar @$results > 3) {
+		if ($unicode_format) { # in case the first had a BOM
+		    $best_encoding=$unicode_format;
+		}
+		else {
+		    # Find the most frequent encoding in the textcat results returned
+		    # Returns "" if there's no encoding more frequent than another
+		    $best_encoding = $self->{'textcat'}->most_frequent_encoding($results);
+		}
+		
+		if ($best_encoding eq "") { # encoding still not set, use defaults
+		    $best_language = $self->use_default_language($filename);
+		    $best_encoding = $self->use_default_encoding($filename);
+		}
+		elsif (!$self->{'extract_language'}) { # know encoding but don't need to discover language
+		    $best_language = $self->use_default_language($filename);
+		}
+		else { # textcat again using the most frequent encoding or the $unicode_format set above
+		    $results = $self->{'textcat'}->classify_contents_for_encoding(\$text, $filename, $best_encoding);
+		    my $language;
+		    ($language) = $results->[0] =~ m/^([^-]*)(?:-(.*))?$/ if (scalar @$results > 0);
+		    if (!defined $language || scalar @$results > 3) { 
+			# if no result or too many results, use default language for the encoding previously found
+			$best_language = $self->use_default_language($filename);
+		    }
+		    else { # fewer than 3 results, use the language of the first result
+			$best_language = $language;
+		    }
+		}
+	    }
+	}
+    }
+
+    if($best_encoding eq "" || $best_language eq "") {
+	print STDERR "****Shouldn't happen: encoding and/or language still not set. Using defaults.\n";
+	$best_encoding = $self->use_default_encoding($filename) if $best_encoding eq "";
+	$best_language = $self->use_default_language($filename) if $best_language eq "";
+    }
+#    print STDERR "****Content language: $best_language; Encoding: $best_encoding.\n";
+
+
+    if ($best_encoding =~ /^iso_8859/ && &unicode::check_is_utf8($text)) {
+	# the text is valid utf8, so assume that's the real encoding
+	# (since textcat is based on probabilities)
+	$best_encoding = 'utf8';
+    }
+
+    # check for equivalents where textcat doesn't have some encodings...
+    # eg MS versions of standard encodings
+    if ($best_encoding =~ /^iso_8859_(\d+)/) {
+	my $iso = $1; # which variant of the iso standard?
+	# iso-8859 sets don't use chars 0x80-0x9f, windows codepages do
+	if ($text =~ /[\x80-\x9f]/) {
+	    # Western Europe
+	    if ($iso == 1 or $iso == 15) { $best_encoding = 'windows_1252' }
+	    elsif ($iso == 2) {$best_encoding = 'windows_1250'} # Central Europe
+	    elsif ($iso == 5) {$best_encoding = 'windows_1251'} # Cyrillic
+	    elsif ($iso == 6) {$best_encoding = 'windows_1256'} # Arabic
+	    elsif ($iso == 7) {$best_encoding = 'windows_1253'} # Greek
+	    elsif ($iso == 8) {$best_encoding = 'windows_1255'} # Hebrew
+	    elsif ($iso == 9) {$best_encoding = 'windows_1254'} # Turkish
+	}
+    }
+
+    if ($best_encoding !~ /^(ascii|utf8|unicode)$/ &&
+	!defined $encodings::encodings->{$best_encoding}) {
+	if ($self->{'verbosity'}) {
+	    gsprintf($outhandle, "ReadTextFile: {ReadTextFile.unsupported_encoding}\n",
+		     $filename, $best_encoding, $self->{'default_encoding'});
+	}
+	$best_encoding = $self->{'default_encoding'};
+    }
+
+    return ($best_language, $best_encoding);
+}
+
+
+sub use_default_language {
+    my $self = shift (@_);
+    my ($filename) = @_;
+
+    if ($self->{'verbosity'}>2) {
+	gsprintf($self->{'outhandle'},
+		 "ReadTextFile: {ReadTextFile.could_not_extract_language}\n",
+		 $filename, $self->{'default_language'});
+    }
+    return $self->{'default_language'};
+}
+
+sub use_default_encoding {
+    my $self = shift (@_);
+    my ($filename) = @_;
+
+    if ($self->{'verbosity'}>2) {
+	gsprintf($self->{'outhandle'},
+		 "ReadTextFile: {ReadTextFile.could_not_extract_encoding}\n",
+		 $filename, $self->{'default_encoding'});
+    }
+    return $self->{'default_encoding'};
+}
+
+# Overridden by exploding plugins (eg. ISISPlug)
+sub clean_up_after_exploding
+{
+    my $self = shift(@_);
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/ReadXMLFile.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/ReadXMLFile.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/ReadXMLFile.pm	(revision 24799)
@@ -0,0 +1,430 @@
+###########################################################################
+#
+# ReadXMLFile.pm -- base class for XML plugins
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2001 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package ReadXMLFile;
+
+use BasePlugin;
+use doc;
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+sub BEGIN {
+    @ReadXMLFile::ISA = ('BasePlugin');
+
+    # ensure Greenstone's CPAN is on the path (but check first) [jmt12]
+    my $inc_paths = join(':', @INC);
+    my $gsdl_perllib_path = $ENV{'GSDLHOME'} . '/perllib/cpan';
+    if ($inc_paths !~ /$gsdl_perllib_path/)
+    {
+      unshift (@INC, $gsdl_perllib_path);
+    }
+}
+
+use XMLParser;
+
+my $arguments =
+    [ { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'deft' => &get_default_process_exp(),
+	'reqd' => "no" },
+      { 'name' => "xslt",
+	'desc' => "{ReadXMLFile.xslt}",
+	'type' => "string",
+	'deft' => "",
+	'reqd' => "no" } ];
+
+my $options = { 'name'     => "ReadXMLFile",
+		'desc'     => "{ReadXMLFile.desc}",
+		'abstract' => "yes",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+    
+    my $self = new BasePlugin($pluginlist, $inputargs, $hashArgOptLists);
+
+    if ($self->{'info_only'}) {
+	# don't worry about creating the XML parser as all we want is the 
+	# list of plugin options
+	return bless $self, $class;
+    }
+
+    my $parser = new XML::Parser('Style' => 'Stream',
+                                 'Pkg' => 'ReadXMLFile',
+                                 'PluginObj' => $self,
+				 'Handlers' => {'Char' => \&Char,
+						'XMLDecl' => \&XMLDecl,
+						'Entity'  => \&Entity,
+						'Doctype' => \&Doctype,
+						'Default' => \&Default
+                                 });
+
+    $self->{'parser'} = $parser;
+
+    return bless $self, $class;
+}
+
+# the inheriting class must implement this method to tell whether to parse this doc type
+sub get_doctype {
+    my $self = shift(@_);
+    die "$self The inheriting class must implement get_doctype method";
+}
+
+
+sub apply_xslt
+{
+    my $self = shift @_;
+    my ($xslt,$filename) = @_;
+    
+    my $outhandle = $self->{'outhandle'};
+
+    my $xslt_filename = $xslt;
+
+    if (! -e $xslt_filename) {
+	# Look in main site directory
+	my $gsdlhome = $ENV{'GSDLHOME'};
+	$xslt_filename = &util::filename_cat($gsdlhome,$xslt);
+    }
+
+    if (! -e $xslt_filename) {
+	# Look in collection directory
+	my $coldir = $ENV{'GSDLCOLLECTDIR'};
+	$xslt_filename = &util::filename_cat($coldir,$xslt);
+    }
+
+    if (! -e $xslt_filename) {
+	print $outhandle "Warning: Unable to find XSLT $xslt\n";
+	if (open(XMLIN,"<$filename")) {
+
+	    my $untransformed_xml = "";
+	    while (defined (my $line = <XMLIN>)) {
+
+		$untransformed_xml .= $line;
+	    }
+	    close(XMLIN);
+	    
+	    return $untransformed_xml;
+	}
+	else {
+	    print $outhandle "Error: Unable to open file $filename\n";
+	    print $outhandle "       $!\n";
+	    return "";
+	}
+	
+    }
+
+    my $bin_java = &util::filename_cat($ENV{'GSDLHOME'},"bin","java");
+    my $jar_filename = &util::filename_cat($bin_java,"xalan.jar");
+    my $xslt_base_cmd = "java -jar $jar_filename";
+    my $xslt_cmd = "$xslt_base_cmd -IN \"$filename\" -XSL \"$xslt_filename\"";
+
+    my $transformed_xml = "";
+
+    if (open(XSLT_IN,"$xslt_cmd |")) {
+	while (defined (my $line = <XSLT_IN>)) {
+
+	    $transformed_xml .= $line;
+	}
+	close(XSLT_IN);
+    }
+    else {
+	print $outhandle "Error: Unable to run command $xslt_cmd\n";
+	print $outhandle "       $!\n";
+    }
+
+    return $transformed_xml;
+
+}
+
+sub can_process_this_file {
+    my $self = shift(@_);
+    my ($filename) = @_;
+
+    if (-f $filename 
+	&& $self->SUPER::can_process_this_file($filename)
+	&& $self->check_doctype($filename)) {
+	return 1; # its a file for us
+    }
+    return 0;
+}
+
+sub check_doctype {
+    my $self = shift (@_);
+    
+    my ($filename) = @_;
+
+    if (open(XMLIN,"<$filename")) {
+	my $doctype = $self->get_doctype();
+	## check whether the doctype has the same name as the root element tag
+	while (defined (my $line = <XMLIN>)) {
+	    ## find the root element
+	    if ($line =~ /<([\w\d:]+)[\s>]/){
+		my $root = $1;
+		if ($root !~ $doctype){
+		    close(XMLIN);
+		    return 0;
+		}
+		else {
+		    close(XMLIN); 
+		    return 1;
+		}
+	    }
+	}
+	close(XMLIN);
+    }
+    
+    return undef; # haven't found a valid line
+    
+}
+
+sub read {
+    my $self = shift (@_);  
+  
+    my ($pluginfo, $base_dir, $file, $block_hash, $metadata, $processor, $maxdocs, $total_count, $gli) = @_;
+
+    # can we process this file??
+    my ($filename_full_path, $filename_no_path) = &util::get_full_filenames($base_dir, $file);
+    return undef unless $self->can_process_this_file($filename_full_path);
+    
+    $file =~ s/^[\/\\]+//; # $file often begins with / so we'll tidy it up
+    $self->{'base_dir'} = $base_dir;
+    $self->{'file'} = $file;
+    $self->{'filename'} = $filename_full_path;
+    $self->{'filename_no_path'} = $filename_no_path;
+    $self->{'processor'} = $processor;
+
+    # this contains metadata passed in from running metadata_read with other plugins (eg from MetadataXMLPlugin)
+    # we are also using it to store up any metadata found during parsing the XML, so that it can be added to the doc obj.
+    $self->{'metadata'} = $metadata;
+
+    if ($self->parse_file($filename_full_path)) {
+	return 1; # processed the file
+    }
+    return -1;
+}
+
+
+sub parse_file {
+    my $self = shift (@_);
+    my ($filename_full_path, $file, $gli) = @_;
+    eval {
+	my $xslt = $self->{'xslt'};
+	if (defined $xslt && ($xslt ne "")) {
+	    # perform xslt
+	    my $transformed_xml = $self->apply_xslt($xslt,$filename_full_path);
+
+	    # feed transformed file (now in memory as string) into XML parser
+	    $self->{'parser'}->parse($transformed_xml);
+	}
+	else {
+	    $self->{'parser'}->parsefile($filename_full_path);
+	}
+    };
+  
+    if ($@) {
+
+	# parsefile may either croak somewhere in XML::Parser (e.g. because
+	# the document is not well formed) or die somewhere in ReadXMLFile or a
+	# derived plugin (e.g. because we're attempting to process a
+	# document whose DOCTYPE is not meant for this plugin). For the
+	# first case we'll print a warning and continue, for the second
+	# we'll just continue quietly
+
+	print STDERR "**** Error is: $@\n";
+
+	my ($msg) = $@ =~ /Carp::croak\(\'(.*?)\'\)/;
+	if (defined $msg) {	
+	    my $outhandle = $self->{'outhandle'};
+	    my $plugin_name = ref ($self);
+	    print $outhandle "$plugin_name failed to process $file ($msg)\n";
+	}
+
+	# reset ourself for the next document
+	$self->{'section_level'}=0;
+	print STDERR "<ProcessingError n='$file'>\n" if ($gli);
+	return -1; # error during processing
+    }
+    return 1; # parsing was successful
+}
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+    return q^(?i)\.xml$^;
+}
+
+sub StartDocument {$_[0]->{'PluginObj'}->xml_start_document(@_);}
+sub XMLDecl {$_[0]->{'PluginObj'}->xml_xmldecl(@_);}
+sub Entity {$_[0]->{'PluginObj'}->xml_entity(@_);}
+sub Doctype {$_[0]->{'PluginObj'}->xml_doctype(@_);}
+sub StartTag {$_[0]->{'PluginObj'}->xml_start_tag(@_);}
+sub EndTag {$_[0]->{'PluginObj'}->xml_end_tag(@_);}
+sub Text {$_[0]->{'PluginObj'}->xml_text(@_);}
+sub PI {$_[0]->{'PluginObj'}->xml_pi(@_);}
+sub EndDocument {$_[0]->{'PluginObj'}->xml_end_document(@_);}
+sub Default {$_[0]->{'PluginObj'}->xml_default(@_);}
+
+# This Char function overrides the one in XML::Parser::Stream to overcome a
+# problem where $expat->{Text} is treated as the return value, slowing
+# things down significantly in some cases.
+sub Char {
+    use bytes;  # Necessary to prevent encoding issues with XML::Parser 2.31+
+    $_[0]->{'Text'} .= $_[1];
+    return undef;
+}
+
+
+# Called at the beginning of the XML document.
+sub xml_start_document {
+    my $self = shift(@_);
+    my ($expat) = @_;
+
+    $self->open_document();
+}
+
+# Called for XML declarations
+sub xml_xmldecl {
+    my $self = shift(@_);
+    my ($expat, $version, $encoding, $standalone) = @_;
+}
+
+# Called for XML entities
+sub xml_entity {
+  my $self = shift(@_);
+  my ($expat, $name, $val, $sysid, $pubid, $ndata) = @_;
+}
+
+# Called for DOCTYPE declarations - use die to bail out if this doctype
+# is not meant for this plugin
+sub xml_doctype {
+    my $self = shift(@_);
+
+    my ($expat, $name, $sysid, $pubid, $internal) = @_;
+    die "ReadXMLFile Cannot process XML document with DOCTYPE of $name";
+}
+
+
+# Called for every start tag. The $_ variable will contain a copy of the
+# tag and the %_ variable will contain the element's attributes.
+sub xml_start_tag {
+    my $self = shift(@_);
+    my ($expat, $element) = @_;
+}
+
+# Called for every end tag. The $_ variable will contain a copy of the tag.
+sub xml_end_tag {
+    my $self = shift(@_);
+    my ($expat, $element) = @_;
+}
+
+# Called just before start or end tags with accumulated non-markup text in
+# the $_ variable.
+sub xml_text {
+    my $self = shift(@_);
+    my ($expat) = @_;
+}
+
+# Called for processing instructions. The $_ variable will contain a copy
+# of the pi.
+sub xml_pi {
+    my $self = shift(@_);
+    my ($expat, $target, $data) = @_;
+}
+
+# Called at the end of the XML document.
+sub xml_end_document {
+    my $self = shift(@_);
+    my ($expat) = @_;
+
+    $self->close_document();
+}
+
+# Called for any characters not handled by the above functions.
+sub xml_default {
+    my $self = shift(@_);
+    my ($expat, $text) = @_;
+}
+
+sub open_document {
+    my $self = shift(@_);
+
+    my $metadata = $self->{'metadata'};
+    my $filename_full_path = $self->{'filename'};
+
+    # create a new document
+    my $doc_obj = $self->{'doc_obj'} = new doc ($filename_full_path, "indexed_doc", $self->{'file_rename_method'});
+
+    $doc_obj->add_utf8_metadata($doc_obj->get_top_section(), "Plugin", "$self->{'plugin_type'}");
+
+    my $filename_no_path = $self->{'filename_no_path'};
+    my $plugin_filename_encoding = $self->{'filename_encoding'};
+    my $filename_encoding = $self->deduce_filename_encoding($filename_no_path,$metadata,$plugin_filename_encoding);
+
+    $self->set_Source_metadata($doc_obj, $filename_full_path, $filename_encoding);
+    
+    # do we want other auto metadata here (see BasePlugin.read_into_doc_obj)
+}
+
+sub close_document {
+    my $self = shift(@_);
+    my $doc_obj = $self->{'doc_obj'};
+
+    # do we want other auto stuff here, see BasePlugin.read_into_doc_obj
+
+    # include any metadata passed in from previous plugins 
+    # note that this metadata is associated with the top level section
+    $self->extra_metadata ($doc_obj, 
+			   $doc_obj->get_top_section(), 
+			   $self->{'metadata'});
+   
+    # do any automatic metadata extraction
+    $self->auto_extract_metadata ($doc_obj);
+   
+    # add an OID
+    $self->add_OID($doc_obj);
+    
+    $doc_obj->add_utf8_metadata($doc_obj->get_top_section(), "Plugin", "$self->{'plugin_type'}");
+    $doc_obj->add_metadata($doc_obj->get_top_section(), "FileFormat", "XML");
+
+    # process the document
+    $self->{'processor'}->process($doc_obj);
+    
+    $self->{'num_processed'} ++;
+    undef $self->{'doc_obj'};
+    undef $doc_obj; # is this the same as above??
+}
+
+1;
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/RealMediaPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/RealMediaPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/RealMediaPlugin.pm	(revision 24799)
@@ -0,0 +1,122 @@
+###########################################################################
+#
+# RealMediaPlugin.pm -- Extract metadata from Real Media files
+#
+# Original code by Xin Gao
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2005 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package RealMediaPlugin;
+
+
+use BasePlugin;
+use rm::Header::PurePerl;
+
+use strict;
+no strict 'refs'; # make an exception so we can use variables as filehandles
+no strict 'subs';
+
+sub BEGIN {
+    @RealMediaPlugin::ISA = ('BasePlugin');
+}
+
+
+my $arguments =
+    [ { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'deft' => &get_default_process_exp(),
+	'reqd' => "no" } ];
+
+my $options = { 'name'     => "RealMediaPlugin",
+		'desc'     => "{RealMediaPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+
+# This plugin processes Real Media files with the suffixes ".rm" and ".rmvb"
+sub get_default_process_exp
+{
+    return q^(?i)(\.rm|rmvb)$^;
+}
+
+
+sub new
+{
+    my ($class) = shift(@_);
+    my ($pluginlist, $inputargs, $hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}}, @{$arguments}); 
+    push(@{$hashArgOptLists->{"OptList"}}, $options); 
+
+    my $self = new BasePlugin($pluginlist, $inputargs, $hashArgOptLists);
+    
+    return bless $self, $class;
+}
+
+# we don't want to hash on the file
+sub get_oid_hash_type {
+    my $self = shift (@_);
+    return "hash_on_ga_xml";
+}
+
+sub process
+{
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+
+    my ($filename_full_path, $filename_no_path) = &util::get_full_filenames($base_dir, $file);
+    my $top_section = $doc_obj->get_top_section();
+
+    my $text = "";
+    my $real_media = rm::Header::PurePerl->new($filename_full_path);
+    if (!defined $real_media || !defined $real_media->info) {
+	my $outhandle = $self->{'outhandle'};
+	print $outhandle "RealMediaPlugin: $filename_no_path is not a real media file\n";
+	return undef;
+    }
+    foreach my $key (keys %{$real_media->info})
+    {
+	my $value = $real_media->info->{$key};
+	$doc_obj->add_metadata($top_section, $key, $value);
+	$text .= "$key: $value\n";
+    }
+    
+    $doc_obj->add_utf8_text($top_section, "<pre>\n$text\n</pre>");
+    $doc_obj->add_metadata($top_section, "FileFormat", "RealMedia");
+
+    # srclink_file is now deprecated because of the "_" in the metadataname. Use srclinkFile
+    $doc_obj->add_metadata ($top_section, "srclink_file", $doc_obj->get_sourcefile());
+    $doc_obj->add_metadata ($top_section, "srclinkFile", $doc_obj->get_sourcefile());
+    $doc_obj->add_metadata($top_section, "srcicon", "_iconrmvideo_");
+
+    # Add the actual filename as it exists on the file system (URL-encoded) as an 
+    # associated file by making sure we undo any escaped URL-encoding there may be
+    my $assoc_file = $doc_obj->get_assocfile_from_sourcefile(); # just url-encoded filename, no path
+    $doc_obj->associate_file($filename_full_path, $assoc_file, "RealMedia", $top_section);
+
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/ReferPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/ReferPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/ReferPlugin.pm	(revision 24799)
@@ -0,0 +1,309 @@
+###########################################################################
+#
+# ReferPlugin.pm - a plugin for bibliography records in Refer format
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright 2000 Gordon W. Paynter
+# Copyright 1999-2000 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# ReferPlugin reads bibliography files in Refer format.
+#
+# by Gordon W. Paynter (gwp@cs.waikato.ac.nz), November 2000
+#
+# Loosely based on hcibib2Plug by Steve Jones (stevej@cs.waikato.ac.nz).
+# Which was based on EMAILPlug by Gordon Paynter (gwp@cs.waikato.ac.nz).
+# Which was based on old versions of HTMLplug and HCIBIBPlugby by Stefan
+# Boddie and others -- it's hard to tell what came from where, now.
+#
+#
+# ReferPlugin creates a document object for every reference in the file.
+# It is a subclass of SplitTextFile, so if there are multiple records, all
+# are read.
+#
+# Document text:
+#   The document text consists of the reference in Refer format
+#
+# Metadata:
+#	$Creator	%A	Author name
+#	$Title		%T	Title of article of book
+#	$Journal	%J	Title of Journal
+#	$Booktitle	%B	Title of book containing the publication
+#	$Report		%R	Type of Report, paper or thesis
+#	$Volume		%V	Volume Number of Journal
+#	$Number		%N	Number of Journal within Volume
+#	$Editor		%E	Editor name
+#	$Pages		%P	Page Number of article
+#	$Publisher	%I	Name of Publisher
+#	$Publisheraddr	%C	Publisher's address
+#	$Date		%D	Date of publication
+#	$Keywords	%K	Keywords associated with publication 
+#	$Abstract	%X	Abstract of publication
+#	$Copyright	%*	Copyright information for the article
+#
+
+package ReferPlugin;
+
+use SplitTextFile;
+use MetadataRead;
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+# ReferPlugin is a sub-class of BasePlugin.
+sub BEGIN {
+    @ReferPlugin::ISA = ('MetadataRead', 'SplitTextFile');
+}
+
+my $arguments =
+    [ { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'deft' => &get_default_process_exp(),
+	'reqd' => "no" },
+      { 'name' => "split_exp",
+	'desc' => "{SplitTextFile.split_exp}",
+	'type' => "regexp",
+	'reqd' => "no",
+	'deft' => &get_default_split_exp() } 
+      ];
+
+my $options = { 'name'     => "ReferPlugin",
+		'desc'     => "{ReferPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'explodes' => "yes",
+		'args'     => $arguments };
+
+# This plugin processes files with the suffix ".bib"
+sub get_default_process_exp {
+    return q^(?i)\.bib$^;
+}
+
+# This plugin splits the input text at blank lines
+sub get_default_split_exp {
+    return q^\n\s*\n^;
+}
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new SplitTextFile($pluginlist, $inputargs, $hashArgOptLists);
+
+    return bless $self, $class;
+}
+
+# The process function reads a single bibliographic record and stores
+# it as a new document.
+
+sub process {
+    my $self = shift (@_);
+    my ($textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    # Check that we're dealing with a valid Refer file
+    return undef unless ($$textref =~ /^\s*%/);
+
+    my $cursection = $doc_obj->get_top_section();
+
+    my %field = ('H', 'Header',
+		 'A', 'Creator',
+		 'T', 'Title',
+		 'J', 'Journal',
+		 'B', 'Booktitle',
+		 'R', 'Report',
+		 'V', 'Volume',
+		 'N', 'Number',
+		 'E', 'Editor',
+		 'P', 'Pages',
+		 'I', 'Publisher',
+		 'C', 'PublisherAddress',
+		 'D', 'Date',
+		 'O', 'OtherInformation',
+		 'K', 'Keywords',
+		 'X', 'Abstract',
+		 '*', 'Copyright');
+
+    # Metadata fields 
+    my %metadata;
+    my ($id, $Creator, $Keywords, $text);
+    my @lines = split(/\n+/, $$textref);
+
+    
+    # Read and process each line in the bib file.
+    # Each file consists of a set of metadata items, one to each line
+    # with the Refer key followed by a space then the associated data
+    foreach my $line (@lines) {
+	
+	# Add each line.  Most lines consist of a field identifer and
+	# then data, and we simply store them, though we treat some
+	# of the fields a bit differently.
+
+	$line =~ s/\s+/ /g;
+	$text .= "$line\n";
+	# $ReferFormat .= "$line\n"; # what is this???
+	
+	next unless ($line =~ /^%[A-Z\*]/);
+	$id = substr($line,1,1);
+	$line =~ s/^%. //;
+   	
+	# Add individual authors in "Lastname, Firstname" format.
+	# (The full set of authors will be added below as "Creator".)
+	if ($id eq "A") {
+
+	    # Reformat and add author name
+	    my @words = split(/ /, $line);
+	    my $lastname = pop @words;
+	    my $firstname = join(" ",  @words);
+	    my $fullname = $lastname . ", " . $firstname;
+	    
+	    # Add each name to set of Authors
+	    if ($fullname =~ /\w/) {
+		$fullname = &text_into_html($fullname);
+		$doc_obj->add_metadata ($cursection, "Author", $fullname);
+	    }
+	}
+
+	# Add individual keywords.
+	# (The full set of authors will be added below as "Keywords".)
+	if ($id eq "K") {
+	    my @keywordlist = split(/,/, $line);
+	    foreach my $k (@keywordlist) {
+		$k = lc($k);
+		$k =~ s/\s*$//; 
+		$k =~ s/^\s*//; 
+		if ($k =~ /\w/) {
+		    $k = &text_into_html($k);
+		    $doc_obj->add_metadata ($cursection, "Keyword", $k);
+		}
+	    } 
+	}
+	
+	# Add this line of metadata
+	$metadata{$id} .= "$line\n";
+    }
+
+
+
+    # Add the various field as metadata
+    my ($f, $name, $value);
+    foreach $f (keys %metadata) {
+	
+	next unless (defined $field{$f});
+	next unless (defined $metadata{$f});	
+
+	$name = $field{$f};
+	$value = $metadata{$f};
+
+	# Add the various field as metadata	
+	
+	# The Creator metadata is found by concatenating authors.
+	if ($f eq "A") {
+
+	    my @authorlist = split(/\n/, $value);
+	    my $lastauthor = pop @authorlist;
+	    my $Creator = "";
+	    if (scalar @authorlist) {
+		$Creator = join(", ", @authorlist) . " and $lastauthor";
+	    } else {
+		$Creator = $lastauthor;
+	    }
+
+	    if ($Creator =~ /\w/) {
+		$Creator = &text_into_html($Creator);
+		$doc_obj->add_metadata ($cursection, "Creator", $Creator);
+	    }
+	}
+
+	# The rest are added in a standard way
+	else {
+	    $value = &text_into_html($value);
+	    $doc_obj->add_metadata ($cursection, $name, $value);
+	}
+
+	# Books and Journals are additionally marked for display purposes
+	if ($f eq "B") {
+	    $doc_obj->add_metadata($cursection, "BookConfOnly", 1);
+	} elsif ($f eq "J") {
+	    $doc_obj->add_metadata($cursection, "JournalsOnly", 1); 
+	}
+
+
+    }
+
+    # Add the text in refer format(all fields)
+    if ($text =~ /\w/) {
+	$text = &text_into_html($text);
+	$doc_obj->add_text ($cursection, $text);
+    }
+    # Add FileFormat as the metadata
+    $doc_obj->add_metadata($cursection,"FileFormat","Refer");
+
+    return 1; # processed the file
+}
+
+1;
+#
+# Convert a text string into HTML.
+#
+# The HTML is going to be inserted into a GML file, so 
+# we have to be careful not to use symbols like ">",
+# which ocurs frequently in email messages (and use
+# &gt instead.
+#
+# This function also turns links and email addresses into hyperlinks,
+# and replaces carriage returns with <BR> tags (and multiple carriage
+# returns with <P> tags).
+#
+
+sub text_into_html {
+    my ($text) = @_;
+
+
+    # Convert problem charaters into HTML symbols
+    $text =~ s/&/&amp;/g;
+    $text =~ s/</&lt;/g;
+    $text =~ s/>/&gt;/g;
+    $text =~ s/\"/&quot;/g;
+    $text =~ s/\'/ /g;
+    $text =~ s/\+/ /g;
+    $text =~ s/\(/ /g;
+    $text =~ s/\)/ /g;
+
+    # convert email addresses and URLs into links
+    $text =~ s/([\w\d\.\-]+@[\w\d\.\-]+)/<a href=\"mailto:$1\">$1<\/a>/g;
+    $text =~ s/(http:\/\/[\w\d\.\-]+[\/\w\d\.\-]*)/<a href=\"$1">$1<\/a>/g;
+
+    # Clean up whitespace and convert \n charaters to <BR> or <P>
+    $text =~ s/ +/ /g;
+    $text =~ s/\s*$//; 
+    $text =~ s/^\s*//; 
+    $text =~ s/\n/\n<BR>/g;
+    $text =~ s/<BR>\s*<BR>/<P>/g;
+
+    return $text;
+}
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/RogPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/RogPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/RogPlugin.pm	(revision 24799)
@@ -0,0 +1,283 @@
+###########################################################################
+#
+# RogPlugin.pm -- simple text plugin
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# creates simple single-level document from .rog or .mdb files 
+
+package RogPlugin;
+
+use BasePlugin;
+use MetadataRead;
+use sorttools;
+use doc; 
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+sub BEGIN {
+    @RogPlugin::ISA = ('MetadataRead', 'BasePlugin');
+}
+
+my $arguments = 
+    [ { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'reqd' => "no",
+	'deft' => &get_default_process_exp() },
+      ];
+
+my $options = { 'name'     => "RogPlugin",
+		'desc'     => "{RogPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args' => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new BasePlugin($pluginlist, $inputargs, $hashArgOptLists);
+
+    return bless $self, $class;
+}
+
+
+# This plugin processes files with the suffix ".mdb" or ".rog"
+sub get_default_process_exp {
+    return q^(?i)\.(mdb|rog)$^;
+}
+
+sub read_rog_record
+{
+    my ($self,$file_buffer, $seclevel) = @_;
+
+    my $next_line = $file_buffer->{'next_line'};
+
+    return 0 if (!defined $next_line);
+
+    if ($next_line eq "")
+    {
+	my $line;
+	while(defined($line=<FILE>))  
+	{
+	    $line =~ s/\r$//;
+	    $file_buffer->{'line_no'}++;
+	    next if ($line =~ m/^\#/);
+	    $next_line = $line;
+	    last;
+	}
+    }
+	    
+    if ($next_line !~ m/^song( +)\"([^\"]*)\"( +)\"([^\"]*)\"( +)(\d+)( *)$/) 
+    {
+	print STDERR "Error: Malformed Rog file: $next_line";
+	return 0;
+    }
+    else
+    {
+	# init default values
+	$file_buffer->{'song'}->{'tempo'}    = 120;
+	$file_buffer->{'song'}->{'ks_type'}  = 0;
+	$file_buffer->{'song'}->{'ks_num'}   = 0;
+	$file_buffer->{'song'}->{'metadata'} = [];
+	$file_buffer->{'song'}->{'content'}  = "";
+	
+	$file_buffer->{'song'}->{'subcol'} = $2;
+	$file_buffer->{'song'}->{'title'}  = $4;
+	$file_buffer->{'song'}->{'tval'}   = $6;
+
+	chomp($next_line);
+	my $content = $next_line;
+	if (defined $seclevel) 
+	{
+	    $content.= " $seclevel";
+	}
+	$content .= "\n";
+
+	$file_buffer->{'song'}->{'content'} = $content;
+
+
+	my $line;
+	while(defined($line=<FILE>))  
+	{
+	    $line =~ s/\r$//;
+
+	    $file_buffer->{'line_no'}++;
+	    next if ($line =~ m/^\#/);
+	
+	    if ($line =~ m/^song/) 
+	    {	
+		$file_buffer->{'next_line'} = $line;
+		return 1;
+	    }
+	    elsif ($line =~ m/^tempo( +)(\d+)( *)$/) 
+	    {
+		$file_buffer->{'song'}->{'tempo'} = $2;
+		$file_buffer->{'song'}->{'content'} .= $line;
+	    } 
+	    elsif ($line =~ m/^keysig( +)(\d+)( +)(\d+)( *)$/) 
+	    {
+		$file_buffer->{'song'}->{'ks_type'} = $2;
+		$file_buffer->{'song'}->{'ks_num'}  = $4;
+		$file_buffer->{'song'}->{'content'} .= $line;	   
+	    } 
+	    elsif ($line =~ m/^timesig( +)(\d+)( +)(\d+)( *)$/) 
+	    {
+		$file_buffer->{'song'}->{'ts_numer'} = $2;
+		$file_buffer->{'song'}->{'ts_denom'} = $4;
+		$file_buffer->{'song'}->{'content'} .= $line;
+	    }
+	    elsif ($line =~ m/^metadata ([^:]*): (.*)/)
+	    {
+		push(@{$file_buffer->{'song'}->{'metadata'}},[$1,$2]);
+		$file_buffer->{'song'}->{'content'} .= $line;
+	    }
+	    else
+	    {
+		$file_buffer->{'song'}->{'content'} .= $line;
+	    }
+	}
+	
+	$file_buffer->{'next_line'} = undef;
+    }
+
+    return 1;
+}
+
+sub process_rog_record
+{
+    my ($self,$file,$metadata,$song,$processor) = @_;
+
+    # create a new document
+    my $doc_obj = new doc ($file, "indexed_doc", $self->{'file_rename_method'});
+    my $cursection = $doc_obj->get_top_section();
+    $doc_obj->add_utf8_metadata($doc_obj->get_top_section(), "Plugin", "$self->{'plugin_type'}");
+
+    my $title = $song->{'title'};
+    my $title_safe = $title;
+    $title_safe =~ s/\'/\\\\&apos;/g;
+
+    # add metadata 
+    $doc_obj->add_metadata($cursection, "Tempo",         $song->{'tempo'}); 
+    $doc_obj->add_metadata($cursection, "KeySigType",    $song->{'ks_type'}); 
+    $doc_obj->add_metadata($cursection, "KeySigNum",     $song->{'ks_num'}); 
+    $doc_obj->add_metadata($cursection, "SubCollection", $song->{'subcol'}); 
+    $doc_obj->add_metadata($cursection, "Title",         $title); 
+    $doc_obj->add_metadata($cursection, "TitleSafe",     $title_safe); 
+    $doc_obj->add_metadata($cursection, "TVal",          $song->{'tval'}); 
+    $doc_obj->add_metadata($cursection, "FileFormat",    "Rog");
+    $doc_obj->add_metadata($cursection, "FileSize",      (-s $file));
+
+    foreach my $md ( @{$song->{'metadata'}} )
+    {
+	$doc_obj->add_metadata($cursection, $md->[0], $md->[1]); 
+    }
+
+    # add contents as text
+    $doc_obj->add_text($cursection,$song->{'content'});
+
+    $self->extra_metadata($doc_obj,$cursection, $metadata);
+    
+    # add OID
+    $self->add_OID($doc_obj);
+
+    my $oid = $doc_obj->get_OID();
+    my $appletlink = "<a href=\"javascript:meldexout(\'$oid\','[TitleSafe]')\">";
+
+    $doc_obj->add_utf8_metadata ($cursection, "audiolink",  $appletlink); 
+    $doc_obj->add_utf8_metadata ($cursection, "audioicon",  "_iconaudio_"); 
+    $doc_obj->add_utf8_metadata ($cursection, "/audiolink", "</a>"); 
+
+    # process the document
+    $processor->process($doc_obj);
+}
+
+# return number of files processed, undef if can't process
+# Note that $base_dir might be "" and that $file might 
+# include directories
+sub read {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $block_hash, $metadata, $processor, $maxdocs, $total_count, $gli) = @_;
+
+    my $filename = &util::filename_cat($base_dir, $file);
+
+    return undef unless ($filename =~ /\.((rog|mdb)(\.gz)?)$/i && (-e $filename));
+
+    my $gz = (defined $3) ? 1: 0;
+
+    print STDERR "<Processing n='$file' p='RogPlugin'>\n" if ($gli);
+    print STDERR "RogPlugin: processing $filename\n" if $processor->{'verbosity'};
+    
+    if ($gz) {
+	open (FILE, "zcat $filename |") 
+	    || die "RogPlugin::read - zcat can't open $filename\n";
+    } else {
+	open (FILE, $filename) 
+	    || die "RogPlugin::read - can't open $filename\n";
+    }
+
+    my $doc_count = 0;
+    my $dot_count = 0;
+    my $file_buffer = { line_no => 0, next_line => "", song => {} };
+
+    while ($self->read_rog_record($file_buffer))
+    {
+	$self->process_rog_record($file,$metadata,$file_buffer->{'song'},$processor);
+	$doc_count++;
+
+	last if ($maxdocs !=-1 && ($total_count+$doc_count) >= $maxdocs);
+	
+	if (($doc_count % 10) == 0)
+	{
+	    print STDERR ".";
+	    $dot_count++;
+	    print STDERR "\n" if (($dot_count % 80) == 0);
+	}
+    }
+
+    close FILE;
+
+    print STDERR "\n";
+
+    $self->{'num_processed'} = $doc_count;
+
+    return 1; # processed the file
+}
+
+1;
+
+
+
+
+
+
+
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/SourceCodePlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/SourceCodePlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/SourceCodePlugin.pm	(revision 24799)
@@ -0,0 +1,243 @@
+###########################################################################
+#
+# SourceCodePlugin.pm -- source code plugin
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+# John McPherson Nov 2000
+# originally based on TEXTPlug
+
+# filename is currently used for Title ( optionally minus some prefix )
+
+# Current languages:
+#   text: READMEs/Makefiles
+#   C/C++   (currently extracts #include statements and C++ class decls)
+#   Perl    (currently only done as text)
+#   Shell   (currently only done as text)
+
+package SourceCodePlugin;
+
+use ReadTextFile;
+use MetadataRead;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+sub BEGIN {
+    @SourceCodePlugin::ISA = ('MetadataRead', 'ReadTextFile');
+}
+
+my $arguments =
+    [ { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'deft' => &get_default_process_exp(),
+	'reqd' => "no" } ,
+      { 'name' => "block_exp",
+	'desc' => "{BasePlugin.block_exp}",
+	'type' => "regexp",
+	'deft' => &get_default_block_exp(),
+	'reqd' => "no" },
+      { 'name' => "remove_prefix",
+	'desc' => "{SourceCodePlugin.remove_prefix}",
+	'type' => "regexp",
+	'deft' => "^.*[/\\]",
+	'reqd' => "no" } ];
+
+my $options = { 'name'     => "SourceCodePlugin",
+		'desc'     => "{SourceCodePlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new ReadTextFile($pluginlist, $inputargs, $hashArgOptLists);
+
+    return bless $self, $class;
+}
+
+sub get_default_block_exp {
+    my $self = shift (@_);
+
+    return q^(?i)\.(o|obj|a|so|dll)$^;
+}
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+    return q^(Makefile.*|README.*|(?i)\.(c|cc|cpp|C|h|hpp|pl|pm|sh))$^;
+}
+
+
+
+# do plugin specific processing of doc_obj
+sub process {
+    my $self = shift (@_);
+    my ($textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+    my $outhandle = $self->{'outhandle'};
+    
+    my $cursection = $doc_obj->get_top_section();
+
+    my $filetype="text";  # Makefiles, READMEs, ...
+    if ($file =~ /\.(cc|h|cpp|C)$/) {$filetype="C++";} # assume all .h files...
+    elsif ($file =~ /\.c$/)         {$filetype="C";}
+    elsif ($file =~ /\.p(l|m)$/)    {$filetype="perl";}
+    elsif ($file =~ /\.sh$/)        {$filetype="sh";}
+
+    # modify '<' and '>' for GML... (even though inside <pre> tags!!)
+    $$textref =~ s/</&lt;/g;
+    $$textref =~ s/>/&gt;/g;
+    $$textref =~ s/_/&#95;/g;
+    # try _escape_text($text) from doc.pm....
+
+    # don't want mg to turn escape chars into actual values
+    $$textref =~ s/\\/\\\\/g;
+
+    # use filename (minus any prefix) as the title.
+    my $title;
+    if ($self->{'remove_prefix' ne ""}) {
+	($title = $file) =~ s/^$self->{'remove_prefix'}//;
+    } else {
+	($title = $file) =~ s@^.*[/\\]@@; # remove pathname by default
+    }
+    $doc_obj->add_utf8_metadata ($cursection, "Title", $title);
+    $doc_obj->add_metadata ($cursection, "FileFormat", "SRC");
+
+    # remove the gsdl prefix from the filename
+    my $relative_filename=$file;
+    $relative_filename =~ s@^.*?gsdl[/\\]@@;
+    $doc_obj->add_utf8_metadata ($cursection, "filename", $relative_filename);
+
+    # class information from .h and .cc and .C and .cpp files
+    if ($filetype eq "C++") 
+    {
+	process_c_plus_plus($textref,$pluginfo, $base_dir, 
+				   $file, $metadata, $doc_obj);
+    } elsif ($filetype eq "C")
+    {
+	get_includes_metadata($textref, $doc_obj);
+    }
+
+
+     # default operation...
+     # insert preformat tags and add text to document object
+    $doc_obj->add_utf8_text($cursection, "<pre>\n$$textref\n</pre>");
+    
+    return 1;
+}
+
+
+
+
+sub get_includes_metadata {
+    my ($textref, $doc_obj) = @_;
+    
+    my $topsection = $doc_obj->get_top_section();
+
+    # Get '#include' directives for metadata
+    if ($$textref !~ /\#\s*include\b/) {
+	return;
+    }
+
+    my @includes =
+	($$textref =~ m/^\s*\#\s*include\s*(?:\"|&lt;)(.*?)(?:\"|&gt;)/mg);
+    
+    my $incs_done_ref=$doc_obj->get_metadata($topsection, "includes");
+    my @incs_done;
+    if (defined($incs_done_ref)) {
+	@incs_done=@$incs_done_ref;
+    } else {
+	@incs_done=();
+    }
+
+    foreach my $inc (@includes) {
+	# add entries, but only if they don't already exist
+	if (!join('', map {$_ eq "$inc"?1:""} @incs_done)) {
+	    push @incs_done, $inc;
+	    $doc_obj->add_utf8_metadata($topsection, "includes", $inc);
+	}
+    }
+}
+
+
+
+sub process_c_plus_plus {
+    my ($textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj) = @_;
+
+    my $topsection = $doc_obj->get_top_section();
+
+
+    # Check for include metadata
+    get_includes_metadata($textref, $doc_obj);
+
+
+
+    # Get class declarations (but not forward declarations...) as metadata
+    if ($$textref =~ /\bclass\b/ ) {
+	my $classnames=$$textref;
+	
+	# remove commented lines
+	$classnames =~ s@/\*.*?\*/@@sg;
+	$classnames =~ s@//.*$@@mg;
+	while ($classnames =~ /\bclass\b/) {
+
+	    # delete all lines up to the next "class"
+	    while ($classnames !~ /^[^\n]*\bclass\b[^\n]*\n/)
+	    {$classnames =~ s/.*\n//;}
+	    
+#	    $classnames =~ s/^([^c][^l])*(.)?$//mg; # delete unneccessary lines
+
+	    # get the line including the next "class" and remove it from
+	    # our tmp text.
+	    $classnames =~ s/^(.*\bclass\b.*)$//m;
+
+	    # don't index if merely a reference/fwd decl. of another class
+	    if ($1 !~ /(friend\Wclass)|(class\W\w+\W?\;)|(\/\/.*class)/) {
+		# $1 is still the whole line - eg:
+		# "class StaffSystem: public BaseStaffSystem"
+		my $wholeline=$1;
+		my $classname=$1;
+		$classname =~ s/.*class\W(\w+).*/$1/;
+		my $classes=$doc_obj->get_metadata($topsection, "class");
+		foreach my $elem (@$classes) {
+		    if ("$elem" eq "$classname") {goto class_done;}
+		}
+		$doc_obj->add_utf8_metadata($topsection, "class", $classname);
+	      class_done:
+		$doc_obj->add_utf8_metadata($topsection, "classdecl", $wholeline);
+	    }
+	}
+    } # end of "class"
+
+    return 1;
+}
+
+1;
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/SplitTextFile.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/SplitTextFile.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/SplitTextFile.pm	(revision 24799)
@@ -0,0 +1,319 @@
+###########################################################################
+#
+# SplitTextFile.pm - a plugin for splitting input files into segments that
+#                will then be individually processed.
+#
+#
+# Copyright 2000 Gordon W. Paynter (gwp@cs.waikato.ac.nz)
+# Copyright 2000 The New Zealand Digital Library Project
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+
+# SplitTextFile is a plugin for splitting input files into segments that will
+# then be individually processed.  
+
+# This plugin should not be called directly.  Instead, if you need to
+# process input files that contain several documents, you should write a
+# plugin with a process function that will handle one of those documents
+# and have it inherit from SplitTextFile.  See ReferPlug for an example.
+
+
+package SplitTextFile;
+
+use ReadTextFile;
+use gsprintf 'gsprintf';
+use util;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+# SplitTextFile is a sub-class of ReadTextFile
+sub BEGIN {
+    @SplitTextFile::ISA = ('ReadTextFile');
+}
+
+
+my $arguments =
+    [ { 'name' => "split_exp",
+	'desc' => "{SplitTextFile.split_exp}",
+	'type' => "regexp",
+	#'deft' => &get_default_split_exp(),
+	'deft' => "",
+	'reqd' => "no" } ];
+
+my $options = { 'name'     => "SplitTextFile",
+		'desc'     => "{SplitTextFile.desc}",
+		'abstract' => "yes",
+		'inherits' => "yes",
+	        'args'     => $arguments };
+
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new ReadTextFile($pluginlist, $inputargs, $hashArgOptLists);
+
+    $self->{'textcat_store'} = {};
+    $self->{'metapass_srcdoc'} = {}; # which segments have valid metadata_srcdoc
+    return bless $self, $class;
+}
+
+sub init {
+    my $self = shift (@_);
+    my ($verbosity, $outhandle, $failhandle) = @_;
+
+    $self->ReadTextFile::init($verbosity, $outhandle, $failhandle);
+
+    # why is this is init and not in new??
+    if ((!defined $self->{'process_exp'}) || ($self->{'process_exp'} eq "")) {
+
+	$self->{'process_exp'} = $self->get_default_process_exp ();
+	if ($self->{'process_exp'} eq "") {
+	    warn ref($self) . " Warning: plugin has no process_exp\n";
+	}
+    }
+
+
+    # set split_exp to default unless explicitly set
+    if (!$self->{'split_exp'}) {
+	$self->{'split_exp'} = $self->get_default_split_exp ();
+    }
+
+}
+
+# This plugin recurs over the segments it finds
+sub is_recursive {
+    return 1;
+}
+
+# By default, we split the input text at blank lines
+sub get_default_split_exp {
+    return q^\n\s*\n^;
+}
+
+sub metadata_read {
+    my $self = shift (@_);  
+    my ($pluginfo, $base_dir, $file, $block_hash, 
+	$extrametakeys, $extrametadata, $extrametafile,
+	$processor, $gli, $aux) = @_;
+
+    # returns 1 if matches process_exp
+    my $matched = $self->SUPER::metadata_read($pluginfo, $base_dir, $file,
+					      $block_hash, 
+					      $extrametakeys, 
+					      $extrametadata, 
+					      $extrametafile,
+					      $processor, $gli, $aux);
+    my $split_matched = undef;
+
+    if ($matched) {
+
+	my $outhandle = $self->{'outhandle'};
+	my $filename = &util::filename_cat($base_dir, $file);
+
+	my $plugin_name = ref ($self);
+	$file =~ s/^[\/\\]+//; # $file often begins with / so we'll tidy it up
+
+	$self->{'metapass_srcdoc'}->{$file} = {};
+
+	# Do encoding stuff
+	my ($language, $encoding) = $self->textcat_get_language_encoding ($filename);
+	my $le_rec = { 'language' => $language, 'encoding' => $encoding };
+	$self->{'textcat_store'}->{$file} = $le_rec;
+
+	# Read in file ($text will be in utf8)
+	my $text = "";
+	$self->read_file ($filename, $encoding, $language, \$text);
+
+ 
+	if ($text !~ /\w/) {
+	    gsprintf($outhandle, "$plugin_name: {ReadTextFile.file_has_no_text}\n",
+		     $file)
+		if $self->{'verbosity'};
+	    
+	    my $failhandle = $self->{'failhandle'};
+	    print $failhandle "$file: " . ref($self) . ": file contains no text\n";
+	    $self->{'num_not_processed'} ++;
+
+	    $self->{'textcat_store'}->{$file} = undef;
+
+	    return 0; 
+	}
+    
+    
+	# Split the text into several smaller segments
+	my $split_exp = $self->{'split_exp'};
+        my @tmp  = split(/$split_exp/i, $text);
+	my @segments =();
+	## get rid of empty segments
+	foreach my $seg (@tmp){
+	    if ($seg ne ""){
+		push @segments, $seg;
+	    }
+	}
+
+	print $outhandle "SplitTextFile found " . (scalar @segments) . " documents in $filename\n" 
+	    if $self->{'verbosity'};
+	
+	$self->{'split_segments'}->{$file} = \@segments;
+	$split_matched = scalar(@segments);
+    }
+    
+    return $split_matched;
+}
+
+
+
+# The read function opens a file and splits it into parts. 
+# Each part is sent to the process function
+#
+# Returns: Number of document objects created (or undef if it fails)
+
+sub read {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $block_hash, $metadata, $processor, $maxdocs, $total_count, $gli) = @_;
+    my $outhandle = $self->{'outhandle'};
+    my $verbosity = $self->{'verbosity'};
+
+    # can we process this file??
+    my ($filename_full_path, $filename_no_path) = &util::get_full_filenames($base_dir, $file);
+    return undef unless $self->can_process_this_file($filename_full_path);
+
+    $file =~ s/^[\/\\]+//; # $file often begins with / so we'll tidy it up
+
+    my $le_rec = $self->{'textcat_store'}->{$file};
+    if (!defined $le_rec) {
+	# means no text was found;
+	return 0; # not processed but no point in passing it on
+    }
+
+    print STDERR "<Processing n='$file' p='$self->{'plugin_type'}'>\n" if ($gli);
+    print $outhandle "$self->{'plugin_type'} processing $file\n"
+	    if $self->{'verbosity'} > 1;    
+
+    my $language = $le_rec->{'language'};
+    my $encoding = $le_rec->{'encoding'};
+    $self->{'textcat_store'}->{$file} = undef;
+
+    my $segments = $self->{'split_segments'}->{$file};
+    $self->{'split_segments'}->{$file} = undef;
+
+    # Process each segment in turn
+    my ($count, $segment, $segtext, $status, $id);
+    $segment = 0;
+    $count = 0;
+    foreach $segtext (@$segments) {
+     	$segment++;
+
+	if (defined $self->{'metapass_srcdoc'}->{$file}->{$segment}) {
+	    # metadata is attached to a srcdoc
+	    next;
+	}
+
+	# create a new document
+	my $doc_obj = new doc ($filename_full_path, "indexed_doc", $self->{'file_rename_method'});
+	$doc_obj->add_utf8_metadata($doc_obj->get_top_section(), "Language", $language);
+	$doc_obj->add_utf8_metadata($doc_obj->get_top_section(), "Encoding", $encoding);
+
+	my ($filemeta) = $file =~ /([^\\\/]+)$/;
+	my $plugin_filename_encoding = $self->{'filename_encoding'};
+    my $filename_encoding = $self->deduce_filename_encoding($file,$metadata,$plugin_filename_encoding);
+	$self->set_Source_metadata($doc_obj, $filename_full_path, $filename_encoding);
+
+	$doc_obj->add_utf8_metadata($doc_obj->get_top_section(), "SourceSegment", "$segment");
+	if ($self->{'cover_image'}) {
+	    $self->associate_cover_image($doc_obj, $filename_full_path);
+	}
+	$doc_obj->add_utf8_metadata($doc_obj->get_top_section(), "Plugin", "$self->{'plugin_type'}");
+	#$doc_obj->add_metadata($doc_obj->get_top_section(), "FileFormat", "Split");
+
+	# Calculate a "base" document ID.
+	if (!defined $id) {
+	    $id = $self->get_base_OID($doc_obj);
+	}
+    
+	# include any metadata passed in from previous plugins 
+	# note that this metadata is associated with the top level section
+	$self->extra_metadata ($doc_obj, $doc_obj->get_top_section(), $metadata);
+
+	# do plugin specific processing of doc_obj
+	print $outhandle "segment $segment\n" if ($self->{'verbosity'});
+	$status = $self->process (\$segtext, $pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli);
+	if (!defined $status) {
+	    print $outhandle "WARNING - no plugin could process segment $segment of $file\n" 
+		if ($verbosity >= 2);
+	    next;
+	}
+	# If the plugin returned 0, it threw away this part
+	if ($status == 0) {
+	    next;
+	}
+	$count += $status;
+
+	# do any automatic metadata extraction
+	$self->auto_extract_metadata ($doc_obj);
+
+	# add an OID
+	$self->add_OID($doc_obj, $id, $segment);
+
+	# process the document
+	$processor->process($doc_obj);
+
+	$self->{'num_processed'} ++;
+    }
+
+    delete $self->{'metapass_srcdoc'}->{$file};
+
+    # Return number of document objects produced
+    return $count; 
+}
+
+sub get_base_OID {
+    my $self = shift(@_);
+    my ($doc_obj) = @_;
+
+    $self->SUPER::add_OID($doc_obj);
+    return $doc_obj->get_OID();
+}
+
+sub add_OID {
+    my $self = shift (@_);
+    my ($doc_obj, $id, $segment) = @_;
+
+    my $full_id = $id . "s" . $segment;
+    if ($self->{'OIDtype'} eq "assigned") {
+	my $identifier = $doc_obj->get_metadata_element ($doc_obj->get_top_section(), $self->{'OIDmetadata'});
+	if (defined $identifier && $identifier ne "") {
+	    $full_id = $identifier;
+	    $full_id = &util::tidy_up_oid($full_id);
+	}
+    }
+    $doc_obj->set_OID($full_id);
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/StructuredHTMLPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/StructuredHTMLPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/StructuredHTMLPlugin.pm	(revision 24799)
@@ -0,0 +1,417 @@
+###########################################################################
+#
+# StructuredHTMLPlugin.pm -- html plugin with extra facilities for teasing out 
+# hierarchical structure (such as h1, h2, h3, or user-defined tags) in an 
+# HTML document
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+# This plugin is to process an HTML file where sections are divided by 
+# user-defined headings tags. As it is difficult to predict what user's definition
+# this plugin allows to detect the user-defined titles up to three levels (level1, level2, level3...)
+# as well as allows to get rid of user-defined Table of Content (TOC)...
+# format:e.g. level1 (Abstract_title|ChapterTitle|Referencing Heading) level2(SectionHeading)...
+
+package StructuredHTMLPlugin;
+
+use HTMLPlugin;
+use ImageConverter; # want the identify method
+use util;
+
+use strict; # every perl program should have this!
+no strict 'refs'; # make an exception so we can use variables as filehandles
+
+sub BEGIN {
+    @StructuredHTMLPlugin::ISA = ('HTMLPlugin');
+}
+
+my $arguments = 
+    [
+     { 'name' => "level1_header",
+       'desc' => "{StructuredHTMLPlugin.level1_header}",
+       'type' => "regexp",
+       'reqd' => "no",
+       'deft' => "" },
+     { 'name' => "level2_header",
+       'desc' => "{StructuredHTMLPlugin.level2_header}",
+       'type' => "regexp",
+       'reqd' => "no",
+       'deft' => "" },
+     { 'name' => "level3_header",
+       'desc' => "{StructuredHTMLPlugin.level3_header}",
+       'type' => "regexp",
+       'reqd' => "no",
+       'deft' => "" },
+     { 'name' => "title_header",
+       'desc' => "{StructuredHTMLPlugin.title_header}",
+       'type' => "regexp",
+       'reqd' => "no",
+       'deft' => "" },
+     { 'name' => "delete_toc",
+       'desc' => "{StructuredHTMLPlugin.delete_toc}",
+       'type' => "flag",
+       'reqd' => "no"},
+     { 'name' => "toc_header",
+       'desc' => "{StructuredHTMLPlugin.toc_header}",
+       'type' => "regexp",
+       'reqd' => "no",
+       'deft' => "" }     
+     ];
+
+my $options = { 'name'     => "StructuredHTMLPlugin",
+		'desc'     => "{StructuredHTMLPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+    
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+    
+    my $self = new HTMLPlugin($pluginlist, $inputargs, $hashArgOptLists);
+    
+    return bless $self, $class;
+}
+
+
+sub process {
+    my $self = shift (@_);
+    my ($textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    my @head_and_body = split(/<body/i,$$textref);
+    my $head = shift(@head_and_body);
+    my $body_text = join("<body", @head_and_body);
+    $head =~ m/<title>(.+)<\/title>/i;
+    my $doctitle = $1 if defined $1;
+    if (defined $self->{'metadata_fields'} && $self->{'metadata_fields'}=~ /\S/) {
+	my @doc_properties = split(/<xml>/i,$head);
+	my $doc_heading = shift(@doc_properties);
+	my $rest_doc_properties = join(" ", @doc_properties);
+
+	my @extracted_metadata = split(/<\/xml>/i, $rest_doc_properties);
+	my $extracted_metadata = shift (@extracted_metadata);
+	$self->extract_metadata($extracted_metadata, $metadata, $doc_obj);
+    }
+    
+    # set the title here if we haven't found it yet
+    if (!defined $doc_obj->get_metadata_element ($doc_obj->get_top_section(), "Title")) {
+	if (defined $doctitle && $doctitle =~ /\S/) {
+	    $doc_obj->add_metadata($doc_obj->get_top_section(), "Title", $doctitle);
+	} else {
+	    $self->title_fallback($doc_obj,$doc_obj->get_top_section(),$file);
+	}
+    }
+
+    # If delete_toc is enabled, it means to get rid of toc and tof contents.
+    # get rid of TOC and TOF sections and their title
+    if (defined $self->{'delete_toc'} && ($self->{'delete_toc'} == 1)){
+	if (defined $self->{'toc_header'}&& $self->{'toc_header'} =~ /\S/){
+	    $body_text =~ s/<p class=(($self->{'toc_header'})[^>]*)>(.+?)<\/p>//isg;
+	}
+    }
+    
+    if (defined $self->{'title_header'} && $self->{'title_header'}=~ /\S/){
+	$self->{'title_header'} =~ s/^(\()(.*)(\))/$2/is;
+	$body_text =~ s/<p class=(($self->{'title_header'})[^>]*)>(.+?)<\/p>/<p class=$1><h1>$3<\/h1><\/p>/isg;
+    }
+
+    if (defined $self->{'level1_header'} && $self->{'level1_header'}=~ /\S/ ){
+     	$self->{'level1_header'} =~ s/^\((.*)\)/$1/i;
+	$body_text =~ s/<p class=(($self->{'level1_header'})[^>]*)>(.+?)<\/p>/<p class=$1><h1>$3<\/h1><\/p>/isg;
+    }
+    
+    if (defined $self->{'level2_header'} && $self->{'level2_header'}=~ /\S/){
+	$self->{'level2_header'} =~ s/^\((.*)\)/$1/i;
+	$body_text =~ s/<p class=(($self->{'level2_header'})[^>]*)>(.+?)<\/p>/<p class=$1><h2>$3<\/h2><\/p>/isg;
+    }
+    
+    if (defined $self->{'level3_header'} && $self->{'level3_header'}=~ /\S/ ){
+	$self->{'level3_header'} =~ s/^\((.*)\)/$1/is;
+	$body_text =~ s/<p class=(($self->{'level3_header'})[^>]*)>(.+?)<\/p>/<p class=$1><h3>$3<\/h3><\/p>/isg;
+    }
+    
+    # Tidy up extra new lines
+    $body_text =~ s/(<p[^>]*><span[^>]*><o:p>&nbsp;<\/o:p><\/span><\/p>)//isg;
+    $body_text =~ s/(<p[^>]*><o:p>&nbsp;<\/o:p><\/p>)//isg;
+    
+    # what was the following line for. effectively unused. do we need it??
+    #$section_text .= "<!--\n<Section>\n-->\n";
+    #my $top_section_tag = "<!--\n<Section>\n-->\n";
+    #$body_text =~ s/(<div.*)/$top_section_text$doctitle$1/i;
+    #$body_text =~ s/(<div.*)/$top_section_tag$1/i;
+    my $body = "<body".$body_text;
+    
+    my $section_text = $head;
+    
+    # split HTML text on <h1>, <h2> etc tags
+    my @h_split = split(/<h/i,$body);
+    
+    my $hnum = 0;
+
+    my $sectionh1 = 0;
+    $section_text .= shift(@h_split);
+    
+    my $hc;
+    foreach $hc ( @h_split )
+    {
+	if ($hc =~ m/^([1-3])\s*.*?>(.*)$/s)
+	{
+	    my $new_hnum = $1;
+	    my $hc_after = $2;
+	    
+	    if ($hc_after =~ m/^(.*?)<\/h$new_hnum>/is)
+	    {
+		my $h_text = $1;
+		$hc =~ s/^(\&nbsp\;)+/\&nbsp\;/g;
+		# boil HTML down to some interesting text
+		$h_text =~ s/^[1-3]>//;
+		$h_text =~ s/<\/?.*?>//sg;
+		$h_text =~ s/\s+/ /sg;
+		$h_text =~ s/^\s$//s;
+		$h_text =~ s/(&nbsp;)+\W*/&nbsp;/sg;
+		
+		if ($h_text =~ m/\w+/)
+		{
+		    if ($new_hnum > $hnum)
+		    {
+			# increase section nesting
+			$hnum++;
+			while ($hnum < $new_hnum)
+			{
+			    my $spacing = "  " x $hnum;
+			    $section_text .= "<!--\n";
+			    $section_text .= $spacing."<Section>\n";
+			    $section_text .= "-->\n";
+			    $hnum++;
+			}
+		    }
+		    else # ($new_hnum <= $hnum)
+		    {
+			# descrease section nesting
+			while ($hnum >= $new_hnum)
+			{
+			    my $spacing = "  " x $hnum;
+			    $section_text .= "<!--\n";
+			    $section_text .= $spacing."</Section>\n";
+			    $section_text .= "-->\n";
+			    $hnum--;
+			}
+			$hnum++;
+		    }
+
+		    my $spacing = "  " x $hnum;
+		    $section_text .= "<!--\n";
+		    $section_text .= $spacing."<Section>\n";
+		    $section_text .= $spacing."  <Description>\n";
+		    $section_text .= $spacing."    <Metadata name=\"Title\">$h_text</Metadata>";
+		    $section_text .= $spacing."  </Description>\n";
+		    $section_text .= "-->\n";
+		    
+		    #print $outhandle $spacing."$h_text\n"
+		    #	if $self->{'verbosity'} > 2;
+		    
+		    $sectionh1++ if ($hnum==1);
+		}
+	    }
+	    else {
+###		print STDERR "***** hc = <h$hc\n\n";
+	    }
+	    $section_text .= "<h$hc";
+	}
+	else
+	{
+	    $section_text .= "<h$hc";
+	}
+    }
+
+    while ($hnum >= 1)
+    {
+	my $spacing = "  " x $hnum;
+	$section_text .= "<!--\n";
+	$section_text .= $spacing."</Section>\n";
+	$section_text .= "-->\n";
+	$hnum--;
+    }
+
+    $section_text .= "<!--\n</Section>\n-->\n";
+
+    $$textref = $section_text;
+    
+#    if ($sectionh1>0)
+#    {
+#	print $outhandle "  Located section headings ..."
+#	    if $self->{'verbosity'} > 1;
+#    }
+    
+    $$textref =~ s/<!\[if !vml\]>/<![if vml]>/g;
+    
+    $$textref =~ s/(&nbsp;)+/&nbsp;/sg;    
+    
+    ## $$textref =~ s/<o:p>&nbsp;<\/o:p>//g; # used with VML to space figures?
+    
+    $self->SUPER::process(@_);
+    
+}
+
+
+sub resize_if_necessary
+{
+    my ($self,$front,$back,$base_dir,$href) = @_;
+    
+    # dig out width and height of image, if there
+    my $img_attributes = "$front back";
+    my ($img_width)  = ($img_attributes =~ m/\s+width=\"?(\d+)\"?/i);
+    my ($img_height) = ($img_attributes =~ m/\s+height=\"?(\d+)\"?/i);
+    
+    # derive local filename for image based on its URL
+    my $img_filename = $href;
+    $img_filename =~ s/^[^:]*:\/\///;
+    $img_filename = &util::filename_cat($base_dir, $img_filename);
+    
+    # Replace %20's in URL with a space if required. Note that the filename
+    # may include the %20 in some situations
+    if ($img_filename =~ /\%20/) {
+	if (!-e $img_filename) {
+	    $img_filename =~ s/\%20/ /g;
+	}
+    }
+    if ((-e $img_filename) && (defined $img_width) && (defined $img_height)) {
+	# get image info on width and height
+	
+	my $outhandle = $self->{'outhandle'};
+	my $verbosity = $self->{'verbosity'};
+
+	my ($image_type, $actual_width, $actual_height, $image_size) 
+	    = &ImageConverter::identify($img_filename, $outhandle, $verbosity);
+	
+	#print STDERR "**** $actual_width x $actual_height";
+	#print STDERR " (requested: $img_width x $img_height)\n";
+
+	if (($img_width < $actual_width) || ($img_height < $actual_height)) {
+	    #print $outhandle "Resizing $img_filename\n" if ($verbosity > 0);
+	    
+	    # derive new image name based on current image
+	    my ($tailname, $dirname, $suffix)
+		= &File::Basename::fileparse($img_filename, "\\.[^\\.]+\$");
+	    
+	    my $resized_filename 
+		= &util::filename_cat($dirname, $tailname."_resized".$suffix);
+	    
+	    #print STDERR "**** suffix = $suffix\n";
+	    
+	    # Generate smaller image with convert
+	    my $newsize = "$img_width"."x$img_height";
+	    my $command = "convert -interlace plane -verbose "
+		."-geometry $newsize \"$img_filename\" \"$resized_filename\"";
+	    $command = "\"".&util::get_perl_exec()."\" -S gs-magick.pl $command";
+	    #print $outhandle "ImageResize: $command\n" if ($verbosity > 2);
+	    #my $result = '';
+	    #print $outhandle "ImageResize result: $result\n" if ($verbosity > 2);
+	}
+    }
+    return $href;
+}
+
+sub replace_images {
+    my $self = shift (@_);
+    my ($front, $link, $back, $base_dir, 
+	$file, $doc_obj, $section) = @_;
+    # remove quotes from link at start and end if necessary
+    if ($link=~/^\"/) {
+	$link=~s/^\"//;$link=~s/\"$//;
+	$front.='"';
+	$back="\"$back";
+    }
+    
+    $link =~ s/\n/ /g;
+    
+    my ($href, $hash_part, $rl) = $self->format_link ($link, $base_dir, $file);
+    
+##    $href = $self->resize_if_necessary($front,$back,$base_dir,$href);
+    
+    my $middle = $self->add_file ($href, $rl, $hash_part, $base_dir, $doc_obj, $section);
+    
+    return $front . $middle . $back;
+}
+
+sub extract_metadata 
+{
+    my $self = shift (@_);
+    my ($textref, $metadata, $doc_obj) = @_;
+    my $outhandle = $self->{'outhandle'};
+    
+    return if (!defined $textref);
+
+    my $separator = $self->{'metadata_field_separator'};
+    if ($separator eq "") {
+	undef $separator;
+    }
+    # metadata fields to extract/save. 'key' is the (lowercase) name of the
+    # html meta, 'value' is the metadata name for greenstone to use
+    my %find_fields = ();
+    my ($tag,$value);
+
+    my $orig_field = "";
+    foreach my $field (split /\s*,\s*/, $self->{'metadata_fields'}) {
+	# support tag<tagname>
+	if ($field =~ /^(.*?)\s*<(.*?)>$/) {
+	    # "$2" is the user's preferred gs metadata name
+	    $find_fields{lc($1)}=$2; # lc = lowercase
+	    $orig_field = $1;
+	} else { # no <tagname> for mapping
+	    # "$field" is the user's preferred gs metadata name
+	    $find_fields{lc($field)}=$field; # lc = lowercase
+	    $orig_field = $field;
+	}
+
+	if ($textref =~ m/<o:$orig_field>(.*)<\/o:$orig_field>/i){
+	    $tag = $orig_field;
+	    $value = $1;
+	    if (!defined $value || !defined $tag){
+		#print $outhandle "StructuredHTMLPlugin: can't find VALUE in \"$tag\"\n";
+		next;
+	    } else {
+		# clean up and add
+		chomp($value); # remove trailing \n, if any
+		$tag = $find_fields{lc($tag)};
+		#print $outhandle " extracted \"$tag\" metadata \"$value\"\n" 
+		#    if ($self->{'verbosity'} > 2);
+		if (defined $separator) {
+		    my @values = split($separator, $value);
+		    foreach my $v (@values) {
+			$doc_obj->add_utf8_metadata($doc_obj->get_top_section(), $tag, $v) if $v =~ /\S/;
+		    }
+		}
+		else {
+		    $doc_obj->add_utf8_metadata($doc_obj->get_top_section(), $tag, $value);
+		}
+	    }
+	}
+    }
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/TextPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/TextPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/TextPlugin.pm	(revision 24799)
@@ -0,0 +1,235 @@
+###########################################################################
+#
+# TextPlugin.pm -- simple text plugin
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# creates simple single-level document. Adds Title metadata 
+# of first line of text (up to 100 characters long).
+
+package TextPlugin;
+
+use ReadTextFile;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+no strict 'subs';
+
+sub BEGIN {
+    @TextPlugin::ISA = ('ReadTextFile');
+}
+
+my $arguments =
+    [ { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'deft' => &get_default_process_exp(),
+	'reqd' => "no" } ,
+      { 'name' => "title_sub",
+	'desc' => "{TextPlugin.title_sub}",
+	'type' => "regexp",
+	'deft' => "",
+	'reqd' => "no" } ];
+
+my $options = { 'name'     => "TextPlugin",
+		'desc'     => "{TextPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'srcreplaceable' => "yes", # Source docs in regular txt format can be replaced with GS-generated html
+		'args'     => $arguments };
+
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new ReadTextFile($pluginlist, $inputargs, $hashArgOptLists);
+
+    return bless $self, $class;
+}
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+    return q^(?i)\.te?xt$^;
+}
+
+# do plugin specific processing of doc_obj
+sub process {
+    my $self = shift (@_);
+    my ($textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+    my $outhandle = $self->{'outhandle'};
+    
+    my $cursection = $doc_obj->get_top_section();
+    # get title metadata
+    # (don't need to get title if it has been passed
+    # in from another plugin)
+    if (!defined $metadata->{'Title'}) {
+	my $title = $self->get_title_metadata($textref);
+	$doc_obj->add_utf8_metadata ($cursection, "Title", $title);
+    }
+    # Add FileFormat metadata
+    $doc_obj->add_metadata($cursection, "FileFormat", "Text");
+
+    # insert preformat tags and add text to document object    
+    $self->text_to_html($textref); # modifies the text
+    $doc_obj->add_utf8_text($cursection, $$textref);
+
+    return 1;
+}
+
+sub get_title_metadata {
+    my $self = shift (@_);
+    my ($textref) = @_;
+    
+    my ($title) = $$textref;
+    $title =~ /^\s+/s;
+    if (defined $self->{'title_sub'} && $self->{'title_sub'}) {
+	$title =~ s/$self->{'title_sub'}//;
+    }
+    $title =~ /^\s*([^\n]*)/s; $title=$1;
+    if (length($title) > 100) {
+	$title = substr ($title, 0, 100) . "...";
+    }
+    $title =~ s/\[/&\#91;/g;
+    $title =~ s/\[/&\#93;/g;
+    $title =~ s/\</&\#60;/g;
+    $title =~ s/\>/&\#62;/g;
+    
+    return $title;
+}
+
+sub text_to_html {
+    my $self = shift (@_);
+    my ($textref) = @_;
+    
+    # we need to escape the escape character, or else mg will convert into
+    # eg literal newlines, instead of leaving the text as '\n'
+    $$textref =~ s/\\/\\\\/g; # macro language
+    $$textref =~ s/_/\\_/g; # macro language
+    $$textref =~ s/</&lt;/g;
+    $$textref =~ s/>/&gt;/g;
+    
+    # insert preformat tags and add text to document object
+    $$textref = "<pre>\n$$textref\n</pre>";
+}
+
+
+# replace_srcdoc_with_html.pl requires all subroutines that support src_replaceable
+# to contain a method called tmp_area_convert_file - this is indeed the case with all
+# Perl modules that are subclasses of ConvertToPlug.pm, but as we want TextPlugin to also
+# be srcreplaceable and because TextPlugin does not inherit from ConvertToPlug.pm, we have
+# a similar subroutine with the same name here.
+sub tmp_area_convert_file {
+    my $self = shift (@_);
+    my ($output_ext, $input_filename) = @_;
+    
+    my $outhandle = $self->{'outhandle'};
+    #my $failhandle = $self->{'failhandle'};
+    
+    # derive output filename from input filename
+    my ($tailname, $dirname, $suffix)
+	= &File::Basename::fileparse($input_filename, "\\.[^\\.]+\$");
+
+    # Softlink to collection tmp dir
+    # First find a temporary directory to create the output file in
+    my $tmp_dirname = $dirname;
+    if(defined $ENV{'GSDLCOLLECTDIR'}) {
+	$tmp_dirname = $ENV{'GSDLCOLLECTDIR'};
+    } elsif(defined $ENV{'GSDLHOME'}) {
+	$tmp_dirname = $ENV{'GSDLHOME'};
+    }
+    $tmp_dirname = &util::filename_cat($tmp_dirname, "tmp");
+    &util::mk_dir($tmp_dirname) if (!-e $tmp_dirname);
+
+    # convert to utf-8 otherwise we have problems with the doc.xml file
+    # later on
+    $tailname = $self->SUPER::filepath_to_utf8($tailname) unless &unicode::check_is_utf8($tailname);
+
+    $suffix = lc($suffix);
+    my $tmp_filename = &util::filename_cat($tmp_dirname, "$tailname$suffix"); 
+    
+    # Make sure we have the absolute path to the input file
+    # (If gsdl is remote, we're given relative path to input file, of the form import/tailname.suffix
+    # But we can't softlink to relative paths. Therefore, we need to ensure that
+    # the input_filename is the absolute path.
+    my $ensure_path_absolute = 1; # true
+
+    # Now make the softlink,  so we don't accidentally damage the input file
+    # softlinking creates a symbolic link to (or, if that's not possible, it makes a copy of) the original
+    &util::soft_link($input_filename, $tmp_filename, $ensure_path_absolute);
+     
+    my $verbosity = $self->{'verbosity'};
+    if ($verbosity > 0) {
+	# need this output statement, as GShell.java's runRemote() sets status to CANCELLED
+	# if there is no output! (Therefore, it only had this adverse affect when running GSDL remotely)
+	print $outhandle "Converting $tailname$suffix to html\n";
+    }
+
+    #my $output_filename = $tailname$output_ext; #output_ext has to be html!
+    my $output_filename = &util::filename_cat($tmp_dirname, $tailname.".html");
+    
+    # Read contents of text file line by line into an array
+    # create an HTML file from the text file
+    # Recreate the original file for writing the updated contents
+    unless(open(TEXT, "<$tmp_filename")) { # open it as a new file for writing
+	print STDERR "TextPlugin.pm: Unable to open and read from $tmp_filename for converting to html...ERROR: $!\n";
+	return ""; # no file name
+    }
+
+    # Read the entire file at once
+    my $text;
+    { 
+	local $/ = undef; # Now can read the entire file at once. From http://perl.plover.com/local.html
+	$text = <TEXT>;   # File is read in as one single 'line'
+    }
+    close(TEXT); # close the file
+
+    # Get the title before embedding the text in pre tags
+    my $title = $self->get_title_metadata(\$text);   
+
+    # Now convert the text 
+    $self->text_to_html(\$text);
+    
+    # try creating this new file writing and try opening it for writing, else exit with error value
+    unless(open(HTML, ">$output_filename")) {  # open the new html file for writing
+	print STDERR "TextPlugin.pm: Unable to create $output_filename for writing $tailname$suffix txt converted to html...ERROR: $!\n";
+	return ""; # no filename
+    }
+    # write the html contents of the text (which is embedded in <pre> tags) out to the file with proper enclosing tags
+    print HTML "<html>\n<head>\n<title>$title</title>\n</head>\n<body>\n";
+    print HTML $text;
+    print HTML "\n</body>\n</html>";
+    close HTML;
+
+    # remove the copy of the original file/remove the symbolic link to original file
+    &util::rm($tmp_filename);
+
+    return $output_filename; # return the output file path
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/UnknownPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/UnknownPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/UnknownPlugin.pm	(revision 24799)
@@ -0,0 +1,170 @@
+###########################################################################
+#
+# UnknownPlugin.pm -- Plugin for files you know about but Greenstone doesn't
+#
+# A component of the Greenstone digital library software from the New
+# Zealand Digital Library Project at the University of Waikato, New
+# Zealand.
+#
+# Copyright (C) 2001 Gordon W. Paynter
+# Copyright (C) 2001 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# UnknownPlugin - a plugin for unknown files
+
+# This is a simple Plugin for importing files in formats that
+# Greenstone doesn't know anything about.  A fictional document will
+# be created for every such file, and the file itself will be passed
+# to Greenstone as the "associated file" of the document.
+
+# Here's an example where it is useful: I have a collection of
+# pictures that include a couple of quicktime movie files with names
+# like DCP_0163.MOV.  Rather than write a new plugin for quicktime
+# movies, I add this line to the collection configuration file:
+
+# plugin UnknownPlugin -process_exp "*.MOV" -assoc_field "movie"
+
+# A document is created for each movie, with the associated movie
+# file's name in the "movie" metadata field.  In the collection's
+# format strings, I use the {If} macro to output different text for
+# each type of file, like this:
+
+# {If}{[movie],<HTML for displaying movie>}{If}{[Image],<HTML for displaying image>}
+
+# You can also add extra metadata, such as the Title, Subject, and
+# Duration, with metadata.xml files and RecPlug.  (If you want to use
+# UnknownPlugin with more than one type of file, you will have to add
+# some sort of distinguishing metadata in this way.)
+
+
+
+package UnknownPlugin;
+
+use BasePlugin;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+sub BEGIN {
+    @UnknownPlugin::ISA = ('BasePlugin');
+}
+
+my $arguments =
+    [ { 'name' => "assoc_field",
+	'desc' => "{UnknownPlugin.assoc_field}",
+	'type' => "string",
+	'deft' => "",
+	'reqd' => "no" },
+      { 'name' => "file_format",
+	'desc' => "{UnknownPlugin.file_format}",
+	'type' => "string",
+	'deft' => "",
+	'reqd' => "no" },
+      { 'name' => "mime_type",
+	'desc' => "{UnknownPlugin.mime_type}",
+	'type' => "string",
+	'deft' => "",
+	'reqd' => "no" },
+      { 'name' => "srcicon",
+	'desc' => "{UnknownPlugin.srcicon}",
+	'type' => "string",
+	'deft' => "iconunknown",
+	'reqd' => "no" },
+      { 'name' => "process_extension",
+	'desc' => "{UnknownPlugin.process_extension}",
+	'type' => "string",
+	'deft' => "",
+	'reqd' => "no" } ];
+
+my $options = { 'name'     => "UnknownPlugin",
+		'desc'     => "{UnknownPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new BasePlugin($pluginlist, $inputargs, $hashArgOptLists);
+
+    # "-process_extension" is a simpler alternative to -process_exp for non-regexp people
+    if (!$self->{'process_exp'} && $self->{'process_extension'}) {
+	$self->{'process_exp'} = "\\." . $self->{'process_extension'} . "\$";
+    }
+
+    return bless $self, $class;
+}
+
+
+sub process {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+
+    my ($filename_full_path, $filename_no_path) = &util::get_full_filenames($base_dir, $file);
+    my $outhandle = $self->{'outhandle'};
+    my $verbosity = $self->{'verbosity'};
+
+    # check the filename is okay - do we need this??
+    if ($filename_full_path eq "" || $filename_no_path eq "") {
+	print $outhandle "UnknownPlugin: couldn't process \"$filename_no_path\"\n";
+	return undef;
+    }
+
+    # Add the file as an associated file ...
+    my $section = $doc_obj->get_top_section();
+    my $file_format = $self->{'file_format'} || "unknown";
+    my $mime_type = $self->{'mime_type'} || "unknown/unknown";
+    my $assoc_field = $self->{'assoc_field'} || "unknown_file";
+
+    # The assocfilename is the url-encoded version of the utf8 filename
+    my $assoc_file = $doc_obj->get_assocfile_from_sourcefile();
+
+    $doc_obj->associate_file($filename_full_path, $assoc_file, $mime_type, $section);
+    $doc_obj->add_metadata ($section, "FileFormat", $file_format);
+    $doc_obj->add_metadata ($section, "MimeType", $mime_type);
+    $doc_obj->add_utf8_metadata ($section, $assoc_field, $doc_obj->get_source()); # Source metadata is already in utf8 
+    # srclink_file is now deprecated because of the "_" in the metadataname. Use srclinkFile
+    $doc_obj->add_metadata ($section, "srclink_file", $doc_obj->get_sourcefile());
+    $doc_obj->add_metadata ($section, "srclinkFile", $doc_obj->get_sourcefile());
+    $doc_obj->add_metadata ($section, "srcicon", "_".$self->{'srcicon'}."_");
+    
+    # we have no text - add dummy text and NoText metadata
+    $self->add_dummy_text($doc_obj, $section);
+
+    return 1;
+}
+
+
+1;
+
+
+
+
+
+
+
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/WordPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/WordPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/WordPlugin.pm	(revision 24799)
@@ -0,0 +1,326 @@
+###########################################################################
+#
+# WordPlugin.pm -- plugin for importing Microsoft Word documents
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+package WordPlugin;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+no strict 'subs';
+
+use gsprintf 'gsprintf';
+
+use AutoLoadConverters;
+use ConvertBinaryFile;
+
+sub BEGIN {
+    @WordPlugin::ISA = ('ConvertBinaryFile', 'AutoLoadConverters');
+}
+
+my $openoffice_available = 0;
+
+my $arguments =
+    [ { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'deft' => "&get_default_process_exp()", # delayed (see below)
+	'reqd' => "no" },
+      { 'name' => "description_tags",
+	'desc' => "{HTMLPlugin.description_tags}",
+	'type' => "flag" }
+      ];
+
+
+my $opt_windows_args = [ { 'name' => "windows_scripting",
+			   'desc' => "{WordPlugin.windows_scripting}",
+			   'type' => "flag",
+
+			   'reqd' => "no" } ];
+
+my $opt_office_args = [ { 'name' => "metadata_fields",
+			  'desc' => "{WordPlugin.metadata_fields}",
+			  'type' => "string",
+			  'deft' => "Title" },
+			{ 'name' => "level1_header",
+			  'desc' => "{StructuredHTMLPlugin.level1_header}",
+			  'type' => "regexp",
+			  'reqd' => "no",
+			  'deft' => "" },
+			{ 'name' => "level2_header",
+			  'desc' => "{StructuredHTMLPlugin.level2_header}",
+			  'type' => "regexp",
+			  'reqd' => "no",
+			  'deft' => "" },
+			{ 'name' => "level3_header",
+			  'desc' => "{StructuredHTMLPlugin.level3_header}",
+			  'type' => "regexp",
+			  'reqd' => "no",
+			  'deft' => "" },
+			{ 'name' => "title_header",
+			  'desc' => "{StructuredHTMLPlugin.title_header}",
+			  'type' => "regexp",
+			  'reqd' => "no",
+			  'deft' => "" },
+			{ 'name' => "delete_toc",
+			  'desc' => "{StructuredHTMLPlugin.delete_toc}",
+			  'type' => "flag",
+			  'reqd' => "no" },
+			{ 'name' => "toc_header",
+			  'desc' => "{StructuredHTMLPlugin.toc_header}",
+			  'type' => "regexp",
+			  'reqd' => "no",
+			  'deft' => "" } ];
+
+
+my $options = { 'name'     => "WordPlugin",
+		'desc'     => "{WordPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'srcreplaceable' => "yes", # Source docs in Word can be replaced with GS-generated html
+		'args'     => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    # this bit needs to happen later after the arguments array has been 
+    # finished - used for parsing the input args.
+    # push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    # this one needs to go in first, to get the print info in the right order
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $office_capable = 0;
+    if ($ENV{'GSDLOS'} =~ m/^windows$/i) {
+	push(@$arguments,@$opt_windows_args);
+	$office_capable = 1;
+    } 
+
+    my $auto_converter_self = new AutoLoadConverters($pluginlist,$inputargs,$hashArgOptLists,["OpenOfficeConverter"],1);
+
+   if ($auto_converter_self->{'openoffice_available'}) {
+	$office_capable = 1;
+	$openoffice_available = 1;
+    } 
+
+    # these office args apply to windows scripting or to openoffice conversion
+    if ($office_capable) {
+	push(@$arguments,@$opt_office_args);
+    }
+    
+    # evaluate the default for process_exp  - it needs to be delayed till here so we know if openoffice is available or not. But needs to be done before parsing the args.
+    foreach my $a (@$arguments) {
+	if ($a->{'name'} eq "process_exp") {
+	    my $eval_expr = $a->{'deft'};
+	    $a->{'deft'} = eval "$eval_expr";
+	    last;
+	}
+    }
+    
+    # have finished modifying our arguments, add them to ArgList
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+
+    my $cbf_self = new ConvertBinaryFile($pluginlist, $inputargs, $hashArgOptLists);
+    my $self = BasePlugin::merge_inheritance($auto_converter_self, $cbf_self);
+
+    if ($self->{'info_only'}) {
+	# don't worry about any options etc
+	return bless $self, $class;
+    }
+
+    $self = bless $self, $class;
+    $self->{'file_type'} = "Word";
+
+    my $outhandle = $self->{'outhandle'};
+
+    if ($self->{'windows_scripting'}) {
+	$self->{'convert_options'} = "-windows_scripting";
+	$self->{'office_scripting'} = 1;
+    }    
+    if ($self->{'openoffice_conversion'}) {
+	if ($self->{'windows_scripting'}) {
+	    print $outhandle "Warning: Cannot have -windows_scripting and -openoffice_conversion\n";
+	    print $outhandle "         on at the same time.  Defaulting to -windows_scripting\n";
+	    $self->{'openoffice_conversion'} = 0;
+	}
+	else {
+	    $self->{'office_scripting'} = 1;
+	}
+    }
+
+    # check convert_to
+    if ($self->{'convert_to'} eq "auto") {
+	$self->{'convert_to'} = "html";
+    }
+    # windows or open office scripting, outputs structuredHTML
+    if (defined $self->{'office_scripting'}) {
+	$self->{'convert_to'} = "structuredhtml";
+    } 
+
+    # set convert_to_plugin and convert_to_ext
+    $self->set_standard_convert_settings();
+ 
+    my $secondary_plugin_name = $self->{'convert_to_plugin'};
+    my $secondary_plugin_options = $self->{'secondary_plugin_options'};
+
+    if (!defined $secondary_plugin_options->{$secondary_plugin_name}) {
+	$secondary_plugin_options->{$secondary_plugin_name} = [];
+    }
+    my $specific_options = $secondary_plugin_options->{$secondary_plugin_name};
+
+    # following title_sub removes "Page 1" and a leading
+    # "1", which is often the page number at the top of the page. Bad Luck
+    # if your document title actually starts with "1 " - is there a better way?
+    push(@$specific_options , "-title_sub", '^(Page\s+\d+)?(\s*1\s+)?');
+
+    my $associate_tail_re = $self->{'associate_tail_re'};
+    if ((defined $associate_tail_re) && ($associate_tail_re ne "")) {
+	push(@$specific_options, "-associate_tail_re", $associate_tail_re);
+    }
+    push(@$specific_options, "-file_rename_method", "none");
+
+    if ($secondary_plugin_name eq "StructuredHTMLPlugin") {
+	# Instruct HTMLPlugin (when eventually accessed through read_into_doc_obj)
+	# to extract these metadata fields from the HEAD META fields
+	push (@$specific_options, "-metadata_fields","Title,GENERATOR,date,author<Creator>");
+	push (@$specific_options, "-description_tags") if $self->{'office_scripting'}; 
+	push (@$specific_options, "-extract_language") if $self->{'extract_language'};
+	push (@$specific_options, "-delete_toc") if $self->{'delete_toc'};
+	push (@$specific_options, "-toc_header", $self->{'toc_header'}) if $self->{'toc_header'};
+	push (@$specific_options, "-title_header", $self->{'title_header'}) if $self->{'title_header'};
+	push (@$specific_options, "-level1_header", $self->{'level1_header'}) if $self->{'level1_header'};
+	push (@$specific_options, "-level2_header", $self->{'level2_header'})if $self->{'level2_header'};
+	push (@$specific_options, "-level3_header", $self->{'level3_header'}) if $self->{'level3_header'};
+	push (@$specific_options, "-metadata_fields", $self->{'metadata_fields'}) if $self->{'metadata_fields'};
+	push (@$specific_options, "-metadata_field_separator", $self->{'metadata_field_separator'}) if $self->{'metadata_field_separator'};
+	push(@$specific_options, "-processing_tmp_files");
+	
+    }
+	
+    elsif ($secondary_plugin_name eq "HTMLPlugin") {
+	push(@$specific_options, "-processing_tmp_files");
+	push(@$specific_options,"-input_encoding", "utf8");
+	push(@$specific_options,"-extract_language") if $self->{'extract_language'};
+	push(@$specific_options, "-description_tags") if $self->{'description_tags'};
+	# Instruct HTMLPlugin (when eventually accessed through read_into_doc_obj)
+	# to extract these metadata fields from the HEAD META fields
+	push(@$specific_options,"-metadata_fields","Title,GENERATOR,date,author<Creator>");
+    }
+
+    $self->load_secondary_plugins($class,$secondary_plugin_options,$hashArgOptLists);
+
+    return $self;
+}
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+    if ($openoffice_available) {
+	return q^(?i)\.(doc|dot|docx|odt|wpd)$^;
+    } elsif ($ENV{'GSDLOS'} =~ m/^windows$/i) { 
+		# if OS is windows, can try using docx2html vbs script to see if they have Word 2007
+		# if the user turns windows_scripting on
+		return q^(?i)\.(docx?|dot)$^;
+	}
+    return q^(?i)\.(doc|dot)$^;
+}
+
+sub init {
+    my $self = shift (@_);
+
+    # ConvertBinaryFile init
+    $self->SUPER::init(@_);
+    $self->AutoLoadConverters::init(@_);
+
+}
+
+sub begin {
+    my $self = shift (@_);
+
+    $self->AutoLoadConverters::begin(@_);
+    $self->SUPER::begin(@_);
+
+}
+
+sub deinit {
+    my $self = shift (@_);
+    
+    $self->AutoLoadConverters::deinit(@_);
+    $self->SUPER::deinit(@_);
+
+}
+
+sub tmp_area_convert_file {
+
+    my $self = shift (@_);
+    return $self->AutoLoadConverters::tmp_area_convert_file(@_);
+
+}
+
+
+sub convert_post_process_old
+{
+    my $self = shift (@_);
+    my ($conv_filename) = @_;
+
+    my $outhandle=$self->{'outhandle'};
+     
+    my ($language, $encoding) = $self->textcat_get_language_encoding ($conv_filename);
+
+    # read in file ($text will be in utf8)
+    my $text = "";
+    $self->read_file ($conv_filename, $encoding, $language, \$text);
+
+    # turn any high bytes that aren't valid utf-8 into utf-8.
+    #unicode::ensure_utf8(\$text);
+    
+    # Write it out again!
+    #$self->utf8_write_file (\$text, $conv_filename);
+}
+
+# Modified to cache HTML files for efficieny reasons rather
+# than delete all.  HTML is modified not to use IE's VML.
+# VML uses WML files, so these can be deleted.
+sub cleanup_tmp_area {
+    my ($self) = @_;
+    if (defined $self->{'files_dir'}) {
+	my $html_files_dir = $self->{'files_dir'};
+
+	if (opendir(DIN,$html_files_dir)) {
+	    my @wmz_files = grep( /\.wmz$/, readdir(DIN));
+	    foreach my $f (@wmz_files) {
+		my $full_f = &util::filename_cat($html_files_dir,$f);
+		&util::rm($full_f);
+	    }
+	    closedir(DIN);
+	}
+	else {
+	    # if HTML file has no supporting images, then no _files dir made
+	    # => do nothing
+	}
+    }
+}
+
+
+1;
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/ZIPPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/ZIPPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugins/ZIPPlugin.pm	(revision 24799)
@@ -0,0 +1,231 @@
+###########################################################################
+#
+# ZIPPlugin.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# plugin which handles compressed and/or archived input formats
+#
+# currently handled formats and file extensions are:
+# 
+# gzip (.gz, .z, .tgz, .taz)
+# bzip (.bz)
+# bzip2 (.bz2)
+# zip (.zip .jar)
+# tar (.tar)
+#
+# this plugin relies on the following utilities being present 
+# (if trying to process the corresponding formats)
+#
+# gunzip (for gzip)
+# bunzip (for bzip)
+# bunzip2 
+# unzip (for zip)
+# tar (for tar) 
+
+
+package ZIPPlugin;
+
+use BasePlugin;
+use plugin;
+use util;
+use Cwd;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+BEGIN {
+    @ZIPPlugin::ISA = ('BasePlugin');
+}
+
+my $arguments =
+    [ { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "string",
+	'deft' => &get_default_process_exp(),
+	'reqd' => "no" } ];
+
+my $options = { 'name'     => "ZIPPlugin",
+		'desc'     => "{ZIPPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+sub new {
+
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new BasePlugin($pluginlist, $inputargs, $hashArgOptLists);
+
+    return bless $self, $class;
+}
+
+sub begin {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $processor, $maxdocs) = @_;
+
+    # Are we actually incremental and doing import?
+    my $proc_package_name = ref $processor;
+    if ($proc_package_name !~ /buildproc$/ && $self->{'incremental'} == 1) {
+        # Get the infodbtype value for this collection from the arcinfo object
+        my $infodbtype = $processor->getoutputinfo()->{'infodbtype'};
+	$infodbtype = "gdbm" if $infodbtype eq "gdbm-txtgz"; # in archives, cannot use txtgz version
+	my $output_dir = $processor->getoutputdir();
+    	my $archives_inf = &dbutil::get_infodb_file_path($infodbtype, "archiveinf-doc", $output_dir);
+
+	if ( -e $archives_inf ) {
+	    $self->{'actually_incremental'} = 1;
+	}
+    }
+   
+    
+}
+# this is a recursive plugin
+sub is_recursive {
+    my $self = shift (@_);
+
+    return 1;
+}
+
+sub get_default_process_exp {
+    return q^(?i)\.(gz|tgz|z|taz|bz|bz2|zip|jar|tar)$^;
+}
+
+# return number of files processed, undef if can't process
+# Note that $base_dir might be "" and that $file might 
+# include directories
+sub read {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $block_hash, $metadata, $processor, $maxdocs, $total_count, $gli) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    # can we process this file??
+    my ($filename_full_path, $filename_no_path) = &util::get_full_filenames($base_dir, $file);
+    return undef unless $self->can_process_this_file($filename_full_path);
+	
+    my $tmpdir = $file;
+    $tmpdir =~ s/\.[^\.]*//;
+    $tmpdir = &util::rename_file($tmpdir, $self->{'file_rename_method'});
+    $tmpdir = &util::filename_cat($ENV{'GSDLCOLLECTDIR'}, "tmp", $tmpdir);
+    &util::mk_all_dir ($tmpdir);
+    
+    print $outhandle "ZIPPlugin: extracting $filename_no_path to $tmpdir\n"
+	if $self->{'verbosity'} > 1;
+    
+    # save current working directory
+    my $cwd = cwd();
+    chdir ($tmpdir) || die "Unable to change to $tmpdir";
+    &util::cp ($filename_full_path, $tmpdir);
+    
+    if ($file =~ /\.bz$/i) {
+	$self->bunzip ($filename_no_path);
+    } elsif ($file =~ /\.bz2$/i) {
+	$self->bunzip2 ($filename_no_path);
+    } elsif ($file =~ /\.(zip|jar)$/i) {
+	$self->unzip ($filename_no_path);
+    } elsif ($file =~ /\.tar$/i) {
+	$self->untar ($filename_no_path);
+    } else {
+	$self->gunzip ($filename_no_path);
+    }
+    
+    chdir ($cwd) || die "Unable to change back to $cwd";
+    
+    # do the blocking step inside the folder
+    &plugin::file_block_read ($pluginfo, "", $tmpdir,
+			      $block_hash, $metadata, $gli);
+
+    # if we are incremental, then we need to add all the files in the tmp folder into the new_files list otherwise they won't get processed.
+    if ($self->{'actually_incremental'}) {
+	my @file_list = ();
+	&inexport::add_dir_contents_to_list($tmpdir, \@file_list);
+	foreach my $file (@file_list) {
+	    $block_hash->{'new_files'}->{$file} = 1;
+	}
+    }
+    # all files in the tmp folder need to get the gsdlzipfilenmae metadata
+    my $this_metadata = {};
+    $this_metadata->{"gsdlzipfilename"} = $filename_full_path;
+    &metadatautil::combine_metadata_structures($this_metadata, $metadata);
+    my $numdocs = &plugin::read ($pluginfo, "", $tmpdir, $block_hash, $this_metadata, $processor, $maxdocs, $total_count, $gli);
+    &util::rm_r ($tmpdir);
+    
+    $self->{'num_archives'} ++;
+    
+    return $numdocs;
+    
+}
+
+sub bunzip {
+    my $self = shift (@_);
+    my ($file) = @_;
+
+    if (system ("bunzip \"$file\"")!=0)
+    {
+	&util::rm ($file);
+    }
+}
+
+sub bunzip2 {
+    my $self = shift (@_);
+    my ($file) = @_;
+
+    if (system ("bunzip2 \"$file\"")!=0)
+    {
+	&util::rm ($file);
+    }
+}
+
+sub unzip {
+    my $self = shift (@_);
+    my ($file) = @_;
+
+    system ("unzip \"$file\"");
+    &util::rm ($file) if -e $file;
+}
+
+sub untar {
+    my $self = shift (@_);
+    my ($file) = @_;
+
+    system ("tar xf \"$file\"");
+    &util::rm ($file) if -e $file;
+}
+
+sub gunzip {
+    my $self = shift (@_);
+    my ($file) = @_;
+
+    if (system ("gunzip \"$file\"")!=0)
+    {
+	&util::rm ($file);
+    };
+}
+
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugout.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugout.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugout.pm	(revision 24799)
@@ -0,0 +1,84 @@
+###########################################################################
+#
+# plugout.pm -- functions to handle using plugouts
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package plugout;
+
+use strict; # to pick up typos and undeclared variables...
+no strict 'refs'; # ...but allow filehandles to be variables and vice versa
+no strict 'subs';
+
+require util;
+use gsprintf 'gsprintf';
+
+# global variables
+my $stats = {'num_processed' => 0,
+	     'num_blocked' => 0,
+	     'num_not_processed' => 0,
+	     'num_not_recognised' => 0,
+	     'num_archives' => 0
+	     };
+
+#globaloptions contains any options that should be passed to all plugouts
+my ($verbosity, $outhandle, $failhandle, $globaloptions);
+
+sub load_plugout{
+    my ($plugout) = shift @_;
+
+    my $colplugdir = &util::filename_cat($ENV{'GSDLCOLLECTDIR'},"perllib/plugouts");
+    unshift (@INC, $colplugdir); 
+    
+    my $plugoutname = shift @$plugout;
+
+    # find the plugout
+    my $customplugname;
+    if (defined($ENV{'GSDLCOLLECTION'}))
+    {
+        $customplugname = &util::filename_cat($ENV{'GSDLCOLLECTDIR'}, "custom", $ENV{'GSDLCOLLECTION'}, 
+						 'perllib', 'plugouts', "${plugoutname}.pm");
+    }
+
+    my $colplugname = &util::filename_cat($ENV{'GSDLCOLLECTDIR'}, 'perllib', 'plugouts', 
+					  "${plugoutname}.pm");
+    my $mainplugname = &util::filename_cat($ENV{'GSDLHOME'}, 'perllib', 'plugouts',
+					  "${plugoutname}.pm");
+    if (defined($customplugname) && -e $customplugname) { require $customplugname; }
+    elsif (-e $colplugname) { require $colplugname; }
+    elsif (-e $mainplugname) { require $mainplugname; }
+    else {
+	gsprintf($outhandle, "{plugout.could_not_find_plugout}\n",
+		 $plugoutname);
+	    die "\n";
+    }
+
+    # create a plugout object
+    my ($plugobj);
+
+    eval ("\$plugobj = new \$plugoutname([],\$plugout)");
+    die "$@" if $@;
+
+    return $plugobj;
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugouts/BasePlugout.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugouts/BasePlugout.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugouts/BasePlugout.pm	(revision 24799)
@@ -0,0 +1,1125 @@
+###########################################################################
+#
+# BasePlugout.pm -- base class for all the plugout modules
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2006 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package BasePlugout;
+
+eval {require bytes};
+
+use strict;
+no strict 'subs';
+no strict 'refs';
+
+use dbutil;
+use gsprintf 'gsprintf';
+use printusage;
+use parse2;
+
+
+# suppress the annoying "subroutine redefined" warning that various
+# gets cause under perl 5.6
+$SIG{__WARN__} = sub {warn($_[0]) unless ($_[0] =~ /Subroutine\s+\S+\sredefined/)};
+
+my $arguments = [ 
+       { 'name' => "group_size", 
+	'desc' => "{BasPlugout.group_size}",
+	'type' => "int",
+        'deft' =>  "1",
+	'reqd' => "no",
+	'hiddengli' => "no"},
+       { 'name' => "output_info", 
+	'desc' => "{BasPlugout.output_info}",
+	'type' => "string",   
+	'reqd' => "yes",
+	'hiddengli' => "yes"},        
+       { 'name' => "xslt_file", 
+	'desc' => "{BasPlugout.xslt_file}",
+	'type' => "string",
+	'reqd' => "no",
+	 'deft' => "",
+	'hiddengli' => "no"},
+       { 'name' => "output_handle", 
+	'desc' => "{BasPlugout.output_handle}",
+	'type' => "string",
+        'deft' =>  'STDERR',
+	'reqd' => "no",
+	'hiddengli' => "yes"},
+       { 'name' => "verbosity", 
+	'desc' => "{BasPlugout.verbosity}",
+	'type' => "int",
+        'deft' =>  "0",
+	'reqd' => "no",  
+     	'hiddengli' => "no"},
+       { 'name' => "gzip_output", 
+	'desc' => "{BasPlugout.gzip_output}",
+	'type' => "flag",
+	'reqd' => "no",  
+     	'hiddengli' => "no"},
+       { 'name' => "debug",
+	 'desc' => "{BasPlugout.debug}",
+	 'type' => "flag",
+	 'reqd' => "no",
+	 'hiddengli' => "yes"}
+];
+
+my $options = { 'name'     => "BasePlugout",
+		'desc'     => "{BasPlugout.desc}",
+		'abstract' => "yes",
+		'inherits' => "no",
+		'args'     => $arguments};
+
+sub new 
+{
+    my $class = shift (@_);
+
+    my ($plugoutlist,$args,$hashArgOptLists) = @_;
+    push(@$plugoutlist, $class);
+
+    my $plugout_name = (defined $plugoutlist->[0]) ? $plugoutlist->[0] : $class;
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = {};
+    $self->{'plugout_type'} = $class;
+    $self->{'option_list'} = $hashArgOptLists->{"OptList"};
+    $self->{"info_only"} = 0;
+
+    # Check if gsdlinfo is in the argument list or not - if it is, don't parse 
+    # the args, just return the object.  
+    foreach my $strArg (@{$args})
+    {
+	if(defined $strArg && $strArg eq "-gsdlinfo")
+	{
+	    $self->{"info_only"} = 1;
+	    return bless $self, $class;
+	}
+    }
+    
+    delete $self->{"info_only"};
+    
+    if(parse2::parse($args,$hashArgOptLists->{"ArgList"},$self) == -1)
+    {
+	my $classTempClass = bless $self, $class;
+	print STDERR "<BadPlugout d=$plugout_name>\n";
+	&gsprintf(STDERR, "\n{BasPlugout.bad_general_option}\n", $plugout_name);
+	$classTempClass->print_txt_usage("");  # Use default resource bundle
+	die "\n";
+    }
+
+ 
+    if(defined $self->{'xslt_file'} &&  $self->{'xslt_file'} ne "")
+    {
+	my $full_file_path = &util::locate_config_file($self->{'xslt_file'});
+	if (!defined $full_file_path) {
+	    print STDERR "Can not find $self->{'xslt_file'}, please make sure you have supplied the correct file path\n";
+	    die "\n";
+	}
+	$self->{'xslt_file'} = $full_file_path;
+    }
+
+    $self->{'gs_count'} = 0;    
+
+    $self->{'keep_import_structure'} = 0; 
+
+    return bless $self, $class;
+
+}
+
+sub print_xml_usage
+{
+    my $self = shift(@_);
+    my $header = shift(@_);
+    my $high_level_information_only = shift(@_);
+    
+    # XML output is always in UTF-8
+    gsprintf::output_strings_in_UTF8;
+
+    if ($header) {
+	&PrintUsage::print_xml_header("plugout");
+    }
+    $self->print_xml($high_level_information_only);
+}
+
+
+sub print_xml
+{
+    my $self = shift(@_);
+    my $high_level_information_only = shift(@_);
+
+    my $optionlistref = $self->{'option_list'};
+    my @optionlist = @$optionlistref;
+    my $plugoutoptions = shift(@$optionlistref);
+    return if (!defined($plugoutoptions));
+
+    gsprintf(STDERR, "<PlugoutInfo>\n");
+    gsprintf(STDERR, "  <Name>$plugoutoptions->{'name'}</Name>\n");
+    my $desc = gsprintf::lookup_string($plugoutoptions->{'desc'});
+    $desc =~ s/</&amp;lt;/g; # doubly escaped
+    $desc =~ s/>/&amp;gt;/g;
+    gsprintf(STDERR, "  <Desc>$desc</Desc>\n");
+    gsprintf(STDERR, "  <Abstract>$plugoutoptions->{'abstract'}</Abstract>\n");
+    gsprintf(STDERR, "  <Inherits>$plugoutoptions->{'inherits'}</Inherits>\n");
+    unless (defined($high_level_information_only)) {
+	gsprintf(STDERR, "  <Arguments>\n");
+	if (defined($plugoutoptions->{'args'})) {
+	    &PrintUsage::print_options_xml($plugoutoptions->{'args'});
+	}
+	gsprintf(STDERR, "  </Arguments>\n");
+
+	# Recurse up the plugout hierarchy
+	$self->print_xml();
+    }
+    gsprintf(STDERR, "</PlugoutInfo>\n");
+}
+
+
+sub print_txt_usage
+{
+    my $self = shift(@_);
+
+    # Print the usage message for a plugout (recursively)
+    my $descoffset = $self->determine_description_offset(0);
+    $self->print_plugout_usage($descoffset, 1);
+}
+
+sub determine_description_offset
+{
+    my $self = shift(@_);
+    my $maxoffset = shift(@_);
+
+    my $optionlistref = $self->{'option_list'};
+    my @optionlist = @$optionlistref;
+    my $plugoutoptions = pop(@$optionlistref);
+    return $maxoffset if (!defined($plugoutoptions));
+
+    # Find the length of the longest option string of this download
+    my $plugoutargs = $plugoutoptions->{'args'};
+    if (defined($plugoutargs)) {
+	my $longest = &PrintUsage::find_longest_option_string($plugoutargs);
+	if ($longest > $maxoffset) {
+	    $maxoffset = $longest;
+	}
+    }
+
+    # Recurse up the download hierarchy
+    $maxoffset = $self->determine_description_offset($maxoffset);
+    $self->{'option_list'} = \@optionlist;
+    return $maxoffset;
+}
+
+
+sub print_plugout_usage
+{
+    my $self = shift(@_);
+    my $descoffset = shift(@_);
+    my $isleafclass = shift(@_);
+
+    my $optionlistref = $self->{'option_list'};
+    my @optionlist = @$optionlistref;
+    my $plugoutoptions = shift(@$optionlistref);
+    return if (!defined($plugoutoptions));
+
+    my $plugoutname = $plugoutoptions->{'name'};
+    my $plugoutargs = $plugoutoptions->{'args'};
+    my $plugoutdesc = $plugoutoptions->{'desc'};
+
+    # Produce the usage information using the data structure above
+    if ($isleafclass) {
+	if (defined($plugoutdesc)) {
+	    gsprintf(STDERR, "$plugoutdesc\n\n");
+	}
+	gsprintf(STDERR, " {common.usage}: plugout $plugoutname [{common.options}]\n\n");
+    }
+
+    # Display the download options, if there are some
+    if (defined($plugoutargs)) {
+	# Calculate the column offset of the option descriptions
+	my $optiondescoffset = $descoffset + 2;  # 2 spaces between options & descriptions
+
+	if ($isleafclass) {
+	    gsprintf(STDERR, " {common.specific_options}:\n");
+	}
+	else {
+	    gsprintf(STDERR, " {common.general_options}:\n", $plugoutname);
+	}
+
+	# Display the download options
+	&PrintUsage::print_options_txt($plugoutargs, $optiondescoffset);
+    }
+
+    # Recurse up the download hierarchy
+    $self->print_plugout_usage($descoffset, 0);
+    $self->{'option_list'} = \@optionlist;
+}
+
+
+sub error
+{
+      my ($strFunctionName,$strError) = @_;
+    {
+	print "Error occoured in BasePlugout.pm\n".
+	    "In Function: ".$strFunctionName."\n".
+	    "Error Message: ".$strError."\n";
+	exit(-1);
+    }  
+}
+
+# OIDtype may be "hash" or "incremental" or "dirname" or "assigned"
+sub set_OIDtype {
+    my $self = shift (@_);
+    my ($type, $metadata) = @_;
+
+    if ($type =~ /^(hash|incremental|dirname|assigned)$/) {
+	$self->{'OIDtype'} = $type;
+    } else {
+	$self->{'OIDtype'} = "hash";
+    }
+    if ($type =~ /^assigned$/) {
+	if (defined $metadata) {
+	    $self->{'OIDmetadata'} = $metadata;
+	} else {
+	    $self->{'OIDmetadata'} = "dc.Identifier";
+	}
+    }
+}
+
+sub set_output_dir 
+{
+    my $self = shift @_;
+    my ($output_dir) = @_;
+
+   $self->{'output_dir'} = $output_dir;
+}
+
+sub setoutputdir 
+{
+    my $self = shift @_;
+    my ($output_dir) = @_;
+
+    $self->{'output_dir'} = $output_dir;
+}
+
+sub get_output_dir 
+{
+    my $self = shift (@_);
+
+   return $self->{'output_dir'};
+}
+
+sub getoutputdir 
+{
+    my $self = shift (@_);
+
+    return $self->{'output_dir'};
+}
+
+sub getoutputinfo 
+{
+    my $self = shift (@_);
+
+    return $self->{'output_info'};
+}
+
+
+sub get_output_handler
+{
+    my $self = shift (@_);
+
+    my ($output_file_name) = @_;
+     
+    open(*OUTPUT, ">$output_file_name") or die "Can not open a file handler for  $output_file_name\n";
+
+    return *OUTPUT;            
+}
+
+sub release_output_handler
+{
+    my $self = shift (@_);
+    my ($outhandler) = @_;
+
+    close($outhandler);
+
+}
+
+sub output_xml_header {
+    my $self = shift (@_);
+    my ($handle,$docroot,$nondoctype) = @_;
+    
+    
+	#print $handle '<?xml version="1.0" encoding="UTF-8" standalone="no"?>' . "\n";
+	
+	#For Dspace must be UTF in lower case
+	print $handle '<?xml version="1.0" encoding="utf-8" standalone="no"?>' . "\n";
+   
+    if (!defined $nondoctype){
+	my $doctype = (defined $docroot) ? $docroot : "Section";
+
+	# Used to be '<!DOCTYPE Archive SYSTEM ...'
+	
+	print $handle "<!DOCTYPE $doctype SYSTEM \"http://greenstone.org/dtd/Archive/1.0/Archive.dtd\">\n";
+    }
+
+    print $handle "<$docroot>\n" if defined $docroot;
+}
+
+sub output_xml_footer {
+    my $self = shift (@_);
+    my ($handle,$docroot) = @_;
+    print $handle "</$docroot>\n" if defined $docroot;
+}
+
+
+sub output_general_xml_header 
+{
+    my $self = shift (@_);
+    my ($handle,$docroot,$opt_attributes,$opt_dtd, $opt_doctype) = @_;
+    
+    print $handle '<?xml version="1.0" encoding="utf-8" standalone="no"?>' . "\n";
+   
+    if (defined $opt_dtd) {
+        my $doctype = (defined $opt_doctype) ? $opt_doctype : $docroot;
+	print $handle "<!DOCTYPE $doctype SYSTEM \"$opt_dtd\">\n";
+    }
+
+    if (defined $docroot) {
+        my $full_docroot = $docroot;
+        if (defined $opt_attributes) {
+          $full_docroot .= " $opt_attributes";
+        }
+
+        print $handle "<$full_docroot>\n" 
+      }
+}
+
+sub output_general_xml_footer 
+{
+    output_xml_footer(@_);
+}
+
+
+sub process {
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+    
+    # for OAI purposes
+    $doc_obj->set_lastmodified();
+    $doc_obj->set_oailastmodified();
+
+     if ($self->{'group_size'} > 1) {
+	 $self->group_process ($doc_obj);
+	return;
+    }
+
+    my $OID = $doc_obj->get_OID();
+    $OID = "NULL" unless defined $OID;     
+
+    my $top_section = $doc_obj->get_top_section();
+
+    #get document's directory
+    my $doc_dir = $self->get_doc_dir ($OID, $doc_obj->get_source_filename());
+    
+    my $output_info = $self->{'output_info'};
+    return if (!defined $output_info);
+     
+    ##############################
+    # call subclass' saveas method
+    ##############################
+    $self->saveas($doc_obj,$doc_dir);
+    $self->archiveinf_db($doc_obj,$doc_dir); 
+
+}
+
+sub store_output_info_reference {
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+
+    my $output_info = $self->{'output_info'};
+    my $metaname = $self->{'sortmeta'};
+    if (!defined $metaname || $metaname !~ /\S/) {
+	$output_info->add_info($doc_obj->get_OID(),$self->{'short_doc_file'}, undef, "");
+	return;
+    }
+    
+    my $metadata = "";
+    my $top_section = $doc_obj->get_top_section();
+    
+    my @commameta_list = split(/,/, $metaname);
+    foreach my $cmn (@commameta_list) {
+	my $meta = $doc_obj->get_metadata_element($top_section, $cmn);
+	if ($meta) {
+	    # do remove prefix/suffix - this will apply to all values
+	    $meta =~ s/^$self->{'removeprefix'}// if defined $self->{'removeprefix'};	       
+	    $meta =~ s/$self->{'removesuffix'}$// if defined $self->{'removesuffix'};
+	    $meta = &sorttools::format_metadata_for_sorting($cmn, $meta, $doc_obj);
+	    $metadata .= $meta if ($meta);
+	}
+    }
+
+    # store reference in the output_info     
+    $output_info->add_info($doc_obj->get_OID(),$self->{'short_doc_file'}, undef, $metadata);
+    
+}
+
+sub group_process {
+
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+    
+    my $OID = $doc_obj->get_OID(); 
+    $OID = "NULL" unless defined $OID;
+
+    my $groupsize = $self->{'group_size'};
+    my $gs_count = $self->{'gs_count'};
+    my $open_new_file = (($gs_count % $groupsize)==0);
+    my $outhandle = $self->{'output_handle'};
+
+    # opening a new file, or document has assoicated files => directory needed
+    if (($open_new_file) || (scalar(@{$doc_obj->get_assoc_files()})>0)) {
+		  
+        # The directory the archive file (doc.xml) and all associated files
+        # should end up in
+        my $doc_dir;
+        # If we've determined its time for a new file, open it now
+        if ($open_new_file || !defined($self->{'gs_doc_dir'}))
+          {
+            $doc_dir = $self->get_doc_dir ($OID, $doc_obj->get_source_filename());
+            # only if opening new file
+	    my $output_dir = $self->get_output_dir();
+	    &util::mk_all_dir ($output_dir) unless -e $output_dir;
+	    my $doc_file = &util::filename_cat ($output_dir, $doc_dir, "doc.xml");
+	    my $short_doc_file = &util::filename_cat ($doc_dir, "doc.xml");
+	    
+	    if ($gs_count>0)
+	    {
+		return if (!$self->close_file_output());
+	    }
+
+	    open (GROUPPROCESS, ">$doc_file") or (print $outhandle "BasePlugout::group_process could not write to file $doc_file\n" and return);
+		    
+
+	    $self->{'gs_filename'} = $doc_file;
+	    $self->{'short_doc_file'} = $short_doc_file;
+	    $self->{'gs_OID'} = $OID;
+            $self->{'gs_doc_dir'} = $doc_dir;
+
+	    $self->output_xml_header('BasePlugout::GROUPPROCESS','Archive');
+	}
+        # Otherwise load the same archive document directory used last time
+        else
+          {
+            $doc_dir = $self->{'gs_doc_dir'};
+          }
+
+	# copy all the associated files, add this information as metadata
+	# to the document
+        print $outhandle "Writing associated files to $doc_dir\n";
+	$self->process_assoc_files ($doc_obj, $doc_dir);
+
+	# look up 'gsdlmetafile' metadata and store that information
+	# explicitly in $doc_obj
+	$self->process_metafiles_metadata ($doc_obj);
+    }
+
+    # save this document
+    my $section_text = &docprint::get_section_xml($doc_obj,$doc_obj->get_top_section());
+    print GROUPPROCESS $section_text;
+
+    $self->{'gs_count'}++;
+}
+
+
+sub saveas {
+    my $self = shift (@_);
+   
+    die "Basplug::saveas function must be implemented in sub classes\n";
+}
+
+sub get_doc_dir {
+    my $self = shift (@_);
+    my ($OID, $source_filename) = @_;
+
+    my $working_dir  = $self->get_output_dir();
+    my $working_info = $self->{'output_info'}; 
+    return if (!defined $working_info);
+
+    my $doc_info = $working_info->get_info($OID);
+    my $doc_dir = '';
+
+    if (defined $doc_info && scalar(@$doc_info) >= 1)
+    {
+	# This OID already has an archives directory, so use it again
+	$doc_dir = $doc_info->[0];
+	$doc_dir =~ s/\/?((doc(mets)?)|(dublin_core))\.xml(\.gz)?$//;
+    }
+    elsif ($self->{'keep_import_structure'})
+    {
+	$source_filename = &File::Basename::dirname($source_filename);
+	$source_filename =~ s/[\\\/]+/\//g;
+	$source_filename =~ s/\/$//;
+
+      	$doc_dir = substr($source_filename, length($ENV{'GSDLIMPORTDIR'}) + 1);
+    }
+
+    # We have to use a new archives directory for this document
+    if ($doc_dir eq "")
+    {
+	$doc_dir = $self->get_new_doc_dir ($working_info, $working_dir, $OID);
+    }
+
+    if (!defined $self->{'group'} || !$self->{'group'}){
+	&util::mk_all_dir (&util::filename_cat ($working_dir, $doc_dir));
+    }
+
+    return $doc_dir;
+}
+
+sub get_new_doc_dir{
+   my $self = shift (@_);  
+   my($working_info,$working_dir,$OID) = @_;      
+   
+   
+   my $doc_dir = "";
+   my $doc_dir_rest = $OID;
+
+   # remove any \ and / from the OID
+   $doc_dir_rest =~ s/[\\\/]//g;
+
+   # Remove ":" if we are on Windows OS, as otherwise they get confused with the drive letters
+   $doc_dir_rest =~ s/\://g if ($ENV{'GSDLOS'} =~ /^windows$/i);
+
+   my $doc_dir_num = 0;
+
+   do {
+       $doc_dir .= "/" if $doc_dir_num > 0;
+       if ($doc_dir_rest =~ s/^(.{1,8})//) {
+	   $doc_dir .= $1;
+	   $doc_dir_num++;
+       }
+   } while ($doc_dir_rest ne "" && 
+	    ((-d &util::filename_cat ($working_dir, "$doc_dir.dir")) || 
+	     ($working_info->size() >= 1024 && $doc_dir_num < 2)));
+   my $i = 1;
+   my $doc_dir_base = $doc_dir;
+   while (-d &util::filename_cat ($working_dir, "$doc_dir.dir")) {
+       $doc_dir = "$doc_dir_base-$i";
+       $i++;
+   }
+          
+   return "$doc_dir.dir";
+}
+
+sub process_assoc_files {
+    my $self = shift (@_);
+    my ($doc_obj, $doc_dir, $handle) = @_;
+
+    my $outhandle = $self->{'output_handle'};
+    
+    my $output_dir = $self->get_output_dir();
+    return if (!defined $output_dir);
+
+    &util::mk_all_dir ($output_dir) unless -e $output_dir;
+      
+    my $working_dir = &util::filename_cat($output_dir, $doc_dir);
+    &util::mk_all_dir ($working_dir) unless -e $working_dir;
+
+    my @assoc_files = ();
+    my $filename;;
+
+    my $source_filename = $doc_obj->get_source_filename();
+
+    my $collect_dir = $ENV{'GSDLCOLLECTDIR'};
+
+    if (defined $collect_dir) {
+	my $dirsep_regexp = &util::get_os_dirsep();
+
+	if ($collect_dir !~ /$dirsep_regexp$/) {
+	    $collect_dir .= &util::get_dirsep(); # ensure there is a slash at the end
+	}
+
+	# This test is never going to fail on Windows -- is this a problem?
+     
+	if ($source_filename !~ /^$dirsep_regexp/) {
+	    $source_filename = &util::filename_cat($collect_dir, $source_filename);
+	}
+    }
+
+
+    # set the assocfile path (even if we have no assoc files - need this for lucene)
+    $doc_obj->set_utf8_metadata_element ($doc_obj->get_top_section(),
+					 "assocfilepath",
+					 "$doc_dir");
+    foreach my $assoc_file_rec (@{$doc_obj->get_assoc_files()}) {
+	my ($dir, $afile) = $assoc_file_rec->[1] =~ /^(.*?)([^\/\\]+)$/;
+	$dir = "" unless defined $dir;
+	    
+	my $utf8_real_filename = $assoc_file_rec->[0];
+
+	# for some reasons the image associate file has / before the full path
+	$utf8_real_filename =~ s/^\\(.*)/$1/i;
+
+##	my $real_filename = &util::utf8_to_real_filename($utf8_real_filename);
+	my $real_filename = $utf8_real_filename;
+	$real_filename = &util::downgrade_if_dos_filename($real_filename);
+
+	if (-e $real_filename) {
+
+	    $filename = &util::filename_cat($working_dir, $afile);
+
+	    &util::hard_link ($real_filename, $filename, $self->{'verbosity'});
+	    
+	    $doc_obj->add_utf8_metadata ($doc_obj->get_top_section(),
+					 "gsdlassocfile",
+					 "$afile:$assoc_file_rec->[2]:$dir");
+	} elsif ($self->{'verbosity'} > 1) {
+	    print $outhandle "BasePlugout::process couldn't copy the associated file " .
+		"$real_filename to $afile\n";
+	}
+    }
+}
+
+
+sub process_metafiles_metadata 
+{
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+
+    my $top_section = $doc_obj->get_top_section();
+    my $metafiles = $doc_obj->get_metadata($top_section,"gsdlmetafile");
+
+    foreach my $metafile_pair (@$metafiles) {
+	my ($full_metafile,$metafile) = split(/ : /,$metafile_pair);
+
+	$doc_obj->metadata_file($full_metafile,$metafile);
+    }
+
+    $doc_obj->delete_metadata($top_section,"gsdlmetafile");
+}
+
+sub archiveinf_files_to_field
+{
+    my $self = shift(@_);
+    my ($files,$field,$collect_dir,$oid_files,$reverse_lookups) = @_;
+
+    foreach my $file_rec (@$files) {
+	my $real_filename = (ref $file_rec eq "ARRAY") ? $file_rec->[0] : $file_rec;
+	my $full_file = (ref $file_rec eq "ARRAY") ? $file_rec->[1] : $file_rec;
+	# for some reasons the image associate file has / before the full path
+	$real_filename =~ s/^\\(.*)/$1/i;
+
+	my $raw_filename = &util::downgrade_if_dos_filename($real_filename);
+
+	if (-e $raw_filename) {
+
+#	    if (defined $collect_dir) {
+#		my $collect_dir_re_safe = $collect_dir;
+#		$collect_dir_re_safe =~ s/\\/\\\\/g;
+#		$collect_dir_re_safe =~ s/\./\\./g;##
+
+#		$real_filename =~ s/^$collect_dir_re_safe//;
+#	    }
+	    
+	    if (defined $reverse_lookups) {
+		$reverse_lookups->{$real_filename} = 1;
+	    }
+###	    push(@{$oid_files->{$field}},$full_file);
+	    push(@{$oid_files->{$field}},$raw_filename);
+	}
+	else {
+	    print STDERR "Warning: archiveinf_files_to_field()\n  $real_filename does not appear to be on the file system\n";
+	}
+    }
+}
+
+sub archiveinf_db
+{
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+
+    my $verbosity = $self->{'verbosity'};
+
+    my $collect_dir = $ENV{'GSDLCOLLECTDIR'};
+    if (defined $collect_dir) {
+	my $dirsep_regexp = &util::get_os_dirsep();
+
+	if ($collect_dir !~ /$dirsep_regexp$/) {
+	    # ensure there is a slash at the end
+	    $collect_dir .= &util::get_dirsep(); 
+	}
+    }
+
+    my $oid = $doc_obj->get_OID();
+    my $source_filename = $doc_obj->get_unmodified_source_filename();
+    my $working_info = $self->{'output_info'}; 
+    my $doc_info = $working_info->get_info($oid);
+
+    my ($doc_file,$index_status,$sortmeta) = @$doc_info;
+    # doc_file is the path to the archive doc.xml. Make sure it has unix 
+    # slashes, then if the collection is copied to linux, it can be built without reimport
+    $doc_file =~ s/\\/\//g;
+    my $oid_files = { 'doc-file' => $doc_file,
+		      'index-status' => $index_status,
+		      'src-file' => $source_filename,
+		      'sort-meta' => $sortmeta,
+		      'assoc-file' => [],
+		      'meta-file'  => [] };
+    
+    my $reverse_lookups = { $source_filename => "1" };
+
+
+    $self->archiveinf_files_to_field($doc_obj->get_source_assoc_files(),"assoc-file",
+				     $collect_dir,$oid_files,$reverse_lookups);
+
+
+    $self->archiveinf_files_to_field($doc_obj->get_meta_files(),"meta-file",
+				     $collect_dir,$oid_files);
+
+    # Get the infodbtype value for this collection from the arcinfo object
+    my $infodbtype = $self->{'output_info'}->{'infodbtype'};
+    my $output_dir = $self->{'output_dir'};
+
+    my $doc_db = &dbutil::get_infodb_file_path($infodbtype, "archiveinf-doc", $output_dir);
+    my $src_db = &dbutil::get_infodb_file_path($infodbtype, "archiveinf-src", $output_dir);
+
+    ##print STDERR "*** To set in db: \n\t$doc_db\n\t$oid\n\t$doc_db_text\n";
+
+    $oid_files->{'doc-file'} = [ $oid_files->{'doc-file'} ];
+    $oid_files->{'index-status'} = [ $oid_files->{'index-status'} ];
+    $oid_files->{'src-file'} = [ $oid_files->{'src-file'} ];
+    $oid_files->{'sort-meta'} = [ $oid_files->{'sort-meta'} ];
+
+    my $infodb_file_handle = &dbutil::open_infodb_write_handle($infodbtype, $doc_db, "append");
+    &dbutil::write_infodb_entry($infodbtype, $infodb_file_handle, $oid, $oid_files);
+    &dbutil::close_infodb_write_handle($infodbtype, $infodb_file_handle);
+
+    foreach my $rl (keys %$reverse_lookups) {
+	$working_info->add_reverseinfo($rl,$oid);
+    }  
+
+    # meta files not set in reverese entry, but need to set the metadata flag
+    if (defined $doc_obj->get_meta_files()) {
+	foreach my $meta_file_rec(@{$doc_obj->get_meta_files()}) {
+	    my $full_file = (ref $meta_file_rec eq "ARRAY") ? $meta_file_rec->[0] : $meta_file_rec;
+	    $working_info->set_meta_file_flag($full_file);
+	}
+    }
+}
+
+
+sub set_sortmeta {
+    my $self = shift (@_);
+    my ($sortmeta, $removeprefix, $removesuffix) = @_;
+    
+    $self->{'sortmeta'} = $sortmeta;
+    if (defined ($removeprefix) && $removeprefix ) {
+	$removeprefix =~ s/^\^//; # don't need a leading ^
+	$self->{'removeprefix'} = $removeprefix;
+    }
+    if (defined ($removesuffix) && $removesuffix) {
+	$removesuffix =~ s/\$$//; # don't need a trailing $
+	$self->{'removesuffix'} = $removesuffix;
+    }
+}
+
+sub open_xslt_pipe
+{
+    my $self = shift @_;
+    my ($output_file_name, $xslt_file)=@_;
+
+    return unless defined $xslt_file and $xslt_file ne "" and -e $xslt_file;
+    
+    my $java_class_path =  &util::filename_cat ($ENV{'GSDLHOME'},"bin","java","ApplyXSLT.jar");
+
+    my $mapping_file_path = "";
+
+    if ($ENV{'GSDLOS'} eq "windows"){
+	$java_class_path .=";".&util::filename_cat ($ENV{'GSDLHOME'},"bin","java","xalan.jar");
+	# this file:/// bit didn't work for me on windows XP
+	#$xslt_file = "\"file:///".$xslt_file."\"";
+	#$mapping_file_path = "\"file:///";
+    }
+    else{
+	$java_class_path .=":".&util::filename_cat ($ENV{'GSDLHOME'},"bin","java","xalan.jar");
+    }
+
+
+    $java_class_path = "\"".$java_class_path."\"";
+
+    my $cmd = "| java -cp $java_class_path org.nzdl.gsdl.ApplyXSLT -t \"$xslt_file\" "; 
+
+    if (defined $self->{'mapping_file'} and $self->{'mapping_file'} ne ""){
+	my $mapping_file_path = "\"".$self->{'mapping_file'}."\""; 
+	$cmd .= "-m $mapping_file_path";
+    }
+    
+    open(*XMLWRITER, $cmd)
+	or die "can't open pipe to xslt: $!";
+
+    
+    $self->{'xslt_writer'} = *XMLWRITER;
+
+    print XMLWRITER "<?DocStart?>\n";	    
+    print XMLWRITER "$output_file_name\n";
+
+ 
+  }
+  
+
+sub close_xslt_pipe
+{
+  my $self = shift @_;
+
+  
+  return unless defined $self->{'xslt_writer'} ;
+    
+  my $xsltwriter = $self->{'xslt_writer'};
+  
+  print $xsltwriter "<?DocEnd?>\n";
+  close($xsltwriter);
+
+  undef $self->{'xslt_writer'};
+
+}
+
+sub close_file_output
+{
+    my ($self) = @_;
+ 
+    # make sure that the handle has been opened - it won't be if we failed
+    # to import any documents...
+    if (defined(fileno(GROUPPROCESS))) {
+	$self->output_xml_footer('GROUPPROCESS','Archive');    
+	close GROUPPROCESS;
+    }
+
+    my $OID = $self->{'gs_OID'};
+    my $short_doc_file = $self->{'short_doc_file'};
+   
+    if ($self->{'gzip'}) {
+	my $doc_file = $self->{'gs_filename'};
+	`gzip $doc_file`;
+	$doc_file .= ".gz";
+	$short_doc_file .= ".gz";
+	if (!-e $doc_file) {
+	     my $outhandle = $self->{'output_handle'};
+	    print $outhandle "error while gzipping: $doc_file doesn't exist\n";
+	    return 0;
+	}
+    }
+
+    # store reference in output_info
+    my $output_info = $self->{'output_info'};
+    return 0 if (!defined $output_info);
+    $output_info->add_info($OID, $short_doc_file, undef, undef);
+    return 1;
+}
+
+
+#the subclass should implement this method if is_group method could return 1.
+sub close_group_output{
+   my $self = shift (@_);        
+}
+
+sub is_group {
+    my $self = shift (@_);
+    return 0;        
+}
+
+my $dc_set = { Title => 1,       
+	       Creator => 1, 
+	       Subject => 1, 
+	       Description => 1, 
+	       Publisher => 1, 
+	       Contributor => 1, 
+	       Date => 1, 
+	       Type => 1, 
+	       Format => 1, 
+	       Identifier => 1, 
+	       Source => 1, 
+	       Language => 1, 
+	       Relation => 1, 
+	       Coverage => 1, 
+	       Rights => 1};
+
+
+# returns an XML representation of the dublin core metadata
+# if dc meta is not found, try ex meta
+# This method is not used by the DSpacePlugout, which has its
+# own method to save its dc metadata
+sub get_dc_metadata {
+    my $self = shift(@_);
+    my ($doc_obj, $section, $version) = @_;
+    
+    # build up string of dublin core metadata
+    $section="" unless defined $section;
+    
+    my $section_ptr = $doc_obj->_lookup_section($section);
+    return "" unless defined $section_ptr;
+
+
+    my $explicit_dc = {};
+    my $explicit_ex_dc = {};
+    my $explicit_ex = {};
+
+    my $all_text="";
+    
+    # We want high quality dc metadata to go in first, so we store all the
+    # assigned dc.* values first. Then, for all those dc metadata names in
+    # the official dc set that are as yet unassigned, we look to see whether
+    # embedded ex.dc.* metadata has defined some values for them. If not,
+    # then for the same missing dc metadata names, we look in ex metadata.
+
+    foreach my $data (@{$section_ptr->{'metadata'}}){
+	my $escaped_value = &docprint::escape_text($data->[1]);
+	if ($data->[0]=~ m/^dc\./) {
+	    $data->[0] =~ tr/[A-Z]/[a-z]/;
+
+	    $data->[0] =~ m/^dc\.(.*)/;
+	    my $dc_element =  $1;
+
+	    if (!defined $explicit_dc->{$dc_element}) {
+		$explicit_dc->{$dc_element} = [];
+	    }
+	    push(@{$explicit_dc->{$dc_element}},$escaped_value);
+
+	    if (defined $version && ($version eq "oai_dc")) {
+		$all_text .= "   <dc:$dc_element>$escaped_value</dc:$dc_element>\n";
+	    }
+	    else {
+		# qualifier???
+		$all_text .= '   <dcvalue element="'. $dc_element.'">'. $escaped_value. "</dcvalue>\n";
+	    }
+
+	} elsif ($data->[0]=~ m/^ex\.dc\./) { # now look through ex.dc.* to fill in as yet unassigned fields in dc metaset
+	    $data->[0] =~ m/^ex\.dc\.(.*)/;
+	    my $ex_dc_element = $1;
+	    my $lc_ex_dc_element = lc($ex_dc_element);
+
+	    # only store the ex.dc value for this dc metaname if no dc.* was assigned for it
+	    if (defined $dc_set->{$ex_dc_element}) { 
+		if (!defined $explicit_ex_dc->{$lc_ex_dc_element}) {
+		    $explicit_ex_dc->{$lc_ex_dc_element} = [];
+		}
+		push(@{$explicit_ex_dc->{$lc_ex_dc_element}},$escaped_value);
+	    }
+	}
+	elsif (($data->[0] =~ m/^ex\./) || ($data->[0] !~ m/\./)) { # look through ex. meta (incl. meta without prefix)
+	    $data->[0] =~ m/^(ex\.)?(.*)/;
+	    my $ex_element = $2;
+	    my $lc_ex_element = lc($ex_element);
+
+	    if (defined $dc_set->{$ex_element}) {
+		if (!defined $explicit_ex->{$lc_ex_element}) {
+		    $explicit_ex->{$lc_ex_element} = [];
+		}
+		push(@{$explicit_ex->{$lc_ex_element}},$escaped_value);
+	    }
+	}
+    }
+
+    # go through dc_set and for any element *not* defined in explicit_dc
+    # that does exist in explicit_ex, add it in as metadata
+    foreach my $k ( keys %$dc_set ) {
+	my $lc_k = lc($k);
+
+	if (!defined $explicit_dc->{$lc_k}) {
+	    # try to find if ex.dc.* defines this dc.* meta,
+	    # if not, then look for whether there's an ex.* equivalent
+
+	    if (defined $explicit_ex_dc->{$lc_k}) {
+		foreach my $v (@{$explicit_ex_dc->{$lc_k}}) {
+		    my $dc_element    = $lc_k;
+		    my $escaped_value = $v;
+		    
+		    if (defined $version && ($version eq "oai_dc")) {
+			$all_text .= "   <dc:$dc_element>$escaped_value</dc:$dc_element>\n";
+		    }
+		    else {
+			$all_text .= '   <dcvalue element="'. $dc_element.'">'. $escaped_value. "</dcvalue>\n";
+		    }		    
+		}
+	    } elsif (defined $explicit_ex->{$lc_k}) {
+		foreach my $v (@{$explicit_ex->{$lc_k}}) {
+		    my $dc_element    = $lc_k;
+		    my $escaped_value = $v;
+
+		    if (defined $version && ($version eq "oai_dc")) {
+			$all_text .= "   <dc:$dc_element>$escaped_value</dc:$dc_element>\n";
+		    }
+		    else {
+			$all_text .= '   <dcvalue element="'. $dc_element.'">'. $escaped_value. "</dcvalue>\n";
+		    }
+		}
+	    }
+	}
+    }
+
+    if ($all_text eq "") {
+	$all_text .= "   There is no Dublin Core metatdata in this document\n";
+    }	
+    $all_text =~ s/[\x00-\x09\x0B\x0C\x0E-\x1F]//g;
+
+    return $all_text;
+}
+
+# Build up dublin_core metadata.  Priority given to dc.* over ex.*
+# This method was apparently added by Jeffrey and committed by Shaoqun.
+# But we don't know why it was added, so not using it anymore.
+sub new_get_dc_metadata {
+    
+    my $self = shift(@_);
+    my ($doc_obj, $section, $version) = @_;
+
+    # build up string of dublin core metadata
+    $section="" unless defined $section;
+    
+    my $section_ptr=$doc_obj->_lookup_section($section);
+    return "" unless defined $section_ptr;
+
+    my $all_text = "";
+    foreach my $data (@{$section_ptr->{'metadata'}}){
+	my $escaped_value = &docprint::escape_text($data->[1]);
+	my $dc_element =  $data->[0];
+	
+	my @array = split('\.',$dc_element);
+	my ($type,$name);
+
+	if(defined $array[1])
+	{
+	    $type = $array[0];
+	    $name = $array[1];
+	}
+	else
+	{
+	    $type = "ex";
+	    $name = $array[0];
+	}
+	
+	$all_text .= '   <Metadata Type="'. $type.'" Name="'.$name.'">'. $escaped_value. "</Metadata>\n";
+    }
+    return $all_text;
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugouts/DSpacePlugout.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugouts/DSpacePlugout.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugouts/DSpacePlugout.pm	(revision 24799)
@@ -0,0 +1,343 @@
+###########################################################################
+#
+# DSpacePlugout.pm -- the plugout module for DSpace archives
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2006 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package DSpacePlugout;
+
+use strict;
+no strict 'refs';
+use utf8;
+eval {require bytes};
+use util;
+use BasePlugout;
+
+sub BEGIN {
+    @DSpacePlugout::ISA = ('BasePlugout');
+}
+
+my $arguments = [ 
+       { 'name' => "metadata_prefix", 
+	'desc' => "{DSpacePlugout.metadata_prefix}",
+	'type' => "string",   
+	'reqd' => "no",
+	'hiddengli' => "no"} ];
+
+
+my $options = { 'name'     => "DSpacePlugout",
+		'desc'     => "{DSpacePlugout.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+                'args'     => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($plugoutlist, $inputargs,$hashArgOptLists) = @_;
+    push(@$plugoutlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new BasePlugout($plugoutlist,$inputargs,$hashArgOptLists);    
+
+#    print STDERR "***** metadata prefix = \"", $self->{'metadata_prefix'}, "\"\n";
+
+    return bless $self, $class;
+}
+
+sub saveas_dspace_metadata
+{
+    my $self = shift (@_);
+    my ($doc_obj,$working_dir,$metadata_file,$docroot,$metadata_prefix) = @_;
+
+    # my $docroot_attributes = ($metadata_prefix eq "dc") ? undef : "schema=\"$metadata_prefix\"";
+    my $docroot_attributes = "schema=\"$metadata_prefix\"";
+ 
+    my $doc_dc_file = &util::filename_cat ($working_dir, $metadata_file);
+    $self->open_xslt_pipe($doc_dc_file,$self->{'xslt_file'});
+
+    my $outhandler;
+    if (defined $self->{'xslt_writer'}){
+	$outhandler = $self->{'xslt_writer'};
+    }
+    else{
+	$outhandler = $self->get_output_handler($doc_dc_file);
+     }
+   
+    $self->output_general_xml_header($outhandler, $docroot, $docroot_attributes);
+
+    my $metadata_hashmap = $doc_obj->get_metadata_hashmap($doc_obj->get_top_section(),
+                                                          $metadata_prefix);
+
+    if(defined $metadata_prefix && $metadata_prefix ne "") {
+	# merge dc with any ex.dc
+
+	my $ex_dc_metadata_hashmap = $doc_obj->get_metadata_hashmap($doc_obj->get_top_section(),
+                                                          "ex.dc");
+
+	foreach my $metaname (keys %$ex_dc_metadata_hashmap) {
+	    my $metaname_without_ex_prefix = $metaname;
+	    $metaname_without_ex_prefix =~ s/^ex\.(.*)/$1/; # remove any ex from the ex.dc prefix
+
+	    # if there's an ex.dc value for a metaname for which no dc
+	    # value was assigned, put the ex.dc value into the hashmap
+	    if(!defined $metadata_hashmap->{$metaname_without_ex_prefix}) { 
+		$metadata_hashmap->{$metaname_without_ex_prefix} = [];
+		push(@{$metadata_hashmap->{$metaname_without_ex_prefix}},@{$ex_dc_metadata_hashmap->{$metaname}}); 
+	    }
+	}
+
+    }
+
+    foreach my $metaname (keys %$metadata_hashmap) {
+      my $metavals = $metadata_hashmap->{$metaname};
+
+      my $qualifier = undef;
+      my $element;
+      if ($metaname =~ m/^(.*?)\^(.*?)$/) {
+        $element = $1;
+        $qualifier = $2;
+		$qualifier = lc($qualifier);
+      }
+      else {
+        $element = $metaname;
+      }
+      $element =~ s/^.*?\.//;
+	  $element = lc($element);
+
+      foreach my $metaval (@$metavals) {
+        
+		#if element is empty then no need to export it.
+		
+		if ($metaval =~ /\S/) {
+			print $outhandler "  <dcvalue element=\"$element\"";
+			#If no qualifier then add qualifier="none"
+			#print $outhandler " qualifier=\"$qualifier\"" if defined $qualifier;
+			if (defined $qualifier) {
+				print $outhandler " qualifier=\"$qualifier\"" ;
+			}
+			else {
+				print $outhandler " qualifier=\"none\" language=\"\"" ;
+			}
+			print $outhandler ">$metaval";
+			print $outhandler "</dcvalue>\n";
+		}
+		
+		
+		
+      }
+    }
+    
+    $self->output_general_xml_footer($outhandler,$docroot);
+   
+    if (defined $self->{'xslt_writer'}){     
+	$self->close_xslt_pipe(); 
+    }
+    else{
+	close($outhandler);
+    }
+
+}
+
+sub saveas {
+    my $self = shift (@_);
+    my ($doc_obj,$doc_dir) = @_;
+
+    my $output_dir = $self->get_output_dir();
+    &util::mk_all_dir ($output_dir) unless -e $output_dir;
+
+    my $working_dir = &util::filename_cat ($output_dir, $doc_dir);    
+    &util::mk_all_dir ($working_dir, $doc_dir);
+
+    #########################
+    # save the handle file
+    #########################
+    my $outhandle = $self->{'output_handle'};
+  
+	my $generate_handle = 0;
+	if ($generate_handle) {
+		# Genereate handle file 
+		# (Note: this section of code would benefit from being restructured)
+		my $doc_handle_file = &util::filename_cat ($working_dir, "handle");
+    
+		my $env_hp = $ENV{'DSPACE_HANDLE_PREFIX'};
+		my $handle_prefix = (defined $env_hp) ? $env_hp : "123456789";
+
+		my $outhandler =  $self->get_output_handler($doc_handle_file);
+
+		my ($handle) = ($doc_dir =~ m/^(.*)(:?\.dir)?$/);
+
+		print $outhandler "$handle_prefix/$handle\n";
+    
+		close ($outhandler);
+    }
+	
+    #########################
+    # save the content file
+    #########################
+    my $doc_contents_file = &util::filename_cat ($working_dir, "contents");
+    
+    my $outhandler =  $self->get_output_handler($doc_contents_file);
+
+    $self->process_assoc_files ($doc_obj, $doc_dir, $outhandler);
+    
+    $self->process_metafiles_metadata ($doc_obj);
+
+    close($outhandler);
+
+    #############################
+    # save the dublin_core.xml file
+    ###############################
+#      my $doc_dc_file = &util::filename_cat ($working_dir, "dublin_core.xml");
+#      $self->open_xslt_pipe($doc_dc_file,$self->{'xslt_file'});
+
+#      if (defined $self->{'xslt_writer'}){
+#  	$outhandler = $self->{'xslt_writer'};
+#      }
+#      else{
+#  	$outhandler = $self->get_output_handler($doc_dc_file);
+#       }
+   
+#      $self->output_general_xml_header($outhandler, "dublin_core");
+
+#      my $all_text = $self->get_dc_metadata($doc_obj, $doc_obj->get_top_section());
+#      print $outhandler $all_text;
+
+#      $self->output_general_xml_footer($outhandler,"dublin_core");
+   
+#      if (defined $self->{'xslt_writer'}){     
+#  	$self->close_xslt_pipe(); 
+#      }
+#      else{
+#  	close($outhandler);
+#      }
+
+    $self->saveas_dspace_metadata($doc_obj,$working_dir,
+                                  "dublin_core.xml","dublin_core","dc");
+
+    my $metadata_prefix_list = $self->{'metadata_prefix'};
+#    print STDERR "***!! md prefix = $metadata_prefix_list\n";
+
+    my @metadata_prefixes = split(/,\s*/,$metadata_prefix_list);
+    foreach my $ep (@metadata_prefixes) {
+      $self->saveas_dspace_metadata($doc_obj,$working_dir,
+                                    "metadata_$ep.xml","dublin_core",$ep); 
+    }
+
+    $self->{'short_doc_file'} =  &util::filename_cat ($doc_dir, "dublin_core.xml"); 
+    $self->store_output_info_reference($doc_obj);
+}
+
+ sub process_assoc_files {
+    my $self = shift (@_);
+    my ($doc_obj, $doc_dir, $handle) = @_;
+
+    my $outhandler = $self->{'output_handle'};
+    
+    my $output_dir = $self->get_output_dir();
+    return if (!defined $output_dir);
+
+    my $working_dir = &util::filename_cat($output_dir, $doc_dir);
+
+    my @assoc_files = ();
+    my $filename;;
+
+    my $source_filename = $doc_obj->get_source_filename();
+
+    my $collect_dir = $ENV{'GSDLCOLLECTDIR'};
+
+    if (defined $collect_dir) {
+	my $dirsep_regexp = &util::get_os_dirsep();
+
+	if ($collect_dir !~ /$dirsep_regexp$/) {
+	    $collect_dir .= &util::get_dirsep(); # ensure there is a slash at the end
+	}
+
+	# This test is never going to fail on Windows -- is this a problem?
+	if ($source_filename !~ /^$dirsep_regexp/) {
+	    $source_filename = &util::filename_cat($collect_dir, $source_filename);
+	}
+    }
+   
+    my ($tail_filename) = ($source_filename =~ m/([^\/\\]*)$/);
+    
+    print $handle "$tail_filename\n";
+    
+    $filename = &util::filename_cat($working_dir, $tail_filename);
+    &util::hard_link ($source_filename, $filename, $self->{'verbosity'});
+             
+    # set the assocfile path (even if we have no assoc files - need this for lucene)
+    $doc_obj->set_utf8_metadata_element ($doc_obj->get_top_section(),
+					 "assocfilepath",
+					 "$doc_dir");
+    foreach my $assoc_file_rec (@{$doc_obj->get_assoc_files()}) {
+	my ($dir, $afile) = $assoc_file_rec->[1] =~ /^(.*?)([^\/\\]+)$/;
+	$dir = "" unless defined $dir;
+	    
+	
+	my $real_filename = $assoc_file_rec->[0];
+	# for some reasons the image associate file has / before the full path
+	$real_filename =~ s/^\\(.*)/$1/i;
+	if (-e $real_filename) {
+		# escape backslashes in path for upcoming regex match
+		my $escaped_source_filename = $source_filename;
+		$escaped_source_filename =~ s/\\/\\\\/g;		
+	    if ($real_filename =~ m/$escaped_source_filename$/) {
+		next;
+	    }
+	    else {
+		my $bundle = "bundle:ORIGINAL";
+		
+		if ($afile =~ m/^thumbnail\./) {
+		    $bundle = "bundle:THUMBNAIL";
+		}
+
+		# Store the associated file to the "contents" file. Cover.pdf not needed.
+		if ($afile ne "cover.jpg") {
+			print $handle "$assoc_file_rec->[1]\t$bundle\n";
+	    }
+		}
+	
+	    $filename = &util::filename_cat($working_dir, $afile);
+	    
+		if ($afile ne "cover.jpg") {
+			&util::hard_link ($real_filename, $filename, $self->{'verbosity'});
+	        $doc_obj->add_utf8_metadata ($doc_obj->get_top_section(),
+				 "gsdlassocfile",
+				 "$afile:$assoc_file_rec->[2]:$dir");
+		}
+	} elsif ($self->{'verbosity'} > 2) {
+	    print $outhandler "DSpacePlugout::process couldn't copy the associated file " .
+		"$real_filename to $afile\n";
+	}
+    }
+}
+                          
+
+sub get_new_doc_dir{
+   my $self = shift (@_);  
+   my($working_info,$working_dir,$OID) = @_; 
+  
+   return $OID;
+
+}
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugouts/FedoraMETSPlugout.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugouts/FedoraMETSPlugout.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugouts/FedoraMETSPlugout.pm	(revision 24799)
@@ -0,0 +1,787 @@
+###########################################################################
+#
+# FedoraMETSPlugout.pm -- the plugout module for METS archives
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2006 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# But WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package FedoraMETSPlugout;
+
+use strict;
+no strict 'refs';
+
+#eval {require bytes};
+#use util;
+use METSPlugout;
+#use docprint; # for escape_text
+
+sub BEGIN {
+    @FedoraMETSPlugout::ISA = ('METSPlugout');
+
+    if ((!defined $ENV{'FEDORA_HOME'}) || (!defined $ENV{'FEDORA_VERSION'})) {
+	if (defined $ENV{'FEDORA_HOME'}) {
+	    print STDERR "FEDORA_HOME = $ENV{'FEDORA_HOME'}";
+	}
+
+	if (defined $ENV{'FEDORA_VERSION'}) {
+	    print STDERR "FEDORA_VERSION = $ENV{'FEDORA_VERSION'}";
+	}
+
+	die "Need both environment variables FEDORA_HOME and FEDORA_VERSION to be set\n";
+    }
+
+    $ENV{'FEDORA_HOSTNAME'} = "localhost" if (!defined $ENV{'FEDORA_HOSTNAME'});
+    $ENV{'FEDORA_SERVER_PORT'} = "8080" if (!defined $ENV{'FEDORA_SERVER_PORT'});
+    $ENV{'FEDORA_USER'}     = "fedoraAdmin" if (!defined $ENV{'FEDORA_USER'});
+    $ENV{'FEDORA_PASS'}     = "fedoraAdmin" if (!defined $ENV{'FEDORA_PASS'});
+    $ENV{'FEDORA_PROTOCOL'} = "http" if (!defined $ENV{'FEDORA_PROTOCOL'});
+    $ENV{'FEDORA_PID_NAMESPACE'} = "greenstone" if (!defined $ENV{'FEDORA_PID_NAMESPACE'});
+    $ENV{'FEDORA_PREFIX'} = "/fedora" if (!defined $ENV{'FEDORA_PREFIX'});
+}
+
+my $arguments = [ 
+      { 'name' => "fedora_namespace", 
+	'desc' => "{FedoraMETSPlugout.fedora_namespace}",
+	'type' => "string",
+        'deft' =>  "greenstone",
+	'reqd' => "no",    
+	'hiddengli' => "no"}
+		  ];
+
+
+
+my $options = { 'name'     => "FedoraMETSPlugout",
+		'desc'     => "{FedoraMETSPlugout.desc}",
+		'abstract' => "no",
+		'inherits' => "yes", 
+	        'args'     => $arguments
+                };
+
+
+sub new 
+{
+    my ($class) = shift (@_);
+    my ($plugoutlist, $inputargs,$hashArgOptLists) = @_;
+    push(@$plugoutlist, $class);
+    
+    
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+    
+    my $self = new METSPlugout($plugoutlist,$inputargs,$hashArgOptLists);
+
+    return bless $self, $class;
+}
+
+
+sub output_mets_xml_header
+{
+    my $self = shift(@_);
+    my ($handle, $OID, $doc_title) = @_;
+
+    my $fnamespace = $self->{'fedora_namespace'};
+    my $oid_namespace = (defined $fnamespace) ? $fnamespace : "test";
+
+    my $collection = $ENV{'GSDLCOLLECTION'};
+
+    # Might need the following in the schemeLocation attribute for Fedora3
+    #   http://www.fedora.info/definitions/1/0/mets-fedora-ext1-1.xsd
+    my $extra_attr = "OBJID=\"$oid_namespace:$collection-$OID\" TYPE=\"FedoraObject\" LABEL=\"$doc_title\"";
+
+    my $extra_schema = undef;
+
+    if (defined $ENV{'FEDORA_VERSION'} && $ENV{'FEDORA_VERSION'} =~ m/^2/) { # checking if major version is 2
+    	$extra_schema = "http://www.fedora.info/definitions/1/0/mets-fedora-ext.xsd";
+    }
+    else {
+	$extra_attr .= " EXT_VERSION=\"1.1\"";
+    }
+    
+    $self->output_mets_xml_header_extra_attribute($handle,$extra_attr,$extra_schema);
+
+    print $handle '<mets:metsHdr RECORDSTATUS="A"/>'. "\n"; # A = active
+
+}
+
+#
+#  Print out "family" of doctxt.xml files
+#
+
+sub saveas_doctxt_section
+{
+    my $self = shift (@_);
+    my ($doc_obj,$working_dir,$section) = @_;
+
+    my $section_ptr=$doc_obj->_lookup_section($section);
+    return unless defined $section_ptr;
+
+    my $section_fnum ="1". $section;
+    $section_fnum =~ s/\./_/g;
+
+    my $doc_txt_file = &util::filename_cat ($working_dir,"doctxt$section_fnum.xml");	
+	
+    $self->open_xslt_pipe($doc_txt_file,$self->{'xslt_txt'});
+
+    my $outhandler; 
+
+    if (defined $self->{'xslt_writer'}){
+	$outhandler = $self->{'xslt_writer'};
+    }
+    else{
+	$outhandler = $self->get_output_handler($doc_txt_file);
+    } 
+
+    $self->output_xml_header($outhandler);
+
+    ## change links to be Fedora cognant:
+    my $txt = $section_ptr->{'text'};
+    $section_ptr->{'text'} = $self->adjust_links($doc_obj, \$txt);
+
+    $self->output_txt_section($outhandler,$doc_obj, $section);
+    $self->output_xml_footer($outhandler);
+    
+
+    if (defined $self->{'xslt_writer'}){     
+	$self->close_xslt_pipe(); 
+    }
+    else{
+	close($outhandler);
+    } 
+
+
+    # Output all the subsections as separate files
+    foreach my $subsection (@{$section_ptr->{'subsection_order'}}){
+	
+	$self->saveas_doctxt_section($doc_obj, $working_dir, "$section.$subsection");
+    }
+}
+
+sub adjust_links
+{
+    my $self = shift(@_);
+    my ($doc_obj, $textref) = @_;
+
+    ## change links to be Fedora cognant:
+    # 1. retrieve txt of section - $$textref
+    # 2. change it:
+    # /$ENV{'FEDORA_PREFIX'}/objects/$greenstone-docobj-hash-xxx/datastreams/FG<orig-img-name>/content
+    # 3. only replace it back in doc_obj if we didn't get a ref in the first place
+
+    my $OID = $doc_obj->get_OID();
+    my $fnamespace = $self->{'fedora_namespace'};
+    if($OID ne "collection" && defined $fnamespace) {
+	my $fed_id = "$fnamespace:".$ENV{'GSDLCOLLECTION'}."-$OID"; #oid_namespace:collection-OID
+	my $fedora_url_prefix = $ENV{'FEDORA_PREFIX'}."/objects/$fed_id/datastreams/FG";
+	my $fedora_url_suffix = "/content";
+
+	$$textref =~ s/(<(?:img|embed|table|tr|td|link|script)[^>]*?(?:src|background|href)\s*=\s*)((?:[\"][^\"]+[\"])|(?:[\'][^\']+[\'])|(?:[^\s\/>]+))([^>]*>)/$self->replace_rel_link($1, $2, $3, $fedora_url_prefix, $fedora_url_suffix)/isge;
+#	print STDERR "*** all text after: $$textref\n\n";
+    }
+
+    return $$textref;
+}
+
+# replace relative link with the prefix and suffix given
+sub replace_rel_link
+{
+    my $self = shift (@_);
+    my ($front, $link, $back, $url_prefix, $url_suffix) = @_;
+
+    # only process relative links. Return if absolute link
+    if($link =~ m/^http/) {
+	return "$front$link$back";
+    }
+
+    # remove quotes from link at start and end if necessary
+    if ($link=~/^[\"\']/) {
+	$link=~s/^[\"\']//;
+	$link=~s/[\"\']$//;
+	$front.='"';
+	$back="\"$back";
+    }
+
+    # remove any _httpdocimg_/ that greenstone may have prefixed to the image
+    $link =~ s/^_httpdocimg_(?:\/|\\)//;
+    
+    return "$front$url_prefix$link$url_suffix$back";
+}
+
+
+sub saveas_doctxt
+{
+    my $self = shift (@_);
+    my ($doc_obj,$working_dir) = @_;
+
+    my $section = $doc_obj->get_top_section();
+
+    $self->saveas_doctxt_section($doc_obj,$working_dir,$section);
+
+    $self->saveas_toc($doc_obj,$working_dir);
+}
+
+sub buffer_toc
+{
+    my $self = shift (@_);
+    my ($doc_obj,$working_dir,$section,$depth) = @_;
+    
+    my $section_ptr=$doc_obj->_lookup_section($section);
+    return "" unless defined $section_ptr;
+
+    my $all_text = "";
+
+    my $section_num ="1". $section;
+    my $indent = " " x ($depth*2);
+
+    $all_text .= "$indent<Section id=\"$section_num\">\n";
+
+    # Output all the subsections as separate files
+    foreach my $subsection (@{$section_ptr->{'subsection_order'}})
+    {
+	$all_text 
+	    .= $self->buffer_toc($doc_obj, $working_dir, 
+				 "$section.$subsection",$depth+1);
+    }
+
+    $all_text .= "$indent</Section>\n";
+
+    return $all_text;
+}
+
+
+sub saveas_toc
+{
+    my $self = shift (@_);
+    my ($doc_obj,$working_dir) = @_;
+
+    my $section = $doc_obj->get_top_section();
+    my $section_ptr=$doc_obj->_lookup_section($section);
+    my $num_subsections = scalar(@{$section_ptr->{'subsection_order'}});
+
+    # If num_subsections is 0, then there is no nested TOC
+
+    if ($num_subsections>0) {
+
+	my $doc_txt_file = &util::filename_cat ($working_dir,"doctoc.xml");
+	
+	$self->open_xslt_pipe($doc_txt_file,$self->{'xslt_txt'});
+	
+	my $outhandler; 
+	
+	if (defined $self->{'xslt_writer'}){
+	    $outhandler = $self->{'xslt_writer'};
+	}
+	else{
+	    $outhandler = $self->get_output_handler($doc_txt_file);
+	} 
+	print $outhandler $self->buffer_toc($doc_obj, $working_dir, $section, 0);
+	
+	if (defined $self->{'xslt_writer'}){     
+	    $self->close_xslt_pipe(); 
+	}
+	else{
+	    close($outhandler);
+	} 
+    }
+
+}
+
+
+sub buffer_mets_relsext_xml
+{
+    my $self = shift(@_);
+    my ($doc_obj) = @_;
+
+    my $OID = $doc_obj->get_OID();
+
+    my $fnamespace = $self->{'fedora_namespace'};
+    my $oid_namespace = (defined $fnamespace) ? $fnamespace : "test";
+    my $collection = $ENV{'GSDLCOLLECTION'};
+
+    my $fed_id = "$oid_namespace:$collection-$OID";
+
+    my $all_text = "";
+
+    my $top_section = $doc_obj->get_top_section();
+    my $plugin_type = $doc_obj->get_metadata_element($top_section,"Plugin");
+    
+# Images do not get ingested into Fedora when on Linux if the following is included
+# Needs more investigation, since we'd like a working version of the following
+# in order to get thumbnails working and other stuff.
+#    if ((defined $plugin_type) && ($plugin_type eq "ImagePlugin"))
+#    {
+#
+#	$all_text .= "<mets:amdSec ID=\"RELS-EXT\">\n";
+#	$all_text .= "  <mets:techMD ID=\"RELS-EXT1.0\" STATUS=\"A\">\n";
+#	$all_text .= "    <mets:mdWrap LABEL=\"RELS-EXT - RDF formatted relationship metadata\" MDTYPE=\"OTHER\" MIMETYPE=\"text/xml\">\n";
+#	$all_text .= "      <mets:xmlData>\n";
+#	$all_text .= "        <rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns:fedora-model=\"info:fedora/fedora-system:def/model#\">\n";
+#	$all_text .= "          <rdf:Description rdf:about=\"info:fedora/$fed_id\">\n";
+#	$all_text .= "            <fedora-model:hasContentModel rdf:resource=\"info:fedora/demo:UVA_STD_IMAGE\"/>\n";
+#	$all_text .= "          </rdf:Description>\n";
+#	$all_text .= "        </rdf:RDF>\n";
+#	$all_text .= "      </mets:xmlData>\n";
+#	$all_text .= "    </mets:mdWrap>\n";
+#	$all_text .= "  </mets:techMD>\n";
+#	$all_text .= "</mets:amdSec>\n";
+#    }
+
+    return $all_text;
+}
+
+
+#
+#  Print out docmets.xml file
+#
+sub output_mets_section 
+{
+    my $self = shift(@_);
+    my ($handle, $doc_obj, $section, $working_dir) = @_;
+
+    # print out the dmdSection
+    print $handle $self->buffer_mets_dmdSection_section_xml($doc_obj,$section);
+
+    print $handle $self->buffer_mets_relsext_xml($doc_obj);
+
+    print $handle "<mets:fileSec>\n";
+    print $handle "  <mets:fileGrp ID=\"DATASTREAMS\">\n";
+
+    # Generate Filestream for Table of Contents (TOC)
+    my $section_ptr=$doc_obj->_lookup_section($section);
+    my $num_subsections = scalar(@{$section_ptr->{'subsection_order'}});
+
+    # If num_subsections is 0, then there is no nested TOC
+
+    if ($num_subsections>0) {
+	print $handle $self->buffer_mets_fileSection_toc($doc_obj,$section,$working_dir);
+    }
+
+    # print out the fileSection by sections
+    print $handle $self->buffer_mets_fileSection_section_xml($doc_obj,$section,$working_dir);
+
+    # print out the whole fileSection
+    print $handle $self->buffer_mets_fileWhole_section_xml($doc_obj,$section,$working_dir); 
+
+    print $handle "  </mets:fileGrp>\n";
+    print $handle "</mets:fileSec>\n";
+  
+    # print out the StructMapSection by sections
+
+    my $struct_type = "fedora:dsBindingMap";
+
+    # If document is going to make use of deminators (BMech and BDef) then
+    # need to code up more output XML here (structMap)and in  
+    # METS:behaviorSec (Fedora extension?) sections
+  
+}
+
+sub buffer_mets_amdSec_header
+{
+    my $self = shift(@_);
+    my ($section,$id) = @_;
+
+    # convert section number
+    my $section_num ="1". $section;
+
+    my $all_text = "";
+
+    my $label_attr = "";
+
+    $all_text .= "<mets:amdSec ID=\"$id$section\" >\n";
+    $all_text .= "  <mets:techMD ID=\"$id$section.0\">\n"; # .0 fedora version number?
+    
+    $label_attr = "LABEL=\"Metadata\"";
+
+    $all_text .= "  <mets:mdWrap $label_attr MDTYPE=\"OTHER\" OTHERMDTYPE=\"gsdl3\" ID=\"".$id."gsdl$section_num\">\n";
+    $all_text .= "    <mets:xmlData>\n";
+
+    return $all_text;
+
+}
+
+sub buffer_mets_amdSec_footer
+{
+    my $self = shift(@_);
+
+    my $all_text = "";
+    
+    $all_text .= "    </mets:xmlData>\n";
+    $all_text .= "  </mets:mdWrap>\n";
+    
+    $all_text .= "  </mets:techMD>\n";
+    $all_text .= "</mets:amdSec>\n";
+
+    return $all_text;
+
+}
+
+sub oai_dc_metadata_xml
+{
+    my $self = shift(@_);
+    my ($doc_obj,$section) = @_;
+
+    my $all_text = "";
+
+    my $dc_namespace = "";
+    $dc_namespace .= "xmlns:dc=\"http://purl.org/dc/elements/1.1/\"";
+    $dc_namespace .= " xmlns:oai_dc=\"http://www.openarchives.org/OAI/2.0/oai_dc/\" ";
+    
+    $all_text .= "  <oai_dc:dc $dc_namespace>\n";
+    
+    $all_text .= $self->get_dc_metadata($doc_obj, $section,"oai_dc");
+    $all_text .= "  </oai_dc:dc>\n";
+
+    return $all_text;
+}
+
+
+
+
+
+# Work out the what the metadata set prefixes (dc,dls etc.) are for 
+# this document
+
+sub metadata_set_prefixes
+{
+    my $self = shift(@_);
+    my ($doc_obj, $section) = @_;
+    
+    $section="" unless defined $section;
+    
+    my $section_ptr = $doc_obj->_lookup_section($section);
+    return {} unless defined $section_ptr;
+
+    my $unique_prefix = {};
+
+    foreach my $data (@{$section_ptr->{'metadata'}})
+    {
+	my ($prefix) = ($data->[0]=~ m/^(.*?)\./);
+	
+	if (defined $prefix)
+	{
+	    next if ($prefix eq "dc"); # skip dublin core as handled separately elsewhere
+
+	    $unique_prefix->{$prefix} = 1;
+	}
+	else
+	{
+	    $unique_prefix->{"ex"} = 1;
+	}
+
+    }
+
+    return $unique_prefix;
+}
+
+
+sub mds_metadata_xml 
+{
+    my $self = shift(@_);
+    my ($doc_obj, $section, $mds_prefix, $namespace) = @_;
+    
+    # build up string of metadata with $mds_prefix
+    $section="" unless defined $section;
+    
+    my $section_ptr = $doc_obj->_lookup_section($section);
+    return "" unless defined $section_ptr;
+
+    my $all_text="";
+    $all_text .= "  <$mds_prefix:$mds_prefix $namespace>\n";
+
+
+    foreach my $data (@{$section_ptr->{'metadata'}})
+    {
+	if ($data->[0]=~ m/^(?:(.*?)\.)?(.*)$/) 
+	{
+	    my $curr_mds_prefix = $1;
+	    my $mds_full_element = $2;
+
+	    $curr_mds_prefix = "ex" unless defined $curr_mds_prefix;
+
+	    if ($curr_mds_prefix eq $mds_prefix)
+	    {
+		# split up full element in the form Title^en into element=Title, attr="en"
+		my ($mds_element,$subelem) = ($mds_full_element =~ m/^(.*?)(?:\^(.*))?$/);
+		my $mds_attr = (defined $subelem) ? "qualifier=\"$subelem\"" : "";
+		
+		my $escaped_value = &docprint::escape_text($data->[1]);
+		
+		$all_text .= "   <$mds_prefix:metadata name=\"$mds_element\" $mds_attr>$escaped_value</$mds_prefix:metadata>\n";
+	    }
+	}
+    }
+
+    $all_text .= "  </$mds_prefix:$mds_prefix>\n";
+
+
+    $all_text =~ s/[\x00-\x09\x0B\x0C\x0E-\x1F]//g;
+
+    return $all_text;
+}
+
+
+
+sub buffer_mets_dmdSection_section_xml
+{
+    my $self = shift(@_);
+    my ($doc_obj,$section) = @_;
+   
+    $section="" unless defined $section;
+    
+    my $section_ptr=$doc_obj->_lookup_section($section);
+    return "" unless defined $section_ptr;
+
+    my $all_text = "";
+
+    $all_text .= $self->buffer_mets_amdSec_header($section,"DC");
+    $all_text .= $self->oai_dc_metadata_xml($doc_obj,$section);
+    $all_text .= $self->buffer_mets_amdSec_footer($section);
+
+    # for each metadata set
+    my $md_sets = $self->metadata_set_prefixes($doc_obj,$section);
+
+    foreach my $md_set (keys %$md_sets)
+    {
+	# Greenstone's agnostic approach to metadata sets conflicts with
+	# Fedoras more clinically prescribed one.  Fake a namespace for
+	# each $md_set to keep both sides happy
+
+	my $fake_namespace 
+	    = "xmlns:$md_set=\"http://www.greenstone.org/namespace/fake/$md_set\"";
+	my $id_caps = $md_set;
+	$id_caps =~ tr/[a-z]/[A-Z]/;
+
+	$all_text .= $self->buffer_mets_amdSec_header($section,$id_caps);
+	$all_text .= $self->mds_metadata_xml($doc_obj,$section,$md_set,$fake_namespace);
+	$all_text .= $self->buffer_mets_amdSec_footer($section);
+    }
+
+
+    foreach my $subsection (@{$section_ptr->{'subsection_order'}}){
+       $all_text .= $self->buffer_mets_dmdSection_section_xml($doc_obj,"$section.$subsection");
+    }
+    
+    $all_text =~ s/[\x00-\x09\x0B\x0C\x0E-\x1F]//g;
+
+    return $all_text;
+}
+
+
+sub doctxt_to_xlink
+{
+    my $self = shift @_;
+    my ($fname,$working_dir) = @_;
+
+    my $xlink_href;
+
+    my $fedora_prefix = $ENV{'FEDORA_HOME'};
+    if (!defined $fedora_prefix) {
+	$xlink_href  = "file:$fname";
+    }
+    else
+    {
+	my $collectparent;
+	if (defined $ENV{'GSDL3SRCHOME'}) { # we're dealing with a GS3 server
+	    if(defined $ENV{'GSDL3HOME'}) { # in case the web directory is located in a separate place
+		$collectparent = &util::filename_cat($ENV{'GSDL3HOME'},"sites","localsite");
+	    } 
+	    else { # try the default location for the web directory
+		$collectparent = &util::filename_cat($ENV{'GSDL3SRCHOME'},"web","sites","localsite");
+	    }
+	}
+	else {
+	    # greenstone 2
+	    $collectparent = $ENV{'GSDLHOME'};
+	}
+	
+	my $gsdl_href = &util::filename_cat($working_dir, $fname);
+	$collectparent =~ s/\\/\\\\/g;             # escape reserved metacharacter \ in path (by replacing it with \\) for substitution
+	$gsdl_href =~ s/^$collectparent(\/|\\)?//; # remove the collectparent path in gsdl_href and any trailing slash
+	$gsdl_href =~ s/\\/\//g;                   # make sure we have url paths (which only use / not \)
+	my $localfedora = &util::filename_cat($ENV{'GSDL3SRCHOME'}, "packages", "tomcat", "conf", "Catalina", "localhost", "fedora.xml");
+	
+	my $greenstone_url_prefix = &util::get_greenstone_url_prefix();
+	# prepend url_prefix (which will contain the forward slash upfront)
+	if($ENV{'GSDL3SRCHOME'} && -e $localfedora) {               # Fedora uses Greenstone's tomcat.
+	    $gsdl_href = "$greenstone_url_prefix/sites/localsite/$gsdl_href";     # Default: /greenstone3/sites/localsite/$gsdl_href
+	} else {
+	    $gsdl_href = "$greenstone_url_prefix/$gsdl_href"; 	    # By default: "/greenstone/$gsdl_href";
+	}
+
+	my $fserver = $ENV{'FEDORA_HOSTNAME'};
+	my $fport = $ENV{'FEDORA_SERVER_PORT'};
+	
+	my $fdomain = "http://$fserver:$fport";
+	$xlink_href  = "$fdomain$gsdl_href";
+#ERROR: $xlink_href  = "$fname";
+    }
+
+    return $xlink_href;
+
+}
+
+
+sub buffer_mets_fileSection_toc
+{
+    my $self = shift(@_);
+    my ($doc_obj,$section,$working_dir) = @_;
+
+    my $opt_attr = "OWNERID=\"M\"";
+
+    my $all_text = '  <mets:fileGrp ID="TOC">'. "\n";
+    $all_text .= "    <mets:file MIMETYPE=\"text/xml\" ID=\"FILETOC\" $opt_attr >\n";    
+    my $xlink = $self->doctxt_to_xlink("doctoc.xml",$working_dir);
+
+    $all_text .= '      <mets:FLocat LOCTYPE="URL" xlink:href="'.$xlink.'"';
+
+    $all_text .= ' xlink:title="Table of Contents"/>' . "\n";
+    $all_text .= "    </mets:file>\n";
+    $all_text .= "  </mets:fileGrp>\n";
+
+    return $all_text;
+}
+
+
+sub buffer_mets_fileSection_section_xml
+{
+    my $self = shift(@_);
+    my ($doc_obj,$section,$working_dir) = @_;
+
+    my $is_txt_split = 1;
+    my $opt_owner_id = "OWNERID=\"M\"";
+
+    my $all_text 
+	= $self->SUPER::buffer_mets_fileSection_section_xml($doc_obj,$section,$working_dir,$is_txt_split, $opt_owner_id,"SECTION");
+
+
+    return $all_text;
+}
+
+sub buffer_mets_fileWhole_section_xml
+{
+    my $self = shift(@_);
+    my ($doc_obj,$section,$working_dir) = @_;
+
+    my $section_ptr = $doc_obj-> _lookup_section($section);
+    return "" unless defined $section_ptr;
+    
+    my $all_text="";
+
+    my $fileID=0;
+
+    # Output the fileSection for the whole section
+    #  => get the sourcefile and associative file
+
+    my $id_root = "";
+    my $opt_owner_id = "OWNERID=\"M\"";
+
+
+    foreach my $data (@{$section_ptr->{'metadata'}}){
+       my $escaped_value = &docprint::escape_text($data->[1]);
+
+       if ($data->[0] eq "gsdlassocfile"){
+	   
+	   $escaped_value =~ m/^(.*?):(.*):(.*)$/;
+	   my $assoc_file = $1;
+	   my $mime_type  = $2;
+	   my $assoc_dir  = $3;
+
+	   $id_root = "FG$assoc_file";
+
+	   $id_root =~ s/\//_/g;
+	   $all_text .= "  <mets:fileGrp ID=\"$id_root\">\n";
+	   
+	   # The assoc_file's name may be url-encoded, so the xlink_href in the <mets:FLocat>
+	   # element must be the url to this (possibly url-encoded) filename
+	   my $assocfile_url = &unicode::filename_to_url($assoc_file);
+	   my $assfilePath = ($assoc_dir eq "") ? $assocfile_url : "$assoc_dir/$assocfile_url";
+	   ++$fileID;
+	   
+	   my $mime_attr   = "MIMETYPE=\"$mime_type\"";
+	   my $xlink_title = "xlink:title=\"$assoc_file\"";
+
+	   my $id_attr;
+	   my $xlink_href;
+
+	   $id_attr = "ID=\"F$id_root.0\"";
+
+	   my $fedora_prefix = $ENV{'FEDORA_HOME'};
+	   if (!defined $fedora_prefix) {
+	       $xlink_href  = "xlink:href=\"$assfilePath\"";
+	   }
+	   else
+	   {
+	       my $collectparent;
+	       if (defined $ENV{'GSDL3SRCHOME'}) { # we're dealing with a GS3 server
+		   if(defined $ENV{'GSDL3HOME'}) { # in case the web directory is located in a separate place
+		       $collectparent = &util::filename_cat($ENV{'GSDL3HOME'},"sites","localsite");
+		   } 
+		   else { # try the default location for the web directory
+		       $collectparent = &util::filename_cat($ENV{'GSDL3SRCHOME'},"web","sites","localsite");
+		   }
+	       }	      
+	       else {
+		   # greenstone 2
+		   $collectparent = $ENV{'GSDLHOME'};
+	       }
+
+	       my $gsdl_href = &util::filename_cat($working_dir,$assfilePath);
+	       $collectparent =~ s/\\/\\\\/g;             # escape reserved metacharacter \ in path (by replacing it with \\) for substitution
+	       $gsdl_href =~ s/^$collectparent(\/|\\)?//; # remove the collectparent path in gsdl_href and any trailing slash
+	       $gsdl_href =~ s/\\/\//g;                   # make sure we have url paths (which only use / not \)
+	       my $localfedora = &util::filename_cat($ENV{'GSDL3SRCHOME'}, "packages", "tomcat", "conf", "Catalina", "localhost", "fedora.xml");
+
+	       my $greenstone_url_prefix = &util::get_greenstone_url_prefix();
+	       # prepend url_prefix (which will contain the forward slash upfront)
+	       if($ENV{'GSDL3SRCHOME'} && -e $localfedora) {                 # Fedora uses Greenstone's tomcat. 
+		   $gsdl_href = "$greenstone_url_prefix/sites/localsite/$gsdl_href";    # Default: /greenstone3/sites/localsite/$gsdl_href
+	       } else {
+		   $gsdl_href = "$greenstone_url_prefix/$gsdl_href";         # By default: "/greenstone/$gsdl_href";
+	       }
+
+	       my $fserver = $ENV{'FEDORA_HOSTNAME'};
+	       my $fport = $ENV{'FEDORA_SERVER_PORT'};
+	       
+	       my $fdomain = "http://$fserver:$fport";
+	       $xlink_href = "xlink:href=\"$fdomain$gsdl_href\"";
+#ERROR: $xlink_href = "xlink:href=\"$assfilePath\"";
+	   }
+	   
+	   my $top_section = $doc_obj->get_top_section();
+	   my $id = $doc_obj->get_metadata_element($top_section,"Identifier");
+	   
+###	   print STDERR "**** mime-type: $mime_attr\n";
+
+	   $all_text .= "    <mets:file $mime_attr $id_attr $opt_owner_id >\n";
+	   $all_text .= "      <mets:FLocat LOCTYPE=\"URL\" $xlink_href $xlink_title />\n";
+
+	   $all_text .= "    </mets:file>\n";
+	   
+	   $all_text .= "  </mets:fileGrp>\n";	   
+       }
+   }
+    
+    $all_text =~ s/[\x00-\x09\x0B\x0C\x0E-\x1F]//g;
+    
+    return $all_text;
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugouts/GreenstoneMETSPlugout.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugouts/GreenstoneMETSPlugout.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugouts/GreenstoneMETSPlugout.pm	(revision 24799)
@@ -0,0 +1,263 @@
+###########################################################################
+#
+# GreenstoneMETSPlugout.pm -- the plugout module for METS archives
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2006 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package GreenstoneMETSPlugout;
+
+use strict;
+no strict 'refs';
+
+#eval {require bytes};
+#use util;
+use METSPlugout;
+#use docprint; # for escape_text
+
+sub BEGIN {
+    @GreenstoneMETSPlugout::ISA = ('METSPlugout');
+}
+
+my $arguments = [
+      ];
+
+my $options = { 'name'     => "GreenstoneMETSPlugout",
+		'desc'     => "{GreenstoneMETSPlugout.desc}",
+		'abstract' => "no",
+		'inherits' => "yes", 
+	        'args'     => $arguments
+                };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($plugoutlist, $inputargs,$hashArgOptLists) = @_;
+    push(@$plugoutlist, $class);
+      
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new METSPlugout($plugoutlist,$inputargs,$hashArgOptLists);
+    
+    return bless $self, $class;
+}
+
+
+sub output_mets_xml_header
+{
+    my $self = shift(@_);
+    my ($handle, $OID, $doc_title) = @_;
+
+    my $extra_attr = "OBJID=\"$OID:2\"";
+
+    $self->output_mets_xml_header_extra_attribute($handle,$extra_attr);
+
+}
+
+#
+#  Print out docmets.xml file
+#
+sub output_mets_section 
+{
+    my $self = shift(@_);
+    my ($handle, $doc_obj, $section, $working_dir) = @_;
+
+    # print out the dmdSection
+    print $handle $self->buffer_mets_dmdSection_section_xml($doc_obj,$section);
+
+    print $handle "<mets:fileSec>\n";
+
+    # print out the fileSection by sections
+    print $handle $self->buffer_mets_fileSection_section_xml($doc_obj,$section,$working_dir);
+
+    # print out the whole fileSection
+    print $handle $self->buffer_mets_fileWhole_section_xml($doc_obj,$section,$working_dir); 
+
+    print $handle "</mets:fileSec>\n";
+  
+    # print out the StructMapSection by sections
+
+    my $struct_type = "Section";
+
+
+    # consider making the following its own subroutine
+
+    print $handle "<mets:structMap ID=\"Section\" TYPE=\"$struct_type\" LABEL=\"Section\">\n";
+    my $order_num=0;
+    print $handle $self->buffer_mets_StructMapSection_section_xml($doc_obj,$section, \$order_num);
+    print $handle "</mets:structMap>\n";
+    
+    print $handle '<mets:structMap ID="All" TYPE="Whole Document" LABEL="All">'."\n";
+    print $handle $self->buffer_mets_StructMapWhole_section_xml($doc_obj,$section);
+    print $handle "</mets:structMap>\n";
+
+  
+}
+
+sub buffer_mets_dmdSection_section_xml
+{
+    my $self = shift(@_);
+    my ($doc_obj,$section) = @_;
+   
+    $section="" unless defined $section;
+    
+    my $section_ptr=$doc_obj->_lookup_section($section);
+    return "" unless defined $section_ptr;
+
+    # convert section number
+    my $section_num ="1". $section;
+    my $dmd_num = $section_num;
+
+    my $all_text = "";
+
+    my $label_attr = "";
+    # TODO::
+    #print STDERR "***** Check that GROUPID in dmdSec is valid!!!\n";
+    #print STDERR "***** Check to see if <techMD> required\n";
+    # if it isn't allowed, go back and set $mdTag = dmdSec/amdSec
+
+    $all_text .= "<mets:dmdSec ID=\"DM$dmd_num\" GROUPID=\"$section_num\">\n";
+
+    $all_text .= "  <mets:mdWrap $label_attr MDTYPE=\"OTHER\" OTHERMDTYPE=\"gsdl3\" ID=\"gsdl$section_num\">\n";
+    $all_text .= "    <mets:xmlData>\n";
+
+    foreach my $data (@{$section_ptr->{'metadata'}}){
+	my $escaped_value = &docprint::escape_text($data->[1]);
+	$all_text .= '      <gsdl3:Metadata name="'. $data->[0].'">'. $escaped_value. "</gsdl3:Metadata>\n";
+	if ($data->[0] eq "dc.Title") {
+	    $all_text .= '      <gsdl3:Metadata name="Title">'. $escaped_value."</gsdl3:Metadata>\n";
+	}
+    }
+   
+    $all_text .= "    </mets:xmlData>\n";
+    $all_text .= "  </mets:mdWrap>\n";
+    
+    $all_text .= "</mets:dmdSec>\n";    
+
+
+    foreach my $subsection (@{$section_ptr->{'subsection_order'}}){
+	$all_text .= $self->buffer_mets_dmdSection_section_xml($doc_obj,"$section.$subsection");
+    }
+    
+    $all_text =~ s/[\x00-\x09\x0B\x0C\x0E-\x1F]//g;
+
+    return $all_text;
+}
+
+
+
+sub doctxt_to_xlink
+{
+    my $self = shift @_;
+    my ($fname,$working_dir) = @_;
+
+    my $xlink_href  = "file:$fname";
+
+    return $xlink_href;
+
+}
+
+
+
+sub buffer_mets_fileSection_section_xml
+{
+    my $self = shift(@_);
+    my ($doc_obj,$section,$working_dir,$is_recursive) = @_;
+
+    my $is_txt_split = undef;
+
+    my $all_text 
+	= $self->SUPER::buffer_mets_fileSection_section_xml($doc_obj,$section,$working_dir,$is_txt_split);
+
+    return $all_text;
+}
+
+sub buffer_mets_fileWhole_section_xml
+{
+    my $self = shift(@_);
+    my ($doc_obj,$section,$working_dir) = @_;
+
+    my $section_ptr = $doc_obj-> _lookup_section($section);
+    return "" unless defined $section_ptr;
+    
+    my $all_text="";
+
+    my $fileID=0;
+
+    # Output the fileSection for the whole section
+    #  => get the sourcefile and associative file
+
+    my $id_root = "default";
+    my $opt_owner_id = "";    
+
+    $all_text .= "  <mets:fileGrp ID=\"$id_root\">\n";
+
+
+    foreach my $data (@{$section_ptr->{'metadata'}}){
+       my $escaped_value = &docprint::escape_text($data->[1]);
+
+       if ($data->[0] eq "gsdlsourcefilename") { 
+          my ($dirPath) = $escaped_value =~ m/^(.*)[\/\\][^\/\\]*$/;
+
+          ++$fileID;	  
+          $all_text .= "    <mets:file MIMETYPE=\"text/xml\" ID=\"$id_root.$fileID\" $opt_owner_id >\n";
+        
+	  $all_text .= '      <mets:FLocat LOCTYPE="URL" xlink:href="file:'.$data->[1].'" />'."\n";
+	  
+          $all_text .= "    </mets:file>\n";
+       }
+       
+       if ($data->[0] eq "gsdlassocfile"){
+	   
+	   $escaped_value =~ m/^(.*?):(.*):(.*)$/;
+	   my $assoc_file = $1;
+	   my $mime_type  = $2;
+	   my $assoc_dir  = $3;
+	   
+	   my $assfilePath = ($assoc_dir eq "") ? $assoc_file : "$assoc_dir/$assoc_file";
+	   ++$fileID;
+	   
+	   my $mime_attr   = "MIMETYPE=\"$mime_type\"";
+	   my $xlink_title = "xlink:title=\"$assoc_file\"";
+
+	   my $id_attr;
+	   my $xlink_href;
+
+	   $id_attr = "ID=\"$id_root.$fileID\"";
+	   $xlink_href  = "xlink:href=\"$assfilePath\"";
+
+	   $all_text .= "    <mets:file $mime_attr $id_attr $opt_owner_id >\n";
+	   $all_text .= "      <mets:FLocat LOCTYPE=\"URL\" $xlink_href $xlink_title />\n";
+	   
+	   $all_text .= "    </mets:file>\n";
+	   	   
+       }
+   }
+    
+    $all_text .= "  </mets:fileGrp>\n";
+    
+    $all_text =~ s/[\x00-\x09\x0B\x0C\x0E-\x1F]//g;
+    
+    return $all_text;
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugouts/GreenstoneXMLPlugout.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugouts/GreenstoneXMLPlugout.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugouts/GreenstoneXMLPlugout.pm	(revision 24799)
@@ -0,0 +1,118 @@
+###########################################################################
+#
+# GreenstoneXMLPlugout.pm -- the plugout module for Greenstone Archives
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2006 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package GreenstoneXMLPlugout;
+
+use strict;
+no strict 'refs';
+no strict 'subs';
+
+eval {require bytes};
+use util;
+use BasePlugout;
+use docprint;
+
+sub BEGIN {
+    @GreenstoneXMLPlugout::ISA = ('BasePlugout');
+}
+
+my $arguments = [];
+
+my $options = { 'name'     => "GreenstoneXMLPlugout",
+		'desc'     => "{GreenstoneXMLPlugout.desc}",
+		'abstract' => "no",
+		'inherits' => "yes" };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($plugoutlist, $inputargs,$hashArgOptLists) = @_;
+    push(@$plugoutlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new BasePlugout($plugoutlist,$inputargs,$hashArgOptLists);
+ 
+    return bless $self, $class;
+}
+
+sub saveas {
+    my $self = shift (@_);
+    my ($doc_obj,$doc_dir) = @_;
+
+    my $outhandler;
+    if ($self->{'debug'}) {
+	$outhandler = STDOUT;
+	# can we do the xslt and still do debug mode?
+    } 
+    else {
+	my $output_dir = $self->get_output_dir();
+	&util::mk_all_dir ($output_dir) unless -e $output_dir;
+	
+	my $working_dir = &util::filename_cat ($output_dir, $doc_dir);    
+	&util::mk_all_dir ($working_dir) unless -e $working_dir;
+	
+	$self->process_assoc_files ($doc_obj, $doc_dir, '');
+	
+	$self->process_metafiles_metadata ($doc_obj);
+
+	my $output_file = util::filename_cat ($working_dir, "doc.xml");
+	
+	$self->open_xslt_pipe($output_file, $self->{'xslt_file'});
+	
+	
+	if (defined $self->{'xslt_writer'}){
+	    $outhandler = $self->{'xslt_writer'};
+	}
+	else{
+	    $outhandler = $self->get_output_handler($output_file);
+	}
+    }
+    
+    binmode($outhandler,":utf8");
+
+    $self->output_xml_header($outhandler,"Archive");
+    my $section_output = &docprint::get_section_xml($doc_obj, $doc_obj->get_top_section());
+    print $outhandler $section_output;
+    $self->output_xml_footer($outhandler,"Archive");
+
+    if (!$self->{'debug'}) {
+	if (defined $self->{'xslt_writer'}){     
+	    $self->close_xslt_pipe(); 
+	}
+	else {
+	    close($outhandler);
+	}
+	
+	$self->{'short_doc_file'} = util::filename_cat ($doc_dir, "doc.xml");  
+	
+	$self->store_output_info_reference($doc_obj);
+    }
+}
+
+
+
+1;
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugouts/MARCXMLPlugout.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugouts/MARCXMLPlugout.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugouts/MARCXMLPlugout.pm	(revision 24799)
@@ -0,0 +1,176 @@
+###########################################################################
+#
+# MARCXMLPlugout.pm -- the plugout module for MARC xml recored
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2006 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package MARCXMLPlugout;
+
+use strict;
+no strict 'refs';
+
+eval {require bytes};
+use util;
+use BasePlugout;
+use docprint; # for escape_text
+
+
+sub BEGIN {
+    @MARCXMLPlugout::ISA = ('BasePlugout');
+}
+
+my $arguments = [
+		 { 'name' => "group", 
+		   'desc' => "{MARCXMLPlugout.group}",
+		   'type' => "flag",
+                   'deft' => "0",
+		   'reqd' => "no",    
+		   'hiddengli' => "no"},
+		 { 'name' => "mapping_file", 
+		   'desc' => "{MARCXMLPlugout.mapping_file}",
+		   'type' => "string",
+		   'deft' => "dc2marc-mapping.xml",
+		   'reqd' => "yes",    
+		   'hiddengli' => "no"},
+		 { 'name' => "xslt_file", 
+		   'desc' => "{BasPlugout.xslt_file}",
+		   'type' => "string",
+		   'reqd' => "no",
+		   'deft' => "dc2marc.xsl",
+		   'hiddengli' => "no"}
+
+                ];
+
+my $options = { 'name'     => "MARCXMLPlugout",
+		'desc'     => "{MARCXMLPlugout.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+	        'args'     => $arguments
+                };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($plugoutlist, $inputargs,$hashArgOptLists) = @_;
+    push(@$plugoutlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new BasePlugout($plugoutlist,$inputargs,$hashArgOptLists);
+
+    $self->{'buffered_output'} ="";
+     
+    my $full_path_to_mapping_file = &util::locate_config_file($self->{'mapping_file'});
+    if (! defined $full_path_to_mapping_file) {
+	print STDERR "Can not find $self->{'mapping_file'}, please make sure you have supplied the correct file path\n";
+	die "\n";
+    }
+    $self->{'mapping_file'} = $full_path_to_mapping_file;
+
+   return bless $self, $class;
+}
+
+sub saveas {
+    my $self = shift (@_);
+    my ($doc_obj,$doc_dir) = @_;
+
+   
+    if ($self->{'group'}){
+        $self->{buffered_output} .= $self->get_top_metadata_list($doc_obj)."\n"; 
+        return;
+    }
+    
+    $self->process_metafiles_metadata ($doc_obj);
+
+    my $output_dir = $self->get_output_dir();
+    &util::mk_all_dir ($output_dir) unless -e $output_dir;
+    
+    my $working_dir = &util::filename_cat ($output_dir, $doc_dir);    
+    &util::mk_all_dir ($working_dir) unless -e $working_dir;
+
+    my $output_file = util::filename_cat ($working_dir, "marc.xml");
+ 
+    $self->open_xslt_pipe($output_file,$self->{'xslt_file'});
+
+    my $outhandler = $self->{'xslt_writer'}; 
+
+    $self->output_xml_header($outhandler, "MARCXML", 1);
+    print $outhandler $self->get_top_metadata_list($doc_obj);
+    $self->output_xml_footer($outhandler,"MARCXML");  
+    $self->close_xslt_pipe(); 
+
+    $self->{'short_doc_file'} = util::filename_cat ($doc_dir, "marc.xml");  
+
+    $self->store_output_info_reference($doc_obj);              
+}
+
+# returns a xml element of the form <MetadataList><Metadata name="metadata-name">metadata_value</Metadata>...</MetadataList>
+
+sub get_top_metadata_list {
+
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+    
+    my @topmetadata =$doc_obj->get_all_metadata($doc_obj->get_top_section());
+    my $metadatalist ='<MetadataList>';
+    
+    foreach my $i (@topmetadata){
+	foreach my $j (@$i){	
+	    my %metaMap = @$j;
+	    foreach my $key (keys %metaMap){
+		$metadatalist .='<Metadata name='."\"$key\"".'>'.&docprint::escape_text($metaMap{$key}).'</Metadata>'."\n";
+	    }        
+	}    
+    }
+    
+    $metadatalist .='</MetadataList>';   
+    return $metadatalist;
+}
+
+
+sub close_group_output{
+    my $self = shift (@_);
+    
+    return unless $self->{'group'} and  $self->{buffered_output};
+
+    my $output_dir = $self->get_output_dir();
+    &util::mk_all_dir ($output_dir) unless -e $output_dir;
+
+    my $output_file = util::filename_cat($output_dir, "marc.xml");
+ 
+    $self->open_xslt_pipe($output_file,$self->{'xslt_file'});
+
+    my $outhandler = $self->{'xslt_writer'}; 
+
+    $self->output_xml_header($outhandler, "MARCXML", 1);
+    print $outhandler $self->{buffered_output};
+    $self->output_xml_footer($outhandler,"MARCXML");  
+    $self->close_xslt_pipe();    
+}
+
+
+sub is_group{
+     my $self = shift (@_);
+     return $self->{'group'}; 
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugouts/METSPlugout.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugouts/METSPlugout.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/plugouts/METSPlugout.pm	(revision 24799)
@@ -0,0 +1,438 @@
+###########################################################################
+#
+# METSPlugout.pm -- the plugout module for METS archives
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2006 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package METSPlugout;
+
+use strict;
+no strict 'subs';
+no strict 'refs';
+
+use gsprintf 'gsprintf';
+
+eval {require bytes};
+use util;
+use BasePlugout;
+use docprint; # for escape_text
+
+sub BEGIN {
+    @METSPlugout::ISA = ('BasePlugout');
+}
+
+my $arguments = [
+      { 'name' => "xslt_txt", 
+	'desc' => "{METSPlugout.xslt_txt}",
+	'type' => "string",
+	'reqd' => "no",    
+	'hiddengli' => "no"},
+      { 'name' => "xslt_mets", 
+	'desc' => "{METSPlugout.xslt_mets}",
+	'type' => "string",
+	'reqd' => "no",    
+	'hiddengli' => "no"}
+      ];
+
+my $options = { 'name'     => "METSPlugout",
+		'desc'     => "{METSPlugout.desc}",
+		'abstract' => "yes",
+		'inherits' => "yes", 
+	        'args'     => $arguments
+                };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($plugoutlist, $inputargs,$hashArgOptLists) = @_;
+    push(@$plugoutlist, $class);
+
+      
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new BasePlugout($plugoutlist,$inputargs,$hashArgOptLists);
+    return bless $self, $class;
+}
+
+
+sub saveas_doctxt
+{
+    my $self = shift (@_);
+    my ($doc_obj,$working_dir) = @_;
+
+    my $is_recursive = 1;
+
+    my $doc_txt_file = &util::filename_cat ($working_dir,"doctxt.xml");	
+	
+    $self->open_xslt_pipe($doc_txt_file,$self->{'xslt_txt'});
+
+    my $outhandler; 
+
+    if (defined $self->{'xslt_writer'}){
+	$outhandler = $self->{'xslt_writer'};
+    }
+    else{
+	$outhandler = $self->get_output_handler($doc_txt_file);
+    } 
+
+    binmode($outhandler,":utf8");
+
+    $self->output_xml_header($outhandler);
+    my $section = $doc_obj->get_top_section();
+    $self->output_txt_section($outhandler,$doc_obj, $section, $is_recursive);
+    $self->output_xml_footer($outhandler);
+    
+
+    if (defined $self->{'xslt_writer'}){     
+	$self->close_xslt_pipe(); 
+    }
+    else{
+	close($outhandler);
+    }
+
+}
+
+sub saveas_docmets
+{
+    my $self = shift (@_);
+    my ($doc_obj,$working_dir) = @_;
+
+    my $doc_mets_file = &util::filename_cat ($working_dir, "docmets.xml");
+    
+    my $doc_title = $doc_obj->get_metadata_element($doc_obj->get_top_section(),"dc.Title");
+    if (!defined $doc_title) {
+	$doc_title = $doc_obj->get_metadata_element($doc_obj->get_top_section(),"Title");
+    }
+ 
+    $self->open_xslt_pipe($doc_mets_file,$self->{'xslt_mets'});
+
+    my $outhandler; 
+
+    if (defined $self->{'xslt_writer'}){
+       $outhandler = $self->{'xslt_writer'};
+    }
+    else{
+       $outhandler = $self->get_output_handler($doc_mets_file);
+     }   
+       
+    binmode($outhandler,":utf8");
+
+    $self->output_mets_xml_header($outhandler, $doc_obj->get_OID(), $doc_title);
+    $self->output_mets_section($outhandler, $doc_obj, $doc_obj->get_top_section(),$working_dir);
+    $self->output_mets_xml_footer($outhandler);
+	
+     if (defined $self->{'xslt_writer'}){     
+	$self->close_xslt_pipe(); 
+    }
+    else{
+	close($outhandler);
+    }
+    
+
+}
+
+sub saveas 
+{
+    my $self = shift (@_);
+    my ($doc_obj,$doc_dir) = @_;
+
+    $self->process_assoc_files ($doc_obj, $doc_dir, '');
+
+    $self->process_metafiles_metadata ($doc_obj);
+
+    my $output_dir = $self->get_output_dir();
+    &util::mk_all_dir ($output_dir) unless -e $output_dir;
+ 
+    my $working_dir = &util::filename_cat ($output_dir, $doc_dir);              
+   
+    &util::mk_all_dir ($working_dir) unless -e $working_dir;
+
+    ###
+    # Save the text as a filefile
+    ###
+    $self->saveas_doctxt($doc_obj,$working_dir);
+
+    ###
+    # Save the structure and metadata as a METS file
+    ###
+    $self->saveas_docmets($doc_obj,$working_dir);
+
+    $self->{'short_doc_file'} =  &util::filename_cat ($doc_dir, "docmets.xml");
+  
+    $self->store_output_info_reference($doc_obj);  
+
+}
+
+
+sub output_mets_xml_header
+{
+    my $self = shift(@_);
+    my ($handle, $OID, $doc_title) = @_;
+
+    gsprintf(STDERR, "METSPlugout::output_mets_xml_header {common.must_be_implemented}\n") && die "\n";
+}
+
+sub output_mets_xml_header_extra_attribute
+{
+    my $self = shift(@_);
+    my ($handle, $extra_attr, $extra_schema) = @_;
+
+    print $handle '<?xml version="1.0" encoding="UTF-8" standalone="no"?>' . "\n";
+    print $handle '<mets:mets xmlns:mets="http://www.loc.gov/METS/"' . "\n";
+    print $handle '           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' . "\n";
+    print $handle '           xmlns:gsdl3="http://www.greenstone.org/namespace/gsdlmetadata/1.0/"' . "\n";
+    if (defined ($ENV{'FEDORA_VERSION'}) &&  $ENV{'FEDORA_VERSION'} =~ m/^2/) { # checking if major version is 2
+    	print $handle '           xmlns:xlink="http://www.w3.org/TR/xlink"' ."\n";
+    }
+    else {
+	print $handle '           xmlns:xlink="http://www.w3.org/1999/xlink"' ."\n";
+    }
+    print $handle '           xsi:schemaLocation="http://www.loc.gov/METS/' . "\n";
+    print $handle '           http://www.loc.gov/standards/mets/mets.xsd' . "\n";
+    print $handle " $extra_schema\n" if (defined $extra_schema);
+    print $handle '           http://www.greenstone.org/namespace/gsdlmetadata/1.0/' . "\n";
+    print $handle '           http://www.greenstone.org/namespace/gsdlmetadata/1.0/gsdl_metadata.xsd"' . "\n";
+
+    print $handle "  $extra_attr>\n";
+
+}
+
+sub output_mets_xml_footer 
+{
+    my $self = shift(@_);
+    my ($handle) = @_;
+    print $handle '</mets:mets>' . "\n";
+}
+
+#  print out doctxt.xml file
+sub output_txt_section {
+    my $self = shift (@_);
+    my ($handle, $doc_obj, $section, $is_recursive) = @_;
+
+    print $handle $self->buffer_txt_section_xml($doc_obj, $section, $is_recursive);
+}
+
+sub buffer_txt_section_xml {
+    my $self = shift(@_);
+    my ($doc_obj, $section, $is_recursive) = @_;
+ 
+    my $section_ptr = $doc_obj->_lookup_section ($section);
+    
+    return "" unless defined $section_ptr;
+   
+    my $all_text = "<Section>\n";
+    $all_text .= &docprint::escape_text("$section_ptr->{'text'}");
+   
+    if (defined $is_recursive && $is_recursive)
+    {
+	# Output all the subsections
+	foreach my $subsection (@{$section_ptr->{'subsection_order'}}){
+	    $all_text .= $self->buffer_txt_section_xml($doc_obj, "$section.$subsection", $is_recursive);
+	}
+    }
+
+     $all_text .= "</Section>\n";
+
+     
+     $all_text =~ s/[\x00-\x09\x0B\x0C\x0E-\x1F]//g;
+     return $all_text;
+}
+
+#
+#  Print out docmets.xml file
+#
+sub output_mets_section 
+{
+    my $self = shift(@_);
+    my ($handle, $doc_obj, $section, $working_dir) = @_;
+
+    gsprintf(STDERR, "METSPlugout::output_mets_section {common.must_be_implemented}\n") && die "\n";
+
+}
+
+
+sub buffer_mets_dmdSection_section_xml
+{
+    my $self = shift(@_);
+    my ($doc_obj,$section) = @_;
+
+    gsprintf(STDERR, "METSPlugout::buffer_mets_dmdSection_section_xml {common.must_be_implemented}\n") && die "\n";
+}
+
+sub buffer_mets_StructMapSection_section_xml
+{
+    my $self = shift(@_);
+    my ($doc_obj,$section, $order_numref, $fileid_base) = @_;
+
+    $section="" unless defined $section;
+    
+    
+    my $section_ptr=$doc_obj->_lookup_section($section);
+    return "" unless defined $section_ptr;
+
+    $fileid_base = "FILEGROUP_PRELUDE" unless defined $fileid_base;
+
+    # output fileSection by Sections
+    my $section_num ="1". $section;
+    my $dmd_num = $section_num;
+
+    #**output the StructMap details
+ 
+    my $dmdid_attr = "DM$dmd_num";
+
+    my $all_text = "  <mets:div ID=\"DS$section_num\" TYPE=\"Section\" \n";
+    $all_text .= '      ORDER="'.$$order_numref++.'" ORDERLABEL="'. $section_num .'" '."\n";
+    $all_text .= "      LABEL=\"$section_num\" DMDID=\"$dmdid_attr\">\n";
+   
+    $all_text .= '    <mets:fptr FILEID="'.$fileid_base.$section_num.'" />'. "\n";
+
+
+    foreach my $subsection (@{$section_ptr->{'subsection_order'}}){
+       $all_text .= $self->buffer_mets_StructMapSection_section_xml($doc_obj,"$section.$subsection", $order_numref, $fileid_base);
+    }
+    
+    $all_text .= "  </mets:div>\n";
+
+    $all_text =~ s/[\x00-\x09\x0B\x0C\x0E-\x1F]//g;
+
+    return $all_text;
+}
+
+
+sub buffer_mets_StructMapWhole_section_xml
+{
+    my $self = shift(@_);
+    my ($doc_obj,$section) = @_;
+    
+    my $section_ptr = $doc_obj->_lookup_section($section);
+    return "" unless defined $section_ptr;
+    
+    my $all_text="";
+    my $fileID=0;
+    my $order_num = 0;
+
+    $all_text .= '  <mets:div ID="DSAll" TYPE="Document" ORDER="'.$order_num.'" ORDERLABEL="All" LABEL="Whole Documemt" DMDID="DM1">' . "\n";
+  
+    #** output the StructMapSection for the whole section
+    #  get the sourcefile and associative file
+
+    foreach my $data (@{$section_ptr->{'metadata'}}){
+       my $escaped_value = &docprint::escape_text($data->[1]);
+   
+       if ($data->[0] eq "gsdlsourcefilename") { 
+          ++$fileID;
+	  $all_text .= '    <mets:fptr FILEID="default.'.$fileID.'" />'."\n";
+       }
+       
+       if ($data->[0] eq "gsdlassocfile"){
+          ++$fileID;
+	  $all_text .= '    <mets:fptr FILEID="default.'.$fileID. '" />'. "\n";
+       }
+    }
+    $all_text .= "  </mets:div>\n";
+    
+    $all_text =~ s/[\x00-\x09\x0B\x0C\x0E-\x1F]//g;
+    
+    return $all_text;
+}
+
+
+
+sub doctxt_to_xlink
+{
+    my $self = shift @_;
+    my ($fname,$working_dir) = @_;
+
+    gsprintf(STDERR, "METSPlugout::doxtxt_to_xlink {common.must_be_implemented}\n") && die "\n";
+}
+
+sub buffer_mets_fileSection_section_xml
+{
+    my $self = shift(@_);
+    my ($doc_obj,$section,$working_dir, $is_txt_split,$opt_attr,$fileid_base) = @_;
+
+    #$section="" unless defined $section;
+    
+    my $section_ptr=$doc_obj->_lookup_section($section);
+    return "" unless defined $section_ptr;
+ 
+    $fileid_base = "FILEGROUP_PRELUDE" unless defined $fileid_base;
+
+    # output fileSection by sections
+    my $section_num ="1". $section;
+ 
+    $opt_attr = "" unless defined $opt_attr;
+     
+    # output the fileSection details
+    my $all_text = '  <mets:fileGrp ID="'.$fileid_base.$section_num . '">'. "\n";
+    $all_text .= "    <mets:file MIMETYPE=\"text/xml\" ID=\"FILE$section_num\" $opt_attr >\n";
+
+    my $xlink;
+    if (defined $is_txt_split && $is_txt_split)
+    {
+	my $section_fnum ="1". $section;
+	$section_fnum =~ s/\./_/g;
+
+    	$xlink = $self->doctxt_to_xlink("doctxt$section_fnum.xml",$working_dir);
+    }
+    else
+    {
+	$xlink = $self->doctxt_to_xlink("doctxt.xml",$working_dir);
+
+	$xlink .= '#xpointer(/Section[';
+    
+	my $xpath = "1".$section;
+	$xpath =~ s/\./\]\/Section\[/g;
+	
+	$xlink .=  $xpath;
+	
+	$xlink .= ']/text())';
+    }
+
+
+
+    $all_text .= '      <mets:FLocat LOCTYPE="URL" xlink:href="'.$xlink.'"';
+
+    $all_text .= ' xlink:title="Hierarchical Document Structure"/>' . "\n";
+    $all_text .= "    </mets:file>\n";
+    $all_text .= "  </mets:fileGrp>\n";
+
+
+    foreach my $subsection (@{$section_ptr->{'subsection_order'}}){
+	$all_text .= $self->buffer_mets_fileSection_section_xml($doc_obj,"$section.$subsection",$working_dir, $is_txt_split, $opt_attr, $fileid_base);
+    }
+    
+    $all_text =~ s/[\x00-\x09\x0B\x0C\x0E-\x1F]//g;
+
+    return $all_text;
+}
+
+sub buffer_mets_fileWhole_section_xml
+{
+    my $self = shift(@_);
+    my ($doc_obj,$section,$working_dir) = @_;
+
+    gsprintf(STDERR, "METSPlugout::buffer_mets_fileWhole_section_xml {common.must_be_implemented}\n") && die "\n";
+
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/printusage.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/printusage.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/printusage.pm	(revision 24799)
@@ -0,0 +1,357 @@
+###########################################################################
+#
+# printusage.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+
+package PrintUsage;
+
+
+use gsprintf;
+use strict;
+no strict 'subs'; # allow barewords (eg STDERR) as function arguments
+
+
+sub gsprintf
+{
+    return &gsprintf::gsprintf(@_);
+}
+
+# this is not called by plugins or classifiers, just by scripts
+sub print_xml_usage
+{
+    my $options = shift(@_);
+
+    # XML output is always in UTF-8
+    &gsprintf::output_strings_in_UTF8;
+
+    &print_xml_header("script");
+
+    &gsprintf(STDERR, "<Info>\n");
+    &gsprintf(STDERR, "  <Name>$options->{'name'}</Name>\n");
+    &gsprintf(STDERR, "  <Desc>$options->{'desc'}</Desc>\n");
+    &gsprintf(STDERR, "  <Arguments>\n");
+    if (defined($options->{'args'})) {
+	&print_options_xml($options->{'args'});
+    }
+    &gsprintf(STDERR, "  </Arguments>\n");
+    &gsprintf(STDERR, "</Info>\n");
+}
+
+
+sub print_xml_header
+{
+    &gsprintf(STDERR, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
+}
+
+
+sub print_options_xml
+{
+    my $options = shift(@_);
+
+    foreach my $option (@$options) {
+	next if defined($option->{'internal'});
+	
+	my $optionname = $option->{'name'};
+	my $displayname = $option->{'disp'};
+	
+	my $optiondesc = &gsprintf::lookup_string($option->{'desc'});
+
+	# Escape '<' and '>' characters
+	$optiondesc =~ s/</&amp;lt;/g; # doubly escaped
+	$optiondesc =~ s/>/&amp;gt;/g;
+
+	# Display option name, description and type
+	&gsprintf(STDERR, "    <Option>\n");
+	&gsprintf(STDERR, "      <Name>$optionname</Name>\n");
+	if (defined($option->{'disp'})) {
+	    my $displayname = &gsprintf::lookup_string($option->{'disp'});
+	    # Escape '<' and '>' characters
+	    $displayname =~ s/</&amp;lt;/g; # doubly escaped
+	    $displayname =~ s/>/&amp;gt;/g;
+	    &gsprintf(STDERR, "      <DisplayName>$displayname</DisplayName>\n");
+	}
+	&gsprintf(STDERR, "      <Desc>$optiondesc</Desc>\n");
+	&gsprintf(STDERR, "      <Type>$option->{'type'}</Type>\n");
+
+	# If the option has a required field, display this
+	if (defined($option->{'reqd'})) {
+	    &gsprintf(STDERR, "      <Required>$option->{'reqd'}</Required>\n");
+	}
+
+	# If the option has a charactor length field, display this
+	if (defined($option->{'char_length'})) {
+	    &gsprintf(STDERR, "      <CharactorLength>$option->{'char_length'}</CharactorLength>\n");
+	}
+
+	# If the option has a range field, display this
+	if (defined($option->{'range'})) {
+	    &gsprintf(STDERR, "      <Range>$option->{'range'}</Range>\n");
+	}
+
+	# If the option has a list of possible values, display these
+	if (defined $option->{'list'}) {
+	    &gsprintf(STDERR, "      <List>\n");
+	    my $optionvalueslist = $option->{'list'};
+	    foreach my $optionvalue (@$optionvalueslist) {
+		&gsprintf(STDERR, "        <Value>\n");
+		&gsprintf(STDERR, "          <Name>$optionvalue->{'name'}</Name>\n");
+		if (defined $optionvalue->{'desc'}) {
+		    my $optionvaluedesc = &gsprintf::lookup_string($optionvalue->{'desc'});
+
+		    # Escape '<' and '>' characters
+		    $optionvaluedesc =~ s/</&amp;lt;/g; #doubly escaped
+		    $optionvaluedesc =~ s/>/&amp;gt;/g;
+
+		    &gsprintf(STDERR, "          <Desc>$optionvaluedesc</Desc>\n");
+		}
+		&gsprintf(STDERR, "        </Value>\n");
+	    }
+
+#	    # Special case for 'input_encoding'
+#	    if ($optionname =~ m/^input_encoding$/i) {
+#		my $e = $encodings::encodings;
+#		foreach my $enc (sort {$e->{$a}->{'name'} cmp $e->{$b}->{'name'}} keys (%$e)) {
+#		    &gsprintf(STDERR, "        <Value>\n");
+#		    &gsprintf(STDERR, "          <Name>$enc</Name>\n");
+#		    &gsprintf(STDERR, "          <Desc>$e->{$enc}->{'name'}</Desc>\n");
+#		    &gsprintf(STDERR, "        </Value>\n");
+#		}
+#	    }
+
+	    &gsprintf(STDERR, "      </List>\n");
+	}
+
+	# Show the default value for the option, if there is one
+	if (defined $option->{'deft'}) {
+	    my $optiondeftvalue = $option->{'deft'};
+
+	    # Escape '<' and '>' characters
+	    $optiondeftvalue =~ s/</&lt;/g;
+	    $optiondeftvalue =~ s/>/&gt;/g;
+
+	    &gsprintf(STDERR, "      <Default>$optiondeftvalue</Default>\n");
+	}
+
+	# If the option is noted as being hidden in GLI, add that to the printout
+	if (defined($option->{'hiddengli'})) {
+	    &gsprintf(STDERR, "      <HiddenGLI>$option->{'hiddengli'}</HiddenGLI>\n");
+	}
+	# If the argument is not hidden then print out the lowest detail mode it is visible in
+	if (defined($option->{'modegli'})) {
+	    &gsprintf(STDERR, "      <ModeGLI>$option->{'modegli'}</ModeGLI>\n");
+	}
+
+	&gsprintf(STDERR, "    </Option>\n");
+    }
+}
+
+
+sub print_txt_usage
+{
+    my $options = shift(@_);
+    my $params = shift(@_);
+
+    # this causes us to automatically send output to a pager, if one is
+    # set, AND our output is going to a terminal
+    # active state perl on windows doesn't do open(handle, "-|");
+    if ($ENV{'GSDLOS'} !~ /windows/ && -t STDOUT) {
+        my $pager = $ENV{"PAGER"};
+	if (! $pager) {$pager="(less || more)"}
+	my $pid = open(STDIN, "-|"); # this does a fork... see man perlipc(1)
+	if (!defined $pid) {
+	    gsprintf(STDERR, "pluginfo.pl - can't fork: $!");
+	} else {
+	    if ($pid != 0) { # parent (ie forking) process. child gets 0
+		exec ($pager);
+	    }
+	}
+	open(STDERR,">&STDOUT"); # so it's easier to pipe output
+    }
+
+
+
+    my $programname = $options->{'name'};
+    my $programargs = $options->{'args'};
+    my $programdesc = $options->{'desc'};
+
+    # Find the length of the longest option string
+    my $descoffset = 0;
+    if (defined($programargs)) {
+	$descoffset = &find_longest_option_string($programargs);
+    }
+
+    # Produce the usage information using the data structure above
+    if (defined($programdesc)) {
+	&gsprintf(STDERR, $programname . ": $options->{'desc'}\n\n");
+    }
+
+    &gsprintf(STDERR, " {common.usage}: $programname $params\n\n");
+
+    # Display the program options, if there are some
+    if (defined($programargs)) {
+	# Calculate the column offset of the option descriptions
+	my $optiondescoffset = $descoffset + 2;  # 2 spaces between options & descriptions
+
+	&gsprintf(STDERR, " {common.options}:\n");
+
+	# Display the program options
+	&print_options_txt($programargs, $optiondescoffset);
+    }
+}
+
+
+sub print_options_txt
+{
+    my $options = shift(@_);
+    my $optiondescoffset = shift(@_);
+
+    foreach my $option (@$options) {
+	next if defined($option->{'internal'});
+
+	# Display option name
+	my $optionname = $option->{'name'};
+	&gsprintf(STDERR, "  -$optionname");
+	my $optionstringlength = length("  -$optionname");
+
+	# Display option type, if the option is not a flag
+	my $optiontype = $option->{'type'};
+	if ($optiontype ne "flag") {
+	    &gsprintf(STDERR, " <$optiontype>");
+	    $optionstringlength = $optionstringlength + length(" <$optiontype>");
+	}
+
+	# Display the option description	
+	if (defined($option->{'disp'})) {
+	    my $optiondisp = &gsprintf::lookup_string($option->{'disp'});
+	    &display_text_in_column($optiondisp, $optiondescoffset, $optionstringlength, 80);
+	    &gsprintf(STDERR, " " x $optionstringlength);
+	}
+	my $optiondesc = &gsprintf::lookup_string($option->{'desc'});
+	my $optionreqd = $option->{'reqd'};
+	if (defined($optionreqd) && $optionreqd eq "yes") {
+	    $optiondesc = "(" . &gsprintf::lookup_string("{PrintUsage.required}") . ") " . $optiondesc;
+	}
+	&display_text_in_column($optiondesc, $optiondescoffset, $optionstringlength, 80);
+
+	# Show the default value for the option, if there is one
+	my $optiondefault = $option->{'deft'};
+	if (defined($optiondefault)) {
+	    &gsprintf(STDERR, " " x $optiondescoffset);
+	    &gsprintf(STDERR, "{PrintUsage.default}: $optiondefault\n");
+	}
+
+	# If the option has a list of possible values, display these
+	my $optionvalueslist = $option->{'list'};
+	if (defined($optionvalueslist)) {
+	    &gsprintf(STDERR, "\n");
+	    foreach my $optionvalue (@$optionvalueslist) {
+		my $optionvaluename = $optionvalue->{'name'};
+		&gsprintf(STDERR, " " x $optiondescoffset);
+		&gsprintf(STDERR, "$optionvaluename:");
+
+		my $optionvaluedesc = &gsprintf::lookup_string($optionvalue->{'desc'});
+		&display_text_in_column($optionvaluedesc, $optiondescoffset + 2,
+					$optiondescoffset + length($optionvaluename), 80);
+	    }
+	}
+
+#	# Special case for 'input_encoding'
+#	if ($optionname =~ m/^input_encoding$/i) {
+#	    my $e = $encodings::encodings;
+#	    foreach my $enc (sort {$e->{$a}->{'name'} cmp $e->{$b}->{'name'}} keys (%$e)) {
+#		&gsprintf(STDERR, " " x $optiondescoffset);
+#		&gsprintf(STDERR, "$enc:");
+#
+#		my $encodingdesc = $e->{$enc}->{'name'};
+#		&display_text_in_column($encodingdesc, $optiondescoffset + 2,
+#					$optiondescoffset + length("$enc:"), 80);
+#	    }
+#	}
+
+	# Add a blank line to separate options
+	&gsprintf(STDERR, "\n");
+    }
+}
+
+
+sub display_text_in_column
+{
+    my ($text, $columnbeg, $firstlineoffset, $columnend) = @_;
+
+    # Spaces are put *before* words, so treat the column beginning as 1 smaller than it is
+    $columnbeg = $columnbeg - 1;
+
+    # Add some padding (if needed) for the first line
+    my $linelength = $columnbeg;
+    if ($firstlineoffset < $columnbeg) {
+	&gsprintf(STDERR, " " x ($columnbeg - $firstlineoffset));
+    }
+    else {
+	$linelength = $firstlineoffset;
+    }
+
+    # Break the text into words, and display one at a time
+    my @words = split(/ /, $text);
+
+    foreach my $word (@words) {
+	# If printing this word would exceed the column end, start a new line
+	if (($linelength + length($word)) >= $columnend) {
+	    &gsprintf(STDERR, "\n");
+	    &gsprintf(STDERR, " " x $columnbeg);
+	    $linelength = $columnbeg;
+	}
+
+	# Write the word
+	&gsprintf(STDERR, " $word");
+	$linelength = $linelength + length(" $word");
+    }
+
+    &gsprintf(STDERR, "\n");
+}
+
+
+sub find_longest_option_string
+{
+    my $options = shift(@_);
+
+    my $maxlength = 0;
+    foreach my $option (@$options) {
+	my $optionname = $option->{'name'};
+	my $optiontype = $option->{'type'};
+
+	my $optionlength = length("  -$optionname");
+	if ($optiontype ne "flag") {
+	    $optionlength = $optionlength + length(" <$optiontype>");
+	}
+
+	# Remember the longest
+	if ($optionlength > $maxlength) {
+	    $maxlength = $optionlength;
+	}
+    }
+    return $maxlength;
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/rm/Header/PurePerl.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/rm/Header/PurePerl.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/rm/Header/PurePerl.pm	(revision 24799)
@@ -0,0 +1,255 @@
+###########################################################################
+#
+# Code by Xin Gao based on the Ogg::Vorbis::Header::PurePerl module by
+#   Andrew Molloy (GNU General Public Licensed)
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2005 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package rm::Header::PurePerl;
+
+use 5.005;
+use strict;
+use warnings;
+
+use Fcntl qw/SEEK_END/;
+
+our $VERSION = '0.07';
+
+sub new 
+{
+    my $class = shift;
+    my $file = shift;
+
+    return load($class, $file);
+}
+
+sub load 
+{
+    my $class    = shift;
+    my $file     = shift;
+    my $from_new = shift;
+    my %data;
+    my $self;
+
+    # there must be a better way...
+    if ($class eq 'rm::Header::PurePerl')
+    {
+	$self = bless \%data, $class;
+    }
+    else
+    {
+	$self = $class;
+    }
+
+    if ($self->{'FILE_LOADED'})
+    {
+	return $self;
+    }
+
+    $self->{'FILE_LOADED'} = 1;
+
+    # check that the file exists and is readable
+    unless ( -e $file && -r _ )
+    {
+	warn "File does not exist or cannot be read.";
+	# file does not exist, can't do anything
+	return undef;
+    }
+    # open up the file
+    open FILE, $file;
+    # make sure dos-type systems can handle it...
+    binmode FILE;
+
+    $data{'filename'} = $file;
+    $data{'fileHandle'} = \*FILE;
+
+    _loadInfo(\%data);
+
+    close FILE;
+
+    return $self;
+}
+
+sub info 
+{
+    my $self = shift;
+    my $key = shift;
+
+    # if the user did not supply a key, return the entire hash
+    unless ($key)
+    {
+	return $self->{'INFO'};
+    }
+
+    # otherwise, return the value for the given key
+    return $self->{'INFO'}{lc $key};
+}
+
+sub _loadInfo
+{
+    my $data = shift;
+    my $start = 0;
+    my $fh = $data->{'fileHandle'};
+    my $buffer;
+    my $byteCount = $start;
+    my %info;
+    
+    # check that the first four bytes are '.RMF'
+    read($fh, $buffer, 4);
+    if ($buffer ne '.RMF')
+    {
+	warn "No RMF header?";
+	return undef;
+    }
+
+$buffer='';
+my $char;
+
+#find the header
+my $bytes = "DATA";
+my @byteList = split //, $bytes;
+my $numBytes = @byteList;
+my $i;
+
+LINE:   while (1){
+  INNER:  for ($i = 0; $i < $numBytes; $i ++)
+    {
+  unless ( read($fh, $char, 1) ) {last LINE ;}
+	# Find out all of char
+	$buffer= $buffer.$char;  
+
+if (ord($char) !=  ord($byteList[$i]) ) 
+{last  INNER ;}
+    }
+if ($i == $numBytes) {last LINE ;} #jump out the while loop
+        }
+
+#find the tail
+ $bytes = "INDX";
+ @byteList = split //, $bytes;
+ $numBytes = @byteList;
+
+my $isrecord=0;
+LINE:  while (read($fh, $char, 1)){
+   if ($isrecord) {
+	# Find out all of char
+	$buffer= $buffer.$char;  
+   }else
+        {
+         INNER:  for ($i = 0; $i < $numBytes; $i ++)
+                     {
+                      if (ord($char) !=  ord($byteList[$i]) ) {last  INNER ;}
+                      unless ( read($fh, $char, 1) ) {last LINE ;}
+                     }
+if ($i == $numBytes) {$isrecord = 1;} #start record
+        }
+       }
+
+my @cliptype = (
+
+#add clip type here
+"Comments",
+"Keywords",
+"Category",
+"MimeType",# title
+"Lyrics",
+"Artist",
+"CD Track #",
+"Album",
+"Extension",
+"Genre",
+"Statistics",
+"PROP",
+"MDPR",
+"Target Audiences",
+"Audio Format",
+"Creation Date",
+"Modification Date",
+"Generated By",
+"Abstract",
+"Content Rating",
+"File ID",
+"CONT",
+"Audio Stream",
+"Video Stream",
+"Title"
+);
+
+for my $j ( 1 .. scalar(@cliptype) ) {
+$info{$cliptype[$j - 1]} = _loadInfor($buffer,$cliptype[$j - 1]);
+}
+
+    $data->{'INFO'} = \%info;
+}
+
+#search for the element name and value
+sub _loadInfor
+{my $data = shift;
+my $item = shift;
+
+my @byteList = split //, $data;
+my $startbyte = 0;
+
+
+my $isrecord;
+my $data2 = "";
+my $char;
+my $item2 = "";
+if ( $item eq "Title") {$item2 = $item; $item = "MimeType";}
+
+
+OUT: while(index($data, $item, $startbyte) != -1){
+$startbyte = index($data, $item, $startbyte);
+$isrecord=0;
+
+$startbyte += length($item);
+
+if(ord($byteList[$startbyte]) == 0 or ord($byteList[$startbyte]) == 0x14){
+  if ( $item eq "Album" or $item eq "Artist" or $item2 eq "Title"){
+     if ( index($data,"Name",$startbyte) != -1) {
+     $startbyte = index($data,"Name",$startbyte);
+     $startbyte += length("Name");
+     }else {next OUT;}
+}
+
+  if ($data2 ne "") {$data2 = $data2."; ";}
+
+LINE:   while (1){
+        $char = $byteList[++$startbyte];
+
+	if (ord($char) >= 32 and ord($char) <= 126)
+	{
+        $isrecord=1; #record the string started
+	$data2 = $data2.$char;  
+	}else{
+             if ( $isrecord == 1 ) {last LINE ;}# stop at the end of string
+             }
+        }# end LINE: while
+
+ }# end if 
+}# end while
+
+return $data2;
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/scriptutil.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/scriptutil.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/scriptutil.pm	(revision 24799)
@@ -0,0 +1,82 @@
+###########################################################################
+#
+# scriptutil.pm -- various useful utilities for the scripts
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package scriptutil;
+
+use strict;
+no strict 'subs'; # allow barewords (eg STDERR) as function arguments
+no strict 'refs'; # ...but allow filehandles to be variables and vice versa
+
+use gsprintf 'gsprintf';
+
+# returns $removeold, $keepold
+sub check_removeold_and_keepold {
+
+    my ($removeold, $keepold, $incremental, $dir, $collectcfg) = @_;    
+
+    if (($keepold && $removeold) || ($incremental && $removeold) ) {
+	gsprintf(STDERR, "{scripts.both_old_options}\n", $dir);
+	sleep(3); #just in case
+	return (1,0,0,"none"); 
+	
+    } 
+
+    # Incremental mode may be set to "none", "onlyadd" or "all"
+    # depending on status of -keepold and -incremental flags
+    my $incremental_mode = "none";
+    if ($incremental) {
+	$incremental_mode = "all";
+    } elsif ($keepold) {
+	$incremental_mode = "onlyadd";
+    }
+
+    if (!$keepold && !$removeold && !$incremental && defined $collectcfg) {
+	# we only look at config file options if we dont have these on the command line
+	if (defined $collectcfg->{'removeold'} && $collectcfg->{'removeold'} =~ /^true$/i ) {
+	    $removeold = 1;
+	} elsif (defined $collectcfg->{'keepold'} && $collectcfg->{'keepold'} =~ /^true$/i) {
+	    $keepold = 1;
+	    $incremental_mode = "onlyadd";
+	} elsif (defined $collectcfg->{'incremental'} && $collectcfg->{'incremental'} =~ /^true$/i) {
+	    $incremental = 1;
+	    $incremental_mode = "all";
+	}
+    }
+
+    if (!$keepold && !$removeold && !$incremental) {
+	gsprintf(STDERR, "{scripts.no_old_options} \n", $dir);
+	sleep(3); #just in case
+	return (1,0,0,"none");
+    }
+    
+    # incremental implies keepold
+    if ($incremental) {
+	$keepold = 1;
+    }
+    return ($removeold, $keepold, $incremental, $incremental_mode);
+
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/sorttools.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/sorttools.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/sorttools.pm	(revision 24799)
@@ -0,0 +1,196 @@
+###########################################################################
+#
+# sorttools.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# various subroutines to format strings
+# for sorting
+
+package sorttools;
+
+use strict;
+
+# moved here from BasClas so import can share it
+sub format_metadata_for_sorting {
+    my ($metaname, $metavalue, $doc_obj) = @_;
+    if (!defined $metaname || $metaname !~ /\S/ || ! defined $metavalue || $metavalue !~ /\S/) {
+	return "";
+    }
+
+    if ($metaname eq "Language") {
+	$metavalue = $iso639::fromiso639{$metavalue};
+	return $metavalue;
+    } 
+    
+    my $lang;
+    if (defined $doc_obj) {
+	$lang = $doc_obj->get_metadata_element ($doc_obj->get_top_section(), 'Language');
+    }
+    $lang = 'en' unless defined $lang;
+    
+    # is this metadata likely to be a name?
+    my $function_name="format_string_name_$lang";
+    if ($metaname =~ /^(?:\w+\.)?(?:Creators?|Authors?|Editors?)(?:[:,].*)?$/
+	&& exists &$function_name) {
+	no strict 'refs';
+	&$function_name(\$metavalue);
+    } else {
+	$function_name="format_string_$lang";
+	if (exists &$function_name) {
+	    no strict 'refs';
+	    &$function_name(\$metavalue);
+	}
+    }
+    
+    return $metavalue;
+}
+
+### language-specific sorting functions (called by format_metadata_for_sorting)
+
+## format_string_$lang() converts to lowercase (where appropriate), and
+# removes punctuation, articles from the start of string, etc
+## format_string_name_$lang() converts to lowercase, puts the surname first,
+# removes punctuation, etc
+
+sub format_string_en {
+    my $stringref = shift;
+    $$stringref = lc($$stringref);
+    $$stringref =~ s/&[^\;]+\;//g; # html entities
+    $$stringref =~ s/^\s*(the|a|an)\b//; # articles
+    $$stringref =~ s/[^[:alnum:]]//g;
+    $$stringref =~ s/\s+/ /g;
+    $$stringref =~ s/^\s+//;
+    $$stringref =~ s/\s+$//;
+}
+
+sub format_string_name_en {
+    my ($stringref) = @_;
+    $$stringref =~ tr/A-Z/a-z/;
+    $$stringref =~ s/&\S+;//g;
+
+    my $comma_format = ($$stringref =~ m/^.+,.+$/);
+    $$stringref =~ s/[[:punct:]]//g;
+    $$stringref =~ s/\s+/ /g;
+    $$stringref =~ s/^\s+//;
+    $$stringref =~ s/\s+$//;
+
+    
+    if (!$comma_format) {
+	# No commas in name => name in 'firstname surname' format
+	# need to sort by surname
+	my @names = split / /, $$stringref;
+	my $surname = pop @names;
+	while (scalar @names && $surname =~ /^(jnr|snr)$/i) {
+	    $surname = pop @names;
+	}
+	$$stringref = $surname . " " . $$stringref;
+    }
+}
+
+
+sub format_string_fr {
+    my $stringref = shift;
+
+    $$stringref = lc($$stringref);
+    $$stringref =~ s/&[^\;]+\;//g; # html entities
+    $$stringref =~ s/^\s*(les?|la|une?)\b//; # articles
+    $$stringref =~ s/[^[:alnum:]]//g;
+    $$stringref =~ s/\s+/ /g;
+    $$stringref =~ s/^\s+//;
+    $$stringref =~ s/\s+$//;
+}
+
+sub format_string_es {
+    my $stringref = shift;
+
+    $$stringref = lc($$stringref);
+    $$stringref =~ s/&[^\;]+\;//g; # html entities
+    $$stringref =~ s/^\s*(la|el)\b//; # articles
+    $$stringref =~ s/[^[:alnum:]]//g;
+    $$stringref =~ s/\s+/ /g;
+    $$stringref =~ s/^\s+//;
+    $$stringref =~ s/\s+$//;
+}
+
+### end of language-specific functions
+
+# takes arguments of day, month, year and converts to
+# date of form yyyymmdd. month may be full (e.g. "January"),
+# abbreviated (e.g. "Jan"), or a number (1-12). Years like "86" 
+# will be assumed to be "1986".
+sub format_date {
+    my ($day, $month, $year) = @_;
+
+    my %months = ('january' => '01', 'jan' => '01', 'february' => '02', 'feb' => '02',
+		  'march' => '03', 'mar' => '03', 'april' => '04', 'apr' => '04',
+		  'may' => '05', 'june' => '06', 'jun' => '06', 'july' => '07', 
+		  'jul' => '07', 'august' => '08', 'aug' => '08', 'september' => '09', 
+		  'sep' => '09', 'october' => '10', 'oct' => '10', 'november' => '11', 
+		  'nov' => '11', 'december' => '12', 'dec' => '12');
+
+    $month =~ tr/A-Z/a-z/;
+    
+    if ($day < 1) { 
+	print STDERR "sorttools::format_date WARNING day $day out of range\n";
+	$day = "01";
+    } elsif ($day > 31) {
+	print STDERR "sorttools::format_date WARNING day $day out of range\n";
+	$day = "31";
+    }
+
+    $day = "0$day" if (length($day) == 1);
+
+    if ($month =~ /^\d\d?$/) {
+	if ($month < 1) {
+	    print STDERR "sorttools::format_date WARNING month $month out of range\n";
+	    $month = "01";
+	} elsif ($month > 12) {
+	    print STDERR "sorttools::format_date WARNING month $month out of range\n";
+	    $month = "12";
+	}
+	if ($month =~ /^\d$/) {
+	    $month = "0" . $month;
+	}
+    } elsif (!defined $months{$month}) {
+	print STDERR "sorttools::format_date WARNING month $month out of range\n";
+	$month = "01";
+    } else {
+	$month = $months{$month};
+    }
+    
+    if ($year !~ /^\d\d\d\d$/) {
+	if ($year !~ /^\d\d$/) {
+	    my $newyear = 1900 + $year;
+	    print STDERR "sorttools::format_date WARNING year $year assumed to be $newyear\n";
+	    $year=$newyear;
+	} else {
+	    print STDERR "sorttools::format_date WARNING year $year out of range - reset to 1900\n";
+	    $year = "1900";
+	}
+    }
+
+    return "$year$month$day";
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/strings.properties
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/strings.properties	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/strings.properties	(revision 24799)
@@ -0,0 +1,1384 @@
+#
+# Resource bundle description
+#
+
+Language.code:en
+Language.name:English
+
+OutputEncoding.unix:iso_8859_1
+OutputEncoding.windows:iso_8859_1
+
+
+#
+# Common output messages and strings
+#
+
+common.cannot_create_file:ERROR: Can't create file %s
+
+common.cannot_find_cfg_file:ERROR: Can't find the configuration file %s
+
+common.cannot_open:ERROR: Can't open %s
+
+common.cannot_open_fail_log:ERROR: Can't open fail log %s
+
+common.cannot_open_output_file:ERROR: Can't open output file %s
+
+common.cannot_read:ERROR: Can't read %s
+
+common.cannot_read_file:ERROR: Can't read file %s
+
+common.general_options:general options (for %s)
+
+common.must_be_implemented:function must be implemented in sub-class
+
+common.options:options
+
+common.processing:processing
+
+common.specific_options:specific options
+
+common.usage:Usage
+
+common.info:info
+
+common.invalid_options:Invalid arguments: %s
+
+common.true:true
+
+common.false:false
+
+common.deprecated: SUPERSEDED
+#
+# Script option descriptions and output messages
+#
+
+scripts.language:Language to display option descriptions in (eg. 'en_US' specifies American English). Requires translations of the option descriptions to exist in the perllib/strings_language-code.rb file.
+
+scripts.xml:Produces the information in an XML form, without 'pretty' comments but with much more detail.
+
+scripts.listall:Lists all items known about.
+
+scripts.describeall:Display options for all items known about
+
+scripts.both_old_options:WARNING: -removeold was specified with -keepold or -incremental, defaulting to -removeold. Current contents of %s directory will be deleted.
+
+scripts.no_old_options:WARNING: None of -removeold, -keepold or -incremental were specified, defaulting to -removeold. Current contents of %s directory will be deleted.
+
+scripts.gli:A flag set when running this script from gli, enables output specific for gli.
+scripts.gai:A flag set when running this script from gai (greenstone administration tool), enables output specific for gai.
+
+scripts.verbosity:Controls the quantity of output. 0=none, 3=lots.
+scripts.out:Filename or handle to print output status to.
+
+# -- buildcol.pl --
+
+buildcol.archivedir:Where the archives live.
+
+buildcol.builddir:Where to put the built indexes.
+
+buildcol.cachedir:Collection will be temporarily built here before being copied to the build directory.
+
+buildcol.cannot_open_cfg_file:WARNING: Can't open config file for updating: %s
+
+buildcol.collectdir:The path of the "collect" directory.
+
+buildcol.copying_back_cached_build:Copying back the cached build
+
+buildcol.create_images:Attempt to create default images for new collection. This relies on the Gimp being installed along with relevant perl modules to allow scripting from perl.
+
+buildcol.debug:Print output to STDOUT.
+
+buildcol.desc:PERL script used to build a greenstone collection from archive documents.
+
+buildcol.faillog:Fail log filename. This log receives the filenames of any files which fail to be processed.
+
+buildcol.incremental_default_builddir:WARNING: The building directory has defaulted to 'building'. If you want to incrementally add to the index directory, please use the "-builddir index" option to buildcol.pl.
+
+buildcol.indexname:Name of index to build (will build all in config file if not set).
+
+buildcol.indexlevel:Level of indexes to build (will build all in config file if not set).
+
+buildcol.incremental:Only index documents which have not been previously indexed. Implies -keepold. Relies on the lucene indexer.
+
+buildcol.keepold:Will not destroy the current contents of the building directory.
+
+buildcol.maxdocs:Maximum number of documents to build.
+buildcol.maxnumeric:The maximum nuber of digits a 'word' can have in the index dictionary. Large numbers are split into several words for indexing. For example, if maxnumeric is 4, "1342663" will be split into "1342" and "663".
+buildcol.mode:The parts of the building process to carry out.
+buildcol.mode.all:Do everything.
+buildcol.mode.build_index:Just index the text.
+buildcol.mode.compress_text:Just compress the text.
+buildcol.mode.infodb:Just build the metadata database.
+
+buildcol.no_default_images:Default images will not be generated.
+
+buildcol.no_image_script:WARNING: Image making script could not be found: %s
+
+buildcol.no_strip_html:Do not strip the html tags from the indexed text (only used for mgpp collections).
+
+buildcol.no_text:Don't store compressed text. This option is useful for minimizing the size of the built indexes if you intend always to display the original documents at run time (i.e. you won't be able to retrieve the compressed text version).
+
+buildcol.sections_index_document_metadata:Index document level metadata at section level
+buildcol.sections_index_document_metadata.never:Don't index any document metadata at section level.
+buildcol.sections_index_document_metadata.always:Add all specified document level metadata even if section level metadata of that name exists.
+buildcol.sections_index_document_metadata.unless_section_metadata_exists:Only add document level metadata if no section level metadata of that name exists.
+
+buildcol.out:Filename or handle to print output status to.
+
+buildcol.params:[options] collection-name
+
+buildcol.remove_empty_classifications:Hide empty classifiers and classification nodes (those that contain no documents).
+
+buildcol.removeold:Will remove the old contents of the building directory.
+
+buildcol.unlinked_col_images:Collection images may not be linked correctly.
+
+buildcol.unknown_mode:Unknown mode: %s
+
+buildcol.updating_archive_cache:Updating archive cache
+
+buildcol.verbosity:Controls the quantity of output. 0=none, 3=lots.
+
+
+# -- classinfo.pl --
+
+classinfo.collection:Giving a collection name will make classinfo.pl look in collect/collection-name/perllib/classify first. If the classifier is not found there it will look in the general perllib/classify directory.
+
+classinfo.desc:Prints information about a classifier.
+
+classinfo.general_options:General options are inherited from parent classes of the classifier.
+
+classinfo.info:info
+
+classinfo.no_classifier_name:ERROR: You must provide a classifier name.
+
+classinfo.option_types:Classifiers may take two types of options
+
+classinfo.params:[options] classifier-name
+
+classinfo.passing_options:Options may be passed to any classifier by including them in your collect.cfg configuration file.
+
+classinfo.specific_options:Specific options are defined within the classifier itself, and are available only to this particular classifier.
+
+# -- downloadfrom.pl --
+downloadfrom.cache_dir:The location of the cache directory
+downloadfrom.desc:Downloads files from an external server
+downloadfrom.download_mode:The type of server to download from
+downloadfrom.download_mode.Web:HTTP  
+downloadfrom.download_mode.MediaWiki:MediaWiki website
+downloadfrom.download_mode.OAI: Open Archives Initiative 
+downloadfrom.download_mode.z3950:z3950 server
+downloadfrom.download_mode.SRW:SearchRetrieve Webservice
+downloadfrom.incorrect_mode:download_mode parameter was incorrect.
+downloadfrom.info:Print information about the server, rather than downloading
+downloadfrom.params:[general options] [specific download options]
+
+# -- downloadinfo.pl --
+
+downloadinfo.desc:Prints information about a download module
+downloadinfo.collection:Giving a collection name will make downloadinfo.pl look in collect/collection-name/perllib/downloaders first. If the module is not found there it will look in the general perllib/downloaders directory.
+downloadinfo.params:[options] [download-module]
+downloadinfo.general_options:General options are inherited from parent classes of the download modules.
+downloadinfo.specific_options:Specific options are defined within the download module itself, and are available only to this particular downloader.
+downloadinfo.option_types:Download modules may take two types of options
+
+# -- explode_metadata_database.pl --
+explode.desc:Explode a metadata database
+
+explode.collection:The collection name. Some plugins look for auxiliary files in the collection folder.
+ 
+explode.document_field:The metadata element specifying the file name of documents to obtain and include in the collection.
+
+explode.document_prefix:A prefix for the document locations (for use with the document_field option).
+
+explode.document_suffix:A suffix for the document locations (for use with the document_field option).
+
+explode.encoding:Encoding to use when reading in the database file
+explode.metadata_set:Metadata set (namespace) to export all metadata as
+explode.plugin: Plugin to use for exploding
+explode.plugin_options:Options to pass to the plugin before exploding. Option nmaes must start with -. Separate option names and values with space. Cannot be used with -use_collection_plugin_options.
+explode.use_collection_plugin_options: Read the collection configuration file and use the options for the specified plugin. Requires the -collection option. Cannot be used with -plugin_options.
+explode.params: [options] filename
+explode.records_per_folder: The number of records to put in each subfolder.
+
+# -- replace_srcdoc_with_html.pl --
+srcreplace.desc: Replace source document with the generated HTML file when rebuilding
+srcreplace.params: [options] filename
+srcreplace.plugin: Plugin to use for converting the source document
+
+# -- exportcol.pl --
+
+exportcol.out:Filename or handle to print output status to.
+exportcol.cddir:The name of the directory that the CD contents are exported to.
+exportcol.cdname:The name of the CD-ROM -- this is what will appear in the start menu once the CD-ROM is installed.
+exportcol.collectdir:The path of the "collect" directory.
+exportcol.desc:PERL script used to export one or more collections to a Windows CD-ROM. 
+exportcol.noinstall:Create a CD-ROM where the library runs directly off the CD-ROM and nothing is installed on the host computer.
+exportcol.params:[options] collection-name1 collection-name2 ...
+exportcol.coll_not_found:Ignoring invalid collection %s: collection not found at %s.
+exportcol.coll_dirs_not_found:Ignoring invalid collection %s: one of the following directories not found:
+exportcol.fail:exportcol.pl failed:
+exportcol.no_valid_colls:No valid collections specified to export.
+exportcol.couldnt_create_dir:Could not create directory %s.
+exportcol.couldnt_create_file:Could not create %s.
+exportcol.instructions:To create a self-installing Windows CD-ROM, write the contents of this folder out to a CD-ROM.
+exportcol.non_exist_files:One or more of the following necessary files and directories does not exist:
+exportcol.success:exportcol.pl succeeded:
+exportcol.output_dir:The exported collections (%s) are in %s.
+exportcol.export_coll_not_installed:The Export to CD-ROM functionality has not been installed.
+
+# -- import.pl --
+
+import.archivedir:Where the converted material ends up.
+
+import.manifest:An XML file that details what files are to be imported. Used instead of recursively descending the import folder, typically for incremental building.
+
+import.cannot_open_stats_file:WARNING: Couldn't open stats file %s.
+
+import.cannot_open_fail_log:ERROR: Couldn't open fail log %s
+
+import.cannot_read_OIDcount:Warning: unable to read document OID count from %s.\nSetting value to 0.
+
+#import.cannot_read_earliestdatestamp:Warning: unable to read collection's earliestDatestampcount from %s.\nSetting value to 0.
+
+import.cannot_sort:WARNING: import.pl cannot sort documents when groupsize > 1. sortmeta option will be ignored.
+
+import.cannot_write_earliestdatestamp:Warning: unable to store collection's earliestDatestamp in %s.
+
+import.cannot_write_OIDcount:Warning: unable to store document OID count in %s.
+
+import.collectdir:The path of the "collect" directory.
+
+import.complete:Import complete
+
+import.debug:Print imported text to STDOUT (for GreenstoneXML importing)
+
+import.desc:PERL script used to import files into a format (GreenstoneXML or GreenstoneMETS) ready for building.
+
+import.faillog:Fail log filename. This log receives the filenames of any files which fail to be processed.
+
+import.groupsize:Number of import documents to group into one XML file.
+
+import.gzip:Use gzip to compress resulting xml documents (don't forget to include ZIPPlugin in your plugin list when building from compressed documents).
+
+import.importdir:Where the original material lives.
+
+import.incremental:Only import documents which are newer (by timestamp) than the current archives files. Implies -keepold.
+
+import.keepold:Will not destroy the current contents of the archives directory.
+
+import.maxdocs:Maximum number of documents to import.
+
+import.no_import_dir:Error: Import dir (%s) not found.
+
+import.no_plugins_loaded:ERROR: No plugins loaded.
+
+import.OIDtype:The method to use when generating unique identifiers for each document.
+import.OIDtype.hash:Hash the contents of the file. Document identifiers will be the same every time the collection is imported.
+import.OIDtype.hash_on_ga_xml:Hash the contents of the Greenstone Archive XML file. Document identifiers will be the same every time the collection is imported as long as the metadata does not change.
+
+import.OIDtype.incremental:Use a simple document count. Significantly faster than "hash", but does not necessarily assign the same identifier to the same document content if the collection is reimported.
+
+import.OIDtype.assigned:Use the metadata value given by the OIDmetadata option (preceded by 'D'); if unspecified, for a particular document a hash is used instead. These identifiers should be unique. 
+
+import.OIDtype.dirname:Use the parent directory name (preceded by 'J'). There should only be one document per directory, and directory names should be unique. E.g. import/b13as/h15ef/page.html will get an identifier of Jh15ef.
+
+import.OIDmetadata:Specifies the metadata element that hold's the document's unique identifier, for use with -OIDtype=assigned.
+
+import.saveas:Format that the archive files should be saved as. 
+
+import.out:Filename or handle to print output status to.
+
+import.params:[options] collection-name
+
+import.removeold:Will remove the old contents of the archives directory.
+
+import.removing_archives:Removing current contents of the archives directory...
+
+import.removing_tmpdir:Removing contents of the collection "tmp" directory...
+
+import.site:Site to find collect directory in (for Greenstone 3 installation).
+
+import.sortmeta:Sort documents alphabetically by metadata for building. Search results for boolean queries will be displayed in this order. This will be disabled if groupsize > 1. May be a commma separated list to sort by more than one metadata value.
+
+import.statsfile:Filename or handle to print import statistics to.
+
+import.stats_backup:Will print stats to STDERR instead.
+
+import.verbosity:Controls the quantity of output. 0=none, 3=lots.
+
+# -- csv-usernames-to-db.pl
+cu2db.desc:A simple script to batch add users to the greenstone users database. Takes a comma-separated value (csv) file as input. Each line represents one user, and consists of username,password,groups,comment. If the user belongs ot more than one group, then groups will be a comma-separated list, and you'll need to use a different field separator for the file (along with the field-separator option).
+ 
+cu2db.params:[options] csv-filename
+
+cu2db.field-separator:Controls which character is used to separate the fields in the CSV file
+
+cu2db.already-encrypted:Use this if the passwords in the CSV file are already encrypted
+
+
+
+# -- schedule.pl --
+schedule.deleted:Scheduled execution deleted for collection
+schedule.scheduled:Execution script created for collection
+schedule.cron:Scheduled execution set up for collection
+schedule.params:[options]
+schedule.error.email:-email requires -smtp -toaddr and -fromaddr to be specified.
+schedule.error.importbuild:-import and -build must be specified. 
+schedule.error.colname:Collection using -colname must be specified. 
+schedule.gli:Running from the GLI
+schedule.frequency:How often to automatically re-build the collection
+schedule.frequency.hourly:Re-build every hour
+schedule.frequency.daily:Re-build every day
+schedule.frequency.weekly:Re-build every week
+schedule.action:How to set up automatic re-building
+schedule.action.add:Schedule automatic re-building
+schedule.action.update:Update existing scheduling
+schedule.action.delete:Delete existing scheduling
+schedule.email:Send email notification 
+schedule.schedule:Select to set up scheduled automatic collection re-building
+schedule.colname:The colletion name for which scheduling will be set up
+schedule.import:The import command to be scheduled
+schedule.build:The buildcol command to be scheduled
+schedule.toaddr:The email address to send scheduled build notifications to
+schedule.toaddr.default:Specify User's Email in File->Preferences
+schedule.fromaddr:The sender email address
+schedule.fromaddr.default:Specify maintainer in main.cfg
+schedule.smtp:The mail server that sendmail must contact to send email
+schedule.smtp.default:Specify MailServer in main.cfg
+schedule.out:Filename or handle to print output status to.
+# -- export.pl --
+
+export.exportdir:Where the export material ends up.
+
+export.cannot_open_stats_file:WARNING: Couldn't open stats file %s.
+
+export.cannot_open_fail_log:ERROR: Couldn't open fail log %s
+
+export.cannot_sort:WARNING: export.pl cannot sort documents when groupsize > 1. sortmeta option will be ignored.
+
+export.collectdir:The path of the "collect" directory.
+
+export.complete:Export complete
+
+export.debug:Print exported text to STDOUT (for GreenstoneXML exporting)
+
+export.desc:PERL script used to export files in a Greenstone collection to another format.
+
+export.faillog:Fail log filename. This log receives the filenames of any files which fail to be processed. (Default: collectdir/collname/etc/fail.log)
+
+export.groupsize:Number of documents to group into one XML file.
+
+export.gzip:Use gzip to compress resulting xml documents (don't forget to include ZIPPlugin in your plugin list when building from compressed documents).
+
+export.importdir:Where the original material lives.
+
+export.keepold:Will not destroy the current contents of the export directory. 
+
+export.maxdocs:Maximum number of documents to export.
+
+export.listall:List all the saveas formats
+
+export.saveas:Format to export documents as.
+
+export.saveas.DSpace:DSpace Archive format.
+
+export.saveas.GreenstoneMETS:METS format using the Greenstone profile.
+export.saveas.FedoraMETS:METS format using the Fedora profile.
+
+export.saveas.GreenstoneXML:Greenstone XML Archive format
+
+export.saveas.MARCXML:MARC XML format (an XML version of MARC 21)
+
+export.out:Filename or handle to print output status to.
+
+export.params:[options] collection-name
+
+export.removeold:Will remove the old contents of the export directory. 
+
+export.removing_export:Removing current contents of the export directory...
+
+export.sortmeta:Sort documents alphabetically by metadata for building. This will be disabled if groupsize > 1.
+
+export.statsfile:Filename or handle to print export statistics to.
+
+export.stats_backup:Will print stats to STDERR instead.
+
+export.verbosity:Controls the quantity of output. 0=none, 3=lots.
+
+
+# -- mkcol.pl --
+
+mkcol.about:The about text for the collection.
+
+mkcol.buildtype:The 'buildtype' for the collection (e.g. mg, mgpp, lucene)
+
+mkcol.infodbtype:The 'infodbtype' for the collection (e.g. gdbm, jdbm, sqlite)
+
+mkcol.bad_name_cvs:ERROR: No collection can be named CVS as this may interfere with directories created by the CVS versioning system.
+
+mkcol.bad_name_svn:ERROR: No collection can be named .svn as this may interfere with directories created by the SVN versioning system.
+
+mkcol.bad_name_modelcol:ERROR: No collection can be named modelcol as this is the name of the model collection.
+
+mkcol.cannot_find_modelcol:ERROR: Cannot find the model collection %s
+
+mkcol.col_already_exists:ERROR: This collection already exists.
+
+mkcol.collectdir:Directory where new collection will be created.
+
+mkcol.group_not_valid_in_gs3:The group option is not valid in Greenstone 3 mode (-gs3mode).
+mkcol.creating_col:Creating the collection %s
+
+mkcol.creator:The collection creator's e-mail address.
+
+mkcol.creator_undefined:ERROR: The creator was not defined. This variable is needed to recognise duplicate collection names.
+
+mkcol.desc:PERL script used to create the directory structure for a new Greenstone collection.
+
+mkcol.doing_replacements:doing replacements for %s
+
+mkcol.group:Create a new collection group instead of a standard collection.
+
+mkcol.gs3mode:Mode for Greenstone 3 collections.
+
+mkcol.long_colname:ERROR: The collection name must be less than 8 characters so compatibility with earlier filesystems can be maintained.
+
+mkcol.maintainer:The collection maintainer's email address (if different from the creator).
+
+mkcol.no_collectdir:ERROR: The collect dir doesn't exist: %s
+
+mkcol.no_collectdir_specified:ERROR: No collect dir was specified. In gs3mode, either the -site or -collectdir option must be specified.
+
+mkcol.no_colname:ERROR: No collection name was specified.
+
+mkcol.optionfile:Get options from file, useful on systems where long command lines may cause problems.
+
+mkcol.params:[options] collection-name
+
+mkcol.plugin:Perl plugin module to use (there may be multiple plugin entries).
+
+mkcol.public:If this collection has anonymous access.
+mkcol.public.true:Collection is public
+mkcol.public.false:Collection is private
+
+mkcol.quiet:Operate quietly.
+
+mkcol.site:In gs3mode, uses this site name with the GSDL3HOME environment variable to determine collectdir, unless -collectdir is specified.
+
+mkcol.success:The new collection was created successfully at %s
+
+mkcol.title:The title of the collection.
+
+mkcol.win31compat:Whether or not the named collection directory must conform to Windows 3.1 file conventions or not (i.e. 8 characters long).
+mkcol.win31compat.true:Directory name 8 characters or less
+mkcol.win31compat.false:Directory name any length
+
+# -- pluginfo.pl --
+
+pluginfo.collection:Giving a collection name will make pluginfo.pl look in collect/collection-name/perllib/plugins first. If the plugin is not found there it will look in the general perllib/plugins directory.
+
+pluginfo.desc:Prints information about a plugin.
+
+pluginfo.general_options:General options are inherited from parent classes of the plugin.
+
+pluginfo.info:info
+
+pluginfo.no_plugin_name:ERROR: You must provide a plugin name.
+
+pluginfo.option_types:Plugins may take two types of options
+
+pluginfo.params:[options] plugin-name
+
+pluginfo.passing_options:Options may be passed to any plugin by including them in your collect.cfg configuration file.
+
+pluginfo.specific_options:Specific options are defined within the plugin itself, and are available only to this particular plugin.
+
+
+# -- plugoutinfo.pl --
+
+plugoutinfo.collection:Giving a collection name will make plugoutinfo.pl look in collect/collection-name/perllib/plugouts first. If the plugout is not found there it will look in the general perllib/plugouts directory.
+
+plugoutinfo.desc:Prints information about a plugout.
+
+plugoutinfo.general_options:General options are inherited from parent classes of the plugout.
+
+plugoutinfo.info:info
+
+plugoutinfo.no_plugout_name:ERROR: You must provide a plugout name.
+
+plugoutinfo.option_types:Plugouts may take two types of options
+
+plugoutinfo.params:[options] plugout-name
+
+plugoutinfo.passing_options:Options may be passed to any plugout by including them in your collect.cfg configuration file.
+
+plugoutinfo.specific_options:Specific options are defined within the plugout itself, and are available only to this particular plugout.
+
+
+
+#
+# Classifier option descriptions
+#
+
+AllList.desc:Creates a single list of all documents. Use by the oaiserver.
+
+AZCompactList.allvalues:Use all metadata values found.
+
+AZCompactList.desc:Classifier plugin for sorting alphabetically (on a-z, A-Z, 0-9). Produces a horizontal A-Z list, then a vertical list containing documents, or bookshelves for documents with common metadata.
+
+AZCompactList.doclevel:Level to process document at.
+AZCompactList.doclevel.top:Whole document.
+AZCompactList.doclevel.section:By sections.
+
+AZCompactList.firstvalueonly:Use only the first metadata value found.
+
+AZCompactList.freqsort:Sort by node frequency rather than alpha-numeric.
+
+AZCompactList.maxcompact:Maximum number of documents to be displayed per page.
+
+AZCompactList.metadata:A single metadata field, or a comma separated list of metadata fields, used for classification. If a list is specified, the first metadata type that has values will be used. May be used in conjunction with the -firstvalueonly and -allvalues flags, to select only the first value, or all metadata values from the list.
+
+AZCompactList.mincompact:Minimum number of documents to be displayed per page.
+
+AZCompactList.mingroup:The smallest value that will cause a group in the hierarchy to form.
+
+AZCompactList.minnesting:The smallest value that will cause a list to be converted into a nested list.
+
+AZCompactList.recopt:Used in nested metadata such as -metadata Year/Organisation.
+AZCompactList.sort:Metadata field to sort the leaf nodes by. 
+
+AZCompactSectionList.desc:Variation on AZCompactList that classifies sections rather than documents. Entries are sorted by section-level metadata.
+
+AZList.desc:Classifier plugin for sorting alphabetically (on a-z, A-Z, 0-9). Produces a horizontal A-Z list, with documents listed underneath.
+
+AZList.metadata:A single metadata field or a comma separated list of metadata fields used for classification. Following the order indicated by the list, the first field that contains a metadata value will be used. List will be sorted by this element.
+
+AZSectionList.desc:Variation on AZList that classifies sections rather that documents. Entries are sorted by section-level metadata. 
+
+BasClas.bad_general_option:The %s classifier uses an incorrect option. Check your collect.cfg configuration file.
+
+BasClas.builddir:Where to put the built indexes.
+
+BasClas.buttonname:The label for the classifier screen and button in navigation bar. The default is the metadata element specified with -metadata.
+
+BasClas.desc:Base class for all the classifiers.
+
+BasClas.no_metadata_formatting:Don't do any automatic metadata formatting (for sorting.)
+
+BasClas.outhandle:The file handle to write output to.
+
+BasClas.removeprefix:A prefix to ignore in metadata values when sorting.
+
+BasClas.removesuffix:A suffix to ignore in metadata values when sorting.
+
+BasClas.verbosity:Controls the quantity of output. 0=none, 3=lots.
+
+Browse.desc:A fake classifier that provides a link in the navigation bar to a prototype combined browsing and searching page. Only works for mgpp collections, and is only practical for small collections.
+
+DateList.bymonth:Classify by year and month instead of only year.
+
+DateList.desc:Classifier plugin for sorting by date. By default, sorts by 'Date' metadata. Dates are assumed to be in the form yyyymmdd or yyyy-mm-dd.
+
+DateList.metadata:The metadata that contains the dates to classify by. The format is expected to be yyyymmdd or yyyy-mm-dd. Can be a comma separated list, in which case the first date found will be used.
+
+DateList.reverse_sort:Sort the documents in reverse chronological order (newest first).
+
+DateList.nogroup:Make each year an individual entry in the horizontal list, instead of spanning years with few entries. (This can also be used with the -bymonth option to make each month a separate entry instead of merging).
+
+DateList.no_special_formatting:Don't display Year and Month information in the document list.
+
+DateList.sort:An extra metadata field to sort by in the case where two documents have the same date.
+
+HFileHierarchy.desc:Classifier plugin for generating hierarchical classifications based on a supplementary structure file.
+
+Hierarchy.desc:Classifier plugin for generating a hierarchical classification. This may be based on structured metadata, or may use a supplementary structure file (use the -hfile option).
+
+Hierarchy.documents_last:Display document nodes after classifier nodes.
+
+Hierarchy.hfile:Use the specified classification structure file.
+
+Hierarchy.hlist_at_top:Display the first level of the classification horizontally.
+
+Hierarchy.reverse_sort:Sort leaf nodes in reverse order (use with -sort).
+
+Hierarchy.separator:Regular expression used for the separator, if using structured metadata.
+
+Hierarchy.sort:Metadata field to sort leaf nodes by. Leaves will not be sorted if not specified.
+
+Hierarchy.suppressfirstlevel:Ignore the first part of the metadata value. This is useful for metadata where the first element is common, such as the import directory in gsdlsourcefilename.
+
+Hierarchy.suppresslastlevel:Ignore the final part of the metadata value. This is useful for metadata where each value is unique, such as file paths.
+
+HTML.desc:Creates an empty classification that's simply a link to a web page.
+
+HTML.url:The url of the web page to link to.
+
+List.bookshelf_type:Controls when to create bookshelves
+List.bookshelf_type.always:Create a bookshelf icon even if there is only one item in each group at the leaf nodes.
+List.bookshelf_type.never:Never create a bookshelf icon even if there are more than one item in each group at the leaf nodes.
+List.bookshelf_type.duplicate_only:Create a bookshelf icon only when there are more than one item in each group at the leaf nodes.
+
+List.classify_sections:Classify sections instead of documents.
+
+List.desc:A general and flexible list classifier with most of the abilities of AZCompactList, but with better Unicode, metadata and sorting capabilities.
+
+List.level_partition.none:None.
+List.level_partition.per_letter:Create a partition for each letter.
+List.level_partition.constant_size:Create partitions with constant size.
+List.level_partition.approximate_size:Create a partition per letter, then group or split the letters to get approximately the same sized partitions. 
+
+List.metadata:Metadata fields used for classification. Use '/' to separate the levels in the hierarchy and ';' to separate metadata fields within each level.
+
+List.partition_name_length:The length of the partition name; defaults to a variable length from 1 up to 3 characters, depending on how many are required to distinguish the partition start from its end. This option only applies when partition_type_within_level is set to 'constant_size'.
+
+List.partition_size_within_level:The number of items in each partition (only applies when partition_type_within_level is set to 'constant_size' or 'approximate_size'). Can be specified for each level. Separate levels by '/'.
+
+List.partition_type_within_level:The type of partitioning done. Can be specified for each level. Separate levels by '/'.
+
+List.reverse_sort_leaf_nodes:Sort the leaf documents in reverse order.
+
+List.sort_leaf_nodes_using:Metadata fields used for sorting the leaf nodes. Use '|' to separate the metadata groups to stable sort and ';' to separate metadata fields within each group.
+
+List.sort_using_unicode_collation:Sort using the Unicode Collation Algorithm. Requires http://www.unicode.org/Public/UCA/latest/allkeys.txt file to be downloaded into perl's lib/Unicode/Collate folder.
+
+List.use_hlist_for:Metadata fields to use a hlist rather than a vlist. Use ',' to separate the metadata groups and ';' to separate the metadata fields within each group.
+
+SimpleList.metadata:A single metadata field or a comma separated list of metadata fields used for classification. Following the order indicated by the list, the first field that contains a metadata value will be used. List will be sorted by this element, unless -sort is used. If no metadata is specified, then all documents will be included in the list, otherwise only documents that contain a metadata value will be included.
+
+SimpleList.desc:Simple list classifier plugin. 
+
+SimpleList.sort:Metadata field to sort by. Use '-sort nosort' for no sorting. 
+
+Phind.desc:Produces a hierarchy of phrases found in the text, which is browsable via an applet.
+
+Phind.language:Language or languages to use building hierarchy. Languages are identified by two-letter country codes like en (English), es (Spanish), and fr (French). Language is a regular expression, so 'en|fr' (English or French) and '..' (match any language) are valid.
+
+Phind.min_occurs:The minimum number of times a phrase must appear in the text to be included in the phrase hierarchy.
+
+Phind.savephrases:If set, the phrase infomation will be stored in the given file as text. It is probably a good idea to use an absolute path.
+
+Phind.suffixmode:The smode parameter to the phrase extraction program. A value of 0 means that stopwords are ignored, and of 1 means that stopwords are used.
+
+Phind.text:The text used to build the phrase hierarchy.
+
+Phind.thesaurus:Name of a thesaurus stored in Phind format in the collection's etc directory.
+
+Phind.title:The metadata field used to describe each document.
+
+Phind.untidy:Don't remove working files.
+
+RecentDocumentsList.desc:Classifier that gives a list of newly added or modified documents.
+
+RecentDocumentsList.include_docs_added_since:Include only documents modified or added after the specified date (in yyyymmdd or yyyy-mm-dd format). 
+
+RecentDocumentsList.include_most_recently_added:Include only the specified number of most recently added documents. Only used if include_docs_added_since is not specified.
+
+RecentDocumentsList.sort:Metadata to sort List by. If not specified, list will be sorted by date of modification/addition.
+
+SectionList.desc:Same as List classifier but includes all sections of document (excluding top level) rather than just top level document itself.
+
+Collage.desc:An applet is used to display a collage of images found in the collection.
+
+Collage.geometry:The dimensions of the collage canvas. For a canvas 600 pixels wide by 400 pixels high, for example, specify geometry as 600x400
+
+Collage.maxDepth:Images for collaging are drawn from mirroring the underlying browse classifier. This controls the maximum depth of the mirroring process.
+
+Collage.maxDisplay:The maximum number of images to show in the collage at any one time.
+
+Collage.imageType:Used to control, by expressing file name extensions, which file types are used in the collage.  A list of file name extensions is separated by the percent (%%) symbol.
+
+Collage.bgcolor:The background color of the collage canvas, specified in hexadecimal form (for example #008000 results in a forest green background).
+
+Collage.buttonname:The label for the classifier screen and button in navigation bar.
+
+Collage.refreshDelay:Rate, in milliseconds, that the collage canvas is refreshed.
+
+Collage.isJava2:Used to control which run-time classes of Java are used. More advanced version of Java (i.e. Java 1.2 onwards) include more sophisticated support for controlling transparency in images, this flag helps control what happens; however the built-in Java runtime for some browsers is version 1.1.  The applet is designed to, by default, auto-detect which version of Java the browser is running and act accordingly.
+
+Collage.imageMustNotHave:Used to suppress images that should not appear in the collage, such as image buttons that make up the navigation bar.
+
+Collage.caption:Optional captions to display below the collage canvas.
+
+
+#
+# Plugin option descriptions
+#
+AcronymExtractor.adding:adding
+
+AcronymExtractor.already_seen:already seen
+
+AcronymExtractor.desc:Helper extractor plugin for location and marking up acronyms in text.
+
+AcronymExtractor.done_acronym_extract:done extracting acronyms.
+
+AcronymExtractor.done_acronym_markup:done acronym markup.
+
+AcronymExtractor.extract_acronyms:Extract acronyms from within text and set as metadata.
+
+AcronymExtractor.extracting_acronyms:extracting acronyms
+
+AcronymExtractor.marking_up_acronyms:marking up acronyms
+
+AcronymExtractor.markup_acronyms:Add acronym metadata into document text.
+
+ArchivesInfPlugin.desc:Plugin which processes the archive info database (archiveinf-doc) which is generated by the import process. It passes each archive file listed in the database to the plugin pipeline to be processed by GreenstoneXMLPlugin.
+ArchivesInfPlugin.reversesort:Sort in reverse order. Useful if the -sortmeta option was used with import.pl.
+
+AutoExtractMetadata.desc: Base plugin that brings together all the extractor functionality from the extractor plugins.
+
+AutoExtractMetadata.extracting:extracting
+
+AutoExtractMetadata.first:Comma separated list of numbers of characters to extract from the start of the text into a set of metadata fields called 'FirstN', where N is the size. For example, the values "3,5,7" will extract the first 3, 5 and 7 characters into metadata fields called "First3", "First5" and "First7".
+
+AutoLoadConverters.desc:Helper plugin that dynamically loads up extension converter plugins.
+
+BaseMediaConverter.desc:Helper plugin that provides base functionality for media converter plugins such as ImageConverter and video converters.
+
+BasePlugin.associate_ext:Causes files with the same root filename as the document being processed by the plugin AND a filename extension from the comma separated list provided by this argument to be associated with the document being processed rather than handled as a separate list.
+
+BasePlugin.associate_tail_re:A regular expression to match filenames against to find associated files. Used as a more powerful alternative to associate_ext.
+
+BasePlugin.block_exp:Files matching this regular expression will be blocked from being passed to any later plugins in the list.
+
+BasePlugin.desc:Base class for all the import plugins.
+
+BasePlugin.dummy_text:This document has no text.
+
+BasePlugin.encoding.ascii:Plain 7 bit ASCII. This may be a bit faster than using iso_8859_1. Beware of using this when the text may contain characters outside the plain 7 bit ASCII set though (e.g. German or French text containing accents), use iso_8859_1 instead.
+
+BasePlugin.encoding.unicode:Just unicode.
+
+BasePlugin.encoding.utf8:Either utf8 or unicode -- automatically detected.
+
+BasePlugin.filename_encoding:The encoding of the source file filenames.
+
+BasePlugin.filename_encoding.auto:Automatically detect the encoding of the filename.
+
+BasePlugin.filename_encoding.auto_language_analysis:Auto-detect the encoding of the filename by analysing it.
+
+BasePlugin.filename_encoding.auto_filesystem_encoding:Auto-detect the encoding of the filename using filesystem encoding.
+
+BasePlugin.filename_encoding.auto_fl:Uses filesystem encoding then language analysis to detect the filename encoding.
+
+BasePlugin.filename_encoding.auto_lf:Uses language analysis then filesystem encoding to detect the filename encoding.
+
+BasePlugin.no_blocking:Don't do any file blocking. Any associated files (e.g. images in a web page) will be added to the collection as documents in their own right.
+
+BasePlugin.no_cover_image:Do not look for a prefix.jpg file (where prefix is the same prefix as the file being processed) to associate as a cover image.
+
+BasePlugin.OIDtype.auto:Use OIDtype set in import.pl
+
+BasePlugin.process_exp:A perl regular expression to match against filenames. Matching filenames will be processed by this plugin. For example, using '(?i).html?\$' matches all documents ending in .htm or .html (case-insensitive).
+
+BasePlugin.processing_tmp_files:Internal flag, set by converter plugins to indicate that we are processing a tmp file.
+
+BasePlugin.smart_block:Block files in a smarter way than just looking at filenames.
+
+BasePlugin.store_original_file:Save the original source document as an associated file. Note this is already done for files like PDF, Word etc. This option is only useful for plugins that don't already store a copy of the original file.
+
+BasePlugin.file_rename_method:The method to be used in renaming the copy of the imported file and associated files.
+
+BasePlugin.rename_method.url:Use url encoding in renaming imported files and associated files.
+
+BasePlugin.rename_method.base64:Use base64 encoding in renaming imported files and associated files.
+
+BasePlugin.rename_method.none:Don't rename imported files and associated files.
+
+BibTexPlugin.desc:BibTexPlugin reads bibliography files in BibTex format. BibTexPlugin creates a document object for every reference in the file. This plugin is a subclass of SplitTextFile class, so if there are multiple records, all are read.
+
+BookPlugin.desc:Creates multi-level document from document containing <<TOC>> level tags. Metadata for each section is taken from any other tags on the same line as the <<TOC>>. e.g. <<Title>>xxxx<</Title>> sets Title metadata. Everything else between TOC tags is treated as simple html (i.e. no HTMLPlugin type of processing is done, such as processing html links). Expects input files to have a .hb file extension by default (this can be changed by adding a -process_exp option); a file with the same name as the hb file but a .jpg extension is taken as the cover image (jpg files are blocked by this plugin). BookPlugin is a simplification (and extension) of the HBPlugin used by the Humanity Development Library collections. BookPlugin is faster as it expects the input files to be cleaner (The input to the HDL collections contains lots of excess html tags around <<TOC>> tags, uses <<I>> tags to specify images, and simply takes all text appearing after a <<TOC>> tag and on the same line as Title metadata). If you're marking up documents to be displayed in the same way as the HDL collections, use this plugin instead of HBPlugin.
+
+CONTENTdmPlugin.desc:Plugin that processes RDF files in exported CONTENTdm collections.
+
+ConvertBinaryFile.apply_fribidi:Run the "fribidi" Unicode Bidirectional Algorithm program over the converted file (for right-to-left text).
+
+ConvertBinaryFile.convert_to:Plugin converts to TEXT or HTML or various types of Image (e.g. JPEG, GIF, PNG).
+
+ConvertBinaryFile.convert_to.auto:Automatically select the format converted to. Format chosen depends on input document type, for example Word will automatically be converted to HTML, whereas PowerPoint will be converted to Greenstone's PagedImage format.
+
+ConvertBinaryFile.convert_to.html:HTML format.
+
+ConvertBinaryFile.convert_to.text:Plain text format.
+
+ConvertBinaryFile.convert_to.pagedimg:A series of images.
+
+ConvertBinaryFile.convert_to.pagedimg_jpg:A series of images in JPEG format.
+
+ConvertBinaryFile.convert_to.pagedimg_gif:A series of images in GIF format.
+
+ConvertBinaryFile.convert_to.pagedimg_png:A series of images in PNG format. 
+
+ConvertBinaryFile.desc:This plugin is inherited by such plugins as WordPlugin, PowerPointPlugin, PostScriptPlugin, RTFPlugin and PDFPlugin. It facilitates the conversion of these document types to either HTML, TEXT or a series of images. It works by dynamically loading an appropriate secondary plugin (HTMLPlugin, StructuredHTMLPlugin, PagedImagePlugin or TextPlugin) based on the plugin argument 'convert_to'. 
+
+ConvertBinaryFile.keep_original_filename:Keep the original filename for the associated file, rather than converting to doc.pdf, doc.doc etc.
+
+ConvertBinaryFile.use_strings:If set, a simple strings function will be called to extract text if the conversion utility fails.
+
+ConvertToRogPlugin.desc:A plugin that inherits from RogPlugin.
+
+CSVPlugin.desc:A plugin for files in comma-separated value format. A new document will be created for each line of the file.
+
+DateExtractor.desc:Helper extractor plugin for extracting historical date information from text.
+
+DateExtractor.extract_historical_years:Extract time-period information from historical documents.  This is stored as metadata with the document. There is a search interface for this metadata, which you can include in your collection by adding the statement, "format QueryInterface DateSearch" to your collection configuration file.
+
+DateExtractor.maximum_century:The maximum named century to be extracted as historical metadata (e.g. 14 will extract all references up to the 14th century).
+
+DateExtractor.maximum_year:The maximum historical date to be used as metadata (in a Common Era date, such as 1950).
+
+DateExtractor.no_bibliography:Do not try to block bibliographic dates when extracting historical dates.
+
+DirectoryPlugin.desc:A plugin which recurses through directories processing each file it finds.
+
+DirectoryPlugin.recheck_directories:After the files in an import directory have been processed, re-read the directory to discover any new files created.
+
+DirectoryPlugin.use_metadata_files:SUPERSEDED - Add MetadataXMLPlugin to the list of plugins in order to read metadata from metadata XML files.
+
+DatabasePlugin.desc:A plugin that imports records from a database. This uses perl's DBI module, which includes back-ends for mysql, postgresql, comma separated values (CSV), MS Excel, ODBC, sybase, etc... Extra modules may need to be installed to use this. See <GSDLHOME>/etc/packages/example.dbi for an example config file. 
+
+DSpacePlugin.desc:A plugin that takes a collection of documents exported from DSpace and imports them into Greenstone.
+	
+DSpacePlugin.first_inorder_ext: This is used to identify the primary document file for a DSpace collection document. With this option, the system will treat the defined ext types of document in sequence to look for the primary document file.
+
+DSpacePlugin.first_inorder_mime:This is used to identify the primary document file for a DSpace collection document. With this option, the system will treat the defined mime types of document in sequence to look for the primary document file.
+
+DSpacePlugin.only_first_doc:This is used to identify the primary document file for a DSpace collection document. With this option, the system will treat the first document referenced in the dublin_core metadata file as the primary document file.
+
+EmailAddressExtractor.desc:Helper extractor plugin for discovering email addresses in text.
+
+EmailAddressExtractor.done_email_extract:done extracting e-mail addresses.
+
+EmailAddressExtractor.extracting_emails:extracting e-mail addresses
+
+EmailAddressExtractor.extract_email:Extract email addresses as metadata.
+
+EmailPlugin.desc:A plugin that reads email files.  These are named with a simple number (i.e. as they appear in maildir folders) or with the extension .mbx (for mbox mail file format).\nDocument text: The document text consists of all the text after the first blank line in the document.\nMetadata (not Dublin Core!):\n\t\$Headers      All the header content (optional, not stored by default)\n\t\$Subject      Subject: header\n\t\$To           To: header\n\t\$From         From: header\n\t\$FromName     Name of sender (where available)\n\t\$FromAddr     E-mail address of sender\n\t\$DateText     Date: header\n\t\$Date         Date: header in GSDL format (eg: 19990924)
+
+EmailPlugin.no_attachments:Do not save message attachments.
+
+EmailPlugin.headers:Store email headers as "Headers" metadata.
+
+EmailPlugin.OIDtype.message_id:Use the message identifier as the document OID. If no message identifier is found, then will use a hash OID.
+
+EmailPlugin.split_exp:A perl regular expression used to split files containing many messages into individual documents.
+
+EmbeddedMetadataPlugin.desc:Plugin that extracts embedded metadata from a variety of file types. It is based on the CPAN module 'ExifTool which includes support for over 70 file formats and 20 metadata formats.  Highlights include: video formats such as AVI, ASF, FLV, MPEG, OGG Vorbis, and WMV; image formats such as BMP, GIF, JPEG, JPEG 2000 and  PNG; audio formats such as AIFF, RealAudio, FLAC, MP3, and WAV; Office document formats such as Encapsulated PostScript, HTML, PDF, and Word.  More details are available at the ExifTool home page http://www.sno.phy.queensu.ca/~phil/exiftool/
+EmbeddedMetadataPlugin.join_before_split:Join fields with multiple entries (e.g. Authors or Keywords) before they are (optionally) split using the specified separator. 
+EmbeddedMetadataPlugin.join_character:The character to use with join_before_split (default is a single space).
+EmbeddedMetadataPlugin.trim_whitespace:Trim whitespace from start and end of any extracted metadata values (Note: this also applies to any values generated through joining with join_before_split or splitting through metadata_field_separator).
+EmbeddedMetadataPlugin.set_filter_list:A comma-separated list of the metadata sets we would like to retrieve.
+EmbeddedMetadataPlugin.set_filter_regexp:A regular expression that filters out the metadata we would like to retrieve.
+
+ExcelPlugin.desc:A plugin for importing Microsoft Excel files (versions 95 and 97).
+
+FavouritesPlugin.desc:Plugin to process Internet Explorer Favourites files.
+
+FOXPlugin.desc:Plugin to process a Foxbase dbt file. This plugin only provides the basic functionality to read in the dbt and dbf files and process each record. A customized plugin based on this general one would need to be written for a particular database to process the appropriate fields.
+
+GreenstoneXMLPlugin.desc:Processes Greenstone Archive XML documents. Note that this plugin does no syntax checking (though the XML::Parser module tests for well-formedness). It's assumed that the Greenstone Archive files conform to their DTD.
+
+GISExtractor.desc:Helper extractor plugin for extracting placenames from text. Requires GIS extension to Greenstone.
+
+GISExtractor.extract_placenames:Extract placenames from within text and set as metadata. Requires GIS extension to Greenstone.
+
+GISExtractor.gazetteer:Gazetteer to use to extract placenames from within text and set as metadata. Requires GIS extension to Greenstone.
+
+GISExtractor.place_list:When extracting placements, include list of placenames at start of the document. Requires GIS extension to Greenstone.
+
+HBPlugin.desc:Plugin which processes an HTML book directory. This plugin is used by the Humanity Development Library collections and does not handle input encodings other than ASCII or extended ASCII. This code is not very clean and could no doubt be made to run faster, by leaving it in this state we hope to encourage the utilisation of BookPlugin instead ;-)\n\nUse BookPlugin if creating a new collection and marking up files like the Humanity Library collections. BookPlugin accepts all input encodings but expects the marked up files to be cleaner than those used by the Humanity Library collections
+
+HBPlugin.encoding.iso_8859_1:Latin1 (western languages)
+
+HTMLImagePlugin.aggressiveness:Range of related text extraction techniques to use.
+HTMLImagePlugin.aggressiveness.1:Filename, path, alternative text (ALT attributes in img HTML tags) only.
+HTMLImagePlugin.aggressiveness.2:All of 1, plus caption where available.
+HTMLImagePlugin.aggressiveness.3:All of 2, plus near paragraphs where available.
+HTMLImagePlugin.aggressiveness.4:All of 3, plus previous headers (<h1>, <h2>...) where available.
+HTMLImagePlugin.aggressiveness.5:All of 4, plus textual references where available.
+HTMLImagePlugin.aggressiveness.6:All of 4, plus metadata tags in HTML pages (title, keywords, etc).
+HTMLImagePlugin.aggressiveness.7:All of 6, 5 and 4 combined.
+HTMLImagePlugin.aggressiveness.8:All of 7, plus duplicating filename, path, alternative text, and caption (raise ranking of more relevant results).
+HTMLImagePlugin.aggressiveness.9:All of 1, plus full text of source page.
+
+HTMLImagePlugin.caption_length:Maximum length of captions (in characters).
+
+HTMLImagePlugin.convert_params:Additional parameters for ImageMagicK convert on thumbnail creation. For example, '-raise' will give a three dimensional effect to thumbnail images.
+
+HTMLImagePlugin.desc:A plugin for extracting images and associated text from webpages.
+
+HTMLImagePlugin.document_text:Add image text as document:text (otherwise IndexedText metadata field).
+
+HTMLImagePlugin.index_pages:Index the pages along with the images. Otherwise reference the pages at the source URL.
+
+HTMLImagePlugin.max_near_text:Maximum characters near images to extract.
+
+HTMLImagePlugin.min_height:Pixels. Skip images shorter than this.
+
+HTMLImagePlugin.min_near_text:Minimum characters of near text or caption to extract.
+
+HTMLImagePlugin.min_size:Bytes. Skip images smaller than this.
+
+HTMLImagePlugin.min_width:Pixels. Skip images narrower than this.
+
+HTMLImagePlugin.neartext_length:Target length of near text (in characters).
+
+HTMLImagePlugin.no_cache_images:Don't cache images (point to URL of original).
+
+HTMLImagePlugin.smallpage_threshold:Images on pages smaller than this (bytes) will have the page (title, keywords, etc) meta-data added.
+
+HTMLImagePlugin.textrefs_threshold:Threshold for textual references. Lower values mean the algorithm is less strict.
+
+HTMLImagePlugin.thumb_size:Max thumbnail size. Both width and height.
+
+HTMLPlugin.assoc_files:Perl regular expression of file extensions to associate with html documents.
+
+HTMLPlugin.desc:This plugin processes HTML files
+
+HTMLPlugin.description_tags:Split document into sub-sections where <Section> tags occur. '-keep_head' will have no effect when this option is set.
+
+HTMLPlugin.extract_style:Extract style and script information from the HTML <head> tag and save as DocumentHeader metadata. This will be set in the document page as the _document:documentheader_ macro.
+
+HTMLPlugin.file_is_url:Set if input filenames make up url of original source documents e.g. if a web mirroring tool was used to create the import directory structure.
+
+HTMLPlugin.hunt_creator_metadata:Find as much metadata as possible on authorship and place it in the 'Creator' field. 
+
+HTMLPlugin.keep_head:Don't remove headers from html files.
+
+HTMLPlugin.metadata_fields:Comma separated list of metadata fields to attempt to extract. Capitalise this as you want the metadata capitalised in Greenstone, since the tag extraction is case insensitive. e.g. Title,Date. Use 'tag<tagname>' to have the contents of the first <tag> pair put in a metadata element called 'tagname'. e.g. Title,Date,Author<Creator>
+
+HTMLPlugin.metadata_field_separator:Separator character used in multi-valued metadata. Will split a metadata field value on this character, and add each item as individual metadata.
+
+HTMLPlugin.no_metadata:Don't attempt to extract any metadata from files.
+
+HTMLPlugin.no_strip_metadata_html:Comma separated list of metadata names, or 'all'. Used with -description_tags, it prevents stripping of HTML tags from the values for the specified metadata.
+
+HTMLPlugin.nolinks:Don't make any attempt to trap links (setting this flag may improve speed of building/importing but any relative links within documents will be broken).
+
+HTMLPlugin.no_image_links:Don't make any attempt to trap image links to allow view images.
+
+HTMLPlugin.rename_assoc_files:Renames files associated with documents (e.g. images). Also creates much shallower directory structure (useful when creating collections to go on cd-rom).
+
+HTMLPlugin.sectionalise_using_h_tags:Automatically create a sectioned document using h1, h2, ... hX tags.
+
+HTMLPlugin.title_sub:Substitution expression to modify string stored as Title. Used by, for example, PDFPlugin to remove "Page 1", etc from text used as the title.
+
+HTMLPlugin.tidy_html:If set, converts an HTML document into a well-formed XHTML to enable users view the document in the book format.
+
+HTMLPlugin.old_style_HDL:To mark whether the file in this collection used the old HDL document's tags style. 
+
+BaseMediaConverter.enable_cache:Cache automatically generated files (such as thumbnails and screen-size images) so they don't need to be repeatedly generated.
+
+ImageConverter.converttotype:Convert main image to format 's'.
+
+ImageConverter.create_screenview:If set to true, create a screen sized image, and set Screen, ScreenType, screenicon, ScreenWidth, ScreenHeight metadata.
+
+ImageConverter.create_thumbnail:If set to true, create a thumbnail version of each image, and add Thumb, ThumbType, thumbicon, ThumbWidth, ThumbHeight metadata.
+ImageConverter.desc:Helper plugin for image conversion using ImageMagick.
+
+ImageConverter.imagemagicknotinstalled:Image Magick not installed
+
+ImageConverter.minimumsize:Ignore images smaller than n bytes.
+
+ImageConverter.noconversionavailable:Image conversion not available
+
+ImageConverter.noscaleup:Don't scale up small images when making thumbnails.
+
+ImageConverter.screenviewsize:Make screenview images of size nxn.
+
+ImageConverter.screenviewtype:Make screenview images in format 's'.
+
+ImageConverter.thumbnailsize:Make thumbnails of size nxn.
+
+ImageConverter.thumbnailtype:Make thumbnails in format 's'.
+
+ImageConverter.win95notsupported: Image Magick not supported on Win95/98
+
+ImagePlugin.desc:This plugin processes images, adding basic metadata
+
+IndexPlugin.desc:This recursive plugin processes an index.txt file. The index.txt file should contain the list of files to be included in the collection followed by any extra metadata to be associated with each file.\n\nThe index.txt file should be formatted as follows: The first line may be a key (beginning with key:) to name the metadata fields (e.g. key: Subject Organization Date). The following lines will contain a filename followed by the value that metadata entry is to be set to. (e.g. 'irma/iw097e 3.2 unesco 1993' will associate the metadata Subject=3.2, Organization=unesco, and Date=1993 with the file irma/iw097e if the above key line was used)\n\nNote that if any of the metadata fields use the Hierarchy classifier plugin then the value they're set to should correspond to the first field (the descriptor) in the appropriate classification file.\n\nMetadata values may be named separately using a tag (e.g. <Subject>3.2) and this will override any name given to them by the key line. If there's no key line any unnamed metadata value will be named 'Subject'.
+
+ISISPlugin.desc:This plugin processes CDS/ISIS databases. For each CDS/ISIS database processed, three files must exist in the collection's import folder: the Master file (.mst), the Field Definition Table (.fdt), and the Cross-Reference File (.xrf).
+
+ISISPlugin.subfield_separator:The string used to separate subfields in CDS/ISIS database records.
+
+ISISPlugin.entry_separator:The string used to separate multiple values for single metadata fields in CDS/ISIS database records.
+
+KeyphraseExtractor.desc:Helper extractor plugin for generating keyphrases from text. Uses Kea keyphrase extraction system.
+
+KeyphraseExtractor.extract_keyphrases:Extract keyphrases automatically with Kea (default settings).
+
+KeyphraseExtractor.extract_keyphrases_kea4:Extract keyphrases automatically with Kea 4.0 (default settings). Kea 4.0 is a new version of Kea that has been developed for controlled indexing of documents in the domain of agriculture.
+
+KeyphraseExtractor.extract_keyphrase_options:Options for keyphrase extraction with Kea. For example: mALIWEB - use ALIWEB extraction model; n5 - extract 5 keyphrase;, eGBK - use GBK encoding.
+
+KeyphraseExtractor.keyphrases:keyphrases
+
+KeyphraseExtractor.missing_kea:Error: The Kea software could not be found at %s. Please download Kea %s from http://www.nzdl.org/Kea and install it in this directory.
+
+LaTeXPlugin.desc:Plugin for LaTeX documents.
+
+LOMPlugin.desc:Plugin for importing LOM (Learning Object Metadata) files.
+
+LOMPlugin.root_tag:The DocType of the XML file (or a regular expression that matches the root element).
+
+LOMPlugin.check_timestamp:Check timestamps of previously downloaded files, and only download again if source file is newer.
+
+LOMPlugin.download_srcdocs:Download the source document if one is specified (in general^identifier^entry or technical^location). This option should specify a regular expression to match filenames against before downloading. Note, this currently doesn't work for documents outside a firewall.
+
+MARCPlugin.desc:Basic MARC plugin.
+
+MARCPlugin.metadata_mapping:Name of file that includes mapping details from MARC values to Greenstone metadata names. Defaults to 'marc2dc.txt' found in the site's etc directory.
+
+MARCXMLPlugin.desc:MARCXML plugin.
+
+MARCXMLPlugin.metadata_mapping_file:Name of file that includes mapping details from MARC values to Greenstone metadata names. Defaults to 'marc2dc.txt' found in the site's etc directory.
+
+MediainfoOGVPlugin.desc:Plugin for importing OGV movie files. Requires Mediainfo (mediainfo.sourceforge.net) to be installed to extract metadata.
+
+MediainfoOGVPlugin.assoc_field:Name of the metadata field that will hold the movie file's name.
+
+MediaWikiPlugin.desc:Plugin for importing MediaWiki web pages
+
+MediaWikiPlugin.show_toc: Add to the collection's About page the 'table of contents' on the MediaWiki website's main page. Needs to specify a Perl regular expression in toc_exp below to match the 'table of contents' section.
+
+MediaWikiPlugin.delete_toc:Delete the 'table of contents' section on each HTML page. Needs to specify a Perl regular expression in toc_exp below to match the 'table of contents' section.
+
+MediaWikiPlugin.toc_exp:A Perl regular expression to match the 'table of contents'. The default value matches common MediaWiki web pages.
+
+MediaWikiPlugin.delete_nav:Delete the navigation section. Needs to specify a Perl regular expression in nav_div_exp below.
+
+MediaWikiPlugin.nav_div_exp:A Perl regular expression to match the navigation section. The default value matches common MediaWiki web pages. 
+
+MediaWikiPlugin.delete_searchbox:Delete the searchbox section. Needs to specify a Perl regular expression in searchbox_div_exp below.
+
+MediaWikiPlugin.searchbox_div_exp:A Perl regular expression to match the searchbox section. The default value matches common MediaWiki web pages.
+
+MediaWikiPlugin.remove_title_suffix_exp:A Perl regular expression to trim the extracted title. For example, \\s-(.+) will trim title contents after "-".
+
+MetadataCSVPlugin.desc:A plugin for metadata in comma-separated value format. The Filename field in the CSV file is used to determine which document the metadata belongs to.
+
+MetadataPass.desc:On-the-side base class to BasePlugin that supports metadata plugins utilise metadata_read pass of import.pl
+
+MetadataXMLPlugin.desc:Plugin that processes metadata.xml files.
+
+GreenstoneMETSPlugin.desc:Process Greenstone-style METS documents
+
+MP3Plugin.desc:Plugin for processing MP3 files.
+
+MP3Plugin.assoc_images:Use Google image search to locate images related to MP3 file based on ID3 Title and Artist metadata.
+
+MP3Plugin.applet_metadata:Used to store [applet] metadata for each document that contains the necessary HTML for an MP3 audio player applet to play that file.
+
+MP3Plugin.metadata_fields:Comma separated list of metadata fields to extract (assuming present) in an MP3 file. Use \"*\" to extract all the fields.
+
+NulPlugin.desc:Dummy (.nul) file plugin. Used with the files produced by exploding metadata database files.
+
+NulPlugin.assoc_field:Name of a metadata field that will be set for each nul file.
+NulPlugin.add_metadata_as_text:Add a table of metadata as the text of the document, rather than "This document has no text".
+
+NulPlugin.remove_namespace_for_text:Remove namepsaces from metadata names in the document text (if add_metadata_as_text is set).
+
+OAIPlugin.desc:Basic Open Archives Initiative (OAI) plugin.
+
+OAIPlugin.document_field:The metadata element specifying the file name of documents to attach the metadata to.
+
+OAIPlugin.metadata_set:Metadata set (namespace prefix) to import all metadata as
+OAIPlugin.metadata_set.auto:Use the prefixes specified in the OAI record
+OAIPlugin.metadata_set.dc: Use the dc prefix. Will map qualified dc elements into their Greenstone form, eg spatial becomes dc.Coverage^spatial.
+
+OAIMetadataXMLPlugin.desc:Version of MetadataXMLPlugin that processes metadata.xml files. Additionally, it uses the "dc.Identifier" field and extracts OAI metadata from the specified OAI server (-oai_server_http_path)
+
+OAIMetadataXMLPlugin.oai_server_http_path: HTTP Path to the OAI server - e.g. http://test.com/oai_server/oai.pl
+
+OAIMetadataXMLPlugin.metadata_prefix: OAI metadata prefix - default oai_dc
+
+OAIMetadataXMLPlugin.koha_mode: If specified, the plugin will try to generate the oaiextracted.koharecordlink metadata. This metadata contains the link back to Koha document.
+
+OggVorbisPlugin.add_technical_metadata:Add technical (eg. bitrate) metadata.
+
+OggVorbisPlugin.desc:A plugin for importing Ogg Vorbis audio files.
+
+OpenDocumentPlugin.desc:Plugin for OASIS OpenDocument format documents (used by OpenOffice 2.0)
+
+PagedImagePlugin.desc:Plugin for documents made up of a sequence of images, with optional OCR text for each image. This plugin processes .item files which list the sequence of image and text files, and provide metadata.
+
+PagedImagePlugin.documenttype:Set the document type (used for display)
+
+PagedImagePlugin.documenttype.paged:Paged documents have next and previous arrows and a 'go to page X' box
+
+PagedImagePlugin.documenttype.hierarchy:Hierarchical documents have a table of contents
+
+PagedImagePlugin.headerpage:Add a top level header page (that contains no image) to each document.
+
+PDFPlugin.allowimagesonly:Allow PDF files with no extractable text. Avoids the need to have -complex set. Only useful with convert_to html.
+
+PDFPlugin.complex:Create more complex output. With this option set the output html will look much more like the original PDF file. For this to function properly you Ghostscript installed (for *nix gs should be on your path while for windows you must have gswin32c.exe on your path).
+
+PDFPlugin.desc:Plugin that processes PDF documents.
+
+PDFPlugin.nohidden:Prevent pdftohtml from attempting to extract hidden text. This is only useful if the -complex option is also set.
+
+PDFPlugin.noimages:Don't attempt to extract images from PDF.
+
+PDFPlugin.use_sections:Create a separate section for each page of the PDF file.
+
+PDFPlugin.zoom:The factor by which to zoom the PDF for output (this is only useful if -complex is set).
+
+PostScriptPlugin.desc:This is a \"poor man's\" ps to text converter. If you are serious, consider using the PRESCRIPT package, which is available for download at http://www.nzdl.org/html/software.html
+
+PostScriptPlugin.extract_date:Extract date from PS header.
+
+PostScriptPlugin.extract_pages:Extract pages from PS header.
+
+PostScriptPlugin.extract_title:Extract title from PS header.
+
+PowerPointPlugin.desc:A plugin for importing Microsoft PowerPoint files.
+
+PowerPointPlugin.windows_scripting:Use MicroSoft Windows scripting technology (Visual Basic for Applications) to get PPT to convert document to various image types (e.g. JPEG,PNG,GIF) rather than rely on the open source package ppttohtml. 
+
+PowerPointPlugin.convert_to.html_multi:A series of HTML pages, two per slide. One for the slide image, one for the slide text (needs -openoffice_conversion).
+
+PowerPointPlugin.convert_to.pagedimg:A series of JPEG images (needs -openoffice_conversion).
+
+PowerPointPlugin.convert_to.pagedimg_jpg:A series of images in JPEG format (needs -windows_scripting).
+
+PowerPointPlugin.convert_to.pagedimg_gif:A series of images in GIF format (needs -windows_scripting).
+
+PowerPointPlugin.convert_to.pagedimg_png:A series of images in PNG format (needs -windows_scripting). 
+
+PrintInfo.bad_general_option:The %s plugin uses an incorrect option. Check your collect.cfg configuration file.
+
+PrintInfo.desc:Most base plugin, handles printing info (using pluginfo.pl) and parsing of the arguments.
+
+ProCitePlugin.desc:A plugin for (exported) ProCite databases
+
+ProCitePlugin.entry_separator:The string used to separate multiple values for single metadata fields in ProCite database records.
+
+ReadTextFile.could_not_extract_encoding:WARNING: encoding could not be extracted from %s - defaulting to %s
+
+ReadTextFile.could_not_extract_language:WARNING: language could not be extracted from %s - defaulting to %s
+
+ReadTextFile.could_not_open_for_reading:could not open %s for reading
+
+ReadTextFile.default_encoding:Use this encoding if -input_encoding is set to 'auto' and the text categorization algorithm fails to extract the encoding or extracts an encoding unsupported by Greenstone. This option can take the same values as -input_encoding.
+
+ReadTextFile.default_language:If Greenstone fails to work out what language a document is the 'Language' metadata element will be set to this value. The default is 'en' (ISO 639 language symbols are used: en = English). Note that if -input_encoding is not set to 'auto' and -extract_language is not set, all documents will have their 'Language' metadata set to this value.
+
+ReadTextFile.desc:Base plugin for files that are plain text.
+
+ReadTextFile.empty_file:file contains no text
+
+ReadTextFile.extract_language:Identify the language of each document and set 'Language' metadata. Note that this will be done automatically if -input_encoding is 'auto'.
+
+ReadTextFile.file_has_no_text:ERROR: %s contains no text
+
+ReadTextFile.input_encoding:The encoding of the source documents. Documents will be converted from these encodings and stored internally as utf8.
+
+ReadTextFile.input_encoding.auto:Use text categorization algorithm to automatically identify the encoding of each source document. This will be slower than explicitly setting the encoding but will work where more than one encoding is used within the same collection.
+
+ReadTextFile.read_denied:Read permission denied for %s
+
+ReadTextFile.separate_cjk:Insert spaces between Chinese/Japanese/Korean characters to make each character a word. Use if text is not segmented.
+
+ReadTextFile.unsupported_encoding:WARNING: %s appears to be encoded in an unsupported encoding (%s) - using %s
+
+ReadTextFile.wrong_encoding:WARNING: %s was read using %s encoding but appears to be encoded as %s.
+
+ReadXMLFile.desc:Base class for XML plugins.
+
+ReadXMLFile.xslt:Transform a matching input document with the XSLT in the named file.  A relative filename is assumed to be in the collection's file area, for instance etc/mods2dc.xsl.
+
+RealMediaPlugin.desc:A plugin for processing Real Media files.
+
+ReferPlugin.desc:ReferPlugin reads bibliography files in Refer format.
+
+RogPlugin.desc:Creates simple single-level documents from .rog or .mdb files.
+
+RTFPlugin.desc:Plugin for importing Rich Text Format files.
+
+SourceCodePlugin.desc:Filename is currently used for Title ( optionally minus some prefix ). Current languages:\ntext: READMEs/Makefiles\nC/C++   (currently extracts #include statements and C++ class decls)\nPerl    (currently only done as text)\nShell   (currently only done as text)
+
+SourceCodePlugin.remove_prefix:Remove this leading pattern from the filename (eg -remove_prefix /tmp/XX/src/). The default is to remove the whole path from the filename.
+
+SplitTextFile.desc:SplitTextFile is a plugin for splitting input files into segments that will then be individually processed. This plugin should not be called directly.  Instead, if you need to process input files that contain several documents, you should write a plugin with a process function that will handle one of those documents and have it inherit from SplitTextFile.  See ReferPlugin for an example.
+
+SplitTextFile.split_exp:A perl regular expression to split input files into segments.
+
+StructuredHTMLPlugin.desc:A plugin to process structured HTML documents, splitting them into sections based on style information.
+
+StructuredHTMLPlugin.delete_toc:Remove any table of contents, list of figures etc from the converted HTML file. Styles for these are specified by the toc_header option.
+
+StructuredHTMLPlugin.title_header:possible user-defined styles for the title header.
+
+StructuredHTMLPlugin.level1_header:possible user-defined styles for the level1 header in the HTML document (equivalent to <h1>).
+
+StructuredHTMLPlugin.level2_header:possible user-defined styles for the level2 header in the HTML document (equivalent to <h2>).
+
+StructuredHTMLPlugin.level3_header:possible user-defined styles for the level3 header in the HTML document (equivalent to <h3>).
+
+StructuredHTMLPlugin.toc_header:possible user-defined header styles for the table of contents, table of figures etc, to be removed if delete_toc is set.
+
+TextPlugin.desc:Creates simple single-level document. Adds Title metadata of first line of text (up to 100 characters long).
+
+TextPlugin.title_sub:Substitution expression to modify string stored as Title. Used by, for example, PostScriptPlugin to remove "Page 1" etc from text used as the title.
+
+UnknownPlugin.assoc_field:Name of the metadata field that will hold the associated file's name.
+
+UnknownPlugin.desc:This is a simple Plugin for importing files in formats that Greenstone doesn't know anything about.  A fictional document will be created for every such file, and the file itself will be passed to Greenstone as the \"associated file\" of the document.
+
+UnknownPlugin.file_format:Type of the file (e.g. MPEG, MIDI, ...)
+
+UnknownPlugin.mime_type:Mime type of the file (e.g. image/gif).
+
+UnknownPlugin.process_extension:Process files with this file extension. This option is an alternative to process_exp that is simpler to use but less flexible.
+
+UnknownPlugin.srcicon:Specify a macro name (without underscores) to use as srcicon metadata.
+
+WordPlugin.desc:A plugin for importing Microsoft Word documents.
+
+WordPlugin.windows_scripting:Use MicroSoft Windows scripting technology (Visual Basic for Applications) to get Word to convert document to HTML rather than rely on the open source package WvWare.  Causes Word application to open on screen if not already running.
+
+WordPlugin.metadata_fields: This is to retrieve metadata from the HTML document converted by VB scripting. It allows users to define comma separated list of metadata fields to attempt to extract. Use 'tag<tagname>' to have the contents of the first <tagname> pair put in a metadata element called 'tagname'. Capitalise this as you want the metadata capitalised in Greenstone, since the tag extraction is case insensitive
+
+ZIPPlugin.desc:Plugin which handles compressed and/or archived input formats currently handled formats and file extensions are:\ngzip (.gz, .z, .tgz, .taz)\nbzip (.bz)\nbzip2 (.bz2)\nzip (.zip .jar)\ntar (.tar)\n\nThis plugin relies on the following utilities being present (if trying to process the corresponding formats):\ngunzip (for gzip)\nbunzip (for bzip)\nbunzip2 \nunzip (for zip)\ntar (for tar)
+
+#
+# Download module option descriptions
+#
+
+BaseDownload.desc:Base class for Download modules
+BaseDownload.bad_general_option:The %s download module uses an incorrect option.
+MediaWikiDownload.desc:A module for downloading from MediaWiki websites
+MediaWikiDownload.reject_filetype:Ignore url list, separate by comma, e.g.*cgi-bin*,*.ppt ignores hyperlinks that contain either 'cgi-bin' or '.ppt'
+MediaWikiDownload.reject_filetype_disp:Ignore URL patterns
+MediaWikiDownload.exclude_directories:List of exclude directories (must be absolute path to the directory), e.g. /people,/documentation will exclude the 'people' and 'documentation' subdirectory under the currently crawling site.
+MediaWikiDownload.exclude_directories_disp:Exclude directories
+
+OAIDownload.desc:A module for downloading from OAI repositories
+OAIDownload.url_disp:Source URL
+OAIDownload.url:OAI repository URL
+OAIDownload.set_disp:Restrict to set
+OAIDownload.set:Restrict the download to the specified set in the repository
+OAIDownload.metadata_prefix_disp:Metadata prefix
+OAIDownload.metadata_prefix:The metadata format used in the exported, e.g. oai_dc, qdc, etc. Press the <Server information> button to find out what formats are supported.
+OAIDownload.get_doc_disp:Get document
+OAIDownload.get_doc:Download the source document if one is specified in the record
+OAIDownload.get_doc_exts_disp:Only include file types
+OAIDownload.get_doc_exts:Permissible filename extensions of documents to get
+OAIDownload.max_records_disp:Max records
+OAIDownload.max_records:Maximum number of records to download
+
+SRWDownload.desc:A module for downloading from SRW (Search/Retrieve Web Service) repositories
+
+WebDownload.desc:A module for downloading from the Internet via HTTP or FTP
+WebDownload.url:Source URL. In case of http redirects, this value may change
+WebDownload.url_disp:Source URL
+WebDownload.depth:How many hyperlinks deep to go when downloading
+WebDownload.depth_disp:Download Depth
+WebDownload.below:Only mirror files below this URL
+WebDownload.below_disp:Only files below URL
+WebDownload.within:Only mirror files within the same site
+WebDownload.within_disp:Only files within site
+WebDownload.html_only:Download only HTML files, and ignore associated files e.g images and stylesheets
+WebDownload.html_only_disp:Only HTML files
+
+WgetDownload.desc: Base class that handles calls to wget
+WgetDownload.proxy_on:Proxy on
+WgetDownload.proxy_host:Proxy host
+WgetDownload.proxy_port:Proxy port
+WgetDownload.user_name:User name
+WgetDownload.user_password:User password
+
+Z3950Download.desc:A module for downloading from Z3950 repositories
+Z3950Download.host:Host URL
+Z3950Download.host_disp:Host 
+Z3950Download.port:Port number of the repository
+Z3950Download.port_disp:Port
+Z3950Download.database:Database to search for records in
+Z3950Download.database_disp:Database
+Z3950Download.find:Retrieve records containing the specified search term
+Z3950Download.find_disp:Find
+Z3950Download.max_records:Maximum number of records to download
+Z3950Download.max_records_disp:Max Records
+
+
+#
+#Plugout option descriptions
+#
+
+BasPlugout.bad_general_option:The %s plugout uses an incorrect option.
+BasPlugout.debug:Set debugging mode
+BasPlugout.desc:Base class for all the export plugouts.
+BasPlugout.group_size:Number of documents to group into one XML file.
+BasPlugout.gzip_output:Use gzip to compress resulting xml documents (don't forget to include ZIPPlugin in your plugin list when building from compressed documents).
+BasPlugout.output_handle: the file descriptor used to receive output data
+BasPlugout.output_info:The reference to an arcinfo object used to store information about the archives.
+BasPlugout.verbosity:Controls the quantity of output. 0=none, 3=lots.
+BasPlugout.xslt_file:Transform a document with the XSLT in the named file.  
+
+DSpacePlugout.desc:DSpace Archive format.
+DSpacePlugout.metadata_prefix:Comma separated list of metadata prefixes to include in the exported data.  For example, setting this value to 'dls' will generate a metadata_dls.xml file for each document exported in the format needed by DSpace.
+
+FedoraMETSPlugout.desc:METS format using the Fedora profile.
+FedoraMETSPlugout.fedora_namespace:The prefix used in Fedora for process ids (PIDS) e.g. greenstone:HASH0122efe4a2c58d0
+
+GreenstoneXMLPlugout.desc:Greenstone XML Archive format.
+
+GreenstoneMETSPlugout.desc:METS format using the Greenstone profile.
+
+MARCXMLPlugout.desc:MARC xml format.
+MARCXMLPlugout.group:Output the marc xml records into a single file.
+MARCXMLPlugout.mapping_file:Use the named mapping file for the transformation.
+
+METSPlugout.desc:Superclass plugout for METS format.  Provides common functionality for profiles such as GreenstoneMETS and FedoraMETS and key abstract methods.
+METSPlugout.xslt_txt:Transform a mets's doctxt.xml with the XSLT in the named file.  
+METSPlugout.xslt_mets:Transform a mets's docmets.xml with the XSLT in the named file.  
+
+#
+# Perl module strings
+#
+
+classify.could_not_find_classifier:ERROR: Could not find classifier \"%s\"
+
+download.could_not_find_download:ERROR: Could not find download module \"%s\"
+
+plugin.could_not_find_plugin:ERROR: Could not find plugin \"%s\"
+
+plugin.including_archive:including the contents of 1 ZIP/TAR archive
+
+plugin.including_archives:including the contents of %d ZIP/TAR archives
+
+plugin.kill_file:Process killed by .kill file
+
+plugin.n_considered:%d documents were considered for processing
+
+plugin.n_included:%d were processed and included in the collection
+
+plugin.n_rejected:%d were rejected
+
+plugin.n_unrecognised:%d were unrecognised
+
+plugin.no_plugin_could_process:WARNING: No plugin could process %s
+
+plugin.no_plugin_could_recognise:WARNING: No plugin could recognise %s
+
+plugin.no_plugin_could_process_this_file:no plugin could process this file
+
+plugin.no_plugin_could_recognise_this_file:no plugin could recognise this file
+
+plugin.one_considered:1 document was considered for processing
+
+plugin.one_included:1 was processed and included in the collection
+
+plugin.one_rejected:1 was rejected
+
+plugin.one_unrecognised:1 was unrecognised
+
+plugin.see_faillog:See %s for a list of unrecognised and/or rejected documents
+
+PrintUsage.default:Default
+
+PrintUsage.required:REQUIRED
+
+plugout.could_not_find_plugout:ERROR: Could not find plugout \"%s\"
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/strings_ar.properties
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/strings_ar.properties	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/strings_ar.properties	(revision 24799)
@@ -0,0 +1,3853 @@
+#
+# Resource bundle description
+#
+
+Language.code:ar
+Language.name:Arabic
+
+OutputEncoding.unix:utf-8
+OutputEncoding.windows:utf-8
+
+
+#
+# Common output messages and strings
+#
+
+common.cannot_create_file:Ø®Ø·Ø£: ÙØ§ÙÙ
+ÙÙ Ø¥ÙØŽØ§Ø¡ Ø§ÙÙ
+ÙÙ %s
+
+common.cannot_find_cfg_file:Ø®Ø·Ø£: ÙØ§ ÙÙ
+ÙÙ Ø¥ÙØ¬Ø§Ø¯ Ù
+ÙÙ Ø§ÙØ¥Ø¹Ø¯Ø§Ø¯ %s
+
+common.cannot_open:Ø®Ø·Ø£: ÙØ§ ÙÙ
+ÙÙ ÙØªØ­ %s
+
+common.cannot_open_fail_log:Ø®Ø·Ø£: ÙØ§ ÙÙ
+ÙÙ ÙØªØ­ Ù
+Ø¯ÙÙØ© Ø§ÙØ®Ø·Ø£ %s
+
+common.cannot_open_output_file:Ø®Ø·Ø£: ÙØ§ ÙÙ
+ÙÙ ÙØªØ­ Ù
+ÙÙ Ø§ÙÙ
+Ø®Ø±Ø¬Ø§Øª %s
+
+common.cannot_read:Ø®Ø·Ø£: ÙØ§ ÙÙ
+ÙÙ ÙØ±Ø§Ø¡Ø© %s
+
+common.cannot_read_file:Ø®Ø·Ø£: ÙØ§ ÙÙ
+ÙÙ ÙØ±Ø§Ø¡Ø© %s
+
+common.general_options:Ø®ÙØ§Ø±Ø§Øª Ø¹Ø§Ù
+Ø© (Ù %s)
+
+common.must_be_implemented:ÙØ±Ø§Ø¡Ø© Ø¯Ø§ÙØ© ÙØ¬Øš ØªÙÙÙØ°ÙØ§ ÙÙ ÙØŠØ© ÙØ±Ø¹ÙØ© ÙÙ
+ÙØ§ØšØ³ Ù
+ØªÙØ±Ø±Ø©.  
+
+common.options:Ø®ÙØ§Ø±Ø§Øª
+
+common.processing:Ù
+Ø¹Ø§ÙØ¬Ø©
+
+common.specific_options:Ø®ÙØ§Ø±Ø§Øª Ù
+Ø­Ø¯Ø¯Ø©
+
+common.usage:Ø¥Ø³ØªØ¹Ù
+Ø§Ù
+
+common.info:Ù
+Ø¹ÙÙÙ
+Ø§Øª
+
+common.invalid_options:Ù
+Ø¶Ù
+ÙÙ ØºÙØ± ØµØ§ÙØ­: %s
+
+common.true:ØµØ­ÙØ­  
+
+common.false:Ø²Ø§ØŠÙ  
+
+common.deprecated:Ù
+ØªØ±ÙÙ  
+#
+# Script option descriptions and output messages
+#
+
+scripts.language:ÙØºØ© Ø¹Ø±Ø¶ ÙØµÙ Ø§ÙØ®ÙØ§Ø±Ø§Øª ÙÙ (Ù
+Ø«Ø§ÙØ 'en_us'ÙØ­Ø¯Ø¯ Ø§ÙØ¥Ù
+ÙØ§Ø¡ Ø§ÙØ£Ù
+Ø±ÙÙÙ ). ÙØªØ·ÙØš ØªØ±Ø¬Ù
+Ø© ÙØµÙ Ø§ÙØ®ÙØ§Ø±Ø§Øª Ø§ÙÙ
+ØªÙÙØ±Ø© ÙÙ Ù
+ÙÙ
+
+scripts.xml:ØªÙØªØ¬ Ù
+Ø¹ÙÙÙ
+Ø§Øª ÙÙ ØŽÙÙ Ù
+ÙÙ XML Ø ØšØ¯ÙÙ ØŽÙÙ Ø¹Ø±Ø¶ "Ø¬Ù
+ÙÙ" Ù ÙÙÙ ØšØªÙÙØ± ØªÙØ§ØµÙÙ Ø£ÙØ«Ø±  
+
+scripts.listall:Ø¹Ø±Ø¶ Ø§ÙØ®ÙØ§Ø±Ø§Øª ÙÙÙ Ø§ÙØ¹ÙØ§ØµØ± Ø§ÙÙ
+Ø¹Ø±ÙÙØ© Ø­ÙÙ  
+
+scripts.describeall:Ø®ÙØ§Ø±Ø§Øª Ø§ÙØ¹Ø±Ø¶ ÙÙÙ Ø§ÙÙ
+ÙØ§Ø¯ Ø§ÙÙ
+Ø¹Ø±ÙÙØ©.  
+
+scripts.both_old_options:ØªØ­Ø°ÙØ±: ÙÙ
+ ÙØªÙ
+ ØªØ­Ø¯ÙØ¯ Ø§ÙØ£Ø«ÙÙÙ  -Ø­Ø°Ù Ø§ÙÙØ¯ÙÙ
+ Ù  -Ø­ÙØž Ø§ÙÙØ¯ÙÙ
+, Ø§ÙÙÙÙ
+Ø© Ø§ÙØ¥ÙØªØ±Ø§Ø¶ÙØ© ÙÙ  -Ø­Ø°Ù Ø§ÙÙØ¯ÙÙ
+. Ø³ÙÙ ÙØªÙ
+ Ø­Ø°Ù Ù
+Ø­ØªÙÙØ§Øª Ù
+Ø³Ø§Ø± %s
+
+scripts.no_old_options:ØªØ­Ø°ÙØ±: ÙÙ
+ ÙØªÙ
+ ØªØ­Ø¯ÙØ¯   -Ø­Ø°Ù Ø§ÙÙØ¯ÙÙ
+ Ø£Ù  -Ø­ÙØž Ø§ÙÙØ¯ÙÙ
+, Ø§ÙÙÙÙ
+Ø© Ø§ÙØ¥ÙØªØ±Ø§Ø¶ÙØ© ÙÙ  -Ø­Ø°Ù Ø§ÙÙØ¯ÙÙ
+. Ø³ÙÙ ÙØªÙ
+ Ø­Ø°Ù Ù
+Ø­ØªÙÙØ§Øª Ù
+Ø³Ø§Ø± %s
+
+scripts.gli:Ø§Ø³ØªØ®Ø¯Ù
+ Ø§ÙØ¹ÙÙ
+ Ø¹ÙØ¯ ØªØŽØºÙÙ ÙØ°Ù Ø§ÙÙ
+Ø®Ø·ÙØ·Ø© Ù
+Ù gli ØªÙØŽÙØ· Ø§ÙÙ
+Ø®Ø±Ø¬Ø§Øª Ø§ÙÙ
+Ø®ØµØµØ© Ù gli".  
+
+# -- buildcol.pl --
+
+buildcol.archivedir:Where the archives live.
+
+buildcol.builddir:Ø£ÙÙ ØªÙØ¶Ø¹ Ø§ÙÙØŽØ§ÙØ§Øª Ø§ÙÙ
+ØšÙÙØ©.
+
+buildcol.cachedir:Ø³ÙÙ ÙØªÙ
+ Ù
+Ø€ÙØªØ§ ØšÙØ§Ø¡ Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø© ÙÙØ§ ÙØšÙ ÙØ³Ø®ÙØ§ Ø¥ÙÙ Ù
+Ø³Ø§Ø± Ø§ÙØšÙØ§Ø¡.
+
+buildcol.cannot_open_cfg_file:ØªØ­Ø°ÙØ±: ÙØ§ ÙÙ
+ÙÙ ÙØªØ­ Ù
+ÙÙ Ø§ÙØªÙÙÙÙ ÙÙØªØ­Ø¯ÙØ« %s
+
+buildcol.collectdir:Ù
+Ø³Ø§Ø± Ø¯ÙÙÙ "Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø©".  
+
+buildcol.copying_back_cached_build:Ø¥Ø¹Ø§Ø¯Ø© Ø§ÙØ·ØšØ§Ø¹Ø© ÙÙ cached build  
+
+buildcol.create_images:Ø­Ø§ÙÙ Ø£Ù ØªÙØŽÙØ¡ ØµÙØ± ØªÙÙØ§ØŠÙØ© ÙÙÙ
+Ø¬Ù
+ÙØ¹Ø©. ÙÙØ°Ø§ ÙØ¹ØªÙ
+Ø¯ Ø¹ÙÙ ØšØ±ÙØ§Ù
+Ø¬ Gimp Ø§ÙÙ
+Ø«ØšØª Ø¹ÙÙ ØšØ±ÙØ§Ù
+Ø¬ Perl ÙÙ ÙØ³Ù
+Ø­ ØšØ§ÙÙØªØ§ØšØ© ÙÙ.  
+
+buildcol.debug:Ø·ØšØ§Ø¹Ø© Ø§ÙÙ
+Ø®Ø±Ø¬Ø§Øª Ø¥ÙÙ STDOUT.
+
+buildcol.desc:ÙØµ Perl Ø§ÙØ°Ù ÙØ³ØªØ®Ø¯Ù
+ ÙØšÙØ§Ø¡ Ù
+Ø¬Ù
+ÙØ¹Ø© ÙØ±ÙÙØ³ØªÙÙ Ù
+Ù Ø£Ø±ØŽÙÙ Ø§ÙÙØ«Ø§ØŠÙ  .  
+
+buildcol.faillog:Ù
+Ø¯ÙÙØ© Ù
+ÙÙØ§Øª Ø§ÙØ¥Ø¬Ø±Ø§Ø¡Ø§Øª Ø§ÙÙØ§ØŽÙØ©Ø ØªØªØ¶Ù
+Ù ÙØ°Ù Ø§ÙÙ
+Ø¯ÙÙØ© Ø§Ø³Ù
+Ø§Ø¡ Ù
+ÙÙØ§Øª Ø§ÙØ¥Ø¬Ø±Ø§Ø¡Ø§Øª Ø§ÙØªÙ ÙØŽÙØª  
+
+buildcol.incremental_default_builddir:ØªØ­Ø°ÙØ± : Ø¯ÙÙÙ Ø§ÙØšÙØ§Ø¡ ÙØ¶Ø¹ Ø¥ÙØªØ±Ø§Ø¶ÙØ§ ÙÙ Ø­Ø§ÙØ© ' ØšÙØ§Ø¡ '. Ø¥Ø°Ø§ ÙÙØª ØªØ±ÙØ¯ Ø£Ù ØªØ¶ÙÙ ØªØ¯Ø±ÙØ¬ÙØ§ Ø¥ÙÙ  Ø¯ÙÙÙ Ø§ÙÙØŽØ§Ù Ø ÙØ±Ø¬Ù Ø§Ø³ØªØ®Ø¯Ø§Ù
+ Ø®ÙØ§Ø±  ""-builddir index" Ù" buildcol.pl""  
+
+buildcol.index:ÙØŽØ§Ù ÙÙØšÙØ§Ø¡ (Ø¥Ø°Ø§ ÙÙ
+ ÙØ­Ø¯Ø¯ Ø³ÙÙ ÙØªÙ
+ ØšÙØ§Ø¡ ÙÙ Ø§ÙÙØŽØ§ÙØ§Øª ÙÙ Ù
+ÙÙ Ø§ÙØ¥Ø¹Ø¯Ø§Ø¯  
+
+buildcol.incremental:ØªÙØŽÙÙ Ø§ÙÙØ«Ø§ØŠÙ Ø§ÙØªÙ ÙÙ
+ ÙØªÙ
+ ØªÙØŽÙÙÙØ§ Ù
+Ù ÙØšÙ.ØªØ·ØšÙÙ -keepold. ØªØ¹ØªÙ
+Ø¯ Ø¹ÙÙ Ù
+ÙØŽÙ lucene .  
+
+buildcol.keepold:ÙÙ ØªØ­Ø·Ù
+ Ø§ÙÙ
+Ø­ØªÙÙØ§Øª Ø§ÙØ­Ø§ÙÙØ© ÙØ¯ÙÙÙ Ø§ÙØšÙØ§Ø¡  
+
+buildcol.maxdocs:Ø§ÙØ¹Ø¯Ø¯ Ø§ÙØ£ÙØµÙ ÙÙÙØ«Ø§ØŠÙ ÙÙØšÙØ§Ø¡.
+buildcol.maxnumeric:Ø£ÙØµÙ Ø¹Ø¯Ø¯ Ø­Ø±ÙÙ ÙÙÙÙ
+Ø© ÙÙ
+ÙÙ Ø£Ù ÙÙÙÙ ÙÙ ÙØ§Ù
+ÙØ³ Ø§ÙÙØŽØ§Ù. Ø§ÙØ£Ø±ÙØ§Ù
+ Ø§ÙÙØšÙØ±Ø© ØªÙÙØ³Ù
+ Ø¥ÙÙ Ø¹Ø¯Ø© ÙÙÙ
+Ø§Øª ÙÙØªÙØŽÙÙ. Ø¹ÙÙ Ø³ØšÙÙ Ø§ÙÙ
+Ø«Ø§Ù: ÙÙ ÙØ§Ù Ø£ÙØµÙ Ø¹Ø¯Ø¯ Ø­Ø±ÙÙ ÙÙ 4 ÙØ¥Ù "1342663" Ø³ÙÙ ØªÙÙØ³Ù
+ Ø¥ÙÙ "1342" Ù "663".  
+buildcol.mode:Ø§Ø¬Ø²Ø§Ø¡ Ø¹Ù
+ÙÙØ© Ø§ÙØšÙØ§Ø¡ ÙÙÙ
+ÙØ§ØµÙØ©
+buildcol.mode.all:Ø¥ÙØ¹Ù ÙÙ ØŽÙ.
+buildcol.mode.build_index:ØªÙØŽÙÙ Ø§ÙÙØµ ÙÙØ·.
+buildcol.mode.compress_text:Ø¶ØºØ· Ø§ÙÙØµ ÙÙØ·.
+buildcol.mode.infodb:ØšÙØ§Ø¡ ÙØ§Ø¹Ø¯Ø© ØšÙØ§ÙØ§Øª ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª
+
+buildcol.no_default_images:ÙÙ ÙØªÙ
+ ØªÙÙÙØ¯ Ø§ÙØµÙØ± Ø§ÙØ¥ÙØªØ±Ø§Ø¶ÙØ©.
+
+buildcol.no_image_script:ØªØ­Ø°ÙØ±: Ø§ÙØµÙØ± ØªØ¬Ø¹Ù Ø§ÙÙØµ ØºÙØ± Ù
+ÙØ¬ÙØ¯: %s  
+
+buildcol.no_strip_html:ÙØ§ ØªÙÙÙ
+ ØšØ¥Ø²Ø§ÙØ© Ø¹ÙØ§Ù
+Ø§Øª HTML Ù
+Ù Ø§ÙÙØµ Ø§ÙÙ
+ÙØŽÙ (ØªØ³ØªØ®Ø¯Ù
+ ÙÙØ· Ù
+Ø¹ Ù
+Ø¬Ù
+ÙØ¹Ø§Øª mgpp).  
+
+buildcol.no_text:ÙØ§ ØªØ¶ØºØ· Ø§ÙÙØµ.ÙØ°Ø§ Ø§ÙØ®ÙØ§Ø± Ù
+ÙÙØ¯ ØªÙÙÙÙ Ø­Ø¬Ù
+ Ø§ÙÙØŽØ§ÙØ§Øª Ø§ÙÙ
+ØšÙÙØ© Ø¥Ø°Ø§ ÙÙØª ØªÙÙÙ Ø¯Ø§ØŠÙ
+Ø§ Ø¹Ø±Ø¶ Ø¹Ø±Ø¶ Ø§ÙÙØ«Ø§ØŠÙ ÙÙ Ø²Ù
+Ù Ø§ÙØªØŽØºÙÙ Ø§ÙÙØ¹ÙÙ (Ù
+Ø«Ø§Ù.ÙÙ ØªØ³ØªØ·ÙØ¹
+
+buildcol.sections_index_document_metadata:ØªÙØŽÙÙ ÙØ«ÙÙØ© Ù
+Ø³ØªÙÙ Ø§ÙÙØ§ØµÙØ§Øª Ø¹ÙÙ Ù
+Ø³ØªÙÙ Ø§ÙØ£ÙØ³Ø§Ù
+  
+buildcol.sections_index_document_metadata.never:ÙØ§ ØªÙØŽÙ Ø§Ù ÙØ§ØµÙØ§Øª ØšÙØ§ÙØ§Øª ÙÙÙØ«ÙÙØ© Ø¹ÙØ¯ Ù
+Ø³ØªÙÙ Ø§ÙÙØ³Ù
+
+buildcol.sections_index_document_metadata.always:Ø§Ø¶Ù ÙÙ Ø§ÙÙ
+Ø®ØµØµ
+buildcol.sections_index_document_metadata.unless_section_metadata_exists:Ø£Ø¶Ù Ù
+ÙØªØ§Ø¯Ø§ØªØ§ Ø§ÙÙ
+Ø³ØªÙÙ ÙÙØ· Ø¥Ø°Ø§ ÙÙ
+ ÙÙÙ ÙÙØ§Ù Ù
+ÙØªØ§Ø¯Ø§ØªØ§ ÙØ³Ù
+ Ù
+Ø°ÙØ±ÙØ© ÙÙØ°Ø§ Ø§ÙØ§Ø³Ù
+.  
+
+buildcol.out:Ø¥Ø³Ù
+ Ù
+ÙÙ Ø£Ù Ø£Ù Ù
+Ø¹Ø§ÙØ¬Ø© ÙØ·ØšØ§Ø¹Ø© Ø­Ø§ÙØ© Ø§ÙÙ
+Ø®Ø±Ø¬Ø§Øª .  
+
+buildcol.params:[Ø®ÙØ§Ø±Ø§Øª] Ø¥Ø³Ù
+-Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø©
+
+buildcol.remove_empty_classifications:ÙÙ
+ ØšØ¥Ø®ÙØ§Ø¡ Ø¹ÙØ§ØµØ± Ø§ÙØªØµÙÙÙ Ø§ÙÙØ§Ø±ØºØ© (ØªÙÙ Ø§ÙØªÙ ÙØ§ ØªØ­ØªÙÙ Ø¹ÙÙ ÙØ«Ø§ØŠÙ).  
+
+buildcol.removeold:Ø³ÙÙ ÙØªÙ
+ Ø­Ø°Ù Ø§ÙÙ
+Ø­ØªÙÙØ§Øª Ø§ÙÙØ¯ÙÙ
+Ø© ÙÙ Ù
+Ø³Ø§Ø± Ø§ÙØšÙØ§Ø¡.
+
+buildcol.unlinked_col_images:ÙØ¯ ÙØ§ ÙØªÙ
+ Ø±ØšØ· ØµÙØ± Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø© ØšØµÙØ±Ø© ØµØ­ÙØ­Ø©.
+
+buildcol.unknown_mode:Ø³ÙØ§Ù ØºÙØ± Ù
+Ø¹Ø±ÙÙ: %s
+
+buildcol.updating_archive_cache:ØªØ­Ø¯ÙØ« Ø§ÙØ§Ø±ØŽÙÙ Ø§ÙÙ
+Ø®Ø²Ù
+
+buildcol.verbosity:Ø¶ØšØ· ÙÙ
+ÙØ© Ø§ÙÙ
+Ø®Ø±Ø¬t. 0=ÙØ§ØŽÙØ¡, 3=ÙØ«ÙØ±.
+
+
+# -- classinfo.pl --
+
+classinfo.collection:Ø¥Ø¹Ø·Ø§Ø¡ Ù
+Ø¬Ù
+ÙØ¹Ø© Ø£Ø³Ù
+Ø§ Ø³ÙÙ ÙØ¬Ø¹Ù Ù
+ÙÙ classinfo.pl ÙÙØžØ± ÙÙ collect/collection-
+
+classinfo.desc:Ø·ØšØ§Ø¹Ø© Ø§ÙÙ
+Ø¹ÙÙÙ
+Ø§Øª Ø­ÙÙ Ø§ÙÙ
+ØµÙÙ.
+
+classinfo.general_options:Ø§ÙØ®ÙØ§Ø±Ø§Øª Ø§ÙØ¹Ø§Ù
+Ø© ÙØªÙ
+ ØªØ¶Ù
+ÙÙÙØ§ Ù
+Ù Ø§ÙÙØŠØ§Øª Ø§ÙØ£Ù
+ ÙÙÙ
+ØµÙÙ
+
+classinfo.info:Ù
+Ø¹ÙÙÙ
+Ø§Øª
+
+classinfo.no_classifier_name:Ø®Ø·Ø£: ÙØ¬Øš Ø¥Ø¹Ø·Ø§ Ø¥Ø³Ù
+ Ù
+ØµÙÙ.
+
+classinfo.option_types:Ø§ÙØ®ÙØ§Ø±Ø§Øª Ø§ÙÙ
+Ø­Ø¯Ø¯Ø© Ù
+Ø¹Ø±ÙØ© ÙÙØ· Ø¶Ù
+Ù Ø§ÙÙ
+ØµÙÙØ Ù ÙÙ Ù
+ØªÙÙØ±Ø© Ø¯Ø§ØŠÙ
+Ø§ ÙÙØ°Ø§ Ø§ÙÙ
+ØµÙÙ.  
+
+classinfo.params:[Ø®ÙØ§Ø±Ø§Øª] Ø¥Ø³Ù
+-Ù
+ØµÙÙ
+
+classinfo.passing_options:ÙÙ
+ÙÙ ØªÙ
+Ø±ÙØ± Ø§ÙØ®ÙØ§Ø±Ø§Øª ÙØ¢Ù  plugout ØšØªØ¶Ù
+ÙÙÙØ§ ÙÙ Ù
+ÙÙ Ø§ÙØ¥Ø¹Ø¯Ø§Ø¯ collect.cfg  
+
+classinfo.specific_options:Ø§ÙØ®ÙØ§Ø±Ø§Øª Ø§ÙÙ
+Ø­Ø¯Ø¯Ø© Ù
+Ø¹Ø±ÙØ© ÙÙØ· Ø¶Ù
+Ù Ø§ÙÙ
+ØµÙÙØ Ù ÙÙ Ù
+ØªÙÙØ±Ø© Ø¯Ø§ØŠÙ
+Ø§ ÙÙØ°Ø§ Ø§ÙÙ
+ØµÙÙ  
+
+# -- downloadfrom.pl --
+downloadfrom.cache_dir:Ù
+ÙÙØ¹ Ù
+Ø³Ø§Ø± Ø§ÙØªØ®Ø²ÙÙ
+downloadfrom.desc:ØªØ­Ù
+ÙÙ Ù
+ÙÙØ§Øª Ù
+Ù Ù
+Ø²ÙØ¯ Ø®Ø§Ø±Ø¬Ù
+downloadfrom.download_mode:ÙÙØ¹ Ø§ÙÙ
+Ø²ÙØ¯ Ø§ÙÙ
+ÙØ²Ù Ù
+ÙÙ
+downloadfrom.download_mode.Web:ØšØ±ÙØªÙÙÙÙ ÙÙÙ Ø§ÙÙØµ Ø§ÙØªØŽØ¹ØšÙ
+downloadfrom.download_mode.MediaWiki:Ù
+ÙÙØ¹ MediaWiki  
+downloadfrom.download_mode.OAI:Ù
+ØšØ§Ø¯Ø±Ø© Ø§ÙØ£Ø±ØŽØšÙ Ø§ÙÙ
+ÙØªÙØ­
+downloadfrom.download_mode.z3950:z3950 Ù
+Ø²ÙØ¯
+downloadfrom.download_mode.SRW:ØšØ­Ø«Ø¥Ø³ØªØ±Ø¬Ø§Ø¹ Ø®Ø¯Ù
+Ø§Øª Ø§ÙÙØš SRW
+downloadfrom.incorrect_mode:Ù
+Ø€ØŽØ± Ø³ÙØ§Ù Ø§ÙØªØ­Ù
+ÙÙ ØºÙØ± ØµØ­ÙØ­.
+downloadfrom.info:Ø¥Ø·ØšØ¹ Ø§ÙÙ
+Ø¹ÙÙÙ
+Ø§Øª Ø­ÙÙ Ø§ÙÙ
+Ø²ÙØ¯ Ø£ÙØ«Ø± Ù
+Ù Ø§ÙØªÙØ²ÙÙ
+downloadfrom.params:[Ø®ÙØ§Ø±Ø§Øª Ø¹Ø§Ù
+Ø©] [Ø®ÙØ§Ø±Ø§Øª Ø§ÙØªÙØ²ÙÙ Ø§ÙØ®Ø§ØµØ©]
+
+# -- downloadinfo.pl --
+
+downloadinfo.desc:Ø·ØšØ§Ø¹Ø© Ø§ÙÙ
+Ø¹ÙÙÙ
+Ø§Øª Ø­ÙÙ ÙÙ
+ÙØ°Ø¬ Ø§ÙØªØ­Ù
+ÙÙ
+downloadinfo.collection:Ø¥Ø¹Ø·Ø§Ø¡ Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø© Ø§Ø³Ù
+ Ø³ÙÙØŽÙØ¡ Ù
+ÙÙ download.pl ÙØ§ÙØžØ± Ø£ÙÙØ§ ÙÙ Ùcollect/collection-name/perllib/downloaders . ÙÙ ÙØ§Ù Ø§ÙØšØ±ÙØ§Ù
+Ø¬ ØºÙØ± Ù
+ÙØ¬ÙØ¯ ÙÙØ§Ù Ø³ÙÙ ÙØšØ­Ø« ÙÙ Ø¯ÙÙÙ perllib/downloaders Ø§ÙØ¹Ø§Ù
+.  
+downloadinfo.params:[Ø®ÙØ§Ø±Ø§Øª] [ÙÙ
+ÙØ°Ø¬-Ø§ÙØªÙØ²ÙÙ]
+downloadinfo.general_options:Ø§ÙØ®ÙØ§Ø±Ø§Øª Ø§ÙØ¹Ø§Ù
+Ø© ÙØªÙ
+ ØªØ¶Ù
+ÙÙÙØ§ Ù
+Ù Ø§ÙÙØŠØ§Øª Ø§ÙØ£Ù
+ ÙÙÙ
+ØµÙÙ
+downloadinfo.specific_options:Ø§ÙØ®ÙØ§Ø±Ø§Øª Ø§ÙÙ
+Ø­Ø¯Ø¯Ø© Ù
+Ø¹Ø±ÙØ© Ø¶Ù
+Ù ÙØ­Ø¯Ø© Ø§ÙØªÙØ²ÙÙØ ÙÙÙ Ù
+ØªÙÙØ±Ø© Ø¯Ø§ØŠÙ
+Ø§ ÙÙØ°Ø§ Ø§ÙÙ
+ÙØ²Ù.  
+downloadinfo.option_types:ÙØ­Ø¯Ø§Øª Ø§ÙØªÙØ²ÙÙ ÙÙ
+ÙÙ Ø£Ù ØªØ£Ø®Ø° ÙÙØ¹ÙÙ Ù
+Ù Ø§ÙØ®ÙØ§Ø±Ø§Øª  
+
+# -- explode_metadata_database.pl --
+explode.desc:ØªØ¬Ø²ØŠØ© ÙØ§Ø¹Ø¯Ø© ØšÙØ§ÙØ§Øª ÙØ§ØµÙØ§Øª ØšÙØ§ÙØ§Øª
+
+explode.collection:Ø§Ø³Ù
+ Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø© . ØšØ¹Ø¶  Ø§ÙÙ
+ÙØ§ØšØ³ ØªØšØ­Ø« Ø¹Ù Ø§ÙÙ
+ÙÙØ§Øª Ø§ÙØ¥Ø¶Ø§ÙÙØ© ÙÙ Ù
+Ø¬ÙØ¯ Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø© .  
+ 
+explode.document_field:Ø¹ÙØµØ± ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª Ø§ÙØ°Ù ÙØ­Ø¯Ø¯ Ø¥Ø³Ù
+ Ù
+ÙÙ Ø§ÙÙØ«Ø§ØŠÙ ÙØªØ¶Ù
+ÙÙÙ ÙÙ Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø©  
+
+explode.document_prefix:ØšØ§Ø¯ØŠØ© ÙÙ
+ÙØ§ÙØ¹ Ø§ÙÙØ«ÙÙØ© ( ÙÙØ¥Ø³ØªØ®Ø¯Ø§Ù
+ Ù
+Ø¹ document_field option).  
+
+explode.document_suffix:ÙØ§Ø­ÙØ© ÙÙ
+ÙØ§ÙØ¹ Ø§ÙÙØ«ÙÙØ© ( ÙÙØ¥Ø³ØªØ®Ø¯Ø§Ù
+ Ù
+Ø¹  document_field option).  
+
+explode.encoding:Ø§ÙØªØ±Ù
+ÙØ² ÙÙØ¥Ø³ØªØ®Ø¯Ø§Ù
+ Ø¹ÙØ¯ ÙØ±Ø§Ø¡Ø© Ù
+ÙÙ ÙØ§Ø¹Ø¯Ø© Ø§ÙØšÙØ§ÙØ§Øª  
+explode.metadata_set:Ù
+Ø¹ÙØ§Ø± ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª (Ø¥Ø³Ù
+ Ù
+Ø³Ø§Ø­Ø©) ÙØªØµØ¯ÙØ± ÙÙ ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª Ù
+Ø«ÙÙ  
+explode.plugin:Ø§ÙÙ
+ÙØ§ØšØ³ Ø§ÙÙ
+Ø³ØªØ®Ø¯Ù
+ ÙÙØªØ¬Ø²ØŠØ©
+explode.plugin_options:Ø®ÙØ§Ø±Ø§Øª ÙØªÙ
+Ø±Ø± Ø¥ÙÙ Ø§ÙÙ
+ÙØ§ØšØ³ ÙØšÙ Ø§ÙØªØ¬Ø²ØŠØ©.Ø®ÙØ§Ø±Ø§Øª  Ø§ÙØ¥Ø³Ù
+  ÙØ¬Øš Ø£Ù ØªØšØ¯Ø£ Øš - . Ø£ÙØµÙ Ø£Ø³Ù
+Ø§Ø¡ Ù ÙÙÙ
+ Ø§ÙØ®ÙØ§Ø± ØšÙ
+Ø³Ø§ÙØ©.  
+explode.use_collection_plugin_options:Ø§ÙØ±Ø£ Ù
+ÙÙ ØªØ¬ÙÙØ² Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø© Ù Ø§Ø³ØªØ®Ø¯Ù
+ Ø®ÙØ§Ø±Ø§Øª Ø§ÙÙ
+ÙØ§ØšØ³ Ø§ÙÙ
+Ø®ØµØµ . ÙØªØ·ÙØš -Ø®ÙØ§Ø±Ø§Øª Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø©. ÙØ§ ÙÙ
+ÙÙ Ø£Ù ÙØ³ØªØ®Ø¯Ù
+ Ù
+Ø¹ - plugin_options  
+explode.params:[Ø®ÙØ§Ø±Ø§Øª] Ø¥Ø³Ù
+ Ù
+ÙÙ
+explode.records_per_folder:Ø±ÙÙ
+ Ø§ÙØªØ³Ø¬ÙÙØ§Øª Ø§ÙÙ
+Ø·ÙÙØš  ÙÙ ÙÙ Ù
+Ø¬ÙØ¯ ÙØ±Ø¹Ù.
+
+# -- replace_srcdoc_with_html.pl --
+srcreplace.desc:Ø£Ø³ØªØšØ¯Ø§Ù Ù
+ØµØ¯Ø± ÙØ«ÙÙØ© ØšÙ
+ÙÙ HTML Ù
+ÙÙØ¯ Ø¹ÙØ¯ Ø¥Ø¹Ø§Ø¯Ø© Ø§ÙØšÙØ§Ø¡ .  
+srcreplace.params:Ø§Ø³Ù
+ Ø§ÙÙ
+ÙÙ[Ø®ÙØ§Ø±Ø§Øª]  
+srcreplace.plugin:Ø§ÙÙ
+ÙØ§ØšØ³ Ø§ÙØ°Ù ÙØ³ØªØ®Ø¯Ù
+ ÙØªØ­ÙÙÙ Ù
+ØµØ¯Ø± Ø§ÙÙØ«ÙÙØ©  
+
+# -- exportcol.pl --
+
+exportcol.out:Ø¥Ø³Ù
+ Ù
+ÙÙ Ø£Ù Ø£Ù Ù
+Ø¹Ø§ÙØ¬Ø© ÙØ·ØšØ§Ø¹Ø© Ø­Ø§ÙØ© Ø§ÙÙ
+Ø®Ø±Ø¬Ø§Øª .  
+exportcol.cddir:Ø¥Ø³Ù
+ Ø§ÙÙ
+Ø³Ø§Ø± Ø§ÙØ°Ù ØªÙØ¯ ØªØµØ¯ÙØ± Ù
+ÙÙÙØ§Øª Ø§ÙÙØ±Øµ Ø¥ÙÙÙ.
+exportcol.cdname:Ø£Ø³Ù
+ Ø§ÙÙØ±Øµ Ø§ÙÙ
+Ø¶ØºÙØ· -- ÙÙÙ Ø§ÙØ°Ù ÙØžÙØ± ÙÙ ÙØ§ØŠÙ
+Ø© Ø¥ØšØ¯Ø£ Ø¹ÙØ¯ ØªØ«ØšÙØª Ø§ÙÙØ±Øµ Ø§ÙÙ
+Ø¶ØºÙØ·.
+exportcol.desc:ØšØ±Ù
+Ø¬Ø© PERL ØªØ³ØªØ®Ø¯Ù
+ ÙØªØµØ¯ÙØ± ÙØ§Ø­Ø¯Ø© Ø£Ù Ø£ÙØ«Ø± Ù
+Ù Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø§Øª Ø¥ÙÙ ÙØ±Øµ Ù
+Ø¯Ù
+Ø¬ ÙÙ ØšÙØŠØ© Windows.  
+exportcol.noinstall:Ø¥ÙØŽØ§Ø¡ ÙØ±Øµ Ù
+Ø¯Ù
+Ø¬ ÙØªØŽØºÙÙ Ø§ÙÙ
+ÙØªØšØ© Ù
+ØšØ§ØŽØ±Ø© Ù
+ÙÙ ØšØ­ÙØ« ÙØ§ ÙØªÙ
+ ØªØ«ØšÙØª ØŽÙ ÙÙ Ø§ÙØ­Ø§Ø³Øš Ø§ÙÙ
+Ø¶ÙÙ  
+exportcol.params:[Ø®ÙØ§Ø±Ø§Øª] Ø¥Ø³Ù
+-Ù
+Ø¬Ù
+ÙØ¹Ø©1 Ø¥Ø³Ù
+-Ù
+Ø¬Ù
+ÙØ¹Ø©2 ...
+exportcol.coll_not_found:ØªØ¬Ø§ÙÙ Ù
+Ø¬Ù
+ÙØ¹Ø© ØºÙØ± ØµØ§ÙØ­Ø© %s: ÙØ§ ØªÙØ¬Ø¯ Ù
+Ø¬Ù
+ÙØ¹Ø© ÙÙ %s.
+exportcol.coll_dirs_not_found:ØªØ¬Ø§ÙÙ Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø§Øª ØºÙØ± Ø§ÙØµØ§ÙØ­Ø© %s: ÙØ§ ÙÙØ¬Ø¯ ÙØ§Ø­Ø¯ Ù
+Ù Ø§ÙÙ
+Ø¬ÙØ¯Ø§Øª Ø§ÙØªØ§ÙÙØ©:
+exportcol.fail:exportcol.pl ÙØŽÙ:
+exportcol.no_valid_colls:ÙÙ
+ ÙØªÙ
+ ØªØ­Ø¯ÙØ¯ Ù
+Ø¬Ù
+ÙØ¹Ø© ØµØ§ÙØ­Ø© ÙÙØªØµØ¯ÙØ±.
+exportcol.couldnt_create_dir:ÙÙ
+ ÙØªÙ
+ Ø¥ÙØŽØ§Ø¡ Ù
+Ø³Ø§Ø± %s.
+exportcol.couldnt_create_file:ÙÙ
+ ÙØªÙ
+ Ø¥ÙØŽØ§Ø¡ %s.
+exportcol.instructions:ÙØ¥ÙØŽØ§Ø¡ ÙØ±Øµ Ù
+Ø¯Ù
+Ø¬ Ø°Ø§ØªÙ Ø§ÙØªØŽØºÙÙ ÙØ§ÙØªØ«ØšÙØª ÙÙ ØšÙØŠØ© WindowsØ Ø§ÙØ³Ø® Ù
+Ø­ØªÙØ§ÙØª ÙØ°Ø§ Ø§ÙÙ
+Ø¬ÙØ¯ Ø¥ÙÙ Ø§ÙÙØ±Øµ Ø§ÙÙ
+Ø¯Ù
+Ø¬.  
+exportcol.non_exist_files:ÙØ§Ø­Ø¯ Ø£Ù Ø£ÙØ«Ø± Ù
+Ù Ø§ÙÙ
+ÙÙØ§Øª Ù Ø§ÙÙ
+Ø¬ÙØ¯Ø§Øª Ø§ÙØªØ§ÙÙØ© ÙÙ
+ ÙØªÙ
+ Ø§ÙØ¹Ø«ÙØ± Ø¹ÙÙÙ  
+exportcol.success:exportcol.pl ÙØ¬Ø­:
+exportcol.output_dir:Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø§Øª Ø§ÙÙ
+ØµØ¯Ø±Ø© (%s) ÙÙ ÙÙ %s.
+exportcol.export_coll_not_installed:ÙØžÙÙØ© Ø§ÙØªØµØ¯ÙØ± Ø¥ÙÙ ÙØ±Øµ Ù
+Ø¯Ù
+Ø¬ ÙÙ
+ ØªÙÙ Ù
+Ø«ØšØªØ©.  
+
+# -- import.pl --
+
+import.archivedir:Ø­ÙØ« Ø³ØªÙØªÙÙ Ø§ÙÙ
+ÙØ§Ø¯ Ø§ÙÙ
+Ø­ÙÙØ©.  
+
+import.manifest:Ù
+ÙÙ XML Ø§ÙØ°Ù ÙÙØµÙ Ù
+Ø§ ÙÙ Ø§ÙÙ
+ÙÙØ§Øª Ø§ÙØªÙ ÙØ¬Øš Ø§Ù ØªØ³ØªÙØ±Ø¯. Used instead of recursively descending the import folder, typically for incremental building.  
+
+import.cannot_open_stats_file:ØªØ­Ø°ÙØ±: ÙØ§ ÙÙ
+ÙÙ ÙØªØ­ Ù
+ÙÙ Ø§ÙØ¥Ø­ØµØ§Ø¡ %s.
+
+import.cannot_open_fail_log:Ø®Ø·Ø£: ÙØ§ ÙÙ
+ÙÙ ÙØªØ­ Ù
+Ø¯ÙÙØ© Ø§ÙØ£Ø®Ø·Ø§Ø¡ %s
+
+import.cannot_sort:ØªØ­Ø°ÙØ±: ÙÙ ÙØªÙ
+ÙÙimport.pl Ù
+Ù ÙØ±Ø² Ø§ÙÙØ«Ø§ØŠÙ Ø¹ÙØ¯Ù
+Ø§ ÙÙÙÙ Ø­Ø¬Ù
+ Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø© > 1. Ø³ÙÙ ÙØªÙ
+ Ø¥ÙÙ
+Ø§Ù Ø®ÙØ§Ø±Ø§Øªsortmeta .
+
+import.collectdir:Ù
+Ø³Ø§Ø± Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø©.
+
+import.complete:Ø¥ÙØªÙ
+Ù Ø§ÙØ¥Ø³ØªÙØ±Ø§Ø¯
+
+import.debug:Ø·ØšØ§Ø¹Ø© Ø§ÙÙØµ Ø§ÙÙ
+Ø³ØªÙØ±Ø¯ Ø¥ÙÙ STDOUT. (ÙØ§Ø³ØªÙØ±Ø§Ø¯ Ø¬Ø±ÙÙØ³ØªÙÙ XML )  
+
+import.desc:Ù
+Ø®Ø·ÙØ·Ø© PERL Ø§ÙØªÙ ØªØ³ØªØ®Ø¯Ù
+ ÙØ¥Ø³ØªÙØ±Ø§Ø¯ Ø§ÙÙ
+ÙÙØ§Øª ÙÙ ØŽÙÙ (Ø¬Ø±ÙÙØ³ØªÙÙ XML Ø£Ù Ø¬Ø±ÙÙØ³ØªÙÙ METS) Ø¥Ø³ØªØ¹Ø¯Ø§Ø¯Ø§ ÙØšÙØ§ØŠÙØ§.  
+
+import.faillog:Ù
+Ø¯ÙÙØ© Ù
+ÙÙØ§Øª Ø§ÙØ¥Ø¬Ø±Ø§Ø¡Ø§Øª Ø§ÙÙØ§ØŽÙØ©Ø ØªØªØ¶Ù
+Ù ÙØ°Ù Ø§ÙÙ
+Ø¯ÙÙØ© Ø§Ø³Ù
+Ø§Ø¡ Ù
+ÙÙØ§Øª Ø§ÙØ¥Ø¬Ø±Ø§Ø¡Ø§Øª Ø§ÙØªÙ ÙØŽÙØª
+
+import.groupsize:Ø¹Ø¯Ø¯ Ø§ÙÙØ«Ø§ØŠÙ Ø§ÙÙ
+Ø³ØªÙØ±Ø¯Ø© ÙÙ
+Ø¬Ù
+ÙØ¹Ø© ÙÙ Ù
+ÙÙ XML ÙØ§Ø­Ø¯  
+
+import.gzip:Ø§Ø³ØªØ®Ø¯Ù
+ gzip ÙØ¶ØºØ· ÙØ«Ø§ØŠÙ xml Ø§ÙÙØ§ØªØ¬Ø© ( ÙØ§ ØªÙØ³Ù ØªØ¶Ù
+ÙÙ ZIPPlug ÙÙ ÙØ§ØŠÙ
+Ø© Ø§ÙÙ
+ÙØ§ØšØ³ Ø¹ÙØ¯ Ø§ÙØšÙØ§Ø¡ Ù
+Ù ÙØ«Ø§ØŠÙ Ù
+Ø¶ØºÙØ·Ø©)  
+
+import.importdir:Ø­ÙØ« ØªÙØ¬Ø¯ Ø§ÙÙ
+ÙØ§Ø¯ Ø§ÙØ£ØµÙÙØ©  
+
+import.incremental:Ø¥Ø³ØªÙØ±Ø§Ø¯ Ø§ÙÙØ«Ø§ØŠÙ ÙØ¬Ø¯ÙØ¯Ø© (ÙÙØ¯ Ø²Ù
+ÙÙ)Ø¯ÙÙ Ù
+ÙÙØ§Øª Ø§ÙØ£Ø±ØŽÙÙ Ø§ÙØ­Ø§ÙÙØ©. ØªØ¹ÙÙ  -keepold.  
+
+import.keepold:ÙÙ ØªØ­Ø·Ù
+ Ø§ÙÙ
+Ø­ØªÙÙØ§Øª Ø§ÙØ­Ø§ÙÙØ© ÙÙ Ø¯ÙÙÙ Ø§ÙØ£Ø±ØŽÙÙ  
+
+import.maxdocs:Ø§ÙØ¹Ø¯Ø¯ Ø§ÙØ£ÙØµÙ ÙÙÙØ«Ø§ØŠÙ ÙÙØ¥Ø³ØªÙØ±Ø§Ø¯.
+
+import.no_import_dir:Ø®Ø·Ø£: Ù
+Ø³Ø§Ø± Ø§ÙØ¥Ø³ØªÙØ±Ø§Ø¯  (%s) ØºÙØ± Ù
+ÙØ¬ÙØ¯.
+
+import.no_plugins_loaded:Ø®Ø·Ø£: ÙÙ
+ ÙØªÙ
+ ØªØ­Ù
+ÙÙ Ù
+ÙØ§ØšØ³.
+
+import.OIDtype:Ø§ÙÙ
+ÙÙØ¬ Ø§ÙÙ
+Ø³ØªØ®Ø¯Ù
+ Ø¹ÙØ¯ ØªÙÙÙØ¯ Ù
+Ø­Ø¯Ø¯Ø§Øª ÙØ±ÙØ¯Ø© ÙØ¢Ù ÙØ«ÙÙØ©.
+import.OIDtype.hash:Ù
+Ø²Ø¬ Ù
+Ø­ØªÙÙØ§Øª Ø§ÙÙ
+ÙÙ.Ø³ÙÙ ØªØšÙÙ Ù
+Ø¹Ø±ÙØ§Øª Ø§ÙÙØ«ÙÙØ© ÙÙ
+Ø§ ÙÙ ÙÙ ÙÙ Ù
+Ø±Ø© ÙØªÙ
+ ÙÙÙØ§ Ø¥Ø³ØªÙØ±Ø§Ø¯ Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø©  
+
+import.OIDtype.incremental:Ø§Ø³ØªØ®Ø¯Ù
+ Ø¹Ø¯Ø§Ø¯ ÙØ«ÙÙØ© ØšØ³ÙØ·. ÙÙ Ø£Ø³Ø±Ø¹ ØšÙØ«ÙØ± Ù
+Ù "hash"Ø ÙÙÙÙ ÙØ§ ØªØ­Ø¯Ø¯ ÙÙØ³ Ø§ÙÙ
+Ø­Ø¯Ø¯Ø§Øª ÙÙÙØ³ Ø¹Ø¯Ø§Ø¯ Ø§ÙÙØ«ÙÙØ©Ø ÙÙØ°ÙÙ ÙØ§ ÙÙ
+ÙÙ Ø¥Ø¶Ø§ÙØ© ÙØ«Ø§ØŠÙ Ø¬Ø¯ÙØ¯Ø© ÙÙØ£Ø±ØŽÙÙØ§Øª Ø§ÙÙ
+ÙØ¬ÙØ¯Ø©.  
+
+import.OIDtype.assigned:Ø§Ø³ØªØ®Ø¯Ù
+ ÙÙÙ
+Ø© ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª Ø§ÙÙ
+Ø¹Ø·Ø§Ø© ØšÙØ§Ø³Ø·Ø© Ø®ÙØ§Ø± OIDmetadata (Ù
+Ø³ØšÙÙØ© Øš "D"); Ø¥Ø°Ø§ ÙÙ
+ ÙØªÙ
+ ØªØ­Ø¯ÙØ¯ÙØ§ ÙÙØ«ÙÙØ© Ù
+Ø­Ø¯Ø¯Ø© Ø³ÙÙ ÙØªÙ
+ Ø¥Ø³ØªØ®Ø¯Ø§Ù
+ # ØšØ¯ÙØ§ Ù
+ÙÙØ§. ÙØ¬Øš Ø£Ù ØªÙÙÙ ÙØ°Ù Ø§ÙÙ
+Ø¹Ø±ÙØ§Øª ÙØ±ÙØ¯Ø©.  
+
+import.OIDtype.dirname:Ø¥Ø³ØªØ®Ø¯Ù
+ Ø¥Ø³Ù
+ Ø§ÙØ¯ÙÙÙ Ø§ÙØ¹Ø§ØŠÙÙ(Ù
+Ø³ØšÙÙØ§ ØšÙ "j" . ÙØ¬Øš Ø§Ù ØªÙÙÙ ÙÙØ§Ù ÙØ«ÙÙØ© ÙØ§Ø­Ø¯Ø© ÙÙ ÙÙ Ø¯ÙÙÙØ Ù ÙØ¬Øš Ø§Ù ÙÙÙÙ Ø£Ø³Ù
+ Ø§ÙØ¯ÙÙÙ ÙØ±ÙØ¯Ø§. Ù
+Ø«Ø§Ù Ø  import/b13as/h15ef/page.html Ø³ÙÙ ÙØ­ØµÙ Ø¹ÙÙ Ø§ÙÙ
+Ø¹Ø±Ù Jh15ef.  
+
+import.OIDmetadata:ØªØ®ØµÙØµ Ø¹ÙØµØ± ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª Ø§ÙØ°Ù ÙØ­Ø¬Ø² ÙÙÙØ«ÙÙØ© Ø§ÙÙ
+Ø­Ø¯Ø¯ Ø§ÙÙØ±ÙØ¯Ø ÙÙØ¥Ø³ØªØ®Ø¯Ø§Ù
+ Ù
+Ø¹  -OIDtype=.  
+
+import.saveas:ÙØ°Ø§ ÙØªØ­Ø¯ÙØ¯ Ø£Ù Ø£ØŽÙØ§Ù Ø§ÙØ£Ø±ØŽÙÙ Ø§ÙØªÙ ÙØ¬Øš ØªÙÙÙØ¯ÙØ§. Ø§ÙØŽÙÙ Ø§ÙØ¥ÙØªØ±Ø§Ø¶Ù ÙÙ  GA.  
+
+import.out:Ø¥Ø³Ù
+ Ù
+ÙÙ Ø£Ù Ø£Ù Ù
+Ø¹Ø§ÙØ¬Ø© ÙØ·ØšØ§Ø¹Ø© Ø­Ø§ÙØ© Ø§ÙÙ
+Ø®Ø±Ø¬Ø§Øª  
+
+import.params:[Ø®ÙØ§Ø±Ø§Øª] Ø¥Ø³Ù
+-Ù
+Ø¬Ù
+ÙØ¹Ø©
+
+import.removeold:Ø³ÙÙ ÙØªÙ
+ Ø¥Ø²Ø§Ø­Ø© Ø§ÙÙ
+Ø­ØªÙÙØ§Øª Ø§ÙÙØ¯ÙÙ
+Ø© Ù
+Ù Ù
+Ø³Ø§Ø± Ø§ÙØ£Ø±ØŽÙÙ.
+
+import.removing_archives:Ø¥Ø²Ø§Ø­Ø© Ø§ÙÙ
+Ø­ØªÙÙØ§Øª Ø§ÙØ­Ø§ÙÙØ© ÙÙ Ù
+Ø³Ø§Ø± Ø§ÙØ£Ø±ØŽÙÙ
+
+import.removing_tmpdir:Ø¥Ø²Ø§Ø­Ø© Ù
+Ø­ØªÙÙØ§Øª Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø© ÙÙ Ø§ÙÙ
+Ø³Ø§Ø± Ø§ÙÙ
+Ø€ÙØª...
+
+import.reversesort:ÙØ±Ø² ØšØªØ±ØªÙØš Ø¹ÙØ³Ù. ÙØ³ØªØ¹Ù
+Ù Ù
+Ø¹ Ø®ÙØ§Ø± - sortmeta .  
+
+import.site:Ù
+ÙÙØ¹ ÙÙØ¹Ø«ÙØ± Ø¹ÙÙ Ø¯ÙÙÙ Ù
+Ø¬Ù
+ÙØ¹Ø© ÙÙ (ÙØªØ«ØšÙØª Ø¬Ø±ÙÙØ³ØªÙÙ 3).  
+
+import.sortmeta:ÙØ±Ø² Ø§ÙÙØ«Ø§ØŠÙ Ø£ÙÙØšØ§ØŠÙØ§ ØšÙØ§Ø³Ø·Ø© ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª ÙÙØšÙØ§Ø¡.Ø³ÙÙ ÙØªÙ
+ Ø¥Ø®Ù
+Ø§Ø¯ ÙØ°Ø§ Ø§ÙØ¥Ø¬Ø±Ø§Ø¡ Ø¥Ø°Ø§ ÙØ§ÙØª ÙÙÙ
+Ø© groupsize > 1.  
+
+import.statsfile:Ø§Ø³Ù
+ Ø§ÙÙ
+ÙÙ Ø£Ù Ø§ÙØªØ¹Ø§Ù
+Ù ÙØ·ØšØ§Ø¹Ø© Ø¥Ø­ØµØ§Ø¡Ø§Øª Ø§ÙØªØµØ¯ÙØ± ÙÙ.  
+
+import.stats_backup:Ø³ÙÙ ÙØ·ØšØ¹ Ø§ÙØ­Ø§ÙØ§Øª ÙÙ STDERR ØšØ¯ÙØ§Ù.  
+
+import.verbosity:Ø¶ØšØ· ÙÙ
+ÙØ© Ø§ÙÙ
+Ø®Ø±Ø¬t. 0=ÙØ§ØŽÙØ¡, 3=ÙØ«ÙØ±.
+
+# -- schedule.pl --
+schedule.deleted:Ø¥ÙØºØ§Ø¡ Ø§ÙØ¬Ø¯ÙÙØ© Ø§ÙÙ
+Ø¹Ø¯Ø© ÙÙ
+Ø¬Ù
+ÙØ¹Ø©  
+schedule.scheduled:Ù
+Ø®Ø·ÙØ·Ø© Ø§ÙØªÙÙÙØ° Ø§ÙØªÙ Ø£ÙØŽØŠØª ÙÙ
+Ø¬Ù
+ÙØ¹Ø©.  
+schedule.cron:ØªÙÙÙØ° Ø§ÙØ¬Ø¯ÙÙØ© Ø§ÙÙ
+Ø¹Ø¯Ø© ÙÙ
+Ø¬Ù
+ÙØ¹Ø©  
+schedule.params:[Ø§ÙØ®ÙØ§Ø±Ø§Øª]  
+schedule.error.email:Ø§ÙØšØ±ÙØ¯ Ø§ÙØ¥ÙÙØªØ±ÙÙÙ ÙØªØ·ÙØš ØªØ­Ø¯ÙØ¯  -smtp -toaddr Ù -fromaddr.  
+schedule.error.importbuild:ÙØ¬Øš ØªØ­Ø¯ÙØ¯ build- Ù import-.  
+schedule.error.colname:ÙØ¬Øš ØªØ­Ø¯ÙØ¯ Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø© Ø§ÙØªÙ ØªØ³ØªØ®Ø¯Ù
+ -colname .  
+schedule.gli:ØªØŽØºÙÙ Ù
+Ù GLI  
+schedule.frequency:Ø¹Ø¯Ø¯ Ù
+Ø±Ø§Øª Ø¥Ø¹Ø§Ø¯Ø© Ø§ÙØšÙØ§Ø¡ Ø§ÙØªÙÙØ§ØŠÙ  
+schedule.frequency.hourly:Ø¥Ø¹Ø§Ø¯Ø© ØšÙØ§Ø¡ ÙÙ Ø³Ø§Ø¹Ø©  
+schedule.frequency.daily:Ø¥Ø¹Ø§Ø¯Ø© ØšÙØ§Ø¡ ÙÙ ÙÙÙ
+  
+schedule.frequency.weekly:Ø¥Ø¹Ø§Ø¯Ø© ØšÙØ§Ø¡ ÙÙ Ø£Ø³ØšÙØ¹  
+schedule.action:ÙÙÙ ØªØ¹Ø¯ Ø¥Ø¹Ø§Ø¯Ø© ØšÙØ§Ø¡ ØªÙÙØ§ØŠÙØ§.  
+schedule.action.add:Ø¬Ø¯ÙÙØ© Ø¥Ø¹Ø§Ø¯Ø© Ø§ÙØšÙØ§Ø¡  ØªÙÙØ§ØŠÙØ§  
+schedule.action.update:ØªØ­Ø¯ÙØ« Ø¬Ø¯ÙÙØ© Ù
+ÙØ¬ÙØ¯Ø©  
+schedule.action.delete:Ø­Ø°Ù Ø¬Ø¯ÙÙØ© Ù
+ÙØ¬ÙØ¯Ø©  
+schedule.email:Ø£Ø±Ø³Ù  Ø¥Ø®Ø·Ø§Ø±  ØšØ§ÙØšØ±ÙØ¯ Ø§ÙØ¥ÙÙØªØ±ÙÙÙ  
+schedule.schedule:Ø¥Ø®ØªÙØ§Ø± Ø¬Ø¯ÙÙØ© Ù
+Ø¬Ù
+ÙØ¹Ø© ØªÙÙØ§ØŠÙØ§ ÙØ¥Ø¹Ø§Ø¯Ø© ØšÙØ§Ø¡ .  
+schedule.colname:Ø§Ø³Ù
+ Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø© Ø§ÙØªÙ Ø³ÙÙ ØªØªÙ
+ Ø¬Ø¯ÙÙØªÙØ§  
+schedule.import:Ø£Ù
+Ø± Ø§ÙØ¥Ø³ØªÙØ±Ø§Ø¯ ÙØ¬Ø¯ÙÙØªÙ  
+schedule.build:Ø£Ù
+Ø± ØšÙØ§Ø¡ Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø© Ø§ÙÙ
+Ø²Ù
+Ø¹ Ø¬Ø¯ÙÙØªÙ  
+schedule.toaddr:Ø¹ÙÙØ§Ù Ø§ÙØšØ±ÙØ¯ Ø§ÙØ§ÙÙØªØ±ÙÙÙ ÙØ§Ø±Ø³Ø§Ù Ø¥Ø®Ø·Ø§Ø±Ø§Øª Ø§ÙØšÙØ§Ø¡ Ø§ÙÙ
+Ø¬Ø¯ÙÙØ©.  
+schedule.toaddr.default:Ø­Ø¯Ø¯ ØšØ±ÙØ¯ Ø§ÙÙ
+Ø³ØªØ®Ø¯Ù
+ Ø§ÙØ§ÙÙØªØ±ÙÙÙ  ÙÙ Ù
+ÙÙ-> ØªÙØ¶ÙÙØ§Øª  
+schedule.fromaddr:Ø¹ÙÙØ§Ù Ø§ÙØšØ±ÙØ¯ Ø§ÙØ§ÙÙØªØ±ÙÙÙ ÙÙÙ
+Ø±Ø³Ù  
+schedule.fromaddr.default:Ø­Ø¯Ø¯ maintainer ÙÙ main.cfg  
+schedule.smtp:Ù
+Ø²ÙØ¯ Ø®Ø¯Ù
+Ø© Ø§ÙØšØ±ÙØ¯ Ø§ÙØ°Ù ÙØ±Ø³Ù Ø§ÙØšØ±ÙØ¯ ÙØ¬Øš Ø§Ù ÙÙÙÙ Ù
+ØªØµÙØ§ ÙØ¥Ø±Ø³Ø§Ù ØšØ±ÙØ¯ Ø¥ÙÙØªØ±ÙÙÙ  
+schedule.smtp.default:Ø­Ø¯Ø¯ Ù
+Ø²ÙØ¯ Ø§ÙØšØ±ÙØ¯ ÙÙ main.cfg  
+schedule.out:Ø§Ø³Ù
+ Ù
+ÙÙ ÙØ·ØšØ§Ø¹Ø© Ø­Ø§ÙØ© Ø§ÙÙ
+Ø®Ø±Ø¬Ø§Øª Ø§ÙÙ.  
+# -- export.pl --
+
+export.exportdir:Ø­ÙØ« ØªÙØªÙÙ Ø§ÙÙ
+ÙØ§Ø¯ Ø§ÙÙ
+ØµØ¯Ø±Ø©  
+
+export.cannot_open_stats_file:ØªØ­Ø°ÙØ±: ÙØ§ ÙÙ
+ÙÙ ÙØªØ­ Ù
+ÙÙ Ø§ÙØ¥Ø­ØµØ§Ø¡ %s.
+
+export.cannot_open_fail_log:Ø®Ø·Ø£: ÙØ§ ÙÙ
+ÙÙ ÙØªØ­ Ù
+Ø¯ÙÙØ© Ø§ÙØ£Ø®Ø·Ø§Ø¡ %s
+
+export.cannot_sort:ØªØ­Ø°ÙØ±: Ù
+ÙÙ export.pl ÙØ§ ÙÙ
+ÙÙÙ ØªØ±ØªÙØš Ø§ÙÙØ«Ø§ØŠÙ Ø¹ÙØ¯Ù
+Ø§ ØªÙØ¶Ø¹ ÙÙ Ù
+Ø¬Ù
+ÙØ¹Ø§Øª> 1. Ø®ÙØ§Ø± Ø§ÙØªØ±ØªÙØš Ø³ÙÙ ÙØªÙ
+ ØªØ¬Ø§ÙÙÙ.  
+
+export.collectdir:Ù
+Ø³Ø§Ø± Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø©.
+
+export.complete:Ø¥ÙØªÙ
+Ø§Ù Ø§ÙØªØµØ¯ÙØ±
+
+export.debug:Ø·ØšØ§Ø¹Ø© Ø§ÙÙØµ Ø§ÙÙ
+Ø³ØªÙØ±Ø¯ Ø¥ÙÙ STDOUT.(ÙØªØµØ¯ÙØ± Ø¬Ø±ÙÙØ³ØªÙÙ XML )  
+
+export.desc:ÙØµ PERL Ø§ÙÙ
+Ø³ØªØ®Ø¯Ù
+ ÙØªØµØ¯ÙØ± ÙØ§Ø­Ø¯Ø© Ø£Ù Ø£ÙØ«Ø± Ù
+Ù Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø§Øª Ø¥ÙÙ ÙØ±Øµ Ù
+Ø¯Ù
+Ø¬ ÙØžØ§Ù
+ Ø§ÙÙÙØ§ÙØ°.  
+
+export.faillog:ÙØŽÙ ÙÙ Ø§Ø³Ù
+ Ù
+ÙÙ Ø§ÙØ³Ø¬Ù. ÙØ°Ø§ Ø§ÙØ³Ø¬Ù ÙØ³ØªÙØšÙ Ø£Ø³Ù
+Ø§Ø¡ Ø£Ù Ù
+ÙÙØ§Øª ØªÙØŽÙ Ø¹Ù
+ÙÙØ© ØªØŽØºÙÙÙØ§. (Default: collectdir/collname/etc/fail.log)  
+
+export.groupsize:Ø§ÙØ¹Ø¯Ø¯ Ø§ÙØ£Ø¯ÙÙ ÙÙÙØ«Ø§ØŠÙ / ØµÙØ­Ø©.  
+
+export.gzip:Ø§Ø³ØªØ®Ø¯Ù
+ gzip ÙØ¶ØºØ· ÙØ«Ø§ØŠÙ xml (ÙØ§ ØªÙØ³ Ø£Ù ØªØ¶Ù
+Ù ZIPPlug ÙÙ ÙØ§ØŠÙ
+Ø© ØšØ±Ø§Ù
+Ø¬Ù Ø§ÙÙ
+Ø¶Ù
+ÙØ© Ø¹ÙØ¯ Ø§ÙØšÙØ§Ø¡ Ù
+Ù ÙØ«Ø§ØŠÙ Ù
+Ø¶ØºÙØ·Ø©).  
+
+export.importdir:Ø­ÙØ« ØªÙØ¬Ø¯ Ø§ÙÙ
+ÙØ§Ø¯ Ø§ÙØ£ØµÙÙØ©  
+
+export.keepold:ÙÙ ØªØ¯Ù
+Ø± Ø§ÙÙ
+Ø­ØªÙÙ Ø§ÙØ­Ø§ÙÙ Ø§ÙÙ
+ÙØ¬ÙØ¯ ÙÙ Ø¯ÙÙÙ Ø§ÙØªØµØ¯ÙØ±.  
+
+export.maxdocs:Ø§ÙØ¹Ø¯Ø¯ Ø§ÙØ£ÙØµÙ ÙÙÙØ«Ø§ØŠÙ ÙÙØªØµØ¯ÙØ±.  
+
+export.listall:Ø§Ø¹Ø±Ø¶ ÙØ§ÙØ© ØªØ±ÙÙØšØ§Øª Ø§ÙÙ
+ØªØ§Ø­Ø© Ù
+Ø¹ Ø§ÙØ£Ù
+Ø± save as  
+
+export.saveas:ÙØ³Ù ØªØµØ¯ÙØ± Ø§ÙÙØ«Ø§ØŠÙ.
+
+export.saveas.DSpace:ÙÙØŠØ© Ø£Ø±ØŽÙÙ DSpace .
+
+export.saveas.GreenstoneMETS:ØŽÙÙ METS ØšØ§Ø³ØªØ®Ø¯Ø§Ù
+ Ø³Ù
+Ø§Øª Ø¬Ø±ÙÙØ³ØªÙÙ .  
+export.saveas.FedoraMETS:ØŽÙÙ METS ØšØ§Ø³ØªØ®Ø¯Ø§Ù
+ Ø³Ù
+Ø§Øª ÙÙØ¯ÙØ±Ø§ .  
+
+export.saveas.GreenstoneXML:ØŽÙÙ Ø§Ø±ØŽÙÙ Ø¬Ø±ÙÙØ³ØªÙÙ XML .  
+
+export.saveas.MARCXML:MARC XML ÙÙØŠØ© (Ø¥ØµØ¯Ø§Ø±Ø© MARC 21)  
+
+export.out:Ø§Ø³Ù
+ Ø§ÙÙ
+ÙÙ Ø£Ù Ø§ÙØ¥Ø¬Ø±Ø§Ø¡ Ø§ÙØ°Ù Ø³ØªØ·ØšØ¹ Ø­Ø§ÙØ© Ø§ÙÙ
+Ø®Ø±Ø¬Ø§Øª Ø¹ÙÙÙ.  
+
+export.params:[Ø®ÙØ§Ø±Ø§Øª] Ø¥Ø³Ù
+-Ù
+Ø¬Ù
+ÙØ¹Ø©1 Ø¥Ø³Ù
+-Ù
+Ø¬Ù
+ÙØ¹Ø©2 ...  
+
+export.removeold:Ø³ÙÙ ÙØªÙ
+ Ø¥Ø²Ø§Ø­Ø© Ø§ÙÙ
+Ø­ØªÙÙØ§Øª Ø§ÙÙØ¯ÙÙ
+Ø© ÙÙ Ø¯ÙÙÙ Ø§ÙØªØµØ¯ÙØ±  
+
+export.removing_export:Ø­Ø°Ù Ø§ÙÙ
+ÙÙÙØ§Øª Ø§ÙØ­Ø§ÙÙØ© ÙÙ
+Ø³Ø§Ø± Ø§ÙØªØµØ¯ÙØ±...
+
+export.sortmeta:Ø±ØªØš Ø§ÙÙØ«Ø§ØŠÙ ÙØ¬Ø§ØŠÙØ§Ù ØšØšÙØ§ÙØ§Øª Ù
+ÙØªØ§Ø¯Ø§ØªØ§ Ø§ÙØšÙØ§Ø¡, ÙÙØ°Ø§ ÙÙÙ ÙØªÙ
+ ÙÙ ÙØ§Ù groupsize > 1.  
+
+export.statsfile:Ø§Ø³Ù
+ Ø§ÙÙ
+ÙÙ Ø£Ù Ø·ØšØ§Ø¹Ø© Ø§ÙØ¥Ø­ØµØ§Ø¡Ø§Øª Ø§ÙÙ
+ØµØ¯Ø±Ø© Ø¥ÙÙÙ.  
+
+export.stats_backup:Ø³ÙØªÙ
+ Ø·ØšØ§Ø¹Ø© Ø¥Ø­ØµØ§Ø¡Ø§Øª ÙÙ STDERR ÙØšØ¯ÙÙ.  
+
+export.verbosity:Ø¶ØšØ· ÙÙ
+ÙØ© Ø§ÙÙ
+Ø®Ø±Ø¬t. 0=ÙØ§ØŽÙØ¡, 3=ÙØ«ÙØ±.
+
+
+
+# -- mkcol.pl --
+
+mkcol.about:ÙØµ Ø­ÙÙ ÙÙÙ
+Ø¬Ù
+ÙØ¹Ø©.
+
+mkcol.bad_name_cvs:Ø®Ø·Ø£: ÙØ§ ÙÙ
+ÙÙ Ø£Ù ØªØ³Ù
+Ù Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø© ØšØ§Ø³Ù
+ CVS ÙØ£Ù ÙØ°Ø§ ÙØ¯ ÙØªØ¯Ø§Ø®Ù Ù
+Ø¹ Ø§ÙØ£Ø¯ÙØ© Ø§ÙÙ
+ÙØŽØ£Ø© ØšÙØ§Ø³Ø·Ø© ÙØžØ§Ù
+ CVS versioning .  
+
+mkcol.bad_name_svn:Ø®Ø·Ø£ : ÙØ§ ÙÙ
+ÙÙ ØªØ³Ù
+ÙØ© Ù
+Ø¬Ù
+ÙØ¹Ø©. svn ÙØ£Ù ÙØ°Ø§ ÙØ¯ ÙØªØ¹Ø§Ø±Ø¶ Ù
+Ø¹ Ø§ÙØ£Ø¯ÙØ© Ø§ÙØªÙ Ø®ÙÙÙØ§ SVN .  
+
+mkcol.bad_name_modelcol:Ø®Ø·Ø£: ÙØ§ ÙÙ
+ÙÙ Ø£Ù ØªØ³Ù
+Ù Ù
+Ø¬Ù
+ÙØ¹Ø© ØšØ§ÙØ§Ø³Ù
+ modelcol ÙØ£Ù ÙØ°Ø§ Ø§ÙØ§Ø³Ù
+ ÙØ®ØªØµ ØšÙ
+Ø¬Ù
+ÙØ¹Ø© model .  
+
+mkcol.cannot_find_modelcol:Ø®Ø·Ø£: ÙÙ
+ ÙØªÙ
+ Ø§ÙØ¹Ø«ÙØ± Ø¹ÙÙ Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø© Ø§ÙÙÙ
+ÙØ°Ø¬ÙØ©%s  
+
+mkcol.col_already_exists:Ø®Ø·Ø£: ÙØ°Ù Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø© Ù
+ÙØ¬ÙØ¯Ø© Ù
+Ù ÙØšÙ.
+
+mkcol.collectdir:Ø§ÙØ¯ÙÙÙ Ø­ÙØ« ØªÙØŽØŠ Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø© Ø§ÙØ¬Ø¯ÙØ¯Ø©  
+
+mkcol.group_not_valid_in_gs3:Ø®ÙØ§Ø± Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø© ÙÙØ³ ØµØ§ÙØ­Ø§ ÙÙ Ø³ÙØ§Ù Ø¬Ø±ÙÙØ³ØªÙÙ3 (-gs3mode).
+mkcol.creating_col:Ø¥ÙØŽØ§Ø¡ Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø© %s
+
+mkcol.creator:Ø¹ÙÙØ§Ù Ø§ÙØšØ±ÙØ¯ Ø§ÙØ¥ÙÙØªØ±ÙÙÙ ÙÙ
+ÙØŽÙ Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø©.
+
+mkcol.creator_undefined:Ø®Ø·Ø£: ÙÙ
+ ÙØªÙ
+ ØªØ¹Ø±ÙÙ Ø§ÙÙ
+ÙØŽÙØ¡. ÙØ°Ø§ Ø§ÙÙ
+ØªØºÙØ± Ù
+Ø·ÙÙØš ÙÙØªØ¹Ø±Ù Ø¹ÙÙ Ø§ÙØªÙØ±Ø§Ø± ÙÙ Ø£Ø³Ù
+Ø§Ø¡ Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø§Øª.  
+
+mkcol.desc:ÙØµ PERL Ø§ÙØ°Ù ÙØ³ØªØ®Ø¯Ù
+ ÙØ¥ÙØŽØ§Ø¡ ÙÙÙÙ Ø¯ÙÙÙ ÙÙ
+Ø¬Ù
+ÙØ¹Ø© ÙØ±ÙÙØ³ØªÙÙ Ø¬Ø¯ÙØ¯Ø©.  
+
+mkcol.doing_replacements:Ø¥Ø¬Ø±Ø§Ø¡ Ø¥Ø³ØªØšØ¯Ø§Ù Ù %s
+
+mkcol.group:Ø¥ÙØŽØ§Ø¡ Ù
+Ø¬Ù
+ÙØ¹Ø© Ø¬Ø¯ÙØ¯Ø© Ù
+ÙØ­Ø¯Ø© ØšØ¯ÙØ§ Ù
+Ù Ù
+Ø¬Ù
+ÙØ¹Ø© Ù
+Ø¹ÙØ§Ø±ÙØ©.  
+
+mkcol.gs3mode:Ø³ÙØ§Ù Ù
+Ø¬Ù
+ÙØ¹Ø§Øª Ø¬Ø±ÙÙØ³ØªÙÙ 3 .  
+
+mkcol.long_colname:Ø®Ø·Ø£: ÙØ¬Øš Ø§Ù ÙÙÙÙ Ø¥Ø³Ù
+ Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø© Ø£ÙÙ Ù
+Ù 8 Ù
+Ø­Ø§Ø±Ù ÙØªØ­ÙÙÙ Ø§ÙØªÙØ§ÙÙ Ù
+Ø¹ ÙØžØ§Ù
+ Ø§ÙÙ
+ÙÙØ§Øª Ø§ÙÙØ¯ÙÙ
+
+
+mkcol.maintainer:Ø¹ÙÙØ§Ù Ø§ÙØ±ÙØ¯ Ø§ÙØ¥ÙÙØªØ±ÙÙÙ ÙÙ
+Ø§ÙÙ Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø© (Ø¥Ø°Ø§ ÙØ§Ù Ù
+Ø®ØªÙÙØ§ Ø¹Ù Ù
+ÙØŽÙ Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø©).
+
+mkcol.no_collectdir:Ø®Ø·Ø£: ÙØ§ ÙÙØ¬Ø¯ Ù
+Ø³Ø§Ø± Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø©: %s
+
+mkcol.no_collectdir_specified:Ø®Ø·Ø£ : ÙÙ
+ ÙØªÙ
+ ØªØ­Ø¯ÙØ¯ Ø¯ÙÙÙ Ù
+Ø¬Ù
+ÙØ¹Ø© . ÙÙÙ Ø³ÙØ§Ù gs3 Ø Ø³ÙØ§Ø¡ ÙÙ site- Ø£Ù collectdir- ÙØ¬Øš ØªØ­Ø¯ÙØ¯ Ø§ÙØ®ÙØ§Ø±".  
+
+mkcol.no_colname:Ø®Ø·Ø£: ÙÙ
+ ÙØªÙ
+ ØªØ­Ø¯ÙØ¯ Ø§Ø³Ù
+ ÙÙÙ
+Ø¬Ù
+ÙØ¹Ø©.
+
+mkcol.optionfile:ÙÙÙÙ Ø¥Ø³ØªØ®Ø¯Ø§Ù
+ Ø§ÙØ®ÙØ§Ø±Ø§Øª Ù
+Ù Ù
+ÙÙ Ù
+ÙÙØ¯Ø§ Ø­ÙÙÙ
+Ø§ ÙØªØ³ØšØš Ø·ÙÙ Ø£Ù
+Ø± Ø§ÙØ³Ø·Ø± ÙÙ Ù
+ØŽØ§ÙÙ Ù
+Ø¹ ØšØ¹Ø¶ Ø§ÙØ£ÙØžÙ
+Ø©
+
+mkcol.params:[Ø®ÙØ§Ø±Ø§Øª] Ø¥Ø³Ù
+-Ù
+Ø¬Ù
+ÙØ¹Ø©
+
+mkcol.plugin:ÙØ§Ø³ØªØ®Ø¯Ø§Ù
+ Perl plugin module (Ø±ØšÙ
+Ø§ ØªØ¬Ø¯ plugins Ù
+ØªØ¹Ø¯Ø¯Ø©).  
+
+mkcol.public:ÙÙ ÙØ§Ù ÙÙØ°Ù Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø© Ù
+Ø¯Ø®Ù ØªØµÙØ­ ØšØ§ÙÙ
+Ø®ØªØµØ±Ø§Øª.  
+mkcol.public.true:Ù
+Ø¬Ù
+ÙØ¹Ø© Ø¹Ø§Ù
+Ø©
+mkcol.public.false:Ù
+Ø¬Ù
+ÙØ¹Ø© Ø®Ø§ØµØ©
+
+mkcol.quiet:Ø¥Ø¹Ù
+Ù ØšÙØ¯ÙØ¡.
+
+mkcol.site:ÙÙ Ø³ÙØ§Ù gs3 Ø Ø§ÙØ³ØªØ®Ø¯Ù
+ Ø§Ø³Ù
+ ÙØ°Ø§ Ø§ÙÙ
+ÙÙØ¹ Ù
+Ø¹ Ù
+ØªØºÙØ± Ø§ÙØšÙØŠØ© GSDL3HOME  ÙØªØ­Ø¯ÙØ¯ collectdir- Ø Ù
+Ø§ ÙÙ
+ ÙØ­Ø¯Ø¯ collectdir-  
+
+mkcol.success:ØªÙ
+ Ø¥ÙØŽØ§Ø¡ Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø© Ø§ÙØ¬Ø¯ÙØ¯Ø© ØšÙØ¬Ø§Ø­ ÙÙ %s
+
+mkcol.title:Ø¹ÙÙØ§Ù Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø©.
+
+mkcol.win31compat:ÙÙ ÙÙ Ø­Ø§Ù ÙØ¬Øš Ø§Ù ÙØªØ·Ø§ØšÙ Ø§Ø³Ù
+ Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø© Ù
+Ø¹ ØªÙØ§ÙÙØ¯ Ù
+ÙÙØ§ØªWindows 3.1  (Ù
+Ø«Ø§Ù ÙÙØ³ Ø£ÙØ«Ø± Ù
+Ù 8 Ù
+Ø­Ø§Ø±Ù).  
+mkcol.win31compat.true:Ø¥Ø³Ù
+ Ø§ÙÙ
+Ø³Ø§Ø± 8 Ù
+Ø­Ø§Ø±Ù Ø£Ù Ø£ÙÙ
+mkcol.win31compat.false:Ø¥Ø³Ù
+ Ø§ÙÙ
+Ø³Ø§Ø± ØšØ§Ù Ø·ÙÙ
+
+# -- pluginfo.pl --
+
+pluginfo.collection:Ø¥Ø¹Ø·Ø§Ø¡ Ù
+Ø¬Ù
+ÙØ¹Ø© Ø¥Ø³Ù
+Ø§ Ø³ÙÙ ÙØ¬Ø¹Ù Ù
+ÙÙ plugoutinfo.pl ÙÙØžØ± Ø£ÙÙØ§ ÙÙ collect/collection-name/perllib/plugouts . Ø¥Ø°Ø§ ÙÙ
+ ÙØªÙ
+ Ø§ÙØ¹Ø«ÙØ± Ø¹ÙÙ plugout Ø³ÙÙ ÙØªÙ
+ Ø§ÙØšØ­Ø« ÙÙ Ø§ÙÙ
+Ø¬ÙØ¯ Ø§ÙØ¹Ø§Ù
+ perllib/plugouts .
+
+pluginfo.desc:Ø·ØšØ§Ø¹Ø© Ù
+Ø¹ÙÙÙ
+Ø§Øª Ø­ÙÙ Ù
+ÙØ§ØšØ³  
+
+pluginfo.general_options:Ø§ÙØ®ÙØ§Ø±Ø§Øª Ø§ÙØ¹Ø§Ù
+Ø© ÙØªÙ
+ ØªØ¶Ù
+ÙÙÙØ§ Ù
+Ù Ø§ÙÙØŠØ§Øª Ø§ÙØ£Ù
+ ÙÙÙ
+ØµÙÙ
+
+pluginfo.info:Ù
+Ø¹ÙÙÙ
+Ø§Øª
+
+pluginfo.no_plugin_name:Ø®Ø·Ø£: ÙØ¬Øš Ø¥Ø¹Ø·Ø§Ø¡ Ø¥Ø³Ù
+ ÙÙÙ
+ÙØ§ØšØ³.
+
+pluginfo.option_types:ÙÙ
+ÙÙ Ø§Ù ØªØ£Ø®Ø° Ø§ÙÙ
+ÙØ§ØšØ³ ÙÙØ¹ÙÙ Ù
+Ù Ø§ÙØ®ÙØ§Ø±Ø§Øª
+
+pluginfo.params:[Ø®ÙØ§Ø±Ø§Øª] Ø£Ø³Ù
+-Ù
+ÙØ§ØšØ³
+
+pluginfo.passing_options:ÙÙ
+ÙÙ ØªØ¹ÙÙÙ Ø§ÙØ®ÙØ§Ø±Ø§Øª ÙØ£Ù Ù
+ÙØ§ØšØ³ ØšØªØ¶Ù
+ÙÙÙØ§ ÙÙ Ù
+ÙÙ Ø§ÙØ¥Ø¹Ø¯Ø§Ø¯ collect.cfg .
+
+pluginfo.specific_options:Ø§ÙØ®ÙØ§Ø±Ø§Øª Ø§ÙÙ
+Ø®ØµØµØ© Ù
+Ø¹Ø±ÙØ© Ø¶Ù
+Ù plugout Ù ÙÙ Ù
+ØªØ§Ø­Ø© ÙÙØ· ÙÙ plugout.  
+
+
+# -- plugoutinfo.pl --
+
+plugoutinfo.collection:Ø¥Ø¹Ø·Ø§Ø¡ Ø§Ø³Ù
+ ÙÙÙ
+Ø¬Ù
+ÙØ¹Ø© Ø³ÙÙ ÙØ¬Ø¹Ù Ø§ÙÙ
+ÙÙ plugoutinfo.pl ÙØšØ­Ø« Ø£ÙÙØ§ ÙÙ collect/collection-name/perllib/plugouts . Ø«Ù
+ ØšØ¹Ø¯ Ø°ÙÙ Ø³ÙÙ ÙØšØ­Ø« ÙÙ Ø¯ÙÙÙ perllib/plugouts Ø§ÙØ¹Ø§Ù
+.  
+
+plugoutinfo.desc:Ø·ØšØ§Ø¹Ø© Ù
+Ø¹ÙÙÙ
+Ø§Øª Ø¹Ù Ø¥ÙÙØ§Ø¡ Ø§ÙØšØ±ÙØ§Ù
+Ø¬.  
+
+plugoutinfo.general_options:Ø§ÙØ®ÙØ§Ø±Ø§Øª Ø§ÙØ¹Ø§Ù
+Ø© ÙØªÙ
+ ØªØ¶Ù
+ÙÙÙØ§ Ù
+Ù Ø§ÙÙØŠØ§Øª Ø§ÙØ£Ù
+ ÙÙÙ
+ØµÙÙ
+
+plugoutinfo.info:Ù
+Ø¹ÙÙÙ
+Ø§Øª
+
+plugoutinfo.no_plugout_name:Ø®Ø·Ø£: ÙØ¬Øš Ø¥Ø¹Ø·Ø§Ø¡ Ø¥Ø³Ù
+  plugout .  
+
+plugoutinfo.option_types:Plugouts Ø±ØšÙ
+Ø§ ØªØ£Ø®Ø° ÙÙØ¹ÙÙ Ù
+Ù Ø§ÙØ®ÙØ§Ø±Ø§Øª.  
+
+plugoutinfo.params:[Ø®ÙØ§Ø±Ø§Øª] plugout-name
+
+plugoutinfo.passing_options:Ø§ÙØ®ÙØ§Ø±Ø§Øª ÙÙ
+ÙÙ ØªØ®Ø·ÙÙØ§ Ø¹Ù Ø·Ø±ÙÙ Ù
+ÙÙ Ø§ÙØ®ØµØ§ØŠØµ collect.cfg.  
+
+plugoutinfo.specific_options:Ø§ÙØ®ÙØ§Ø±Ø§Øª Ø§ÙÙ
+Ø®ØµØµØ© Ù
+Ø¹Ø±ÙØ© Ø¶Ù
+Ù plugout Ù ÙÙ Ù
+ØªØ§Ø­Ø© ÙÙØ· ÙÙ plugout.  
+
+
+
+#
+# Classifier option descriptions
+#
+
+AllList.desc:Ø¥ÙØŽØ§Ø¡ ÙØ§ØŠÙ
+Ø© ÙØ§Ø­Ø¯Ø© ØšÙÙ Ø§ÙÙØ«Ø§ØŠÙ . ØªØ³ØªØ®Ø¯Ù
+ ØšÙ
+Ø²ÙØ¯ oai.  
+
+AZCompactList.allvalues:Ø§Ø³ØªØ®Ø¯Ù
+ ÙÙ ÙÙÙ
+ ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª Ø§ÙÙ
+ÙØ¬ÙØ¯Ø©.
+
+AZCompactList.desc:Ù
+ÙØ§ØšØ³ Ø§ÙÙ
+ØµÙÙ ÙÙÙØ±Ø² Ø§ÙØ£ÙÙØšØ§ØŠÙ
+
+AZCompactList.doclevel:Ù
+Ø³ØªÙÙ Ù
+Ø¹Ø§ÙØ¬Ø© Ø§ÙÙØ«ÙÙØ©.
+AZCompactList.doclevel.top:ÙÙ Ø§ÙÙØ«ÙÙØ©.
+AZCompactList.doclevel.section:ØšØ§ÙØ£ÙØ³Ø§Ù
+.
+
+AZCompactList.firstvalueonly:Ø§Ø³ØªØ®Ø¯Ù
+ Ø§ÙÙ ÙÙÙ
+Ø© ÙÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª Ø§ÙÙ
+ÙØ¬ÙØ¯Ø© ÙÙØ·.
+
+AZCompactList.freqsort:Ø£ÙØ±Ø² ØšØ§ÙØ¹ÙØ¯ Ø¯ÙÙ Ø§ÙÙØ±Ø² Ø§ÙØ£ÙÙØšØ§ØŠÙ.  
+
+AZCompactList.maxcompact:Ø§ÙØ­Ø¯ Ø§ÙØ§ÙØµÙ ÙØ¹Ø¯Ø¯ Ø§ÙØµÙØ± ØªØžÙØ± ÙÙ Ø§ÙÙÙ Ø§ÙØªØµÙÙØ±Ù ÙÙ Ø§Ù ÙÙØª Ù
+Ù Ø§ÙØ§ÙÙØ§Øª  
+
+AZCompactList.metadata:Ø­ÙÙ ÙØ§ØµÙØ§Øª ØšÙØ§ÙØ§Øª ÙØ­ÙØ¯ Ø£Ù ÙØ§ØŠÙ
+Ø© Ù
+ÙØµÙÙØ© ØšÙØ§ØµÙØ© Ø ØªØ³ØªØ®Ø¯Ù
+ ÙÙØªØµÙÙÙ. Ø¥Ø°Ø§ ØªÙ
+ ØªØ­Ø¯ÙØ¯ ÙØ§ØŠÙ
+Ø© Ø³ÙÙ ÙØ³ØªØ®Ø¯Ù
+ Ø£ÙÙ ÙÙØ¹
+
+AZCompactList.mincompact:Ø§ÙØ¹Ø¯Ø¯ Ø§ÙØ£Ø¯ÙÙ ÙÙÙØ«Ø§ØŠÙ / ØµÙØ­Ø©.  
+
+AZCompactList.mingroup:Ø§ÙÙÙÙ
+Ø© Ø§ÙØµØºØ±Ù Ø§ÙØªÙ ØªØªØ³ØšØš ØšØªÙÙÙÙ Ù
+Ø¬Ù
+ÙØ¹Ø© ÙÙ ÙÙ Ø§ÙØªØ±ØªÙØš Ø§ÙÙØ±Ù
+Ù  
+
+AZCompactList.minnesting:Ø§ÙÙÙÙ
+Ø© Ø§ÙØµØºØ±Ù Ø§ÙØªÙ ØªØ³ØšØš ØšØªØ­ÙÙÙ ÙØ§ØŠÙ
+Ø© Ø¥ÙÙ ÙØ§ØŠÙ
+Ø© Ù
+ØªØ¯Ø§Ø®ÙØ©  
+
+AZCompactList.recopt:Ù
+Ø³ØªØ®Ø¯Ù
+Ø© ÙÙ ÙØ§ØµÙØ§Øª ØšÙØ§ÙØ§Øª Ù
+ØªØ¯Ø§Ø®ÙØ© Ù
+Ø«Ù ÙØ§ØµÙØ§Øª Ø§ÙØ³ÙØ© / Ø§ÙÙ
+ÙØžÙ
+Ø©.  
+AZCompactList.sort:Ø­ÙÙ ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª ÙÙØ±Ø² ÙØ±ÙØ© Ø§ÙØ¹ÙØ¯ ØšÙØ§.  
+
+AZCompactSectionList.desc:AZCompactList ÙØµÙÙ Ø§ÙØ£ÙØ³Ø§Ù
+ Ø¯ÙÙ Ø§ÙÙØ«Ø§ØŠÙ. ÙØªÙ
+ ÙØ±Ø² ÙÙÙØ§ ÙÙ
+Ø³ØªÙÙ ÙØ§ØµÙØ© ØšÙØ§ÙØ§Øª Ø§ÙÙØ³Ù
+.  
+
+AZList.desc:ØšØ±ÙØ§Ù
+Ø¬ ÙÙØªØµÙÙÙ ÙØ±ØªØš ÙØ¬Ø§ØŠÙØ§ (Ø£-Ù Ù a-z Ù A-Z Ù 0-9). ÙÙÙØªØ¬ ÙØ°Ø§ Ø§ÙØšØ±ÙØ§Ù
+Ø¬ ÙØ§ØŠÙ
+Ø© ÙØ¬Ø§ØŠÙØ© ØšØ§ÙÙØ«Ø§ØŠÙ Ø§ÙÙ
+Ø±ØªØšØ© ØªØ­Øª ÙÙ Ø­Ø±Ù.  
+
+AZList.metadata:Ø­ÙÙ ÙØ§ØµÙØ§Øª ØšÙØ§ÙØ§Øª ÙØ§Ø­Ø¯ Ø£Ù ÙØ§ØŠÙ
+Ø© Ø­ÙÙÙ ÙØ§ØµÙØ§Øª ØšÙØ§ÙØ§Øª Ù
+ÙØµÙÙØ© ØšÙØ§ØµÙØ© ØªØ³ØªØ®Ø¯Ù
+ ÙÙØªØµÙÙÙ.ØªØšØ¹Ø§ ÙÙØªØ±ØªÙØš Ø§ÙØ°Ù ØªØ¯Ù Ø¹ÙÙÙ Ø§ÙÙØ§ØŠÙ
+Ø©Ø ÙØ§Ù Ø§ÙÙ Ø­ÙÙ ÙÙØ§ØµÙØ§Øª ØšÙØ§ÙØ§Øª ÙØªÙ
+Ù ÙÙÙ
+Ø© Ø³ÙÙ ÙØ³ØªØ®Ø¯Ù
+. Ø³ÙÙ ÙØªÙ
+ ÙØ±Ø² Ø§ÙÙØ§ØŠÙ
+Ø© ÙÙÙØ§ ÙÙØ°Ø§ Ø§ÙØ¹ÙØµØ± Ø¥ÙØ§ Ø¥Ø°Ø§ Ø§Ø³ØªØ®Ø¯Ù
+  -sort .Ø¥Ø°Ø§ ÙÙ
+ ÙØªÙ
+ ØªØ­Ø¯ÙØ¯ ÙØ§ØµÙØ© ØšÙØ§ÙØ§Øª ÙØ§Ù Ø¬Ù
+ÙØ¹ Ø§ÙÙØ«Ø§ØŠÙ Ø³ÙØªÙ
+ Ø¥Ø¯Ø±Ø§Ø¬ÙØ§ ÙÙ Ø§ÙÙØ§ØŠÙ
+Ø©Ø ÙØ§ÙØ§ Ø³ÙÙ Ø§ÙÙØ«Ø§ØŠÙ Ø§ÙØªÙ ØªØªØ¶Ù
+Ù ÙÙÙ
+Ø© ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª Ø³ØªØ¯Ø±Ø¬.  
+
+AZSectionList.desc:Ø§ÙØªÙÙØ¹ ÙÙ Ø§ÙÙØ§ØŠÙ
+Ø© Ø§ÙÙØ¬Ø§ØŠÙØ© ØšØªØµÙÙÙ Ø§ÙØ£ÙØ³Ø§Ù
+ ÙØ¶ÙØ§ Ø¹Ù Ø§ÙÙØ«Ø§ØŠÙ. ØªØ±ØªØš Ø§ÙÙ
+Ø¯Ø§Ø®Ù ØšÙ
+ÙØªØ§Ø¯Ø§ØªØ§ Ù
+Ø³ØªÙÙ Ø§ÙÙØ³Ù
+  
+
+BasClas.bad_general_option:Ø§ÙÙ
+ØµÙÙ  %s ÙØ³ØªØ®Ø¯Ù
+ Ø®ÙØ§Ø±Ø§Øª ØºÙØ± ØµØ­ÙØ­Ø©.Ø¥ÙØ­Øµ Ù
+ÙÙ Ø§ÙØ¥Ø¹Ø¯Ø§Ø¯ collect.cfg .  
+
+BasClas.builddir:Ø£ÙÙ ØªÙØ¶Ø¹ Ø§ÙÙØŽØ§ÙØ§Øª Ø§ÙÙ
+ØšÙÙØ©.
+
+BasClas.buttonname:Ø¥Ø³Ù
+ Ø§ÙÙ
+ØµÙÙ ÙÙ Ø§ÙØŽØ§ØŽØ© Ù ÙÙ Ø¹Ù
+ÙØ¯ Ø§ÙØªØ¬ÙØ§Ù. Ø§ÙÙÙÙ
+Ø© Ø§ÙØ¥ÙØªØ±Ø§Ø¶ÙØ© ÙÙ Ø¹ÙØµØ± ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª Ø§ÙÙ
+Ø®ØµØµØ© Ù
+Ø¹ Ø§ÙØ¥Ø³Ù
+
+
+BasClas.desc:Ø§ÙÙØŠØ© Ø§ÙØ£Ø³Ø§Ø³ÙØ© ÙÙÙ Ø§ÙÙ
+ØµÙÙØ§Øª.
+
+BasClas.no_metadata_formatting:ÙØ§ ØªØ­Ø§ÙÙ Ø¹Ù
+Ù Ø§Ù Ø¹Ø±Ø¶ ØªÙÙØ§ØŠÙ ÙÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª (ÙÙÙØ±Ø²)
+
+BasClas.outhandle:Ù
+ÙÙ ÙØªØ§ØšØ© Ø§ÙÙ
+Ø®Ø±Ø¬ Ø¥ÙÙ.
+
+BasClas.removeprefix:ØªØ¬Ø§ÙÙ ØšØ§Ø¯ØŠØ© ÙÙ ÙÙÙ
+ ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª Ø¹ÙØ¯ Ø§ÙÙØ±Ø².
+
+BasClas.removesuffix:ØªØ¬Ø§ÙÙ ÙØ§Ø­ÙØ© ÙÙ ÙÙÙ
+ ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª Ø¹ÙØ¯ Ø§ÙÙØ±Ø².
+
+BasClas.verbosity:Ø¶ØšØ· ÙÙ
+ÙØ© Ø§ÙÙ
+Ø®Ø±Ø¬t. 0=ÙØ§ØŽÙØ¡, 3=ÙØ«ÙØ±.
+
+Browse.desc:.
+
+DateList.bymonth:ØµÙÙ ØšØ§ÙØ³ÙØ© Ù Ø§ÙØŽÙØ± ØšØ¯ÙØ§ Ù
+Ù Ø§ÙØ³ÙØ© ÙÙØ·.
+
+DateList.desc:ØšØ±ÙØ§Ù
+Ø¬ Ø§ÙÙ
+ØµÙÙ ÙÙØªØ±ØªÙØš ØšØ§ÙØªØ§Ø±ÙØ®. ÙÙÙÙ
+ ØªÙÙØ§ØŠÙØ§Ù ØšØ§ÙØªØ±ØªÙØš ØšØ­ÙÙ Ø§ÙÙ
+ÙØªØ§Ø¯Ø§ØªØ§ Ø§ÙØ®Ø§Øµ ØšØ§ÙØªØ§Ø±ÙØ®. ØªØµØ§Øº Ø§ÙØªÙØ§Ø±ÙØ® ÙÙ ØµÙØ±Ø© yyyymmdd Ø£Ù yyyy-mm-dd.  
+
+DateList.metadata:ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª Ø§ÙØªÙ ØªØªØ¶Ù
+Ù Ø§ÙØªÙØ§Ø±ÙØ® Ø§ÙÙ
+ØµÙÙ ØšÙØ§.Ø§ÙØµÙØºØ© Ø§ÙÙ
+ØªÙÙØ¹Ø© ÙÙ  yyyymmdd Ø£Ù yyyy-mm-dd. ÙÙ
+ÙÙ Ø£Ù ØªÙÙÙ ÙØ§ØŠÙ
+Ø© Ù
+ÙØµÙÙØ© ØšÙØ§ØµÙØ©Ø Ù Ø§ÙÙ ØªØ§Ø±ÙØ® ÙÙØ¬Ø¯ Ø³ÙÙ ÙØ³ØªØ®Ø¯Ù
+.  
+
+DateList.reverse_sort:ÙØ±Ø² Ø§ÙÙØ«Ø§ØŠÙ ÙÙ ØªØ±ØªÙØš Ø²Ù
+ÙÙ Ù
+Ø¹ÙÙØ³ (Ø§ÙØ£Ø­Ø¯Ø« Ø£ÙÙØ§).  
+
+DateList.nogroup:Ø¬Ø¹Ù ÙÙ Ø³ÙØ© Ù
+Ø¯Ø®Ù ÙØ±Ø¯Ù ÙÙ ÙØ§ØŠÙ
+Ø© Ø§ÙÙÙÙ ØšØ¯ÙØ§ Ù
+Ù Ø§Ù ØªÙ
+ØªØ¯ Ø³ÙÙØ§Øª ØšÙ
+Ø¯Ø§Ø®Ù ÙÙÙÙØ©. (ÙÙØ°Ø§ ÙÙ
+ÙÙ Ø§Ù ØªØ³ØªØ®Ø¯Ù
+ Ø§ÙØ¶Ø§ Ù
+Ø¹ bymonth - Ø§ÙØ®ÙØ§Ø± ÙØ¬Ø¹Ù ÙÙ ØŽÙØ± Ù
+Ø¯Ø®Ù ÙØ±Ø¯Ù ØšØ¯ÙØ§ Ù
+Ù Ø§ÙØ¯Ù
+Ø¬).  
+
+DateList.no_special_formatting:ÙØ§ ØªØ¹Ø±Ø¶ Ù
+Ø¹ÙÙÙ
+Ø§Øª Ø§ÙØ³ÙØ© Ù Ø§ÙØŽÙØ± ÙÙ ÙØ§ØŠÙ
+Ø© Ø§ÙÙØ«ÙÙØ©.
+
+DateList.sort:Ø­ÙÙ ÙØ§ØµÙØ§Øª ØšÙØ§ÙØ§Øª Ø¥Ø¶Ø§ÙÙ ÙØ³ØªØ®Ø¯Ù
+ ÙÙÙØ±Ø² ÙÙ Ø­Ø§ÙØ© ØªØŽØ§ØšÙ ÙØ«ÙÙØªÙÙ ÙÙ ÙÙØ³ Ø§ÙØªØ§Ø±ÙØ®.
+
+HFileHierarchy.desc:Ù
+ØµÙÙ Ø§ÙÙ
+ÙØ§ØšØ³ ÙØªÙÙÙØ¯ ØªØµÙÙÙØ§Øª Ø¹ÙÙ Ø§Ø³Ø§Ø³ ÙØ±Ù
+Ù ÙÙ ÙÙÙÙ Ø§ÙÙ
+ÙÙ Ø§ÙØªÙÙ
+ÙÙÙ  
+
+Hierarchy.desc:Ù
+ØµÙÙ Ø§ÙÙ
+ÙØ§ØšØ³ ÙØªÙÙÙØ¯ Ø§ÙØªØµÙÙÙ Ø§ÙÙØ±Ù
+Ù. ÙØ°Ø§ ÙÙ
+ÙÙ Ø§Ù ÙØ³ØªÙØ¯ Ø¹ÙÙ ÙØ§ØµÙØ§Øª ØšÙØ§ÙØ§Øª Ù
+ÙÙÙÙØ© Ø Ø§Ù ÙÙ
+ÙÙ Ø§Ø³ØªØ®Ø¯Ø§Ù
+ ÙÙÙÙ Ù
+ÙÙ ØªÙÙ
+ÙÙÙ (hfile - Ø§Ø³ØªØ®Ø¯Ø§Ù
+ Ø§ÙØ®ÙØ§Ø±).  
+
+Hierarchy.documents_last:Ø¹Ø±Ø¶ Ø¹ÙØ¯ Ø§ÙÙØ«ÙÙØ© ØšØ¹Ø¯ Ø¹ÙØ¯ Ø§ÙÙ
+ØµÙÙ  
+
+Hierarchy.hfile:Ø§Ø³ØªØ®Ø¯Ø§Ù
+ Ù
+ÙÙ ÙÙÙÙ Ø§ÙØªØµÙÙÙ Ø§ÙÙ
+Ø­Ø¯Ø¯.  
+
+Hierarchy.hlist_at_top:Ø¹Ø±Ø¶ Ø§ÙÙ
+Ø³ØªÙÙ Ø§ÙØ£ÙÙ ÙÙØªØµÙÙÙ Ø£ÙÙÙØ§.
+
+Hierarchy.reverse_sort:ÙØ±Ø² Ø§ÙØ¹ÙØ¯ ÙÙ ØªØ±ØªÙØš Ø¹ÙØ³Ù (ÙØ³ØªØ®Ø¯Ù
+ Ù
+Ø¹ -sort).  
+
+Hierarchy.separator:ØªØ¹ØšÙØ± Ù
+Ø¹ØªØ§Ø¯ ÙØ³ØªØ®Ø¯Ù
+ ÙÙÙØ§ØµÙØ Ø¥Ø°Ø§ ÙÙØª ØªØ³ØªØ®Ø¯Ù
+ Ù
+ÙØªØ§Ø¯Ø§ØªØ§ Ù
+ÙÙÙÙØ©.  
+
+Hierarchy.sort:Ø­ÙÙ ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª Ø§ÙÙ
+Ø³ØªØ®Ø¯Ù
+ ÙÙØ±Ø² Ø§ÙØ¹ÙØ¯.ÙÙ ØªÙØ±Ø² Ø§ÙØ£ÙØ±Ø§Ù Ø¥Ø°Ø§ ÙÙ
+ ÙØªÙ
+ ØªØ¹ÙÙÙØ§.
+
+Hierarchy.suppressfirstlevel:ØªØ¬Ø§ÙÙ Ø§ÙØ¬Ø²Ø¡ Ø§ÙØ£ÙÙ Ù
+Ù ÙÙÙ
+Ø© ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª. Ù ÙØ°Ø§ Ù
+ÙÙØ¯ ÙÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª Ø§ÙØªÙ ÙÙÙÙ Ø§ÙØ¹ÙØµØ± Ø§ÙØ£ÙÙ ÙÙÙØ§ Ù
+ØŽØªØ±Ù. Ù
+Ø«Ù Ù
+Ø«Ù Ø¥Ø³ØªÙØ±Ø§Ø¯ Ø¯ÙÙÙ ÙÙ gsdlsourcefilename.  
+
+Hierarchy.suppresslastlevel:ØªØ¬Ø§ÙÙ Ø§ÙØ¬Ø²Ø¡ Ø§ÙØ£Ø®ÙØ± Ù
+Ù ÙÙÙ
+Ø© ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª.Ù ÙØ°Ø§ Ù
+ÙÙØ¯ ÙÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª Ø§ÙØªÙ ØªÙÙÙ ÙÙ ÙÙÙ
+Ø© ÙÙÙØ§ ÙØ±ÙØ¯Ø© Ù
+Ø«Ù Ù
+Ø³Ø§Ø± Ù
+ÙÙ.  
+
+HTML.desc:ÙÙØŽÙØ¡ ØªØµÙÙÙ ÙØ§Ø±Øº ÙÙÙ Ø¹ØšØ§Ø±Ø© Ø¹Ù Ø±Ø§ØšØ·Ø© ÙØµÙØ­Ø© Ø¥ÙØªØ±ÙØª.  
+
+HTML.url:Ø±ØšØ· Ø¹ÙÙØ§Ù ØµÙØ­Ø© Ø§ÙÙ
+ÙØ§Ø±Ø¯ ÙØµÙØ­Ø© Ø§ÙÙØš Ø¥ÙÙ.
+
+List.bookshelf_type:ÙÙØªØ­ÙÙ
+ Ø¹ÙØ¯ Ø¥ÙØŽØ§Ø¡ Ø±ÙÙÙ Ø§ÙÙØªØš  
+List.bookshelf_type.always:Ø¥ÙØŽØ§Ø¡ Ø£ÙÙÙÙØ© Ø±Ù ÙØªØš Ø­ØªÙ Ø¥Ø°Ø§ ÙØ§Ù ÙÙØ§Ù Ø¹ÙØµØ± ÙØ§Ø­Ø¯ ÙÙØ· ÙÙ ÙÙ Ø±Ù  
+List.bookshelf_type.never:ÙØ§ ØªÙØŽÙØ¡ Ø£ÙÙÙÙØ© Ø±Ù ÙØªØš Ø­ØªÙ Ø¥Ø°Ø§ ÙØ§Ù ÙÙØ§Ù Ø§ÙØ«Ø± Ù
+Ù Ø¹ÙØµØ± ÙØ§Ø­Ø¯ ÙÙ ÙÙ Ø±Ù  
+List.bookshelf_type.duplicate_only:Ø¥ÙØŽØ§Ø¡ Ø£ÙÙÙÙØ© Ø±Ù ÙØªØš Ø­ØªÙ Ø¥Ø°Ø§ ÙØ§Ù ÙÙØ§Ù Ø£ÙØ«Ø± Ù
+Ù Ø¹ÙØµØ± ÙØ§Ø­Ø¯ ÙÙØ· ÙÙ ÙÙ Ø±Ù  
+
+List.classify_sections:ØªØµÙÙÙ Ø§ÙØ£ÙØ³Ø§Ù
+ ØšØ¯ÙØ§ Ù
+Ù Ø§ÙÙØ«Ø§ØŠÙ.
+
+List.desc:ÙØ§ØŠÙ
+Ø© Ù
+ØµÙÙ Ø¹Ø§Ù
+Ø© Ù Ù
+Ø±ÙØ© ÙØªØªØ¶Ù
+Ù Ù
+Ø¹ØžÙ
+ ÙØ¯Ø±Ø§Øª azcompactlist Ø ÙÙÙÙ ØšØ§ÙØ¶Ù ÙÙÙÙÙÙØ¯ Ø ÙØ§ØµÙØ§Øª ØšÙØ§ÙØ§Øª ÙÙØ¯Ø±Ø§Øª Ø§ÙÙØ±Ø².  
+
+List.level_partition.per_letter:Ø§ÙØŽØ§Ø¡ ÙØ·Ø§Ø¹ ÙÙÙ Ø­Ø±Ù  
+List.level_partition.constant_size:Ø§ÙØŽØ§Ø¡ ÙØ·Ø§Ø¹ ØšØ­Ø¬Ù
+ Ø«Ø§ØšØª  
+List.level_partition.per_letter_fixed_size:Ø§ÙØŽØ§Ø¡ ÙØ·Ø§Ø¹ ØšØ­Ø¬Ù
+ Ø«Ø§ØšØª ØªÙØ±ÙØšØ§ ÙÙÙ Ø­Ø±Ù  
+
+List.metadata:Ø­ÙÙÙ ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª ØªØ³ØªØ®Ø¯Ù
+ ÙÙØªØµÙÙÙ. Ø§Ø³ØªØ®Ø¯Ù
+ "/" ÙÙØµÙ Ø§ÙÙ
+Ø³ØªÙÙØ§Øª Ø§ÙÙØ±Ù
+ÙØ© Ù ";" ÙÙØµÙ Ø­ÙÙÙ ÙØ§ØµÙØ§Øª Ø§ÙØšÙÙØ§Øª ÙÙ ÙÙ Ù
+Ø³ØªÙÙ  
+
+List.partition_name_length:Ø·ÙÙ Ø§Ø³Ù
+ Ø§ÙÙØ·Ø§Ø¹ ; Ø¥ÙØªØ±Ø§Ø¶ÙØ§ Ù
+ØªØºÙØ± Ø§ÙØ·ÙÙ Ù
+Ù 1 Ø§ÙÙ 3 Ù
+Ø­Ø§Ø±Ù Ù ÙØªÙÙÙ ÙØ°Ø§ Ø¹ÙÙ Ù
+Ø¯Ù Ø§ÙØ­ÙØ¬Ø© Ø§ÙÙ ØªÙ
+ÙØ² ØšØ¯Ø§ÙØ© Ø§ÙÙØ·Ø§Ø¹ Ù
+Ù ÙÙØ§ÙØªÙ. ÙØ³ØªØ®Ø¯Ù
+ ÙØ°Ø§ Ø§ÙØ®ÙØ§Ø± ÙÙØ· Ø¹ÙØ¯ ØªØ¹ÙÙ partition_type_within_level Ø§ÙÙ 'constant_size'.
+
+List.partition_size_within_level:Ø¹Ø¯Ø¯ Ø§ÙÙ
+ÙØ§Ø¯ ÙÙ ÙÙ ÙØ³Ù
+ (ÙÙ
+ÙÙ Ø§ÙØ­ØµÙÙ Ø¹ÙÙÙØ§ ÙÙØ· Ø¹ÙØ¯Ù
+Ø§ partition_type_within_level Ù
+Ø¶ØšÙØ· Ø¹ÙÙ 'constant_size').
+
+List.partition_type_within_level:ØªØ­Ø¯ÙØ¯ Ø§ÙØªÙØ³ÙÙ
+ Ø§ÙÙØ·Ø§Ø¹Ù : Ø§Ù
+Ø§ 'per_letter',
+
+List.sort_leaf_nodes_using:Ø­ÙÙÙ Ø§ÙÙ
+ÙØªØ§Ø¯Ø§ØªØ§ Ø§ÙÙ
+Ø³ØªØ®Ø¯Ù
+Ø© ÙØªØ±ØªÙØš Ø§ÙØ£ÙØ±Ø§Ù. Ø§Ø³ØªØ®Ø¯Ù
+ '|' ÙÙ ØªÙØµÙ ØšÙÙ Ù
+Ø¬Ù
+ÙØ¹Ø§Øª Ø§ÙÙ
+ÙØªØ§Ø¯Ø§ØªØ§ ÙÙ ÙÙÙÙ Ø§ÙØªØ±ØªÙØš Ù
+Ø¶ØšÙØ·. Ù ';' ÙÙÙØµÙ Ø­ÙÙÙ Ø§ÙÙ
+ÙØªØ§Ø¯Ø§ØªØ§ ÙÙ Ø­ÙÙ Ù
+Ø¬Ù
+ÙØ¹Ø© Ø¹ÙÙ Ø­Ø¯Ø©.
+
+List.sort_using_unicode_collation:Ø§ÙÙØ±Ø²  ØšØ§Ø³ØªØ®Ø¯Ø§Ù
+ Ø®ÙØ§Ø±Ø²Ù
+ÙØ© Ø§ÙÙÙÙÙÙØ¯ Ø§ÙÙ
+Ø¬Ù
+Ø¹ . ÙØªØ·ÙØš ØªÙØ²ÙÙ Ø§ÙÙ
+ÙÙ http://www.unicode.org/Public/UCA/latest/allkeys.txt ÙÙØ¶Ø¹Ù ÙÙ Ø§ÙÙ
+Ø¬ÙØ¯ Ù
+ÙÙ ÙÙØªØ­Ù
+ÙÙ ÙÙ perlib/Unicode/Collate.
+
+List.use_hlist_for:Ø­ÙÙÙ Ø§ÙÙ
+ÙØªØ§Ø¯Ø§ØªØ§ ØªØ³ØªØ®Ø¯Ù
+ hlist ØšØ¯ÙØ§ Ù
+Ù vlist. Ø§Ø³ØªØ®Ø¯Ù
+ (Ø) ÙÙØµÙ Ù
+Ø¬Ù
+ÙØ¹Ø§Øª Ø§ÙÙ
+ÙØªØ§Ø¯Ø§ØªØ§Ø Ù(Ø) ÙÙØµÙ Ø­ÙÙÙ Ø§ÙÙ
+ÙØªØ§Ø¯Ø§ØªØ§ ÙÙ ÙÙ Ù
+Ø¬Ù
+ÙØ¹Ø©.
+
+SimpleList.metadata:Ø­ÙÙ ÙØ§ØµÙØ§Øª ØšÙØ§ÙØ§Øª ÙØ­ÙØ¯ Ø£Ù ÙØ§ØŠÙ
+Ø© Ù
+ÙØµÙÙØ© ØšÙØ§ØµÙØ© Ø ØªØ³ØªØ®Ø¯Ù
+ ÙÙØªØµÙÙÙ. Ø¥Ø°Ø§ ØªÙ
+ ØªØ­Ø¯ÙØ¯ ÙØ§ØŠÙ
+Ø© Ø³ÙÙ ÙØ³ØªØ®Ø¯Ù
+ Ø£ÙÙ ÙÙØ¹ ÙØ§ØµÙØ§Øª ØšÙØ§ÙØ§Øª ÙØ¯ÙÙ ÙÙÙ
+Ø©. ÙÙ
+ÙÙ Ø¥Ø³ØªØ®Ø¯Ø§Ù
+ÙØ§ Ù
+Ø¹  -firstvalueonly Ù -allvalues ØŽØ§Ø±Ø§Øª Ø§ÙØªÙ
+ÙØ², ÙØ¥Ø³ØªØ®Ø¯Ø§Ù
+ Ø§ÙÙÙÙ
+Ø© Ø§ÙØ£ÙÙÙ Ø£Ù ÙÙ Ø§ÙÙÙÙ
+ ÙÙ Ø§ÙÙØ§ØŠÙ
+Ø©.
+
+SimpleList.desc:Ù
+ÙØ§ØšØ³ Ù
+ØµÙÙ ÙØ§ØŠÙ
+Ø© ØšØ³ÙØ·Ø©
+
+SimpleList.sort:Ø­ÙÙ Ø§ÙÙ
+ÙØªØ§Ø¯Ø§ØªØ§ ÙÙØªØ±ØªÙØš. Ø§Ø³ØªØ®Ø¯Ù
+ '-sort nosort' ÙÙ ÙÙØª ÙØ§ ØªØ±ÙØ¯ ØªØ±ØªÙØš.
+
+Phind.desc:Ù
+ØµÙÙ Ù
+ÙØ§ØšØ³ Ø§ÙØ¬Ù
+ÙØ©.
+
+Phind.language:Ø§ÙÙØºØ© Ø§Ù Ø§ÙÙØºØ§Øª Ø§ÙÙ
+Ø³ØªØ®Ø¯Ù
+Ø© ÙÙØšÙØ§Ø¡ Ø§ÙÙØ±Ù
+Ù.
+
+Phind.min_occurs:Ø§ÙØ­Ø¯ Ø§ÙØ§Ø¯ÙÙ ÙØ¹Ø¯Ø¯ Ø§ÙÙ
+Ø±Ø§Øª Ø§ÙØªÙ ÙØ¬Øš Ø§Ù ØªØžÙØ± Ø§ÙØ¹ØšØ§Ø±Ø© ÙÙ Ø§ÙÙØµ Ø§ÙÙ
+Ø±Ø§Ø¯ Ø§Ø¯Ø±Ø§Ø¬ÙØ§ ÙÙ Ø§ÙØ¬Ù
+ÙÙ Ø§ÙÙØ±Ù
+ÙÙ.  
+
+Phind.savephrases:Ø°Ø§ ØªÙ
+ ØªØ¹ÙÙØØªØ®Ø²Ù Ù
+Ø¹ÙÙÙ
+Ø§Øª Ø§ÙØ¹ØšØ§Ø±Ø© ÙÙ Ù
+ÙÙ Ù
+Ø¹Ø·Ù Ø¹ÙÙ Ø§Ø³Ø§Ø³ ÙØµ. Ù ÙØ¹ÙÙ Ù
+Ù Ø§ÙÙ
+Ø³ØªØ­Ø³Ù Ø¥Ø³ØªØ®Ø¯Ø§Ù
+ Ù
+Ø³Ø§Ø± Ù
+Ø·ÙÙ  
+
+Phind.suffixmode:Ù
+Ø¹Ø§Ù
+Ù smode ÙØšØ±ÙØ§Ù
+Ø¬ Ø§Ø³ØªØ®ÙØ§Øµ Ø§ÙØ¹ØšØ§Ø±Ø§Øª. Ø§ÙÙÙÙ
+Ø© ØµÙØ± ØªØ¹ÙÙ Ø£Ù ÙØ§ØŠÙ
+Ø© Ø§ÙÙÙÙ
+Ø§Øª Ø§ÙÙ
+ÙÙÙÙØ© ØªÙ
+ ØªØ¬Ø§ÙÙÙØ§Ø ÙØ§ÙÙÙÙ
+Ø© 1 ØªØ¹ÙÙ Ø£Ù ÙØ§ØŠÙ
+Ø© Ø§ÙÙÙÙ
+Ø§Øª Ø§ÙÙ
+ÙÙÙÙØ© ØªÙ
+ Ø§Ø³ØªØ®Ø¯Ø§Ù
+ÙØ§.  
+
+Phind.text:Ø§ÙÙØµ Ø§ÙÙ
+Ø³ØªØ®Ø¯Ù
+ ÙØšÙØ§Ø¡ ÙØ±Ù
+ÙØ© Ø§ÙØ¬Ù
+ÙØ©.  
+
+Phind.thesaurus:Ø¥Ø³Ù
+ Ø§ÙÙ
+ÙÙØ² Ø§ÙÙ
+Ø³ØªØ®Ø¯Ù
+ ÙÙ ÙØ³Ù Phind ÙÙ Ø¯ÙÙÙ Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø© etc .  
+
+Phind.title:ÙØ³ØªØ®Ø¯Ù
+ Ø­ÙÙ ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª ÙÙØµÙ ÙÙ ÙØ«ÙÙØ©.
+
+Phind.untidy:ÙØ§ ØªØ­Ø°Ù Ø§ÙÙ
+ÙÙØ§Øª Ø§ÙØ¹Ø§Ù
+ÙØ©.
+
+RecentDocumentsList.desc:Ù
+ØµÙÙ ÙÙÙØ± ÙØ§ØŠÙ
+Ø© ØšØ§ÙÙØ«Ø§ØŠÙ Ø§ÙÙ
+Ø¶Ø§ÙØ© Ø£Ù Ø§ÙÙ
+Ø¹Ø¯ÙØ© Ø­Ø¯ÙØ«Ø§.  
+
+RecentDocumentsList.include_docs_added_since:ÙØªØ¶Ù
+Ù ÙÙØ· Ø§ÙÙØ«Ø§ØŠÙ Ø§ÙÙ
+Ø¹Ø¯ÙØ© Ø£Ù Ø§ÙÙ
+Ø¶Ø§ÙØ© ØšØ¹Ø¯ Ø§ÙØªØ§Ø±ÙØ® Ø§ÙÙ
+Ø­Ø¯Ø¯  (ÙÙ ÙÙØŠØ©  yyyymmdd Ø£Ù yyyy-mm-dd ).
+
+RecentDocumentsList.include_most_recently_added:ÙØªØ¶Ù
+Ù ÙÙØ· Ø§ÙÙØ«Ø§ØŠÙ Ø§ÙÙ
+Ø¹Ø¯ÙØ© Ø£Ù Ø§ÙÙ
+Ø¶Ø§ÙØ© ØšØ¹Ø¯ Ø§ÙØªØ§Ø±ÙØ® Ø§ÙÙ
+Ø­Ø¯Ø¯  (ÙÙ ÙÙØŠØ©  yyyymmdd Ø£Ù yyyy-mm-dd ).  
+
+RecentDocumentsList.sort:ÙØ§ØŠÙ
+Ø© ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª ÙÙÙØ±Ø² .Ø¥Ø°Ø§ ÙÙ
+ ØªØ­Ø¯Ø¯ Ø Ø³ÙÙ ÙØªÙ
+ Ø§ÙÙØ±Ø² ØšØ§Ø±ÙØ® Ø§ÙØ¥Ø¶Ø§ÙØ© / Ø§ÙØªØ¹Ø¯Ù  
+
+SectionList.desc:ÙÙØ³ ÙØ§ØŠÙ
+Ø© Ø§ÙÙ
+ØµÙÙ Ø§ÙÙ
+Ø§ ÙØŽÙ
+Ù Ø¬Ù
+ÙØ¹ Ø£ÙØ³Ø§Ù
+ Ø§ÙÙØ«ÙÙØ© (ØšØ¥Ø³ØªØšØ¹Ø§Ø¯ Ø§ÙÙ
+Ø³ØªÙÙ Ø§ÙØ£ÙÙ) ØšØ¯ÙØ§ Ù
+Ù Ù
+Ø¬Ø±Ø¯ Ø§ÙÙ
+Ø³ØªÙÙ Ø§ÙØ£ÙÙ Ø§ÙÙØ«ÙÙØ© ÙÙØ³ÙØ§.  
+
+Collage.desc:ÙÙÙ Ù
+ÙØ§ØšØ³ ÙØ³ØªØ®Ø¯Ù
+ ÙØ¥ØžÙØ§Ø± ØµÙØ± Ø§ÙÙÙ Ø§ÙØªØµÙÙØ±Ù Ø§ÙÙ
+ÙØ¬ÙØ¯Ø© ÙÙ Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø©.  
+
+Collage.geometry:Ø§ØšØ¹Ø§Ø¯ Ø§ÙÙÙ Ø§ÙØªØµÙÙØ±Ù ÙÙÙØ­Ø©. ÙÙØ­Ø© 600 ØšÙØ³Ù ÙÙ 400 ØšÙØ³Ù ÙØ§Ø³Ø¹Ø© Ø¹Ø§ÙÙØ© Ø Ø¹ÙÙ Ø³ØšÙÙ Ø§ÙÙ
+Ø«Ø§Ù Ø ØªØ­Ø¯Ø¯ Ø­Ø³Øš ÙÙØ¯Ø³Ø© 600x400  
+
+Collage.maxDepth:ØµÙØ± ÙÙØªØ¬Ù
+ÙØ¹ Ù
+Ù Ù
+ØµÙÙ ØªØµÙØ­ Ø§Ø³Ø§Ø³Ù . ÙØ¶ØšØ· ÙØ°Ø§ Ø§ÙØ¹Ù
+Ù Ø§ÙØ£ÙØµÙ ÙØ¹Ù
+ÙÙØ© Ø§ÙØ¥ÙØ¹ÙØ§Ø³  
+
+Collage.maxDisplay:Ø§ÙØ­Ø¯ Ø§ÙØ§ÙØµÙ ÙØ¹Ø¯Ø¯ Ø§ÙØµÙØ± ØªØžÙØ± ÙÙ Ø§ÙÙÙ Ø§ÙØªØµÙÙØ±Ù ÙÙ Ø§Ù ÙÙØª Ù
+Ù Ø§ÙØ§ÙÙØ§Øª.  
+
+Collage.imageType:ØªØ³ØªØ®Ø¯Ù
+ ÙÙØ¶ØšØ· Ø ØšØ§ÙØ¥Ø¹Ø±Ø§Øš Ø¹Ù Ø§Ø³Ù
+ Ø§Ù
+ØªØ¯Ø§Ø¯Ø§Øª Ø§ÙÙ
+ÙÙ Ø Ù
+Ø§ÙÙ Ø§ÙÙ
+ÙÙØ§Øª Ø§ÙÙ
+Ø³ØªØ®Ø¯Ù
+Ø© ÙÙ Ø§ÙÙÙ Ø§ÙØªØµÙÙØ±Ù . ÙØ§ØŠÙ
+Ø© ØšØ§Ø³Ù
+ Ø¥Ù
+ØªØ¯Ø§Ø¯Ø§Øª Ø§ÙÙ
+ÙÙ Ù
+ÙØµÙÙØ© ØšÙØ§ÙØ±Ù
+Ø² (%%) .  
+
+Collage.bgcolor:ÙÙÙ Ø§ÙØ®ÙÙÙØ© Ø§ÙØ®Ø§ØµØ© ØšÙ
+Ø¬Ù
+ÙØ¹Ø© Ø§ÙÙÙØ­Ø§ØªØ Ø§Ø®ØªØ± Ø±ÙÙ
+ ÙØ¹ØšØ± Ø¹Ù Ø§ÙÙÙÙ (Ø¹ÙÙ Ø³ØšÙÙ Ø§ÙÙ
+Ø«Ø§Ù #008000 Ø³ÙÙ ØªØ¹Ø·Ù ÙØªÙØ¬Ø© Ø§ÙÙÙÙ Ø§ÙØ£Ø®Ø¶Ø±).  
+
+Collage.buttonname:Ø¥Ø³Ù
+ Ø§ÙÙ
+ØµÙÙ ÙÙ Ø§ÙØŽØ§ØŽØ© Ù ÙÙ Ø¹Ù
+ÙØ¯ Ø§ÙØªØ¬ÙØ§Ù. Ø§ÙÙÙÙ
+Ø© Ø§ÙØ¥ÙØªØ±Ø§Ø¶ÙØ© ÙÙ Ø¹ÙØµØ± ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª Ø§ÙÙ
+Ø®ØµØµØ© Ù
+Ø¹ Ø§ÙØ¥Ø³Ù
+  
+
+Collage.refreshDelay:Ø§ÙØªØ±ØªÙØšØ ØšØ§ÙØ¬Ø²Ø¡ Ù
+Ù Ø§ÙØ«Ø§ÙÙØ© Ù
+Ø¬Ù
+ÙØ¹Ø© Ø§ÙÙÙØ­Ø§Øª ØªÙ
+ ØªØ¬Ø¯ÙØ¯ÙØ§.  
+
+Collage.isJava2:ÙØ³ØªØ®Ø¯Ù
+ ÙÙ
+Ø±Ø§ÙØšØ© Ø§ÙÙÙØª Ø§ÙØ°Ù ØªØ¯ÙØ± ÙØŠØ§Øª Java Ø§ÙÙ
+Ø³ØªØ®Ø¯Ù
+Ø©. Ø¥ØµØ¯Ø§Ø±Ø© Ø§ÙØ«Ø± ØªØ·ÙØ±Ø§ Ù
+Ù Java (Ø§Ù 1.2 Java ÙØµØ§Ø¹Ø¯Ø§) ØªØŽÙ
+Ù Ø¯Ø¹Ù
+ Ø£ÙØ«Ø± ØªØ·ÙØ±Ø§ ÙØ¶ØšØ·  Ø§ÙØŽÙØ§ÙÙÙ ÙÙ Ø§ÙØµÙØ± Ø ÙÙØ°Ø§ Ø§ÙØ¹ÙÙ
+ ÙØ³Ø§Ø¹Ø¯ ÙÙ Ù
+Ø±Ø§ÙØšØ© Ù
+Ø§ ÙØ­Ø¯Ø« Ø ØšØ¹Ø¶ ØšØ±Ø§Ù
+Ø¬ Ø§ÙØªØµÙØ­ ØºÙØ± Ù
+Ø¯Ù
+Ø¬Ù ÙÙ ÙÙØª Ø§ÙØªØŽØºÙÙ Java Ø¥ØµØ¯Ø§Ø±Ø© 1.1. ØªÙ
+ ØªØµÙ
+ÙÙ
+ appletØ Ø§ÙØªØ±Ø§Ø¶Ù Ø ØªÙØªØŽÙ Ø§ÙÙ
+ØªØµÙØ­Ø§Øª Ø¥ØµØ¯Ø§Ø±Ø© Java Ù ÙØ¹Ù
+Ù Ø§ÙÙ
+ØªØµÙØ­  ÙÙØªØµØ±Ù Ø¹ÙÙ ÙØ°Ø§ Ø§ÙØ§Ø³Ø§Ø³.  
+
+Collage.imageMustNotHave:Ù
+Ø³ØªØ®Ø¯Ù
+ ÙØ¥Ø®ÙØ§Ø¡ Ø§ÙØµÙØ± Ø§ÙØªÙ ÙØ§ ÙØ¬Øš Ø£Ù ØªØžÙØ± ÙÙ Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø©Ø Ù
+Ø«Ù ØµÙØ± Ø§ÙØ£Ø²Ø±Ø§Ø± Ø§ÙØªÙ ØªÙÙÙ ØŽØ±ÙØ· Ø§ÙØªØµÙØ­.  
+
+Collage.caption:ÙÙØ·Ø§Øª Ø¥Ø®ØªÙØ§Ø±ÙÙ  ØªØ¹Ø±Ø¶ Ø£Ø³ÙÙ   Ø§ÙÙÙ Ø§ÙØªØµÙÙØ±Ù  
+
+
+#
+# Plugin option descriptions
+#
+AcronymExtractor.adding:Ø¥Ø¶Ø§ÙØ©
+
+AcronymExtractor.already_seen:ØŽÙÙØ¯ Ù
+Ù ÙØšÙ
+
+AcronymExtractor.desc:Ø§ÙÙ
+ÙØ§ØšØ³ Ø§ÙÙ
+Ø³Ø§Ø¹Ø¯ Ø§ÙÙ
+Ø³ØªØ®Ø±Ø¬ ÙÙÙ
+ÙÙØ¹ Ù ØªØ£ØŽÙØ± Ø§ÙÙ
+Ø®ØªØµØ±Ø§Øª ÙÙ Ø§ÙÙØµ.  
+
+AcronymExtractor.done_acronym_extract:ÙØªÙ
+ Ø§Ø³ØªØ®Ø±Ø§Ø¬ Ø§ÙÙ
+Ø®ØªØµØ±Ø§Øª.  
+
+AcronymExtractor.done_acronym_markup:ØªÙÙÙØ° Ù
+Ø®ØªØµØ§Ø±Øª ÙØºØ© Ø§ÙØªØ±Ù
+ÙØ²  
+
+AcronymExtractor.extract_acronyms:Ø§Ø³ØªØ®ÙØµ Ø§ÙÙ
+Ø®ØªØµØ±Ø§Øª Ù
+Ù Ø§ÙÙØµ ÙØ§Ø¬Ø¹ÙÙØ§ Ù
+ÙØªØ§Ø¯Ø§ØªØ§  
+
+AcronymExtractor.extracting_acronyms:Ø§Ø³ØªØ®ÙØ§Øµ Ø§ÙÙ
+Ø®ØªØµØ±Ø§Øª  
+
+AcronymExtractor.marking_up_acronyms:ÙØªÙ
+ ØªØ±Ù
+ÙØ² Ø§ÙÙ
+Ø®ØªØµØ±  
+
+AcronymExtractor.markup_acronyms:Ø§Ø¶Ù ÙØ§ØµÙØ© ØšÙØ§ÙØ§Øª Ø§ÙÙ
+Ø®ØªØµØ± Ø§ÙÙ ÙØµ Ø§ÙÙØ«ÙÙØ©.  
+
+ArchivesInfPlugin.desc:Ø§ÙÙ
+ÙØ§ØšØ³  
+
+AutoExtractMetadata.desc:Ø§ÙÙ
+ÙØ§ØšØ³ Ø§ÙØ£Ø³Ø§Ø³ Ø§ÙØ°Ù ÙØ¬Ù
+Ø¹ ØšÙÙ ÙØžÙÙØ© ÙÙ Ù
+Ø³ØªØ®Ø±Ø¬ Ù
+Ù Ø§ÙÙ
+ÙØ§ØšØ³ Ø§ÙÙ
+Ø³ØªØ®Ø±Ø¬Ø©.  
+
+AutoExtractMetadata.extracting:Ø¥Ø³ØªØ®ÙØ§Øµ
+
+AutoExtractMetadata.first:ÙØ§ØŠÙ
+Ø© Ù
+ÙÙØµÙØ© ØšÙØ§ØµÙØ© ÙÙØ£Ø­Ø¬Ø§Ù
+ Ø§ÙØ£ÙÙÙ Ø§ÙØªÙ ØªØ³ØªØ®ÙØµ Ù
+Ù Ø§ÙÙØµ Ø§ÙÙ Ø­ÙÙ ÙØ§ØµÙØ§Øª ØšÙØ§ÙØ§Øª. ÙØ°Ø§ Ø§ÙØ­ÙÙ ÙØ³Ù
+Ù  'FirstNNN'.  
+
+BaseMediaConverter.desc:Ø§ÙÙ
+ÙØ§ØšØ³ Ø§ÙÙ
+Ø³Ø§Ø¹Ø¯ Ø§ÙØ°Ù ÙÙÙØ± Ø§ÙÙØžÙÙØ© Ø§ÙØ§Ø³Ø§Ø³ÙØ© ÙÙ
+ÙØ§ØšØ³ ØªØ­ÙÙÙ Ø§ÙÙØ³Ø§ØŠØ· Ø§ÙÙ
+ØªØ¹Ø¯Ø¯Ø© Ù
+Ø«Ù Ù
+Ø­ÙÙ Ø§ÙØµÙØ±Ø©ÙÙ
+Ø­ÙÙ Ø§ÙÙÙØ¯ÙÙ.  
+
+BasePlugin.associate_ext:ØªØªØ³ØšØš ÙÙ Ø§Ù ÙØªÙ
+ ØªØ¬ÙÙØ² Ø§ÙÙ
+ÙÙØ§Øª Ø§ÙØªÙ ÙÙØ§  ÙÙØ³ Ø§Ø³Ù
+ Ø§ÙÙØ«ÙÙØ© ØšÙØ§Ø³Ø·Ø© Ø§ÙÙ
+ÙØ§ØšØ³ Ù Ø§Ù ÙØªÙ
+ Ø¥ÙØ­Ø§Ù Ø§Ø³Ù
+ Ø£Ù
+ØªØ¯Ø§Ø¯ Ø§ÙÙ
+ÙÙ Ù
+Ù ÙØ§ØŠÙ
+Ø© Ù
+ÙØµÙÙØ© ØšÙØ§ØµÙØ© ÙÙÙØ§ ÙÙÙ
+Ø¶Ù
+ÙÙ Ø§ÙÙ
+Ø³ØªØ®Ø¯Ù
+ Ù
+Ø¹ Ø§ÙÙØ«ÙÙØ© Ø§ÙØªÙ ÙØ¬Ø±Ù ØªØ¬ÙÙØ²ÙØ§ ØšØ¯ÙØ§ Ù
+Ù Ø§Ù ØªØ¹Ø§ÙØ¬ ØšÙØµÙÙØ§ ÙØ§ØŠÙ
+Ø© Ù
+ÙÙØµÙØ©  
+
+BasePlugin.associate_tail_re:ØªØ¹ØšÙØ± Ù
+ÙØªØžÙ
+ ÙÙ
+Ø¶Ø§ÙØ§Ø© Ø£Ø³Ù
+Ø§Ø¡ Ø§ÙÙ
+ÙÙØ§Øª ÙØ¥ÙØ¬Ø§Ø¯ Ø§ÙÙ
+ÙÙØ§Øª Ø§ÙÙ
+Ø±ØªØšØ·Ø© . ÙØ³ØªØ®Ø¯Ù
+  ÙØšØ¯ÙÙ Ø£ÙØ«Ø± ÙÙØ©  Ùassociate_ext.  
+
+BasePlugin.block_exp:BasPlug.block_exp:Ø§ÙÙ
+ÙÙØ§Øª Ø§ÙÙ
+Ø¶Ø§ÙØ§Ø© Ù
+Ø¹ ÙØ°Ø§ Ø§ÙØªØ¹ØšÙØ± Ø§ÙÙ
+ÙØªØžÙ
+ Ø³ÙÙ ØªØºÙÙ Ù ÙÙ ÙØ³Ù
+Ø­ ØšØªÙ
+Ø±ÙØ±ÙØ§ ÙØ§Ù Ù
+ÙØ§ØšØ³ Ø¢Ø®Ø± ÙÙ Ø§ÙÙØ§ØŠÙ
+Ø©.ÙØ¹Ø§ÙÙØ© ÙØ°Ø§ Ø§ÙØ¥Ø¬Ø±Ø§Ø¡ ØªÙÙ
+Ù ÙÙ Ù
+ÙØ¹ Ø±Ø³Ø§ØŠÙ ÙØ«ÙØ±Ø© Ø­ÙÙ Ø§ÙÙ
+ÙÙØ§Øª Ø§ÙÙ
+Ø¯Ø®ÙØ© Ù Ø§ÙØªÙ ÙØ§ ØªØ§ØšÙ ÙØŽØ§ÙÙØ§.Ø¢Ù Ù
+ÙØ§ØšØ³ ÙØ¯ÙÙ Ù
+ÙØ¹ Ø¥ÙØªØ±Ø§Ø¶Ù ÙÙ
+ÙÙØ§ØªØÙ
+Ø«Ù Ù
+ÙØ§ØšØ³ HTMLplug Ù Ø§ÙØ°Ù ÙÙ
+ÙØ¹ ØªÙ
+Ø±ÙØ± Ø§ÙÙ
+ÙÙØ§Øª ØšØ§ÙØ¥Ù
+ØªØ¯Ø§Ø¯Ø§Øª Ø§ÙØªØ§ÙÙØ©: .gif, .jpg, .jpeg, .png or .css .
+
+BasePlugin.desc:Ø§ÙÙØŠØ© Ø§ÙØ£Ø³Ø§Ø³ÙØ© ÙÙÙ Ù
+ÙØ§ØšØ³ Ø§ÙØ¥Ø³ØªÙØ±Ø§Ø¯.
+
+BasePlugin.dummy_text:ÙØ°Ø§ Ø§ÙÙ
+ÙÙ ÙØ§ ÙØªØ¶Ù
+Ù ÙØµ.
+
+BasePlugin.encoding.ascii:Plain 7 bit ascii. ÙØ°Ø§ ÙØ¯ ÙÙÙÙ Ø§Ø³Ø±Ø¹ ÙÙÙÙØ§ Ù
+Ù Ø§Ø³ØªØ®Ø¯Ø§Ù
+ iso_8859_1. Ø­Ø°Ø§Ø± Ù
+Ù Ø§Ø³ØªØ®Ø¯Ø§Ù
+ ÙØ°Ø§ Ø¹ÙÙ Ù
+Ø¬Ù
+ÙØ¹Ø© Ù
+Ù Ø§ÙÙØ«Ø§ØŠÙ Ø§ÙØªÙ ÙÙ
+ÙÙ Ø§Ù ØªØ­ØªÙÙ Ø¹ÙÙ Ø£Ø­Ø±Ù plain 7 bit ascii Ø±ØºÙ
+ (Ù
+Ø«Ø§ÙØÙØ«Ø§ØŠÙ Ø§ÙÙ
+Ø§ÙÙØ© Ø£Ù ÙØ±ÙØ³ÙØ© ØªØªØ¶Ù
+Ù ÙÙÙØ§Øª) Ø ÙØšØ¯ÙØ§ Ù
+Ù Ø§Ø³ØªØ®Ø¯Ø§Ù
+ , ÙØ§Ø³ØªØ®Ø¯Ù
+ ØšØ¯ÙØ§ iso_8859_1 .  
+
+BasePlugin.encoding.unicode:ØŽÙÙØ±Ø© ÙÙØ§Ø³ÙØ© ÙÙØ·.
+
+BasePlugin.encoding.utf8:Ø¥Ù
+Ø§ utf8 Ø£Ù ØŽÙÙØ±Ø© ÙÙØ§Ø³ÙØ© -- ØªØ­Ø³Ø³ ØªÙÙØ§ØŠÙ.
+
+BasePlugin.filename_encoding:ØªØ±Ù
+ÙØ² Ù
+ØµØ¯Ø± Ø§ÙÙ
+ÙÙ ÙØ£Ø³Ù
+Ø§Ø¡ Ø§ÙÙ
+ÙÙØ§Øª.  
+
+BasePlugin.filename_encoding.auto:ØªÙÙØ§ØŠÙØ§ Ø§ÙØ­Øµ ØªØ±Ù
+ÙØ²  Ø§Ø³Ù
+ Ø§ÙÙ
+ÙÙ.  
+
+BasePlugin.filename_encoding.auto_language_analysis:Ø§ÙÙØŽÙ Ø§ÙØªÙÙØ§ØŠÙ ÙØªØ±Ù
+ÙØ² Ø§ÙÙ
+ÙÙ Ø¹Ù Ø·Ø±ÙÙ ØªØ­ÙÙÙÙ .  
+
+BasePlugin.filename_encoding.auto_filesystem_encoding:Ø§ÙÙØŽÙ Ø§ÙØªÙÙØ§ØŠÙ ÙØªØ±Ù
+ÙØ² Ø§ÙÙ
+ÙÙ ØšØ§Ø³ØªØ®Ø¯Ø§Ù
+  ÙØžØ§Ù
+ ØªØ±Ù
+ÙØ² Ø§ÙÙ
+ÙÙØ§Øª.  
+
+BasePlugin.filename_encoding.auto_fl:Ø§Ø³ØªØ®Ø¯Ù
+ ÙØžØ§Ù
+ ØªØ±Ù
+ÙØ² Ø§ÙÙ
+ÙÙØ§Øª Ø Ø«Ù
+ ØªØ­ÙÙÙ Ø§ÙÙØºØ©  ÙÙÙØŽÙ Ø¹Ù ØªØ±Ù
+ÙØ² Ø§Ø³Ù
+ Ù
+ÙÙ .  
+
+BasePlugin.filename_encoding.auto_lf:Ø§Ø³ØªØ®Ø¯Ù
+  Ø§ÙØªØ­ÙÙÙ Ø§ÙÙØºÙÙ Ø«Ù
+ ÙØžØ§Ù
+ ØªØ±Ù
+ÙØ² Ø§ÙÙ
+ÙÙØ§Øª Ø  ÙÙÙØŽÙ Ø¹Ù ØªØ±Ù
+ÙØ² Ø§Ø³Ù
+ Ù
+ÙÙ .  
+
+BasePlugin.no_blocking:ÙØ§ ØªØºÙÙ Ø§Ù Ù
+ÙÙ. ÙØ±ØªØšØ· ØšÙØ§ Ù
+Ù Ø£Ù ØµÙØ±Ø© (Ù
+Ø«Ù Ø§ÙØµÙØ± ÙÙ ØµÙØ­Ø© ÙÙØš) Ø³ØªØ¶Ø§Ù Ø§ÙÙ Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø© ÙÙØ«Ø§ØŠÙ .  
+
+BasePlugin.no_cover_image:ÙØ§ ØªØ­Ø§ÙÙ Ø§ÙÙØžØ± Ø¥ÙÙ ØšØ§Ø¯ØŠØ© Ø§ÙÙ
+ÙÙ.jpg  (Ø­ÙØ« Ø§ÙØšØ§Ø¯ØŠØ© ÙÙ ÙÙØ³ Ø¥Ø³Ù
+ Ø§ÙÙ
+ÙÙ Ù
+ÙØ¶ÙØ¹ Ø§ÙÙ
+Ø¹Ø§ÙØ¬Ø©) Ù Ø¥ÙØ­Ø§Ù ÙØ°Ø§ Ø§ÙÙ
+ÙÙ ÙØµÙØ±Ø© ØºÙØ§Ù.
+
+BasePlugin.OIDtype.auto:Ø§Ø³ØªØ®Ø¯Ø§Ù
+ OIDtype Ø§ÙÙ
+Ø­Ø¯Ø¯ ÙÙ import.pl  
+
+BasePlugin.process_exp:ØªØ¹ØšÙØ± Ù
+ÙØªØžÙ
+ ÙØšÙØ±Ù ÙÙ
+Ø¶Ø§ÙØ§Ø© Ø£Ø³Ù
+Ø§Ø¡ Ø§ÙÙ
+ÙÙØ§Øª. Ø³ÙÙ ØªØ¹Ø§ÙØ¬ Ø£Ø³Ù
+Ø§Ø¡ Ø§ÙÙ
+ÙÙØ§Øª Ø§ÙÙ
+Ø¶Ø§ÙØ§Ø©  ØšÙØ§Ø³Ø·Ø© ÙØ°Ø§ Ø§ÙÙ
+ÙØ§ØšØ³. Ù
+Ø«Ø§Ù, Ø¥Ø³ØªØ®Ø¯Ø§Ù
+  '(?i).html?\$' ÙØ¶Ø§ÙÙ  ÙÙ Ø§ÙÙØ«Ø§ØŠÙ Ø§ÙØªÙ ØªÙØªÙÙ Øš .htm Ø£Ù .html (Ø­Ø§ÙØ©-ØºÙØ± Ø­Ø³Ø§Ø³Ø©).
+
+BasePlugin.smart_block:ÙÙ
+ÙØ¹ ÙÙ Ø§ÙÙ
+ÙÙØ§Øª ØšØµÙØ±Ø© Ù
+Ø±ÙØ­Ø© Ø Ù ÙØºÙÙÙ Ø¹Ù Ø§ÙÙØžØ± ÙÙ Ø£Ø³Ù
+Ø§Ø¡ Ø§ÙÙ
+ÙÙØ§Øª
+
+BasePlugin.stems:stem  
+
+BasePlugin.file_rename_method:Ø§ÙØ§Ø³ÙÙØš Ø§ÙØ°Ù ÙØ³ØªØ®Ø¯Ù
+ ÙÙ Ø¥Ø¹Ø§Ø¯Ø© ØªØ³Ù
+ÙØ© ÙØ³Ø®Ø© Ù
+Ù Ø§ÙÙ
+ÙÙØ§Øª Ø§ÙÙ
+Ø³ØªÙØ±Ø¯Ø© Ù Ø§ÙÙ
+ÙÙØ§Øª Ø§ÙÙ
+Ø±ØªØšØ·Ø© ØšÙØ§.  
+
+BasePlugin.rename_method.url:Ø¥Ø³ØªØ®Ø¯Ù
+ ØªØ±Ù
+ÙØ² Ø¹ÙÙØ§Ù Ø§ÙÙ
+ÙØ§Ø±Ø¯ Ø§ÙÙ
+ÙØ­Ø¯ ÙÙ Ø¥Ø¹Ø§Ø¯Ø© ØªØ³Ù
+ÙØ© Ø§ÙÙ
+ÙÙØ§Øª Ø§ÙÙ
+Ø³ØªÙØ±Ø¯Ø© ÙØ§ÙÙ
+ÙÙØ§Øª Ø§ÙÙ
+Ø±ØªØšØ·Ø© ØšÙØ§.  
+
+BasePlugin.rename_method.base64:Ø§Ø³ØªØ®Ø¯Ø§Ù
+ ØªØ±Ù
+ÙØ² base64  ÙÙ Ø¥Ø¹Ø§Ø¯Ø© ØªØ³Ù
+ÙØ© Ø§ÙÙ
+ÙÙØ§Øª Ø§ÙÙ
+Ø³ØªÙØ±Ø¯Ø© ÙØ§ÙÙ
+ÙÙØ§Øª Ø§ÙÙ
+Ø±ØªØšØ·Ø© ØšÙØ§.  
+
+BasePlugin.rename_method.none:ÙØ§ ØªØ¹Ø¯ ØªØ³Ù
+ÙØ© Ø§ÙÙ
+ÙÙØ§Øª Ø§ÙÙ
+Ø³ØªÙØ±Ø¯Ø© ÙØ§ÙÙ
+ÙÙØ§Øª Ø§ÙÙ
+Ø±ØªØšØ·Ø© ØšÙØ§.  
+
+BibTexPlugin.desc:ÙÙØ±Ø§Ø¡ BibTexPlug Ø§ÙÙ
+ÙÙØ§Øª Ø§ÙØšÙØšÙÙÙØ¬Ø±Ø§ÙÙØ© ÙÙ ØŽÙÙ BibTex .ÙÙØŽØŠ BibTexPlug ÙÙØ§Ù ÙØ«ÙÙØ© ÙØ£Ù Ù
+Ø±Ø¬Ø¹ ÙÙ Ø§ÙÙ
+ÙÙ. ÙÙ ÙØŠØ© ÙØ±Ø¹ÙØ© Ù
+Ù  SplitPlug, ÙØ°ÙÙ Ø¥Ø°Ø§ ÙØ§ÙØª ÙÙØ§Ù ØªØ³Ø¬ÙÙØ§Øª Ù
+ØªØ¹Ø¯Ø¯Ø© ÙÙÙØ§ ØªÙØ±Ø£.  
+
+BookPlugin.desc:ÙØ®ÙÙ ÙØ«ÙÙØ© Ù
+ØªØ¹Ø¯Ø¯Ø© Ø§ÙÙ
+Ø³ØªÙÙØ§Øª  Ù
+Ù ÙØ«ÙÙØ© ØªØªØ¶Ù
+Ù ØªÙØ¬Ø§Ù Ù
+Ø³ØªÙÙ Ø¬Ø¯ÙÙ Ø§ÙÙ
+Ø­ØªÙÙØ§Øª <<toc>> . ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª  ÙÙÙ ÙØ³Ù
+ Ù
+Ø£Ø®ÙØ° Ù
+Ù Ø£Ù ØªÙØ¬Ø§Ù Ø§Ø®Ø±Ù Ø¹ÙÙ ÙÙØ³ Ø§ÙØ®Ø· Ø ÙÙ
+Ø§ . <<TOC>>. Ù
+Ø«Ø§Ù <<Title>>xxxx<</Title>> ØªØ¹ÙÙ ÙØ§ØµÙØ© ØšÙØ§ÙØ§Øª Ø§ÙØ¹ÙÙØ§Ù. ÙÙ ØŽØŠ Ø¢Ø®Ø± ØšÙÙ ØªÙØ¬Ø§Ù ÙØ§ØŠÙ
+Ø© Ø§ÙÙ
+Ø­ØªÙÙØ§Øª ÙØ¹Ø§Ù
+Ù ÙÙØµ ØšØ³ÙØ· ØšÙØºØ© html ( Ù
+Ø«Ø§ÙØ ÙÙ ØªØªÙ
+ Ù
+Ø¹Ø§ÙØ¬Ø© Ø±ÙØ§ØšØ· html Ø§Ù Ø£Ù ØŽØŠ Ù
+Ù Ù
+Ø§Ø¯Ø© Ù
+ÙØ§ØšØ³ HTMLPlug ). Ù
+Ø§ Ø¹Ø¯Ø§ Ø§ÙÙ
+ÙÙØ§Øª Ø§ÙØªÙ ÙÙØ§ Ø§ÙØ¥Ù
+ØªØ¯Ø§Ø¯ .hb ØšØµÙØ±Ø© Ø¥ÙØªØ±Ø§Ø¶ÙØ© (ÙÙ
+ÙÙ ØªØºÙØ± ÙØ°Ø§ ØšØ§Ø¶Ø§ÙØ© Ù
+ÙÙ ÙØ­Ù
+Ù ÙÙØ³ Ø§ÙØ¥Ø³Ù
+  ÙÙ Ø®ÙØ§Ø±  process_exp- ÙÙÙÙ Ø§ÙÙ
+ÙÙØ§Øª Ø§ÙØªÙ ÙÙØ§ Ø§ÙØ¥Ù
+ØªØ¯Ø§Ø¯  .jpg ØªØ¹ØªØšØ± ØµÙØ±Ø© ØºÙØ§Ù (Ù
+ÙÙØ§Øª jpg ÙØªÙ
+ ØºÙÙÙØ§ ØšÙØ§Ø³Ø·Ø© ÙØ°Ø§ Ø§ÙÙ
+ÙØ§ØšØ³). BookPlug  ÙÙ ØªØšØ³ÙØ· (Ù Ø¥Ù
+ØªØ¯Ø§Ø¯) ÙÙ
+ÙØ§ØšØ³ HBPlug Ø§ÙÙ
+Ø³ØªØ®Ø¯Ù
+ ÙÙ Ù
+Ø¬Ù
+ÙØ¹Ø§Øª Ø§ÙÙ
+ÙØªØšØ© Ø§ÙØ¥ÙØ³Ø§ÙÙØ©.ÙØ¹ØªØšØ± BookPlug ÙÙ Ø§ÙØ£Ø³Ø±Ø¹ ÙØ§ÙÙ ÙØªÙÙØ¹ Ø§Ù ØªÙÙÙ Ø§ÙÙ
+ÙÙØ§Øª Ø§ÙÙ
+Ø¯Ø®ÙØ© Ø£ÙØžÙ (Ù
+Ø¯Ø®ÙØ§Øª Ù
+Ø¬Ù
+ÙØ¹Ø§Øª  HDL ØªØªØ¶Ù
+Ù Ø§ÙÙØ«ÙØ± Ù
+Ù ØªÙØ¬Ø§Ù html Ø­ÙÙ <<TOC>> , ØªØ³ØªØ®Ø¯Ù
+ ØªÙØ¬Ø§Ù <<I>> ÙØªÙ
+ÙØ² Ø§ÙØµÙØ± Ù ØšØšØ³Ø§Ø·Ø© ØªØ£Ø®Ø¯ ÙÙ Ø§ÙÙØµ ØšÙÙ ØªÙØ¬Ø§Ù <<TOC>> Ù ØšØ¯Ø§ÙØ© Ø§ÙÙØµ ÙÙØ§ØµÙØ© ØšÙØ§ÙØ§Øª Ø§ÙØ¹ÙÙØ§Ù). Ø¥Ø°Ø§ ÙÙØª ØªÙÙÙ
+ ØšØªØ£ØŽÙØ± ÙØ«Ø§ØŠÙ ÙØªØ¹Ø±Ø¶ ØšÙÙØ³ Ø§Ø³ÙÙØš Ù
+Ø¬Ù
+ÙØ¹Ø§Øª HDL Ø§Ø³ØªØ®Ø¯Ù
+ ÙØ°Ø§ Ø§ÙÙ
+ÙØ§ØšØ³ ØšØ¯ÙØ§ Ù
+Ù HBPlug.  
+
+CONTENTdmPlugin.desc:Ø§ÙÙ
+ÙØ§ØšØ³ Ø§ÙØªÙ ØªØ¹Ø§ÙØ¬ Ù
+ÙÙØ§Øª RDF Ø§ÙØªÙ ÙÙ Ù
+Ø¬Ù
+ÙØ¹Ø§Øª CONTENTdm Ø§ÙÙ
+ØµØ¯Ø±Ø© .  
+
+ConvertBinaryFile.apply_fribidi:ØªØŽØºÙÙ "fribidi" ØšØ±ÙØ§Ù
+Ø¬ Ø®ÙØ§Ø±Ø²Ù
+ÙØ© Ø§ÙÙÙÙÙÙÙØ¯ Ø«ÙØ§ØŠÙ Ø§ÙØ¥ØªØ¬Ø§Ù Ø¹ÙÙ Ù
+ÙÙ Ù
+Ø­ÙÙ (ÙØµ Ù
+Ù Ø§ÙÙÙ
+ÙÙ Ø§ÙÙ Ø§ÙÙØ³Ø§Ø±).  
+
+ConvertBinaryFile.convert_to:Plugin converts to TEXT or HTML or various types of Image (e.g. JPEG, GIF, PNG).
+
+ConvertBinaryFile.convert_to.auto:ØªÙÙØ§ØŠÙØ§ ÙÙ
+ ØšØ§Ø®ØªÙØ§Ø± Ø§ÙÙÙØŠØ© Ø§ÙÙ
+Ø­ÙÙØ© Ø£ÙØ¶Ø§ .Ø§ÙÙÙØŠØ© Ø§ÙÙ
+Ø®ØªØ§Ø±Ø© ØªØ¹ØªÙ
+Ø¯ Ø¹ÙÙ ÙÙØ¹ Ø§ÙÙØ«ÙÙØ© Ø§ÙÙ
+Ø¯Ø®ÙØ© Ø Ø¹ÙÙ Ø³ØšÙÙ Ø§ÙÙ
+Ø«Ø§Ù Ø ÙØ§Ù  Word ÙØªØ­ÙÙ ØªÙÙØ§ØŠÙØ§ Ø§ÙÙ HTML, ØšÙÙÙ
+Ø§ ÙØªÙ
+ ØªØ­ÙÙÙ PowerPoint Ø§ÙÙ ÙÙØŠØ© Greenstone's PagedImage
+
+ConvertBinaryFile.convert_to.html:ÙÙØŠØ© ÙØºØ© ØªØ±Ù
+ÙØ² Ø§ÙÙØµ Ø§ÙØªØŽØ¹ØšÙ.
+
+ConvertBinaryFile.convert_to.text:ÙÙØŠØ© ÙØµ ØšØ³ÙØ·.
+
+ConvertBinaryFile.convert_to.pagedimg:Ø³ÙØ³ÙØ© Ù
+Ù Ø§ÙØµÙØ±.  
+
+ConvertBinaryFile.convert_to.pagedimg_jpg:JPEG ÙÙØŠØ©.
+
+ConvertBinaryFile.convert_to.pagedimg_gif:GIF ÙÙØŠØ©.
+
+ConvertBinaryFile.convert_to.pagedimg_png:PNG ÙÙØŠØ©.
+
+ConvertBinaryFile.desc:ÙØ°Ø§ ÙÙ Ø§ÙÙ
+ÙØ§ØšØ³ Ø§ÙØ°Ù ÙØ±Ø«ØªÙ Ù
+ÙØ§ØšØ³  WordPlugin, PowerPointPlugin, PostScriptPlugin, RTFPlugin and PDFPlugin ÙØ³ÙÙ ØªØ­ÙÙÙ Ø£ØŽÙØ§Ù ÙØ°Ù Ø§ÙÙØ«Ø§ØŠÙ Ø§ÙÙ ÙØµ Ø HTML Ø£Ù Ø³ÙØ³ÙØ© Ù
+Ù Ø§ÙØµÙØ±.Ù ÙÙ ÙØ¹Ù
+Ù ØšØ¢ÙÙØ© Ø§ÙØªØ­ÙÙÙ Ø§ÙØ¯ÙÙØ§Ù
+ÙÙÙ ÙÙÙ
+ÙØ§ØšØ³ Ø§ÙØ«Ø§ÙÙÙØ© (HTMLPlugin, StructuredHTMLPlugin, PagedImagePlugin or TextPlugin) ØªØ£Ø³ÙØ³Ø§ Ø¹ÙÙ Ø­Ø¬Ø© Ø§ÙÙ
+ÙØ§ØšØ³ 'convert_to'.  
+
+ConvertBinaryFile.keep_original_filename:Ø§Ø­ØªÙØž ØšØ§Ø³Ù
+ Ø§ÙÙ
+ÙÙ Ø§ÙØ£ØµÙÙ ÙÙÙ
+ÙÙØ§Øª Ø§ÙÙ
+ØªØ¹ÙÙØ©Ø ÙÙØ°ÙÙ ÙÙÙ
+Ø­ÙÙØ© Ø¥ÙÙ .doc Ù.pdf ÙÙÙØ°Ø§.  
+
+ConvertBinaryFile.use_strings:Ø§Ø°Ø§ ØªÙ
+ Ø¥Ø¹Ø¯Ø§Ø¯ÙØ§ Ø Ø³ÙÙ ÙØªÙ
+ Ø¥Ø³ØªØ¯Ø¹Ø§Ø¡ Ø¯Ø§ÙØ© Ø³ÙØ³ÙØ© ÙØµÙØ© ÙØ¥Ø³ØªØ®ÙØ§Øµ Ø§ÙÙØµ Ø¥Ø°Ø§ ÙØŽÙ Ù
+Ø±ÙÙ Ø§ÙØªØ­ÙÙÙ.  
+
+ConvertToRogPlugin.desc:Ø§ÙÙ
+ÙØ§ØšØ³ Ø§ÙØ°Ù ÙØ±Ø« Ù
+Ù RogPlugin.  
+
+CSVPlugin.desc:Ù
+ÙØ§ØšØ³ ÙÙÙ
+ÙÙØ§Øª ÙÙ ÙØ§ØŠÙ
+Ø© Ù
+ÙØµÙÙØ© ØšÙØ§ØµÙØ© ÙÙÙÙ
+ Ø§ÙÙÙØŠØ§Øª. Ø³ÙÙ ÙØªÙ
+ Ø¥ÙØŽØ§Ø¡ ÙØ«ÙÙØ© Ø¬Ø¯ÙØ¯Ø© ÙÙÙ Ø³Ø·Ø± ÙÙ Ø§ÙÙ
+ÙÙ.  
+
+DateExtractor.desc:Ø§ÙÙ
+ÙØ§ØšØ³ Ø§ÙÙ
+Ø³Ø§Ø¹Ø¯ Ø§ÙÙ
+Ø³ØªØ®Ø±Ø¬ ÙØ§Ø³ØªØ®Ø±Ø§Ø¬ Ù
+Ø¹ÙÙÙ
+Ø§Øª Ø§ÙØªØ§Ø±ÙØ® Ù
+Ù Ø§ÙÙØµ.  
+
+DateExtractor.extract_historical_years:Ø¥Ø³ØªØ®ÙØ§Øµ Ù
+Ø¹ÙÙÙ
+Ø§Øª Ø§ÙÙØªØ±Ø§Øª Ø§ÙØ²Ù
+ÙÙØ© Ù
+Ù Ø§ÙÙØ«Ø§ØŠÙ Ø§ÙØªØ§Ø±ÙØ®ÙØ©. ÙØ°Ù Ø§ÙÙ
+Ø¹ÙÙÙ
+Ø§Øª ØªØ®Ø²Ù ÙÙØ§ØµÙØ§Øª ØšÙØ§ÙØ§Øª Ù
+Ø¹ Ø§ÙÙØ«ÙÙØ© . ØªÙØ¬Ø¯ ÙØ§Ø¬ÙØ© ØšØ­Ø« ÙÙØ°Ù Ø§ÙÙØ§ØµÙØ© Ù Ø§ÙØªÙ ÙÙ
+ÙÙ ØªØ¶Ù
+ÙÙÙØ§ ÙÙ Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø© ØšØ¥Ø¶Ø§ÙØ© ÙØ°Ø§ Ø§ÙÙØµ , "format QueryInterface DateSearch" ÙÙ Ù
+ÙÙ Ø§ÙØªÙÙÙÙ
+
+DateExtractor.maximum_century:Ø¥Ø³ØªØ®ÙØ§Øµ Ø¥Ø³Ù
+ Ø§ÙÙØ±Ù Ø§ÙØ£ÙØµÙ ÙÙØ§ØµÙØ© ØšÙØ§ÙØ§Øª ØªØ§Ø±ÙØ®ÙØ©.0(Ù
+Ø«Ø§Ù Ø . 14 Ø³ÙÙ ÙØ³ØªØ®ÙØµ ÙÙ Ø§ÙÙ
+Ø±Ø§Ø¬Ø¹ Ø­ØªÙ Ø§ÙÙØ±Ù Ø§ÙØ±Ø§ØšØ¹ Ø¹ØŽØ±).
+
+DateExtractor.maximum_year:Ø§Ø³ØªØ®Ø¯Ù
+ Ø§ÙÙ
+ÙØ¹Ø¯ Ø§ÙØ²Ù
+ÙÙ Ø§ÙØ£ÙØµÙ ÙÙØ§ØµÙØ© ØšÙØ§ÙØ§Øª (ÙÙ Ø­ÙØšØ© Ø²Ù
+ÙÙØ© Ø¹Ø§Ù
+Ø©, Ù
+Ø«Ù  1950).
+
+DateExtractor.no_bibliography:ÙØ§ ØªØ­Ø§ÙÙ ØºÙÙ Ø§ÙØªÙØ§Ø±ÙØ® Ø§ÙØšÙØšÙÙÙØ¬Ø±Ø§ÙÙØ© Ø¹ÙØ¯ Ø¥Ø³ØªØ®ÙØ§Øµ Ø§ÙÙ
+ÙØ§Ø¹ÙØ¯ Ø§ÙØ²Ù
+ÙÙØ©.
+
+DirectoryPlugin.desc:Ù Ù
+ÙØ§ØšØ³ ÙØ¹ÙØ¯ Ø§ÙÙ ÙÙ Ø§ÙØ£Ø¯ÙØ© Ù
+Ø¹Ø§ÙØ¬Ø§ ÙÙ Ø§ÙÙ
+ÙÙØ§Øª Ø§ÙØªÙ ÙØ¬Ø¯ÙØ§  
+
+DirectoryPlugin.recheck_directories:ØšØ¹Ø¯ Ù
+Ø¹Ø§ÙØ¬Ø© Ù
+ÙÙØ§Øª ÙÙ Ø¯ÙÙÙ Ø¥Ø³ØªÙØ±Ø§Ø¯Ø Ø£Ø¹Ø¯ ÙØ±Ø§Ø¡Ø© Ø§ÙØ¯ÙÙÙ ÙÙØ­Øµ Ø£Ù Ù
+ÙÙØ§Øª Ø¬Ø¯ÙØ¯Ø© Ø£ÙØŽØŠØª  
+
+DirectoryPlugin.use_metadata_files:ÙØ±Ø§Ø¡Ø© ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª Ù
+Ù Ù
+ÙÙØ§Øª ÙØ§ØµÙØ§Øª ØšÙØ§ÙØ§Øª xml(Ù
+Ø³ØªÙÙØ± - metadataxmlplug (Ø§ÙÙ ÙØ§ØŠÙ
+Ø© Ø§ÙÙ
+ÙØ§ØšØ³ ØšØ¯ÙØ§  
+
+DatabasePlugin.desc:ÙØ³ØªØ®Ø¯Ù
+ Ø§ÙØªØ³Ø¬ÙÙØ§Øª Ù
+Ù ÙØ§Ø¹Ø¯Ø© Ø§ÙØšÙØ§ÙØ§Øª ÙÙØ«Ø§ØŠÙ.
+
+DSpacePlugin.desc:Ù
+ÙØ§ØšØ³ DSpacePlug ÙØ£Ø®Ø° Ù
+Ø¬Ù
+ÙØ¹Ø© Ø§ÙÙØ«Ø§ØŠÙ Ø§ÙÙ
+ØµØ¯Ø±Ø© Ù
+Ù DSpace Ù ÙØ³ØªÙØ±Ø¯ÙØ§ Ø¥ÙÙ ÙØ±ÙÙØ³ØªÙÙ.  
+	
+DSpacePlugin.first_inorder_ext:ÙØ³ØªØ®Ø¯Ù
+ ÙØ°Ø§ ÙØªØ¹Ø±ÙÙ Ø§ÙØ±Ø§ÙØ¯ Ø§ÙØ¥ØšØªØ¯Ø§ØŠÙ ÙÙØ«Ø§ØŠÙ Ù
+Ø¬Ù
+ÙØ¹Ø© DSpace Ù
+Ø¹ ÙØ°Ø§ Ø§ÙØ®ÙØ§Ø±Ø ÙØ§Ù Ø§ÙÙØžØ§Ù
+
+
+DSpacePlugin.first_inorder_mime:ÙØ³ØªØ®Ø¯Ù
+ ÙØ°Ø§ ÙØªØ­Ø¯ÙØ¯ Ù
+ØŽØºÙ Ø§ÙØšÙØ§ÙØ§Øª Ø§ÙØ£ÙÙÙ ÙÙØ«ÙÙØ© Ù
+Ø¬Ù
+ÙØ¹Ø© DSpace. Ù
+Ø¹ ÙØ°Ø§ Ø§ÙØ®ÙØ§Ø±Ø Ø³ÙÙ ÙØªØ¹Ø§Ù
+Ù Ø§ÙÙØžØ§Ù
+ Ø£ÙÙØ§Ø¹ ÙØ«Ø§ØŠÙ MIME ØšØ§ÙØªØ±ØªÙØš ÙÙØšØ­Ø« Ø¹Ù Ø§ÙÙ
+ØŽØºÙ Ø§ÙØ£ÙÙÙ Ø§ÙÙ
+ØªØ§Ø­.  
+
+DSpacePlugin.only_first_doc:ÙØ³ØªØ®Ø¯Ù
+ ÙØ°Ø§ ÙØªØ¹Ø±ÙÙ Ø§ÙØ±Ø§ÙØ¯ Ø§ÙØ§ØšØªØ¯Ø§ØŠÙ ÙØšÙØ§ÙØ§Øª Ù
+Ø¬Ù
+ÙØ¹Ø© ÙØ«Ø§ØŠÙ DSpace Ù
+Ø¹ ÙØ°Ø§ Ø§ÙØ®ÙØ§Ø±Ø ÙØ§Ù Ø§ÙÙØžØ§Ù
+ Ø³ÙÙ ÙØ¹Ø§Ù
+Ù Ø£ÙÙØ§Ø¹
+
+EmailAddressExtractor.desc:Ø§ÙÙ
+ÙØ§ØšØ³ Ø§ÙÙ
+Ø³Ø§Ø¹Ø¯ Ø§ÙÙ
+Ø³ØªØ®Ø±Ø¬ ÙØ§ÙØªØŽØ§Ù  Ø¹ÙØ§ÙÙÙ Ø§ÙØšØ±ÙØ¯ Ø§ÙØ¥ÙÙØªØ±ÙÙÙ ÙÙ Ø§ÙÙØµ.  
+
+EmailAddressExtractor.done_email_extract:ØªÙ
+ ÙØ¥Ø³ØªØ®ÙØ§Øµ Ø¹ÙØ§ÙÙÙ Ø§ÙØšØ±ÙØ¯ Ø§ÙØ¥ÙÙØªØ±ÙÙÙ.
+
+EmailAddressExtractor.extracting_emails:Ø¥Ø³ØªØ®ÙØ§Øµ Ø¹ÙØ§ÙÙÙ Ø§ÙØšØ±ÙØ¯ Ø§ÙØ¥ÙÙØªØ±ÙÙÙ
+
+EmailAddressExtractor.extract_email:Ø¥Ø³ØªØ®ÙØ§Øµ Ø¹ÙØ§ÙÙÙ Ø§ÙØšØ±ÙØ¯ Ø§ÙØ¥ÙÙØªØ±ÙÙÙ ÙÙØ§ØµÙØ§Øª ØšÙØ§ÙØ§Øª.
+
+EmailPlugin.desc:Ù
+ÙØ§ØšØ³ mail plug ÙÙØ±Ø£ Ù
+ÙÙØ§Øª Ø§ÙØšØ±ÙØ¯ Ø§ÙØ§ÙÙØªØ±ÙÙÙ.  ÙØ°Ù Ø§ÙÙ
+ÙÙØ§Øª ØªÙ
+Øª ØªØ³Ù
+ÙØªÙØ§ ØšØ£Ø¹Ø¯Ø§Ø¯ ØšØ³ÙØ·Ø© (Ø£Ù ÙÙ
+Ø§ ÙØ±Ø¯Øª ÙÙ Ù
+Ø¬ÙØ¯Ø§Øª Ø¯ÙÙÙ Ø§ÙØšØ±ÙØ¯ ) Ø£Ù Ù
+Ø¹
+
+EmailPlugin.no_attachments:ÙØ§ ØªØ­ÙØž Ù
+ÙØ­ÙØ§Øª Ø§ÙØ±Ø³Ø§ÙØ©.
+
+EmailPlugin.headers:Ø®Ø²Ù ØªØ±ÙÙØ³Ø§Øª Ø§ÙØšØ±ÙØ¯ Ø§ÙØ¥ÙÙØªØ±ÙÙÙ ÙÙ "ØªØ±ÙÙØ³Ø§Øª" ÙØ§ØµÙØ§Øª ØšÙØ§ÙØ§Øª  
+
+EmailPlugin.OIDtype.message_id:Ø§Ø³ØªØ®Ø¯Ù
+ Ù
+Ø¹Ø±Ù Ø§ÙØ±Ø³Ø§ÙØ© ØšÙØµÙÙ Ù
+Ø¹Ø±Ù Ø§ÙÙØ«ÙÙØ© OID. Ø¥Ø°Ø§ ÙÙ
+ ÙÙÙ ÙÙØ§Ù Ù
+Ø¹Ø±Ù Ø±Ø³Ø§ÙØ© Ø Ø³ÙÙ ÙØ³ØªØ®Ø¯Ù
+  hash OID"  
+
+EmailPlugin.split_exp:Ø§ÙØªØ¹ØšÙØ±Ø§Øª Ø§ÙÙ
+ÙØªØžÙ
+Ø© ØšÙØºØ© perl Ø§ÙØªÙ ØªØ³ØªØ®Ø¯Ù
+ ÙØªÙØ³ÙÙ
+ Ù
+ÙÙØ§Øª ØªØ­ØªÙÙ Ø¹ÙÙ Ø§ÙØ¹Ø¯ÙØ¯ Ù
+Ù Ø§ÙØ±Ø³Ø§ØŠÙ Ø¥ÙÙ ÙØ«Ø§ØŠÙ ÙØ±Ø¯ÙØ©.  
+
+ExcelPlugin.desc:Ù
+ÙØ§ØšØ³ ÙØ§Ø³ØªÙØ±Ø§Ø¯ Ù
+ÙÙØ§Øª Ù
+Ø§ÙÙØ±ÙØ³ÙÙØª Ø§ÙØ³Ù (95 Ù 97 Ø¥ØµØ¯Ø§Ø±Ø§Øª).  
+
+FavouritesPlugin.desc:Ø§ÙÙ
+ÙØ§ØšØ³ ÙÙ
+Ø¹Ø§ÙØ¬Ø© Ù
+ÙÙØ§Øª Ø¥ÙØªØ±ÙØª Ø¥ÙØ³ØšÙÙØ±Ø± Ø§ÙÙ
+ÙØ¶ÙØ© .  
+
+FOXPlugin.desc:Ù
+ÙØ§ØšØ³ ÙÙ
+Ø¹Ø§ÙØ¬Ø© Ù
+ÙÙ Foxbase dbt . ÙÙÙØ± ÙØ°Ø§ Ø§ÙÙ
+ÙØ§ØšØ³ Ø§ÙÙØžÙÙØ© Ø§ÙØ£Ø³Ø§Ø³ÙØ© ÙÙØ±Ø§Ø¡Ø©  dbt Ù Ù
+ÙÙØ§Øª dbf Ù Ù
+Ø¹Ø§ÙØ¬Ø© ÙÙ ØªØ³Ø¬ÙÙØ©. ÙØ°Ø§ Ø§ÙÙ
+ÙØ§ØšØ³
+
+GreenstoneXMLPlugin.desc:ÙØ¹Ø§ÙØ¬ ÙØ«Ø§ØŠÙ ÙØ±ÙÙØ³ØªÙÙ ÙÙ ÙÙØŠØ© xml .Ø¹ÙÙ
+Ø§ ØšØ§Ù ÙØ°Ø§ Ø§ÙÙ
+ÙØ§ØšØ³ ÙÙØ³ ÙÙ ÙØ­Øµ ØµÙØºØ©  (Ø±ØºÙ
+ Ø§Ù ÙØ­Ø¯Ø§Øª Ø§ÙÙ
+Ø¹Ø±Øš Ø§ÙÙØºÙÙ ÙÙ XML::ØªØ®ØªØšØ± Ø§ÙØ¬ÙØ¯Ø© Ø§ÙØªØ±ÙÙØš). Ù
+Ù
+
+GISExtractor.desc:ØšØ¬Ø§ÙØš Ø§ÙÙØŠØ© Ø§ÙØ£Ø³Ø§Ø³ BasPlug Ø§ÙØ°Ù ÙØ¯Ø¹Ù
+ ÙØ¯Ø±Ø§Øª GIS  
+
+GISExtractor.extract_placenames:Ø§Ø³ØªØ®ÙØ§Øµ Ø§ÙØ£Ù
+Ø§ÙÙ Ù
+Ù Ø§ÙÙØµ ÙØ§ÙÙ
+Ø¬Ù
+ÙØ¹Ø© ÙÙ
+ÙØªØ§Ø¯Ø§ØªØ§. ØªØªØ·ÙØš Ø§Ù
+ØªØ¯Ø§Ø¯ GIS ÙØšØ±ÙØ§Ù
+Ø¬ Greenstone.  
+
+GISExtractor.gazetteer:Gazetteer ÙØ³ØªØ®ÙØµ Ø£Ø³Ù
+Ø§Ø¡ Ø§ÙØ£Ù
+Ø§ÙÙ Ù ØªØ¹ÙÙÙØ§ ÙÙØ§ØµÙØ§Øª ØšÙØ§ÙØ§Øª. ÙØªØ·ÙØš Ø¥Ù
+ØªØ¯Ø§Ø¯ GIS ÙÙ ÙØ±ÙÙØ³ØªÙÙ.  
+
+GISExtractor.place_list:Ø¹ÙØ¯ Ø§Ø³ØªØ®ÙØ§Øµ Ø§ÙØ£Ù
+Ø§ÙÙØ Ø¶Ù
+Ù ÙØ§ØŠÙ
+Ø© Ø§ÙØ£Ù
+Ø§ÙÙ ÙÙ ØšØ¯Ø§ÙØ© Ø§ÙÙØ«ÙÙØ©. ÙÙØ°Ø§ ÙØ­ØªØ§Ø¬ Ø¥ÙÙ Ø§Ù
+ØªØ¯Ø§Ø¯ GIS ÙØšØ±ÙØ§Ù
+Ø¬ Greenstone.  
+
+HBPlugin.desc:Ø§ÙØšØ±ÙØ§Ù
+Ø¬ Ø§ÙØ°Ù ÙÙÙÙ
+ ØšØ§ÙØ¹Ù
+Ù Ø¹ÙÙ Ù
+Ø¬ÙØ¯ ÙØªØš ØšØµÙØºØ© HTML. ÙÙØ°Ø§ Ø§ÙØšØ±ÙØ§Ù
+Ø¬ ÙØ³ØªØ®Ø¯Ù
+ Ù
+Ù ÙØšÙ Ù
+Ø¬Ù
+ÙØ¹Ø§Øª Ù
+ÙØªØšØ© Ø§ÙØ¥ÙØ³Ø§ÙÙØ§Øª Humanity Library ÙÙØ§ ÙØªØ¹Ø§Ù
+ Ù
+Ø¹ Ø§ÙØ±Ù
+ÙØ² Ø§ÙÙ
+Ø¯Ø®ÙØ© ÙÙØ§ ASCII. ÙØ°Ø§ Ø§ÙØšØ±ÙØ§Ù
+Ø¬ ÙØ¹Ù
+Ù Ø£Ø³Ø±Ø¹Ø ÙÙÙÙ ÙÙØ¯ ÙÙØ§ ØªØŽØ¬ÙØ¹ Ø§ÙÙØ§Ø³ ÙÙÙ ØªÙØŽÙØ¡ Ù
+Ø¬Ù
+ÙØ¹Ø§ØªÙÙ
+ ØšØ§Ø³ØªØ®Ø¯Ø§Ù
+ BookPlugin ØšØ¯ÙØ§ Ù
+Ù ;-)\n\nUse BookPlugin Ø¥Ø°Ø§ Ø§ÙØŽØ£Øª Ù
+Ø¬Ù
+ÙØ¹Ø© Ø¬Ø¯ÙØ¯Ø© Ù Ø£Ø¹Ø¯Ø¯Øª Ù
+ÙÙØ§Øª Ù
+Ø«Ù Ù
+Ø¬Ù
+ÙØ¹Ø§Øª Ù
+ÙØªØšØ© Ø§ÙØ¥ÙØ³Ø§ÙÙØ§Øª. BookPlugin ÙÙØšÙ ÙÙ Ø±Ù
+ÙØ² Ø§ÙØ¥Ø¯Ø®Ø§Ù ÙÙÙÙ ÙØªØ·ÙØš Ø£Ù ØªÙÙÙ Ø§ÙÙ
+ÙÙØ§Øª Ø§ÙÙ
+Ø±Ù
+Ø²Ø© Ø®Ø§ÙÙØ© Ù
+Ù Ø§ÙØ£Ø®Ø·Ø§Ø¡ Ù
+Ø«Ù ÙÙ Ù
+Ø¬Ù
+ÙØ¹Ø§Øª Ù
+ÙØªØšØ© Ø§ÙØ¥ÙØ³Ø§ÙÙØ§Øª  
+
+HBPlugin.encoding.iso_8859_1:ÙØ§ØªÙÙ 1 (ÙØºØ§Øª ØºØ±ØšÙØ©)  
+
+HTMLImagePlugin.aggressiveness:Ù
+Ø¯Ù ØªÙÙÙØ§Øª Ø¥Ø³ØªØ®ÙØ§Øµ Ø§ÙÙØµ ÙÙØ¥Ø³ØªØ®Ø¯Ø§Ù
+.  
+HTMLImagePlugin.aggressiveness.1:Ø¥Ø³Ù
+ Ù
+ÙÙ, Ù
+Ø³Ø§Ø±, ALT ÙØµ ÙÙØ·.  
+HTMLImagePlugin.aggressiveness.2:ÙÙ Ø§Ù  1, Ø²Ø§ØŠØ¯ Ø¹ÙÙØ§Ù Ø§ÙÙÙØ·Ø© Ø­ÙØ« ØªÙÙØ±.  
+HTMLImagePlugin.aggressiveness.3:ÙÙ Ù
+Ù 2 Ø ØšØ§ÙØ¥Ø¶Ø§ÙØ© Ø¥ÙÙ ÙØ±Øš Ø§ÙÙÙØ±Ø§Øª ÙÙÙ
+Ø§ ÙØ§Ù Ø°ÙÙ Ù
+ØªØ§Ø­Ø§  
+HTMLImagePlugin.aggressiveness.4:ÙÙ Ø§Ù  3, Ø²Ø§ØŠØ¯ Ø§ÙØªØ±ÙÙØ³Ø§Øª Ø§ÙØ³Ø§ØšÙØ© (<h1>, <h2>...) Ø­ÙØ« ØªÙÙØ±Øª.  
+HTMLImagePlugin.aggressiveness.5:ÙÙ Ø§Ù  4, Ø²Ø§ØŠØ¯ Ø§ÙÙ
+Ø±Ø§Ø¬Ø¹ Ø§ÙÙØµÙØ© Ø­ÙØ« ØªÙÙØ±Øª.  
+HTMLImagePlugin.aggressiveness.6:ÙÙ Ø§Ù  4, Ø²Ø§ØŠØ¯Ø§ ØªÙØ¬Ø§Ù Ø§ÙØµÙØ­Ø© ( Ø¹ÙÙØ§Ù Ø ÙÙÙ
+Ø§Øª Ù
+ÙØªØ§Ø­ÙØ©ØØ§ÙØ®)  
+HTMLImagePlugin.aggressiveness.7:ÙÙ 6 Ù 5 Ù 4 Ù
+Ø¹Ø§  
+HTMLImagePlugin.aggressiveness.8:ÙÙ 7Ø ØšØ§ÙØ¥Ø¶Ø§ÙØ© Ø¥ÙÙ ØªÙØ±Ø§Ø± Ø¹ÙÙØ§Ù Ø§ÙÙÙØ·Ø©Ø ÙØ§Ø³Ù
+ Ø§ÙÙ
+ÙÙØ Ù Ø¥ÙØ® (Ø¥ØšØ±Ø§Ø² Ø§ÙÙØªØ§ØŠØ¬ Ø§ÙØ£ÙØ«Ø± Ø§Ø±ØªØšØ§Ø·Ø§Ù).  
+HTMLImagePlugin.aggressiveness.9:ÙÙ Ø§Ù  1, Ø²Ø§ØŠØ¯ Ø§ÙÙØµ Ø§ÙÙØ§Ù
+Ù ÙÙ
+ØµØ¯Ø± Ø§ÙØµÙØ­Ø©.  
+
+HTMLImagePlugin.caption_length:ÙØ·ÙÙ Ø§ÙØ£ÙØµÙ  ÙØ¹ÙÙØ§Ù Ø§ÙÙÙØ·Ø§Øª (Ù
+Ø­Ø§Ø±Ù)  
+
+HTMLImagePlugin.convert_params:Ù
+Ø€ØŽØ±Ø§Øª Ø¥Ø¶Ø§ÙÙØ© ÙÙ
+Ø­ÙÙ ImageMagicK ÙÙ Ø¥ÙØŽØ§Ø¡ Ø§ÙÙ
+ØµØºØ±Ø© Ø Ù
+Ø«Ø§Ù , '-raise' Ø³ÙÙ ÙØ¹Ø·Ù ØªØ£Ø«ÙØ± Ø«ÙØ§Ø«Ù Ø§ÙØ£ØšØ¹Ø§Ø¯ Ø§ÙÙ Ø§ÙØµÙØ±Ø© Ø§ÙÙ
+ØµØºØ±Ø©.  
+
+HTMLImagePlugin.desc:ØšØ±ÙØ§Ù
+Ø¬ ÙØ§Ø³ØªØ®ÙØ§Øµ Ø§ÙØµÙØ± Ù Ø§ÙÙØµÙØµ Ø§ÙÙ
+Ø±ØªØšØ·Ø© Ù
+Ù ØµÙØ­Ø§Øª Ø§ÙØ¥ÙØªØ±ÙØª.  
+
+HTMLImagePlugin.document_text:Ø¥Ø¶Ø§ÙØ© ÙØµ ØµÙØ±Ø© ÙÙ ÙØ«ÙÙØ©: ÙØµ (Ø®ÙØ§Ù Ø°ÙÙ Ø§ÙÙØµ Ø§ÙÙ
+ÙØŽÙ ÙØ­ÙÙ ÙØ§ØµÙØ§Øª ØšÙØ§ÙØ§Øª ).  
+
+HTMLImagePlugin.index_pages:ØªÙØŽÙÙ ØµÙØ­Ø§Øª Ù
+Ø¹ Ø§ÙØµÙØ±. ØšØ®ÙØ§Ù Ø§ÙØ§ØŽØ§Ø±Ø© ÙÙ ØµÙØ­Ø§Øª Ù
+ÙÙØ¹ Ø§ÙÙ
+ØµØ¯Ø±  
+
+HTMLImagePlugin.max_near_text:Ø§ÙØ¹Ø¯Ø¯ Ø§ÙØ£ÙØµÙ ÙÙ
+Ø­Ø§Ø±Ù ÙØ±Øš ØµÙØ± ÙÙØ¥Ø³ØªØ®ÙØ§Øµ  
+
+HTMLImagePlugin.min_height:ØšÙØ³Ù.ØªØ¬Ø§ÙØ² Ø§ÙØµÙØ± Ø§ÙØªÙ ÙÙ Ø£ÙØµØ± Ù
+Ù ÙØ°Ù.  
+
+HTMLImagePlugin.min_near_text:Ø§ÙØ¹Ø¯Ø¯ Ø§ÙØ£Ø¯ÙÙ ÙÙ
+Ø­Ø§Ø±Ù ÙØ±Øš ÙØµ Ø£Ù Ø¹ÙÙØ§Ù ÙÙØ·Ø© ÙÙØ¥Ø³ØªØ®ÙØ§Øµ  
+
+HTMLImagePlugin.min_size:ØšØ§ÙØªØ³. ØªØ¬Ø§ÙØ² Ø§ÙØµÙØ± Ø§ÙØªÙ ÙÙ Ø£ØµØºØ± Ù
+Ù ÙØ°Ø§.
+
+HTMLImagePlugin.min_width:ØšÙÙØ³Ù. ØªØ¬Ø§ÙØ² Ø§ÙØµÙØ± Ø§ÙØªÙ ÙÙ Ø£Ø¶ÙÙ Ù
+Ù ÙØ°Ø§.
+
+HTMLImagePlugin.neartext_length:Ø§ÙØ·ÙÙ Ø§ÙÙØ¯Ù ÙØ£ÙØ±Øš ÙØµ (Ù
+Ø­Ø§Ø±Ù).  
+
+HTMLImagePlugin.no_cache_images:ÙØ§ ØªØ¶Ø¹ Ø§ÙØµÙØ± ÙÙ Ø§ÙØ°Ø§ÙØ±Ø© Ø§ÙÙ
+Ø€ÙØªØ© (Ø£ØŽØ± Ø§ÙÙ Ø¹ÙÙØ§Ù Ø§ÙÙ
+ÙØ§Ø±Ø¯ Ø§ÙÙ
+ÙØ­Ø¯ Ø§ÙØ£ØµÙÙ).  
+
+HTMLImagePlugin.smallpage_threshold:Ø§ÙØµÙØ± Ø§ÙØªÙ ÙÙ Ø§ÙØµÙØ­Ø§Øª Ø£ØµØºØ± Ù
+Ù ÙØ°Ù ØšØ§ÙÙ(ØšØ§ÙØªØ³)Ø Ø³ÙÙ ØªØ­ØªÙÙ Ø§ÙØµÙØ­Ø© Ø¹ÙÙ Ø¥Ø¶Ø§ÙØ© ÙØ§ØµÙØ§Øª ØšÙØ§ÙØ§Øª ÙÙÙ Ù
+Ù (Ø§ÙØ¹ÙÙØ§Ù - Ø§ÙÙÙÙ
+Ø§Øª Ø§ÙÙ
+ÙØªØ§Ø­ÙØ© - ... Ø¥ÙØ®)  
+
+HTMLImagePlugin.textrefs_threshold:ØšØ¯Ø§ÙØ© ÙÙØ¥ØŽØ§Ø±Ø§Øª Ø§ÙÙØµÙØ© .Ø§ÙÙÙÙ
+ Ø§ÙØ£ÙÙ ØªØ¹ÙÙ Ø§Ù Ø§ÙØ®ÙØ§Ø±Ø²Ù
+ÙØ© Ø£ÙÙ ØµØ±Ø§Ù
+Ø©  
+
+HTMLImagePlugin.thumb_size:Ø£ÙØµÙ Ø­Ø¬Ù
+ ÙÙØµÙØ±Ø© Ø§ÙÙ
+ØµØºØ±Ø© . ÙÙ Ù
+Ù Ø§ÙØ¹Ø±Ø¶ Ù Ø§ÙØ¥Ø±ØªÙØ§Ø¹.  
+
+HTMLPlugin.assoc_files:Ø§ÙØªØ¹ØšÙØ±Ø§Øª Ø§ÙÙ
+ÙØªØžÙ
+Ø© ÙÙ Perl ÙØ¥Ù
+ØªØ¯Ø§Ø¯Ø§Øª Ø§ÙÙ
+ÙÙØ§Øª Ø§ÙØªÙ ØªÙØ­Ù ØšÙØ«Ø§ØŠÙ HTML.  
+
+HTMLPlugin.desc:ÙØ¹Ø§ÙØ¬ ÙØ°Ø§ Ø§ÙÙ
+ÙØ§ØšØ³ Ù
+ÙÙØ§Øª Ø§ÙÙØµÙØµ Ø§ÙØªØŽØ¹ØšÙØ©
+
+HTMLPlugin.description_tags:ØªÙØ³ÙÙ
+ Ø§ÙÙØ«ÙÙØ© Ø¥ÙÙ Ø£ÙØ³Ø§Ù
+ ÙØ±Ø¹ÙØ© Ø¹ÙØ¯ Ù
+ÙØ§Ù Ø¹ÙØ§Ù
+Ø© <Section>. ØšÙÙÙ
+Ø§ Ø¥Ø°Ø§ ÙÙ ÙÙÙÙ ÙÙØ§Ù Ø£Ù ØªØ£Ø«ÙØ± ÙÙ ÙØªØš '-keep_head' .  
+
+HTMLPlugin.extract_style:Ø¥Ø³ØªØ®ÙØ§Øµ Ù
+Ø¹ÙÙÙ
+Ø§Øª Ø§ÙÙØµ Ù Ø§ÙØ§Ø³ÙÙØš Ù
+Ù Ù
+Ù
+ÙØ² HTML <head> Ù Ø­ÙØž DocumentHeader ÙÙØ§ØµÙØ§Øª  
+
+HTMLPlugin.file_is_url:ÙØ¹ÙÙ Ø¥Ø°Ø§ ÙØ§ÙØª Ø£Ø³Ù
+Ø§Ø¡ Ø§ÙÙ
+ÙÙØ§Øª Ø§ÙÙ
+Ø¯Ø®ÙØ© Ø§ÙØªÙ ØªØŽÙÙ Ø¹ÙÙØ§Ù Ø§ÙÙ
+ÙØ§Ø±Ø¯ Ø§ÙÙ
+Ø­Ø¯ Ù
+ØµØ§Ø¯Ø± ÙØ«Ø§ØŠÙ Ø£ØµÙÙØ© Ø¹ÙÙ Ø³ØšÙÙ Ø§ÙÙ
+Ø«Ø§Ù Ø¥Ø°Ø§ Ø§Ø³ØªØ®Ø¯Ù
+Øª Ø£Ø¯Ø§Ø© Ø¥ÙØ¹ÙØ§Ø³ ÙÙØš ÙØ¥Ø³ØªÙØ±Ø§Ø¯ ÙÙÙÙ Ø¯ÙÙÙ Ø§ÙØ¥Ø³ØªÙØ±Ø§Ø¯.  
+
+HTMLPlugin.hunt_creator_metadata:Ø§ÙØ¬Ø§Ø¯ Ø§ÙØšØ± ÙØ¯Ø± Ù
+Ù
+ÙÙ Ù
+Ù ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª Ø¹ÙÙ Ø§ÙØªØ£ÙÙÙ ÙÙØ¶Ø¹Ù ÙÙ Ø­ÙÙ'Ø§ÙÙ
+ÙØŽØŠ'  
+
+HTMLPlugin.keep_head:ÙØ§ ØªØ²ÙØ­ Ø§ÙØ±Ø€ÙØ³ Ù
+Ù Ù
+ÙÙØ§Øª Ø§ÙÙØµÙØµ Ø§ÙØªØŽØ¹ØšÙØ©.
+
+HTMLPlugin.metadata_fields:ÙØ§ØŠÙ
+Ø© Ø­ÙÙÙ ÙØ§ØµÙØ§Øª ØšÙØ§ÙØ§Øª Ù
+ÙØµÙÙØ© ØšÙØ§ØµÙØ© ÙÙ
+Ø­Ø§ÙÙØ© Ø¥Ø³ØªØ®ÙØ§Øµ. ØªØ³Ù
+Ø­ ÙÙÙ
+Ø³ØªØ®Ø¯Ù
+ÙÙ ØšØªØ¹Ø±ÙÙ ÙØ§ØŠÙ
+Ø© Ù
+ÙØµÙÙØ© ØšÙØ§ØµÙØ© ÙØ­ÙÙÙ ÙØ§ØµÙØ§Øª
+
+HTMLPlugin.no_metadata:ÙØ§ ØªØ­Ø§ÙÙ Ø¥Ø³ØªØ®ÙØ§Øµ Ø¢Ù ÙØ§ØµÙØ§Øª ØšÙØ§ÙØ§Øª Ù
+Ù Ø§ÙÙ
+ÙÙØ§Øª.
+
+HTMLPlugin.no_strip_metadata_html:ÙØ§ØŠÙ
+Ø© Ù
+ÙØµÙÙØ© ØšÙØ§ØµÙØ©  
+
+HTMLPlugin.nolinks:ÙØ§ ØªØšØ°Ù Ø§Ù Ù
+Ø­Ø§ÙÙØ© ÙÙ
+ØµÙØ¯Ø© Ø±ÙØ§ØšØ· ((ÙØ¶Ø¹ ÙØ°Ø§ Ø§ÙØ¹ÙÙ
+ ÙØ¯ ÙØ­Ø³Ù Ø³Ø±Ø¹Ø© ØšÙØ§Ø¡ / Ø§Ø³ØªÙØ±Ø§Ø¯ Ø§Ù ÙØ±ÙØš ÙÙÙÙ Ø§ÙØ±ÙØ§ØšØ· Ø¯Ø§Ø®Ù Ø³ØªÙÙÙ Ø§ÙÙØ«Ø§ØŠÙ Ù
+ÙØ³ÙØ±Ù).  
+
+HTMLPlugin.no_image_links:ÙØ§ ØªØšØ°Ù Ø£Ù Ù
+Ø­Ø§ÙÙØ© ÙØ¥ÙØªÙØ§Øµ  Ø±ÙØ§ØšØ· ØµÙØ±Ø©  ÙÙØ³Ù
+Ø§Ø­ ØšÙ
+ØŽØ§ÙØ¯Ø© Ø§ÙØµÙØ±.  
+
+HTMLPlugin.rename_assoc_files:Ø¥Ø¹Ø§Ø¯Ø© ØªØ³Ù
+ÙØ© Ø§ÙÙ
+ÙÙØ§Øª Ø§ÙÙ
+ÙØ­ÙØ© ØšØ§ÙÙØ«Ø§ØŠÙ (Ù
+Ø«Ø§ÙØØµÙØ±). Ø£ÙØ¶Ø§ Ø£ÙØŽØŠ ÙÙÙÙ Ø£Ø¯ÙØ© Ø¶Ø­Ù (Ù
+ÙÙØ¯ ÙÙÙ
+Ø§ ÙØªØ¹ÙÙ ØšØ¥ÙØŽØ§Ø¡ Ù
+Ø¬Ù
+ÙØ¹Ø§Øª
+
+HTMLPlugin.sectionalise_using_h_tags:ØªÙÙØ§ØŠÙØ§ Ø£ÙØŽØŠ ÙØ«ÙÙØ© Ù
+Ø¬Ø²Ø§Ø© ØšØ§Ø³ØªØ®Ø¯Ø§Ù
+ Ù
+Ù
+ÙØ²Ø§Øª  h1, h2, ... hX .  
+
+HTMLPlugin.title_sub:Ø¥Ø³ØªØšØ¯Ø§Ù Ø§ÙØªØ¹ØšÙØ± ÙØªØ¹Ø¯ÙÙ Ø³ÙØ³ÙØ© ÙØµÙØ© Ù
+Ø®Ø²ÙØ© ÙØ¹ÙÙØ§Ù. ØªØ³ØªØ®Ø¯Ù
+ Ø¹ÙÙ Ø³ØšÙÙ Ø§ÙÙ
+Ø«Ø§ÙØ ØšÙØ§Ø³Ø·Ø©  Ù
+ÙØ§ØšØ³ PDFPlug ÙØ¥Ø²Ø§Ø­Ø© "ØµÙØ­Ø© 1" Ø§ÙØ® Ù
+Ù ÙØµ Ù
+Ø³ØªØ®Ø¯Ù
+ ÙØ¹ÙÙØ§Ù.  
+
+HTMLPlugin.tidy_html:Ø¥Ø°Ø§ ØªÙ
+ ØªØ¹ÙÙÙØ§ØØªÙÙÙ
+ ØšØªØ­ÙÙÙ ÙØ«ÙÙØ© HTML Ø¥ÙÙ ÙÙØŠØ© XHTML Ø¬ÙØ¯Ø© Ø§ÙØ¥Ø¹Ø¯Ø§Ø¯. ØªÙ
+ÙÙ Ø§ÙÙ
+Ø³ØªÙÙØ¯ÙÙ Ù
+Ù Ø¹Ø±Ø¶ Ø§ÙÙØ«ÙÙØ© ÙÙ ÙÙØŠØ© ÙØªØ§Øš  
+
+HTMLPlugin.old_style_HDL:ÙØªØ­Ø¯ÙØ¯ Ù
+Ø§ Ø¥Ø°Ø§ ÙØ§Ù Ø§ÙÙ
+ÙÙ ÙÙ ÙØ°Ù Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø© Ù
+ÙØ³Ù
+ ØšØ¥Ø³ØªØ®Ø¯Ø§Ù
+ Ø§Ø³ÙÙØš ÙØ³Ù
+ HDL Ø§ÙÙØ¯ÙÙ
+.  
+
+BaseMediaConverter.enable_cache:ÙØ¶Ø¹ Ø§ÙØµÙØ± Ø§ÙÙ
+ØµØºØ±Ø© ÙØ¹Ø±Ø¶ Ø§ÙØŽØ§ØŽØ© ÙÙ Ø°Ø§ÙØ±Ø© Ø§ÙØªØ®Ø²ÙÙ Ø§ÙÙ
+Ø€ÙØª Ø­ØªÙ ÙØ§ ØªØ­ØªØ§Ø¬ Ø¥ÙÙ ØªÙÙÙØ¯ÙØ§ Ù
+Ø±Ø§Ø±Ø§.  
+
+ImageConverter.converttotype:ØªØ­ÙÙÙ Ø§ÙØµÙØ±Ø© Ø§ÙØ£Ø³Ø§Ø³ÙØ© Ø§ÙÙ ÙÙØŠØ© 's'.
+
+ImageConverter.create_screenview:Ø§Ø°Ø§ ÙØ¶Ø¹Øª Ø§ÙÙÙÙ
+Ø© ØµØ­ÙØ­ ØØ³ÙÙ ØªÙØŽØŠ ØµÙØ±Ø© ØšØ­Ø¬Ù
+ Ø§ÙØŽØ§ØŽØ© Ù ØªØ¹Ø¯ ÙØ§ØµÙØ§Øª ØšÙØ§ÙØ§Øª  Ø ÙØ¶Ø¹ Ø§ÙØŽØ§ØŽØ© ØØ·ÙÙ Ø§ÙØŽØ§ØŽØ©ØØ§ÙÙÙÙØ© Ø§ÙØŽØ§ØŽØ©Ø Ù ÙÙØ¹ Ø§ÙØŽØ§ØŽØ© .  
+
+ImageConverter.create_thumbnail:Ø§Ø°Ø§ ÙØ¶Ø¹Øª Ø§ÙÙÙÙ
+Ø© ØµØ­ÙØ­ ØØ³ÙÙ ØªÙØŽØŠ Ù
+ØµØºØ±Ø© ÙÙÙ ØµÙØ±Ø©Ø Ù ØªØ¶ÙÙ Ù
+ØµØºØ±Ø© Ø ÙÙØ¹ Ø§ÙÙ
+ØµØºØ±Ø© ØØ§ÙÙÙÙØ© Ø§ÙÙ
+ØµØºØ±Ø©ØØ¹Ø±Ø¶ Ø§ÙÙ
+ØµØºØ±Ø©ØØ Ù Ø·ÙÙ Ø§ÙÙ
+ØµØºØ±Ø© .  
+ImageConverter.desc:ÙØ°Ø§ Ø§ÙÙ
+ÙØ§ØšØ³ ÙØ¹Ø§ÙØ¬ Ø§ÙØµÙØ±, Ø¥Ø¶Ø§ÙØ© ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª Ø§ÙØ£Ø³Ø§Ø³ÙØ©
+
+ImageConverter.imagemagicknotinstalled:ÙÙ
+ ÙØªÙ
+ ØªØ«ØšÙØª  ImageMagick  
+
+ImageConverter.minimumsize:ØªØ¬Ø§ÙÙ Ø§ÙØµÙØ± Ø§ÙØ£ØµØºØ± Ù
+Ù  n ØšØ§ÙØª.
+
+ImageConverter.noconversionavailable:ØªØ­ÙÙÙ Ø§ÙØµÙØ±Ø© ØºÙØ± Ù
+ØªÙÙØ±  
+
+ImageConverter.noscaleup:ÙØ§ ØªÙÙØ³ Ø§ÙØµÙØ± Ø§ÙØµØºÙØ±Ø© Ø¹ÙØ¯ Ø¥ÙØŽØ§Ø¡ Ù
+Ø®ØªØµØ± ØµÙØ±  
+
+ImageConverter.screenviewsize:Ø¥ÙØŽØ§Ø¡ ØµÙØ± ØšÙ
+ØŽÙØ¯ ØŽØ§ØŽØ© ØšØ­Ø¬Ù
+ nxn.  
+
+ImageConverter.screenviewtype:'Ø§Ø³ØªØ®Ø¯Ø§Ù
+ ØµÙØ±Ø© Ø§ÙØŽØ§ØŽØ© ÙÙ Ø§ÙØªÙØ³ÙÙ '.  
+
+ImageConverter.thumbnailsize:Ø¥ÙØŽØ§Ø¡ Ù
+Ø®ØªØµØ± ØµÙØ±Ø© ØšØ­Ø¬Ù
+ nxn.  
+
+ImageConverter.thumbnailtype:Ø¥ÙØŽØ§Ø¡ Ù
+Ø®ØªØµØ± ØµÙØ±Ø© ÙÙ ÙÙØŠØ© 's'.  
+
+ImageConverter.win95notsupported:ImageMagick ØºÙØ± Ù
+Ø¯Ø¹ÙÙ
+ ÙÙ ØšÙØŠØ© Win95/98  
+
+ImagePlugin.desc:ÙØ°Ø§ Ø§ÙÙ
+ÙØ§ØšØ³ ÙØ¹Ø§ÙØ¬ Ø§ÙØµÙØ±, Ø¥Ø¶Ø§ÙØ© ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª Ø§ÙØ£Ø³Ø§Ø³ÙØ©
+
+IndexPlugin.desc:ÙØ°Ø§ Ù
+ÙØ§ØšØ³ ØºÙØ± Ù
+ØªÙØ±Ø± ÙØ¹Ø§ÙØ¬ Ù
+ÙÙ index.txt . Ù
+ÙÙ index.txt ÙØ¬Øš Ø§Ù ÙØªØ¶Ù
+Ù ÙØ§ØŠÙ
+Ø© ØšØ§ÙÙ
+ÙÙØ§Øª Ù Ø§ÙØªÙ Ø³ØªØ¯Ø±Ø¬ ÙÙ Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø© Ù
+ØªØšÙØ¹Ø©
+
+ISISPlugin.desc:ÙØ¹Ø§ÙØ¬ ÙØ°Ø§ Ø§ÙÙ
+ÙØ§ØšØ³ ÙÙØ§Ø¹Ø¯ ØšÙØ§ÙØ§Øª  CDS/ISIS . Ø§Ù ÙØ§Ø¹Ø¯Ø© ØšÙØ§ÙØ§Øª ÙÙ CDS/ISIS Ù
+Ø¹Ø§ÙØ¬Ø© ØªØŽØªØ±Ø· ÙØ¬ÙØ¯ Ø«ÙØ§Ø«Ø© Ù
+ÙÙØ§Øª ÙÙ Ù
+Ø³Ø§Ø± Ø¥Ø³ØªÙØ±Ø§Ø¯ Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø© Ù ÙÙ Ø§ÙÙ
+ÙÙ Ø§ÙØ±ØŠÙØ³Ù (.mst), Ø¬Ø¯ÙÙ ØªØ¹Ø±ÙÙ Ø§ÙØ­ÙÙÙ (.fdt), Ù Ù
+ÙÙ Ø§ÙØ¥Ø­Ø§ÙØ§Øª Ø§ÙØšÙÙÙØ© (.xrf).
+
+ISISPlugin.subfield_separator:Ø§ÙÙ
+Ø­Ø±Ù Ø§ÙÙ
+Ø³ØªØ®Ø¯Ù
+ ÙÙØµÙ Ø§ÙØ­ÙÙÙ Ø§ÙÙØ±Ø¹ÙØ© ÙÙ ØªØ³Ø¬ÙÙØ§Øª ÙÙØ§Ø¹Ø¯ ØšÙØ§ÙØ§Øª CDS/ISIS .
+
+ISISPlugin.entry_separator:Ø§ÙÙ
+Ø­Ø±Ù Ø§ÙÙ
+Ø³ØªØ®Ø¯Ù
+ ÙÙØµÙ Ø§ÙÙÙÙ
+ Ø§ÙÙ
+ØªØ¹Ø¯Ø¯Ø© ÙÙ Ø­ÙÙÙ Ø§ÙÙÙÙ
+Ø§Øª Ø§ÙÙ
+ÙØªØ§Ø­ÙØ© ÙÙ ØªØ³Ø¬ÙÙØ§Øª ÙÙØ§Ø¹Ø¯ ØšÙØ§ÙØ§Øª  CDS/ISIS .
+
+KeyphraseExtractor.desc:Ø§ÙÙ
+ÙØ§ØšØ³ Ø§ÙÙ
+Ø³Ø§Ø¹Ø¯ Ø§ÙÙ
+Ø³ØªØ®Ø±Ø¬  ÙØªÙÙÙØ¯ Ø¬Ù
+ÙØ© Ù
+ÙØªØ§Ø­ÙØ© Ù
+Ù Ø§ÙÙØµ. ÙÙØ³ØªØ®Ø¯Ù
+ ÙØžØ§Ù
+ Kea keyphrase ÙÙØ§Ø³ØªØ®Ø±Ø§Ø¬.  
+
+KeyphraseExtractor.extract_keyphrases:Ø¥Ø³ØªØ®ÙØ§Øµ Ø§ÙØ¬Ù
+Ù Ø§ÙÙ
+ÙØªØ§Ø­ÙØ© ØšÙØ§Ø³Ø·Ø© Kea (Ø¥Ø¹Ø¯Ø§Ø¯Ø§Øª Ø¥ÙØªØ±Ø§Ø¶ÙØ©).
+
+KeyphraseExtractor.extract_keyphrases_kea4:Ø¥Ø³ØªØ®ÙØ§Øµ ØªÙÙØ§ØŠÙ ÙÙØ¬Ù
+Ù Ø§ÙÙ
+ÙØªØ§Ø­ÙØ© ØšÙØ§Ø³Ø·Ø© Kea 4.0 (Ø¥Ø¹Ø¯Ø§Ø¯Ø§Øª Ø¥ÙØªØ±Ø§Ø¶ÙØ©). Kea 4.0 Ù ÙÙ Ø¥ØµØ¯Ø§Ø±Ø© Ø¬Ø¯ÙØ¯Ø© ØªÙ
+ ØªØ·ÙÙØ±ÙØ§ ÙÙØªÙØŽÙÙ Ø§ÙÙ
+Ø¶ØšÙØ· ÙÙÙØ«Ø§ØŠÙ ÙÙ ÙØ·Ø§Ù Ø§ÙØ²Ø±Ø§Ø¹Ø©.
+
+KeyphraseExtractor.extract_keyphrase_options:ÙÙÙØ± Kea Ø®ÙØ§Ø±Ø§Øª ÙØ¥Ø³ØªØ®ÙØ§Øµ Ø§ÙØ¬Ù
+Ù Ø§ÙÙ
+ÙØªØ§Ø­ÙØ©.Ù
+Ø«Ø§Ù: mALIWEB - Ø¥Ø³ØªØ®Ø¯Ù
+ ÙÙ
+ÙØ°Ø¬ Ø¥Ø³ØªØ®ÙØ§Øµ  ALIWEB ; n5 - Ø¥Ø³ØªØ®ÙØ§Øµ  5 Ø¬Ù
+Ù Ù
+ÙØªØ§Ø­ÙØ©;, eGBK - Ø¥Ø³ØªØ®Ø¯Ù
+ ØªØ±Ù
+ÙØ²  GBK .
+
+KeyphraseExtractor.keyphrases:Ø¬Ù
+Ù Ù
+ÙØªØ§Ø­ÙØ©
+
+KeyphraseExtractor.missing_kea:Ø®Ø·Ø£: ÙÙ
+ ÙØªÙ
+ Ø§ÙØ¹Ø«ÙØ± Ø¹ÙÙ ØšØ±Ø§Ù
+Ø¬ Kea ÙÙ %s. Ø§ÙØ±Ø¬Ø§Ø¡ ØªÙØ²ÙÙ  Kea %s Ù
+Ù http://www.nzdl.org/Kea ÙØªØ«ØšÙØªÙ ÙÙ ÙØ°Ø§ Ø§ÙÙ
+Ø³Ø§Ø±.
+
+LaTeXPlugin.desc:Ù
+ÙØ§ØšØ³ ÙÙ
+Ø¹Ø§ÙØ¬Ø© ÙØ«Ø§ØŠÙ LaTeX .
+
+LOMPlugin.desc:Ù
+ÙØ§ØšØ³ ÙØ¥Ø³ØªÙØ±Ø§Ø¯ Ù
+ÙÙØ§Øª LOM (ÙØ§ØµÙØ§Øª ØšÙØ§ÙØ§Øª ÙÙØ§ÙØ§Øª Ø§ÙØªØ¹ÙÙ
+) .  
+
+LOMPlugin.root_tag:DocType ÙÙ
+ÙÙØ§Øª XML  (Ø£Ù ØªØ¹ØšÙØ± Ù
+ÙØªØžÙ
+ ÙØªØ·Ø§ØšÙ Ù
+Ø¹ Ø¬Ø°Ø± Ø§ÙØ¹ÙØµØ±).  
+
+LOMPlugin.check_timestamp:Ø§ÙØ­Øµ ØªÙØ§Ø±ÙØ® Ø§ÙÙ
+ÙÙØ§Øª Ø§ÙÙ
+ÙØ²ÙØ© Ø³Ø§ØšÙØ§Ø ÙÙÙ
+ ØšØªÙØ²ÙÙ Ø§ÙÙ
+ÙÙ Ø§ÙØ£Ø­Ø¯Ø« ÙÙØ·.  
+
+LOMPlugin.download_srcdocs:ØªÙØ²ÙÙ Ù
+ØµØ¯Ø± Ø§ÙÙØ«ÙÙØ© Ø¥Ø°Ø§ ØªÙ
+ ØªØ­Ø¯ÙØ¯ ÙØ§Ø­Ø¯ (in general^identifier^entry or
+
+MARCPlugin.desc:Ù
+ÙØ§ØšØ³ Ù
+Ø§Ø±Ù Ø§Ø³Ø§Ø³Ù.
+
+MARCPlugin.metadata_mapping:Ø§Ø³Ù
+ Ø§ÙÙ
+ÙÙ Ø§ÙØ°Ù ÙØ¶Ù
+ ØªÙØ§ØµÙÙ Ø§ÙØ®Ø±Ø§ØŠØ· ÙÙÙÙ
+ Ù
+Ø§Ø±Ù Ø§ÙÙ Ø£Ø³Ù
+Ø§Ø¡ ÙØ§ØµÙØ§Øª ØšÙØ§ÙØ§Øª ÙÙ
+
+MARCXMLPlugin.desc:MARCXML plugin.  
+
+MARCXMLPlugin.metadata_mapping_file:Ø§Ø³Ù
+ Ø§ÙÙ
+ÙÙ Ø§ÙØ°Ù ÙØ¶Ù
+ ØªÙØ§ØµÙÙ Ø§ÙØ®Ø±Ø§ØŠØ· ÙÙÙÙ
+ Ù
+Ø§Ø±Ù Ø§ÙÙ Ø§Ø³Ù
+Ø§Ø¡ ÙØ§ØµÙØ§Øª ØšÙØ§ÙØ§Øª ÙÙ ÙØ±ÙÙØ³ØªÙÙ.Ø§ÙØªØ±Ø§Ø¶ÙØ§ Ø¥ÙÙ  
+
+MediaWikiPlugin.desc:Ù
+ÙØ§ØšØ³ ÙØ§Ø³ØªÙØ±Ø§Ø¯ ØµÙØ­Ø§Øª Ø§ÙÙÙØš ÙÙ MediaWiki  
+
+MediaWikiPlugin.show_toc:Ø£Ø¶Ù Ø§ÙÙ ØµÙØ­Ø© Ø­ÙÙ Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø© 'Ø¬Ø¯ÙÙ Ø§ÙÙ
+Ø­ØªÙÙØ§Øª' ÙÙ Ø§ÙØµÙØ© Ø§ÙØ±ØŠÙØ³Ø© ÙÙ
+ÙÙØ¹ MediaWiki .
+
+MediaWikiPlugin.delete_toc:Ø­Ø°Ù ÙØ³Ù
+ 'Ø¬Ø¯ÙÙ Ø§ÙÙ
+Ø­ØªÙÙØ§Øª' ÙÙ ÙÙ ØµÙØ­Ø© HTML . ØªØ­ØªØ§Ø¬ ÙØªØ­Ø¯ÙØ¯ ØªØ¹ØšÙØ± Ù
+ÙØªØžÙ
+  ÙÙ Perl ÙÙ toc_exp Ø£Ø¯ÙØ§Ù
+
+MediaWikiPlugin.toc_exp:ØªØ¹ØšÙØ± Ù
+ÙØªØžÙ
+ ÙÙ Perl ÙÙ
+Ø·Ø§ØšÙØ© 'Ø¬Ø¯ÙÙ Ø§ÙÙ
+Ø­ØªÙÙØ§Øª'. Ø§ÙÙÙÙ
+Ø© Ø§ÙØ¥ÙØªØ±Ø§Ø¶ÙØ© ØªØ·Ø§ØšÙ ØµÙØ­Ø§Øª Ø§ÙÙÙØš Ø§ÙØ¹Ø§Ù
+Ø©
+
+MediaWikiPlugin.delete_nav:Ø­Ø°Ù ÙØ³Ù
+ Ø§ÙØªØ¬ÙØ§Ù . ØªØ­ØªØ§Ø¬ ÙØªØ­Ø¯ÙØ¯ ØªØ¹ØšÙØ± Ù
+ÙØªØžÙ
+ ÙÙ Perl ÙÙ nav_div_exp Ø§Ø¯ÙØ§Ù.  
+
+MediaWikiPlugin.nav_div_exp:ØªØ¹ØšÙØ± Ù
+ÙØªØžÙ
+ ÙÙ Perl ÙÙ
+Ø·Ø§ØšÙØ© ÙØ³Ù
+ Ø§ÙØªØ¬ÙØ§Ù. Ø§ÙÙÙÙ
+Ø© Ø§ÙØ¥ÙØªØ±Ø§Ø¶ÙØ© ØªØ·Ø§ØšÙ ØµÙØ­Ø§Øª Ø§ÙÙÙØš Ø§ÙØ¹Ø§Ù
+Ø© MediaWikiÙÙ  
+
+MediaWikiPlugin.delete_searchbox:Ø§Ø­Ø°Ù Ø§ÙÙØ³Ù
+ Ø§ÙØ®Ø§Øµ ØšÙ
+Ø±ØšØ¹ Ø§ÙØšØ­Ø«. ÙØ­ØªØ§Ø¬ Ø¥ÙÙ ØªØ­Ø¯ÙØ¯ ØšØ±Ù
+Ø¬Ø© Perl ÙÙ searchbox_div_exp ØšØ£Ø³ÙÙ.  
+
+MediaWikiPlugin.searchbox_div_exp:ØªØ¹ØšÙØ± ÙØºØ© Perl Ù
+Ø¹Ø±ÙÙ ÙÙÙ ÙØ¶Ø§ÙÙ Ù
+Ø±ØšØ¹ Ø§ÙØšØ­Ø«. Ø§ÙÙÙÙ
+Ø© Ø§ÙØªÙÙØ§ØŠÙØ© ØªØ¶Ø§ÙÙ ØµÙØ­Ø§Øª MediaWiki Ø§ÙÙ
+Ø¹ØªØ§Ø¯Ø©.  
+
+MediaWikiPlugin.remove_title_suffix_exp:ØªØ¹ØšÙØ± Ù
+ÙØªØžÙ
+ ÙÙ Perl ÙØªÙÙÙÙ
+ Ø§ÙØ¹ÙÙØ§Ù Ø§ÙÙ
+Ø³ØªØ®Ø±Ø¬. Ø¹ÙÙ Ø³ØšÙÙ Ø§ÙÙ
+Ø«Ø§ÙØ \\s-(.+) Ø³ÙÙ
+
+MetadataCSVPlugin.desc:Ù
+ÙØ§ØšØ³ ÙÙØ§ØŠÙ
+Ø© Ù
+ÙØµÙÙØ© ØšÙØ§ØµÙØ© ÙÙÙÙ
+ ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª .Ø­ÙÙ Ø§Ø³Ù
+ Ø§ÙÙ
+ÙÙ ÙÙ Ù
+ÙÙ CSV ÙÙØ­Ø¯Ø¯ Ø§ÙÙ Ø£Ù ÙØ«ÙÙØ© ØªÙØªÙ
+Ù ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª.  
+
+MetadataPass.desc:ØšØ¬Ø§ÙØš Ø§ÙÙØŠØ© Ø§ÙØ£Ø³Ø§Ø³ ÙÙ BasPlug Ø§ÙØ°Ù ÙØ¯Ø¹Ù
+ Ø¥Ø³ØªØ®Ø¯Ø§Ù
+ Ù
+ÙØ§ØšØ³ ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª ÙØªÙ
+Ø±ÙØ± metadata_read ÙÙ import.pl  
+
+MetadataXMLPlugin.desc:Ù
+ÙØ§ØšØ³ ÙØ¹Ø§ÙØ¬  Ù
+ÙÙØ§Øª metadata.xml .  
+
+MetadataEXIFPlugin.desc:Ø§ÙÙ
+ÙØ§ØšØ³ Ø§ÙØ°Ù ÙØ³ØªØ®Ø±Ø¬ ÙØ§ØµÙØ§Øª ØšÙØ§ÙØ§Øª EXIF Ù
+Ù Ø§ÙØµÙØ± ØÙ Ø§ÙØµÙØª Ù Ø§ÙÙÙØ¯ÙÙ  . ØšØŽÙÙ Ø£ÙØ«Ø± ØªØ­Ø¯ÙØ¯Ø§ Ø ÙØ£ÙÙ ÙÙÙÙ
+ Ø¹ÙÙ ÙØ­Ø¯Ø© CPAN 'ExifTool'. ÙÙØ¯Ø¹Ù
+ ÙØ°Ø§ Ø§ÙØ¹Ø¯ÙØ¯ Ù
+Ù Ø§ÙØ£ØŽÙØ§Ù Ø Ø«Ù
+ ÙØŽÙØ± Ø¥ÙÙ Ø§Ø³Ù
+ (Ù
+Ø«Ù GPS, XMP, FlashPix, ID3, VorbisØ ). Ù ÙØ³ØªÙÙØ¯ Ø§ÙÙ
+ÙØ§ØšØ³ Ù
+Ù ÙØ°Ø§  Ø Ù ÙØ¯ ØªÙ
+ ØªØµÙ
+ÙÙ
+Ù ÙØ¯Ø¹Ù
+ Ø§ÙØ§ØŽÙØ§Ù Ø§ÙØªÙ ÙØ¯Ø¹Ù
+ÙØ§  ExifTool. Ø§ÙØžØ± ÙØ«Ø§ØŠÙ ExifTool ÙØ£ÙÙØ§Ø¹ Ø§ÙÙ
+ÙÙØ§Øª ÙØ¯Ø¹Ù
+ Ù
+Ø®Ø·Ø·Ø§Øª ÙØ§ØµÙØ§Øª ØšÙØ§ÙØ§Øª.  
+
+GreenstoneMETSPlugin.desc:Ù
+Ø¹Ø§ÙØ¬Ø© ÙØ«Ø§ØŠÙ METS ØšØ§Ø³ÙÙØš ÙØ±ÙÙØ³ØªÙÙ.  
+
+MP3Plugin.desc:Ù
+ÙØ§ØšØ³ ÙÙ
+Ø¹Ø§ÙØ¬Ø© Ù
+ÙÙØ§Øª MP3 .
+
+MP3Plugin.assoc_images:ØšÙ
+Ø­Ø¯Ø¯ Ø¹ÙÙØ§Ù ID3 Ù ÙØ§ØµÙØ§Øª ØšÙØ§ÙØ§Øª Ø§ÙÙ
+Ø€Ø¯ÙMP3 Ø§Ø³ØªØ®Ø¯Ù
+ Ù
+Ø­Ø±Ù Ø§ÙØšØ­Ø« Ø¬ÙØ¬Ù ÙÙØµÙØ± ÙØªØ­Ø¯ÙØ¯ Ø§ÙØµÙØ± Ø§ÙÙ
+Ø±ØªØšØ·Ø© Ù
+Ø¹ Ù
+ÙÙ  
+
+MP3Plugin.applet_metadata:[applet] ÙØªØ®Ø²ÙÙ ÙØ§ØµÙØ§Øª ØšÙØ§ÙØ§Øª ÙÙÙ ÙØ«ÙÙØ© ØªØ­ØªÙÙ Ø¹ÙÙ ÙØ¯Ø± Ù
+Ø·ÙÙØš Ù
+Ù HTML ÙØªØŽØºÙÙ ØšØ±ÙØ§Ù
+Ø¬  
+
+MP3Plugin.metadata_fields:ÙØ§ØŠÙ
+Ø©ØšØ­ÙÙÙ Ø§ÙÙ
+ÙØªØ§Ø¯Ø§ØªØ§ Ù
+ÙØµÙÙØ© ØšØ¹ÙØ§Ù
+Ø© ÙØ§ØµÙØ© (Ø). Ø§Ø³ØªØ®Ø¯Ù
+ "\*"\ ÙØ§Ø³ØªØ±Ø¬Ø§Ø¹ ÙØ§ÙØ© Ø§ÙØ­ÙÙÙ.  
+
+NulPlugin.desc:Ù
+ÙØ§ØšØ³ Ù
+ÙÙ (.nul) Ø§ÙÙÙÙ
+Ù. ÙØ³ØªØ®Ø¯Ù
+ Ù
+Ø¹ Ø§ÙÙ
+ÙÙØ§Øª Ø§ÙØªÙ ØªÙØªØ¬ ØšØªÙ
+Ø¯ÙØ¯ Ù
+ÙÙØ§Øª ÙØ§ØµÙØ§Øª ØšÙØ§ÙØ§Øª ÙØ§Ø¹Ø¯Ø© ØšÙØ§ÙØ§Øª.  
+
+NulPlugin.assoc_field:Ø¥Ø³Ù
+ Ø­ÙÙ ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª Ù Ø§ÙØ°Ù Ø³ÙÙ ÙØªÙ
+ ØªØ®ØµÙØµØ© ÙÙ
+ÙÙ nul  
+NulPlugin.add_metadata_as_text:Ø¶Ø¹ Ø¬Ø¯ÙÙ ÙÙÙ
+ÙØªØ§Ø¯Ø§ØªØ§ ÙÙ ÙØµ Ø§ÙÙØ«ÙÙØ©Ø Ø¥ÙØ§ Ø¥Ø°Ø§ ÙØ§ÙØª ÙØ°Ù Ø§ÙÙØ«ÙÙØ© ÙÙØ³Øª ÙØµÙØ©.  
+
+NulPlugin.remove_namespace_for_text:Ø­Ø°Ù Ø§Ø³Ù
+ Ø§ÙÙ
+Ø³Ø§Ø­Ø© Ù
+Ù Ø§Ø³Ù
+Ø§Ø¡ ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª ÙÙ ÙØµ ÙØ«ÙÙØ©  (Ø¥Ø°Ø§ ØªÙ
+ ØªØ¹ÙÙ add_metadata_as_text ).  
+
+OAIPlugin.desc:Ø§ÙÙ
+ÙØ§ØšØ³ Ø§ÙØ£Ø³Ø§Ø³Ù ÙÙ
+ØšØ§Ø¯Ø±Ø© Ø§ÙØ£Ø±ØŽÙÙ Ø§ÙÙ
+ÙØªÙØ­ (OAI) .
+
+OAIPlugin.document_field:Ø¹ÙØµØ± ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª Ø§ÙØ°Ù ÙØ­Ø¯Ø¯ Ø§Ø³Ù
+ Ù
+ÙÙ Ø§ÙÙØ«Ø§ØŠÙ Ø§ÙØ°Ù ØªÙØ­Ù ØšÙ ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª.  
+
+OAIPlugin.metadata_set:Ù
+Ø¹ÙØ§Ø± ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª (ØšØ§Ø¯ØŠØ© Ø¥Ø³Ù
+ Ù
+Ø³Ø§Ø­Ø©) ÙØ¥Ø³ØªÙØ±Ø§Ø¯ ÙÙ ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª ÙÙÙØ§ Ù  
+OAIPlugin.metadata_set.auto:Ø£Ø³ØªØ®Ø¯Ù
+ Ø§ÙØšØ§Ø¯ØŠØ§Øª Ø§ÙÙ
+Ø®ØµØµØ© ÙÙ ØªØ³Ø¬ÙÙØ© OAI  
+OAIPlugin.metadata_set.dc:"Ø§Ø³ØªØ®Ø¯Ø§Ù
+ Ø§ÙØšØ§Ø¯ØŠØ© dc. Ø³ÙÙ ÙØ®Ø·Ø· Ø¹ÙØ§ØµØ± ÙØ§ØµÙØ§Øª ØšÙØ§ÙØ§Øª Ù
+Ø¹ÙØ§Ø± Ø¯ØšÙÙ ÙÙØ± Ø§ÙÙ
+Ø¹Ø¯Ù ÙÙ ØŽÙÙ Ø¬Ø±ÙÙØ³ØªÙÙØØ¹ÙÙ Ø³ØšÙÙ Ø§ÙÙ
+Ø«Ø§Ù Ø³ÙÙ ØªØµØšØ­ Ø§ÙÙ
+Ø¹ÙÙÙ
+Ø§Øª Ø§ÙÙ
+ÙØ§ÙÙØ© dc.Ø§ÙØªØºØ·ÙØ©^Ø§ÙÙ
+Ø¹ÙÙÙ
+Ø§Øª Ø§ÙÙ
+ÙØ§ÙÙØ©"
+
+  
+
+OggVorbisPlugin.add_technical_metadata:Ø¥Ø¶Ø§ÙØ© ÙØ§ØµÙØ§Øª ØšÙØ§ÙØ§Øª ÙÙÙØ© (Ø¹ÙÙ Ø³ØšÙÙ Ø§ÙÙ
+Ø«Ø§Ù (eg. bitrate)  
+
+OggVorbisPlugin.desc:ØšØ±ÙØ§Ù
+Ø¬ ÙØªØµØ¯ÙØ± Ù
+ÙÙØ§Øª Ø§ÙØµÙØª Ù
+Ù ÙÙØ¹ Ogg Vorbis.  
+
+OpenDocumentPlugin.desc:Ù
+ÙØ§ØšØ³ ÙÙØ«Ø§ØŠÙ ÙÙ ÙÙØŠØ© OASIS OpenDocument (ØªØ³ØªØ®Ø¯Ù
+ ÙÙ OpenOffice 2.0)  
+
+PagedImagePlugin.desc:Ø§ÙØšØ±ÙØ§Ù
+Ø¬ Ø§ÙÙ
+Ø³Ø§Ø¹Ø¯ ÙÙØ­ØµÙÙ Ø¹ÙÙ ÙØ«Ø§ØŠÙ ØªØªÙÙÙ Ù
+Ù Ø³ÙØ³ÙØ© Ù
+Ù Ø§ÙØµÙØ± Ø Ù
+Ø¹ Ø±Ù
+ÙØ² Ø§ÙÙØµ Ø§ÙØ§Ø®ØªÙØ§Ø±Ù ÙÙÙ ØµÙØ±Ø©. ÙØ°Ø§ Ø§ÙØšØ±ÙØ§Ù
+Ø¬ Ø§ÙÙ
+Ø³Ø§Ø¹Ø¯ Ø§ÙØ¹Ù
+ÙÙØ§Øª.
+
+PagedImagePlugin.documenttype:Ø­Ø¯Ø¯ ÙÙØ¹ Ø§ÙÙØ«ÙÙØ© (ØªØ³ØªØ®Ø¯Ù
+ ÙÙØ¹Ø±Ø¶)  
+
+PagedImagePlugin.documenttype.paged:ØµÙØ­Ø§Øª Ø§ÙÙØ«Ø§ØŠÙ ØšÙØ§ Ø£Ø³ÙÙ
+ ØªØ§ÙÙ Ù ÙØšÙ Ù Ù
+Ø±ØšØ¹  'Ø¥ÙÙ ØµÙØ­Ø© X'  
+
+PagedImagePlugin.documenttype.hierarchy:Ø§ÙÙØ«Ø§ØŠÙ Ø§ÙÙØ±Ù
+ÙØ© ØªØªØ¶Ù
+Ù ÙØ§ØŠÙ
+Ø© Ù
+Ø­ØªÙÙØ§Øª.  
+
+PagedImagePlugin.headerpage:Ø§Ø¶Ù ÙØ±Ù
+ ØªØ±Ù ÙØ³Ù Ø§ÙØµÙØ­Ø© (Ø§ÙØªÙ ÙØ§ ØªØ­ØªÙÙ Ø¹ÙÙ ØµÙØ±Ø©) ÙÙÙ ÙØ«ÙÙØ©.  
+
+PDFPlugin.allowimagesonly:Ø§Ø³Ù
+Ø­ ÙÙÙ
+ÙÙØ§Øª Ù
+Ù ÙÙØ¹ PDF. ØªØ¬ÙØš Ø§ÙØ­Ø§Ø¬Ø© Ø¥ÙÙ Ø£Ù ØªÙÙÙ Ù
+Ø¬Ù
+ÙØ¹Ø© Ù
+Ø¹ÙØ¯Ø©. ÙÙØ· useful with convert_to html .  
+
+PDFPlugin.complex:Ø¥ÙØŽØ§Ø¡ ÙØ§ØªØ¬ Ø£ÙØ«Ø± ØªØ¹ÙÙØ¯Ø§. Ù
+Ø¹ ÙØ°Ø§ Ø§ÙØ®ÙØ§Ø± Ø­Ø¯Ø¯ ÙØ§ØªØ¬ html Ø³ÙØšØ¯Ù Ø£ÙØ«Ø± ØŽØšÙØ§ ÙÙ
+ÙÙ PDF Ø§ÙØ£ØµÙÙ. ÙÙÙ ÙØ¹Ù
+Ù ÙØ°Ø§ ØšØŽÙÙ ØµØ­ÙØ­ ÙØ¬Øš ØªØ«ØšÙØª
+
+PDFPlugin.desc:Ø§ÙÙ
+ÙØ§ØšØ³ Ø§ÙØ°Ù ÙØ¹Ø§ÙØ¬ ÙØ«Ø§ØŠÙ PDF .  
+
+PDFPlugin.nohidden:ØªÙ
+ÙØ¹  pdftohtml Ù
+Ù Ù
+Ø­Ø§ÙÙØ© Ø¥Ø³ØªØ®ÙØ§Øµ ÙØµ Ù
+Ø®ÙÙ.ÙØ°Ø§ ÙÙÙØ¯ ÙÙØ· ÙÙ Ø­Ø§ÙØ© ØªØ¹ÙÙ Ø®ÙØ§Ø± -complex .  
+
+PDFPlugin.noimages:ÙØ§ ØªØ­Ø§ÙÙ Ø£Ù ØªØ³ØªØ®ÙØµ Ø§ÙØµÙØ± Ù
+Ù Ù
+ÙÙØ§Øª PDF.  
+
+PDFPlugin.use_sections:Ø¥ÙØŽØ§Ø¡ ÙØ³Ù
+ Ù
+ÙÙØµÙ ÙØ¢Ù ØµÙØ­Ø© Ù
+Ù Ù
+ÙÙ PDF .  
+
+PDFPlugin.zoom:Ø§ÙØ¹Ø§Ù
+Ù Ø§ÙØ°Ù ÙØ³ØªØ®Ø¯Ù
+ ÙØªÙØšÙØ± ÙØ§ØªØ¬ PDF  (Ù ÙØ°Ø§ ÙÙÙØ¯ ÙÙØ· Ø¥Ø°Ø§ ØªÙ
+ ØªØ¹ÙÙ -complex ).  
+
+PostScriptPlugin.desc:ÙØ°Ø§ ÙÙ Ù
+Ø­ÙÙ ÙØµ\ "Ø§ÙØ±Ø¬Ù Ø§ÙÙÙÙØ± \" Ù
+Ùps. Ø§Ø°Ø§ ÙÙØª Ø¬Ø§Ø¯Ø© Ø Ø§ÙÙØžØ± ÙÙ Ø§Ø³ØªØ®Ø¯Ø§Ù
+ Ø­Ø²Ù
+Ø© Ø§ÙØ£Ù
+Ø± Ø§ÙØ±Ø³Ù
+Ù Ø ÙÙÙ Ù
+ØªØ§Ø­ ÙÙØªØ­Ù
+ÙÙ ÙÙ
+
+PostScriptPlugin.extract_date:Ø¥Ø³ØªØ®ÙØ§Øµ Ø§ÙØªØ§Ø±ÙØ® Ù
+Ù ØªØ±ÙÙØ³Ø© PS .
+
+PostScriptPlugin.extract_pages:Ø¥Ø³ØªØ®ÙØ§Øµ Ø§ÙØµÙØ­Ø§Øª Ù
+Ù ØªØ±ÙÙØ³Ø© PS .
+
+PostScriptPlugin.extract_title:Ø¥Ø³ØªØ®ÙØ§Øµ Ø§ÙØ¹ÙÙØ§Ù Ù
+Ù ØªØ±ÙÙØ³Ø© PS .
+
+PowerPointPlugin.desc:Ù
+ÙØ§ØšØ³ ÙØ¥Ø³ØªÙØ±Ø§Ø¯ Ù
+ÙÙØ§Øª Ù
+Ø§ÙÙØ±ÙØ³ÙÙØª ØšØ§ÙØ± ØšÙÙÙØª.
+
+PowerPointPlugin.windows_scripting:Ø§Ø³ØªØ®Ø¯Ù
+  MicroSoft Windows scripting technology (Visual Basic ØªØ·ØšÙÙØ§Øª) ÙØ¥ÙØ¬Ø§Ø¯ PPT Ù ØªØ­ÙÙÙ Ø§ÙÙØ«ÙÙØ© Ø§ÙÙ Ù
+Ø®ØªÙÙ ÙÙØŠØ§Øª Ø§ÙØµÙØ± (Ø¹ÙÙ Ø³ØšÙÙ Ø§ÙÙ
+Ø«Ø§Ù JPEG,PNG,GIF) ØšØ¯ÙØ§ Ù
+Ù Ø§ÙØªØ¹ÙÙÙ Ø¹ÙÙ Ø§ÙØ­Ø²Ù
+Ø© Ø§ÙÙ
+ÙØªÙØ­Ø© Ø§ÙÙ
+ØµØ¯Ø±
+
+PrintInfo.bad_general_option:Ø§ÙÙ
+ÙØ§ØšØ³  %s ÙØ³ØªØ®Ø¯Ù
+ Ø®ÙØ§Ø± ØºÙØ± Ø³ÙÙÙ
+. Ø§ÙØ±Ø¬Ø§Ø¡ ÙØ­Øµ Ù
+ÙÙ Ø§ÙØªÙÙÙÙ collect.cfg .
+
+PrintInfo.desc:Ù
+Ø¹ØžÙ
+  Ø§ÙÙ
+ÙØ§ØšØ³ Ø ØªØ¹Ø§ÙØ¬ Ù
+Ø¹ÙÙÙ
+Ø§Øª Ø§ÙØ·ØšØ§Ø¹Ø© (ØšØ§Ø³ØªØ®Ø¯Ø§Ù
+ pluginfo.pl) Ø ÙØ§ÙØªØ­ÙÙÙ Ù
+Ù Ø§ÙØ­Ø¬Ø¬  
+
+ProCitePlugin.desc:Ù
+ÙØ§ØšØ³ ÙÙ (Ù
+ØµØ¯Ø±Ø©) ProCite ÙÙØ§Ø¹Ø¯ ØšÙØ§ÙØ§Øª  
+
+ProCitePlugin.entry_separator:Ø§ÙØ³ÙØ³ÙØ© Ø§ÙØªÙ ØªØ³ØªØ®Ø¯Ù
+ ÙÙØµÙ Ø§ÙÙÙÙ
+ Ø§ÙÙ
+ØªØ¹Ø¯Ø¯Ø© ÙÙ Ø­ÙÙ ÙØ§ØµÙØ§Øª ØšÙØ§ÙØ§Øª ÙØ§Ø­Ø¯ ÙÙ ØªØ³Ø¬ÙÙØ§Øª ÙØ§Ø¹Ø¯Ø© ØšÙØ§ÙØ§Øª ProCite .  
+
+ReadTextFile.could_not_extract_encoding:ØªØ­Ø°ÙØ±: ÙØ§ ÙÙ
+ÙÙ Ø¥Ø³ØªØ®ÙØ§Øµ Ø§ÙØªØ±Ù
+ÙØ² Ù
+Ù %s - Ø§ÙÙÙÙ
+Ø© Ø§ÙØ¥ÙØªØ±Ø§Ø¶ÙØ© Ø¥ÙÙ %s
+
+ReadTextFile.could_not_extract_language:ØªØ­Ø°ÙØ±: ÙØ§ ÙÙ
+ÙÙ Ø¥Ø³ØªØ®ÙØ§Øµ Ø§ÙÙØºØ© Ù
+Ù %s - Ø¥ÙØªØ±Ø§Ø¶ÙØ§ Ø¥ÙÙ %s
+
+ReadTextFile.could_not_open_for_reading:ÙØ§ ÙÙ
+ÙÙ ÙØªØ­  %s ÙÙÙØ±Ø§Ø¡Ø©
+
+ReadTextFile.default_encoding:Ø¥Ø³ØªØ®Ø¯Ù
+ ÙØ°Ø§ Ø§ÙØªØ±Ù
+ÙØ² Ø¥Ø°Ø§ ØªÙ
+ ÙØ¶Ø¹  -input_encoding ÙÙ 'auto' Ø®ÙØ§Ø±Ø²Ù
+ÙØ© ÙØŠØ§Øª Ø§ÙÙØµ ÙÙ Ø¥Ø³ØªØ®ÙØ§Øµ Ø§ÙØªØ±Ù
+ÙØ² Ø£Ù Ø¥Ø³ØªØ®ÙØµØª ØªØ±Ù
+ÙØ² ØºÙØ± Ù
+Ø¯Ø¹ÙÙ
+ ÙÙ ÙØ±ÙÙØ³ØªÙÙ. ÙØ°Ø§ Ø§ÙØ®ÙØ§Ø± ÙÙ
+ÙÙ Ø£Ù ÙØ£Ø®Ø° ÙÙØ³ Ø§ÙÙÙÙ
+Ø© Ù
+Ø«Ù  -input_encoding.
+
+ReadTextFile.default_language:Ø¥Ø°Ø§ ÙØŽÙ ÙØ±ÙÙØ³ØªÙÙ ÙÙ ØªØ­Ø¯ÙØ¯ Ø¹ÙØµØ± ÙØ§ØµÙØ© ÙØºØ© Ø§ÙÙØ«ÙÙØ©Ø ÙØ³ØªØ®Ø¯Ù
+ ÙØ±ÙÙØ³ØªÙÙ Ø§ÙÙ
+Ø¶Ù
+ÙÙ Ø§ÙÙ
+Ø­Ø¯Ø¯ ÙÙØ§. Ø§ÙÙÙÙ
+Ø© Ø§ÙØ¥ÙØªØ±Ø§Ø¶ÙØ© ÙÙ 'en' (ÙÙÙØ§ ÙÙÙ
+ÙØ§ØµÙØ© Ø§ÙÙÙØ§Ø³ÙØ© Ø§ÙØ¯ÙÙÙØ© ÙØ±Ù
+ÙØ² Ø§ÙÙØºØ§ØªISO 639 Ø±Ù
+Ø² Ø§ÙÙØºØ© Ø§ÙØ¥ÙØ¬ÙÙØ²ÙØ© ÙÙ= en ). ØªØ¬Øš Ù
+ÙØ§Ø­ØžØ© Ø§ÙÙ Ø¥Ø°Ø§ ÙÙ
+ ØªØ£Ø®Ø°  -input_encoding ÙÙÙ
+Ø© 'auto' Ù ÙÙ
+ ÙØªÙ
+ ØªØ­Ø¯ÙØ¯ -extract_language , ØªØ£Ø®Ø° ÙÙ Ø§ÙÙØ«Ø§ØŠÙ ÙÙÙ
+Ø© ÙØ°Ø§ Ø§ÙÙ
+Ø¶Ù
+ÙÙ.
+
+ReadTextFile.desc:Ø§ÙÙ
+ÙØ§ØšØ³ Ø§ÙØ£Ø³Ø§Ø³ ÙÙÙ
+ÙÙØ§Øª Ø§ÙØªÙ ÙÙ ÙØµ Ø¹Ø§Ø¯Ù.  
+
+ReadTextFile.empty_file:ÙØ°Ø§ Ø§ÙÙ
+ÙÙ ÙØ§ ÙØªØ¶Ù
+Ù ÙØµ
+
+ReadTextFile.extract_language:Ø¹Ø±Ù ÙØºØ© Ø£Ù ÙØ«ÙÙØ©Ø Ù Ø£Ø¹Ø¯ ÙØ§ØµÙØ© ØšÙØ§ÙØ§Øª Ø§ÙÙØºØ©.ØªØ¬Øš Ù
+ÙØ§Ø­ØžØ© Ø£Ù ÙØ°Ø§ Ø§ÙØ¥Ø¬Ø±Ø§Ø¡ ÙØªÙ
+ ØªÙÙØ§ØŠÙØ§ Ø¥Ø°Ø§ ÙØ§Ù ÙØ¶Ø¹ -input_encoding ÙÙ  'auto'.
+
+ReadTextFile.file_has_no_text:Ø®Ø·Ø£: %s ÙØ§ ÙØªØ¶Ù
+Ù ÙØµ
+
+ReadTextFile.input_encoding:ØªØ±Ù
+ÙØ² Ù
+ØµØ§Ø¯Ø± Ø§ÙÙØ«Ø§ØŠÙ.Ø³ÙÙ ÙØªÙ
+ ØªØ­ÙÙÙ ÙØ°Ø§ Ø§ÙØªØ±Ù
+ÙØ² ÙÙÙØ«Ø§ØŠÙ Ø¥ÙÙ utf8 Ù ÙØ­ÙØž Ø¯Ø§Ø®ÙÙØ§8.
+
+ReadTextFile.input_encoding.auto:Ø§Ø³ØªØ®Ø¯Ù
+ Ø®ÙØ§Ø±Ø²Ù
+ÙØ© ØªØµÙÙÙ Ø§ÙÙØµ ÙÙØªÙ
+ Ø§ÙØªØ¹Ø±Ù Ø§ÙØªÙÙØ§ØŠÙ Ø¹ÙÙ ØªØ±Ù
+ÙØ² ÙÙ Ù
+ØµØ¯Ø± ÙØ«ÙÙØ©. Ù Ø³ÙÙÙÙ ÙØ°Ø§ Ø£ØšØ·Ø£
+
+ReadTextFile.read_denied:ØºÙØ± Ù
+Ø³Ù
+ÙØ­  
+
+ReadTextFile.separate_cjk:Ø£Ø­ØŽØ± Ù
+Ø³Ø§Ø­Ø§Øª ØšÙÙ Ù
+Ø­Ø§Ø±Ù Ø§ÙÙØºØ© Ø§ÙØµÙÙÙØ©/Ø§ÙÙØºØ© Ø§ÙÙØ§ØšØ§ÙÙØ©/Ø§ÙÙØºØ© Ø§ÙÙÙØ±ÙØ© ÙØ¬Ø¹Ù ÙÙ Ù
+Ø­Ø±Ù ÙÙÙ
+Ø©.Ø¥Ø³ØªØ®Ø¯Ù
+ Ø¥Ø°Ø§ ÙÙ
+ ÙÙÙ Ø§ÙÙØµ Ù
+Ø¬Ø²Ø£.
+
+ReadTextFile.unsupported_encoding:ØªØ­Ø°ÙØ±: %s ØªØšØ¯Ù ÙÙ ØªØ±Ù
+ÙØ² ØºÙØ± Ù
+Ø¯Ø¹ÙÙ
+ (%s) - Ø§Ø³ØªØ®Ø¯Ù
+ %s
+
+ReadTextFile.wrong_encoding:ØªØ­Ø°ÙØ±: %s ØªÙ
+Øª ÙØ±Ø§Ø¡ØªÙØ§ ØšØ§Ø³ØªØ®Ø¯Ø§Ù
+ ØªØ±Ù
+ÙØ² %s Ù ÙÙÙ ÙØšØ¯Ù Ø§Ù ØªØ±Ù
+ÙØ²ÙØ§ ÙÙ %s.  
+
+ReadXMLFile.desc:Ø§ÙÙØŠØ© Ø§ÙØ£Ø³Ø§Ø³ ÙÙ
+ÙØ§ØšØ³ XML  
+
+ReadXMLFile.xslt:ØªØ­ÙÙÙ Ø§ÙØ«ÙÙØ© Ø§ÙÙ
+Ø¯Ø®ÙØ© Ø§ÙÙ
+ØªØ·Ø§ØšÙØ© Ù
+Ø¹ XSLT ÙÙ Ø§ÙÙ
+ÙÙ Ø§ÙÙ
+Ø³Ù
+Ù .Ø§Ø³Ù
+ Ù
+ÙÙ ÙØ³ØšÙ ÙÙØªØ±Ø¶ Ø§Ù ÙÙÙÙ ÙÙ Ù
+Ø¬Ø§Ù Ù
+ÙÙ Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø© Ø Ø¹ÙÙ Ø³ØšÙÙ Ø§ÙÙ
+Ø«Ø§Ù
+
+RealMediaPlugin.desc:Ù
+ÙØ§ØšØ³ ÙÙ
+Ø¹Ø§ÙØ¬Ø© Ù
+ÙÙØ§Øª Real Media .
+
+ReferPlugin.desc:Ù
+ÙØ§ØšØ³ ReferPlug  ÙÙØ±Ø§Ø¡ Ø§ÙÙ
+ÙÙØ§Øª Ø§ÙØšÙØšÙÙÙØ¬Ø±Ø§ÙÙØ© ÙÙ ÙÙØŠØ© Refer  
+
+RogPlugin.desc:ÙÙØŽØŠ ÙØ«Ø§ØŠÙ Ù
+Ø³ØªÙÙ ÙØ§Ø­Ø¯ ØšØ³ÙØ· Ù
+Ù Ù
+ÙÙØ§Øª .rog Ø£Ù .mdb .  
+
+RTFPlugin.desc:Ù
+ÙØ§ØšØ³ ÙØ¥Ø³ØªÙØ±Ø§Ø¯ Ù
+ÙÙØ§Øª rtf.  
+
+SourceCodePlugin.desc:Ø¥Ø³Ù
+ Ù
+ÙÙ ÙØ³ØªØ®Ø¯Ù
+ Ø­Ø§ÙÙØ§ ÙØ¹ÙÙØ§Ù ( Ø¥Ø®ØªÙØ§Ø±ÙØ§ ÙÙÙØµ ØšØ¹Ø¶ Ø§ÙØšØ§Ø¯Ø¡Ù). Ø§ÙÙØºØ§Øª Ø§ÙØ­Ø§ÙÙØ©:\nÙØµ: READMEs/Makefiles\nC/C++   (Ø­Ø§ÙÙØ§ ÙØ³ØªØ®Ø±Ø¬ #ÙØªØ¶Ù
+Ù Ø­Ø§ÙØ© Ù C++ class decls)\nPerl    (Ø­Ø§ÙÙØ§ ÙÙØ· ØªÙØ¬Ø² ÙÙØµ)\nShell   (Ø­Ø§ÙÙØ§ ÙÙØ· ØªÙØ¬Ø² ÙÙØµ)
+
+SourceCodePlugin.remove_prefix:Ø­Ø°Ù ÙØ°Ø§ Ø§ÙÙÙ
+Ø· Ø§ÙØ±ÙØ§Ø¯Ù Ù
+Ù Ø¥Ø³Ù
+ Ù
+ÙÙ (Ø¹ÙÙ Ø³ØšÙÙ Ø§ÙÙ
+Ø«Ø§Ù -remove_prefix /tmp/XX/src/). Ø§ÙÙÙÙ
+Ø© Ø§ÙØ¥ÙØªØ±Ø§Ø¶ÙØ© ÙÙ Ø­Ø°Ù ÙÙ Ø§ÙÙ
+Ø³Ø§Ø± Ù
+Ù Ø¥Ø³Ù
+ Ø§ÙÙ
+ÙÙ.  
+
+SplitTextFile.desc:ÙØ³ØªØ®Ø¯Ù
+ Ù
+ÙØ§ØšØ³ SplitPlug ÙØªÙØ³ÙÙ
+ Ø§ÙÙ
+ÙÙØ§Øª Ø§ÙÙ
+Ø¯Ø®ÙØ© Ø§ÙÙ ÙØ·Ø§Ø¹Ø§Øª ØªØ¹ÙØ¬ ØšØµÙØ±Ø© ÙØ±Ø¯ÙØ©. ÙØ¬Øš Ø§Ù ÙØ§ ÙØ³ØªØ¯Ø¹Ù  ÙØ°Ø§ Ø§ÙÙ
+ÙØ§ØšØ³ ØšØµÙØ±Ø© Ù
+ÙÙØ±Ø¯Ø© Ø ØšØ¯ÙØ§ Ø Ø¥Ø°Ø§
+
+SplitTextFile.split_exp:ØªØ¹ØšÙØ± Ù
+ÙØªØžÙ
+ ÙÙ perl ÙØªÙØ³ÙÙ
+ Ø§ÙÙ
+ÙÙØ§Øª Ø§ÙÙ
+Ø¯Ø®ÙØ© Ø§ÙÙ ÙØ·Ø§Ø¹Ø§Øª.  
+
+StructuredHTMLPlugin.desc:Ù
+ÙØ§ØšØ³ ÙØ¹Ù
+ÙÙØ© ÙÙÙÙØ© ÙØ«Ø§ØŠÙ HTML Ø Ù ØªÙØ³ÙÙ
+ÙØ§ Ø§ÙÙ Ø£ÙØ³Ø§Ù
+ Ø¹ÙÙ Ø§Ø³Ø§Ø³ Ø§Ø³ÙÙØš Ø§ÙÙ
+Ø¹ÙÙÙ
+Ø§Øª.  
+
+StructuredHTMLPlugin.delete_toc:Ø­Ø°Ù Ø£Ù Ø¬Ø¯ÙÙ Ù
+Ø­ØªÙÙØ§Øª Ø ÙØ§ØŠÙ
+Ø© Ø£ØŽÙØ§Ù Ø§ÙØ® Ù
+Ù Ù
+ÙÙ HTML Ø§ÙÙ
+Ø­ÙÙ. ØªØ­Ø¯Ø¯ Ø§ÙØ£Ø³Ø§ÙÙØš ÙÙØ°Ø§ Ø§ÙØ¥Ø¬Ø±Ø§Ø¡ ÙÙ Ø®ÙØ§Ø±  
+
+StructuredHTMLPlugin.title_header:ÙÙ
+ÙÙ ÙÙÙ
+Ø³ØªØ®Ø¯Ù
+ ØªØ­Ø¯ÙØ¯ Ø£Ø³Ø§ÙÙØš ØªØ±ÙÙØ³Ø© Ø§ÙØ¹ÙÙØ§Ù  
+
+StructuredHTMLPlugin.level1_header:ÙÙ
+ÙÙ ÙÙÙ
+Ø³ØªØ®Ø¯Ù
+ ØªØ­Ø¯ÙØ¯ Ø£Ø³Ø§ÙÙØš ØªØ±ÙÙØ³Ø© Ø§ÙÙ
+Ø³ØªÙÙ Ø§ÙØ£ÙÙ ÙÙØ«ÙÙØ© HTML (Ù
+Ø³Ø§ÙÙ ÙÙ <h1>).  
+
+StructuredHTMLPlugin.level2_header:ÙÙ
+ÙÙ ÙÙÙ
+Ø³ØªØ®Ø¯Ù
+ ØªØ­Ø¯ÙØ¯ Ø£Ø³Ø§ÙÙØš ØªØ±ÙÙØ³Ø© Ø§ÙÙ
+Ø³ØªÙÙ Ø§ÙØ«Ø§ÙÙ ÙÙØ«ÙÙØ© HTML (Ù
+Ø³Ø§ÙÙ ÙÙ <h2>).  
+
+StructuredHTMLPlugin.level3_header:ÙÙ
+ÙÙ ÙÙÙ
+Ø³ØªØ®Ø¯Ù
+ ØªØ­Ø¯ÙØ¯ Ø£Ø³Ø§ÙÙØš ØªØ±ÙÙØ³Ø© Ø§ÙÙ
+Ø³ØªÙÙ Ø§ÙØ«Ø§ÙØ« ÙÙØ«ÙÙØ© HTML (Ù
+Ø³Ø§ÙÙ ÙÙ <h3>).  
+
+StructuredHTMLPlugin.toc_header:ÙÙ
+ÙÙ ÙÙÙ
+Ø³ØªØ®Ø¯Ù
+ ØªØ­Ø¯ÙØ¯ Ø£Ø³Ø§ÙÙØš ÙØ¬Ø¯ÙÙ Ø§ÙÙ
+Ø­ØªÙÙØ§Øª Ø ÙØ§ØŠÙ
+Ø© Ø§ÙØ£ØŽÙØ§Ù Ø§ÙØ®.ÙØ¥Ø²Ø§ÙØªÙØ§ Ø¹ÙØ¯ ØªØ­Ø¯ÙØ¯ delete_toc  
+
+TextPlugin.desc:ÙÙØŽÙØ¡ ÙØ«ÙÙØ© ØšØ³ÙØ·Ø© Ù
+Ù Ù
+Ø³ØªÙÙ ÙØ§Ø­Ø¯. ÙØ¶ÙÙ Ø­ÙÙ Ù
+ÙØªØ§Ø¯Ø§ØªØ§ Ø®Ø§Øµ ØšØ§ÙØ¹ÙÙØ§Ù ÙÙ Ø£ÙÙ Ø³Ø·Ø± Ù
+Ù Ø§ÙÙØµ (ØšØ·ÙÙ 100 Ø­Ø±Ù ØšØ­Ø¯ Ø£ÙØµÙ).  
+
+TextPlugin.title_sub:Ø¥Ø³ØªØšØ¯Ø§Ù Ø§ÙØªØ¹ØšÙØ± ÙØªØ¹Ø¯ÙÙ Ø³ÙØ³ÙØ© ÙØµÙØ© Ù
+Ø®Ø²ÙØ© ÙØ¹ÙÙØ§Ù. ØªØ³ØªØ®Ø¯Ù
+ Ø¹ÙÙ Ø³ØšÙÙ Ø§ÙÙ
+Ø«Ø§ÙØ ØšÙØ§Ø³Ø·Ø©  PSPlug ÙØ¥Ø²Ø§Ø­Ø© "ØµÙØ­Ø© 1"
+
+UnknownPlugin.assoc_field:Ø§Ø³Ù
+ Ø­ÙÙ Ù
+ÙØªØ§Ø¯Ø§ØªØ§ Ø§ÙØ°Ù Ø³ÙØ­Ù
+Ù Ø§Ø³Ù
+ Ø§ÙÙ
+ÙÙØ§Øª Ø§ÙÙ
+Ø±ØªØšØ·Ø©.  
+
+UnknownPlugin.desc:ÙØ°Ø§ Ù
+ÙØ§ØšØ³ ØšØ³ÙØ· ÙØ¥Ø³ØªÙØ±Ø§Ø¯ Ù
+ÙÙØ§Øª ÙÙ ÙÙØŠØ§Øª ÙØ§ ÙØ¹Ø±Ù ÙØ±ÙÙØ³ØªÙÙ Ø¹ÙÙØ§ ØŽÙØŠØ§..  ÙØªÙ
+ Ø¥ÙØŽØ§Ø¡ ÙØ«ÙÙØ© Ø®ÙØ§ÙÙØ© ÙÙÙ Ù
+ÙÙØ Ù Ø³ÙÙ ÙØªÙ
+ ØªÙ
+Ø±ÙØ± Ø§ÙÙ
+ÙÙ Ø§ÙÙ ÙØ±ÙÙØ³ØªÙÙ ÙÙ  \"associated file\" ÙÙÙØ«ÙÙØ©.  
+
+UnknownPlugin.file_format:ÙÙØ¹ Ø§ÙÙ
+ÙÙ (e.g. MPEG, MIDI, ...)
+
+UnknownPlugin.mime_type:ÙÙØ¹ Ø§ÙÙ
+ÙÙ (Ø¹ÙÙ Ø³ØšÙÙ Ø§ÙÙ
+Ø«Ø§Ù image/gif).  
+
+UnknownPlugin.process_extension:Ù
+Ø¹Ø§ÙØ¬Ø© Ù
+ÙÙØ§Øª ØšÙÙØ³ Ø§Ù
+ØªØ¯Ø§Ø¯ ÙØ°Ø§ Ø§ÙÙ
+ÙÙ . ÙØ°Ø§ Ø§ÙØ®ÙØ§Ø± ÙØ¹ØªØšØ± ØšØ¯ÙÙØ§ ÙÙ  process_exp Ø§ÙØ°Ù ÙÙ Ø§Ø³ÙÙ Ø¹ÙØ¯Ø§ÙØ¥Ø³ØªØ®Ø¯Ø§Ù
+ Ù ÙÙÙ Ø£ÙÙ Ù
+Ø±ÙÙØ©.  
+
+UnknownPlugin.srcicon:Ø­Ø¯Ø¯ Ø§Ø³Ù
+ Ù
+Ø§ÙØ±Ù (ØšØ¯ÙÙ ØŽØ±Ø·Ø© Ø³ÙÙÙØ©) ÙØªØ³ØªØ®Ø¯Ù
+ÙØ§ Ù
+Ø¹ Ø§ÙÙ
+ÙØªØ§Ø¯Ø§ØªØ§ Ø§ÙÙ
+Ø­Ø¯Ø¯Ø©.  
+
+WordPlugin.desc:Ù
+ÙØ§ØšØ³ ÙØ¥Ø³ØªÙØ±Ø§Ø¯ Ù
+ÙÙØ§Øª .DOC.  
+
+WordPlugin.windows_scripting:Ø§Ø³ØªØ®Ø¯Ù
+  MicroSoft Windows scripting technology (Visual
+
+WordPlugin.metadata_fields:ÙØ§Ø³ØªØ±Ø¬Ø§Ø¹ Ø§ÙÙ
+ÙØªØ§Ø¯Ø§ØªØ§ Ù
+Ù ÙØ«ÙÙØ© HTML Ù
+Ø­ÙÙØ© ØšØšØ±ÙØ§Ù
+Ø¬ VB scripting. ØªØ³Ù
+Ø­ ÙÙÙ
+Ø³ØªØ®Ø¯Ù
+ ØšØªØ¹Ø±ÙÙ ÙØ§ØŠÙ
+Ø© Ø­ÙÙÙ Ø§ÙÙ
+ÙØªØ§Ø¯Ø§ØªØ§ Ø§ÙÙ
+ÙØµÙÙØ© ØšÙØ§ØµÙØ© ÙÙ
+Ø­Ø§ÙÙØ© Ø§Ø³ØªØ®ÙØ§ØµÙØ§. Ø§Ø³ØªØ®Ø¯Ù
+ 'tag<tagname>' ÙÙÙ
+Ø­ØªÙÙ Ø§ÙØ®Ø§Øµ ØšØ£ÙÙ <tagname>.  
+
+ZIPPlugin.desc:Ø§ÙØšØ±ÙØ§Ù
+Ø¬ Ø§ÙØ°Ù ÙØªØ¹Ø§Ù
+Ù Ù
+Ø¹ Ø§ÙÙ
+Ø¯Ø®ÙØ§Øª Ø§ÙÙ
+Ø¶ØºÙØ·Ø© Ø£Ù Ø§ÙÙ
+Ø€Ø±ØŽÙØ© ÙÙÙÙ
+ Ø­Ø§ÙÙØ§ ØšØ§ÙØªØ¹Ø§Ù
+Ù Ù
+Ø¹ Ø§ÙØ§Ù
+ØªØ¯Ø§Ø¯Ø§Øª :\ngzip (.gz, .z, .tgz, .taz)\nbzip (.bz)\nbzip2 (.bz2)\nzip (.zip .jar)\ntar (.tar)\n\n ÙÙØ°Ø§ Ø§ÙØšØ±ÙØ§Ù
+Ø¬ ÙØ¹ØªÙ
+Ø¯ Ø¹ÙÙ Ø§ÙÙ
+Ø±Ø§ÙÙ Ø§ÙØªØ§ÙÙØ© (ÙÙ Ø­Ø§ÙØ© Ù
+Ø­Ø§ÙÙØ© ØªØŽØºÙÙ ÙØžØ§Ù
+ Ø§ÙØ±Ø¯): \ngunzip (ÙÙgzip)\nbunzip (ÙÙbzip)\nbunzip2 \nunzip (ÙÙzip)\ntar (ÙÙtar)  
+
+#
+# Download module option descriptions
+#
+
+BaseDownload.desc:Ø§ÙÙØŠØ© Ø§ÙØ£Ø³Ø§Ø³ÙØ© ÙÙÙ
+Ø§Ø°Ø¬ Ø§ÙØªÙØ²ÙÙ
+BaseDownload.bad_general_option:ÙØ­Ø¯Ø©Ø§ÙØªÙØ²ÙÙ Ùª ØªØ³ØªØ®Ø¯Ù
+  Ø®ÙØ§Ø± ØºÙØ± ØµØ­ÙØ­.  
+MediaWikiDownload.desc:ØšØ±Ø§ÙØ§Ù
+Ø¬ ÙØ±Ø¹Ù ÙÙØªØ­Ù
+ÙÙ Ù
+Ù Ù
+ÙØ§ÙØ¹ MediaWiki  
+MediaWikiDownload.reject_filetype:ØªØ¬Ø§ÙÙ ÙØ§ØŠÙ
+Ø© urlØ Ø§ÙØµÙ ØšÙØ§ØµÙØ© (Ø)Ø Ø¹ÙÙ Ø³ØšÙÙ Ø§ÙÙ
+Ø«Ø§Ù: *cgi-bin*,*.ppt ØªØ¹ÙÙ ØªØ¬Ø§ÙÙ Ø§ÙØ±ÙØ§ØšØ· Ø§ÙØªÙ ØªØ­ØªÙÙ Ø¹ÙÙ ÙÙ Ù
+Ù 'cgi-bin' Ø£Ù '.ppt'.  
+MediaWikiDownload.reject_filetype_disp:ØªØ¬Ø§ÙÙ Ø§ÙÙ
+Ø§Ø· Ø¹ÙØ§ÙÙÙ Ø§ÙÙ
+ÙØ§Ø±Ø¯ Ø§ÙÙ
+ÙØ­Ø¯Ø©.  
+MediaWikiDownload.exclude_directories:ÙØ§ØŠÙ
+Ø© Ø§ÙØ£Ø¯ÙØ© Ø§ÙÙ
+Ø³ØªØšØ¹Ø¯Ø©(Ù
+Ø³Ø§Ø±Ø§Øª ÙØ£Ø¯ÙØ© Ù
+ÙØªÙÙØ©)Ø Ø¹ÙÙ Ø³ØšÙÙ Ø§ÙÙ
+Ø«Ø§Ù: /peopleÙ /documentation Ø³ÙÙ ØªØ³ØªØšØ¹Ø¯ ÙÙ Ù
+Ù Ø§ÙØ£Ø¯ÙØ© 'people'Ù 'documentation' ØªØ­Øª Ø§ÙÙ
+ÙÙØ¹ Ø§ÙØ­Ø§ÙÙ.  
+MediaWikiDownload.exclude_directories_disp:Ø¥Ø³ØªØšØ¹Ø§Ø¯ Ø£Ø¯ÙØ©  
+
+OAIDownload.desc:ÙÙ
+ÙØ°Ø¬ Ø§ÙØªÙØ²ÙÙ Ù
+Ù Ù
+Ø³ØªÙØ¯Ø¹Ø§Øª Ù
+ØšØ§Ø¯Ø±Ø© Ø§ÙØ£Ø±ØŽÙÙ Ø§ÙÙ
+ÙØªÙØ­
+OAIDownload.url_disp:Ù
+ØµØ¯Ø± Ø¹ÙÙØ§Ù Ø§ÙÙ
+ÙØ§Ø±Ø¯ Ø§ÙÙ
+ÙØ­Ø¯
+OAIDownload.url:Ù
+Ø³ØªÙØ¯Ø¹ Ø¹ÙÙØ§Ù Ø§ÙÙ
+ØµØ§Ø¯Ø± Ø§ÙÙ
+ÙØ­Ø¯ ÙÙ
+ØšØ§Ø¯Ø±Ø© Ø§ÙØ£Ø±ØŽÙÙ Ø§ÙÙ
+ÙØªÙØ­
+OAIDownload.set_disp:Ù
+ÙÙØ¯ ÙÙ
+Ø¹ÙØ§Ø±  
+OAIDownload.set:ØªÙÙÙØ¯ Ø§ÙØªÙØ²ÙÙ ÙÙÙØ§ ÙÙÙ
+Ø¹ÙØ§Ø± Ø§ÙÙ
+Ø­Ø¯Ø¯ ÙÙ Ø§ÙÙ
+Ø³ØªÙØ¯Ø¹
+OAIDownload.metadata_prefix_disp:ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª Ø§ÙØšØ§Ø¯ØŠØ©  
+OAIDownload.metadata_prefix:ØŽÙÙ ÙØ§ØµÙØ§Øª Ø§ÙØšÙØ§ÙØ§Øª Ø§ÙÙ
+Ø³ØªØ®Ø¯Ù
+ ÙÙ Ø§ÙÙ
+ØµØ¯Ø±  Ø Ù
+Ø«Ù oai_dc Ø qdc Ø Ø§Ø¶ØºØ· Ø¹ÙÙ Ø§ÙØ²Ø±Ø§ <Ù
+Ø¹ÙÙÙ
+Ø§Øª Ø§ÙÙ
+Ø²ÙØ¯>  ÙÙ
+Ø¹Ø±ÙØ© Ù
+Ø§ ÙÙ Ø§ÙØ£ØŽÙØ§Ù Ø§ÙÙ
+Ø¯Ø¹ÙÙ
+Ø©.  
+OAIDownload.get_doc_disp:Ø£ÙØ¬Ø¯ ÙØ«ÙÙØ©
+OAIDownload.get_doc:ØªÙØ²ÙÙ Ù
+ØµØ¯Ø± Ø§ÙÙØ«ÙÙØ© Ø¥Ø°Ø§ ØªÙ
+ ØªØ­Ø¯ÙØ¯ ÙØ§Ø­Ø¯Ø© ÙÙ Ø§ÙØªØ³Ø¬ÙÙØ©
+OAIDownload.get_doc_exts_disp:ÙÙØ· ØªØŽÙ
+Ù Ø£ÙÙØ§Ø¹ Ø§ÙÙ
+ÙÙØ§Øª  
+OAIDownload.get_doc_exts:Ø¥Ù
+ØªØ¯Ø§Ø¯Ø§Øª Ø§Ø³Ù
+ Ø§ÙÙ
+ÙÙ Ø§ÙÙ
+Ø³Ù
+ÙØ­ ÙÙØ«Ø§ØŠÙ ÙÙØ­ØµÙÙ .  
+OAIDownload.max_records_disp:Ø¹Ø¯Ø¯ Ø§ÙØªØ³Ø¬ÙÙØ§Øª Ø§ÙØ£ÙØµÙ
+OAIDownload.max_records:Ø¹Ø¯Ø¯ Ø§ÙØªØ³Ø¬ÙÙØ§Øª Ø§ÙØ£ÙØµÙ ÙÙØªÙØ²ÙÙ
+
+SRWDownload.desc:ÙÙ
+ÙØ°Ø¬ ÙÙØªÙØ²ÙÙ Ù
+Ù Ù
+Ø³ØªÙØ¯Ø¹Ø§Øª  SRW (ØšØ­Ø«/Ø¥Ø³ØªØ±Ø¬Ø§Ø¹ Ø®Ø¯Ù
+Ø§Øª Ø§ÙÙØš)
+
+WebDownload.desc:ÙÙ
+ÙØ°Ø¬ ÙÙØªÙØ²ÙÙ Ù
+Ù Ø§ÙØ¥ÙØªØ±ÙØª Ø¹ØšØ± ØšØ±ÙØªÙÙÙÙ ÙÙÙ Ø§ÙÙØµ Ø§ÙØªØŽØ¹ØšÙ Ø£Ù ØšØ±ÙØªÙÙÙÙ ÙÙÙ Ø§ÙØšÙØ§ÙØ§Øª
+WebDownload.url:Ù
+ØµØ¯Ø± Ø¹ÙÙØ§Ù Ø§ÙÙ
+ÙØ§Ø±Ø¯ Ø§ÙÙ
+ÙØ­Ø¯.ÙÙ Ø­Ø§ÙØ© Ø¥Ø¹Ø§Ø¯Ø© ØªÙØ¬ÙÙ http Ø Ø±ØšÙ
+Ø§ ØªØªØºÙØ± ÙØ°Ù Ø§ÙÙÙÙ
+Ø©.  
+WebDownload.url_disp:Ù
+ØµØ¯Ø± Ø¹ÙÙØ§Ù Ø§ÙÙ
+ÙØ§Ø±Ø¯ Ø§ÙÙ
+ÙØ­Ø¯
+WebDownload.depth:ÙÙ
+ ÙÙ Ø¹Ù
+Ù Ø§ÙØ¥Ø±ØªØšØ§Ø· Ø§ÙØªØŽØ¹ØšÙ Ø¹ÙØ¯ Ø§ÙØªØªÙØ²ÙÙ
+WebDownload.depth_disp:Ø¹Ù
+Ù Ø§ÙØªÙØ²ÙÙ
+WebDownload.below:Ø§ÙÙ
+ÙÙØ§Øª Ø§ÙÙ
+ØªØ·Ø§ØšÙØ© ÙÙØ· ØªØ­Øª Ø¹ÙÙØ§Ù Ø§ÙÙ
+ØµØ§Ø¯Ø± Ø§ÙÙ
+ÙØ­Ø¯
+WebDownload.below_disp:ÙÙØ· Ø§ÙÙ
+ÙÙØ§Øª ØªØ­Øª Ø¹ÙÙØ§Ù Ø§ÙÙ
+ØµØ§Ø¯Ø± Ø§ÙÙ
+ÙØ­Ø¯  
+WebDownload.within:Ø§ÙÙ
+ÙÙØ§Øª Ø§ÙÙ
+ØªØ·Ø§ØšÙØ© Ø¶Ù
+Ù ÙØ°Ø§ Ø§ÙÙ
+ÙÙØ¹
+WebDownload.within_disp:Ø§ÙÙ
+ÙÙØ§Øª Ø¶Ù
+Ù ÙØ°Ø§ Ø§ÙÙ
+ÙÙØ¹ ÙÙØ·.  
+WebDownload.html_only:ØªØ­Ù
+ÙÙ Ù
+ÙÙØ§Øª ÙØºØ© ØªØ±Ù
+ÙØ² Ø§ÙÙØµÙØµ Ø§ÙØªØŽØ¹ØšÙØ© ÙÙØ· ØÙ ØªØ¬Ø§ÙÙ Ø§ÙÙ
+ÙÙØ§Øª Ø§ÙÙ
+ØªØ¹ÙÙØ© ØšÙØ§ Ù
+Ø«Ù Ø§ÙØµÙØ± Ù Ø§ÙØ¥Ø³ØªØ§ÙÙ ØŽÙØª
+WebDownload.html_only_disp:ÙÙØ· Ù
+ÙÙØ§Øª HTML  
+
+WgetDownload.desc:Ø§ÙÙØŠØ© Ø§ÙØ£Ø³Ø§Ø³ Ø§ÙØªÙ ØªØªÙØ§ÙÙ Ø§ÙØ¥Ø³ØªØ¯Ø¹Ø§Ø¡ Ø§ÙÙ wget  
+WgetDownload.proxy_on:ØšØ±ÙÙØ³Ù ÙØŽØ·
+WgetDownload.proxy_host:Ù
+Ø¶ÙÙ Ø§ÙØšØ±ÙÙØ³Ù
+WgetDownload.proxy_port:Ù
+ÙÙØ° Ø§ÙØšØ±ÙÙØ³Ù
+WgetDownload.user_name:Ø¥Ø³Ù
+ Ø§ÙÙ
+Ø³ØªØ®Ø¯Ù
+
+WgetDownload.user_password:ÙÙÙ
+Ø© Ù
+Ø±ÙØ± Ø§ÙÙ
+Ø³ØªØ®Ø¯Ù
+
+
+Z3950Download.desc:ÙÙ
+ÙØ°Ø¬ Ø§ÙØªÙØ²ÙÙ Ù
+Ù Ù
+Ø³ØªÙØ¯Ø¹Ø§Øª  Z3950
+Z3950Download.host:Ù
+Ø¶ÙÙ Ø¹ÙÙØ§Ù Ø§ÙÙ
+ÙØ§Ø±Ø¯ Ø§ÙÙ
+ÙØ­Ø¯
+Z3950Download.host_disp:Ù
+Ø¶ÙÙ
+Z3950Download.port:Ø±ÙÙ
+ Ù
+ÙÙØ° Ø§ÙÙ
+Ø³ØªÙØ¯Ø¹
+Z3950Download.port_disp:Ù
+ÙÙØ°
+Z3950Download.database:ØšØ­Ø« Ø§ÙØªØ³Ø¬ÙÙØ§Øª ÙÙ ÙØ§Ø¹Ø¯Ø© ØšÙØ§ÙØ§Øª
+Z3950Download.database_disp:ÙØ§Ø¹Ø¯Ø© ØšÙØ§ÙØ§Øª
+Z3950Download.find:Ø¥Ø³ØªØ±Ø¬Ø§Ø¹ Ø§ÙØªØ³Ø¬ÙÙØ§Øª Ø§ÙÙ
+ØªØ¶Ù
+ÙØ© Ù
+ØµØ·ÙØ­Ø§Øª ØšØ­Ø« Ù
+Ø­Ø¯Ø¯Ø©
+Z3950Download.find_disp:Ø£ÙØ¬Ø¯
+Z3950Download.max_records:Ø§ÙØ¹Ø¯Ø¯ Ø§ÙØ§ÙØµÙ ÙÙØªØ³Ø¬ÙÙØ§Øª ÙÙØªÙØ²ÙÙ
+Z3950Download.max_records_disp:Ø¹Ø¯Ø¯ Ø§ÙØªØ³Ø¬ÙÙØ§Øª Ø§ÙØ§ÙØµÙ
+
+
+#
+#Plugout option descriptions
+#
+
+BasPlugout.bad_general_option:%s plugout ØªØ³ØªØ®Ø¯Ù
+ Ø®ÙØ§Ø± ØºÙØ± ØµØ­ÙØ­.  
+BasPlugout.debug:Ø¥Ø¹Ø¯Ø§Ø¯ Ø³ÙØ§Ù ØªØµØ­ÙØ­ Ø§ÙØ£Ø®Ø·Ø§Ø¡  
+BasPlugout.desc:Ø§ÙÙ
+ØµÙÙ Ø§ÙØ£Ø³Ø§Ø³ ÙÙÙ Ù
+Ø®Ø±Ø¬Ø§Øª Ø§ÙÙ
+ÙØ§ØšØ³.  
+BasPlugout.group_size:Ø¹Ø¯Ø¯ Ø§ÙÙØ«Ø§ØŠÙ Ø§ÙÙ
+Ø¬Ù
+Ø¹Ø© ÙÙ Ù
+ÙÙ XML ÙØ§Ø­Ø¯.  
+BasPlugout.gzip_output:Ø£Ø³ØªØ®Ø¯Ù
+ gzip ÙØ¶ØºØ· ÙØ«Ø§ØŠÙ xml Ø§ÙÙØ§ØªØ¬Ø© ( ÙØ§ ØªÙØ³Ù Ø§Ù ØªØ¶Ù
+Ù Ø§ÙÙ
+ÙØ§ØšØ³ ZIPPlug ÙÙ ÙØ§ØŠÙ
+Ø© Ø§ÙÙ
+ÙØ§ØšØ³  Ø¹ÙØ¯ ØšÙØ§Ø¡ Ø§ÙÙØ«Ø§ØŠÙ
+BasPlugout.output_handle:ÙØ§ØµÙØ© Ø§ÙÙ
+ÙÙ ØªØ³ØªØ®Ø¯Ù
+ ÙØ¥Ø±Ø³Ø§Ù Ø§ÙÙ
+Ø¹ÙÙÙ
+Ø§Øª Ø§ÙÙ
+Ø®Ø±Ø¬Ø©  
+BasPlugout.output_info:Ø§ÙØ¥ØŽØ§Ø±Ø© ÙÙÙØ§Ù Ø§ÙÙ
+Ø¹ÙÙÙ
+Ø§Øª Ø§ÙØ£Ø±ØŽÙÙÙ Ø§ÙØ°Ù Ø³ØªØ®Ø¯Ù
+ ÙØ­ÙØž Ø§ÙÙ
+Ø¹ÙÙÙ
+Ø§Øª Ø­ÙÙ Ø§ÙØ£Ø±ØŽÙÙØ§Øª.  
+BasPlugout.verbosity:Ø¶ØšØ· ÙÙ
+ÙØ© Ø§ÙÙ
+Ø®Ø±Ø¬t. 0=ÙØ§ØŽÙØ¡, 3=ÙØ«ÙØ±.
+BasPlugout.xslt_file:ØªØ­ÙÙÙ ÙØ«ÙÙØ© Ø¹Ù Ø·Ø±ÙÙ XSLT ÙÙ Ø§ÙÙ
+ÙÙ Ø§ÙÙ
+Ø³Ù
+Ù.  
+
+DSpacePlugout.desc::DSpace ÙÙØŠØ© Ø£Ø±ØŽÙÙ.
+
+FedoraMETSPlugout.desc:ØŽÙÙ METS ØšØ§Ø³ØªØ®Ø¯Ø§Ù
+ Ø³Ù
+Ø§Øª ÙÙØ¯ÙØ±Ø§ .  
+FedoraMETSPlugout.fedora_namespace:Ø§ÙØšØ§Ø¯ØŠØ© Ø§ÙÙ
+Ø³ØªØ®Ø¯Ù
+Ø© ÙÙ ÙÙØ¯ÙØ±Ø§ ÙÙ
+Ø¹Ø§ÙØ¬Ø© ids (PIDS) Ø¹ÙÙ Ø³ØšÙÙ Ø§ÙÙ
+Ø«Ø§Ù greenstone:HASH0122efe4a2c58d0  
+
+GreenstoneXMLPlugout.desc:ØŽÙÙ Ø§Ø±ØŽÙÙ Ø¬Ø±ÙÙØ³ØªÙÙ XML .  
+
+GreenstoneMETSPlugout.desc:ØŽÙÙ METS ØšØ§Ø³ØªØ®Ø¯Ø§Ù
+ Ø³Ù
+Ø§Øª Ø¬Ø±ÙÙØ³ØªÙÙ .  
+
+MARCXMLPlugout.desc:MARC xml ØŽÙÙ.  
+MARCXMLPlugout.group:Ø¥Ø®Ø±Ø§Ø¬ ØªØ³Ø¬ÙÙØ§Øª marc xml ÙÙ Ù
+ÙÙ ÙØ§Ø­Ø¯.  
+MARCXMLPlugout.mapping_file:Ø§Ø³ØªØ®Ø¯Ù
+ Ù
+ÙÙ Ø§ÙØªØ®Ø·ÙØ· Ø§ÙÙ
+Ø³Ù
+Ù ÙÙØªØ­ÙÙÙ.  
+
+METSPlugout.desc:METS ØšØ§Ø³ØªØ®Ø¯Ø§Ù
+ Ø®ØµØ§ØŠØµ Greenstone  
+METSPlugout.xslt_txt:Ø­ÙÙ Ù
+ÙÙ METS Ø§ÙØ®Ø§ØµØ© ØšÙ doctxt.xml Ù
+Ø¹ Ø§ÙÙ XSLT ÙÙ Ø§ÙÙ
+ÙÙ Ø§ÙÙ
+Ø³Ù
+Ù.  
+METSPlugout.xslt_mets:Ø­ÙÙ Ù
+ÙÙ METS Ø§ÙØ®Ø§ØµØ© ØšÙ doctxt.xml Ù
+Ø¹ Ø§ÙÙ XSLT ÙÙ Ø§ÙÙ
+ÙÙ Ø§ÙÙ
+Ø³Ù
+Ù.  
+
+#
+# Perl module strings
+#
+
+classify.could_not_find_classifier:Ø®Ø·Ø£: ÙÙ
+ ÙØªÙ
+ Ø§ÙØ¹Ø«ÙØ± Ø¹ÙÙ Ø§ÙÙ
+ØµÙÙ \"%s\"
+
+download.could_not_find_download:Ø®Ø·Ø£: ÙÙ
+ ÙØªÙ
+ Ø§ÙØ¹Ø«ÙØ± Ø¹ÙÙ ÙÙ
+ÙØ°Ø¬ Ø§ÙØªÙØ²ÙÙ \"%s\"
+
+plugin.could_not_find_plugin:Ø®Ø·Ø£: ÙÙ
+ ÙØªÙ
+ Ø§ÙØ¹Ø«ÙØ± Ø¹ÙÙ Ø§ÙÙ
+ÙØ§ØšØ³ \"%s\"
+
+plugin.including_archive:ÙØªØ¶Ù
+Ù Ù
+Ø­ØªÙÙØ§Øª Ø§ÙØ£Ø±ØŽÙÙ Ù 1 ZIP/TAR
+
+plugin.including_archives:ÙØªØ¶Ù
+Ù Ù
+Ø­ØªÙÙØ§Øª Ø§ÙØ£Ø±ØŽÙÙ Ù %d ZIP/TAR
+
+plugin.kill_file:ØªÙ
+ Ø¥ØšØ·Ø§Ù Ø§ÙØ¥Ø¬Ø±Ø§Ø¡ ØšÙØ§Ø³Ø·Ø© Ù
+ÙÙ Ø§ÙØ¥ØšØ·Ø§Ù
+
+plugin.n_considered:%d ÙØ«Ø§ØŠÙ ØªÙ
+ Ø§Ø¹ØªØšØ§Ø±ÙØ§ ÙÙÙ
+Ø¹Ø§ÙØ¬Ø©
+
+plugin.n_included:%d ØªÙ
+Øª Ù
+Ø¹Ø§ÙØ¬ØªÙØ§ Ù ØªØ¶Ù
+ÙÙÙØ§ Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø©
+
+plugin.n_rejected:%d ØªÙ
+ Ø±ÙØ¶ÙØ§
+
+plugin.n_unrecognised:%d ÙÙ
+ ÙØªÙ
+ Ø§ÙØªØ¹Ø±Ù Ø¹ÙÙÙØ§
+
+plugin.no_plugin_could_process:ØªØ­Ø°ÙØ±: ÙØ§ ÙÙØ¬Ø¯ Ù
+ÙØ§ØšØ³ ÙÙ
+Ø¹Ø§ÙØ¬Ø© %s
+
+plugin.no_plugin_could_recognise:ØªØ­Ø°ÙØ±: ÙÙ
+ ÙØªØ¹Ø±Ù Ø§Ù Ù
+ÙØ§ØšØ³ Ø¹ÙÙ %s
+
+plugin.no_plugin_could_process_this_file:ÙØ§ ÙÙØ¬Ø¯ Ù
+ÙØ§ØšØ³ ÙÙ
+Ø¹Ø§ÙØ¬Ø© ÙØ°Ø§ Ø§ÙÙ
+ÙÙ
+
+plugin.no_plugin_could_recognise_this_file:ÙÙ
+ ÙØªØ¹Ø±Ù Ø§Ù Ù
+ÙØ§ØšØ³ Ø¹ÙÙ ÙØ°Ø§ Ø§ÙÙ
+ÙÙ
+
+plugin.one_considered:1 ÙØ«ÙÙØ© ØªÙ
+ Ø§Ø¹ØªØšØ§Ø±ÙØ§ ÙÙÙ
+Ø¹Ø§ÙØ¬Ø©
+
+plugin.one_included:1 ØªÙ
+Øª Ù
+Ø¹Ø§ÙØ¬ØªÙØ§ Ù ØªØ¶Ù
+ÙÙÙØ§ Ø§ÙÙ
+Ø¬Ù
+ÙØ¹Ø©
+
+plugin.one_rejected:1 ØªÙ
+ Ø±ÙØ¶ÙØ§
+
+plugin.one_unrecognised:1 ÙÙ
+ ÙØªÙ
+ Ø§ÙØªØ¹Ø±Ù Ø¹ÙÙÙØ§
+
+plugin.see_faillog:Ø£ÙØžØ±  %s ÙÙØ§ØŠÙ
+Ø© Ø§ÙÙØ«Ø§ØŠÙ Ø§ÙØªÙ ÙÙ
+ ÙØªÙ
+ Ø§ÙØªØ¹Ø±Ù Ø¹ÙÙÙØ§ Ù/ Ø§ÙÙØ«Ø§ØŠÙ Ø§ÙÙ
+Ø±ÙÙØ¶Ø© documents
+
+PrintUsage.default:Ø¥ÙØªØ±Ø§Ø¶Ù
+
+PrintUsage.required:Ù
+Ø·ÙÙØš
+
+plugout.could_not_find_plugout:Ø®Ø·Ø£: ÙÙ
+ ÙØªÙ
+ Ø§ÙØ¹Ø«ÙØ± Ø¹ÙÙ plugout \"%s\"  
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/strings_es.properties
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/strings_es.properties	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/strings_es.properties	(revision 24799)
@@ -0,0 +1,1367 @@
+#
+# Resource bundle description
+#
+
+Language.code:es
+Language.name:EspaÃ±ol
+
+OutputEncoding.unix:iso_8859_1
+OutputEncoding.windows:iso_8859_1
+
+
+#
+# Common output messages and strings
+#
+
+common.cannot_create_file:ERROR: no puede crear archivo %s
+
+common.cannot_find_cfg_file:ERROR: no puede encontrar el archivo de configuraciÃ³n %s
+
+common.cannot_open:ERROR: no puede abrir %s
+
+common.cannot_open_fail_log:ERROR: no puede abrir el fail log %s
+
+common.cannot_open_output_file:ERROR: no se puede abrir el fichero salida %s
+
+common.cannot_read:ERROR: no puede leer %s
+
+common.cannot_read_file:ERROR: no puede leer el archivo %s
+
+common.general_options:las opciones generales (para % s)
+
+common.must_be_implemented:La funciÃ³n de BasPlug::read deberÃ¡ ser implementada en la subclase para los plugins recursivos
+
+common.options:opciones
+
+common.processing:procesando
+
+common.specific_options:opciones especÃ­ficas
+
+common.usage:uso
+
+common.info:informaciÃ³n
+
+common.invalid_options:Argumentos invÃ¡lidos: %s
+
+common.true:verdadero
+
+common.false:falso
+
+common.deprecated:SUSTITUIDO
+#
+# Script option descriptions and output messages
+#
+
+scripts.language:El idioma para desplegar las descripciones de la opciÃ³n en ('en_US' especifica inglÃ©s americano). Requiere las traducciones de las descripciones de la opciÃ³n existente en el archivo de perllib/strings_language-code.rb.
+
+scripts.xml:Produce la informaciÃ³n en un formato XML, sin comentarios 'elegantes' pero con mucho mÃ¡s detalle.
+
+scripts.listall:Listar todos los Ã­tems conocidos.
+
+scripts.describeall:Mostrar opciones para todos los elementos conocidos
+
+scripts.both_old_options:ATENCIÃN: Se especificÃ³ -removeold con -keepold o -incremental, se usarÃ¡ -removeold. Los contenidos actuales del directorio %s se borrarÃ¡n.
+
+scripts.no_old_options:ATENCIÃN: Si no se especificaron -removeol, -keepold o -incremental, se establece -removeold. Se borrarÃ¡n todos los contenidos del directorio %s.
+
+scripts.gli:Una opciÃ³n asignada cuando se ejecuta este script desde el GLI que permite una salida especÃ­fica para el gli.
+scripts.gai:Una marca puesta cuando se ejecuta este script desde "gai" (Greenstone Adinistration Tool), habilita una salida especÃ­fica para gai.  
+
+scripts.verbosity:Controla la cantidad de salida: 0=nada, 3=mucha.  
+scripts.out:Nombre de archivo o consola en la cual mostrar los mensajes de salida.  
+
+# -- buildcol.pl --
+
+buildcol.archivedir:LocalizaciÃ³n de los archivos.
+
+buildcol.builddir:DÃ³nde poner los Ã­ndices construidos.
+
+buildcol.cachedir:La colecciÃ³n se construirÃ¡ aquÃ­ temporalmente antes de copiarse al directorio construido.
+
+buildcol.cannot_open_cfg_file:ADVERTENCIA: no puede abrir los archivos config a efecto de poner al dÃ­a: %s
+
+buildcol.collectdir:Ruta al directorio "collect".
+
+buildcol.copying_back_cached_build:Copiando la figura anteriormente construida
+
+buildcol.create_images:Intente crear las imÃ¡genes predefinidas para la nueva colecciÃ³n. Esto confÃ­a en el Gimp instalÃ¡ndose a lo largo con los mÃ³dulos perl pertinentes que permitan el scripting del perl.
+
+buildcol.debug:Imprima el output a STDOUT.
+
+buildcol.desc:Script PERL usado para construir una colecciÃ³n Greenstone desde documentos GA.
+
+buildcol.faillog:Fallo en el fichero de control. Este fichero contiene el de cualquier fichero que haya fallado al ser procesado.
+
+buildcol.incremental_default_builddir:AVISO: el directorio de construcciÃ³n es por defecto "building". Si quiere hacer una indexaciÃ³n incremental, por favor agregue la opciÃ³n "-builddir index" al buildcol.pl.
+
+buildcol.index:Ãndice a construir (construirÃ¡ todos los ficheros en el config si no estÃ¡ determinado).
+
+buildcol.incremental:SÃ³lo indiza documentos que no lo hayan sido previamente. Implica -keepold. Se basa en el indizador Lucene.
+
+buildcol.keepold:No destruirÃ¡ los volÃºmenes actuales del directorio construido.
+
+buildcol.maxdocs:El nÃºmero mÃ¡ximo de documentos para construir.
+buildcol.maxnumeric:NÃºmero mÃ¡ximo de dÃ­gitos que una 'palabra' puede tener en el diccionario de Ã­ndice. Los nÃºmeros largos se dividen en varias palabras para su indizaciÃ³n. Por ej., si maxnumeric es 4, "1342663" se dividirÃ¡ en "1342" y "663"
+buildcol.mode:Las partes del proceso construido para llevar a cabo.
+buildcol.mode.all:Realizar todo.
+buildcol.mode.build_index:Simplemente ponga en un Ã­ndice el texto.
+buildcol.mode.compress_text:Simplemente comprima el texto.
+buildcol.mode.infodb:Simplemente construye la base de datos de metadatos.
+
+buildcol.no_default_images:No se generarÃ¡n las imÃ¡genes predefinidas.
+
+buildcol.no_image_script:ADVIRTIENDO: Imagen que hace la escritura no encontrada: %s
+
+buildcol.no_strip_html:No despoje las etiquetas html del texto puesto en un Ã­ndice (sÃ³lo utilice para las colecciones del mgpp).
+
+buildcol.no_text:No guarde el texto comprimido. Esta opciÃ³n es Ãºtil para minimizar el tamaÃ±o de los Ã­ndices construidos si usted siempre piensa desplegar los documentos originales en momento que estÃ¡ utilizando el programa (es decir usted no podrÃ¡ recuperar la versiÃ³n del texto comprimido).
+
+buildcol.sections_index_document_metadata:Indiza metadatos de nivel de documento a nivel de secciÃ³n.
+buildcol.sections_index_document_metadata.never:No indiza ningÃºn metadato de documento a nivel de secciÃ³n.
+buildcol.sections_index_document_metadata.always:AÃ±ade todos los metadatos a nivel de documento, incluso si existen metadatos a nivel de secciÃ³n con ese nombre.
+buildcol.sections_index_document_metadata.unless_section_metadata_exists:SÃ³lo aÃ±ade metadatos a nivel de documento si no existen metadatos con ese nombre a nivel de secciÃ³n.
+
+buildcol.out:Nombre de fichero o dispositivo para imprimir el estado de la salida.
+
+buildcol.params:[las opciones] collection-name
+
+buildcol.remove_empty_classifications:Ocultar los clasificadores y los nodos de clasificaciÃ³n vacÃ­os (aquellos que no contienen documentos).
+
+buildcol.removeold:BorrarÃ¡ todos los contenidos previos del directorio building.
+
+buildcol.unlinked_col_images:No pueden unirse las imÃ¡genes de la colecciÃ³n de manera correcta.
+
+buildcol.unknown_mode:Modo desconocido: %s
+
+buildcol.updating_archive_cache:Actualizando el cachÃ©
+
+buildcol.verbosity:Los mandos la cantidad de rendimiento. El 0=ninguno, 3=muchos.
+
+
+# -- classinfo.pl --
+
+classinfo.collection:Dar un nombre de la colecciÃ³n harÃ¡n que classinfo.pl aparezca primero clasifique en el collect/collection-name/perllib/classify. Si el clasificador no se encuentra allÃ­ buscarÃ¡ en el directorio general perllib/classify.
+
+classinfo.desc:Imprime la informaciÃ³n de las impresiones sobre un clasificador.
+
+classinfo.general_options:Se heredan las opciones generales de las clases paternales del clasificador.
+
+classinfo.info:info
+
+classinfo.no_classifier_name:ERROR: Usted debe proporcionar un nombre del clasificador.
+
+classinfo.option_types:Los clasificadores pueden tomar dos tipos de opciones
+
+classinfo.params:[opciones] nombre-clasificador
+
+classinfo.passing_options:Las opciones pueden pasarse a cualquier clasificador incluyÃ©ndolos en su archivo de configuraciÃ³n collect.cfg.
+
+classinfo.specific_options:Se definen las opciones especÃ­ficas dentro del propio clasificador, y sÃ³lo estÃ¡ disponible a este clasificador particular.
+
+# -- downloadfrom.pl --
+downloadfrom.cache_dir:LocalizaciÃ³n del directorio de cachÃ©
+downloadfrom.desc:Descarga ficheros de un servidor externo
+downloadfrom.download_mode:Tipo de servidor desde el que descargar
+downloadfrom.download_mode.Web:HTTP
+downloadfrom.download_mode.MediaWiki:Sitio web MediaWiki
+downloadfrom.download_mode.OAI:Open Archives Initiative (Iniciativa de Archivos Abiertos).
+downloadfrom.download_mode.z3950:Servidor z3950
+downloadfrom.download_mode.SRW:Servicio web de BÃºsqueda y RecuperaciÃ³n
+downloadfrom.incorrect_mode:El parÃ¡metro modo de descarga es incorrecto
+downloadfrom.info:Ofrece informaciÃ³n sobre el servidor, en preferencia a descargar
+downloadfrom.params:[opciones generales] [opciones especÃ­ficas de descarga]
+
+# -- downloadinfo.pl --
+
+downloadinfo.desc:Ofrece informaciÃ³n sobre el mÃ³dulo de descarga
+downloadinfo.collection:Dar un nombre de colecciÃ³n harÃ¡ que downloadinfo.pl busque en collect/collection-name/perllib/downloaders primero. Si no encuentra el mÃ³dulo aquÃ­, buscarÃ¡ en el directorio general perllib/downloaders
+downloadinfo.params:[opciones] [mÃ³dulo de descarga]
+downloadinfo.general_options:Las opciones generale se heredan de las clases padre de los mÃ³dulos de descarga.
+downloadinfo.specific_options:Las opciones especÃ­ficas se definen dentro del propio mÃ³dulo de descarga, y sÃ³lo estÃ¡n disponibles para este descargador en particular.
+downloadinfo.option_types:Los mÃ³dulos de descarga pueden tomar dos tipos de opciones
+
+# -- explode_metadata_database.pl --
+explode.desc:Explotar una base de datos de metadatos.
+
+explode.collection:El nombre de la colecciÃ³n. Algunos conectores buscan archivos auxiliares en la carpeta de la colecciÃ³n.
+ 
+explode.document_field:El elemento de los metadatos que especifica los nombres de los documentos a obtener e incluir en la colecciÃ³n.
+
+explode.document_prefix:Un prefijo para las ubicaciones de los documentos (para usar con la opciÃ³n document_field).
+
+explode.document_suffix:Un sufijo para las ubicaciones de los documentos (para usar con la opciÃ³n document_field).
+
+explode.encoding:CodificaciÃ³n a utilizar al leer el archivo de la base de datos
+explode.metadata_set:Conjunto de metadatos (espacio de nombres) para exportar todos los metadatos
+explode.plugin:Plugin a utilizar para explotar
+explode.plugin_options:Opciones a pasarle al plugin antes de ejecutarse. Los nombres de opciÃ³n deben comenzar con -. Separar nombres de opciÃ³n y valores con espacios. No puede usarse con -use_collection_plugin_options.
+explode.use_collection_plugin_options:Leer el archivo de configuraciÃ³n de la colecciÃ³n y usar las opciones para el plugin especificado. Requiere la opciÃ³n -collection. No puede usarse junto a la opciÃ³n -plugin_options.
+explode.params:[opciones] nombre de archivo
+explode.records_per_folder:NÃºmero de registros a situar en cada subcarpeta.
+
+# -- replace_srcdoc_with_html.pl --
+srcreplace.desc:Reemplaza el documento origen con el HTML generado cuando se hace una reconstrucciÃ³n
+srcreplace.params:[opciones] nombre de archivo
+srcreplace.plugin:Conector usado paa convertir el documento de origen
+
+# -- exportcol.pl --
+
+exportcol.out:Nombre del archivo o identificador para imprimir el estado de los resultados.
+exportcol.cddir:Nombre del directorio al que se exportan los contenidos del CD.
+exportcol.cdname:El nombre del CD-ROM. Esto es lo que aparecerÃ¡ en el menÃº de inicio una vez que el CD-ROM se haya instalado.
+exportcol.collectdir:La ruta a la carpeta "collect"  
+exportcol.desc:GuiÃ³n PERL usado para exportar una o mÃ¡s colecciones a un CD-ROM para Windows.
+exportcol.noinstall:Crea un CD-ROM en el que se ejecuta directamente la Biblioteca, y no instala nada en el computador.
+exportcol.params:[opciones] nombre de la colecciÃ³n 1 nombre de la colecciÃ³n 2 ...
+exportcol.coll_not_found:El %s de la colecciÃ³n no es vÃ¡lido: la colecciÃ³n no se encontrÃ³ en %s.
+exportcol.coll_dirs_not_found:El %s de la colecciÃ³n no es vÃ¡lido: no se pudo encontrar uno de los siguientes directorios:
+exportcol.fail:exportcol.pl no se pudo ejecutar:
+exportcol.no_valid_colls:Las colecciones especificadas no son vÃ¡lidas y por lo tanto no se pueden exportar.
+exportcol.couldnt_create_dir:No se pudo crear el directorio %s.
+exportcol.couldnt_create_file:No se pudo crear %s.
+exportcol.instructions:Para crear un CD-ROM en Windows que se podrÃ¡ instalar automÃ¡ticamente, grabe el contenido de esta carpeta en un CD-ROM.
+exportcol.non_exist_files:Uno o mÃ¡s de los siguientes archivos y directorios no existe:
+exportcol.success:exportcol.pl se ejecutÃ³ con Ã©xito:
+exportcol.output_dir:Las colecciones que se exportaron (%s) se encuentran en %s
+exportcol.export_coll_not_installed:La funcionalidad de 'Exportar a un CD-ROM' no ha estado instalada.
+
+# -- import.pl --
+
+import.archivedir:Lugar donde los materiales convertidos finalizan.
+
+import.manifest:Fichero XML que indica que ficheros deben importarse. Usado en lugar de explorar en descendente la carpeta de importaciÃ³n, normalmente para construcciÃ³n incremental.
+
+import.cannot_open_stats_file:ATENCIÃN: No podrÃ­a abrir el archivo de estadÃ­sticas %s.
+
+import.cannot_open_fail_log:ERROR: No se pudo abrir el registro %s
+
+import.cannot_sort:ADVIRTIENDO: import.pl no puede ordenar los documentos cuando el tamaÃ±o del grupo > 1. la opciÃ³n sortmeta se ignorarÃ¡.
+
+import.collectdir:La ruta al directorio "collect".
+
+import.complete:La importaciÃ³n ha sido completada
+
+import.debug:Imprimir texto importado a STDOUT (para importar GreenstoneXML)
+
+import.desc:Script Perl utilizado para importar los archivos a un formato listo para construir (GreenstoneXML o GreenstoneMETS).
+
+import.faillog:FallÃ³ el nombre del fichero de control. Este fichero recibe los nombres de los ficheros que hayan fallado al ser procesados.
+
+import.groupsize:El nÃºmero de documentos importados que se agrupan en un archivo de XML.
+
+import.gzip:Use el gzip para comprimir los documentos xml resultantes (no se olvide de incluir ZIPPlugin en su lista de conectores al construir con documentos comprimidos).
+
+import.importdir:Donde el material original reside.
+
+import.incremental:SÃ³lo importa documentos mÃ¡s recientes (por fecha) que los existentes en los archivos. Implica -keepold.
+
+import.keepold:No borrarÃ¡ los contenidos actuales del directorio archives.
+
+import.maxdocs:El nÃºmero mÃ¡ximo de documentos para importar.
+
+import.no_import_dir:Error: directorio de importaciÃ³n (%s) no encontrado.
+
+import.no_plugins_loaded:ERROR: NingÃºn plugins ha sido cargado.
+
+import.OIDtype:El mÃ©todo a utilizar al generar los Ãºnicos identificadores para cada documento.
+import.OIDtype.hash:Codifica los contenidos del fichero. Los identificadores del documento serÃ¡n los mismos cada vez que la colecciÃ³n sea importada.
+
+import.OIDtype.incremental:Usa un simple conteo de documentos. Significativamente mÃ¡s rÃ¡pido que "hash". pero no necesariamente asignarÃ¡ el mismo identificador al mismo documento si la colecciÃ³n fuera reimportada.  
+
+import.OIDtype.assigned:Usa el valor del elemento de metadato indicado por la opciÃ³n OIDmetadata (precedido por 'D'); si no se especifica, se usa un hash para un documento particular. Estos identificadores deben ser Ãºnicos.
+
+import.OIDtype.dirname:Usa el nombre del directorio padre. (precedido de 'J') SÃ³lo deberÃ­a haber un documento por directorio, y todos los nombres de directorio deberÃ­an ser Ãºnicos. Ej.:  import/b13as/h15ef/page.html producirÃ¡ Jh15ef como identificador.
+
+import.OIDmetadata:Especifica el elemento de metadato que contiene el identificador Ãºnico de documento, se usa con -OIDtype=assigned, .
+
+import.saveas:Establece el fomato de archivo a generar.
+
+import.out:Nombre de fichero o dispositivo para imprimir el estado de la salida.
+
+import.params:[opciones] colecciÃ³n-nombre
+
+import.removeold:BorrarÃ¡ los contenidos antiguos del directorio archives.
+
+import.removing_archives:Borrando el contenido actual del directorio archives...
+
+import.removing_tmpdir:Borrando los contenidos del directorio "tmp" de la colecciÃ³n...
+
+import.site:Sitio en el cual encontrar la carpeta collect (para la instalaciÃ³n de Greenstone 3)
+
+import.sortmeta:Ordena documentos alfabÃ©ticamente por metadatos para la construcciÃ³n. Los resultados de las bÃºsquedas booleanas se mostrarÃ¡n con este orden. Se desactivarÃ¡ si groupsize > 1. Puede usar una lista separada por comas para ordenar por mÃ¡s de un valor de metadato.
+
+import.statsfile:Nombre de fichero o dispositivo para imprimir las estadÃ­sticas de importaciÃ³n.
+
+import.stats_backup:ImprimirÃ¡ el stats en lugar de STDERR.
+
+import.verbosity:Controla la cantidad de output rendimiento. El 0=ninguno, 3=muchos.
+
+# -- csv-usernames-to-db.pl
+cu2db.desc:Un script sencillo para agregar usuarios en modo lote, a la base de datos de Greenstone. Toma como entrada un archivo con valores separados por comas (CSV). Cada lÃ­nea representa un usuario, y consiste de nombre de usuario, clave, grupos y comentarios. Si el usuario pertenece a mÃ¡s de un grupo, entonces la lista de grupos puede ser una lista separada por comas y necesitarÃ¡ usar un separador de campo diferente para el archivo.  
+ 
+cu2db.params:[opciones] nombre_archivo_CSV  
+
+cu2db.field-separator:Controla que caracter se estÃ¡ utilizando para separar los campos en el archivo CSV.  
+
+cu2db.already-encrypted:Use esto si las claves estÃ¡n encriptadas en el archivo CVS.  
+
+
+
+# -- schedule.pl --
+schedule.deleted:Borrado de la ejecuciÃ³n planificada de la colecciÃ³n
+schedule.scheduled:Script de ejecuciÃ³n creado para la colecciÃ³n.
+schedule.cron:ConfiguraciÃ³n de la ejecuciÃ³n planificada de la colecciÃ³n
+schedule.params:[opciones]
+schedule.error.email:-email requiere que se especifique -smtp -toaddr y -fromaddr
+schedule.error.importbuild:Debe especificarse -import y -build.
+schedule.error.colname:Debe especificarse la colecciÃ³n usando -colname
+schedule.gli:Ejecutando desde el GLI
+schedule.frequency:Con que frecuencia reconstruir automÃ¡ticamente la colecciÃ³n.
+schedule.frequency.hourly:Reconstruir cada hora
+schedule.frequency.daily:Reconstruir todos los dÃ­as
+schedule.frequency.weekly:Reconstruir cada semana
+schedule.action:CÃ³mo configurar reindexaciÃ³n automÃ¡tica.
+schedule.action.add:Programar reindexaciÃ³n automÃ¡tica
+schedule.action.update:Actualizar la programaciÃ³n existente
+schedule.action.delete:Borrar la programaciÃ³n existente
+schedule.email:Enviar notificaciÃ³n por email
+schedule.schedule:Seleccionelo para configurar la reconstrucciÃ³n planificada automÃ¡tica de la colecciÃ³n
+schedule.colname:El nombre de la colecciÃ³n para la cual se configurarÃ¡ la programaciÃ³n.
+schedule.import:El comando import a ser programado
+schedule.build:El comando buildcol a ser programado
+schedule.toaddr:La direcciÃ³n de email a la cual enviar notificaciones de las construcciones programadas.
+schedule.toaddr.default:Especifique el mail del usuario en el menÃº Archivo -> Preferencias
+schedule.fromaddr:La direcciÃ³n de mail del emisor
+schedule.fromaddr.default:Especificar el "maintainer" en el main.cfg.
+schedule.smtp:El servidor de mail que "sendmail" contactarÃ¡ para hacer el envio.
+schedule.smtp.default:Especifique "MailServer" en el main.cfg
+schedule.out:archivo o dispositivo en el que imprimir el estado de salida.
+# -- export.pl --
+
+export.exportdir:LocalizaciÃ³n final del material exportado.
+
+export.cannot_open_stats_file:ATENCIÃN:No se puede abrir el archivo de estadÃ­sticas %s.
+
+export.cannot_open_fail_log:ERROR: No se puede abrir el registro de errores %s
+
+export.cannot_sort:ATENCIÃN: export.pl no puede ordenar los documentos cuando groupsize>1. Se ignorarÃ¡ la opciÃ³n sortmeta.
+
+export.collectdir:Ruta al directorio de la colecciÃ³n
+
+export.complete:ExportaciÃ³n completa
+
+export.debug:Imprimir el texto exportado a STDOUT (para exportaciÃ³n GreenstoneXML)
+
+export.desc:Script PERL usado para exportat ficheros de una colecciÃ³n Greenstone a otro formato.
+
+export.faillog:Nombre de fichero del registro de fallos. Este registro contiene el nombre de cualquier fichero que falle al ser procesado.(Por definiciÃ³n: collectdir/collect/collname/etc/fail.log)
+
+export.groupsize:NÃºmero de documentos a agrupar en un fichero XML.
+
+export.gzip:Use gzip para comprimir los documentos xml resultantes (no olvide incluir ZIPPlugin en su lista de plugins cuando construya desde documentos comprimidos).
+
+export.importdir:LocalizaciÃ³n del material original.
+
+export.keepold:No borrarÃ¡ el contenido actual del directorio export.
+
+export.maxdocs:NÃºmero mÃ¡ximo de documentos a exportar.
+
+export.listall:Lista todos los formatos a guardar
+
+export.saveas:Formato al que exportar el documento.
+
+export.saveas.DSpace:Formato de archivo DSpace.
+
+export.saveas.GreenstoneMETS:Formato METS usando el perfil de Greenstone.
+export.saveas.FedoraMETS:Formato METS usando el perfil de Fedora.
+
+export.saveas.GreenstoneXML:Formato de archivo XML de Greenstone
+
+export.saveas.MARCXML:Formato MARC XML (versiÃ³n XML del MARC 21)
+
+export.out:archivo o dispositivo en el que imprimir el estado de salida.
+
+export.params:[opciones] nombre de colecciÃ³n
+
+export.removeold:BorrarÃ¡ los contenidos previos del directorio export.
+
+export.removing_export:Borrando los contenidos actuales del directorio exportâŠ
+
+export.sortmeta:Ordenar los documentos alfabÃ©ticamente por metadatos para construir. Se desactivarÃ¡ si groupsize > 1.
+
+export.statsfile:Fichero o dispositivo en el que imprimir las estadÃ­sticas de exportaciÃ³n.
+
+export.stats_backup:ImrprimirÃ¡ las estadÃ­sticas en STDERR en su lugar.
+
+export.verbosity:Controla la cantidad de salida. 0=nada, 3=mucha.
+
+
+# -- mkcol.pl --
+
+mkcol.about:Sobre el texto para la colecciÃ³n.
+
+mkcol.buildtype:El 'buildtype' de la colecciÃ³n (mg, mgpp, lucene)  
+
+mkcol.infodbtype:El 'infodbtype' de la colecciÃ³n (gdbm, jdbm, sqlite)  
+
+mkcol.bad_name_cvs:ERROR: Ninguna colecciÃ³n puede nombrarse CVS puesto que puede interferir con directorios creados por la versiÃ³n del sistema CVS.
+
+mkcol.bad_name_svn:ERROR: ninguna colecciÃ³n puede nombrarse como .svn ya que interfiere con directorios creados por el sistema de versionado SVN.
+
+mkcol.bad_name_modelcol:ERROR: Ninguna colecciÃ³n puede nombrarse modelcol puesto que este es el nombre de la colecciÃ³n model
+
+mkcol.cannot_find_modelcol:ERROR: Ninguna colecciÃ³n puede nombrarse el modelcol puesto que este es el nombre del ejemplo de colecciÃ³n %s
+
+mkcol.col_already_exists:ERROR: Esta colecciÃ³n ya existe.
+
+mkcol.collectdir:Directorio dÃ³nde la nueva colecciÃ³n serÃ¡ creada.
+
+mkcol.group_not_valid_in_gs3:La opciÃ³n de grupo no es vÃ¡lida en modo Greenstone 3 (-gs3mode).
+mkcol.creating_col:Creando la colecciÃ³n %s
+
+mkcol.creator:La direcciÃ³n de correo electrÃ³nico del creador de la colecciÃ³n.
+
+mkcol.creator_undefined:ERROR: El creador no fue definido. Esta variable se necesita reconocer los nombres duplicados de la colecciÃ³n.
+
+mkcol.desc:La escritura de PERL utilizada para crear la estructura del directorio para una nueva colecciÃ³n de Greenstone.
+
+mkcol.doing_replacements:realizando reemplazos %s
+
+mkcol.group:Crear un nuevo grupo de colecciones en vez de una colecciÃ³n estÃ¡ndar.
+
+mkcol.gs3mode:Modo para colecciones de Greenstone 3.
+
+mkcol.long_colname:ERROR: El nombre de la colecciÃ³n debe ser menor de 8 caracteres para que pueda mantenerse la compatibilidad con sistemas de ficheros anteriores.
+
+mkcol.maintainer:La direcciÃ³n del correo electrÃ³nico de la persona que proporciona mantenimiento a la colecciÃ³n (si es diferente a la del creador).
+
+mkcol.no_collectdir:ERROR: El dir del coleccionador no existe: %s
+
+mkcol.no_collectdir_specified:ERROR: No se ha especificado la carpeta collect. En gs3mode, tanto la opciÃ³n -site o -collectdir debe ser especificada.
+
+mkcol.no_colname:ERROR: NingÃºn nombre de la colecciÃ³n fue especificado.
+
+mkcol.optionfile:Reciba las opciones del archivo, Ãºtil en sistemas donde las lÃ­neas de orden largas pueden causar problemas.
+
+mkcol.params:[opciones] colecciÃ³n-nombre
+
+mkcol.plugin:El mÃ³dulo Perl plugin para usar (puede haber entradas mÃºltiples plugin).
+
+mkcol.public:Si esta colecciÃ³n tiene acceso anÃ³nimo.
+mkcol.public.true:La colecciÃ³n es pÃºblica
+mkcol.public.false:La colecciÃ³n es privada
+
+mkcol.quiet:Opere de manera silenciosa
+
+mkcol.site:En gs3mode, usa el nombre del site con la variable de entorno GSDL3HOME para determinar el collectdir, a menos que se especifique -collectdir.
+
+mkcol.success:La nueva colecciÃ³n se creada exitosamente a %s
+
+mkcol.title:El tÃ­tulo de la colecciÃ³n.
+
+mkcol.win31compat:Establece si el directorio de la colecciÃ³n indicada debe ser conforme a las convenciones de archivo de Windows 3.1 (ej.: longitud de 8 caracteres).
+mkcol.win31compat.true:Nombre del directorio, 8 caracteres o menos
+mkcol.win31compat.false:Cualquier longitud de nombre del directorio
+
+# -- pluginfo.pl --
+
+pluginfo.collection:Al dar un nombre a la colecciÃ³n realizarÃ¡ que un pluginfo.pl revise primero en el collect/collection-name/perllib/plugins. Si el plugin general no se encuentra allÃ­ que aparecerÃ¡ en el directorio del perllib/plugins.
+
+pluginfo.desc:Imprime informaciÃ³n sobre un plugin.
+
+pluginfo.general_options:Se toman las opciones generales de las clases paternal inicial del plugin.
+
+pluginfo.info:info
+
+pluginfo.no_plugin_name:ERROR: Usted debe proporcionar un nombre plug.
+
+pluginfo.option_types:Plugins podrÃ¡n tomar dos tipos de opciones
+
+pluginfo.params:[opciones] el nombre-plugin
+
+pluginfo.passing_options:Pueden pasarse las opciones a cualquier plugin incluyÃ©ndolos en su archivo de configuraciÃ³n collect.cfg.
+
+pluginfo.specific_options:Se definen las opciones especÃ­ficas dentro del propio plugin, y sÃ³lo estÃ¡n disponibles en este plugin en particular.
+
+
+# -- plugoutinfo.pl --
+
+plugoutinfo.collection:Dando un nombre de colecciÃ³n harÃ¡ que plugoutinfo.pl busque primero en collect/collection-name/perllib/plugouts. Si la salida no se encuentra allÃ­, buscarÃ¡ en el directorio general perllib/plugouts
+
+plugoutinfo.desc:Muestra informaciÃ³n sobre la salida.
+
+plugoutinfo.general_options:La opciones generales se heredan de las clases padres de la salida.
+
+plugoutinfo.info:informaciÃ³n
+
+plugoutinfo.no_plugout_name:ERROR: debe dar un nombre de salida.
+
+plugoutinfo.option_types:La salidas pueden tomar dos tipos de opciones
+
+plugoutinfo.params:[options] nombre de salida
+
+plugoutinfo.passing_options:Las ocpiones pueden pasarse a cualquier salida incluyÃ©ndolas en el fichero de configuraciÃ³n collect.cfg.
+
+plugoutinfo.specific_options:Las opciones especÃ­ficas se definen dentro de la propia salida, y sÃ³lo estÃ¡n disponibles para esta salida en particular.
+
+
+
+#
+# Classifier option descriptions
+#
+
+AllList.desc:Crea una lista sencilla de todos los documentos. Usada por el servidor OAI.
+
+AZCompactList.allvalues:Utilizar todos los valores de metadatos encontrados.
+
+AZCompactList.desc:Plugin para clasificar por orden alfabÃ©tico (a-zA-Z0-9). Produce una lista horizontal A-Z y luego una lista vertical conteniendo los documentos, o estanterÃ­as para documentos con metadatos comunes.  
+
+AZCompactList.doclevel:Nivel para procesar el documento a
+AZCompactList.doclevel.top:Documento completo
+AZCompactList.doclevel.section:Por secciones
+
+AZCompactList.firstvalueonly:Utilizar Ãºnicamente el primer valor de metadato encontrado.
+
+AZCompactList.freqsort:Clasificar por la frecuencia del nodo en lugar de alfa-numÃ©rico.
+
+AZCompactList.maxcompact:NÃºmero mÃ¡ximo de documentos que serÃ¡n desplegados por pÃ¡gina.
+
+AZCompactList.metadata:Un sÃ³lo campo de metadatos, o una lista de campos de metadatos separada por comas, utilizados para clasificaciÃ³n. Si se especifica una lista, serÃ¡ utilizado el primer tipo de metadatos que tenga valores. Puede utilizarse en combinaciÃ³n con los parÃ¡metros -firstvalueonly y -allvalues, para seleccionar Ãºnicamente el primer valor o todos los valores de la lista.  
+
+AZCompactList.mincompact:NÃºmero mÃ­nimo de documentos que serÃ¡n desplegados por pÃ¡gina.
+
+AZCompactList.mingroup:El valor mÃ¡s pequeÃ±o que causarÃ¡ un grupo en formato jerÃ¡rquico
+
+AZCompactList.minnesting:El valor mÃ¡s pequeÃ±o que causarÃ¡ una lista a ser convertida en una lista anidada.
+
+AZCompactList.recopt:Usado en metadatos anidados como -metadato AÃ±o/OrganizaciÃ³n.
+AZCompactList.sort:Campo de metadatos por medio del cual ordenar los nodos anidados.
+
+AZCompactSectionList.desc:VariaciÃ³n de AZCompactList que clasifica secciones en vez de documentos. Las entradas se ordenan por medio de metadatos a nivel de secciÃ³n.
+
+AZList.desc:Plugin clasificador alfabÃ©tico (a-zA-Z0-9). Produce una lista horizontal A-Z, con los documentos listados debajo.  
+
+AZList.metadata:Un solo campo de metadatos o una lista de campos de metadatos separados por una coma y usados con fines de clasificaciÃ³n. Siguiendo el orden indicado por la lista, se utilizarÃ¡ el primer campo que contiene un valor. La lista se ordenarÃ¡ de acuerdo a este elemento.  
+
+AZSectionList.desc:VariaciÃ³n de AZList que clasifica secciones antes que documentos. Las entradas se ordenan por metadatos de nivel de secciÃ³n.
+
+BasClas.bad_general_option:El clasificador %s utiliza una opciÃ³n incorrecta. Revise su archivo de configuraciÃ³n collect.cfg.
+
+BasClas.builddir:En dÃ³nde poner los Ã­ndices construidos.
+
+BasClas.buttonname:Etiqueta para la pantalla del clasificador y para el botÃ³n de la barra de navegaciÃ³n. Por definiciÃ³n, se usa el elemento de metadato espcificado con -metadata.
+
+BasClas.desc:Clase base para todos los clasificadores.
+
+BasClas.no_metadata_formatting:No hacer ningÃºn formateo automÃ¡tico de metadatos (para ordenaciÃ³n)
+
+BasClas.outhandle:El fichero o dispositivo donde escribir la salida.
+
+BasClas.removeprefix:Un prefijo que al clasificar se debe ignorar en los valores de los metadatos.
+
+BasClas.removesuffix:Un sufijo que al clasificar se debe ignorar en los valores de los metadatos.
+
+BasClas.verbosity:Controla la cantidad de (output) rendimiento. 0=ninguno, 3=muchos.
+
+Browse.desc:Clasificador falso que ofrece un enlace en la barra de navegaciÃ³n a un prototipo de pÃ¡gina que combina bÃºsqueda y exploraciÃ³n. SÃ³lo funciona con colecciones de MGPP, y sÃ³lo es Ãºtil para pequeÃ±as colecciones.
+
+DateList.bymonth:Clasificar por aÃ±o y mes en vez de sÃ³lo aÃ±o.
+
+DateList.desc:Plugin clasificador que ordena por fecha. El metadato predefinido para ordenar es 'Date/Fecha'. Se asume que la fecha estÃ¡ en formato aaaammdd o aaa-mm-dd.
+
+DateList.metadata:El metadato que contiene las fechas para clasificar. Se espera que el formato sea el aaaammdd o aaa-mm-dd. Puede ser una lista separada por comas, en cuyo caso se usarÃ¡   la primera fecha encontrada.
+
+DateList.reverse_sort:Ordenar los documentos en orden cronolÃ³gico inverso (el mÃ¡s nuevo al comienzo).
+
+DateList.nogroup:Haga de cada aÃ±o una entrada individual en la lista horizontal, en vez de extender los aÃ±os con pocas entradas. (Esto tambiÃ©n se puede usar con la opciÃ³n -bymonth para hacer que cada mes tenga una entrada separada en vez de combinarlas).
+
+DateList.no_special_formatting:No mostrar informaciÃ³n de AÃ±o ni Mes en la lista de documentos.
+
+DateList.sort:Un campo de metadato extra para ordenar en el caso de que dos documentos tengan la misma fecha.
+
+HFileHierarchy.desc:Plugin clasificador para generar clasificaciones jerÃ¡rquicas basadas en una estructura existente en un archivo suplementario.
+
+Hierarchy.desc:Plugin clasificador para generar una clasificaciÃ³n jerÃ¡rquica. Ãsta debe basarse en metadatos estructurados, o debe usar un fichero suplementario de estructura (usar la opciÃ³n -hfile)
+
+Hierarchy.documents_last:Muestra nodos de documento despÃºes de los nodos de clasificadores.
+
+Hierarchy.hfile:Usa el fichero de estructura de clasificaciÃ³n especificado.
+
+Hierarchy.hlist_at_top:Despliega el primer nivel de clasificaciÃ³n horizontalmente
+
+Hierarchy.reverse_sort:Ordenar hojas de nodos en orden inverso (usar con -sort).
+
+Hierarchy.separator:ExpresiÃ³n regular utilizada por el separador
+
+Hierarchy.sort:Campo de metadato para clasificar nodos anidados. Los dejarÃ¡ sin clasificar si no se indica.
+
+Hierarchy.suppressfirstlevel:Ignorar la primera parte del valor del metadato. Esto es Ãºtil para metadatos en los cuales el primer valor es comÃºn, como el directorio de importaciÃ³n en gsdlsourcefilename.
+
+Hierarchy.suppresslastlevel:Ignorar la parte final del valor del metadato. Es Ãºtil para metadatos en los cuales cada valor es Ãºnico, como en la rutas de archivos.
+
+HTML.desc:Crea una clasificaciÃ³n vacÃ­a que simplemente es un link a una pÃ¡gina web.
+
+HTML.url:El url de la pÃ¡gina web para unirse a.
+
+List.bookshelf_type:Controla cuando crear estantes
+List.bookshelf_type.always:Crea un Ã­cono de estante aun cuando haya en cada grupo un Ãºnico nodo hijo.
+List.bookshelf_type.never:Nunca crear un icono de estante aun cuando existan mÃ¡s de un item en cada grupo.
+List.bookshelf_type.duplicate_only:Crea un Ã­cono de estante solo cuando haya mÃ¡s de un nodo hijo en cada grupo.
+
+List.classify_sections:Clasifica secciones en lugar de documentos.
+
+List.desc:Clasificador de lista general y flexible con muchas de las posibilidades de AZCompactList, pero con mejor capacidad de ordenaciÃ³n, metadatos y Unicode.
+
+List.level_partition.none:Ninguno.  
+List.level_partition.per_letter:Crear una particiÃ³n para cada letra.
+List.level_partition.constant_size:Crear particiones de tamaÃ±o constante  
+List.level_partition.approximate_size:Crear una particiÃ³n por letra, y luego, agrupar o dividir las letras para obtener particiones del mismo tamaÃ±o.  
+
+List.metadata:Campos de metadatos usados para la clasificaciÃ³n. Use '/' para separar los niveles de la jerarquÃ­a y ';' para separar los campos de metadatos dentro de cada nivel.
+
+List.partition_name_length:Longitud del nombre de la particiÃ³n: el valor predefinido es una variable entre 1 y 3 caracteres, dependiendo de cuÃ¡ntos son necesarios para distinguir el principio de la particiÃ³n de su final. Esta opciÃ³n sÃ³lo se aplica cuando partition_type_within_level se marca como 'constant_size'.
+
+List.partition_size_within_level:NÃºmero de elementos en cada particiÃ³n (sÃ³lo se aplica cuando partition_type_within_level se establece a 'constant_size'). Puede especificarse para cada nivel. Separe los niveles con '/'.  
+
+List.partition_type_within_level:Tipo de particiÃ³n hecha: puede ser 'per_letter' (por letra), 'constant_size' (tamaÃ±o constante) o 'none' (ninguna). Separe los niveles con '/'.  
+
+List.reverse_sort_leaf_nodes:Ordenar los documentos de manera inversa.  
+
+List.sort_leaf_nodes_using:Campos de metadatos usados para ordenar los nodos anidados. Use '|' para separar los grupos de metadatos para ordenaciÃ³n estable y ';' para separar campos de metadatos dentro de cada grupo.
+
+List.sort_using_unicode_collation:Ordenar usando el algoritmo Unicode. Requiere que se descargue el archivo http://www.unicode.org/Public/UCA/latest/allkeys.txt en la carpeta lib/unicode/Collate de Perl.
+
+List.use_hlist_for:Campos de metadato para usar una hlist mejor que una vlist. Use ',' para separar los grupos de metadatos y ';' para separar los campos de metadatos dentro de cada grupo.
+
+SimpleList.metadata:Un simple campo de metadato o una lista de campos de metadatos separados por una coma y usados para clasificaciÃ³n. Siguiendo el orden indicado por la lista, se usarÃ¡ el primer campo que contenga un valor de metadato. La lista se ordenarÃ¡ por este elemento, a menos que se use -sort. Si no se especifica metadato, entonces todos los documentos se incluirÃ¡n en la lista, en otro caso sÃ³lo se incluirÃ¡n aquellos documentos que contengan un valor de metadato.  
+
+SimpleList.desc:Plugin clasificador para lista simple.
+
+SimpleList.sort:Campo de metadato a partir del cual se harÃ¡ la ordenaciÃ³n. Use '-sort nosort' para no ordenar.
+
+Phind.desc:Produce una jerarquÃ­a de las frases encontradas en el texto, que es mostrada mediante un applet.
+
+Phind.language:Idioma o idiomas utilizados para construir una jerarquÃ­a. Los idiomas son identificados por un cÃ³digo de paÃ­s de dos letras: en (inglÃ©s), es (espaÃ±ol), y fr (francÃ©s). El lenguaje es una expresiÃ³n normal, de modo que 'en|fr' (inglÃ©s o francÃ©s) y '.. ' (iguala cualquier idioma) son vÃ¡lidos.
+
+Phind.min_occurs:MÃ­nimo nÃºmero de veces que debe aparecer una frase en el texto para que sea incluida en la jerarquÃ­a de frases.
+
+Phind.savephrases:Si estÃ¡ marcado, la informaciÃ³n de la frase se guardarÃ¡ en el fichero dado como texto. Probablemente es una buena idea utilizar una ruta absoluta.
+
+Phind.suffixmode:El parÃ¡metro smode para el programa de extracciÃ³n de frase. Un valor de 0 significa que los stopwords serÃ¡n ignorados, y 1 significa que los stopwords serÃ¡n utilizadas.
+
+Phind.text:El texto utilizado para construir la jerarquÃ­a de la frase.
+
+Phind.thesaurus:El nombre de un thesaurus guardado en formato Phind en el directorio etc de la colecciÃ³n.
+
+Phind.title:Campo del metadato usado para describir cada documento.
+
+Phind.untidy:No elimine los archivos activos.
+
+RecentDocumentsList.desc:Clasificador que ofrece una lista de documentos nuevos aÃ±adidos o modificados.
+
+RecentDocumentsList.include_docs_added_since:Incluye sÃ³lo documentos aÃ±adidos o modificados despuÃ©s de la fecha indicada (en formatos aaaammdd o aaaa-mm-dd)
+
+RecentDocumentsList.include_most_recently_added:Incluye sÃ³lo el nÃºmero indicado de los documentos aÃ±adidos mÃ¡s recientemente. SÃ³lo usado si no se indica include_docs_added_since.
+
+RecentDocumentsList.sort:Metadato pro el cual ordenar la Lista por. Si no se indica, la lista se ordenarÃ¡ por la fecha de entrada/modificaciÃ³n.
+
+SectionList.desc:Igual que el clasificador de la lista pero incluye todas las secciones del documento (excluyendo el nivel superior) y no sÃ³lo el propio documento del nivel superior.
+
+Collage.desc:Applet usado para mostrar un collage de imÃ¡genes encontradas en la colecciÃ³n.
+
+Collage.geometry:Las dimensiones del lienzo del collage. Para un lienzo de 600 pixels de ancho y 400 pixels de alto, por ejemplo, especifique la geometrÃ­a como 600x400  
+
+Collage.maxDepth:Las imÃ¡genes para el collage se dibujan mediante un espejo del clasificador de navegaciÃ³n subyacente. Esto controla la profundidad mÃ¡xima del proceso de espejo.
+
+Collage.maxDisplay:El mÃ¡ximo nÃºmero de imÃ¡genes a mostrar en el collage en cualquier momento.
+
+Collage.imageType:Utilizado para controlar, empleando las extensiones del nombre de fichero, que tipos de fichero se utilizan en el collage. Una lista de las extensiones del nombre de archivo se separa con el sÃ­mbolo (%%).
+
+Collage.bgcolor:El color de fondo del lienzo del collage, especificado en hexadecimal (por ejemplo, #008000 produce un fondo verde bosque).
+
+Collage.buttonname:Etiqueta para clasificador de pantalla y botÃ³n en la barra de navegaciÃ³n.
+
+Collage.refreshDelay:Rata, en milisegundos, de refresco del lienzo del collage.
+
+Collage.isJava2:Utilizado para controlar cuales clases del run-time de Java se usan. Las versiones mÃ¡s avanzadas de Java (desde Java 1.2 en adelante) incluyen un soporte mas sofisticado para controlar la transparencia de las imÃ¡genes. Esta opciÃ³n ayuda a controlar lo que ocurre; sin embargo, el run-time de Java integrado con algunos navegadores es versiÃ³n 1.1. El applet estÃ¡ disÃ±ado, por defecto, para auto-detectar cual versiÃ³n de Java estÃ¡ utilizando el navegador y actuar en conformidad.  
+
+Collage.imageMustNotHave:Utilizado para suprimir las imÃ¡genes que no deben aparecer en el collage, tales como las imÃ¡genes de los botones que forman la barra de navegaciÃ³n.
+
+Collage.caption:TÃ­tulos opcionales para desplegar bajo el lienzo del collage.
+
+
+#
+# Plugin option descriptions
+#
+AcronymExtractor.adding:agregando
+
+AcronymExtractor.already_seen:ya ha sido visto
+
+AcronymExtractor.desc:Conector asistente para la localizaciÃ³n y el marcado de acrÃ³nimos en el texto.
+
+AcronymExtractor.done_acronym_extract:terminÃ³ de extraer las siglas.
+
+AcronymExtractor.done_acronym_markup:TerminÃ³ el marcado de sigla (o acrÃ³nimo).
+
+AcronymExtractor.extract_acronyms:Extrae las siglas que contiene el texto y las coloca como metadato.
+
+AcronymExtractor.extracting_acronyms:extrayendo siglas
+
+AcronymExtractor.marking_up_acronyms:marcando siglas
+
+AcronymExtractor.markup_acronyms:Agregue el metadato de sigla en el texto del documento.
+
+ArchivesInfPlugin.desc:Plugin que procesa la base de datos de archivos (archiveinf-doc) la cual es generada por el proceso de importaciÃ³n. Envia a cada archivo listado en la base de datos para que sea procesado por GreenstoneXMLPlugin.  
+ArchivesInfPlugin.reversesort:Ordenar en forma inversa. Es Ãºtil si se ha indicado la opciÃ³n  -sortmeta en el proceso import.pl  
+
+AutoExtractMetadata.desc:Plugin base que agrupa todas las funcionalidades de extracciÃ³n de los conectores de extracciÃ³n.  
+
+AutoExtractMetadata.extracting:extrayendo
+
+AutoExtractMetadata.first:Lista separada por comas de los nÃºmeros de caracteres a extraer desde el comienzo del texto para ser almacenados en campos de metadatos llamados "FirstN". Por ejemplo los valores "3,5,7" permitirÃ¡n la extracciÃ³n de los primeros 3, 5 y 7 caracteres en campos de metadatos llamados "First3", "First5", "First7"   
+
+AutoLoadConverters.desc:Plugin auxiliar que carga dinamicamente a los plugins conversores.  
+
+BaseMediaConverter.desc:Conector que provee funcionalidad bÃ¡sica para los conectores conversores de media como el ImageConverter y los conversores de video.
+
+BasePlugin.associate_ext:Hace que los ficheros cuyos nombres contienen la misma parte inicial que el documento procesado por el plugin y una extensiÃ³n que figura en la lista separada por comas que provee este argumento, sean asociados con el documento que se estÃ¡ procesando en vez de ser manejados como una lista separada.
+
+BasePlugin.associate_tail_re:Una expresiÃ³n regular para cotejar con los nombres de archivos y encontrar los archivos asociados.
+
+BasePlugin.block_exp:Los archivos que sean iguales a esta expresiÃ³n regular serÃ¡n bloqueados para no pasarse a ningÃºn otro plugin posterior del listado.  
+
+BasePlugin.desc:La clase base para todos los plugins de importaciÃ³n.
+
+BasePlugin.dummy_text:Este documento no tiene contenido.
+
+BasePlugin.encoding.ascii:ASCII plano de 7 bits. Ãste puede resultar mÃ¡s rÃ¡pido que usando el iso_8859_1. Tenga cuidado con usar esto en una colecciÃ³n de documentos que pueden contener caracteres no comprendidos en el conjunto ASCII simple (por ejemplo documentos en AlemÃ¡n o FrancÃ©s que contengan acentos), mejor utilice el iso_8859_1.  
+
+BasePlugin.encoding.unicode:SÃ³lo unicode.
+
+BasePlugin.encoding.utf8:Ya sea Utf8 o unicodeâdetectada automÃ¡ticamente
+
+BasePlugin.filename_encoding:La codificaciÃ³n de los nombres de archivos de origen.
+
+BasePlugin.filename_encoding.auto:Detectar automÃ¡ticamente la codificaciÃ³n del nombre de archivo.
+
+BasePlugin.filename_encoding.auto_language_analysis:Auto detectar la codificaciÃ³n analizando el nombre de archivo.
+
+BasePlugin.filename_encoding.auto_filesystem_encoding:Auto detectar la codificaciÃ³n del nombre de archivo usando la codificaciÃ³n del filesystem.
+
+BasePlugin.filename_encoding.auto_fl:Utiliza la codificaciÃ³n del filesystem y luego anÃ¡lisis de idioma para detectar la codificaciÃ³n del nombre de archivo.
+
+BasePlugin.filename_encoding.auto_lf:Utilizar anÃ¡lisis de idioma y luego codificaciÃ³n del filesystem para detectar la codificaciÃ³n del nombre de archivo.
+
+BasePlugin.no_blocking:No hacer bloqueo de archivos. Cualquier archivo asociado (ej. ImÃ¡genes en una pÃ¡gina web) serÃ¡ agregado a la colecciÃ³n como documentos separados.
+
+BasePlugin.no_cover_image:No buscar un archivo prefijo.jpg (en el cual prefijo es el mismo prefijo que el del archivo que estÃ¡ siendo procesado) para asociarlo como imagen de portada.  
+
+BasePlugin.OIDtype.auto:Usar OIDType definido en import.pl
+
+BasePlugin.process_exp:Una expresiÃ³n Perl regular para comprobar contra nombres de ficheros que se procesarÃ¡n por este plugin. Por ej., usando '(? i). html? \ $' aparecerÃ¡n todos los documentos con terminaciÃ³n. htm .html (no es sensible a mayÃºsculas/minÃºsculas).
+
+BasePlugin.processing_tmp_files:Marca interna, fijada por los plugins conversores para indicar que estÃ¡n procesando un archivo tmp.  
+
+BasePlugin.smart_block:Bloquear archivos en una forma mÃ¡s inteligente que simplemente examinando sus nombres.  
+
+BasePlugin.store_original_file:Grabar el documento original como un documento asociado. Note que esto ya es asÃ­ para documentos PDF, Word, etc. Esta opciÃ³n solo es util para plugins que no hacen copia del archivo original.  
+
+BasePlugin.file_rename_method:El mÃ©todo a utilizarse para renombrar la copia de los archivos importados y asociados.
+
+BasePlugin.rename_method.url:Usar codificaciÃ³n de URL al renombrar archivos importados y asociados.
+
+BasePlugin.rename_method.base64:Usar codificaciÃ³n base64 para renombrar archivos importados y asociados.
+
+BasePlugin.rename_method.none:No renombrar archivos importados y asociados.
+
+BibTexPlugin.desc:BibTexPlugin lee archivos de registros bibliogrÃ¡ficos en formato BibTex. BibTexPlugin crea un objeto de documento para cada referencia en el archivo. Es una subclase de SplitTextFile, por lo que si hay registros mÃºltiples, todos se leen.  
+
+BookPlugin.desc:Crea documentos multinivel a partir de documentos que contengan etiquetas de nivel <<TOC>>. Los metadatos para cada secciÃ³n se toman de cualquier otra etiqueta que estÃ© en la misma lÃ­nea que el << TOC >>, por ej., <<Title>> xxxx <</Title>> establece el metadato TÃ­tulo. Todo lo demÃ¡s que aparezca entre las etiquetas TOC se tratarÃ¡ como html simple (es decir, no se establece ningÃºn proceso de vÃ­nculos html ni se ejcuta ninguna otra tarea del conector HTMLPlugin). Se espera que los archivos de entrada tengan una extensiÃ³n .hb  predefinida (puede cambiarse agregando una opciÃ³n -process_exp, un fichero con el mismo nombre que el fichero hb pero con una extensiÃ³n .jpg se toma como la imagen de la portada (los ficheros jpg son bloqueados por este plugin). BookPlugin es una simplificaciÃ³n (y extensiÃ³n) del HBPlugin utilizado por las colecciones de la Biblioteca de Desarrollo Humanitario. BookPlugin es mÃ¡s rÃ¡pido en tanto que espera la entrada de archivos mÃ¡s limpios (La entrada a las colecciones de HDL contiene muchas etiquetas html adicionales alrededor de etiquetas << TOC >>, utiliza etiquetas << I >> para especificar las imÃ¡genes, y simplemente toma todo el texto entre las etiquetas << TOC >> y el inicio del texto como metadato Title). Si usted estÃ¡ colocando marcas en documentos para que sean desplegados de la misma manera que las colecciones HDL, use este plugin en lugar de HBPlugin.  
+
+CONTENTdmPlugin.desc:Conector que procesa archivos RDF en colecciones CONTENTdm exportadas.
+
+ConvertBinaryFile.apply_fribidi:Ejecutar el programa del Algoritmo Bidireccional Unicode "fribidi" sobre el fichero convertido (para textos escritos de derecha a izquierda).
+
+ConvertBinaryFile.convert_to:Plugin que convierte a TEXTO o a HTML o a varios tipos de imagen (ej. JPEG, GIF, PNG).
+
+ConvertBinaryFile.convert_to.auto:Selecciona automÃ¡ticamente el formato al cual se convertirÃ¡. La elecciÃ³n del formato depende del tipo de documento importado, por ejemplo, Word serÃ¡ automÃ¡ticamente convertido a HTML, mientras que PowerPoint serÃ¡ convertido al formato PagedImage de Greenstone  
+
+ConvertBinaryFile.convert_to.html:Formato HTML  
+
+ConvertBinaryFile.convert_to.text:Formato texto plano.  
+
+ConvertBinaryFile.convert_to.pagedimg:Una serie de imÃ¡genes.
+
+ConvertBinaryFile.convert_to.pagedimg_jpg:Formato JPEG.
+
+ConvertBinaryFile.convert_to.pagedimg_gif:Formato GIF.
+
+ConvertBinaryFile.convert_to.pagedimg_png:Formato PNG.
+
+ConvertBinaryFile.desc:Este conector es heredado por otros como WordPlugin, PowerPointPlugin, PostScriptPlugin, RTFPlugin y PDFPlugin. Facilita la conversiÃ³n de Ã©stos tipos de documentos a HTML o a TEXTO o a una serie de imÃ¡genes. Funciona cargando dinÃ¡micamente un conector secundario apropiado (HTMLPlugin, StructuredHTMLPlugin, PagedImgPlugin o TEXTPlugin), segÃºn el argumento 'convert_to'.
+
+ConvertBinaryFile.keep_original_filename:mantener el nombre de fichero original para el fichero asociado, antes que convertirlo a doc.pdf, pdf.pdf, etc.
+
+ConvertBinaryFile.use_strings:Si estÃ¡ definido, una funciÃ³n de cadenas simple serÃ¡ llamada para extraer el texto si falla la conversiÃ³n.  
+
+ConvertToRogPlugin.desc:Un plugin que hereda de RogPlugin.
+
+CSVPlugin.desc:Plugin para ficheros con valores separados por comas. Se crearÃ¡ un nuevo documento para cada lÃ­nea del fichero.
+
+DateExtractor.desc:Conector asistente para la extracciÃ³n de informaciÃ³n de fechas histÃ³ricas desde el texto.
+
+DateExtractor.extract_historical_years:Extrae informaciÃ³n periÃ³dica de documentos histÃ³ricos. Se guarda como metadato con el documento. Existe una interfaz de bÃºsqueda para este metadato, que se puede incluir en la colecciÃ³n agregando la expresiÃ³n âformat QueryInterface DateSearchâ al fichero de configuraciÃ³n de la colecciÃ³n.
+
+DateExtractor.maximum_century:El nÃºmero mÃ¡ximo de siglo que serÃ¡ extraÃ­do como metadato histÃ³rico (por ej., 14 extraerÃ¡ todas las referencias hasta el siglo XIV).
+
+DateExtractor.maximum_year:La fecha histÃ³rica mÃ¡xima a ser usada como metadato (en una fecha referida la era comÃºn, como 1950).
+
+DateExtractor.no_bibliography:No intente bloquear las fechas bibliogrÃ¡ficas al extraer las fechas histÃ³ricas.
+
+DirectoryPlugin.desc:RecPlug es un plugin que recorre el Ã¡rbol de directorios recursivamente, procesando cada fichero encontrado.
+
+DirectoryPlugin.recheck_directories:DespuÃ©s de procesar los archivos en un directorio de importaciÃ³n, vuelva a leer el directorio para descubrir los nuevos archivos creados.
+
+DirectoryPlugin.use_metadata_files:SUSTITUIDO - AÃ±adir MetadataXMLPlugin a la lista de plugins para que se puedan leer los metadatos desde los archivos XML de metadatos.
+
+DatabasePlugin.desc:Conector que importa registros de una base de datos. Usa el mÃ³dulo Perl DBI, que incluye soporte para mysql, postgresql, valores separados por comas (CSV), MS Excel, ODBC, sybase, etc... Pueden necesitarse mÃ³dulos extra para su uso. VÃ©ase <GSDLHOME>/etc/packages/example.dbi para un ejemplo de uso.
+
+DSpacePlugin.desc:DSpacePlug toma una colecciÃ³n de documentos exportados desde DSpace y los importa a Greenstone.
+	
+DSpacePlugin.first_inorder_ext:Esto se usa para identificar al archivo de documento primario para un documento de una colecciÃ³n DSpace. Con esta opciÃ³n, el sistema tratarÃ¡ los tipos de documentos ext definidos secuencialmente, buscando al archivo de documento primario.  
+
+DSpacePlugin.first_inorder_mime:Esto se usa para identificar al archivo de documento primario para un documento de una colecciÃ³n DSpace. Con esta opciÃ³n, el sistema tratarÃ¡ a los mime type definidos en secuencia para buscar al archivo de documento primario.  
+
+DSpacePlugin.only_first_doc:Esto se usa para identificar al archivo de documento primario para un documento de una colecciÃ³n DSpace. Con esta opciÃ³n, el sistema tratarÃ¡ al primer documento referenciado an el archivo de metadatos Dublin Core como el documento primario.  
+
+EmailAddressExtractor.desc:Conector asistente para el descubrimiento de direcciones de mail en el texto.
+
+EmailAddressExtractor.done_email_extract:terminÃ³ de extraer las direcciones electrÃ³nicas.
+
+EmailAddressExtractor.extracting_emails:extrayendo direcciones electrÃ³nicas
+
+EmailAddressExtractor.extract_email:Extrae direcciones de correo electrÃ³nico como metadatos.
+
+EmailPlugin.desc:El plugin del correo electrÃ³nico lee ficheros de correo electrÃ³nico.  Ãstos se nombran con un nÃºmero simple (por ej. cuando aparecen en las carpetas del maildir) o con la extensiÃ³n. mbx (formato de fichero mbox). \ntexto del documento: El texto del documento consiste en todo el texto despuÃ©s de la primera lÃ­nea en blanco. \nMetadato (Â¡no DublÃ­n Core!):\n\t\$Headers Todo el contenido de la cabecera (opcional, no se almacenan si no se indica)\n\t\$Asunto  Asunto:  cabecera\n\t\$To/A: cabecera\n\t\$From/De: la cabecera\n\t\$From/Name Nombre del remitente (cuando estÃ© disponible)\n\t\$FromAddr direcciÃ³n del remitente\n\t\$DateText   Fecha: cabecera\n\t\$Date Fecha: ecabecera en formato GSDL (por ej. 19990924)
+
+EmailPlugin.no_attachments:No guarde los anexos del mensaje.
+
+EmailPlugin.headers:Almacenar encabezados de email como metadatos "Headers".
+
+EmailPlugin.OIDtype.message_id:Usar el identificador de mensaje como el OID del documento. Si no se encuentra un indentificador, entonces se usarÃ¡ un OID hash.
+
+EmailPlugin.split_exp:Un expresiÃ³n regular de Perl se utiliza para separar archivos que contengan muchos mensajes en documentos individuales.
+
+EmbeddedMetadataPlugin.desc:Plugin que extrae metadatos embebidos de una variedad de formatos de archivo. Se basa en el mÃ³dulo CPAN 'ExifTool' el cual incluye soporte para mÃ¡s de 70 formatos de archivos y 20 formatos de metadatos. EstÃ¡n incluidos: formatos de video como: AVI, ASF, FLV, MPEG, OGG Vorbis y WMV; formatos de imagen como BMP, GIF, JPEG, JPEG 2000 y PNG; formatos de audio: AIFF, RealAudio, FLAC, MP3 y WAV; documento de Office tales como Encapsulated PostScript (EPS), HTML, PDF y Word. MÃ¡s detalles estÃ¡n disponibles en la pÃ¡gina de ExifTool http://www.sno.phy.queensu.ca/~phil/exiftool/  
+
+ExcelPlugin.desc:Plugin para importar ficheros de Microsoft Excel (versiones 95 y 97).
+
+FavouritesPlugin.desc:Conector para procesar archivos Favoritos de Internet Explorer.
+
+FOXPlugin.desc:Plugin para procesar un archivo Foxbase dbt. Este plugin proporciona la funcionalidad bÃ¡sica para leer los archivos dbt y dbf y procesa cada registro. DeberÃ­a escribirse un plugin especÃ­fico basado en este de propÃ³sito general para una base de datos en particular.                                                                                                                                                                                                                                                                      
+
+GreenstoneXMLPlugin.desc:Procesa los documentos XML de Archivo de Greenstone. Note que este conector no realiza ninguna verificaciÃ³n de sintaxis (aunque el mÃ³dulo de XML::Parser comprueba la correcta forma). Se asume que los ficheros de Archivo de Greenstone son conformes a su DTD.
+
+GISExtractor.desc:Clase base paralela a BasPlug que soporta capacidades de GIS
+
+GISExtractor.extract_placenames:Extraer del texto nombres de lugares y establecerlos como metadatos. Requiere la extensiÃ³n GIS de Greenstone.
+
+GISExtractor.gazetteer:Ãndice geogrÃ¡fico para extraer del texto nombres de lugares y establecerlos como metadatos. Requiere la extensiÃ³n GIS de Greenstone.
+
+GISExtractor.place_list:Al extractar ubicaciones, incluya la lista de nombres de lugares al comienzo del documento. Requiere extensiÃ³n de Greenstone a GIS.
+
+HBPlugin.desc:Plugin que procesa un directorio de libro HTML. Este plugin es usado por las colecciones de la Biblioteca de Desarrollo Humanitario y no manipula codificaciones de entrada mÃ¡s que de ASCII o el ASCII extendido. Este cÃ³digo es algo algo engorroso y podrÃ­a, sin dudas, corregirse para que se ejcute mÃ¡s rÃ¡pidamente indudablemente, dejÃ¡ndolo en este estado espero animar a las personas para que hagan sus colecciones utilizando el BookPlugin en cambio ;-)\n\nUse utilice BookPlugin si estÃ¡ creando una nueva colecciÃ³n y marcando a los archivos como las colecciones de la Biblioteca de Desarrollo Humanitario. BookPlugin acepta todas las codificaciones de entrada pero espera que los archivos marcados sean mÃ¡s limpios que aquellos usados por las colecciones de la Biblioteca de Humanidades  
+
+HBPlugin.encoding.iso_8859_1:Latin1 (idiomas occidentales)
+
+HTMLImagePlugin.aggressiveness:El rango de tÃ©cnicas de extracciÃ³n de textos relacionados a utilizar.
+HTMLImagePlugin.aggressiveness.1:Nombre de Archivo, ruta, texto alternativo (atributo ALT de los tags img de HTML) solamente.  
+HTMLImagePlugin.aggressiveness.2:Todos de 1, mÃ¡s el subtÃ­tulo si hubiese disponible.
+HTMLImagePlugin.aggressiveness.3:Todos de 2, mÃ¡s los pÃ¡rrafos disponibles.
+HTMLImagePlugin.aggressiveness.4:Todos de 3, mÃ¡s los encabezados anteriores (<h1>, <h2>...) disponibles.
+HTMLImagePlugin.aggressiveness.5:Todos de 4, mÃ¡s las referencias textuales disponibles.
+HTMLImagePlugin.aggressiveness.6:Todos de 4, mÃ¡s las etiquetas de las pÃ¡ginas HTML (tÃ­tulo, palabras clave, etc).  
+HTMLImagePlugin.aggressiveness.7:Todos de 6, 5 y 4 combinados.
+HTMLImagePlugin.aggressiveness.8:Todos de 7, mÃ¡s la duplicaciÃ³n de nombre del archivo, ruta, texto alternativo y pie (la clasificaciÃ³n jerÃ¡rquica de resultados mÃ¡s relevantes).  
+HTMLImagePlugin.aggressiveness.9:Todos de 1, mÃ¡s el texto completo de la pÃ¡gina fuente.
+
+HTMLImagePlugin.caption_length:La longitud mÃ¡xima de subtÃ­tulos (en caracteres).
+
+HTMLImagePlugin.convert_params:ParÃ¡metros adicionales para la que ImageMagicK convierta el Ã­cono. Por ejemplo, '-raise' darÃ¡ un efecto tridimensional a las imÃ¡genes en miniatura.
+
+HTMLImagePlugin.desc:Plugin para extraer imÃ¡genes y el texto asociado de pÃ¡ginas web.
+
+HTMLImagePlugin.document_text:Agrega el texto de imagen como document:text (de lo contrario el campo de metadatos IndexedText).
+
+HTMLImagePlugin.index_pages:Indice las pÃ¡ginas junto con las imÃ¡genes. Por otra parte referencia las pÃ¡ginas a la fuente URL.
+
+HTMLImagePlugin.max_near_text:Caracteres mÃ¡ximos cerca de las imÃ¡genes a extraer.
+
+HTMLImagePlugin.min_height:Pixeles. Salta las imÃ¡genes mÃ¡s pequeÃ±as que Ã©sta.
+
+HTMLImagePlugin.min_near_text:Caracteres mÃ­nimos cerca del texto o subtitulo para extraer.
+
+HTMLImagePlugin.min_size:Bytes. Brinca las imÃ¡genes mÃ¡s pequeÃ±as que estas.
+
+HTMLImagePlugin.min_width:Pixeles. Salta imÃ¡genes mas breves que Ã©sta.
+
+HTMLImagePlugin.neartext_length:Longitud designada del texto mas cercano (en caracteres)
+
+HTMLImagePlugin.no_cache_images:No esconda las imÃ¡genes (apunte al URL original).
+
+HTMLImagePlugin.smallpage_threshold:Las imÃ¡genes en las pÃ¡ginas mÃ¡s pequeÃ±as que esto (bytes) tendrÃ¡n asignados los metadatos de la pÃ¡gina (el tÃ­tulo, las palabras claves, etc).
+
+HTMLImagePlugin.textrefs_threshold:El umbral para las referencias textuales. Los valores mÃ¡s bajos significan que el algoritmo es menos estricto.
+
+HTMLImagePlugin.thumb_size:Max el tamaÃ±o en miniatura. Ambos ancho y altura.
+
+HTMLPlugin.assoc_files:ExpresiÃ³n Perl normal de las extensiones de archivo para asociar con documentos html.
+
+HTMLPlugin.desc:Este plugin procesa archivos HTML
+
+HTMLPlugin.description_tags:Divide el documento en sub-secciones segÃºn aparecen las etiquetas <Section>.  '-keep_head' no tendrÃ¡ efecto cuando esta opciÃ³n estÃ© marcada.
+
+HTMLPlugin.extract_style:Extrae  informaciÃ³n de estilo y de script de la etiqueta >head> de HTML y la guarda como metadato DocumentHeader. Se establece en la pÃ¡gina de documento como _document:documentheader_ macro.
+
+HTMLPlugin.file_is_url:Marque si los nombres de los ficheros de la entrada constituyen el url de los documentos fuente originales, por ej. si una herramienta para descargar pÃ¡ginas web fuera utilizada para crear la estructura del directorio de importaciÃ³n.
+
+HTMLPlugin.hunt_creator_metadata:Localiza tantos metadatos como sea posible en autor y los coloca en el campo 'Creator'.
+
+HTMLPlugin.keep_head:No elimine los tÃ­tulos de los archivos html.
+
+HTMLPlugin.metadata_fields:Listado de campos de metadatos separados por comas para intentar extraer. Use 'tag<tagname>' para tener los contenidos del primer par <tagname> en un elemento del metadato llamado 'tagname' (nombre de etiqueta). Ponga en mayÃºsculas esto si desea el metadato en mayÃºsculas en Greenstone, ya que la extracciÃ³n de la etiqueta no es sensible a las mayÃºsculas, por ejemplo, Title,Date.  
+
+HTMLPlugin.metadata_field_separator:CarÃ¡cter separador utilizado en metadatos multi-valor. DividirÃ¡ el campo de metadato cada vez que encuentre este carÃ¡cter, y cada item serÃ¡ agregado como un metadato individual.  
+
+HTMLPlugin.no_metadata:No intente extraer metadatos de los archivos.
+
+HTMLPlugin.no_strip_metadata_html:Lista de nombres de metadatos separados por comas o 'all'. Utilizado con -description_tags, evita la supresiÃ³n de las etiquetas HTML de los valores de los metadatos especificados.
+
+HTMLPlugin.nolinks:No se esfuerce por tomar links (poniendo esta bandera puede mejorar la velocidad para crear/importar pero cualquier link relativo dentro de los documentos se romperÃ¡).
+
+HTMLPlugin.no_image_links:No hacer ningÃºn intento para capturar links a imÃ¡genes para permitir la visualizaciÃ³n de las imÃ¡genes.
+
+HTMLPlugin.rename_assoc_files:Renombra archivos asociados con documentos (por ejemplo imÃ¡genes). TambiÃ©n crea mucha estructura de directorios de poco peso (Ãºtil al crear las colecciones cd-rom).
+
+HTMLPlugin.sectionalise_using_h_tags:Crea automÃ¡ticamente un documento con secciones, usando las etiquetas h1, h2, ... hx.
+
+HTMLPlugin.title_sub:ExpresiÃ³n de sustituciÃ³n para modificar una cadena almacenada como TÃ­tulo. Usada, por ejemplo, en PDFPlugin para eliminar "PÃ¡gina 1", etc de un texto usado como tÃ­tulo.
+
+HTMLPlugin.tidy_html:Si se activa, convierte un fichero HTML en un XHTML bien formado. Permite a los usuarios ver el documento en formato libro.
+
+HTMLPlugin.old_style_HDL:Para marcar los ficheros de esta colecciÃ³n que se seccionan usando el antiguo estilo de secciÃ³n HDL.
+
+BaseMediaConverter.enable_cache:Almacenar en cache los archivos generados automÃ¡ticamente (como las miniaturas y las imÃ¡genes en tamaÃ±o pantalla) de manera que no necesiten generarse repetidamente.
+
+ImageConverter.converttotype:Convertir la imagen principal al formato 's'.
+
+ImageConverter.create_screenview:Si se configura como true, crea una imagen tamaÃ±o pantalla y asigna los metadatos Screen, ScreenType, screenicon, ScreenWidth, ScreenHeight.
+
+ImageConverter.create_thumbnail:Si se configura como true, crea una versiÃ³n miniatura de cada imagen y agrega los metadatos Thumb, ThumbType, thumbicon, ThumbWidth, ThumbHeight.
+ImageConverter.desc:Este plugin procesa las imÃ¡genes, agregando los metadatos bÃ¡sicos
+
+ImageConverter.imagemagicknotinstalled:Image Magick no estÃ¡ instalado.  
+
+ImageConverter.minimumsize:Ignore las imÃ¡genes menores que n bytes.
+
+ImageConverter.noconversionavailable:ConversiÃ³n de imagen no disponible
+
+ImageConverter.noscaleup:No sobreponga las imÃ¡genes pequeÃ±as al hacer thumbnails .
+
+ImageConverter.screenviewsize:Producir imÃ¡genes "screenview" de tamaÃ±o nxn.
+
+ImageConverter.screenviewtype:Producir imÃ¡genes "screenview" en formato 's'.
+
+ImageConverter.thumbnailsize:Realiza iconos pequeÃ±os tamaÃ±o nxn.
+
+ImageConverter.thumbnailtype:Realiza iconos pequeÃ±os en el formato 's'.
+
+ImageConverter.win95notsupported:Image Magick no estÃ¡ soportado en Win95/98
+
+ImagePlugin.desc:Este plugin procesa las imÃ¡genes, agregando los metadatos bÃ¡sicos
+
+IndexPlugin.desc:Este plugin recursivo procesa un fichero index.txt. El fichero index.txt deberÃ­a contener la lista de archivos que deberÃ¡n ser incluidos en la colecciÃ³n, seguida por cualesquiera metadatos extras que deban ser asociados con cada fichero.\n\n El fichero index.txt debe estructurarse de la siguiente manera: La primera lÃ­nea puede ser una llave (empezando con key:)  para nombrar los ficheros de metadatos (por ejemplo, key: Asunto OrganizaciÃ³n Fecha). Las lÃ­neas siguientes contendrÃ¡n un nombre de afichero seguido por el valor que se asignarÃ¡ a la entrada del metadato. (por ejemplo, 'irma/iw097e 3.2 unesco 1993' asociarÃ¡ el metadato Asunto=3.2, OrganizaciÃ³n=unesco, y Fecha=1993 con el archivo irma/iw097e si se utilizÃ³ la lÃ­nea anterior)\n\n Note que si cualquiera de los campos de los metadatos utiliza el plugin de clasificador de JerarquÃ­a, entonces el valor de ellos debe corresponder al primer campo (el descriptor) en el fichero de la clasificaciÃ³n apropiado.\n\nLos valores de los metadatos pueden nombrarse utilizando una etiqueta de manera separada (por ejemplo <Asunto>3.2) y esto prevalecerÃ¡ sobre cualquier nombre que se les haya asignado en la lÃ­nea que contiene la "key". Si no hay ninguna lÃ­nea que contenga una "key", cualquier valor sin nombre de los metadatos se denominarÃ¡ 'Asunto'.
+
+ISISPlugin.desc:Este plugin procesa las bases de datos CDS/ISIS. Por cada base de datos CDS/ISIS procesada deberÃ¡n existir tres archivos en la carpeta de importaciÃ³n de la colecciÃ³n: el archivo Maestro (.mst), la Tabla de DefiniciÃ³n de Campos (.fdt) y el Archivo de Referencias Cruzadas (.xrf)
+
+ISISPlugin.subfield_separator:La cadena de caracteres que se usa para separar subcampos en los registros de la base de datos CDS/ISIS.
+
+ISISPlugin.entry_separator:La cadena de caracteres que se usa para separar mÃºltiples valores en los campos de metadatos de los registros de la base de datos CDS/ISIS.
+
+KeyphraseExtractor.desc:Conector asociado para la generaciÃ³n de keyphrases desde el texto. Utiliza el sistema de extracciÃ³n de frases Kea.
+
+KeyphraseExtractor.extract_keyphrases:Extraer automÃ¡ticamente frases clave con Kea (opciones por defecto).
+
+KeyphraseExtractor.extract_keyphrases_kea4:Extraer frases calve automÃ¡ticamente con Kea 4.0 (configuraciÃ³n estÃ¡ndar). Kea 4.0 es una nueva versiÃ³n de Kea que ha sido desarrollada para la indizaciÃ³n controlada de documentos del campo de la agricultura.
+
+KeyphraseExtractor.extract_keyphrase_options:Opciones para extracciÃ³n de frases clave con Kea. Por ejemplo: mALIWEB - utilizar el modelo de extracciÃ³n ALIWEB; n5 - extraer 5 frases clave;, eGBK - utilizar codificaciÃ³n GBK.
+
+KeyphraseExtractor.keyphrases:frases clave
+
+KeyphraseExtractor.missing_kea:Error: el software Kea no se encuentra en %s. Por favor, descargue Kea %s de http://www.nzdl.org/Kea e instÃ¡lelo en este directorio.
+
+LaTeXPlugin.desc:Plugin para documentos LaTeX.
+
+LOMPlugin.desc:Plugin para importar ficheros LOM (Learning Object Metadata, Metadatos de Objetos de Aprendizaje).
+
+LOMPlugin.root_tag:DocType para el fichero XML (o una expresiÃ³n regular que coincida con el elemento raÃ­z).
+
+LOMPlugin.check_timestamp:Comprueba las fechas y horas de documentos previamente descargados, y sÃ³lo los descarga de nuevo si el dato es mÃ¡s moderno.
+
+LOMPlugin.download_srcdocs:Descarga el documento fuente si se indica uno (en general^identifier^entry o technical^location).). Esta opciÃ³n deberÃ­a especificar una expresiÃ³n regular que coincida con los nombres de fichero antes de su descarga. NÃ³tese que actualemnte sÃ³lo funciona para documentos fuera de un cortafuegos.
+
+MARCPlugin.desc:Plugin MARC bÃ¡sico.
+
+MARCPlugin.metadata_mapping:Nombre de fichero que incluye la correspondencia detallada de valores MARC para los nombres de los metadatos de Greenstone. Predeterminado a 'marc2dc.txt' que se encuentra en el directorio etc del sitio.
+
+MARCXMLPlugin.desc:Plugin MARCXML
+
+MARCXMLPlugin.metadata_mapping_file:Nombre del fichero que incluye los detalles de mapeado de valores MARC a nombres de metadatos Greenstone. Predefinido a 'marc2dc.txt', en el directorio etc del sitio.
+
+MediainfoOGVPlugin.desc:Plugin para la importaciÃ³n de archivos de video OGV. Requiere tener instalado Medianfo (mediainfo.sourceforge.net)  para extraer los metadatos.  
+
+MediainfoOGVPlugin.assoc_field:Nombre del campo de metadato que contendrÃ¡ el nombre del video.  
+
+MediaWikiPlugin.desc:Plugin para importar pÃ¡ginas web de MediaWiki
+
+MediaWikiPlugin.show_toc:AÃ±ade a la pÃ¡gina Sobre la colecciÃ³n la 'tabla de contenidos' de la pÃ¡gina principal del sitio de MediaWiki. Necesita una expresiÃ³n regular Perl debajo, en toc_exp, que coincida con la secciÃ³n 'tabla de contenidos'.
+
+MediaWikiPlugin.delete_toc:Borra la secciÃ³n 'tabla de contenidos' de cada pÃ¡gina HTML. Necesita especificar una expresiÃ³n regular Perl debajo, en toc_exp, que coincida con la secciÃ³n 'tabla de contenidos'.
+
+MediaWikiPlugin.toc_exp:ExpresiÃ³n regular Perl que coincida con 'tabla de contenido'. El valor predefinido coincide con las pÃ¡ginas comunes de MediaWiki.  
+
+MediaWikiPlugin.delete_nav:Boorar la secciÃ³n de navegaciÃ³n. Necesita que se especifique una expresiÃ³n regular Perl debajo, en nav_div_exp.
+
+MediaWikiPlugin.nav_div_exp:ExpresiÃ³n regular Perl que coincida con la secciÃ³n de navegaciÃ³n. El valor predefinido coincide con pÃ¡ginas comunes de MediaWiki.
+
+MediaWikiPlugin.delete_searchbox:Borrar la secciÃ³n de la caja de bÃºsqueda. Necesita especificar una expresiÃ³n regular Perl debajo, en searchbox_div_exp.
+
+MediaWikiPlugin.searchbox_div_exp:Una expresiÃ³n regular Perl para contrastar contra la secciÃ³n del cuadro de bÃºsqueda. El valor por defecto se corresponde con pÃ¡ginas web de MediaWiki
+
+MediaWikiPlugin.remove_title_suffix_exp:ExpresiÃ³n regular Perl para recortar el tÃ­tulo extraido. Por ejemplo, \\s-(.+) cortarÃ¡ el contenido del tÃ­tulo despuÃ©s de "-".
+
+MetadataCSVPlugin.desc:Plugin para metadatos en formato de valores separados pro comas. El campo Filename del fichero CSV se usa para determinar a que documento pertenece el metadato.
+
+MetadataPass.desc:Clase base separada a BasePlugin que soporta que los conectores de metadato utilicen la pasada metadata_read del import.pl
+
+MetadataXMLPlugin.desc:Conector que procesa archivos metadata.xml.
+
+GreenstoneMETSPlugin.desc:Procesa documentos METS en el estilo de Greenstone
+
+MP3Plugin.desc:Plugin para procesar archivos MP3.
+
+MP3Plugin.assoc_images:Use la bÃºsqueda de imÃ¡genes de Google para localizar imÃ¡genes relacionadas con ficheros  MP3 usando TÃ­tulo ID3 y metadato de Artista.
+
+MP3Plugin.applet_metadata:Usado para almacenar [applet] metadatos para cada documento que contiene el HTML necesario para que un applet de audio MP3 pueda reproducir ese archivo.
+
+MP3Plugin.metadata_fields:Lista de campos de metadatos separados por comas, a extraer (asumiendo los existentes) de un archivo MP3. Use \"*\" para extraer todos los campos.
+
+NulPlugin.desc:Plugin de fichero nulo (.nul). Utilizado con los archivos producidos al expandir los ficherosos de la base de datos de metadatos.
+
+NulPlugin.assoc_field:Nombre del campo de metadato a asignar para cada fichero nulo.
+NulPlugin.add_metadata_as_text:AÃ±adir una tabla de metadatos como el texto del documento, antes que "Este documento no tiene texto".
+
+NulPlugin.remove_namespace_for_text:Borra los espacios de nombres de los nombres de metadatos en el texto del documento (si se ha marcado add_metadata_as_text).
+
+OAIPlugin.desc:Plugin bÃ¡sico para Open Archives Initiative (OAI)
+
+OAIPlugin.document_field:El elemento de metadato que especifica el nombre del archivo del documento al cual adjuntar los metadatos.
+
+OAIPlugin.metadata_set:Conjunto de metadatos (prefijo del nombre de esquema) al cual importar todos los metadatos
+OAIPlugin.metadata_set.auto:Usar los prefijos especificados en el registro OAI
+OAIPlugin.metadata_set.dc:Usar el prefijo dc. MapearÃ¡ elementos dc cualificados a su forma Greenstone, por ej., spatial se convertirÃ¡ en dc.Coverage^spatial.
+
+OAIMetadataXMLPlugin.desc:VersiÃ³n de MetadataXMLPlugin que procesa archivos metadata.xml. Adicionalmente, utiliza el campo "dc.Identifier" y extrae metadatos OAI desde el servidor de OAI especificado (-oai_server_http_path)  
+
+OAIMetadataXMLPlugin.oai_server_http_path:Ruta HTTP al server de OAI - por ejemplo, http://test.com/oai_server/oai.pl  
+
+OAIMetadataXMLPlugin.metadata_prefix:Prefijo de metadato OAI - por defecto es oai_dc.  
+
+OAIMetadataXMLPlugin.koha_mode:Si estÃ¡ especificado, el plugin tratarÃ¡ de generar el metadato oaiextracted.koharecordlink. Este metadato contiene el link al documento Koha.  
+
+OggVorbisPlugin.add_technical_metadata:AÃ±adir metadatos tÃ©cnicos (ej. bitrate)
+
+OggVorbisPlugin.desc:Plugin para importar archivos de audio Ogg Vorbis.
+
+OpenDocumentPlugin.desc:Plugin para documentos en formato OASIS OpenDocument (usado por OpenOffice 2.0)
+
+PagedImagePlugin.desc:Plugin para documentos hechos con secuencias de imÃ¡genes, con texto opcional de OCR para cada imagen. Procesa ficheros .item qye listan la secuencia de ficheros de imÃ¡genes y texto, y proveen los metadatos.
+
+PagedImagePlugin.documenttype:Establecer el tipo de documento (usado para despliegue)
+
+PagedImagePlugin.documenttype.paged:Los documentos paginados tienen flechas "siguiente" y "anterior", asÃ­ como una opciÃ³n para "ir a la pÃ¡gina X"
+
+PagedImagePlugin.documenttype.hierarchy:Los documentos jerÃ¡rquicos tienen una tabla de contenido
+
+PagedImagePlugin.headerpage:AÃ±adir una cabecera de pÃ¡gina de nivel principal (que no contenga imagen) a cada documento.
+
+PDFPlugin.allowimagesonly:Permitir ficheros PDF con texto no extraÃ­ble. Evitar tener indicado -complex set. SÃ³lo Ãºtil con convert_to html.
+
+PDFPlugin.complex:Crea una salida mÃ¡s compleja. Con esta opciÃ³n marcada los html resultantes se parecerÃ¡n mucho mÃ¡s al archivo PDF original. Para que funcione adecuadamente debe tener instalado Ghostscript (para *nix gs debe estar su ruta, mientras que para windows se debe tener gswin32c.exe en el path).
+
+PDFPlugin.desc:Plugin que procesa documentos PDF.
+
+PDFPlugin.nohidden:Prevenga al pdftohtml de intentar extraer texto oculto. Esto sÃ³lo es Ãºtil si la opciÃ³n -complex estÃ¡ determinada.
+
+PDFPlugin.noimages:No intente extraer las imÃ¡genes de PDF.
+
+PDFPlugin.use_sections:Cree una secciÃ³n separada para cada pÃ¡gina del archivo de PDF.
+
+PDFPlugin.zoom:El factor por el cual se hace acercamiento al PDF para la salida (esto sÃ³lo es Ãºtil si el -complex esta determinado).
+
+PostScriptPlugin.desc:Este es un ps \"poor manâs\" para convertidor de texto. Si si plan es serio, considere utilizar el paquete PRESCRIPT, para bajarlo lo podrÃ¡ encontrar en http://www.nzdl.org/html/software.html
+
+PostScriptPlugin.extract_date:Extrae la fecha del encabezado de PS.
+
+PostScriptPlugin.extract_pages:Extrae las pÃ¡ginas del encabezado de PS.
+
+PostScriptPlugin.extract_title:Extrae el encabezado de PS inicial.
+
+PowerPointPlugin.desc:Conector para importar archivos de Microsoft PowerPoint.
+
+PowerPointPlugin.windows_scripting:Usa la tecnologÃ­a de scripting de MicroSoft Windows (Visual Basic for Applications) para convertir documentos PPT a varios tipos de imagen (ej. JPEG,PNG,GIF), en vez de hacerlo con el paquete de software libre ppttohtml.
+
+PowerPointPlugin.convert_to.html_multi:Una serie de pÃ¡ginas HTML, dos por cada diapositiva. Una para la imagen de la diapositiva y una por el texto de la misma (se necesita la opciÃ³n -openoffice_conversion).  
+
+PowerPointPlugin.convert_to.pagedimg:Una serie de imÃ¡genes JPEG (se necesita la opciÃ³n -openoffice_conversion).  
+
+PowerPointPlugin.convert_to.pagedimg_jpg:Una serie de imÃ¡genes en formato JPEG (se necesita -windows_scripting).  
+
+PowerPointPlugin.convert_to.pagedimg_gif:Una serie de imÃ¡genes GIF (se necesita -windows_scripting).  
+
+PowerPointPlugin.convert_to.pagedimg_png:Una serie de imÃ¡genes en formato PNG (se necesita -windows_scripting).  
+
+PrintInfo.bad_general_option:El % del plugin utiliza una opciÃ³n general incorrecta (las opciones generales estÃ¡n disponibles para todos los plugins). Revise su fichero de configuraciÃ³n collect.cfg.
+
+PrintInfo.desc:La mayorÃ­a de los conectores bÃ¡sicos permiten la impresiÃ³n de informaciÃ³n (usando pluginfo.pl) y el anÃ¡lisis de los argumentos.
+
+ProCitePlugin.desc:Plugin para bases de datos Procite (exportadas)
+
+ProCitePlugin.entry_separator:La cadena usada para separar valores mÃºltiples para campos de metadatos simples en registros de ProCite.
+
+ReadTextFile.could_not_extract_encoding:ALERTA: codificando no podrÃ­an extraerse de % s - predefiniendo a % s
+
+ReadTextFile.could_not_extract_language:ALERTA: el idioma no podrÃ­a extraerse de % s - predefiniendo a % s
+
+ReadTextFile.could_not_open_for_reading:no podrÃ¡ abrir % s ni leerlos
+
+ReadTextFile.default_encoding:Utilice esta codificaciÃ³n si -input_encoding estÃ¡ puesto en âautoâ y el algoritmo de categorizaciÃ³n de texto no puede extraer el cÃ³digo o extrae un cÃ³digo que Greenstone no soporte. Esta opciÃ³n puede tomar los mismos valores que -input_encoding.
+
+ReadTextFile.default_language:Si Greenstone no identifica el lenguaje del documento, el elemento del metadato se colocarÃ¡ en este valor. El valor predeterminado es 'en' (se usan los sÃ­mbolos de lenguaje ISO 639: en = inglÃ©s). Note que si -input_encoding no estÃ¡ en 'auto' y -extract_language no estÃ¡ definido, todos los documentos tendrÃ¡n el metadato 'Lenguaje' ajustado a este valor.
+
+ReadTextFile.desc:Conector base para archivos de texto plano.
+
+ReadTextFile.empty_file:el archivo no contiene ningÃºn texto
+
+ReadTextFile.extract_language:Identifica el idioma de cada documento y establece el 'lenguaje' del metadato. Note que esto se harÃ¡ automÃ¡ticamente si -input_encoding estÃ¡ en 'auto'.
+
+ReadTextFile.file_has_no_text:ERROR: % s no contiene texto alguno
+
+ReadTextFile.input_encoding:La codificaciÃ³n de los documentos de la fuente. Los documentos se convertirÃ¡n de estas codificaciones y se guardarÃ¡n internamente como utf8.
+
+ReadTextFile.input_encoding.auto:Use el algoritmo de categorizaciÃ³n de texto para identificar la codificaciÃ³n de cada fuente de documento automÃ¡ticamente. Esto serÃ¡ mÃ¡s lento que poniendo la codificaciÃ³n explÃ­citamente pero trabajarÃ¡ en donde mÃ¡s de una codificaciÃ³n se use dentro de la misma colecciÃ³n.
+
+ReadTextFile.read_denied:Lea permiso negado para % s
+
+ReadTextFile.separate_cjk:Inserta espacios entre caracteres Chinos/Japoneses/Coreanos para hacer cada carÃ¡cter una palabra. Usar si el texto no estÃ¡ segmentado.
+
+ReadTextFile.unsupported_encoding:ALERTA: % s aparece para ser codificado en un cÃ³digo sin apoyo (% s) â usando % s
+
+ReadTextFile.wrong_encoding:ALERTA: %s fue leÃ­do utilizando la codificaciÃ³n %s pero parece haber sido codificado como % s.
+
+ReadXMLFile.desc:La clase base para plugins XML.
+
+ReadXMLFile.xslt:Transforma un documento de entrada que cumple la condiciÃ³n con la XSLT contenida en el nombre de fichero. Se asume que existe un nombre de fichero relativo en el Ã¡rea de ficheros de la colecciÃ³n, por ejemplo etc/mods2dc.xsl.
+
+RealMediaPlugin.desc:Plugin para procesar ficheros Real Media
+
+ReferPlugin.desc:ReferPlug lee archivos bibliogrÃ¡ficos en formato Refer.
+
+RogPlugin.desc:Crea los documentos simples single-level (de nivel Ãºnico) a partir de archivos .rog o .mdb.
+
+RTFPlugin.desc:Plugin para importar ficheros en Formato de Texto Enriquecido  (Rich Text Format, RTF)
+
+SourceCodePlugin.desc:Nombre de Archivo utilizado actualmente para TÃ­tulo (opcionalmente menos algÃºn prefijo). Languages actuales:\ntextl: READMEs/Makefiles\nC/C++ (actualmente los extractos #incluye las declaraciones y clase C++ decls)\nPerl (actualmente sÃ³lo elaborado como texto)\nShell (actualmente sÃ³lo elaborado como texto)
+
+SourceCodePlugin.remove_prefix:Elimine este modelo principal del nombre del archivo (eg - remove_prefix /tmp/XX/src/). El valor predeterminado es eliminar la ruta completa del nombre del archivo.
+
+SplitTextFile.desc:SplitTextFile es un conector para dividir archivos de entrada en segmentos que se procesarÃ¡n de manera individual. Este conector no debe llamarse de manera directa.  En cambio, si usted necesita procesar archivos input que contienen varios documentos, debe escribir un conector con una funciÃ³n de proceso que manejarÃ¡ uno de esos documentos habiÃ©ndolo tomado de SplitTextFile. Vea ReferPlugin para un ejemplo.
+
+SplitTextFile.split_exp:Una expresiÃ³n Perl regular para separar la entrada de ficheros en segmentos.
+
+StructuredHTMLPlugin.desc:Plugin para procesar documentos HTML estructurados, dividiÃ©ndolos en secciones basadas en la informaciÃ³n de estilos.
+
+StructuredHTMLPlugin.delete_toc:Borra cada tabla de contenidos, lista de figuras, etc., del fichero HTML convertido. Los estilos para ello se definen con la opciÃ³n toc_header
+
+StructuredHTMLPlugin.title_header:posible estilo definido por el usuario para la cabecera de tÃ­tulo.
+
+StructuredHTMLPlugin.level1_header:posibles estilos definidos por el usuario para la cabecera nivel1 en el documento HTML (equivalente a <H1>).
+
+StructuredHTMLPlugin.level2_header:posibles estilos definidos por el usuario para la cabecera de nivel2 en el documento HTML (equivalente a <h2>).
+
+StructuredHTMLPlugin.level3_header:posibles estilos definidos por el usuario para la cabecera nivel3 en el documento HTML (equivalente a <h3>).
+
+StructuredHTMLPlugin.toc_header:posibles estilos de cabecera definidos por el usuario para tabla de contenidos, tabla de figuras, etc., se borra si se selecciona delete_toc
+
+TextPlugin.desc:Crea un documento simple de nivel Ãºnico (single-level). Agrega el metadato TÃ­tulo de la primera lÃ­nea de texto (hasta 100 caracteres).
+
+TextPlugin.title_sub:ExpresiÃ³n de substituciÃ³n para modificar la cadena guardada como TÃ­tulo. Por ejemplo, PSPlug para eliminar "PÃ¡gina 1" etc del texto utilizado como tÃ­tulo.
+
+UnknownPlugin.assoc_field:Nombre del campo del metadato que mantendrÃ¡ el nombre del fichero asociado.
+
+UnknownPlugin.desc:Plugin simple para los ficherosos importados en formatos que Greenstone no soporta. CrearÃ¡ un documento virtual para cada uno de esos ficheros, cada uno de ellos se pasarÃ¡ a Greenstone como fichero asociado \âassociated file\â del documento.
+
+UnknownPlugin.file_format:Tipo de archivo (ej: MPEG, MIDI, âŠ)
+
+UnknownPlugin.mime_type:Tipo mime del archivo (por ejemplo image/gif).
+
+UnknownPlugin.process_extension:Procesar archivos con esta extensiÃ³n de archivo. Esta oopciÃ³n es una alternativa a process_exp mÃ¡s sencilla de usar pero menos flexible.
+
+UnknownPlugin.srcicon:Indique un nombre de macro (sin guiones bajos) para usar como metadato de srcicon.
+
+WordPlugin.desc:Plugin importador para los documentos de Microsoft Word.
+
+WordPlugin.windows_scripting:Usa la tecnologÃ­a de scripting de MicroSoft Windows (Visual Basic for Applications) para convertir Word a HTML, mejor que usar sÃ³lo el software libre WvWare. Hace que se abra la aplicaciÃ³n Word en la pantalla si no se estÃ¡ ejecutando previamente.
+
+WordPlugin.metadata_fields:Para recuperar metadatos del documento HTML convertido por un script VB. Permite a los usuarios definir una lista, separada por comas, de campos de metadatos que intentarÃ¡ extraer. Use 'tag<tagname>' para poner los contenidos del primer par <tagname> e un elemento de metadato llamado 'tagname'. Ponga las mayÃºsculas como quiera que se pongan en los metadatos en Greenstone, ya que la extracciÃ³n de etiquetas no es sensible a ello.
+
+ZIPPlugin.desc:Plugin que se ocupa de los formatos comprimidos y/o archivados de entrada los formatos actualmente manejados y las extensiones de archivo son are:\ngzip de (.gz. z. el tgz. taz)\nbzip (.bz)\nbzip2 (.bz2)\nzip (.zip. .jar)\ntar\n\n Este plugin confÃ­a en las utilerÃ­as siguientes que estÃ¡n presentes (si estÃ¡ intentando procesar formatos correspondientes) :\ngunzip (para gzip)\nbunzip (para bzip)\nbunzip2 \nunzip (para zip)\ntar (para tar)
+
+#
+# Download module option descriptions
+#
+
+BaseDownload.desc:Clase bÃ¡sica para mÃ³dulos de descarga
+BaseDownload.bad_general_option:El mÃ³dulo de descarga %s usa una opciÃ³n incorrecta.
+MediaWikiDownload.desc:MÃ³dulo para descargar sitios web construidos con MediaWiki
+MediaWikiDownload.reject_filetype:Lista de urls a ignorar, separados por comas, ej. *cgi-bin*,*.ppt ignorarÃ¡ todos los enlaces que incluyan 'cgi-bin' o '.ppt'
+MediaWikiDownload.reject_filetype_disp:Ignorar patrones de URL
+MediaWikiDownload.exclude_directories:Lista de exclusiÃ³n de directorios (debe incluir la ruta completa al directorio), ej. /gente,/documentacion excluirÃ¡ los subdirectorios "gente" y "documentacion" en el sitio que se estÃ¡ capturando.
+MediaWikiDownload.exclude_directories_disp:Excluir directorios
+
+OAIDownload.desc:MÃ³dulo para descargar de repositorios OAI
+OAIDownload.url_disp:URL fuente
+OAIDownload.url:URL de repositorio OAI
+OAIDownload.set_disp:Restringir al conjunto
+OAIDownload.set:Restringe la descarga al conjunto indicado en el repositorio
+OAIDownload.metadata_prefix_disp:Prefijo de metadato
+OAIDownload.metadata_prefix:El formato de metadato usado en la exportaciÃ³n, ej. Oai_dc, qdc, etc. Presione el botÃ³n <InformaciÃ³n del servidor> para conocer que formatos son soportados.
+OAIDownload.get_doc_disp:Obtener documento
+OAIDownload.get_doc:Descarga el documento fuente si no se indica ninguno en el registro
+OAIDownload.get_doc_exts_disp:Solo incluir tipos de archivos
+OAIDownload.get_doc_exts:Extensiones de archivos de documentos permitidas
+OAIDownload.max_records_disp:MÃ¡ximo de registros
+OAIDownload.max_records:NÃºmero mÃ¡ximo de registros a descargar
+
+SRWDownload.desc:MÃ³dulo para descargar de un repositorio SRW (Search/Retrieve Web Service)
+
+WebDownload.desc:MÃ³dulo para descargar de internet mediante HTTP o FTP
+WebDownload.url:URL origen. En caso de redirects de HTTP, este valor puede cambiar.
+WebDownload.url_disp:URL fuente
+WebDownload.depth:NÃºmero de profundidad de enlaces a seguir cuando descargue
+WebDownload.depth_disp:Profundidad de descarga
+WebDownload.below:SÃ³lo ficheros de copia bajo este URL
+WebDownload.below_disp:SÃ³lo archivos por debajo de este URL
+WebDownload.within:SÃ³lo ficheros de copia dentro del mismo sitio
+WebDownload.within_disp:SÃ³lo archivos dentro del sitio
+WebDownload.html_only:Descaragar sÃ³lo ficheros HTML, e ignorar ficheros asociados, por ej. imÃ¡genes y hojas de estilo
+WebDownload.html_only_disp:SÃ³lo archivos HTML
+
+WgetDownload.desc:Clase bÃ¡sica que maneja las llamadas a wget
+WgetDownload.proxy_on:Proxy activado
+WgetDownload.proxy_host:Servidor proxy
+WgetDownload.proxy_port:Puerto del proxy
+WgetDownload.user_name:Nombre de usuario
+WgetDownload.user_password:Clave de usuario
+
+Z3950Download.desc:MÃ³dulo para descargar de repositorios Z3950
+Z3950Download.host:URL del servidor
+Z3950Download.host_disp:Servidor
+Z3950Download.port:NÃºmero de puerto del repositorio
+Z3950Download.port_disp:Puerto
+Z3950Download.database:Base de datos en la que buscar registros
+Z3950Download.database_disp:Base de datos
+Z3950Download.find:Recupera registros que contienen el tÃ©rmino de bÃºsqueda indicado
+Z3950Download.find_disp:Encontrar
+Z3950Download.max_records:NÃºmero mÃ¡ximo de registros a descargar
+Z3950Download.max_records_disp:MÃ¡ximo de registros
+
+
+#
+#Plugout option descriptions
+#
+
+BasPlugout.bad_general_option:La salida %s usa una opciÃ³n general incorrecta.
+BasPlugout.debug:Fijar el modo depuraciÃ³n  
+BasPlugout.desc:Clase bÃ¡sica para todos las salidas de exportaciÃ³n.
+BasPlugout.group_size:NÃºmero de documentos a agrupar en un fichero XML.
+BasPlugout.gzip_output:Usar gzip para comprimir los documentos xml resultantes (no olvide incluir ZIPPlugin en su lista de conectores cuando construya con documentos compactados).
+BasPlugout.output_handle:descriptor de archivo usado para enviar la informaciÃ³n de salida  
+BasPlugout.output_info:Referencia a un objeto arcinfo usado para almacenar informaciÃ³n sobre los archivos.  
+BasPlugout.verbosity:Controla la cantidad de salida. 0=nada, 3=mucha.
+BasPlugout.xslt_file:Transforma un documento con XSLT en el fichero indicado.
+
+DSpacePlugout.desc:formato de archivo DSpace
+
+FedoraMETSPlugout.desc:Formato METS usando el perfil de Fedora.
+FedoraMETSPlugout.fedora_namespace:El prefijo usado en Fedora para los ids de procesos (PIDS), ej. Greenstone:HASH0122efe4a2c58d0
+
+GreenstoneXMLPlugout.desc:Formato de archivo XML de Greenstone.
+
+GreenstoneMETSPlugout.desc:Formato METS usando el perfil de Greenstone.
+
+MARCXMLPlugout.desc:Formato MARC xml.
+MARCXMLPlugout.group:Exporta los registros marc xml a un Ãºnico archivo.
+MARCXMLPlugout.mapping_file:Usa el archivo de mapeo indicado para la transformaciÃ³n.
+
+METSPlugout.desc:Conector de salida superclase para el formato METS. Provee funcionalidades comunes para perfiles como GreenstoneMETS y FedoraMETS y mÃ©todos abstractos de claves.
+METSPlugout.xslt_txt:Transforma un fichero doctxt.xml de mets con la XSLT en el archivo indicado.
+METSPlugout.xslt_mets:Transforma un fichero docmets.xml de mets con la XSLT en el archivo nombrado.
+
+#
+# Perl module strings
+#
+
+classify.could_not_find_classifier:ERROR: no encontrÃ³ el clasificador \â% s\â
+
+download.could_not_find_download:ERROR: no se puede encontrar el mÃ³dulo de descarga \"%s\"
+
+plugin.could_not_find_plugin:ERROR: No podrÃ¡ encontrar el plugin \"% s\"
+
+plugin.including_archive:inclusive los volÃºmenes de 1 archivo de ZIP/TAR
+
+plugin.including_archives:inclusive los volÃºmenes de %d los archivos de ZIP/TAR
+
+plugin.kill_file:Proceso terminado por el fichero .kill
+
+plugin.n_considered:%d de los documentos fueron considerados a efecto de ser procesados
+
+plugin.n_included:%d se procesaron e incluidos en la colecciÃ³n
+
+plugin.n_rejected:%d rechazados
+
+plugin.n_unrecognised:%d no fueron reconocidos
+
+plugin.no_plugin_could_process:ADVIRTIENDO: NingÃºn plugin podrÃ¡ ser procesado %s
+
+plugin.no_plugin_could_recognise:ATENCIÃN: NingÃºn plugin pudo reconocer %s
+
+plugin.no_plugin_could_process_this_file:ningÃºn plugin podrÃ¡ procesar este archivo
+
+plugin.no_plugin_could_recognise_this_file:ningÃºn plugin pudo reconocer este archivo
+
+plugin.one_considered:1 documento fue considerado a efecto de ser procesado
+
+plugin.one_included:1 fue procesado e incluido en la colecciÃ³n
+
+plugin.one_rejected:1 fue rechazado
+
+plugin.one_unrecognised:1 no fue reconocido
+
+plugin.see_faillog:Vea en %s una lista de documentos no reconocidos y/o rechazados
+
+PrintUsage.default:Valor predeterminado (default)
+
+PrintUsage.required:REQUERIDO
+
+plugout.could_not_find_plugout:ERROR: No se pudo encontrar salida \"%s\"
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/strings_fr.properties
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/strings_fr.properties	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/strings_fr.properties	(revision 24799)
@@ -0,0 +1,1380 @@
+#
+# Resource bundle description
+#
+
+Language.code:fr
+Language.name:FranÃ§ais
+
+OutputEncoding.unix:iso_8859_1
+OutputEncoding.windows:iso_8859_1
+
+
+#
+# Common output messages and strings
+#
+
+common.cannot_create_file:ERREUR: impossible de crÃ©er le fichier %s
+
+common.cannot_find_cfg_file:ERREUR: fichier de configuration introuvable %s
+
+common.cannot_open:ERREUR: impossible d'ouvrir %s
+
+common.cannot_open_fail_log:ERREUR: Impossible d'ouvrir le log d'Ã©chec %s
+
+common.cannot_open_output_file:ERREUR: impossible d'ouvrir le fichier output %s
+
+common.cannot_read:ERREUR: impossible de lire %s
+
+common.cannot_read_file:ERREUR: impossible de lire le fichier %s
+
+common.general_options:options gÃ©nÃ©rales (pour %s)
+
+common.must_be_implemented:fonction doit Ãªtre implÃ©mentÃ©e dans sous-classe
+
+common.options:options
+
+common.processing:traitement
+
+common.specific_options:options spÃ©cifiques
+
+common.usage:Utilisation
+
+common.info:info
+
+common.invalid_options:Arguments non valides: %s
+
+common.true:vrai
+
+common.false:faux
+
+common.deprecated:OBSOLETE
+#
+# Script option descriptions and output messages
+#
+
+scripts.language:Langue dans laquelle les descriptions d'option sont affichÃ©es (ex. 'en_US' spÃ©cifie l'anglais amÃ©ricain). NÃ©cessite des traductions des descriptions d'options qui sont prÃ©sentes dans le fichier perllib/strings_language-code.rb.
+
+scripts.xml:Produit l'information sous forme XML, sans 'jolis' commentaires mais avec beaucoup plus de dÃ©tails.
+
+scripts.listall:Liste tous les Ã©lÃ©ments connus.
+
+scripts.describeall:Des options d'affichage de tous les Ã©lÃ©ments connus
+
+scripts.both_old_options:AVERTISSEMENT: - removeold a Ã©tÃ© spÃ©cifiÃ© avec - keepold ou -incremental, par dÃ©faut sera  -removeold. Le contenu actuel du rÃ©pertoire %s sera supprimÃ©.
+
+scripts.no_old_options:AVERTISSEMENT: Aucune des options  -removeold, - keepold ou --incremental n'a Ã©tÃ© prÃ©cisÃ©e, par dÃ©faut sera mis  -removeold. Les contenus actuels du rÃ©pertoire %s sera supprimÃ©.
+
+scripts.gli:Un drapeau positionnÃ© lorsque ce script est lancÃ© Ã  partir de l'Interface BibliothÃ©caire, permet d'avoir une sortie spÃ©cifique pour l'Interface BibliothÃ©caire.
+
+
+
+
+
+# -- buildcol.pl --
+
+buildcol.archivedir:LÃ  oÃ¹ se trouvent les archives.
+
+buildcol.builddir:LÃ  oÃ¹ mettre les indexes construits.
+
+buildcol.cachedir:La collection sera temporairement construite ici avant d'Ãªtre copiÃ©e dans le le rÃ©pertoire de construction.
+
+buildcol.cannot_open_cfg_file:ATTENTION: Impossible d'ouvrir le fichier de configuration pour mise Ã  jour: %s
+
+buildcol.collectdir:Le chemin du rÃ©pertoire Â«Â collectÂ Â»
+
+buildcol.copying_back_cached_build:Recopie de la construction mise en cache
+
+buildcol.create_images:Tente de crÃ©er des images par dÃ©faut pour la nouvelle collection. Cela dÃ©pend de l'installation de Gimp en mÃªme temps que les modules qui vont avec pour permettre l'Ã©criture de scripts Ã  partir de perl.
+
+buildcol.debug:Imprimer la sortie sur STDOUT.
+
+buildcol.desc:Script PERL utilisÃ© pour construire une collection Greenstone Ã  partir de documents archives.
+
+buildcol.faillog:Nom de fichier log d'Ã©chec. Ce fichier log reÃ§oit les noms de fichiers de tous les fichiers qu'on n'a pas pu traiter.
+
+buildcol.incremental_default_builddir:ATTENTION : le rÃ©pertoire de construction est 'building' par dÃ©faut. Si vous voulez Ã©tendre le rÃ©pertoire d'indexation de maniÃšre incrÃ©mentale, veuillez ajouter l'option "-builddir index" Ã  la commande buildcol.pl.
+
+buildcol.index:Index Ã  construire (va construire toust dans le fichier de configuration si pas dÃ©fini).
+
+buildcol.incremental:Indexe seuls les documents qui n'ont pas Ã©tÃ© prÃ©alablement indexÃ©s. Implique -keepold. Repose sur l' indexeur lucene.
+
+buildcol.keepold:Ne dÃ©truira pas les contenus actuels du rÃ©pertoire de construction.
+
+buildcol.maxdocs:Nombre maximum de documents Ã  construire.
+buildcol.maxnumeric:Le nombre maximum de chiffres un "mot" peut avoir dans le dictionnaire de l'index. Les grands nombres sont divisÃ©s en plusieurs mots pour l'indexation. Par exemple, si maxnumeric est 4, "1342663" sera dÃ©composÃ© en "1342" et "663".
+buildcol.mode:Les parties du processus de construction Ã  mener.
+buildcol.mode.all:Tout faire.
+buildcol.mode.build_index:Indexer le texte uniquement.
+buildcol.mode.compress_text:Compresser le texte uniquement.
+buildcol.mode.infodb:Construire la base de donnÃ©es des mÃ©ta-donnÃ©es uniquement.
+
+buildcol.no_default_images:Des images par dÃ©faut ne seront gÃ©nÃ©rÃ©es.
+
+buildcol.no_image_script:ATTENTION: script de fabrication d'images introuvable: %s
+
+buildcol.no_strip_html:Ne pas enlever les balises html du texte indexÃ© (utilisÃ© seulement pour les collections mgpp).
+
+buildcol.no_text:Ne pas stocker de texte compressÃ©. Cette option est utile pour la rÃ©duction de la taille des indexes incorporÃ©s si vous voulez toujours afficher les documents originaux en temps voulu (c'est Ã  dire que vous ne pouvez pas retrouver la version du texte compressÃ©).
+
+buildcol.sections_index_document_metadata:Indexe les mÃ©tadonnÃ©es de niveau document au niveau section
+buildcol.sections_index_document_metadata.never:N'indexe aucune mÃ©tadonnÃ©e de document au niveau section.
+buildcol.sections_index_document_metadata.always:Ajoute toutes les mÃ©tadonnÃ©es spÃ©cifiÃ©es d'un niveau document  mÃªme s'il existe une mÃ©tadonnÃ©es de niveau section de ce nom.
+buildcol.sections_index_document_metadata.unless_section_metadata_exists:N' ajouter le document de niveau metadata que si le nom de section de niveau metadata n'existe pas.
+
+buildcol.out:Nom de fichier ou de contrÃŽle vers lequel envoyer le statut de sortie.
+
+buildcol.params:[options] nom de collection
+
+buildcol.remove_empty_classifications:Cacher les nÅuds de classeurs et classification (ceux qui sont vides, sans documents)
+
+buildcol.removeold:Ãliminera les anciens contenus du rÃ©pertoire "building".
+
+buildcol.unlinked_col_images:Les images de la collection peuvent ne pas Ãªtre correctement Ãªtre liÃ©es.
+
+buildcol.unknown_mode:Mode inconnu: %s
+
+buildcol.updating_archive_cache:Mise Ã  jour du cache d'archive
+
+buildcol.verbosity:ContrÃŽle la quantitÃ© de sortie. 0=aucun, 3= beaucoup.
+
+
+# -- classinfo.pl --
+
+classinfo.collection:En donnant un nom Ã  la collection fera que classinfo.pl va regarder d'abord dans collect/nom-de-collection/perlib/classify. Si le classificateur n'est pas trouvÃ©, il va alors chercher dans le rÃ©pertoire gÃ©nÃ©ral perlib/classify.
+
+classinfo.desc:Impime l'information sur un classificateur.
+
+classinfo.general_options:Options gÃ©nÃ©rales hÃ©ritÃ©es de classes parentes du classificateur.
+
+classinfo.info:info
+
+classinfo.no_classifier_name:ERREUR: Vous devez donner un nom de classificateur.
+
+classinfo.option_types:Les classificateurs peuvent prendre deux types d'options
+
+classinfo.params:[options] nom de classificateur
+
+classinfo.passing_options:Les options peuvent Ãªtre passÃ©es Ã  tout classificateur en les intÃ©grant au fichier de configuration de votre collection collect.cfg.
+
+classinfo.specific_options:Les options spÃ©cifiques sont dÃ©finies dans le classificateur lui mÃªme, et sont disponibles seulement pour ce classificateur particulier.
+
+# -- downloadfrom.pl --
+downloadfrom.cache_dir:L'emplacement du rÃ©pertoire cache
+downloadfrom.desc:TÃ©lÃ©charger des fichiers Ã  partir d'un serveur externe
+downloadfrom.download_mode:Le type de serveur Ã  partir duquel tÃ©lÃ©charger
+downloadfrom.download_mode.Web:HTTP
+downloadfrom.download_mode.MediaWiki:Site de MediaWiki
+downloadfrom.download_mode.OAI:Initiative Archives Ouvertes
+downloadfrom.download_mode.z3950:Serveur z3950
+downloadfrom.download_mode.SRW:Service web SearchRetrieve
+downloadfrom.incorrect_mode:Le paramÃštre Download_mode est incorrect.
+downloadfrom.info:Imprimer les informations sur le serveur, plutÃŽt que le tÃ©lÃ©charger
+downloadfrom.params:[options gÃ©nÃ©rales] [options spÃ©cifiques de tÃ©lÃ©chargement]
+
+# -- downloadinfo.pl --
+
+downloadinfo.desc:Imprimer des informations sur un module de tÃ©lÃ©chargement
+downloadinfo.collection:Donner un nom de collection fera regarder en premier downloadinfo.pl dans collecter/collection nom/perllib/tÃ©lÃ©chargeurs. Si le module n'est pas trouvÃ© lÃ , il regardera dans le rÃ©pertoire gÃ©nÃ©ral perllib/ tÃ©lÃ©chargeurs .
+downloadinfo.params:[options] [module-tÃ©lÃ©chrgement]
+downloadinfo.general_options:Les ptions gÃ©nÃ©rales sont hÃ©ritÃ©es des classes parents des modules de tÃ©lÃ©chargement .
+downloadinfo.specific_options:Les options spÃ©cifiques sont dÃ©finis dans le module de tÃ©lÃ©chargement lui-mÃªme, et ne sont disponibles que pour ce tÃ©lÃ©chargeur.
+downloadinfo.option_types:Les modules de tÃ©lÃ©chargement peuvent prendre deux types d'options
+
+# -- explode_metadata_database.pl --
+explode.desc:Ãclater la base de donnÃ©es mÃ©ta-donnÃ©es.
+
+explode.collection:Le nom de la collection. Certains plugiciels recherchent des fichiers complÃ©mentaires dans le dossier de la collection.
+ 
+explode.document_field:L'Ã©lÃ©ment de metadata indiquant le nom de fichier des documents Ã  obtenir et inclure dans la collection.
+
+explode.document_prefix:PrÃ©fixe pour localiser les documents (s'utilise avec l'option "document_field").
+
+explode.document_suffix:Suffixe pour localiser les documents (s'utilise avec l'option "document_field").
+
+explode.encoding:Encodage Ã  utiliser lors de la lecture de la base de donnÃ©es
+explode.metadata_set:Jeu mÃ©ta-donnÃ©es (espace nom) pour exporter toutes les mÃ©ta-donnÃ©es comme
+explode.plugin:Plugin Ã  utiliser pour Ã©clater
+explode.plugin_options:Options Ã  transmettre au plugiciel avant son utilisation. Les options doivent commencer par -. Il faut sÃ©parer les options et leurs valeurs par un espace. Ne peut pas Ãªtre utilisÃ© avec l'option -use_collection_plugin_options.
+explode.use_collection_plugin_options:Lit le fichier de configuration de la collection et utilise les options propres au plugiciel. NÃ©cessite l'activation de l'option -collection. Ne peut pas Ãªtre utilisÃ© avec le paramÃštre -plugin_options.
+explode.params:[options] nom de fichier
+explode.records_per_folder:Le nombre d'enregistrements Ã  mettre dans chaque sous-dossier.
+
+# -- replace_srcdoc_with_html.pl --
+srcreplace.desc:Remplace le document source par le fichier HTML gÃ©nÃ©rÃ© lors de la reconstruction
+srcreplace.params:[options] nom de fichier
+srcreplace.plugin:Plugiciel Ã  utiliser pour convertir le document source
+
+# -- exportcol.pl --
+
+exportcol.out:Nom de fichier ou de contrÃŽle vers lequel envoyer le statut de sortie.
+exportcol.cddir:Le nom du rÃ©pertoire oÃ¹ les contenus du CD sont exportÃ©s.
+exportcol.cdname:Le nom du CD-ROM -- c'est ce qui va apparaÃ®tre dans le menu de dÃ©marrage une fois que le CD-ROM est installÃ©.
+
+exportcol.desc:Script PERL utilisÃ© pour exporter une ou plusieurs collections vers un CD-ROM Windows.
+exportcol.noinstall:CrÃ©er un CD-ROM oÃ¹ la bibliothÃšque s'Ã©xÃ©cute directement sur le CD-ROM et rien n'est installÃ© sur l'ordinateur hÃŽte.
+exportcol.params:[options] nom de collection1 nom de collection 2âŠ
+exportcol.coll_not_found:Collection non valide %s ignorÃ©e: collection introuvable Ã  %s.
+exportcol.coll_dirs_not_found:Collection non valide %s ignorÃ©e: l'un des rÃ©pertoires suivants n'a pas Ã©tÃ© trouvÃ©:
+exportcol.fail:echec de export.pl:
+exportcol.no_valid_colls:Pas de collection valide spÃ©cifiÃ©e pour exportation
+exportcol.couldnt_create_dir:N'a pas pu crÃ©er rÃ©pertoire %s.
+exportcol.couldnt_create_file:N'a pas pu crÃ©er %s.
+exportcol.instructions:Pour crÃ©er un CD-ROM d'auto-installation pour Windows, Ã©crire les contenus de ce fichier dans un CD-ROM.
+exportcol.non_exist_files:Un ou plusieurs des fichiers et rÃ©pertoires nÃ©cessaires suivants n'existent pas:
+exportcol.success:succÃšs de export.pl:
+exportcol.output_dir:Les collections exportÃ©es (%s) sont dans %s.
+exportcol.export_coll_not_installed:La fonctionnalitÃ© de 'Exporter vers CD-Rom' n'a pas Ã©tÃ© installÃ©e.
+
+# -- import.pl --
+
+import.archivedir:LÃ  oÃ¹ finissent le matÃ©riau converti.
+
+import.manifest:Un fichier XML qui prÃ©cise quels sont les fichiers Ã  importer. UtilisÃ© Ã  la place de la descente rÃ©cursive du dossier de l'importation, gÃ©nÃ©ralement pour obtenir une construction incrÃ©mentale.
+
+import.cannot_open_stats_file:ATTENTION: impossible d'ouvrir le fichier stats %s.
+
+import.cannot_open_fail_log:Erreur: N'a pas pu ouvrir le journal des Ã©checs %s
+
+
+
+
+
+import.cannot_sort:ATTENTION: le plugin d'importation ne peut pas trier les documents si groupsize > 1. L'option sortmeta sera ignorÃ©e.
+
+
+
+
+
+import.collectdir:Le chemin du rÃ©pertoire "collect".
+
+import.complete:Fin de l'importation.
+
+import.debug:Imprimer le texte importÃ© vers STDOUT ( pour une importation au format GreenstoneXML)
+
+import.desc:Script PERL utilisÃ© pour importer des fichiers dans un format prÃªt pour la construction (GreenstoneXML ou GreenstoneMETS).
+
+import.faillog:Nom de fichier du log d'Ã©chec. Ce log reÃ§oit les noms de fichier de tous les fichiers qui n'ont pas pu Ãªtre traitÃ©s
+
+import.groupsize:Nombre de documents importÃ©s Ã  regrouper dans un fichier XML.
+
+import.gzip:Utiliser gzip pour compresser les documents xml de sortie (ne pas oublier d'intÃ©grer ZIPPLugin dans votre liste de plugins en construisant Ã  partir de documents compressÃ©s.
+
+import.importdir:lÃ  oÃ¹ se trouve le matÃ©riau original.
+
+import.incremental:Importe uniquement les documents qui sont plus rÃ©cents (par date) que les actuels fichiers d'archives. Implique -keepold.
+
+import.keepold:Ne dÃ©truira pas les contenus actuels du rÃ©pertoire d'archives.
+
+import.maxdocs:Nombre maximum de documents Ã  importer.
+
+import.no_import_dir:Erreur: le dossier d'importation (%s) n'a pas Ã©tÃ© trouvÃ©.
+
+import.no_plugins_loaded:ERREUR: plugins non chargÃ©s
+
+import.OIDtype:La mÃ©thode Ã  utiliser pour produire des identificateurs uniques pour chaque document
+import.OIDtype.hash:Hashe le contenu du fichier. Les identifiants de documents sera la mÃªme Ã  chaque fois que la collection est importeÃ©.
+
+
+import.OIDtype.incremental:Utilise un simple comptage de document. Beaucoup plus rapide que le "hachage", mais ne attribuera pas le mÃªme identifiant pour le mÃªme contenu de document, et d'autres documents ne peuvent pas Ãªtre ajoutÃ©es aux archives existantes.
+
+import.OIDtype.assigned:Utiliser la valeur des mÃ©tadonnÃ©es fournies par l'option OIDmetadata (prÃ©cÃ©dÃ©e par "D"); si non spÃ©cifiÃ©e, Ã  un document de hachage est utilisÃ© Ã  la place. Ces identificateurs doivent Ãªtre uniques.
+
+import.OIDtype.dirname:Utilisez le nom du rÃ©pertoire parent (prÃ©cÃ©dÃ© par 'J'). Il ne devrait Ãªtre qu'un document par rÃ©pertoire, et les noms de rÃ©pertoire doivent Ãªtre uniques. Par exemple Import/b13as/h15ef/page.html donnera un identifiant de Jh15ef.
+
+import.OIDmetadata:SpÃ©cifie les Ã©lÃ©ments de mÃ©tadonnÃ©es qui dÃ©tiennent l'identificateur unique du document, pour une utilisation avec - OIDtype = assignÃ©s.
+
+import.saveas:Format Ã  gÃ©nÃ©rer pour l'exportation. L'option par dÃ©faut est GA.
+
+import.out:Nom de fichier ou contrÃŽle vers lequel envoyer le statut.
+
+import.params:[options] nom de collection
+
+import.removeold:Supprimera les anciens contenus du rÃ©pertoire d'archives.
+
+import.removing_archives:Suppression des contenus du rÃ©pertoire d'archivesâŠ
+
+import.removing_tmpdir:Ãlimine les contenus du rÃ©pertoire "tmp" de la collection...
+
+import.site:Site oÃ¹ trouver le rÃ©pertoire collect (pour l'installation de Greenstone 3)
+
+import.sortmeta:Trier pour la construction les documents par ordre alphabÃ©tique des mÃ©tadonnÃ©es. Les rÃ©sultats de la recherche pour les expressions boolÃ©ennes seront affichÃ©s dans cet ordre. Ceci sera dÃ©sactivÃ© si groupsize> 1. Pour trier par plus d'une valeur de mÃ©tadonnÃ©es, peut Ãªtre une liste sÃ©parÃ©e par des virgules.
+
+import.statsfile:Nom de fichier ou contrÃŽle vers lequel envoyer les statistiques d'importation.
+
+import.stats_backup:Va plutÃŽt imprimer les stats vers STDERR.
+
+import.verbosity:ContrÃŽle la quantitÃ© de sortie. 0=aucun, 3=beaucoup.
+
+# -- csv-usernames-to-db.pl
+
+ 
+
+
+
+
+
+
+
+
+# -- schedule.pl --
+schedule.deleted:L'exÃ©cution planifiÃ©e a Ã©tÃ© supprimÃ©e pour la collection
+schedule.scheduled:Script d'exÃ©cution crÃ©Ã© pour la collection.
+schedule.cron:L'exÃ©cution planifiÃ©e a Ã©tÃ© activÃ©e pour la collection
+schedule.params:[options]
+schedule.error.email:L'option -email requiert que les paramÃštres -smtp, -toaddr et -fromaddr soient dÃ©finis.
+schedule.error.importbuild:Les paramÃštres -import et -build doivent Ãªtre dÃ©finis.
+schedule.error.colname:La collection doit Ãªtre spÃ©cifiÃ©e par le biais de l'option -colname
+schedule.gli:LancÃ© Ã  partir de l'interface graphique.
+schedule.frequency:DÃ©finit Ã  quelle frÃ©quence la collection doit Ãªtre reconstruite.
+schedule.frequency.hourly:Reconstruire la collection toutes les heures.
+schedule.frequency.daily:Reconstruire la collection tous les jours.
+schedule.frequency.weekly:Reconstruire la collection toutes les semaines.
+schedule.action:Comment activer la reconstruction automatique de collection.
+schedule.action.add:Planifie la reconstruction automatique de collection.
+schedule.action.update:Met Ã  jour une planification existante.
+schedule.action.delete:Supprime une planification existante.
+schedule.email:Envoie un e-mail de notification.
+schedule.schedule:SÃ©lectionner pour activer la planification automatique de la reconstruction de la collection.
+schedule.colname:Le nom de la collection pour laquelle la planification sera activÃ©e.
+schedule.import:La commande d'importation Ã  planifier.
+schedule.build:La commande de construction de collection (buildcol) Ã  planifier.
+schedule.toaddr:L'adresse de courriel Ã  laquelle envoyer les avis de construction planifiÃ©e de la collection
+schedule.toaddr.default:DÃ©finir l'adresse courriel de l'utilisateur dans le menu Fichier -> PrÃ©fÃ©rences.
+schedule.fromaddr:L'adresse de courriel de l'expÃ©diteur.
+schedule.fromaddr.default:SpÃ©cifier le responsable maintenance dans le fichier main.cfg.
+schedule.smtp:Le serveur de courrier que sendmail doit contacter pour envoyer un courriel
+schedule.smtp.default:SpÃ©cifier le serveur de messagerie (variable MailServer) dans le fichier main.cfg.
+schedule.out:Fichier ou pointeur vers lequel rediriger le statut de sortie.
+# -- export.pl --
+
+export.exportdir:Ou le matÃ©riel exportÃ© se termine
+
+export.cannot_open_stats_file:ATTENTION: Impossible d'ouvrir le fichier stats %s
+
+export.cannot_open_fail_log:ERREUR: Impossible d'ouvrir la log des Ã©checs %s
+
+export.cannot_sort:ATTENTION: export.pl ne peut trier les documents lorsque groupsize>1. L'option sortmeta sera ignorÃ©e.
+
+export.collectdir:Le chemin du rÃ©pertoire "collect".
+
+export.complete:Exportation terminÃ©e
+
+export.debug:Imprimer le texte exportÃ© vers STDOUT (pour l'export au format GreenstoneXML)
+
+export.desc:Script PERL utilisÃ© pour exporter des fichiers dans une collection Greenstone vers un autre format.
+
+export.faillog:Nom du fichier journal d'Ã©chec. Ce journal reÃ§oit les noms de fichiers de tous les fichiers qui ne sont pas traitÃ©s. (Valeur par dÃ©faut: collectdir/collname/etc/fail.log)
+
+export.groupsize:Nombre de documents Ã  regrouper dans un fichier XML.
+
+export.gzip:Utiliser gzip pour compresser les documents xml rÃ©sultats (Noubliez pas d'insÃ©rer ZIPPlugin dans votre liste de plugins lorsque vous construisez Ã  partir de documents comprÃ©ssÃ©s.
+
+export.importdir:La ou le matÃ©riel original rÃ©side.
+
+export.keepold:Ne dÃ©truira pas les contenus actuels du rÃ©pertoire "export".
+
+export.maxdocs:Nombre maximum de documents Ã  exporter.
+
+export.listall:Recenser touts les formats Â«saveasÂ»
+
+export.saveas:Format Ã  gÃ©nÃ©rer pour l'exportation.
+
+export.saveas.DSpace:Format Archive DSPACE.
+
+export.saveas.GreenstoneMETS:Format METS utilisant le profile Greenstone.
+export.saveas.FedoraMETS:Format METS utilisant le profil Fedora.
+
+export.saveas.GreenstoneXML:Format d'archivage XML Greenstone
+
+export.saveas.MARCXML:Format MARC XML (une version XML de MARC 21)
+
+export.out:Nom de fichier ou sortie pour imprimer l'Ã©tat.
+
+export.params:[options] nom1-collection, nom2-collection...
+
+export.removeold:Ãliminera le contenu du rÃ©pertoire "export".
+
+export.removing_export:Suppression des contenus du rÃ©pertoire exportâŠ
+
+export.sortmeta:Trier les documents en ordre alphabÃ©tique des mÃ©ta-donnÃ©es pour la construction. DÃ©sactivÃ© si groupsize > 1.
+
+export.statsfile:Nom de fichier ou sortie pour imprimer les statistiques d'exportation.
+
+export.stats_backup:Va imprimer les stats sur STDERR
+
+export.verbosity:ContrÃŽle du volume de sortie. 0=aucun, 3=beaucoup.
+
+
+# -- mkcol.pl --
+
+mkcol.about:Le texte Ã  propos pour la collection.
+
+
+
+
+
+mkcol.bad_name_cvs:ERREUR: Aucune collection ne peut Ãªtre nommÃ©e CVS car cela pourrait interfÃ©rer avec des rÃ©pertoires de gestion de version de CVS.
+
+mkcol.bad_name_svn:ERREUR : aucune collection ne peut porter l'extension .svn, car cela pourrait interfÃ©rer avec les rÃ©pertoires crÃ©Ã©s par le systÃšme de versionnage SVN.
+
+mkcol.bad_name_modelcol:ERREUR: Aucune collection ne peut Ãªtre nommÃ©e modelcol puisque c'est le nom de la collection modÃšle.
+
+mkcol.cannot_find_modelcol:ERREUR: impossible de trouver la collection modÃšle %s
+
+mkcol.col_already_exists:ERREUR: Cette collection existe dÃ©jÃ .
+
+mkcol.collectdir:Le rÃ©pertoire dans lequel la nouvelle collection va Ãªtre crÃ©Ã©e.
+
+mkcol.group_not_valid_in_gs3:L'option de groupe n'est pas valable dans le mode Greenstone 3 (-gs3mode).
+mkcol.creating_col:CrÃ©ation de la collection %s
+
+mkcol.creator:L'adresse e-mail du crÃ©ateur de la collection.
+
+mkcol.creator_undefined:ERREUR: Le crÃ©ateur n'a pas Ã©tÃ© dÃ©fini. Cette variable est nÃ©cesaire pour reconnaÃ®tre les noms de collection dupliquÃ©s.
+
+mkcol.desc:Script PERL utilisÃ© pour crÃ©er la structure de rÃ©pertoire pour une nouvelle collection Greenstone.
+
+mkcol.doing_replacements:en train d'effectuer des remplacements pour %s
+
+mkcol.group:CrÃ©e un nouveau groupe de collection et non pas une simple collection.
+
+mkcol.gs3mode:Mode pour les collections Greenstone 3.
+
+mkcol.long_colname:ERREUR: Le nom de collection doit Ãªtre de moins de 8 caractÃšres afin de maintenir la compatibilitÃ© avec des sytÃšmes prÃ©cÃ©dents.
+
+mkcol.maintainer:L'adresse e-mail du maintenancier de la collection (si diffÃ©rent du crÃ©ateur).
+
+mkcol.no_collectdir:ERREUR: Le rÃ©pertoire de la collection n'existe pas: %s
+
+mkcol.no_collectdir_specified:ERREUR : aucun rÃ©pertoire collect n'a Ã©tÃ© dÃ©fini. Dans le mode gs3, l'option -site ou l'option -collectdir doivent Ãªtre dÃ©finies.
+
+mkcol.no_colname:ERREUR: Aucun nom de collection n'a Ã©tÃ© spÃ©cifiÃ©.
+
+mkcol.optionfile:Prendre des options Ã  partir du fichier, utile dans des systÃšmes oÃ¹ des longues lignes de commandes peuvent poser des problÃšmes.
+
+mkcol.params:[option] nom de collection
+
+mkcol.plugin:Module plugin Perl Ã  utiliser (il peut y avoir plusieurs entrÃ©es de plugins).
+
+mkcol.public:Si cette collection a des accÃšs anonymes.
+mkcol.public.true:La collection est publique
+mkcol.public.false:La collection est privÃ©e
+
+mkcol.quiet:Fonctionne en silence.
+
+mkcol.site:Dans gs3mode ce nom de site est conjointement utilisÃ© avec la variable d'environnement GSDL3HOME pour dÃ©terminer collectdir, sauf si -collectdir est spÃ©cifiÃ©.
+
+mkcol.success:La nouvelle collection a Ã©tÃ© crÃ©e avec succÃšs Ã  %s
+
+mkcol.title:Le titre de la collection
+
+mkcol.win31compat:Est-ce que les noms de rÃ©pertoires doivent suivre le modÃšle Windows 3.1 ou non (c.a.d. 8 caractÃšres max).
+mkcol.win31compat.true:Nom du rÃ©pertoire : 8 caractÃšres maximum
+mkcol.win31compat.false:Nom du rÃ©pertoire de longueur quelconque
+
+# -- pluginfo.pl --
+
+pluginfo.collection:L'attribution d'un nom de colection fera que pluginfo.pl va rechercher d'abord dans collect/nom_de_collection/perllib/plugins. Si le plugin n'y est pas trouvÃ© il va alors chercher dans le rÃ©pertoire gÃ©nÃ©ral de logiciels/perlib.
+
+pluginfo.desc:Imprime l'information concernant un plugin.
+
+pluginfo.general_options:Les options gÃ©nÃ©rales sont hÃ©ritÃ©es des classes parentes du plugin.
+
+pluginfo.info:info
+
+pluginfo.no_plugin_name:ERREUR: Vous devez donner un nom de plugin.
+
+pluginfo.option_types:Les plugins peuvent prendre deux types d'options.
+
+pluginfo.params:[options] nom de plugin
+
+pluginfo.passing_options:Des options peuvent Ãªtre passÃ©es Ã  tous les plugins en les intÃ©grant dans votre fichier de configuration collect.cfg.
+
+pluginfo.specific_options:Les options spÃ©cifiques sont dÃ©finies au sein du plugin mÃªme, et sont disponibles uniquement pour ce plugin particulier.
+
+
+# -- plugoutinfo.pl --
+
+plugoutinfo.collection:Etant donnÃ© un nom de collection, on fera en premier pointer plugoutinfo.pl dans collecter/ collection nom/perllib/plugouts.  Si le "plugout" n'est pas trouvÃ© lÃ , on regardera dans le rÃ©pertoire gÃ©nÃ©ral perllib/plugouts.
+
+plugoutinfo.desc:Imprimer l'informations sur un Â«plugoutÂ».
+
+plugoutinfo.general_options:Les options gÃ©nÃ©rales sont hÃ©ritÃ©es de la classes parente du "plugout".
+
+plugoutinfo.info:info
+
+plugoutinfo.no_plugout_name:ERREUR: Vous devez fournir un nom de "plugout".
+
+plugoutinfo.option_types:Les Plugouts peuvent prendre deux types d'options
+
+plugoutinfo.params:[Options] nom-Â«plugoutÂ Â»
+
+plugoutinfo.passing_options:Les options peuvent Ãªtre transmises Ã  des "plugout" en les incluant dans votre fichier de configuration collect.cfg .
+
+plugoutinfo.specific_options:Les options spÃ©cifiques sont dÃ©finis dans le "plugout" lui-mÃªme, et ne sont disponibles que pour ce "plugout".
+
+
+
+#
+# Classifier option descriptions
+#
+
+AllList.desc:CrÃ©e une liste unique de tous les documents. Utilisation par le serveur OAI.
+
+AZCompactList.allvalues:Utiliser toutes les valeurs de mÃ©ta-donnÃ©es trouvÃ©es.
+
+AZCompactList.desc:Plugiciel de classificateur pour le tri alphabÃ©tique (dans l'ordre a-z,A-Z,0-9). Produit une liste AZ horizontale, puis une liste verticale contenant des documents, ou des Ã©tagÃšres pour les documents avec des mÃ©tadonnÃ©es communes.
+
+AZCompactList.doclevel:Niveau oÃ¹ le document est traitÃ©.
+AZCompactList.doclevel.top:Tout le document.
+AZCompactList.doclevel.section:Par sections.
+
+AZCompactList.firstvalueonly:Utiliser uniquement la premiÃšre valeur de mÃ©tadonnÃ©es trouvÃ©e
+
+AZCompactList.freqsort:Trier par frÃ©quence nodale plutÃŽt que de maniÃšre alpha-numÃ©rique.
+
+AZCompactList.maxcompact:Nombre maximum de documents Ã  afficher par page.
+
+AZCompactList.metadata:Champ de mÃ©tadonnÃ©es, ou liste de champs de mÃ©tadonnÃ©es sÃ©parÃ©s par des virgules, utilisÃ© pour la classification. Si une liste est spÃ©cifiiÃ©e, le premier Ã©lÃ©ment de mÃ©ta-donnÃ©es qui a une valeur sera utilisÃ©. Peut Ãªtre utilisÃ© avec les options -firstvalueonly et -allvalues, pour sÃ©lectioner uniquement la premiÃšre valeur, ou toutes les valeurs de mÃ©tadonnÃ©es de la liste.
+
+AZCompactList.mincompact:Nombre minimum de documents Ã  afficher par page.
+
+AZCompactList.mingroup:Valeur minimale qui entraÃ®nera la formation d'un groupe dans la hierarchie.
+
+AZCompactList.minnesting:La valeur minimale qui entraÃ®nera la conversion d'une liste en liste imbriquÃ©e.
+
+AZCompactList.recopt:UtilisÃ© dans des mÃ©tadonnÃ©es imbriquÃ©es tel que AnnÃ©e/Organisation
+AZCompactList.sort:Champ de mÃ©tadonnÃ©es Ã  partir duquel les nÅuds externes seront triÃ©s.
+
+AZCompactSectionList.desc:Variation sur AZCompactList qui classifie des sections plutÃŽt que des documents. Les entrÃ©es sont triÃ©es par mÃ©tadonnÃ©es de niveau section.
+
+AZList.desc:Plugiciel de classificateur pour le tri alphabÃ©tique (dans l'ordre a-z,A-Z,0-9). Produit une liste AZ horizontale, avec les documents Ã©numÃ©rÃ©s ci-dessous.
+
+AZList.metadata:Un champ de mÃ©ta-donnÃ©e unique ou une liste de champs de mÃ©ta-donnÃ©e sÃ©parÃ©s par des virgules utilisÃ© pour classification. En suivant l'ordre indiquÃ© par la liste, le premier champ qui contient  une valeur de mÃ©ta-donnÃ©e sera utilisÃ©. La liste sera triÃ©e suivant cet Ã©lÃ©ment.
+
+AZSectionList.desc:Variation de AZList qui classe les sections plutÃŽt que les documents. Les entrÃ©es sont triÃ©es par les mÃ©tadonnÃ©es au niveau de la section.
+
+BasClas.bad_general_option:Le classificateur %s utilise une mauvaise option. VÃ©rifiez votre fichier de configuration collect.cfg
+
+BasClas.builddir:Endroit oÃ¹ les indexes construits vont Ãªtre mis.
+
+BasClas.buttonname:L'Ã©tiquette pour la fenÃªtre du classificateur et pour le bouton dans la barre de navigation. Le dÃ©faut est l' Ã©lÃ©ment de mÃ©tadonnÃ©es spÃ©cifiÃ© par -metadata.
+
+BasClas.desc:Classe de base pour tous les classificateurs.
+
+BasClas.no_metadata_formatting:Ne faire aucun formatage automatique de mÃ©tadonnÃ©es (pour tri.)
+
+BasClas.outhandle:Le pointeur vers le fichier qui va recevoir les rÃ©sultats.
+
+BasClas.removeprefix:PrÃ©fixe Ã  ignorer dans les valeurs de mÃ©tadonnÃ©es lors du tri.
+
+BasClas.removesuffix:Suffixe Ã  ignorer dans les valeurs de mÃ©tadonnÃ©es lors du tri.
+
+BasClas.verbosity:ContrÃŽle le volume des sorties de donnÃ©es. 0=aucun, 3=beaucoup.
+
+Browse.desc:Un classificateur factice qui fournit un lien dans la barre de navigation vers un prototype de page combinÃ©e de navigation et de recherche. Fonctionne uniquement pour les collections mgpp, et n'est pratique que pour les petites collections.
+
+DateList.bymonth:Classifier par annÃ©e et par mois plutÃŽt que par annÃ©e seulement.
+
+DateList.desc:Plugiciel de classification pour le tri par date. Par dÃ©faut, il trie par la mÃ©tadonnÃ©e 'Date' . Les dates sont supposÃ©es Ãªtre en format aaaammjj ou aaaa-mm-jj.
+
+DateList.metadata:La mÃ©tadonnÃ©e qui contient les dates pour le classement. Le format est supposÃ© Ãªtre aaaammjj ou aaaa-mm-jj. Peut Ãªtre une liste des valueurs sÃ©parÃ©es par des virgules, auquel cas la premiÃšre date de la liste sera utilisÃ©e.
+
+DateList.reverse_sort:Trier les documents par ordre chronologique inverse (les plus rÃ©cents d'abord).
+
+DateList.nogroup:CrÃ©er une entrÃ©e spÃ©cifique pour chaque annÃ©e dans la liste horizontale, au lieu de regrouper les annÃ©es dans quelques entrÃ©es. (Ceci peut aussi Ãªtre utilisÃ© en combinaison avec l'option -bymonth pour crÃ©er une entrÃ©e spÃ©cifique pour chaque mois au lieu de regrouper les mois dans quelques entrÃ©es.)
+
+DateList.no_special_formatting:Ne pas afficher des informations AnnÃ©e et Mois dans liste de documents.
+
+DateList.sort:Champ de mÃ©tadonnÃ©es supplÃ©mentaire pour le tri pour le cas oÃ¹ deux documents auraient la mÃªme date.
+
+HFileHierarchy.desc:Plugiciel de classificateur pour gÃ©nÃ©rer des classifications hiÃ©rarchiques sur la base d'un fichier structurel supplÃ©mentaire.
+
+Hierarchy.desc:Plugiciel Classificateur pour gÃ©nÃ©rer une classification hiÃ©rachique. Ceci peut Ãªtre basÃ© sur des mÃ©tadonnÃ©es structurÃ©es, ou peut utiliser un fichier de structure supplÃ©mentaire (utilisez l' option -hfile).
+
+Hierarchy.documents_last:Affiche les nÅuds du document aprÃšs les nÅuds classificateurs.
+
+Hierarchy.hfile:Utiliser le fichier de structure de classification spÃ©cifiÃ©.
+
+Hierarchy.hlist_at_top:Affiche horizontalement le premier niveau de la classification.
+
+Hierarchy.reverse_sort:Trier les nÅuds feuilles en ordre inverse (utiliser avec -sort).
+
+Hierarchy.separator:Expression rÃ©guliÃšre utilisÃ©e pour le sÃ©parateur
+
+Hierarchy.sort:Champ de mÃ©ta-donnÃ©e suivant lequel trier. Utiliser '-sort nosort' pour dÃ©sactiver le tri.
+
+Hierarchy.suppressfirstlevel:Ignorer la premiÃšre partie de la valeur de mÃ©tadonnÃ©e. Ceci est utile pour des mÃ©tadonnÃ©es dont le premier Ã©lÃ©ment est connu, tel que le rÃ©pertoire d'import dans gsdlsourcefilename.
+
+Hierarchy.suppresslastlevel:Ignorer la partie finale de la valeur de mÃ©ta-donnÃ©e. C'est particuliÃšrement utile pour des mÃ©ta-donnÃ©es dont chaque valeur est unique, telles que les chemins de fichiers.
+
+HTML.desc:CrÃ©e une classification vide qui qui est tout simplement un lien vers une page web.
+
+HTML.url:L'URL de la page web de destination.
+
+List.bookshelf_type:ContrÃŽle Ã  quel moment seront crÃ©Ã©es les Ã©tagÃšres.
+List.bookshelf_type.always:CrÃ©er une icÃŽne d'Ã©tagÃšre mÃªme s'il n'existe qu'un seul objet dans chaque groupe sur les noeuds terminaux.
+List.bookshelf_type.never:Ne jamais crÃ©er une icÃŽne d'Ã©tagÃšre mÃªme s'il existe plus d'un objet dans chaque groupe sur les noeuds terminaux.
+List.bookshelf_type.duplicate_only:CrÃ©er une icÃŽne d'Ã©tagÃšre seulement s'il existe plus d'un objet dans chaque groupe sur les noeuds terminaux.
+
+List.classify_sections:Classe des sections au lieu de documents.
+
+List.desc:Un classificateur de liste gÃ©nÃ©ral et flexible avec la plupart des possibilitÃ©s de AZCompactList, mais avec un meilleur support de l'Unicode et une meileure capacitÃ© de tri.
+
+
+List.level_partition.per_letter:CrÃ©er une partition pour chaque lettre.
+List.level_partition.constant_size:CrÃ©er une partition de taille constante.
+
+
+List.metadata:Les champs de mÃ©tadonnÃ©e utilisÃ©s pour la classification. Utiliser '/' pour sÃ©parer les niveaux dans la hiÃ©rarchie et ';' pour sÃ©parer les champs de mÃ©tadonnÃ©es dans chaque niveau.
+
+List.partition_name_length:La longueur du nom de partition; valeurs par dÃ©faut d'une longueur variable de 1 Ã  3 caractÃšres, dÃ©pendant de combien sont nÃ©cessaires pour distinguer le dÃ©but de la partition de sa fin. Cette option ne s'applique que si partition_type_within_level est Ã  'constant_size'.
+
+List.partition_size_within_level:Le nombre d'Ã©lÃ©ments dans chaque division (ceci s'applique seulement quand la partition_type_within_level est mis Ã  'constant_size').
+
+List.partition_type_within_level:Le type de division effectuÃ© : soit 'par_lettre', 'taille_constante' ou 'aucune'.
+
+
+
+List.sort_leaf_nodes_using:Champs de mÃ©tadonnÃ©es utilisÃ©s pour trier les nÅuds extrÃªmes. Utiliser '|' pour sÃ©parer les groupes de mÃ©tadonnÃ©e en type table et ';' pour sÃ©parer les champs de mÃ©tadonnÃ©es dans chaque groupe.
+
+List.sort_using_unicode_collation:Trier en utilisant l'algorithme de rÃ©colement Unicode. NÃ©cessite le tÃ©lÃ©chargement du fichier http://www.unicode.org/Public/UCA/latest/allkeys.txt dans le dossier des librairies Perl lib/Unicode/Collate.
+
+List.use_hlist_for:Les champs de mÃ©tadonnÃ©es qui utilisent une hlist au lieu d'une vlist. Utiliser ',' pour sÃ©parer les groupes de mÃ©tadonnÃ©es et ';' pour sÃ©parer les champs de mÃ©tadonnÃ©es dans chaque groupe.
+
+SimpleList.metadata:Un champ de mÃ©tadonnÃ©e unique ou une liste de champs de mÃ©tadonnÃ©e sÃ©parÃ©s par des virgules utilisÃ©s pour classification. En suivant l'ordre indiquÃ© par la liste, le premier champ qui contient  une valeur de mÃ©tadonnÃ©e sera utilisÃ©. La liste sera triÃ©e suivant cet Ã©lÃ©ment, Ã  moins que -sort ne soit utilisÃ©. Si aucune mÃ©tadonnÃ©e n'est spÃ©cifiÃ©e, tous les documents seront inclus dans la liste, sinon seuls les documents qui contiennent une valeur de mÃ©tadonnÃ©e seront inclus.
+
+SimpleList.desc:Plugiciel de classificateur de liste simple.
+
+SimpleList.sort:Champ de mÃ©ta-donnÃ©e suivant lequel trier. Utiliser '-sort nosort' pour dÃ©sactiver le tri.
+
+Phind.desc:Produit une hiÃ©rarchie des phrases figurant dans le texte, qui est consultable par le biais d'une applet.
+
+Phind.language:Langue ou langues Ã  utiliser pour la construction d'une hiÃ©rarchie. Les langues sont identifiÃ©es par des codes de pays Ã  deux lettres comme en (anglais), es (espagnole), fr (franÃ§ais). Langue est une expression ordinaire, donc 'en|fr' (anglais ou franÃ§ais) et '..' (toute langue) sont valides.
+
+Phind.min_occurs:Le nombre minimum de fois qu'une phrase doit apparaÃ®tre dans le texte pour faire partie de la hiÃ©rarchie des phrases.
+
+Phind.savephrases:Lorsque dÃ©finie, l'information d'expression sera stockÃ©e comme texte dans le fichier spÃ©cifiÃ©. C'est probablement une bonne idÃ©e d'utiliser une chemin absolu.
+
+Phind.suffixmode:Le paramÃštre smode du programme d'extraction d'expression. Une valeur 0 signifie que les mots d'arrÃªt sont ignorÃ©s et 1 signifie que les mots d'arrÃªts sont utilisÃ©s.
+
+Phind.text:Le texte utilisÃ© pour construire la hierarchie d'expression.
+
+Phind.thesaurus:Nom d'un thÃ©saurus stockÃ© au format Phind dans le repertoire etc de la collection.
+
+Phind.title:Le champ de mÃ©ta-donnÃ©e utilisÃ© pour dÃ©crire chaque document.
+
+Phind.untidy:Ne pas supprimer les fichiers actifs.
+
+RecentDocumentsList.desc:Classificateur qui donne une liste des documents nouvellement ajoutÃ©s ou modifiÃ©s.
+
+RecentDocumentsList.include_docs_added_since:Inclure uniquement les documents ajoutÃ©s ou modifiÃ©s aprÃšs la date spÃ©cifiÃ©e (au format  aaaammjj ou aaaa-mm-jj).
+
+RecentDocumentsList.include_most_recently_added:Inclure uniquement le nombre spÃ©cifiÃ© des documents les plus rÃ©cemment ajoutÃ©s. Uniquement utilisÃ© si include_docs_added_since n'est pas spÃ©cifiÃ©.
+
+RecentDocumentsList.sort:MÃ©tadonnÃ©es pour trier par liste. S'il n'est pas spÃ©cifiÃ©, la liste sera triÃ©e par date de modification/ajout.
+
+SectionList.desc:Comme le classificateur List, mais inclut toutes les sections du document (Ã  l'exception du niveau supÃ©rieur) plutÃŽt que le document de niveau supÃ©rieur seulement.
+
+Collage.desc:Un applet est utilisÃ© pour afficher un collage d'images trouvÃ©es dans la collection.
+
+Collage.geometry:Les dimensions de la toile de fond du collage. Pour un fond de 600 pixels de large et 400 pixels de haut par example, indiquez la gÃ©omÃ©trie comme 600x400
+
+Collage.maxDepth:Les images pour le collage sont obtenues d'une mise en miroir du classificateur utilisÃ©. Ce paramÃštre contrÃŽle la profondeur maximum du processus de mise en miroir.
+
+Collage.maxDisplay:Le nombre maximum d'images Ã  afficher dans le collage Ã  un moment donnÃ©.
+
+Collage.imageType:UtilisÃ© pour contrÃŽler, en spÃ©cifiant les extensions de nom de fichier, quels types de fichier sont utilisÃ©s pour le collage. Une liste d'extensions est sÃ©parÃ©e par le caractÃšre pourcent (%%).
+
+Collage.bgcolor:La couleur d'arriÃšre plan de la toile de fond, indiquÃ©e sous forme hexadÃ©cimale (par exemple #008000 a comme consÃ©quence un arriÃšre plan vert forÃªt).
+
+Collage.buttonname:L'Ã©tiquette pour l'Ã©cran de classificateur et pour le bouton dans la barre de navigation
+
+Collage.refreshDelay:Taux, en millisecondes, de rafraichissement de la toile de fond du collage.
+
+Collage.isJava2:UtilisÃ© pour contrÃŽler l'utilisation des classes "runtime" de Java. Les versions le plus rÃ©centes de Java (c.-Ã -d. Ã  partir de Java 1.2) incluent des fonctions plus avancÃ©es pour contrÃŽler la transparence des images, ce qui permet un contrÃŽle plus fin ; toutefois le "Java runtime" intÃ©grÃ© dans certain navigateurs est la version 1,1. L'applet dÃ©tecte automatiquement la version du "Java runtime" utilisÃ©e par le navigateur et rÃ©agit en consÃ©quence.
+
+Collage.imageMustNotHave:UtilisÃ© pour supprimer les images qui ne devraient pas apparaÃ®tre dans le collage, telles que les images des boutons qui composent la barre de navigation.
+
+Collage.caption:Sous-titres facultatifs Ã  afficher au-dessous de la toile de fond.
+
+
+#
+# Plugin option descriptions
+#
+AcronymExtractor.adding:ajout
+
+AcronymExtractor.already_seen:dÃ©jÃ  vu
+
+AcronymExtractor.desc:Plugiciel d'aide Ã  l'extraction pour la localisation et le balisage des acronymes dans un texte.
+
+AcronymExtractor.done_acronym_extract:extraction des acronymes terminÃ©e.
+
+AcronymExtractor.done_acronym_markup:balisage des acronymes terminÃ©.
+
+AcronymExtractor.extract_acronyms:Extraire les acronymes du texte et les dÃ©finir comme mÃ©tadonnÃ©es.
+
+AcronymExtractor.extracting_acronyms:extraction d'acronymes
+
+AcronymExtractor.marking_up_acronyms:balisage des acronymes
+
+AcronymExtractor.markup_acronyms:Ajouter des mÃ©tadonnÃ©es d'acromyme au texte du document
+
+ArchivesInfPlugin.desc:Plugiciel qui traite la base de donnÃ©es d'informations sur les archives (archiveinf-doc) qui est gÃ©nÃ©rÃ©e pendant le processus d'importation. Il transmet chaque fichier d'archive rÃ©fÃ©rencÃ© dans la base au pipeline de plugiciels pour Ãªtre traitÃ© par GreenstoneXMLPlugin.
+
+
+AutoExtractMetadata.desc:Plugiciel de base qui rassemble toutes les fonctionnalitÃ©s d'extraction des plugiciels d'extraction.
+
+AutoExtractMetadata.extracting:Extraction
+
+AutoExtractMetadata.first:Liste (en format valeurs sÃ©parÃ©es par des virgules) des nombres de caractÃšres Ã  extraire Ã  partir du dÃ©but du texte pour peupler une sÃ©rie de champs de mÃ©tadonnÃ©es appelÃ©s 'FirstN', oÃ¹ N est la taille d'une mÃ©tadonnÃ©e en nombre de caractÃšres. Par exemple, les valeurs "3,5,7" aura pour effet le transfert des premiers 3, 5 et 7 caractÃšres du texte vers les champs de mÃ©tadonnÃ©es "First3", "First5" and "First7".
+
+
+
+BaseMediaConverter.desc:Plugiciel d'aide qui fournit les fonctionnalitÃ©s de base aux plugiciels de conversion des formats multimÃ©dia tels qu'ImageConverter et les convertisseurs de vidÃ©o.
+
+BasePlugin.associate_ext:Associe les fichiers ayant le mÃªme nom principal de fichier que le document traitÃ© par le plugiciel ET une extension de fichier provenant de la liste de valeurs sÃ©parÃ©es par des virgules donnÃ©e par cet argument au document en cours de traitement plutÃŽt que les manipuler comme une liste sÃ©parÃ©e.
+
+BasePlugin.associate_tail_re:Une expression rÃ©guliÃšre utilisÃ©e pour reconnaÃ¯tre les noms des fichiers associÃ©s. UtilisÃ© comme option plus puissante qu'associate_ex/
+
+BasePlugin.block_exp:Les fichiers qui correspondent Ã  cette expression rÃ©guliÃšre ne seront pas passÃ©s aux plugiciels qui viennent aprÃšs dans la liste.
+
+BasePlugin.desc:Classe de base pour tous les plugiciels d'importation.
+
+BasePlugin.dummy_text:Ce document n'a pas de texte.
+
+BasePlugin.encoding.ascii:ASCII ordinaire 7 bits. Ceci pourrait Ãªtre un peu plus rapide que l'utilisation d'iso_8859_1. Cependant, faites attention si le texte peut contenir des caractÃšres hors ASCII ordinaire 7 bits (par ex. textes en allemand ou en franÃ§ais qui comportent des accents), dans ce cas utiliser iso_8859_1.
+
+BasePlugin.encoding.unicode:Unicode seulement.
+
+BasePlugin.encoding.utf8:Utf8 ou unicode -- dÃ©tectÃ© automatiquement
+
+BasePlugin.filename_encoding:Encodage des noms des fichiers sources.
+
+BasePlugin.filename_encoding.auto:DÃ©tecter automatiquement l'encodage du nom de fichier.
+
+BasePlugin.filename_encoding.auto_language_analysis:DÃ©tecter automatiquement l'encodage par l'analyse du nom de fichier.
+
+BasePlugin.filename_encoding.auto_filesystem_encoding:DÃ©tecter automatiquement l'encodage du nom de fichier en utilisant l'encodage du systÃšme de fichiers.
+
+BasePlugin.filename_encoding.auto_fl:Utilise l'encodage du systÃšme de fichiers puis l'analyse de la langue pour dÃ©tecter l'encodage du nom de fichier.
+
+BasePlugin.filename_encoding.auto_lf:Utilise l'analyse de la langue puis l'encodage du systÃšme de fichiers pour dÃ©tecter l'encodage du nom de fichier.
+
+BasePlugin.no_blocking:Importer tous les fichiers. Tous les fichiers associÃ©s (images dans une page web, etc.) seront ajoutÃ©s Ã  la collection comme des documents indÃ©pendants.
+
+BasePlugin.no_cover_image:Ne pas rechercher un fichier prÃ©fix.jpg (prÃ©fix Ã©tant le mÃªme prÃ©fix que celui du fichier en cours de traitement) pour associer en tant qu'image de couverture.
+
+BasePlugin.OIDtype.auto:Utiliser l'OIDtype dÃ©fini dans import.pl
+
+BasePlugin.process_exp:Expression rÃ©guliÃšre de Perl Ã  faire correspondre Ã  des noms de fichiers. Les fichiers correspondants seront traitÃ©s avec ce plugiciel. Par exemple, l'usage de '(?i).html?\$' fait correspondre tous les documents terminant en .htm ou en .html (indÃ©pendemment de la casse).
+
+
+
+BasePlugin.smart_block:Bloquer les fichiers d'une faÃ§on plus flexible qu'en regardant le nom du fichier.
+
+
+
+BasePlugin.file_rename_method:La mÃ©thode Ã  utiliser pour renommer la copie du fichier importÃ© et ses fichiers associÃ©s.
+
+BasePlugin.rename_method.url:Utiliser un encodage basÃ© sur l'adresse URL pour renommer les fichiers importÃ©s et les fichiers qui leur sont associÃ©s.
+
+BasePlugin.rename_method.base64:Utiliser un encodage base64 pour renommer les fichiers importÃ©s et les fichiers qui leur sont associÃ©s.
+
+BasePlugin.rename_method.none:Ne pas renommer les fichiers importÃ©s et les fichiers qui leur sont associÃ©s.
+
+BibTexPlugin.desc:BibTexPlugin lit les fichiers bibliographiques en format BibTex. BibTexPlugin crÃ©e un objet document pour chaque rÃ©fÃ©rence dans le fichier. Ce plugiciel est une sous-classe de la classe SplitTextFile, donc s'il y a plusieurs enregistrements, ils sont tous lus.
+
+BookPlugin.desc:CrÃ©e un document Ã  niveaux multiples Ã  partir d'un document contenant les balises de niveau <<TOC>>. Les mÃ©tadonnÃ©es pour chaque section sont extraites Ã  partir des autres balises se trouvant sur la mÃªme ligne que <<TOC>>. Par exemple, <<Title>>xxxx<</Title>> dÃ©finit une mÃ©tadonnÃ©e de titre. Tout le reste entre des balises TOC est traitÃ© comme du simple html (c.-Ã -d. aucun traitement de type HTMLPlugin, tel que la prise en compte des liens HTML, n'est effectuÃ©). Les fichiers d'entrÃ©e sont supposÃ©s avoir l'extension .hb par dÃ©faut (cela peut Ãªtre changÃ© en ajoutant une option -process_exp); un fichier avec le mÃªme nom principal que celui du fichier hb mais une extension .jpg est prise comme image de couverture (les fichiers jpg sont bloquÃ©s par ce plugin). BookPlugin est une simplification (et une extension) de HBPlugin qui est utilisÃ© par les collections BibliothÃšque du DÃ©veloppement Humanitaire. BookPlugin est plus rapide mais il s'attend Ã  ce que les fichiers d'entrÃ©e soient plus propres (Les documents source pour collections HDL contiennent diverses balises html autour de <<TOC>>, utilisent des balises <<I>> pour spÃ©cifier les images, et interprÃ©tant tout simplement tout le texte aprÃšs une balise <<TOC>> et sur la mÃªme ligne que celle-ci comme Ã©tant la mÃ©tadonnÃ©e Titre). Si vous dÃ©sirez baliser un document pour qu'il soit affichÃ© de la mÃªme maniÃšre que dans les collections HDL, utilisez ce plugiciel au lieu de HBPlugin.
+
+CONTENTdmPlugin.desc:Plugiciel qui traite les fichiers RDF dans les collections CONTENTdm exportÃ©es.
+
+ConvertBinaryFile.apply_fribidi:ExÃ©cutez le programme d'algorithme bidirectional d'Unicode "fribidi" pour le fichier convertit (pour texte de droite-Ã -gauche).
+
+ConvertBinaryFile.convert_to:Ce plugiciel convertit en TEXT, en HTML ou en diffÃ©rents types de format d' images (par ex : JPEG, GIF, PNG).
+
+ConvertBinaryFile.convert_to.auto:SÃ©lectionnez aussi automatiquement le format cible. Ce format dÃ©pend du type de document d'entrÃ©e, par exemple les fichiers Word seront automatiquement convertit en HTML, alors que PowerPoint sera convertit en format PagedImage de Greenstone.
+
+ConvertBinaryFile.convert_to.html:Format HTML
+
+ConvertBinaryFile.convert_to.text:Format de texte simple
+
+ConvertBinaryFile.convert_to.pagedimg:Une sÃ©rie d'images
+
+ConvertBinaryFile.convert_to.pagedimg_jpg:Une sÃ©rie d'images en format JPEG.
+
+ConvertBinaryFile.convert_to.pagedimg_gif:Une sÃ©rie d'images en format GIF.
+
+ConvertBinaryFile.convert_to.pagedimg_png:Une sÃ©rie d'images en format PNG.
+
+ConvertBinaryFile.desc:Ce plugiciel est utilisÃ© par des plugiciels tels que WordPlugin, PPTPlugin, PSPlugin, RTFPlugin et PDFPlugin. Il facilite la conversion de ces types de documents Ã  la fois en HTML, en TEXT ou en une sÃ©rie d'images. Il agit par chargement dynamique d'un plugiciel secondaire (HTMLPlugin, StructuredHTMLPlugin, PagedImgPlugin ou TextPlugin) en tenant compte de l'argument de plugiciel  'convert_to '.
+
+ConvertBinaryFile.keep_original_filename:Conserver le nom de fichier d'origine pour le fichier associÃ©, plutÃŽt que de le transformer en doc.pdf, doc.doc etcâŠ
+
+ConvertBinaryFile.use_strings:S'il est activÃ©, une simple fonction de chaÃ®ne sera appelÃ©e pour extraire le texte si l'utilitaire de conversion Ã©choue.
+
+ConvertToRogPlugin.desc:Un plugiciel qui hÃ©rite de RogPlugin.
+
+CSVPlugin.desc:Un plugiciel pour les fichiers en format de valeurs sÃ©parÃ©s par des virgules. Un nouveau document sera crÃ©Ã© pour chaque ligne du fichier.
+
+DateExtractor.desc:Plugiciel d'aide pour extraire d'un texte des informations sur les dates historiques.
+
+DateExtractor.extract_historical_years:Extraire des informations temporelles des documents historiques. Celles-ci sont stockÃ©es comme mÃ©tadonnÃ©es avec le document. Il y a une interface de recherche pour cette mÃ©tadonnÃ©e que vous pouvez inclure dans votre collection en ajoutant la formule ''format QueryInterface DateSearch'' dans le fichier de configuration de votre collection.
+
+DateExtractor.maximum_century:Le siÃšcle le plus rÃ©cent Ã  extraire comme mÃ©tadonnÃ©e historique (par ex. : 14 aura pour effet d'extraire toutes les rÃ©fÃ©rences jusqu'au 14Ãšme siÃšcle).
+
+DateExtractor.maximum_year:La date historique la plus rÃ©cente Ã  utiliser comme mÃ©tadonnÃ©e (dans une date d'Ãšre commune, comme 1950).
+
+DateExtractor.no_bibliography:Ne cherchez pas Ã  bloquer les dates bibliographiques lors de l'extraction de dates historiques.
+
+DirectoryPlugin.desc:Plugiciel qui analyse les rÃ©pertoires rÃ©cursivement, en traitant les fichiers trouvÃ©s.
+
+DirectoryPlugin.recheck_directories:Une fois le traitement des fichiers dans un rÃ©pertoire d'importation terminÃ©, vÃ©rifiez le rÃ©pertoire pour voir si des nouveaux fichiers ont Ã©tÃ© crÃ©Ã©s.
+
+DirectoryPlugin.use_metadata_files:OBSOLETE - Ajouter MetadataXMLPlug Ã  la liste des plugiciels pour lire des mÃ©tadonnÃ©es Ã  partir de fichiers de mÃ©tadonnÃ©es XML.
+
+DatabasePlugin.desc:Plugiciel qui importe des enregistrements d'une base de donnÃ©es. Il utilise le module perl DBI, qui comprend des interfaces pour mysql, postgresql, les fichiers de valeurs sÃ©parÃ©es par des virgules (CSV), MS Excel, ODBC, sybase, etc... Il peut Ãªtre nÃ©cessaire d'installer des modules supplÃ©mentaires pour l'utiliser. Voir <GSDLHOME>/etc/packages/example.dbi pour un exemple de fichier de configuration.
+
+DSpacePlugin.desc:Plugiciel qui prend une collection de documents exportÃ©s de DSpace et les importe dans Greenstone.
+	
+DSpacePlugin.first_inorder_ext:Ceci est utilisÃ© pour identifier le fichier de document primaire parmi les fichiers d'un document d'une collection DSpace. Quand cette option est active, les documents des types ext dÃ©finis seront examinÃ©s en sÃ©quence par le systÃšme pour rechercher le documents primaire.
+
+DSpacePlugin.first_inorder_mime:Ceci est utilisÃ© pour identifier le fichier de document primaire parmi les fichiers d'un document d'une collection DSpace. Quand cette option est active, les documents des types mime dÃ©finis seront examinÃ©s en sÃ©quence par le systÃšme pour rechercher le documents primaire.
+
+DSpacePlugin.only_first_doc:Ceci est utilisÃ© pour identifier le fichier de document primaire parmi les fichiers d'un document d'une collection DSpace. Quand cette option est active, le premier document rÃ©fÃ©rencÃ© dans le fichier de metadonnÃ©s dublin_core sera identifiÃ© par le systÃšme comme document primaire.
+
+EmailAddressExtractor.desc:Plugiciel d'aide Ã  l'extraction pour dÃ©tecter les adresses e-mail dans le texte.
+
+EmailAddressExtractor.done_email_extract:extraction des adresses e-mail terminÃ©e.
+
+EmailAddressExtractor.extracting_emails:extraction d'adresses e-mail
+
+EmailAddressExtractor.extract_email:Extraire les adresses e-mail en tant que mÃ©tadonnÃ©es.
+
+EmailPlugin.desc:Plugiciel qui lit les fichiers e-mail. Ceux-ci sont nommÃ©s simplement avec un numÃ©ro (c'est-Ã -dire comme ils apparaissent dans les dossiers maildir) ou avec l'extension .mbx (pour format de fichier courrier mbox).\nTexte de document : Le texte de document est composÃ© de tout le texte situÃ© aprÃšs la premiÃšre ligne vide du document.\nMÃ©tadonnÃ©es (pas Dublin Core  !):\n\t\$Headers    Tout le contenu en tÃªte (facultatif, il n'est pas emmagasinÃ© par defaut)\n\t\$Subject     Objet: en-tÃªte\n\t\$To        A: en-tÃªte\n\t\$From     De: en-tÃªte\n\t\$FromName    Nom de l'expÃ©diteur (si disponible)\n\t\$FromAddr    Adresse Ã©lectronique de l'expÃ©diteur\n\t\$DateText     Date: en-tÃªte\n\t\$Date   Date: en-tÃªte en format GSDL (par ex. 19990924)
+
+EmailPlugin.no_attachments:Ne pas sauvegarder les fichiers attachÃ©s aux messages.
+
+EmailPlugin.headers:Emmagasiner tous les en-tÃªtes d'un e-mail dans la mÃ©tadonnÃ©e "Headers".
+
+EmailPlugin.OIDtype.message_id:Utiliser l'identifiant du message comme l'OID du document. SI aucun identifiant de message n'est trouvÃ©, utiliser un identifiant de hachage.
+
+EmailPlugin.split_exp:Expression rÃ©guliÃšre perl utilisÃ©e pour scinder en documents sÃ©parÃ©s les fichiers contenant plusieurs messages.
+
+
+
+
+
+
+ExcelPlugin.desc:Plugiciel pour importer des fichiers Microsoft Excel (les versions 95 et 97).
+
+FavouritesPlugin.desc:Plugiciel pour traiter les fichiers de favoris d'Internet Explorer.
+
+FOXPlugin.desc:Plugiciel pour traiter un fichier Foxbase dbt. Ce plugiciel fournit une fonctionnalitÃ© de base pour lire les fichiers dbt et dbf et pour traiter chaque enregistrement. Il faudrait Ã©crire un plugiciel personnalisÃ© sur la base de ce plugiciel gÃ©nÃ©ral afin de traiter les champs appropriÃ©s d'une base de donnÃ©es spÃ©cifique.
+
+GreenstoneXMLPlugin.desc:Traite les documents des Archives Greenstone XML. Notez que ce plugiciel ne fait pas de test de syntaxe (bien que le module XML::Parser vÃ©rifie que les documents soient bien formÃ©s). Il est supposÃ© que les fichiers d'Archives Greenstone se conforment Ã  leur DTD.
+
+GISExtractor.desc:Plugiciel d'aide pour l'extraction des noms des lieux Ã  partir du texte. NÃ©cessite l'extension GIS de Greenstone.
+
+GISExtractor.extract_placenames:Extraire les noms des lieux du texte et les dÃ©finir en tant que mÃ©tadonnÃ©es. NÃ©cessite l'extension GIS de Greenstone.
+
+GISExtractor.gazetteer:Atlas Ã  utiliser pour extraire les noms des lieux du texte et les dÃ©finir en tant que mÃ©tadonnÃ©es. NÃ©cessite l'extension GIS de Greenstone.
+
+GISExtractor.place_list:Lors de l'extraction des emplacements, contient la liste des noms d'emplacements au dÃ©but du document. NÃ©cessite l'extension GIS de Greenstone.
+
+HBPlugin.desc:Plugiciel qui traite un rÃ©pertoire de livres en HTML. Ce plugiciel est utilisÃ© par les collections BibliothÃšque du DÃ©veloppement Humanitaire et ne traite pas d'encodages d'entrÃ©e autres qu'ASCII et ASCII Ã©tendu. Le code n'est pas du tout joli et on pourrait sÃ»rement Ãªtre rendu plus rapide. En le laissant tel quel, nous espÃ©rons encourager l'utilsation de BookPlugin comme alternative ;-) \n\n Utilisez BookPlugin pour crÃ©er une nouvelle collection si vous utilisez le mÃªme langage de balisage de fichiers que celui des collections BibliothÃšque du DÃ©veloppement Humanitaire. BookPlugin accepte tous les encodages d'entrÃ©e mais exige un balisage de fichiers plus propre que celui requis dans les collections BibliothÃšque du DÃ©veloppement Humanitaire.
+
+HBPlugin.encoding.iso_8859_1:Latin1 (Europe occidentale)
+
+HTMLImagePlugin.aggressiveness:Choix de mÃ©thodes apparentÃ©es d'extraction de texte Ã  utiliser.
+HTMLImagePlugin.aggressiveness.1:Nom de fichier, chemin d'accÃšs et texte alternatif (attributs ALT dans des balises img de HTML) uniquement.
+HTMLImagePlugin.aggressiveness.2:NÂ° 1, ainsi que la lÃ©gende si disponible.
+HTMLImagePlugin.aggressiveness.3:NÂ° 2, ainsi que les paragraphes proches si disponibles.
+HTMLImagePlugin.aggressiveness.4:NÂ° 3, ainsi que les titres prÃ©cÃ©dents (<h1>, <h2>...) si disponibles.
+HTMLImagePlugin.aggressiveness.5:NÂ° 4, ainsi que les rÃ©fÃ©rences textuelles si elles sont disponibles.
+HTMLImagePlugin.aggressiveness.6:NÂ° 4, ainsi que les balises de mÃ©tadonnÃ©es dans des pages HTML (titre, mots-clÃ©s, etc.)
+HTMLImagePlugin.aggressiveness.7:NÂ° 6, NÂ° 5 et NÂ°4 combinÃ©s.
+HTMLImagePlugin.aggressiveness.8:NÂ° 7, en dupliquant le nom de fichier, le chemin d'accÃšs, le texte alternatif et la lÃ©gende (pour augmenter le poids des rÃ©sultats les plus pertinents)
+HTMLImagePlugin.aggressiveness.9:NÂ° 1, ainsi que le texte intÃ©gral de la page d'origine.
+
+HTMLImagePlugin.caption_length:Longueur maximale des extraits (en caractÃšres)
+
+HTMLImagePlugin.convert_params:ParamÃštres supplÃ©mentaires Ã  transmettre Ã  ImageMagick lors de la crÃ©ation des vignettes. Par exemple, '-raise' donnera un effet 3D aux vignettes.
+
+HTMLImagePlugin.desc:Un plugiciel pour extraire les images et le texte associÃ© des pages web.
+
+HTMLImagePlugin.document_text:Ajoute le texte de l'image en tant que document:text (sinon en tant que champs de mÃ©tadonnÃ©es IndexedText).
+
+HTMLImagePlugin.index_pages:Indexe les pages en mÃªme temps que les images. Sinon, rÃ©fÃ©rence les pages comme l'URL source.
+
+HTMLImagePlugin.max_near_text:Le nombre maximal de caractÃšres Ã  extraire autour des images.
+
+HTMLImagePlugin.min_height:Pixels. Ne pas traiter les images plus petites que cette taille.
+
+HTMLImagePlugin.min_near_text:Nombre minimal de caractÃšres Ã  extraire du texte voisin ou de la lÃ©gende.
+
+HTMLImagePlugin.min_size:Bytes. Ne pas traiter les images plus petites que cette taille.
+
+HTMLImagePlugin.min_width:Pixels. Ne pas traiter les images plus petites que cette taille.
+
+HTMLImagePlugin.neartext_length:Longueur cible du texte voisin (en caractÃšres).
+
+HTMLImagePlugin.no_cache_images:Ne pas mettre les images en cache (pointer directement sur l'URL d'origine).
+
+HTMLImagePlugin.smallpage_threshold:Les images sur les pages plus petites que cette taille (bytes) auront la page de mÃ©ta-donnÃ©es (titre, mots-clÃ©s, etc.) ajoutÃ©e.
+
+HTMLImagePlugin.textrefs_threshold:Seuil pour les rÃ©fÃ©rences textuelles. Une valeur plus faible signifie que l'algorithme est moins stricte.
+
+HTMLImagePlugin.thumb_size:Taille maximale des vignettes. Valable pour la largeur ou la longueur.
+
+HTMLPlugin.assoc_files:Expression perl d'extensions de fichiers Ã  associer avec des documents html.
+
+HTMLPlugin.desc:Ce plugin traite les fichiers HTML
+
+HTMLPlugin.description_tags:Scinder le document en sous-sections oÃ¹ apparaissent des balises<Section> . '- Keep_head' n'aura aucun effet si cette option est activÃ©e.
+
+HTMLPlugin.extract_style:Extraire le style et les  informations du script de la balise HTML <head> et enregistrer dans la mÃ©tadonnÃ©e DocumentHeader. Ce sera dÃ©fini dans la page document comme la macro _document: documentheader_ .
+
+HTMLPlugin.file_is_url:DÃ©fini si les noms de fichiers d'entrÃ©e constituent l'url des documents source d'origine, p.ex. si un outil de "mirroring" a Ã©tÃ© utilisÃ© pour crÃ©er la structure du rÃ©pertoire d'importation.
+
+HTMLPlugin.hunt_creator_metadata:Trouver autant de mÃ©tadonnÃ©es que possible sur l'auteur et les placer dans le champ 'Creator'.
+
+HTMLPlugin.keep_head:Ne pas supprimer les en-tÃªtes des fichiers html.
+
+HTMLPlugin.metadata_fields:Liste de champs de mÃ©tadonnÃ©es Ã  essayer d'extraire, sÃ©parÃ©s par des virgules. Utiliser l'expression 'tag<nom de balise>' pour mettre le contenu de la premiÃšre paire de <nom de balise> dans l'Ã©lÃ©ment de mÃ©tadonnÃ©es 'nom de balise'. Utiliser les majuscules parce que les Ã©lÃ©ments de mÃ©tadonnes sont capitalisÃ©s en Greenstone, et l'extraction des balises ne tient pas compte de la casse.
+
+
+
+HTMLPlugin.no_metadata:Ne cherchez pas Ã  extraire des mÃ©tadata des fichiers.
+
+HTMLPlugin.no_strip_metadata_html:Liste de noms de mÃ©ta-donnÃ©es sÃ©parÃ©es par des virgules, ou 'all'. UtilisÃ© avec -description_tags, cela Ã©vite d'Ã©liminer les balises HTML des valeurs pour les mÃ©ta-donnÃ©es spÃ©cifiÃ©es.
+
+HTMLPlugin.nolinks:Ne pas essayer de piÃ©ger les liens (la dÃ©finition de ce drapeau peut amÃ©liorer la vitesse de construction/importation mais tout lien relatif dans le document sera brisÃ©).
+
+HTMLPlugin.no_image_links:Ne pas faire de tentative pour capturer les liens vers les images pour permettre de voir directement les images.
+
+HTMLPlugin.rename_assoc_files:Renomme les fichiers associÃ©s aux documents (ex. les images). CrÃ©e aussi une structure de rÃ©pertoire beaucoup plus petite (utile pour la crÃ©ation de collections sur cd-rom).
+
+HTMLPlugin.sectionalise_using_h_tags:CrÃ©e automatiquement un document sectionnÃ© en utilisant les tags h1, h2, ...hX.
+
+HTMLPlugin.title_sub:Expression de substitution pour modifier la chaine enregistrÃ©e comme titre. UtilisÃ© par exemple par PDFPlugin pour supprimer ''Page 1'', etc du texte utilisÃ© comme titre.
+
+HTMLPlugin.tidy_html:Si dÃ©fini, convertit un document HTML en un document XHTML bien formÃ©. Cela permettra Ã  l'utilisateur de visualiser le document en format livre.
+
+HTMLPlugin.old_style_HDL:Pour marquer si le fichier dans cette collection est dÃ©coupÃ© en sections en utilisant l'ancien style de la section de HDL.
+
+BaseMediaConverter.enable_cache:Mettre en cache les fichiers produits automatiquement (comme les vignettes ou les images grand format) pour qu'ils ne soient pas gÃ©nÃ©rÃ©s Ã  chaque demande.
+
+ImageConverter.converttotype:Convertit lâimage pricipale en une format 's'.
+
+ImageConverter.create_screenview:Si cette option est cochÃ©e, crÃ©e une image de la taille de l'Ã©cran, et dÃ©finit les mÃ©tadonnÃ©es Ã©cran, type d'Ã©cran, icÃŽne d'Ã©cran, largeur d'Ã©cran, hauteur d'Ã©cran.
+
+ImageConverter.create_thumbnail:Si cette option est cochÃ©e, crÃ©e une vignette de chaque image, et dÃ©finit les mÃ©tadonnÃ©es vignette, type de vignette, icÃŽne de vignette, largeur de vignette et hauteur de vignette.
+ImageConverter.desc:Plugiciel pour des documents constituÃ©s d'une suite d'images, avec la possibilitÃ© de texte OCR pour chaque image. Ce plugiciel traite des fichiers .item qui listent  la sÃ©quence des images et des fichiers texte, et fournit des mÃ©tadonnÃ©es.
+
+ImageConverter.imagemagicknotinstalled:Image Magick n'est pas installÃ©.
+
+ImageConverter.minimumsize:Ignorer les images de moins de n octets.
+
+ImageConverter.noconversionavailable:La conversion d'image n'est pas disponible.
+
+ImageConverter.noscaleup:Ne pas rÃ©Ã©chelonner les petites images en crÃ©ant des vignettes.
+
+ImageConverter.screenviewsize:CrÃ©e des images vue-Ã©cran de taille nxn.
+
+ImageConverter.screenviewtype:CrÃ©e des images vue-Ã©cran en format 's'.
+
+ImageConverter.thumbnailsize:CrÃ©e des vignettes de taille nxn.
+
+ImageConverter.thumbnailtype:CrÃ©e des vignettes au format 's'.
+
+ImageConverter.win95notsupported:Image Magick n'est pas supportÃ© sous Win95/98
+
+ImagePlugin.desc:Ce plugin traite les images, en ajoutant des mÃ©ta-donnÃ©es de base
+
+IndexPlugin.desc:Ce plugin rÃ©cursif traite un fichier index.txt. Le fichier index.txt doit contenir la liste des fichiers Ã  inclure dans la collection, suivie par toute mÃ©ta-donnÃ©e supplÃ©mentaire Ã  associer Ã  chaque fichier\n\nLe fichier index.txt doit Ãªtre formatÃ© comme suit: la premiÃšre ligne peut Ãªtre une clÃ© (commenÃ§ant par key:) pour nommer les champs de mÃ©ta-donnÃ©e (ex. key: Subject Organization Date). Les lignes suivantes contiennent un nom de fichier suivi de la valeur de la mÃ©ta-donnÃ©e (ex 'irma/iwo097e 3.2 unesco 93â va associer les mÃ©ta-donnÃ©es Subject= 3.2, Organization=unesco, et Date=1993 avec le fichier irma/iwo097e si la ligne de clÃ© ci dessus a Ã©tÃ© utilisÃ©e)\n\nNotez que si l'un des champs de mÃ©ta-donnÃ©e utilise le plugin de classification de HiÃ©rarchie, alors sa valeur doit correspondre au premier champ (le descripteur) dans le fichier de classification appropriÃ©.\n\nLes valeurs de mÃ©ta-donnÃ©e peuvent Ãªtre nommÃ©es sÃ©parÃ©ment en utilisant une balise (ex. >Sujet<3.2) et cela va remplacer tout nom qui leur a Ã©tÃ© attribuÃ© par la ligne de clÃ©. S'il n'y a pas de ligne de clÃ©, toute valeur de  mÃ©ta-donnÃ©e sans nom sera nommÃ©e 'Subject'.
+
+ISISPlugin.desc:Ce plugin traite les bases de donnÃ©es CDS/ISIS. Pour chaque base de donnÃ©es CDS/ISIS traitÃ©e, il doit y avoir trois fichiers dans le dossier d'importation de la collection: le Fichier de Base (.mst), le Tableau de DÃ©finition de Champ (.fdt), et le Fichier de RÃ©fÃ©rences croisÃ©es (.xrf).
+
+ISISPlugin.subfield_separator:La chaÃ®ne utilisÃ©e pour sÃ©parer les sous champs dans les enregistrements de bases de donnÃ©es CDS/ISIS.
+
+ISISPlugin.entry_separator:La chaÃ®ne utilisÃ©e pour sÃ©parer les valeurs multiples des champs de mÃ©ta-donnÃ©es individuelles dans les enregistrements de base de donnÃ©es CDS/ISIS.
+
+KeyphraseExtractor.desc:Plugiciel d'extraction pour gÃ©nÃ©rer les phrases clÃ©s Ã  partir du texte. Utilise le systÃšme d'extraction de mots-clÃ©s Kea.
+
+KeyphraseExtractor.extract_keyphrases:Extraction automatique des phrases clÃ©s avec Kea (par dÃ©faut).
+
+KeyphraseExtractor.extract_keyphrases_kea4:Extrait les phrases clÃ© automatiquement avec Kea 4.0 (configuration par dÃ©faut). Kea 4.0 est une nouvelle version qui a Ã©tÃ© developpÃ©e pour une indexation controllÃ©e de documents dans le domaine de l' agriculture.
+
+KeyphraseExtractor.extract_keyphrase_options:Options pour l'extraction phrase clÃ© avec Kea. Par exemple: mALIWEB - utilise ALIWEB modÃšle d'extraction; n5 - extraire 5 phrases clÃ©; eGBK - utiliser l'encodage GBK
+
+KeyphraseExtractor.keyphrases:expressions clÃ©s
+
+KeyphraseExtractor.missing_kea:Erreur: Le logiciel Kea n' a pas pu Ãªtre trouvÃ© Ã  %s. TÃ©lÃ©chargez Kea %s de http://nzdl.org/Kea et installez-le dans ce catalogue.
+
+LaTeXPlugin.desc:Plugin pour documents  LaTeX .
+
+LOMPlugin.desc:Plugiciel pour importer des fichiers LOM (Learning Object Metadata).
+
+LOMPlugin.root_tag:Le DocType du fichier XML (ou une expression rÃ©guliÃšre qui correspond Ã  l'Ã©lÃ©ment racine).
+
+LOMPlugin.check_timestamp:VÃ©rifie l'horodatage des fichiers tÃ©lÃ©chargÃ©s prÃ©cÃ©demment, et les tÃ©lÃ©charge seulement si le nouveau fichier source est plus rÃ©cent.
+
+LOMPlugin.download_srcdocs:TÃ©lÃ©charge le document source si on l'a spÃ©cifiÃ© (avec  general^identifier^entry ou technical^location). Cette option devrait comporter une expression rÃ©guliÃšre correspondant aux  noms de fichiers avant leur tÃ©lÃ©chargement. Remarque: cela ne fonctionne pas pour les documents en dehors d'un pare-feu.
+
+MARCPlugin.desc:Plugin MARC de base.
+
+MARCPlugin.metadata_mapping:Nom du fichier qui contient les dÃ©tails de correspondance des champs MARC avec les noms des mÃ©tadonnÃ©es Greenstone. Le fichier par dÃ©faut est 'marctodc.txt' qui se trouve dans le rÃ©pertoire etc du site.
+
+MARCXMLPlugin.desc:Plugiciel MARCXML.
+
+MARCXMLPlugin.metadata_mapping_file:Nom de fichier qui comprend les dÃ©tails de la correspondance  des valeurs MARC  avec les noms des mÃ©tadonnÃ©es Greenstone. Les valeurs par dÃ©faut sont dans  'marc2dc.txt',  qui se trouve dans le rÃ©pertoire etc du site.
+
+
+
+
+
+MediaWikiPlugin.desc:Plugiciel pour importer des pages Web au format MediaWiki
+
+MediaWikiPlugin.show_toc:Ajoute Ã  la page "A propo"s de la collection la page "Table des matiÃšres" situÃ©e sur la page principale du site de MediaWiki. Il est nÃ©cessaire de spÃ©cifier ci-dessous une expression rÃ©guliÃšre Perl dans toc_exp  pour reconnaÃ®tre la section "table des matiÃšres".
+
+MediaWikiPlugin.delete_toc:Supprime la section "table des matiÃšres" sur chaque page HTML. Il est nÃ©cessaire de spÃ©cifier ci-dessous  une expression rÃ©guliÃšre Perl dans toc_exp pour correspondre Ã  la "table des matiÃšres".
+
+MediaWikiPlugin.toc_exp:Une expression rÃ©guliÃšre Perl pour reconnaÃ®tre la "Table des matiÃšres". La valeur par dÃ©faut correspond Ã  des pages Web courantes au format MediaWiki.
+
+MediaWikiPlugin.delete_nav:Supprime la section de navigation. Il est nÃ©cessaire de spÃ©cifier ci-dessous une expression rÃ©guliÃšre Perl dans nav_div_exp.
+
+MediaWikiPlugin.nav_div_exp:Une expression rÃ©guliÃšre Perl pour reconnaÃ®tre la section de navigation. La valeur par dÃ©faut correspond Ã  des pages Web courantes au format MediaWiki.
+
+MediaWikiPlugin.delete_searchbox:Supprime la section "searchbox". Il est nÃ©cessaire de spÃ©cifier ci-dessous une expression rÃ©guliÃšre Perl dans searchbox_div_exp .
+
+MediaWikiPlugin.searchbox_div_exp:Une expression rÃ©guliÃšre Perl pour reconnaÃ®tre la section "searchbox". La valeur par dÃ©faut correspond Ã  des pages Web courantes au format MediaWiki.
+
+MediaWikiPlugin.remove_title_suffix_exp:Une expression rÃ©guliÃšre Perl pour dÃ©limiter le titre extrait. Par exemple, \ \ s (. +) limitera le titre au contenu situÃ© avant "-".
+
+MetadataCSVPlugin.desc:Un plugiciel pour les mÃ©tadonnÃ©es situÃ©es dans des champs sÃ©parÃ©s par des virgules. Le champ Nom de fichier dans le fichier CSV est utilisÃ© pour dÃ©terminer Ã  quel document appartiennent les mÃ©tadonnÃ©es.
+
+MetadataPass.desc:Classe de base Ã  BasePlugin qui permet l'utilisation des plugins mÃ©ta-donnÃ©e, utilise la passe metadata_read de import.pl
+
+MetadataXMLPlugin.desc:Plugiciel traitant les fichiers metadata.xml
+
+GreenstoneMETSPlugin.desc:Traiter des documents METS de style Greenstone
+
+MP3Plugin.desc:Plugin pour le traitement des fichiers MP3.
+
+MP3Plugin.assoc_images:Utilise la recherche d'images Google pour localiser des images qui ont une relation avec les fichiers MP3 en se basant sur les mÃ©tadonnÃ©es ID3 Titre et Artiste.
+
+MP3Plugin.applet_metadata:UtilisÃ© pour enregistrer [applet] des mÃ©ta-donnÃ©es pour chaque document qui contient le code HTML d'un applet MP3 audio player pour jouer ce fichier.
+
+MP3Plugin.metadata_fields:Liste de champs mÃ©ta-donnÃ©es sÃ©parÃ©s par des virgules pour extraction dans un fichier MP3 (supposÃ© prÃ©sent) . Utiliser \"*\" pour extraire tous les champs.
+
+NulPlugin.desc:Fichier plugin factice (.nul). UtilisÃ© avec les fichiers gÃ©nÃ©rÃ©s lors de l'Ã©clatement des bases de donnÃ©es mÃ©ta-donnÃ©es.
+
+NulPlugin.assoc_field:Nom du champ de mÃ©tadonnÃ©es qui sera dÃ©fini pour chaque fichier nul.
+NulPlugin.add_metadata_as_text:Ajoute une table de mÃ©tadonnÃ©es en tant que texte du document plutÃŽt que Â«Â Ce document n'a pas de texteÂ Â».
+
+NulPlugin.remove_namespace_for_text:Supprime l'espace de noms dans les noms de mÃ©tadonnÃ©es dans le texte du document (si add_metadata_as_text est cochÃ©).
+
+OAIPlugin.desc:Plugiciel de base pour les donnÃ©es Open Archives Initiative (OAI)
+
+OAIPlugin.document_field:L'Ã©lÃ©ment de mÃ©tadonnÃ©es spÃ©cifiant le nom de fichier des documents auxquels rattacher les mÃ©tadonnÃ©es.
+
+OAIPlugin.metadata_set:Jeu de mÃ©tadonnÃ©es (prÃ©fixe de l'espace de nom) dans lequel toutes les mÃ©tadonnÃ©es seront importÃ©es.
+OAIPlugin.metadata_set.auto:Utiliser les prÃ©fixes dÃ©finis dans les enregistrements OAI.
+OAIPlugin.metadata_set.dc:Utilise le prÃ©fixe Dublin Core (dc). Transformera les Ã©lÃ©ments Dublin Core qualifiÃ©s dans leur forme appropriÃ©e dans Greenstone, par exemple spatial deviendra dc.Coverage^spatial.
+
+
+
+
+
+
+
+
+
+OggVorbisPlugin.add_technical_metadata:Ajouter des mÃ©ta-donnÃ©es techniques (c.a.d. bitrate)
+
+OggVorbisPlugin.desc:Un plugin pour importer des fichiers audio Ogg Vorbis.
+
+OpenDocumentPlugin.desc:Module externe pour les documents au format OASIS OpenDocument (utilisÃ© par OpenOffice 2.0)
+
+PagedImagePlugin.desc:Plugiciel pour les documents constituÃ©s d'une suite d'images, avec la possibilitÃ© faire une reconnaissance automatique de texte (OCR) pour chaque image. Ce plugiciel traite les fichiers .item qui dressent la liste les images et les fichiers texte, et fournit des mÃ©tadonnÃ©es.
+
+PagedImagePlugin.documenttype:Met le type de document (utilisÃ© pour le display)
+
+PagedImagePlugin.documenttype.paged:Les documents avec pages numÃ©rotÃ©es ont des flÃšches qui indiquent la prochaine et la derniÃšre page, ainsi qu'une boite permettant d'aller directement la page X
+
+PagedImagePlugin.documenttype.hierarchy:Les documents hiÃ©rarchiques ont une table de contenu.
+
+PagedImagePlugin.headerpage:Ajouter une page d'entÃªte au niveau supÃ©rieur( sans image) Ã  chaque document.
+
+PDFPlugin.allowimagesonly:Autorise les fichiers en format PDF qui n' ont pas de texte extractible. Evite d'avoir Ã  dÃ©finir -set complexe. Uniquement utile avec l'option convert_to html.
+
+PDFPlugin.complex:CrÃ©e une sortie plus complexe. Avec la dÃ©finition de cette option, la sortie html va beaucoup plus ressembler au fichier PDF original. Pour que cela fonctionne correctement, il faut que Ghostscript soit installÃ© (pour *nix, gs doit Ãªtre dans la dÃ©finition de chemins, pendant que pour windows, vous devez avoir gswin32c.exe sur votre chemin).
+
+PDFPlugin.desc:Plugiciel qui traite  les documents PDF.
+
+PDFPlugin.nohidden:EmpÃªche pdftohtml de chercher Ã  extraire du texte cachÃ©. Cela n'est utile que si l'option -complex est Ã©galement dÃ©finie.
+
+PDFPlugin.noimages:Ne pas chercher Ã  extraire des images de PDF.
+
+PDFPlugin.use_sections:CreÃ©e une section sÃ©parÃ©e pour chaque page du fichier PDF.
+
+PDFPlugin.zoom:Le facteur avec lequel zoomer PDF pour la sortie (ceci n'est utile que si -comlex est dÃ©fini).
+
+PostScriptPlugin.desc:Ceci est un convertisseur de texte ps \''bon marchÃ©\''. Si vous Ãªtes sÃ©rieux, pensez Ã  utiliser le paquetage PRESCRIT, qui est disponible pour tÃ©lÃ©chargement Ã  http://www.nzdl/software.html
+
+PostScriptPlugin.extract_date:Extrait date de l'en-tÃªte PS.
+
+PostScriptPlugin.extract_pages:Extrait pages de l'en-tÃªte PS.
+
+PostScriptPlugin.extract_title:Extrait titre de l'entÃªte PS.
+
+PowerPointPlugin.desc:Un plugin pour importer des fichiers Microsoft PowerPoint.
+
+PowerPointPlugin.windows_scripting:Utilise la technologie de script de Microsoft Windows (Visual Basic pour Applications) pour que PPT puisse convertir le document vers plusieurs types d' images (p. ex. JPEG, PNG, GIF) au lieu de dÃ©pendre du logiciel open source ppttohtml.
+
+
+
+
+
+
+
+
+
+
+
+PrintInfo.bad_general_option:Le plugiciel %s utilise une option incorrecte. VÃ©rifiez votre fichier de configuration collect.cfg.
+
+PrintInfo.desc:Plugiciel de base qui gÃšre les informations d'impression (en utilisant pluginfo.pl) et en traitant tous les arguments.
+
+ProCitePlugin.desc:Un plugiciel pour les bases de donnÃ©es ProCite (exportÃ©es)
+
+ProCitePlugin.entry_separator:La chaÃ®ne de caractÃšre utilisÃ©e pour sÃ©parer les valeurs multiples des champs de mÃ©tadonnÃ©es dans les enregistrements des bases ProCite.
+
+ReadTextFile.could_not_extract_encoding:ATTENTION: encodage n'a pas pu Ãªtre extrait de %s - utilisation de %s par dÃ©faut
+
+ReadTextFile.could_not_extract_language:ATTENTION: langue n'a pas pu Ãªtre extraite de %s - utilisation de %s par dÃ©faut
+
+ReadTextFile.could_not_open_for_reading:impossible d'ouvrir %s pour lecture
+
+ReadTextFile.default_encoding:Utiliser cet encodage si -input_ encoding est placÃ© Ã  'auto' et l'algorithme de catÃ©gorisation de texte ne rÃ©ussit pas Ã  extraire l'encodage ou lorsqu'il extrait un encodage non supportÃ© par Greenstone. Cette option peut prendre la mÃªme valeur que -input_ encoding.
+
+ReadTextFile.default_language:Si Greenstone ne rÃ©ussit pas Ã  identifier la langue du document, l'Ã©lÃ©ment de mÃ©tadonnÃ©es 'Langue' sera fixÃ© Ã  cette valeur. Le dÃ©faut est 'en' (les symboles de langue ISO 639 sont utilisÃ©s: en= anglais). Notez que si -imput_encoding n'est pas fixÃ© Ã  'auto' et -extract_language n'est pas dÃ©fini, la mÃ©tadonnÃ©e 'Langue' sera fixÃ©e Ã  cette valeur pour tous les documents.
+
+ReadTextFile.desc:Plugiciel de base pour les fichiers plein texte.
+
+ReadTextFile.empty_file:le fichier ne contient aucun texte
+
+ReadTextFile.extract_language:Identifier la langue de chaque document et dÃ©finir la mÃ©ta-donnÃ©e 'Langue'. Notez que cela se fera automatiquement si -imput_encoding est Ã  'auto'.
+
+ReadTextFile.file_has_no_text:ERREUR: %s ne contient pas de texte
+
+ReadTextFile.input_encoding:Encodage des documents sources. Les documents vont Ãªtre convertis de ces encodages et stoquÃ©s en interne au format utf8.
+
+ReadTextFile.input_encoding.auto:Utilisez un algorithme de catÃ©gorisation de texte pour identifier automatiquement le codage de chaque document source, cela sera plus lent que l'opÃ©ration consistant Ã  mettre explicitement le codage mais est efficace lorsqu'il y a plusieurs codes dans une mÃªme collection.
+
+ReadTextFile.read_denied:Permission de lecture refusÃ©e pour %s
+
+ReadTextFile.separate_cjk:InsÃ©re des espaces entre les charactÃšres Chinois/Japonais/CorÃ©ens pour faire de chaque caractÃšre un mot. A utiliser si le texte n' est pas segmentÃ©.
+
+ReadTextFile.unsupported_encoding:ATTENTION: %s semble encodÃ© dans un encodage non supportÃ© (%s) - utilisant %
+
+ReadTextFile.wrong_encoding:ATTENTION: %s a Ã©tÃ© lu en utilisant l'encodage %s mais semble avoir Ã©tÃ© encodÃ© comme %s
+
+ReadXMLFile.desc:Classe de base pour les plugins XML.
+
+ReadXMLFile.xslt:Transforme un document entrant compatible avec le XSLT nommÃ© dans le fichier. Un nom de fichier relatif est dÃ©fini Ã  partir du rÃ©pertoire du fichier de la collection, par exemple etc/mods2dc.xsl.
+
+RealMediaPlugin.desc:Un plugciel pour le traitement automatique de l'information des fichiers Real Media.
+
+ReferPlugin.desc:ReferPlugin lit les fichiers de bibliographie au format Refer.
+
+RogPlugin.desc:CrÃ©e des documents Ã  un seul niveau Ã  partir de fichiers .rog ou .mdb.
+
+RTFPlugin.desc:Plugin pour l'importation de fichiers Rich Text Format.
+
+SourceCodePlugin.desc:Le nom du fichier est prÃ©sentement utilisÃ© pour Titre (optionnellement moins un certain prÃ©fixe). Languages actuels:\ntext:READMEs/Makefiles\nC/C++ (extrait actuellement les dÃ©clarations #include et les dÃ©clarations de classe C++)\n Perl (pour le moment, effectuÃ© uniquement comme texte)\nShell (pour le moment, effectuÃ© uniquement comme texte)
+
+SourceCodePlugin.remove_prefix:Enlever cette chaine de dÃ©but du nom de fichier (ex.: -remove_prefix /tmp/XX/src). Par dÃ©faut, le chemin complet est supprimÃ© du nom de fichier.
+
+SplitTextFile.desc:SplitTextFile est un plugin pour Ã©clater des fichiers d'entrÃ© en en segments qui vont Ãªtre traitÃ©s individuellement. Ce plugin ne doit pas Ãªtre invoquÃ© directement. Si vous voulez traiter des fichiers d'entrÃ©e qui contiennent plusieurs documents, vous devez plutÃŽt Ã©crire un plugin avec une fonction de traitement qui va traiter un de ces documents et hÃ©riter de SplitTextFile. Voir ReferPlugin en guise d'exemple.
+
+SplitTextFile.split_exp:Une expression ordinaire Perl pour Ã©clater les fichiers d'entrÃ©e en segments.
+
+StructuredHTMLPlugin.desc:Un plugiciel pour traiter les documents HTML structurÃ©s, en les scindant en sections basÃ©es sur les informations de style.
+
+StructuredHTMLPlugin.delete_toc:Retire toute table des matiÃšres, liste des figures, etc du fichier HTML converti. Des styles  sont dÃ©finis pour cela par l'option toc_header.
+
+StructuredHTMLPlugin.title_header:Styles possibles dÃ©finis par l'utilisateur pour l'en-tÃªte du titre
+
+StructuredHTMLPlugin.level1_header:Styles possibles dÃ©finis par l'utilisateur pour l' entÃªte de niveau 1 dans le document au format HTML (Ã©quivalent Ã  <h1>).
+
+StructuredHTMLPlugin.level2_header:Styles possibles dÃ©finis par l'utilisateur pour l' entÃªte de niveau 2 dans le document au format HTML (Ã©quivalent Ã  <h2>).
+
+StructuredHTMLPlugin.level3_header:Styles possibles dÃ©finis par l'utilisateur pour l' entÃªte de niveau 3 dans le document HTML (Ã©quivalent Ã  <h3>).
+
+StructuredHTMLPlugin.toc_header:Les styles possibles d'en-tÃªte dÃ©finis par l'utilisateur pour la table des matiÃšres, le tableau de figures, etc, devront Ãªtre Ã©liminÃ©s si delete_toc est cochÃ©.
+
+TextPlugin.desc:CrÃ©e un document Ã  niveau unique. Ajoute une mÃ©ta-donnÃ©e de Titre de premiÃšre ligne de texte (jusqu'Ã  100 caractÃšres).
+
+TextPlugin.title_sub:Expression de substitution pour modifier la chaine stockÃ©e comme Titre. UtilisÃ©e par exemple par PostScriptPlugin pour supprimer ''Page 1'' etc du texte utilisÃ© comme titre.
+
+UnknownPlugin.assoc_field:Nom du champ de mÃ©ta-donnÃ©e qui va contenir le nom de fichier associÃ©.
+
+UnknownPlugin.desc:Ceci est un plugin simple d'importation de fichiers aux formats inconnus de Greenstone. Un document fictif va Ãªtre crÃ©Ã© pour chacun de ses fichiers et le fichier lui mÃªme va Ãªtre passÃ© Ã  Greenstone comme \"fichier associÃ©\" du document.
+
+UnknownPlugin.file_format:Type Mime du fichier (ex. image/gif).
+
+UnknownPlugin.mime_type:Type Mime du fichier (c.a.d. image/gif).
+
+UnknownPlugin.process_extension:Traiter les fichiers avec cette extension. Cette option est une alternative Ã  process_exp qui est plus simple Ã  utiliser mais moins flexible.
+
+UnknownPlugin.srcicon:SpÃ©cifie un nom de macro (sans tiret bas) Ã  utiliser comme mÃ©tadonnÃ©e srcicon.
+
+WordPlugin.desc:Un plugin pour des documents Microsoft Word.
+
+WordPlugin.windows_scripting:Utilise la technologie de scripts de Microsoft Windows (Applications pour Visual Basic) pour que Word transforme le document au format HTML au lieu d'utiliser le logiciel open source WvWare. Cela provoque le dÃ©marrage de l'application Word si celle-ci n'est pas dÃ©jÃ  ouverte.
+
+WordPlugin.metadata_fields:Ceci sert Ã  rÃ©cupÃ©rer les mÃ©tadonnÃ©es du document au format HTML converties par un script VB. Cela permet de dÃ©finir des listes de champs sÃ©parÃ©s par une virgule pour tenter d'en extraire les mÃ©tadonnÃ©es. Utilisez 'tag<tagname>' pour extraire les contenus de la premiÃšre paire <tagname> et les classer dans un Ã©lÃ©ment de mÃ©tadonnÃ©es appelÃ© 'tagname'. Vous pouvez Ã©crire comme vous voulez le nom de la mÃ©tadonnÃ©e dans Greenstone car l'extraction des attributs est insensible Ã  la casse.
+
+ZIPPlugin.desc:Plugin qui traite les formats d'entrÃ©e compressÃ©s et/ou les formats d'entrÃ©e archivÃ©s actuellement traitÃ©s et les extensions de fichiers sont:\ngzip (.gz, .z, .tgz, .taz)\nbzip (.bz)\nbzip2 (.bz2)\nzip (.zip .jar)\ntar (.tar)\n\n. Ce plugin dÃ©pend de la prÃ©sence des utilaires suivants (lorsqu'il essaie de traiter les formats correspondants):\ngunzip (pour gzip)\nbunzip (pour bzip)\nbunzip2 \nunzip (pour zip)\ntar (pour tar)
+
+#
+# Download module option descriptions
+#
+
+BaseDownload.desc:Classe de base pour les modules de tÃ©lÃ©chargement
+BaseDownload.bad_general_option:Le module de tÃ©lÃ©chargement %s utilise un paramÃštre incorrect.
+MediaWikiDownload.desc:Un module de tÃ©lÃ©chargement Ã  partir de sites Internet MediaWiki
+MediaWikiDownload.reject_filetype:La liste URL Ã  ignorer, sÃ©parÃ©s par une virgule, par exemple cgi-bin * *, *. ppt ignore les hyperliens qui contiennent soit "cgi-bin" ou ". ppt '
+MediaWikiDownload.reject_filetype_disp:La liste des URL Ã  ignorer, sÃ©parÃ©s par une virgule
+MediaWikiDownload.exclude_directories:Liste des rÃ©pertoires exclus (doit Ãªtre le chemin absolu vers le rÃ©pertoire), par exemple : /personnes, /documentation excluront les sous-rÃ©pertoires "peuple" et "documentation"  dans l'exploration du site actuel en exploration.
+MediaWikiDownload.exclude_directories_disp:La liste des rÃ©pertoires Ã  exclure, sÃ©parÃ©s par une virgule
+
+OAIDownload.desc:Un module de tÃ©lÃ©chargement Ã  partir des dÃ©pÃŽts OAI
+OAIDownload.url_disp:URL de la source
+OAIDownload.url:URL de l'entrepÃŽt OAI
+OAIDownload.set_disp:Restreindre au jeu  
+OAIDownload.set:Restreindre le tÃ©lÃ©chargement Ã  un lot spÃ©cifique du depÃŽt  
+OAIDownload.metadata_prefix_disp:PrÃ©fixe des mÃ©tadonnÃ©es.
+OAIDownload.metadata_prefix:Le format de mÃ©tadonnÃ©es utilisÃ© pour les exports, par exemple oai_dc, gdc, etc. Cliquer sur le bouton <Server information> pour connaÃ®tre les formats supportÃ©s.
+OAIDownload.get_doc_disp:Obtenir le document
+OAIDownload.get_doc:TÃ©lÃ©charger le document source si il'est spÃ©cifiÃ© dans l'enregistrement
+OAIDownload.get_doc_exts_disp:Restrictions sur type de fichier.  
+OAIDownload.get_doc_exts:Extension(s) de nom de fichier acceptÃ©e(s)  
+OAIDownload.max_records_disp:Maximum d'enregistrements
+OAIDownload.max_records:Nombre maximum d'enregistrements Ã  tÃ©lÃ©charger
+
+SRWDownload.desc:Un module de tÃ©lÃ©chargement Ã  partir de dÃ©pÃŽts SRW (Search/Retrieve Web Service)
+
+WebDownload.desc:Un module de tÃ©lÃ©chargement Ã  partir d'Internet via HTTP ou FTP
+WebDownload.url:URL Source. En cas de redirection http, cette valeur peut changer
+WebDownload.url_disp:URL Source
+WebDownload.depth:Jusqu'Ã  quelle profondeur d'hyperliens aller lors du tÃ©lÃ©chargement
+WebDownload.depth_disp:Profondeur de tÃ©lÃ©chargement
+WebDownload.below:Mettre en miroir seulement les fichiers ci-dessous cette URL
+WebDownload.below_disp:Mettre en miroir seulement les fichiers dont l'adresse commence par cet URL.
+WebDownload.within:Mettre en mirroir seuls les fichiers dans le mÃªme site
+WebDownload.within_disp:Mettre en mirroir seulement les fichiers situÃ©s dans le mÃªme site
+WebDownload.html_only:TÃ©lÃ©chagez uniquement des fichiers HTML, et ignorez les fichiers associÃ©s, par exemple des images et des feuilles de style
+WebDownload.html_only_disp:Ne tÃ©lÃ©charger que des fichiers HTML
+
+WgetDownload.desc:Classe de base qui gÃšre les appels Ã  wget
+WgetDownload.proxy_on:Proxy en marche
+WgetDownload.proxy_host:HÃŽte mandataire
+WgetDownload.proxy_port:Port du Proxy
+WgetDownload.user_name:Nom d'utilisateur
+WgetDownload.user_password:Password d'utilisateur
+
+Z3950Download.desc:Un module de tÃ©lÃ©chargement Ã  partir d'un dÃ©pÃŽt Z3950
+Z3950Download.host:URL de l'hÃŽte
+Z3950Download.host_disp:HÃŽte mandataire
+Z3950Download.port:NumÃ©ro de port du dÃ©pÃŽt
+Z3950Download.port_disp:Port
+Z3950Download.database:Base de donnÃ©es pour y rechercher des documents
+Z3950Download.database_disp:Base de donnÃ©es
+Z3950Download.find:RÃ©cupÃ©rez les enregistrements contenant le terme de recherche spÃ©cifiÃ©
+Z3950Download.find_disp:Trouvez
+Z3950Download.max_records:Nombre maximum d'enregistrements Ã  tÃ©lÃ©charger
+Z3950Download.max_records_disp:Maximum d'enregistrements
+
+
+#
+#Plugout option descriptions
+#
+
+BasPlugout.bad_general_option:Le % s plugout utilise un paramÃštre incorrect.
+BasPlugout.debug:mettre le mode de dÃ©bogage.
+BasPlugout.desc:Classe de base pour tous les plugiciels d'export.
+BasPlugout.group_size:Nombre de documents Ã  regrouper dans un seul fichier XML.
+BasPlugout.gzip_output:Utiliser gzip pour compresser les documents xml rÃ©sultants (ne pas oublier d'inclure ZIPPlugin dans votre liste de plugiciels lors d'une construction Ã  partir de documents compressÃ©s)
+BasPlugout.output_handle:le descripteur de fichier utilisÃ© pour recevoir les donnÃ©es de sortie
+BasPlugout.output_info:la rÃ©fÃ©rence Ã  un objet arcinfo utilisÃ©e pour stocker des informations au sujet des archives.
+BasPlugout.verbosity:ContrÃŽle le volume des sorties de donnÃ©es. 0=aucun, 3=beaucoup.
+BasPlugout.xslt_file:Transformer un document avec le XSLT dans le fichier nommÃ©.
+
+DSpacePlugout.desc:Format Archive Dspace.
+
+
+FedoraMETSPlugout.desc:Format METS utilisant le profil Fedora.
+FedoraMETSPlugout.fedora_namespace:PrÃ©fixe utilisÃ© dans Fedora pour traiter les identifiants (PIDS), par exemple greenstone:HASH0122efe4a2c58d0
+
+GreenstoneXMLPlugout.desc:Format d'archivage XML Greenstone.
+
+GreenstoneMETSPlugout.desc:Format METS utilisant le profil Greenstone.
+
+MARCXMLPlugout.desc:Format MARC xml
+MARCXMLPlugout.group:Extrait les enregistrement Marc XML dans un seul fichier.
+MARCXMLPlugout.mapping_file:Pour la transformation, utilisez le fichier de correpondances nommÃ©.
+
+METSPlugout.desc:Plugicel superclass pour le format METS. Il fournit une fonctionnalitÃ© commune pour des profils tels que GreenstoneMETS, FedoraMETS et les mÃ©thodes "key abstract".
+METSPlugout.xslt_txt:Transforme un fichier METS docmets.txtl avec le fichier XSLT nommÃ© dans le fichier .
+METSPlugout.xslt_mets:Transforme un fichier METS docmets.xml avec le fichier XSLT nommÃ© dans le fichier .
+
+#
+# Perl module strings
+#
+
+classify.could_not_find_classifier:ERREUR: Classificateur \''%s\'' introuvable
+
+download.could_not_find_download:ERREUR: Impossible de trouver le module tÃ©lÃ©charger \"%s\"
+
+plugin.could_not_find_plugin:ERREUR: impossible de trouver le plugin /''%s''
+
+plugin.including_archive:intÃ©gration des contenus d'une archive ZIP/TAR
+
+plugin.including_archives:intÃ©gration des contenus de %d archives ZIP/TAR
+
+plugin.kill_file:Processus tuÃ© par le fichier .kill
+
+plugin.n_considered:%d documents ont Ã©tÃ© pris en compte pour traitement
+
+plugin.n_included:%d ont Ã©tÃ© traitÃ©s et intÃ©grÃ©s dans la collection
+
+plugin.n_rejected:%d ont Ã©tÃ© rejetÃ©s
+
+plugin.n_unrecognised:%d n'ont pas Ã©tÃ© reconnus
+
+plugin.no_plugin_could_process:ATTENTION: Aucun plugin n'a pu traiter %s
+
+plugin.no_plugin_could_recognise:ATTENTION: Aucun plugin n'a pu reconnaÃ®tre %s
+
+plugin.no_plugin_could_process_this_file:aucun plugin n'a pu traiter ce fichier
+
+plugin.no_plugin_could_recognise_this_file:Aucun plugin n'a pu reconnaÃ®tre ce fichier
+
+plugin.one_considered:1 document a Ã©tÃ© pris en compte pour traitement
+
+plugin.one_included:1 a Ã©tÃ© traitÃ© et intÃ©grÃ© dans la collection
+
+plugin.one_rejected:1 a Ã©tÃ© rejetÃ©
+
+plugin.one_unrecognised:1 n'a pas Ã©tÃ© reconnu
+
+plugin.see_faillog:Voir %s pour une liste des documents rejetÃ©s ou non-identifiÃ©s
+
+PrintUsage.default:DÃ©faut
+
+PrintUsage.required:REQUIS
+
+plugout.could_not_find_plugout:ERREUR: Impossible de trouver le "plugout" \"%s"
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/strings_ja.properties
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/strings_ja.properties	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/strings_ja.properties	(revision 24799)
@@ -0,0 +1,1529 @@
+#
+# Resource bundle description
+#
+
+Language.code:en  
+Language.name:English  
+
+OutputEncoding.unix:iso_8859_1  
+OutputEncoding.windows:iso_8859_1  
+
+
+#
+# Common output messages and strings
+#
+
+common.cannot_create_file:ãšã©ãŒïŒãã¡ã€ã« %sãäœæã§ããŸãã  
+
+common.cannot_find_cfg_file:ãšã©ãŒïŒå¶åŸ¡ãã¡ã€ã«%sãèŠã€ãããŸãã  
+
+common.cannot_open:ãšã©ãŒïŒ%sãéããŸããã  
+
+common.cannot_open_fail_log:ãšã©ãŒïŒ fail log%sãéããŸãã  
+
+common.cannot_open_output_file:ãšã©ãŒïŒoutput file %sãéããŸãã  
+
+common.cannot_read:ãšã©ãŒïŒ%sãèª­ã¿èŸŒããŸããã  
+
+common.cannot_read_file:ãšã©ãŒïŒfile %sãèª­ã¿èŸŒããŸããã  
+
+common.general_options:äžè¬ãªãã·ã§ã³(%sã«å¯ŸããŠ)  
+
+common.must_be_implemented:æ©èœããµãã»ã¯ã©ã¹ã«çµã¿èŸŒãŸããªããã°ãªããªã  
+
+common.options:ãªãã·ã§ã³  
+
+common.processing:åŠç  
+
+common.specific_options:ç¹å®ã®ãªãã·ã§ã³  
+
+common.usage:äœ¿çšæ³  
+
+common.info:info  
+
+common.invalid_options:ç¡å¹ãªé¢æ°ïŒ %s  
+
+common.true:ç  
+
+common.false:åœ  
+
+common.deprecated:SUPERSEDED  
+#
+# Script option descriptions and output messages
+#
+
+
+
+scripts.xml:'pretty'ã³ã¡ã³ããªãã§ãå€ãã®è©³çŽ°ã®ããXMLãã©ãŒã ã®æ
+å ±ãäœæããã  
+
+scripts.listall:åšç¥ã®å
+šã¢ã€ãã ããªã¹ãã¢ããããã  
+
+scripts.describeall:æ¢ç¥ã®å
+šã¢ã€ãã ã®ãªãã·ã§ã³ãè¡šç€ºãã  
+
+scripts.both_old_options:è­ŠåïŒ-removeoldã¯ -keepold ã -incrementalã«ãã£ãŠç¹å®ãã,-removeoldã«ãããªã«ãããããçŸåšã®%s ãã€ã¬ã¯ããªãŒã®ã³ã³ãã³ãã¯åé€ãããã  
+
+scripts.no_old_options:è­ŠåïŒ-removeold, -keepold or -incremental ãç¹å®ãããŠãããããããªã«ãã¯ -removeoldã«ãªã£ãŠãããçŸåšã®%s ãã€ã¬ã¯ããªãŒã¯åé€ãããã  
+
+scripts.gli:ãã®ã¹ã¯ãªãããgai(ã°ãªãŒã³ã¹ããŒã³æäœããŒã«ïŒããç«ã¡äžãããã©ã°ã»ã»ãããã¢ãŠãããããgaiã«ç¹å®ããããšãã§ããã  
+scripts.gai:ãã®ã¹ã¯ãªãããgai(ã°ãªãŒã³ã¹ããŒã³æäœããŒã«ïŒããç«ã¡äžãããã©ã°ã»ã»ãããã¢ãŠãããããgaiã«ç¹å®ããããšãã§ããã  
+
+scripts.verbosity:ã¢ãŠããããã®éãå¶åŸ¡ããã0=none, 3=lotsã  
+scripts.out:ã¢ãŠããããã»ã¹ããŒã¿ã¹ãå°å·ãããã¡ã€ã«åãŸãã¯åŠçã  
+
+# -- buildcol.pl --
+
+buildcol.archivedir:ã¢ãŒã«ã€ããåããŠããå Žæã  
+
+buildcol.builddir:æ§ç¯ãããçŽ¢åŒãçœ®ãå Žæã  
+
+buildcol.cachedir:ã³ã¬ã¯ã·ã§ã³ã¯æ§ç¯ããããã£ã¬ã¯ããªãŒã«ã³ããŒãããåã«äžæçã«æ§ç¯ãããã  
+
+buildcol.cannot_open_cfg_file:è­ŠåïŒ%sãã¢ããããŒãããåã®èš­å®ãã¡ã€ã«ãéããªãã  
+
+buildcol.collectdir:ãæ­£ããããã€ã¬ã¯ããªãŒã®ãã¹ã  
+
+buildcol.copying_back_cached_build:ã­ã£ãã·ã¥ããããã«ããžã³ããŒãçŽã  
+
+buildcol.create_images:æ°èŠã³ã¬ã¯ã·ã§ã³ãžãããªã«ãã®ç»åãçæããããšãããããã¯ perlããã®ã¹ã¯ãªãããå¯èœãªé¢é£ããperlã¢ãžã¥ãŒã«ã«åŸã£ãŠã€ã³ã¹ããŒã«ãããGimpã«äŸå­ããã  
+
+buildcol.debug:STDOUTã«å°å·åºåããã  
+
+buildcol.desc:ã¢ãŒã«ã€ãã»ãã­ã¥ã¡ã³ãããã°ãªãŒã³ã¹ããŒã³ã®ã³ã¬ã¯ã·ã§ã³ãæ§ç¯ããã®ã«äœ¿çšãããPERL scriptã  
+
+buildcol.faillog:å€±æããã­ã°ã®ãã¡ã€ã«åããã®ã­ã°ã¯åŠçã«å€±æãããã¡ã€ã«ã®ãã¡ã€ã«åãåãåãã  
+
+buildcol.incremental_default_builddir:è­ŠåïŒæ§ç¯äž­ã®ãã€ã¬ã¯ããªãŒã¯ ãããªã«ãã§ã¯'building'ã«ãªããããçŽ¢åŒã®ãã€ã¬ã¯ããªãŒã«é ã«è¿œå ããããªãã buildcol.plãžã® "-builddir index" ãªãã·ã§ã³ãäœ¿çšããŠäžããã  
+
+buildcol.index:æ§ç¯ããçŽ¢åŒïŒããèš­å®ãããªããã°å¶åŸ¡ãã¡ã€ã«ã®å
+šãŠãæ§ç¯ããïŒã  
+
+buildcol.incremental:ä»¥åã«æ§ç¯ããããã®ã®ãªãç®æ¬¡ã®ãã­ã¥ã¡ã³ãã®ã¿ãã -keepoldãå«ããLuceneã®ã€ã³ãã¯ãµâã«äŸå­ããã  
+
+buildcol.keepold:æ§ç¯äž­ã®ãã€ã¬ã¯ããªãŒã®çŸåšã®ã³ã³ãã³ããç Žå£ããªãã  
+
+buildcol.maxdocs:æ§ç¯ãããã­ã¥ã¡ã³ãã®æå€§æ°ã  
+buildcol.maxnumeric:åèªãçŽ¢åŒã®èŸæžå
+ã«æã¡ãããã€ãžããã®æå€§æ°ãå€§éšåã¯çŽ¢åŒã®ããã®æ°èªã«åå²ããããããšãã°ãããæå€§æ°ã4ã§ããã°ã"1342663"ã¯ "1342" ãš "663"ã«åå²ãããã  
+buildcol.mode:å®è¡ããæ§ç¯ä»®å®ã®ããŒãã  
+buildcol.mode.all:ãã¹ãŠãå®è¡ããã  
+buildcol.mode.build_index:ãã­ã¹ããã€ã³ããã¯ã¹ããã ãã  
+buildcol.mode.compress_text:ãã­ã¹ããå§çž®ããã ãã  
+buildcol.mode.infodb:ã¡ã¿ããŒã¿ã»ããŒã¿ããŒã¹ãæ§ç¯ããã ãã  
+
+buildcol.no_default_images:ãããªã«ãç»åã¯çæãããªãã  
+
+buildcol.no_image_script:è­ŠåïŒç»åäœæã¹ã¯ãªãããèŠã€ãããªãïŒ %s  
+
+buildcol.no_strip_html:ã€ã³ããã¯ã¹ããããã­ã¹ãïŒ mgppã³ã¬ã¯ã·ã§ã³ã«ã®ã¿äœ¿çšãããïŒãã htmlã¿ã°ãåé¢ããªãã§äžããã  
+
+buildcol.no_text:å§çž®ããããã­ã¹ããä¿å­ããªãã§äžããããã€ã§ããªãªãžãã«ã®ãã­ã¥ã¡ã³ããã©ã³ã¿ã€ã ã§è¡šç€ºãããæïŒå§çž®ããããã­ã¹ãã®ããŒãžã§ã³ãæ€çŽ¢ã§ããªãæïŒãã®ãªãã·ã§ã³ã¯æ§ç¯ãããçŽ¢åŒã®ãµã€ãºãæå°åããã®ã«æå¹ã§ããã  
+
+buildcol.sections_index_document_metadata:ã»ã¯ã·ã§ã³ã¬ãã«ã®ãã­ã¥ã¡ã³ãã»ã¬ãã«ã»ã¡ã¿ããŒã¿ãã€ã³ããã¯ã¹ããã  
+buildcol.sections_index_document_metadata.never:ã»ã¯ã·ã§ã³ã»ã¬ãã«ã®ãã­ã¥ã¡ã³ããã»ã¡ã¿ããŒã¿ãã€ã³ããã¯ã¹ããªãã§äžããã  
+buildcol.sections_index_document_metadata.always:ã»ã¯ã·ã§ã³ã»ã¬ãã«ã»ã¡ã¿ããŒã¿ã®ååãå­åšããªããã°å
+šãŠã®ç¹å®ã®ãã­ã¥ã¡ã³ãã»ã¬ãã«ã»ã¡ã¿ããŒã¿ãè¿œå ããã  
+buildcol.sections_index_document_metadata.unless_section_metadata_exists:åœè©²åã®ã»ã¯ã·ã§ã³ã»ã¬ãã«ã»ã¡ã¿ããŒã¿ãå­åšããªãæã«ãã­ã¥ã¡ã³ãã»ã¬ãã«ã»ã¡ã¿ããŒã¿ãè¿œå ããã ãã  
+
+buildcol.out:ãã¡ã€ã«åãŸãã¯å°å·åºåã®ã¹ããŒã¿ã¹ãåŠçããã  
+
+buildcol.params:[ãªãã·ã§ã³]ã³ã¬ã¯ã·ã§ã³-å  
+
+buildcol.remove_empty_classifications:ç©ºã®åé¡å­ãšåé¡ããŒãïŒãã­ã¥ã¡ã³ããå«ãŸãªãïŒãé ãã  
+
+buildcol.removeold:æ§ç¯äž­ã®ãã€ã¬ã¯ããªãŒã®å€ãã³ã³ãã³ããåé€ããã  
+
+buildcol.unlinked_col_images:ã³ã¬ã¯ã·ã§ã³ç»åãæ­£ãããªã³ã¯ãããŠããªãã  
+
+buildcol.unknown_mode:æªç¥ã®ã¢ãŒãïŒ %s  
+
+buildcol.updating_archive_cache:ã¢ãŒã«ã€ãã»ã­ã£ãã·ã¥ãã¢ããããŒããã  
+
+buildcol.verbosity:ã¢ãŠããããã®éãå¶åŸ¡ããã0=none, 3=lotsã  
+
+
+# -- classinfo.pl --
+
+classinfo.collection:ã³ã¬ã¯ã·ã§ã³åãäžãããšcollect/collection-name/perllib/classifyå
+ã®classinfo.pl lookãæåã«äœæããã  
+
+classinfo.desc:åé¡å­ã«é¢ããå°å·æ
+å ±ã  
+
+classinfo.general_options:äžè¬çãªãã·ã§ã³ãåé¡å­ã®ãã¢ã¬ã³ãã»ã¯ã©ã¹ããåãç¶ãããã  
+
+classinfo.info:info  
+
+classinfo.no_classifier_name:ãšã©ãŒïŒåé¡å­ã®ååãäžããªããã°ãªããŸããã  
+
+classinfo.option_types:åé¡å­ã¯2çš®é¡ã®ãªãã·ã§ã³ããããŸã  
+
+classinfo.params:[ãªãã·ã§ã³]åé¡å­ïœ°å  
+
+classinfo.passing_options:ãªãã·ã§ã³ã¯collect.cfgå¶åŸ¡ãã¡ã€ã«ã«å«ããããšã«ãã£ãŠããã¹ãŠã®åé¡å­ã«æž¡ãããŸãã  
+
+classinfo.specific_options:ç¹å®ã®ãªãã·ã§ã³ã¯åé¡å­èªäœã®å
+éšã«å®çŸ©ãããç¹å®ã®åé¡å­ã«å¯ŸããŠã®ã¿æå¹ã§ãã  
+
+# -- downloadfrom.pl --
+downloadfrom.cache_dir:ã­ã£ãã·ã¥ãã€ã¬ã¯ããªãŒã®äœçœ®  
+downloadfrom.desc:å€éšãµãŒããŒããã®ãã¡ã€ã«ãããŠã³ã­ãŒããã  
+downloadfrom.download_mode:ããŠã³ã­ãŒããããµãŒããŒã®çš®é¡  
+downloadfrom.download_mode.Web:HTTP  
+downloadfrom.download_mode.MediaWiki:MediaWikiãŠãšããµã€ã  
+downloadfrom.download_mode.OAI:Open Archives Initiative  
+downloadfrom.download_mode.z3950:z3950 server  
+downloadfrom.download_mode.SRW:SearchRetrieve Webservice  
+downloadfrom.incorrect_mode:download_mode parameterãæ­£ãããããŸããã  
+downloadfrom.info:ããŠã³ã­ãŒãããã¯ããããµãŒããŒã«ã€ããŠã®æ
+å ±ãå°å·ãã  
+downloadfrom.params:[general options] [specific download options]  
+
+# -- downloadinfo.pl --
+
+downloadinfo.desc:ããŠã³ã­ãŒãã»ã¢ãžã¥ãŒã«ã«é¢ããæ
+å ±ãå°å·ãã  
+downloadinfo.collection:ã³ã¬ã¯ã·ã§ã³åãäžããããšã§collect/collection-name/perllib/downloaders å
+ã®downloadinfo.pl lookãæ§æãããã¢ãžã¥ãŒã«ãèŠã€ãããªããã° general perllib/downloadersãã€ã¬ã¯ããªãŒãåç
+§ããã  
+downloadinfo.params:[options] [download-module]  
+downloadinfo.general_options:äžè¬çãªãã·ã§ã³ã¯ããŠã³ã­ãŒãã»ãã¡ã€ã«ã®èŠªã¯ã©ã¹ããåãç¶ãããŠããã  
+downloadinfo.specific_options:ç¹å®ã®ãªãã·ã§ã³ãããŠã³ã­ãŒãã¢ãžã¥ãŒã«èªäœã®å
+éšã«å®çŸ©ãããŠããããã®ç¹å®ã®ããŠã³ã­ãŒããŒã«å¯ŸããŠã®ã¿æå¹ã§ããã  
+downloadinfo.option_types:ããŠã³ã­ãŒãã»ã¢ãžã¥ãŒã«ã«ã¯çš®é¡ã®ãªãã·ã§ã³ããã  
+
+# -- explode_metadata_database.pl --
+explode.desc:ã¡ã¿ããŒã¿ã»ããŒã¿ããŒã¹ãå±éãã  
+
+explode.collection:ã³ã¬ã¯ã·ã§ã³åãããã€ãã®ãã©ã°ã€ã³ã¯ã³ã¬ã¯ã·ã§ã³ã»ãã©ã«ããŒå
+ã®è£å©ãã¡ã€ã«ãæ¢ãã  
+ 
+explode.document_field:ã³ã¬ã¯ã·ã§ã³å
+ã§ç²åŸãå«ãŸãããã­ã¥ã¡ã³ãã®ãã¡ã€ã«åãç¹å®ããã¡ã¿ããŒã¿ã»ãšã¬ã¡ã³ãã  
+
+explode.document_prefix:ãã­ã¥ã¡ã³ãã®äœçœ®ã«ã€ããŠã®ãã¬ãã£ãã¯ã¹ïŒdocument_fieldãªãã·ã§ã³ã«äœ¿çšããïŒã  
+
+explode.document_suffix:ãã­ã¥ãŠã¡ã³ãã®äœçœ®ã«ã€ããŠã®ãµãã£ãã¯ã¹ïŒdocument_fieldãªãã·ã§ã³ã«äœ¿çšããïŒã  
+
+explode.encoding:ããŒã¿ããŒã¹ã»ãã¡ã€ã«å
+ã®èª­ã¿èŸŒã¿ã«äœ¿çšãããšã³ã³ãŒãã€ã³ã°  
+explode.metadata_set:å
+šã¡ã¿ããŒã¿ããšã¯ã¹ããŒãããã¡ã¿ããŒã¿ã»ããïŒããŒã ã¹ããŒã¹ïŒ  
+explode.plugin:å±éã«äœ¿çšãããã©ã°ã€ã³  
+explode.plugin_options:å±éã®åã«ãã©ã°ã€ã³ãæž¡ããªãã·ã§ã³ãOptionåã¯-.ã§å§ãŸããªããã°ãªããªãããªãã·ã§ã³åãšå€ãã¹ããŒã¹ã§åé¢ããã-use_collection_plugin_ãªãã·ã§ã³ã§ã¯äœ¿çšã§ããªãã  
+explode.use_collection_plugin_options:ã³ã¬ã¯ã·ã§ã³å¶åŸ¡ãã¡ã€ã«ãèª­ã¿èŸŒãã§ç¹å®ã®ãã©ã°ã€ã³ã®ããã®ãªãã·ã§ã³ãä»çšããã-collectionãªãã·ã§ã³ãå¿
+èŠã§ããã-plugin_ãªãã·ã§ã³ã§ã¯äœ¿çšã§ããªãã  
+explode.params:[ãªãã·ã§ã³]ãã¡ã€ã«å   
+explode.records_per_folder:åãµããã©ã«ããŒã«çœ®ãããã¬ã³ãŒãæ°ã  
+
+# -- replace_srcdoc_with_html.pl --
+srcreplace.desc:åæ§ç¯ã®éãœãŒã¹ã»ãã­ã¥ã¡ã³ããçæããã HTMLã«çœ®ãæãã   
+srcreplace.params:[ãªãã·ã§ã³]ãã¡ã€ã«å   
+srcreplace.plugin:ãœãŒã¹ã»ãã­ã¥ã¡ã³ããå€æããã®ã«äœ¿çšãããã©ã°ã€ã³  
+
+# -- exportcol.pl --
+
+exportcol.out:ãã¡ã€ã«åãããã¯ã¢ãŠããããã»ã¹ããŒã¿ã¹ã®å°å·ãåŠçããã  
+exportcol.cddir:CDã³ã³ãã³ãããšã¯ã¹ããŒãããããã€ã¬ã¯ããªãŒåã   
+exportcol.cdname:CD-ROMå-- ããã¯CD-ROMãã€ã³ã¹ããŒã«ããããšã¹ã¿ãŒãã¡ãã¥ãŒã«è¡šç€ºãããã  
+exportcol.collectdir:ãæ­£ããããã€ã¬ã¯ããªãŒã®ãã¹ã  
+exportcol.desc:Windows CD-ROMã«ïŒã€ä»¥äžã®ã³ã¬ã¯ã·ã§ã³ããšã¯ã¹ããŒãããã®ã«äœ¿çšãããPERLã¹ã¯ãªããã  
+exportcol.noinstall:ã©ã€ãã©ãªãŒãCD-ROMããçŽæ¥èµ·åããCD-ROMãäœæãããã¹ãã»ã³ã³ãã¥ãŒã¿ãŒã«ã¯äœãã€ã³ã¹ããŒã«ãããªãã  
+exportcol.params:[ãªãã·ã§ã³]ã³ã¬ã¯ã·ã§ã³å1ãã³ã¬ã¯ã·ã§ã³å2 âŠ  
+exportcol.coll_not_found:ç¡å¹ãªã³ã¬ã¯ã·ã§ã³%sãç¡èŠããïŒã³ã¬ã¯ã·ã§ã³ã%sã«èŠã€ãããªãã  
+exportcol.coll_dirs_not_found:ç¡å¹ãªã³ã¬ã¯ã·ã§ã³%sãç¡èŠããïŒä»¥äžã®ãã€ã¬ã¯ããªãŒã®äžã€ãèŠã€ãããªãã  
+exportcol.fail:exportcol.plãå€±æãã:  
+exportcol.no_valid_colls:ãšã¯ã¹ããŒãã®ããã«ç¹å®ãããç¡å¹ãªã³ã¬ã¯ã·ã§ã³ã  
+exportcol.couldnt_create_dir:ãã€ã¬ã¯ããªãŒ%sãäœæã§ããªãã  
+exportcol.couldnt_create_file:%sãäœæã§ããªãã  
+exportcol.instructions:ã»ã«ãã€ã³ã¹ããŒã«Windows CD-ROMãäœæããã®ã«ããã®ãã©ã«ããŒã®ã³ã³ãã³ããCD-ROMã«æžãèŸŒãã  
+exportcol.non_exist_files:ïŒã€ä»¥äžã®å¿
+èŠãªãã¡ã€ã«ãšãã£ã¬ã¯ããªãŒãå­åšããªãã  
+exportcol.success:exportcol.plãæåããŸãã:  
+exportcol.output_dir:ãšã¯ã¹ããŒããããã³ã¬ã¯ã·ã§ã³ã%sã«ããã  
+exportcol.export_coll_not_installed:CD-ROMã®æ©èœæ§ãžã®ãšã¯ã¹ããŒããã€ã³ã¹ããŒã«ãããªãã  
+
+# -- import.pl --
+
+import.archivedir:å€æãããè³æãçµäºããå Žæã  
+
+import.manifest:ã©ã®ãã¡ã€ã«ãã€ã³ããŒããããããèŠå®ããXMLãã¡ã€ã«ãç¹°ãè¿ãã€ã³ããŒãã»ãã©ã«ããŒã«éãããä»£ããã«äœ¿çšãããç¹ã«ã€ã³ã¯ãªã¡ã³ã¿ã«ãªæ§ç¯ã«äœ¿çšãããã  
+
+import.cannot_open_stats_file:è­ŠåïŒstats file %sãéããªãã  
+
+import.cannot_open_fail_log:è­ŠåïŒfail log %sãéããªã  
+
+import.cannot_sort:è­ŠåïŒgroupsize > 1. sortmeta ãªãã·ã§ã³ãç¡èŠããããšimport.plããã­ã¥ã¡ã³ãããœãŒãã§ããªãã  
+
+import.collectdir:ãæ­£ããããã€ã¬ã¯ããªãŒã®ãã¹ã  
+
+import.complete:ã€ã³ããŒããå®æãã  
+
+import.debug:STDOUTïŒã°ãªãŒã³ã¹ããŒã³ã®XMLã€ã³ããŒãçšïŒãžã®ã€ã³ããŒãããããã­ã¹ããèšºå¯ãã  
+
+import.desc:ãã¡ã€ã«ãæ§ç¯ã®ããã«æºåããããã©ãŒããã (GreenstoneXML or GreenstoneMETS)ã«ã€ã³ããŒãããããã«äœ¿çšãããPERL scriptã  
+
+import.faillog:Fail logãã¡ã€ã«åããã®ã­ã°ã¯åŠçã«å€±æããå
+šãã¡ã€ã«ã®ãã¡ã€ã«åãåãåãã  
+
+import.groupsize:XMLãã¡ã€ã«ã«çµ±äžãããã€ã³ããŒãã»ãã­ã¥ã¡ã³ãæ°ã  
+
+import.gzip:gzipãæŽŸçããxml ãã­ã¥ã¡ã³ããå§çž®ããã®ã«äœ¿çšãã ïŒå§çž®ããããã­ã¥ã¡ã³ãããæ§ç¯ãããã©ã°ã€ã³ãªã¹ãã« ZIPPluginãå«ããã®ãå¿ããªãã§ãã ããïŒã  
+
+import.importdir:ãªãªãžãã«ã®è³æãçããŠããå Žæã  
+
+import.incremental:çŸåšã®ã¢ãŒã«ã€ãã»ãã¡ã€ã«Implies -keepold.ããæ°èŠïŒã¿ã€ã ã¹ã¿ã³ãã«ããïŒã®ãã­ã¥ã¡ã³ãã ããã€ã³ããŒãããã  
+
+import.keepold:ã¢ãŒã«ã€ãã®ãã€ã¬ã¯ããªãŒã®çŸåšã®ã³ã³ãã³ããç Žå£ããªãã§äžããã  
+
+import.maxdocs:ã€ã³ããŒããããã­ã¥ã¡ã³ãã®æå€§æ°ã  
+
+import.no_import_dir:ãšã©ãŒïŒ Import dir (%s) ãèŠã€ãããªãã  
+
+import.no_plugins_loaded:ãšã©ãŒïŒ ãã©ã°ã€ã³ãç«ã¡ãããããŠããªãã  
+
+import.OIDtype:åãã­ã¥ã¡ã³ãã®ç¹å®ã®è­å¥å­ãçæããã®ã«äœ¿çšããæ¹æ³ã  
+import.OIDtype.hash:ãã¡ã€ã«ã®ã³ã³ãã³ããããã·ã¥ããã  
+
+import.OIDtype.incremental:ã·ã³ãã«ãªãã­ã¥ã¡ã³ãã»ã«ãŠã³ããäœ¿çšããã "hash"ããããªãæ©ãããã³ã¬ã¯ã·ã§ã³ãåã€ã³ããŒãããããªãã°ããªããããåäžã®è­å¥å­ãåäžã®ãã­ã¥ã¡ã³ãã«å²ãåœãŠãªãã  
+
+import.OIDtype.assigned:OIDmetadataãªãã·ã§ã³ïŒ 'D'ã«ãã£ãŠå
+è¡ãããïŒã«äžããããã¡ã¿ããŒã¿å€ãäœ¿çšããïŒããç¹å®ãããŠããªããã°ãç¹å®ã®ãã­ã¥ã¡ã³ãã®ããã«ä»£ããã«ããã·ã¥ãäœ¿çšãããããããã®è­å¥å­ã¯ç¹å®ãããªããã°ãªããªãã  
+
+import.OIDtype.dirname:èŠªãã€ã¬ã¯ããªãŒåïŒ'J'ã«ãã£ãŠå
+è¡ãããïŒãäœ¿çšããããã€ã¬ã¯ããªãŒããšã«ãã­ã¥ã¡ã³ãã¯åäžã§ãªããã°ãªããããã€ã¬ã¯ããªãŒåã¯ç¹å®ã§ãªããã°ãªããªãã  
+
+import.OIDmetadata:-OIDtype=assignedã§äœ¿çšããããã«ãã­ã¥ã¡ã³ãã®ç¹å®ã®è­å¥å­ãä¿æããã¡ã¿ããŒã¿ã»ãšã¬ã¡ã³ããç¹å®ããã  
+
+import.saveas:ã¢ãŒã«ã€ãã»ãã¡ã€ã«ãä¿å­ãããªããã°ãªããªããã©ãŒãããã  
+
+import.out:ã¢ãŠããããã»ã¹ããŒã¿ã¹ãå°å·ãããã¡ã€ã«ããŒã ãããã¯åŠçã  
+
+import.params:[ãªãã·ã§ã³] ã³ã¬ã¯ã·ã§ã³-å  
+
+import.removeold:ã¢ãŒã«ã€ãã»ãã£ã¬ã¯ããªãŒã®å€ãã³ã³ãã³ããåé€ããã  
+
+import.removing_archives:ã¢ãŒã«ã€ãã»ãã€ã¬ã¯ããªãŒã®çŸåšã®ã³ã³ãã³ããåé€ããâŠ  
+
+import.removing_tmpdir: "tmp"ãã£ã¬ã¯ããªãŒã®ã³ã³ãã³ããåé€ããâŠ  
+
+import.site:æ­£ãããã£ã¬ã¯ããªãŒãèŠã€ãããµã€ãïŒã°ãªãŒã³ã¹ããŒã³ïŒã€ã³ã¹ããŒã«çšæïŒã  
+
+import.sortmeta:æ§ç¯ã®ããã«ã¡ã¿ããŒã¿ãã¢ã«ãã¡ãããé ã«ãœãŒããããããŒã«ä»£æ°ã¯ãšãªãŒã®æ€çŽ¢çµæããã®é åºã§è¡šç€ºããããããã¯ if groupsize > 1ã®å Žåå©çšã§ããªãã  
+
+import.statsfile:ã€ã³ããŒãã®çµ±èšãå°å·ãããã¡ã€ã«åãããã¯åŠçã  
+
+import.stats_backup:STDERRã®ä»£ããã«statsãå°å·ããã  
+
+import.verbosity:ã¢ãŠããããã®éãå¶åŸ¡ããã0=none, 3=lotsã  
+
+# -- csv-usernames-to-db.pl
+cu2db.desc:ãŠãŒã¶ãŒãã°ãªãŒã³ã¹ããŒã³ã»ãŠãŒã¶ãŒã»ããŒã¿ããŒã¹ã«è¿œå ãããããåŠçãããåäžã®ã¹ã¯ãªãããã«ã³ãã§åºåãããå€ïŒcsvïŒ  
+ 
+cu2db.params:[ãªãã·ã§ã³]csv-ãã¡ã€ã«å  
+
+cu2db.field-separator:æå­ãCSV ãã¡ã€ã«å
+ã®ãã£ãŒã«ããåé¢ããã®ã«çšããããå¶åŸ¡  
+
+cu2db.already-encrypted:CSV ãã¡ã€ã«ã®ãã¹ã¯ãŒãããã§ã«æå·åãããŠãããªããããäœ¿çšããŠäžãã  
+
+
+
+# -- schedule.pl --
+schedule.deleted:ã¹ã±ãžã¥ãŒã«åãããå®è¡ãã³ã¬ã¯ã·ã§ã³ã®ããã«åé€ããã  
+schedule.scheduled:ã³ã¬ã¯ã·ã§ã³çšã«äœæãããå®è¡ã¹ã¯ãªãã  
+schedule.cron:ã³ã¬ã¯ã·ã§ã³ã«ã»ããã¢ãããããã¹ã±ãžã¥ãŒã«åãããå®è¡  
+schedule.params:[ãªãã·ã§ã³]  
+schedule.error.email:ã¡ãŒã«ã¯ ç¹å®ã®-smtp -toaddr and -fromaddrãå¿
+èŠã§ããã  
+schedule.error.importbuild:ãš-buildãç¹å®ãããªããã°ãªããªãã  
+schedule.error.colname:colnameãäœ¿çšããã³ã¬ã¯ã·ã§ã³ãç¹å®ãããªããã°ãªããªãã  
+schedule.gli:GLIã®ç«ã¡äžã  
+schedule.frequency:ãã°ãã°èªåçã«ã³ã¬ã¯ã·ã§ã³ãåæ§ç¯ããæ¹æ³  
+schedule.frequency.hourly:æ¯æåæ§ç¯ãã  
+schedule.frequency.daily:æ¯æ¥åæ§ç¯ãã  
+schedule.frequency.weekly:æ¯é±åæ§ç¯ãã  
+schedule.action:èªåçåæ§ç¯ã®ç«ã¡äžãæ¹  
+schedule.action.add:èªååæ§ç¯ã®ã¹ã±ãžã¥ãŒã«  
+schedule.action.update:æ¢å­ã®ã¹ã±ãžã¥ãŒã«ãã¢ããããŒããã  
+schedule.action.delete:æ¢å­ã®ã¹ã±ãžã¥ãŒã«ãå²ãè«žãã  
+schedule.email:ã¡ãŒã«éç¥ãéã  
+schedule.schedule:ã¹ã±ãžã¥ãŒã«åãããèªåçã³ã¬ã¯ã·ã§ã³åæ§ç¯ãéžæãã  
+schedule.colname:ã¹ã±ãžã¥ãŒã«ãã»ããã¢ãããããã³ã¬ã¯ã·ã§ã³å  
+schedule.import:ã¹ã±ãžã¥ãŒã«åãããã€ã³ããŒãã»ã³ãã³ã  
+schedule.build:ã¹ã±ãžã¥ãŒã«ãäœãããbuildcolã³ãã³ã  
+schedule.toaddr:ã¹ã±ãžã¥ãŒã«åãããæ§ç¯éç¥ãéä»ããã¡ãŒã«ã¢ãã¬ã¹  
+schedule.toaddr.default:File->Preferenceså
+ã®ãŠãŒã¶ãŒã®ã¡ãŒã«ãç¹å®ãã  
+schedule.fromaddr:éä»è
+ã®ã¡ãŒã«ã¢ãã¬ã¹  
+schedule.fromaddr.default:main.cfgå
+ã®ã¡ã€ã³ãããŒãç¹å®ãã  
+schedule.smtp:ã¡ãŒã«éä¿¡ãã¡ãŒã«ã®éä¿¡ã®ããæ¥ç¶ããªããã°ãªããªãã¡ãŒã«ã»ãµãŒããŒ  
+schedule.smtp.default:main.cfgå
+ã®MailServerãç¹å®ãã  
+schedule.out:ã¢ãŠããããã»ã¹ããŒã¿ã¹ãå°å·ãããã¡ã€ã«åãããã¯åŠç  
+# -- export.pl --
+
+export.exportdir:ãšã¯ã¹ããŒãè³æãçµäºããå Žæã  
+
+export.cannot_open_stats_file:è­ŠåïŒstats file %sãéããŸãã  
+
+export.cannot_open_fail_log:ãšã©ãŒïŒ fail log %sãéããŸãã  
+
+export.cannot_sort:è­ŠåïŒexport.plã¯ groupsize > 1. sortmetaãªãã·ã§ã³ãç¡èŠãããå Žåã¯ãã­ã¥ã¡ã³ãããœãŒãã§ããŸããã  
+
+export.collectdir: "collect"ãã€ã¬ã¯ããªãŒã®ãã¹ã  
+
+export.complete:ãšã¯ã¹ããŒããå®æããŸãã  
+
+export.debug:STDOUT (GreenstoneXMLã®ãšã¯ã¹ããŒãçš)ãžã®ãšã¯ã¹ããŒãããããã­ã¹ããå°å·ãã  
+
+export.desc:ã°ãªãŒã³ã¹ããŒã³ã®ã³ã¬ã¯ã·ã§ã³ãä»ã®ãã©ãŒãããã«ãšã¯ã¹ããŒãããã®ã«äœ¿çšãããPERL scriptã  
+
+export.faillog:Fail logã®ãã¡ã€ã«åããã®ã­ã°ã¯åŠçã«å€±æãããã¹ãŠã®ãã¡ã€ã«ã®ãã¡ã€ã«åãåãåããŸã(Default: collectdir/collname/etc/fail.log)  
+
+export.groupsize:åäžã®XMLãã¡ã€ã«ã«çµ±äžããããã­ã¥ã¡ã³ãæ°ã  
+
+export.gzip:gzipãæŽŸçããxmlãã­ã¥ã¡ã³ããå§çž®ããã®ã«äœ¿çšããïŒå§çž®ãããã­ã¥ã¡ã³ãããæ§ç¯ããéãã©ã°ã€ã³ã®ãªã¹ãã«ZIPPluginãå«ããã®ãå¿ããªãã§äžããïŒã  
+
+export.importdir:ãªãªãžãã«ã®è³æãããå Žæã  
+
+export.keepold:ãšã¯ã¹ããŒãã»ãã£ã¬ã¯ããªãŒã®çŸåšã®ã³ã³ãã³ããç Žå£ããªãã§ãã ããã  
+
+export.maxdocs:ãšã¯ã¹ããŒããããã­ã¥ã¡ã³ãã®æå€§æ°ã  
+
+export.listall:å
+šãŠã®saveas formatsããªã¹ãã¢ãããã  
+
+export.saveas:ãã­ã¥ã¡ã³ãããšã¯ã¹ããŒããããã©ãŒãããã  
+
+export.saveas.DSpace:Dspaceã¢ãŒã«ã€ãã»ãã©ãŒãããã  
+
+export.saveas.GreenstoneMETS:ã°ãªãŒã³ã¹ããŒã³ã®ãã­ãã¡ã€ã«ãäœ¿çšããMETSãã©ãŒãããã  
+export.saveas.FedoraMETS:Fedoraã®ãã­ãã¡ã€ã«ãäœ¿çšããMETSãã©ãŒãããã  
+
+export.saveas.GreenstoneXML:ã°ãªãŒã³ã¹ããŒã³ã»XMLã¢ãŒã«ã€ãã»ãã©ãŒãããã  
+
+export.saveas.MARCXML:MARC XML format (an XML version of MARC 21)  
+
+export.out:ãã¡ã€ã«åãããã¯ã¢ãŠããããã»ã¹ããŒã¿ã¹ã®å°å·ãåŠçããã  
+
+export.params:[ãªãã·ã§ã³] ã³ã¬ã¯ã·ã§ã³-å  
+
+export.removeold:ãšã¯ã¹ããŒãã»ãã£ã¬ã¯ããªãŒã®å€ãã³ã³ãã³ããåé€ããã  
+
+export.removing_export:ãšã¯ã¹ããŒããã€ã¬ã¯ããªãŒã®çŸåšã®ã³ã³ãã³ããåé€ããâŠ  
+
+export.sortmeta:æ§ç¯ã®ããã«ã¡ã¿ããŒã¿ã§ãã­ã¥ã¡ã³ããã¢ã«ãã¡ãããé ã«ãœãŒããããããã¯groupsize > 1ãªãäœ¿çšã§ããªãã  
+
+export.statsfile:ãã¡ã€ã«åãããã¯ãšã¯ã¹ããŒãããçµ±èšã®å°å·ãåŠçããã  
+
+export.stats_backup:ä»£ããã«å°å·ã¹ããŒã¿ã¹ãSTDERRã«ããã   
+
+export.verbosity:ã¢ãŠããããã®éãå¶åŸ¡ããã 0=none, 3=lotsã  
+
+
+# -- mkcol.pl --
+
+mkcol.about:ã³ã¬ã¯ã·ã§ã³ã«ã€ããŠã®ã¢ããŠãã»ãã­ã¹ãã  
+
+mkcol.buildtype:ã³ã¬ã¯ã·ã§ã³ã® (mg, mgpp, luceneãªã©)  
+
+mkcol.infodbtype:ã³ã¬ã¯ã·ã§ã³ã® 'infodbtype'ïŒgdbm, jdbm, sqliteãªã©)  
+
+mkcol.bad_name_cvs:ãšã©ãŒ: CVSããŒãžã§ãã³ã°ã»ã·ã¹ãã ã§äœæããããã£ã¬ã¯ããªãŒã®å¹²æžã®ããã³ã¬ã¯ã·ã§ã³åãCVSã§ååãä»ããããªãã  
+
+mkcol.bad_name_svn:ãšã©ãŒïŒSVNããŒãžã§ãã³ã°ã»ã·ã¹ãã ã§äœæããããã£ã¬ã¯ããªãŒã®å¹²æžã®ããã³ã¬ã¯ã·ã§ã³åã .svnã§ååãä»ããããªãã  
+
+mkcol.bad_name_modelcol:ãšã©ãŒ: ã¢ãã«ã»ã³ã¬ã¯ã·ã§ã³åã§ããmodelcol ã§ååãä»ããããªãã  
+
+mkcol.cannot_find_modelcol:ãšã©ãŒïŒã¢ãã«ã»ã³ã¬ã¯ã·ã§ã³%sãèŠã€ãããªã  
+
+mkcol.col_already_exists:ãšã©ãŒïŒãã®ã³ã¬ã¯ã·ã§ã³ã¯ãã§ã«å­åšããã  
+
+mkcol.collectdir:æ°èŠã³ã¬ã¯ã·ã§ã³ãäœæããããã£ã¬ã¯ããªãŒã  
+
+mkcol.group_not_valid_in_gs3:ã°ã«ãŒããªãã·ã§ã³ã¯ã°ãªãŒã³ã¹ããŒã³3ã¢ãŒã (-gs3mode)ã§ã¯æå¹ã§ãªãã  
+mkcol.creating_col:ã³ã¬ã¯ã·ã§ã³%sãäœæãã  
+
+mkcol.creator:ã³ã¬ã¯ã·ã§ã³ã»ã³ã¬ã¯ã¿ãŒã®ã¡ãŒã«ã¢ãã¬ã¹ã  
+
+mkcol.creator_undefined:ãšã©ãŒïŒã¯ãªãšãŒã¿ãŒã¯å®çŸ©ãããŠããªãããã®å€ã¯è€æ°ã®ã³ã¬ã¯ã·ã§ã³åãèªè­ããããšãå¿
+èŠã«ãªãã  
+
+mkcol.desc:æ°èŠã®ã°ãªãŒã³ã¹ããŒã³ã³ã¬ã¯ã·ã§ã³ã®ãã€ã¬ã¯ããªãŒæ§é ãäœæããã®ã«äœ¿çšãããPERLã¹ã¯ãªããã  
+
+mkcol.doing_replacements:%sã®ã¬ãã¬ãŒã¹ã¡ã³ããè¡ã  
+
+mkcol.group:æšæºã®ã³ã¬ã¯ã·ã§ã³ã®ä»£ããã«æ°èŠã®ã³ã¬ã¯ã·ã§ã³ã°ã«ãŒããäœæããã  
+
+mkcol.gs3mode:ã°ãªãŒã³ã¹ããŒã³3ã³ã¬ã¯ã·ã§ã³ã®ã¢ãŒãã  
+
+mkcol.long_colname:ãšã©ãŒïŒã³ã¬ã¯ã·ã§ã³åã¯ä»¥åã®ãã¡ã€ã«ã·ã¹ãã ãšã®äºææ§ãä¿ãããããã«8æå­ä»¥äžã§ãªããã°ãªããªãã  
+
+mkcol.maintainer:ã³ã¬ã¯ã·ã§ã³ã»ã¡ã€ã³ãããŒã®ã¡ãŒã«ã¢ãã¬ã¹ïŒã¯ãªãšãŒã¿ãŒãšç°ãªã£ãŠããå ŽåïŒã  
+
+mkcol.no_collectdir:ãšã©ãŒïŒ collect dir ãå­åšããªã: %s  
+
+mkcol.no_collectdir_specified:ãšã©ãŒïŒcollect dirãç¹å®ããããgs3modeã§ã¯ã -site or -collectdirãªãã·ã§ã³ãç¹å®ãããªããã°ãªããªãã  
+
+mkcol.no_colname:ãšã©ãŒïŒã³ã¬ã¯ã·ã§ã³åã¯ç¹å®ãããŠããªãã  
+
+mkcol.optionfile:ãã¡ã€ã«ãããªãã·ã§ã³ãåŸããé·ãã³ãã³ãåãåé¡ãçããã·ã¹ãã ã«æå¹ã§ããã  
+
+mkcol.params:[options] ã³ã¬ã¯ã·ã§ã³-å  
+
+mkcol.plugin:äœ¿çšããPerlãã©ã°ã€ã³ã¢ãžã¥ãŒã«ïŒè€æ°ã®ãã©ã°ã€ã³ã»ãšã³ããªãŒãšãªããããããªãïŒã  
+
+mkcol.public:ãããã®ã³ã¬ã¯ã·ã§ã³ã«ç¡èšåã®ã¢ã¯ã»ã¹ãããã°ã  
+mkcol.public.true:ã³ã¬ã¯ã·ã§ã³ã¯å
+¬çã§ãã  
+mkcol.public.false:ã³ã¬ã¯ã·ã§ã³ã¯ãã©ã€ããŒãã§ãã  
+
+mkcol.quiet:éãã«äœæ¥­ããã  
+
+mkcol.site:gs3modeã§ã¯ã ãã®ãµã€ãåã-collectdirãç¹å®ãããŠããªããã°ãcollectdirãæ±ºå®ããGSDL3HOMEç°å¢å€æ° ã®ç°å¢ã§äœ¿çšããã  
+
+mkcol.success:æ°èŠã®ã³ã¬ã¯ã·ã§ã³ã¯%sã§äœæã«æåãã  
+
+mkcol.title:ã³ã¬ã¯ã·ã§ã³ã®ã¿ã€ãã«ã  
+
+mkcol.win31compat:ååãä»äžãããã³ã¬ã¯ã·ã§ã³ã®ãã€ã¬ã¯ããªãŒãWindows 3.1 ã®ãã¡ã€ã«ã®å€æã«äžèŽãããã©ããïŒããªãã¡ïŒæå­ã®é·ããã©ããïŒã  
+mkcol.win31compat.true:8æå­ä»¥äžã®ãã€ã¬ã¯ããªãŒå  
+mkcol.win31compat.false:ããããé·ãã®ãã€ã¬ã¯ããªãŒå  
+
+# -- pluginfo.pl --
+
+pluginfo.collection:ã³ã¬ã¯ã·ã§ã³åãäžããã°pluginfo.plãæåã«collect/collection-name/perllib/pluginså
+ã§èŠããããã«ãªãããããã©ã°ã€ã³ãèŠåœãããªããã°ãgeneral perllib/pluginsãã£ã¬ã¯ããªãŒã§èŠããããã«ãªãã  
+
+pluginfo.desc:ãã©ã°ã€ã³ã«é¢ããå°å·æ
+å ±ã  
+
+pluginfo.general_options:äžè¬çãªãã·ã§ã³ããã©ã°ã€ã³ã®èŠªã¯ã©ã¹ããåãç¶ãããŠããã  
+
+pluginfo.info:info  
+
+pluginfo.no_plugin_name:ãšã©ãŒ:ãã©ã°ã€ã³åãäžããªããã°ãªããªãã  
+
+pluginfo.option_types:ãã©ã°ã€ã³ã«ã¯2çš®é¡ã®ãªãã·ã§ã³ãããã  
+
+pluginfo.params:[ãªãã·ã§ã³]ãã©ã°ã€ã³-å   
+
+pluginfo.passing_options:ãªãã·ã§ã³ã¯collect.cfg configurationãã¡ã€ã«ã«å«ããããšã«ãã£ãŠãããããã©ã°ã€ã³ã«æž¡ãããã  
+
+pluginfo.specific_options:ç¹å®ã®ãªãã·ã§ã³ããã©ã°ã€ã³èªäœå
+ã«å®çŸ©ãããç¹å®ã®ãã©ã°ã€ã³ã«ã®ã¿æå¹ã§ããã  
+
+
+# -- plugoutinfo.pl --
+
+plugoutinfo.collection:ã³ã¬ã¯ã·ã§ã³åãäžããã°plugoutinfo.plãæåã«collect/collection-name/perllib/pluginså
+ã§èŠããããã«ãªãããããã©ã°ã€ã³ãèŠåœãããªããã°ãgeneral perllib/pluginsãã£ã¬ã¯ããªãŒã§èŠããããã«ãªãã  
+
+plugoutinfo.desc:ãã©ã°ã¢ãŠãã«é¢ããå°å·æ
+å ±ã  
+
+plugoutinfo.general_options:äžè¬çãªãã·ã§ã³ããã©ã°ã€ã³ã®èŠªã¯ã©ã¹ããåãç¶ãããŠããã  
+
+plugoutinfo.info:info  
+
+plugoutinfo.no_plugout_name:ãšã©ãŒ: ãã©ã°ã¢ãŠãåãäžããªããã°ãªããªãã  
+
+plugoutinfo.option_types:ãã©ã°ã¢ãŠãã«ã¯ïŒã€ã®ãªãã·ã§ã³ããã  
+
+plugoutinfo.params:[ãªãã·ã§ã³]ãã©ã°ã¢ãŠã-å   
+
+plugoutinfo.passing_options:ãªãã·ã§ã³ãcollect.cfg å¶åŸ¡ãã¡ã€ã«ã«å«ããããšã«ãã£ãŠããããããã©ã°ã¢ãŠãã«ã«æž¡ãããã  
+
+plugoutinfo.specific_options:ç¹å®ã®ãªãã·ã§ã³ããã©ã°ã¢ãŠãèªäœå
+ã«å®çŸ©ããããã®ç¹å®ã®ãã©ã°ã¢ãŠãã«ã®ã¿æå¹ã§ããã  
+
+
+
+#
+# Classifier option descriptions
+#
+
+AllList.desc:å
+šãã­ã¥ã¡ã³ãã®åäžã®ãªã¹ããäœæãããOaiãµãŒããŒã«ãã£ãŠäœ¿çšãããã  
+
+AZCompactList.allvalues:èŠã€ãã£ãå
+šã¡ã¿ããŒã¿ã®å€ãäœ¿çšããã  
+
+AZCompactList.desc:ã¢ã«ãã¡ãããé (a-z, A-Z, 0-9ãªã©)ã«ãœãŒãããããã®åé¡å­ã®ãã©ã°ã€ã³ã æ°Žå¹³ãªA-Z ã®ãªã¹ããäœæããŠããããã­ã¥ã¡ã³ããå«ãåçŽã®ãªã¹ããå
+±éã®ã¡ã¿ããŒã¿ãæã€ãã­ã¥ã¡ã³ãã®ããã®ããã¯ã·ã§ã«ããäœæããã  
+
+AZCompactList.doclevel:ãã­ã¥ã¡ã³ããåŠçããã¬ãã«  
+AZCompactList.doclevel.top:å
+šãã­ã¥ã¡ã³ãã  
+AZCompactList.doclevel.section:ã»ã¯ã·ã§ã³ã«ãã£ãŠã  
+
+AZCompactList.firstvalueonly:èŠã€ãã£ãæåã®ã¡ã¿ããŒã¿ã®ã¿ãäœ¿çšããã  
+
+AZCompactList.freqsort:ã¢ã«ãã¡ãããïœ°æ°å­é ãããããŒãã®é »åºŠã«ãã£ãŠãœãŒãããã  
+
+AZCompactList.maxcompact:ããŒãžããšã«è¡šç€ºããããã­ã¥ã¡ã³ãã®æå€§æ°ã  
+
+AZCompactList.metadata:åäžã®ã¡ã¿ããŒã¿ã®ãã£ãŒã«ãããããã¯ã«ã³ãã§åºåãããã¡ã¿ããŒã¿ã®ãã£ãŒã«ãã§ãåé¡ã«äœ¿çšãããããããªã¹ããç¹å®ãããã°ãå€ãæã€æåã®ã¡ã¿ããŒã¿ã®åœ¢åŒãäœ¿çšããããæåã®å€ã®ã¿ãéžæãããããªã¹ãã®ãã¹ãŠã®ã¡ã¿ããŒã¿ã®å€ãéžæãããæåã®å€ã®ã¿ã®ãã©ã°ãšå
+šãŠã®å€ã®ãã©ã°ãšå
+±ã«äœ¿çšãããã  
+
+AZCompactList.mincompact:ããŒãžããšã«è¡šç€ºããããã­ã¥ã¡ã³ãã®æå°æ°ã  
+
+AZCompactList.mingroup:åœ¢æãããéå±€ã®ã°ã«ãŒãã®å
+ãšãªãæå°å€ã  
+
+AZCompactList.minnesting:å
+¥ãå­åŒãªã¹ãã«å€æããããªã¹ããåœ¢æããæå°å€ã  
+
+AZCompactList.recopt:å¹Ž/æ©é¢ãªã©ã®å
+¥ãå­åŒã®ã¡ã¿ããŒã¿ã«äœ¿çšãããã  
+AZCompactList.sort:ãªãŒãããŒãããœãŒãããããã®ã¡ã¿ããŒã¿ã  
+
+AZCompactSectionList.desc:ãã­ã¥ã¡ã³ãããã»ã¯ã·ã§ã³ãåé¡ãã AZCompactList ã®ããªãšãŒã·ã§ã³ããšã³ããªãŒã¯ã»ã¯ã·ã§ã³ã¬ãã«ã®ã¡ã¿ããŒã¿ã«ãã£ãŠãœãŒããããã  
+
+AZList.desc:ã¢ã«ãã¡ãããé (a-z, A-Z, 0-9ãªã©)ã«ãœãŒãããããã®åé¡å­ãã©ã°ã€ã³ããã®äžã«ãã­ã¥ã¡ã³ãããªã¹ãã¢ãããããæ°Žå¹³ã® A-Z ãªã¹ããäœæããã   
+
+AZList.metadata:ãªã¹ãã«ãã£ãŠæç€ºãããé åºã«åŸã£ãŠãã¡ã¿ããŒã¿ã®å€ãå«ãæåã®ãã£ãŒã«ããäœ¿çšãããããªã¹ãã¯ãã®ãšã¬ã¡ã³ãã«ãã£ãŠãœãŒããããã  
+
+AZSectionList.desc:ãã­ã¥ã¡ã³ãããã»ã¯ã·ã§ã³ãåé¡ãã AZList ã®ããªãšãŒã·ã§ã³ããšã³ããªãŒã¯ã»ã¯ã·ã§ã³ã¬ãã«ã®ã¡ã¿ããŒã¿ã«ãã£ãŠãœãŒããããã  
+
+BasClas.bad_general_option:%s åé¡å­ãæ­£ãããªããªãã·ã§ã³ãäœ¿çšããŠããŸããcollect.cfg configuration fileããã§ãã¯ããŠãã ããã  
+
+BasClas.builddir:æ§ç¯ãããã€ã³ããã¯ã¹ãçœ®ãå Žæ  
+
+BasClas.buttonname:ããã²ãŒã·ã§ã³ããŒã®åé¡å­ã®ã¹ã¯ãªãŒã³ã®ã©ãã«ãšãã¿ã³ãããã©ã«ãã¯ç¹å®ãããã¡ã¿ããŒã¿ã»ãšã¬ã¡ã³ãã§ãã  
+
+BasClas.desc:å
+šåé¡å­ã®åºåºã¯ã©ã¹ã  
+
+BasClas.no_metadata_formatting:èªåçã«ã¡ã¿ããŒã¿ã®ãã©ãŒããããè¡ããªãã§ãã ãããïŒãœãŒãçšïŒã  
+
+BasClas.outhandle:ã¢ãŠããããã®æžãèŸŒã¿ãè¡ããã¡ã€ã«ã  
+
+BasClas.removeprefix:ãœãŒãæã«ã¡ã¿ããŒã¿å€ãç¡èŠãããã¬ãã£ãã¯ã¹ã  
+
+BasClas.removesuffix:ãœãŒãæã«ã¡ã¿ããŒã¿å€ãç¡èŠããæ¥å°ŸèŸ ã  
+
+BasClas.verbosity:ã¢ãŠããããã®éãå¶åŸ¡ããã 0=none, 3=lotsã  
+
+
+
+DateList.bymonth:å¹Žã ãã«ããªãã§å¹Žæã§åé¡ããã  
+
+DateList.desc:æ¥ä»ã§ãœãŒãããããã®åé¡å­ãã©ã°ã€ã³ãããã©ã«ãã§ã¯ãïœ¢æ¥ä»ïœ£ã®ã¡ã¿ããŒã¿ã§ãœãŒããããæ¥ä»ã¯yyyymmddãyyyy-mm-dd.ã®åœ¢åŒã§æšå®ãããã  
+
+DateList.metadata:åé¡ããæ¥ä»ãå«ãã¡ã¿ããŒã¿ããã©ãŒãããã¯yyyymmdd ã yyyy-mm-ddã§ãããã«ã³ãã§åºåããããªã¹ããäœ¿ãããããã®å Žåæåã®æ¥ä»ãäœ¿çšãããã  
+
+DateList.reverse_sort:éå¹Žä»£é ã§ãã­ã¥ã¡ã³ãããœãŒãããïŒææ°ã®ãã®ãæåïŒã  
+
+DateList.nogroup:å°æ°ã®ãšã³ããªãŒã«å¹ŽããŸãããããªãã§ãããªãŸã³ã¿ã«ã»ãªã¹ãã«åå¹Žã®åå¥ã®ãšã³ããªãŒãäœæããŠäžãããïŒããã¯ïŒãæã®ãªãã·ã§ã³ã§ãåæãäžç·ã«ããªãã§å¥ã
+ã®ãšã³ããªãŒãäœæããã®ã«ãäœ¿çšã§ããŸãïŒã  
+
+DateList.no_special_formatting:ãã­ã¥ã¡ã³ããªã¹ãã«å¹Žææ
+å ±ãè¡šç€ºããªãã§äžããã  
+
+DateList.sort:ïŒã€ã®ãã­ã¥ã¡ã³ããåäžã®æ¥ä»ããã€å Žåã®ãœãŒãã®ããã®ç¹å¥ã®ã¡ã¿ããŒã¿ã»ãã€ãŒã«ãã  
+
+HFileHierarchy.desc:ãµãã«ã¡ã³ãæ§é ã®ãã¡ã€ã«ã«åºã¥ãéå±€åé¡ãçæããããã®Classifier pluginã  
+
+Hierarchy.desc:éå±€çåé¡ãäœæããããã®Classifier pluginãããã¯éå±€åãããã¡ã¿ããŒã¿ã«åºã¥ãããããã¯è£å®æ§é ãã¡ã€ã«ïŒ-hfileãªãã·ã§ã³ãäœ¿çšããïŒãäœ¿çšããã  
+
+Hierarchy.documents_last:åé¡ããŒãã®ããšã«ãã­ã¥ã¡ã³ãã»ããŒããè¡šç€ºããã  
+
+Hierarchy.hfile:ç¹å®ã®åé¡æ§é ãã¡ã€ã«ãäœ¿çšããã  
+
+Hierarchy.hlist_at_top:åé¡ã®ç¬¬1ã¬ãã«ãæ°Žå¹³ã«è¡šç€ºããã  
+
+Hierarchy.reverse_sort:éé  (-sortãäœ¿çšãã)ã«ãªãŒãã»ããŒãããœãŒãããã  
+
+Hierarchy.separator:æ§é çã¡ã¿ããŒã¿ã«äœ¿çšãããªããæ­£èŠè¡šçŸãã»ãã¬ãŒã¿ãŒã«äœ¿çšãããã  
+
+Hierarchy.sort:ãªãŒãã»ããŒãããœãŒãããã¡ã¿ããŒã¿ã®ãã€ãŒã«ãããªãŒãã¯ç¹å®ãããªããã°ãœãŒããããªãã  
+
+Hierarchy.suppressfirstlevel:ã¡ã¿ããŒã¿å€ã®æåã®éšåãç¡èŠããŠäžãããããã¯gsdlsourcefilenameã®ãã£ã¬ã¯ããªãŒãªã©ã®æåã®ãšã¬ã¡ã³ããå
+±éã®ã¡ã¿ããŒã¿ã«å¯ŸããŠæå¹ã§ãã  
+
+Hierarchy.suppresslastlevel:ã¡ã¿ããŒã¿å€ã®æåã®éšåãç¡èŠããŠäžãããããã¯ãã¡ã€ã«ã»ãã¹ãªã©ã®åå€ãç¹å®ã®ãã®ã§ããã¡ã¿ããŒã¿ã«å¯ŸããŠæå¹ã§ãã  
+
+HTML.desc:åã«ãŠãšãããŒãžãžã®ãªã³ã¯ã§ããç©ºã®åé¡ãçæããã  
+
+HTML.url:ãªã³ã¯ãããŠãšãããŒãžã®urlã  
+
+List.bookshelf_type:æ¬æ£ãçæããéã®å¶åŸ¡  
+List.bookshelf_type.always:ãªãŒãã»ããŒãã®åã°ã«ãŒãã«ïŒã€ã®ã¢ã€ãã ãããªããŠãæ¬æ£ã¢ã€ã³ã³ãäœæããã  
+List.bookshelf_type.never:ãªãŒãã»ããŒãã®åã°ã«ãŒãã«ïŒã€ä»¥äžã®ã¢ã€ãã ãããå Žåã§ãæ¬æ£ã®ã¢ã€ã³ã³ãäœæããªãã§äžããã  
+List.bookshelf_type.duplicate_only:ãªãŒãã»ããŒãã®åã°ã«ãŒãã«ïŒã€ä»¥äžã®ã¢ã€ãã ãããå Žåã®ã¿æ¬æ£ã®ã¢ã€ã³ã³ãäœæããã  
+
+List.classify_sections:ãã­ã¥ã¡ã³ãã®ä»£ããã«ã»ã¯ã·ã§ã³ãåé¡ããã  
+
+List.desc:AZCompactListã®èœåã®äž»èŠéšåã§ããŠãã³ãŒããã¡ã¿ããŒã¿ããœãŒãæ©èœãããããä»å ãããŠããäžè¬çã§å€æŽå¯èœãªãªã¹ãåé¡å­ã  
+
+List.level_partition.none:None  
+List.level_partition.per_letter:åæå­ã«ã€ããŠããŒãã£ã·ã§ã³ãäœæããã  
+List.level_partition.constant_size:ã³ã³ã¹ã¿ã³ããªãµã€ãºã®ããŒãã€ã·ã§ã³ãäœæããã  
+List.level_partition.approximate_size:å­ããšã«ããŒãã£ã·ã§ã³ãäœæããã»ãšãã©åããµã€ãºã®ããŒãã€ã·ã§ã³ããŸãšãããåå²ããããã«æå­ãçµç¹åãããåå²ããã  
+
+List.metadata:åé¡ã®ããã«äœ¿çšããã¡ã¿ããŒã¿ã»ãã€ãŒã«ãã '/'ãéå±€ã®ã©ãã«ã®åé¢ã®ããã«äœ¿çšãã ';' ãåã©ãã«å
+ã®ã¡ã¿ããŒã¿ã»ãã€ãŒã«ããåé¢ããããã«äœ¿çšããã  
+
+List.partition_name_length:ããŒãã£ã·ã§ã³åã®é·ã; ããã©ã«ãã§ã¯1ãã3æå­ã®è²ã
+ãªé·ãããããæåŸããå§ãŸãããŒãã£ã·ã§ã³ãåºå¥ããã®ã«ã©ãã ããå¿
+èŠãšããããã«ããããã®ãªãã·ã§ã³ã¯partition_type_within_levelã'constant_size'ã«èš­å®ãããæã«é©çšãããã  
+
+List.partition_size_within_level:åããŒãã£ã·ã§ã³ã®ã¢ã€ãã æ°ïŒpartition_type_within_levelã'constant_size'ã'approximate_size'ã«èš­å®ãããæã ãã«é©çšãããïŒãåã¬ãã«ã«ç¹å®ããããšãã§ããã'/'ã«ãã£ãŠã¬ãã«ãåããã  
+
+List.partition_type_within_level:ããŒãã€ã·ã§ã³ã®åœ¢åŒãå®æœããããåã¬ãã«ãç¹å®ã§ããã'/'ã«ãã£ãŠã¬ãã«ãåããã  
+
+List.reverse_sort_leaf_nodes:ãªãŒããã­ã¥ã¡ã³ããéé ã«ãœãŒãããã  
+
+List.sort_leaf_nodes_using:ãªãŒãã»ããŒãããœãŒãããã®ã«äœ¿çšãããã¡ã¿ããŒã¿ã»ãã£ãŒã«ãã '|' ãã¡ã¿ããŒã¿ã®ã°ã«ãŒããç¢ºå®ãªãœãŒãã«åé¢ããã®ã«äœ¿çšã  ';' ãåã°ã«ãŒãã®ã¡ã¿ããŒã¿ã»ãã£ãŒã«ããåã°ã«ãŒãã«åé¢ããã®ã«äœ¿çšããã  
+
+List.sort_using_unicode_collation:Unicode Collation Algorithmãäœ¿çšããŠãœãŒãããã http://www.unicode.org/Public/UCA/latest/allkeysãå¿
+èŠã§ãããtxt fileã¯perl's lib/Unicode/Collate folderã«ããŠã³ã­ãŒããããã  
+
+List.use_hlist_for:vlistããhlistãäœ¿çšããã¡ã¿ããŒã¿ã»ãã€ãŒã«ãã ','ãã¡ã¿ããŒã¿ã»ã°ã«ãŒããåé¢ããã®ã«äœ¿çšãã';' ãåã°ã«ãŒãå
+ã®ã¡ã¿ããŒã¿ã»ãã€ãŒã«ããåé¢ããã®ã«äœ¿çšããã  
+
+SimpleList.metadata:åäžã®ã¡ã¿ããŒã¿ãã£ãŒã«ããããã¯åé¡ã«äœ¿çšãããã«ã³ãã§åºåãããã¡ã¿ããŒã¿ãã£ãŒã«ãã®ãªã¹ãããªã¹ãã§æç€ºãããé åºã«åŸããã¡ã¿ããŒã¿å€ãå«ãæåã®ãã£ãŒã«ããåé¡ã«äœ¿çšãããã-sortãäœ¿çšãããªããã°ãªã¹ãã¯ãã®ãšã¬ã¡ã³ãã«ãã£ãŠãœãŒãããããããã¡ã¿ããŒã¿ãç¹å®ãããªããã°ãå
+šãã­ã¥ã¡ã³ãããªã¹ãã«å«ãŸããããããªããã°ã¡ã¿ããŒã¿å€ãå«ããã­ã¥ã¡ã³ãã®ã¿ãå«ãŸããã  
+
+SimpleList.desc:Simple list classifier plugin.  
+
+SimpleList.sort:ãœãŒãçšã®ã¡ã¿ããŒã¿ãã£ãŒã«ãããœãŒãã«ã¯'-sort nosort'ãäœ¿çšããã  
+
+Phind.desc:ãã­ã¹ãå
+ã«èŠåºããèªå¥ã®éå±€ãäœæããã  
+
+Phind.language:éå±€æ§é æ§ç¯ã«äœ¿çšããèšèªãèšèªã¯enïŒè±èªïŒ esïŒã¹ãã€ã³èªïŒ frïŒãã©ã³ã¹èªïŒãªã©ã®2æå­ã®ã«ã³ããªãŒã»ã³ãŒãã§è­å¥ããããèšèªã¯æ­£èŠè¡šçŸãªã®ã§ã  
+
+Phind.min_occurs:æå°éã®åæ°ã§èªå¥ã¯éå±€ã«å«ãŸãããã­ã¹ãå
+ã«è¡šç€ºãããªããã°ãªããªãã  
+
+Phind.savephrases:ããèš­å®ãããã°ãèªå¥ã®æ
+å ±ã¯äžãããããã¡ã€ã«ã«ãã­ã¹ããšããŠä¿å­ããããçµ¶å¯Ÿãã¹ãäœ¿çšããããšãè¯ç­ãšæãããã  
+
+Phind.suffixmode:èªå¥æœåºãã­ã°ã©ã ãžã® sã¢ãŒããã©ã¡ãŒã¿ãŒãïŒå€ã¯ã¹ãããã¯ãŒããç¡èŠãããããšãæå³ãã1å€ã¯ã¹ãããã¯ãŒããäœ¿çšãããããšãæå³ããŠããã  
+
+Phind.text:èªå¥ã®éå±€ãæ§ç¯ããã®ã«äœ¿çšããããã­ã¹ãã  
+
+Phind.thesaurus:ã³ã¬ã¯ã·ã§ã³ã®ãã£ã¬ã¯ããªãŒã®Phindãã©ãŒãããã«ä¿å­ãããã·ãœãŒã©ã¹åã  
+
+Phind.title:åãã­ã¥ã¡ã³ããèšè¿°ããã®ã«äœ¿çšãããã¡ã¿ããŒã¿ã  
+
+Phind.untidy:äœæ¥­äž­ãã¡ã€ã«ãåé€ããªãã§äžããã  
+
+RecentDocumentsList.desc:æ°èŠã«è¿œå ããããããã¯å€æŽããããã­ã¥ã¡ã³ãã®ãªã¹ããäžããåé¡å­ã  
+
+RecentDocumentsList.include_docs_added_since:ç¹å®ã®æ¥ä»(yyyymmdd or yyyy-mm-ddãã©ãŒãããå
+)ã«å€æŽãè¿œå ïœãããã­ã¥ã¡ã³ãã®ã¿ãå«ãã  
+
+RecentDocumentsList.include_most_recently_added:æè¿è¿œå ããããã­ã¥ã¡ã³ãã®ç¹å®ã®çªå·ã®ã¿ãå«ãã if include_docs_added_since is not specifiedã®ã¿ãäœ¿çšãããã  
+
+RecentDocumentsList.sort:ãªã¹ãããœãŒãããã¡ã¿ããŒã¿ã»ããç¹å®ãããŠããªããã°ããªã¹ãã¯å€æŽ/è¿œå æ¥ä»ã«ãã£ãŠãœãŒããããã  
+
+SectionList.desc:liståé¡å­ãšåæ§ã ããããã¬ãã«ãã­ã¥ã¡ã³ããã®ãã®ã ãããããããã­ã¥ã¡ã³ãïŒãããã¬ãã«ãé€ãïŒã®å
+šã»ã¯ã·ã§ã³ãå«ãã  
+
+Collage.desc:ã¢ãã¬ããã¯ã³ã¬ã¯ã·ã§ã³ã«èŠåºãããç»åã®ã³ã©ãŒãžã¥ãè¡šç€ºããã  
+
+Collage.geometry:ã³ã©ãŒãžã¥ã»ã­ã£ã³ãã¹ã®ãã£ã¡ã³ã·ã§ã³ã  
+
+Collage.maxDepth:è²Œãä»ãã®ããã®ç»åã¯äžéšã«ãããã©ãŠãºåé¡å­ãåç
+§ããŠæœåºããããããã¯åç
+§ã®éçšã®æå€§å¹
+ãå¶åŸ¡ããã  
+
+Collage.maxDisplay:ãã€ã§ãè²Œãä»ãã§è¡šç€ºãããç»åã®æå€§æ°ã  
+
+Collage.imageType:ã³ã©ãŒãžã¥ã§äœ¿çšããããã¡ã€ã«ã®çš®é¡ã®ããã¡ã€ã«åã®æ¡åŒµå­ãè¡šç€ºããããšã«ãã£ãŠå¶åŸ¡ã«äœ¿çšãããããã¡ã€ã«åã®æ¡åŒµå­ã®ãªã¹ãã¯ ããŒã»ã³ã (%%)ç¬Šå·ã«ãã£ãŠåé¢ãããã  
+
+Collage.bgcolor:16é²æ°ã§ç¹å®ãããïŒããšãã°#008000ã¯ãã©ã¬ã¹ãã»ã°ãªãŒã³èæ¯è²ã«ãªãïŒã«ã¬ããžã»ã­ã£ã³ãã¹ã®èæ¯è²  
+
+Collage.buttonname:ããã²ãŒã·ã§ã³ã»ããŒã®åé¡å­ã®ã¹ã¯ãªãŒã³ãšãã¿ã³ã®ã©ãã«ã  
+
+Collage.refreshDelay:ããªç§ã§ã³ã©ãŒãžã¥ã»ã­ã£ã³ãã¹ãæŽæ°ãããçã  
+
+Collage.isJava2:ãžã£ãã®ã©ã³ã¿ã€ã ã¯ã©ã¹ã®äœ¿çšãå¶åŸ¡ããã®ã«äœ¿çšãããããžã£ãã®äžäœããŒãžã§ã³ïŒJava 1.2 onwardsãªã©ïŒã¯ããç»åã®éææ§ãå¶åŸ¡ããç²Ÿå¯ãªãµããŒããå«ãããã®ãã©ã°ã¯äºæ
+ã®ã³ã³ãã­ãŒã«ã«åœ¹ç«ã€ã  
+
+Collage.imageMustNotHave:ããã²ãŒã·ã§ã³ïŒããŒãäœæããç»åãã¿ã³ãªã©ã³ã©ãŒãžã¥ã«è¡šç€ºããŠã¯ãªããªãç»åãå§çž®ããã®ã«äœ¿çšãããã  
+
+Collage.caption:ã³ã©ãŒãžã¥ã»ã­ã£ã³ãã¹ã®äžéšã«è¡šç€ºããããªãã·ã§ãã«ã»ã­ã£ãã·ã§ã³ã  
+
+
+#
+# Plugin option descriptions
+#
+AcronymExtractor.adding:è¿œå   
+
+AcronymExtractor.already_seen:ãã§ã«è¡šç€ºããã  
+
+AcronymExtractor.desc:ã­ã±ãŒã·ã§ã³ã®ããã®ãã«ããŒã»ãšã¯ã¹ãã©ã¯ã¿ãŒã»ãã©ã°ã€ã³ã§ãã­ã¹ãã®é ­å­èªãã¿ã°ä»ãããã  
+
+AcronymExtractor.done_acronym_extract:é ­å­èªã®æœåºãè¡ãããã  
+
+AcronymExtractor.done_acronym_markup:é ­å­èªã®ã¿ã°ä»ããè¡ãããã  
+
+AcronymExtractor.extract_acronyms:ãã­ã¹ãå
+ã®é ­å­èªãæœåºãããã¡ã¿ããŒã¿ãšããŠã»ãããããã  
+
+AcronymExtractor.extracting_acronyms:é ­å­èªã®æœåº  
+
+AcronymExtractor.marking_up_acronyms:é ­å­èªã®ã¿ã°ä»ã  
+
+AcronymExtractor.markup_acronyms:é ­å­èªã®ã¡ã¿ããŒã¿ããã­ã¥ã¡ã³ãã®ãã­ã¹ãã«è¿œå ããã  
+
+ArchivesInfPlugin.desc:ã¢ãŒã«ã€ãããã€ã³ããŒãã®ãã­ã»ã¹ã§çæãããããŒã¿ããŒã¹ (archiveinf-doc) ã«ãããã©ã°ã€ã³ãããŒã¿ããŒã¹ã«ãªã¹ãã¢ãããããåã¢ãŒã«ã€ããã¡ã€ã«ãGreenstoneXMLPluginã«ãã£ãŠåŠçããããã©ã°ã€ã³ã»ãã€ãã©ã€ã³ã«éãã  
+ArchivesInfPlugin.reversesort:éé ã«ãœãŒãããããã-sortmeta ã®ãªãã·ã§ã³ã import.plã«ãã£ãŠäœ¿çšãããã°æçšã§ããã  
+
+AutoExtractMetadata.desc:ãšã¯ã¹ãã©ã¯ã¿âã»ãã©ã°ã€ã³ã®å
+šãŠã®ãšã¯ã¹ãã©ã¯ã¿ãŒæ©èœãããããããŒã¹ãã©ã°ã€ã³ã  
+
+AutoExtractMetadata.extracting:æœåº  
+
+AutoExtractMetadata.first:ãã­ã¹ãã®æåããæå­æ°ãNã«ä»£å
+¥ããã 'FirstN'ãšããã¡ã¿ããŒã¿ãã€ãŒã«ãã®ã»ããã«æœåºãããäžé£ã®æå­ã®ã«ã³ãã§åºåããããªã¹ããããšãã°ã"3,5,7" ãšããå€ããæåã® 3, 5 ,7ãšããæå­ã "First3", "First5" and "First7"ãšããã¡ã¿ããŒã¿ãã£ãŒã«ãã«æœåºãããã   
+
+
+
+BaseMediaConverter.desc:ImageConverter ãšvideo convertersãªã©ã®ã¡ãã£ã¢ã³ã³ããŒã¿ãŒãã©ã°ã€ã³ã®ããã®åºæ¬çæ©èœãäŸçµŠãããã«ããŒãã©ã°ã€ã³ã  
+
+BasePlugin.associate_ext:ãã­ã¥ã¡ã³ãããã©ã°ã€ã³ã«ãã£ãŠåŠçããããããã¡ã€ã«ãåãã«ãŒãã®ãã¡ã€ã«åã«ããããããŠãã®é¢æ°ã«ãã£ãŠäŸçµŠããããã­ã¥ã¡ã³ãã«ã³ãã§åºåããããªã¹ãã®ãã¡ã€ã«åã®æ¡åŒµå­ã¯å¥ã
+ã®ãªã¹ããšããŠåãæ±ãããããåŠçããããã­ã¥ã¡ã³ããšäžç·ã«ãããã  
+
+BasePlugin.associate_tail_re:é¢é£ã¥ãããããã¡ã€ã«ãèŠã€ããããã«ãã¡ã€ã«åãäžèŽãããæ­£èŠè¡šçŸã  
+
+BasePlugin.block_exp:ãã®æ­£èŠè¡šçŸã«äžèŽãããã¡ã€ã«ã¯ãªã¹ãã®åŸã®ãã©ã°ã€ã³ã«æž¡ãããã®ããã­ãã¯ãããã  
+
+BasePlugin.desc:å
+šãŠã®ã€ã³ããŒãã»ãã©ã°ã€ã³ã®åºç€ã¯ã©ã¹  
+
+BasePlugin.dummy_text:ãã®ãã­ã¥ã¡ã³ãã¯ãã­ã¹ãããããŸããã  
+
+BasePlugin.encoding.ascii:ãã¬ã€ã³ïŒãããASCIIãããã¯ iso_8859_1ãäœ¿çšããããæ©ãã§ããããããã­ã¹ãããã¬ã€ã³ïŒãããASCIIã»ããä»¥å€ã®æå­ãå«ãæïŒã¢ã¯ã»ã³ãèšå·ãå«ããã€ãèªããã©ã³ã¹èªã®ãã­ã¹ããªã©ïŒæ°ãã€ããŠäžãããiso_8859_1ãä»£ããã«äœ¿çšããŠãã ãã ã  
+
+BasePlugin.encoding.unicode:unicodeã ãã  
+
+BasePlugin.encoding.utf8:utf8ãunicode -- èªåçã«æ€åºãããŸããã  
+
+BasePlugin.filename_encoding:ãœãŒã¹ãã¡ã€ã«ã®ãã¡ã€ã«åã®ãšã³ã³ãŒãã£ã³ã°ã  
+
+BasePlugin.filename_encoding.auto:ãã¡ã€ã«åã®ãšã³ã³ãŒãã€ã³ã°ãèªåçã«æ€åºããã  
+
+BasePlugin.filename_encoding.auto_language_analysis:åæã«ãã£ãŠãã¡ã€ã«åã®ãšã³ã³ãŒãã£ã³ã°ã®èªååæãããã  
+
+BasePlugin.filename_encoding.auto_filesystem_encoding:ãã¡ã€ã«ã·ã¹ãã ã»ãšã³ã³ãŒãã£ã³ã°ãäœ¿çšãããã¡ã€ã«åã®ãšã³ã³ãŒãã£ã³ã°ã®èªåæ€åºã  
+
+BasePlugin.filename_encoding.auto_fl:ãã¡ã€ã«ããŒã ã®ãšã³ã³ãŒãã£ã³ã°ãäœ¿çšããŠã®ãã¡ã€ã«åã®ãšã³ã³ãŒãã€ã³ã°ãæ€åºããããã®èšèªåæã  
+
+BasePlugin.filename_encoding.auto_lf:èšèªåæãäœ¿çšããŠã®ãã¡ã€ã«åã®ãšã³ã³ãŒãã€ã³ã°ãæ€åºããããã®ãã¡ã€ã«ã·ã¹ãã ã»ãšã³ã³ãŒãã£ã³ã°ã  
+
+BasePlugin.no_blocking:ãã¡ã€ã«ããã­ãã¯ããªãã§äžãããé¢é£ãã¡ã€ã«ïŒãŠãšãããŒãžã®ç»åãªã©ïŒãã³ã¬ã¯ã·ã§ã³ã«å³åŽã®ãã­ã¥ã¡ã³ããšããŠè¿œå ãããŸãã  
+
+BasePlugin.no_cover_image:ã«ããŒã€ã¡ãŒãžãšããŠäžç·ã«ããããã«prefix.jpgãã¡ã€ã«ïŒãã¬ãã€ãã¯ã¹ã¯ãã¡ã€ã«ãåŠçãããã®ãšåããã¬ãã€ãã¯ã¹ã®å Žæã§ãïŒãæ¢ããªãã§ãã ããã  
+
+BasePlugin.OIDtype.auto:import.plã®OIDtypeã»ãããäœ¿çšãã  
+
+BasePlugin.process_exp:ãã¡ã€ã«åãšäžèŽããperlã®æ­£èŠè¡šçŸããã¡ã€ã«åãšã®äžèŽã¯ãã©ã°ã€ã³ã«ãã£ãŠåŠçããããããšãã°ã'(?i).html?\$'ãäœ¿çšãããš .htm or .html ã§çµããïŒå€§æå­ã»å°æå­ãåºå¥ããªãïŒå
+šãã­ã¥ã¡ã³ããšäžèŽããã  
+
+BasePlugin.processing_tmp_files:tmp fileãåŠçããŠããããšãç€ºãã³ã³ããŒã¿ãŒã»ãã©ã°ã€ã³ã«ãã£ãŠã»ãããããå
+éšãã©ã°ã  
+
+BasePlugin.smart_block:ãã¡ã€ã«åãåç
+§ããã ãã§ãªãããŸãããæ¹ã§ãã¡ã€ã«ããã­ãã¯ããã  
+
+BasePlugin.store_original_file:ãªãªãžãã«ã®ãœãŒã¹ã»ãã­ã¥ã¡ã³ãããé¢é£ãã¡ã€ã«ãšããŠä¿å­ããã  
+
+BasePlugin.file_rename_method:ãã®æ¹æ³ã¯ã€ã³ããŒãããããã¡ã€ã«ãšé¢é£ã®ãã¡ã€ã«ã®ã³ããŒã®ååãå€æŽããã®ã«äœ¿çšãããŸãã  
+
+BasePlugin.rename_method.url:ã€ã³ããŒãããããã¡ã€ã«åãšé¢é£ãã¡ã€ã«åã®å€æŽã§urlã®ãšã³ã³ãŒãã£ã³ã°ãäœ¿çšããã  
+
+BasePlugin.rename_method.base64:ã€ã³ããŒãããããã¡ã€ã«åãšé¢é£ãã¡ã€ã«ãå€æŽããbase64 ãšã³ã³ãŒãã€ã³ã°ã  
+
+BasePlugin.rename_method.none:ã€ã³ããŒãããããã¡ã€ã«åãšé¢é£ãã¡ã€ã«åãäœ¿çšããªãã§äžããã  
+
+BibTexPlugin.desc:BibTexPluginã¯BibTexãã©ãŒãããã§ç®é²ãã¡ã€ã«ãèª­ã¿èŸŒã¿ãŸããBibTexPluginã¯ãã¡ã€ã«ã®å
+šã¬ãã¡ã¬ã³ã¹ã®ãã­ã¥ã¡ã³ãã®ãªããžã§ã¯ããçæããŠããŸãã  
+
+BookPlugin.desc:<<TOC>> ã¬ãã«ã»ã¿ã°ãå«ããã­ã¥ã¡ã³ããããã«ãã»ã¬ãã«ã»ãã­ã¥ã¡ã³ããäœæãããåã»ã¯ã·ã§ã³ã®ã¡ã¿ããŒã¿ã¯<<TOC>>ãšããŠåãã©ã€ã³ã®ä»ã®ã¿ã°ããæœåºããããããªãã¡<<Title>>xxxx<</Title>>ãã¿ã€ãã«ã®ã¡ã¿ããŒã¿ãã»ãããããTOCã¿ã°ã®ä»ã®å
+šãŠã¯åäžã®htmlãšããŠåãæ±ããããïŒããªãã¡ãhtml linksã®åŠçã®ãããªHTMLPluginåœ¢åŒã®åŠçããªãããŠããªãïŒããã©ã«ãã§ a .hb ã®ãã¡ã€ã«æ¡åŒµå­ããã€ãã¡ã€ã«ãã€ã³ãããããïŒããã¯-process_exp ãªãã·ã§ã³ãè¿œå ããããšã§å€æŽã§ããŸãïŒåäžåã®ãã¡ã€ã«ã¯hbãã¡ã€ã«ãšããŠããã .jpg ã®æ¡åŒµå­ã¯ã«ããŒã»ã€ã¡ãŒãžãšããŠåãæ±ããããïŒjpgãã¡ã€ã«ã¯ãã®ãã©ã°ã€ã³ã«ãã£ãŠãã­ãã¯ãããïŒBookPluginã¯ãã¥ãŒãããã£ã»ããã­ãã¡ã³ãã»ã©ã€ãã©ãªãŒã»ã³ã¬ã¯ã·ã§ã³ã«ãã£ãŠäœ¿çšãããHBPluginã®åçŽåïŒãããŠæ¡åŒµïŒã§ããã BookPlugin ã¯ã¯ãªãŒããŒãšããŠã®å
+¥åãã¡ã€ã«ãåããŠããã®ã§æ©ãïŒHDLã³ã¬ã¯ã·ã§ã³ãžã®å
+¥åã¯<<TOC>> ã¿ã°ã®ãŸããã«ããµããhtml ã¿ã°ãå«ã¿ã<<I>> ã¿ã°ãç»åãç¹å®ããããã«äœ¿çšãããããŠ<<TOC>> ã¿ã°ã®åŸãã«è¡šç€ºãããå
+šãã­ã¹ããåæ±ããã¿ã€ãã«ã¡ã¿ããŒã¿ãšããŠåãåã«ãããïŒããåæ§ã®æ¹æ³ã§HDLã³ã¬ã¯ã·ã§ã³ãšããŠåæ§ã®æ¹æ³ã§è¡šç€ºããããã­ã¥ã¡ã³ããã¿ã°ä»ããããªããHBPluginã®ä»£ããã«ãã®ãã©ã°ã€ã³ãäœ¿çšããŠãã ããã  
+
+CONTENTdmPlugin.desc:ãšã¯ã¹ããŒããããCONTENTdmã³ã¬ã¯ã·ã§ã³ã®RDFãã¡ã€ã«ãåŠçãããã©ã°ã€ã³ã  
+
+ConvertBinaryFile.apply_fribidi:"fribidi" ãŠãã³ãŒãåæ¹åã®ã¢ã«ãŽãªãºã ã»ãã­ã°ã©ã ãå€æããããã¡ã€ã«äžã§èµ°ãããïŒå³ããå·Šãžæžããã­ã¹ãïŒã  
+
+ConvertBinaryFile.convert_to:ãã­ã¹ããHTMLãããŸããŸãªåœ¢åŒã®ç»åïŒJPEGã GIFã PNGãªã©ïŒãžå€æãããã©ã°ã€ã³ã  
+
+ConvertBinaryFile.convert_to.auto:èªåçã«å€æããããã©ãŒããããéžæãããéžæããããã©ãŒãããã¯å
+¥åããããã­ã¥ã¡ã³ãã®åœ¢åŒã«ãããããšãã°ã¯ãŒãã¯èªåçã«HTMLã«å€æããããããããã¯ãŒãã€ã³ãã¯  
+
+ConvertBinaryFile.convert_to.html:HTMLãã©ãŒãããã  
+
+ConvertBinaryFile.convert_to.text:ãã¬ãŒã³ã»ãã­ã¹ãã»ãã©ãŒãããã  
+
+ConvertBinaryFile.convert_to.pagedimg:äžé£ã®ç»åã  
+
+ConvertBinaryFile.convert_to.pagedimg_jpg:JPEGãã©ãŒãããã®äžé£ã®ç»åã  
+
+ConvertBinaryFile.convert_to.pagedimg_gif:GIFãã©ãŒãããã®äžé£ã®ç»åã  
+
+ConvertBinaryFile.convert_to.pagedimg_png:PNGãã©ãŒãããã®äžé£ã®ç»åã  
+
+ConvertBinaryFile.desc:ãã®ãã©ã°ã€ã³ã¯WordPluginãPowerPointPluginãPostScriptPluginãRTFPluginãPDFPluginãªã©ã®ãã©ã°ã€ã³ã«åŒãç¶ãããŠãããããã¯ãã­ã¥ã¡ã³ãã®åœ¢åŒãHTMLããã­ã¹ããäžé£ã®ç»åã«å€æããæ©èœãæã€ã'convert_to'ãã©ã°ã€ã³é¢æ°ã«åºã¥ããŠé©åãªç¬¬äºã®ãã©ã°ã€ã³(HTMLPluginãStructuredHTMLPluginãPagedImagePluginãTextPlugin) ãåçã«ç«ã¡äžããåœ¹å²ãæããã  
+
+ConvertBinaryFile.keep_original_filename: doc.pdf, doc.docã«å€æããããã¯ãããé¢é£ãã¡ã€ã«ã®å
+ã«ãã¡ã€ã«åãä¿æããã  
+
+ConvertBinaryFile.use_strings:ããã»ãããããã°ãå€æãŠãŒãã€ãªãã€ãå®è¡ã«å€±æããã°åäžã®ã¹ããªã³ã°æ©èœããã­ã¹ãã®æœåºã®ããã«èµ·åãããã  
+
+ConvertToRogPlugin.desc:RogPluginããåŒãç¶ããããã©ã°ã€ã³ã  
+
+CSVPlugin.desc:ã³ã³ãã§åºåãããå€ã®ãã©ãŒãããã®ãã¡ã€ã«ã®ãã©ã°ã€ã³ãæ°èŠã®ãã­ã¥ã¡ã³ãã¯ãã¡ã€ã«ã®ååã«äœæãããã  
+
+DateExtractor.desc:ãã­ã¹ãããæ­Žå²çæ¥ä»ã®æ
+å ±ãæœåºããããã®ãã«ãæœåºãã©ã°ã€ã³ã  
+
+DateExtractor.extract_historical_years:æ­Žå²çãã­ã¥ã¡ã³ãããæé-æä»£ã®æ
+å ±ãæœåºãããããã¯ãã­ã¥ã¡ã³ãã®ã¡ã¿ããŒã¿ãšããŠä¿å­ãããããã®ã¡ã¿ããŒã¿ã®æ€çŽ¢ã€ã³ã¿ãŒãã§ãŒã¹ãããã "format QueryInterface DateSearch" ãšããã¹ããŒãã¡ã³ããã³ã¬ã¯ã·ã§ã³ãšèš­å®ãã¡ã€ã«ã«å ããããšã§ã³ã¬ã¯ã·ã§ã³ã«å«ããããšãã§ããã  
+
+DateExtractor.maximum_century:æ­Žå²çãã­ã¥ã¡ã³ãããæé-æä»£ã®æ
+å ±ãæœåºãããããã¯ãã­ã¥ã¡ã³ãã®ã¡ã¿ããŒã¿ãšããŠä¿å­ãããããã®ã¡ã¿ããŒã¿ã®æ€çŽ¢ã€ã³ã¿ãŒãã§ãŒã¹ãããã "format QueryInterface DateSearch" ãšããã¹ããŒãã¡ã³ããã³ã¬ã¯ã·ã§ã³ãšèš­å®ãã¡ã€ã«ã«å ããããšã§ã³ã¬ã¯ã·ã§ã³ã«å«ããããšãã§ããã  
+
+DateExtractor.maximum_year:æå€§ã®æ­Žå²æ¥ä»ãã¡ã¿ããŒã¿ãšããŠäœ¿çšããããïŒ1950ã®ãããªå
+±éã®æä»£ã®æ¥ä»ïŒã  
+
+DateExtractor.no_bibliography:æ­Žå²çæ¥ä»ãæœåºããå Žåæžèªçæ¥ä»ããã­ãã¯ããããšããªãã§äžããã  
+
+DirectoryPlugin.desc:çºèŠããåãã¡ã€ã«ãåŠçãããã£ã¬ã¯ããªãŒãååž°ãããã©ã°ã€ã³ã  
+
+DirectoryPlugin.recheck_directories:ã€ã³ããŒãã»ãã£ã¬ã¯ããªãŒã®ãã¡ã€ã«ãåŠçãããåŸãçæãããæ°èŠãã¡ã€ã«ãèŠåºãããã«ãã£ã¬ã¯ããªãŒãåèª­ã¿èŸŒã¿ããã  
+
+DirectoryPlugin.use_metadata_files:ä»£æ¿ããã -  MetadataXMLPluginãã¡ã¿ããŒã¿XMLãã¡ã€ã«ã®ã¡ã¿ããŒã¿ãèª­ãããã«ãã©ã°ã€ã³ãªã¹ãã«è¿œå ããã  
+
+DatabasePlugin.desc:ããŒã¿ããŒã¹ããã¬ã³ãŒããã€ã³ããŒããããã©ã°ã€ã³ãperlã®DBIã¢ãžã¥ãŒã«ãäœ¿çšããmysql, postgresqlã®ããã¯ãšã³ããã«ã³ãã§åºåãããå€(CSV)ãMS Excel, ODBC, sybaseãªã©ããšã¯ã¹ãã©ã»ã¢ãžã¥ãŒã«ããããäœ¿çšããã®ã«å¿
+èŠãšãªããããããªãã<GSDLHOME>/etc/packages/example.dbi ãconfig fileã®ãµã³ãã«ãšããŠã¿ãŠãã ããã  
+
+DSpacePlugin.desc:DSpaceãããšã¯ã¹ããŒããããã³ã¬ã¯ã·ã§ã³ãåãæ±ãã°ãªãŒã³ã¹ããŒã³ã«ã€ã³ããŒããããã©ã°ã€ã³ã  
+	
+DSpacePlugin.first_inorder_ext:ããã¯DSpaceã³ã¬ã¯ã·ã§ã³ã»ãã­ã¥ã¡ã³ãã®ãã©ã€ããªãŒã»ãã­ã¥ã¡ã³ãã»ãã¡ã€ã«ãç¹å®ããããã«äœ¿çšãããããã®ãªãã·ã§ã³ã§ã¯ãã·ã¹ãã ã¯ãã©ã€ããªãŒã»ãã­ã¥ã¡ã³ãã»ãã¡ã€ã«ãæ¢ãããã®ç¹å®ã®é£ç¶ãããã­ã¥ã¡ã³ãã®ext åœ¢åŒãåãæ±ãã  
+
+DSpacePlugin.first_inorder_mime:DSpaceã³ã¬ã¯ã·ã§ã³ã»ãã­ã¥ã¡ã³ãã®ãã©ã€ããªãŒã»ãã­ã¥ã¡ã³ãã»ãã¡ã€ã«ãç¹å®ããããã«äœ¿çšãããããã®ãªãã·ã§ã³ã§ã¯ãã·ã¹ãã ã¯ãã©ã€ããªãŒã»ãã­ã¥ã¡ã³ãã»ãã¡ã€ã«ãæ¢ãããã®ç¹å®ãããé£ç¶ãããã­ã¥ã¡ã³ãã® mimeåœ¢åŒãåãæ±ãã  
+
+DSpacePlugin.only_first_doc:ããã¯DSpaceã³ã¬ã¯ã·ã§ã³ã»ãã­ã¥ã¡ã³ãã®ãã©ã€ããªãŒã»ãã­ã¥ã¡ã³ãã»ãã¡ã€ã«ãç¹å®ããããã«äœ¿çšãããããã®ãªãã·ã§ã³ã§ã¯ãã·ã¹ãã ã¯ãã©ã€ããªãŒã»ãã­ã¥ã¡ã³ãã»ãã¡ã€ã«ãšããŠãããªã³ã³ã¢ã¡ã¿ããŒã¿ã®æåã®åç
+§ããããã­ã¥ã¡ã³ããåãæ±ãã  
+
+EmailAddressExtractor.desc:ãã­ã¹ãã®ã¡ãŒã«ã¢ãã¬ã¹ãèŠåºãããã®ãã«ãã»ãšã¯ã¹ãã©ã¯ã¿ãŒã»ãã©ã°ã€ã³ã  
+
+EmailAddressExtractor.done_email_extract:æœåºãããã¡ãŒã«ã¢ãã¬ã¹ã  
+
+EmailAddressExtractor.extracting_emails:ã¡ãŒã«ã¢ãã¬ã¹ãæœåºãã  
+
+EmailAddressExtractor.extract_email:ã¡ã¿ããŒã¿ãšããŠæœåºãããã¡ãŒã«ã¢ãã¬ã¹ã  
+
+EmailPlugin.desc:ã¡ãŒã«ãã¡ã€ã«ãèª­ããã©ã°ã€ã³ãç°¡åãªçªå·ã§ååãã€ããããïŒmaildirã®ãã©ã«ããŒã«è¡šç€ºãããïŒã .mbxïŒmboxã¡ãŒã«ã®ãã¡ã€ã«ã»ãã©ãŒãããïŒã®æ¡åŒµå­ãä»ãããã­ã¥ã¡ã³ãã»ãã­ã¹ãã¯ãã­ã¥ã¡ã³ã.\nMetadata (Dublin Coreã§ã¯ãªã!):\n\t\$Headers      ã®æåã®ç©ºçœè¡ã®ããšã®å
+šãã­ã¹ãããæ§æããããå
+šããããŒã®ã³ã³ãã³ãïŒãªãã·ã§ã³ããããªã«ãã«ãã£ãŠä¿å­ãããªãïŒ)\n\t\$Subject      Subject: header\n\t\$To           To: header\n\t\$From         From: header\n\t\$FromName     Name of sender (where available)\n\t\$FromAddr     E-mail address of sender\n\t\$DateText     Date: header\n\t\$Date         Date: header in GSDL format (eg: 19990924)  
+
+EmailPlugin.no_attachments:ã¡ãã»ãŒãžã®ã¢ã¿ããã¡ã³ããä¿å­ããªãã§äžããã  
+
+EmailPlugin.headers:ã¡ãŒã«ã®ããããŒã "Headers" ã¡ã¿ããŒã¿ãšããŠä¿å­ããã  
+
+EmailPlugin.OIDtype.message_id:ã¡ãã»ãŒãžè­å¥å­ãOIDãã­ã¥ã¡ã³ããšããŠäœ¿çšãããããã¡ãã»ãŒãžè­å¥å­ãèŠãã ããªããã°ããã·ã¥OIDãäœ¿çšããŠäžããã  
+
+EmailPlugin.split_exp:å€ãã®ã¡ãã»ãŒãžãåå¥ã®ãã­ã¥ã¡ã³ãã«å«ããã¡ã€ã«ãåå²ããããã®perlã®æ­£èŠè¡šçŸã  
+
+EmbeddedMetadataPlugin.desc:ããŸããŸãªãã¡ã€ã«åœ¢åŒããåãèŸŒãŸããã¡ã¿ããŒã¿ãæœåºãããã©ã°ã€ã³ãïŒïŒä»¥äžã®ãã¡ã€ã«ã»ãã©ãŒããããšïŒïŒã®ã¡ã¿ããŒã¿ã»ãã©ãŒãããã®ãµããŒããå«ãCPAN ã¢ãžã¥ãŒã« 'ExifToolã«ããšã¥ããŠããããã€ã©ã€ãã¯ä»¥äžãå«ãïŒ AVI, ASF, FLV, MPEG, OGG Vorbis, WMVãªã©ã®ãããªã»ãã©ãŒããã;BMP, GIF, JPEG, JPEG 2000 and  PNGãªã©ã®ç»åãã©ãŒããã;AIFF, RealAudio, FLAC, MP3, WAVãªã©ã®ãªãŒãã£ãªã»ãã©ãŒããã;Encapsulated PostScript, HTML, PDF, Wordãªã©ã®ãªãã€ã¹ã»ãã­ã¥ã¡ã³ãã»ãã©ãŒããã ;è©³çŽ°ã¯ExifToolã®ããŒã ããŒãžïŒhttp://www.sno.phy.queensu.ca/~phil/exiftool/ã§åç
+§ã§ãããã  
+
+ExcelPlugin.desc:Microsoft ãšã¯ã»ã«ã»ãã¡ã€ã«(95ãš97ããŒãžã§ã³)ãã€ã³ããŒããããã©ã°ã€ã³ã  
+
+FavouritesPlugin.desc:ã€ã³ã¿ãŒãããã»ãšã¯ã¹ãã­ãŒã©ãŒã®ãæ°ã«å
+¥ããã¡ã€ã«ãåŠçãããã©ã°ã€ã³ã  
+
+FOXPlugin.desc: Foxbase dbt ãã¡ã€ã«ãåŠçãããã©ã°ã€ã³ããã®ãã©ã°ã€ã³ã¯dbt ãšdbfãã¡ã€ã«ãèª­ã¿èŸŒãã§åã¬ã³ãŒããåŠçããåºæ¬çæ©èœãäŸçµŠããããã®äžè¬çãªä»æ§ã«ããšã¥ããã«ã¹ã¿ãã€ãºããããã©ã°ã€ã³ãé©åãªãã€ãŒã«ããåŠçããããã®ç¹å®ãªããŒã¿ããŒã¹ã«æžãèŸŒãŸããããšãå¿
+èŠã«ãªãã   
+
+GreenstoneXMLPlugin.desc:ã°ãªãŒã³ã¹ããŒã³ã»ã¢ãŒã«ã€ã XML ãã­ã¥ã¡ã³ããåŠçããããã®ãã©ã°ã€ã³ã¯ã·ã³ã¿ãã¯ã¹ã®ããã¯ãè¡ããªãããšã«æ³šæããŠãã ããïŒããããªããXML::Parser ã¢ãžã¥ãŒã«ãããåœ¢æãããŠãããã«ã€ããŠæ€èšŒãããŸãïŒã°ãªãŒãŒã³ã¹ããŒã³ã®ã«ãŒã«ã€ãã»ãã¡ã€ã«ãDTDã«åŸãããšãä»®å®ãããŠããã  
+
+GISExtractor.desc:ãã­ã¹ãããã®ãã¬ãŒã¹ããŒã ãæœåºãããã«ãæœåºãã©ã°ã€ã³ãã°ãªãŒã³ã¹ããŒã³ãžã¯GISã®æ¡åŒµå­ãå¿
+èŠãšãªãã  
+
+GISExtractor.extract_placenames:ãã­ã¹ãå
+ãããã¬ãŒã¹ããŒã ãæœåºãã¡ã¿ããŒã¿ãšããŠã»ãããããã°ãªãŒã³ã¹ããŒã³ãžã¯GISã®æ¡åŒµå­ãå¿
+èŠãšãªãã  
+
+GISExtractor.gazetteer:ãã¬ãŒã¹ããŒã ããã­ã¹ãå
+ããæœåºããããã«äœ¿çšããã¬ãŒãã¿ãŒãã°ãªãŒã³ã¹ããŒã³ãžã¯GISã®æ¡åŒµå­ãå¿
+èŠãšãªãã  
+
+GISExtractor.place_list:ãã¬ãŒã¹ã¡ã³ããæœåºããéããã­ã¥ã¡ã³ãã®æåã«ãã¬ãŒã¹ããŒã ã®ãªã¹ããå«ãŸãããã°ãªãŒã³ã¹ããŒã³ãžã¯GISã®æ¡åŒµå­ãå¿
+èŠãšãªãã  
+
+HBPlugin.desc:HTMLã®æ¬ã®ãã£ã¬ã¯ããªãŒãåŠçãããã©ã°ã€ã³ã§ããããã®ãã©ã°ã€ã³ã¯ãã¥ãŒãããã£ã»ããã­ãã¡ã³ãã»ã©ã€ãã©ãªãŒã»ã³ã¬ã¯ã·ã§ã³ã«ãã£ãŠäœ¿çšãããASCIIãæ¡åŒµASCIIä»¥å€ã®å
+¥åãšã³ã³ãŒããæ±ããªãããã®ã³ãŒãã¯æç¢ºã§ã¯ãªãçããªãé«éã«åäœããããšãã§ãããã®ç¶æ
+ã«ããŠããããšã§ ;-)\n\nã®ä»£ããã«BookPlugin ãæŽ»çšããããšããå§ãããããæ°èŠã³ã¬ã¯ã·ã§ã³ãåœ¢æããå ŽåBookPluginãäœ¿çšããŠãã¥ãŒãããã£ã»ã©ã€ãã©ãªãŒã»ã³ã¬ã¯ã·ã§ã³ã®ãããªãã¡ã€ã«ãããŒã¯ã»ã¢ãããããBookPluginã¯ããããå
+¥åãšã³ã³ãŒãã€ã³ã°ãåãå
+¥ãããããŒã¯ã»ã¢ããããããã¡ã€ã«ã¯ãã¥ãŒãããã£ã»ã©ã€ãã©ãªãŒã»ã³ã¬ã¯ã·ã§ã³ã«ãã£ãŠäœ¿çšããããã£ã«ããæç¢ºã§ããããšãæåŸ
+ãããã  
+
+HBPlugin.encoding.iso_8859_1:ã©ãã³ïŒïŒè¥¿æŽèšèªïŒ  
+
+HTMLImagePlugin.aggressiveness:äœ¿çšããé¢é£ãã­ã¹ãæœåºæè¡ã®ç¯å²ã  
+HTMLImagePlugin.aggressiveness.1:ãã¡ã€ã«åããã¹ãä»£ããã®ãã­ã¹ãïŒALT ã¯ img HTMLã¿ã°ã«å±ããïŒã®ã¿ã  
+HTMLImagePlugin.aggressiveness.2:ïŒã®å
+šãŠããã©ã¹å©çšå¯èœãªã­ã£ãã·ã§ã³ã  
+HTMLImagePlugin.aggressiveness.3:ïŒã®å
+šãŠããã©ã¹å©çšå¯èœãªãã©ã°ã©ãã  
+HTMLImagePlugin.aggressiveness.4:ïŒã®å
+šãŠããã©ã¹å©çšå¯èœãªä»¥åã®ããããŒã  
+HTMLImagePlugin.aggressiveness.5:4ã®å
+šãŠããã©ã¹å©çšå¯èœãªãã­ã¹ãã»ã¬ãã¡ã¬ã³ã¹ã  
+HTMLImagePlugin.aggressiveness.6:4ã®å
+šãŠããã©ã¹ HTMLããŒãžïŒã¿ã€ãã«ãã­ãŒã¯ãŒããªã©ïŒã®ã¡ã¿ããŒã¿ã»ã¿ã°ã  
+HTMLImagePlugin.aggressiveness.7:çµåããã6ã5ãšïŒã®å
+šãŠã  
+HTMLImagePlugin.aggressiveness.8:7ã®å
+šãŠããã©ã¹ãã¡ã€ã«åããã¹ãä»£æ¿ãã­ã¹ããã­ã£ãã·ã§ã³ïŒããé©åãªçµæã®æé ã©ã³ã­ã³ã°ïŒã  
+HTMLImagePlugin.aggressiveness.9:1ã®ãã¹ãŠããã©ã¹ãœãŒã¹ã»ããŒãžã®ãã«ãã­ã¹ãã  
+
+HTMLImagePlugin.caption_length:ã­ã£ãã·ã§ã³ïŒæå­ã§ïŒã®æé·ã  
+
+HTMLImagePlugin.convert_params:ãµã ãã€ã«ã®çæã«é¢ãã ImageMagicKã®å€æã®è¿œå ãã©ã¡ãŒã¿ãŒãããšãã°ã'-raise'ã¯ãµã ãã€ã«ã®ç»åã«3æ¬¡å
+å¹æãäžããã  
+
+HTMLImagePlugin.desc:ãŠãšãããŒãžã®ç»åãšé¢é£ãã­ã¹ããæœåºãããã©ã°ã€ã³ã  
+
+HTMLImagePlugin.document_text:ãã­ã¥ã¡ã³ã:ãã­ã¹ããšããŠç»åãã­ã¹ããè¿œå ããïŒãããªããã°IndexedText ã¡ã¿ããŒã¿ã»ãã€ãŒã«ãïŒã  
+
+HTMLImagePlugin.index_pages:ç»åã«æ²¿ã£ãããŒãžãã€ã³ããã¯ã¹ããããããªããã°ãœãŒã¹URLã®ããŒãžãåç
+§ããã  
+
+HTMLImagePlugin.max_near_text:æœåºããç»åã«è¿ãæå€§ã®æå­ã  
+
+HTMLImagePlugin.min_height:ãã¯ã»ã«ãããããç­ãç»åã¯ã¹ã­ããããã  
+
+HTMLImagePlugin.min_near_text:æœåºãããã­ã¹ããã­ã£ãã·ã§ã³ã®æå°ã®æå­ã  
+
+HTMLImagePlugin.min_size:ãã€ããããããå°ããç»åãã¹ã­ããããã  
+
+HTMLImagePlugin.min_width:ãã¯ã»ã«ãããããç­ãç»åãã¹ã­ããããã  
+
+HTMLImagePlugin.neartext_length:ïŒæå­ã§ïŒãã€ãŒãã­ã¹ãã®ç®æšã®é·ãã  
+
+HTMLImagePlugin.no_cache_images:ïŒå
+ã®URLãç€ºãïŒç»åãã­ã£ãã·ã¥ããªãã§äžããã  
+
+HTMLImagePlugin.smallpage_threshold:ããïŒãã€ãïŒããå°ããããŒãžã®ç»åã¯ããŒãžïŒã¿ã€ãã«ãã­ãŒã¯ãŒããªã©ïŒã®ã¡ã¿ããŒã¿ãè¿œå ãããã  
+
+HTMLImagePlugin.textrefs_threshold:ãã­ã¹ãã®åç
+§ã®ããã®ç³žå£ãäœãå€ã¯ã¢ã«ãŽãªãºã ãå³æ Œã§ãªãããšãç€ºãã  
+
+HTMLImagePlugin.thumb_size:æå€§ã®ãµã ãã€ã«ã»ãµã€ãºãåºããšé«ãã  
+
+HTMLPlugin.assoc_files:htmlãã­ã¥ã¡ã³ããšé¢é£ã¥ããããã®ãã¡ã€ã«æ¡åŒµå­ã®Perl æ­£èŠè¡šçŸã  
+
+HTMLPlugin.desc:ãã®ãã©ã°ã€ã³ã¯HTMLãã¡ã€ã«ãåŠçããã  
+
+HTMLPlugin.description_tags:<Section>ã¿ã°ãçãããµãã»ã»ã¯ã·ã§ã³ã«ãã­ã¥ã¡ã³ããåå²ããã ãã®ãªãã·ã§ã³ãã»ãããããå Žå '-keep_head'ã¯å¹åããªãã  
+
+HTMLPlugin.extract_style:HTML <head> ã¿ã°ããã¹ã¿ã€ã«ãšã¹ã¯ãªããã®æ
+å ±ãæœåºããã­ã¥ã¡ã³ãã»ããããŒã»ã¡ã¿ããŒã¿ãšããŠä¿å­ãããããã¯ãã­ã¥ã¡ã³ãã»ããŒãžã«_document:documentheader_ macroãšããŠã»ãããããã  
+
+HTMLPlugin.file_is_url:ããå
+¥åãã¡ã€ã«åãå
+ã®ãœãŒã¹ã»ãã­ã¥ã¡ã³ãã®urlãæ§æããŠãããããªãã¡ãŠãšãã»ãã©ãŒãªã³ã°ã»ããŒã«ãã€ã³ããŒãã»ãã£ã¬ã¯ããªãŒæ§é ãçæããã®ã«äœ¿çšãããçã«ã«ã»ãããããã  
+
+HTMLPlugin.hunt_creator_metadata:ã¯ãªãšãŒã¿ãŒã®ãã€ãŒã«ãã®èè
+ãšå Žæã®ã¡ã¿ããŒã¿ãã§ããã ãçºèŠããã  
+
+HTMLPlugin.keep_head:htmlãã¡ã€ã«ããããããŒãåé€ããªãã§äžããã  
+
+HTMLPlugin.metadata_fields:æœåºãè©Šã¿ãããã®ã¡ã¿ããŒã¿ãã£ãŒã«ãã®ã«ã³ãã§åºåããããªã¹ããã°ãªãŒã³ã¹ããŒã³ã§å€§æå­åãããã¡ã¿ããŒã¿ãå¿
+èŠã§ããããããå€§æå­åããŠäžããããªããªãã¿ã€ãã«ãæ¥ä»ãªã©ã®ã¿ã°ã®æœåºã¯å€§æå­ãšå°æå­ãåºå¥ããªãã®ã§ã<tagname>ãšããã¡ã¿ããŒã¿ã»ãšã¬ã¡ã³ããããšãã°ã¿ã€ãã«ãæ¥ä»ãèè
+ããã¯ãªãšãŒã¿ãŒãã«ããæåã®<tag>ãã¢ã®ã³ã³ãã³ããæã€'tag<tagname>'ã äœ¿çšããã  
+
+HTMLPlugin.metadata_field_separator:ãã«ãããªã¥ãŒã¡ã¿ããŒã¿ã«äœ¿çšãããã»ãã¬ãŒã¿ãŒæå­ããã®æå­ã®ã¡ã¿ããŒã¿ã»ãã€ãŒã«ããåå²ããåå¥ã®ã¡ã¿ããŒã¿ãšããŠåã¢ã€ãã ãè¿œå ããã  
+
+HTMLPlugin.no_metadata:ãã¡ã€ã«ããã¡ã¿ããŒã¿ãæœåºããããšããªãã§äžããã  
+
+HTMLPlugin.no_strip_metadata_html:ã«ã³ãã§åºåãããã¡ã¿ããŒã¿åãªã¹ããããªãã¡ 'all'ã-description_tagsã§äœ¿çšãããç¹å®ã®ã¡ã¿ããŒã¿ã®å€ãã HTMLã¿ã°ãåé¢ããã®ãé²æ­¢ããã  
+
+HTMLPlugin.nolinks:ãã©ãããªã³ã¯ïŒãã®ãã©ã°ãç«ãŠããšæ§ç¯/ã€ã³ãããã®ã¹ããŒããæ¹åãããŸããããã­ã¥ã¡ã³ãå
+ã®é¢é£ãªã³ã¯ã¯ç Žå£ãããŸãïŒããããšããªãã§äžããã  
+
+HTMLPlugin.no_image_links:ç»åãèŠãã®ãèš±å¯ããããã«ãã€ã¡ãŒãžã»ãªã³ã¯ããã©ãããªã³ã¯ããããšããªãã§ãã ããã  
+
+HTMLPlugin.rename_assoc_files:ãã­ã¥ã¡ã³ãïŒç»åãªã©ïŒã«é¢é£ãããã¡ã€ã«ããªããŒã ããããŸãã¯å€ãã®ãã£ã¬ã¯ããªãŒæ§é ãçæããïŒcd-romãäœ¿çšãã  
+
+HTMLPlugin.sectionalise_using_h_tags:èªåçã« h1, h2, ... hXã¿ã°ãäœ¿çšããŠåå²ããããã­ã¥ã¡ã³ããçæããã  
+
+HTMLPlugin.title_sub:ã¿ã€ãã«ãšããŠä¿å­ãããã¹ããªã³ã°ãå€æŽããããã®ä»£æ¿ãšã¯ã¹ãã¬ãã·ã§ã³ãããšãã°ããïŒããŒãžããªã©ããã¡ã€ã«ãšããŠäœ¿çšããããã­ã¹ãããåé€ããããã«PDFPluginã§äœ¿çšãããã  
+
+HTMLPlugin.tidy_html:ããã»ããããããšããŠãŒã¶ãŒã«æ¬ã®ãã©ãŒãããã§ãã­ã¥ã¡ã³ããèŠãããšãã§ããããã«HTMLãã­ã¥ã¡ã³ããããæ§æãããXHTMLã«å€æããã  
+
+HTMLPlugin.old_style_HDL:ãã®ã³ã¬ã¯ã·ã§ã³ã®ãã¡ã€ã«ãå€ãHDLãã­ã¥ã¡ã³ãã»ã¿ã°ã®ã¹ã¿ã€ã«ãäœ¿çšãããã©ãããããŒã¯ããŠãã ããã  
+
+BaseMediaConverter.enable_cache:èªåçã«çæããããã¡ã€ã«(thumbnailsãscreen-size imagesãªã©) ãååŸ©ããªããŠãããããã«ã­ã£ãã·ã¥ããã  
+
+ImageConverter.converttotype:ã¡ã€ã³ç»åã 's'ãã©ãŒãããã«å€æããã  
+
+ImageConverter.create_screenview:çã«ã»ãããããšãã¹ã¯ãªãŒã³ãµã€ãºã®ç»åãçæããScreen, ScreenType, screenicon, ScreenWidth, ScreenHeightã®ã¡ã¿ããŒã¿ãã»ããããã  
+
+ImageConverter.create_thumbnail:çã«ã»ãããããšãåç»åã®ãµã ãã€ã«çãäœæããThumb, ThumbType, thumbicon, ThumbWidth, ThumbHeight ã¡ã¿ããŒã¿ãè¿œå ããã  
+ImageConverter.desc:ImageMagickãäœ¿çšããŠç»åå€æãããHelper plugin ã  
+
+ImageConverter.imagemagicknotinstalled:Image Magickãã€ã³ã¹ããŒã«ãããŠããªãã  
+
+ImageConverter.minimumsize:nãã€ãããå°ããç»åãç¡èŠããŠäžããã  
+
+ImageConverter.noconversionavailable:ç»åå€æãå©çšã§ããªãã  
+
+ImageConverter.noscaleup:ãµã ãã€ã«äœæã®éã«å°ããç»åãã¹ã±ãŒã«ã¢ããããªãã§äžããã  
+
+ImageConverter.screenviewsize:nxnãµã€ãºã®ç»åã®ã¹ã¯ãªãŒã³ãã¥ãŒãäœæããã  
+
+ImageConverter.screenviewtype:'s'ãã©ãŒãããã§ã¹ã¯ãªãŒã³ãã¥ãŒç»åãäœæããã  
+
+ImageConverter.thumbnailsize:nxnãµã€ãºã®ãµã ãã€ã«ãäœæããã  
+
+ImageConverter.thumbnailtype:s'ãã©ãŒãããã§ãµã ãã€ã«ãäœæããã  
+
+ImageConverter.win95notsupported:Image Magick ã¯ãŠã€ã³ããŠãº95/98ã§ãµããŒããããŠããªãã  
+
+ImagePlugin.desc:ãã®ãã©ã°ã€ã³ã¯ç»åãåŠçããåºæ¬çã¡ã¿ããŒã¿ãè¿œå ããã  
+
+IndexPlugin.desc:ãã®åž°çŽçãã©ã°ã€ã³ã¯index.txt ãã¡ã€ã«ãåŠçããŸããindex.txt ãã¡ã€ã«ã¯åãã¡ã€ã«ã«é¢é£ããç¹å¥ãªã¡ã¿ããŒã¿ã«ãã£ãŠã³ã¬ã¯ã·ã§ã³ã«å«ãŸãããã¡ã€ã«ã®ãªã¹ããå«ãŸãªããã°ãªããªãã\n\nThe index.txtãã¡ã€ã«ã¯ä»¥äžã®ããã«ãã©ãŒããããããªããã°ãªããªãïŒæåã®è¡ã¯ãkey: Subject Organization Dateããªã©ã®ã¡ã¿ããŒã¿ã»ãã€ãŒã«ãã«ååãä»ããã­ãŒïŒkey:ã§å§ãŸãïŒã§ãªããã°ãªããªãã ä»¥äžã®è¡ã¯ã¡ã¿ããŒã¿ã®ãšã³ããªãŒãã»ãããããå€ã«ãã£ãŠãã©ã­ãŒããããã¡ã€ã«åïŒããšãã°äžè¿°ã®ã­ãŒãäœ¿çšããããªãã°'irma/iw097e 3.2 unesco 1993' ã¯ãã¡ã€ã«å
+ã®Subject=3.2, Organization=unesco, and Date=1993ã¡ã¿ããŒã¿ãé¢é£ã¥ããã\n\nããã¡ã¿ããŒã¿ã»ãã€ãŒã«ãã®ããã€ããHierarchy classifier pluginãäœ¿çšãããšããããã»ãããããã©ã°ã€ã³ã¯é©åãªã³ã¬ã¯ã·ã§ã³å
+ã®æåã®ãã€ãŒã«ãïŒãã¹ã¯ãªãã¿ãŒïŒ ã«å¯Ÿå¿ããªããã°ãªããªãã.\n\nã¡ã¿ããŒã¿å€ã¯(<Subject>3.2ãªã©)ã®ã¿ã°ãäœ¿çšããŠåå¥ã«ååãã€ãããã­ã°ãªããªãããããŠããã¯ã­ãŒåã«ãã£ãŠäžãããããããªããã¡ã€ã«åã§ãäžæžããããã­ãŒè¡ããªããã°ååãä»äžãããŠããªãã¡ã¿ããŒã¿å€ã¯ 'Subject'ãšåä»ããããã  
+
+ISISPlugin.desc:ãã®ãã©ã°ã€ã³ã¯CDS/ISISããŒã¿ããŒã¹ãåŠçããŸããåCDS/ISISããŒã¿ã¹ãŒã¹ãåŠçãããæãïŒã€ã®ãã¡ã€ã«ãã³ã¬ã¯ã·ã§ã³ã®ã€ã³ããŒãã»ãã©ã«ããŒã«ãªããã°ãªããªãïŒthe Master file (.mst), the Field Definition Table (.fdt), and the Cross-Reference File (.xrf)ã  
+
+ISISPlugin.subfield_separator:ãã®ã¹ããªã³ã°ã¯CDS/ISISã®ããŒã¿ããŒã¹ã®ã¬ã³ãŒãã®ãµããã£ãŒã«ããåé¢ããã®ã«äœ¿çšãããŸãã  
+
+ISISPlugin.entry_separator:ãã®ã¹ããªã³ã°ã¯CDS/ISISã®ããŒã¿ããŒã¹ã®ã¬ã³ãŒãã®åäžã®ã¡ã¿ããŒã¿ã®ãã€ãŒã«ãã®å€ãã®å€ãåé¢ããã®ã«äœ¿çšãããŸãã  
+
+KeyphraseExtractor.desc:ãã­ã¹ãããã­ãŒãã¬ãŒãºãçæããHelper extractor pluginãKeaã­ãŒã¯ãŒãæœåºã·ã¹ãã ãäœ¿çšããã  
+
+KeyphraseExtractor.extract_keyphrases:Keaã§èªåçã«ã­ãŒãã¬ãŒãºãæœåºããïŒããã©ã«ãã®èš­å®ïŒã   
+
+KeyphraseExtractor.extract_keyphrases_kea4:Kea 4.0 ïŒããã©ã«ãã®èš­å®ïŒã§èªåçã«ã­ãŒãã¬ãŒãºãæœåºãããKea 4.0 ã¯èŸ²æ¥­ã®ãã¡ã€ã³ã®ãã­ã¥ã¡ã³ãã®å¶åŸ¡ãããã€ã³ãã­ã·ã³ã°ã®ããã«éçºãããKeaã®æ°èŠããŒãžã§ã³ã§ããã  
+
+KeyphraseExtractor.extract_keyphrase_options:Keaã§ã­ãŒãã¬ãŒãºæœåºããããªãã·ã§ã³ãããšãã°ïŒmALIWEB - use ALIWEB extraction model; n5 - extract 5 keyphrase;, eGBK - use GBK encodingã  
+
+KeyphraseExtractor.keyphrases:ã­ãŒãã¬ãŒãº  
+
+KeyphraseExtractor.missing_kea:ãšã©ãŒ: KeaãœãããŠãšã¢ ã%sã§èŠã€ãããŸããã Kea %sãhttp://www.nzdl.org/KeaããããŠã³ã­ãŒãããŠãã®ãã£ã¬ã¯ããªãŒã«ã€ã³ã¹ããŒã«ããŠãã ããã  
+
+LaTeXPlugin.desc:LaTeXãã­ã¥ã¡ã³ãçšã®ãã©ã°ã€ã³ã  
+
+LOMPlugin.desc:LOM (Learning Object Metadata) ãã¡ã€ã«ãã€ã³ããŒããããã©ã°ã€ã³ã  
+
+LOMPlugin.root_tag:XMLãã¡ã€ã«ã®DocType ïŒãŸãã¯ã«ãŒãã»ãšã¬ã¡ã³ãã«äžèŽããæ­£èŠè¡šçŸïŒã  
+
+LOMPlugin.check_timestamp:ä»¥åã«ããŠã³ã­ãŒãããããã¡ã€ã«ã®ã¿ã€ã ã¹ã¿ã³ãããã§ãã¯ããŠããœãŒã¹ãæ°ããå ŽååããŠã³ã­ãŒãã ãããŠäžããã  
+
+LOMPlugin.download_srcdocs:ãœãŒã¹ã»ãã­ã¥ã¡ã³ããç¹å®ãããŠããå ŽåããŠã³ã­ãŒãããïŒäžè¬çã«^identifier^entryãtechnical^locationã«ããïŒããã®ãªãã·ã§ã³ã¯ãã¡ã€ã«åãããŠã³ã­ãŒãã®åãšäžèŽãããããã«æ­£èŠè¡šçŸãç¹å®ããªããã°ãªããªããããã¯çŸåšãã¡ã€ã€ãŠãªãŒã«å€ã®ãã­ã¥ã¡ã³ãã«ã¯äœ¿çšã§ããªãããšã«æ³šæããŠãã ããã   
+
+MARCPlugin.desc:Basic MARC pluginã  
+
+MARCPlugin.metadata_mapping:MARCå€ããã°ãªãŒã³ã¹ããŒã³ã®ã¡ã¿ããŒã¿åãžã®ãããã³ã°ã®è©³çŽ°ãå«ããã¡ã€ã«åãããã©ã«ãã§ã¯ 'marc2dc.txt' ããµã€ãã® etcãã£ã¬ã¯ããªãŒã«èŠãã ããã  
+
+MARCXMLPlugin.desc:MARCXML pluginã  
+
+MARCXMLPlugin.metadata_mapping_file:MARCå€ããã°ãªãŒã³ã¹ããŒã³ã®ã¡ã¿ããŒã¿åãžã®ãããã³ã°ã®è©³çŽ°ãå«ããã¡ã€ã«åãããã©ã«ãã§ã¯ 'marc2dc.txt' ããµã€ãã® etcãã£ã¬ã¯ããªãŒã«èŠãã ããã  
+
+MediainfoOGVPlugin.desc:OGVã®åç»ãã¡ã€ã«ãã€ã³ããŒããããã©ã°ã€ã³ãMediainfo (mediainfo.sourceforge.net) ãã¡ã¿ããŒã¿ãæœåºããããã«ã€ã³ã¹ããŒã«ãããã  
+
+MediainfoOGVPlugin.assoc_field:åç»ãã¡ã€ã«åãæã€ã¡ã¿ããŒã¿ã»ãã£ãŒã«ãåã  
+
+MediaWikiPlugin.desc:MediaWikiãŠãšãããŒãžãã€ã³ããŒããããã©ã°ã€ã³  
+
+MediaWikiPlugin.show_toc:ã³ã¬ã¯ã·ã§ã³ã®About pageã«MediaWikiãŠãšããµã€ãã®ã¡ã€ã³ããŒãžã® 'table of contents'ãè¿œå ããã'table of contents'ã»ã¯ã·ã§ã³ãšäžèŽããäžéšã®toc_expã® Perlæ­£èŠè¡šçŸãç¹å®ããå¿
+èŠãããã  
+
+MediaWikiPlugin.delete_toc:åHTMLããŒãžã®'table of contents' ã»ã¯ã·ã§ã³ãåé€ããã 'table of contents'ã»ã¯ã·ã§ã³ã«äžèŽããäžéšã®toc_expã® Perlæ­£èŠè¡šçŸãç¹å®ããå¿
+èŠãããã  
+
+MediaWikiPlugin.toc_exp:table of contents'ã»ã¯ã·ã§ã³ãšäžèŽããPerlã®æ­£èŠè¡šçŸãããã©ã«ãã®å€ã¯å
+±éã®MediaWikiãŠãšãããŒãžã«äžèŽããã  
+
+MediaWikiPlugin.delete_nav:ããã²ãŒã·ã§ã³ã®ã»ã¯ã·ã§ã³ãåé€ãããäžéšã®nav_div_expã® Perlæ­£èŠè¡šçŸãç¹å®ããå¿
+èŠãããã  
+
+MediaWikiPlugin.nav_div_exp:æ­£èŠè¡šçŸããã²ãŒã·ã§ã³ã»ã¯ã·ã§ã³ã«äžèŽããPerlã®æ­£èŠè¡šçŸãããã©ã«ãã®å€ã¯å
+±éã®MediaWikiãŠãšãããŒãžã«äžèŽããã  
+
+MediaWikiPlugin.delete_searchbox:searchboxã»ã¯ã·ã§ã³ãåé€ãããäžéšã®searchbox_div_exp belowã® Perlæ­£èŠè¡šçŸãç¹å®ããå¿
+èŠãããã  
+
+MediaWikiPlugin.searchbox_div_exp:searchbox ã»ã¯ã·ã§ã³ãšäžèŽããPerlã®æ­£èŠè¡šçŸãããã©ã«ãã®å€ã¯å
+±éã®MediaWikiãŠãšãããŒãžã«äžèŽããã  
+
+MediaWikiPlugin.remove_title_suffix_exp:æœåºãããã¿ã€ãã«ãããªã ããPerlã®æ­£èŠè¡šçŸãããšãã°ã\\s-(.+)ã¯"-"ã®åŸãã®ã¿ã€ãã«ã³ã³ãã³ããããªã ããã  
+
+MetadataCSVPlugin.desc:ã«ã³ãã§åºåãããå€ã®ãã©ãŒãããã§ã®ã¡ã¿ããŒã¿ã®ãã©ã°ã€ã³ãCSVãã¡ã€ã«ã®ãã¡ã€ã«åãã£ãŒã«ãã¯ã©ã®ãã­ã¥ã¡ã³ãã«ã¡ã¿ããŒã¿ãå±ããŠããããæ±ºå®ããã®ã«äœ¿çšãããã  
+
+MetadataPass.desc:import.plã®metadata_read passãæŽ»çšããã¡ã¿ããŒã¿ã»ãã©ã°ã€ã³ããµããŒãããBasePluginã®äœåãªããŒã¹ã»ã¯ã©ã¹ã  
+
+MetadataXMLPlugin.desc:ã¡ã¿ããŒã¿ã®xml ãã¡ã€ã«ãåŠçãããã©ã°ã€ã³ã  
+
+GreenstoneMETSPlugin.desc:ã°ãªãŒã³ã¹ããŒã³ã¹ã¿ã€ã«ã®METSãã­ã¥ã¡ã³ããåŠçãã  
+
+MP3Plugin.desc:MP3ãã¡ã€ã«ãåŠçãããã©ã°ã€ã³ã  
+
+MP3Plugin.assoc_images:Google image searchã ID3 TitleãšArtist metadataã«ããšã¥ãMP3ãã¡ã€ã«ã«é¢é£ããç»åãç¢ºèªããã®ã«äœ¿çšããã  
+
+MP3Plugin.applet_metadata:ãã¡ã€ã«ãäœ¿çšããããã®MP3 audio player  appletçšã®å¿
+èŠãªHTMLãå«ãåãã­ã¥ã¡ã³ãã®[applet]ã¡ã¿ããŒã¿ãä¿å­ããã®ã«äœ¿çšããã  
+
+MP3Plugin.metadata_fields:MP3ãã¡ã€ã«ããæœåºããïŒçŸåšãä»®å®ïŒããããã®ã¡ã¿ããŒã¿ã»ãã£ãŒã«ãã®ã«ã³ãã§åºåããããªã¹ãã\"*\"ãå
+šãã£ãŒã«ããæœåºããã®ã«äœ¿çšããã  
+
+NulPlugin.desc:ãããŒ(.nul)ãã¡ã€ã«ãã©ã°ã€ã³ãå±éããŠããã¡ã¿ããŒã¿ã»ããŒã¿ããŒã¹ã»ãã¡ã€ã«ã«ãã£ãŠè£œäœããããã¡ã€ã«ã«äœ¿çšãããã  
+
+NulPlugin.assoc_field:ånulãã¡ã€ã«ã«èš­å®ãããã¡ã¿ããŒã¿ãã£ãŒã«ãåã  
+NulPlugin.add_metadata_as_text:ããã®ãã­ã¥ã¡ã³ãã«ã¯ãã¯ã¹ãããªãããã­ã¥ã¡ã³ãã®ãã­ã¹ããšããŠã¡ã¿ããŒã¿ã®ããŒãã«ãè¿œå ããã  
+
+NulPlugin.remove_namespace_for_text:ãã­ã¥ã¡ã³ãã»ãã­ã¹ã(if add_metadata_as_text is set)ã®ã¡ã¿ããŒã¿åã®ããŒã ã¹ããŒã¹ãåé€ããã  
+
+OAIPlugin.desc:Basic Open Archives Initiative (OAI) pluginã  
+
+OAIPlugin.document_field:ã¡ã¿ããŒã¿ã«ä»äžããããã®ãã­ã¥ã¡ã³ãã®ãã¡ã€ã«åãç¹å®ããã¡ã¿ããŒã¿ã»ãšã¬ã¡ã³ãã  
+
+OAIPlugin.metadata_set:å
+šã¡ã¿ããŒã¿ãã€ã³ããŒãããã¡ã¿ããŒã¿ã»ã»ãã(namespace prefix)  
+OAIPlugin.metadata_set.auto:OAI ã¬ã³ãŒãã§ç¹å®ããããã¬ãã£ãã¯ã¹ãäœ¿çšãã  
+OAIPlugin.metadata_set.dc:dcãã¬ãã£ãã¯ã¹ãäœ¿çšãããéå®ãããdcãšã¬ã¡ã³ããã°ãªãŒã³ã¹ããŒã³ã®ãã©ãŒã ã«ãããã³ã°ãããããšãã°spatial ã¯dc.Coverage^spatialã«ãªãã  
+
+OAIMetadataXMLPlugin.desc:metadata.xml ãã¡ã€ã«ãåŠçããMetadataXMLPluginãããã«å ãã"dc.Identifier"ãã€ãŒã«ããäœ¿çšããŠç¹å®ããã OAI ãµãŒããŒ (-oai_server_http_path)ããOAIã¡ã¿ããŒã¿ãæœåºããã  
+
+OAIMetadataXMLPlugin.oai_server_http_path:OAI ãµãŒããŒãžã®HTTPãã¹ -ãããšãã° http://test.com/oai_server/oai.pl  
+
+OAIMetadataXMLPlugin.metadata_prefix:OAIã¡ã¿ããŒã¿ã»ãã¬ãã£ãã¯ã¹- default oai_dc  
+
+OAIMetadataXMLPlugin.koha_mode:ããç¹å®ãããã°ããã©ã°ã€ã³ã¯oaiextracted.koharecordlinkã¡ã¿ããŒã¿ãçæããããšããããã®ã¡ã¿ããŒã¿ã¯ Kohaãã­ã¥ã¡ã³ãã«æ»ããªã³ã¯ãå«ãã  
+
+OggVorbisPlugin.add_technical_metadata:ãã¯ãã«ã«ïŒãããã¬ãŒããªã©ïŒã¡ã¿ããŒã¿ãè¿œå ããã  
+
+OggVorbisPlugin.desc:Ogg Vorbisã®ãªãŒãã£ãªã»ãã¡ã€ã«ãã€ã³ããŒããããã©ã°ã€ã³ã  
+
+OpenDocumentPlugin.desc:OASIS OpenDocument ãã©ãŒãããã®ãã­ã¥ã¡ã³ã (OpenOffice 2.0ã«ãã£ãŠäœ¿çšããã)ã®ãã©ã°ã€ã³ã  
+
+PagedImagePlugin.desc:åç»åãžã®ãªãã·ã§ã³ã®OCR ãã­ã¹ããä»å±ããŠããäžé£ã®ç»åããæãç«ã£ãŠãããã­ã¥ã¡ã³ãã®ãã©ã°ã€ã³ããã®ãã©ã°ã€ã³ã¯äžé£ã®ç»åãšãã­ã¹ããã¡ã€ã«ããªã¹ãã¢ãããã.itemãã¡ã€ã«ãåŠçããã  
+
+PagedImagePlugin.documenttype:ãã­ã¥ã¡ã³ãã®åœ¢åŒãèš­å®ããïŒè¡šç€ºã«äœ¿çšããïŒ  
+
+PagedImagePlugin.documenttype.paged:é ä»ãããããã­ã¥ã¡ã³ãã¯æ¬¡ãšåã®ç¢å°ãš'go to page X'ã®ããã¯ã¹ããã  
+
+PagedImagePlugin.documenttype.hierarchy:éå±€çãã­ã¥ã¡ã³ãã«ã¯ a table of contentsããã  
+
+PagedImagePlugin.headerpage:ãããã¬ãã«ã®ããããŒããŒãžïŒç»åãå«ãŸãªãïŒãåãã­ã¥ã¡ã³ãã«è¿œå ããã  
+
+PDFPlugin.allowimagesonly:æœåºã§ããªããã­ã¹ãã€ãã®PDF filesãèš±å¯ãããè€éãªã»ããããã€å¿
+èŠãåé¿ãããconvert_to htmlã«é¢ããŠã®ã¿æå¹ã«ããã  
+
+PDFPlugin.complex:ããè€éãªã¢ãŠãããããçæããããã®ãªãã·ã§ã³ã§ã¯ã¢ãŠããããhtmlã®ã»ãã ã¯ãªãªãžãã«ã®PDF fileãã£ããã«èŠããããã®ããã«Ghostscriptãé©åã«æ©èœããã€ã³ã¹ããŒã«ãã( *nix gsããã¹ã«ãªããã°ãªããªãããŠã€ã³ããŠãºã§ã¯ãã¹ã«gswin32c.exeããªããã°ãªããªã)ã  
+
+PDFPlugin.desc:PDFãã­ã¥ã¡ã³ããåŠçãããã©ã°ã€ã³ã  
+
+PDFPlugin.nohidden:é ããããã­ã¹ããæœåºããããšããã®ãäºé²ããpdftohtmlãããã¯-complexãªãã·ã§ã³ãèš­å®ãããŠããå Žåã«ã®ã¿æå¹ã§ãã  
+
+PDFPlugin.noimages:PDFããç»åãæœåºããããšããªãã§äžããã  
+
+PDFPlugin.use_sections:PDFãã¡ã€ã«ã®åããŒãžã®å¥ã
+ã®ã»ã¯ã·ã§ã³ãçæããã  
+
+PDFPlugin.zoom:PDFãã¢ãŠããããã®ããã«æ¡å€§ãããã¡ã¯ã¿ãŒïŒ-complexãèš­å®ãããå Žåã®ã¿æå¹ïŒã  
+
+PostScriptPlugin.desc:ããã¯ãã­ã¹ãã»ã³ã³ããŒã¿ãŒãžã®\"poor man's\" psã§ããããæ°ã«ãªããªããhttp://www.nzdl.org/html/software.htmlã§ããŠã³ã­ãŒãã§ããPRESCRIPTããã±ãŒãžãäœ¿çšããããšãèããŠãã ããã  
+
+PostScriptPlugin.extract_date:PSããããŒã®æ¥ä»ãæœåºããã  
+
+PostScriptPlugin.extract_pages:PSããããŒããããŒãžãæœåºããã  
+
+PostScriptPlugin.extract_title:PSããããŒããã¿ã€ãã«ãæœåºããã  
+
+PowerPointPlugin.desc:Microsoft PowerPoint ãã¡ã€ã«ã®ã€ã³ããŒãçšãã©ã°ã€ã³ã  
+
+PowerPointPlugin.windows_scripting:MicroSoft Windows ã®ã¹ã¯ãªããæè¡ (ã¢ããªã±ãŒã·ã§ã³çšVisual Basic)ãäœ¿çšãã  
+
+PowerPointPlugin.convert_to.html_multi:äžé£ã®HTMLããŒãžãã¹ã©ã€ãããšã«ïŒã€ãïŒã€ã¯ã¹ã©ã€ãã®ç»åçšãïŒã€ã¯ã¹ã©ã€ãã®ãã­ã¹ãïŒ -openoffice_conversionãå¿
+èŠïŒã  
+
+PowerPointPlugin.convert_to.pagedimg:äžé£ã®JPEGç»åïŒ -openoffice_conversionãå¿
+èŠïŒã  
+
+PowerPointPlugin.convert_to.pagedimg_jpg:äžé£ã®JPEGãã©ãŒãããç»åïŒ -windows_scriptingãå¿
+èŠïŒã  
+
+PowerPointPlugin.convert_to.pagedimg_gif:äžé£ã®GIFãã©ãŒãããã®ç»å (-windows_scriptingãå¿
+èŠ)ã  
+
+PowerPointPlugin.convert_to.pagedimg_png:äžé£ã® PNGãã©ãŒãããç»åïŒ -windows_scriptingãå¿
+èŠïŒã  
+
+PrintInfo.bad_general_option:%sãã©ã°ã€ã³ã¯æ­£ãããªããªãã·ã§ã³ãäœ¿çšããŠããŸãã collect.cfgèš­å®ãã¡ã€ã«ããã§ãã¯ããŠãã ããã  
+
+PrintInfo.desc:Most base pluginã¯å°å·æ
+å ±ïŒpluginfo.plãäœ¿çšããïŒ  
+
+ProCitePlugin.desc:(ãšã¯ã¹ããŒããããïŒãã­ãµã€ãã»ããŒã¿ããŒã¹  
+
+ProCitePlugin.entry_separator:ProCite ããŒã¿ããŒã¹ã®ã¬ã³ãŒãå
+ã®ã¡ã¿ããŒã¿ã»ãã€ãŒã«ãã®å€ãã®å€ãåé¢ããããã«äœ¿çšãããã¹ããªã³ã°ã  
+
+ReadTextFile.could_not_extract_encoding:è­Šå: ãšã³ã³ãŒãã£ã³ã°ã¯%s - ãããªã«ãã¯%sããæœåºã§ããªã  
+
+ReadTextFile.could_not_extract_language:è­ŠåïŒèšèªã¯%s - ãããªã«ãã¯%sããæœåºã§ããªã  
+
+ReadTextFile.could_not_open_for_reading:èª­ã¿èŸŒã¿ã®ããã«%s ãéãããšãã§ããªã  
+
+ReadTextFile.default_encoding:ãã®ãšã³ã³ãŒãã€ã³ã°ããã -input_encodingã 'auto'ã«èš­å®ããããã­ã¹ãã»ã«ããŽã©ã€ãŒãŒã·ã§ã³ã»ã¢ã«ãŽãªãºã ããšã³ã³ãŒãã€ã³ã°ã®æœåºã«å€±æãããã°ãªãŒã³ã¹ããŒã³ã«ãã£ãŠãµããŒããããŠããªããšã³ã³ãŒãã€ã³ã°ãæœåºããå Žåã«ãã®ãšã³ã³ãŒãã€ã³ã°ãäœ¿çšããŸãã  
+
+ReadTextFile.default_language:ã°ãªãŒã³ã¹ããŒã³ããã­ã¥ã¡ã³ãã®èšèªã«äœæ¥­ããã®ã«å€±æãããšãèšèªãã¡ã¿ããŒã¿ã»ãšã¬ã¡ã³ãããã®å€ã«èš­å®ãããŸãããããªã«ãã§ã¯ (ISO 639ã®èšèªã·ã³ãã«ãäœ¿çšãããŸã: en = English)ã-input_encodingã'auto'ã«èš­å®ãããã-extract_languageãèš­å®ãããªããã°ããã¹ãŠã®ãã­ã¥ã¡ã³ãã¯èªåã®ãèšèªãã¡ã¿ããŒã¿ã»ããããã®å€ã«å¯ŸããŠæã¡ãŸãã  
+
+ReadTextFile.desc:ãã¬ã€ã³ã»ãã­ã¹ãã§ãããã¡ã€ã«ã®ããã®Base pluginã  
+
+ReadTextFile.empty_file:ãã­ã¹ããå«ãŸãªããã¡ã€ã«  
+
+ReadTextFile.extract_language:åãã­ã¥ã¡ã³ãã®èšèªãç¹å®ããèšèªãã¡ã¿ããŒã¿ãèš­å®ããã  
+
+ReadTextFile.file_has_no_text:ãšã©ãŒ:%s ã¯ãã­ã¹ããå«ãŸãªã  
+
+ReadTextFile.input_encoding:ãœãŒã¹ã»ãã­ã¥ã¡ã³ãã®ãšã³ã³ãŒãã€ã³ã°ããã­ã¥ã¡ã³ãã¯ãããã®ãšã³ã³ãŒãã€ã³ã°ããå€æãããutf8ãšããŠå
+éšã«ä¿å­ãããã  
+
+ReadTextFile.input_encoding.auto:ãã­ã¹ãã»ã«ããŽã©ã€ãŒãŒã·ã§ã³ã»ã¢ã«ãŽãªãºã ãèªåçã«åãœãŒã¹ã»ãã­ã¥ã¡ã³ãã®ãšã³ã³ãŒãã€ã³ã°ãè­å¥ããã®ã«äœ¿çšããã  
+
+ReadTextFile.read_denied:èš±å¯ã®èª­ã¿èŸŒã¿ã%sã«ã€ããŠåŠå®ããã  
+
+ReadTextFile.separate_cjk:åæå­ãåèªã«åããããã«äž­åœèª/æ¥æ¬èª/éåœèªã®æå­ã®éã«ã¹ããŒã¹ãæ¿å
+¥ããã if text is not segmentedãäœ¿çšããã  
+
+ReadTextFile.unsupported_encoding:è­ŠåïŒ%s ã¯ãµããŒããããŠããªããšã³ã³ãŒãã€ã³ã°(%s) - using %så
+éšã«ãšã³ã³ãŒããããŠããããã«èŠãã  
+
+ReadTextFile.wrong_encoding:è­ŠåïŒ%sã¯%sã®ãšã³ã³ãŒãã€ã³ã°ãäœ¿çšããŠèª­ã¿èŸŒãŸããã%sãšããŠãšã³ã³ãŒããããããã«èŠããã  
+
+ReadXMLFile.desc:XML plugins.ã®ããã®åºæ¬ã¯ã©ã¹ã  
+
+ReadXMLFile.xslt:äžèŽããã€ã³ããããã­ã¥ã¡ã³ããååãã€ãããã¡ã€ã«ã® XSLTã«å€æãããé¢é£ãããã¡ã€ã«åã¯ã³ã¬ã¯ã·ã§ã³ã®ãã¡ã€ã«ããŒã¿å
+ãããšãã°etc/mods2dc.xslã«ãããšä»®å®ãããã  
+
+RealMediaPlugin.desc:Real Mediaãã¡ã€ã«ãåŠçãããã©ã°ã€ã³ã  
+
+ReferPlugin.desc:ReferPluginã¯Referãã©ãŒãããå
+ã®ç®é²ãã¡ã€ã«ãèª­ã¿èŸŒãã  
+
+RogPlugin.desc:.rog or .mdbãã¡ã€ã«ã®simple single-level ãã­ã¥ã¡ã³ããçæããã  
+
+RTFPlugin.desc:Rich Textãã©ãŒããããã¡ã€ã«ãã€ã³ããŒããããã©ã°ã€ã³ã  
+
+SourceCodePlugin.desc:ãã¡ã€ã«ããŒã ãçŸåšã¿ã€ãã«ã«äœ¿çšãããŠããïŒãªãã·ã§ã³ã§ã¯ããã€ãã®ãã¬ãã£ãã¯ã¹ãæ¬ ããŠããïŒãCurrent languages:\ntext: READMEs/Makefiles\nC/C++   (currently extracts #include statements and C++ class decls)\nPerl    (currently only done as text)\nShell   (currently only done as text)ã  
+
+SourceCodePlugin.remove_prefix:ãã¡ã€ã«ããŒã (eg -remove_prefix /tmp/XX/src/)ããã®ãã®ãªãŒãã£ã³ã°ã»ãã¿ãŒã³ãåé€ããããããªã«ãã§ã¯ãã¡ã€ã«åããã®ãã¹ãŠã®ãã¹ãåé€ããã  
+
+SplitTextFile.desc:SplitTextFileã¯ã€ã³ãããã»ãã¡ã€ã«ãåå¥ã«åŠçãããã»ã°ã¡ã³ãã«åå²ãããã©ã°ã€ã³ã§ããããã®ãã©ã°ã€ã³ã¯çŽæ¥ã«åŒã³åºãããªããŠã¯ãªããªãããã®ä»£ããã«ãããã€ãã®ãã­ã¥ã¡ã³ããå«ãã€ã³ãããã»ãã¡ã€ã«ãåŠçããªããã°ãªããªããªããããããã­ã¥ã¡ã³ãã®ã²ãšã€ãåŠçããåŠçæ©èœã®ãããã©ã°ã€ã³ãæžãèŸŒãã§SplitTextFileããåãç¶ããªããã°ãªããªããäŸãšããŠReferPluginãåç
+§ããŠãã ããã  
+
+SplitTextFile.split_exp:ã€ã³ãããã»ãã¡ã€ã«ãã»ã°ã¡ã³ãã«åå²ããperlã®æ­£èŠè¡šçŸã  
+
+StructuredHTMLPlugin.desc:æ§æãããHTMLãã­ã¥ã¡ã³ããåŠçããã¹ã¿ã€ã«ã®æ
+å ±ã«ããšã¥ããŠã»ã¯ã·ã§ã³ã«åå²ãããã©ã°ã€ã³ã  
+
+StructuredHTMLPlugin.delete_toc:å€æãããHTMLãã¡ã€ã«ããç®æ¬¡ãå³åœ¢ãªã¹ããªã©ãåé€ããããããã®ã¹ã¿ã€ã«ã¯ toc_header optionã«ãã£ãŠç¹å®ãããã  
+
+StructuredHTMLPlugin.title_header:ã¿ã€ãã«ããããŒã®å¯èœãªãŠãŒã¶ãŒå®çŸ©ã¹ã¿ã€ã«ã  
+
+StructuredHTMLPlugin.level1_header:HTML document (equivalent to <h1>)å
+ã® level1 ããããŒã®å¯èœãªãŠãŒã¶ãŒå®çŸ©ã¹ã¿ã€ã«ã  
+
+StructuredHTMLPlugin.level2_header:HTML document(equivalent to <h2>)å
+ã® level2 ããããŒã®å¯èœãªãŠãŒã¶ãŒå®çŸ©ã¹ã¿ã€ã«ã  
+
+StructuredHTMLPlugin.level3_header:HTML document(equivalent to <h3>)å
+ã® level3 ããããŒã®å¯èœãªãŠãŒã¶ãŒå®çŸ©ã¹ã¿ã€ã«ã  
+
+StructuredHTMLPlugin.toc_header:ç®æ¬¡ãå³äžèŠ§ãªã©ã®å¯èœãªãŠãŒã¶ãŒå®çŸ©ã¹ã¿ã€ã«ãdelete_tocãèš­å®ãããã°åé€ãããã  
+
+TextPlugin.desc:åäžã® single-level ãã­ã¥ãŠã¡ã³ããçæããããã­ã¹ãïŒïŒïŒïŒæå­ãŸã§ïŒã®ç¬¬ïŒè¡ã®ã¿ã€ãã«ã»ã¡ã¿ããŒã¿ãè¿œå ããã  
+
+TextPlugin.title_sub:ã¿ã€ãã«ãšããŠä¿å­ãããã¹ããªã³ã°ãå€æŽããä»£æ¿è¡šçŸãããšãã°ãPostScriptPluginã§ã¿ã€ãã«ãšããŠäœ¿çšããããã­ã¹ããã"Page 1"ãåé€ããã®ã«äœ¿çšãããã  
+
+UnknownPlugin.assoc_field:é¢é£ãããã¡ã€ã«åãæã€ã¡ã¿ããŒã¿ãã€âã«ãå  
+
+UnknownPlugin.desc:ã°ãªãŒã³ã¹ããŒã³ãç¥ããªããã©ãŒãããã®ãã¡ã€ã«ãã€ã³ããŒãããããã®åçŽãªãã©ã°ã€ã³ãä»®ã®ãã­ã¥ã¡ã³ãã  
+
+UnknownPlugin.file_format:ãã¡ã€ã«ã®åœ¢åŒïŒããšãã°MPEG, MIDI, ...)  
+
+UnknownPlugin.mime_type:ãã¡ã€ã«ã®Mimeåœ¢åŒïŒããšãã° image/gif)ã  
+
+UnknownPlugin.process_extension:ãã¡ã€ã«ããã®ãã¡ã€ã«æ¡åŒµå­ã§åŠçããããã®ãªãã·ã§ã³ã¯ããç°¡åã«äœ¿çšã§ãããæè»æ§ããªãprocess_expã®ä»£ãããšãªãã  
+
+UnknownPlugin.srcicon:srcicon metadataãšããŠäœ¿çšããããã®ãã¯ã­åïŒäžç·ããªãïŒãç¹å®ããã  
+
+WordPlugin.desc:ãã€ã¯ã­ãœããã»ã¯ãŒãã®ãã­ã¥ã¡ã³ããã€ã³ããŒããããã©ã°ã€ã³  
+
+WordPlugin.windows_scripting:ãªãŒãã³ã»ãœãŒã¹ã»ããã±ãŒãžã§ãã WvWareã«é Œããããããã¯ãŒãã«ãã­ã¥ã¡ã³ããHTMLã«å€æããããã€ã¯ã­ãœããã»ã¯ãŒãã®ã¹ã¯ãªããã»ãã¯ãã­ãžãŒïŒVisual Basic for ApplicationsïŒãäœ¿çšãããã¯ãŒãã®ã¢ããªã±ãŒã·ã§ã³ã«ãããã§ã«èµ·åããŠããªããã°ã¹ã¯ãªãŒã³ãéãããã  
+
+WordPlugin.metadata_fields:ããã¯VB scriptingã«ãã£ãŠå€æãããHTML ãã­ã¥ã¡ã³ãã®ã¡ã¿ããŒã¿ãèšæ­£ãããã®ã§ãããŠãŒã¶ãŒã«æœåºããããšããã¡ã¿ãïŒã¿ã»ãã€âã«ãã®ã«ã³ãã§åºåããããªã¹ããå®çŸ©ããããšãã§ããŸãã 'tagname'ãšãã°ããã¡ã¿ããŒã¿ã»ãšã¬ã¡ã³ãã«æåã® <tagname> pairã®ã³ã³ãã³ããã€ã³ãããããã®ã«  'tag<tagname>' ãäœ¿çšããŠãã ããããããã°ãªãŒã³ã¹ããŒã³ã§å€§æå­åããã¡ã¿ããŒã¿ããæã¿ãªãå€§æå­ã«ããŠãã ãããã¿ã°ã®æœåºã¯ã±ãŒã¹ã»ã€ã³ã»ã³ãã€ãã§ãã  
+
+ZIPPlugin.desc:çŸåšåŠçäž­ã®ããªãŒããããšãã¡ã€ã«æ¡åŒµå­ã:\ngzip (.gz, .z, .tgz, .taz)\nbzip (.bz)\nbzip2 (.bz2)\nzip (.zip .jar)\ntar (.tar)\n\nã§ããå§çž®ããã¢ãŒã«ã€ããããã€ã³ãããã»ãã©ãŒããããåŠçãããã©ã°ã€ã³ããã®ãã©ã°ã€ã³ã¯ä»¥äžã®åç€ºããããŠãŒãã£ãªãã€ïŒããã³ã¬ã¹ãã³ãã€ã³ã°ã»ãã©ãŒããããåŠçããããšããã°):\ngunzip (for gzip)\nbunzip (for bzip)\nbunzip2 \nunzip (for zip)\ntar (for tar)ã«äŸå­ããã  
+
+#
+# Download module option descriptions
+#
+
+BaseDownload.desc:ã¢ãžã¥ãŒã«ã®ããŠã³ã­ãŒãã®ããã®åºåºã¯ã©ã¹  
+BaseDownload.bad_general_option:%s ããŠã³ã­ãŒãã»ã¢ãžã¥ãŒã«ãäžé©åãªãªãã·ã§ã³ãäœ¿çšããŠããã  
+MediaWikiDownload.desc:MediaWikiã®ãŠãšããµã€ãããããŠã³ã­ãŒãããã¢ãžã¥ãŒã«ã  
+MediaWikiDownload.reject_filetype:urlãªã¹ããç¡èŠãããã«ã³ãã§åºåããããããšãã°*cgi-bin*,*.pptã¯'cgi-bin' ãŸãã¯ '.ppt'ãå«ããã€ããŒãªã³ã¯ãç¡èŠããã  
+MediaWikiDownload.reject_filetype_disp:URL ã®ãã¿ãŒã³ãç¡èŠãã  
+MediaWikiDownload.exclude_directories:é€å€ããããã£ã¬ã¯ããªãŒã®ãªã¹ãïŒãã£ã¬ã¯ããªãŒãžã®çµ¶å¯Ÿãã¹ã§ãªããã°ãªããªãïŒãããšãã°/people,/documentationã¯çŸåšã¯ã­ãŒãªã³ã°ããŠãããµã€ãã® 'people' and 'documentation' ãµããã£ã¬ã¯ããªãŒãé€å€ããã  
+MediaWikiDownload.exclude_directories_disp:ãã€ã¬ã¯ããªãŒãé€å€ãã  
+
+OAIDownload.desc:OAIã¬ããžããªãŒããããŠã³ã­ãŒãããã¢ãžã¥ãŒã«  
+OAIDownload.url_disp:ãœãŒã¹ãURL  
+OAIDownload.url:OAI ã¬ããžããªãŒ URL  
+OAIDownload.set_disp:èš­å®ã®å¶é  
+OAIDownload.set:ã¬ããžããªãŒã®ç¹å®ãããã»ããã®ããŠã³ã­ãŒããå¶éãã  
+OAIDownload.metadata_prefix_disp:ã¡ã¿ããŒã¿ã»ãã¬ãã£ãã¯ã¹  
+OAIDownload.metadata_prefix:ãšã¯ã¹ããŒãããããã¡ã€ã«ã«äœ¿çšããã¡ã¿ããŒã¿ã»ãã©ãŒããããããšãã°oai_dc, qdcãªã©ãã©ã®ãã©ãŒãããããµããŒããããŠããããèŠåºãããã«<Server information>ã®ãã¿ã³ãæŒãã  
+OAIDownload.get_doc_disp:ãã­ã¥ã¡ã³ããç²åŸãã  
+OAIDownload.get_doc:ã¬ã³ãŒãå
+ã§ç¹å®ããããœãŒã¹ã»ãã­ã¥ã¡ã³ããããŠã³ã­ãŒããã  
+OAIDownload.get_doc_exts_disp:ãã¡ã€ã«åœ¢åŒã ããå«ã  
+OAIDownload.get_doc_exts:ç²åŸãããã­ã¥ã¡ã³ãã®èš±å®¹ã§ãããã¡ã€ã«åæ¡åŒµå­  
+OAIDownload.max_records_disp:æå€§ã¬ã³ãŒã  
+OAIDownload.max_records:ããŠã³ã­ãŒãããã¬ã³ãŒãã®æå€§æ°  
+
+SRWDownload.desc:SRW (Search/Retrieve Web Service) repositories)ã¬ããžããªãŒããããŠã³ã­ãŒãããã¢ãžã¥ãŒã«  
+
+WebDownload.desc:HTTP ã FTPçµç±ã§ã€ã³ã¿ãŒãããããããŠã³ã­ãŒãããã¢ãžã¥ãŒã«  
+WebDownload.url:ãœãŒã¹URLã Httpã®ãªãã€ã¬ã¯ãã®å Žåããã®å€ã¯å€åãããããããªã  
+WebDownload.url_disp:ãœãŒã¹URL  
+WebDownload.depth:ããŠã³ã­ãŒãã®éããã€ã®ãã€ããŒãªã³ã¯ãæ·±ããªãã  
+WebDownload.depth_disp:ããŠã³ã­ãŒãã®æ·±ã  
+WebDownload.below:ãã®URLã®äžã«ã¯mirror filesã ãããã  
+WebDownload.below_disp:ãã®URLã®äžã«ã¯ãã¡ã€ã«ã ãããã  
+WebDownload.within:åããµã€ãå
+ã®ãã©ãŒãã¡ã€ã«ã®ã¿  
+WebDownload.within_disp:ãµã€ãå
+ã®ãã¡ã€ã«ã®ã¿  
+WebDownload.html_only:HTMLãã¡ã€ã«ããã®ã¿ããŠã³ã­ãŒãããé¢é£ãã¡ã€ã«ããšãã°ç»åãšã¹ã¿ã€ã«ã·ãŒããç¡èŠãã  
+WebDownload.html_only_disp:HTMLãã¡ã€ã«ã®ã¿  
+
+WgetDownload.desc:wgetãžã®ã³ãŒã«ãåŠçããBase class  
+WgetDownload.proxy_on:Proxy on  
+WgetDownload.proxy_host:Proxy host   
+
+WgetDownload.user_name:ãŠãŒã¶ãŒå  
+WgetDownload.user_password:ãŠãŒã¶ãŒã»ãã¹ã¯ãŒã  
+
+Z3950Download.desc:Z3950ã¬ããžãããªãŒããããŠã³ã­ãŒãããã¢ãžã¥ãŒã«  
+Z3950Download.host:Host URL  
+Z3950Download.host_disp:Host  
+Z3950Download.port:ã¬ããžããªãŒã®ããŒãçªå·  
+Z3950Download.port_disp:ããŒã  
+Z3950Download.database:ã¬ã³ãŒããæ€çŽ¢ããããŒã¿ãŒããŒã¹  
+Z3950Download.database_disp:ããŒã¿ããŒã¹  
+Z3950Download.find:ç¹å®ã®æ€çŽ¢èªãå«ãã¬ã³ãŒããæ€çŽ¢ãã  
+Z3950Download.find_disp:èŠã€ãã  
+Z3950Download.max_records:ããŠã³ã­ãŒãããã¬ã³ãŒãã®æå€§æ°  
+Z3950Download.max_records_disp:æå€§ã®ã¬ã³ãŒã  
+
+
+#
+#Plugout option descriptions
+#
+
+BasPlugout.bad_general_option:%sãã©ã°ã¢ãŠããäžé©åãªãªãã·ã§ã³ãäœ¿çšããŠããã  
+BasPlugout.debug:ãããã°ã¢ãŒããã»ãããã  
+BasPlugout.desc:å
+šãŠã®ãšã¯ã¹ããŒãã»ãã©ã°ã¢ãŠãã®ããã®åºåºã¯ã©ã¹ã  
+BasPlugout.group_size:åäžã®XMLãã¡ã€ã«ã«ã°ã«ãŒãåãããäžé£ã®ãã­ã¥ã¡ã³ãã  
+BasPlugout.gzip_output:gzipãæçµxmlãã­ã¥ã¡ã³ãã®å§çž®ã«äœ¿çšããïŒå§çž®ããããã­ã¥ã¡ã³ãããæ§ç¯ããæãã©ã°ã€ã³ã«ZIPPluginãå«ããããšãå¿ããªãããšïŒã  
+BasPlugout.output_handle:ã¢ãŠããããã»ããŒã¿ãåãåãã®ã«äœ¿çšããããã¡ã€ã«è­å¥å­  
+BasPlugout.output_info:ã¢ãŒã«ã€ãã«é¢ããæ
+å ±ãä¿å­ããã®ã«äœ¿çšãããarcinfoãªããžã§ã¯ããžã®åç
+§  
+BasPlugout.verbosity:ã¢ãŠããããã®éãå¶åŸ¡ããã 0=none, 3=lotsã  
+BasPlugout.xslt_file:ååãã€ãããã¡ã€ã«ã®XSLTã§ãã­ã¥ã¡ã³ããå€æããã  
+
+DSpacePlugout.desc:Dspaceã¢ãŒã«ã€ãã»ãã©ãŒãããã  
+
+FedoraMETSPlugout.desc:Fedoraã®ãã­ãã¡ã€ã«ãçšããMETS ãã©ãŒãããã  
+FedoraMETSPlugout.fedora_namespace:greenstone:HASH0122efe4a2c58d0ãªã©ã®ids (PIDS)ãåŠçããããã®Fedoraã«äœ¿çšããããã¬ãã£ãã¯ã¹ã    
+
+GreenstoneXMLPlugout.desc:ã°ãªãŒã³ã¹ããŒã³XMLã¢ãŒã«ã€ãã®ãã©ãŒãããã  
+
+GreenstoneMETSPlugout.desc:ã°ãªãŒã³ã¹ããŒã³ã®ãã­ãã¡ã€ã«ãäœ¿çšããMETSãã©ãŒãããã  
+
+MARCXMLPlugout.desc:MARC xmlãã©ãŒãããã  
+MARCXMLPlugout.group:marc xml recordsãåäžã®ãã¡ã€ã«ã«ã¢ãŠããããããã  
+MARCXMLPlugout.mapping_file:å€æã®ããã«named mapping fileãäœ¿çšããã  
+
+METSPlugout.desc:METS formatã®Superclass plugoutã GreenstoneMETSãFedoraMETSãkey abstract methodsãªã©ã®ãã­ãã¡ã€ã«ã®å
+±éæ©èœãäŸçµŠããã  
+METSPlugout.xslt_txt:mets's doctxt.xmlãååã®ä»äžããããã¡ã€ã«ã®XSLTã«å€æããã  
+METSPlugout.xslt_mets:mets's docmets.xmlãååã®ä»äžããããã¡ã€ã«ã®XSLTã«å€æããã  
+
+#
+# Perl module strings
+#
+
+classify.could_not_find_classifier:ãšã©ãŒïŒåé¡å­\"%s\"ãèŠã€ãããªãã  
+
+download.could_not_find_download:ãšã©ãŒïŒdownload module \"%s\"ãèŠã€ãããŸãã  
+
+plugin.could_not_find_plugin:ãšã©ãŒ: ãã©ã°ã€ã³ \"%s\"ãèŠã€ãããŸãã  
+
+plugin.including_archive:ZIP/TARã¢ãŒã«ã€ãã®ã³ã³ãã³ããå«ã  
+
+plugin.including_archives:ZIP/TARã¢ãŒã«ã€ãã®ã³ã³ãã³ããå«ã  
+
+plugin.kill_file:.killãã¡ã€ã«ã«ãã£ãŠã­ã«ããããã­ã»ã¹  
+
+plugin.n_considered:%dãã­ã¥ã¡ã³ããåŠçã®ããã«èæ
+®ããã  
+
+plugin.n_included:%d ãåŠçããã³ã¬ã¯ã·ã§ã³ã«å«ãŸãã  
+
+plugin.n_rejected:%dãæåŠããã  
+
+plugin.n_unrecognised:%dãèªè­ãããªãã£ã  
+
+plugin.no_plugin_could_process:è­ŠåïŒãã©ã°ã€ã³ã %sãåŠçã§ããªãã£ã  
+
+plugin.no_plugin_could_recognise:è­ŠåïŒãã©ã°ã€ã³ã %sãèªè­ã§ããªãã£ã  
+
+plugin.no_plugin_could_process_this_file:ãã©ã°ã€ã³ããã®ãã¡ã€ã«ãåŠçã§ããªã  
+
+plugin.no_plugin_could_recognise_this_file:ãã©ã°ã€ã³ããã®ãã¡ã€ã«ãèªè­ã§ããªã  
+
+plugin.one_considered:ïŒã€ã®ãã­ã¥ã¡ã³ããåŠçã®ããã«èæ
+®ããã  
+
+plugin.one_included:1 ãåŠçããã³ã¬ã¯ã·ã§ã³ã«å«ãŸãã  
+
+plugin.one_rejected:1 ã¯æåŠããã  
+
+plugin.one_unrecognised:1 ã¯èªè­ãããªãã£ã  
+
+plugin.see_faillog:%sèªè­ãããã«ãand/oræåŠããããã­ã¥ã¡ã³ããåç
+§  
+
+PrintUsage.default:Default  
+
+PrintUsage.required:REQUIRED  
+
+plugout.could_not_find_plugout:ãšã©ãŒ: ãã©ã°ã¢ãŠã\"%s\"ãèŠã€ãããªãã£ã  
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/strings_kk.properties
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/strings_kk.properties	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/strings_kk.properties	(revision 24799)
@@ -0,0 +1,1389 @@
+#
+# Resource bundle description
+#
+
+Language.code:ru
+Language.name:Russian
+
+OutputEncoding.unix:koi8_r
+OutputEncoding.windows:dos_850
+
+
+#
+# Common output messages and strings
+#
+
+common.cannot_create_file:ÐÐšÐÐÐÐ: Ð€Ð°Ð¹Ð»ÐŽÑ ÐŒÒ¯ÐŒÐºiÐœ ÐµÐŒÐµÑ Ð¶Ð°ÑÐ°Ñ %s  
+
+common.cannot_find_cfg_file:ÐÐšÐÐÐÐ: ÐÐµÑÐºiÐœÐŽi ÑÐ°Ð¹Ð»ÐŽÑ ÐŒÒ¯ÐŒÐºiÐœ ÐµÐŒÐµÑ ÑÐ°Ð±Ñ %s  
+
+common.cannot_open:ÐÐšÐÐÐÐ: ÐÒ¯ÐŒÐºiÐœ ÐµÐŒÐµÑ Ð°ÑÑ %s  
+
+common.cannot_open_fail_log:ÐÐšÐÐÐÐ: Ð¢iÑÐºÐµÑ ÑÐ°Ð¹Ð»ÑÐœ ÐŒÒ¯ÐŒÐºiÐœ ÐµÐŒÐµÑ Ð°ÑÑ %s  
+
+common.cannot_open_output_file:ÐÐšÐÐÐÐ: ÐšÑÒÐ°ÑÑÐœ ÑÐ°Ð¹Ð»ÐŽÑ ÐŒÒ¯ÐŒÐºiÐœ ÐµÐŒÐµÑ Ð°ÑÑ %s.  
+
+common.cannot_read:ÐÐšÐÐÐÐ: ÐÒ¯ÐŒÐºiÐœ ÐµÐŒÐµÑ ÐŸÒÑÐ¿ ÐŸÑÑÑÑ %s  
+
+common.cannot_read_file:ÒÐÐ¢Ð : Ð€Ð°Ð¹Ð» ÐŒÒ¯ÐŒÐºiÐœ ÐµÐŒÐµÑ ÐŸÒÑ %s  
+
+common.general_options:ÐŸÑÑÐ°Ò Ð²Ð°ÑÐžÐ°ÐœÑÑÐ°Ñ (Ò¯ÑiÐœ %s)  
+
+common.must_be_implemented:ÑÑÐœÐºÑÐžÑ ÐºÐ»Ð°ÑÑ ÑÐ°ÑÐŒÐ°ÒÑÐœÐŽÐ° iÑÐºÐµ Ð°ÑÑÑÑÑ ÐºÐµÑÐµÐº  
+
+common.options:ÐŸÐ¿ÑÐžÑÐ»Ð°Ñ  
+
+common.processing:Ó©Ò£ÐŽÐµÑ  
+
+common.specific_options:ÐµÑÐµÐºÑÐµ ÐŸÐ¿ÑÐžÑÐ»Ð°Ñ  
+
+common.usage:ÒÐŸÐ»ÐŽÐ°ÐœÑÑ  
+
+common.info:ÐŒÓÐ»iÐŒÐµÑ  
+
+common.invalid_options:ÒÐÐ¢Ð ÐŽÓÐ»ÐµÐ»ÐŽÐµÑ : %s  
+
+common.true:ÐŽÒ±ÑÑÑ  
+
+common.false:ÑÐµÑiÑ  
+
+common.deprecated:ÐÐÐÐÐ¡Ð¢Ð«Ð ÒÐÐ  
+#
+# Script option descriptions and output messages
+#
+
+scripts.language:ÐÐ¿ÑÐžÑÐ»Ð°ÑÐŽÑÒ£ ÑÐžÐ¿Ð°ÑÑÐ°ÐŒÐ°Ð»Ð°ÑÑÐœÑÒ£ Ð±ÐµÐ¹ÐœÐµÑiÐœÐµ ÑiÐ»i (ÐŒÑÑÐ°Ð»Ñ, en_US Ð°ÐŒÐµÑÐžÐºÐ°ÐœÐŽÑÒ Ð°ÒÑÐ»ÑÑÐœ ÑiÐ»iÐœ Ð°ÐœÑÒÑÐ°Ð¹ÐŽÑ). Ð€Ð°Ð¹Ð»ÐŽÐ°ÒÑ ÒÐ°ÑÑÑÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐŸÐ¿ÑÐžÑÐ»Ð°ÑÐŽÑÒ£ ÑÐžÐ¿Ð°ÑÑÐ°ÐŒÐ°Ð»Ð°ÑÑÐœÑÒ£ Ð°ÑÐŽÐ°ÑÐŒÐ°Ð»Ð°ÑÑ ÑÐ°Ð»Ð°Ð¿ ÐµÑÐµÐŽi perllib/strings_language-code.rb.  
+
+scripts.xml:ÒÐ°Ð»ÑÐ¿ÑÐ°ÒÑ ÐŒÓÐ»iÐŒÐµÑÑi XML ÓÐ»Ð¿ÐµÑÑi ÑÒ¯ÑiÐœiÐºÑÐµÑÑiÐ· Ó©ÐœÐŽiÑiÐ¿ Ð°Ð»Ð°ÐŽÑ, Ð±iÑÐ°Ò Ð±Ó©Ð»ÑÐµÐºÑÐµÑÐŽi ÓÐ»ÐŽÐµÒÐ°Ð¹ÐŽÐ° Ò¯Ð»ÐºÐµÐœ ÑÐ°ÐœÐŒÐµÐœ.  
+
+scripts.listall:ÐÐ°ÑÐ»ÑÒ Ð±ÐµÐ»Ð³iÐ»i Ð±iÑÐ»iÐºÑÐµÑÐŽiÒ£ ÑiÐ·iÐŒi.  
+
+scripts.describeall:Ò®ÑiÐœ ÐŸÐ¿ÑÐžÑ Ð±Ð°ÑÐ»ÑÒ Ð±ÐµÐ»Ð³iÐ»i Ð¿ÑÐœÐºÑ ÑÑÑÐµÑÑÐµÑ  
+
+scripts.both_old_options:Ð«ÒÑÐ»Ð°Ñ : ÐÒ±ÑÒÐ°ÑÐŽÐ° ÐµÐºi ÐŸÐ¿ÑÐžÑ - (ÐœÐµ ÐŒÐ°Ò£ÑÐ·Ñ Ð±iÑÐŽÐµÐ¹ - removeold Ò¯ÐœÐŽÐµÐŒÐµÑ Ð±ÐŸÐ¹ÑÐœÑÐ° ) keepoldÑÑÒ£ removeoldÑÐ°ÑÐŒÐµÐœ Ð¶ÓÐœÐµ - Ò±-Ñi ÐŽÐžÑÐµÐºÑÐŸÑÐžÑÐœÑÒ£ Ð±Ð°ÑÐ»ÑÒ ÐŒÐ°Ð·ÐŒÒ±ÐœÐŽÐ°ÑÑ Ð±ÐŸÐ»Ð°ÐŽÑ.  
+
+scripts.no_old_options:Ð«ÒÑÐ»Ð°Ñ : ÐÑ - removeold,-keepold  - ÐŒÐ°Ò£ÑÐ·Ñ Ð±iÑÐŽÐµÐ¹ ÐºÓ©ÑÑÐµÑiÐ»ÐŒÐµÐŽi, removeold. Ò±-Ñi ÐŽÐžÑÐµÐºÑÐŸÑÐžÑÐœÑÒ£ Ð±Ð°ÑÐ»ÑÒ ÐŒÐ°Ð·ÐŒÒ±ÐœÐŽÐ°ÑÑ %s  Ð±ÐŸÐ»Ð°ÐŽÑ.  
+
+scripts.gli:GLI ÐºiÑÐ°Ð¿Ñ
+Ð°ÐœÐ°ÑÑÐ»Ð°ÑÑÐœÑÒ£ ÐœÐ°ÒÑÑ ÐžÐœÑÐµÑÑÐµÐ¹ÑÑÐµÑiÐœÐµ Ð±Ð°Ð¹ÑÐ°Ò ÑÑÒÑÐŽÑ GLI, ÐŒÒ¯ÐŒÐºiÐœÐŽiÐº Ð±ÐµÑÐŽÐµÐœ Ð±Ò±Ð» ÑÐºÑÐžÐ¿ÑÑi iÑÐºÐµ ÒÐŸÑÑÐŽÐ° ÐŸÑÐœÐ°ÑÑ.  
+scripts.gai:ÐÐ°Ð¹ÑÐ°Ò (Ð±Ð°ÑÒÐ°ÑÑÐŽÑ Ð°ÑÐ¿Ð°Ð¿Ð¿ÐµÐœ Greenstone ) ÐÐ°Ð¹ Ð±Ò±Ð» ÑÑÐµÐœÐ°ÑÐžÐŽÑÒ£ iÑÐºÐµ ÒÐŸÑÑÑÐœÐŽÐ° Ð±ÐµÐºiÑiÐ»ÐµÐŽi, ÐœÐ°ÒÑÑ ÐÐÐÐ»Ð°ÑÒÐ° ÑÑÒÑÐŽÑ ÐŒÒ¯ÐŒÐºiÐœÐŽiÐº Ð±ÐµÑ.  
+
+scripts.verbosity:ÓšÐœiÐŒÐœiÒ£ ÑÐ°ÐœÑÐœÑÒ£ Ð±Ð°ÒÑÐ»Ð°ÑÑ. 0=ÐµÑÒÐ°ÐœÐŽÐ°Ð¹ ÐŽÐ°ÑÑ,3=ÐºÓ©Ð¿  
+scripts.out:Ð€Ð°Ð¹Ð» Ð°ÑÑ ÐœÐµÐŒÐµÑÐµ ÐŽÐµÐŒÐ°Ð»ÑÑ ÐŒÓÑÑÐµÐ±ÐµÐ»ÐµÑiÐœiÒ£ ÐŒÓ©ÑÐ³Ðµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÒÐ°Ð»Ð°ÐŒ.  
+
+# -- buildcol.pl --
+
+buildcol.archivedir:ÒÐ°Ð¹ÐŽÐ° Ð°ÑÑ
+ÐžÐ²ÑÐ°ÑÐŽÐ° Ð±ÐŸÐ»Ð°ÐŽÑ.  
+
+buildcol.builddir:ÒÐ°Ð¹ÐŽÐ° Ð¶Ð°ÑÐ°Ð»ÒÐ°Ðœ ÐžÐœÐŽÐµÐºÑÑÐµÑÐŽi ÐŸÑÐœÐ°Ð»Ð°ÑÑÑÑÑ.  
+
+buildcol.cachedir:ÐÐŸÐ»Ð»ÐµÐºÑÐžÑÐœÑ ÑÐ°ÒÑÑÑÐ° Ð±Ò±Ð» Ð¶ÐµÑÐŽÐµ Ð¶Ð°ÑÐ°Ð»Ð°ÐŽÑ, ÒÐ°Ð»Ð°Ð¹ ÑÐŸÐ» Ð°Ð»ÐŽÑÐœÐŽÐ° Ð¶Ð°ÑÐ°Ð»ÒÐ°Ðœ ÐŽÐžÑÐµÐºÑÐŸÑÐžÑÒÐ° ÐºÓ©ÑiÑiÐ¿ Ð°Ð»Ð°ÐŽÑ.  
+
+buildcol.cannot_open_cfg_file:ÐÐ¡ÐÐÐ Ð¢Ð£: ÐÐµÑÐºiÐœÐŽi ÑÐ°Ð¹Ð» Ð¶Ð°Ò£Ð°ÑÑÑÒÐ° Ð°ÑÐ° Ð°Ð»ÐŒÐ°Ð¹ÐŽÑ : %s  
+
+buildcol.collectdir:ÐÐžÑÐµÐºÑÐŸÑÐžÑÐœÑÒ£ collect"ÑÑÐœÐ° Ð¶ÐŸÐ».  
+
+buildcol.copying_back_cached_build:ÐÑÑ Ð¶Ð°ÑÐ°Ð»ÒÐ°Ðœ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐ°ÐœÑÒ£ ÐºÐµÑi ÐºÓ©ÑiÑÐŒÐµÑiÐœ Ð°Ð»ÑÑ.  
+
+buildcol.create_images:Ð¢Ð°Ð»Ð¿ÑÐœÑÑ Ð¶Ð°Ò£Ð° ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ Ò¯ÐœÐŽÐµÐŒÐµÑ Ð±ÐŸÐ¹ÑÐœÑÐ°ÒÐ° ÑÑÑÐµÑÑi Ð¶Ð°ÑÐ°Ñ. ÐÐ» perl Ð¶Ð°Ð·Ñ ÑÐºÑÐžÐ¿Ñ ÐŒÒ¯ÐŒÐºiÐœÐŽiÐº Ð±ÐµÑÑ Ò¯ÑiÐœ perl ÒÐŸÐ»Ð°Ð¹Ð»Ñ ÐŒÐŸÐŽÑÐ»ÐŽÐ°ÑÑÐŒÐµÐœ ÒÐ°ÑÐ°Ñ ÐŸÑÐœÐ°ÑÐ°ÑÑÐœ Gimp ÐœÐµÐ³iÐ·ÐŽÐµÐ»Ð³ÐµÐœ.  
+
+buildcol.debug:ÓšÐœiÐŒÐŽi Ð¶Ð°Ð·ÑÐ¿ Ð°Ð»Ñ STDOUT.  
+
+buildcol.desc:PERL GML ÒÒ±Ð¶Ð°ÑÑÐ°ÑÑÐœÐ°Ðœ GreenstoneÐœÑÒ£ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÑÑÐœ ÒÒ±ÑÐ°ÑÑÑÑÑÒÐ° ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÑÑÐœ ÑÐºÑÐžÐ¿Ñ.  
+
+buildcol.faillog:Ð€Ð°Ð¹Ð» Ð°ÑÑÐœÑÒ£ ÑÓÑÑiÐ· ÑiÑÐºÐµÑi. ÐÒ±Ð» ÑiÑÐºÐµÑ Ð¶ÑÑÐœÐ°Ð»Ñ Ð°Ð»ÐŽÑ Ó©Ò£ÐŽÐµÐ»Ðµ Ð°Ð»ÐŒÐ°ÒÐ°Ðœ ÐºÐµÐ· ÐºÐµÐ»Ð³ÐµÐœ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÐŽÐ°Ðœ ÑÐ°Ð¹Ð» Ð°ÑÑ  
+
+buildcol.incremental_default_builddir:Ð«ÒÑÐ»Ð°Ñ : ÐÐžÑÐµÐºÑÐŸÑÐžÑÐœÑÒ£ ÒÒ±ÑÑÐ»ÑÐŒÑ ÒÒ±ÑÐ°ÑÑÑÑÑÒÐ° Ð°ÐœÑÒÑÐ°Ð»ÐŽÑ. ÐÐ³ÐµÑ ÑiÐ· ÐŽÐžÑÐµÐºÑÐŸÑÐžÑÐœÑ Ð±Ð°Ñ ÐžÐœÐŽÐµÐºÑÐºÐµ ÒÐŸÑÑÐŒÑÐ° ÒÐŸÑÒÑÒ£ÑÐ· ÐºÐµÐ»ÑÐµÒ£iÐ·, buildcol.plÐ³Ðµ ÐŸÐ¿ÑÐžÑÐœÑ "- builddir index" ÒÐŸÐ»ÐŽÐ°ÐœÑÒ£ÑÐ·.  
+
+buildcol.index:(ÐµÐ³ÐµÑ ÐŸÐ» ÐŸÑÐœÐ°ÑÑÐ»ÐŒÐ°ÑÐ°, Ð±Ð°ÑÐ»ÑÒ ÐºÐµÑÐºiÐœÐŽi ÑÐ°Ð¹Ð»ÐŽÐ° Ð¶Ð°ÑÐ°Ð»Ð°ÐŽÑ ) ÒÒ±ÑÐ°ÑÑÑÑÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐžÐœÐŽÐµÐºÑ.  
+
+buildcol.incremental:Ð¢ÐµÐº ÒÐ°ÐœÐ° ÑÐŸÐ» ÓÐ»i ÐŽÐµÐ¹ÐŽi ÐžÐœÐŽÐµÐºÑÑÐµÐ³ÐµÐœ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÐŽÑ ÐžÐœÐŽÐµÐºÑÑÐµÑ. ÒÐŸÑÐ°ÐŽÑ - keepold. LuceneÐœÑÒ£ ÐžÐœÐŽÐµÐºÑÐ°ÑÐŸÑÑÐœ ÒÐŸÐ»ÐŽÐ°ÐœÐ°ÐŽÑ.  
+
+buildcol.keepold:ÒÒ±ÑÑÐ»ÒÐ°Ðœ ÐŽÐžÑÐµÐºÑÐŸÑÐžÑÐœÑÒ£ Ð°ÒÑÐŒÐŽÐ°ÒÑ ÐŒÐ°Ð·ÐŒÒ±ÐœÑ ÒÒ±ÑÑÐ¿Ð°Ð¹ÐŽÑ.  
+
+buildcol.maxdocs:ÒÒ±ÑÐ°ÑÑÑÑÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÐŽÑÒ£ ÐŒÐ°ÐºÑÐžÐŒÐ°Ð» ÑÐ°ÐœÑ.  
+buildcol.maxnumeric:ÐÐœÐŽÐµÐºÑÑi ÑÓ©Ð·ÐŽiÐºÑÐµÐ³i ÑÓ©Ð· ÐžÐµÐŒÐŽÐµÐœÐµ Ð°Ð» ÑÐžÑÑÐ»Ð°ÑÐŽÑÒ£ ÐŒÐ°ÐºÑÐžÐŒÐ°Ð» ÑÐ°ÐœÑ. Ò®Ð»ÐºÐµÐœ ÑÐ°ÐœÐŽÐ°Ñ ÐžÐœÐŽÐµÐºÑÐ°ÑÐžÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ Ð±iÑ Ð°ÑÑÐ· ÑÓ©Ð·ÐŽÐµÑÐ³Ðµ Ð±Ó©Ð»iÐœÐµÐŽi. ÐÑÑÐ°Ð»Ñ, ÐµÐ³ÐµÑ ÐŒÐ°ÐºÑÐžÐŒÐ°Ð» ÑÐ°ÐœÑ 4 ÑÐµÒ£, "1342663" "1342"Ð¶ÓÐœÐµ "663" Ð±Ó©Ð»iÐœÐµÐŽi.  
+buildcol.mode:ÐÑÑÐœÐŽÐ°ÑÒÐ° ÐºÐµÑÐµÐºÐºÐµÐœ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐœÑÒ£ ÒÒ±ÑÐ°ÑÑÑÑÑÑÐœ Ð¿ÑÐŸÑÐµÑÑÑiÒ£ Ð±Ó©Ð»iÐºÑÐµÑi.  
+buildcol.mode.all:ÐÐ°ÑÐ»ÑÒ iÑÑÐµÑ.  
+buildcol.mode.build_index:Ð¢ÐµÐº ÒÐ°ÐœÐ°ÑÑ ÐŒÓÑiÐœÐŽi ÐžÐœÐŽÐµÐºÑÑÐµÑ.  
+buildcol.mode.compress_text:Ð¢ÐµÐº ÒÐ°ÐœÐ°ÑÑ ÐŒÓÑiÐœ ÒÑÑÑ.  
+buildcol.mode.infodb:Ð¢ÐµÐº ÒÐ°ÐœÐ°ÑÑ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ Ð±Ð°Ð·Ð°ÑÑÐœ Ð¶Ð°ÑÐ°Ñ.  
+
+buildcol.no_default_images:Ð¡ÑÑÐµÑÑÐµÑ Ò¯ÐœÐŽÐµÐŒÐµÑ Ð±ÐŸÐ¹ÑÐœÑÐ°ÐŽÑ Ð¶Ð°ÑÐ°Ð»ÐŒÐ°Ð¹ÐŽÑ.  
+
+buildcol.no_image_script:ÐÑÐºÐµÑÑÑ : Ð¡ÑÑÐµÑÑiÒ£ Ð¶Ð°ÑÐ°ÑÑÐœ ÑÐºÑÐžÐ¿Ñ ÑÐ°Ð±Ð° Ð°Ð»ÐŒÐ°ÐŽÑ : %s  
+
+buildcol.no_strip_html:ÐÐœÐŽÐµÐºÑÑÐµÐ»Ð³ÐµÐœ (ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐ»Ð°ÑÐŽÑÒ£ mgppÑÑ Ò¯ÑiÐœ ÑÐµÐº ÒÐ°ÐœÐ° ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÐŽÑ ) ÐŒÓÑiÐœÐœÐµÐœ HTMLÐœÑÒ£ ÑÑÐ³ÑÐµÑi Ð°Ð»ÑÐ¿ ÑÐ°ÑÑÐ°ÐŒÐ°Ñ.  
+
+buildcol.no_text:ÒÑÑÑÐ»ÒÐ°Ðœ ÐŒÓÑiÐœiÐœ ÑÐ°ÒÑÐ°Ð»ÐŒÐ°Ñ. ÐÐ³ÐµÑ ÑiÐ· Ð°ÒÑÐŒÐŽÐ°ÒÑ (ÑiÐ·i ÐŽÐµÐŒÐµÐ³i ÐŒÓÑiÐœÐœiÒ£ ÒÑÑÑÐ»ÒÐ°Ðœ Ð±ÐŸÐ»Ð¶Ð°ÐŒÑÐœ ÒÐ°Ð»Ð¿ÑÐœÐ° ÐºÐµÐ»ÑiÑÐŒÐµÐ¹iÒ£iÐ· ) ÑÐ°ÒÑÑÒÐ° ÒÒ±Ð¶Ð°Ñ ÑÒ¯Ð¿ÐœÒ±ÑÒÐ°Ð»Ð°ÑÑÐœÑÒ£ ÐºÓ©ÑÑÐµÑÑÐ³Ðµ ÓÑÐŽÐ°Ð¹ÑÐŒ ÐŸÒÑÐ°Ð»ÑÐ°Ò£ÑÐ·, Ð±Ò±Ð» ÐŸÐ¿ÑÐžÑ ÑÐ°Ð»ÑÐœÒÐ°Ðœ ÐžÐœÐŽÐµÐºÑÑÐµÑÐŽi Ó©Ð»ÑÐµÐŒÐœiÒ£ ÐŒÐžÐœÐžÐŒÐžÐ·Ð°ÑÐžÑÐ»Ð°ÑÑÐœÐ° Ð¿Ð°Ð¹ÐŽÐ°Ð»Ñ.  
+
+buildcol.sections_index_document_metadata:Ð¡ÐµÐºÑÐžÑÐ»Ð°ÑÐŽÐ°ÒÑ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ ÐŽÐµÒ£Ð³ÐµÐ¹ÐŽÐµÑiÐœÐŽÐµÐ³i ÒÒ±Ð¶Ð°ÑÑÐ°ÑÑÐœ ÐžÐœÐŽÐµÐºÑÑÐµÑ  
+buildcol.sections_index_document_metadata.never:Ð¡ÐµÐºÑÐžÑÐœÑÒ£ ÐŽÐµÒ£Ð³ÐµÐ¹ÐŽÐµÑiÐœÐŽÐµÐ³i ÒÒ±Ð¶Ð°ÑÑÑÒ£ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑiÐœ ÐžÐœÐŽÐµÐºÑÑÐµÐŒÐµÑ.  
+buildcol.sections_index_document_metadata.always:ÐÐ³ÐµÑ Ð±Ð°ÑÐ»ÑÒ ÑÐµÐºÑÐžÑÐœÑÒ£ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑi ÐŽÐµÒ£Ð³ÐµÐ¹ Ð±Ò±Ð»ÒÐ°Ðœ Ð±Ð°Ñ Ð±ÐŸÐ»ÑÐ°, ÒÒ±Ð¶Ð°ÑÑÑÒ£ Ð±Ð°ÑÐ»ÑÒ Ð±ÐµÐ»Ð³i ÒÐŸÐ¹ÑÐ»ÒÐ°Ðœ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑi ÒÐŸÑÑÐ»ÑÑÐœ ÐŽÐµÒ£Ð³ÐµÐ¹ Ð±Ò±Ð»ÒÐ°Ðœ.  
+buildcol.sections_index_document_metadata.unless_section_metadata_exists:ÐÐ³ÐµÑ ÑÐµÐºÑÐžÑÐœÑÒ£ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑi Ð°ÑÐ°ÑÐŒÐµÐœ Ð±Ò±ÒÐ°Ðœ ÐŽÐµÒ£Ð³ÐµÐ¹ Ð±Ò±Ð»ÒÐ°Ðœ Ð±Ð°Ñ Ð±ÐŸÐ»ÐŒÐ°ÑÐ°, ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑ ÑÐµÐº ÒÐ°ÐœÐ° ÑÐŸÐœÐŽÐ° ÒÐŸÑÑÐ»ÑÑÐœ ÒÒ±Ð¶Ð°ÑÑÑÒ£ ÐŽÐµÒ£Ð³ÐµÐ¹i Ð±Ò±Ð»ÒÐ°Ðœ.  
+
+buildcol.out:Ð€Ð°Ð¹Ð»ÐŽÑÒ£ Ð°ÑÑ ÐœÐµÐŒÐµÑÐµ Ó©ÐœiÐŒÐœiÒ£ ÐŒÓÑÑÐµÐ±ÐµÑiÐœiÒ£ ÐŒÓ©ÑiÐœÐµ ÐžÐœÐŽÐµÐºÑi.  
+
+buildcol.params:ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐœÑÒ£ Ð°ÑÐ°ÑÑ [Ð²Ð°ÑÐžÐ°ÐœÑÑÐ°Ñ ]  
+
+buildcol.remove_empty_classifications:Ð¡ÐºÑÑÑÑ ÐœÐµÐ·Ð°Ð¿ÐŸÐ»ÐœÐµÐœÐœÑÐµ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÑ Ðž ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÐŸÐœÐœÑÐµ ÑÐ·Ð»Ñ (Ð±ÐµÐ· ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ²).
+
+buildcol.removeold:ÐÒ±ÐŒÑÑ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÑÑÐœÑÒ£ ÓÐ»ÐŽÐµÒÐ°ÑÐ°ÐœÒÑ ÐŒÐ°Ð·ÐŒÒ±ÐœÑ Ð°Ð»ÑÐ¿ ÑÐ°ÑÑÐ°Ð¹ÐŽÑ.  
+
+buildcol.unlinked_col_images:ÐÐŸÐ»Ð»ÐµÐºÑÐžÑÐœÑÒ£ ÑÑÑÐµÑÑÐµÑi ÐŽÒ±ÑÑÑ Ð±Ð°Ð¹Ð»Ð°ÐœÐ° Ð°Ð»ÐŒÐ°Ð¹ÐŽÑ.  
+
+buildcol.unknown_mode:ÐÐµÐ»Ð³iÑiÐ· ÓÐŽiÑ : %s  
+
+buildcol.updating_archive_cache:ÐÑÑ
+ÐžÐ²ÑÑÒ£ ÐºÑÑiÐœiÒ£ Ð¶Ð°Ò£Ð°ÑÑÑÑ  
+
+buildcol.verbosity:ÓšÐœiÐŒÐœiÒ£ ÑÐ°ÐœÑÐŒÐµÐœ Ð±Ð°ÑÒÐ°ÑÑ.. 0=ÐµÑÑÐµÒ£Ðµ, 3=Ò¯Ð»ÐºÐµÐœ ÑÐ°Ðœ.  
+
+
+# -- classinfo.pl --
+
+classinfo.collection:ÐÒ£ Ð°Ð»ÐŽÑÐŒÐµÐœ ÐºÐµÑÐµÐº Ð±ÐŸÐ»Ð°ÑÑÐœ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐ»Ð°Ñ Ð°ÑÑÑÒ£ Ð±ÐµÑÑiÐœÐŽÐµ collect/collection-name/perllib/classifyÐ³Ðµ classinfo.plÐ³Ðµ ÒÐ°ÑÐ°Ñ. ÐÐ³ÐµÑ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑ perllib/classifyÐœiÒ£ ÐŸÑÑÐ°Ò ÐŽÐžÑÐµÐºÑÐŸÑÐžÑÑÑÐœ ÒÐ°ÑÐ°Ñ Ð±ÐŸÐ»Ñ ÐºÐµÑÐµÐº Ð°ÐœÐŽÐ° ÑÐ°Ð±ÑÐ»ÐŒÐ°ÑÐ°, Ð±ÐŸÐ»Ñ ÐºÐµÑÐµÐº.  
+
+classinfo.desc:ÐÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑ ÑÑÑÐ°Ð»Ñ ÐŒÓÐ»iÐŒÐµÑÑi Ð¶Ð°Ð·ÑÐ¿ Ð°Ð»Ñ.  
+
+classinfo.general_options:ÐÑÑÐ°Ò ÐŸÐ¿ÑÐžÑÐ»Ð°Ñ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÐŽÑÒ£ Ð°ÐœÐ°Ð»ÑÒ ÐºÐ»Ð°ÑÑÑÐ°ÑÑÐœÐ°Ðœ ÐŒÒ±ÑÐ° ÐµÑÐºÐµÐœ.  
+
+classinfo.info:ÐŒÓÐ»iÐŒÐµÑ  
+
+classinfo.no_classifier_name:ÒÐÐ¢Ð : Ð¡iÐ· ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÐŽÑÒ£ Ð°ÑÐ°ÑÑ Ð±ÐµÑÑiÒ£iÐ· ÐºÐµÑÐµÐº.  
+
+classinfo.option_types:ÐÐ¿ÑÐžÑÐ»Ð°ÑÐŽÑÒ£ ÐµÐºi ÑÒ¯ÑiÐœiÒ£ ÐžÐµÐŒÐŽÐµÐœÐµ Ð°Ð»Ñ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÐ»Ð°Ñ.  
+
+classinfo.params:ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÐŽÑÒ£ Ð°ÑÐ°ÑÑ classifier-name [ÐŸÐ¿ÑÐžÑÐ»Ð°Ñ ]  
+
+classinfo.passing_options:ÐÐ¿ÑÐžÑÐ»Ð°Ñ ÐŸÐ»Ð°ÑÐ»Ð°ÑÐŽÑÒ£ collect.cfgÐœÑÒ£ ÑiÐ·ÐŽiÒ£ ÐºÐµÑÐºiÐœÐŽi ÑÐ°Ð¹Ð»ÑÐœÐ° ÒÐŸÑÑÐœÐŽÑ ÐºÐµÐ· ÐºÐµÐ»Ð³ÐµÐœ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÒÐ° ÑÐ°Ð¿ÑÑÑÑÐ»Ð° Ð°Ð»Ð°ÐŽÑ.  
+
+classinfo.specific_options:ÐÐ°ÒÑÑÐ»Ñ ÐŸÐ¿ÑÐžÑÐ»Ð°Ñ Ó©Ð·ÐŽiÒ£ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÑ ÑÐµÐºÑÐµÑiÐœÐŽÐµÐ³i Ð¶ÓÐœÐµ Ð±Ò±Ð» ÐµÑÐµÐºÑÐµ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÒÐ° ÑÒ¯ÑiÐœiÐºÑi ÑÐµÐº ÒÐ°ÐœÐ° Ð°ÐœÑÒÑÐ°Ð»ÒÐ°Ðœ.  
+
+# -- downloadfrom.pl --
+downloadfrom.cache_dir:ÐÑÑÐµÐŒÐŒÐµÐœ ÑiÐ·Ð±ÐµÐœiÒ£ ÑÒ±ÑÒÐ°Ðœ Ð¶ÐµÑi  
+downloadfrom.desc:Ð¡ÑÑÑÒÑ ÑÐµÑÐ²ÐµÑÐŽÐµÐœ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÑÐœÑÒ£ Ð¶Ò¯ÐºÑÐµÑi  
+downloadfrom.download_mode:ÐÒ¯ÐºÑÐµÐ»ÐµÑiÐœ ÑÐµÑÐ²ÐµÑÐŽiÒ£ ÑÒ¯Ñi  
+downloadfrom.download_mode.Web:HTTP  
+downloadfrom.download_mode.MediaWiki:MediaWiki Ð²ÐµÐ±-ÑÐ°Ð¹Ñ  
+downloadfrom.download_mode.OAI:Open Archives Initiative  
+downloadfrom.download_mode.z3950:ÑÐµÑÐ²ÐµÑ Z3950  
+downloadfrom.download_mode.SRW:SearchRetrieve Webservice  
+downloadfrom.incorrect_mode:Ð¶Ò¯ÐºÑÐµÑÐŽi ÑÓÑÑiÐ¿ÑiÒ£ Ð¿Ð°ÑÐ°ÐŒÐµÑÑi ÐŽÒ±ÑÑÑ ÐµÐŒÐµÑ Ð±ÐŸÐ»ÐŽÑ  
+downloadfrom.info:Ð¡ÐµÑÐ²ÐµÑ ÑÑÑÐ°Ð»Ñ ÐŒÓÐ»iÐŒÐµÑÑi Ð±Ð°ÑÑÐ¿ ÑÑÒÐ°ÑÑÑÐœ, ÐŸÐ»Ð°ÑÐŽÐ°ÐœÐŽÑ Ð¶Ò¯ÐºÑÐµÐŒÐµÑ  
+downloadfrom.params:[Ð¶Ò¯ÐºÑÐµÑÐŽiÒ£ Ð°ÑÐœÐ°Ð¹Ñ ÐŸÐ¿ÑÐžÑÐ»Ð°ÑÑ ] [ÐœÐµÐ³iÐ·Ð³i ÐŸÐ¿ÑÐžÑÐ»Ð°Ñ ]  
+
+# -- downloadinfo.pl --
+
+downloadinfo.desc:ÐÒ¯ÐºÑÐµÑÐŽi ÐŒÐŸÐŽÑÐ» ÑÑÑÐ°Ð»Ñ ÐŒÓÐ»iÐŒÐµÑÑi Ð±Ð°ÑÑÐ¿ ÑÑÒÐ°ÑÑ  
+downloadinfo.collection:Downloadinfo.pl ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐ»Ð°Ñ Ð°Ñ Ð±ÐµÑÑ collect/collection-name/perllib/downloadersÐºÐµ Ð±Ð°ÑÑÐ°Ð¿ÒÑÐŽÐ° ÒÐ°ÑÐ°ÑÐ° Ð°Ð»Ð°ÐŽÑ. ÐÐ³ÐµÑ ÐŒÐŸÐŽÑÐ»ÐŽÑ Ð°ÐœÐŽÐ° ÑÐ°Ð±ÑÐ»ÐŒÐ°ÑÐ°, iÐ·ÐŽÐµÑÑiÑÑ ÑiÐ·Ð±Ðµ ÐœÐµÐ³iÐ·iÐœÐŽÐµÐœi Ð¶Ð°ÑÐ°Ð»Ð°ÐŽÑ perllib/downloaders.  
+downloadinfo.params:[ÐŒÐŸÐŽÑÐ» - Ð¶Ò¯ÐºÑÐµÑ ] [ÐŸÐ¿ÑÐžÑÐ»Ð°Ñ ]  
+downloadinfo.general_options:ÐÐµÐ³iÐ·Ð³i ÐŸÐ¿ÑÐžÑÐ»Ð°Ñ Ð¶Ò¯ÐºÑÐµÑÐŽiÒ£ ÐŒÐŸÐŽÑÐ»ÐŽÐ°ÑÑÐœÑÒ£ ÐºÐ»Ð°ÑÑÑÐœÐ°Ðœ ÐŒÐŸÐŽÑÐ»ÐŽÐ°ÑÐŒÐµÐœ ÐŒÒ±ÑÐ° ÐµÑÐµÐŽi.  
+downloadinfo.specific_options:ÐÒ¯ÐºÑÐµÑÐŽiÒ£ ÐŒÐŸÐŽÑÐ»ÐŽÐ°ÑÑ ÐµÑÐµÐºÑÐµ ÐŸÐ¿ÑÐžÑÐ»Ð°Ñ Ó©Ð·ÐŽÐµÑiÐ»ÐµÑÐŽi Ð°ÐœÑÒÑÐ°Ð¹ÐŽÑ, Ð¶ÓÐœÐµ ÑÐŸÐœÐŽÑÒÑÐ°Ðœ ÐœÐ°ÒÑÑÐ»Ñ ÑÐžÐµÑÑiÐ³Ðµ ÑÒ¯ÑiÐœiÐºÑi ÑÐµÐº ÒÐ°ÐœÐ° ÐŸÐ»Ð°Ñ.  
+downloadinfo.option_types:ÐÒ¯ÐºÑÐµÑÐŽiÒ£ ÐŒÐŸÐŽÑÐ»ÐŽÐ°ÑÑ ÐŸÐ¿ÑÐžÑÐ»Ð°ÑÐŽÑÒ£ ÐµÐºi ÑÒ¯Ñi ÒÐ°Ð±ÑÐ»ÐŽÐ°Ð¹ Ð°Ð»Ð°ÐŽÑ  
+
+# -- explode_metadata_database.pl --
+explode.desc:ÐÐµÑÐµÐºÑÐµÑ ÒÐŸÑÑÐœ ÐŒÐµÑÐ° ÐºÐµÒ£ÐµÐ¹ÑÑiÐœ - ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŒÐµÐœ  
+
+explode.collection:ÐÐŸÐ»Ð»ÐµÐºÑÐžÑÐœÑÒ£ Ð°ÑÑ. ÐÐµÐ¹Ð±iÑ ÐÐ»Ð°Ð³ÐžÐœÐŽÐµÑ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐœÑÒ£ Ð¿Ð°Ð¿ÐºÐ°ÑÑÐœÐŽÐ°ÒÑ ÒÐŸÑÐ°Ð»ÒÑ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÑÐœ iÐ·ÐŽÐµÐ¹ÐŽi.  
+ 
+explode.document_field:ÐÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ ÑÐ»ÐµÐŒÐµÐœÑi, Ð°Ð»ÑÐœÒÐ°Ðœ Ð¶ÓÐœÐµ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐ»Ð°ÑÒÐ° ÒÐŸÑÑÐ»ÒÐ°Ðœ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÑÐ°Ð¹Ð»ÐŽÑÒ£ Ð°ÐœÑÒÑÐ°Ð¹ÑÑÐœ Ð°ÑÐ°ÑÑ.  
+
+explode.document_prefix:(document_fieldÑiÒ£ ÐŸÐ¿ÑÐžÑÑÑ Ð±Ð°Ñ ÒÐŸÐ»ÐŽÐ°ÐœÑÒÐ° ) ÒÒ±Ð¶Ð°ÑÑÑÒ£ ÑÒ±ÑÒÐ°Ðœ ÐŸÑÑÐœÐŽÐ°ÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÒÐŸÑÑÐŒÑÐ°.  
+
+explode.document_suffix:(document_fieldÑiÒ£ ÐŸÐ¿ÑÐžÑÑÑ Ð±Ð°Ñ ÒÐŸÐ»ÐŽÐ°ÐœÑÒÐ° ) ÒÒ±Ð¶Ð°ÑÑÑÒ£ ÑÒ±ÑÒÐ°Ðœ ÐŸÑÑÐœÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ Ð¶Ò±ÑÐœÐ°Ò.  
+
+explode.encoding:ÐÐµÑÐµÐºÑÐµÑ ÒÐŸÑÑÐœÐŽÐ° ÑÐ°Ð¹Ð»ÐŽÐ°ÑÐŽÑÒ£ ÐŸÒÑÑÐœÐŽÐ°ÒÑ ÒÐŸÐ»ÐŽÐ°ÐœÑÒÐ° ÐºÐŸÐŽÑÐ°Ð»ÒÐ°ÐœÑ  
+explode.metadata_set:ÐÐžÑÐœÐœÑÒ£ Ð°ÑÐ°ÑÑ ÐŒÐµÑÐ° - ÑÐµÑÐºÐµ ÑÑÒÐ°ÑÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐŒÓÐ»iÐŒÐµÑÑÐµÑ Ð±Ð°ÑÐ»ÑÒ ÐŒÐµÑÐ° - ÐŒÓÐ»iÐŒÐµÑÑÐµÑ  
+explode.plugin:ÒÐŸÐ»ÐŽÐ°ÐœÑÒÐ° ÐÐ»Ð°Ð³ÐžÐœi ÐºÐµÒ£ÐµÐ¹ÑÑÐŽÐµ  
+explode.plugin_options:IÑÐºÐµ ÒÐŸÑÑÒÐ° ÐŽÐµÐ¹iÐœ Ð°Ð»ÐŽÑÐœÐŽÐ° ÐÐ»Ð°Ð³ÐžÐœÐ³Ðµ Ð±ÐµÑiÐ»ÑÐŽiÒ£ ÐŸÐ¿ÑÐžÑÐ»Ð°ÑÑ. Nmaes ÐŸÐ¿ÑÐžÑ ÑÑÑÐ°Ð»Ñ Ð±Ð°ÑÑÐ°Ð»ÑÑ ÐºÐµÑÐµÐºÐÐµÐŒÑiÐ»iÐºÐ¿ÐµÐœÐŒÐµÐœ Ð°ÑÐ°Ñ Ð¶ÓÐœÐµ ÐŒÓÐœ Ð¶ÐµÐºÐµ ÐŸÐ¿ÑÐžÑ.  
+explode.use_collection_plugin_options:ÐÐŸÐ»Ð»ÐµÐºÑÐžÑÐœÑÒ£ ÐºÐµÑÐºiÐœÐŽi ÑÐ°Ð¹Ð»Ñ ÐŸÒÑÒ£ÑÐ· Ð¶ÓÐœÐµ ÐœÐ°ÒÑÑÐ»Ñ ÐÐ»Ð°Ð³ÐžÐœÐŽÐµÑÐ³Ðµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐŸÐ¿ÑÐžÑÐœÑ ÒÐŸÐ»ÐŽÐ°ÐœÑÒ£ÑÐ·. ÐÐ¿ÑÐžÑ - collectionÐŽi ÑÐ°Ð»Ð°Ð¿ ÐµÑÐµÐŽi.  
+explode.params:ÑÐ°Ð¹Ð»ÐŽÑÒ£ Ð°ÑÐ°ÑÑ [ÐŸÐ¿ÑÐžÑÐ»Ð°Ñ ]  
+explode.records_per_folder:ÓÑÐ±iÑ iÑÐºi Ð±ÑÐŒÐ° Ò¯ÑiÐœ Ð¶Ð°Ð·Ñ ÑÐ°Ðœ  
+
+# -- replace_srcdoc_with_html.pl --
+srcreplace.desc:ÐÐ°ÑÑÐ°Ð¿ÒÑ ÒÒ±Ð¶Ð°ÑÑÑ Ð°Ð»ÐŒÐ°ÑÑÑÑÑÑÐœ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐœÑÒ£ ÒÐ°Ð¹ÑÐ° ÒÒ±ÑÑÑÐœÑÒ£ Ð¶Ð°ÐœÑÐœÐŽÐ° ÑÐ°Ð¹Ð»ÐŒÐµÐœ HTML ÑÑÒÐ°ÑÑÐ»Ð°ÑÑÐœ  
+srcreplace.params:ÑÐ°Ð¹Ð» Ð°ÑÑ [ÐŸÐ¿ÑÐžÑÐ»Ð°Ñ ]  
+srcreplace.plugin:ÐÐŸÐŽÑÐ» Ð±Ð°ÑÑÐ°Ð¿ÒÑ ÒÒ±Ð¶Ð°ÑÑÑÒ£ Ó©ÑÐœÐµÐºÑÐµÑiÐœÐµ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÐŽÑ  
+
+# -- exportcol.pl --
+
+exportcol.out:Ð€Ð°Ð¹Ð» Ð°Ñ ÐœÐµÐŒÐµÑÐµ Ó©ÐœiÐŒÐœiÒ£ ÐŒÓÑÑÐµÐ±ÐµÑiÐœiÒ£ ÐŒÓ©ÑiÐœÐµ ÐžÐœÐŽÐµÐºÑi.  
+exportcol.cddir:Ð¢ÑÒÑÐ· ÐŽÐžÑÐºÑiÒ£ ÐŒÐ°Ð·ÐŒÒ±ÐœÑÐœ ÑÐµÑÐºÐµ ÑÑÒÐ°ÑÐ°ÑÑÐœ ÐŽÐžÑÐµÐºÑÐŸÑÐžÑÐœÑÒ£ Ð°ÑÐ°ÑÑ.  
+exportcol.cdname:CD-ROM ÐŸÑÐœÐ°ÑÑÐ»ÒÐ°Ðœ Ð±ÐŸÐ¹ÐŽÐ° CD-ROM Ð°Ñ - Ð±Ò±Ð» ÐÐŽÐÐŽÐ° Ð¿Ð°Ð¹ÐŽÐ° Ð±ÐŸÐ»ÒÐ°Ðœ, ÑÐµÐº ÒÐ°ÐœÐ°Ñ.  
+exportcol.desc:PERL ÑÐºÑÐžÐ¿Ñ Windows CD-ROMÐ³Ðµ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐ»Ð°ÑÑ Ð±iÑ ÐœÐµÐŒÐµÑÐµ ÐºÓ©Ð±iÑÐµÐº ÑÐºÑÐ¿ÐŸÑÑÒÐ° ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»ÐŽÑ.  
+exportcol.noinstall:ÐiÑÐ°Ð¿Ñ
+Ð°ÐœÐ°ÐŒÐµÐœ ÑiÐºÐµÐ»ÐµÐ¹ Ð¶Ò±ÐŒÑÑ iÑÑÐµÐ¹ÑiÐœ CD-ROMÑiÐœ Ð¶Ð°ÑÐ°Ð»ÑÑÐœ, ÐµÑÑÐµÒ£Ðµ ÑÒ¯Ð¹iÐœ-ÐºÐŸÐŒÐ¿ÑÑÑÐµÑÑ Ð±ÐµÐºiÑiÐ»ÐŒÐµÐ¹ÐŽi.  
+exportcol.params:Ð°ÑÐ°Ñ [ÐŸÐ¿ÑÐžÑÐ»Ð°Ñ ] - ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž2...  
+exportcol.coll_not_found:ÐÐ°ÑÐ°ÐŒÑÑÐ· ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐœÑ Ð°ÑÒÒÐ° Ð±Ð°Ñ %s:ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ ÑÐ°Ð±ÑÐ»ÐŒÐ°ÒÐ°Ðœ %s.  
+exportcol.coll_dirs_not_found:ÐÐ°ÑÐ°ÐŒÑÑÐ· ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐœÑ Ð°ÑÒÒÐ° Ð±Ð°Ñ%s: ÐºÐµÐ»ÐµÑi ÐŽÐžÑÐµÐºÑÐŸÑÐžÑÐ»Ð°Ñ Ð±iÑ ÑÐ°Ð±ÑÐ»ÐŒÐ°ÒÐ°Ðœ.  
+exportcol.fail:exportcol.pl ÑÓÑÑi Ð±ÐŸÐ»ÐŒÐ°ÐŽÑ :  
+exportcol.no_valid_colls:Ð­ÐºÑÐ¿ÐŸÑÑ ÐœÐ°ÒÑÑÐ»Ñ ÐµÑÒÐ°ÐœÐŽÐ°Ð¹ ÐŽÐ° Ð¶Ð°ÑÐ°ÐŒÐŽÑ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐ»Ð°Ñ.  
+exportcol.couldnt_create_dir:ÐÐžÑÐµÐºÑÐŸÑÐžÑÐœÑ ÐŒÒ¯ÐŒÐºiÐœ ÐµÐŒÐµÑ Ð¶Ð°ÑÐ°Ñ %s.  
+exportcol.couldnt_create_file:ÐÒ¯ÐŒÐºiÐœ ÐµÐŒÐµÑ Ð¶Ð°ÑÐ°Ñ %s.  
+exportcol.instructions:Windows Ò¯ÑiÐœ Ó©Ð·ÐŽiÐ³iÐœÐµÐœ ÒÐŸÑÑÑÐœ CD-ROMÐœÑ Ð¶Ð°ÑÐ°Ð»Ñ Ò¯ÑiÐœiÑiÐœÐŽÐµÐ³i Ð±Ò±Ð» Ð¿Ð°Ð¿ÐºÐ°Ð»Ð°Ñ CD-ROMÒÐ° Ð¶Ð°Ð·ÑÐ¿ Ð°Ð»ÑÒ£ÑÐ·.  
+exportcol.non_exist_files:ÐÐµÐ»ÐµÑi ÒÐ°Ð¶ÐµÑÑi ÑÐ°Ð¹Ð»ÐŽÐ°Ñ Ð¶ÓÐœÐµ ÐŽÐžÑÐµÐºÑÐŸÑÐžÑÐ»Ð°Ñ ÐºÓ©Ð¿ÑiÒ£ Ð±iÑi Ð±Ð°Ñ Ð±ÐŸÐ»ÐŒÐ°Ð¹ÐŽÑ :  
+exportcol.success:exportcol.pl Ð¶Ò¯ÑÐ³ÐµÐœi :  
+exportcol.output_dir:ÐšÐµÑÐºÐµ ÑÑÒÐ°ÑÑÐ»Ð°ÑÑÐœ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐ»Ð°Ñ (%s) Ð±ÐŸÐ»Ð°ÐŽÑ %s.  
+exportcol.export_coll_not_installed:Ð€ÑÐœÐºÑÐžÐŸÐœÐ°Ð»ÐŽÑÒ ÐŒÒ¯ÐŒÐºiÐœÐŽiÐºÑÐµÑ CD-ROMÒÐ° ÑÐµÑÐºÐµ ÑÑÒÐ°ÑÑÑÐœ ÐŸÑÐœÐ°ÑÑÐ»ÐŒÐ°ÐŽÑ.  
+
+# -- import.pl --
+
+import.archivedir:ÒÐ°Ð¹ÐŽÐ° ÐµÑÐºiÐœ Ð°ÑÐŽÐ°ÑÑÐ»ÒÐ°Ðœ ÐŒÐ°ÑÐµÑÐžÐ°Ð»ÐŽÑ Ð±iÑÐµÐŽi Ð±iÑÐµÐŽi.  
+
+import.manifest:ÒÐ°Ð¹ Ð°Ð¹ÒÑÐœÐŽÐ°Ð¹ÑÑÐœÑÐœ, ÑÐ°Ð¹Ð»ÐŽÐ°Ñ ÐœÐµÑÐºÐµÐœ ÑÐ°Ð¿ ÐžÐŒÐ¿ÐŸÑÑ Ð¶Ð°ÑÐ°ÑÑ ÐºÐµÑÐµÐº Ð±ÐŸÐ»ÒÐ°ÐœÑÐœ XML - ÑÐ°Ð¹Ð». ÐÐŒÐ¿ÐŸÑÑÑÑÒ£ Ð¿Ð°Ð¿ÐºÐ°ÑÑÐœÑÒ£ ÑÐµÐºÑÑÑÐžÑ Ð°ÑÐ°Ð»Ð°Ð¿ ÑÑÒÑÑ ÐŸÑÑÐœÑÐœÐ° ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÐŽÑ, ÐœÐµÐ³iÐ·iÐœÐŽÐµ, Ð°Ð¹ÑÐ¿ ÑÐ°ÒÑ ÒÒ±ÑÐ°ÑÑÑÑÑÑÐœÐ°.  
+
+import.cannot_open_stats_file:ÐÑÐºÐµÑÑÑ : ÐÒ¯Ð¹ÐŽi ÑÐ°Ð¹Ð»ÐŽÑ ÐŒÒ¯ÐŒÐºiÐœ ÐµÐŒÐµÑ Ð°ÑÑ%s.  
+
+import.cannot_open_fail_log:ÒÐÐ¢Ð : Ð¢iÑÐºÐµÑ ÑÐ°Ð¹Ð»Ñ Ð°ÑÐ° Ð°Ð»ÐŒÐ°ÐŽÑ %s  
+
+import.cannot_sort:ÐÑÐºÐµÑÑÑ : import.pl ÑÑÑÐ°Ð»Ñ 1. sortmeta-Ñi ÑÐŸÐ¿ÑÑÒ£ Ó©Ð»ÑÐµÐŒ ÒÒ±Ð¶Ð°ÑÑÐ°Ñ iÑiÐºÑÐµÐ¹ Ð°Ð»ÐŒÐ°Ð¹ÐŽÑIÑiÐºÑÐµÑÐŽi ÐŸÐ¿ÑÐžÑ ÐµÐ»ÐµÐœÐ±ÐµÐ¹ÐŽi.  
+
+import.collectdir:ÐÐŸÐ»Ð»ÐµÐºÑÐžÑÐœÑÒ£ ÐŽÐžÑÐµÐºÑÐŸÑÐžÑÑÑ.  
+
+import.complete:ÐÐŒÐ¿ÐŸÑÑ Ð±iÑiÑÐ³ÐµÐœ  
+
+import.debug:STDOUTÒÐ° ÐžÐŒÐ¿ÐŸÑÑÑÐ°Ð»ÒÐ°Ðœ ÐŒÓÑiÐœÐŽi Ð¶Ð°Ð·ÑÐ¿ Ð°Ð»Ñ.  
+
+import.desc:PERL ÒÒ±ÑÐ°ÑÑÑÑÑÒÐ° ÐŽÐ°Ð¹ÑÐœ GMLÐœÑÒ£ ÒÐ°Ð»ÑÐ±ÑÐœÐ° ÑÐ°Ð¹Ð»ÐŽÐ°ÑÐŽÑÒ£ ÐžÐŒÐ¿ÐŸÑÑÑÐ°ÑÑÐœÐ° ÐŽÐ°Ð¹ÑÐœ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÑÑÐœ ÑÐºÑÐžÐ¿Ñ.  
+
+import.faillog:Ð€Ð°Ð¹Ð» Ð°ÑÑÐœÑÒ£ ÑÓÑÑiÐ· ÑiÑÐºÐµÑi. ÐÒ±Ð» ÑiÑÐºÐµÑ Ð¶ÑÑÐœÐ°Ð»ÑÐŽÑ Ð°Ð»Ð°ÐŽÑ Ó©Ò£ÐŽÐµÐ»Ðµ Ð°Ð»ÐŒÐ°ÒÐ°Ðœ ÐºÐµÐ· ÐºÐµÐ»Ð³ÐµÐœ ÑÐ°Ð¹Ð»ÐŽÐ°Ñ ÑÐ°Ð¹Ð» Ð°ÑÑ.  
+
+import.groupsize:ÐiÑ XML ÑÐ°Ð¹Ð»ÒÐ° ÑÐŸÐ¿ÑÐ°ÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐžÐŒÐ¿ÐŸÑÑÑÐ°Ð»Ð°ÑÑÐœ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÐŽÑÒ£ ÑÐ°ÐœÑ.  
+
+import.gzip:(ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ ÒÑÑÑÐ»ÒÐ°Ðœ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÑÐœÐ°Ðœ Ð¶Ð°ÑÐ°Ð»Ð°ÑÑÐœÐŽÐ° ÐÐ»Ð°Ð³ÐžÐœÐŽÐµÑÐŽiÒ£ ÑiÐ·ÐŽiÒ£ ÑiÐ·iÐŒiÒ£iÐ·iÐœÐµ ZIPPlug ÒÐŸÑÑÒÐ° Ò±ÐŒÑÑÐ¿Ð°Ò£ÑÐ· ) ÒÒ±Ð¶Ð°ÑÑÐ°ÑÐŽÑÒ£ ÒÐŸÑÑÑÑÐœÐŽÑ xmlÐŽÐ°ÑÑÐœÑÒ£ ÒÑÑÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ gzipÐœi ÒÐŸÐ»ÐŽÐ°ÐœÑ.  
+
+import.importdir:ÒÐ°Ð¹ÐŽÐ° Ð±Ð°ÑÑÐ°Ð¿ÒÑ ÐŒÐ°ÑÐµÑÐžÐ°Ð»ÐŽÐ° Ð±ÐŸÐ»Ð°ÐŽÑ.  
+
+import.incremental:Ð¢ÐµÐº ÒÐ°ÐœÐ° ÑÐŸÐ» Ð°ÑÑ
+ÐžÐ²ÑÐ°ÒÑ Ð°ÒÑÐŒÐŽÐ°ÒÑ ÑÐ°Ð¹Ð»ÒÐ° ÒÐ°ÑÐ°ÒÐ°ÐœÐŽÐ° (ÑÐ°ÒÑÑÑÐ° Ð±ÐµÐ»Ð³i Ð±ÐŸÐ¹ÑÐœÑÐ° ) Ð¶Ð°Ò£Ð°ÑÐ°Ò ÒÒ±Ð¶Ð°ÑÑÐ°ÑÐŽÑ ÐžÐŒÐ¿ÐŸÑÑÑÐ°Ñ. ÒÐŸÑÐ°ÐŽÑ - keepold.  
+
+import.keepold:ÐÑÑ
+ÐžÐ²Ñi ÐŽÐžÑÐµÐºÑÐŸÑÐžÑÐœÑÒ£ Ð°ÒÑÐŒÐŽÐ°ÒÑ ÐŒÐ°Ð·ÐŒÒ±ÐœÑ ÒÒ±ÑÑÐ¿Ð°Ð¹ÐŽÑ.  
+
+import.maxdocs:ÐÐŒÐ¿ÐŸÑÑÑÐ°ÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÐŽÑÒ£ ÐŒÐ°ÐºÑÐžÐŒÐ°Ð» ÑÐ°ÐœÑ.  
+
+import.no_import_dir:ÒÐÐ¢Ð : ÐžÐŒÐ¿ÐŸÑÑÑÑÒ£ ÑiÐ·Ð±ÐµÑi (%s) ÑÐ°Ð±ÑÐ»ÐŒÐ°ÒÐ°Ðœ.  
+
+import.no_plugins_loaded:ÒÐÐ¢Ð : ÐÑÒÐ°ÐœÐŽÐ°Ð¹ ÐŽÐ° ÐÐ»Ð°Ð³ÐžÐœÐŽÐµÑ Ð¶Ò¯ÐºÑÐµÐ»ÐŒÐµÐ³ÐµÐœ.  
+
+import.OIDtype:ÓÐŽiÑ ÓÑÐ±iÑ ÒÒ±Ð¶Ð°ÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÑÐžÑÐµÐº ÐºÐµÐ·ÐŽÐµÑÐµÑiÐœ ÐžÐŽÐµÐœÑÐžÑÐžÐºÐ°ÑÐŸÑÐ»Ð°ÑÐŽÑÒ£ ÑÑÒÐ°ÑÑÑÐœÐŽÐ° ÒÐŸÐ»ÐŽÐ°ÐœÑ.  
+import.OIDtype.hash:Ð€Ð°Ð¹Ð»ÐŽÑÒ£ ÐŒÐ°Ð·ÐŒÒ±ÐœÑÐœÑÒ£ Ñ
+ÐµÑÐžÑÐ»ÐµÑi. ÒÒ±Ð¶Ð°ÑÑÑÒ£ ÐžÐŽÐµÐœÑÐžÑÐžÐºÐ°ÑÐŸÑÑ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐœÑ ÐžÐŒÐ¿ÐŸÑÑÑÐ°Ð¹ÑÑÐœÐŽÐ° ÓÑÐŽÐ°Ð¹ÑÐŒÑÒÐ° ÑÐŸÐ»Ð°ÑÑÐœ Ð±ÐŸÐ»Ð°ÐŽÑ.  
+
+import.OIDtype.incremental:ÐÑÐ»ÐŽÐ°ÐŒÑÑÐ°ÒÑÐ°ÑÐŽÑ ÐµÐŽÓÑiÑ Ð±ÐŸÐ»ÑÐ¿ ÑÐ°Ð±ÑÐ»ÒÐ°Ðœ "Ñ
+ÐµÑÐžÑÐ»ÐµÑ" ÒÒ±Ð¶Ð°ÑÑÐ°ÑÑÐœÑÒ£ ÐµÑÐµÐ¿ÑÐµÑi ÑÒ±ÑÑÐ¿ ÒÐ°Ð». ÐÒ±Ð» ÒÒ±Ð¶Ð°Ñ ÐŒÓÐ»iÐŒÐµÑÐºÐµ ÐžÐŽÐµÐœÑÐžÑÐžÐºÐ°ÑÐŸÑ ÑÐŸÐ»ÐŽÑ ÓÑÐŽÐ°Ð¹ÑÐŒ ÑÐ°ÒÐ°Ð¹ÑÐœÐŽÐ°Ð»ÒÐ°Ðœ, ÑÓÑiÐ·ÐŽÐµÐœÐŽÐµÑiÐœÐµ ÐºÐµÐ¿iÐ»ÐŽiÐº Ð±ÐµÑÐŒÐµÐ¹ÐŽi xml ÒÐ°Ð·iÑÐ³i Ð°ÑÑ
+ÐžÐ²ÑÐ°ÑÒÐ° Ò¯ÑÑÐµÐ»i ÐºÐµÐ»ÐµÑi ÒÒ±Ð¶Ð°ÑÑÐ°ÑÑÐœÐ° ÐŒÒ¯ÐŒÐºiÐœÐŽiÐº Ð±ÐµÑÐµÐŽi.  
+
+import.OIDtype.assigned: ÒÒ±Ð¶Ð°ÑÑÑÒ£ ÐžÐŽÐµÐœÑÐžÑÐžÐºÐ°ÑÐŸÑÑÐœÑÒ£ ÑÐµÑiÐœÐŽÐµÑiÐœiÒ£ dc.IdentifierÐŽiÒ£ Ó©ÑiÑiÐœÐµ 'D' Ð¿Ð»ÑÑ ÐŒÓÐœÐŽi ÒÐŸÐ»ÐŽÐ°ÐœÐ°ÐŽÑ. Dc.Identifiers Ó©ÑiÑ Ð±ÐŸÐ»ÑÑ ÐºÐµÑÐµÐº. ÐÐ³ÐµÑ dc.Identifier ÒÒ±Ð¶Ð°ÑÑÑÒ£ ÐŒÓÐ»iÐŒÐµÑiÐœÐµ ÑÐŸÐ»ÑÑÑÑÐ»ÐŒÐ°ÑÐ°, Ð°Ð»ÐŒÐ°ÑÑÑÑÒÑÑ ÑÐµÑiÐœÐŽÐµÐŽi ÐžÑÐ¿ÐŸÐ»ÑÐ· Ð±ÐŸÐ»Ð°ÐŽÑ  
+
+import.OIDtype.dirname: 'J'  Ð¿Ð»ÑÑ as the identifierÐŽiÒ£ Ð°ÐœÐ°Ð»ÑÒ Ð¿Ð°Ð¿ÐºÐ°ÑÑÐœ ÒÐŸÐ»ÐŽÐ°ÐœÐ°ÐŽÑ. ÓÑÐ±iÑ Ð¿Ð°Ð¿ÐºÐ°ÐŽÐ°ÒÑ ÐŸÐ» Ò¯ÑiÐœÐŽÐµÑi ÑÐ°Ð¹Ð» Ð±iÑ-Ð°Ò Ð±ÐŸÐ»ÑÑ ÐºÐµÑÐµÐº, ÐŸÐœÑÒ£ Ð°ÑÐ°ÑÑ . E.g. import/b13as/h15ef/page.html Jh15efÑiÒ£ ÐžÐŽÐµÐœÑÐžÑÐžÐºÐ°ÑÐŸÑÑ Ð±iÑÐŒÓÐœÐŽi Ð°Ð»ÒÐ°Ðœ Ð±ÐŸÐ»ÑÑ ÐºÐµÑÐµÐº..  
+
+import.OIDmetadata:ÒÒ±Ð¶Ð°ÑÑÑÒ£ ÑÐžÑÐµÐº ÐºÐµÐ·ÐŽÐµÑÐµÑiÐœ ÐžÐŽÐµÐœÑÐžÑÐžÐºÐ°ÑÐŸÑÑÐœÐŽÐ° Ð±ÐŸÐ»Ð°ÑÑÐœ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ ÑÐ»ÐµÐŒÐµÐœÑi, ÒÐŸÐ»ÐŽÐ°ÐœÑÒÐ°- OIDtype=assignedÐºÓ©ÑÑÐµÑÐµÐŽi .  
+
+import.saveas:ÒÐ°Ð»ÑÐ¿ ÐœÐµÑÐºÐµÐœ Ð°ÑÑ
+ÐžÐ²ÑÑ ÑÑÒÐ°ÑÑ. GA Ò¯ÐœÐŽÐµÐŒÐµÑ Ð±ÐŸÐ¹ÑÐœÑÐ°Ð»Ð°Ñ.  
+
+import.out:Ð€Ð°Ð¹Ð» Ð°Ñ ÐœÐµÐŒÐµÑÐµ ÐŽÐµÐŒÐ°Ð»ÑÑ ÐŒÓÑÑÐµÐ±ÐµÑiÐœiÒ£ Ð¶Ð°Ð·ÑÑÐœÐ° ÐžÐœÐŽÐµÐºÑ.  
+
+import.params:Ð°ÑÐ°Ñ [ÐŸÐ¿ÑÐžÑÐ»Ð°Ñ ] - ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž2âŠ  
+
+import.removeold:ÐÑÑ
+ÐžÐ²Ñi ÐŽÐžÑÐµÐºÑÐŸÑÐžÑÐœÑÒ£ ÐµÑÐºi ÐŒÐ°Ð·ÐŒÒ±ÐœÑ Ð°Ð»ÑÐ¿ ÑÐ°ÑÑÐ°Ð¹ÐŽÑ.  
+
+import.removing_archives:ÐÑÑ
+ÐžÐ²Ñi ÐŽÐžÑÐµÐºÑÐŸÑÐžÑÐœÑÒ£ Ð°ÒÑÐŒÐŽÐ°ÒÑ ÐŒÐ°Ð·ÐŒÒ±ÐœÑÐœÑÒ£ Ð°Ð»ÑÐ¿ ÑÐ°ÑÑÐ°ÑÑ ..  
+
+import.removing_tmpdir:ÐÒ±Ð» ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ "tmp" Ð¿Ð°Ð¿ÐºÐ°ÑÑÐœÑÒ£ ÐŒÐ°Ð·ÐŒÒ±ÐœÑÐœÑÒ£ Ð°Ð»ÑÐ¿ ÑÐ°ÑÑÐ°ÑÑ ..    
+
+import.reversesort:ÐÐµÑi ÑÐµÑÑÐµÐ³i iÑiÐºÑÐµÑ. ÐÐ¿ÑÐžÑ - sortmeta ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÐŽÑ  
+
+import.site:(3 Ð±ÐŸÐ»Ð¶Ð°ÐŒÐœÑÒ£ ÐÑÐžÐœÑÑÐŸÑÐœÑÐœÑÒ£ ÒÐŸÑÑÐœÐ° ) ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐ»Ð°ÑÑ Ð±Ð°Ñ ÐŽÐžÑÐµÐºÑÐŸÑÐžÑÐœÑÒ£ iÐ·ÐŽÐµÑÑiÑÑÐ³Ðµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÑÐ°Ð¹Ñ  
+
+import.sortmeta:ÐÐŸÐ»Ð»ÐµÐºÑÐžÑÐœÑÒ£ ÒÒ±ÑÐ°ÑÑÑÑÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ Ð°Ð»ÑÐ°Ð²ÐžÑ ÑÐµÑiÐœÐŽÐµÑiÐœÐŽÐµÐ³i ÒÒ±Ð¶Ð°ÑÑÐ°ÑÑ iÑiÐºÑÐµÑ. ÐÒ¯Ð» ÑÒ±ÑÐ°Ñ ÑÐ°Ð»ÑÐ»Ð°ÑÑÐœ iÐ·ÐŽÐµÑÑiÑÑÐŽiÒ£ ÐœÓÑÐžÐ¶ÐµÐ»ÐµÑi ÑÐµÑ Ð±Ò±Ð»Ð°ÑÐŽÑ Ð±ÐµÑiÐ»ÐµÐŽi. ÐÐ³ÐµÑ Ð±iÑÐ»iÐº ÑÐŸÐ¿ÑÑÒ£ Ó©Ð»ÑÐµÐŒi ÐºÓ©Ð±iÑÐµÐº Ð±ÐŸÐ»ÑÐ°, Ð±Ò±Ð» ÒÐŸÑÑÐ°ÑÒÐ° Ð°Ð»Ð°ÐŽÑ.  
+
+import.statsfile:Ð€Ð°Ð¹Ð» Ð°Ñ ÐœÐµÐŒÐµÑÐµ ÐžÐŒÐ¿ÐŸÑÑÑÑÒ£ ÑÐ°ÐœÐ°ÒÑÐœÑÒ£ Ð¶Ð°Ð·ÑÑÐœÐ° ÐžÐœÐŽÐµÐºÑ.  
+
+import.stats_backup:ÐÒ±ÐœÑÒ£ ÐŸÑÑÐœÑÐœÐ° STDERRÒÐ° statsÑÑ Ð¶Ð°Ð·Ð°ÐŽÑ.  
+
+import.verbosity:ÓšÐœiÐŒÐœiÒ£ ÑÐ°ÐœÑÐŒÐµÐœ Ð±Ð°ÑÒÐ°ÑÑ. 0=ÐµÑÑÐµÒ£Ðµ, 3=Ò¯Ð»ÐºÐµÐœ ÑÐ°Ðœ.  
+
+# -- csv-usernames-to-db.pl
+
+cu2db.params:CVS [ÐŸÐ¿ÑÐžÑÐ»Ð°Ñ ] - ÑÐ°Ð¹Ð»  
+
+cu2db.field-separator:CSV ÑÐ°Ð¹Ð»ÑÐœÐŽÐ°ÒÑ Ó©ÑiÑÑÐµÑÐŽiÒ£ Ð±Ó©Ð»iÐœÑiÐœÐµ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÑÑÐœ ÐœÑÑÐ°ÐœÐŽÐ°ÑÐŽÑÒ£ Ð±Ð°ÒÑÐ»Ð°ÑÑ  
+
+cu2db.already-encrypted:ÐÐ³ÐµÑ CSV ÑÐ°Ð¹Ð»ÑÐœÐŽÐ°ÒÑ Ð¿Ð°ÑÐŸÐ»ÑÐ»ÐµÑi ÐµÐœÐŽi ÑÐžÑÑÐ»Ð°ÑÐ°Ò, Ð±Ò±Ð» ÒÐŸÐ»ÐŽÐ°ÐœÑÒ£ÑÐ·  
+
+
+
+# -- schedule.pl --
+schedule.deleted:ÐÐŸÐ»Ð»ÐµÐºÑÐžÑÒÐ° ÑÑÑÐµÑÑÐµÐ»Ð³ÐµÐœ ÐŸÑÑÐœÐŽÐ°Ñ Ð°Ð»ÑÐ°Ò  
+schedule.scheduled:ÐÐŸÐ»Ð»ÐµÐºÑÐžÑ Ð¶Ð°ÑÐ°Ð»ÒÐ°Ðœ ÑÑÐµÐœÐ°ÑÐžÐŽÑÒ£ ÐŸÑÑÐœÐŽÐ°ÑÑ  
+schedule.cron:Ð¡ÑÑÐµÑÑÐµÐ»Ð³ÐµÐœ ÐŸÑÑÐœÐŽÐ°Ñ - ÒÐŸÐ¹ÑÐ»ÒÐ°Ðœ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐ»Ð°ÑÒÐ°  
+schedule.params:[ÐŸÐ¿ÑÐžÑÐ»Ð°Ñ]  
+schedule.error.email:fromaddr toaddr emaili ÐºÐµÑÐµÐº Ð±ÐŸÐ»Ð°ÐŽÑ - Ð¶ÓÐœÐµ - Ð°ÐœÑÒÑÐ°ÑÑ ÐºÐµÑÐµÐº.  
+schedule.error.importbuild:import Ð¶ÓÐœÐµ - Ð°ÐœÑÒÑÐ°ÑÑ ÐºÐµÑÐµÐº.  
+schedule.error.colname:ÐÑ - colname ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐœÑÒ£ ÐºÓ©ÑÑÐµÑÑi ÐºÐµÑÐµÐº ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÐŽÑ.  
+schedule.gli:ÐiÑÐ°Ð¿Ñ
+Ð°ÐœÐ°Ð»ÑÒ ÐžÐœÑÐµÑÑÐµÐ¹Ñ - GLI iÑÐºÐµ ÒÐŸÑÑÑ  
+schedule.frequency:ÒÐ°Ð»Ð°Ð¹ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐœÑ Ð¶Ðži Ð°Ð²ÑÐŸÐŒÐ°ÑÑÑ ÒÐ°Ð¹ÑÐ°ÐŽÐ°Ðœ ÒÐ°Ð¹ÑÐ° ÑÐ°Ð»Ñ  
+schedule.frequency.hourly:ÓÑÐ±iÑ ÑÐ°ÒÐ°ÑÑÑ ÒÐ°Ð¹ÑÐ° ÑÐ°Ð»Ñ  
+schedule.frequency.daily:ÐÒ¯ÐœÐ±Ðµ-ÐºÒ¯ÐœÐŽi ÒÐ°Ð¹ÑÐ° ÑÐ°Ð»Ñ  
+schedule.frequency.weekly:ÓÑÐ±iÑ Ð°Ð¿ÑÐ°ÐœÑ ÒÐ°Ð¹ÑÐ° ÑÐ°Ð»Ñ  
+schedule.action:ÒÐ°Ð»Ð°Ð¹ Ð°Ð²ÑÐŸÐŒÐ°ÑÑÑ ÒÐ°Ð¹ÑÐ°ÐŽÐ°Ðœ ÒÒ±ÑÐ°ÑÑÑÑÑÐŽÑ ÐºÒ¯Ð¹Ð³Ðµ ÐºÐµÐ»ÑiÑÑ  
+schedule.action.add:ÐÐ²ÑÐŸÐŒÐ°ÑÑÑ ÒÐ°Ð¹ÑÐ°ÐŽÐ°Ðœ ÒÒ±ÑÐ°ÑÑÑÑÑÐŽÑ ÐºÐµÑÑÐµÐ»ÐµÑ  
+schedule.action.update:ÐÐµÑÑÐµ Ð±Ð°Ñ Ð¶Ð°Ò£Ð°ÑÑÑ  
+schedule.action.delete:ÐÐµÑÑÐµ Ð±Ð°Ñ Ð°Ð»ÑÐ¿ ÑÐ°ÑÑÐ°Ñ  
+schedule.email:Email Ð±ÐŸÐ¹ÑÐœÑÐ° ÐµÑÐºÐµÑÑÑÐŽi Ð¶iÐ±ÐµÑÑ  
+schedule.schedule:ÐÐŸÑÐ¿Ð°ÑÐ»Ð°Ð»ÒÐ°Ðœ Ð°Ð²ÑÐŸÐŒÐ°ÑÑÑ ÒÒ±ÑÐ°ÑÑÑÑÑÐŽÑ Ð¶Ð°ÑÐ°ÑÒÐ° ÑÐ°Ò£ÐŽÐ°Ò£ÑÐ·  
+schedule.colname:Ò®ÑiÐœ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÑÑÐœÑÒ£ Ð°ÑÑ ÒÐ°Ð¹ ÐºÐµÑÑÐµ Ð¶ÐŸÑÐ¿Ð°ÑÐ»Ð°ÒÐ°Ðœ  
+schedule.import:ÐÐŒÐ¿ÐŸÑÑÑÑÒ£ ÐºÐŸÐŒÐ°ÐœÐŽÐ°ÑÑ ÐºÐµÑÑÐµÐ³Ðµ ÒÐŸÑÑÑ ÐºÐµÑÐµÐº  
+schedule.build:Buildcol ÐºÐŸÐŒÐ°ÐœÐŽÐ° ÐºÐµÑÑÐµÐ³Ðµ ÒÐŸÑÑÐ»Ð°ÐŽÑ  
+schedule.toaddr:ÐiÐŒÐ³Ðµ ÑÐ»ÐµÐºÑÑÐŸÐœÐŽÑÒ Ð¿ÐŸÑÑÐ°ÑÑÐœÑÒ£ ÐŒÐµÐºÐµÐœÐ¶Ð°Ð¹Ñ ÒÒ±ÑÐ°ÑÑÑÑÑ ÑÑÑÐ°Ð»Ñ ÐµÑÐºÐµÑÑÑÐŽi Ð¶iÐ±ÐµÑÑ  
+schedule.toaddr.default:Ð€Ð°Ð¹Ð»ÐŽÑÒ£ ÐŒÓÐ·iÑÐ³Ðµ ÒÐŸÐ»ÐŽÐ°ÐœÑÑÑÐ»Ð°ÑÐŽÑÒ£ ÑÐ»ÐµÐºÑÑÐŸÐœÐŽÑÒ Ð¿ÐŸÑÑÐ°ÐœÑÒ£ ÐŒÐµÐºÐµÐœÐ¶Ð°Ð¹ÑÐœÑÒ£ ÐºÓ©ÑÑÐµÑiÒ£iÐ· - ÐºÒ¯Ð¹Ð³Ðµ ÐºÐµÐ»ÑiÑÑ  
+schedule.fromaddr:Email Ð¶iÐ±ÐµÑÑÑi  
+schedule.fromaddr.default:ÐiÐŒ Ð°ÐœÑÒÑÐ°Ò£ÑÐ· main.cfgÐ³Ðµ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÑÑÐœÑÒ£ ÒÐŸÐ»ÐŽÐ°ÑÑÐŒÐµÐœ ÑÒ±ÒÑÐ»ÐŽÐ°ÐœÐ°ÐŽÑ  
+schedule.smtp:Ð­Ð»ÐµÐºÑÑÐŸÐœÐŽÑÒ Ð¿ÐŸÑÑÐ°ÒÐ° ÒÐ°Ð¶ÐµÑÑi sendmailÐŽiÒ£ Ð¿ÐŸÑÑÐ°Ð»ÑÒ ÑÐµÑÐ²ÐµÑi ÒÐ°Ð¶ÐµÑÑi  
+schedule.smtp.default:MailServer main.cfgÐ³Ðµ ÐºÓ©ÑÑÐµÑiÒ£iÐ·  
+schedule.out:ÒÐ°Ð¹ÐŽÐ° ÑÐ°Ð¹Ð» Ð°ÑÑ ÐŒÓÑÑÐµÐ±ÐµÐœi Ð±Ð°ÑÐ¿Ð°ÒÐ° ÑÑÒÐ°ÑÑÒÐ° ÐºÓ©ÑÑÐµÑiÒ£iÐ·.  
+# -- export.pl --
+
+export.exportdir:ÒÐ°Ð¹ÐŽÐ° ÑÐµÑÐºÐµ ÑÑÒÐ°ÑÑÐ»ÒÐ°Ðœ ÐŒÐ°ÑÐµÑÐžÐ°Ð»ÐŽÐ° Ð±ÐŸÐ»Ð°ÐŽÑ.  
+
+export.cannot_open_stats_file:Ð«ÒÑÐ»Ð°Ñ : Ð¡ÑÐ°ÑÑ ÑÐ°Ð¹Ð»ÐŽÑ ÐŒÒ¯ÐŒÐºiÐœ ÐµÐŒÐµÑ Ð°ÑÑ %s  
+
+export.cannot_open_fail_log:ÒÐÐ¢Ð : Ð¡Ð°Ð¹ ÑÐ°Ð¹Ð»ÐŽÑ ÐŒÒ¯ÐŒÐºiÐœ ÐµÐŒÐµÑ Ð°ÑÑ %s  
+
+export.cannot_sort:Ð«ÒÑÐ»Ð°Ñ : ÐµÐ³ÐµÑ 1-Ñi ÑÐŸÐ¿ÑÑÒ£ Ó©Ð»ÑÐµÐŒ Ð±ÐŸÐ»ÑÐ°, export.pl ÒÒ±Ð¶Ð°ÑÑÐ°Ñ iÑiÐºÑÐµÐ¹ Ð°Ð»ÐŒÐ°Ð¹ÐŽÑ. ÐÐµÑÐ° - iÑiÐºÑÐµÑÐŽi ÐŸÐ¿ÑÐžÑÐœÑ ÐµÐ»ÐµÐŒÐµÐ¹ÐŽi.  
+
+export.collectdir:"Collect" ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐœÑÒ£ ÐŽÐžÑÐµÐºÑÐŸÑÐžÑÑÑÐœÐ° Ð¶ÐŸÐ»Ñ.  
+
+export.complete:Ð­ÐºÑÐ¿ÐŸÑÑÐžÑÐŸÐ²Ð°ÐœÑ Ð±iÑiÑÐ³ÐµÐœ.  
+
+export.debug:(GreenstoneXMLÒÐ° ÑÐµÑÐºÐµ ÑÑÒÐ°ÑÑÑÐœÐ° ) STDOUTÒÐ° ÑÐµÑÐºÐµ ÑÑÒÐ°ÑÑÐ»ÒÐ°Ðœ ÐŒÓÑiÐœÐŽi ÑÑÒÐ°ÑÑ.  
+
+export.desc:Ð±Ð°ÑÒÐ° ÒÐ°Ð»ÑÐ¿ÒÐ° ÐÑÐžÐœÑÑÐŸÐœÒÐ° ÑÐ°Ð¹Ð»ÐŽÐ°ÑÐŽÑÒ£ ÑÐµÑÐºÐµ ÑÑÒÐ°ÑÑÑÐœÐ° PERL ÑÐºÑÐžÐ¿Ñ.  
+
+export.faillog:Ð€Ð°Ð¹Ð»ÐŽÑÒ£ Ð°ÑÐ°ÑÑ ÑÐ°Ð¹ÒÐ° Ð¶Ð°Ð·ÑÐ¿ Ð°Ð»ÑÒÐ° ÑÓÑi ÑÒ¯ÑÐ¿ÐµÐŽi. ÐÒ±Ð» ÑÐ°Ð¹ iÑÑÐµÐ¹ Ð°Ð»ÐŒÐ°ÐŽÑ ÐµÐ³iÐ» ÑÐ°Ð¹Ð»ÐŽÐ°ÑÐŽÑÒ£ Ð°ÑÐ°ÑÑÐœ Ð¶Ð°Ð·Ð°ÐŽÑÒ¯ÐœÐŽÐµÐŒÐµÑ Ð±ÐŸÐ¹ÑÐœÑÐ° Ð¶ÐŸÐ» : collectdir/collect/collname/etc/fail.log  
+
+export.groupsize:ÐiÑ XML ÑÐ°Ð¹Ð»ÐŽÐ°ÒÑ ÑÐŸÐ¿ÑÐ°ÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÐŽÑÒ£ ÑÐ°ÐœÑ.  
+
+export.gzip:(ÑiÐ·ÐŽiÒ£ ÐÐ»Ð°Ð³ÐžÐœÐŽÐµÑiÒ£iÐ·ÐŽiÒ£ ÑiÐ·iÐŒiÐœÐµ ZIPPlug ÒÒ±Ð¶Ð°ÑÑÐ°ÑÐŽÑÒ£ ÒÑÑÑÑÐœÐ°Ðœ ÒÒ±ÑÐ°ÑÑÑÑÑÐŽÐ° ÒÐŸÑÑÒÐ° Ò±ÐŒÑÑÐ¿Ð°Ò£ÑÐ· ) ÒÒ±Ð¶Ð°ÑÑÐ°ÑÐŽÑÒ£ ÒÐŸÑÑÑÑÐœÐŽÑ xmlÐŽÐ°ÑÑÐœÑÒ£ ÒÑÑÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ gzipÐœiÒ£ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐ°ÑÑÐœ ÒÐŸÐ»ÐŽÐ°ÐœÑ.  
+
+export.importdir:ÒÐ°Ð¹ÐŽÐ° Ð±Ð°ÑÑÐ°Ð¿ÒÑ ÐŒÐ°ÑÐµÑÐžÐ°Ð»ÐŽÐ° Ð±ÐŸÐ»Ð°ÐŽÑ.  
+
+export.keepold:ÐšÐµÑÐºÐµ ÑÑÒÐ°ÑÑÐ»ÒÐ°Ðœ ÐŽÐžÑÐµÐºÑÐŸÑÐžÑÐœÑÒ£ ÐŸÑÑ ÐŒÐ°Ð·ÐŒÒ±ÐœÑÐœ Ð¶ÐŸÐ¹ÐŒÐ°Ð¹ÐŽÑ.  
+
+export.maxdocs:Ð­ÐºÑÐ¿ÐŸÑÑ ÒÐŸÐ»Ð°Ð¹Ð»Ñ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÐŽÑÒ£ ÐŒÐ°ÐºÑÐžÐŒÐ°Ð» ÑÐ°ÐœÑ.  
+
+export.listall:Ð¡Ð°ÒÑÐ°ÑÐŽÑÒ£ Ð±Ð°ÑÐ»ÑÒ ÒÐ°Ð»ÑÐ¿ÑÐ°ÑÑÐœÑÒ£ ÐºÓ©ÑÑÐµÑÑ  
+
+export.saveas:ÒÐ°Ð»ÑÐ¿ ÐœÐµÑÐºÐµÐœ ÑÐµÑÐºÐµ ÑÑÒÐ°ÑÑ.  
+
+export.saveas.DSpace:DSpace Archive ÒÐ°Ð»ÑÐ¿.  
+
+export.saveas.GreenstoneMETS:ÐÑÐžÐœÑÑÐŸÑÐœÐœÑÒ£ Ð¿ÑÐŸÑÐžÐ»ÑÑiÐœiÒ£ ÒÐŸÐ»ÐŽÐ°ÐœÑÑÐŒÐµÐœ METS ÒÐ°Ð»ÑÐ¿.  
+export.saveas.FedoraMETS:FedoraÐŽÑÒ£ Ð¿ÑÐŸÑÐžÐ»ÑÑiÐœiÒ£ ÒÐŸÐ»ÐŽÐ°ÐœÑÑÐŒÐµÐœ METS ÒÐ°Ð»ÑÐ¿.  
+
+export.saveas.GreenstoneXML:ÐÑÐžÐœÑÑÐŸÑÐœÐœÑÒ£ XML Ð°ÑÑ
+ÐžÐ²ÑÐœÑÒ£ ÒÐ°Ð»ÑÐ±Ñ  
+
+export.saveas.MARCXML:(XML - MARC 21-Ñi Ð±ÐŸÐ»Ð¶Ð°ÐŒ ) MARC XML ÒÐ°Ð»ÑÐ¿  
+
+export.out:Ð€Ð°Ð¹Ð»ÐŽÑÒ£ Ð°ÑÐ°ÑÑ ÐœÐµÐŒÐµÑÐµ ÒÐŸÑÑÑÑÐœÐŽÑÐœÑÒ£ ÐŒÓÑÑÐµÐ±ÐµÑiÐœ Ð¶Ð°Ð·ÑÐ¿ Ð°Ð»ÒÐ°Ðœ ÐŸÐœÑÒ£ ÐžÐŽÐµÐœÑÐžÑÐžÐºÐ°ÑÐŸÑÑ.  
+
+export.params:Ð°ÑÐ°Ñ [ÐŸÐ¿ÑÐžÑÐ»Ð°Ñ ] - ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž2âŠ  
+
+export.removeold:ÐšÐµÑÐºÐµ ÑÑÒÐ°ÑÑÐ»ÒÐ°Ðœ ÐŽÐžÑÐµÐºÑÐŸÑÐžÑÐœÑÒ£ ÐµÑÐºi ÐŒÐ°Ð·ÐŒÒ±ÐœÑ Ð°Ð»ÑÐ¿ ÑÐ°ÑÑÐ°Ð¹ÐŽÑ.  
+
+export.removing_export:ÐšÐµÑÐºÐµ ÑÑÒÐ°ÑÑÐ»ÒÐ°Ðœ ÐŽÐžÑÐµÐºÑÐŸÑÐžÑÐœÑÒ£ ÐŸÑÑ ÐŒÐ°Ð·ÐŒÒ±ÐœÑÐœÑÒ£ Ð°Ð»ÑÐ¿ ÑÐ°ÑÑÐ°ÑÑ ..  
+
+export.sortmeta:ÐÐŸÐ»Ð»ÐµÐºÑÐžÑÐœÑÒ£ ÒÒ±ÑÐ°ÑÑÑÑÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ ÒÐŸÐ»ÐŽÐ°ÐœÑÑÐŒÐµÐœ Ð°Ð»ÑÐ°Ð²ÐžÑ ÑÐµÑiÐœÐŽÐµÐŽÐµÐ³i ÒÒ±Ð¶Ð°ÑÑÐ°ÑÑ iÑiÐºÑÐµÑ. ÐÐ³ÐµÑ 1-Ñi ÑÐŸÐ¿ÑÑÒ£ Ó©Ð»ÑÐµÐŒ Ð±ÐŸÐ»ÑÐ°, Ð±Ò±Ð» ÒÐŸÑÑÐ°ÑÒÐ° Ð°Ð»Ð°ÐŽÑ.  
+
+export.statsfile:Ð€Ð°Ð¹Ð»ÐŽÑÒ£ Ð°ÑÐ°ÑÑ ÐœÐµÐŒÐµÑÐµ ÑÐºÑÐ¿ÐŸÑÑÑÑÒ£ ÑÐ°ÐœÐ°ÒÑÐ°ÑÑÐœ Ð¶Ð°Ð·ÑÐ¿ Ð°Ð»ÒÐ°Ðœ ÐŸÐœÑÒ£ ÐžÐŽÐµÐœÑÐžÑÐžÐºÐ°ÑÐŸÑÑ.  
+
+export.stats_backup:(ÒÐÐ¢ÐÐ»ÐµÑÐŽiÒ£ Ñ
+Ð°ÑÑÐ°ÐŒÐ°ÑÑ ) STDERRÒÐ° ÐŸÑÐœÑÐœÐ° ÑÑÒÐ°ÑÐ°ÐŽÑ.  
+
+export.verbosity:ÒÐŸÑÑÑÑÐœÐŽÑÐœÑÒ£ ÐºÐŸÐ»Ð»ÐžÑÐµÑÑÐ²ÐŸÑÑ ÑÐµÐºÑÐµÑÐµÐŽi . 0= ÐµÑÑÐµÒ£Ðµ, 3= ÐºÓ©Ð¿.  
+
+
+
+# -- mkcol.pl --
+
+mkcol.about:ÐÐŸÐ»Ð»ÐµÐºÑÐžÑÐ»Ð°Ñ Ò¯ÑiÐœ ÐŒÓÑiÐœ ÑÑÑÐ°Ð»Ñ.  
+
+mkcol.bad_name_cvs:ÒÐÐ¢Ð : ÐÒ±Ð» CVSÑÑÒ£ Ð±ÐŸÐ»Ð¶Ð°ÐŒ Ð¶Ð°ÑÐ°Ð»ÒÐ°Ðœ Ð¶Ò¯Ð¹ÐµÐ»ÐµÑÐŽiÒ£ ÐŽÐžÑÐµÐºÑÐŸÑÐžÑÑÑÐœÐŽÐ° ÑÐ°Ð»Ð° Ð°Ð»Ð°ÑÑÐœÐŽÑÒÑÐœÐ°Ðœ, ÐµÑÒÐ°ÐœÐŽÐ°Ð¹ ÐŽÐ° ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ CVS Ð°ÑÐ°Ð»Ð° Ð°Ð»ÐŒÐ°Ð¹ÐŽÑ.  
+
+mkcol.bad_name_svn:ÒÐÐ¢Ð : ÐÐŸÐ»Ð»ÐµÐºÑÐžÑ Ð°ÑÐ°Ð»Ð° Ð°Ð»ÐŒÐ°Ð¹ÐŽÑ . svnÑ Ð±Ò±Ð» Ð¶Ð°ÑÐ°Ð»ÒÐ°Ðœ SVNÐœÑÒ£ ÑÐ°Ð¹Ð» Ð¶Ò¯Ð¹ÐµÐ»ÐµÑiÐœÐŽÐµ ÐŽÐžÑÐµÐºÑÐŸÑÐžÑÐ»Ð°ÑÑÐŒÐµÐœ ÐºÐµÑiÐ¿ Ó©ÑÐµÑiÐœÐŽiÐ³i.  
+
+mkcol.bad_name_modelcol:ÒÐÐ¢Ð : ÐÒ±Ð» Ð¿iÑiÐœÐŽi ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐœÑÒ£ Ð°ÑÐ°ÑÑ Ð±ÐŸÐ»ÒÐ°ÐœÐŽÑÒÑÐ°ÐœÐœÐ°Ðœ, ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐ»Ð°Ñ modelcol ÐŽÐµÐ¿ Ð°ÑÐ°ÑÒÐ° Ð±ÐŸÐ»ÐŒÐ°Ð¹ÐŽÑ.  
+
+mkcol.cannot_find_modelcol:ÒÐÐ¢Ð : ÐiÑiÐœÐŽi ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐœÑ ÐŒÒ¯ÐŒÐºiÐœ ÐµÐŒÐµÑ ÑÐ°Ð±Ñ %s  
+
+mkcol.col_already_exists:ÒÐÐ¢Ð : ÐÒ±Ð» ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐ»Ð°Ñ ÐµÐœÐŽi Ð±Ð°Ñ Ð±ÐŸÐ»Ð°ÐŽÑ.  
+
+mkcol.collectdir:ÐÐ°Ò£Ð° ÐºÐŸÐ»ÐµÐºÑÐžÑÐœÑ Ð¶Ð°ÑÐ°Ð»ÒÐ°Ðœ ÐŽÐžÑÐµÐºÑÐŸÑÐžÑ.  
+
+mkcol.group_not_valid_in_gs3:(- gs3mode ) 3-Ñi ÐÑÐžÐœÑÑÐŸÑÐœ ÑÓÑÑiÐ¿ÑÐµ Ð²Ð°Ð»ÐžÐŽÐœÐ° ÐµÐŒÐµÑÑiÒ£ ÑÐŸÐ¿ÑÑÒ ÐŸÐ¿ÑÐžÑ  
+mkcol.creating_col:ÐÐŸÐ»Ð»ÐµÐºÑÐžÑÐœÑÒ£ Ð¶Ð°ÑÐ°ÑÑ %s  
+
+mkcol.creator:ÐÐŸÐ»Ð»ÐµÐºÑÐžÑÐœÑÒ£ Ð¶Ð°ÑÐ°ÑÑÑÑÑÐœÑÒ£ ÑÐ»ÐµÐºÑÑÐŸÐœÐŽÑÒ Ð¿ÐŸÑÑÐ°ÑÑÐœÑÒ£ ÐŒÐµÐºÐµÐœÐ¶Ð°Ð¹Ñ.  
+
+mkcol.creator_undefined:ÒÐÐ¢Ð : Ð¶Ð°ÑÐ°ÑÑÑÐœÑ Ð°ÐœÑÒÑÐ°Ð»ÐŒÐ°ÐŽÑ. ÐÒ±Ð» Ð°Ð¹ÐœÑÐŒÐ°Ð»Ñ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐœÑÒ£ ÐŽÑÐ±Ð»ÐžÐºÐ°ÑÑÐ°ÑÑÐœ Ð°Ð¹ÑÑÑÐ¿ ÑÐ°ÐœÑ Ò¯ÑiÐœ ÒÐ°Ð¶ÐµÑÑi.  
+
+mkcol.desc:PERL GreenstoneÐœÑÒ£ Ð¶Ð°Ò£Ð° ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐŽÐžÑÐµÐºÑÐŸÑÐžÑÐœÑÒ£ ÒÒ±ÑÑÐ»ÑÐŒÑÐœÑÒ£ Ð¶Ð°ÑÐ°Ñ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÑÑÐœ ÑÐºÑÐžÐ¿Ñ.  
+
+mkcol.doing_replacements:Ò¯ÑiÐœ Ð°Ð»ÐŒÐ°ÑÑÑÑÑÐ»Ð°ÑÐŽÑ ÐŸÑÑÐœÐŽÐ°Ñ %s  
+
+mkcol.group:Ò®Ð¹ÑÐµÐœÑiÐºÑi ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ ÐŸÑÑÐœÑÐœÐ° Ð¶Ð°Ò£Ð° ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐ»Ð°ÑÐŽÑÒ£ ÑÐŸÐ¿ÑÐ°ÑÑÐœÑÒ£ Ð¶Ð°ÑÐ°ÑÑ.  
+
+mkcol.gs3mode:3-Ñi Ð±ÐŸÐ»Ð¶Ð°ÐŒÐœÑÒ£ ÐÑÐžÐœÑÑÐŸÑÐœÑÐœÑÒ£ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐ»Ð°ÑÑ Ò¯ÑiÐœ ÑÓÑÑiÐ¿  
+
+mkcol.long_colname:ÒÐÐ¢Ð : ÐÐŸÐ»Ð»ÐµÐºÑÐžÑÐœÑÒ£ Ð°ÑÑ ÐµÑÑÐµÐ»ÐµÑÐ»ÐµÑÐŒÐµÐœ Ò¯Ð¹Ð»ÐµÑiÐŒÐŽi ÑÐ°Ð¹Ð» Ð¶Ò¯Ð¹Ðµ Ð±ÐŸÐ»Ñ Ð¶ÓÐœÐµ ÒÐŸÐ»ÐŽÐ°ÑÐŽÑ ÐŒÒ¯ÐŒÐºiÐœÐŽiÐ³i Ð±ÐŸÐ»Ñ Ò¯ÑiÐœ ÐºÐµÐŒ 8 ÑÐ°Ò£Ð±Ð°Ð»Ð°Ñ Ð±ÐŸÐ»ÑÑ ÐºÐµÑÐµÐº.  
+
+mkcol.maintainer:(ÐŸÐ» ÐµÐ³ÐµÑ Ð¶Ð°ÑÐ°ÑÑÑÐŽÐ°Ðœ Ð°Ð¹ÑÑÐŒÐ°ÑÑÐ»ÑÒÑ Ð±ÐŸÐ»Ð°ÐŽÑ ) ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ ÒÐŸÐ»ÐŽÐ°Ð¹ÑÑÐœ ÑÒ±Ð»ÒÐ°ÐœÑÒ£ ÑÐ»ÐµÐºÑÑÐŸÐœÐŽÑÒ Ð¿ÐŸÑÑÐ°ÑÑÐœÑÒ£ ÐŒÐµÐºÐµÐœÐ¶Ð°Ð¹Ñ.  
+
+mkcol.no_collectdir:ÒÐÐ¢Ð : Collect ÐŽÐžÑÐµÐºÑÐŸÑÐžÑ Ð±Ð°Ñ Ð±ÐŸÐ»ÐŒÐ°Ð¹ÐŽÑ : %s  
+
+mkcol.no_collectdir_specified:ÒÐÐ¢Ð : ÐÐŸÐ»Ð»ÐµÐºÑÐžÑÐœÑÒ£ ÐŽÐžÑÐµÐºÑÐŸÑÐžÑÑÑ Ð°ÐœÑÒÑÐ°Ð»ÐŒÐ°ÒÐ°Ðœ. Gs3modeÐ»ÐµÑÐ³Ðµ, ÐœÐµÐŒÐµÑÐµ ÐŸÐ¿ÑÐžÑÐ»Ð°Ñ : -collectdirÐŽiÒ£ siteÑi ÐœÐµÐŒÐµÑÐµ - Ð°ÐœÑÒÑÐ°ÑÑ ÐºÐµÑÐµÐº.  
+
+mkcol.no_colname:ÒÐÐ¢Ð : ÐÐŸÐ»Ð»ÐµÐºÑÐžÑÐ»Ð°Ñ ÐµÑÒÐ°ÐœÐŽÐ°Ð¹ ÐŽÐ° Ð°ÑÑÑ Ð±ÐµÑiÐ»ÐŒÐµÐŽi.  
+
+mkcol.optionfile:Ð€Ð°Ð¹Ð»ÐŽÑÒ£ ÐŸÐ¿ÑÐžÑÑÑÐœ Ð°Ð»ÑÐœÑÑÐœ, Ò±Ð·ÑÐœ ÐºÐŸÐŒÐ°ÐœÐŽÐ°Ð»ÑÒ Ð¶ÐŸÐ»ÐŽÐ°Ñ ÐŒÓÑÐµÐ»Ðµ ÑÐ°ÒÑÑÐ° Ð°Ð»Ð°ÑÑÐœ Ð¶Ò¯Ð¹ÐµÐ»ÐµÑ Ò¯ÑiÐœ Ð¿Ð°Ð¹ÐŽÐ°Ð»Ñ.  
+
+mkcol.params:ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐœÑÒ£ Ð°ÑÐ°ÑÑ [ÐŸÐ¿ÑÐžÑÐ»Ð°Ñ ]  
+
+mkcol.plugin:(ÐÐ»Ð°Ð³ÐžÐœÐœiÒ£ Ð±iÑÐœÐµÑÐµ ÑÐµÑ ÐºiÑÑÐ»ÐµÑi Ð±Ò±Ð» Ð¶ÐµÑÐŽÐµ Ð±ÐŸÐ»Ð° Ð°Ð»Ð°ÐŽÑ ) ÒÐŸÐ»ÐŽÐ°ÐœÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ PerlÐŽÑÒ£ ÐÐ»Ð°Ð³ÐžÐœiÐœiÒ£ ÐŒÐŸÐŽÑÐ»Ñ.  
+
+mkcol.public:ÐÐœÐŸÐœÐžÐŒ ÑÒ±ÒÑÐ°ÑÑ Ð±Ò±Ð» ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐœÑ Ð°Ð»Ð°ÐŽÑ.  
+mkcol.public.true:ÐÑÑÒ Ð¿Ð°Ð¹ÐŽÐ°Ð»Ð°ÐœÑÐŽÑ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ  
+mkcol.public.false:ÐÐ°Ð¹ÐŽÐ°Ð»Ð°ÐœÑÐŽÑ Ð±Ó©Ð»iÐœÐŽiÐœiÒ£ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÑÑ  
+
+mkcol.quiet:ÐÐ±ÑÑÐ¶ÑÐŒÐ°ÑÑÐ°Ðœ Ð¶Ò±ÐŒÑÑ iÑÑÐµÑ.  
+
+mkcol.site:Gs3modeÐœiÒ£ ÑÓÑÑiÐ±iÐœÐŽÐµ, collectdir, collectdirÐŽiÒ£ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÑÑÐœÑÒ£ ÐŽÐžÑÐµÐºÑÐŸÑÐžÑÑÑÐœÑÒ£ Ð°ÐœÑÒÑÐ°ÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ GSDL3HOMEÐœiÒ£ Ð°Ð¹ÐœÑÐŒÐ°Ð»Ñ ÐŸÑÑÐ°ÑÑÐœÐ°Ðœ Ð±Ò±Ð» ÑÐ°Ð¹ÑÑÑÒ£ Ð°ÑÐ°ÑÑÐœ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÐŽÑ - collectdir ÐºÓ©ÑÑÐµÑiÐ»Ð³ÐµÐœ.  
+
+mkcol.success:ÐÐ°Ò£Ð° ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ ÐŸÐ¹ÐŽÐ°ÒÑÐŽÐ°Ð¹ Ð¶Ð°ÑÐ°Ð»ÐŽÑ %s  
+
+mkcol.title:ÐÐŸÐ»Ð»ÐµÐºÑÐžÑÐœÑÒ£ Ð°ÑÐ°ÑÑ.  
+
+mkcol.win31compat:ÐÑÑÐ°Ð»Ñ, ÐºÐŸÐœÐ²ÐµÐœÑÐžÑ Windows 3.1 ÐµÑÐµÐ¿ÐºÐµ Ð°Ð»ÑÐœÑ ÐºÐµÑÐµÐº, 8ÐŽÐµÐœ ÐºÓ©Ð¿ ÐµÐŒÐµÑ ÑÐ°Ò£Ð±Ð°Ð»Ð°ÑÐŽÑÒ£ ÐŽÐžÑÐµÐºÑÐŸÑÐžÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ Ð°ÑÐ°ÑÐ»Ð°ÑÐŽÑ ÑÐ°Ò£ÐŽÐ°ÑÐŽÐ°.  
+mkcol.win31compat.true:Ò°Ð·ÑÐœÐŽÑÒÑÑ Ð¿Ð°Ð¿ÐºÐ°ÐœÑÒ£ Ð°ÑÐ°ÑÑ 8 ÐœÐµÐŒÐµÑÐµ ÐœÑÑÐ°ÐœÐŽÐ°Ñ ÐºÐµÐŒ  
+mkcol.win31compat.false:ÐÐµÐ· ÐºÐµÐ»Ð³ÐµÐœ Ò±Ð·ÑÐœÐŽÑÒÑÑÒ£ Ð¿Ð°Ð¿ÐºÐ°ÑÑÐœÑÒ£ Ð°ÑÐ°ÑÑ  
+
+# -- pluginfo.pl --
+
+pluginfo.collection:ÐÐŸÐ»Ð»ÐµÐºÑÐžÑÐœÑÒ£ Ð°ÑÑÐœÑÒ£ Ð±ÐµÑÑi collect/collection-name/perllib/pluginsÐºÐµ ÐµÒ£ Ð°Ð»ÐŽÑÐŒÐµÐœ ÐÐ»Ð°Ð³ÐžÐœÐŽÐµÑÐŽiÒ£ ÐºÓ©ÑÑiÐœÐŽÐµ ÐŸÑÑÐœÐŽÐ°Ð¹ÐŽÑ.  ÐÐ³ÐµÑ ÐÐ»Ð°Ð³ÐžÐœ Ð°ÐœÐŽÐ° ÑÐ°Ð±ÑÐ»ÐŒÐ°ÑÐ°, ÐŸÐœÐŽÐ° ÐºÐµÑÐµÐº Ð±ÐŸÐ»Ð°ÑÑÐœÐŽÐ°Ñ perllib/pluginsÑiÒ£ ÐŽÐžÑÐµÐºÑÐŸÑÐžÑÑÑÐœÑÒ£ Ð¶Ð°Ð»Ð¿Ñ Ð°Ð»ÒÐ°ÐœÐŽÐ°ÑÑÐœÐ° ÒÐ°ÑÐ°Ñ.  
+
+pluginfo.desc:ÐÐ»Ð°Ð³ÐžÐœÐŽÐµÑ ÑÑÑÐ°Ð»Ñ ÐŒÓÐ»iÐŒÐµÑÑi Ð¶Ð°Ð·ÑÐ¿ Ð°Ð»Ñ.  
+
+pluginfo.general_options:ÐÐ»Ð°Ð³ÐžÐœÐŽÐµÑÐŽiÒ£ Ð°ÐœÐ°Ð»ÑÒ ÐºÐ»Ð°ÑÑ ÐŒÒ±ÑÐ° ÐµÑiÐ»Ð³ÐµÐœ ÐŸÑÑÐ°Ò ÐŸÐ¿ÑÐžÑÐ»Ð°Ñ.  
+
+pluginfo.info:ÐŒÓÐ»iÐŒÐµÑ  
+
+pluginfo.no_plugin_name:ÒÐÐ¢Ð : Ð¡iÐ· ÐÐ»Ð°Ð³ÐžÐœÐœiÒ£ Ð°ÑÐ°ÑÑ ÐºÓ©ÑÑÐµÑÑiÒ£iÐ· ÐºÐµÑÐµÐº.  
+
+pluginfo.option_types:ÐÐ¿ÑÐžÑÐ»Ð°ÑÐŽÑÒ£ ÐµÐºi ÑÒ¯ÑiÐœiÒ£ ÐžÐµÐŒÐŽÐµÐœÐµ Ð°Ð»Ñ ÐÐ»Ð°Ð³ÐžÐœÐŽÐµÑ.  
+
+pluginfo.params:ÐÐ»Ð°Ð³ÐžÐœÐœiÒ£ Ð°ÑÐ°ÑÑ [ÐŸÐ¿ÑÐžÑÐ»Ð°Ñ ]  
+
+pluginfo.passing_options:ÐÐ¿ÑÐžÑÐ»Ð°Ñ ÐŸÐ»Ð°ÑÐ»Ð°ÑÐŽÑÒ£ collect.cfgÐœÑÒ£ ÑiÐ·ÐŽiÒ£ ÐºÐµÑÐºiÐœÐŽi ÑÐ°Ð¹Ð»ÑÐœÐ° ÒÐŸÑÑÐœÐŽÑÐŒÐµÐœ ÐºÐµÐ· ÐºÐµÐ»Ð³ÐµÐœ ÐÐ»Ð°Ð³ÐžÐœÐŽÐµÑÐ³Ðµ ÑÐ°Ð¿ÑÑÑÑÐ»Ð° Ð°Ð»Ð°ÐŽÑ.  
+
+pluginfo.specific_options:ÐÑÐµÐºÑÐµ ÐŸÐ¿ÑÐžÑÐ»Ð°Ñ Ó©Ð·ÐŽÐµÑiÐœiÒ£ ÐÐ»Ð°Ð³ÐžÐœÐŽÐµÑiÐœiÒ£ ÑÐµÐºÑÐµÑiÐœÐŽÐµÐ³i Ð¶ÓÐœÐµ Ð±Ò±Ð» ÐµÑÐµÐºÑÐµ ÐÐ»Ð°Ð³ÐžÐœÐ³Ðµ ÑÒ¯ÑiÐœiÐºÑi ÑÐµÐº ÒÐ°ÐœÐ° Ð°ÐœÑÒÑÐ°Ð»ÒÐ°Ðœ.  
+
+
+# -- plugoutinfo.pl --
+
+plugoutinfo.collection:Plugout.pl ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐ»Ð°Ñ Ð°Ñ Ð±ÐµÑÑ collect/collection-name/perllib/plugoutsÐºÐµ Ð±Ð°ÑÑÐ°Ð¿ÒÑÐŽÐ° ÒÐ°ÑÐ°ÑÐ° Ð°Ð»Ð°ÐŽÑ. ÐÐ³ÐµÑ ÐŒÐŸÐŽÑÐ»ÐŽÑ Ð°ÐœÐŽÐ° ÑÐ°Ð±ÑÐ»ÐŒÐ°ÑÐ°, iÐ·ÐŽÐµÑÑiÑÑ perllib/plugoutsÑiÒ£ ÑiÐ·Ð±ÐµÑi ÐœÐµÐ³iÐ·iÐœÐŽÐµÐœi Ð¶Ð°ÑÐ°Ð»Ð°ÐŽÑ.  
+
+plugoutinfo.desc:ÐÐŸÐŽÑÐ» ÑÑÑÐ°Ð»Ñ ÐŒÓÐ»iÐŒÐµÑÑi ÑÑÒÐ°ÑÑ.  
+
+plugoutinfo.general_options:ÐÐµÐ³iÐ·Ð³i ÐŸÐ¿ÑÐžÑÐ»Ð°Ñ ÐºÐ»Ð°ÑÑÑÐ°Ðœ ÐŒÐŸÐŽÑÐ»ÐŽÐ°ÑÐŒÐµÐœ ÐŒÒ±ÑÐ° ÐµÑÐµÐŽi.  
+
+plugoutinfo.info:ÐŒÓÐ»iÐŒÐµÑ  
+
+plugoutinfo.no_plugout_name:ÒÐÐ¢Ð : ÐŒÐŸÐŽÑÐ»ÐŽÑÒ£ Ð°ÑÑ ÑÐºÐ°ÑÐ°ÑÑ ÐºÐµÑÐµÐº.  
+
+plugoutinfo.option_types:ÐÐŸÐŽÑÐ»ÐŽÐ°Ñ ÐŸÐ¿ÑÐžÑÐ»Ð°ÑÐŽÑÒ£ ÐµÐºi ÑÒ¯Ñi ÒÐ°Ð±ÑÐ»ÐŽÐ°Ð¹ Ð°Ð»Ð°ÐŽÑ  
+
+plugoutinfo.params:Ð°Ñ [ÐŸÐ¿ÑÐžÑÐ»Ð°Ñ ] - ÐŒÐŸÐŽÑÐ»  
+
+plugoutinfo.passing_options:ÐÐŸÐŽÑÐ»ÒÐ° ÐŸÐ¿ÑÐžÑ, ÐŸÐ»Ð°ÑÐŽÑÒ£ collect.cfgÐœÑÒ£ ÐºÐµÑÐºiÐœiÐœiÒ£ ÐŒÐµÐœÑiÐºÑi ÑÐ°Ð¹Ð»ÑÐœÐ° ÒÐŸÑÐ° Ð°Ð»ÑÐ¿ Ð±ÐµÑÑÐ³Ðµ Ð±ÐŸÐ»Ð°ÐŽÑ  
+
+plugoutinfo.specific_options:ÐÐŸÐŽÑÐ»ÐŽÐ°Ñ ÐµÑÐµÐºÑÐµ ÐŸÐ¿ÑÐžÑÐ»Ð°Ñ Ó©Ð·ÐŽÐµÑiÐ»ÐµÑÐŽi Ð°ÐœÑÒÑÐ°Ð¹ÐŽÑ, Ð¶ÓÐœÐµ ÑÐŸÐœÐŽÑÒÑÐ°Ðœ ÐœÐ°ÒÑÑÐ»Ñ ÐŒÐŸÐŽÑÐ»ÒÐ° ÑÒ¯ÑiÐœiÐºÑi ÑÐµÐº ÒÐ°ÐœÐ° ÐŸÐ»Ð°Ñ.  
+
+
+
+#
+# Classifier option descriptions
+#
+
+AllList.desc:ÐÐ°ÑÐ»ÑÒ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÐŽÑÒ£ Ð±iÑÑÒ±ÑÐ°Ñ ÑiÐ·iÐŒiÐœ ÒÒ±ÑÐ°ÐŽÑ. OaiserverÐŽi ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÐŽÑ.  
+
+AZCompactList.allvalues:ÐÐ°ÑÐ»ÑÒ ÑÐ°Ð±ÑÐ»ÒÐ°Ðœ ÐŒÓÐœÐŽÐµÑ ÐŒÐµÑÐ° ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»ÑÑÐœ - ÐŒÓÐ»iÐŒÐµÑÑÐµÑ.  
+
+AZCompactList.desc:( Ð-Ð¯, 0-9Ð±ÐµÐœ) Ð°Ð»ÑÐ°Ð²ÐžÑ ÑÐµÑiÐœÐŽÐµÐœiÒ£ iÑiÐºÑÐµÑÐ³Ðµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÐŽÑÒ£ ÐÐ»Ð°Ð³ÐžÐœiÐŒÐŽi. Ð¢iÐ·iÐŒ ÐºÓ©Ð»ÐŽÐµÐœÐµÒ£ Ó©ÐœÐŽiÑiÐ¿ Ð°Ð»Ð°ÐŽÑ. ÒÒ±Ð¶Ð°ÑÑÐ°ÑÐŽÑÒ£ ÑiÐ·iÐŒ Ð±ÐŸÐ»Ð°ÑÑÐœ ÑÐŸÐŽÐ°Ðœ ÑÐŸÒ£ ÑiÐ·iÐŒ ÐœÐµÐŒÐµÑÐµ ÐºiÑÐ°Ð¿ ÑÓ©ÑÐµÑiÐ»ÐµÑ ÐŸÑÑÐ°Ò ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑ Ð±ÐŸÐ»Ð°ÑÑÐœ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÐŒÐµÐœ.  
+
+AZCompactList.doclevel:ÐÐŸÐºÑÐŒÐµÐœÑÑi Ó©Ò£ÐŽÐµÑ Ò¯ÑiÐœ ÐŽÐµÒ£Ð³ÐµÐ¹.  
+AZCompactList.doclevel.top:Ð¢Ð°Ð±Ð°ÐœÐŽÐ°ÑÒÐ°Ðœ ÒÒ±Ð¶Ð°Ñ.  
+AZCompactList.doclevel.section:ÐÓ©Ð»iÐŒÐŽÐµÑÐŒÐµÐœ.  
+
+AZCompactList.firstvalueonly:ÐÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ ÑÐµÐº ÒÐ°ÐœÐ° Ð°Ð»ÒÐ°ÑÒÑ ÐŒÓÐœÐŽÐµÑiÐœ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÐŽÑ.  
+
+AZCompactList.freqsort:Ð¢Ò¯Ð¹iÐœÐœiÒ£ Ð¶ÐžiÐ»iÐ³i Ð±ÐŸÐ¹ÑÐœÑÐ° iÑiÐºÑÐµÑiÐœ, ÑÐµÑ Ð°Ð»ÑÐ°Ð²ÐžÑÑÑÒ-ÑÐžÑÑÐ»ÑÒÑÐ°ÑÒÐ° ÐµÐŒÐµÑ.  
+
+AZCompactList.maxcompact:ÐÐµÑÑÐµÑÐŽÐµÐ³i ÐºÓ©ÑÑÐµÑiÐ»ÐµÑiÐœ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÐŽÑÒ£ ÐŒÐ°ÐºÑÐžÐŒÐ°Ð» ÑÐ°ÐœÑ.  
+
+AZCompactList.metadata:ÐÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ Ó©ÑiÑÑÐµÑiÐœiÒ£ Ð±Ó©Ð»Ð³iÑi ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ Ð¶Ð°Ð»ÒÑÐ· Ó©ÑiÑi, ÐœÐµÐŒÐµÑÐµ Ò¯ÑiÑ, ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÑÒÐ° ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÐŽÑ. ÐÐ³ÐµÑ ÑiÐ·iÐŒ Ð°ÐœÑÒÑÐ°Ð»ÑÐ°, ÐŒÓÐœÐŽÐµÑÐŒÐµÐœ ÐžÐµ Ð±ÐŸÐ»Ð°ÑÑÐœ ÐŒÐµÑÐ°Ð»ÐŽÐ°ÐœÐœÑÑ
+ Ð±iÑiÐœÑi ÑÒ¯ÑÐŽi ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÐŽÑ. Firstvalueonly Ð¶ÓÐœÐµ Ð±Ð°Ð¹ÑÐ°Ò - allvaluesÑÑÒ£ ÒÐŸÑÑÑÐœÐŽÐ° ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð° Ð°Ð»Ð°ÐŽÑ -, ÑÐµÐº ÒÐ°ÐœÐ° Ð±iÑiÐœÑi ÐŒÓÐœÐœiÒ£ ÑÐ°Ò£ÐŽÐ°ÑÑÐœÐ°, ÐœÐµÐŒÐµÑÐµ ÑiÐ·iÐŒÐœÐµÐœ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ Ð±Ð°ÑÐ»ÑÒ ÐŒÓÐœÐŽÐµÑi.  
+
+AZCompactList.mincompact:ÐÐµÑÑÐµÑÐŽÐµÐ³i ÐºÓ©ÑÑÐµÑiÐ»ÐµÑiÐœ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÐŽÑÒ£ ÐµÒ£ ÑÓ©ÐŒÐµÐœÐ³i ÑÐ°ÐœÑ.  
+
+AZCompactList.mingroup:Ð¢ÐŸÐ¿ÑÐ°ÑÐŽÑÒ£ ÐžÐµÑÐ°ÑÑ
+ÐžÑÐ»ÑÒ ÑÐµÑiÐœÐŽÐµÐ³i ÒÒ±ÑÐ°ÑÑÑÑÑ ÑÐ°ÒÑÑÐ°ÑÑÐœ ÐµÒ£ ÐºiÑi ÑÐ°Ðœ.  
+
+AZCompactList.minnesting:ÒÐ°Ð±Ð°ÑÑÐ°ÑÒÐ°Ðœ ÑiÐ·iÐŒÐ³Ðµ ÑiÐ·iÐŒiÐœiÒ£ Ó©ÑÐœÐµÐºÑÐµÑi ÑÐ°ÒÑÑÐ°ÑÑÐœ ÐµÒ£ ÐºiÑi ÑÐ°Ðœ.  
+
+AZCompactList.recopt:ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÑÑÐœ ÑÒ¯ÑÐŽiÒ£ ÒÐ°Ð±Ð°ÑÑÐ°ÑÒÐ°Ðœ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑiÐœÐŽÐµ - ÐÐŸÐŽÐ°/ÐŸÑÐ³Ð°ÐœÐžÐ·Ð°ÑÐžÐž ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑ.  
+AZCompactList.sort:IÑÐºi ÑÒ¯Ð¹iÐœÐŽÐµÑÐŽiÒ£ iÑiÐºÑÐµÑÐ³Ðµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ Ó©ÑiÑi.  
+
+AZCompactSectionList.desc:ÐÓ©Ð»iÐŒÐŽÐµÑÐŽi ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÑÐ»Ð°Ð¹ÑÑÐœ AZCompactListÐºÐµ Ð²Ð°ÑÐžÐ°ÑÐžÑÐ»Ð°Ñ, ÒÒ±Ð¶Ð°ÑÑÐ°Ñ ÐµÐŒÐµÑ. ÐiÑÑÐ»ÐµÑ Ð±Ó©Ð»iÐŒÐœiÒ£ ÐŽÐµÒ£Ð³ÐµÐ¹iÐœiÒ£ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑiÐœiÒ£ ÑÐµÑÑÐµÐ»Ð³ÐµÐœ.  
+
+AZList.desc:(, 0-9Ð±ÑÐœ ) Ð°Ð»ÑÐ°Ð²ÐžÑ ÑÐµÑiÐœÐŽÐµÐœiÒ£ iÑiÐºÑÐµÑÐ³Ðµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÐŽÑÒ£ ÐÐ»Ð°Ð³ÐžÐœiÐŒÐŽi. ÒÒ±Ð¶Ð°ÑÑÐ°ÑÑ Ð±Ð°Ñ ÑiÐ·iÐŒ ÐºÓ©Ð»ÐŽÐµÐœÐµÒ£ Ó©ÐœÐŽiÑiÐ¿ Ð°Ð»Ð°ÐŽÑ.  
+
+AZList.metadata:ÐÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÑ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÑÑÐœ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ Ó©ÑiÑÑÐµÑiÐœiÒ£ ÑiÐ·iÐŒÐœiÒ£ Ò¯ÑiÑ Ð°Ð¹ÑÑÑÒ Ð¶Ð°Ð»ÒÑÐ· Ó©ÑiÑi. Ð¢iÐ·iÐŒÐŽÐµ, ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ ÐŒÓÐœiÐœÐŽÐµ Ð±ÐŸÐ»Ð°ÑÑÐœ Ð±iÑiÐœÑi Ó©ÑiÑ Ð±ÐµÐ»Ð³i ÒÐŸÐ¹ÑÐ»ÒÐ°Ðœ ÑÐµÑÐºÐµ ÒÐŸÐ»ÐŽÐ°ÐœÑÑ ÐºÐµÑÐµÐº. Ð¢iÐ·iÐŒ Ð±Ò±Ð» ÑÐ»ÐµÐŒÐµÐœÑ Ð±ÐŸÐ¹ÑÐœÑÐ° ÑÐµÑÑÐµÐ»ÐµÐŽi.  
+
+AZSectionList.desc:ÐÐ»ÑÐ°Ð²ÐžÑ ÑÐµÑiÐœÐŽÐµÐœiÒ£ ÑÐµÐºÑÐžÑÐ»Ð°ÑÐŽÑÒ£ iÑiÐºÑÐµÑÐ³Ðµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÐŽÑÒ£ ÐÐ»Ð°Ð³ÐžÐœi. Ð¡ÐµÐºÑÐžÑÐ»Ð°ÑÐŽÑÒ£ ÐŽÐµÒ£Ð³ÐµÐ¹iÐœiÒ£ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑiÐœiÒ£ iÑiÐºÑÐµÐ¹ÐŽi.  
+
+BasClas.bad_general_option:Ò£-Ñi ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑ ÐŽÒ±ÑÑÑ ÐµÐŒÐµÑ ÐŸÑÑÐ°Ò ÐŸÐ¿ÑÐžÑÐœÑ ÒÐŸÐ»ÐŽÐ°ÐœÐ°ÐŽÑ. Collect.cfgÐœÑÒ£ ÑiÐ·ÐŽiÒ£ ÐºÐµÑÐºiÐœÐŽi ÑÐ°Ð¹Ð»ÑÐœ ÑÐµÐºÑÐµÑiÒ£iÐ·.  
+
+BasClas.builddir:ÒÐ°Ð¹ÐŽÐ° ÑÐ°Ð»ÑÐœÒÐ°Ðœ ÐžÐœÐŽÐµÐºÑÑÐµÑÐŽi ÐŸÑÐœÐ°Ð»Ð°ÑÑÑÑÑ.  
+
+BasClas.buttonname:ÐÐµÑÐŽÐµÐŽÐµÐœiÒ£ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÐŽÑÒ£ ÐºÓ©ÑÑÐµÑÑi Ð¶ÓÐœÐµ ÐœÐ°Ð²ÐžÐ³Ð°ÑÐžÑÐ»ÑÒ ÑÑÐ·ÒÑÑÑÐ°ÒÑ Ð±Ð°ÑÑÑÐŒÐ° Ò¯ÑiÐœ Ð±ÐµÐ»Ð³i. ÐÐ¿ÑÐžÑ - metadataÐŽÑÒ£ ÑÐºÐ°Ð·Ð°ÐœÐŸÐ¹ÑÐŒÐµÐœ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑiÐœiÒ£ Ð±Ò±Ð» ÑÐ»ÐµÐŒÐµÐœÑi Ò¯ÐœÐŽÐµÐŒÐµÑ Ð±ÐŸÐ¹ÑÐœÑÐ°Ð»Ð°Ñ.  
+
+BasClas.desc:ÐÐ°ÑÐ»ÑÒ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÐ»Ð°Ñ Ò¯ÑiÐœ ÐœÐµÐ³iÐ·Ð³i ÐºÐ»Ð°ÑÑ.  
+
+BasClas.no_metadata_formatting:(iÑiÐºÑÐµÑÐ³Ðµ ) ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑ Ð°Ð²ÑÐŸÐŒÐ°ÑÑÑ ÑÐŸÑÐŒÐ°ÑÑÐ°ÐŒÐ°Ñ.  
+
+BasClas.outhandle:ÐÓÑÐžÐ¶ÐµÐœiÒ£ ÑÐžÐ¿Ð°ÑÑÐ°ÐŒÐ°ÑÑÐœÐ° ÐžÐœÐŽÐµÐºÑÑiÐº ÑÐ°Ð¹Ð»Ñ.  
+
+BasClas.removeprefix:IÑiÐºÑÐµÑÐŽiÒ£ Ð¶Ð°ÐœÑÐœÐŽÐ° ÐµÐ»ÐµÐŒÐµÑÐ³Ðµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐŒÓÐ»iÐŒÐµÑÑÐµÑiÐœ Ð±Ð°ÑÑÐ°Ð¹ÑÑÐœ Ð¿ÑÐµÑÐžÐºÑ.  
+
+BasClas.removesuffix:IÑiÐºÑÐµÑÐŽiÒ£ Ð¶Ð°ÐœÑÐœÐŽÐ° ÐµÐ»ÐµÐŒÐµÑÐ³Ðµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐŒÓÐ»iÐŒÐµÑÑÐµÑiÐœ Ð±Ð°ÑÑÐ°Ð¹ÑÑÐœ Ð¶Ò±ÑÐœÐ°Ò.  
+
+BasClas.verbosity:ÓšÐœiÐŒÐœiÒ£ ÑÐ°ÐœÑÐŒÐµÐœ Ð±Ð°ÑÒÐ°ÑÑ . 0= Ð¶ÐŸÒÑÑÒ, 3= Ò¯Ð»ÐºÐµÐœ ÑÐ°ÐœÐŽÐ°Ñ.  
+
+Browse.desc:ÐÓ©ÑÑi Ð±Ð°Ñ ÑiÑÐºÐµÑÑÐµÐ³i ÐœÐ°Ð²ÐžÐ³Ð°ÑÐžÑÐœÑÒ£ Ð¿Ð°ÐœÐµÐ»iÐœÐŽÐµÐ³i Ð±Ð°Ð¹Ð»Ð°ÐœÑÑÑ Ð¶ÓÐœÐµ Ð±ÐµÑÑÐµÑÐŽiÒ£ iÐ·ÐŽÐµÑÑiÑÑiÐŒÐµÐœ ÒÐ°ÐŒÑÐ°ÐŒÐ°ÑÑÐ· ÐµÑÐµÑiÐœ Ð¶Ð°Ð»ÒÐ°Ðœ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑ. Ð¢ÐµÐº ÒÐ°ÐœÐ° mgppÐœÑÒ£ ÐµÐ¿ÑÐµÐ³ÐµÐœ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐ»Ð°ÑÑÐœÐŽÐ° Ð¶Ò±ÐŒÑÑ iÑÑÐµÐ¹ÐŽi.  
+
+DateList.bymonth:Ð¢ÐµÐº ÒÐ°ÐœÐ° Ð¶ÑÐ»ÐŽÐ°Ð¿ÒÐ° ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÑ ÐŸÑÑÐœÑÐœÐ° Ð¶ÑÐ»ÐŽÐ°Ð¿ÒÐ° Ð¶ÓÐœÐµ Ð°Ð¹ÒÐ° ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÑÐ»Ð°Ñ  
+
+DateList.desc:ÐÐ°ÑÐ°Ð»Ð°Ñ Ð±ÐŸÐ¹ÑÐœÑÐ° iÑiÐºÑÐµÑÐ³Ðµ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÑÐ»ÑÒ ÐÐ»Ð°Ð³ÐžÐœ. IÑiÐºÑÐµÑ Ò¯ÐœÐŽÐµÐŒÐµÑ Ð±ÐŸÐ¹ÑÐœÑÐ°Ð»Ð°Ñ ÐŽÐ°ÑÐ° ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑiÒ£ Ó©ÐœÐŽiÑiÐ¿ Ð°Ð»Ð°ÐŽÑ. ÐÐ°ÑÐ° Ð¶Ð¶Ð¶Ð¶Ð°Ð°ÐºÐº ÐœÐµÐŒÐµÑÐµ Ð³Ð³Ð³Ð³ ÑÒ¯ÑÐŽi Ð°Ð»ÑÑ ÐºÐµÑÐµÐ³ÐµÑiÐœÐŽÐµ ÒÐ°Ð±ÑÐ»ÐŽÐ°ÐœÒÐ°Ðœ, - ÐŒÐŒ-ÑÑ.  
+
+DateList.metadata:ÐÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐŽÐ°ÑÐ°Ð»Ð°ÑÐŽÐ° Ð±ÐŸÐ»Ð°ÑÑÐœ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑ. ÒÐ°Ð»ÑÐ¿ Ð¶Ð¶Ð¶Ð¶Ð°Ð°ÐºÐº ÐœÐµÐŒÐµÑÐµ Ð³Ð³Ð³Ð³ Ð±ÐŸÐ»Ð°ÑÑÐœÐŽÐ° ÐµÑÐµÐ¿ÑÐµÐ¹ÐŽi, - ÐŒÐŒ-ÑÑ. ÐÐ³ÐµÑ ÐŽÐ°ÑÐ°Ð»Ð°Ñ Ò¯ÑiÑ Ð°ÑÒÑÐ»Ñ Ð°ÑÐ°Ð¿ ÐºÓ©ÑÑÐµÑiÐ»ÑÐµ, Ð±iÑiÐœÑi ÐŽÐ°ÑÐ°ÐœÑ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÐŽÑ.  
+
+DateList.reverse_sort:ÒÒ±Ð¶Ð°ÑÑÐ°ÑÐŽÑÒ£ iÑiÐºÑÐµÑi ÐºÐµÑi (Ó©ÑÐµ Ð¶Ð°Ò£Ð° Ð±Ð°ÑÑÐ°Ð¿ÒÑÐŽÐ° ) ÐŒÐµÑÐ·iÐŒÐŽiÐº ÑÐµÑi.  
+
+DateList.nogroup:ÐÓ©Ð»ÐŽÐµÐœÐµÒ£ ÑiÐ·iÐŒÐŽÐµÐ³i Ð¶ÐµÐºÐµ ÐºiÑÑÐŽi Ð¶ÑÐ»ÐŒÐ°-Ð¶ÑÐ», ÐŸÑÐœÑÐœÐ°Ð»Ð°Ñ Ò¯ÑiÐœ Ð¶Ð°ÑÐ°Ð»ÑÑÐœ Ð¶ÑÐ»ÐŽÐ°Ñ Ð±iÑÐœÐµÑÐµ ÐºiÑÑÐ»ÐµÑÐŒÐµÐœ ÒÐ°ÐŒÑÑ(ÑÐŸÐœÑÐŒÐµÐœ Ð±iÑÐ³Ðµ Ð±Ò±Ð» ÐµÐºiÐ°Ð¹Ð»ÑÒ ÐŸÐ¿ÑÐžÑÒÐ° ÐŸÐ±ÑÐµÐŽÐžÐœÐµÐœÐŸÐ³ÐŸ ÐŸÑÑÐœÑÐœÐ° Ð¶ÐµÐºÐµ ÐºiÑÑÐŽi ÓÑÐ±iÑ Ð°Ð¹ÒÐ° iÑÑÐµÐ¹ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð° Ð°Ð»Ð°ÐŽÑ ).  
+
+DateList.no_special_formatting:Ð¢ÑÑÐ°Ð»Ñ ÐŒÓÐ»iÐŒÐµÑÑi Ð³ÐŸÐŽÐµ Ð±ÐµÐ¹ÐœÐµÐ»ÐµÐŒÐµÐœÑiÐœ Ð¶ÓÐœÐµ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÐŽÑÒ£ ÑiÐ·iÐŒiÐœÐŽÐµ Ð°Ð¹.  
+
+DateList.sort:ÐÐºi ÒÒ±Ð¶Ð°Ñ ÐŽÐ°ÑÐ°ÐœÑ ÑÐ»ÒÐž Ð±iÑÐ»ÐµÑÐŽi Ð°Ð»Ð°ÑÑÐœÐŽÐ° Ð¶Ð°ÒÐŽÐ°Ð¹ÐŽÐ°ÒÑ iÑiÐºÑÐµÑÐ³Ðµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ ÒÐŸÑÑÐŒÑÐ° Ó©ÑiÑi.  
+
+HFileHierarchy.desc:ÒÒ±ÑÑÐ»ÑÐŒÑ Ð±Ð°Ñ ÒÐŸÑÑÐŒÑÐ° ÑÐ°Ð¹Ð» ÑÐ°Ð»ÑÐœÒÐ°Ðœ ÐžÐµÑÐ°ÑÑ
+ÐžÑÐ»ÑÒ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÑÐ»Ð°ÑÐŽÑÒ£ ÑÑÒÐ°ÑÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÐŽÑÒ£ ÐÐ»Ð°Ð³ÐžÐœi.  
+
+Hierarchy.desc:ÐÐµÑÐ°ÑÑ
+ÐžÑÐ»ÑÒ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÑÐ»Ð°ÑÐŽÑÒ£ Ð¶Ð°ÑÐ°ÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÐŽÑÒ£ ÐÐ»Ð°Ð³ÐžÐœi. ÐÒ±Ð» Ð¶iÐºÑÐµÐ»Ð³ÐµÐœ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐ³Ðµ ÐœÐµÐŒÐµÑÐµ (ÐŸÐ¿ÑÐžÑ - hfileÐœi ÒÐŸÐ»ÐŽÐ°ÐœÑÒ£ÑÐ· ) ÒÒ±ÑÑÐ»ÑÐŒ Ð±ÐŸÐ»Ð°ÑÑÐœ ÒÐŸÑÑÐŒÑÐ° ÑÐ°Ð¹Ð»ÐŽÐ° ÐœÐµÐ³iÐ·ÐŽÐµÐ»ÐµÐŽi.  
+
+Hierarchy.documents_last:Ð¢iÐ·iÐŒÐŽÐµÐ³i ÒÒ±Ð¶Ð°ÑÑÐ°ÑÑ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÐ»Ð°ÑÐŽÐ°Ðœ ÐºÐµÐ¹iÐœ ÑÑÑÐµÑÑÐµÑ.  
+
+Hierarchy.hfile:ÐÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÑÐœÑÒ£ ÒÒ±ÑÑÐ»ÑÐŒÑÐŒÐµÐœ ÑÐºÐ°Ð·Ð°ÐœÐŸÐ¹ÐŒÐµÐœ ÑÐ°Ð¹Ð»ÐŽÑ ÒÐŸÐ»ÐŽÐ°ÐœÑ.  
+
+Hierarchy.hlist_at_top:ÐÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÑÐœÑÒ£ Ð±iÑiÐœÑi ÐŽÐµÒ£Ð³ÐµÐ¹i ÐºÓ©Ð»ÐŽÐµÐœÐµÒ£ ÐºÓ©ÑÑÐµÑÑ.  
+
+Hierarchy.reverse_sort:(ÑÐµÑÐºi ÑÓ©Ð±ÐµÐ»ÐµÑ ) ÐŽÐµÑÐµÐ²ÐŸÐœÑÒ£ Ð¶Ð°Ð¿ÑÑÐ°ÒÑÐ°ÑÑÐœÑÒ£ ( ÒÐŸÐ»ÐŽÐ°ÐœÑÒ£ÑÐ· - sort ) ÐºÐµÑi ÑÐµÑiÐœÐŽÐµÐ³i iÑiÐºÑÐµÑ  
+
+Hierarchy.separator:ÐÓ©Ð»Ð³iÑÑiÒ£ ÑÐµÑiÐœÐŽÐµ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»ÒÐ°Ðœ Ð¶Ò¯Ð¹ÐµÐ»i Ð°Ð¹ÑÑÐ»Ñ.  
+
+Hierarchy.sort:IÑÐºi ÑÒ¯Ð¹iÐœÐŽÐµÑÐŽiÒ£ iÑiÐºÑÐµÑÐ³Ðµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ Ó©ÑiÑi. ÐÐ³ÐµÑ Ó©ÑiÑ ÐºÓ©ÑÑÐµÑiÐ»ÐŒÐµÑÐµ, ÑÒ¯Ð¹iÐœÐŽÐµÑ ÑÒ±ÑÑÐ¿ÑÐ°Ð»Ñ Ð±ÐŸÐ»ÐŒÐ°Ð¹ÐŽÑ.  
+
+Hierarchy.suppressfirstlevel:ÐÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ ÐŒÓÐœÐœiÒ£ ÐºÓ©Ò£iÐ» Ð°ÑÐŽÐ°Ñ ÐµÐŒÐµÑ Ð±iÑiÐœÑi Ð±Ó©Ð»iÐ³i ÐºÓ©Ò£iÐ» Ð°ÑÐŽÐ°Ñ. ÐÑÑÐ°Ð»Ñ, gsdlsourcefilenameÐ³Ðµ ÐžÐŒÐ¿ÐŸÑÑÑÑÒ£ ÐŽÐžÑÐµÐºÑÐŸÑÐžÑÑÑÐœÑÒ£ Ð±iÑÐŽÐµÐ¹ Ð±Ð°ÑÑÐ°Ð¿ÒÑ ÑÐ»ÐµÐŒÐµÐœÑi Ð±Ð°Ñ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑi Ò¯ÑiÐœ Ð±Ò±Ð» Ð¿Ð°Ð¹ÐŽÐ°Ð»Ñ.  
+
+Hierarchy.suppresslastlevel:ÐÓÐœÐŽÐµÐ³i ÑÐŸÒ£ÒÑ Ð±Ó©Ð»iÐºÑi ÐŒÐµÑÐ° Ð°ÑÒÒÐ° Ð±Ð°ÑÑÒ£ÑÐ· - ÐŒÓÐ»iÐŒÐµÑÑÐµÑ. ÐÑÑÐ°Ð»Ñ, Ò¯ÑiÐœ Ð±Ò±Ð» Ð¿Ð°Ð¹ÐŽÐ°Ð»Ñ ÐŒÐµÑÐ° - ÐŽÐžÑÐµÐºÑÐŸÑÐžÑ ÑÐ°ÑÐŒÐ°Ò ÓÑÐ±iÑ ÐŒÓÐœÐ³Ðµ Ð±iÑÐŽÐµÐ¹ ÐŒÓÐ»iÐŒÐµÑÑÐµÑ.  
+
+HTML.desc:ÒÒ±ÑÐ°ÐŽÑ Ð²ÐµÐ±-Ð±ÐµÑÐºÐµ ÑiÐ»ÑÐµÐŒÐµ Ð¶Ð°Ð¹ ÒÐ°ÐœÐ° Ð±ÐŸÐ»ÑÐ¿ ÑÐ°Ð±ÑÐ»ÒÐ°Ðœ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÑÐœÑ Ð±ÐŸÑÐ°Ð¹ÐŒÑÐœ.  
+
+HTML.url:Ð±Ð°Ð¹Ð»Ð°ÐœÑÑÑÐ°Ñ Ò¯ÑiÐœ Ð²ÐµÐ±-Ð±ÐµÑ URL.  
+
+List.bookshelf_type:"ÐºiÑÐ°Ð¿ ÑÓ©ÑÐµÑiÐ»ÐµÑ" Ð¶Ð°ÑÐ°Ð»ÒÐ°ÐœÑÐœ ÑÐµÐºÑÐµÑÐµÐŽi  
+List.bookshelf_type.always:ÐÐ³ÐµÑ ÓÑÐ±iÑ ÑÐŸÐ¿ÑÐ°ÒÑ ÒÒ±Ð¶Ð°Ñ Ð±iÑ-Ð°Ò Ð°ÐœÐŽÐ° Ð±ÐŸÐ»ÑÐ°, ÐºiÑÐ°Ð¿ ÑÓ©ÑÐµÑiÐ»ÐµÑ ÑÑÑÐµÑÑi ÒÒ±ÑÐ°ÐŽÑ.  
+List.bookshelf_type.never:ÐÐ³ÐµÑ ÓÑÐ±iÑ ÑÐŸÐ¿ÑÐ°ÒÑ Ð±iÑiÑÐµÐº ÒÒ±Ð¶Ð°Ñ Ð°ÐœÐŽÐ° Ð±ÐŸÐ»ÑÐ°, ÐºiÑÐ°Ð¿ ÑÓ©ÑÐµÑiÐ»ÐµÑ ÑÑÑÐµÑÑi ÐµÑÒÐ°ÑÐ°Ðœ ÒÒ±ÑÐŒÐ°Ð¹ÐŽÑ.  
+List.bookshelf_type.duplicate_only:ÐiÑÐ°Ð¿ ÑÓ©ÑÐµÑiÐ»ÐµÑ ÑÑÑÐµÑÑi ÒÒ±ÑÐ°ÐŽÑ, ÓÑÐ±iÑ ÑÐŸÐ¿ÑÐ°ÒÑ Ð±iÑiÑÐµÐº ÒÒ±Ð¶Ð°Ñ ÐµÐ³ÐµÑ ÑÐµÐº ÒÐ°ÐœÐ° Ð°ÐœÐŽÐ°.  
+
+List.classify_sections:ÒÒ±Ð¶Ð°ÑÑÐ°Ñ ÐŸÑÑÐœÑÐœÐ° ÑÐµÐºÑÐžÑÐ»Ð°ÑÐŽÑÒ£ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÑÑÑ.  
+
+List.desc:ÐÑÑÐ°Ò Ð¶ÓÐœÐµ ÑÐŸÐ»ÒÑÐ»ÐŽÐ°Ò ÑiÐ·iÐŒÐŽiÐº ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑ, Ð±Ð°ÑÐ»ÑÒ ÐŒÒ¯ÐŒÐºiÐœÐŽiÐºÑÐµÑ, AZCompactListÑiÒ£ ÐœÐµÑi ÐŽÐµÑÐ»iÐº, Ð±iÑÐ°Ò UnicodeÐŒÐµÐœ Ð¶Ò±ÐŒÑÑ Ð¶ÓÐœÐµ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŒÐµÐœ iÑiÐºÑÐµÑÐŽiÒ£ Ð¶Ð°ÒÑÑ ÒÐ°Ð±iÐ»ÐµÑÑiÐ»iÐºÑÐµÑi, ÑÐŸÐœÑÐŒÐµÐœ Ð±iÑÐ³Ðµ.  
+
+
+List.level_partition.per_letter:ÓÑÐ±iÑ Ñ
+Ð°ÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ Ð±Ó©Ð»iÐŒÐŽi Ð¶Ð°ÑÐ°Ñ.  
+List.level_partition.constant_size:ÓšÐ»ÑÐµÐŒÐœiÒ£ Ð¿ÐŸÑÑÑÐœÐœÐŸÐ³ÐŸÑÑ Ð±Ó©Ð»iÐŒÐŽi Ð¶Ð°ÑÐ°Ñ.  
+List.level_partition.per_letter_fixed_size:ÐšÐ°ÐŒÐ°ÐŒÐµÐœ ÐºÐµÐ»ÐµÑi Ó©Ð»ÑÐµÐŒÐœiÒ£ ÓÑÐ±iÑ Ñ
+Ð°ÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ Ð±Ó©Ð»iÐŒÐŽi Ð¶Ð°ÑÐ°Ñ.  
+
+List.metadata:ÐÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ Ó©ÑiÑÑÐµÑi. ÐžÐµÑÐ°ÑÑ
+ÐžÑÐœÑÒ£ ÐŽÐµÒ£Ð³ÐµÐ¹Ð»ÐµÑiÐœiÒ£ Ð±Ó©Ð»iÐœÑÐ³Ðµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ /ÐœÑ ÒÐŸÐ»ÐŽÐ°ÐœÑÒ£ÑÐ· ';' ÓÑÐ±iÑ ÐŽÐµÒ£Ð³ÐµÐ¹ÐŽÐµÐ³i ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ Ó©ÑiÑÑÐµÑiÐœiÒ£ Ð±Ó©Ð»iÐœÑÐ»ÐµÑi Ò¯ÑiÐœ.  
+
+List.partition_name_length:Ð±Ó©Ð»iÐŒÐœiÒ£ Ð°ÑÑÐœÑÒ£ Ò±Ð·ÑÐœÐŽÑÒÑ; 1 3 ÐœÑÑÐ°ÐœÐŽÐ°ÑÒÐ° Ð°Ð¹ÐœÑÐŒÐ°Ð»Ñ Ó©Ð»ÑÐµÐŒ Ò¯ÐœÐŽÐµÐŒÐµÑ Ð±ÐŸÐ¹ÑÐœÑÐ°Ð»Ð°Ñ, ÑÐŸÐ», Ð±Ó©Ð»iÐŒÑÐµÐ³Ðµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐºÐµÑÐµÐ³iÐœÑÐµ ÑÓÑÐµÐ»ÐŽi Ð±ÐŸÐ»Ð°ÐŽÑ ÐŸÐœÑÒ£ Ð°ÑÒÑÐœÐ°Ðœ Ð±Ó©Ð»iÐŒ Ð±Ð°ÑÑÐ°ÐŽÑ. ÐÒ±Ð» ÐŸÐ¿ÑÐžÑÐ»Ð°ÑÑ partition_type_within_level ÐŸÑÑÐœÐŽÐ°Ð¹ÐŽÐ° ÑÐµÐº ÒÐ°ÐœÐ° ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÑÑÐœ constant_sizeÐ³Ðµ ÐŸÑÐœÐ°ÑÑÐ»ÒÐ°Ðœ.  
+
+List.partition_size_within_level:Ð­Ð»ÐµÐŒÐµÐœÑÑÐµÑÐŽiÒ£ (partition_type_within_level ÐµÐ³ÐµÑ ÑÐµÐº ÒÐ°ÐœÐ° ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÐŽÑ constant_sizeÐ³Ðµ ÐŸÑÐœÐ°ÑÑÐ»ÒÐ°Ðœ ) ÓÑÐ±iÑ Ð±Ó©Ð»iÐŒiÐœÐŽÐµÐ³i ÐÐŸÐ»Ð»ÐžÑÐµÑÑÐ²ÐŸ.  
+
+List.partition_type_within_level:Ð¢ÐŸÐ¿ÑÐ°ÒÑ Ð±Ó©Ð»iÐœÑiÐœiÒ£ ÑÒ¯Ñi : '(per_letter ) ÓÐ»iÐ¿Ð±ÐžÐŽiÒ£ ÓÑiÐ±i Ð±ÐŸÐ¹ÑÐœÑÐ°, (constant_size ) ÑÒ±ÑÐ°ÒÑÑ Ó©Ð»ÑÐµÐŒ, ÐœÐµÐŒÐµÑÐµ (none ) ÐµÑÑÐµÒ£Ðµ.  
+
+List.sort_leaf_nodes_using:Ð¢Ò¯Ð¿Ðºi ÑÒ¯Ð¹iÐœÐŽÐµÑÐŽiÒ£ iÑiÐºÑÐµÑÐ³Ðµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ Ó©ÑiÑÑÐµÑi. ÑÒ±ÑÐ°ÒÑÑ iÑiÐºÑÐµÑÐ³Ðµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ ÑÐŸÐ¿ÑÐ°ÑÑÐœÑÒ£ Ð±Ó©Ð»iÐœÑiÐœÐµ ÒÐŸÐ»ÐŽÐ°ÐœÑÒ£ÑÐ· ';' ÓÑÐ±iÑ ÑÐŸÐ¿ÑÐ°ÒÑ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ Ó©ÑiÑÑÐµÑiÐœiÒ£ Ð±Ó©Ð»iÐœÑÐ»ÐµÑi Ò¯ÑiÐœ.  
+
+List.sort_using_unicode_collation:Unicode CollationÐœiÒ£ Ð°Ð»Ð³ÐŸÑÐžÑÐŒÑÐœ ÒÐŸÐ»ÐŽÐ°ÐœÑÐŒÐµÐœ iÑiÐºÑÐµÑ. Perl lib/Unicode/CollateÐœiÒ£ ÐºiÑÐ°Ð¿Ñ
+Ð°ÐœÐ°ÑÑÐœÑÒ£ Ð¿Ð°Ð¿ÐºÐ°ÑÑÐœÐ° http://www.unicode.org/Public/UCA/latest/allkeys.txt Ð¶Ò¯ÐºÑÐµÑÐ³Ðµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÑÐ°Ð¹Ð»ÐŽÐ°Ñ ÐºÐµÑÐµÐº Ð±ÐŸÐ»Ð°ÐŽÑ.  
+
+List.use_hlist_for:(vlist ) ÑiÐº ÐŸÑÑÐœÑÐœÐ° (hlist ) ÐºÓ©Ð»ÐŽÐµÐœÐµÒ£ ÑiÐ·iÐŒÐœiÒ£ ÒÐŸÐ»ÐŽÐ°ÐœÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ Ó©ÑiÑÑÐµÑi. ÒÐŸÐ»ÐŽÐ°ÐœÑÒ£ÑÐ·, ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ ÑÐŸÐ¿ÑÐ°ÑÑÐœÑÒ£ Ð±Ó©Ð»iÐœÑiÐœÐµ ';' ÓÑÐ±iÑ ÑÐŸÐ¿ÑÐ°ÒÑ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ Ó©ÑiÑÑÐµÑiÐœiÒ£ Ð±Ó©Ð»iÐœÑÐ»ÐµÑi Ò¯ÑiÐœ.  
+
+SimpleList.metadata:ÐÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÑ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÑÑÐœ Ð±iÑ Ó©ÑiÑi ÐœÐµÐŒÐµÑÐµ Ð±iÑÐœÐµÑÐµ, ÑiÐ·iÐŒÐŽÐµ, Ð°Ð¹ÑÑÑÒ Ò¯ÑiÑÐ»ÐµÑÐŒÐµÐœ. Ð¢iÐ·iÐŒÐŽÐµ, ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ ÐŒÓÐœiÐœÐŽÐµ Ð±ÐŸÐ»Ð°ÑÑÐœ Ð±iÑiÐœÑi Ó©ÑiÑ Ð±ÐµÐ»Ð³i ÒÐŸÐ¹ÑÐ»ÒÐ°Ðœ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÑÒÐ° ÐŸÑÑÐœ-ÐŸÑÐœÑÐŒÐµÐœÑi ÐºÐµÑÐµÐº. ÐÐ³ÐµÑ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»ÑÐ° - sort Ð±ÐŸÐ»ÑÐ°, ÑiÐ·iÐŒ Ð±Ò±Ð» ÑÐ»ÐµÐŒÐµÐœÑÐ¿ÐµÐœ ÑÐµÑÑÐµÐ»ÐµÐŽi. ÐÐ³ÐµÑ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑ ÐºÓ©ÑÑÐµÑiÐ»ÐŒÐµÑÐµ, ÑiÐ·iÐŒÐ³Ðµ Ð±Ð°ÑÐ»ÑÒ ÒÒ±Ð¶Ð°ÑÑÐ°Ñ ÒÐŸÑÑÐ»Ð°ÐŽÑ, ÓÐ¹ÑÐ¿ÐµÑÐµ, Ð±Ò±Ð» ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ ÐŒÓÐœiÐŒÐµÐœ ÑÐºÐ°Ð·Ð°ÐœÑÐŒÐŒÐµÐœ ÑÐµÐº ÒÐ°ÐœÐ° ÒÒ±Ð¶Ð°ÑÑÐ°Ñ.  
+
+SimpleList.desc:Ð¢iÐ·iÐŒÐŽiÐº ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÐŽÑÒ£ Ð±ÐŸÑ ÑÒ±ÑÑÑÐœÐ° ÐÐ»Ð°Ð³ÐžÐœ.  
+
+SimpleList.sort:IÑiÐºÑÐµÑÐ³Ðµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ Ó©ÑiÑi. ÐÐ³ÐµÑ iÑiÐºÑÐµÑ ÐºÐµÑÐµÐº Ð±ÐŸÐ»ÑÐ°, ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»ÑÑÐœ - sort nosort.  
+
+Phind.desc:ÐÐ»Ð°ÑÐžÑÐžÐºÐ°ÑÐŸÑÐ° Phind ÐÐ»Ð°Ð³ÐžÐœ.  
+
+Phind.language:ÐÐµÑÐ°ÑÑ
+ÐžÑÐœÑÒ£ ÒÒ±ÑÐ°ÑÑÑÑÑ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÑÑÐœ ÑiÐ» ÐœÐµÐŒÐµÑÐµ ÑiÐ»ÐŽÐµÑ. Ð¢iÐ»ÐŽÐµÑ ÐµÐ»ÐŽÐµÑÐŽiÒ£ ÐµÐºi ÓÑiÐ¿Ñi ÐºÐŸÐŽÑÐ°ÑÑ, ÐŒÑÑÐ°Ð», (Ð°ÒÑÐ»ÑÑÐœ ÑiÐ»i ) enÐ³Ðµ, (ÐžÑÐ¿Ð°ÐœÐŽÑÒ ÑiÐ» ) es Ð¶ÓÐœÐµ (ÑÑÐ°ÐœÑÑÐ· ÑiÐ»i ) frÐ»ÐµÑÐŽi Ð±ÐµÐ»Ð³i ÒÐŸÑÐŽÑ. Ð¢iÐ» ÐŽÒ±ÑÑÑ Ó©ÑÐœÐµÐº Ð±ÐŸÐ»ÑÐ¿ ÑÐ°Ð±ÑÐ»Ð°ÐŽÑ, (Ð°ÒÑÐ»ÑÑÐœ ÐœÐµÐŒÐµÑÐµ ÑÑÐ°ÐœÑÑÐ· ÑiÐ»i ) en fr ÐŸÑÑÐ»Ð°Ð¹ Ð¶ÓÐœÐµÑÓÐ¹ÐºÐµÑiÐœÑÐµ Ð¶Ð°ÑÐ°ÐŒÐŽÑ (ÑÓÐ¹ÐºÐµÑiÐœÑÐµ, ÐºÐµÐ· ÐºÐµÐ»Ð³ÐµÐœ ÑiÐ» ).  
+
+Phind.min_occurs:Ð¡Ó©Ð¹Ð»ÐµÐŒ ÑÐµÑ ÑÐ°Ò£Ð±Ð°Ð»Ð°ÑÑÑ, ÑÐºÐŸÐ»ÐºÐŸ ÐµÒ£ ÑÓ©ÐŒÐµÐœÐ³i ÑÐ°ÐœÑ Ð±ÐŸÐ»Ñ Ò¯ÑiÐœ ÑÑÐ°Ð·Ð°Ð»ÑÒ ÐžÐµÑÐ°ÑÑ
+ÐžÑ ÒÐŸÑÑÐ»ÒÐ°Ðœ ÐŒÓÑiÐœÐŽÐµ ÐºÐµÐ·ÐŽÐµÑÑi ÐºÐµÑÐµÐº.  
+
+Phind.savephrases:ÐÐ³ÐµÑ Ð°ÐœÑÒÑÐ°Ð»ÑÐ°, ÐŸÐœÐŽÐ° Ð°ÒÐ¿Ð°ÑÐ°ÑÑÑÒ ÑÓ©Ð¹Ð»ÐµÐŒ ÐŒÓÑiÐœ ÑÐžÑÒÑÑ ÑÐ°Ð¿ ÒÐ°Ð»ÒÐ°Ðœ ÑÐ°Ð¹Ð»ÐŽÐ° ÑÐ°ÒÑÐ°Ð»Ð°ÐŽÑ. ÐÐ°ÒÑÑ ÐžÐŽÐµÑ ÐŒÒ¯ÐŒÐºiÐœ Ð±Ò±Ð» - ÑÒ±ÒÑÐ°ÑÑÑÒ£ Ð°Ð±ÑÐŸÐ»ÑÑÑi Ð¶ÐŸÐ»ÑÐœ ÒÐŸÐ»ÐŽÐ°ÐœÑ.  
+
+Phind.suffixmode:ÑÓ©Ð¹Ð»ÐµÐŒÐœiÒ£ ÑÑÒÐ°ÑÑÑÐœ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐ°ÒÐ° Smode Ð¿Ð°ÑÐ°ÐŒÐµÑÑ. 0-Ñi ÐŒÓÐœÐŽi ÑÑÐŸÐ¿ Ð±iÐ»ÐŽiÑÐµÐŽi, - ÑÓ©Ð·ÐŽÐµÑ ÐµÐ»ÐµÐœÐ±ÐµÐ¹ÐŽi, 1 - ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÐŽÑ.  
+
+Phind.text:Ð¡Ó©Ð¹Ð»ÐµÐŒÐŽÐµÑÐŽiÒ£ ÐžÐµÑÐ°ÑÑ
+ÐžÑÐœÑÒ£ Ð¶Ð°ÑÐ°Ñ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÑÑÐœ ÐŒÓÑiÐœ.  
+
+Phind.thesaurus:ÐÐŸÐ»Ð»ÐµÐºÑÐžÑÐœÑÒ£ ÐŽÐžÑÐµÐºÑÐŸÑÐžÑÑÑÐœÐŽÐ°ÒÑ ÒÐ°Ð»ÑÐ±ÑÐœÑÒ£ Phind ÑÐ°ÒÑÐ°Ð»ÒÐ°Ðœ ÑÐµÐ·Ð°ÑÑÑÑÑÑÒ£ Ð°ÑÑ Ð¶ÓÐœÐµ ÑÐ°ÒÑ Ð±Ð°ÑÒÐ°Ð»Ð°Ñ.  
+
+Phind.title:ÐÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ ÓÑÐ±iÑ ÒÒ±Ð¶Ð°ÑÑÑÒ£ ÑÐžÐ¿Ð°ÑÑÐ°ÐŒÐ° ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÑÑÐœ Ó©ÑiÑi.  
+
+Phind.untidy:ÐÒ±ÐŒÑÑ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÑ Ð°Ð»ÑÐ¿ ÑÐ°ÑÑÐ°ÐŒÐ°Ñ.  
+
+RecentDocumentsList.desc:ÐÐ°Ò£Ð° Ð¶Ò±ÐŒÑÐ°ÑÑ ÐœÐµÐŒÐµÑÐµ ÒÐŸÑÑÐ»ÒÐ°Ðœ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÐŽÑÒ£ ÑiÐ·iÐŒiÐœ Ð±ÐµÑÐ³ÐµÐœ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑ.  
+
+RecentDocumentsList.include_docs_added_since:Ð¢ÐµÐº ÒÐ°ÐœÐ° ÑÐŸÐ» Ó©Ð·Ð³ÐµÑÑiÐ»Ð³ÐµÐœ ÐœÐµÐŒÐµÑÐµ ÐºÓ©ÑcÐµÑiÐ»Ð³ÐµÐœ (Ð¶Ð¶Ð¶Ð¶Ð°Ð°ÐºÐº ÐœÐµÐŒÐµÑÐµ Ð³Ð³Ð³Ð³ ÒÐ°Ð»ÑÐ¿ÑÐ° - ÐŒÐŒ-ÑÑ ) ÐŽÐ°ÑÐ°Ð»Ð°ÑÒÐ° ÒÐŸÑÑÐ»ÒÐ°Ðœ ÒÒ±Ð¶Ð°ÑÑÐ°Ñ ÒÐŸÑÑ  
+
+RecentDocumentsList.include_most_recently_added:ÒÐŸÑÑÐ»ÒÐ°Ðœ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÐŽÑÒ£ ÐµÒ£ ÑÐŸÒ£ÒÑÐ»Ð°ÑÑ ÑÐµÐº ÒÐ°ÐœÐ° ÐŒÓ©Ð»ÑÐµÑ ÒÐŸÑÑ. Ð¢ÐµÐº ÒÐ°ÐœÐ° ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÐŽÑ ÐµÐ³ÐµÑ ÐŸÐ»Ð°Ð¹ Ð±ÐŸÐ»ÐŒÐ°ÑÐ°Ð¹ÐŽÑ include_docs_added_since ÐºÓ©ÑÑÐµÑiÐ»Ð³ÐµÐœ  
+
+RecentDocumentsList.sort:Ð¢iÐ·iÐŒÐœiÒ£ iÑiÐºÑÐµÑiÐœÐµ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑi. ÐÓ©ÑÑÐµÑiÐ»ÐŒÐµÐ³ÐµÐœ, ÑiÐ·iÐŒ ÐžÐ·ÐŒÐµÐœÐµÐœÐžÑ/ÐŽÐŸÐ±Ð°Ð²Ð»ÐµÐœÐžÑ ÐŽÐ°ÑÐ° Ð±ÐŸÐ¹ÑÐœÑÐ° ÑÐµÑÑÐµÐ»ÐµÐŽi.  
+
+SectionList.desc:ÐÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÐ»Ð°ÑÐŽÑÒ£ ÑiÐ·iÐŒi ÑÐŸÐ» ÑÓÑiÐ·ÐŽiÐ»ÐµÑ, ÐœÐµ, Ð±iÑÐ°Ò (Ð°Ð»ÐŒÐ°ÒÐ°ÐœÐŽÐ° Ð¶ÐŸÒÐ°ÑÒÑ ÐŽÐµÒ£Ð³ÐµÐ¹ ) ÒÒ±Ð¶Ð°ÑÑÑÒ£ Ð±Ð°ÑÐ»ÑÒ Ð±Ó©Ð»iÐŒÐŽÐµÑi ÒÐŸÑÐ°ÐŽÑ, Ó©Ð·ÐŽiÒ£ ÒÒ±Ð¶Ð°ÑÑÐœÑÒ£ Ð¶ÐŸÒÐ°ÑÒÑ ÐŽÐµÒ£Ð³ÐµÐ¹i ÒÐ°ÐœÐ° ÐµÐŒÐµÑ.  
+
+Collage.desc:ÐÐŸÐ»Ð»ÐµÐºÑÐžÑÐœÑÒ£ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÑ ÐÐ»Ð°Ð³ÐžÐœ.  
+
+Collage.geometry:ÐÐŸÐ»Ð»Ð°Ð¶ÐŽÑ Ó©Ð»ÑÐµÐŒÐœiÒ£ Ó©Ð»ÑÐµÐŒÐŽÐµÑi. ÐÑÑÐ°Ð»Ñ, ÐµÐœÐœiÒ£ 600 Ð¿ÐžÐºÑÐµÐ»ÐŽÐµÑiÐœÐŽÐµÐ³i ÐºÐŸÐ»Ð»Ð°Ð¶Ñ Ð¶ÓÐœÐµ Ð±ÐžiÐºÑiÐºÑiÒ£ 400 Ð¿ÐžÐºÑÐµÐ»ÐŽÐµÑi Ò¯ÑiÐœ ÑÐžÑÒÑÑ Ð³ÐµÐŸÐŒÐµÑÑÐžÑÐœÑ 600x400 Ð°ÐœÑÒÑÐ°Ð¹ÐŽÑ  
+
+Collage.maxDepth:ÐÐŸÐ»Ð»Ð°Ð¶ÒÐ° ÑÑÑÐµÑÑÐµÑi Ð±ÑÐ°ÑÐ·ÐµÑÐŽiÒ£ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÑÐœÐ° Ð·ÐµÑÐºÐ°Ð»ÐžÑÐŸÐ²Ð°ÐœÐžÑ ÑÑÑÐµÑ ÑÐ°Ð»ÒÐ°Ðœ. ÐÒ±Ð» Ð·ÐµÑÐºÐ°Ð»ÐžÑÐŸÐ²Ð°ÐœÐžÑÐœÑÒ£ Ð¿ÑÐŸÑÐµÑÑiÐœiÒ£ ÐŒÐ°ÐºÑÐžÐŒÐ°Ð» ÑÐµÑÐµÒ£ÐŽiÐ³iÐœ ÑÐµÐºÑÐµÑÐµÐŽi.  
+
+Collage.maxDisplay:ÐÐŸÐ»Ð»Ð°Ð¶ÐŽÐ° ÑÑÑÐµÑÑÐµÑiÐœiÒ£ ÐŒÐ°ÐºÑÐžÐŒÐ°Ð» ÑÐ°ÐœÑ ÐºÓ©ÑÑÐµÑiÐ»ÐµÑiÐœ Ð±iÑ ÑÐ°ÒÑÑÑÐ°.  
+
+Collage.imageType:Ð€Ð°Ð¹Ð»ÐŽÐ°ÑÑÐœÑÒ£ ÑÒ¯ÑÐ»ÐµÑi ÑÐŸÐ» ÐºÐŸÐ»Ð»Ð°Ð¶ÐŽÐ°ÑÐŽÐ° ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÑÑÐœ ÑÐ°Ð¹Ð» Ð°ÑÑÐœÑÒ£ ÐºÐµÒ£ÐµÐ¹ÑÑi Ð±iÐ»ÐŽiÑÐµ Ð±Ð°ÑÒÐ°ÑÑ Ò¯ÑiÐœ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÐŽÑ. Ð€Ð°Ð¹Ð» Ð°ÑÑÐ°ÑÑÐœÑÒ£ ÐºÐµÒ£ÐµÐ¹ÑÑÐ»ÐµÑiÐœ ÑiÐ·iÐŒ Ð¿Ð°Ð¹ÑÐ·ÐŽÑÒ£ ÐœÑÑÐ°ÐœÑÐŒÐµÐœ Ð±Ó©Ð»iÐœÐ³ÐµÐœ (%%).  
+
+Collage.bgcolor:008000 ÐœÓÑÐžÐ¶Ðµ ÐŒÑÑÐ°Ð»Ñ ÐŸÐœ Ð°Ð»ÑÑÐ»ÑÒ ÑÐŸÑÐŒÐ° ÐºÓ©ÑcÐµÑiÐ»Ð³ÐµÐœ ÐºÐŸÐ»Ð»Ð°Ð¶ÐŽÑ ÐºÐµÐœÐµÐ¿Ñi ÑÐŸÐœÐœÑÒ£ ÑÒ¯Ñi : ÑÐŸÐœ ÒÐ°ÑÐ°Ò£ÒÑ-Ð¶Ð°ÑÑÐ».  
+
+Collage.buttonname:ÐÐµÑÐŽÐµÐŽÐµÐœiÒ£ ÐºÓ©ÑÑÐµÑÑÐŽi ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑ Ð¶ÓÐœÐµ ÐœÐ°Ð²ÐžÐ³Ð°ÑÐžÑÐ»ÑÒ ÑÑÐ·ÒÑÑÑÐ°ÒÑ Ð±Ð°ÑÑÑÐŒÐ° Ò¯ÑiÐœ Ð±ÐµÐ»Ð³i.  
+
+Collage.refreshDelay:ÐÐŸÑÐŒÐ°, ÐºÐŸÐ»Ð»Ð°Ð¶ Ð¶Ð°Ò£Ð°ÑÐ°ÑÑÐœ ÐŒÐžÐ»Ð»ÐžÑÐµÐºÑÐœÐŽÐ°Ð»Ð°ÑÐŽÐ°ÒÑ.  
+
+Collage.isJava2:ÐÐ°ÑÒÐ°ÑÑ, ÐºÐµÐ¹Ð±iÑ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÑÑÐœ ÐºÐ»Ð°ÑÑÑÐ°ÑÐŒÐµÐœ -Ñ ÐŸÑÑÐœÐŽÐ°Ñ Java Ñ Ò¯ÑiÐœ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÐŽÑ. ÐÑÑÐ°Ð»Ñ Java-ÑÑ iÐ»Ð³ÐµÑiÑÐµÐº Ð±ÐŸÐ»Ð¶Ð°ÐŒ : Java1.2 Ð±Ò±ÐŽÐ°Ðœ ÓÑiÐ»ÐµÑ ) ÑÑÑÐµÑÑÐµÑÐŽÐµÐ³i ÐŒÓ©Ð»ÐŽiÑÐ»iÐºÑi Ð±Ð°ÑÒÐ°ÑÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐºÓÐœiÐ³iÑÐµÐº ÒÐŸÐ»ÐŽÐ°ÑÐŽÑ ÒÐŸÑÐ°ÐŽÑ, Ð±Ò±Ð» Ð±Ð°Ð¹ÑÐ°ÒÐ¿ÐµÐœ Ð±ÐŸÐ»Ð°ÐŽÑ ÑÐµÑiÐœÐŽÐµ ÐºÓ©ÐŒÐµÐºÑÐµÑÐµÐŽi, ÐŽÐµÐ³ÐµÐœÐŒÐµÐœ ÐºÐµÐ¹Ð±iÑ Ð±ÑÐ°ÑÐ·ÐµÑÐ»ÐµÑ Ò¯ÑiÐœ Ð²ÐµÑÑÐžÑ Java- ÐºiÑiÑÑiÑiÐ»Ð³ÐµÐœ 1.1-Ñi Ð±ÐŸÐ»Ð¶Ð°ÐŒ. ÐÐ¿Ð¿Ð»ÐµÑ Ò¯ÐœÐŽÐµÐŒÐµÑ Ð±ÐŸÐ¹ÑÐœÑÐ°ÒÐ°ÐœÐŽÐ°Ð¹ ÐµÑiÐ¿, Ð±ÐŸÐ»Ð¶Ð°ÐŒÑ Java ÑÐŸÐ» Ò¯ÑiÐœÐµÐŒiÐœ ÐºÓ©ÐœÐŽiÑÐµÐŽi ÐŸÑÑÐœÐŽÐ°ÒÐ°Ðœ ÒÐŸÐ»ÐŽÐ°ÐœÑÑÑÐœÑÒ£ Ð±ÑÐ°ÑÐ·ÐµÑiÐœÐµ ÐžÐµ Ð±ÐŸÐ»Ð°ÑÑÐœ Ð°Ð²ÑÐŸÐŒÐ°ÑÑÑ ÐŒÓÐ»iÐŒ Ð±ÐŸÐ»Ð°ÑÑÐœÐŽÐ°Ð¹ ÐµÑiÐ¿ Ð¶Ð°ÑÐ°Ð»ÒÐ°Ðœ.  
+
+Collage.imageMustNotHave:ÐÐŸÐ»Ð»Ð°Ð¶ÐŽÐ° Ð¿Ð°Ð¹ÐŽÐ° Ð±ÐŸÐ»ÑÑ ÐºÐµÑÐµÐº Ð±ÐŸÐ»ÒÐ°Ðœ ÑÑÑÐµÑÑÐµÑÐŽiÒ£ ÒÑÑÑÑ, ÐœÐ°Ð²ÐžÐ³Ð°ÑÐžÑÐ»ÑÒ Ð¿Ð°ÐœÐµÐ»ÐŽÐµÑÐŽi ÒÒ±ÑÐ°Ð¹ÑÑÐœ ÐºÐœÐŸÐ¿ÐºÐ°Ð»ÑÐ»Ð°ÑÐŽÑÒ£ ÑÑÑÐµÑÑÐµÑiÐœiÒ£ ÑÒ¯ÑiÐœÐµ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÐŽÑ.  
+
+Collage.caption:ÒÐŸÑÑÐŒÑÐ° Ð±Ð°ÑÑÐ°Ñ, ÐºÐŸÐ»Ð»Ð°Ð¶ ÑÓ©ÐŒÐµÐœÐŽÐµ ÐºÓ©ÑÑÐµÑiÐ»Ð³ÐµÐœ.  
+
+
+#
+# Plugin option descriptions
+#
+AcronymExtractor.adding:ÒÐŸÑÑÐŒÑÐ°  
+
+AcronymExtractor.already_seen:ÐµÐœÐŽi ÐºÓ©ÑiÐœÐ³ÐµÐœi  
+
+AcronymExtractor.desc:ÐÓÑiÐœÐŽÐµÐ³i iÐ·ÐŽÐµÑÑiÑÑ Ð¶ÓÐœÐµ Ð°ÐºÑÐŸÐœÐžÐŒÐœÑÒ£ Ð±ÐµÐ»Ð³iÐ³Ðµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐºÓ©ÐŒÐµÐºÑiÒ£ ÑÑÒÐ°ÑÑÑÐœ ÐÐ»Ð°Ð³ÐžÐœ.  
+
+AcronymExtractor.done_acronym_extract:ÐÐºÑÐŸÐœÐžÐŒÐŽÐ°ÑÐŽÑÒ£ ÑÑÒÐ°ÑÑÑ Ð¶Ð°ÑÐ°Ð»ÒÐ°Ðœ.  
+
+AcronymExtractor.done_acronym_markup:ÐÐºÑÐŸÐœÐžÐŒÐœÑÒ£ Ð±ÐµÐ»Ð³iÑi ÐŸÑÑÐœÐŽÐ°ÒÐ°Ðœ.  
+
+AcronymExtractor.extract_acronyms:ÐÐºÑÐŸÐœÐžÐŒÐŽÐ°Ñ ÐŒÓÑiÐœÐœÐµÐœ Ð°Ð»ÒÐ°Ðœ Ð¶ÓÐœÐµ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ ÑÐµÑiÐœÐŽÐµÑi ÐŸÑÐœÐ°ÑÑÐ»ÒÐ°Ðœ.  
+
+AcronymExtractor.extracting_acronyms:Ð°ÐºÑÐŸÐœÐžÐŒÐŽÐ°ÑÐŽÑÒ£ ÑÑÒÐ°ÑÑÑ  
+
+AcronymExtractor.marking_up_acronyms:Ð°ÐºÑÐŸÐœÐžÐŒÐŽÐ°ÑÐŽÑÒ£ Ð±ÐµÐ»Ð³iÑi  
+
+AcronymExtractor.markup_acronyms:ÒÒ±Ð¶Ð°ÑÑÑÒ£ ÐŒÓÑiÐœiÐœÐµ Ð°ÐºÑÐŸÐœÐžÐŒÐœÑÒ£ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑi ÒÐŸÑÑ.  
+
+ArchivesInfPlugin.desc:(ÐžÐŒÐ¿ÐŸÑÑ ÐŸÑÑÐœÐŽÐ°Ð»Ð°ÑÑÐœÐŽÐ° Ð°ÑÑ
+ÐžÐ²Ñi ÐŽÐžÑÐµÐºÑÐŸÑÐžÑ ÑÑÒÐ°ÑÑÐ»ÒÐ°Ðœ ÑÐ°Ð¹Ð» ÐŽÐµÐŒÐµÐº ) archives.infÑiÒ£ ÑÐ°Ð¹Ð»ÑÐœÐŽÐ° ÓÑÐ±iÑ ÑÐ°Ð±ÑÐ»ÒÐ°Ðœ ÑÐ°Ð¹Ð» Ð¶Ò±ÐŒÑÑÑÐ°ÐœÐ° ÒÐ°Ð¹ÑÐ°Ð»Ð°Ð¹ÑÑÐœ ÐÐ»Ð°Ð³ÐžÐœ.  
+
+AutoExtractMetadata.desc:ExtractorÐŽÑÒ£ ÐÐ»Ð°Ð³ÐžÐœiÐœÐµÐœ ÑÑÒÐ°ÑÑÑÐœ Ð±ÐµÑÐµÑiÐœ Ð±Ð°ÑÐ»ÑÒ ÑÑÐœÐºÑÐžÐŸÐœÐ°Ð»ÐŽÑÒÑÑ ÐœÐµÐ³iÐ·ÐŽi ÐÐ»Ð°Ð³ÐžÐœ.  
+
+AutoExtractMetadata.extracting:ÑÑÒÐ°ÑÑ  
+
+AutoExtractMetadata.first:ÐÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ ÐŒÓÑiÐœÐœÐµÐœ Ó©ÑiÑÐºÐµ ÑÑÒÐ°ÑÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ Ð±iÑiÐœÑi ÑÐ°ÐŒÐ°Ð»Ð°ÑÐŽÑÒ£ ÑiÐ·iÐŒÐœiÒ£ Ð±Ó©Ð»Ð³ÐµÐœ Ò¯ÑiÑi. ÓšÑiÑ FirstNNN Ð°ÑÐ°Ð»ÒÐ°Ðœ.  
+
+BaseMediaConverter.desc:ÐÑÑÐ°Ð»Ñ, ÑÑÑÐµÑÑÐµÑÐŽiÒ£ ÐºÐŸÐœÐ²ÐµÑÑÐŸÑÐŽÑÒ£ ÐºÐŸÐœÐ²ÐµÑÑÐŸÑÑ Ð±ÐŸÐ»Ð°ÑÑÐœ ÐÐ»Ð°Ð³ÐžÐœÐ³Ðµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ Ð€ÑÐœÐºÐžÑÐœÑ ÐºÓ©ÐŒÐµÐ³iÐœiÒ£ ÑÑÒÐ°ÑÑÑÐœ ÐÐ»Ð°Ð³ÐžÐœ ÐŒÐµÐŽÐžÐ° ÐœÐµÐŒÐµÑÐµ ÐºÐŸÐœÐ²ÐµÑÑÐŸÑÐ»Ð°Ñ Ð²ÐžÐŽÐµÐŸ.  
+
+BasePlugin.associate_ext:ANDÑÑÒ£ ÐÐ»Ð°Ð³ÐžÐœiÐœiÒ£ ÑÒ¯Ð±iÑÐ»iÐº ÑiÐ·Ð±ÐµÑiÐŒÐµÐœ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÐŽÑÒ£ Ó©Ò£ÐŽÐµÑiÐœÐµ ÑÐ°ÒÑÑÐ°ÐŽÑ Ò¯ÑiÑ Ð°ÑÒÑÐ»Ñ Ð°ÑÐ³ÑÐŒÐµ ÑÐµÑiÐœÐŽÐµ Ð±Ò±Ð» Ð¶ÐµÑÐŽÐµ Ð±ÐµÑiÐ»ÐµÑiÐœ Ð°ÑÐ°Ð»ÒÐ°Ðœ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÐŽÑÒ£ ÐºÐµÒ£ÐµÐ¹ÑÑiÐœiÒ£ ÑiÐ·iÐŒÐœiÒ£ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÑÐŒÐµÐœ Ð±Ð°Ð¹Ð»Ð°ÐœÑÑÑÑÑÐ°ÐŽÑÐœÑÐ°.  
+
+BasePlugin.associate_tail_re:Ð¢Ð°Ð±ÑÐ»ÒÐ°Ðœ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÒÐ° ÑÐ°Ð¹Ð» Ð°ÑÑÐ°ÑÑÐœÑÒ£ ÑiÑÐºÐµÑiÐœÐµ Ð¶Ò¯Ð¹ÐµÐ»i Ð°Ð¹ÑÑÐ»ÑÑ. Associate_ext Ò¯ÑiÐœ ÐµÐºiÐœiÒ£ Ð±iÑi ÓÐ»ÐŒÐµÐœÐŽi ÑÐžÑÒÑÑ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÐŽÑ.  
+
+BasePlugin.block_exp:Ð€Ð°Ð¹Ð»ÐŽÐ°Ñ, ÑÐžiÑÑi Ð±Ò±Ð» ÐŽÒ±ÑÑÑ Ó©ÑÐœÐµÐºÑÐµÑ, ÑiÐ·iÐŒÐŽÐµ ÐºÐµÐ· ÐºÐµÐ»Ð³ÐµÐœ Ð°ÑÑ ÒÐ°ÑÐ°Ð¹ ÐÐ»Ð°Ð³ÐžÐœ ÑÐ°Ð¿ÑÑÑÒÐ°Ðœ Ð±ÐŸÐ»Ð°ÑÑÐœÐŽÐ°Ð¹ ÐµÑiÐ¿ ÑÐŸÑÒÐ°ÑÑÐ» ÒÐŸÑÐŽÑ. ÐÒ±Ð» ÑiÐ· ÐºÓ©Ò£iÐ» Ð±Ó©Ð» ÐºiÑÐµÑiÐœ ÑÐ°Ð¹Ð»ÐŽÐ°Ñ ÑÑÑÐ°Ð»Ñ ÐµÑÐºÐµÑÑÐµÑiÐœ Ñ
+Ð°Ð±Ð°ÑÐ»Ð°ÐŒÐ°Ð»Ð°ÑÐŽÑÒ£ Ò¯Ð»ÐºÐµÐœ ÑÐ°ÐœÑ ÑÐ°ÒÑÐ°Ð¿ ÒÐ°Ð»ÑÒÐ° ÒÐ°ÑÐ°ÒÐ°ÐœÐŽÐ° ÐµÑÒÐ°ÐœÐŽÐ°Ð¹ ÐŽÐ° Ð±Ð°ÑÒÐ° ÐœÐ°ÒÑÑ ÑÐ°ÒÐ°Ð¹ÑÐœÐŽÐ°ÑÐŽÑ Ð°Ð»ÐŒÐ°Ð¹ÐŽÑ. ÐÑÑÐ°Ð»ÒÐ°, Ð°Ð»Ð°Ñ Ðµ ÓÑÐ±iÑ ÐÐ»Ð°Ð³ÐžÐœ Ò¯ÐœÐŽÐµÐŒÐµÑ Ð±ÐŸÐ¹ÑÐœÑÐ°ÒÐ° HTMLPlugÐœÑ block_exp. Ò¯ÐœÐŽÐµÐŒÐµÑ Ð±ÐŸÐ¹ÑÐœÑÐ°ÑÑÐœÐ° Ð°Ð»ÑÑÐœ ÐºÐµÒ£ÐµÐ¹ÑÑi Ð±Ð°Ñ ÐºÐµÐ· ÐºÐµÐ»Ð³ÐµÐœ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÐŽÑ Ð±Ð»ÐŸÐºÐ°ÐŽÐ°Ð»Ð°Ð¹ÐŽÑ . gif, . jpg, . jpeg, . png ÐœÐµÐŒÐµÑÐµ . css.  
+
+BasePlugin.desc:ÐÐŒÐ¿ÐŸÑÑÑÑÒ£ Ð¶ÐžÐœÐ°ÒÑ ÐÐ»Ð°Ð³ÐžÐœÐŽÐµÑi Ò¯ÑiÐœ ÐœÐµÐ³iÐ·Ð³i ÐºÐ»Ð°ÑÑ.  
+
+BasePlugin.dummy_text:ÒÒ±Ð¶Ð°Ñ ÐŒÓÐ»iÐŒÐµÑ ÐŒÓÑiÐœÐŽi Ð°Ð»ÐŒÐ°Ð¹ÐŽÑ.  
+
+BasePlugin.encoding.ascii:7-Ð±ÐžÑÑiÐº asciiÐ»ÐµÑ ÑÒ±ÑÑÐ¿ ÒÐ°Ð». ÐÐ» ÒÐŸÐ»ÐŽÐ°ÐœÑ iso_8859_1Ð³Ðµ ÒÐ°ÑÐ°ÒÐ°ÐœÐŽÐ°ÑÑ ÑÐµÐ· Ð±ÐŸÐ»Ð° Ð°Ð»Ð°ÐŽÑ. ÐÑÑÐ°Ð»Ñ, Ð±Ò±Ð» asciiÐœiÒ£ 7-Ð±ÐžÑÑiÐº Ð¶ÐžÑÐœÐŽÐ°ÑÑÐœÑÒ£ Ð±ÐŸÑ ÑÒ±ÑÑÐ»Ð°ÑÑÐœÑÒ£ ÐœÐµÐŒiÑ ÐœÐµÐŒÐµÑÐµ ÑÑÐ°ÐœÑÑÐ· ÒÒ±Ð¶Ð°ÑÑÐ°ÑÑ ÐœÑÑÐ°ÐœÐŽÐ°Ñ ÑÑÑ Ð±ÐŸÐ»Ð° Ð°Ð»Ð°ÐŽÑ ÐµÐºÐ¿iÐœÐœiÒ£ ÑÐ°Ò£Ð±Ð°Ð»Ð°ÑÑÐœÐŽÐ° Ð±ÐŸÐ»Ð°ÑÑÐœ ) ÒÒ±Ð¶Ð°ÑÑÐ°ÑÐŽÑÒ£ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÑÑÐœÐŽÐ°ÒÑ ÒÐŸÐ»ÐŽÐ°ÐœÑÑ ÑÐ°ÒÑÐ°ÐœÑÒ£ÑÐ·, Ð±Ò±ÐœÑÒ£ ÐŸÑÑÐœÑÐŒÑÐ·ÒÐ° iso_8859_1Ð»ÐµÑÐŽi ÒÐŸÐ»ÐŽÐ°ÐœÑÒ£ÑÐ·.  
+
+BasePlugin.encoding.unicode:Ð¢ÐµÐº ÒÐ°ÐœÐ° ÑÐœÐžÐºÐŸÐŽ.  
+
+BasePlugin.encoding.utf8:ÐÐµÐŒÐµÑÐµ utf8, ÐœÐµÐŒÐµÑÐµ ÑÐœÐžÐºÐŸÐŽ - Ð°Ð²ÑÐŸÐŒÐ°ÑÑÑ Ð±iÐ»ÐŽiÑiÐ»Ð³ÐµÐœ.  
+
+BasePlugin.filename_encoding:Ð€Ð°Ð¹Ð» Ð°ÑÑÐ°ÑÑ Ò¯ÑiÐœ Ð±Ð°ÑÒÐ° ÐºÐŸÐŽÐ¿ÐµÐœ Ð¶Ð°Ð·ÑÐ»Ñ ÐºÓ©Ð·  
+
+BasePlugin.filename_encoding.auto:Ð€Ð°Ð¹Ð» Ð°ÑÑÐœ Ð°Ð²ÑÐŸÐŒÐ°ÑÑÑ Ð°ÐœÑÒÑÐ°Ñ  
+
+BasePlugin.filename_encoding.auto_language_analysis:ÑÐ°Ð»ÐŽÐ°ÑÑ Ð°ÑÒÑÐ»ÑÐœÑÒ£ ÑÐ°Ð¹Ð» Ð°ÑÑÐ°ÑÑÐœÑÒ£ ÒÐ°Ð¹ÑÐ° ÐºÐŸÐŽÑÐ°ÑÑÐœ Ð°Ð²ÑÐŸ Ð°ÐœÑÒÑÐ°Ñ.  
+
+BasePlugin.filename_encoding.auto_filesystem_encoding:Ð€Ð°Ð¹Ð» Ð¶Ò¯Ð¹ÐµÑiÐœÐŽÐµÐ³i ÒÐ°Ð¹ÑÐ° ÐºÐŸÐŽÑÐ°Ñ ÒÐŸÐ»ÐŽÐ°ÐœÐ° ÑÐ°Ð¹Ð» Ð°ÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐÐŸÐŽÐµÐºÑiÒ£ Ð°Ð²ÑÐŸ Ð°ÐœÑÒÑÐ°ÑÑ  
+
+BasePlugin.filename_encoding.auto_fl:Ð€Ð°Ð¹Ð» Ð°ÑÑÐœÑÒ£ ÒÐ°Ð¹ÑÐ° ÐºÐŸÐŽÑÐ°ÑÑÐœ Ð°ÐœÑÒÑÐ°ÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÑÐ°Ð¹Ð» Ð¶Ò¯Ð¹ÐµÑiÐœiÒ£ ÑÐŸÐŽÐ°Ðœ ÑÐŸÒ£ ÒÐ°Ð¹ÑÐ° ÐºÐŸÐŽÑÐ°ÑÑÐœ ÑiÐ» ÑÐ°Ð»ÐŽÐ°ÑÑ ÒÐŸÐ»ÐŽÐ°ÐœÐ°  
+
+BasePlugin.filename_encoding.auto_lf:Ð€Ð°Ð¹Ð» Ð°ÑÑÐœÑÒ£ ÒÐ°Ð¹ÑÐ° ÐºÐŸÐŽÑÐ°ÑÑÐœ Ð°ÐœÑÒÑÐ°ÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÑÐ°Ð¹Ð» Ð¶Ò¯Ð¹ÐµÑiÐœiÒ£ ÑÐŸÐŽÐ°Ðœ ÑÐŸÒ£ ÒÐ°Ð¹ÑÐ° ÐºÐŸÐŽÑÐ°ÑÑÐœ ÑiÐ» ÑÐ°Ð»ÐŽÐ°ÑÑ ÒÐŸÐ»ÐŽÐ°ÐœÐ°  
+
+BasePlugin.no_blocking:Ð€Ð°Ð¹Ð»ÐŽÐ°ÑÐŽÑ Ð°ÑÐ¿Ð°Ð¹ Ð±Ð»ÐŸÐºÐ°ÐŽÐ°Ð»Ð°ÐŒÐ°Ò£ÑÐ·. ÐÐµÐ· ÐºÐµÐ»Ð³ÐµÐœ (Ð±ÐµÑÐºÐµ Ð²ÐµÐ±ÐºÐµ ÑÑÑÐµÑ ) Ð°ÑÑÐŸÑÐžÐ°ÑÐžÑÐ»Ð°ÐœÒÐ°Ðœ ÑÐ°Ð¹Ð»ÐŽÐ°Ñ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÐŽÑÒ£ ÑÐµÑiÐœÐŽÐµÑiÐœiÒ£ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐ»Ð°ÑÒÐ° ÒÐŸÑÑÐ»Ð°ÐŽÑ.  
+
+BasePlugin.no_cover_image:(prefix ÒÐ°Ð¹ÐŽÐ° - Ð±Ò±Ð» Ð¶Ò±ÐŒÑÑÑÐ°ÐœÑÐ»Ð°ÑÑÐœ ÑÐ°Ð¹Ð»ÐŽÑÒ£ Ð°ÑÐ°ÑÑ ) prefix.jpgÐœiÒ£ ÑÐ°Ð¹Ð»ÑÐœÐ° Ð¿ÑÑÒÑÑÑÐ¿ ÑÐ° ÒÐ°ÑÐ°ÐŒÐ°Ð»Ð°Ñ. ÐÒ±Ð» ÑÑÑÑÑÒ£ ÑÑÑÐµÑÑÐµÑi.  
+
+BasePlugin.OIDtype.auto:Import.plÐ³Ðµ OIDtypeÐœiÒ£ Ð¶ÐžÑÐœÑÐœ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÐŽÑ  
+
+BasePlugin.process_exp:Ð€Ð°Ð¹Ð» Ð°ÑÑÐ°ÑÑÐœÐ° ÑÓÐ¹ÐºÐµÑÑiÐºÐºÐµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ Perl ÐºÓÐŽiÐŒÐ³i Ó©ÑÐœÐµÐº. Ð€Ð°Ð¹Ð» Ð°ÑÑÐœÑÒ£ ÑÓÐ¹ÐºÐµÑÑiÐ³i Ð±Ò±Ð» ÐÐ»Ð°Ð³ÐžÐœÐŒÐµÐœ Ó©Ò£ÐŽÐµÐ»ÐµÐŽi. ÐÑÑÐ°Ð»Ñ, (i ÐŒÐµ?) ÒÐŸÐ»ÐŽÐ°ÐœÑ . . htm ÓÐ»ÐŽÐµ . html Ð±iÑÐµÑiÐœ Ð±Ð°ÑÐ»ÑÒ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÒÐ° \$ ÑÐŸÑÐ²ÐµÑÑÑÐ²ÑÐµÑ html ÐŒÐµ?(Ð°Ð¶ÑÑÐ°ÑÑÐ»Ð°ÑÑÑÐ· Ð±Ð°Ñ Ð¶ÓÐœÐµ ÐºiÑi ÓÑiÐ¿ÑÐµÑ ).  
+
+BasePlugin.smart_block:ÐÐ°ÒÑÐ°ÑÑÑÐ»ÒÐ°Ðœ ÓÐŽiÑÑiÒ£ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÑÐœÑÒ£ Ð±iÑÐµÑi, ÑÐ°Ð¹Ð»ÐŽÐ°ÑÐŽÑÒ£ Ð°ÑÐ°ÑÐ»Ð°ÑÑÐœ ÐºÓ©ÑÑÐŽi Ð±ÐŸÑ ÑÒ±ÑÑ ÐŸÑÑÐœÑÐœÐ°.  
+
+BasePlugin.stems:ÑÐ°Ð±Ð°ÒÑÐ°Ñ  
+
+BasePlugin.file_rename_method:ÐÐŒÐ¿ÐŸÑÑÑÐ°Ð»ÒÐ°Ðœ ÑÐ°Ð¹Ð»ÐŽÑÒ£ ÐºÓ©ÑiÑÐŒÐµÑiÐœiÒ£ Ð¿ÐµÑÐžÐŒÐµÐœÐŸÐ²Ð°ÐœÐžÑÑÑ Ð¶ÓÐœÐµ Ð°ÑÑÐŸÑÐžÐ°ÑÐžÑÐ»Ð°ÐœÒÐ°Ðœ ÑÐ°Ð¹Ð»ÐŽÐ°Ñ Ò¯ÑiÐœ ÓÐŽiÑ.  
+
+BasePlugin.rename_method.url:ÐÐŒÐ¿ÐŸÑÑÑÐ°Ð»ÒÐ°Ðœ Ð¶ÓÐœÐµ Ð°ÑÑÐŸÑÐžÐ°ÑÐžÑÐ»Ð°ÐœÒÐ°Ðœ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÐŽÑÒ£ URLÐœÑÒ£ ÒÐ°Ð¹ÑÐ° ÐºÐŸÐŽÑÐ°ÑÑ Ð¶ÓÐœÐµ Ð°ÑÑÐœ Ó©Ð·Ð³ÐµÑÑÑiÐœ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÐŽÑ  
+
+BasePlugin.rename_method.base64:ÐÐŒÐ¿ÐŸÑÑÑÐ°Ð»ÒÐ°Ðœ Ð¶ÓÐœÐµ Ð°ÑÑÐŸÑÐžÐ°ÑÐžÑÐ»Ð°ÐœÒÐ°Ðœ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÐŽÑÒ£ Ð°ÑÑÐœ Ó©Ð·Ð³ÐµÑÑÑÐ³Ðµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ base64 ÒÐŸÐ»ÐŽÐ°ÐœÑ ÒÐ°Ð¹ÑÐ° ÐºÐŸÐŽÑÐ°ÑÐ»Ð°Ñ.  
+
+BasePlugin.rename_method.none:ÐÑÐŸÐžÐŒÐ¿ÐŸÑÑÐžÑÐŸÐ²Ð°ÐœÐœÑÐµ Ð¶ÓÐœÐµ Ð°ÑÑÐŸÑÐžÐ°ÑÐžÑÐ»Ð°ÐœÒÐ°Ðœ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÐŽÑ Ð°ÑÑÐœ Ó©Ð·Ð³ÐµÑÑÐ¿ÐµÒ£iÐ·  
+
+BibTexPlugin.desc:BibTexPlug BibTex. BibTexPlugÐœiÒ£ ÒÐ°Ð»ÑÐ±ÑÐœÐŽÐ°ÒÑ Ð±ÐžÐ±Ð»ÐžÐŸÐ³ÑÐ°ÑÐžÑÐ»ÑÒ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÑ ÐŸÒÑÐ¿ ÐŸÑÑÑÐ°ÐŽÑ ÑÐ°Ð¹Ð»ÐŽÐ°ÒÑ ÓÑÐ±iÑ ÑiÐ»ÑÐµÐŒÐµÐ³Ðµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÒÒ±Ð¶Ð°ÑÑÑÒ£ ÑÒ¯ÑiÐœ ÒÒ±ÑÐ°ÐŽÑ. ÐÒ±Ð» - SplitPlugÐœiÒ£ ÐºÐ»Ð°ÑÑ ÑÐ°ÑÐŒÐ°ÒÑ, ÐµÐ³ÐµÑ ÐŽÐµÐ³ÐµÐœÐŒÐµÐœÑiÐœ ÐºÓ©Ð¿ÑiÐº Ð¶Ð°Ð·ÑÐ»Ð°ÑÐŽÐ° Ð±ÐŸÐ»Ð°ÐŽÑ, ÐŸÐœÐŽÐ° Ð±Ð°ÑÐ»ÑÒ ÐŸÐ»Ð°Ñ ÐŸÒÑÐ»Ð°ÐŽÑ.  
+
+BookPlugin.desc:ÐÐµÒ£Ð³ÐµÐ¹ÐŽiÒ£ ÑÑÐ³ÑÐµÑi<<TOC>> Ð±ÐŸÐ»Ð°ÑÑÐœ ÒÒ±Ð¶Ð°ÑÑÐ°Ðœ ÐºÓ©Ð¿ ÐŽÐµÒ£Ð³ÐµÐ¹Ð»i ÒÒ±Ð¶Ð°ÑÑ Ð¶Ð°ÑÐ°Ð»Ð°ÐŽÑ. ÓÑÐ±iÑ Ð±Ó©Ð»iÐŒÐ³Ðµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑ ÐºÐµÐ· ÐºÐµÐ»Ð³ÐµÐœ Ð±Ð°ÑÒÐ° ÑÑÐ³ÑÐµÐœ ÑÐŸÐ» Ð¶ÐŸÐ»ÒÐ° Ð°Ð»ÒÐ°Ðœ, ÑÐŸÐœÑÐŒÐµÐœ ÒÐ°ÑÐ°Ñ <<TOC>>. ÐÑÑÐ°Ð»Ñ, <<Title>>xxxx<</Title>>  Ð°ÑÐ°ÑÐŽÑÒ£ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑi ÐŸÑÐœÐ°ÑÐ°ÐŽÑ. Ð¢ÑÐ³ÑÐµÑÐŽiÒ£ Ð°ÑÐ°ÑÑÐœÐŽÐ°ÒÑ Ð±Ð°ÑÐ»ÑÒ Ó©Ò£Ð³ÐµÑi ÑÐžÑÒÑÑ ÒÐ°ÑÐ°Ð»ÑÐŽÐ°Ðœ Ó©ÑÐµÐŽi (htmlÐŽÑÒ£ Ð±Ð°Ð¹Ð»Ð°ÐœÑÑÑ ÐœÐµÐŒÐµÑÐµ HTMLPlugÐœÑÒ£ ÐºÐµÐ· ÐºÐµÐ»Ð³ÐµÐœ Ð±Ð°ÑÒÐ° ÑÒ¯ÑÐ»ÐµÑiÐœiÒ£ ÐµÑÒÐ°ÐœÐŽÐ°Ð¹ ÐŽÐ° Ó©Ò£ÐŽÐµÑi ÐŽÐµÐŒÐµÐº Ó©ÐœÐŽiÑiÐ¿ Ð°Ð»ÐŒÐ°Ð¹ÐŽÑ ) html ÑÒ±ÑÑÐ¿ ÒÐ°Ð». ÐiÑÐµÑiÐœ ÑÐ°Ð¹Ð»ÐŽÐ°Ñ ÐºÐµÒ£ÐµÐ¹ÑÑÐ»ÐµÑÐŽi Ð°Ð»Ð°ÑÑÐœÐŽÐ° . Ò¯ÐœÐŽÐµÐŒÐµÑ Ð±ÐŸÐ¹ÑÐœÑÐ°ÒÐ° hb ÐºÒ¯ÑiÐ»ÐµÐŽi. ÐÒ±Ð» ÑÐ°Ð¹Ð» Ð°ÑÐ¿ÐµÐœ, hbÐœÑÒ£ ÐœÐµÑi ÑÐŸÐ»ÐŽÐ°ÑÐŒÐµÐœ ÑÐ°Ð¹Ð»ÒÐ° ÐŸÐ¿ÑÐžÑ - process_expÐœÑÒ£ ÒÐŸÑÑÐŒÑÐ°ÑÑÐŒÐµÐœ Ó©Ð·Ð³ÐµÑÑiÐ»Ðµ Ð°Ð»Ð°ÐŽÑ, Ð±iÑÐ°Ò ÐºÐµÒ£ÐµÐ¹ÑÑ . (ÑÐ°Ð¹Ð»ÐŽÐ°Ñ jpg Ð±Ò±Ð» ÐÐ»Ð°Ð³ÐžÐœÐŽÐµÑÐŒÐµÐœ ÒÐŸÑÑÐ°ÑÒÐ° Ð°Ð»Ð°ÐŽÑ ) ÑÑÑÐµÑÑiÒ£ ÑÑÑÑÐœÐ° jpg Ð¿Ð°ÑÐ° . BookPlug HBPlug (Ð¶ÓÐœÐµ ÐºÐµÒ£ÐµÐ¹ÑÑÐŒÐµÐœ ) Ð¶ÐµÒ£iÐ»ÐŽÐµÑÑ Ð±ÐŸÐ»ÑÐ¿ ÑÐ°Ð±ÑÐ»Ð°ÐŽÑ ÐÑÐŒÐ°ÐœÐžÑÐ°ÑÐ»ÑÒ ÐºiÑÐ°Ð¿Ñ
+Ð°ÐœÐ°ÐœÑÒ£ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÑÑÐœ. HBPlug.ÐºiÑÐµÑiÐœ ÑÐ°Ð¹Ð»ÐŽÐ°Ñ (ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐ»Ð°ÑÒÐ° HDLÒÐ° ÐºiÑÑ <<TOC>> ÑÑÑÐµÑÑi Ð°ÐœÑÒÑÐ°Ð»Ñ Ò¯ÑiÐœ <<I>>, Ð¶ÓÐœÐµ <<TOC>>, ÐŒÓÑiÐœÐœiÒ£ Ð±Ð°ÑÑÐŒÐµÐœ Ð°ÑÐ°ÑÐŽÑÒ£ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑi Ð±ÐŸÐ»ÑÑ ÐºÐµÑÐµÐº Ð±ÐŸÐ» ) ÑÑÐ³ÑÐµÑÐŽiÒ£ Ð°ÑÐ°ÑÑÐœÐŽÐ°ÒÑ Ð±Ð°ÑÐ»ÑÒ ÐŒÓÑiÐœÐŽÐµÑ Ð¶Ð°Ð¹ ÒÐ°ÐœÐ° Ð°Ð»Ð°ÐŽÑ ) ÑÑÐ³ÑÐµÑ ÒÐŸÐ»ÐŽÐ°ÐœÐ° ) ÑÑÐ³ÑÐµÑ htmlÐŽÑÒ£ ÒÐŸÑÑÐŒÑÐ° ÑÑÐ³ÑÐµÑiÐœ Ð¶ÐžÑÐœ Ð°Ð¹ÐœÐ°Ð»Ð° Ð±ÐŸÐ»Ð°ÐŽÑ ) ÑÐ°Ð·Ð°ÑÐ°Ò Ð±ÐŸÐ»ÑÑ ÐºÐµÑÐµÐº Ð±ÐŸÐ»Ð°ÑÑÐœÐŽÐ° ÐµÑÐµÐ¿ÑÐµÐ¹ÑiÐœÐŽiÐ³iÐœÐµÐœ, BookPlug Ð¶ÑÐ»ÐŽÐ°ÐŒÑÑÐ°ÒÑÐ°ÑÐŽÑ Ð±ÐŸÐ»ÑÐ¿ ÑÐ°Ð±ÑÐ»Ð°ÐŽÑ. ÐÐ³ÐµÑ ÑiÐ· ÑÐŸÐ» ÓÐŽiÑÑÐµÑÐŒÐµÐœ ÐºÓ©ÑÑÐµÑiÐ»ÐµÑiÐœ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÐŽÑ Ð±ÐµÐ»Ð³iÐ»ÐµÑÐµÒ£iÐ·, ÐœÐµ HDLÐœÑÒ£ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÑÑ, HBPlug ÐŸÑÑÐœÑÐœÐ° Ð±Ò±Ð» ÐÐ»Ð°Ð³ÐžÐœÐŽi ÒÐŸÐ»ÐŽÐ°ÐœÑÒ£ÑÐ·.  
+
+CONTENTdmPlugin.desc:CONTENTdmÐœÑÒ£ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐ»Ð°ÑÑ Ð¿ÑÐŸÑÐºÑÐ¿ÐŸÑÑÐžÑÐŸÐ²Ð°ÐœÐœÑÑ
+ÒÐ° ÑÐ°Ð¹Ð»ÐŽÐ°Ñ Ó©Ò£ÐŽÐµÐ»ÐµÑiÐœ RDF ÐÐ»Ð°Ð³ÐžÐœ.  
+
+ConvertBinaryFile.apply_fribidi:ÐÑÐºiÐœ Ð°ÑÐŽÐ°ÑÑÐ»ÒÐ°Ðœ (ÐŒÓÑiÐœÐŒÐµÐœ ÐŸÒ£ÐœÐ°Ðœ ÑÐŸÐ»ÒÐ° ) ÑÐ°Ð¹Ð»ÐŽÐ°ÒÑ Unicode Bidirectional Algorithm "Fribidi" Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐ°ÑÑÐœ ÐŸÑÑÐœÐŽÐ°Ñ.  
+
+ConvertBinaryFile.convert_to:ÐÑÑÐ°Ð»Ñ, ÐÐ»Ð°Ð³ÐžÐœ HTML, ÐœÐµÐŒÐµÑÐµ TEXTiÐœÐµ ÐµÑÐºiÐœ Ð°ÑÐŽÐ°ÑÐ°ÐŽÑ, ÐœÐµÐŒÐµÑÐµ.  
+
+ConvertBinaryFile.convert_to.auto:Ð¡ÐŸÐœÑÐŒÐµÐœ Ð±iÑÐ³Ðµ ÐµÑÐºiÐœ Ð°ÑÐŽÐ°ÑÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÒÐ°Ð»ÑÐ¿ÑÑ Ð°Ð²ÑÐŸÐŒÐ°ÑÑÑ ÑÐ°Ð¹Ð»Ð°ÐœÐ°ÐŽÑ. ÒÐ°Ð»ÑÐ¿ÑÑÒ£ ÑÐ°Ò£ÐŽÐ°ÑÑ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÑÑÐœ ÒÒ±Ð¶Ð°ÑÑÑÒ£ ÑÒ¯ÑiÐœÐµÐœ ÑÓÑÐµÐ»ÐŽi Ð±ÐŸÐ»Ð°ÐŽÑ. ÐÑÑÐ°Ð», WordÒÐ° (PagedImage ) Ð±ÐµÑÑiÐº ÐžÐ»Ð»ÑÑÑÑÐ°ÑÐžÑ ÐÑÐžÐœÑÑÐŸÑÐœ ÒÐ°Ð»ÑÐ¿ÒÐ° HTMLÒÐ°, PowerPointÑiÒ£ ÐŸÑÑ ÑÐ°ÒÑÑÑÐ°ÑÑÐœ Ð°Ð²ÑÐŸÐŒÐ°ÑÑÑ ÐµÑÐºiÐœ Ð°ÑÐŽÐ°ÑÐ°ÐŽÑ.  
+
+ConvertBinaryFile.convert_to.html:HTML ÒÐ°Ð»ÑÐ¿.  
+
+ConvertBinaryFile.convert_to.text:ÒÐ°ÑÐ°Ð¿Ð°Ð¹ÑÐŒ ÐŒÓÑiÐœÐœiÒ£ ÒÐ°Ð»ÑÐ±Ñ.  
+
+ConvertBinaryFile.convert_to.pagedimg:Ð¡ÑÑÐµÑÑÐµÑÐŽiÒ£ ÑÐŸÐ¿ÑÐ°ÐŒÐ°ÑÑ.  
+
+ConvertBinaryFile.convert_to.pagedimg_jpg:Ð¡ÑÑÐµÑÑÐµÑÐŽiÒ£ JPEGÐœÑÒ£ ÒÐ°Ð»ÑÐ±ÑÐœÐŽÐ°ÒÑ ÑÐŸÐ¿ÑÐ°ÐŒÐ°.  
+
+ConvertBinaryFile.convert_to.pagedimg_gif:Ð¡ÑÑÐµÑÑÐµÑÐŽiÒ£ GIFÑiÒ£ ÒÐ°Ð»ÑÐ±ÑÐœÐŽÐ°ÒÑ ÑÐŸÐ¿ÑÐ°ÐŒÐ°.  
+
+ConvertBinaryFile.convert_to.pagedimg_png:Ð¡ÑÑÐµÑÑÐµÑÐŽiÒ£ PNGÐœÑÒ£ ÒÐ°Ð»ÑÐ±ÑÐœÐŽÐ°ÒÑ ÑÐŸÐ¿ÑÐ°ÐŒÐ°.  
+
+ConvertBinaryFile.desc:ÐÒ±Ð» ÐÐ»Ð°Ð³ÐžÐœi WordPlug Ð¶ÓÐœÐµ PDFPlug ÑÐŸÐœÐŽÐ°Ð¹ ÐÐ»Ð°Ð³ÐžÐœÐŽÐµÑi ÐŒÒ±ÑÐ°ÑÑ Ð±ÐŸÐ¹ÑÐœÑÐ° Ð±ÐµÑiÐ»ÐµÐŽi. ÐÐ» Ð°Ð¹ÐœÑÐŒÐ°Ð»Ñ ÐŒÓÐœÐŽÐµÑiÐœ ÐºÓ©ÑÑÐµÑÐµÐŽi ConvertToBasPlugÐœÑÒ£ ÐÐ»Ð°Ð³ÐžÐœi Ð¶Ò±ÐŒÑÑ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÑÑÐœ Ð±ÐŸÐ»ÒÐ°Ðœ HTML ÐœÐµÐŒÐµÑÐµ TEXTÑiÒ£ ÒÐ°Ð»ÑÐ¿ÑÐ°ÑÑÐœÐŽÐ° Ð±Ò±Ð» ÒÒ±Ð¶Ð°ÑÑÐ°ÑÐŽÑ ÐµÑÐºiÐœ Ð°ÑÐŽÐ°ÑÑÒÐ° ÐºÓ©ÐŒÐµÐºÑÐµÑÐµÐŽi. ÐÒ±Ð» HTMLPlug ÐœÐµÐŒÐµÑÐµ TEXTPlugÐœiÒ£ ÐÐ»Ð°Ð³ÐžÐœÐŽÐµÑiÐœiÒ£ convert_toÐœÑÒ£ ÐÐ»Ð°Ð³ÐžÐœiÐœiÒ£ ÐŽÓÐ»ÐµÐ»iÐœiÒ£ ÐŒÒ±ÑÐ°ÑÑ Ð±ÐŸÐ¹ÑÐœÑÐ° 2~ Ð±ÐµÑiÐ»Ñi Ð°ÑÒÑÐ»ÑÐŽÐ° ÐŽÐžÐœÐ°ÐŒÐžÐºÐ°Ð»ÑÒ Ð±ÐŸÐ»Ð°ÐŽÑ. ÐÐ³ÐµÑ ÐŽÓÐ»ÐµÐ» Ò¯ÐœÐŽÐµÐŒÐµÑ Ð±ÐŸÐ¹ÑÐœÑÐ°ÒÐ° ÐŒÓÐœ Ð±Ð°Ñ Ð±ÐŸÐ»ÐŒÐ°Ð¹, Ð±ÐµÑiÐ»ÑÐµ,  
+
+ConvertBinaryFile.keep_original_filename:ÐÑÑÐŸÑÐžÐ°ÑÐžÑÐ»Ð°ÐœÒÐ°Ðœ ÑÐ°Ð¹Ð»ÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ Ð±iÑÑÑÐŒÐ° ÑÐ°Ð¹Ð» Ð°ÑÑÐ°ÑÑÐœ ÑÐ°ÒÑÐ°ÑÑÐœ, doc.pdf, doc.docÒÐ° Ð¶ÓÐœÐµ ÑÐ°ÒÑ Ð±Ð°ÑÒÐ°Ð»Ð°Ñ Ó©ÑÐœÐµÐºÑÐµÑ ÐµÐŒÐµÑ.  
+
+ConvertBinaryFile.use_strings:ÐÐ³ÐµÑ ÐºÐŸÐœÐ²ÐµÑÑÐžÑÐœÑÒ£ ÑÑÐžÐ»ÐžÑÐ°ÑÑ iÑÑÐµÐŒÐµÑÐµ, ÐµÐ³ÐµÑ Ð°ÐœÑÒÑÐ°Ð»ÑÐ°, ÐŸÐœÐŽÐ° ÐŸÒ£Ð°Ð¹ ÑiÐ·Ð±ÐµÐºÑiÐº ÑÑÐœÐºÑÐžÑ ÐŒÓÑiÐœÐœiÒ£ ÑÑÒÐ°ÑÑÑÐœÐ° ÑÐ°ÒÑÑÑÐ»Ð°ÐŽÑ.  
+
+ConvertToRogPlugin.desc:RogPlug ÐŒÒ±ÑÐ° ÐµÑÐµÑiÐœ ÐÐ»Ð°Ð³ÐžÐœ.  
+
+CSVPlugin.desc:Ð€Ð°Ð¹Ð»ÐŽÐ°ÑÐŽÑÒ£ Ò¯ÑiÑ Ð°Ð¹ÑÑÑÒ ÐŒÓÐœÐŽÐµÑÐŽiÒ£ ÒÐ°Ð»ÑÐ±ÑÐœÐŽÐ° Ò¯ÑiÐœ ÐÐ»Ð°Ð³ÐžÐœ. Ð€Ð°Ð¹Ð»ÐŽÑÒ£ ÓÑÐ±iÑ Ð¶ÐŸÐ»ÑÐœÐ° Ð¶Ð°Ò£Ð° ÒÒ±Ð¶Ð°ÑÑÑ Ð¶Ð°ÑÐ°Ð»Ð°ÐŽÑ.  
+
+DateExtractor.desc:ÐÓÑiÐœÐœÐµÐœ ÑÐ°ÑÐžÑ
+Ðž ÐŽÐ°ÑÐ°Ð»Ð°ÑÐŽÑÒ£ ÑÑÒÐ°ÑÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÑÐºÑÑÑÐ°ÐºÑÐŸÑÐŽÑÒ£ ÐºÓ©ÐŒÐµÐ³iÐœiÒ£ ÐÐ»Ð°Ð³ÐžÐœi.  
+
+DateExtractor.extract_historical_years:Ð¢Ð°ÑÐžÑ
+Ðž ÒÒ±Ð¶Ð°ÑÑÐ°ÑÐŽÐ°Ðœ ÑÐ°ÒÑÑÑÐ° ÐŒÐµÑÐ·iÐŒi ÑÑÑÐ°Ð»Ñ ÐŒÓÐ»iÐŒÐµÑÑi Ð°Ð»Ñ. ÐÐ» ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ ÑÐµÑiÐœÐŽÐµÑiÐœ ÒÒ±Ð¶Ð°ÑÐ¿ÐµÐœ ÑÐ°ÒÑÐ°Ð»Ð°ÐŽÑ. Ð¡iÐ· ÑiÐ·ÐŽiÒ£ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÒ£ÑÐ·ÒÐ° ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐœÑÒ£ ÑiÐ·ÐŽiÒ£ ÐºÐµÑÐºiÐœÐŽi ÑÐ°Ð¹Ð»ÑÒ£ÑÐ·ÑÐœÐ° "Format QueryInterface DateSearch" ÐŸÐ¿ÐµÑÐ°ÑÐŸÑ ÑÐŸÐ»ÑÒÑÑÑÐ° ÒÐŸÑÐ° Ð°Ð»ÒÐ°Ðœ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ ÐŸÐ» Ò¯ÑiÐœÐŽÐµÑi iÐ·ÐŽÐµÑÑiÑÑÐŽi ÐžÐœÑÐµÑÑÐµÐ¹ÑÑÐµ Ð±ÐŸÐ»Ð°ÐŽÑ.  
+
+DateExtractor.maximum_century:ÐÑÑÐ°Ð»Ñ, ÑÐ°ÑÐžÑ
+Ðž ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ ÑÐµÑiÐœÐŽÐµÑi 14 Ð°Ð»Ð° 14-Ñi Ð¶Ò¯Ð· Ð¶ÑÐ»ÐŽÑÒ Ð¶Ð°ÑÐ°ÑÑÐœ Ð±Ð°ÑÐ»ÑÒ ÑiÐ»ÑÐµÐŒÐµÐ»ÐµÑ Ð°Ð»ÒÐ°Ðœ Ð°ÑÐ°Ð»ÒÐ°Ðœ Ð¶Ò¯Ð· Ð¶ÑÐ»ÐŽÑÒÑÑÒ£ ÐŒÐ°ÐºÑÐžÐŒÐ°Ð» ÐŒÓÐœi.  
+
+DateExtractor.maximum_year:(1950-Ñi ÐŽÓÑiÑ, ÑÒ¯ÑÐŽiÒ£ ÐŽÐ°ÑÐ°ÑÑ ) ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ ÑÐµÑiÐœÐŽÐµ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»ÒÐ°Ðœ ÐŒÐ°ÐºÑÐžÐŒÐ°Ð» ÑÐ°ÑÐžÑ
+Ðž ÐŽÐ°ÑÐ°ÑÑ.  
+
+DateExtractor.no_bibliography:ÐÐžÐ±Ð»ÐžÐŸÐ³ÑÐ°ÑÐžÑÐ»ÑÒ ÐŽÐ°ÑÐ°Ð»Ð°Ñ ÑÐ°ÑÐžÑ
+Ðž ÐŽÐ°ÑÐ°Ð»Ð°ÑÐŽÑÒ£ ÑÑÒÐ°ÑÑÑÐœÐŽÐ° Ð±Ð»ÐŸÐºÐ°ÐŽÐ°Ð»Ð°ÑÒÐ° ÐŽÓÐŒ ÑÐ°ÑÐ¿Ð°Ò£ÑÐ·.  
+
+DirectoryPlugin.desc:RecPlug - Ð±Ò±Ð» ÓÑÐ±iÑ ÐŽÐžÑÐµÐºÑÐŸÑÐžÑÐŽÐ° ÐŸÐ» ÑÐ°Ð±Ð°ÑÑÐœ ÓÑÐ±iÑ ÑÐ°Ð¹Ð» Ð¶Ò±ÐŒÑÑÑÐ°ÐœÐ° ÒÐ°Ð¹ÑÐ°Ð»Ð°Ð¹ÑÑÐœ ÐÐ»Ð°Ð³ÐžÐœ.  
+
+DirectoryPlugin.recheck_directories:ÐÐŒÐ¿ÐŸÑÑÑÑÒ£ Ð¿Ð°Ð¿ÐºÐ°ÑÑÐœÐŽÐ°ÒÑ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÑ ÑÐžÑÒÑÑÒÐ°ÐœÐœÐ°Ðœ ÐºÐµÐ¹iÐœÐŽÐµÑ Ó©Ò£ÐŽÐµÐ»iÐ¿, Ð¿Ð°Ð¿ÐºÐ° ÑÐ°Ð¹Ð»ÐŽÐ°Ñ ÐºÐµÐ· ÐºÐµÐ»Ð³ÐµÐœ ÒÐ°Ð¹ÑÐ° Ð¶Ð°ÑÐ°Ð»ÑÐœÒÐ°ÐœÐŽÐ°ÑÐŽÑ Ð±iÐ»ÐŽiÑÑ Ò¯ÑiÐœ ÒÐ°Ð¹ÑÐ°ÐŽÐ°Ðœ ÐŸÒÐžÑÑÐœ Ð±ÐŸÐ»Ð°ÐŽÑ.  
+
+DirectoryPlugin.use_metadata_files:(ÐÐ»ÐŒÐ°ÑÑÑÑÒÐ°Ðœ -ÐÐ»Ð°Ð³ÐžÐœÐŽÐµÑÐŽiÒ£ ÑiÐ·iÐŒiÐœÐµ MetadataXMLPluginÐœiÒ£ ÐÐ»Ð°Ð³ÐžÐœi ÒÐŸÑÑÒÐ°  ) ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑ XML ÐŸÒÑÐ¿ ÐŸÑÑÑÑÑÐœ - ÑÐ°Ð¹Ð»ÐŽÐ°Ñ.  
+
+DatabasePlugin.desc:ÐÐµÑÐµÐºÑÐµÑ ÒÐŸÑÑÐœÐ°Ðœ Ð¶Ð°Ð·ÑÐ»Ð°ÑÑÐœ ÐžÐŒÐ¿ÐŸÑÑ ÐÐ»Ð°Ð³ÐžÐœ.ÐÐµÑÐºiÐœÐŽi ÑÐ°Ð¹Ð»ÐŽÐ°ÑÐŽÑÒ£ ÐŒÑÑÐ°Ð»ÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ / example.dbiÐœiÒ£ Ð¿Ð°ÐºÐµÑi / ETC /ÐœÑ  ÐºÓ©ÑÑ.  
+
+DSpacePlugin.desc:ÐÐ»Ð°Ð³ÐžÐœ DSpaceÐŽÐ°Ðœ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÐŽÑÒ£ ÑÐµÑÐºÐµ ÑÑÒÐ°ÑÑÐ»Ð°ÑÑÐœ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐ»Ð°ÑÑ ÐŸÒÐžÐŽÑ Ð¶ÓÐœÐµ ÐÑÐžÐœÑÑÐŸÑÐœÒÐ° ÐžÐŒÐ¿ÐŸÑÑÑÐ°Ð¹ÐŽÑ.  
+	
+DSpacePlugin.first_inorder_ext:ÐÒ±Ð» ÐŸÐ¿ÑÐžÑÐ»Ð°Ñ DSpace ÒÒ±Ð¶Ð°ÑÑÐ°ÑÑÐœÑÒ£ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐœÑÒ£ Ð°ÑÐ° ÐŒÐ°Ò£ÑÐ·ÐŽÑ Ð°ÒÑÐœÑÐœÑÒ£ Ð°ÐœÑÒÑÐ°ÑÑÐœÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ. ÐÑÐŸÐ³ÑÐ°ÐŒÐŒÐ° Ð±ÐŸÐ»ÑÑ ÐŒÒ¯ÐŒÐºiÐœ extÑÑÒ£ Ð°ÑÐ° ÐŒÐ°Ò£ÑÐ·ÐŽÑ ÑÐ°Ð¹Ð»ÑÐœ iÐ·ÐŽÐµÐ¹ÐŽi.  
+
+DSpacePlugin.first_inorder_mime:ÐÒ±Ð» ÐŸÐ¿ÑÐžÑÐ»Ð°Ñ DSpaceÐœÑÒ£ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÑÑÐœÑÒ£ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÑÐœÑÒ£ Ð°Ð»ÒÐ°ÑÒÑ Ð°ÒÑÐœÐœÑÒ£ Ð°ÐœÑÒÑÐ°ÑÑÐœÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ. ÐÑÐŸÐ³ÑÐ°ÐŒÐŒÐ° Ð±ÐŸÐ»ÑÑ ÐŒÒ¯ÐŒÐºiÐœ Ð°ÑÐ° ÐŒÐ°Ò£ÑÐ·ÐŽÑ ÑÐ°Ð¹Ð»ÐŽÑ ÑÐ°Ð±ÑÐ»Ñ Ò¯ÑiÐœ ÑÐŸÐ¿ÑÐ°ÐŒÐ°ÐŽÐ°ÒÑ mimeÐœiÒ£ ÒÒ±Ð¶Ð°ÑÑÐœÑÒ£ Ð±ÐµÐ»Ð³i ÒÐŸÐ¹ÑÐ»ÒÐ°Ðœ ÑÒ¯ÑÐ»ÐµÑiÐœ ÒÐŸÐ»ÐŽÐ°ÐœÐ°ÐŽÑ.  
+
+DSpacePlugin.only_first_doc:ÐÒ±Ð» ÐŸÐ¿ÑÐžÑÐ»Ð°Ñ DSpaceÐœÑÒ£ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÑÑ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÑÐœÐŽÐ°ÒÑ Ð°Ð»ÒÐ°ÑÒÑ Ð°ÒÑÐœÐœÑÒ£ Ð°ÐœÑÒÑÐ°ÑÑÐœÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ. ÐÑÐŸÐ³ÑÐ°ÐŒÐŒÐ° Ð±iÑiÐœÑi Ð±ÐµÐ»Ð³i ÒÐŸÐ¹ÑÐ»ÒÐ°Ðœ dublic_coreÐœiÒ£ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑiÐœiÒ£ ÑÐ°Ð¹Ð»ÑÐœÐŽÐ° Ð°ÑÐ° ÐŒÐ°Ò£ÑÐ·ÐŽÑ ÑÐ°Ð¹Ð»ÑÐŒÐµÐœ ÑÐ°ÐœÐ°Ð¹ÐŽÑ.  
+
+EmailAddressExtractor.desc:ÐÓÑiÐœÐŽÐµÐ³i ÑÐ»ÐµÐºÑÑÐŸÐœÐŽÑÒ Ð¿ÐŸÑÑÐ°ÐœÑÒ£ ÐŒÐµÐºÐµÐœÐ¶Ð°Ð¹Ð»Ð°ÑÑÐœ iÐ·ÐŽÐµÑÑiÑÑÐ³Ðµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÑÐºÑÑÑÐ°ÐºÑÐŸÑÐŽÑÒ£ ÐºÓ©ÐŒÐµÐ³iÐœiÒ£ ÐÐ»Ð°Ð³ÐžÐœi.  
+
+EmailAddressExtractor.done_email_extract:Ð­Ð»ÐµÐºÑÑÐŸÐœÐŽÑÒ Ð¿ÐŸÑÑÐ°ÐœÑÒ£ ÐŒÐµÐºÐµÐœÐ¶Ð°Ð¹Ð»Ð°ÑÑÐœ ÑÑÒÐ°ÑÑ ÐŸÑÑÐœÐŽÐ°ÒÐ°Ðœ.  
+
+EmailAddressExtractor.extracting_emails:ÑÐ»ÐµÐºÑÑÐŸÐœÐŽÑÒ Ð¿ÐŸÑÑÐ°ÐœÑÒ£ ÐŒÐµÐºÐµÐœÐ¶Ð°Ð¹Ð»Ð°ÑÑÐœ ÑÑÒÐ°ÑÑ  
+
+EmailAddressExtractor.extract_email:ÐÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ ÑÐµÑiÐœÐŽÐµÑiÐœiÒ£ ÑÐ»ÐµÐºÑÑÐŸÐœÐŽÑÒ Ð¿ÐŸÑÑÐ°ÐœÑÒ£ ÐŒÐµÐºÐµÐœÐ¶Ð°Ð¹Ñ Ð°Ð»Ñ.  
+
+EmailPlugin.desc:Email ÐÐ»Ð°Ð³ÐžÐœ ÑÐ»ÐµÐºÑÑÐŸÐœÐŽÑÒ Ð¿ÐŸÑÑÐ°ÐœÑÒ£ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÑ ÐŸÒÑÐ¿ ÐŸÑÑÑÐ°ÐŽÑ. ÐÐ»Ð°Ñ (ÐŸÐ»Ð°Ñ Ð¿ÐŸÑÑÐ°Ð»ÑÒ ÐŽÐžÑÐµÐºÑÐŸÑÐžÑ Ð¿Ð°Ð¿ÐºÐ°Ð»Ð°ÑÑÐœÐŽÐ°ÒÑ ÐºÓ©ÑiÐœiÐ¿ ÒÐ°Ð»Ð°ÑÑÐœ ÑÐŸÐ» ÑÐµÑÑÐµ ÑÒÐœÐž ) ÐœÓ©ÐŒiÑÐ»ÐµÑÐŒÐµÐœ ÐœÐµÐŒÐµÑÐµ ÐºÐµÒ£ÐµÐ¹ÑÑÐŒÐµÐœ Ð±ÐŸÑ ÑÒ±ÑÑÐ»Ð°ÑÐŒÐµÐœ Ð°Ñ ÒÐŸÐ¹ÑÐ»Ð°ÐŽÑ . mbxÐŽÐŸÐŸÐºÑÐŒÐµÐœÑÐ° \n\t\$ÐŒÓÑiÐœ (mboxÑÑÒ£ Ñ
+Ð°ÑÑÐ°ÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÑÐ°Ð¹Ð»ÐŽÑÒ£ ÒÐ°Ð»ÑÐ±Ñ ) : ÒÒ±Ð¶Ð°ÑÑÑÒ£ ÐŒÓÑiÐœi ÒÒ±Ð¶Ð°ÑÑÐ° Ð±ÐŸÑ Ð¶ÐŸÐ» ÐŒÓÑiÐœ Ð±Ð°ÑÐ»ÑÒÑÐŒÐµÐœ Ð±iÑiÐœÑiÐŽÐµÐœ ÐºÐµÐ¹iÐœ ÑÒ±ÑÐ°ÐŽÑ . (Dublin CoreÐ»ÐµÑ ÐµÐŒÐµÑ !) \n ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑ \n\t\$HeadersÐ¡ÐžÑÒÑÑ Ð±Ð°ÑÐ»ÑÒÑ _Subject Ð·Ð°Ñ (ÐŒiÐœÐŽÐµÑÑi ÐµÐŒÐµÑ, Ò¯ÐœÐŽÐµÐŒÐµÑ Ð±ÐŸÐ¹ÑÐœÑÐ°ÒÐ° ÑÐ°ÒÑÐ°Ð»ÑÐœÐ±Ð°Ð¹ÐŽÑ ) Ð±Ð°ÑÑÐ° Ð±ÐŸÐ»Ð°ÐŽÑ : ÐºiÐŒÐ³Ðµ Ð·Ð°Ð³ÐŸÐ»ÐŸÐ²ÐŸÐº\n\t\$To :ÐºiÐŒ ÐºiÐŒ   
+
+EmailPlugin.no_attachments:ÒÐ°ÑÑÐœÐ°ÑÑÑÒ£ ÒÐŸÑÑÐŒÑÐ°ÑÑÐœ ÑÐ°ÒÑÐ°ÐŒÐ°Ñ.  
+
+EmailPlugin.headers:Ð¡ÐžÑÒÑÑ Ð¿ÐŸÑÑÐ°Ð»ÑÒ Ð±Ð°ÑÑÐ°Ñ ÐŒÐµÑÐ° ÑÐ°ÒÑÐ°Ð»ÑÑÐœ - "Headers" ÐŒÓÐ»iÐŒÐµÑÑÐµÑ  
+
+EmailPlugin.OIDtype.message_id:ÒÒ±Ð¶Ð°ÑÑÑÒ£ OID ÑÐµÑiÐœÐŽÐµÑiÐœiÒ£ ÒÐ°ÑÑÐœÐ°ÑÑÑÒ£ ÐžÐŽÐµÐœÑÐžÑÐžÐºÐ°ÑÐŸÑÑÐœ ÒÐŸÐ»ÐŽÐ°ÐœÑÒ£ÑÐ·. ÐÐ³ÐµÑ ÐžÐŽÐµÐœÑÐžÑÐžÐºÐ°ÑÐŸÑ ÑÐ°Ð±ÑÐ»ÑÐ°, ÑÐŸÐŽÐ°Ðœ ÑÐŸÒ£ OID ÐºÓ©Ð·iÐœ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÐŽÑ.  
+
+EmailPlugin.split_exp:Perl ÐºÓÐŽiÐŒÐ³i Ó©ÑÐœÐµÐ³i Ð¶ÐµÐºÐµ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÐŽÐ°ÒÑ ÒÐ°ÑÑÐœÐ°ÑÑÐ°ÑÑ ÓÐŽÐµÑÑÐµÐ³iÐ»iÐº ÑÐ°Ð¹Ð»ÐŽÐ°ÑÐŽÑ Ð¶Ð°ÑÑÒÐ° Ð°Ð»ÑÒÐ° Ð±ÐŸÐ»Ð°ÑÑÐœ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÐŽÑÒ£ ÑÐŽÑÑÐ°ÑÑÐœÐ° Ð±ÐŸÐ»Ð°ÑÑÐœ ÐºÓ©Ð¿ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÐŽÑ.  
+
+ExcelPlugin.desc:Microsoft ExcelÐŽiÒ£ ÑÐ°Ð¹Ð»ÑÐœÑÒ£ ÐžÐŒÐ¿ÐŸÑÑÑÐœÐ° ÐÐ»Ð°Ð³ÐžÐœi.  
+
+FavouritesPlugin.desc:ÐÐœÑÐµÑÐœÐµÑÑiÒ£ Ó©ÑÐºiÐ·Ð³iÑÑiÒ£ Ð±ÐµÐ»Ð³iÐ»ÐµÑiÐœiÒ£ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÑÐœÑÒ£ Ó©Ò£ÐŽÐµÑiÐœÐµ ÐÐ»Ð°Ð³ÐžÐœ  
+
+FOXPlugin.desc:Foxbase dbtÑÑÒ£ ÑÐ°Ð¹Ð»ÑÐœÑÒ£ Ó©Ò£ÐŽÐµÑiÐœÐµ ÐÐ»Ð°Ð³ÐžÐœ. ÐÒ±Ð» ÐÐ»Ð°Ð³ÐžÐœ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÐŽÑÒ£ dbt Ð¶ÓÐœÐµ dbfÑiÒ£ ÐŸÒÑÑÐœÑÒ£ ÐœÐµÐ³iÐ·Ð³i ÑÑÐœÐºÑÐžÐŸÐœÐ°Ð»ÐŽÑÒ ÐŒÒ¯ÐŒÐºiÐœÐŽiÐºÑÐµÑi Ð¶ÓÐœÐµ ÓÑÐ±iÑ Ð¶Ð°Ð·ÑÐŽÑ Ó©Ò£ÐŽÐµÑÐŽi ÒÐ°ÐŒÑÐ°ÐŒÐ°ÑÑÐ· ÐµÑÐµÐŽi. ÐÒ±Ð» ÐŸÑÑÐ°Ò ÐÐ»Ð°Ð³ÐžÐœ ÑÐ°Ð¹Ð»ÐŽÐ°ÒÑ ÑÐžiÑÑi Ó©ÑiÑÑÐµÑi Ó©Ò£ÐŽÐµÐ»Ñ Ò¯ÑiÐœ ÐµÑÐµÐºÑÐµ ÐŽÐµÑÐµÐºÑÐµÑ ÒÐŸÑÑÐœÐ° ÐŸÑÐœÑÐœ Ð±Ð°ÑÑÑ ÐºÐµÑÐµÐº.  
+
+GreenstoneXMLPlugin.desc:GreenstoneÐœÑÒ£ Ð°ÑÑ
+ÐžÐ²ÑÐœÑÒ£ XML ÒÒ±Ð¶Ð°ÑÑÐ°ÑÑÐœÑÒ£ Ó©Ò£ÐŽÐµÑi. ÐÐ»Ð°Ð³ÐžÐœ ÐºÓ©Ò£iÐ» Ð°ÑÐŽÐ°Ñ, ÐŒÑÐœÐ°Ñ ÐœÐµ (XML::-ÑÑ ÑÐ°Ð»ÐŽÐ°ÑÑÑ ÐŒÐŸÐŽÑÐ» ÒÒ±ÑÐ°ÑÑÑÑÑÐŽÑ ÐŽÒ±ÑÑÑÑÑÒ ÑÐµÐºÑÐµÑÐµÑiÐœÐŽiÐ³iÐŒÐµÐœ ) ÑÐžÐœÑÐ°ÐºÑÐžÑÑiÒ£ ÐµÑÒÐ°ÐœÐŽÐ°Ð¹ ÐŽÐ° ÑÐµÐºÑÐµÑÑi iÑÑÐµÐŒÐµÐ¹ÐŽi. GreenstoneÐœÑÒ£ Ð°ÑÑ
+ÐžÐ²ÑÐœÑÒ£ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÑ ÐŸÐ»Ð°ÑÐŽÑÒ£ DTDÑÐ°ÑÑÐœÐ° ÑÓÐ¹ÐºÐµÑ ÐºÐµÐ»ÐµÑiÐœÐŽÐµ ÐµÑÐµÐ¿ÑÐµÐ¹ÐŽi.  
+
+GISExtractor.desc:(GIS ) ÐÐµÐŸÐ³ÑÐ°ÑÐžÑÐ»ÑÒ ÐÓÐ»iÐŒÐµÑ Ð¶Ò¯Ð¹ÐµÐ»ÐµÑÐŽiÒ£ ÐŒÒ¯ÐŒÐºiÐœÐŽiÐ³iÐœ ÒÐŸÐ»ÐŽÐ°Ð¹ÑÑÐœ BasPlugÒÐ° ÒÐŸÑÑÐŒÑÐ° ÐºÐ»Ð°ÑÑ  
+
+GISExtractor.extract_placenames:ÐÓÑiÐœÐŽÐµÐ³i Ð³ÐµÐŸÐ³ÑÐ°ÑÐžÑÐ»ÑÒ Ð°ÑÐ°ÑÐŽÑ Ð Ð°ÑÐ¿ÐŸÐ·ÐœÐŸÐ²Ð°ÑÑ Ð¶ÓÐœÐµ ÐŸÐ»Ð°Ñ ÐŒÐµÑÐ° ÒÐŸÑÑÐ»ÑÑÐœ - ÐŒÓÐ»iÐŒÐµÑÑÐµÑ. ÐÑÐžÐœÑÑÐŸÑÐœÒÐ° Ð³ÐžÑ ÐºÐµÒ£ÐµÐ¹ÑÑ ÑÐ°Ð»Ð°Ð¿ ÐµÑÐµÐŽi.  
+
+GISExtractor.gazetteer:ÐÓÑiÐœÐŽÐµÐ³i Ð³ÐµÐŸÐ³ÑÐ°ÑÐžÑÐ»ÑÒ Ð°ÑÐ°ÑÐ»Ð°ÑÐŽÑ Ð°Ð¹ÑÑÑÐ¿ ÑÐ°ÐœÑ Ð¶ÓÐœÐµ ÒÐŸÑÑÐŒÑÐ°ÒÐ° Ð³ÐµÐŸÐ³ÑÐ°ÑÐžÑÐ»ÑÒ Ð°ÐœÑÒÑÐ°ÐŒÐ°ÑÑ ÐŸÐ»Ð°ÑÐŽÑ ÐŒÐµÑÐ° - ÐŒÓÐ»iÐŒÐµÑÑÐµÑ. ÐÑÐžÐœÑÑÐŸÑÐœÒÐ° Ð³ÐžÑ ÐºÐµÒ£ÐµÐ¹ÑÑ ÑÐ°Ð»Ð°Ð¿ ÐµÑÐµÐŽi.  
+
+GISExtractor.place_list:ÒÒ±Ð¶Ð°ÑÑÑÒ£ Ð±Ð°ÑÑÐœÐŽÐ°ÑÑ ÐŸÐ»Ð°ÑÐŽÑÒ£ ÑiÐ·iÐŒi Ð³ÐµÐŸÐ³ÑÐ°ÑÐžÑÐ»ÑÒ Ð°ÑÐ°ÑÐ»Ð°Ñ, ÐÐ»Ð°Ð³ÐžÐœ Ð°Ð¹ÑÑÑÐ¿ ÑÐ°ÐœÑÐŽÐ° ÒÐŸÑÐ°ÐŽÑ. ÐÑÐžÐœÑÑÐŸÑÐœÒÐ° Ð³ÐžÑ ÐºÐµÒ£ÐµÐ¹ÑÑ ÑÐ°Ð»Ð°Ð¿ ÐµÑÐµÐŽi.  
+
+HBPlugin.desc:ÐiÑÐ°Ð¿ ÐŽÐžÑÐµÐºÑÐŸÑÐžÑÑÑÐœ HTMLÐœÑ Ð¶Ò±ÐŒÑÑÑÐ°ÐœÐ°ÑÑÐœ ÐÐ»Ð°Ð³ÐžÐœ. ÐÒ±Ð» ÐÐ»Ð°Ð³ÐžÐœ ÐÑÐŒÐ°ÐœÐžÑÐ°ÑÐ»ÑÒ ÐºiÑÐ°Ð¿Ñ
+Ð°ÐœÐ°ÐœÑÒ£ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐ»Ð°ÑÑÐŒÐµÐœ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÐŽÑ Ð¶ÓÐœÐµ Ð±Ð°ÑÒÐ° ÐºiÑÐµÑiÐœ ÑÐžÑÑÐ»Ð°ÑÐ»Ð°ÑÐŽÑ Ð¶Ò±ÐŒÑÑÑÐ°ÐœÐ±Ð°Ð¹ÐŽÑ, asciiÐŽÐµÐœ Ð±Ð°ÑÒÐ° ÐœÐµÐŒÐµÑÐµ asciiÐœiÒ£ ÐºÐµÒ£ÐµÐ¹ÑÑiÐŒÐµÐœ. ÐÒ±Ð» Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐ°Ð»Ð°Ñ Ð¶Ð°ÒÑÑÑÑ Ð¶Ð°ÑÐ°ÐŒÑÑÐ·Ñ Ð±ÐŸÐ»ÑÐ¿ ÑÐ°Ð±ÑÐ»Ð°ÐŽÑ Ð¶ÓÐœÐµ ÑÐµÐ· Ð¶Ò¯ÐºÑÐµÐ»ÐµÑiÐœÐŽÐµÐ¹ ÐµÑiÐ¿ Ð°Ð»Ð°Ñ Ðµ ÐºÒ¯ÐŒÓÐœÐœiÒ£ÑiÐ· Ð°ÑÒÑÐ°Ð¿ iÑÑÐµÐ³ÐµÐœ. ÐÐµÐœ Ð°ÐŽÐ°ÐŒÐŽÐ°Ñ ÐŸÐ»Ð°ÑÐŽÑÒ£ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÑÑ HBSPlug. ;-)\n\n-ÑÑ Ð±Ò±ÐœÑÒ£ ÐŸÑÑÐœÑÐœÐ° ÐÐ»Ð°Ð³ÐžÐœ ÒÐŸÐ»ÐŽÐ°ÐœÐ° Ð¶ÓÐœÐµ iÑÑÐµÑÐ³Ðµ ÐŒÐ°ÒÑÐ°ÑÒÐ° ÐŸÐœÑÒ£ Ð±Ò±Ð» ÐºÒ¯Ð¹i ÑÐ°ÑÑÐ°Ð¿ ÐºÐµÑÐµ Ò¯ÐŒiÑÑÐµÐœÐµÐŒiÐœHBSPlug Ð¶Ð°Ò£Ð° ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐœÑÒ£ Ð¶Ð°ÑÐ°ÑÑÐœÐŽÐ° ÒÐŸÐ»ÐŽÐ°ÐœÑÒ£ÑÐ· Ð¶ÓÐœÐµ Ð±ÐµÐ»Ð³iÐ»ÐµÐœÐ³ÐµÐœ ÑÐ°Ð¹Ð»ÐŽÐ°Ñ, Ð°ÑÑÑÐœÐŽÐ°  
+
+HBPlugin.encoding.iso_8859_1:Latin1 (Ð±Ð°ÑÑÑ ÑiÐ»ÐŽÐµÑi )  
+
+HTMLImagePlugin.aggressiveness:ÐÓÑiÐœÐœiÒ£ ÑÑÒÐ°ÑÑ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÑÑÐœ ÑÐ°Ð±Ð°ÒÑÐ°Ñ ÓÐŽiÑÑÐµÑÐŽiÒ£ Ð»Ð°ÑÐ°Ð·ÑÐŒÑ.  
+HTMLImagePlugin.aggressiveness.1:Ð€Ð°Ð¹Ð» Ð°ÑÑ, Ð¶ÐŸÐ», ÑÐµÐº ÒÐ°ÐœÐ° ÐŒÓÑiÐœÐœiÒ£ (ALT ) ÑÒ¯ÑÐ»ÐµÐœÐŽiÑÑi.  
+HTMLImagePlugin.aggressiveness.2:1-Ñi Ð±Ð°ÑÐ»ÑÒÑ Ð¿Ð»ÑÑ Ð±Ò±Ð» ÑÒ¯ÑiÐœiÐºÑi Ð±Ð°ÑÑÑÒ£.  
+HTMLImagePlugin.aggressiveness.3:2-Ñi Ð±Ð°ÑÐ»ÑÒÑ Ð¿Ð»ÑÑ Ð±Ò±Ð» ÑÒ¯ÑiÐœiÐºÑi ÐµÒ£ Ð¶Ð°ÒÑÐœ Ð¿Ð°ÑÐ°Ð³ÑÐ°ÑÑÐ°ÑÐŽÑÒ£.  
+HTMLImagePlugin.aggressiveness.4:3-Ñi Ð±Ð°ÑÐ»ÑÒÑ Ð¿Ð»ÑÑ Ð±Ò±Ð» ÑÒ¯ÑiÐœiÐºÑi (<h1>, <h2>  .... .) Ð°Ð»ÐŽÑÒ£ÒÑ Ð±Ð°ÑÑÐ°ÑÐŽÑÒ£.  
+HTMLImagePlugin.aggressiveness.5:4-Ñi Ð±Ð°ÑÐ»ÑÒÑ Ð¿Ð»ÑÑ Ð±Ò±Ð» ÑÒ¯ÑiÐœiÐºÑi ÐŒÓÑiÐœÐŽiÐº ÑiÐ»ÑÐµÐŒÐµÐ»ÐµÑÐŽiÒ£.  
+HTMLImagePlugin.aggressiveness.6:(ÑÓ©Ð·ÐŽiÒ£ Ð°ÑÐ°Ñ, ÐºiÐ»Ñi Ð¶ÓÐœÐµ ÑÐ°ÒÑ Ð±Ð°ÑÒÐ°Ð»Ð°Ñ ) ÑÑÐ³ÑÐµÑÐŽi 4-Ñi Ð±Ð°ÑÐ»ÑÒÑ Ð¿Ð»ÑÑ Ð±ÐµÑÑiÒ£.  
+HTMLImagePlugin.aggressiveness.7:ÐÐ°ÑÐ»ÑÒÑ Ð±iÑiÐºÐºÐµÐœ 6, 5 Ð¶ÓÐœÐµ 4.  
+HTMLImagePlugin.aggressiveness.8:7-Ñi Ð±Ð°ÑÐ»ÑÒÑ Ð¿Ð»ÑÑ Ð±Ð°Ñ, ÑÐ°Ð¹Ð» Ð°ÑÑÐœÑÒ£ ÒÐ°Ð¹ÑÐ°Ð»Ð°ÑÑÐœÑÒ£ Ð¶ÓÐœÐµ (ÑÐžiÑÑiÑÐµÐº ÐœÓÑÐžÐ¶ÐµÐ»ÐµÑÐŽiÒ£ Ð»Ð°ÑÐ°Ð·ÑÐŒÑÐœÑÒ£ Ð¶ÐŸÒÐ°ÑÑÐ»Ð°ÑÑÑ ) ÑÐ°ÒÑ Ð±Ð°ÑÒÐ°Ð»Ð°Ñ.  
+HTMLImagePlugin.aggressiveness.9:1-Ñi Ð±Ð°ÑÐ»ÑÒÑ Ð¿Ð»ÑÑ Ð±Ð°ÑÑÐ°Ð¿ÒÑ Ð±ÐµÑÑiÒ£ ÑÐŸÐ»ÑÒ ÐŒÓÑiÐœi.  
+
+HTMLImagePlugin.caption_length:(ÐœÑÑÐ°ÐœÑÐœÐŽÐ°Ð»Ð°Ñ ) Ð±Ð°ÑÑÐ°ÑÐŽÑÒ£ ÐŒÐ°ÐºÑÐžÐŒÐ°Ð» Ò±Ð·ÑÐœÐŽÑÒÑ.  
+
+HTMLImagePlugin.convert_params:Ò®ÑiÐœ ÒÐŸÑÑÐŒÑÐ° Ð¿Ð°ÑÐ°ÐŒÐµÑÑÐ»ÐµÑ ImageMagicK ÐºiÑiÑÐµÐ¹Ð³ÐµÐœ ÑÑÑÐµÑÑÐµÑÐŽi ÐµÑÐºiÐœ Ð°ÑÐŽÐ°ÑÐ°ÐŽÑ. ÐÑÑÐ°Ð»Ñ, - Ð¶ÐŸÒÐ°ÑÑÐ»Ð°ÑÑ ÐºiÑiÑÐµÐ¹Ð³ÐµÐœ ÑÑÑÐµÑÑÐµÑÐ³Ðµ Ò¯Ñ Ó©Ð»ÑÐµÐŒÐŽi ÑÒ¯Ñ Ð±ÐµÑÐµÐŽi.  
+
+HTMLImagePlugin.desc:ÐÐµÐ±-Ð±ÐµÑÑÐµÐœ ÑÑÑÐµÑÑÐµÑÐŽiÒ£ ÑÑÒÐ°ÑÑÑ Ð¶ÓÐœÐµ ÑÐ°Ð±Ð°ÒÑÐ°Ñ ÐŒÓÑiÐœÐ³Ðµ ÐÐ»Ð°Ð³ÐžÐœi.  
+
+HTMLImagePlugin.document_text:ÒÒ±Ð¶Ð°ÑÑÑÒ£ ÑÒ¯ÑiÐœÐŽÐµÐ³i ÑÑÑÐµÑÑiÒ£ ÐŒÓÑiÐœi ÒÐŸÑÑ :(ÓÐ¹ÑÐ¿ÐµÑÐµ, IndexedText-Ñi ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ Ó©ÑiÑi ) ÐŒÓÑiÐœ.  
+
+HTMLImagePlugin.index_pages:Ð¡ÑÑÐµÑÑÐµÑÐŒÐµÐœ Ð±ÐµÑ ÒÐ°ÑÐ°Ñ ÐžÐœÐŽÐµÐºÑÑÐµÑ. ÓÐ¹ÑÐ¿ÐµÑÐµ, Ð±Ð°ÑÑÐ°Ð¿ÒÑ URLÐ»Ð°ÑÐŽÐ°ÒÑ Ð±ÐµÑÑÐµ Ð°Ð¹ÐŽÐ°Ñ.  
+
+HTMLImagePlugin.max_near_text:Ð¢Ð°Ò£Ð±Ð°Ð»Ð°ÑÐŽÑÒ£ ÐŒÐ°ÐºÑÐžÐŒÐ°Ð» ÑÐ°ÐœÑ Ð°Ð»Ð°ÑÑÐœ ÑÑÑÐµÑÑÐµÑÐŽÐµ.  
+
+HTMLImagePlugin.min_height:ÐÐžÐºÑÐµÐ»ÐŽÐµÑ. Ð¡ÑÑÐµÑ Ó©ÑÐºiÐ·ÑiÐœ, ÐºiÑiÑi, ÐŒÑÐœÐ°Ñ ÐœÐµ.  
+
+HTMLImagePlugin.min_near_text:Ð¢Ð°Ò£Ð±Ð°Ð»Ð°ÑÐŽÑÒ£ ÐµÒ£ ÑÓ©ÐŒÐµÐœÐ³i ÑÐ°ÐœÑ Ð°Ð»Ð°ÑÑÐœ ÐŒÓÑiÐœ ÐœÐµÐŒÐµÑÐµ Ð±Ð°ÑÑÐ°.  
+
+HTMLImagePlugin.min_size:ÐÐ°Ð¹ÑÑ. Ð¡ÑÑÐµÑ Ó©ÑÐºiÐ·ÑiÐœ, ÐºiÑiÑi, ÐŒÑÐœÐ°Ñ ÐœÐµ.  
+
+HTMLImagePlugin.min_width:ÐÐžÐºÑÐµÐ»ÐŽÐµÑ. Ð¡ÑÑÐµÑ Ó©ÑÐºiÐ·ÑiÐœ, ÑÐ°ÑÐ»Ð°Ñ, ÐŒÑÐœÐ°Ñ ÐœÐµ.  
+
+HTMLImagePlugin.neartext_length:ÐÐµÐºÐµÐœÐ¶Ð°Ð¹ÐŽÑ Ò±Ð·ÑÐœÐŽÑÒ (ÐœÑÑÐ°ÐœÑÐœÐŽÐ°Ð»Ð°Ñ ) ÐŒÓÑiÐœÐŽÐµ.  
+
+HTMLImagePlugin.no_cache_images:(ÑÒ¯Ð¿ÐœÒ±ÑÒÐ°ÐœÑÒ£ URLÑÑÐœÑÒ£ ÐºÓ©ÑÑÐµÑiÐ»Ñ ) ÑÑÑÐµÑÑÐµÑÐŽiÒ£ ÐºÑÑ Ð¶Ð°ÑÐ°ÑÑ iÑÑÐµÐŒÐµÑ.  
+
+HTMLImagePlugin.smallpage_threshold:ÐÐµÑÑÐµÑ, (Ð±Ð°Ð¹ÑÑÐ°ÑÐŽÐ°ÒÑ ) ÐºiÑiÑi ÐŒÑÐœÐ°Ñ ÐœÐµÐ»ÐµÑÐ³Ðµ ÑÑÑÐµÑÑÐµÑ, (Ð°ÑÐ°Ñ, ÑÓ©Ð·ÐŽiÒ£ ÐÐ»ÑÑÐµÐ²ÐŸÐµÐ»ÐµÑi Ð¶ÓÐœÐµ ÑÐ°ÒÑ Ð±Ð°ÑÒÐ°Ð»Ð°Ñ ) Ð±ÐµÑÑiÒ£ ÒÐŸÑÑÐ»ÒÐ°Ðœ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑiÐœ Ð°Ð»Ð°ÐŽÑ.  
+
+HTMLImagePlugin.textrefs_threshold:ÐÓÑiÐœÐŽiÐº ÑiÐ»ÑÐµÐŒÐµÐ»ÐµÑ Ò¯ÑiÐœ ÑÐ°Ð±Ð°Ð»ÐŽÑÑÑÒ. ÐÐ»Ð°ÑÐ°Ð»Ð°Ñ ÐŒÓÐœÐŽÐµÑ Ð°Ð»Ð³ÐŸÑÐžÑÐŒ ÐºÐµÐŒ ÒÐ°ÑÐ°Ð» ÑÒ¯ÑiÐœÐµÐŽi.  
+
+HTMLImagePlugin.thumb_size:ÓšÐ»ÑÐµÐŒÐœiÒ£ ÐŒÐ°ÐºÑÐžÐŒÐ°Ð» ÐºiÑiÑÐµÐ¹ÑÑi - Ð¶ÓÐœÐµ ÐµÐœ, Ð¶ÓÐœÐµ Ð±ÐžiÐºÑiÐº.  
+
+HTMLPlugin.assoc_files:Html ÐºÓÐŽiÐŒÐ³i Perl Ð±Ð°Ð¹Ð»Ð°ÐœÑÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐºÐµÒ£ÐµÐ¹ÑÑÐ»ÐµÑÐŽi ÑÐ°Ð¹Ð»ÐŽÑÒ£ Ó©ÑÐœÐµÐ³i - ÒÒ±Ð¶Ð°ÑÑÐ°ÑÐŒÐµÐœ.  
+
+HTMLPlugin.desc:ÐÒ±Ð» ÐÐ»Ð°Ð³ÐžÐœ HTMLÐœÑÒ£ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÑÐœ Ð¶Ò±ÐŒÑÑÑÐ°ÐœÐ°ÐŽÑ  
+
+HTMLPlugin.description_tags:TÑÐ³ÑÐµÑÐŽÐµ Ð±ÐŸÐ»Ð°ÑÑÐœ iÑÐºi Ð±Ó©Ð»iÐŒÐŽÐµÑÐ³Ðµ ÒÒ±Ð¶Ð°ÑÑÑÒ£ Ð±Ó©Ð»iÐºÑÐµÑi. ÐÐ°ÑÐ»ÑÒ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑ  ÑÑÐ³ÑÐµÑÐŽiÒ£ ÑÐµÐºÑÐµÑiÐœÐŽÐµÐ³i ÒÐŸÑÑÑ ÐºÐµÑÐµÐºÑÐµÐœ, Ð±Ò±Ð» ÐŸÐ¿ÑÐžÑÐœÑÒ£ ÒÐŸÑÑ, ÑiÐ· Ð¶Ð°ÐœÑÐœÐŽÐ° ÐºÓ©Ò£iÐ» Ð°ÑÐŽÐ°Ñ, ÐœÐµÑi Ð°ÐœÑÒ ÐµÐŒÐµÑ ÐŸÑÐœÐ°ÑÑÒ£ÑÐ· - (ÐµÑÒÐ°ÐœÐŽÐ°Ð¹ ÐŽÐ° ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑ ) no_metadata. ÐÒ±ÐŽÐ°Ðœ Ð±Ð°ÑÒÐ°ÐŽÑ - keep_head Ð±Ò±Ð» ÐŸÐ¿ÑÐžÑ ÐŸÑÐœÐ°ÑÑÐ»Ð°ÑÑÐœÐŽÐ° ÐµÑÒÐ°ÐœÐŽÐ°Ð¹ ÐŽÐ° ÓÑÐµÑÐŽi Ð°Ð»ÐŒÐ°Ð¹ÐŽÑ.  
+
+HTMLPlugin.extract_style:Ð¡ÑÐžÐ»ÑÐ»ÐµÑ ÑÑÑÐ°Ð»Ñ ÐŒÓÐ»iÐŒÐµÑÑi Ð°Ð»ÑÑÐœ Ð¶ÓÐœÐµ  HTML<head> ÑÐºÑÐžÐ¿Ñi ÑÐµÐ³Ð° Ð¶ÓÐœÐµ DocumentHeader ÑÐžÑÒÑÑ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽi ÑÐ°ÒÑÐ°Ñ. ÐÒ±Ð» _document:documentheader_ macro-ÑÑ ÐŒÐ°ÐºÑÐŸÑÑÐŒÐµÐœ ÒÒ±Ð¶Ð°ÑÑÑÒ£ Ð±ÐµÑiÐœÐŽÐµ Ð°ÐœÑÒÑÐ°Ð»Ð°ÐŽÑ.  
+
+HTMLPlugin.file_is_url:ÐÑÑÐ°Ð»Ñ, ÐµÐ³ÐµÑ Ð°Ð¹ÐœÐ°ÐœÑÒ£ Ð²ÐµÐ±-ÑiÐœiÒ£ ÒÒ±ÑÐ°Ð»Ñ ÐžÐŒÐ¿ÐŸÑÑÑÑÒ£ ÐŽÐžÑÐµÐºÑÐŸÑÐžÑÑÑÐœÑÒ£ ÒÒ±ÑÑÐ»ÑÐŒÑÐœÑÒ£ Ð¶Ð°ÑÐ°ÑÐ»Ð°ÑÑÐœÐ° ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»ÑÐ°, ÐµÐ³ÐµÑ ÐºiÑÐµÑiÐœ ÑÐ°Ð¹Ð» Ð°ÑÑÐ°ÑÑ Ð±Ð°ÑÑÐ°Ð¿ÒÑ Ð±Ð°ÑÑÐ°Ð¿ÒÑ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÐŽÑÒ£ URL Ð±ÐŸÐ»ÑÐ°, ÐŸÑÐœÐ°ÑÑ.  
+
+HTMLPlugin.hunt_creator_metadata:ÐÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ ÑÑÑÐœÐŽÑÐ³ÐµÑÑiÐ»iÐ³iÐœÐŽÐµ ÐºÓ©Ð±iÑÐµÐºÑi ÑÐ°Ð±ÑÐ»ÑÑÐœ Ð¶ÓÐœÐµ C ÐŸÐ·ÐŽÐ°ÑÐµÐ»Ñ ÐŸÐ»Ð°ÑÐŽÑÒ£ Ó©ÑiÑiÐœÐµ ÑÐ°ÑÐ°ÑÑÐ¿ ÑÐ°Ð»ÑÐ¿ ÒÐŸÑÒÐ° ÐŒÐµÐ¹Ð»iÐœÑÐµ. (Ó©ÑiÑÑÐµÑÐŽiÒ£ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑi ) metadata_fieldsÑiÒ£ Ð±Ð°Ð¹ÑÐ°ÒÑÐœÑÒ£ ÒÐŸÑÑ ÐºÐµÑÐµÐº Ð±ÐŸÐ»Ð°ÐŽÑ .  
+
+HTMLPlugin.keep_head:html Ð±Ð°ÑÑÐ°Ñ Ð°Ð»ÑÐ¿ ÑÐ°ÑÑÐ°ÐŒÐ°ÑÑÐœ - ÑÐ°Ð¹Ð»ÐŽÐ°Ñ.  
+
+HTMLPlugin.metadata_fields:Ò®ÑiÑ ÑÑÒÑÐœÐŽÑÐœÑ Ð±Ð°ÑÑÐ°ÑÒÐ° ÑÐ°Ð»Ð°Ð¿ÑÐ°ÐœÑÐ»Ñ Ò¯ÑiÐœ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ Ó©ÑiÑÑÐµÑiÐœiÒ£ ÑiÐ·iÐŒi Ð±Ó©Ð»ÐµÐŽi.  Ð±iÑiÐœÑi Ð±ÑÐŽÑ ÐŒÐ°Ð·ÐŒÒ±ÐœÐŽÑ Ð°Ð»ÑÐœÑÑÐœ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ <tagname> ÐŽÐµÐ¿ Ð°ÑÐ°Ð»Ð°ÑÑÐœ ÑÐ»ÐµÐŒÐµÐœÑ ÒÐŸÐœÐŽÑÑÑÐ»ÒÐ°ÐœÑ Ò¯ÑiÐœ  ÑÑÐ³Ñi ÒÐŸÐ»ÐŽÐ°ÐœÑÒ£ÑÐ·. ÐÐ³ÐµÑ ÑÑÐ³ÑÐµÑÐŽi ÑÑÒÑÐœÐŽÑ Ó©Ð¹ÑÐºÐµÐœi Ð±Ò±Ð» ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑ Ð±Ð°Ñ ÓÑiÐ¿ÑÐµÑÐŒÐµÐœ GreenstoneÐ³Ðµ ÐµÐ»ÐµÑÑÐµÑÑ Ò¯ÑiÐœ ÐºÐµÑÐµÐº Ð¿Ðµ, ÑiÐ· ÑÐµÐ·Ð³iÑÑiÐ³i ÑÓ©ÐŒÐµÐœ ÓÑÐµÑ Ð±ÐŸÐ»ÑÐ¿ ÑÐ°Ð±ÑÐ»ÑÐ°Ò£ÑÐ·, ÐºiÑi ÓÑiÐ¿ Ð±Ð°Ñ Ð±Ò±Ð» Ð¶ÐµÑÐŽÐµ Ð°Ð»ÐŒÐ°ÑÑÑÑÑÒ£ÑÐ·.  
+
+HTMLPlugin.no_metadata:Ð€Ð°Ð¹Ð»ÐŽÐ°ÑÐŽÐ°Ðœ ÐºÐµÐ· ÐºÐµÐ»Ð³ÐµÐœ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑi Ð°Ð»ÑÒÐ° ÑÑÑÑÑÐ¿Ð°Ò£ÑÐ·.  
+
+HTMLPlugin.no_strip_metadata_html:ÐÑÐ°ÑÐ»Ð°ÑÐŽÑ ÑiÐ·iÐŒ ÐŒÐµÑÐ° - (Ð±Ð°ÑÐ»ÑÒ ) allÐŽÑÒ£ Ò¯ÑiÑi Ð°ÑÒÑÐ»Ñ Ð°ÑÐ°Ð»ÒÐ°Ðœ ÐŒÓÐ»iÐŒÐµÑÑÐµÑ, ÐœÐµÐŒÐµÑÐµ. ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»ÑÑÐœ - ÐŒÓÐœÐŽÐµÑÐŽÐµÐœ ÑÐ°Ð³ÑÐµÑiÐœiÒ£ HTMLÐœÑÒ£ Ð°Ð»ÑÐ¿ ÑÐ°ÑÑÐ°ÑÑ ÐŒÐµÑÐ° ÑÐ°ÒÑÐ°Ð¿ ÒÐ°Ð»Ð°ÑÑÐœ description_tags, - ÐŒÓÐ»iÐŒÐµÑÑÐµÑ.  
+
+HTMLPlugin.nolinks:ÐÑÒÐ°ÐœÐŽÐ°Ð¹ ÐŽÐ° ÑÐ°Ð»Ð¿ÑÐœÑÑÑÐ°Ñ (ÐŒÒ±ÐœÐŽÐ°Ð¹ Ð±Ð°Ð¹ÑÐ°ÒÑÑÒ£ ÒÐŸÑÑ Ð¿ÐŸÑÑÑÐŸÐµÐœÐžÑ/ÐžÐŒÐ¿ÐŸÑÑÐžÑÐŸÐ²Ð°ÐœÐžÑ Ð¶ÑÐ»ÐŽÐ°ÐŒÐŽÑÒ Ð¶Ð°ÒÑÐ°ÑÑÐ° Ð°Ð»Ð°ÐŽÑ, Ð±iÑÐ°Ò ÒÒ±Ð¶Ð°ÑÑÐ°ÑÐŽÑÒ£ ÑÐµÐºÑÐµÑiÐœÐŽÐµÐ³i ÐºÐµÐ· ÐºÐµÐ»Ð³ÐµÐœ ÑÐ°Ð»ÑÑÑÑÑÐŒÐ°Ð»Ñ Ð±Ð°Ð¹Ð»Ð°ÐœÑÑÑÐ°ÑÐŽÑ Ð±Ò±Ð·ÑÐ»Ð°ÐŽÑ ) Ð»ÐžÐœÐºÑÐµÑ Ò±ÑÑÐ°ÑÒÐ° iÑÑÐµÐŒÐµÒ£iÐ·.  
+
+HTMLPlugin.no_image_links:Ð¢Ð°Ð»Ð¿ÑÐœÑÑ ÒÐ°ÐœÐŽÐ°Ð¹ Ð±ÐŸÐ»ÐŒÐ°ÑÑÐœ ÐŸÐ»Ð°ÑÐŽÑÒ£ ÐºÓ©ÑÑÐ³Ðµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÑÑÑÐµÑÑÐµÐ³i ÑiÐ»ÑÐµÐŒÐµÑiÐœ Ð¶Ð°ÑÐ°ÑÒÐ° iÑÑÐµÐŒÐµÒ£iÐ·.  
+
+HTMLPlugin.rename_assoc_files:ÐÑÑÐ°Ð»Ñ, ÑÑÑÐµÑÑÐµÑÐŒÐµÐœ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÐŒÐµÐœ ÑÐ°Ð±Ð°ÒÑÐ°Ñ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÐŽÑ Ð°ÑÑÐœ Ó©Ð·Ð³ÐµÑÑÐµÐŽi. Ð¡ÐŸÐœÑÐŒÐµÐœ Ð±iÑÐ³Ðµ (Ð¿Ð°Ð¹ÐŽÐ°Ð»Ñ CD-ROMÐ»Ð°ÑÒÐ° ÐºÓ©ÑiÑÐ³ÐµÐœ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐ»Ð°ÑÐŽÑÒ£ Ð¶Ð°ÑÐ°ÑÑÐœÐŽÐ° ) ÐŽÐžÑÐµÐºÑÐŸÑÐžÑÐœÑÒ£ ÐŒÐ°Ð¹ÐŽÐ°ÑÐ°Ò ÒÒ±ÑÑÐ»ÑÐŒÑÐœ ÓÐ»ÐŽÐµÒÐ°Ð¹ÐŽÐ° ÒÒ±ÑÐ°ÐŽÑ.  
+
+HTMLPlugin.sectionalise_using_h_tags:ÐÓ©Ð»iÐœÑÐ»ÐµÑÐŽiÒ£ h1, h2ÐŽiÒ£ ÑÐ°Ð³ÑÐµÑiÐœiÒ£ ÒÐŸÐ»ÐŽÐ°ÐœÑÑ Ð±Ð°Ñ ÒÒ±Ð¶Ð°ÑÑÐœÐŽÐ°ÒÑ Ð°Ð²ÑÐŸÐŒÐ°ÑÑÑ Ð¶Ð°ÑÐ°Ñ, .... hX.  
+
+HTMLPlugin.title_sub:Ð¡Ð°ÒÑÐ°Ð»ÒÐ°Ðœ Ð°ÑÐ°Ñ Ð¶ÐŸÐ»ÐŽÑÒ£ Ó©Ð·Ð³ÐµÑiÑÐºÐµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ Ð°Ð»ÐŒÐ°ÑÑÑÑÑÐŽÑ Ó©ÑÐœÐµÐº.ÐÑÑÐ°Ð»Ñ, Ð°Ð»ÑÐ¿ ÑÐ°ÑÑÐ°Ð»Ñ Ò¯ÑiÐœ "ÐÐµÑÑi 1" PDFPlugÐœiÒ£ ÐÐ»Ð°Ð³ÐžÐœiÐŒÐµÐœ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÐŽÑ, Ð¶ÓÐœÐµ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÑÑÐœ Ð°ÑÐ°Ñ ÐŒÓÑiÐœÐœÐµÐœ ÑÐ°ÒÑ Ð±Ð°ÑÒÐ°Ð»Ð°Ñ.  
+
+HTMLPlugin.tidy_html:ÐÐ³ÐµÑ Ð°ÐœÑÒÑÐ°Ð»ÑÐ°, HTMLÐœÑ Ó©Ð·Ð³ÐµÑÑÐµÐŽi - XHTML Ð¶Ð°ÒÑÑ ÒÒ±ÑÐ°ÑÑÑÑÑÐ»ÒÐ°Ðœ ÒÒ±Ð¶Ð°ÑÑ. ÐÒ±Ð» ÒÐŸÐ»ÐŽÐ°ÐœÑÑÑÐ»Ð°ÑÒÐ° ÐºiÑÐ°Ð¿ÑÑÒ£ ÒÐ°Ð»ÑÐ±ÑÐœÐŽÐ°ÒÑ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÑÐœ ÒÐ°ÑÐ°Ð¿ ÑÑÒÑÒÐ° ÐŒÒ¯ÐŒÐºiÐœÐŽiÐº Ð±ÐµÑÐµÐŽi.  
+
+HTMLPlugin.old_style_HDL:Ð€Ð°Ð¹Ð»Ñ ÑÐŸÐ» Ð±ÐŸÐ»ÑÑ ÐŒÒ¯ÐŒÐºiÐœ Ð±Ðµ ÑÑÑÐ°Ð»Ñ HDLÐœÑÒ£ ÑÐµÐºÑÐžÑÐ»Ð°ÑÑÐœÑÒ£ ÐµÑÐºi ÑÑÐžÐ»ÑÑi ÒÐŸÐ»ÐŽÐ°ÐœÐ° ÑÐµÐºÑÐžÑ Ð±Ó©Ð»iÐœÐ³ÐµÐœ Ð±ÐµÐ»Ð³i.  
+
+BaseMediaConverter.enable_cache:ÐÑÑ (ÑÑÑÐµÑÑÐµÑÐŽiÒ£ ÐºiÑiÑÐµÐ¹Ð³ÐµÐœ ÐºÓ©ÑiÑÐŒÐµÐ»ÐµÑi Ð¶ÓÐœÐµ ÑÐºÑÐ°ÐœÐŽÑÒ Ó©Ð»ÑÐµÐŒÐœiÒ£ ÑÑÑÐµÑi ÑÐŸÐœÐŽÐ°Ð¹ ) ÑÐ°Ð¹Ð»ÐŽÐ°ÑÐŽÑ Ð°Ð²ÑÐŸÐŒÐ°ÑÑÑ ÑÑÒÐ°ÑÐ°ÐŽÑ  
+
+ImageConverter.converttotype:'s' ÒÐ°Ð»ÑÐ¿ÒÐ° Ð±Ð°Ñ ÑÑÑÐµÑÑi Ó©Ð·Ð³ÐµÑÑÑ  
+
+ImageConverter.create_screenview:ÐÐ³ÐµÑ Ð¶ÐžÑÐœ ÑÐµÐœiÐŒÐŽi Ð±ÐŸÐ»ÑÐ°, ÑÐºÑÐ°ÐœÐŽÑÒ Ó©Ð»ÑÐµÐŒÐœiÒ£ ÑÑÑÐµÑiÐœ Ð¶Ð°ÑÐ°Ò£ÑÐ·, Ð¶ÓÐœÐµ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑ ÐŸÑÐœÐ°ÑÑÒ£ÑÐ· : Screen, ScreenType, screenicon, ScreenWidth Ð¶ÓÐœÐµ ScreenHeight.  
+
+ImageConverter.create_thumbnail:ÐÐ³ÐµÑ Ð¶ÐžÑÐœ ÑÐµÐœiÐŒÐŽi Ð±ÐŸÐ»ÑÐ°, ÐºiÑiÑÐµÐ¹Ð³ÐµÐœ ÑÑÑÐµÑÑÐµÑ Ð¶Ð°ÑÐ°Ð»Ð°ÐŽÑ Ð¶ÓÐœÐµ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑ Ð¶Ð°ÐŒÐ°Ð»Ð°ÐŽÑ: Thumb, ThumbType, thumbicon, ThumbWidth, ThumbHeight.  
+ImageConverter.desc:ÐÒ±Ð» Ð¿Ð»Ð°Ð³ÐžÐœ ÑÑÑÐµÑÑi ÐœÐµÐ³iÐ·ÐŽi ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑ ÑÐŸÐ»ÑÒÑÑÑÐ° Ð¶Ò±ÐŒÑÑÑÐ°ÐœÐ°ÐŽÑ  
+
+ImageConverter.imagemagicknotinstalled:Image Magick-Ñi ÒÐŸÑÑÐŒÑÐ° Ð°ÐœÑÒÑÐ°Ð»ÐŒÐ°ÒÐ°Ðœ  
+
+ImageConverter.minimumsize:Ð¡ÑÑÐµÑÑiÒ£ Ð°ÑÒÒÐ° Ð±Ð°ÑÑ, Ð±Ð°Ð¹Ñ n ÒÐ°ÑÐ°ÒÐ°ÐœÐŽÐ° ÐºiÑiÑi.  
+
+ImageConverter.noconversionavailable:Ð¡ÑÑÐµÑÑÐµÑÐŽiÒ£ ÐºÐŸÐœÐ²ÐµÑÑÐ°ÑÐžÑÑÑ ÒÐŸÐ» Ð¶ÐµÑÐ¿ÐµÑ  
+
+ImageConverter.noscaleup:ÐiÑÐºÐµÐœÑÐ°Ð¹ ÑÑÑÐµÑÑÐµÑ ÐºiÑiÑÐµÐ¹ÑÑÐ»ÐµÑÐŽÐµ Ò¯Ð»ÐºÐµÐ¹ÑÐ¿ÐµÑ.  
+
+ImageConverter.screenviewsize:nxn Ó©Ð»ÑÐµÐŒiÐœiÒ£ ÑÐºÑÐ°ÐœÐŽÑÒ ÑÑÑÐµÑÑÐµÑiÐœ Ð¶Ð°ÑÐ°Ò£ÑÐ·.  
+
+ImageConverter.screenviewtype:'s' ÒÐ°Ð»ÑÐ¿ÑÐ°ÒÑ ÑÐºÑÐ°ÐœÐŽÑÒ ÑÑÑÐµÑÑÐµÑiÐœ Ð¶Ð°ÑÐ°Ò£ÑÐ·  
+
+ImageConverter.thumbnailsize:nxn Ó©Ð»ÑÐµÐŒiÐœiÒ£ ÐºiÑiÑÐµÐ¹ÑÑiÐœ ÐŸÑÑÐœÐŽÐ°Ñ.  
+
+ImageConverter.thumbnailtype:'s' ÒÐ°Ð»ÑÐ±ÑÐœÐŽÐ°ÒÑ ÐºiÑiÑÐµÐ¹ÑÑÐŽi ÐŸÑÑÐœÐŽÐ°Ñ.  
+
+ImageConverter.win95notsupported:Image Magick Win95/98Ð³Ðµ ÑÒ¯Ð¹ÐµÐŒÐµÐ¹ÐŽi  
+
+ImagePlugin.desc:ÐÒ±Ð» ÐÐ»Ð°Ð³ÐžÐœ ÑÑÑÐµÑÑi ÐœÐµÐ³iÐ·ÐŽi ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑ ÑÐŸÐ»ÑÒÑÑÑÐ° Ð¶Ò±ÐŒÑÑÑÐ°ÐœÐ°ÐŽÑ  
+
+IndexPlugin.desc:ÐÒ±Ð» ÑÐµÐºÑÑÑÐžÑ ÐÐ»Ð°Ð³ÐžÐœi index.txtÑiÒ£ ÑÐ°Ð¹Ð»ÑÐœ Ð¶Ò±ÐŒÑÑÑÐ°ÐœÐ°ÐŽÑ. Index.txt ÑÐ°Ð¹Ð» ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÒÐ° ÒÐŸÑÑÑ ÐºÐµÑÐµÐº index.txtÑiÒ£ \n \n ÑÐ°Ð¹Ð»Ñ ÓÑÐ±iÑ ÑÐ°Ð¹Ð»ÐŒÐµÐœ ÑÓ©ÐŒÐµÐœÐŽÐµÐ³iÑÐµÐŒÐµÐœ ÒÐ°Ð»ÑÐ¿ÑÐ°ÑÑ ÐºÐµÑÐµÐº Ð±ÐŸÐ»ÑÒÐ° ÑÐ°Ð±Ð°ÒÑÐ°Ñ ÐºÐµÐ· ÐºÐµÐ»Ð³ÐµÐœ ÒÐŸÑÑÐŒÑÐ° ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑ ÐµÑiÐ¿ Ð¶Ò¯ÑÐ³ÐµÐœ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÐŽÑÒ£ ÑiÐ·iÐŒi Ð±ÐŸÐ»ÑÑ ÐºÐµÑÐµÐº : Ð±iÑiÐœÑi Ð¶ÐŸÐ» ÐºiÐ»Ñ Ð±ÐŸÐ»Ð° Ð°Ð»Ð°ÐŽÑ :ÐŒÑÑÐ°Ð»Ñ, ÐºiÐ»ÑÑiÒ£ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ Ó©ÑiÑiÐœ Ð°ÑÐ°Ð»Ñ Ò¯ÑiÐœ ) : ÐÐ°Ñ, Ò±Ð¹ÑÐŒ, ÐŽÐ°ÑÐ°. ÐÐµÐ»ÐµÑiÑi Ð¶ÐŸÐ»ÐŽÐ°Ñ ÐŸÑÐœÐ°ÑÑÑ ÐºÐµÑÐµÐº Ð±ÐŸÐ»Ð°ÑÑÐœ ÐºiÑÑÐŽiÒ£ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑi ÑÐ°Ð¹Ð»ÐŽÑÒ£ Ð°ÑÐ°ÑÑ, ÑÐŸÐŽÐ°Ðœ ÑÐŸÒ£ ÐŒÓÐœ ÑÐŸÐ» Ð±ÐŸÐ»Ð°ÐŽÑ.(ÐŒÑÑÐ°Ð»Ñ, ÐµÐ³ÐµÑ ÐºiÐ»ÑÑiÒ£ Ð¶ÐŸÒÐ°ÑÑÐŽÐ° Ð°Ð¹ÑÑÐ»ÒÐ°Ðœ Ð¶ÐŸÐ»Ñ ÒÐŸÐ»ÐŽÐ°ÐœÑ Ð±ÐŸÐ»ÑÐ°,'irma/iw097e 3.2 unesco 1993 ÐÑÐµÐŽÐŒÐµÑ=3.2, ÐÑÐ³Ð°ÐœÐžÐ·Ð°ÑÐžÑ_unesco, Ð¶ÓÐœÐµ ÐÐ°ÑÐ°_1993 _-ÑÑ ÑÐ°Ð¹Ð»ÑÐŒÐµÐœ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑi Ð±Ð°Ð¹Ð»Ð°Ð¹ÐŽÑ.) \n\nÐÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ Ó©ÑiÑÑÐµÑi ÒÐ°Ð¹ÑÑ Ð±ÐŸÐ»ÑÐ° ÐŽÐ° ÐµÐ³ÐµÑ ÐŸÐ»Ð°ÑÐŽÑÒ£ ÐŒÓÐœi ÐŸÑÐœÐ°ÑÑÐ»Ð°ÑÑÐœÐŽÐ°, ÐŸÐ» ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÑÐœÑÒ£ ÑÐžiÑÑi ÑÐ°Ð¹Ð»ÑÐœÐŽÐ° (ÐŽÐµÑÐºÑÐžÐ¿ÑÐŸÑ ) Ð±iÑiÐœÑi Ó©ÑiÑÐºÐµ ÑÓÐ¹ÐºÐµÑ ÐºÐµÐ»Ñi ÐºÐµÑÐµÐº Ð±ÐŸÐ»Ð°ÑÑÐœÐŽÐ° ÐžÐµÑÐ°ÑÑ
+ÐžÑÐ»ÑÒ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÐŽÑÒ£ ÐÐ»Ð°Ð³ÐžÐœiÐœ ÒÐŸÐ»ÐŽÐ°ÐœÐ°ÑÑÐœÐŽÐ° ÐºÓ©Ð·Ð³Ðµ iÐ»iÒ£iÐ·. \n\nÐŒÑÑÐ°Ð»Ñ, ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ pochta ÐŒÓÐœÐŽÐµÑi 3.2-Ñi Ð·Ð°Ñ ÑÑÐ³ ÒÐŸÐ»ÐŽÐ°ÐœÐ° ) Ð¶ÓÐœÐµ Ð±Ò±Ð» ÐŒÐ°Ò£ÑÐ·ÐŽÑ Ð¶ÐŸÐ»ÐŒÐµÐœ ÐŸÐ» Ð±ÐµÑiÐ»Ð³ÐµÐœ ÐºÐµÐ· ÐºÐµÐ»Ð³ÐµÐœ Ð°ÑÐ°ÑÐŽÑ Ð°Ð»ÐŒÐ°ÑÑÑÑÐ°ÐŽÑ Ð±Ó©Ð»ÐµÐº Ð°ÑÐ°Ð»Ð° Ð°Ð»Ð°ÐŽÑ. ÐÐ³ÐµÑ ÐŒÐ°Ò£ÑÐ·ÐŽÑ Ð¶ÐŸÐ»ÐŽÑ Ð±ÐŸÐ»ÐŒÐ°ÑÐ°, ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ ÐºÐµÐ· ÐºÐµÐ»Ð³ÐµÐœ Ð°ÑÐ°Ð»ÐŒÐ°ÒÐ°Ðœ ÐŒÓÐœi Ð·Ð°ÑÑÑ Ð°ÑÐ°Ð»Ð°ÐŽÑ.  
+
+ISISPlugin.desc:ÐÒ±Ð» ÐÐ»Ð°Ð³ÐžÐœ CDS / ISISÑiÒ£ ÐŽÐµÑÐµÐºÑÐµÑ ÒÐŸÑÐ»Ð°ÑÑÐœ Ð¶Ò±ÐŒÑÑÑÐ°ÐœÐ°ÐŽÑ. ÐÒ±ÐœÐŽÐ°Ð¹ Ó©Ò£ÐŽÐµÐ³ÐµÐœ ÐŽÐµÑÐµÐºÑÐµÑ ÒÐŸÑÐ»Ð°ÑÑ ÓÑÐ±iÑ Ò¯ÑiÐœ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐœÑÒ£ ÐžÐŒÐ¿ÐŸÑÑÑÐœÑÒ£ Ð¿Ð°Ð¿ÐºÐ°ÑÑÐœÐŽÐ°ÒÑ Ò¯Ñ ÑÐ°Ð¹Ð» Ð±Ð°Ñ Ð±ÐŸÐ»ÑÑ ÐºÐµÑÐµÐº : (.fdt) Ó©ÑiÑÑÐµÑÐŽiÒ£ Ð°ÐœÑÒÑÐ°ÑÑÐœ (.mst) ÐœÐµÐ³iÐ·Ð³i ÑÐ°Ð¹Ð», ÐºÐµÑÑÐµ, Ð¶ÓÐœÐµ ÓÑiÐ»i-Ð±ÐµÑiÐ»i ÑiÐ»ÑÐµÐŒÐµÐ»ÐµÑÐŽiÒ£ ÑÐ°Ð¹Ð»Ñ (.xrf).  
+
+ISISPlugin.subfield_separator:CDS / ISISÑiÒ£ ÐŽÐµÑÐµÐºÑÐµÑ ÒÐŸÑÐ»Ð°ÑÑÐœÑÒ£ Ð¶Ð°Ð·ÑÐ¿ÑÐ°ÑÑÐœ Ð¿ÐŸÐŽÐ¿ÐŸÐ»ÐµÐ¹ÐŽiÒ£ Ð±Ó©Ð»iÐŒÑÐµ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÑÑÐœ Ð¶ÐŸÐ».  
+
+ISISPlugin.entry_separator:CDS / ISISÑiÒ£ ÐŽÐµÑÐµÐºÑÐµÑ ÒÐŸÑÐ»Ð°ÑÑÐœÑÒ£ Ð¶Ð°Ð·ÑÐ¿ÑÐ°ÑÑÐœ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ Ð¶ÐµÐºÐµ Ó©ÑiÑÑÐµÑÐ³Ðµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐºÓ©Ð¿ÑiÐº ÐŒÓÐœÐŽÐµÑÐŽiÒ£ Ð±Ó©Ð»iÐŒÑÐµ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÑÑÐœ Ð¶ÐŸÐ».  
+
+KeyphraseExtractor.desc:ÐÓÑiÐœÐœÐµÐœ ÑÓ©Ð¹Ð»ÐµÐŒÐŽÐµÑÐŽiÒ£ ÐºiÐ»ÑÑiÒ£ Ð³ÐµÐœÐµÑÐ°ÑÐžÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÑÐºÑÑÑÐ°ÐºÑÐŸÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐºÓ©ÐŒÐµÐºÑiÒ£ ÐÐ»Ð°Ð³ÐžÐœi. ÐÐµÐ° ÑÑÒÐ°ÑÑÑÐœ Ð¶Ò¯Ð¹Ðµ ÒÐŸÐ»ÐŽÐ°ÐœÑ.  
+
+KeyphraseExtractor.extract_keyphrases:(Ò¯ÐœÐŽÐµÐŒÐµÑ Ð±ÐŸÐ¹ÑÐœÑÐ°ÒÐ° ÐŸÐ¿ÑÐžÑ ) ÐÐµÐ°ÑÑ Ð°ÑÒÑÐ»Ñ ÑÓ©Ð¹Ð»ÐµÐŒÐœiÒ£ Ð¡Ó©Ð· ÐºiÐ»ÑÐ»ÐµÑi Ð°Ð»Ñ  
+
+KeyphraseExtractor.extract_keyphrases_kea4:4, 0-Ñi ÐºÓ©ÐŒÐµÐ³iÐŒÐµÐœiÐŒÐµÐœ ÑÓ©Ð·ÐŽÐµÑÐŽiÒ£ Ð¡Ó©Ð· ÐºiÐ»ÑÐ»ÐµÑiÐœiÒ£ Ð°Ð²ÑÐŸÐŒÐ°ÑÑÑ Ð°ÐœÑÒÑÐ°ÑÑ - (Ò¯ÐœÐŽÐµÐŒÐµÑ Ð±ÐŸÐ¹ÑÐœÑÐ°ÒÐ° Ð¿Ð°ÑÐ°ÐŒÐµÑÑi Ð±Ð°ÑÐ»Ð°ÑÐŒÐµÐœ ) ÐÐµÐ°. 4.0-Ñi ÐÐµÐ° - Ð±Ò±Ð» ÐÐµÐ°, Ð°Ð³ÑÐžÐºÑÐ»ÑÑÑÑÐ°Ð»ÑÒÑ ÑÐ°ÒÑÑÑÐ¿ÑÑÒ£ ÑÐµÐºÑÐµÑiÐ»Ð³ÐµÐœ ÐŽÐŸÐºÑÐŒÐµÐœÑÑi ÐžÐœÐŽÐµÐºÑÑÐµÑÐ³Ðµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ Ð¢Ð°ÐœÐ°Ð¹ÐŽÑÒ£ Ð¶Ð°Ò£Ð° Ð±ÐŸÐ»Ð¶Ð°ÐŒÑ.  
+
+KeyphraseExtractor.extract_keyphrase_options:ÐÐµÐ°ÑÑ Ð°ÑÒÑÐ»ÑÐœÑ Ð¡Ó©Ð· ÐºiÐ»ÑÐŽiÒ£ Ð¡Ó©Ð· ÐºiÐ»ÑÐ»ÐµÑiÐœiÒ£ Ð°Ð²ÑÐŸÐŒÐ°ÑÑÑ ÑÑÒÐ°ÑÑÑÐœÐ° ÐŸÐ¿ÑÐžÑÐ»Ð°ÑÑ. ÐŒÑÑÐ°Ð»Ñ, mALIWEB - ALIWEBÐœiÒ£ ÑÑÒÐ°ÑÑÑÐœ Ò¯Ð»Ð³iÐœi ÒÐŸÐ»ÐŽÐ°Ðœ N5 - ÓÑÐ±iÑ ÒÒ±Ð¶Ð°ÑÑÐ°Ðœ ÑÓ©Ð·ÐŽÐµÑÐŽiÒ£ 5 ÐÐ»ÑÑÐµÐ²ÐŸÐµÐ»ÐµÑi Ð±ÐŸÐ¹ÑÐœÑÐ° Ð°Ð»; eGBK - GBKÑÑÒ£ ÐºÐŸÐŽÑÐ°Ð»ÒÐ°ÐœÑÐœ ÒÐŸÐ»ÐŽÐ°Ðœ.  
+
+KeyphraseExtractor.keyphrases:Ð¡Ó©Ð· ÐºiÐ»Ñ  
+
+KeyphraseExtractor.missing_kea:ÒÐÐ¢Ð : ÐÐ°ÑÑÑÐ»ÑÒ ÐµÐŒÐµÑ KeaÐŽÑÒ£ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐ°ÑÑÐœ %s ÑÐ°Ð±Ñ. Ð¢ÓÒ£iÑ Ð¶Ð°ÑÑÐ»ÒÐ°ÑÑÐœ, http://www.nzdl.org/KeaÐŒÐµÐœ Kea %s ÑÐ°Ð¹ÒÐ°Ò£ÑÐ· Ð¶ÓÐœÐµ ÐŽÐžÑÐµÐºÑÐŸÑÐžÑÐœÑÒ£ Ð±Ò±ÐœÑ ÐŸÑÐœÐ°ÑÑÒ£ÑÐ·.  
+
+LaTeXPlugin.desc:LaTeX ÒÒ±Ð¶Ð°ÑÑÐ°ÑÑ Ò¯ÑiÐœ Ð¿Ð»Ð°Ð³ÐžÐœ.  
+
+LOMPlugin.desc:(Learning Object Metadata ) LOMÐœiÒ£ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÑÐœÑÒ£ ÐžÐŒÐ¿ÐŸÑÑÑÐœÐ° ÐÐ»Ð°Ð³ÐžÐœi.  
+
+LOMPlugin.root_tag:DocType XML - (ÐœÐµÐŒÐµÑÐµ ÑÒ¯Ð±iÑÐ»iÐº ÑÐ»ÐµÐŒÐµÐœÑ ÐºÓ©ÑÑÐµÑÑÑi Ð¶Ò¯Ð¹ÐµÐ»i Ð°Ð¹ÑÑÐ»Ñ ) ÑÐ°Ð¹Ð».  
+
+LOMPlugin.check_timestamp:ÐÒ±ÑÑÐœ ÑÐŸÐ»ÑÑÑÑÐ»ÒÐ°Ðœ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÐŽÑÒ£ ÑÐ°ÒÑÑÑÐ° Ð±ÐµÐ»Ð³iÐ»ÐµÑiÐœiÒ£ ÑÐµÐºÑÐµÑÑi, ÑÐµÐº ÒÐ°ÐœÐ° Ð¶Ð°Ò£Ð°Ð»Ð°Ñ Ð¶Ò¯ÐºÑÐµÐ»ÐµÐŽi.  
+
+LOMPlugin.download_srcdocs:ÐÐ³ÐµÑ ÐŸÐ» (in general^identifier^entry or technical^location ) ÐºÓ©ÑÑÐµÑiÐ»ÑÐµ, Ð±Ð°ÑÑÐ°Ð¿ÒÑ ÒÒ±Ð¶Ð°ÑÑÑ Ð¶Ò¯ÐºÑÐµÑ. ÐÐ¿ÑÐžÑÐœÑÒ£ Ð±Ò±Ð»Ð°ÑÑ Ð¶Ò¯ÐºÑÐµÑÐŒÐµÐœ ÑÑÐœÐŽÑÒÑÐœÐŽÐ° Ð°Ð»ÐŽÑÐœÐŽÐ° Ð¶Ò¯ÐºÑÐµÐ»ÐµÑiÐœ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ Ð¶Ò¯Ð¹ÐµÐ»i Ð°Ð¹ÑÑÐ»Ñ ÐºÓ©ÑÑÐµÑÑi ÐºÐµÑÐµÐº. ÐÐ°ÒÐ°Ð»Ð°ÒÐ° : ÐµÐ³ÐµÑ Ð±Ð°ÑÑÐ°Ð¿ÒÑ ÒÒ±Ð¶Ð°Ñ ÑÐ°Ð¹ÐµÑÐ²ÐŸÐ»ÐŸÐŒÒÐ° Ð±ÐŸÐ»ÑÐ°, Ð±Ò±Ð» Ð¶Ò±ÐŒÑÑ iÑÑÐµÐŒÐµÐ¹ÐŽi.  
+
+MARCPlugin.desc:MARC ÐœÐµÐ³iÐ·Ð³i Ð¿Ð»Ð°Ð³ÐžÐœ.  
+
+MARCPlugin.metadata_mapping:GreenstoneÐœÑÒ£ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑiÐœiÒ£ Ð°ÑÑÐŒÐµÐœ MARCÑÐ°Ðœ ÐŒÓÐœÐŽÐµÑÐŽiÒ£ Ð±ÐµÐ¹ÐœÐµÐœiÒ£ Ð±Ó©Ð»ÑÐµÐ³i ÒÐŸÑÐ°ÑÑÐœ ÑÐ°Ð¹Ð» Ð°ÑÑ. Marc2dc.txt Ò¯ÐœÐŽÐµÐŒÐµÑ Ð±ÐŸÐ¹ÑÐœÑÐ°Ð»Ð°Ñ ÑÐ°Ð¹ÑÑÐ°ÑÐŽÑÒ£ ÐŽÐžÑÐµÐºÑÐŸÑÐžÑÑÑÐœÐŽÐ° Ð±ÐŸÐ»Ð°ÐŽÑ.  
+
+MARCXMLPlugin.desc:ÐÐ»Ð°Ð³ÐžÐœ MARCXML.  
+
+MARCXMLPlugin.metadata_mapping_file:ÐÓ©Ð»ÑÐµÐºÑÐµÑÐŽiÒ£ MARCÑÑÒ£ ÐŒÓÐœÐŽÐµÑiÐœiÒ£ GreenstoneÐœÑÒ£ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑiÐœiÒ£ Ð°ÑÑÐ°ÑÑÐŒÐµÐœ Ð±ÐµÐ¹ÐœÐµ ÒÐŸÑÐ°ÑÑÐœ ÑÐ°Ð¹Ð» Ð°ÑÑ. Ò®ÐœÐŽÐµÐŒÐµÑ Ð±ÐŸÐ¹ÑÐœÑÐ°Ð»Ð°Ñ ÑÐ°Ð¹ÑÑÑÒ£ ÑiÐ·Ð±ÐµÑiÐœiÒ£ etcÐºÐµ marcdoc.txtÑÑ iÐ·ÐŽÐµÐ¹ÐŽi.  
+
+MediaWikiPlugin.desc:MediaWikiÐœiÒ£ Ð²ÐµÐ±-Ð±ÐµÑiÐœ ÐžÐŒÐ¿ÐŸÑÑÒÐ° ÐÐ»Ð°Ð³ÐžÐœi.  
+
+MediaWikiPlugin.show_toc:ÓÑÐ±iÑ HTMLÐ»ÐµÑÐŽÐµ ÐŒÐ°Ð·ÐŒÒ±Ðœ ÑÐµÐºÑÐžÑÒÐ° Ð°Ð»ÑÐ¿ ÑÐ°ÑÑÐ°Ð»ÑÑÐœ - Ð±ÐµÑÐºÐµ. Toc_expÒÐ° Perl ÑÓ©ÐŒÐµÐœÐŽÐµ Ð¶Ò¯Ð¹ÐµÐ»i Ð°Ð¹ÑÑÐ»Ñ ÐºÓ©ÑÑÐµÑÑi ÐºÐµÑÐµÐº.  
+
+MediaWikiPlugin.delete_toc:ÓÑÐ±iÑ HTMLÐ»ÐµÑÐŽÐµ ÐŒÐ°Ð·ÐŒÒ±Ðœ ÑÐµÐºÑÐžÑÒÐ° Ð°Ð»ÑÐ¿ ÑÐ°ÑÑÐ°Ð»ÑÑÐœ - Ð±ÐµÑÐºÐµ. Toc_expÒÐ° Perl ÑÓ©ÐŒÐµÐœÐŽÐµ Ð¶Ò¯Ð¹ÐµÐ»i Ð°Ð¹ÑÑÐ»Ñ ÐºÓ©ÑÑÐµÑÑi ÐºÐµÑÐµÐº.  
+
+MediaWikiPlugin.toc_exp:ÐÐ°Ð·ÐŒÒ±ÐœÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ Perl Ð¶Ò¯Ð¹ÐµÐ»i Ð°Ð¹ÑÑÐ»Ñ. Ò®ÐœÐŽÐµÐŒÐµÑ Ð±ÐŸÐ¹ÑÐœÑÐ°ÒÐ° ÐŒÓÐœ MediaWikiÐœiÒ£ ÐºÓÐŽiÐŒÐ³i Ð±ÐµÑÑÐµÑiÐœÐµ ÑÓÐ¹ÐºÐµÑ ÐºÐµÐ»ÐµÐŽi.  
+
+MediaWikiPlugin.delete_nav:Ð£ÐŽÐ°Ð»ÐžÑÑ ÑÐµÐºÑÐžÑ ÐœÐ°Ð²ÐžÐ³Ð°ÑÐžÐž. ÐÑÐ¶ÐœÐŸ ÑÐºÐ°Ð·Ð°ÑÑ ÑÐµÐ³ÑÐ»ÑÑÐœÐŸÐµ Ð²ÑÑÐ°Ð¶ÐµÐœÐžÐµ Perl Ð² nav_div_exp ÐœÐžÐ¶Ðµ.  
+
+MediaWikiPlugin.nav_div_exp:ÐÐ°Ð²ÐžÐ³Ð°ÑÐžÑÐœÑÒ£ ÑÐµÐºÑÐžÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ Perl Ð¶Ò¯Ð¹ÐµÐ»i Ð°Ð¹ÑÑÐ»Ñ. Ò®ÐœÐŽÐµÐŒÐµÑ Ð±ÐŸÐ¹ÑÐœÑÐ°ÒÐ° ÐŒÓÐœ MediaWikiÐœiÒ£ ÐºÓÐŽiÐŒÐ³i Ð±ÐµÑÑÐµÑiÐœÐµ ÑÓÐ¹ÐºÐµÑ ÐºÐµÐ»ÐµÐŽi.  
+
+MediaWikiPlugin.delete_searchbox:IÐ·ÐŽÐµÑÑiÑÑ ÐŽÐžÐ°Ð»ÐŸÐ³iÐœiÒ£ ÑÐµÐºÑÐžÑÑÑÐœ Ð°Ð»ÑÐ¿ ÑÐ°ÑÑÐ°Ñ. Searchbox_div_expÐ³Ðµ Perl ÑÓ©ÐŒÐµÐœÐŽÐµ Ð¶Ò¯Ð¹ÐµÐ»i Ð°Ð¹ÑÑÐ»Ñ ÐºÓ©ÑÑÐµÑÑi ÐºÐµÑÐµÐº.  
+
+MediaWikiPlugin.searchbox_div_exp:IÐ·ÐŽÐµÑÑiÑÑÐŽi ÑÐµÑÐµÐ·ÐµÐŽÐµÐ³i ÐºiÑiÑÐ¿ÐµÐ³Ðµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ PerlÐŽÑÒ£ ÑiÐ»iÐœÐŽÐµÐ³i Ð¶Ò¯Ð¹ÐµÐ»i Ð°Ð¹ÑÑÐ»Ñ. Ò®ÐœÐŽÐµÐŒÐµÑ Ð±ÐŸÐ¹ÑÐœÑÐ°ÒÐ° ÐŒÓÐœ MediaWiki ÐŸÑÑÐ°Ò Ð²ÐµÐ±Ð±ÐµÑÑÐµÑiÐœÐµ ÑÓÐ¹ÐºÐµÑ ÐºÐµÐ»ÐµÐŽi.  
+
+MediaWikiPlugin.remove_title_suffix_exp:Ð¡ÑÑÑÑÐ»ÒÐ°Ðœ Ð±Ð°ÑÑÑÒ£ ÐºÐµÑÐ¿ÐµÐ»ÑÐµÐºÑÐµÑi Ò¯ÑiÐœ Perl Ð¶Ò¯Ð¹ÐµÐ»i Ð°Ð¹ÑÑÐ»Ñ. ÐÑÑÐ°Ð»Ñ, \\s- (.+ ) ÐºÐµÐ¹iÐœ ÐŸÐ±ÑÐµÐ¶ÐµÑ iÑiÐœÐŽÐµÐ³i "-".  
+
+MetadataCSVPlugin.desc:ÐÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ Ò¯ÑiÑ Ð°Ð¹ÑÑÑÒ ÐŒÓÐœÐŽÐµÑÐŽiÒ£ ÒÐ°Ð»ÑÐ±ÑÐœÐŽÐ° Ò¯ÑiÐœ ÐÐ»Ð°Ð³ÐžÐœ. Filename CSVÑÑÒ£ ÑÐ°Ð¹Ð»ÑÐœÐŽÐ°ÒÑ Ó©ÑiÑÑi ÒÐ°Ð»Ð°Ð¹ ÒÒ±Ð¶Ð°ÑÒÐ° ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑ Ð¶Ð°ÑÐ°ÑÑÐœÑÐœ Ð°ÐœÑÒÑÐ°Ð»Ñ Ò¯ÑiÐœ ÑÐŸÐ» Ò¯ÑiÐœÐŒÐµÐœ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÐŽÑ.  
+
+MetadataPass.desc:ÐÐ»Ð°Ð³ÐžÐœÐœiÒ£ Ð¿Ð°ÑÐ°ÐŒÐµÑÑi ÐŒÐµÑÐ° ÒÐŸÐ»ÐŽÐ°Ð¹ÑÑÐœ BasPlugÒÐ° ÒÐŸÑÑÐŒÑÐ° ÐºÐ»Ð°ÑÑ, - import.plÐ³Ðµ metadata_readÑÑÒ£ ÐŒÓÐ»iÐŒÐµÑÑÐµÑi  
+
+MetadataXMLPlugin.desc:ÐÐ»Ð°Ð³ÐžÐœ ÒÐ°Ð¹ metadata.xmlÐŽÑÒ£ ÑÐ°Ð¹Ð»ÑÐœ Ð¶Ò±ÐŒÑÑÑÐ°ÐœÐ°ÐŽÑ.  
+
+MetadataEXIFPlugin.desc:Ð¡ÑÑÐµÑÑÐµÑÐŽÐµÐœ EXIFÑiÒ£ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑiÐœiÒ£ ÑÑÒÐ°ÑÑÑÐœÐ° ÐÐ»Ð°Ð³ÐžÐœ, Ð°ÑÐŽÐžÐŸ Ð¶ÓÐœÐµ Ð²ÐžÐŽÐµÐŸ. ÐÐ» Ð°Ð¹ÒÑÐœÑÑÐ°Ò, ExifTool"ÐœiÒ£ ÐŒÐŸÐŽÑÐ»ÑÐœÑÒ£ CPANÒÐ° ÐœÐµÐ³iÐ·ÐŽÐµ. ÐÑÑÐ°Ð»Ñ, ÐœÐµÐ³iÐ·iÐœÐµÐœ GPS, FlashPixÑiÒ£ ÒÐ°Ð»ÑÐ¿ÑÐ°ÑÑ, FlashPixÑi ÐºÓ©Ð±iÑÐµÐº ÒÐŸÐ»ÐŽÐ°Ð¹ÐŽÑ, ID3, Vorbis. ÐÐ»Ð°Ð³ÐžÐœÐŽi Ð±Ò±ÐŽÐ°ÐœÐŒÐµÐœ Ò±ÑÐ°ÐŽÑ, Ð¶ÓÐœÐµ ÐÐŒÐœÑÒ£ Ð±Ð°ÑÐ»ÑÒ ÒÐ°Ð»ÑÐ¿ÑÐ°ÑÑÐœÑÒ£ ExifTool ÒÐŸÐ»ÐŽÐ°Ð¹ÑÑÐœ ÒÐŸÐ»ÐŽÐ°ÑÐ»Ð°ÑÑ Ò¯ÑiÐœ Ð¶Ð°ÑÐ°Ð»ÐŽÑ. ÑÐ°Ð¹Ð»ÐŽÐ°Ñ Ð¶ÓÐœÐµ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ ÑÑ
+ÐµÐŒÐ°Ð»Ð°ÑÑÐœÑÒ£ ÒÐŸÐ»ÐŽÐ°Ð»Ð°ÑÑÐœ ÑÒ¯ÑÐ»ÐµÑi Ð±ÐŸÐ¹ÑÐœÑÐ° ExifToolÐŽiÒ£ ÒÒ±Ð¶Ð°ÑÑÐ°ÐŒÐ°ÑÑÐœ ÒÐ°ÑÐ°.  
+
+GreenstoneMETSPlugin.desc:METS Ó©Ò£ÐŽÐµÐ»ÑiÐœ - ÐÑÐžÐœÑÑÐŸÑÐœ ÑÐžÑÒÑÑ ÒÒ±Ð¶Ð°ÑÑÐ°Ñ  
+
+MP3Plugin.desc:Ð€Ð°Ð¹Ð»ÐŽÐ°ÑÐŽÑÒ£ MP3ÑiÒ£ Ó©Ò£ÐŽÐµÑiÐœÐµ Ð¿Ð»Ð°Ð³ÐžÐœ.  
+
+MP3Plugin.assoc_images:ID3 Title-Ñi Ð°ÑÐ°Ñ Ð¶ÓÐœÐµ ÐŸÑÑÐœÐŽÐ°ÑÑÑÐœÑÒ£ ÐŸÐœÑÒ£ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑiÐœiÒ£ ÐœÐµÐ³iÐ·iÐœÐŽÐµ ÒÐŸÐ»Ð°Ð¹Ð»Ñ MP3ÑiÒ£ ÑÐ°Ð¹Ð»ÑÐœÐ° ÑÑÑÐµÑÑi ÑÐ°Ð±ÑÐ»Ñ Ò¯ÑiÐœ GoogleÐ³Ðµ ÑÑÑÐµÑÑÐµÑiÐœiÒ£ iÐ·ÐŽÐµÑÑiÑÑiÐœ ÒÐŸÐ»ÐŽÐ°ÐœÑÒ£ÑÐ·.  
+
+MP3Plugin.applet_metadata:ÐÐµÑÐ° ÑÐ°ÒÑÐ°Ð»Ñ Ò¯ÑiÐœ ÑÐŸÐ» Ò¯ÑiÐœÐŒÐµÐœ ÐÑÐ¿ÐŸÐ»ÑÐ·Ð°Ð²Ð°ÐœÐœÐŸ - ÐŸÐ¹ÐœÐ°ÑÒÑÑÑÑÒ£ MP3ÐºÐµ Ð±Ò±Ð» ÑÐ°Ð¹Ð»ÐŽÑÒ£ Ò±ÑÑÐ»ÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ HTMLÐœÑÒ£ ÐºÐŸÐŽÑÐœÐŽÐ° Ð±ÐŸÐ»Ð°ÑÑÐœ ÓÑÐ±iÑ ÒÒ±Ð¶Ð°ÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ [applet ] ÐŒÓÐ»iÐŒÐµÑÑÐµÑ.  
+
+MP3Plugin.metadata_fields:ÓšÑiÑÑÐµÑÐŽiÒ£ ÑiÐ·iÐŒi ÐŒÐµÑÐ° - (ÒÐŸÐ» Ð¶ÐµÑÐµÑiÐœ ÐµÐ³ÐµÑ ) ÑÐ°Ð¹Ð»ÐŽÑÒ£ MP3iÐœÐµÐœ ÑÑÒÐ°ÑÑÑÐœÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ Ò¯ÑiÑ Ð°ÑÒÑÐ»Ñ Ð°ÑÐ°Ð»ÒÐ°Ðœ ÐŒÓÐ»iÐŒÐµÑÑÐµÑ. ÐÐ°ÑÐ»ÑÒ Ó©ÑiÑÑÐµÑÐŽiÒ£ ÑÑÒÐ°ÑÑÑÐœÐ°  \"*\" ÒÐŸÐ»ÐŽÐ°ÐœÑÒ£ÑÐ·.  
+
+NulPlugin.desc:(. nul ) ÑÐ°Ð¹Ð»ÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ Ð¿Ð»Ð°Ð³ÐžÐœÐœiÒ£ ÐŒÓÐœi Ð±Ò±Ð»ÐŽÑÑ-ÑÑÐ»ÐŽÑÑÑ. ÐÐµÑÐµÐºÑÐµÑ ÒÐŸÑÑÐœÑÒ£ ÐºÐµÒ£ÐµÐ¹ÑÑiÐœÐŽÐµ ÐŒÐµÑÐ° Ð¶Ð°ÑÐ°Ð»ÒÐ°Ðœ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÐŒÐµÐœ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÐŽÑ - ÑÐ°Ð¹Ð»ÐŽÐ°ÑÐŽÑÒ£ ÐŒÓÐ»iÐŒÐµÑÑÐµÑiÐŒÐµÐœ.  
+
+NulPlugin.assoc_field:Nul ÓÑÐ±iÑ ÑÐ°Ð¹Ð»ÑÐœÐ° Ð±ÐµÑÐ³ÐµÐœ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ Ó©ÑiÑiÐœiÒ£ Ð°ÑÐ°ÑÐ»Ð°ÑÑ.  
+NulPlugin.add_metadata_as_text:ÒÒ±Ð¶Ð°ÑÑÑÒ£ ÐŒÓÑiÐœi ÑÐžÑÒÑÑ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ ÐºÐµÑÑÐµÑiÐœ ÒÐŸÑÑÐ»ÑÑÐœ, "Ð±Ò±Ð» ÒÒ±Ð¶Ð°Ñ ÐŒÓÑiÐœÐŽÐµ Ð±ÐŸÐ»ÐŒÐ°Ð¹ÐŽÑ".  
+
+NulPlugin.remove_namespace_for_text:(ÐµÐ³ÐµÑ add_metadata_as_text Ð°ÐœÑÒÑÐ°Ð»ÒÐ°Ðœ ) ÒÒ±Ð¶Ð°ÑÑÑÒ£ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ Ð°ÑÑÐ°ÑÑÐŽÐ°Ðœ ÐŒÓÑiÐœÐ³Ðµ ÐºÐµÐŒÑiÐ»iÐºÑÐµÑi Ð°Ð»ÑÐ¿ ÑÐ°ÑÑÐ°Ñ.  
+
+OAIPlugin.desc:ÐÐ°ÑÑÐ°Ð¿ÒÑ Ð°ÑÑÒ (OAI ) Ð°ÑÑ
+ÐžÐ²ÑÐ°ÑÐŽÑÒ£ ÐœÐµÐ³iÐ·Ð³i ÐÐ»Ð°Ð³ÐžÐœi.  
+
+OAIPlugin.document_field:ÐÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ ÒÐŸÑÑÐ»ÒÐ°Ðœ ÐŸÐ»Ð°ÑÒÐ° ÒÒ±Ð¶Ð°ÑÑÐ°ÑÑÐœÑÒ£ ÑÐ°Ð¹Ð» Ð°ÑÑÐœÑÒ£ ÐœÒ±ÑÒÐ°ÑÑ Ð±Ð°Ñ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑiÐœiÒ£ ÑÐ»ÐµÐŒÐµÐœÑi.  
+
+OAIPlugin.metadata_set:Ð¡ÐžÑÒÑÑ Ð±Ð°ÑÐ»ÑÒ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ ÐžÐŒÐ¿ÐŸÑÑÑÐ°ÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ (Ð¿ÑÐµÑÐžÐºÑi Ð±Ð°Ñ ÐŸÐ»Ð°ÑÒÐ° ) ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ Ð¶ÐžÑÐœÑ  
+OAIPlugin.metadata_set.auto:ÐÑÐµÑÐžÐºÑÑi ÒÐŸÐ»ÐŽÐ°ÐœÑÒ£ÑÐ· OAI Ñ
+Ð°ÑÑÐ°ÐŒÐ°ÐŽÐ° ÐºÓ©ÑÑÐµÑiÐ»Ð³ÐµÐœ   
+OAIPlugin.metadata_set.dc:DC Ð¿ÑÐµÑÐžÐºÑÑi ÒÐŸÐ»ÐŽÐ°ÐœÑÒ£ÑÐ·. ÐÑÑÐ°Ð»Ñ, GreenstoneÐœÑÒ£ ÐŸÐ»Ð°ÑÐŽÑÒ£ ÑÐŸÑÐŒÐ°ÑÑÐœÐŽÐ°ÒÑ ÑÐ»ÐµÐŒÐµÐœÑÑÐµÑÐŽiÒ£ ÐºÐ²Ð°Ð»ÐžÑÐžÐºÐ°ÑÐžÑÐ»Ñ DCÑÐ°ÑÑ ÐºÐ°ÑÑÐ° ÐºÐµÒ£iÑÑiÐºÑiÒ£ Ð±ÐŸÐ»ÑÑ ÐŒÒ¯ÐŒÐºiÐœ Ð±Ðµ dc.Coverage Spatial Ð±ÐŸÐ»ÑÐ¿ ÒÐ°Ð»ÑÐ¿ÑÐ°ÑÐ°ÐŽÑ.  
+
+OggVorbisPlugin.add_technical_metadata:ÐÑÑÐ°Ð»Ñ, ÑÐµÑ
+ÐœÐžÐºÐ°Ð»ÑÒ ÐŒÐµÑÐ° ÒÐŸÑÑÐ»ÑÑÐœ  ÑÐ°Ð¿ÑÑÑÑ Ð¶ÑÐ»ÐŽÐ°ÐŒÐŽÑÒÑ ÐŒÓÐ»iÐŒÐµÑÑÐµÑ.  
+
+OggVorbisPlugin.desc:Ogg Vorbis  ÐŽÑÐ±ÑÑÑÑÒ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÑÐœÑÒ£ ÐžÐŒÐ¿ÐŸÑÑÑÐ°ÑÑÐœÐ° Ð¿Ð»Ð°Ð³ÐžÐœ.  
+
+OpenDocumentPlugin.desc:( ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÑÑÐœ OpenOffice 2.0 ) OASIS OpenDocumentÑiÒ£ ÒÐ°Ð»ÑÐ±ÑÐœÑÒ£ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ Ð¿Ð»Ð°Ð³ÐžÐœ  
+
+PagedImagePlugin.desc:ÓÑÐ±iÑ ÑÑÑÐµÑÐºÐµ ÐŒiÐœÐŽÐµÑÑi ÐµÐŒÐµÑ ÑÐ°ÐœÑÐ»ÒÐ°Ðœ ÐŒÓÑiÐœÐŒÐµÐœ ÑÑÑÐµÑÑÐµÑÐŽiÒ£ ÑiÐ·Ð±ÐµÐº ÒÐŸÑÑÐ¿ Ð¶Ð°ÑÐ°Ð»ÒÐ°Ðœ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ Ð¿Ð»Ð°Ð³ÐžÐœ.  
+
+PagedImagePlugin.documenttype:(ÐºÓ©ÑÑÐ³Ðµ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÐŽÑ ) ÒÒ±Ð¶Ð°ÑÑÑÒ£ ÑÒ¯Ñi ÐŸÑÐœÐ°ÑÑÒ£ÑÐ·.  
+
+PagedImagePlugin.documenttype.paged:ÐÐµÐ»ÐµÑi Ð¶ÓÐœÐµ ÐÐ»ÐŽÑÒ£ÒÑ Ð¶ÓÐœÐµ Ð±Ð°ÑÑÑÐŒÐ°ÐœÑ ÐœÒ±ÑÒÐ°ÒÑÑÑÑÒ£ Ð±ÐµÑÑiÐº ÒÒ±Ð¶Ð°ÑÑÐ°ÑÑ Ð±ÐµÑÐºÐµÐ³Ðµ X Ó©ÑÑÐ³Ðµ Ð±ÐŸÐ»Ð°ÐŽÑ.  
+
+PagedImagePlugin.documenttype.hierarchy:ÐÐµÑÐ°ÑÑ
+ÐžÑÐ»ÑÒ ÒÒ±Ð¶Ð°ÑÑÐ°Ñ ÐŒÐ°Ð·ÐŒÒ±ÐœÐŽÐ°ÑÐŽÐ° Ð±ÐŸÐ»Ð°ÐŽÑ.  
+
+PagedImagePlugin.headerpage:(ÑÑÑÐµÑÑiÐ· ) Ð±Ð°Ñ Ð±ÐµÑÑi ÓÑÐ±iÑ ÒÒ±Ð¶Ð°ÑÒÐ° ÒÐŸÑÑ.  
+
+PDFPlugin.allowimagesonly:ÐÐ»Ð°ÑÑÐœ ÐŒÓÑiÐœ Ð¶ÐŸÒ Ð±ÐŸÐ»Ð°ÑÑÐœ PDFÑÑÒ£ ÒÐŸÐ»ÐŽÐ°ÐœÑ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÑ ÑÒ±ÒÑÐ°Ñ ÐµÑÑ. ÐÐ»Ð°ÑÑ - complexÑÑÒ£ ÒÐ°Ð¶ÐµÑÑiÐ»iÐ³iÐœ ÑÐµÑÐµÐŽi. ÐÐ°Ð¹ÐŽÐ°Ð»Ñ ÑÐµÐº ÒÐ°ÐœÐ° convert_to htmlÐŽÐ°ÑÐŒÐµÐœ.  
+
+PDFPlugin.complex:ÐÒ¯ÑÐŽÐµÐ»iÑÐµÐº Ó©ÐœiÐŒÐŽi ÒÒ±ÑÐ°ÐŽÑ. ÓšÐœiÐŒÐœiÒ£ ÒÐŸÑÐ»Ð°ÑÑÐœÑÒ£ HTMLÐœÑÒ£ ÒÐ°Ð»ÑÐ±ÑÐœÐŽÐ° Ð±Ò±Ð» ÐŸÐ¿ÑÐžÑÐŒÐµÐœ Ò±ÒÑÐ°ÑÑÑÐ°Ò Ð±iÑÑÑÐŒÐ° PDFÑÐ°ÑÒÐ° ÐºÓ©ÑiÐœÐµÐŽi - ÑÐ°Ð¹Ð». ÐÐµÑÐµÐºÑi ÐŒÓ©Ð»ÑÐµÑÐŽÐµÐŒÐµÐœ Ð¶Ò±ÐŒÑÑ iÑÑÐµÑiÐœ (*nix gsÑÐµÑ Ò¯ÑiÐœ Windows Ò¯ÑiÐœ ÑiÐ·ÐŽiÒ£ ÑÒ±ÒÑÐ°ÑÑÑÒ£ Ð¶ÐŸÐ»Ñ, ÐŸÑÑ ÑÐ°ÒÑÑÑÐ°Ò£ÑÐ·ÐŽÐ° ÑiÐ·ÐŽÐµ Ð±ÐŸÐ»ÑÑ ÐºÐµÑÐµÐº ÑÒ±ÒÑÐ°ÑÑÑÒ£ Ð¶ÐŸÐ»ÑÐœÐŽÐ°ÒÑ gswin32c.exe Ð±ÐŸÐ»ÑÑÒ£ÑÐ· ÐºÐµÑÐµÐº Ð±ÐŸÐ» ) Ghostscript ÐŸÑÐœÐ°ÑÑÐ»Ñ Ò¯ÑiÐœ ÑÐŸÐ» Ò¯ÑiÐœÐŽÐµÑ.  
+
+PDFPlugin.desc:With-it pdf ÒÐŸÐ»Ð°Ð¹Ð»Ñ ÐÐ»Ð°Ð³ÐžÐœ.  
+
+PDFPlugin.nohidden:Pdftohtml ÑÐ°Ð»Ð¿ÑÐœÑÑÑÐ°ÑÑÐœÐ° Ð±Ò¯ÑÐºÐµÐŒÐµ ÐŒÓÑiÐœ Ð°Ð»ÑÒÐ° ÐºÐµÐŽÐµÑÐ³i ÐºÐµÐ»ÑiÑÐµÐŽi. ÐÐ³ÐµÑ ÑÐŸÐœÑÐŒÐµÐœ Ð±iÑÐ³Ðµ ÐŸÐ¿ÑÐžÑ - complex ÐŸÑÐœÐ°ÑÑÐ»ÑÐ°, Ð±Ò±Ð» Ð¿Ð°Ð¹ÐŽÐ°Ð»Ñ ÑÐµÐº ÒÐ°ÐœÐ°.  
+
+PDFPlugin.noimages:PDF ÑÑÑÐµÑi Ð°Ð»ÑÒÐ° ÑÑÑÑÑÐ¿Ð°Ò£ÑÐ·.  
+
+PDFPlugin.use_sections:PDFÑÑÒ£ ÓÑÐ±iÑ Ð±ÐµÑÐºÐµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ Ð¶ÐµÐºÐµ Ð±Ó©Ð»iÐŒÐŽi Ð¶Ð°ÑÐ°Ð»ÑÑÐœ - ÑÐ°Ð¹Ð».  
+
+PDFPlugin.zoom:CÑ ÐºÓ©ÐŒÐµÐ³iÐŒÐµÐœ (ÐµÐ³ÐµÑ ÐŸÑÐœÐ°ÑÑÐ»ÑÐ° - complex Ð±ÐŸÐ»ÑÐ°, Ð±Ò±ÐœÑ Ð¿Ð°Ð¹ÐŽÐ°Ð»Ñ ÑÐµÐº ÒÐ°ÐœÐ° ) PDFÑÑÒ£ ÑÑÑÐµÑiÐœiÒ£ ÐŒÐ°ÑÑÑÐ°Ð±Ñ Ó©Ð·Ð³ÐµÑÐµÑiÐœ ÑÐ°ÐºÑÐŸÑ.  
+
+PostScriptPlugin.desc:ÐÒ±Ð» - ÐŒÓÑiÐœÐŽiÐº ÐºÐŸÐœÐ²ÐµÑÑÐµÑÐ³Ðµ \"ÐºÐµÐŽÐµÐ¹ Ð»ÑÐŽÐž\Ð»ÐµÑ" ÐœiÒ£ Ð¿ÐŸÑÑÑÐºÑÐžÐ¿ÑÑÐŒÑ . ÐÐ³ÐµÑ ÑÑÐœÑÐŒÐµÐœ Ð±ÐŸÐ»ÑÐ°, http://www.nzdl.org/html/software.htmlÐŒÐµÐœ Ð¶Ò¯ÐºÑÐµÑÐ³Ðµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÒÐŸÐ» Ð¶ÐµÑÐµÑiÐœ PRESCRIPTÑiÒ£ ÒÐŸÐ»ÐŽÐ°ÐœÑ Ð¿Ð°ÐºÐµÑÑÐµÑiÐœ ÒÐ°ÑÐ°Ð¿ ÑÑÒÑÒ£ÑÐ·  
+
+PostScriptPlugin.extract_date:PS Ð±Ð°ÑÑÐ°Ðœ ÐŽÐ°ÑÐ°ÑÑÐœÑÒ£ ÑÑÒÐ°ÑÑÑ  
+
+PostScriptPlugin.extract_pages:PS Ð±Ð°ÑÑÐ°Ðœ Ð±ÐµÑÑÐµÑiÐœiÒ£ ÑÑÒÐ°ÑÑÑ  
+
+PostScriptPlugin.extract_title:PS Ð±Ð°ÑÑÐœÐ°Ðœ Ð°ÑÐ°ÑÑÐœ ÑÑÒÐ°ÑÑ.  
+
+PowerPointPlugin.desc:Microsoft PowerPointÑiÒ£ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÑÐœÑÒ£ ÐžÐŒÐ¿ÐŸÑÑÑÐœÐ° ÐÐ»Ð°Ð³ÐžÐœi.  
+
+PowerPointPlugin.windows_scripting:ÐÑÑÐ°Ð»Ñ, (JPEG, PNG, GIFÑiÒ£ ÓÑ ÑÒ¯ÑÐ»i ÑÒ¯ÑÐŽiÒ£ ÑÑÑÐµÑÑÐµÑiÐœiÒ£ ÑÐŸÐ¿ÑÐ°ÐŒÐ°ÑÑÐœÐ° PPTÑÑÒ£ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÑÐœ ÐµÑÐºiÐœ Ð°ÑÐŽÐ°ÑÑ Ò¯ÑiÐœ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐ°Ð»Ð°Ñ Ò¯ÑiÐœ Visual Basic ) ) MicroSoft WindowsÑiÒ£ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐ°Ð»Ð°ÑÑÐœ ÑÐµÑ
+ÐœÐŸÐ»ÐŸÐ³ÐžÑÐœÑ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»ÑÑÐœ, open source ppttohtmlÐŽÑÒ£ Ð¿Ð°ÐºÐµÑi ÐŸÑÑÐœÑÐœÐ°.  
+
+PrintInfo.bad_general_option:Ò£-Ñi Ð¿Ð»Ð°Ð³ÐžÐœ (ÐŸÑÑÐ°Ò ÐŸÐ¿ÑÐžÑÐ»Ð°Ñ - Ð±Ò±Ð» ÑÒ¯ÑiÐœiÐºÑi Ð±Ð°ÑÐ»ÑÒ ÐÐ»Ð°Ð³ÐžÐœ Ð±ÐŸÐ»ÒÐ°Ðœ ) ÐŽÒ±ÑÑÑ ÐµÐŒÐµÑ ÐŸÑÑÐ°Ò ÐŸÐ¿ÑÐžÑÐœÑ ÒÐŸÐ»ÐŽÐ°ÐœÐ°ÐŽÑ. Collect.cfgÐœÑÒ£ ÑiÐ·ÐŽiÒ£ ÐºÐµÑÐºiÐœÐŽi ÑÐ°Ð¹Ð»ÑÐœ ÑÐµÐºÑÐµÑiÒ£iÐ·.  
+
+PrintInfo.desc:(pluginfo.pl ) ÐŒÓ©Ñ ÑÑÑÐ°Ð»Ñ ÐŒÓÐ»iÐŒÐµÑÐ¿ÐµÐœ ÐÐ»Ð°Ð³ÐžÐœ, iÑÑÐµ ÐºÓ©Ð¿ÑiÐ»iÐºÑÐµ Ð¶ÓÐœÐµ pluginfo.plÐŽiÒ£ ÐŽÓÐ»ÐµÐ»ÐŽÐµÑiÐœ ÑÐ°Ð»ÐŽÐ°Ð¹ÐŽÑ.  
+
+ProCitePlugin.desc:ProCiteÐœiÒ£ ÐŽÐµÑÐµÐºÑÐµÑ ÒÐŸÑÐ»Ð°ÑÑ (ÑÐµÑÐºÐµ ÑÑÒÐ°ÑÑÐ»ÒÐ°Ðœ ) Ò¯ÑiÐœ ÐÐ»Ð°Ð³ÐžÐœ  
+
+ProCitePlugin.entry_separator:ÐÐŸÐ» ProCite ÐŽÐµÑÐµÐºÑÐµÑ ÒÐŸÑÑÐœÐŽÐ°ÒÑ Ð¶Ð°Ð·ÑÐ»Ð°ÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ Ð¶ÐµÐºÐµ Ó©ÑiÑÑÐµÑiÐœiÒ£ Ð±iÑÐœÐµÑÐµ ÐŒÓÐœÐŽÐµÑiÐœiÒ£ Ð±Ó©Ð»iÐœÑiÐœÐµ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÐŽÑ.  
+
+ReadTextFile.could_not_extract_encoding:ÐÑÐºÐµÑÑÑ : ÐºÐŸÐŽÑÐ°Ñ %s Ð°Ð»Ð° Ð°Ð»ÐŒÐ°ÐŽÑ - %s Ò¯ÐœÐŽÐµÐŒÐµÑ Ð±ÐŸÐ¹ÑÐœÑÐ°  
+
+ReadTextFile.could_not_extract_language:ÐÑÐºÐµÑÑÑ : ÑiÐ» %s Ð°Ð»Ð° Ð°Ð»ÐŒÐ°ÐŽÑ - Ò¯ÐœÐŽÐµÐŒÐµÑ Ð±ÐŸÐ¹ÑÐœÑÐ° -%s  
+
+ReadTextFile.could_not_open_for_reading:ÐŸÒÑÒÐ° %s Ð°ÑÐ° Ð°Ð»ÐŒÐ°ÐŽÑ  
+
+ReadTextFile.default_encoding:ÐÒ±Ð» ÐºÐŸÐŽÑÐ°Ñ, input_encodingÐœi ÒÐŸÐ»ÐŽÐ°ÐœÑÒ£ÑÐ· - input_encoding Ð°Ð²ÑÐŸ, ÐºÒ¯Ð¹iÐœÐŽÐµÐ³i ÐŒÓÑiÐœiÐœiÒ£ ÐœÐµÐŒÐµÑÐµ ÐºÐŸÐŽÐ¿ÐµÐœ Ð¶Ð°Ð·ÑÐ»ÒÐ°Ðœ Ð±ÐŸÐ»ÑÐ¿ Ð°Ð»ÑÒÐ° ÐºÐŸÐŽÐ¿ÐµÐœ Ð¶Ð°Ð·ÑÐ»ÒÐ°Ðœ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÑÐ»Ð°ÑÑ Ð°Ð»Ð³ÐŸÑÐžÑÐŒÑ Ð°Ð»ÑÒÐ° ÐŸÑÐœÐ°ÑÐ¿Ð°ÒÐ°Ðœ, Ð±iÑÐ°Ò Greenstone ÒÐŸÐ»ÐŽÐ°ÐŒÐ°Ð»Ð°ÑÑÐœ. ÐÒ±Ð» ÐŸÐ¿ÑÐžÑÐ»Ð°Ñ ÑÐŸÐ» ÐŒÓÐœ, input_encodingÐ»ÐµÑ Ð°Ð»Ð° Ð°Ð»Ð°ÐŽÑ - input_encoding.  
+
+ReadTextFile.default_language:ÐÐ³ÐµÑ Greenstone ÐºÒ¯Ð¹ÐŽÐµ ÒÐ°Ð»Ð°Ð¹ ÒÒ±Ð¶Ð°ÑÑÑÒ£ ÑiÐ»i Ð±ÐŸÐ»ÑÐ¿ ÑÐ°Ð±ÑÐ»ÒÐ°ÐœÑÐœ ÑÐµÑÐ¿ÐµÑÐµ, ÑiÐ»ÐŽiÒ£ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑiÐœiÒ£ ÑÐ»ÐµÐŒÐµÐœÑi ÐŒÓÐœÐœiÒ£ Ð±Ò±ÐœÑ ÐŸÑÐœÐ°ÑÐ¿Ð°Ð»Ð°ÐŽÑ.Ò®ÐœÐŽÐµÐŒÐµÑ Ð±ÐŸÐ¹ÑÐœÑÐ°Ð»Ð°Ñ - Ð±Ò±Ð» ÐÐ¡Ð 'en' ÑiÐ»ÐŽiÒ£ 639 ÐœÑÑÐ°ÐœÐŽÐ°ÑÑÐœ ÒÐŸÐ»ÐŽÐ°ÐœÐ°ÐŽÑ : en= Ð°ÒÑÐ»ÑÑÐœ ÑiÐ»i. ÐÐ³ÐµÑ input_encodingÐœiÒ£ ÐºÓ©Ò£iÐ» Ð°ÑÐŽÐ°Ñ, ÐœÐµÑi - Ð°Ð²ÑÐŸ ÐŸÑÐœÐ°ÑÑÐ»ÐŒÐ°ÒÐ°Ðœ, Ð¶ÓÐœÐµ - extract_language ÐŸÑÐœÐ°ÑÑÐ»ÐŒÐ°ÒÐ°Ðœ, Ð±Ð°ÑÐ»ÑÒ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÑ ÐŸÐ»Ð°ÑÐŽÑÒ£ ÑiÐ»iÐœiÒ£ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑiÐœ Ð°Ð»Ð° ÐŒÓÐœÐœiÒ£ Ð±Ò±Ð» ÒÐŸÐ¹ÑÐ»ÒÐ°Ðœ.  
+
+ReadTextFile.desc:ÐÓÐŽiÐŒÐ³i ÐŒÓÑiÐœÐŽiÐº ÒÐ°Ð»ÑÐ¿ Ð±ÐŸÐ»Ð°ÑÑÐœ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐœÐµÐ³iÐ·ÐŽi Ð¿Ð»Ð°Ð³ÐžÐœ.  
+
+ReadTextFile.empty_file:ÑÐ°Ð¹Ð» ÐµÑÒÐ°ÐœÐŽÐ°Ð¹ ÐŽÐ° ÐŒÓÑiÐœÐŽÐµ Ð±ÐŸÐ»ÐŒÐ°Ð¹ÐŽÑ  
+
+ReadTextFile.extract_language:ÓÑÐ±iÑ ÒÒ±Ð¶Ð°ÑÑÑÒ£ ÑiÐ»iÐœ Ð±ÐµÐ»Ð³iÐ»ÐµÒ£iÐ· Ð¶ÓÐœÐµ ÑiÐ» ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑ ÐŸÑÐœÐ°ÑÑÒ£ÑÐ·. ÐÐ³ÐµÑ - Ð±ÐŸÐ»ÑÐ° input_encoding Ð°Ð²ÑÐŸ ÐŸÑÐœÐ°ÑÑÐ»ÑÐ°, ÐºÓ©Ò£iÐ» Ð°ÑÐŽÐ°Ñ, ÐŒÑÐœÐ°Ñ ÐœÐµ Ð°Ð²ÑÐŸÐŒÐ°ÑÑÑ iÑÑÐµÐ»ÐµÐŽi.  
+
+ReadTextFile.file_has_no_text:ÒÐÐ¢Ð : %s ÐµÑÒÐ°ÐœÐŽÐ°Ð¹ ÐŽÐ° ÐŒÓÑiÐœÐŽÐµ Ð±ÐŸÐ»Ð°ÐŽÑ  
+
+ReadTextFile.input_encoding:ÐÐ°ÑÑÐ°Ð¿ÒÑ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÐŽÑÒ£ ÐºÐŸÐŽÑÐ°ÑÑ. ÐÒ±Ð» ÑÐžÑÑÐ»Ð°ÑÐ»Ð°ÑÐŽÐ°Ðœ ÒÒ±Ð¶Ð°ÑÑÐ°Ñ Ð¶ÓÐœÐµ utf8 ÑÒ¯ÑiÐœÐŽÐµÐ³i Ð¶Ò¯Ð¹ÐµÐ»ÐµÑÐŽi iÑiÐœÐŽÐµ ÑÐ°ÒÑÐ°Ð»ÑÒÐ° ÐµÑÐºiÐœ Ð°ÑÐŽÐ°ÑÐ°ÐŽÑ.  
+
+ReadTextFile.input_encoding.auto:ÓÑÐ±iÑ Ð±Ð°ÑÑÐ°Ð¿ÒÑ ÒÒ±Ð¶Ð°ÑÑÑÒ£ ÐºÐŸÐŽÑÐ°ÑÑÐœ Ð°Ð²ÑÐŸÐŒÐ°ÑÑÑ ÑÐµÒ£ÐµÑÑiÑÑÐ³Ðµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐŒÓÑiÐœÐœiÒ£ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÑÑÑÐœÑÒ£ Ð°Ð»Ð³ÐŸÑÐžÑÐŒÑÐœ ÒÐŸÐ»ÐŽÐ°ÐœÑÒ£ÑÐ·. ÐÒ±Ð» Ð±ÐŸÐ»Ð°ÐŽÑ, Ð±iÑÐ°Ò ÒÐ°Ð¹ÐŽÐ° ÐŸÐœÐŽÐ°ÑÑ Ð¶Ò±ÐŒÑÑ iÑÑÐµÐ¹ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐœÑÒ£ ÑÐŸÐ»ÑÒÑ ÑÐµÐºÑÐµÑiÐœÐŽÐµÐ³i ÑÐžÑÑÐ»Ð°ÑÐŽÑ Ð±iÑ ÑÒ¯ÑÐ»iÐœi ÐœÐµÐŒÐµÐœ ÐºÓ©Ð±iÑÐµÐº ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÐŽÑ.  
+
+ReadTextFile.read_denied:Ò®ÑiÐœ ÒÐ°Ð±ÑÐ»ÐŽÐ°ÐœÐ±Ð°ÒÐ°Ðœ ÐŸÒÑÐ»Ð°Ñ ÑÐµÑÑ %s  
+
+ReadTextFile.separate_cjk:ÓÑÐ±iÑ ÐºÐµÐŒÑiÐ»iÐº ÑÐ°Ò£Ð±Ð°Ð»Ð°Ñ, ÐŽÐµÐ³ÐµÐœÐŒÐµÐœ ÑÑÐ¹ÒÑÐ·ÑÐ¿ ÑÐ°Ð»Ð°ÐŽÑ ÐµÐºi ÑÓ©Ð· ÒÑÑÐ°Ð¹, Ð¶Ð°Ð¿ÐŸÐœ Ð¶ÓÐœÐµ ÐºÓÑiÑ ÐžÐµÑÐŸÐ³Ð»ÐžÑÑÐµÑÐŽiÒ£ Ð°ÑÐ°ÑÑÐœÐŽÐ°ÒÑ Ð°ÐºÑÐ°Ð¹ Ð±Ó©Ð»ÐµÐŽi. Ð¡ÐµÐ³ÐŒÐµÐœÑÑÐµÐ»ÐŒÐµÐ³ÐµÐœ ÐŒÓÑiÐœÐ³Ðµ ÒÐŸÐ»ÐŽÐ°ÐœÑ.  
+
+ReadTextFile.unsupported_encoding:ÐÑÐºÐµÑÑÑ : %s  ÒÐŸÐ»ÐŽÐ°ÐŒÐ°ÒÐ°Ðœ (%s ) ÑÐžÑÑÐ»Ð°Ñ ÐºÐŸÐŽÐ¿ÐµÐœ Ð¶Ð°Ð·ÑÐ»ÒÐ°Ðœ Ð±ÐŸÐ»Ñ Ò¯ÑiÐœ ÐºÓ©ÑiÐœiÐ¿ ÒÐ°Ð»Ð°ÐŽÑ%s	                 
+
+ReadTextFile.wrong_encoding:ÐÑÐºÐµÑÑÑ : %s Ò ÑÐžÑÑÐ»Ð°Ñ ÒÐŸÐ»ÐŽÐ°ÐœÐ° %sÑÐžÑÐ°Ð»ÐŸÑÑ, Ð±iÑÐ°Ò ÒÐ°Ð»Ð°Ð¹ %s Ð±ÐŸÐ»ÒÐ°ÐœÑÐœ ÐºÓ©ÑiÐœiÐ¿ ÒÐ°Ð»ÐŽÑ ÐºÐŸÐŽÐ¿ÐµÐœ Ð¶Ð°Ð·ÑÐ»ÒÐ°Ðœ.	  
+
+ReadXMLFile.desc:XML-ÑÑ ÐÐ»Ð°Ð³ÐžÐœÐŽÐµÑÐŽiÒ£ ÐœÐµÐ³iÐ·Ð³i ÐºÐ»Ð°ÑÑÑ.	  
+
+ReadXMLFile.xslt:ÐÐµÐŽÐµÐœÐ±iÐ·Ð³ÐµÑ Ð°ÑÒÑÐ»ÑÐœÑÒ£ ÑÐ°Ð¹Ð»Ñ Ð±ÐµÐ»Ð³i ÒÐŸÐ¹ÑÐ»ÒÐ°ÐœÑ ÒÐŸÐ»Ð°Ð¹Ð»Ñ ÐµÐœÐŽiÑiÐ»ÐµÑiÐœ ÒÒ±Ð¶Ð°ÑÑÑ Ð±Ð°ÑÒÐ° ÑÒ¯ÑÐ³Ðµ Ó©Ð·Ð³ÐµÑÑÑ.  Etc/mods2dc.xsl ÐŒÑÑÐ°Ð»ÑÐœÐ° ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ Ð±ÐŸÐ»Ð°ÑÑÐœ ÑÐ°Ð¹Ð»ÐŽÑÒ£ ÑÐ°Ð»ÑÑÑÑÑÐŒÐ°Ð»Ñ Ð°ÑÐ°ÑÐ»Ð°ÑÑ ÐµÑÐµÐ¿ÑÐµÐ¹ÐŽi.	  
+
+RealMediaPlugin.desc:Real Media ÑÐ°Ð¹Ð»ÐŽÐ°ÑÑÐœÑÒ£ Ó©Ò£ÐŽÐµÑiÐœÐµ ÐÐ»Ð°Ð³ÐžÐœ.	  
+
+ReferPlugin.desc:ReferPlug ÑÐµÑÐµÑÐ°Ñ ÒÐ°Ð»ÑÐ±ÑÐœÐŽÐ°ÒÑ Ð±ÐžÐ±Ð»ÐžÐŸÐ³ÑÐ°ÑÐžÑÐ»ÑÒ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÑ ÐŸÒÑÐ¿ ÐŸÑÑÑÐ°ÐŽÑ.	  
+
+RogPlugin.desc:Ð€Ð°Ð¹Ð»ÐŽÐ°ÑÐŽÐ°Ðœ Ð±iÑ - ÐŽÐµÒ£Ð³ÐµÐ¹Ð»i ÒÒ±Ð¶Ð°ÑÑÐ°ÑÑ Ð±ÐŸÑ ÑÒ±ÑÑÐ»Ð°ÑÐŽÑ ÒÒ±ÑÐ°ÐŽÑ . rog ÐœÐµÐŒÐµÑÐµ . mdb.  
+
+RTFPlugin.desc:RTFÑÑÒ£ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÑÐœÑÒ£ ÐžÐŒÐ¿ÐŸÑÑÑÐ°ÑÑÐœÐ° ÐÐ»Ð°Ð³ÐžÐœ.  
+
+SourceCodePlugin.desc:ÐÓÐ» ÒÐ°Ð·iÑ ÑÐ°Ð¹Ð» Ð°ÑÑ (ÐºÐµÐ¹Ð±iÑ ÒÐŸÑÑÐŒÑÐ°ÐœÑ ÐºÐµÐ· ÐºÐµÐ»Ð³ÐµÐœ ÑÐ°Ò£ÐŽÐ°ÑÐ»Ñ ÐŒÐžÐœÑÑ ) Ð°ÑÐ°ÑÒÐ° ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÐŽÑ. ÐÒÑÐŒÐŽÐ°ÒÑ ÑiÐ»ÐŽÐµÑ :\n ÐŒÓÑiÐœ :(ÐºÓ©ÑÑÐµÑiÐ»Ð³ÐµÐœ ÑÐµÐº ÒÐ°ÐœÐ° ÐŒÓÑiÐœÐœiÒ£ ÑÒ¯ÑiÐœÐŽÐµÐ³i ÐŽÓÐ» ÒÐ°Ð·iÑ ) \nPerl (ÐºÓ©ÑÑÐµÑiÐ»Ð³ÐµÐœ ÑÐµÐº ÒÐ°ÐœÐ° ÐŒÓÑiÐœÐœiÒ£ ÑÒ¯ÑiÐœÐŽÐµÐ³i ÐŽÓÐ» ÒÐ°Ð·iÑi ) \n ÒÐ°Ð±ÑÒ READMEs/ (ÐŽÓÐ» ÒÐ°Ð·iÑ C ++ ÐºÐ»Ð°ÑÑÑÐœÑÒ£ ÒÐŸÑÑÐ»ÒÐ°Ðœ ÐŸÐ¿ÐµÑÐ°ÑÐŸÑ Ð¶ÓÐœÐµ declsÑÐµÑi Ð°Ð»Ð°ÐŽÑ ) Ð¡ÐŸÐ·ÐŽÐ°ÐœÐžÐµÑÐ°Ð¹Ð»ÐŸÐ²\nC/C ++.  
+
+SourceCodePlugin.remove_prefix:(eg-remove_prefix/tmp/xx/src/ ) ÑÐ°Ð¹Ð» Ð°ÑÑÐœÐ°Ðœ Ð±Ò±Ð» Ð±Ð°ÑÑÐ°ÑÑÑ Ò¯Ð»Ð³iÑi Ð°Ð»ÑÐ¿ ÑÐ°ÑÑÐ°Ñ. Ò®ÐœÐŽÐµÐŒÐµÑ Ð±ÐŸÐ¹ÑÐœÑÐ°Ð»Ð°Ñ ÑÐ°Ð¹Ð»ÐŽÑÒ£ Ð°ÑÑÐœ ÑÒ±ÒÑÐ°ÑÑÑÒ£ Ð±Ð°ÑÐ»ÑÒ Ð¶ÐŸÐ»Ñ ÐŒiÐœÐŽÐµÑÑi.  
+
+SplitTextFile.desc:SplitPlug - Ð±Ò±Ð» Ð¶ÐµÐºÐµÐ»ÐµÑ ÒÐ°ÑÐ°Ð»ÑÐŽÐ°Ðœ Ó©ÑÐµÑiÐœ ÑÐµÐ³ÐŒÐµÐœÑÑÐµÑÐ³Ðµ ÐºiÑÐµÑiÐœ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÐŽÑÒ£ Ð±Ó©Ð»iÐºÑÐµÑÐ³Ðµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐÐ»Ð°Ð³ÐžÐœ.ÐÒ±Ð» ÐÐ»Ð°Ð³ÐžÐœ ÑiÐºÐµÐ»ÐµÐ¹ ÑÐ°ÒÑÑÑÒÐ° Ð±ÐŸÐ»ÐŒÐ°Ð¹ÐŽÑ. ÐÐ³ÐµÑ ÑiÐ· Ð±iÑÐœÐµÑÐµ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÐŽÐ° Ð±ÐŸÐ»Ð°ÑÑÐœ ÐºiÑÐµÑiÐœ ÑÐ°Ð¹Ð»ÐŽÐ°Ñ Ó©Ò£ÐŽÐµÑiÒ£iÐ· ÐºÐµÑÐµÐº Ð±ÐŸÐ»ÑÐ°Ò£ÑÐ·, Ð±Ò±ÐœÑÒ£ ÐŸÑÑÐœÑÐœÐ°, ÑÑÐ· ÑiÐ· Ð±Ò±Ð» ÒÒ±Ð¶Ð°ÑÑÐ°Ñ Ð±iÑ ÐŸÐœÑÒ£ SplitPlugÑiÐœÐµÐœ ÐŒÒ±ÑÐ° ÐµÑÐµ Ð¶Ò±ÐŒÑÑÑÐ°ÐœÐ°ÑÑÐœ Ó©Ò£ÐŽÐµÑÐŽi ÑÑÐœÐºÑÐžÑÑÑ Ð±Ð°Ñ ÐÐ»Ð°Ð³ÐžÐœ Ð¶Ð°Ð·ÑÑÒ£ÑÐ· ÐºÐµÑÐµÐº. ÐŒÑÑÐ°Ð»ÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ReferPlugÐœÑ ÒÐ°ÑÐ°.  
+
+SplitTextFile.split_exp:ÐÓ©Ð»iÐºÐºÐµÐœiÒ£ ÐºiÑÐµÑiÐœ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÑÐœÑÒ£ Ð±Ó©Ð»iÐºÑÐµÑÐ³Ðµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ perl ÐŽÒ±ÑÑÑ Ó©ÑÐœÐµÐº.  
+
+StructuredHTMLPlugin.desc:Ð¡ÑÐžÐ»ÑÐ»ÐµÑÐŽÐµÐœ ÐŒÓÐ»iÐŒÐµÑi Ð±ÐŸÐ¹ÑÐœÑÐ° ÐŸÐ»Ð°ÑÐŽÑÒ£ ÑÐµÐºÑÐžÑÑÑÐœÐŽÐ° Ð±Ó©Ð»Ðµ HTMLÐœÑÒ£ Ð¶iÐºÑÐµÐ»Ð³ÐµÐœ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÑÐœÑÒ£ Ó©Ò£ÐŽÐµÑÐ³Ðµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐÐ»Ð°Ð³ÐžÐœ.  
+
+StructuredHTMLPlugin.delete_toc:HTMLÐœÑÒ£ ÐµÑÐºiÐœ Ð°ÑÐŽÐ°ÑÑÐ»ÒÐ°Ðœ ÑÐ°Ð¹Ð»ÑÐœÐ°Ðœ "ÐÐ°Ð·ÐŒÒ±Ðœ"Ð¶ÓÐœÐµ "ÐÐµÑÑÐµÐ»ÐµÑÐŽiÒ£ ÑiÐ·iÐŒi" Ð¶ÐŸÑ.  
+
+StructuredHTMLPlugin.title_header:ÒÐŸÐ»ÐŽÐ°ÐœÑÑÑÐœÑ Ð°ÐœÑÒÑÐ°ÒÐ°Ðœ title_header Ò¯ÑiÐœ Ð±ÐŸÐ»ÑÑ ÐŒÒ¯ÐŒÐºiÐœ ÑÑÐžÐ»Ñ ÐŸÑÐœÐ°ÑÑ.  
+
+StructuredHTMLPlugin.level1_header:(Ð±Ð°Ð»Ð°ÐŒÐ°  <h1>)Ð±iÑiÐœÑi ÐŽÐµÒ£Ð³ÐµÐ¹ÐŽiÒ£ Ð±Ð°ÑÑÐ°ÑÑÐœÑÒ£ HTMLÐœÑÒ£ ÒÒ±Ð¶Ð°ÑÑÐœÐŽÐ°ÒÑ ÑÑÐžÐ»Ñ ÐœÐ°ÒÑÑÐ»Ñ ÒÐŸÐ»ÐŽÐ°ÐœÑÑÑÐŒÐµÐœ Ð±ÐŸÐ»ÑÑ ÐŒÒ¯ÐŒÐºiÐœ  
+
+StructuredHTMLPlugin.level2_header:(<h2> Ð±Ð°Ð»Ð°ÐŒÐ° ) HTMLÐœÑÒ£ ÒÒ±Ð¶Ð°ÑÑÐœÐŽÐ° ÐµÐºiÐœÑi ÐŽÐµÒ£Ð³ÐµÐ¹ Ð±Ð°ÑÑÐ°ÑÐŽÑÒ£ ÑÑÐžÐ»ÑÑi ÐœÐ°ÒÑÑÐ»Ñ ÒÐŸÐ»ÐŽÐ°ÐœÑÑÑÐŒÐµÐœ Ð±ÐŸÐ»ÑÑ ÐŒÒ¯ÐŒÐºiÐœ.  
+
+StructuredHTMLPlugin.level3_header:(<h3> Ð±Ð°Ð»Ð°ÐŒÐ° ) HTMLÐœÑÒ£ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÑÐœÐŽÐ°ÒÑ Ò¯ÑiÐœÑi ÐŽÐµÒ£Ð³ÐµÐ¹ÐŽiÒ£ Ð±Ð°ÑÑÐ°ÑÑ Ò¯ÑiÐœ ÒÐŸÐ»ÐŽÐ°ÐœÑÑÑ Ð°ÐœÑÒÑÐ°Ð»Ð°ÑÑÐœ ÑÑÐžÐ»ÑÐ»ÐµÑ Ð±ÐŸÐ»ÑÑ ÐŒÒ¯ÐŒÐºiÐœ.  
+
+StructuredHTMLPlugin.toc_header:ÐŒÐ°Ð·ÐŒÒ±ÐœÐœÑÒ£ ÑÑÐžÐ»ÑÑi ÐœÐ°ÒÑÑÐ»Ñ ÒÐŸÐ»ÐŽÐ°ÐœÑÑÑÐŒÐµÐœ Ð±ÐŸÐ»ÑÑ ÐŒÒ¯ÐŒÐºiÐœ  
+
+TextPlugin.desc:ÒÒ±ÑÐ°ÐŽÑ Ð±iÑ - ÐŽÐµÒ£Ð³ÐµÐ¹Ð»i ÒÒ±Ð¶Ð°Ñ ÑÒ±ÑÑÐ¿ ÒÐ°Ð». (100 ÑÐ°Ò£Ð±Ð°Ð»Ð°ÑÒÐ° ÐŽÐµÐ¹iÐœ Ò±Ð·ÑÐœÐŽÑÒÑÐŒÐµÐœ ) Ð±iÑiÐœÑi ÐŒÓÑiÐœ Ð¶ÐŸÐ»ÑÐœÐ°Ðœ Ð°ÑÐ°ÑÐŽÑÒ£ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑiÐœÐµ ÑÐŸÐ»ÑÒÑÑÑÐ°ÐŽÑ.  
+
+TextPlugin.title_sub:Ð¡Ð°ÒÑÐ°Ð»ÒÐ°Ðœ Ð°ÑÐ°Ñ Ð¶ÐŸÐ»ÐŽÑÒ£ Ó©Ð·Ð³ÐµÑiÑÐºÐµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ Ð°Ð»ÐŒÐ°ÑÑÑÑÑÐŽÑ Ó©ÑÐœÐµÐº. ÐÑÑÐ°Ð»Ñ, Ð°Ð»ÑÐ¿ ÑÐ°ÑÑÐ°Ð»Ñ Ð¶ÓÐœÐµ Ð°ÑÐ°ÑÐŽÑ ÑÐµÑiÐœÐŽÐµ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÑÑÐœ ÐŒÓÑiÐœÐœÐµÐœ ÑÐ°ÒÑ Ð±Ð°ÑÒÐ°Ð»Ð°ÑÑ Ò¯ÑiÐœ "ÐÐµÑÑi 1" PSPlug ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÐŽÑ.  
+
+UnknownPlugin.assoc_field:ÐÑÑÐŸÑÐžÐ°ÑÐžÑÐ»Ð°ÐœÒÐ°Ðœ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÐŽÑÒ£ Ð°ÑÑÐ°ÑÑ Ò±ÑÑÐ°Ð¹ÑÑÐœ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ Ó©ÑiÑiÐœiÒ£ Ð°ÑÑ.  
+
+UnknownPlugin.desc:ÐÒ±Ð» ÒÐ°Ð»ÑÐ¿ÑÐ°ÑÐŽÐ°ÒÑ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÐŽÑÒ£ ÐžÐŒÐ¿ÐŸÑÑÑÐ°ÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐÐ»Ð°Ð³ÐžÐœ ÑÒ±ÑÑÐ¿ ÒÐ°Ð», Greenstone Ò¯ÑiÐœ Ð±ÐµÐ»Ð³iÑiÐ·.  ÐÐ°Ð»ÒÐ°Ðœ ÒÒ±Ð¶Ð°Ñ ÓÑÐ±iÑ ÐŒÒ±ÐœÐŽÐ°Ð¹ ÑÐ°Ð¹Ð»ÒÐ°, Ð¶ÓÐœÐµ Ó©Ð·iÐŒÐœiÒ£ ÑÐ°Ð¹Ð»ÑÐœ Ð¶Ð°ÑÐ°Ð»Ð° GreenstoneÒÐ° ÑÐ°Ð¿ÑÑÑÑÐ»Ð°ÐŽÑ Ð±Ò±Ð» ÒÒ±Ð¶Ð°Ñ \"Ð°ÑÑÐŸÑÐžÐ°ÑÐžÑÐ»Ð°ÐœÒÐ°Ðœ ÑÐ°Ð¹Ð»\" .  
+
+UnknownPlugin.file_format:Ð€Ð°Ð¹Ð»ÐŽÑÒ£ ÑÒ¯Ñi (ÐŒÑÑÐ°Ð»Ñ, MPEG, MIDI, ...).  
+
+UnknownPlugin.mime_type:(ÐÑÑÐ°Ð»Ñ, ÑÑÑÐµÑ/gif)  mime ÑÐ°Ð¹Ð»ÑÐœÑÒ£ ÑÒ¯Ñi.  
+
+UnknownPlugin.process_extension:ÐÐ°ÒÑÑÐ»Ñ ÐºÐµÒ£ÐµÐ¹ÑÑi Ð±Ð°Ñ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÐŽÑÒ£ Ó©Ò£ÐŽÐµÑi. ÐÒ±Ð» ÐŸÐ¿ÑÐžÑÐ»Ð°Ñ - ÐŸÒ£Ð°Ð¹ process_expÒÐ° ÐµÐºiÐœiÒ£ Ð±iÑi, Ð±iÑÐ°Ò ÐºÐµÐŒ Ð±ÐµÐ¹iÐŒÐŽÐµÐ»ÐµÑiÐœ.  
+
+UnknownPlugin.srcicon:Srcicon ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑiÐœiÒ£ ÑÐ°Ð¿Ð°ÐŽÐ° ÒÐŸÐ»ÐŽÐ°ÐœÑ Ò¯ÑiÐœ (Ð°ÑÑÑÐœ ÑÑÐ·Ñ ÑÐžÐŒÐ²ÐŸÐ»ÑÐ»Ð°ÑÑÑÐ· ) Ð°ÑÐ°ÑÐŽÑÒ£ ÐŒÐ°ÐºÑÐŸ ÐºÓ©ÑÑÐµÑiÒ£iÐ·.  
+
+WordPlugin.desc:Microsoft WordÑiÒ£ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÑÐœÑÒ£ ÐžÐŒÐ¿ÐŸÑÑÑÐ°ÑÑÐœÐ° ÐÐ»Ð°Ð³ÐžÐœ.  
+
+WordPlugin.windows_scripting:Open source WvWareÐœÑÒ£ Ð¿Ð°ÐºÐµÑi ÐŸÑÑÐœÑÐœÐ° Word HTMLÒÐ° ÒÒ±Ð¶Ð°ÑÑÐ°ÑÐŽÑ ÐµÑÐºiÐœ Ð°ÑÐŽÐ°ÑÑ Ò¯ÑiÐœ (Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐ°Ð»Ð°Ñ Ò¯ÑiÐœ Visual Basic ) Microsoft WindowsÑiÒ£ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐ°Ð»Ð°ÑÑÐœ ÑÐµÑ
+ÐœÐŸÐ»ÐŸÐ³ÐžÑÐœÑ ÒÐŸÐ»ÐŽÐ°ÐœÑ. ÐÐ³ÐµÑ ÐŸÐ» ÓÐ»i ÐŽÐµÐ¹ÐŽiÐŒ iÑÐºÐµ ÒÐŸÑÑÐ»ÑÐ°ÐŒ, WordÑÑÒ£ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐ°ÑÑ ÑÐŸÐœÑÐŒÐµÐœ Ð±iÑÐ³ÐµÐ³ÐµÐœ Ð°ÑÑÐ»Ð°ÐŽÑ Ð¿ÐµÑÐŽÐµÐŽÐµÐ¹ÐŒiÐœ.  
+
+WordPlugin.metadata_fields:VB-ÑÑ ÐµÑÐºiÐœ Ð°ÑÐŽÐ°ÑÑÐ»ÒÐ°Ðœ 2~ ÑÐºÑÐžÐ¿Ñi Ð°ÑÒÑÐ»ÑÐ»Ð°ÑÐŽÑÒ£ HTMLÐœÑÒ£ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÑÐœÑÒ£ Ð±Ò±Ð» ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ ÑÑÒÐ°ÑÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐŸÐ¿ÑÐžÑÐ»Ð°ÑÑ. ÒÐŸÐ»ÐŽÐ°ÐœÑÑÑ Ð°Ð»ÑÒÐ° ÐºÐµÑÐµÐº Ð±ÐŸÐ»Ð°ÑÑÐœ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ Ó©ÑiÑÑÐµÑiÐœiÒ£ ÑiÐ·iÐŒ Ò¯ÑiÑi Ð°ÑÒÑÐ»Ñ ÐºÓ©ÑÑÐµÑÐµ Ð°Ð»Ð°ÐŽÑ.  Ð±ÑÐ»Ð°ÑÑ Ð±iÑiÐœÑi ÑÑÑÑÑÐ»ÒÐ°Ðœ ÐŒÓÐœi ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑiÐœiÒ£ tagname Ð°ÑÐ°Ð»ÒÐ°Ðœ ÑÐ»ÐµÐŒÐµÐœÑiÐœÐŽÐµ ÑÐ°ÒÑÐ°Ñ Ò¯ÑiÐœ  tagÐœiÒ£ ÐºÓ©ÑÑÐµÑiÒ£iÐ·. ÒÐŸÐ»ÐŽÐ°ÐœÑÒ£ÑÐ· ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑi ÑÓÐ¹ÐºÐµÑÑÐµÐ»ÐµÑiÐœ ÐÑÐžÐœÑÑÐŸÑÐœÐŽÐ°ÑÑÐœÐ° ÐºÓ©ÑÑÐµÑiÐ»Ñ Ò¯ÑiÐœ Ò¯Ð»ÐºÐµÐœ ÓÑiÐ¿ÑiÒ£iÐ·. ÐšÑÒÐ°ÑÑÐ»Ð°Ñ Ò¯ÑiÐœ Ð±Ò±Ð» ÑÐŸÐ»ÐŽi ÐŸÐ¹ÐœÐ° ÐµÐŒÐµÑ.  
+
+ZIPPlugin.desc:ÐÑÑ
+ÐžÐ²ÑÐµÐ»Ð³ÐµÐœ ÐºiÑÐµÑiÐœ ÒÐ°Ð»ÑÐ¿ÑÐ°Ñ, Ð°ÒÑÐŒÐŽÐ°ÒÑ Ó©Ò£ÐŽÐµÐ³ÐµÐœ ÒÐ°Ð»ÑÐ¿ÑÐ°Ñ Ð¶ÓÐœÐµ ÐºÐµÒ£ÐµÐ¹ÑÑÐ»ÐµÑi Ð±Ð°Ñ ÑÐ°Ð¹Ð»ÐŽÐ°Ñ Ðž/ÐžÐ»Ðž ÒÑÑÑÐ»ÒÐ°Ðœ Ð±ÐŸÐ»ÑÐ¿ Ð¶Ò±ÐŒÑÑÑÐ°ÐœÐ°ÑÑÐœ ÐÐ»Ð°Ð³ÐžÐœ :(. gz, . z, . tgz, . taz ) \ngzip (. bz ) \nbzip (. bz2 ) \nbzip2 (. zip. jarÐ»ÐµÑ ) \nzip (. tar ) \ntar \n \n Ð±Ò±Ð» ÐÐ»Ð°Ð³ÐžÐœ ÐºÐµÐ»ÐµÑi Ð±ÐŸÐ»ÐŒÐ°ÒÐ°Ðœ (ÐµÐ³ÐµÑ ÑÐžiÑÑi ÒÐ°Ð»ÑÐ¿ÑÐ°Ñ Ó©Ò£ÐŽÐµÑÐ³Ðµ ÑÑÑÑÑÐ°ÐŽÑ ) ÑÑÐžÐ»ÐžÑÐ°Ð»Ð°ÑÒÐ° Ð°ÑÒÐ° ÑÒ¯Ð¹ÐµÐ¹ÐŽi :(gzip Ò¯ÑiÐœ ) \ngunzip (bzip Ò¯ÑiÐœ ) \nbunzip (tar Ò¯ÑiÐœ ) \ntarÐŽiÒ£ (ÐŽÐ»Ñzip ) \nbunzip2 \nunzip.  
+
+#
+# Download module option descriptions
+#
+
+BaseDownload.desc:ÐÒ¯ÐºÑÐµÑÐŽiÒ£ ÐŒÐŸÐŽÑÐ»ÐŽÐ°ÑÑ Ò¯ÑiÐœ ÐœÐµÐ³iÐ·Ð³i ÐºÐ»Ð°ÑÑ  
+BaseDownload.bad_general_option:% ÑÐ°Ò£ÐŽÐ°ÑÐŽÑÒ£ ÐœÐµÐºÐŸÑÐµÐºÑÐœÐŸÐ³ÐŸÑÑ Ò¯ÑiÐœ ÐŒÐŸÐŽÑÐ»ÐŽÑÒ£ Ð¶Ò¯ÐºÑÐµÑÐ»ÐµÑi.  
+MediaWikiDownload.desc:MediaWikiÐœiÒ£ ÑÐ°Ð¹ÑÑÐ°ÑÑÐŒÐµÐœ Ð¶Ò¯ÐºÑÐµÑÐ³Ðµ ÐŒÐŸÐŽÑÐ».  
+MediaWikiDownload.reject_filetype:ÐÑÑÐ°Ð»Ñ, Ò¯ÑiÑÐ»ÐµÑÐŒÐµÐœ *cgi-bin* Ð°Ð¹ÑÑÑÒ *. pptÑÐ°ÑÐŽÑÒ£ Ð°ÑÒÒÐ° Ð±Ð°ÑÑÐ»Ð°ÑÑÐœ URLÐ»Ð°Ñ-ÑÑÑÑÐœÑÒ£ ÑiÐ·iÐŒi Ð³ÐžÐ¿ÐµÑÑiÐ»ÑÐµÐŒÐµ, cgi-bin ÐœÐµÐŒÐµÑÐµ cgi-bin Ð°ÑÒÒÐ° Ð±Ð°ÑÒÑÐ·Ð° Ð°Ð»Ð°ÐŽÑ, ÐœÐµÐŒÐµÑÐµ . Ppt  
+MediaWikiDownload.reject_filetype_disp:ÐÑÒÒÐ° Ð±Ð°ÑÑÐ»Ð°ÑÑÐœ URLÐ»Ð°Ñ-ÑÑÐœÑÒ£ ÑiÐ·iÐŒi Ò¯ÑiÑ Ð°Ð¹ÑÑÑÒ.  
+MediaWikiDownload.exclude_directories:ÐÑÑÐ°Ð»Ñ, /people, /documentation-Ñi ÑÑÒÐ°ÑÑÐ¿ ÑÐ°ÑÑÐ°Ð»ÒÐ°Ðœ (ÑiÐ·Ð±ÐµÐ³Ðµ ÒÐ°Ð¶ÐµÑÑi ÑÐŸÐ»ÑÒ Ð¶ÐŸÐ» ) ÑiÐ·Ð±ÐµÐ»ÐµÑÐŽiÒ£ ÑiÐ·iÐŒi people Ð¶ÓÐœÐµ documentation ÑÓ©ÐŒÐµÐœÐ³i ÑiÐ·Ð±ÐµÐ»ÐµÑiÐœ ÑÑÒÐ°ÑÐ°ÐŽÑ.  
+MediaWikiDownload.exclude_directories_disp:Ò®ÑiÑ Ð°Ð¹ÑÑÑÒ ÑÑÒÐ°ÑÑÐ¿ ÑÐ°ÑÑÐ°Ð»ÒÐ°Ðœ ÑiÐ·Ð±ÐµÐ»ÐµÑÐŽiÒ£ ÑiÐ·iÐŒi.  
+
+OAIDownload.desc:Ð ÐµÐ¿ÐŸÐ·ÐžÑÐŸÑÐžÐµÐ² OAI Ð¶Ò¯ÐºÑÐµÑiÐœÐµ ÐŒÐŸÐŽÑÐ»  
+OAIDownload.url_disp:ÐÐ°ÑÑÐ°Ð¿ÒÑÑÑ URL  
+OAIDownload.url:URL ÑÐµÐ¿ÐŸÐ·ÐžÑÐŸÑÐžÑÑÑ OAI  
+OAIDownload.set_disp:ÐÑÐœÐ°ÑÑ  
+OAIDownload.set:Ð ÐµÐ¿ÐŸÐ·ÐžÑÐŸÑÐžÐžÒÐ° ÐºÓ©ÑcÐµÑiÐ»Ð³ÐµÐœ Ð¶ÐžÑÐœÑÐœÑÒ£ Ð¶Ò¯ÐºÑÐµÑiÐœ ÑÐµÐºÑÐµÑ  
+OAIDownload.metadata_prefix_disp:ÐÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ Ð¿ÑÐµÑÐžÐºÑi  
+OAIDownload.metadata_prefix:ÐÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑÐŽiÒ£ ÒÐ°Ð»ÑÐ±Ñ ÑÐºÑÐ¿ÐŸÑÑÑÐ°, Ð¿ÑÐžÐŒÐ°Ð»Ð°ÑÐŽÑ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÐŽÑ : oai_dc, qdc Ð¶ÓÐœÐµ ÑÐ°ÒÑ Ð±Ð°ÑÒÐ°Ð»Ð°Ñ ÒÐ°Ð»Ð°Ð¹ ÒÐ°Ð»ÑÐ¿ÑÐ°ÑÐŽÑ ÑÒ¯Ð¹ÐµÐ¹ÑiÐœiÐœ Ð°ÐœÑÒÑÐ°Ñ Ò¯ÑiÐœ  Ð±Ð°ÑÑÑÐŒÐ°ÐœÑ Ð±Ð°ÑÑÒ£ÑÐ·.  
+OAIDownload.get_doc_disp:ÒÒ±Ð¶Ð°ÑÑÑ Ð°Ð»Ñ  
+OAIDownload.get_doc:ÐÐ³ÐµÑ ÐŸÐ» Ð¶Ð°Ð·ÑÐ¿ ÐºÓ©ÑÑÐµÑiÐ»ÑÐµ, Ð±Ð°ÑÑÐ°Ð¿ÒÑ ÒÒ±Ð¶Ð°ÑÑÑ Ð¶Ò¯ÐºÑÐµÑ  
+OAIDownload.get_doc_exts_disp:Ð€Ð°Ð¹Ð»ÐŽÐ°ÑÐŽÑÒ£ ÑÐµÐº ÒÐ°ÐœÐ° ÑÒ¯ÑÐ»ÐµÑi ÒÐŸÑÐ°ÐŽÑ  
+OAIDownload.get_doc_exts:ÒÒ±Ð¶Ð°ÑÑÐ°ÑÐŽÑÒ£ Ð°Ð»ÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÑÐ°Ð¹Ð»ÐŽÐ°ÑÐŽÑÒ£ ÐŒÒ¯ÐŒÐºiÐœ ÐºÐµÒ£ÐµÐ¹ÑÑÐ»ÐµÑi  
+OAIDownload.max_records_disp:ÐÐ°Ð·ÑÐ»Ð°ÑÐŽÑ ÐŒÐ°ÐºÑÐžÐŒÑÐŒ  
+OAIDownload.max_records:ÐÒ¯ÐºÑÐµÑÐŽiÒ£ Ò¯ÑiÐœ Ð¶Ð°Ð·ÑÐ»Ð°ÑÑÐœ ÐŒÐ°ÐºÑÐžÐŒÑÐŒ  
+
+SRWDownload.desc:Ð ÐµÐ¿ÐŸÐ·ÐžÑÐŸÑÐžÐµÐ² SRWÑÐµÐœ Ð¶Ò¯ÐºÑÐµÑiÐœÐµ ÐŒÐŸÐŽÑÐ» (Search/Retrieve Web Service)  
+
+WebDownload.desc:HTTP ÐœÐµÐŒÐµÑÐµ FTP ÐžÐœÑÐµÑÐœÐµÑÑÐµÐœ Ð¶Ò¯ÐºÑÐµÑiÐœÐµ ÐŒÐŸÐŽÑÐ»  
+WebDownload.url:ÐÐ°ÑÑÐ°Ð¿ÒÑÑÑ URL. HttpÐŒÐµÐœ Ð¶Ð°ÒÐŽÐ°Ð¹ÐŽÐ° Ó©Ð·Ð³ÐµÑÐµ Ð°Ð»Ð°ÐŽÑ.  
+WebDownload.url_disp:ÐÐ°ÑÑÐ°Ð¿ÒÑÑÑ URL  
+WebDownload.depth:Ð¡iÐ»ÑÐµÐŒÐµÐ»ÐµÑÐŽiÒ£ ÑÐµÑÐµÒ£ÐŽÐµÐ»ÐµÑi ÐœÐµÑÐµ Ð¶Ò¯ÐºÑÐµÑÐŽiÒ£ Ð¶Ð°ÐœÑÐœÐŽÐ° Ð¶ÐžÐŽÑ  
+WebDownload.depth_disp:Ò®ÑÐ»ÐµÑÐŽi ÑÐµÑÐµÒ£ÐŽiÐº  
+WebDownload.below:ÐÒ±ÒÐ°Ðœ ÑÐµÐº ÒÐ°ÐœÐ° ÑÐ°Ð¹Ð»ÐŽÐ°Ñ URLÐ±ÐµÐ¹ÐœÐµÐ»ÐµÑ  
+WebDownload.below_disp:ÐÒ±Ð» URLÐ»Ð°ÑÐŒÐµÐœ ÑÐµÐº ÒÐ°ÐœÐ° ÑÐ°Ð¹Ð»ÐŽÐ°Ñ Ð±ÐµÐ¹ÐœÐµÐ»ÐµÑ  
+WebDownload.within:Ð¡Ð°Ð¹Ñ ÑÐŸÐ»ÐŽÐ°ÑÐŒÐµÐœ ÑÐ°Ð¹Ð»ÐŽÐ°Ñ ÑÐµÐº ÒÐ°ÐœÐ° Ð±ÐµÐ¹ÐœÐµÐ»ÐµÑ  
+WebDownload.within_disp:Ð€Ð°Ð¹Ð»ÐŽÐ°ÑÐŽÑÒ£ ÑÐ°Ð¹ÑÑÑÒ£ ÑÐŸÐ»ÐŽÐ°ÑÑÐŒÐµÐœ Ò¯ÑiÐœ ÑÐµÐº ÒÐ°ÐœÐ°  
+WebDownload.html_only:Ð¢ÐµÐº ÒÐ°ÐœÐ° HTMLÐ»Ð°ÑÐŽÑ Ð¶Ò¯ÐºÑÐµÐ»ÑiÐœ - ÑÑÑÐµÑ Ð¶ÓÐœÐµ ÑÑÐžÐ»ÑÐ»ÐµÑÐŽiÒ£ ÐºÐµÑÑÐµÑi ÑÐ°Ð¹Ð»ÐŽÐ°Ñ, ÑÐŸÐœÐŽÐ°Ð¹ ÐŸÐ»Ð°ÑÐŒÐµÐœ Ð°ÑÑÐŸÑÐžÐ°ÑÐžÑÐ»Ð°ÐœÒÐ°Ðœ ÑÐ°Ð¹Ð»ÐŽÐ°Ñ Ð¶ÓÐœÐµ Ð°ÑÒÒÐ° Ð±Ð°ÑÑ  
+WebDownload.html_only_disp:Ð¢ÐµÐº ÒÐ°ÐœÐ° HTMLÐ»Ð°ÑÐŽÑ Ð¶Ò¯ÐºÑÐµÐ»ÑiÐœ - ÑÐ°Ð¹Ð»ÐŽÐ°Ñ  
+
+WgetDownload.desc:Wget ÑÒ±ÑÐ°Ñ ÑÐ°Ð»ÑÐ»Ð°ÑÐŽÑ Ð¶Ò±ÐŒÑÑÑÐ°ÐœÐ°ÑÑÐœ ÐœÐµÐ³iÐ·Ð³i ÐºÐ»Ð°ÑÑ  
+WgetDownload.proxy_on:ÐÑÐŸÐºÑÐž ÒÐŸÑÑ  
+WgetDownload.proxy_host:ÐÑÑ Ñ
+ÐŸÑÑÐ° Ð¿ÑÐŸÐºÑÐž  
+WgetDownload.proxy_port:ÐÐŸÑÑ Ð¿ÑÐŸÐºÑÐž  
+WgetDownload.user_name:ÒÐŸÐ»ÐŽÐ°ÐœÑÑÑÐœÑÒ£ Ð°ÑÑ  
+WgetDownload.user_password:ÒÐŸÐ»ÐŽÐ°ÐœÑÑÑÐœÑÒ£ Ð¿Ð°ÑÐŸÐ»ÑÑi  
+
+Z3950Download.desc:Ð ÐµÐ¿ÐŸÐ·ÐžÑÐŸÑÐžÐµÐ² Z3950 Ð¶Ò¯ÐºÑÐµÑiÐœÐµ ÐŒÐŸÐŽÑÐ»  
+Z3950Download.host:URL Ñ
+ÐŸÑÑÐ°  
+Z3950Download.host_disp:Ð¥ÐŸÑÑ  
+Z3950Download.port:Ð ÐµÐ¿ÐŸÐ·ÐžÑÐŸÑÐžÑÐœÑÒ£ Ð¿ÐŸÑÑÑÐœÑÒ£ ÐœÓ©ÐŒiÑi  
+Z3950Download.port_disp:ÐÐŸÑÑ  
+Z3950Download.database:IÐ·ÐŽÐµÑÑiÑÑÐ³Ðµ ÐŽÐµÑÐµÐºÑÐµÑ ÒÐŸÑÑ  
+Z3950Download.database_disp:ÐÐµÑÐµÐºÑÐµÑ ÒÐŸÑÑ  
+Z3950Download.find:IÐ·ÐŽÐµÑÑiÑÑÐŽi ÐºÓ©ÑcÐµÑiÐ»Ð³ÐµÐœ Ð¶ÐŸÐ» Ð±ÐŸÐ»Ð°ÑÑÐœ Ð¶Ð°Ð·ÑÐ»Ð°ÑÐŽÑÒ£ ÐºÓ©ÑÑÐµÑÑ  
+Z3950Download.find_disp:Ð¢Ð°Ð±Ñ  
+Z3950Download.max_records:ÐÒ¯ÐºÑÐµÑÐŽiÒ£ Ò¯ÑiÐœ Ð¶Ð°Ð·ÑÐ»Ð°ÑÑÐœ ÐŒÐ°ÐºÑÐžÐŒÑÐŒ  
+Z3950Download.max_records_disp:ÐÐ°Ð·ÑÐ»Ð°ÑÐŽÑ ÐŒÐ°ÐºÑÐžÐŒÑÐŒ  
+
+
+#
+#Plugout option descriptions
+#
+
+BasPlugout.bad_general_option:%s ÐŒÐŸÐŽÑÐ» ÐŽÒ±ÑÑÑ ÐµÐŒÐµÑ ÐŸÐ¿ÑÐžÑÐœÑ ÒÐŸÐ»ÐŽÐ°ÐœÐ°ÐŽÑ.  
+BasPlugout.debug:ÒÐÐ¢ÐÐ»ÐµÑÐŽiÒ£ Ð°ÐœÑÒÑÐ°ÑÐŽÑ ÑÓÑÑiÐ±iÐœiÒ£ ÒÐŸÑÑ  
+BasPlugout.desc:ÐÐ°ÑÐ»ÑÒ ÐŒÐŸÐŽÑÐ»ÐŽÐ°Ñ Ò¯ÑiÐœ ÐœÐµÐ³iÐ·Ð³i ÐºÐ»Ð°ÑÑ.  
+BasPlugout.group_size:Ð¢ÐŸÐ¿ÑÐ°ÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÒÒ±Ð¶Ð°ÑÑÐ°Ñ Ð±iÑ XML ÐœÓ©ÐŒÐµÑÐ»ÐµÑiÐœ - ÑÐ°Ð¹Ð».  
+BasPlugout.gzip_output:ÒÐŸÑÑÑÑÐœÐŽÑ xmlÐŽÐ°ÑÐŽÑÒ£ ÒÑÑÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ gzipÐœi ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»ÑÑÐœ - (ÒÑÑÑÐ»ÒÐ°Ðœ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÑÐœÑÒ£ ÒÒ±ÑÐ°ÑÑÑÑÑÒÐ° Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ ÐÐ»Ð°Ð³ÐžÐœÐŽÐµÑÐŽiÒ£ Ó©Ð· ÑiÐ·iÐŒiÐœÐµ ZIPPlug ÒÐŸÑÑÒÐ° Ò±ÐŒÑÑÐ¿Ð°Ò£ÑÐ· ) ÒÒ±Ð¶Ð°ÑÑÐ°Ñ.  
+BasPlugout.output_handle:ÐŽÐµÐŒÐ°Ð»ÑÑ ÐŒÓÐ»iÐŒÐµÑiÐœiÒ£ Ð¶iÐ±ÐµÑÑ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÑÑÐœ ÑÐ°Ð¹Ð»ÐŽÑÒ ÐŽÐµÑÐºÑÐžÐ¿ÑÐŸÑ  
+BasPlugout.output_info:archinfoÐœiÒ£ Ð°ÑÑ
+ÐžÐ²ÑÐ°Ñ ÑÑÑÐ°Ð»Ñ Ð°ÒÐ¿Ð°ÑÐ°ÑÑÑ ÑÐ°ÒÑÐ°Ñ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÑÑÐœ ÐŸÐ±ÑÐµÐºÑiÐœÐµ ÑiÐ»ÑÐµÐŒÐµ.  
+BasPlugout.verbosity:ÒÐŸÑÑÑÑÐœÐŽÑÐœÑÒ£ ÑÐ°ÐœÑ ÑÐµÐºÑÐµÑÐµÐŽi. 0=Ð¶ÐŸÒ, 3=ÐµÒ£ Ò¯Ð»ÐºÐµÐœ.  
+BasPlugout.xslt_file:XSLT ÐºÓ©ÑcÐµÑiÐ»Ð³ÐµÐœ ÑÐ°Ð¹Ð»ÐŽÐ°ÒÑ ÐºÓ©ÐŒÐµÐ³iÐŒÐµÐœ ÒÒ±Ð¶Ð°ÑÑÑ Ð±Ð°ÑÒÐ° ÑÒ¯ÑÐ³Ðµ Ó©Ð·Ð³ÐµÑÑÑ.  
+
+DSpacePlugout.desc:ÐÑÑ
+ÐžÐ²ÑÑÒ£ ÒÐ°Ð»ÑÐ±Ñ DSpace.  
+
+FedoraMETSPlugout.desc:Fedora ÒÐ°Ð»ÑÐ±ÑÐœÑÒ£ ÒÐŸÐ»ÐŽÐ°ÐœÑÑÐœÐ° METS ÒÐ°Ð»ÑÐ¿.  
+FedoraMETSPlugout.fedora_namespace:Greenstone ÐŒÑÑÐ°Ð»Ñ (PIDS ) Ó©Ò£ÐŽÐµÑÐ³Ðµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ Ð€ÐµÐŽÐŸÑÐ»Ð°Ñ ÒÐŸÐ»ÐŽÐ°ÐœÑÒÐ° Ð¿ÑÐµÑÐžÐºÑi:HASH0122efe4a2c58d0  
+
+GreenstoneXMLPlugout.desc:ÐÑÐžÐœÑÑÐŸÑÐœÐœÑÒ£ XML Ð°ÑÑ
+ÐžÐ²ÑÐœÑÒ£ ÒÐ°Ð»ÑÐ±Ñ  
+
+GreenstoneMETSPlugout.desc:ÐÑÐžÐœÑÑÐŸÑÐœ ÒÐŸÐ»ÐŽÐ°ÐœÑÐ»Ð°ÑÑÐœ Ð¿ÑÐŸÑÐžÐ»ÑÐŽÐµÐ³i METSÑ ÒÐ°Ð»ÑÐ¿.  
+
+MARCXMLPlugout.desc:ÒÐ°Ð»ÑÐ¿ MARC XML  
+MARCXMLPlugout.group:ÐiÑ ÑÐ°Ð¹Ð»ÒÐ° marc xml Ð¶Ð°Ð·ÑÑÐœ ÑÑÒÐ°ÑÑ.  
+MARCXMLPlugout.mapping_file:ÓšÐ·Ð³ÐµÑÑÐ³Ðµ Ð°ÑÐœÐ°Ð»ÒÐ°Ðœ Ð±ÐµÐ¹ÐœÐµÐœiÒ£ ÐŽÐµÐ»Ð³ÐµÐœ ÑÐ°Ð¹Ð»ÑÐœ ÒÐŸÐ»ÐŽÐ°ÐœÑ.  
+
+METSPlugout.desc:METS - GreenstoneÐœÑÒ£ Ð¿ÑÐŸÑÐžÐ»Ñ ÒÐŸÐ»ÐŽÐ°ÐœÑÑÑ ÒÐ°Ð»ÑÐ¿.  
+METSPlugout.xslt_txt:ÐÓ©ÐŒÐµÐ³iÐŒÐµÐœ doctxt.xmlÐŽÑÒ£ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑiÐœiÒ£ XSLT ÐºÓ©ÑcÐµÑiÐ»Ð³ÐµÐœ ÑÐ°Ð¹Ð»ÑÐœÐŽÐ°ÒÑ ÑÐ°Ð¹Ð»ÐŽÑ Ð±Ð°ÑÒÐ° ÑÒ¯ÑÐ³Ðµ Ó©Ð·Ð³ÐµÑÑÑ.  
+METSPlugout.xslt_mets:ÐÓ©ÐŒÐµÐ³iÐŒÐµÐœ docmets.xmlÐŽÑÒ£ ÐŒÐµÑÐ°ÐŒÓÐ»iÐŒÐµÑÑÐµÑiÐœiÒ£ XSLT ÐºÓ©ÑcÐµÑiÐ»Ð³ÐµÐœ ÑÐ°Ð¹Ð»ÑÐœÐŽÐ°ÒÑ ÑÐ°Ð¹Ð»ÐŽÑ Ð±Ð°ÑÒÐ° ÑÒ¯ÑÐ³Ðµ Ó©Ð·Ð³ÐµÑÑÑ.  
+
+#
+# Perl module strings
+#
+
+classify.could_not_find_classifier:ÒÐÐ¢Ð : ÐÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÐŽÑ ÐŒÒ¯ÐŒÐºiÐœ ÐµÐŒÐµÑ ÑÐ°Ð±Ñ \"%s\"  
+
+download.could_not_find_download:ÒÐÐ¢Ð : ÐŒÐŸÐŽÑÐ»ÐŽÑ ÐŒÒ¯ÐŒÐºiÐœ ÐµÐŒÐµÑ Ð¶Ò¯ÐºÑÐµÑ \"%s\"  
+
+plugin.could_not_find_plugin:ÒÐÐ¢Ð : ÐÐ»Ð°Ð³ÐžÐœÐŽi ÐŒÒ¯ÐŒÐºiÐœ ÐµÐŒÐµÑ ÑÐ°Ð±Ñ \"%s\"  
+
+plugin.including_archive:ÐŒÐ°Ð·ÐŒÒ±ÐœÐœÑÒ£ ÒÐŸÑÑÐœÐŽÑÑÑ 1 Ð°ÑÑ
+ÐžÐ²Ð° ZIP/TAR.  
+
+plugin.including_archives:Ð°ÑÑ
+ÐžÐ²ÑÐ°ÑÐŽÑÒ£ ÐŒÐ°Ð·ÐŒÒ±ÐœÑÐœÑÒ£ ÒÐŸÑÑÐœÐŽÑÑÑ %d ZIP/TAR  
+
+plugin.kill_file:ÓšÒ£ÐŽÐµÑ ÑÐ°Ð¹Ð» Ð¶ÐŸÐ¹ÑÐ»ÒÐ°Ðœ .kill.  
+
+plugin.n_considered:%d Ó©Ò£ÐŽÐµÑ ÒÐŸÐ»Ð°Ð¹Ð»Ñ ÒÒ±Ð¶Ð°ÑÑÐ°Ñ  
+
+plugin.n_included:%d Ó©Ò£ÐŽÐµÐ»iÐ¿ Ð¶ÓÐœÐµ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐ»Ð°ÑÒÐ° ÒÐŸÑÑÐ»ÐŽÑ  
+
+plugin.n_rejected:%d ÒÐžÑÐ°Ð¹ÑÒÐ°Ðœ  
+
+plugin.n_unrecognised:%d ÐœÐµÑÐ°ÑÐ¿ÐŸÐ·ÐœÐ°ÐœÐŸ Ð±Ò±Ð» Ð¶ÐµÑÐŽÐµ  
+
+plugin.no_plugin_could_process:ÐÑÐºÐµÑÑÑ : ÐÑÒÐ°ÐœÐŽÐ°Ð¹ ÐŽÐ° ÐÐ»Ð°Ð³ÐžÐœÐŽÐµÑ Ó©Ò£ÐŽÐµÐ¹ Ð°Ð»ÐŒÐ°ÐŽÑ %s  
+
+plugin.no_plugin_could_recognise:Ð«ÒÑÐ»Ð°Ñ : ÐÐ»Ð°Ð³ÐžÐœi ÒÐ°Ð¹ Ð¶ÐŸÒ ÑÑÑÐ°ÐŒÑÑÐ°ÐŽÑ %s  
+
+plugin.no_plugin_could_process_this_file:ÐµÑÒÐ°ÐœÐŽÐ°Ð¹ ÐŽÐ° ÐÐ»Ð°Ð³ÐžÐœÐŽÐµÑ Ð±Ò±Ð» ÑÐ°Ð¹Ð» Ó©Ò£ÐŽÐµÐ¹ Ð°Ð»ÐŒÐ°ÐŽÑ  
+
+plugin.no_plugin_could_recognise_this_file:ÐÐ»Ð°Ð³ÐžÐœi ÒÐ°Ð¹ Ð¶ÐŸÒ Ð±Ò±Ð» ÑÐ°Ð¹Ð»ÐŽÑ ÑÑÑÐ°ÐŒÑÑÐ°ÐŽÑ  
+
+plugin.one_considered:1 ÒÒ±Ð¶Ð°Ñ Ó©Ò£ÐŽÐµÑÐ³Ðµ Ð°ÑÐœÐ°ÐŽÑ  
+
+plugin.one_included:1 Ó©Ò£ÐŽÐµÐ»iÐ¿ Ð¶ÓÐœÐµ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÒÐ° ÒÐŸÑÑÐ»ÐŽÑ  
+
+plugin.one_rejected:1 ÒÐžÑÐ°Ð¹ÑÒÐ°Ðœ  
+
+plugin.one_unrecognised:1 Ð°Ð¹ÑÑÑÐ¿ ÑÐ°ÐœÑÐŒÐ°ÐŽÑ  
+
+plugin.see_faillog:ÒÐ°ÑÐ°. %s ÒÐ°Ð±ÑÐ»ÐŽÐ°ÐœÐ±Ð°ÒÐ°Ðœ ÒÒ±Ð¶Ð°ÑÑÐ°ÑÐŽÑÒ£ Ð±ÐµÐ»Ð³iÑiÐ· Ðž/ÐžÐ»ÐžÐ»ÐµÑÐŽiÒ£ ÑiÐ·iÐŒiÐœÐµ  
+
+PrintUsage.default:Ò®ÐœÐŽÐµÐŒÐµÑ Ð±ÐŸÐ¹ÑÐœÑÐ°Ð»Ð°Ñ  
+
+PrintUsage.required:Ð¢ÐIÐ¡TIÐ¡  
+
+plugout.could_not_find_plugout:ÒÐÐ¢Ð : ÐŒÐŸÐŽÑÐ»ÐŽÑ ÐŒÒ¯ÐŒÐºiÐœ ÐµÐŒÐµÑ ÑÐ°Ð±Ñ \"%s\"
+  
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/strings_mr.properties
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/strings_mr.properties	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/strings_mr.properties	(revision 24799)
@@ -0,0 +1,1326 @@
+#
+# Resource bundle description
+#
+
+Language.code:mr
+Language.name:Marathi
+
+OutputEncoding.unix:utf-8
+OutputEncoding.windows:utf-8  
+
+
+#
+# Common output messages and strings
+#
+
+
+
+
+
+common.cannot_open:ERROR: Can't open %s  
+
+
+
+
+
+
+
+common.cannot_read_file:à€à¥à€à€ à€«à€Ÿà€à€² à€µà€Ÿà€à€€à€Ÿ à€¯à¥à€€ à€šà€Ÿà€¹à¥.  
+
+
+
+
+
+common.options:à€à€ªà¥à€¶à€š  
+
+
+
+
+
+common.usage:à€¯à¥à€à¥à€ž  
+
+
+
+common.invalid_options:Invalid arguments: %s  
+
+
+
+
+
+
+#
+# Script option descriptions and output messages
+#
+
+scripts.language:Language to display option descriptions in (eg. 'en_US' specifies American English). Requires translations of the option descriptions to exist in the perllib/strings_language-code.rb file.  
+
+scripts.xml:Produces the information in an XML form, without 'pretty' comments but with much more detail.  
+
+scripts.listall:à€®à€Ÿà€¹à€¿à€€à¥ à€
+à€žà€²à¥à€²à¥ à€žà€°à¥à€µ à€à€¯à€à€®à€à¥ à€¯à€Ÿà€Šà¥ à€à€°à€Ÿ  
+
+scripts.describeall:à€®à€Ÿà€¹à¥à€€à¥ à€
+à€žà€£à€Ÿà€°à¥à€¯à€Ÿ à€à€à€à€Ÿà€à€à¥ à€à€ªà¥à€¶à€š à€Šà€Ÿà€à€µà€Ÿ  
+
+scripts.both_old_options:WARNING: -removeold was specified with -keepold or -incremental, defaulting to -removeold. Current contents of %s directory will be deleted.  
+
+scripts.no_old_options:WARNING: None of -removeold, -keepold or -incremental were specified, defaulting to -removeold. Current contents of %s directory will be deleted.  
+
+
+
+# -- buildcol.pl --
+
+
+
+
+
+buildcol.cachedir:à€šà€¿à€°à¥à€Šà¥à€¶à€¿à€à€Ÿ à€€à€¯à€Ÿà€° à€¹à¥à€£à¥à€¯à€Ÿà€ªà¥à€°à¥à€µà¥ à€€à€Ÿà€€à¥à€ªà¥à€°à€€à€Ÿ à€žà€à€à¥à€°à€¹ à€€à€¯à€Ÿà€° à€¹à¥à€€ à€à€¹à¥.  
+
+buildcol.cannot_open_cfg_file:à€žà¥à€à€šà€Ÿà€ à€
+à€Šà¥à€¯à€¯à€Ÿà€µà€€ à€à€°à€£à¥à€¯à€Ÿà€žà€Ÿà€ à¥ à€à¥à€šà¥à€«à€¿à€ à€«à€Ÿà€à€² à€à€à€¡à€€ à€šà€Ÿà€¹à¥à€€à€ %s  
+
+
+
+
+
+buildcol.create_images:Attempt to create default images for new collection. This relies on the Gimp being installed along with relevant perl modules to allow scripting from perl.  
+
+buildcol.debug:Print output to STDOUT.  
+
+
+
+buildcol.faillog:Fail log filename. This log receives the filenames of any files which fail to be processed.  
+
+
+
+buildcol.index:à€šà€¿à€°à¥à€Šà¥à€¶ à€€à€¯à€Ÿà€° à€¹à¥à€€ à€à€¹à¥ (à€à¥à€šà¥à€«à€¿à€à€° à€«à€Ÿà€à€² à€€à€¯à€Ÿà€° à€¹à¥à€€ à€à€¹à¥ )  
+
+
+
+buildcol.keepold:à€€à€¯à€Ÿà€° à€¹à¥à€€ à€
+à€žà€²à¥à€²à¥à€¯à€Ÿ à€žà€§à¥à€¯à€Ÿà€à¥à€¯à€Ÿ à€šà€¿à€°à¥à€Šà€¶à¥à€à€Ÿ à€
+à€šà¥à€à¥à€°à€® à€¬à€Šà€²à€Ÿà€° à€šà€Ÿà€¹à¥
+
+
+
+
+buildcol.mode.all:à€žà€°à¥à€µ à€à€°à€Ÿ.  
+
+buildcol.mode.compress_text:Just compress the text.  
+buildcol.mode.infodb:à€®à¥à€à¥à€¡à¥à€à€Ÿà€à€Ÿ à€¡à¥à€à€Ÿà€¬à€Ÿà€ž à€€à€¯à€Ÿà€° à€à€°à€Ÿ.  
+
+
+
+
+
+
+
+buildcol.no_text:Don't store compressed text. This option is useful for minimizing the size of the built indexes if you intend always to display the original documents at run time (i.e. you won't be able to retrieve the compressed text version).  
+
+
+
+buildcol.sections_index_document_metadata.always:Add all specified document level metadata even if section level metadata of that name exists.  
+buildcol.sections_index_document_metadata.unless_section_metadata_exists:Only add document level metadata if no section level metadata of that name exists.  
+
+buildcol.out:Filename or handle to print output status to.  
+
+buildcol.params:(à€à€ªà¥à€¶à€š) à€žà€à€à¥à€°à€¹ - à€šà€Ÿà€µ  
+
+buildcol.remove_empty_classifications:à€°à€¿à€à€Ÿà€®à¥ à€à¥à€²à€Ÿà€žà€¿à€«à€Ÿà€¯à€° à€à€£à€¿ à€à¥à€²à€Ÿà€žà€¿à€«à€¿à€à¥à€¶à€š à€šà¥à€¡ à€²à€ªà€µà€Ÿ ( à€¯à€Ÿ à€®à€§à¥à€¯à¥ à€à€Ÿà€¹à¥à€¹à¥ à€ªà¥à€°à€²à¥à€ à€šà€Ÿà€¹à¥à€€).  
+
+
+
+buildcol.unlinked_col_images:à€à€¿à€€à¥à€° à€žà€à€à¥à€°à€¹à€Ÿà€à¥ à€²à€¿à€à€ à€à¥à€¡à€²à¥ à€à¥à€²à¥ à€šà€Ÿà€¹à¥  
+
+
+
+
+
+
+
+
+# -- classinfo.pl --
+
+
+
+
+
+classinfo.general_options:General options are inherited from parent classes of the classifier.  
+
+
+
+
+
+
+
+
+
+
+
+
+
+# -- downloadfrom.pl --
+downloadfrom.cache_dir:The location of the cache directory  
+
+
+
+
+
+
+
+downloadfrom.incorrect_mode:à€¡à€Ÿà€à€šà€²à¥à€¡ à€®à¥à€¡ à€
+à€¯à¥à€à¥à€¯.  
+
+
+
+# -- downloadinfo.pl --
+
+downloadinfo.desc:à€¡à€Ÿà€à€šà€²à¥à€¡ à€à¥à€²à¥à€²à¥ à€®à€Ÿà€¹à€¿à€€à¥à€à¥ à€ªà¥à€°à€€  
+downloadinfo.collection:Giving a collection name will make downloadinfo.pl look in collect/collection-name/perllib/downloaders first. If the module is not found there it will look in the general perllib/downloaders directory.  
+
+
+
+
+
+# -- explode_metadata_database.pl --
+
+
+
+ 
+explode.document_field:The metadata element specifying the file name of documents to obtain and include in the collection.  
+
+
+
+
+
+explode.encoding:à€¡à¥à€à€Ÿà€¬à¥à€ž à€«à€Ÿà€à€² à€µà€Ÿà€à€€ à€
+à€žà€€à€Ÿà€šà€Ÿ à€à€šà€à¥à€¡à¥à€à€à€à€Ÿ à€µà€Ÿà€ªà€° à€à€°à€Ÿ.  
+
+explode.plugin:Plugin to use for exploding  
+
+
+
+
+# -- replace_srcdoc_with_html.pl --
+
+
+
+
+# -- exportcol.pl --
+
+exportcol.out:Filename or handle to print output status to.  
+
+
+
+
+
+exportcol.coll_not_found:Ignoring invalid collection %s: collection not found at %s.  
+
+exportcol.fail:exportcol.pl failed:  
+
+exportcol.couldnt_create_dir:à€šà€¿à€°à¥à€Šà¥à€¶à€¿à€à€Ÿ à€€à€¯à€Ÿà€° à€à€°à€€à€Ÿ à€¯à¥à€£à€Ÿà€° à€šà€Ÿà€¹à¥ %s.  
+
+
+
+
+
+exportcol.export_coll_not_installed:The Export to CD-ROM functionality has not been installed.  
+
+# -- import.pl --
+
+import.archivedir:Where the converted material ends up.  
+
+import.manifest:An XML file that details what files are to be imported. Used instead of recursively descending the import folder, typically for incremental building.  
+
+
+
+
+
+
+
+import.collectdir:"à€žà€à€à¥à€°à€¹" à€šà€¿à€°à¥à€Šà¥à€¶à€š à€®à€Ÿà€°à¥à€  
+
+
+
+
+
+import.desc:PERL script used to import files into a GA format ready for building.  
+
+
+
+import.groupsize:à€à€à€Ÿ à€à€à¥à€žà€à€®à€à€² à€«à€Ÿà€à€² à€®à€§à¥à€¯à¥ à€à€®à¥à€ªà¥à€°à¥à€ à€à¥à€²à¥à€²à¥ à€ªà¥à€°à€²à¥à€  
+
+import.gzip:Use gzip to compress resulting xml documents (don't forget to include ZIPPlug in your plugin list when building from compressed documents).  
+
+
+
+
+
+
+
+
+
+import.no_import_dir:à€à¥à€à€ à€à€à€®à¥à€ªà¥à€°à¥à€ à€à¥à€²à¥à€²à¥ à€šà€¿à€°à¥à€Šà¥à€¶à€¿à€à€Ÿ à€®à€¿à€³à€€ à€šà€Ÿà€¹à¥.  
+
+
+
+import.OIDtype:à€ªà¥à€°à€€à¥à€¯à¥à€ à€ªà¥à€°à€²à¥à€à€Ÿà€žà€Ÿà€ à¥ à€
+à€Šà¥à€µà€¿à€€à¥à€¯ à€à¥à€¡ à€€à€¯à€Ÿà€° à€à€°à€£à¥à€¯à€Ÿà€à¥ à€ªà€§à¥à€Šà€€.  
+
+
+
+
+
+
+import.OIDtype.dirname:à€ªà¥
+à€°à¥à€à€ à€¡à€¿à€°à¥à€à¥à€à€°à¥à€à¥à€¯à€Ÿ à€šà€Ÿà€µà€Ÿà€à€Ÿ à€à€ªà€¯à¥à€ à€à€°à€Ÿ (preceded by 'J').à€ªà¥à€°à€€à¥à€¯à¥à€ à€¡à€¿à€°à¥à€à¥à€à€°à¥ à€®à€§à¥à€¯à¥ à€à€à€ à€ªà¥à€°à€²à¥à€ à€
+à€žà€Ÿà€µà€Ÿ, à€à€£à€¿ à€¡à€¿à€°à¥à€à¥à€à€°à¥ à€šà€Ÿà€µ à€¹à¥ à€
+à€Šà¥à€µà€¿à€€à¥à€¯ à€
+à€žà€Ÿà€µà¥.E.g. import/b13as/h15ef/page.html will get an identifier of Jh15ef.  
+
+
+
+
+
+import.out:Filename or handle to print output status to.
+
+import.params:[options] collection-name  
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+import.stats_backup:Will print stats to STDERR instead.  
+
+import.verbosity:Controls the quantity of output. 0=none, 3=lots.  
+
+# -- schedule.pl --
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# -- export.pl --
+
+export.exportdir:Where the export material ends up.  
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+export.keepold:Will not destroy the current contents of the export directory.  
+
+export.maxdocs:à€à€Ÿà€žà¥à€€à¥à€€ à€à€Ÿà€žà¥à€€ à€ªà¥à€°à€²à¥à€ à€ªà€Ÿà€ à€µà€¿à€²à¥.
+
+
+
+
+
+export.saveas.DSpace:à€¡à€¿à€žà¥à€ªà¥à€ž à€Šà€«à¥à€€à€°à€à€Ÿà€šà¥à€¯à€Ÿà€à¥ à€°à¥à€ªà€°à¥à€·à€Ÿ  
+
+
+
+
+
+
+
+
+export.out:Filename or handle to print output status to.  
+
+export.params:(à€à€ªà¥à€¶à€š) à€žà€à€à¥à€°à€¹- à€šà€Ÿà€µ à¥§, à€žà€à€à¥à€°à€¹- à€šà€Ÿà€µ à¥š...  
+
+
+
+export.removing_export:à€ªà€Ÿà€ à€µà€¿à€€ à€
+à€žà€²à¥à€²à¥à€¯à€Ÿ à€šà€¿à€°à¥à€Šà¥à€¶à€¿à€à¥à€€à¥à€² à€à€à€ à€à€Ÿà€¢à¥à€š à€à€Ÿà€à€Ÿ..........  
+
+
+
+export.statsfile:Filename or handle to print export statistics to.  
+
+
+
+
+
+
+
+# -- mkcol.pl --
+
+mkcol.about:The about text for the collection.  
+
+
+
+
+
+
+
+mkcol.cannot_find_modelcol:ERROR: Cannot find the model collection %s  
+
+
+
+
+
+
+
+
+
+mkcol.creator_undefined:à€à¥à€à€ à€žà€à€à¥à€°à€¹à€ à€šà€¿à€¶à¥à€à€¿à€€ à€à¥à€²à¥à€²à€Ÿ à€šà€Ÿà€¹à¥.This variable is needed to recognise duplicate collection names.  
+
+
+
+mkcol.doing_replacements:doing replacements for %s  
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+mkcol.public:If this collection has anonymous access.  
+
+
+
+
+
+
+
+mkcol.success:%s à€šà€µà€¿à€š à€žà€à€à¥à€°à€¹ à€€à€¯à€Ÿà€° à€à€Ÿà€²à€Ÿ  
+
+
+
+
+mkcol.win31compat.true:à€šà€¿à€°à¥à€Šà¥à€¶à€¿à€à¥à€à¥ à€šà€Ÿà€µ à¥® à€à€¿à€à€µà€Ÿ à€€à¥à€¯à€Ÿà€ªà¥à€à¥à€·à€Ÿ à€à€®à¥ à€
+à€à¥à€·à€°à€Ÿà€à€à¥ à€
+à€žà€Ÿà€µà¥.  
+
+
+# -- pluginfo.pl --
+
+
+
+
+
+
+
+
+
+pluginfo.no_plugin_name:à€à¥à€à€ à€€à¥à€®à¥à€¹à¥ à€ªà¥à€²à€à€à€šà€à¥ à€šà€Ÿà€µ à€Šà¥à€£à¥ à€à€µà€¶à¥à€¯à€ à€à€¹à¥.  
+
+pluginfo.option_types:à€ªà¥à€²à€à€à€š à€®à€§à¥à€¯à¥ à€Šà¥à€š à€ªà¥à€°à€à€Ÿà€°à€à¥ à€à€ªà¥à€¶à€š à€à¥à€ à€¶à€à€€à¥.  
+
+
+
+
+
+pluginfo.specific_options:Specific options are defined within the plugin itself, and are available only to this particular plugin.  
+
+
+# -- plugoutinfo.pl --
+
+
+
+plugoutinfo.desc:à€ªà¥à€²à€à€à€à€ à€µà€¿à€·à€¯à¥ à€®à€Ÿà€¹à€¿à€€à¥ à€²à€¿à€¹à€Ÿ.  
+
+plugoutinfo.general_options:General options are inherited from parent classes of the plugout.  
+
+
+
+plugoutinfo.no_plugout_name:à€à¥à€à€ à€€à¥à€®à¥à€¹à¥ à€ªà¥à€²à€à€à€à€à€à¥ à€šà€Ÿà€µ à€Šà¥à€£à¥ à€à€µà€¶à¥à€¯à€ à€à€¹à¥.  
+
+plugoutinfo.option_types:à€ªà¥à€²à€à€à€à€à€žà¥ à€Šà¥à€š à€à€ªà¥à€¶à€š à€à¥à€ à€¶à€à€€à€Ÿà€€.  
+
+plugoutinfo.params:[options] plugout-name  
+
+
+
+
+
+
+
+#
+# Classifier option descriptions
+#
+
+AllList.desc:à€žà€°à¥à€µ à€ªà¥à€°à€²à¥à€à€Ÿà€à€à¥ à€à€à€ à€¯à€Ÿà€Šà¥ à€à€°à€Ÿ.  
+
+AZCompactList.allvalues:à€®à¥à€à€Ÿà€¡à¥à€à€Ÿ à€µà¥à€¹à€Œà¥
+à€²à¥à€¯à¥ à€µà€Ÿà€ªà€°à€Ÿ.  
+
+AZCompactList.desc:Classifier plugin for sorting alphabetically (on a-zA-Z0-9). Produces a horizontal A-Z list, then a vertical list containing documents, or bookshelves for documents with common metadata.  
+
+AZCompactList.doclevel:à€ªà¥à€°à€²à¥à€ à€ªà¥à€°à€à¥à€°à€¿à€¯à¥à€à€Ÿ à€žà¥à€€à€°.  
+
+
+
+
+
+
+
+AZCompactList.maxcompact:à€ªà¥à€°à€€à¥à€¯à¥à€ à€ªà€Ÿà€šà€Ÿà€µà€° à€à€Ÿà€žà¥à€€à¥à€€ à€à€Ÿà€žà¥à€€ à€ªà¥à€°à€²à¥à€ à€Šà€¿à€žà€€à¥à€².  
+
+AZCompactList.metadata:A single Metadata field, or a comma separated list of Metadata fields, used for classification. If a list is specified, the first metadata type that has values will be used. May be used in conjunction with the -firstvalueonly and -allvalues flags, to select only the first value, or all metadata values from the list.  
+
+AZCompactList.mincompact:à€ªà¥à€°à€€à¥à€¯à¥à€ à€ªà€Ÿà€šà€Ÿà€µà€° à€à€®à¥à€€ à€à€®à¥ à€ªà¥à€°à€²à¥à€ à€Šà€Ÿà€à€µà€Ÿ.  
+
+AZCompactList.mingroup:The smallest value that will cause a group in the hierarchy to form.  
+
+
+
+AZCompactList.recopt:Used in nested metadata such as -metadata Year/Organisation.  
+AZCompactList.sort:à€²à€¿à€« à€šà¥à€¡à€šà¥ à€®à¥à€à€Ÿà€¡à¥à€à€Ÿà€à¥ à€µà€¿à€­à€Ÿà€ à€à¥à€²à¥ à€à€¹à¥à€€.
+
+
+
+
+
+AZList.metadata:à€à¥à€²à€Ÿà€žà€¿à€«à€¿à€à¥à€¶à€šà€žà€Ÿà€ à¥ à€µà€Ÿà€ªà€°à€€ à€
+à€žà€²à¥à€²à€Ÿ à¥§ à€®à¥à€à€Ÿà€¡à¥à€à€Ÿ à€«à€¿à€²à¥à€¡, à€®à¥à€à€¡à¥à€à€Ÿà€à¥ à€¯à€Ÿà€Šà¥ à€žà¥à€µà€²à¥à€ªà€µà€¿à€°à€Ÿà€®à€šà¥ à€µà€¿à€­à€Ÿà€à€€à€Ÿ à€¯à¥à€€à¥.
+
+
+
+
+
+
+
+BasClas.buttonname:The label for the classifier screen and button in navigation bar. The default is the metadata element specified with -metadata.  
+
+BasClas.desc:Base class for all the classifiers.  
+
+
+
+
+
+
+
+
+
+
+
+Browse.desc:A fake classifier that provides a link in the navigation bar to a prototype combined browsing and searching page. Only works for mgpp collections, and is only practical for small collections.  
+
+
+
+DateList.desc:à€à¥à€²à€Ÿà€žà¥à€«à€Ÿà€¯à€° à€ªà¥à€²à€à€à€šà€šà¥à€žà€Ÿà€° à€®à€Ÿà€¹à¥à€€à¥ à€¹à¥ à€Šà€¿à€šà€Ÿà€à€à€Ÿà€šà¥à€žà€Ÿà€° à€µà€¿à€­à€Ÿà€à€²à¥ à€à€¹à¥.à€Šà€¿à€šà€Ÿà€à€ à€µà€°à¥à€·à€®à€¹à€¿à€šà€Ÿà€Šà€¿à€šà€Ÿà€à€ à€à€¿à€à€µà€Ÿ à€µà€°à¥à€·-à€®à€¹à€¿à€šà€Ÿ-à€Šà€¿à€šà€Ÿà€à€ à€¯à€Ÿ à€ªà¥à€°à€à€Ÿà€°à¥  
+
+DateList.metadata:à€®à¥à€à€Ÿà€¡à€Ÿà€à€Ÿ à€à¥à€²à€Ÿà€žà¥à€«à€Ÿà€¯à€° à€ªà¥à€²à€à€à€šà€šà¥à€žà€Ÿà€° à€
+à€žà¥à€š à€€à¥ à€®à€Ÿà€¹à¥à€€à¥ à€¹à¥ à€Šà€¿à€šà€Ÿà€à€à€Ÿà€šà¥à€žà€Ÿà€° à€µà€¿à€­à€Ÿà€à€²à¥ à€à€¹à¥.à€Šà€¿à€šà€Ÿà€à€ à€µà€°à¥à€·à€®à€¹à€¿à€šà€Ÿà€Šà€¿à€šà€Ÿà€à€ à€à€¿à€à€µà€Ÿ à€µà€°à¥à€·-à€®à€¹à€¿à€šà€Ÿ-à€Šà€¿à€šà€Ÿà€à€ à€¯à€Ÿ à€ªà¥à€°à€à€Ÿà€°à¥  
+
+
+
+
+
+DateList.no_special_formatting:à€Šà€žà¥à€€à€à€µà€à€Ÿà€à¥à€¯à€Ÿ à€¯à€Ÿà€Šà¥à€®à€§à¥à€¯à¥ à€µà€°à¥à€· à€µ à€®à€¹à€¿à€šà€Ÿ à€¯à€Ÿ à€¬à€Šà¥à€Šà€² à€®à€Ÿà€¹à€¿à€€à¥ à€Šà€°à¥à€¶à€µà¥ à€šà€à€Ÿ.  
+
+
+
+List.always_bookshelf_last_level:leaf nodes à€à¥à€¯à€Ÿ à€¯à¥à€¥à¥ à€à€°à¥ à€à€à€Ÿ à€à€à€Ÿà€€ à€à€ à€à€à€ à€
+à€žà€²à€Ÿ à€€à€°à¥ à€à¥à€°à€à€¥à€Ÿà€à¥ à€à€¿à€šà¥à€¹ à€€à€¯à€Ÿà€° à€à€°à€Ÿ  
+
+
+
+
+
+List.partition_type_within_level:The type of partitioning done: either 'per_letter', 'constant_size', or 'none'.  
+
+List.sort_leaf_nodes_using:Metadata fields used for sorting the leaf nodes. Use '|' to separate the metadata groups to stable sort and ';' to separate metadata fields within each group.  
+
+List.use_hlist_for:Metadata fields to use a hlist rather than a vlist. Use ',' to separate the metadata groups and ';' to separate the metadata fields within each group.  
+
+HFileHierarchy.desc:Classifier plugin for generating hierarchical classifications based on a supplementary structure file.  
+
+
+
+Hierarchy.documents_last:à€à¥à€²à€Ÿà€žà€¿à€«à€Ÿà€à€¡ à€šà¥à€¡ à€šà€à€€à€° à€Šà€žà¥à€€à€à€µà€ à€šà¥à€¡ à€Šà€Ÿà€à€µà€Ÿ.  
+
+
+
+
+
+
+
+
+
+Hierarchy.sort:à€®à¥à€à€Ÿà€¡à¥à€à€Ÿ Metadata field to sort leaf nodes by. Leaves will not be sorted if not specified.  
+
+Hierarchy.suppressfirstlevel:Ignore the first part of the metadata value. This is useful for metadata where the first element is common, such as the import directory in gsdlsourcefilename.  
+
+Hierarchy.suppresslastlevel:Ignore the final part of the metadata value. This is useful for metadata where each value is unique, such as file paths.  
+
+HTML.desc:Creates an empty classification that's simply a link to a web page.  
+
+
+
+
+
+
+
+
+
+
+
+Phind.language:Language or languages to use building hierarchy. Languages are identified by two-letter country codes like en (English), es (Spanish), and fr (French). Language is a regular expression, so 'en|fr' (English or French) and '..' (match any language) are valid.  
+
+Phind.min_occurs:The minimum number of times a phrase must appear in the text to be included in the phrase hierarchy.  
+
+
+
+
+
+
+
+
+
+
+
+Phind.untidy:à€µà€°à¥à€à€«à€Ÿà€à€² à€à€Ÿà€¢à¥ à€šà€à€Ÿ.  
+
+
+
+
+
+
+
+RecentDocumentsList.sort:Metadata to sort List by. If not specified, list will be sorted by date of modification/addition.  
+
+
+
+
+
+
+
+Collage.maxDepth:Images for collaging are drawn from mirroring the underlying browse classifier. This controls the maximum depth of the mirroring process.  
+
+Collage.maxDisplay:à€à€Ÿà€žà¥à€€à¥à€€à€à€Ÿà€žà¥à€€ à€à€¿à€€à¥à€° à€žà€à€à¥à€°à€¹à€Ÿà€€ à€Šà€¿à€žà€Ÿà€µà€¯à€Ÿà€ž à€¹à€µà¥.  
+
+
+
+Collage.bgcolor:The background color of the collage canvas, specified in hexadecimal form (for example #008000 results in a forest green background).  
+
+
+
+
+
+Collage.isJava2:Used to control which run-time classes of Java are used. More advanced version of Java (i.e. Java 1.2 onwards) include more sophisticated support for controlling transparency in images, this flag helps control what happens, however the built-in Java runtime for some browsers is version 1.1.  The applet is designed to, by default, auto-detect which version of Java the browser is running and act accordingly.  
+
+Collage.imageMustNotHave:Used to suppress images that should not appear in the collage, such as image buttons that make up the navigation bar.  
+
+
+
+
+#
+# Plugin option descriptions
+#
+AcronymExtractor.adding:à€­à€°à€Ÿ  
+
+
+
+
+
+AcronymExtractor.done_acronym_extract:à€žà€à€à¥à€·à€¿à€ªà¥à€€ à€šà€Ÿà€µà¥  
+
+AcronymExtractor.done_acronym_markup:à€žà€à€à¥à€·à€¿à€ªà¥à€€ à€šà€Ÿà€µ  
+
+
+
+
+
+
+
+
+
+ArchivesInfPlugin.desc:Plugin which recurses through an archives.inf file (i.e. the file generated in the archives directory when an import is done), processing each file it finds.  
+
+
+
+
+
+
+
+
+
+
+
+
+
+BasePlugin.block_exp:Files matching this regular expression will be blocked from being passed to any later plugins in the list. This has no real effect other than to prevent lots of warning messages about input files you don't care about. Each plugin might have a default block_exp. e.g. by default HTMLPlug blocks any files with .gif, .jpg, .jpeg, .png or .css file extensions.  
+
+
+
+BasePlugin.dummy_text:à€¯à€Ÿ à€Šà€žà¥à€€à€à€µà€à€Ÿà€€ à€®à€Ÿà€¹à€¿à€€à¥ à€šà€Ÿà€¹à¥.  
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+BasePlugin.smart_block:Block files in a smarter way than just looking at filenames.  
+
+BasePlugin.stems:stems  
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ConvertBinaryFile.apply_fribidi:Run the "fribidi" Unicode Bidirectional Algorithm program over the converted file (for right-to-left text).  
+
+
+
+ConvertBinaryFile.convert_to.auto:Automatically select the format converted too.  Format chosen depends on input document type, for example Word will automatically be converted to HTML, whereas PowerPoint will be converted to Greenstone's PagedImage format.  
+
+ConvertBinaryFile.convert_to.html:à€à€à€à¥à€à€®à€à€² à€«à¥à€°à€®à¥
+à€.  
+
+
+
+
+
+ConvertBinaryFile.convert_to.pagedimg_jpg:à€à¥à€ªà¥à€à€à¥ à€°à¥à€ªà€°à¥à€·à€Ÿ  
+
+
+
+
+
+ConvertBinaryFile.desc:This plugin is inherited by such plugins as WordPlug, PPTPlug, PSPlug, RTFPlug and PDFPlug. It facilitates the conversion of these document types to either HTML, TEXT or a series of images. It works by dynamically loading an appropriate secondary plugin (HTMLPlug, StructuredHTMLPlug, PagedImgPlug or TEXTPlug) based on the plugin argument 'convert_to'.  
+
+
+
+
+
+
+
+CSVPlugin.desc:A plugin for files in comma-separated value format. A new document will be created for each line of the file.  
+
+
+
+
+
+DateExtractor.maximum_century:The maximum named century to be extracted as historical metadata (e.g. 14 will extract all references up to the 14th century).  
+
+
+
+
+
+
+
+DirectoryPlugin.recheck_directories:After the files in an import directory have been processed, re-read the directory to discover any new files created.  
+
+
+
+DatabasePlugin.desc:A plugin that imports records from a database. This uses perl's DBI module, which includes back-ends for mysql, postgresql, comma separated values (CSV), MS Excel, ODBC, sybase, etc... Extra modules may need to be installed to use this. See <GSDLHOME>/etc/packages/example.dbi for an example config file.  
+
+DSpacePlugin.desc:DSpacePlug takes a collection of documents exported from DSpace and imports them into Greenstone.  
+	
+
+
+
+
+DSpacePlugin.only_first_doc:This is used to identify the primary data stream of DSpace collection document.With this option, the system will treat the first document in dublic_core metadata file as the possible primary stream.  
+
+
+
+
+
+EmailAddressExtractor.extracting_emails:extracting e-mail addresses  
+
+
+
+
+
+EmailPlugin.no_attachments:à€à¥à€¡à€²à¥à€²à€Ÿ à€®à¥à€žà¥à€ à€žà¥à€µà¥à€¹ à€à€°à¥ à€šà€à€Ÿ.  
+
+
+
+
+
+EmailPlugin.split_exp:A perl regular expression used to split files containing many messages into individual documents.  
+
+ExcelPlugin.desc:à€®à€Ÿà€¯à€à¥à€°à¥à€žà¥à€ªà¥à€ à€à€à¥à€žà¥à€² à€«à€Ÿà€à€² à€®à€¿à€³à€µà€¿à€£à¥à€¯à€Ÿà€žà€Ÿà€ à¥ (à€°à¥à€µà¥à€¹à€à€š à¥¯à¥« à€à€£à€¿ à¥¯à¥­ )à€ªà¥à€²à€à€à€š  
+
+
+
+
+
+
+
+
+
+
+
+GISExtractor.gazetteer:Gazetteer to use to extract placenames from within text and set as metadata. Requires GIS extension to Greenstone.  
+
+GISExtractor.place_list:When extracting placements, include list of placenames at start of the document. Requires GIS extension to Greenstone.  
+
+
+
+
+
+HTMLImagePlugin.aggressiveness:Range of related text extraction techniques to use.  
+HTMLImagePlugin.aggressiveness.1:Filename, path, ALT text only.  
+HTMLImagePlugin.aggressiveness.2:à€žà€°à¥à€µà€Ÿà€à€à¥ à¥§, à€ªà¥à€²à€ž à€à¥
+à€ªà¥à€¶à€š à€à¥à€¥à¥ à€®à€¿à€³à¥à€².  
+HTMLImagePlugin.aggressiveness.3:à€žà€°à¥à€µà€Ÿà€à€à¥ à€Šà¥à€š, à€ªà¥à€²à€ž à€à¥à€¥à¥ à€ªà€°à€¿à€à¥à€à¥à€Š à€à€ªà€²à€¬à¥à€§  
+HTMLImagePlugin.aggressiveness.4:à¥© à€žà€°à¥à€µ, à€à€£à€¿ à€à€§à¥à€à¥ à€¹à¥à€¡à€° (<h1>, <h2>...) à€à¥à€¥à¥ à€à€ªà€²à€¬à¥à€§ à€
+à€žà¥à€².  
+HTMLImagePlugin.aggressiveness.5:à¥ª à€žà€°à¥à€µ, à€à€£à€¿ à€à€ªà€²à€¬à¥à€§ à€
+à€žà€²à¥à€²à€Ÿ à€¶à€Ÿà€¬à¥à€Šà€¿à€ à€žà€à€°à¥à€Šà€­ .  
+HTMLImagePlugin.aggressiveness.6:à¥ª à€žà€°à¥à€µ, à€à€£à€¿ à€®à¥à€à€Ÿà€à¥
+à€à€à¥ à€ªà€Ÿà€š (à€¶à€¿à€°à¥à€·à€, à€ªà¥à€°à€®à¥à€à€¶à€¬à¥à€Š,à€à€€à¥à€¯à€Ÿà€Šà¥).  
+HTMLImagePlugin.aggressiveness.7:à¥¬ à€à¥ à€žà€°à¥à€µ, à¥«à€µà¥ª à€à€à€€à¥à€°.  
+HTMLImagePlugin.aggressiveness.8:à¥­ à€à¥ à€žà€°à¥à€µ, à€à€£à€¿ à€°à€¿à€ªà¥à€ à€à¥
+à€ªà¥à€¶à€š, à€«à€Ÿà€à€²à€šà€Ÿà€µ, à€à€€à¥à€¯à€Ÿà€Šà¥ (raise ranking of more relevant results)  
+HTMLImagePlugin.aggressiveness.9:à¥§ à€à¥ à€žà€°à¥à€µ, à€à€£à€¿ à€ªà¥à€°à¥à€£ à€à¥à€à¥à€žà€à¥ à€ªà€Ÿà€š.  
+
+
+
+HTMLImagePlugin.convert_params:Additional parameters for ImageMagicK convert on thumbnail creation. For example, '-raise' will give a three dimensional effect to thumbnail images.  
+
+HTMLImagePlugin.desc:A plugin for extracting images and associated text from webpages.  
+
+
+
+
+
+HTMLImagePlugin.max_near_text:Maximum characters near images to extract.  
+
+
+
+
+
+
+
+
+
+
+
+HTMLImagePlugin.no_cache_images:cache images à€à¥à€ à€šà€à€Ÿ (à€®à¥à€³ à€¯à¥à€à€°à€à€² à€ªà€¹à€Ÿ)  
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+HTMLPlugin.hunt_creator_metadata:à€à¥à€°à€à€¥à€à€Ÿà€° à€¯à¥à€¥à¥à€š à€®à€Ÿà€¹à€¿à€€à¥ à€¶à¥à€§à¥à€š à€€à¥ à€žà€à€à¥à€°à€¹à€ à€¯à¥à€¥à¥ à€ à¥à€µà€Ÿ.  
+
+HTMLPlugin.keep_head:à€à€à€à¥à€à€®à€à€² à€«à€Ÿà€à€² à€®à€§à¥à€š à€¹à¥à€¡à€° à€à€Ÿà€¢à¥ à€šà€à€Ÿ.  
+
+HTMLPlugin.metadata_fields:Comma separated list of metadata fields to attempt to extract. Use 'tag<tagname>' to have the contents of the first <tagname> pair put in a metadata element called 'tagname'. Capitalise this as you want the metadata capitalised in Greenstone, since the tag extraction is case insensitive.  
+
+HTMLPlugin.no_metadata:Don't attempt to extract any metadata from files.  
+
+
+
+HTMLPlugin.nolinks:Don't make any attempt to trap links (setting this flag may improve speed of building/importing but any relative links within documents will be broken).  
+
+
+
+
+
+
+
+HTMLPlugin.title_sub:Substitution expression to modify string stored as Title. Used by, for example, PDFPlug to remove "Page 1", etc from text used as the title.  
+
+
+
+
+
+
+
+ImageConverter.converttotype:à€®à¥à€à¥à€¯ à€à€¿à€€à¥à€° 's'à€¯à€Ÿ à€®à€§à¥à€¯à¥ à€°à¥à€ªà€Ÿà€à€€à€°à¥à€€ à€à€°à€Ÿ.  
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ImageConverter.screenviewsize:Make screenview images of size nxn.  
+
+
+
+
+
+
+
+
+
+
+
+IndexPlugin.desc:This recursive plugin processes an index.txt file. The index.txt file should contain the list of files to be included in the collection followed by any extra metadata to be associated with each file.\n\nThe index.txt file should be formatted as follows: The first line may be a key (beginning with key:) to name the metadata fields (e.g. key: Subject Organization Date). The following lines will contain a filename followed by the value that metadata entry is to be set to. (e.g. 'irma/iw097e 3.2 unesco 1993' will associate the metadata Subject=3.2, Organization=unesco, and Date=1993 with the file irma/iw097e if the above key line was used)\n\nNote that if any of the metadata fields use the Hierarchy classifier plugin then the value they're set to should correspond to the first field (the descriptor) in the appropriate classification file.\n\nMetadata values may be named separately using a tag (e.g. <Subject>3.2) and this will override any name given to them by the key line. If there's no key line any unnamed metadata value will be named 'Subject'.  
+
+
+
+ISISPlugin.subfield_separator:The string used to separate subfields in CDS/ISIS database records.  
+
+
+
+
+
+
+
+KeyphraseExtractor.extract_keyphrases_kea4:Extract keyphrases automatically with Kea 4.0 (default settings). Kea 4.0 is a new version of Kea that has been developed for controlled indexing of documents in the domain of agriculture.  
+
+KeyphraseExtractor.extract_keyphrase_options:Options for keyphrase extraction with Kea. For example: mALIWEB - use ALIWEB extraction model; n5 - extract 5 keyphrase;, eGBK - use GBK encoding.  
+
+
+
+KeyphraseExtractor.missing_kea:Error: The Kea software could not be found at %s. Please download Kea %s from http://www.nzdl.org/Kea and install it in this directory.  
+
+LaTeXPlugin.desc:LaTeX à€ªà¥à€°à€²à¥à€à€Ÿ à€žà€Ÿà€ à¥ à€ªà¥à€²à€à€à€š  
+
+LOMPlugin.desc:à€à€£à€²à¥à€²à¥à€¯à€Ÿ LOM (Learning Object Metadata) à€«à€Ÿà€à€² à€à€°à¥à€€à€Ÿ à€ªà¥à€²à€à€à€š.  
+
+
+
+
+
+
+
+MARCPlugin.desc:à€®à€Ÿà€°à¥à€ à€ªà¥à€²à€à€à€š  
+
+MARCPlugin.metadata_mapping:Name of file that includes mapping details from MARC values to Greenstone metadata names. Defaults to 'marctodc.txt' found in the site's etc directory.  
+
+
+
+MARCXMLPlugin.metadata_mapping_file:Name of file that includes mapping details from MARC values to Greenstone metadata names. Defaults to 'marctodc.txt' found in the site's etc directory.  
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+MetadataPass.desc:On-the-side base class to BasPlug that supports metadata plugins utilise metadata_read pass of import.pl  
+
+
+
+
+
+MP3Plugin.desc:à€à€®à€ªà¥à¥© à€«à€Ÿà€à€² à€ªà¥à€°à¥à€žà¥à€ž à€à€°à€£à¥à€¯à€Ÿà€à€°à¥à€€à€Ÿ à€ªà¥à€²à€à€à€š.  
+
+
+
+
+
+MP3Plugin.metadata_fields:Comma separated list of metadata fields to extract (assuming present) in an MP3 file. Use \"*\" to extract all the fields.  
+
+
+
+
+NulPlugin.add_metadata_as_text:Add a table of metadata as the text of the document, rather than "This document has no text".  
+
+
+
+
+
+
+
+
+
+OggVorbisPlugin.desc:A plugin for importing Ogg Vorbis audio files.  
+
+
+
+
+
+
+
+PagedImagePlugin.documenttype.paged:Paged documents have next and previous arrows and a 'go to page X' box  
+
+PagedImagePlugin.documenttype.hierarchy:à€®à¥à€à¥à€¯ à€ªà¥à€°à€²à¥à€à€Ÿà€à¥ à€žà¥à€à¥ à€ªà€€à¥à€°  
+
+PagedImagePlugin.headerpage:à€ªà¥à€°à€€à¥à€¯à¥à€ à€ªà¥à€°à€²à¥à€à€Ÿà€²à€Ÿ à€
+à€žà¥ à€¹à¥à€¡à€° à€Šà¥à€¯à€Ÿ à€à¥à€¯à€Ÿ à€®à€§à¥à€¯à¥ à€à€¿à€€à¥à€° à€šà€Ÿà€¹à¥.  
+
+
+
+
+
+
+
+
+
+
+
+PDFPlugin.use_sections:à€ªà¥à€¡à¥à€à€« à€«à€Ÿà€à€²à€à¥à€¯à€Ÿ à€ªà¥à€°à€€à¥à€¯à¥à€ à€ªà€Ÿà€šà€Ÿà€à€°à¥à€€à€Ÿ à€žà¥à€µà€€à€à€€à¥à€° à€µà€¿à€­à€Ÿà€ à€€à€¯à€Ÿà€° à€à€°à€Ÿ.  
+
+
+
+
+
+
+
+PostScriptPlugin.extract_pages:à€ªà¥à€à€ž à€¹à¥à€¡à€° à€µà€°à¥à€š à€ªà€Ÿà€šà¥ à€à¥à€¯à€Ÿ.  
+
+
+
+PowerPointPlugin.desc:à€®à€Ÿà€¯à€à¥à€°à¥à€žà¥à€«à¥à€ à€ªà¥à€µà€°à€ªà¥à€à€à€ à€«à€Ÿà€à€² à€à¥à€£à¥à€¯à€Ÿà€à€°à¥à€€à€Ÿ à€ªà¥à€²à€à€à€š.  
+
+
+
+
+
+
+
+
+
+
+
+ReadTextFile.could_not_extract_encoding:à€žà¥à€à€šà€Ÿ: %s - à€
+à€à¥à€ %s à€¯à¥à€¥à¥à€š à€à€šà€à¥à€¡à¥à€à€ à€¹à¥à€£à€Ÿà€° à€šà€Ÿà€¹à¥.  
+
+
+
+ReadTextFile.could_not_open_for_reading:à€µà€Ÿà€à€šà€Ÿà€à€°à¥à€€à€Ÿ à€à€à€¡à€€à€Ÿ à€¯à¥à€£à€Ÿà€° à€šà€Ÿà€¹à¥.  
+
+
+
+
+
+
+
+ReadTextFile.empty_file:à€«à€Ÿà€à€² à€®à€§à¥à€¯à¥ à€®à€Ÿà€¹à€¿à€€à¥ à€šà€Ÿà€¹à¥  
+
+
+
+ReadTextFile.file_has_no_text:à€à¥à€à€ %s contains no text  
+
+ReadTextFile.input_encoding:The encoding of the source documents. Documents will be converted from these encodings and stored internally as utf8.  
+
+ReadTextFile.input_encoding.auto:Use text categorization algorithm to automatically identify the encoding of each source document. This will be slower than explicitly setting the encoding but will work where more than one encoding is used within the same collection.  
+
+ReadTextFile.read_denied:%s à€¡à€¿à€šà€Ÿà€à€¡ à€à€°à€£à¥à€¯à€Ÿà€žà€Ÿà€ à¥ à€ªà€°à€µà€Ÿà€šà€à¥  
+
+ReadTextFile.separate_cjk:Insert spaces between Chinese/Japanese/Korean characters to make each character a word. Use if text is not segmented.  
+
+
+
+ReadTextFile.wrong_encoding:WARNING: %s was read using %s encoding but appears to be encoded as %s.  
+
+ReadXMLFile.desc:à€¬à¥à€ž à€à¥à€²à€Ÿà€ž à€à€à¥à€žà€à€®à€à€² à€ªà¥à€²à€à€žà€Ÿà€ à¥.  
+
+ReadXMLFile.xslt:Transform a matching input document with the XSLT in the named file.  A relative filename is assumed to be in the collection's file area, for instance etc/mods2dc.xsl.  
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+StructuredHTMLPlugin.level3_header:possible user-defined styles for the level3 header in the HTML document (equivalent to <h3>).  
+
+
+
+TextPlugin.desc:à€à€à€ à€žà€Ÿà€§à€Ÿ à€ªà¥à€°à€²à¥à€ à€€à€¯à€Ÿà€° à€à€°à€Ÿ.à€®à¥à€à€¡à¥à€à€Ÿ à€à€°à¥à€€à€Ÿ à€°à¥à€¶à€¿à€·à€ à€Šà¥à€¯à€Ÿ.(  
+
+
+
+
+
+
+
+UnknownPlugin.file_format:à€«à€Ÿà€à€²à€à¥ à€ªà¥à€°à€à€Ÿà€° (à€à€Šà€Ÿà€ MPEG, MIDI, ...)  
+
+UnknownPlugin.mime_type:Mime type of the file (e.g. image/gif).  
+
+UnknownPlugin.process_extension:Process files with this file extension. This option is an alternative to process_exp that is simpler to use but less flexible.  
+
+
+
+WordPlugin.desc:à€®à€Ÿà€¯à€à¥à€°à¥à€žà¥à€«à¥à€ à€µà€°à¥à€¡à€à¥ à€ªà¥à€°à€²à¥à€ à€®à€¿à€³à€µà€¿à€£à¥à€¯à€Ÿà€žà€Ÿà€ à¥ à€ªà¥à€²à€à€à€š.  
+
+
+
+
+
+ZIPPlugin.desc:Plugin which handles compressed and/or archived input formats currently handled formats and file extensions are:\ngzip (.gz, .z, .tgz, .taz)\nbzip (.bz)\nbzip2 (.bz2)\nzip (.zip .jar)\ntar (.tar)\n\nThis plugin relies on the following utilities being present (if trying to process the corresponding formats):\ngunzip (for gzip)\nbunzip (for bzip)\nbunzip2 \nunzip (for zip)\ntar (for tar)  
+
+#
+# Download module option descriptions
+#
+
+
+
+
+
+
+
+
+
+
+OAIDownload.url_disp:à€¯à¥à€à€°à€à€² à€žà¥à€°à¥à€ž  
+
+
+OAIDownload.set:Restrict the download to the specified set in the repository  
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+WebDownload.depth:à€¡à€Ÿà€à€šà€²à¥à€¡ à€à€°à€€à€Ÿà€šà€Ÿ à€à€¿à€€à¥ à€¹à€Ÿà€¯à€ªà€°à€²à€¿à€à€ à€Šà¥à€€à€Ÿ à€¯à¥à€€à€Ÿà€€.  
+WebDownload.depth_disp:à€¡à€Ÿà€à€šà€²à¥à€¡ Depth  
+WebDownload.below:à€¯à€Ÿ à€¯à¥à€à€°à€à€² à€«à€à¥à€€ à€®à€¿à€°à€° à€žà€Ÿà€à€ à€à€°à€¿à€€à€Ÿ  
+
+
+WebDownload.within_disp:à€¯à€Ÿà€ à€žà€Ÿà€à€ à€®à€§à¥à€² à€«à€à¥à€€ à€®à€¿à€°à€° à€«à€Ÿà€à€²  
+
+WebDownload.html_only_disp:à€«à€à¥à€€ à€à€à€à¥à€à€®à€à€² à€«à€Ÿà€à€² à€¡à€Ÿà€à€šà€žà€²à¥à€¡ à€à€°à€Ÿ.  
+
+
+WgetDownload.proxy_on:Proxy on  
+WgetDownload.proxy_host:à€ªà¥à€°à¥à€à¥à€à¥ à€¹à¥à€žà¥à€  
+
+
+
+
+Z3950Download.desc:Z3950 repositories à€¯à¥à€¥à¥à€š à€¡à€Ÿà€à€šà€²à¥à€¡ à€à€°à€£à¥à€¯à€Ÿà€žà€Ÿà€ à¥ à€®à¥à€¡à¥à€¯à¥à€²  
+
+Z3950Download.host_disp:à€¹à¥à€žà¥à€  
+Z3950Download.port:à€°à€¿à€ªà¥à€à€à€°à¥à€à€Ÿ à€ªà¥à€°à¥à€ à€šà€à€¬à€°  
+
+Z3950Download.database:à€¯à€Ÿ à€°à¥à€à¥à€°à¥à€¡ à€à€°à¥à€€à€Ÿ à€¡à¥à€à€Ÿà€¬à¥à€žà€®à€§à¥à€¯à¥ à€¶à¥à€§ à€à¥à€¯à€Ÿ.  
+Z3950Download.database_disp:à€¡à¥à€à€Ÿà€¬à¥à€ž  
+
+
+
+
+
+
+#
+#Plugout option descriptions
+#
+
+
+
+BasPlugout.desc:Base class for all the export plugouts.
+BasPlugout.group_size:à€à€à€Ÿà€ à€à€à¥à€žà€à€®à€à€² à€«à€Ÿà€à€² à€®à€§à¥à€¯à¥ à€
+à€šà¥à€ à€ªà¥à€°à€²à¥à€.  
+BasPlugout.gzip_output:Use gzip to compress resulting xml documents (don't forget to include ZIPPlug in your plugin list when building from compressed documents).  
+
+
+BasPlugout.verbosity:Controls the quantity of output. 0=none, 3=lots.  
+BasPlugout.xslt_file:Transform a document with the XSLT in the named file.  
+
+
+
+
+
+
+
+
+
+
+
+MARCXMLPlugout.group:Output the marc xml records into a single file.  
+MARCXMLPlugout.mapping_file:à€à¥à€°à€Ÿà€šà¥à€žà€«à¥à€°à€®à¥à€¶à€š à€à€°à€¿à€€à€Ÿ à€®à¥
+à€ªà¥à€à€ à€«à€Ÿà€à€² à€µà€Ÿà€ªà€°à€Ÿ.  
+
+METSPlugout.desc:à€à¥à€°à¥à€šà€žà¥à€à¥à€š à€ªà¥à€°à¥à€«à€Ÿà€à€² à€µà€Ÿà€ªà€°à€£à¥à€¯à€Ÿà€à€°à¥à€€à€Ÿ METS à€«à¥à€°à€®à¥
+à€ à€µà€Ÿà€ªà€°à€Ÿ  
+
+METSPlugout.xslt_mets:Transform a mets's docmets.xml with the XSLT in the named file.  
+
+#
+# Perl module strings
+#
+
+classify.could_not_find_classifier:à€à¥à€à€ à€à¥à€²à€Ÿà€žà€¿à€«à€Ÿà€¯à€° à€šà€Ÿà€¹à¥.  
+
+
+
+
+
+
+
+
+
+plugin.kill_file:Process killed by .kill file  
+
+plugin.n_considered:%d à€ªà¥à€°à€²à¥à€ à€ªà¥à€°à€à¥à€°à€¿à€¯à¥à€žà€Ÿà€ à¥ à€à¥à€€à€²à¥.  
+
+
+
+
+
+
+
+plugin.no_plugin_could_process:à€žà¥à€à€šà€Ÿà€ à€ªà¥à€²à€à€à€š à€ªà¥à€°à¥à€žà¥à€ž à€à€Ÿà€²à¥à€²à¥ à€šà€Ÿà€¹à¥.  
+
+plugin.no_plugin_could_recognise:à€žà¥à€à€šà€Ÿà€ %s à€ªà¥à€²à€à€à€š à€à€³à€à¥ à€¶à€à€€ à€šà€Ÿà€¹à¥.  
+
+
+
+plugin.no_plugin_could_recognise_this_file:à€à¥à€£à€€à¥à€¯à€Ÿà€¹à¥ à€ªà¥à€²à€à€à€šà€²à€Ÿ à€¹à¥ à€«à€Ÿà€à€² à€à€³à€à€€à€Ÿ à€à€²à¥ à€šà€Ÿà€¹à¥.  
+
+
+
+
+
+
+
+plugin.one_unrecognised:à¥§ à€
+à€šà¥à€³à€à¥  
+
+
+
+
+
+
+
+plugout.could_not_find_plugout:à€à¥à€à€ \"%s\" à€ªà¥à€²à€à€à€à€ à€®à€¿à€³à€€ à€šà€Ÿà€¹à¥  
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/strings_ro.properties
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/strings_ro.properties	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/strings_ro.properties	(revision 24799)
@@ -0,0 +1,1301 @@
+#
+# Resource bundle description
+#
+
+Language.code:ro  
+Language.name:EnglezÄ  
+
+OutputEncoding.unix:iso_8859_1  
+OutputEncoding.windows:iso_8859_1  
+
+
+#
+# Common output messages and strings
+#
+
+common.cannot_create_file:EROARE: Nu pot crea fiÅierul %s  
+
+common.cannot_find_cfg_file:EROARE: Nu pot gÄsi fiÅierul de configurare %s  
+
+common.cannot_open:EROARE: Nu pot deschide %s  
+
+common.cannot_open_fail_log:EROARE: Nu pot deschide jurnalul %s  
+
+common.cannot_open_output_file:EROARE: Nu pot deschide fiÅierul rezultat %s  
+
+common.cannot_read:EROARE: Nu pot citi %s  
+
+common.cannot_read_file:EROARE: Nu pot citi fiÅierul %s  
+
+common.general_options:opÅ£iuni generale (pentru %s)  
+
+common.must_be_implemented:funcÅ£ia trebuie implementatÄ Ã®n subclasÄ  
+
+common.options:opÅ£iuni  
+
+common.processing:procesez  
+
+common.specific_options:opÅ£iuni specifice  
+
+common.usage:Utilizare  
+
+common.info:informaÅ£ii  
+
+common.invalid_options:Argumente invalide: %s  
+
+
+
+
+
+
+#
+# Script option descriptions and output messages
+#
+
+scripts.language:Limba pentru afiÅarea descrierii opÅ£iunilor ( de exemplu, 'en_US' specificÄ engleza americanÄ).
+
+scripts.xml:Produce informaÅ£ii Ã®n format XML fÄrÄ comentarii âcosmetizateâ, dar care au mult mai multe detalii.  
+
+scripts.listall:ListeazÄ toate elementele care sunt cunoscute.  
+
+scripts.describeall:AfiÅeazÄ opÅ£iunile pentru toate elementele cunoscute  
+
+scripts.both_old_options:ATENÅ¢IE: -removeold a fost menÅ£ionat cu -keepold sau cu -incremental, se procedeazÄ automat la -removeold. ConÅ£inutul curent al directorului %s va fi Åters.
+
+scripts.no_old_options:ATENÅ¢IE: Niciuna dintre -removeold, -keepold sau -incremental nu au fost specificate: se trece automat la -removeold. ConÅ£inutul curent al directorului %s va fi Åters.  
+
+
+
+# -- buildcol.pl --
+
+buildcol.archivedir:Unde stau arhivele.  
+
+buildcol.builddir:Unde trebuie puse indexurile construite.  
+
+buildcol.cachedir:ColecÅ£ia va fi construitÄ temporar aici Ã®nainte de a fi copiatÄ Ã®n directorul de construcÅ£ie.  
+
+buildcol.cannot_open_cfg_file:ATENÅ¢IE: Nu pot deschide fiÅierul de configurare pentru actualizare: %s  
+
+buildcol.collectdir:Calea cÄtre directorul de âcolectareâ.  
+
+buildcol.copying_back_cached_build:CopiazÄ Ã®napoi construcÅ£ia cache (prestocare)  
+
+buildcol.create_images:IntenÅ£ia este de a crea imagini implicite pentru noua colecÅ£ie. AceastÄ funcÅ£ionalitate se bazeazÄ pe instalarea prealabilÄ a GIMP-ului Ã®mpreunÄ cu modulele perl care sÄ permitÄ scriptingul din perl.  
+
+buildcol.debug:PrintaÅ£i rezultatele la STDOUT.  
+
+buildcol.desc:Script PERL folosit pentru a construi o colecÅ£ie Greenstone din documente GA.  
+
+buildcol.faillog:Numele jurnalului de nereuÅite (fail log) . Acest jurnal Ã®nscrie fiÅierele Åi tipul acestora, care nu pot fi procesate.  
+
+
+
+buildcol.index:Indexul de construcÅ£ie (va construi totul Ã®n fiÅierul config dacÄ nu este setat).  
+
+buildcol.incremental:Doar documentele index care nu au fost indexate Ã®n prealabil. ImplicÄ utilizarea -keepold. Se bazeazÄ pe indexatorul lucene.  
+
+buildcol.keepold:Nu va distruge conÅ£inutul curent al directorului de construcÅ£ie.  
+
+buildcol.maxdocs:NumÄrul maxim de documente pentru a fi construite.  
+buildcol.maxnumeric:NumÄrul maxim de digiÅ£i pe care Ã®l poate avea un âcuvÃ¢ntâ Ã®n indexul dicÅ£ionarului. Numerele mari sunt sparte Ã®n cÃ¢teva cuvinte pentru indexare. De exemplu, dacÄ numÄrul este de 4 digiÅ£i maxim, atunci â1342663â va fi spart Ã®n â1342â Åi â663â.  
+buildcol.mode:PÄrÅ£i ale procesului de construcÅ£ie pentru a fi Ã®ndeplinite.  
+buildcol.mode.all:IndeplineÅte-le pe toate.  
+buildcol.mode.build_index:Pur Åi simplu indexaÅ£i textul.  
+buildcol.mode.compress_text:ComprimaÅ£i textul.  
+buildcol.mode.infodb:ConstruieÅte baza de date pentru metadate.  
+
+buildcol.no_default_images:Nu vor fi generate imagini Ã®n mod implicit.  
+
+buildcol.no_image_script:ATENÅ¢IE: Scriptul de alcÄtuire a imaginilor nu a putut fi gÄsit: %s  
+
+buildcol.no_strip_html:Nu eliminaÅ£i tagurile html din textul indexat (se foloseÅte doar pentru colecÅ£iile mgpp).  
+
+buildcol.no_text:Nu stocaÅ£i text comprimat. AceastÄ opÅ£iune este necesarÄ minimizÄrii dimensiunii indexurilor construite dacÄ doriÅ£i sÄ afiÅaÅ£i documentele originale la momentul rulÄrii (de exemplu, nu veÅ£i putea regÄsi versiunea comprimatÄ a textului).  
+
+buildcol.sections_index_document_metadata:Indexarea metadatelor documentului la nivelul secÅ£iunii  
+buildcol.sections_index_document_metadata.never:Nu indexaÅ£i niciun document de metadate la nivel de secÅ£iune.  
+buildcol.sections_index_document_metadata.always:AdÄugarea tuturor metadatelor de pe acelaÅi nivel chiar dacÄ metadatele de la nivelul secÅ£iunii pentru acel nume existÄ deja.  
+buildcol.sections_index_document_metadata.unless_section_metadata_exists:AdÄugaÅ£i doar metadate la nivel de document dacÄ nu existÄ metadate la nivel de secÅ£iune pentru acel nume.  
+
+buildcol.out:Numele fiÅierului sau mijlocul de tipÄrire Åi a rezultatelor de stare.  
+
+buildcol.params:numele colecÅ£iei [options]  
+
+buildcol.remove_empty_classifications:Ascunde clasificatorii goi Åi nodurile de clasificare (aceia care nu conÅ£in niciun document).  
+
+buildcol.removeold:Va elimina conÅ£inutul vechi al directorului de construcÅ£ie.  
+
+buildcol.unlinked_col_images:Imaginile ColecÅ£iei nu pot fi legate corect (prin linkuri).  
+
+buildcol.unknown_mode:Mod de acÅ£iune necunoscut: %s  
+
+buildcol.updating_archive_cache:Actualizarea arhivei de preÃ®ncÄrcare (cache)  
+
+buildcol.verbosity:ControleazÄ calitatea rezultatelor. 0=lipsÄ, 3=mai multe.  
+
+
+# -- classinfo.pl --
+
+classinfo.collection:Numind o colecÅ£ie, veÅ£i face ca classinfo.pl sÄ aparÄ mai Ã®ntÃ¢i Ã®n collect/collection-name/perllib/classify. DacÄ clasificatorul nu este gÄsit acolo se va cÄuta Åi Ã®n directorul general perllib/classify.  
+
+classinfo.desc:AfiÅeazÄ informaÅ£ii despre un clasificator.  
+
+classinfo.general_options:OpÅ£iunile generale sunt moÅtenite din clasele pÄrinte ale clasificatorului.  
+
+classinfo.info:informaÅ£ii  
+
+classinfo.no_classifier_name:EROARE: Trebuie furnizat un nume pentru clasificator.  
+
+classinfo.option_types:Clasificatorii au douÄ tipuri de opÅ£iuni  
+
+classinfo.params:[options] nume clasificator  
+
+classinfo.passing_options:OpÅ£iunile pot fi trecute oricÄrui clasificator prin includerea acestora Ã®n fiÅierul de configurare collect.cfg.  
+
+classinfo.specific_options:Sunt definite opÅ£iuni specifice Ã®n cadrul clasificatorului Åi sunt disponibile doar acestui clasificator Ã®n mod explicit.  
+
+# -- downloadfrom.pl --
+downloadfrom.cache_dir:LocaÅ£ia directorului de preÃ®ncÄrcare (cache)  
+downloadfrom.desc:DescarcÄ fiÅierele dintr-un server extern  
+downloadfrom.download_mode:tipul serverului de la care se face descÄrcarea  
+downloadfrom.download_mode.Web:HTTP  
+downloadfrom.download_mode.MediaWiki:Site-ul MediaWiki  
+downloadfrom.download_mode.OAI:Open Archives Initiative  
+downloadfrom.download_mode.z3950:Server z3950  
+downloadfrom.download_mode.SRW:Serviciu web SearchRetrieve  
+downloadfrom.incorrect_mode:parametrul download_mode a fost incorect.  
+downloadfrom.info:Mai degrabÄ printaÅ£i informaÅ£iile despre server decÃ¢t sÄ le descÄrcaÅ£i  
+downloadfrom.params:[general options] [specific download options]  
+
+# -- downloadinfo.pl --
+
+downloadinfo.desc:PrinteazÄ informaÅ£ii despre un modul de download  
+downloadinfo.collection:Denumind o colecÅ£ie va face ca downloadinfo.pl sÄ aparÄ mai Ã®ntÃ¢i Ã®n collect/collection-name/perllib/downloaders. DacÄ modulul nu este gÄsit acolo sistemul va cÄuta Ã®n directorul general perllib/downloaders.  
+downloadinfo.params:[options] [download-module]  
+downloadinfo.general_options:OpÅ£iunile generale sunt moÅtenite din clasele pÄrinte ale modulelor de descÄrcare.  
+downloadinfo.specific_options:OpÅ£iuni specifice sunt definite Ã®n cadrul modulului de descÄrcare Åi sunt disponibile doar acestui tip particular de modul de descÄrcare.  
+downloadinfo.option_types:Modulele de descÄrcare pot avea douÄ tipuri de opÅ£iuni  
+
+# -- explode_metadata_database.pl --
+explode.desc:Destinderea bazei de date a metadatelor  
+
+
+ 
+explode.document_field:Elementele de metadate care specificÄ numele de fiÅiere ale documentelor pentru a le obÅ£ine Åi include Ã®n colecÅ£ie.  
+
+explode.document_prefix:Un prefix pentru locaÅ£iile documentelor (de exemplu pentru utilizarea opÅ£iunii document_field).  
+
+explode.document_suffix:Un sufix pentru locaÅ£ia documentului (pentru a fi utilizat cu opÅ£iunea document_field).  
+
+explode.encoding:Codarea utilizatÄ atunci cÃ¢nd se citeÅte fiÅierul de baze de date  
+explode.metadata_set:Setul de metadate (namespace) pentru a exporta toate metadatele precum  
+explode.plugin:Extensie pentru destindere  
+
+explode.params:[options] numele fiÅierului  
+explode.records_per_folder:NumÄrul Ã®nregistrÄrilor care sunt puse Ã®n fiecare subdirector.  
+
+# -- replace_srcdoc_with_html.pl --
+
+
+
+
+# -- exportcol.pl --
+
+exportcol.out:Nume de fiÅier sau mijloc de printare a stÄrii rezultatelor.  
+exportcol.cddir:Numele directorului Ã®n care se face exportul conÅ£inutului CD-ului.  
+exportcol.cdname:Numele CD-ROM-ului -- acesta este lucrul care apare Ã®n meniul de start din moment ce CD-ROM-ul este instalat  
+exportcol.desc:Script PERL utilizat pentru a exporta una sau mai multe colecÅ£ii pe un CD-ROM destinat sistemului de operare Windows.  
+exportcol.noinstall:Crearea unui CD-ROM de pe care sÄ ruleze biblioteca fÄrÄ a instala nimic pe computerul gazdÄ.  
+exportcol.params:[options] numele-colecÅ£iei1 numele-colecÅ£iei2 ...  
+exportcol.coll_not_found:Ignorarea colecÅ£iilor invalide %s: colecÅ£ia nu a fost gÄsitÄ la %s.  
+exportcol.coll_dirs_not_found:Ignorarea colecÅ£iilor %s invalide: unul dintre directoarele urmÄtoare nu au fost gÄsite:  
+exportcol.fail:exportcol.pl a eÅuat:  
+exportcol.no_valid_colls:Nu sunt specificate colecÅ£ii valide pentru export.  
+exportcol.couldnt_create_dir:Nu am putut crea directorul %s.  
+exportcol.couldnt_create_file:Nu am putut crea %s.  
+exportcol.instructions:Pentru a crea un CD auto instalabil pentru sistemul de operare Windows, scrieÅ£i conÅ£inutul acestui director direct pe CD-ROM.  
+exportcol.non_exist_files:Unul sau mai multe dintre fiÅierele urmÄtoare care sunt necesare, precum Åi directoarele acestora, nu existÄ:  
+exportcol.success:exportcol.pl a avut succes:  
+exportcol.output_dir:ColecÅ£iile exportate (%s) sunt Ã®n %s.  
+exportcol.export_coll_not_installed:Nu a fost instalatÄ funcÅ£ia de export pe CD-ROM.  
+
+# -- import.pl --
+
+import.archivedir:Aici se Ã®ncheie materialul convertit.  
+
+import.manifest:Un fiÅier XML care detaliazÄ care fiÅiere trebuie importate. Utilizat Ã®n locul parcurgerii descendente a directorului de import, de obicei pentru construcÅ£ia incrementalÄ.  
+
+import.cannot_open_stats_file:ATENÅ¢IE: Nu am putut deschide fiÅierele de stare %s.  
+
+import.cannot_open_fail_log:EROARE: Nu am putut deschide jurnalul de nereuÅite %s  
+
+import.cannot_sort:ATENÅ¢IE: import.pl nu poate sorta documentele atunci cÃ¢nd dimensiunea grupului este mai mica decÃ¢t 1. OpÅ£iunea sortmeta va fi ignoratÄ.  
+
+import.collectdir:Calea directorului de âcolectareâ.  
+
+import.complete:Import complet  
+
+import.debug:ImprimaÅ£i textul importat cÄtre STDOUT (pentru importarea GA)  
+
+import.desc:Script Perl utilizat pentru a importa fiÅiere Ã®n formatul GA pregÄtit pentru construcÅ£ie.  
+
+import.faillog:Numele fiÅierului jurnal pentru eÅecuri. Acest jurnal primeÅte numele fiÅierelor celor care au eÅuat Ã®n a procesate.  
+
+import.groupsize:NumÄrul de documente importate, care sÄ fie grupate Ã®ntr-un fiÅier XML.  
+
+import.gzip:FolosiÅ£i gzip pentru a comprima documentele xml rezultate (nu uitaÅ£i sÄ includeÅ£i ZIPPlug Ã®n lista extensiilor atunci cÃ¢nd construiÅ£i din documentele comprimate).  
+
+import.importdir:Locul unde stÄ materialul original.  
+
+import.incremental:ImportÄ doar documente care sunt mai recente (dupÄ timestamp) decÃ¢t cele din arhivÄ. ImplicÄ -keepold.  
+
+import.keepold:Nu va distruge conÅ£inutul curent al directorului arhivei.  
+
+import.maxdocs:numÄrul maxim de domente pentru a fi importate.  
+
+import.no_import_dir:Eroare: Directorul de import (%s) nu a fost gÄsit.  
+
+import.no_plugins_loaded:EROARE: Nu sunt Ã®ncÄrcate extensii.  
+
+import.OIDtype:Metoda utilizatÄ cÃ¢nd se genereazÄ identificatori unici pentru fiecare document.  
+import.OIDtype.hash:Se aplicÄ codare hash asupra conÅ£inutului fiÅierului. Identificatorii documentului vor fi aceiaÅi de fiecare datÄ cÃ¢nd colecÅ£ia este importatÄ.  
+
+import.OIDtype.incremental:FoloseÅte un contor simplu pentru document. Este semnificativ mai rapid decÃ¢t modul âhashâ, dar nu atribuie acelaÅi identificator aceluiaÅi conÅ£inut al documentului iar documentele urmÄtoare nu pot fi adÄugate arhivei existente.  
+
+import.OIDtype.assigned:FolosiÅ£i valoarea de metadate datÄ de opÅ£iunea OIDmetadata (precedatÄ de 'D'). DacÄ nu este specificat, pentru un anume document, atunci va fi folosit un hash (codare tip utilizatÄ pentru a individualiza un fiÅier). AceÅti identificatori ar trebui sÄ fie unici.  
+
+import.OIDtype.dirname:FoloseÅte numele directorului pÄrinte (precedat de 'J'). Aici ar trebui sÄ fie doar un singur document pentru fiecare director, iar numele directoarelor ar trebui sÄ fie unice. De exemplu, import/b13as/h15ef/page.html va avea un identificator Jh15ef.  
+
+import.OIDmetadata:SpecificÄ elementul de metadate care conÅ£ine identificatorul unic al documentului pentru a fi utilizat cu -OIDtype=assigned.  
+
+import.saveas:Acest lucru este pentru a decide formatul de arhivÄ care trebuie generat. Setarea implicitÄ este GA.  
+
+import.out:Numele fiÅierului sau instrumentul de printare al statisticilor.  
+
+import.params:numele colecÅ£iei [options]  
+
+import.removeold:Va elimina vechiul conÅ£inut al directorului arhivei.  
+
+import.removing_archives:Eliminarea conÅ£inutului curent al directorului arhivelor...  
+
+import.removing_tmpdir:Eliminarea conÅ£inutului directorului âtmpâ al colecÅ£iei...  
+
+
+
+
+
+import.sortmeta:SortaÅ£i documentele alfabetic dupÄ metdate pentru a fi construite. Rezultatele cÄutÄrii dupÄ interogÄri boolean vor fi afiÅate Ã®n aceastÄ ordine. Acestea vor fi dezactivate dacÄ dimensiunea grupului este mai micÄ decÃ¢t 1. Poate fi o listÄ separatÄ prin virgule pentru sortarea a mai mult de o valoare de metadate.  
+
+import.statsfile:Numele fiÅierului sau instrumentul de printare al statisticilor.  
+
+import.stats_backup:Ãn loc, va tipÄri statisticile cÄtre STDERR.  
+
+import.verbosity:ControleazÄ calitatea rezultatelor. 0=lipsÄ, 3=mai multe.  
+
+# -- schedule.pl --
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# -- export.pl --
+
+export.exportdir:Unde se terminÄ exportul materialelor.  
+
+export.cannot_open_stats_file:ATENÅ¢IE: Nu am putut deschide fiÅierele statistice %s.  
+
+export.cannot_open_fail_log:EROARE: Nu am putut deschide jurnalul de nereuÅite (fail log) %s  
+
+export.cannot_sort:ATENÅ¢IE: export.pl nu poate sorta documentele atunci cÃ¢nd dimensiunea grupului este mai micÄ decÃ¢t 1. OpÅ£iunea sortmeta va fi ignoratÄ.  
+
+export.collectdir:Calea directorului de âcolectareâ.  
+
+export.complete:Export complet  
+
+export.debug:PrinteazÄ textul exportat cÄtre STDOUT (pentru exportul GA)  
+
+export.desc:Scripturile PERL utilizate pentru a exporta fiÅierele Ã®ntr-o colecÅ£ie Greenstone cÄtre alt format.  
+
+export.faillog:Numele jurnalului conÅ£inÃ¢nd nereuÅitele (fail log). Acest jurnal include numele tuturor fiÅierelor care nu pot fi procesate. (Implicit se gÄseÅte la: collectdir/collname/etc/fail.log)  
+
+export.groupsize:NumÄrul documentelor grupate Ã®ntr-un fiÅier XML.  
+
+export.gzip:FoloseÅte gzip pentru a comprima documentele xml rezultate (nu uitaÅ£i includerea  extensiei ZIPPlug Ã®n lista extensiilor atunci cÃ¢nd se face construcÅ£ia din documente comprimate deja).  
+
+export.importdir:Unde este materialul original.  
+
+export.keepold:Aceasta nu va distruge conÅ£inutul curent al directorului de export.  
+
+export.maxdocs:NumÄrul maxim de documente pentru export.  
+
+export.listall:Lista tuturor formatelor Ã®n care se poate salva (saveas)  
+
+export.saveas:Formatare pentru a exporta documentele.  
+
+export.saveas.DSpace:Formatul de arhivÄ DSpace.  
+
+
+
+
+
+
+export.saveas.MARCXML:Formatul MARC XML (este o versiune XML a formatului MARC21)  
+
+export.out:Numele fiÅierului sau instrument de a printa Åi starea rezultatelor.  
+
+export.params:[options] numele-colecÅ£iei1, numele-colecÅ£iei2...  
+
+export.removeold:Va elimina conÅ£inutul vechi al directorului de export.  
+
+export.removing_export:Eliminarea conÅ£inutului curent al directorului de export...  
+
+export.sortmeta:SorteazÄ documentele alfabetic prin intermediul metadatelor de construcÅ£ie. AceastÄ opÅ£iune va fi dezactivatÄ dacÄ dimensiunea grupului este mai mica decÃ¢t 1.  
+
+export.statsfile:Numele fiÅierului sau instrumentul de printare a statisticilor de export.  
+
+export.stats_backup:Ãn loc, va printa starea cÄtre STDERR.  
+
+export.verbosity:ControleazÄ calitatea rezultatelor. 0=lipsÄ, 3=mai multe.  
+
+
+
+# -- mkcol.pl --
+
+mkcol.about:Textul descriptiv pentru colecÅ£ie.  
+
+mkcol.bad_name_cvs:EROARE: Nicio colecÅ£ie nu poate fi numitÄ CVS deoarece acest lucru ar putea influienÅ£a negativ directoarele create de sistemul de versionare CVS.  
+
+
+
+mkcol.bad_name_modelcol:EROARE: Nicio colecÅ£ie nu poate fi denumitÄ modelcol deoarece acesta este numele colecÅ£iei model.  
+
+mkcol.cannot_find_modelcol:EROARE: Nu pot gÄsi colecÅ£ia model %s  
+
+mkcol.col_already_exists:EROARE: AceastÄ colecÅ£ie existÄ deja.  
+
+mkcol.collectdir:Directorul unde va fi creatÄ noua colecÅ£ie.  
+
+mkcol.creating_col:Crearea colecÅ£iei %s  
+
+mkcol.creator:Adresa de email a creatorului colecÅ£iei.  
+
+mkcol.creator_undefined:EROARE: Creatorul nu a fost definit. AceastÄ variabilÄ este necesarÄ pentru a recunoaÅte numele duplicate ale diferitelor colecÅ£ii.  
+
+mkcol.desc:Script Perl folosit pentru a fi creatÄ structura de directoare pentru o nouÄ colecÅ£ie Greenstone.  
+
+mkcol.doing_replacements:se fac Ã®nlocuirile pentru %s  
+
+
+
+
+
+mkcol.long_colname:EROARE: Numele colecÅ£iei trebuie sÄ fie mai puÅ£in de 8 caractere pentru a fi pÄstratÄ compatibilitatea cu sistemele de fiÅiere folosite Ã®n trecut.  
+
+mkcol.maintainer:Adresa de email a curatorului colecÅ£iei (dacÄ diferÄ de cea a creatorului).  
+
+mkcol.no_collectdir:EROARE: Directorul colecÅ£iei nu existÄ: %s  
+
+
+
+mkcol.no_colname:EROARE: Nu a fost specificat numele colecÅ£iei.  
+
+mkcol.optionfile:ObÅ£ineÅ£i opÅ£iunile din fiÅier. Este util pentru sistemele unde liniile de comandÄ lungi pot cauza probleme.  
+
+mkcol.params:numele colecÅ£iei [options]  
+
+mkcol.plugin:Modul Perl folosit pentru extensie (aici pot fi mai multe intrÄri reprezentÃ¢nd mai multe extensii).  
+
+mkcol.public:DacÄ aceastÄ colecÅ£ie are permis acces anonim.  
+mkcol.public.true:ColecÅ£ia este publicÄ  
+mkcol.public.false:Este o colecÅ£ie privatÄ  
+
+mkcol.quiet:OperaÅ£iuni Ã®n liniÅte.  
+
+
+
+mkcol.success:Noua colecÅ£ie a fost creatÄ cu succes la %s  
+
+mkcol.title:Titlul colecÅ£iei.  
+
+mkcol.win31compat:Fie cÄ numele directorului colecÅ£iei trebuie sÄ fie conform convenÅ£iilor Windows 3.1 sau nu (de exemplu cu o lungime de 8 caractere).  
+mkcol.win31compat.true:Numele directorului are 8 caractere sau mai puÅ£ine  
+mkcol.win31compat.false:Numele directorului, orice lungime  
+
+# -- pluginfo.pl --
+
+pluginfo.collection:Stabilind numele unei colecÅ£ii va avea ca efect acÅ£iunea lui pluginfo.pl, care se va uita mai Ã®ntÃ¢i Ã®n collect/collection-name/perllib/plugins. DacÄ extensia nu este gÄsitÄ aici atunci se va uita Ã®n directorul general: perllib/plugins.  
+
+pluginfo.desc:PrinteazÄ informaÅ£ii despre o extensie.  
+
+pluginfo.general_options:OpÅ£iunile Generale sunt moÅtenite din clasele pÄrinte ale extensiei.  
+
+pluginfo.info:informaÅ£ii  
+
+pluginfo.no_plugin_name:EROARE: Trebuie introdus numele pentru extensie.  
+
+pluginfo.option_types:Extensiile pot avea douÄ tipuri de opÅ£iuni  
+
+pluginfo.params:[options] numele extensiei  
+
+pluginfo.passing_options:OpÅ£iunile vor fi pasate oricÄrei extensii prin includerea acestora Ã®n fiÅierul de configurare collect.cfg.  
+
+pluginfo.specific_options:OpÅ£iuni specifice sunt definite Ã®n cadrul extensiei Ã®n sine Åi sunt disponibile doar pentru aceastÄ anume extensie.  
+
+
+# -- plugoutinfo.pl --
+
+plugoutinfo.collection:DÃ¢nd numele unei colecÅ£ii va determina ca plugoutinfo.pl sÄ se uite mai Ã®ntÃ¢i Ã®n collect/collection-name/perllib/plugouts. DacÄ extensia externÄ nu este gÄsitÄ aici acesta va cÄuta Ã®n directorul perllib/plugouts.  
+
+plugoutinfo.desc:PrinteazÄ informaÅ£ii despre o extensie externÄ  
+
+plugoutinfo.general_options:OpÅ£iunile generale sunt moÅtenite din clasele pÄrinÅ£i ale plugout.  
+
+plugoutinfo.info:informaÅ£ii  
+
+plugoutinfo.no_plugout_name:EROARE: Trebuie furnizat numele unui plugout.  
+
+plugoutinfo.option_types:Plugouts pot avea douÄ tipuri de opÅ£iuni  
+
+plugoutinfo.params:[options] nume plugout  
+
+plugoutinfo.passing_options:OpÅ£iunile pot fi pasate oricÄrei extensii externe prin includerea acestora Ã®n fiÅierul de configurare collect.cfg.  
+
+plugoutinfo.specific_options:OpÅ£iuni specifice sunt definite Ã®n interiorul lui plugout Åi sunt disponibile doar acestui anume plugout.  
+
+
+
+#
+# Classifier option descriptions
+#
+
+AllList.desc:CreeazÄ o listÄ unicÄ a tuturor documentelor. Este utilizatÄ de oaiserver.  
+
+AZCompactList.allvalues:UtilizeazÄ toate valorile de metadate gÄsite.  
+
+AZCompactList.desc:Extensia Classifier pentru sortarea alfabeticÄ (on a-zA-Z0-9). Produce o listÄ orizontalÄ de la A la Z Åi apoi o listÄ verticalÄ conÅ£inÃ¢nd documente, sau âpoliÅ£eâ pentru documente care au aceleaÅi metadate.  
+
+AZCompactList.doclevel:Nivelul de procesare al documentului.  
+AZCompactList.doclevel.top:Ãntregul document.  
+AZCompactList.doclevel.section:DupÄ secÅ£iuni.  
+
+AZCompactList.firstvalueonly:UtilizaÅ£i doar prima valoarea de metadate gÄsitÄ.  
+
+AZCompactList.freqsort:SortaÅ£i dupÄ frecvenÅ£a nodurilor mai degrabÄ decÃ¢t alfa-numeric.  
+
+AZCompactList.maxcompact:NumÄrul maxim de documente pentru a fi afiÅate pe paginÄ.  
+
+AZCompactList.metadata:Un singur cÃ¢mp de metadate sau o listÄ de cÃ¢mpuri de metadate separate prin virgulÄ folosite pentru clasificare. DacÄ este specificatÄ o listÄ, atunci va fi folosit primul tip de metadate care are valori. Poate fi folosit conjugat cu marcatorii -firstvalueonly Åi -allvalues pentru a selecta doar prima valoare sau toate valorile de metadate din listÄ.  
+
+AZCompactList.mincompact:NumÄrul minim de documente care sÄ fie afiÅate pe paginÄ.  
+
+AZCompactList.mingroup:NumÄrul cel mai mic de valori care va cauza formarea unui grup Ã®n cadrul ierarhiei.  
+
+AZCompactList.minnesting:Ce mai micÄ valoare care va cauza ca o listÄ sÄ fie convertitÄ Ã®ntr-o listÄ imbricatÄ.  
+
+AZCompactList.recopt:Utilizat Ã®n metadate imbricate precum -metadata An/OrganizaÅ£ie.  
+AZCompactList.sort:CÃ¢mp de Metadate pentru sortarea dupÄ nodurile descendenÅ£i.  
+
+AZCompactSectionList.desc:VariaÅ£ie asupra AZCompactList, care clasificÄ secÅ£iunile mai degrabÄ decÃ¢t documentele. IntrÄrile sunt sortate de metadate la nivel de secÅ£iune.  
+
+AZList.desc:Extensie pentru clasificare care sorteazÄ alfabetic ( de la a-z, A-Z Åi 0-9). Este produsÄ o listÄ orizontalÄ de la A la Z avÃ¢nd documentele listate dedesubt.  
+
+AZList.metadata:Pentru clasificare este utilizat in singur cÃ¢mp de metadate sau o listÄ separatÄ prin virgule de cÃ¢mpuri de metadate. UrmÃ¢nd ordinea indicatÄ de listÄ, primul cÃ¢mp care conÅ£ine o valoare de Metadate va fi folosit. Lista va fi sortatÄ dupÄ acest element.  
+
+AZSectionList.desc:VariaÅ£ia pe lista de la A la Z, care mai degrabÄ clasificÄ secÅ£iunile decÃ¢t documentele. IntrÄrile sunt sortate dupÄ metadatele de la nivelul fiecÄrei secÅ£iuni.  
+
+BasClas.bad_general_option:Clasificatorul %s foloseÅte o opÅ£iune eronatÄ. VerificaÅ£i fiÅierul de configurare collect.cfg.  
+
+BasClas.builddir:Unde sunt puse indexurile construite.  
+
+BasClas.buttonname:Eticheta pentru ecranul clasificatorului Åi butonul din bara de navigare. Implicit este specificat elementul de metadate prin -metadata.  
+
+BasClas.desc:Clasa de bazÄ pentru toÅ£i clasificatorii.  
+
+BasClas.no_metadata_formatting:Nu efectuaÅ£i nicio formatare automatÄ a metadatelor (Ã®n vederea sortÄrii.)  
+
+BasClas.outhandle:Mijlocul (file handle) prin care se scriu rezultatele Ã®ntr-un fiÅier.  
+
+BasClas.removeprefix:Un prefix pentru a ignora valorile de metadate la momentul sortÄrii.  
+
+BasClas.removesuffix:Un sufix pentru a ignora valorile din metadate la momentul sortÄrii.  
+
+BasClas.verbosity:ControleazÄ calitatea rezultatelor. 0=lipsÄ, 3=mai multe.
+
+Browse.desc:Un clasificator fals care furnizeazÄ un link Ã®n bara de navigare pentru un model prototip de navigare combinatÄ. Este activ doar pentru colecÅ£iile mgpp Åi este practic  pentru colecÅ£ii de dimensiune micÄ.  
+
+DateList.bymonth:ClasificÄ dupÄ an Åi lunÄ Ã®n loc de a folosi doar anul.  
+
+DateList.desc:Extensia Clasificator pentru sortarea dupÄ datÄ. Implicit se poate face sortare dupÄ metadatelel 'DatÄ'. Se presupune cÄ datele (cronologic) sunt de forma aaaalllzz sau aaaa-ll-zz.  
+
+DateList.metadata:Metadatele care conÅ£in datele dupÄ care sÄ se facÄ clasificarea. Se aÅteaptÄ ca formatul sÄ fie yyyymmdd sau yyyy-mm-dd. Poate sÄ fie o listÄ separatÄ prin virgule, caz Ã®n care prima datÄ care va fi gÄsitÄ va fi utilizatÄ.  
+
+DateList.reverse_sort:Sortarea documentelor Ã®n ordine cronologicÄ inversÄ (cel mai nou primul).  
+
+DateList.nogroup:FaceÅ£i din fiecare an o intrare individualÄ Ã®n lista orizontalÄ Ã®n loc de a destinde anii cu cÃ¢teva intrÄri. (Acest lucru poate fi fÄcut Åi cu opÅ£iunea -bymonth pentru a face fiecare lunÄ o intrare separatÄ Ã®n locul fuzionÄrilor).  
+
+DateList.no_special_formatting:Nu afiÅaÅ£i informaÅ£ii An Åi LunÄ Ã®n lista documentelor.  
+
+DateList.sort:Un cÃ¢mp de metadate Ã®n plus pentru sortare Ã®n cazul Ã®n care sunt douÄ documente care au aceeaÅi datÄ.  
+
+List.always_bookshelf_last_level:CreaÅ£i o pictogramÄ tip raft de cÄrÅ£i chiar dacÄ existÄ doar un singur element Ã®n fiecare grup Ã®n nodurile descendente.  
+
+List.classify_sections:ClasificÄ secÅ£iuni Ã®n loc de documente.  
+
+List.desc:Un clasificator de listÄ general Åi flexibil care are cele mai multe caracteristici ale AZCompactList, dar care face dovada utilizÄrii unor mai bune metadate, Unicode Åi capacitÄÅ£i de sortare.  
+
+List.metadata:CÃ¢mpurile de metadate utilizate pentru clasificare. UtilizaÅ£i '/' pentru a separa nivelurile Ã®n cadrul ierarhiei Åi ';' pentru a separa cÃ¢mpurile de metadate Ã®n cadrul fiecÄrui nivel.  
+
+List.partition_name_length:Lungimea numelui partiÅ£iei; setÄrile implicite variazÄ Ã®ntre 1 Åi 3 caractere depinzÃ¢nd de cÃ¢te sunt necesare pentru a distinge startul partiÅ£iei de finalul sÄu. AceastÄ opÅ£iune se aplicÄ atunci cÃ¢nd partition_type_within_level este setat cu 'constant_size'.  
+
+List.partition_size_within_level:NumÄrul de elemente din fiecare partiÅ£ie (se aplicÄ doar cÃ¢nd partition_type_within_level este setat la 'constant_size').  
+
+List.partition_type_within_level:Tipul partiÅ£iei fÄcute: fie 'per_letter', 'constant_size', sau 'none'.  
+
+List.sort_leaf_nodes_using:CÃ¢mpurile de metadate folosite pentru sortarea nodurilor. FolosiÅ£i '|' pentru a separa  grupurile de metadate Åi ';' pentru a separa cÃ¢mpurile de metadate din cadrul fiecÄrui grup.  
+
+List.use_hlist_for:CÃ¢mpuri de metadate folosite mai mult la un hlist decÃ¢t la un vlist. FoloseÅte â,â pentru a separa grupurile de metadate Åi â;â pentru a separa cÃ¢mpurile de metadate din fiecare dintre grupuri.  
+
+HFileHierarchy.desc:Extensie Classifier pentru generarea clasificÄrii ierarhice bazate pe o structurÄ de fiÅiere suplimentarÄ.  
+
+Hierarchy.desc:Extensia Clasificator pentru generarea unei clasificÄri ierarhice. Acesta poate sÄ se bazeze pe metadate structurate sau poate folosi o structurÄ de fiÅiere suplimentarÄ (folosirea opÅ£iunii -hfile).  
+
+Hierarchy.documents_last:AfiÅarea nodurilor documentului dupÄ nodurile clasificatorului.  
+
+Hierarchy.hfile:UtilizaÅ£i fiÅierul de clasificare a structurii.  
+
+Hierarchy.hlist_at_top:AfiÅaÅ£i orizontal primul nivel al clasificÄrii.  
+
+Hierarchy.reverse_sort:Sortarea nodurilor descendenÅ£i Ã®n ordine inversÄ (utilizat cu -sort).  
+
+Hierarchy.separator:Expresie regulatÄ folositÄ ca separator Ã®n cazul utilizÄrii metadatelor structurate.  
+
+Hierarchy.sort:CÃ®mpurile de metadate pentru a sorta nodurile descendenÅ£i. DescendenÅ£ii nu vor fi sortaÅ£i dacÄ nu au fost specificaÅ£i.  
+
+Hierarchy.suppressfirstlevel:IgnoraÅ£i prima parte a valorii metadatelor. Acest lucru este util pentru metadate acolo unde primul element este comun, este Åi cazul directorului de import din gsdlsourcefilename.  
+
+Hierarchy.suppresslastlevel:Trebuie ignoratÄ partea finalÄ a valorii de metadate. Acest lucru este necesar pentru metadate, unde fiecare dintre valori sunt unice aÅa cum sunt Åi cÄile fiÅierului.  
+
+HTML.desc:CreazÄ o clasificare goalÄ, care este o simplÄ legÄturÄ cÄtre o paginÄ web.  
+
+HTML.url:Url-ul paginii web la care se face trimiterea.  
+
+SimpleList.desc:O extensie pentru un clasificator simplu de listÄ.  
+
+SimpleList.metadata:Un singur cÃ¢mp de metadate sau o listÄ separatÄ prin virgule a cÃ¢mpurilor de metadate folosite pentru clasificare. UrmÄrind ordinea indicatÄ prin listÄ, va fi folosit primul cÃ¢mp care conÅ£ine o valoare de metadate. Lista va fi sortatÄ dupÄ acest element numai dacÄ nu este folosit -sort. DacÄ nu este specificatÄ nicio metadatÄ, atunci toate documentele vor fi incluse Ã®n listÄ, altfel doar documentele care conÅ£in o valoare a metadatelor va fi inclusÄ.  
+
+SimpleList.sort:CÃ¢mpuri de metadate dupÄ care se poate face sortarea. FolosiÅ£i â-sort nosortâ pentru a preciza nesortarea.  
+
+Phind.desc:Produce o ierarhie a frazelor gÄsite Ã®n text, care este navigabilÄ prin intermediul unui applet.  
+
+Phind.language:Limba sau limbile folosite pentru a construi o ierarhie. Limbile sunt identificate printr-un cod format din douÄ litere pentru fiecare Å£arÄ, precum en pentru englezÄ, es pentru spaniolÄ, etc. Limba este o expresie regulatÄ precum Ã®n 'en|fr' (englezÄ sau francezÄ) and '..' (potriveÅte cu oricare limbÄ).  
+
+Phind.min_occurs:NumÄrul minim de apariÅ£ii al unei fraze Ã®n text pentru a fi inclusÄ Ã®n ierarhia frazeologicÄ.  
+
+Phind.savephrases:DacÄ este setat, informaÅ£ia despre frazÄ va fi stocatÄ Ã®n fiÅierul dat ca Åi text. Poate cÄ este o idee bunÄ utilizarea unei cÄi absolute.  
+
+Phind.suffixmode:Parametrul smode al programului de extragere a frazelor. O valoare 0 Ã®nseamnÄ cÄ toate cuvintele semnal (stopwords) vor fi ignorate iar valoarea 1 va indica folosirea tuturor acestora.  
+
+Phind.text:Textul utilizat pentru construcÅ£ia ierarhiei frazei.  
+
+Phind.thesaurus:Numele tezaurului stocat Ã®n format Phind Ã®n directorul etc al colecÅ£iei.  
+
+Phind.title:CÃ¢mpul de metadate folosit pentru a descrie fiecare document.  
+
+Phind.untidy:Nu eliminaÅ£i fiÅierele de lucru.  
+
+RecentDocumentsList.desc:Clasificator care dÄ o listÄ de documente nou adÄugate sau modificate.  
+
+RecentDocumentsList.include_docs_added_since:Include doar documentele modificare sau adÄugate dupÄ data specificatÄ (Ã®n format yyyymmdd sau Ã®n format yyyy-mm-dd).  
+
+RecentDocumentsList.include_most_recently_added:IncludeÅ£i doar numÄrul specificat a celor mai recent adÄugate documente. Este utilizat dacÄ nu este specificat include_docs_added_since.  
+
+RecentDocumentsList.sort:Metadate pentru sortarea Listei. DacÄ nu sunt specificate, lista va fi sortatÄ dupÄ data modificÄrii/adÄugÄrii.  
+
+SectionList.desc:La fel precum Clasificatorul de ListÄ doar cÄ include toate secÅ£iunile unui document (excluzÃ¢nd nivelul vÃ¢rfului) mai mult decÃ¢t doar nivelul superior al documentului Ã®n sine.  
+
+Collage.desc:Un applet este utilizat pentru a afiÅa un colaj de imagini gÄsite Ã®n colecÅ£ie.  
+
+Collage.geometry:Dimensiunile spaÅ£iului pentru Colaj. Pentru un spaÅ£iu de 600 de pixeli lungime pe 400 de pixeli Ã®nÄlÅ£ime, de exemplu, se specificÄ o geometrie de 600x400  
+
+Collage.maxDepth:Imaginile care intrÄ Ã®n colaje sunt extrase prin oglindirea clasificatorului de navigare de substrat. Acest lucru controleazÄ adÃ¢ncimea maximÄ al procesului de oglindire (mirroring).  
+
+Collage.maxDisplay:NumÄrul maxim de imagini pentru a fi afiÅate Ã®n colaj Ã®n orice moment.  
+
+Collage.imageType:Utilizat pentru controlul cÄror tipuri de fiÅiere sunt utilizate Ã®n colaj, prin exprimarea numelor extensiilor. O listÄ de nume de fiÅiere ale extensiilor este separatÄ prin simbolul (%%).  
+
+Collage.bgcolor:Culoarea de fond specificatÄ Ã®n formÄ hexazecimalÄ (de exemplu #008000 are ca efect o culoare verde frumoasÄ precum a pÄdurii).  
+
+Collage.buttonname:Eticheta pentru ecranul de clasificare Åi a butonului din bara de navigare.  
+
+Collage.refreshDelay:FrecvenÅ£a de reÃ®mprospÄtare a ecranului Ã®n milisecunde.  
+
+Collage.isJava2:Utilizat pentru a controla care dintre clasele run-time ale Java sunt utilizate. Versiuni mai complete de Java (de la Java 1.2 Ã®n sus) includ asistenÅ£Ä mai sofisticatÄ pentru a controla transparenÅ£a imaginilor, acest marcator ajutÄ la controlul a aceea ce se Ã®ntÃ¢mplÄ Åi oricum run-time-ul existent Ã®n anumite browsere este la versiunea 1.1. Appletul este proiectat din start pentru a autodetecta ce versiune de Java ruleazÄ Ã®n browser Åi pentru a se ajusta Ã®n acord.  
+
+Collage.imageMustNotHave:Utilizat pentru a elimina imaginile care nu ar trebui sÄ aparÄ Ã®n colaj, precum imaginile butoanelor care alcÄtuiesc bara de navigaÅ£ie.  
+
+Collage.caption:Etichete explicative opÅ£ionale pentru a fi afiÅate mai jos de spaÅ£iul colaÅ£iunii.  
+
+
+#
+# Plugin option descriptions
+#
+AcronymExtractor.adding:adÄugare  
+
+AcronymExtractor.already_seen:care a mai fost vÄzutÄ  
+
+
+
+AcronymExtractor.done_acronym_extract:am terminat de extras acronimele.  
+
+AcronymExtractor.done_acronym_markup:am fÄcut marcajul pentru acronime.  
+
+AcronymExtractor.extract_acronyms:Extrage acronimele din text Åi le transpune ca metadate.  
+
+AcronymExtractor.extracting_acronyms:extragerea acronimelor  
+
+AcronymExtractor.marking_up_acronyms:alcÄtuirea acronimelor  
+
+AcronymExtractor.markup_acronyms:AdÄugaÅ£i metadate pentru acronime Ã®n textul documentului.  
+
+ArchivesInfPlugin.desc:Extensie care parcurge o arhivÄ recursiv fiÅierul archives.inf (de exempolu, fiÅierul generat Ã®n directorul arhivei atunci cÃ¢nd a fost fÄcut un import), procesÃ¢nd fiecare fiÅier Ã®ntÃ¢lnit.  
+
+
+
+AutoExtractMetadata.extracting:extragere  
+
+AutoExtractMetadata.first:O listÄ separatÄ prin virgule a primelor dimensiuni pentru extragerea lor din text Ã®ntr-un cÃ¢mp de metadate. CÃ¢mpul de numeÅte 'FirstNNN'.  
+
+
+
+BasePlugin.associate_ext:Are ca efect ca fiÅierele care au aceeaÅi nume de fiÅier rÄdÄcinÄ ca Åi documentul Ã®n curs de procesare de cÄtre extensie Åi o numele unei extensii dintr-o listÄ separatÄ prin virgule furnizatÄ de acest argument, sÄ fie asociatÄ cu documentul Ã®n curs de procesare decÃ¢t mÃ¢nuirea lor ca o listÄ separatÄ.  
+
+
+
+BasePlugin.block_exp:FiÅierele care se potrivesc cu aceastÄ expresie regulatÄ vor fi blocate Ã®n a fi pasate oricÄror alte extensii succesive din listÄ. Acest lucru nu are un efect real altul decÃ¢t cel al prevenirii apariÅ£iei a unei mulÅ£imi de mesaje de avertizare privind fiÅierele intrate, care nu au relevanÅ£Ä pentru dumneavoastrÄ. Fiecare extensie poate avea un block_exp de start. De exemplu, din start HTMLPlug blocheazÄ orice fiÅier care are extensiile .gif, .jpg, .jpeg, .png sau .css.  
+
+BasePlugin.desc:Clasa de bazÄ pentru toate extensiile destinate importului.  
+
+BasePlugin.dummy_text:Acest document nu are text.  
+
+BasePlugin.encoding.ascii:ASCII pe 7 biÅ£i. Acesta poate fi ceva mai rapid decÃ¢t folosirea lui iso_8859_1. FiÅ£i atenÅ£i la folosirea acestuia asupra unei colecÅ£ii de documente care pot conÅ£ine caractere Ã®n afara setului pe 7 biÅ£i ASCII (de exemplu, documentele germane sau franceze conÅ£in accente). Ãn cazul existenÅ£ei unor astfel de documente, folosiÅ£i iso_8859_1.  
+
+BasePlugin.encoding.unicode:Doar unicode.
+
+BasePlugin.encoding.utf8:Fie utf8, fie unicode -- detectat automat.  
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+BasePlugin.no_cover_image:Nu cÄutaÅ£i un fiÅier prefix.jpg (acolo unde prefixul este acelaÅi prefix ca fiÅierul care este procesat) Åi asociaÅ£i-l ca imagine a coperÅ£ii.  
+
+
+
+BasePlugin.process_exp:O expresie regulatÄ perl care se potriveÅte cu numele fiÅierelor. FiÅierele care se potrivesc vor fi procesate de cÄtre acest plugin. De exemplu, folosirea  lui '(?i).html?\$' potriveÅte toate documentele care se terminÄ cu .htm sau .html (sunt case-insensitive).  
+
+BasePlugin.smart_block:BlocheazÄ fiÅierele Ã®ntr-un mod mai inteligent decÃ¢t dupÄ numele fiÅierelor.  
+
+BasePlugin.stems:rÄdÄcini  
+
+
+
+
+
+
+
+
+
+BibTexPlugin.desc:BibTexPlug citeÅte fiÅierele bibliografice Ã®n format BibTex. BibTexPlug creazÄ un document obiect pentru fiecare referinÅÄ din fiÅier. Acesta este o subclasÄ a lui SplitPlug, astfel cÄ, Ã®n cazul existenÅ£ei a mai multor Ã®nregistrÄri, toate acestea sunt citite.  
+
+BookPlugin.desc:CreazÄ un document multi-nivel din elementele de nivel <<TOC>>. Metadatele pentru fiecare secÅ£iune sunt recoltate din oricare alte taguri aflate pe acelaÅi nivel cu <<TOC>>; de exemplu, <<Title>>xxxx<</Title>> furnizeazÄ metadatele pentru Titlu. orice altceva Ã®ntre tagurile TOC este creat ca Åi cod html simplu (adicÄ nu sunt procesate linkurile html sau orice alt material caracteristic pentru HTMLPlug). Se aÅteaptÄ ca fiÅierele de intrare sÄ aibe extensia .hb din start (acest lucru poate fi modificat prin adÄugarea unei opÅ£iuni -process_exp unui fiÅier care are are acelaÅi nume ca fiÅierul hb iar o extensie .jpg este preluatÄ ca fiind imaginea coperÅ£ii (fiÅierele jpg sunt blocate de acest plugin). BookPlug reprezintÄ o simplificare (Åi extensie) a HBPlug utilizat de colecÅ£iile Humanity Library. BookPlug este mai rapid Åi aÅteaptÄ ca fiÅierele de intrare sÄ fie mai curate (IntrÄrile Ã®n colecÅ£iile HDL conÅ£in o mulÅ£ime de taguri html Ã®n jurul tagurilor <<TOC>>, foloseÅte tagurile <<I>> pentru a specifica imaginile Åi pentru a lua pur Åi simplu tot textul dintre tagurile  <<TOC>> iar debutul textului sÄ fie metadatele Titlu). DacÄ se marcheazÄ documentele care trebuie afiÅate Ã®n aceeaÅi manierÄ precum colecÅ£iile HDL, utilizaÅ£i extensia Ã®n locul lui HBPlug.  
+
+
+
+ConvertBinaryFile.apply_fribidi:RulaÅ£i Algoritmul Unicode BidirecÅ£ional âfribidiâ peste fiÅierul convertit (pentru textul de la dreapta la stÃ¢nga).  
+
+ConvertBinaryFile.convert_to:Extensia converteÅte Ã®n TEXT sau HTML sau diversele tipuri de imagini (de exemplu JPEG, GIF, PNG).  
+
+ConvertBinaryFile.convert_to.auto:Selectarea automatÄ a formatului acoperit. Alegerea formatului depinde de tipul documentului introdus, de exemplu Word va fi convertit automat la HTML, iar PowerPoint va fi convertit Ã®n formatul Greenstone PagedImage.  
+
+ConvertBinaryFile.convert_to.html:Format HTML.  
+
+ConvertBinaryFile.convert_to.text:Formatul de text plat.  
+
+
+
+ConvertBinaryFile.convert_to.pagedimg_jpg:Format JPEG.  
+
+ConvertBinaryFile.convert_to.pagedimg_gif:Formatul GIF.  
+
+ConvertBinaryFile.convert_to.pagedimg_png:formatul PNG.  
+
+ConvertBinaryFile.desc:AceastÄ extensie este moÅtenitÄ de alte extensii precum WordPlug, PPTPlug, PSPlug, RTFPlug Åi PDFPlug. Are rolul de a facilita conversia acestor tipuri de documente fie Ã®n HTML sau TEXT sau o serie de imagini. Modul de lucru este prin Ã®ncÄrcarea dinamicÄ a unei extensii secundare corespunzÄtoare (HTMLPlug, StructuredHTMLPlug, PagedImgPlug sau TEXTPlug) bazate pe argumentul extensiei 'convert_to'.  
+
+ConvertBinaryFile.keep_original_filename:DecÃ¢t sÄ convertiÅ£i Ã®n formatul doc.pdf, doc.doc, mai bine Å£ineÅ£i numele fiÅierului original pentru fiÅierele asociate.  
+
+ConvertBinaryFile.use_strings:DacÄ este setat, va fi apelatÄ o funcÅ£ie pentru stringuri simple pentru a extrage text dacÄ utilitarul de conversie eÅueazÄ Ã®n aceastÄ operaÅ£iune.  
+
+ConvertToRogPlugin.desc:O extensie care moÅteneÅte din RogPlug.  
+
+CSVPlugin.desc:O extensie pentru fiÅierele Ã®n format csv - comma-separated value. Va fi creat un nou document pentru fiecare linie a fiÅierului.  
+
+
+
+DateExtractor.extract_historical_years:Extrage informaÅ£ii privind perioade de timp din documentele istorice. Acestea sunt stocate ca metadate Ã®n cadrul documentului. ExistÄ o interfaÅ£Ä de cÄutare pentru aceste metadate, care poate fi inclusÄ Ã®n colecÅ£ia proprie prin adÄugarea enunÅ£ului âformat QueryInterface DateSearchâ Ã®n fiÅierul de configurare al colecÅ£iei.  
+
+DateExtractor.maximum_century:Numele maxim al secolului care poate fi extras ca metadate istorice (de exemplu 14 are ca rezultat extragerea tuturor referinÅ£elor pÃ¢nÄ Ã®n secolul al paisprezecelea).  
+
+DateExtractor.maximum_year:Data istoricÄ maximÄ pentru a fi folositÄ ca metadate (precum Era noastrÄ - 1950).  
+
+DateExtractor.no_bibliography:Nu Ã®ncercaÅ£i sÄ blocaÅ£i datele din Ã®nregistrÄrile bibliografice atunci cÃ¢nd extrageÅ£i date istorice.  
+
+DirectoryPlugin.desc:Extensia RecPlug este un plugin care are un comportament recursiv printre directoare procesÃ¢nd fiecare fiÅier Ã®ntÃ¢lnit.  
+
+DirectoryPlugin.recheck_directories:DupÄ ce au fost procesate fiÅierele dintr-un director de import, se va reciti directorul pentru a se decoperi oricare alte fiÅiere noi create.  
+
+DirectoryPlugin.use_metadata_files:(DEPÄÅIT - Ãn schimb, adaugÄ MetadataXMLPlug la lista de extensii) CiteÅte metadatele din fiÅiere XML.  
+
+DatabasePlugin.desc:O extensie care importÄ Ã®nregistrÄri dintr-o bazÄ de date. Acesta utilizeazÄ modulul perl DBI, care include back-ends pentru mysql, postgresql, valori separate prin virgulÄ (CVS), MS Excel, ODBC, sybase, etc... Modulele suplimentare pot sÄ aibe nevoie de instalare pentru a-l utiliza acesta. Vezi Åi <GSDLHOME>/etc/packages/example.dbi pentru exemplul de fiÅier de configurare.  
+
+DSpacePlugin.desc:DSpacePlug ia o colecÅ£ie de documente exportate din DSpace Åi o importÄ Ã®n Greenstone.  
+	
+DSpacePlugin.first_inorder_ext:Este folosit pentru a identifica streamul primar al uni document aparÅ£inÃ¢nd unei colecÅ£ii DSpace. Cu aceastÄ opÅ£iune, sistemul va trata tipurile ext definite secvenÅ£ial pentru a cÄuta posibilul stream primar.  
+
+DSpacePlugin.first_inorder_mime:Sunt folosite pentru a identifica streamul de date primar al unui document al unei colecÅ£ii DSpace. Cu aceastÄ opÅ£iune, sistemul va trata tipurile de fiÅiere definite secvenÅ£ial pentru a identifica posibilul stream primar.  
+
+DSpacePlugin.only_first_doc:Aceasta este utilizatÄ pentru a identifica fluxul primar de date al documentului reprezentÃ¢nd o colecÅ£ie DSpace. AvÃ¢nd aceastÄ opÅ£iune, sistemul va trata primul document din fiÅierul de metadate dublin_core ca fiind primul flux primar posibil.  
+
+
+
+EmailAddressExtractor.done_email_extract:s-a Ã®ncheiat extragerea adreselor de email.  
+
+EmailAddressExtractor.extracting_emails:extrag adresele de email  
+
+EmailAddressExtractor.extract_email:Extragerea adreselor de email ca metadate.  
+
+EmailPlugin.desc:Extensia pentru emailuri. Emailurile sunt numite cu un simplu numÄr (aÅa cum apar ele Ã®n directoarele de mailing) sau cu extensia .mbx (de la mbox mail file format).\nTextul documentului: textul documentului constÄ din tot textul de dupÄ prima linie goalÄ din document.\nMetadatele (nu Åi Dublin Core!):\n\t\$Headere      Tot conÅ£inutul headerului (opÅ£ional, nu este stocat implicit)\n\t\$Subject      Subject: header\n\t\$To           To: header\n\t\$From         From: header\n\t\$FromName
+
+EmailPlugin.no_attachments:Nu salva ataÅamentele mesajelor.  
+
+EmailPlugin.headers:StocaÅ£i headere email ca metadate "Headers".  
+
+
+
+EmailPlugin.split_exp:O expresie regulatÄ utilizatÄ pentru a desface fiÅierele care conÅ£in multe mesaje Ã®n documentele individuale.  
+
+ExcelPlugin.desc:O extensie pentru importul fiÅierelor MS Excel (versiunile 95 Åi 97).  
+
+
+
+FOXPlugin.desc:Extensie pentru procesarea fiÅierelor dbt Foxbase. AceastÄ extensie furnizeazÄ funcÅ£ionalitÄÅ£i de bazÄ pentru a citi fiÅierele dbt Åi dbf Åi pentru a procesa fiecare Ã®nregistrare. AceastÄ extensie generalÄ ar trebui suprascrisÄ pentru o anume bazÄ de date pentru a procesa cÃ¢mpurile corespunzÄtoare din fiÅier.  
+
+GreenstoneXMLPlugin.desc:ProceseazÄ documente de arhivÄ XML ale Greenstone. Trebuie notat cÄ aceastÄ extensie nu face nicio verificare a sintaxei (prin intermediul modulului XML::Parser, modulul testeazÄ conformitatea). Se presupune cÄ fiÅierele de arhivÄ Greenstone sunt conforme cu DTD-ul aferent.  
+
+GISExtractor.desc:Clasa de bazÄ on-the-side al lui BasPlug care suportÄ capabilitÄÅ£i GIS  
+
+GISExtractor.extract_placenames:Extrage toponimele din text Åi le va seta ca metadate. NecesitÄ preinstalarea extensiei GIS pentru Greenstone.  
+
+GISExtractor.gazetteer:Gazetteer folosit pentru a extrage toponime din text Åi pentru a le seta ca metadate. NecesitÄ extensia GIS Ã®n Greenstone.  
+
+GISExtractor.place_list:La momentul extragerii amplasamentelor sunt incluse o lustÄ de toponime la Ã®nceputul documentului. NecesitÄ instalarea Ã®n prealabil al extensiei GIS pentru Greenstone.  
+
+HBPlugin.desc:O extensie care proceseazÄ directorul unei cÄrÅ£i Ã®n format HTML. AceastÄ extensie este folositÄ de colecÅ£iile Humanity Library Åi nu gestioneazÄ coduri de input altele decÃ¢t ascii sau ascii extins. Acest cod este cam âurÃ¢tâ Åi poate fi optimizat fÄrÄ discuÅ£ii. Doresc sÄ Ã®ncurajez oamenii sÄ-Åi construiascÄ colecÅ£iile mai bine cu extensia HBSPlug ;-)\n\nUtilizaÅ£i HBSPlug dacÄ construiÅ£i noi colecÅ£ii Åi alcÄtuiÅ£i fiÅiere precum cele ale colecÅ£iilor Humanity Library. HBSPlug acceptÄ toate codurile de input, dar are pretenÅ£ia ca marcajul HTML sÄ fie mai curat decÃ¢t cel folosit de colecÅ£iile Humanity Library  
+
+
+
+HTMLImagePlugin.aggressiveness:Gama tehnicilor de extragere a textului Ã®nrudit folosite.  
+HTMLImagePlugin.aggressiveness.1:Numele fiÅierului, cale Åi doar textul pentru ALT.  
+HTMLImagePlugin.aggressiveness.2:Toate cele 1 plus etichetele explicative acolo unde sunt disponibile.  
+HTMLImagePlugin.aggressiveness.3:Cele 2 plus paragrafele care urmeazÄ acolo unde sunt disponibile.  
+HTMLImagePlugin.aggressiveness.4:Toate cele 3 plus headerele anterioare (<h1>, <h2>...) acolo unde sunt disponibile.  
+HTMLImagePlugin.aggressiveness.5:Toate 4 plus referinÅ£ele textuale acolo unde acestea sunt disponibile.  
+HTMLImagePlugin.aggressiveness.6:Toate cele 4, plus metatagurile paginii (titlu, keywords, etc).  
+HTMLImagePlugin.aggressiveness.7:Toate cele 6, 5 Åi 4 combinate.  
+HTMLImagePlugin.aggressiveness.8:Toate cele 7 plus repetarea titlului (caption), numele fiÅierului, etc (ridicÄ ierarhic cele mai relevante rezultate).  
+HTMLImagePlugin.aggressiveness.9:Toate cele 1 plus textul integral al paginii sursÄ.  
+
+HTMLImagePlugin.caption_length:Dimensiunea maximÄ a etichetelor explicative (folosind caractere).  
+
+HTMLImagePlugin.convert_params:Parametri adiÅ£ionali pentru conversiunea ImageMagicK la momentul creÄrii imaginilor miniaturÄ (thumbnails). De exemplu, '-raise' va da un efect tridimensional imaginilor miniaturÄ.  
+
+HTMLImagePlugin.desc:O extensie pentru extragerea imaginilor Åi a textului asociat din paginile web.  
+
+HTMLImagePlugin.document_text:AdaugÄ text la imagine ca document:text (altfel, se foloseÅte cÃ¢mpul de metadate IndexedText).  
+
+HTMLImagePlugin.index_pages:IndexaÅ£i paginile Ã®mpreunÄ cu imaginile. Altfel, referenÅ£iaÅ£i paginile cÄtre sursa URL.  
+
+HTMLImagePlugin.max_near_text:NumÄrul maxim de caractere apropiat imaginilor pentru a fi extras.  
+
+HTMLImagePlugin.min_height:Pixeli. Sari peste imaginile mai mici de atÃ¢t.  
+
+HTMLImagePlugin.min_near_text:Minimul de caractere al textului din proximitate sau eticheta descriptivÄ pentru a fi extrasÄ.  
+
+HTMLImagePlugin.min_size:Bytes. Treci peste imaginile mai mici decÃ¢t atÃ¢t.  
+
+HTMLImagePlugin.min_width:Pixeli. TreceÅ£i peste imaginile mai mici de atÃ¢t.  
+
+HTMLImagePlugin.neartext_length:Lungimea Å£intei textlui adiacent (Ã®n caractere).  
+
+HTMLImagePlugin.no_cache_images:Nu prestocaÅ£i imagini (indicaÅ£i URL-ul originalului).  
+
+HTMLImagePlugin.smallpage_threshold:Imaginile din paginÄ mai mici decÃ¢t atÃ¢t (bytes) li se vor adÄuga metadatele (title, keywords, etc).  
+
+HTMLImagePlugin.textrefs_threshold:Pragul pentru referinÅ£ele textuale. Valorile mici Ã®nseamnÄ cÄ algoritmul este mai puÅ£in strict.  
+
+HTMLImagePlugin.thumb_size:Dimensiunea maximÄ a imaginii miniaturÄ (thumbnail). Se specificÄ lÄÅ£imea Åi Ã®nÄlÅ£imea deopotrivÄ.  
+
+HTMLPlugin.assoc_files:Expresii regulate Perl ale extensiilor fiÅierelor care pot fi asociate cu documentele html.  
+
+HTMLPlugin.desc:AceastÄ extensie proceseazÄ fiÅiere HTML  
+
+HTMLPlugin.description_tags:Sparge documentul Ã®n subsecÅ£iuni acolo unde apar tagurile <Section>. '-keep_head' nu va avea niciun efect atunci cÃ¢nd este setatÄ aceastÄ opÅ£iune.  
+
+HTMLPlugin.extract_style:ExtrageÅ£i  informaÅ£ii privind stilurile Åi scripturile din tagul <head> al codului HTML Åi salvaÅ£i-l ca metadate DocumentHeader. Acesta va fi setat Ã®n pagina documentului ca Åi _document:documentheader_ macro.  
+
+HTMLPlugin.file_is_url:Setat dacÄ fiÅierele intrate exhibÄ url-ul documentului sursÄ original, de exemplu dacÄ un instrument de mirroring a fost folosit pentru a crea structura de directorului de import.  
+
+HTMLPlugin.hunt_creator_metadata:CÄutaÅ£i cÃ¢t mai multe metadate posibile privind autorii Åi plasaÅ£ile Ã®n cÃ¢mpul 'Creator'.  
+
+HTMLPlugin.keep_head:Nu elimina headerele din fiÅierele html.  
+
+HTMLPlugin.metadata_fields:O listÄ de cÃ¢mpuri de metadate separatÄ prin virgule care se doreÅte a fi extrasÄ. UtilizaÅ£i 'tag<tagname>' pentru a avea conÅ£inutul primei perechi <tagname> pus Ã®ntr-un element de metadate numit 'tagname'. CapitalizaÅ£i aceasta dacÄ doriÅ£i metadatele sÄ fie capitalizate Ã®n Greenstone pentru cÄ oricum extragerea tagurilor nu este sensibilÄ la mÄrimea caracterului.  
+
+HTMLPlugin.no_metadata:Nu Ã®ncercaÅ£i sÄ extrageÅ£i nicio metadatÄ din fiÅiere.  
+
+HTMLPlugin.no_strip_metadata_html:ListÄ de nume de metadate separate sau 'toate'. UtilizatÄ cu -description_tags are ca efect prevenirea pierderii tagurilor HTML din valorile pentru metadatele specificate.  
+
+HTMLPlugin.nolinks:Nu Ã®ncercaÅ£i sÄ capturaÅ£i linkuri (setarea acestui marcator vÄ poate Ã®mbunÄtÄÅ£i viteza de construcÅ£ie/import, dar oricare linkuri relative din cadrul documentului vor fi pierdute).  
+
+
+
+HTMLPlugin.rename_assoc_files:RedenumeÅte fiÅierele asociate cu documente (de exemplu imaginile). De asemenea, creeazÄ o structurÄ de directoare mult mai joasÄ (util atunci cÃ¢nd sunt create colecÅ£iile care merg pe cd-rom).  
+
+HTMLPlugin.sectionalise_using_h_tags:CreaÅ£i automat un document alcÄtuit pe secÅ£iuni folosind tagurile h1, h2, ... hX.  
+
+HTMLPlugin.title_sub:Expresie de substituire pentru a modifica stringul stocat ca Titlu. Utilizat, de exemplu, pentru PDFPlug pentru a elimina "Page 1", etc din text Åi care este utilizat ca titlu.  
+
+HTMLPlugin.tidy_html:DacÄ este setat, converteÅte un document HTML Ã®ntr-un document XHTML bine format. Permite utilizatorilor sÄ vadÄ documentul Ã®n format carte.  
+
+HTMLPlugin.old_style_HDL:Pentru a marca dacÄ fiÅierul din aceastÄ colecÅ£ie este Ã®ncadrat unei secÅ£iuni utilizÃ¢nd vechiul stil de secÅ£iune HDL.  
+
+
+
+ImageConverter.converttotype:ConverteÅte imaginea principalÄ la formatul 's'.  
+
+
+
+
+ImageConverter.desc:AceastÄ extensie proceseazÄ imagini adÄugÃ¢nd metadate de bazÄ.  
+
+
+
+ImageConverter.minimumsize:IgnorÄ imaginile mai mici de n byte.  
+
+
+
+ImageConverter.noscaleup:Nu modificaÅ£i dimensiunea imaginilor de micÄ dimensiune atunci cÃ¢nd generaÅ£i imaginile miniaturÄ (thumbnails).  
+
+ImageConverter.screenviewsize:Se fac imagini pentru ecran de dimensiunea nxn.  
+
+ImageConverter.screenviewtype:FaceÅ£i capturi de ecran Ã®n format 's'.  
+
+ImageConverter.thumbnailsize:FaceÅ£i imagini miniaturÄ de dimensiunea nxn.  
+
+ImageConverter.thumbnailtype:Se fac miniaturile (thumbnails) Ã®n formatul 's'.  
+
+
+
+ImagePlugin.desc:AceastÄ extensie proceseazÄ imagini adÄugÃ¢nd metadate de bazÄ.  
+
+IndexPlugin.desc:AceastÄ extensie recursivÄ proceseazÄ un fiÅier index.txt. FiÅierul index.txt ar trebui sÄ conÅ£inÄ o listÄ de fiÅiere care sÄ fie incluse Ã®n colecÅ£ie urmate de metadate suplimentare care sÄ fie asociate cu fiecare fiÅier.\n\nFiÅierul index.txt ar trebui formatat dupÄ cum urmeazÄ: Prima linie ar trebui sÄ fie o cheie (porniÅ£i cu o cheie:) pentru a denumi cÃ¢mpurile de metadate (de exemplu, cheia: Subject Organization Date). UrmÄtoarele linii vor conÅ£ine un nume de fiÅier urmat de valoarea cu care trebuie sÄ fie setat elementul de metadate. (de exemplu, âirma/iw097e 3.2 unesco 1993â va asocia metadatele Subiect=3.2, OrganizaÅ£ie=unesco, Åi Data=1993 cu fiÅierul irma/iw097e dacÄ a fost utilizatÄ cheia de mai sus)\n\nTrebuie remarcat cÄ dacÄ oricare dintre cÃ¢mpurile de metadate utilizaeazÄ extensia de clasificator al Ierarhiei, atunci valoarea cu care sunt setate ar trebui sÄ corespundÄ cu primul cÃ¢mp (descriptorul) Ã®n fiÅierul de clasificare corespunzÄtor.\n\nValorile de Metadate pot fi numite separat folosindu-se un tag (de exemplu, <Subiect>3.2) iar aceasta va avea ca efect suprascrierea oricÄrui nume dat acestora prin linia cheie. DacÄ nu existÄ nicio linie cheie, oricare metadate care nu au fost denumite, vor fi numite âSubiectâ.  
+
+ISISPlugin.desc:AceastÄ extensie proceseazÄ bazele de date CDS/ISIS. Pentru fiecare bazÄ de date CDS/ISIS procesatÄ, trebuie sÄ existe trei fiÅiere Ã®n directorul de import al colecÅ£iei: fiÅiere Master (.mst), Field Definition Table (.fdt) Åi Cross-Reference File (.xrf).  
+
+ISISPlugin.subfield_separator:Stringul folosit pentru separarea subcÃ¢mpurilor Ã®n baza de Ã®nregistrÄri CDS/ISIS.  
+
+ISISPlugin.entry_separator:Stringul folosit pentru a separa valorile multiple care sÄ foloseascÄ cÃ¢mpurilor unice de metadate Ã®n cazul Ã®nregistrÄrilor CDS/ISIS.  
+
+
+
+KeyphraseExtractor.extract_keyphrases:Extrage automat frazele cheie cu ajutorul Kea (setÄrile implicite).  
+
+KeyphraseExtractor.extract_keyphrases_kea4:Extragerea frazelor cheie automat cu Kea 4.0 (setÄrile implicite). Kea 4.0 este o versine nouÄ de Kea care a fost dezvoltatÄ pentru a controla indexarea documentelor din domeniul agriculturii.  
+
+KeyphraseExtractor.extract_keyphrase_options:OpÅ£iuni pentru extragerea frazelor-cheie cu Kea. De exemplu: mALIWEB - foloseÅte modelul de extragere ALIWEB; n5 - extrage 5 frazÄ-cheie;, eGBK - foloseÅte codarea GBK.  
+
+KeyphraseExtractor.keyphrases:fraze cheie  
+
+KeyphraseExtractor.missing_kea:Eroare: Software-ul Kea nu a putut fi gÄsit la %s. VÄ rugÄm sÄ descÄrcaÅ£i %s Kea de la http://www.nzdl.org/Kea Åi instalaÅ£i-l Ã®n acest director.  
+
+LaTeXPlugin.desc:Extensie pentru documente LaTeX.  
+
+LOMPlugin.desc:Extensie pentru importarea fiÅierelor LOM (Learning Object Metadata).  
+
+LOMPlugin.root_tag:DocType-ul fiÅierului XML (sau o expresie regulatÄ care se potriveÅte elementului rÄdÄcinÄ).  
+
+LOMPlugin.check_timestamp:VerificÄ marcajele temporale (timestamps) a fiÅierelor descÄrcate anterior Åi descÄrcaÅ£i doar dacÄ fiÅierul sursÄ este mai nou.  
+
+LOMPlugin.download_srcdocs:DescÄrcaÅ£i documentul susrsÄ dacÄ este specificat unul (Ã®n general^identifier^entry sau technical^location). AceastÄ opÅ£iune ar trebui sÄ specifice o expresie regulatÄ pentru a potrivi numele fiÅierelor Ã®nainte de a fi descÄrcate. Trebuie spus cÄ aceastÄ funcÅ£ionalitate nu lucreazÄ pentru documentele aflate Ã®n afara unui firewall.  
+
+MARCPlugin.desc:Extensie pentru suportul MARC.  
+
+MARCPlugin.metadata_mapping:Numele fiÅierului care include detaliile de mapare din valorile MARC cÄtre numele metadatelor Greenstone. Au fost gÄsite setÄrile implicite Ã®n 'marctodc.txt' din directorul etc al siteului.  
+
+MARCXMLPlugin.desc:Extensie MARCXML.  
+
+MARCXMLPlugin.metadata_mapping_file:Numele fiÅierului care include detalii de mapare din valorile MARC pentru numele metadatelor Greenstone. SetÄrile implicite pentru âmarctodc.txtâ se gÄsesc Ã®n directorul etc al site-ului.  
+
+MediaWikiPlugin.desc:Extensie pentru importul paginilor web MediaWiki  
+
+MediaWikiPlugin.show_toc:AdaugÄ la pagina About a paginii 'cuprinsul' (table of contents) al paginii principale a website-ului MediaWiki vizat. Trebuie specificatÄ o expresie regulatÄ Perl mai jos Ã®n toc_exp pentru a corespunde cu secÅ£iunea 'cuprins'.  
+
+MediaWikiPlugin.delete_toc:Återge secÅ£iunea 'table of contents' a fiecÄrei pagini HTML. Trebuie specificatÄ o expresie regulatÄ Perl Ã®n toc_exp mai jos pentru a face potrivirea cu secÅ£iunea 'table of contents'.  
+
+MediaWikiPlugin.toc_exp:Expresie regulatÄ Perl pentru a potrivi cu 'table of content'. Valoarea implicitÄ se potriveÅte cu paginile web generate de MediaWiki.  
+
+MediaWikiPlugin.delete_nav:ÅtergeÅ£i secÅ£iunea de navigare. Trebuie specificatÄ o expresie regulatÄ Perl Ã®n nav_div_exp mai jos.  
+
+MediaWikiPlugin.nav_div_exp:O expresie regulatÄ Perl pentru a se potrivi cu secÅ£iunea de navigare. Valoarea implicitÄ se potriveÅte cu stilul de redactare comun al paginilor MediaWiki.  
+
+MediaWikiPlugin.delete_searchbox:Återge secÅ£iunea de cÄutare. Trebuie sÄ specifice o expresie regulatÄ mai jos Ã®n searchbox_div_exp.  
+
+MediaWikiPlugin.searchbox_div_exp:O expresie regulatÄ care sÄ se potriveascÄ cu secÅ£iunea de cÄutare. Valorile implicite se potrivesc cu cele ale paginilor obisnuite ale MediaWiki.  
+
+MediaWikiPlugin.remove_title_suffix_exp:O expresie regulatÄ Perl pentru a âperiaâ titlul extras. De exemplu, \\s-(.+) va filtra conÅ£inutul titlului dupÄ â-â.  
+
+MetadataCSVPlugin.desc:O extensie pentru metadate Ã®n formatul de valori separate prin virgule. CÃ¢mpul numelui fiÅierului din fiÅierul CSV este utilizat petru a determina cÄrui document aparÅ£in metadatele.  
+
+MetadataPass.desc:O clasÄ de bazÄ On-the-side pentru BasPlug care suportÄ extensii pentru metadate utilizeazÄ o trecere metadata_read a scriptului import.pl  
+
+
+
+GreenstoneMETSPlugin.desc:Procesarea documentelor dupÄ stilul METS Greenstone  
+
+MP3Plugin.desc:Extensie pentru procesarea fiÅierelor MP3.  
+
+MP3Plugin.assoc_images:FolosiÅ£i modulul de cÄutare al imaginilor din Google pentru a gÄsi imaginile legate de fiÅierele MP3 bazate pe ID3 avÃ¢nd metadatele pentru Titlu Åi Artist.  
+
+MP3Plugin.applet_metadata:Utilizat pentru stocarea metadatelor [applet] fiecÄrui document care conÅ£ine codul HTML necesar pentru ca un un applet de redare a fiÅierelor MP3 sÄ-l poatÄ rula.  
+
+MP3Plugin.metadata_fields:O lista de cÃ¢mpuri de metadate separate prin virgule pentru a fi extrase Ã®ntr-un fiÅier MP3 (se presupune cÄ sunt disponibilitÄÅ£ile). FolosiÅ£i \"*\" pentru a extrage toate cÃ¢mpurile.  
+
+NulPlugin.desc:Extensie pentru fiÅiere ÅuÅÄ - dummy (.nul). Utilizat cu fiÅierele produse prin destinderea metadatelor fiÅierelor din bazÄ.  
+
+NulPlugin.assoc_field:Numele cÃ¢mpului de metadate care va fi setat pentru fiecare fiÅier nul.  
+NulPlugin.add_metadata_as_text:AdÄugarea unei tabele de metadate ca text al documentului e mai bine decÃ¢t sÄ te loveÅti de lipsÄ semnalatÄ prin âAcest document nu conÅ£ine textâ.  
+
+NulPlugin.remove_namespace_for_text:EliminaÅ£i namespace-urile pentru numele metadatelor in documentul text (dacÄ este setat add_metadata_as_text)  
+
+OAIPlugin.desc:Extensie de bazÄ pentru Open Archives Initiative (OAI).  
+
+
+
+OggVorbisPlugin.add_technical_metadata:AdaugÄ metadate de ordin tehnic, de exemplu bitrate-ul.  
+
+OggVorbisPlugin.desc:O extensie capabilÄ de a importa fiÅiere audio Ogg Vorbis.  
+
+OpenDocumentPlugin.desc:Extensie pentru formatul OpenDocument al OASIS (utilizat de OpenOffice 2.0)  
+
+PagedImagePlugin.desc:Extensie pentru documentele alcÄtuite dintr-o serie de imagini cu text OCRizat pentru fiecare imagine. AceastÄ extensie proceseazÄ fiÅiere .item, care listeazÄ secvenÅ£a fiÅierelor de text Åi imagine Åi furnizeazÄ metadate.  
+
+PagedImagePlugin.documenttype:SetaÅ£i tipul documentului (utilizat pentru afiÅare)  
+
+PagedImagePlugin.documenttype.paged:Documentele avÃ¢nd pagini au sÄgeÅ£i urmÄtoarea Åi anterior precum Åi o cÄsuÅ£Ä 'mergi la pagina X'  
+
+PagedImagePlugin.documenttype.hierarchy:Documentele ierarhice au un cuprins  
+
+PagedImagePlugin.headerpage:AdÄugaÅ£i headerul de nivel Ã®nalt al unei pagini (care nu conÅ£ine nicio imagine) fiecÄrui document.  
+
+PDFPlugin.allowimagesonly:Permite fiÅiere PDF care nu au text exploatabil (protejat). EvitÄ necesitatea existenÅ£ei unui set complex. Este util doar Ã®n combinaÅ£ie cu convert_to html.  
+
+PDFPlugin.complex:CreaÅ£i rezultate mai complexe. AvÃ¢nd aceastÄ opÅ£iune setatÄ codul html rezultat va arÄta mai mult ca fiÅierul original PDF. Pentru ca acest lucru sÄ funcÅ£ioneze normal ar trebui sÄ aveÅ£i instalat Ghostscript (pentru unixuri gs ar trebui sÄ fie specificat Ã®n cÄi Ã®n timp ce pentru windows trebuie sÄ die specificat Ã®n cÄi gswin32c.exe).  
+
+PDFPlugin.desc:Extensie care proceseazÄ documentele PDF.  
+
+PDFPlugin.nohidden:PreveniÅ£i ca pdftohtml sÄ Ã®ncerce sÄ extragÄ text ascuns. AceastÄ capacitate este utilizabilÄ doar dacÄ este setatÄ opÅ£iunea -complex.  
+
+PDFPlugin.noimages:Nu incercaÅ£i sÄ extrageÅ£i imagini din PDF-uri.  
+
+PDFPlugin.use_sections:CreazÄ o secÅ£iune separatÄ pentru fiecare paginÄ a fiÅierului PDF.  
+
+PDFPlugin.zoom:Factorul de mÄrire al documentului PDF pentru ieÅire (acest lucru este util doar dacÄ -complex este setat).  
+
+PostScriptPlugin.desc:Acesta este convertorul ps Ã®n text \"al sÄracului\". DacÄ este nevoie de mai mult luaÅ£i Ã®n considerare utilizarea pachetului PRESCRIPT, care este disponibil pentru descÄrcare la http://www.nzdl.org/html/software.html  
+
+PostScriptPlugin.extract_date:ExtrageÅ£i date din headerul PS.  
+
+PostScriptPlugin.extract_pages:ExtrageÅ£i paginile din headerul PS.  
+
+PostScriptPlugin.extract_title:Extragerea titlului din headerul PS.  
+
+PowerPointPlugin.desc:O extensie pentru importul fiÅierelor MS PowerPoint.  
+
+PowerPointPlugin.windows_scripting:FolosiÅ£i tehnologia de scripting a lui Microsoft Windows (Visual Basic for Applications) pentru a converti PPT-urile Ã®n diferite tipuri de imagini (de exemplu, JPEG,PNG,GIF) mai degrabÄ decÃ¢t sÄ vÄ bazaÅ£i pe pachetul open source ppttohtml.  
+
+PrintInfo.bad_general_option:Extensia %s utilizeazÄ o opÅ£iune incorectÄ. VerificaÅ£i fiÅierul de configurare collect.cfg.  
+
+
+
+ProCitePlugin.desc:O extensie pentru bazele de date ProCite (exportate)  
+
+
+
+ReadTextFile.could_not_extract_encoding:ATENÅ¢IE: codarea nu a putut fi extrasÄ din %s - se aplicÄ modul implicit la %s  
+
+ReadTextFile.could_not_extract_language:ATENÅ¢IE: nu a putut fi extrasÄ limba din %s - implicit la %s  
+
+ReadTextFile.could_not_open_for_reading:nu a putut fi deschis %s pentru a fi citit  
+
+ReadTextFile.default_encoding:UtilizaÅ£i aceastÄ codare dacÄ -input_encoding este setat pe 'auto' iar argoritmul de categorisire a textului eÅueazÄ Ã®n a extrage schema de codare sau extrage o schemÄ de codare nesuportatÄ de Greenstone. AceastÄ opÅ£iune poate lua aceleaÅi valori ca Åi -input_encoding.  
+
+ReadTextFile.default_language:DacÄ Greenstone eÅueazÄ Ã®n a identifica limba unui document, elementul de metadate 'Language' va fi setat la aceastÄ valoare. Setarea implicitÄ este 'en' (sunt utilizate simbolurile pentru limbÄ specificate de ISO 639: en = English). Trebuie notat cÄ dacÄ nu este setat -input_encoding cu valoarea 'auto' iar -extract_language nu este setat, atunci toate documentele vor avea setul de metadate 'Language' setat cu aceastÄ valoare.  
+
+
+
+ReadTextFile.empty_file:fiÅierul nu conÅ£ine text  
+
+ReadTextFile.extract_language:Identificarea limbii fiecÄrui document, precum Åi setarea metadatelor 'Language'. Trebuie remarcat cÄ acest lucru va fi fÄcut automat dacÄ -input_encoding este setat pe 'auto'.  
+
+ReadTextFile.file_has_no_text:EROARE: %s nu conÅ£ine text  
+
+ReadTextFile.input_encoding:Codarea documentelor sursÄ. Documentele vor fi convertite din aceste codÄri Åi vor fo stocate intern ca utf8.  
+
+ReadTextFile.input_encoding.auto:FoloseÅte algoritmul de categorisire a textului pentru a identifica automat schema de codare a fiecÄrui document sursÄ. AceastÄ procedurÄ va fi mai lentÄ decÃ¢t prin explicarea directÄ a codÄrii, dar va funcÅ£iona acolo unde sunt folosite mai mult de o schemÄ de codare din cadrul aceleiaÅi colecÅ£ii.  
+
+ReadTextFile.read_denied:Citire interzisÄ pentru %s  
+
+ReadTextFile.separate_cjk:Introdu spaÅ£ii Ã®ntre caracterele ChinezeÅti/Japoneze/Coreene pentru a face fiecare caracter un cuvÃ¢nt. FolosiÅ£i dacÄ textul nu este segmentat.  
+
+ReadTextFile.unsupported_encoding:ATENÅ¢IE: %s pare sÄ fie codatÄ cu o codare care nu are suport (%s) - folosind %s  
+
+ReadTextFile.wrong_encoding:ATENÅ¢IE: %s a fost citit folosindu-se codarea %s dar apare codat ca %s.  
+
+ReadXMLFile.desc:Clasa de bazÄ pentru extensiile XML.  
+
+ReadXMLFile.xslt:Transformarea unui document de intrare care s-a potrivit cu XSLT-ul din fiÅierul numit. Este considerat un nume de fiÅier relativ care sÄ existe deja Ã®n zona fiÅierelor colecÅ£iei, de exemplu etc/mods2dc.xsl.  
+
+RealMediaPlugin.desc:O extensie pentru procesarea fiÅierelor Real Media.  
+
+ReferPlugin.desc:ReferPlug citeÅte fiÅierele bibliografice Ã®n format Refer.  
+
+RogPlugin.desc:CreazÄ documente la un nivel unic din fiÅiere .rog sau .mdb.  
+
+RTFPlugin.desc:Extensie pentru importul fiÅierelor Rich text Format (.rtf).  
+
+SourceCodePlugin.desc:Numele fiÅierului este folosit pentru Titlu (opÅ£ional fÄrÄ vreun prefix). Limbile curente:\ntext: READMEs/Makefiles\nC/C++ (extrage #include statements Åi clasele C++ decls)\nPerl    (fÄcut doar ca text)\nShell   (fÄcut doar ca text)  
+
+SourceCodePlugin.remove_prefix:EliminaÅ£i acest Åablon de coordonare din numele fiÅierului (de exemplu, -remove_prefix /tmp/XX/src/). Modul de lucru uzual este de a elimina Ã®ntreaga cale din numele fiÅierului.  
+
+SplitTextFile.desc:SplitPlug este o extensie pentru a sparge fiÅierele intrate Ã®n segmente care vor fi procesate apoi individual. AceastÄ extensie nu ar trebui sÄ fie chematÄ Ã®n mod direct. DacÄ este necesarÄ procesarea fiÅierelor intrate care conÅ£in cÃ¢teva documente, mai bine  scrieÅ£i o extensie care sÄ conÅ£inÄ o funcÅ£ie de procesare care sÄ se ocupe de astfel de documente Åi apoi sÄ o faceÅ£i moÅtenire pentru extensia SplitPlug. Vezi SplitPlug pentru un exemplu.  
+
+SplitTextFile.split_exp:O expresie regulatÄ perl pentru a sparge fiÅierele intrate Ã®n segmente.  
+
+StructuredHTMLPlugin.desc:O extensie pentru procesarea documentelor structurate HTML, spargerea acestora Ã®n secÅ£iuni bazate pe informaÅ£iile de stil.  
+
+StructuredHTMLPlugin.delete_toc:EliminÄ orice cuprins, liste de figuri etc din fiÅierele HTML convertite. Stilurile pentru acestea sunt specificate prin opÅ£iunea toc_header.  
+
+StructuredHTMLPlugin.title_header:Posibile stiluri definite de utilizator pentru titlul headerului.  
+
+StructuredHTMLPlugin.level1_header:stiluri definite de utilizator pentru headerul de nivel1 Ã®n documentul HTML (echivalentul lui <h1>).  
+
+StructuredHTMLPlugin.level2_header:Posibile stiluri definite de utilizatori pentru headerul de nivelul2 Ã®n documentul HTML (echivalent cu <h2>).  
+
+StructuredHTMLPlugin.level3_header:stiluri definite de utilizatori pentru header de nivel 3 Ã®n documentele HTML (echivalent cu <h3>).  
+
+StructuredHTMLPlugin.toc_header:posibile headere definite prin stiluri compuse de utilizator pentru cuprins, tabelul ilustraÅ£iilor, etc,. Ar trebui eliminat dacÄ este setat delete_toc.  
+
+TextPlugin.desc:CreaÅ£i documente simple pe un singur nivel. AdaugÄ metadate Titlu la prima linie de text (pÃ¢nÄ la 100 de caractere lungime).  
+
+TextPlugin.title_sub:Expresia de substituire pentru a modifica stringul stocat ca Titlu. De exemplu se foloseÅte PSPlug pentru a elimina âPagina 1â din textul folosit ca titlu.  
+
+UnknownPlugin.assoc_field:Numele cÃ¢mpului de metadate care conÅ£ine numele fiÅierului asociat.  
+
+UnknownPlugin.desc:Acesta este o extensie simplÄ pentru importarea fiÅierelor Ã®n formate despre care Greenstone nu cunoaÅte detalii. Un document ficÅ£ional va fi creat pentru fiecare dintre  aceste fiÅiere iar fiÅierul Ã®n sine va fi pasat cÄtre Greenstone ca \"fiÅier asociat\" al documentului.  
+
+UnknownPlugin.file_format:Tipul fiÅierului (de exemplu, MPEG, MIDI, ...)  
+
+UnknownPlugin.mime_type:Tipul fiÅierului (mime), de exemplu image/gif.  
+
+UnknownPlugin.process_extension:ProcesaÅ£i fiÅierele cu aceastÄ extensie pentru fiÅiere. AceastÄ opÅ£iune este o alternativÄ la process_exp care este mai simplu de utilizat, dar care este mai puÅ£in flexibil.  
+
+UnknownPlugin.srcicon:SpecificÄ un nume pentru macro (fÄrÄ liniuÅ£e jos) pentru a fi folosite ca metadate srcicon.  
+
+WordPlugin.desc:O extensie pentru importul documentelor Microsoft Word.  
+
+WordPlugin.windows_scripting:FolosiÅ£i tehnologia de scripting Microsoft Windows (Visual Basic for Applications) pentru a determina Wordul sÄ converteascÄ documentele Ã®n HTML, mai degrabÄ decÃ¢t sÄ vÄ bazaÅ£i pe pachetul open source WvWare. Are ca efect deschiderea aplicaÅ£iei Word dacÄ aceasta nu ruleazÄ deja.  
+
+WordPlugin.metadata_fields:Este folosit pentru a extrage metadatele dintr-un document HTML convertit de un script VB. Permite utilizatorilor sÄ defineascÄ o listÄ de cÃ¢mpuri de metadate separate prin virgule pentru a Ã®ncerca sÄ le extragÄ. FoloseÅte 'tag<tagname>' pentru a avea conÅ£inutul primei perechi de taguri <tagname> pusÄ Ã®ntr-un element de metadate numit 'tagname'. PuneÅ£i leterÄ mare acum dacÄ doriÅ£i metadatele sÄ fie cu majuscule Ã®n cadrul Greenstone din moment ce extragerea tagurilor Å£ine cont de dimensiunea caracterelor.  
+
+ZIPPlugin.desc:Extensie care se ocupÄ de formatele comprimate iar dacÄ fiÅierele sunt:\ngzip (.gz, .z, .tgz, .taz)\nbzip (.bz)\nbzip2 (.bz2)\nzip (.zip .jar)\ntar (.tar)\n\nAceastÄ extensie se bazeazÄ pe prezenÅ£a urmÄtoarelor utilitÄÅ£i (dacÄ Ã®ncearcÄ sÄ proceseze formatele corespondente):\ngunzip (pentru gzip)\nbunzip (pentru bzip)\nbunzip2 \nunzip (pentru zip)\ntar (pentru tar)  
+
+#
+# Download module option descriptions
+#
+
+BaseDownload.desc:Clasa de bazÄ pentru modulele de descÄrcare  
+
+MediaWikiDownload.desc:Este un modul pentru descarcarea din siteurile bazate pe MediaWiki  
+MediaWikiDownload.reject_filetype:IgnorÄ lista de url-uri separate prin virgule, de exemplu: *cgi-bin*,*.ppt ignorÄ hyperlinkurile care au ca Åi conÅ£inut fie un fiÅier âcgi-binâ sau â.pptâ  
+MediaWikiDownload.reject_filetype_disp:Lista de URL-uri ignorate. Sunt separate prin virgule.  
+MediaWikiDownload.exclude_directories:Lista directoarelor de excludere (trebuie precizatÄ calea absolutÄ cÄtre directorul respectiv), de exemplu, /people Åi /documentation vor exclude subdirectoarele menÅ£ionate din raza acÅ£iunilor de indexare automatÄ.  
+MediaWikiDownload.exclude_directories_disp:Lista directoarelor care ar trebui excluse separate prin virgule  
+
+OAIDownload.desc:Un modul pentru descÄrcarea din depozitele OAI  
+OAIDownload.url_disp:URL-ul sursÄ  
+OAIDownload.url:URL-ul depozitului OAI  
+OAIDownload.set_disp:Setare  
+OAIDownload.set:RestricÅ£ionaÅ£i descÄrcarea la un set specific din depozit  
+
+
+OAIDownload.get_doc_disp:ObÅ£ine documentul  
+OAIDownload.get_doc:DescÄrcaÅ£i documentul sursÄ dacÄ este specificat unul Ã®n Ã®nregistrare  
+
+
+OAIDownload.max_records_disp:NumÄrul maxim de Ã®nregistrÄri  
+OAIDownload.max_records:NumÄrul maxim de Ã®nregistrÄri pentru a fi descÄrcate  
+
+SRWDownload.desc:Un modul pentru descÄrcarea de pe depozitele SRW (Search/Retrive Web Service)  
+
+WebDownload.desc:Un modul pentru descÄrcarea de pe Internet via HTTP sau FTP  
+WebDownload.url:URL-ul Sursei  
+WebDownload.url_disp:Sursa URL  
+WebDownload.depth:Care este adÃ¢ncimea Ã®n hyperlinkuri la momentul descÄrcÄrii  
+WebDownload.depth_disp:AdÃ¢ncimea de descÄrcare  
+WebDownload.below:Doar fiÅierele oglindite mai jos de acest URL  
+WebDownload.below_disp:Doar fiÅierele oglindÄ de sub acest URL  
+WebDownload.within:Doar fiÅierele oglindite Ã®n cadrul aceluiaÅi site  
+WebDownload.within_disp:Doar fiÅiere mirror din cadrul aceluiaÅi site  
+WebDownload.html_only:DescarcÄ doar fiÅierele HTML Åi ignorÄ fiÅierele asociate, de exemplu imaginile Åi stylesheeturile  
+WebDownload.html_only_disp:DescarcÄ doar fiÅierele HTML  
+
+WgetDownload.desc:Clasa de bazÄ care gestioneazÄ apelurile cÄtre wget (utilitar GNU pentru descÄrcare de pe web)  
+WgetDownload.proxy_on:Proxy pornit  
+WgetDownload.proxy_host:Computer Proxy  
+WgetDownload.proxy_port:Port proxy  
+WgetDownload.user_name:Numele utilizatorului  
+WgetDownload.user_password:Parola utilizatorului  
+
+Z3950Download.desc:Un modul pentru descÄrcarea din depozitele Z3950  
+Z3950Download.host:URL-ul calculatorului gazdÄ  
+Z3950Download.host_disp:Computer gazdÄ  
+Z3950Download.port:NumÄrul portului depozitului  
+Z3950Download.port_disp:Port  
+Z3950Download.database:Baza de date cautÄ Ã®nregistrÄri Ã®n  
+Z3950Download.database_disp:Baza de date  
+Z3950Download.find:Extragerea Ã®nregistrÄrilor care conÅ£in termenii de cÄutare specificaÅ£i  
+Z3950Download.find_disp:CautÄ  
+Z3950Download.max_records:NumÄrul maxim de Ã®nregistrÄri pentru descÄrcare  
+Z3950Download.max_records_disp:Maximum de ÃnregistrÄri  
+
+
+#
+#Plugout option descriptions
+#
+
+BasPlugout.bad_general_option:Plugout-ul %s utilizeazÄ o opÅ£iune incorectÄ.  
+
+BasPlugout.desc:Base class for all the export plugouts.
+BasPlugout.group_size:NumÄrul de documente pentru a fi grupate Ã®ntr-un fiÅier XML.  
+BasPlugout.gzip_output:FolosiÅ£i gzip pentru a comprima documentele xml rezultante (nu uitaÅ£i sÄ includeÅ£i ZIPPlug Ã®n lista extensiilor proprii atunci cÃ¢nd construiÅ£i din documente comprimate).  
+BasPlugout.output_handle:descriptorul fiÅierului folosit pentru a trimite informaÅ£iile conÅ£inute Ã®n rezultate  
+BasPlugout.output_info:referinÅ£a cÄtre un obiect arcinfo utilizat pentru a stoca informaÅ£ii despre arhive.  
+BasPlugout.verbosity:ControleazÄ calitatea rezultatelor. 0=lipsÄ, 3=mai multe.  
+BasPlugout.xslt_file:TransformÄ un document cu XSLT Ã®n numele fiÅierului.  
+
+DSpacePlugout.desc:Formatul de arhivÄ :DSpace.  
+
+
+
+
+
+
+
+
+MARCXMLPlugout.desc:Formatul xml MARC.  
+MARCXMLPlugout.group:Punerea rezultatelor Ã®nregistrÄrilor marc xml Ã®ntr-un singur fiÅier.  
+MARCXMLPlugout.mapping_file:FoloseÅte fiÅierul numit de mapare pentru transformare.  
+
+METSPlugout.desc:Formatul METS care foloseÅte profilul Greenstone.  
+METSPlugout.xslt_txt:TransformÄ un document mets doctxt.xml folosind XSLT Ã®n numele fiÅierului.  
+METSPlugout.xslt_mets:TransformÄ documentul docmets.xml Ã®n formatul mets cu ajutorul XSLT Ã®n fiÅier denumit.  
+
+#
+# Perl module strings
+#
+
+classify.could_not_find_classifier:EROARE: Nu am putut gÄsi clasificatorul \"%s\"  
+
+download.could_not_find_download:EROARE: Nu am putut gÄsi modulul de descÄrcare \"%s\"  
+
+plugin.could_not_find_plugin:ERROARE: Nu am putut gÄsi extensia \"%s\"  
+
+plugin.including_archive:incluzÃ¢nd conÅ£inutul unei arhive ZIP/TAR  
+
+plugin.including_archives:includerea conÅ£inutului arhivelor %d ZIP/TAR  
+
+plugin.kill_file:Proces terminat de fiÅierul .kill  
+
+plugin.n_considered:Documentele %d au fost considerate pentru procesare  
+
+plugin.n_included:%d au fost procesate Åi incluse Ã®n colecÅ£ie  
+
+plugin.n_rejected:%d au fost respinse  
+
+plugin.n_unrecognised:%d nu au fost recunoscute  
+
+plugin.no_plugin_could_process:ATENÅ¢IE: Niciun plugin nu poate procesa %s  
+
+plugin.no_plugin_could_recognise:ATENÅ¢IE: Nicio extensie nu poate recunoaÅte %s  
+
+plugin.no_plugin_could_process_this_file:fiÅierul nu a fost procesat de nicio extensie  
+
+plugin.no_plugin_could_recognise_this_file:nicio extensie nu a putut recunoaÅte acest fiÅier  
+
+plugin.one_considered:Un document a fost luat Ã®n considerare pentru a fi procesat  
+
+plugin.one_included:Unu a fost procesat Åi inclus Ã®n colecÅ£ie  
+
+plugin.one_rejected:1 a fost respins  
+
+plugin.one_unrecognised:A fost recunoscut 1  
+
+plugin.see_faillog:Vezi %s pentru o listÄ de documente nerecunoscute Åi/sau respinse  
+
+PrintUsage.default:Implicit  
+
+PrintUsage.required:NECESAR  
+
+plugout.could_not_find_plugout:EROARE: Nu am gÄsit \"%s\" plugout  
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/strings_ru.properties
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/strings_ru.properties	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/strings_ru.properties	(revision 24799)
@@ -0,0 +1,1737 @@
+#
+# Resource bundle description
+# 
+
+Language.code:ru
+Language.name:Russian
+
+OutputEncoding.unix:koi8_r
+OutputEncoding.windows:dos_850
+
+
+#
+# Common output messages and strings
+#
+
+common.cannot_create_file:ÐÐšÐÐÐÐ: ÐÐµÐ²ÐŸÐ·ÐŒÐŸÐ¶ÐœÐŸ ÑÐŸÐ·ÐŽÐ°ÑÑ ÑÐ°Ð¹Ð» %s
+
+common.cannot_find_cfg_file:ÐÐšÐÐÐÐ: ÐÐµÐ²ÐŸÐ·ÐŒÐŸÐ¶ÐœÐŸ ÐœÐ°Ð¹ÑÐž ÐºÐŸÐœÑÐžÐ³ÑÑÐ°ÑÐžÐŸÐœÐœÑÐ¹ ÑÐ°Ð¹Ð» %s
+
+common.cannot_open:ÐÐšÐÐÐÐ: ÐÐµÐ²ÐŸÐ·ÐŒÐŸÐ¶ÐœÐŸ ÐŸÑÐºÑÑÑÑ %s
+
+common.cannot_open_fail_log:ÐÐšÐÐÐÐ: ÐÐµÐ²ÐŸÐ·ÐŒÐŸÐ¶ÐœÐŸ ÐŸÑÐºÑÑÑÑ ÑÐµÐ³ÐžÑÑÑÐ°ÑÐžÐŸÐœÐœÑÐ¹ ÑÐ°Ð¹Ð» %s
+
+common.cannot_open_output_file:ÐÐšÐÐÐÐ: ÐÐµÐ²ÐŸÐ·ÐŒÐŸÐ¶ÐœÐŸ ÐŸÑÐºÑÑÑÑ Ð²ÑÑ
+ÐŸÐŽÐœÐŸÐ¹ ÑÐ°Ð¹Ð» %s.
+
+common.cannot_read:ÐÐšÐÐÐÐ: ÐÐµÐ²ÐŸÐ·ÐŒÐŸÐ¶ÐœÐŸ ÑÐžÑÐ°ÑÑ %s
+
+common.cannot_read_file:ÐÐšÐÐÐÐ: ÐÐµÐ²ÐŸÐ·ÐŒÐŸÐ¶ÐœÐŸ Ð¿ÑÐŸÑÐµÑÑÑ ÑÐ°Ð¹Ð» %s
+
+common.general_options:ÐŸÐ±ÑÐžÐµ Ð²Ð°ÑÐžÐ°ÐœÑÑ (ÐŽÐ»Ñ %s)
+
+common.must_be_implemented:ÑÑÐœÐºÑÐžÑ ÐŽÐŸÐ»Ð¶ÐœÐ° Ð±ÑÑÑ ÐŸÑÑÑÐµÑÑÐ²Ð»ÐµÐœÐ° Ð² Ð¿ÐŸÐŽÐºÐ»Ð°ÑÑÐµ
+
+common.options:ÐŸÐ¿ÑÐžÐž
+
+common.processing:ÐŸÐ±ÑÐ°Ð±ÐŸÑÐºÐ°
+
+common.specific_options:ÑÐ¿ÐµÑÐžÑÐžÑÐµÑÐºÐžÐµ ÐŸÐ¿ÑÐžÐž
+
+common.usage:ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÐœÐžÐµ
+
+common.info:ÐžÐœÑÐŸÑÐŒÐ°ÑÐžÑ  
+
+common.invalid_options:ÐÐµÐ²ÐµÑÐœÑÐµ Ð°ÑÐ³ÑÐŒÐµÐœÑÑ: %s  
+
+common.true:Ð²ÐµÑÐœÐŸ  
+
+common.false:ÐœÐµÐ²ÐµÑÐœÐŸ  
+
+common.deprecated:ÐÐÐÐÐÐÐÐ«  
+#
+# Script option descriptions and output messages
+#
+
+scripts.language:Ð¯Ð·ÑÐº ÐŽÐ»Ñ ÐŸÑÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ ÐŸÐ¿ÐžÑÐ°ÐœÐžÐ¹ ÐŸÐ¿ÑÐžÐ¹ Ð² (ÐœÐ°Ð¿ÑÐžÐŒÐµÑ, 'en_US' ÐŸÐ¿ÑÐµÐŽÐµÐ»ÑÐµÑ Ð°ÐŒÐµÑÐžÐºÐ°ÐœÑÐºÐžÐ¹ Ð°ÐœÐ³Ð»ÐžÐ¹ÑÐºÐžÐ¹ ÑÐ·ÑÐº). Ð¢ÑÐµÐ±ÑÐµÑ Ð¿ÐµÑÐµÐ²ÐŸÐŽÐŸÐ² ÐŸÐ¿ÐžÑÐ°ÐœÐžÐ¹ ÐŸÐ¿ÑÐžÐ¹ ÐŽÐ»Ñ Ð¿ÑÐžÑÑÑÑÑÐ²ÐžÑ Ð² ÑÐ°Ð¹Ð»Ðµ perllib/strings_language-code.rb.
+
+scripts.xml:ÐÑÐŸÐžÐ·Ð²ÐŸÐŽÐžÑ ÐžÐœÑÐŸÑÐŒÐ°ÑÐžÑ Ð² ÑÐŸÑÐŒÐ°ÑÐµ XML Ð±ÐµÐ· 'ÑÐžÐŒÐ¿Ð°ÑÐžÑÐœÑÑ
+' ÐºÐŸÐŒÐŒÐµÐœÑÐ°ÑÐžÐµÐ², ÐœÐŸ Ñ ÐœÐ°ÐŒÐœÐŸÐ³ÐŸ Ð±ÐŸÐ»ÑÑÐžÐŒ ÐºÐŸÐ»ÐžÑÐµÑÑÐ²ÐŸÐŒ ÐŽÐµÑÐ°Ð»ÐµÐ¹.
+
+scripts.listall:Ð¡Ð¿ÐžÑÐŸÐº Ð²ÑÐµÑ
+ ÐžÐ·Ð²ÐµÑÑÐœÑÑ
+ ÐµÐŽÐžÐœÐžÑ.
+
+scripts.describeall:ÐÑÐŸÐ±ÑÐ°Ð·ÐžÑÑ ÐŸÐ¿ÑÐžÐž ÐŽÐ»Ñ Ð²ÑÐµÑ
+ ÐžÐ·Ð²ÐµÑÑÐœÑÑ
+ Ð¿ÑÐœÐºÑÐŸÐ²  
+
+scripts.both_old_options:ÐÐÐÐÐÐÐÐ: ÐÑÐž ÑÐºÐ°Ð·Ð°ÐœÐžÐž ÐŸÐ±ÐµÐžÑ
+ ÐŸÐ¿ÑÐžÐ¹ -removeold Ðž -keepold (ÑÑÐŸ ÑÐ°Ð²ÐœÐŸÐ·ÐœÐ°ÑÐœÐŸ -removeold Ð¿ÐŸ ÑÐŒÐŸÐ»ÑÐ°ÐœÐžÑ) Ð²ÑÐµ ÑÐŸÐŽÐµÑÐ¶Ð°ÐœÐžÐµ ÐŽÐžÑÐµÐºÑÐŸÑÐžÐž %s Ð±ÑÐŽÐµÑ ÑÐŽÐ°Ð»ÐµÐœÐŸ.  
+
+scripts.no_old_options:ÐÐÐÐÐÐÐÐ: ÐÐž -removeold ÐœÐž -keepold ÐœÐµ Ð±ÑÐ»Ðž ÑÐºÐ°Ð·Ð°ÐœÑ, ÑÑÐŸ ÑÐ°Ð²ÐœÐŸÐ·ÐœÐ°ÑÐœÐŸ -removeold. ÐÑÐµ ÑÐŸÐŽÐµÑÐ¶Ð°ÐœÐžÐµ ÐŽÐžÑÐµÐºÑÐŸÑÐžÐž %s Ð±ÑÐŽÐµÑ ÑÐŽÐ°Ð»ÐµÐœÐŸ.  
+
+scripts.gli:Ð£ÑÑÐ°ÐœÐŸÐ²ÐžÑÑ ÑÐ»Ð°Ð³ Ð¿ÑÐž Ð·Ð°Ð¿ÑÑÐºÐµ ÑÑÐŸÐ³ÐŸ ÑÐºÑÐžÐ¿ÑÐ° ÐžÐ· GLI, ÐŽÐ°ÐµÑ Ð²ÐŸÐ·ÐŒÐŸÐ¶ÐœÐŸÑÑÑ Ð²ÑÑ
+ÐŸÐŽÐ° ÐœÐ° ÐºÐŸÐœÐºÑÐµÑÐœÑÐµ ÐžÐœÑÐµÑÑÐµÐ¹ÑÑ Ð±ÐžÐ±Ð»ÐžÐŸÑÐµÐºÐ°ÑÐµÐ¹ GLI.  
+
+# -- buildcol.pl --
+
+buildcol.archivedir:ÐÐŽÐµ ÐœÐ°Ñ
+ÐŸÐŽÑÑÑÑ Ð°ÑÑ
+ÐžÐ²Ñ.
+
+buildcol.builddir:ÐÐŽÐµ Ð¿ÐŸÐŒÐµÑÑÐžÑÑ ÑÐŸÐ·ÐŽÐ°ÐœÐœÑÐµ ÐžÐœÐŽÐµÐºÑÑ.
+
+buildcol.cachedir:ÐÐŸÐ»Ð»ÐµÐºÑÐžÑ Ð±ÑÐŽÐµÑ Ð²ÑÐµÐŒÐµÐœÐœÐŸ ÑÐŸÐ·ÐŽÐ°ÐœÐ° Ð·ÐŽÐµÑÑ, Ð¿ÐµÑÐµÐŽ ÑÐµÐŒ ÐºÐ°Ðº Ð±ÑÐŽÐµÑ ÑÐºÐŸÐ¿ÐžÑÐŸÐ²Ð°ÐœÐ° Ð² ÑÐŸÐ·ÐŽÐ°ÐœÐœÑÑ ÐŽÐžÑÐµÐºÑÐŸÑÐžÑ.
+
+buildcol.cannot_open_cfg_file:ÐÐ ÐÐÐ£ÐÐ ÐÐÐÐÐÐÐ: ÐÐŸÐœÑÐžÐ³ÑÑÐ°ÑÐžÐŸÐœÐœÑÐ¹ ÑÐ°Ð¹Ð» ÐœÐµ ÐŒÐŸÐ¶ÐµÑ ÐŸÑÐºÑÑÑÑ ÐŽÐ»Ñ ÐŸÐ±ÐœÐŸÐ²Ð»ÐµÐœÐžÑ: %s
+
+buildcol.collectdir:ÐÑÑÑ Ðº 'collect" ÐŽÐžÑÐµÐºÑÐŸÑÐžÐž.  
+
+buildcol.copying_back_cached_build:ÐÐ±ÑÐ°ÑÐœÐŸÐµ ÐºÐŸÐ¿ÐžÑÐŸÐ²Ð°ÐœÐžÐµ ÐºÑÑÐžÑÐŸÐ²Ð°ÐœÐœÐŸÐ¹ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÑ.
+
+buildcol.create_images:ÐÐŸÐ¿ÑÑÐºÐ° ÑÐŸÐ·ÐŽÐ°ÑÑ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ Ð¿ÐŸ ÑÐŒÐŸÐ»ÑÐ°ÐœÐžÑ ÐŽÐ»Ñ ÐœÐŸÐ²ÐŸÐ¹ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž. ÐÐœÐ° ÐŸÑÐœÐŸÐ²Ð°ÐœÐ° ÐœÐ° Gimp, ÐºÐŸÑÐŸÑÑÐ¹ ÐžÐœÑÑÐ°Ð»Ð»ÐžÑÑÐµÑÑÑ ÐœÐ°ÑÑÐŽÑ Ñ Ð¿ÐŸÐŽÑ
+ÐŸÐŽÑÑÐžÐŒÐž ÐŒÐŸÐŽÑÐ»ÑÐŒÐž perl, ÑÑÐŸÐ±Ñ Ð¿ÐŸÐ·Ð²ÐŸÐ»ÐžÑÑ ÐœÐ°Ð¿ÐžÑÐ°ÐœÐžÐµ ÑÐºÑÐžÐ¿ÑÐŸÐ² ÐŸÑ perl.
+
+buildcol.debug:ÐÐ°Ð¿ÐžÑÐ°ÑÑ Ð¿ÑÐŸÐŽÑÐºÑÐžÑ Ð² STDOUT.
+
+buildcol.desc:Ð¡ÐºÑÐžÐ¿Ñ PERL, ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÐŒÑÐ¹ ÐŽÐ»Ñ Ð¿ÐŸÑÑÑÐŸÐµÐœÐžÑ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž Greenstone ÐžÐ· ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ² GML.  
+
+buildcol.faillog:ÐÐµÑÐŽÐ°ÑÐœÐ°Ñ ÑÐµÐ³ÐžÑÑÑÐ°ÑÐžÑ ÐžÐŒÐµÐœÐž ÑÐ°Ð¹Ð»Ð°. Ð­ÑÐŸÑ Ð¶ÑÑÐœÐ°Ð» ÑÐµÐ³ÐžÑÑÑÐ°ÑÐžÑ Ð¿ÐŸÐ»ÑÑÐžÐ» ÐžÐŒÐµÐœÐ° ÑÐ°Ð¹Ð»ÐŸÐ² ÐžÐ· Ð»ÑÐ±ÑÑ
+ ÑÐ°Ð¹Ð»ÐŸÐ², ÐºÐŸÑÐŸÑÑÐµ ÐœÐµ ÐŒÐŸÐ³ÑÑ Ð±ÑÑÑ ÐŸÐ±ÑÐ°Ð±ÐŸÑÐ°ÐœÑ
+
+buildcol.incremental_default_builddir:ÐÐÐÐÐÐÐÐ: Ð¡ÑÑÑÐºÑÑÑÐ° ÐŽÐžÑÐµÐºÑÐŸÑÐžÐž Ð±ÑÐ»Ð° ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐ° ÐŽÐ»Ñ Ð¿ÐŸÑÑÑÐŸÐµÐœÐžÑ. ÐÑÐ»Ðž Ð²Ñ Ð¶ÐµÐ»Ð°ÐµÑÐµ ÐŽÐŸÐ¿ÐŸÐ»ÐœÐžÑÐµÐ»ÑÐœÐŸ ÐŽÐŸÐ±Ð°Ð²ÐžÑÑ Ðº ÐžÐŒÐµÑÑÐµÐŒÑÑÑ ÐžÐœÐŽÐµÐºÑÑ ÐŽÐžÑÐµÐºÑÐŸÑÐžÑ, ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐ¹ÑÐµ  "-builddir index" ÐŸÐ¿ÑÐžÑ Ð² buildcol.pl.  
+
+buildcol.index:ÐÐœÐŽÐµÐºÑ ÐŽÐ»Ñ Ð¿ÐŸÑÑÑÐŸÐµÐœÐžÑ ( Ð²ÑÐµ Ð±ÑÐŽÐµÑ ÑÐŸÐ·ÐŽÐ°Ð²Ð°ÑÑÑÑ Ð² ÐºÐŸÐœÑÐžÐ³ÑÑÐ°ÑÐžÐŸÐœÐœÐŸÐŒ ÑÐ°Ð¹Ð»Ðµ, ÐµÑÐ»Ðž ÐŸÐœ ÐœÐµ ÑÑÑÐ°ÐœÐŸÐ²Ð»ÐµÐœ).
+
+buildcol.incremental:ÐÐœÐŽÐµÐºÑÐžÑÐŸÐ²Ð°ÑÑ ÑÐŸÐ»ÑÐºÐŸ ÑÐµ ÐŽÐŸÐºÑÐŒÐµÐœÑÑ, ÐºÐŸÑÐŸÑÑÐµ ÐµÑÐµ ÐœÐµ Ð±ÑÐ»Ðž Ð¿ÑÐŸÐžÐœÐŽÐµÐºÑÐžÑÐŸÐ²Ð°ÐœÑ. ÐÐºÐ»ÑÑÐ°ÐµÑ -keepold. ÐÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑ ÐžÐœÐŽÐµÐºÑÐ°ÑÐŸÑ lucene.  
+
+buildcol.keepold:ÐÐµ Ð±ÑÐŽÐµÑ ÑÐœÐžÑÑÐŸÐ¶Ð°ÑÑ ÑÐµÐºÑÑÐµÐµ ÑÐŸÐŽÐµÑÐ¶Ð°ÐœÐžÐµ ÑÐŸÐ·ÐŽÐ°Ð²Ð°ÐµÐŒÐŸÐ¹ ÐŽÐžÑÐµÐºÑÐŸÑÐžÐž.
+
+buildcol.maxdocs:ÐÐ°ÐºÑÐžÐŒÐ°Ð»ÑÐœÐŸÐµ ÑÐžÑÐ»ÐŸ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ² ÐŽÐ»Ñ Ð¿ÐŸÑÑÑÐŸÐµÐœÐžÑ.
+buildcol.maxnumeric:ÐÐ°ÐºÑÐžÐŒÐ°Ð»ÑÐœÐŸÐµ ÑÐžÑÐ»ÐŸ ÑÐžÑÑ, ÐºÐŸÑÐŸÑÐŸÐµ ÐŒÐŸÐ¶ÐµÑ ÐžÐŒÐµÑÑ Â«ÑÐ»ÐŸÐ²ÐŸÂ» Ð² ÑÐ»ÐŸÐ²Ð°ÑÐµ ÐžÐœÐŽÐµÐºÑÐ°. ÐÐŸÐ»ÑÑÐžÐµ ÑÐžÑÐ»Ð° ÑÐ°Ð·ÐŽÐµÐ»ÑÑÑÑÑ ÐœÐ° ÐœÐµÑÐºÐŸÐ»ÑÐºÐŸ ÑÐ»ÐŸÐ² ÐŽÐ»Ñ ÐžÐœÐŽÐµÐºÑÐ°ÑÐžÐž. ÐÐ°Ð¿ÑÐžÐŒÐµÑ, ÐµÑÐ»Ðž ÐŒÐ°ÐºÑÐžÐŒÐ°Ð»ÑÐœÐŸÐµ ÑÐžÑÐ»ÐŸ ÑÐ°Ð²ÐœÐŸ 4, "1342663" Ð±ÑÐŽÐµÑ ÑÐ°Ð·ÐŽÐµÐ»ÐµÐœÐŸ ÐœÐ° "1342" Ðž "663".  
+buildcol.mode:Ð§Ð°ÑÑÐž Ð¿ÑÐŸÑÐµÑÑÐ° Ð¿ÐŸÑÑÑÐŸÐµÐœÐžÑ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž, ÐºÐŸÑÐŸÑÑÐµ ÐœÐµÐŸÐ±Ñ
+ÐŸÐŽÐžÐŒÐŸ Ð²ÑÐ¿ÐŸÐ»ÐœÐžÑÑ.
+buildcol.mode.all:ÐÐµÐ»Ð°ÑÑ Ð²ÑÐµ.
+buildcol.mode.build_index:Ð¢ÐŸÐ»ÑÐºÐŸ ÐžÐœÐŽÐµÐºÑÐžÑÐŸÐ²Ð°ÑÑ ÑÐµÐºÑÑ.
+buildcol.mode.compress_text:Ð¢ÐŸÐ»ÑÐºÐŸ ÑÐ¶Ð°ÑÑ ÑÐµÐºÑÑ.
+buildcol.mode.infodb:Ð¢ÐŸÐ»ÑÐºÐŸ ÑÐŸÐ·ÐŽÐ°ÑÑ Ð±Ð°Ð·Ñ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+.
+
+buildcol.no_default_images:ÐÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ Ð¿ÐŸ ÑÐŒÐŸÐ»ÑÐ°ÐœÐžÑ ÐœÐµ Ð±ÑÐŽÑÑ ÑÐŸÐ·ÐŽÐ°ÐœÑ.
+
+buildcol.no_image_script:ÐÐ ÐÐÐ£ÐÐ ÐÐÐÐÐÐÐ: Ð¡ÐºÑÐžÐ¿Ñ ÑÐŸÐ·ÐŽÐ°ÐœÐžÑ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ ÐœÐµ ÐŒÐŸÐ³ Ð±ÑÑÑ ÐœÐ°Ð¹ÐŽÐµÐœ: %s
+
+buildcol.no_strip_html:ÐÐµ ÑÐŽÐ°Ð»ÑÑÑ ÑÑÐ³Ðž HTML ÐžÐ· ÐžÐœÐŽÐµÐºÑÐžÑÐŸÐ²Ð°ÐœÐœÐŸÐ³ÐŸ ÑÐµÐºÑÑÐ° (ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑÑÑ ÑÐŸÐ»ÑÐºÐŸ ÐŽÐ»Ñ mgpp ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐ¹).
+
+buildcol.no_text:ÐÐµ Ñ
+ÑÐ°ÐœÐžÑÑ ÑÐ¶Ð°ÑÑÐ¹ ÑÐµÐºÑÑ. Ð­ÑÐŸÑ ÐŸÐ¿ÑÐžÑ Ð¿ÐŸÐ»ÐµÐ·ÐœÐ° ÐŽÐ»Ñ ÐŒÐžÐœÐžÐŒÐžÐ·Ð°ÑÐžÐž ÑÐ°Ð·ÐŒÐµÑÐ° Ð¿ÐŸÑÑÑÐŸÐµÐœÐœÑÑ
+ ÐžÐœÐŽÐµÐºÑÐŸÐ², ÐµÑÐ»Ðž ÐÑ ÐœÐ°ÐŒÐµÑÐµÐ²Ð°ÐµÑÐµÑÑ Ð²ÑÐµÐ³ÐŽÐ° Ð¿ÐŸÐºÐ°Ð·ÑÐ²Ð°ÑÑ ÐŸÑÐžÐ³ÐžÐœÐ°Ð»Ñ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ° Ð² ÑÐµÐºÑÑÐµÐµ Ð²ÑÐµÐŒÑ (ÑÐŸ ÐµÑÑÑ ÐÑ ÐœÐµ Ð±ÑÐŽÐµÑÐµ ÑÐ¿ÐŸÑÐŸÐ±ÐœÑ Ð²ÐŸÑÑÑÐ°ÐœÐŸÐ²ÐžÑÑ ÑÐ¶Ð°ÑÑÑ Ð²ÐµÑÑÐžÑ ÑÐµÐºÑÑÐ°).
+
+buildcol.sections_index_document_metadata:ÐÐœÐŽÐµÐºÑÐžÑÐŸÐ²Ð°ÑÑ ÐŽÐŸÐºÑÐŒÐµÐœÑÑ ÐœÐ° ÑÑÐŸÐ²ÐœÐµ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ Ð² ÑÐµÐºÑÐžÑÑ
+  
+buildcol.sections_index_document_metadata.never:ÐÐµ ÐžÐœÐŽÐµÐºÑÐžÑÐŸÐ²Ð°ÑÑ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÐµ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ° ÐœÐ° ÑÑÐŸÐ²ÐœÐµ ÑÐµÐºÑÐžÐž.  
+buildcol.sections_index_document_metadata.always:ÐÐŸÐ±Ð°Ð²ÐžÑÑ Ð²ÑÐµ ÐŸÐ±ÐŸÐ·ÐœÐ°ÑÐµÐœÐœÑÐµ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÐµ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ° ÐœÐ° ÑÑÐŸÐŒ ÑÑÐŸÐ²ÐœÐµ, ÐŽÐ°Ð¶Ðµ ÐµÑÐ»Ðž ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÐµ Ð²ÑÐµÐ¹ ÑÐµÐºÑÐžÐž ÐœÐ° ÑÑÐŸÐŒ ÑÑÐŸÐ²ÐœÐµ ÑÑÑÐµÑÑÐ²ÑÑÑ.  
+buildcol.sections_index_document_metadata.unless_section_metadata_exists:ÐÐŸÐ±Ð°Ð²ÐžÑÑ ÑÐŸÐ»ÑÐºÐŸ ÑÐŸÐ³ÐŽÐ° ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÐµ ÐœÐ° ÑÑÐŸÐŒ ÑÑÐŸÐ²ÐœÐµ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°, ÐµÑÐ»Ðž ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÐµ ÑÐµÐºÑÐžÐž ÐœÐ° ÑÑÐŸÐŒ ÑÑÐŸÐ²ÐœÐµ Ñ ÑÑÐžÐŒ ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµÐŒ ÐœÐµ ÑÑÑÐµÑÑÐ²ÑÑÑ.  
+
+buildcol.out:ÐÐŒÑ ÑÐ°Ð¹Ð»Ð° ÐžÐ»Ðž ÐžÐœÐŽÐµÐºÑ ÐŽÐ»Ñ Ð¿ÐµÑÐ°ÑÐž ÑÑÐ°ÑÑÑÐ° Ð¿ÑÐŸÐŽÑÐºÑÐžÐž Ð².
+
+buildcol.params:[Ð²Ð°ÑÐžÐ°ÐœÑÑ] ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž
+
+buildcol.remove_empty_classifications:Ð¡ÐºÑÑÑÑ ÐœÐµÐ·Ð°Ð¿ÐŸÐ»ÐœÐµÐœÐœÑÐµ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÑ Ðž ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÐŸÐœÐœÑÐµ ÑÐ·Ð»Ñ (Ð±ÐµÐ· ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ²).
+
+buildcol.removeold:Ð£ÐŽÐ°Ð»ÐžÑ ÑÑÑÐ°ÑÐµÐ²ÑÐµÐµ ÑÐŸÐŽÐµÑÐ¶Ð°ÐœÐžÐµ ÑÐ°Ð±ÐŸÑÐµÐ¹ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž.  
+
+buildcol.unlinked_col_images:ÐÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž ÐœÐµ ÐŒÐŸÐ³ÑÑ Ð±ÑÑÑ ÑÐ²ÑÐ·Ð°ÐœÑ Ð¿ÑÐ°Ð²ÐžÐ»ÑÐœÐŸ.
+
+buildcol.unknown_mode:ÐÐµÐžÐ·Ð²ÐµÑÑÐœÑÐ¹ ÑÐ¿ÐŸÑÐŸÐ±: %s
+
+buildcol.updating_archive_cache:ÐÐ±ÐœÐŸÐ²Ð»ÐµÐœÐžÐµ ÐºÑÑÐ° Ð°ÑÑ
+ÐžÐ²Ð°
+
+buildcol.verbosity:Ð£Ð¿ÑÐ°Ð²Ð»ÐµÐœÐžÐµ ÐºÐŸÐ»ÐžÑÐµÑÑÐ²ÐŸÐŒ Ð¿ÑÐŸÐŽÑÐºÑÐžÐž. 0=ÐœÐžÑÐµÐ³ÐŸ, 3=Ð±ÐŸÐ»ÑÑÐŸÐµ ÐºÐŸÐ»ÐžÑÐµÑÑÐ²ÐŸ.
+
+
+# -- classinfo.pl --
+
+classinfo.collection:ÐÑÐž Ð¿ÑÐµÐŽÐŸÑÑÐ°Ð²Ð»ÐµÐœÐžÐž ÐžÐŒÐµÐœÐž ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž ÐœÐ°ÐŽÐŸ Ð±ÑÐŽÐµÑ Ð¿ÑÐµÐ¶ÐŽÐµ Ð²ÑÐµÐ³ÐŸ Ð¿ÑÐŸÑÐŒÐŸÑÑÐµÑÑ classinfo.pl Ð² collect/collection-name/perllib/classify. ÐÑÐ»Ðž ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑ ÑÐ°ÐŒ ÐœÐµ ÐœÐ°Ð¹ÐŽÐµÐœ, ÐœÐµÐŸÐ±Ñ
+ÐŸÐŽÐžÐŒÐŸ Ð±ÑÐŽÐµÑ Ð¿ÑÐŸÑÐŒÐŸÑÑÐµÑÑ ÐŸÐ±ÑÑÑ ÐŽÐžÑÐµÐºÑÐŸÑÐžÑ perllib/classify.
+
+classinfo.desc:ÐÐ°Ð¿ÐžÑÐ°ÑÑ ÐžÐœÑÐŸÑÐŒÐ°ÑÐžÑ ÐŸ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÐµ.
+
+classinfo.general_options:ÐÐ±ÑÐžÐµ ÐŸÐ¿ÑÐžÐž ÑÐœÐ°ÑÐ»ÐµÐŽÐŸÐ²Ð°ÐœÑ ÐŸÑ ÑÐŸÐŽÐžÑÐµÐ»ÑÑÐºÐžÑ
+ ÐºÐ»Ð°ÑÑÐŸÐ² ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÐ°.
+
+classinfo.info:ÐžÐœÑÐŸÑÐŒÐ°ÑÐžÑ
+
+classinfo.no_classifier_name:ÐÐšÐÐÐÐ: ÐÑ ÐŽÐŸÐ»Ð¶ÐœÑ Ð¿ÑÐµÐŽÐŸÑÑÐ°Ð²ÐžÑÑ ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÐ°.  
+
+classinfo.option_types:ÐÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÑ ÐŒÐŸÐ³ÑÑ ÐžÐŒÐµÑÑ ÐŽÐ²Ð° ÑÐžÐ¿Ð° ÐŸÐ¿ÑÐžÐ¹.
+
+classinfo.params:[ÐŸÐ¿ÑÐžÐž] classifier-name ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÐ°  
+
+classinfo.passing_options:ÐÐ¿ÑÐžÐž ÐŒÐŸÐ³ÑÑ Ð±ÑÑÑ Ð¿ÐµÑÐµÐŽÐ°ÐœÑ Ð»ÑÐ±ÐŸÐŒÑ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÑ Ð²ÐºÐ»ÑÑÐµÐœÐžÐµÐŒ ÐžÑ
+ Ð² ÐÐ°Ñ ÐºÐŸÐœÑÐžÐ³ÑÑÐ°ÑÐžÐŸÐœÐœÑÐ¹ ÑÐ°Ð¹Ð» collect.cfg.
+
+classinfo.specific_options:ÐÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐœÑÐµ ÐŸÐ¿ÑÐžÐž ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÑ Ð² Ð¿ÑÐµÐŽÐµÐ»Ð°Ñ
+ ÑÐ°ÐŒÐŸÐ³ÐŸ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÐ° Ðž ÐŽÐŸÑÑÑÐ¿ÐœÑ ÑÐŸÐ»ÑÐºÐŸ ÑÑÐŸÐŒÑ ÑÐ¿ÐµÑÐžÑÐžÑÐµÑÐºÐŸÐŒÑ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÑ.
+
+# -- downloadfrom.pl --
+downloadfrom.cache_dir:ÐÐµÑÑÐŸÐœÐ°Ñ
+ÐŸÐ¶ÐŽÐµÐœÐžÐµ ÐºÐ°ÑÐ°Ð»ÐŸÐ³Ð° Ñ ÐºÑÑÐµÐŒ  
+downloadfrom.desc:ÐÐ°Ð³ÑÑÐ·ÐºÐ° ÑÐ°Ð¹Ð»ÐŸÐ² Ñ Ð²ÐœÐµÑÐœÐµÐ³ÐŸ ÑÐµÑÐ²ÐµÑÐ°  
+downloadfrom.download_mode:Ð¢ÐžÐ¿ ÑÐµÑÐ²ÐµÑÐ°, Ñ ÐºÐŸÑÐŸÑÐŸÐ³ÐŸ Ð·Ð°Ð³ÑÑÐ¶Ð°ÑÑ  
+downloadfrom.download_mode.Web:HTTP  
+downloadfrom.download_mode.MediaWiki:ÐÐµÐ±-ÑÐ°Ð¹Ñ MediaWiki  
+downloadfrom.download_mode.OAI:Open Archives Initiative  
+downloadfrom.download_mode.z3950:ÑÐµÑÐ²ÐµÑ Z3950  
+downloadfrom.download_mode.SRW:SearchRetrieve Webservice  
+downloadfrom.incorrect_mode:Ð¿Ð°ÑÐ°ÐŒÐµÑÑ ÑÐµÐ¶ÐžÐŒÐ° Ð·Ð°Ð³ÑÑÐ·ÐºÐž Ð±ÑÐ» ÐœÐµÐºÐŸÑÑÐµÐºÑÐœÑÐŒ  
+downloadfrom.info:ÐÐ°Ð¿ÐµÑÐ°ÑÐ°ÑÑ ÐžÐœÑÐŸÑÐŒÐ°ÑÐžÑ ÐŸ ÑÐµÑÐ²ÐµÑÐµ, Ð° ÐœÐµ Ð·Ð°Ð³ÑÑÐ¶Ð°ÑÑ Ñ ÐœÐµÐ³ÐŸ  
+downloadfrom.params:[ÐŸÑÐœÐŸÐ²ÐœÑÐµ ÐŸÐ¿ÑÐžÐž] [ÑÐ¿ÐµÑÐžÐ°Ð»ÑÐœÑÐµ ÐŸÐ¿ÑÐžÐž Ð·Ð°Ð³ÑÑÐ·ÐºÐž]  
+
+# -- downloadinfo.pl --
+
+downloadinfo.desc:ÐÐ°Ð¿ÐµÑÐ°ÑÐ°ÑÑ ÐžÐœÑÐŸÑÐŒÐ°ÑÐžÑ ÐŸ ÐŒÐŸÐŽÑÐ»Ðµ Ð·Ð°Ð³ÑÑÐ·ÐºÐž  
+downloadinfo.collection:ÐÐ°ÐŽÐ°ÐœÐžÐµ ÐžÐŒÐµÐœÐž ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž Ð·Ð°ÑÑÐ°Ð²ÐžÑ downloadinfo.pl ÑÐœÐ°ÑÐ°Ð»Ð° ÑÐŒÐŸÑÑÐµÑÑ Ð² collect/collection-name/perllib/downloaders. ÐÑÐ»Ðž ÐŒÐŸÐŽÑÐ»Ñ ÐœÐµ Ð±ÑÐŽÐµÑ ÑÐ°ÐŒ ÐœÐ°Ð¹ÐŽÐµÐœ, Ð¿ÐŸÐžÑÐº Ð±ÑÐŽÐµÑ Ð¿ÑÐŸÐžÐ·Ð²ÐµÐŽÐµÐœ Ð² ÐŸÑÐœÐŸÐ²ÐœÐŸÐŒ ÐºÐ°ÑÐ°Ð»ÐŸÐ³Ðµ perllib/downloaders.  
+downloadinfo.params:[ÐŸÐ¿ÑÐžÐž] [ÐŒÐŸÐŽÑÐ»Ñ-Ð·Ð°Ð³ÑÑÐ·ÐºÐž]  
+downloadinfo.general_options:ÐÑÐœÐŸÐ²ÐœÑÐµ ÐŸÐ¿ÑÐžÐž ÐœÐ°ÑÐ»ÐµÐŽÑÑÑÑÑ ÐŒÐŸÐŽÑÐ»ÐµÐŒ ÐŸÑ ÐºÐ»Ð°ÑÑÐ°-ÑÐŸÐŽÐžÑÐµÐ»Ñ ÐŒÐŸÐŽÑÐ»ÐµÐ¹ Ð·Ð°Ð³ÑÑÐ·ÐºÐž.  
+downloadinfo.specific_options:ÐÑÐŸÐ±ÑÐµ ÐŸÐ¿ÑÐžÐž ÐŒÐŸÐŽÑÐ»Ðž Ð·Ð°Ð³ÑÑÐ·ÐºÐž ÐŸÐ¿ÑÐµÐŽÐµÐ»ÑÑÑ ÑÐ°ÐŒÐž, Ðž Ð¿ÐŸÑÑÐŸÐŒÑ ÐŸÐœÐž ÐŽÐŸÑÑÑÐ¿ÐœÑ ÑÐŸÐ»ÑÐºÐŸ ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐœÐŸÐŒÑ Ð·Ð°Ð³ÑÑÐ·ÑÐžÐºÑ.  
+downloadinfo.option_types:ÐÐŸÐŽÑÐ»Ðž Ð·Ð°Ð³ÑÑÐ·ÐºÐž ÐŒÐŸÐ³ÑÑ Ð¿ÑÐžÐœÐžÐŒÐ°ÑÑ ÐŽÐ²Ð° Ð²ÐžÐŽÐ° ÐŸÐ¿ÑÐžÐ¹  
+
+# -- explode_metadata_database.pl --
+explode.desc:Ð Ð°ÑÑÐžÑÐžÑÑ Ð±Ð°Ð·Ñ ÐŽÐ°ÐœÐœÑÑ
+ ÐŒÐµÑÐ°-ÐŽÐ°ÐœÐœÑÑ
+Ñ
+
+explode.collection:ÐÐŒÑ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž. ÐÐµÐºÐŸÑÐŸÑÑÐµ Ð¿Ð»Ð°Ð³ÐžÐœÑ ÐžÑÑÑ Ð²ÑÐ¿ÐŸÐŒÐŸÐ³Ð°ÑÐµÐ»ÑÐœÑÐµ ÑÐ°Ð¹Ð»Ñ Ð² Ð¿Ð°Ð¿ÐºÐµ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž.  
+ 
+explode.document_field:Ð­Ð»ÐµÐŒÐµÐœÑ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+, ÐŸÐ¿ÑÐµÐŽÐµÐ»ÑÑÑÐžÐ¹ ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµ ÑÐ°Ð¹Ð»Ð° ÐŽÐ»Ñ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ², ÐºÐŸÑÐŸÑÑÐµ Ð±ÑÐŽÑÑ Ð¿ÐŸÐ»ÑÑÐµÐœÑ Ðž Ð²ÐºÐ»ÑÑÐµÐœÑ Ð² ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ.  
+
+explode.document_prefix:ÐÑÐžÑÑÐ°Ð²ÐºÐ° ÐŽÐ»Ñ ÐŒÐµÑÑÐŸÐ¿ÐŸÐ»ÐŸÐ¶ÐµÐœÐžÐ¹ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ° (ÐŽÐ»Ñ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÐœÐžÑ Ñ ÐŸÐ¿ÑÐžÐµÐ¹ document_field).
+
+explode.document_suffix:Ð¡ÑÑÑÐžÐºÑ ÐŽÐ»Ñ ÐŒÐµÑÑÐŸÐ¿ÐŸÐ»ÐŸÐ¶ÐµÐœÐžÑ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ° (ÐŽÐ»Ñ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÐœÐžÑ Ñ ÐŸÐ¿ÑÐžÐµÐ¹ document_field).
+
+explode.encoding:ÐÐŸÐŽÐžÑÐŸÐ²ÐºÐ° ÐŽÐ»Ñ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÐœÐžÑ Ð¿ÑÐž ÑÑÐµÐœÐžÐž ÑÐ°Ð¹Ð»ÐŸÐ² Ð² Ð±Ð°Ð·Ðµ ÐŽÐ°ÐœÐœÑÑ
+
+explode.metadata_set:ÐÐ°Ð·Ð²Ð°ÐœÐžÐµ ÐœÐ°Ð±ÐŸÑÐ° ÐŒÐµÑÐ°-ÐŽÐ°ÐœÐœÑÑ
+ ÐŽÐ»Ñ ÑÐºÑÐ¿ÐŸÑÑÐžÑÐŸÐ²Ð°ÐœÐžÑ Ð²ÑÐµÑ
+ ÐŒÐµÑÐ°-ÐŽÐ°ÐœÐœÑÑ
+
+explode.plugin:ÐÐ»Ð°Ð³ÐžÐœ ÐŽÐ»Ñ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÐœÐžÑ Ð¿ÑÐž ÑÐ°ÑÑÐžÑÐµÐœÐžÐž
+explode.plugin_options:ÐÐ¿ÑÐžÐž Ð¿ÐµÑÐµÐŽÐ°ÑÐž Ð¿Ð»Ð°Ð³ÐžÐœÑ Ð¿ÐµÑÐµÐŽ ÐŽÐŸ Ð·Ð°Ð¿ÑÑÐºÐ°. ÐÐ¿ÑÐžÑ nmaes ÐŽÐŸÐ»Ð¶ÐœÐ° ÐœÐ°ÑÐ°ÑÑÑÑ Ñ -. ÐÑÐŽÐµÐ»ÑÐœÐ°Ñ ÐŸÐ¿ÑÐžÑ ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµ Ðž Ð·ÐœÐ°ÑÐµÐœÐžÐµ Ñ Ð¿ÑÐŸÐ±ÐµÐ»ÐŸÐŒ.  
+explode.use_collection_plugin_options:ÐÑÐŸÑÑÐžÑÐµ ÐºÐŸÐœÑÐžÐ³ÑÑÐ°ÑÐžÐŸÐœÐœÑÐ¹ ÑÐ°Ð¹Ð» ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž Ðž ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐ¹ÑÐµ ÐŸÐ¿ÑÐžÐž ÐŽÐ»Ñ ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐœÑÑ
+ Ð¿Ð»Ð°Ð³ÐžÐœÐŸÐ². Ð¢ÑÐµÐ±ÑÐµÑ ÐŸÐ¿ÑÐžÑ -collection. 
+ÐÐµ ÐŒÐŸÐ¶ÐµÑ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°Ðœ ÐŽÐ»Ñ -plugin_options.  
+explode.params:[ÐŸÐ¿ÑÐžÐž] ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµ ÑÐ°Ð¹Ð»Ð°
+explode.records_per_folder:ÐÐŸÐ»ÐžÑÐµÑÑÐ²ÐŸ Ð·Ð°Ð¿ÐžÑÐµÐ¹ ÐŽÐ»Ñ ÐºÐ°Ð¶ÐŽÐŸÐ¹ Ð¿ÐŸÐŽÐ¿Ð°Ð¿ÐºÐž  
+
+# -- replace_srcdoc_with_html.pl --
+srcreplace.desc:ÐÐ°ÐŒÐµÐœÐžÑÑ ÐžÑÑ
+ÐŸÐŽÐœÑÐ¹ ÐŽÐŸÐºÑÐŒÐµÐœÑ, Ð³ÐµÐœÐµÑÐžÑÑÐµÐŒÑÐŒ HTML ÑÐ°Ð¹Ð»ÐŸÐŒ Ð¿ÑÐž Ð¿ÐµÑÐµÑÑÑÐŸÐ¹ÐºÐµ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž  
+srcreplace.params:[ÐŸÐ¿ÑÐžÐž] ÐžÐŒÑ ÑÐ°Ð¹Ð»Ð°  
+srcreplace.plugin:ÐÐŸÐŽÑÐ»Ñ Ð±ÑÐŽÐµÑ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÑÑÑ ÐŽÐ»Ñ Ð¿ÑÐµÐŸÐ±ÑÐ°Ð·ÐŸÐ²Ð°ÐœÐžÑ ÐžÑÑ
+ÐŸÐŽÐœÐŸÐ³ÐŸ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°  
+
+# -- exportcol.pl --
+
+exportcol.out:ÐÐŒÑ ÑÐ°Ð¹Ð»Ð° ÐžÐ»Ðž ÐžÐœÐŽÐµÐºÑ ÐŽÐ»Ñ Ð¿ÐµÑÐ°ÑÐž ÑÑÐ°ÑÑÑÐ° Ð¿ÑÐŸÐŽÑÐºÑÐžÐž Ð².
+exportcol.cddir:ÐÐ°Ð·Ð²Ð°ÐœÐžÐµ ÐŽÐžÑÐµÐºÑÐŸÑÐžÐž, ÐºÑÐŽÐ° ÑÐºÑÐ¿ÐŸÑÑÐžÑÑÐµÑÑÑ ÑÐŸÐŽÐµÑÐ¶Ð°ÐœÐžÐµ ÐºÐŸÐŒÐ¿Ð°ÐºÑÐœÐŸÐ³ÐŸ ÐŽÐžÑÐºÐ°.  
+exportcol.cdname:ÐÐŒÑ CD-ROM - ÑÑÐŸ ÑÐŸ, ÑÑÐŸ Ð¿ÐŸÑÐ²ÐžÑÑÑ Ð² ÑÑÐ°ÑÑÐŸÐ²ÐŸÐŒ ÐŒÐµÐœÑ, ÐºÐ°Ðº ÑÐŸÐ»ÑÐºÐŸ CD-ROM ÑÑÑÐ°ÐœÐŸÐ²Ð»ÐµÐœ.
+exportcol.desc:Ð¡ÐºÑÐžÐ¿Ñ PERL ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°Ð»ÑÑ ÐŽÐ»Ñ ÑÐºÑÐ¿ÐŸÑÑÐ° ÐŸÐŽÐœÐŸÐ¹ ÐžÐ»Ðž Ð±ÐŸÐ»ÐµÐµ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐ¹ Ð² Windows CD-ROM.
+exportcol.noinstall:Ð¡ÐŸÐ·ÐŽÐ°ÑÑ ÑÐ°ÐºÐŸÐ¹ CD-ROM, Ñ ÐºÐŸÑÐŸÑÐŸÐ³ÐŸ Ð±ÐžÐ±Ð»ÐžÐŸÑÐµÐºÐ° ÑÐ°Ð±ÐŸÑÐ°ÐµÑ ÐœÐ°Ð¿ÑÑÐŒÑÑ, Ð° ÐœÐ° Ñ
+ÐŸÑÑ-ÐºÐŸÐŒÐ¿ÑÑÑÐµÑ ÐœÐžÑÐµÐ³ÐŸ ÐœÐµ ÑÑÑÐ°ÐœÐ°Ð²Ð»ÐžÐ²Ð°ÐµÑÑÑ.  
+exportcol.params:[ÐŸÐ¿ÑÐžÐž] ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµ-ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž1 ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµ-ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž2...  
+exportcol.coll_not_found:ÐÐµ Ð¿ÑÐžÐœÐžÐŒÐ°ÑÑ Ð²ÐŸ Ð²ÐœÐžÐŒÐ°ÐœÐžÐµ ÐœÐµÐŽÐµÐ¹ÑÑÐ²ÐžÑÐµÐ»ÑÐœÑÑ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ %s:ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ ÐœÐµ ÐœÐ°Ð¹ÐŽÐµÐœÐ° Ð² %s.
+exportcol.coll_dirs_not_found:ÐÐµ Ð¿ÑÐžÐœÐžÐŒÐ°ÑÑ Ð²ÐŸ Ð²ÐœÐžÐŒÐ°ÐœÐžÐµ ÐœÐµÐŽÐµÐ¹ÑÑÐ²ÐžÑÐµÐ»ÑÐœÑÑ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ %s: ÐŸÐŽÐœÐ° ÐžÐ· ÑÐ»ÐµÐŽÑÑÑÐžÑ
+ ÐŽÐžÑÐµÐºÑÐŸÑÐžÐ¹ ÐœÐµ ÐœÐ°Ð¹ÐŽÐµÐœÐ°.
+exportcol.fail:exportcol.pl ÐœÐµ ÑÐŽÐ°Ð»ÑÑ:
+exportcol.no_valid_colls:ÐÐžÐºÐ°ÐºÐžÑ
+ Ð¿ÑÐžÐ³ÐŸÐŽÐœÑÑ
+ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐ¹, ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐœÑÑ
+ ÐŽÐ»Ñ ÑÐºÑÐ¿ÐŸÑÑÐ°.
+exportcol.couldnt_create_dir:ÐÐµÐ²ÐŸÐ·ÐŒÐŸÐ¶ÐœÐŸ ÑÐŸÐ·ÐŽÐ°ÑÑ ÐŽÐžÑÐµÐºÑÐŸÑÐžÑ %s.
+exportcol.couldnt_create_file:ÐÐµÐ²ÐŸÐ·ÐŒÐŸÐ¶ÐœÐŸ ÑÐŸÐ·ÐŽÐ°ÑÑ %s.
+exportcol.instructions:Ð§ÑÐŸÐ±Ñ ÑÐŸÐ·ÐŽÐ°ÑÑ ÑÐ°ÐŒÐŸÑÑÑÐ°ÐœÐ°Ð²Ð»ÐžÐ²Ð°ÑÑÐžÐ¹ÑÑ CD-ROM ÐŽÐ»Ñ Windows, Ð·Ð°Ð¿ÐžÑÐžÑÐµ ÐœÐ° CD-ROM ÑÐŸÐŽÐµÑÐ¶ÐžÐŒÐŸÐµ ÑÑÐŸÐ¹ Ð¿Ð°Ð¿ÐºÐž.
+exportcol.non_exist_files:ÐÐŽÐžÐœ ÐžÐ»Ðž Ð±ÐŸÐ»ÐµÐµ ÐžÐ· ÑÐ»ÐµÐŽÑÑÑÐžÑ
+ ÐœÐµÐŸÐ±Ñ
+ÐŸÐŽÐžÐŒÑÑ
+ ÑÐ°Ð¹Ð»ÐŸÐ² Ðž ÐŽÐžÑÐµÐºÑÐŸÑÐžÐ¹ ÐœÐµ ÑÑÑÐµÑÑÐ²ÑÐµÑ:
+exportcol.success:exportcol.pl ÑÐ»ÐµÐŽÐŸÐ²Ð°Ð²ÑÐžÐ¹:
+exportcol.output_dir:Ð­ÐºÑÐ¿ÐŸÑÑÐžÑÑÐµÐŒÑÐµ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž (%s) ÐœÐ°Ñ
+ÐŸÐŽÑÑÑÑ Ð² %s.
+exportcol.export_coll_not_installed:Ð€ÑÐœÐºÑÐžÐŸÐœÐ°Ð»ÑÐœÑÐµ Ð²ÐŸÐ·ÐŒÐŸÐ¶ÐœÐŸÑÑÐž âÐ­ÐºÑÐ¿ÐŸÑÑÐžÑÐŸÐ²Ð°ÑÑ Ð² CD-ROMâ ÐœÐµ Ð±ÑÐ»Ðž ÑÑÑÐ°ÐœÐŸÐ²Ð»ÐµÐœÑ.
+
+# -- import.pl --
+
+import.archivedir:ÐÐŽÐµ Ð·Ð°ÐºÐ°ÐœÑÐžÐ²Ð°ÐµÑÑÑ ÐºÐŸÐœÐ²ÐµÑÑÐžÑÐŸÐ²Ð°ÐœÐœÑÐ¹ ÐŒÐ°ÑÐµÑÐžÐ°Ð» Ð·Ð°ÐºÐ°ÐœÑÐžÐ²Ð°ÐµÑÑÑ.
+
+import.manifest:XML-ÑÐ°Ð¹Ð», ÐºÐŸÑÐŸÑÑÐ¹ ÑÑÐŸÑÐœÑÐµÑ, ÐºÐ°ÐºÐžÐµ ÐžÐŒÐµÐœÐœÐŸ ÑÐ°Ð¹Ð»Ñ ÐŽÐŸÐ»Ð¶ÐœÑ Ð±ÑÑÑ ÐžÐŒÐ¿ÐŸÑÑÐžÑÐŸÐ²Ð°ÐœÑ. ÐÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑÑÑ Ð²ÐŒÐµÑÑÐŸ ÑÐµÐºÑÑÑÐžÐ²ÐœÐŸÐ³ÐŸ ÐŸÐ±Ñ
+ÐŸÐŽÐ° Ð¿Ð°Ð¿ÐºÐž ÐžÐŒÐ¿ÐŸÑÑÐ°, Ð² ÐŸÑÐœÐŸÐ²ÐœÐŸÐŒ, ÐŽÐ»Ñ ÐžÐœÐºÑÐµÐŒÐµÐœÑÐœÐŸÐ¹ ÑÐ±ÐŸÑÐºÐž.  
+
+import.cannot_open_stats_file:ÐÐ ÐÐÐ£ÐÐ ÐÐÐÐÐÐÐ: ÐÐµÐ²ÐŸÐ·ÐŒÐŸÐ¶ÐœÐŸ ÐŸÑÐºÑÑÑÑ ÑÐ°Ð¹Ð» ÑÐŸÑÑÐŸÑÐœÐžÑ %s.
+
+import.cannot_open_fail_log:ÐÐšÐÐÐÐ: Ð ÐµÐ³ÐžÑÑÑÐ°ÑÐžÐŸÐœÐœÑÐ¹ ÑÐ°Ð¹Ð» ÐœÐµ ÐŒÐŸÐ³ Ð±ÑÑÑ ÐŸÑÐºÑÑÑ %s
+
+import.cannot_sort:ÐÐ ÐÐÐ£ÐÐ ÐÐÐÐÐÐÐ: import.pl ÐœÐµ ÐŒÐŸÐ¶ÐµÑ ÑÐŸÑÑÐžÑÐŸÐ²Ð°ÑÑ ÐŽÐŸÐºÑÐŒÐµÐœÑÑ, ÐºÐŸÐ³ÐŽÐ° ÑÐ°Ð·ÐŒÐµÑ Ð³ÑÑÐ¿Ð¿Ñ> 1. sortmeta ÐÐ¿ÑÐžÑ ÐŒÐµÑÐ°ÑÐŸÑÑÐžÑÐŸÐ²ÐºÐž Ð±ÑÐŽÐµÑ ÐžÐ³ÐœÐŸÑÐžÑÐŸÐ²Ð°ÑÑÑÑ.
+
+import.collectdir:ÐÐžÑÐµÐºÑÐŸÑÐžÑ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž.  
+
+import.complete:ÐÐŒÐ¿ÐŸÑÑ Ð·Ð°Ð²ÐµÑÑÐµÐœ
+
+import.debug:ÐÐ°Ð¿ÐžÑÐ°ÑÑ ÐžÐŒÐ¿ÐŸÑÑÐžÑÐŸÐ²Ð°ÐœÐœÑÐ¹ ÑÐµÐºÑÑ Ð² STDOUT.  
+
+import.desc:Ð¡ÐºÑÐžÐ¿Ñ PERL, ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÐŒÑÐ¹ ÐŽÐ»Ñ ÐžÐŒÐ¿ÐŸÑÑÐžÑÐŸÐ²Ð°ÐœÐžÑ ÑÐ°Ð¹Ð»ÐŸÐ² Ð² ÑÐŸÑÐŒÐ°Ñ GML, Ð³ÐŸÑÐŸÐ² ÐŽÐ»Ñ Ð¿ÐŸÑÑÑÐŸÐµÐœÐžÑ.  
+
+import.faillog:ÐÐµÑÐŽÐ°ÑÐœÐ°Ñ ÑÐµÐ³ÐžÑÑÑÐ°ÑÐžÑ ÐžÐŒÐµÐœÐž ÑÐ°Ð¹Ð»Ð°. Ð­ÑÐŸÑ Ð¶ÑÑÐœÐ°Ð» ÑÐµÐ³ÐžÑÑÑÐ°ÑÐžÐž Ð¿ÐŸÐ»ÑÑÐ°ÐµÑ ÐžÐŒÐµÐœÐ° ÑÐ°Ð¹Ð»Ð° Ð»ÑÐ±ÑÑ
+ ÑÐ°Ð¹Ð»ÐŸÐ², ÐºÐŸÑÐŸÑÑÐµ ÐœÐµ ÐŒÐŸÐ³ÑÑ Ð±ÑÑÑ ÐŸÐ±ÑÐ°Ð±ÐŸÑÐ°ÐœÑ.
+
+import.groupsize:Ð§ÐžÑÐ»ÐŸ ÐžÐŒÐ¿ÐŸÑÑÐžÑÑÐµÐŒÑÑ
+ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ² ÐŽÐ»Ñ Ð³ÑÑÐ¿Ð¿ÐžÑÐŸÐ²ÐºÐž Ð² ÐŸÐŽÐžÐœ XML ÑÐ°Ð¹Ð».
+
+import.gzip:ÐÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÑ gzip ÐŽÐ»Ñ ÑÐ¶Ð°ÑÐžÑ ÑÐµÐ·ÑÐ»ÑÑÐžÑÑÑÑÐžÑ
+ xml ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ² (ÐœÐµ Ð·Ð°Ð±ÑÐŽÑÑÐµ Ð²ÐºÐ»ÑÑÐžÑÑ ZIPPlug Ð² ÐÐ°Ñ ÑÐ¿ÐžÑÐŸÐº Ð¿Ð»Ð°Ð³ÐžÐœÐŸÐ², ÐºÐŸÐ³ÐŽÐ° ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ ÑÐŸÐ·ÐŽÐ°ÐµÑÑÑ ÐžÐ· ÑÐ¶Ð°ÑÑÑ
+ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ²).  
+
+import.importdir:ÐÐŽÐµ ÐœÐ°Ñ
+ÐŸÐŽÐžÑÑÑ ÐžÑÑ
+ÐŸÐŽÐœÑÐ¹ ÐŒÐ°ÑÐµÑÐžÐ°Ð».
+
+import.incremental:ÐÐŒÐ¿ÐŸÑÑÐžÑÐŸÐ²Ð°ÑÑ ÑÐŸÐ»ÑÐºÐŸ ÑÐµ ÐŽÐŸÐºÑÐŒÐµÐœÑÑ, ÐºÐŸÑÐŸÑÑÐµ ÐœÐŸÐ²ÐµÐµ (Ð¿ÐŸ Ð²ÑÐµÐŒÐµÐœÐœÐŸÐ¹ ÐŸÑÐŒÐµÑÐºÐµ), ÑÐµÐŒ ÑÐµÐºÑÑÐžÐµ ÑÐ°Ð¹Ð»Ñ Ð² Ð°ÑÑ
+ÐžÐ²Ðµ. ÐÐºÐ»ÑÑÐ°ÐµÑ -keepold.  
+
+import.keepold:ÐÐµ Ð±ÑÐŽÐµÑ ÑÐœÐžÑÑÐŸÐ¶Ð°ÑÑ ÑÐµÐºÑÑÐµÐµ ÑÐŸÐŽÐµÑÐ¶Ð°ÐœÐžÐµ Ð°ÑÑ
+ÐžÐ²ÐœÐŸÐ¹ ÐŽÐžÑÐµÐºÑÐŸÑÐžÐž.  
+
+import.maxdocs:ÐÐ°ÐºÑÐžÐŒÐ°Ð»ÑÐœÐŸÐµ ÑÐžÑÐ»ÐŸ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ² ÐŽÐ»Ñ ÐžÐŒÐ¿ÐŸÑÑÐžÑÐŸÐ²Ð°ÐœÐžÑ.
+
+import.no_import_dir:ÐÑÐžÐ±ÐºÐ°: ÐºÐ°ÑÐ°Ð»ÐŸÐ³ ÐžÐŒÐ¿ÐŸÑÑÐ° (%s) ÐœÐµ ÐœÐ°Ð¹ÐŽÐµÐœ.  
+
+import.no_plugins_loaded:ÐÐšÐÐÐÐ: ÐÐžÐºÐ°ÐºÐžÐµ Ð¿Ð»Ð°Ð³ÐžÐœÑ ÐœÐµ Ð·Ð°Ð³ÑÑÐ¶ÐµÐœÑ.
+
+import.OIDtype:ÐÐµÑÐŸÐŽ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÑ Ð¿ÑÐž Ð³ÐµÐœÐµÑÐžÑÐŸÐ²Ð°ÐœÐžÐž ÑÐœÐžÐºÐ°Ð»ÑÐœÑÑ
+ ÐžÐŽÐµÐœÑÐžÑÐžÐºÐ°ÑÐŸÑÐŸÐ² ÐŽÐ»Ñ ÐºÐ°Ð¶ÐŽÐŸÐ³ÐŸ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°.  
+import.OIDtype.hash:Ð¥ÐµÑÐžÑÐŸÐ²Ð°ÐœÐžÐµ ÑÐŸÐŽÐµÑÐ¶Ð°ÐœÐžÑ ÑÐ°Ð¹Ð»Ð°. ÐÐŽÐµÐœÑÐžÑÐžÐºÐ°ÑÐŸÑ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ° Ð±ÑÐŽÐµÑ ÑÐµÐŒ Ð¶Ðµ ÑÐ°ÐŒÑÐŒ ÐºÐ°Ð¶ÐŽÑÐ¹ ÑÐ°Ð·, ÐºÐŸÐ³ÐŽÐ° ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ ÐžÐŒÐ¿ÐŸÑÑÐžÑÑÐµÑÑÑ.  
+
+import.OIDtype.incremental:ÐÑÐŸÑÑÐŸÐ¹ Ð¿ÐŸÐŽÑÑÐµÑ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ², ÐºÐŸÑÐŸÑÑÐ¹ ÑÐ²Ð»ÑÐµÑÑÑ Ð·ÐœÐ°ÑÐžÑÐµÐ»ÑÐœÐŸ Ð±ÐŸÐ»ÐµÐµ Ð±ÑÑÑÑÑÐŒ, ÑÐµÐŒ "Ñ
+ÐµÑÐžÑÐŸÐ²Ð°ÐœÐžÐµ". Ð­ÑÐŸ ÐœÐµ Ð³Ð°ÑÐ°ÐœÑÐžÑÑÑÑ ÑÐŸÐ³ÐŸ, ÑÑÐŸ Ð²ÑÐµÐ³ÐŽÐ° Ð±ÑÐŽÐµÑ ÐœÐ°Ð·ÐœÐ°ÑÐµÐœ ÑÐŸÑ Ð¶Ðµ ÑÐ°ÐŒÑÐ¹ ÐžÐŽÐµÐœÑÐžÑÐžÐºÐ°ÑÐŸÑ Ðº ÐŽÐ°ÐœÐœÐŸÐŒÑ ÐŽÐŸÐºÑÐŒÐµÐœÑÑ, Ñ
+ÐŸÑÑ Ðž ÐœÐµ Ð¿ÐŸÐ·Ð²ÐŸÐ»ÑÐµÑ Ð¿ÐŸÑÐ»ÐµÐŽÑÑÑÐžÐŒ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°ÐŒ Ð±ÑÑÑ ÐŽÐŸÐ±Ð°Ð²Ð»ÐµÐœÐœÑÐŒÐž Ðº ÑÑÑÐµÑÑÐ²ÑÑÑÐžÐŒ  xml Ð°ÑÑ
+ÐžÐ²Ð°ÐŒ.  
+
+import.OIDtype.assigned:ÐÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑ 'D' Ð¿Ð»ÑÑ Ð·ÐœÐ°ÑÐµÐœÐžÐµ Ð² Ð¿ÐŸÐ»Ðµ dc.Identifier Ð² ÐºÐ°ÑÐµÑÑÐ²Ðµ ÐžÐŽÐµÐœÑÐžÑÐžÐºÐ°ÑÐŸÑÐ° ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°. ÐÐŸÐ»Ðµ dc.Identifiers ÐŽÐŸÐ»Ð¶ÐœÐŸ Ð±ÑÑÑ ÐŸÐŽÐœÐŸÐ·ÐœÐ°ÑÐœÑÐŒ. ÐÑÐ»Ðž dc.Identifier ÐœÐµ Ð·Ð°Ð¿ÐŸÐ»ÐœÐµÐœÐŸ ÐŽÐ»Ñ ÐŽÐ°ÐœÐœÐŸÐ³ÐŸ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°, Ð² ÐºÐ°ÑÐµÑÑÐ²Ðµ Ð·Ð°ÐŒÐµÐœÑ Ð±ÑÐŽÐµÑ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°Ðœ hash id.  
+
+import.OIDtype.dirname:ÐÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑ 'J' Ð¿Ð»ÑÑ ÑÐŸÐŽÐžÑÐµÐ»ÑÑÐºÑÑ Ð¿Ð°Ð¿ÐºÑ as the identifier. ÐÐ»Ñ ÑÑÐŸÐ³ÐŸ Ð² ÐºÐ°Ð¶ÐŽÐŸÐ¹ Ð¿Ð°Ð¿ÐºÐµ ÐŽÐŸÐ»Ð¶ÐµÐœ Ð±ÑÑÑ ÑÐŸÐ»ÑÐºÐŸ ÐŸÐŽÐžÐœ ÑÐ°Ð¹Ð», Ð° ÐµÐµ ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµ ÐŽÐŸÐ»Ð¶ÐœÐŸ Ð±ÑÑÑ ÐŸÐŽÐœÐŸÐ·ÐœÐ°ÑÐœÑÐŒ. E.g. import/b13as/h15ef/page.html Ð¿ÐŸÐ»ÑÑÐžÑ ÐžÐŽÐµÐœÑÐžÑÐžÐºÐ°ÑÐŸÑ Jh15ef.  
+
+import.OIDmetadata:Ð£ÐºÐ°Ð·ÑÐ²Ð°ÐµÑ ÑÐ»ÐµÐŒÐµÐœÑ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+, ÐºÐŸÑÐŸÑÑÐ¹ ÑÐŸÐŽÐµÑÐ¶ÐžÑ ÑÐœÐžÐºÐ°Ð»ÑÐœÑÐ¹ ÐžÐŽÐµÐœÑÐžÑÐžÐºÐ°ÑÐŸÑ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°, ÐŽÐ»Ñ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÐœÐžÑ Ñ -OIDtype=assigned.  
+
+import.saveas:Ð ÐºÐ°ÐºÐŸÐŒ ÑÐŸÑÐŒÐ°ÑÐµ Ð³ÐµÐœÐµÑÐžÑÐŸÐ²Ð°ÑÑ Ð°ÑÑ
+ÐžÐ². ÐÐŸ ÑÐŒÐŸÐ»ÑÐ°ÐœÐžÑ GA.  
+
+import.out:ÐÐŒÑ ÑÐ°Ð¹Ð»Ð° ÐžÐ»Ðž ÐžÐœÐŽÐµÐºÑ ÐŽÐ»Ñ Ð·Ð°Ð¿ÐžÑÐž Ð²ÑÑ
+ÐŸÐŽÐœÐŸÐ³ÐŸ ÑÑÐ°ÑÑÑÐ° Ð².
+
+import.params:[ÐŸÐ¿ÑÐžÐž] ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµ-ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž1 ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµ-ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž2...  
+
+import.removeold:Ð£ÐŽÐ°Ð»ÐžÑ ÑÑÐ°ÑÐŸÐµ ÑÐŸÐŽÐµÑÐ¶Ð°ÐœÐžÐµ Ð°ÑÑ
+ÐžÐ²ÐœÐŸÐ¹ ÐŽÐžÑÐµÐºÑÐŸÑÐžÐž.  
+
+import.removing_archives:Ð£ÐŽÐ°Ð»ÐµÐœÐžÐµ ÑÐµÐºÑÑÐµÐ³ÐŸ ÑÐŸÐŽÐµÑÐ¶Ð°ÐœÐžÑ Ð°ÑÑ
+ÐžÐ²ÐœÐŸÐ¹ ÐŽÐžÑÐµÐºÑÐŸÑÐžÐž...
+
+import.removing_tmpdir:Ð£ÐŽÐ°Ð»ÐµÐœÐžÐµ ÑÐŸÐŽÐµÑÐ¶Ð°ÐœÐžÑ Ð¿Ð°Ð¿ÐºÐž "tmp" ÑÑÐŸÐ¹ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž...  
+
+import.reversesort:Ð¡ÐŸÑÑÐžÑÐŸÐ²ÐºÐ° Ð² ÐŸÐ±ÑÐ°ÑÐœÐŸÐŒ Ð¿ÐŸÑÑÐŽÐºÐµ. ÐÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑÑÑ Ñ ÐŸÐ¿ÑÐžÐµÐ¹ -sortmeta  
+
+import.site:Ð¡Ð°Ð¹Ñ ÐŽÐ»Ñ Ð¿ÐŸÐžÑÐºÐ° ÐŽÐžÑÐµÐºÑÐŸÑÐžÐž Ñ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐŒÐž Ð² (ÐŽÐ»Ñ ÑÑÑÐ°ÐœÐŸÐ²ÐºÐž ÐÑÐžÐœÑÑÐŸÑÐœ 3 Ð²ÐµÑÑÐžÐž)  
+
+import.sortmeta:Ð¡ÐŸÑÑÐžÑÐŸÐ²Ð°ÑÑ ÐŽÐŸÐºÑÐŒÐµÐœÑÑ Ð² Ð°Ð»ÑÐ°Ð²ÐžÑÐœÐŸÐŒ Ð¿ÐŸÑÑÐŽÐºÐµ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ ÐŽÐ»Ñ Ð¿ÐŸÑÑÑÐŸÐµÐœÐžÑ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž. Ð ÐµÐ·ÑÐ»ÑÑÐ°ÑÑ Ð¿ÐŸÐžÑÐºÐ° Ð±ÑÐ»ÐµÐ²ÑÑ
+ Ð·Ð°Ð¿ÑÐŸÑÐŸÐ² Ð±ÑÐŽÑÑ Ð²ÑÐŽÐ°ÐœÑ Ð² ÑÑÐŸÐŒ Ð¿ÐŸÑÑÐŽÐºÐµ. Ð­ÑÐŸ Ð±ÑÐŽÐµÑ Ð±Ð»ÐŸÐºÐžÑÐŸÐ²Ð°ÐœÐŸ, ÐµÑÐ»Ðž ÑÐ°Ð·ÐŒÐµÑ Ð³ÑÑÐ¿Ð¿Ñ Ð±ÐŸÐ»ÑÑÐµ ÐµÐŽÐžÐœÐžÑÑ.  
+
+import.statsfile:ÐÐŒÑ ÑÐ°Ð¹Ð»Ð° ÐžÐ»Ðž ÐžÐœÐŽÐµÐºÑ ÐŽÐ»Ñ Ð·Ð°Ð¿ÐžÑÐž ÑÑÐ°ÑÐžÑÑÐžÐºÐž ÐžÐŒÐ¿ÐŸÑÑÐ° Ð².
+
+import.stats_backup:ÐÐŒÐµÑÑÐŸ ÑÑÐŸÐ³ÐŸ Ð±ÑÐŽÐµÑ Ð·Ð°Ð¿ÐžÑÑÐ²Ð°ÑÑ stats Ð² STDERR.
+
+import.verbosity:Ð£Ð¿ÑÐ°Ð²Ð»ÐµÐœÐžÐµ ÐºÐŸÐ»ÐžÑÐµÑÑÐ²ÐŸÐŒ Ð¿ÑÐŸÐŽÑÐºÑÐžÐž. 0=ÐœÐžÑÐµÐ³ÐŸ, 3=Ð±ÐŸÐ»ÑÑÐŸÐµ ÐºÐŸÐ»ÐžÑÐµÑÑÐ²ÐŸ.
+
+# -- schedule.pl --
+schedule.deleted:Ð Ð°ÑÐ¿ÐžÑÐ°ÐœÐœÐŸÐµ Ð²ÑÐ¿ÐŸÐ»ÐœÐµÐœÐžÐµ ÑÐŽÐ°Ð»ÐµÐœÐŸ ÐŽÐ»Ñ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž  
+schedule.scheduled:ÐÑÐ¿ÐŸÐ»ÐœÐµÐœÐžÐµ ÑÑÐµÐœÐ°ÑÐžÑ, ÑÐŸÐ·ÐŽÐ°ÐœÐœÐŸÐ³ÐŸ ÐŽÐ»Ñ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž  
+schedule.cron:Ð Ð°ÑÐ¿ÐžÑÐ°ÐœÐœÐŸÐµ Ð²ÑÐ¿ÐŸÐ»ÐœÐµÐœÐžÐµ - ÑÑÑÐ°ÐœÐŸÐ²Ð»ÐµÐœÐœÐŸÐµ ÐŽÐ»Ñ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž  
+schedule.params:[ÐŸÐ¿ÑÐžÐž]  
+schedule.error.email:-email ÑÑÐµÐ±ÑÐµÑÑÑ -smtp -toaddr Ðž -fromaddr ÐŽÐŸÐ»Ð¶ÐœÑ Ð±ÑÑÑ ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÑ.  
+schedule.error.importbuild:-import Ðž -build ÐŽÐŸÐ»Ð¶ÐœÑ Ð±ÑÑÑ ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÑ.  
+schedule.error.colname:ÐÐŸÐ»Ð»ÐµÐºÑÐžÑ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑÑÑ ÐžÐŒÑ -colname ÐŽÐŸÐ»Ð¶ÐœÐŸ Ð±ÑÑÑ ÑÐºÐ°Ð·Ð°ÐœÐŸ.  
+schedule.gli:ÐÐ°Ð¿ÑÑÐº ÐžÐ· ÐÐžÐ±Ð»ÐžÐŸÑÐµÑÐœÐŸÐ³ÐŸ ÐžÐœÑÐµÑÑÐµÐ¹ÑÐ° - GLI  
+schedule.frequency:ÐÐ°Ðº ÑÐ°ÑÑÐŸ Ð°Ð²ÑÐŸÐŒÐ°ÑÐžÑÐµÑÐºÐž Ð¿ÐŸÐ²ÑÐŸÑÐœÐŸ Ð¿ÐµÑÐµÑÑÑÐŸÐžÑÑ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ  
+schedule.frequency.hourly:ÐÐµÑÐµÑÑÑÐŸÐžÑÑ ÐºÐ°Ð¶ÐŽÑÐ¹ ÑÐ°Ñ  
+schedule.frequency.daily:ÐÐµÑÐµÑÑÑÐŸÐžÑÑ ÐºÐ°Ð¶ÐŽÑÐ¹ ÐŽÐµÐœÑ  
+schedule.frequency.weekly:ÐÐµÑÐµÑÑÑÐŸÐžÑÑ ÐºÐ°Ð¶ÐŽÑÑ ÐœÐµÐŽÐµÐ»Ñ  
+schedule.action:ÐÐ°Ðº ÐœÐ°ÑÑÑÐŸÐžÑÑ Ð°Ð²ÑÐŸÐŒÐ°ÑÐžÑÐµÑÐºÐŸÐµ Ð¿ÐŸÐ²ÑÐŸÑÐœÐŸÐµ Ð¿ÐŸÑÑÑÐŸÐµÐœÐžÐµ  
+schedule.action.add:Ð Ð°ÑÐ¿ÐžÑÐ°ÑÑ Ð°Ð²ÑÐŸÐŒÐ°ÑÐžÑÐµÑÐºÐŸÐµ Ð¿ÐŸÐ²ÑÐŸÑÐœÐŸÐµ Ð¿ÐŸÑÑÑÐŸÐµÐœÐžÐµ  
+schedule.action.update:ÐÐ±ÐœÐŸÐ²ÐžÑÑ ÑÑÑÐµÑÑÐ²ÑÑÑÐµÐµ ÑÐ°ÑÐ¿ÐžÑÐ°ÐœÐžÐµ  
+schedule.action.delete:Ð£ÐŽÐ°Ð»ÐžÑÑ ÑÑÑÐµÑÑÐ²ÑÑÑÐµÐµ ÑÐ°ÑÐ¿ÐžÑÐ°ÐœÐžÐµ  
+schedule.email:ÐÐŸÑÐ»Ð°ÑÑ ÑÐ²ÐµÐŽÐŸÐŒÐ»ÐµÐœÐžÐµ Ð¿ÐŸ email  
+schedule.schedule:ÐÑÐ±ÐµÑÐžÑÐµ ÐŽÐ»Ñ ÑÐŸÐ·ÐŽÐ°ÐœÐžÑ Ð·Ð°Ð¿Ð»Ð°ÐœÐžÑÐŸÐ²Ð°ÐœÐœÐŸÐ³ÐŸ Ð°Ð²ÑÐŸÐŒÐ°ÑÐžÑÐµÑÐºÐŸÐ³ÐŸ Ð¿ÐŸÑÑÑÐŸÐµÐœÐžÑ  
+schedule.colname:ÐÐŒÑ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž ÐŽÐ»Ñ ÐºÐŸÑÐŸÑÐŸÐ³ÐŸ Ð·Ð°Ð¿Ð»Ð°ÐœÐžÑÐŸÐ²Ð°ÐœÐŸ ÑÐ°ÑÐ¿ÐžÑÐ°ÐœÐžÐµ  
+schedule.import:ÐÐŸÐŒÐ°ÐœÐŽÐ° ÐžÐŒÐ¿ÐŸÑÑÐ° ÐŽÐŸÐ»Ð¶ÐœÐ° Ð±ÑÑÑ Ð²ÐºÐ»ÑÑÐµÐœÐ° Ð² ÑÐ°ÑÐ¿ÐžÑÐ°ÐœÐžÐµ  
+schedule.build:ÐÐŸÐŒÐ°ÐœÐŽÐ° buildcol Ð±ÑÐŽÐµÑ Ð²ÐºÐ»ÑÑÐµÐœÐ° Ð² ÑÐ°ÑÐ¿ÐžÑÐ°ÐœÐžÐµ  
+schedule.toaddr:ÐÐŽÑÐµÑ ÑÐ»ÐµÐºÑÑÐŸÐœÐœÐŸÐ¹ Ð¿ÐŸÑÑÑ ÐÐŸÐŒÑ ÐŸÑÐ¿ÑÐ°Ð²Ð»ÑÑÑ ÑÐ²ÐµÐŽÐŸÐŒÐ»ÐµÐœÐžÑ ÐŸ Ð¿ÐŸÑÑÑÐŸÐµÐœÐžÐž  
+schedule.toaddr.default:Ð£ÐºÐ°Ð¶ÐžÑÐµ Ð°ÐŽÑÐµÑÐ° ÑÐ»ÐµÐºÑÑÐŸÐœÐœÐŸÐ¹ Ð¿ÐŸÑÑÑ Ð¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÐµÐ»ÐµÐ¹ Ð² ÐŒÐµÐœÑ Ð€Ð°Ð¹Ð»-> ÐÐ°ÑÑÑÐŸÐ¹ÐºÐž  
+schedule.fromaddr:Email ÐŸÑÐ¿ÑÐ°Ð²ÐžÑÐµÐ»Ñ  
+schedule.fromaddr.default:ÐÐ¿ÑÐµÐŽÐµÐ»ÐžÑÐµ ÐºÑÐŸ Ð·Ð°ÐœÐžÐŒÐ°ÐµÑÑÑ Ð¿ÐŸÐŽÐŽÐµÑÐ¶ÐºÐŸÐ¹ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž Ð² main.cfg  
+schedule.smtp:ÐÐŸÑÑÐŸÐ²ÑÐ¹ ÑÐµÑÐ²ÐµÑ sendmail, ÐœÐµÐŸÐ±Ñ
+ÐŸÐŽÐžÐŒÑÐ¹ ÐŽÐ»Ñ ÑÐ»ÐµÐºÑÑÐŸÐœÐœÐŸÐ¹ Ð¿ÐŸÑÑÑ  
+schedule.smtp.default:Ð£ÐºÐ°Ð¶ÐžÑÐµ MailServer Ð² main.cfg  
+schedule.out:Ð£ÐºÐ°Ð¶ÐžÑÐµ ÐžÐŒÑ ÑÐ°Ð¹Ð»Ð° ÐºÑÐŽÐ° Ð¿ÐµÑÐ°ÑÐ°ÑÑ ÑÑÐ°ÑÑÑ.  
+# -- export.pl --
+
+export.exportdir:ÐÐŽÐµ ÐœÐ°Ñ
+ÐŸÐŽÐžÑÑÑ ÑÐºÑÐ¿ÐŸÑÑÐžÑÐŸÐ²Ð°ÐœÐœÑÐ¹ ÐŒÐ°ÑÐµÑÐžÐ°Ð».
+
+export.cannot_open_stats_file:ÐÐÐÐÐÐÐÐ: ÐÐµÐ²ÐŸÐ·ÐŒÐŸÐ¶ÐœÐŸ ÐŸÑÐºÑÑÑÑ ÑÐ°Ð¹Ð» ÑÑÐ°ÑÑ %s
+
+export.cannot_open_fail_log:ÐÐšÐÐÐÐ: ÐÐµÐ²ÐŸÐ·ÐŒÐŸÐ¶ÐœÐŸ ÐŸÑÐºÑÑÑÑ ÑÐ°Ð¹Ð» Ð»ÐŸÐ³ %s
+
+export.cannot_sort:ÐÐÐÐÐÐÐÐ: export.pl ÐœÐµ ÐŒÐŸÐ¶ÐµÑ ÑÐŸÑÑÐžÑÐŸÐ²Ð°ÑÑ ÐŽÐŸÐºÑÐŒÐµÐœÑÑ, ÐµÑÐ»Ðž ÑÐ°Ð·ÐŒÐµÑ Ð³ÑÑÐ¿Ð¿Ñ > 1. ÐÐµÑÐ°-ÐŸÐ¿ÑÐžÑ ÑÐŸÑÑÐžÑÐŸÐ²ÐºÑ Ð±ÑÐŽÐµÑ Ð¿ÑÐŸÐžÐ³ÐœÐŸÑÐžÑÐŸÐ²Ð°ÐœÐ°.
+
+export.collectdir:ÐÑÑÑ Ðº ÐŽÐžÑÐµÐºÑÐŸÑÐžÐž  ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž "collect".  
+
+export.complete:Ð­ÐºÑÐ¿ÐŸÑÑÐžÑÐŸÐ²Ð°ÐœÐµ ÐŸÐºÐŸÐœÑÐµÐœÐœÐŸ.
+
+export.debug:ÐÑÐ²ÐµÑÑÐž ÑÐºÑÐ¿ÐŸÑÑÐžÑÐŸÐ²Ð°ÐœÐœÑÐ¹ ÑÐµÐºÑÑ Ð² STDOUT (ÐŽÐ»Ñ ÑÐºÑÐ¿ÐŸÑÑÐžÑÐŸÐ²Ð°ÐœÐžÑ Ð² GreenstoneXML).  
+
+export.desc:PERL ÑÐºÑÐžÐ¿Ñ ÐŽÐ»Ñ ÑÐºÑÐ¿ÐŸÑÑÐžÑÐŸÐ²Ð°ÐœÐžÑ ÑÐ°Ð¹Ð»ÐŸÐ² Ð² ÐÑÐžÐœÑÑÐŸÐœ Ð² ÐŽÑÑÐ³ÐŸÐ¹ ÑÐŸÑÐŒÐ°Ñ.  
+
+export.faillog:ÐÐµÑÐŽÐ°Ð»ÐŸÑÑ Ð·Ð°Ð¿ÐžÑÐ°ÑÑ Ð² Ð»ÐŸÐ³ ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµ ÑÐ°Ð¹Ð»Ð°. Ð­ÑÐŸÑ Ð»ÐŸÐ³ Ð·Ð°Ð¿ÐžÑÑÐ²Ð°ÐµÑ ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµ ÑÐ°Ð¹Ð»ÐŸÐ², ÐºÐŸÑÐŸÑÑÐµ ÐœÐµ ÑÐŒÐŸÐ³Ð»Ðž Ð±ÑÑÑ ÐŸÐ±ÑÐ°Ð±ÐŸÑÐ°ÐœÐœÑ. (ÐÑÑÑ Ð¿ÐŸ ÑÐŒÐŸÐ»ÑÐ°ÐœÐžÑ: collectdir/collect/collname/etc/fail.log)  
+
+export.groupsize:Ð§ÐžÑÐ»ÐŸ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ² ÐŽÐ»Ñ Ð³ÑÑÐ¿Ð¿ÐžÑÐŸÐ²ÐºÐž Ð² ÐŸÐŽÐœÐŸÐŒ XML ÑÐ°Ð¹Ð»Ðµ.  
+
+export.gzip:ÐÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÑ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÑ gzip ÐŽÐ»Ñ ÐºÐŸÐŒÐ¿ÑÐžÐŒÐžÑÐŸÐ²Ð°ÐœÐžÑ ÑÐµÐ·ÑÐ»ÑÑÐžÑÑÑÑÐžÑ
+ xml ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ² (ÐœÐµ Ð·Ð°Ð±ÑÐŽÑÑÐµ Ð²ÐºÐ»ÑÑÐžÑÑ ZIPPlug Ð² ÑÐ¿ÐžÑÐŸÐº Ð²Ð°ÑÐžÑ
+ Ð¿Ð»Ð°Ð³ÐžÐœÐŸÐ² Ð¿ÑÐž ÐºÐŸÐœÑÑÑÑÐžÑÐŸÐ²Ð°ÐœÐžÐž ÐžÐ· ÐºÐŸÐŒÐ¿ÑÐžÐŒÐžÑÐŸÐ²Ð°ÐœÐžÐž ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ²).  
+
+export.importdir:ÐÐŽÐµ ÐœÐ°Ñ
+ÐŸÐŽÐžÑÑÑ ÐžÑÑ
+ÐŸÐŽÐœÑÐ¹ ÐŒÐ°ÑÐµÑÐžÐ°Ð».
+
+export.keepold:ÐÐµ ÑÐœÐžÑÑÐŸÐ¶ÐžÑ ÐœÐ°ÑÑÐŸÑÑÐµÐµ ÑÐŸÐŽÐµÑÐ¶Ð°ÐœÐžÐµ ÑÐºÑÐ¿ÐŸÑÑÐžÑÐŸÐ²Ð°ÐœÐœÐŸÐ¹ ÐŽÐžÑÐµÐºÑÐŸÑÐžÐž.  
+
+export.maxdocs:ÐÐ°ÐºÑÐžÐŒÐ°Ð»ÑÐœÐŸÐµ ÑÐžÑÐ»ÐŸ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ², Ð¿ÑÐµÐŽÐœÐ°Ð·ÐœÐ°ÑÐµÐœÐœÑÑ
+ ÐŽÐ»Ñ ÑÐºÑÐ¿ÐŸÑÑÐ°.  
+
+export.listall:ÐÐŸÐºÐ°Ð·Ð°ÑÑ Ð²ÑÐµ ÑÐŸÑÐŒÐ°ÑÑ ÑÐŸÑ
+ÑÐ°ÐœÐµÐœÐžÑ  
+
+export.saveas:Ð ÐºÐ°ÐºÐŸÐŒ ÑÐŸÑÐŒÐ°ÑÐµ ÑÐºÑÐ¿ÐŸÑÑÐžÑÐŸÐ²Ð°ÑÑ.  
+
+export.saveas.DSpace:Ð€ÐŸÑÐŒÐ°Ñ DSpace Archive.  
+
+export.saveas.GreenstoneMETS:METS ÑÐŸÑÐŒÐ°Ñ Ñ Ð¿ÑÐžÐŒÐµÐœÐµÐœÐžÐµÐŒ Ð¿ÑÐŸÑÐžÐ»Ñ ÐÑÐžÐœÑÑÐŸÑÐœ.  
+export.saveas.FedoraMETS:METS ÑÐŸÑÐŒÐ°Ñ Ñ Ð¿ÑÐžÐŒÐµÐœÐµÐœÐžÐµÐŒ Ð¿ÑÐŸÑÐžÐ»Ñ Fedora.  
+
+export.saveas.GreenstoneXML:Ð€ÐŸÑÐŒÐ°Ñ XML Ð°ÑÑ
+ÐžÐ²Ð° ÐÑÐžÐœÑÑÐŸÑÐœ  
+
+export.saveas.MARCXML:Ð€ÐŸÑÐŒÐ°Ñ MARC XML (XML-Ð²ÐµÑÑÐžÑ MARC 21)  
+
+export.out:ÐÐ°Ð·Ð²Ð°ÐœÐžÐµ ÑÐ°Ð¹Ð»Ð° ÐžÐ»Ðž ÐµÐ³ÐŸ ÐžÐŽÐµÐœÑÐžÑÐžÐºÐ°ÑÐŸÑ, Ð² ÐºÐŸÑÐŸÑÑÐ¹ Ð±ÑÐŽÐµÑ Ð·Ð°Ð¿ÐžÑÐ°Ðœ ÑÑÐ°ÑÑÑ Ð²ÑÐ²ÐŸÐŽÐ°.
+
+export.params:[ÐŸÐ¿ÑÐžÐž] ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµ-ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž1 ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµ-ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž2...  
+
+export.removeold:Ð£ÐŽÐ°Ð»ÐžÑ ÑÑÐ°ÑÐŸÐµ ÑÐŸÐŽÐµÑÐ¶Ð°ÐœÐžÐµ ÑÐºÑÐ¿ÐŸÑÑÐžÑÐŸÐ²Ð°ÐœÐœÐŸÐ¹ ÐŽÐžÑÐµÐºÑÐŸÑÐžÐž.  
+
+export.removing_export:Ð£ÐŽÐ°Ð»ÐµÐœÐžÐµ ÐœÐ°ÑÑÐŸÑÑÐµÐ³ÐŸ ÑÐŸÐŽÐµÑÐ¶Ð°ÐœÐžÑ ÑÐºÑÐ¿ÐŸÑÑÐžÑÐŸÐ²Ð°ÐœÐœÐŸÐ¹ ÐŽÐžÑÐµÐºÑÐŸÑÐžÐž...
+
+export.sortmeta:Ð¡ÐŸÑÑÐžÑÐŸÐ²Ð°ÑÑ ÐŽÐŸÐºÑÐŒÐµÐœÑÑ Ð² Ð°Ð»ÑÐ°Ð²ÐžÑÐœÐŸÐŒ Ð¿ÐŸÑÑÐŽÐºÐµ Ñ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÐœÐžÐµÐŒ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ ÐŽÐ»Ñ Ð¿ÐŸÑÑÑÐŸÐµÐœÐžÑ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž. Ð­ÑÐŸ Ð±ÑÐŽÐµÑ Ð±Ð»ÐŸÐºÐžÑÐŸÐ²Ð°ÐœÐŸ, ÐµÑÐ»Ðž ÑÐ°Ð·ÐŒÐµÑ Ð³ÑÑÐ¿Ð¿Ñ> 1.
+
+export.statsfile:ÐÐ°Ð·Ð²Ð°ÐœÐžÐµ ÑÐ°Ð¹Ð»Ð° ÐžÐ»Ðž ÐµÐ³ÐŸ ÐžÐŽÐµÐœÑÐžÑÐžÐºÐ°ÑÐŸÑ, Ð² ÐºÐŸÑÐŸÑÑÐ¹ Ð±ÑÐŽÑÑ Ð·Ð°Ð¿ÐžÑÐ°ÐœÑ ÑÑÐ°ÑÐžÑÑÐžÐºÐž ÑÐºÑÐ¿ÐŸÑÑÐ°.
+
+export.stats_backup:ÐÐ·Ð°ÐŒÐµÐœ Ð²ÑÐ²ÐŸÐŽÐžÑ ÐœÐ° STDERR (Ð¿ÑÐŸÑÐŸÐºÐŸÐ» ÐŸÑÐžÐ±ÐŸÐº).
+
+export.verbosity:ÐÐŸÐœÑÑÐŸÐ»ÐžÑÑÐµÑ ÐºÐŸÐ»Ð»ÐžÑÐµÑÑÐ²ÐŸ Ð²ÑÐ²ÐŸÐŽÐ°.  0=ÐœÐžÑÐµÐ³ÐŸ, 3=ÐŒÐœÐŸÐ³ÐŸ.
+
+
+
+# -- mkcol.pl --
+
+mkcol.about:Ð ÑÐµÐºÑÑÐµ ÐŽÐ»Ñ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž.
+
+mkcol.bad_name_cvs:ÐÐšÐÐÐÐ: ÐÐžÐºÐ°ÐºÐ°Ñ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ ÐœÐµ ÐŒÐŸÐ¶ÐµÑ Ð±ÑÑÑ ÐœÐ°Ð·Ð²Ð°ÐœÐ° CVS, Ð¿ÐŸÑÐºÐŸÐ»ÑÐºÑ ÑÑÐŸ ÐŒÐŸÐ¶ÐµÑ ÐœÐ°Ð»ÐŸÐ¶ÐžÑÑÑÑ ÐœÐ° ÐŽÐžÑÐµÐºÑÐŸÑÐžÐž, ÑÐŸÐ·ÐŽÐ°ÐœÐœÑÐµ Ð²ÐµÑÑÐžÐµÐ¹ CVS ÑÐžÑÑÐµÐŒÑ.
+
+mkcol.bad_name_svn:ÐÐšÐÐÐÐ: ÐÐŸÐ»Ð»ÐµÐºÑÐžÑ ÐœÐµ ÐŒÐŸÐ¶ÐµÑ Ð±ÑÑÑ ÐœÐ°Ð·Ð²Ð°ÐœÐ° .svn Ð¿ÐŸÑÐºÐŸÐ»ÑÐºÑ ÑÑÐŸ Ð¿ÐµÑÐµÑÐµÐºÐ°ÐµÑÑÑ Ñ ÐŽÐžÑÐµÐºÑÐŸÑÐžÑÐŒÐž ÑÐŸÐ·ÐŽÐ°ÐœÐœÑÐŒÐž Ð² ÑÐ°Ð¹Ð»ÐŸÐ²ÐŸÐ¹ ÑÐžÑÑÐµÐŒÐµ SVN.  
+
+mkcol.bad_name_modelcol:ÐÐšÐÐÐÐ: ÐÐŸÐ»Ð»ÐµÐºÑÐžÐž ÐœÐµÐ»ÑÐ·Ñ ÐœÐ°Ð·ÑÐ²Ð°ÑÑ modelcol, Ð¿ÐŸÑÐºÐŸÐ»ÑÐºÑ ÑÑÐŸ ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµ ÐŒÐŸÐŽÐµÐ»ÑÐœÐŸÐ¹ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž.  
+
+mkcol.cannot_find_modelcol:ÐÐšÐÐÐÐ: ÐÐµÐ²ÐŸÐ·ÐŒÐŸÐ¶ÐœÐŸ ÐœÐ°Ð¹ÑÐž ÐŒÐŸÐŽÐµÐ»ÑÐœÑÑ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ %s
+
+mkcol.col_already_exists:ÐÐšÐÐÐÐ: Ð­ÑÐ° ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ ÑÐ¶Ðµ ÑÑÑÐµÑÑÐ²ÑÐµÑ.
+
+mkcol.collectdir:ÐÐžÑÐµÐºÑÐŸÑÐžÑ, Ð³ÐŽÐµ ÐœÐŸÐ²Ð°Ñ ÐºÐŸÐ»ÐµÐºÑÐžÑ Ð±ÑÐŽÐµÑ ÑÐŸÐ·ÐŽÐ°ÐœÐ°.
+
+mkcol.group_not_valid_in_gs3:Ð³ÑÑÐ¿Ð¿ÐŸÐ²Ð°Ñ ÐŸÐ¿ÑÐžÑ ÐœÐµ Ð²Ð°Ð»ÐžÐŽÐœÐ° Ð² ÑÐµÐ¶ÐžÐŒÐµ ÐÑÐžÐœÑÑÐŸÑÐœ 3 (-gs3mode)  
+mkcol.creating_col:Ð¡ÐŸÐ·ÐŽÐ°ÐœÐžÐµ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž %s
+
+mkcol.creator:ÐÐŽÑÐµÑ ÑÐ»ÐµÐºÑÑÐŸÐœÐœÐŸÐ¹ Ð¿ÐŸÑÑÑ ÑÐŸÐ·ÐŽÐ°ÑÐµÐ»Ñ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž.
+
+mkcol.creator_undefined:ÐÐšÐÐÐÐ: ÑÐŸÐ·ÐŽÐ°ÑÐµÐ»Ñ ÐœÐµ Ð±ÑÐ» ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœ. Ð­ÑÐ° Ð¿ÐµÑÐµÐŒÐµÐœÐœÐ°Ñ ÐœÐµÐŸÐ±Ñ
+ÐŸÐŽÐžÐŒÐ°, ÑÑÐŸÐ±Ñ ÑÐ°ÑÐ¿ÐŸÐ·ÐœÐ°ÑÑ ÐŽÑÐ±Ð»ÐžÐºÐ°ÑÑ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž.
+
+mkcol.desc:Ð¡ÐºÑÐžÐ¿Ñ PERL, ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÐŒÑÐ¹ ÐŽÐ»Ñ ÑÐŸÐ·ÐŽÐ°ÐœÐžÑ ÑÑÑÑÐºÑÑÑÑ ÐŽÐžÑÐµÐºÑÐŸÑÐžÐž ÐŽÐ»Ñ ÐœÐŸÐ²ÐŸÐ¹ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž Greenstone.
+
+mkcol.doing_replacements:Ð²ÑÐ¿ÐŸÐ»ÐœÐµÐœÐžÐµ Ð·Ð°ÐŒÐµÐœ ÐŽÐ»Ñ %s
+
+mkcol.group:Ð¡ÐŸÐ·ÐŽÐ°ÐœÐžÐµ Ð³ÑÑÐ¿Ð¿ ÐœÐŸÐ²ÑÑ
+ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐ¹ Ð²ÐŒÐµÑÑÐŸ ÑÑÐ°ÐœÐŽÐ°ÑÑÐœÐŸÐ¹ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž.  
+
+mkcol.gs3mode:Ð ÐµÐ¶ÐžÐŒ ÐŽÐ»Ñ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐ¹ ÐÑÐžÐœÑÑÐŸÑÐœ 3-Ð¹ Ð²ÐµÑÑÐžÐž  
+
+mkcol.long_colname:ÐÐšÐÐÐÐ: ÐÐŒÑ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž ÐŽÐŸÐ»Ð¶ÐœÐŸ ÑÐŸÐŽÐµÑÐ¶Ð°ÑÑ ÐŒÐµÐœÐµÐµ 8 Ð·ÐœÐ°ÐºÐŸÐ², ÑÑÐŸÐ±Ñ Ð±ÑÑÑ ÑÐŸÐ²ÐŒÐµÑÑÐžÐŒÑÐŒ  Ñ Ð±ÐŸÐ»ÐµÐµ ÑÐ°ÐœÐœÐžÐŒÐž ÑÐ°Ð¹Ð»ÐŸÐ²ÑÐŒÐž ÑÐžÑÑÐµÐŒÐ°ÐŒÐž Ðž ÐžÐŒÐµÑÑ Ð²ÐŸÐ·ÐŒÐŸÐ¶ÐœÐŸÑÑÑ Ð¿ÐŸÐŽÐŽÐµÑÐ¶ÐºÐž.
+
+mkcol.maintainer:ÐÐŽÑÐµÑ ÑÐ»ÐµÐºÑÑÐŸÐœÐœÐŸÐ¹ Ð¿ÐŸÑÑÑ Ð»ÐžÑÐ°, Ð¿ÐŸÐŽÐŽÐµÑÐ¶ÐžÐ²Ð°ÑÑÐµÐ³ÐŸ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ (ÐµÑÐ»Ðž ÐŸÐœ ÐŸÑÐ»ÐžÑÐ°ÐµÑÑÑ ÐŸÑ ÑÐŸÐ·ÐŽÐ°ÑÐµÐ»Ñ).
+
+mkcol.no_collectdir:ÐÐšÐÐÐÐ: ÐÐžÑÐµÐºÑÐŸÑÐžÑ collect ÐœÐµ ÑÑÑÐµÑÑÐ²ÑÐµÑ: %s
+
+mkcol.no_collectdir_specified:ÐÐšÐÐÐÐ: ÐÐµ ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐ° ÐŽÐžÑÐµÐºÑÐŸÑÐžÑ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž. Ð gs3mode, ÐžÐ»Ðž ÐŸÐ¿ÑÐžÐž: -site ÐžÐ»Ðž -collectdir ÐŽÐŸÐ»Ð¶ÐœÑ Ð±ÑÑÑ ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÑ.  
+
+mkcol.no_colname:ÐÐšÐÐÐÐ: ÐÐžÐºÐ°ÐºÐŸÐ³ÐŸ ÐžÐŒÐµÐœÐž ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž ÐœÐµ Ð±ÑÐ»ÐŸ Ð·Ð°ÐŽÐ°ÐœÐŸ.
+
+mkcol.optionfile:ÐÐŸÐ»ÑÑÐžÑÑ ÐŸÐ¿ÑÐžÐž ÑÐ°Ð¹Ð»Ð°, Ð¿ÐŸÐ»ÐµÐ·ÐœÐŸÐ³ÐŸ ÐŽÐ»Ñ ÑÐžÑÑÐµÐŒ, Ð³ÐŽÐµ ÐŽÐ»ÐžÐœÐœÑÐµ ÐºÐŸÐŒÐ°ÐœÐŽÐœÑÐµ ÑÑÑÐŸÐºÐž ÐŒÐŸÐ³ÑÑ Ð²ÑÐ·ÑÐ²Ð°ÑÑ Ð¿ÑÐŸÐ±Ð»ÐµÐŒÑ.
+
+mkcol.params:[ÐŸÐ¿ÑÐžÐž] ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž  
+
+mkcol.plugin:ÐÐŸÐŽÑÐ»Ñ Ð¿Ð»Ð°Ð³ÐžÐœÐ° Perl ÐŽÐ»Ñ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÐœÐžÑ (Ð·ÐŽÐµÑÑ ÐŒÐŸÐ³ÑÑ Ð±ÑÑÑ ÐŒÐœÐŸÐ³ÐŸÐºÑÐ°ÑÐœÑÐµ Ð²Ñ
+ÐŸÐ¶ÐŽÐµÐœÐžÑ Ð¿Ð»Ð°Ð³ÐžÐœÐ°).
+
+mkcol.public:ÐÐŒÐµÐµÑ Ð»Ðž ÑÑÐ° ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ Ð°ÐœÐŸÐœÐžÐŒÐœÑÐ¹  ÐŽÐŸÑÑÑÐ¿.  
+mkcol.public.true:ÐÐŸÐ»Ð»ÐµÐºÑÐžÑ ÐŸÑÐºÑÑÑÐŸÐ³ÐŸ Ð¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÐœÐžÑ  
+mkcol.public.false:ÐÐŸÐ»Ð»ÐµÐºÑÐžÑ ÑÐ°ÑÑÐœÐŸÐ³ÐŸ Ð¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÐœÐžÑ  
+
+mkcol.quiet:Ð Ð°Ð±ÐŸÑÐ°ÑÑ ÑÐ¿ÐŸÐºÐŸÐ¹ÐœÐŸ.
+
+mkcol.site:Ð ÑÐµÐ¶ÐžÐŒÐµ gs3mode, ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑÑÑ ÑÑÐŸ ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµ ÑÐ°Ð¹ÑÐ° Ñ Ð¿ÐµÑÐµÐŒÐµÐœÐœÐŸÐ¹ ÑÑÐµÐŽÑ GSDL3HOME ÐŽÐ»Ñ ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐžÑ ÐŽÐžÑÐµÐºÑÐŸÑÐžÐž ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž collectdir, ÐµÑÐ»Ðž -collectdir ÑÐºÐ°Ð·Ð°Ðœ.  
+
+mkcol.success:ÐÐŸÐ²Ð°Ñ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ Ð±ÑÐ»Ð° ÑÐŸÐ·ÐŽÐ°ÐœÐ° ÑÑÐ¿ÐµÑÐœÐŸ Ð² %s
+
+mkcol.title:ÐÐ°Ð·Ð²Ð°ÐœÐžÐµ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž.
+
+mkcol.win31compat:Ð£ÑÐžÑÑÐ²Ð°ÑÑ Ð»Ðž ÐºÐŸÐœÐ²ÐµÐœÑÐžÐž Windows 3.1, Ð¿ÑÐž Ð²ÑÐ±ÐŸÑÐµ ÐœÐ°Ð·Ð²Ð°ÐœÐžÐ¹ ÐŽÐ»Ñ ÐŽÐžÑÐµÐºÑÐŸÑÐžÐž (ÐœÐ°Ð¿ÑÐžÐŒÐµÑ, ÐœÐµ Ð±ÐŸÐ»ÐµÐµ 8 Ð·ÐœÐ°ÐºÐŸÐ²).  
+mkcol.win31compat.true:ÐÐ°Ð·Ð²Ð°ÐœÐžÐµ Ð¿Ð°Ð¿ÐºÐž ÐŽÐ»ÐžÐœÐŸÐ¹ Ð² 8 ÐžÐ»Ðž ÐŒÐµÐœÐµÐµ ÑÐžÐŒÐ²ÐŸÐ»ÐŸÐ²  
+mkcol.win31compat.false:ÐÐ°Ð·Ð²Ð°ÐœÐžÐµ Ð¿Ð°Ð¿ÐºÐž Ð»ÑÐ±ÐŸÐ¹ ÐŽÐ»ÐžÐœÑ  
+
+# -- pluginfo.pl --
+
+pluginfo.collection:ÐÑÐµÐŽÐŸÑÑÐ°Ð²Ð»ÐµÐœÐžÐµ ÐžÐŒÐµÐœÐž ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž Ð±ÑÐŽÐµÑ Ð²ÑÐ¿ÐŸÐ»ÐœÐµÐœÐŸ Ð¿ÑÐž Ð¿ÑÐŸÑÐŒÐŸÑÑÐµ Ð¿Ð»Ð°Ð³ÐžÐœÐŸÐ² Ð¿ÑÐµÐ¶ÐŽÐµ Ð²ÑÐµÐ³ÐŸ  Ð² collect/collection-name/perllib/plugins.  ÐÑÐ»Ðž Ð¿Ð»Ð°Ð³ÐžÐœ ÑÐ°ÐŒ ÐœÐµ ÐœÐ°Ð¹ÐŽÐµÐœ, ÑÐŸ ÐœÐ°ÐŽÐŸ Ð±ÑÐŽÐµÑ Ð¿ÑÐŸÑÐŒÐŸÑÑÐµÑÑ Ð² ÐŸÐ±ÑÐµÐ¹ ÐŽÐžÑÐµÐºÑÐŸÑÐžÐž perllib/plugins.
+
+pluginfo.desc:ÐÐ°Ð¿ÐžÑÐ°ÑÑ ÐžÐœÑÐŸÑÐŒÐ°ÑÐžÑ ÐŸ Ð¿Ð»Ð°Ð³ÐžÐœÐ°Ñ
+.
+
+pluginfo.general_options:ÐÐ±ÑÐžÐµ ÐŸÐ¿ÑÐžÐž, ÑÐœÐ°ÑÐ»ÐµÐŽÐŸÐ²Ð°ÐœÐœÑÐµ ÐŸÑ ÑÐŸÐŽÐžÑÐµÐ»ÑÑÐºÐžÑ
+ ÐºÐ»Ð°ÑÑÐŸÐ² Ð¿Ð»Ð°Ð³ÐžÐœÐŸÐ².
+
+pluginfo.info:ÐžÐœÑÐŸÑÐŒÐ°ÑÐžÑ
+
+pluginfo.no_plugin_name:ÐÐšÐÐÐÐ: ÐÑ ÐŽÐŸÐ»Ð¶ÐœÑ ÑÐºÐ°Ð·Ð°ÑÑ ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµ Ð¿Ð»Ð°Ð³ÐžÐœÐ°.  
+
+pluginfo.option_types:ÐÐ»Ð°Ð³ÐžÐœÑ ÐŒÐŸÐ³ÑÑ ÐžÐŒÐµÑÑ ÐŽÐ²Ð° ÑÐžÐ¿Ð° ÐŸÐ¿ÑÐžÐ¹.
+
+pluginfo.params:[ÐŸÐ¿ÑÐžÐž] ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµ Ð¿Ð»Ð°Ð³ÐžÐœÐ°  
+
+pluginfo.passing_options:ÐÐ¿ÑÐžÐž ÐŒÐŸÐ³ÑÑ Ð±ÑÑÑ Ð¿ÐµÑÐµÐŽÐ°ÐœÑ Ð»ÑÐ±ÑÐŒ Ð¿Ð»Ð°Ð³ÐžÐœÐ°ÐŒ Ð²ÐºÐ»ÑÑÐµÐœÐžÐµÐŒ ÐžÑ
+ Ð² ÐÐ°Ñ ÐºÐŸÐœÑÐžÐ³ÑÑÐ°ÑÐžÐŸÐœÐœÑÐ¹ ÑÐ°Ð¹Ð» collect.cfg.
+
+pluginfo.specific_options:Ð¡Ð¿ÐµÑÐžÑÐžÑÐµÑÐºÐžÐµ ÐŸÐ¿ÑÐžÐž ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÑ Ð² Ð¿ÑÐµÐŽÐµÐ»Ð°Ñ
+ ÑÐ°ÐŒÐžÑ
+ Ð¿Ð»Ð°Ð³ÐžÐœÐŸÐ² Ðž ÐŽÐŸÑÑÑÐ¿ÐœÑ ÑÐŸÐ»ÑÐºÐŸ ÑÑÐŸÐŒÑ ÑÐ¿ÐµÑÐžÑÐžÑÐµÑÐºÐŸÐŒÑ Ð¿Ð»Ð°Ð³ÐžÐœÑ.
+
+
+# -- plugoutinfo.pl --
+
+plugoutinfo.collection:ÐÐ°ÐŽÐ°ÐœÐžÐµ ÐžÐŒÐµÐœÐž ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž Ð·Ð°ÑÑÐ°Ð²ÐžÑ plugout.pl ÑÐœÐ°ÑÐ°Ð»Ð° ÑÐŒÐŸÑÑÐµÑÑ Ð² collect/collection-name/perllib/plugouts. ÐÑÐ»Ðž ÐŒÐŸÐŽÑÐ»Ñ ÐœÐµ Ð±ÑÐŽÐµÑ ÑÐ°ÐŒ ÐœÐ°Ð¹ÐŽÐµÐœ, Ð¿ÐŸÐžÑÐº Ð±ÑÐŽÐµÑ Ð¿ÑÐŸÐžÐ·Ð²ÐµÐŽÐµÐœ Ð² ÐŸÑÐœÐŸÐ²ÐœÐŸÐŒ ÐºÐ°ÑÐ°Ð»ÐŸÐ³Ðµ perllib/plugouts.  
+
+plugoutinfo.desc:ÐÑÐ²ÐµÑÑÐž ÐžÐœÑÐŸÑÐŒÐ°ÑÐžÑ ÐŸ ÐŒÐŸÐŽÑÐ»Ðµ.  
+
+plugoutinfo.general_options:ÐÑÐœÐŸÐ²ÐœÑÐµ ÐŸÐ¿ÑÐžÐž ÐœÐ°ÑÐ»ÐµÐŽÑÑÑÑÑ ÐŒÐŸÐŽÑÐ»ÐµÐŒ ÐŸÑ ÐºÐ»Ð°ÑÑÐ°-ÑÐŸÐŽÐžÑÐµÐ»Ñ.  
+
+plugoutinfo.info:ÐžÐœÑÐŸÑÐŒÐ°ÑÐžÑ  
+
+plugoutinfo.no_plugout_name:ÐÐšÐÐÐÐ: ÐœÐµÐŸÐ±Ñ
+ÐŸÐŽÐžÐŒÐŸ ÑÐºÐ°ÑÐ°ÑÑ ÐžÐŒÑ ÐŒÐŸÐŽÑÐ»Ñ.  
+
+plugoutinfo.option_types:ÐÐŸÐŽÑÐ»Ðž ÐŒÐŸÐ³ÑÑ Ð¿ÑÐžÐœÐžÐŒÐ°ÑÑ ÐŽÐ²Ð° Ð²ÐžÐŽÐ° ÐŸÐ¿ÑÐžÐ¹  
+
+plugoutinfo.params:[ÐŸÐ¿ÑÐžÐž] ÐžÐŒÑ-ÐŒÐŸÐŽÑÐ»Ñ  
+
+plugoutinfo.passing_options:ÐÐŸÐŽÑÐ»Ñ ÐŒÐŸÐ¶ÐœÐŸ Ð¿ÐµÑÐµÐŽÐ°Ð²Ð°ÑÑ ÐŸÐ¿ÑÐžÐž, Ð²ÐºÐ»ÑÑÐ°Ñ ÐžÑ
+ Ð² ÑÐŸÐ±ÑÑÐ²ÐµÐœÐœÑÐ¹ ÑÐ°Ð¹Ð» ÐºÐŸÐœÑÐžÐ³ÑÑÐ°ÑÐžÐž collect.cfg  
+
+plugoutinfo.specific_options:ÐÑÐŸÐ±ÑÐµ ÐŸÐ¿ÑÐžÐž ÐŒÐŸÐŽÑÐ»Ðž ÐŸÐ¿ÑÐµÐŽÐµÐ»ÑÑÑ ÑÐ°ÐŒÐž, Ðž Ð¿ÐŸÑÑÐŸÐŒÑ ÐŸÐœÐž ÐŽÐŸÑÑÑÐ¿ÐœÑ ÑÐŸÐ»ÑÐºÐŸ ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐœÐŸÐŒÑ ÐŒÐŸÐŽÑÐ»Ñ.  
+
+
+
+#
+# Classifier option descriptions
+#
+
+AllList.desc:Ð¡ÐŸÐ·ÐŽÐ°ÐµÑ ÐµÐŽÐžÐœÑÐ¹ ÑÐ¿ÐžÑÐŸÐº Ð²ÑÐµÑ
+ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ². ÐÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑÑÑ oaiserver.  
+
+AZCompactList.allvalues:ÐÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÑ Ð²ÑÐµ ÐœÐ°Ð¹ÐŽÐµÐœÐœÑÐµ Ð·ÐœÐ°ÑÐµÐœÐžÑ ÐŒÐµÑÐ°-ÐŽÐ°ÐœÐœÑÑ
+.
+
+AZCompactList.desc:ÐÐ»Ð°Ð³ÐžÐœ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÐ° ÐŽÐ»Ñ ÑÐŸÑÑÐžÑÐŸÐ²ÐºÐž Ð² Ð°Ð»ÑÐ°Ð²ÐžÑÐœÐŸÐŒ Ð¿ÐŸÑÑÐŽÐºÐµ (ÐŸÑ Ð-Ð¯, 0-9). ÐÑÐŸÐžÐ·Ð²ÐŸÐŽÐžÑ Ð³ÐŸÑÐžÐ·ÐŸÐœÑÐ°Ð»ÑÐœÑÐ¹ Ð-Ð¯ ÑÐ¿ÐžÑÐŸÐº. ÐÐ°ÑÐµÐŒ ÑÐ¿ÐžÑÐŸÐº, ÑÐŸÐŽÐµÑÐ¶Ð°ÑÐžÐ¹ Ð¿ÐµÑÐµÑÐµÐœÑ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ², ÐžÐ»Ðž ÐºÐœÐžÐ¶ÐœÑÐµ Ð¿ÐŸÐ»ÐºÐž Ñ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°ÐŒÐž, ÐžÐŒÐµÑÑÐžÐŒÐž ÐŸÐ±ÑÐžÐµ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÐµ.  
+
+AZCompactList.doclevel:Ð£ÑÐŸÐ²ÐµÐœÑ ÐŽÐ»Ñ ÐŸÐ±ÑÐ°Ð±ÐŸÑÐºÐž ÐŽÐŸÐºÑÐŒÐµÐœÑÐ° Ð².
+AZCompactList.doclevel.top:ÐŠÐµÐ»ÑÐ¹ ÐŽÐŸÐºÑÐŒÐµÐœÑ.
+AZCompactList.doclevel.section:Ð Ð°Ð·ÐŽÐµÐ»Ð°ÐŒÐž.
+
+AZCompactList.firstvalueonly:ÐÑÐ¿ÐŸÐ»ÑÐ·ÑÑÑÑÑ ÑÐŸÐ»ÑÐºÐŸ Ð¿ÐµÑÐ²ÑÐµ Ð·ÐœÐ°ÑÐµÐœÐžÑ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+.
+
+AZCompactList.freqsort:Ð¡ÐŸÑÑÐžÑÐŸÐ²Ð°ÑÑ Ð¿ÐŸ ÑÐ°ÑÑÐŸÑÐµ ÑÐ·Ð»Ð°, Ð° ÐœÐµ Ð² Ð°Ð»ÑÐ°Ð²ÐžÑÐœÐŸ-ÑÐžÑÑÐŸÐ²ÐŸÐŒ Ð¿ÐŸÑÑÐŽÐºÐµ.
+
+AZCompactList.maxcompact:ÐÐ°ÐºÑÐžÐŒÐ°Ð»ÑÐœÐŸÐµ ÑÐžÑÐ»ÐŸ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ², ÐºÐŸÑÐŸÑÑÐµ Ð±ÑÐŽÑÑ Ð¿ÐŸÐºÐ°Ð·Ð°ÐœÑ ÐœÐ° ÑÑÑÐ°ÐœÐžÑÐµ.
+
+AZCompactList.metadata:ÐÐŽÐžÐœÑÑÐ²ÐµÐœÐœÐŸÐµ Ð¿ÐŸÐ»Ðµ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+, ÐžÐ»Ðž Ð·Ð°Ð¿ÑÑÐ°Ñ ÑÐ°Ð·ÐŽÐµÐ»ÐžÑÐµÐ»Ñ Ð¿ÐŸÐ»ÐµÐ¹ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+, ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑÑÑ ÐŽÐ»Ñ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÐž. ÐÑÐ»Ðž ÑÐ¿ÐžÑÐŸÐº ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœ, Ð±ÑÐŽÐµÑ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÑÑÑ Ð¿ÐµÑÐ²ÑÐ¹ ÑÐžÐ¿ ÐŒÐµÑÐ°Ð»ÐŽÐ°ÐœÐœÑÑ
+, ÐºÐŸÑÐŸÑÑÐ¹ ÐŸÐ±Ð»Ð°ÐŽÐ°ÐµÑ Ð·ÐœÐ°ÑÐµÐœÐžÑÐŒÐž. ÐÐŸÐ¶ÐµÑ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÑÑÑ Ð² ÑÐŸÐµÐŽÐžÐœÐµÐœÐžÐž Ñ -firstvalueonly Ðž ÑÐ»Ð°Ð³Ð°ÐŒÐž -allvalues, ÐŽÐ»Ñ Ð²ÑÐ±ÐŸÑÐ° ÑÐŸÐ»ÑÐºÐŸ Ð¿ÐµÑÐ²ÐŸÐ³ÐŸ Ð·ÐœÐ°ÑÐµÐœÐžÑ, ÐžÐ»Ðž Ð²ÑÐµÑ
+ Ð·ÐœÐ°ÑÐµÐœÐžÐ¹ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ ÐžÐ· ÑÐ¿ÐžÑÐºÐ°.
+
+AZCompactList.mincompact:ÐÐžÐœÐžÐŒÐ°Ð»ÑÐœÐŸÐµ ÑÐžÑÐ»ÐŸ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ², ÐºÐŸÑÐŸÑÑÐµ Ð±ÑÐŽÑÑ Ð¿ÐŸÐºÐ°Ð·Ð°ÐœÑ ÐœÐ° ÑÑÑÐ°ÐœÐžÑÐµ.
+
+AZCompactList.mingroup:ÐÐ°ÐžÐŒÐµÐœÑÑÐ°Ñ ÑÐžÑÐ»ÐŸ, ÐºÐŸÑÐŸÑÐŸÐµ Ð²ÑÐ·ÑÐ²Ð°ÐµÑ ÑÐŸÑÐŒÐžÑÐŸÐ²Ð°ÐœÐžÐµ Ð³ÑÑÐ¿Ð¿ Ð² ÐžÐµÑÐ°ÑÑ
+ÐžÑÐµÑÐºÐŸÐŒ Ð¿ÐŸÑÑÐŽÐºÐµ.
+
+AZCompactList.minnesting:ÐÐ°ÐžÐŒÐµÐœÑÑÐµÐµ ÑÐžÑÐ»ÐŸ, ÐºÐŸÑÐŸÑÐŸÐµ Ð²ÑÐ·ÐŸÐ²ÐµÑ Ð¿ÑÐµÐŸÐ±ÑÐ°Ð·ÐŸÐ²Ð°ÐœÐžÐµ ÑÐ¿ÐžÑÐºÐ° Ð²ÐŸ Ð²Ð»ÐŸÐ¶ÐµÐœÐœÑÐ¹ ÑÐ¿ÐžÑÐŸÐº.
+
+AZCompactList.recopt:ÐÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÐŒÑÐ¹ Ð²ÐŸ Ð²Ð»ÐŸÐ¶ÐµÐœÐœÑÑ
+ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ ÑÐžÐ¿Ð° -ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÐµ ÐÐŸÐŽÐ°/ÐÑÐ³Ð°ÐœÐžÐ·Ð°ÑÐžÐž.
+AZCompactList.sort:ÐÐŸÐ»Ðµ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ ÐŽÐ»Ñ ÑÐŸÑÑÐžÑÐŸÐ²ÐºÐž ÐŽÐŸÑÐµÑÐœÐžÑ
+ ÑÐ·Ð»ÐŸÐ².  
+
+AZCompactSectionList.desc:ÐÐ°ÑÐžÐ°ÑÐžÐž Ð² AZCompactList, ÐºÐŸÑÐŸÑÑÐ¹ ÐºÐ»Ð°ÑÑÐžÑÐžÑÐžÑÑÐµÑ ÑÐ°Ð·ÐŽÐµÐ»Ñ, Ð° ÐœÐµ ÐŽÐŸÐºÑÐŒÐµÐœÑÑ. ÐÑ
+ÐŸÐ¶ÐŽÐµÐœÐžÑ ÐŸÑÑÐŸÑÑÐžÑÐŸÐ²Ð°ÐœÑ Ð¿ÐŸ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÐŒ ÑÑÐŸÐ²ÐœÑ ÑÐ°Ð·ÐŽÐµÐ»Ð°.
+
+AZList.desc:ÐÐ»Ð°Ð³ÐžÐœ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÐ° ÐŽÐ»Ñ ÑÐŸÑÑÐžÑÐŸÐ²ÐºÐž Ð² Ð°Ð»ÑÐ°Ð²ÐžÑÐœÐŸÐŒ Ð¿ÐŸÑÑÐŽÐºÐµ (ÐŸÑ Ð-Ð¯, 0-9). ÐÑÐŸÐžÐ·Ð²ÐŸÐŽÐžÑ Ð³ÐŸÑÐžÐ·ÐŸÐœÑÐ°Ð»ÑÐœÑÐ¹ Ð-Ð¯ ÑÐ¿ÐžÑÐŸÐº Ñ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°ÐŒÐž.  
+
+AZList.metadata:ÐÐŽÐžÐœÑÑÐ²ÐµÐœÐœÐŸÐµ Ð¿ÐŸÐ»Ðµ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ ÐžÐ»Ðž ÑÐ°Ð·ÐŽÐµÐ»ÐµÐœÐœÑÐ¹ Ð·Ð°Ð¿ÑÑÐŸÐ¹ ÑÐ¿ÐžÑÐŸÐº Ð¿ÐŸÐ»ÐµÐ¹ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+, ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÐŒÑÑ
+ ÐŽÐ»Ñ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÐž. Ð¡Ð»ÐµÐŽÑÑ Ð¿ÐŸÑÑÐŽÐºÑ, ÐŸÐ±ÐŸÐ·ÐœÐ°ÑÐµÐœÐœÐŸÐŒÑ Ð² ÑÐ¿ÐžÑÐºÐµ, Ð¿ÐµÑÐ²ÐŸÐµ Ð¿ÐŸÐ»Ðµ, ÐºÐŸÑÐŸÑÐŸÐµ ÑÐŸÐŽÐµÑÐ¶ÐžÑ Ð·ÐœÐ°ÑÐµÐœÐžÐµ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+, Ð±ÑÐŽÐµÑ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÑÑÑ. Ð¡Ð¿ÐžÑÐŸÐº Ð±ÑÐŽÐµÑ ÐŸÑÑÐŸÑÑÐžÑÐŸÐ²Ð°Ðœ Ð¿ÐŸ ÑÑÐŸÐŒÑ ÑÐ»ÐµÐŒÐµÐœÑÑ.
+
+AZSectionList.desc:ÐÐ»Ð°Ð³ÐžÐœ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÐ° ÐŽÐ»Ñ ÑÐŸÑÑÐžÑÐŸÐ²ÐºÐž ÑÐµÐºÑÐžÐ¹ Ð² Ð°Ð»ÑÐ°Ð²ÐžÑÐœÐŸÐŒ Ð¿ÐŸÑÑÐŽÐºÐµ. Ð¡ÐŸÑÑÐžÑÑÐµÑ Ð¿ÐŸ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÐŒ ÑÑÐŸÐ²ÐœÑ ÑÐµÐºÑÐžÐ¹.  
+
+BasClas.bad_general_option:ÐÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑ %s  ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑ ÐœÐµÐºÐŸÑÑÐµÐºÑÐœÑÑ ÐŸÐ±ÑÑÑ ÐŸÐ¿ÑÐžÑ. ÐÑÐŸÐ²ÐµÑÑÑÐµ ÐÐ°Ñ ÐºÐŸÐœÑÐžÐ³ÑÑÐ°ÑÐžÐŸÐœÐœÑÐ¹ ÑÐ°Ð¹Ð» collect.cfg.  
+
+BasClas.builddir:ÐÐŽÐµ Ð¿ÐŸÐŒÐµÑÑÐžÑÑ Ð¿ÐŸÑÑÑÐŸÐµÐœÐœÑÐµ ÐžÐœÐŽÐµÐºÑÑ.
+
+BasClas.buttonname:Ð¯ÑÐ»ÑÐº ÐŽÐ»Ñ Ð¿ÐŸÐºÐ°Ð·Ð° ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÐ° ÐœÐ° ÑÐºÑÐ°ÐœÐµ Ðž ÐºÐœÐŸÐ¿ÐºÐ° Ð² ÐœÐ°Ð²ÐžÐ³Ð°ÑÐžÐŸÐœÐœÐŸÐ¹ Ð»ÐžÐœÐµÐ¹ÐºÐµ. ÐÐŸ ÑÐŒÐŸÐ»ÑÐ°ÐœÐžÑ ÑÑÐŸ ÑÐ»ÐµÐŒÐµÐœÑ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ Ñ ÑÐºÐ°Ð·Ð°ÐœÐŸÐ¹ ÐŸÐ¿ÑÐžÐµÐ¹ -metadata.  
+
+BasClas.desc:ÐÑÐœÐŸÐ²ÐœÐŸÐ¹ ÐºÐ»Ð°ÑÑ ÐŽÐ»Ñ Ð²ÑÐµÑ
+ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÐŸÐ².
+
+BasClas.no_metadata_formatting:ÐÐµ ÑÐŸÑÐŒÐ°ÑÐžÑÐŸÐ²Ð°ÑÑ Ð°Ð²ÑÐŸÐŒÐ°ÑÐžÑÐµÑÐºÐž ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÐµ (ÐŽÐ»Ñ ÑÐŸÑÑÐžÑÐŸÐ²ÐºÐž).  
+
+BasClas.outhandle:ÐÐœÐŽÐµÐºÑÐœÑÐ¹ ÑÐ°Ð¹Ð» ÐŽÐ»Ñ ÐŸÐ¿ÐžÑÐ°ÐœÐžÑ ÑÐµÐ·ÑÐ»ÑÑÐ°ÑÐ°.
+
+BasClas.removeprefix:ÐÑÐµÑÐžÐºÑ, Ñ ÐºÐŸÑÐŸÑÐŸÐ³ÐŸ ÐœÐ°ÑÐžÐœÐ°ÑÑÑÑ ÐŽÐ°ÐœÐœÑÐµ ÐŽÐ»Ñ ÐžÐ³ÐœÐŸÑÐžÑÐŸÐ²Ð°ÐœÐžÑ Ð¿ÑÐž ÑÐŸÑÑÐžÑÐŸÐ²ÐºÐž.
+
+BasClas.removesuffix:Ð¡ÑÑÑÐžÐºÑ, Ñ ÐºÐŸÑÐŸÑÐŸÐ³ÐŸ ÐœÐ°ÑÐžÐœÐ°ÑÑÑÑ ÐŽÐ°ÐœÐœÑÐµ ÐŽÐ»Ñ ÐžÐ³ÐœÐŸÑÐžÑÐŸÐ²Ð°ÐœÐžÑ Ð¿ÑÐž ÑÐŸÑÑÐžÑÐŸÐ²ÐºÐž.
+
+BasClas.verbosity:Ð£Ð¿ÑÐ°Ð²Ð»ÐµÐœÐžÐµ ÐºÐŸÐ»ÐžÑÐµÑÑÐ²ÐŸÐŒ Ð¿ÑÐŸÐŽÑÐºÑÐžÐž. 0=ÐŸÑÑÑÑÑÑÐ²ÐžÐµ, 3=Ð±ÐŸÐ»ÑÑÐžÐµ ÐºÐŸÐ»ÐžÑÐµÑÑÐ²Ð°.
+
+Browse.desc:Ð€Ð°Ð»ÑÑÐžÐ²ÑÐ¹ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑ, ÐºÐŸÑÐŸÑÑÐ¹ ÐŸÐ±ÐµÑÐ¿ÐµÑÐžÐ²Ð°ÐµÑ ÑÐ²ÑÐ·Ñ Ð² Ð¿Ð°ÐœÐµÐ»Ðž ÐœÐ°Ð²ÐžÐ³Ð°ÑÐžÐž Ð² ÑÐŸÑÐµÑÐ°ÐœÐžÐž Ñ Ð¿ÑÐŸÑÐŒÐŸÑÑÐŸÐŒ Ðž Ð¿ÐŸÐžÑÐºÐŸÐŒ ÑÑÑÐ°ÐœÐžÑ. Ð Ð°Ð±ÐŸÑÐ°ÐµÑ ÑÐŸÐ»ÑÐºÐŸ Ð²  ÐœÐµÐ±ÐŸÐ»ÑÑÐžÑ
+ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÑ
+ mgpp.  
+
+DateList.bymonth:ÐÐ»Ð°ÑÑÐžÑÐžÑÐžÑÐŸÐ²Ð°ÑÑ Ð¿ÐŸ Ð³ÐŸÐŽÑ Ðž ÐŒÐµÑÑÑÑ Ð²ÐŒÐµÑÑÐŸ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÐž ÑÐŸÐ»ÑÐºÐŸ Ð¿ÐŸ Ð³ÐŸÐŽÑ
+
+DateList.desc:ÐÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÐŸÐœÐœÑÐ¹ Ð¿Ð»Ð°Ð³ÐžÐœ ÐŽÐ»Ñ ÑÐŸÑÑÐžÑÐŸÐ²ÐºÐž Ð¿ÐŸ ÐŽÐ°ÑÐ°ÐŒ. ÐÐŸ ÑÐŒÐŸÐ»ÑÐ°ÐœÐžÑ ÑÐŸÑÑÐžÑÐŸÐ²ÐºÐ° Ð¿ÑÐŸÐžÐ·Ð²ÐŸÐŽÐžÑÑÑ Ð¿ÐŸ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÐŒ 'ÐÐ°ÑÐ°'. ÐÑÐžÐœÑÑÐŸ, ÑÑÐŸ ÐŽÐ°ÑÐ° ÐŽÐŸÐ»Ð¶ÐœÐ° ÐžÐŒÐµÑÑ Ð²ÐžÐŽ Ð³Ð³Ð³Ð³ÐŒÐŒÐŽÐŽ ÐžÐ»Ðž Ð³Ð³Ð³Ð³-ÐŒÐŒ-ÐŽÐŽ.  
+
+DateList.metadata:ÐÐµÑÐ°ÐŽÐ°ÐœÐœÑÐµ, ÐºÐŸÑÐŸÑÑÐµ ÑÐŸÐŽÐµÑÐ¶Ð°Ñ ÐŽÐ°ÑÑ ÐŽÐ»Ñ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÐž. ÐÑÐµÐŽÐ¿ÐŸÐ»Ð°Ð³Ð°ÐµÑÑÑ, ÑÑÐŸ ÑÐŸÑÐŒÐ°Ñ Ð±ÑÐŽÐµÑ Ð³Ð³Ð³Ð³ÐŒÐŒÐŽÐŽ ÐžÐ»Ðž Ð³Ð³Ð³Ð³-ÐŒÐŒ-ÐŽÐŽ. ÐÑÐ»Ðž ÐŽÐ°ÑÑ Ð¿ÐµÑÐµÑÐžÑÐ»ÐµÐœÑ ÑÐµÑÐµÐ· Ð·Ð°Ð¿ÑÑÑÑ, Ð±ÑÐŽÐµÑ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÑÑÑ Ð¿ÐµÑÐ²Ð°Ñ ÐŽÐ°ÑÐ°.  
+
+DateList.reverse_sort:Ð¡ÐŸÑÑÐžÑÐŸÐ²ÐºÐ° ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ² Ð² ÐŸÐ±ÑÐ°ÑÐœÐŸÐŒ Ñ
+ÑÐŸÐœÐŸÐ»ÐŸÐ³ÐžÑÐµÑÐºÐŸÐŒ Ð¿ÐŸÑÑÐŽÐºÐµ (ÐœÐŸÐ²ÐµÐ¹ÑÐžÐ¹ Ð²ÐœÐ°ÑÐ°Ð»Ðµ).
+
+DateList.nogroup:Ð¡ÐŽÐµÐ»Ð°ÑÑ ÐŽÐ»Ñ ÐºÐ°Ð¶ÐŽÐŸÐ³ÐŸ Ð³ÐŸÐŽÐ° ÐžÐœÐŽÐžÐ²ÐžÐŽÑÐ°Ð»ÑÐœÑÐ¹ Ð²Ñ
+ÐŸÐŽ Ð² Ð³ÐŸÑÐžÐ·ÐŸÐœÑÐ°Ð»ÑÐœÐŸÐŒ ÑÐ¿ÐžÑÐºÐµ, Ð²ÐŒÐµÑÑÐŸ ÑÐŸÐ³ÐŸ, ÑÑÐŸÐ±Ñ ÐŸÑ
+Ð²Ð°ÑÐžÑÑ Ð³ÐŸÐŽÑ ÐœÐµÑÐºÐŸÐ»ÑÐºÐžÐŒÐž Ð²Ñ
+ÐŸÐŽÐ°ÐŒÐž. (Ð­ÑÐŸ ÐŒÐŸÐ¶ÐµÑ ÑÐ°ÐºÐ¶Ðµ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÑÑÑ ÐŽÐ»Ñ ÐŽÐ²ÑÑ
+ÐŒÐµÑÑÑÐœÐŸÐ¹ ÐŸÐ¿ÑÐžÐž, ÐŽÐµÐ»Ð°Ñ ÐŽÐ»Ñ ÐºÐ°Ð¶ÐŽÐŸÐ³ÐŸ ÐŒÐµÑÑÑÐ° ÐŸÑÐŽÐµÐ»ÑÐœÑÐ¹ Ð²Ñ
+ÐŸÐŽ Ð²ÐŒÐµÑÑÐŸ ÐŸÐ±ÑÐµÐŽÐžÐœÐµÐœÐŸÐ³ÐŸ).
+
+DateList.no_special_formatting:ÐÐµ ÐŸÑÐŸÐ±ÑÐ°Ð¶Ð°ÑÑ ÐžÐœÑÐŸÑÐŒÐ°ÑÐžÑ ÐŸ Ð³ÐŸÐŽÐµ Ðž ÐŒÐµÑÑÑÐµ Ð² ÑÐ¿ÐžÑÐºÐµ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ².  
+
+DateList.sort:ÐÐŸÐ¿ÐŸÐ»ÐœÐžÑÐµÐ»ÑÐœÐŸÐµ Ð¿ÐŸÐ»Ðµ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ ÐŽÐ»Ñ ÑÐŸÑÑÐžÑÐŸÐ²ÐºÐž Ð² ÑÐ»ÑÑÐ°Ðµ, ÐºÐŸÐ³ÐŽÐ° ÐŽÐ²Ð° ÐŽÐŸÐºÑÐŒÐµÐœÑÐ° ÐžÐŒÐµÑÑ ÐŸÐŽÐœÑ Ðž ÑÑ Ð¶Ðµ  ÐŽÐ°ÑÑ.
+
+HFileHierarchy.desc:ÐÐ»Ð°Ð³ÐžÐœ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÐ° ÐŽÐ»Ñ Ð³ÐµÐœÐµÑÐžÑÐŸÐ²Ð°ÐœÐžÑ ÐžÐµÑÐ°ÑÑ
+ÐžÑÐµÑÐºÐžÑ
+ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÐ¹, Ð¿ÐŸÑÑÑÐŸÐµÐœÐœÑÑ
+ ÐœÐ° ÐŽÐŸÐ¿ÐŸÐ»ÐœÐžÑÐµÐ»ÑÐœÐŸÐŒ ÑÐ°Ð¹Ð»Ðµ ÑÐŸ ÑÑÑÑÐºÑÑÑÐŸÐ¹.
+
+Hierarchy.desc:ÐÐ»Ð°Ð³ÐžÐœ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÐ° ÐŽÐ»Ñ ÑÐŸÐ·ÐŽÐ°ÐœÐžÑ ÐžÐµÑÐ°ÑÑ
+ÐžÑÐµÑÐºÐžÑ
+ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÐ¹. Ð­ÑÐŸ Ð±Ð°Ð·ÐžÑÑÐµÑÑÑ ÐœÐ° ÑÑÑÑÐºÑÑÑÐžÑÐŸÐ²Ð°ÐœÐœÑÑ
+ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ ÐžÐ»Ðž ÐœÐ° ÐŽÐŸÐ¿ÐŸÐ»ÐœÐžÑÐµÐ»ÑÐœÐŸÐŒ ÑÐ°Ð¹Ð»ÐŸÐŒ, ÑÐŸÐŽÐµÑÐ¶Ð°ÑÐžÐŒ ÑÑÑÑÐºÑÑÑÑ (ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐ¹ÑÐµ ÐŸÐ¿ÑÐžÑ -hfile).  
+
+Hierarchy.documents_last:ÐÐ·ÐŸÐ±ÑÐ°Ð¶Ð°ÑÑ ÐŽÐŸÐºÑÐŒÐµÐœÑÑ Ð² ÑÐ¿ÐžÑÐºÐµ Ð¿ÐŸÑÐ»Ðµ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÐŸÐ².  
+
+Hierarchy.hfile:ÐÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÑ ÑÐ°Ð¹Ð» Ñ ÑÐºÐ°Ð·Ð°ÐœÐŸÐ¹ ÑÑÑÑÐºÑÑÑÐŸÐ¹ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÐž.  
+
+Hierarchy.hlist_at_top:ÐÐŸÐºÐ°Ð·Ð°ÑÑ Ð¿ÐµÑÐ²ÑÐ¹ ÑÑÐŸÐ²ÐµÐœÑ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÐž Ð³ÐŸÑÐžÐ·ÐŸÐœÑÐ°Ð»ÑÐœÐŸ.
+
+Hierarchy.reverse_sort:Ð¡ÐŸÑÑÐžÑÐŸÐ²ÐºÐ° Ð»ÐžÑÑÑÐµÐ² ÐŽÐµÑÐµÐ²Ð° (ÐºÐŸÐœÑÐµÐ²ÑÑ
+ Ð²ÐµÑÑÐžÐœ) Ð² ÐŸÐ±ÑÐ°ÑÐœÐŸÐŒ Ð¿ÐŸÑÑÐŽÐºÐµ (ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐ¹ÑÐµ Ñ -sort).
+
+Hierarchy.separator:Ð ÐµÐ³ÑÐ»ÑÑÐœÐŸÐµ Ð²ÑÑÐ°Ð¶ÐµÐœÐžÐµ, ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÐœÐœÐŸÐµ Ð² ÐºÐ°ÑÐµÑÑÐ²Ðµ ÑÐ°Ð·ÐŽÐµÐ»ÐžÑÐµÐ»Ñ.
+
+Hierarchy.sort:ÐÐŸÐ»Ðµ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ ÐŽÐ»Ñ ÑÐŸÑÑÐžÑÐŸÐ²ÐºÐž ÐŽÐŸÑÐµÑÐœÐžÑ
+ ÑÐ·Ð»ÐŸÐ². ÐÑÐ»Ðž Ð¿ÐŸÐ»Ðµ ÐœÐµ ÑÐºÐ°Ð·Ð°ÐœÐŸ, ÑÐ·Ð»Ñ ÑÐŸÑÑÐžÑÐŸÐ²Ð°ÑÑÑÑ ÐœÐµ Ð±ÑÐŽÑÑ.  
+
+Hierarchy.suppressfirstlevel:ÐÐµ Ð¿ÑÐžÐŽÐ°Ð²Ð°Ð¹ÑÐµ Ð·ÐœÐ°ÑÐµÐœÐžÑ Ð¿ÐµÑÐ²ÐŸÐ¹ ÑÐ°ÑÑÐž Ð·ÐœÐ°ÑÐµÐœÐžÑ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+. Ð­ÑÐŸ Ð¿ÐŸÐ»ÐµÐ·ÐœÐŸ ÐŽÐ»Ñ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ Ñ ÐŸÐŽÐžÐœÐ°ÐºÐŸÐ²ÑÐŒ ÐœÐ°ÑÐ°Ð»ÑÐœÑÐŒ ÑÐ»ÐµÐŒÐµÐœÑÐŸÐŒ, ÐœÐ°Ð¿ÑÐžÐŒÐµÑ, ÐŽÐžÑÐµÐºÑÐŸÑÐžÐž ÐžÐŒÐ¿ÐŸÑÑÐ° Ð² gsdlsourcefilename.  
+
+Hierarchy.suppresslastlevel:ÐÐ³ÐœÐŸÑÐžÑÑÐ¹ÑÐµ Ð¿ÐŸÑÐ»ÐµÐŽÐœÑÑ ÑÐ°ÑÑÑ Ð² Ð·ÐœÐ°ÑÐµÐœÐžÐž ÐŒÐµÑÐ°-ÐŽÐ°ÐœÐœÑÑ
+. Ð­ÑÐŸ Ð¿ÐŸÐ»ÐµÐ·ÐœÐŸ ÐŽÐ»Ñ ÐŒÐµÑÐ°-ÐŽÐ°ÐœÐœÑÑ
+, Ð² ÐºÐŸÑÐŸÑÑÑ
+ ÐºÐ°Ð¶ÐŽÐŸÐµ Ð·ÐœÐ°ÑÐµÐœÐžÐµ ÐŸÐŽÐžÐœÐ°ÐºÐŸÐ²ÐŸ, ÐœÐ°Ð¿ÑÐžÐŒÐµÑ, Ð²ÐµÑÐ²Ñ ÐŽÐžÑÐµÐºÑÐŸÑÐžÐž.
+
+HTML.desc:Ð¡ÐŸÐ·ÐŽÐ°ÐµÑ Ð¿ÑÑÑÑÑ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÑ, ÐºÐŸÑÐŸÑÐ°Ñ ÑÐ²Ð»ÑÐµÑÑÑ Ð¿ÑÐŸÑÑÐŸ ÑÑÑÐ»ÐºÐŸÐ¹ ÐœÐ° Ð²ÐµÐ±-ÑÑÑÐ°ÐœÐžÑÑ.
+
+HTML.url:URL Ð²ÐµÐ±-ÑÑÑÐ°ÐœÐžÑÑ ÐŽÐ»Ñ ÑÐ²ÑÐ·Ðž Ñ.
+
+List.bookshelf_type:ÐÐŸÐœÑÑÐŸÐ»ÐžÑÑÐµÑ Ð³ÐŽÐµ ÑÐŸÐ·ÐŽÐ°ÑÑ "ÐºÐœÐžÐ¶ÐœÑÐµ Ð¿ÐŸÐ»ÐºÐž"  
+List.bookshelf_type.always:Ð¡ÐŸÐ·ÐŽÐ°ÐµÑ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÐµ ÐºÐœÐžÐ¶ÐœÐŸÐ¹ Ð¿ÐŸÐ»ÐºÐž, ÐŽÐ°Ð¶Ðµ ÐµÑÐ»Ðž ÑÐ°ÐŒ ÑÐŸÐ»ÑÐºÐŸ ÐŸÐŽÐžÐœ ÐŽÐŸÐºÑÐŒÐµÐœÑ Ð² ÐºÐ°Ð¶ÐŽÐŸÐ¹ Ð³ÑÑÐ¿Ð¿Ðµ.  
+List.bookshelf_type.never:ÐÐžÐºÐŸÐ³ÐŽÐ° ÐœÐµ ÑÐŸÐ·ÐŽÐ°ÐµÑ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÐµ ÐºÐœÐžÐ¶ÐœÐŸÐ¹ Ð¿ÐŸÐ»ÐºÐž, ÐŽÐ°Ð¶Ðµ ÐµÑÐ»Ðž ÑÐ°ÐŒ Ð±ÐŸÐ»ÐµÐµ ÐŸÐŽÐœÐŸÐ³ÐŸ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ° Ð² ÐºÐ°Ð¶ÐŽÐŸÐ¹ Ð³ÑÑÐ¿Ð¿Ðµ.  
+List.bookshelf_type.duplicate_only:Ð¡ÐŸÐ·ÐŽÐ°ÐµÑ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÐµ ÐºÐœÐžÐ¶ÐœÐŸÐ¹ Ð¿ÐŸÐ»ÐºÐž, ÑÐŸÐ»ÑÐºÐŸ ÐµÑÐ»Ðž ÑÐ°ÐŒ Ð±ÐŸÐ»ÐµÐµ ÐŸÐŽÐœÐŸÐ³ÐŸ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ° Ð² ÐºÐ°Ð¶ÐŽÐŸÐ¹ Ð³ÑÑÐ¿Ð¿Ðµ.  
+
+List.classify_sections:ÐÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÑ ÑÐµÐºÑÐžÐ¹ Ð²ÐŒÐµÑÑÐŸ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ².
+
+List.desc:ÐÐ±ÑÐžÐ¹ Ðž Ð³ÐžÐ±ÐºÐžÐ¹ ÑÐ¿ÐžÑÐŸÑÐœÑÐ¹ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑ, Ñ Ð¿ÐŸÑÑÐž Ð²ÑÐµÐŒÐž Ð²ÐŸÐ·ÐŒÐŸÐ¶ÐœÐŸÑÑÑÐŒÐž, ÑÑÐŸ Ðž AZCompactList, ÐœÐŸ Ð»ÑÑÑÐžÐŒÐž ÑÐ¿ÐŸÑÐŸÐ±ÐœÐŸÑÑÑÐŒÐž ÑÐŸÑÑÐžÑÐŸÐ²ÐºÐž, Ð° ÑÐ°ÐºÐ¶Ðµ ÑÐ°Ð±ÐŸÑÑ Ñ Unicode Ðž ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÐŒÐž.  
+
+List.level_partition.per_letter:Ð¡ÐŸÐ·ÐŽÐ°ÑÑ ÑÐ°Ð·ÐŽÐµÐ» ÐŽÐ»Ñ ÐºÐ°Ð¶ÐŽÐŸÐ³ÐŸ Ð¿ÐžÑÑÐŒÐ°.  
+List.level_partition.constant_size:Ð¡ÐŸÐ·ÐŽÐ°ÑÑ ÑÐ°Ð·ÐŽÐµÐ» Ð¿ÐŸÑÑÑÐœÐœÐŸÐ³ÐŸ ÑÐ°Ð·ÐŒÐµÑÐ°.  
+List.level_partition.per_letter_fixed_size:Ð¡ÐŸÐ·ÐŽÐ°ÑÑ ÑÐ°Ð·ÐŽÐµÐ» ÐŽÐ»Ñ ÐºÐ°Ð¶ÐŽÐŸÐ³ÐŸ Ð¿ÐžÑÑÐŒÐ° ÐŸÑÐžÐµÐœÑÐžÑÐŸÐ²ÐŸÑÐœÐŸ ÑÐ»ÐµÐŽÑÑÑÐµÐ³ÐŸ ÑÐ°Ð·ÐŒÐµÑÐ°.  
+
+List.metadata:ÐÐŸÐ»Ñ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ ÐŽÐ»Ñ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÐž. ÐÑÐ¿ÐŸÐ»ÑÐ·ÑÐ¹ÑÐµ  '/' ÐŽÐ»Ñ ÑÐ°Ð·ÐŽÐµÐ»ÐµÐœÐžÑ ÑÑÐŸÐ²ÐœÐµÐ¹ ÐžÐµÑÐ°ÑÑ
+ÐžÐž, Ð° ';' ÐŽÐ»Ñ ÑÐ°Ð·ÐŽÐµÐ»ÐµÐœÐžÑ Ð¿ÐŸÐ»ÐµÐ¹ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ ÐœÐ° ÐºÐ°Ð¶ÐŽÐŸÐ¹ ÑÑÐŸÐ²ÐœÐµ.  
+
+List.partition_name_length:ÐÐ»ÐžÐœÐ° ÐžÐŒÐµÐœÐž ÑÐ°Ð·ÐŽÐµÐ»Ð°; Ð¿ÐŸ ÑÐŒÐŸÐ»ÑÐ°ÐœÐžÑ Ð¿ÐµÑÐµÐŒÐµÐœÐœÑÐ¹ ÑÐ°Ð·ÐŒÐµÑ ÐŸÑ 1 ÐŽÐŸ 3 ÑÐžÐŒÐ²ÐŸÐ»ÐŸÐ², Ð·Ð°Ð²ÐžÑÐžÑ ÐŸÑ ÑÐŸÐ³ÐŸ, ÑÐºÐŸÐ»ÑÐºÐŸ ÐœÑÐ¶ÐœÐŸ ÐŽÐ»Ñ ÐŸÑÐŽÐµÐ»ÐµÐœÐžÑ ÐœÐ°ÑÐ°Ð»Ð° ÑÐ°Ð·ÐŽÐµÐ»Ð° ÐŸÑ ÐµÐ³ÐŸ ÐºÐŸÐœÑÐ°. Ð­ÑÐ° ÐŸÐ¿ÑÐžÑ Ð¿ÑÐžÐŒÐµÐœÐžÐŒÐ° ÑÐŸÐ»ÑÐºÐŸ ÑÐŸÐ³ÐŽÐ°, ÐºÐŸÐ³ÐŽÐ° partition_type_within_level ÑÑÑÐ°ÐœÐŸÐ²Ð»ÐµÐœ Ð² 'constant_size'.  
+
+List.partition_size_within_level:ÐÐŸÐ»Ð»ÐžÑÐµÑÑÐ²ÐŸ ÑÐ»ÐµÐŒÐµÐœÑÐŸÐ² Ð² ÐºÐ°Ð¶ÐŽÐŸÐŒ ÑÐ°Ð·ÐŽÐµÐ»Ðµ (Ð¿ÑÐžÐŒÐµÐœÑÐµÑÑÑ ÑÐŸÐ»ÑÐºÐŸ ÐµÑÐ»Ðž partition_type_within_level Ð¿ÐŸÑÑÐ°Ð²Ð»ÐµÐœ ÐœÐ° 'constant_size').  
+
+List.partition_type_within_level:Ð¢ÐžÐ¿ ÑÐ°Ð·ÐŽÐµÐ»ÐµÐœÐžÑ ÐœÐ° Ð³ÑÑÐ¿Ð¿Ñ: 'Ð¿ÐŸ Ð±ÑÐºÐ²Ðµ Ð°Ð»ÑÐ°Ð²ÐžÑÐ°' ('per_letter'), 'ÐºÐŸÐœÑÑÐ°ÐœÑÐœÑÐ¹ ÑÐ°Ð·ÐŒÐµÑ' ('constant_size'), ÐžÐ»Ðž 'ÐœÐžÑÐµÐ³ÐŸ' ('none').  
+
+List.sort_leaf_nodes_using:ÐÐŸÐ»Ñ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ ÐŽÐ»Ñ ÑÐŸÑÑÐžÑÐŸÐ²ÐºÐž ÐºÐŸÐœÐµÑÐœÑÑ
+ ÑÐ·Ð»ÐŸÐ². ÐÑÐ¿ÐŸÐ»ÑÐ·ÑÐ¹ÑÐµ  '|' ÐŽÐ»Ñ ÑÐ°Ð·ÐŽÐµÐ»ÐµÐœÐžÑ Ð³ÑÑÐ¿Ð¿ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ ÐŽÐ»Ñ ÑÑÐ°Ð±ÐžÐ»ÑÐœÐŸÐ¹ ÑÐŸÑÑÐžÑÐŸÐ²ÐºÐž, Ð° ';' ÐŽÐ»Ñ ÑÐ°Ð·ÐŽÐµÐ»ÐµÐœÐžÑ Ð¿ÐŸÐ»ÐµÐ¹ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ Ð² ÐºÐ°Ð¶ÐŽÐŸÐ¹ Ð³ÑÑÐ¿Ð¿Ðµ.  
+
+List.sort_using_unicode_collation:Ð¡ÐŸÑÑÐžÑÐŸÐ²ÐºÐ° Ñ Ð¿ÑÐžÐŒÐµÐœÐµÐœÐžÐµÐŒ Ð°Ð»Ð³ÐŸÑÐžÑÐŒÐ° Unicode Collation. Ð¢ÑÐµÐ±ÑÑÑÑÑ http://www.unicode.org/Public/UCA/latest/allkeys.txt ÑÐ°Ð¹Ð» ÐŽÐ»Ñ Ð·Ð°Ð³ÑÑÐ·ÐºÐž Ð² Ð¿Ð°Ð¿ÐºÑ Ð±ÐžÐ±Ð»ÐžÐŸÑÐµÐºÐž perl lib/Unicode/Collate.
+
+List.use_hlist_for:ÐÐŸÐ»Ñ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ ÐŽÐ»Ñ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÐœÐžÑ Ð³ÐŸÑÐžÐ·ÐŸÐœÑÐ°Ð»ÑÐœÐŸÐ³ÐŸ ÑÐ¿ÐžÑÐºÐ° (hlist) Ð²ÐŒÐµÑÑÐŸ Ð²ÐµÑÑÐžÐºÐ°Ð»ÑÐœÐŸÐ³ÐŸ (vlist). ÐÑÐ¿ÐŸÐ»ÑÐ·ÑÐ¹ÑÐµ ',' ÐŽÐ»Ñ ÑÐ°Ð·ÐŽÐµÐ»ÐµÐœÐžÑ Ð³ÑÑÐ¿Ð¿ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+, Ð° ';' ÐŽÐ»Ñ ÑÐ°Ð·ÐŽÐµÐ»ÐµÐœÐžÑ Ð¿ÐŸÐ»ÐµÐ¹ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ Ð² ÐºÐ°Ð¶ÐŽÐŸÐ¹ Ð³ÑÑÐ¿Ð¿Ðµ.  
+
+SimpleList.metadata:ÐÐŽÐœÐŸ Ð¿ÐŸÐ»Ðµ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ ÐžÐ»Ðž ÐœÐµÑÐºÐŸÐ»ÑÐºÐŸ, Ð² ÑÐ¿ÐžÑÐºÐµ, ÑÐ°Ð·ÐŽÐµÐ»ÐµÐœÐœÑÐŒ Ð·Ð°Ð¿ÑÑÑÐŒÐž, ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÐŒÑÐµ ÐŽÐ»Ñ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÐž. Ð¡Ð»ÐµÐŽÑÑ Ð¿ÐŸ Ð¿ÐŸÑÑÐŽÐºÑ, ÐŸÐ±ÐŸÐ·ÐœÐ°ÑÐµÐœÐœÐŸÐŒÑ Ð² ÑÐ¿ÐžÑÐºÐµ, Ð¿ÐµÑÐ²ÐŸÐµ Ð¿ÐŸÐ»Ðµ, ÐºÐŸÑÐŸÑÐŸÐµ ÑÐŸÐŽÐµÑÐ¶ÐžÑ Ð·ÐœÐ°ÑÐµÐœÐžÐµ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+, Ð±ÑÐŽÐµÑ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÑÑÑ. Ð¡Ð¿ÐžÑÐŸÐº Ð±ÑÐŽÐµÑ ÐŸÑÑÐŸÑÑÐžÑÐŸÐ²Ð°Ðœ ÑÑÐžÐŒ ÑÐ»ÐµÐŒÐµÐœÑÐŸÐŒ, ÐµÑÐ»Ðž ÐœÐµ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑÑÑ -sort. ÐÑÐ»Ðž ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÐµ ÐœÐµ ÑÐºÐ°Ð·Ð°ÐœÑ, Ð² ÑÐ¿ÐžÑÐŸÐº Ð±ÑÐŽÑÑ Ð²ÐºÐ»ÑÑÐµÐœÑ Ð²ÑÐµ ÐŽÐŸÐºÑÐŒÐµÐœÑÑ, ÐžÐœÐ°ÑÐµ, ÑÐŸÐ»ÑÐºÐŸ ÐŽÐŸÐºÑÐŒÐµÐœÑÑ Ñ ÑÐºÐ°Ð·Ð°ÐœÑÐŒ Ð·ÐœÐ°ÑÐµÐœÐžÐµÐŒ ÑÑÐžÑ
+ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+.
+
+SimpleList.desc:ÐÐ»Ð°Ð³ÐžÐœ ÐŽÐ»Ñ Ð¿ÑÐŸÑÑÐŸÐ³ÐŸ ÑÐ¿ÐžÑÐŸÑÐœÐŸÐ³ÐŸ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÐ°.
+
+SimpleList.sort:ÐÐŸÐ»Ðµ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ ÐŽÐ»Ñ ÑÐŸÑÑÐžÑÐŸÐ²ÐºÐž. ÐÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÑ'-sort nosort', ÐµÑÐ»Ðž ÑÐŸÑÑÐžÑÐŸÐ²ÐºÐ° ÐœÐµ ÐœÑÐ¶ÐœÐ°.
+
+Phind.desc:ÐÐ»Ð°Ð³ÐžÐœ ÐºÐ»Ð°ÑÐžÑÐžÐºÐ°ÑÐŸÑÐ° Phind.  
+
+Phind.language:Ð¯Ð·ÑÐº ÐžÐ»Ðž ÑÐ·ÑÐºÐž, ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÐŒÑÐµ ÐŽÐ»Ñ Ð¿ÐŸÑÑÑÐŸÐµÐœÐžÑ ÐžÐµÑÐ°ÑÑ
+ÐžÐž. Ð¯Ð·ÑÐºÐž ÐŸÐ±ÐŸÐ·ÐœÐ°ÑÐ°ÑÑÑÑ ÐŽÐ²ÑÑ
+Ð±ÑÐºÐ²ÐµÐœÐœÑÐŒÐž ÐºÐŸÐŽÐ°ÐŒÐž ÑÑÑÐ°Ðœ, Ðº Ð¿ÑÐžÐŒÐµÑÑ, en (Ð°ÐœÐ³Ð»ÐžÐ¹ÑÐºÐžÐ¹ ÑÐ·ÑÐº), es (ÐžÑÐ¿Ð°ÐœÑÐºÐžÐ¹ ÑÐ·ÑÐº) Ðž fr (ÑÑÐ°ÐœÑÑÐ·ÑÐºÐžÐ¹ ÑÐ·ÑÐº). Ð¯Ð·ÑÐº ÑÐ²Ð»ÑÐµÑÑÑ Ð¿ÑÐ°Ð²ÐžÐ»ÑÐœÑÐŒ Ð²ÑÑÐ°Ð¶ÐµÐœÐžÐµÐŒ, ÑÐ°Ðº 'en|fr' (Ð°ÐœÐ³Ð»ÐžÐ¹ÑÐºÐžÐ¹ ÐžÐ»Ðž ÑÑÐ°ÐœÑÑÐ·ÑÐºÐžÐ¹ ÑÐ·ÑÐº) Ðž '..' (ÑÐŸÐŸÑÐ²ÐµÑÑÑÐ²ÐµÐœÐœÐŸ, Ð»ÑÐ±ÐŸÐ¹ ÑÐ·ÑÐº) Ð¿ÑÐžÐ³ÐŸÐŽÐœÑ.
+
+Phind.min_occurs:ÐÐžÐœÐžÐŒÐ°Ð»ÑÐœÐŸÐµ ÑÐžÑÐ»ÐŸ ÐŸÐ±ÐŸÐ·ÐœÐ°ÑÐ°ÑÑÐµÐµ, ÑÐºÐŸÐ»ÐºÐŸ ÑÐ°Ð· ÑÑÐ°Ð·Ð° ÐŽÐŸÐ»Ð¶ÐœÐ° Ð²ÑÑÑÐµÑÐžÑÑÑÑ Ð² ÑÐµÐºÑÑÐµ, ÑÑÐŸÐ±Ñ Ð±ÑÑÑ Ð²ÐºÐ»ÑÑÐµÐœÐœÐŸÐ¹ Ð²ÐŸ ÑÑÐ°Ð·ÐŸÐ²ÑÑ ÐžÐµÑÐ°ÑÑ
+ÐžÑ.
+
+Phind.savephrases:ÐÑÐ»Ðž ÑÑÑÐ°ÐœÐŸÐ²Ð»ÐµÐœÐŸ, ÑÐŸ ÐžÐœÑÐŸÑÐŒÐ°ÑÐžÐŸÐœÐœÐ°Ñ ÑÑÐ°Ð·Ð° Ð±ÑÐŽÐµÑ Ñ
+ÑÐ°ÐœÐžÑÑÑÑ Ð² Ð·Ð°ÐŽÐ°ÐœÐœÐŸÐŒ ÑÐ°Ð¹Ð»Ðµ ÐºÐ°Ðº ÑÐµÐºÑÑ. Ð­ÑÐŸ  Ð²ÐµÑÐŸÑÑÐœÐŸ Ñ
+ÐŸÑÐŸÑÐ°Ñ ÐžÐŽÐµÑ - ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÑ Ð°Ð±ÑÐŸÐ»ÑÑÐœÑÐ¹ Ð¿ÑÑÑ ÐŽÐŸÑÑÑÐ¿Ð°.
+
+Phind.suffixmode:Smode Ð¿Ð°ÑÐ°ÐŒÐµÑÑ Ðº Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐµ ÐžÐ·Ð²Ð»ÐµÑÐµÐœÐžÑ ÑÑÐ°Ð·Ñ. ÐÐœÐ°ÑÐµÐœÐžÐµ 0 ÐŸÐ·ÐœÐ°ÑÐ°ÐµÑ, ÑÑÐŸ ÑÑÐŸÐ¿-ÑÐ»ÐŸÐ²Ð° ÐžÐ³ÐœÐŸÑÐžÑÑÑÑÑÑ, Ð° 1  -  ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÑÑÑÑ.
+
+Phind.text:Ð¢ÐµÐºÑÑ, ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÐŒÑÐ¹ ÐŽÐ»Ñ ÑÐŸÐ·ÐŽÐ°ÐœÐžÑ ÐžÐµÑÐ°ÑÑ
+ÐžÐž ÑÑÐ°Ð·.
+
+Phind.thesaurus:ÐÐŒÑ ÑÐµÐ·Ð°ÑÑÑÑÐ°, Ñ
+ÑÐ°ÐœÑÑÐµÐ³ÐŸÑÑ Ð² Phind-ÑÐŸÑÐŒÐ°ÑÐµ Ð² ÐŽÐžÑÐµÐºÑÐŸÑÐžÐž ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž Ðž Ñ.ÐŽ.
+
+Phind.title:ÐÐŸÐ»Ðµ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+, ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÐŒÐŸÐµ ÐŽÐ»Ñ ÐŸÐ¿ÐžÑÐ°ÐœÐžÑ ÐºÐ°Ð¶ÐŽÐŸÐ³ÐŸ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°.
+
+Phind.untidy:ÐÐµ ÑÐŽÐ°Ð»ÑÑÑ ÑÐ°Ð±ÐŸÑÐžÐµ ÑÐ°Ð¹Ð»Ñ.
+
+RecentDocumentsList.desc:ÐÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑ, ÐºÐŸÑÐŸÑÑÐ¹ Ð²ÑÐŽÐ°ÐµÑ ÑÐ¿ÐžÑÐŸÐº ÐœÐŸÐ²ÑÑ
+ ÐžÐ·ÐŒÐµÐœÐœÑÑ
+ ÐžÐ»Ðž ÐŽÐŸÐ±Ð°Ð²Ð»ÐµÐœÐœÑÑ
+ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ².  
+
+RecentDocumentsList.include_docs_added_since:ÐÐºÐ»ÑÑÐ°ÑÑ ÑÐŸÐ»ÑÐºÐŸ ÑÐµ ÐŽÐŸÐºÑÐŒÐµÐœÑÑ, ÐºÐŸÑÐŸÑÑÐµ Ð±ÑÐ»Ðž ÐžÐ·ÐŒÐµÐœÐµÐœÑ ÐžÐ»Ðž ÐŽÐŸÐ±Ð°Ð²Ð»ÐµÐœÑ Ð² ÑÐºÐ°Ð·Ð°ÐœÐœÑÑ ÐŽÐ°ÑÑ (Ð² ÑÐŸÑÐŒÐ°ÑÐµ Ð³Ð³Ð³Ð³ÐŒÐŒÐŽÐŽ ÐžÐ»Ðž Ð³Ð³Ð³Ð³-ÐŒÐŒ-ÐŽÐŽ)  
+
+RecentDocumentsList.include_most_recently_added:ÐÐºÐ»ÑÑÐ°ÑÑ ÑÐŸÐ»ÑÐºÐŸ ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐœÐŸÐµ ÐºÐŸÐ»ÐžÑÐµÑÑÐ²ÐŸ ÑÐ°ÐŒÑÑ
+ Ð¿ÐŸÑÐ»ÐµÐŽÐœÐžÑ
+ ÐŽÐŸÐ±Ð°Ð²Ð»ÐµÐœÐœÑÑ
+ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ². ÐÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑÑÑ ÑÐŸÐ»ÑÐºÐŸ ÐµÑÐ»Ðž ÐœÐµ ÑÐºÐ°Ð·Ð°ÐœÐŸ include_docs_added_since  
+
+RecentDocumentsList.sort:ÐÐµÑÐ°ÐŽÐ°ÐœÐœÑÐµ ÐŽÐ»Ñ ÑÐŸÑÑÐžÑÐŸÐ²ÐºÐž Ð¡Ð¿ÐžÑÐºÐ°. ÐÑÐ»Ðž ÐœÐµ ÑÐºÐ°Ð·Ð°ÐœÑ, ÑÐ¿ÐžÑÐŸÐº Ð±ÑÐŽÐµÑ ÐŸÑÑÐŸÑÑÐžÑÐŸÐ²Ð°Ðœ Ð¿ÐŸ ÐŽÐ°ÑÐµ ÐžÐ·ÐŒÐµÐœÐµÐœÐžÑ/ÐŽÐŸÐ±Ð°Ð²Ð»ÐµÐœÐžÑ.  
+
+SectionList.desc:Ð¢ÐŸ Ð¶Ðµ ÑÐ°ÐŒÐŸÐµ, ÑÑÐŸ Ðž ÑÐ¿ÐžÑÐŸÐº ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÐŸÐ², ÐœÐŸ Ð²ÐºÐ»ÑÑÐ°ÐµÑ Ð²ÑÐµ ÑÐ°Ð·ÐŽÐµÐ»Ñ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ° (ÐžÑÐºÐ»ÑÑÐ°Ñ Ð²ÑÑÑÐžÐ¹ ÑÑÐŸÐ²ÐµÐœÑ), Ð° ÐœÐµ ÑÐŸÐ»ÑÐºÐŸ Ð²ÑÑÑÐžÐ¹ ÑÑÐŸÐ²ÐµÐœÑ ÑÐ°ÐŒÐŸÐ³ÐŸ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°.
+
+Collage.desc:ÐÐ»Ð°Ð³ÐžÐœ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž.  
+
+Collage.geometry:ÐÐ·ÐŒÐµÑÐµÐœÐžÑ ÑÐ°Ð·ÐŒÐµÑÐ° ÐºÐŸÐ»Ð»Ð°Ð¶Ð°. ÐÐ»Ñ ÐºÐŸÐ»Ð»Ð°Ð¶Ð° Ð² 600 Ð¿ÐžÐºÑÐµÐ»ÐµÐ¹ ÑÐžÑÐžÐœÐŸÐ¹ Ðž 400 Ð¿ÐžÐºÑÐµÐ»ÐµÐ¹ Ð²ÑÑÐŸÑÐŸÐ¹, ÐœÐ°Ð¿ÑÐžÐŒÐµÑ, ÐŸÐ¿ÑÐµÐŽÐµÐ»ÑÑÑ Ð³ÐµÐŸÐŒÐµÑÑÐžÑ ÐºÐ°Ðº 600x400
+
+Collage.maxDepth:ÐÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ ÐŽÐ»Ñ ÐºÐŸÐ»Ð»Ð°Ð¶Ð° Ð¿ÑÐŸÑÐžÑÐŸÐ²Ð°ÐœÑ ÐŸÑ Ð·ÐµÑÐºÐ°Ð»ÐžÑÐŸÐ²Ð°ÐœÐžÑ Ðº ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÑ Ð±ÑÐ°ÑÐ·ÐµÑÐ°. Ð­ÑÐŸ ÐºÐŸÐœÑÑÐŸÐ»ÐžÑÑÐµÑ ÐŒÐ°ÐºÑÐžÐŒÐ°Ð»ÑÐœÑÑ Ð³Ð»ÑÐ±ÐžÐœÑ Ð¿ÑÐŸÑÐµÑÑÐ° Ð·ÐµÑÐºÐ°Ð»ÐžÑÐŸÐ²Ð°ÐœÐžÑ.
+
+Collage.maxDisplay:ÐÐ°ÐºÑÐžÐŒÐ°Ð»ÑÐœÐŸÐµ ÑÐžÑÐ»ÐŸ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÐ¹ Ð¿ÐŸÐºÐ°Ð·ÑÐ²Ð°ÐµÐŒÑÑ
+ ÐŸÐŽÐœÐŸÐ²ÑÐµÐŒÐµÐœÐœÐŸ Ð² ÐºÐŸÐ»Ð»Ð°Ð¶Ðµ.
+
+Collage.imageType:ÐÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑÑÑ, ÑÑÐŸÐ±Ñ ÑÐ¿ÑÐ°Ð²Ð»ÑÑÑ, Ð²ÑÑÐ°Ð¶Ð°Ñ ÑÐ°ÑÑÐžÑÐµÐœÐžÐµ ÐžÐŒÐµÐœÐž ÑÐ°Ð¹Ð»Ð°, ÑÐµÑ
+ ÑÐžÐ¿ÐŸÐ² ÑÐ°Ð¹Ð»ÐŸÐ² ÐºÐŸÑÐŸÑÑÐµ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÑÑÑÑ Ð² ÐºÐŸÐ»Ð»Ð°Ð¶Ðµ. Ð¡Ð¿ÐžÑÐŸÐº ÑÐ°ÑÑÐžÑÐµÐœÐžÐ¹ ÐžÐŒÐµÐœ ÑÐ°Ð¹Ð»ÐŸÐ² ÐŸÑÐŽÐµÐ»ÐµÐœ ÑÐžÐŒÐ²ÐŸÐ»ÐŸÐŒ Ð¿ÑÐŸÑÐµÐœÑÐ° (%%).
+
+Collage.bgcolor:ÐŠÐ²ÐµÑ ÑÐŸÐœÐ° Ñ
+ÐŸÐ»ÑÑÐ° ÐºÐŸÐ»Ð»Ð°Ð¶Ð°, ÑÐºÐ°Ð·Ð°ÐœÐœÐŸÐ³ÐŸ Ð² ÑÐµÑÑÐœÐ°ÐŽÑÐ°ÑÐžÑÐžÑÐœÐŸÐ¹ ÑÐŸÑÐŒÐµ (ÐœÐ°Ð¿ÑÐžÐŒÐµÑ #008000 ÑÐµÐ·ÑÐ»ÑÑÐ°Ñ: ÑÐµÐŒÐœÐŸ-Ð·ÐµÐ»ÐµÐœÑÐ¹ ÑÐŸÐœ).
+
+Collage.buttonname:Ð¯ÑÐ»ÑÐº ÐŽÐ»Ñ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÐ° Ð¿ÐŸÐºÐ°Ð·Ð° ÐœÐ° ÑÐºÑÐ°ÐœÐµ Ðž ÐºÐœÐŸÐ¿ÐºÐ° Ð² ÐœÐ°Ð²ÐžÐ³Ð°ÑÐžÐŸÐœÐœÐŸÐ¹ Ð»ÐžÐœÐµÐ¹ÐºÐµ.
+
+Collage.refreshDelay:ÐÐŸÑÐŒÐ°, Ð² ÐŒÐžÐ»Ð»ÐžÑÐµÐºÑÐœÐŽÐ°Ñ
+, Ñ ÐºÐŸÑÐŸÑÐŸÐ¹ ÐŸÐ±ÐœÐŸÐ²Ð»ÑÐµÑÑÑ ÐºÐŸÐ»Ð»Ð°Ð¶.
+
+Collage.isJava2:ÐÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑÑÑ, ÑÑÐŸÐ±Ñ ÑÐ¿ÑÐ°Ð²Ð»ÑÑÑ, ÐœÐµÐºÐŸÑÐŸÑÑÐŒÐž  ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÑÑÐžÐŒÐžÑÑ ÐºÐ»Ð°ÑÑÐ°ÐŒÐž-Ð²ÑÐ¿ÐŸÐ»ÐœÐµÐœÐžÑ Java. ÐÐŸÐ»ÐµÐµ Ð¿ÑÐŸÐŽÐ²ÐžÐœÑÑÐ°Ñ Ð²ÐµÑÑÐžÑ Java (ÐœÐ°Ð¿ÑÐžÐŒÐµÑ: Java 1.2 Ðž ÐŽÐ°Ð»ÐµÐµ) Ð²ÐºÐ»ÑÑÐ°ÐµÑ Ð±ÐŸÐ»ÐµÐµ ÐžÑÐºÑÑÐµÐœÐœÑÑ Ð¿ÐŸÐŽÐŽÐµÑÐ¶ÐºÑ ÐŽÐ»Ñ ÑÐ¿ÑÐ°Ð²Ð»ÐµÐœÐžÑ Ð¿ÑÐŸÐ·ÑÐ°ÑÐœÐŸÑÑÑÑ Ð² ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑÑ
+, ÑÑÐŸ Ð¿ÐŸÐŒÐŸÐ³Ð°ÐµÑ ÐºÐŸÐœÑÑÐŸÐ»ÐžÑÐŸÐ²Ð°ÑÑ ÑÑÐŸ ÑÐ»ÑÑÐ°ÐµÑÑÑ Ñ ÑÐ»Ð°Ð³ÐŸÐŒ, ÐŸÐŽÐœÐ°ÐºÐŸ Ð²ÑÑÑÐŸÐµÐœÐœÐ°Ñ Ð²ÐµÑÑÐžÑ Java ÐŽÐ»Ñ ÐœÐµÐºÐŸÑÐŸÑÑÑ
+ Ð±ÑÐ°ÑÐ·ÐµÑÐŸÐ² - Ð²ÐµÑÑÐžÑ 1.1. ÐÐ¿Ð¿Ð»ÐµÑ ÑÐ°Ð·ÑÐ°Ð±ÐŸÑÐ°Ðœ ÑÐ°Ðº, ÑÑÐŸÐ±Ñ Ð¿ÐŸ ÑÐŒÐŸÐ»ÑÐ°ÐœÐžÑ,  ÐŸÐ±ÐœÐ°ÑÑÐ¶ÐžÐ²Ð°Ð»ÑÑ Ð°Ð²ÑÐŸÐŒÐ°ÑÐžÑÐµÑÐºÐž, ÐŽÐ»Ñ ÑÐŸÐ¹ Ð²ÐµÑÑÐžÐž Java ÐºÐŸÑÐŸÑÐŸÐ¹ ÐŸÐ±Ð»Ð°ÐŽÐ°ÐµÑ Ð±ÑÐ°ÑÐ·ÐµÑ Ð¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÐµÐ»Ñ, ÑÑÐŸ Ð·Ð°ÑÑÐ°Ð²Ð»ÑÐµÑ Ð²ÑÐ¿ÐŸÐ»ÐœÑÑÑÑÑ Ðž ÐŽÐµÐ¹ÑÑÐ²ÐŸÐ²Ð°ÑÑ ÑÐŸÐŸÑÐ²ÐµÑÑÑÐ²ÐµÐœÐœÐŸ.
+
+Collage.imageMustNotHave:ÐÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑÑÑ ÐŽÐ»Ñ ÑÐ¶Ð°ÑÐžÑ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÐ¹, ÐºÐŸÑÐŸÑÑÐµ ÐœÐµ ÐŽÐŸÐ»Ð¶ÐœÑ Ð¿ÐŸÑÐ²ÐžÑÑÑÑ Ð² ÐºÐŸÐ»Ð»Ð°Ð¶Ðµ, ÑÐžÐ¿Ð° ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÐ¹ ÐºÐœÐŸÐ¿ÐŸÑÐµÐº, ÐºÐŸÑÐŸÑÑÐµ ÑÐŸÑÑÐ°Ð²Ð»ÑÑÑ ÐœÐ°Ð²ÐžÐ³Ð°ÑÐžÐŸÐœÐœÑÑ Ð¿Ð°ÐœÐµÐ»Ñ.
+
+Collage.caption:ÐÐŸÐ¿ÐŸÐ»ÐœÐžÑÐµÐ»ÑÐœÑÐµ Ð·Ð°Ð³ÐŸÐ»ÐŸÐ²ÐºÐž, Ð¿ÐŸÐºÐ°Ð·Ð°ÐœÑ ÐœÐžÐ¶Ðµ ÐºÐŸÐ»Ð»Ð°Ð¶Ð°.
+
+
+#
+# Plugin option descriptions
+#
+AcronymExtractor.adding:ÐŽÐŸÐ±Ð°Ð²Ð»ÐµÐœÐžÐµ
+
+AcronymExtractor.already_seen:ÑÐ¶Ðµ Ð·Ð°ÐŒÐµÑÐµÐœÐœÑÐ¹
+
+AcronymExtractor.desc:ÐÐ»Ð°Ð³ÐžÐœ ÐžÐ·Ð²Ð»ÐµÑÐµÐœÐžÑ Ð¿ÐŸÐŒÐŸÑÐž ÐŽÐ»Ñ Ð¿ÐŸÐžÑÐºÐ° Ðž ÐŸÑÐŒÐµÑÐºÐž Ð°ÐºÑÐŸÐœÐžÐŒÐ° Ð² ÑÐµÐºÑÑÐµ.  
+
+AcronymExtractor.done_acronym_extract:ÐÑÐŸÐžÐ·Ð²ÐµÐŽÐµÐœÐŸ ÐžÐ·Ð²Ð»ÐµÑÐµÐœÐžÐµ Ð°ÐºÑÐŸÐœÐžÐŒÐŸÐ².
+
+AcronymExtractor.done_acronym_markup:ÐÑÐ¿ÐŸÐ»ÐœÐµÐœÐ° Ð¿ÐŸÐŒÐµÑÐºÐ° Ð°ÐºÑÐŸÐœÐžÐŒÐ°.
+
+AcronymExtractor.extract_acronyms:ÐÐºÑÐŸÐœÐžÐŒÑ ÐžÐ·Ð²Ð»ÐµÑÐµÐœÑ ÐžÐ· ÑÐµÐºÑÑÐ° Ðž ÑÑÑÐ°ÐœÐŸÐ²Ð»ÐµÐœÑ  Ð² ÐºÐ°ÑÐµÑÑÐ²Ðµ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+.
+
+AcronymExtractor.extracting_acronyms:ÐžÐ·Ð²Ð»ÐµÑÐµÐœÐžÐµ Ð°ÐºÑÐŸÐœÐžÐŒÐŸÐ²
+
+AcronymExtractor.marking_up_acronyms:Ð¿ÐŸÐŒÐµÑÐºÐ° Ð°ÐºÑÐŸÐœÐžÐŒÐŸÐ²
+
+AcronymExtractor.markup_acronyms:ÐÐŸÐ±Ð°Ð²ÐžÑÑ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÐµ Ð°ÐºÑÐŸÐœÐžÐŒÐ° Ð² ÑÐµÐºÑÑ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°.
+
+ArchivesInfPlugin.desc:ÐÐ»Ð°Ð³ÐžÐœ, ÐºÐŸÑÐŸÑÑÐ¹ Ð¿ÐŸÐ²ÑÐŸÑÑÐµÑÑÑ Ð² ÑÐ°Ð¹Ð»Ðµ archives.inf (ÑÐŸ ÐµÑÑÑ ÑÐ°Ð¹Ð», Ð³ÐµÐœÐµÑÐžÑÐŸÐ²Ð°ÐœÐœÑÐ¹ Ð² Ð°ÑÑ
+ÐžÐ²ÐœÐŸÐ¹ ÐŽÐžÑÐµÐºÑÐŸÑÐžÐž, ÐºÐŸÐ³ÐŽÐ°  Ð²ÑÐ¿ÐŸÐ»ÐœÑÐ»ÑÑ ÐžÐŒÐ¿ÐŸÑÑ ), ÐŸÐ±ÑÐ°Ð±Ð°ÑÑÐ²Ð°Ñ ÐºÐ°Ð¶ÐŽÑÐ¹ ÐœÐ°Ð¹ÐŽÐµÐœÐœÑÐ¹ ÑÐ°Ð¹Ð».
+
+AutoExtractMetadata.desc:ÐÐ°Ð·ÐŸÐ²ÑÐ¹ Ð¿Ð»Ð°Ð³ÐžÐœ ÐŽÐ°ÑÑÐžÐ¹ Ð²ÑÑ ÑÑÐœÐºÑÐžÐŸÐœÐ°Ð»ÑÐœÐŸÑÑÑ ÐžÐ·Ð²Ð»ÐµÑÐµÐœÐžÑ ÐžÐ· Ð¿Ð»Ð°Ð³ÐžÐœÐ° Extractor.  
+
+AutoExtractMetadata.extracting:ÐžÐ·Ð²Ð»ÐµÑÐµÐœÐžÐµ
+
+AutoExtractMetadata.first:ÐÑÐŽÐµÐ»ÐµÐœÐœÑÐ¹ Ð·Ð°Ð¿ÑÑÐŸÐ¹ ÑÐ¿ÐžÑÐŸÐº Ð¿ÐµÑÐ²ÑÑ
+ Ð²ÐµÐ»ÐžÑÐžÐœ ÐŽÐ»Ñ ÐžÐ·Ð²Ð»ÐµÑÐµÐœÐžÑ ÐžÐ· ÑÐµÐºÑÑÐ° Ð² Ð¿ÐŸÐ»Ðµ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+. ÐÐŸÐ»Ðµ ÐœÐ°Ð·Ð²Ð°ÐœÐŸ 'FirstNNN'.
+
+BaseMediaConverter.desc:ÐÐ»Ð°Ð³ÐžÐœ ÐžÐ·Ð²Ð»ÐµÑÐµÐœÐžÑ Ð¿ÐŸÐŒÐŸÑÐž ÐžÐŒÐµÑÑÐžÐ¹ ÑÑÐœÐºÐžÑ ÐŽÐ»Ñ Ð¿Ð»Ð°Ð³ÐžÐœÐ° ÐŒÐµÐŽÐžÐ° ÐºÐŸÐœÐ²ÐµÑÑÐŸÑÐ°, ÐœÐ°Ð¿ÑÐžÐŒÐµÑ ÐºÐŸÐœÐ²ÐµÑÑÐŸÑÐ° ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÐ¹ ÐžÐ»Ðž Ð²ÐžÐŽÐµÐŸ ÐºÐŸÐœÐ²ÐµÑÑÐŸÑÐŸÐ².  
+
+BasePlugin.associate_ext:ÐÑÐ·ÑÐ²Ð°ÐµÑ ÐŸÐ±ÑÐ°Ð±ÐŸÑÐºÑ ÑÐ°Ð¹Ð»ÐŸÐ² Ñ ÑÐµÐŒ Ð¶Ðµ ÐºÐŸÑÐœÐµÐ²ÑÐŒ ÐºÐ°ÑÐ°Ð»ÐŸÐ³ÐŸÐŒ Ð¿Ð»Ð°Ð³ÐžÐœÐŸÐŒ  AND Ð°ÑÑÐŸÑÐžÐžÑÑÐµÑ Ñ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°ÐŒÐž ÑÐ¿ÐžÑÐŸÐº ÑÐ°ÑÑÐžÑÐµÐœÐžÑ ÑÐ°Ð¹Ð»ÐŸÐ², Ð¿ÐµÑÐµÑÐžÑÐ»ÐµÐœÐœÑÑ
+ ÑÐµÑÐµÐ· Ð·Ð°Ð¿ÑÑÑÑ, Ð¿ÐµÑÐµÐŽÐ°Ð²Ð°ÐµÐŒÑÐ¹ Ð·ÐŽÐµÑÑ Ð² ÐºÐ°ÑÐµÑÑÐ²Ðµ Ð°ÑÐ³ÑÐŒÐµÐœÑÐ°.
+
+BasePlugin.associate_tail_re:Ð ÐµÐ³ÑÐ»ÑÑÐœÐŸÐµ Ð²ÑÑÐ°Ð¶ÐµÐœÐžÐµ ÐŽÐ»Ñ ÑÐŸÑÐµÑÐ°ÐœÐžÑ ÐžÐŒÐµÐœ ÑÐ°Ð¹Ð»ÐŸÐ² ÐœÐ°Ð¹ÐŽÐµÐœÐœÑÐŒ ÑÐ°Ð¹Ð»Ð°ÐŒ. ÐÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑÑÑ ÐºÐ°Ðº Ð±ÐŸÐ»ÐµÐµ ÐŒÐŸÑÐœÐ°Ñ Ð°Ð»ÑÑÐµÑÐœÐ°ÑÐžÐ²Ð° ÐŽÐ»Ñ associate_ext.  
+
+BasePlugin.block_exp:Ð€Ð°Ð¹Ð»Ñ, ÑÐŸÐŸÑÐ²ÐµÑÑÑÐ²ÑÑÑÐžÐµ ÑÑÐŸÐŒÑ Ð¿ÑÐ°Ð²ÐžÐ»ÑÐœÐŸÐŒÑ Ð²ÑÑÐ°Ð¶ÐµÐœÐžÑ, Ð±ÑÐŽÑÑ Ð·Ð°Ð±Ð»ÐŸÐºÐžÑÐŸÐ²Ð°ÐœÑ ÐŸÑ ÑÐŸÐ³ÐŸ, ÑÑÐŸÐ±Ñ Ð±ÑÑÑ Ð¿ÐµÑÐµÐŽÐ°ÐœÐœÑÐŒÐž Ð»ÑÐ±ÐŸÐŒÑ ÐŽÐ°Ð»ÑÐœÐµÐ¹ÑÐµÐŒÑ Ð¿Ð»Ð°Ð³ÐžÐœÑ Ð² ÑÐ¿ÐžÑÐºÐµ. Ð­ÑÐŸ ÐœÐµ ÐžÐŒÐµÐµÑ ÐœÐžÐºÐ°ÐºÐŸÐ³ÐŸ ÐŽÑÑÐ³ÐŸÐ³ÐŸ ÑÐµÐ°Ð»ÑÐœÐŸÐ³ÐŸ ÐœÐ°Ð·ÐœÐ°ÑÐµÐœÐžÑ, ÑÐµÐŒ Ð¿ÑÐµÐŽÐŸÑÐ²ÑÐ°ÑÐžÑÑ Ð±ÐŸÐ»ÑÑÐŸÐµ ÐºÐŸÐ»ÐžÑÐµÑÑÐ²ÐŸ Ð¿ÑÐµÐŽÑÐ¿ÑÐµÐ¶ÐŽÐ°ÑÑÐžÑ
+ ÑÐŸÐŸÐ±ÑÐµÐœÐžÐ¹ ÐŸ Ð²Ñ
+ÐŸÐŽÐœÑÑ
+ ÑÐ°Ð¹Ð»Ð°Ñ
+, ÐºÐŸÑÐŸÑÑÐŒ ÐÑ ÐœÐµ ÑÐŽÐµÐ»ÑÐµÑÐµ Ð²ÐœÐžÐŒÐ°ÐœÐžÑ. ÐÐ°Ð¶ÐŽÑÐ¹ Ð¿Ð»Ð°Ð³ÐžÐœ ÐŒÐŸÐ³ Ð±Ñ ÐžÐŒÐµÑÑ Ð¿ÐŸ ÑÐŒÐŸÐ»ÑÐ°ÐœÐžÑ block_exp., ÐºÐ°Ðº ÐœÐ°Ð¿ÑÐžÐŒÐµÑ, HTMLPlug  Ð¿ÐŸ ÑÐŒÐŸÐ»ÑÐ°ÐœÐžÑ Ð±Ð»ÐŸÐºÐžÑÑÐµÑ Ð»ÑÐ±ÑÐµ ÑÐ°Ð¹Ð»Ñ Ñ  ÑÐ°ÑÑÐžÑÐµÐœÐžÐµÐŒ .gif, .jpg, .jpeg, .png ÐžÐ»Ðž .css.
+
+BasePlugin.desc:ÐÑÐœÐŸÐ²ÐœÐŸÐ¹ ÐºÐ»Ð°ÑÑ ÐŽÐ»Ñ Ð²ÑÐµÐ³ÐŸ Ð¿Ð»Ð°Ð³ÐžÐœÐŸÐ² ÐžÐŒÐ¿ÐŸÑÑÐ°.
+
+BasePlugin.dummy_text:ÐÐ°ÐœÐœÑÐ¹ ÐŽÐŸÐºÑÐŒÐµÐœÑ ÐœÐµ ÐžÐŒÐµÐµÑ ÑÐµÐºÑÑÐ°.
+
+BasePlugin.encoding.ascii:ÐÑÐŸÑÑÐŸÐ¹ 7-Ð±ÐžÑÐœÑÐ¹ ascii. ÐÐœ ÐŒÐŸÐ¶ÐµÑ Ð±ÑÑÑ ÐœÐµÐŒÐœÐŸÐ³ÐŸ Ð±ÑÑÑÑÐµÐµ, ÑÐµÐŒ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÐœÐžÐµ iso_8859_1. ÐÑÑÐµÑÐµÐ³Ð°Ð¹ÑÐµÑÑ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÐœÐžÑ ÑÑÐŸÐ³ÐŸ Ð² ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ², ÐºÐŸÑÐŸÑÑÐµ ÐŒÐŸÐ³ÑÑ ÑÐŸÐŽÐµÑÐ¶Ð°ÑÑ ÑÐžÐŒÐ²ÐŸÐ»Ñ Ð²ÐœÐµ Ð¿ÑÐŸÑÑÑÑ
+ 7-Ð±ÐžÑÐœÑÑ
+ ÐœÐ°Ð±ÐŸÑÐŸÐ² ascii (ÐœÐ°Ð¿ÑÐžÐŒÐµÑ, ÐœÐµÐŒÐµÑÐºÐžÐµ ÐžÐ»Ðž ÑÑÐ°ÐœÑÑÐ·ÑÐºÐžÐµ ÐŽÐŸÐºÑÐŒÐµÐœÑÑ ÑÐŸÐŽÐµÑÐ¶Ð°Ñ Ð·ÐœÐ°ÐºÐž ÑÐŽÐ°ÑÐµÐœÐžÑ), ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐ¹ÑÐµ Ð²ÐŒÐµÑÑÐŸ ÑÑÐŸÐ³ÐŸ iso_8859_1.
+
+BasePlugin.encoding.unicode:Ð¢ÐŸÐ»ÑÐºÐŸ ÑÐœÐžÐºÐŸÐŽ.
+
+BasePlugin.encoding.utf8:ÐÐ»Ðž utf8, ÐžÐ»Ðž ÑÐœÐžÐºÐŸÐŽ - Ð°Ð²ÑÐŸÐŒÐ°ÑÐžÑÐµÑÐºÐž ÐŸÐ±ÐœÐ°ÑÑÐ¶ÐµÐœÐœÑÐµ.
+
+BasePlugin.filename_encoding:ÐÐµÑÐµÐºÐŸÐŽÐžÑÐŸÐ²ÐºÐ° ÐžÑÑÐŸÑÐœÐžÐºÐŸÐ² ÐŽÐ»Ñ ÐžÐŒÐµÐœ ÑÐ°Ð¹Ð»ÐŸÐ²  
+
+BasePlugin.filename_encoding.auto:ÐÐ²ÑÐŸÐŒÐ°ÑÐžÑÐµÑÐºÐž ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐžÑÑ ÐžÐŒÑ ÑÐ°Ð¹Ð»Ð°  
+
+BasePlugin.filename_encoding.auto_language_analysis:ÐÐ²ÑÐŸÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐžÐµ ÐŽÐµÐºÐŸÐŽÐžÑÐŸÐ²Ð°ÐœÐžÑ ÐžÐŒÐµÐœ ÑÐ°Ð¹Ð»ÐŸÐ² Ñ Ð¿ÐŸÐŒÐŸÑÑÑ Ð°ÐœÐ°Ð»ÐžÐ·Ð°.  
+
+BasePlugin.filename_encoding.auto_filesystem_encoding:ÐÐ²ÑÐŸÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐžÐµ ÐºÐŸÐŽÐµÐºÐ° ÐŽÐ»Ñ ÐžÐŒÐµÐœÐž ÑÐ°Ð¹Ð»Ð° ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÑ ÐŽÐµÐºÐŸÐŽÐžÑÐŸÐ²Ð°ÐœÐžÐµ Ð² ÑÐ°Ð¹Ð»ÐŸÐ²ÐŸÐ¹ ÑÐžÑÑÐµÐŒÐµ  
+
+BasePlugin.filename_encoding.auto_fl:ÐÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑ ÐŽÐµÐºÐŸÐŽÐžÑÐŸÐ²Ð°ÐœÐžÐµ ÑÐ°Ð¹Ð»ÐŸÐ²ÐŸÐ¹ ÑÐžÑÑÐµÐŒÑ Ðž Ð·Ð°ÑÐµÐŒ ÑÐ·ÑÐºÐŸÐ²ÐŸÐ¹ Ð°ÐœÐ°Ð»ÐžÐ· ÐŽÐ»Ñ ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐžÑ ÐŽÐµÐºÐŸÐŽÐžÑÐŸÐ²Ð°ÐœÐžÑ ÐžÐŒÐµÐœÐž ÑÐ°Ð¹Ð»Ð°  
+
+BasePlugin.filename_encoding.auto_lf:ÐÑÐ¿ÐŸÐ»ÑÐ·ÑÑ ÑÐ·ÑÐºÐŸÐ²ÐŸÐ¹ Ð°ÐœÐ°Ð»ÐžÐ· Ð·Ð°ÑÐµÐŒ ÐŽÐµÐºÐŸÐŽÐžÑÐŸÐ²Ð°ÐœÐžÐµ ÑÐ°Ð¹Ð»ÐŸÐ²ÐŸÐ¹ ÑÐžÑÑÐµÐŒÑ ÐŽÐ»Ñ ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐžÑ ÐŽÐµÐºÐŸÐŽÐžÑÐŸÐ²Ð°ÐœÐžÑ ÐžÐŒÐµÐœÐž ÑÐ°Ð¹Ð»Ð°  
+
+BasePlugin.no_blocking:ÐÐµ ÐŸÑÐºÑÑÐ²Ð°Ð¹ÑÐµ Ðž ÐœÐµ Ð±Ð»ÐŸÐºÐžÑÑÐ¹ÑÐµ ÑÐ°Ð¹Ð»Ñ. ÐÑÐ±ÑÐµ Ð°ÑÑÐŸÑÐžÐžÑÐŸÐ²Ð°ÐœÐœÑÐµ ÑÐ°Ð¹Ð»Ñ (ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ ÐœÐ° Ð²ÐµÐ± ÑÑÑÐ°ÐœÐžÑÐµ) Ð±ÑÐŽÑÑ ÐŽÐŸÐ±Ð°Ð²Ð»ÐµÐœÑ Ð² ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ Ð² ÐºÐ°ÑÐµÑÑÐ²Ðµ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ².  
+
+BasePlugin.no_cover_image:ÐÐµ ÐŸÐ±ÑÐ°ÑÐ°Ð¹ÑÐµ Ð²ÐœÐžÐŒÐ°ÐœÐžÑ ÐœÐ° ÑÐ°Ð¹Ð» prefix.jpg (Ð³ÐŽÐµ prefix - ÑÑÐŸ ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµ ÐŸÐ±ÑÐ°Ð±Ð°ÑÑÐ²Ð°ÐµÐŒÐŸÐ³ÐŸ ÑÐ°Ð¹Ð»Ð°). Ð­ÑÐŸ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÐµ ÐŸÐ±Ð»ÐŸÐ¶ÐºÐž.
+
+BasePlugin.OIDtype.auto:ÐÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑÑÑ ÐœÐ°Ð±ÐŸÑ OIDtype Ð² import.pl  
+
+BasePlugin.process_exp:ÐÐ±ÑÑÐœÐŸÐµ Ð²ÑÑÐ°Ð¶ÐµÐœÐžÐµ Perl ÐŽÐ»Ñ ÑÐŸÐŸÑÐ²ÐµÑÑÑÐ²ÐžÑ  ÐžÐŒÐµÐœÐ°ÐŒ ÑÐ°Ð¹Ð»Ð°. Ð¡ÐŸÐŸÑÐ²ÐµÑÑÑÐ²ÐžÐµ ÐžÐŒÐµÐœÐ°ÐŒ ÑÐ°Ð¹Ð»Ð° Ð±ÑÐŽÐµÑ ÐŸÐ±ÑÐ°Ð±ÐŸÑÐ°ÐœÐŸ ÑÑÐžÐŒ Ð¿Ð»Ð°Ð³ÐžÐœÐŸÐŒ. ÐÐ°Ð¿ÑÐžÐŒÐµÑ, ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÐœÐžÐµ '(?i).html?\$' ÑÐŸÑÐ²ÐµÑÑÑÐ²ÑÐµÑ Ð²ÑÐµÐŒ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°ÐŒ, Ð·Ð°ÐºÐ°ÐœÑÐžÐ²Ð°ÑÑÐžÐŒÑÑ ÐœÐ° .htm ÐžÐ»Ðž .html (Ð±ÐµÐ· ÑÐ°Ð·Ð»ÐžÑÐµÐœÐžÑ Ð·Ð°Ð³Ð»Ð°Ð²ÐœÑÑ
+ Ðž ÑÑÑÐŸÑÐœÑÑ
+ Ð±ÑÐºÐ²).
+
+BasePlugin.smart_block:ÐÐ»ÐŸÐºÐžÑÐŸÐ²ÐºÐ° ÑÐ°Ð¹Ð»ÐŸÐ² ÑÐ»ÑÑÑÐµÐœÐœÑÐŒ ÐŒÐµÑÐŸÐŽÐŸÐŒ, Ð²ÐŒÐµÑÑÐŸ Ð¿ÑÐŸÑÑÐŸÐ³ÐŸ Ð¿ÑÐŸÑÐŒÐŸÑÑÐ° ÐœÐ°Ð·Ð²Ð°ÐœÐžÐ¹ ÑÐ°Ð¹Ð»ÐŸÐ².  
+
+BasePlugin.stems:ÑÑÐµÐ±Ð»Ðž  
+
+BasePlugin.file_rename_method:ÐÐµÑÐŸÐŽ ÐŽÐ»Ñ Ð¿ÐµÑÐžÐŒÐµÐœÐŸÐ²Ð°ÐœÐžÑ ÐºÐŸÐ¿ÐžÐž ÐžÐŒÐ¿ÐŸÑÑÐžÑÐŸÐ²Ð°ÐœÐœÐŸÐ³ÐŸ ÑÐ°Ð¹Ð»Ð° Ðž Ð°ÑÑÐŸÑÐžÐžÑÐŸÐ²Ð°ÐœÐœÑÑ
+ ÑÐ°Ð¹Ð»ÐŸÐ².  
+
+BasePlugin.rename_method.url:ÐÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑÑÑ ÐŽÐµÐºÐŸÐŽÐžÑÐŸÐ²Ð°ÐœÐžÐµ URL Ðž Ð¿ÐµÑÐµÐžÐŒÐµÐœÐŸÐ²Ð°ÐœÐžÐµ ÐžÐŒÐ¿ÐŸÑÑÐžÑÐŸÐ²Ð°ÐœÐœÑÑ
+ Ðž Ð°ÑÑÐŸÑÐžÐžÑÐŸÐ²Ð°ÐœÐœÑÑ
+ ÑÐ°Ð¹Ð»ÐŸÐ²  
+
+BasePlugin.rename_method.base64:ÐÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÐœÐžÐµ ÐŽÐµÐºÐŸÐŽÐžÑÐŸÐ²Ð°ÐœÐžÐµ base64 ÐŽÐ»Ñ Ð¿ÐµÑÐµÐžÐŒÐµÐœÐŸÐ²Ð°ÐœÐžÑ ÐžÐŒÐ¿ÐŸÑÑÐžÑÐŸÐ²Ð°ÐœÐœÑÑ
+ Ðž Ð°ÑÑÐŸÑÐžÐžÑÐŸÐ²Ð°ÐœÐœÑÑ
+ ÑÐ°Ð¹Ð»ÐŸÐ².  
+
+BasePlugin.rename_method.none:ÐÐµ Ð¿ÐµÑÐµÐžÐŒÐµÐœÐŸÐ²ÑÐ²Ð°Ð¹ÑÐµ Ð¿ÑÐŸÐžÐŒÐ¿ÐŸÑÑÐžÑÐŸÐ²Ð°ÐœÐœÑÐµ Ðž Ð°ÑÑÐŸÑÐžÐžÑÐŸÐ²Ð°ÐœÐœÑÑ
+ ÑÐ°Ð¹Ð»ÐŸÐ²  
+
+BibTexPlugin.desc:BibTexPlug ÑÐžÑÐ°ÐµÑ Ð±ÐžÐ±Ð»ÐžÐŸÐ³ÑÐ°ÑÐžÑÐµÑÐºÐžÐµ ÑÐ°Ð¹Ð»Ñ Ð² ÑÐŸÑÐŒÐ°ÑÐµ BibTex. BibTexPlug ÑÐŸÐ·ÐŽÐ°ÐµÑ ÐŸÐ±ÑÐ°Ð· ÐŽÐŸÐºÑÐŒÐµÐœÑÐ° ÐŽÐ»Ñ ÐºÐ°Ð¶ÐŽÐŸÐ¹ ÑÑÑÐ»ÐºÐž Ð² ÑÐ°Ð¹Ð»Ðµ. Ð­ÑÐŸ - Ð¿ÐŸÐŽÐºÐ»Ð°ÑÑ SplitPlug, ÑÐ°Ðº ÑÑÐŸ ÐµÑÐ»Ðž ÐžÐŒÐµÑÑÑÑ ÐŒÐœÐŸÐ¶ÐµÑÑÐ²ÐµÐœÐœÑÐµ Ð·Ð°Ð¿ÐžÑÐž, ÑÐŸ Ð²ÑÐµ ÐŸÐœÐž ÑÐžÑÐ°ÑÑÑÑ.  
+
+BookPlugin.desc:Ð¡ÐŸÐ·ÐŽÐ°ÐµÑÑÑ ÐŒÐœÐŸÐ³ÐŸÑÑÐŸÐ²ÐœÐµÐ²ÑÐ¹ ÐŽÐŸÐºÑÐŒÐµÐœÑ ÐžÐ· ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°, ÑÐŸÐŽÐµÑÐ¶Ð°ÑÐµÐ³ÐŸ ÑÑÐ³Ðž ÑÑÐŸÐ²ÐœÑ <<TOC>>. ÐÐµÑÐ°ÐŽÐ°ÐœÐœÑÐµ  ÐŽÐ»Ñ ÐºÐ°Ð¶ÐŽÐŸÐ³ÐŸ ÑÐ°Ð·ÐŽÐµÐ»Ð° Ð²Ð·ÑÑÑ ÐžÐ· Ð»ÑÐ±ÐŸÐ³ÐŸ ÐŽÑÑÐ³ÐŸÐ³ÐŸ ÑÑÐ³Ð° Ð² ÑÐŸÐ¹ Ð¶Ðµ ÑÐ°ÐŒÐŸÐ¹ ÑÑÑÐŸÐºÐµ, ÐºÐ°Ðº Ðž <<TOC>>. ÐÐ°Ð¿ÑÐžÐŒÐµÑ, <<Title>>xxxx<</Title>>  ÑÑÑÐ°ÐœÐ°Ð²Ð»ÐžÐ²Ð°ÐµÑ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÐµ ÐœÐ°Ð·Ð²Ð°ÐœÐžÑ. ÐÑÐµ ÐŸÑÑÐ°Ð»ÑÐœÐŸÐµ ÐŒÐµÐ¶ÐŽÑ ÑÑÐ³Ð°ÐŒÐž ÐŸÐ±ÑÐ°Ð±Ð°ÑÑÐ²Ð°ÐµÑÑÑ ÐºÐ°Ðº Ð¿ÑÐŸÑÑÐŸÐ¹ html (ÑÐŸ ÐµÑÑÑ ÐœÐžÐºÐ°ÐºÐŸÐ¹ ÐŸÐ±ÑÐ°Ð±ÐŸÑÐºÐž ÑÐ²ÑÐ·ÐµÐ¹ html ÐžÐ»Ðž Ð»ÑÐ±ÑÑ
+ ÐŽÑÑÐ³ÐžÑ
+ Ð²ÐžÐŽÐŸÐ² HTMLPlug  ÐœÐµ Ð¿ÑÐŸÐžÐ·Ð²ÐŸÐŽÐžÑÑÑ). ÐÐ¶ÐžÐŽÐ°ÐµÑÑÑ, ÑÑÐŸ Ð²Ñ
+ÐŸÐŽÐœÑÐµ ÑÐ°Ð¹Ð»Ñ ÐžÐŒÐµÑÑ ÑÐ°ÑÑÐžÑÐµÐœÐžÐµ .hb Ð¿ÐŸ ÑÐŒÐŸÐ»ÑÐ°ÐœÐžÑ. Ð­ÑÐŸ ÐŒÐŸÐ¶ÐµÑ Ð±ÑÑÑ ÐžÐ·ÐŒÐµÐœÐµÐœÐŸ ÐŽÐŸÐ±Ð°Ð²Ð»ÐµÐœÐžÐµÐŒ ÐŸÐ¿ÑÐžÐž -process_exp Ðº  ÑÐ°Ð¹Ð»Ñ Ñ ÑÐµÐŒ Ð¶Ðµ ÑÐ°ÐŒÑÐŒ ÐžÐŒÐµÐœÐµÐŒ, ÑÑÐŸ Ðž hb ÑÐ°Ð¹Ð», ÐœÐŸ ÑÐ°ÑÑÐžÑÐµÐœÐžÐµ .jpg Ð²Ð·ÑÑÐŸ ÐŽÐ»Ñ ÐŸÐ±Ð»ÐŸÐ¶ÐºÐž ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ (jpg ÑÐ°Ð¹Ð»Ñ Ð±Ð»ÐŸÐºÐžÑÑÑÑÑÑ ÑÑÐžÐŒ Ð¿Ð»Ð°Ð³ÐžÐœÐŸÐŒ). BookPlug ÑÐ²Ð»ÑÐµÑÑÑ ÑÐ¿ÑÐŸÑÐµÐœÐžÐµÐŒ (Ðž ÑÐ°ÑÑÐžÑÐµÐœÐžÐµÐŒ) HBPlug, ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÐŒÐŸÐ³ÐŸ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐŒÐž ÐÑÐŒÐ°ÐœÐžÑÐ°ÑÐœÐŸÐ¹ Ð±ÐžÐ±Ð»ÐžÐŸÑÐµÐºÐž. BookPlug ÑÐ²Ð»ÑÐµÑÑÑ Ð±ÐŸÐ»ÐµÐµ Ð±ÑÑÑÑÑÐŒ, Ð¿ÐŸÑÐºÐŸÐ»ÑÐºÑ Ð¿ÑÐµÐŽÐ¿ÐŸÐ»Ð°Ð³Ð°ÐµÑÑÑ, ÑÑÐŸ Ð²Ñ
+ÐŸÐŽÐœÑÐµ ÑÐ°Ð¹Ð»Ñ ÐŽÐŸÐ»Ð¶ÐœÑ Ð±ÑÑÑ Ð±ÐŸÐ»ÐµÐµ ÑÐžÑÑÑÐŒÐž (Ð²Ñ
+ÐŸÐŽ Ðº HDL ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐŒ ÑÐŸÐŽÐµÑÐ¶ÐžÑ ÐŒÐœÐŸÐ¶ÐµÑÑÐ²ÐŸ ÐŽÐŸÐ¿ÐŸÐ»ÐœÐžÑÐµÐ»ÑÐœÑÑ
+ ÑÑÐ³ÐŸÐ² html Ð²ÐŸÐºÑÑÐ³  ÑÑÐ³ÐŸÐ² <<TOC>>, ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÑ ÑÑÐ³Ðž <<I>>, ÑÑÐŸÐ±Ñ ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐžÑÑ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ, Ðž Ð¿ÑÐŸÑÑÐŸ Ð±ÐµÑÑÑ Ð²ÐµÑÑ ÑÐµÐºÑÑ ÐŒÐµÐ¶ÐŽÑ ÑÑÐ³Ð°ÐŒÐž <<TOC>>, Ð° ÐœÐ°ÑÐ°Ð»ÐŸÐŒ ÑÐµÐºÑÑÐ° ÐŽÐŸÐ»Ð¶ÐœÑ Ð±ÑÑÑ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÐµ ÐÐ°Ð·Ð²Ð°ÐœÐžÑ). ÐÑÐ»Ðž ÐÑ Ð¿ÐŸÐŒÐµÑÐ°ÐµÑÐµ ÐŽÐŸÐºÑÐŒÐµÐœÑÑ, ÐºÐŸÑÐŸÑÑÐµ Ð±ÑÐŽÑÑ Ð¿ÐŸÐºÐ°Ð·Ð°ÐœÑ ÑÐµÐŒ Ð¶Ðµ ÑÐ°ÐŒÑÐŒ ÑÐ¿ÐŸÑÐŸÐ±ÐŸÐŒ, ÑÑÐŸ Ðž ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ HDL, ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐ¹ÑÐµ ÑÑÐŸÑ Ð¿Ð»Ð°Ð³ÐžÐœ Ð²ÐŒÐµÑÑÐŸ HBPlug.  
+
+CONTENTdmPlugin.desc:ÐÐ»Ð°Ð³ÐžÐœ ÐŸÐ±ÑÐ°Ð±Ð°ÑÑÐ²Ð°ÑÑÐžÐ¹ RDF ÑÐ°Ð¹Ð»Ñ Ð² Ð¿ÑÐŸÑÐºÑÐ¿ÐŸÑÑÐžÑÐŸÐ²Ð°ÐœÐœÑÑ
+ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÑ
+ CONTENTdm.  
+
+ConvertBinaryFile.apply_fribidi:ÐÑÐ¿ÐŸÐ»ÐœÐžÑÑ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÑ "fribidi" Unicode Bidirectional Algorithm ÐœÐ° ÑÐºÐŸÐœÐ²ÐµÑÑÐžÑÐŸÐ²Ð°ÐœÐœÐŸÐŒ ÑÐ°Ð¹Ð»Ðµ (Ñ ÑÐµÐºÑÑÐŸÐŒ ÑÐ¿ÑÐ°Ð²Ð° ÐœÐ°Ð»ÐµÐ²ÐŸ).  
+
+ConvertBinaryFile.convert_to:ÐÐ»Ð°Ð³ÐžÐœ ÐºÐŸÐœÐ²ÐµÑÑÐžÑÑÐµÑ Ð² TEXT, ÐžÐ»Ðž HTML, ÐžÐ»Ðž ÑÐ°Ð·Ð»ÐžÑÐœÑÐµ ÑÐžÐ¿Ñ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÐ¹ (ÐœÐ°Ð¿ÑÐžÐŒÐµÑ, JPEG, GIF, PNG).  
+
+ConvertBinaryFile.convert_to.auto:Ð¢Ð°ÐºÐ¶Ðµ Ð°Ð²ÑÐŸÐŒÐ°ÑÐžÑÐµÑÐºÐž Ð²ÑÐ±ÐžÑÐ°ÐµÑÑÑ ÑÐŸÑÐŒÐ°Ñ ÐŽÐ»Ñ ÐºÐŸÐœÐ²ÐµÑÑÐžÑÐŸÐ²Ð°ÐœÐžÑ. ÐÑÐ±ÐŸÑ ÑÐŸÑÐŒÐ°ÑÐ° Ð·Ð°Ð²ÐžÑÐžÑ ÐŸÑ ÑÐžÐ¿Ð° ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÐŒÐŸÐ³ÐŸ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°. ÐÐ° Ð¿ÑÐžÐŒÐµÑ, Word Ð°Ð²ÑÐŸÐŒÐ°ÑÐžÑÐµÑÐºÐž ÐºÐŸÐœÐ²ÐµÑÑÐžÑÑÐµÑÑÑ Ð² HTML, Ð² ÑÐŸ Ð²ÑÐµÐŒÑ ÐºÐ°Ðº PowerPoint Ð² ÑÐŸÑÐŒÐ°Ñ ÐÑÐžÐœÑÑÐŸÑÐœ ÑÑÑÐ°ÐœÐžÑÐœÐ°Ñ ÐžÐ»Ð»ÑÑÑÑÐ°ÑÐžÑ (PagedImage).  
+
+ConvertBinaryFile.convert_to.html:Ð€ÐŸÑÐŒÐ°Ñ HTML.  
+
+ConvertBinaryFile.convert_to.text:Ð€ÐŸÑÐŒÐ°Ñ Ð¿ÑÐŸÑÑÐŸÐ³ÐŸ ÑÐµÐºÑÑÐ°.  
+
+ConvertBinaryFile.convert_to.pagedimg:Ð¡ÐµÑÐžÑ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÐ¹.  
+
+ConvertBinaryFile.convert_to.pagedimg_jpg:Ð¡ÐµÑÐžÑ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÐ¹ Ð² ÑÐŸÑÐŒÐ°ÑÐµ JPEG.  
+
+ConvertBinaryFile.convert_to.pagedimg_gif:Ð¡ÐµÑÐžÑ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÐ¹ Ð² ÑÐŸÑÐŒÐ°ÑÐµ GIF.  
+
+ConvertBinaryFile.convert_to.pagedimg_png:Ð¡ÐµÑÐžÑ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÐ¹ Ð² ÑÐŸÑÐŒÐ°ÑÐµ PNG.  
+
+ConvertBinaryFile.desc:Ð­ÑÐŸÑ Ð¿Ð»Ð°Ð³ÐžÐœ Ð¿ÐµÑÐµÐŽÐ°ÐµÑÑÑ Ð¿ÐŸ ÐœÐ°ÑÐ»ÐµÐŽÑÑÐ²Ñ Ð¿Ð»Ð°Ð³ÐžÐœÐ°ÐŒ ÑÐ°ÐºÐžÐŒ ÐºÐ°Ðº WordPlug Ðž PDFPlug. ÐÐœ Ð¿ÐŸÐŒÐŸÐ³Ð°ÐµÑ ÐºÐŸÐœÐ²ÐµÑÑÐžÑÐŸÐ²Ð°ÑÑ ÑÑÐž ÐŽÐŸÐºÑÐŒÐµÐœÑÑ Ð² ÑÐŸÑÐŒÐ°ÑÑ HTML ÐžÐ»Ðž TEXT ÑÐµÐŒ, ÑÑÐŸ ÑÐºÐ°Ð·ÑÐ²Ð°ÐµÑ Ð·ÐœÐ°ÑÐµÐœÐžÑ Ð¿ÐµÑÐµÐŒÐµÐœÐœÑÑ
+, ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÐŒÑÑ
+ Ð² ÑÐ°Ð±ÐŸÑÐµ Ð¿Ð»Ð°Ð³ÐžÐœÐŸÐŒ ConvertToBasPlug. Ð­ÑÐŸ Ð¿ÑÐŸÐžÑÑ
+ÐŸÐŽÐžÑ ÐŽÐžÐœÐ°ÐŒÐžÑÐœÐŸ Ñ Ð¿ÐŸÐŒÐŸÑÑÑ Ð¿ÐµÑÐµÐŽÐ°ÑÐž Ð¿ÐŸ ÐœÐ°ÑÐ»ÐµÐŽÑÑÐ²Ñ Ð°ÑÐ³ÑÐŒÐµÐœÑÐ° Ð¿Ð»Ð°Ð³ÐžÐœÐ° 'convert_to' Ð¿Ð»Ð°Ð³ÐžÐœÐ°ÐŒÐž HTMLPlug ÐžÐ»Ðž TEXTPlug. ÐÑÐ»Ðž Ð°ÑÐ³ÑÐŒÐµÐœÑ ÐœÐµ ÑÑÑÐµÑÑÐ²ÑÐµÑ, Ð¿ÐµÑÐµÐŽÐ°ÐµÑÑÑ Ð·ÐœÐ°ÑÐµÐœÐžÐµ Ð¿ÐŸ ÑÐŒÐŸÐ»ÑÐ°ÐœÐžÑ.  
+
+ConvertBinaryFile.keep_original_filename:Ð¡ÐŸÑ
+ÑÐ°ÐœÐžÑÑ ÐŸÑÐžÐ³ÐžÐœÐ°Ð»ÑÐœÐŸÐµ ÐžÐŒÑ ÑÐ°Ð¹Ð»Ð° ÐŽÐ»Ñ Ð°ÑÑÐŸÑÐžÐžÑÐŸÐ²Ð°ÐœÐœÐŸÐ³ÐŸ ÑÐ°Ð¹Ð»Ð°, Ð° ÐœÐµ Ð¿ÑÐµÐŸÐ±ÑÐ°Ð·ÐŸÐ²Ð°ÐœÐžÐµ Ð² doc.pdf, doc.doc Ðž Ñ.ÐŽ.  
+
+ConvertBinaryFile.use_strings:ÐÑÐ»Ðž ÑÑÑÐ°ÐœÐŸÐ²Ð»ÐµÐœÐŸ, ÑÐŸ Ð¿ÑÐŸÑÑÐ°Ñ  ÑÑÑÐŸÐºÐŸÐ²Ð°Ñ ÑÑÐœÐºÑÐžÑ Ð±ÑÐŽÐµÑ Ð²ÑÐ·ÑÐ²Ð°ÑÑÑÑ ÐŽÐ»Ñ ÐžÐ·Ð²Ð»ÐµÑÐµÐœÐžÑ ÑÐµÐºÑÑÐ°, ÐµÑÐ»Ðž ÑÑÐžÐ»ÐžÑÐ° ÐºÐŸÐœÐ²ÐµÑÑÐžÐž ÐœÐµ ÑÑÐ°Ð±Ð°ÑÑÐ²Ð°ÐµÑ.  
+
+ConvertToRogPlugin.desc:ÐÐ»Ð°Ð³ÐžÐœ, ÐºÐŸÑÐŸÑÑÐ¹ ÐœÐ°ÑÐ»ÐµÐŽÑÐµÑ RogPlug.  
+
+CSVPlugin.desc:ÐÐ»Ð°Ð³ÐžÐœ ÐŽÐ»Ñ ÑÐ°Ð¹Ð»ÐŸÐ² Ð² ÑÐŸÑÐŒÐ°ÑÐµ Ð·ÐœÐ°ÑÐµÐœÐžÐ¹, ÑÐ°Ð·ÐŽÐµÐ»ÐµÐœÐœÑÑ
+ Ð·Ð°Ð¿ÑÑÐŸÐ¹. ÐÐ° ÐºÐ°Ð¶ÐŽÑÑ ÑÑÑÐŸÑÐºÑ ÑÐ°Ð¹Ð»Ð° Ð±ÑÐŽÐµÑ ÑÐŸÐ·ÐŽÐ°Ðœ ÐœÐŸÐ²ÑÐ¹ ÐŽÐŸÐºÑÐŒÐµÐœÑ.  
+
+DateExtractor.desc:ÐÐ»Ð°Ð³ÐžÐœ Ð¿ÐŸÐŒÐŸÑÐž ÑÐºÑÑÑÐ°ÐºÑÐŸÑÐ° ÐŽÐ»Ñ ÐžÐ·Ð²Ð»ÐµÑÐµÐœÐžÑ ÐžÑÑÐŸÑÐžÑÐµÑÐºÐžÑ
+ ÐŽÐ°Ñ ÐžÐ· ÑÐµÐºÑÑÐ°.  
+
+DateExtractor.extract_historical_years:ÐÐ·Ð²Ð»ÐµÑÑ ÐžÐœÑÐŸÑÐŒÐ°ÑÐžÑ ÐŸ Ð²ÑÐµÐŒÐµÐœÐœÐŸÐŒ Ð¿ÐµÑÐžÐŸÐŽÐµ ÐžÐ· ÐžÑÑÐŸÑÐžÑÐµÑÐºÐžÑ
+ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ². ÐÐœÐ° Ñ
+ÑÐ°ÐœÐžÑÑÑ Ñ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐŒ Ð² ÐºÐ°ÑÐµÑÑÐ²Ðµ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+. ÐÐŒÐµÐµÑÑÑ ÐžÐœÑÐµÑÑÐµÐ¹Ñ Ð¿ÐŸÐžÑÐºÐ° ÐŽÐ»Ñ ÑÑÐžÑ
+ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+, ÐºÐŸÑÐŸÑÑÐ¹ ÐÑ ÐŒÐŸÐ¶ÐµÑÐµ Ð²ÐºÐ»ÑÑÐžÑÑ Ð² ÐÐ°ÑÑ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ, ÐŽÐŸÐ±Ð°Ð²Ð»ÑÑ ÐŸÐ¿ÐµÑÐ°ÑÐŸÑ"format QueryInterface DateSearch" Ðº ÐÐ°ÑÐµÐŒÑ ÐºÐŸÐœÑÐžÐ³ÑÑÐ°ÑÐžÐŸÐœÐœÐŸÐŒÑ ÑÐ°Ð¹Ð»Ñ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž.
+
+DateExtractor.maximum_century:ÐÐ°ÐºÑÐžÐŒÐ°Ð»ÑÐœÐŸÐµ Ð·ÐœÐ°ÑÐµÐœÐžÐµ ÐœÐ°Ð·Ð²Ð°ÐœÐœÐŸÐ³ÐŸ ÑÑÐŸÐ»ÐµÑÐžÑ, ÐºÐŸÑÐŸÑÐŸÐµ Ð±ÑÐŽÐµÑ ÐžÐ·Ð²Ð»ÐµÑÐµÐœÐŸ Ð² ÐºÐ°ÑÐµÑÑÐ²Ðµ ÐžÑÑÐŸÑÐžÑÐµÑÐºÐžÑ
+ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ (ÐœÐ°Ð¿ÑÐžÐŒÐµÑ, 14 ÐžÐ·Ð²Ð»ÐµÑÐµÑ Ð²ÑÐµ ÑÑÑÐ»ÐºÐž, ÐŸÑÐœÐŸÑÑÑÐžÐµÑÑ Ðº 14-ÐŸÐŒÑ ÑÑÐŸÐ»ÐµÑÐžÑ).
+
+DateExtractor.maximum_year:ÐÐ°ÐºÑÐžÐŒÐ°Ð»ÑÐœÐ°Ñ ÐžÑÑÐŸÑÐžÑÐµÑÐºÐ°Ñ ÐŽÐ°ÑÐ°, ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÐœÐœÐ°Ñ Ð² ÐºÐ°ÑÐµÑÑÐ²Ðµ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ (ÐŽÐ°ÑÐ° ÑÑÑ, ÑÐžÐ¿Ð° 1950).
+
+DateExtractor.no_bibliography:ÐÐµ Ð¿ÑÐŸÐ±ÑÐ¹ÑÐµ Ð±Ð»ÐŸÐºÐžÑÐŸÐ²Ð°ÑÑ Ð±ÐžÐ±Ð»ÐžÐŸÐ³ÑÐ°ÑÐžÑÐµÑÐºÐžÐµ ÐŽÐ°ÑÑ Ð¿ÑÐž ÐžÐ·Ð²Ð»ÐµÑÐµÐœÐžÐž ÐžÑÑÐŸÑÐžÑÐµÑÐºÐžÑ
+ ÐŽÐ°Ñ.
+
+DirectoryPlugin.desc:RecPlug - ÑÑÐŸ Ð¿Ð»Ð°Ð³ÐžÐœ, ÐºÐŸÑÐŸÑÑÐ¹ Ð¿ÐŸÐ²ÑÐŸÑÑÐµÑÑÑ Ð² ÐºÐ°Ð¶ÐŽÐŸÐ¹ ÐŽÐžÑÐµÐºÑÐŸÑÐžÐž, ÐŸÐ±ÑÐ°Ð±Ð°ÑÑÐ²Ð°Ñ ÐºÐ°Ð¶ÐŽÑÐ¹ ÑÐ°Ð¹Ð», ÐºÐŸÑÐŸÑÑÐ¹ ÐŸÐœ ÐœÐ°Ñ
+ÐŸÐŽÐžÑ.
+
+DirectoryPlugin.recheck_directories:ÐÐŸÑÐ»Ðµ ÑÐŸÐ³ÐŸ, ÐºÐ°Ðº ÑÐ°Ð¹Ð»Ñ Ð² Ð¿Ð°Ð¿ÐºÐµ ÐžÐŒÐ¿ÐŸÑÑÐ° Ð±ÑÐ»Ðž ÐŸÐ±ÑÐ°Ð±ÐŸÑÐ°ÐœÑ, Ð¿Ð°Ð¿ÐºÐ° Ð¿ÐŸÐ²ÑÐŸÑÐœÐŸ Ð¿ÑÐŸÑÐžÑÑÐ²Ð°ÐµÑÑÑ, ÑÑÐŸÐ±Ñ ÐŸÐ±ÐœÐ°ÑÑÐ¶ÐžÑÑ Ð»ÑÐ±ÑÐµ Ð²ÐœÐŸÐ²Ñ ÑÐŸÐ·ÐŽÐ°ÐœÐœÑÐµ ÑÐ°Ð¹Ð»Ñ.
+
+DirectoryPlugin.use_metadata_files:(ÐÐÐÐÐÐÐÐ« - Ð²ÐŒÐµÑÑÐŸ, ÐŽÐŸÐ±Ð°Ð²ÐžÑÑ Ð¿Ð»Ð°Ð³ÐžÐœ MetadataXMLPlugin Ðº ÑÐ¿ÐžÑÐºÑ Ð¿Ð»Ð°Ð³ÐžÐœÐŸÐ²) Ð§ÐžÑÐ°ÑÑ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÐµ ÐžÐ· XML-ÑÐ°Ð¹Ð»ÐŸÐ².  
+
+DatabasePlugin.desc:ÐÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑ Ð·Ð°Ð¿ÐžÑÐž ÐžÐ· Ð±Ð°Ð·Ñ ÐŽÐ°ÐœÐœÑÑ
+  ÐºÐ°Ðº ÐŽÐŸÐºÑÐŒÐµÐœÑÑ.
+
+DSpacePlugin.desc:ÐÐ»Ð°Ð³ÐžÐœ ÑÑÐžÑÑÐ²Ð°ÐµÑ ÑÐºÑÐ¿ÐŸÑÑÐžÑÑÐµÐŒÑÐµ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ² ÐžÐ· DSpace Ðž ÐžÐŒÐ¿ÐŸÑÑÐžÑÑÐµÑ Ð² ÐÑÐžÐœÑÑÐŸÑÐœ.  
+	
+DSpacePlugin.first_inorder_ext:Ð­ÑÐ° ÐŸÐ¿ÑÐžÑ Ð¿ÑÐµÐŽÐœÐ°Ð·ÐœÐ°ÑÐµÐœÐ° ÐŽÐ»Ñ ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐžÑ Ð¿ÐµÑÐ²ÐŸÑÑÐµÐ¿ÐµÐœÐœÐŸÐ³ÐŸ Ð¿ÐŸÑÐŸÐºÐ° ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ² DSpace. ÐÑÐŸÐ³ÑÐ°ÐŒÐŒÐ° Ð±ÑÐŽÐµÑ ÐžÑÐºÐ°ÑÑ Ð²ÐŸÐ·ÐŒÐŸÐ¶ÐœÑÐ¹ Ð¿ÐµÑÐ²ÐŸÑÑÐµÐ¿ÐµÐœÐœÑÐ¹ ÑÐ°Ð¹Ð» ext.  
+
+DSpacePlugin.first_inorder_mime:Ð­ÑÐ° ÐŸÐ¿ÑÐžÑ Ð¿ÑÐµÐŽÐœÐ°Ð·ÐœÐ°ÑÐµÐœÐ° ÐŽÐ»Ñ ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐžÑ Ð¿ÐµÑÐ²ÐžÑÐœÐŸÐ³ÐŸ Ð¿ÐŸÑÐŸÐºÐ° ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ² ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž DSpace. ÐÑÐŸÐ³ÑÐ°ÐŒÐŒÐ° Ð±ÑÐŽÐµÑ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÑ ÐŸÐ±ÐŸÐ·ÐœÐ°ÑÐµÐœÐœÑÐµ ÑÐžÐ¿Ñ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ° mime Ð² ÑÐµÑÐžÐž, ÑÑÐŸÐ±Ñ ÐœÐ°Ð¹ÑÐž Ð²ÐŸÐ·ÐŒÐŸÐ¶ÐœÑÐ¹ Ð¿ÐµÑÐ²ÐŸÑÑÐµÐ¿ÐµÐœÐœÑÐ¹ ÑÐ°Ð¹Ð».  
+
+DSpacePlugin.only_first_doc:Ð­ÑÐ° ÐŸÐ¿ÑÐžÑ Ð¿ÑÐµÐŽÐœÐ°Ð·ÐœÐ°ÑÐµÐœÐ° ÐŽÐ»Ñ ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐžÑ Ð¿ÐµÑÐ²ÐžÑÐœÐŸÐ³ÐŸ Ð¿ÐŸÑÐŸÐºÐ° Ð² ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°Ñ
+ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž DSpace. ÐÑÐŸÐ³ÑÐ°ÐŒÐŒÐ° Ð±ÑÐŽÐµÑ ÑÑÐžÑÐ°ÑÑ Ð¿ÐµÑÐ²ÐŸÑÑÐµÐ¿ÐµÐœÐœÑÐŒ ÑÐ°Ð¹Ð»ÐŸÐŒ Ð¿ÐµÑÐ²ÑÐ¹ ÐŸÐ±ÐŸÐ·ÐœÐ°ÑÐµÐœÐœÑÐ¹ Ð² ÑÐ°Ð¹Ð»Ðµ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ dublic_core.  
+
+EmailAddressExtractor.desc:ÐÐ»Ð°Ð³ÐžÐœ Ð¿ÐŸÐŒÐŸÑÐž ÑÐºÑÑÑÐ°ÐºÑÐŸÑÐ° ÐŽÐ»Ñ Ð¿ÐŸÐžÑÐºÐ° Ð°ÐŽÑÐµÑÐŸÐ² ÑÐ»ÐµÐºÑÑÐŸÐœÐœÐŸÐ¹ Ð¿ÐŸÑÑÑ Ð² ÑÐµÐºÑÑÐµ.  
+
+EmailAddressExtractor.done_email_extract:ÐÑÐ¿ÐŸÐ»ÐœÐµÐœÐŸ ÐžÐ·Ð²Ð»ÐµÑÐµÐœÐžÐµ Ð°ÐŽÑÐµÑÐŸÐ² ÑÐ»ÐµÐºÑÑÐŸÐœÐœÐŸÐ¹ Ð¿ÐŸÑÑÑ.
+
+EmailAddressExtractor.extracting_emails:ÐžÐ·Ð²Ð»ÐµÑÐµÐœÐžÐµ Ð°ÐŽÑÐµÑÐŸÐ² ÑÐ»ÐµÐºÑÑÐŸÐœÐœÐŸÐ¹ Ð¿ÐŸÑÑÑ
+
+EmailAddressExtractor.extract_email:ÐÐ·Ð²Ð»ÐµÑÑ Ð°ÐŽÑÐµÑÐ° ÑÐ»ÐµÐºÑÑÐŸÐœÐœÐŸÐ¹ Ð¿ÐŸÑÑÑ Ð² ÐºÐ°ÑÐµÑÑÐ²Ðµ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+.
+
+EmailPlugin.desc:ÐÐ»Ð°Ð³ÐžÐœ Email ÑÐžÑÐ°ÐµÑ ÑÐ°Ð¹Ð»Ñ ÑÐ»ÐµÐºÑÑÐŸÐœÐœÐŸÐ¹ Ð¿ÐŸÑÑÑ. ÐÐœÐž ÐžÐŒÐµÐœÑÑÑÑÑ Ð¿ÑÐŸÑÑÑÐŒÐž ÐœÐŸÐŒÐµÑÐ°ÐŒÐž (Ñ.Ðµ.Ð² ÑÐŸÐŒ Ð¿ÐŸÑÑÐŽÐºÐµ,ÐºÐ°Ðº ÐŸÐœÐž Ð¿ÐŸÑÐ²Ð»ÑÑÑÑÑ Ð² Ð¿Ð°Ð¿ÐºÐ°Ñ
+ Ð¿ÐŸÑÑÐŸÐ²ÐŸÐ¹ ÐŽÐžÑÐµÐºÑÐŸÑÐžÐž) ÐžÐ»Ðž Ñ ÑÐ°ÑÑÐžÑÐµÐœÐžÐµÐŒ .mbx (ÑÐŸÑÐŒÐ°Ñ ÑÐ°Ð¹Ð»Ð° ÐŽÐ»Ñ Ð¿ÐžÑÐµÐŒ mbox).\nÐ¢ÐµÐºÑÑ ÐŽÐŸÐŸÐºÑÐŒÐµÐœÑÐ°: Ð¢ÐµÐºÑÑ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ° ÑÐŸÑÑÐŸÐžÑ ÐžÐ· Ð²ÑÐµÐ³ÐŸ ÑÐµÐºÑÑÐ° Ð¿ÐŸÑÐ»Ðµ Ð¿ÐµÑÐ²ÐŸÐ¹ Ð¿ÑÑÑÐŸÐ¹ ÑÑÑÐŸÐºÐž Ð² ÐŽÐŸÐºÑÐŒÐµÐœÑÐµ.\nÐÐµÑÐ°ÐŽÐ°ÐœÐœÑÐµ (ÐœÐµ Dublin Core!):\n\t\$Headers ÐÑÐµ ÑÑÐŸ ÑÐŸÐŽÐµÑÐ¶ÐžÑ Ð·Ð°Ð³ÐŸÐ»ÐŸÐ²ÐŸÐº (ÐœÐµÐŸÐ±ÑÐ·Ð°ÑÐµÐ»ÑÐœÐŸ, Ð¿ÐŸ ÑÐŒÐŸÐ»ÑÐ°ÐœÐžÑ ÐœÐµ ÑÐŸÑ
+ÑÐ°ÐœÑÐµÑÑÑ)\n\t\$Subject ÐÑÐµÐŽÐŒÐµÑ: Ð·Ð°Ð³ÐŸÐ»ÐŸÐ²ÐŸÐº\n\t\$To  ÐÐŸÐŒÑ:Ð·Ð°Ð³ÐŸÐ»ÐŸÐ²ÐŸÐº\n\t\$From ÐºÐŸÐ³ÐŸ   ÐÑ ÐºÐŸÐ³ÐŸ: Ð·Ð°Ð³ÐŸÐ»ÐŸÐ²ÐŸÐº\n\t\$FromName ÐŸÑ ÐºÐŸÐ³ÐŸ  ÐÐŒÑ ÐŸÑÐ¿ÑÐ°Ð²ÐžÑÐµÐ»Ñ(ÐºÐŸÐ³ÐŽÐŽÐ° ÐŸÐœÐŸ ÐžÐŒÐµÐµÑÑÑ Ð² ÐœÐ°Ð»ÐžÑÐžÐž)\n\t\$FromAddr ÐŸÑ ÐºÐŸÐ³ÐŸ  Ð°ÐŽÑÐµÑ ÑÐ»ÐµÐºÑÑÐŸÐœÐœÐŸÐ¹ Ð¿ÐŸÑÑÑ ÐŸÑÐ¿ÑÐ°Ð²ÐžÑÐµÐ»Ñ\n\t\$DateText ÐŽÐ°ÑÑ  ÐÐ°ÑÐ°: Ð·Ð°Ð³ÐŸÐ»ÐŸÐ²ÐŸÐº\n\t\$Date   ÐÐ°ÑÐ°: Ð·Ð°Ð³ÐŸÐ»ÐŸÐ²ÐŸÐº Ð² ÑÐŸÑÐŒÐ°ÑÐµ ÑÐžÑÑÐŸÐ²ÐŸÐ¹ Ð±ÐžÐ±Ð»ÐžÐŸÑÐµÐºÐž Greenstone (ÐœÐ°Ð¿ÑÐžÐŒÐµÑ: 19990924)  
+
+EmailPlugin.no_attachments:ÐÐµ ÑÐŸÑ
+ÑÐ°ÐœÑÑÑ Ð¿ÑÐžÐ»ÐŸÐ¶ÐµÐœÐžÑ ÑÐŸÐŸÐ±ÑÐµÐœÐžÑ.
+
+EmailPlugin.headers:Ð¡ÐŸÑ
+ÑÐ°ÐœÑÑÑ Ð¿ÐŸÑÑÐŸÐ²ÑÐµ Ð·Ð°Ð³ÐŸÐ»ÐŸÐ²ÐºÐž ÐºÐ°Ðº ÐŒÐµÑÐ°-ÐŽÐ°ÐœÐœÑÐµ "Headers"
+
+EmailPlugin.OIDtype.message_id:ÐÑÐ¿ÐŸÐ»ÑÐ·ÑÐ¹ÑÐµ ÐžÐŽÐµÐœÑÐžÑÐžÐºÐ°ÑÐŸÑ ÑÐŸÐŸÐ±ÑÐµÐœÐžÑ Ð² ÐºÐ°ÑÐµÑÑÐ²Ðµ OID ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°. ÐÑÐ»Ðž ÐžÐŽÐµÐœÑÐžÑÐžÐºÐ°ÑÐŸÑ ÐœÐ°Ð¹ÐŽÐµÐœ, Ð·Ð°ÑÐµÐŒ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑÑÑ ÐžÑÑÐŸÑÐœÐžÐº OID.  
+
+EmailPlugin.split_exp:ÐÐ±ÑÑÐœÐŸÐµ Ð²ÑÑÐ°Ð¶ÐµÐœÐžÐµ  perl ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑÑÑ ÐŽÐ»Ñ ÑÐ°ÑÑÐµÐ¿Ð»ÐµÐœÐžÑ ÑÐ°Ð¹Ð»ÐŸÐ², ÑÐŸÐŽÐµÑÐ¶Ð°ÑÐžÑ
+ ÐžÐŒÐµÐ»ÐŸ ÐŸÐ±ÑÐºÐœÐŸÐ²ÐµÐœÐžÐµ ÑÐ°ÑÐºÐ°Ð»ÑÐ²Ð°ÑÑ ÑÐ°Ð¹Ð»Ñ, ÑÐŸÐŽÐµÑÐ¶Ð°ÑÐžÐµ ÐŒÐœÐŸÐ³ÐŸ ÑÐŸÐŸÐ±ÑÐµÐœÐžÐ¹ Ð² ÐžÐœÐŽÐžÐ²ÐžÐŽÑÐ°Ð»ÑÐœÑÑ
+ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°Ñ
+.
+
+ExcelPlugin.desc:ÐÐ»Ð°Ð³ÐžÐœ ÐŽÐ»Ñ ÐžÐŒÐ¿ÐŸÑÑÐ° ÑÐ°Ð¹Ð»Ð° Microsoft Excel.
+
+FavouritesPlugin.desc:ÐÐ»Ð°Ð³ÐžÐœ ÐŽÐ»Ñ ÐŸÐ±ÑÐ°Ð±ÐŸÑÐºÐž ÑÐ°Ð¹Ð»ÐŸÐ² Ð·Ð°ÐºÐ»Ð°ÐŽÐŸÐº ÐÑÐŸÐ²ÐŸÐŽÐœÐžÐºÐ° ÐÐœÑÐµÑÐœÐµÑ  
+
+FOXPlugin.desc:ÐÐ»Ð°Ð³ÐžÐœ ÐŽÐ»Ñ ÐŸÐ±ÑÐ°Ð±ÐŸÑÐºÐž ÑÐ°Ð¹Ð»Ð° Foxbase dbt. Ð­ÑÐŸÑ Ð¿Ð»Ð°Ð³ÐžÐœ ÐŸÐ±ÐµÑÐ¿ÐµÑÐžÐ²Ð°ÐµÑ ÐŸÑÐœÐŸÐ²ÐœÑÐµ ÑÑÐœÐºÑÐžÐŸÐœÐ°Ð»ÑÐœÑÐµ Ð²ÐŸÐ·ÐŒÐŸÐ¶ÐœÐŸÑÑÐž ÑÑÐµÐœÐžÑ dbt Ðž dbf ÑÐ°Ð¹Ð»ÐŸÐ² Ðž ÐŸÐ±ÑÐ°Ð±ÐŸÑÐºÐž ÐºÐ°Ð¶ÐŽÐŸÐ¹ Ð·Ð°Ð¿ÐžÑÐž. Ð­ÑÐŸÑ ÐŸÐ±ÑÐžÐ¹ Ð¿Ð»Ð°Ð³ÐžÐœ ÐŽÐŸÐ»Ð¶ÐµÐœ Ð±ÑÑÑ Ð·Ð°ÐŒÐµÑÐµÐœ ÐŽÐ»Ñ ÑÐ¿ÐµÑÐžÑÐžÑÐµÑÐºÐŸÐ¹ Ð±Ð°Ð·Ñ ÐŽÐ°ÐœÐœÑÑ
+, ÑÑÐŸÐ±Ñ ÐŸÐ±ÑÐ°Ð±ÐŸÑÐ°ÑÑ ÑÐŸÐŸÑÐ²ÐµÑÑÑÐ²ÑÑÑÐžÐµ Ð¿ÐŸÐ»Ñ Ð² ÑÐ°Ð¹Ð»Ðµ.
+
+GreenstoneXMLPlugin.desc:ÐÐ±ÑÐ°Ð±ÐŸÑÐºÐ° XML ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ² Ð°ÑÑ
+ÐžÐ²Ð° Greenstone. ÐÐ±ÑÐ°ÑÐžÑÐµ Ð²ÐœÐžÐŒÐ°ÐœÐžÐµ, ÑÑÐŸ ÑÑÐŸÑ Ð¿Ð»Ð°Ð³ÐžÐœ ÐœÐµ ÐŽÐµÐ»Ð°ÐµÑ ÐœÐžÐºÐ°ÐºÐŸÐ¹ Ð¿ÑÐŸÐ²ÐµÑÐºÐž ÑÐžÐœÑÐ°ÐºÑÐžÑÐ° (Ñ
+ÐŸÑÑ  Ð°ÐœÐ°Ð»ÐžÐ·ÐžÑÑÑÑÐžÐ¹ ÐŒÐŸÐŽÑÐ»Ñ XML::   Ð¿ÑÐŸÐ²ÐµÑÑÐµÑ Ð¿ÑÐ°Ð²ÐžÐ»ÑÐœÐŸÑÑÑ Ð¿ÐŸÑÑÑÐŸÐµÐœÐžÑ). ÐÑÐµÐŽÐ¿ÐŸÐ»Ð°Ð³Ð°ÐµÑÑÑ, ÑÑÐŸ ÑÐ°Ð¹Ð»Ñ Ð°ÑÑ
+ÐžÐ²Ð° Greenstone ÑÐŸÐŸÑÐ²ÐµÑÑÑÐ²ÑÑÑ ÐžÑ
+ DTD .
+
+GISExtractor.desc:ÐÐŸÐ¿ÐŸÐ»ÐœÐžÑÐµÐ»ÑÐœÑÐ¹ ÐºÐ»Ð°ÑÑ Ðº BasPlug, ÐºÐŸÑÐŸÑÑÐ¹ Ð¿ÐŸÐŽÐŽÐµÑÐ¶ÐžÐ²Ð°ÐµÑ Ð²ÐŸÐ·ÐŒÐŸÐ¶ÐœÐŸÑÑÐž ÐÐµÐŸÐ³ÑÐ°ÑÐžÑÐµÑÐºÐžÑ
+ ÐÐœÑÐŸÑÐŒÐ°ÑÐžÐŸÐœÑÑ
+ Ð¡ÐžÑÑÐµÐŒ (ÐÐÐ¡)
+
+GISExtractor.extract_placenames:Ð Ð°ÑÐ¿ÐŸÐ·ÐœÐŸÐ²Ð°ÑÑ Ð³ÐµÐŸÐ³ÑÐ°ÑÐžÑÐµÑÐºÐžÐµ ÐœÐ°Ð·Ð²Ð°ÐœÐžÑ Ð² ÑÐµÐºÑÑÐµ Ðž Ð²ÐºÐ»ÑÑÐžÑÑ ÐžÑ
+ Ð² ÐŒÐµÑÐ°-ÐŽÐ°ÐœÐœÑÐµ. Ð¢ÑÐµÐ±ÑÐµÑ ÑÐ°ÑÑÐžÑÐµÐœÐžÐµ ÐÐÐ¡ Ð² ÐÑÐžÐœÑÑÐŸÑÐœ.
+
+GISExtractor.gazetteer:ÐÐµÐŸÐ³ÑÐ°ÑÐžÑÐµÑÐºÐžÐ¹ ÑÐ¿ÑÐ°Ð²ÐŸÑÐœÐžÐº ÐŽÐ»Ñ ÑÐ°ÑÐ¿ÐŸÐ·ÐœÐ°ÐœÐžÑ Ð³ÐµÐŸÐ³ÑÐ°ÑÐžÑÐµÑÐºÐžÑ
+ ÐœÐ°Ð·Ð²Ð°ÐœÐžÐ¹ Ð² ÑÐµÐºÑÑÐµ Ðž ÐŽÐŸÐ±Ð°Ð²Ð»ÐµÐœÐžÑ ÐžÑ
+ Ð² ÐŒÐµÑÐ°-ÐŽÐ°ÐœÐœÑÑ
+. Ð¢ÑÐµÐ±ÑÐµÑ ÑÐ°ÑÑÐžÑÐµÐœÐžÐµ ÐÐÐ¡ Ð² ÐÑÐžÐœÑÑÐŸÑÐœ.
+
+GISExtractor.place_list:ÐÑÐž ÑÐ°ÑÐ¿ÐŸÐ·ÐœÐ°ÐœÐžÐž Ð³ÐµÐŸÐ³ÑÐ°ÑÐžÑÐµÑÐºÐžÑ
+ ÐœÐ°Ð·Ð²Ð°ÐœÐžÐ¹, Ð¿Ð»Ð°Ð³ÐžÐœ Ð²ÐºÐ»ÑÑÐ°ÐµÑ ÐžÑ
+ ÑÐ¿ÐžÑÐŸÐº Ð² ÐœÐ°ÑÐ°Ð»ÐŸ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°. Ð¢ÑÐµÐ±ÑÐµÑ ÑÐ°ÑÑÐžÑÐµÐœÐžÐµ ÐÐÐ¡ Ð² ÐÑÐžÐœÑÑÐŸÑÐœ.
+
+HBPlugin.desc:ÐÐ»Ð°Ð³ÐžÐœ, ÐºÐŸÑÐŸÑÑÐ¹ ÐŸÐ±ÑÐ°Ð±Ð°ÑÑÐ²Ð°ÐµÑ HTML ÐºÐœÐžÐ¶ÐœÑÑ ÐŽÐžÑÐµÐºÑÐŸÑÐžÑ. Ð­ÑÐŸÑ Ð¿Ð»Ð°Ð³ÐžÐœ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑÑÑ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐŒÐž ÐÑÐŒÐ°ÐœÐžÑÐ°ÑÐœÐŸÐ¹ Ð±ÐžÐ±Ð»ÐžÐŸÑÐµÐºÐž Ðž ÐœÐµ ÐŸÐ±ÑÐ°Ð±Ð°ÑÑÐ²Ð°ÐµÑ ÐŽÑÑÐ³ÐžÐµ Ð²Ñ
+ÐŸÐŽÐœÑÐµ ÑÐžÑÑÐŸÐ²Ð°ÐœÐžÑ, ÐºÑÐŸÐŒÐµ ascii ÐžÐ»Ðž Ñ ÑÐ°ÑÑÐžÑÐµÐœÐžÐµÐŒ ascii. Ð­ÑÐ° Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐ° ÑÐ²Ð»ÑÐµÑÑÑ Ð»ÑÑÑÐµÐ¹ ÐžÐ· Ñ
+ÑÐŽÑÐžÑ
+ Ðž ÐŒÐŸÐ³Ð»Ð° Ð±Ñ Ð±ÐµÐ· ÑÐŸÐŒÐœÐµÐœÐžÑ ÐŽÐŸÑÐ°Ð±ÐŸÑÐ°ÐœÐ° ÑÐ°Ðº, ÑÑÐŸÐ±Ñ Ð·Ð°Ð³ÑÑÐ¶Ð°ÑÑÑÑ Ð±ÑÑÑÑÐµÐµ. ÐÑÑÐ°Ð²Ð»ÑÑ ÐµÐµ Ð² ÑÑÐŸÐŒ ÑÐŸÑÑÐŸÑÐœÐžÐž, Ñ ÐœÐ°ÐŽÐµÑÑÑ Ð¿ÐŸÐŸÑÑÐžÑÑ Ð»ÑÐŽÐµÐ¹ ÐŽÐµÐ»Ð°ÑÑ ÐžÑ
+ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž, ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÑ Ð²ÐŒÐµÑÑÐŸ ÑÑÐŸÐ³ÐŸ Ð¿Ð»Ð°Ð³ÐžÐœ HBSPlug. ;-)\n\n ÐÑÐ¿ÐŸÐ»ÑÐ·ÑÐ¹ÑÐµ HBSPlug Ð¿ÑÐž ÑÐŸÐ·ÐŽÐ°ÐœÐžÐž ÐœÐŸÐ²ÐŸÐ¹ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž Ðž Ð¿ÐŸÐŒÐµÑÐµÐœÐœÑÑ
+ ÑÐ°Ð¹Ð»ÐŸÐ², Ð¿ÐŸÐŽÐŸÐ±ÐœÐŸ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐŒ ÐÑÐŒÐ°ÐœÐžÑÐ°ÑÐœÐŸÐ¹ Ð±ÐžÐ±Ð»ÐžÐŸÑÐµÐºÐž. HBSPlug Ð¿ÑÐžÐœÐžÐŒÐ°ÐµÑ Ð²ÑÐµ Ð²Ñ
+ÐŸÐŽÐœÑÐµ ÐºÐŸÐŽÐžÑÐŸÐ²Ð°ÐœÐžÑ, ÐœÐŸ ÐŸÐ¶ÐžÐŽÐ°ÐµÑ, ÑÑÐŸ Ð¿ÐŸÐŒÐµÑÐµÐœÐœÑÐµ ÑÐ°Ð¹Ð»Ñ Ð±ÑÐŽÑÑ Ð±ÐŸÐ»ÐµÐµ ÑÐžÑÑÑÐŒÐž, ÑÐµÐŒ ÑÐµ, ÑÑÐŸ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÑÑÑÑ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑÐŒÐž ÐÑÐŒÐ°ÐœÐžÑÐ°ÑÐœÐŸÐ¹ Ð±ÐžÐ±Ð»ÐžÐŸÑÐµÐºÐž.  
+
+HBPlugin.encoding.iso_8859_1:Latin1 (Ð·Ð°Ð¿Ð°ÐŽÐœÑÐµ ÑÐ·ÑÐºÐž)  
+
+HTMLImagePlugin.aggressiveness:Ð Ð°ÐœÐ³ ÑÐ²ÑÐ·Ð°ÐœÐœÑÑ
+ ÐŒÐµÑÐŸÐŽÐŸÐ², ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÐŒÑÑ
+ ÐŽÐ»Ñ ÐžÐ·Ð²Ð»ÐµÑÐµÐœÐžÑ ÑÐµÐºÑÑÐ°.
+HTMLImagePlugin.aggressiveness.1:ÐÐŒÑ ÑÐ°Ð¹Ð»Ð°, Ð¿ÑÑÑ, ÐŒÐŸÐŽÐžÑÐžÐºÐ°ÑÐžÑ (ALT) ÑÐŸÐ»ÑÐºÐŸ ÑÐµÐºÑÑÐ°.
+HTMLImagePlugin.aggressiveness.2:ÐÑÐµ ÐžÐ· 1 Ð¿Ð»ÑÑ Ð·Ð°Ð³ÐŸÐ»ÐŸÐ²ÐŸÐº, Ð³ÐŽÐµ ÑÑÐŸ ÐŽÐŸÑÑÑÐ¿ÐœÐŸ.
+HTMLImagePlugin.aggressiveness.3:ÐÑÐµ  ÐžÐ· 2 Ð¿Ð»ÑÑ Ð±Ð»ÐžÐ¶Ð°Ð¹ÑÐžÐµ Ð¿Ð°ÑÐ°Ð³ÑÐ°ÑÑ, Ð³ÐŽÐµ ÑÑÐŸ ÐŽÐŸÑÑÑÐ¿ÐœÐŸ.
+HTMLImagePlugin.aggressiveness.4:ÐÑÐµ ÐžÐ· 3 Ð¿Ð»ÑÑ Ð¿ÑÐµÐŽÑÐŽÑÑÐžÐµ Ð·Ð°Ð³ÐŸÐ»ÐŸÐ²ÐºÐž (<h1>, <h2> ...), Ð³ÐŽÐµ ÑÑÐŸ ÐŽÐŸÑÑÑÐ¿ÐœÐŸ.
+HTMLImagePlugin.aggressiveness.5:ÐÑÐµ ÐžÐ· 4 Ð¿Ð»ÑÑ ÑÐµÐºÑÑÐŸÐ²ÑÐµ ÑÑÑÐ»ÐºÐž, Ð³ÐŽÐµ ÑÑÐŸ ÐŽÐŸÑÑÑÐ¿ÐœÐŸ.
+HTMLImagePlugin.aggressiveness.6:ÐÑÐµ ÐžÐ· 4 Ð¿Ð»ÑÑ ÑÑÑÐ°ÐœÐžÑÐ° ÐŒÐµÑÐ°ÑÑÐ³ÐŸÐ² (ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµ, ÐºÐ»ÑÑÐµÐ²ÑÐµ ÑÐ»ÐŸÐ²Ð° Ðž Ñ.ÐŽ).
+HTMLImagePlugin.aggressiveness.7:ÐÑÐµ  ÐžÐ· ÐŸÐ±ÑÐµÐŽÐžÐœÐµÐœÐœÑÑ
+ 6, 5 Ðž 4.
+HTMLImagePlugin.aggressiveness.8:ÐÑÐµ ÐžÐ· 7 Ð¿Ð»ÑÑ Ð¿ÐŸÐ²ÑÐŸÑÐµÐœÐžÐµ Ð·Ð°Ð³ÐŸÐ»ÐŸÐ²ÐºÐ°, ÐžÐŒÐµÐœÐž ÑÐ°Ð¹Ð»Ð° Ðž Ñ.ÐŽ ( Ð¿ÐŸÐ²ÑÑÐµÐœÐžÐµ ÑÐ°ÐœÐ³Ð° Ð±ÐŸÐ»ÐµÐµ ÑÐŸÐŸÑÐ²ÐµÑÑÑÐ²ÑÑÑÐžÑ
+ ÑÐµÐ·ÑÐ»ÑÑÐ°ÑÐŸÐ²).
+HTMLImagePlugin.aggressiveness.9:ÐÑÐµ ÐžÐ· 1 Ð¿Ð»ÑÑ Ð¿ÐŸÐ»ÐœÑÐ¹ ÑÐµÐºÑÑ ÐžÑÑ
+ÐŸÐŽÐœÐŸÐ¹ ÑÑÑÐ°ÐœÐžÑÑ.
+
+HTMLImagePlugin.caption_length:ÐÐ°ÐºÑÐžÐŒÐ°Ð»ÑÐœÐ°Ñ ÐŽÐ»ÐžÐœÐ° Ð·Ð°Ð³ÐŸÐ»ÐŸÐ²ÐºÐŸÐ² (Ð² Ð·ÐœÐ°ÐºÐ°Ñ
+).
+
+HTMLImagePlugin.convert_params:ÐÐŸÐ¿ÐŸÐ»ÐœÐžÑÐµÐ»ÑÐœÑÐµ Ð¿Ð°ÑÐ°ÐŒÐµÑÑÑ ÐŽÐ»Ñ ImageMagicK ÐºÐŸÐœÐ²ÐµÑÑÐžÑÑÑÑ ÑÐŒÐµÐœÑÑÐµÐœÐœÑÐµ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ. ÐÐ°Ð¿ÑÐžÐŒÐµÑ, '-Ð¿ÐŸÐ²ÑÑÐµÐœÐžÐµ' ÐŽÐ°ÑÑ ÑÑÐµÑ
+ÐŒÐµÑÐœÑÐ¹ Ð²ÐžÐŽ ÑÐŒÐµÐœÑÑÐµÐœÐœÑÐŒ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑÐŒ.
+
+HTMLImagePlugin.desc:ÐÐ»Ð°Ð³ÐžÐœ ÐŽÐ»Ñ ÐžÐ·Ð²Ð»ÐµÑÐµÐœÐžÑ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÐ¹ Ðž ÑÐ²ÑÐ·Ð°ÐœÐœÐŸÐ³ÐŸ ÑÐµÐºÑÑÐ° ÐžÐ· Ð²ÐµÐ±-ÑÑÑÐ°ÐœÐžÑ.
+
+HTMLImagePlugin.document_text:ÐÐŸÐ±Ð°Ð²ÐžÑÑ ÑÐµÐºÑÑ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ Ð² Ð²ÐžÐŽÐµ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°:ÑÐµÐºÑÑ (ÐžÐœÐ°ÑÐµ, Ð¿ÐŸÐ»Ðµ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ IndexedText).
+
+HTMLImagePlugin.index_pages:ÐÐœÐŽÐµÐºÑÐžÑÐŸÐ²Ð°ÑÑ ÑÑÑÐ°ÐœÐžÑÑ ÐœÐ°ÑÑÐŽÑ Ñ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑÐŒÐž. ÐÐœÐ°ÑÐµ, ÑÐŸÑÐ»Ð°ÑÑÑÑ ÐœÐ° ÑÑÑÐ°ÐœÐžÑÑ Ð² ÐžÑÑ
+ÐŸÐŽÐœÐŸÐŒ URL.
+
+HTMLImagePlugin.max_near_text:ÐÐ°ÐºÑÐžÐŒÐ°Ð»ÑÐœÐŸÐµ ÐºÐŸÐ»ÐžÑÐµÑÑÐ²ÐŸ Ð·ÐœÐ°ÐºÐŸÐ² Ñ ÐžÐ·Ð²Ð»ÐµÐºÐ°ÐµÐŒÑÑ
+ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÐ¹.
+
+HTMLImagePlugin.min_height:ÐÐžÐºÑÐµÐ»Ñ. ÐÑÐŸÐ¿ÑÑÑÐžÑÑ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ, ÐŒÐµÐœÑÑÐžÐµ, ÑÐµÐŒ ÑÑÐŸ.
+
+HTMLImagePlugin.min_near_text:ÐÐžÐœÐžÐŒÐ°Ð»ÑÐœÐŸÐµ ÐºÐŸÐ»ÐžÑÐµÑÑÐ²ÐŸ Ð·ÐœÐ°ÐºÐŸÐ² Ñ ÐžÐ·Ð²Ð»ÐµÐºÐ°ÐµÐŒÐŸÐ³ÐŸ ÑÐµÐºÑÑÐ° ÐžÐ»Ðž Ð·Ð°Ð³ÐŸÐ»ÐŸÐ²ÐºÐ°.
+
+HTMLImagePlugin.min_size:ÐÐ°Ð¹ÑÑ. ÐÑÐŸÐ¿ÑÑÑÐžÑÑ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ, ÐŒÐµÐœÑÑÐžÐµ, ÑÐµÐŒ ÑÑÐŸ.
+
+HTMLImagePlugin.min_width:ÐÐžÐºÑÐµÐ»Ñ. ÐÑÐŸÐ¿ÑÑÑÐžÑÑ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ, Ð±ÐŸÐ»ÐµÐµ ÑÐ·ÐºÐžÐµ, ÑÐµÐŒ ÑÑÐŸ.
+
+HTMLImagePlugin.neartext_length:ÐÐ»ÐžÐœÐ° Ð°ÐŽÑÐµÑÐ° Ñ ÑÐµÐºÑÑÐ° (Ð² Ð·ÐœÐ°ÐºÐ°Ñ
+).
+
+HTMLImagePlugin.no_cache_images:ÐÐµ ÐŽÐµÐ»Ð°ÑÑ ÐºÑÑÐžÑÐŸÐ²Ð°ÐœÐžÑ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÐ¹ (ÑÐºÐ°Ð·Ð°ÑÑ URL ÐŸÑÐžÐ³ÐžÐœÐ°Ð»Ð°).
+
+HTMLImagePlugin.smallpage_threshold:ÐÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ ÐœÐ° ÑÑÑÐ°ÐœÐžÑÐ°Ñ
+, ÐŒÐµÐœÑÑÐžÑ
+ ÑÐµÐŒ ÑÑÐ° ( Ð² Ð±Ð°Ð¹ÑÐ°Ñ
+), Ð±ÑÐŽÑÑ ÐžÐŒÐµÑÑ ÐŽÐŸÐ±Ð°Ð²Ð»ÐµÐœÐœÑÐµ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÐµ ÑÑÑÐ°ÐœÐžÑÑ (ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµ, ÐºÐ»ÑÑÐµÐ²ÑÐµ ÑÐ»ÐŸÐ²Ð° Ðž Ñ.ÐŽ).
+
+HTMLImagePlugin.textrefs_threshold:ÐÐŸÑÐŸÐ³ ÐŽÐ»Ñ ÑÐµÐºÑÑÐŸÐ²ÑÑ
+ ÑÑÑÐ»ÐŸÐº. ÐÐŸÐ»ÐµÐµ ÐœÐžÐ·ÐºÐžÐµ Ð·ÐœÐ°ÑÐµÐœÐžÑ Ð¿ÐŸÐŽÑÐ°Ð·ÑÐŒÐµÐ²Ð°ÑÑ, ÑÑÐŸ Ð°Ð»Ð³ÐŸÑÐžÑÐŒ ÐŒÐµÐœÐµÐµ ÑÑÑÐŸÐ³.
+
+HTMLImagePlugin.thumb_size:ÐÐ°ÐºÑÐžÐŒÐ°Ð»ÑÐœÐŸÐµ ÑÐŒÐµÐœÑÑÐµÐœÐžÐµ ÑÐ°Ð·ÐŒÐµÑÐ° - Ðž ÑÐžÑÐžÐœÑ, Ðž Ð²ÑÑÐŸÑÑ.
+
+HTMLPlugin.assoc_files:ÐÐ±ÑÑÐœÐŸÐµ Perl Ð²ÑÑÐ°Ð¶ÐµÐœÐžÐµ ÑÐ°Ð¹Ð»Ð° ÑÐ°ÑÑÐžÑÐµÐœÐžÐ¹ ÐŽÐ»Ñ ÑÐ²ÑÐ·Ðž Ñ  html -ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°ÐŒÐž.
+
+HTMLPlugin.desc:Ð­ÑÐŸÑ Ð¿Ð»Ð°Ð³ÐžÐœ ÐŸÐ±ÑÐ°Ð±Ð°ÑÑÐ²Ð°ÐµÑ ÑÐ°Ð¹Ð»Ñ HTML
+
+HTMLPlugin.description_tags:Ð Ð°Ð·Ð±ÐžÐµÐœÐžÐµ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ° ÐœÐ° Ð¿ÐŸÐŽÑÐ°Ð·ÐŽÐµÐ»Ñ, Ð³ÐŽÐµ ÐžÐŒÐµÑÑÑÑ ÑÑÐ³Ðž <Ð Ð°Ð·ÐŽÐµÐ»>. ÐÐ±ÑÐ°ÑÐžÑÐµ Ð²ÐœÐžÐŒÐ°ÐœÐžÐµ, ÑÑÐŸ Ð¿ÑÐž ÑÑÑÐ°ÐœÐŸÐ²ÐºÐµ ÑÑÐŸÐ¹ ÐŸÐ¿ÑÐžÐž, ÐÑ ÐœÐµÑÐ²ÐœÐŸ ÑÑÑÐ°ÐœÐ°Ð²Ð»ÐžÐ²Ð°ÐµÑÐµ -no_metadata (ÐœÐžÐºÐ°ÐºÐžÑ
+ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+), Ð¿ÐŸÑÐºÐŸÐ»ÑÐºÑ Ð²ÑÐµ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÐµ ÐŽÐŸÐ»Ð¶ÐœÑ Ð±ÑÑÑ Ð²ÐºÐ»ÑÑÐµÐœÑ Ð² Ð¿ÑÐµÐŽÐµÐ»Ð°Ñ
+ ÑÑÐ³ÐŸÐ² <Ð Ð°Ð·ÐŽÐµÐ»>. ÐÑÐŸÐŒÐµ ÑÐŸÐ³ÐŸ '-keep_head' ÐœÐµ Ð±ÑÐŽÐµÑ ÐžÐŒÐµÑÑ ÐœÐžÐºÐ°ÐºÐŸÐ³ÐŸ ÐŽÐµÐ¹ÑÑÐ²ÐžÑ, ÐºÐŸÐ³ÐŽÐ° ÑÑÐ° ÐŸÐ¿ÑÐžÑ ÑÑÑÐ°ÐœÐŸÐ²Ð»ÐµÐœÐ°.
+
+HTMLPlugin.extract_style:ÐÐ·Ð²Ð»ÐµÑÑ ÐžÐœÑÐŸÑÐŒÐ°ÑÐžÑ ÐŸ ÑÑÐžÐ»ÑÑ
+ Ðž ÑÐºÑÐžÐ¿ÑÐŸÐ² ÐžÐ· ÑÐµÐ³Ð° HTML <head> Ðž ÑÐŸÑ
+ÑÐ°ÐœÐžÑÑ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÐµ ÐºÐ°Ðº DocumentHeader. Ð­ÑÐŸ Ð±ÑÐŽÐµÑ ÑÑÑÐ°ÐœÐŸÐ²Ð»ÐµÐœÐŸ ÐœÐ° ÑÑÑÐ°ÐœÐžÑÐµ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ° ÐŒÐ°ÐºÑÐŸÑÐŸÐŒ _document:documentheader_ macro.  
+
+HTMLPlugin.file_is_url:Ð£ÑÑÐ°ÐœÐŸÐ²ÐžÑÑ, ÐµÑÐ»Ðž Ð²Ñ
+ÐŸÐŽÐœÑÐµ ÐžÐŒÐµÐœÐ° ÑÐ°Ð¹Ð»ÐŸÐ² ÑÐŸÐŽÐµÑÐ¶Ð°Ñ URL Ð¿ÐµÑÐ²ÐŸÐœÐ°ÑÐ°Ð»ÑÐœÑÑ
+ ÐžÑÑ
+ÐŸÐŽÐœÑÑ
+ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ², ÐœÐ°Ð¿ÑÐžÐŒÐµÑ, ÐµÑÐ»Ðž ÑÑÐµÐŽÑÑÐ²Ð° Ð²ÐµÐ±-Ð·ÐµÑÐºÐ°Ð»Ð° ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°Ð»ÐžÑÑ ÐŽÐ»Ñ ÑÐŸÐ·ÐŽÐ°ÐœÐžÑ ÑÑÑÑÐºÑÑÑÑ ÐŽÐžÑÐµÐºÑÐŸÑÐžÐž ÐžÐŒÐ¿ÐŸÑÑÐ°.
+
+HTMLPlugin.hunt_creator_metadata:ÐÐ°Ð¹ÑÐž ÐœÐ°ÑÐºÐŸÐ»ÑÐºÐŸ Ð²ÐŸÐ·ÐŒÐŸÐ¶ÐœÐŸ Ð±ÐŸÐ»ÑÑÐµ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ Ð² Ð°Ð²ÑÐŸÑÑÑÐ²Ðµ Ðž ÑÐ°Ð·ÐŒÐµÑÑÐžÑÑ ÐžÑ
+ Ð² Ð¿ÐŸÐ»Ðµ 'CÐŸÐ·ÐŽÐ°ÑÐµÐ»Ñ'. Ð¢ÑÐµÐ±ÑÐµÑÑÑ ÑÑÑÐ°ÐœÐŸÐ²ÐºÐ° ÑÐ»Ð°Ð³Ð° ÐœÐ° -metadata_fields (ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÐµ Ð¿ÐŸÐ»ÐµÐ¹).
+
+HTMLPlugin.keep_head:ÐÐµ ÑÐŽÐ°Ð»ÑÑÑ Ð·Ð°Ð³ÐŸÐ»ÐŸÐ²ÐºÐž ÐžÐ· html-ÑÐ°Ð¹Ð»ÐŸÐ².
+
+HTMLPlugin.metadata_fields:ÐÐ°Ð¿ÑÑÐ°Ñ ÐŸÑÐŽÐµÐ»ÑÐµÑ ÑÐ¿ÐžÑÐŸÐº Ð¿ÐŸÐ»ÐµÐ¹ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+, ÑÑÐŸÐ±Ñ Ð¿ÐŸÐ¿ÑÑÐ°ÑÑÑÑ  ÐœÐ°ÑÐ°ÑÑ ÑÐºÑÑÑÐ°ÐºÑÐžÑ. ÐÑÐ¿ÐŸÐ»ÑÐ·ÑÐ¹ÑÐµ'ÑÑÐ³ <tagname>', ÑÑÐŸÐ±Ñ Ð¿ÐŸÐ»ÑÑÐžÑÑ ÑÐŸÐŽÐµÑÐ¶Ð°ÐœÐžÐµ Ð¿ÐµÑÐ²ÐŸÐ¹  Ð¿Ð°ÑÑ <tagname>, Ð²ÑÑÐ°Ð²Ð»ÐµÐœÐœÐŸÐ¹ Ð² ÑÐ»ÐµÐŒÐµÐœÑ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+, ÐœÐ°Ð·ÑÐ²Ð°ÐµÐŒÑÐ¹ 'tagname'. ÐÐ°ÐŒÐµÐœÐžÑÐµ Ð·ÐŽÐµÑÑ ÑÑÑÐŸÑÐœÑÐµ Ð±ÑÐºÐ²Ñ Ð·Ð°Ð³Ð»Ð°Ð²ÐœÑÐŒÐž, ÐµÑÐ»Ðž ÐÑ Ñ
+ÐŸÑÐžÑÐµ, ÑÑÐŸÐ±Ñ ÑÑÐž ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÐµ Ð±ÑÐ»Ðž Ð¿ÑÐµÐŽÑÑÐ°Ð²Ð»ÐµÐœÑ Ð² Greenstone Ð·Ð°Ð³Ð»Ð°Ð²ÐœÑÐŒÐž Ð±ÑÐºÐ²Ð°ÐŒÐž, ÑÐ°Ðº ÐºÐ°Ðº ÑÐºÑÑÑÐ°ÐºÑÐžÑ ÑÑÐ³ÐŸÐ² ÑÐ²Ð»ÑÐµÑÑÑ ÐŒÐ°Ð»ÐŸÑÑÐ²ÑÑÐ²ÐžÑÐµÐ»ÑÐœÑÐŒ ÐŽÐµÐ¹ÑÑÐ²ÐžÐµÐŒ.
+
+HTMLPlugin.no_metadata:ÐÐµ Ð¿ÑÑÐ°Ð¹ÑÐµÑÑ ÐžÐ·Ð²Ð»ÐµÐºÐ°ÑÑ Ð»ÑÐ±ÑÐµ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÐµ ÐžÐ· ÑÐ°Ð¹Ð»ÐŸÐ².
+
+HTMLPlugin.no_strip_metadata_html:Ð¡Ð¿ÐžÑÐŸÐº ÐœÐ°Ð·Ð²Ð°ÐœÐžÐ¹ ÐŒÐµÑÐ°-ÐŽÐ°ÐœÐœÑÑ
+, Ð¿ÐµÑÐµÑÐžÑÐ»ÐµÐœÐœÑÑ
+ ÑÐµÑÐµÐ· Ð·Ð°Ð¿ÑÑÑÑ, ÐžÐ»Ðž 'all' (Ð²ÑÐµ). ÐÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÑ Ñ -description_tags, ÑÑÐŸ Ð¿ÑÐµÐŽÐŸÑÐ²ÑÐ°ÑÐ°ÐµÑ ÑÐŽÐ°Ð»ÐµÐœÐžÐµ HTML ÑÐ°Ð³ÐŸÐ² ÐžÐ· Ð·ÐœÐ°ÑÐµÐœÐžÐ¹ ÐŒÐµÑÐ°-ÐŽÐ°ÐœÐœÑÑ
+.
+
+HTMLPlugin.nolinks:ÐÐµ ÐŽÐµÐ»Ð°Ð¹ÑÐµ ÐœÐžÐºÐ°ÐºÐžÑ
+ Ð¿ÐŸÐ¿ÑÑÐŸÐº  ÑÐ»Ð°Ð²Ð»ÐžÐ²Ð°ÑÑ Ð»ÐžÐœÐºÐž (ÑÑÑÐ°ÐœÐŸÐ²ÐºÐ° ÑÐ°ÐºÐŸÐ³ÐŸ ÑÐ»Ð°Ð³Ð° ÐŒÐŸÐ¶ÐµÑ ÑÐ»ÑÑÑÐžÑÑ ÑÐºÐŸÑÐŸÑÑÑ Ð¿ÐŸÑÑÑÐŸÐµÐœÐžÑ/ÐžÐŒÐ¿ÐŸÑÑÐžÑÐŸÐ²Ð°ÐœÐžÑ, ÐœÐŸ Ð»ÑÐ±ÑÐµ ÐŸÑÐœÐŸÑÐžÑÐµÐ»ÑÐœÑÐµ ÑÐ²ÑÐ·Ðž Ð² Ð¿ÑÐµÐŽÐµÐ»Ð°Ñ
+ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ² Ð±ÑÐŽÑÑ ÐœÐ°ÑÑÑÐµÐœÑ).
+
+HTMLPlugin.no_image_links:ÐÐµ ÐŽÐµÐ»Ð°Ð¹ÑÐµ ÐºÐ°ÐºÐžÐµ-Ð»ÐžÐ±ÐŸ Ð¿ÐŸÐ¿ÑÑÐºÐž ÑÐŽÐµÐ»Ð°ÑÑ ÑÑÑÐ»ÐºÐž ÐœÐ° ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ ÐŽÐ»Ñ ÐžÑ
+ Ð¿ÑÐŸÑÐŒÐŸÑÑÐ°.  
+
+HTMLPlugin.rename_assoc_files:ÐÐµÑÐµÐžÐŒÐµÐœÐŸÐ²ÑÐ²Ð°ÐµÑ ÑÐ°Ð¹Ð»Ñ, ÑÐ²ÑÐ·Ð°ÐœÐœÑÐµ Ñ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°ÐŒÐž (ÐœÐ°Ð¿ÑÐžÐŒÐµÑ, ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑÐŒÐž). Ð¢Ð°ÐºÐ¶Ðµ ÑÐŸÐ·ÐŽÐ°ÐµÑ ÐœÐ°ÐŒÐœÐŸÐ³ÐŸ Ð±ÐŸÐ»ÐµÐµ ÐŒÐµÐ»ÐºÑÑ ÑÑÑÑÐºÑÑÑÑ ÐŽÐžÑÐµÐºÑÐŸÑÐžÐž (Ð¿ÐŸÐ»ÐµÐ·ÐœÐŸ Ð¿ÑÐž ÑÐŸÐ·ÐŽÐ°ÐœÐžÐž ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐ¹, ÐºÐŸÑÐŸÑÑÐµ Ð±ÑÐŽÑÑ Ð¿ÐµÑÐµÐœÐµÑÐµÐœÑ ÐœÐ° CD-ROM).
+
+HTMLPlugin.sectionalise_using_h_tags:ÐÐ²ÑÐŸÐŒÐ°ÑÐžÑÐµÑÐºÐŸÐµ ÑÐŸÐ·ÐŽÐ°ÐœÐžÐµ ÑÐ°Ð·ÐŽÐµÐ»ÐµÐœÐžÐ¹ Ð² ÐŽÐŸÐºÑÐŒÐµÐœÑÐµ Ñ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÐœÐžÐµÐŒ ÑÐ°Ð³ÐŸÐ² h1, h2, ... hX.  
+
+HTMLPlugin.title_sub:ÐÑÑÐ°Ð¶ÐµÐœÐžÐµ Ð·Ð°ÐŒÐµÐœÑ ÐŽÐ»Ñ ÐžÐ·ÐŒÐµÐœÐµÐœÐžÑ ÑÑÑÐŸÐºÐž, Ñ
+ÑÐ°ÐœÑÑÐµÐ¹ÑÑ ÐºÐ°Ðº ÐÐ°Ð·Ð²Ð°ÐœÐžÐµ.ÐÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑÑÑ, ÐœÐ°Ð¿ÑÐžÐŒÐµÑ, Ð¿Ð»Ð°Ð³ÐžÐœÐŸÐŒ PDFPlug, ÑÑÐŸÐ±Ñ ÑÐŽÐ°Ð»ÐžÑÑ "Ð¡ÑÑÐ°ÐœÐžÑÑ 1 ", Ðž Ñ.ÐŽ ÐžÐ· ÑÐµÐºÑÑÐ°, ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÐŒÐŸÐ³ÐŸ ÐºÐ°Ðº ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµ.  
+
+HTMLPlugin.tidy_html:ÐÑÐ»Ðž ÑÑÑÐ°ÐœÐŸÐ²Ð»ÐµÐœÐŸ, Ð¿ÑÐµÐŸÐ±ÑÐ°Ð·ÑÐµÑ HTML-ÐŽÐŸÐºÑÐŒÐµÐœÑ Ð² Ñ
+ÐŸÑÐŸÑÐŸ ÑÑÐŸÑÐŒÐžÑÐŸÐ²Ð°ÐœÐœÑÐ¹ XHTML. Ð­ÑÐŸ Ð¿ÐŸÐ·Ð²ÐŸÐ»ÑÐµÑ Ð¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÐµÐ»ÑÐŒ Ð¿ÑÐŸÑÐŒÐ°ÑÑÐžÐ²Ð°ÑÑ ÐŽÐŸÐºÑÐŒÐµÐœÑÑ Ð² ÑÐŸÑÐŒÐ°ÑÐµ ÐºÐœÐžÐ³Ðž.  
+
+HTMLPlugin.old_style_HDL:ÐÐŸÐŒÐµÑÐºÐ° ÐŸ ÑÐŸÐŒ, Ð±ÑÐ» Ð»Ðž ÑÐ°Ð¹Ð» ÑÐ°Ð·Ð±ÐžÑ ÐœÐ° ÑÐµÐºÑÐžÐž, ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÑ ÑÑÐ°ÑÑÐ¹ ÑÑÐžÐ»Ñ ÑÐµÐºÑÐžÐ¹ HDL.  
+
+BaseMediaConverter.enable_cache:ÐÑÑ Ð°Ð²ÑÐŸÐŒÐ°ÑÐžÑÐµÑÐºÐž Ð³ÐµÐœÐµÑÐžÑÑÐµÑ ÑÐ°Ð¹Ð»Ñ (ÑÐ°ÐºÐžÐµ ÐºÐ°Ðº ÑÐŒÐµÐœÑÑÐµÐœÐœÑÐµ ÐºÐŸÐ¿ÐžÐž ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÐ¹ Ðž ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ ÑÐºÑÐ°ÐœÐœÐŸÐ³ÐŸ ÑÐ°Ð·ÐŒÐµÑÐ°) 
+ÐœÐµÑ ÐœÐµÐŸÐ±Ñ
+ÐŸÐŽÐžÐŒÐŸÑÑÐž ÐžÑ
+ ÑÐµÐ³ÐµÐœÐµÑÐžÑÐŸÐ²Ð°ÑÑ.  
+
+ImageConverter.converttotype:ÐÑÐµÐŸÐ±ÑÐ°Ð·ÐŸÐ²Ð°ÑÑ Ð³Ð»Ð°Ð²ÐœÐŸÐµ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÐµ Ðº ÑÐŸÑÐŒÐ°ÑÑ 's'
+
+ImageConverter.create_screenview:ÐÑÐ»Ðž ÐœÐ°Ð±ÐŸÑ Ð²ÐµÑÐµÐœ, ÑÐŸÐ·ÐŽÐ°Ð¹ÑÐµ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ ÑÐºÑÐ°ÐœÐœÐŸÐ³ÐŸ ÑÐ°Ð·ÐŒÐµÑÐ°, Ðž ÑÑÑÐ°ÐœÐŸÐ²ÐžÑÐµ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÐµ: Screen, ScreenType, screenicon, ScreenWidth Ðž ScreenHeight.  
+
+ImageConverter.create_thumbnail:ÐÑÐ»Ðž ÐœÐ°Ð±ÐŸÑ Ð²ÐµÑÐµÐœ, ÑÐŸÐ·ÐŽÐ°ÑÑÑÑ ÑÐŒÐµÐœÑÑÐµÐœÐœÑÐµ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ Ðž ÐŽÐŸÐ±Ð°Ð²Ð»ÑÑÑÑÑ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÐµ: Thumb, ThumbType, thumbicon, ThumbWidth, ThumbHeight.  
+ImageConverter.desc:Ð­ÑÐŸÑ Ð¿Ð»Ð°Ð³ÐžÐœ ÐŸÐ±ÑÐ°Ð±Ð°ÑÑÐ²Ð°ÐµÑ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ, ÐŽÐŸÐ±Ð°Ð²Ð»ÑÑ Ð±Ð°Ð·ÐŸÐ²ÑÐµ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÐµ
+
+ImageConverter.imagemagicknotinstalled:Ð¿ÑÐžÐ»ÐŸÐ¶ÐµÐœÐžÐµ Image Magick ÐœÐµ ÑÑÑÐ°ÐœÐŸÐ²Ð»ÐµÐœÐŸ  
+
+ImageConverter.minimumsize:ÐÐµ Ð¿ÑÐžÐœÐžÐŒÐ°ÑÑ Ð²ÐŸ Ð²ÐœÐžÐŒÐ°ÐœÐžÐµ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ, ÐŒÐµÐœÑÑÐžÐµ, ÑÐµÐŒ n Ð±Ð°Ð¹Ñ.
+
+ImageConverter.noconversionavailable:ÐÐŸÐœÐ²ÐµÑÑÐ°ÑÐžÑ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÐ¹ ÐœÐµÐŽÐŸÑÑÑÐ¿ÐœÐ°  
+
+ImageConverter.noscaleup:ÐÐµ ÑÐ²ÐµÐ»ÐžÑÐžÐ²Ð°ÑÑ ÐŒÐ°Ð»ÐµÐœÑÐºÐžÐµ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ Ð¿ÑÐž ÑÐŒÐµÐœÑÑÐµÐœÐžÑÑ
+.
+
+ImageConverter.screenviewsize:Ð¡ÐŸÐ·ÐŽÐ°Ð¹ÑÐµ ÑÐºÑÐ°ÐœÐœÑÐµ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ ÑÐ°Ð·ÐŒÐµÑÐ° nxn.
+
+ImageConverter.screenviewtype:Ð¡ÐŸÐ·ÐŽÐ°Ð¹ÑÐµ ÑÐºÑÐ°ÐœÐœÑÐµ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ Ð² ÑÐŸÑÐŒÐ°ÑÐµ 's'.
+
+ImageConverter.thumbnailsize:ÐÑÐ¿ÐŸÐ»ÐœÐžÑÑ ÑÐŒÐµÐœÑÑÐµÐœÐžÐµ ÑÐ°Ð·ÐŒÐµÑÐ° nxn.
+
+ImageConverter.thumbnailtype:ÐÑÐ¿ÐŸÐ»ÐœÐžÑÑ ÑÐŒÐµÐœÑÑÐµÐœÐžÐµ Ð² ÑÐŸÑÐŒÐ°ÑÐµ 's'.
+
+ImageConverter.win95notsupported:Image Magick ÐœÐµ Ð¿ÐŸÐŽÐŽÐµÑÐ¶ÐžÐ²Ð°ÐµÑÑÑ Ð² Win95/98  
+
+ImagePlugin.desc:Ð­ÑÐŸÑ Ð¿Ð»Ð°Ð³ÐžÐœ ÐŸÐ±ÑÐ°Ð±Ð°ÑÑÐ²Ð°ÐµÑ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ, ÐŽÐŸÐ±Ð°Ð²Ð»ÑÑ Ð±Ð°Ð·ÐŸÐ²ÑÐµ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÐµ
+
+IndexPlugin.desc:Ð­ÑÐŸÑ ÑÐµÐºÑÑÑÐžÐ²ÐœÑÐ¹ Ð¿Ð»Ð°Ð³ÐžÐœ ÐŸÐ±ÑÐ°Ð±Ð°ÑÑÐ²Ð°ÐµÑ ÑÐ°Ð¹Ð» index.txt. Ð€Ð°Ð¹Ð» index.txt ÐŽÐŸÐ»Ð¶ÐµÐœ ÑÐŸÐŽÐµÑÐ¶Ð°ÑÑ ÑÐ¿ÐžÑÐŸÐº ÑÐ°Ð¹Ð»ÐŸÐ², ÐºÐŸÑÐŸÑÑÐµ ÐŽÐŸÐ»Ð¶ÐœÑ Ð±ÑÑÑ Ð²ÐºÐ»ÑÑÐµÐœÑ Ð² ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ, ÑÐŸÐ¿ÑÐŸÐ²ÐŸÐ¶ÐŽÐ°ÐµÐŒÑÐ¹ Ð»ÑÐ±ÑÐŒÐž ÐŽÐŸÐ¿ÐŸÐ»ÐœÐžÑÐµÐ»ÑÐœÑÐŒÐž ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÐŒÐž, ÑÐ²ÑÐ·Ð°ÐœÐœÑÐŒÐž Ñ ÐºÐ°Ð¶ÐŽÑÐŒ ÑÐ°Ð¹Ð»ÐŸÐŒ \n\n Ð€Ð°Ð¹Ð» index.txt ÐŽÐŸÐ»Ð¶ÐµÐœ Ð±ÑÑÑ ÑÐŸÑÐŒÐ°ÑÐžÑÐŸÐ²Ð°Ðœ ÑÐ»ÐµÐŽÑÑÑÐžÐŒ ÐŸÐ±ÑÐ°Ð·ÐŸÐŒ: Ð¿ÐµÑÐ²Ð°Ñ ÑÑÑÐŸÐºÐ° ÐŒÐŸÐ¶ÐµÑ Ð±ÑÑÑ ÐºÐ»ÑÑÐŸÐŒ (ÐœÐ°ÑÐžÐœÐ°Ñ Ñ ÐºÐ»ÑÑÐ°:), ÑÑÐŸÐ±Ñ ÐœÐ°Ð·Ð²Ð°ÑÑ Ð¿ÐŸÐ»Ñ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ (ÐœÐ°Ð¿ÑÐžÐŒÐµÑ, ÐºÐ»ÑÑ: ÐÑÐµÐŽÐŒÐµÑ, ÐÑÐ³Ð°ÐœÐžÐ·Ð°ÑÐžÑ, ÐÐ°ÑÐ°). Ð¡Ð»ÐµÐŽÑÑÑÐžÐµ ÑÑÑÐŸÐºÐž Ð±ÑÐŽÑÑ ÑÐŸÐŽÐµÑÐ¶Ð°ÑÑ ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµ ÑÐ°Ð¹Ð»Ð°, Ð·Ð°ÑÐµÐŒ Ð·ÐœÐ°ÑÐµÐœÐžÐµ ÑÐµÑ
+ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ Ð²Ñ
+ÐŸÐŽÐ°, ÐºÐŸÑÐŸÑÑÐµ ÐŽÐŸÐ»Ð¶ÐœÑ Ð±ÑÑÑ ÑÑÑÐ°ÐœÐŸÐ²Ð»ÐµÐœÑ. (ÐœÐ°Ð¿ÑÐžÐŒÐµÑ, 'irma/iw097e 3.2 unesco 1993' ÑÐ²ÑÐ¶ÐµÑ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÐµ ÐÑÐµÐŽÐŒÐµÑ=3.2, ÐÑÐ³Ð°ÐœÐžÐ·Ð°ÑÐžÑ=unesco, Ðž ÐÐ°ÑÐ°=1993 Ñ ÑÐ°Ð¹Ð»ÐŸÐŒ irma/iw097e, ÐµÑÐ»Ðž Ð²ÑÑÐµÑÐ¿ÐŸÐŒÑÐœÑÑÐ°Ñ ÑÑÑÐŸÐºÐ° ÐºÐ»ÑÑÐ° ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÐœÐ°). \n\nÐÐ°ÐŒÐµÑÑÑÐµ, ÑÑÐŸ ÐµÑÐ»Ðž Ð»ÑÐ±ÐŸÐµ ÐžÐ· Ð¿ÐŸÐ»ÐµÐ¹ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑ Ð¿Ð»Ð°Ð³ÐžÐœ ÐžÐµÑÐ°ÑÑ
+ÐžÑÐµÑÐºÐŸÐ³ÐŸ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑÐ°, ÐºÐŸÐ³ÐŽÐ° ÐžÑ
+ Ð·ÐœÐ°ÑÐµÐœÐžÐµ ÑÑÑÐ°ÐœÐŸÐ²Ð»ÐµÐœÑ , ÐŸÐœ ÐŽÐŸÐ»Ð¶ÐµÐœ ÑÐŸÐŸÑÐ²ÐµÑÑÑÐ²ÐŸÐ²Ð°ÑÑ Ð¿ÐµÑÐ²ÐŸÐŒÑ Ð¿ÐŸÐ»Ñ (ÐŽÐµÑÐºÑÐžÐ¿ÑÐŸÑ) Ð² ÑÐŸÐŸÑÐ²ÐµÑÑÑÐ²ÑÑÑÐµÐŒ ÑÐ°Ð¹Ð»Ðµ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÐž. \n\nÐÐœÐ°ÑÐµÐœÐžÑ  ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ ÐŒÐŸÐ³ÑÑ Ð±ÑÑÑ ÐœÐ°Ð·Ð²Ð°ÐœÑ ÐŸÑÐŽÐµÐ»ÑÐœÐŸ, ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÑ ÑÑÐ³ (ÐœÐ°Ð¿ÑÐžÐŒÐµÑ,>ÐÑÐµÐŽÐŒÐµÑ<3.2) Ðž ÑÑÐŸ Ð·Ð°ÐŒÐµÐœÐžÑ Ð»ÑÐ±ÐŸÐµ ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµ, Ð¿ÑÐžÑÐ²ÐŸÐµÐœÐœÐŸÐµ ÐžÐŒ ÐºÐ»ÑÑÐµÐ²ÐŸÐ¹ ÑÑÑÐŸÐºÐŸÐ¹. ÐÑÐ»Ðž ÐºÐ»ÑÑÐµÐ²Ð°Ñ ÑÑÑÐŸÐºÐ° ÐŸÑÑÑÑÑÑÐ²ÑÐµÑ, Ð»ÑÐ±ÐŸÐµ ÐœÐµÐœÐ°Ð·Ð²Ð°ÐœÐœÐŸÐµ Ð·ÐœÐ°ÑÐµÐœÐžÐµ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ Ð±ÑÐŽÐµÑ ÐœÐ°Ð·Ð²Ð°ÐœÐŸ 'ÐÑÐµÐŽÐŒÐµÑ'.  
+
+ISISPlugin.desc:Ð­ÑÐŸÑ Ð¿Ð»Ð°Ð³ÐžÐœ ÐŸÐ±ÑÐ°Ð±Ð°ÑÑÐ²Ð°ÐµÑ Ð±Ð°Ð·Ñ ÐŽÐ°ÐœÐœÑÑ
+ CDS/ISIS. ÐÐ»Ñ ÐºÐ°Ð¶ÐŽÐŸÐ¹ ÑÐ°ÐºÐŸÐ¹ ÐŸÐ±ÑÐ°Ð±ÐŸÑÐ°ÐœÐœÐŸÐ¹ Ð±Ð°Ð·Ñ ÐŽÐ°ÐœÐœÑÑ
+ ÐŽÐŸÐ»Ð¶ÐœÑ ÑÑÑÐµÑÑÐ²ÐŸÐ²Ð°ÑÑ ÑÑÐž ÑÐ°Ð¹Ð»Ð° Ð² Ð¿Ð°Ð¿ÐºÐµ ÐžÐŒÐ¿ÐŸÑÑÐ° ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž: ÐŸÑÐœÐŸÐ²ÐœÐŸÐ¹ ÑÐ°Ð¹Ð» (.mst), ÑÐ°Ð±Ð»ÐžÑÐ° ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐžÑ Ð¿ÐŸÐ»ÐµÐ¹ (.fdt), Ðž ÑÐ°Ð¹Ð» Ð¿ÐµÑÐµÐºÑÐµÑÑÐœÑÑ
+ ÑÑÑÐ»ÐŸÐº (.xrf).
+
+ISISPlugin.subfield_separator:Ð¡ÑÑÐŸÐºÐ°, ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÐŒÐ°Ñ ÐŽÐ»Ñ ÐŸÑÐŽÐµÐ»ÐµÐœÐžÑ Ð¿ÐŸÐŽÐ¿ÐŸÐ»ÐµÐ¹  Ð² Ð·Ð°Ð¿ÐžÑÑÑ
+ Ð±Ð°Ð·Ñ ÐŽÐ°ÐœÐœÑÑ
+ CDS/ISIS.
+
+ISISPlugin.entry_separator:Ð¡ÑÑÐŸÐºÐ°, ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÐŒÐ°Ñ ÐŽÐ»Ñ ÐŸÑÐŽÐµÐ»ÐµÐœÐžÑ ÐŒÐœÐŸÐ¶ÐµÑÑÐ²ÐµÐœÐœÑÑ
+ Ð·ÐœÐ°ÑÐµÐœÐžÐ¹ ÐŽÐ»Ñ ÐŸÑÐŽÐµÐ»ÑÐœÑÑ
+ Ð¿ÐŸÐ»ÐµÐ¹ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ Ð² Ð·Ð°Ð¿ÐžÑÑÑ
+ Ð±Ð°Ð·Ñ ÐŽÐ°ÐœÐœÑÑ
+ CDS/ISIS.
+
+KeyphraseExtractor.desc:ÐÐ»Ð°Ð³ÐžÐœ Ð¿ÐŸÐŒÐŸÑÐž ÐŽÐ»Ñ ÑÐºÑÑÑÐ°ÐºÑÐŸÑÐ° ÐŽÐ»Ñ Ð³ÐµÐœÐµÑÐ°ÑÐžÐž ÐºÐ»ÑÑÐµÐ²ÑÑ
+ ÑÑÐ°Ð· ÐžÐ· ÑÐµÐºÑÑÐ°. ÐÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÐœÐ° ÑÐžÑÑÐµÐŒÐ° ÐžÐ·Ð²Ð»ÐµÑÐµÐœÐžÑ Kea.  
+
+KeyphraseExtractor.extract_keyphrases:ÐÐ·Ð²Ð»ÐµÑÑ ÐºÐ»ÑÑÐµÐ²ÑÐµ ÑÑÐ°Ð·Ñ  Ñ Ð¿ÐŸÐŒÐŸÑÑÑ Kea (ÐŸÐ¿ÑÐžÐž Ð¿ÐŸ ÑÐŒÐŸÐ»ÑÐ°ÐœÐžÑ)
+
+KeyphraseExtractor.extract_keyphrases_kea4:ÐÐ²ÑÐŸÐŒÐ°ÑÐžÑÐµÑÐºÐŸÐµ ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐžÐµ ÐºÐ»ÑÑÐµÐ²ÑÑ
+ ÑÐ»ÐŸÐ² Ñ Ð¿ÐŸÐŒÐŸÑÑÑ Kea 4.0 (Ñ Ð¿Ð°ÑÐ°ÐŒÐµÑÑÐ°ÐŒÐž Ð¿ÐŸ ÑÐŒÐŸÐ»ÑÐ°ÐœÐžÑ). Kea 4.0 - ÑÑÐŸ ÐœÐŸÐ²Ð°Ñ Ð²ÐµÑÑÐžÑ Kea, ÑÐ°Ð·ÑÐ°Ð±ÐŸÑÐ°ÐœÐ°Ñ ÐŽÐ»Ñ ÐºÐŸÐœÑÑÐŸÐ»ÐžÑÐŸÐ²Ð°ÐœÐœÐŸÐ³ÐŸ ÐžÐœÐŽÐµÐºÑÐžÑÐŸÐ²Ð°ÐœÐžÑ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ² Ð°Ð³ÑÐžÐºÑÐ»ÑÑÑÑÐœÐŸÐ¹ ÑÐµÐŒÐ°ÑÐžÐºÐž.  
+
+KeyphraseExtractor.extract_keyphrase_options:ÐÐ¿ÑÐžÐž ÐŽÐ»Ñ Ð°Ð²ÑÐŸÐŒÐ°ÑÐžÑÐµÑÐºÐŸÐ³ÐŸ ÐžÐ·Ð²Ð»ÐµÑÐµÐœÐžÑ ÐºÐ»ÑÑÐµÐ²ÑÑ
+ ÑÑÐ°Ð· Ñ Ð¿ÐŸÐŒÐŸÑÑÑ Kea. ÐÐ°Ð¿ÑÐžÐŒÐµÑ, mALIWEB - ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐ¹ ÐŒÐŸÐŽÐµÐ»Ñ ÐžÐ·Ð²Ð»ÐµÑÐµÐœÐžÑ ALIWEB; n5 - ÐžÐ·Ð²Ð»ÐµÐºÐ°Ð¹ Ð¿ÐŸ 5 ÐºÐ»ÑÑÐµÐ²ÑÑ
+ ÑÐ»ÐŸÐ² ÐžÐ· ÐºÐ°Ð¶ÐŽÐŸÐ³ÐŸ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°; eGBK - ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐ¹ ÐºÐŸÐŽÐžÑÐŸÐ²ÐºÑ GBK.
+
+KeyphraseExtractor.keyphrases:ÐÐ»ÑÑÐµÐ²ÑÐµ ÑÑÐ°Ð·Ñ
+
+KeyphraseExtractor.missing_kea:ÐÑÐžÐ±ÐºÐ°: ÐÐµ ÑÐŽÐ°Ð»ÐŸÑÑÑ ÐœÐ°Ð¹ÑÐž Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÑ Kea Ð² %s. ÐÐŸÐ¶Ð°Ð»ÑÐ¹ÑÑÐ°, ÑÐºÐ°ÑÐ°Ð¹ÑÐµ Kea %s Ñ http://www.nzdl.org/Kea Ðž ÑÑÑÐ°ÐœÐŸÐ²ÐžÑÐµ Ð² ÑÑÐŸÐ¹ ÐŽÐžÑÐµÐºÑÐŸÑÐžÐž.  
+
+LaTeXPlugin.desc:ÐÐ»Ð°Ð³ÐžÐœ ÐŽÐ»Ñ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ² LaTeX.
+
+LOMPlugin.desc:ÐÐ»Ð°Ð³ÐžÐœ ÐŽÐ»Ñ ÐžÐŒÐ¿ÐŸÑÑÐ° ÑÐ°Ð¹Ð»ÐŸÐ² LOM (Learning Object Metadata).  
+
+LOMPlugin.root_tag:DocType XML-ÑÐ°Ð¹Ð»Ð° (ÐžÐ»Ðž ÑÐµÐ³ÑÐ»ÑÑÐœÐŸÐµ Ð²ÑÑÐ°Ð¶ÐµÐœÐžÐµ, ÑÐºÐ°Ð·ÑÐ²Ð°ÑÑÐµÐµ ÐœÐ° ÐºÐŸÑÐœÐµÐ²ÐŸÐ¹ ÑÐ»ÐµÐŒÐµÐœÑ).  
+
+LOMPlugin.check_timestamp:ÐÑÐŸÐ²ÐµÑÐºÐ° Ð²ÑÐµÐŒÐµÐœÐœÑÑ
+ ÐŸÑÐŒÐµÑÐŸÐº ÑÐ°ÐœÐµÐµ Ð·Ð°Ð³ÑÑÐ¶ÐµÐœÐœÑÑ
+ ÑÐ°Ð¹Ð»ÐŸÐ², Ð±ÑÐŽÑÑ Ð·Ð°Ð³ÑÑÐ¶ÐµÐœÑ ÑÐŸÐ»ÑÐºÐŸ Ð±ÐŸÐ»ÐµÐµ ÐœÐŸÐ²ÑÐµ.  
+
+LOMPlugin.download_srcdocs:ÐÐ°Ð³ÑÑÐ·ÐžÑÑ ÐžÑÑ
+ÐŸÐŽÐœÑÐ¹ ÐŽÐŸÐºÑÐŒÐµÐœÑ, ÐµÑÐ»Ðž ÐŸÐœ ÑÐºÐ°Ð·Ð°Ðœ Ð² (general^identifier^entry or technical^location). Ð ÑÑÐŸÐ¹ ÐŸÐ¿ÑÐžÐž ÐœÑÐ¶ÐœÐŸ ÑÐºÐ°Ð·Ð°ÑÑ ÑÐµÐ³ÑÐ»ÑÑÐœÐŸÐµ Ð²ÑÑÐ°Ð¶ÐµÐœÐžÐµ ÐŽÐ»Ñ Ð·Ð°Ð³ÑÑÐ¶Ð°ÐµÐŒÑÑ
+ ÑÐ°Ð¹Ð»ÐŸÐ² Ð¿ÐµÑÐµÐŽ ÑÐŸÐ±ÑÑÐ²ÐµÐœÐœÐŸ Ð·Ð°Ð³ÑÑÐ·ÐºÐŸÐ¹. ÐÐ° Ð·Ð°ÐŒÐµÑÐºÑ: ÑÑÐŸ ÐœÐµ ÑÐ°Ð±ÐŸÑÐ°ÐµÑ, ÐµÑÐ»Ðž ÐžÑÑ
+ÐŸÐŽÐœÑÐ¹ ÐŽÐŸÐºÑÐŒÐµÐœÑ ÐœÐ°Ñ
+ÐŸÐŽÐžÑÑÑ Ð·Ð° ÑÐ°Ð¹ÐµÑÐ²ÐŸÐ»ÐŸÐŒ.  
+
+MARCPlugin.desc:ÐÑÐœÐŸÐ²ÐœÐŸÐ¹ Ð¿Ð»Ð°Ð³ÐžÐœ  MARC.
+
+MARCPlugin.metadata_mapping:ÐÐŒÑ ÑÐ°Ð¹Ð»Ð°, ÐºÐŸÑÐŸÑÐŸÐµ Ð²ÐºÐ»ÑÑÐ°ÐµÑ ÐŽÐµÑÐ°Ð»Ðž ÐŸÑÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ Ð·ÐœÐ°ÑÐµÐœÐžÐ¹ ÐžÐ· MARC Ð² ÐžÐŒÐµÐœÐ° ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ Greenstone. ÐÐŸ ÑÐŒÐŸÐ»ÑÐ°ÐœÐžÑ 'marc2dc.txt' ÐœÐ°Ñ
+ÐŸÐŽÐžÑÑÑ Ð²  ÐŽÐžÑÐµÐºÑÐŸÑÐžÐž ÑÐ°Ð¹ÑÐŸÐ².  
+
+MARCXMLPlugin.desc:ÐÐ»Ð°Ð³ÐžÐœ MARCXML.  
+
+MARCXMLPlugin.metadata_mapping_file:ÐÐŒÑ ÑÐ°Ð¹Ð»Ð°, ÐºÐŸÑÐŸÑÐŸÐµ Ð²ÐºÐ»ÑÑÐ°ÐµÑ ÐŸÑÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÐµ ÐŽÐµÑÐ°Ð»ÐµÐ¹ ÐžÐ· Ð·ÐœÐ°ÑÐµÐœÐžÐ¹ MARC Ð² ÐžÐŒÐµÐœÐ° ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ Greenstone. ÐÐŸ ÑÐŒÐŸÐ»ÑÐ°ÐœÐžÑ ÐžÑÐµÑÑÑ 'marcdoc.txt' Ð² etc ÐºÐ°ÑÐ°Ð»ÐŸÐ³Ðµ ÑÐ°Ð¹ÑÐ°.  
+
+MediaWikiPlugin.desc:ÐÐ»Ð°Ð³ÐžÐœ ÐŽÐ»Ñ ÐžÐŒÐ¿ÐŸÑÑÐ° Ð²ÐµÐ±-ÑÑÑÐ°ÐœÐžÑ MediaWiki.  
+
+MediaWikiPlugin.show_toc:ÐÐŸÐ±Ð°Ð²ÐžÑÑ Ð² ÑÑÑÐ°ÐœÐžÑÑ Â«Ð ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐžÂ» Â«ÐÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµÂ» Ñ Ð³Ð»Ð°Ð²ÐœÐŸÐ³ÐŸ ÑÐ°Ð¹ÑÐ° MediaWiki. ÐÐµÐŸÐ±Ñ
+ÐŸÐŽÐžÐŒÐŸ ÑÐºÐ°Ð·Ð°ÑÑ ÑÐµÐ³ÑÐ»ÑÑÐœÐŸÐµ Ð²ÑÑÐ°Ð¶ÐµÐœÐžÐµ Perl Ð² toc_exp ÐœÐžÐ¶Ðµ.  
+
+MediaWikiPlugin.delete_toc:Ð£ÐŽÐ°Ð»ÐžÑÑ ÑÐµÐºÑÐžÑ Â«ÐÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµÂ» ÐœÐ° ÐºÐ°Ð¶ÐŽÐŸÐ¹ HTML-ÑÑÑÐ°ÐœÐžÑÐµ. ÐÑÐ¶ÐœÐŸ ÑÐºÐ°Ð·Ð°ÑÑ ÑÐµÐ³ÑÐ»ÑÑÐœÐŸÐµ Ð²ÑÑÐ°Ð¶ÐµÐœÐžÐµ Perl Ð² toc_exp ÐœÐžÐ¶Ðµ.  
+
+MediaWikiPlugin.toc_exp:Ð ÐµÐ³ÑÐ»ÑÑÐœÐŸÐµ Ð²ÑÑÐ°Ð¶ÐµÐœÐžÐµ Perl ÐŽÐ»Ñ Â«ÐÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÑÂ». ÐÐœÐ°ÑÐµÐœÐžÐµ Ð¿ÐŸ ÑÐŒÐŸÐ»ÑÐ°ÐœÐžÑ Ð±ÑÐŽÐµÑ ÑÐŸÐŸÑÐ²ÐµÑÑÑÐ²ÐŸÐ²Ð°ÑÑ ÐŸÐ±ÑÑÐœÑÐŒ ÑÑÑÐ°ÐœÐžÑÐ°ÐŒ MediaWiki.  
+
+MediaWikiPlugin.delete_nav:Ð£ÐŽÐ°Ð»ÐžÑÑ ÑÐµÐºÑÐžÑ ÐœÐ°Ð²ÐžÐ³Ð°ÑÐžÐž. ÐÑÐ¶ÐœÐŸ ÑÐºÐ°Ð·Ð°ÑÑ ÑÐµÐ³ÑÐ»ÑÑÐœÐŸÐµ Ð²ÑÑÐ°Ð¶ÐµÐœÐžÐµ Perl Ð² nav_div_exp ÐœÐžÐ¶Ðµ.  
+
+MediaWikiPlugin.nav_div_exp:Ð ÐµÐ³ÑÐ»ÑÑÐœÐŸÐµ Ð²ÑÑÐ°Ð¶ÐµÐœÐžÐµ Perl ÐŽÐ»Ñ ÑÐµÐºÑÐžÐž ÐœÐ°Ð²ÐžÐ³Ð°ÑÐžÐž. ÐÐœÐ°ÑÐµÐœÐžÐµ Ð¿ÐŸ ÑÐŒÐŸÐ»ÑÐ°ÐœÐžÑ Ð±ÑÐŽÐµÑ ÑÐŸÐŸÑÐ²ÐµÑÑÑÐ²ÐŸÐ²Ð°ÑÑ ÐŸÐ±ÑÑÐœÑÐŒ ÑÑÑÐ°ÐœÐžÑÐ°ÐŒ MediaWiki.  
+
+MediaWikiPlugin.delete_searchbox:Ð£ÐŽÐ°Ð»ÐžÑÑ ÑÐµÐºÑÐžÑ Ð¿ÐŸÐžÑÐºÐŸÐ²ÐŸÐ³ÐŸ ÐŽÐžÐ°Ð»ÐŸÐ³Ð°. ÐÑÐ¶ÐœÐŸ ÑÐºÐ°Ð·Ð°ÑÑ ÑÐµÐ³ÑÐ»ÑÑÐœÐŸÐµ Ð²ÑÑÐ°Ð¶ÐµÐœÐžÐµ Perl Ð² searchbox_div_exp ÐœÐžÐ¶Ðµ.  
+
+MediaWikiPlugin.searchbox_div_exp:Ð ÐµÐ³ÑÐ»ÑÑÐœÐŸÐµ Ð²ÑÑÐ°Ð¶ÐµÐœÐžÐµ ÐœÐ° ÑÐ·ÑÐºÐµ Perl ÐŽÐ»Ñ Ð²Ð²ÐµÐŽÐµÐœÐžÑ Ð² ÐŸÐºÐœÐµ Ð¿ÐŸÐžÑÐºÐ°. ÐÐœÐ°ÑÐµÐœÐžÐµ Ð¿ÐŸ ÑÐŒÐŸÐ»ÑÐ°ÐœÐžÑ ÑÐŸÐŸÑÐ²ÐµÑÑÑÐ²ÑÐµÑ ÐŸÐ±ÑÐžÐŒ Ð²ÐµÐ±ÑÑÑÐ°ÐœÐžÑÐ°ÐŒ MediaWiki.  
+
+MediaWikiPlugin.remove_title_suffix_exp:Ð ÐµÐ³ÑÐ»ÑÑÐœÐŸÐµ Ð²ÑÑÐ°Ð¶ÐµÐœÐžÐµ Perl ÐŽÐ»Ñ ÐŸÐ±ÑÐµÐ·ÐºÐž ÐžÐ·Ð²Ð»ÐµÑÐµÐœÐœÐŸÐ³ÐŸ Ð·Ð°Ð³Ð»Ð°Ð²ÐžÑ. ÐÐ°Ð¿ÑÐžÐŒÐµÑ, \\s-(.+) ÐŸÐ±ÑÐµÐ¶ÐµÑ ÑÐŸÐŽÐµÑÐ¶ÐžÐŒÐŸÐµ Ð¿ÐŸÑÐ»Ðµ Â«-Â».  
+
+MetadataCSVPlugin.desc:ÐÐ»Ð°Ð³ÐžÐœ ÐŽÐ»Ñ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ Ð² ÑÐŸÑÐŒÐ°ÑÐµ Ð·ÐœÐ°ÑÐµÐœÐžÐ¹, ÑÐ°Ð·ÐŽÐµÐ»ÐµÐœÐœÑÑ
+ Ð·Ð°Ð¿ÑÑÐŸÐ¹. ÐÐŸÐ»Ðµ Filename Ð² ÑÐ°Ð¹Ð»Ðµ CSV ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑÑÑ ÐŽÐ»Ñ ÑÐŸÐ³ÐŸ, ÑÑÐŸÐ±Ñ ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐžÑÑ, ÐºÐ°ÐºÐŸÐŒÑ ÐŽÐŸÐºÑÐŒÐµÐœÑÑ Ð¿ÑÐžÐœÐ°ÐŽÐ»ÐµÐ¶Ð°Ñ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÐµ.  
+
+MetadataPass.desc:ÐÐŸÐ¿ÐŸÐ»ÐœÐžÑÐµÐ»ÑÐœÑÐ¹ ÐºÐ»Ð°ÑÑ Ðº BasPlug, ÐºÐŸÑÐŸÑÑÐ¹ Ð¿ÐŸÐŽÐŽÐµÑÐ¶ÐžÐ²Ð°ÐµÑ Ð¿Ð°ÑÐ°ÐŒÐµÑÑ Ð¿Ð»Ð°Ð³ÐžÐœÐ° ÐŒÐµÑÐ°-ÐŽÐ°ÐœÐœÑÑ
+ metadata_read Ð² import.pl  
+
+MetadataXMLPlugin.desc:ÐÐ»Ð°Ð³ÐžÐœ ÐºÐŸÑÐŸÑÑÐ¹ ÐŸÐ±ÑÐ°Ð±Ð°ÑÑÐ²Ð°ÐµÑ ÑÐ°Ð¹Ð» metadata.xml.  
+
+MetadataEXIFPlugin.desc:ÐÐ»Ð°Ð³ÐžÐœ ÐŽÐ»Ñ ÐžÐ·Ð²Ð»ÐµÑÐµÐœÐžÑ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÐŸÐ³ÐŸ EXIF ÐžÐ· ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÐ¹, Ð°ÑÐŽÐžÐŸ Ðž Ð²ÐžÐŽÐµÐŸ. ÐÐŸÐ»ÐµÐµ ÐºÐŸÐœÐºÑÐµÑÐœÐŸ ÐŸÐœ, ÐŸÑÐœÐŸÐ²Ð°ÐœÐœ ÐœÐ° CPAN ÐŒÐŸÐŽÑÐ»Ðµ 'ExifTool ". ÐÐ° ÑÐ°ÐŒÐŸÐŒ ÐŽÐµÐ»Ðµ Ð¿ÐŸÐŽÐŽÐµÑÐ¶ÐžÐ²Ð°ÐµÑ Ð±ÐŸÐ»ÑÑÐµ ÑÐŸÑÐŒÐ°ÑÐŸÐ², ÐœÐ°Ð¿ÑÐžÐŒÐµÑ GPS, XMP, FlashPix, ID3, Vorbis. ÐÐ»Ð°Ð³ÐžÐœ Ð²ÑÐžÐ³ÑÑÐ²Ð°ÐµÑ ÐŸÑ ÑÑÐŸÐ³ÐŸ, Ðž Ð±ÑÐ» ÑÐ°Ð·ÑÐ°Ð±ÐŸÑÐ°Ðœ ÐŽÐ»Ñ Ð¿ÐŸÐŽÐŽÐµÑÐ¶ÐºÐž Ð²ÑÐµÑ
+ ÑÐŸÑÐŒÐ°ÑÐŸÐ² Ð¿ÐŸÐŽÐŽÐµÑÐ¶ÐžÐ²Ð°ÑÑÐžÑ
+ ExifTool-ÐŸÐŒ. Ð¡ÐŒ.  ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°ÑÐžÑ ExifTool Ð¿ÐŸ Ð¿ÐŸÐŽÐŽÐµÑÐ¶ÐžÐ²Ð°ÐµÐŒÑÐŒ ÑÐžÐ¿Ð°ÐŒ ÑÐ°Ð¹Ð»ÐŸÐ² Ðž ÑÑ
+ÐµÐŒ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+.  
+
+GreenstoneMETSPlugin.desc:ÐÐ±ÑÐ°Ð±ÐŸÑÐ°ÑÑ METS-ÐŽÐŸÐºÑÐŒÐµÐœÑÑ ÐºÐ°Ðº ÐÑÐžÐœÑÑÐŸÑÐœ  
+
+MP3Plugin.desc:ÐÐ»Ð°Ð³ÐžÐœ ÐŽÐ»Ñ ÐŸÐ±ÑÐ°Ð±ÐŸÑÐºÐž MP3 ÑÐ°Ð¹Ð»ÐŸÐ².
+
+MP3Plugin.assoc_images:ÐÑÐ¿ÐŸÐ»ÑÐ·ÑÐ¹ÑÐµ Ð¿ÐŸÐžÑÐº ÐºÐ°ÑÑÐžÐœÐŸÐº Ð² Google, ÑÑÐŸÐ±Ñ ÐœÐ°Ð¹ÑÐž ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ Ð¿ÐŸÐŽÑ
+ÐŸÐŽÑÑÐµÐµ Ðº ÑÐ°Ð¹Ð»Ñ MP3, ÐœÐ° ÐŸÑÐœÐŸÐ²Ðµ ÐµÐ³ÐŸ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ ÐÐ°Ð·Ð²Ð°ÐœÐžÐµ ID3 Title Ðž ÐÑÐ¿ÐŸÐ»ÐœÐžÑÐµÐ»Ñ.  
+
+MP3Plugin.applet_metadata:ÐÑÐ¿ÐŸÐ»ÑÐ·Ð°Ð²Ð°ÐœÐœÐŸ ÐŽÐ»Ñ ÑÐŸÐ³ÐŸ, ÑÑÐŸÐ±Ñ Ñ
+ÑÐ°ÐœÐžÑÑ ÐŒÐµÑÐ°-ÐŽÐ°ÐœÐœÑÐµ [applet] ÐŽÐ»Ñ ÐºÐ°Ð¶ÐŽÐŸÐ³ÐŸ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°, Ð² ÐºÐŸÑÐŸÑÐŸÐŒ ÑÐŸÐŽÐµÑÐ¶ÐžÑÑÑ ÐºÐŸÐŽ HTML ÐŽÐ»Ñ Ð¿ÑÐŸÐžÐ³ÑÑÐ²Ð°ÐœÐžÑ ÑÑÐŸÐ³ÐŸ ÑÐ°Ð¹Ð»Ð° Ð² MP3 Ð¿ÑÐŸÐžÐ³ÑÑÐ²Ð°ÑÐµÐ»Ðµ.  
+
+MP3Plugin.metadata_fields:Ð¡Ð¿ÐžÑÐŸÐº Ð¿ÐŸÐ»ÐµÐ¹ ÐŒÐµÑÐ°-ÐŽÐ°ÐœÐœÑÑ
+, Ð¿ÐµÑÐµÑÐžÑÐ»ÐµÐœÐœÑÑ
+ ÑÐµÑÐµÐ· Ð·Ð°Ð¿ÑÑÑÑ, ÐºÐŸÑÐŸÑÑÐµ Ð¿ÑÐµÐŽÐœÐ°Ð·ÐœÐ°ÑÐµÐœÑ ÐŽÐ»Ñ ÐžÐ·Ð²Ð»ÐµÑÐµÐœÐžÑ ÐžÐ· MP3 ÑÐ°Ð¹Ð»Ð° (ÐµÑÐ»Ðž ÐŽÐŸÑÑÑÐ¿ÐµÐœ). ÐÑÐ¿ÐŸÐ»ÑÐ·ÑÐ¹ÑÐµ \"*\" ÐŽÐ»Ñ ÐžÐ·Ð²Ð»ÐµÑÐµÐœÐžÑ Ð²ÑÐµÑ
+ Ð¿ÐŸÐ»ÐµÐ¹.
+
+NulPlugin.desc:Ð¥ÐŸÐ»ÐŸÑÑÐŸÐµ Ð·ÐœÐ°ÑÐµÐœÐžÐµ Ð¿Ð»Ð°Ð³ÐžÐœÐ° ÐŽÐ»Ñ ÑÐ°Ð¹Ð»Ð° (.nul). ÐÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑÑÑ Ñ ÑÐ°Ð¹Ð»Ð°ÐŒÐž, ÑÐŸÐ·ÐŽÐ°ÐœÐœÑÐŒÐž Ð¿ÑÐž ÑÐ°ÑÑÐžÑÐµÐœÐžÐž Ð±Ð°Ð·Ñ ÐŽÐ°ÐœÐœÑÐ¹ ÐŒÐµÑÐ°-ÐŽÐ°ÐœÐœÑÐŒÐž ÑÐ°Ð¹Ð»ÐŸÐ².
+
+NulPlugin.assoc_field:ÐÐ°Ð·Ð²Ð°ÐœÐžÑ Ð¿ÐŸÐ»Ñ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+, ÐºÐŸÑÐŸÑÐŸÐµ Ð±ÑÐŽÐµÑ Ð¿ÑÐžÑÐ²ÐŸÐµÐœÐŸ ÐºÐ°Ð¶ÐŽÐŸÐŒÑ ÑÐ°Ð¹Ð»Ñ nul.  
+NulPlugin.add_metadata_as_text:ÐÐŸÐ±Ð°Ð²ÐžÑÑ ÑÐ°Ð±Ð»ÐžÑÑ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ ÐºÐ°Ðº ÑÐµÐºÑÑ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°, Ð° ÐœÐµ ÐºÐ°Ðº Â«Ð­ÑÐŸÑ ÐŽÐŸÐºÑÐŒÐµÐœÑ ÐœÐµ ÑÐŸÐŽÐµÑÐ¶ÐžÑ ÑÐµÐºÑÑÐ°Â».  
+
+NulPlugin.remove_namespace_for_text:Ð£ÐŽÐ°Ð»ÐžÑÑ Ð¿ÑÐŸÐ±ÐµÐ»Ñ ÐžÐ· ÐžÐŒÐµÐœ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ Ð² ÑÐµÐºÑÑÐµ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ° (ÐµÑÐ»Ðž ÑÑÑÐ°ÐœÐŸÐ²Ð»ÐµÐœÐŸ add_metadata_as_text).  
+
+OAIPlugin.desc:ÐÑÐœÐŸÐ²ÐœÐŸÐ¹ Ð¿Ð»Ð°Ð³ÐžÐœ ÐžÑÑ
+ÐŸÐŽÐœÑÑ
+ ÐŸÑÐºÑÑÑÑÑ
+ Ð°ÑÑ
+ÐžÐ²ÐŸÐ² (OAI).  
+
+OAIPlugin.document_field:Ð­Ð»ÐµÐŒÐµÐœÑ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ Ñ ÑÐºÐ°Ð·Ð°ÐœÐžÐµÐŒ ÐžÐŒÐµÐœÐž ÑÐ°Ð¹Ð»Ð° ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ² Ñ Ð¿ÐŸÐŽÐºÐ»ÑÑÐµÐœÐœÑÐŒÐž Ðº ÐœÐžÐŒ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÐŒÐž.  
+
+OAIPlugin.metadata_set:ÐÐ°Ð±ÐŸÑ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ (ÐžÐŒ Ñ Ð¿ÑÐµÑÐžÐºÑÐŸÐŒ) ÐŽÐ»Ñ ÐžÐŒÐ¿ÐŸÑÑÐžÑÐŸÐ²Ð°ÐœÐžÑ Ð²ÑÐµÑ
+ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ ÐºÐ°Ðº  
+OAIPlugin.metadata_set.auto:ÐÑÐ¿ÐŸÐ»ÑÐ·ÑÐ¹ÑÐµ Ð¿ÑÐµÑÐžÐºÑÑ ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐœÑÐµ Ð² Ð·Ð°Ð¿ÐžÑÑÑ
+ 
+ÐžÐœÐžÑÐžÐ°ÑÐžÐ²Ñ "ÐÑÐºÑÑÑÑÐµ Ð°ÑÑ
+ÐžÐ²Ñ" (OAI)  
+OAIPlugin.metadata_set.dc:ÐÑÐ¿ÐŸÐ»ÑÐ·ÑÐ¹ÑÐµ Ð¿ÑÐµÑÐžÐºÑ dc.   
+
+OggVorbisPlugin.add_technical_metadata:ÐÐŸÐ±Ð°Ð²ÐžÑÑ ÑÐµÑ
+ÐœÐžÑÐµÑÐºÐžÐµ ÐŒÐµÑÐ°-ÐŽÐ°ÐœÐœÑÐµ (ÐœÐ°Ð¿ÑÐžÐŒÐµÑ, ÑÐºÐŸÑÐŸÑÑÑ Ð¿ÐµÑÐµÐŽÐ°ÑÐž).
+
+OggVorbisPlugin.desc:ÐÐ»Ð°Ð³ÐžÐœ ÐŽÐ»Ñ ÐžÐŒÐ¿ÐŸÑÑÐžÑÐŸÐ²Ð°ÐœÐžÑ Ð·Ð²ÑÐºÐŸÐ²ÑÑ
+ ÑÐ°Ð¹Ð»ÐŸÐ² Ogg Vorbis.
+
+OpenDocumentPlugin.desc:ÐÐ»Ð°Ð³ÐžÐœ ÐŽÐ»Ñ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ² ÑÐŸÑÐŒÐ°ÑÐ° OASIS OpenDocument (ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÐŒÑÑ
+ Ð² OpenOffice 2.0)  
+
+PagedImagePlugin.desc:ÐÐ»Ð°Ð³ÐžÐœ ÐŽÐ»Ñ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ², ÑÐŸÑÑÐ°Ð²Ð»ÐµÐœÐœÑÑ
+ ÐžÐ· Ð¿ÐŸÑÐ»ÐµÐŽÐŸÐ²Ð°ÑÐµÐ»ÑÐœÐŸÑÑÐž ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÐ¹, Ñ ÐœÐµÐŸÐ±ÑÐ·Ð°ÑÐµÐ»ÑÐœÑÐŒ ÑÐ°ÑÐ¿ÐŸÐ·ÐœÐ°ÐœÐœÑÐŒ ÑÐµÐºÑÑÐŸÐŒ Ðº ÐºÐ°Ð¶ÐŽÐŸÐŒÑ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ.
+
+PagedImagePlugin.documenttype:Ð£ÑÑÐ°ÐœÐŸÐ²ÐžÑÐµ ÑÐžÐ¿ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ° (ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑÑÑ ÐŽÐ»Ñ Ð¿ÑÐŸÑÐŒÐŸÑÑÐ°).
+
+PagedImagePlugin.documenttype.paged:Ð¡ÑÑÐ°ÐœÐžÑÐœÑÐµ ÐŽÐŸÐºÑÐŒÐµÐœÑÑ ÑÐŸÐŽÐµÑÐ¶Ð°Ñ ÑÑÑÐµÐ»ÐºÐž 'Ð¡Ð»ÐµÐŽÑÑÑÐ°Ñ' Ðž 'ÐÑÐµÐŽÑÐŽÑÑÐ°Ñ' Ðž ÐºÐœÐŸÐ¿ÐºÑ 'ÐÐµÑÐµÐ¹ÑÐž Ðº ÑÑÑÐ°ÐœÐžÑÐµ X'.
+
+PagedImagePlugin.documenttype.hierarchy:ÐÐµÑÐ°ÑÑ
+ÐžÑÐµÑÐºÐžÐµ ÐŽÐŸÐºÑÐŒÐµÐœÑÑ ÑÐŸÐŽÐµÑÐ¶Ð°Ñ ÐŸÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ.
+
+PagedImagePlugin.headerpage:ÐÐŸÐ±Ð°Ð²ÐžÑÑ ÐŽÐ»Ñ ÐºÐ°Ð¶ÐŽÐŸÐ³ÐŸ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ° Ð·Ð°Ð³Ð»Ð°Ð²ÐœÑÑ ÑÑÑÐ°ÐœÐžÑÐºÑ (Ð±ÐµÐ· ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ).
+
+PDFPlugin.allowimagesonly:Ð Ð°Ð·ÑÐµÑÐžÑÑ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÐœÐžÐµ ÑÐ°Ð¹Ð»ÐŸÐ² PDF, Ð² ÐºÐŸÑÐŸÑÑÑ
+ ÐœÐµÑ ÐžÐ·Ð²Ð»ÐµÐºÐ°ÐµÐŒÐŸÐ³ÐŸ ÑÐµÐºÑÑÐ°. Ð¡ÐœÐžÐŒÐ°ÐµÑ ÐœÐµÐŸÐ±Ñ
+ÐŸÐŽÐžÐŒÐŸÑÑÑ ÐºÐ»Ð°ÑÑÐ° -complex. ÐÐŸÐ»ÐµÐ·ÐœÐŸ ÑÐŸÐ»ÑÐºÐŸ Ñ convert_to html.  
+
+PDFPlugin.complex:Ð¡ÐŸÐ·ÐŽÐ°ÐµÑ Ð±ÐŸÐ»ÐµÐµ ÑÐ»ÐŸÐ¶ÐœÑÑ Ð¿ÑÐŸÐŽÑÐºÑÐžÑ. Ð¡ ÑÑÐŸÐ¹ ÐŸÐ¿ÑÐžÐµÐ¹ ÑÑÑÐ°ÐœÐŸÐ²ÐŸÐº Ð¿ÑÐŸÐŽÑÐºÑÐžÑ Ð² ÑÐŸÑÐŒÐ°ÑÐµ HTML Ð±ÑÐŽÐµÑ Ð²ÑÐ³Ð»ÑÐŽÐµÑÑ Ð·ÐœÐ°ÑÐžÑÐµÐ»ÑÐœÐŸ Ð±ÐŸÐ»ÐµÐµ Ð¿ÐŸÑ
+ÐŸÐ¶ÐµÐ¹ ÐœÐ° ÐŸÑÐžÐ³ÐžÐœÐ°Ð»ÑÐœÑÐ¹ PDF-ÑÐ°Ð¹Ð». ÐÐ»Ñ ÑÐŸÐ³ÐŸ, ÑÑÐŸÐ±Ñ ÑÑÐœÐºÑÐžÐŸÐœÐžÑÐŸÐ²Ð°ÑÑ ÐŽÐŸÐ»Ð¶ÐœÑÐŒ ÐŸÐ±ÑÐ°Ð·ÐŸÐŒ ÑÑÑÐ°ÐœÐŸÐ²Ð»ÐµÐœ Ghostscript (ÐŽÐ»Ñ *nix gs ÐŽÐŸÐ»Ð¶ÐµÐœ Ð±ÑÑÑ ÐœÐ° Ð²Ð°ÑÐµÐŒ Ð¿ÑÑÐž ÐŽÐŸÑÑÑÐ¿Ð°, Ð² ÑÐŸ Ð²ÑÐµÐŒÑ ÐºÐ°Ðº ÐŽÐ»Ñ Windows Ñ ÐÐ°Ñ ÐŽÐŸÐ»Ð¶ÐµÐœ Ð±ÑÑÑ gswin32c.exe ÐœÐ° Ð¿ÑÑÐž ÐŽÐŸÑÑÑÐ¿Ð°).
+
+PDFPlugin.desc:ÐÑÐžÐµÐŒÐ»ÐµÐŒÑÐ¹ Ð¿Ð»Ð°Ð³ÐžÐœ with-it pdf.
+
+PDFPlugin.nohidden:ÐÑÐµÐ¿ÑÑÑÑÐ²ÑÐµÑ Ð¿ÐŸÐ¿ÑÑÐºÐ°ÐŒ pdftohtml ÐžÐ·Ð²Ð»ÐµÑÑ ÑÐºÑÑÑÑÐ¹ ÑÐµÐºÑÑ. Ð­ÑÐŸ Ð¿ÐŸÐ»ÐµÐ·ÐœÐŸ ÑÐŸÐ»ÑÐºÐŸ, ÐµÑÐ»Ðž ÐŸÐ¿ÑÐžÑ  -complex ÑÐ°ÐºÐ¶Ðµ ÑÑÑÐ°ÐœÐŸÐ²Ð»ÐµÐœÐ°.
+
+PDFPlugin.noimages:ÐÐµ Ð¿ÑÑÐ°Ð¹ÑÐµÑÑ ÐžÐ·Ð²Ð»ÐµÐºÐ°ÑÑ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ ÐžÐ· PDF.
+
+PDFPlugin.use_sections:Ð¡ÐŸÐ·ÐŽÐ°ÑÑ ÐŸÑÐŽÐµÐ»ÑÐœÑÐ¹ ÑÐ°Ð·ÐŽÐµÐ» ÐŽÐ»Ñ ÐºÐ°Ð¶ÐŽÐŸÐ¹ ÑÑÑÐ°ÐœÐžÑÑ PDF-ÑÐ°Ð¹Ð»Ð°.
+
+PDFPlugin.zoom:Ð€Ð°ÐºÑÐŸÑ, c Ð¿ÐŸÐŒÐŸÑÑÑ ÐºÐŸÑÐŸÑÐŸÐ³ÐŸ ÐžÐ·ÐŒÐµÐœÑÐµÑÑÑ ÐŒÐ°ÑÑÑÐ°Ð± ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ PDF (ÑÑÐŸ Ð¿ÐŸÐ»ÐµÐ·ÐœÐŸ ÑÐŸÐ»ÑÐºÐŸ, ÐµÑÐ»Ðž   ÑÑÑÐ°ÐœÐŸÐ²Ð»ÐµÐœ -complex).
+
+PostScriptPlugin.desc:Ð­ÑÐŸ - Ð¿ÐŸÑÑÑÐºÑÐžÐ¿ÑÑÐŒ \"Ð±ÐµÐŽÐœÑÐµ Ð»ÑÐŽÐž\" ÐŽÐ»Ñ ÑÐµÐºÑÑÐŸÐ²ÐŸÐ³ÐŸ ÐºÐŸÐœÐ²ÐµÑÑÐµÑÐ°.. ÐÑÐ»Ðž ÑÐµÑÑÐµÐ·ÐœÐŸ, ÑÐ°ÑÑÐŒÐŸÑÑÐžÑÐµ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÐœÐžÐµ Ð¿Ð°ÐºÐµÑÐ° PRESCRIPT, ÐºÐŸÑÐŸÑÑÐ¹ ÐŽÐŸÑÑÑÐ¿ÐµÐœ ÐŽÐ»Ñ Ð·Ð°Ð³ÑÑÐ·ÐºÐž Ñ http://www.nzdl.org/html/software.html
+
+PostScriptPlugin.extract_date:ÐÐ·Ð²Ð»ÐµÑÐµÐœÐžÐµ ÐŽÐ°ÑÑ ÐžÐ· Ð·Ð°Ð³ÐŸÐ»ÐŸÐ²ÐºÐ° PS.
+
+PostScriptPlugin.extract_pages:ÐÐ·Ð²Ð»ÐµÑÐµÐœÐžÐµ ÑÑÑÐ°ÐœÐžÑ ÐžÐ· Ð·Ð°Ð³ÐŸÐ»ÐŸÐ²ÐºÐ° PS.
+
+PostScriptPlugin.extract_title:ÐÐ·Ð²Ð»ÐµÑÐµÐœÐžÐµ ÐœÐ°Ð·Ð²Ð°ÐœÐžÑ ÐžÐ· Ð·Ð°Ð³ÐŸÐ»ÐŸÐ²ÐºÐ° PS.
+
+PowerPointPlugin.desc:ÐÐ»Ð°Ð³ÐžÐœ ÐŽÐ»Ñ ÐžÐŒÐ¿ÐŸÑÑÐ° ÑÐ°Ð¹Ð»ÐŸÐ² Microsoft PowerPoint.
+
+PowerPointPlugin.windows_scripting:ÐÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÑ ÑÐµÑ
+ÐœÐŸÐ»ÐŸÐ³ÐžÑ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐžÑÐŸÐ²Ð°ÐœÐžÑ MicroSoft Windows (Visual Basic ÐŽÐ»Ñ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒ), ÑÑÐŸÐ±Ñ ÑÐºÐŸÐœÐ²ÐµÑÑÐžÑÐŸÐ²Ð°ÑÑ ÐŽÐŸÐºÑÐŒÐµÐœÑÑ PPT Ð² ÑÐµÑÐžÑ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÐ¹ ÑÐ°Ð·Ð»ÐžÑÐœÐŸÐ³ÐŸ ÑÐžÐ¿Ð° (ÐœÐ°Ð¿ÑÐžÐŒÐµÑ, JPEG,PNG,GIF), Ð²ÐŒÐµÑÑÐŸ Ð¿Ð°ÐºÐµÑÐ° open source ppttohtml.  
+
+PrintInfo.bad_general_option:ÐÐ»Ð°Ð³ÐžÐœ %s ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑ ÐœÐµÐºÐŸÑÑÐµÐºÑÐœÑÑ ÐŸÐ±ÑÑÑ ÐŸÐ¿ÑÐžÑ (ÐŸÐ±ÑÐžÐµ ÐŸÐ¿ÑÐžÐž -  ÑÑÐŸ ÑÐµ, ÐºÐŸÑÐŸÑÑÐµ ÐŽÐŸÑÑÑÐ¿ÐœÑ Ð²ÑÐµÐŒ Ð¿Ð»Ð°Ð³ÐžÐœÐ°ÐŒ). ÐÑÐŸÐ²ÐµÑÑÑÐµ Ð²Ð°Ñ ÐºÐŸÐœÑÐžÐ³ÑÑÐ°ÑÐžÐŸÐœÐœÑÐ¹ ÑÐ°Ð¹Ð» collect.cfg.
+
+PrintInfo.desc:Ð Ð±ÐŸÐ»ÑÑÐžÐœÑÑÐ²Ðµ Ð¿Ð»Ð°Ð³ÐžÐœ, ÐžÐŒÐµÐµÑ ÐŽÐµÐ»ÐŸ Ñ ÐžÐœÑÐŸÑÐŒÐ°ÑÐžÐµÐ¹ ÐŸ Ð¿ÐµÑÐ°ÑÐž  (pluginfo.pl) Ðž Ð°ÐœÐ°Ð»ÐžÐ·ÐžÑÑÐµÑ Ð°ÑÐ³ÑÐŒÐµÐœÑÑ pluginfo.pl.  
+
+ProCitePlugin.desc:ÐÐ»Ð°Ð³ÐžÐœ ÐŽÐ»Ñ (ÑÐºÑÐ¿ÐŸÑÑÐžÑÐŸÐ²Ð°ÐœÐœÑÑ
+) Ð±Ð°Ð· ÐŽÐ°ÐœÐœÑÑ
+ ProCite  
+
+ProCitePlugin.entry_separator:Ð¡ÑÑÐŸÐºÐ° ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑÑÑ ÐŽÐ»Ñ ÑÐ°Ð·ÐŽÐµÐ»ÐµÐœÐžÑ ÐœÐµÑÐºÐŸÐ»ÑÐºÐžÑ
+ Ð·ÐœÐ°ÑÐµÐœÐžÐ¹ ÐŸÑÐŽÐµÐ»ÑÐœÑÑ
+ Ð¿ÐŸÐ»ÐµÐ¹ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ ÐŽÐ»Ñ Ð·Ð°Ð¿ÐžÑÐµÐ¹ Ð² Ð±Ð°Ð·Ðµ ÐŽÐ°ÐœÐœÑÑ
+ ProCite.  
+
+ReadTextFile.could_not_extract_encoding:ÐÐ ÐÐÐ£ÐÐ ÐÐÐÐÐÐÐ: ÐºÐŸÐŽÐžÑÐŸÐ²Ð°ÐœÐžÐµ ÐœÐµ ÑÐŒÐŸÐ³Ð»ÐŸ Ð±ÑÑÑ ÐžÐ·Ð²Ð»ÐµÑÐµÐœÐŸ ÐžÐ· %s - Ð¿ÐŸ ÑÐŒÐŸÐ»ÑÐ°ÐœÐžÑ Ðº %s
+
+ReadTextFile.could_not_extract_language:ÐÐ ÐÐÐ£ÐÐ ÐÐÐÐÐÐÐ: ÑÐ·ÑÐº ÐœÐµ ÑÐŒÐŸÐ³ Ð±ÑÑÑ ÐžÐ·Ð²Ð»ÐµÑÐµÐœ ÐžÐ· %s - Ð¿ÐŸ ÑÐŒÐŸÐ»ÑÐ°ÐœÐžÑ Ðº %s
+
+ReadTextFile.could_not_open_for_reading:ÐœÐµ ÑÐŒÐŸÐ³ ÐŸÑÐºÑÑÑÑ %s ÐŽÐ»Ñ ÑÑÐµÐœÐžÑ
+
+ReadTextFile.default_encoding:ÐÑÐ¿ÐŸÐ»ÑÐ·ÑÐ¹ÑÐµ ÑÑÐŸ ÐºÐŸÐŽÐžÑÐŸÐ²Ð°ÐœÐžÐµ, ÐµÑÐ»Ðž -input_encoding ÑÑÑÐ°ÐœÐŸÐ²Ð»ÐµÐœ ÐœÐ° 'Ð°Ð²ÑÐŸ', Ð° Ð°Ð»Ð³ÐŸÑÐžÑÐŒ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÐž ÑÐµÐºÑÑÐ° ÐœÐµ Ð² ÑÐŸÑÑÐŸÑÐœÐžÐž ÐžÐ·Ð²Ð»ÐµÑÑ Ð·Ð°ÐºÐŸÐŽÐžÑÐŸÐ²Ð°ÐœÐœÑÐµ ÐžÐ»Ðž ÐžÐ·Ð²Ð»ÐµÐºÐ°ÐµÑ Ð·Ð°ÐºÐŸÐŽÐžÑÐŸÐ²Ð°ÐœÐœÑÐµ, ÐœÐŸ ÐœÐµÐ¿ÐŸÐŽÐŽÐµÑÐ¶ÐžÐ²Ð°ÐµÐŒÑÐµ Greenstone. Ð­ÑÐ° ÐŸÐ¿ÑÐžÑ ÐŒÐŸÐ¶ÐµÑ Ð±ÑÐ°ÑÑ ÑÐµ Ð¶Ðµ ÑÐ°ÐŒÑÐµ Ð·ÐœÐ°ÑÐµÐœÐžÑ, ÐºÐ°Ðº Ðž -input_encoding.
+
+ReadTextFile.default_language:ÐÑÐ»Ðž Greenstone ÐœÐµ Ð² ÑÐŸÑÑÐŸÑÐœÐžÐž ÑÐµÑÐžÑÑ, ÐºÐ°ÐºÐžÐŒ ÑÐ²Ð»ÑÐµÑÑÑ ÑÐ·ÑÐº ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°, ÑÐ»ÐµÐŒÐµÐœÑ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ 'Ð¯Ð·ÑÐº' Ð±ÑÐŽÐµÑ ÑÑÑÐ°ÐœÐŸÐ²Ð»ÐµÐœ ÐœÐ° ÑÑÐŸ Ð·ÐœÐ°ÑÐµÐœÐžÐµ. ÐÐŸ ÑÐŒÐŸÐ»ÑÐ°ÐœÐžÑ -  ÑÑÐŸ 'en' (ÐÐ¡Ð ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑ 639 ÑÐžÐŒÐ²ÐŸÐ»ÐŸÐ² ÑÐ·ÑÐºÐ°: en = Ð°ÐœÐ³Ð»ÐžÐ¹ÑÐºÐžÐ¹ ÑÐ·ÑÐº). ÐÐ±ÑÐ°ÑÐžÑÐµ Ð²ÐœÐžÐŒÐ°ÐœÐžÐµ, ÑÑÐŸ ÐµÑÐ»Ðž -input_encoding ÐœÐµ ÑÑÑÐ°ÐœÐŸÐ²Ð»ÐµÐœ ÐœÐ° 'Ð°Ð²ÑÐŸ', Ðž -extract_language ÐœÐµ ÑÑÑÐ°ÐœÐŸÐ²Ð»ÐµÐœ, Ð²ÑÐµ ÐŽÐŸÐºÑÐŒÐµÐœÑÑ Ð±ÑÐŽÑÑ ÐžÐŒÐµÑÑ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÐµ ÐžÑ
+ 'Ð¯Ð·ÑÐºÐ°' ÑÑÑÐ°ÐœÐŸÐ²Ð»ÐµÐœÐœÑÐŒÐž ÐœÐ° ÑÑÐŸ Ð·ÐœÐ°ÑÐµÐœÐžÐµ.
+
+ReadTextFile.desc:ÐÐ°Ð·ÐŸÐ²ÑÐ¹ Ð¿Ð»Ð°Ð³ÐžÐœ ÐŽÐ»Ñ ÑÐ°Ð¹Ð»ÐŸÐ², ÐžÐŒÐµÑÑÐžÑ
+ ÐŸÐ±ÑÑÐœÑÐ¹ ÑÐµÐºÑÑÐŸÐ²ÑÐ¹ ÑÐŸÑÐŒÐ°Ñ.  
+
+ReadTextFile.empty_file:ÑÐ°Ð¹Ð» ÐœÐµ ÑÐŸÐŽÐµÑÐ¶ÐžÑ ÐœÐžÐºÐ°ÐºÐŸÐ³ÐŸ ÑÐµÐºÑÑÐ°
+
+ReadTextFile.extract_language:ÐÐŽÐµÐœÑÐžÑÐžÑÐžÑÑÐ¹ÑÐµ ÑÐ·ÑÐº ÐºÐ°Ð¶ÐŽÐŸÐ³ÐŸ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ° Ðž ÑÑÑÐ°ÐœÐŸÐ²ÐžÑÐµ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÐµ 'Ð¯Ð·ÑÐº' . ÐÐ±ÑÐ°ÑÐžÑÐµ Ð²ÐœÐžÐŒÐ°ÐœÐžÐµ, ÑÑÐŸ ÑÑÐŸ Ð±ÑÐŽÐµÑ ÑÐŽÐµÐ»Ð°ÐœÐŸ Ð°Ð²ÑÐŸÐŒÐ°ÑÐžÑÐµÑÐºÐž, ÐµÑÐ»Ðž -input_encoding ÑÑÑÐ°ÐœÐŸÐ²Ð»ÐµÐœ ÐœÐ° 'Ð°Ð²ÑÐŸ'.
+
+ReadTextFile.file_has_no_text:ÐÐšÐÐÐÐ: %s ÐœÐµ ÑÐŸÐŽÐµÑÐ¶ÐžÑ ÐœÐžÐºÐ°ÐºÐŸÐ³ÐŸ ÑÐµÐºÑÑÐ°
+
+ReadTextFile.input_encoding:ÐÐŸÐŽÐžÑÐŸÐ²Ð°ÐœÐžÐµ ÐžÑÑ
+ÐŸÐŽÐœÑÑ
+ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ². ÐÐŸÐºÑÐŒÐµÐœÑÑ Ð±ÑÐŽÑÑ ÐºÐŸÐœÐ²ÐµÑÑÐžÑÐŸÐ²Ð°ÐœÑ ÐžÐ· ÑÑÐžÑ
+ ÑÐžÑÑÐŸÐ²Ð°ÐœÐžÐ¹ Ðž Ñ
+ÑÐ°ÐœÐžÑÑÑÑ Ð²ÐœÑÑÑÐž ÑÐžÑÑÐµÐŒÑ Ð² Ð²ÐžÐŽÐµ utf8.
+
+ReadTextFile.input_encoding.auto:ÐÑÐ¿ÐŸÐ»ÑÐ·ÑÐ¹ÑÐµ Ð°Ð»Ð³ÐŸÑÐžÑÐŒ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÐž ÑÐµÐºÑÑÐ° ÐŽÐ»Ñ Ð°Ð²ÑÐŸÐŒÐ°ÑÐžÑÐµÑÐºÐŸÐ¹ ÐžÐŽÐµÐœÑÐžÑÐžÐºÐ°ÑÐžÐž ÐºÐŸÐŽÐžÑÐŸÐ²Ð°ÐœÐžÑ ÐºÐ°Ð¶ÐŽÐŸÐ³ÐŸ ÐžÑÑ
+ÐŸÐŽÐœÐŸÐ³ÐŸ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°. Ð­ÑÐŸ Ð±ÑÐŽÐµÑ ÐŒÐµÐŽÐ»ÐµÐœÐœÐµÐµ, ÑÐµÐŒ ÑÑÑÐ°ÐœÐŸÐ²ÐºÐ° ÑÐžÑÑÐŸÐ²Ð°ÐœÐžÑ Ð² ÑÐ²ÐœÐŸÐŒ Ð²ÐžÐŽÐµ, ÐœÐŸ Ð±ÑÐŽÐµÑ ÑÐ°Ð±ÐŸÑÐ°ÑÑ ÑÐ°ÐŒ, Ð³ÐŽÐµ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑÑÑ Ð±ÐŸÐ»ÑÑÐµ ÑÐµÐŒ ÐŸÐŽÐžÐœ Ð²ÐžÐŽ ÑÐžÑÑÐŸÐ²Ð°ÐœÐžÑ  Ð² Ð¿ÑÐµÐŽÐµÐ»Ð°Ñ
+ ÑÐŸÐ¹ Ð¶Ðµ ÑÐ°ÐŒÐŸÐ¹ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž.
+
+ReadTextFile.read_denied:Ð Ð°Ð·ÑÐµÑÐµÐœÐžÐµ ÑÑÐµÐœÐžÑ,  ÐŸÑÐºÐ»ÐŸÐœÐµÐœÐœÐŸÐµ ÐŽÐ»Ñ %s
+
+ReadTextFile.separate_cjk:ÐÐŸÐŒÐµÑÐ°ÐµÑ Ð·ÐœÐ°ÐºÐž Ð¿ÑÐŸÐ±ÐµÐ»Ð° ÐŒÐµÐ¶ÐŽÑ ÐºÐžÑÐ°Ð¹ÑÐºÐžÐŒÐž, ÑÐ¿ÐŸÐœÑÐºÐžÐŒÐž Ðž ÐºÐŸÑÐµÐ¹ÑÐºÐžÐŒÐž ÐžÐµÑÐŸÐ³Ð»ÐžÑÐ°ÐŒÐž, ÑÐ°Ðº ÑÑÐŸ ÐºÐ°Ð¶ÐŽÑÐ¹ Ð¿ÑÐŸÐ±ÐµÐ» ÑÐ°Ð·ÐŽÐµÐ»ÑÐµÑ ÐŽÐ²Ð° ÑÐ»ÐŸÐ²Ð°. ÐÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÑ ÐŽÐ»Ñ ÐœÐµ ÑÐµÐ³ÐŒÐµÐœÑÐžÑÐŸÐ²Ð°ÐœÐœÐŸÐ³ÐŸ ÑÐµÐºÑÑÐ°.  
+
+ReadTextFile.unsupported_encoding:ÐÐ ÐÐÐ£ÐÐ ÐÐÐÐÐÐÐ: %s Ð¿ÐŸÑÐ²Ð»ÑÐµÑÑÑ, ÑÑÐŸÐ±Ñ Ð±ÑÑÑ Ð·Ð°ÐºÐŸÐŽÐžÑÐŸÐ²Ð°ÐœÐœÑÐŒ Ð² ÐœÐµÐ¿ÐŸÐŽÐŽÐµÑÐ¶Ð°ÐœÐœÐŸÐŒ ÑÐžÑÑÐŸÐ²Ð°ÐœÐžÐž (%s) - ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÑ %s
+
+ReadTextFile.wrong_encoding:ÐÐ ÐÐÐ£ÐÐ ÐÐÐÐÐÐÐ: %s ÑÐžÑÐ°Ð»ÐŸÑÑ, ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÑ %s ÑÐžÑÑÐŸÐ²Ð°ÐœÐžÐµ, ÐœÐŸ  Ð¿ÐŸÑÐ²Ð»ÑÐ»ÐŸÑÑ ÐºÐŸÐŽÐžÑÐŸÐ²Ð°ÐœÐœÑÐŒ ÐºÐ°Ðº %s.
+
+ReadXMLFile.desc:ÐÑÐœÐŸÐ²ÐœÐŸÐ¹ ÐºÐ»Ð°ÑÑ Ð¿Ð»Ð°Ð³ÐžÐœÐŸÐ² XML.
+
+ReadXMLFile.xslt:Ð¢ÑÐ°ÐœÑÑÐŸÑÐŒÐžÑÐŸÐ²Ð°ÑÑ Ð¿ÐŸÐŽÑ
+ÐŸÐŽÑÑÐžÐ¹ Ð²Ð²ÐŸÐŽÐžÐŒÑÐ¹ ÐŽÐŸÐºÑÐŒÐµÐœÑ Ð² ÐŸÐ±ÐŸÐ·ÐœÐ°ÑÐµÐœÑÐ¹ ÑÐ°Ð¹Ð» Ñ Ð¿ÐŸÐŒÐŸÑÑÑ XSLT.  ÐÑÐµÐŽÐ¿ÐŸÐ»Ð°Ð³Ð°ÐµÑÑÑ ÐŸÑÐœÐŸÑÐžÑÐµÐ»ÑÐœÐŸÐµ ÐœÐ°Ð·Ð²Ð°ÐœÐžÑ ÑÐ°Ð¹Ð»Ð°, ÐœÐ°Ñ
+ÐŸÐŽÑÑÐµÐ³ÐŸÑÑ Ð² ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž, Ðº Ð¿ÑÐžÐŒÐµÑÑ  etc/mods2dc.xsl.  
+
+RealMediaPlugin.desc:ÐÐ»Ð°Ð³ÐžÐœ ÐŽÐ»Ñ ÐŸÐ±ÑÐ°Ð±ÐŸÑÐºÐž ÑÐ°Ð¹Ð»ÐŸÐ² Real Media.  
+
+ReferPlugin.desc:ReferPlug ÑÐžÑÐ°ÐµÑ Ð±ÐžÐ±Ð»ÐžÐŸÐ³ÑÐ°ÑÐžÑÐµÑÐºÐžÐµ ÑÐ°Ð¹Ð»Ñ Ð² ÑÐµÑÐµÑÐ°ÑÐžÐ²ÐœÐŸÐŒ ÑÐŸÑÐŒÐ°ÑÐµ.  
+
+RogPlugin.desc:Ð¡ÐŸÐ·ÐŽÐ°ÐµÑ Ð¿ÑÐŸÑÑÑÐµ ÐŸÐŽÐœÐŸ-ÑÑÐŸÐ²ÐœÐµÐ²ÑÐµ ÐŽÐŸÐºÑÐŒÐµÐœÑÑ ÐžÐ· ÑÐ°Ð¹Ð»ÐŸÐ² .rog ÐžÐ»Ðž .mdb.
+
+RTFPlugin.desc:ÐÐ»Ð°Ð³ÐžÐœ ÐŽÐ»Ñ ÐžÐŒÐ¿ÐŸÑÑÐžÑÐŸÐ²Ð°ÐœÐžÑ ÑÐ°Ð¹Ð»ÐŸÐ² RTF.
+
+SourceCodePlugin.desc:ÐÐŒÑ ÑÐ°Ð¹Ð»Ð° Ð² ÐœÐ°ÑÑÐŸÑÑÐµÐµ Ð²ÑÐµÐŒÑ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑÑÑ ÐŽÐ»Ñ ÐÐ°Ð·Ð²Ð°ÐœÐžÑ (Ð¿ÑÐŸÐžÐ·Ð²ÐŸÐ»ÑÐœÐŸ Ð²ÑÐ±ÑÐ°ÐœÐœÐŸÐµ ÐŒÐžÐœÑÑ ÐœÐµÐºÐŸÑÐŸÑÑÑ Ð¿ÑÐžÑÑÐ°Ð²ÐºÑ). Ð¢ÐµÐºÑÑÐžÐµ ÑÐ·ÑÐºÐž:\nÑÐµÐºÑÑ:READMEs/Ð¡ÐŸÐ·ÐŽÐ°ÐœÐžÐµÑÐ°Ð¹Ð»ÐŸÐ²\nC/C ++ (Ð² ÐœÐ°ÑÑÐŸÑÑÐµÐµ Ð²ÑÐµÐŒÑ ÐžÐ·Ð²Ð»ÐµÐºÐ°ÐµÑ #Ð²ÐºÐ»ÑÑÐµÐœÐœÑÐµ ÐŸÐ¿ÐµÑÐ°ÑÐŸÑÑ Ðž decls ÐºÐ»Ð°ÑÑÐ° C ++ ) \nPerl (Ð² ÐœÐ°ÑÑÐŸÑÑÐµÐµ Ð²ÑÐµÐŒÑ Ð¿ÑÐµÐŽÑÑÐ°Ð²Ð»ÐµÐœÐœÑÐ¹ ÑÐŸÐ»ÑÐºÐŸ Ð² Ð²ÐžÐŽÐµ ÑÐµÐºÑÑÐ°) \nÐÐ±ÐŸÐ»ÐŸÑÐºÐ° (Ð² ÐœÐ°ÑÑÐŸÑÑÐµÐµ Ð²ÑÐµÐŒÑ Ð¿ÑÐµÐŽÑÑÐ°Ð²Ð»ÐµÐœÐœÐ°Ñ ÑÐŸÐ»ÑÐºÐŸ Ð² Ð²ÐžÐŽÐµ ÑÐµÐºÑÑÐ°).
+
+SourceCodePlugin.remove_prefix:Ð£ÐŽÐ°Ð»ÐžÑÑ ÑÑÐŸÑ Ð²ÐµÐŽÑÑÐžÐ¹ ÐŸÐ±ÑÐ°Ð·ÐµÑ ÐžÐ· ÐžÐŒÐµÐœÐž ÑÐ°Ð¹Ð»Ð° (eg-remove_prefix/tmp/xx/src/). ÐÐŸ ÑÐŒÐŸÐ»ÑÐ°ÐœÐžÑ ÐŽÐŸÐ»Ð¶ÐµÐœ Ð²ÐµÑÑ Ð¿ÑÑÑ ÐŽÐŸÑÑÑÐ¿Ð° ÐŸÑ ÐžÐŒÐµÐœÐž ÑÐ°Ð¹Ð»Ð°.
+
+SplitTextFile.desc:SplitPlug - ÑÑÐŸ Ð¿Ð»Ð°Ð³ÐžÐœ ÐŽÐ»Ñ ÑÐ°Ð·Ð±ÐžÐµÐœÐžÑ Ð²Ñ
+ÐŸÐŽÐœÑÑ
+ ÑÐ°Ð¹Ð»ÐŸÐ² ÐœÐ° ÑÐµÐ³ÐŒÐµÐœÑÑ, ÐºÐŸÑÐŸÑÑÐµ Ð±ÑÐŽÑÑ Ð¿ÐŸÑÐŸÐŒ ÐŸÐ±ÑÐ°Ð±Ð°ÑÑÐ²Ð°ÑÑÑÑ Ð¿ÐŸ ÐŸÑÐŽÐµÐ»ÑÐœÐŸÑÑÐž.Ð­ÑÐŸÑ Ð¿Ð»Ð°Ð³ÐžÐœ ÐœÐµÐ»ÑÐ·Ñ Ð²ÑÐ·Ð²Ð°ÑÑ ÐœÐµÐ¿ÐŸÑÑÐµÐŽÑÑÐ²ÐµÐœÐœÐŸ. ÐÐŒÐµÑÑÐŸ ÑÑÐŸÐ³ÐŸ, ÐµÑÐ»Ðž ÐÑ ÐŽÐŸÐ»Ð¶ÐœÑ ÐŸÐ±ÑÐ°Ð±ÐŸÑÐ°ÑÑ Ð²Ñ
+ÐŸÐŽÐœÑÐµ ÑÐ°Ð¹Ð»Ñ, ÐºÐŸÑÐŸÑÑÐµ ÑÐŸÐŽÐµÑÐ¶Ð°Ñ ÐœÐµÑÐºÐŸÐ»ÑÐºÐŸ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ², ÐÑ ÐŽÐŸÐ»Ð¶ÐœÑ ÐœÐ°Ð¿ÐžÑÐ°ÑÑ Ð¿Ð»Ð°Ð³ÐžÐœ Ñ ÑÑÐœÐºÑÐžÐµÐ¹ ÐŸÐ±ÑÐ°Ð±ÐŸÑÐºÐž, ÐºÐŸÑÐŸÑÑÐ¹ Ð±ÑÐŽÐµÑ ÐŸÐ±ÑÐ°Ð±Ð°ÑÑÐ²Ð°ÑÑ ÐŸÐŽÐžÐœ ÐžÐ· ÑÑÐžÑ
+ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ², ÐœÐ°ÑÐ»ÐµÐŽÑÑ ÐµÐ³ÐŸ ÐžÐ· SplitPlug. Ð¡ÐŒ. ReferPlug ÐŽÐ»Ñ Ð¿ÑÐžÐŒÐµÑÐ°.  
+
+SplitTextFile.split_exp:ÐÑÐ°Ð²ÐžÐ»ÑÐœÐŸÐµ Ð²ÑÑÐ°Ð¶ÐµÐœÐžÐµ perl ÐŽÐ»Ñ ÑÐ°Ð·Ð±ÐžÐµÐœÐžÑ Ð²Ñ
+ÐŸÐŽÐœÑÑ
+ ÑÐ°Ð¹Ð»ÐŸÐ² ÐœÐ° ÑÐ°ÑÑÐž.
+
+StructuredHTMLPlugin.desc:ÐÐ»Ð°Ð³ÐžÐœ ÐŽÐ»Ñ ÐŸÐ±ÑÐ°Ð±ÐŸÑÐºÐž ÑÑÑÑÐºÑÑÑÐžÑÐŸÐ²Ð°ÐœÐœÑÑ
+ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ² HTML, ÑÐ°Ð·ÐŽÐµÐ»ÑÑ ÐžÑ
+ ÐœÐ° ÑÐµÐºÑÐžÐž Ð¿ÐŸ ÐžÐœÑÐŸÑÐŒÐ°ÑÐžÐž ÐžÐ· ÑÑÐžÐ»ÐµÐ¹.  
+
+StructuredHTMLPlugin.delete_toc:Ð£ÐŽÐ°Ð»ÐžÑÑ "Ð¡ÐŸÐŽÐµÑÐ¶Ð°ÐœÐžÐµ" Ðž "Ð¡Ð¿ÐžÑÐŸÐº ÑÐ°Ð±Ð»ÐžÑ" ÐžÐ· ÐºÐŸÐœÐ²ÐµÑÑÐžÑÐŸÐ²Ð°ÐœÐœÐŸÐ³ÐŸ ÑÐ°Ð¹Ð»Ð° HTML.  
+
+StructuredHTMLPlugin.title_header:ÑÑÑÐ°ÐœÐŸÐ²ÐžÑÑ Ð²ÐŸÐ·ÐŒÐŸÐ¶ÐœÑÐ¹ ÑÑÐžÐ»Ñ ÐŽÐ»Ñ title_header, ÐºÐŸÑÐŸÑÑÐ¹ ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐžÐ» Ð¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÐµÐ»Ñ.  
+
+StructuredHTMLPlugin.level1_header:Ð²ÐŸÐ·ÐŒÐŸÐ¶ÐœÑÐ¹ ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐœÑÐ¹ Ð¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÐµÐ»ÐµÐŒ ÑÑÐžÐ»Ñ Ð·Ð°Ð³ÐŸÐ»ÐŸÐ²ÐºÐŸÐ² Ð¿ÐµÑÐ²ÐŸÐ³ÐŸ ÑÑÐŸÐ²ÐœÑ Ð² ÐŽÐŸÐºÑÐŒÐµÐœÑÐµ HTML (ÑÐºÐ²ÐžÐ²Ð°Ð»ÐµÐœÑ Ðº <h1>).  
+
+StructuredHTMLPlugin.level2_header:Ð²ÐŸÐ·ÐŒÐŸÐ¶ÐœÑÐ¹ ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐœÑÐ¹ Ð¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÐµÐ»ÐµÐŒ ÑÑÐžÐ»Ñ Ð·Ð°Ð³ÐŸÐ»ÐŸÐ²ÐºÐŸÐ² Ð²ÑÐŸÑÐŸÐ³ÐŸ ÑÑÐŸÐ²ÐœÑ Ð² ÐŽÐŸÐºÑÐŒÐµÐœÑÐµ HTML (ÑÐºÐ²ÐžÐ²Ð°Ð»ÐµÐœÑ Ðº <h2>).  
+
+StructuredHTMLPlugin.level3_header:Ð²ÐŸÐ·ÐŒÐŸÐ¶ÐœÑÐµ ÑÑÐžÐ»Ðž, ÐŸÐ¿ÑÐµÐŽÐµÐ»ÑÐµÐŒÑÐµ Ð¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÐµÐ»ÐµÐŒ, ÐŽÐ»Ñ Ð·Ð°Ð³ÐŸÐ»ÐŸÐ²ÐºÐŸÐ² ÑÑÐµÑÑÐµÐ³ÐŸ ÑÑÐŸÐ²ÐœÑ Ð² ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°Ñ
+ HTML (ÑÐºÐ²ÐžÐ²Ð°Ð»ÐµÐœÑ Ðº <h3>).  
+
+StructuredHTMLPlugin.toc_header:Ð²ÐŸÐ·ÐŒÐŸÐ¶ÐœÑÐ¹ ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐœÑÐ¹ Ð¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÐµÐ»ÐµÐŒ ÑÑÐžÐ»Ñ ÐŸÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÑ  
+
+TextPlugin.desc:Ð¡ÐŸÐ·ÐŽÐ°ÐµÑ Ð¿ÑÐŸÑÑÐŸÐ¹ ÐŸÐŽÐœÐŸ-ÑÑÐŸÐ²ÐœÐµÐ²ÑÐ¹ ÐŽÐŸÐºÑÐŒÐµÐœÑ. ÐÐŸÐ±Ð°Ð²Ð»ÑÐµÑ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÐµ ÐÐ°Ð·Ð²Ð°ÐœÐžÑ ÐžÐ· Ð¿ÐµÑÐ²ÐŸÐ¹ ÑÑÑÐŸÐºÐž ÑÐµÐºÑÑÐ° (ÐŽÐ»ÐžÐœÐŸÐ¹ ÐŽÐŸ 100 Ð·ÐœÐ°ÐºÐŸÐ².
+
+TextPlugin.title_sub:ÐÑÑÐ°Ð¶ÐµÐœÐžÐµ Ð·Ð°ÐŒÐµÐœÑ ÐŽÐ»Ñ ÐžÐ·ÐŒÐµÐœÐµÐœÐžÑ ÑÑÑÐŸÐºÐž, Ñ
+ÑÐ°ÐœÑÑÐµÐ¹ÑÑ ÐºÐ°Ðº ÐÐ°Ð·Ð²Ð°ÐœÐžÐµ. ÐÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑÑÑ, ÐœÐ°Ð¿ÑÐžÐŒÐµÑ, PSPlug, ÑÑÐŸÐ±Ñ ÑÐŽÐ°Ð»ÐžÑÑ "Ð¡ÑÑÐ°ÐœÐžÑÑ 1" Ðž Ñ.ÐŽ ÐžÐ· ÑÐµÐºÑÑÐ°, ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÐŒÐŸÐ³ÐŸ Ð² ÐºÐ°ÑÐµÑÑÐ²Ðµ ÐœÐ°Ð·Ð²Ð°ÐœÐžÑ.  
+
+UnknownPlugin.assoc_field:ÐÐŒÑ Ð¿ÐŸÐ»Ñ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+, ÐºÐŸÑÐŸÑÐŸÐµ Ð±ÑÐŽÐµÑ ÐŽÐµÑÐ¶Ð°ÑÑ ÐžÐŒÐµÐœÐ° Ð°ÑÑÐŸÑÐžÐžÑÐŸÐ²Ð°ÐœÐœÑÑ
+ ÑÐ°Ð¹Ð»ÐŸÐ².
+
+UnknownPlugin.desc:Ð­ÑÐŸ Ð¿ÑÐŸÑÑÐŸÐ¹ Ð¿Ð»Ð°Ð³ÐžÐœ ÐŽÐ»Ñ ÐžÐŒÐ¿ÐŸÑÑÐžÑÐŸÐ²Ð°ÐœÐžÑ ÑÐ°Ð¹Ð»ÐŸÐ² Ð² ÑÐŸÑÐŒÐ°ÑÐ°Ñ
+, ÐœÐµÐžÐ·Ð²ÐµÑÑÐœÑÑ
+ ÐŽÐ»Ñ Greenstone.  ÐÑÐŒÑÑÐ»ÐµÐœÐœÑÐ¹ ÐŽÐŸÐºÑÐŒÐµÐœÑ Ð±ÑÐŽÐµÑ ÑÐŸÐ·ÐŽÐ°Ðœ ÐŽÐ»Ñ ÐºÐ°Ð¶ÐŽÐŸÐ³ÐŸ ÑÐ°ÐºÐŸÐ³ÐŸ ÑÐ°Ð¹Ð»Ð°, Ðž ÑÐ°ÐŒ ÑÐ°Ð¹Ð» Ð±ÑÐŽÐµÑ Ð¿ÐµÑÐµÐŽÐ°Ðœ Ð² Greenstone ÐºÐ°Ðº \"Ð°ÑÑÐŸÑÐžÐžÑÐŸÐ²Ð°ÐœÐœÑÐ¹ ÑÐ°Ð¹Ð»\" ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°.
+
+UnknownPlugin.file_format:Ð¢ÐžÐ¿ ÑÐ°Ð¹Ð»Ð° (ÐœÐ°Ð¿ÑÐžÐŒÐµÑ, MPEG, MIDI, ...).
+
+UnknownPlugin.mime_type:Ð¢ÐžÐ¿ ÑÐ°Ð¹Ð»Ð°  mime (ÐœÐ°Ð¿ÑÐžÐŒÐµÑ, ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÐµ/gif).
+
+UnknownPlugin.process_extension:ÐÐ±ÑÐ°Ð±ÐŸÑÐºÐ° ÑÐ°Ð¹Ð»ÐŸÐ² Ñ ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐœÑÐŒ ÑÐ°ÑÑÐžÑÐµÐœÐžÐµÐŒ. Ð­ÑÐ° ÐŸÐ¿ÑÐžÑ - Ð°Ð»ÑÑÐµÑÐœÐ°ÑÐžÐ²Ð° Ðº process_exp, ÐºÐŸÑÐŸÑÐ°Ñ Ð¿ÑÐŸÑÐµ, ÐœÐŸ ÐŒÐµÐœÐµÐµ Ð¿ÑÐžÑÐ¿ÐŸÑÐ°Ð±Ð»ÐžÐ²Ð°ÐµÐŒÐ°Ñ.
+
+UnknownPlugin.srcicon:Ð£ÐºÐ°Ð¶ÐžÑÐµ ÐŒÐ°ÐºÑÐŸ ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµ (Ð±ÐµÐ· ÑÐžÐŒÐ²ÐŸÐ»ÐŸÐ² Ð¿ÐŸÐŽÑÐµÑÐºÐžÐ²Ð°ÐœÐžÑ), ÑÑÐŸÐ±Ñ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÑ Ð² ÐºÐ°ÑÐµÑÑÐ²Ðµ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ srcicon.  
+
+WordPlugin.desc:ÐÐ»Ð°Ð³ÐžÐœ ÐŽÐ»Ñ ÐžÐŒÐ¿ÐŸÑÑÐžÑÐŸÐ²Ð°ÐœÐžÑ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ² Microsoft Word.
+
+WordPlugin.windows_scripting:ÐÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÑ ÑÐµÑ
+ÐœÐŸÐ»ÐŸÐ³ÐžÑ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐžÑÐŸÐ²Ð°ÐœÐžÑ Microsoft Windows (Visual Basic ÐŽÐ»Ñ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒ), ÑÑÐŸÐ±Ñ Word ÐºÐŸÐœÐ²ÐµÑÑÐžÑÐŸÐ²Ð°Ð» ÐŽÐŸÐºÑÐŒÐµÐœÑÑ Ð²  HTML, Ð²ÐŒÐµÑÑÐŸ Ð¿Ð°ÐºÐµÑÐ° open source WvWare. ÐÑÐž ÑÑÐŸÐŒ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐ° Word ÐŸÑÐºÑÐŸÐµÑÑÑ ÐœÐ° ÑÐºÑÐ°ÐœÐµ, ÐµÑÐ»Ðž ÐŸÐœÐ° ÐµÑÐµ ÐœÐµ Ð·Ð°Ð¿ÑÑÐµÐœÐ°.
+
+WordPlugin.metadata_fields:Ð­ÑÐ° ÐŸÐ¿ÑÐžÑ ÐŽÐ»Ñ ÐžÐ·Ð²Ð»ÐµÑÐµÐœÐžÑ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ ÐžÐ· ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ² HTML ÑÐºÐŸÐœÐ²ÐµÑÑÐžÑÐŸÐ²Ð°ÐœÐœÑÑ
+ Ñ Ð¿ÐŸÐŒÐŸÑÑÑ ÑÐºÑÐžÐ¿ÑÐ° VB. ÐÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÐµÐ»Ñ ÐŒÐŸÐ¶ÐµÑ ÑÐºÐ°Ð·Ð°ÑÑ ÑÐµÑÐµÐ· Ð·Ð°Ð¿ÑÑÑÑ ÑÐ¿ÐžÑÐŸÐº Ð¿ÐŸÐ»ÐµÐ¹ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+, ÐºÐŸÑÐŸÑÑÐµ ÑÑÐµÐ±ÑÐµÑÑÑ ÐžÐ·Ð²Ð»ÐµÑÑ. Ð£ÐºÐ°Ð¶ÐžÑÐµ 'tag<tagname>', ÑÑÐŸÐ±Ñ Ð¿ÐµÑÐ²ÐŸÐµ ÐžÐ·Ð²Ð»ÐµÑÐµÐœÐœÐŸÐµ Ð·ÐœÐ°ÑÐµÐœÐžÐµ Ð¿Ð°ÑÑ <tagname> ÑÐŸÑ
+ÑÐ°ÐœÐžÑÑ Ð² ÑÐ»ÐµÐŒÐµÐœÑÐµ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ ÐœÐ°Ð·Ð²Ð°ÐœÐœÐŸÐŒ 'tagname'. ÐÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑÐµ Ð±ÐŸÐ»ÑÑÐžÐµ Ð±ÑÐºÐ²Ñ, ÑÑÐŸÐ±Ñ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÐµ Ð±ÑÐ»Ðž Ð¿ÐŸÐºÐ°Ð·Ð°ÐœÑ Ð² ÐÑÐžÐœÑÑÐŸÑÐœ ÑÐŸÐŸÑÐ²ÐµÑÑÐ²ÑÑÑÐµ. ÐÐ»Ñ ÐžÐ·Ð²Ð»ÐµÑÐµÐœÐžÑ ÑÑÐŸ ÐœÐµ ÐžÐ³ÑÐ°ÐµÑ ÑÐŸÐ»Ðž.  
+
+ZIPPlugin.desc:ÐÐ»Ð°Ð³ÐžÐœ, ÐºÐŸÑÐŸÑÑÐ¹ ÐŸÐ±ÑÐ°Ð±Ð°ÑÑÐ²Ð°ÐµÑ ÑÐ¶Ð°ÑÑÐµ Ðž/ÐžÐ»Ðž Ð°ÑÑ
+ÐžÐ²ÐžÑÐŸÐ²Ð°ÐœÐœÑÐµ Ð²Ñ
+ÐŸÐŽÐœÑÐµ ÑÐŸÑÐŒÐ°ÑÑ, ÑÐµÐºÑÑÐžÐµ ÐŸÐ±ÑÐ°Ð±ÐŸÑÐ°ÐœÐœÑÐµ ÑÐŸÑÐŒÐ°ÑÑ Ðž ÑÐ°Ð¹Ð»Ñ Ñ ÑÐ°ÑÑÐžÑÐµÐœÐžÑÐŒÐž:\ngzip (.gz, .z, .tgz, .taz)\nbzip (.bz)\nbzip2 (.bz2)\nzip (.zip .jar)\ntar (.tar)\n\n Ð­ÑÐŸÑ Ð¿Ð»Ð°Ð³ÐžÐœ ÐŸÐ¿ÐžÑÐ°ÐµÑÑÑ ÐœÐ° ÑÐ»ÐµÐŽÑÑÑÐžÐµ Ð¿ÑÐžÑÑÑÑÑÐ²ÑÑÑÐžÐµ ÑÑÐžÐ»ÐžÑÑ (ÐµÑÐ»Ðž Ð¿ÑÑÐ°ÑÑÑÑ ÐŸÐ±ÑÐ°Ð±ÐŸÑÐ°ÑÑ ÑÐŸÐŸÑÐ²ÐµÑÑÑÐ²ÑÑÑÐžÐµ ÑÐŸÑÐŒÐ°ÑÑ):\ngunzip (ÐŽÐ»Ñ gzip)\nbunzip (ÐŽÐ»Ñ bzip)\nbunzip2 \nunzip (ÐŽÐ»Ñzip)\ntar (ÐŽÐ»Ñ tar).
+
+#
+# Download module option descriptions
+#
+
+BaseDownload.desc:ÐÑÐœÐŸÐ²ÐœÐŸÐ¹ ÐºÐ»Ð°ÑÑ ÐŽÐ»Ñ ÐŒÐŸÐŽÑÐ»ÐµÐ¹ Ð·Ð°Ð³ÑÑÐ·ÐºÐž  
+BaseDownload.bad_general_option:% Ð·Ð°Ð³ÑÑÐ·ÐºÐž ÐŒÐŸÐŽÑÐ»Ñ ÐŽÐ»Ñ ÐœÐµÐºÐŸÑÐµÐºÑÐœÐŸÐ³ÐŸ Ð²ÑÐ±ÐŸÑÐ°.  
+MediaWikiDownload.desc:ÐÐŸÐŽÑÐ»Ñ ÐŽÐ»Ñ Ð·Ð°Ð³ÑÑÐ·ÐºÐž Ñ ÑÐ°Ð¹ÑÐŸÐ² MediaWiki.  
+MediaWikiDownload.reject_filetype:Ð¡Ð¿ÐžÑÐŸÐº ÐžÐ³ÐœÐŸÑÐžÑÑÐµÐŒÑÑ
+ URL-ÐŸÐ², ÑÐ°Ð·ÐŽÐµÐ»ÐµÐœÐœÑÑ
+ Ð·Ð°Ð¿ÑÑÑÐŒÐž, ÐœÐ°Ð¿ÑÐžÐŒÐµÑ *cgi-bin*,*.ppt Ð·Ð°ÑÑÐ°Ð²ÐžÑ ÐžÐ³ÐœÐŸÑÐžÑÐŸÐ²Ð°ÑÑ Ð³ÐžÐ¿ÐµÑÑÑÑÐ»ÐºÐž, ÑÐŸÐŽÐµÑÐ¶Ð°ÑÐžÐµ ÐžÐ»Ðž 'cgi-bin', ÐžÐ»Ðž '.ppt'  
+MediaWikiDownload.reject_filetype_disp:Ð¡Ð¿ÐžÑÐŸÐº ÐžÐ³ÐœÐŸÑÐžÑÑÐµÐŒÑÑ
+ URL-ÐŸÐ², ÑÐ°Ð·ÐŽÐµÐ»ÐµÐœÐœÑÑ
+ Ð·Ð°Ð¿ÑÑÑÐŒÐž.  
+MediaWikiDownload.exclude_directories:Ð¡Ð¿ÐžÑÐŸÐº ÐžÑÐºÐ»ÑÑÐ°ÐµÐŒÑÑ
+ ÐºÐ°ÑÐ°Ð»ÐŸÐ³ÐŸÐ² (ÐœÐµÐŸÐ±Ñ
+ÐŸÐŽÐžÐŒ Ð¿ÐŸÐ»ÐœÑÐ¹ Ð¿ÑÑÑ Ðº ÐºÐ°ÑÐ°Ð»ÐŸÐ³Ñ), ÐœÐ°Ð¿ÑÐžÐŒÐµÑ /people,/documentation ÐžÑÐºÐ»ÑÑÐžÑ Ð¿ÐŸÐŽÐºÐ°ÑÐ°Ð»ÐŸÐ³Ðž 'people' Ðž 'documentation'.  
+MediaWikiDownload.exclude_directories_disp:Ð¡Ð¿ÐžÑÐŸÐº ÐžÑÐºÐ»ÑÑÐ°ÐµÐŒÑÑ
+ ÐºÐ°ÑÐ°Ð»ÐŸÐ³ÐŸÐ², ÑÐ°Ð·ÐŽÐµÐ»ÐµÐœÐœÑÑ
+ Ð·Ð°Ð¿ÑÑÑÐŒÐž.  
+
+OAIDownload.desc:ÐÐŸÐŽÑÐ»Ñ ÐŽÐ»Ñ Ð·Ð°Ð³ÑÑÐ·ÐºÐž ÐžÐ· ÑÐµÐ¿ÐŸÐ·ÐžÑÐŸÑÐžÐµÐ² OAI  
+OAIDownload.url_disp:ÐÑÑ
+ÐŸÐŽÐœÑÐ¹ URL  
+OAIDownload.url:URL ÑÐµÐ¿ÐŸÐ·ÐžÑÐŸÑÐžÑ OAI  
+OAIDownload.set_disp:Ð£ÑÑÐ°ÐœÐŸÐ²ÐžÑÑ  
+OAIDownload.set:ÐÐ³ÑÐ°ÐœÐžÑÐžÑÑ Ð·Ð°Ð³ÑÑÐ·ÐºÑ ÑÐºÐ°Ð·Ð°ÐœÐœÐŸÐ³ÐŸ ÐœÐ°Ð±ÐŸÑÐ° Ð² ÑÐµÐ¿ÐŸÐ·ÐžÑÐŸÑÐžÐž  
+OAIDownload.metadata_prefix_disp:ÐÑÐµÑÐžÐºÑ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+  
+OAIDownload.metadata_prefix:Ð€ÐŸÑÐŒÐ°Ñ ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑÑÑ Ð² ÑÐºÑÐ¿ÐŸÑÑÐµ, Ð¿ÑÐžÐŒ: oai_dc, qdc Ðž Ñ.ÐŽ. ÐÐ°Ð¶ÐŒÐžÑÐµ ÐºÐœÐŸÐ¿ÐºÑ <server information>, ÑÑÐŸÐ±Ñ Ð²ÑÑÑÐœÐžÑÑ, ÐºÐ°ÐºÐžÐµ ÑÐŸÑÐŒÐ°ÑÑ Ð¿ÐŸÐŽÐŽÐµÑÐ¶ÐžÐ²Ð°ÑÑÑÑ.  
+OAIDownload.get_doc_disp:ÐÐŸÐ»ÑÑÐžÑÑ ÐŽÐŸÐºÑÐŒÐµÐœÑ  
+OAIDownload.get_doc:ÐÐ°Ð³ÑÑÐ·ÐžÑÑ ÐžÑÑ
+ÐŸÐŽÐœÑÐ¹ ÐŽÐŸÐºÑÐŒÐµÐœÑ, ÐµÑÐ»Ðž ÐŸÐœ ÑÐºÐ°Ð·Ð°Ðœ Ð² Ð·Ð°Ð¿ÐžÑÐž  
+OAIDownload.get_doc_exts_disp:ÐÐºÐ»ÑÑÐ°ÐµÑ ÑÐŸÐ»ÑÐºÐŸ ÑÐžÐ¿Ñ ÑÐ°Ð¹Ð»ÐŸÐ²  
+OAIDownload.get_doc_exts:ÐÐŸÐ¿ÑÑÑÐžÐŒÑÐµ ÑÐ°ÑÑÐžÑÐµÐœÐžÑ ÑÐ°Ð¹Ð»ÐŸÐ² ÐŽÐ»Ñ Ð¿ÐŸÐ»ÑÑÐµÐœÐžÑ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ²  
+OAIDownload.max_records_disp:ÐÐ°ÐºÑÐžÐŒÑÐŒ Ð·Ð°Ð¿ÐžÑÐµÐ¹  
+OAIDownload.max_records:ÐÐ°ÐºÑÐžÐŒÑÐŒ Ð·Ð°Ð¿ÐžÑÐµÐ¹ ÐŽÐ»Ñ Ð·Ð°Ð³ÑÑÐ·ÐºÐž  
+
+SRWDownload.desc:ÐÐŸÐŽÑÐ»Ñ ÐŽÐ»Ñ Ð·Ð°Ð³ÑÑÐ·ÐºÐž ÐžÐ· ÑÐµÐ¿ÐŸÐ·ÐžÑÐŸÑÐžÐµÐ² SRW (Search/Retrieve Web Service)  
+
+WebDownload.desc:ÐÐŸÐŽÑÐ»Ñ ÐŽÐ»Ñ Ð·Ð°Ð³ÑÑÐ·ÐºÐž ÐžÐ· ÐÐœÑÐµÑÐœÐµÑÐ° Ð¿ÐŸ HTTP ÐžÐ»Ðž FTP  
+WebDownload.url:ÐÑÑ
+ÐŸÐŽÐœÑÐ¹ URL. ÐÐŸÐ¶ÐµÑ ÐžÐ·ÐŒÐµÐœÑÑÑÑÑ Ð² ÑÐ»ÑÑÐ°Ðµ Ñ http.  
+WebDownload.url_disp:ÐÑÑ
+ÐŸÐŽÐœÑÐ¹ URL  
+WebDownload.depth:ÐÐ° ÑÐºÐŸÐ»ÑÐºÐŸ ÑÑÑÐ»ÐŸÐº Ð² Ð³Ð»ÑÐ±ÐžÐœÑ ÐŸÐ¿ÑÑÐºÐ°ÑÑÑÑ Ð¿ÑÐž Ð·Ð°Ð³ÑÑÐ·ÐºÐµ  
+WebDownload.depth_disp:ÐÐ»ÑÐ±ÐžÐœÐ° Ð·Ð°ÐºÐ°ÑÐºÐž  
+WebDownload.below:ÐÑÐ·ÐµÑÐºÐ°Ð»ÐžÑÑ ÑÐŸÐ»ÑÐºÐŸ ÑÐ°Ð¹Ð»Ñ Ñ ÑÑÐŸÐ³ÐŸ URL  
+WebDownload.below_disp:ÐÑÐ·ÐµÑÐºÐ°Ð»ÐžÑÑ ÑÐŸÐ»ÑÐºÐŸ ÑÐ°Ð¹Ð»Ñ Ñ ÑÑÐŸÐ³ÐŸ URL  
+WebDownload.within:Ð¢ÐŸÐ»ÑÐºÐŸ ÐŸÑÐ·ÐµÑÐºÐ°Ð»ÐžÑÑ ÑÐ°Ð¹Ð»Ñ Ñ ÑÐŸÐ³ÐŸ Ð¶Ðµ ÑÐ°Ð¹ÑÐ°  
+WebDownload.within_disp:Ð¢ÐŸÐ»ÑÐºÐŸ ÐŽÐ»Ñ ÑÐ°Ð¹Ð»ÐŸÐ² Ñ ÑÐŸÐ³ÐŸ Ð¶Ðµ ÑÐ°Ð¹ÑÐ°  
+WebDownload.html_only:ÐÐ°Ð³ÑÑÐ¶Ð°ÑÑ ÑÐŸÐ»ÑÐºÐŸ HTML-ÑÐ°Ð¹Ð»Ñ Ðž ÐžÐ³ÐœÐŸÑÐžÑÐŸÐ²Ð°ÑÑ Ð°ÑÑÐŸÑÐžÐžÑÐŸÐ²Ð°ÐœÐœÑÐµ Ñ ÐœÐžÐŒÐž ÑÐ°Ð¹Ð»Ñ, ÑÐ°ÐºÐžÐµ ÐºÐ°Ðº ÐºÐ°ÑÑÐžÐœÐºÐž Ðž ÑÐ°Ð±Ð»ÐžÑÑ ÑÑÐžÐ»ÐµÐ¹  
+WebDownload.html_only_disp:ÐÐ°Ð³ÑÑÐ¶Ð°ÑÑ ÑÐŸÐ»ÑÐºÐŸ HTML-ÑÐ°Ð¹Ð»Ñ  
+
+WgetDownload.desc:ÐÑÐœÐŸÐ²ÐœÐŸÐ¹ ÐºÐ»Ð°ÑÑ, ÐºÐŸÑÐŸÑÑÐ¹ ÐŸÐ±ÑÐ°Ð±Ð°ÑÑÐ²Ð°ÐµÑ Ð·Ð°Ð¿ÑÐŸÑÑ Ðº wget  
+WgetDownload.proxy_on:ÐÐºÐ»ÑÑÐžÑÑ Ð¿ÑÐŸÐºÑÐž  
+WgetDownload.proxy_host:ÐÐŒÑ Ñ
+ÐŸÑÑÐ° Ð¿ÑÐŸÐºÑÐž  
+WgetDownload.proxy_port:ÐÐŸÑÑ Ð¿ÑÐŸÐºÑÐž  
+WgetDownload.user_name:ÐÐŒÑ Ð¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÐµÐ»Ñ  
+WgetDownload.user_password:ÐÐ°ÑÐŸÐ»Ñ Ð¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÐµÐ»Ñ  
+
+Z3950Download.desc:ÐÐŸÐŽÑÐ»Ñ ÐŽÐ»Ñ Ð·Ð°Ð³ÑÑÐ·ÐºÐž ÐžÐ· ÑÐµÐ¿ÐŸÐ·ÐžÑÐŸÑÐžÐµÐ² Z3950  
+Z3950Download.host:URL Ñ
+ÐŸÑÑÐ°  
+Z3950Download.host_disp:Ð¥ÐŸÑÑ  
+Z3950Download.port:ÐÐŸÐŒÐµÑ Ð¿ÐŸÑÑÐ° ÑÐµÐ¿ÐŸÐ·ÐžÑÐŸÑÐžÑ  
+Z3950Download.port_disp:ÐÐŸÑÑ  
+Z3950Download.database:ÐÐ°Ð·Ð° ÐŽÐ°ÐœÐœÑÑ
+ ÐŽÐ»Ñ Ð¿ÐŸÐžÑÐºÐ°  
+Z3950Download.database_disp:ÐÐ°Ð·Ð° ÐŽÐ°ÐœÐœÑÑ
+  
+Z3950Download.find:ÐÐŸÐºÐ°Ð·Ð°ÑÑ Ð·Ð°Ð¿ÐžÑÐž, ÑÐŸÐŽÐµÑÐ¶Ð°ÑÐžÐµ ÑÐºÐ°Ð·Ð°ÐœÐœÑÑ ÑÑÑÐŸÐºÑ Ð¿ÐŸÐžÑÐºÐ°  
+Z3950Download.find_disp:ÐÐ°Ð¹ÑÐž  
+Z3950Download.max_records:ÐÐ°ÐºÑÐžÐŒÑÐŒ Ð·Ð°Ð¿ÐžÑÐµÐ¹ ÐŽÐ»Ñ Ð·Ð°Ð³ÑÑÐ·ÐºÐž  
+Z3950Download.max_records_disp:ÐÐ°ÐºÑÐžÐŒÑÐŒ Ð·Ð°Ð¿ÐžÑÐµÐ¹  
+
+
+#
+#Plugout option descriptions
+#
+
+BasPlugout.bad_general_option:ÐÐŸÐŽÑÐ»Ñ %s ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑ ÐœÐµÐºÐŸÑÑÐµÐºÑÐœÑÑ ÐŸÐ¿ÑÐžÑ.  
+BasPlugout.debug:ÑÑÑÐ°ÐœÐŸÐ²ÐºÐ° ÑÐµÐ¶ÐžÐŒÐ° ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐžÑ ÐŸÑÐžÐ±ÐŸÐº  
+BasPlugout.desc:ÐÑÐœÐŸÐ²ÐœÐŸÐ¹ ÐºÐ»Ð°ÑÑ ÐŽÐ»Ñ Ð²ÑÐµÑ
+ ÐŒÐŸÐŽÑÐ»ÐµÐ¹.  
+BasPlugout.group_size:ÐÑÐŸÐœÑÐŒÐµÑÐŸÐ²Ð°ÑÑ ÐŽÐŸÐºÑÐŒÐµÐœÑÑ ÐŽÐ»Ñ Ð³ÑÑÐ¿Ð¿ÐžÑÐŸÐ²ÐºÐž Ð² ÐŸÐŽÐžÐœ XML-ÑÐ°Ð¹Ð».  
+BasPlugout.gzip_output:ÐÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÑ gzip ÐŽÐ»Ñ ÑÐ¶Ð°ÑÐžÑ ÑÐµÐ·ÑÐ»ÑÑÐžÑÑÑÑÐžÑ
+ xml-ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ² (ÐœÐµ Ð·Ð°Ð±ÑÐŽÑÑÐµ Ð²ÐºÐ»ÑÑÐžÑÑ ZIPPlug Ð² ÑÐ²ÐŸÐ¹ ÑÐ¿ÐžÑÐŸÐº Ð¿Ð»Ð°Ð³ÐžÐœÐŸÐ² ÐŽÐ»Ñ ÑÐ±ÐŸÑÐºÐž ÑÐ¶Ð°ÑÑÑ
+ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ²).  
+BasPlugout.output_handle:ÑÐ°Ð¹Ð»ÐŸÐ²ÑÐ¹ ÐŽÐµÑÐºÑÐžÐ¿ÑÐŸÑ, ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÐŒÑÐ¹ ÐŽÐ»Ñ Ð¿ÐŸÑÑÐ»ÐºÐž Ð²ÑÑ
+ÐŸÐŽÐœÐŸÐ¹ ÐžÐœÑÐŸÑÐŒÐ°ÑÐžÐž  
+BasPlugout.output_info:ÑÑÑÐ»ÐºÐ° ÐœÐ° ÐŸÐ±ÑÐµÐºÑ archinfo, ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÐŒÑÐ¹ ÐŽÐ»Ñ Ñ
+ÑÐ°ÐœÐµÐœÐžÑ ÐžÐœÑÐŸÑÐŒÐ°ÑÐžÐž ÐŸÐ± Ð°ÑÑ
+ÐžÐ²Ð°Ñ
+.  
+BasPlugout.verbosity:ÐÐŸÐœÑÑÐŸÐ»ÐžÑÑÐµÑ ÐºÐŸÐ»ÐžÑÐµÑÑÐ²ÐŸ Ð²ÑÐ²ÐŸÐŽÐ°. 0=ÐœÐµÑ, 3=ÐœÐ°ÐžÐ±ÐŸÐ»ÑÑÐžÐ¹.  
+BasPlugout.xslt_file:Ð¢ÑÐ°ÐœÑÑÐŸÑÐŒÐžÑÐŸÐ²Ð°ÑÑ ÐŽÐŸÐºÑÐŒÐµÐœÑ Ð¿ÑÐž Ð¿ÐŸÐŒÐŸÑÐž XSLT Ð² ÑÐºÐ°Ð·Ð°ÐœÐœÐŸÐŒ ÑÐ°Ð¹Ð»Ðµ.  
+
+DSpacePlugout.desc:Ð€ÐŸÑÐŒÐ°Ñ Ð°ÑÑ
+ÐžÐ²Ð° DSpace.  
+
+FedoraMETSPlugout.desc:METS ÑÐŸÑÐŒÐ°Ñ ÐŽÐ»Ñ Ð¿ÑÐžÐŒÐµÐœÐµÐœÐžÑ ÑÐŸÑÐŒÐ°ÑÐ° Fedora.  
+FedoraMETSPlugout.fedora_namespace:ÐÑÐµÑÐžÐºÑ ÐŽÐ»Ñ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÐœÐžÑ Ð€ÐµÐŽÐŸÑÑ ÐŽÐ»Ñ ÐŸÐ±ÑÐ°Ð±ÐŸÑÐºÐž (PIDS) ÐœÐ°Ð¿ÑÐžÐŒÐµÑ greenstone:HASH0122efe4a2c58d0  
+
+GreenstoneXMLPlugout.desc:Ð€ÐŸÑÐŒÐ°Ñ XML Ð°ÑÑ
+ÐžÐ²Ð° ÐÑÐžÐœÑÑÐŸÑÐœ  
+
+GreenstoneMETSPlugout.desc:METS ÑÐŸÑÐŒÐ°Ñ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÐŒÑÐ¹ Ð² Ð¿ÑÐŸÑÐžÐ»Ðµ ÐÑÐžÐœÑÑÐŸÑÐœ.  
+
+MARCXMLPlugout.desc:Ð€ÐŸÑÐŒÐ°Ñ MARC XML  
+MARCXMLPlugout.group:ÐÑÐ²ÐµÑÑÐž Ð·Ð°Ð¿ÐžÑÐž marc xml Ð² ÐŸÐŽÐžÐœ ÑÐ°Ð¹Ð».  
+MARCXMLPlugout.mapping_file:ÐÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÑ ÐžÐŒÐµÐœÐŸÐ²Ð°ÐœÐœÑÐ¹ ÑÐ°Ð¹Ð» ÐŸÑÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ ÐŽÐ»Ñ ÑÑÐ°ÐœÑÑÐŸÑÐŒÐ°ÑÐžÐž.  
+
+METSPlugout.desc:METS-ÑÐŸÑÐŒÐ°Ñ, ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÑÑÐžÐ¹ Ð¿ÑÐŸÑÐžÐ»Ñ Greenstone.  
+METSPlugout.xslt_txt:Ð¢ÑÐ°ÐœÑÑÐŸÑÐŒÐžÑÐŸÐ²Ð°ÑÑ ÑÐ°Ð¹Ð» ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ doctxt.xml Ð¿ÑÐž Ð¿ÐŸÐŒÐŸÑÐž XSLT Ð² ÑÐºÐ°Ð·Ð°ÐœÐœÐŸÐŒ ÑÐ°Ð¹Ð»Ðµ.  
+METSPlugout.xslt_mets:Ð¢ÑÐ°ÐœÑÑÐŸÑÐŒÐžÑÐŸÐ²Ð°ÑÑ ÑÐ°Ð¹Ð» ÐŒÐµÑÐ°ÐŽÐ°ÐœÐœÑÑ
+ docmets.xml Ð¿ÑÐž Ð¿ÐŸÐŒÐŸÑÐž XSLT Ð² ÑÐºÐ°Ð·Ð°ÐœÐœÐŸÐŒ ÑÐ°Ð¹Ð»Ðµ.  
+
+#
+# Perl module strings
+#
+
+classify.could_not_find_classifier:ÐÐšÐÐÐÐ: ÐÐµÐ²ÐŸÐ·ÐŒÐŸÐ¶ÐœÐŸ ÐœÐ°Ð¹ÑÐž ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐŸÑ \"%s\"
+
+download.could_not_find_download:ÐÐšÐÐÐÐ: ÐœÐµÐ²ÐŸÐ·ÐŒÐŸÐ¶ÐœÐŸ Ð·Ð°Ð³ÑÑÐ·ÐžÑÑ ÐŒÐŸÐŽÑÐ»Ñ \"%s\"  
+
+plugin.could_not_find_plugin:ÐÐšÐÐÐÐ: ÐÐµÐ²ÐŸÐ·ÐŒÐŸÐ¶ÐœÐŸ ÐœÐ°Ð¹ÑÐž Ð¿Ð»Ð°Ð³ÐžÐœ \"%s\"
+
+plugin.including_archive:Ð²ÐºÐ»ÑÑÐµÐœÐžÐµ ÑÐŸÐŽÐµÑÐ¶Ð°ÐœÐžÑ 1 Ð°ÑÑ
+ÐžÐ²Ð° ZIP/TAR.
+
+plugin.including_archives:Ð²ÐºÐ»ÑÑÐµÐœÐžÐµ ÑÐŸÐŽÐµÑÐ¶Ð°ÐœÐžÑ  Ð°ÑÑ
+ÐžÐ²ÐŸÐ² %d ZIP/TAR
+
+plugin.kill_file:ÐÐ±ÑÐ°Ð±ÐŸÑÐºÐ°, ÑÐœÐžÑÑÐŸÐ¶ÐµÐœÐœÐ°Ñ ÑÐ°Ð¹Ð»ÐŸÐŒ .kill.
+
+plugin.n_considered:%d ÐŽÐŸÐºÑÐŒÐµÐœÑÑ, Ð¿ÑÐµÐŽÐœÐ°Ð·ÐœÐ°ÑÐµÐœÐœÑÐµ ÐŽÐ»Ñ ÐŸÐ±ÑÐ°Ð±ÐŸÑÐºÐž
+
+plugin.n_included:%d Ð±ÑÐ»Ðž ÐŸÐ±ÑÐ°Ð±ÐŸÑÐ°ÐœÑ Ðž Ð²ÐºÐ»ÑÑÐµÐœÑ Ð² ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ
+
+plugin.n_rejected:%d Ð±ÑÐ»Ðž ÐŸÑÐºÐ»ÐŸÐœÐµÐœÑ
+
+plugin.n_unrecognised:%d Ð·ÐŽÐµÑÑ ÐœÐµÑÐ°ÑÐ¿ÐŸÐ·ÐœÐ°ÐœÐŸ
+
+plugin.no_plugin_could_process:ÐÐ ÐÐÐ£ÐÐ ÐÐÐÐÐÐÐ: ÐÐžÐºÐ°ÐºÐžÐµ Ð¿Ð»Ð°Ð³ÐžÐœÑ ÐœÐµ ÑÐŒÐŸÐ³Ð»Ðž ÐŸÐ±ÑÐ°Ð±ÐŸÑÐ°ÑÑ %s
+
+plugin.no_plugin_could_recognise:ÐÐÐÐÐÐÐÐ: ÐÐµÑ Ð¿Ð»Ð°Ð³ÐžÐœÐ° ÐºÐŸÑÐŸÑÑÐ¹ ÑÐ°ÑÐ¿ÐŸÐ·ÐœÐ°ÐµÑ %s
+
+plugin.no_plugin_could_process_this_file:ÐœÐžÐºÐ°ÐºÐžÐµ Ð¿Ð»Ð°Ð³ÐžÐœÑ ÐœÐµ ÑÐŒÐŸÐ³Ð»Ðž  ÐŸÐ±ÑÐ°Ð±ÐŸÑÐ°ÑÑ ÑÑÐŸÑ ÑÐ°Ð¹Ð»
+
+plugin.no_plugin_could_recognise_this_file:ÐœÐµÑ Ð¿Ð»Ð°Ð³ÐžÐœÐ° ÐºÐŸÑÐŸÑÑÐ¹ ÑÐ°ÑÐ¿ÐŸÐ·ÐœÐ°ÐµÑ ÑÑÐŸÑ ÑÐ°Ð¹Ð»
+
+plugin.one_considered:1 ÐŽÐŸÐºÑÐŒÐµÐœÑ Ð¿ÑÐµÐŽÐœÐ°Ð·ÐœÐ°ÑÐ°Ð»ÑÑ ÐŽÐ»Ñ ÐŸÐ±ÑÐ°Ð±ÐŸÑÐºÐž
+
+plugin.one_included:1 Ð±ÑÐ» ÐŸÐ±ÑÐ°Ð±ÐŸÑÐ°Ðœ Ðž Ð²ÐºÐ»ÑÑÐµÐœ Ð² ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ
+
+plugin.one_rejected:1 Ð±ÑÐ» ÐŸÑÐºÐ»ÐŸÐœÐµÐœ
+
+plugin.one_unrecognised:1 Ð±ÑÐ» ÐœÐµ ÑÐ°ÑÐ¿ÐŸÐ·ÐœÐ°Ðœ
+
+plugin.see_faillog:Ð¡ÐŒ. %s ÐŽÐ»Ñ ÑÐ¿ÐžÑÐºÐ° ÐœÐµÑÐ°ÑÐ¿ÐŸÐ·ÐœÐ°ÐœÐœÑÑ
+  Ðž/ÐžÐ»Ðž ÐŸÑÐºÐ»ÐŸÐœÐµÐœÐœÑÑ
+ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ²
+
+PrintUsage.default:ÐÐŸ ÑÐŒÐŸÐ»ÑÐ°ÐœÐžÑ
+
+PrintUsage.required:Ð¢Ð ÐÐÐ£ÐÐÐ«Ð
+
+plugout.could_not_find_plugout:ÐÐšÐÐÐÐ: ÐœÐµÐ²ÐŸÐ·ÐŒÐŸÐ¶ÐœÐŸ ÐœÐ°Ð¹ÑÐž ÐŒÐŸÐŽÑÐ»Ñ \"%s\"  
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/strings_th.properties
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/strings_th.properties	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/strings_th.properties	(revision 24799)
@@ -0,0 +1,1307 @@
+#
+# Resource bundle description
+#
+
+Language.code:th  
+Language.name:àž­àž±àžàžàž€àž©  
+
+OutputEncoding.unix:utf-8  
+OutputEncoding.windows:utf-8  
+
+
+#
+# Common output messages and strings
+#
+
+common.cannot_create_file:àžà¹àž­àžàžŽàžàžàž¥àž²àž: à¹àž¡à¹àžªàž²àž¡àž²àž£àžàžªàž£à¹àž²àžà¹àžà¹àž¡ %s à¹àžà¹  
+
+common.cannot_find_cfg_file:àžà¹àž­àžàžŽàžàžàž¥àž²àž: à¹àž¡à¹àžàžà¹àžà¹àž¡àžàž³àž«àžàžàžà¹àž² %s  
+
+common.cannot_open:àžà¹àž­àžàžŽàžàžàž¥àž²àž: à¹àž¡à¹àžªàž²àž¡àž²àž£àžà¹àžàžŽàž %s à¹àžà¹  
+
+common.cannot_open_fail_log:àžà¹àž­àžàžŽàžàžàž¥àž²àž: à¹àž¡à¹àžªàž²àž¡àž²àž£àžà¹àžàžŽàžà¹àžà¹àž¡àžàž±àžàžàž¶àžàžàž§àž²àž¡àž¥à¹àž¡à¹àž«àž¥àž§ %s à¹àžà¹  
+
+common.cannot_open_output_file:àžà¹àž­àžàžŽàžàžàž¥àž²àž: à¹àž¡à¹àžªàž²àž¡àž²àž£àžà¹àžàžŽàžà¹àžà¹àž¡àžàž¥àž¥àž±àžàžà¹ %s à¹àžà¹  
+
+common.cannot_read:àžà¹àž­àžàžŽàžàžàž¥àž²àž: à¹àž¡à¹àžªàž²àž¡àž²àž£àžàž­à¹àž²àž %s à¹àžà¹  
+
+common.cannot_read_file:àžà¹àž­àžàžŽàžàžàž¥àž²àž: à¹àž¡à¹àžªàž²àž¡àž²àž£àžàž­à¹àž²àžà¹àžà¹àž¡ %s à¹àžà¹  
+
+common.general_options:àžàž±àž§à¹àž¥àž·àž­àžàžàž±à¹àž§à¹àž (àžªàž³àž«àž£àž±àž %s)  
+
+common.must_be_implemented:àžàž°àžà¹àž­àžàžàžŽàžàžàž±à¹àžàžàž±àžàžà¹àžàž±àžà¹àž§à¹à¹àžàžàž¥àž²àžªàž¢à¹àž­àž¢  
+
+common.options:àžàž±àž§à¹àž¥àž·àž­àž  
+
+common.processing:àžàž²àž£àžàž£àž°àž¡àž§àž¥àžàž¥  
+
+common.specific_options:àžàž±àž§à¹àž¥àž·àž­àžà¹àžàžàž²àž°  
+
+common.usage:àž§àžŽàžàžµàžàž²àž£à¹àžà¹àžàž²àž  
+
+common.info:info  
+
+common.invalid_options:àž­àž²àž£à¹àžàžŽàž§à¹àž¡àžàžà¹à¹àž¡à¹àžàž¹àžàžà¹àž­àž: %s  
+
+common.true:à¹àžà¹  
+
+common.false:à¹àž¡à¹à¹àžà¹  
+
+common.deprecated:DEPRECATED  
+#
+# Script option descriptions and output messages
+#
+
+scripts.language:àž àž²àž©àž²àžàžµà¹àžàž°à¹àžªàžàžàž£àž²àž¢àž¥àž°à¹àž­àžµàž¢àžàžàž­àžàžàž±àž§à¹àž¥àž·àž­àž (à¹àžà¹àž 'en_US' àž«àž¡àž²àž¢àžàž¶àž àž àž²àž©àž²àž­àž±àžàžàž€àž©à¹àžàžàž­à¹àž¡àž£àžŽàžàž±àž (American English) àžà¹àž­àžàžàž²àž£àžàž²àž£à¹àžàž¥àž£àž²àž¢àž¥àž°à¹àž­àžµàž¢àžàžàž­àžàžàž±àž§à¹àž¥àž·àž­àžàžàžµà¹àžàž°àžàž£àž²àžàžà¹àžà¹àžà¹àž¡ perllib/strings_language-code.rb  
+
+scripts.xml:àžªàž£à¹àž²àžàžà¹àž­àž¡àž¹àž¥à¹àžàž£àž¹àžà¹àžàž XML à¹àžàž¢à¹àž¡à¹àžà¹àž­àžàž¡àžµàžàž³àž­àžàžŽàžàž²àž¢àžàžµà¹àžªàž¥àž°àžªàž¥àž§àž¢ à¹àžà¹àžàž­à¹àž«à¹àž¡àžµàž£àž²àž¢àž¥àž°à¹àž­àžµàž¢àžàž¡àž²àž  
+
+scripts.listall:à¹àžªàžàžàž£àž²àž¢àžàž²àž£àžàž±à¹àžàž«àž¡àžàžàžµà¹àž£àž¹à¹àžàž±àž  
+
+scripts.describeall:à¹àžªàžàžàžàž±àž§à¹àž¥àž·àž­àžàžªàž³àž«àž£àž±àžàž£àž²àž¢àžàž²àž£àžàž±à¹àžàž«àž¡àžàžàžµà¹àž£àž¹à¹àžàž±àž  
+
+scripts.both_old_options:àžàž³à¹àžàž·àž­àž: àžà¹àž²àž¡àžµàžàž²àž£àž£àž°àžàžž -removeold àžàž£à¹àž­àž¡àžà¹àž§àž¢ -keepold àž«àž£àž·àž­ -incremental à¹àž«à¹àžàž³àž«àžàžàžà¹àž²à¹àž£àžŽà¹àž¡àžà¹àžà¹àžà¹àžàžà¹àž² -removeold à¹àžàž·à¹àž­àž«àž²àžàž±àžàžàžžàžàž±àžàžàž­àžà¹àžà¹àž£àžàžàž­àž£àžµ %s àžàž°àžàž¹àžàž¥àžàžàžŽà¹àž  
+
+scripts.no_old_options:àžàž³à¹àžàž·àž­àž: àžà¹àž²à¹àž¡à¹àž¡àžµàžàž²àž£àž£àž°àžàžžàžà¹àž² -removeold -keepold àž«àž£àž·àž­ -incremental à¹àž«à¹àžàž³àž«àžàžàžà¹àž²à¹àž£àžŽà¹àž¡àžà¹àžà¹àžà¹àžàžà¹àž² -removeold à¹àžàž·à¹àž­àž«àž²àžàž±àžàžàžžàžàž±àžàžàž­àžà¹àžà¹àž£àžàžàž­àž£àžµ %s àžàž°àžàž¹àžàž¥àžàžàžŽà¹àž  
+
+scripts.gli:àžàž±àž§àžà¹àžàžàžµà¹àžàžµà¹à¹àžà¹àž£àž±àžàžàž²àž£àžàž±à¹àžàžà¹àž²à¹àž¡àž·à¹àž­à¹àž£àžµàž¢àžà¹àžà¹àžªàžàž£àžŽàžàžà¹àžàžµà¹àžàž²àž GLI àžàž¶à¹àžà¹àžàžŽàžà¹àžà¹àžàž²àžà¹àž­àž²àžà¹àžàžžàžàžàžµà¹à¹àžàžàž²àž°à¹àžàž²àžàžàžªàž³àž«àž£àž±àž GLI  
+
+# -- buildcol.pl --
+
+buildcol.archivedir:àžàžµà¹àžàž±àžà¹àžà¹àžàžà¹àž­àž¡àž¹àž¥àžàž²àž§àž£  
+
+buildcol.builddir:àžàžµà¹àžàž±àžà¹àžà¹àžàžàž±àžàžàžµàžàžµà¹àžªàž£à¹àž²àž  
+
+buildcol.cachedir:àž£àž°àžàžàžàž°àžªàž£à¹àž²àžàžàž­àž¥à¹àž¥àžàžàž±àžàžàž±à¹àž§àžàž£àž²àž§àžàžµà¹àžàžµà¹àžà¹àž­àžàžàž³àžªàž³à¹àžàž²à¹àžàž¢àž±àžà¹àžà¹àž£àžàžàž­àž£àžµàžàž²àž£àžªàž£à¹àž²àž  
+
+buildcol.cannot_open_cfg_file:àžàž³à¹àžàž·àž­àž: à¹àž¡à¹àžªàž²àž¡àž²àž£àžà¹àžàžŽàžà¹àžà¹àž¡àžàž³àž«àžàžàžà¹àž²à¹àžàž·à¹àž­àžàž£àž±àžàžàž£àžžàž %s à¹àžà¹  
+
+buildcol.collectdir:à¹àžªà¹àžàžàž²àžàžàž­àžà¹àžà¹àž£àžàžàž­àž£àžµ "collect"  
+
+buildcol.copying_back_cached_build:àžàž³àž¥àž±àžàžªàž³à¹àžàž²àžàž¥àž±àžà¹àžàž¢àž±àžàžàž²àž£àžªàž£à¹àž²àžàžàžµà¹à¹àžà¹àžà¹àžàž«àžà¹àž§àž¢àžàž§àž²àž¡àžàž³  
+
+buildcol.create_images:àžàž¢àž²àž¢àž²àž¡àžªàž£à¹àž²àžàž£àž¹àžà¹àž£àžŽà¹àž¡àžà¹àžàžªàž³àž«àž£àž±àžàžàž­àž¥à¹àž¥àžàžàž±àžà¹àž«àž¡à¹ àžàž¶à¹àžàžàž¶à¹àžàž­àž¢àž¹à¹àžàž±àžàž§à¹àž² àžàžžàžà¹àžà¹àžàžŽàžàžàž±à¹àž Gimp àžàž£à¹àž­àž¡àžà¹àž§àž¢à¹àž¡àžàž¹àž¥ perl àžàžµà¹à¹àžàžµà¹àž¢àž§àžà¹àž­àžà¹àžàž·à¹àž­à¹àž«à¹àžªàž²àž¡àž²àž£àžà¹àž£àžµàž¢àžà¹àžà¹àžªàžàž£àžŽàžàžà¹àžàž²àž perl à¹àž£àžµàž¢àžàž£à¹àž­àž¢à¹àž¥à¹àž§  
+
+buildcol.debug:àžàžŽàž¡àžà¹àžàž¥àž¥àž±àžàžà¹à¹àžàž¢àž±àž STDOUT  
+
+buildcol.desc:àžªàžàž£àžŽàžàžà¹ Perl àžàžµà¹à¹àžà¹àžªàž£à¹àž²àžàžàž­àž¥à¹àž¥àžàžàž±àžàžàž£àžµàžàžªà¹àžàžàžàž²àžà¹àž­àžàžªàž²àž£àžàž±àžà¹àžà¹àžàžàž²àž§àž£  
+
+buildcol.faillog:àžàž·à¹àž­à¹àžà¹àž¡àžàž±àžàžàž¶àžàžàž§àž²àž¡àž¥à¹àž¡à¹àž«àž¥àž§ à¹àžà¹àž¡àžàž±àžàžàž¶àžàžàžµà¹àžàž°à¹àžà¹àžàžàž·à¹àž­à¹àžà¹àž¡àžàž­àžà¹àžà¹àž¡à¹àžà¹ àžàžµà¹à¹àž¡à¹àžªàž²àž¡àž²àž£àžàžàž£àž°àž¡àž§àž¥àžàž¥à¹àžà¹  
+
+buildcol.incremental_default_builddir:àžàž³à¹àžàž·àž­àž: à¹àžà¹àž£àžàžàž­àž£àžµàžàž²àž£àžªàž£à¹àž²àžàžàž°àž¡àžµàžà¹àž²à¹àž£àžŽà¹àž¡àžà¹àžà¹àžà¹àž 'building' àž«àž²àžàžàžžàžàžà¹àž­àžàžàž²àž£à¹àžàžŽà¹àž¡à¹àžàžŽàž¡à¹àžà¹àž²à¹àžàž¢àž±àžà¹àžà¹àž£àžàžàž­àž£àžµàžàž±àžàžàžµ àžàž£àžžàžàž²à¹àžà¹àžàž±àž§à¹àž¥àž·àž­àž "-builddir index" à¹àž«à¹àžàž±àž buildcol.pl.  
+
+buildcol.index:àžàž±àžàžàžµàžàžµà¹àžàž°à¹àžà¹àžªàž£à¹àž²àž (àžàž°àžªàž£à¹àž²àžàžàž±à¹àžàž«àž¡àžà¹àžà¹àžà¹àž¡àžàž³àž«àžàžàžà¹àž²àžà¹àž²à¹àž¡à¹àž¡àžµàžàž²àž£àžàž±à¹àžàžà¹àž²à¹àž§à¹)  
+
+buildcol.incremental:à¹àžàžàž²àž°à¹àž­àžàžªàž²àž£àžàž±àžàžàžµàžàžµà¹àž¢àž±àžà¹àž¡à¹à¹àžàž¢àžàž±àžàžàž³àžàž±àžàžàžµàž¡àž²àžà¹àž­àžà¹àžà¹àž²àžàž±à¹àž àž«àž¡àž²àž¢àžàž¶àž -keepold à¹àžàž¢àžàž¶à¹àžàž­àž¢àž¹à¹àžàž±àžàžàž±àž§àžàž³àžàž±àžàžàžµ lucene  
+
+buildcol.keepold:àžàž°à¹àž¡à¹àžàž³àž¥àž²àž¢à¹àžàž·à¹àž­àž«àž²àžàž±àžàžàžžàžàž±àžàžàž­àžà¹àžà¹àž£àžàžàž­àž£àžµàžàž²àž£àžªàž£à¹àž²àž  
+
+buildcol.maxdocs:àžàž³àžàž§àžàžªàž¹àžàžªàžžàžàžàž­àžà¹àž­àžàžªàž²àž£àžàžµà¹àžà¹àž­àžàžàž²àž£àžªàž£à¹àž²àž  
+buildcol.maxnumeric:àžàž³àžàž§àžàž«àž¥àž±àžàžªàž¹àžàžªàžžàžàžàžµà¹ 'àžàž³' àžªàž²àž¡àž²àž£àžàž¡àžµà¹àžà¹à¹àžàžàžàžàž²àžàžžàžàž£àž¡àžàž±àžàžàžµ àžàž±àž§à¹àž¥àžàžàžµà¹àž¡àžµàžàž³àžàž§àžàž«àž¥àž±àžàž¡àž²àžàžàž°àžàž¹àžà¹àžà¹àžàž­àž­àžà¹àžà¹àžàž«àž¥àž²àž¢àžàž³à¹àžàž·à¹àž­àžàž±àžàžàž³àžàž±àžàžàžµ  àžàž±àž§àž­àž¢à¹àž²àžà¹àžà¹àž àžà¹àž²àžà¹àž² maxnumeric àž¡àžµàžà¹àž² 4 à¹àž¥àž "1342663" àžàž°àžàž¹àžà¹àžà¹àžà¹àžà¹àž "1342" à¹àž¥àž° "663"  
+buildcol.mode:àžªà¹àž§àžàžà¹àž²àžà¹ àžàž­àžàžàž£àž°àžàž§àžàžàž²àž£àžªàž£à¹àž²àžàžàžµà¹àžàž°àžàž³à¹àžàžŽàžàžàž²àž£  
+buildcol.mode.all:àžàž³àžàžžàžàž­àž¢à¹àž²àž  
+buildcol.mode.build_index:à¹àžàžµàž¢àžàžàž±àžàžàž³àžàž±àžàžàžµàžà¹àž­àžàž§àž²àž¡  
+buildcol.mode.compress_text:à¹àžàžµàž¢àžàžàžµàžàž­àž±àžàžà¹àž­àžàž§àž²àž¡  
+buildcol.mode.infodb:à¹àžàžµàž¢àžàžªàž£à¹àž²àžàžàž²àžàžà¹àž­àž¡àž¹àž¥à¹àž¡àžàž²àžàž²àžàž²  
+
+buildcol.no_default_images:àž£àž°àžàžàžàž°à¹àž¡à¹àžªàž£à¹àž²àžàž£àž¹àžà¹àž£àžŽà¹àž¡àžà¹àž  
+
+buildcol.no_image_script:àžàž³à¹àžàž·àž­àž: à¹àž¡à¹àžàžàžªàžàž£àžŽàžàžà¹àžàžµà¹àžªàž£à¹àž²àžàž£àž¹àž: %s  
+
+buildcol.no_strip_html:à¹àž¡à¹àžàž§àž£à¹àž¢àžà¹àžà¹àž html àž­àž­àžàžàž²àžàžà¹àž­àž¡àž¹àž¥àžàžµà¹àžàž±àžàžàž³àžàž±àžàžàžµà¹àž¥à¹àž§ (à¹àžà¹àžªàž³àž«àž£àž±àžàžàž­àž¥à¹àž¥àžàžàž±àž mgpp à¹àžà¹àž²àžàž±à¹àž)  
+
+buildcol.no_text:àžàž£àžžàžàž²àž­àž¢à¹àž²àžàž±àžà¹àžà¹àžàžà¹àž­àžàž§àž²àž¡àžàžµà¹àžàž¹àžàžàžµàžàž­àž±àž àžàž±àž§à¹àž¥àž·àž­àžàžàžµà¹àž¡àžµàžàž£àž°à¹àž¢àžàžà¹à¹àžàžàž²àž£àž¥àžàžàžàž²àžàžàž­àžàžàž±àžàžàžµàžàžµà¹àžªàž£à¹àž²àžàžàž¶à¹àžàžà¹àž²àžàžžàžàžàž±à¹àžà¹àžàžàž°à¹àžªàžàžà¹àž­àžàžªàž²àž£àžà¹àžàžàžàž±àžà¹àž¡àž·à¹àž­à¹àž£àžµàž¢àžà¹àžà¹àž£àž°àžàž (à¹àžà¹àž àžàžžàžà¹àž¡à¹àžªàž²àž¡àž²àž£àžàžà¹àžàžàž·àžàž£àžžà¹àžàžàž­àžàžà¹àž­àžàž§àž²àž¡àžàžµà¹àžàž¹àžàžàžµàžàž­àž±àžà¹àžà¹)  
+
+buildcol.sections_index_document_metadata:àžàž±àžàžàž³àžàž±àžàžàžµà¹àž¡àžàž²àžàž²àžàž²àž£àž°àžàž±àžà¹àž­àžàžªàž²àž£àžàžµà¹àž£àž°àžàž±àžàžªà¹àž§àž  
+buildcol.sections_index_document_metadata.never:àžàž£àžžàžàž²àž­àž¢à¹àž²àžàž±àžàžàž³àžàž±àžàžàžµà¹àž¡àžàž²àžàž²àžàž²à¹àž­àžàžªàž²àž£à¹àžà¹ àžàžµà¹àž£àž°àžàž±àžàžªà¹àž§àž  
+buildcol.sections_index_document_metadata.always:à¹àžàžŽà¹àž¡à¹àž¡àžàž²àžàž²àžàž²àž£àž°àžàž±àžà¹àž­àžàžªàž²àž£àžàžµà¹àž£àž°àžàžžàžàž±à¹àžàž«àž¡àžà¹àž¡à¹àž§à¹àž²àžàž°àž¡àžµà¹àž¡àžàž²àžàž²àžàž²àž£àž°àžàž±àžàžªà¹àž§àžàžàž­àžàžàž·à¹àž­àžàž±à¹àžàž­àž¢àž¹à¹à¹àž¥à¹àž§  
+buildcol.sections_index_document_metadata.unless_section_metadata_exists:à¹àžàžµàž¢àžà¹àžàžŽà¹àž¡à¹àž¡àžàž²àžàž²àžàž²àž£àž°àžàž±àžà¹àž­àžàžªàž²àž£àžà¹àž²à¹àž¡à¹àž¡àžµà¹àž¡àžàž²àžàž²àžàž²àž£àž°àžàž±àžàžªà¹àž§àžàžàž­àžàžàž·à¹àž­àžàž±à¹àžàž­àž¢àž¹à¹  
+
+buildcol.out:àžàž·à¹àž­à¹àžà¹àž¡àž«àž£àž·àž­àž«àž¡àž²àž¢à¹àž¥àžàž­à¹àž²àžàž­àžŽàžàžàžµà¹àžàž°àžàžŽàž¡àžà¹àžªàžàž²àžàž°àžàž­àžàžàž¥àž¥àž±àžàžà¹àž¥àžà¹àž  
+
+buildcol.params:[àžàž±àž§à¹àž¥àž·àž­àž] àžàž­àž¥à¹àž¥àžàžàž±àž-àžàž·à¹àž­  
+
+buildcol.remove_empty_classifications:àžà¹àž­àžàžàž±àž§à¹àž¢àžàžàž£àž°à¹àž àžàž§à¹àž²àž à¹àž¥àž°à¹àž«àžàžàžàž²àž£à¹àž¢àžàžàž£àž°à¹àž àž (àžàž¶à¹àžà¹àž¡à¹àž¡àžµà¹àž­àžàžªàž²àž£à¹àžà¹)  
+
+buildcol.removeold:àžàž°à¹àž­àž²à¹àžàž·à¹àž­àž«àž²à¹àžà¹àž²àžàž­àžà¹àžà¹àž£àžàžàž­àž£àžµàžàž²àž£àžªàž£à¹àž²àžàž­àž­àžà¹àž  
+
+buildcol.unlinked_col_images:àž­àž²àžàžàž°à¹àžàž·à¹àž­àž¡à¹àž¢àžàž£àž¹àžàžàž­àžàžàž­àž¥à¹àž¥àžàžàž±àžà¹àž¡à¹àžàž¹àžàžà¹àž­àž  
+
+buildcol.unknown_mode:à¹àž«àž¡àžàžàžµà¹à¹àž¡à¹àž£àž¹à¹àžàž±àž: %s  
+
+buildcol.updating_archive_cache:àžàž³àž¥àž±àžàžàž£àž±àžàžàž£àžžàžàž«àžà¹àž§àž¢àžàž§àž²àž¡àžàž³à¹àžàžàžàžµà¹à¹àžà¹àžàžàž²àž§àž£  
+
+buildcol.verbosity:àžàž§àžàžàžžàž¡àžàž£àžŽàž¡àž²àžàžàž­àžàžàž¥àž¥àž±àžàžà¹  0=à¹àž¡à¹àž¡àžµ  3=àžàž³àžàž§àžàž¡àž²àž  
+
+
+# -- classinfo.pl --
+
+classinfo.collection:àžàž²àž£à¹àž«à¹àžàž·à¹àž­àžàž­àž¥à¹àž¥àžàžàž±àžàžàž°àžàž³à¹àž«à¹ classinfo.pl àžà¹àžàž«àž²à¹àž collect/collection-name/perllib/classify àžà¹àž­àž  àžà¹àž²à¹àž¡à¹àžàžàžàž±àž§à¹àž¢àžàžàž£àž°à¹àž àž classinfo.pl àžàž°àžà¹àžàž«àž²à¹àžà¹àžà¹àž£àžàžàž­àž£àžµ perllib/classify àžàž±à¹àž§à¹àž  
+
+classinfo.desc:àžàžŽàž¡àžà¹àžà¹àž­àž¡àž¹àž¥à¹àžàžµà¹àž¢àž§àžàž±àžàžàž±àž§à¹àž¢àžàžàž£àž°à¹àž àž  
+
+classinfo.general_options:àžàž±àž§à¹àž¥àž·àž­àžàžàž±à¹àž§à¹àžàžàž°à¹àžà¹àž£àž±àžàžàž²àž£àžªàž·àžàžàž­àžàž¡àž²àžàž²àžàžàž¥àž²àžªà¹àž¡à¹àžàž­àžàžàž±àž§à¹àž¢àžàžàž£àž°à¹àž àž  
+
+classinfo.info:info  
+
+classinfo.no_classifier_name:àžà¹àž­àžàžŽàžàžàž¥àž²àž: àžàžžàžàžà¹àž­àžà¹àžªà¹àžàž·à¹àž­àžàž­àžàžàž±àž§à¹àž¢àžàžàž£àž°à¹àž àž  
+
+classinfo.option_types:àžàž±àž§à¹àž¢àžàžàž£àž°à¹àž àžàž­àž²àžà¹àžà¹àžàž±àž§à¹àž¥àž·àž­àžàžªàž­àžàžàžàžŽàž  
+
+classinfo.params:[àžàž±àž§à¹àž¥àž·àž­àž] àžàž±àž§à¹àž¢àžàžàž£àž°à¹àž àž-àžàž·à¹àž­  
+
+classinfo.passing_options:àžàž±àž§à¹àž¥àž·àž­àžàž­àž²àžàžàž¹àžàžªà¹àžàžà¹àž²àžà¹àžàž¢àž±àžàžàž±àž§à¹àž¢àžàžàž£àž°à¹àž àžà¹àžà¹ àžà¹àž§àž¢àžàž²àž£àž£àž§àž¡àžàž±àž§à¹àž¥àž·àž­àžà¹àž«àž¥à¹àž²àžàž±à¹àžàž¥àžà¹àžà¹àžà¹àž¡àžàž³àž«àžàžàžà¹àž² collect.cfg àžàž­àžàžàžžàž  
+
+classinfo.specific_options:àžàž±àž§à¹àž¥àž·àž­àžà¹àžàžàž²àž°àžàž°àžàž¹àžàžàž³àž«àžàžà¹àž§à¹àž àž²àž¢à¹àžàžàž±àž§à¹àž¢àžàžàž£àž°à¹àž àžà¹àž­àž à¹àž¥àž°àžªàž²àž¡àž²àž£àžà¹àž£àžµàž¢àžà¹àžà¹àžàž²àžà¹àžà¹àžàž±àžàžàž±àž§à¹àž¢àžàžàž£àž°à¹àž àžàžàžŽà¹àžšàž©àžàžµà¹à¹àžà¹àž²àžàž±à¹àž  
+
+# -- downloadfrom.pl --
+downloadfrom.cache_dir:àžàžµà¹àžàž±à¹àžàžàž­àžà¹àžà¹àž£àžàžàž­àž£àžµàž«àžà¹àž§àž¢àžàž§àž²àž¡àžàž³à¹àžàž  
+downloadfrom.desc:àžàž²àž§àžà¹à¹àž«àž¥àžà¹àžà¹àž¡àžàž²àžà¹àžàžŽàž£à¹àžà¹àž§àž­àž£à¹àž àž²àž¢àžàž­àž  
+downloadfrom.download_mode:àžàžàžŽàžàžàž­àžà¹àžàžŽàž£à¹àžà¹àž§àž­àž£à¹àžàžµà¹àžàž°àžàž²àž§àžà¹à¹àž«àž¥àž  
+downloadfrom.download_mode.Web:HTTP  
+downloadfrom.download_mode.MediaWiki:à¹àž§à¹àžà¹àžàžà¹ MediaWiki  
+downloadfrom.download_mode.OAI:Open Archives Initiative  
+downloadfrom.download_mode.z3950:à¹àžàžŽàž£à¹àžà¹àž§àž­àž£à¹ z3950  
+downloadfrom.download_mode.SRW:SearchRetrieve Webservice  
+downloadfrom.incorrect_mode:àžàž²àž£àž²àž¡àžŽà¹àžàž­àž£à¹ download_mode à¹àž¡à¹àžàž¹àžàžà¹àž­àž  
+downloadfrom.info:àžàžŽàž¡àžà¹àžà¹àž­àž¡àž¹àž¥à¹àžàžµà¹àž¢àž§àžàž±àžà¹àžàžŽàž£à¹àžà¹àž§àž­àž£à¹à¹àžàžàžàž²àž£àžàž²àž§àžà¹à¹àž«àž¥àž  
+downloadfrom.params:[àžàž±àž§à¹àž¥àž·àž­àžàžàž±à¹àž§à¹àž] [àžàž±àž§à¹àž¥àž·àž­àžàžàž²àž£àžàž²àž§àžà¹à¹àž«àž¥àžà¹àžàžàž²àž°]  
+
+# -- downloadinfo.pl --
+
+downloadinfo.desc:àžàžŽàž¡àžà¹àžà¹àž­àž¡àž¹àž¥à¹àžàžµà¹àž¢àž§àžàž±àžà¹àž¡àžàž¹àž¥àžàž²àž§àžà¹à¹àž«àž¥àž  
+downloadinfo.collection:àžàž²àž£à¹àž«à¹àžàž·à¹àž­àžàž­àž¥à¹àž¥àžàžàž±àžàžàž°àžàž³à¹àž«à¹ downloadinfo.pl àžà¹àžàž«àž²àžà¹àž­àž¡àž¹àž¥à¹àž collect/collection-name/perllib/downloaders àžà¹àž­àž  àžà¹àž²à¹àž¡à¹àžàžà¹àž¡àžàž¹àž¥àžàžµà¹àžàž±à¹àž downloadinfo.pl àžàž°àžà¹àžàž«àž²à¹àžà¹àžà¹àž£àžàžàž­àž£àžµ perllib/downloaders àžàž±à¹àž§à¹àžàžà¹àž­à¹àž  
+downloadinfo.params:[àžàž±àž§à¹àž¥àž·àž­àž] [àžàž²àž§àžà¹à¹àž«àž¥àž-à¹àž¡àžàž¹àž¥]  
+downloadinfo.general_options:àžàž±àž§à¹àž¥àž·àž­àžàžàž±à¹àž§à¹àžàžàž°à¹àžà¹àž£àž±àžàžªàž·àžàžàž­àžàžàž²àžàžàž¥àž²àžªà¹àž¡à¹ (parent classes) àžàž­àžà¹àž¡àžàž¹àž¥àžàž²àž§àžà¹à¹àž«àž¥àž  
+downloadinfo.specific_options:àžàž°àž¡àžµàžàž²àž£àžàž³àž«àžàžàžàž±àž§à¹àž¥àž·àž­àžà¹àžàžàž²àž°à¹àž§à¹à¹àžàžàž±àž§à¹àž¡àžàž¹àž¥àžàž²àž§àžà¹à¹àž«àž¥àžà¹àž­àž à¹àž¥àž°àžªàž²àž¡àž²àž£àžà¹àž£àžµàž¢àžà¹àžà¹àžàž²àžà¹àžà¹àžàž±àžà¹àžàžàž²àž°àžàž±àž§àžàž²àž§àžà¹à¹àž«àž¥àžàžàžµà¹à¹àžà¹àž²àžàž±à¹àž  
+downloadinfo.option_types:à¹àž¡àžàž¹àž¥àžàž²àž§àžà¹à¹àž«àž¥àžàž­àž²àžà¹àžà¹àžàž±àž§à¹àž¥àž·àž­àžàžªàž­àžàžàžàžŽàž  
+
+# -- explode_metadata_database.pl --
+explode.desc:àžàž£àž°àžàž²àž¢àžàž²àžàžà¹àž­àž¡àž¹àž¥à¹àž¡àžàž²àžàž²àžàž²  
+
+explode.collection:àžàž·à¹àž­àžàž­àž¥à¹àž¥àžàžàž±àž àžàž¥àž±à¹àžàž­àžŽàžàžàž²àžàžàž±àž§àžàž°àž¡àž­àžàž«àž²à¹àžà¹àž¡à¹àžªàž£àžŽàž¡à¹àžà¹àžàž¥à¹àžàž­àž£à¹àžàž­àž¥à¹àž¥àžàžàž±àž  
+ 
+explode.document_field:àž­àžàžà¹àžàž£àž°àžàž­àžà¹àž¡àžàž²àžàž²àžàž²àžàžµà¹àž£àž°àžàžžàžàž·à¹àž­à¹àžà¹àž¡àžàž­àžà¹àž­àžàžªàž²àž£à¹àžàž·à¹àž­àž£àž±àžà¹àž¥àž°àž£àž§àž¡àž¥àžà¹àžàžàž­àž¥à¹àž¥àžàžàž±àž  
+
+explode.document_prefix:àžàž³àžàž³àž«àžà¹àž²àžªàž³àž«àž£àž±àžàžàžµà¹àžàž±à¹àžà¹àž­àžàžªàž²àž£ (àžªàž³àž«àž£àž±àžà¹àžà¹àžàž±àžàžàž±àž§à¹àž¥àž·àž­àž document_field)  
+
+explode.document_suffix:àžàž³àž¥àžàžà¹àž²àž¢àžªàž³àž«àž£àž±àžàžàžµà¹àžàž±à¹àžà¹àž­àžàžªàž²àž£ (àžªàž³àž«àž£àž±àžà¹àžà¹àžàž±àžàžàž±àž§à¹àž¥àž·àž­àž document_field)  
+
+explode.encoding:àžàž²àž£à¹àžà¹àž²àž£àž«àž±àžªàžàžµà¹àžàž°à¹àžà¹à¹àž¡àž·à¹àž­àž¡àžµàžàž²àž£àž­à¹àž²àžà¹àžà¹àžà¹àž¡àžàž²àžàžà¹àž­àž¡àž¹àž¥  
+explode.metadata_set:àžàžžàžà¹àž¡àžàž²àžàž²àžàž² (à¹àžàž¡àžªà¹àžàž) à¹àžàž·à¹àž­àžªà¹àžàž­àž­àžà¹àž¡àžàž²àžàž²àžàž²àžàž±à¹àžàž«àž¡àžà¹àžà¹àž  
+explode.plugin:àžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹à¹àžà¹àžªàž³àž«àž£àž±àžàžàž²àž£àžàž£àž°àžàž²àž¢  
+explode.plugin_options:àžàž±àž§à¹àž¥àž·àž­àžàžàžµà¹àžàž°àžªà¹àžàžà¹àž²àžà¹àžàž¢àž±àžàžàž¥àž±à¹àžàž­àžŽàžàžà¹àž­àžàžàž³àžàž²àž£àžàž£àž°àžàž²àž¢à¹àžà¹àž¡ àžàž·à¹àž­àžàž­àžàžàž±àž§à¹àž¥àž·àž­àžàžàž°àžà¹àž­àžàžàž¶à¹àžàžà¹àžàžà¹àž§àž¢ - à¹àžàž¢àž¡àžµàžà¹àž­àžàž§à¹àž²àžàž£àž°àž«àž§à¹àž²àžàžàž·à¹àž­àžàž±àž§à¹àž¥àž·àž­àžà¹àž¥àž°àžà¹àž²àžàž­àžàžàž±àž§à¹àž¥àž·àž­àž  
+explode.params:[àžàž±àž§à¹àž¥àž·àž­àž] àžàž·à¹àž­à¹àžà¹àž¡  
+explode.records_per_folder:àžàž³àžàž§àžàž£àž°à¹àžàžµàž¢àžàžàžµà¹àžàž°à¹àžªà¹àž¥àžà¹àžà¹àžà¹àž¥àž°à¹àžàž¥à¹àžàž­àž£à¹àž¢à¹àž­àž¢  
+
+# -- replace_srcdoc_with_html.pl --
+srcreplace.desc:à¹àžàžàžàžµà¹à¹àž­àžàžªàž²àž£àžà¹àžàžàžàž±àžàžà¹àž§àž¢à¹àžà¹àž¡ HTML àžàžµà¹àžªàž£à¹àž²àžàžàž¶à¹àžàžàžàž°àžªàž£à¹àž²àžàžàž­àž¥à¹àž¥àžàžàž±àžà¹àž«àž¡à¹  
+srcreplace.params:[àžàž±àž§à¹àž¥àž·àž­àž] àžàž·à¹àž­à¹àžà¹àž¡  
+srcreplace.plugin:àžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹à¹àžà¹à¹àžàžàž²àž£à¹àžàž¥àžà¹àž­àžàžªàž²àž£àžà¹àžàžàžàž±àž  
+
+# -- exportcol.pl --
+
+exportcol.out:àžàž·à¹àž­à¹àžà¹àž¡àž«àž£àž·àž­àž«àž¡àž²àž¢à¹àž¥àžàž­à¹àž²àžàž­àžŽàžàžàžµà¹àžàž°àžàžŽàž¡àžà¹àžªàžàž²àžàž°àžàž¥àž¥àž±àžàžà¹à¹àžàž¢àž±àž  
+exportcol.cddir:àžàž·à¹àž­àžàž­àžà¹àžà¹àž£àžàžàž­àž£àžµàžàž¥àž²àž¢àžàž²àžàžàžµà¹àžàž°àžªà¹àžàž­àž­àžà¹àžàž·à¹àž­àž«àž²àžàžµàžàžµà¹àžàž¢àž±àž  
+exportcol.cdname:àžàž·à¹àž­àžàž­àžàžàžµàžàžµàž£àž­àž¡ -- àžàž°à¹àžà¹àžàžªàžŽà¹àžàžàžµà¹àžàž£àž²àžàžà¹àžà¹àž¡àžàž¹à¹àž£àžŽà¹àž¡àžàž±àžàžàžµàžàžµà¹à¹àžà¹àžàžŽàžàžàž±à¹àžàžàžµàžàžµàž£àž­àž¡  
+exportcol.desc:àžªàžàž£àžŽàžàžà¹ PERL àžàžµà¹à¹àžà¹àžªà¹àžàž­àž­àžàžàž­àž¥à¹àž¥àžàžàž±àžàž­àž¢à¹àž²àžàžà¹àž­àž¢àž«àžàž¶à¹àžàžàž­àž¥à¹àž¥àžàžàž±àžà¹àžàž¢àž±àžàžàžµàžàžµàž£àž­àž¡àžàž­àžàž§àžŽàžà¹àžàžªà¹  
+exportcol.noinstall:àžªàž£à¹àž²àžàžàžµàžàžµàž£àž­àž¡àžàžµà¹à¹àž¥àžàž£àž²àž£àžµàžªàž²àž¡àž²àž£àžà¹àž£àžµàž¢àžà¹àžà¹àžàž²àžàžàžµàžàžµàž£àž­àž¡à¹àžà¹à¹àžàž¢àžàž£àž à¹àž¥àž°à¹àž¡à¹àžà¹àž­àžàžàžŽàžàžàž±à¹àžàžªàžŽà¹àžà¹àžàžàžµà¹àžàž­àž¡àžàžŽàž§à¹àžàž­àž£à¹à¹àž¡à¹àžà¹àž²àž¢  
+exportcol.params:"[àžàž±àž§à¹àž¥àž·àž­àž] collection-name1, collection-name2..."  
+exportcol.coll_not_found:àž¥àž°à¹àž§à¹àžàžàž­àž¥à¹àž¥àžàžàž±àž %s àžàžµà¹à¹àž¡à¹àžàž¹àžàžà¹àž­àž: à¹àž¡à¹àžàžàžàž­àž¥à¹àž¥àžàžàž±àžàžàžµà¹ %s  
+exportcol.coll_dirs_not_found:àž¥àž°à¹àž§à¹àžàžàž­àž¥à¹àž¥àžàžàž±àž %s àžàžµà¹à¹àž¡à¹àžàž¹àžàžà¹àž­àž: à¹àž¡à¹àžàžàž«àžàž¶à¹àžà¹àžà¹àžà¹àž£àžàžàž­àž£àžµàžà¹àž­à¹àžàžàžµà¹:  
+exportcol.fail:exportcol.pl àž¥à¹àž¡à¹àž«àž¥àž§:  
+exportcol.no_valid_colls:àžàžžàžàž¢àž±àžà¹àž¡à¹à¹àžà¹àž£àž°àžàžžàžàž­àž¥à¹àž¥àžàžàž±àžàžàžµà¹àžàž¹àžàžà¹àž­àžà¹àžàž·à¹àž­àžªà¹àžàž­àž­àž  
+exportcol.couldnt_create_dir:à¹àž¡à¹àžªàž²àž¡àž²àž£àžàžªàž£à¹àž²àžà¹àžà¹àž£àžàžàž­àž£àžµ %s à¹àžà¹  
+exportcol.couldnt_create_file:à¹àž¡à¹àžªàž²àž¡àž²àž£àžàžªàž£à¹àž²àž %s à¹àžà¹  
+exportcol.instructions:à¹àž¡àž·à¹àž­àžà¹àž­àžàžàž²àž£àžªàž£à¹àž²àžàžàžµàžàžµàž£àž­àž¡àžàž­àžàž§àžŽàžà¹àžàžªà¹à¹àžàžàžàžŽàžàžàž±à¹àžà¹àžà¹à¹àž­àž à¹àž«à¹à¹àžàžµàž¢àžà¹àžàž·à¹àž­àž«àž²àžàž­àžà¹àžàž¥à¹àžàž­àž£à¹àžàžµà¹àž¥àžà¹àžà¹àžàžàžµàžàžµàž£àž­àž¡  
+exportcol.non_exist_files:à¹àž¡à¹àž¡àžµà¹àžà¹àž¡àžàžµà¹àžàž³à¹àžà¹àžàžà¹àž­à¹àžàžàžµà¹àž­àž¢à¹àž²àžàžà¹àž­àž¢àž«àžàž¶à¹àžà¹àžà¹àž¡ à¹àž¥àž°à¹àžà¹àž£àžàžàž­àž£àžµàž­àž¢à¹àž²àžàžà¹àž­àž¢àž«àžàž¶à¹àžà¹àžà¹àž£àžàžàž­àž£àžµàž­àž¢àž¹à¹:  
+exportcol.success:exportcol.pl àžàž³àžàž²àžà¹àžªàž£à¹àžà¹àž£àžµàž¢àžàž£à¹àž­àž¢à¹àž¥à¹àž§:  
+exportcol.output_dir:àžàž­àž¥à¹àž¥àžàžàž±àžàžàžµà¹àžªà¹àžàž­àž­àž (%s) àž­àž¢àž¹à¹à¹àž %s  
+exportcol.export_coll_not_installed:àžàžžàžàž¢àž±àžà¹àž¡à¹à¹àžà¹àžàžŽàžàžàž±à¹àžàžàž²àž£à¹àžà¹àžàž²àžàžàž²àž£àžªà¹àžàž­àž­àžà¹àžàž¢àž±àžàžàžµàžàžµàž£àž­àž¡  
+
+# -- import.pl --
+
+import.archivedir:àžàžµà¹àžàž±àžà¹àžà¹àžà¹àžàž·à¹àž­àž«àž²àžàžµà¹à¹àžàž¥àžà¹àž¥à¹àž§  
+
+import.manifest:à¹àžà¹àž¡ XML àžàžµà¹à¹àž«à¹àž£àž²àž¢àž¥àž°à¹àž­àžµàž¢àžàž§à¹àž²à¹àžà¹àž¡à¹àžàžà¹àž²àžàžàžµà¹àžàž°àžàž¹àžàžàž³à¹àžà¹àž²  à¹àž«à¹à¹àžà¹à¹àžàžàžàž²àž£àžàž±àžà¹àž£àžµàž¢àžà¹àžàž¥à¹àžàž­àž£à¹àžàž³à¹àžà¹àž²àžàž²àžàž¡àž²àžà¹àžàžà¹àž­àž¢à¹àžàžàž§àžàžà¹àž³àžàž¶à¹àžàžàžàžàžŽà¹àž¥à¹àž§àžàž°à¹àžà¹àžªàž³àž«àž£àž±àžàžàž²àž£àžªàž£à¹àž²àžàžàž­àž¥à¹àž¥àžàžàž±àžà¹àžàžà¹àžàžŽà¹àž¡  
+
+import.cannot_open_stats_file:àžàž³à¹àžàž·àž­àž: à¹àž¡à¹àžªàž²àž¡àž²àž£àžà¹àžàžŽàžà¹àžà¹àž¡àžªàžàžŽàžàžŽ %s à¹àžà¹  
+
+import.cannot_open_fail_log:àžà¹àž­àžàžŽàžàžàž¥àž²àž: à¹àž¡à¹àžªàž²àž¡àž²àž£àžà¹àžàžŽàžà¹àžà¹àž¡àžàž±àžàžàž¶àžàžàž§àž²àž¡àž¥à¹àž¡à¹àž«àž¥àž§ %s à¹àžà¹  
+
+import.cannot_sort:àžàž³à¹àžàž·àž­àž: import.pl à¹àž¡à¹àžªàž²àž¡àž²àž£àžà¹àž£àžµàž¢àžàž¥àž³àžàž±àžà¹àž­àžàžªàž²àž£à¹àžà¹à¹àž¡àž·à¹àž­ groupsize > 1   àžàž±àž§à¹àž¥àž·àž­àž sortmeta àžàž°àžàž¹àžàž¥àž°à¹àž§à¹àž  
+
+import.collectdir:à¹àžªà¹àžàžàž²àžàžàž­àžà¹àžà¹àž£àžàžàž­àž£àžµ "collect"  
+
+import.complete:àžàž²àž£àžàž³à¹àžà¹àž²à¹àžªàž£à¹àžàžªàž¡àžàž¹àž£àžà¹  
+
+import.debug:àžàžŽàž¡àžà¹àžà¹àž­àžàž§àž²àž¡àžàžµà¹àžàž³à¹àžà¹àž²à¹àžàž¢àž±àž STDOUT (àžªàž³àž«àž£àž±àžàžàž²àž£àžàž³à¹àžà¹àž² GreenstoneXML)  
+
+import.desc:àžªàžàž£àžŽàžàžà¹ Perl àžàžµà¹à¹àžà¹àžàž³à¹àžà¹àž²à¹àžà¹àž¡à¹àž«à¹àž­àž¢àž¹à¹à¹àžàž£àž¹àžà¹àžàž (GreenstoneXML àž«àž£àž·àž­ GreenstoneMETS) àžàžµà¹àžàž£à¹àž­àž¡àžªàž³àž«àž£àž±àžàžàž²àž£àžªàž£à¹àž²àž  
+
+import.faillog:àžàž·à¹àž­à¹àžà¹àž¡àžàž±àžàžàž¶àžàžàžµà¹àž¥à¹àž¡à¹àž«àž¥àž§ à¹àžà¹àž¡àžàž±àžàžàž¶àžàžàžµà¹àžàž°àžàž±àžà¹àžà¹àžàžàž·à¹àž­à¹àžà¹àž¡àžàž­àžà¹àžà¹àž¡à¹àžà¹ àžàžµà¹à¹àž¡à¹àžªàž²àž¡àž²àž£àžàžàž£àž°àž¡àž§àž¥àžàž¥à¹àžà¹  
+
+import.groupsize:àžàž³àžàž§àžàžàž­àžà¹àž­àžàžªàž²àž£àžàž³à¹àžà¹àž²àžàžµà¹àžàž±àžàžàž¥àžžà¹àž¡àž¥àžà¹àžà¹àžà¹àž¡ XMLà¹àžà¹àž¡à¹àžàžµàž¢àž§  
+
+import.gzip:à¹àžà¹à¹àžàž£à¹àžàž£àž¡ gzip à¹àžàž·à¹àž­àžàžµàžàž­àž±àžà¹àž­àžàžªàž²àž£ XML àžàžµà¹à¹àžà¹àžàžàž¥àž¥àž±àžàžà¹ (àž­àž¢à¹àž²àž¥àž·àž¡àž£àž§àž¡ ZIPPlugin àž¥àžà¹àžàž£àž²àž¢àžàž²àž£àžàž¥àž±à¹àžàž­àžŽàžàžàž­àžàžàžžàžà¹àž¡àž·à¹àž­àž¡àžµàžàž²àž£àžªàž£à¹àž²àžàžàž²àžà¹àž­àžàžªàž²àž£àžàžµà¹àžàž¹àžàžàžµàžàž­àž±àž)  
+
+import.importdir:àžàžµà¹àžàž±àžà¹àžà¹àžà¹àž­àžàžªàž²àž£àžà¹àžàžàžàž±àžàž­àž¢àž¹à¹  
+
+import.incremental:àžàž³à¹àžà¹àž²à¹àžàžàž²àž°à¹àž­àžàžªàž²àž£àžàžµà¹à¹àž«àž¡à¹ (àžàž¹àžàž²àžàžàž²àž£àž¥àžàžàž±àžàžàž¶àžà¹àž§àž¥àž²) àžàž§à¹àž²à¹àžà¹àž¡àžàžµà¹à¹àžà¹àžàžàž²àž§àž£à¹àžàžàž±àžàžàžžàžàž±àž àž«àž¡àž²àž¢àžàž¶àž -keepold  
+
+import.keepold:àžàž°à¹àž¡à¹àžàž³àž¥àž²àž¢à¹àžàž·à¹àž­àž«àž²àžàž±àžàžàžžàžàž±àžàžàž­àžà¹àžà¹àž£àžàžàž­àž£àžµàžàžµà¹à¹àžà¹àžàžàž²àž§àž£  
+
+import.maxdocs:àžàž³àžàž§àžàžªàž¹àžàžªàžžàžàžàž­àžà¹àž­àžàžªàž²àž£àžàžµà¹àžªàž²àž¡àž²àž£àžàžàž³à¹àžà¹àž²à¹àžà¹  
+
+import.no_import_dir:àžà¹àž­àžàžŽàžàžàž¥àž²àž: à¹àž¡à¹àžàžà¹àžà¹àž£àžàžàž­àž£àžµàžàž³à¹àžà¹àž² (%s)  
+
+import.no_plugins_loaded:àžà¹àž­àžàžŽàžàžàž¥àž²àž: àž¢àž±àžà¹àž¡à¹à¹àžà¹à¹àž«àž¥àžàžàž¥àž±à¹àžàž­àžŽàž  
+
+import.OIDtype:àž§àžŽàžàžµàžàž²àž£àžàžµà¹àžàž°à¹àžà¹à¹àž¡àž·à¹àž­àž¡àžµàžàž²àž£àžªàž£à¹àž²àžàžàž±àž§àž£àž°àžàžžàžàžµà¹à¹àž¡à¹àžà¹àž³àžàž±àžàžªàž³àž«àž£àž±àžà¹àžà¹àž¥àž°à¹àž­àžàžªàž²àž£  
+import.OIDtype.hash:àžàž³à¹àžàž·à¹àž­àž«àž²àžàž­àžà¹àžà¹àž¡àžàž¥àž±àžàž¡àž²àžàž³à¹àž«àž¡à¹ àžàž±àž§àž£àž°àžàžžà¹àž­àžàžªàž²àž£àžàž°à¹àžà¹àžàžàž±àž§à¹àžàžµàž¢àž§àžàž±àžàžàžžàžàžàž£àž±à¹àžà¹àž¡àž·à¹àž­àž¡àžµàžàž²àž£àžàž³à¹àžà¹àž²àžàž­àž¥à¹àž¥àžàžàž±àž  
+
+import.OIDtype.incremental:à¹àžà¹àžàž²àž£àžàž±àžà¹àž­àžàžªàž²àž£àž­àž¢à¹àž²àžàžà¹àž²àž¢  àžàž¶à¹àžàžàž°à¹àž£à¹àž§àžàž§à¹àž² "à¹àž®àž" àž¡àž²àž à¹àžà¹àžàž°à¹àž¡à¹àžàž³àž«àžàžàžàž±àž§àž£àž°àžàžžàžàž±àž§à¹àžàžµàž¢àž§àžàž±àžà¹àž«à¹àžàž±àžà¹àžàž·à¹àž­àž«àž²à¹àž­àžàžªàž²àž£à¹àžàžµàž¢àž§àžàž±àž à¹àž¥àž°à¹àž¡à¹àžªàž²àž¡àž²àž£àžà¹àžàžŽà¹àž¡à¹àž­àžàžªàž²àž£àž¥àžà¹àžàžàžµà¹à¹àžà¹àžàžàž²àž§àž£àžàžµà¹àž¡àžµàž­àž¢àž¹à¹à¹àžà¹  
+
+import.OIDtype.assigned:à¹àž«à¹à¹àžà¹àžà¹àž²à¹àž¡àžàž²àžàž²àžàž²àžàžµà¹àžàž³àž«àžàžà¹àžàž¢àžàž±àž§à¹àž¥àž·àž­àž OIDmetadata (àžàž³àž«àžà¹àž²àžà¹àž§àž¢ 'D')  àžà¹àž²à¹àž¡à¹àž¡àžµàžàž²àž£àž£àž°àžàžžà¹àž§à¹ àž£àž°àžàžàž­àž²àžàžàž°à¹àžà¹à¹àž®àž (hash) à¹àžàžàžªàž³àž«àž£àž±àžà¹àž­àžàžªàž²àž£àžàž²àžàžàž£àž°à¹àž àž àžàž±àž§àž£àž°àžàžžà¹àž«àž¥à¹àž²àžàžµà¹à¹àž¡à¹àžàž§àž£àž¡àžµàžà¹àž²àžà¹àž³àžàž±àž  
+
+import.OIDtype.dirname:à¹àžà¹àžàž·à¹àž­à¹àžà¹àž£àžàžàž­àž£àžµà¹àž¡à¹ (àžàž³àž«àžà¹àž²àžà¹àž§àž¢ 'J') àžàž¶à¹àžàžàž§àž£àžàž°àž¡àžµàž«àžàž¶à¹àžà¹àž­àžàžªàž²àž£àžà¹àž­à¹àžà¹àž£àžàžàž­àž£àžµà¹àžà¹àž²àžàž±à¹àž à¹àž¥àž°àžàž·à¹àž­à¹àžà¹àž£àžàžàž­àž£àžµà¹àž¡à¹àžàž§àž£àžàž°àžà¹àž³àžàž±àž  à¹àžà¹àž import/b13as/h15ef/page.html àžàž°à¹àžà¹àžàž±àž§àž£àž°àžàžžà¹àžà¹àž Jh15ef  
+
+import.OIDmetadata:àž£àž°àžàžžàž­àžàžà¹àžàž£àž°àžàž­àžà¹àž¡àžàž²àžàž²àžàž²àžàžµà¹àžàž±àžà¹àžà¹àžàžàž±àž§àž£àž°àžàžžàžàžµà¹à¹àž¡à¹àžà¹àž³àžàž±àžàžàž­àžà¹àž­àžàžªàž²àž£ àžªàž³àž«àž£àž±àžà¹àžà¹àž£à¹àž§àž¡àžàž±àž -OIDtype=assigned  
+
+import.saveas:àž£àž¹àžà¹àžàžàž­àž·à¹àžàžàžµà¹àžà¹àž­àžàžàž²àž£àžàž±àžàžàž¶àžà¹àžà¹àž¡àžàž±àžà¹àžà¹àžàžàž²àž§àž£  
+
+import.out:àžàž·à¹àž­à¹àžà¹àž¡àž«àž£àž·àž­àž«àž¡àž²àž¢à¹àž¥àžàž­à¹àž²àžàž­àžŽàžàžàžµà¹àžàž°àžàžŽàž¡àžà¹àžªàžàž²àžàž°àžàž¥àž¥àž±àžàžà¹àž¥àžà¹àž  
+
+import.params:[àžàž±àž§à¹àž¥àž·àž­àž] àžàž­àž¥à¹àž¥àžàžàž±àž-àžàž·à¹àž­  
+
+import.removeold:àžàž°à¹àž­àž²à¹àžàž·à¹àž­àž«àž²à¹àžà¹àž²àžàž­àžà¹àžà¹àž£àžàžàž­àž£àžµàžàžµà¹à¹àžà¹àžàžàž²àž§àž£àž­àž­àž  
+
+import.removing_archives:àžàž²àž£à¹àž­àž²à¹àžàž·à¹àž­àž«àž²àžàž±àžàžàžžàžàž±àžàžàž­àžà¹àžà¹àž£àžàžàž­àž£àžµàžàžµà¹à¹àžà¹àžàžàž²àž§àž£àž­àž­àž...  
+
+import.removing_tmpdir:àžàž²àž£à¹àž­àž²à¹àžàž·à¹àž­àž«àž²à¹àžà¹àžà¹àž£àžàžàž­àž£àžµ "tmp" àžàž­àžàžàž­àž¥à¹àž¥àžàžàž±àžàž­àž­àž...  
+
+import.reversesort:à¹àž£àžµàž¢àžàž¥àž³àžàž±àžàžàž²àžàž¡àž²àžà¹àžàžà¹àž­àž¢ à¹àžà¹àžàž±àžàžàž±àž§à¹àž¥àž·àž­àž -sortmeta  
+
+import.site:à¹àžàžà¹àžªàž³àž«àž£àž±àžàžà¹àžàž«àž²à¹àžà¹àž£àžàžàž­àž£àžµ "collect" (àžªàž³àž«àž£àž±àžàžàž²àž£àžàžŽàžàžàž±à¹àžà¹àžàž£à¹àžàž£àž¡àžàž£àžµàžàžªà¹àžàž 3)  
+
+import.sortmeta:à¹àž£àžµàž¢àžàž¥àž³àžàž±àžà¹àž­àžàžªàž²àž£àžàž²àž¡àžàž±àž§àž­àž±àžàž©àž£àžà¹àž§àž¢à¹àž¡àžàž²àžàž²àžàž²àžªàž³àž«àž£àž±àžàžàž²àž£àžªàž£à¹àž²àž àžàž¥àž¥àž±àžàžà¹àžàž²àž£àžà¹àžàž«àž²àžªàž³àž«àž£àž±àžàžàž²àž£àžªàž­àžàžàž²àž¡à¹àžàžàžàž£àž£àžàž°àžàž°à¹àžªàžàžàžàž¥à¹àžàž¥àž³àžàž±àžàžàžµà¹ àžàžžàžàž¥àž±àžàž©àžàž°àžàžµà¹àžàž°àžàž¹àžàžàžŽàžà¹àžà¹àžàž²àžàžà¹àž² groupsize > 1  àž«àž£àž·àž­àž­àž²àžàžàž°à¹àžà¹àž£àž²àž¢àžàž²àž£àžàžµà¹àžàž±à¹àžàžà¹àž§àž¢à¹àžàž£àž·à¹àž­àžàž«àž¡àž²àž¢àžàžžàž¥àž àž²àžà¹àžàž·à¹àž­à¹àž£àžµàž¢àžàž¥àž³àžàž±àžàžà¹àž§àž¢àžà¹àž²à¹àž¡àžàž²àžàž²àžàž²àžàžµà¹àž¡àž²àžàžàž§à¹àž²àž«àžàž¶à¹àžàžà¹àž²àžà¹à¹àžà¹  
+
+import.statsfile:àžàž·à¹àž­à¹àžà¹àž¡àž«àž£àž·àž­àž«àž¡àž²àž¢à¹àž¥àžàž­à¹àž²àžàž­àžŽàžàžàžµà¹àžàž°àžàžŽàž¡àžà¹àžªàžàžŽàžàžŽàžàž³à¹àžà¹àž²à¹àžàž¢àž±àž  
+
+import.stats_backup:àžàž°àžàžŽàž¡àžà¹àžªàžàžŽàžàžŽà¹àžàž¢àž±àž STDERR à¹àžàž  
+
+import.verbosity:àžàž§àžàžàžžàž¡àžàž£àžŽàž¡àž²àžàžàž¥àž¥àž±àžàžà¹  0=à¹àž¡à¹àž¡àžµ  3=àžàž³àžàž§àžàž¡àž²àž  
+
+# -- schedule.pl --
+schedule.deleted:àžàž²àž£àž¥àžàžà¹àž²àžàž³àžªàž±à¹àžàžàžàžŽàžàž±àžàžŽàžàž²àž£àžàžµà¹à¹àžà¹àžàž³àž«àžàžà¹àž§àž¥àž²à¹àž§à¹à¹àž¥à¹àž§àžªàž³àž«àž£àž±àžàžàž­àž¥à¹àž¥àžàžàž±àž  
+schedule.scheduled:àžªàžàž£àžŽàžàžà¹àžàž³àžªàž±à¹àžàžàžàžŽàžàž±àžàžŽàžàž²àž£àžàžµà¹àžªàž£à¹àž²àžàžàž¶à¹àžàžªàž³àž«àž£àž±àžàžàž­àž¥à¹àž¥àžàžàž±àž  
+schedule.cron:àžàž²àž£àžàž±à¹àžàžà¹àž²àžàž³àžªàž±à¹àžàžàžàžŽàžàž±àžàžŽàžàž²àž£àžàžµà¹à¹àžà¹àžàž³àž«àžàžà¹àž§àž¥àž²à¹àž§à¹à¹àž¥à¹àž§àžªàž³àž«àž£àž±àžàžàž­àž¥à¹àž¥àžàžàž±àž  
+schedule.params:[àžàž±àž§à¹àž¥àž·àž­àž]  
+schedule.error.email:à¹àžàžàž²àž£àž£àž°àžàžž -email àžàžžàžàžà¹àž­àžàž£àž°àžàžž -smtp -toaddr à¹àž¥àž° -fromaddr àžà¹àž§àž¢  
+schedule.error.importbuild:àžàžžàžàžà¹àž­àžàž£àž°àžàžž -import à¹àž¥àž° -build  
+schedule.error.colname:àžàžžàžàžà¹àž­àžàž£àž°àžàžžàžàž­àž¥à¹àž¥àžàžàž±àžàžà¹àž§àž¢ -colname  
+schedule.gli:à¹àž£àžµàž¢àžàžàž³àžàž²àžàžàž²àž GLI  
+schedule.frequency:àžàž§àž²àž¡àžàžµà¹à¹àžàžàž²àž£àžªàž£à¹àž²àžàžàž­àž¥à¹àž¥àžàžàž±àžà¹àž«àž¡à¹à¹àžàž¢àž­àž±àžà¹àžàž¡àž±àžàžŽ  
+schedule.frequency.hourly:àžªàž£à¹àž²àžà¹àž«àž¡à¹àžàžžàžàžàž±à¹àž§à¹àž¡àž  
+schedule.frequency.daily:àžªàž£à¹àž²àžà¹àž«àž¡à¹àžàžžàžàž§àž±àž  
+schedule.frequency.weekly:àžªàž£à¹àž²àžà¹àž«àž¡à¹àžàžžàžàžªàž±àžàžàž²àž«à¹  
+schedule.action:àž§àžŽàžàžµàžàž²àž£àžàž±à¹àžàžà¹àž²àžàž²àž£àžªàž£à¹àž²àžàžàž­àž¥à¹àž¥àžàžàž±àžà¹àž«àž¡à¹à¹àžàž¢àž­àž±àžà¹àžàž¡àž±àžàžŽ  
+schedule.action.add:àžàž³àž«àžàžà¹àž§àž¥àž²àžàž²àž£àžªàž£à¹àž²àžàžàž­àž¥à¹àž¥àžàžàž±àžà¹àž«àž¡à¹à¹àžàž¢àž­àž±àžà¹àžàž¡àž±àžàžŽ  
+schedule.action.update:àžàž£àž±àžàžàž£àžžàžàžàž²àž£àžàž³àž«àžàžà¹àž§àž¥àž²àžàžµà¹àž¡àžµàž­àž¢àž¹à¹  
+schedule.action.delete:àž¥àžàžàž²àž£àžàž³àž«àžàžà¹àž§àž¥àž²àžàžµà¹àž¡àžµàž­àž¢àž¹à¹  
+schedule.email:àžªà¹àžàž­àžµà¹àž¡àž¥à¹àžà¹àžà¹àžàž·àž­àž  
+schedule.schedule:à¹àž¥àž·àž­àžà¹àžàž·à¹àž­àžàž±à¹àžàžà¹àž²àžàž²àž£àžªàž£à¹àž²àžàžàž­àž¥à¹àž¥àžàžàž±àžà¹àž«àž¡à¹à¹àžàž¢àž­àž±àžà¹àžàž¡àž±àžàžŽàžà¹àž§àž¢àžàž²àž£àžàž³àž«àžàžà¹àž§àž¥àž²  
+schedule.colname:àžàž·à¹àž­àžàž­àž¥à¹àž¥àžàžàž±àžàžàžµà¹àžàžžàžàžà¹àž­àžàžàž²àž£àžàž±à¹àžàžà¹àž²àžàž²àž£àžàž³àž«àžàžà¹àž§àž¥àž²  
+schedule.import:àžàž³àžªàž±à¹àžàžàž³à¹àžà¹àž²àžàžµà¹àžà¹àž­àžàžàž²àž£àžàž³àž«àžàžà¹àž§àž¥àž²  
+schedule.build:àžàž³àžªàž±à¹àž buildcol àžàžµà¹àžà¹àž­àžàžàž²àž£àžàž³àž«àžàžà¹àž§àž¥àž²  
+schedule.toaddr:àžàžµà¹àž­àž¢àž¹à¹àž­àžµà¹àž¡àž¥àžàž¥àž²àž¢àžàž²àžàžàžµà¹àžà¹àž­àžàžàž²àž£àžªà¹àžàžàž²àž£à¹àžà¹àžà¹àžàž·àž­àžàžàž²àž£àžªàž£à¹àž²àžàžàž­àž¥à¹àž¥àžàžàž±àžàžàž²àž¡àžàž³àž«àžàžà¹àž§àž¥àž²  
+schedule.toaddr.default:àž£àž°àžàžžàž­àžµà¹àž¡àž¥àžàž­àžàžàž¹à¹à¹àžà¹à¹àž à¹àžà¹àž¡->àžàž³àž«àžàžàž¥àž±àžàž©àžàž°  
+schedule.fromaddr:àžàžµà¹àž­àž¢àž¹à¹àž­àžµà¹àž¡àž¥àžàž­àžàžàž¹à¹àžªà¹àž  
+schedule.fromaddr.default:àž£àž°àžàžžàžàž¹à¹àžàž¹à¹àž¥àž£àž°àžàžà¹àžà¹àžà¹àž¡ main.cfg  
+schedule.smtp:à¹àž¡àž¥à¹àžàžŽàž£à¹àžà¹àž§àž­àž£à¹àžàžµà¹à¹àžàž£à¹àžàž£àž¡ 'sendmail' àžà¹àž­àžàžàžŽàžàžà¹àž­à¹àžàž·à¹àž­àžªà¹àžàž­àžµà¹àž¡àž¥  
+schedule.smtp.default:àž£àž°àžàžž 'MailServer' à¹àž main.cfg  
+schedule.out:àžàž·à¹àž­à¹àžà¹àž¡àž«àž£àž·àž­àžàž±àž§àžà¹àžàžàžµà¹àžàžµà¹àžà¹àž­àžàžàž²àž£à¹àž«à¹àžàžŽàž¡àžà¹àžªàžàž²àžàž°àžàž¥àž¥àž±àžàžà¹  
+# -- export.pl --
+
+export.exportdir:àžàžµà¹àžàž±àžà¹àžà¹àžàžà¹àž­àž¡àž¹àž¥àžàžµà¹àžªà¹àžàž­àž­àž  
+
+export.cannot_open_stats_file:àžàž³à¹àžàž·àž­àž: à¹àž¡à¹àžªàž²àž¡àž²àž£àžà¹àžàžŽàžà¹àžà¹àž¡àžªàžàžŽàžàžŽ %s à¹àžà¹  
+
+export.cannot_open_fail_log:àžà¹àž­àžàžŽàžàžàž¥àž²àž: à¹àž¡à¹àžªàž²àž¡àž²àž£àžà¹àžàžŽàžà¹àžà¹àž¡àžàž±àžàžàž¶àžàžàž§àž²àž¡àž¥à¹àž¡à¹àž«àž¥àž§ %s à¹àžà¹  
+
+export.cannot_sort:àžàž³à¹àžàž·àž­àž: export.pl à¹àž¡à¹àžªàž²àž¡àž²àž£àžà¹àž£àžµàž¢àžàž¥àž³àžàž±àžà¹àž­àžàžªàž²àž£à¹àžà¹à¹àž¡àž·à¹àž­ groupsize) > 1  àžàž±àž§à¹àž¥àž·àž­àž sortmeta àžàž°àžàž¹àžàž¥àž°à¹àž§à¹àž  
+
+export.collectdir:à¹àžªà¹àžàžàž²àžàžàž­àžà¹àžà¹àž£àžàžàž­àž£àžµ "collect"  
+
+export.complete:àžàž²àž£àžªà¹àžàž­àž­àžà¹àžªàž£à¹àžàžªàž¡àžàž¹àž£àžà¹  
+
+export.debug:àžàžŽàž¡àžà¹àžà¹àž­àžàž§àž²àž¡àžàžµà¹àžªà¹àžàž­àž­àžà¹àžàž¢àž±àž STDOUT (àžªàž³àž«àž£àž±àžàžªà¹àžàž­àž­àž GreenstoneXML)  
+
+export.desc:àžªàžàž£àžŽàžàžà¹ PERL àžàžµà¹à¹àžà¹àžªà¹àžàž­àž­àžà¹àžà¹àž¡à¹àžàžàž­àž¥à¹àž¥àžàžàž±àžàžàž­àžàžàž£àžµàžàžªà¹àžàžà¹àžà¹àžà¹àžàž£àž¹àžà¹àžàžàž­àž·à¹àž  
+
+export.faillog:àžàž·à¹àž­à¹àžà¹àž¡àžàž±àžàžàž¶àžàžàž§àž²àž¡àž¥à¹àž¡à¹àž«àž¥àž§ à¹àžà¹àž¡àžàž±àžàžàž¶àžàžàžµà¹àžàž°à¹àžà¹àžàžàž·à¹àž­à¹àžà¹àž¡àžàž­àžà¹àžà¹àž¡à¹àžà¹ àžàžµà¹à¹àž¡à¹àžªàž²àž¡àž²àž£àžàžàž£àž°àž¡àž§àž¥àžàž¥à¹àžà¹ (àžà¹àž²à¹àž£àžŽà¹àž¡àžà¹àž: collectdir/collname/etc/fail.log)  
+
+export.groupsize:àžàž³àžàž§àžàžàž­àžà¹àž­àžàžªàž²àž£àžàžµà¹àžàž°àžàž±àžàžàž¥àžžà¹àž¡àž¥àžà¹àžà¹àžà¹àž¡ XML à¹àžà¹àž¡à¹àžàžµàž¢àž§  
+
+export.gzip:à¹àžà¹à¹àžàž£à¹àžàž£àž¡ gzip à¹àžàž·à¹àž­àžàžµàžàž­àž±àžà¹àž­àžàžªàž²àž£ XML àžàžµà¹à¹àžà¹àžàžàž¥àž¥àž±àžàžà¹ (àž­àž¢à¹àž²àž¥àž·àž¡àž£àž§àž¡ ZIPPlugin àž¥àžà¹àžàž£àž²àž¢àžàž²àž£àžàž¥àž±à¹àžàž­àžŽàžàžàž­àžàžàžžàžà¹àž¡àž·à¹àž­àž¡àžµàžàž²àž£àžªàž£à¹àž²àžàžàž²àžà¹àž­àžàžªàž²àž£àžàžµà¹àžàž¹àžàžàžµàžàž­àž±àž)  
+
+export.importdir:àžàžµà¹à¹àžà¹àžà¹àž­àžàžªàž²àž£àžà¹àžàžàžàž±àž  
+
+export.keepold:àžàž°à¹àž¡à¹àžàž³àž¥àž²àž¢à¹àžàž·à¹àž­àž«àž²àžàž±àžàžàžžàžàž±àžàžàž­àžà¹àžà¹àž£àžàžàž­àž£àžµàžªà¹àžàž­àž­àž  
+
+export.maxdocs:àžàž³àžàž§àžàžªàž¹àžàžªàžžàžàžàž­àžà¹àž­àžàžªàž²àž£àžàžµà¹àžªàž²àž¡àž²àž£àžàžªà¹àžàž­àž­àžà¹àžà¹  
+
+export.listall:à¹àžªàžàžàž£àž²àž¢àžàž²àž£àž£àž¹àžà¹àžàž àžàž±àžàžàž¶àžà¹àžà¹àž àžàž±à¹àžàž«àž¡àž  
+
+export.saveas:àž£àž¹àžà¹àžàžàžàžµà¹àžàž°àžªà¹àžàž­àž­àžà¹àž­àžàžªàž²àž£  
+
+export.saveas.DSpace:àž£àž¹àžà¹àžàžàžàžµà¹à¹àžà¹àžàžàž²àž§àž£àžàž­àž Dspace  
+
+export.saveas.GreenstoneMETS:àž£àž¹àžà¹àžàž METS àžàžµà¹à¹àžà¹à¹àžàž£à¹àžàž¥à¹ Greenstone  
+export.saveas.FedoraMETS:àž£àž¹àžà¹àžàž METS àžàžµà¹à¹àžà¹à¹àžàž£à¹àžàž¥à¹ Fedora  
+
+export.saveas.GreenstoneXML:àž£àž¹àžà¹àžàžàžàž²àž£àžàž±àžà¹àžà¹àžà¹àžà¹àž¡ XML à¹àžàžàžàž²àž§àž£àžàž­àžà¹àžàž£à¹àžàž£àž¡àžàž£àžµàžàžªà¹àžàž  
+
+export.saveas.MARCXML:àž£àž¹àžà¹àžàž MARC XML (MARC21 àž£àžžà¹àžàžàžµà¹à¹àžà¹àž XML)  
+
+export.out:àžàž·à¹àž­à¹àžà¹àž¡àž«àž£àž·àž­àž«àž¡àž²àž¢à¹àž¥àžàž­à¹àž²àžàž­àžŽàžà¹àžàž·à¹àž­àžàžŽàž¡àžà¹àžªàžàž²àžàž°àžàž¥àž¥àž±àžàžà¹à¹àžàž¢àž±àž  
+
+export.params:[àžàž±àž§à¹àž¥àž·àž­àž] collection-name  
+
+export.removeold:àžàž°à¹àž­àž²à¹àžàž·à¹àž­àž«àž²à¹àžà¹àž²àžàž­àžà¹àžà¹àž£àžàžàž­àž£àžµàžªà¹àžàž­àž­àžàž­àž­àž  
+
+export.removing_export:àžàž²àž£à¹àž­àž²à¹àžàž·à¹àž­àž«àž²àžàž±àžàžàžžàžàž±àžàžàž­àžà¹àžà¹àž£àžàžàž­àž£àžµàžªà¹àžàž­àž­àžàž­àž­àžâŠ  
+
+export.sortmeta:à¹àž£àžµàž¢àžàž¥àž³àžàž±àžà¹àž­àžàžªàž²àž£àžàž²àž¡àžàž±àž§àž­àž±àžàž©àž£àžà¹àž§àž¢à¹àž¡àžàž²àžàž²àžàž²àžªàž³àž«àž£àž±àžàžàž²àž£àžªàž£à¹àž²àž àžàž²àž£àžàž³à¹àžàžŽàžàžàž²àž£àžàžµà¹àžàž°àžàž¹àžàžàžŽàžà¹àžà¹àžàž²àžàžà¹àž² groupsize > 1  
+
+export.statsfile:àžàž·à¹àž­à¹àžà¹àž¡àž«àž£àž·àž­àž«àž¡àž²àž¢à¹àž¥àžàž­à¹àž²àžàž­àžŽàžàžàžµà¹àžàž°àžàžŽàž¡àžà¹àžªàžàžŽàžàžŽàžàž²àž£àžªà¹àžàž­àž­àžà¹àž  
+
+export.stats_backup:àžàž°àžàžŽàž¡àžà¹àžªàžàžŽàžàžŽà¹àžàž¢àž±àž STDERR à¹àžàž  
+
+export.verbosity:àžàž§àžàžàžžàž¡àžàž£àžŽàž¡àž²àžàžàž­àžàžàž¥àž¥àž±àžàžà¹  0=à¹àž¡à¹àž¡àžµ  3=àžàž³àžàž§àžàž¡àž²àž  
+
+
+
+# -- mkcol.pl --
+
+mkcol.about:àžà¹àž­àžàž§àž²àž¡àž£àž²àž¢àž¥àž°à¹àž­àžµàž¢àžà¹àžàžµà¹àž¢àž§àžàž±àžàžàž­àž¥à¹àž¥àžàžàž±àž  
+
+mkcol.bad_name_cvs:àžà¹àž­àžàžŽàžàžàž¥àž²àž: àžàžžàžà¹àž¡à¹àžªàž²àž¡àž²àž£àžàžàž±à¹àžàžàž·à¹àž­àžàž­àž¥à¹àž¥àžàžàž±àžàž§à¹àž² 'CVS' à¹àžà¹ à¹àžàž·à¹àž­àžàžàž²àžàž­àž²àžàžàž°à¹àžàžàž±àžà¹àž¢à¹àžàžàž±àžà¹àžà¹àž£àžàžàž­àž£àžµàžàžµà¹àžªàž£à¹àž²àžà¹àžàž¢àž£àž°àžàžàžàž±àžàžàž²àž£àž£àžžà¹àž CVS  
+
+mkcol.bad_name_svn:àžà¹àž­àžàžŽàžàžàž¥àž²àž: àžàžžàžà¹àž¡à¹àžªàž²àž¡àž²àž£àžàžàž±à¹àžàžàž·à¹àž­àžàž­àž¥à¹àž¥àžàžàž±àžàž§à¹àž² .svn à¹àžà¹ à¹àžàž·à¹àž­àžàžàž²àžàž­àž²àžà¹àžàžŽàžàžàž§àž²àž¡àžàž±àžà¹àž¢à¹àžàžàž±àžà¹àžà¹àž£àžàžàž­àž£àžµàžàžµà¹àžªàž£à¹àž²àžà¹àžàž¢àž£àž°àžàžàžàž±àžàžàž²àž£àž£àžžà¹àž SVN  
+
+mkcol.bad_name_modelcol:àžà¹àž­àžàžŽàžàžàž¥àž²àž: àžàžžàžà¹àž¡à¹àžªàž²àž¡àž²àž£àžàžàž±à¹àžàžàž·à¹àž­àžàž­àž¥à¹àž¥àžàžàž±àžàž§à¹àž² 'modelcol' à¹àžà¹ à¹àžàž·à¹àž­àžàžàž²àžàžàž·à¹àž­àžàžµà¹àžàž¹àžà¹àžà¹à¹àžà¹àžàžàž·à¹àž­àžàž­àžàžàž­àž¥à¹àž¥àžàžàž±àžàžà¹àžà¹àžàžà¹àž¥à¹àž§  
+
+mkcol.cannot_find_modelcol:àžà¹àž­àžàžŽàžàžàž¥àž²àž: à¹àž¡à¹àžàžàžàž­àž¥à¹àž¥àžàžàž±àžàžà¹àžà¹àžàž %s  
+
+mkcol.col_already_exists:àžà¹àž­àžàžŽàžàžàž¥àž²àž: àž¡àžµàžàž­àž¥à¹àž¥àžàžàž±àžàžàžµà¹àž­àž¢àž¹à¹à¹àž¥à¹àž§  
+
+mkcol.collectdir:à¹àžà¹àž£àžàžàž­àž£àžµàžàžµà¹àžàž°à¹àžà¹àžªàž£à¹àž²àžàžàž­àž¥à¹àž¥àžàžàž±àžà¹àž«àž¡à¹  
+
+
+mkcol.creating_col:àžàž³àž¥àž±àžàžªàž£à¹àž²àžàžàž­àž¥à¹àž¥àžàžàž±àž %s  
+
+mkcol.creator:àžàžµà¹àž­àž¢àž¹à¹àž­àžµà¹àž¡àž¥àžàž­àžàžàž¹à¹àžªàž£à¹àž²àžàžàž­àž¥à¹àž¥àžàžàž±àž  
+
+mkcol.creator_undefined:àžà¹àž­àžàžŽàžàžàž¥àž²àž: àžàžžàžà¹àž¡à¹à¹àžà¹àžàž³àž«àžàžàžàž·à¹àž­àžàž¹à¹àžªàž£à¹àž²àžà¹àž§à¹ àžàžžàžàžàž³à¹àžà¹àžàžà¹àž­àžà¹àžà¹àžàž±àž§à¹àžàž£àžàžµà¹à¹àžàž·à¹àž­àžàž£àž§àžàžªàž­àžàžàž·à¹àž­àžàž­àž¥à¹àž¥àžàžàž±àžàžàžµà¹àž­àž²àžàžàž°àžà¹àž³àžàž±àž  
+
+mkcol.desc:àžªàžàž£àžŽàžàžà¹ PERL àžàžµà¹à¹àžà¹àžªàž£à¹àž²àžà¹àžàž£àžàžªàž£à¹àž²àžà¹àžà¹àž£àžàžàž­àž£àžµàžªàž³àž«àž£àž±àžàžàž­àž¥à¹àž¥àžàžàž±àžàžàž£àžµàžàžªà¹àžàžà¹àž«àž¡à¹  
+
+mkcol.doing_replacements:àžàž³àž¥àž±àžàžàž³à¹àžàžŽàžàžàž²àž£à¹àžàžàžàžµà¹àžªàž³àž«àž£àž±àž %s  
+
+mkcol.group:àžªàž£à¹àž²àžàžàž¥àžžà¹àž¡àžàž­àž¥à¹àž¥àžàžàž±àžà¹àž«àž¡à¹à¹àžàžàžàž­àž¥à¹àž¥àžàžàž±àžàž¡àž²àžàž£àžàž²àž  
+
+mkcol.gs3mode:à¹àž«àž¡àžàžªàž³àž«àž£àž±àžàžàž­àž¥à¹àž¥àžàžàž±àžàžàž­àžà¹àžàž£à¹àžàž£àž¡àžàž£àžµàžàžªà¹àžàž 3  
+
+mkcol.long_colname:àžà¹àž­àžàžŽàžàžàž¥àž²àž: àžàž·à¹àž­àžàž­àž¥à¹àž¥àžàžàž±àžàžà¹àž­àžàž¡àžµàžàž§àž²àž¡àž¢àž²àž§àžà¹àž­àž¢àžàž§à¹àž² 8 àž­àž±àžàžàž£àž°à¹àžàž·à¹àž­à¹àž«à¹àžªàž²àž¡àž²àž£àžà¹àžà¹àž²àžàž±àžà¹àžà¹àžàž±àžàž£àž°àžàžà¹àžà¹àž¡àž£àžžà¹àžà¹àžà¹àž²  
+
+mkcol.maintainer:àžàžµà¹àž­àž¢àž¹à¹àž­àžµà¹àž¡àž¥àžàž­àžàžàž¹à¹àžàž¹à¹àž¥àž£àž±àžàž©àž²àžàž­àž¥à¹àž¥àžàžàž±àž (àžà¹àž²à¹àžàžàžà¹àž²àžàžàž²àžàžàž¹à¹àžªàž£à¹àž²àž)  
+
+mkcol.no_collectdir:àžà¹àž­àžàžŽàžàžàž¥àž²àž: à¹àž¡à¹àž¡àžµà¹àžà¹àž£àžàžàž­àž£àžµ 'collect' àž­àž¢àž¹à¹: %s  
+
+mkcol.no_collectdir_specified:àžà¹àž­àžàžŽàžàžàž¥àž²àž: àžàžžàžà¹àž¡à¹à¹àžà¹àž£àž°àžàžž 'collect dir' à¹àžà¹àž«àž¡àž gs3mode àžàžžàžàžàž³à¹àžà¹àžàžà¹àž­àžàž£àž°àžàžžàžàž±àž§à¹àž¥àž·àž­àž -site àž«àž£àž·àž­ -collectdir   
+
+mkcol.no_colname:àžà¹àž­àžàžŽàžàžàž¥àž²àž: àžàžžàžàž¢àž±àžà¹àž¡à¹à¹àžà¹àž£àž°àžàžžàžàž·à¹àž­àžàž­àž¥à¹àž¥àžàžàž±àž  
+
+mkcol.optionfile:à¹àžà¹àž£àž±àžàžàž±àž§à¹àž¥àž·àž­àžàžàž²àžà¹àžà¹àž¡ àžàž¶à¹àžàžàž°à¹àžà¹àžàžàž£àž°à¹àž¢àžàžà¹àžàž±àžàž£àž°àžàžàžàžµà¹àžàž²àž£à¹àžà¹àžàž£àž£àžàž±àžàžàž³àžªàž±à¹àžàž¢àž²àž§àž­àž²àžàžà¹àž­à¹àž«à¹à¹àžàžŽàžàžàž±àžàž«àž²àžàž±àžàž£àž°àžàž  
+
+mkcol.params:[àžàž±àž§à¹àž¥àž·àž­àž] àžàž­àž¥à¹àž¥àžàžàž±àž-àžàž·à¹àž­  
+
+mkcol.plugin:à¹àž¡àžàž¹àž¥àžàž¥àž±à¹àžàž­àžŽàž Perl àžàžµà¹àžà¹àž­àžàžàž²àž£à¹àžà¹àžàž²àž (àž­àž²àžàž¡àžµàž£àž²àž¢àžàž²àž£àžàž¥àž±à¹àžàž­àžŽàžàž«àž¥àž²àž¢àžàž±àž§)  
+
+mkcol.public:àžà¹àž²àžàž­àž¥à¹àž¥àžàžàž±àžàžàžµà¹àž¡àžµàžàž²àž£à¹àžà¹àž²àžàž¶àžàž£àž°àžàžà¹àžàžà¹àž¡à¹àž£àž°àžàžžàžàž·à¹àž­  
+mkcol.public.true:àžàž­àž¥à¹àž¥àžàžàž±àžà¹àžà¹àžà¹àžàžàžªàž²àžàž²àž£àžàž°  
+mkcol.public.false:àžàž­àž¥à¹àž¥àžàžàž±àžà¹àžà¹àžà¹àžàžàžªà¹àž§àžàžàž±àž§  
+
+mkcol.quiet:àžàž³à¹àžàžŽàžàžàž²àž£à¹àžàž¢à¹àž¡à¹àžà¹àž­àžàž¡àžµàžà¹àž­àžàž§àž²àž¡à¹àžà¹àž  
+
+mkcol.site:à¹àž gs3mode à¹àž«à¹à¹àžà¹àžàž·à¹àž­à¹àžàžà¹àžàžµà¹àžàž±àžàžàž±àž§à¹àžàž£àžªàž àž²àžà¹àž§àžàž¥à¹àž­àž¡ GSDL3HOME à¹àžàž·à¹àž­àžàž³àž«àžàž collectdir àžàž­àžàžàž²àžàž§à¹àž²àžàžžàžà¹àžà¹àž£àž°àžàžž -collectdir à¹àž¥à¹àž§  
+
+mkcol.success:àžªàž£à¹àž²àžàžàž­àž¥à¹àž¥àžàžàž±àžà¹àž«àž¡à¹à¹àžªàž£à¹àžà¹àž£àžµàž¢àžàž£à¹àž­àž¢à¹àž¥à¹àž§àžàžµà¹ %s  
+
+mkcol.title:àžàž·à¹àž­àžàž­àžàžàž­àž¥à¹àž¥àžàžàž±àž  
+
+mkcol.win31compat:à¹àžà¹àž£àžàžàž­àž£àžµàžàž­àžàžàž­àž¥à¹àž¥àžàžàž±àžàžàžµà¹àž¡àžµàžàž²àž£àžàž³àž«àžàžàžàž·à¹àž­àžàž°àžà¹àž­àžà¹àžà¹àžà¹àžàžàž²àž¡à¹àžàžà¹àžàžà¹àžà¹àž¡àžàž­àž Windows 3.1 àž«àž£àž·àž­à¹àž¡à¹ (à¹àžà¹àž àž¡àžµàžàž§àž²àž¡àž¢àž²àž§ 8 àž­àž±àžàžàž£àž°)  
+mkcol.win31compat.true:àžàž·à¹àž­à¹àžà¹àž£àžàžàž­àž£àžµàž¢àž²àž§ 8 àž­àž±àžàžàž£àž°àž«àž£àž·àž­àžà¹àž­àž¢àžàž§à¹àž²  
+mkcol.win31compat.false:àžàž·à¹àž­à¹àžà¹àž£àžàžàž­àž£àžµàž¢àž²àž§à¹àžà¹àž²à¹àžàžà¹à¹àžà¹  
+
+# -- pluginfo.pl --
+
+pluginfo.collection:àžàž²àž£à¹àž«à¹àžàž·à¹àž­àžàž­àž¥à¹àž¥àžàžàž±àžàžàž°àžàž³à¹àž«à¹ pluginfo.pl àžà¹àžàž«àž²àžàž²àž collect/collection-name/perllib/plugins àžà¹àž­àž àžà¹àž²à¹àž¡à¹àžàžàžàž¥àž±à¹àžàž­àžŽàžà¹àžàžàž±à¹àžà¹àž¥à¹àž§ pluginfo.pl àžàž°àžà¹àžàž«àž²à¹àžà¹àžà¹àž£àžàžàž­àž£àžµ perllib/plugins àžàž±à¹àž§à¹àž  
+
+pluginfo.desc:àžàžŽàž¡àžà¹àžà¹àž­àž¡àž¹àž¥à¹àžàžµà¹àž¢àž§àžàž±àžàžàž¥àž±à¹àžàž­àžŽàž  
+
+pluginfo.general_options:àžàž±àž§à¹àž¥àž·àž­àžàžàž±à¹àž§à¹àžàžàž°à¹àžà¹àž£àž±àžàžàž²àž£àžªàž·àžàžàž­àžàž¡àž²àžàž²àžàžàž¥àž²àžªà¹àž¡à¹àžàž­àžàžàž¥àž±à¹àžàž­àžŽàž  
+
+pluginfo.info:info  
+
+pluginfo.no_plugin_name:àžà¹àž­àžàžŽàžàžàž¥àž²àž: àžàžžàžàžà¹àž­àžà¹àžªà¹àžàž·à¹àž­àžàž¥àž±à¹àžàž­àžŽàž  
+
+pluginfo.option_types:àžàž¥àž±à¹àžàž­àžŽàžàž­àž²àžà¹àžà¹àžàž±àž§à¹àž¥àž·àž­àžà¹àžà¹àžªàž­àžàžàžàžŽàž  
+
+pluginfo.params:[àžàž±àž§à¹àž¥àž·àž­àž] àžàž¥àž±à¹àžàž­àžŽàž-àžàž·à¹àž­  
+
+pluginfo.passing_options:àžàž±àž§à¹àž¥àž·àž­àžàž­àž²àžàžàž°àžàž¹àžàžªà¹àžàžà¹àž­à¹àžàž¢àž±àžàžàž¥àž±à¹àžàž­àžŽàžà¹àžà¹ àžà¹à¹àžà¹à¹àžàž¢àžàž²àž£àž£àž§àž¡àžàž±àž§à¹àž¥àž·àž­àžà¹àž«àž¥à¹àž²àžàž±à¹àžàž¥àžà¹àžà¹àžà¹àž¡àžàž³àž«àžàžàžà¹àž² collect.cfg àžàž­àžàžàžžàž  
+
+pluginfo.specific_options:àžàž±àž§à¹àž¥àž·àž­àžà¹àžàžàž²àž°àžàž¹àžàžàž³àž«àžàžà¹àž§à¹àž àž²àž¢à¹àžàžàž±àž§àžàž¥àž±à¹àžàž­àžŽàžà¹àž­àž à¹àž¥àž°àžªàž²àž¡àž²àž£àžà¹àž£àžµàž¢àžà¹àžà¹àžàž²àžà¹àžà¹à¹àžàžàž²àž°àžàž±àžàžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹à¹àžà¹àž²àžàž±à¹àž  
+
+
+# -- plugoutinfo.pl --
+
+plugoutinfo.collection:àžàž²àž£à¹àž«à¹àžàž·à¹àž­àžàž­àž¥à¹àž¥àžàžàž±àžàžàž°àžàž³à¹àž«à¹ plugoutinfo.pl àžà¹àžàž«àž²àžàž²àž collect/collection-name/perllib/plugouts àžà¹àž­àž  àžà¹àž²à¹àž¡à¹àžàžàžàž¥àž±à¹àžà¹àž­àž²àžà¹à¹àžàžàž±à¹àžà¹àž¥à¹àž§ pluginfo.pl àžàž°àžà¹àžàž«àž²à¹àžà¹àžà¹àž£àžàžàž­àž£àžµ perllib/plugouts àžàž±à¹àž§à¹àž  
+
+plugoutinfo.desc:àžàžŽàž¡àžà¹àžà¹àž­àž¡àž¹àž¥à¹àžàžµà¹àž¢àž§àžàž±àžàžàž¥àž±à¹àžà¹àž­àž²àžà¹  
+
+plugoutinfo.general_options:àžàž±àž§à¹àž¥àž·àž­àžàžàž±à¹àž§à¹àžàžàž°à¹àžà¹àž£àž±àžàžàž²àž£àžªàž·àžàžàž­àžàžàž²àžàžàž¥àž²àžªà¹àž¡à¹àžàž­àžàžàž¥àž±à¹àžà¹àž­àž²àžà¹  
+
+plugoutinfo.info:info  
+
+plugoutinfo.no_plugout_name:àžà¹àž­àžàžŽàžàžàž¥àž²àž: àžàžžàžàžà¹àž­àžà¹àžªà¹àžàž·à¹àž­àžàž¥àž±à¹àžà¹àž­àž²àžà¹  
+
+plugoutinfo.option_types:àžàž¥àž±à¹àžà¹àž­àž²àžà¹àž­àž²àžà¹àžà¹àžàž±àž§à¹àž¥àž·àž­àžà¹àžà¹àžªàž­àžàžàžàžŽàž  
+
+plugoutinfo.params:[àžàž±àž§à¹àž¥àž·àž­àž] àžàž¥àž±à¹àžà¹àž­àž²àžà¹-àžàž·à¹àž­  
+
+plugoutinfo.passing_options:àžàž±àž§à¹àž¥àž·àž­àžàž­àž²àžàžàž°àžàž¹àžàžªà¹àžàžà¹àž­à¹àžàž¢àž±àžàžàž¥àž±à¹àžà¹àž­àž²àžà¹à¹àžà¹ àžà¹à¹àžà¹à¹àžàž¢àžàž²àž£àž£àž§àž¡àžàž±àž§à¹àž¥àž·àž­àžà¹àž«àž¥à¹àž²àžàž±à¹àžàž¥àžà¹àžà¹àžà¹àž¡àžàž³àž«àžàžàžà¹àž² collect.cfg àžàž­àžàžàžžàž  
+
+plugoutinfo.specific_options:àžàž±àž§à¹àž¥àž·àž­àžà¹àžàžàž²àž°àžàž°àžàž¹àžàžàž³àž«àžàžà¹àž§à¹àž àž²àž¢à¹àžàžàž±àž§àžàž¥àž±à¹àžà¹àž­àž²àžà¹à¹àž­àž à¹àž¥àž°àžªàž²àž¡àž²àž£àžà¹àž£àžµàž¢àžà¹àžà¹àžàž²àžà¹àžà¹à¹àžàžàž²àž°àžàž±àžàžàž¥àž±à¹àžà¹àž­àž²àžà¹àžàžµà¹à¹àžà¹àž²àžàž±à¹àž  
+
+
+
+#
+# Classifier option descriptions
+#
+
+AllList.desc:àžªàž£à¹àž²àžà¹àž­àžàžªàž²àž£àžàž±à¹àžàž«àž¡àžà¹àžà¹àžàž£àž²àž¢àžàž²àž£à¹àžàžµàž¢àž§ àžàž¶à¹àžà¹àžà¹à¹àžàž¢ oaiserver  
+
+AZCompactList.allvalues:à¹àžà¹àžà¹àž²à¹àž¡àžàž²àžàž²àžàž²àžàž±à¹àžàž«àž¡àžàžàžµà¹àžàž  
+
+AZCompactList.desc:àžàž¥àž±à¹àžàž­àžŽàžàžàž±àž§à¹àž¢àžàžàž£àž°à¹àž àž (Classifier) àžªàž³àž«àž£àž±àžàžàž²àž£à¹àž£àžµàž¢àžàž¥àž³àžàž±àžàžàž²àž¡àžàž±àž§àž­àž±àžàž©àž£ (à¹àžàž a-zA-Z0-9)  àžàž°àžªàž£à¹àž²àžàž£àž²àž¢àžàž²àž£ A-Z à¹àž£àžµàž¢àžàžàž²àž¡à¹àžàž§àžàž­àž àžàž²àž¡àžà¹àž§àž¢àž£àž²àž¢àžàž²àž£àžàž²àž¡à¹àžàž§àžàž±à¹àžàžàžµà¹àžàž£àž°àžàž­àžàžà¹àž§àž¢à¹àž­àžàžªàž²àž£ àž«àž£àž·àž­àžàž±à¹àžàž§àž²àžàžªàž³àž«àž£àž±àžà¹àž­àžàžªàž²àž£àžàžµà¹àž¡àžµà¹àž¡àžàž²àžàž²àžàž²à¹àž«àž¡àž·àž­àžàžàž±àž  
+
+AZCompactList.doclevel:àž£àž°àžàž±àžàžàžµà¹àžàž°àžàž£àž°àž¡àž§àž¥àžàž¥à¹àž­àžàžªàž²àž£  
+AZCompactList.doclevel.top:à¹àž­àžàžªàž²àž£àžàž±à¹àžàž«àž¡àž  
+AZCompactList.doclevel.section:àžàž²àž¡àžªà¹àž§àž  
+
+AZCompactList.firstvalueonly:à¹àžà¹à¹àžàžàž²àž°àžà¹àž²à¹àž¡àžàž²àžàž²àžàž²à¹àž£àžàžàžµà¹àžàž  
+
+AZCompactList.freqsort:à¹àž£àžµàž¢àžàž¥àž³àžàž±àžàžàž²àž¡àžàž§àž²àž¡àžàžµà¹àžàž­àžà¹àž«àžàžà¹àžàžàžàž²àž£à¹àž£àžµàž¢àžàžàž²àž¡àžàž±àž§àž«àžàž±àžàžªàž·àž­à¹àž¥àž°àžàž±àž§à¹àž¥àž  
+
+AZCompactList.maxcompact:àžàž³àžàž§àžàžªàž¹àžàžªàžžàžàžàž­àžà¹àž­àžàžªàž²àž£àžàžµà¹àžàž°à¹àžªàžàžàžà¹àž­àž«àžàž¶à¹àžàž«àžà¹àž²  
+
+AZCompactList.metadata:à¹àžàžàžà¹àž­àž¡àž¹àž¥à¹àž¡àžàž²àžàž²àžàž²à¹àžàžµà¹àž¢àž§ àž«àž£àž·àž­àž£àž²àž¢àžàž²àž£àžàž­àžà¹àžàžàžà¹àž­àž¡àž¹àž¥à¹àž¡àžàž²àžàž²àžàž²àžàžµà¹àžàž±à¹àžàžà¹àž§àž¢à¹àžàž£àž·à¹àž­àžàž«àž¡àž²àž¢àžàžžàž¥àž àž²àžàžàžµà¹à¹àžà¹àžªàž³àž«àž£àž±àžàžàž²àž£à¹àž¢àžàžàž£àž°à¹àž àž àžà¹àž²àž¡àžµàžàž²àž£àž£àž°àžàžžàž£àž²àž¢àžàž²àž£à¹àž§à¹ àž£àž°àžàžàžàž°à¹àžà¹àžàžàžŽàžàžàž­àžà¹àž¡àžàž²àžàž²àžàž²à¹àž£àžàžàžµà¹àž¡àžµàžà¹àž² à¹àžàž¢àž­àž²àžàžàž°à¹àžà¹àž£à¹àž§àž¡àžàž±àžàžªàžàž²àžàž° -firstvalueonly à¹àž¥àž° -allvalues à¹àžàž·à¹àž­à¹àž¥àž·àž­àžà¹àžàžàž²àž°àžà¹àž²à¹àž£àžàž«àž£àž·àž­àžà¹àž²à¹àž¡àžàž²àžàž²àžàž²àžàž±à¹àžàž«àž¡àžàžàž²àžàž£àž²àž¢àžàž²àž£  
+
+AZCompactList.mincompact:àžàž³àžàž§àžàžà¹àž³àžªàžžàžàžàž­àžà¹àž­àžàžªàž²àž£àžàžµà¹àžàž°à¹àžªàžàžàžà¹àž­àž«àžàž¶à¹àžàž«àžà¹àž²  
+
+AZCompactList.mingroup:àžà¹àž²àžàžµà¹àžà¹àž­àž¢àžàžµà¹àžªàžžàžàžàžµà¹àžàž³à¹àž«à¹à¹àžàžŽàžàžàž²àž£àžªàž£à¹àž²àžàžàž¥àžžà¹àž¡à¹àžàž¥àž³àžàž±àžàžàž±à¹àž  
+
+AZCompactList.minnesting:àžà¹àž²àžàžµà¹àžà¹àž­àž¢àžàžµà¹àžªàžžàžàžàžµà¹àžàž³à¹àž«à¹àž£àž²àž¢àžàž²àž£à¹àžàž¥àžà¹àžà¹àžà¹àžàž£àž²àž¢àžàž²àž£à¹àžàžàžà¹àž­àž  
+
+AZCompactList.recopt:à¹àžà¹à¹àžà¹àž¡àžàž²àžàž²àžàž²à¹àžàžàžà¹àž­àž à¹àžà¹àž -metadata àžàžµ/àž­àžàžà¹àžàž£  
+AZCompactList.sort:à¹àžàžàžà¹àž­àž¡àž¹àž¥à¹àž¡àžàž²àžàž²àžàž²àžàžµà¹àžàž°à¹àžà¹à¹àž£àžµàž¢àžàž¥àž³àžàž±àžà¹àž«àžàžàžàž¥àž²àž¢àžªàžžàž (Leaf node)  
+
+AZCompactSectionList.desc:àžàž²àž£à¹àžàž£àžàž±àžàžàž­àž AZCompactList àžàžµà¹à¹àž¢àžàžàž£àž°à¹àž àžàžªà¹àž§àžà¹àžàžàžàž²àž£à¹àž¢àžàžàž²àž¡à¹àž­àžàžªàž²àž£ àž£àž²àž¢àžàž²àž£àžà¹àž²àžà¹ àžàž°àžàž¹àžàžàž±àžà¹àž£àžµàž¢àžàžàž²àž¡à¹àž¡àžàž²àžàž²àžàž²àž£àž°àžàž±àžàžªà¹àž§àž  
+
+AZList.desc:àžàž¥àž±à¹àžàž­àžŽàžàžàž±àž§à¹àž¢àžàžàž£àž°à¹àž àžàžªàž³àž«àž£àž±àžàžàž²àž£à¹àž£àžµàž¢àžàž¥àž³àžàž±àžàžàž²àž¡àžàž±àž§àž­àž±àžàž©àž£ (à¹àžàž a-zA-Z0-9) àžàž°àžªàž£à¹àž²àžàž£àž²àž¢àžàž²àž£ A-Z à¹àž£àžµàž¢àžàžàž²àž¡à¹àžàž§àžàž­àž à¹àžàž¢àž¡àžµà¹àž­àžàžªàž²àž£àž­àž¢àž¹à¹àžà¹àž²àžà¹àžà¹  
+
+AZList.metadata:à¹àžàžàžà¹àž­àž¡àž¹àž¥à¹àž¡àžàž²àžàž²àžàž²à¹àžàžµà¹àž¢àž§àž«àž£àž·àž­àž£àž²àž¢àžàž²àž£àžàž­àžà¹àžàžàžà¹àž­àž¡àž¹àž¥à¹àž¡àžàž²àžàž²àžàž²àžàžµà¹àžàž±à¹àžàžà¹àž§àž¢à¹àžàž£àž·à¹àž­àžàž«àž¡àž²àž¢àžàžžàž¥àž àž²àžàžàžµà¹à¹àžà¹àžªàž³àž«àž£àž±àžàžàž²àž£à¹àž¢àžàžàž£àž°à¹àž àž àžàž°à¹àž£àžµàž¢àžàž¥àž³àžàž±àžàžàž²àž¡àžàžµà¹àž£àž²àž¢àžàž²àž£àžà¹àžàžàžµà¹ à¹àžàž¢àž£àž°àžàžàžàž°à¹àžà¹à¹àžàžàžà¹àž­àž¡àž¹àž¥à¹àž£àžàžàžµà¹àžàž£àž°àžàž­àžàžà¹àž§àž¢àžà¹àž²à¹àž¡àžàž²àžàž²àžàž² àžàž¶à¹àžàž£àž²àž¢àžàž²àž£àžàž°àžàž¹àžà¹àž£àžµàž¢àžàž¥àž³àžàž±àžàžàž²àž¡àž­àžàžà¹àžàž£àž°àžàž­àžàžàžµà¹  
+
+AZSectionList.desc:àžàž²àž£à¹àžàž£àžàž±àžàžàž­àž AZList àžàžµà¹à¹àž¢àžàžàž£àž°à¹àž àžàžàž²àž¡àžªà¹àž§àžà¹àžàžàžàž²àž£àžàž²àž¡à¹àž¢àžà¹àž­àžàžªàž²àž£ àž£àž²àž¢àžàž²àž£àžà¹àž²àžà¹ àžàž°àžàž¹àžàžàž±àžà¹àž£àžµàž¢àžàžàž²àž¡à¹àž¡àžàž²àžàž²àžàž²àž£àž°àžàž±àžàžªà¹àž§àž  
+
+BasClas.bad_general_option:àžàž±àž§à¹àž¢àžàžàž£àž°à¹àž àž %s à¹àžà¹àžàž±àž§à¹àž¥àž·àž­àžà¹àž¡à¹àžàž¹àžàžà¹àž­àž à¹àž«à¹àžàž£àž§àžàžªàž­àžà¹àžà¹àž¡àžàž³àž«àžàžàžà¹àž² collect.cfg àžàž­àžàžàžžàž  
+
+BasClas.builddir:àžàžµà¹àžàž±àžàžàžµà¹à¹àžà¹àžàžàž±àžàžàžµàžàžµà¹àžªàž£à¹àž²àž  
+
+BasClas.buttonname:àžà¹àž²àž¢àžàž·à¹àž­àžªàž³àž«àž£àž±àžàž«àžà¹àž²àžàž­àžàž±àž§à¹àž¢àžàžàž£àž°à¹àž àžà¹àž¥àž°àžàžžà¹àž¡à¹àžà¹àžàžàžàž³àžàž²àž àžà¹àž²à¹àž£àžŽà¹àž¡àžà¹àžàžàž·àž­ àž­àžàžà¹àžàž£àž°àžàž­àžà¹àž¡àžàž²àžàž²àžàž²àžàžµà¹àž£àž°àžàžžàžà¹àž§àž¢ -metadata  
+
+BasClas.desc:àžàž¥àž²àžªàžàž·à¹àžàžàž²àžàžªàž³àž«àž£àž±àžàžàž±àž§à¹àž¢àžàžàž£àž°à¹àž àžàžàž±à¹àžàž«àž¡àž  
+
+BasClas.no_metadata_formatting:àžàž£àžžàžàž²àž­àž¢à¹àž²à¹àžà¹àžàž²àž£àžàž±àžàž£àž¹àžà¹àžàžà¹àž¡àžàž²àžàž²àžàž²àž­àž±àžà¹àžàž¡àž±àžàžŽà¹àžà¹ (àžªàž³àž«àž£àž±àžàžàž²àž£à¹àž£àžµàž¢àžàž¥àž³àžàž±àž)  
+
+BasClas.outhandle:àžàž²àž£àžàž±àžàžàž²àž£à¹àžà¹àž¡àžàžµà¹àžàž°à¹àžà¹à¹àžàžµàž¢àžàžà¹àž­àž¡àž¹àž¥àžàž¥àž¥àž±àžàžà¹  
+
+BasClas.removeprefix:àžàž³àžàž³àž«àžà¹àž²àžàžµà¹àžàž°àž¥àž°à¹àž§à¹àžà¹àžàžà¹àž²à¹àž¡àžàž²àžàž²àžàž²àžàžàž°à¹àž£àžµàž¢àžàž¥àž³àžàž±àž  
+
+BasClas.removesuffix:àžàž³àžà¹àž­àžà¹àž²àž¢àžàžµà¹àžàž°àž¥àž°à¹àž§à¹àžà¹àžàžà¹àž²à¹àž¡àžàž²àžàž²àžàž²àžàžàž°à¹àž£àžµàž¢àžàž¥àž³àžàž±àž  
+
+BasClas.verbosity:àžàž§àžàžàžžàž¡àžàž£àžŽàž¡àž²àžàžàž¥àž¥àž±àžàžà¹  0=à¹àž¡à¹àž¡àžµ  3=àžàž³àžàž§àžàž¡àž²àž  
+
+Browse.desc:àžàž±àž§à¹àž¢àžàžàž£àž°à¹àž àžàžàžµà¹àžàž¥àž­àž¡à¹àžàž¥àžàžàž¶à¹àžàžàžµà¹àž¡àžµàžàž²àž£à¹àžàž·à¹àž­àž¡à¹àž¢àžà¹àžà¹àžàžàžàž³àžàž²àžà¹àžàž¢àž±àžàžà¹àžà¹àžàžàžàžµà¹àž£àž§àž¡àž«àžà¹àž²à¹àž£àžµàž¢àžàžàž¹à¹àž¥àž°àžà¹àžàž«àž² àžàž¶à¹àžàžàž°àžàž³àžàž²àžà¹àžà¹àžàž±àžàžàž­àž¥à¹àž¥àžàžàž±àž mgpp à¹àžà¹àž²àžàž±à¹àž à¹àž¥àž°àžªàž²àž¡àž²àž£àžà¹àžà¹à¹àžà¹àžàžµàžàž±àžàžàž­àž¥à¹àž¥àžàžàž±àžà¹àž¥à¹àžà¹ à¹àžà¹àž²àžàž±à¹àž  
+
+DateList.bymonth:à¹àž¢àžàžàž£àž°à¹àž àžàžà¹àž§àž¢àžà¹àž²àžàžµà¹àž¥àž°à¹àžàž·àž­àžà¹àžàžàžàž²àž£à¹àž¢àžàžà¹àž§àž¢àžàžµà¹àžàžµàž¢àžàž­àž¢à¹àž²àžà¹àžàžµàž¢àž§  
+
+DateList.desc:àžàž¥àž±à¹àžàž­àžŽàžàžàž±àž§à¹àž¢àžàžàž£àž°à¹àž àžàžªàž³àž«àž£àž±àžàžàž²àž£à¹àž£àžµàž¢àžàž¥àž³àžàž±àžàžàž²àž¡àž§àž±àžàžàžµà¹ à¹àžàž¢àžà¹àž²à¹àž£àžŽà¹àž¡àžà¹àžà¹àž¥à¹àž§ àžàž°à¹àž£àžµàž¢àžàžàž²àž¡à¹àž¡àžàž²àžàž²àžàž² 'àž§àž±àžàžàžµà¹' àž§àž±àžàžàžµà¹àžàž§àž£àžàž°àž­àž¢àž¹à¹à¹àžàž£àž¹àžà¹àžàž àžàžàžàžàžàžàž§àž§ àž«àž£àž·àž­ àžàžàžàž-àžàž-àž§àž§  
+
+DateList.metadata:à¹àž¡àžàž²àžàž²àžàž²àžàžµà¹àž¡àžµàž§àž±àžàžàžµà¹à¹àžàž·à¹àž­à¹àžà¹à¹àžàžàž²àž£à¹àž¢àžàžàž£àž°à¹àž àž àž£àž¹àžà¹àžàžàžàžµà¹àžàž§àž£àžàž°à¹àžà¹àž àžàž·àž­ àžàžàžàžàžàžàž§àž§ àž«àž£àž·àž­ àžàžàžàž-àžàž-àž§àž§ à¹àžàž¢àž­àž²àžàžàž°àž­àž¢àž¹à¹à¹àžàž£àž¹àžà¹àžàžàž£àž²àž¢àžàž²àž£àžàžµà¹àžàž±à¹àžàžà¹àž§àž¢à¹àžàž£àž·à¹àž­àžàž«àž¡àž²àž¢àžàžžàž¥àž àž²àžà¹àžà¹ àžàž¶à¹àžà¹àžàžàž£àžàžµàžàžµà¹àž£àž°àžàžàžàž°à¹àžà¹àž§àž±àžàžàžµà¹à¹àž£àžàžàžµà¹àžàž  
+
+DateList.reverse_sort:à¹àž£àžµàž¢àžàž¥àž³àžàž±àžà¹àž­àžàžªàž²àž£àžàž²àž¡àž¥àž³àžàž±àžà¹àž§àž¥àž²à¹àžàžàž¢à¹àž­àžàžàž¥àž±àž (à¹àž§àž¥àž²àž¥à¹àž²àžªàžžàžàžàž¶à¹àžàžà¹àž­àž)  
+
+DateList.nogroup:àžàž³à¹àž«à¹à¹àžà¹àž¥àž°àžàžµà¹àž¢àžà¹àžà¹àžà¹àžà¹àž¥àž°àž£àž²àž¢àžàž²àž£à¹àžàž£àž²àž¢àžàž²àž£à¹àžàž§àžàž­àž à¹àžàžàžàž²àž£àžàž¢àž²àž¢àžàžµàžàžµà¹àž¡àžµàžàž³àžàž§àžàž£àž²àž¢àžàž²àž£àžà¹àž­àž¢ (àžàžžàžàž¥àž±àžàž©àžàž°àžàžµà¹àž¢àž±àžàžªàž²àž¡àž²àž£àžà¹àžà¹àž£à¹àž§àž¡àžàž±àžàžàž±àž§à¹àž¥àž·àž­àž -bymonth à¹àžàž·à¹àž­àžàž³à¹àž«à¹à¹àžà¹àž¥àž°à¹àžàž·àž­àžà¹àž¢àžà¹àžà¹àžàž£àž²àž¢àžàž²àž£àžà¹àž²àžàž«àž²àžà¹àžàžàžàžµà¹àžàž°àžàžªàž²àžàžàž±àžà¹àžà¹)  
+
+DateList.no_special_formatting:àžàž£àžžàžàž²àž­àž¢à¹àž²à¹àžªàžàžàžà¹àž­àž¡àž¹àž¥ 'àžàžµ' à¹àž¥àž° 'à¹àžàž·àž­àž' à¹àžàž£àž²àž¢àžàž²àž£à¹àž­àžàžªàž²àž£  
+
+DateList.sort:à¹àžàžàžà¹àž­àž¡àž¹àž¥à¹àž¡àžàž²àžàž²àžàž²àžàžŽà¹àžšàž©àžàžµà¹àžàž°à¹àž£àžµàž¢àžàž¥àž³àžàž±àžà¹àžàžàž£àžàžµàžàžµà¹à¹àž­àžàžªàž²àž£àžªàž­àžàžàžàž±àžàž¡àžµàž§àž±àžàžàžµà¹à¹àžàžµàž¢àž§àžàž±àž  
+
+List.always_bookshelf_last_level:àžªàž£à¹àž²àžà¹àž­àžàž­àžàžàž±à¹àžàž§àž²àžàž«àžàž±àžàžªàž·àž­à¹àž¡à¹àž§à¹àž²àžàž°àž¡àžµàž«àžàž±àžàžªàž·àž­à¹àžàžµàž¢àžàž£àž²àž¢àžàž²àž£à¹àžàžµàž¢àž§à¹àžà¹àžà¹àž¥àž°àžàž¥àžžà¹àž¡à¹àžà¹àž«àžàžàžàž¥àž²àž¢àžªàžžàž  
+
+List.classify_sections:à¹àž¢àžàžàž£àž°à¹àž àžàžàž²àž¡àžªà¹àž§àžà¹àžàžàžàž²àž£à¹àž¢àžàžàž£àž°à¹àž àžàžàž²àž¡à¹àž­àžàžªàž²àž£  
+
+List.desc:àžàž±àž§à¹àž¢àžàžàž£àž°à¹àž àžàž£àž²àž¢àžàž²àž£à¹àžàžàžàž±à¹àž§à¹àžà¹àž¥àž°à¹àžàžàž¢àž·àžàž«àž¢àžžà¹àžàžàžµà¹àž£àž§àž¡àžàž§àž²àž¡àžªàž²àž¡àž²àž£àžà¹àžàž·àž­àžàžàž±à¹àžàž«àž¡àžàžàž­àž AZCompactList à¹àžà¹àž¡àžµ Unicode à¹àž¡àžàž²àžàž²àžàž²à¹àž¥àž°àžàž§àž²àž¡àžªàž²àž¡àž²àž£àžà¹àžàžàž²àž£à¹àž£àžµàž¢àžàž¥àž³àžàž±àžàžàžµà¹àžàžµàžàž§à¹àž²  
+
+List.metadata:à¹àžàžàžà¹àž­àž¡àž¹àž¥à¹àž¡àžàž²àžàž²àžàž²àžàžµà¹à¹àžà¹àžªàž³àž«àž£àž±àžàžàž²àž£à¹àž¢àžàžàž£àž°à¹àž àž à¹àž«à¹à¹àžà¹ '/' à¹àžàž·à¹àž­à¹àžà¹àžàž£àž°àžàž±àžà¹àžàž¥àž³àžàž±àžàžàž±à¹àž à¹àž¥àž°à¹àžà¹ ';' à¹àžàž·à¹àž­à¹àžà¹àžà¹àžàžàžà¹àž­àž¡àž¹àž¥à¹àž¡àžàž²àžàž²àžàž²àž àž²àž¢à¹àžà¹àžà¹àž¥àž°àž£àž°àžàž±àž  
+
+List.partition_name_length:àžàž§àž²àž¡àž¢àž²àž§àžàž­àžàžàž·à¹àž­àžàž²àž£à¹àžàžŽàžàž±àž àžàž¶à¹àžàž¡àžµàžà¹àž²à¹àž£àžŽà¹àž¡àžà¹àžàžàžµà¹àžªàž²àž¡àž²àž£àžà¹àžàž¥àžµà¹àž¢àžàžà¹àž²à¹àžà¹àžàž±à¹àžà¹àžà¹ 1 àžàž¶àž 3 àž­àž±àžàžàž£àž° àžàž¶à¹àžàž­àž¢àž¹à¹àžàž±àžàžàž³àžàž§àžàžàžµà¹àžà¹àž­àžàžàž²àž£à¹àžà¹à¹àžà¹àžà¹àž¢àžàžàž²àž£à¹àžàžŽàžàž±àžàžàž±à¹àžà¹àžà¹àžà¹àžàžàžàžàž àžàžžàžàžªàž²àž¡àž²àž£àžàžàž£àž°àž¢àžžàžàžà¹à¹àžà¹àžàž±àž§à¹àž¥àž·àž­àžàžàžµà¹à¹àžà¹à¹àžàžàž²àž°à¹àž¡àž·à¹àž­à¹àžà¹àžàž±à¹àžàžà¹àž² partition_type_within_level à¹àžà¹àž 'constant_size' à¹àžà¹àž²àžàž±à¹àž  
+
+List.partition_size_within_level:àžàž³àžàž§àžàž£àž²àž¢àžàž²àž£à¹àžà¹àžà¹àž¥àž°àžàž²àž£à¹àžàžŽàžàž±àž (àžàž£àž°àž¢àžžàžàžà¹à¹àžà¹à¹àžà¹à¹àžàžàž²àž°à¹àž¡àž·à¹àž­àž¡àžµàžàž²àž£àžàž±à¹àžàžà¹àž² partition_type_within_level à¹àžà¹àž 'constant_size' à¹àžà¹àž²àžàž±à¹àž)  
+
+List.partition_type_within_level:àžàžàžŽàžàžàž­àžàžàž²àž£àžàž³àžàž²àž£à¹àžàžŽàžàž±àžàžàžµà¹àžàž³à¹àžàžŽàžàžàž²àž£à¹àž£àžµàž¢àžàž£à¹àž­àž¢à¹àž¥à¹àž§: 'per_letter' 'constant_size' àž«àž£àž·àž­ 'none'  
+
+List.sort_leaf_nodes_using:à¹àžàžàžà¹àž­àž¡àž¹àž¥à¹àž¡àžàž²àžàž²àžàž²àžàžµà¹à¹àžà¹à¹àž£àžµàž¢àžàž¥àž³àžàž±àžà¹àž«àžàžàžàž¥àž²àž¢àžªàžžàž à¹àž«à¹à¹àžà¹ '|' à¹àžàž·à¹àž­à¹àž¢àžàžàž¥àžžà¹àž¡à¹àž¡àžàž²àžàž²àžàž²à¹àž«à¹àž¡àžµàžàž²àž£à¹àž£àžµàž¢àžàž¥àž³àžàž±àžàž­àž¢à¹àž²àžàžàžàžàžµà¹ à¹àž¥àž°à¹àžà¹ ';' à¹àžàž·à¹àž­à¹àž¢àžà¹àžàžàžà¹àž­àž¡àž¹àž¥à¹àž¡àžàž²àžàž²àžàž²àž àž²àž¢à¹àžà¹àžà¹àž¥àž°àžàž¥àžžà¹àž¡  
+
+List.sort_using_unicode_collation:àžàž±àžà¹àž£àžµàž¢àžàž¥àž³àžàž±àžà¹àžàž¢à¹àžà¹ Unicode Collation Algorithm àžàžžàžàžàž³à¹àžà¹àžàžà¹àž­àžàžàž³àžàž²àž£àžàž²àž§àžà¹à¹àž«àž¥àžà¹àžà¹àž¡ http://www.unicode.org/Public/UCA/latest/allkeys.txt file àž¥àžà¹àžà¹àžàž¥à¹àžàž­àž£à¹ lib/Unicode/Collate àžàž­àž Perl  
+
+List.use_hlist_for:à¹àžàžàžà¹àž­àž¡àž¹àž¥à¹àž¡àžàž²àžàž²àžàž²àžàžµà¹à¹àžà¹ hlist à¹àžàžàžàž²àž£à¹àžà¹ vlist  à¹àž«à¹à¹àžà¹ ',' à¹àžàž·à¹àž­à¹àžà¹àžàžàž¥àžžà¹àž¡à¹àž¡àžàž²àžàž²àžàž² à¹àž¥àž°à¹àžà¹ ';' à¹àžàž·à¹àž­à¹àžà¹àžà¹àžàžàžà¹àž­àž¡àž¹àž¥à¹àž¡àžàž²àžàž²àžàž²àž àž²àž¢à¹àžà¹àžà¹àž¥àž°àžàž¥àžžà¹àž¡  
+
+HFileHierarchy.desc:àžàž¥àž±à¹àžàž­àžŽàžàžàž±àž§à¹àž¢àžàžàž£àž°à¹àž àžàžªàž³àž«àž£àž±àžàžªàž£à¹àž²àžàžàž²àž£à¹àž¢àžàžàž£àž°à¹àž àžà¹àžàžàž¥àž³àžàž±àžàžàž±à¹àžàžàžµà¹àž¡àžµàžàž·à¹àžàžàž²àžàž­àž¢àž¹à¹àžàžà¹àžà¹àž¡à¹àžàž£àžàžªàž£à¹àž²àžà¹àžªàž£àžŽàž¡  
+
+Hierarchy.desc:àžàž¥àž±à¹àžàž­àžŽàžàžàž±àž§à¹àž¢àžàžàž£àž°à¹àž àžàžªàž³àž«àž£àž±àžàžªàž£à¹àž²àžàžàž²àž£à¹àž¢àžàžàž£àž°à¹àž àžà¹àžàžàž¥àž³àžàž±àžàžàž±à¹àž àžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹àž­àž²àžàž¡àžµàžàž·à¹àžàžàž²àžàž­àž¢àž¹à¹àžàžà¹àž¡àžàž²àžàž²àžàž²à¹àžàžŽàžà¹àžàž£àžàžªàž£à¹àž²àž àž«àž£àž·àž­àž­àž²àžà¹àžà¹à¹àžà¹àž¡à¹àžàž£àžàžªàž£à¹àž²àžà¹àžªàž£àžŽàž¡àžà¹à¹àžà¹ (à¹àžà¹àžàž±àž§à¹àž¥àž·àž­àž -hfile)  
+
+Hierarchy.documents_last:à¹àžªàžàžàžàž¥à¹àž«àžàžà¹àž­àžàžªàž²àž£àž«àž¥àž±àžà¹àž«àžàžàžàž±àž§à¹àž¢àžàžàž£àž°à¹àž àž  
+
+Hierarchy.hfile:à¹àžà¹à¹àžà¹àž¡à¹àžàž£àžàžªàž£à¹àž²àžàžàž²àž£à¹àž¢àžàžàž£àž°à¹àž àžàžàžµà¹àž£àž°àžàžž  
+
+Hierarchy.hlist_at_top:à¹àžªàžàžàžàž¥àž£àž°àžàž±àžà¹àž£àžàžàž­àžàžàž²àž£à¹àž¢àžàžàž£àž°à¹àž àžà¹àžà¹àžàž§àžàž­àž  
+
+Hierarchy.reverse_sort:à¹àž£àžµàž¢àžàž¥àž³àžàž±àžà¹àž«àžàžàžàž¥àž²àž¢àžªàžžàžà¹àžàž¥àž³àžàž±àžàž¢à¹àž­àžàžàž¥àž±àž (à¹àžà¹àžàž±àž -sort)  
+
+Hierarchy.separator:àžàžŽàžàžàžà¹àžàžàžàžŽàžàžµà¹à¹àžà¹àžªàž³àž«àž£àž±àžàžàž±àž§à¹àžà¹àž àžà¹àž²àžàž³àž¥àž±àžà¹àžà¹à¹àž¡àžàž²àžàž²àžàž²à¹àžàžŽàžà¹àžàž£àžàžªàž£à¹àž²àž  
+
+Hierarchy.sort:à¹àžàžàžà¹àž­àž¡àž¹àž¥à¹àž¡àžàž²àžàž²àžàž²àžàžµà¹à¹àžà¹àžàž±àžà¹àž£àžµàž¢àžàž¥àž³àžàž±àžà¹àž«àžàžàžàž¥àž²àž¢àžªàžžàž àžàž°à¹àž¡à¹àž¡àžµàžàž²àž£àžàž±àžà¹àž£àžµàž¢àžà¹àž«àžàžàžàž¥àž²àž¢àžªàžžàžàž«àž²àžà¹àž¡à¹àž£àž°àžàžžà¹àž§à¹  
+
+Hierarchy.suppressfirstlevel:àž¥àž°à¹àž§à¹àžàžªà¹àž§àžà¹àž£àžàžàž­àžàžà¹àž²à¹àž¡àžàž²àžàž²àžàž² àžà¹àž²àžàžµà¹àž¡àžµàžàž£àž°à¹àž¢àžàžà¹àžà¹àž­à¹àž¡àžàž²àžàž²àžàž²àžàžµà¹àž¡àžµàžà¹àž²àž­àžàžà¹àžàž£àž°àžàž­àžàžàž±àž§à¹àž£àžà¹àž«àž¡àž·àž­àžàžàž±àž à¹àžà¹àž à¹àžà¹àž£àžàžàž­àž£àžµàžàž³à¹àžà¹àž²à¹àž gsdlsourcefilename  
+
+Hierarchy.suppresslastlevel:àž¥àž°à¹àž§à¹àžàžªà¹àž§àžàžà¹àž²àž¢àžªàžžàžàžàž­àžàžà¹àž²à¹àž¡àžàž²àžàž²àžàž² àžà¹àž²àžàžµà¹àž¡àžµàžàž£àž°à¹àž¢àžàžà¹àžà¹àž­à¹àž¡àžàž²àžàž²àžàž²àžàžµà¹àžà¹àž²à¹àžà¹àž¥àž°àžà¹àž²à¹àž¡à¹àžà¹àž³àžàž±àž à¹àžà¹àž à¹àžªà¹àžàžàž²àžàžàž­àžà¹àžà¹àž¡  
+
+HTML.desc:àžªàž£à¹àž²àžàžàž²àž£à¹àž¢àžàžàž£àž°à¹àž àžàž§à¹àž²àžàžàžµà¹à¹àžà¹àžàžàž²àž£à¹àžàž·à¹àž­àž¡à¹àž¢àžàž­àž¢à¹àž²àžàžà¹àž²àž¢à¹àžàž¢àž±àžàž«àžà¹àž²à¹àž§à¹àž  
+
+HTML.url:url àžàž­àžàž«àžà¹àž²à¹àž§à¹àžàžàžµà¹à¹àžàž·à¹àž­àž¡à¹àž¢àž  
+
+SimpleList.desc:àžàž¥àž±à¹àžàž­àžŽàžàžàž±àž§à¹àž¢àžàžàž£àž°à¹àž àžàž£àž²àž¢àžàž²àž£àž­àž¢à¹àž²àžàžà¹àž²àž¢  
+
+SimpleList.metadata:à¹àžàžàžà¹àž­àž¡àž¹àž¥à¹àž¡àžàž²àžàž²àžàž²à¹àžàžµà¹àž¢àž§àž«àž£àž·àž­àž£àž²àž¢àžàž²àž£à¹àžàžàžà¹àž­àž¡àž¹àž¥à¹àž¡àžàž²àžàž²àžàž²àžàžµà¹àžàž±à¹àžàžà¹àž§àž¢à¹àžàž£àž·à¹àž­àžàž«àž¡àž²àž¢àžàžžàž¥àž àž²àžàžàžµà¹à¹àžà¹àžªàž³àž«àž£àž±àžàžàž²àž£à¹àž¢àžàžàž£àž°à¹àž àž àžàž²àž¡àž¥àž³àžàž±àžàžàžµà¹àžà¹àžàžàžµà¹à¹àžàž¢àž£àž²àž¢àžàž²àž£ àž£àž°àžàžàžàž°à¹àžà¹à¹àžàžàžà¹àž­àž¡àž¹àž¥à¹àž£àžàžàžµà¹àž¡àžµàžà¹àž²à¹àž¡àžàž²àžàž²àžàž² àž£àž²àž¢àžàž²àž£àžàž°àžàž¹àžàžàž±àžà¹àž£àžµàž¢àžàžàž²àž¡àž­àžàžà¹àžàž£àž°àžàž­àžàžàžµà¹ àžàž­àžàžàž²àžàžàžžàžàžàž°à¹àžà¹ -sort àžà¹àž²à¹àž¡à¹àž¡àžµàžàž²àž£àž£àž°àžàžžà¹àž¡àžàž²àžàž²àžàž² à¹àž­àžàžªàž²àž£àžàž±à¹àžàž«àž¡àžàžàž°àžàž¹àžàž£àž§àž¡à¹àž§à¹à¹àžàž£àž²àž¢àžàž²àž£ à¹àž¡à¹à¹àžà¹àžàžàž±à¹àžà¹àž¥à¹àž§ à¹àžàžàž²àž°à¹àž­àžàžªàž²àž£àžàžµà¹àž¡àžµàžà¹àž²à¹àž¡àžàž²àžàž²àžàž²à¹àžà¹àž²àžàž±à¹àžàžàžµà¹àžàž°àžàž¹àžàž£àž§àž¡à¹àžà¹àž²àž¡àž²  
+
+SimpleList.sort:à¹àžàžàžà¹àž­àž¡àž¹àž¥à¹àž¡àžàž²àžàž²àžàž²àžàžµà¹àžàž°à¹àž£àžµàž¢àžàž¥àž³àžàž±àž à¹àž«à¹à¹àžà¹ '-sort nosort' à¹àž¡àž·à¹àž­à¹àž¡à¹àžà¹àž­àžàžàž²àž£à¹àž£àžµàž¢àžàž¥àž³àžàž±àž  
+
+Phind.desc:àžªàž£à¹àž²àžàž¥àž³àžàž±àžàžàž±à¹àžàžàž­àžàž§àž¥àžµàžàžµà¹àžàžà¹àžàžà¹àž­àžàž§àž²àž¡ àžàž¶à¹àžàžªàž²àž¡àž²àž£àžà¹àž£àžµàž¢àžàžàž¹à¹àžà¹àžà¹àž²àžàžàž²àžà¹àž­àžà¹àžàž¥à¹àž  
+
+Phind.language:àž àž²àž©àž²àž«àžàž¶à¹àžàž àž²àž©àž²àž«àž£àž·àž­àž«àž¥àž²àž¢àž àž²àž©àž²àžàžµà¹àžàž°à¹àžà¹àž¥àž³àžàž±àžàžàž±à¹àžàžàž²àž£àžªàž£à¹àž²àž àž àž²àž©àž²àžàž°àžàž¹àžàž£àž°àžàžžàžà¹àž§àž¢àž£àž«àž±àžªàžàž£àž°à¹àžàžšàžªàž­àžàžàž±àž§àž­àž±àžàž©àž£ à¹àžà¹àž en (àž­àž±àžàžàž€àž©) es (àžªà¹àžàž) à¹àž¥àž° fr (àžàž£àž±à¹àžà¹àžšàžª) àž àž²àž©àž²à¹àžà¹àžàžàžŽàžàžàžà¹àžàžàžàžŽ àžàž±àžàžàž±à¹àžàžàž¶àžàžªàž²àž¡àž²àž£àžà¹àžà¹ 'en|fr' (àž­àž±àžàžàž€àž©àž«àž£àž·àž­àžàž£àž±à¹àžà¹àžšàžª) à¹àž¥àž° '..' (àžàž£àžàžàž±àžàžàžžàžàž àž²àž©àž²) à¹àžà¹à¹àžà¹àžàžàž±àž  
+
+Phind.min_occurs:àžàž³àžàž§àžàžàž£àž±à¹àžàžàžµà¹àžà¹àž³àžªàžžàžàžàžµà¹àž§àž¥àžµàžàž°àžà¹àž­àžàžàž£àž²àžàžà¹àžàžà¹àž­àžàž§àž²àž¡àžàžµà¹àžàž°àž£àž§àž¡àž­àž¢àž¹à¹à¹àžàž¥àž³àžàž±àžàžàž±à¹àžàž§àž¥àžµ  
+
+Phind.savephrases:àžà¹àž²àž¡àžµàžàž²àž£àžàž±à¹àžàžà¹àž²à¹àž§à¹ àžà¹àž­àž¡àž¹àž¥àž§àž¥àžµàžàž°àžàž¹àžàžàž±àžà¹àžà¹àžà¹àž§à¹à¹àžà¹àžà¹àž¡àžàžµà¹àžàž³àž«àžàžà¹àžàž£àž¹àžà¹àžàžàžà¹àž­àžàž§àž²àž¡ àžàž¶à¹àžàž­àž²àžà¹àžà¹àžàžàž§àž²àž¡àžàžŽàžàžàžµà¹àžàžµàžàžµà¹àžàž°à¹àžà¹à¹àžªà¹àžàžàž²àžàžªàž±àž¡àžàž¹àž£àžà¹ (absolute path)  
+
+Phind.suffixmode:àžàž²àž£àž²àž¡àžŽà¹àžàž­àž£à¹ smode àžàžµà¹à¹àžà¹àžàž±àžà¹àžàž£à¹àžàž£àž¡àžàž²àž£àžàž±àžàžàž­àžàž§àž¥àžµ àžà¹àž² 0 àž«àž¡àž²àž¢àžàž§àž²àž¡àž§à¹àž² àž¥àž°à¹àž§à¹àžàžàž³àž«àž¢àžžàž (stopwords) à¹àž¥àž° 1 àž«àž¡àž²àž¢àžàž§àž²àž¡àž§à¹àž² à¹àžà¹àžàž³àž«àž¢àžžàž (stopwords)  
+
+Phind.text:àžà¹àž­àžàž§àž²àž¡àžàžµà¹à¹àžà¹àžªàž£à¹àž²àžàž¥àž³àžàž±àžàžàž±à¹àžàž§àž¥àžµ  
+
+Phind.thesaurus:àžàž·à¹àž­àžàž­àžàž­àž àžŽàžàž²àžàžšàž±àžàžà¹ (Thesaurus) àžàžµà¹àžàž±àžà¹àžà¹àžà¹àžàž£àž¹àžà¹àžàž Phind à¹àžà¹àžà¹àž£àžàžàž­àž£àžµ etc àžàž­àžàžàž­àž¥à¹àž¥àžàžàž±àž  
+
+Phind.title:à¹àžàžàžà¹àž­àž¡àž¹àž¥à¹àž¡àžàž²àžàž²àžàž²àžàžµà¹à¹àžà¹àž­àžàžŽàžàž²àž¢à¹àž­àžàžªàž²àž£à¹àžà¹àž¥àž°àžàžàž±àž  
+
+Phind.untidy:àžàž£àžžàžàž²àž­àž¢à¹àž²àž¥àžà¹àžà¹àž¡àžàžµà¹àžàž³àž¥àž±àžàžàž³àžàž²àžàž­àž¢àž¹à¹àž­àž­àž  
+
+RecentDocumentsList.desc:àžàž±àž§à¹àž¢àžàžàž£àž°à¹àž àžàžàžµà¹à¹àžªàžàžàž£àž²àž¢àžàž²àž£à¹àž­àžàžªàž²àž£àžàžµà¹à¹àžàžŽà¹àž¡à¹àž«àž¡à¹àž«àž£àž·àž­à¹àž­àžàžªàž²àž£àžàžµà¹àž¡àžµàžàž²àž£à¹àžàž¥àžµà¹àž¢àžà¹àžàž¥àž  
+
+RecentDocumentsList.include_docs_added_since:àž£àž§àž¡à¹àžàžàž²àž°à¹àž­àžàžªàž²àž£àžàžµà¹àž¡àžµàžàž²àž£à¹àžàž¥àžµà¹àž¢àžà¹àžàž¥àžàž«àž£àž·àž­à¹àž­àžàžªàž²àž£àžàžµà¹à¹àžàžŽà¹àž¡àž«àž¥àž±àžàžàž²àžàž§àž±àžàžàžµà¹àž£àž°àžàžžà¹àž§à¹ (à¹àžàž£àž¹àžà¹àžàž àžàžàžàžàžàžàž§àž§ àž«àž£àž·àž­ àžàžàžàž-àžàž-àž§àž§)  
+
+RecentDocumentsList.include_most_recently_added:àž£àž§àž¡à¹àžàžàž²àž°à¹àž­àžàžªàž²àž£àžàžµà¹à¹àžàžŽà¹àž¡àž¥à¹àž²àžªàžžàžàžàž²àž¡àžàž³àžàž§àžàžàžµà¹àž£àž°àžàžžà¹àžà¹àž²àžàž±à¹àž à¹àžà¹à¹àžàžàž²àž°à¹àž¡àž·à¹àž­à¹àž¡à¹àž¡àžµàžàž²àž£àž£àž°àžàžžàžà¹àž² include_docs_added_since à¹àž§à¹  
+
+RecentDocumentsList.sort:à¹àž¡àžàž²àžàž²àžàž²àžàžµà¹àžà¹àž­àžàžàž²àž£à¹àžà¹à¹àž£àžµàž¢àžàž¥àž³àžàž±àžàž£àž²àž¢àžàž²àž£ àžà¹àž²à¹àž¡à¹àž¡àžµàžàž²àž£àž£àž°àžàžžàžà¹àž²à¹àž§à¹ àž£àž²àž¢àžàž²àž£àžàž°àžàž¹àžàžàž±àžà¹àž£àžµàž¢àžàžàž²àž¡àž§àž±àžàžàžµà¹àžàžµà¹à¹àžàž¥àžµà¹àž¢àžà¹àžàž¥àž/à¹àžàžŽà¹àž¡à¹àž­àžàžªàž²àž£  
+
+SectionList.desc:à¹àžà¹àžà¹àžàžµàž¢àž§àžàž±àžàžàž±àž§à¹àž¢àžàžàž£àž°à¹àž àžàž£àž²àž¢àžàž²àž£ à¹àžà¹àž£àž§àž¡àžàžžàžàžªà¹àž§àžàžàž­àžà¹àž­àžàžªàž²àž£ (àž¢àžà¹àž§à¹àžàž£àž°àžàž±àžàžàžàžªàžžàž) à¹àžàžàžàž²àž£àž£àž§àž¡à¹àžàžµàž¢àžàžàž±àž§à¹àž­àžàžªàž²àž£àž£àž°àžàž±àžàžàžàžªàžžàž  
+
+Collage.desc:à¹àž­àžà¹àžàž¥à¹àžàžàž°àžàž¹àžà¹àžà¹à¹àžàž·à¹àž­à¹àžªàžàžàž àž²àžàžàž±àžàžàž°àžàž­àžàž£àž¹àžàžàžµà¹àžàžà¹àžàžàž­àž¥à¹àž¥àžàžàž±àž  
+
+Collage.geometry:àžàž­àžà¹àžàžàžàž­àžàžàž·à¹àžàžàž²àžàž àž²àžàžàž±àžàžàž° àžàž±àž§àž­àž¢à¹àž²àžà¹àžà¹àž àžªàž³àž«àž£àž±àžàžàž·à¹àžàžàž²àžàžàžàž²àžàžàž§à¹àž²àž 600 àžàžŽàžà¹àžàž¥à¹àž¥àž°àžªàž¹àž 400 àžàžŽàžà¹àžàž¥ àžà¹àž²àžàž³àž«àžàžàžàž²àžà¹àž£àžàž²àžàžàžŽàžàžàž°à¹àžà¹àž 600x400  
+
+Collage.maxDepth:àž£àž¹àžàžªàž³àž«àž£àž±àžàžàž²àž£àžàž°àžàžŽàžàžàž¹àžàž§àž²àžàžàž²àžàžàž²àž£àžàž³àž¡àžŽà¹àž£àž­àž£à¹àžàž±àž§à¹àž¢àžàžàž£àž°à¹àž àžàžàž²àž£à¹àž£àžµàž¢àžàžàž¹àžàžµà¹àž­àž¢àž¹à¹à¹àžàžàž³à¹àž«àžà¹àžàžà¹àž³àžàž§à¹àž² àžàž¶à¹àžàžàž°àžàž§àžàžàžžàž¡àž£àž°àžàž±àžàžàž§àž²àž¡àž¥àž¶àžàžªàžžàžàžàž­àžàžàž£àž°àžàž§àžàžàž²àž£àžàž³àž¡àžŽà¹àž£àž­àž£à¹  
+
+Collage.maxDisplay:àžàž³àžàž§àžàž£àž¹àžàžªàž¹àžàžªàžžàžàžàžµà¹àžàž°à¹àžªàžàžà¹àžàž àž²àžàžàž±àžàžàž°à¹àžà¹àž§àž¥àž²àž«àžàž¶à¹àž  
+
+Collage.imageType:à¹àžà¹à¹àžàž·à¹àž­àžàž§àžàžàžžàž¡àžàžàžŽàžàžàž­àžà¹àžà¹àž¡àžàžµà¹à¹àžà¹à¹àžàž àž²àžàžàž±àžàžàž°à¹àžàž¢àžàž²àž£à¹àžªàžàžàžàž²àž¡àžªàžàžžàž¥àžàž­àžàžàž·à¹àž­à¹àžà¹àž¡ àž£àž²àž¢àžàž²àž£àžàž­àžàžàž²àž¡àžªàžàžžàž¥àžàž·à¹àž­à¹àžà¹àž¡àžàž°àžàž¹àžà¹àžà¹àžà¹àžàž¢àžªàž±àžàž¥àž±àžàž©àžà¹à¹àžàž­àž£à¹à¹àžà¹àžàžà¹ (%%)  
+
+Collage.bgcolor:àžªàžµàžàž·à¹àžàž«àž¥àž±àžàžàž­àžàžàž·à¹àžàžàž²àžàž àž²àžàžàž±àžàžàž°àžàžµà¹àž£àž°àžàžžà¹àžàž£àž¹àžà¹àžàžà¹àž¥àžàžàž²àžàžªàžŽàžàž«àž (àžàž±àž§àž­àž¢à¹àž²àžà¹àžà¹àž #008000 àžàž°à¹àžªàžàžàžàž·à¹àžàž«àž¥àž±àžà¹àžà¹àžàžªàžµà¹àžàžµàž¢àž§à¹àžà¹ (forest green)  
+
+Collage.buttonname:àžà¹àž²àž¢àžàž·à¹àž­àžªàž³àž«àž£àž±àžàž«àžà¹àž²àžàž­àžàž±àž§à¹àž¢àžàžàž£àž°à¹àž àž à¹àž¥àž°àžàžžà¹àž¡à¹àžà¹àžàžàžàž³àžàž²àž  
+
+Collage.refreshDelay:àž­àž±àžàž£àž²àžàžµà¹àžàž·à¹àžàžàž²àžàž àž²àžàžàž°àžà¹àž­àžàž°à¹àžªàžàžàžàž¥à¹àž«àž¡à¹ (refresh) à¹àžàž¢àž¡àžµàž«àžà¹àž§àž¢à¹àžà¹àžàž¡àžŽàž¥àž¥àžŽàž§àžŽàžàž²àžàžµ  
+
+Collage.isJava2:à¹àžà¹à¹àžàž·à¹àž­àžàž§àžàžàžžàž¡àžàž²àž£à¹àž¥àž·àž­àžà¹àžà¹àžàž¥àž²àžªàž£àž±àžà¹àžàž¡à¹ (run-time) àžàž­àžàžàž²àž§àž² àžàž²àž§àž²à¹àžàž£àžžà¹àžàžàžµà¹àžªàž¹àžàžàž§à¹àž² (à¹àžà¹àž àžàž²àž§àž² 1.2 àžàž¶à¹àžà¹àž) àžàž°àž¡àžµàžàž²àž£àžªàžàž±àžàžªàžàžžàžàžàž²àž£àžàž§àžàžàžžàž¡àžàž§àž²àž¡à¹àžàž£à¹àžà¹àžªàžàžàž­àžàž àž²àžàžàžµà¹àž¥àž°à¹àž­àžµàž¢àžàžàž¶à¹àž àžªàžàž²àžàž°àžàžµà¹àžàž°àžà¹àž§àž¢àžàž§àžàžàžžàž¡àžªàžŽà¹àžàžà¹àž²àžà¹ àžàžµà¹à¹àžàžŽàžàžàž¶à¹àž àž­àž¢à¹àž²àžà¹àž£àžà¹àžàž²àž¡ àžàž²àž§àž²àž£àž±àžà¹àžàž¡à¹àžàžµà¹àž¡àžµàž­àž¢àž¹à¹à¹àžà¹àžàž£àž²à¹àžàž­àž£à¹ (built-in) àžàž²àžàžàž±àž§àžàž°à¹àžà¹àžàž£àžžà¹àž 1.1 à¹àžàž¢àžà¹àž²à¹àž£àžŽà¹àž¡àžà¹àžà¹àž¥à¹àž§ à¹àž­àžà¹àžàž¥à¹àžàžàž°àžàž¹àžàž­àž­àžà¹àžàžàž¡àž²à¹àž«à¹àžàž£àž§àžàžªàž­àžàž£àžžà¹àžàžàž­àžàžàž²àž§àž²àžàžµà¹à¹àžàž£àž²à¹àžàž­àž£à¹à¹àž£àžµàž¢àžà¹àžà¹àžàž²àžà¹àžàž¢àž­àž±àžà¹àžàž¡àž±àžàžŽ à¹àž¥àž°àžàž³àžàž²àžàž­àž¢à¹àž²àžàžªàž­àžàžàž¥à¹àž­àžàžàž±àž  
+
+Collage.imageMustNotHave:à¹àžà¹à¹àžàž·à¹àž­àž¢àž±àžàž¢àž±à¹àžàž£àž¹àžàžàžµà¹à¹àž¡à¹àžàž§àž£àžàž£àž²àžàžà¹àžàž àž²àžàžàž±àžàžàž° à¹àžà¹àž àžàžžà¹àž¡àž£àž¹àžàžàžµà¹àžàž£àž°àžàž­àžàžàž¶à¹àžà¹àžà¹àžà¹àžàžàžàž³àžàž²àž  
+
+Collage.caption:àžàž³àž­àžàžŽàžàž²àž¢àžàž¶à¹àžà¹àžà¹àžàžàž±àž§à¹àž¥àž·àž­àžàžàžµà¹àžàž°à¹àžªàžàžà¹àžà¹àžàž·à¹àžàžàž²àžàž àž²àžàžàž±àžàžàž°  
+
+
+#
+# Plugin option descriptions
+#
+AcronymExtractor.adding:àžàž²àž£à¹àžàžŽà¹àž¡  
+
+AcronymExtractor.already_seen:àžàžà¹àž¥à¹àž§  
+
+AcronymExtractor.desc:àžàž¥àž±à¹àžàž­àžŽàž Helper Extractor àžªàž³àž«àž£àž±àžàžàž³à¹àž«àžà¹àžà¹àž¥àž°àžàž²àž£àž¡àž²àž£à¹àžàž­àž±àžàžàž±àž§àž¢à¹àž­à¹àžàžà¹àž­àžàž§àž²àž¡  
+
+AcronymExtractor.done_acronym_extract:àžàž³àžàž²àž£àžàž±àžàžàž­àžàžàž±àž§àž¢à¹àž­à¹àž£àžµàž¢àžàž£à¹àž­àž¢à¹àž¥à¹àž§  
+
+AcronymExtractor.done_acronym_markup:àžàž³àž¡àž²àž£à¹àžàž­àž±àžàžàž±àž§àž¢à¹àž­à¹àž£àžµàž¢àžàž£à¹àž­àž¢à¹àž¥à¹àž§  
+
+AcronymExtractor.extract_acronyms:àžàž±àžàžàž­àžàžàž±àž§àž¢à¹àž­àžàž²àžàž àž²àž¢à¹àžàžà¹àž­àžàž§àž²àž¡ à¹àž¥àž°àžàž±à¹àžàžà¹àž²à¹àžà¹àžà¹àž¡àžàž²àžàž²àžàž²  
+
+AcronymExtractor.extracting_acronyms:àžàž²àž£àžàž±àžàžàž­àžàžàž±àž§àž¢à¹àž­  
+
+AcronymExtractor.marking_up_acronyms:à¹àžªà¹àžà¹àž²àžàž±àž§àž¢à¹àž­  
+
+AcronymExtractor.markup_acronyms:à¹àžàžŽà¹àž¡à¹àž¡àžàž²àžàž²àžàž²àžàž±àž§àž¢à¹àž­àž¥àžà¹àžàžà¹àž­àžàž§àž²àž¡à¹àž­àžàžªàž²àž£  
+
+ArchivesInfPlugin.desc:àžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹àž­à¹àž²àžàžà¹àž²àžà¹àžà¹àž¡ archives.inf (à¹àžà¹àž¡àžàžµà¹àžªàž£à¹àž²àžà¹àžà¹àžà¹àž£àžàžàž­àž£àžµàžà¹àž­àž¡àž¹àž¥àžàž±àžà¹àžà¹àžàžàž²àž§àž£à¹àž¡àž·à¹àž­à¹àžªàž£à¹àžàžªàžŽà¹àžàžàž²àž£àžàž³à¹àžà¹àž²) à¹àž¥àž°àžàž£àž°àž¡àž§àž¥àžàž¥à¹àžà¹àž¡à¹àžà¹àž¥àž°à¹àžà¹àž¡àžàžµà¹àžàž  
+
+AutoExtractMetadata.desc:àžàž¥àž±à¹àžàž­àžŽàžàžàž·à¹àžàžàž²àžàžàžµà¹àž£àž§àž¡à¹àž­àž²àž«àžà¹àž²àžàžµà¹àžàž²àž£àžàž³àžàž²àžàžàž±à¹àžàž«àž¡àžàžàž²àžàžàž¥àž±à¹àžàž­àžŽàž Extractor à¹àžà¹àž²àžà¹àž§àž¢àžàž±àž  
+
+AutoExtractMetadata.extracting:àžàž²àž£àžàž±àžàžàž­àž  
+
+AutoExtractMetadata.first:àž£àž²àž¢àžàž²àž£àžàžµà¹àžàž±à¹àžàžà¹àž§àž¢à¹àžàž£àž·à¹àž­àžàž«àž¡àž²àž¢àžàžžàž¥àž àž²àžàžàž­àžàžàžàž²àžà¹àž£àžàžàžµà¹àžàž°àžàž±àžàžàž­àžàžàž²àžàžà¹àž­àžàž§àž²àž¡à¹àžà¹àžªà¹à¹àž§à¹à¹àžà¹àžàžàžà¹àž­àž¡àž¹àž¥à¹àž¡àžàž²àžàž²àžàž² à¹àžàžàžà¹àž­àž¡àž¹àž¥àžàžµà¹à¹àž£àžµàž¢àžàž§à¹àž² 'FirstNNN'  
+
+BaseMediaConverter.desc:àžàž¥àž±à¹àžàž­àžŽàž Helper àžàžµà¹àžàž±àžà¹àžàž£àžµàž¢àž¡àž«àžà¹àž²àžàžµà¹àžàž²àž£àžàž³àžàž²àžàžàž·à¹àžàžàž²àžàžªàž³àž«àž£àž±àžàžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹à¹àžà¹à¹àžàž¥àžàžªàž·à¹àž­àžà¹àž²àžà¹ à¹àžà¹àž ImageConverter à¹àž¥àž°àžàž±àž§à¹àžàž¥àžà¹àžà¹àž¡àž§àžŽàžàžµà¹àž­  
+
+BasePlugin.associate_ext:àžàž³à¹àž«à¹à¹àžà¹àž¡àžàž¶à¹àžàž¡àžµàžàž·à¹àž­à¹àžà¹àž¡àžàžµà¹àž¡àžµàž£àž²àžà¹àžàžµàž¢àž§àžàž±àžàžàž±àžà¹àž­àžàžªàž²àž£àžàžµà¹àžàž³àž¥àž±àžàžàž¹àžàžàž£àž°àž¡àž§àž¥àžàž¥àžà¹àž§àž¢àžàž¥àž±à¹àžàž­àžŽàž à¹àž¥àž°àžàž²àž¡àžªàžàžžàž¥àžàž­àžàžàž·à¹àž­à¹àžà¹àž¡àžàž²àžàž£àž²àž¢àžàž²àž£àžàžµà¹àžàž±à¹àžàžà¹àž­àž¡àž¹àž¥àžà¹àž§àž¢à¹àžàž£àž·à¹àž­àžàž«àž¡àž²àž¢àžàžžàž¥àž àž²àžàžàž¶à¹àžà¹àžà¹àžàž²àžàž­àž²àž£à¹àžàžŽàž§à¹àž¡àžàžà¹àžàžµà¹àžªàž±àž¡àžàž±àžàžà¹àžàž±àžà¹àž­àžàžªàž²àž£àžàžµà¹àžàž³àž¥àž±àžàžàž£àž°àž¡àž§àž¥àžàž¥à¹àžàžàžàž²àž£àžàž±àžàžàž²àž£à¹àžà¹àžàž£àž²àž¢àžàž²àž£à¹àž¢àžàžà¹àž²àžàž«àž²àž  
+
+BasePlugin.associate_tail_re:àžàžŽàžàžàžà¹àžàžàžàžŽàžàžµà¹à¹àžà¹à¹àžàžµàž¢àžàžàž·à¹àž­à¹àžà¹àž¡à¹àž«à¹àžàž£àžàžàž±àžà¹àžàž·à¹àž­àžà¹àžàž«àž²à¹àžà¹àž¡àžàžµà¹àž¡àžµàžàž§àž²àž¡àžªàž±àž¡àžàž±àžàžà¹àžàž±àž à¹àžà¹àžàžàž²àžà¹àž¥àž·àž­àžàžàžµà¹àž¡àžµàžàž§àž²àž¡àžªàž²àž¡àž²àž£àžàž¡àž²àžàžàž§à¹àž² associate_ext  
+
+BasePlugin.block_exp:à¹àžà¹àž¡àžàžµà¹àžàž£àžàžàž±àžàžàžŽàžàžàžà¹àžàžàžàžŽàžàžµà¹àžàž°àžàž¹àžàžà¹àž­àžàžàž±àžà¹àž¡à¹à¹àž«à¹àžàž¹àžàžªà¹àžàžà¹àž­à¹àžàž¢àž±àžàžàž¥àž±à¹àžàž­àžŽàžàžàž±àžà¹àžà¹àžàž£àž²àž¢àžàž²àž£ àžàž²àž£àžàž£àž°àžàž³à¹àžà¹àžàžàžµà¹àžàž°à¹àž¡à¹àžªà¹àžàžàž¥à¹àžà¹ àžàž­àžàžàž²àžà¹àžàž·à¹àž­à¹àžà¹àžàžàž²àž£àžà¹àž­àžàžàž±àžà¹àž¡à¹à¹àž«à¹à¹àžàžŽàžàžà¹àž­àžàž§àž²àž¡à¹àžàž·àž­àžà¹àžàžµà¹àž¢àž§àžàž±àžà¹àžà¹àž¡àžà¹àž­àž¡àž¹àž¥àžàž³à¹àžà¹àž²àžàž³àžàž§àžàž¡àž²àžàžàžµà¹àžàžžàžàž­àž²àžàžàž°à¹àž¡à¹à¹àžà¹àžªàžà¹àž àžàž¥àž±à¹àžàž­àžŽàžà¹àžà¹àž¥àž°àžàž±àž§àž­àž²àžàž¡àžµ block_exp à¹àž£àžŽà¹àž¡àžà¹àž à¹àžà¹àž à¹àžàž¢àžà¹àž²à¹àž£àžŽà¹àž¡àžà¹àžà¹àž¥à¹àž§ HTMLPlugin àžàž°àžà¹àž­àžàžàž±àžà¹àžà¹àž¡à¹àžà¹ àžàžµà¹àž¡àžµàžàž²àž¡àžªàžàžžàž¥ .gif, .jpg, .jpeg, .png àž«àž£àž·àž­ .css  
+
+BasePlugin.desc:àžàž¥àž²àžªàžàž·à¹àžàžàž²àžàžªàž³àž«àž£àž±àžàžàž¥àž±à¹àžàž­àžŽàžàžàž³à¹àžà¹àž²àžàž±à¹àžàž«àž¡àž  
+
+BasePlugin.dummy_text:à¹àž¡à¹àž¡àžµàžà¹àž­àžàž§àž²àž¡à¹àžà¹ à¹àžà¹àž­àžàžªàž²àž£àžàžµà¹  
+
+BasePlugin.encoding.ascii:àž£àž«àž±àžªà¹àž­àžªàžàžµà¹àžàž 7 àžàžŽàžàž­àž¢à¹àž²àžà¹àžàžµàž¢àž§ àžàž¶à¹àžàž­àž²àžàžàž°à¹àž£à¹àž§àžàž§à¹àž²à¹àžà¹ iso_8859_1 à¹àž¥à¹àžàžà¹àž­àž¢ à¹àžàž£àžàž£àž°àž§àž±àžà¹àž¡àž·à¹àž­àž¡àžµàžàž²àž£à¹àž¥àž·àž­àžà¹àžà¹àž£àž«àž±àžªàžàžµà¹ à¹àžàž·à¹àž­àžàžàž²àžàžà¹àž­àžàž§àž²àž¡àž­àž²àžàžàž£àž°àžàž­àžàžà¹àž§àž¢àž­àž±àžàžàž£àž°àžàžµà¹àž­àž¢àž¹à¹àžàž­àžà¹àž«àžàž·àž­àž£àž«àž±àžªà¹àž­àžªàžàžµà¹àžàž 7 àžàžŽàžàž­àž¢à¹àž²àžà¹àžàžµàž¢àž§ (à¹àžà¹àž àžà¹àž­àžàž§àž²àž¡àžàžµà¹à¹àžà¹àžàž àž²àž©àž²à¹àž¢àž­àž£àž¡àž±àžàž«àž£àž·àž­àžàž£àž±à¹àžà¹àžšàžªàžàžµà¹àž¡àžµàžàž±àž§à¹àžà¹àžà¹àžªàžµàž¢àž) àž«àž²àžà¹àžà¹àžàžàž£àžàžµàžàžµà¹ à¹àž«à¹à¹àžà¹ iso_8859_1 à¹àžàž  
+
+BasePlugin.encoding.unicode:à¹àžà¹àžàžàžµàž¢àžà¹àžà¹ Unicode  
+
+BasePlugin.encoding.utf8:utf8 àž«àž£àž·àž­ Unicode à¹àžàž¢àž£àž°àžàžàžàž°àžàž£àž§àžàžàž±àžà¹àžàž¢àž­àž±àžà¹àžàž¡àž±àžàžŽ  
+
+BasePlugin.filename_encoding:àžàž²àž£à¹àžà¹àž²àž£àž«àž±àžªàžàž·à¹àž­à¹àžà¹àž¡àžàž­àžà¹àžà¹àž¡àžà¹àžàžàžàž±àž  
+
+BasePlugin.filename_encoding.auto:àžàž£àž§àžàžàž±àžàžàž²àž£à¹àžà¹àž²àž£àž«àž±àžªàžàž­àžàžàž·à¹àž­à¹àžà¹àž¡à¹àžàž¢àž­àž±àžà¹àžàž¡àž±àžàžŽ  
+
+BasePlugin.filename_encoding.auto_language_analysis:àžàž£àž§àžàžàž±àžàžàž²àž£à¹àžà¹àž²àž£àž«àž±àžªàžàž·à¹àž­à¹àžà¹àž¡à¹àžàž¢àž­àž±àžà¹àžàž¡àž±àžàžŽàžà¹àž§àž¢àžàž²àž£àž§àžŽà¹àžàž£àž²àž°àž«à¹àžàž·à¹àž­à¹àžà¹àž¡  
+
+BasePlugin.filename_encoding.auto_filesystem_encoding:àžàž£àž§àžàžàž±àžàžàž²àž£à¹àžà¹àž²àž£àž«àž±àžªàžàž·à¹àž­à¹àžà¹àž¡à¹àžàž¢àž­àž±àžà¹àžàž¡àž±àžàžŽà¹àžàž¢à¹àžà¹àžàž²àž£à¹àžà¹àž²àž£àž«àž±àžªàžàž­àžàž£àž°àžàžà¹àžà¹àž¡  
+
+BasePlugin.filename_encoding.auto_fl:à¹àžà¹àžàž²àž£à¹àžà¹àž²àž£àž«àž±àžªàžàž­àžàž£àž°àžàžà¹àžà¹àž¡àžàž²àž¡àžà¹àž§àž¢àžàž²àž£àž§àžŽà¹àžàž£àž²àž°àž«à¹àž àž²àž©àž²à¹àžàž·à¹àž­àžàž£àž§àžàžàž±àžàžàž²àž£à¹àžà¹àž²àž£àž«àž±àžªàžàž·à¹àž­à¹àžà¹àž¡  
+
+BasePlugin.filename_encoding.auto_lf:à¹àžà¹àžàž²àž£àž§àžŽà¹àžàž£àž²àž°àž«à¹àž àž²àž©àž²àžàž²àž¡àžà¹àž§àž¢àžàž²àž£à¹àžà¹àž²àž£àž«àž±àžªàžàž­àžàž£àž°àžàžà¹àžà¹àž¡à¹àžàž·à¹àž­àžàž£àž§àžàžàž±àžàžàž²àž£à¹àžà¹àž²àž£àž«àž±àžªàžàž·à¹àž­à¹àžà¹àž¡  
+
+BasePlugin.no_blocking:àžàž£àžžàžàž²àž­àž¢à¹àž²àžàž³à¹àžàžŽàžàžàž²àž£àžàž¥à¹àž­àžà¹àžà¹àž¡à¹àžà¹ à¹àžà¹àž¡àžàžµà¹à¹àžàžµà¹àž¢àž§àžà¹àž­àžà¹àžà¹ (à¹àžà¹àž àž£àž¹àžàž àž²àžà¹àžà¹àž§à¹àžà¹àžàž) àžàž°àžàž¹àžà¹àžàžŽà¹àž¡à¹àžà¹àž²à¹àžà¹àžàžàž­àž¥à¹àž¥àžàžàž±àžà¹àžà¹àžà¹àžàžµàž¢àž§àžàž±àžà¹àž­àžàžªàž²àž£àž­àž·à¹àžà¹  
+
+BasePlugin.no_cover_image:àžàž£àžžàžàž²àž­àž¢à¹àž²àž¡àž­àžàž«àž²à¹àžà¹àž¡ prefix.jpg (àžàž¶à¹àžàžàž³àžàž³àž«àžà¹àž²à¹àžà¹àžàžàž³à¹àžàžµàž¢àž§àžàž±àžà¹àžà¹àž¡àžàžµà¹àžàž³àž¥àž±àžàžàž¹àžàžàž£àž°àž¡àž§àž¥àžàž¥) à¹àž¥àž°àžàž³àž¡àž²à¹àžà¹àžàž£àž¹àžàž«àžà¹àž²àžàž  
+
+BasePlugin.OIDtype.auto:à¹àžà¹àžàžžàž OIDtype à¹àž import.pl  
+
+BasePlugin.process_exp:àžàžŽàžàžàžà¹àžàžàžàžŽàžàž­àžàž àž²àž©àž² Perl àžàžµà¹àžªàž­àžàžàž¥à¹àž­àžàžàž±àžàžàž·à¹àž­à¹àžà¹àž¡ àžàž·à¹àž­à¹àžà¹àž¡àžàžµà¹àžàž£àžàžàž±àžàžàž°àžàž¹àžàžàž£àž°àž¡àž§àž¥àžàž¥àžà¹àž§àž¢àžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹ àžàž±àž§àž­àž¢à¹àž²àžà¹àžà¹àž àžàž²àž£à¹àžà¹ '(?i).html?\$' àžàž°àžàž£àžàžàž±àžà¹àž­àžàžªàž²àž£àžàž±à¹àžàž«àž¡àžàžàžµà¹àž¥àžàžà¹àž²àž¢àžà¹àž§àž¢ .htm àž«àž£àž·àž­ .html (à¹àž¡à¹à¹àž¢àžà¹àž¢àž°àžàž±àž§àžàžŽàž¡àžà¹à¹àž«àžà¹-à¹àž¥à¹àž)  
+
+BasePlugin.smart_block:àžàž¥à¹àž­àžà¹àžà¹àž¡àžà¹àž§àž¢àž§àžŽàžàžµàžàž²àž£àžàžµà¹àžàžªàžàžàž¥àž²àžàžàž§à¹àž²àžàž²àž£àžàž¹àžàžµà¹àžàž·à¹àž­à¹àžà¹àž¡à¹àžàžµàž¢àžàž­àž¢à¹àž²àžà¹àžàžµàž¢àž§  
+
+BasePlugin.stems:àž£àž²àžàžšàž±àžàžà¹  
+
+BasePlugin.file_rename_method:à¹àž¡àžàž­àžàžàžµà¹à¹àžà¹à¹àžàžàž²àž£àžàž±à¹àžàžàž·à¹àž­à¹àž«àž¡à¹à¹àž«à¹àžàž±àžàžªàž³à¹àžàž²àžàž­àžà¹àžà¹àž¡àžàžµà¹àžàž³à¹àžà¹àž²à¹àž¥àž°à¹àžà¹àž¡àžàžµà¹àž¡àžµàžàž§àž²àž¡àžªàž±àž¡àžàž±àžàžà¹àžàž±àž  
+
+BasePlugin.rename_method.url:à¹àžà¹àžàž²àž£à¹àžà¹àž²àž£àž«àž±àžª url à¹àžàžàž²àž£àžàž±à¹àžàžàž·à¹àž­à¹àž«àž¡à¹à¹àž«à¹àžàž±àžà¹àžà¹àž¡àžàžµà¹à¹àžà¹àžàž³à¹àžà¹àž²à¹àž¥àž°à¹àžà¹àž¡àžàžµà¹à¹àžàžµà¹àž¢àž§àžà¹àž­àž  
+
+BasePlugin.rename_method.base64:à¹àžà¹àžàž²àž£à¹àžà¹àž²àž£àž«àž±àžª base64 à¹àžàžàž²àž£àžàž±à¹àžàžàž·à¹àž­à¹àž«àž¡à¹à¹àž«à¹àžàž±àžà¹àžà¹àž¡àžàžµà¹à¹àžà¹àžàž³à¹àžà¹àž²à¹àž¥àž°à¹àžà¹àž¡àžàžµà¹à¹àžàžµà¹àž¢àž§àžà¹àž­àž  
+
+BasePlugin.rename_method.none:à¹àž¡à¹àžàž±à¹àžàžàž·à¹àž­à¹àž«àž¡à¹à¹àž«à¹àžàž±àžà¹àžà¹àž¡àžàžµà¹à¹àžà¹àžàž³à¹àžà¹àž²à¹àž¥àž°à¹àžà¹àž¡àžàžµà¹à¹àžàžµà¹àž¢àž§àžà¹àž­àž  
+
+BibTexPlugin.desc:BibTexPlugin àžàž°àž­à¹àž²àžà¹àžà¹àž¡àžàž£àž£àžàž²àžàžžàžàž£àž¡à¹àžàž£àž¹àžà¹àžàž BibTex à¹àž¥àž°àžàž°àžªàž£à¹àž²àžàž§àž±àžàžàžžà¹àž­àžàžªàž²àž£àžªàž³àž«àž£àž±àžàžàžžàžàžàž²àž£àž­à¹àž²àžàž­àžŽàžà¹àžà¹àžà¹àž¡ à¹àžàž¢ BibTexPlugin à¹àžà¹àžàžàž¥àž²àžªàž¢à¹àž­àž¢àžàž­àž SplitTextFile àžàž±àžàžàž±à¹àž àžà¹àž²àž¡àžµàž«àž¥àž²àž¢àž£àž°à¹àžàžµàž¢àž àž£àž°àžàžàžàž°àž­à¹àž²àžàž£àž°à¹àžàžµàž¢àžà¹àž«àž¥à¹àž²àžàž±à¹àžàžàž±à¹àžàž«àž¡àž  
+
+BookPlugin.desc:àžªàž£à¹àž²àžà¹àž­àžàžªàž²àž£àž«àž¥àž²àž¢àž£àž°àžàž±àžàžàž²àžà¹àž­àžàžªàž²àž£àžàžµà¹àž¡àžµà¹àžà¹àžàž£àž°àžàž±àž <<TOC>>  à¹àž¡àžàž²àžàž²àžàž²àžàž­àžà¹àžà¹àž¥àž°àžªà¹àž§àžàžàž°àžàž¹àžàžàž¶àžàžàž²àžà¹àžà¹àžàž­àž·à¹àžà¹ à¹àžàžàž£àž£àžàž±àžà¹àžàžµàž¢àž§àžàž±àžàžàž±àž <<TOC>> à¹àžà¹àž <<Title>>xxxx<</Title>> àžàž°àžàž±à¹àžàžà¹àž²à¹àž¡àžàž²àžàž²àžàž² 'àžàž·à¹àž­à¹àž£àž·à¹àž­àž' àžà¹àž­àž¡àž¹àž¥àž­àž·à¹àžà¹ àž£àž°àž«àž§à¹àž²àžà¹àžà¹àž TOC àžàž°àžàž¹àžàžàž³à¹àžàžŽàžàžàž²àž£à¹àžàž£àž¹àžà¹àžàž HTML àž­àž¢à¹àž²àžàžà¹àž²àž¢ (à¹àž¡à¹àž¡àžµàžàž²àž£àžàž£àž°àž¡àž§àž¥àžàž¥àžàž²àž£à¹àžàž·à¹àž­àž¡à¹àž¢àž HTML àž«àž£àž·àž­àžàž²àž£àžàž£àž°àž¡àž§àž¥àžàž¥à¹àžàž HTMLPlugin) à¹àžà¹àž¡àžà¹àž­àž¡àž¹àž¥à¹àžà¹àž²àžàž§àž£àžàž°àž¡àžµàžàž²àž¡àžªàžàžžàž¥ .hb àžàž²àž¡àžà¹àž²à¹àž£àžŽà¹àž¡àžà¹àž (àžàž¶à¹àžàžªàž²àž¡àž²àž£àžà¹àžàž¥àžµà¹àž¢àžà¹àžà¹àžà¹àž§àž¢àžàž²àž£à¹àžà¹àžàž±àž§à¹àž¥àž·àž­àž -process_exp) à¹àžà¹àž¡àžàžµà¹àž¡àžµàžàž·à¹àž­à¹àžàžµàž¢àž§àžàž±àžàžàž±àžà¹àžà¹àž¡ hb à¹àžà¹àž¡àžµàžàž²àž¡àžªàžàžžàž¥ .jpg àžàž°àžàž¹àžàžàž¶àžàž¡àž²à¹àžà¹àžàž£àž¹àžàž«àžà¹àž²àžàž (à¹àžà¹àž¡ jpg àžàž°àžàž¹àžàžàž¥à¹àž­àžàžà¹àž§àž¢àžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹)  BookPlugin à¹àžà¹àžàžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹àžàž¹àžàžàž³à¹àž«à¹àžà¹àž²àž¢ (à¹àž¥àž°àžàž¢àž²àž¢) àžàž²àž HBPlugin àžàžµà¹à¹àžà¹à¹àžàž¢àžàž­àž¥à¹àž¥àžàžàž±àžàžàž­àžàž«à¹àž­àžàžªàž¡àžžàžàž¡àžàžžàž©àž¢à¹àžšàž²àžªàžàž£à¹ (Humanity Library) BookPlugin àžàž°àžàž£àž°àž¡àž§àž¥àžàž¥à¹àžà¹à¹àž£à¹àž§àžàž§à¹àž² à¹àžàž·à¹àž­àžàžàž²àžàž£àž°àžàžàžàž²àžàž§à¹àž²à¹àžà¹àž¡àžà¹àž­àž¡àž¹àž¥à¹àžà¹àž²àžàž°àž¡àžµàžàž§àž²àž¡à¹àžà¹àžàž£àž°à¹àžàžµàž¢àžàžàž§à¹àž² (àžà¹àž­àž¡àž¹àž¥àžàžµà¹à¹àžà¹àž²à¹àžàž¢àž±àžàžàž­àž¥à¹àž¥àžàžàž±àž HDL àžàž°àž¡àžµà¹àžà¹àž HTML à¹àžàžàž³àžàž§àžàžàžµà¹àž¡àž²àžà¹àžàžŽàžàž­àž¢àž¹à¹àž£àž­àžà¹ à¹àžà¹àž <<TOC>> à¹àžà¹à¹àžà¹àž <<I>> à¹àžàž·à¹àž­àž£àž°àžàžžàž àž²àž à¹àž¥àž°àžàž¶àžàžà¹àž­àžàž§àž²àž¡àžàž±à¹àžàž«àž¡àžàžàžµà¹àž­àž¢àž¹à¹àž£àž°àž«àž§à¹àž²àžà¹àžà¹àž <<TOC>> à¹àž¥àž°àžàžžàžà¹àž£àžŽà¹àž¡àžà¹àžàžàž­àžàžà¹àž­àžàž§àž²àž¡àž¡àž²à¹àžà¹àžà¹àž¡àžàž²àžàž²àžàž² 'àžàž·à¹àž­à¹àž£àž·à¹àž­àž') àžà¹àž²àžàžžàžàžàž³àž¥àž±àžàžàž£àž±àžà¹àžà¹àžà¹àž­àžàžªàž²àž£à¹àžàž·à¹àž­à¹àž«à¹à¹àžªàžàžà¹àžàž£àž¹àžà¹àžàžà¹àžàžµàž¢àž§àžàž±àžàžàž±àžàžàž­àž¥à¹àž¥àžàžàž±àž HDL à¹àž«à¹à¹àžà¹àžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹à¹àžàž HBPlugin  
+
+CONTENTdmPlugin.desc:àžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹àžàž³à¹àžàžŽàžàžàž²àž£àžàž£àž°àž¡àž§àž¥àžàž¥à¹àžà¹àž¡ RDF à¹àžàžàž­àž¥à¹àž¥àžàžàž±àž CONTENTdm àžàžµà¹àžªà¹àžàž­àž­àž  
+
+ConvertBinaryFile.apply_fribidi:à¹àž£àžµàž¢àžà¹àžà¹à¹àžàž£à¹àžàž£àž¡àž­àž±àž¥àžàž­àž£àžŽàžàž¶àž¡ Unicode à¹àžàžàžªàž­àžàžàžŽàžšàžàž²àž "fribidi" àžàž±àžà¹àžà¹àž¡àžàžµà¹à¹àžàž¥àžà¹àž¥à¹àž§ (àžªàž³àž«àž£àž±àžàžà¹àž­àžàž§àž²àž¡àžàž²àžàžàž§àž²à¹àžàžà¹àž²àž¢)  
+
+ConvertBinaryFile.convert_to:àžàž¥àž±à¹àžàž­àžŽàžàžàž°à¹àžàž¥àžà¹àž«à¹à¹àžà¹àž TEXT àž«àž£àž·àž­ HTML àž«àž£àž·àž­àž£àž¹àžàžàžàžŽàžàžà¹àž²àžà¹ (à¹àžà¹àž JPEG, GIF, PNG)  
+
+ConvertBinaryFile.convert_to.auto:à¹àž¥àž·àž­àžàž£àž¹àžà¹àžàžàžàž¥àž²àž¢àžàž²àžàžàžµà¹àžà¹àž­àžàžàž²àž£à¹àžàž¥àžà¹àžàž¢àž­àž±àžà¹àžàž¡àž±àžàžŽ àž£àž¹àžà¹àžàžàžàžµà¹à¹àž¥àž·àž­àžàžàž¶à¹àžàž­àž¢àž¹à¹àžàž±àžàžàžàžŽàžàžàž­àžà¹àž­àžàžªàž²àž£àžà¹àž² àžàž±àž§àž­àž¢à¹àž²àžà¹àžà¹àž Word àžàž°àžàž¹àžà¹àžàž¥àžà¹àž«à¹à¹àžà¹àž HTML à¹àžàž¢àž­àž±àžà¹àžàž¡àž±àžàžŽ à¹àžàžàžàž°àžàžµà¹ PowerPoint àžàž°àžàž¹àžà¹àžàž¥àžà¹àž«à¹àž­àž¢àž¹à¹à¹àžàž£àž¹àžà¹àžàž PagedImage àžàž­àžà¹àžàž£à¹àžàž£àž¡àžàž£àžµàžàžªà¹àžàž  
+
+ConvertBinaryFile.convert_to.html:àž£àž¹àžà¹àžàž HTML  
+
+ConvertBinaryFile.convert_to.text:àž£àž¹àžà¹àžàžàžà¹àž­àžàž§àž²àž¡àž­àž¢à¹àž²àžà¹àžàžµàž¢àž§  
+
+ConvertBinaryFile.convert_to.pagedimg:àžàžžàžàžàž­àžàž£àž¹àžàž àž²àž  
+
+ConvertBinaryFile.convert_to.pagedimg_jpg:àž£àž¹àžà¹àžàž JPEG  
+
+ConvertBinaryFile.convert_to.pagedimg_gif:àž£àž¹àžà¹àžàž GIF  
+
+ConvertBinaryFile.convert_to.pagedimg_png:àž£àž¹àžà¹àžàž PNG  
+
+ConvertBinaryFile.desc:àžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹à¹àžà¹àž£àž±àžàžªàž·àžàžàž­àžàž¡àž²à¹àžàž¢àžàž¥àž±à¹àžàž­àžŽàžàžà¹àž²àžà¹ à¹àžà¹àž WordPlugin, PowerPointPlugin, PostscriptPlugin, RTFPlugin à¹àž¥àž° PDFPlugin àžàž¥àž±à¹àžàž­àžŽàžàžàž°àžà¹àž§àž¢à¹àžàž¥àžàžàžàžŽàžàžàž­àžà¹àž­àžàžªàž²àž£à¹àž«àž¥à¹àž²àžàžµà¹à¹àžà¹àž HTML, TEXT àž«àž£àž·àž­àžàžžàžàžàž­àžàž£àž¹àž àžàž¥àž±à¹àžàž­àžŽàžàžàž°àžàž³àžàž²àžàžà¹àž§àž¢àžàž²àž£à¹àž«àž¥àžàžàž¥àž±à¹àžàž­àžŽàžàž£àž­àžàžàžµà¹à¹àž«àž¡àž²àž°àžªàž¡à¹àžàžà¹àžàžàž²àž¡àžŽàž (HTMLPlugin, StructuredHTMLPlugin, PagedImgPlugin àž«àž£àž·àž­ TEXTPlugin) àžàž¶à¹àžàž­àž¢àž¹à¹àžàž±àžàž­àž²àž£à¹àžàžŽàž§à¹àž¡àžàžà¹àžàž­àžàžàž¥àž±à¹àžàž­àžŽàž 'convert_to'  
+
+ConvertBinaryFile.keep_original_filename:à¹àžà¹àžàžàž·à¹àž­à¹àžà¹àž¡àžàž±à¹àžà¹àžàžŽàž¡àžªàž³àž«àž£àž±àžà¹àžà¹àž¡àžàžµà¹àžªàž±àž¡àžàž±àžàžà¹àžàž±àž à¹àžàžàžàž²àž£à¹àžàž¥àžà¹àž«à¹à¹àžà¹àž doc.pdf, doc.doc à¹àžà¹àžàžà¹àž  
+
+ConvertBinaryFile.use_strings:àžà¹àž²àž¡àžµàžàž²àž£àžàž±à¹àžàžà¹àž²à¹àž§à¹ àžàž±àžàžà¹àžàž±àžàžªàžàž£àžŽàžàž­àž¢à¹àž²àžàžà¹àž²àž¢àžàž°àžàž¹àžà¹àž£àžµàž¢àžà¹àžàž·à¹àž­àžàž±àžàžàž­àžàžà¹àž­àžàž§àž²àž¡àžà¹àž²à¹àžàž£à¹àžàž£àž¡àž­àž£àž£àžàžàž£àž°à¹àž¢àžàžà¹àžàž²àž£à¹àžàž¥àžà¹àž¡à¹àžàž³àžàž²àž  
+
+ConvertToRogPlugin.desc:àžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹àž£àž±àžàžªàž·àžàžàž­àžàžàž²àž RogPlugin.  
+
+CSVPlugin.desc:àžàž¥àž±à¹àžàž­àžŽàžàžªàž³àž«àž£àž±àžà¹àžà¹àž¡à¹àžàž£àž¹àžà¹àžàžàžà¹àž²àžàžµà¹àžàž±à¹àžàžà¹àž§àž¢à¹àžàž£àž·à¹àž­àžàž«àž¡àž²àž¢àžàžžàž¥àž àž²àž à¹àž­àžàžªàž²àž£à¹àž«àž¡à¹àžàž°àžàž¹àžàžªàž£à¹àž²àžà¹àž«à¹àžàž±àžà¹àžà¹àž¥àž°àžàž£àž£àžàž±àžàžàž­àžà¹àžà¹àž¡  
+
+DateExtractor.desc:àžàž¥àž±à¹àžàž­àžŽàž Helper extractor àžªàž³àž«àž£àž±àžàžàž²àž£àžàž¶àžàžà¹àž­àž¡àž¹àž¥àž§àž±àžàžàžµà¹àžàž²àžàžàž£àž°àž§àž±àžàžŽàžšàž²àžªàžàž£à¹àžàž²àžàžà¹àž­àžàž§àž²àž¡  
+
+DateExtractor.extract_historical_years:àžàž±àžàžàž­àžàžà¹àž­àž¡àž¹àž¥àžà¹àž§àžà¹àž§àž¥àž²àžàž²àžà¹àž­àžàžªàž²àž£à¹àžàžŽàžàžàž£àž°àž§àž±àžàžŽàžšàž²àžªàžàž£à¹ à¹àžàž¢àžà¹àž²àžàžµà¹àžàž°àžàž¹àžàžàž±àžà¹àžà¹àžà¹àžà¹àžà¹àž¡àžàž²àžàž²àžàž²àžàž£à¹àž­àž¡à¹àž­àžàžªàž²àž£ à¹àž¥àž°àžàž°àž¡àžµàž«àžà¹àž²àžàž­àžà¹àžàž«àž²àžªàž³àž«àž£àž±àžà¹àž¡àžàž²àžàž²àžàž²àžàžµà¹ àžàž¶à¹àžàžàžžàžàžªàž²àž¡àž²àž£àžàž£àž§àž¡à¹àžà¹àž²à¹àžà¹àžàžàž­àž¥à¹àž¥àžàžàž±àžàžàž­àžàžàžžàžà¹àžà¹ à¹àžàž¢à¹àžàžŽà¹àž¡àžà¹àž­àžàž§àž²àž¡ "format QueryInterface DateSearch" àž¥àžà¹àžà¹àžà¹àž¡àžàž³àž«àžàžàžà¹àž²àžàž­àž¥à¹àž¥àžàžàž±àžàžàž­àžàžàžžàž  
+
+DateExtractor.maximum_century:àžà¹àž²àžªàž¹àžàžªàžžàžàžàž­àžàžšàžàž§àž£àž£àž©àžàžµà¹àžàž°àžàž¹àžàžàž±àžàžàž­àžà¹àžà¹àžà¹àž¡àžàž²àžàž²àžàž²à¹àžàžŽàžàžàž£àž°àž§àž±àžàžŽàžšàž²àžªàžàž£à¹ (à¹àžà¹àž 14 àžàž°àžàž±àžàžàž­àžàžàž²àž£àž­à¹àž²àžàž­àžŽàžàžàž±à¹àžàž«àž¡àžàžàžàžàž¶àžàžšàžàž§àž£àž£àž©àžàžµà¹ 14)  
+
+DateExtractor.maximum_year:àžà¹àž²àžªàž¹àžàžªàžžàžàžàž­àžàž§àž±àžàžàžµà¹à¹àžàžŽàžàžàž£àž°àž§àž±àžàžŽàžšàž²àžªàžàž£à¹àžàžµà¹àžàž°à¹àžà¹à¹àžà¹àžà¹àž¡àžàž²àžàž²àžàž² (àž£àž¹àžà¹àžàžàž§àž±àžàžàžµà¹à¹àžàžàžàž£àžŽàžªàžàžšàž±àžàž£àž²àž à¹àžà¹àž 1950)  
+
+DateExtractor.no_bibliography:àžàž£àžžàžàž²àž­àž¢à¹àž²àžàž¢àž²àž¢àž²àž¡àžàž¥à¹àž­àžàž§àž±àžàžàžµà¹à¹àžàžŽàžàžàž£àž£àžàž²àžàžžàžàž£àž¡àžàžàž°àžàž±àžàžàž­àžàž§àž±àžàžàžµà¹à¹àžàžŽàžàžàž£àž°àž§àž±àžàžŽàžšàž²àžªàžàž£à¹  
+
+DirectoryPlugin.desc:RecPlug à¹àžà¹àžàžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹àž§àžàžà¹àž³à¹àžà¹àžà¹àž£àžàžàž­àž£àžµà¹àžàž·à¹àž­àžàž£àž°àž¡àž§àž¥àžàž¥à¹àžà¹àž¡à¹àžà¹àž¥àž°à¹àžà¹àž¡àžàžµà¹àžàž  
+
+DirectoryPlugin.recheck_directories:àž«àž¥àž±àžàžàž²àžàžàžµà¹à¹àžà¹àž¡à¹àžà¹àžà¹àž£àžàžàž­àž£àžµàžàž³à¹àžà¹àž²àžàž¹àžàžàž£àž°àž¡àž§àž¥àžàž¥à¹àž¥à¹àž§ à¹àž«à¹àž­à¹àž²àžà¹àžà¹àž£àžàžàž­àž£àžµàž­àžµàžàžàž£àž±à¹àžà¹àžàž·à¹àž­àžà¹àžàž«àž²à¹àžà¹àž¡à¹àž«àž¡à¹àž­àž·à¹àžà¹ àžàžµà¹àžªàž£à¹àž²àžàžàž¶à¹àž  
+
+DirectoryPlugin.use_metadata_files:(àžàž±àžàžà¹àž²àž - à¹àžàžŽà¹àž¡ MetadataXMLPlug àž¥àžà¹àžàž£àž²àž¢àžàž²àž£àžàž¥àž±à¹àžàž­àžŽàžà¹àžàž) àž­à¹àž²àžà¹àž¡àžàž²àžàž²àžàž²àžàž²àžà¹àžà¹àž¡ XML à¹àž¡àžàž²àžàž²àžàž²  
+
+DatabasePlugin.desc:àžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹àžàž³à¹àžà¹àž²àž£àž°à¹àžàžµàž¢àžàžàž²àžàžàž²àžàžà¹àž­àž¡àž¹àž¥ àžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹àžàž°à¹àžà¹à¹àž¡àžàž¹àž¥ DBI àžàž­àž perl àžàž¶à¹àžàž£àž§àž¡àžàž¶àžà¹àžà¹àžà¹àž­à¹àžàžà¹àžªàž³àž«àž£àž±àž mysql, postgresql, àžà¹àž²àžàžµà¹àžàž±à¹àžàžà¹àž§àž¢à¹àžàž£àž·à¹àž­àžàž«àž¡àž²àž¢àžàžžàž¥àž àž²àž (CSV), MS Excel, ODBC, sybase à¹àž¥àž°àž­àž·à¹àžà¹ àžàžžàžàž­àž²àžàžàž³à¹àžà¹àžàžà¹àž­àžàžàžŽàžàžàž±à¹àžà¹àž¡àžàž¹àž¥àžàžŽà¹àžšàž©à¹àžàž·à¹àž­à¹àžà¹àžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹ àžªàž³àž«àž£àž±àžàžàž±àž§àž­àž¢à¹àž²àžà¹àžà¹àž¡àžàž³àž«àžàžàžà¹àž² à¹àž«à¹àžàž¹àžàžµà¹ <GSDLHOME>/etc/packages/example.dbi  
+
+DSpacePlugin.desc:DSpacePlug àžàž°àž£àž±àžàžàž­àž¥à¹àž¥àžàžàž±àžàžàž­àžà¹àž­àžàžªàž²àž£àžàžµà¹àžªà¹àžàž­àž­àžàžàž²àž DSpace àž¡àž² à¹àž¥àž°àžàž³à¹àžà¹àž²àžàž­àž¥à¹àž¥àžàžàž±àžà¹àž«àž¥à¹àž²àžàž±à¹àžà¹àžà¹àžàž£à¹àžàž£àž¡àžàž£àžµàžàžªà¹àžàž  
+	
+DSpacePlugin.first_inorder_ext:àž£àž°àžàžàžàž°à¹àžà¹àžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹à¹àžàž·à¹àž­àž£àž°àžàžžàžàž£àž°à¹àžªàžà¹àž­àž¡àž¹àž¥àž«àž¥àž±àžàžàž­àžà¹àž­àžàžªàž²àž£à¹àžàžàž­àž¥à¹àž¥àžàžàž±àžàžàž­àž Dspace àžà¹àž§àž¢àžàž±àž§à¹àž¥àž·àž­àžàžàžµà¹ àž£àž°àžàžàžàž°àžàž³à¹àžàžŽàžàžàž²àž£àžàž±àžà¹àž­àžàžªàž²àž£àžàžµà¹àžàž³àž«àžàžàžàžàžŽàžà¹àžà¹àž ext àžàž²àž¡àž¥àž³àžàž±àžà¹àžàž·à¹àž­àžà¹àžàž«àž²àžàž£àž°à¹àžªàžà¹àž­àž¡àž¹àž¥àž«àž¥àž±àžàžàžµà¹à¹àžà¹àžà¹àžà¹àžà¹  
+
+DSpacePlugin.first_inorder_mime:àž£àž°àžàžàžàž°à¹àžà¹àžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹à¹àžàžàž²àž£àž£àž°àžàžžàžàž£àž°à¹àžªàžà¹àž­àž¡àž¹àž¥àž«àž¥àž±àžàžàž­àžà¹àž­àžàžªàž²àž£à¹àžàžàž­àž¥à¹àž¥àžàžàž±àžàžàž­àž Dspace àžà¹àž§àž¢àžàž±àž§à¹àž¥àž·àž­àžàžàžµà¹ àž£àž°àžàžàžàž°àžàž³à¹àžàžŽàžàžàž²àž£àžàž±àžà¹àž­àžàžªàž²àž£àžàžµà¹àžàž³àž«àžàžàžàžàžŽàžà¹àžà¹àž mimeàžàž²àž¡àž¥àž³àžàž±àžà¹àžàž·à¹àž­àžà¹àžàž«àž²àžàž£àž°à¹àžªàžà¹àž­àž¡àž¹àž¥àž«àž¥àž±àžàžàžµà¹à¹àžà¹àžà¹àžà¹àžà¹  
+
+DSpacePlugin.only_first_doc:àž£àž°àžàžàžàž°à¹àžà¹àžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹à¹àžàžàž²àž£àž£àž°àžàžžàžàž£àž°à¹àžªàžà¹àž­àž¡àž¹àž¥àž«àž¥àž±àžàžàž­àžà¹àž­àžàžªàž²àž£à¹àžàžàž­àž¥à¹àž¥àžàžàž±àžàžàž­àž Dspace àžà¹àž§àž¢àžàž±àž§à¹àž¥àž·àž­àžàžàžµà¹ àž£àž°àžàžàžàž°àžàžàžŽàžàž±àžàžŽàžàž±àžà¹àž­àžàžªàž²àž£à¹àž£àžà¹àžà¹àžà¹àž¡à¹àž¡àžàž²àžàž²àžàž² dublic_core à¹àžà¹àžàžàž£àž°à¹àžªàžà¹àž­àž¡àž¹àž¥àž«àž¥àž±àžàžàžµà¹à¹àžà¹àžà¹àžà¹àžà¹  
+
+EmailAddressExtractor.desc:àžàž¥àž±à¹àžàž­àžŽàž Helper extractor àžªàž³àž«àž£àž±àžàžàž²àž£àžà¹àžàžàžàžàžµà¹àž­àž¢àž¹à¹àž­àžµà¹àž¡àž¥à¹àžàžà¹àž­àžàž§àž²àž¡  
+
+EmailAddressExtractor.done_email_extract:àžàž³àžàž²àž£àžàž±àžàžàž­àžàžàžµà¹àž­àž¢àž¹à¹àž­àžµà¹àž¡àž¥à¹àž£àžµàž¢àžàž£à¹àž­àž¢à¹àž¥à¹àž§  
+
+EmailAddressExtractor.extracting_emails:àžàž²àž£àžàž±àžàžàž­àžàžàžµà¹àž­àž¢àž¹à¹àž­àžµà¹àž¡àž¥  
+
+EmailAddressExtractor.extract_email:àžàž±àžàžàž­àžàžàžµà¹àž­àž¢àž¹à¹àž­àžµà¹àž¡àž¥à¹àžà¹àžà¹àž¡àžàž²àžàž²àžàž²  
+
+EmailPlugin.desc:Email plug àžàž°àžàž³àžàž²àž£àž­à¹àž²àžà¹àžà¹àž¡àž­àžµà¹àž¡àž¥  àžàž¶à¹àžàžàž°àžàž¹àžàžàž±à¹àžàžàž·à¹àž­àžà¹àž§àž¢àžàž±àž§à¹àž¥àžàžà¹àž²àž¢à¹ (à¹àžà¹àž àžàž±àžàžàžµà¹àžàž£àž²àžàžà¹àžà¹àžàž¥à¹àžàž­àž£à¹ maildir) àž«àž£àž·àž­à¹àžàž¢àž¡àžµàžàž²àž¡àžªàžàžžàž¥ .mbx (àžªàž³àž«àž£àž±àžàž£àž¹àžà¹àžàžà¹àžà¹àž¡à¹àž¡àž¥ mbox) \nàžà¹àž­àžàž§àž²àž¡à¹àž­àžàžªàž²àž£: àžà¹àž­àžàž§àž²àž¡à¹àž­àžàžªàž²àž£àžàž£àž°àžàž­àžàžà¹àž§àž¢àžà¹àž­àžàž§àž²àž¡àžàž±à¹àžàž«àž¡àžàž«àž¥àž±àžàžàž£àž£àžàž±àžàž§à¹àž²àžàžàž£àž£àžàž±àžà¹àž£àžà¹àžà¹àž­àžàžªàž²àž£\nà¹àž¡àžàž²àžàž²àžàž² (à¹àž¡à¹à¹àžà¹àžàž±àžàž¥àžŽàžàžàž­àž£à¹!):\n\t\$Headers      à¹àžàž·à¹àž­àž«àž²àžªà¹àž§àžàž«àž±àž§àžàž±à¹àžàž«àž¡àž (à¹àžà¹àžàžàž±àž§à¹àž¥àž·àž­àž à¹àž¥àž°à¹àžàž¢àžà¹àž²à¹àž£àžŽà¹àž¡àžà¹àžà¹àž¥à¹àž§àžàž°à¹àž¡à¹àž¡àžµàžàž²àž£àžàž±àžà¹àžà¹àž)\n\t\$Subject      à¹àž£àž·à¹àž­àž: àžªà¹àž§àžàž«àž±àž§\n\t\$To           àžàž¶àž: àžªà¹àž§àžàž«àž±àž§\n\t\$From         àžàž²àž: àžªà¹àž§àžàž«àž±àž§\n\t\$FromName     àžàž·à¹àž­àžàž­àžàžàž¹à¹àžªà¹àž (àžà¹àž²àž¡àžµ)\n\t\$FromAddr     àžàžµà¹àž­àž¢àž¹à¹àž­àžµà¹àž¡àž¥àžàž­àžàžàž¹à¹àžªà¹àž\n\t\$DateText     àž§àž±àžàžàžµà¹: àžªà¹àž§àžàž«àž±àž§\n\t\$Date         àž§àž±àžàžàžµà¹: àžªà¹àž§àžàž«àž±àž§à¹àžàž£àž¹àžà¹àžàž GSDL (à¹àžà¹àž 19990924)  
+
+EmailPlugin.no_attachments:àžàž£àžžàžàž²àž­àž¢à¹àž²àžàž±àžàžàž¶àžàžªàžŽà¹àžàžàžµà¹à¹àžàžàž¡àž²àžàž±àžàžà¹àž­àžàž§àž²àž¡  
+
+EmailPlugin.headers:àžàž±àžà¹àžà¹àžàžªà¹àž§àžàž«àž±àž§àž­àžµà¹àž¡àž¥à¹àžà¹àžà¹àž¡àžàž²àžàž²àžàž² "Headers"  
+
+EmailPlugin.OIDtype.message_id:à¹àžà¹àžàž±àž§àž£àž°àžàžžàžà¹àž­àžàž§àž²àž¡à¹àžà¹àž OID àžàž­àžà¹àž­àžàžªàž²àž£ àžà¹àž²àž£àž°àžàžà¹àž¡à¹àžàžàžàž±àž§àž£àž°àžàžžà¹àž­àžàžªàž²àž£ àž£àž°àžàžàžàž°à¹àžà¹à¹àž®àž OID à¹àžàž  
+
+EmailPlugin.split_exp:àžàžŽàžàžàžà¹àžàžàžàžŽàžàž­àžàž àž²àž©àž² Perl àžàžµà¹à¹àžà¹à¹àžà¹àžà¹àžà¹àž¡àžàžµà¹àž¡àžµàžà¹àž­àžàž§àž²àž¡àžàž³àžàž§àžàž¡àž²àžàž¥àžà¹àžà¹àž­àžàžªàž²àž£à¹àž¢àžà¹àžà¹àž¥àž°àžàžàž±àž  
+
+ExcelPlugin.desc:àžàž¥àž±à¹àžàž­àžŽàžàžªàž³àž«àž£àž±àžàžàž²àž£àžàž³à¹àžà¹àž²à¹àžà¹àž¡ Microsoft Excel (àž£àžžà¹àž 95 à¹àž¥àž° 97)  
+
+FavouritesPlugin.desc:àžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹à¹àžà¹àžàž£àž°àž¡àž§àž¥àžàž¥à¹àžà¹àž¡àž£àž²àž¢àžàž²àž£à¹àžàž£àžàžàž­àž Internet Explorer  
+
+FOXPlugin.desc:àžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹à¹àžà¹àžàž£àž°àž¡àž§àž¥àžàž¥à¹àžà¹àž¡àžàž²àžàžà¹àž­àž¡àž¹àž¥ dbt àžàž­àž Foxbase àžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹àž¡àžµàžàž±àžàžà¹àžàž±àžàžàž·à¹àžàžàž²àžàžàžµà¹à¹àžà¹àž­à¹àž²àžà¹àžà¹àž¡ dbt à¹àž¥àž° dbf à¹àž¥àž°àžàž£àž°àž¡àž§àž¥àžàž¥àž£àž°à¹àžàžµàž¢àžà¹àžà¹àž¥àž°àžàž±àž§  àžàž¥àž±à¹àžàž­àžŽàžàžàž±à¹àž§à¹àžàžàžµà¹àžàž§àž£àžàž¹àžà¹àžàžàžàžµà¹à¹àž¡àž·à¹àž­àžà¹àž­àžàžàž²àž£à¹àžà¹àžàž²àžàžà¹àž­àž¡àž¹àž¥à¹àžàžàž²àž°à¹àžàž·à¹àž­àžàž£àž°àž¡àž§àž¥àžàž¥à¹àžàžàžà¹àž­àž¡àž¹àž¥àžàžµà¹à¹àž«àž¡àž²àž°àžªàž¡à¹àžà¹àžà¹àž¡  
+
+GreenstoneXMLPlugin.desc:àžàž£àž°àž¡àž§àž¥àžàž¥à¹àž­àžàžªàž²àž£ XML àžàžµà¹à¹àžà¹àžàžàž²àž§àž£àžàž­àžà¹àžàž£à¹àžàž£àž¡àžàž£àžµàžàžªà¹àžàž à¹àžàž£àžàžªàž±àžà¹àžàžàž§à¹àž² àžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹à¹àž¡à¹àž¡àžµàžàž²àž£àžàž£àž§àžàžªàž­àžà¹àž§àž¢àž²àžàž£àžà¹ (à¹àžà¹à¹àž¡àžàž¹àž¥ XML::Parser àžàž°àžàž£àž§àžàžªàž­àžàž£àž¹àžà¹àžàžàžàžµà¹àžàž¹àžàžà¹àž­àž) à¹àžàž¢àžàž°àžàž·àž­àž§à¹àž²à¹àžà¹àž¡àžàž±àžà¹àžà¹àžàžàž²àž§àž£àžàž­àžà¹àžàž£à¹àžàž£àž¡àžàž£àžµàžàžªà¹àžàžà¹àžà¹àžà¹àžàžàž²àž¡ DTD àžàž­àžà¹àž­àžàžªàž²àž£ XMLàžàž±à¹àž  
+
+GISExtractor.desc:àžàž¥àž²àžªàžàž·à¹àžàžàž²àžàžàž­àž (on-the-side) BasPlug àžàžµà¹àžªàžàž±àžàžªàžàžžàžàžàž§àž²àž¡àžªàž²àž¡àž²àž£àžàžàž²àžàžà¹àž²àž GIS  
+
+GISExtractor.extract_placenames:àžàž±àžàžàž­àžàžàž·à¹àž­àžàž³à¹àž«àžà¹àž (placenames) àžàž²àžàž àž²àž¢à¹àžàžà¹àž­àžàž§àž²àž¡ à¹àž¥àž°àžàž±à¹àžàžà¹àž²à¹àžà¹àžà¹àž¡àžàž²àžàž²àžàž² àžàž³à¹àžà¹àžàžà¹àž­àžàž¡àžµàžàž²àž¡àžªàžàžžàž¥ GIS à¹àž«à¹àžàž±àž Greenstone  
+
+GISExtractor.gazetteer:Gazetteer à¹àžà¹à¹àžàž·à¹àž­àžàž±àžàžàž­àžàžàž·à¹àž­àžàž³à¹àž«àžà¹àž (placenames) àžàž²àžàž àž²àž¢à¹àžàžà¹àž­àžàž§àž²àž¡ à¹àž¥àž°àžàž±à¹àžàžà¹àž²à¹àž«à¹à¹àžà¹àžà¹àž¡àžàž²àžàž²àžàž² àžàž³à¹àžà¹àžàžà¹àž­àžàž¡àžµàžàž²àž¡àžªàžàžžàž¥ GIS à¹àž«à¹àžàž±àž Greenstone  
+
+GISExtractor.place_list:à¹àž¡àž·à¹àž­àžàž³àžàž²àž£àžàž±àžàžàž­àžàžàž²àž£àž§àž²àžàžàž³à¹àž«àžà¹àž à¹àž«à¹àž£àž§àž¡àž£àž²àž¢àžàž²àž£àžàž·à¹àž­àžàž³à¹àž«àžà¹àžà¹àž§à¹àžàžµà¹àžªà¹àž§àžàžà¹àžàžàž­àžà¹àž­àžàžªàž²àž£àžà¹àž§àž¢ àžàž³à¹àžà¹àžàžà¹àž­àžàž¡àžµàžàž²àž¡àžªàžàžžàž¥ GIS à¹àž«à¹àžàž±àž Greenstone  
+
+HBPlugin.desc:àžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹àžàž£àž°àž¡àž§àž¥àžàž¥à¹àžà¹àž£àžàžàž­àž£àžµàž«àžàž±àžàžªàž·àž­ HTML  àžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹àžàž°àžàž¹àžà¹àžà¹à¹àžàž¢àžàž­àž¥à¹àž¥àžàžàž±àžàžàž­àžàž«à¹àž­àžàžªàž¡àžžàžàž¡àžàžžàž©àž¢àžšàž²àžªàžàž£à¹ (Humanity Library) à¹àž¥àž°àžàž°à¹àž¡à¹àžàž±àžàžàž²àž£àžàž²àž£à¹àžà¹àž²àž£àž«àž±àžªàžàž³à¹àžà¹àž²àž­àž·à¹àžà¹ àžàž­àžàžàž²àžà¹àž­àžªàžàžµàž«àž£àž·àž­à¹àž­àžªàžàžµà¹àžàžàžàž¢àž²àž¢ à¹àžà¹àžàžàžµà¹à¹àžàžµàž¢àžà¹àžà¹à¹àž¡à¹àžàžµàžàž±àž à¹àž¥àž°à¹àž¡à¹àžªàž²àž¡àž²àž£àžàžàž³à¹àž«à¹àžàž³àžàž²àžà¹àž£à¹àž§àžàž¶à¹àžà¹àžà¹ àžà¹àž§àž¢àžàž²àž£àžàž¥à¹àž­àž¢à¹àž«à¹àž­àž¢àž¹à¹àžªàžàž²àžàž°à¹àžà¹àžàžàžµà¹ àžàž±àžàž­àž¢àž²àžàžàž°à¹àžàžŽàžàžàž§àžà¹àž«à¹àžàžžàžà¹ àžàžàžªàž£à¹àž²àžàžàž­àž¥à¹àž¥àžàžàž±àžàžàž­àžàžàžà¹àž­àžà¹àžàž¢à¹àžà¹ BookPlugin à¹àžàž ;-)\n\nà¹àž«à¹à¹àžà¹ BookPlugin àžà¹àž²àžà¹àž­àžàžàž²àž£àžªàž£à¹àž²àžàžàž­àž¥à¹àž¥àžàžàž±àžà¹àž«àž¡à¹ à¹àž¥àž°àžà¹àž­àžàžàž²àž£àžàž£àž±àžà¹àžà¹àžà¹àžà¹àž¡à¹àž«à¹à¹àž«àž¡àž·àž­àžàžàž±àžàžàž­àž¥à¹àž¥àžàžàž±àžàžàž­àžàž«à¹àž­àžàžªàž¡àžžàžàž¡àžàžžàž©àž¢àžšàž²àžªàžàž£à¹ (Humanity Library) BookPlugin àž¢àž­àž¡àž£àž±àžàžàž²àž£à¹àžà¹àž²àž£àž«àž±àžªàžà¹àž­àž¡àž¹àž¥àžàž³à¹àžà¹àž²à¹àžà¹àžàžžàžà¹àžàž à¹àžà¹àžàž²àžàž«àž§àž±àžà¹àž«à¹à¹àžà¹àž¡àžàžµà¹àžàž£àž±àžà¹àžà¹àžàž¡àžµàžàž§àž²àž¡à¹àžà¹àžàž£àž°à¹àžàžµàž¢àžàžàž§à¹àž²à¹àžà¹àž¡àžàžµà¹à¹àžà¹à¹àžàž¢àžàž­àž¥à¹àž¥àžàžàž±àžàžàž­àžàž«à¹àž­àžàžªàž¡àžžàžàž¡àžàžžàž©àž¢àžšàž²àžªàžàž£à¹ (Humanity Library)  
+
+HBPlugin.encoding.iso_8859_1:Latin1 (àž àž²àž©àž²àžàž°àž§àž±àžàžàž)  
+
+HTMLImagePlugin.aggressiveness:àžà¹àž§àžàžàž­àžà¹àžàžàžàžŽàžàžàž²àž£àžàž±àžàžàž­àžàžà¹àž­àžàž§àž²àž¡àžàžµà¹à¹àžàžµà¹àž¢àž§àžà¹àž­àžàžàžµà¹àžà¹àž­àžàžàž²àž£à¹àžà¹  
+HTMLImagePlugin.aggressiveness.1:àžàž·à¹àž­à¹àžà¹àž¡ à¹àžªà¹àžàžàž²àž àžà¹àž­àžàž§àž²àž¡ ALT à¹àžà¹àž²àžàž±à¹àž  
+HTMLImagePlugin.aggressiveness.2:àžà¹àž² 1 àžàž±à¹àžàž«àž¡àž àž£àž§àž¡àžàž³àž­àžàžŽàžàž²àž¢ àžà¹àž²àž¡àžµ  
+HTMLImagePlugin.aggressiveness.3:àžà¹àž² 2 àžàž±à¹àžàž«àž¡àž àž£àž§àž¡àž¢à¹àž­àž«àžà¹àž²à¹àžàž¥à¹à¹àžàžµàž¢àž àžà¹àž²àž¡àžµ  
+HTMLImagePlugin.aggressiveness.4:àžà¹àž² 3 àžàž±à¹àžàž«àž¡àž àž£àž§àž¡àžªà¹àž§àžàž«àž±àž§àžàž±à¹àžàž«àž¡àžàžà¹àž­àžàž«àžà¹àž² (<h1>, <h2>...) àžà¹àž²àž¡àžµ  
+HTMLImagePlugin.aggressiveness.5:àžà¹àž² 4 àžàž±à¹àžàž«àž¡àž àž£àž§àž¡àžàž²àž£àž­à¹àž²àžàž­àžŽàžàžàžµà¹à¹àžà¹àžàžà¹àž­àžàž§àž²àž¡ àžà¹àž²àž¡àžµ  
+HTMLImagePlugin.aggressiveness.6:àžà¹àž² 4 àžàž±à¹àžàž«àž¡àž àž£àž§àž¡à¹àž¡àžàž²à¹àžà¹àžàžàž­àžàž«àžà¹àž² (àžàž·à¹àž­à¹àž£àž·à¹àž­àž àžàž³àžªàž³àžàž±àž à¹àž¥àž°àž­àž·à¹àžà¹)  
+HTMLImagePlugin.aggressiveness.7:àžà¹àž² 6, 5 à¹àž¥àž° 4 àžàž±à¹àžàž«àž¡àžàž£àž§àž¡àžàž±àž  
+HTMLImagePlugin.aggressiveness.8:àžà¹àž² 7 àžàž±à¹àžàž«àž¡àž àž£àž§àž¡àžàž³àž­àžàžŽàžàž²àž¢àžà¹àž³ àžàž·à¹àž­à¹àžà¹àž¡ à¹àž¥àž°àž­àž·à¹àžà¹ (àž¢àžàž£àž°àžàž±àžàžàž±à¹àžàžàž­àžàžàž¥àž¥àž±àžàžà¹àžàžµà¹àžªàž±àž¡àžàž±àžàžà¹àžàž±àžàž¡àž²àžàžàž§à¹àž²)  
+HTMLImagePlugin.aggressiveness.9:àžà¹àž² 1 àžàž±à¹àžàž«àž¡àž àž£àž§àž¡àžà¹àž­àžàž§àž²àž¡àžàžàž±àžà¹àžà¹àž¡àžàž­àžàž«àžà¹àž²àžà¹àžàžàžàž±àž  
+
+HTMLImagePlugin.caption_length:àžàž§àž²àž¡àž¢àž²àž§àžªàž¹àžàžªàžžàžàžàž­àžàžàž³àž­àžàžŽàžàž²àž¢ (àž«àžà¹àž§àž¢à¹àžà¹àžàž­àž±àžàžàž£àž°)  
+
+HTMLImagePlugin.convert_params:àžàž²àž£àž²àž¡àžŽà¹àžàž­àž£à¹à¹àžàžŽà¹àž¡à¹àžàžŽàž¡àžªàž³àž«àž£àž±àž ImageMagicK àžàž¶à¹àžà¹àžàž¥àžàžàžàžàž²àž£àžªàž£à¹àž²àžàž£àž¹àžàžàžàž²àžàž¢à¹àž­  àžàž±àž§àž­àž¢à¹àž²àžà¹àžà¹àž '-raise' àžàž°àžªà¹àžàžàž¥àžà¹àž­àž£àž¹àžàžàžµà¹à¹àžà¹àžàž£àž¹àžàžàžàž²àžàž¢à¹àž­à¹àžàžàžªàž²àž¡àž¡àžŽàžàžŽ  
+
+HTMLImagePlugin.desc:àžàž¥àž±à¹àžàž­àžŽàžàžªàž³àž«àž£àž±àžàžàž²àž£àžàž±àžàžàž­àžàž£àž¹àž à¹àž¥àž°àžà¹àž­àžàž§àž²àž¡àžàžµà¹àžªàž±àž¡àžàž±àžàžà¹àžàž±àžàžàž²àžàž«àžà¹àž²à¹àž§à¹àž  
+
+HTMLImagePlugin.document_text:à¹àžàžŽà¹àž¡àžà¹àž­àžàž§àž²àž¡àžàžµà¹à¹àžà¹àžàž£àž¹àžà¹àž«à¹à¹àžà¹àž à¹àž­àžàžªàž²àž£:àžà¹àž­àžàž§àž²àž¡ (à¹àž¡à¹à¹àžà¹àžàžàž±à¹àž à¹àž«à¹à¹àžà¹à¹àžàžàžà¹àž­àž¡àž¹àž¥à¹àž¡àžàž²àžàž²àžàž² IndexedText)  
+
+HTMLImagePlugin.index_pages:àžàž±àžàžàž³àžàž±àžàžàžµàž«àžà¹àž²àžàž£à¹àž­àž¡àžà¹àž§àž¢àž£àž¹àž à¹àž¡à¹à¹àžà¹àžàžàž±à¹àžà¹àž«à¹àžàž³àžàž²àž£àž­à¹àž²àžàž­àžŽàžàž«àžà¹àž²àžàžµà¹ URL àžàž­àžàžà¹àžàžàžàž±àž  
+
+HTMLImagePlugin.max_near_text:àžàž³àžàž§àžàž­àž±àžàžàž£àž°àžªàž¹àžàžªàžžàžàžàžµà¹àž­àž¢àž¹à¹à¹àžàž¥à¹àž£àž¹àžàžàžµà¹àžà¹àž­àžàžàž²àž£àžàž±àžàžàž­àž  
+
+HTMLImagePlugin.min_height:àžàžŽàžà¹àžàž¥ à¹àž«à¹àžà¹àž²àž¡àž£àž¹àžàžàžµà¹àžªàž±à¹àžàžàž§à¹àž²àžàžµà¹  
+
+HTMLImagePlugin.min_near_text:àžàž³àžàž§àžàž­àž±àžàžàž£àž°àžà¹àž³àžªàžžàžàžàž­àžàžà¹àž­àžàž§àž²àž¡àž«àž£àž·àž­àžàž³àž­àžàžŽàžàž²àž¢à¹àžàž¥à¹à¹àžàžµàž¢àžàžàžµà¹àžà¹àž­àžàžàž²àž£àžàž±àžàžàž­àž  
+
+HTMLImagePlugin.min_size:à¹àžàžà¹  à¹àž«à¹àžà¹àž²àž¡àž£àž¹àžàžàžµà¹àž¡àžµàžàžàž²àžà¹àž¥à¹àžàžàž§à¹àž²àžàžµà¹  
+
+HTMLImagePlugin.min_width:àžàžŽàžà¹àžàž¥  à¹àž«à¹àžà¹àž²àž¡àž£àž¹àžàžàžµà¹à¹àžàžàžàž§à¹àž²àžàžµà¹  
+
+HTMLImagePlugin.neartext_length:àžàž§àž²àž¡àž¢àž²àž§àžàžµà¹àžàž³àž«àžàžàžàž­àžàžà¹àž­àžàž§àž²àž¡à¹àžàž¥à¹à¹àžàžµàž¢àž (àž«àžà¹àž§àž¢à¹àžà¹àžàž­àž±àžàžàž£àž°)  
+
+HTMLImagePlugin.no_cache_images:àžàž£àžžàžàž²àž­àž¢à¹àž²à¹àžà¹àžàž£àž¹àžà¹àž§à¹à¹àžà¹àžàž (à¹àž«à¹àžàžµà¹à¹àžàžàžµà¹ URL àžàž­àžàž£àž¹àžàžàž±à¹àžà¹àžàžŽàž¡)  
+
+HTMLImagePlugin.smallpage_threshold:àž£àž¹àžàžàžµà¹àž­àž¢àž¹à¹àžàžàž«àžà¹àž²àžàžµà¹àž¡àžµàžàžàž²àžà¹àž¥à¹àžàžàž§à¹àž²àžàžµà¹ (à¹àžàžà¹) àžàž°àž¡àžµàžàž²àž£à¹àžàžŽà¹àž¡à¹àž¡àžàž²àžàž²àžàž²àžàž­àžàž«àžà¹àž² (àžàž·à¹àž­à¹àž£àž·à¹àž­àž àžàž³àžªàž³àžàž±àž à¹àž¥àž°àž­àž·à¹àžà¹) àžà¹àž§àž¢  
+
+HTMLImagePlugin.textrefs_threshold:àžàž­àžà¹àžàžàžàžµà¹àžàž³àž«àžàžàžªàž³àž«àž£àž±àžàžàž²àž£àž­à¹àž²àžàž­àžŽàžà¹àžàžàžà¹àž­àžàž§àž²àž¡ àžà¹àž²àžà¹àž­àž¢àž«àž¡àž²àž¢àžàž§àž²àž¡àž§à¹àž²àž­àž±àž¥àžàž­àž£àžŽàžàž¶àž¡à¹àžà¹àž¡àžàž§àžàžà¹àž­àž¢  
+
+HTMLImagePlugin.thumb_size:àžàžàž²àžà¹àž«àžà¹àžàžµà¹àžªàžžàžàžàž­àžàž£àž¹àžàžàžàž²àžàž¢à¹àž­ àžàž±à¹àžàžàž§àž²àž¡àžàž§à¹àž²àžà¹àž¥àž°àžàž§àž²àž¡àžªàž¹àž  
+
+HTMLPlugin.assoc_files:àžàžŽàžàžàžà¹àžàžàžàžŽàžàž­àžàž àž²àž©àž² Perl àžàž­àžàžàž²àž¡àžªàžàžžàž¥à¹àžà¹àž¡àžàžµà¹àžªàž±àž¡àžàž±àžàžà¹àžàž±àžà¹àž­àžàžªàž²àž£ html  
+
+HTMLPlugin.desc:àžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹àžàž°àžàž£àž°àž¡àž§àž¥àžàž¥à¹àžà¹àž¡ HTML  
+
+HTMLPlugin.description_tags:à¹àž¢àžà¹àž­àžàžªàž²àž£à¹àž«à¹à¹àžà¹àžàžªà¹àž§àžàž¢à¹àž­àž¢àžàžµà¹à¹àžà¹àž <Section> àžàž°àžàž£àž²àžàžàž¶à¹àž '-keep_head' àžàž°à¹àž¡à¹àž¡àžµàžàž¥à¹àžà¹ à¹àž¡àž·à¹àž­àžàž±àž§à¹àž¥àž·àž­àžàžàžµà¹àžàž¹àžàžàž±à¹àžàžà¹àž²à¹àž§à¹  
+
+HTMLPlugin.extract_style:àžàž±àžàžàž­àžàžà¹àž­àž¡àž¹àž¥àž£àž¹àžà¹àžàžà¹àž¥àž°àžªàžàž£àžŽàžàžà¹àž­àž­àžàžàž²àžà¹àžà¹àž <head> HTML à¹àž¥àž°àžàž±àžàžàž¶àžà¹àžà¹àžà¹àž¡àžàž²àžàž²àžàž² DocumentHeader àžàž¶à¹àžàžàž°àžàž¹àžàžàž±à¹àžàžà¹àž²à¹àž§à¹à¹àžàž«àžà¹àž²à¹àž­àžàžªàž²àž£à¹àžà¹àžà¹àž¡à¹àžàž£ _document:documentheader_  
+
+HTMLPlugin.file_is_url:à¹àžà¹àž£àž±àžàžàž²àž£àžàž±à¹àžàžà¹àž² àžà¹àž²àžàž·à¹àž­à¹àžà¹àž¡àžàž³à¹àžà¹àž²à¹àžà¹àžà¹àžàžŽàž¡ url àžàž­àžà¹àž­àžàžªàž²àž£àžà¹àžàžàžàž±àžà¹àžàžŽàž¡ à¹àžà¹àž àžà¹àž²àž¡àžµàžàž²àž£à¹àžà¹à¹àžàž£àž·à¹àž­àžàž¡àž·àž­àžàž³àž¡àžŽà¹àž£àž­àž£à¹à¹àž§à¹àžàžªàž£à¹àž²àžà¹àžàž£àžàžªàž£à¹àž²àžà¹àžà¹àž£àžàžàž­àž£àžµàžàž³à¹àžà¹àž²  
+
+HTMLPlugin.hunt_creator_metadata:àžà¹àžàž«àž²à¹àž¡àžàž²àžàž²àžàž²àžàžµà¹à¹àžàžµà¹àž¢àž§àžàž±àžàžàž§àž²àž¡à¹àžà¹àžà¹àžà¹àž²àžàž­àžàžàž¥àžàž²àžà¹àž«à¹àž¡àž²àžàžàžµà¹àžªàžžàžà¹àžà¹àž²àžàžµà¹àžàž°àžàž³à¹àžà¹ à¹àž¥àž°à¹àžªà¹àžà¹àž²àž¥àžà¹àžà¹àžàžàžà¹àž­àž¡àž¹àž¥ 'Creator'  
+
+HTMLPlugin.keep_head:à¹àž¡à¹àžàž§àž£à¹àž­àž²àžªà¹àž§àžàž«àž±àž§àžàž­àžà¹àžà¹àž¡ html àž­àž­àž  
+
+HTMLPlugin.metadata_fields:àž£àž²àž¢àžàž²àž£àžàžµà¹àžàž±à¹àžàžà¹àž§àž¢à¹àžàž£àž·à¹àž­àžàž«àž¡àž²àž¢àžàžžàž¥àž àž²àžàžàžµà¹àžàž°àžàž±àžàžàž­àžàž­àž­àž à¹àžà¹ 'tag<tagname>' à¹àžàž·à¹àž­à¹àžªà¹à¹àžàž·à¹àž­àž«àž²àžàž­àžàžàž¹à¹ <tagname> à¹àž£àžàž¥àžà¹àžàž­àžàžà¹àžàž£àž°àžàž­àžà¹àž¡àžàž²àžàž²àžàž²àžàžµà¹à¹àž£àžµàž¢àžàž§à¹àž² 'tagname'  àžàž³àžà¹àž­àž¡àž¹àž¥à¹àž«à¹à¹àžà¹àžàžàž±àž§àžàžŽàž¡àžà¹à¹àž«àžà¹àžà¹àž²àžàžžàžàžà¹àž­àžàžàž²àž£à¹àž«à¹à¹àž¡àžàž²àžàž²àžàž²à¹àžà¹àžàžàž±àž§àžàžŽàž¡àžà¹à¹àž«àžà¹à¹àžà¹àžàž£à¹àžàž£àž¡àžàž£àžµàžàžªà¹àžàž à¹àžàž·à¹àž­àžàžàž²àžàžàž²àž£àžàž±àžàžàž­àžà¹àžà¹àžà¹àž¡à¹à¹àž¢àžà¹àž¢àž°àžàž±àž§àžàžŽàž¡àžà¹à¹àž«àžà¹-à¹àž¥à¹àž  
+
+HTMLPlugin.no_metadata:àžàž£àžžàžàž²àž­àž¢à¹àž²àžàž¢àž²àž¢àž²àž¡àžàž±àžàžàž­àžà¹àž¡àžàž²àžàž²àžàž²à¹àžà¹ àž­àž­àžàžàž²àžà¹àžà¹àž¡  
+
+HTMLPlugin.no_strip_metadata_html:àž£àž²àž¢àžàž²àž£àžàžµà¹àžàž±à¹àžàžà¹àž§àž¢à¹àžàž£àž·à¹àž­àžàž«àž¡àž²àž¢àžàžžàž¥àž àž²àžàžàž­àžàžàž·à¹àž­à¹àž¡àžàž²àžàž²àžàž² àž«àž£àž·àž­ 'àžàž±à¹àžàž«àž¡àž'  à¹àž¡àž·à¹àž­à¹àžà¹àžàž±àž -description_tags àžàž°à¹àžà¹àžàžàž²àž£àžà¹àž­àžàžàž±àžàžàž²àž£à¹àž¢àžà¹àžà¹àž HTML àž­àž­àžàžàž²àžàžà¹àž²àžªàž³àž«àž£àž±àžà¹àž¡àžàž²àžàž²àžàž²àžàžµà¹àž£àž°àžàžž  
+
+HTMLPlugin.nolinks:àžàž£àžžàžàž²àž­àž¢à¹àž²àžàž¢àž²àž¢àž²àž¡àžàž±àžàžàž²àž£à¹àžàž·à¹àž­àž¡à¹àž¢àž (àžàž²àž£àžàž±à¹àžàžà¹àž²àžªàžàž²àžàž°àžàžµà¹àž­àž²àžàžà¹àž§àž¢à¹àžàžŽà¹àž¡àžàž§àž²àž¡à¹àž£à¹àž§à¹àžàžàž²àž£àžªàž£à¹àž²àž/àžàž²àž£àžàž³à¹àžà¹àž² à¹àžà¹àžàž²àž£à¹àžàž·à¹àž­àž¡à¹àž¢àžàžàžµà¹àžªàž±àž¡àžàž±àžàžà¹àžàž±àžàž àž²àž¢à¹àžà¹àž­àžàžªàž²àž£àžàž°àžàž¹àžàžàž³àž¥àž²àž¢)  
+
+HTMLPlugin.no_image_links:à¹àž¡à¹àžàž¢àž²àž¢àž²àž¡àžàž±àžàžàž²àž£à¹àžàž·à¹àž­àž¡à¹àž¢àžàž£àž¹àžàž àž²àžà¹àžàž·à¹àž­à¹àž«à¹àžªàž²àž¡àž²àž£àžàžàž¹àž£àž¹àžàž àž²àžà¹àžà¹  
+
+HTMLPlugin.rename_assoc_files:à¹àžàž¥àžµà¹àž¢àžàžàž·à¹àž­à¹àžà¹àž¡àžàžµà¹àžªàž±àž¡àžàž±àžàžà¹àžàž±àžà¹àž­àžàžªàž²àž£ (à¹àžà¹àž àž£àž¹àž) à¹àž¥àž°àžªàž£à¹àž²àžà¹àžàž£àžàžªàž£à¹àž²àžà¹àžà¹àž£àžàžàž­àž£àžµàžàžµà¹àžàž·à¹àžàžàž§à¹àž²àž¡àž²àž (àž¡àžµàžàž£àž°à¹àž¢àžàžà¹à¹àž¡àž·à¹àž­àžà¹àž­àžàžàž²àž£àžªàž£à¹àž²àžàžàž­àž¥à¹àž¥àžàžàž±àžàžªàž³àž«àž£àž±àžàžªà¹àžàž­àž­àžà¹àžàž¢àž±àžàžàžµàžàžµàž£àž­àž¡)  
+
+HTMLPlugin.sectionalise_using_h_tags:àžªàž£à¹àž²àžà¹àž­àžàžªàž²àž£àžàžµà¹à¹àžà¹àžà¹àžà¹àžàžªà¹àž§àžà¹àžàž¢àž­àž±àžà¹àžàž¡àž±àžàžŽà¹àžàž¢à¹àžà¹à¹àžà¹àž h1, h2, âŠ hX  
+
+HTMLPlugin.title_sub:àžàžŽàžàžàžà¹àžàž²àž£à¹àžàžàžàžµà¹àžàž¶à¹àžà¹àžà¹à¹àžà¹à¹àžàžªàžàž£àžŽàžàžàžµà¹àžàž±àžà¹àžà¹àžà¹àžà¹àžàžàž·à¹àž­à¹àž£àž·à¹àž­àž àžàž±àž§àž­àž¢à¹àž²àžàžàž²àž£à¹àžà¹ à¹àžà¹àž PDFPlugin à¹àžà¹à¹àžàž·à¹àž­à¹àž­àž² "àž«àžà¹àž² 1" à¹àž¥àž°àž­àž·à¹àžà¹ àž­àž­àžàžàž²àžàžà¹àž­àžàž§àž²àž¡àžàžµà¹à¹àžà¹à¹àžà¹àžàžàž·à¹àž­à¹àž£àž·à¹àž­àž  
+
+HTMLPlugin.tidy_html:àžà¹àž²àž¡àžµàžàž²àž£àžàž±à¹àžàžà¹àž²à¹àž§à¹ àž£àž°àžàžàžàž°àžàž³àžàž²àž£à¹àžàž¥àžà¹àž­àžàžªàž²àž£ HTML à¹àž«à¹àž­àž¢àž¹à¹à¹àžàž£àž¹àžà¹àžàžàžàž­àž XHTML àžàžµà¹àž¡àžµàžàž²àž£àžàž³àž«àžàžàž£àž¹àžà¹àžàžàžàžµà¹àžàžµ àžàž¶à¹àžàžàž°àžàž³à¹àž«à¹àžàž¹à¹à¹àžà¹àžªàž²àž¡àž²àž£àžàžàž¹à¹àž­àžàžªàž²àž£à¹àžàž£àž¹àžà¹àžàžàž«àžàž±àžàžªàž·àž­à¹àžà¹  
+
+HTMLPlugin.old_style_HDL:à¹àžàž·à¹àž­àžàž³à¹àžàž£àž·à¹àž­àžàž«àž¡àž²àž¢àž§à¹àž² à¹àžà¹àž¡à¹àžàžàž­àž¥à¹àž¥àžàžàž±àžàžàžµà¹à¹àžà¹àžàž¹àžàžàž±àžà¹àžà¹àžàž­àž­àžà¹àžà¹àžàžªà¹àž§àžà¹ à¹àžàž¢à¹àžà¹àž£àž¹àžà¹àžàžàžªà¹àž§àžàžàž­àž HDL àž£àžžà¹àžà¹àžà¹àž²  
+
+BaseMediaConverter.enable_cache:à¹àžàžà¹àžà¹àž¡àžàžµà¹àžªàž£à¹àž²àžà¹àžàž¢àž­àž±àžà¹àžàž¡àž±àžàžŽ (à¹àžà¹àž àž àž²àžàžàžàž²àžà¹àž¥à¹àž àž«àž£àž·àž­àž àž²àžàžàžàž²àžà¹àžà¹àž²àž«àžà¹àž²àžàž­) à¹àžàž·à¹àž­àžàž°à¹àžà¹à¹àž¡à¹àžà¹àž­àžàžªàž£à¹àž²àžàžà¹àž³àž­àžµàž  
+
+ImageConverter.converttotype:à¹àžàž¥àžàž£àž¹àžàž«àž¥àž±àžà¹àž«à¹à¹àžà¹àžàž£àž¹àžà¹àžàž 's'  
+
+ImageConverter.create_screenview:àž«àž²àžàžàž±à¹àžàžà¹àž²à¹àžà¹àž "à¹àžà¹" àž£àž°àžàžàžàž°àžàž³àžàž²àž£àžªàž£à¹àž²àžàž àž²àžàžàžàž²àžà¹àžà¹àž²àžàž­àž àž²àž à¹àž¥àž°àžàž±à¹àžàžà¹àž²à¹àž¡àžàž²àžàž²àžàž²à¹àž«à¹àžàž±àž Screen, ScreenType, screenicon, ScreenWidth à¹àž¥àž° ScreenHeight  
+
+ImageConverter.create_thumbnail:àž«àž²àžàžàž±à¹àžàžà¹àž²à¹àžà¹àž "à¹àžà¹" àž£àž°àžàžàžàž°àžàž³àžàž²àž£àžªàž£à¹àž²àžàž àž²àžàžàžàž²àžà¹àž¥à¹àžà¹àž«à¹àžàž±àžà¹àžà¹àž¥àž°àž àž²àž à¹àž¥àž°à¹àžàžŽà¹àž¡à¹àž¡àžàž²àžàž²àžàž²à¹àž«à¹àžàž±àž Thumb, ThumbType, thumbicon, ThumbWidth à¹àž¥àž°ThumbHeight   
+ImageConverter.desc:àžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹àžàž°àžàž£àž°àž¡àž§àž¥àžàž¥àž£àž¹àž à¹àž¥àž°à¹àžàžŽà¹àž¡à¹àž¡àžàž²àžàž²àžàž²àžàž·à¹àžàžàž²àž  
+
+ImageConverter.imagemagicknotinstalled:àžàžžàžà¹àž¡à¹à¹àžà¹àžàžŽàžàžàž±à¹àž Image Magick  
+
+ImageConverter.minimumsize:àž¥àž°à¹àž§à¹àžàž£àž¹àžàžàžµà¹àž¡àžµàžàžàž²àžà¹àž¥à¹àžàžàž§à¹àž² n à¹àžàžà¹  
+
+ImageConverter.noconversionavailable:à¹àž¡à¹àžªàž²àž¡àž²àž£àžà¹àž£àžµàž¢àžà¹àžà¹àžàž²àžàžàž²àž£à¹àžàž¥àžàž àž²àžà¹àžà¹  
+
+ImageConverter.noscaleup:à¹àž¡à¹àžàž§àž£àžàž¢àž²àž¢àž£àž¹àžàžàžàž²àžà¹àž¥à¹àžàžàžàž°àžªàž£à¹àž²àžàž£àž¹àžàžàžàž²àžàž¢à¹àž­  
+
+ImageConverter.screenviewsize:àžªàž£à¹àž²àžàž£àž¹àžà¹àžªàžàžàž«àžà¹àž²àžàž­àžà¹àž§àž¢àžàžàž²àž nxn  
+
+ImageConverter.screenviewtype:àžªàž£à¹àž²àžàž£àž¹àžà¹àžªàžàžàž«àžà¹àž²àžàž­à¹àžàž£àž¹àžà¹àžàž 's'  
+
+ImageConverter.thumbnailsize:àžªàž£à¹àž²àžàž£àž¹àžàžàžàž²àžàž¢à¹àž­àžà¹àž§àž¢àžàžàž²àž nxn  
+
+ImageConverter.thumbnailtype:àžªàž£à¹àž²àžàž£àž¹àžàžàžàž²àžàž¢à¹àž­à¹àžàž£àž¹àžà¹àžàž 's'  
+
+ImageConverter.win95notsupported:à¹àž¡à¹àžªàž²àž¡àž²àž£àžà¹àžà¹àžàž²àž Image Magick àžàž Win95/98 à¹àžà¹  
+
+ImagePlugin.desc:àžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹àžàž°àžàž³àžàž²àž£àžàž£àž°àž¡àž§àž¥àžàž¥àž àž²àž à¹àž¥àž°à¹àžàžŽà¹àž¡à¹àž¡àžàž²àžàž²àžàž²àžàž·à¹àžàžàž²àž  
+
+IndexPlugin.desc:àžàž¥àž±à¹àžàž­àžŽàžà¹àžàžàž§àžàžà¹àž³àžàžµà¹àžàž°àžàž£àž°àž¡àž§àž¥àžàž¥à¹àžà¹àž¡ index.txt  à¹àžà¹àž¡ index.txt àžàž§àž£àžàž£àž°àžàž­àžàžà¹àž§àž¢àž£àž²àž¢àžàž²àž£àžàž­àžà¹àžà¹àž¡àžàžµà¹àžàž°àž£àž§àž¡àž­àž¢àž¹à¹à¹àžàžàž­àž¥à¹àž¥àžàžàž±àžàžàž²àž¡àžà¹àž§àž¢à¹àž¡àžàž²àžàž²àžàž²àžàžŽà¹àžšàž©à¹àžà¹ àžàžµà¹àžªàž±àž¡àžàž±àžàžà¹àžàž±àžà¹àžà¹àž¥àž°à¹àžà¹àž¡\n\nà¹àžà¹àž¡ index.txt àžàž§àž£àž¡àžµàž£àž¹àžà¹àžàžàžàž±àžàžàžµà¹: àžàž£àž£àžàž±àžà¹àž£àžàž­àž²àžà¹àžà¹àžàžàžµàž¢à¹ (àžàž¶à¹àžàžà¹àžàžà¹àž§àž¢àžàž³àž§à¹àž² key:) à¹àžàž·à¹àž­àžàž³àž«àžàžàžàž·à¹àž­à¹àž«à¹à¹àžàžàžà¹àž­àž¡àž¹àž¥à¹àž¡àžàž²àžàž²àžàž² (à¹àžà¹àž key: Subject Organization Date) àžàž£àž£àžàž±àžàžà¹àž­à¹ à¹àžàžàž°àžàž£àž°àžàž­àžàžà¹àž§àž¢àžàž·à¹àž­à¹àžà¹àž¡àžàž²àž¡àžà¹àž§àž¢àžà¹àž²àžàžµà¹àžàž°àžàž±à¹àžàžà¹àž²àž£àž²àž¢àžàž²àž£à¹àž¡àžàž²àžàž²àžàž² (à¹àžà¹àž 'irma/iw097e 3.2 unesco 1993' àžàž°à¹àžàž·à¹àž­àž¡à¹àž¢àžà¹àž¡àžàž²àžàž²àžàž² Subject=3.2, Organization=unesco à¹àž¥àž° Date=1993 à¹àžà¹àž²àžàž±àžà¹àžà¹àž¡ irma/iw097e àžà¹àž²àž¡àžµàžàž²àž£à¹àžà¹àžàž£àž£àžàž±àžàžàžµàž¢à¹àžà¹àž²àžàžàž)\n\nà¹àžàž£àžàžªàž±àžà¹àžàžàž§à¹àž² àžà¹àž²à¹àžàžàžà¹àž­àž¡àž¹àž¥à¹àž¡àžàž²àžàž²àžàž²à¹àžà¹ à¹àžà¹àžàž¥àž±à¹àžàž­àžŽàžàžàž±àž§à¹àž¢àžàžàž£àž°à¹àž àžàž¥àž³àžàž±àžàžàž±à¹àž àžà¹àž²àžàžµà¹àžàž¹àžàžàž±à¹àžà¹àž§à¹àžàž§àž£àžàž°àžªàž­àžàžàž¥à¹àž­àžàžàž±àžà¹àžàžàžà¹àž­àž¡àž¹àž¥à¹àž£àž (àžàž±àž§àž­àžàžŽàžàž²àž¢) à¹àžà¹àžà¹àž¡àžàž²àž£à¹àž¢àžàžàž£àž°à¹àž àžàžàžµà¹à¹àž«àž¡àž²àž°àžªàž¡\n\nàžàžžàžàžªàž²àž¡àž²àž£àžàžàž±à¹àžàžàž·à¹àž­àžà¹àž²à¹àž¡àžàž²àžàž²àžàž²à¹àž¢àžàžà¹àž²àžàž«àž²àžà¹àžà¹à¹àžàž¢à¹àžà¹à¹àžà¹àž (à¹àžà¹àž <Subject>3.2) à¹àž¥àž°àžà¹àž²àžàžµà¹àžàž°à¹àžà¹àž²à¹àžà¹àžàžàžàžµà¹àžàž·à¹àž­à¹àžà¹ àžàžµà¹à¹àžà¹àžàž³àž«àžàžà¹àž§à¹à¹àžàž¢àžàž£àž£àžàž±àžàžàžµàž¢à¹ àžà¹àž²à¹àž¡à¹àž¡àžµàžàž£àž£àžàž±àžàžàžµàž¢à¹ àžà¹àž²à¹àž¡àžàž²àžàž²àžàž²àžàžµà¹à¹àž¡à¹àž¡àžµàžàž²àž£àžàž±à¹àžàžàž·à¹àž­à¹àž§à¹ àžàž°àžàž¹àžàžàž±à¹àžàžàž·à¹àž­à¹àžà¹àž 'Subject'  
+
+ISISPlugin.desc:àžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹àžàž°àžàž³àžàž²àž£àžàž£àž°àž¡àž§àž¥àžàž¥àžàž²àžàžà¹àž­àž¡àž¹àž¥ CDS/ISIS àžªàž³àž«àž£àž±àžà¹àžà¹àž¥àž°àžàž²àžàžà¹àž­àž¡àž¹àž¥ CDS/ISIS àžàžµà¹àžàž¹àžàžàž£àž°àž¡àž§àž¥àžàž¥ àžàž°àž¡àžµà¹àžà¹àž¡àžàž³àžàž§àžàžªàž²àž¡à¹àžà¹àž¡àžàž£àž²àžàžàž­àž¢àž¹à¹à¹àžà¹àžàž¥à¹àžàž­àž£à¹àžàž³à¹àžà¹àž²àžàž­àžàžàž­àž¥à¹àž¥àžàžàž±àž: à¹àžà¹àž¡àžà¹àžà¹àžàž (.mst) àžàž²àž£àž²àžàžà¹àž­àžàž³àž«àžàžà¹àžàžàžà¹àž­àž¡àž¹àž¥ (.fdt) à¹àž¥àž°à¹àžà¹àž¡àž­à¹àž²àžàž­àžŽàžà¹àž¢àž (.xrf)  
+
+ISISPlugin.subfield_separator:àžªàžàž£àžŽàžàžàžµà¹à¹àžà¹à¹àž¢àžà¹àžàžàžà¹àž­àž¡àž¹àž¥àž¢à¹àž­àž¢à¹àžàž£àž°à¹àžàžµàž¢àžàžàž²àžàžà¹àž­àž¡àž¹àž¥ CDS/ISIS  
+
+ISISPlugin.entry_separator:àžªàžàž£àžŽàžàžàžµà¹à¹àžà¹à¹àž¢àžàžà¹àž²àžà¹àž²àžà¹ àžªàž³àž«àž£àž±àžà¹àžàžàžà¹àž­àž¡àž¹àž¥à¹àž¡àžàž²àžàž²àžàž²à¹àžàžµà¹àž¢àž§à¹àžàž£àž°à¹àžàžµàž¢àžàžàž²àžàžà¹àž­àž¡àž¹àž¥ CDS/ISIS  
+
+KeyphraseExtractor.desc:àžàž¥àž±à¹àžàž­àžŽàž Helper Extractor àžªàž³àž«àž£àž±àžàžàž²àž£àžªàž£à¹àž²àžàž§àž¥àžµàž«àž¥àž±àžàžàž²àžàžà¹àž­àžàž§àž²àž¡ à¹àžà¹àž£àž°àžàžàžàž²àž£àžàž¶àžàž§àž¥àžµàž«àž¥àž±àžà¹àžàž Kea  
+
+KeyphraseExtractor.extract_keyphrases:àžàž±àžàžàž­àž keyphrases à¹àžàž¢àž­àž±àžà¹àžàž¡àž±àžàžŽàžà¹àž§àž¢ Kea (àžàž²àž£àžàž±à¹àžàžà¹àž²à¹àž£àžŽà¹àž¡àžà¹àž)  
+
+KeyphraseExtractor.extract_keyphrases_kea4:àžàž±àžàžàž­àž keyphrases à¹àžàž¢àž­àž±àžà¹àžàž¡àž±àžàžŽàžà¹àž§àž¢ Kea 4.0 (àžàž²àž£àžàž±à¹àžàžà¹àž²à¹àž£àžŽà¹àž¡àžà¹àž)  Kea 4.0 àžàž·àž­ Kea àž£àžžà¹àžà¹àž«àž¡à¹àžàžµà¹à¹àžà¹àž£àž±àžàžàž²àž£àžàž±àžàžàž²àžªàž³àž«àž£àž±àžàžàž²àž£àžàž±àžàžàž³àžàž±àžàžàžµà¹àžàžàžàž§àžàžàžžàž¡àžàž­àžà¹àž­àžàžªàž²àž£à¹àžàžàž­àžà¹àžàžàžàž²àžàžà¹àž²àžà¹àžàž©àžàž£àžàž£àž£àž¡  
+
+KeyphraseExtractor.extract_keyphrase_options:àžàž±àž§à¹àž¥àž·àž­àžàžªàž³àž«àž£àž±àžàžàž²àž£àžàž±àžàžàž­àž keyphrase àžà¹àž§àž¢ Kea  àžàž±àž§àž­àž¢à¹àž²àžà¹àžà¹àž mALIWEB - à¹àžà¹à¹àž¡à¹à¹àžàžàžàž²àž£àžàž±àžàžàž­àž ALIWEB; n5 - àžàž±àžàžàž­àž keyphrase 5 àžàž±àž§; eGBK - à¹àžà¹àžàž²àž£à¹àžà¹àž²àž£àž«àž±àžª GBK  
+
+KeyphraseExtractor.keyphrases:keyphrases  
+
+KeyphraseExtractor.missing_kea:àžà¹àž­àžàžŽàžàžàž¥àž²àž: à¹àž¡à¹àžàžàžàž­àžàžà¹à¹àž§àž£à¹ Kea àžàžµà¹ %s àžàž£àžžàžàž²àžàž²àž§àžà¹à¹àž«àž¥àž Kea %s àžàž²àž http://www.nzdl.org/Kea à¹àž¥àž°àžàžŽàžàžàž±à¹àžàž¥àžà¹àžà¹àžà¹àž£àžàžàž­àž£àžµàžàžµà¹  
+
+LaTeXPlugin.desc:àžàž¥àž±à¹àžàž­àžŽàžàžªàž³àž«àž£àž±àžà¹àž­àžàžªàž²àž£ LaTeX  
+
+LOMPlugin.desc:àžàž¥àž±à¹àžàž­àžŽàžàžªàž³àž«àž£àž±àžàžàž²àž£àžàž³à¹àžà¹àž²à¹àžà¹àž¡ LOM (Learning Object Metadata)  
+
+LOMPlugin.root_tag:DocType àžàž­àžà¹àžà¹àž¡ XML (àž«àž£àž·àž­àžàžŽàžàžàžà¹àžàžàžàžŽàžàžµà¹àžàž£àžàžàž±àžàž­àžàžà¹àžàž£àž°àžàž­àžàž£àž²àž)  
+
+LOMPlugin.check_timestamp:àžàž£àž§àžàžªàž­àžàžàž²àž£àž¥àžàžàž±àžàžàž¶àžà¹àž§àž¥àž²àžàž­àžà¹àžà¹àž¡àžàžµà¹àžàž²àž§àžà¹à¹àž«àž¥àžàžà¹àž­àžàž«àžà¹àž²àžàžµà¹ à¹àž¥àž°àžàž³àžàž²àž£àžàž²àž§àžà¹à¹àž«àž¥àžàž­àžµàžàžàž£àž±à¹àžàž«àž²àžà¹àžà¹àž¡àžà¹àžàžàžàž±àžàž¡àžµàžàž§àž²àž¡à¹àž«àž¡à¹àžàž§à¹àž²  
+
+LOMPlugin.download_srcdocs:àžàž²àž§àžà¹à¹àž«àž¥àžà¹àž­àžàžªàž²àž£àžà¹àžàžàžàž±àžàžà¹àž²àž¡àžµàžàž²àž£àž£àž°àžàžžà¹àž§à¹ (à¹àž general^identifier^entry àž«àž£àž·àž­ technical^location) àžàž±àž§à¹àž¥àž·àž­àžàžàžµà¹àžàž§àž£àž£àž°àžàžžàžàžŽàžàžàžà¹àžàžàžàžŽà¹àžàž·à¹àž­à¹àž«à¹àžàž£àžàžàž±àžàžàž·à¹àž­à¹àžà¹àž¡àžà¹àž­àžàžàž³àžàž²àž£àžàž²àž§àžà¹à¹àž«àž¥àž à¹àžàž£àžàžªàž±àžà¹àžàžàž§à¹àž² àžàžàž°àžàžµà¹àžàž±àž§à¹àž¥àž·àž­àžàžàžµà¹àžàž°à¹àž¡à¹àžàž³àžàž²àžàžàž±àžà¹àž­àžàžªàž²àž£àžàžµà¹àž­àž¢àž¹à¹àžàž­àžà¹àžàž£à¹àž§àž­àž¥àž¥à¹  
+
+MARCPlugin.desc:àžàž¥àž±à¹àžàž­àžŽàž MARC àžàž·à¹àžàžàž²àž  
+
+MARCPlugin.metadata_mapping:àžàž·à¹àž­àžàž­àžà¹àžà¹àž¡àžàžµà¹àž£àž§àž¡àž£àž²àž¢àž¥àž°à¹àž­àžµàž¢àžàžàž²àž£à¹àž¡àžàžàž²àžàžà¹àž² MARC à¹àžà¹àž²àžàž±àžàžàž·à¹àž­à¹àž¡àžàž²àžàž²àžàž²àžàž­àžàžàž£àžµàžàžªà¹àžàž àžàžžàžàžªàž²àž¡àž²àž£àžàžàž¹àžà¹àž²à¹àž£àžŽà¹àž¡àžà¹àžàžàž­àž 'marctodc.txt' à¹àžà¹àžàž²àžà¹àžà¹àž£àžàžàž­àž£àžµ etc àžàž­àžà¹àžàžà¹  
+
+MARCXMLPlugin.desc:àžàž¥àž±à¹àžàž­àžŽàž MARCXML  
+
+MARCXMLPlugin.metadata_mapping_file:àžàž·à¹àž­àžàž­àžà¹àžà¹àž¡àžàžµà¹àž£àž§àž¡àž£àž²àž¢àž¥àž°à¹àž­àžµàž¢àžàžàž²àž£à¹àž¡àžàžàž²àžàžà¹àž² MARC à¹àžà¹àž²àžàž±àžàžàž·à¹àž­à¹àž¡àžàž²àžàž²àžàž²àžàž­àžàžàž£àžµàžàžªà¹àžàž àžàžžàžàžªàž²àž¡àž²àž£àžàžàž¹àžà¹àž²à¹àž£àžŽà¹àž¡àžà¹àžàžàž­àž 'marctodc.txt' à¹àžà¹àžàž²àžà¹àžà¹àž£àžàžàž­àž£àžµ etc àžàž­àžà¹àžàžà¹  
+
+MediaWikiPlugin.desc:àžàž¥àž±à¹àžàž­àžŽàžàžªàž³àž«àž£àž±àžàžàž²àž£àžàž³à¹àžà¹àž²à¹àž§à¹àžà¹àžàžàžàžµà¹àžªàž£à¹àž²àžàžàž²àž MediaWiki  
+
+MediaWikiPlugin.show_toc:à¹àžàžŽà¹àž¡ 'table of contents' àžàžµà¹àž­àž¢àž¹à¹àžàžàž«àžà¹àž²àž«àž¥àž±àžàžàž­àžà¹àž§à¹àžà¹àžàžà¹ MediaWiki à¹àžàžàžµà¹àž«àžà¹àž² 'à¹àžàžµà¹àž¢àž§àžàž±àž' àžàž­àžàžàž­àž¥à¹àž¥àžàžàž±àž àžàž³à¹àžà¹àžàžà¹àž­àžàž£àž°àžàžžàžàžŽàžàžàžà¹àžàžàžàžŽàžàž­àž Perl à¹àž toc_exp àžà¹àž²àžàž¥à¹àž²àžàžªàž³àž«àž£àž±àžà¹àžàžµàž¢àžàž«àž²àžªà¹àž§àž 'àžªàž²àž£àžàž±àž'   
+
+MediaWikiPlugin.delete_toc:àž¥àžàžªà¹àž§àž 'àžªàž²àž£àžàž±àž' àžàžà¹àžà¹àž¥àž°àž«àžà¹àž²àžàž­àž HTML àžàž³à¹àžà¹àžàžà¹àž­àžàž£àž°àžàžžàžàžŽàžàžàžà¹àžàžàžàžŽàžàž­àž Perl à¹àž toc_exp àžà¹àž²àžàž¥à¹àž²àžà¹àžàž·à¹àž­à¹àž«à¹àžàž£àžàžàž±àžàžªà¹àž§àž 'àžªàž²àž£àžàž±àž'  
+
+MediaWikiPlugin.toc_exp:àžàžŽàžàžàžà¹àžàžàžàžŽàžàž­àž Perl àžªàž³àž«àž£àž±àžà¹àžàžµàž¢àžàž«àž² 'àžªàž²àž£àžàž±àž' àžà¹àž²à¹àž£àžŽà¹àž¡àžà¹àžàžàž°àžàž£àžàžàž±àžàžàž±àžà¹àž§à¹àžà¹àžàžàžàžµà¹àžªàž£à¹àž²àžàžàž²àž MediaWiki àžàž±à¹àž§à¹àž  
+
+MediaWikiPlugin.delete_nav:àž¥àžàžªà¹àž§àžàžàž²àž£àžàž³àžàž²àž àžàž³à¹àžà¹àžàžà¹àž­àžàž£àž°àžàžžàžàžŽàžàžàžà¹àžàžàžàžŽàžàž­àž Perl à¹àž nav_div_exp àžà¹àž²àžàž¥à¹àž²àž  
+
+MediaWikiPlugin.nav_div_exp:àžàžŽàžàžàžà¹àžàžàžàžŽàžàž­àž Perl àžªàž³àž«àž£àž±àžà¹àžàžµàž¢àžàž«àž²àžªà¹àž§àžàžàž²àž£àžàž³àžàž²àž àžà¹àž²à¹àž£àžŽà¹àž¡àžà¹àžàžàž°àžàž£àžàžàž±àžàžàž±àžà¹àž§à¹àžà¹àžàžàžàžµà¹àžªàž£à¹àž²àžàžàž²àž MediaWiki àžàž±à¹àž§à¹àž  
+
+MediaWikiPlugin.delete_searchbox:àž¥àžàžªà¹àž§àž "searchbox" àžàž³à¹àžà¹àžàžà¹àž­àžàž£àž°àžàžžàžàžŽàžàžàžà¹àžàžàžàžŽàžàž­àž Perl à¹àž searchbox_div_exp àžà¹àž²àžàž¥à¹àž²àž  
+
+MediaWikiPlugin.searchbox_div_exp:àžàžŽàžàžàžà¹àžàžàžàžŽàžàž­àž Perl àžªàž³àž«àž£àž±àžà¹àžàžµàž¢àžàž«àž²àžªà¹àž§àž 'searchbox' àžà¹àž²à¹àž£àžŽà¹àž¡àžà¹àžàžàž°àžàž£àžàžàž±àžàžàž±àžà¹àž§à¹àžà¹àžàžàžàžµà¹àžªàž£à¹àž²àžàžàž²àž MediaWiki àžàž±à¹àž§à¹àž  
+
+MediaWikiPlugin.remove_title_suffix_exp:àžàžŽàžàžàžà¹àžàžàžàžŽàžàž­àž Perl à¹àžàž·à¹àž­à¹àžà¹àžàž±àžàžàž·à¹àž­à¹àž£àž·à¹àž­àžàžàžµà¹àžàž¶àžàž¡àž² àžàž±àž§àž­àž¢à¹àž²àžà¹àžà¹àž \\s-(.+) àžàž°àžàž±àžà¹àžàž·à¹àž­àž«àž²àžàž­àžàžàž·à¹àž­à¹àž£àž·à¹àž­àžàž«àž¥àž±àžà¹àžàž£àž·à¹àž­àžàž«àž¡àž²àž¢ "-"  
+
+MetadataCSVPlugin.desc:àžàž¥àž±à¹àžàž­àžŽàžàžªàž³àž«àž£àž±àžà¹àž¡àžàž²àžàž²àžàž²à¹àžàž£àž¹àžà¹àžàžàžà¹àž²àžàžµà¹àžàž±à¹àžàžà¹àž§àž¢à¹àžàž£àž·à¹àž­àžàž«àž¡àž²àž¢àžàžžàž¥àž àž²àž à¹àžàžàžà¹àž­àž¡àž¹àž¥àžàž·à¹àž­à¹àžà¹àž¡à¹àžà¹àžà¹àž¡ CSV àžàž°àžàž¹àžà¹àžà¹à¹àžàž·à¹àž­àžàž³àž«àžàžàžàž§àž²àž¡àžªàž±àž¡àžàž±àžàžà¹àž£àž°àž«àž§à¹àž²àžà¹àž­àžàžªàž²àž£àžàž±àžà¹àž¡àžàž²àžàž²àžàž²  
+
+MetadataPass.desc:àžàž¥àž²àžªàžàž·à¹àžàžàž²àžàžàž­àž BasePlugin àžàžµà¹àžªàžàž±àžàžªàžàžžàžàžàž¥àž±à¹àžàž­àžŽàžà¹àž¡àžàž²àžàž²àžàž²àžàž°à¹àžà¹àžàž£àž°à¹àž¢àžàžà¹àžàž²àž metadata_read à¹àžàž·à¹àž­àžªà¹àžàžà¹àž²àž import.pl  
+
+MetadataXMLPlugin.desc:àžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹àžàž£àž°àž¡àž§àž¥àžàž¥à¹àžà¹àž¡ metadata.xml  
+
+MetadataEXIFPlugin.desc:àžàž¥àž±à¹àžàž­àžŽàžàžªàž³àž«àž£àž±àžàžàž¶àžà¹àž¡àžàž²àžàž²àžàž² EXIF àžàž²àžàžà¹àž­àž¡àž¹àž¥àž àž²àž à¹àžªàžµàž¢àž à¹àž¥àž°àž§àžŽàžàžµà¹àž­ àžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹àž¡àžµàžàž·à¹àžàžàž²àžàž­àž¢àž¹à¹àžàž à¹àž¡àžàž¹àž¥ CPAN 'ExifTool' àžàž¶à¹àžà¹àž¡àžàž¹àž¥àžàžµà¹àžªàžàž±àžàžªàžàžžàžàž£àž¹àžà¹àžàžà¹àžà¹àž¡àž­àž·à¹àžà¹ àž­àžµàžàž¡àž²àžàž¡àž²àž¢ (à¹àžà¹àž GPS, XMP, FlashPix, ID3, Vorbis) àžàž¥àž±à¹àžàž­àžŽàžàžàž±àž§àžàžµà¹à¹àžà¹àžàžžàžàžªàž¡àžàž±àžàžŽàžàž­àžà¹àž¡àžàž¹àž¥àžàž±àžàžàž¥à¹àž²àž§ à¹àž¥àž°àžàž¹àžàž­àž­àžà¹àžàžà¹àž«à¹àžªàž²àž¡àž²àž£àžàž£àž­àžàž£àž±àžàžà¹àž­àž¡àž¹àž¥àžàžžàžàž£àž¹àžà¹àžàžàžàžµà¹ ExifTool àž£àž­àžàž£àž±àž àžàž¹àžàž¹à¹àž¡àž·àž­àžàž­àž ExifTool àžªàž³àž«àž£àž±àžàžàžàžŽàžàžàž­àžà¹àžà¹àž¡à¹àž¥àž°à¹àžàž£àžàž£à¹àž²àžà¹àž¡àžàž²àžàž²àžàž²àžàžµà¹àž£àž­àžàž£àž±àž  
+
+GreenstoneMETSPlugin.desc:àžàž£àž°àž¡àž§àž¥àžàž¥à¹àž­àžàžªàž²àž£ METS à¹àžàž£àž¹àžà¹àžàžàžàž­àžàžàž£àžµàžàžªà¹àžàž  
+
+MP3Plugin.desc:àžàž¥àž±à¹àžàž­àžŽàžàžªàž³àž«àž£àž±àžàžàž£àž°àž¡àž§àž¥àžàž¥à¹àžà¹àž¡ MP3  
+
+MP3Plugin.assoc_images:à¹àžà¹ Google image àžà¹àžàž«àž²à¹àžàž·à¹àž­àž£àž°àžàžžàžàž³à¹àž«àžà¹àžàž£àž¹àžàžàžµà¹àžªàž±àž¡àžàž±àžàžà¹àžàž±àžà¹àžà¹àž¡ MP3 àžàžµà¹àž¡àžµàžàž·à¹àžàžàž²àžàž­àž¢àž¹à¹àžàžà¹àž¡àžàž²àžàž²àžàž²àžàž·à¹àž­à¹àž£àž·à¹àž­àžà¹àž¥àž°àžšàžŽàž¥àžàžŽàžà¹àžàž ID3  
+
+MP3Plugin.applet_metadata:à¹àžà¹àžàž±àžà¹àžà¹àžà¹àž¡àžàž²àžàž²àžàž² [à¹àž­àžà¹àžàž¥à¹àž] àžªàž³àž«àž£àž±àžà¹àž­àžàžªàž²àž£à¹àžà¹àž¥àž°àžàžàž±àžàžàžµà¹àž¡àžµ HTML àžàžµà¹àžàž³à¹àžà¹àžàžªàž³àž«àž£àž±àžà¹àž­àžà¹àžàž¥à¹àžà¹àžàž£àž·à¹àž­àžà¹àž¥à¹àžà¹àžªàžµàž¢àž MP3 à¹àžàž·à¹àž­à¹àž¥à¹àžà¹àžà¹àž¡àžàž±à¹àž  
+
+MP3Plugin.metadata_fields:àž£àž²àž¢àžàž²àž£àžàžµà¹àžàž±à¹àžàžà¹àž§àž¢à¹àžàž£àž·à¹àž­àžàž«àž¡àž²àž¢àžàžžàž¥àž àž²àžàžàž­àžà¹àžàžàžà¹àž­àž¡àž¹àž¥à¹àž¡àžàž²àžàž²àžàž²àžàžµà¹àžà¹àž­àžàžàž²àž£àžàž±àžàžàž­àž (àžàž·àž­àž§à¹àž²à¹àžà¹àžàžàž±àžàžàžžàžàž±àž) à¹àžà¹àžà¹àž¡ MP3  à¹àž«à¹à¹àžà¹ \"*\" à¹àžàž·à¹àž­àžàž±àžàžàž­àžà¹àžàžàžà¹àž­àž¡àž¹àž¥àžàž±à¹àžàž«àž¡àž  
+
+NulPlugin.desc:àžàž¥àž±à¹àžàž­àžŽàžà¹àžà¹àž¡àžàž±àž¡àž¡àžµ (.nul)  à¹àžà¹àžàž±àžà¹àžà¹àž¡àžàžµà¹àžàž¹àžàžªàž£à¹àž²àžà¹àžàž¢àžàž²àž£àžàž£àž°àžàž²àž¢à¹àžà¹àž¡àžàž²àžàžà¹àž­àž¡àž¹àž¥à¹àž¡àžàž²àžàž²àžàž²  
+
+NulPlugin.assoc_field:àžàž·à¹àž­àžàž­àžà¹àžàžàžà¹àž­àž¡àž¹àž¥à¹àž¡àžàž²àžàž²àžàž²àžàžµà¹àžàž°àžàž¹àžàžàž±à¹àžàžà¹àž²àžªàž³àž«àž£àž±àžà¹àžà¹àž¡ nul à¹àžà¹àž¥àž°à¹àžà¹àž¡  
+NulPlugin.add_metadata_as_text:à¹àžàžŽà¹àž¡àžàž²àž£àž²àžàžàž­àžà¹àž¡àžàž²àžàž²àžàž²à¹àž«à¹à¹àžà¹àžàžà¹àž­àžàž§àž²àž¡àžàž­àžà¹àž­àžàžªàž²àž£ à¹àžàžàžàž£àž°à¹àž¢àž "à¹àž­àžàžªàž²àž£àžàžµà¹à¹àž¡à¹àž¡àžµàžà¹àž­àžàž§àž²àž¡à¹àžà¹"  
+
+NulPlugin.remove_namespace_for_text:à¹àž­àž²à¹àžàž¡àžªà¹àžàžàž­àž­àžàžàž²àžàžàž·à¹àž­à¹àž¡àžàž²àžàž²àžàž²à¹àžàžà¹àž­àžàž§àž²àž¡à¹àž­àžàžªàž²àž£ (àžà¹àž²àž¡àžµàžàž²àž£àžàž±à¹àžàžà¹àž² add_metadata_as_text à¹àž§à¹)  
+
+OAIPlugin.desc:àžàž¥àž±à¹àžàž­àžŽàž Open Archives Initiative (OAI) à¹àžàžàžàž·à¹àžàžàž²àž  
+
+OAIPlugin.document_field:àž«àžà¹àž§àž¢àžà¹àž­àž¡àž¹àž¥àž¢à¹àž­àž¢àžàž­àžà¹àž¡àžàž²àžàž²àžàž²àžàžµà¹àž£àž°àžàžžàžàž·à¹àž­à¹àžà¹àž¡àžàž­àžà¹àž­àžàžªàž²àž£àžàžµà¹àžà¹àž­àžàžàž²àž£à¹àžàžà¹àž¡àžàž²àžàž²àžàž²  
+
+OggVorbisPlugin.add_technical_metadata:à¹àžàžŽà¹àž¡à¹àž¡àžàž²àžàž²àžàž²à¹àžàžŽàžà¹àžàžàžàžŽàž (à¹àžà¹àž àžàžŽàžà¹àž£àž)  
+
+OggVorbisPlugin.desc:àžàž¥àž±à¹àžàž­àžŽàžàžªàž³àž«àž£àž±àžàžàž²àž£àžàž³à¹àžà¹àž²à¹àžà¹àž¡à¹àžªàžµàž¢àž Ogg Vorbis  
+
+OpenDocumentPlugin.desc:àžàž¥àž±à¹àžàž­àžŽàžàžªàž³àž«àž£àž±àžà¹àž­àžàžªàž²àž£àž£àž¹àžà¹àžàž OASIS OpenDocument (à¹àžà¹à¹àžàž¢à¹àžàž£à¹àžàž£àž¡ OpenOffice 2.0)  
+
+PagedImagePlugin.desc:àžàž¥àž±à¹àžàž­àžŽàžàžªàž³àž«àž£àž±àžà¹àž­àžàžªàž²àž£àžàžµà¹àžªàž£à¹àž²àžàžàž¶à¹àžàžàž²àžàžàž²àž£à¹àž£àžµàž¢àžàž¥àž³àžàž±àžàžàž­àžàž£àž¹àž àžàžµà¹àž¡àžµàžà¹àž­àžàž§àž²àž¡ OCR àžªàž³àž«àž£àž±àžà¹àžà¹àž¥àž°àž£àž¹àž (à¹àžà¹àžàžàž±àž§à¹àž¥àž·àž­àž)  àžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹àžàž°àžàž£àž°àž¡àž§àž¥àžàž¥à¹àžà¹àž¡ .item àžàž¶à¹àžà¹àžªàžàžàž£àž²àž¢àžàž²àž£àž¥àž³àžàž±àžàžàž­àžà¹àžà¹àž¡àž£àž¹àžà¹àž¥àž°àžà¹àž­àžàž§àž²àž¡ àžàž£à¹àž­àž¡àžàž±à¹àžà¹àž«à¹àžà¹àž²à¹àž¡àžàž²àžàž²àžàž²  
+
+PagedImagePlugin.documenttype:àžàž±à¹àžàžà¹àž²àžàžàžŽàžàžàž­àžà¹àž­àžàžªàž²àž£ (à¹àžà¹àžªàž³àž«àž£àž±àžà¹àžªàžàžàžàž¥)  
+
+PagedImagePlugin.documenttype.paged:à¹àž­àžàžªàž²àž£àžàžµà¹àž¡àžµàžàž²àž£à¹àž£àžµàž¢àžàž¥àž³àžàž±àžàž«àžà¹àž²àžàž°àž¡àžµàž¥àž¹àžàžšàž£ 'àžàž±àžà¹àž' à¹àž¥àž° 'àžà¹àž­àžàž«àžà¹àž²' à¹àž¥àž°àžàž¥à¹àž­àž 'à¹àžàž¢àž±àžàž«àžà¹àž² X'  
+
+PagedImagePlugin.documenttype.hierarchy:à¹àž­àžàžªàž²àž£à¹àžàžàž¥àž³àžàž±àžàžàž±à¹àžàž¡àžµàžªàž²àž£àžàž±àž  
+
+PagedImagePlugin.headerpage:à¹àžàžŽà¹àž¡àž«àžà¹àž²àžªà¹àž§àžàž«àž±àž§àž£àž°àžàž±àžàžàžàžªàžžàž (àžàžµà¹à¹àž¡à¹àž¡àžµàž£àž¹àž) à¹àžàž¢àž±àžà¹àž­àžàžªàž²àž£à¹àžà¹àž¥àž°àžàžàž±àž  
+
+PDFPlugin.allowimagesonly:àž­àžàžžàžàž²àžà¹àžà¹àž¡ PDF àžàžµà¹à¹àž¡à¹àž¡àžµàžà¹àž­àžàž§àž²àž¡àžàžµà¹àžªàž²àž¡àž²àž£àžàžàž±àžàžàž­àžà¹àžà¹ àžàž£àžžàžàž²àž«àž¥àžµàžà¹àž¥àžµà¹àž¢àžàžàž²àž£àžàž±à¹àžàžà¹àž² -complex àžàž±àž§à¹àž¥àž·àž­àžàžàžµà¹àžàž°àž¡àžµàžàž£àž°à¹àž¢àžàžà¹à¹àžàžàž²àž°àžàž±àž convert_to html à¹àžà¹àž²àžàž±à¹àž  
+
+PDFPlugin.complex:àžªàž£à¹àž²àžàžàž¥àž¥àž±àžàžà¹àžàžµà¹àžàž±àžàžà¹àž­àžàž¡àž²àžàžàž¶à¹àž àžà¹àž§àž¢àžàž²àž£àžàž±à¹àžàžà¹àž²àžàž±àž§à¹àž¥àž·àž­àžàžàžµà¹ html àžàžµà¹à¹àžà¹àžàžàž¥àž¥àž±àžàžà¹àžàž°àžàž¹àžàž¥à¹àž²àž¢àžàž¥àž¶àžàžàž±àžà¹àžà¹àž¡ PDF àžà¹àžàžàžàž±àžàž¡àž²àž à¹àžàž·à¹àž­à¹àž«à¹àžàž±àžàžà¹àžàž±àžàžàžµà¹àžàž³àžàž²àžà¹àžà¹àžàžàžàžàžŽ àžàžžàžàžàž³à¹àžà¹àžàžà¹àž­àžàžàžŽàžàžàž±à¹àž Ghostscript àžà¹àž§àž¢ (àžªàž³àž«àž£àž±àž *nix gs àžàž§àž£àž­àž¢àž¹à¹àžàžà¹àžªà¹àžàžàž²àžàžàž­àžàžàžžàž àžàžàž°àžàžµà¹àžªàž³àž«àž£àž±àž windows àžàžžàžàžàž°àžà¹àž­àžàž¡àžµà¹àžàž£à¹àžàž£àž¡ gswin32c.exe àžàžà¹àžªà¹àžàžàž²àžàžàž­àžàžàžžàžàžà¹àž§àž¢)  
+
+PDFPlugin.desc:àžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹àžàž£àž°àž¡àž§àž¥àžàž¥à¹àž­àžàžªàž²àž£ PDF  
+
+PDFPlugin.nohidden:àžà¹àž­àžàžàž±àž pdftohtml àžàž²àžàžàž²àž£àžàž¢àž²àž¢àž²àž¡àžàž±àžàžàž­àžàžà¹àž­àžàž§àž²àž¡àžàžµà¹àžà¹àž­àžà¹àž§à¹  àžàž±àž§à¹àž¥àž·àž­àžàžàžµà¹àžàž°à¹àžà¹àžàžàž£àž°à¹àž¢àžàžà¹à¹àžàžàž²àž°à¹àž¡àž·à¹àž­àž¡àžµàžàž²àž£àžàž±à¹àžàžà¹àž²àžàž±àž§à¹àž¥àž·àž­àž -complex à¹àž§à¹àžà¹àž§àž¢  
+
+PDFPlugin.noimages:à¹àž¡à¹àžàž§àž£àžàž¢àž²àž¢àž²àž¡àžàž±àžàžàž­àžàž£àž¹àžàž àž²àžàž­àž­àžàžàž²àž PDF  
+
+PDFPlugin.use_sections:àžªàž£à¹àž²àžàžªà¹àž§àžà¹àž¢àžàžà¹àž²àžàž«àž²àžàžªàž³àž«àž£àž±àžà¹àžà¹àž¥àž°àž«àžà¹àž²àžàž­àžà¹àžà¹àž¡ PDF  
+
+PDFPlugin.zoom:à¹àžàžà¹àžàž­àž£à¹àžàžµà¹àžàž°à¹àžà¹àžàž³àž«àžàžàžàž²àž£àžàž¢àž²àž¢ PDF à¹àžàž·à¹àž­à¹àžªàžàžàžàž¥àž¥àž±àžàžà¹ (àžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹àžàž°à¹àžà¹àžàžàž£àž°à¹àž¢àžàžà¹à¹àžàžàž²àž°à¹àž¡àž·à¹àž­àž¡àžµàžàž²àž£àžàž±à¹àžàžà¹àž²àžàž±àž§à¹àž¥àž·àž­àž -complex à¹àž§à¹)  
+
+PostScriptPlugin.desc:àžàž·à¹àžàž·àž­àžàž±àž§à¹àžàž¥àžàžàž²àž \"poor man's\" ps à¹àžà¹àžà¹àžàžà¹àž­àžàž§àž²àž¡ àžà¹àž²àžàžžàžàžà¹àž­àžàžàž²àž£à¹àžà¹àž­àž¢à¹àž²àžàžàž£àžŽàžàžàž±àž àžàž­à¹àž«à¹àžàžŽàžàž²àž£àžàž²à¹àžà¹à¹àžàžà¹àžàž PRESCRIPT àžàž¶à¹àžàžªàž²àž¡àž²àž£àžàžàž²àž§àžà¹à¹àž«àž¥àžà¹àžà¹àžàžµà¹ http://www.nzdl.org/html/software.html  
+
+PostScriptPlugin.extract_date:àžàž±àžàžàž­àžàž§àž±àžàžàžµà¹àž­àž­àžàžàž²àžàžªà¹àž§àžàž«àž±àž§ PS  
+
+PostScriptPlugin.extract_pages:àžàž±àžàžàž­àžàž«àžà¹àž²àž­àž­àžàžàž²àžàžªà¹àž§àžàž«àž±àž§ PS  
+
+PostScriptPlugin.extract_title:àžàž±àžàžàž­àžàžàž·à¹àž­à¹àž£àž·à¹àž­àžàž­àž­àžàžàž²àžàžªà¹àž§àžàž«àž±àž§ PS  
+
+PowerPointPlugin.desc:àžàž¥àž±à¹àžàž­àžŽàžàžªàž³àž«àž£àž±àžàžàž²àž£àžàž³à¹àžà¹àž²à¹àžà¹àž¡ Microsoft PowerPoint  
+
+PowerPointPlugin.windows_scripting:à¹àžà¹à¹àžàžà¹àžà¹àž¥àž¢àžµàžªàžàž£àžŽàžàžà¹àžàž­àž Microsoft Windows (Visual Basic for Applications) à¹àžàž·à¹àž­à¹àžà¹à¹àžàž£à¹àžàž£àž¡ PPT à¹àžàž¥àžà¹àž­àžàžªàž²àž£à¹àž«à¹à¹àžà¹àžàž£àž¹àžàžàžàžŽàžàžà¹àž²àžà¹ (à¹àžà¹àž JPEG, PNG, GIF) à¹àžàžàžàž²àž£àžàž¶à¹àžàžàž²à¹àžàžà¹àžàžàž£àž«àž±àžªà¹àžàžŽàž ppttohtml  
+
+PrintInfo.bad_general_option:àžàž¥àž±à¹àžàž­àžŽàž %s à¹àžà¹àžàž±àž§à¹àž¥àž·àž­àžàžàžµà¹à¹àž¡à¹àžàž¹àžàžà¹àž­àž à¹àž«à¹àžàž£àž§àžàžªàž­àžà¹àžà¹àž¡àžàž³àž«àžàžàžà¹àž² collect.cfg àžàž­àžàžàžžàž  
+
+PrintInfo.desc:àžàž¥àž±à¹àžàž­àžŽàžàžàž·à¹àžàžàž²àžàžàžµà¹àžªàžžàž àžàž³àž«àžà¹àž²àžàžµà¹àžàž±àžàžàž²àž£àžà¹àž­àž¡àž¹àž¥àžàž²àž£àžàžŽàž¡àžà¹ (à¹àžàž¢à¹àžà¹ pluginfo.pl) à¹àž¥àž°à¹àžàžàž­àž²àž£à¹àžàžŽàž§à¹àž¡àžàžà¹  
+
+ProCitePlugin.desc:àžàž¥àž±à¹àžàž­àžŽàžàžªàž³àž«àž£àž±àžàžàž²àžàžà¹àž­àž¡àž¹àž¥ ProCite (àžàžµà¹àžªà¹àžàž­àž­àž)  
+
+ProCitePlugin.entry_separator:àžªàžàž£àžŽàžàžàžµà¹à¹àžà¹àžàž±à¹àžàžà¹àž²àž«àž¥àž²àž¢à¹ àžà¹àž²àžªàž³àž«àž£àž±àžà¹àžàžàžà¹àž­àž¡àž¹àž¥à¹àž¡àžàž²àžàž²àžàž²à¹àžàžµà¹àž¢àž§à¹àžàž£àž°à¹àžàžµàž¢àžàžàž­àžàžàž²àžàžà¹àž­àž¡àž¹àž¥ ProCite  
+
+ReadTextFile.could_not_extract_encoding:àžàž³à¹àžàž·àž­àž: à¹àž¡à¹àžªàž²àž¡àž²àž£àžàžàž±àžàžàž­àžàžàž²àž£à¹àžà¹àž²àž£àž«àž±àžªàžàž²àž %s - àžàž¶à¹àžà¹àžà¹àžàžà¹àž²à¹àž£àžŽà¹àž¡àžà¹àžà¹àžàž¢àž±àž %s à¹àžà¹  
+
+ReadTextFile.could_not_extract_language:àžàž³à¹àžàž·àž­àž: à¹àž¡à¹àžªàž²àž¡àž²àž£àžàžàž±àžàžàž­àžàž àž²àž©àž²àžàž²àž %s - àžàž¶à¹àžà¹àžà¹àžàžà¹àž²à¹àž£àžŽà¹àž¡àžà¹àžà¹àžàž¢àž±àž %s à¹àžà¹  
+
+ReadTextFile.could_not_open_for_reading:à¹àž¡à¹àžªàž²àž¡àž²àž£àžà¹àžàžŽàž %s à¹àžàž·à¹àž­àž­à¹àž²àžà¹àžà¹  
+
+ReadTextFile.default_encoding:à¹àžà¹àžàž²àž£à¹àžà¹àž²àž£àž«àž±àžªàžàžµà¹àžà¹àž² -input_encoding àžàž¹àžàžàž±à¹àžàžà¹àž²à¹àžà¹àž 'auto' à¹àž¥àž°àž­àž±àž¥àžàž­àž£àžŽàžàž¶àž¡àžàž²àž£à¹àžà¹àžàžàž£àž°à¹àž àžàžà¹àž­àžàž§àž²àž¡à¹àž¡à¹àžªàž²àž¡àž²àž£àžàžàž±àžàžàž­àžàžàž²àž£à¹àžà¹àž²àž£àž«àž±àžªàžàžµà¹ àž«àž£àž·àž­à¹àž¡à¹àžªàž²àž¡àž²àž£àžàžàž±àžàžàž­àžàžàž²àž£à¹àžà¹àž²àž£àž«àž±àžªàžàžµà¹à¹àžàž£à¹àžàž£àž¡àžàž£àžµàžàžªà¹àžàžà¹àž¡à¹àžªàžàž±àžàžªàžàžžàžà¹àžà¹ àžàž±àž§à¹àž¥àž·àž­àžàžàžµà¹àžªàž²àž¡àž²àž£àžàž¡àžµàžà¹àž²à¹àžàžµàž¢àž§àžàž±àž -input_encoding à¹àžà¹  
+
+ReadTextFile.default_language:àžà¹àž²à¹àžàž£à¹àžàž£àž¡àžàž£àžµàžàžªà¹àžàžà¹àž¡à¹àžªàž²àž¡àž²àž£àžàž£àž°àžàžžàž àž²àž©àž²àžàž­àžà¹àž­àžàžªàž²àž£à¹àžà¹ àž­àžàžà¹àžàž£àž°àžàž­àžà¹àž¡àžàž²àžàž²àžàž² 'àž àž²àž©àž²' àžàž°àžàž¹àžàžàž±à¹àžà¹àž«à¹à¹àžà¹àžàžà¹àž²àžàžµà¹ àžà¹àž²à¹àž£àžŽà¹àž¡àžà¹àžàžàž·àž­ 'en' (à¹àžà¹àžªàž±àžàž¥àž±àžàž©àžà¹àž àž²àž©àž²à¹àžàž ISO 639: en = English) à¹àžàž£àžàžªàž±àžà¹àžàžàž§à¹àž² àžà¹àž² -input_encoding à¹àž¡à¹àžàž¹àžàžàž±à¹àžàžà¹àž²à¹àžà¹àž 'auto' à¹àž¥àž°à¹àž¡à¹àž¡àžµàžàž²àž£àžàž±à¹àžàžà¹àž² -extract_language à¹àž§à¹ àž£àž°àžàžàžàž°àžàž±à¹àžàžà¹àž²à¹àž¡àžàž²àžàž²àžàž² 'Language' àžàž­àžà¹àž­àžàžªàž²àž£àžàž±à¹àžàž«àž¡àžà¹àž«à¹à¹àžà¹àžàžà¹àž²àžàžµà¹  
+
+ReadTextFile.desc:àžàž¥àž±à¹àžàž­àžŽàžàžàž·à¹àžàžàž²àžàžªàž³àž«àž£àž±àžà¹àžà¹àž¡àžàžµà¹à¹àžà¹àžàžà¹àž­àžàž§àž²àž¡àž­àž¢à¹àž²àžà¹àžàžµàž¢àž§  
+
+ReadTextFile.empty_file:à¹àž¡à¹àž¡àžµàžà¹àž­àžàž§àž²àž¡à¹àžà¹ à¹àžà¹àžà¹àž¡  
+
+ReadTextFile.extract_language:àž£àž°àžàžžàž àž²àž©àž²àžªàž³àž«àž£àž±àžà¹àž­àžàžªàž²àž£à¹àžà¹àž¥àž°àžàžàž±àž à¹àž¥àž°àžàž±à¹àžàžà¹àž²à¹àž¡àžàž²àžàž²àžàž² 'àž àž²àž©àž²'  à¹àžàž£àžàžªàž±àžà¹àžàžàž§à¹àž² àž£àž°àžàžàžàž°àžàž³à¹àžàžŽàžàžàž²àž£à¹àžàž¢àž­àž±àžà¹àžàž¡àž±àžàžŽàžà¹àž²àžà¹àž² -input_encoding à¹àžà¹àž 'auto'  
+
+ReadTextFile.file_has_no_text:àžà¹àž­àžàžŽàžàžàž¥àž²àž: %s à¹àž¡à¹àž¡àžµàžà¹àž­àžàž§àž²àž¡à¹àžà¹  
+
+ReadTextFile.input_encoding:àžàž²àž£à¹àžà¹àž²àž£àž«àž±àžªà¹àž­àžàžªàž²àž£àžà¹àžàžàžàž±àž à¹àž­àžàžªàž²àž£àžàž°àžàž¹àžà¹àžàž¥àžàžàž²àžàžàž²àž£à¹àžà¹àž²àž£àž«àž±àžªà¹àž«àž¥à¹àž²àžàžµà¹ à¹àž¥àž°àžàž¹àžàžàž±àžà¹àžà¹àžà¹àž§à¹àž àž²àž¢à¹àžà¹àžàž£àž¹àžà¹àžàžàžàž­àž utf8  
+
+ReadTextFile.input_encoding.auto:à¹àžà¹àž­àž±àž¥àžàž­àž£àžŽàžàž¶àž¡àžàž²àž£à¹àžà¹àžàžàž£àž°à¹àž àžàžà¹àž­àžàž§àž²àž¡à¹àžàž·à¹àž­àž£àž°àžàžžàžàž²àž£à¹àžà¹àž²àž£àž«àž±àžªàžàž­àžà¹àž­àžàžªàž²àž£àžà¹àžàžàžàž±àžà¹àžà¹àž¥àž°àžàžàž±àžà¹àžàž¢àž­àž±àžà¹àžàž¡àž±àžàžŽ àžàž²àž£àžàž³à¹àžàžŽàžàžàž²àž£à¹àžà¹àžàžàžµà¹àžàž°àžà¹àž²àžàž§à¹àž²àžàž²àž£àžàž±à¹àžàžà¹àž²àžàž²àž£à¹àžà¹àž²àž£àž«àž±àžªàž­àž¢à¹àž²àžàžàž±àžà¹àžàž à¹àžà¹àžªàž²àž¡àž²àž£àžà¹àžà¹àžàž²àžà¹àžà¹à¹àž¡àž·à¹àž­àžàžžàžà¹àžà¹àžàž²àž£à¹àžà¹àž²àž£àž«àž±àžªàž¡àž²àžàžàž§à¹àž²àž«àžàž¶à¹àžà¹àžàžàž àž²àž¢à¹àžàžàž­àž¥à¹àž¥àžàžàž±àžà¹àžàžµàž¢àž§àžàž±àž  
+
+ReadTextFile.read_denied:àžàžàžŽà¹àžªàžàžªàžŽàžàžàžŽàžàž²àž£àž­à¹àž²àžàžªàž³àž«àž£àž±àž %s  
+
+ReadTextFile.separate_cjk:à¹àžàž£àžàžà¹àž­àžàž§à¹àž²àžàž£àž°àž«àž§à¹àž²àžàž­àž±àžàžàž£àž° àžàžµàž/àžàžµà¹àžàžžà¹àž/à¹àžàž²àž«àž¥àžµ à¹àžàž·à¹àž­àžªàž£à¹àž²àžàžàž³àžàž²àžàž­àž±àžàžàž£àž°à¹àžà¹àž¥àž°àžàž±àž§ à¹àž«à¹à¹àžà¹àžàžžàžàž¥àž±àžàž©àžàž°àžàžµà¹àžà¹àž²à¹àž¡à¹àž¡àžµàžàž²àž£àžàž±àžàžàž³à¹àžàžà¹àž­àžàž§àž²àž¡  
+
+ReadTextFile.unsupported_encoding:àžàž³à¹àžàž·àž­àž: %s àžàž¹à¹àž«àž¡àž·àž­àžàžàž°àžàž¹àžà¹àžà¹àž²àž£àž«àž±àžªàžà¹àž§àž¢àžàž²àž£à¹àžà¹àž²àž£àž«àž±àžªàžàžµà¹à¹àž¡à¹àž£àž±àžàžàž²àž£àžªàžàž±àžàžªàžàžžàž (%s) - à¹àžàž¢à¹àžà¹ %s  
+
+ReadTextFile.wrong_encoding:àžàž³à¹àžàž·àž­àž: %s àžàž¹àžàž­à¹àž²àžà¹àžàž¢à¹àžà¹àžàž²àž£à¹àžà¹àž²àž£àž«àž±àžª %s à¹àžà¹àžàž¹à¹àž«àž¡àž·àž­àžàžàž°àžàž¹àžà¹àžà¹àž²àž£àž«àž±àžªà¹àžà¹àž %s  
+
+ReadXMLFile.desc:àžàž¥àž²àžªàžàž·à¹àžàžàž²àžàžªàž³àž«àž£àž±àžàžàž¥àž±à¹àžàž­àžŽàž XML  
+
+ReadXMLFile.xslt:à¹àžàž¥àžà¹àž­àžàžªàž²àž£à¹àžà¹àž²àžàžµà¹àžàž£àžàžàž±àžàžàž±àž XSLT à¹àžà¹àžà¹àž¡àžàžµà¹àžàž³àž«àžàžàžàž·à¹àž­à¹àž¥à¹àž§ àžàž·à¹àž­à¹àžà¹àž¡àžàžµà¹à¹àžàžµà¹àž¢àž§àžà¹àž­àžàžàž°àžàž¹àžàžàž·àž­àž§à¹àž² àž­àž¢àž¹à¹à¹àžàžàž·à¹àžàžàžµà¹à¹àžà¹àž¡àžàž­àžàžàž­àž¥à¹àž¥àžàžàž±àž àžàž±àž§àž­àž¢à¹àž²àžà¹àžà¹àž etc/mods2dc.xsl  
+
+RealMediaPlugin.desc:àžàž¥àž±à¹àžàž­àžŽàžàžªàž³àž«àž£àž±àžàžàž£àž°àž¡àž§àž¥àžàž¥à¹àžà¹àž¡ Real Media  
+
+ReferPlugin.desc:ReferPlugin àžàž°àž­à¹àž²àžà¹àžà¹àž¡àžàž£àž£àžàž²àžàžžàžàž£àž¡à¹àžàž£àž¹àžà¹àžàž Refer  
+
+RogPlugin.desc:àžªàž£à¹àž²àžà¹àž­àžàžªàž²àž£àž£àž°àžàž±àžà¹àžàžµàž¢àž§àž­àž¢à¹àž²àžàžà¹àž²àž¢àžàž²àžà¹àžà¹àž¡ .rog àž«àž£àž·àž­ .mdb  
+
+RTFPlugin.desc:àžàž¥àž±à¹àžàž­àžŽàžàžªàž³àž«àž£àž±àžàžàž²àž£àžàž³à¹àžà¹àž²à¹àžà¹àž¡àž£àž¹àžà¹àžàž Rich Text  
+
+SourceCodePlugin.desc:à¹àžàžàž±àžàžàžžàžàž±àžàžàž·à¹àž­à¹àžà¹àž¡àžàž°àžàž¹àžà¹àžà¹à¹àžà¹àžàžàž·à¹àž­à¹àž£àž·à¹àž­àž (àžàž²àžàžàž£àž±à¹àžàž­àž²àžà¹àž¡à¹àž¡àžµàžàž³àžàž³àž«àžà¹àž²àžàž²àžàžàž±àž§)  àž àž²àž©àž²àžàž±àžàžàžžàžàž±àž:\ntext\: READMEs/Makefiles\nC/C++ (àžàžàž°àžàžµà¹àžàž±àžàžàž­àžàžàž³àžªàž±à¹àž #include à¹àž¥àž° C++ class decls)\nPerl    (àžàžàž°àžàžµà¹àžàž³à¹àžàžŽàžàžàž²àž£à¹àžªàž£à¹àžàžªàžŽà¹àžà¹àžà¹àžàž£àž¹àžà¹àžàžàžà¹àž­àžàž§àž²àž¡à¹àžà¹àž²àžàž±à¹àž)\nShell   (àžàžàž°àžàžµà¹àžàž³à¹àžàžŽàžàžàž²àž£à¹àžªàž£à¹àžàžªàžŽà¹àžà¹àžà¹àžàž£àž¹àžà¹àžàžàžà¹àž­àžàž§àž²àž¡à¹àžà¹àž²àžàž±à¹àž)  
+
+SourceCodePlugin.remove_prefix:à¹àž­àž²àž£àž¹àžà¹àžàžàžàž²àž£àžàž³àžàžµà¹àž­àž­àžàžàž²àžàžàž·à¹àž­à¹àžà¹àž¡ (à¹àžà¹àž -remove_prefix /tmp/XX/src/)  àžà¹àž²à¹àž£àžŽà¹àž¡àžà¹àžàžàž·àž­ à¹àž«à¹à¹àž­àž²à¹àžªà¹àžàžàž²àžàžàž±à¹àžàž«àž¡àžàž­àž­àžàžàž²àžàžàž·à¹àž­à¹àžà¹àž¡  
+
+SplitTextFile.desc:SplitTextFile à¹àžà¹àžàžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹à¹àžà¹à¹àžà¹àžà¹àžà¹àž¡àžà¹àž­àž¡àž¹àž¥à¹àžà¹àž²àž­àž­àžà¹àžà¹àžàžªà¹àž§àžà¹ àžàž¶à¹àžàžàž°àžàž¹àžàžàž£àž°àž¡àž§àž¥àžàž¥à¹àž¢àžàžàž±àžàžàžµàž¥àž°àžªà¹àž§àž àžàžžàžà¹àž¡à¹àžàž§àž£à¹àž£àžµàž¢àžà¹àžà¹àžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹à¹àžàž¢àžàž£àž àžà¹àž²àžàžžàžàžàž³à¹àžà¹àžàžà¹àž­àžàžàž£àž°àž¡àž§àž¥àžàž¥à¹àžà¹àž¡àžà¹àž­àž¡àž¹àž¥à¹àžà¹àž²àžàžµà¹àž¡àžµà¹àž­àžàžªàž²àž£àž«àž¥àž²àž¢àžàžàž±àž àžàžžàžàžàž§àž£à¹àžàžµàž¢àžàžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹àž¡àžµàžàž±àžàžà¹àžàž±àžàžàž²àž£àžàž£àž°àž¡àž§àž¥àžàž¥àžàž¶à¹àžàžàž°àžàž±àžàžàž²àž£à¹àž­àžàžªàž²àž£à¹àž«àž¥à¹àž²àžàž±à¹àžà¹àžà¹àž¥àž°àžàžàž±àž à¹àž¥àž°à¹àž«à¹àžàž¥àž±à¹àžàž­àžŽàžàžàž±à¹àžà¹àžà¹àž£àž±àžàžàž²àž£àžªàž·àžàžàž­àžàžàž²àž SplitTextFile à¹àž«à¹àžàž¹ ReferPlugin à¹àžà¹àžàžàž±àž§àž­àž¢à¹àž²àž  
+
+SplitTextFile.split_exp:àžàžŽàžàžàžà¹àžàžàžàžŽàžàž­àžàž àž²àž©àž² Perl àžàžµà¹à¹àžà¹àžà¹àžà¹àž¡àžà¹àž­àž¡àž¹àž¥à¹àžà¹àž²àž­àž­àžà¹àžà¹àžàžªà¹àž§àžà¹  
+
+StructuredHTMLPlugin.desc:àžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹àžàž°àžàž£àž°àž¡àž§àž¥àžàž¥à¹àž­àžàžªàž²àž£ HTML à¹àžàžŽàžà¹àžàž£àžàžªàž£à¹àž²àž à¹àž¥àž°à¹àž¢àžà¹àž­àžàžªàž²àž£à¹àž«àž¥à¹àž²àžàž±à¹àžàž­àž­àžà¹àžà¹àžàžªà¹àž§àžà¹ àžàž²àž¡àžà¹àž­àž¡àž¹àž¥àž£àž¹àžà¹àžàž  
+
+StructuredHTMLPlugin.delete_toc:à¹àž­àž²àžªàž²àž£àžàž±àž àž£àž²àž¢àžàž²àž£àž£àž¹àž à¹àž¥àž°àžªàžŽà¹àžàž­àž·à¹àžà¹ àž­àž­àžàžàž²àžà¹àžà¹àž¡ HTML àžàžµà¹à¹àžàž¥àžà¹àž¥à¹àž§ àž£àž¹àžà¹àžàžàžªàž³àž«àž£àž±àžàžªàžŽà¹àžà¹àž«àž¥à¹àž²àžàžµà¹àžàž°àžàž¹àžàž£àž°àžàžžàžà¹àž§àž¢àžàž±àž§à¹àž¥àž·àž­àž toc_header  
+
+StructuredHTMLPlugin.title_header:àž£àž¹àžà¹àžàžàžàžµà¹àžàž¹à¹à¹àžà¹àžàž³àž«àžàžà¹àž­àžàžàžµà¹à¹àžà¹àžà¹àžà¹àžà¹àžªàž³àž«àž£àž±àžàžªà¹àž§àžàž«àž±àž§àžàž·à¹àž­à¹àž£àž·à¹àž­àž  
+
+StructuredHTMLPlugin.level1_header:àž£àž¹àžà¹àžàžàžàžµà¹àžàž¹à¹à¹àžà¹àžàž³àž«àžàžà¹àž­àžàžàžµà¹à¹àžà¹àžà¹àžà¹àžà¹àžªàž³àž«àž£àž±àžàžªà¹àž§àžàž«àž±àž§ level1 à¹àžà¹àž­àžàžªàž²àž£ HTML (à¹àžàžµàž¢àžà¹àžà¹àž²àžàž±àž <h1>)  
+
+StructuredHTMLPlugin.level2_header:àž£àž¹àžà¹àžàžàžàžµà¹àžàž¹à¹à¹àžà¹àžàž³àž«àžàžà¹àž­àžàžàžµà¹à¹àžà¹àžà¹àžà¹àžà¹àžªàž³àž«àž£àž±àžàžªà¹àž§àžàž«àž±àž§ level2 à¹àžà¹àž­àžàžªàž²àž£ HTML (à¹àžàžµàž¢àžà¹àžà¹àž²àžàž±àž <h2>)  
+
+StructuredHTMLPlugin.level3_header:àž£àž¹àžà¹àžàžàžàžµà¹àžàž¹à¹à¹àžà¹àžàž³àž«àžàžà¹àž­àžàžàžµà¹à¹àžà¹àžà¹àžà¹àžà¹àžªàž³àž«àž£àž±àžàžªà¹àž§àžàž«àž±àž§ level3 à¹àžà¹àž­àžàžªàž²àž£ HTML (à¹àžàžµàž¢àžà¹àžà¹àž²àžàž±àž <h3>)  
+
+StructuredHTMLPlugin.toc_header:àž£àž¹àžà¹àžàžàžªà¹àž§àžàž«àž±àž§àžàžµà¹àžàž¹à¹à¹àžà¹àžàž³àž«àžàžà¹àž­àžàžàžµà¹à¹àžà¹àžà¹àžà¹àžà¹àžªàž³àž«àž£àž±àžàžªàž²àž£àžàž±àž àžàž²àž£àž²àžàž£àž¹àž à¹àž¥àž°àž­àž·à¹àžà¹ àžàž¶à¹àžàžàž°àžàž¹àžà¹àž­àž²àž­àž­àžàžà¹àž²àž¡àžµàžàž²àž£àžàž±à¹àžàžà¹àž² delete_toc à¹àž§à¹  
+
+TextPlugin.desc:àžªàž£à¹àž²àžà¹àž­àžàžªàž²àž£àž£àž°àžàž±àžà¹àžàžµàž¢àž§àž­àž¢à¹àž²àžàžà¹àž²àž¢ à¹àžàžŽà¹àž¡à¹àž¡àžàž²àžàž²àžàž²àžàž·à¹àž­à¹àž£àž·à¹àž­àžàžàž­àžàžàž£àž£àžàž±àžà¹àž£àžàžàž­àžàžà¹àž­àžàž§àž²àž¡ (àžàž§àž²àž¡àž¢àž²àž§àžªàž¹àžàžªàžžàž 100 àž­àž±àžàžàž£àž°)  
+
+TextPlugin.title_sub:àžàžŽàžàžàžà¹àžàž²àž£à¹àžàžàžàžµà¹à¹àžàž·à¹àž­àžàž£àž±àžà¹àžàž¥àžµà¹àž¢àžàžªàžàž£àžŽàžàžàžµà¹àžàž¹àžàžàž±àžà¹àžà¹àžà¹àžà¹àžàžàž·à¹àž­à¹àž£àž·à¹àž­àž àžàž±àž§àž­àž¢à¹àž²àžàžàž²àž£à¹àžà¹ à¹àžà¹àž PostscriptPlugin à¹àžà¹à¹àžàž·à¹àž­à¹àž­àž² "àž«àžà¹àž² 1" à¹àž¥àž°àž­àž·à¹àžà¹ àž­àž­àžàžàž²àžàžà¹àž­àžàž§àž²àž¡àžàžµà¹à¹àžà¹à¹àžà¹àžàžàž·à¹àž­à¹àž£àž·à¹àž­àž  
+
+UnknownPlugin.assoc_field:àžàž·à¹àž­àžàž­àžà¹àžàžàžà¹àž­àž¡àž¹àž¥à¹àž¡àžàž²àžàž²àžàž²àžàžµà¹à¹àžà¹àžàžàž·à¹àž­àžàž­àžà¹àžà¹àž¡àžàžµà¹àžªàž±àž¡àžàž±àžàžà¹àžàž±àž  
+
+UnknownPlugin.desc:àžàžµà¹àžàž·àž­àžàž¥àž±à¹àžàž­àžŽàžàž­àž¢à¹àž²àžàžà¹àž²àž¢àžªàž³àž«àž£àž±àžàžàž²àž£àžàž³à¹àžà¹àž²à¹àžà¹àž¡à¹àžàž£àž¹àžà¹àžàžàžàžµà¹à¹àžàž£à¹àžàž£àž¡àžàž£àžµàžàžªà¹àžàžà¹àž¡à¹à¹àžàž¢àž£àž¹à¹àžàž±àžàž¡àž²àžà¹àž­àž à¹àž­àžàžªàž²àž£àžàžµà¹àžàž¥àž­àž¡àžàž°àžàž¹àžàžªàž£à¹àž²àžàžàž¶à¹àžàžªàž³àž«àž£àž±àžàžàžžàžà¹ à¹àžà¹àž¡ à¹àž¥àž°àžàž±àž§à¹àžà¹àž¡àžàž°àžàž¹àžàžªà¹àžàžà¹àž²àžà¹àžàž¢àž±àžà¹àžàž£à¹àžàž£àž¡àžàž£àžµàžàžªà¹àžàžà¹àžà¹àž \"à¹àžà¹àž¡àžàžµà¹àžªàž±àž¡àžàž±àžàžà¹àžàž±àž\" àžàž­àžà¹àž­àžàžªàž²àž£  
+
+UnknownPlugin.file_format:àžàžàžŽàžàžàž­àžà¹àžà¹àž¡ (à¹àžà¹àž MPEG, MIDI, âŠ)  
+
+UnknownPlugin.mime_type:à¹àžà¹àž¡àžàžàžŽàž Mime (à¹àžà¹àž image/gif)  
+
+UnknownPlugin.process_extension:àžàž£àž°àž¡àž§àž¥àžàž¥à¹àžà¹àž¡àžà¹àž§àž¢àžàž²àž¡àžªàžàžžàž¥àžàž­àžà¹àžà¹àž¡àžàžµà¹  àžàž±àž§à¹àž¥àž·àž­àžàžàžµà¹à¹àžà¹àžàžàž²àžà¹àž¥àž·àž­àžàžªàž³àž«àž£àž±àž process_exp àžàž¶à¹àžàžàž°à¹àžà¹àžàž²àžàžà¹àž²àž¢àžàž§à¹àž² à¹àžà¹àž¡àžµàžàž§àž²àž¡àž¢àž·àžàž«àž¢àžžà¹àžàžà¹àž­àž¢àžàž§à¹àž²  
+
+UnknownPlugin.srcicon:àž£àž°àžàžžàžàž·à¹àž­à¹àž¡à¹àžàž£ (à¹àžàž¢à¹àž¡à¹àž¡àžµà¹àžàž£àž·à¹àž­àžàž«àž¡àž²àž¢àžàžµàžàž¥à¹àž²àž) à¹àžàž·à¹àž­à¹àžà¹à¹àžà¹àžà¹àž¡àžàž²àžàž²àžàž² srcicon  
+
+WordPlugin.desc:àžàž¥àž±à¹àžàž­àžŽàžàžªàž³àž«àž£àž±àžàžàž²àž£àžàž³à¹àžà¹àž²à¹àž­àžàžªàž²àž£ Microsoft Word  
+
+WordPlugin.windows_scripting:à¹àž«à¹à¹àžà¹à¹àžàžà¹àžà¹àž¥àž¢àžµàžªàžàž£àžŽàžàžà¹àžàž­àž Microsoft Windows (Visual Basic àžªàž³àž«àž£àž±àžà¹àžàž£à¹àžàž£àž¡àžàž£àž°àž¢àžžàžàžà¹) à¹àžàž·à¹àž­à¹àž«à¹à¹àžàž£à¹àžàž£àž¡ Word àžàž³àžàž²àž£à¹àžàž¥àžà¹àž­àžàžªàž²àž£à¹àžà¹àž HTML à¹àžàžàžàž²àž£àžàž¶à¹àžàžàž²à¹àžàžà¹àžàžàž£àž«àž±àžªà¹àžàžŽàž WvWare àžàž¶à¹àžàžàž³à¹àž«à¹àžªàž²àž¡àž²àž£àžà¹àžàžŽàžà¹àžàž£à¹àžàž£àž¡àžàž£àž°àž¢àžžàžàžà¹ Word àžàžàž«àžà¹àž²àžàž­à¹àžà¹àžà¹àž²àž¢àž±àžà¹àž¡à¹à¹àžà¹à¹àžàžŽàžà¹àžàž£à¹àžàž£àž¡àž­àž¢àž¹à¹  
+
+WordPlugin.metadata_fields:à¹àžà¹à¹àžàž·à¹àž­àžà¹àžàžàž·àžà¹àž¡àžàž²àžàž²àžàž²àžàž²àžà¹àž­àžàžªàž²àž£ HTML àžàžµà¹àžàž¹àžà¹àžàž¥àžà¹àžàž¢àžªàžàž£àžŽàžàžà¹ VB àžàž¥àž±à¹àžàž­àžŽàžàžàž°àž­àžàžžàžàž²àžà¹àž«à¹àžàž¹à¹à¹àžà¹àžàž³àž«àžàžàž£àž²àž¢àžàž²àž£à¹àžàžàžà¹àž­àž¡àž¹àž¥à¹àž¡àžàž²àžàž²àžàž²àžàžµà¹àžàž±à¹àžàžà¹àž§àž¢à¹àžàž£àž·à¹àž­àžàž«àž¡àž²àž¢àžàžžàž¥àž àž²àžà¹àžàž·à¹àž­àžàž¢àž²àž¢àž²àž¡àžàž±àžàžàž­àžàžà¹àž­àžàž§àž²àž¡ à¹àž«à¹à¹àžà¹ 'tag<tagname>' à¹àžàž·à¹àž­à¹àžªà¹à¹àžàž·à¹àž­àž«àž²àžàž­àžàžàž¹à¹ <tagname> à¹àž£àžàž¥àžà¹àžàž­àžàžà¹àžàž£àž°àžàž­àžà¹àž¡àžàž²àžàž²àžàž²àžàžµà¹àž¡àžµàžàž·à¹àž­àž§à¹àž² 'tagname' à¹àž«à¹àžàž³à¹àž¡àžàž²àžàž²àžàž²à¹àž«à¹à¹àžà¹àžàžàž±àž§àžàžŽàž¡àžà¹à¹àž«àžà¹àžà¹àž²àžàžžàžàžà¹àž­àžàžàž²àž£à¹àž«à¹à¹àžªàžàžà¹àž¡àžàž²àžàž²àžàž²à¹àžà¹àžàžàž±àž§àžàžŽàž¡àžà¹à¹àž«àžà¹à¹àžà¹àžàž£à¹àžàž£àž¡àžàž£àžµàžàžªà¹àžàž à¹àžàž·à¹àž­àžàžàž²àžàžàž²àž£àžàž±àžàžàž­àžà¹àžà¹àžà¹àž¡à¹à¹àž¢àžà¹àž¢àž°àžàž±àž§àžàžŽàž¡àžà¹à¹àž«àžà¹-à¹àž¥à¹àž  
+
+ZIPPlugin.desc:"àžàžàž°àžàžµà¹ àžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹àžàž±àžàžàž²àž£àž£àž¹àžà¹àžàžàžà¹àž­àž¡àž¹àž¥à¹àžà¹àž²àžàžµà¹àžàž¹àžàžàžµàžàž­àž±àž à¹àž¥àž°/àž«àž£àž·àž­àžàžµà¹àžàž±àžà¹àžà¹àžàžàž²àž§àž£ à¹àžà¹àžàž±àžàžàž²àž£àž£àž¹àžà¹àžàžà¹àž¥àž°àžàž²àž¡àžªàžàžžàž¥àžàž­àžà¹àžà¹àž¡àžàž±àžàžàžµà¹:\ngzip (.gz, .z, .tgz, .taz)\nbzip (.bz)\nbzip2 (.bz2)\nzip (.zip .jar)\ntar (.tar)\n\nàžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹àžàž°àžà¹àž­àžàžàž³àžàž²àžàž£à¹àž§àž¡àžàž±àžà¹àžàž£à¹àžàž£àž¡àž­àž£àž£àžàžàž£àž°à¹àž¢àžàžà¹àžàž±àžàžàžµà¹ (àžà¹àž²àžàž³àž¥àž±àžàžàž¢àž²àž¢àž²àž¡àžàž£àž°àž¡àž§àž¥àžàž¥àž£àž¹àžà¹àžàžàžàžµà¹àžªàž­àžàžàž¥à¹àž­àžàžàž±àž):\ngunzip (àžªàž³àž«àž£àž±àž gzip)\nbunzip (àžªàž³àž«àž£àž±àž bzip)\nbunzip2 \nunzip (àžªàž³àž«àž£àž±àž zip)\ntar (àžªàž³àž«àž£àž±àž tar)"
+
+#
+# Download module option descriptions
+#
+
+BaseDownload.desc:àžàž¥àž²àžªàžàž·à¹àžàžàž²àžàžªàž³àž«àž£àž±àžà¹àž¡àžàž¹àž¥àžàž²àž§àžà¹à¹àž«àž¥àž  
+BaseDownload.bad_general_option:à¹àž¡àžàž¹àž¥àžàž²àž§àžà¹à¹àž«àž¥àž %s à¹àžà¹àžàž±àž§à¹àž¥àž·àž­àžàžàžµà¹à¹àž¡à¹àžàž¹àžàžà¹àž­àž  
+MediaWikiDownload.desc:à¹àž¡àžàž¹àž¥àžªàž³àž«àž£àž±àžàžàž²àž£àžàž²àž§àžà¹à¹àž«àž¥àžàžà¹àž­àž¡àž¹àž¥àžàž²àžà¹àž§à¹àžàžàžµà¹à¹àžà¹ MediaWiki  
+MediaWikiDownload.reject_filetype:àž£àž²àž¢àžàž²àž£ URL àžàžµà¹àžà¹àž­àžàžàž²àž£àžà¹àž²àž¡ àžàž±à¹àžàžà¹àž§àž¢à¹àžàž£àž·à¹àž­àžàž«àž¡àž²àž¢àžàžžàž¥àž àž²àž (,) àžàž±àž§àž­àž¢à¹àž²àžà¹àžà¹àž *cgi-bin*,*.ppt àžàž°àž¡àž­àžàžà¹àž²àž¡à¹àž®à¹àžàž­àž£à¹àž¥àžŽàžàžà¹àžàžµà¹àž¡àžµàžàž³àž§à¹àž² 'cgi-bin' àž«àž£àž·àž­ '.ppt'  
+MediaWikiDownload.reject_filetype_disp:àž£àž¹àžà¹àžàž URL àžàžµà¹àžà¹àž­àžàžàž²àž£àžà¹àž²àž¡  
+MediaWikiDownload.exclude_directories:àž£àž²àž¢àžàž²àž£àžàž­àžà¹àžà¹àž£àžàžàž­àž£àžµàžàžµà¹àžà¹àž­àžàžàž²àž£àž¥àž°à¹àž§à¹àž (àžà¹àž­àžà¹àžà¹àžà¹àžªà¹àžàžàž²àžàžàžµà¹àžªàž¡àžàž¹àž£àžà¹à¹àžàž¢àž±àžà¹àžà¹àž£àžàžàž­àž£àžµ) à¹àžà¹àž /people, /documentation àžàž°àž¥àž°à¹àž§à¹àžà¹àžà¹àž£àžàžàž­àž£àžµàž¢à¹àž­àž¢ 'people' à¹àž¥àž° 'documentation' àž àž²àž¢à¹àžà¹à¹àžàžà¹àžàžµà¹àžàž³àž¥àž±àžàžàž±àžà¹àžà¹àžàžà¹àž­àž¡àž¹àž¥àž­àž¢àž¹à¹à¹àžàžàž±àžàžàžžàžàž±àž  
+MediaWikiDownload.exclude_directories_disp:àž¥àž°à¹àž§à¹àžà¹àžà¹àž£àžàžàž­àž£àžµ  
+
+OAIDownload.desc:à¹àž¡àžàž¹àž¥àžªàž³àž«àž£àž±àžàžàž²àž£àžàž²àž§àžà¹à¹àž«àž¥àžàžàž²àžàžàž¥àž±àž OAI  
+OAIDownload.url_disp:URL àžà¹àžàžàžàž±àž  
+OAIDownload.url:URL àžàž­àžàžàž¥àž±àž OAI  
+OAIDownload.set_disp:àžàž³àžàž±àžà¹àžàžàž²àž°àžàž¥àžžà¹àž¡  
+OAIDownload.set:àžàž³àžàž±àžàžàž²àž£àžàž²àž§àžà¹à¹àž«àž¥àžàžà¹àž§àž¢àžàžžàžàžàžµà¹àž£àž°àžàžžà¹àž§à¹à¹àžàžàž¥àž±àž  
+OAIDownload.metadata_prefix_disp:àžàž³àžàž³àž«àžà¹àž²à¹àž¡àžàž²àžàž²àžàž²  
+OAIDownload.metadata_prefix:àž£àž¹àžà¹àžàžàžàž­àžà¹àž¡àžàž²àžàž²àžàž²àžàžµà¹à¹àžà¹à¹àžàžà¹àž­àž¡àž¹àž¥àžàžµà¹àžªà¹àžàž­àž­àž à¹àžà¹àž oai_dc, qdc, à¹àž¥àž°àž­àž·à¹àžà¹ à¹àž«à¹àžàžàžàžžà¹àž¡ <àžà¹àž­àž¡àž¹àž¥à¹àžàžŽàž£à¹àžà¹àž§àž­àž£à¹> à¹àžàž·à¹àž­àžà¹àžàž«àž²àž£àž¹àžà¹àžàžà¹àžà¹àž¡àžàžµà¹àž£àž°àžàžàž£àž­àžàž£àž±àž  
+OAIDownload.get_doc_disp:àž£àž±àžà¹àž­àžàžªàž²àž£  
+OAIDownload.get_doc:àžàž²àž§àžà¹à¹àž«àž¥àžà¹àž­àžàžªàž²àž£àžà¹àžàžàžàž±àžàžà¹àž²àž¡àžµàžàž²àž£àž£àž°àžàžžà¹àž§à¹à¹àžàž£àž°à¹àžàžµàž¢àž  
+OAIDownload.get_doc_exts_disp:à¹àžàžàž²àž°àžàžàžŽàžàžàž­àžà¹àžà¹àž¡à¹àž«àž¥à¹àž²àžàžµà¹à¹àžà¹àž²àžàž±à¹àž  
+OAIDownload.get_doc_exts:àžàž²àž¡àžªàžàžžàž¥à¹àžà¹àž¡àžàž­àžà¹àž­àžàžªàž²àž£àžàžµà¹àžà¹àž­àžàžàž²àž£à¹àžà¹àžà¹àžàžµà¹àž¢àž§àž¡àž²  
+OAIDownload.max_records_disp:àžàž³àžàž§àžàž£àž°à¹àžàžµàž¢àžàžªàž¹àžàžªàžžàž  
+OAIDownload.max_records:àžàž³àžàž§àžàžªàž¹àžàžªàžžàžàžàž­àžàž£àž°à¹àžàžµàž¢àžàžàžµà¹àžªàž²àž¡àž²àž£àžàžàž²àž§àžà¹à¹àž«àž¥àžà¹àžà¹  
+
+SRWDownload.desc:à¹àž¡àžàž¹àž¥àžªàž³àž«àž£àž±àžàžàž²àž£àžàž²àž§àžà¹à¹àž«àž¥àžàžàž²àžàžàž¥àž±àž SRW (àžà¹àžàž«àž²/àžà¹àžàžàž·àž àžàž£àžŽàžàž²àž£à¹àž§à¹àž)  
+
+WebDownload.desc:à¹àž¡àžàž¹àž¥àžªàž³àž«àž£àž±àžàžàž²àž£àžàž²àž§àžà¹à¹àž«àž¥àžàžàž²àžàž­àžŽàžà¹àžàž­àž£à¹à¹àžà¹àžàžà¹àž²àžàžàž²àž HTTP àž«àž£àž·àž­ FTP  
+WebDownload.url:URL àžà¹àžà¹àž«àž¥à¹àž à¹àžàžàž£àžàžµàžàžµà¹à¹àžà¹àž HTTP Redirect àžà¹àž²àžàžµà¹àž­àž²àžàž¡àžµàžàž²àž£à¹àžàž¥àžµà¹àž¢àžà¹àžàž¥àž  
+WebDownload.url_disp:URL àžàž­àžàžà¹àžàžàžàž±àž  
+WebDownload.depth:àžàž°àžà¹àž­àžàž¡àžµàžàž²àž£à¹àžàž·à¹àž­àž¡à¹àž¢àžàž«àž¥àž²àž¢àž¡àžŽàžàžŽàž¥àž¶àžàž¥àžà¹àžàž¡àž²àžà¹àžà¹àž²à¹àžàžàžàž°àžàž³àžàž²àž£àžàž²àž§àžà¹à¹àž«àž¥àž  
+WebDownload.depth_disp:àžàž§àž²àž¡àž¥àž¶àžà¹àžàžàž²àž£àžàž²àž§àžà¹à¹àž«àž¥àž  
+WebDownload.below:à¹àžàžàž²àž°à¹àžà¹àž¡àž¡àžŽà¹àž£àž­àž£à¹àž àž²àž¢à¹àžà¹ URL àžàžµà¹  
+WebDownload.below_disp:à¹àžàžàž²àž°à¹àžà¹àž¡àžà¹àž­àž¡àž¹àž¥àž àž²àž¢à¹àžà¹ URL àžàžµà¹  
+WebDownload.within:à¹àžàžàž²àž°à¹àžà¹àž¡àž¡àžŽà¹àž£àž­àž£à¹àž àž²àž¢à¹àžà¹àžàžà¹à¹àžàžµàž¢àž§àžàž±àž  
+WebDownload.within_disp:à¹àžàžàž²àž°à¹àžà¹àž¡àž àž²àž¢à¹àžà¹àžàžà¹à¹àžàžµàž¢àž§àžàž±àž
+  
+WebDownload.html_only:àžàž²àž§àžà¹à¹àž«àž¥àžà¹àžàžàž²àž°à¹àžà¹àž¡ HTML à¹àžà¹àž²àžàž±à¹àž à¹àž¥àž°àž¥àž°à¹àž§à¹àžà¹àžà¹àž¡àžàžµà¹àžªàž±àž¡àžàž±àžàžà¹àžàž±àž à¹àžà¹àž àž£àž¹àž à¹àž¥àž°àžªà¹àžàž¥à¹àžàžµàž  
+WebDownload.html_only_disp:à¹àžàžàž²àž°à¹àžà¹àž¡ HTML à¹àžà¹àž²àžàž±à¹àž  
+
+WgetDownload.desc:àžàž¥àž²àžªàžàž·à¹àžàžàž²àžàžàžµà¹àžàž±àžàžàž²àž£àžàž²àž£à¹àž£àžµàž¢àžà¹àžàž¢àž±àž wget  
+WgetDownload.proxy_on:àžàž£à¹àž­àžàžàžµà¹àžàžŽàžàž­àž¢àž¹à¹  
+WgetDownload.proxy_host:à¹àž®àžªàžà¹àžàž£à¹àž­àžàžàžµ  
+WgetDownload.proxy_port:àžàž­àž£à¹àžàžàž­àžàžàž£à¹àž­àžàžàžµ  
+WgetDownload.user_name:àžàž·à¹àž­àžàž¹à¹à¹àžà¹  
+WgetDownload.user_password:àž£àž«àž±àžªàžà¹àž²àžàžàž­àžàžàž¹à¹à¹àžà¹  
+
+Z3950Download.desc:à¹àž¡àžàž¹àž¥àžªàž³àž«àž£àž±àžàžàž²àž£àžàž²àž§àžà¹à¹àž«àž¥àžàžàž²àžàžàž¥àž±àž Z3950  
+Z3950Download.host:URL àžàž­àžà¹àž®àžªàžà¹  
+Z3950Download.host_disp:à¹àž®àžªàžà¹  
+Z3950Download.port:àž«àž¡àž²àž¢à¹àž¥àžàžàž­àž£à¹àžàžàž­àžàžàž¥àž±àž  
+Z3950Download.port_disp:àžàž­àž£à¹àž  
+Z3950Download.database:àžàž²àžàžà¹àž­àž¡àž¹àž¥àžàžµà¹àžàž°à¹àžà¹àžà¹àžàž«àž²àž£àž°à¹àžàžµàž¢àž  
+Z3950Download.database_disp:àžàž²àžàžà¹àž­àž¡àž¹àž¥  
+Z3950Download.find:àžà¹àžàžàž·àžàž£àž°à¹àžàžµàž¢àžàžàžµà¹àž¡àžµàžàž³àžà¹àžàžàžµà¹àž£àž°àžàžž  
+Z3950Download.find_disp:àžà¹àžàž«àž²  
+Z3950Download.max_records:àžàž³àžàž§àžàžªàž¹àžàžªàžžàžàžàž­àžàž£àž°à¹àžàžµàž¢àžàžàžµà¹àžªàž²àž¡àž²àž£àžàžàž²àž§àžà¹à¹àž«àž¥àžà¹àžà¹  
+Z3950Download.max_records_disp:àžàž³àžàž§àžàž£àž°à¹àžàžµàž¢àžàžªàž¹àžàžªàžžàž  
+
+
+#
+#Plugout option descriptions
+#
+
+BasPlugout.bad_general_option:àžàž¥àž±à¹àžà¹àž­àž²àžà¹ %s à¹àžà¹àžàž±àž§à¹àž¥àž·àž­àžàžàžµà¹à¹àž¡à¹àžàž¹àžàžà¹àž­àž  
+BasPlugout.debug:àžàž±à¹àžàžà¹àž²à¹àž«àž¡àžàžàžµàžàž±à¹àž  
+BasPlugout.desc:àžàž¥àž²àžªàžàž·à¹àžàžàž²àžàžªàž³àž«àž£àž±àžàžàž¥àž±à¹àžà¹àž­àž²àžà¹àžªà¹àžàž­àž­àžàžàž±à¹àžàž«àž¡àž  
+BasPlugout.group_size:àžàž³àžàž§àžà¹àž­àžàžªàž²àž£àžàžµà¹àžàž°àž£àž§àž¡àž­àž¢àž¹à¹à¹àžà¹àžà¹àž¡ XML à¹àžà¹àž¡à¹àžàžµàž¢àž§  
+BasPlugout.gzip_output:à¹àž«à¹à¹àžà¹à¹àžàž£à¹àžàž£àž¡ gzip à¹àžàž·à¹àž­àžàžµàžàž­àž±àžà¹àž­àžàžªàž²àž£ XML àžàžµà¹à¹àžà¹àžàžàž¥àž¥àž±àžàžà¹ (à¹àž¡àž·à¹àž­àž¡àžµàžàž²àž£àžªàž£à¹àž²àžàžàž²àžà¹àž­àžàžªàž²àž£àžàžµà¹àžàž¹àžàžàžµàžàž­àž±àž àž­àž¢à¹àž²àž¥àž·àž¡àž£àž§àž¡ ZIPPlugin à¹àžà¹àž²à¹àžà¹àžàž£àž²àž¢àžàž²àž£àžàž¥àž±à¹àžàž­àžŽàžàžàž­àžàžàžžàžàžà¹àž§àž¢)  
+BasPlugout.output_handle:àžàž±àž§àž­àžàžŽàžàž²àž¢à¹àžà¹àž¡àžàžµà¹à¹àžà¹àžªà¹àžàžà¹àž­àž¡àž¹àž¥àžàž¥àž¥àž±àžàžà¹  
+BasPlugout.output_info:àžàž²àž£àž­à¹àž²àžàž­àžŽàžà¹àžàž¢àž±àžàž§àž±àžàžàžž arcinfo àžàžµà¹à¹àžà¹àžàž±àžà¹àžà¹àžàžà¹àž­àž¡àž¹àž¥à¹àžàžµà¹àž¢àž§àžàž±àžà¹àž«àž¥à¹àžàžà¹àž­àž¡àž¹àž¥àžàž²àž§àž£  
+BasPlugout.verbosity:àžàž§àžàžàžžàž¡àžàž£àžŽàž¡àž²àžàžà¹àž­àžàž§àž²àž¡àžàžµà¹à¹àžªàžàž  0=à¹àž¡à¹àž¡àžµ  3=àž¡àž²àž  
+BasPlugout.xslt_file:à¹àžàž¥àžà¹àž­àžàžªàž²àž£àžà¹àž§àž¢ XSLT à¹àžà¹àžà¹àž¡àžàžµà¹àž£àž°àžàžž  
+
+DSpacePlugout.desc:àž£àž¹àžà¹àžàžà¹àž­àžàžªàž²àž£àžàž±àžà¹àžà¹àžàžàž²àž§àž£àžàž­àž DSpace  
+
+FedoraMETSPlugout.desc:àž£àž¹àžà¹àžàž METS àžàžµà¹à¹àžà¹à¹àžàž£à¹àžàž¥à¹ Fedora  
+FedoraMETSPlugout.fedora_namespace:àžàž³àžàž³àž«àžà¹àž²àžàžµà¹à¹àžà¹à¹àž Fedora à¹àžàž·à¹àž­àžàž£àž°àž¡àž§àž¥àžàž¥  ids (PIDS) à¹àžà¹àž greenstone:HASH0122efe4a2c58d0  
+
+GreenstoneXMLPlugout.desc:àž£àž¹àžà¹àžàžàžàž²àž£àžàž±àžà¹àžà¹àžà¹àžà¹àž¡ XML à¹àžàžàžàž²àž§àž£àžàž­àžà¹àžàž£à¹àžàž£àž¡àžàž£àžµàžàžªà¹àžàž  
+
+GreenstoneMETSPlugout.desc:àž£àž¹àžà¹àžàž METS àžàžµà¹à¹àžà¹à¹àžàž£à¹àžàž¥à¹ Greenstone  
+
+MARCXMLPlugout.desc:àž£àž¹àžà¹àžàž MARC XML  
+MARCXMLPlugout.group:àžªà¹àžàž­àž­àžàž£àž°à¹àžàžµàž¢àž MARC XML àž¥àžà¹àžà¹àžà¹àž¡à¹àžàžµà¹àž¢àž§  
+MARCXMLPlugout.mapping_file:àžàž·à¹àž­à¹àžà¹àž¡àžàž²àž£à¹àž¡àžàžªàž³àž«àž£àž±àžàžàž²àž£à¹àžàž¥àžàžà¹àž­àž¡àž¹àž¥  
+
+METSPlugout.desc:àžàž¥àž²àžªàžàž·à¹àžàžàž²àžàžàž¥àž±à¹àžà¹àž­àž²àžà¹àžªàž³àž«àž£àž±àžàž£àž¹àžà¹àžàž METS àžàž±àžà¹àžàž£àžµàž¢àž¡àžàž±àžàžà¹àžàž±àžàžàž²àž£àžàž³àžàž²àžàžàžµà¹à¹àžà¹àž£à¹àž§àž¡àžàž±àžàžªàž³àž«àž£àž±àžà¹àžàž£à¹àžàž¥à¹àžà¹àž²àžà¹ à¹àžà¹àž GreenstoneMETS à¹àž¥àž° FedoraMETS àžàž£à¹àž­àž¡àžàž±à¹àž Abstract Methods  
+METSPlugout.xslt_txt:à¹àžàž¥àžà¹àžà¹àž¡ doctxt.xml àžàž­àž METS àžà¹àž§àž¢ XSLT à¹àžà¹àžà¹àž¡àžàžµà¹àž£àž°àžàžž  
+METSPlugout.xslt_mets:à¹àžàž¥àžà¹àžà¹àž¡ docmets.xml àžàž­àž METS àžà¹àž§àž¢ XSLT à¹àžà¹àžà¹àž¡àžàžµà¹àž£àž°àžàžž  
+
+#
+# Perl module strings
+#
+
+classify.could_not_find_classifier:àžà¹àž­àžàžŽàžàžàž¥àž²àž: à¹àž¡à¹àžàžàžàž±àž§à¹àž¢àžàžàž£àž°à¹àž àž \"%s\"  
+
+download.could_not_find_download:àžà¹àž­àžàžŽàžàžàž¥àž²àž: à¹àž¡à¹àžàžà¹àž¡àžàž¹àž¥àžàž²àž§àžà¹à¹àž«àž¥àž \"%s\"  
+
+plugin.could_not_find_plugin:àžà¹àž­àžàžŽàžàžàž¥àž²àž: à¹àž¡à¹àžàžàžàž¥àž±à¹àžàž­àžŽàž \"%s\"  
+
+plugin.including_archive:àž£àž§àž¡àžàž¶àžà¹àžàž·à¹àž­àž«àž²àžàž­àžà¹àžà¹àž¡à¹àžà¹àžàžàž²àž§àž£ ZIP/TAR 1 à¹àžà¹àž¡  
+
+plugin.including_archives:àž£àž§àž¡àžàž¶àžà¹àžàž·à¹àž­àž«àž²àžàž­àžà¹àžà¹àž¡à¹àžà¹àžàžàž²àž§àž£ ZIP/TAR %d à¹àžà¹àž¡  
+
+plugin.kill_file:àžàž²àž£àžàž£àž°àž¡àž§àž¥àžàž¥àžàž¹àžàžàž³àžàž±àžà¹àžàž¢à¹àžà¹àž¡ .kill  
+
+plugin.n_considered:à¹àž­àžàžªàž²àž£àžàž³àžàž§àž %d àžàžàž±àžà¹àžà¹àž£àž±àžàžàž²àž£àžàžŽàžàž²àž£àžàž²à¹àž«à¹àžàž£àž°àž¡àž§àž¥àžàž¥  
+
+plugin.n_included:%d àžàž¹àžàžàž£àž°àž¡àž§àž¥àžàž¥ à¹àž¥àž°àž£àž§àž¡à¹àžà¹àž²à¹àžàžàž­àž¥à¹àž¥àžàžàž±àž  
+
+plugin.n_rejected:%d àžàž¹àžàžàžàžŽà¹àžªàž  
+
+plugin.n_unrecognised:à¹àž¡à¹àž£àž¹à¹àžàž±àž %d  
+
+plugin.no_plugin_could_process:àžàž³à¹àžàž·àž­àž: à¹àž¡à¹àž¡àžµàžàž¥àž±à¹àžàž­àžŽàžà¹àžàžàžµà¹àžªàž²àž¡àž²àž£àžàžàž£àž°àž¡àž§àž¥àžàž¥ %s à¹àžà¹  
+
+plugin.no_plugin_could_recognise:àžàž³à¹àžàž·àž­àž: à¹àž¡à¹àž¡àžµàžàž¥àž±à¹àžàž­àžŽàžà¹àžàžàžµà¹àž£àž¹à¹àžàž±àž %s  
+
+plugin.no_plugin_could_process_this_file:à¹àž¡à¹àž¡àžµàžàž¥àž±à¹àžàž­àžŽàžà¹àžàžàžµà¹àžªàž²àž¡àž²àž£àžàžàž£àž°àž¡àž§àž¥à¹àžà¹àž¡àžàžµà¹à¹àžà¹  
+
+plugin.no_plugin_could_recognise_this_file:à¹àž¡à¹àž¡àžµàžàž¥àž±à¹àžàž­àžŽàžàžàžµà¹àž£àž¹à¹àžàž±àžà¹àžà¹àž¡àžàžµà¹  
+
+plugin.one_considered:à¹àž­àžàžªàž²àž£ 1 àžàžàž±àžà¹àžà¹àž£àž±àžàžàž²àž£àžàžŽàžàž²àž£àžàž²à¹àž«à¹àžàž£àž°àž¡àž§àž¥àžàž¥  
+
+plugin.one_included:1 àžàž¹àžàžàž£àž°àž¡àž§àž¥àžàž¥ à¹àž¥àž°àž£àž§àž¡à¹àžà¹àž²à¹àžàžàž­àž¥à¹àž¥àžàžàž±àž  
+
+plugin.one_rejected:1 àžàž¹àžàžàžàžŽà¹àžªàž  
+
+plugin.one_unrecognised:à¹àž¡à¹àž£àž¹à¹àžàž±àž 1  
+
+plugin.see_faillog:àžàž¹ %s àžªàž³àž«àž£àž±àžàž£àž²àž¢àžàž²àž£à¹àž­àžàžªàž²àž£àžàžµà¹à¹àž¡à¹àž£àž¹à¹àžàž±àž à¹àž¥àž°/àž«àž£àž·àž­àžàž¹àžàžàžàžŽà¹àžªàž  
+
+PrintUsage.default:àžà¹àž²à¹àž£àžŽà¹àž¡àžà¹àž  
+
+PrintUsage.required:àžàž³à¹àžà¹àž  
+
+plugout.could_not_find_plugout:àžà¹àž­àžàžŽàžàžàž¥àž²àž: à¹àž¡à¹àžàžàžàž¥àž±à¹àžà¹àž­àž²àžà¹ \"%s\"  
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/strings_zh.properties
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/strings_zh.properties	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/strings_zh.properties	(revision 24799)
@@ -0,0 +1,1764 @@
+#
+# Resource bundle description
+#
+
+Language.code:zh  
+Language.name:è±è¯­  
+
+OutputEncoding.unix:utf-8  
+OutputEncoding.windows:utf-8  
+
+
+#
+# Common output messages and strings
+#
+
+common.cannot_create_file:éè¯¯ïŒæ æ³åå»ºæä»¶ïŒ
+s  
+
+common.cannot_find_cfg_file:éè¯¯ïŒæ æ³æŸå°é
+çœ®æä»¶ïŒ
+s  
+
+common.cannot_open:éè¯¯ïŒæ æ³æåŒïŒ
+s  
+
+common.cannot_open_fail_log:éè¯¯ïŒæ æ³æåŒæ¥å¿æä»¶ïŒ
+S  
+
+common.cannot_open_output_file:éè¯¯ïŒæ æ³æåŒèŸåºæä»¶ïŒ
+s  
+
+common.cannot_read:éè¯¯ïŒæ æ³è¯»åïŒ
+s  
+
+common.cannot_read_file:éè¯¯ïŒæ æ³è¯»åæä»¶ïŒ
+s  
+
+common.general_options:éçšéé¡¹ïŒçšäºïŒ
+sïŒ  
+
+common.must_be_implemented:åœæ°å¿
+é¡»åšå­ç±»äž­å®ç°ã  
+
+common.options:éé¡¹  
+
+common.processing:å€ç  
+
+common.specific_options:å
+·äœéé¡¹  
+
+common.usage:çšæ³  
+
+common.info:ä¿¡æ¯  
+
+common.invalid_options:éæ³éé¡¹ïŒïŒ
+s  
+
+common.true:ç  
+
+common.false:å  
+
+common.deprecated:éå  
+#
+# Script option descriptions and output messages
+#
+
+scripts.language:çšäœç§è¯­èšæŸç€ºéé¡¹æè¿°ïŒäŸåŠ'en US'æå®çŸåœè±è¯­ïŒãèŠæ±éé¡¹æè¿°çç¿»è¯å¿
+é¡»èœåšperllib/strings_language-code.rbæä»¶äž­æŸå°ã  
+
+scripts.xml:ä»¥XMLåœ¢åŒäº§çä¿¡æ¯ïŒæ éåäžœçè¯è¿°äœèŠè¯Šç»ã  
+
+scripts.listall:ååºå·²ç¥ææé¡¹ç®çéé¡¹ã  
+
+scripts.describeall:æŸç€ºå·²ç¥ææé¡¹ç®çéé¡¹ã  
+
+scripts.both_old_options:è­ŠåïŒéé¡¹-removeoldäž-keepoldæ-incrementaläžèµ·è®Ÿå®ïŒåå®æ¡ä»¶äžº-removeoldãïŒ
+sç®åœäžçåœåå
+å®¹å°è¢«å é€ã  
+
+scripts.no_old_options:è­ŠåïŒéé¡¹-removeold, -keepold æ -incrementaläž­çäžäžªå¿
+é¡»æå®ïŒåå®äžº-removeoldãïŒ
+sç®åœäžçåœåå
+å®¹å°è¢«å é€ã  
+
+scripts.gli:ä»GLIäž­è¿è¡è¯¥èæ¬çåæ°ïŒæ¿æŽ»äžéšçGLIèŸåºã  
+
+# -- buildcol.pl --
+
+buildcol.archivedir:å­æ¡£æä»¶å­æŸå€  
+
+buildcol.builddir:çŽ¢åŒå­æŸå€  
+
+buildcol.cachedir:åšå€å¶å°åå»ºç®åœäžä¹åæ¶èäŒææ¶å­æŸåšè¿éã  
+
+buildcol.cannot_open_cfg_file:è­ŠåïŒæ æ³æåŒé
+çœ®æä»¶è¿è¡åçº§ïŒïŒ
+s  
+
+buildcol.collectdir:âcollectâç®åœçè·¯åŸ  
+
+buildcol.copying_back_cached_build:å€å¶åçŒå­çåå»º  
+
+buildcol.create_images:è¯åŸäžºæ°æ¶èåå»ºåå®åŸåãè¿æèµäºå·²ç»å®è£
+äºGimpä»¥åçžå
+³çperlæš¡åã  
+
+buildcol.debug:å°èŸåºåéå°STDOUT  
+
+buildcol.desc:çšäºä»å­æ¡£ææ¡£äž­åå»ºGreenstoneéŠèçPERLèæ¬ã  
+
+buildcol.faillog:éè¯¯æ¥å¿æä»¶åãè¯¥æ¥å¿å­åšæææ æ³è¢«å€ççæä»¶çåå­ã  
+
+buildcol.incremental_default_builddir:è­ŠåïŒçŒºççåå»ºç®åœäžºâbuildingâãåŠæäœ æ³ä»¥éå¢çæ¹åŒæ·»å å°çŽ¢åŒç®åœïŒè¯·äœ¿çšbuildcol.plçâ-builddir indexâéé¡¹ã  
+
+buildcol.index:åŸ
+åå»ºççŽ¢åŒïŒåŠææªè®Ÿå®ïŒååå»ºé
+çœ®æä»¶äž­çå
+šéšçŽ¢åŒïŒã  
+
+buildcol.incremental:ä»
+åªä»¥åæªè¢«çŽ¢åŒè¿ççŽ¢åŒææ¡£ãè¿æå³ç-keepoldéé¡¹ãäŸèµäºluceneçŽ¢åŒåšã  
+
+buildcol.keepold:äžæž
+é€åå»ºç®åœäžçåœåå
+å®¹ã  
+
+buildcol.maxdocs:åŸ
+åå»ºææ¡£çæå€§åŒã  
+buildcol.maxnumeric:çŽ¢åŒåºäž­äžäžªâè¯âæèœå«æçæå€çäœæ°ãå€§çæ°å­äŒåå²æå äžªè¯ä»¥äŸ¿æé çŽ¢åŒãäŸåŠïŒåŠææå€§äœæ°æ¯4ïŒâ1342663âäŒåå²æâ1342"å"663"ã  
+buildcol.mode:åå»ºè¿çšäž­å°è¢«å®æœçéšåã  
+buildcol.mode.all:å
+šéšå®æœã  
+buildcol.mode.build_index:ä»
+åå»ºææ¬ççŽ¢åŒã  
+buildcol.mode.compress_text:ä»
+åçŒ©ææ¬ã  
+buildcol.mode.infodb:ä»
+åå»ºmetadataæ°æ®åºã  
+
+buildcol.no_default_images:äžäŒçæåå®åŸå  
+
+buildcol.no_image_script:è­ŠåïŒæ æ³æŸå°åŸåçæèæ¬ïŒïŒ
+s  
+
+buildcol.no_strip_html:äžèŠä»çŽ¢åŒææ¬äž­å»é€htmlæ ç­ŸïŒä»
+éçšäºmgppæ¶èïŒã  
+
+buildcol.no_text:äžèŠå­åšåçŒ©ææ¬ãåŠæèŠåšè¿è¡ç¶æäžæŸç€ºåå§ææ¡£ïŒè¯¥éé¡¹æå©äºåå°æåå»ºçŽ¢åŒçå€§å°ïŒå³ïŒå°æ æ³åŸå°åçŒ©çææ¬ïŒã  
+
+buildcol.sections_index_document_metadata:æ®µèœçº§å«äžççŽ¢åŒææ¡£metadataã  
+buildcol.sections_index_document_metadata.never:äžèŠåšæ®µèœçº§å«åå»ºä»»äœææ¡£çº§metadataã  
+buildcol.sections_index_document_metadata.always:å³äœ¿æ®µèœçº§å«metadataå­åšïŒä¹èŠæ·»å æææå®çææ¡£çº§metadataã  
+buildcol.sections_index_document_metadata.unless_section_metadata_exists:ä»
+åœæææ®µèœçº§metadataäžå­åšæ¶ææ·»å ææ¡£çº§metadataã  
+
+buildcol.out:å­åšèŸåºç¶æçæä»¶åã  
+
+buildcol.params:ãéé¡¹ãæ¶èçåç§°  
+
+buildcol.remove_empty_classifications:éèç©ºçåç±»åšååç±»èç¹ïŒå³é£äºäžå«ææ¡£çèç¹ïŒ  
+
+buildcol.removeold:å é€åå»ºç®åœäžçæ§ææ¡£ã  
+
+buildcol.unlinked_col_images:æ¶èäž­çåŸåå¯èœæªè¢«æ­£ç¡®éŸæ¥ã  
+
+buildcol.unknown_mode:æªç¥æš¡åŒïŒïŒ
+s  
+
+buildcol.updating_archive_cache:åçº§å­æ¡£çŒå­  
+
+buildcol.verbosity:æ§å¶èŸåºçæ°éã0ïŒæ ïŒ3ïŒåŸå€  
+
+
+# -- classinfo.pl --
+
+classinfo.collection:äžºæ¶èåœåäŒä»€classinfo.pléŠå
+åšcollect/collection-name/perllib/classifyäž­æå¯»ãåŠæåšé£éæŸäžå°åç±»åšïŒåæå¯»perllib/classifyç®åœã  
+
+classinfo.desc:æå°æå
+³åç±»åšçä¿¡æ¯ã  
+
+classinfo.general_options:éçšéé¡¹ä»åç±»åšçç¶ç±»ç»§æ¿ã  
+
+classinfo.info:ä¿¡æ¯  
+
+classinfo.no_classifier_name:éè¯¯ïŒå¿
+é¡»æäŸåç±»åšåç§°ã  
+
+classinfo.option_types:åç±»åšå¯æ¥åäž€ç§éé¡¹ã  
+
+classinfo.params:ãéé¡¹ãåç±»åšåç§°  
+
+classinfo.passing_options:å¯å°éé¡¹å
+æ¬åšcollect.cfgé
+çœ®æä»¶äž­ä»èäŒ éç»å
+¶ä»åç±»åšã  
+
+classinfo.specific_options:å®ä¹åšåç±»åšäž­çå
+·äœéé¡¹ïŒäžåªéçšäºè¯¥åç±»åšã  
+
+# -- downloadfrom.pl --
+downloadfrom.cache_dir:çŒå­ç®åœçäœçœ®ã  
+downloadfrom.desc:ä»å€çœ®æå¡åšäžèœœçæä»¶ã  
+downloadfrom.download_mode:äžèœœæå¡åšçç±»åã  
+downloadfrom.download_mode.Web:HTTP  
+downloadfrom.download_mode.MediaWiki:MediaWikiçœç«ã  
+downloadfrom.download_mode.OAI:Open Archives Initiative  
+downloadfrom.download_mode.z3950:z3950 æå¡åš  
+downloadfrom.download_mode.SRW:SearchRetrieve çœäžæå¡ã  
+downloadfrom.incorrect_mode:download_modeéé¡¹éè¯¯  
+downloadfrom.info:ååºæå¡åšä¿¡æ¯ïŒäžèŠäžèœœã  
+downloadfrom.params:ãéçšéé¡¹ããå
+·äœäžèœœéé¡¹ã  
+
+# -- downloadinfo.pl --
+
+downloadinfo.desc:ååºäžèœœæš¡åçä¿¡æ¯ã  
+downloadinfo.collection:äžºæ¶èåœåäŒä»€downloadinfo.pléŠå
+åšcollect/collection-name/perllib/downloadersäž­æå¯»ãåŠæåšé£éæŸäžå°åç±»åšïŒåæå¯»perllib/downloadersç®åœã  
+downloadinfo.params:ãéé¡¹ããäžèœœæš¡åã  
+downloadinfo.general_options:éçšéé¡¹ä»äžèœœæš¡åçç¶ç±»ç»§æ¿ã  
+downloadinfo.specific_options:å®ä¹åšäžèœœæš¡åäž­çå
+·äœéé¡¹ïŒäžåªéçšäºè¯¥äžèœœåšã  
+downloadinfo.option_types:äžèœœæš¡åå¯æ¥åäž€ç§éé¡¹ã  
+
+# -- explode_metadata_database.pl --
+explode.desc:æ¿åäžäžªmetadataæ°æ®åºã  
+
+explode.collection:éŠèåç§°ãæäºæä»¶äŒå¯»æŸéŠèæä»¶å€¹äž­çéå±æä»¶ã  
+ 
+explode.document_field:è®Ÿå®èŠè·ååå
+æ¬åšæ¶èäž­çææ¡£çæä»¶åçmetadataå
+çŽ ã  
+
+explode.document_prefix:ææ¡£äœçœ®çåçŒïŒçšäºææ¡£åéé¡¹ïŒã  
+
+explode.document_suffix:ææ¡£äœçœ®çåçŒïŒçšäºææ¡£åéé¡¹ïŒã  
+
+explode.encoding:çšäºåœè¯»å
+¥æ°æ®åºæä»¶æ¶ççŒç ã  
+explode.metadata_set:çšäºèŸåºææmetadataçmetadataç»ïŒåè¯åºéŽïŒã  
+explode.plugin:çšäºæ¿åçæä»¶ã  
+explode.plugin_options:åšæ©å±ä¹åäŒ éå°æä»¶çéé¡¹ãéé¡¹åç§°å¿
+é¡»ä»¥ïŒåŒå€Žãéé¡¹ååéé¡¹åŒä»¥ç©ºæ ŒéŽéãäžèœäž-use_collection_plugin_optionså
+±çšã  
+explode.use_collection_plugin_options:è¯»å
+¥éŠèé
+çœ®æä»¶å¹¶äœ¿çšç¹å®æä»¶çéé¡¹ãèŠæ±æ-collectionéé¡¹ãäžèœäž-plugin_optionså
+±çšã  
+explode.params:ãéé¡¹ãæä»¶å  
+explode.records_per_folder:å­å
+¥æ¯äžªå­æä»¶å€¹çè®°åœçæ°éã  
+
+# -- replace_srcdoc_with_html.pl --
+srcreplace.desc:åšéå»ºæ¶çšçæçHTMLæä»¶æ¿æ¢æºææ¡£ã  
+srcreplace.params:[éé¡¹]æä»¶å  
+srcreplace.plugin:çšæ¥èœ¬æ¢æºææ¡£çæä»¶  
+
+# -- exportcol.pl --
+
+exportcol.out:å­åšèŸåºç¶æçæä»¶åã  
+exportcol.cddir:èŸåºCDå
+å®¹çç®åœåã  
+exportcol.cdname:CD-ROMçåå­ïŒäžæŠCD-ROMå®è£
+å®æ¯ååºç°åšåŒå§èåçåå­ã  
+exportcol.desc:çšäºèŸåºäžäžªæå€äžªWindows CD-ROMçPERLèæ¬  
+exportcol.noinstall:çæäžäžªå¯çŽæ¥è¿è¡åŸä¹ŠéŠçCD-ROMäžäžåšè¿è¡è®¡ç®æºäžå®è£
+ä»»äœå
+å®¹  
+exportcol.params:ãéé¡¹ãæ¶èå1ïŒæ¶èå2âŠ  
+exportcol.coll_not_found:å¿œç¥æ ææ¶èïŒ
+sïŒæ æ³æŸå°ç®åœïŒ
+s  
+exportcol.coll_dirs_not_found:å¿œç¥æ ææ¶èïŒ
+sïŒä»¥äžç®åœäž­çäžäžªæ æ³æŸå°ïŒ  
+exportcol.fail:exportcol.plå€±èŽ¥:  
+exportcol.no_valid_colls:æ æææå®çæ¶èå¯ä»¥èŸåºã  
+exportcol.couldnt_create_dir:æ æ³åå»ºç®åœïŒ
+s  
+exportcol.couldnt_create_file:æ æ³åå»ºïŒ
+s  
+exportcol.instructions:çæäžäžªèªæå®è£
+çWindows CD-ROMïŒå°è¯¥æä»¶å€¹ååºè³CD-ROMã  
+exportcol.non_exist_files:ä»¥äžå¿
+èŠçæä»¶åç®åœäž­çäžäžªäžå­åšïŒ  
+exportcol.success:exportcol.plè¿è¡æåïŒ  
+exportcol.output_dir:èŸåºçæ¶èåšïŒ
+s  
+exportcol.export_coll_not_installed:èŸåºè³CD-ROMçåèœæªè¢«å®è£
+ã  
+
+# -- import.pl --
+
+import.archivedir:èœ¬æ¢æä»¶çç®æ ç®åœã  
+
+import.manifest:äžäžªè¯Šç»æè¿°ä»ä¹æ ·çæä»¶å¯è¢«èŸå
+¥çXMLæä»¶ãçšäºæ¿ä»£åµå¥åŒåäžéåèŸå
+¥æä»¶å€¹æ¹åŒïŒéåžžçšäºéå¢åŒåå»ºã  
+
+import.cannot_open_stats_file:è­ŠåïŒæ æ³æåŒç»è®¡æä»¶ïŒ
+s  
+
+import.cannot_open_fail_log:éè¯¯ïŒæ æ³æåŒéè¯¯æ¥å¿ïŒ
+s  
+
+import.cannot_sort:è­ŠåïŒåœgroupsize>1æ¶import.plæ æ³æåææ¡£ãSortmetaéé¡¹å°è¢«å¿œç¥ã  
+
+import.collectdir:"collectâç®åœçè·¯åŸã  
+
+import.complete:èŸå
+¥å®æã  
+
+import.debug:æå°èŸå
+¥ææ¬è³STDOUTïŒçšäºGreenstoneXMLå¯Œå
+¥ïŒã  
+
+import.desc:PERLèæ¬ïŒçšäºå°æä»¶å¯Œå
+¥æå¯äŸåå»ºçæ ŒåŒïŒGreenstoneXMLæè
+GreenstoneMETSïŒã  
+
+import.faillog:å€±èŽ¥æ¥å¿æä»¶åãè¯¥æ¥å¿å­æä»»äœæ æ³è¢«å€ççæä»¶åã  
+
+import.groupsize:ç»ååšäžäžªXMLæä»¶äž­çææ¡£æ°éã  
+
+import.gzip:äœ¿çšgzipåçŒ©çæçxmlææ¡£ïŒåœä»åçŒ©ææ¡£æå»ºæ¶èæ¶äžèŠå¿è®°æZIPPluginæ·»å å°æä»¶åè¡šäž­ïŒã  
+
+import.importdir:åå§æä»¶å­æŸå€  
+
+import.incremental:ä»
+èŸå
+¥æ¯åœåå­æ¡£æä»¶æ°çææ¡£ïŒæ ¹æ®æ¶éŽæ è®°ïŒã  
+
+import.keepold:äžæž
+é€å­æ¡£ç®åœäžçåœåå
+å®¹ã  
+
+import.maxdocs:åŸ
+èŸå
+¥ææ¡£çæå€§åŒã  
+
+import.no_import_dir:éè¯¯ïŒæ æ³æŸå°èŸå
+¥ç®åœïŒïŒ
+sïŒã  
+
+import.no_plugins_loaded:éè¯¯ïŒæ æä»¶è¢«è°å
+¥ã  
+
+import.OIDtype:çšäºäžºæ¯äžäžªææ¡£çæç¬ç¹æ å¿ç¬Šçæ¹æ³ã  
+import.OIDtype.hash:åªåæä»¶çå
+å®¹ãæ¶èåšæ¯æ¬¡è¢«èŸå
+¥æ¶ææ¡£çæ å¿ç¬Šäžåã  
+
+import.OIDtype.incremental:äœ¿çšç®åææ¡£è®¡æ°ãæ¯"hash"å€§å€§å å¿«ïŒäœåæ ·çææ¡£å
+å®¹äŒæäžåçæ å¿ç¬ŠïŒäžéåçææ¡£æ æ³å å
+¥å°ç°æçå­æ¡£äž­ã  
+
+import.OIDtype.assigned:äœ¿çšç±OIDmetadataéé¡¹æç»åºçmetadataçåŒïŒå«æ'D'åçŒïŒïŒåŠææªæå®ïŒåäœ¿çšå
+·äœææ¡£çåªååŒãè¿äºæ å¿ç¬Šå¿
+é¡»æ¯ç¬ç¹çã  
+
+import.OIDtype.dirname:äœ¿çšç¶ç®åœåå­ïŒå«æ'J'åçŒïŒãâäžç®åœäžäžå¯¹åºïŒäžç®åœåå­äžéå€ãäŸåŠïŒimport/b13as/h15ef/page.htmlçæ å¿ç¬ŠåºäžºJh15efã  
+
+import.OIDmetadata:çšäºæå®ææææ¡£çç¬ç¹æ å¿ç¬Šçmetadataå
+çŽ ïŒäž-OLDtype=assignedåæ¶äœ¿çšã  
+
+import.saveas:å­æ¡£æä»¶çæ ŒåŒã  
+
+import.out:å­åšèŸåºç¶æçæä»¶åã  
+
+import.params:ãéé¡¹ãæ¶èçåç§°  
+
+import.removeold:æž
+é€å­æ¡£ç®åœäžçæ§å
+å®¹ã  
+
+import.removing_archives:æž
+é€å­æ¡£ç®åœäžçåœåå
+å®¹ã  
+
+import.removing_tmpdir:æž
+é€æ¶èç"tmp"ç®åœäžçå
+å®¹ã  
+
+import.reversesort:ååæåºïŒçš-sortmetaéé¡¹ã  
+
+import.site:éŠèç®åœæåšçç«ç¹ïŒå¯¹Greenstone3ïŒã  
+
+import.sortmeta:æå­æ¯é¡ºåºæ ¹æ®metadataå¯¹ææ¡£è¿è¡æåïŒçšäºåå»ºãåžå°æ¥è¯¢çæçŽ¢ç»ææè¯¥é¡ºåºæŸç€ºãåœgroupsize > 1æ¶æŸç€ºãä¹è®žæ¯äžäžªéå·åéçéïŒæå€äžªmetadataåŒæåºã  
+
+import.statsfile:å­åšèŸå
+¥ç»è®¡æ°æ®çæä»¶åã  
+
+import.stats_backup:æå°ç»è®¡æ°æ®è³STDERRã  
+
+import.verbosity:æ§å¶èŸåºçæ°éã0ïŒæ ïŒ3ïŒåŸå€  
+
+# -- schedule.pl --
+schedule.deleted:æ¬éŠèæå é€çéå»º  
+schedule.scheduled:äžºæ¬éŠèåå»ºçè¿è¡èæ¬  
+schedule.cron:æ¬éŠèæå®æçéå»º  
+schedule.params:[éé¡¹]  
+schedule.error.email:-emailèŠæ±è®Ÿçœ®-smtpã-toaddrå-fromaddr  
+schedule.error.importbuild:å¿
+é¡»è®Ÿçœ®-importå-build  
+schedule.error.colname:å¿
+é¡»çš-colnameæå®éŠèã  
+schedule.gli:ä»GLIäž­è¿è¡  
+schedule.frequency:èªåšéå»ºéŠèçé¢ç  
+schedule.frequency.hourly:æ¯å°æ¶éå»ºäžæ¬¡  
+schedule.frequency.daily:æ¯å€©éå»ºäžæ¬¡  
+schedule.frequency.weekly:æ¯åšéå»ºäžæ¬¡  
+schedule.action:åŠäœè®Ÿçœ®èªåšéå»º  
+schedule.action.add:å®æèªåšéå»ºçæ¶éŽè¡š  
+schedule.action.update:æŽæ°ç°æçæ¶éŽè¡š  
+schedule.action.delete:å é€ç°æçæ¶éŽè¡š  
+schedule.email:åéemailéç¥  
+schedule.schedule:è®Ÿçœ®èªåšéå»ºçæ¶éŽè¡š  
+schedule.colname:å®ææ¶å»è¡šçç®æ éŠèåç§°  
+schedule.import:å¯¹è¿äžªimportïŒå¯Œå
+¥ïŒåœä»€å®ææ¶å»è¡š  
+schedule.build:å¯¹è¿äžªbuildcolåœä»€å®ææ¶å»è¡š  
+schedule.toaddr:å°å®æ¶åå»ºçéç¥åéå°è¿äžªemailå°å  
+schedule.toaddr.default:åšæä»¶->åå¥œäž­è®Ÿçœ®çšæ·çemail  
+schedule.fromaddr:åéè
+emailå°å  
+schedule.fromaddr.default:åšmain.cfgäž­æå®éŠèçç»Žæ€è
+  
+schedule.smtp:åéemailçšå°çé®ä»¶æå¡åš  
+schedule.smtp.default:åšmain.cfgäž­æå®é®ä»¶æå¡åš  
+schedule.out:çšæ¥ä¿å­èŸåºç¶æçæä»¶åæå¯¹è±¡  
+# -- export.pl --
+
+export.exportdir:èŸåºæä»¶çç®æ ç®åœã  
+
+export.cannot_open_stats_file:è­ŠåïŒæ æ³æåŒç»è®¡æä»¶ïŒ
+s  
+
+export.cannot_open_fail_log:éè¯¯ïŒæ æ³æåŒéè¯¯æ¥å¿ïŒ
+s  
+
+export.cannot_sort:è­ŠåïŒåœgroupsize>1æ¶export.plæ æ³å¯¹ææ¡£æåºãSortmetaéé¡¹è¢«å¿œç¥ã  
+
+export.collectdir:âcollectâç®åœçè·¯åŸã  
+
+export.complete:èŸåºå®æ  
+
+export.debug:æå°èŸåºçææ¬è³STDOUTïŒçšäºGreenstoneXMLå¯ŒåºïŒ  
+
+export.desc:çšäºå°Greenstoneæ¶èäž­çæä»¶èŸåºæåŠäžç§æ ŒåŒçPERLèæ¬  
+
+export.faillog:éè¯¯æ¥å¿æä»¶åãè¯¥æ¥å¿å­åšæææ æ³è¢«å€ççæä»¶çåå­ãïŒåå®æ¡ä»¶äžïŒcollectdir/collname/etc/fail.log).  
+
+export.groupsize:ç»ååšäžäžªXMLæä»¶äž­çææ¡£æ°éã  
+
+export.gzip:çšgzipåçŒ©çæçxmlææ¡£ïŒåœä»åçŒ©ææ¡£æå»ºæ¶èæ¶äžèŠå¿è®°å°ZIPPlugæ·»å å°æä»¶åè¡šäž­ïŒã  
+
+export.importdir:åå§æä»¶å­æŸå€  
+
+export.keepold:äžæž
+é€èŸåºç®åœäžçåœåå
+å®¹ã  
+
+export.maxdocs:èŸåºææ¡£çæå€§æ°éã  
+
+export.listall:ååºææå­åšçæ ŒåŒ  
+
+export.saveas:èŸåºææ¡£çæ ŒåŒã  
+
+export.saveas.DSpace:DSpace Archiveæ ŒåŒã  
+
+export.saveas.GreenstoneMETS:METSæ ŒåŒïŒäœ¿çšGreenstoneæ ŒåŒã  
+export.saveas.FedoraMETS:METSæ ŒåŒïŒäœ¿çšFedoraæ ŒåŒã  
+
+export.saveas.GreenstoneXML:Greenstone XML å­æ¡£æ ŒåŒ  
+
+export.saveas.MARCXML:MARC XMLæ ŒåŒïŒäžäžªMARC 21çXMLçæ¬ïŒ  
+
+export.out:å­åšèŸåºç¶æçæä»¶åã  
+
+export.params:ãéé¡¹ãæ¶èå  
+
+export.removeold:å é€èŸåºç®åœäžçæ§ææ¡£ã  
+
+export.removing_export:å é€èŸåºç®åœäžçåœåææ¡£ã  
+
+export.sortmeta:æå­æ¯é¡ºåºæ ¹æ®metadataå¯¹ææ¡£è¿è¡æåïŒçšäºåå»ºãåœgroupsize>1æ¶è¯¥éé¡¹äŒè¢«çŠçšã  
+
+export.statsfile:å­åšèŸåºç»è®¡æ°æ®çæä»¶åã  
+
+export.stats_backup:æå°ç»è®¡æ°æ®è³STDERRã  
+
+export.verbosity:æ§å¶èŸåºçæ°éã0ïŒæ ïŒ3ïŒåŸå€  
+
+
+
+# -- mkcol.pl --
+
+mkcol.about:æ¶èçâå
+³äºâæè¿°ã  
+
+mkcol.bad_name_cvs:éè¯¯ïŒæ¶èäžå¯è¢«åœåäžºCVSïŒå äžºè¿å°äžCVSçæ¬ç³»ç»çæçç®åœçžå²çªã  
+
+mkcol.bad_name_svn:éè¯¯ïŒäžå¯å°éŠèåœåäžº.svnïŒå äžºè¿å¯èœäŒäžSVNçæ¬ç³»ç»åå»ºçç®åœå²çªã  
+
+mkcol.bad_name_modelcol:éè¯¯ïŒæ¶èäžå¯è¢«åœåäžºmodelcolïŒå äžºè¿æ¯èäŸæ¶èçåå­ã  
+
+mkcol.cannot_find_modelcol:éè¯¯ïŒæ æ³æŸå°èäŸæ¶èïŒ
+s  
+
+mkcol.col_already_exists:éè¯¯ïŒè¯¥æ¶èå·²ç»å­åšã  
+
+mkcol.collectdir:å­æŸæ°æ¶èçç®åœã  
+
+mkcol.group_not_valid_in_gs3:ç»éé¡¹åšGreenstone3æš¡åŒïŒ-gs3modeïŒäž­äžå¯çšã  
+mkcol.creating_col:çææ¶èïŒ
+s  
+
+mkcol.creator:æ¶èåå»ºè
+ççµå­é®ä»¶å°åã  
+
+mkcol.creator_undefined:éè¯¯ïŒåå»ºè
+æªè¢«å®ä¹ãè¯¥åéçšäºè¯å«éå€çæ¶èåå­ã  
+
+mkcol.desc:çšäºçææ°Greenstoneæ¶èçç®åœç»æçPERLèæ¬ã  
+
+mkcol.doing_replacements:äžºïŒ
+såæ¿æ¢  
+
+mkcol.group:åå»ºäžäžªæ°éŠèç»ïŒèäžæ¯äžäžªæ åéŠèã  
+
+mkcol.gs3mode:Greenstone 3éŠèæš¡åŒã  
+
+mkcol.long_colname:éè¯¯ïŒæ¶èåå­å¿
+é¡»å°äº8äžªå­æ¯ïŒä»¥äŸ¿äžæ©ææä»¶ç³»ç»çžå¹é
+ã  
+
+mkcol.maintainer:æ¶èç»Žæ€è
+ççµå­é®ä»¶å°åïŒåŠæäžåå»ºè
+äžåçè¯ïŒã  
+
+mkcol.no_collectdir:éè¯¯ïŒcollectç®åœäžå­åšïŒïŒ
+s  
+
+mkcol.no_collectdir_specified:éè¯¯ïŒæªç¥éŠèïŒcollectïŒç®åœïŒå¿
+é¡»è®Ÿçœ®-siteæ-collectdiréé¡¹äž­çäžäžªã  
+
+mkcol.no_colname:éè¯¯ïŒæªæå®æ¶èåç§°ã  
+
+mkcol.optionfile:ç±æä»¶åŸå°éé¡¹ïŒçšäºé¿çåœä»€è¡äŒå¯ŒèŽé®é¢çç³»ç»ã  
+
+mkcol.params:ãéé¡¹ãæ¶èåç§°  
+
+mkcol.plugin:æçšçperlæä»¶æš¡åïŒä¹è®žäŒæå€äžªæä»¶æ¡ç®ïŒã  
+
+mkcol.public:åŠæè¯¥æ¶èæå¿åè®¿é®ã  
+mkcol.public.true:æ¶èæ¯å
+¬åŒçã  
+mkcol.public.false:æ¶èæ¯ç§å¯çã  
+
+mkcol.quiet:ééçè¿è¡ã  
+
+mkcol.site:gs3modeïŒGreenstone3æš¡åŒïŒçšç«ç¹åäžGSDL3HOMEç¯å¢åéæ¥ç¡®å®éŠèç®åœïŒcollectdirïŒïŒé€éè®Ÿçœ®äº-collectdirã  
+
+mkcol.success:æ°æ¶èåšïŒ
+såå»ºæå  
+
+mkcol.title:æ¶èçæ é¢ã  
+
+mkcol.win31compat:æ¯åŠæææ¶èç®åœå¿
+é¡»äžWindows 3.1æä»¶æ ŒåŒçžç¬ŠïŒå³ïŒ8äžªå­æ¯é¿ïŒã  
+mkcol.win31compat.true:ç®åœåæé¿8äžªå­æ¯ã  
+mkcol.win31compat.false:ç®åœåå¯ä»»æé¿åºŠã  
+
+# -- pluginfo.pl --
+
+pluginfo.collection:äžºæ¶èåœåäŒä»€pluginfo.pléŠå
+åšcollect/collection-name/perllib/pluginsäž­æå¯»ãåŠæåšé£éæŸäžå°æä»¶ïŒåæå¯»perllib/pluginsç®åœã  
+
+pluginfo.desc:ååºæä»¶çä¿¡æ¯ã  
+
+pluginfo.general_options:éçšéé¡¹ä»æä»¶çç¶ç±»ç»§æ¿ã  
+
+pluginfo.info:ä¿¡æ¯  
+
+pluginfo.no_plugin_name:éè¯¯ïŒå¿
+é¡»æäŸæä»¶åç§°ã  
+
+pluginfo.option_types:æä»¶å¯æ¥åäž€ç§éé¡¹ã  
+
+pluginfo.params:ãéé¡¹ãæä»¶å  
+
+pluginfo.passing_options:å¯å°éé¡¹å
+æ¬åšcollect.cfgé
+çœ®æä»¶äž­ä»èäŒ éç»å
+¶ä»æä»¶ã  
+
+pluginfo.specific_options:å®ä¹åšæä»¶äž­çå
+·äœéé¡¹ïŒäžåªéçšäºè¯¥æä»¶ã  
+
+
+# -- plugoutinfo.pl --
+
+plugoutinfo.collection:äžºæ¶èåœåäŒä»€plugoutinfo.pléŠå
+åšcollect/collection-name/perllib/plugoutsäž­æå¯»ãåŠæåšé£éæŸäžå°æä»¶ïŒåæå¯»perllib/plugoutsç®åœã  
+
+plugoutinfo.desc:ååºplugoutçä¿¡æ¯ã  
+
+plugoutinfo.general_options:éçšéé¡¹ä»plugoutçç¶ç±»ç»§æ¿ã  
+
+plugoutinfo.info:ä¿¡æ¯  
+
+plugoutinfo.no_plugout_name:éè¯¯ïŒå¿
+é¡»æäŸplugoutçåå­ã  
+
+plugoutinfo.option_types:plugoutå¯æ¥åäž€ç§éé¡¹ã  
+
+plugoutinfo.params:ãéé¡¹ãplugoutå  
+
+plugoutinfo.passing_options:å¯å°éé¡¹å
+æ¬åšcollect.cfgé
+çœ®æä»¶äž­ä»èäŒ éç»å
+¶ä»plugoutã  
+
+plugoutinfo.specific_options:å®ä¹åšplugoutäž­çå
+·äœéé¡¹ïŒäžåªéçšäºè¯¥plugoutã  
+
+
+
+#
+# Classifier option descriptions
+#
+
+AllList.desc:åå»ºäžäžªå
+å«æææä»¶çéãçšäºoaiserverã  
+
+AZCompactList.allvalues:äœ¿çšæææŸå°ç metadata çåŒã  
+
+AZCompactList.desc:çšäºæå­æ¯é¡ºåºæåºçåç±»åšæä»¶(æa-zïŒA-ZïŒ0-9)ãéŠå
+çæäžäžªæ°Žå¹³ç A-Z åè¡šïŒç¶åçæäžäžªåçŽåè¡šïŒå
+¶äž­ååºäºææ¡£æç»ç»äºæçå
+±åå
+æ°æ®çææ¡£çä¹Šæ¶ã  
+
+AZCompactList.doclevel:å€çæä»¶æ¶æå€çæ°Žå¹³  
+AZCompactList.doclevel.top:æŽäžªæä»¶  
+AZCompactList.doclevel.section:æ ¹æ®æ®µèœ  
+
+AZCompactList.firstvalueonly:äœ¿çšæåç°çç¬¬äžäžª metadataç åŒ  
+
+AZCompactList.freqsort:æ ¹æ®èé¢çèéé¿å°å-æ°åŒè¿è¡æåã  
+
+AZCompactList.maxcompact:æ¯äžé¡µææŸç€ºçæä»¶çæå€æ°é  
+
+AZCompactList.metadata:äžäžªåäžå
+æ°æ®å­æ®µïŒæè
+äžäžªéç¹éŽéçå
+æ°æ®å­æ®µåè¡šïŒçšäºåå»ºåç±»åšãåŠææå®çæ¯å­æ®µåè¡šïŒååç±»åšå°äœ¿çšè¯¥åè¡šäž­ç¬¬äžäžªæåŒçå
+æ°æ®å­æ®µãå¯äž-firstvalueonlyå-allvaluesæ ç­Ÿè¿çšïŒæ¥éæ©åªäœ¿çšç¬¬äžäžªåŒïŒæè
+åè¡šäž­ææå
+æ°æ®å­æ®µçåŒã  
+
+AZCompactList.mincompact:æ¯äžé¡µææŸç€ºçæä»¶çæå€æ°é  
+
+AZCompactList.mingroup:äœ¿åŸåšå±çº§ç»æäž­åœ¢æäžäžªç»çæå°åŒ  
+
+AZCompactList.minnesting:çšäºå°äžäžªéèœ¬æ¢æäžäžªåµå¥éçæå°åŒ  
+
+AZCompactList.recopt:çšäºåµå¥çmetadataåŠïŒmetadata å¹Ž/ç»ç»  
+AZCompactList.sort:æåå¶èç¹çmetadataå  
+
+AZCompactSectionList.desc:çšäºåç±»æ®µèœèéæä»¶çAZCompactListåäœãæ¡ç®æ¯æç
+§æ®µèœçmetadataè¢«åç±»ç  
+
+AZList.desc:çšäºæå­æ¯é¡ºåºè¿è¡æåçåç±»åšæä»¶(æa-zïŒA-ZïŒ0-9)ãçæäžäžªæ°Žå¹³ç A-Zåè¡šïŒçžå
+³æä»¶ååšäžé¢ã  
+
+AZList.metadata:äžäžªåäžå
+æ°æ®å­æ®µïŒæè
+äžäžªéç¹éŽéçå
+æ°æ®å­æ®µåè¡šïŒçšäºåå»ºåç±»åšãæç
+§åè¡šäž­çé¡ºåºïŒåç±»åšäœ¿çšç¬¬äžäžªæåŒçå
+æ°æ®å­æ®µãææ¡£åè¡šå°æç
+§è¯¥å
+çŽ æåºã  
+
+AZSectionList.desc:çšäºåç±»æ®µèœèéæä»¶çAZListåäœãæ¡ç®æ¯æç
+§æ®µèœçmetadataè¢«åç±»ç  
+
+BasClas.bad_general_option:ïŒ
+såç±»åšäœ¿çšäºéè¯¯çéé¡¹ãæ¥çäœ çé
+çœ®æä»¶collect.cfg  
+
+BasClas.builddir:å°æå»ºçŽ¢åŒæŸåšäœå€  
+
+BasClas.buttonname:åç±»åšäžçæ ç­Ÿä»¥åå¯Œèªæ¡äžçæé®ãåå®åŒæ¯ç±-metadataéé¡¹æå®çmetadataå
+çŽ   
+
+BasClas.desc:éçšäºææåç±»åšçåºç±»  
+
+BasClas.no_metadata_formatting:äžèŠåä»»äœèªåšçmetadataæ ŒåŒåïŒåšæåºæ¶ïŒ  
+
+BasClas.outhandle:ååºæä»¶æ¶çèŸåºéé  
+
+BasClas.removeprefix:æåºæ¶metadataåŒäž­å¿œç¥çåçŒ  
+
+BasClas.removesuffix:æåºæ¶metadataåŒäž­å¿œç¥çåçŒ  
+
+BasClas.verbosity:æ§å¶èŸåºçæ°éã0ïŒæ ïŒ3ïŒåŸå€  
+
+Browse.desc:äžäžªåçä»
+åšå¯Œèªæ¡äžæäŸäžäžªéŸæ¥çåç±»åšïŒè¯¥éŸæ¥æåäžäžªæç»äºæµè§åæçŽ¢çé¡µé¢çåå§æš¡åãä»
+éçšäºmgppç±»å°åæ¶èã  
+
+DateList.bymonth:æå¹Žåæåç±»èäžæ¯åªæå¹Žã  
+
+DateList.desc:çšäºææ¥ææåºçåç±»åšæä»¶ãåå®æ¡ä»¶äžæâDate'metadataæåºãæ¥æåå®äžºyyyymmddæyyyy-mm-ddæ ŒåŒã  
+
+DateList.metadata:å«æçšæ¥åç±»çæ¥æçmetadataãæ¥ææ ŒåŒäžºyyyymmdd or yyyy-mm-ddãä¹å¯ä»¥æ¯éå·åéçéïŒåšè¿ç§æ
+åµäžäœ¿çšææŸå°çç¬¬äžäžªæ¥æã  
+
+DateList.reverse_sort:å°ææ¡£æå¹Žä»£é¡ºåºæåïŒææ°çåšåïŒã  
+
+DateList.nogroup:åšæ°Žå¹³éäž­å°æ¯äžå¹Žåäžºåç¬æ¡ç®ïŒèäžæ¯æå¹ŽåºéŽåäžºå äžªæ¡ç®ãïŒçš-bymonthéé¡¹ä¹å¯ä»€æ¯äžªæåæåç¬æ¡ç®ïŒã  
+
+DateList.no_special_formatting:äžèŠåšææ¡£éäž­æŸç€ºå¹Žåæçä¿¡æ¯ã  
+
+DateList.sort:çšäºåœäž€äžªææ¡£å«æçžåæ¥ææ¶æ¥è¿è¡æåºçé¢å€çmetadataã  
+
+HFileHierarchy.desc:åºäºäžäžªèŸ
+å©ç»ææä»¶çšäºçæå±çº§ç»æåç±»çåç±»åšæä»¶ã  
+
+Hierarchy.desc:çšäºçæå±çº§ç»æåç±»çåç±»åšæä»¶ãè¯¥æä»¶å¯åºäºç»ææ§metadataïŒæäœ¿çšäžäžªèŸ
+å©æ§ç»ææä»¶ïŒçš-hfileéé¡¹ïŒã  
+
+Hierarchy.documents_last:å°ææ¡£èç¹æŸç€ºåšåç±»åšèç¹ä¹åã  
+
+Hierarchy.hfile:äœ¿çšè®Ÿå®çåç±»ç»ææä»¶ã  
+
+Hierarchy.hlist_at_top:æ°Žå¹³å°æŸç€ºåç±»çç¬¬äžçº§ã  
+
+Hierarchy.reverse_sort:åé¡ºåºæåå¶èç¹ïŒçš-sort)ã  
+
+Hierarchy.separator:åœäœ¿çšç»ææ§metadataæ¶çšäºåçŠ»çè§åè¡šè¿°ã  
+
+Hierarchy.sort:çšäºæåå¶èç¹çmetadataåãåŠæè¯¥åæªè®Ÿå®åå¶èç¹äžäŒè¢«æåºã  
+
+Hierarchy.suppressfirstlevel:å¿œç¥metadataåŒçç¬¬äžéšåãè¿åœmetadataçç¬¬äžå
+çŽ æ¯éçšåŒæ¶æ¯èŸæçšïŒäŸåŠåšgsdlsourcefilenameäž­çèŸå
+¥ç®åœéšåã  
+
+Hierarchy.suppresslastlevel:å¿œç¥metadataåŒçæåäžéšåãè¿åœmetadataçæ¯äžªå
+çŽ éœäžåæ¶æ¯èŸæçšïŒäŸåŠæä»¶è·¯åŸã  
+
+HTML.desc:çæäžäžªç©ºçåç±»ïŒå³äžäžªå°çœé¡µçéŸæ¥ã  
+
+HTML.url:éŸæ¥å°çœé¡µçå°åã  
+
+List.bookshelf_type:æ§å¶äœæ¶å»ºç«ä¹Šæ¶ã  
+List.bookshelf_type.always:å³äœ¿å¶å­èç¹çæ¯äžªåç»éåªæäžäžªæ¡ç®ä¹äœ¿çšä¹Šæ¶åŸæ ã  
+List.bookshelf_type.never:å³äœ¿å¶å­èç¹çæ¯äžªåç»éæäžåªäžäžªæ¡ç®ïŒä¹äžäœ¿çšä¹Šæ¶åŸæ ã  
+List.bookshelf_type.duplicate_only:åœå¶å­èç¹çæ¯äžªåç»æäžåªäžäžªæ¡ç®æ¶ïŒäœ¿çšä¹Šæ¶åŸæ ã  
+
+List.classify_sections:å¯¹æ®µèœèäžæ¯ææ¡£è¿è¡åç±»ã
+
+List.desc:äžäžªéçšäžéåºæ§åŒºçéåç±»åšïŒå
+·æAZCompackListçå€§éšååèœïŒèŸå¥œçç»äžçŒç ïŒmetadataåæåºèœåã  
+
+List.level_partition.per_letter:äžºæ¯äžªå­æ¯åå»ºäžäžªååºã  
+List.level_partition.constant_size:æåºå®å€§å°åå»ºååºã  
+List.level_partition.per_letter_fixed_size:æå€§èŽåºå®çå€§å°äžºæ¯äžªå­æ¯åå»ºäžäžªååºã  
+
+List.metadata:çšäºåç±»çmetadataåãçšâ/'åçŠ»å±çº§ç»æäž­ççº§ïŒçš';'åçŠ»æ¯äžçº§çmetadataåã  
+
+List.partition_name_length:ååºåçé¿åºŠïŒåå®æ¡ä»¶äžæ¯1è³3äžªå­æ¯ïŒè¿èŠçåºåäžäžªååºçå€Žåå°ŸéèŠå€å°å­æ¯ãè¯¥éé¡¹åªæåœpartition_type_within_levelè®Ÿäžº'constant_size'æ¶æææã
+
+List.partition_size_within_level:æ¯äžªååºçå€§å°ïŒè¯¥éé¡¹åªæåœpartition_type_within_levelè®Ÿäžº'constant_size'æ¶æææïŒã
+
+List.partition_type_within_level:è¿è¡ååºçç±»åïŒâper_letter', 'constant_size', æ'none'ã
+
+List.sort_leaf_nodes_using:çšäºæåºå¶å­èç¹çå
+æ°æ®å­æ®µãçšâ|âæ¥åéçš³å®åç»çå
+æ°æ®ç»ïŒçšâ;âåéæ¯äžªç»éçå
+æ°æ®å­æ®µã  
+
+List.sort_using_unicode_collation:äœ¿çšUnicode Collationç®æ³æåºãéèŠäžèœœæä»¶http://www.unicode.org/Public/UCA/latest/allkeys.txtïŒå¹¶æŸå°perlçlib/Unicode/Collateæä»¶å€¹äž­ã  
+
+List.use_hlist_for:äœ¿çšæ°Žå¹³éèäžæ¯åçŽéçmetadataåãçš','åçŠ»metadataç»ïŒçšâ;'åçŠ»æ¯äžªç»çmetadataåã
+
+SimpleList.metadata:äžäžªåäžMetadataå, æäžäžªéç¹ååŒç Metadata åçéïŒçšäºåç±»ãæç
+§éçé¡ºåºïŒäœ¿çšç¬¬äžäžªå«æmetadataåŒçåãé€éäœ¿çšäº-sortéé¡¹ïŒéå°æç
+§è¯¥å
+çŽ æåºãåŠææªæå®metadataïŒææææ¡£å°è¢«å
+å«åšéäž­ïŒåŠååªæå«æmetadataåŒçææ¡£æäŒè¢«å
+æ¬è¿æ¥ã
+
+SimpleList.desc:ç®åéåç±»åšæä»¶ã
+
+SimpleList.sort:çšäºæåçmetadataåãçš'-sort nosort'åäžè¿è¡æåã
+
+Phind.desc:äº§çäžäžªææ¬äž­åç°çç­å¥çå±çº§ç»æïŒè¯¥ç»æå¯éè¿Javaå°çšåºæµè§ã  
+
+Phind.language:åå»ºå±çº§ç»æçè¯­èšãè¯­èšæ¯ç±äž€äžªå­æ¯çåœå®¶ç éŽå«çïŒäŸåŠ en (è±è¯­), es (è¥¿ç­çè¯­), å fr (æ³è¯­)ãè¯­èšæ¯äžäžªè§åè¡šè¿°ïŒå æ­€ 'en|fr' (è±è¯­ææ³è¯­) ä»¥å '..' (å¹é
+ä»»äœè¯­èš) éœææã  
+
+Phind.min_occurs:äžäžªç­å¥åºç°åšææ¬äž­çæå°æ¬¡æ°ïŒè¯¥ææ¬å°è¢«å
+æ¬åšç­å¥å±çº§ç»æäž­ã  
+
+Phind.savephrases:è®Ÿå®åïŒç­å¥ä¿¡æ¯äŒè¢«äœäžºææ¬å­åšåšç»å®çæä»¶äž­ãå»ºè®®äœ¿çšç»å¯¹è·¯åŸã  
+
+Phind.suffixmode:ç­å¥æåçšåºçsmodeåæ°ãåæ°åŒ0æå³çéçšè¯è¯­å°è¢«å¿œç¥ïŒåŒ1æå³çéçšè¯è¯­å°è¢«äœ¿çšã  
+
+Phind.text:è¯­èšåå»ºç­å¥å±çº§ç»æçææ¬ã  
+
+Phind.thesaurus:åšæ¶èçetcç®åœäž­å­åšçPhindæ ŒåŒçåç±»è¯æ±çŒçåå­ã  
+
+Phind.title:è¯­èšæè¿°æ¯äžªææ¡£çmetadataçåã  
+
+Phind.untidy:äžèŠå é€æ­£åšè¿è¡çæä»¶ã  
+
+RecentDocumentsList.desc:äžäžªå¯ååºæ°æ·»å çæä¿®æ¹çææ¡£çåç±»åšã  
+
+RecentDocumentsList.include_docs_added_since:ä»
+å
+æ¬åšæå®æ¥æïŒyyyymmddæyyyy-mm-ddæ ŒåŒïŒä»¥åä¿®æ¹ææ·»å çææ¡£ã  
+
+RecentDocumentsList.include_most_recently_added:ä»
+å
+æ¬æå®æ°éçïŒè¿ææ·»å çææ¡£ãä»
+åœinclude_docs_added_sinceä¿¡æ¯æªè®Ÿæ¶äœ¿çšã  
+
+RecentDocumentsList.sort:çšäºäžºéæåºçmetadataãåŠæªè®Ÿå®ïŒéå°æä¿®æ¹/æ·»å çæ¥ææåºã  
+
+SectionList.desc:äžéåç±»åšçžåäœå
+å«ææ¡£çæææ®µèœïŒäžå
+æ¬é¡¶çº§ïŒèäžæ¯ä»
+ä»
+é¡¶çº§ææ¡£èªå·±ã  
+
+Collage.desc:äžäžªJavaå°çšåºçšäºæŸç€ºæ¶èäž­æŸå°çæŒèŽŽåŸåã  
+
+Collage.geometry:æŒèŽŽç»åžçå°ºå¯žãæå®äžäžª600åçŽ å®œx400åçŽ é«çç»åžïŒåºè®Ÿäžº600x400ã  
+
+Collage.maxDepth:æŒèŽŽçåŸåæ¯ä»éåæçšæµè§åç±»åšæœåçãè¯¥éé¡¹æ§å¶éåè¿çšçæå€§æ·±åºŠã  
+
+Collage.maxDisplay:äžæ¬¡ææŸç€ºçåŸåçæå€§æ°éã  
+
+Collage.imageType:éè¿æå®æä»¶æ©å±åæ¥æ§å¶åªäºæä»¶äŒçšäºåŸåæ»æ±äž­ãæä»¶æ©å±åéçš(%%)è»å·åºåã  
+
+Collage.bgcolor:æŒèŽŽç»åžçèæ¯è²ïŒåå
+­è¿å¶ïŒäŸåŠïŒ008000æ£®æç»¿èæ¯ïŒã  
+
+Collage.buttonname:åç±»åšå±å¹æ ç­Ÿåå¯Œèªæ¡äžçæé®  
+
+Collage.refreshDelay:æŒèŽŽç»åžçæŽæ°çïŒä»¥åŸ®ç§è®¡ã  
+
+Collage.isJava2:çšäºæ§å¶åªäºJavaè¿è¡ç±»è¢«äœ¿çšãæŽé«çæ¬çJavaïŒåŠJava 1.2ä»¥äž)äžºæ§å¶åŸåçéæåºŠæäŸæŽå¥œçæ¯æïŒæ¬æ ç­Ÿçšäºæ§å¶è¿äžè®Ÿçœ®ïŒå³äœ¿äžäºæµè§åšçJavaè¿è¡çæ¬æ¯1.1ãè¯¥Javaå°çšåºåšçŒºçæ
+åµäžå°èªåšäŸŠæµæµè§åšçJavaçæ¬å¹¶éåçžåºæªæœã  
+
+Collage.imageMustNotHave:çšäºéèäžè¯¥åºç°çåŸåïŒåŠå¯Œèªæ¡äžçåŸåæé®ã  
+
+Collage.caption:æŸç€ºåšæŒèŽŽç»åžäžçéé¡¹æå­  
+
+
+#
+# Plugin option descriptions
+#
+AcronymExtractor.adding:æ·»å   
+
+AcronymExtractor.already_seen:å·²è§å°  
+
+AcronymExtractor.desc:æœåå°ç¹äžææ¬äž­çŒ©åè¯è¡šç€ºçæä»¶  
+
+AcronymExtractor.done_acronym_extract:å®ææåçŒ©åè¯  
+
+AcronymExtractor.done_acronym_markup:å®æçŒ©åè¯æ è®°  
+
+AcronymExtractor.extract_acronyms:ä»ææ¬äž­æåçŒ©åè¯å¹¶è®Ÿäžºmetadata  
+
+AcronymExtractor.extracting_acronyms:æåçŒ©åè¯  
+
+AcronymExtractor.marking_up_acronyms:æ è¯çŒ©åè¯  
+
+AcronymExtractor.markup_acronyms:åšææ¡£ææ¬äž­æ·»å çŒ©åè¯ã  
+
+ArchivesInfPlugin.desc:æ¬æä»¶å€çå¯Œå
+¥è¿çšçæçå­æ¡£æä»¶æ°æ®åºïŒarchives-docïŒãå®å°è¯¥æ°æ®åºäž­çæ¯äžªå­æ¡£ïŒarchiveïŒæä»¶éè¿ç®¡éæºå¶éäº€ç»GreenstoneXMLPluginå€çã  
+
+AutoExtractMetadata.desc:å°æœåæä»¶äž­æææœååèœèéå°äžèµ·çåºæ¬æä»¶  
+
+AutoExtractMetadata.extracting:æå  
+
+AutoExtractMetadata.first:ä»¥éå·éŽéçäžç»æ°å­ïŒæå®ä»ææ¬èµ·å§æåçå­ç¬ŠéïŒææååºçå
+å®¹ä¿å­å°äžç»åäžº'FirstN'çå
+æ°æ®å­æ®µäž­ïŒå
+¶äž­çNä»£è¡šæœåçå­ç¬Šæ°ãæ¯åŠïŒåŒâ3,5,7âå°æœåèµ·å§ç3ïŒ5å7äžªå­ç¬Šå¹¶åå«ä¿å­å°åäžºâFirst3âïŒâFirst5âåâFirst7âçå
+æ°æ®å­æ®µäž­ã  
+
+BaseMediaConverter.desc:æäŸåªäœèœ¬æ¢æä»¶æ¯åŠImageConverteråè§é¢èœ¬æ¢çåºæ¬åèœçæä»¶ã  
+
+BasePlugin.associate_ext:äœ¿æçåæ ·æ ¹æä»¶åçæä»¶  
+
+BasePlugin.associate_tail_re:å¹é
+æä»¶åçæ­£åè¡šèŸŸåŒïŒç­ééå±çæä»¶ãè¿äžªéé¡¹æ¿æ¢associate_extïŒäžæŽææã  
+
+BasePlugin.block_exp:äžè¯¥æ­£åè¡šèŸŸåŒå¹é
+çæä»¶äžäŒè¢«äŒ å°æä»¶éäž­ååšåé¢çæä»¶ã  
+
+BasePlugin.desc:éçšææèŸå
+¥æä»¶çåºç±»  
+
+BasePlugin.dummy_text:è¯¥ææ¡£æ å
+å®¹  
+
+BasePlugin.encoding.ascii:ç®æ7æ¯ç¹ASCIIãè¿ä¹è®žèŠæ¯çšiso_8895_1å¿«äºãåœææ¬å¯èœå«æç®æ7æ¯ç¹ASCIIå­ç¬Šéä¹å€çå­ç¬Šæ¶ïŒæ¯åŠæéé³ç¬Šå·çåŸ·æææ³æïŒïŒäœ¿çšiso_8859_1ã  
+
+BasePlugin.encoding.unicode:åªæ¯ç»äžçå­ç¬ŠçŒç æ å  
+
+BasePlugin.encoding.utf8:utf8åç»äžçå­ç¬ŠçŒç æ åäºè
+ä¹äž ïŒèªåšèŸšè¯ã  
+
+BasePlugin.filename_encoding:æºæä»¶åç§°ççŒç ã  
+
+BasePlugin.filename_encoding.auto:èªåšæ£æµæä»¶åççŒç ã  
+
+BasePlugin.filename_encoding.auto_language_analysis:åæå¹¶èªåšæ£æµæä»¶åçŒç ã  
+
+BasePlugin.filename_encoding.auto_filesystem_encoding:çšæä»¶ç³»ç»çŒç èªåšæ£æµæä»¶åçŒç ã  
+
+BasePlugin.filename_encoding.auto_fl:äœ¿çšæä»¶ç³»ç»çŒç ä»¥åè¯­ç§åææ¥æ£æµæä»¶åçŒç ã  
+
+BasePlugin.filename_encoding.auto_lf:äœ¿çšè¯­ç§åæä»¥åæä»¶ç³»ç»çŒç æ¥æ£æµæä»¶åçŒç ã  
+
+BasePlugin.no_blocking:äžè¿è¡ä»»äœæä»¶å±èœãä»»äœéåžŠçæä»¶ïŒæ¯åŠçœé¡µäž­çåŸçïŒå°è¢«ç¬ç«åŸæ·»å å°åœåæ¶èã  
+
+BasePlugin.no_cover_image:äžæ¥æŸprefix.jpgæä»¶ïŒprefixæåœåå€çäž­çæä»¶çåçŒïŒæ¥äœäžºå°é¢åŸåã  
+
+BasePlugin.OIDtype.auto:äœ¿çšimport.pläž­è®Ÿçœ®çOIDtype  
+
+BasePlugin.process_exp:äžäžªäžæä»¶åçžå¹é
+çperlè§åè¡šè¿°ãæä»¶åçå¹é
+å°ç±è¯¥æä»¶å€çãäŸåŠïŒçš'(?i).html?\$' å¹é
+ä»¥.htm or .htmlç»å°Ÿçææææ¡£(åºåå€§å°å)ã  
+
+BasePlugin.smart_block:äœ¿çšæ¯ä»
+ä»
+èèæä»¶åæŽå¥œçåæ³é»æ­¢æä»¶ã  
+
+BasePlugin.stems:è¯å¹²  
+
+BasePlugin.file_rename_method:éåœåå·²å¯Œå
+¥æä»¶åéå±æä»¶åç§°çæ¹æ³ã  
+
+BasePlugin.rename_method.url:äœ¿çšurlçŒç å¯¹å·²å¯Œå
+¥åéåžŠæä»¶éåœåã  
+
+BasePlugin.rename_method.base64:äœ¿çšbase64çŒç å¯¹å·²å¯Œå
+¥åéåžŠæä»¶éåœåã  
+
+BasePlugin.rename_method.none:äžå¯¹å·²å¯Œå
+¥åéåžŠæä»¶è¿è¡éåœåã  
+
+BibTexPlugin.desc:BibTexPluginè¯»å
+¥BibTexæ ŒåŒçä¹Šç®æèŠãBibTexPluginäžºæä»¶äž­çæ¯æ¡ä¹Šç®åå»ºäžäžªææ¡£å¯¹è±¡ãå®æ¯SplitTextFileçå­ç±»ïŒæä»¥åŠæå­åšå€æ¡è®°åœïŒåå
+šéšè¯»åã  
+
+BookPlugin.desc:ä»å«æ<<TOC>>å±çº§æ è®°çææ¡£äž­åå»ºå€çº§ææ¡£ãæ¯äžªæ®µèœçå
+æ°æ®åèªä»»äœäž<<TOC>>åšåäžè¡çå
+¶ä»æ è®°ãäŸåŠ<<Title>>xxxx<</Title>>å°è®Ÿå®é¢åå
+æ°æ®ã<<TOC>>æ è®°ç¬Šä¹éŽçææå
+¶ä»å
+å®¹è§äžºç®åhtmlïŒå³äžå€çhtmléŸæ¥æå
+¶ä»HTMLPluginç±»çå€çïŒã ææçèŸå
+¥æä»¶ççŒºçæä»¶æ©å±åäžº.hbïŒè¯¥éé¡¹å¯éè¿å å
+¥-process_expéé¡¹è¿è¡æŽæ¹ïŒãäžhbæä»¶ååç.jpgæä»¶å°è¢«äœäžºææ¡£çå°é¢åŸåïŒæ¬æä»¶å±èœjpgæä»¶ïŒãBookPluginæ¯Humanity LibraryéŠèçšå°çHBPluginçç®åïŒåæ©å±ïŒãBookPluginçå€çæ¯èŸå¿«å äžºå®ææææ¯èŸå¹²åçèŸå
+¥æä»¶ ïŒHDLéŠèçèŸå
+¥éšåå«æè®žå€åŽç»<<TOC>>æ ç­Ÿçhtmlæ ç­ŸïŒäœ¿çš<<I>>æ ç­Ÿæ¥æå®åŸå, äžçš<<TOC>>æ ç­Ÿäžææ¬èµ·å§å€ä¹éŽçå
+å®¹äœäžºæ é¢å
+æ°æ®ïŒãåŠæèŠä»€ææ¡£æŸç€ºæäžHDLéŠèäžæ ·çåœ¢åŒïŒåºäœ¿çšæ¬æä»¶èäžæ¯HBPluginã  
+
+CONTENTdmPlugin.desc:æ¬æä»¶å€çå¯ŒåºCONTENTdméŠèäž­çRDFæä»¶ã  
+
+ConvertBinaryFile.apply_fribidi:åšèœ¬æ¢çæä»¶äžè¿è¡âfribidiâç»äžçŒç ååç®æ³ïŒéçšäºå³è³å·Šææ¬ïŒã  
+
+ConvertBinaryFile.convert_to:èœ¬æ¢æTEXTæHTMLæå
+¶ä»ç§ç±»åŸåçæä»¶ïŒåŠJPEG,GIF,PNG)ã  
+
+ConvertBinaryFile.convert_to.auto:èªåšéæ©èŠèœ¬æ¢çæ ŒåŒãæéæ ŒåŒåå³äºèŸå
+¥ææ¡£çç±»åïŒæ¯åŠWordææ¡£äŒèœ¬æ¢æHTMLæ ŒåŒïŒèPowerPointææ¡£å°èœ¬æ¢æGreenstoneçPagedImageïŒåé¡µåŸçïŒæ ŒåŒã  
+
+ConvertBinaryFile.convert_to.html:HTMLæ ŒåŒã  
+
+ConvertBinaryFile.convert_to.text:ç®æææ¬æ ŒåŒã  
+
+ConvertBinaryFile.convert_to.pagedimg:äžç³»åçåŸçã  
+
+ConvertBinaryFile.convert_to.pagedimg_jpg:JPEGæ ŒåŒã  
+
+ConvertBinaryFile.convert_to.pagedimg_gif:GIFæ ŒåŒã  
+
+ConvertBinaryFile.convert_to.pagedimg_png:PNGæ ŒåŒã  
+
+ConvertBinaryFile.desc:è¯¥æä»¶ç±WordPluginãPowerPointPluginãPostScriptPluginãRTFPluginåPDFPluginç»§æ¿ãçšäºæè¿äºææ¡£ç±»åèœ¬æ¢æHTMLãTEXTæåŸåç³»åãå
+¶å·¥äœåçæ¯æ ¹æ®è¯¥æä»¶çâconvert_toâéé¡¹åšæè¯»åçžåºçäºçº§æä»¶ïŒHTMLPluginãStructuredHTMLPluginãPagedImagePluginæTextPluginïŒã  
+
+ConvertBinaryFile.keep_original_filename:ä¿çå
+³èæä»¶çåå§æä»¶åïŒèäžæ¯èœ¬æ¢ædoc.pdfïŒdoc.docç­ã  
+
+ConvertBinaryFile.use_strings:åŠæè®Ÿå®çè¯ïŒåœèœ¬æ¢æ æ³è¿è¡æ¶äžäžªç®åçå­ç¬Šäž²åœæ°äŒè¢«çšæ¥æåææ¬ã  
+
+ConvertToRogPlugin.desc:ç±RogPluginç»§æ¿æ¥çæä»¶ã  
+
+CSVPlugin.desc:çšäºéå·åéæ ŒåŒçåŒçæä»¶ãäŒäžºæä»¶çæ¯äžè¡åå»ºäžäžªæ°ææ¡£ã  
+
+DateExtractor.desc:èŸ
+å©æœåæä»¶ïŒçšæ¥æœåææ¬äž­çåå²æ¥æä¿¡æ¯ã  
+
+DateExtractor.extract_historical_years:ä»åå²ææ¡£äž­æåæå
+³æ¶éŽåºéŽçä¿¡æ¯ãè¯¥ä¿¡æ¯æ¯äœäžºææ¡£çmetadataå­åšçãæäžäžªçé¢å¯çšäºæçŽ¢è¯¥metadataãåšæ¶èé
+çœ®æä»¶äž­åå
+¥"format QueryInterface DateSearch"è¯­å¥å³å¯å°è¯¥çé¢å å
+¥çžå
+³æ¶èã  
+
+DateExtractor.maximum_century:æåæå€§çç»è¿åœåçäžçºªäœäžºåå²metadataïŒäŸåŠ14ïŒå³æåæªè³14äžçºªææçåèèµæïŒ  
+
+DateExtractor.maximum_year:çšäºmetadataçæå€§çåå²äžçæ¥æïŒä»¥åºç£æ¶ä»£äžºåïŒåŠ1950ïŒ  
+
+DateExtractor.no_bibliography:åœæååå²æ¥ææ¶ïŒäžèŠè¯åŸé»æ­¢ä¹Šç®æèŠæ¥æã  
+
+DirectoryPlugin.desc:RecPlugæä»¶å¯å€çå®åšåµå¥ç®åœäž­åç°çæ¯äžäžªæä»¶ã  
+
+DirectoryPlugin.recheck_directories:åœäžäžªèŸå
+¥ç®åœäž­çæææä»¶å€çå®æ¯åïŒéæ°è¯»åç®åœä»¥åç°ä»»äœæ°åå»ºçæä»¶ã  
+
+DirectoryPlugin.use_metadata_files:äžèµæäœ¿çšïŒè¯·æ·»å MetadataXMLPluginä»¥äŸ¿ä»å
+æ°æ®XMLæä»¶äž­è¯»åå
+æ°æ®ã  
+
+DatabasePlugin.desc:æ¬æä»¶ä»æ°æ®åºäž­å¯Œå
+¥è®°åœãæ¬æä»¶äœ¿çšperlçDBIæš¡åïŒå®å«æmysqlãpostgresqlãéå·åéåŒïŒCSVïŒãMS ExcelãODBCãsybaseç­ç­çåç«¯ãäœ¿çšæ¬æä»¶éèŠå®è£
+é¢å€çæš¡åãåè§<GSDLHOME>/etc/packages/example.dbiäž­çç€ºèé
+çœ®æä»¶ã  
+
+DSpacePlugin.desc:DSpacePlug æ¥åä»Dspaceäž­èŸåºçæ¶èå¹¶èŸå
+¥ç»Greenstoneã  
+	
+DSpacePlugin.first_inorder_ext:æ¬éé¡¹çšäºè¯å«äžäžªDspaceéŠèææ¡£çäž»ææ¡£ãè¥è®Ÿå®æ¬éé¡¹ïŒç³»ç»å°æé¡ºåºäœ¿çšæ¬éé¡¹äž­å®ä¹çæä»¶æ©å±ç±»åæ¥å¯»æŸäž»ææ¡£æä»¶ã  
+
+DSpacePlugin.first_inorder_mime:æ¬éé¡¹çšäºè¯å«äžäžªDspaceéŠèææ¡£çäž»ææ¡£ãè¥è®Ÿå®æ¬éé¡¹ïŒç³»ç»å°æé¡ºåºäœ¿çšæ¬éé¡¹äž­å®ä¹çmimeç±»åæ¥å¯»æŸäž»ææ¡£æä»¶ã  
+
+DSpacePlugin.only_first_doc:æ¬éé¡¹çšäºè¯å«äžäžªDspaceéŠèææ¡£çäž»ææ¡£ãè¥è®Ÿå®æ¬éé¡¹ïŒéœæææ žå¿å
+æ°æ®æä»¶äž­åŒçšçç¬¬äžäžªææ¡£å°è¢«äœäžºäž»ææ¡£æä»¶ã  
+
+EmailAddressExtractor.desc:èŸ
+å©æœåæä»¶ïŒçšæ¥æœåææ¬äž­çemailå°åã  
+
+EmailAddressExtractor.done_email_extract:å®ææåçµå­é®ä»¶å°å  
+
+EmailAddressExtractor.extracting_emails:æåçµå­é®ä»¶å°å  
+
+EmailAddressExtractor.extract_email:æåçµå­é®ä»¶å°åå¹¶äœäžºmetadata  
+
+EmailPlugin.desc:EmailPlugè¯»åçµå­é®ä»¶æä»¶ãè¿äºæä»¶äŒçšç®åæ°å­åœåïŒå³ïŒå®ä»¬åºç°åšmaildiræä»¶å€¹äž­ïŒæå
+·æ.mbxæä»¶æ©å±å (å¯¹äºmboxé®ä»¶æä»¶æ ŒåŒ)ãææ¡£ææ¬: ææ¡£äž­ç¬¬äžäžªç©ºçœè¡åé¢çææææ¬ãMetadata (éDublin Core!):$Headers ææçé¡µéŠå
+å®¹ïŒå¯éæ©çïŒåå®æ¡ä»¶äžäžå­åšïŒ:$Subject Subject: é¡µéŠ$To To: é¡µéŠ$From From: é¡µéŠ$FromName åéäººå§å (åŠææçè¯)$FromAddr åéäººçµé®å°å$DateText     Date: é¡µéŠ$Date æ¥æ: GSDLæ ŒåŒçé¡µéŠ (äŸåŠ: 19990924)  
+
+EmailPlugin.no_attachments:äžèŠå­åšä¿¡æ¯éä»¶ã  
+
+EmailPlugin.headers:å°çµå­é®ä»¶é¡µéŠå­åšäžºâHeadersâmetadataã  
+
+EmailPlugin.OIDtype.message_id:å°æ¶æ¯æ è¯çšäœææ¡£OIDãåŠææ²¡ææ¶æ¯æ è¯ïŒåçšååžOIDã  
+
+EmailPlugin.split_exp:çšäºå°å«æå€é¡¹ä¿¡æ¯çæä»¶åå²æç¬ç«ææ¡£çperlè§åè¡šè¿°ã  
+
+ExcelPlugin.desc:çšäºèŸå
+¥Microsoft Excelæä»¶çæä»¶ïŒ95å97çïŒã  
+
+FavouritesPlugin.desc:æ¬æä»¶å€çè±ç¹çœæµè§åšçæ¶èæä»¶ã  
+
+FOXPlugin.desc:æ¬æä»¶å€çFoxbase dbtæä»¶ãæ¬æä»¶åªæäŸè¯»ådbtådbfæä»¶åå€çè®°åœçåºæ¬åèœãå¯¹å€çå
+·äœæ°æ®åºäž­çå­æ®µïŒåéèŠåšè¿äžªéçšæä»¶çåºç¡äžè¿è¡å®å¶ã  
+
+GreenstoneXMLPlugin.desc:å€çGreenstone Archive XMLææ¡£ãæ³šæè¯¥æä»¶äžäœè¯­æ³æ£æ¥ïŒå°œç®¡XML:Parseræš¡åæµè¯æ ŒåŒçå®å¥œæ§ïŒãè¿éåå®Greenstone Archiveæä»¶ç¬Šåå
+¶DTDã  
+
+GISExtractor.desc:å
+·GISåèœçBasPlugçèŸ
+å©åºç±»  
+
+GISExtractor.extract_placenames:ä»ææ¬äž­æåå°ç¹åç§°å¹¶è®ŸäžºmetadataãèŠæ±æGreenstoneçGISæ©å±ã  
+
+GISExtractor.gazetteer:äœ¿çšGazetteerä»ææ¬äž­æåå°ç¹åç§°å¹¶è®ŸäžºmetadataãèŠæ±æGreenstoneçGISæ©å±ã  
+
+GISExtractor.place_list:åœæåå°ç¹æ¶ïŒå°å°ç¹åç§°éå
+æ¬åšææ¡£çèµ·å§å€ãèŠæ±æGreenstoneçGISæ©å±ã  
+
+HBPlugin.desc:æ¬æä»¶çšäºå€çHTMLä¹Šç®åœãæ¬æä»¶äž»èŠçšäºHumanity Development LibraryéŠèäžåªå€çASCIIåæ©å±ASCIIçŒç ãæ¬æä»¶çè¿è¡éåºŠæåŸå€§çæåç©ºéŽïŒæä»¬æŽåžæéŒå±çšæ·äœ¿çšBookPluginæ¥åå»ºä»ä»¬èªå·±çæ¶èã\n\nå°œéäœ¿çšBookPluginæ¥çææ°çæ¶èä»¥åå€çç±»äŒŒHumanity LibraryéŠèæä»¶çææ æ³šçæä»¶ãBookPluginæ¥åææèŸå
+¥çŒç äœèŠæ±æä»¶äž­çæ æ³šæ¯Humanity LibraryéŠèäž­çæŽæŽã  
+
+HBPlugin.encoding.iso_8859_1:æäž1ïŒè¥¿æ¹è¯­èšïŒ  
+
+HTMLImagePlugin.aggressiveness:å¯çšçææ¬æåèåŽã  
+HTMLImagePlugin.aggressiveness.1:ä»
+æä»¶åãè·¯åŸãæ¿æ¢ææ¬ïŒHTML img æ ç­ŸçALTå±æ§ïŒã  
+HTMLImagePlugin.aggressiveness.2:1äž­çå
+šéšïŒå äžå¯æœåçæ é¢ã  
+HTMLImagePlugin.aggressiveness.3:2äž­çå
+šéšïŒå äžå¯æœåçéè¿æ®µèœã  
+HTMLImagePlugin.aggressiveness.4:3äž­çå
+šéšïŒå äžå¯æœåçä»¥åçé¡µéŠïŒ<h1>,<h2>âŠ)ã  
+HTMLImagePlugin.aggressiveness.5:4äž­çå
+šéšïŒå äžå¯æœåçææ¬åèã  
+HTMLImagePlugin.aggressiveness.6:4äž­çå
+šéšïŒå äžHTMLé¡µé¢äž­çmetaæ ç­ŸïŒæ é¢ïŒå
+³é®è¯ç­ïŒã  
+HTMLImagePlugin.aggressiveness.7:4ïŒ5å6çç»åã  
+HTMLImagePlugin.aggressiveness.8:7äž­çå
+šéšïŒä»¥åéå€æä»¶åãè·¯åŸãæ¿æ¢ææ¬åæ é¢ïŒæ¥æåå
+¶åšçžå
+³ç»æäž­çæåºïŒã  
+HTMLImagePlugin.aggressiveness.9:1äž­çå
+šéšïŒå äžæºé¡µé¢çå
+šéšææ¬ã  
+
+HTMLImagePlugin.caption_length:æ é¢è¯Žæçæå€§é¿åºŠïŒä»¥å­æ¯è®¡ïŒã  
+
+HTMLImagePlugin.convert_params:çšäºImageMagicKç¥åŸåå»ºèœ¬æ¢çé¢å€åæ°ãäŸåŠïŒ'-raise'å°åšçŒ©ç¥åŸäžæ·»å äžç»Žææã  
+
+HTMLImagePlugin.desc:æ¬æä»¶çšäºä»çœé¡µæååŸååå
+³èææ¬ã  
+
+HTMLImagePlugin.document_text:æ·»å åŸåææ¬äœäžºdocument:textïŒåŠåäœäžºIndexedTextå
+æ°æ®å­æ®µïŒã  
+
+HTMLImagePlugin.index_pages:å°é¡µé¢äžåŸåäžèµ·çŒå
+¥çŽ¢åŒãåŠååšæºææ¡£çURLäž­åŒçšè¯¥é¡µé¢ã  
+
+HTMLImagePlugin.max_near_text:ä»åŸåéè¿æåçå­æ¯çæå€§æ°ç®ã  
+
+HTMLImagePlugin.min_height:ä»¥è±¡çŽ äžºåäœãç¥è¿å°äºè¯¥éé¡¹çåŸåã  
+
+HTMLImagePlugin.min_near_text:åšææ¬ææ é¢è¯Žæéè¿å
+è®žæåçæå°å­æ¯ã  
+
+HTMLImagePlugin.min_size:ä»¥å­èäžºåäœãç¥è¿å€§å°å°äºè¯¥éé¡¹çåŸåã  
+
+HTMLImagePlugin.min_width:ä»¥è±¡çŽ äžºåäœãç¥è¿çªäºè¯¥éé¡¹çåŸåã  
+
+HTMLImagePlugin.neartext_length:éè¿ææ¬çç®æ é¿åºŠïŒä»¥å­æ¯è®¡ïŒã  
+
+HTMLImagePlugin.no_cache_images:äžèŠçŒå­åŸåïŒæååå§åŸåçURLïŒã  
+
+HTMLImagePlugin.smallpage_threshold:é¡µé¢äžå°äºæå®å­èçåŸåäŒè¢«å å
+¥è¯¥é¡µé¢çå
+æ°æ®ïŒæ é¢ïŒå
+³é®è¯ç­ïŒã  
+
+HTMLImagePlugin.textrefs_threshold:ææ¬åŒçšççéåŒãèŸäœçåŒæå³çäžåŸäž¥æ Œçç®æ³ã  
+
+HTMLImagePlugin.thumb_size:æå€§çç¥åŸå°ºå¯žïŒå®œåé¿ã  
+
+HTMLPlugin.assoc_files:äžhtmlææ¡£çžå
+³èçæä»¶æ©å±åçperlè§åè¡šè¿°ã  
+
+HTMLPlugin.desc:è¯¥æä»¶å€çHTMLæä»¶ã  
+
+HTMLPlugin.description_tags:åš<Section>æ ç­Ÿåºç°çå°æ¹åå²ææ¡£ãåšè¯¥éé¡¹è®Ÿå®çæ
+åµäžïŒ'-keep_head'äžèµ·äœçšã  
+
+HTMLPlugin.extract_style:ä»HTML<head>æ ç­Ÿæåæ ŒåŒåèæ¬ä¿¡æ¯å¹¶å­åšæDocumentHeader metadataãè¿äŒåšææ¡£é¡µé¢äž­ä»¥_document:documentheader_ macroçåœ¢åŒè®Ÿå®ã  
+
+HTMLPlugin.file_is_url:åŠæèŸå
+¥æä»¶åæææºææ¡£çurlçäžéšååè®Ÿå®è¯¥åïŒäŸåŠåœäžäžªçœé¡µéåå·¥å
+·è¢«çšäºçæèŸå
+¥ç®åœç»ææ¶ã  
+
+HTMLPlugin.hunt_creator_metadata:å°œå¯èœåç°æŽå€çæå
+³äœè
+èº«ä»œçmetadataå¹¶å­æŸåš'Creator'åäž­ã  
+
+HTMLPlugin.keep_head:äžèŠä»htmlæä»¶äž­å»é€é¡µéŠã  
+
+HTMLPlugin.metadata_fields:è¯åŸæåçéå·åéçmetadataåçéãçš'tag<tagname>'åŸå°å­æŸåšåäžº'tagname'çmetadataå
+çŽ çç¬¬äžäžª<tagname>æ ç­Ÿç»çå
+å®¹ãå äžºæ ç­Ÿæåäžèèå€§å°åïŒé¡»å°è¯¥åè±¡å€§åGreenstoneäž­çmetadataäžæ ·å€§åæææã  
+
+HTMLPlugin.no_metadata:äžèŠè¯åŸä»æä»¶äž­æåä»»äœmetadataã  
+
+HTMLPlugin.no_strip_metadata_html:éå·åéçmetadataåç§°çéïŒæ'all'ãäž-description_tagsäžèµ·äœ¿çšïŒå®äŒé²æ­¢ä»è®Ÿå®çmetadataçåŒäž­å¥çŠ»HTMLæ ç­Ÿã  
+
+HTMLPlugin.nolinks:äžèŠè¯åŸéå¶éŸæ¥ïŒè®Ÿå®è¯¥æ è®°å¯æé«åå»º/èŸå
+¥çéåºŠäœäŒäœ¿ææ¡£äž­ççžå¯¹éŸæ¥å€±å»äœçšã  
+
+HTMLPlugin.no_image_links:äžå€çåŸçéŸæ¥ååŸçé¢è§  
+
+HTMLPlugin.rename_assoc_files:éåœåäžææ¡£çžå
+³èçæä»¶ïŒåŠåŸåïŒãåæ ·çææŽæµ
+çç®åœç»æïŒåœåå»ºcd-romæ¶èæ¶èŸæçšïŒã  
+
+HTMLPlugin.sectionalise_using_h_tags:çšh1,h2,âŠ,hXæ ç­Ÿèªåšçææ®µèœææ¡£ã  
+
+HTMLPlugin.title_sub:çšäºä¿®æ¹å­åšäžºæ é¢çå­ç¬Šäž²çæ¿æ¢è¡šèŸŸåŒãæ¯åŠPDFPluginçšå®ä»æ é¢ææ¬äž­æž
+é€âPage 1âç­ã  
+
+HTMLPlugin.tidy_html:è®Ÿå®åäŒå°HTMLææ¡£èœ¬æ¢äžºå¯¹ç§°çXHTMLãçšæ·ä»èå¯çšä¹Šæ¬æ ŒåŒæ¥çææ¡£ã  
+
+HTMLPlugin.old_style_HDL:æ æ³šæ¯åŠè¯¥æ¶èäž­çæä»¶çšæ§çHDLæ®µèœæ ŒåŒæ®µèœåã  
+
+BaseMediaConverter.enable_cache:èªåšçŒå­çæçæä»¶ïŒæ¯åŠçŒ©ç¥åŸåå±å¹å€§å°çåŸçïŒä»¥äŸ¿äžéèŠéå€çæè¿äºæä»¶ã  
+
+ImageConverter.converttotype:èœ¬æ¢äž»åŸåè³æ ŒåŒ's'ã  
+
+ImageConverter.create_screenview:è¥è®Ÿçœ®äžºçïŒååå»ºäžäžªå±å¹å€§å°çåŸçïŒå¹¶è®Ÿçœ®Screen, ScreenType, screenicon, ScreenWidth, ScreenHeightå
+æ°æ®ã  
+
+ImageConverter.create_thumbnail:è¥è®Ÿçœ®äžºçïŒåäžºæ¯äžªåŸçåå»ºäžäžªçŒ©ç¥åŸïŒå¹¶è®Ÿçœ®Thumb, ThumbType, thumbicon, ThumbWidth, ThumbHeightå
+æ°æ®ã  
+ImageConverter.desc:è¯¥æä»¶å€çåŸåïŒæ·»å åºæ¬çmetadataã  
+
+ImageConverter.imagemagicknotinstalled:Image Magickæ²¡æå®è£
+  
+
+ImageConverter.minimumsize:å¿œç¥å°äºnæ¯ç¹çåŸåã  
+
+ImageConverter.noconversionavailable:åŸçèœ¬æ¢åèœäžå¯çš  
+
+ImageConverter.noscaleup:çæç¥åŸæ¶äžèŠæŸå€§å°åŸåã  
+
+ImageConverter.screenviewsize:çæå€§å°äžºnxnçå±å¹åŸåã  
+
+ImageConverter.screenviewtype:çææ ŒåŒäžº's'çå±å¹åŸåã  
+
+ImageConverter.thumbnailsize:çæå€§å°äžºnxnçç¥åŸã  
+
+ImageConverter.thumbnailtype:çææ ŒåŒäžº's'çç¥åŸã  
+
+ImageConverter.win95notsupported:Win95/98äžæ¯æImage Magick  
+
+ImagePlugin.desc:è¯¥æä»¶å€çåŸåïŒæ·»å åºæ¬çmetadataã  
+
+IndexPlugin.desc:è¯¥åµå¥æä»¶å€çäžäžªindex.txtæä»¶ãè¯¥index.txtæä»¶åºå«æå°è¢«å
+æ¬åšæ¶èäž­çæä»¶éïŒçŽ§æ¥è¯¥éçæ¯äžæ¯äžªæä»¶çžå
+³èçé¢å€çmetadataãè¯¥index.txtæä»¶é¡»äžºä»¥äžæ ŒåŒïŒç¬¬äžè¡åºæ¯äžäžªå
+³é®è¯(ä»¥key:åŒå§ïŒïŒçšäºåœåmetadataåïŒäŸåŠïŒkey: Subject Organization Date)ãæ¥äžæ¥æ¯æä»¶åä»¥åäžºmetadataæ¡ç®æè®ŸçåŒïŒäŸåŠïŒåœäœ¿çšäžäŸçå
+³é®è¯è¡æ¶ïŒ'irma/iw097e 3.2 unesco 1993'å°æmetadata Subject=3.2, Organization=unesco, å Date=1993äžæä»¶irma/iw097eçžå
+³è)ãæ³šæåŠæä»»äœmetadataåäœ¿çšäºHierarchyåç±»åšæä»¶ïŒåæè®ŸåŒåºäžçžåºåç±»æä»¶äž­çç¬¬äžäžªåïŒæè¿°è
+ïŒçžå¯¹åºãMetadataçåŒå¯çšæ ç­Ÿåå«åœåïŒäŸåŠ <Subject>3.2)ïŒè¿å°èŠçææç±å
+³é®è¯è¡èµäºå®ä»¬çåå­ãåŠæå
+³é®è¯è¡äžå­åšïŒæææªåœåçmetadataåŒå°è¢«åœåæªâSubject'ã  
+
+ISISPlugin.desc:è¯¥æä»¶å€çCDS/ISISæ°æ®åºãå¯¹äºæ¯äžªè¢«å€ççCDS/ISISæ°æ®åºïŒæ¶èçèŸå
+¥æä»¶å€¹äž­å¿
+é¡»å«æä»¥äžäžäžªæä»¶ïŒäž»æä»¶ïŒ.mst),åå®ä¹è¡š (.fdt), ä»¥ååç
+§æä»¶ (.xrf)ã  
+
+ISISPlugin.subfield_separator:CDS/ISISæ°æ®åºè®°åœäž­çšäºåéå­åçå€äžªåŒçå­ç¬Šäž²ã  
+
+ISISPlugin.entry_separator:CDS/ISISæ°æ®åºè®°åœäž­çšäºåéåäžªmetadataåçå€äžªåŒçå­ç¬Šäž²ã  
+
+KeyphraseExtractor.desc:èŸ
+å©æœåæä»¶ïŒçšäºä»ææ¬äž­æœåå
+³é®è¯ç»ãäœ¿çšKeaå
+³é®è¯ç»æœåç³»ç»ã  
+
+KeyphraseExtractor.extract_keyphrases:äœ¿çšKeaèªåšæåå
+³é®è¯è¯­ïŒåå®è®Ÿçœ®ïŒ  
+
+KeyphraseExtractor.extract_keyphrases_kea4:äœ¿çšKea 4.0èªåšæåå
+³é®è¯è¯­ïŒåå®è®Ÿçœ®ïŒãKea 4.0æ¯Keaçæ°çæ¬ïŒçšäºæ§å¶çŒå¶åäžé¢åçææ¡£ã  
+
+KeyphraseExtractor.extract_keyphrase_options:çšäºå
+³é®è¯è¯­æåçKeaéé¡¹ãäŸåŠïŒmALIWEB - äœ¿çš ALIWEB æåæš¡åŒ; n5 - æå5äžªå
+³é®è¯è¯­;, eGBK - äœ¿çš GBK çŒç ã  
+
+KeyphraseExtractor.keyphrases:å
+³é®è¯è¯­  
+
+KeyphraseExtractor.missing_kea:éè¯¯ïŒïŒ
+säž­æ æ³æŸå°Keaèœ¯ä»¶ãè¯·ä»http://www.nzdl.org/KeaäžèœœKeaïŒ
+så¹¶å®è£
+å°è¯¥ç®åœäžã  
+
+LaTeXPlugin.desc:çšäºLaTexææ¡£çæä»¶ã  
+
+LOMPlugin.desc:çšäºèŸå
+¥LOMïŒLearning Object Metadata)çæä»¶ã  
+
+LOMPlugin.root_tag:XMLæä»¶çDocType(æäžäžªäžæ ¹å
+çŽ å¹é
+çè§åè¡šè¿°ïŒã  
+
+LOMPlugin.check_timestamp:æ¥çä»¥åäžèœœçæä»¶çæ¶éŽæ è®°ïŒäžä»
+åšæºæä»¶èŸæ°æ¶æéæ°äžèœœã  
+
+LOMPlugin.download_srcdocs:åŠæè®Ÿå®çè¯åäžèœœæºææ¡£ïŒéåžžæ å¿ç¬Šæ¡ç®æææ¯äœçœ®ïŒãè¯¥éé¡¹åºæå®äžäžªè§åè¡šè¿°æ¥å¹é
+æèŠäžèœœçæä»¶åãæ³šæïŒè¯¥åç®ååªå¯¹é²ç«å¢å€èŸ¹çææ¡£ææã  
+
+MARCPlugin.desc:åºæ¬çMARCæä»¶ã  
+
+MARCPlugin.metadata_mapping:æä»¶åïŒè¯¥æä»¶äž­æä»MARCåŒå°Greenstoneå
+æ°æ®åçæ å°ãçŒºçåŒæ¯åœåç«ç¹etcç®åœäžç'marc2dc.txt'æä»¶ã  
+
+MARCXMLPlugin.desc:MARCXMLæä»¶ã  
+
+MARCXMLPlugin.metadata_mapping_file:æä»¶åïŒè¯¥æä»¶äž­æä»MARCåŒå°Greenstoneå
+æ°æ®åçæ å°ãçŒºçåŒæ¯åœåç«ç¹etcç®åœäžç'marc2dc.txt'æä»¶ã  
+
+MediaWikiPlugin.desc:çšäºèŸå
+¥MediaWikiçœé¡µçæä»¶ã  
+
+MediaWikiPlugin.show_toc:æ·»å å°æ¶èçAbouté¡µïŒå³MediaWikiçœç«çäž»é¡µç'table of contents'ãé¡»åštoc_expä»¥äžæå®äžäžªPerlè§åè¡šè¿°ä»¥å¹é
+'table of contents'æ®µèœã  
+
+MediaWikiPlugin.delete_toc:å é€æ¯äžªHTMLé¡µç'table of contents'æ®µèœãé¡»åštoc_div_expä»¥äžæå®äžäžªPerlè§åè¡šè¿°ä»¥å¹é
+'table of contents'æ®µèœã  
+
+MediaWikiPlugin.toc_exp:çšäºå¹é
+'table of contents'çPerlè§åè¡šè¿°ãçŒºçåŒå°å¹é
+äžè¬çMediaWikiçœé¡µã  
+
+MediaWikiPlugin.delete_nav:å é€å¯Œèªæ®µèœãé¡»åšnav_div_expä»¥äžæå®äžäžªPerlè§åè¡šè¿°ã  
+
+MediaWikiPlugin.nav_div_exp:çšäºå¹é
+å¯Œèªæ®µèœçPerlè§åè¡šè¿°ãåå®åŒäžéçšMediaWikiçœé¡µçžå¹é
+ã  
+
+MediaWikiPlugin.delete_searchbox:å é€æçŽ¢æ¡æ®µèœãé¡»åšsearchbox_div_expä»¥äžæå®äžäžªPerlè§åè¡šè¿°ã  
+
+MediaWikiPlugin.searchbox_div_exp:çšäºå¹é
+æçŽ¢æ¡æ®µèœçPerlè§åè¡šè¿°ãåå®åŒäžéçšMediaWikiçœé¡µçžå¹é
+ã  
+
+MediaWikiPlugin.remove_title_suffix_exp:çšäºä¿®åªæåçæ é¢çPerlè§åè¡šè¿°ãäŸåŠïŒ\\s-(.+)å°ä¿®åª"-"ä¹åçæ é¢å
+å®¹ã  
+
+MetadataCSVPlugin.desc:çšäºå€çéå·åéçåŒçæ ŒåŒçmetadataçæä»¶ãCSVæä»¶äž­çæä»¶åéšåçšäºå³å®metadataå±äºåªäžªææ¡£ã  
+
+MetadataPass.desc:BasPluginçèŸ
+å©åºç±»ïŒæ¯æå
+æ°æ®æä»¶äœ¿çšimport.plçmetadata_readã  
+
+MetadataXMLPlugin.desc:æ¬æä»¶å€çmetadata.xmlæä»¶ã  
+
+MetadataEXIFPlugin.desc:æ¬æä»¶ä»åŸçãé³é¢åè§é¢äž­æœåEXIFå
+æ°æ®ãæŽå
+·äœçïŒè¿æ¯ä»¥CPANæš¡åâExifToolâäžºåºç¡ãè¿äžªæš¡åå®é
+äžä¹æ¯æå
+¶ä»æ ŒåŒïŒæ¯åŠGPSãXMPãFlashPixãID3ãVorbisïŒãæ¬æä»¶çç®æ æ¯æ¯æææExifToolæ¯æçæ ŒåŒãå
+³äºExifToolææ¯æçæä»¶ç±»ååå
+æ°æ®éè¯·åè§å
+¶ææ¡£ã  
+
+GreenstoneMETSPlugin.desc:å€çGreenstoneé£æ ŒçMETSææ¡£ã  
+
+MP3Plugin.desc:å€çMP3æä»¶çæä»¶ã  
+
+MP3Plugin.assoc_images:æ ¹æ®ID3 TitleåArtist metadataïŒäœ¿çšGoogleåŸåæçŽ¢æ¥å®äœäžMP3æä»¶çžå
+³çåŸåã  
+
+MP3Plugin.applet_metadata:çšäºå­åšæ¯äžªææ¡£çãappletãmetadataïŒææ¡£å«æå¿
+èŠçå¯ä»€MP3é³é¢æ­æŸåšå°çšåºæ­æŸè¯¥æä»¶çHTMLã  
+
+MP3Plugin.metadata_fields:ä»MP3æä»¶äž­æåéå·åéçmetadataåçéãäœ¿çš\â*\"æåææåã  
+
+NulPlugin.desc:èæïŒ.nul)æä»¶æä»¶ãäžæ¿åmetadataæ°æ®åºæä»¶æäº§ççæä»¶åæ¶äœ¿çšã  
+
+NulPlugin.assoc_field:äžºæ¯äžªæ ææä»¶è®Ÿå®çmetadataåçåå­ã  
+NulPlugin.add_metadata_as_text:æ·»å äžäžªmetadataè¡šæ Œçšäœææ¡£çææ¬ïŒå
+åŸæŸç€ºâThis document has no text"ã  
+
+NulPlugin.remove_namespace_for_text:ä»ææ¡£ææ¬äž­çmetadataåå­äž­å»é€åå­åºéŽïŒåŠæadd_metadata_as_textå·²è®Ÿå®ïŒã  
+
+OAIPlugin.desc:åºæ¬Open Archive Initiative(OAI)æä»¶ã  
+
+OAIPlugin.document_field:æ¬å
+æ°æ®çšäºæå®åœåå
+æ°æ®åºéå±çææ¡£åç§°  
+
+OAIPlugin.metadata_set:å¯Œå
+¥ææå
+æ°æ®å°è¿äžªå
+æ°æ®éïŒåœåååçŒïŒ  
+OAIPlugin.metadata_set.auto:äœ¿çšOAIè®°åœäž­æå®çåçŒ  
+OAIPlugin.metadata_set.dc:äœ¿çšdcåçŒãå°éå®æ§dcå
+çŽ æ å°å°å
+¶Greenstoneæ ŒåŒïŒæ¯åŠspatialå°è¢«æ å°ædc.Coverage^spatial.  
+
+OggVorbisPlugin.add_technical_metadata:æ·»å ææ¯ïŒäŸåŠæ¯ç¹çïŒmetadataã  
+
+OggVorbisPlugin.desc:çšäºèŸå
+¥Ogg Vorbis é³é¢æä»¶çæä»¶ã  
+
+OpenDocumentPlugin.desc:å€çOASIS OpenDocumentæ ŒåŒææ¡£çæä»¶ïŒçšäºOpenOffice 2.0)ã  
+
+PagedImagePlugin.desc:å€çç±äžè¿äž²åŸåç»æçææ¡£çæä»¶ïŒæ¯äžªåŸååžŠæå¯éçOCRææ¬ãè¯¥æä»¶å€ç.itemæä»¶ïŒè¯¥ç±»æä»¶ååºè¿ç»­åŸååææ¬æä»¶å¹¶æäŸmetadataã  
+
+PagedImagePlugin.documenttype:è®Ÿå®ææ¡£ç±»åïŒçšäºæŸç€ºïŒã  
+
+PagedImagePlugin.documenttype.paged:åé¡µçææ¡£å«æåååååçç®­å€Žä»¥å'go to page X' æ¡ã  
+
+PagedImagePlugin.documenttype.hierarchy:å±çº§ææ¡£å«ææç« ç®åœã  
+
+PagedImagePlugin.headerpage:äžºæ¯äžªææ¡£æ·»å äžäžªé¡¶çº§é¡µéŠé¡µïŒäžå«åŸåïŒã  
+
+PDFPlugin.allowimagesonly:å
+è®žPDFæä»¶äžå«å¯æåææ¬ãå
+åŸè®Ÿå®-complexéé¡¹ãä»
+çšäºconvert_to_htmlã  
+
+PDFPlugin.complex:çææŽå€æçèŸåºãè®Ÿå®è¯¥éé¡¹äŒäœ¿èŸåºçhtmlæŽè±¡åå§PDFæä»¶ãè¯¥éé¡¹èŠæ±å®è£
+GhostscriptïŒå¯¹äº*nixïŒgså¿
+é¡»äœäºç³»ç»è·¯åŸïŒå¯¹äºWindowsïŒgswin32c.exeè®Ÿå®åšç³»ç»è·¯åŸäž­ïŒã  
+
+PDFPlugin.desc:å€çPDFææ¡£çæä»¶ã  
+
+PDFPlugin.nohidden:é»æ­¢pdftohtmlæåéèææ¬ãè¿åªåš-complexéé¡¹ä¹è®Ÿå®çæ
+åµäžæçšã  
+
+PDFPlugin.noimages:äžèŠè¯åŸä»PDFäž­æååŸåã  
+
+PDFPlugin.use_sections:äžºæ¯äžªPDFæä»¶çé¡µé¢åå»ºäžäžªåç¬çæ®µèœã  
+
+PDFPlugin.zoom:èŸåºæ¶æŸå€§PDFæä»¶çç³»æ°ïŒè¿åªåš-complexéé¡¹ä¹è®Ÿå®çæ
+åµäžæçšïŒã  
+
+PostScriptPlugin.desc:è¿æ¯äžäžª\"poor man\"çpsè³ææ¬èœ¬æ¢åšãåŠæäœ æ³äœ¿çšé«çº§çåèœïŒå¯ä»¥èèPRESCRIPTå
+ïŒå¯ä»http://www.nzdl.org/html/software.htmläžèœœã  
+
+PostScriptPlugin.extract_date:ä»PSé¡µéŠæåæ¥æã  
+
+PostScriptPlugin.extract_pages:ä»PSé¡µéŠæåé¡µé¢ã  
+
+PostScriptPlugin.extract_title:ä»PSé¡µéŠæåæ é¢ã
+  
+
+PowerPointPlugin.desc:æ¬æä»¶çšäºå¯Œå
+¥Microsoft PowerPointæä»¶ã  
+
+PowerPointPlugin.windows_scripting:äœ¿çšMicrosoft Windows çèæ¬ææ¯ææ¯ïŒVisual BasicåºçšçšåºïŒæ¥å°PPTèœ¬æ¢æåç§æ ŒåŒçåŸåïŒäŸåŠJPEG,PNG,GIF)ïŒèäžäœ¿çšppttohtmlåŒæºå
+ã  
+
+PrintInfo.bad_general_option:ïŒ
+såç±»åšäœ¿çšäºéè¯¯çéé¡¹ãæ¥çäœ çé
+çœ®æä»¶collect.cfg  
+
+PrintInfo.desc:æåºæ¬æä»¶ïŒå€çæå°ä¿¡æ¯ïŒäœ¿çšpluginfo.plïŒä»¥åè§£æåæ°ã  
+
+ProCitePlugin.desc:çšäºProCiteæ°æ®åºïŒèŸåºçïŒçæä»¶ã  
+
+ProCitePlugin.entry_separator:çšæ¥åéProCiteæ°æ®åºè®°åœäž­åäžªå
+æ°æ®å­æ®µçå€äžªåŒçå­ç¬Šäž²ã  
+
+ReadTextFile.could_not_extract_encoding:è­ŠåïŒæ æ³ä»ïŒ
+säž­æåçŒç ïŒåå®åŒïŒ
+s  
+
+ReadTextFile.could_not_extract_language:è­ŠåïŒæ æ³ä»ïŒ
+säž­æåè¯­èšïŒåå®åŒïŒ
+s  
+
+ReadTextFile.could_not_open_for_reading:æ æ³æåŒïŒ
+sè¿è¡è¯»å  
+
+ReadTextFile.default_encoding:åŠæ-input_encodingéé¡¹è®Ÿäžºâautoâäžææ¬åç±»ç®æ³äžèœçŒç ææåäºäžè¢«Greenstoneæ¯æççŒç ïŒåäœ¿çšè¯¥çŒç ãè¯¥éé¡¹å¯éçšäž-input_encodingéé¡¹çžåçåŒã  
+
+ReadTextFile.default_language:åŠæGreenstoneæ æ³ç¡®è®€æäžªææ¬çè¯­èšïŒ'Language'metadataè®Ÿäžºè¯¥åŒãå
+¶åå®åŒæ¯'en' (äœ¿çšISO 639: en = English)ãè¯·æ³šæïŒåŠæ-input_encodingéé¡¹æªè®Ÿæâautoâäžæªè®Ÿ-extract_languageéé¡¹ïŒåææææ¬çâlanguage'metadataçè®Ÿäžºè¯¥åŒã  
+
+ReadTextFile.desc:çšäºå€ççº¯ææ¬æä»¶çåºæ¬æä»¶ã  
+
+ReadTextFile.empty_file:è¯¥æä»¶æ å
+å®¹  
+
+ReadTextFile.extract_language:éŽå«æ¯äžªææ¡£çè¯­èšå¹¶è®Ÿå®âLanguage'metadataãæ³šæïŒåŠæ -input_encodingè®Ÿäžºâauto'ïŒè¯¥è¿çšäŒèªåšå®æã  
+
+ReadTextFile.file_has_no_text:éè¯¯ïŒïŒ
+säžå«ææ¬  
+
+ReadTextFile.input_encoding:æºææ¡£ççŒç ãææ¡£å°çšè¿äºçŒç è¿è¡èœ¬æ¢å¹¶åšå
+éšå­åšäžºutf8ã  
+
+ReadTextFile.input_encoding.auto:äœ¿çšææ¬åç±»ç®æ³èªåšéŽå«æ¯äžªæºææ¡£ççŒç ãè¿èŠæ¯æç¡®è®Ÿå®çŒç æ
+¢ïŒäœéçšäºåäžæ¶èè®Ÿå®äºå€äžªçŒç ã  
+
+ReadTextFile.read_denied:å¯¹äºïŒ
+sè¯»åæéè¢«æç»ã  
+
+ReadTextFile.separate_cjk:åšäž­æ/æ¥æ/é©æäž­æå
+¥ç©ºæ Œä»€æ¯äžªå­æ¯æäžºäžäžªè¯ãéçšäºåœææ¬æªè¢«åå²æ¶ã  
+
+ReadTextFile.unsupported_encoding:è­ŠåïŒïŒ
+säŒŒä¹äœ¿çšäºäžè¢«æ¯æççŒç ïŒïŒ
+sïŒïŒäœ¿çšïŒ
+s  
+
+ReadTextFile.wrong_encoding:è­ŠåïŒïŒ
+sçšïŒ
+sè¯»å
+¥äœäŒŒä¹äœäžºïŒ
+sçŒç   
+
+ReadXMLFile.desc:çšäºXMLæä»¶çåºç±»ã  
+
+ReadXMLFile.xslt:çšæå®æä»¶äž­çXSLTèœ¬æ¢å¹é
+çèŸå
+¥ææ¡£ãåå®äžäžªçžå¯¹çæä»¶åäŒåšæ¶èçæä»¶åºåæŸå°ïŒäŸåŠïŒetc/mods2dc.xslã  
+
+RealMediaPlugin.desc:å€çReal Mediaæä»¶çæä»¶ã  
+
+ReferPlugin.desc:ReferPluginè¯»å
+¥Referæ ŒåŒçç®åœæç®æä»¶  
+
+RogPlugin.desc:ä».rogæ.mdbæä»¶åå»ºç®ååçº§ææ¡£ã  
+
+RTFPlugin.desc:çšäºèŸå
+¥Rich Text æ ŒåŒçæä»¶ã  
+
+SourceCodePlugin.desc:æä»¶åç®åè¢«çšäºæ é¢ïŒå¯éæ©åå»äžäºåçŒïŒãåœåè¯­èš:\nææ¬ïŒREADMEs/Makefiles\nC/C++   (ç®åä»
+æåå
+å«è¯­å¥ä»¥åC++ ç±»)\nPerl    (ç®åä»
+å€çææ¬)\nShell   (ç®åä»
+å€çææ¬)  
+
+SourceCodePlugin.remove_prefix:ä»æä»¶åäž­å é€åçŒïŒäŸåŠ-remove_prefix /tmp/XX/src/)ãåå®æ¡ä»¶äžæ¯ä»æä»¶åäž­å é€å
+šéšè·¯åŸã  
+
+SplitTextFile.desc:SplitTextFileæ¯äžäžªå°èŸå
+¥æä»¶åå²æè¥å¹²éšåçæä»¶ïŒæ¯äžªéšåéœå°è¢«åç¬å€çãæ¬æä»¶äžåºè¯¥è¢«çŽæ¥è°çšãçžåïŒåŠæäœ éèŠå€çå«æå€äžªææ¡£çæä»¶ïŒåºè¯¥çŒåèªå·±çæä»¶ïŒå
+¶äž­çå€çïŒprocessïŒåœæ°å°å€çåäžªææ¡£ïŒå¹¶äœ¿å
+¶ç»§æ¿SplitTextFileãåè§ReferPluginïŒäœäžºäžäžªèäŸã  
+
+SplitTextFile.split_exp:å°èŸå
+¥æä»¶åå²ææ®µçperlè§åè¡šè¿°ã  
+
+StructuredHTMLPlugin.desc:äžäžªå€çç»ææ§HTMLææ¡£çæä»¶ïŒåºäºæ ŒåŒä¿¡æ¯å°å®ä»¬åå²ææ®µèœã  
+
+StructuredHTMLPlugin.delete_toc:ä»èœ¬æ¢çHTMLæä»¶äž­å é€æææç« ç®åœïŒåŸè¡šç­ãå
+¶æ ŒåŒç±toc_headeréé¡¹æå®ã  
+
+StructuredHTMLPlugin.title_header:çšäºæ é¢é¡µéŠçå¯èœççšæ·å®ä¹çæ ŒåŒã  
+
+StructuredHTMLPlugin.level1_header:çšäºHTMLææ¡£äž­ç¬¬äžçº§é¡µéŠçå¯èœççšæ·å®ä¹çæ ŒåŒïŒçžåœäº<h1>)ã  
+
+StructuredHTMLPlugin.level2_header:çšäºHTMLææ¡£äž­ç¬¬äºçº§é¡µéŠçå¯èœççšæ·å®ä¹çæ ŒåŒïŒçžåœäº<h2>)ã  
+
+StructuredHTMLPlugin.level3_header:çšäºHTMLææ¡£äž­ç¬¬äžçº§é¡µéŠçå¯èœççšæ·å®ä¹çæ ŒåŒïŒçžåœäº<h3>)ã  
+
+StructuredHTMLPlugin.toc_header:çšäºæç« ç®åœïŒåŸè¡šç­çå¯èœççšæ·å®ä¹çæ ŒåŒïŒåŠædelete_tocè®Ÿå®ïŒåå é€ã  
+
+TextPlugin.desc:åå»ºç®ååçº§ææ¡£ãçšç¬¬äžè¡ææ¬äœäžºæ é¢metadataïŒäžè¶
+è¿100äžªå­æ¯ïŒã  
+
+TextPlugin.title_sub:çšäºä¿®æ¹å­åšäžºæ é¢çå­ç¬Šäž²çæ¿æ¢è¡šèŸŸåŒãæ¯åŠPostScriptPluginçšå®ä»æ é¢ææ¬äž­æž
+é€âPage 1âç­ã  
+
+UnknownPlugin.assoc_field:ææå
+³èæä»¶åçmetadataåçåç§°ã  
+
+UnknownPlugin.desc:è¿æ¯äžäžªç®åççšäºèŸå
+¥Greenstoneæ æ³è¯å«æ ŒåŒçæä»¶çæä»¶ãå°äžºæ¯äžªæä»¶äº§çäžäžªèæçææ¡£ïŒäžè¯¥æä»¶æ¬èº«äŒè¢«äœäžºææ¡£ç\"å
+³èæä»¶\"äŒ éç»Greenstoneã  
+
+UnknownPlugin.file_format:æä»¶ç±»åïŒäŸåŠMPEG,MIDI,âŠ)ã  
+
+UnknownPlugin.mime_type:æä»¶çMimeç±»åïŒäŸåŠïŒåŸå/gifïŒã  
+
+UnknownPlugin.process_extension:çšè¯¥æä»¶æ©å±å€çæä»¶ãè¯¥éé¡¹æ¯process_expçæ¿ä»£éé¡¹ïŒprocess_expæŽç®åäœéåºæ§äžåŒºã  
+
+UnknownPlugin.srcicon:æå®äžäžªäœäžºsrcicon metadataçå®çåç§°ïŒäžå äžåçº¿ïŒã  
+
+WordPlugin.desc:çšäºèŸå
+¥Microsoft Wordææ¡£çæä»¶ã  
+
+WordPlugin.windows_scripting:äœ¿çšMicrosoft Windows èæ¬ææ¯ïŒVisual BasicåºçšçšåºïŒæ¥åŸå°Wordä»èæææ¡£èœ¬æ¢æHTMLïŒèäžæ¯äŸèµäºåŒæºå
+WvWareãåŠWordåºçšçšåºæªåšè¿è¡ïŒå®å¯ä»€å
+¶èªåšæåŒã  
+
+WordPlugin.metadata_fields:è¯¥éé¡¹ä»çšVBèæ¬èœ¬æ¢æ¥çHTMLææ¡£äž­è·åmetadataãå®å
+è®žçšæ·å®ä¹è¯åŸæåçéå·åéçmetadataåçéãçš'tag<tagname>'åŸå°å­æŸåšåäžº'tagname'çmetadataå
+çŽ çç¬¬äžäžª<tagname>æ ç­Ÿç»çå
+å®¹ãå äžºæ ç­Ÿæåäžèèå€§å°åïŒé¡»å°è¯¥åè±¡å€§åGreenstoneäž­çmetadataäžæ ·å€§åæææã  
+
+ZIPPlugin.desc:å€çåçŒ©çå/æå­æ¡£çèŸå
+¥æ ŒåŒãç®åå€ççæ ŒåŒåæä»¶æ©å±åæïŒ\ngzip (.gz, .z, .tgz, .taz)\nbzip (.bz)\nbzip2 (.bz2)\nzip (.zip .jar)\ntar (.tar)ã\n\nè¯¥æä»¶èŠæ±ä»¥äžçåºçšçšåº (åŠæèŠå€ççžå¯¹åºçæ ŒåŒçè¯ïŒïŒ\ngunzip (for gzip)\nbunzip (for bzip)\nbunzip2 \nunzip (for zip)\ntar (çšäº taræä»¶)ã
+
+#
+# Download module option descriptions
+#
+
+BaseDownload.desc:Downloadæš¡åçåºç±»  
+BaseDownload.bad_general_option:%säžèœœæš¡åäœ¿çšäºäžæ°åœçéé¡¹ã  
+MediaWikiDownload.desc:çšäºä»MediaWikiçœç«äžèœœçæš¡åã  
+MediaWikiDownload.reject_filetype:å¿œç¥éå·åéçurléïŒäŸåŠ*cgi-bin*,*.pptå°å¿œç¥å«æ'cgi-bin'æ'.ppt'çéŸæ¥ã  
+MediaWikiDownload.reject_filetype_disp:å¿œç¥è¿äºURLæš¡åŒ  
+MediaWikiDownload.exclude_directories:æ¬²æé€ç®åœçéïŒå¿
+é¡»æ¯å°ç®åœçç»å¯¹è·¯åŸïŒïŒäŸåŠ /people,/documentationå°æé€åœåè åšç«ç¹äžç'people'å'documentation'å­ç®åœã  
+MediaWikiDownload.exclude_directories_disp:æé€è¿äºç®åœ  
+
+OAIDownload.desc:çšäºä»OAIç¥è¯åºäž­äžèœœçæš¡åã  
+OAIDownload.url_disp:æºURL  
+OAIDownload.url:OAIç¥è¯åºURL  
+OAIDownload.set_disp:éå¶äºè¿äžªéå  
+OAIDownload.set:ä»
+äžèœœç¥è¯åºäž­æå®çåå
+ã  
+OAIDownload.metadata_prefix_disp:å
+æ°æ®åçŒ  
+OAIDownload.metadata_prefix:å¯Œåºææ¡£äž­äœ¿çšçå
+æ°æ®æ ŒåŒïŒæ¯åŠoai_deãqdcç­ç­ãç¹å»<æå¡åšä¿¡æ¯>æé®æ¥çææ¯æçæ ŒåŒã  
+OAIDownload.get_doc_disp:è·åææ¡£ã  
+OAIDownload.get_doc:åŠææºæä»¶å·²åšè®°åœäž­æå®ïŒäžèœœå®ã  
+OAIDownload.get_doc_exts_disp:åªå
+æ¬è¿äºæä»¶ç±»å  
+OAIDownload.get_doc_exts:å
+è®žè®¿é®çæä»¶æ©å±åã  
+OAIDownload.max_records_disp:èŠäžèœœçè®°åœçæå€§æ°éã  
+OAIDownload.max_records:èŠäžèœœçè®°åœçæå€§æ°éã  
+
+SRWDownload.desc:äžäžªçšäºä»SRWïŒæçŽ¢/è·åçœç»æå¡ïŒç¥è¯åºäžèœœçæš¡åã  
+
+WebDownload.desc:å¯çšHTTPæFTPä»Internetè¿è¡äžèœœçæš¡åã  
+WebDownload.url:æºURLãå¯¹äºhttpéå®åèèšïŒè¿äžªåŒå¯èœäŒææ¹å  
+WebDownload.url_disp:æºURL  
+WebDownload.depth:äžèœœæ¶è¶
+éŸæ¥çæææ·±åºŠã  
+WebDownload.depth_disp:äžèœœæ·±åºŠã  
+WebDownload.below:ä»
+å¯¹è¯¥URLäžçæä»¶å»ºç«éåã  
+WebDownload.below_disp:ä»
+äžèœœè¯¥URLäžçæä»¶  
+WebDownload.within:ä»
+å¯¹åäžç«ç¹çæä»¶è¿è¡éåã  
+WebDownload.within_disp:ä»
+äžèœœç«ç¹å
+çæä»¶
+WebDownload.html_only:ä»
+äžèœœHTMLæä»¶ïŒå¹¶å¿œç¥å
+³èæä»¶ïŒäŸåŠåŸåååŒæ ·åŸè¡šã  
+WebDownload.html_only_disp:ä»
+äžèœœHTMLæä»¶  
+
+WgetDownload.desc:å€çwgetè°å
+¥çåºç±»ã  
+WgetDownload.proxy_on:ä»£çæå¡åšæ­£åšè¿è¡  
+WgetDownload.proxy_host:ä»£çäž»æºã  
+WgetDownload.proxy_port:ä»£çç«¯å£  
+WgetDownload.user_name:çšæ·å  
+WgetDownload.user_password:çšæ·å¯ç   
+
+Z3950Download.desc:çšäºä»Z3950ç¥è¯åºäžèœœçæš¡åã  
+Z3950Download.host:äž»æºURL  
+Z3950Download.host_disp:äž»æº  
+Z3950Download.port:ç¥è¯åºçç«¯å£åŒ  
+Z3950Download.port_disp:ç«¯å£  
+Z3950Download.database:åšå
+¶äž­æçŽ¢è®°åœçæ°æ®åºã  
+Z3950Download.database_disp:æ°æ®åº  
+Z3950Download.find:è·åå«ææå®æçŽ¢è¯çè®°åœã  
+Z3950Download.find_disp:åç°  
+Z3950Download.max_records:äžèœœçè®°åœçæå€æ°éã  
+Z3950Download.max_records_disp:æå€è®°åœ  
+
+
+#
+#Plugout option descriptions
+#
+
+BasPlugout.bad_general_option:ïŒ
+s plugoutäœ¿çšäºéè¯¯çéé¡¹ã  
+BasPlugout.debug:è®Ÿçœ®è°è¯æš¡åŒ  
+BasPlugout.desc:éçšäºææå¯Œåºplugoutçåºç±»ã  
+BasPlugout.group_size:äžäžªXMLæä»¶äž­åºå
+å«çææ¡£æ°éã  
+BasPlugout.gzip_output:äœ¿çšgzipæ¥åçŒ©çæçxmlææ¡£ïŒåœä»åçŒ©ææ¡£æå»ºæ¶èæ¶äžèŠå¿è®°å°ZIPPlugæ·»å å°æä»¶åè¡šäž­ïŒã  
+BasPlugout.output_handle:çšäºåéèŸåºä¿¡æ¯çæä»¶æè¿°åš  
+BasPlugout.output_info:arcinfoå¯¹è±¡çåŒçšïŒè¯¥arcinfoå¯¹è±¡çšäºå­åšè·å­æ¡£æä»¶çžå
+³çä¿¡æ¯ã  
+BasPlugout.verbosity:æ§å¶èŸåºä¿¡æ¯çæ°éã0ïŒæ ïŒ3ïŒåŸå€ã  
+BasPlugout.xslt_file:çšæå®æä»¶çXSLTèœ¬æ¢ææ¡£ã  
+
+DSpacePlugout.desc:Dspace Archiveæ ŒåŒã  
+
+FedoraMETSPlugout.desc:METSæ ŒåŒïŒäœ¿çšFedoraæ ŒåŒã  
+FedoraMETSPlugout.fedora_namespace:Fedoraäž­çšæ¥å€çidsïŒPIDSïŒçåçŒïŒæ¯åŠgreenstone:HASH0122efe4a2c58d0  
+
+GreenstoneXMLPlugout.desc:Greenstone XML å­æ¡£æ ŒåŒ  
+
+GreenstoneMETSPlugout.desc:METSæ ŒåŒïŒäœ¿çšGreenstoneæ ŒåŒã  
+
+MARCXMLPlugout.desc:MARC xml æ ŒåŒã  
+MARCXMLPlugout.group:å°marc xmlè®°åœèŸåºå°äžäžªåç¬æä»¶ã  
+MARCXMLPlugout.mapping_file:äœ¿çšåç§°æ å°æä»¶æ¥åèœ¬æ¢ã  
+
+METSPlugout.desc:çšäºMETSæ ŒåŒçäžçº§ç±»å¯Œåºæä»¶ãæ¬æä»¶æäŸçšäºGreenstoneMETSåFedoraMETSæ ŒåŒçåžžçšåèœïŒä»¥åæ žå¿æœè±¡æ¹æ³ã  
+METSPlugout.xslt_txt:çšæå®æä»¶äž­çXSLTèœ¬æ¢metsçdoctxt.xmlææ¡£ã  
+METSPlugout.xslt_mets:çšæå®æä»¶äž­çXSLTèœ¬æ¢metsçdocmets.xmlææ¡£ã  
+
+#
+# Perl module strings
+#
+
+classify.could_not_find_classifier:éè¯¯ïŒæ æ³æŸå°åç±»åšïŒ
+s  
+
+download.could_not_find_download:éè¯¯ïŒæ æ³æŸå°äžèœœæš¡åïŒ
+s  
+
+plugin.could_not_find_plugin:éè¯¯ïŒæ æ³æŸå°æä»¶ïŒ
+s  
+
+plugin.including_archive:å
+æ¬1 ZIP/TARå­æ¡£çå
+å®¹ã  
+
+plugin.including_archives:å
+æ¬ïŒ
+d ZIP/TARå­æ¡£çå
+å®¹ã  
+
+plugin.kill_file:è¢«.killæä»¶æž
+ççè¿çšã  
+
+plugin.n_considered:ïŒ
+d ææ¡£è¢«æ¥åå€çã  
+
+plugin.n_included:ïŒ
+d è¢«å€çäžå
+æ¬åšæ¶èäž­ã  
+
+plugin.n_rejected:ïŒ
+d è¢«æç»ã  
+
+plugin.n_unrecognised:ïŒ
+d æªç¥ã  
+
+plugin.no_plugin_could_process:è­ŠåïŒæ æä»¶å¯å€çïŒ
+s  
+
+plugin.no_plugin_could_recognise:è­ŠåïŒæ æä»¶å¯è¯å«ïŒ
+s  
+
+plugin.no_plugin_could_process_this_file:æ æä»¶å¯å€çæ­€æä»¶ã  
+
+plugin.no_plugin_could_recognise_this_file:æ æä»¶å¯è¯å«æ­€æä»¶ã  
+
+plugin.one_considered:äžäžªææ¡£è¢«æ¥åå€çã  
+
+plugin.one_included:äžäžªææ¡£è¢«å€çäžå
+æ¬åšæ¶èäž­ã  
+
+plugin.one_rejected:äžäžªææ¡£è¢«æç»ã  
+
+plugin.one_unrecognised:äžäžªææ¡£æ æ³è¯å«ã  
+
+plugin.see_faillog:è§ïŒ
+säž­äžäžªæ æ³è¯å«çïŒå/ææç»çææ¡£ã  
+
+PrintUsage.default:åå®æ¡ä»¶  
+
+PrintUsage.required:å¿
+èŠç  
+
+plugout.could_not_find_plugout:éè¯¯ïŒæ æ³æŸå°plugout\"ïŒ
+s\"  
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/talkback.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/talkback.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/talkback.pm	(revision 24799)
@@ -0,0 +1,163 @@
+###########################################################################
+#
+# talkback.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package talkback;
+
+use strict;
+
+
+sub generate_upload_form
+{
+    my ($uniq_file) = @_;
+
+    my $upload_html_form = <<EOF
+ 
+<html>
+  <head>
+  </head>
+  <body>
+    <form name="defaultForm" 
+          action="talkback-progressbar.pl"
+          enctype="multipart/form-data" method="post">
+      <input type="hidden" name="yes_upload" value="1" />
+      <input type="hidden" name="process" value="1" />
+
+      <p>
+        <input type="file" size="50" name="uploadedfile" />
+        <span style="font-size:20pt; font-weight:bold;">&rarr;</span>
+        <input type="submit" value="Upload File" />
+      </p>
+
+      <script language="Javascript"> 
+        setInterval("check_status(['check_upload__1', 'xx', 'uploadedfile'], ['statusbar']);", '1000');
+      </script> 
+
+    </form>
+
+
+    <div id="statusbar"></div>
+  </body>
+</html>
+
+EOF
+    ; 
+
+    return $upload_html_form;
+}
+
+sub generate_upload_form_progressbar
+{
+    my ($uniq_file) = @_;
+
+    my $upload_html_form = <<EOF
+ 
+<html>
+  <head>
+  </head>
+  <body>
+
+
+    <form name="talkbackUploadPB" 
+          action="talkback-progressbar.pl"
+          enctype="multipart/form-data" method="post">
+      <input type="hidden" name="uploadedfile" value="$uniq_file" />
+      <input type="hidden" name="xx" value="$uniq_file" />
+    </form>
+
+
+    <script type="text/javascript"> 
+      setInterval("check_status(['check_upload__1', 'xx', 'uploadedfile'], ['statusbar']);", '1000');
+
+    </script> 
+
+    <div style="width: 380px;" id="statusbar">status bar:</div>
+  </body>
+</html>
+
+EOF
+    ; 
+
+
+    return $upload_html_form;
+}
+
+
+
+
+sub generate_done_html
+{
+    my ($full_filename) = @_;
+
+    my $done_html = <<EOF
+
+<html>
+  <head>
+  </head>
+  <body>
+    <h3>
+      File uploaded. 
+    </h3>
+
+    <hr /> 
+    <p> 
+     <i>Server file: $full_filename</i>
+    </p>
+  </body>
+</html>
+
+EOF
+    ; 
+
+    return $done_html;
+}
+
+sub generate_malformed_args_html
+{
+    my ($full_filename) = @_;
+
+    my $done_html = <<EOF
+
+<html>
+  <head>
+  </head>
+  <body>
+    <h3>
+      Oops!
+    </h3>
+    <hr /> 
+    <p> 
+     Malformed CGI arguments.
+    </p>
+  </body>
+</html>
+
+EOF
+    ; 
+
+    return $done_html;
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat.pm	(revision 24799)
@@ -0,0 +1,333 @@
+###########################################################################
+#
+# textcat.pm -- Identify the language of a piece of text
+#
+#
+# This file is based on TextCat version 1.08 by Gertjan van Noord
+# Copyright (C) 1997 Gertjan van Noord (vannoord@let.rug.nl)
+# TextCat is available from: http://odur.let.rug.nl/~vannoord/TextCat 
+#
+# It was modified by Gordon Paynter (gwp@cs.waikato.ac.nz) and turned
+# into a package for use in Greenstone digital library system.  Most of
+# the modifications consist of commenting out or deleting functionality
+# I don't need.  
+#
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package textcat;
+
+use strict;
+
+# OPTIONS
+my $model_dir = $ENV{'GSDLHOME'} . "/perllib/textcat";
+
+my $opt_f = 1;                # Ngrams which occur <= this number of times are removed
+my $opt_t = 400;              # topmost number of ngrams that should be used
+my $opt_u = 1.05;             # how much worse result must be before it is ignored
+
+my $non_word_characters = '0-9\s';
+
+# caching related
+my %filename_cache = (); # map of cached text-strings each to array of char-encodings for the strings themselves
+my %filecontents_cache = (); # map of cached filenames to array of char-encodings for the contents of the files
+my $MAX_CACHE_SIZE = 1000;
+
+sub new {
+    my $class = shift (@_);
+    my ($tmp_f, $tmp_t, $tmp_u) = @_;
+
+    my $self = {};
+
+    # open directory to find which languages are supported
+    opendir DIR, "$model_dir" or die "directory $model_dir: $!\n";
+    my @languages = sort(grep { s/\.lm// && -r "$model_dir/$_.lm" } readdir(DIR));
+    closedir DIR;
+    @languages or die "sorry, can't read any language models from $model_dir\n" .
+	"language models must reside in files with .lm ending\n";
+
+    # load model and count for each language.
+    foreach my $language (@languages) {
+	my %ngram=();
+	my $rang=1;
+	open(LM, "$model_dir/$language.lm") || die "cannot open $language.lm: $!\n";
+	while (<LM>) {
+	    chomp;
+	    # only use lines starting with appropriate character. Others are ignored.
+	    if (/^[^$non_word_characters]+/o) {
+		$self->{'ngrams'}->{$language}->{$&} = $rang++;
+	    } 
+	}
+	close(LM);
+    }
+
+    $self->{'languages'} = \@languages;
+
+    $self->{'opt_f'} = defined($tmp_f) ? $tmp_f : $opt_f;
+    $self->{'opt_t'} = defined($tmp_t) ? $tmp_t : $opt_t;
+    $self->{'opt_u'} = defined($tmp_u) ? $tmp_u : $opt_u;
+    $self->{'max_cache_size'} = $MAX_CACHE_SIZE;
+
+    return bless $self, $class;
+}
+
+
+# CLASSIFICATION
+#
+# What language is a text string?
+#   Input:  text string
+#   Output: array of language names
+# $languages is the set of language models to consider (to textcat on)
+# Can be set to filter out language models that don't belong to the given encoding 
+# in order to obtain a list of the probable languages for that known encoding.
+# $filter_by_encoding indicates what encoding to narrow the search for languages down to.
+# This is for when we already know the encoding, but we're still looking for the language.
+sub classify {
+    my ($self, $inputref, $filter_by_encoding)=@_;
+    my $languages;
+    @$languages = ();
+
+    # filter language filenames by encoding 
+    if(defined $filter_by_encoding) {
+	# make sure to normalize language and filtering encoding so we are not
+	# stuck comparing hyphens with underscores in such things as iso-8859-1
+	my $normalized_filter = $filter_by_encoding; 
+	$normalized_filter =~ s/[\W\_]//g;
+
+	foreach my $lang (@{$self->{'languages'}}) {
+	    my $normalized_lang = $lang; 
+	    $normalized_lang =~ s/[\W\_]//g;
+
+	    if($normalized_lang =~ m/$normalized_filter/i) {
+		push (@$languages, $lang);
+	    }
+	}
+    }
+
+    # if the filter_by_encoding wasn't in the list of language model filenames
+    # or if we're not filtering, then work with all language model filenames
+    if(scalar @$languages == 0) {
+	$languages = $self->{'languages'};
+    }
+
+    my %results = ();
+    my $maxp = $self->{'opt_t'};
+
+    # create ngrams for input.
+    my $unknown = $self->create_lm($inputref);
+
+    foreach my $language (@$languages) {	
+	# compare language model with input ngrams list
+	my ($i,$p)=(0,0);
+	while ($i < scalar (@$unknown)) {
+	    if (defined ($self->{'ngrams'}->{$language}->{$unknown->[$i]})) {
+		$p=$p+abs($self->{'ngrams'}->{$language}->{$unknown->[$i]}-$i);
+	    } else { 
+		$p=$p+$maxp; 
+	    }
+	    ++$i;
+	}
+	$results{$language} = $p;
+    }
+
+    my @results = sort { $results{$a} <=> $results{$b} } keys %results;
+    my $a = $results{$results[0]};
+  
+    my @answers=(shift(@results));
+    while (@results && $results{$results[0]} < ($self->{'opt_u'} *$a)) {
+	@answers=(@answers,shift(@results));
+    }
+
+    return \@answers;
+}
+
+
+# Same as below, but caches textcat results on filenames for subsequent use.
+# The cache is a map of the filename to the corresponding filename_encodings
+# (an array of results returned by textcat of the possible filename-encodings 
+# for the indexing filename string itself). 
+# Need to make sure that the filename is only the tailname: no path and no
+# extension (no digits), in order to make optimum use of cached textcat.
+# Textcat is performed on $filename_ref and the results associated with $filename_ref.
+# The cache will be cleared when the max_cache_size is reached, which is
+# MAX_CACHE_SIZE by default or can be specified as a parameter. The cache
+# can also be cleared by a call to clear_filename_cache.
+sub classify_cached_filename {
+    my ($self, $filename_ref)=@_;
+    
+    # if not already in the cache, work it out and put it there
+    if (!defined $filename_cache{$$filename_ref}) 
+    {
+	if (scalar (keys %filename_cache) >= $self->{'max_cache_size'}) {
+	    $self->clear_filename_cache();
+	}
+	$filename_cache{$$filename_ref} = $self->classify($filename_ref);
+    } 
+
+    # return cached array of encodings for the given string
+    return $filename_cache{$$filename_ref}; 
+}
+
+# Same as above, but caches textcat results on filecontents for subsequent use.
+# Textcat on a file's contents to work out its possible encodings. Uses the cache.
+# The cache is a map of the filename to an array of possible filename_encodings
+# for the *contents* of the file returned by textcat.
+# Textcat is performed on $contents_ref and the results associated with $filename.
+# The cache will be cleared when the max_cache_size is reached, which is
+# MAX_CACHE_SIZE by default or can be specified as a parameter. The cache
+# can also be cleared by a call to clear_filecontents_cache.
+sub classify_contents {
+    my ($self, $contents_ref, $filename)=@_;
+     
+    # if not already in the cache, work it out and put it there
+    if (!defined $filecontents_cache{$filename})
+    {	   
+	if (scalar (keys %filecontents_cache) >= $self->{'max_cache_size'}) {
+	    $self->clear_filecontents_cache();
+	}
+	
+	# Finally, we can perform the textcat classification of language and encoding
+	$filecontents_cache{$filename} = $self->classify($contents_ref);
+    }
+    # return cached array of content encodings for the given filename
+    return $filecontents_cache{$filename};
+}
+
+
+# Given the known encoding for a file's contents, performs a textcat 
+# filtering on the languages for the given encoding. Results are stored
+# in the cache TWICE: once under $filename|$filter_by_encoding, and
+# once under the usual $filename, so that subsequent calls to either
+# this method or classify_contents using the same filename will not
+# perform textcat again. 
+sub classify_contents_for_encoding {
+    my ($self, $contents_ref, $filename, $filter_by_encoding)=@_;
+
+    if (!defined $filecontents_cache{"$filename|$filter_by_encoding"})
+    {	   
+	if (scalar (keys %filecontents_cache) >= $self->{'max_cache_size'}) {
+	    $self->clear_filecontents_cache();
+	}	
+
+	$filecontents_cache{"$filename|$filter_by_encoding"} = $self->classify($contents_ref, $filter_by_encoding);
+	# store this in cache again under $filename entry, so that subsequent 
+	# calls to classify_contents will find it in the cache already
+	$filecontents_cache{$filename} = $self->classify($contents_ref, $filter_by_encoding);
+    }
+    return $filecontents_cache{$filename};
+}
+   
+
+# This method returns the most frequently occurring encoding 
+# but only if any encoding occurs more than once in the given results.
+# Otherwise, "" is returned.
+sub most_frequent_encoding {
+    my ($self, $results) = @_;
+    my $best_encoding = "";
+
+    # guessed_encodings is a hashmap of Encoding -> Frequency pairs
+    my %guessed_encodings = ();
+    foreach my $result (@$results) {
+	# Get the encoding portion of a language-model filename like en-iso8859_1
+	my ($encoding) = ($result =~ /^(?:[^\-]+)\-([^\-]+)$/);
+	if(!defined($guessed_encodings{$encoding})) {
+	    $guessed_encodings{$encoding} = 0;
+	}
+	$guessed_encodings{$encoding}++;
+    }
+    
+    $guessed_encodings{""}=-1; # for default best_encoding of ""
+
+    foreach my $enc (keys %guessed_encodings) {
+	if ($guessed_encodings{$enc} > $guessed_encodings{$best_encoding}) {
+	    $best_encoding = $enc;
+	}
+    }
+
+    # If best_encoding's frequency == 1, then the frequency for all encodings will 
+    # be 1 since the sum total of all frequencies is num_results: if any encoding
+    # has frequency > 1 (it's possibly the best_encoding), one or more of the others
+    # would have been at 0 frequency to compensate.
+    return ($guessed_encodings{$best_encoding} > 1) ? $best_encoding : "";
+}
+
+
+# set some of the specific member variables
+sub set_opts {
+    my ($self, $opt_freq, $opt_factor, $opt_top, $max_size_of_cache)=@_;
+         
+    $self->{'opt_f'} = $opt_freq if defined $opt_freq;
+    $self->{'opt_u'} = $opt_factor if defined $opt_factor;
+    $self->{'opt_t'} = $opt_top if defined $opt_top;
+
+    $self->{'max_cache_size'} = $max_size_of_cache if defined $max_size_of_cache;
+}
+
+sub get_opts {
+    my $self = shift (@_);
+    return ($self->{'opt_f'}, $self->{'opt_u'}, $self->{'opt_t'}, $self->{'max_cache_size'});
+}
+
+# Clears the filename cache (a map of strings to the textcat results for each string).
+sub clear_filename_cache {
+    my $self = shift (@_);
+
+    %filename_cache = ();
+}
+
+# Clears the filecontents cache (a map of filenames to the textcat results on the contents of each file).
+sub clear_filecontents_cache {
+    my $self = shift (@_);
+
+    %filecontents_cache = ();
+}
+
+sub create_lm {
+    # $ngram contains reference to the hash we build
+    # then add the ngrams found in each word in the hash
+    my ($self, $textref) = @_;  
+    
+    my $ngram = {};
+
+    foreach my $word (split(/[$non_word_characters]+/, $$textref)) {
+	$word = "_" . $word . "_";
+	my $len = length($word);
+	my $flen=$len;
+	my $i;
+
+	for ($i=0; $i<$flen; $i++) {
+	    $ngram->{substr($word,$i,5)}++ if $len > 4;
+	    $ngram->{substr($word,$i,4)}++ if $len > 3;
+	    $ngram->{substr($word,$i,3)}++ if $len > 2;
+	    $ngram->{substr($word,$i,2)}++ if $len > 1;
+	    $ngram->{substr($word,$i,1)}++;
+	    $len--;
+	}
+    }
+
+    map { if ($ngram->{$_} <= $self->{'opt_f'}) { delete $ngram->{$_}; }
+      } keys %$ngram;
+  
+    # sort the ngrams, and spit out the $opt_t frequent ones.
+    # adding  `or $a cmp $b' in the sort block makes sorting five
+    # times slower..., although it would be somewhat nicer (unique result)
+    my @sorted = sort { $ngram->{$b} <=> $ngram->{$a} } keys %$ngram;
+    splice(@sorted,$self->{'opt_t'}) if (@sorted > $self->{'opt_t'}); 
+    return \@sorted;
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/ar-iso_8859_6.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/ar-iso_8859_6.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/ar-iso_8859_6.lm	(revision 24799)
@@ -0,0 +1,434 @@
+_	 9692
+Ø	 7361
+Ù	 6120
+Ø§	 2417
+§	 2417
+_Ø	 1691
+Ù	 1587
+	 1587
+Ø§Ù	 1415
+§Ù	 1415
+Ç	 1241
+_Ù	 1129
+_Ø§	 987
+§Ù	 978
+Ø§Ù	 978
+ä	 952
+_Ø§Ù	 894
+Ù
+	 869
+
+	 869
+ÙØ	 801
+Ø	 801
+	 798
+Ù	 798
+_Ø§Ù	 771
+ª	 757
+Øª	 757
+Ø§Ø	 738
+§Ø	 738
+Ù	 680
+	 680
+Ù	 659
+	 659
+è	 622
+ÙÙ	 619
+Ù	 619
+§ÙØ	 574
+Ø§ÙØ	 574
+¹	 547
+Ø¹	 547
+Ø±	 541
+±	 541
+ê	 527
+©	 512
+Ø©	 512
+
+Ø	 504
+Ù
+Ø	 504
+æ	 496
+Çä	 492
+Øš	 490
+š	 490
+Ø©_	 482
+©_	 482
+å	 477
+_Ç	 470
+Ø	 461
+ÙØ	 461
+.	 430
+_Çä	 405
+§ÙÙ	 352
+Ø§ÙÙ	 352
+Ù	 350
+	 350
+È	 340
+Ø¯	 339
+¯	 339
+ØªØ	 334
+ªØ	 334
+Ñ	 324
+	 314
+Ù	 314
+ç	 302
+_Ù	 289
+
+Ù	 278
+Ù
+Ù	 278
+ÙØ	 276
+Ø	 276
+Ø¹Ù	 270
+¹Ù	 270
+Ê	 267
+ÙÙ	 263
+Ù	 263
+Ù_	 262
+_	 262
+_Ù
+	 259
+	 258
+Ù	 258
+³	 258
+Ø³	 258
+ÙØ§	 258
+Ø§	 258
+æ_	 257
+ØšØ	 252
+šØ	 252
+Ø	 252
+ÙØ	 252
+¬	 252
+§_	 250
+Ø§_	 250
+Ï	 242
+_è	 235
+Øª_	 226
+ª_	 226
+._	 223
+±Ù	 213
+Ø±Ù	 213
+§Øª	 206
+Ø§Øª	 206
+­	 202
+Ø­	 202
+Ç_	 200
+±Ø	 199
+Ø±Ø	 199
+á	 199
+¹Ø	 198
+Ø¹Ø	 198
+šÙ	 196
+ØšÙ	 196
+ÙØ	 193
+Ø	 193
+ØªÙ	 191
+ÙÙ
+	 191
+ªÙ	 191
+Ù
+	 191
+..	 188
+Ù	 184
+	 184
+Ø¬	 183
+Ø§Ù	 180
+§Ù	 180
+§ÙØ§	 178
+_	 176
+ÙØ©	 176
+Ø©	 176
+Ù_	 176
+ã	 175
+ÙÙ	 175
+Ù	 175
+_Øš	 171
+Ì	 171
+§ÙÙ
+	 170
+Ã	 166
+_	 165
+Ù_	 165
+ÙØ	 163
+_Ù	 163
+Ø	 163
+Ž	 162
+ØŽ	 162
+Ù_	 162
+_	 162
+Ù	 161
+ÙÙ	 161
+É	 160
+â	 159
+ÙØ©_	 158
+Ø©_	 158
+	 155
+Ù	 155
+Ø³Ø	 153
+³Ø	 153
+Ù_	 150
+_	 150
+Í	 150
+Ó	 148
+§Øª_	 147
+Ø§Øª_	 147
+µ	 144
+_å	 144
+Øµ	 144
+ç_	 142
+Ù
+Ø	 139
+ÙÙ
+Ø	 139
+_ÙÙ	 136
+_Ù
+Ù	 133
+Ù
+Ø§	 130
+_ØšØ	 130
+
+Ø§	 130
+ØŽØ	 129
+ŽØ	 129
+_Ù_	 129
+¯Ø	 128
+Ø¯Ø	 128
+É_	 127
+äÇ	 127
+_Ù
+Ø	 126
+Ø±_	 124
+±_	 124
+Ø¹Ù	 123
+¹Ù	 123
+ÙÙ	 122
+Ù	 122
+ÙØ	 121
+_È	 121
+Ø	 121
+­Ø	 119
+Ø­Ø	 119
+ÙØ§Ù	 118
+Ø§Ù	 118
+ò	 117
+ê_	 117
+_Ø¹	 117
+î	 116
+Ù	 115
+_Øª	 115
+ÙÙ	 115
+äå	 113
+¯Ù	 113
+Ø¯Ù	 113
+
+Ù	 111
+Ù
+Ø¹	 111
+
+Ø¹	 111
+Ù
+Ù	 111
+Ø¹ÙÙ	 110
+¹ÙÙ	 110
+_Ã	 109
+_Ù	 108
+ÙÙ	 108
+Ù	 108
+Ù_	 102
+ÙØ§	 102
+ÙØ§Ø	 102
+Ø§Ø	 102
+ÙÙ_	 102
+Ø§	 102
+®	 101
+¬Ø	 101
+Ø®	 101
+_ÙØ	 100
+Ø¬Ø	 100
+_ÙÙ	 99
+ÙØ	 99
+Ø	 99
+Ð	 98
+¯_	 97
+Ø§Ù
+	 97
+§Ù
+	 97
+Ø¯_	 97
+...	 94
+_Ù
+Ù	 94
+šØ§	 93
+·	 93
+ØšØ§	 93
+_Ø§Ø	 93
+Ø·	 93
+Ø§	 92
+ï	 92
+ÙØ§	 92
+ÙØª	 91
+Øª	 91
+ä_	 90
+Çæ	 89
+_á	 89
+Ï_	 88
+èÇ	 87
+_Ø¹Ù	 87
+ÙÙ	 85
+Ù	 85
+èä	 84
+Ø°	 84
+
+Ù_	 84
+Ø³Ù	 84
+³Ù	 84
+Ù_	 84
+°	 84
+ÙÙ_	 84
+Ù
+Ù_	 84
+Çäå	 84
+-	 83
+®Ø	 83
+Ø®Ø	 83
+_ä	 82
+
+_	 82
+§Ø³	 82
+Ø§Ø³	 82
+Ù
+_	 82
+_Çäå	 81
+Ù
+	 80
+é	 80
+ÙÙ
+	 80
+é_	 79
+Ø§ÙØ	 79
+§ÙØ	 79
+¹_	 78
+±Ø§	 78
+¹Ø§	 78
+Ø¹Ø§	 78
+§Ø±	 78
+ÙØ§_	 78
+Ø¹_	 78
+¬_	 78
+Ø§_	 78
+Ø±Ø§	 78
+Ø§Ø±	 78
+µØ	 78
+ØµØ	 78
+.._	 77
+Ø£	 77
+..._	 77
+£	 77
+Ô	 77
+Ù	 76
+ÙÙ	 76
+ªØ±	 75
+ØªØ±	 75
+«	 74
+ÙÙ	 73
+Ø§Ù_	 73
+Ø¶	 73
+Ø«	 73
+¬Ù	 73
+Ø¬Ù	 73
+¶	 73
+§Ù_	 73
+Ù	 73
+Ù
+Ø¹Ù	 72
+
+Ø¹Ù	 72
+åæ	 71
+èÌ	 70
+Ø§	 70
+ÙØ§	 70
+­Ù	 69
+î_	 69
+Ø­Ù	 69
+êæ	 69
+Øª	 68
+ÙØª	 68
+Ø§	 68
+Ùä	 68
+_ØªØ	 68
+ÙØ§	 68
+_ê	 67
+Ë	 66
+ò.	 66
+èÏ	 66
+_¬_	 65
+³Øª	 65
+äè	 65
+Ø³Øª	 65
+_¬	 65
+Ìè	 65
+ð	 64
+ÙÙ
+Ø	 64
+áê	 64
+Ù
+Ø	 64
+èæ	 63
+Ø§Ø³Ø	 63
+Õ	 63
+§Ø³Ø	 63
+Ñ_	 62
+-_	 62
+ÇÊ	 61
+_-	 61
+Ù	 61
+ÙÙ	 61
+_Ø§Ù	 61
+åÇ	 61
+å_	 61
+äé_	 60
+§Ø¯	 60
+_ÙÙ	 60
+èÌè	 60
+Ö	 60
+Ø§Ø¯	 60
+äé	 60
+ØªØ	 59
+ÌèÏ	 59
+_-_	 59
+_Ø¹Ù	 59
+ÙØªØ	 59
+èÌèÏ	 58
+ÙÙ	 58
+²	 58
+Ø¬Ø§	 58
+Ù	 58
+Øš	 58
+ÙØš	 58
+_Ù	 58
+_åæ	 58
+Ø²	 58
+_ÙØ	 58
+¬Ø§	 58
+Ø§	 57
+§ÙØª	 57
+Ù	 57
+ÙØ§	 57
+ÙÙ	 57
+ò..	 56
+ØŽØš	 56
+ò..._	 56
+ŽØš	 56
+Çæ_	 56
+ò...	 56
+šÙ	 56
+ØšÙ	 56
+ØªØ¹	 55
+Ø¹Ù
+	 55
+¹ÙÙ	 55
+_Ù	 55
+ªØ¹	 55
+_._	 55
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/ar-windows_1256.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/ar-windows_1256.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/ar-windows_1256.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 3974
+Ç	 1252
+á	 958
+æ	 626
+í	 534
+ä	 498
+Çá	 496
+ã	 482
+_Ç	 473
+_Çá	 408
+È	 345
+.	 335
+Ñ	 326
+å	 303
+Ê	 269
+Ú	 260
+ä_	 258
+Ï	 244
+_æ	 235
+Ý	 202
+Ç_	 200
+..	 188
+ß	 175
+Ì	 173
+Ã	 166
+É	 162
+Þ	 157
+Í	 150
+Ó	 150
+_ã	 145
+å_	 143
+._	 130
+áÇ	 129
+É_	 129
+_È	 124
+í_	 120
+ú	 117
+ó	 116
+áã	 115
+_Ã	 109
+Ð	 98
+...	 94
+õ	 92
+_Ý	 92
+_Ú	 90
+Çä	 90
+á_	 90
+Ï_	 88
+æÇ	 87
+Çáã	 86
+æá	 84
+_Çáã	 83
+_á	 82
+ì	 80
+ì_	 79
+Ô	 77
+.._	 77
+..._	 77
+æÌ	 72
+ãä	 71
+¡_	 69
+Úá	 69
+¡	 69
+íä	 69
+ó_	 68
+æÏ	 68
+_í	 67
+Ìæ	 67
+Ýí	 67
+Ë	 66
+ú.	 66
+áæ	 65
+ö	 64
+æä	 63
+ÇÊ	 63
+Õ	 63
+ã_	 62
+ãÇ	 62
+æÌæ	 62
+Ñ_	 62
+ÌæÏ	 61
+áì	 60
+æÌæÏ	 60
+Ö	 60
+áì_	 60
+_¡_	 58
+_ãä	 58
+_¡	 58
+Çä_	 57
+ú..._	 56
+ú..	 56
+ú...	 56
+-_	 53
+-	 53
+_-	 52
+_-_	 52
+_Ýí	 51
+ãä_	 50
+áí	 50
+Çáæ	 50
+_æÇ	 50
+ÐÇ	 49
+áÇ_	 48
+Á	 48
+áÚ	 47
+_ß	 47
+È_	 47
+ö_	 46
+_Çáæ	 45
+æä_	 45
+íÇ	 44
+Ò	 44
+Ýí_	 44
+_Úá	 43
+_Ñ	 43
+õ_	 43
+æÏ_	 43
+_ãä_	 43
+ÌæÏ_	 42
+æÌæÏ_	 42
+Î	 42
+ÇáÚ	 41
+Ø	 41
+ÍÇ	 41
+Úáì_	 40
+_Ê	 40
+Úáì	 40
+_Çä	 40
+ãÑ	 40
+íä_	 39
+Èí	 39
+åÇ	 39
+_ÇáÚ	 38
+ÑÇ	 38
+áå	 37
+äí	 37
+_Þ	 37
+_Ýí_	 36
+Ê_	 36
+ÊÈ	 35
+_æá	 35
+áæÌ	 35
+áá	 35
+_Çä_	 35
+áæÌæ	 35
+Êå	 34
+ãÇ_	 34
+Á_	 34
+Æ	 34
+ÐÇÊ	 34
+áæÌæÏ	 34
+ÇáæÌ	 33
+ÇáæÌæ	 33
+ÇáÇ	 33
+ßæ	 33
+_å	 32
+Çæ	 32
+äÇ	 31
+ßæä	 31
+ÇÈ	 31
+ÈÉ	 31
+åÇ_	 31
+_Ì	 30
+áä	 30
+Çæá	 30
+íÑ	 30
+_ÇáæÌ	 30
+Êõ	 30
+Çã	 30
+Ãä	 30
+Û	 30
+_Í	 30
+ø	 29
+Èá	 29
+ÇÁ	 29
+Êå_	 29
+ÃÍ	 29
+æÑ	 29
+ÇÏ	 29
+íå	 29
+_ÃÍ	 29
+Å	 29
+ÈÇ	 29
+_Úáì_	 28
+ÇÊå	 28
+_ÇáÇ	 28
+_Úáì	 28
+ÈÉ_	 28
+ãæ	 27
+ßæä_	 27
+_Ô	 27
+ÑÊ	 27
+íÉ	 27
+áß	 27
+æÇá	 27
+æã	 27
+ÐÇÊå	 27
+Ó_	 26
+_.	 26
+Çá_	 26
+ÞÇ	 26
+_æÇá	 26
+ßÇ	 26
+íÉ_	 26
+äå	 26
+ÇÊå_	 26
+_._	 26
+æá_	 25
+Ïí	 25
+ÚÑ	 25
+ÐÇÊå_	 25
+áå_	 25
+ãÓ	 24
+ÇÆ	 24
+ÏÇ	 24
+íß	 24
+_áÇ	 24
+æÈ	 23
+ÊÈÉ_	 23
+ãÑÊÈ	 23
+_ÃÍÇæ	 23
+äæ	 23
+Ãí	 23
+Çáá	 23
+äú	 23
+ÑÊÈ	 23
+ÚÇ	 23
+íßæ	 23
+íßæä	 23
+ÍÇæá	 23
+ÊÈÉ	 23
+ÃÍÇæá	 23
+íßæä_	 23
+_ÃÍÇ	 23
+ÇÑ	 23
+ÃÍÇ	 23
+Èú	 23
+_Çáá	 23
+ÍÇæ	 23
+ãÑÊ	 23
+ÃÍÇæ	 23
+_íß	 23
+_íßæä	 22
+ãÑÊÈÉ	 22
+ò	 22
+ÇÌ	 22
+ÌÈ	 22
+äí_	 22
+_íßæ	 22
+ÑÊÈÉ	 22
+Çæá_	 22
+ÑÊÈÉ_	 22
+ß_	 22
+_Å	 21
+_Èá	 21
+áãÑ	 21
+Þí	 21
+ÑÈ	 21
+ßá	 21
+æáÇ	 21
+Êõ_	 21
+ÇáãÑ	 21
+Çáä	 21
+_ÇáãÑ	 20
+Ïå	 20
+ÌÈ_	 20
+ááå	 20
+ÇáË	 20
+ÇÊ_	 20
+áË	 20
+ÑÓ	 20
+_Ð	 20
+ÇÓ	 20
+åæ	 20
+Úí	 19
+Çå	 19
+Èä	 19
+æ_	 19
+åÐ	 19
+Ðå	 19
+Èíä	 19
+áã_	 19
+_Ãä	 19
+íÑ_	 19
+áÊ	 19
+ÍÇæá_	 18
+áÔ	 18
+Çááå	 18
+ÇÌÈ_	 18
+æÇÌÈ_	 18
+ËÇ	 18
+Úä	 18
+ááå_	 18
+Ãä_	 18
+íÏ	 18
+ÇÌÈ	 18
+Ôí	 18
+_Çáä	 18
+áãÑÊÈ	 18
+_æÃ	 18
+_Çááå	 18
+áãÑÊ	 18
+æÇÌ	 18
+Ñí	 18
+æÃ	 18
+ÇáãÑÊ	 18
+æÇÌÈ	 18
+ÞÏ	 18
+_ÞÇ	 17
+ÇáÔ	 17
+Úíä	 17
+ÝÇ	 17
+åã	 17
+Ú_	 17
+íÇ_	 17
+ãæÌ	 17
+ò_	 17
+Çááå_	 17
+ãÊ	 17
+äú.	 17
+ãæÌæ	 17
+íÓ	 17
+ÚÏ	 17
+ÍÏ	 17
+ÌÇ	 17
+Óí	 17
+_áÇ_	 17
+ãæÌæÏ	 17
+æÑ_	 17
+Èå	 16
+Õæ	 16
+_æã	 16
+ÇÁ_	 16
+äå_	 16
+Ù	 16
+_æáÇ	 16
+Çäí	 16
+_åÐ	 16
+_ÐÇ	 16
+ÓÇ	 16
+ÓÊ	 16
+ßä	 16
+áÐ	 16
+Óã	 16
+_ÐÇÊ	 16
+ÇÚ	 16
+ñ	 16
+áæÇ	 16
+íÊ	 16
+ãÍ	 16
+_ÈÐ	 15
+íÞ	 15
+æáÇ_	 15
+ÇáÚÑ	 15
+áíå	 15
+_Çáãæ	 15
+áãæ	 15
+äÇ_	 15
+ÚÑÈ	 15
+_æÌ	 15
+_ÇáÔ	 15
+Çáãæ	 15
+Þ_	 15
+Ëá	 15
+_ÇáÚÑ	 15
+áó	 15
+áÚÑ	 15
+æÝ	 15
+_ä	 15
+ÈÐ	 15
+íá	 14
+Óá	 14
+ÐÇ_	 14
+!	 14
+Èíä_	 14
+ÇáæÇ	 14
+_ÑÓ	 14
+ÇáÚÑÈ	 14
+ÈÊ	 14
+áó_	 14
+Úáí	 14
+æÚ	 14
+áÚÑÈ	 14
+_ÇáÐ	 14
+åä	 14
+ÇáÊ	 14
+ÇáÐ	 14
+_Ãä_	 14
+Ý_	 14
+áÝ	 14
+Èú.	 14
+ãí	 14
+áÛ	 13
+åÐå_	 13
+åÐå	 13
+_åÐå	 13
+ÖÇ	 13
+_ßá	 13
+áØ	 13
+ÈáÇ	 13
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/be-windows_1251.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/be-windows_1251.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/be-windows_1251.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 9440
+à	 4377
+í	 1855
+i	 1544
+ð	 1436
+ó	 1345
+ê	 1246
+û	 1233
+å	 1215
+ñ	 1093
+ë	 1090
+ò	 1050
+ÿ	 934
+ä	 860
+î	 811
+â	 792
+à_	 740
+ì	 724
+ç	 699
+ö	 643
+íà	 589
+ï	 580
+ã	 531
+.	 480
+êà	 467
+ðà	 458
+ó_	 432
+i_	 430
+._	 418
+,	 402
+,_	 402
+á	 391
+àð	 373
+òà	 361
+÷	 350
+âà	 340
+ü	 335
+àë	 330
+ý	 329
+_ï	 328
+àí	 315
+ëà	 307
+ÿ_	 306
+_ñ	 305
+û_	 296
+àä	 279
+é	 279
+_ó	 274
+ðû	 271
+ø	 269
+ãà	 250
+å_	 247
+õ	 244
+_í	 240
+_ç	 236
+_à	 221
+ñò	 221
+íû	 220
+ëi	 218
+äà	 210
+àâ	 203
+_ê	 199
+ñê	 197
+ïà	 195
+_ó_	 194
+äç	 193
+íi	 193
+àì	 192
+_ã	 190
+êi	 190
+_i	 189
+àñ	 187
+çå	 185
+_ä	 179
+é_	 178
+àó	 176
+àã	 174
+þ	 171
+_íà	 169
+ëü	 167
+_â	 166
+íà_	 166
+ëå	 162
+_ì	 161
+àé	 160
+ií	 158
+ì_	 154
+æ	 154
+òû	 154
+ðó	 151
+ïð	 151
+_á	 149
+iê	 148
+ûÿ	 147
+çà	 146
+åð	 145
+ðî	 142
+àê	 141
+óñ	 140
+_i_	 140
+ü_	 140
+"	 137
+åí	 135
+àö	 135
+êó	 131
+ìà	 129
+_ïà	 129
+õ_	 126
+äçå	 126
+àç	 125
+íå	 125
+íí	 123
+_ò	 122
+àò	 122
+ãà_	 121
+àãà	 120
+_ïð	 120
+åë	 120
+àâà	 119
+À	 119
+ûì	 116
+-	 113
+âå	 112
+âû	 112
+ñà	 112
+àé_	 111
+öû	 109
+öü	 109
+_À	 107
+ìi	 106
+àãà_	 105
+îð	 103
+öü_	 102
+Ì	 101
+_êà	 100
+_Ì	 100
+_ÿ	 99
+ëÿ	 99
+íÿ	 98
+íñ	 96
+Â	 95
+ñÿ	 94
+òð	 94
+âi	 92
+ãî	 92
+ç_	 91
+ñêà	 91
+öà	 91
+òó	 91
+àá	 91
+àëà	 90
+÷à	 88
+òî	 88
+íû_	 87
+ñòà	 87
+î_	 87
+_ð	 86
+ÿê	 84
+öö	 84
+iêà	 83
+îó	 83
+ñâ	 83
+àÿ	 83
+÷û	 82
+ïðà	 81
+_çà	 79
+ûí	 79
+åò	 79
+ìå	 79
+ÿí	 79
+âÿ	 79
+_ç_	 78
+ëi_	 78
+ûÿ_	 78
+ðóñ	 77
+êi_	 75
+îä	 74
+_ãà	 74
+i÷	 74
+åö	 73
+íñê	 73
+åëà	 72
+àíà	 72
+âàí	 72
+äð	 72
+ô	 71
+óí	 71
+ðí	 71
+àðó	 71
+àó_	 70
+àå	 70
+àëå	 70
+_íà_	 70
+àëi	 69
+iì	 68
+Ï	 68
+à.	 68
+îë	 68
+òâ	 68
+_àä	 68
+ûì_	 67
+àÿ_	 67
+ëàð	 67
+ööà	 67
+ñï	 67
+_"	 67
+îí	 67
+i,	 67
+à._	 67
+àðóñ	 67
+i,_	 67
+åëàðó	 66
+öi	 66
+óä	 66
+àðà	 66
+ëàðóñ	 66
+ëàðó	 66
+ïå	 66
+åëàð	 66
+_ø	 65
+àäç	 65
+êò	 65
+Í	 65
+_äà	 65
+òà_	 65
+Á	 64
+_Â	 64
+ðàä	 64
+íàã	 64
+_ñò	 64
+øû	 63
+íê	 63
+üí	 63
+óð	 62
+ëüí	 62
+_Ï	 62
+çi	 62
+óë	 62
+ëà_	 62
+ðý	 62
+iö	 62
+òàð	 62
+óê	 61
+û,	 61
+ñö	 61
+_Í	 61
+û,_	 61
+àõ	 61
+êàë	 60
+iñ	 60
+ð_	 60
+öà_	 60
+I	 59
+îâ	 59
+íàãà	 59
+_I	 59
+_Á	 59
+ûõ	 59
+Ê	 59
+_ïðà	 59
+äí	 59
+óñê	 59
+ië	 59
+íå_	 59
+ó.	 59
+_ñâ	 58
+ó._	 58
+ä_	 57
+êî	 57
+áå	 57
+ñi	 57
+çå_	 57
+êð	 57
+ýí	 56
+àâàí	 56
+àðû	 56
+ïi	 56
+åä	 56
+äçå_	 55
+_âû	 55
+íàãà_	 54
+áà	 54
+ööà_	 54
+öå	 53
+áî	 53
+Ìi	 53
+÷í	 53
+à÷	 53
+åê	 53
+iÿ	 53
+Ñ	 53
+íî	 53
+_Ìi	 52
+_ÿê	 52
+ÿð	 52
+òâà	 51
+íûÿ	 51
+ûñ	 51
+àï	 50
+à,_	 50
+ó,_	 50
+àëü	 50
+ïðû	 50
+_÷	 50
+à,	 50
+ó,	 50
+àíí	 50
+ûõ_	 50
+_Ñ	 50
+áû	 49
+êñ	 49
+iõ	 49
+åðà	 49
+ê_	 49
+þ_	 48
+ðóñê	 48
+_Ê	 48
+_ý	 47
+äû	 47
+êë	 47
+ãi	 47
+_.	 47
+àø	 47
+óò	 47
+íiê	 46
+âàð	 46
+àäà	 46
+_._	 46
+øò	 46
+ðû_	 46
+òý	 46
+_íå	 46
+çí	 45
+òû_	 45
+ûë	 45
+_-	 45
+_ñà	 45
+àì_	 45
+Ä	 45
+_ìà	 45
+iò	 44
+_ë	 44
+_ïðû	 44
+óñêà	 44
+ëiê	 44
+âà_	 44
+àçå	 43
+ýò	 43
+êàì	 43
+ÿë	 43
+_ãî	 43
+äî	 43
+í_	 43
+ÿò	 43
+iõ_	 42
+íûÿ_	 42
+ðò	 42
+ñòâ	 42
+íàé	 42
+êàâ	 42
+ãàçå	 42
+..	 42
+_ãàç	 42
+_ãàçå	 42
+ãàç	 42
+ïåð	 42
+íò	 41
+_áå	 41
+ñå	 41
+ðàâ	 41
+áð	 41
+àðî	 41
+ûö	 41
+íä	 41
+Áåë	 40
+åööà	 40
+äà_	 40
+û.	 40
+iíñê	 40
+ûi	 40
+_ðà	 40
+îëü	 40
+è	 40
+"_	 40
+(	 40
+_Ä	 40
+øà	 40
+òàê	 40
+Ó	 40
+ñÿ_	 40
+iíñ	 40
+_âà	 40
+_(	 40
+àíû	 40
+Áå	 40
+)	 40
+åöö	 40
+íÿ_	 39
+äçi	 39
+_Ó	 39
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/bg-iso_8859_5.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/bg-iso_8859_5.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/bg-iso_8859_5.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 11056
+Ð	 3428
+Ø	 3007
+Õ	 2501
+Þ	 2490
+Ý	 2179
+â	 2166
+à	 1596
+á	 1492
+Ò	 1159
+Ð_	 1144
+Ú	 1093
+Û	 918
+Ô	 803
+Ø_	 803
+ÝÐ	 724
+ß	 720
+×	 702
+Õ_	 642
+Ü	 613
+_Ý	 577
+_á	 569
+Þ_	 556
+.	 537
+ÝØ	 534
+âÕ	 473
+._	 467
+ï	 462
+áâ	 455
+_ß	 452
+_ÝÐ	 446
+,_	 440
+,	 440
+Ó	 439
+Ñ	 432
+ÝÐ_	 422
+ê	 405
+ã	 382
+âÞ	 376
+ÕÝ	 360
+àÐ	 360
+ç	 355
+_Ø	 353
+Ðâ	 334
+âÐ	 330
+â_	 324
+Øâ	 322
+_ÝÐ_	 316
+ÐÝ	 310
+àÕ	 308
+àØ	 305
+ÒÐ	 303
+ÝÞ	 301
+Þâ	 281
+_Ò	 278
+_Þ	 275
+ØâÕ	 262
+ÚÞ	 262
+ßà	 262
+_Ú	 250
+âÞ_	 248
+ÚÐ	 242
+àÞ	 236
+ßÞ	 235
+Ðà	 230
+_Ô	 226
+ÝÕ	 222
+Þá	 216
+æ	 214
+Øï	 210
+âÕ_	 203
+âØ	 198
+_Ø_	 196
+Õâ	 196
+_ßà	 195
+áÚ	 189
+ÕÔ	 189
+ØâÕ_	 189
+Ò_	 186
+ÐÒ	 185
+ÔÐ	 185
+_Õ	 184
+×Ø	 178
+ÞÒ	 177
+ä	 175
+ÛØ	 175
+âÐ_	 172
+ØÚ	 171
+ÐÚ	 170
+_à	 169
+_ßÞ	 169
+_Ñ	 165
+ï_	 163
+×Ð	 162
+Ö	 161
+Õà	 160
+ÝØ_	 159
+ÛÕ	 156
+áÕ	 156
+ÒÕ	 155
+ÕÛ	 154
+_Ò_	 152
+_×	 152
+Ø×	 151
+ÚØ	 151
+_Ü	 150
+ÛÐ	 149
+é	 148
+_Þâ	 146
+ØÝ	 145
+æØ	 143
+ÜØ	 141
+_â	 138
+Ð×	 137
+ÓÐ	 135
+Þà	 134
+Õ×	 133
+_×Ð	 133
+ÞÔ	 131
+ÞÑ	 129
+Ù	 128
+ÐÛ	 127
+_Ó	 126
+ÐâÐ	 124
+Þáâ	 123
+ÔØ	 123
+Øï_	 123
+Øá	 122
+Õá	 121
+_áÕ	 120
+ÕÝØ	 119
+ÞÛ	 118
+ÒØ	 116
+ÒÐ_	 115
+âÝ	 113
+ÝÞ_	 112
+¿	 112
+-	 111
+Þâ_	 111
+ÜÕ	 110
+ÐâÐ_	 109
+Ýâ	 108
+_Þâ_	 108
+Úâ	 108
+ÐÝØ	 107
+ÔÕ	 107
+ÒÞ	 107
+_ÚÞ	 106
+áÕ_	 105
+çÕ	 103
+_¿	 103
+_áÕ_	 101
+Øà	 101
+âÒ	 100
+_ÔÐ	 99
+"	 99
+ØÕ	 99
+ØÜ	 99
+ÜÐ	 98
+áÚØ	 97
+ÕâÞ	 97
+ÐÝÕ	 97
+_Õ_	 97
+ßàÞ	 96
+ÐÚâ	 96
+è	 93
+ÔÐ_	 93
+ÓÞ	 92
+áØ	 92
+ÐàØ	 92
+ÔÞ	 92
+áÛ	 91
+Øæ	 90
+ÛÝ	 90
+Øç	 89
+Õ×Ø	 89
+×Ð_	 89
+ÞÓ	 88
+ÕâÞ_	 88
+_ã	 88
+ÐÜ	 88
+Ø,	 87
+âÕà	 87
+Ðá	 87
+Ø,_	 87
+_ÔÐ_	 85
+_×Ð_	 83
+êÛ	 83
+áâÒ	 83
+Ðâ_	 83
+å	 82
+ØÛ	 81
+Ú_	 81
+_Ø×	 81
+_Ð	 80
+ßàÕ	 80
+ÝØâ	 79
+ÞÝ	 78
+ïâ	 78
+ÝØâÕ	 78
+âà	 78
+Á	 77
+ÕàØ	 77
+ÝÕ_	 77
+ÑØ	 77
+ÚØ_	 76
+_ÝÕ	 76
+ÓÐà	 75
+Øáâ	 75
+ÛÓ	 75
+ØÒ	 75
+ÝÞá	 74
+ÛÞ	 73
+_àÕ	 73
+ÜÞ	 73
+á_	 73
+àÕÔ	 73
+_ßàÞ	 72
+ÑÐ	 72
+ãç	 72
+ÛÓÐà	 72
+ÛÓÐ	 72
+êÛÓ	 71
+Ðä	 71
+Ð,_	 71
+êÛÓÐà	 71
+ÝØâÕ_	 71
+ÒÐÝ	 71
+êÛÓÐ	 71
+Ý_	 71
+Ð,	 71
+êà	 70
+áê	 70
+àÕ×	 70
+ÐÔ	 70
+àÐÝ	 70
+ÕÚ	 70
+_àÐ	 70
+Û_	 69
+çÝ	 68
+ØàÐ	 68
+Óà	 67
+Ýá	 67
+ØæØ	 66
+ÝØï	 66
+ÝÞáâ	 66
+Ü_	 66
+áÐ	 66
+ÕÜ	 65
+àÐ×	 65
+ÚÐâ	 64
+ÞâÞ	 64
+Ñê	 64
+ÝØÕ	 64
+_ç	 64
+âÕàØ	 63
+ÐÒÐ	 63
+_ÚÐ	 63
+_Á	 62
+_±	 62
+ÚÐ_	 62
+±	 62
+ØÚ_	 62
+_.	 62
+çÐ	 61
+ÞÙ	 61
+Òê	 61
+çØ	 61
+ÞÜ	 61
+_áê	 61
+Õáâ	 60
+ÕÝâ	 60
+(	 60
+)	 60
+áâÕ	 59
+ßÕ	 59
+Þß	 59
+âÝÞ	 59
+äÐ	 59
+Ø.	 58
+À	 58
+áâÐ	 58
+_(	 58
+_ßàÕ	 58
+ÔÝ	 58
+àá	 58
+_Û	 57
+ÞâÞ_	 57
+ÓàÐ	 57
+ßàØ	 57
+ØÝÐ	 56
+Ø._	 56
+Úê	 56
+ÝÐâ	 56
+âÕÝ	 56
+_àÐ×	 55
+×Ò	 55
+áâØ	 55
+ÚâÕ	 55
+_á_	 55
+áà	 55
+_,_	 55
+_ÔÞ	 55
+ÑêÛÓÐ	 55
+ÑêÛ	 55
+ÑêÛÓ	 55
+_,	 55
+ØÕ_	 54
+ÐÚâÕà	 54
+È	 54
+ÐÚâÕ	 54
+_-	 54
+ÚâÕà	 54
+-_	 53
+áÚÐ	 53
+ãá	 53
+áâ_	 53
+ÚâÕàØ	 53
+áâÞ	 53
+_áà	 53
+ÕÒ	 53
+_Ñê	 52
+âÕÛ	 52
+ÛÝØ	 52
+_-_	 52
+ØÞ	 51
+_È	 51
+Ðß	 51
+Þ×	 51
+Ô_	 50
+_À	 50
+äÐà	 50
+ÒÐâ	 50
+ØØ	 50
+ž	 50
+_ßàØ	 50
+_áÛ	 50
+_"	 50
+ÞÚ	 49
+_ÑÐ	 49
+áß	 49
+áâÕÝ	 49
+ØÐ	 48
+ÛÕÔ	 48
+áÚØ_	 48
+àØÚ	 48
+ÑÐÚâÕ	 48
+_áÐ	 48
+ÈÐ	 48
+_._	 48
+ÑÐÚ	 48
+àã	 48
+ÑÐÚâ	 48
+Òï	 48
+ØáâÕ	 48
+ÛÐÒ	 47
+Úà	 47
+œ	 47
+äÐàØÚ	 47
+_ÈÐ	 47
+äÐàØ	 47
+ÐäÐ	 47
+ÐäÐàØ	 47
+Ðàá	 47
+ÐäÐà	 47
+ÐàØÚ	 47
+ÈÐä	 47
+àáÚ	 47
+âÝØ	 46
+ÈÐäÐ	 46
+_ÈÐä	 46
+ÐÝÕ_	 46
+ÞÒÕ	 46
+ÈÐäÐà	 46
+_ÈÐäÐ	 45
+ÐâÞ	 45
+Øïâ	 45
+ÞØ	 45
+ïÝ	 45
+ÕÝØÕ	 45
+_áâ	 45
+éÐ	 45
+ÕÝ_	 45
+ÑÞ	 45
+×Øá	 45
+×ØÚ	 45
+âÕÝâ	 44
+ØáâÕÝ	 44
+_ÑêÛ	 44
+áâÕÝâ	 44
+_ÑêÛÓ	 44
+ÚÞ_	 44
+ÝØï_	 44
+ÝáÚ	 44
+àØ_	 44
+ÝÐâÐ	 44
+Â	 43
+×Øáâ	 43
+Ðáâ	 43
+×ØáâÕ	 43
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/cs-iso_8859_2.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/cs-iso_8859_2.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/cs-iso_8859_2.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 26378
+o	 5870
+e	 5354
+a	 4740
+n	 4462
+t	 3745
+s	 3438
+i	 3187
+v	 3118
+l	 2891
+r	 2754
+k	 2566
+d	 2508
+m	 2198
+u	 2197
+p	 2032
+í	 1924
+c	 1678
+h	 1572
+z	 1544
+á	 1522
+_p	 1299
+e_	 1266
+y	 1231
+a_	 1219
+j	 1219
+_s	 1156
+b	 1079
+o_	 1065
+ì	 1043
+_v	 1038
+,	 952
+,_	 946
+st	 945
+_n	 911
+é	 878
+.	 870
+í_	 848
+ø	 822
+._	 803
+ní	 782
+ov	 757
+_z	 723
+i_	 716
+u_	 684
+ro	 674
+en	 656
+ý	 647
+Ÿ	 639
+po	 630
+ch	 629
+è	 625
+na	 599
+_a	 598
+sk	 592
+¹	 563
+ho	 552
+_d	 551
+ra	 545
+m_	 539
+y_	 530
+_t	 512
+ko	 504
+_k	 503
+le	 502
+_j	 501
+_o	 486
+to	 479
+pr	 471
+ne	 468
+ní_	 462
+je	 458
+é_	 456
+ti	 455
+od	 433
+li	 432
+va	 432
+_po	 429
+_m	 428
+al	 424
+te	 424
+ou	 423
+ed	 418
+se	 415
+la	 410
+no	 397
+os	 382
+lo	 377
+an	 376
+_pr	 375
+ù	 375
+v_	 372
+øe	 370
+_a_	 364
+em	 363
+at	 360
+ta	 359
+do	 357
+t_	 357
+_b	 355
+or	 349
+h_	 345
+_v_	 338
+ch_	 327
+S	 325
+ce	 323
+av	 323
+pø	 322
+ni	 319
+ké	 316
+er	 315
+nì	 315
+_na	 313
+na_	 312
+_ne	 311
+de	 308
+ic	 307
+in	 306
+_se	 306
+l_	 304
+dn	 302
+za	 298
+_pø	 293
+ì_	 291
+ol	 290
+_je	 281
+ob	 280
+is	 277
+ve	 274
+ho_	 272
+es	 270
+ot	 268
+ak	 265
+vo	 263
+ná	 260
+il	 257
+se_	 257
+it	 256
+et	 253
+ad	 250
+by	 249
+P	 242
+_r	 242
+k_	 242
+ost	 241
+_se_	 241
+tr	 238
+me	 237
+pro	 234
+Ÿe	 234
+ka	 230
+_za	 227
+om	 224
+el	 223
+_P	 223
+on	 218
+_pro	 216
+ou_	 216
+tu	 215
+O	 212
+mi	 212
+ku	 211
+_u	 210
+_do	 208
+_l	 207
+_na_	 206
+N	 205
+ské	 205
+ím	 205
+íc	 205
+ý_	 203
+mì	 203
+_S	 200
+oz	 200
+V	 200
+ze	 198
+da	 194
+sl	 192
+á_	 191
+ova	 190
+mo	 190
+re	 189
+so	 187
+vy	 186
+ej	 185
+rá	 184
+ar	 184
+s_	 183
+vì	 183
+A	 181
+ru	 180
+_st	 178
+f	 178
+éh	 177
+ého	 176
+kt	 176
+tn	 175
+g	 174
+bo	 174
+ez	 173
+ci	 172
+ký	 172
+né	 170
+M	 170
+án	 169
+as	 168
+vi	 167
+øi	 167
+ac	 166
+Ÿe_	 165
+ýc	 165
+Ÿ_	 165
+ck	 164
+K	 164
+B	 164
+ých	 164
+vá	 162
+_c	 162
+ého_	 162
+ení	 161
+lá	 160
+_Ÿ	 160
+øí	 160
+pøe	 159
+ec	 158
+ù_	 157
+J	 156
+vn	 156
+_h	 155
+ké_	 155
+ok	 154
+sta	 154
+to_	 152
+vý	 152
+nt	 151
+ých_	 149
+lo_	 149
+_by	 149
+dy	 149
+_pøe	 148
+ce_	 147
+R	 146
+n_	 146
+ád	 146
+pa	 145
+vé	 145
+am	 145
+mu	 145
+ný	 145
+ud	 144
+_è	 144
+_B	 142
+ter	 141
+nì_	 141
+èe	 140
+¹e	 140
+_V	 140
+_ko	 140
+li_	 139
+dì	 137
+hl	 137
+je_	 137
+ji	 137
+ist	 135
+jí	 135
+-	 134
+ik	 133
+si	 133
+ál	 132
+em_	 132
+_to	 132
+_vy	 131
+sp	 130
+ut	 130
+_J	 130
+_Ÿe	 130
+_M	 129
+di	 129
+kon	 128
+la_	 128
+tí	 128
+_ro	 127
+ns	 127
+ek	 126
+ick	 126
+T	 126
+yl	 125
+èn	 125
+rn	 125
+_Ÿe_	 124
+op	 124
+sti	 124
+kte	 124
+øed	 124
+edn	 123
+us	 121
+ím_	 120
+"	 119
+z_	 119
+str	 118
+ti_	 118
+ém	 118
+vat	 118
+d_	 118
+_ve	 118
+áv	 118
+ení_	 117
+iv	 117
+oj	 117
+_kt	 117
+ìl	 117
+val	 116
+eb	 116
+_K	 115
+tø	 115
+_kte	 115
+át	 115
+_i	 114
+_N	 114
+D	 114
+kl	 114
+ny	 114
+byl	 113
+ev	 113
+ri	 113
+ú	 113
+ky	 111
+sm	 111
+oh	 111
+E	 110
+ma	 110
+ìt	 110
+ský	 110
+kter	 109
+nu	 109
+le_	 108
+ja	 107
+zá	 107
+tì	 106
+tá	 106
+zn	 106
+let	 105
+aj	 105
+sto	 105
+¹í	 105
+me_	 105
+-_	 105
+u,	 105
+sv	 104
+_le	 104
+pol	 104
+L	 104
+_-	 104
+ln	 104
+pod	 104
+H	 103
+zi	 103
+kéh	 103
+kého	 103
+_ná	 103
+ent	 102
+u,_	 102
+_od	 102
+né_	 101
+_-_	 101
+al_	 101
+_kter	 101
+do_	 100
+nos	 100
+cí	 100
+rav	 99
+ran	 99
+_sv	 99
+ká	 98
+eè	 98
+ním	 98
+bu	 97
+_z_	 97
+ích	 97
+_byl	 97
+ání	 96
+rov	 96
+kr	 96
+dá	 95
+ové	 95
+dl	 95
+uj	 95
+nost	 95
+ém_	 95
+ech	 94
+ly	 94
+oc	 94
+vé_	 93
+_o_	 93
+dy_	 93
+ak_	 93
+nsk	 93
+_so	 93
+_ob	 92
+nc	 92
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/da-iso_8859_1.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/da-iso_8859_1.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/da-iso_8859_1.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 21274
+e	 9291
+r	 5307
+n	 4733
+i	 3976
+t	 3948
+s	 3751
+a	 3296
+l	 3063
+d	 3025
+o	 2868
+g	 2471
+er	 2164
+k	 2002
+m	 1680
+e_	 1655
+en	 1613
+f	 1507
+de	 1484
+r_	 1379
+v	 1245
+u	 1176
+t_	 1081
+n_	 1032
+er_	 992
+b	 942
+.	 870
+ge	 868
+._	 831
+re	 816
+h	 816
+et	 813
+te	 813
+p	 806
+in	 788
+or	 775
+_s	 753
+_a	 749
+en_	 712
+_e	 691
+ti	 689
+an	 687
+,	 681
+,_	 677
+_f	 655
+_d	 645
+el	 642
+ng	 635
+nd	 634
+g_	 634
+se	 615
+le	 615
+st	 607
+s_	 601
+_o	 572
+ne	 560
+li	 537
+et_	 524
+es	 521
+_i	 512
+ri	 511
+sk	 510
+_de	 498
+å	 497
+ar	 475
+ed	 473
+ig	 463
+at	 452
+_m	 446
+is	 443
+fo	 441
+æ	 441
+ve	 438
+_k	 434
+ø	 432
+der	 429
+ke	 428
+ing	 427
+og	 426
+_b	 412
+me	 408
+il	 407
+for	 405
+ns	 394
+y	 389
+_h	 380
+_t	 374
+on	 371
+d_	 370
+al	 362
+be	 359
+_fo	 351
+af	 336
+de_	 335
+_og	 333
+_p	 332
+og_	 325
+om	 325
+_for	 324
+_og_	 313
+l_	 308
+nge	 302
+i_	 295
+_v	 294
+c	 289
+ter	 283
+ll	 280
+ni	 278
+nde	 278
+rs	 277
+_af	 277
+un	 275
+ra	 271
+ko	 271
+den	 270
+_i_	 268
+id	 265
+til	 265
+j	 265
+vi	 264
+D	 260
+ere	 256
+ma	 255
+si	 253
+f_	 252
+af_	 238
+_af_	 235
+ik	 235
+m_	 234
+å_	 232
+_ti	 227
+_D	 226
+_u	 226
+_er	 225
+nt	 224
+_en	 224
+ls	 221
+es_	 216
+lig	 216
+ger	 216
+re_	 210
+ag	 210
+_me	 207
+at_	 204
+lle	 200
+ge_	 200
+_til	 200
+ige	 199
+_er_	 199
+der_	 199
+em	 199
+ds	 197
+r.	 195
+io	 195
+r._	 195
+ud	 193
+_at	 192
+_at_	 191
+ta	 190
+els	 190
+_l	 190
+ha	 190
+il_	 189
+or_	 189
+ke_	 186
+rt	 185
+gen	 184
+ka	 183
+-	 180
+rk	 180
+ning	 178
+ol	 178
+nin	 178
+la	 177
+ld	 175
+De	 175
+it	 173
+ede	 172
+ed_	 171
+_ko	 171
+lse	 171
+ek	 168
+else	 167
+inge	 167
+på	 167
+ng_	 167
+_på	 167
+iv	 166
+ør	 166
+so	 165
+he	 165
+ens	 165
+ske	 165
+ind	 164
+til_	 163
+rn	 163
+ide	 162
+ev	 162
+den_	 162
+to	 162
+sen	 160
+_be	 160
+sa	 160
+bl	 158
+_g	 158
+an_	 157
+det	 156
+om_	 156
+ru	 156
+va	 155
+_til_	 155
+ste	 154
+rd	 153
+_på_	 152
+k_	 152
+på_	 152
+di	 152
+kr	 152
+K	 151
+_De	 149
+for_	 148
+te_	 148
+kon	 148
+ver	 147
+mm	 146
+am	 146
+_en_	 145
+_r	 145
+ne_	 144
+ing_	 144
+tr	 143
+le_	 142
+del	 142
+_in	 142
+gt	 140
+_st	 138
+S	 138
+eg	 138
+gs	 138
+tt	 138
+r,	 137
+ser	 137
+r,_	 137
+er.	 137
+ro	 137
+er._	 137
+_for_	 136
+ent	 136
+kt	 136
+eri	 135
+ur	 134
+lin	 134
+B	 133
+A	 133
+sti	 133
+ner	 133
+da	 133
+ris	 132
+ion	 132
+_K	 131
+ern	 131
+ers	 130
+ist	 130
+ær	 130
+ige_	 130
+_si	 130
+tte	 129
+E	 128
+_n	 128
+nn	 127
+_B	 126
+_ha	 126
+_.	 126
+rne	 125
+H	 125
+_ud	 125
+rin	 124
+na	 124
+und	 124
+ft	 124
+_der	 124
+ku	 123
+_A	 122
+ler	 120
+and	 120
+end	 120
+ns_	 120
+rg	 119
+op	 119
+er,_	 119
+er,	 119
+ar_	 118
+P	 118
+_S	 117
+_H	 117
+_._	 116
+ov	 116
+erne	 115
+tio	 115
+med	 115
+tion	 115
+_E	 115
+_P	 115
+det_	 114
+pr	 114
+e.	 113
+ter_	 113
+:	 113
+kk	 113
+e._	 113
+e,_	 113
+e,	 113
+od	 113
+kke	 113
+ten	 113
+ling	 113
+:_	 112
+mi	 112
+eli	 112
+lo	 111
+som	 111
+_den	 111
+rb	 110
+se_	 110
+ell	 110
+sid	 110
+nne	 109
+fi	 108
+lt	 107
+v_	 107
+_de_	 107
+ark	 106
+lige	 106
+ngen	 106
+ie	 105
+_med	 105
+_der_	 105
+ring	 105
+a_	 105
+_vi	 104
+-_	 104
+ys	 103
+gel	 103
+_so	 103
+ia	 103
+ive	 102
+ej	 101
+ati	 101
+ren	 101
+_det	 101
+side	 101
+ske_	 101
+br	 100
+gi	 100
+F	 100
+M	 100
+ul	 99
+isk	 99
+men	 99
+n,_	 99
+age	 99
+fr	 99
+n,	 99
+tu	 98
+ts	 98
+_ma	 98
+nder	 98
+ot	 97
+dt	 97
+R	 97
+med_	 96
+ho	 96
+ans	 95
+_kon	 95
+pe	 95
+ce	 94
+gr	 93
+mme	 92
+ret	 92
+lige_	 92
+mu	 91
+_med_	 91
+hv	 91
+væ	 91
+Det	 91
+ens_	 91
+kl	 91
+_M	 90
+T	 90
+ingen	 90
+rm	 90
+ill	 89
+elle	 89
+ef	 89
+ene	 89
+nds	 89
+ove	 89
+som_	 89
+C	 88
+_den_	 88
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/de-iso_8859_1.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/de-iso_8859_1.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/de-iso_8859_1.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 31586
+e	 15008
+n	 9058
+i	 7299
+r	 6830
+t	 5662
+s	 5348
+a	 4618
+h	 4176
+d	 4011
+er	 3415
+en	 3412
+u	 3341
+l	 3266
+n_	 2848
+c	 2636
+ch	 2460
+g	 2407
+o	 2376
+e_	 2208
+r_	 2128
+m	 2077
+_d	 1948
+de	 1831
+en_	 1786
+ei	 1718
+er_	 1570
+in	 1568
+te	 1505
+ie	 1505
+b	 1458
+t_	 1425
+f	 1306
+k	 1176
+ge	 1144
+s_	 1137
+un	 1113
+,	 1104
+,_	 1099
+w	 1099
+z	 1060
+nd	 1039
+he	 1004
+st	 989
+_s	 952
+_de	 949
+.	 909
+_e	 906
+ne	 906
+der	 880
+._	 847
+be	 841
+es	 829
+ic	 796
+_a	 791
+ie_	 779
+is	 769
+ich	 763
+an	 755
+re	 749
+di	 732
+ein	 730
+se	 730
+"	 720
+ng	 709
+_i	 706
+sc	 683
+sch	 681
+it	 673
+der_	 652
+h_	 651
+ch_	 642
+S	 630
+le	 609
+p	 609
+ä	 607
+ü	 603
+au	 603
+v	 602
+che	 599
+_w	 596
+d_	 585
+die	 576
+_di	 572
+m_	 562
+_die	 559
+el	 548
+_S	 540
+_der	 529
+li	 527
+_der_	 523
+si	 515
+al	 514
+ns	 507
+on	 501
+or	 495
+ti	 490
+ten	 487
+ht	 486
+die_	 485
+_die_	 483
+D	 479
+rt	 478
+nd_	 476
+_u	 470
+nt	 468
+A	 466
+in_	 464
+den	 461
+cht	 447
+und	 443
+me	 440
+_z	 429
+ung	 426
+ll	 423
+_un	 421
+_ei	 419
+_n	 415
+hr	 412
+ine	 412
+_A	 408
+_ein	 405
+ar	 404
+ra	 403
+_v	 400
+_g	 400
+as	 395
+zu	 392
+et	 389
+em	 385
+_D	 380
+eine	 376
+gen	 376
+g_	 376
+da	 368
+we	 366
+K	 365
+lt	 360
+B	 354
+_"	 353
+nde	 349
+ni	 347
+und_	 345
+E	 345
+ur	 345
+_m	 342
+ri	 341
+ha	 340
+eh	 339
+ten_	 338
+es_	 336
+_K	 336
+_und	 335
+ig	 335
+_b	 335
+hen	 334
+_und_	 332
+_au	 329
+_B	 327
+_da	 325
+_zu	 324
+_in	 322
+at	 321
+us	 318
+wi	 307
+n,	 305
+n,_	 304
+nn	 304
+te_	 301
+eit	 301
+_h	 300
+ter	 299
+M	 298
+n.	 295
+ß	 294
+ng_	 289
+sche	 289
+-	 283
+rs	 282
+den_	 282
+_si	 280
+G	 280
+im	 278
+_ge	 277
+chen	 276
+rd	 273
+_E	 273
+n._	 270
+icht	 270
+rn	 268
+uf	 267
+isch	 264
+isc	 264
+nen	 263
+_in_	 262
+_M	 260
+_er	 257
+ich_	 255
+ac	 253
+lic	 252
+_G	 252
+ber	 252
+la	 251
+vo	 251
+eb	 250
+ke	 249
+F	 248
+as_	 248
+hen_	 248
+ach	 245
+en,	 244
+ung_	 243
+lich	 243
+ste	 243
+en,_	 243
+_k	 241
+ben	 241
+_f	 241
+en.	 241
+_be	 239
+it_	 239
+L	 238
+_se	 237
+mi	 236
+ve	 236
+na	 236
+on_	 236
+P	 235
+ss	 234
+ist	 234
+ö	 234
+ht_	 233
+ru	 233
+st_	 229
+_F	 229
+ts	 227
+ab	 226
+W	 226
+ol	 225
+_eine	 225
+hi	 225
+so	 224
+em_	 223
+"_	 223
+ren	 222
+en._	 221
+chen_	 221
+R	 221
+ta	 221
+ere	 220
+ische	 219
+ers	 218
+ert	 217
+_P	 217
+tr	 217
+ed	 215
+ze	 215
+eg	 215
+ens	 215
+ür	 213
+ah	 212
+_vo	 212
+ne_	 211
+cht_	 210
+uc	 209
+_wi	 209
+nge	 208
+lle	 208
+fe	 207
+_L	 207
+ver	 206
+hl	 205
+V	 204
+ma	 203
+wa	 203
+auf	 201
+H	 198
+_W	 195
+T	 195
+nte	 193
+uch	 193
+l_	 192
+sei	 192
+nen_	 190
+u_	 189
+_den	 189
+_al	 189
+_V	 188
+t.	 188
+lte	 187
+ut	 186
+ent	 184
+sich	 183
+sic	 183
+il	 183
+ier	 182
+am	 181
+gen_	 180
+sen	 179
+fü	 178
+um	 178
+t._	 177
+f_	 174
+he_	 174
+ner	 174
+nst	 174
+ls	 174
+_sei	 173
+ro	 173
+ir	 173
+ebe	 173
+mm	 173
+ag	 172
+ern	 169
+t,_	 169
+t,	 169
+eu	 169
+ft	 168
+icht_	 167
+hre	 167
+Be	 166
+nz	 165
+nder	 165
+_T	 164
+_den_	 164
+iche	 163
+tt	 163
+zu_	 162
+and	 162
+J	 161
+rde	 160
+rei	 160
+_we	 159
+_H	 159
+ige	 159
+_Be	 158
+rte	 157
+hei	 156
+das	 155
+aus	 155
+che_	 154
+_das	 154
+_zu_	 154
+tz	 154
+_ni	 153
+das_	 153
+_R	 153
+N	 153
+des	 153
+_ve	 153
+_J	 152
+I	 152
+_das_	 152
+men	 151
+_so	 151
+_ver	 151
+_auf	 150
+ine_	 150
+_ha	 150
+rg	 149
+ind	 148
+eben	 148
+kt	 147
+mit	 147
+_an	 147
+her	 146
+Ge	 146
+Sc	 145
+_sich	 145
+U	 145
+Sch	 145
+_sic	 145
+end	 145
+Di	 144
+abe	 143
+ck	 143
+sse	 142
+ür_	 142
+ell	 142
+ik	 141
+o_	 141
+nic	 141
+nich	 141
+sa	 141
+_fü	 140
+hn	 140
+zi	 140
+no	 140
+nicht	 140
+im_	 139
+von_	 139
+von	 139
+_nic	 139
+_nich	 139
+eine_	 139
+oc	 138
+wei	 138
+io	 138
+schen	 138
+gt	 138
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/el-iso_8859_7.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/el-iso_8859_7.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/el-iso_8859_7.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 89284
+á	 19666
+ô	 16086
+ï	 15826
+å	 14848
+é	 12766
+í	 12189
+ð	 8776
+ó	 8653
+ñ	 8399
+ê	 7761
+ì	 7529
+õ	 6850
+Ü	 6284
+_ô	 5918
+ë	 5802
+ò	 5371
+á_	 5272
+ç	 5236
+Ý	 4739
+ß	 4609
+ü	 4489
+ôï	 4461
+ò_	 4111
+ïõ	 4075
+é_	 4033
+å_	 4019
+.	 3916
+_ê	 3897
+ï_	 3836
+._	 3810
+í_	 3661
+_ð	 3414
+_ó	 3333
+"	 3247
+_ì	 3242
+_ôï	 3118
+,	 3106
+,_	 3068
+ã	 3058
+_á	 2912
+ù	 2689
+íá	 2593
+ä	 2455
+ôá	 2420
+÷	 2411
+êá	 2406
+óô	 2406
+_å	 2353
+-	 2335
+-_	 2192
+ý	 2171
+áí	 2162
+ôç	 2151
+Þ	 2141
+õ_	 2133
+áé	 2100
+è	 2053
+ö	 1989
+ïõ_	 1974
+åé	 1889
+_êá	 1882
+åß	 1864
+ôï_	 1802
+ðï	 1771
+áé_	 1727
+óå	 1709
+_í	 1647
+_"	 1619
+ç_	 1609
+éá	 1602
+íá_	 1518
+ôé	 1501
+ïí	 1501
+ôïõ	 1495
+ìå	 1460
+_ôïõ	 1407
+_Ý	 1405
+_óô	 1396
+þ	 1364
+ðå	 1359
+ôå	 1300
+ìá	 1298
+â	 1274
+ñé	 1252
+ü_	 1241
+_ä	 1231
+î	 1223
+íô	 1220
+_ôï_	 1196
+áð	 1187
+ñï	 1184
+_ã	 1183
+_ôç	 1177
+æ	 1158
+_åß	 1150
+Ü_	 1150
+_íá	 1124
+Ýí	 1115
+êáé	 1110
+_êáé	 1093
+áí_	 1082
+ñá	 1078
+êáé_	 1061
+_íá_	 1060
+_êáé_	 1053
+ìð	 1049
+íï	 1048
+áô	 1036
+éï	 1024
+éá_	 1018
+åñ	 1003
+ïý	 993
+_áð	 984
+óå_	 974
+éê	 973
+_ï	 967
+åí	 947
+ïò	 936
+åé_	 935
+ðü	 901
+ëï	 892
+_ìå	 890
+íå	 884
+ôïõ_	 871
+ïí_	 869
+áò	 865
+_ôïõ_	 854
+áó	 841
+ìå_	 840
+óá	 834
+êï	 833
+áñ	 832
+ðñ	 824
+ßí	 820
+êÜ	 808
+_ðï	 804
+ðé	 796
+Ê	 796
+ìÝ	 783
+ìï	 777
+Ýñ	 772
+áë	 766
+çí	 762
+Ì	 759
+éó	 745
+êå	 742
+ôá_	 740
+óôï	 738
+ù_	 730
+çí_	 728
+Ï	 717
+Ô	 714
+_ö	 711
+åô	 705
+äå	 704
+ðá	 697
+áò_	 688
+ôÜ	 684
+ïò_	 683
+_ü	 680
+_Ê	 675
+ïé	 671
+_÷	 670
+ôçí	 663
+ôçí_	 658
+_óôï	 647
+Þ_	 645
+ðü_	 638
+_è	 633
+_ï_	 631
+",	 630
+_ðñ	 626
+_Ì	 624
+ßð	 624
+Üí	 623
+",_	 623
+áðü	 620
+ðïõ	 619
+üô	 618
+ëá	 617
+ôïí	 617
+_áðü	 616
+ìé	 612
+Ï_	 611
+ñå	 607
+õô	 604
+ëå	 595
+_ë	 594
+ñü	 590
+_ìå_	 586
+éÜ	 580
+ôïí_	 577
+ãé	 577
+_Ï	 575
+áðü_	 572
+Üñ	 570
+ðÜ	 570
+_áðü_	 569
+ñÜ	 562
+ôáí	 554
+Ýíá	 553
+õí	 552
+ðïõ_	 551
+äé	 547
+ôñ	 547
+ôü	 544
+_â	 540
+÷å	 536
+åí_	 534
+çó	 528
+_Ï_	 525
+çò	 520
+".	 519
+_ðïõ	 516
+_Ô	 515
+"._	 513
+ôç_	 512
+ò.	 510
+åßð	 508
+ôáí_	 504
+_åßð	 503
+ò._	 501
+_ôá	 500
+îå	 497
+óôï_	 496
+ëë	 493
+áê	 492
+Á	 491
+_ðïõ_	 490
+Üë	 489
+ßðå	 489
+åßðå	 485
+_åßðå	 483
+_ôçí	 483
+ôé_	 482
+_ôçí_	 481
+Üô	 480
+ëé	 480
+_äå	 479
+Üì	 477
+_óôï_	 475
+óï	 473
+_Ü	 468
+"_	 463
+ìÝí	 463
+éí	 461
+éò	 452
+_áí	 452
+êü	 451
+áõ	 451
+_ôïí	 450
+_ãé	 449
+èá	 447
+åò	 446
+óç	 446
+_ìé	 445
+_ôïí_	 443
+å.	 441
+å._	 441
+ïõò	 439
+ëÜ	 439
+õò	 439
+ïë	 438
+ðéï	 437
+ïñ	 432
+_ðá	 428
+_êÜ	 427
+ôå_	 427
+áì	 423
+;	 423
+_ìï	 422
+óê	 421
+ôçò	 421
+_î	 418
+óôç	 415
+ÊÜ	 411
+íç	 408
+ãéá	 405
+á.	 403
+êñ	 402
+êé	 402
+ò,	 402
+ò,_	 401
+á._	 398
+çê	 397
+_ÊÜ	 397
+åë	 396
+_Ýí	 395
+_Þ	 393
+_ìá	 392
+ßá	 391
+ùò	 391
+ëç	 390
+ßíá	 389
+ðß	 389
+ìïõ	 388
+ìÜ	 388
+_áõ	 387
+çò_	 386
+óõ	 384
+íáé	 384
+Ð	 383
+áõô	 382
+ß_	 376
+ìðé	 375
+ßó	 372
+_ôçò	 370
+_ôá_	 367
+_ãéá	 365
+_Ýíá	 362
+_ìð	 361
+èå	 361
+éïí	 359
+éò_	 358
+ôÞ	 358
+_èá	 354
+_áõô	 354
+Üìð	 352
+ê.	 352
+ê._	 351
+åßí	 351
+ïì	 350
+ßíáé	 348
+íôá	 348
+íáé_	 348
+ùò_	 347
+÷á	 346
+Å	 346
+õ.	 346
+ãéá_	 346
+õ._	 345
+äåí	 345
+Ýíá_	 345
+á,	 344
+á,_	 344
+äåí_	 344
+ýñ	 343
+üí	 343
+á-	 342
+ýó	 341
+_ê.	 340
+óôå	 339
+ÊÜì	 339
+_ê._	 339
+ôÝ	 339
+á-_	 338
+åõ	 338
+éë	 338
+ñß	 338
+ÊÜìð	 338
+_ìïõ	 338
+_ÊÜì	 338
+_ÊÜìð	 337
+õì	 336
+óåé	 336
+ðéïí	 336
+ìðéïí	 336
+ìðéï	 336
+_êï	 334
+ÊÜìðé	 334
+_ç	 334
+Üìðé	 334
+èá_	 333
+íé	 332
+ôçò_	 331
+ø	 331
+üì	 330
+çóå	 330
+_óá	 329
+ìá_	 328
+üò	 328
+Ó	 326
+_äåí	 325
+_äåí_	 325
+óì	 324
+åò_	 324
+ðåñ	 324
+ß÷	 323
+ßíáé_	 323
+ôéê	 322
+_ñ	 321
+Üìðéï	 321
+õò_	 321
+ïõò_	 321
+_ðå	 321
+óù	 320
+_ãéá_	 320
+ðñï	 320
+ãå	 318
+;"	 316
+;"_	 316
+Ä	 315
+ôõ	 314
+ñá_	 313
+_óõ	 312
+ñù	 312
+_èá_	 310
+üó	 309
+ïõ.	 309
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/en-iso_8859_1.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/en-iso_8859_1.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/en-iso_8859_1.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 20326
+e	 6617
+t	 4843
+o	 3834
+n	 3653
+i	 3602
+a	 3433
+s	 2945
+r	 2921
+h	 2507
+e_	 2000
+d	 1816
+_t	 1785
+c	 1639
+l	 1635
+th	 1535
+he	 1351
+_th	 1333
+u	 1309
+f	 1253
+m	 1175
+p	 1151
+_a	 1145
+the	 1142
+_the	 1060
+s_	 978
+er	 968
+_o	 967
+he_	 928
+d_	 888
+t_	 885
+the_	 844
+_the_	 843
+on	 842
+in	 817
+y	 783
+n_	 773
+b	 761
+re	 754
+,	 734
+,_	 732
+an	 732
+g	 728
+w	 718
+_i	 707
+en	 676
+f_	 599
+y_	 595
+of	 594
+_of	 592
+es	 589
+ti	 587
+v	 580
+_of_	 575
+of_	 575
+nd	 568
+at	 549
+r_	 540
+_w	 534
+it	 522
+ed	 496
+_p	 494
+nt	 485
+_c	 462
+o_	 457
+io	 450
+_an	 439
+te	 432
+or	 425
+_b	 418
+nd_	 407
+to	 406
+st	 402
+is	 401
+_s	 396
+_in	 389
+ion	 385
+and	 385
+de	 384
+ve	 382
+ha	 375
+ar	 366
+_m	 361
+and_	 360
+_and	 360
+_and_	 358
+se	 353
+_to	 347
+me	 346
+to_	 344
+ed_	 339
+.	 330
+be	 329
+_f	 329
+._	 329
+_to_	 320
+co	 317
+ic	 316
+ns	 308
+al	 307
+le	 304
+ou	 304
+ce	 293
+ent	 279
+l_	 278
+_co	 277
+tio	 275
+on_	 274
+_d	 274
+tion	 268
+ri	 266
+_e	 264
+ng	 253
+hi	 251
+er_	 249
+ea	 246
+as	 245
+_be	 242
+pe	 242
+h_	 234
+_r	 232
+ec	 227
+ch	 223
+ro	 222
+ct	 220
+_h	 219
+pr	 217
+in_	 217
+ne	 214
+ll	 214
+rt	 213
+s,_	 210
+s,	 210
+li	 209
+ra	 208
+T	 207
+wh	 204
+a_	 203
+ac	 201
+_wh	 199
+_n	 196
+ts	 196
+di	 196
+es_	 195
+si	 194
+re_	 193
+at_	 192
+nc	 192
+ie	 190
+_a_	 188
+_in_	 185
+ing	 184
+us	 182
+_re	 182
+g_	 179
+ng_	 178
+op	 178
+con	 177
+tha	 175
+_l	 174
+_tha	 174
+ver	 173
+ma	 173
+ion_	 171
+_con	 171
+ci	 170
+ons	 170
+_it	 170
+po	 169
+ere	 168
+is_	 167
+ta	 167
+la	 166
+_pr	 165
+fo	 164
+ho	 164
+ir	 162
+ss	 161
+men	 160
+be_	 160
+un	 159
+ty	 159
+_be_	 158
+ing_	 157
+om	 156
+ot	 156
+hat	 155
+ly	 155
+_g	 155
+em	 153
+_T	 151
+rs	 150
+mo	 148
+ch_	 148
+wi	 147
+we	 147
+ad	 147
+ts_	 145
+res	 143
+_wi	 143
+I	 143
+hat_	 142
+ei	 141
+ly_	 141
+ni	 140
+os	 140
+ca	 139
+ur	 139
+A	 138
+ut	 138
+that	 138
+_that	 137
+ati	 137
+_fo	 137
+st_	 137
+il	 136
+or_	 136
+for	 136
+pa	 136
+ul	 135
+ate	 135
+ter	 134
+it_	 134
+nt_	 133
+that_	 132
+_ha	 129
+al_	 128
+el	 128
+as_	 127
+ll_	 127
+_ma	 125
+no	 124
+ment	 124
+an_	 124
+tion_	 122
+su	 122
+bl	 122
+_de	 122
+nce	 120
+pl	 120
+fe	 119
+tr	 118
+so	 118
+int	 115
+ov	 114
+e,	 114
+e,_	 114
+_u	 113
+ent_	 113
+Th	 113
+her	 113
+j	 112
+atio	 112
+ation	 112
+_Th	 111
+le_	 110
+ai	 110
+_it_	 110
+_on	 110
+_for	 109
+ect	 109
+k	 109
+hic	 108
+est	 108
+der	 107
+tu	 107
+na	 106
+_by_	 106
+by_	 106
+E	 106
+by	 106
+_by	 106
+ve_	 106
+_di	 106
+en_	 104
+vi	 104
+m_	 103
+_whi	 102
+iv	 102
+whi	 102
+ns_	 102
+_A	 101
+ich	 100
+ge	 100
+pro	 99
+ess	 99
+_whic	 99
+ers	 99
+hich	 99
+ce_	 99
+which	 99
+whic	 99
+all	 98
+ove	 98
+_is	 98
+ich_	 97
+ee	 97
+hich_	 97
+n,_	 96
+n,	 96
+im	 95
+ir_	 94
+hei	 94
+ions	 94
+sti	 94
+se_	 94
+per	 93
+The	 93
+_pa	 93
+heir	 93
+id	 93
+eir	 93
+eir_	 93
+ig	 93
+heir_	 93
+_no	 93
+ev	 93
+era	 92
+_int	 92
+ted	 91
+_The	 91
+ies	 91
+art	 91
+thei	 90
+_ar	 90
+_thei	 90
+their	 90
+_pro	 90
+et	 89
+_pe	 88
+_mo	 88
+ther	 88
+x	 87
+gh	 87
+S	 87
+_is_	 87
+ol	 87
+ty_	 87
+_I	 86
+nde	 86
+am	 86
+rn	 86
+nte	 86
+mp	 85
+_su	 84
+_we	 84
+par	 84
+_v	 84
+pu	 82
+his	 82
+ow	 82
+mi	 82
+go	 81
+N	 81
+ue	 81
+ple	 81
+ep	 80
+ab	 80
+;_	 80
+;	 80
+ex	 80
+ain	 80
+over	 80
+_un	 79
+q	 79
+qu	 79
+pp	 79
+ith	 79
+ry	 79
+_as	 79
+ber	 79
+ub	 78
+av	 78
+uc	 78
+s._	 77
+s.	 77
+enc	 77
+are	 77
+iti	 77
+gr	 76
+his_	 76
+ua	 76
+part	 76
+ff	 75
+eve	 75
+O	 75
+rea	 74
+ous	 74
+ia	 74
+The_	 73
+ag	 73
+mb	 73
+_go	 73
+fa	 72
+on,_	 72
+ern	 72
+t,_	 72
+on,	 72
+t,	 72
+_me	 71
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/es-iso_8859_1.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/es-iso_8859_1.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/es-iso_8859_1.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 25044
+e	 7830
+a	 7437
+o	 5102
+s	 4394
+n	 4358
+i	 4065
+r	 3998
+l	 3634
+d	 3118
+c	 2931
+t	 2834
+u	 2316
+a_	 2269
+e_	 2211
+s_	 1862
+de	 1679
+p	 1673
+_d	 1644
+m	 1447
+_de	 1443
+n_	 1332
+o_	 1301
+en	 1295
+_e	 1216
+es	 1177
+_l	 1132
+de_	 1080
+la	 1060
+os	 1028
+_de_	 1027
+_p	 963
+l_	 910
+ci	 890
+_c	 866
+_a	 866
+os_	 801
+ar	 777
+er	 775
+as	 768
+ra	 746
+nt	 736
+_la	 727
+re	 726
+,_	 724
+,	 724
+el	 722
+ta	 708
+ue	 701
+g	 678
+on	 674
+al	 670
+_s	 666
+co	 653
+b	 637
+an	 622
+v	 616
+la_	 616
+or	 612
+te	 599
+st	 596
+el_	 580
+_la_	 573
+y	 545
+to	 543
+r_	 517
+ad	 512
+ó	 511
+do	 504
+ro	 504
+se	 488
+as_	 488
+q	 487
+qu	 487
+.	 479
+._	 478
+en_	 475
+ca	 460
+in	 459
+un	 456
+_co	 450
+es_	 449
+ic	 449
+_en	 440
+ac	 440
+que	 439
+na	 439
+lo	 430
+_m	 430
+f	 429
+ent	 428
+da	 412
+ue_	 411
+po	 405
+le	 399
+_q	 399
+_qu	 399
+que_	 393
+_que	 388
+ie	 386
+h	 385
+pa	 382
+y_	 371
+ti	 367
+_que_	 365
+_en_	 365
+_y	 361
+tr	 358
+_el	 353
+ri	 349
+ia	 342
+_el_	 333
+_se	 330
+ió	 330
+_y_	 330
+io	 329
+pr	 320
+ón	 317
+ec	 317
+no	 314
+id	 301
+í	 300
+mi	 299
+_t	 299
+ión	 292
+nte	 292
+me	 286
+aci	 283
+do_	 279
+li	 276
+con	 276
+nd	 273
+est	 272
+ni	 272
+á	 271
+di	 270
+_es	 268
+_lo	 267
+ció	 265
+ma	 265
+ón_	 264
+_pr	 263
+_r	 261
+ción	 255
+z	 254
+ra_	 251
+si	 247
+ión_	 246
+oc	 245
+nc	 244
+_u	 244
+_po	 243
+los	 243
+or_	 242
+_con	 241
+is	 239
+del	 238
+_del	 237
+ado	 236
+se_	 233
+_i	 233
+los_	 231
+_re	 231
+por	 229
+_del_	 228
+sta	 228
+del_	 228
+al_	 228
+ne	 226
+_h	 226
+cu	 225
+_n	 225
+_a_	 224
+_v	 224
+_un	 223
+ce	 222
+so	 220
+ción_	 218
+res	 218
+vi	 217
+om	 216
+te_	 212
+_pa	 211
+ien	 210
+j	 209
+E	 208
+_los	 207
+_los_	 207
+to_	 206
+ol	 204
+it	 203
+am	 202
+ació	 201
+rt	 201
+ación	 201
+pe	 197
+ha	 190
+_se_	 189
+nto	 188
+_o	 184
+_E	 184
+on_	 184
+sa	 183
+na_	 182
+ta_	 181
+su	 180
+cia	 180
+mo	 180
+ct	 178
+par	 178
+_f	 177
+_por	 176
+eg	 172
+_in	 172
+ur	 170
+L	 168
+ve	 166
+im	 164
+ga	 163
+_est	 161
+ar_	 161
+ab	 160
+_L	 159
+tu	 158
+at	 158
+no_	 157
+s,	 157
+s,_	 157
+_por_	 156
+por_	 156
+las	 156
+ba	 154
+o,_	 154
+o,	 154
+ento	 151
+et	 150
+C	 150
+_ha	 149
+A	 149
+tra	 148
+ient	 148
+_al	 147
+a,_	 146
+ica	 146
+a,	 146
+pro	 146
+ado_	 145
+ici	 144
+_ca	 144
+an_	 144
+las_	 143
+ara	 143
+nci	 143
+ente	 142
+ú	 142
+rr	 142
+ir	 142
+da_	 141
+em	 141
+ll	 140
+il	 139
+ía	 138
+iv	 138
+_su	 138
+_par	 136
+ul	 136
+ant	 136
+_A	 135
+mp	 135
+_las_	 134
+_las	 134
+_C	 134
+_pro	 133
+men	 132
+P	 132
+des	 131
+com	 130
+ion	 130
+era	 130
+ed	 129
+ida	 129
+sp	 128
+gu	 127
+nte_	 127
+ns	 127
+za	 126
+dos	 125
+M	 125
+cio	 125
+les	 125
+_P	 124
+bl	 124
+_com	 122
+s._	 122
+s.	 122
+_M	 121
+ua	 120
+nta	 120
+mu	 119
+_no	 118
+dad	 118
+ñ	 117
+é	 116
+un_	 116
+va	 116
+ist	 116
+nes	 116
+iento	 115
+one	 114
+ara_	 113
+S	 113
+ada	 113
+_un_	 113
+fi	 111
+pre	 110
+tos	 110
+ter	 109
+ot	 109
+esta	 108
+_me	 107
+ido	 107
+ob	 107
+_g	 105
+br	 105
+go	 105
+ea	 104
+nto_	 104
+ona	 103
+pu	 103
+dos_	 103
+tro	 103
+ier	 103
+para	 102
+ment	 101
+ag	 101
+ero	 101
+gr	 101
+rec	 101
+bi	 101
+ia_	 100
+una	 100
+nic	 99
+ncia	 99
+ía_	 98
+a._	 98
+tos_	 98
+a.	 98
+ran	 98
+lo_	 97
+ones	 97
+rm	 96
+lu	 96
+ron	 95
+con_	 95
+ó_	 95
+nes_	 95
+_ci	 95
+ante	 94
+ch	 94
+_con_	 94
+_para	 94
+ntr	 93
+una_	 93
+para_	 93
+mie	 92
+ico	 92
+fe	 92
+les_	 92
+uc	 92
+ip	 91
+sto	 91
+_ma	 91
+ui	 91
+sta_	 91
+_ve	 90
+cion	 90
+"	 90
+op	 90
+cal	 89
+_mu	 89
+_S	 89
+ro_	 89
+_pe	 88
+ste	 88
+ras	 88
+pl	 88
+_una	 88
+_di	 87
+ento_	 86
+ita	 86
+ione	 85
+ect	 85
+_una_	 85
+mien	 85
+tan	 85
+du	 84
+den	 84
+ndo	 84
+per	 84
+eri	 84
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/es-utf8.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/es-utf8.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/es-utf8.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 57360
+e	 17422
+a	 14584
+o	 13086
+s	 11501
+n	 9353
+i	 9157
+r	 8346
+l	 7626
+t	 6382
+d	 6342
+c	 5800
+u	 5308
+e_	 4669
+a_	 4341
+s_	 4090
+o_	 3788
+Ã	 3737
+m	 3728
+_e	 3301
+de	 3073
+p	 3055
+_d	 2998
+en	 2948
+es	 2824
+,	 2671
+os	 2652
+,_	 2537
+_de	 2452
+n_	 2413
+_l	 2409
+la	 2005
+ue	 1936
+de_	 1928
+er	 1915
+_a	 1880
+_c	 1876
+_s	 1780
+_de_	 1771
+_p	 1743
+os_	 1727
+ra	 1640
+co	 1639
+as	 1593
+b	 1591
+st	 1542
+el	 1539
+l_	 1535
+q	 1467
+qu	 1467
+nt	 1432
+y	 1413
+g	 1392
+lo	 1385
+ci	 1364
+te	 1360
+an	 1339
+re	 1335
+f	 1323
+on	 1299
+que	 1277
+ar	 1273
+to	 1269
+_la	 1247
+ta	 1234
+v	 1226
+or	 1213
+do	 1196
+no	 1190
+_q	 1155
+ue_	 1155
+_qu	 1155
+y_	 1122
+que_	 1119
+_y	 1116
+_n	 1109
+la_	 1093
+_que	 1069
+el_	 1068
+ic	 1067
+ro	 1065
+r_	 1050
+ri	 1039
+_es	 1030
+al	 1026
+_y_	 1020
+³	 1018
+Ã³	 1018
+_en	 1010
+_que_	 1004
+_co	 999
+mo	 987
+en_	 984
+.	 972
+is	 963
+es_	 951
+as_	 948
+_la_	 944
+ad	 932
+h	 932
+­	 924
+Ã­	 924
+se	 917
+ti	 916
+_m	 902
+ca	 896
+in	 895
+_t	 885
+tr	 867
+Â	 863
+._	 860
+si	 839
+ie	 831
+los	 812
+_el	 811
+¡	 793
+da	 789
+ent	 764
+_en_	 762
+le	 761
+Ã¡	 758
+nd	 741
+na	 737
+un	 729
+_el_	 727
+po	 715
+ia	 698
+s,	 687
+di	 675
+io	 672
+_lo	 670
+pa	 656
+o,	 647
+_h	 646
+so	 642
+s,_	 642
+ma	 636
+_f	 628
+om	 628
+no_	 625
+li	 624
+con	 622
+o,_	 614
+_no	 610
+est	 607
+a,	 595
+do_	 583
+los_	 568
+a,_	 565
+ve	 557
+ec	 551
+_a_	 550
+_se	 550
+_con	 547
+ni	 528
+ne	 524
+mi	 523
+su	 523
+nc	 520
+nte	 520
+ac	 520
+fi	 514
+me	 512
+sa	 512
+il	 511
+id	 509
+_Â	 509
+or_	 506
+_i	 500
+_los	 500
+_los_	 500
+_o	 498
+_po	 495
+pr	 485
+em	 485
+ra_	 484
+Ã©	 481
+©	 481
+ien	 479
+ol	 473
+cu	 468
+im	 468
+z	 467
+ab	 462
+pe	 460
+ce	 455
+at	 446
+_u	 443
+ist	 439
+mo_	 436
+j	 432
+to_	 428
+_su	 427
+_r	 427
+am	 427
+tra	 423
+iÃ	 421
+³n	 418
+Ã³n	 418
+_v	 415
+br	 415
+­a	 412
+Ã­a	 412
+sta	 412
+sc	 409
+on_	 404
+tÃ	 404
+_no_	 401
+_si	 396
+rt	 395
+it	 386
+ha	 384
+mÃ	 381
+por	 379
+ica	 378
+us	 377
+_un	 376
+se_	 373
+lo_	 369
+_pr	 365
+nto	 364
+±	 362
+Ã±	 362
+res	 361
+sp	 360
+iÃ³	 358
+las	 351
+ant	 350
+od	 350
+«	 347
+_al	 347
+Â«	 347
+_Â«	 346
+»	 344
+Â»	 344
+ado	 344
+nci	 341
+Â»_	 339
+te_	 339
+»_	 339
+ico	 339
+ed	 339
+ll	 338
+com	 337
+¡s	 336
+Ã¡s	 336
+_por	 335
+ero	 334
+oc	 334
+_pa	 331
+era	 330
+P	 327
+_ha	 318
+_P	 317
+vi	 317
+ir	 316
+_re	 315
+S	 314
+_com	 313
+_est	 311
+_in	 310
+sm	 309
+al_	 308
+del	 307
+ro_	 306
+an_	 306
+tic	 306
+las_	 305
+lÃ	 304
+ente	 302
+mp	 298
+E	 298
+rÃ	 297
+iv	 297
+_del	 297
+cia	 296
+_S	 294
+ta_	 294
+aci	 294
+del_	 292
+_del_	 291
+ot	 288
+³n_	 287
+Ã³n_	 287
+_fi	 287
+smo	 286
+iÃ³n	 285
+ism	 285
+men	 284
+ba	 284
+esc	 284
+por_	 281
+enc	 279
+sti	 278
+_por_	 278
+ig	 277
+gu	 276
+_to	 274
+mÃ¡	 273
+­a_	 273
+Ã­a_	 273
+i_	 270
+ndo	 269
+aÃ	 269
+pu	 268
+par	 268
+ismo	 268
+ct	 267
+_E	 265
+ua	 264
+_las	 261
+_las_	 261
+_di	 260
+_ca	 260
+x	 257
+ns	 256
+bi	 256
+ver	 255
+ia_	 254
+fil	 253
+_pe	 252
+str	 252
+of	 249
+_fil	 247
+_es_	 246
+per	 246
+mos	 246
+ib	 245
+na_	 244
+mÃ¡s	 244
+dad	 244
+con_	 244
+s.	 244
+esp	 244
+os,	 243
+_mÃ	 243
+aÃ±	 242
+ciÃ	 241
+ncia	 241
+ues	 240
+_con_	 239
+da_	 238
+ui	 236
+tu	 236
+ur	 236
+ar_	 235
+_g	 234
+_se_	 233
+iÃ³n_	 233
+e,	 232
+ciÃ³	 232
+omo	 231
+_cu	 230
+re_	 229
+et	 229
+enci	 229
+end	 228
+e,_	 227
+a.	 227
+art	 227
+rr	 227
+nos	 226
+dos	 223
+omo_	 223
+ciÃ³n	 222
+_esc	 222
+_b	 222
+os,_	 222
+como_	 220
+s._	 220
+;	 220
+como	 220
+_como	 220
+ob	 219
+es,	 217
+ul	 217
+A	 216
+oso	 216
+les	 216
+o.	 215
+nu	 215
+_par	 215
+eg	 213
+nte_	 213
+u_	 213
+nde	 212
+cio	 211
+ste	 210
+one	 210
+sof	 209
+;_	 209
+bre	 209
+cr	 208
+tro	 208
+¡s_	 207
+Ã¡s_	 207
+cos	 207
+ilo	 206
+Ã±o	 205
+ion	 205
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/fi-iso_8859_1.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/fi-iso_8859_1.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/fi-iso_8859_1.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 19984
+a	 9133
+i	 8384
+t	 7797
+e	 6481
+n	 6431
+s	 5897
+l	 4504
+o	 4163
+u	 4106
+k	 4013
+ä	 3354
+n_	 2868
+m	 2569
+a_	 1987
+v	 1905
+r	 1827
+ta	 1580
+en	 1553
+is	 1515
+h	 1508
+y	 1462
+st	 1390
+in	 1375
+p	 1342
+j	 1333
+an	 1139
+si	 1073
+tt	 1030
+te	 1008
+en_	 982
+_k	 980
+it	 974
+ll	 947
+aa	 942
+ä_	 902
+va	 878
+el	 855
+_t	 851
+ka	 846
+i_	 835
+.	 832
+se	 818
+li	 806
+tä	 804
+oi	 767
+ai	 744
+._	 739
+tu	 734
+_o	 719
+mi	 715
+al	 703
+on	 684
+d	 681
+_v	 662
+et	 654
+_j	 641
+t_	 635
+ti	 632
+_m	 628
+_s	 620
+ja	 616
+ma	 596
+sa	 595
+la	 582
+ist	 575
+_e	 565
+to	 565
+ks	 557
+in_	 554
+es	 551
+il	 538
+an_	 536
+ki	 527
+,	 525
+ku	 525
+,_	 524
+us	 520
+as	 514
+nt	 512
+ri	 495
+ke	 494
+at	 491
+_p	 485
+le	 484
+ik	 483
+ss	 477
+ut	 469
+ö	 469
+sta	 460
+ee	 459
+uu	 458
+ol	 457
+ta_	 451
+ne	 445
+ää	 445
+ei	 443
+uo	 436
+ko	 433
+un	 430
+lu	 421
+ii	 420
+e_	 418
+nn	 413
+_h	 412
+ar	 408
+er	 402
+än	 396
+ja_	 386
+im	 381
+on_	 365
+_va	 363
+aan	 354
+_a	 352
+me	 350
+ak	 345
+ssa	 331
+na	 330
+ie	 329
+pa	 327
+_ja	 326
+ia	 325
+tä_	 322
+_l	 319
+vi	 317
+ise	 316
+tta	 315
+de	 314
+os	 312
+lli	 309
+_ja_	 304
+jo	 295
+vä	 290
+su	 289
+au	 287
+lis	 286
+_on	 285
+sä	 284
+uk	 280
+am	 280
+ot	 280
+ty	 275
+ett	 271
+ttä	 270
+ni	 269
+lä	 267
+ksi	 264
+nk	 264
+ht	 263
+ul	 261
+ell	 261
+sa_	 259
+ha	 257
+sen	 257
+a.	 254
+isi	 253
+ste	 253
+aan_	 252
+_on_	 252
+_ka	 252
+sk	 251
+kk	 246
+itt	 245
+ok	 242
+a._	 239
+all	 239
+yt	 239
+mä	 237
+mu	 237
+av	 237
+_y	 236
+lla	 233
+taa	 231
+ais	 231
+een	 230
+K	 230
+lt	 228
+s_	 227
+ast	 227
+iv	 226
+ssa_	 225
+ra	 225
+-	 223
+kse	 223
+oit	 220
+om	 220
+T	 219
+_ku	 218
+än_	 216
+aa_	 214
+at_	 214
+tel	 211
+ui	 210
+si_	 208
+rk	 207
+sta_	 207
+_jo	 203
+kä	 202
+_K	 201
+est	 200
+em	 200
+he	 199
+_n	 199
+vo	 198
+_ta	 196
+eh	 196
+_ol	 196
+S	 196
+nta	 196
+_ko	 194
+je	 194
+stä	 194
+är	 193
+ust	 191
+mis	 191
+ns	 190
+pu	 189
+nen	 188
+ät	 188
+toi	 188
+iin	 187
+ten	 187
+min	 186
+ista	 185
+hd	 184
+a,	 184
+a,_	 184
+sen_	 183
+E	 182
+lle	 181
+vat	 179
+ill	 177
+no	 176
+pä	 176
+lm	 176
+llis	 175
+n.	 175
+io	 172
+ine	 171
+n._	 170
+pi	 169
+uks	 168
+ava	 168
+ään	 166
+nen_	 165
+ah	 165
+_mu	 164
+tus	 163
+mm	 162
+_to	 162
+ek	 160
+int	 159
+_r	 159
+lin	 158
+oim	 158
+_T	 158
+A	 158
+imi	 157
+tö	 157
+la_	 157
+jä	 157
+aj	 156
+yh	 155
+o_	 154
+lo	 154
+oli	 153
+een_	 153
+le_	 153
+_si	 153
+g	 152
+aik	 151
+vat_	 150
+L	 149
+ur	 149
+ti_	 149
+sia	 148
+ite	 147
+inen	 147
+ain	 146
+sti	 146
+lla_	 146
+ys	 145
+_mi	 145
+val	 144
+stu	 144
+äm	 144
+alli	 143
+pe	 143
+utt	 142
+et_	 141
+_tu	 141
+eri	 140
+_E	 140
+:	 140
+nki	 139
+ir	 139
+llä	 138
+up	 138
+äi	 137
+ama	 137
+_ha	 135
+id	 135
+_se	 135
+po	 134
+inen_	 134
+tte	 133
+nna	 133
+ten_	 132
+or	 132
+ts	 131
+nä	 131
+yk	 131
+äs	 131
+_S	 130
+ses	 130
+ve	 130
+ess	 129
+äl	 129
+ita	 129
+lai	 129
+H	 129
+van	 127
+äk	 127
+kin	 127
+N	 127
+_te	 126
+den	 126
+tee	 126
+P	 126
+kaa	 126
+iin_	 125
+kun	 125
+ois	 125
+sit	 125
+oh	 124
+V	 124
+yö	 124
+äv	 124
+tav	 124
+voi	 124
+ia_	 123
+I	 123
+oll	 123
+maa	 122
+ih	 122
+oj	 122
+rj	 121
+ro	 121
+ikk	 120
+so	 120
+oo	 120
+oimi	 120
+do	 120
+pp	 119
+M	 119
+_ei	 118
+toim	 118
+op	 118
+uut	 118
+tet	 118
+_i	 118
+_ma	 117
+vai	 117
+lä_	 116
+u_	 116
+sy	 116
+kau	 116
+utta	 116
+un_	 115
+eu	 115
+ssä	 115
+tti	 115
+_sa	 115
+mp	 114
+eis	 114
+ka_	 112
+että	 112
+taa_	 111
+_et	 111
+hu	 111
+itu	 111
+suu	 111
+den_	 111
+ksen	 110
+ap	 110
+_ke	 110
+uv	 110
+tam	 110
+yv	 109
+aup	 109
+stä_	 109
+asta	 109
+äy	 109
+kan	 108
+nu	 108
+ukse	 108
+_toi	 107
+ien	 107
+hi	 107
+iss	 107
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/fr-iso_8859_1.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/fr-iso_8859_1.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/fr-iso_8859_1.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 20800
+e	 7258
+i	 4051
+s	 4003
+a	 3972
+n	 3903
+r	 3650
+t	 3590
+u	 2968
+o	 2823
+l	 2723
+e_	 2632
+d	 2241
+s_	 1721
+_d	 1693
+c	 1663
+p	 1528
+é	 1320
+m	 1297
+es	 1164
+t_	 1106
+_l	 1079
+de	 1048
+on	 959
+_de	 940
+en	 939
+_p	 852
+nt	 825
+le	 808
+es_	 791
+re	 777
+,	 721
+,_	 720
+n_	 703
+de_	 685
+'	 670
+an	 667
+_de_	 645
+v	 641
+_s	 610
+r_	 596
+_c	 594
+er	 585
+ai	 575
+_a	 558
+_e	 554
+ou	 554
+q	 549
+qu	 538
+is	 530
+te	 528
+ti	 525
+ur	 519
+it	 514
+g	 498
+a_	 490
+f	 480
+la	 476
+in	 475
+_le	 441
+me	 436
+nt_	 432
+.	 427
+b	 427
+ra	 423
+io	 416
+ent	 415
+._	 404
+ne	 395
+ns	 392
+ion	 383
+h	 381
+ue	 376
+se	 371
+le_	 370
+ar	 370
+ie	 362
+co	 361
+at	 359
+tr	 359
+et	 349
+pr	 342
+ce	 336
+au	 328
+u_	 321
+il	 314
+_r	 313
+_la	 304
+un	 303
+eu	 303
+st	 300
+re_	 296
+ro	 290
+la_	 288
+on_	 287
+_m	 286
+_la_	 283
+que	 281
+_qu	 280
+_q	 280
+po	 275
+tio	 273
+tion	 273
+pa	 273
+li	 271
+_t	 269
+nc	 268
+si	 266
+_pr	 265
+ri	 264
+al	 263
+ui	 262
+_co	 259
+i_	 255
+ta	 255
+é_	 251
+x	 247
+em	 244
+l_	 243
+et_	 238
+_l'	 236
+l'	 236
+les	 233
+ns_	 233
+ir	 232
+_le_	 228
+ent_	 227
+or	 226
+ré	 224
+_f	 224
+ne_	 222
+à	 221
+ve	 220
+ch	 220
+it_	 219
+di	 219
+oi	 217
+-	 216
+ni	 215
+à_	 215
+les_	 215
+d'	 214
+el	 212
+ss	 212
+_n	 212
+ut	 211
+our	 210
+des	 210
+"	 208
+ur_	 207
+nd	 207
+er_	 206
+ait	 206
+ion_	 204
+rs	 202
+_en	 201
+_et	 200
+j	 200
+_d'	 200
+ll	 199
+_des	 198
+des_	 197
+_pa	 197
+té	 196
+_et_	 195
+_à	 195
+_à_	 195
+om	 193
+ma	 192
+ati	 190
+_des_	 189
+L	 188
+so	 187
+_u	 185
+è	 184
+_"	 183
+sa	 182
+_po	 181
+tre	 181
+dé	 181
+ue_	 180
+pe	 179
+en_	 179
+ont	 178
+_un	 178
+_L	 178
+us	 176
+_les	 176
+_les_	 176
+rt	 176
+is_	 173
+_i	 173
+du	 172
+e,_	 171
+e,	 171
+na	 171
+s,	 170
+s,_	 170
+as	 169
+men	 169
+M	 167
+ait_	 167
+'a	 166
+vi	 162
+ci	 159
+ant	 158
+_au	 158
+da	 157
+_M	 157
+ation	 155
+atio	 155
+con	 154
+que_	 153
+ons	 153
+eur	 151
+est	 149
+me_	 149
+mi	 149
+par	 148
+tion_	 148
+_so	 147
+te_	 147
+res	 144
+lo	 144
+ment	 144
+és	 144
+ans	 143
+_du	 142
+du_	 141
+ux	 141
+un_	 140
+y	 138
+pro	 138
+_du_	 136
+_dé	 136
+ce_	 135
+_se	 134
+_re	 134
+pl	 133
+A	 132
+ge	 131
+ic	 131
+su	 130
+x_	 129
+ien	 129
+nce	 129
+"_	 129
+ac	 128
+il_	 128
+qui	 128
+_pro	 127
+no	 127
+av	 126
+_v	 125
+_o	 125
+rs_	 125
+ans_	 124
+eme	 124
+bl	 123
+emen	 122
+_en_	 122
+iqu	 122
+ct	 122
+iq	 122
+lle	 122
+nn	 121
+ts	 121
+ement	 121
+ét	 120
+_"_	 120
+ér	 119
+té_	 119
+_ce	 119
+mp	 119
+ire	 119
+ui_	 119
+to	 118
+he	 117
+_é	 117
+ca	 117
+_j	 116
+ec	 116
+va	 116
+_par	 116
+ée	 115
+_con	 115
+se_	 114
+tre_	 113
+ique	 112
+dan	 111
+éc	 111
+ha	 110
+une	 110
+P	 110
+lu	 110
+ux_	 109
+_b	 108
+s.	 108
+pou	 108
+_pou	 108
+ier	 107
+C	 107
+ais	 106
+s._	 105
+ain	 104
+_un_	 104
+nte	 103
+'e	 103
+mo	 103
+mm	 103
+ment_	 102
+une_	 102
+com	 101
+_P	 101
+'i	 101
+_ma	 100
+do	 99
+ant_	 98
+anc	 98
+che	 97
+ap	 97
+ont_	 97
+_que	 97
+os	 97
+urs	 96
+_di	 96
+fi	 96
+im	 96
+pour	 96
+_pour	 96
+ê	 95
+ts_	 95
+_g	 95
+our_	 94
+_sa	 94
+ntr	 94
+_da	 94
+_ré	 93
+rai	 93
+rm	 93
+_qui	 93
+e.	 92
+am	 92
+_com	 91
+uv	 91
+_C	 91
+D	 91
+qui_	 90
+e._	 90
+pu	 89
+_qui_	 88
+ia	 87
+_dan	 87
+_dans	 87
+dans	 87
+ter	 87
+fo	 87
+son	 87
+dans_	 87
+id	 86
+ag	 86
+ine	 86
+tu	 85
+ran	 85
+au_	 85
+ol	 85
+oc	 84
+est_	 84
+st_	 84
+enc	 84
+F	 82
+_tr	 81
+'u	 81
+tai	 81
+ell	 80
+R	 79
+_su	 79
+S	 79
+ions	 79
+pré	 79
+sé	 78
+ab	 78
+né	 77
+_que_	 77
+_in	 77
+_av	 76
+pour_	 76
+fa	 76
+rr	 76
+air	 75
+_ch	 75
+_a_	 75
+ba	 74
+_pl	 74
+gr	 74
+tt	 74
+ssi	 74
+rd	 73
+pas	 73
+bi	 73
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/fr-utf8.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/fr-utf8.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/fr-utf8.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 292115
+e	 91601
+s	 57847
+i	 47961
+n	 44682
+r	 42576
+a	 40937
+u	 40409
+t	 38585
+o	 33562
+l	 32615
+e_	 28646
+s_	 25711
+d	 24153
+Ã	 20732
+c	 18500
+es	 18303
+,	 17032
+,_	 17020
+_d	 16660
+p	 16483
+m	 15658
+Ã©	 14108
+©	 14108
+le	 12970
+_l	 12938
+.	 12798
+es_	 12654
+._	 12395
+t_	 12208
+en	 12208
+de	 10702
+nt	 10382
+_p	 9676
+re	 9602
+on	 9458
+_s	 9363
+v	 9273
+_de	 9211
+_c	 8165
+ur	 7678
+n_	 7551
+b	 7440
+q	 7317
+qu	 7287
+'	 7280
+g	 7165
+r_	 7018
+_le	 6968
+er	 6926
+an	 6897
+eu	 6784
+de_	 6616
+f	 6600
+_a	 6591
+nt_	 6570
+ou	 6465
+_de_	 6247
+te	 6168
+_.	 6079
+is	 6062
+_._	 6042
+it	 6019
+ns	 5745
+a_	 5628
+&	 5624
+_&	 5624
+__	 5572
+oi	 5561
+&_	 5557
+_&_	 5557
+in	 5538
+ie	 5536
+ent	 5361
+s,	 5181
+s,_	 5180
+se	 5161
+_e	 4938
+ui	 4891
+ue	 4882
+les	 4876
+h	 4861
+me	 4833
+_q	 4782
+_qu	 4782
+ai	 4713
+ne	 4671
+ar	 4548
+ce	 4364
+les_	 4306
+ri	 4194
+_m	 4178
+la	 4176
+e,	 4154
+e,_	 4150
+ti	 4139
+tr	 4133
+le_	 4058
+ra	 4056
+que	 3899
+au	 3817
+_Ã	 3757
+us	 3720
+ent_	 3717
+eur	 3692
+co	 3660
+il	 3633
+_f	 3605
+ns_	 3406
+x	 3390
+pa	 3376
+_les	 3348
+_les_	 3331
+i_	 3305
+re_	 3295
+_t	 3293
+su	 3272
+ur_	 3221
+_i	 3153
+rs	 3109
+rÃ	 3061
+st	 3047
+so	 3019
+_r	 2974
+_n	 2933
+on_	 2902
+or	 2869
+el	 2865
+un	 2824
+ut	 2806
+_la	 2801
+ir	 2795
+ro	 2771
+ll	 2765
+em	 2724
+_co	 2722
+la_	 2721
+_pa	 2699
+_su	 2697
+ss	 2677
+u_	 2672
+_,	 2647
+_,_	 2646
+des	 2634
+_la_	 2629
+ve	 2625
+ue_	 2570
+po	 2559
+pr	 2558
+pe	 2551
+li	 2541
+om	 2538
+nd	 2521
+it_	 2430
+iv	 2404
+_des	 2386
+Ã 	 2383
+ 	 2383
+ne_	 2375
+des_	 2365
+que_	 2325
+es,_	 2315
+es,	 2315
+tÃ	 2314
+ _	 2302
+Ã _	 2302
+si	 2297
+_des_	 2276
+Ã©_	 2271
+©_	 2271
+ma	 2258
+to	 2223
+sa	 2220
+ont	 2208
+en_	 2189
+di	 2183
+tre	 2181
+_b	 2179
+lle	 2168
+rt	 2167
+ien	 2163
+rÃ©	 2154
+_Ã 	 2133
+_Ã _	 2132
+_v	 2128
+nc	 2119
+L	 2118
+_so	 2104
+ux	 2103
+tÃ©	 2102
+l_	 2100
+at	 2097
+_en	 2097
+ch	 2094
+_que	 2092
+bi	 2088
+io	 2086
+_L	 2056
+par	 2049
+our	 2014
+rs_	 2001
+C	 2000
+_se	 1987
+ge	 1971
+_le_	 1969
+_ce	 1967
+ans	 1967
+ta	 1962
+j	 1960
+_C	 1932
+urs	 1930
+P	 1922
+is_	 1906
+y	 1902
+ni	 1895
+res	 1887
+_au	 1875
+pl	 1865
+l'	 1865
+ion	 1865
+_l'	 1856
+_po	 1848
+id	 1835
+_g	 1829
+_par	 1827
+men	 1817
+d'	 1817
+et	 1813
+us_	 1801
+vo	 1788
+er_	 1780
+x_	 1764
+-	 1738
+_d'	 1732
+_P	 1728
+sui	 1719
+lu	 1716
+mo	 1715
+A	 1701
+ib	 1697
+al	 1693
+_u	 1680
+_que_	 1664
+leu	 1663
+ens	 1657
+_pr	 1656
+©s	 1653
+Ã©s	 1653
+S	 1648
+ux_	 1641
+eur_	 1635
+_o	 1618
+eurs	 1612
+leur	 1610
+no	 1609
+urs_	 1606
+da	 1606
+ant	 1602
+'a	 1602
+as	 1593
+u'	 1590
+ans_	 1581
+te_	 1580
+_S	 1579
+ui_	 1578
+qu'	 1577
+I	 1567
+nn	 1566
+son	 1565
+bl	 1561
+_pe	 1542
+av	 1538
+©t	 1538
+Ã©t	 1538
+_un	 1536
+ag	 1534
+_sui	 1527
+E	 1516
+uiv	 1496
+du	 1485
+_leur	 1484
+ment	 1484
+_leu	 1484
+dÃ	 1470
+fa	 1464
+un_	 1464
+_a_	 1447
+suiv	 1445
+_suiv	 1439
+con	 1436
+ce_	 1432
+ci	 1426
+uv	 1418
+ell	 1418
+oit	 1418
+iv.	 1406
+v.	 1406
+dÃ©	 1403
+iv._	 1403
+v._	 1403
+uiv.	 1400
+suiv.	 1400
+_re	 1397
+uiv._	 1397
+mi	 1390
+se_	 1380
+lo	 1379
+ont_	 1378
+_Ã©	 1377
+_qu'	 1370
+ran	 1365
+©e	 1362
+Ã©e	 1362
+qui	 1362
+eurs_	 1356
+ire	 1356
+he	 1355
+_ma	 1355
+Ã©r	 1352
+©r	 1352
+_A	 1350
+elle	 1346
+'e	 1337
+ab	 1334
+me_	 1329
+_en_	 1325
+ais	 1322
+ª	 1317
+Ãª	 1317
+ic	 1307
+dan	 1305
+nce	 1302
+mm	 1300
+tes	 1285
+M	 1277
+_j	 1270
+ac	 1268
+do	 1268
+vi	 1256
+mp	 1253
+oit_	 1251
+_M	 1244
+_con	 1239
+d.	 1236
+d._	 1232
+ibi	 1229
+_mo	 1228
+d_	 1225
+est	 1217
+cr	 1205
+ons	 1198
+_ib	 1197
+Le	 1195
+id.	 1193
+id._	 1191
+bid	 1190
+bid.	 1190
+_ibid	 1190
+ibid.	 1190
+_ibi	 1190
+ibid	 1190
+bid._	 1188
+ar_	 1188
+_son	 1188
+na	 1187
+__i	 1184
+eux	 1184
+_Le	 1180
+im	 1180
+eme	 1176
+'i	 1175
+__ib	 1172
+tre_	 1167
+__ibi	 1167
+il_	 1167
+fo	 1161
+ain	 1158
+tio	 1156
+sse	 1155
+tion	 1149
+_da	 1147
+_par_	 1136
+par_	 1136
+emen	 1132
+_fa	 1132
+_sa	 1130
+_I	 1127
+ec	 1124
+ca	 1119
+mÃ	 1117
+tÃ©_	 1109
+ha	 1107
+va	 1106
+ment_	 1103
+_E	 1103
+ol	 1102
+_qui	 1101
+_dan	 1101
+ois	 1089
+mme	 1079
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/hi-iscii_de.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/hi-iscii_de.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/hi-iscii_de.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 75620
+æ	 19109
+U	 16333
+ð	 11131
+€	 11107
+·	 10241
+·€	 7855
+Ú	 6993
+ÚU	 6598
+ç	 6322
+è	 6151
+Ù	 5887
+_·	 5800
+ã	 5370
+â	 5168
+U_	 5118
+æ_	 4935
+Ì	 4508
+×	 4467
+Ø	 4292
+ð_	 3962
+_·€	 3937
+è_	 3904
+Â	 3718
+€_	 3609
+Ü	 3563
+ãU	 3514
+_ç	 3394
+Ž	 3363
+ß	 2962
+¥	 2907
+ÚU_	 2851
+_¥	 2668
+_ã	 2632
+_â	 2575
+ô	 2527
+Î	 2513
+Ž_	 2512
+Á	 2451
+Uæ	 2336
+Õ	 2314
+_Â	 2280
+_×	 2260
+ñ	 2187
+¢	 2082
+»	 2078
+€æ	 1988
+ðŽ	 1913
+·€æ	 1886
+·ð	 1881
+ð€	 1877
+·ð€	 1860
+Ð	 1842
+Ð_	 1830
+·€_	 1746
+é	 1714
+æð	 1703
+ð€_	 1695
+·ð€_	 1694
+æÚ	 1631
+ü	 1610
+_·ð	 1579
+_·ð€	 1567
+ðŽ_	 1556
+æÚU	 1536
+Øæ	 1528
+Ùð	 1525
+Uè	 1515
+_·ð€_	 1488
+Ù_	 1411
+Ùð_	 1407
+à	 1390
+_ãñ	 1357
+ãñ	 1357
+Å	 1337
+Ì_	 1319
+_Õ	 1315
+×ð	 1300
+ç·	 1279
+Ö	 1270
+_Á	 1258
+_·€æ	 1209
+ç·€	 1203
+€è	 1195
+_Ù	 1187
+°	 1181
+§	 1166
+×ðŽ	 1163
+àæ	 1162
+ý	 1157
+¿	 1155
+_×ð	 1150
+×ðŽ_	 1140
+·€è	 1127
+€è_	 1092
+_×ðŽ	 1086
+_×ðŽ_	 1077
+ñU	 1075
+_ãU	 1071
+·€è_	 1065
+ãñU	 1062
+_ãñU	 1062
+æÙ	 1053
+¥æ	 1052
+Ìæ	 1038
+€Ú	 1035
+_ç·	 1009
+€ÚU	 972
+âð	 970
+_ç·€	 967
+_·€è	 959
+ÚUæ	 936
+ãUæ	 930
+_·€è_	 929
+·€Ú	 928
+Í	 926
+_¥æ	 904
+ÅU	 904
+Ç	 904
+©	 890
+ê	 887
+©U	 885
+·€ÚU	 866
+_©	 865
+_©U	 862
+_Ö	 854
+âð_	 850
+_Ú	 847
+_Ì	 837
+S	 834
+UÐ	 831
+_Î	 830
+UÐ_	 823
+_ß	 798
+Ùæ	 788
+â_	 783
+_ÚU	 773
+Uè_	 770
+ôŽ	 753
+æØ	 752
+Ï	 749
+Øæ_	 732
+×æ	 732
+ô_	 704
+_§	 704
+Áæ	 704
+_âð	 697
+Âý	 695
+ãUè	 693
+€æ_	 690
+ü_	 688
+æÚU_	 685
+,	 684
+_»	 682
+·€æ_	 679
+,_	 674
+_·€Ú	 670
+¹	 665
+ðU	 664
+ßæ	 648
+_Âý	 647
+UÌ	 644
+Ü_	 643
+_Ü	 641
+ç·€_	 639
+Ø_	 639
+Üæ	 633
+_âð_	 633
+æç	 623
+Uô	 621
+ôŽ_	 615
+_·€ÚU	 611
+Uæ_	 599
+ãU_	 595
+Üð	 594
+UÙ	 589
+ñUÐ	 580
+_ãñUÐ	 580
+ãñUÐ	 580
+_°	 576
+_Áæ	 573
+ñUÐ_	 572
+ãñUÐ_	 572
+æÜ	 569
+_Ø	 569
+_Ùð	 569
+ÂÚ	 561
+_ç·€_	 557
+	 556
+€ô	 552
+ææ	 550
+ÂÚU	 549
+çß	 544
+Õæ	 538
+_·€æ_	 535
+×_	 532
+çÜ	 525
+âæ	 523
+·€ô	 519
+æð_	 502
+æ¢	 501
+ž	 498
+_Ùð_	 495
+	 494
+_ÂÚ	 493
+Âæ	 493
+Ìæ_	 490
+_ÂÚU	 485
+çÙ	 484
+õ	 481
+È	 478
+æ	 469
+.	 459
+ÂÚU_	 458
+Öæ	 449
+Øð	 449
+_çß	 445
+§â	 444
+€ÚU_	 443
+Öè	 442
+_§â	 440
+_ÂÚU_	 439
+æðŽ	 437
+Ùæ_	 435
+	 434
+_¿	 433
+ÚUè	 431
+â¢	 431
+_·€ô	 430
+Îð	 427
+æÌ	 425
+Î_	 420
+Öè_	 419
+žU	 415
+	 412
+æ	 412
+§ü	 410
+ŽU	 405
+ÇU	 399
+»æ	 399
+·€ÚU_	 394
+Uã	 394
+æÙ_	 393
+çÌ	 393
+€ô_	 392
+·€ô_	 392
+çÎ	 389
+ÚUÌ	 385
+æÁ	 385
+Çž	 383
+æðŽ_	 382
+Ìè	 381
+Íæ	 379
+çÚ	 375
+°_	 374
+ãUô	 374
+ÚUã	 374
+æÐ	 373
+æÐ_	 372
+_·€ô_	 371
+_Õæ	 369
+æè	 364
+çÚU	 364
+ðU_	 362
+€æð	 358
+È€	 357
+Uæð	 354
+èŽ	 353
+â·	 352
+ß_	 350
+U·	 349
+€æÚ	 346
+Ìð	 346
+·€æð	 346
+æü	 345
+õÚ	 344
+õÚU	 342
+·€æÚ	 342
+_×æ	 341
+_Öè	 341
+_çÜ	 340
+ñU_	 337
+_ãñU_	 337
+ÿ	 337
+ãñU_	 337
+Ùè	 336
+ãUè_	 334
+¿æ	 334
+ñŽ	 334
+_Öè_	 332
+æ×	 327
+€æÚU	 327
+ÿæ	 326
+_Í	 325
+U·€	 323
+·€æÚU	 323
+UèŽ	 322
+ãUèŽ	 321
+_âæ	 320
+ÇžU	 319
+_¥õ	 319
+¥õ	 319
+õÚU_	 319
+_ÚUã	 318
+Úð	 317
+èŽ_	 316
+_â¢	 316
+æ·	 313
+Øô	 310
+_ãUæ	 309
+Øã	 309
+À	 308
+ØãU	 308
+_Øã	 308
+_ØãU	 307
+_·€æð	 304
+_¥õÚ	 304
+¥õÚ	 304
+_¥õÚU	 304
+_Öæ	 304
+¥õÚU	 304
+¥õÚU_	 303
+_çÙ	 303
+ãUèŽ_	 300
+UèŽ_	 300
+_S	 300
+Îæ	 300
+UÜ	 298
+ÚUè_	 296
+æÎ	 296
+æß	 294
+ÅU_	 294
+Øð_	 293
+Ùã	 292
+âè	 291
+_Ùã	 290
+æè_	 290
+ðà	 290
+Üð_	 289
+UãU	 288
+ÙãU	 288
+Uâ	 288
+_ÙãU	 286
+_à	 286
+_ÙãUè	 285
+_Âæ	 285
+ÙãUè	 285
+æ·€	 284
+_àæ	 284
+ÙãUèŽ	 283
+UÌ_	 282
+ãñŽ	 280
+_ãñŽ	 280
+ñŽU	 280
+â×	 279
+_çÎ	 278
+_ãñŽU	 278
+ãñŽU	 278
+»_	 277
+_Îð	 275
+ðàæ	 274
+àæ_	 273
+æñ	 272
+·€ã	 272
+€ã	 272
+Ìð_	 272
+_ãUô	 272
+æ_	 272
+-	 271
+€ãU	 271
+·€ãU	 271
+¢_	 271
+_·€ã	 270
+ãUæ_	 270
+_·€ãU	 269
+ÚUãU	 268
+ãé	 267
+æâ	 265
+°·	 263
+€Ø	 263
+€æð_	 262
+·€æð_	 262
+°·€	 262
+ÚðU	 258
+_°·	 258
+Ùè_	 258
+_°·€	 257
+ÀU	 256
+v	 253
+ÂÙ	 252
+_ÚUæ	 252
+Üè	 249
+ç×	 247
+çâ	 246
+_Å	 246
+ÚUÙ	 246
+×é	 245
+._	 245
+UÚ	 244
+éU	 243
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/id-iso_8859_1.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/id-iso_8859_1.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/id-iso_8859_1.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 19406
+a	 10666
+n	 5455
+e	 4535
+i	 4387
+r	 2936
+t	 2902
+an	 2853
+u	 2841
+k	 2761
+s	 2311
+m	 2178
+d	 2134
+g	 2105
+l	 1780
+a_	 1506
+n_	 1476
+ng	 1449
+p	 1397
+b	 1275
+an_	 1270
+o	 1246
+h	 1130
+i_	 1108
+er	 1038
+ka	 1032
+_d	 1006
+y	 997
+,	 951
+en	 941
+ar	 914
+,_	 900
+_m	 880
+ya	 842
+ta	 838
+ang	 797
+di	 787
+da	 773
+.	 754
+la	 742
+._	 738
+me	 732
+ak	 728
+_s	 718
+at	 690
+ra	 688
+ga	 683
+_k	 671
+_me	 650
+in	 628
+ah	 601
+_t	 583
+_p	 570
+g_	 551
+_b	 551
+_di	 548
+ng_	 544
+ma	 536
+se	 526
+tu	 511
+na	 506
+al	 500
+ri	 490
+as	 483
+k_	 482
+j	 480
+si	 470
+ny	 467
+h_	 457
+sa	 452
+ang_	 439
+it	 424
+kan	 423
+ti	 418
+_se	 417
+pe	 412
+S	 409
+ba	 407
+ke	 407
+em	 405
+men	 405
+be	 403
+un	 401
+te	 401
+am	 396
+pa	 395
+nya	 390
+_men	 374
+el	 374
+t_	 371
+_a	 360
+_i	 356
+u_	 355
+kan_	 345
+_ke	 339
+is	 335
+ah_	 324
+_S	 324
+eng	 321
+nga	 320
+ia	 318
+_pe	 316
+ha	 313
+ap	 311
+r_	 308
+w	 305
+li	 301
+_da	 300
+s_	 299
+P	 296
+nd	 290
+_be	 287
+ik	 283
+ja	 281
+yan	 281
+ad	 275
+ek	 273
+uk	 272
+di_	 270
+bu	 269
+ya_	 268
+yang	 268
+ak_	 266
+ber	 265
+_y	 265
+_ya	 264
+_P	 263
+ru	 260
+K	 259
+yang_	 256
+_yang	 256
+_yan	 256
+nt	 255
+de	 253
+_te	 250
+wa	 249
+et	 247
+at_	 246
+ara	 245
+gan	 243
+A	 237
+ari	 235
+ala	 230
+itu	 229
+c	 225
+ol	 225
+ni	 225
+us	 225
+dan	 224
+_K	 224
+M	 224
+B	 223
+ata	 222
+ai	 221
+ur	 219
+nya_	 217
+ua	 215
+_ka	 214
+_ber	 210
+eb	 209
+ran	 206
+D	 206
+ela	 206
+_di_	 205
+_l	 204
+ngan	 204
+ter	 203
+re	 201
+-	 199
+aka	 198
+l_	 194
+_A	 191
+era	 191
+a,	 191
+e_	 190
+ir	 187
+I	 186
+tan	 185
+_B	 184
+ut	 184
+ku	 183
+a,_	 183
+il	 182
+J	 181
+um	 180
+_it	 180
+_itu	 180
+_ta	 179
+su	 179
+dan_	 177
+es	 177
+on	 177
+or	 177
+_dan	 176
+lu	 174
+_M	 172
+tu_	 172
+_dan_	 172
+enga	 171
+mb	 169
+R	 169
+si_	 168
+per	 168
+gan_	 168
+ngan_	 165
+"	 162
+_ter	 162
+a.	 161
+man	 161
+gk	 160
+a._	 160
+asi	 160
+ngk	 160
+ep	 160
+ag	 159
+ul	 158
+da_	 157
+m_	 155
+du	 155
+ada	 153
+ki	 153
+rt	 150
+mp	 150
+T	 150
+ama	 148
+ing	 148
+na_	 147
+_J	 147
+_D	 145
+ung	 145
+ana	 145
+n,	 144
+ju	 144
+ud	 144
+rin	 143
+gi	 143
+aw	 141
+lah	 138
+lan	 138
+_sa	 136
+ri_	 136
+meng	 136
+_meng	 135
+_ma	 134
+n,_	 134
+awa	 134
+st	 134
+eka	 133
+mi	 133
+mu	 132
+_T	 132
+po	 131
+ge	 131
+ar_	 130
+id	 129
+ko	 129
+le	 128
+_h	 128
+ena	 127
+_j	 126
+emb	 126
+ina	 125
+_r	 124
+itu_	 124
+ay	 123
+ngg	 123
+gg	 123
+rang	 123
+pi	 120
+nan	 120
+_ba	 119
+_la	 119
+apa	 119
+_I	 118
+p_	 118
+bi	 117
+ai_	 117
+ta_	 116
+san	 116
+Ke	 116
+ro	 115
+eri	 114
+kar	 113
+lah_	 113
+_itu_	 112
+aya	 111
+i,	 110
+an,	 110
+ra_	 110
+_per	 110
+im	 110
+ika	 109
+isi	 109
+mem	 109
+tah	 108
+_Ke	 108
+ian	 108
+_mem	 108
+akan	 108
+Se	 108
+to	 107
+ab	 107
+ngka	 106
+rs	 106
+gka	 106
+uk_	 105
+seb	 104
+_de	 104
+pu	 104
+i,_	 104
+ita	 104
+nda	 103
+_ti	 103
+ni_	 103
+ca	 103
+_Se	 103
+ers	 103
+pen	 103
+ini	 102
+an,_	 102
+angk	 101
+uh	 101
+han	 101
+nta	 100
+_in	 99
+f	 99
+nj	 99
+ok	 99
+aga	 99
+_R	 98
+as_	 98
+tr	 98
+mer	 97
+lam	 97
+and	 97
+end	 96
+anga	 96
+ne	 96
+Sa	 96
+ka_	 96
+arin	 95
+gu	 95
+_ha	 94
+Z	 94
+al_	 94
+ga_	 94
+_Z	 93
+_pen	 93
+dar	 93
+Ad	 93
+i._	 93
+ada_	 93
+atan	 93
+tak	 93
+i.	 93
+ia_	 92
+asa	 92
+ap_	 92
+ari_	 92
+kat	 92
+_seb	 92
+_Za	 91
+Za	 91
+den	 91
+n.	 90
+_u	 90
+_Ad	 90
+engan	 89
+ib	 89
+any	 89
+n._	 89
+o_	 89
+Zar	 88
+Zari	 88
+rina	 88
+_Zar	 88
+_Zari	 88
+Zarin	 88
+arina	 88
+ks	 88
+angka	 87
+oli	 87
+eg	 87
+kt	 86
+_Sa	 86
+hu	 85
+ih	 85
+us_	 85
+adi	 85
+om	 85
+eba	 85
+anya	 85
+_bu	 84
+denga	 83
+L	 83
+ed	 83
+dak	 83
+deng	 83
+ma_	 82
+asi_	 82
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/it-iso_8859_1.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/it-iso_8859_1.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/it-iso_8859_1.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 25028
+a	 7570
+e	 6477
+i	 5481
+o	 5104
+l	 3905
+n	 3866
+r	 3502
+t	 2934
+c	 2862
+s	 2862
+a_	 2504
+e_	 2404
+d	 2004
+i_	 1749
+o_	 1679
+u	 1650
+v	 1611
+p	 1561
+m	 1414
+_c	 1325
+,	 1192
+,_	 1192
+_s	 1190
+_d	 1094
+g	 1067
+an	 925
+er	 915
+_a	 914
+_p	 895
+la	 858
+_l	 830
+re	 799
+ar	 769
+h	 762
+no	 753
+co	 726
+va	 698
+_e	 657
+n_	 656
+on	 656
+ra	 653
+to	 651
+f	 638
+di	 638
+_i	 634
+ch	 634
+ll	 633
+l_	 624
+la_	 598
+ta	 593
+el	 576
+in	 567
+_m	 558
+en	 529
+b	 528
+ri	 525
+_co	 523
+_n	 523
+_di	 522
+li	 513
+av	 507
+al	 501
+le	 494
+ia	 492
+se	 484
+ol	 479
+_f	 477
+or	 477
+te	 469
+_e_	 467
+ve	 454
+at	 449
+de	 447
+.	 443
+ne	 429
+va_	 428
+ca	 426
+._	 422
+tt	 422
+re_	 415
+nt	 415
+io	 411
+_v	 407
+pe	 405
+z	 392
+to_	 391
+_ch	 389
+na	 384
+si	 384
+'	 383
+he	 382
+no_	 379
+ci	 374
+_la	 373
+ro	 371
+_g	 370
+st	 368
+cc	 366
+he_	 362
+di_	 362
+ma	 358
+ev	 354
+che	 354
+es	 352
+me	 352
+pa	 351
+_t	 349
+ti	 348
+_di_	 347
+ss	 345
+che_	 344
+a,_	 337
+a,	 337
+nd	 335
+o,	 333
+o,_	 333
+ell	 330
+gl	 323
+sa	 322
+il	 322
+gli	 321
+da	 318
+as	 318
+do	 314
+_che	 308
+_che_	 306
+eva	 306
+_la_	 300
+lla	 298
+le_	 293
+un	 291
+_pe	 290
+_de	 288
+q	 283
+qu	 283
+ava	 280
+po	 277
+on_	 275
+r_	 273
+li_	 273
+_b	 269
+_il	 268
+_il_	 268
+il_	 268
+lo	 267
+om	 263
+e,	 263
+e,_	 263
+ni	 258
+tr	 258
+so	 255
+ra_	 253
+os	 251
+_in	 249
+_u	 248
+per	 244
+are	 243
+et	 243
+_se	 240
+ano	 239
+si_	 238
+_ca	 238
+_qu	 238
+lla_	 238
+_q	 238
+_a_	 236
+ac	 236
+_r	 234
+ic	 233
+_no	 232
+ie	 227
+fa	 227
+hi	 226
+del	 225
+ua	 222
+_per	 218
+ce	 218
+_ma	 216
+sc	 216
+_del	 215
+mi	 212
+_un	 208
+chi	 206
+era	 205
+i,	 205
+i,_	 205
+su	 203
+and	 202
+vo	 202
+_fa	 201
+eva_	 200
+ano_	 199
+gli_	 197
+non	 196
+pi	 196
+vi	 195
+er_	 195
+_al	 194
+se_	 193
+_ne	 192
+_non	 191
+am	 190
+is	 187
+ava_	 187
+_non_	 186
+non_	 186
+in_	 185
+ent	 185
+_si	 184
+_pa	 184
+com	 183
+!	 182
+_le	 182
+_su	 181
+uo	 181
+el_	 180
+!_	 180
+l'	 178
+ue	 177
+te_	 177
+_com	 177
+are_	 176
+pr	 176
+_in_	 176
+van	 172
+mo	 172
+ta_	 171
+gn	 167
+ere	 166
+na_	 166
+tto	 163
+it	 161
+_per_	 161
+per_	 161
+é	 161
+all	 160
+ess	 159
+ut	 159
+col	 158
+acc	 157
+gi	 155
+lo_	 154
+oc	 154
+vano	 153
+io_	 153
+_av	 151
+ndo	 151
+é_	 151
+ato	 149
+ave	 148
+_st	 147
+me_	 147
+'a	 146
+ia_	 144
+con	 143
+mp	 143
+fi	 142
+ett	 142
+_si_	 141
+_pi	 140
+era_	 140
+ti_	 140
+ó	 140
+vano_	 140
+_gl	 139
+qua	 139
+ella	 139
+sta	 138
+ome	 137
+S	 137
+_gli	 137
+_S	 137
+ad	 136
+_ve	 134
+ant	 134
+ne_	 134
+ó_	 133
+sp	 133
+do_	 133
+_po	 132
+ro_	 132
+ov	 132
+_le_	 131
+ella_	 130
+sse	 129
+_con	 128
+ir	 128
+_vi	 128
+ig	 127
+_gli_	 127
+_ave	 127
+vev	 127
+un_	 126
+ot	 126
+veva	 125
+dell	 125
+que	 125
+a.	 125
+_o	 125
+a._	 124
+tu	 124
+cia	 123
+za	 123
+_que	 123
+_da	 121
+par	 121
+_pr	 120
+cch	 120
+_dell	 120
+eg	 119
+_sa	 119
+o._	 119
+o.	 119
+_col	 118
+lt	 118
+_un_	 118
+rt	 118
+ur	 117
+_vo	 117
+_me	 117
+ome_	 117
+L	 116
+ap	 116
+_L	 116
+zi	 116
+nto	 116
+og	 115
+_an	 115
+_so	 115
+em	 114
+ag	 114
+be	 111
+ni_	 111
+im	 110
+cchi	 110
+ver	 110
+lle	 109
+nz	 109
+cci	 109
+_ri	 109
+nc	 108
+_er	 108
+come_	 107
+come	 107
+aveva	 107
+ui	 107
+avev	 107
+tto_	 107
+_come	 106
+ed	 106
+P	 105
+man	 105
+_P	 105
+rs	 105
+occ	 104
+ndo_	 103
+ato_	 103
+_qua	 103
+_era	 103
+ari	 102
+ba	 100
+_mo	 100
+nel	 100
+id	 99
+men	 98
+_fi	 98
+_all	 98
+rr	 97
+_do	 97
+_avev	 97
+att	 97
+l'a	 96
+ei	 96
+zz	 96
+;	 96
+vol	 95
+pp	 95
+tra	 95
+;_	 95
+ere_	 94
+lle_	 94
+nda	 94
+utt	 94
+est	 93
+_nel	 93
+ul	 92
+ola	 92
+iv	 92
+ando	 90
+ale	 90
+lu	 90
+rn	 90
+e.	 89
+e._	 89
+ll'	 89
+tta	 88
+nte	 87
+_l'	 87
+uel	 87
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/it-utf8.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/it-utf8.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/it-utf8.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 102056
+e	 29246
+a	 27740
+i	 26873
+o	 24009
+n	 17331
+r	 16625
+l	 16189
+t	 14262
+s	 13723
+c	 11515
+e_	 9929
+a_	 8820
+d	 8768
+o_	 7670
+u	 7658
+i_	 7617
+p	 7027
+m	 6777
+_d	 5357
+v	 5117
+_s	 4832
+_c	 4597
+,_	 4585
+,	 4585
+g	 4221
+er	 4214
+_p	 4050
+_a	 3785
+re	 3781
+on	 3652
+.	 3574
+co	 3451
+_l	 3249
+to	 3202
+di	 3192
+an	 3157
+en	 3093
+._	 3036
+f	 3023
+ra	 2851
+la	 2837
+_i	 2832
+b	 2821
+no	 2808
+in	 2780
+nt	 2780
+h	 2778
+ri	 2759
+Ã	 2666
+_e	 2584
+or	 2548
+n_	 2545
+el	 2544
+al	 2523
+de	 2477
+l_	 2469
+ll	 2447
+ta	 2402
+te	 2390
+ch	 2347
+_di	 2309
+ar	 2248
+ro	 2226
+le	 2226
+ti	 2200
+ia	 2131
+li	 2097
+_m	 2087
+si	 2081
+la_	 2073
+es	 2071
+at	 2044
+se	 2032
+_co	 2011
+to_	 1975
+io	 1861
+va	 1845
+ne	 1840
+di_	 1809
+so	 1782
+ss	 1754
+z	 1754
+_de	 1750
+st	 1718
+_di_	 1698
+re_	 1679
+ma	 1679
+_n	 1662
+il	 1658
+un	 1652
+me	 1646
+pr	 1623
+pe	 1617
+ol	 1607
+_f	 1574
+na	 1571
+_e_	 1545
+'	 1509
+tt	 1496
+he	 1475
+ci	 1475
+ve	 1457
+tr	 1455
+ent	 1451
+av	 1442
+"	 1426
+che	 1420
+_u	 1396
+ca	 1393
+ell	 1388
+no_	 1379
+le_	 1376
+it	 1370
+_t	 1347
+ic	 1332
+os	 1319
+_r	 1316
+he_	 1314
+che_	 1286
+ni	 1285
+_ch	 1276
+om	 1261
+lo	 1237
+o,	 1233
+o,_	 1233
+do	 1222
+po	 1216
+_la	 1205
+on_	 1203
+mo	 1200
+nd	 1195
+_v	 1179
+is	 1175
+_un	 1175
+con	 1155
+del	 1152
+_g	 1145
+_del	 1140
+_pr	 1128
+da	 1116
+_il	 1094
+va_	 1086
+il_	 1084
+_il_	 1083
+sc	 1080
+_in	 1077
+q	 1066
+qu	 1066
+lla	 1055
+ie	 1048
+_che	 1041
+as	 1033
+su	 1024
+_che_	 1020
+e,	 1018
+e,_	 1018
+ac	 1013
+sa	 1002
+_pe	 997
+_la_	 989
+im	 977
+ce	 977
+pi	 976
+gi	 972
+cc	 972
+li_	 970
+lla_	 969
+per	 960
+ev	 959
+_q	 956
+_qu	 956
+si_	 946
+te_	 936
+ra_	 936
+ess	 935
+_con	 930
+nte	 928
+am	 927
+_al	 926
+l'	 921
+_ma	 916
+gl	 907
+et	 899
+ua	 889
+gli	 887
+mi	 884
+_se	 880
+a,_	 867
+a,	 867
+Ã²	 865
+²	 865
+pa	 856
+_su	 834
+ue	 806
+_si	 796
+hi	 788
+_b	 780
+_no	 777
+o.	 777
+_le	 777
+are	 772
+zi	 759
+el_	 752
+²_	 751
+Ã²_	 751
+nc	 747
+se_	 746
+r_	 744
+ato	 743
+vi	 741
+com	 740
+_per	 739
+_da	 736
+fe	 733
+eva	 732
+men	 729
+o._	 726
+lt	 725
+pro	 717
+_"	 712
+ne_	 711
+i,	 704
+i,_	 704
+_ri	 701
+ti_	 699
+chi	 698
+_so	 695
+ta_	 688
+_a_	 688
+na_	 687
+ut	 687
+lo_	 676
+un_	 668
+dell	 663
+_dell	 662
+_o	 657
+ion	 656
+_un_	 650
+_pro	 649
+er_	 648
+ano	 646
+e.	 643
+vo	 640
+ella	 634
+ment	 634
+era	 633
+be	 627
+tto	 625
+all	 625
+uo	 621
+eg	 614
+ant	 613
+ro_	 610
+e._	 608
+ella_	 608
+que	 607
+_pi	 601
+rt	 600
+gli_	 595
+fi	 595
+non	 595
+ere	 592
+ava	 591
+nti	 590
+_av	 587
+ndo	 585
+em	 584
+sso	 583
+_non	 583
+tu	 581
+bi	 580
+sp	 580
+_ne	 578
+tra	 576
+_ca	 575
+a.	 572
+io_	 571
+non_	 569
+_non_	 568
+eri	 568
+ur	 568
+_si_	 567
+mp	 562
+fa	 559
+_le_	 559
+eva_	 554
+and	 551
+ore	 551
+in_	 549
+_po	 549
+_que	 548
+one	 548
+ir	 544
+rs	 544
+ag	 541
+a._	 537
+iv	 537
+iÃ	 536
+nte_	 535
+ia_	 534
+nto	 530
+ot	 529
+_in_	 528
+do_	 526
+zio	 525
+_pa	 525
+ett	 524
+ed	 519
+ano_	 515
+ato_	 514
+are_	 514
+ente	 513
+'a	 509
+za	 504
+oc	 502
+ap	 498
+ul	 498
+_com	 496
+_st	 490
+me_	 489
+est	 489
+lle	 485
+sse	 482
+ns	 481
+pre	 480
+_l'	 477
+nz	 475
+ome	 475
+ei	 474
+sta	 471
+ono	 469
+ov	 467
+_con_	 466
+con_	 466
+ec	 466
+so_	 462
+i.	 461
+ione	 459
+op	 457
+_del_	 454
+del_	 454
+_an	 453
+br	 451
+ni_	 449
+esso	 448
+ave	 446
+..	 445
+_fa	 444
+ll'	 442
+ver	 442
+of	 436
+cu	 436
+ui	 435
+S	 430
+ad	 429
+id	 428
+acc	 425
+zion	 423
+tÃ	 423
+att	 423
+i._	 419
+ge	 418
+tro	 418
+rc	 417
+ma_	 417
+per_	 416
+_per_	 414
+og	 411
+bb	 410
+ba	 410
+ei_	 407
+C	 406
+_er	 405
+mo_	 404
+tto_	 403
+fo	 403
+V	 403
+gn	 400
+_tr	 400
+cor	 399
+una	 397
+anc	 395
+lu	 395
+_ve	 395
+una_	 392
+A	 390
+ig	 387
+nn	 386
+az	 385
+ 	 385
+Ã 	 385
+l'a	 385
+sor	 384
+ndo_	 384
+_mo	 384
+qua	 383
+_vi	 382
+van	 381
+ente_	 379
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/iw-iso_8859_8.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/iw-iso_8859_8.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/iw-iso_8859_8.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 81560
+é	 23072
+å	 19215
+ä	 15606
+ì	 12612
+ø	 11293
+ú	 11070
+î	 10090
+á	 9648
+à	 9601
+ù	 9081
+ä_	 7811
+ð	 6685
+ò	 6326
+_ú	 5878
+í	 5542
+ã	 5019
+ç	 4669
+_í	 4570
+á_	 4267
+ë	 3984
+_ä	 3812
+÷	 3769
+ô	 3699
+ì_	 3693
+íé	 3535
+î_	 3489
+ñ	 3374
+à_	 3362
+úå	 3130
+,	 3067
+_ì	 3037
+_,	 3035
+_é	 2936
+ù_	 2886
+_íé	 2840
+â	 2768
+è	 2626
+ï	 2424
+_ø	 2395
+_úå	 2291
+.	 2256
+ö	 2215
+_.	 2205
+éð	 2144
+ò_	 2003
+_ï	 1959
+_å	 1913
+"	 1815
+éá	 1797
+ìù	 1742
+éì	 1687
+éø	 1665
+é_	 1647
+åé	 1620
+å_	 1578
+åø	 1525
+úà	 1475
+ë_	 1469
+øå	 1411
+æ	 1383
+åð	 1353
+îä	 1351
+úé	 1343
+éé	 1343
+ìå	 1315
+éã	 1285
+øé	 1236
+îä_	 1211
+äì	 1206
+åî	 1192
+ðé	 1163
+øù	 1155
+éà	 1146
+àø	 1138
+_úà	 1137
+ùé	 1134
+éù	 1087
+ð_	 1080
+ìà	 1074
+åç	 1067
+_à	 1062
+ùî	 1059
+éî	 1052
+äé	 1047
+-	 1024
+ìù_	 1008
+åä	 973
+øá	 967
+åà	 954
+úà_	 951
+åì	 948
+_ã	 941
+éä	 896
+ðå	 888
+åò	 883
+éë	 873
+åù	 871
+ìò	 867
+àì	 850
+òå	 843
+_-	 830
+ç_	 830
+ãå	 824
+ïå	 820
+ø_	 806
+åá	 805
+_ìù	 799
+éè	 784
+àä	 773
+_ìù_	 748
+éò	 746
+ãé	 743
+_ù	 726
+_úà_	 723
+ê	 720
+_úé	 719
+-_	 716
+_-_	 713
+áé	 709
+áå	 706
+åú	 699
+àä_	 690
+øî	 686
+ùä	 683
+åã	 678
+éç	 675
+ô_	 672
+äð	 669
+_á	 668
+_ò	 659
+_ê	 655
+éñ	 652
+ïé	 649
+_ìò	 640
+éå	 635
+àî	 635
+éá_	 632
+ú_	 631
+îà	 628
+ùå	 627
+_ïå	 624
+ìé	 624
+ìò_	 621
+úä	 619
+éú	 600
+äì_	 599
+åë	 599
+éô	 596
+ôä	 595
+å÷	 586
+äù	 578
+òé	 575
+_ïé	 569
+îå	 564
+_ìò_	 561
+÷é	 560
+éâ	 557
+éä_	 557
+øùé	 554
+íå	 548
+àì_	 548
+úåé	 548
+ìàø	 546
+øà	 542
+äø	 540
+"_	 540
+îá	 539
+ùä_	 538
+åô	 538
+àøù	 535
+øò	 534
+çä	 533
+åâ	 532
+àøùé	 530
+ìàøùé	 530
+ìàøù	 530
+àå	 527
+îé	 525
+_éë	 518
+äî	 518
+ôä_	 511
+éë_	 510
+_éð	 509
+ìë	 506
+úî	 502
+îá_	 500
+ñå	 498
+çà	 497
+é÷	 497
+åå	 494
+_÷	 485
+â_	 481
+íéì	 477
+_äé	 477
+ãî	 472
+áä	 470
+,ä	 470
+_,ä	 470
+÷_	 469
+òá	 468
+_íå	 467
+äá	 467
+çä_	 466
+_éë_	 463
+àá	 462
+øç	 462
+_àì	 461
+õ	 455
+îì	 454
+éðé	 454
+ùà	 453
+øä	 453
+éö	 452
+íéø	 451
+_äð	 447
+èé	 443
+ã_	 441
+îò	 440
+íéé	 439
+åä_	 439
+'	 435
+àî_	 430
+.í	 429
+úð	 429
+_.í	 428
+ø÷	 427
+úø	 423
+åñ	 417
+ðù	 417
+_äì	 414
+ñì	 413
+ðú	 408
+ñ_	 405
+ñä	 400
+ìô	 400
+áù	 399
+,í	 399
+_,í	 399
+îî	 397
+ùé_	 396
+ðá	 396
+òä	 394
+úä_	 393
+úåð	 393
+íéð	 389
+_øå	 385
+øîà	 384
+éà_	 384
+ìá	 384
+úá	 381
+áø	 378
+áä_	 377
+èñ	 374
+_õ	 374
+òî	 374
+çé	 373
+øô	 373
+äå	 371
+çå	 370
+áì	 370
+_ìà	 370
+÷å	 367
+_äø	 366
+_íéø	 364
+çî	 363
+æ_	 362
+_ç	 360
+ðë	 360
+_ìå	 360
+ëå	 359
+,ú	 358
+_,ú	 357
+îú	 356
+éðå	 353
+åøé	 353
+åà_	 349
+øã	 348
+úåø	 348
+àé	 345
+ó	 345
+ìùî	 344
+ëé	 340
+_íéì	 340
+åö	 338
+úì	 338
+_íéé	 336
+øçà	 335
+_úåé	 335
+îà_	 332
+ìç	 331
+_úø	 329
+_úåð	 325
+âé	 325
+òä_	 325
+:	 324
+ôì	 324
+àá_	 324
+ùø	 322
+øè	 321
+úù	 320
+ö_	 320
+îò_	 319
+åé_	 319
+_:	 319
+öî	 316
+ùîî	 315
+_ñ	 315
+úéð	 315
+ñî	 315
+äã	 313
+øä_	 312
+åè	 312
+_ó	 310
+ùàø	 309
+øùé_	 305
+àøùé_	 305
+.íé	 305
+_.íé	 304
+äú	 303
+éèñ	 303
+_'	 303
+âä	 302
+ùî_	 302
+_íéð	 301
+ìä	 298
+øâ	 294
+çè	 293
+ãò	 293
+íéã	 292
+àù	 292
+ìùîî	 292
+íò	 292
+éãé	 290
+ùì	 289
+ôå	 289
+ãá	 289
+öå	 287
+_íò	 286
+,íé	 285
+_,íé	 285
+ðî	 284
+ñé	 282
+ùá	 282
+_øù	 281
+ãø	 281
+_úåø	 281
+÷ä	 280
+úåù	 278
+äù_	 276
+îì_	 276
+_àì_	 275
+åäé	 274
+_ìàø	 274
+ôé	 274
+òá_	 271
+ìà_	 271
+áà	 270
+çà_	 269
+çì	 268
+òô	 267
+áò	 267
+.ä	 266
+_øé	 266
+_ìàøù	 266
+åðé	 266
+_.ä	 265
+éèñì	 265
+èñì	 265
+éìà	 265
+úò	 264
+ðä	 263
+÷ì	 262
+ðéè	 260
+_.ú	 260
+.ú	 260
+ôì_	 260
+äå_	 259
+ñìô	 258
+èñìô	 258
+éèñìô	 258
+ðéèñì	 257
+ðéèñ	 257
+åî_	 256
+ñä_	 256
+îù	 255
+éøå	 255
+ðù_	 254
+åîú	 254
+ää	 252
+á÷	 251
+éù_	 251
+_åð	 251
+éøá	 251
+_øá	 249
+_éã	 249
+_íéã	 249
+ëä	 248
+âð	 247
+_ãå	 247
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/ja-euc_jp.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/ja-euc_jp.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/ja-euc_jp.lm	(revision 24799)
@@ -0,0 +1,400 @@
+€	 78988
+¥	 57258
+_	 34456
+¡	 22280
+£	 18223
+Œ	 11290
+¹	 11237
+Î	 10621
+¬	 9502
+ë	 8859
+¿	 8812
+€Î	 8266
+È	 8180
+Í	 7520
+Ë	 7325
+Ã	 6982
+Ê	 6930
+Ç	 6929
+µ	 6896
+Æ	 6865
+€ë	 6858
+ì	 6261
+¡Œ	 6067
+Œ¥	 5926
+¡Œ¥	 5888
+Ï	 5878
+ž	 5806
+Ä	 5562
+Á	 5426
+œ	 5314
+€Ë	 5228
+»	 5011
+·	 4836
+€€	 4775
+É	 4385
+£_	 4323
+€Ï	 4310
+¡£	 4305
+¡£_	 4294
+Â	 4253
+¥¹	 4090
+¹€	 4075
+ê	 4032
+§	 4029
+Ì	 3975
+ó	 3947
+Ÿ	 3923
+°	 3853
+Ž	 3845
+ò	 3759
+³	 3583
+¡€	 3485
+€ì	 3475
+®	 3367
+À	 3366
+ì€	 3366
+€ò	 3314
+ë¡	 3313
+Å	 3282
+¯	 3273
+€ì€	 3255
+Ó	 3207
+Ã¥	 3188
+¥Ã	 3182
+¬¥	 3175
+¥Ã¥	 3170
+¬§	 3131
+á	 3058
+€ë¡	 3035
+¥¬	 3024
+¬¥¬	 3000
+ë¡£	 2952
+ë¡£_	 2948
+€ë¡£	 2947
+€ë¡£_	 2943
+¢	 2905
+Ô	 2893
+€¹	 2865
+€È	 2848
+²	 2819
+È€	 2791
+¿®	 2776
+¥¬¥	 2749
+¬¥¬¥	 2730
+¥¬¥¬	 2729
+¬¥¬¥¬	 2729
+ª	 2697
+è	 2689
+Ð	 2545
+€Æ	 2543
+¥È	 2525
+€¹€	 2473
+¥¬¥¬¥	 2459
+€Ç	 2399
+.	 2395
+Ñ	 2381
+,	 2380
+µ€	 2357
+¥ó	 2346
+Ö	 2340
+±	 2328
+¥£	 2326
+¡¥	 2316
+×	 2314
+Õ	 2293
+€¹€ë	 2283
+¹€ë	 2283
+€µ	 2253
+._	 2251
+€Ê	 2227
+€µ€	 2222
+¥ž	 2200
+_€	 2189
+Ç€	 2172
+¥»	 2145
+Ó¥	 2137
+€¿	 2112
+€µ€ì	 2110
+µ€ì	 2110
+«	 2100
+µ¡	 2061
+¥¯	 2027
+ë€	 2017
+€·	 2011
+¥Ó	 2007
+¥Ó¥	 2002
+Ë€	 1995
+µ€ì€	 1983
+€µ€ì€	 1983
+é	 1947
+ó¥	 1913
+è€	 1861
+€¥	 1847
+¥ó¥	 1834
+€¬	 1834
+¥ì	 1826
+­	 1795
+€€€	 1791
+ç	 1782
+Þ	 1782
+€Ë€	 1763
+€È€	 1760
+¥á	 1716
+¥ë	 1713
+š	 1709
+á¥	 1696
+Ê€	 1691
+·€	 1688
+_¥	 1686
+¯¥	 1679
+¥¯¥	 1669
+¥á¥	 1668
+Ý	 1666
+€ë€	 1659
+€Ç€	 1655
+¢€	 1638
+â	 1637
+¿€	 1612
+€·€	 1598
+Œ¥ž	 1584
+¡Œ¥ž	 1584
+€Ê€	 1570
+¥µ	 1568
+€è	 1565
+€è€	 1562
+ÍÑ	 1554
+Ø	 1544
+Æ€	 1541
+Æ¥	 1538
+¥¿	 1526
+³€	 1525
+ì€ë	 1523
+€ì€ë	 1523
+ð	 1517
+€¢	 1510
+€¢€	 1509
+-	 1490
+»¡	 1476
+¥ê	 1465
+¥€	 1465
+¶	 1464
+¥á¥Ã	 1454
+á¥Ã	 1454
+¥á¥Ã¥	 1453
+¥Ã¥»¡	 1453
+¥»¡Œ¥	 1453
+á¥Ã¥»	 1453
+Ã¥»¡	 1453
+¥»¡Œ	 1453
+¥Ã¥»	 1453
+»¡Œ¥	 1453
+¥»¡	 1453
+á¥Ã¥	 1453
+Ã¥»	 1453
+Ã¥»¡Œ	 1453
+»¡Œ	 1453
+»¡Œ¥ž	 1452
+º	 1450
+ì¥	 1445
+õ	 1441
+¥·	 1420
+à	 1419
+ý	 1418
+¥µ¡	 1415
+µ¡Œ¥	 1413
+¥µ¡Œ	 1413
+¥µ¡Œ¥	 1413
+µ¡Œ	 1413
+·¥	 1413
+¥Æ	 1411
+Ó¥¹	 1406
+Œ¥Ó¥	 1406
+¡Œ¥Ó¥	 1406
+¥Ó¥¹	 1406
+¡Œ¥Ó	 1406
+Œ¥Ó	 1406
+¥ì¥	 1403
+µ¡Œ¥Ó	 1403
+Œ¥Ó¥¹	 1403
+¥Æ¥	 1396
+¥·¥	 1392
+¥€¥	 1383
+æ	 1378
+œ€	 1372
+_£	 1368
+Î¥	 1358
+T	 1354
+Ï¡	 1341
+ª€	 1338
+€é	 1337
+€³	 1325
+Š	 1323
+Î€	 1314
+€Î¥	 1312
+¢€ë	 1311
+€¢€ë	 1311
+Ô€	 1308
+)	 1302
+_.	 1297
+Ü	 1294
+£Í	 1294
+€³€	 1292
+ŒÔ	 1289
+¥¹€	 1284
+€Æ€	 1284
+¿¥	 1273
+¹¥	 1260
+_._	 1244
+÷	 1244
+þ	 1238
+¥¹¥	 1211
+¥Õ	 1190
+ë¥	 1182
+_¡	 1182
+€¿€	 1152
+È¥	 1151
+Í×	 1145
+µ€ì€ë	 1130
+Çœ	 1129
+Õ¥	 1126
+Û	 1120
+¥Õ¥	 1113
+€Ï¡	 1105
+¥Ç	 1103
+ß	 1101
+é€	 1084
+¥¢	 1080
+ž€	 1062
+ï	 1060
+Á÷	 1051
+£Á	 1050
+¡¥£	 1043
+ÄÌ	 1033
+§¬	 1033
+§¬§	 1033
+¬§¬	 1032
+¬§¬§	 1032
+Ï¡€	 1030
+€Ï¡€	 1030
+Ç€¢	 1022
+€Ç€¢	 1021
+Ç€¢€	 1021
+€Ç€¢€	 1020
+Ç¥	 1012
+í	 1006
+Äê	 997
+¢¥	 995
+€é€	 991
+Í£	 988
+¥¢¥	 985
+£¥	 984
+£Í£	 983
+¡Ê	 981
+€ª	 976
+¥£¥	 974
+€Î€	 971
+€ª€	 971
+š€	 962
+¥¿¥	 955
+ê¥	 955
+ê€	 954
+¥È¥	 953
+¥Ç¥	 951
+¥É	 942
+®€	 929
+Íý	 920
+á€	 918
+ä	 909
+€«	 904
+ø	 904
+ŒÔ€	 903
+€¢€ë¡	 900
+¢€ë¡	 900
+¥_	 894
+«€	 893
+-_	 892
+Ï,	 887
+¥È€	 886
+€Ï,	 886
+¡¥_	 884
+¥×	 881
+€ê	 881
+(	 878
+C	 877
+Ç€¢€ë	 877
+I	 877
+€â	 875
+¢€ë¡£	 875
+i	 872
+¥ê¥	 865
+¡Ë	 860
+Ö€	 857
+â€	 856
+¥à	 855
+§£	 855
+­€	 846
+ÇÛ	 841
+Þ€	 834
+¬§£	 834
+e	 825
+€«€	 825
+£Ð	 819
+€·€Æ	 818
+·€Æ	 818
+£Ô	 808
+Œš	 802
+¥Ç¥£	 796
+Ç¥£	 796
+_¬	 792
+a	 776
+¥Ã¥È	 771
+Ã¥È	 771
+€¹€ë€	 770
+¹€ë€	 770
+ž¥	 767
+Ñ€	 748
+€ì€ë¡	 743
+ì€ë¡	 743
+¥Ç¥£¥	 741
+Ç¥£¥	 741
+§_	 738
+¥ž¥	 732
+N	 729
+¹ð	 728
+¥ë¥	 728
+Á€	 727
+Œõ	 724
+ì€ë¡£	 722
+¥ž€	 718
+Ë€è	 716
+Ë€è€	 716
+€Ë€è€	 715
+¡Œ¥ž€	 715
+Œ¥ž€	 715
+€Ë€è	 715
+×¥	 715
+¥×¥	 711
+§¬§¬§	 710
+§¬§¬	 710
+¬§¬§¬	 710
+Ä€	 705
+Ò	 702
+©	 701
+_¬§	 699
+³€È	 696
+¬§_	 694
+»¥	 694
+¹€ë¡	 692
+€¹€ë¡	 692
+€³€È	 692
+¥»¥	 686
+ÍÑ€	 685
+€Ê€€	 685
+Ê€€	 685
+«¹	 684
+Æ€€	 684
+n	 682
+ó€	 682
+£Ä	 681
+Ž«	 681
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/ja-shift_jis.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/ja-shift_jis.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/ja-shift_jis.lm	(revision 24799)
@@ -0,0 +1,400 @@
+	 9970
+	 2204
+_	 1555
+	 1214
+	 891
+A	 885
+	 846
+Ì	 836
+A	 831
+	 818
+	 815
+Ì	 790
+	 739
+	 729
+	 618
+	 607
+	 589
+	 568
+ð	 566
+	 555
+É	 552
+	 528
+É	 527
+ð	 500
+	 489
+	 481
+µ	 461
+¢	 460
+œ	 453
+	 449
+µ	 449
+Æ	 445
+Í	 440
+B	 419
+Å	 411
+B	 405
+ª	 404
+œ	 404
+¢	 401
+Ä	 396
+È	 389
+Æ	 387
+é	 368
+·	 366
+µ	 363
+Å	 361
+µ	 357
+é	 352
+Í	 352
+Ä	 349
+È	 345
+è	 330
+ª	 321
+	 320
+¢	 320
+¢	 306
+·	 305
+Ü	 292
+©	 284
+@	 282
+_	 281
+Ü	 275
+Ü	 268
+v	 263
+Ü	 258
+È	 256
+ê	 251
+È	 240
+è	 239
+­	 238
+Ä	 234
+à	 232
+Æ	 231
+Å	 226
+@	 220
+œ	 217
+Æ	 214
+Å	 211
+_	 210
+Ä	 205
+©	 204
+©	 203
+œ	 199
+³	 198
+Ì	 195
+ç	 194
+¯	 194
+©	 182
+Á	 182
+è	 181
+ß	 180
+É	 180
+A	 176
+€	 176
+±	 173
+É	 172
+Ì	 172
+v	 169
+»	 169
+·	 167
+ñ	 167
+B_	 166
+N	 166
+B_	 166
+O	 165
+«	 165
+A	 165
+·	 164
+P	 163
+ê	 163
+Á	 159
+æ	 159
+_@	 157
+ê	 156
+·	 155
+[	 153
+ç	 153
+X	 153
+é	 148
+i	 148
+é	 148
+Á	 147
+·B	 146
+±	 146
+·B	 145
+j	 142
+Á	 142
+P	 141
+µÄ	 141
+µÄ	 141
+Í	 141
+à	 141
+·	 137
+V	 137
+ß	 135
+ê	 135
+ú	 134
+u	 133
+[	 132
+€	 131
+l	 129
+å	 129
+s	 128
+Ÿ	 128
+ 	 125
+±	 125
+S	 125
+g	 124
+ª	 123
+³	 123
+ü	 123
+±	 122
+	 122
+Ç	 120
+³	 120
+è	 120
+Š	 120
+\	 119
+Í	 119
+u	 119
+v	 119
+œ	 119
+ß	 118
+W	 118
+Í	 117
+Ü·	 117
+R	 117
+œ	 117
+Ü·	 117
+æ	 114
+â	 114
+ã	 113
+	 113
+{	 113
+N	 112
+ 	 111
+í	 111
+³	 111
+o	 108
+Ü·	 107
+Ü·	 107
+Q	 106
+	 106
+«	 105
+Ü·B	 104
+à	 103
+«	 103
+ç	 103
+	 103
+ì	 102
+»	 102
+ 	 100
+ú	 100
+ 	 100
+ß	 99
+µœ	 98
+µœ	 98
+Ê	 97
+¯	 96
+¶	 96
+ð	 96
+I	 95
+[	 95
+[	 95
+ÍA	 94
+å	 94
+ÍA	 94
+€	 93
+Ä¢	 92
+Â	 92
+Ä¢	 92
+­	 92
+E	 92
+Q	 91
+š	 90
+w	 90
+Ä¢	 89
+Ä¢	 89
+Î	 89
+Œ	 88
+ç	 87
+x	 87
+­	 86
+P	 86
+§	 86
+ª	 86
+n	 86
+	 85
+·é	 85
+·é	 85
+€	 84
+ñ	 84
+¿	 84
+Í	 84
+À	 84
+Ÿ	 83
+œB	 83
+œB	 83
+	 83
+¯	 83
+ï	 82
+²	 82
+v	 80
+Ÿ	 80
+P	 80
+©ç	 79
+¡	 79
+A	 77
+Ý	 77
+¬	 77
+Ç	 77
+µÄ	 77
+µÄ	 77
+ñ	 76
+B	 75
+X	 75
+©ç	 75
+«	 74
+c	 74
+Ù	 74
+O	 73
+Š	 73
+š	 72
+i	 72
+ð	 71
+Š	 71
+B	 71
+æ	 70
+ï	 70
+Û	 70
+y	 70
+Ç	 69
+T	 69
+p	 69
+è	 68
+	 68
+	 68
+·B_	 67
+l	 67
+Z	 67
+æ	 67
+	 67
+ü	 67
+®	 67
+·B_	 67
+Ï	 67
+X	 66
+Ð	 66
+à	 66
+¹	 66
+Í	 66
+A	 66
+â	 65
+¯	 65
+A	 65
+U	 65
+š	 64
+í	 64
+í	 63
+èÜ	 62
+C	 62
+Áœ	 62
+èÜ	 62
+R	 62
+µ	 62
+ÁÄ	 62
+ÁÄ	 62
+Áœ	 62
+_	 61
+èÜ	 61
+µ	 61
+ü	 61
+^	 61
+	 61
+èÜ	 61
+é	 61
+l	 61
+é	 61
+»	 60
+üv	 60
+è	 60
+ü	 60
+v	 60
+üv	 60
+Ô	 60
+í	 60
+±Æ	 60
+	 60
+A	 60
+û	 59
+	 59
+ÈÇ	 59
+ÈÇ	 59
+Â	 59
+¯	 59
+W	 59
+ð	 58
+i	 58
+±Æ	 58
+Q	 58
+j	 58
+­	 58
+N	 58
+{	 57
+»	 57
+ª	 57
+	 57
+ð	 57
+Ì	 56
+É	 56
+µA	 56
+e	 56
+g	 56
+µA	 56
+Ê	 56
+@	 56
+Â	 55
+z	 55
+I	 55
+Y	 55
+Å·	 55
+¿	 55
+èA	 55
+A	 55
+š	 54
+¹	 54
+X	 54
+Ÿ	 54
+t	 54
+Å·	 54
+j	 54
+Š	 53
+É	 53
+±Æ	 53
+ã	 53
+±Æ	 53
+º	 53
+I	 53
+	 53
+ª	 53
+A	 53
+U	 53
+~	 53
+¹	 52
+A	 52
+x	 52
+èA	 52
+Ì	 52
+n	 52
+S	 51
+A	 51
+b	 51
+j	 51
+Ç	 51
+Q	 51
+¢œ	 51
+E	 51
+î	 51
+A	 51
+	 51
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/ji-utf8.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/ji-utf8.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/ji-utf8.lm	(revision 24799)
@@ -0,0 +1,400 @@
+×	 29767
+_	 13552
+_×	 6516
+Ö	 4273
+	 3670
+×	 3670
+×¢	 3261
+¢	 3261
+¢×	 2826
+×¢×	 2826
+×Ö	 2785
+Ö	 2785
+×	 2565
+	 2565
+š	 2082
+×š	 2082
+×	 2062
+××	 2062
+	 1857
+×	 1857
+·	 1828
+Ö·	 1828
+	 1793
+×	 1793
+_×	 1537
+_	 1532
+×_	 1532
+·×	 1527
+Ö·×	 1527
+×Ö·	 1517
+Ö·	 1517
+×š×	 1355
+š×	 1355
+	 1270
+×	 1270
+ž	 1268
+×Öž	 1268
+Öž	 1268
+Öž	 1268
+Ö·×	 1240
+×Ö·×	 1240
+× 	 1232
+ 	 1232
+×Öž×	 1229
+Öž×	 1229
+ž×	 1229
+Öž×	 1229
+× ×	 1181
+ ×	 1181
+×	 1116
+	 1116
+	 1031
+×	 1031
+××	 1012
+×	 1012
+××	 1007
+×	 1007
+××	 975
+×	 975
+××	 965
+×	 965
+×€Ö	 929
+€	 929
+×€	 929
+€Ö	 929
+¢×š	 873
+×¢×š	 873
+××	 870
+×	 870
+×	 868
+	 868
+¡	 832
+×¡	 832
+§	 797
+×§	 797
+_××	 784
+×	 766
+	 766
+_×Ö	 752
+×	 747
+××	 747
+	 742
+×	 742
+©	 725
+×©	 725
+×_	 699
+_	 699
+×°	 691
+°	 691
+×°×	 674
+°×	 674
+²	 667
+×²	 667
+×	 664
+××	 664
+¿	 661
+Ö¿	 661
+×§×	 654
+§×	 654
+¿×	 652
+Ö¿×	 652
+×©×	 651
+©×	 651
+×	 643
+××	 643
+×€Ö¿	 641
+€Ö¿	 641
+×€Ö¿×	 638
+€Ö¿×	 638
+_×Ö·	 638
+×š_	 592
+š_	 592
+_×	 560
+_××	 554
+,	 551
+,_	 534
+×	 517
+	 517
+_×€Ö	 502
+_×€	 502
+××	 472
+×	 472
+×¡×	 436
+¡×	 436
+×Š	 436
+Š	 436
+×Š×	 433
+Š×	 433
+_×°	 430
+_×°×	 429
+	 410
+×	 410
+¢×š_	 404
+_×€Ö¿	 404
+×¢×š_	 404
+_×	 400
+_××	 396
+××¢	 390
+×¢	 390
+_×	 390
+_××	 386
+×¢×	 384
+×¢×	 384
+××¢×	 384
+¢×	 384
+×¢×š×	 382
+¢×š×	 382
+.	 374
+××	 372
+×	 372
+ÖŒ	 366
+Œ	 366
+×	 363
+××	 363
+××	 362
+×××	 362
+_×	 359
+×±	 357
+±	 357
+_××	 356
+××	 349
+×	 349
+×_	 346
+_	 346
+×¢_	 343
+¢_	 343
+×_	 337
+××_	 337
+×¢	 334
+××¢	 334
+_××	 331
+×	 330
+	 330
+×¢×	 323
+Œ×	 323
+××¢×	 323
+ÖŒ×	 323
+²×	 322
+×²×	 322
+×¢×_	 321
+¢×_	 321
+±×	 320
+×±×	 320
+×	 317
+××	 317
+²Ö·	 311
+Ö·×š	 311
+×²Ö	 311
+·×š	 311
+Ö·×š	 311
+×²Ö·	 311
+²Ö	 311
+××¢	 310
+×¢	 310
+._	 307
+-	 305
+·_	 297
+Ö·_	 297
+	 294
+×	 294
+ ×¢	 290
+× ×¢	 290
+×¡_	 289
+¡_	 289
+×€ÖŒ	 288
+€ÖŒ	 288
+×²Ö·×	 287
+²Ö·×	 287
+×_	 283
+_	 283
+Ö·_	 274
+×Ö·_	 274
+Ö·×š×	 272
+·×š×	 272
+××¢×	 261
+×¢×	 261
+_××	 260
+_×	 260
+_×Š	 259
+×©	 257
+××©	 257
+_×Š×	 256
+××	 254
+×	 254
+×€ÖŒ×	 252
+€ÖŒ×	 252
+××¢	 248
+×¢	 248
+_×§	 247
+× ×¢×	 247
+ ×¢×	 247
+××¢	 245
+×¢	 245
+_×§×	 245
+××	 244
+××	 244
+×	 244
+×××	 244
+¢×	 238
+×¢×	 238
+×	 235
+××	 235
+××Ö	 235
+×©×	 235
+©×	 235
+×Ö	 235
+××	 234
+×	 234
+_××	 231
+×¢×š	 231
+_×	 231
+Ö·× 	 229
+·× 	 229
+·× ×	 228
+Ö·× ×	 228
+_××	 227
+_××¢	 226
+	 219
+×	 219
+"	 218
+×¢×	 217
+××¢×	 217
+°×¢	 217
+×°×¢	 217
+·×	 216
+Ö·×	 216
+_××	 215
+_× 	 215
+×¢××	 212
+¢××	 212
+š×	 211
+×š×	 211
+_× ×	 211
+××¢×	 211
+×¢×	 211
+×°×	 210
+°×	 210
+_××¢	 210
+°×Ö	 209
+×°×¢×	 209
+×°×Ö	 209
+°×¢×	 209
+×©×	 208
+××©×	 208
+×§	 207
+××§	 207
+×š×Ö	 206
+š×Ö	 206
+_	 205
+×_	 205
+×	 196
+××	 196
+_×©	 195
+×××	 195
+××	 195
+Ö·×	 193
+_×©×	 191
+Ö¿×	 189
+¿×	 189
+€Ö¿×	 189
+Ö¿×Ö	 188
+¿×	 188
+Ö¿××	 188
+Ö¿×	 188
+¿××	 188
+¿×Ö	 188
+××	 187
+×Öž	 186
+_××	 185
+€Ö¿×	 184
+_×¢	 179
+_××	 178
+×	 176
+××	 176
+××Ö	 175
+×Ö	 175
+Öž×¡	 174
+Öž×¡	 174
+××	 174
+×	 174
+ž×¡	 174
+×_	 173
+_	 173
+×_	 173
+××_	 173
+×_	 171
+·××	 171
+_	 171
+Ö·××	 171
+_×¢×	 171
+Öž×	 169
+ž×	 169
+Öž×	 169
+××	 168
+×	 168
+Öž×š	 166
+××	 166
+Öž×š	 166
+ž×š	 166
+×××	 166
+× ×	 164
+×¢× 	 164
+ ×	 164
+¢× 	 164
+š×	 163
+×š×	 163
+××_	 163
+×_	 163
+°×Öž	 162
+×¢× ×	 162
+¢× ×	 162
+¿×Ö·	 160
+¢×	 160
+×¢×	 160
+_×	 158
+š××	 157
+×š	 157
+×š××	 157
+××š	 157
+-×	 156
+Öž×¡_	 155
+ž×¡_	 155
+×	 154
+_××	 154
+××	 154
+×§×¢	 153
+×× 	 153
+§×¢	 153
+× 	 153
+_×°×	 152
+ ××	 152
+× ××	 152
+×	 151
+××	 151
+××±	 151
+×±	 151
+×Ö	 150
+·×	 150
+Ž	 150
+Ö	 150
+×ÖŽ	 150
+ÖŽ	 150
+ÖŽ	 150
+Ö·×	 150
+ÖŽ×	 149
+ÖŽ×	 149
+Ž×	 149
+×ÖŽ×	 149
+××	 148
+_××	 148
+×××	 148
+×±×	 146
+××±×	 146
+Ö·× 	 146
+_××±	 145
+¿××	 145
+××	 143
+×	 143
+××	 142
+×××	 142
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/ko-korean.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/ko-korean.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/ko-korean.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 11636
+À	 2659
+°	 1629
+Ç	 1578
+ž	 1458
+¿	 1397
+Ž	 1299
+µ	 1118
+Á	 1005
+±	 928
+»	 849
+Œ	 840
+_À	 809
+¹	 808
+º	 780
+¡	 773
+Ã	 764
+³	 674
+Ÿ	 640
+Ì	 591
+Î	 580
+ÀÌ	 538
+œ	 526
+Ï	 519
+Â	 518
+_°	 518
+Ù	 506
+·	 483
+È	 464
+ö	 463
+­	 454
+ŽÙ	 451
+ø	 404
+Æ	 395
+ë	 384
+_¿	 382
+í	 377
+.	 374
+Å	 373
+ç	 358
+._	 347
+_Ç	 344
+ŽÂ	 338
+¡_	 333
+Â_	 329
+¿¡	 327
+_Á	 319
+ŽÂ_	 317
+ŽÙ.	 313
+Ù.	 313
+â	 308
+¶	 308
+ŽÙ._	 301
+Ù._	 301
+»_	 299
+_¹	 291
+î	 288
+®	 282
+À»	 279
+Ö	 278
+Š	 274
+À»_	 271
+Î_	 269
+,	 266
+Ñ	 266
+°í	 261
+Áö	 258
+,_	 258
+°¡	 250
+ß	 248
+_Œ	 246
+Ä	 245
+ÀÇ	 244
+Ì_	 243
+_ž	 243
+_µ	 242
+ü	 238
+é	 235
+Œ­	 234
+ÀÌ_	 234
+ÇÏ	 234
+_±	 233
+Žë	 228
+·Î	 227
+ÇÑ	 222
+œÃ	 222
+_³	 215
+±â	 212
+_Ã	 210
+í_	 208
+_Ž	 206
+Š_	 206
+Ç_	 205
+_Ÿ	 205
+º_	 204
+÷	 198
+Àº	 198
+°í_	 194
+·Î_	 193
+ó	 193
+¿¡_	 193
+žŠ_	 192
+žŠ	 192
+_ÀÌ	 190
+­_	 189
+Àº_	 189
+_œ	 189
+µµ	 188
+ÀÏ	 188
+ÀÇ_	 188
+_º	 186
+Í	 177
+Ú	 175
+ú	 171
+»ç	 161
+Ô	 154
+_ÀÏ	 153
+Ø	 152
+¿ø	 151
+±ž	 150
+µ¿	 147
+Ò	 147
+žž	 145
+Œö	 143
+€	 142
+ºÎ	 142
+_»	 141
+ÀÖ	 140
+æ	 139
+Ð	 138
+ù	 138
+ª	 137
+µé	 136
+è	 134
+Àž	 134
+_ÀÖ	 133
+²	 132
+Ñ_	 127
+ÀÎ	 125
+°¡_	 123
+ÀÚ	 122
+ÇÑ_	 121
+Àü	 121
+ŸÆ	 118
+ý	 117
+å	 116
+Ï_	 115
+Ÿî	 115
+µ_	 115
+¢	 114
+ÖŽ	 113
+°ú	 112
+ž·	 111
+¯	 109
+ÇØ	 109
+§	 108
+à	 108
+_È	 108
+±¹	 107
+Œ­_	 107
+×	 107
+£	 106
+ÀÖŽ	 105
+Èž	 103
+ž®	 101
+ö_	 101
+û	 100
+_ÀÖŽ	 100
+Ãµ	 100
+ž·Î	 100
+"	 98
+Àž·Î	 97
+ÁÖ	 97
+Àž·	 97
+Àå	 95
+_Žë	 94
+¡Œ	 94
+³ª	 94
+_œÃ	 94
+¥	 94
+µî	 94
+Á€	 92
+°ø	 92
+_Å	 91
+á	 91
+Ï°	 90
+ÇÐ	 90
+ž·Î_	 90
+Ê	 89
+©	 89
+Í_	 89
+ž_	 89
+Àž·Î_	 89
+éÀ	 89
+Þ	 88
+¡Œ­	 88
+¿¡Œ	 88
+¿¡Œ­	 88
+ê	 87
+µµ_	 87
+±³	 85
+_Æ	 85
+î_	 84
+°æ	 84
+µéÀ	 84
+ží	 84
+ëÇ	 83
+¿ù	 83
+_Áö	 82
+ÇÏ°	 82
+¿À	 81
+¶ó	 80
+¿¡Œ­_	 79
+¡Œ­_	 79
+ÀÏ_	 78
+Ý	 78
+ÁŠ	 78
+ç_	 78
+øÀ	 78
+'	 77
+Çß	 77
+ì	 77
+Ü	 77
+Áß	 77
+ú_	 76
+Áö_	 76
+Ó	 76
+â_	 75
+(	 74
+)	 74
+»ó	 74
+°ü	 74
+»ý	 73
+_¿ù	 72
+_°¡	 72
+_Œö	 72
+-	 72
+¿©	 72
+ÖŽÙ	 72
+ºž	 71
+ÀÖŽÙ	 71
+»ê	 70
+°³	 70
+œº	 70
+Œ±	 69
+¿ë	 69
+°ú_	 69
+_ÀÖŽÙ	 69
+_µî	 69
+ø_	 69
+ßŽ	 69
+°Í	 68
+³»	 68
+_¡	 68
+_ÇÑ	 68
+ù_	 67
+ÃŒ	 67
+ž¿	 66
+_ÀÏ_	 66
+ÇßŽ	 66
+°Ô	 65
+ñ	 65
+_¶	 65
+_°Í	 65
+ÇßŽÙ	 64
+ßŽÙ	 64
+_ÇÏ	 63
+¹Î	 62
+«	 62
+ÏŽ	 62
+ŒÒ	 62
+¿ù_	 62
+Á¶	 61
+³â	 61
+Ï°í	 61
+ÌŽ	 60
+ŸÈ	 60
+ÇÏ°í	 60
+õ	 59
+_¿ù_	 59
+_Œ­	 59
+Åë	 59
+ÆÄ	 58
+®_	 58
+_žž	 58
+Ø_	 58
+Žç	 57
+ßŽÙ.	 57
+¬	 57
+Õ	 57
+ÇßŽÙ.	 57
+¹°	 57
+Ÿ÷	 57
+ÖŽÙ.	 56
+ß_	 56
+ÀÖŽÙ.	 56
+¿Í	 56
+ßŽÙ._	 56
+Áø	 56
+Àç	 55
+ž°	 55
+ÍÀ	 55
+Æ®	 55
+¹é	 55
+ÀÌŽ	 55
+ÖŽÙ._	 54
+_¹é	 54
+¿Í_	 53
+Àû	 53
+ð	 53
+¹®	 53
+_ÁÖ	 53
+ŽÜ	 53
+Œº	 53
+ÇØ_	 53
+°Ç	 53
+íÀ	 52
+_Àü	 52
+Ô_	 52
+¿¬	 52
+_°æ	 51
+°ÍÀ	 51
+°£	 51
+¿ì	 51
+È­	 51
+ä	 50
+_ŸÆ	 50
+ŽëÇ	 50
+Ä¡	 50
+Ï°í_	 49
+ÇÏ°í_	 49
+_ÀÎ	 49
+Û	 49
+É	 49
+_"	 48
+öµ	 48
+À§	 48
+ÀÌŽÙ	 48
+ÀÔ	 48
+_°ÍÀ	 48
+ÌŽÙ	 48
+¡­	 47
+ÌŽÙ.	 47
+_°ø	 47
+ÀÌŽÙ.	 47
+°Ô_	 47
+_»ç	 47
+žç	 47
+œÅ	 47
+Ã_	 46
+ÅÍ	 46
+é_	 46
+Ò_	 46
+ï	 46
+ÇÏŽ	 46
+_°³	 45
+_ŽÙ	 45
+_ÀÚ	 45
+ž¶	 45
+°è	 45
+Çà	 45
+ÌŽÙ._	 45
+÷À	 44
+îÁ	 44
+ÈÄ	 44
+±â_	 43
+(_	 43
+žé	 43
+­¿	 43
+ü_	 43
+ºñ	 42
+­Ž	 42
+ë_	 42
+ÀÎ_	 42
+_ÀÌ_	 42
+µî_	 42
+°­	 42
+ÎÃ	 41
+µÇ	 41
+¿øÀ	 41
+¿µ	 41
+Àœ	 40
+ÎÃµ	 40
+±×	 40
+Ë	 40
+¿¹	 40
+_¿À	 40
+øÇ	 40
+ž»	 40
+_ÇÐ	 40
+¡­_	 39
+_³â	 39
+³²	 39
+ÇÒ	 39
+¿_	 39
+_³ª	 39
+³­	 38
+žíÀ	 38
+âÀ	 38
+ª_	 38
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/nl-iso_8859_1.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/nl-iso_8859_1.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/nl-iso_8859_1.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 20104
+e	 9848
+n	 5323
+a	 3733
+t	 3683
+i	 3490
+r	 3195
+d	 2876
+o	 2845
+n_	 2443
+en	 2439
+s	 2195
+e_	 1842
+l	 1837
+g	 1522
+en_	 1500
+de	 1489
+er	 1388
+t_	 1377
+v	 1253
+u	 1217
+k	 1204
+_d	 1136
+h	 1102
+m	 1084
+an	 939
+te	 875
+j	 857
+in	 810
+_v	 793
+r_	 751
+de_	 742
+ee	 737
+p	 732
+et	 718
+ge	 716
+aa	 708
+b	 703
+_e	 686
+st	 669
+z	 668
+ie	 662
+_de	 655
+w	 631
+c	 611
+.	 604
+s_	 582
+_de_	 576
+_h	 572
+el	 570
+ij	 564
+._	 554
+et_	 531
+an_	 522
+he	 505
+_o	 497
+nd	 478
+_i	 475
+ar	 459
+_m	 451
+re	 442
+ve	 441
+'	 428
+or	 424
+ng	 421
+at	 418
+_s	 415
+oo	 403
+_z	 401
+le	 395
+_b	 394
+_a	 391
+_he	 386
+va	 385
+er_	 381
+me	 372
+_w	 368
+f	 361
+on	 351
+_t	 351
+_va	 345
+_g	 342
+di	 342
+nt	 340
+,	 335
+g_	 335
+,_	 334
+van	 327
+ch	 326
+is	 326
+ing	 325
+be	 325
+ni	 320
+it	 317
+een	 316
+_van	 315
+al	 310
+den	 309
+ti	 309
+van_	 307
+oe	 302
+ke	 302
+_van_	 299
+aar	 299
+d_	 295
+we	 293
+da	 292
+tu	 290
+_ee	 290
+ud	 287
+een_	 286
+li	 284
+es	 282
+_st	 281
+ver	 281
+ten	 281
+ri	 275
+nde	 275
+der	 274
+_in	 270
+k_	 268
+vo	 267
+het	 266
+oor	 264
+_het	 262
+het_	 262
+_het_	 259
+_een	 258
+l_	 258
+ze	 257
+_n	 254
+ro	 248
+gen	 243
+_een_	 241
+at_	 240
+op	 238
+n.	 238
+_en	 237
+rs	 237
+_da	 235
+stu	 232
+in_	 230
+_be	 229
+_ge	 228
+_k	 226
+rd	 226
+tud	 220
+_en_	 220
+n._	 217
+te_	 209
+ei	 208
+ent	 206
+_me	 203
+la	 202
+ek	 202
+ed	 201
+ra	 200
+stud	 200
+en.	 200
+ie_	 197
+ste	 196
+_vo	 195
+_in_	 193
+_stu	 191
+zi	 191
+om	 189
+ui	 189
+en._	 186
+ten_	 185
+_stud	 185
+ude	 184
+die	 183
+ns	 183
+_j	 181
+D	 179
+aan	 179
+se	 179
+ma	 178
+_ve	 176
+ne	 174
+_p	 174
+eg	 173
+p_	 172
+ar_	 172
+aar_	 171
+_te	 170
+ng_	 169
+_we	 169
+''	 167
+_D	 165
+ers	 164
+_op	 163
+dat	 161
+dat_	 160
+ig	 160
+ere	 159
+eer	 158
+_zi	 158
+voor	 156
+voo	 156
+nge	 155
+nder	 151
+nte	 151
+or_	 150
+ta	 150
+je	 149
+ing_	 148
+ll	 148
+_ver	 147
+jk	 146
+oor_	 146
+_dat	 145
+ijk	 145
+ren	 145
+is_	 145
+_dat_	 144
+_l	 144
+and	 144
+lij	 143
+ter	 143
+na	 142
+uden	 139
+tude	 138
+_voor	 136
+_voo	 136
+ond	 136
+ken	 135
+cht	 135
+_al	 135
+ht	 135
+wa	 134
+ho	 133
+em	 133
+den_	 133
+pe	 132
+sc	 132
+un	 131
+ur	 131
+_di	 130
+gen_	 130
+zo	 129
+rt	 129
+ev	 128
+mo	 128
+lijk	 127
+_is	 126
+stude	 124
+ha	 123
+to	 122
+el_	 121
+og	 121
+op_	 121
+sch	 120
+ol	 120
+ente	 119
+_u	 118
+pr	 118
+end	 118
+mi	 117
+iet	 116
+_aa	 116
+eli	 115
+dent	 115
+ijn	 115
+jn	 115
+ou	 115
+men	 114
+_'	 114
+tie	 113
+_is_	 113
+nie	 113
+tr	 112
+ak	 112
+id	 112
+udent	 111
+tuden	 111
+uit	 110
+_te_	 109
+aan_	 109
+ld	 109
+S	 108
+_aan	 108
+ede	 108
+ja	 107
+nten	 107
+it_	 107
+je_	 107
+ts	 107
+erd	 106
+est	 106
+E	 105
+_op_	 105
+ad	 104
+al_	 104
+_ze	 104
+_on	 104
+rk	 104
+lle	 103
+ens	 103
+gel	 103
+m_	 103
+len	 103
+_r	 102
+ec	 102
+inge	 102
+met	 102
+_met	 101
+si	 100
+die_	 100
+us	 100
+onde	 99
+_ni	 99
+De	 99
+eu	 99
+dente	 99
+enten	 99
+ic	 99
+_met_	 98
+f_	 98
+met_	 98
+no	 97
+ko	 96
+voor_	 96
+rde	 96
+H	 96
+ngen	 95
+lo	 95
+ot	 95
+as	 94
+zij	 93
+_nie	 92
+vi	 92
+eb	 92
+_De	 92
+_zij	 91
+ep	 91
+wi	 91
+_zo	 91
+kt	 91
+ege	 91
+G	 91
+bi	 90
+j_	 90
+ij_	 90
+ze_	 90
+do	 90
+lan	 89
+ov	 89
+udi	 89
+ord	 89
+onder	 89
+V	 88
+elij	 88
+_wa	 88
+elijk	 88
+ef	 88
+_die	 87
+ag	 86
+erk	 86
+eren	 86
+R	 85
+ik	 85
+_ma	 85
+gr	 85
+am	 85
+_mo	 84
+ul	 84
+nn	 83
+eve	 83
+De_	 83
+maa	 83
+ingen	 83
+wo	 83
+_''	 83
+O	 83
+tudi	 82
+I	 82
+nt_	 82
+tudie	 81
+ven	 81
+udie	 81
+nten_	 81
+_die_	 81
+jaa	 80
+ka	 80
+eke	 80
+ite	 80
+a_	 80
+_je	 80
+ac	 80
+jaar	 80
+_je_	 79
+_H	 79
+_zijn	 79
+zijn	 79
+n,	 78
+nen	 78
+N	 78
+n,_	 78
+ijn_	 77
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/no-iso_8859_1.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/no-iso_8859_1.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/no-iso_8859_1.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 22970
+e	 6833
+n	 4206
+r	 3516
+t	 3112
+a	 2587
+s	 2440
+i	 2112
+l	 1901
+o	 1900
+n_	 1875
+r_	 1761
+k	 1713
+g	 1630
+en	 1615
+m	 1508
+e_	 1450
+d	 1444
+er	 1436
+h	 1306
+t_	 1300
+_h	 1180
+_s	 1148
+er_	 1105
+v	 982
+en_	 976
+an	 919
+.	 901
+._	 791
+_.	 781
+et	 770
+g_	 762
+_._	 726
+å	 725
+u	 719
+f	 709
+p	 702
+ha	 682
+_ha	 672
+de	 657
+te	 651
+_e	 621
+et_	 614
+re	 581
+ne	 565
+_o	 554
+an_	 544
+ke	 534
+_,	 522
+,_	 522
+,	 522
+_,_	 522
+_f	 519
+_m	 515
+or	 503
+_d	 483
+_i	 480
+å_	 479
+se	 476
+m_	 469
+nn	 454
+b	 449
+me	 441
+ø	 434
+_a	 413
+st	 404
+_t	 398
+og	 380
+_v	 377
+_og	 366
+ar	 364
+el	 364
+le	 361
+i_	 356
+om	 353
+og_	 351
+_og_	 351
+li	 350
+_k	 346
+_de	 339
+ge	 339
+han	 337
+y	 333
+_han	 332
+ve	 330
+kk	 323
+in	 311
+_b	 307
+fo	 301
+j	 301
+il	 298
+_H	 291
+H	 291
+han_	 288
+_han_	 288
+for	 287
+ik	 281
+l_	 278
+kke	 277
+tt	 276
+ti	 270
+ne_	 270
+d_	 269
+ed	 269
+om_	 268
+nne	 266
+_me	 264
+ng	 257
+_er	 257
+_fo	 256
+eg	 256
+_se	 256
+_g	 256
+un	 255
+ig	 255
+sk	 253
+_er_	 252
+_p	 252
+_for	 250
+ke_	 249
+_n	 238
+_l	 233
+al	 232
+ør	 222
+s_	 221
+ar_	 215
+at	 214
+_en	 211
+he	 211
+pe	 209
+_i_	 208
+am	 200
+es	 200
+si	 200
+enn	 197
+det	 195
+or_	 193
+vi	 190
+ns	 189
+ikk	 188
+det_	 185
+so	 185
+un_	 183
+il_	 181
+nd	 181
+te_	 181
+"_	 180
+"	 180
+_"_	 180
+_"	 180
+em	 179
+_ti	 176
+kke_	 176
+lig	 174
+ten	 174
+Ha	 173
+_Ha	 173
+re_	 172
+ikke	 168
+je	 165
+Han	 165
+ter	 165
+_Han	 165
+eg_	 164
+på	 164
+_på	 163
+_si	 163
+_å	 163
+_Han_	 162
+Han_	 162
+på_	 162
+_på_	 161
+til	 160
+som	 160
+_so	 159
+den	 159
+_det	 157
+ed_	 155
+ll	 155
+_ik	 155
+rt	 155
+som_	 153
+ra	 152
+a_	 152
+har	 152
+nt	 152
+de_	 152
+tr	 151
+v_	 151
+_har	 151
+ka	 151
+ig_	 150
+_som	 150
+for_	 150
+_som_	 150
+_en_	 149
+hu	 149
+_ikk	 148
+_ham	 148
+ham	 148
+ste	 148
+_det_	 148
+_ikke	 148
+enne	 148
+ikke_	 148
+har_	 147
+nge	 147
+D	 147
+_har_	 147
+_D	 147
+am_	 147
+ere	 147
+ham_	 146
+_ham_	 146
+it	 145
+_he	 144
+_til	 144
+av	 143
+va	 140
+men	 140
+år	 140
+_ve	 140
+_hu	 139
+ta	 139
+pen	 137
+sp	 137
+_st	 135
+tte	 135
+la	 135
+_E	 133
+E	 133
+den_	 130
+is	 130
+til_	 128
+_r	 128
+tt_	 128
+år_	 127
+k_	 124
+_å_	 124
+ri	 124
+_til_	 124
+at_	 123
+ene	 123
+seg	 123
+_av	 123
+med	 122
+_vi	 122
+_seg	 122
+seg_	 121
+_seg_	 121
+_for_	 120
+nne_	 120
+ut	 120
+_u	 119
+mm	 119
+mme	 119
+De	 118
+_De	 118
+_at	 118
+_hun	 117
+hun	 117
+ko	 117
+be	 116
+_at_	 115
+ter_	 115
+pen_	 114
+ker	 113
+hun_	 113
+_hun_	 113
+on	 111
+lig_	 111
+..	 110
+hen	 107
+_med	 107
+rs	 106
+ser	 106
+med_	 105
+_men	 104
+_hen	 104
+_sk	 104
+_med_	 104
+ak	 103
+ans	 103
+ker_	 102
+av_	 101
+_ka	 101
+no	 100
+ver	 100
+ler	 99
+J	 99
+spe	 99
+ten_	 99
+_J	 99
+ene_	 98
+ld	 98
+hv	 98
+_av_	 98
+ger	 97
+ni	 96
+gen	 96
+ie	 95
+ser_	 94
+_et	 94
+spen	 94
+_hv	 94
+men_	 93
+Espe	 92
+Es	 92
+_Esp	 92
+_Es	 92
+_Espe	 92
+Esp	 92
+_al	 92
+Espen	 92
+lle	 89
+rem	 89
+id	 89
+fø	 89
+ei	 88
+inn	 88
+rd	 88
+enne_	 88
+_henn	 87
+henne	 87
+henn	 87
+kt	 86
+spen_	 86
+_om	 86
+ler_	 86
+da	 86
+ett	 86
+itt	 86
+bl	 85
+to	 85
+_Je	 84
+ger_	 84
+Je	 84
+æ	 84
+ma	 83
+ing	 83
+ær	 83
+ns_	 83
+eli	 82
+ang	 82
+_be	 82
+så	 82
+_den	 82
+pp	 81
+rk	 81
+dr	 81
+oe	 81
+ss	 81
+_fø	 80
+ek	 80
+le_	 79
+_no	 79
+kj	 78
+elig	 78
+nes	 78
+nn_	 77
+nk	 77
+fr	 77
+sl	 77
+my	 77
+kan	 77
+så_	 76
+as	 76
+_om_	 76
+_kan	 75
+_ko	 75
+_bl	 73
+Hu	 73
+nen	 73
+_Hu	 73
+eng	 73
+gj	 73
+rt_	 72
+ge_	 72
+ba	 72
+lv	 71
+rer	 71
+nde	 71
+ls	 70
+lo	 70
+ga	 70
+_noe	 70
+ro	 70
+_den_	 70
+_ut	 70
+noe	 70
+Hun	 69
+Hun_	 69
+_in	 69
+_Hun	 69
+_Hun_	 69
+ren	 68
+øre	 68
+ør_	 68
+sen	 68
+sa	 67
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/pl-iso_8859_2.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/pl-iso_8859_2.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/pl-iso_8859_2.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 31480
+a	 7945
+i	 7766
+e	 7462
+o	 6838
+z	 5104
+n	 5077
+r	 4178
+w	 4139
+s	 3596
+c	 3580
+y	 3569
+t	 3381
+d	 3027
+k	 2819
+p	 2639
+m	 2494
+ie	 2484
+u	 2016
+l	 1947
+j	 1932
+ni	 1930
+e_	 1746
+_p	 1712
+³	 1649
+a_	 1496
+o_	 1431
+,	 1368
+,_	 1366
+b	 1296
+_w	 1257
+g	 1249
+i_	 1140
+.	 1118
+_s	 1045
+ze	 1041
+._	 1035
+_n	 997
+nie	 958
+cz	 956
+rz	 952
+h	 950
+_z	 933
+ê	 918
+ow	 911
+ie_	 902
+y_	 899
+na	 885
+ch	 871
+po	 864
+pr	 863
+wi	 851
+st	 847
+¿	 835
+±	 832
+an	 814
+ó	 800
+ra	 778
+zy	 766
+ia	 726
+za	 718
+_t	 699
+wa	 692
+ro	 692
+_d	 683
+_pr	 675
+¶	 661
+w_	 658
+sz	 652
+_po	 649
+_o	 628
+m_	 613
+li	 613
+dz	 611
+ki	 611
+en	 609
+mi	 593
+ta	 571
+ci	 564
+ej	 562
+nie_	 558
+_m	 553
+_k	 549
+ar	 543
+go	 541
+_i	 540
+em	 532
+od	 525
+yc	 520
+a³	 511
+rze	 508
+do	 504
+eg	 503
+ko	 502
+ac	 482
+to	 478
+_na	 467
+_ni	 467
+h_	 466
+ch_	 466
+æ	 465
+iê	 461
+_b	 458
+on	 458
+u_	 458
+zi	 454
+ka	 450
+er	 448
+sk	 447
+si	 447
+wy	 444
+te	 437
+ak	 434
+ê_	 431
+_j	 429
+je	 429
+z_	 427
+ny	 422
+aw	 422
+ne	 420
+ów	 418
+_w_	 415
+_c	 414
+ego	 412
+prz	 412
+_r	 410
+al	 407
+³a	 405
+"	 405
+re	 405
+es	 401
+_nie	 396
+dzi	 394
+ty	 389
+j_	 380
+ic	 380
+_prz	 379
+ad	 367
+ej_	 364
+le	 359
+æ_	 358
+ed	 354
+ych	 346
+_za	 346
+_do	 344
+zn	 344
+go_	 344
+ani	 343
+_i_	 342
+no	 339
+or	 337
+³o	 336
+tr	 334
+P	 330
+os	 329
+am	 329
+da	 328
+ec	 327
+ol	 325
+±_	 325
+by	 322
+ego_	 321
+at	 321
+¿e	 319
+ym	 317
+wie	 314
+³_	 312
+-	 310
+na_	 309
+_si	 303
+W	 301
+as	 301
+wo	 300
+pa	 299
+siê	 295
+nia	 293
+owa	 292
+o¶	 286
+_P	 283
+el	 282
+_siê	 279
+ja	 278
+rzy	 276
+prze	 276
+_wy	 275
+iê_	 269
+in	 267
+_-	 267
+de	 267
+kie	 267
+dn	 264
+ob	 262
+_u	 261
+ych_	 260
+-_	 258
+ez	 257
+_-_	 256
+¶c	 255
+ws	 255
+¶ci	 254
+em_	 253
+_siê_	 253
+siê_	 253
+_nie_	 253
+kt	 252
+ski	 252
+we	 251
+_g	 251
+_W	 250
+t_	 249
+_prze	 249
+_je	 248
+aj	 247
+_a	 247
+¿e_	 246
+_¿	 244
+ia_	 243
+eni	 241
+om	 240
+la	 240
+k_	 235
+mo	 235
+f	 234
+pi	 232
+is	 231
+cze	 231
+_z_	 230
+ñ	 228
+nt	 227
+ce	 224
+sta	 221
+ry	 220
+ma	 219
+cj	 219
+zie	 218
+ek	 216
+oc	 213
+dy	 212
+owi	 208
+sp	 208
+K	 208
+tó	 205
+_"	 204
+ud	 203
+S	 202
+ier	 202
+pra	 202
+czn	 201
+ys	 200
+nia_	 199
+j±	 198
+_¿e	 196
+oz	 194
+N	 192
+zo	 191
+dzie	 190
+ku	 190
+ów_	 189
+czy	 189
+_mi	 188
+_¿e_	 187
+mie	 186
+do_	 186
+iej	 185
+ym_	 185
+_do_	 184
+cy	 184
+_pa	 183
+y³	 182
+_na_	 181
+zy_	 181
+ew	 180
+_l	 180
+_cz	 178
+_by	 178
+ru	 177
+to_	 175
+±c	 175
+_wi	 175
+ln	 174
+_K	 171
+ok	 170
+ot	 170
+raw	 169
+nych	 168
+nyc	 168
+az	 168
+ik	 167
+bi	 167
+i,_	 166
+i,	 166
+_te	 165
+tu	 163
+wan	 163
+et	 162
+J	 162
+ór	 161
+cie	 160
+_od	 160
+ba	 160
+oj	 159
+o¶c	 158
+i³	 158
+_ro	 158
+og	 158
+mu	 158
+A	 158
+o¶ci	 158
+d_	 157
+tw	 156
+io	 155
+gr	 155
+_J	 155
+_N	 155
+_to	 155
+us	 155
+¿_	 154
+aæ	 154
+ach	 154
+yd	 153
+_kt	 153
+_ko	 152
+_st	 152
+pow	 151
+yt	 150
+kr	 149
+_S	 149
+a³_	 149
+ak_	 149
+li_	 148
+T	 148
+ur	 148
+sa	 148
+op	 147
+yw	 147
+ent	 147
+bo	 146
+_sp	 145
+O	 145
+a,_	 144
+a,	 144
+iem	 144
+któ	 143
+praw	 143
+wn	 142
+tór	 142
+i±	 141
+³y	 141
+zu	 141
+dni	 140
+im	 139
+icz	 139
+ró	 139
+³e	 138
+któr	 137
+my	 137
+est	 136
+awi	 135
+przy	 134
+nych_	 134
+e,_	 132
+e,	 132
+ki_	 132
+pro	 131
+_któ	 131
+_któr	 131
+_przy	 130
+_ja	 129
+szy	 127
+ia³	 127
+Po	 127
+ania	 127
+M	 126
+ze_	 125
+ne_	 125
+ñs	 124
+_ty	 124
+sze	 124
+a¿	 124
+nn	 124
+pod	 124
+aæ_	 122
+B	 122
+za_	 122
+cza	 122
+³o_	 122
+Z	 122
+_to_	 121
+iu	 120
+zc	 119
+esz	 119
+skie	 118
+i.	 118
+_ka	 117
+so	 117
+trz	 117
+o¿	 116
+ieg	 116
+nik	 116
+ga	 116
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/pt-iso_8859_1.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/pt-iso_8859_1.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/pt-iso_8859_1.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 35328
+a	 10423
+e	 10132
+o	 8919
+s	 6795
+r	 6033
+i	 5443
+n	 4588
+d	 4531
+t	 4217
+m	 3476
+u	 3404
+o_	 3240
+a_	 3029
+e_	 2879
+c	 2756
+s_	 2461
+_d	 2379
+l	 2307
+p	 2242
+_a	 1753
+de	 1751
+,	 1660
+,_	 1658
+_e	 1454
+es	 1447
+os	 1412
+ra	 1343
+_p	 1328
+nt	 1302
+_de	 1248
+do	 1215
+en	 1176
+re	 1150
+as	 1123
+v	 1115
+m_	 1113
+de_	 1096
+er	 1082
+g	 1053
+_c	 1047
+da	 1008
+co	 986
+os_	 975
+te	 974
+ar	 950
+or	 943
+q	 938
+qu	 938
+_s	 908
+ta	 902
+_de_	 901
+_o	 858
+se	 841
+ue	 831
+to	 799
+ad	 777
+.	 761
+que	 752
+em	 751
+an	 748
+f	 746
+r_	 745
+b	 732
+st	 718
+is	 716
+al	 712
+_qu	 706
+_q	 706
+in	 701
+as_	 696
+ã	 695
+do_	 685
+ent	 678
+ão	 677
+_n	 671
+_co	 660
+_a_	 654
+_m	 646
+on	 645
+ç	 624
+ri	 623
+_que	 619
+ma	 602
+po	 581
+ia	 580
+ão_	 575
+._	 573
+na	 572
+me	 564
+ro	 554
+_t	 544
+pa	 533
+da_	 528
+h	 523
+ue_	 515
+ca	 511
+que_	 509
+nte	 503
+no	 499
+tr	 498
+am	 496
+em_	 491
+_que_	 487
+_se	 485
+om	 471
+io	 460
+_do	 459
+ti	 448
+ci	 445
+_da	 444
+nd	 442
+ei	 435
+ra_	 435
+pr	 427
+_r	 423
+_e_	 420
+_f	 420
+ss	 412
+es_	 412
+el	 407
+id	 406
+_o_	 399
+_pa	 390
+um	 379
+pe	 378
+_po	 376
+la	 374
+ir	 371
+á	 371
+ic	 362
+di	 362
+li	 359
+é	 359
+_re	 353
+ve	 353
+mo	 350
+s,	 349
+s,_	 349
+ou	 347
+com	 340
+sa	 338
+si	 338
+men	 337
+rt	 331
+_i	 330
+con	 330
+o,	 327
+_da_	 326
+o,_	 326
+se_	 325
+_com	 325
+ado	 323
+to_	 322
+ai	 322
+it	 320
+A	 319
+ec	 316
+dos	 316
+_em	 312
+ção	 310
+aç	 310
+çã	 310
+ara	 305
+so	 299
+tu	 299
+res	 297
+im	 296
+_pr	 295
+mi	 293
+ua	 292
+nto	 291
+ment	 290
+í	 290
+par	 288
+_do_	 287
+ce	 286
+est	 286
+u_	 284
+ente	 284
+S	 278
+l_	 278
+_u	 278
+"	 276
+ni	 276
+z	 274
+sta	 273
+nc	 272
+_em_	 270
+P	 269
+ção_	 267
+_v	 267
+at	 267
+dos_	 266
+_es	 262
+«	 259
+_«	 259
+te_	 258
+»	 257
+va	 255
+le	 252
+ur	 252
+_um	 252
+vi	 251
+_par	 250
+a,	 247
+a,_	 247
+_con	 247
+ant	 242
+lo	 240
+ia_	 240
+gu	 237
+ar_	 235
+ac	 235
+e,_	 234
+e,	 234
+no_	 232
+eg	 232
+il	 232
+ns	 232
+er_	 231
+_ma	 230
+por	 230
+_in	 228
+_l	 226
+ó	 225
+ont	 224
+_no	 223
+_P	 222
+tra	 220
+E	 219
+ida	 218
+is_	 217
+ol	 216
+açã	 215
+ter	 215
+ação	 215
+_A	 211
+un	 211
+-	 210
+_te	 210
+or_	 209
+ma_	 208
+_pe	 208
+ara_	 208
+C	 206
+ist	 202
+para	 202
+nta	 201
+ais	 201
+ut	 198
+nte_	 198
+j	 197
+dad	 196
+_na	 195
+am_	 195
+ade	 193
+ica	 191
+x	 190
+al_	 189
+O	 188
+des	 187
+_para	 187
+ada	 187
+nh	 186
+_se_	 186
+mp	 185
+ndo	 184
+R	 183
+_por	 181
+ação_	 181
+para_	 179
+eir	 177
+ui	 177
+vo	 177
+ou_	 177
+ta_	 177
+M	 176
+ria	 175
+tos	 175
+rr	 174
+D	 174
+io_	 174
+br	 174
+_di	 173
+õ	 173
+õe	 173
+fo	 173
+I	 172
+ões	 172
+_C	 171
+mo_	 171
+ov	 170
+pro	 169
+_os_	 169
+_os	 169
+das	 167
+iv	 166
+uma	 165
+gr	 165
+su	 164
+fi	 164
+um_	 162
+na_	 162
+ga	 162
+ais_	 161
+_S	 161
+lh	 159
+ort	 159
+cia	 158
+..	 157
+_est	 156
+cont	 156
+ig	 155
+á_	 154
+ran	 154
+ça	 154
+om_	 153
+_en	 152
+dade	 152
+_as	 152
+ho	 152
+ntr	 151
+nto_	 151
+fe	 150
+N	 149
+das_	 149
+uma_	 149
+ess	 149
+é_	 148
+ndo_	 147
+ob	 147
+»_	 147
+ul	 146
+ente_	 146
+go	 146
+ento	 144
+ver	 144
+_des	 144
+gi	 144
+ha	 142
+cu	 142
+idad	 142
+av	 141
+ões_	 141
+_pro	 141
+ura	 141
+ap	 139
+_com_	 139
+_ca	 139
+com_	 139
+ao	 139
+ne	 138
+od	 138
+_"	 137
+_M	 137
+pre	 137
+ras	 136
+_me	 136
+_ao	 136
+_no_	 134
+oc	 134
+str	 133
+tes	 133
+_b	 133
+and	 133
+_g	 133
+ro_	 133
+omo	 133
+_dos	 132
+_fo	 132
+_dos_	 132
+rn	 132
+mento	 131
+ito	 131
+ev	 131
+rio	 130
+ass	 130
+eu	 130
+be	 128
+os,	 128
+os,_	 128
+sp	 127
+_uma	 127
+ep	 126
+tad	 125
+s.	 125
+_uma_	 125
+_E	 125
+idade	 124
+_um_	 124
+nã	 124
+não	 124
+ct	 123
+ram	 123
+ado_	 123
+ela	 123
+omo_	 121
+iz	 121
+_an	 121
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/ro-iso_8859_2.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/ro-iso_8859_2.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/ro-iso_8859_2.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 20674
+a	 6376
+e	 5815
+i	 5746
+t	 3396
+r	 3280
+n	 3103
+u	 2835
+s	 2611
+c	 2582
+e_	 2235
+l	 2224
+o	 2149
+a_	 1974
+d	 1629
+m	 1528
+p	 1410
+i_	 1358
+in	 1308
+_c	 1167
+_s	 1118
+_d	 999
+re	 905
+ar	 898
+,	 791
+,_	 786
+_p	 785
+de	 771
+_a	 754
+te	 687
+_i	 667
+at	 654
+ti	 645
+ca	 639
+n_	 630
+ta	 617
+si	 614
+_de	 609
+f	 606
+st	 583
+ri	 581
+u_	 567
+nt	 553
+.	 542
+ra	 540
+_m	 534
+g	 528
+v	 516
+ul	 516
+de_	 513
+_in	 503
+b	 492
+_de_	 474
+._	 472
+le	 459
+l_	 444
+un	 443
+_si	 440
+es	 437
+tr	 426
+ea	 420
+t_	 412
+ce	 412
+ma	 407
+cu	 402
+er	 398
+_ca	 397
+si_	 388
+_f	 387
+_l	 383
+z	 382
+la	 381
+ne	 370
+sa	 364
+as	 360
+_e	 357
+in_	 356
+an	 352
+it	 351
+te_	 346
+or	 345
+el	 345
+ci	 339
+_si_	 333
+_n	 330
+are	 324
+pe	 319
+re_	 317
+al	 310
+_t	 309
+se	 304
+ic	 295
+ie	 290
+_u	 290
+ul_	 290
+ni	 289
+int	 285
+_o	 280
+en	 279
+ta_	 279
+ur	 261
+pa	 256
+co	 255
+_pe	 254
+ia	 252
+mi	 251
+pr	 249
+_ma	 249
+oa	 249
+me	 246
+lu	 246
+li	 241
+im	 238
+_in_	 237
+da	 237
+na	 237
+_sa	 235
+ac	 234
+-	 234
+ii	 232
+est	 231
+r_	 231
+h	 230
+_cu	 230
+le_	 229
+ai	 229
+ca_	 227
+il	 226
+ru	 223
+sc	 223
+_v	 221
+nu	 220
+tu	 220
+_un	 220
+nd	 220
+di	 219
+are_	 216
+to	 215
+am	 214
+on	 213
+o_	 208
+is	 208
+sa_	 203
+la_	 200
+_b	 200
+ste	 195
+et	 194
+ec	 191
+_r	 186
+car	 185
+ui	 180
+un_	 179
+lo	 178
+cu_	 177
+ei	 176
+e,	 175
+e,_	 175
+pe_	 171
+m_	 167
+_la	 166
+a,	 165
+a,_	 164
+_ce	 164
+rt	 163
+_co	 163
+ent	 162
+ro	 162
+ele	 162
+_pe_	 160
+po	 160
+ea_	 159
+"	 158
+ntr	 158
+_cu_	 158
+_pr	 157
+ut	 157
+nc	 156
+ata	 155
+care	 154
+um	 153
+au	 151
+va	 151
+_o_	 150
+_car	 150
+ii_	 145
+ind	 145
+_un_	 144
+os	 144
+ad	 141
+_la_	 140
+I	 140
+este	 138
+ste_	 138
+care_	 138
+ir	 137
+ga	 136
+ap	 136
+ol	 136
+ra_	 136
+_di	 134
+D	 134
+_care	 133
+se_	 133
+om	 133
+ara	 133
+ati	 133
+fi	 133
+_sa_	 131
+zi	 130
+vi	 130
+_ca_	 129
+_se	 128
+_nu	 128
+ai_	 127
+ch	 127
+pi	 124
+ve	 123
+fa	 122
+ot	 121
+_a_	 120
+este_	 120
+du	 119
+ine	 119
+s_	 118
+fo	 118
+_ci	 118
+ui_	 118
+ba	 118
+i,	 117
+i,_	 116
+ne_	 115
+us	 115
+_g	 115
+a.	 115
+fe	 114
+A	 114
+pu	 114
+ce_	 113
+ar_	 113
+_pa	 113
+oc	 112
+sta	 112
+lui	 112
+ns	 112
+em	 112
+'	 112
+oar	 112
+din	 111
+iu	 111
+_int	 111
+ate	 111
+mu	 111
+hi	 110
+ele_	 110
+mp	 109
+_D	 109
+S	 109
+sti	 108
+bi	 108
+ata_	 107
+ti_	 107
+tra	 107
+C	 107
+c_	 106
+tre	 106
+_al	 105
+rea	 105
+mai	 105
+j	 104
+a._	 104
+gi	 104
+e.	 103
+d_	 103
+_fa	 103
+E	 102
+mo	 102
+at_	 101
+_e_	 101
+nte	 101
+lt	 101
+sp	 101
+za	 100
+mai_	 100
+su	 99
+na_	 98
+tat	 97
+sin	 97
+ez	 96
+tru	 96
+e._	 96
+ie_	 96
+ia_	 96
+_re	 96
+tul	 96
+_fo	 96
+ina	 95
+art	 95
+_C	 95
+no	 95
+nu_	 94
+_es	 94
+_po	 94
+cr	 94
+inc	 93
+_da	 92
+_mai	 92
+lui_	 92
+_din	 92
+_est	 92
+pre	 91
+_mai_	 91
+io	 91
+chi	 91
+ge	 90
+pri	 90
+eu	 90
+uri	 90
+az	 90
+_nu_	 89
+_me	 89
+ct	 89
+au_	 88
+esc	 88
+ev	 88
+ei_	 88
+min	 87
+ace	 87
+op	 86
+ng	 86
+ici	 86
+_lu	 85
+ari	 85
+_mi	 84
+ita	 84
+_S	 84
+_tr	 84
+ere	 83
+or_	 83
+ast	 83
+ist	 83
+nt_	 83
+_se_	 82
+ou	 82
+tin	 82
+intr	 82
+con	 82
+do	 81
+_fi	 81
+str	 81
+am_	 80
+rat	 80
+ru_	 80
+ri_	 80
+par	 80
+oi	 80
+uc	 79
+ze	 79
+pl	 79
+res	 78
+_ac	 77
+ulu	 77
+din_	 76
+va_	 76
+ada	 76
+ului	 75
+_con	 75
+id	 75
+inte	 74
+ile	 73
+cit	 73
+_din_	 73
+lor	 73
+_"	 72
+ig	 72
+rin	 72
+da_	 72
+_st	 72
+-_	 71
+_-	 71
+it_	 71
+ani	 71
+nd_	 71
+ci_	 70
+ag	 70
+eri	 70
+i.	 70
+tru_	 70
+_ne	 70
+rm	 70
+P	 69
+_este	 69
+nta	 69
+bu	 69
+une	 69
+ma_	 69
+nti	 69
+imp	 68
+_-_	 68
+iv	 68
+ind_	 68
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/ru-dos_866.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/ru-dos_866.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/ru-dos_866.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 57818
+®	 16703
+¥	 15057
+š	 15038
+­	 12820
+ 	 11299
+â	 9844
+à	 8267
+á	 7524
+«	 6580
+¢	 6379
+¯	 4925
+ª	 4867
+¬	 4606
+.	 4514
+ï	 4174
+Ä	 4093
+ÄÄ	 3940
+ÄÄÄ	 3789
+ÄÄÄÄ	 3640
+ÄÄÄÄÄ	 3495
+€	 3488
+ë	 3319
+ã	 3205
+ç	 3057
+¥­	 3038
+_¯	 3017
+._	 3003
+§	 2998
+­®	 2890
+š_	 2729
+­š	 2690
+ï_	 2413
+£	 2371
+¥_	 2317
+_¢	 2216
+-	 2214
+ì	 2212
+¡	 2053
+à®	 1969
+áâ	 1927
+©	 1908
+_á	 1901
+,	 1868
+,_	 1865
+-_	 1822
+å	 1799
+­ 	 1708
+_­	 1693
+_š	 1635
+®_	 1635
+­ë	 1628
+â®	 1611
+à 	 1558
+®¢	 1525
+¥­š	 1469
+©_	 1468
+..	 1415
+Š	 1409
+®«	 1408
+ _	 1358
+...	 1348
+¥â	 1326
+«ì	 1313
+¯à	 1299
+_®	 1295
+....	 1292
+¯®	 1290
+«¥	 1287
+ç¥	 1282
+_ª	 1271
+à¥	 1269
+šï	 1263
+â¥	 1249
+.....	 1237
+àš	 1237
+ª®	 1213
+âš	 1208
+¥à	 1192
+š¥	 1164
+æ	 1162
+â 	 1156
+î	 1146
+­¥	 1146
+®á	 1142
+«š	 1116
+ ­	 1066
+ â	 1065
+_¯à	 1039
+â_	 1038
+®â	 1023
+¥á	 1022
+¢ 	 1022
+å_	 1022
+_¯®	 1015
+®£	 1007
+®à	 1006
+³	 1001
+¢®	 1000
+³_	 989
+_³	 988
+_³_	 977
+ÿ	 950
+_.	 941
+_à	 940
+áï	 938
+¢_	 923
+ÿ_	 918
+ «	 904
+ì­	 903
+«ì­	 903
+_€	 898
+®©	 898
+¯¥	 878
+_â	 878
+_._	 878
+š­	 877
+_¬	 874
+¬¥	 863
+šï_	 855
+ª 	 853
+«®	 851
+šâ	 846
+¬_	 837
+æš	 835
+áï_	 815
+_š_	 812
+®¬	 812
+£®	 805
+ä	 803
+_ÿ	 798
+âá	 796
+_ÿ_	 796
+š¥_	 792
+®©_	 787
+_¡	 785
+è	 776
+šç	 773
+¥ç	 770
+¥«	 762
+ç­	 752
+ªš	 750
+®€	 732
+®§	 722
+é	 718
+­šï	 718
+áª	 710
+ ª	 694
+¬®	 691
+¬š	 686
+®áâ	 683
+­š¥	 682
+¢¥	 678
+Š¥	 670
+¥¬	 670
+âáï	 668
+¢š	 660
+š¬	 658
+_¢_	 643
+âà	 643
+­­	 642
+à®¢	 638
+ à	 631
+®­	 625
+¡®	 623
+ñ	 620
+_­ 	 618
+ ï	 613
+	 604
+_­¥	 604
+ì_	 600
+®ç	 597
+âáï_	 597
+_ 	 589
+£®_	 589
+ §	 588
+šš	 585
+¥€	 585
+âì	 583
+šá	 581
+ëå	 573
+_£	 567
+®¡	 567
+àã	 566
+šç¥	 564
+®£®	 563
+­®©	 563
+ç¥­	 563
+€®	 561
+ç¥á	 550
+ë_	 543
+	 542
+á®	 542
+áš	 538
+š§	 536
+¯ 	 535
+_¯¥	 531
+šà	 530
+šç¥á	 527
+á«	 527
+ëå_	 524
+¥­š¥	 523
+­®©_	 523
+€ 	 523
+ ï_	 522
+_ã	 520
+§ 	 520
+€š	 517
+¥áª	 517
+ á	 513
+€¥	 504
+ªà	 503
+­šï_	 499
+ç¥áª	 499
+_-	 498
+¯àš	 494
+®¯	 494
+¥­šï	 493
+šç¥áª	 484
+­š¥_	 484
+ «ì	 481
+_	 474
+_-_	 473
+_à 	 473
+®£®_	 472
+¡®«	 470
+­ëå	 468
+ ­š	 466
+®ª	 465
+š¢	 464
+« 	 458
+£š	 457
+ç¥­š	 456
+¢ë	 448
+_¯àš	 447
+«ï	 447
+¥âá	 445
+¢«	 444
+¥â_	 439
+ ¥	 437
+ç­®	 435
+ «ì­	 435
+­ëå_	 435
+®Š	 433
+¥âáï	 431
+®ç­	 429
+­â	 428
+â¢	 427
+¥ç¥	 426
+¯à®	 423
+­ _	 423
+ë¥	 422
+šå	 419
+šš_	 419
+­®_	 416
+«ì­ë	 414
+_«	 414
+¯¥ç	 414
+ì­ë	 414
+®«ì	 413
+¥ç¥­	 413
+§­	 412
+¬ 	 412
+­®£	 405
+_ª®	 401
+âì_	 394
+ë¥_	 391
+¥­š¥_	 390
+«¥­	 390
+_§	 387
+í	 385
+_	 382
+ç 	 380
+ ¥â	 380
+_ªà	 379
+¥âáï_	 375
+š«	 375
+šª	 374
+	 373
+¥ç¥­š	 371
+¥­šï_	 369
+îâ	 368
+ªà®	 368
+àâ	 366
+ì­®	 363
+«ì­®	 363
+¥©	 362
+¥§	 361
+è¥	 361
+á_	 358
+ ¬	 356
+®-	 352
+­ ï	 348
+¥¢	 347
+_¯à®	 346
+_¯¥ç	 345
+­®£®	 345
+é¥	 342
+à §	 341
+ î	 341
+áâ¢	 341
+_í	 340
+šå_	 339
+¢­	 338
+_ç	 337
+ñ­	 336
+ãâ	 336
+­ë¥	 334
+¯¥à	 334
+­ ï_	 333
+_¢¥	 333
+¥ª	 332
+¥­­	 332
+_¡®	 331
+¢ ­	 329
+ã_	 325
+ ¢	 325
+€­	 324
+¯à¥	 323
+­®£®_	 323
+¢¥­	 323
+_®¡	 323
+_á_	 322
+_¡®«	 321
+­®á	 321
+¥¯	 320
+áªš	 320
+ªâ	 317
+«š_	 314
+ª_	 312
+®¢®	 310
+_ªà®	 310
+®«®	 309
+­ë¥_	 309
+_¬®	 308
+¥áªš	 308
+ç¥áªš	 308
+ë¬	 306
+â¥à	 306
+_á®	 305
+š©	 305
+ë©	 304
+_¬¥	 304
+¯š	 301
+ªà®¢	 299
+¡ë	 298
+_ªà®¢	 296
+®¢ 	 295
+)	 293
+áâ 	 292
+àš_	 291
+_à §	 289
+ æ	 288
+îé	 286
+š.	 286
+_®â	 285
+_à¥	 284
+â¥«	 283
+_¢®	 282
+­®áâ	 282
+š._	 282
+®¥	 280
+áâš	 279
+ æš	 278
+ë©_	 275
+(	 274
+_(	 274
+­­®	 274
+éš	 274
+«¥­š	 273
+š®	 273
+­ë©	 272
+áâ®	 269
+â­	 268
+¡®«ì	 267
+§¢	 264
+­­ë	 264
+­ë¬	 264
+­®ç	 263
+§¬	 263
+ª«	 261
+æ¥	 259
+ â®	 258
+¬¥­	 258
+¬š_	 257
+¢ ­š	 257
+å®	 257
+®¬_	 256
+­®ç­	 256
+ãî	 256
+£¥	 254
+ .	 254
+ ._	 254
+Š¥­	 253
+ ¡	 253
+«ã	 253
+_¢ë	 250
+­ë©_	 250
+ñ­®	 249
+_§ 	 249
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/ru-iso_8859_5.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/ru-iso_8859_5.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/ru-iso_8859_5.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 76249
+Þ	 19732
+Õ	 16714
+Ð	 14389
+Ø	 13942
+â	 13160
+Ý	 12444
+á	 9867
+à	 8461
+Ò	 7895
+Û	 7330
+Ú	 6498
+Ü	 5935
+.	 5725
+ã	 5287
+Ô	 5019
+ß	 4877
+ï	 4083
+,	 3899
+,_	 3878
+ë	 3656
+ì	 3376
+Ø_	 3167
+_ß	 3144
+Õ_	 3135
+Þ_	 3098
+-	 3019
+×	 2983
+_Ò	 2952
+._	 2930
+_á	 2919
+ç	 2887
+Ó	 2876
+Ñ	 2797
+áâ	 2672
+_Ý	 2631
+âÞ	 2585
+..	 2407
+_Ø	 2316
+ÝÞ	 2300
+-_	 2294
+Ù	 2281
+Ð_	 2249
+ÝÐ	 2057
+ï_	 2029
+ÞÒ	 1981
+ÝØ	 1950
+_â	 1944
+å	 1874
+ÕÝ	 1856
+_Þ	 1774
+...	 1744
+àÐ	 1709
+ÝÕ	 1685
+ßÞ	 1636
+_-	 1625
+ÚÞ	 1616
+âÕ	 1595
+àÞ	 1584
+_Ú	 1558
+_-_	 1531
+Ù_	 1521
+Õâ	 1518
+Ö	 1509
+_Ø_	 1454
+âÐ	 1433
+ÐÝ	 1419
+Õà	 1396
+Þâ	 1389
+ì_	 1381
+ÓÞ	 1375
+ÐÛ	 1370
+_ßÞ	 1364
+àÕ	 1345
+ÚÐ	 1338
+ßà	 1337
+ÒÐ	 1329
+âØ	 1306
+ÛØ	 1300
+_Ô	 1297
+_Ü	 1290
+Õá	 1284
+ÒÞ	 1271
+çÕ	 1256
+Þà	 1245
+....	 1232
+âì	 1219
+Þá	 1212
+è	 1192
+î	 1187
+Ò_	 1168
+.....	 1167
+ÞÝ	 1147
+ÐÚ	 1144
+æ	 1109
+ÞÓ	 1101
+ÛÞ	 1099
+â_	 1093
+àØ	 1076
+Ü_	 1074
+_ßà	 1063
+ÞÛ	 1062
+Ûì	 1045
+_ÝÕ	 1034
+ÕÛ	 1029
+_Ñ	 1026
+ØÝ	 1000
+ÞÔ	 998
+ÞÜ	 996
+ÜÕ	 993
+ë_	 975
+ÒÕ	 968
+áÚ	 968
+_ÝÐ	 966
+ÔÕ	 946
+Ýë	 943
+_à	 931
+_ç	 923
+Ðâ	 913
+ÕÜ	 910
+ã_	 907
+×Ð	 898
+å_	 898
+ÛÕ	 889
+âÞ_	 881
+Øâ	 878
+ÞÙ	 875
+áÕ	 862
+_Ò_	 833
+_×	 816
+ÚØ	 816
+âà	 807
+"	 786
+âì_	 769
+ÕÔ	 767
+ÝÕ_	 762
+áï	 754
+ÛÐ	 748
+ÞÑ	 747
+ÜÞ	 741
+ÔÐ	 730
+ÓÞ_	 715
+Ú_	 713
+Øá	 711
+_ã	 702
+ÞÙ_	 697
+ØÛ	 694
+ÜÐ	 692
+ÝÝ	 687
+ÔÞ	 662
+Ðá	 660
+ÐÜ	 656
+Øï	 649
+ÖÕ	 646
+Ð×	 638
+áÞ	 629
+ÝÐ_	 619
+_Ó	 615
+ÜØ	 612
+_Ð	 610
+í	 609
+Òá	 608
+.._	 605
+Òë	 604
+ÞÓÞ	 604
+ØÜ	 604
+_ÚÞ	 600
+ÐÒ	 597
+áÛ	 594
+ØÕ	 593
+_ÝÕ_	 589
+_Õ	 587
+_âÕ	 583
+âã	 583
+Øç	 583
+àã	 575
+Þáâ	 571
+é	 571
+Û_	 570
+_í	 569
+_ï	 559
+°	 556
+ÕÝØ	 544
+Ø×	 540
+ÕÚ	 536
+ÞÒÐ	 533
+ä	 525
+:	 519
+²	 513
+ÐÝØ	 511
+_Òá	 510
+ØÙ	 510
+œ	 508
+_ÚÐ	 508
+!	 503
+?	 501
+ÔØ	 498
+ÛØ_	 489
+¿	 488
+ßàÞ	 486
+_àÐ	 485
+áØ	 484
+Øà	 484
+_áâ	 484
+ìÝ	 484
+ÛìÝ	 484
+:_	 484
+áï_	 480
+_×Ð	 477
+ÑÞ	 470
+_Û	 469
+..._	 465
+Ñë	 464
+Øå	 464
+ž	 462
+ÕÓ	 461
+âÒ	 459
+ÝØï	 458
+ïâ	 454
+çâ	 454
+íâ	 445
+çÕá	 442
+_âÞ	 442
+Øï_	 441
+ØÚ	 440
+ÒØ	 437
+ÐÚ_	 436
+áâÐ	 436
+ÞÓÞ_	 435
+_²	 434
+ØçÕ	 433
+æØ	 431
+çâÞ	 431
+ëå	 429
+_íâ	 429
+Á	 425
+_çâ	 424
+_°	 424
+î_	 423
+ßÕ	 422
+Ýï	 422
+_çâÞ	 422
+Ûï	 419
+ÒáÕ	 418
+Ôã	 418
+ÕáÚ	 415
+Ýâ	 413
+ÚÐÚ	 411
+áâÞ	 411
+_Òë	 409
+Ýã	 408
+âá	 406
+Ý_	 406
+_¿	 401
+Œ	 401
+ÝÞ_	 399
+_ßàÞ	 398
+_.	 397
+àÞÒ	 396
+æÕ	 396
+Úâ	 394
+Õáâ	 394
+_"	 393
+èÕ	 393
+á_	 392
+_Þâ	 392
+Ÿ	 391
+_ÝÐ_	 391
+àÕÔ	 391
+çÕáÚ	 390
+Þ-	 390
+ÒÐÝ	 388
+Ð,	 385
+ÐÔ	 384
+Ðï	 384
+_ï_	 383
+Ð,_	 383
+âë	 383
+?_	 383
+_ÞÑ	 380
+_ÒáÕ	 380
+_âÐ	 378
+_ÚÐÚ	 376
+åÞ	 375
+âÐÚ	 375
+ÐÛì	 374
+ÞÖ	 373
+ëå_	 372
+ÞÒÞ	 372
+ØÒ	 371
+_ÒÞ	 369
+Üã	 369
+_œ	 369
+ÕÙ	 368
+ßàÕ	 368
+×Ý	 366
+ØçÕá	 365
+ßØ	 365
+ÕÓÞ	 362
+_áÞ	 360
+ÞÕ	 360
+!_	 360
+Ðâì	 360
+áâØ	 358
+Øå_	 358
+âÝ	 358
+ÜÕÝ	 358
+âáï	 356
+ØÕ_	 356
+ØçÕáÚ	 354
+ÑÕ	 352
+_Ñë	 352
+áâà	 349
+Úã	 349
+_ÜÞ	 348
+Õâ_	 348
+Â	 346
+_ÜÕ	 344
+ÕÒ	 344
+ßàØ	 343
+çØ	 342
+ÜÝ	 341
+ÝØï_	 339
+Ðà	 338
+ÝÝÞ	 337
+ÞÒÐÝ	 334
+Úá	 334
+ãà	 328
+_çÕ	 328
+ÞÛì	 328
+ãâ	 327
+çâÞ_	 324
+ÞÜ_	 323
+Þß	 323
+àÜ	 322
+°_	 322
+_çâÞ_	 322
+íâÞ	 322
+Þç	 321
+Þ,_	 320
+Þ,	 320
+áÚÞ	 319
+ÚÞÝ	 319
+ÛÞÒ	 318
+ëÙ	 318
+ãá	 317
+Þâ_	 316
+ØàÞ	 315
+áâÒ	 314
+Ø,	 314
+ØÙ_	 313
+áá	 313
+Ø,_	 313
+âÞÜ	 312
+ÐÕ	 312
+ÕÝÝ	 311
+Õ×	 311
+ÝÞÙ	 311
+_íâÞ	 310
+º	 309
+áÐ	 309
+àÐ×	 309
+Õß	 309
+_ÔÞ	 308
+ÞÛÞ	 308
+áâì	 308
+ãÔ	 307
+ÔÕÛ	 307
+_ž	 305
+ÐÑ	 305
+áì	 303
+ÐÛìÝ	 302
+ÞÚ	 300
+áÚØ	 300
+Ýëå	 300
+_ßàØ	 298
+çÐ	 297
+_Ö	 297
+Õ,	 297
+Õ,_	 297
+_°_	 296
+_ÝØ	 296
+_._	 295
+âáï_	 295
+ØØ	 294
+×ÝÐ	 293
+ï,	 292
+ï,_	 292
+_ßàÕ	 291
+_Á	 290
+ÝÞÙ_	 290
+Ðï_	 288
+_Ÿ	 288
+ÐÛØ	 286
+ÖÕ_	 285
+áß	 285
+Øáâ	 285
+Ýëå_	 285
+×_	 283
+_Œ	 283
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/ru-koi8_r.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/ru-koi8_r.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/ru-koi8_r.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 28256
+Ï	 8957
+Å	 7206
+Á	 6230
+É	 5966
+Ô	 5385
+Î	 5338
+Ó	 4464
+Ò	 3984
+×	 3504
+Ì	 3335
+Ë	 2700
+Í	 2441
+Ð	 2324
+Ä	 2230
+Õ	 1840
+Ñ	 1562
+Ù	 1540
+_Ð	 1505
+,	 1492
+,_	 1492
+Ø	 1437
+Ï_	 1423
+Å_	 1335
+ÓÔ	 1286
+Ú	 1283
+Ç	 1233
+Â	 1232
+É_	 1193
+ÔÏ	 1175
+_Ó	 1146
+Þ	 1143
+_×	 1118
+_Î	 1062
+Á_	 1032
+.	 999
+ÎÏ	 996
+ÅÎ	 920
+Ï×	 911
+._	 908
+Ê	 907
+ÎÁ	 893
+ÒÏ	 869
+ÒÁ	 851
+ÎÉ	 844
+Ñ_	 808
+ÐÒ	 786
+ÐÏ	 775
+ËÏ	 768
+Ö	 763
+_Ï	 735
+ÎÅ	 730
+ÏÓ	 723
+_É	 721
+È	 696
+ÒÅ	 667
+_ÐÒ	 629
+_Ë	 626
+×_	 621
+ÔÅ	 620
+Ø_	 616
+×Ï	 599
+Ê_	 597
+_ÐÏ	 592
+ÇÏ	 589
+ÅÒ	 584
+ÌÉ	 579
+ÔÁ	 576
+ÅÔ	 566
+Í_	 562
+ÅÓ	 548
+ÏÒ	 545
+ÅÌ	 545
+ÁÌ	 544
+×Á	 535
+ÔØ	 533
+ÌÅ	 528
+_Ä	 522
+ÏÍ	 520
+ËÁ	 520
+À	 518
+Û	 510
+_Ô	 507
+ÏÔ	 502
+ÏÌ	 500
+ÁÎ	 498
+ÌØ	 486
+ÏÄ	 476
+ÁÔ	 475
+ÔÉ	 471
+ÉÔ	 458
+ÏÎ	 457
+ÏÇ	 450
+Ã	 450
+ÌÏ	 449
+Ô_	 448
+_ÎÁ	 447
+ÎÙ	 443
+ÄÅ	 442
+_Í	 438
+ÌÁ	 431
+_×_	 430
+ÓË	 428
+_ÎÅ	 424
+ÒÉ	 400
+ÅÍ	 396
+_Â	 392
+_Þ	 388
+ÞÅ	 388
+ÁË	 388
+_É_	 385
+_Ò	 382
+ÔÏ_	 381
+ÉÎ	 380
+ÍÅ	 374
+ÄÁ	 362
+Ù_	 361
+×Å	 350
+ÔØ_	 348
+ÐÒÏ	 347
+ÏÊ	 346
+ÚÁ	 338
+È_	 336
+ÁÓ	 335
+ÏÂ	 328
+ÓÑ	 326
+ÉÍ	 323
+ÔÒ	 321
+ÎÁ_	 321
+ÓÏ	 320
+ÅÄ	 320
+ÏÓÔ	 318
+ÉÅ	 318
+ÍÏ	 317
+ÎÎ	 316
+ÓÅ	 314
+-	 314
+Á×	 309
+ÖÅ	 308
+Õ_	 307
+ËÉ	 306
+ÎÅ_	 305
+ÇÏ_	 302
+_Ú	 300
+ÉÌ	 295
+_ÐÒÏ	 291
+Ý	 289
+Ô×	 288
+ÉÓ	 285
+_Õ	 275
+_ËÏ	 274
+ÅÎÉ	 274
+Ü	 273
+ÎÏ_	 272
+ÉÒ	 271
+_Ç	 271
+ÁÚ	 267
+ÁÒ	 266
+ÄÉ	 265
+ÏÊ_	 264
+ÏÇÏ	 263
+ÁÍ	 260
+ÐÅ	 258
+×Ù	 255
+ÍÉ	 254
+ÄÏ	 254
+ÓÔ×	 247
+ÉÚ	 246
+ÃÉ	 246
+î	 244
+Æ	 240
+_Ü	 239
+_Á	 239
+Ë_	 238
+ó	 237
+ÅÓÔ	 237
+_ÎÅ_	 236
+ÂÙ	 234
+ÉÑ	 234
+ÒÕ	 229
+ÅË	 228
+ÓÉ	 226
+ÔÅÌ	 224
+ÉË	 224
+ÌÉ_	 222
+ÅÊ	 222
+ÓÑ_	 222
+ÎÔ	 220
+ØÎ	 218
+ÞÔ	 216
+ÌØÎ	 216
+ÏÅ	 214
+ÍÁ	 213
+_ÚÁ	 211
+Ï×Á	 211
+ÂÏ	 210
+_Ì	 210
+ÞÁ	 209
+_î	 208
+ÓÌ	 205
+ÞÔÏ	 204
+_ÞÔ	 204
+ÅÔ_	 203
+_ÞÔÏ	 203
+ÜÔ	 202
+Ó_	 202
+×É	 201
+ÁÑ	 199
+ÅÎÎ	 199
+ÔÏÒ	 199
+_ÎÁ_	 199
+ÓÔÁ	 198
+ÏÖ	 198
+ÉÅ_	 197
+_ó	 197
+_ÓÏ	 195
+ÐÒÉ	 194
+ËÔ	 193
+Ì_	 193
+×Ó	 191
+ÏÍ_	 190
+ÏÇÏ_	 187
+_Ö	 187
+ÅÇ	 186
+_ÔÏ	 186
+ÁÄ	 186
+_ÒÁ	 185
+_ÜÔ	 184
+_ËÁ	 184
+ÓÔÉ	 183
+_Å	 182
+Å×	 182
+ÔÓ	 181
+_ÓÔ	 180
+ÌÑ	 180
+ÔÎ	 180
+ÓÐ	 173
+ÉÉ	 172
+ÏÞ	 172
+À_	 172
+ÐÒÅ	 172
+ÏË	 172
+ÁÔØ	 171
+ÂÉ	 171
+ÛÅ	 170
+ÁÅ	 169
+á	 169
+ÏÒÏ	 168
+ÙÈ	 167
+Ï×Ï	 166
+ÏÌØ	 166
+ÁÎÉ	 165
+ÞÔÏ_	 164
+_ÞÔÏ_	 163
+÷	 163
+ÁÑ_	 163
+ÉÈ	 162
+Ï,_	 160
+Ï,	 160
+ÓÓ	 160
+ÅÚ	 159
+ÎÉÅ	 158
+ÚÎ	 157
+ÜÔÏ	 157
+ÄÎ	 156
+ÒÏ×	 156
+ð	 155
+Á,	 155
+ÓËÏ	 155
+_×Ï	 155
+Á,_	 155
+_ÂÙ	 154
+ÙÅ	 154
+ÝÅ	 154
+_ÏÂ	 154
+É,_	 153
+É,	 153
+ÎÎÏ	 152
+_ÐÒÉ	 151
+ÔÙ	 150
+ÓÔÏ	 150
+ÉÑ_	 150
+ÍÕ	 150
+É×	 150
+_-	 149
+ÒÅÄ	 148
+ÉÔÅ	 147
+_ÜÔÏ	 146
+ÍÅÎ	 146
+ÏÐ	 146
+_ÐÒÅ	 145
+	 145
+ÉÊ	 145
+ÅÌØ	 145
+_÷	 144
+_Ó_	 144
+ÉÞ	 144
+__	 144
+_	 144
+_	 144
+ÈÏ	 143
+ÅÇÏ	 143
+ÑÔ	 142
+ÔÓÑ	 142
+ÐÅÒ	 142
+ÙÊ	 142
+ÐÁ	 141
+ÏÔÏ	 140
+-_	 140
+ÁÐ	 139
+ÏÚ	 139
+ÓËÉ	 138
+ÙÈ_	 138
+ï	 137
+ÓÁ	 137
+ÙÅ_	 137
+_ð	 136
+Å,	 136
+Å,_	 136
+ÒÙ	 136
+Î_	 135
+_á	 135
+ÇÉ	 134
+_×Ù	 134
+ÓÔØ	 134
+ÁÓÔ	 133
+ÖÅ_	 133
+ÞÉ	 133
+ÎÉÑ	 133
+ÕÔ	 133
+ÁÌÉ	 132
+_-_	 131
+ËÕ	 131
+ÓØ	 131
+_ÄÏ	 129
+ÄÕ	 129
+ÒÁÚ	 129
+ÖÎ	 129
+ÁÅÔ	 129
+_ÍÏ	 127
+ÖÉ	 127
+_ÄÅ	 127
+ÓÔÒ	 127
+ØÎÏ	 126
+ÔÕ	 126
+_×Ó	 126
+ÌØÎÏ	 126
+ÌÅÎ	 125
+ÁÌØ	 125
+Ï×_	 124
+×Ì	 123
+ÉÂ	 123
+ÁË_	 123
+_ÐÅ	 123
+ÔÅÌØ	 123
+Ú_	 122
+×Î	 122
+ÁÀ	 122
+ÅÎÔ	 121
+ÐÏÌ	 121
+ÉÈ_	 121
+ÙÊ_	 121
+ÓÎ	 121
+ÎÏÇ	 121
+ÃÅ	 120
+_ÏÔ	 120
+ÅÍ_	 119
+ÉÏ	 119
+_ÔÅ	 118
+ËÁË	 118
+_ÎÏ	 117
+ÉÉ_	 117
+ÉÔØ	 117
+ë	 116
+_ÉÚ	 116
+ÕÓ	 116
+ÎÏÓ	 115
+ÂÅ	 115
+ÕÄ	 115
+ÅÒÅ	 114
+ÂÌ	 114
+ÉÔÅÌ	 113
+ÅÇÏ_	 113
+ÙÍ	 113
+ÁÂ	 113
+ÎØ	 113
+ÎÏÊ	 112
+ÎÉÅ_	 112
+_Æ	 112
+ÒÏÓ	 111
+ËÒ	 111
+_ËÁË	 111
+ÛÉ	 111
+Í,	 111
+ÎÏ×	 111
+Í,_	 111
+ÔÏÍ	 110
+ÅÅ	 110
+ÔÏ×	 109
+Ó×	 109
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/ru-utf8.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/ru-utf8.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/ru-utf8.lm	(revision 24799)
@@ -0,0 +1,404 @@
+Ð	 499907
+_	 271238
+Ñ	 204451
+_Ð	 97811
+Ÿ	 75314
+ÐŸ	 75314
+Ð°	 57823
+°	 57823
+µ	 57598
+Ðµ	 57598
+ž	 46001
+Ðž	 46001
+Ðœ	 45027
+œ	 45027
+	 41533
+Ñ	 41533
+ÐŸÐ	 39878
+ŸÐ	 39878
+	 36836
+Ñ	 36836
+»	 35080
+Ð»	 35080
+œÐ	 32156
+ÐœÐ	 32156
+	 30869
+Ñ	 30869
+_Ñ	 30648
+Ð²	 28421
+²	 28421
+Ð°Ð	 28335
+°Ð	 28335
+µÐ	 26582
+ÐµÐ	 26582
+º	 25014
+Ðº	 25014
+Ð	 24758
+ÑÐ	 24758
+ÑÐ	 23956
+Ð	 23956
+žÐ	 21986
+ÐžÐ	 21986
+	 21736
+Ñ	 21736
+Ð»Ð	 20441
+»Ð	 20441
+Ž	 20355
+ÐŽ	 20355
+ÐŒ	 19885
+Œ	 19885
+ÐŸÑ	 18807
+ŸÑ	 18807
+¿	 18550
+Ð¿	 18550
+Ð²Ð	 18545
+²Ð	 18545
+ºÐ	 17532
+ÐºÐ	 17532
+ÑÐ	 17323
+Ð	 17323
+ÑÑ	 16913
+Ñ	 16913
+,_	 16893
+,	 16893
+µÑ	 16762
+ÐµÑ	 16762
+ÐŽÐ	 15456
+ŽÐ	 15456
+°Ñ	 14863
+Ð°Ñ	 14863
+	 13985
+Ñ	 13985
+Ÿ_	 13163
+ÐŸ_	 13163
+	 13047
+Ñ	 13047
+	 12616
+Ñ	 12616
+.	 12502
+ÐžÑ	 12392
+žÑ	 12392
+_Ð¿	 12332
+Ð¿Ð	 12256
+¿Ð	 12256
+ÑÑ	 11633
+Ñ	 11633
+·	 11523
+Ð·	 11523
+._	 11483
+_Ñ	 11471
+³	 11399
+Ð³	 11399
+µ_	 11183
+Ðµ_	 11183
+Ð±	 11117
+±	 11117
+ÐŒÐ	 11011
+ŒÐ	 11011
+_Ðœ	 10775
+°_	 10717
+Ð°_	 10717
+	 10503
+Ñ	 10503
+_ÐœÐ	 10474
+_Ð²	 10140
+ÐœÑ	 10074
+œÑ	 10074
+ÑÐ	 9721
+Ð	 9721
+Ð³Ð	 9527
+³Ð	 9527
+ÑÐŸ	 9092
+ÐŸ	 9092
+Ð»Ñ	 8812
+»Ñ	 8812
+ž_	 8763
+Ðž_	 8763
+Ð·Ð	 8663
+·Ð	 8663
+ÑÑ	 8359
+Ñ	 8359
+Ð¹	 8342
+¹	 8342
+_Ð¿Ð	 7945
+ÐœÐŸ	 7921
+œÐŸ	 7921
+-	 7662
+_ÑÐ	 7645
+ÐœÐ°	 7444
+œÐ°	 7444
+Ð	 7377
+ÑÐ	 7377
+¿ÐŸ	 7308
+Ð¿ÐŸ	 7308
+ÐœÐµ	 7256
+œÐµ	 7256
+Ð¶	 7017
+¶	 7017
+ºÐŸ	 6941
+ÐºÐŸ	 6941
+Ð	 6692
+ÑÐ	 6692
+Ð°Ð»	 6630
+°Ð»	 6630
+¶Ð	 6332
+Ð¶Ð	 6332
+_ÐŸ	 6280
+Ð¿Ñ	 6223
+¿Ñ	 6223
+ÑÐŸ	 6145
+ÐŸ	 6145
+_Ðž	 6114
+Ñ	 6105
+ÑÑ	 6105
+	 6070
+Ñ	 6070
+Ñ	 6066
+ÑÑ	 6066
+_Ð¿ÐŸ	 6038
+_	 5983
+Ñ_	 5983
+±Ð	 5967
+Ð±Ð	 5967
+Ð°	 5913
+ÑÐ°	 5913
+ÐºÐ°	 5895
+ºÐ°	 5895
+Ð²Ñ	 5883
+²Ñ	 5883
+ÑÑÐ	 5879
+ÑÐ	 5879
+_-	 5841
+-_	 5819
+_-_	 5816
+ÐŸÐ²	 5759
+ŸÐ²	 5759
+_Ðº	 5738
+³ÐŸ	 5705
+Ð³ÐŸ	 5705
+µÐœ	 5700
+ÐµÐœ	 5700
+»Ð°	 5679
+Ð»Ð°	 5679
+œÐž	 5530
+ÐœÐž	 5530
+
+	 5255
+Ñ
+	 5255
+µÑ	 5174
+ÐµÑ	 5174
+ÐŸÑ	 5149
+ŸÑ	 5149
+ŸÐ»	 5111
+ÐŸÐ»	 5111
+Ð¹_	 5097
+¹_	 5097
+Ñ_	 5072
+_	 5072
+_ÐŽ	 5062
+ÑÐ	 5055
+Ð	 5055
+ÐŸÑ	 4979
+ŸÑ	 4979
+Ð¿Ñ	 4955
+¿Ñ	 4955
+»Ðž	 4922
+Ð»Ðž	 4922
+Ð²ÐŸ	 4832
+²ÐŸ	 4832
+Ð±Ñ	 4821
+±Ñ	 4821
+_Ñ	 4817
+_ÐœÐµ	 4790
+ÑÐµ	 4789
+Ðµ	 4789
+ÐºÐŸÐ	 4774
+ºÐŸÐ	 4774
+Ð»ÐŸ	 4771
+»ÐŸ	 4771
+ÐŸÑ	 4720
+ŸÑ	 4720
+Ð¿ÑÐ	 4681
+¿ÑÐ	 4681
+µÑ	 4640
+ÐµÑ	 4640
+Ð°	 4604
+ÑÐ°	 4604
+µÐ»	 4594
+ÐµÐ»	 4594
+Ð¿ÐŸÐ	 4503
+¿ÐŸÐ	 4503
+²Ð°	 4491
+Ð²Ð°	 4491
+_Ð²Ð	 4448
+_Ð¿Ñ	 4386
+ÐžÐ»	 4386
+žÐ»	 4386
+Ñ	 4382
+ÑÑ	 4382
+_Ð±	 4344
+ÑÐµ	 4260
+_ÐŽÐ	 4260
+Ðµ	 4260
+ÑÐž	 4248
+Ðž	 4248
+ÐŸÐŒ	 4243
+ŸÐŒ	 4243
+Œ_	 4211
+ÐŒ_	 4211
+ÐžÑ	 4182
+žÑ	 4182
+Ð»_	 4132
+»_	 4132
+ŸÐ²Ð	 4111
+ÐŸÐ²Ð	 4111
+Ð²Ðµ	 4059
+²Ðµ	 4059
+ÐŽÑ	 4046
+ŽÑ	 4046
+ºÑ	 3984
+ÐºÑ	 3984
+	 3978
+Ñ	 3978
+_	 3967
+Ñ_	 3967
+_ÐºÐ	 3936
+_Ð¿Ñ	 3895
+Ð°Ñ	 3867
+°Ñ	 3867
+ŸÐœ	 3843
+ÐŸÐœ	 3843
+Ð°Ñ	 3830
+°Ñ	 3830
+_ÐŒ	 3826
+_ÐœÐ°	 3816
+·Ð°	 3784
+Ð·Ð°	 3784
+»Ðµ	 3756
+Ð»Ðµ	 3756
+°Ðœ	 3700
+Ð°Ðœ	 3700
+ÐŸÐ	 3700
+ÑÐŸÐ	 3700
+_ÑÐ	 3674
+ŽÐµ	 3656
+ÐŽÐµ	 3656
+ÐµÑÐ	 3641
+µÑÐ	 3641
+Ñ	 3638
+ÑÑ	 3638
+ÐžÐœ	 3630
+ÐµÐœÐ	 3630
+µÐœÐ	 3630
+žÐœ	 3630
+œÐŸÐ	 3620
+ÐœÐŸÐ	 3620
+_Ðž_	 3566
+ŸÐŽ	 3562
+ÐŸÐŽ	 3562
+°Ðº	 3518
+Ð°Ðº	 3518
+_Ð·	 3505
+ŸÐ³	 3497
+ÐŸÐ³	 3497
+ŸÑÐ	 3447
+ÐŸÑÐ	 3447
+ÐŸ_	 3425
+ÑÐŸ_	 3425
+ŽÐ°	 3422
+ÐŽÐ°	 3422
+Ð²_	 3419
+²_	 3419
+_Ð·Ð	 3416
+ÐµÑ	 3408
+µÑ	 3408
+_ÐŸÐ	 3398
+_Ñ	 3366
+Ð°Ð	 3349
+ÑÐ°Ð	 3349
+_ÐŒÐ	 3328
+ºÐ°Ð	 3323
+ÐºÐ°Ð	 3323
+œÐµ_	 3307
+ÐœÐµ_	 3307
+ÐµÐ	 3300
+ÑÐµÐ	 3300
+ŽÐŸ	 3295
+ÐŽÐŸ	 3295
+ÐŸÐ	 3286
+ÑÐŸÐ	 3286
+_Ñ	 3262
+ÐœÐžÐ	 3256
+œÐžÐ	 3256
+»Ñ	 3244
+Ð»Ñ	 3244
+ŸÐ»Ð	 3232
+ÐŸÐ»Ð	 3232
+Ð	 3229
+ÑÐ	 3229
+Ñ_	 3210
+_	 3210
+ŸÐ¹	 3206
+ÐŸÐ¹	 3206
+Ð°Ð	 3132
+ÑÐ°Ð	 3132
+_Ñ	 3094
+Ð	 3058
+ŸÐ³Ð	 3058
+ÑÐ	 3058
+ÐŸÐ³Ð	 3058
+Ð°Ð»Ð	 3027
+°Ð»Ð	 3027
+_Ð²Ñ	 3007
+Ðº	 3004
+ÑÐº	 3004
+Ñ	 2989
+œÑ	 2989
+ÐœÑ	 2989
+	 2989
+ŒÑ	 2971
+ÐŒÑ	 2971
+Ðµ	 2965
+ÑÐµ	 2965
+µÐŒ	 2942
+ÐµÐŒ	 2942
+ÐŸÐ±	 2933
+ŸÐ±	 2933
+ÐœÑ	 2902
+œÑ	 2902
+œÐ°_	 2891
+ÐœÐ°_	 2891
+Ðž	 2839
+ÑÐž	 2839
+
+Ð	 2792
+°ÐŒ	 2792
+Ñ
+Ð	 2792
+Ð°ÐŒ	 2792
+žÐº	 2790
+ÐžÐº	 2790
+ŸÑÑ	 2788
+ÐŸÑÑ	 2788
+Ñ	 2786
+ÑÑ	 2786
+³ÐŸ_	 2782
+Ð³ÐŸ_	 2782
+ÐžÐ	 2771
+ÑÐžÐ	 2771
+ŒÐµ	 2760
+ÐŒÐµ	 2760
+Ðµ	 2760
+ÑÐµ	 2760
+°ÐœÐ	 2735
+Ð°ÐœÐ	 2735
+ÑÐºÐ	 2708
+ÐºÐ	 2708
+_Ð²_	 2682
+_ÐŸÑ	 2680
+ÐºÐž	 2679
+ÐŸÑÐ	 2679
+ŸÑÐ	 2679
+ºÐž	 2679
+Ð°Ð·	 2674
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/ru-windows_1251.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/ru-windows_1251.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/ru-windows_1251.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 21836
+î	 5818
+à	 4506
+å	 4258
+è	 3769
+ò	 3394
+í	 3254
+ñ	 2594
+ë	 2470
+ð	 2346
+â	 2227
+ê	 1798
+ì	 1709
+ó	 1673
+ä	 1638
+ï	 1377
+,	 1187
+,_	 1172
+î_	 1160
+ÿ	 1059
+ü	 1024
+û	 1006
+å_	 966
+á	 945
+_ï	 937
+ç	 910
+_í	 907
+è_	 896
+òî	 878
+ã	 856
+_ñ	 828
+_â	 818
+à_	 801
+÷	 795
+.	 789
+._	 761
+ñò	 655
+íå	 617
+_è	 616
+íà	 575
+ø	 568
+é	 565
+ïî	 549
+ðà	 526
+íî	 524
+ÿ_	 522
+_ò	 521
+_î	 497
+_ä	 496
+æ	 484
+_ïî	 477
+_ê	 477
+ãî	 472
+àë	 470
+ü_	 461
+íè	 456
+îâ	 454
+êî	 452
+ðî	 432
+êà	 431
+ëè	 425
+õ	 413
+òà	 403
+åí	 402
+_ì	 396
+_á	 396
+âî	 395
+îë	 388
+òî_	 384
+é_	 383
+_íå	 378
+_è_	 375
+îð	 369
+âà	 367
+_íà	 365
+ì_	 364
+îì	 363
+ïð	 357
+ó_	 357
+åë	 353
+åð	 352
+ëà	 350
+èò	 344
+îñ	 344
+ë_	 343
+òü	 338
+äå	 337
+ëî	 334
+ðè	 330
+ðå	 328
+èë	 326
+àê	 326
+îò	 323
+-	 322
+îí	 320
+åò	 317
+þ	 312
+àí	 308
+âå	 308
+â_	 302
+_÷	 299
+ò_	 296
+çà	 292
+íå_	 292
+òå	 291
+äà	 291
+_ç	 291
+îä	 286
+àð	 283
+àò	 283
+_ïð	 274
+åñ	 264
+ìî	 263
+û_	 260
+îã	 253
+_-	 245
+_ó	 245
+ê_	 244
+îá	 240
+ãî_	 238
+ñÿ	 235
+_íå_	 235
+ìå	 233
+ëü	 229
+-_	 225
+ñê	 219
+_â_	 217
+åì	 217
+íû	 215
+îé	 215
+ñå	 211
+áû	 211
+êè	 211
+÷ò	 209
+òü_	 209
+÷å	 208
+_ã	 206
+Í	 206
+äî	 205
+ö	 205
+÷òî	 203
+èí	 203
+àñ	 202
+_-_	 202
+_÷ò	 199
+_÷òî	 199
+òè	 197
+àâ	 197
+íà_	 197
+_å	 195
+åä	 192
+_ð	 191
+æå	 190
+àì	 190
+åã	 188
+àç	 188
+òð	 185
+_òî	 184
+_Í	 183
+èì	 182
+_çà	 181
+äè	 175
+Â	 174
+_êî	 172
+ëå	 170
+_Â	 169
+îé_	 168
+!	 168
+÷òî_	 165
+ìó	 165
+íî_	 164
+èñ	 164
+í_	 164
+ìè	 163
+ñòà	 163
+ù	 162
+_÷òî_	 162
+_áû	 159
+ìà	 158
+ðó	 157
+âû	 156
+âè	 154
+âñ	 154
+åãî	 153
+èê	 153
+èç	 153
+ñü	 153
+àø	 152
+ûë	 150
+_íà_	 149
+ñ_	 148
+òâ	 148
+_ñò	 146
+ñÿ_	 146
+ëè_	 146
+_ÿ	 144
+îãî	 143
+øå	 141
+õ_	 141
+àê_	 141
+!_	 139
+ñî	 139
+êó	 139
+áî	 137
+ïðî	 136
+àòü	 136
+åãî_	 135
+_êà	 134
+_ìî	 131
+èå	 131
+îñò	 130
+îì_	 129
+î,	 128
+_ãî	 128
+î,_	 127
+èâ	 127
+ñë	 126
+óò	 126
+_òà	 126
+íí	 125
+àä	 125
+Ñ	 124
+íó	 123
+î÷	 122
+_âû	 122
+_âñ	 121
+_îí	 120
+áûë	 120
+ïà	 120
+óä	 120
+_Ñ	 119
+ïðè	 119
+îâî	 119
+õî	 118
+ý	 117
+_áûë	 117
+è,	 115
+åé	 115
+_äî	 115
+àë_	 114
+_æ	 114
+è,_	 114
+_à	 113
+_ý	 113
+îå	 112
+åñò	 112
+îðî	 110
+çí	 110
+_äå	 110
+øè	 109
+èä	 109
+ñòî	 109
+_ïðî	 109
+_âî	 108
+àëè	 108
+íÿ	 107
+øà	 107
+ýò	 107
+îæ	 106
+à,	 106
+Ï	 106
+ûé	 105
+îëü	 105
+óñ	 105
+_ýò	 105
+_ïðè	 104
+èõ	 104
+ñü_	 104
+ñè	 104
+îï	 104
+Ì	 103
+à,_	 103
+àÿ	 103
+åç	 102
+äåë	 102
+_ðà	 102
+_Ï	 101
+îâà	 101
+óæ	 101
+âàë	 101
+þ_	 101
+êàê	 100
+_ÿ_	 100
+ó,	 100
+æå_	 100
+ñòâ	 100
+äí	 100
+÷è	 100
+òó	 100
+_õ	 100
+_Ì	 99
+ò,	 99
+îê	 99
+èòü	 99
+åò_	 99
+_ñî	 99
+ëÿ	 98
+àå	 98
+_îò	 98
+îãî_	 98
+Ê	 97
+âîð	 97
+òí	 97
+_ë	 97
+ó,_	 97
+äó	 96
+_äà	 96
+ò,_	 96
+áà	 96
+ïå	 96
+ëà_	 95
+áó	 95
+áå	 94
+ìó_	 94
+_ìå	 94
+÷à	 94
+âñå	 93
+òû	 93
+êà_	 92
+_êàê	 91
+ìí	 91
+òñ	 90
+íü	 90
+_îá	 90
+?	 90
+ðàç	 89
+òàê	 89
+_ñ_	 89
+ñà	 89
+å,	 89
+æè	 88
+ô	 88
+_òàê	 88
+èÿ	 88
+è÷	 88
+îí_	 87
+ìåí	 87
+å,_	 87
+ûé_	 86
+ë,	 86
+ë,_	 86
+òîì	 86
+ðàí	 86
+ýòî	 86
+Íó	 86
+È	 86
+öè	 85
+èå_	 85
+âåð	 85
+ñâ	 84
+_îí_	 84
+_âñå	 84
+ðû	 84
+_ýòî	 84
+_È	 84
+ç_	 83
+ïè	 83
+ëó	 83
+À	 83
+åíè	 82
+èë_	 82
+"	 82
+ïîë	 82
+àòü_	 81
+òîð	 81
+èëè	 81
+êð	 81
+ëñ	 81
+òåë	 81
+åíí	 81
+îòî	 80
+äà_	 79
+èòå	 79
+ñòð	 79
+îâîð	 79
+ãîâ	 79
+îðè	 79
+àíè	 79
+_Íó	 78
+ëñÿ	 78
+_íè	 78
+è.	 77
+_ñâ	 77
+è._	 76
+à.	 76
+_èç	 76
+èø	 76
+ùå	 76
+ÿò	 76
+îëî	 76
+ü,	 75
+Î	 75
+êè_	 75
+ü,_	 75
+ëî_	 75
+îç	 74
+_åã	 74
+ëüí	 74
+üí	 74
+ûå	 74
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/sk-windows_1250.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/sk-windows_1250.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/sk-windows_1250.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 8202
+o	 2145
+a	 1912
+e	 1763
+i	 1491
+n	 1415
+r	 1256
+t	 1127
+v	 1080
+s	 1004
+k	 824
+d	 739
+p	 739
+l	 735
+m	 685
+c	 620
+u	 597
+h	 531
+a_	 467
+j	 449
+_p	 445
+z	 439
+e_	 412
+á	 402
+_v	 369
+.	 361
+_s	 359
+ov	 330
+b	 327
+st	 312
+y	 309
+pr	 307
+._	 300
+o_	 297
+í	 278
+,	 268
+,_	 260
+to	 258
+è	 256
+_a	 254
+ý	 253
+i_	 252
+_pr	 246
+ch	 242
+re	 233
+_z	 223
+ra	 220
+_n	 217
+ne	 214
+ie	 214
+po	 214
+en	 208
+ro	 205
+or	 204
+é	 199
+u_	 197
+an	 197
+ko	 194
+na	 189
+ni	 187
+va	 183
+	 182
+ú	 180
+os	 179
+v_	 176
+	 173
+_o	 171
+ho	 170
+ia	 168
+no	 166
+li	 166
+h_	 166
+ed	 164
+j_	 161
+om	 160
+_k	 160
+	 158
+ch_	 158
+ti	 155
+y_	 148
+m_	 147
+ej	 147
+_po	 145
+ci	 145
+_d	 140
+_	 139
+do	 138
+_t	 137
+_m	 134
+ri	 129
+mi	 129
+od	 128
+te	 124
+_a_	 124
+la	 122
+al	 121
+aj	 120
+ej_	 120
+vo	 119
+ol	 119
+in	 118
+ve	 117
+me	 117
+tr	 116
+sk	 116
+ova	 116
+S	 111
+er	 110
+ob	 110
+_na	 109
+ad	 107
+je	 106
+at	 104
+_v_	 103
+_r	 102
+ic	 101
+ých	 100
+pre	 100
+ýc	 100
+av	 98
+es	 96
+ta	 95
+dn	 94
+ho_	 94
+lo	 94
+é_	 93
+_pre	 93
+it	 93
+V	 92
+de	 92
+kt	 89
+ný	 89
+za	 88
+A	 87
+le	 86
+ých_	 86
+ok	 86
+ost	 85
+vi	 84
+ie_	 83
+ak	 82
+P	 82
+né	 81
+R	 80
+sa	 80
+as	 79
+èi	 78
+na_	 77
+a	 77
+í_	 77
+Ÿ	 76
+ar	 75
+di	 75
+_S	 74
+om_	 74
+_V	 73
+_do	 73
+_za	 72
+-	 72
+ck	 71
+vy	 71
+ka	 71
+f	 70
+tor	 70
+am	 70
+on	 70
+_-	 69
+_P	 69
+M	 68
+_i	 68
+_sa	 68
+nos	 68
+ní	 68
+ác	 67
+a_	 67
+sl	 66
+il	 66
+rá	 66
+_c	 66
+_b	 66
+_-_	 64
+sa_	 64
+-_	 64
+kto	 64
+_j	 64
+ani	 64
+kr	 64
+sti	 63
+ou	 63
+ot	 63
+ne_	 63
+_sa_	 62
+vý	 62
+_na_	 62
+red	 62
+ku	 61
+is	 61
+ná	 60
+ý_	 60
+so	 60
+sp	 60
+_st	 59
+g	 59
+tn	 59
+str	 58
+e	 58
+nt	 58
+et	 57
+pra	 57
+ke	 57
+ov_	 57
+_vy	 57
+_M	 57
+nej	 56
+tu	 56
+l_	 56
+_je	 56
+nie	 56
+èn	 56
+k_	 56
+pe	 56
+_h	 55
+oz	 55
+ú_	 55
+est	 55
+_è	 55
+va	 55
+ma	 54
+né_	 53
+tá	 53
+..	 53
+rí	 52
+ran	 52
+bo	 51
+nej_	 51
+ick	 51
+ti_	 51
+ia_	 51
+ktor	 51
+K	 51
+O	 51
+T	 51
+_ne	 51
+ou_	 50
+I	 50
+oc	 50
+to_	 50
+vn	 50
+sta	 50
+_.	 50
+da	 50
+éh	 49
+ého	 49
+N	 49
+_ro	 49
+_ko	 49
+ac	 49
+ek	 49
+li_	 49
+èa	 49
+rov	 49
+oj	 48
+s_	 48
+s	 48
+ého_	 48
+va_	 48
+je_	 48
+zá	 47
+ik	 47
+mo	 47
+mi_	 47
+si	 47
+_kto	 46
+_sp	 46
+_kt	 46
+E	 46
+_ktor	 46
+eb	 46
+nýc	 45
+_u	 45
+el	 45
+B	 45
+ných	 45
+pro	 45
+eni	 44
+_	 44
+em	 44
+kon	 44
+pa	 44
+ky	 44
+uj	 44
+e_	 44
+ova	 44
+cie	 44
+hr	 44
+ký	 44
+ných_	 43
+pred	 43
+zo	 43
+ln	 43
+oè	 43
+tov	 43
+nu	 43
+eè	 43
+íc	 42
+ál	 42
+ým	 42
+pri	 42
+_to	 42
+lá	 41
+ce	 41
+áv	 41
+eh	 41
+_pro	 41
+rav	 41
+kej	 41
+ns	 41
+ali	 41
+oli	 40
+á_	 40
+_pri	 40
+oh	 40
+ud	 40
+_ak	 40
+ent	 40
+eŸ	 40
+prav	 39
+_pred	 39
+i	 39
+zn	 39
+ny	 39
+ove	 39
+pol	 39
+ru	 39
+a,	 39
+ah	 39
+kej_	 39
+a,_	 38
+z_	 38
+aj_	 38
+r_	 38
+i	 38
+ova_	 38
+tre	 38
+pod	 37
+_zá	 37
+_ob	 37
+nost	 37
+sti_	 37
+van	 37
+up	 37
+osti	 36
+áci	 36
+_e	 36
+jú	 36
+co	 36
+_str	 36
+i	 36
+_ma	 36
+ut	 36
+nsk	 36
+by	 36
+_ve	 35
+ko_	 35
+de_	 35
+èia	 35
+_aj	 35
+_aj_	 35
+op	 35
+_pod	 34
+prí	 34
+_in	 34
+ez	 34
+odn	 34
+dne	 34
+Z	 34
+tra	 34
+bn	 34
+ád	 34
+_e_	 34
+_vo	 34
+èas	 34
+át	 34
+d_	 34
+ô	 34
+sto	 34
+ky_	 34
+ir	 33
+_z_	 33
+nie_	 33
+t	 33
+ven	 33
+i_	 33
+_s_	 33
+_B	 33
+e	 33
+ens	 33
+spo	 32
+eho	 32
+lad	 32
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/sl-ascii.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/sl-ascii.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/sl-ascii.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 25262
+e	 6217
+a	 5964
+i	 5611
+o	 5538
+n	 4132
+s	 3349
+l	 3268
+r	 2913
+t	 2777
+j	 2672
+v	 2282
+k	 2175
+e_	 1958
+d	 1953
+p	 1786
+a_	 1700
+y	 1623
+m	 1559
+o_	 1542
+z	 1521
+i_	 1462
+_s	 1433
+je	 1383
+,	 1278
+,_	 1278
+b	 1230
+c	 1137
+_p	 1130
+_n	 1032
+je_	 997
+u	 986
+_j	 972
+g	 933
+_je	 877
+cy	 848
+_je_	 842
+_v	 793
+il	 786
+ni	 782
+st	 779
+na	 743
+ra	 726
+.	 723
+._	 716
+_z	 713
+in	 691
+_k	 685
+_b	 667
+al	 640
+h	 627
+po	 607
+ti	 584
+pr	 584
+ko	 584
+_d	 582
+el	 579
+n_	 579
+la	 577
+lo	 573
+l_	 571
+_t	 567
+se	 567
+ne	 562
+_i	 556
+no	 549
+en	 546
+_o	 534
+re	 524
+bi	 514
+li	 512
+ov	 496
+sy	 458
+_na	 457
+te	 453
+da	 451
+_po	 440
+_bi	 437
+ye	 436
+to	 424
+ri	 420
+an	 420
+_pr	 417
+ve	 410
+nj	 404
+ka	 403
+_m	 394
+le	 385
+ja	 377
+va	 374
+de	 374
+is	 371
+ed	 364
+v_	 362
+za	 361
+in_	 354
+bil	 353
+_se	 351
+aj	 347
+ga	 344
+ar	 343
+od	 339
+_in	 338
+_in_	 333
+tr	 332
+os	 332
+_bil	 332
+ta	 328
+vo	 327
+ki	 324
+ro	 324
+et	 320
+so	 315
+em	 313
+lo_	 311
+na_	 306
+av	 305
+ih	 305
+yi	 304
+h_	 295
+at	 294
+m_	 293
+ek	 292
+ol	 289
+se_	 289
+as	 284
+lj	 281
+_za	 277
+ob	 275
+om	 273
+me	 273
+zy	 272
+mi	 268
+eg	 265
+_v_	 263
+_g	 260
+or	 260
+es	 259
+_se_	 258
+do	 255
+ni_	 255
+ga_	 253
+oc	 251
+il_	 250
+vi	 249
+ak	 248
+no_	 243
+da_	 241
+pa	 240
+_ne	 238
+ot	 238
+_so	 238
+ocy	 237
+ya	 237
+la_	 234
+li_	 234
+ih_	 231
+_c	 229
+az	 229
+ik	 228
+on	 225
+ki_	 224
+go	 223
+im	 223
+sk	 223
+mo	 221
+cye	 219
+ti_	 217
+ji	 216
+_da	 216
+iz	 215
+ko_	 214
+ic	 213
+_l	 209
+u_	 209
+pre	 208
+_r	 208
+_ko	 208
+t_	 207
+z_	 206
+er	 206
+so_	 206
+ilo	 203
+r_	 201
+j_	 199
+ad	 195
+cyi	 193
+_na_	 193
+sa	 191
+ev	 191
+i,	 188
+i,_	 188
+it	 187
+sto	 186
+_da_	 184
+_ni	 183
+_so_	 182
+_ve	 182
+nje	 181
+a,	 181
+kr	 181
+a,_	 181
+dn	 177
+_st	 177
+di	 176
+ega	 176
+og	 174
+o,_	 174
+o,	 174
+ilo_	 172
+_ki	 171
+ma	 170
+-	 170
+ij	 169
+_cy	 169
+ost	 169
+e,	 168
+e,_	 168
+ne_	 168
+ok	 166
+ke	 165
+_pre	 165
+del	 165
+yn	 165
+al_	 165
+bo	 164
+_pa	 163
+_ki_	 163
+am	 159
+ns	 158
+ye_	 156
+sp	 155
+em_	 154
+_ka	 154
+_te	 153
+_iz	 152
+ega_	 151
+_ob	 150
+br	 149
+ec	 149
+pri	 148
+ap	 147
+ez	 147
+ali	 147
+raz	 144
+jo	 142
+to_	 141
+d_	 138
+a._	 137
+a.	 137
+cya	 137
+ova	 136
+anj	 136
+el_	 135
+V	 135
+si	 134
+sta	 134
+_pri	 132
+_to	 131
+_a	 130
+_bilo	 130
+bilo	 130
+oj	 129
+ecy	 128
+_od	 128
+gl	 128
+op	 127
+ju	 127
+rav	 126
+_u	 125
+s_	 125
+_V	 125
+ila	 125
+ce	 124
+_mo	 124
+ali_	 124
+ah	 122
+str	 122
+_sp	 121
+vr	 121
+aj_	 121
+_do	 121
+bilo_	 121
+N	 119
+iv	 117
+ru	 116
+vs	 116
+jal	 116
+pi	 115
+O	 115
+_z_	 113
+icy	 112
+k_	 112
+be	 112
+elo	 111
+dr	 110
+pra	 110
+sye	 110
+ved	 109
+rs	 108
+_tr	 108
+tv	 108
+oz	 108
+tn	 107
+_nj	 107
+le_	 107
+_N	 107
+_ni_	 106
+pa_	 106
+l,_	 105
+l,	 105
+ins	 105
+ako	 104
+ac	 104
+ist	 104
+ir	 104
+sl	 104
+ila_	 103
+nik	 103
+bi_	 103
+i.	 102
+i._	 102
+_vs	 102
+iti	 102
+_sy	 101
+P	 101
+val	 100
+ku	 100
+_P	 99
+pe	 99
+ala	 99
+bil_	 98
+eli	 98
+jen	 98
+ede	 98
+_zy	 98
+T	 96
+ja_	 96
+ran	 95
+_bo	 95
+S	 95
+ln	 95
+zn	 94
+nst	 93
+_pa_	 93
+_ra	 93
+_bil_	 93
+nil	 93
+ati	 92
+ej	 92
+ocyi	 92
+e.	 91
+_le	 91
+ud	 91
+nov	 91
+nja	 91
+sn	 91
+ar_	 91
+e._	 91
+kl	 91
+isy	 90
+zye	 90
+en_	 90
+sti	 90
+_ga	 90
+prav	 90
+_bi_	 90
+za_	 89
+lik	 89
+ton	 89
+kra	 88
+rt	 88
+W	 88
+_de	 88
+_ga_	 88
+M	 88
+ep	 87
+cyn	 87
+Wi	 87
+_S	 87
+ut	 87
+_W	 87
+inst	 87
+insto	 86
+ste	 86
+Wins	 86
+gov	 86
+nu	 86
+Win	 86
+_Wi	 86
+Winst	 86
+nsto	 86
+eti	 86
+ston	 86
+nston	 86
+_Win	 85
+_Wins	 85
+ili	 84
+bra	 83
+rat	 83
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/sl-iso_8859_2.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/sl-iso_8859_2.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/sl-iso_8859_2.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 10406
+a	 2828
+e	 2676
+i	 2458
+o	 2418
+n	 1814
+r	 1484
+v	 1253
+l	 1248
+s	 1228
+t	 1172
+j	 1107
+d	 1085
+k	 911
+p	 880
+a_	 823
+m	 763
+i_	 681
+e_	 678
+_p	 603
+o_	 566
+u	 521
+z	 516
+b	 456
+_s	 435
+je	 434
+,	 416
+,_	 411
+ni	 399
+è	 383
+_v	 372
+_d	 356
+pr	 355
+g	 345
+ra	 336
+_n	 332
+st	 323
+an	 313
+po	 303
+re	 301
+na	 295
+h	 287
+ov	 276
+_pr	 276
+li	 275
+al	 274
+_z	 270
+je_	 259
+la	 255
+¹	 253
+ne	 248
+en	 246
+ko	 244
+in	 237
+c	 234
+ti	 234
+v_	 234
+_po	 232
+no	 230
+ve	 230
+_k	 227
+_i	 224
+da	 224
+.	 221
+_j	 221
+ri	 220
+ja	 216
+_t	 214
+se	 213
+ed	 212
+._	 211
+em	 206
+te	 205
+za	 201
+od	 201
+av	 200
+lo	 196
+nj	 194
+_o	 194
+_je	 193
+il	 190
+or	 183
+ka	 181
+sk	 179
+_b	 178
+_je_	 178
+ih	 178
+n_	 177
+_za	 173
+h_	 171
+er	 171
+os	 171
+_na	 168
+va	 168
+ta	 164
+le	 163
+m_	 161
+ev	 157
+ij	 157
+ar	 157
+do	 155
+to	 155
+Ÿ	 154
+A	 153
+el	 150
+_m	 148
+ro	 147
+ol	 146
+_v_	 145
+aj	 145
+di	 143
+N	 142
+S	 142
+at	 140
+ih_	 139
+ki	 138
+de	 137
+_in	 135
+vo	 135
+ga	 134
+me	 131
+in_	 129
+vi	 129
+om	 127
+_in_	 125
+et	 124
+pre	 124
+O	 123
+bi	 120
+I	 119
+da_	 117
+ik	 117
+ma	 115
+E	 114
+so	 113
+bo	 112
+it	 112
+anj	 112
+eg	 110
+ni_	 109
+mi	 108
+ke	 108
+na_	 108
+u_	 108
+lj	 106
+iz	 105
+ob	 105
+_da	 103
+li_	 103
+is	 103
+im	 102
+red	 102
+_pre	 102
+dr	 100
+mo	 99
+P	 99
+_se	 99
+ji	 98
+r_	 97
+ad	 97
+pri	 97
+K	 97
+_l	 97
+tr	 95
+pa	 94
+no_	 94
+j_	 92
+ki_	 91
+ti_	 91
+_pri	 91
+dn	 89
+_P	 88
+ej	 88
+_da_	 87
+ne_	 86
+ega	 86
+_r	 86
+_bi	 86
+l_	 86
+em_	 86
+go	 86
+"	 85
+sl	 85
+ek	 84
+ali	 84
+ove	 84
+aè	 84
+ak	 84
+ci	 83
+ga_	 83
+ko_	 83
+se_	 82
+_S	 82
+jo	 81
+ot	 81
+ja_	 81
+_so	 80
+lov	 80
+L	 80
+D	 79
+V	 79
+as	 78
+_do	 78
+am	 78
+nje	 77
+es	 77
+za_	 77
+_pa	 76
+T	 75
+tu	 75
+_za_	 74
+sti	 74
+_dr	 74
+la_	 74
+_N	 74
+_de	 74
+ega_	 73
+_ko	 73
+og	 73
+ns	 72
+èe	 72
+ds	 72
+_bo	 71
+ora	 71
+vn	 71
+ost	 71
+_ne	 71
+iè	 70
+ven	 69
+z_	 69
+èi	 69
+_te	 68
+ce	 68
+_se_	 67
+èa	 67
+oè	 67
+M	 66
+_u	 66
+un	 65
+ln	 65
+pos	 64
+ju	 64
+sta	 64
+op	 64
+di_	 63
+ud	 63
+vs	 63
+t_	 62
+nsk	 62
+tv	 62
+on	 62
+ski	 62
+R	 62
+pa_	 62
+_ka	 62
+i,	 61
+so_	 61
+_iz	 60
+_pa_	 60
+s_	 60
+i,_	 60
+pro	 59
+del	 59
+rav	 59
+eni	 59
+oli	 58
+rj	 58
+e,	 57
+¹e	 57
+ili	 57
+vr	 57
+d_	 57
+_le	 57
+pred	 57
+jo_	 56
+e,_	 56
+nik	 56
+love	 56
+_pred	 56
+ske	 56
+er_	 55
+str	 55
+èn	 54
+pra	 54
+J	 54
+_¹	 54
+oven	 53
+_ra	 53
+tn	 53
+_na_	 53
+_so_	 53
+nih	 53
+loven	 53
+si	 52
+ke_	 52
+_g	 52
+ic	 52
+udi	 51
+bi_	 51
+eds	 51
+oj	 51
+ru	 51
+a,	 51
+_pro	 50
+_pos	 50
+nc	 50
+nih_	 50
+èu	 50
+a,_	 50
+_a	 50
+az	 50
+ok	 50
+B	 50
+let	 49
+udi_	 49
+_od	 49
+_K	 49
+aj_	 48
+_bi_	 48
+_ve	 48
+raè	 48
+o,	 47
+_tu	 47
+ija	 47
+ter	 47
+ist	 47
+Z	 47
+reds	 46
+nd	 46
+ali_	 46
+A_	 46
+iti	 46
+bil	 46
+_ob	 46
+o,_	 46
+ati	 46
+tud	 45
+tudi	 45
+_ki	 45
+k_	 45
+be	 45
+a¹	 45
+ir	 45
+Ÿa	 45
+do_	 45
+sp	 45
+_ki_	 45
+_st	 45
+ep	 44
+_del	 44
+tudi_	 44
+rŸ	 44
+aèu	 44
+_ni	 44
+ah	 43
+raèu	 43
+raèun	 43
+i¹	 43
+_mo	 43
+avn	 43
+_tud	 43
+èun	 43
+aèun	 43
+_tudi	 43
+_to	 42
+raz	 42
+kr	 42
+ova	 42
+_e	 42
+ogo	 42
+ani	 42
+_"	 42
+ev_	 42
+br	 42
+eb	 42
+sa	 42
+mi_	 42
+tem	 42
+ta_	 41
+prav	 41
+i.	 41
+slov	 41
+ens	 41
+bo_	 41
+Ÿe	 41
+_T	 41
+_let	 41
+odo	 41
+slo	 41
+ensk	 40
+ka_	 40
+neg	 40
+ez	 40
+nos	 40
+eè	 40
+_sl	 40
+_V	 40
+rŸa	 40
+nega	 40
+ili_	 39
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/sv-iso_8859_1.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/sv-iso_8859_1.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/sv-iso_8859_1.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 33494
+e	 8992
+n	 7900
+t	 7859
+a	 7781
+r	 7251
+s	 6435
+i	 5649
+l	 4541
+d	 4079
+o	 3724
+m	 3203
+k	 3058
+g	 2478
+en	 2403
+n_	 2389
+t_	 2073
+de	 1939
+r_	 1910
+v	 1890
+h	 1789
+u	 1782
+_s	 1768
+ä	 1724
+er	 1709
+f	 1597
+en_	 1537
+a_	 1526
+an	 1357
+p	 1320
+et	 1317
+ö	 1278
+å	 1261
+st	 1236
+ar	 1226
+c	 1191
+_d	 1158
+e_	 1116
+in	 1045
+_f	 1027
+te	 1000
+b	 997
+_a	 978
+s_	 974
+ra	 958
+.	 956
+tt	 935
+_i	 898
+_m	 890
+._	 886
+ll	 870
+ta	 844
+_o	 842
+_e	 839
+nd	 820
+ti	 804
+sk	 798
+re	 779
+at	 769
+_de	 754
+om	 743
+m_	 739
+ör	 720
+,	 697
+,_	 695
+ng	 686
+li	 673
+ka	 666
+oc	 662
+_h	 654
+on	 652
+et_	 647
+ch	 645
+ns	 643
+is	 642
+er_	 630
+är	 625
+_v	 614
+_t	 614
+ni	 611
+i_	 609
+_oc	 592
+tt_	 587
+na	 586
+y	 586
+la	 579
+_b	 579
+h_	 577
+kt	 575
+ch_	 568
+ig	 564
+fö	 563
+och	 555
+or	 555
+_och	 554
+och_	 554
+_och_	 553
+me	 548
+den	 548
+om_	 535
+_i_	 531
+d_	 530
+j	 529
+ik	 520
+de_	 520
+för	 518
+ge	 498
+ad	 497
+_k	 491
+_fö	 487
+ri	 484
+el	 482
+il	 481
+so	 480
+al	 474
+g_	 469
+le	 464
+an_	 461
+_för	 447
+si	 437
+ar_	 437
+att	 435
+_p	 434
+es	 420
+ing	 413
+se	 407
+to	 404
+_u	 403
+_en	 403
+and	 398
+den_	 395
+nde	 393
+nn	 393
+_l	 391
+å_	 391
+D	 385
+än	 383
+nt	 382
+l_	 381
+tr	 378
+_D	 372
+va	 370
+am	 369
+sa	 367
+_so	 365
+ga	 364
+_en_	 361
+är_	 358
+ck	 357
+av	 354
+v_	 351
+ed	 347
+ma	 346
+da	 346
+som	 346
+rs	 344
+som_	 344
+ve	 342
+ter	 341
+att_	 341
+ha	 338
+ne	 337
+ut	 335
+as	 332
+ska	 329
+_at	 327
+_att	 326
+_som	 324
+_att_	 324
+_som_	 323
+vi	 322
+ikt	 317
+_av	 316
+det	 316
+_den	 315
+he	 315
+ss	 314
+un	 307
+ke	 304
+_g	 303
+us	 302
+di	 302
+_st	 300
+rn	 297
+_me	 296
+_ä	 295
+ade	 294
+"	 290
+_ha	 290
+av_	 289
+ill	 288
+_n	 286
+_in	 279
+io	 275
+_r	 275
+der	 275
+it	 274
+_av_	 274
+sta	 274
+gen	 272
+isk	 270
+_ti	 269
+id	 265
+na_	 265
+ns_	 264
+ko	 262
+_den_	 261
+ag	 258
+det_	 257
+lig	 257
+era	 256
+ll_	 255
+_det	 252
+_är	 251
+be	 249
+_är_	 248
+ra_	 247
+ion	 244
+-	 241
+pr	 240
+oni	 233
+til	 231
+ten	 228
+_si	 225
+k_	 222
+på	 222
+fr	 221
+ro	 219
+till	 219
+iv	 216
+ls	 216
+ande	 215
+ör_	 214
+_det_	 213
+äl	 212
+_på	 211
+ts	 210
+ens	 209
+med	 209
+mm	 208
+rt	 208
+_till	 208
+_til	 208
+_va	 207
+_fr	 205
+_sk	 205
+var	 205
+nin	 204
+ning	 203
+ol	 201
+ka_	 200
+lle	 198
+ett	 198
+rd	 197
+em	 196
+på_	 195
+x	 195
+rk	 194
+_ut	 194
+ste	 194
+ds	 193
+_vi	 192
+år	 192
+S	 192
+nde_	 191
+are	 191
+ver	 190
+_på_	 190
+nis	 189
+kr	 189
+_med	 188
+all	 188
+ån	 187
+nge	 185
+mo	 184
+os	 183
+ld	 182
+ade_	 181
+_S	 181
+ed_	 180
+rä	 176
+De	 175
+_-	 175
+kan	 174
+ta_	 173
+ng_	 172
+vä	 171
+för_	 170
+ill_	 170
+han	 170
+_De	 170
+pp	 169
+lt	 169
+sam	 168
+nte	 167
+ans	 167
+ton	 166
+ur	 165
+mi	 165
+ess	 165
+kl	 164
+ig_	 164
+ks	 164
+as_	 163
+und	 163
+men	 162
+med_	 161
+_med_	 161
+ak	 161
+Di	 160
+ot	 159
+rna	 159
+ul	 159
+_var	 159
+te_	 158
+gen_	 158
+het	 157
+kto	 157
+str	 156
+_Di	 155
+tad	 155
+lan	 154
+ga_	 154
+iska	 154
+fa	 154
+fi	 154
+så	 154
+Dikt	 153
+Dik	 153
+pe	 153
+ska_	 152
+ja	 152
+H	 151
+res	 151
+ku	 151
+iu	 150
+ande_	 150
+till_	 150
+t.	 150
+ern	 150
+rm	 149
+_Dikt	 149
+_Dik	 149
+ie	 149
+bl	 148
+-_	 147
+od	 147
+_H	 147
+n.	 147
+ist	 147
+_di	 146
+ius	 146
+_"	 145
+la_	 145
+sl	 145
+man	 145
+ren	 145
+_för_	 145
+toni	 144
+kton	 144
+n._	 144
+ktoni	 144
+ikton	 144
+I	 144
+ikto	 144
+nius	 143
+ten_	 143
+onius	 143
+oniu	 143
+toniu	 143
+ing_	 143
+Dikto	 143
+niu	 143
+_ko	 143
+ic	 142
+_sa	 142
+_han	 142
+ett_	 142
+sm	 141
+ba	 141
+M	 141
+gr	 140
+lä	 140
+ex	 138
+t._	 138
+sp	 137
+lla	 137
+_et	 137
+_M	 137
+dr	 137
+rö	 136
+rad	 136
+ek	 136
+_be	 135
+tar	 135
+_-_	 135
+_om	 134
+rl	 134
+E	 134
+mä	 133
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/th-windows_874.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/th-windows_874.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/th-windows_874.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 6290
+Ò	 5252
+Ã	 4377
+¹	 3920
+¡	 3050
+è	 2984
+Í	 2657
+§	 2522
+Ñ	 2454
+Á	 2369
+é	 2304
+à	 2158
+Â	 1981
+Ç	 1908
+Õ	 1693
+Å	 1543
+Ô	 1443
+Ž	 1422
+·	 1398
+µ	 1398
+»	 1301
+Ë	 1245
+Ð	 1239
+€	 1210
+º	 1181
+Ê	 1081
+š	 1045
+ä	 978
+ÒÃ	 951
+Ÿ	 907
+ª	 892
+èÒ	 829
+á	 795
+¡Ò	 735
+ã	 722
+¡ÒÃ	 710
+¢	 691
+ÒÂ	 688
+×	 668
+Í§	 595
+.	 588
+ç	 553
+Ø	 543
+ÃÑ	 532
+Õè	 528
+ÃÐ	 522
+»Ã	 522
+·Õ	 477
+Ù	 452
+·Õè	 451
+èÍ	 443
+¹Ò	 441
+Ó	 422
+Ò§	 419
+éÒ	 414
+ì	 388
+¹_	 378
+ÃÃ	 367
+ÒÁ	 360
+°	 354
+Ñº	 349
+Ò_	 347
+éÍ	 345
+»ÃÐ	 340
+Çè	 337
+ÃÒ	 337
+Áè	 336
+ÇèÒ	 336
+à»	 334
+Ò¹	 333
+Ñé	 332
+¡Ã	 328
+Žé	 325
+Ö	 322
+_à	 320
+ç¹	 314
+À	 313
+ÁÒ	 299
+Ñ§	 297
+Ò¡	 297
+×Í	 296
+äÁ	 295
+Ñ°	 293
+ÃÑ°	 293
+×è	 290
+â	 289
+äÁè	 288
+ž	 285
+ã¹	 280
+Œ	 273
+è§	 268
+¹ÒÂ	 268
+é¹	 266
+ŸÃ	 263
+Ñ¹	 263
+³	 263
+áÅ	 256
+¹¡	 254
+ËÒ	 253
+§¡	 252
+×èÍ	 251
+ÁÕ	 251
+äŽ	 248
+­	 248
+äŽé	 248
+šÐ	 248
+»ç¹	 247
+à»ç¹	 247
+»ç	 247
+à»ç	 247
+Í¡	 245
+ÇÒ	 245
+ãË	 244
+¶	 244
+ªÒ	 243
+µÔ	 241
+_á	 240
+¡Ñ	 238
+È	 237
+_¡	 236
+µè	 234
+«	 227
+éÇ	 225
+é§	 221
+É	 216
+Â¡	 214
+Ã€	 213
+ÕÂ	 211
+Ñé§	 211
+ÃÁ	 211
+¢Í	 210
+Ô¹	 209
+èÇ	 206
+Õé	 202
+ÅÐ	 202
+Ë¹	 201
+¹Ñ	 201
+_¹	 200
+µÃ	 197
+Ëé	 196
+§_	 193
+Á¹	 191
+Ðà	 191
+ÀÒ	 188
+ÍÂ	 188
+ÒÇ	 186
+¢Í§	 184
+¹Õ	 184
+ãËé	 183
+€Ç	 183
+ÃÕ	 181
+§à	 180
+¡Å	 179
+áÅÐ	 178
+èÒ§	 177
+èÒ_	 176
+ÃÃ€	 176
+_Ÿ	 176
+€ÇÒÁ	 174
+¹µ	 174
+ÇÒÁ	 174
+€ÇÒ	 174
+ÑŽ	 172
+ÔŽ	 172
+ÇèÒ_	 171
+ŸÃÃ	 167
+šÒ	 167
+Í¹	 167
+Òµ	 167
+¹Õé	 167
+ŸÃÃ€	 166
+¡ç	 166
+€Ã	 165
+¹à	 165
+è¹	 163
+ºÒ	 162
+¢é	 161
+§ã	 161
+Õ_	 161
+ì_	 154
+ËÅ	 154
+Á×	 154
+éÍ§	 151
+¹¡ÒÃ	 151
+¹¡Ò	 151
+ä»	 150
+Ñ¡	 150
+é_	 148
+ÃÒÂ	 147
+µÑ	 146
+¹·	 146
+ÅÑ	 146
+Â_	 146
+àŸ	 145
+Åé	 140
+à¡	 139
+šÒ¡	 139
+àÁ	 138
+ÃÔ	 138
+ŸÅ	 137
+Ã×	 136
+·Ñ	 135
+¡Ñº	 134
+ÒÂ¡	 133
+_Ã	 132
+ºÃ	 132
+§ä	 132
+Ãà	 131
+à·	 130
+Åè	 129
+ÒµÔ	 129
+_·	 128
+¡Ô	 128
+µÃÕ	 128
+ÃÑº	 128
+Õ¡	 128
+àË	 127
+¹Í	 127
+µé	 126
+_¹Ò	 126
+ªÒµÔ	 126
+ÅÒ	 126
+ªÒµ	 126
+¹Ç	 126
+Òà	 126
+_áÅ	 125
+§¹	 124
+§€	 124
+¡ÒÃà	 124
+ÒÃà	 124
+ÍÁ	 123
+Ò€	 122
+ 	 122
+áµ	 122
+àÊ	 121
+ÇÑ	 121
+Ñé¹	 120
+ÃÃÁ	 120
+Ò·	 119
+¹µÃ	 119
+èÒÇ	 118
+áµè	 118
+§·	 117
+Ç¹	 117
+ÂÑ	 117
+Á¹µÃ	 117
+¹µÃÕ	 117
+Á¹µ	 117
+Á¹µÃÕ	 117
+ÃÍ	 116
+Ùé	 116
+_¹ÒÂ	 116
+àÁ×	 116
+°Á¹	 115
+àÃ	 115
+ÃÑ°Á¹	 115
+ËÁ	 115
+à¢	 115
+Ñ°Á	 115
+Í.	 115
+Ñ°Á¹µ	 115
+ÃÑ°Á	 115
+°Á¹µ	 115
+Ñ°Á¹	 115
+°Á¹µÃ	 115
+°Á	 115
+_áÅÐ	 113
+éà	 113
+Ãè	 113
+èÁ	 112
+ãš	 112
+_Ê	 112
+¹Ñé	 111
+Ô»	 111
+¹Ñé¹	 111
+èà	 111
+èä	 110
+_Í	 110
+Âà	 110
+_š	 110
+Òš	 109
+»ÃÒ	 108
+¹ÒÂ¡	 108
+_Ë	 107
+Ñ­	 107
+éÒ¹	 107
+šÑ	 106
+§¡Ò	 106
+_€	 106
+§¡ÒÃ	 105
+ÇÂ	 105
+Ôµ	 105
+¹é	 105
+ÒÅ	 103
+ŽÂ	 102
+è_	 102
+ÃÐà	 102
+àÍ	 102
+¹¹	 102
+ÍÒ	 101
+âŽ	 100
+µéÍ	 100
+ªè	 100
+_ä	 99
+ÇÅ	 99
+µéÍ§	 99
+âŽÂ	 99
+Ã_	 98
+Ðª	 98
+ŸÑ	 98
+»ÃÐà	 98
+Â¡Ã	 97
+Öè§	 97
+¡_	 97
+Öè	 97
+Òª	 97
+é¹_	 96
+ÅÔ	 96
+Ñ°º	 94
+ÒŸ	 94
+ÃÑ°º	 94
+ŒÙ	 94
+°º	 94
+Âè	 93
+¹ä	 93
+·Ò	 93
+°ºÒ	 92
+ÅèÒ	 92
+Å.	 92
+Ñ°ºÒ	 92
+¡Ñ¹	 92
+Ñ°ºÒÅ	 92
+§Ã	 92
+ÃÑ°ºÒ	 92
+ºÒÅ	 92
+°ºÒÅ	 92
+Ö§	 92
+.Í	 91
+¢éÒ	 91
+Ã¡	 91
+_ŸÅ	 90
+ÍÂè	 90
+ŸÅ.	 90
+Íà	 90
+ÍÂèÒ	 90
+ÂèÒ	 90
+¡ÃÐ	 89
+.Í.	 89
+ÂèÒ§	 89
+Õé_	 89
+ÍÂèÒ§	 89
+ÂÑ§	 89
+ÊØ	 89
+µèÍ	 88
+Íº	 88
+_â	 88
+Å.Í	 87
+èÍ§	 87
+ÃÐª	 87
+Áà	 87
+ÂÇ	 87
+ÅÑ§	 87
+ŸÅ.Í.	 87
+Å.Í.	 87
+¹Õé_	 87
+àŽ	 87
+Á¡	 87
+ŒÙé	 87
+ÇÔ	 87
+ŸÅ.Í	 87
+»ÃÐª	 87
+»Ñ	 87
+'	 86
+ÊÔ	 86
+Êè	 86
+Áèä	 86
+_ŸÅ.	 86
+·Ò§	 86
+ÇÁ	 85
+¡à	 85
+Â§	 85
+._	 85
+¡ÃÑ	 85
+ÍÀ	 85
+ªÇ	 84
+ÒÐ	 84
+¹éÒ	 84
+¡ÃÑ°	 84
+ÀÔ	 84
+·Ó	 84
+ËÒÃ	 84
+_ŸÅ.Í	 84
+ÍÍ	 83
+§Ê	 83
+ÍÀÔ	 83
+äÁèä	 83
+Ñµ	 82
+»ÃÒÂ	 82
+€¹	 82
+Í_	 82
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/tr-iso_8859_9.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/tr-iso_8859_9.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/tr-iso_8859_9.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 23226
+i	 8957
+a	 7675
+e	 6219
+n	 5169
+&	 4950
+;	 4950
+l	 4674
+r	 4464
+&i	 3206
+&i;	 3206
+i;	 3206
+s	 3206
+k	 3009
+d	 2977
+t	 2442
+m	 2010
+y	 2001
+u	 1885
+n_	 1725
+g	 1584
+o	 1567
+b	 1470
+e_	 1426
+ü	 1353
+ar	 1273
+la	 1236
+a_	 1209
+i_	 1169
+in	 1124
+_b	 1101
+an	 1097
+er	 1073
+le	 1058
+s;	 1036
+&s;	 1036
+&s	 1036
+;_	 1018
+de	 936
+;n	 918
+&i;n	 917
+i;n	 917
+,_	 872
+_,	 872
+_,_	 872
+,	 872
+i;_	 863
+&i;_	 863
+_k	 816
+en	 769
+r_	 762
+_y	 759
+da	 759
+il	 759
+k_	 750
+z	 739
+nd	 725
+&g;	 708
+g;	 708
+&g	 708
+ra	 697
+_a	 692
+_d	 692
+_s	 676
+'	 673
+_i	 644
+._	 641
+.	 641
+_.	 637
+_._	 637
+c	 637
+ka	 635
+v	 632
+;&	 624
+h	 615
+_g	 597
+ri	 596
+ç	 596
+lar	 583
+li	 580
+ma	 559
+ya	 555
+ler	 553
+p	 547
+re	 529
+al	 529
+ö	 527
+_t	 520
+ir	 508
+ak	 502
+bi	 500
+;l	 480
+in_	 478
+di	 477
+r&	 468
+el	 453
+et	 449
+ek	 445
+n&	 439
+_o	 439
+ol	 437
+da_	 434
+n&i	 433
+n&i;	 433
+ni	 429
+ti	 428
+de_	 425
+an_	 422
+eri	 421
+r&i	 417
+r&i;	 417
+s&	 413
+s&i	 413
+s&i;	 413
+ar&	 412
+me	 407
+te	 405
+a&	 404
+i&	 390
+ay	 387
+ne	 380
+_bi	 373
+_ka	 368
+ar&i;	 367
+ar&i	 367
+u_	 363
+as	 363
+_e	 362
+ta	 359
+&i;l	 352
+i;l	 352
+nda	 350
+ki	 347
+na	 346
+si	 343
+_v	 337
+;&i;	 334
+;&i	 334
+ve	 334
+ara	 333
+en_	 332
+;i	 331
+on	 328
+un	 326
+l&i;	 322
+l&	 322
+l&i	 322
+leri	 322
+ba	 318
+_m	 318
+ik	 315
+mi	 315
+f	 306
+lar&	 302
+lar&i	 302
+sa	 298
+_h	 297
+ld	 296
+&i;&	 290
+i;&	 290
+_ve	 288
+l_	 287
+ge	 286
+is	 285
+ed	 285
+i&s;	 284
+i&s	 284
+;r	 282
+_ya	 279
+_ol	 279
+d&i;	 278
+d&	 278
+d&i	 278
+nl	 277
+kl	 275
+;k	 274
+&i;n_	 271
+;n_	 271
+i;n_	 271
+ile	 270
+or	 269
+iy	 267
+a&s	 264
+a&s;	 264
+y&i;	 262
+ad	 262
+y&	 262
+y&i	 262
+ye	 259
+ha	 258
+es	 258
+t&	 257
+t&i	 257
+t&i;	 257
+ini	 253
+;nd	 253
+i;nd	 253
+ür	 253
+&i;nd	 253
+se	 248
+_ge	 248
+i;nda	 248
+;nda	 248
+;n&i;	 247
+i;n&	 247
+;n&	 247
+&i;n&	 247
+i;n&i	 247
+;n&i	 247
+bu	 245
+_'	 245
+_ba	 244
+as&i	 242
+as&i;	 242
+_de	 242
+as&	 242
+at	 240
+am	 240
+nda_	 239
+ar_	 231
+ve_	 230
+rin	 230
+_ve_	 228
+_bu	 227
+im	 227
+&i;r	 226
+i;r	 226
+ur	 221
+g;&i	 220
+g;&	 220
+&g;&	 220
+yo	 220
+&g;&i	 220
+g;&i;	 220
+ul	 215
+ak_	 215
+ke	 213
+nu	 213
+erin	 211
+g;i	 208
+&g;i	 208
+lan	 207
+bir	 205
+r&i;n	 205
+nde	 202
+rl	 202
+n&i;_	 201
+ko	 201
+ca	 200
+m_	 197
+rd	 196
+t_	 194
+er_	 194
+st	 193
+em	 193
+_sa	 190
+lm	 189
+rt	 188
+_ü	 187
+i;k	 187
+ün	 187
+ola	 187
+&i;k	 187
+lerin	 185
+ce	 185
+'_	 185
+;m	 183
+az	 183
+rk	 182
+yü	 182
+;la	 181
+_bir	 181
+ir_	 180
+n&i;n	 180
+ru	 180
+lu	 180
+;nda_	 178
+e&	 177
+_ç	 176
+_ha	 175
+_ko	 173
+esi	 171
+_ö	 170
+ap	 170
+ni_	 168
+tü	 167
+den	 164
+ind	 161
+di_	 161
+be	 161
+s&i;n	 160
+nin	 159
+üz	 158
+ri_	 155
+y&i;l	 155
+_p	 154
+nin_	 153
+&s;_	 152
+_y&	 152
+edi	 152
+s;_	 152
+_y&i;	 152
+_y&i	 152
+yl	 151
+le_	 151
+inde	 150
+eti	 150
+ala	 150
+&i;&s	 149
+ele	 149
+i;&s;	 149
+;&s;	 149
+;&s	 149
+i;&s	 149
+ek_	 148
+ere	 148
+çi	 147
+du	 145
+ön	 145
+z_	 144
+na_	 144
+eri_	 143
+ec	 142
+gö	 142
+i;&g;	 141
+s&i;_	 141
+bir_	 141
+&i;&g	 141
+i;&g	 141
+ah	 141
+;&g;	 141
+;&g	 141
+_gö	 140
+lar_	 140
+eli	 140
+a&g;	 140
+a&g	 140
+dan	 140
+ac	 140
+iç	 140
+an&	 140
+u&	 139
+;&g;&	 138
+_yü	 138
+an&i	 138
+an&i;	 138
+pa	 138
+it	 137
+_ola	 137
+_bir_	 136
+;t	 135
+ör	 135
+ne_	 135
+ini_	 134
+lma	 134
+kan	 133
+ab	 132
+to	 131
+ba&	 131
+kar	 130
+r&i;_	 130
+_ar	 129
+ili	 129
+li_	 129
+ki_	 128
+bu_	 127
+anl	 127
+dü	 127
+ler_	 126
+_ba&	 126
+kon	 126
+ll	 125
+tl	 125
+ine	 125
+e&g;	 124
+e&g	 124
+_il	 124
+_bu_	 124
+re_	 124
+bil	 123
+&s;i	 123
+;&i;n	 123
+s;i	 123
+ede	 123
+zd	 123
+''	 122
+_da	 122
+_''	 122
+_tü	 122
+ret	 122
+_-_	 121
+_''_	 121
+mas	 121
+''_	 121
+-	 121
+dan_	 121
+leri_	 121
+;u	 121
+_-	 121
+ev	 121
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/uk-dos_866.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/uk-dos_866.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/uk-dos_866.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 34581
+­	 8891
+®	 8314
+ 	 7019
+i	 6689
+¥	 6556
+à	 6123
+š	 5622
+â	 5320
+«	 3860
+¢	 3851
+ª	 3707
+.	 3576
+._	 3315
+á	 3290
+€	 3087
+¯	 2713
+ã	 2704
+_.	 2412
+¬	 2407
+_._	 2375
+ï	 2084
+§	 2023
+¥­	 1966
+¥à	 1675
+£	 1662
+­®	 1473
+ì	 1438
+ï_	 1357
+áâ	 1346
+å	 1331
+_¯	 1288
+ç	 1230
+ _	 1216
+­ 	 1208
+­š	 1187
+¡	 1119
+©	 1085
+_¢	 1029
+i_	 1025
+_­	 999
+õ	 987
+æ	 965
+è	 950
+_§	 930
+ à	 919
+à®	 914
+«ì	 914
+â®	 911
+­­	 875
+­i	 874
+àš	 860
+­ï	 837
+õ_	 821
+,	 817
+ã_	 814
+à 	 803
+š_	 796
+âš	 791
+_á	 786
+«i	 783
+,_	 762
+­­ï	 744
+	 742
+_	 737
+©_	 735
+ª 	 733
+â¥	 729
+à¥	 729
+®_	 708
+£®	 695
+®à	 690
+­¥	 689
+š©	 684
+ª®	 673
+®£	 671
+¢_	 665
+­ï_	 659
+¬i	 653
+i¢	 648
+ «	 647
+®¢	 642
+­­ï_	 639
+â 	 633
+®ª	 620
+¯à	 617
+å_	 613
+àâ	 610
+¢®	 607
+¥­­	 592
+_ 	 590
+i€	 590
+š©_	 587
+ â	 578
+î	 565
+_­ 	 564
+i­	 562
+®£®	 560
+ ­	 548
+£®_	 548
+®£®_	 547
+šå	 539
+_â	 537
+¯¥	 536
+¥­­ï	 536
+®«	 535
+¢š	 532
+ài	 532
+_ª	 526
+®õ	 526
+®¬	 524
+âà	 522
+ä	 521
+_¬	 511
+®á	 507
+¥€	 506
+¯®	 505
+â¥à	 503
+¬_	 502
+Š	 497
+ç­	 492
+šå_	 484
+®õ_	 481
+š­	 479
+I	 475
+i«	 473
+¢¥	 470
+¥­­ï_	 466
+šá	 464
+_€	 462
+ì­	 459
+«ì­	 459
+¯¥à	 454
+_¯à	 453
+®§	 450
+«¥	 444
+á¥	 443
+­š©	 426
+ «ì	 420
+§_	 419
+¢i	 415
+šª	 415
+æi	 415
+¯ 	 413
+âi	 412
+¢ 	 411
+ªš	 411
+€š	 405
+«ï	 398
+à€	 397
+­ _	 392
+šâ	 388
+®­	 380
+._	 380
+.	 380
+€i	 378
+i¢_	 378
+_._	 377
+ €	 377
+_.	 377
+á¥à	 374
+ «ì­	 372
+­šå	 372
+­š©_	 372
+­šå_	 372
+ ¢	 365
+ì_	 364
+áâ®	 361
+®áâ	 354
+-	 352
+iõ	 352
+_«	 350
+_è	 350
+§ 	 347
+¥_	 345
+áš	 343
+ ª	 343
+€®	 341
+_£	 336
+à­	 335
+ªã	 334
+i®	 332
+­â	 331
+­i_	 330
+ á	 330
+_à	 327
+âì	 325
+®â	 324
+iç	 324
+«®	 323
+àâ¥	 322
+®ç	 321
+_§_	 318
+­_	 317
+ªâ	 317
+¥¢	 313
+¡i	 310
+­®£	 307
+€¥	 306
+iç­	 304
+i«ì	 302
+î_	 301
+ó	 300
+_á¥	 298
+šáâ	 298
+­®£®	 297
+iõ_	 297
+­®£®_	 296
+è¥	 294
+_¯¥	 293
+_å	 293
+« 	 292
+€­	 290
+«ã	 290
+¥ài	 289
+­®õ	 284
+¥­š	 283
+¥£	 282
+ã­	 282
+¥à¥	 277
+­®õ_	 276
+_­¥	 275
+_I	 269
+­ã	 268
+_¯¥à	 265
+¡i«	 263
+®ª 	 263
+£¥	 263
+?	 261
+_¢_	 261
+iï	 261
+?_	 261
+ª à	 259
+_i	 257
+â¥ài	 257
+àæ	 257
+ à€	 255
+¥àæ	 253
+ã«	 253
+çª	 251
+¡i«ì	 250
+ª«	 249
+ª à€	 249
+_¯®	 246
+ìè	 245
+«ìè	 245
+i«ìè	 245
+ªi	 245
+àâ¥à	 245
+àâ¥ài	 244
+	 244
+®¯	 243
+¡i«ìè	 243
+¢i€	 242
+¢­	 242
+ à 	 242
+_á¥à	 240
+ àâ	 240
+_	 239
+ì­®	 239
+«ì­®	 239
+_ à	 239
+iá	 238
+_®	 238
+á¥àæ	 237
+_á¥àæ	 236
+ àâ¥	 236
+i©	 236
+ àâ¥à	 236
+£¥­	 236
+iï_	 236
+i 	 235
+i¯	 235
+£i	 235
+ªá	 235
+§­	 233
+®«i	 232
+ã­®	 231
+ «ì­®	 229
+_ àâ	 229
+¯àš	 229
+_ àâ¥	 228
+®çª	 228
+€¥­	 227
+è«	 227
+®€	 226
+¥€¥	 225
+­®ç	 225
+_¬i	 224
+è¥­	 224
+â®«	 223
+«ã­®ç	 223
+ã­®ç	 223
+«ã­	 223
+¢¥€	 223
+«ã­®	 223
+ã­®çª	 222
+¢¥€¥­	 222
+¢¥€¥	 222
+­®çª	 222
+¥€¥­	 222
+§¬	 222
+_¢š	 220
+¥ª	 218
+è«ã­	 217
+è«ã­®	 217
+è«ã	 217
+	 216
+áâ®«	 214
+¬¥	 213
+	 212
+áª	 208
+¥¯	 207
+ç­š	 207
+â _	 207
+_	 206
+šáâ®	 205
+æï	 204
+_§ 	 204
+âì_	 204
+¥­¥	 203
+_­ ¢	 202
+­ ¢	 202
+è¥­­	 201
+ áâ	 200
+àš_	 199
+¯¥à¥	 198
+¥­šå_	 198
+¥­šå	 198
+«ï_	 195
+ ¢¥	 195
+è¥­­ï	 195
+¥£¥	 195
+_«¥	 194
+¥£¥­	 194
+æ¥	 194
+	 194
+å 	 193
+iáâ	 193
+«¥£	 193
+_«¥£	 192
+âã	 192
+®î	 192
+¥­â	 190
+«¥£¥	 190
+â¥­	 190
+_«¥£¥	 190
+š¢	 190
+_¢i	 189
+«¥£¥­	 189
+II	 188
+¯i	 187
+ ¬	 186
+äi	 186
+€á	 185
+­¥¢	 185
+áâ 	 184
+	 184
+¬ã	 183
+_	 183
+_ª	 183
+ª	 183
+_¢i€	 183
+_â 	 182
+ ¢¥€	 181
+­ ¢¥	 181
+_­ ¢¥	 181
+¢®£	 181
+¥­®	 181
+­ ¢¥€	 181
+ ¢¥€¥	 180
+	 179
+-_	 179
+_¯àš	 179
+¢®£®	 178
+€_	 178
+ âš	 178
+šç	 178
+_è«ã	 178
+_è«ã­	 178
+áâi	 178
+_è«	 178
+_	 177
+	 176
+®î_	 176
+_-	 175
+I_	 175
+¢®£®_	 175
+iç­š	 174
+â­	 174
+«iç	 174
+à¥­	 172
+§ã	 172
+ìá	 171
+ ªâ	 171
+€¥­š	 170
+¥€¥­š	 170
+ ¯	 170
+_¯¥à¥	 170
+á¥àæï	 169
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/uk-koi8_u.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/uk-koi8_u.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/uk-koi8_u.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 21726
+Ï	 4832
+Á	 4080
+É	 3253
+Š	 2775
+Î	 2747
+×	 2642
+Ô	 2481
+Å	 2373
+Ò	 2066
+Ë	 1929
+Ä	 1806
+Ó	 1797
+Ì	 1760
+Õ	 1605
+Ð	 1347
+Í	 1345
+Ñ	 1061
+Ú	 1060
+Á_	 971
+Ï_	 965
+É_	 916
+_×	 902
+Â	 881
+_Ð	 869
+Å_	 847
+Ø	 843
+Š_	 810
+Ç	 760
+_Î	 696
+.	 676
+Þ	 654
+Ê	 647
+_Ó	 623
+"	 621
+_Ú	 606
+ÎÁ	 582
+_Ä	 565
+Ö	 543
+_Ô	 514
+ËÁ	 480
+._	 476
+ÔÉ	 464
+Ï×	 459
+×Š	 457
+Õ_	 457
+×_	 451
+À	 450
+Ñ_	 449
+_Ë	 443
+È	 438
+ÒÏ	 431
+Û	 428
+_Í	 419
+ÎÅ	 418
+ÐÏ	 414
+ÓÔ	 413
+€	 410
+ÔÏ	 400
+ÇÏ	 396
+Ø_	 394
+ÔØ	 377
+ÌÉ	 375
+ËÏ	 373
+ÒÁ	 358
+ÎÏ	 356
+Ê_	 354
+á	 354
+_Â	 350
+ÔÁ	 346
+,	 343
+ÏÄ	 341
+ÉÔ	 340
+ÏÌ	 336
+ÏÇ	 333
+×Á	 331
+Ã	 328
+Á×	 326
+,_	 323
+ÒÉ	 322
+ÄÏ	 321
+ÌÏ	 319
+ŠÄ	 318
+ÎÉ	 317
+÷	 314
+_ÐÏ	 314
+î	 312
+×É	 310
+ÏÒ	 310
+ÅÒ	 305
+ï	 295
+ÏÍ	 295
+ÎŠ	 294
+_ÎÁ	 289
+_ÎÅ	 288
+×Ï	 288
+Ý	 287
+ÅÎ	 282
+ÁÌ	 282
+ÎÁ_	 280
+ÚÁ	 274
+ô	 273
+ËÉ	 268
+_Š	 268
+§	 267
+ÐÒ	 266
+"_	 264
+ÏÇÏ	 254
+ÓÑ	 252
+ÁÔ	 252
+_"	 251
+ÔØ_	 251
+ÎÅ_	 249
+Í_	 248
+ð	 246
+ÔÉ_	 245
+I	 245
+ÉÊ	 244
+_Ò	 241
+€_	 239
+_ÄÏ	 239
+ÄÁ	 235
+ÏÂ	 235
+é	 233
+_Ñ	 232
+_Š_	 228
+ÖÅ	 228
+ÁÎ	 228
+Ë_	 226
+ÉÎ	 224
+_ÐÒ	 221
+ÍÏ	 219
+_ÚÁ	 218
+ŠÎ	 216
+Á€	 215
+ÍÁ	 214
+ÌÁ	 213
+_×Š	 210
+ÄÉ	 209
+_Ç	 207
+À_	 206
+ÒÅ	 206
+ÇÏ_	 204
+É×	 203
+_Ý	 203
+Ú_	 202
+ÝÏ	 201
+ÌŠ	 200
+ò	 199
+ÏÇÏ_	 199
+ó	 197
+ÓÑ_	 196
+ÉÓ	 193
+ÏÎ	 193
+_ÎÅ_	 190
+_ð	 190
+ŠÌ	 188
+ÏÓ	 187
+_Ï	 186
+ÔÅ	 186
+ÞÉ	 185
+ÁÒ	 184
+ÉÊ_	 184
+_÷	 176
+_×_	 174
+_Þ	 174
+ÑË	 173
+ÌØ	 173
+ë	 173
+ÁÓ	 170
+_ÝÏ	 169
+ÍÕ	 168
+ÂÕ	 167
+ñ	 166
+ÉÌ	 166
+ÉË	 163
+å	 163
+ÒŠ	 163
+ä	 163
+ú	 162
+ÝÏ_	 161
+ÔÒ	 160
+ÎŠ_	 160
+Š×	 160
+ÖÅ_	 159
+×ŠÄ	 159
+_Ì	 158
+ÔŠ	 155
+_×É	 155
+*	 154
+ÄÎ	 153
+ÁÍ	 153
+_*	 152
+Á€_	 152
+ÌÉ_	 152
+ØË	 152
+_ËÏ	 151
+È_	 151
+ËÕ	 151
+*_	 151
+ÄÅ	 151
+_*_	 150
+í	 149
+_Ú_	 149
+_ÑË	 148
+_Á	 147
+ÄŠ	 147
+ÄÕ	 146
+ÁÖ	 145
+_ÎÁ_	 144
+ÁÔÉ	 144
+ËÁ_	 143
+ÐÉ	 142
+_ÓÔ	 141
+ÓØ	 141
+ÌÑ	 140
+Î_	 139
+ÌÅ	 138
+ÐŠ	 137
+ÏÌÏ	 137
+ÒÕ	 136
+ÁÄ	 136
+_ÝÏ_	 136
+ÍÉ	 135
+ÃŠ	 135
+_î	 134
+_ÍÏ	 133
+ÁË	 133
+ËÉ_	 133
+ÏÀ	 132
+ÎÕ	 131
+ÉÍ	 130
+ŠÔ	 129
+_ËÁ	 129
+ÂÁ	 129
+_ÔÏ	 129
+§_	 128
+ÍÅ	 128
+ÐÅ	 128
+ÍŠ	 128
+_ÂÕ	 127
+×Ó	 126
+á_	 126
+Ï×Š	 123
+ÏË	 123
+×Å	 122
+ËŠ	 121
+:	 119
+_Ã	 118
+Õ×	 118
+ÂÉ	 116
+ÓŠ	 116
+ÇÁ	 115
+Ï§	 115
+ÐÁ	 115
+ÎÏ_	 115
+ÏÍÕ	 114
+ÍÕ_	 113
+_Ö	 113
+ÏÒÏ	 113
+ÏÔ	 113
+ÉÔØ	 112
+ÏÚ	 112
+?	 111
+ÔÕ	 110
+ÓÔÏ	 109
+_ú	 109
+ÏÞ	 109
+ÉÈ	 109
+ÕÔ	 109
+ÏÀ_	 108
+ŠË	 108
+_È	 106
+â	 106
+ÄÏ_	 106
+ŠÊ	 106
+_×ŠÄ	 106
+Ó×	 106
+ÚÎ	 105
+ÂŠ	 105
+ÐÒÉ	 105
+ÓÔÁ	 104
+ÁÚ	 104
+ËÒ	 104
+ËÁÖ	 104
+ÎÑ	 103
+ÕÄ	 103
+_ô	 102
+_ÇÏ	 102
+Ä_	 102
+ÔÏ_	 102
+ÉÔÉ	 102
+_ó	 101
+_ÔÁ	 101
+ÌÏ×	 101
+ì	 100
+_ÒÏ	 100
+ÞÁ	 99
+ÏÍÕ_	 99
+ÐÅÒ	 99
+_ÄÏ_	 98
+ÏÄÉ	 98
+ŠÓ	 98
+ÁÖÅ	 97
+ÌÁ_	 97
+ÁÊ	 96
+ÓÏ	 94
+ÁÔÉ_	 94
+_Õ	 94
+ÌÀ	 93
+!	 93
+_Ó×	 93
+..	 93
+ÅÒÅ	 92
+ÓË	 92
+ŠÌØ	 92
+ÓÉ	 92
+_ÐÒÉ	 91
+ÅÌ	 91
+ÐÒÏ	 91
+_ËÁÖ	 91
+ÈÏ	 91
+ÏÖ	 89
+þ	 89
+Ô_	 88
+ÉÔØ_	 88
+ÅÓ	 88
+ÞÏ	 86
+ÂÏ	 86
+ÓÌ	 86
+ËÁÖÅ	 86
+ÑÔ	 85
+ñ_	 85
+ÓÐ	 84
+ÔÏÒ	 84
+ÏÌÉ	 84
+_ËÁÖÅ	 83
+_ÐŠ	 83
+_ÍÁ	 82
+ÕÌ	 82
+ÕË	 82
+ç	 81
+õ	 81
+_ë	 81
+Á×_	 81
+ÎÎ	 81
+ÞÅ	 81
+ÍÅÎ	 81
+ÍÉ_	 80
+_Ê	 79
+_í	 79
+ØÓ	 78
+ÎË	 78
+ÁÀ	 78
+ÂÅ	 78
+ÃÅ	 78
+_ÐÒÏ	 77
+ŠÎ_	 77
+ÏÍ_	 77
+ÕÓ	 77
+ÅÍ	 77
+_ñ	 77
+_ä	 77
+_×Ï	 76
+_ÍÅ	 76
+ÉÈ_	 76
+ÅÔ	 76
+ØÏ	 75
+ÉÞ	 75
+ØËÉ	 75
+ÕÒ	 74
+ØÓÑ	 74
+ÔØÓ	 74
+ÔØÓÑ	 74
+Ï§_	 73
+_ÓÔÏ	 73
+ËÏÌ	 72
+".	 72
+."	 72
+ÏÌÏ×	 72
+ÊÏ	 72
+Ä×	 71
+Š×_	 71
+ÏÐ	 71
+Æ	 71
+_ÐÅ	 71
+Õ×Á	 71
+ÎÉÊ	 71
+ÓØ_	 70
+_â	 70
+ÌØË	 70
+_ÏÄ	 69
+ÅÎŠ	 69
+ÁÞ	 68
+ÁÌÉ	 68
+ŠÌØË	 68
+ÈÁ	 68
+ÑË_	 68
+ÔØÓÑ_	 68
+ÔÁË	 68
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/uk-windows_1251.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/uk-windows_1251.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/uk-windows_1251.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 10942
+î	 3036
+í	 2943
+à	 2525
+³	 2231
+è	 2038
+å	 1973
+ò	 1971
+ð	 1768
+â	 1490
+ñ	 1279
+ê	 1230
+ì	 1026
+ä	 1026
+ë	 1018
+ó	 965
+ï	 859
+ç	 775
+ÿ	 758
+ã	 542
+ñò	 526
+ü	 526
+åí	 480
+ÿ_	 464
+,	 464
+,_	 464
+íî	 457
+ö	 456
+á	 448
+_ï	 445
+÷	 439
+åð	 426
+íà	 404
+_ñ	 391
+.	 389
+î_	 385
+è_	 382
+à_	 366
+._	 366
+õ	 365
+_í	 360
+íí	 358
+òà	 354
+_â	 351
+íè	 339
+òè	 330
+àò	 324
+ó_	 316
+¿	 303
+ðî	 300
+³_	 300
+æ	 299
+íÿ	 299
+_ç	 297
+ø	 297
+ðè	 296
+í³	 295
+ííÿ	 280
+âî	 280
+êà	 279
+_ä	 277
+âà	 277
+îñ	 271
+àí	 266
+ïð	 265
+_ì	 264
+îâ	 263
+ì³	 262
+-	 261
+þ	 257
+îð	 253
+ðå	 250
+íå	 248
+òî	 247
+äî	 244
+é	 244
+íÿ_	 236
+_ò	 232
+âè	 231
+òü	 231
+ííÿ_	 230
+_ê	 229
+åíí	 226
+êî	 226
+¿_	 226
+ðà	 214
+îã	 213
+º	 210
+ëü	 204
+îê	 204
+åííÿ	 202
+ë³	 201
+àð	 198
+_ïð	 196
+ãî	 194
+ïî	 192
+îñò	 191
+³â	 190
+ü_	 190
+_-	 188
+-_	 188
+îì	 186
+ô	 186
+ö³	 184
+ò³	 181
+õ_	 181
+_-_	 180
+â_	 178
+³í	 176
+åííÿ_	 173
+öå	 171
+³ä	 167
+å_	 166
+ñå	 165
+îãî	 160
+èõ	 160
+ä³	 158
+_ð	 157
+îë	 157
+_íà	 156
+àë	 156
+é_	 155
+÷í	 154
+èâ	 151
+òü_	 150
+ïå	 150
+ãî_	 149
+³î	 149
+ñåð	 148
+àê	 147
+îãî_	 147
+çà	 147
+ì_	 146
+_íå	 146
+èõ_	 145
+ïðè	 141
+åðö	 141
+èì	 141
+ðö	 141
+èí	 140
+òð	 140
+_ñå	 140
+î¿	 139
+ð³	 138
+àñ	 138
+ñåðö	 137
+èò	 137
+ù	 136
+îç	 136
+íà_	 134
+_ñåð	 133
+³ë	 132
+³ñ	 131
+â³	 131
+èé	 129
+ñò³	 129
+_ñåðö	 128
+îá	 128
+_à	 128
+âí	 126
+î¿_	 126
+³¿	 125
+âàí	 125
+æå	 125
+_òà	 123
+Ñ	 123
+åâ	 123
+ìå	 121
+äè	 121
+_ïî	 120
+èê	 119
+_äî	 118
+êè	 118
+åä	 117
+(	 117
+øå	 117
+èé_	 116
+ñòà	 115
+_³	 115
+òí	 113
+êò	 111
+_(	 111
+_î	 110
+çí	 110
+á³	 110
+èñ	 110
+_ã	 109
+ðä	 109
+ã³	 108
+îí	 108
+ñè	 108
+ëè	 108
+òå	 107
+_ïðè	 107
+ïåð	 104
+)	 104
+îêà	 103
+ìó	 103
+³ç	 102
+êàð	 102
+³ñò	 101
+í³_	 101
+öåâ	 101
+_á	 100
+ëî	 100
+ëà	 100
+³ëü	 100
+_çà	 99
+àíí	 98
+ìà	 98
+àðä	 98
+þ_	 98
+òè_	 98
+ìî	 97
+îä	 96
+íò	 96
+óâ	 96
+êàðä	 96
+³ÿ	 95
+_ì³	 95
+åðöå	 94
+ðöå	 94
+àö	 94
+³â_	 94
+óâà	 94
+º_	 91
+íèõ	 91
+Ï	 91
+À	 91
+æåí	 91
+àòí	 91
+àö³	 90
+ñåðöå	 90
+êó	 90
+_âè	 89
+äí	 88
+I	 88
+àì	 88
+äîñ	 88
+òàò	 87
+íèõ_	 87
+è÷	 87
+ðöåâ	 86
+åðöåâ	 86
+³¿_	 86
+ì³î	 85
+îñò³	 85
+óí	 84
+òîð	 84
+àä	 83
+åï	 83
+ç_	 82
+ëÿ	 82
+îò	 82
+ñÿ	 82
+á³ë	 81
+ùî	 81
+î÷	 81
+àñò	 80
+_ù	 80
+ê³	 80
+àëü	 80
+íó	 79
+Ê	 79
+üí	 78
+áó	 78
+ëüí	 78
+äîñò	 78
+í³ñ	 77
+_ñò	 77
+í³ñò	 77
+îñòà	 77
+ìè	 77
+ïà	 77
+³÷	 76
+àííÿ	 76
+Ò	 76
+ëå	 76
+çì	 76
+åäî	 76
+çè	 75
+³ëüø	 75
+íê	 75
+òàòí	 75
+ñòàòí	 75
+àòè	 75
+øåí	 75
+äîñòà	 75
+³ñòü	 75
+üø	 75
+ùî_	 75
+îñòàò	 75
+ñòàò	 75
+ñòü	 75
+÷è	 75
+ëüø	 75
+_íåäî	 74
+íåä	 74
+á³ëü	 74
+íåäî	 74
+_íåä	 74
+á³ëüø	 74
+òèâ	 74
+_â_	 74
+êð	 73
+åäîñ	 73
+åäîñò	 73
+òà_	 72
+àá	 72
+íîñ	 72
+ñòî	 72
+³ÿ_	 72
+íåäîñ	 72
+íèé	 72
+_ùî	 72
+_ô	 71
+_ë	 71
+ìó_	 71
+³÷í	 71
+â³ä	 70
+ðè_	 70
+íèé_	 70
+åâî	 70
+æåíí	 70
+ä_	 69
+÷à	 69
+øåíí	 69
+_ó	 69
+_ì³î	 69
+àº	 68
+íî¿	 68
+îæ	 68
+íîã	 68
+åì	 68
+÷íî	 68
+_ùî_	 68
+óò	 68
+íîãî	 67
+îêàðä	 67
+ê_	 67
+åç	 67
+ï³	 67
+è÷í	 67
+îêàð	 67
+_êà	 66
+ñòü_	 66
+âàíí	 66
+þò	 66
+ì³îê	 66
+²	 66
+³ñòü_	 66
+öåâî	 66
+³îêà	 66
+_òà_	 66
+³îê	 66
+åðå	 66
+ì³îêà	 66
+ëó	 66
+_ì³îê	 66
+üñ	 65
+íîñò	 65
+³îêàð	 65
+èë	 65
+_._	 65
+þòü	 65
+_.	 65
+øåííÿ	 64
+³ê	 64
+üñÿ	 64
+àç	 64
+àâ	 64
+íîãî_	 64
+ò³_	 64
+_ïå	 64
+òüñÿ	 64
+àëüí	 64
+òüñ	 64
+æåííÿ	 63
+ö³¿	 63
+èç	 63
+äó	 63
+ñÿ_	 63
+êòè	 63
+åê	 62
+_ä³	 62
+îìó	 62
+çíà	 61
+íî¿_	 61
+íîñò³	 61
+³é	 61
+ô³	 60
+:	 60
+:_	 60
+_Ñ	 60
+ñó	 60
+îñò³_	 60
+_êî	 60
+í³ñòü	 60
+íø	 60
+)_	 60
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/vi-windows_1258.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/vi-windows_1258.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/vi-windows_1258.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 88044
+n	 17000
+h	 12823
+t	 9071
+i	 8490
+c	 8394
+g	 8035
+ng	 6718
+_t	 6352
+_c	 5234
+a	 5083
+g_	 4883
+ng_	 4882
+_n	 4379
+n_	 4365
+i_	 4365
+u	 4149
+m	 3648
+à	 3635
+nh	 3480
+o	 3451
+Ç	 3193
+_Ç	 3168
+r	 3011
+l	 2692
+Ü	 2659
+,	 2328
+,_	 2295
+c_	 2279
+_l	 2263
+ch	 2226
+v	 2161
+th	 2158
+a_	 2132
+_th	 2113
+y	 2111
+.	 2107
+t_	 2106
+h_	 2074
+_v	 2057
+_h	 1888
+_m	 1834
+_ch	 1813
+s	 1749
+nh_	 1715
+u_	 1679
+á	 1668
+à_	 1649
+tr	 1611
+b	 1589
+_tr	 1581
+_nh	 1541
+_b	 1530
+m_	 1505
+p	 1483
+._	 1455
+k	 1429
+_s	 1415
+o_	 1380
+y_	 1371
+_k	 1367
+_ng	 1348
+©	 1343
+e	 1296
+ó	 1208
+	 1199
+ô	 1181
+¶	 1139
+å	 1132
+T	 1126
+hi	 1121
+â	 1081
+ì	 1058
+ê	 1055
+d	 1040
+_g	 1039
+kh	 1034
+_kh	 1027
+_T	 994
+©i	 967
+là	 943
+_là	 941
+"	 926
+ä	 916
+Ü©	 901
+an	 893
+_d	 888
+Ó	 877
+©i_	 859
+on	 853
+Ã	 848
+N	 846
+	 820
+ó_	 813
+	 801
+ôn	 795
+ph	 776
+_p	 772
+_ph	 752
+û	 752
+§	 734
+hÜ	 728
+ho	 715
+và	 709
+_và	 703
+gÜ	 702
+®	 700
+_r	 696
+H	 693
+_là_	 691
+là_	 691
+Ü©i	 684
+àn	 679
+ên	 677
+ông	 676
+ha	 672
+gi	 663
+C	 656
+_gi	 655
+Ö	 654
+gÜ©i	 646
+gÜ©	 646
+Ü©i_	 624
+ông_	 610
+ngÜ	 610
+_ngÜ	 608
+ác	 606
+ú	 601
+ngÜ©	 600
+ngÜ©i	 600
+_ngÜ©	 598
+gÜ©i_	 594
+ûa	 587
+cû	 586
+_cû	 585
+¶t	 585
+cûa	 585
+ên_	 585
+_cûa	 584
+có	 583
+ûa_	 582
+_có	 581
+cûa_	 581
+ã	 581
+_cûa_	 580
+¶t_	 578
+_N	 574
+có_	 574
+»	 573
+_có_	 572
+i	 568
+À	 562
+	 562
+m¶	 557
+_C	 553
+_m¶	 551
+p_	 540
+Æ	 540
+m¶t	 538
+m¶t_	 534
+_m¶t	 532
+ìn	 528
+_m¶t_	 528
+ti	 526
+i	 525
+Ù	 517
+Î	 512
+ình	 500
+..	 500
+	 497
+và_	 497
+_và_	 496
+æ	 491
+q	 490
+qu	 490
+_H	 487
+_q	 484
+_qu	 484
+ong	 481
+ong_	 471
+há	 471
+x	 470
+hô	 468
+¿	 466
+_"	 460
+Ü®	 456
+ro	 453
+ình_	 445
+ì_	 434
+_x	 434
+ã_	 427
+í	 423
+_ti	 423
+in	 422
+ân	 421
+"_	 418
+i	 415
+Ön	 413
+ron	 412
+V	 411
+rong	 410
+§i	 410
+rong_	 409
+ác_	 405
+ª	 400
+n	 399
+hôn	 398
+åi	 395
+ay	 390
+_V	 387
+h»	 382
+hà	 380
+ày	 377
+Ãt	 376
+uy	 374
+ÇÜ	 374
+_ÇÜ	 373
+§i_	 372
+cá	 371
+_cá	 367
+nà	 366
+_	 366
+hú	 366
+_nà	 365
+ra	 363
+hông	 362
+ho_	 359
+ân_	 356
+án	 356
+°	 355
+åi_	 354
+ai	 352
+hu	 352
+cho	 352
+Ü®c	 351
+®c	 351
+Ón	 351
+_cho	 349
+tro	 347
+t	 347
+ào	 347
+_tro	 346
+_tron	 346
+ñ	 346
+tron	 346
+trong	 346
+M	 345
+khô	 340
+âu	 338
+_khô	 338
+cho_	 337
+_cho_	 336
+hông_	 336
+ay_	 333
+ch_	 332
+Çã	 331
+Ãt_	 331
+(	 331
+_(	 330
+Ò	 329
+_Çã	 329
+ÇÜ®	 328
+_ÇÜ®c	 328
+)	 328
+ÇÜ®c	 328
+_ÇÜ®	 328
+khôn	 324
+_ñ	 324
+_khôn	 322
+Çã_	 322
+_Çã_	 320
+ò	 318
+ån	 318
+không	 316
+ào_	 316
+Ü®c_	 316
+®c_	 316
+nhÜ	 315
+Ü_	 315
+»ng	 313
+»ng_	 313
+»n	 313
+_nhÜ	 313
+Th	 312
+hì	 311
+Û	 310
+h»n	 310
+h»ng_	 310
+h»ng	 310
+iê	 309
+gh	 309
+u	 307
+ta	 307
+anh	 307
+¡	 307
+ai_	 306
+àng	 306
+ày_	 304
+ÇÜ®c_	 298
+ÜÖ	 295
+S	 295
+:	 294
+t_	 294
+e_	 294
+:_	 290
+Î_	 289
+ua	 288
+æn	 288
+ài	 286
+u_	 285
+_nh»	 285
+nh»	 285
+nh»ng	 285
+nh»n	 285
+_nh»n	 285
+_Th	 285
+n_	 284
+n	 283
+Ø	 281
+_M	 281
+A	 281
+úc	 278
+L	 277
+ø	 277
+ÜÖn	 276
+_ha	 276
+n,	 275
+Öng	 275
+ÜÖng	 275
+an_	 272
+ài_	 271
+iu	 269
+sÓ	 269
+n,_	 268
+¿_	 268
+on_	 267
+_sÓ	 267
+các	 265
+àng_	 265
+_các	 264
+anh_	 264
+ngh	 264
+_ta	 263
+hi_	 262
+hàn	 261
+_	 261
+âu_	 261
+Àn	 260
+ù	 260
+_ngh	 257
+ia	 255
+¢	 252
+...	 252
+êu	 251
+Ùc	 251
+i,	 249
+iu_	 248
+nhi	 247
+B	 246
+i,_	 245
+Óng	 244
+ª_	 244
+co	 244
+_nhi	 244
+¥	 244
+Ü§	 244
+iên	 243
+D	 243
+Tr	 241
+_S	 240
+hÜ_	 239
+òn	 237
+hÃ	 236
+hÆ	 233
+K	 233
+Öng_	 232
+ôi	 232
+ÜÖng_	 232
+Àn_	 231
+_co	 231
+n_	 229
+hå	 229
+äi	 229
+yê	 229
+Ûn	 229
+¢n	 228
+Ûng	 228
+_L	 227
+Ûng_	 226
+inh	 226
+Çi	 225
+mà	 225
+_Çi	 225
+ng,	 224
+ang	 224
+P	 224
+n	 224
+g,	 224
+g,_	 223
+_v§	 223
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/zh-big5.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/zh-big5.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/zh-big5.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 30653
+€	 2524
+_€	 2123
+¡	 1457
+¥	 1406
+_¥	 1245
+Š	 1244
+_¡	 1196
+_Š	 1100
+ª	 833
+M	 783
+M_	 764
+_ª	 727
+¡M_	 688
+¡M	 688
+_¡M_	 684
+_¡M	 684
+³	 680
+­	 675
+š	 659
+°	 629
+º	 593
+¬	 566
+_š	 560
+«	 533
+_­	 516
+®	 497
+_¬	 495
+_°	 485
+ž	 483
+§	 473
+©	 459
+·	 458
+µ	 448
+_«	 442
+¹	 436
+_®	 425
+±	 422
+_©	 422
+_³	 404
+²	 401
+»	 393
+º_	 385
+_·	 382
+_§	 374
+_ž	 373
+Ž	 350
+C	 333
+Ÿ	 324
+ªº	 318
+œ	 315
+_¹	 314
+_±	 312
+¶	 310
+ªº_	 303
+C_	 303
+_ªº	 303
+_ªº_	 302
+_²	 302
+@	 288
+_¶	 279
+@_	 275
+Ä	 275
+À	 272
+_Ž	 269
+_µ	 269
+|	 268
+Q	 265
+q	 260
+~	 260
+|_	 255
+~_	 250
+Á	 241
+A	 235
+Œ	 234
+_Ÿ	 233
+Ó	 233
+¡C_	 226
+¡C	 226
+Ó_	 225
+£	 224
+_¡C	 224
+_¡C_	 224
+³_	 222
+A_	 218
+Q_	 217
+O	 210
+q_	 210
+D	 209
+_Ä	 206
+ø	 202
+H	 200
+€@	 198
+Ã	 197
+¯	 196
+O_	 196
+_»	 195
+£_	 192
+H_	 191
+€@_	 190
+_€@	 189
+_€@_	 189
+ø_	 180
+ê	 177
+P	 176
+D_	 175
+¿	 173
+Î	 172
+ê_	 172
+Î_	 170
+_º	 168
+É	 165
+u	 164
+_Á	 162
+_Œ	 162
+_·|	 161
+·|	 161
+_·|_	 161
+Ü	 161
+L	 161
+·|_	 161
+û	 157
+p	 156
+o	 156
+Ç	 155
+_¯	 155
+µ_	 153
+Ü_	 151
+¡A	 151
+Ç_	 151
+W	 151
+€Q	 151
+L_	 150
+û_	 150
+Æ	 149
+u_	 149
+ó	 147
+Å	 147
+¡A_	 146
+_À	 145
+p_	 145
+ó_	 143
+_œ	 142
+_¡A_	 142
+_¡A	 142
+{	 141
+ä	 140
+Â	 140
+œ_	 140
+P_	 139
+É_	 137
+W_	 136
+{_	 136
+ä_	 135
+T	 134
+Ñ	 134
+j	 134
+×	 132
+_Ã	 131
+Ñ_	 131
+d	 130
+G	 130
+X	 130
+o_	 129
+j_	 127
+F	 126
+×_	 126
+F_	 125
+é	 124
+b	 123
+v	 122
+÷	 122
+_Â	 122
+Æ_	 121
+»_	 120
+Ð	 120
+d_	 120
+€_	 119
+b_	 118
+T_	 118
+æ	 117
+X_	 116
+n	 116
+_¿	 116
+e	 115
+Ò	 115
+÷_	 115
+v_	 114
+w	 114
+a	 114
+€H	 114
+æ_	 114
+i	 114
+­_	 113
+Ò_	 113
+ï	 112
+â	 111
+€H_	 111
+_€H_	 110
+_€H	 110
+è	 109
+°ê	 109
+À_	 107
+w_	 107
+_°ê	 107
+°ê_	 106
+_°ê_	 106
+è_	 106
+Š³	 105
+ï_	 105
+Õ	 105
+€Q_	 105
+a_	 104
+]	 104
+_Šb_	 103
+_Šb	 103
+h	 103
+_€Q	 103
+Šb	 103
+Šb_	 103
+_€Q_	 103
+¡_	 102
+Ê	 102
+­û_	 101
+­û	 101
+k	 100
+_­û_	 100
+e_	 100
+_­û	 100
+k_	 100
+_Š³	 100
+Š³_	 100
+_Š³_	 100
+B	 99
+ü	 99
+€é	 98
+°_	 98
+s	 98
+_Å	 98
+â_	 98
+€j	 98
+i_	 97
+]_	 97
+n_	 96
+á	 95
+h_	 95
+ü_	 95
+U	 95
+á_	 94
+€£	 94
+€j_	 94
+Ê_	 94
+_€j	 93
+_€j_	 93
+¹q	 92
+õ	 92
+È	 92
+Õ_	 92
+§_	 92
+È_	 91
+S	 90
+_€£_	 90
+€£_	 90
+_€£	 90
+ì	 90
+®É	 89
+ú	 89
+€€	 88
+B_	 88
+Ø	 88
+_®É_	 87
+_®É	 87
+U_	 87
+í	 87
+®É_	 87
+N	 87
+Š~	 86
+_Š~_	 86
+ì_	 86
+í_	 86
+ô	 86
+_Š~	 86
+Š~_	 86
+Ï	 85
+^	 85
+€Î	 84
+€Î_	 84
+ù	 84
+Ø_	 84
+G_	 84
+N_	 83
+_€Î	 83
+_€Î_	 83
+_€€	 83
+E	 83
+õ_	 82
+Žä	 81
+€€_	 81
+±_	 81
+ŸÇ	 81
+_€€_	 81
+ß	 80
+ô_	 80
+²_	 79
+ŸÇ_	 79
+_ŸÇ	 79
+_ŸÇ_	 79
+Ì	 78
+_ªø	 78
+_ªø_	 78
+ß_	 78
+ªø	 78
+ªø_	 78
+š_	 77
+S_	 77
+¬O_	 77
+_¬O_	 77
+_¬O	 77
+_Žä_	 77
+Žä_	 77
+Ï_	 77
+_Žä	 77
+¬O	 77
+é_	 77
+Ì_	 76
+ž_	 76
+ù_	 76
+ú_	 75
+ë	 74
+©ó	 72
+t	 72
+©ó_	 72
+_©ó	 72
+_©ó_	 72
+s_	 71
+K	 71
+€T	 71
+I	 71
+Ð_	 71
+€À	 70
+€è	 70
+¬°	 70
+Á_	 70
+¬°_	 69
+€W	 69
+«_	 69
+_¬°_	 68
+¬F_	 68
+_¬F	 68
+_€è_	 68
+¹_	 68
+_¬F_	 68
+_€è	 68
+€è_	 68
+€­	 68
+¬F	 68
+_¬°	 68
+¥X	 67
+ý	 67
+ö	 66
+ŠÊ_	 66
+ŠÊ	 66
+J	 66
+_ŠÊ_	 66
+¥D	 66
+_¹q	 66
+_ŠÊ	 66
+_¥D	 66
+l	 65
+Í	 65
+z	 65
+_€W	 65
+¥D_	 65
+_¥D_	 65
+ò	 65
+Ú	 65
+_€W_	 64
+€W_	 64
+¹q_	 64
+J_	 64
+ý_	 64
+_¹q_	 64
+_€T	 63
+_¥X_	 63
+¥X_	 63
+_€À	 63
+_¥X	 63
+€À_	 63
+¥»	 63
+_€À_	 63
+«á	 62
+Y	 62
+«á_	 61
+ò_	 61
+_«á	 61
+_«á_	 61
+Äµ	 61
+ö_	 61
+Äµ_	 60
+_€T_	 60
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/zh-gb.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/zh-gb.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/zh-gb.lm	(revision 24799)
@@ -0,0 +1,400 @@
+_	 77350
+£	 7152
+_£	 5428
+µ	 3924
+Ä	 3063
+¡	 3020
+¹	 2565
+Ö	 2491
+Ê	 2490
+_¡	 2490
+¬	 2438
+Ð	 2424
+»	 2394
+_µ	 2391
+œ	 2384
+Ò	 2349
+¬_	 2233
+_£¬_	 2102
+£¬_	 2102
+£¬	 2102
+_£¬	 2102
+Œ	 2057
+±	 2043
+Ë	 2000
+Ô	 1999
+È	 1936
+Í	 1856
+²	 1824
+Ó	 1824
+°	 1796
+·	 1780
+¶	 1752
+Î	 1728
+Ï	 1726
+Ž	 1696
+Ä_	 1637
+³	 1631
+Ã	 1630
+ž	 1630
+É	 1596
+Õ	 1571
+£_	 1545
+×	 1535
+Á	 1520
+µÄ	 1505
+µÄ_	 1500
+_µÄ	 1470
+_µÄ_	 1466
+º	 1450
+€	 1429
+ú	 1425
+Ç	 1367
+Ÿ	 1364
+À	 1356
+¿	 1335
+Æ	 1306
+_Ê	 1286
+¢	 1215
+¡£_	 1173
+_¡£_	 1173
+_¡£	 1173
+¡£	 1173
+_Ò	 1141
+Ú	 1131
+_œ	 1124
+€_	 1105
+Â	 1083
+_Ö	 1076
+_¹	 1048
+_È	 1038
+_Ô	 1026
+ª	 1015
+±_	 1008
+Ì	 973
+Å	 952
+°_	 947
+¢_	 946
+Ú_	 932
+_Î	 908
+_Á	 904
+Ñ	 876
+_×	 831
+_ž	 823
+Ë_	 817
+_º	 808
+_²	 805
+_Ž	 803
+_·	 790
+_Ó	 785
+Ð_	 783
+_»	 768
+_Í	 766
+÷	 759
+_¶	 759
+µ_	 751
+_Œ	 749
+š	 744
+£€_	 740
+_£€	 740
+_£€_	 740
+£€	 740
+_Ÿ	 738
+ö	 733
+ú_	 720
+Ø	 708
+«	 694
+_Ë	 690
+ø	 688
+_Ä	 686
+_É	 685
+¡¢_	 674
+¡¢	 674
+_¡¢_	 674
+_¡¢	 674
+ª_	 663
+»_	 656
+_Õ	 651
+ê	 643
+¹_	 643
+_Ï	 632
+_³	 628
+â	 626
+ñ	 605
+Í_	 593
+®	 586
+_Ã	 585
+¯	 584
+û	 578
+_Ð	 574
+á	 563
+ó	 562
+_°	 549
+œ_	 534
+_±	 521
+Äê	 515
+¹ú	 510
+ö_	 507
+Ö_	 503
+Ç_	 493
+Ò»	 493
+_¿	 482
+®_	 481
+ý	 476
+ÔÚ	 474
+ê_	 470
+£°	 468
+_£°	 465
+£°_	 465
+_£°_	 465
+ÔÚ_	 464
+ò	 455
+ø_	 450
+©	 449
+_Æ	 449
+þ	 448
+_À	 448
+à	 445
+ÁË	 445
+ì	 441
+·_	 434
+_Ç	 432
+Â_	 430
+ü	 428
+ÁË_	 427
+_£±	 426
+_£±_	 426
+£±_	 426
+£±	 426
+ºÍ	 425
+÷_	 424
+_ÔÚ	 423
+_Ò»	 419
+­	 419
+í	 417
+Äê_	 417
+_ÔÚ_	 415
+ï	 413
+Ã_	 412
+Ž_	 411
+ç	 411
+â_	 410
+é	 409
+Ï_	 402
+²_	 400
+§	 398
+_ÁË	 397
+_ºÍ	 397
+Ó_	 395
+_Ì	 393
+š_	 392
+ß	 390
+¯_	 387
+î	 386
+Ü	 385
+Ø_	 383
+_ÁË_	 380
+ºÍ_	 379
+ò_	 378
+_Å	 372
+Ù	 368
+_ºÍ_	 368
+û_	 364
+ž_	 359
+«_	 358
+¿_	 356
+Œ_	 355
+ë	 355
+¡_	 349
+³_	 346
+Ò_	 343
+Ô_	 343
+Å_	 340
+ã	 340
+ÈË	 338
+ÖÐ	 338
+¶_	 336
+ý_	 331
+ù	 329
+ñ_	 324
+Ò»_	 309
+¹ú_	 306
+å	 304
+¹€	 300
+ï_	 298
+ó_	 297
+ÓÐ	 296
+È_	 294
+ä	 293
+_Ñ	 290
+Š	 289
+ë_	 281
+_Äê	 276
+ì_	 274
+Òµ	 274
+ß_	 273
+»á	 272
+á_	 270
+ð	 270
+æ	 270
+©_	 269
+_Ò»_	 269
+Õ_	 268
+õ	 268
+_ÖÐ	 267
+ÐÐ	 267
+ÉÏ	 266
+à_	 265
+ü_	 264
+é_	 264
+_Â	 262
+¥	 258
+í_	 257
+§_	 256
+Æ_	 248
+Òµ_	 246
+²ú	 242
+É_	 242
+Û	 242
+ã_	 237
+Ãñ	 233
+·¢	 230
+²»	 229
+µØ	 228
+Îª	 228
+ÊÇ	 226
+_ÓÐ	 225
+ç_	 225
+Ê_	 224
+Žó	 224
+º_	 224
+ÊÇ_	 223
+ŒÒ	 223
+Î_	 222
+î_	 222
+þ_	 221
+³ö	 221
+_Õâ	 220
+Õâ	 220
+Ù_	 220
+å_	 219
+£¹	 218
+£¹_	 217
+_£¹_	 217
+_£¹	 217
+ÓÐ_	 217
+_ÈË	 214
+žö	 210
+_ÉÏ	 210
+è	 209
+·Ö	 209
+Éú	 208
+²¿	 208
+õ_	 208
+_¹ú	 207
+À_	 207
+_¡°	 205
+¡±_	 205
+¡°_	 205
+¡±	 205
+_¡°_	 205
+_¡±_	 205
+_¡±	 205
+¡°	 205
+£ž	 204
+Š_	 203
+×÷	 202
+Ÿ_	 202
+_Äê_	 201
+£²	 201
+_£²_	 200
+_£²	 200
+£²_	 200
+žö_	 199
+Ñ_	 197
+_£ž	 197
+£ž_	 197
+_£ž_	 197
+_¹€	 196
+Ý	 193
+_²»	 191
+£µ	 189
+ð_	 188
+_£µ	 186
+_£µ_	 186
+Ü_	 186
+£µ_	 186
+£³	 183
+œø	 183
+¶à	 182
+Îª_	 182
+ŒÒ_	 180
+ÊÐ	 179
+ÈÕ	 179
+³É	 178
+_ÊÇ	 178
+æ_	 177
+_ÊÇ_	 177
+ÈË_	 177
+ù_	 176
+Õþ	 175
+µœ	 174
+_Îª	 173
+È«	 171
+­_	 171
+Ÿü	 171
+œš	 171
+££	 169
+_£³_	 169
+_££	 169
+_££_	 169
+£³_	 169
+££_	 169
+_£³	 169
+_·¢	 168
+_žö	 168
+Û_	 168
+µœ_	 167
+_¶à	 166
+×_	 166
+¶à_	 166
+Òª	 165
+ÓÃ	 164
+Ê±	 164
+_Žó	 164
+ÖÐ_	 163
+Ý_	 160
+»á_	 160
+ÉÏ_	 159
+ô	 158
+_žö_	 157
+ÐÐ_	 157
+¶¯	 156
+_ÓÐ_	 156
+_¶à_	 155
+ÒÔ	 155
+³€	 154
+ÐÂ	 154
+_œš	 154
+_µØ	 154
+ŒÓ	 152
+_ÈÕ	 151
+_ÊÐ	 151
+ÀŽ	 151
+Ê¡	 149
+¿ª	 148
+ä_	 148
+_Ê¡	 148
+Àí	 147
+_³ö	 146
+µØ_	 145
+_È«	 143
+Í¬	 143
+Íò	 142
+_·Ö	 141
+Íò_	 140
+Ö÷	 140
+Ñ§	 140
+Å©	 139
+Òª_	 139
+_œø	 137
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/zh-utf8.lm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/zh-utf8.lm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/textcat/zh-utf8.lm	(revision 24799)
@@ -0,0 +1,160 @@
+å	23
+_	20
+æ	16
+ç	13
+ä	13
+	10
+	9
+ž	8
+é	8
+¥	7
+œ	7
+	6
+³	6
+è	6
+äž	6
+¡	6
+	6
+ç	5
+	5
+å¥œ	4
+¢	4
+å¥	4
+º	4
+	4
+	4
+æ	4
+¥œ	4
+æ	4
+	4
+¿	4
+	4
+	4
+¹	4
+³	3
+¹å	3
+_æ¹	3
+å	3
+»	3
+äœ	3
+_æ	3
+	3
+ç³	3
+¹å	3
+åç	3
+æ¹å	3
+ç³å	3
+	3
+¹	3
+_æ¹å	3
+ç	3
+_æ	3
+åç	3
+æ	3
+¹å	3
+	3
+_	3
+¹å	3
+ç	3
+ç	3
+¹å	3
+æ	3
+¬	3
+ç³	3
+ç	3
+æ¹å	3
+	3
+³å	3
+¹åç	3
+³å	3
+å	3
+æ¹	3
+ç³å	3
+æ	3
+ç³	3
+¹å	3
+	3
+æ	2
+é	2
+³å¥œ	2
+¡æ	2
+å	2
+ç¡	2
+ç	2
+_é	2
+œå¥	2
+¢	2
+	2
+œå¥œ	2
+œæ	2
+¥œæ	2
+ºç	2
+	2
+ª	2
+	2
+³å¥œå	2
+å¿	2
+_ç	2
+å¥œå	2
+€	2
+œå¥œæ	2
+è³	2
+å¥œæ	2
+äœ 	2
+é	2
+æ_	2
+œ 	2
+­	2
+ 	2
+Ÿ	2
+å	2
+œæ	2
+æ	2
+å	2
+	2
+æ¢	2
+¥œå¥	2
+
+	2
+æ	2
+_å	2
+-	2
+äž	2
+³å¥	2
+ææ	2
+æ	2
+¥œæ	2
+å¥œæ	2
+ž	2
+_	2
+¥œæ	2
+	2
+œææ	2
+å¥œå¥	2
+	2
+å	2
+æ_	2
+	2
+ç	2
+ž	2
+ç	2
+ç³å¥	2
+©	2
+å€©	2
+æ	2
+³å¥	2
+¥œå	2
+€©	2
+œå	2
+å	2
+äž	2
+¥œå¥œ	2
+	2
+ææ	2
+	2
+¡	2
+æ	2
+æ	2
+œæ	2
+å€	2
+³å¥œ	2
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/unicode.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/unicode.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/unicode.pm	(revision 24799)
@@ -0,0 +1,873 @@
+###########################################################################
+#
+# unicode.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999-2004 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# useful functions for dealing with Unicode
+
+# Unicode strings are stored as arrays of scalars as perl 
+# lacks characters are 8-bit (currently)
+
+package unicode;
+
+eval {require bytes};
+
+use encodings;
+use strict;
+use util;
+use MIME::Base64; # for base64 encoding
+
+no strict 'refs';
+
+
+
+sub utf8decomp
+{   
+    my ($str) = @_;
+
+    return if (!defined $str);
+    return "" if ($str eq "");
+	
+    my @unpacked_chars = unpack("C*", $str); # unpack Unicode characters
+
+    my @each_char
+	= map { ($_ > 255 )
+		   ? # if wide character...
+		     sprintf("\\x{%04X}", $_) 
+		   : # \x{...}
+		     (chr($_) =~ m/[[:cntrl:]]/ )
+		     ? # else if control character ...
+		       sprintf("\\x%02X", $_) 
+		     : # \x..
+		       quotemeta(chr($_)) # else quoted or as themselves
+		   } @unpacked_chars;
+    
+    return join("",@each_char);
+}
+
+
+sub hex_codepoint {
+    if (my $char = shift) {
+        return sprintf '%2.2x', unpack('U0U*', $char);
+    }
+}
+
+
+
+
+# ascii2unicode takes an (extended) ascii string (ISO-8859-1)
+# and returns a unicode array.
+sub ascii2unicode {
+    my ($in) = @_;
+    my $out = [];
+
+    my $i = 0;
+    my $len = length($in);
+    while ($i < $len) {
+	push (@$out, ord(substr ($in, $i, 1)));	
+	$i++;
+    }
+
+    return $out;
+}
+
+# ascii2utf8 takes a reference to an (extended) ascii string and returns a
+# UTF-8 encoded string. This is just a faster version of
+# "&unicode2utf8(&ascii2unicode($str));"
+# "Extended ascii" really means "iso_8859_1"
+sub ascii2utf8 {
+    my ($in) = @_;
+    my $out = "";
+
+    if (!defined($in)|| !defined($$in)) {
+	return $out;
+    }
+
+    my ($c);
+    my $i = 0;
+    my $len = length($$in);
+    while ($i < $len) {
+	$c = ord (substr ($$in, $i, 1));
+	if ($c < 0x80) {
+	    # ascii character
+	    $out .= chr ($c);
+
+	} else {
+	    # extended ascii character
+	    $out .= chr (0xc0 + (($c >> 6) & 0x1f));
+	    $out .= chr (0x80 + ($c & 0x3f));
+	}
+	$i++;
+    }
+
+    return $out;
+}
+
+# unicode2utf8 takes a unicode array as input and encodes it
+# using utf-8
+sub unicode2utf8 {
+    my ($in) = @_;
+    my $out = "";
+    
+    foreach my $num (@$in) {
+	next unless defined $num;
+	if ($num < 0x80) {
+	    $out .= chr ($num);
+
+	} elsif ($num < 0x800) {
+	    $out .= chr (0xc0 + (($num >> 6) & 0x1f));
+	    $out .= chr (0x80 + ($num & 0x3f));
+
+	} elsif ($num < 0xFFFF) {
+	    $out .= chr (0xe0 + (($num >> 12) & 0xf));
+	    $out .= chr (0x80 + (($num >> 6) & 0x3f));
+	    $out .= chr (0x80 + ($num & 0x3f));
+
+	} else {
+	    # error, don't encode anything
+	    die;
+	}
+    }
+    return $out;
+}
+
+# utf82unicode takes a utf-8 string and produces a unicode
+# array
+sub utf82unicode {
+    my ($in) = @_;
+    my $out = [];
+
+    my $i = 0;
+    my ($c1, $c2, $c3);
+    my $len = length($in);
+    while ($i < $len) {
+	if (($c1 = ord(substr ($in, $i, 1))) < 0x80) {
+	    # normal ascii character
+	    push (@$out, $c1);
+
+	} elsif ($c1 < 0xc0) {
+	    # error, was expecting the first byte of an
+	    # encoded character. Do nothing.
+
+	} elsif ($c1 < 0xe0 && $i+1 < $len) {
+	    # an encoded character with two bytes
+	    $c2 = ord (substr ($in, $i+1, 1));
+	    if ($c2 >= 0x80 && $c2 < 0xc0) {
+		# everything looks ok
+		push (@$out, ((($c1 & 0x1f) << 6) +
+		      ($c2 & 0x3f)));
+		$i++; # gobbled an extra byte
+	    }
+
+	} elsif ($c1 < 0xf0 && $i+2 < $len) {
+	    # an encoded character with three bytes
+	    $c2 = ord (substr ($in, $i+1, 1));
+	    $c3 = ord (substr ($in, $i+2, 1));
+	    if ($c2 >= 0x80 && $c2 < 0xc0 &&
+		$c3 >= 0x80 && $c3 < 0xc0) {
+		# everything looks ok
+		push (@$out, ((($c1 & 0xf) << 12) +
+		      (($c2 & 0x3f) << 6) +
+		      ($c3 & 0x3f)));
+
+		$i += 2; # gobbled an extra two bytes
+	    }
+
+	} else {
+	    # error, only decode Unicode characters not full UCS.
+	    # Do nothing.
+	}
+
+	$i++;
+    }
+
+    return $out;
+}
+
+# unicode2ucs2 takes a unicode array and produces a UCS-2
+# unicode string (every two bytes forms a unicode character)
+sub unicode2ucs2 {
+    my ($in) = @_;
+    my $out = "";
+
+    foreach my $num (@$in) {
+	$out .= chr (($num & 0xff00) >> 8);
+	$out .= chr ($num & 0xff);
+    }
+
+    return $out;
+}
+
+# ucs22unicode takes a UCS-2 string and produces a unicode array
+sub ucs22unicode {
+    my ($in) = @_;
+    my $out = [];
+
+    my $i = 0;
+    my $len = length ($in);
+    while ($i+1 < $len) {
+	push (@$out, ord (substr($in, $i, 1)) << 8 +
+	      ord (substr($in, $i+1, 1)));
+
+	$i ++;
+    }
+
+    return $out;
+}
+
+# takes a reference to a string and returns a reference to a unicode array
+sub convert2unicode {
+    my ($encoding, $textref) = @_;
+
+    if (!defined $encodings::encodings->{$encoding}) {
+	print STDERR "unicode::convert2unicode: ERROR: Unsupported encoding ($encoding)\n";
+	return [];
+    }
+
+    my $encodename = "$encoding-unicode";
+    my $enc_info = $encodings::encodings->{$encoding};
+    my $mapfile = &util::filename_cat($ENV{'GSDLHOME'}, "mappings",
+				      "to_uc", $enc_info->{'mapfile'});
+    if (!&loadmapencoding ($encodename, $mapfile)) {
+	print STDERR "unicode: ERROR - could not load encoding $encodename: $! $mapfile\n";
+	return [];
+    }
+    
+    if (defined $enc_info->{'converter'}) {
+	my $converter = $enc_info->{'converter'};
+	return &$converter ($encodename, $textref);
+    }
+
+    if ($unicode::translations{$encodename}->{'count'} == 1) {
+	return &singlebyte2unicode ($encodename, $textref);
+    } else {
+	return &doublebyte2unicode ($encodename, $textref);
+    }
+}
+
+# singlebyte2unicode converts simple 8 bit encodings where characters below
+# 0x80 are normal ascii characters and the rest are decoded using the
+# appropriate mapping files.
+#
+# Examples of encodings that may be converted using singlebyte2unicode are
+# the iso-8859 and windows-125* series.
+sub singlebyte2unicode {
+    my ($encodename, $textref) = @_;
+
+    my @outtext = ();
+    my $len = length($$textref);
+    my ($c);
+    my $i = 0;
+
+    while ($i < $len) {
+	if (($c = ord(substr($$textref, $i, 1))) < 0x80) {
+	    # normal ascii character
+	    push (@outtext, $c);
+	} else {
+	    $c = &transchar ($encodename, $c);
+	    # put a black square if cannot translate
+	    $c = 0x25A1 if $c == 0;
+	    push (@outtext, $c);
+	}
+	$i ++;
+    }
+    return \@outtext;
+}
+
+# doublebyte2unicode converts simple two byte encodings where characters
+# below code point 0x80 are single-byte characters and the rest are
+# double-byte characters.
+#
+# Examples of encodings that may be converted using doublebyte2unicode are
+# CJK encodings like GB encoded Chinese and UHC Korean.
+#
+# Note that no error checking is performed to make sure that the input text
+# is valid for the given encoding.
+#
+# Also, encodings that may contain characters of more than two bytes are
+# not supported (any EUC encoded text may in theory contain 3-byte
+# characters but in practice only one and two byte characters are used).
+sub doublebyte2unicode {
+    my ($encodename, $textref) = @_;    
+    
+    my @outtext = ();
+    my $len = length($$textref);
+    my ($c1, $c2);
+    my $i = 0;
+
+    while ($i < $len) {
+	if (($c1 = ord(substr($$textref, $i, 1))) >= 0x80) {
+	    if ($i+1 < $len) {
+		# double-byte character
+		$c2 = ord(substr($$textref, $i+1, 1));
+		my $c = &transchar ($encodename, ($c1 << 8) | $c2);
+		# put a black square if cannot translate
+		$c = 0x25A1 if $c == 0;
+		push (@outtext, $c);
+		$i += 2;
+		
+	    } else {
+		# error
+		print STDERR "unicode: ERROR missing second half of double-byte character\n";
+		$i++;
+	    }
+	    
+	} else {
+	    # single-byte character
+	    push (@outtext, $c1);
+	    $i++;
+	}
+    }
+    return \@outtext;
+}
+
+# Shift-JIS to unicode
+# We can't use doublebyte2unicode for Shift-JIS because it uses some
+# single-byte characters above code point 0x80 (i.e. half-width katakana
+# characters in the range 0xA1-0xDF)
+sub shiftjis2unicode {
+    my ($encodename, $textref) = @_;
+    
+    my @outtext = ();
+    my $len = length($$textref);
+    my ($c1, $c2);
+    my $i = 0;
+
+    while ($i < $len) {
+	$c1 = ord(substr($$textref, $i, 1));
+
+	if (($c1 >= 0xA1 && $c1 <= 0xDF) || $c1 == 0x5c || $c1 == 0x7E) {
+	    # Single-byte half-width katakana character or
+	    # JIS Roman yen or overline characters
+	    my $c = &transchar ($encodename, $c1);
+	    # - put a black square if cannot translate
+	    $c = 0x25A1 if $c == 0;
+	    push (@outtext, $c);
+	    $i++;
+
+	} elsif ($c1 < 0x80) {
+	    # ASCII
+	    push (@outtext, $c1);
+	    $i ++;
+
+	} elsif ($c1 < 0xEF) {
+	    if ($i+1 < $len) {
+		$c2 = ord(substr($$textref, $i+1, 1));
+		if (($c2 >= 0x40 && $c2 <= 0x7E) || ($c2 >= 0x80 && $c2 <= 0xFC)) {
+		    # Double-byte shift-jis character
+		    my $c = &transchar ($encodename, ($c1 << 8) | $c2);
+		    # put a black square if cannot translate
+		    $c = 0x25A1 if $c == 0;
+		    push (@outtext, $c);
+		} else {
+		    # error
+		    print STDERR "unicode: ERROR Invalid Shift-JIS character\n";
+		}
+		$i += 2;
+	    } else {
+		# error
+		print STDERR "unicode: ERROR missing second half of Shift-JIS character\n";
+		$i ++;
+	    }
+	} else {
+	    # error
+	    print STDERR "unicode: ERROR Invalid Shift-JIS character\n";
+	    $i ++;
+	}
+    }
+    return \@outtext;
+}
+
+sub transchar {
+    my ($encoding, $from) = @_;
+    my $high = ($from / 256) % 256;
+    my $low = $from % 256;
+
+    return 0 unless defined $unicode::translations{$encoding};
+
+    my $block = $unicode::translations{$encoding}->{'map'};
+
+    if (ref ($block->[$high]) ne "ARRAY") {
+	return 0;
+    }
+    return $block->[$high]->[$low];
+}
+
+# %translations is of the form:
+#
+# encodings{encodingname-encodingname}->{'map'}->blocktranslation
+# blocktranslation->[[0-255],[256-511], ..., [65280-65535]]
+#
+# Any of the top translation blocks can point to an undefined
+# value. This data structure aims to allow fast translation and 
+# efficient storage.
+%unicode::translations = ();
+
+# @array256 is used for initialisation, there must be
+# a better way...
+# What about this?: @array256 = (0) x 256;
+@unicode::array256 = (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+
+# returns 1 if successful, 0 if unsuccessful
+sub loadmapencoding {
+    my ($encoding, $mapfile) = @_;
+    
+    # check to see if the encoding has already been loaded
+    return 1 if (defined $unicode::translations{$encoding});
+
+    if (! -r $mapfile || -d $mapfile) {
+	return 0;
+    }
+    return 0 unless open (MAPFILE, $mapfile);
+    binmode (MAPFILE);
+
+    $unicode::translations{$encoding} = {'map' => [@unicode::array256], 'count' => 0};
+    my $block = $unicode::translations{$encoding};
+
+    my ($in,$i,$j);
+    while (1) {
+	my $ret=read(MAPFILE, $in, 1);
+	if (!defined($ret)) { # error
+	    print STDERR "unicode.pm: error reading mapfile: $!\n";
+	    last;
+	}
+	if ($ret != 1) { last }
+	$i = unpack ("C", $in);
+	$block->{'map'}->[$i] = [@unicode::array256];
+	for ($j=0; $j<256 && read(MAPFILE, $in, 2)==2; $j++) {
+	    my ($n1, $n2) = unpack ("CC", $in);
+	    $block->{'map'}->[$i]->[$j] = ($n1*256) + $n2;
+	}
+	$block->{'count'} ++;
+    }
+
+    close (MAPFILE);
+}
+
+# unicode2singlebyte converts unicode to simple 8 bit encodings where
+# characters below 0x80 are normal ascii characters and the rest are encoded
+# using the appropriate mapping files.
+#
+# Examples of encodings that may be converted using unicode2singlebyte are
+# the iso-8859 and windows-125* series, KOI8-R (Russian), and the Kazakh encoding.
+sub unicode2singlebyte {
+    my ($uniref, $encoding) = @_;
+
+    my $outtext = "";
+    my $encodename = "unicode-$encoding";
+
+    if (!exists $encodings::encodings->{$encoding}) {
+	print STDERR "unicode.pm: ERROR - unsupported encoding "
+	    . "'$encoding' requested\n";
+	return "";
+    }
+
+    my $enc_info = $encodings::encodings->{$encoding};
+    my $mapfile = &util::filename_cat($ENV{'GSDLHOME'}, "mappings",
+				      "from_uc", $enc_info->{'mapfile'});
+    if (!&loadmapencoding ($encodename, $mapfile)) {
+	print STDERR "unicode: ERROR - could not load encoding $encodename: $! $mapfile\n";
+	return "";
+    }
+    
+    foreach my $c (@$uniref) {
+	if ($c < 0x80) {
+	    # normal ascii character
+	    $outtext .= chr($c);
+	} else {
+	    # extended ascii character
+	    $c = &transchar ($encodename, $c);
+
+	    # put a question mark if cannot translate
+	    if ($c == 0) {
+		$outtext .= "?";
+	    } else {
+		$outtext .= chr($c);
+	    }
+	}
+    }
+    return $outtext;
+}
+
+
+# this makes sure that the referenced input string is utf8 encoded, and
+# will change/remove bytes that aren't.
+# returns 0 if the text was already utf8, or 1 if text modified to become utf8
+sub ensure_utf8 {
+    my $stringref=shift;
+
+    if (!defined($stringref) || ref($stringref) ne 'SCALAR') {
+	return $stringref;
+    }
+
+    my $value=$$stringref;
+
+    my $non_utf8_found = 0;
+    $value =~ m/^/g; # to set \G
+    while ($value =~ m!\G.*?([\x80-\xff]+)!sg) {
+	my $highbytes=$1;
+	my $highbyteslength=length($highbytes);
+	# make sure this block of high bytes is utf-8
+	$highbytes =~ /^/g; # set pos()
+	my $byte_replaced = 0;
+	while ($highbytes =~
+		m!\G (?: [\xc0-\xdf][\x80-\xbf]   | # 2 byte utf-8
+			[\xe0-\xef][\x80-\xbf]{2} | # 3 byte
+			[\xf0-\xf7][\x80-\xbf]{3} | # 4 byte
+			[\xf8-\xfb][\x80-\xbf]{4} | # 5 byte
+			[\xfc-\xfd][\x80-\xbf]{5} | # 6 byte
+			)*([\x80-\xff])? !xg
+		) {
+	    # this highbyte is "out-of-place" for valid utf-8
+	    my $badbyte=$1;
+	    if (!defined $badbyte) {next} # hit end of string
+	    my $pos=pos($highbytes);
+	    # replace bad byte. assume iso-8859-1 -> utf-8
+	    # ascii2utf8 does "extended ascii"... ie iso-8859-1
+	    my $replacement=&unicode::ascii2utf8(\$badbyte);
+	    substr($highbytes, $pos-1, 1, $replacement);
+	    # update the position to continue searching (for \G)
+	    pos($highbytes) = $pos+length($replacement)-1;
+	    $byte_replaced = 1;
+	}
+	if ($byte_replaced) {
+	    # replace this block of high bytes in the $value
+	    $non_utf8_found = 1;
+	    my $replength=length($highbytes); # we've changed the length
+	    my $textpos=pos($value); # pos at end of last match
+	    # replace bad bytes with good bytes
+	    substr($value, $textpos-$highbyteslength,
+			    $highbyteslength, $highbytes);
+	    # update the position to continue searching (for \G)
+	    pos($value)=$textpos+($replength-$highbyteslength)+1;
+	}
+    }
+
+    $$stringref = $value;
+    return $non_utf8_found;
+}
+
+# Returns true (1) if the given string is utf8 and false (0) if it isn't.
+# Does not modify the string parameter.
+sub check_is_utf8 {
+    my $value=shift;
+
+    if (!defined($value)) {
+	return 0; # not utf8 because it is undefined
+    }
+
+    $value =~ m/^/g; # to set \G
+    while ($value =~ m!\G.*?([\x80-\xff]+)!sg) {
+	my $highbytes=$1;
+	# make sure this block of high bytes is utf-8
+	$highbytes =~ /^/g; # set pos()
+	while ($highbytes =~
+		m!\G (?: [\xc0-\xdf][\x80-\xbf]   | # 2 byte utf-8
+			[\xe0-\xef][\x80-\xbf]{2} | # 3 byte
+			[\xf0-\xf7][\x80-\xbf]{3} | # 4 byte
+			[\xf8-\xfb][\x80-\xbf]{4} | # 5 byte
+			[\xfc-\xfd][\x80-\xbf]{5} | # 6 byte
+			)*([\x80-\xff])? !xg
+		) {
+	    my $badbyte=$1;
+	    if (defined $badbyte) { # not end of string
+		return 0; # non-utf8 found
+	    } 
+	}
+    }
+    
+    return 1;
+}
+
+sub url_encode {
+    my ($text) = @_;
+    
+    if (!&is_url_encoded($text)) {
+	$text =~ s/([^0-9A-Z\ \.\-\_])/sprintf("%%%02X", ord($1))/iseg;
+	# return the url-encoded character entity for underscore back to the entity
+	$text =~ s/%26%23095%3B/&\#095;/g;
+    }
+    return $text;
+}
+
+sub url_decode {
+    my ($text,$and_numeric_entities) = @_;
+
+    $text =~ s/\%([0-9A-F]{2})/pack('C', hex($1))/ige;
+
+    if ((defined $and_numeric_entities) && ($and_numeric_entities)) {
+	$text =~ s/\&\#x([0-9A-F]+);/pack('C', hex($1))/ige;
+	$text =~ s/\&\#u?([0-9]+);/pack('C', $1)/ige;
+    }
+
+    return $text;
+}
+
+sub url_decode_utf8 {
+    my ($text,$and_numeric_entities) = @_;
+
+    $text =~ s/\%([0-9A-F]{2})/pack('b', hex($1))/ige;
+
+    $text = Encode::decode("utf8",$text);
+
+    return $text;
+}
+
+sub is_url_encoded {
+    my ($text) = @_;
+    return ($text =~ m/\%([0-9A-F]{2})/i) || ($text =~ m/\&\#x([0-9A-F]+;)/i) || ($text =~ m/\&\#([0-9]+;)/i);
+}
+
+# When a filename on the filesystem is already URL-encoded, the
+# URL to it will have %25s in place of every % sign, so that 
+# URLs in html pages can refer to the URL-encoded filename.
+# This method changes the URL reference back into the actual 
+# (URL-encoded) filename on the filesystem by replacing %25 with %. 
+sub url_to_filename {
+    my ($text) =@_;
+    $text =~ s/%25/%/g if &is_url_encoded($text);
+    # DM safing would have replaced underscores with character entity &#095; 
+    # in SourceFile meta. Undo any such change to get the filename referred to.
+    $text =~ s/&\#095;/_/g;
+    return $text;
+}
+
+# When a filename on the filesystem is already URL-encoded, the
+# URL to it will have %25s in place of every % sign, so that 
+# URLs in html pages can refer to the URL-encoded filename.
+# Given a (URL-encoded) filename on the filesystem, this subroutine
+# returns the URL reference string for it by replacing % with %25. 
+# The output string will be the same as the input string if the input
+# already contains one or more %25s. This is to prevent processing 
+# a url more than once this way.
+sub filename_to_url {
+    my ($text) = @_;
+    
+    if($text !~ m/%25/) {
+	$text =~ s/%/%25/g;
+    }
+    return $text;
+}
+
+sub base64_encode {
+    my ($text) = @_;
+    if(!&conforms_to_mod_base64($text)) {
+	# return entity for underscore to underscore before encoding
+	$text =~ s/&\#095;/_/g;
+
+	$text = &MIME::Base64::encode_base64($text);
+	# base64 encoding may introduce + and / signs,
+	# replacing them with - and _ to ensure it's filename-safe
+	$text =~ s/\+/\-/g; # + -> -
+	$text =~ s/\//\_/g; # / -> _
+    }
+    return $text;
+}
+
+# If the input fits the modified base64 pattern, this will try decoding it. 
+# Still, this method does not guarantee the return value is the 'original', only
+# that the result is where the base64 decoding process has been applied once.
+# THIS METHOD IS NOT USED at the moment. It's here for convenience and symmetry.
+sub base64_decode {
+    my ($text) = @_;
+    if(&conforms_to_mod_base64($text)) {
+	# base64 encodes certain chars with + and /, but if we'd encoded it, we'd
+	# have replaced them with - and _ respectively. Undo this before decoding.
+	$text =~ s/\-/\+/g;      # - -> +
+	$text =~ s/\_/\//g;      # _ -> /
+	$text = &MIME::Base64::decode_base64($text);
+    }
+    return $text;
+}
+
+# Returns true if the given string is compatible with a modified version
+# of base64 (where the + and / are replaced with - and _), a format which 
+# includes also regular ASCII alphanumeric values. This method does not 
+# guarantee that the given string is actually base64 encoded, since it will
+# return true for any simple alphanumeric ASCII string as well. 
+sub conforms_to_mod_base64 {
+    my ($text) = @_;
+
+    # need to treat the entity ref for underscore as underscore
+    $text =~ s/&\#095;/_/g;
+
+    # base 64 takes alphanumeric and [=+/], 
+    # but we use modified base64 where + and / are replaced with  - and _
+    return ($text =~ m/^[A-Za-z0-9\=\-\_]+$/); #alphanumeric and [=-_]
+}
+
+sub substr
+{
+    my ($utf8_string, $offset, $length) = @_;
+
+    my @unicode_string = @{&utf82unicode($utf8_string)};
+    my $unicode_string_length = scalar(@unicode_string);
+
+    my $substr_start = $offset;
+    if ($substr_start >= $unicode_string_length) {
+	return "";
+    }
+
+    my $substr_end = $offset + $length - 1;
+    if ($substr_end >= $unicode_string_length) {
+	$substr_end = $unicode_string_length - 1;
+    }
+
+    my @unicode_substring = @unicode_string[$substr_start..$substr_end];
+    return &unicode2utf8(\@unicode_substring);
+}
+
+# Useful method to print UTF8 (or other unicode) for debugging.
+# Characters that are easily displayed (that is, printable ASCII) 
+# are shown as-is, whereas hex values of the unicode code points 
+# are shown for all other chars.
+sub debug_unicode_string
+{
+    join("",
+         map { $_ > 127 ?                      # if wide character...
+                   sprintf("\\x{%04X}", $_) :  # \x{...}
+                   chr($_)          
+               } unpack("U*", $_[0]));         # unpack Unicode characters
+}
+
+
+sub raw_filename_to_url_encoded
+{
+    my ($str_in) = @_;
+
+    my @url_encoded_chars
+	= map { $_ > 255 ?                  # Needs to be represent in entity form
+		    sprintf("&#x%X;",$_) :  
+		    $_>127 || $_==ord("%") ?              # Representable in %XX form
+		    sprintf("%%%2X", $_) :  
+		    chr($_)                 # otherwise, Ascii char
+		} unpack("U*", $str_in); # Unpack Unicode characters
+
+    
+    my $str_out = join("", @url_encoded_chars);
+
+    return $str_out;
+
+}
+
+sub url_encoded_to_raw_filename
+{
+    my ($str_in) = @_;
+
+    my $str_out = $str_in;
+
+    $str_out =~ s/%([0-9A-F]{2})/chr(hex($1))/eig;
+    $str_out =~ s/&#x([0-9A-F]+);/chr(hex($1))/eig;
+    $str_out =~ s/&#([0-9]+);/chr($1)/eig;
+
+    return $str_out;
+}
+
+
+sub raw_filename_to_utf8_url_encoded
+{
+    my ($str_in) = @_;
+
+    $str_in = Encode::encode("utf8",$str_in) if !check_is_utf8($str_in);
+
+    my @url_encoded_chars
+	= map { $_ > 127 ?                  # Representable in %XX form
+		    sprintf("%%%2X", $_) :  
+		    chr($_)                 # otherwise, Ascii char
+		} unpack("U*", $str_in); # Unpack utf8 characters
+
+    
+    my $str_out = join("", @url_encoded_chars);
+
+    return $str_out;
+
+}
+
+sub utf8_url_encoded_to_raw_filename
+{
+    my ($str_in) = @_;
+
+    my $utf8_str_out = $str_in;
+
+    $utf8_str_out =~ s/%([0-9A-F]{2})/chr(hex($1))/eig;
+
+    my $unicode_str_out = decode("utf8",$utf8_str_out);
+    my $raw_str_out = utf8::downgrade($unicode_str_out);
+    
+    return $raw_str_out;
+}
+
+sub analyze_raw_string
+{
+    my ($str_in) = @_;
+
+    my $uses_bytecodes = 0;
+    my $exceeds_bytecodes = 0;
+
+    map { $exceeds_bytecodes = 1 if ($_ >= 256);
+	  $uses_bytecodes    = 1 if (($_ >= 128) && ($_ < 256));
+    } unpack("U*", $str_in); # Unpack Unicode characters
+
+    return ($uses_bytecodes,$exceeds_bytecodes);
+}
+
+
+sub convert_utf8_string_to_unicode_string
+{
+    my $utf8_string = shift(@_);
+
+    my $unicode_string = "";
+    foreach my $unicode_value (@{&unicode::utf82unicode($utf8_string)}) {
+	$unicode_string .= chr($unicode_value);
+    }
+    return $unicode_string;
+}
+
+sub convert_unicode_string_to_utf8_string
+{
+    my $unicode_string = shift(@_);
+
+    my @unicode_array;
+    for (my $i = 0; $i < length($unicode_string); $i++) {
+	push(@unicode_array, ord(&substr($unicode_string, $i, 1)));
+    }
+    return &unicode::unicode2utf8(\@unicode_array);
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/util.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/util.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/util.pm	(revision 24799)
@@ -0,0 +1,1646 @@
+###########################################################################
+#
+# util.pm -- various useful utilities
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package util;
+
+use strict;
+
+use Encode;
+use File::Copy;
+use File::Basename;
+# Config for getting the perlpath in the recommended way, though it uses paths that are
+# hard-coded into the Config file that's generated upon configuring and compiling perl.
+# $^X works better in some cases to return the path to perl used to launch the script,
+# but if launched with plain "perl" (no full-path), that will be just what it returns.
+use Config; 
+
+# removes files (but not directories)
+sub rm {
+    my (@files) = @_;
+
+    my @filefiles = ();
+
+    # make sure the files we want to delete exist 
+    # and are regular files
+    foreach my $file (@files) {
+	if (!-e $file) {
+	    print STDERR "util::rm $file does not exist\n";
+	} elsif ((!-f $file) && (!-l $file)) {
+	    print STDERR "util::rm $file is not a regular (or symbolic) file\n";
+	} else {
+	    push (@filefiles, $file);
+	}
+    }
+    
+    # remove the files
+    my $numremoved = unlink @filefiles;
+
+    # check to make sure all of them were removed
+    if ($numremoved != scalar(@filefiles)) {
+	print STDERR "util::rm Not all files were removed\n";
+    }
+}
+
+# removes files (but not directories) - can rename this to the default
+# "rm" subroutine  when debugging the deletion of individual files.
+sub rm_debug {
+    my (@files) = @_;
+    my @filefiles = ();
+
+    # make sure the files we want to delete exist 
+    # and are regular files
+    foreach my $file (@files) {
+		if (!-e $file) {
+		    print STDERR "util::rm $file does not exist\n";
+		} elsif ((!-f $file) && (!-l $file)) {
+		    print STDERR "util::rm $file is not a regular (or symbolic) file\n";
+		} else { # debug message
+			unlink($file) or warn "Could not delete file $file: $!\n";
+		}
+    }
+}
+
+
+# recursive removal
+sub filtered_rm_r {
+    my ($files,$file_accept_re,$file_reject_re) = @_;
+
+#   my ($cpackage,$cfilename,$cline,$csubr,$chas_args,$cwantarray) = caller(2);
+#   my ($lcfilename) = ($cfilename =~ m/([^\\\/]*)$/);
+#   print STDERR "** Calling method (2): $lcfilename:$cline $cpackage->$csubr\n";
+	
+    my @files_array = (ref $files eq "ARRAY") ? @$files : ($files);
+
+    # recursively remove the files
+    foreach my $file (@files_array) {
+	$file =~ s/[\/\\]+$//; # remove trailing slashes
+	
+	if (!-e $file) {
+	    print STDERR "util::filtered_rm_r $file does not exist\n";
+
+	} elsif ((-d $file) && (!-l $file)) { # don't recurse down symbolic link
+	    # get the contents of this directory
+	    if (!opendir (INDIR, $file)) {
+		print STDERR "util::filtered_rm_r could not open directory $file\n";
+	    } else {
+		my @filedir = grep (!/^\.\.?$/, readdir (INDIR));
+		closedir (INDIR);
+				
+		# remove all the files in this directory
+		map {$_="$file/$_";} @filedir;
+		&filtered_rm_r (\@filedir,$file_accept_re,$file_reject_re);
+
+		if (!defined $file_accept_re && !defined $file_reject_re) {
+		    # remove this directory
+		    if (!rmdir $file) {
+			print STDERR "util::filtered_rm_r couldn't remove directory $file\n";
+		    }
+		}
+	    }
+	} else {
+	    next if (defined $file_reject_re && ($file =~ m/$file_reject_re/));
+
+	    if ((!defined $file_accept_re) || ($file =~ m/$file_accept_re/)) {
+		# remove this file	
+		&rm ($file);
+	    }
+	}
+    }
+}
+
+
+# recursive removal
+sub rm_r {
+    my (@files) = @_;
+    
+    # use the more general (but reterospectively written function
+    # filtered_rm_r function()
+
+    filtered_rm_r(\@files,undef,undef); # no accept or reject expressions
+}
+
+
+
+
+# moves a file or a group of files
+sub mv {
+    my $dest = pop (@_);
+    my (@srcfiles) = @_;
+
+    # remove trailing slashes from source and destination files
+    $dest =~ s/[\\\/]+$//;
+    map {$_ =~ s/[\\\/]+$//;} @srcfiles;
+
+    # a few sanity checks
+    if (scalar (@srcfiles) == 0) {
+	print STDERR "util::mv no destination directory given\n";
+	return;
+    } elsif ((scalar (@srcfiles) > 1) && (!-d $dest)) {
+	print STDERR "util::mv if multiple source files are given the ".
+	    "destination must be a directory\n";
+	return;
+    }
+
+    # move the files
+    foreach my $file (@srcfiles) {
+	my $tempdest = $dest;
+	if (-d $tempdest) {
+	    my ($filename) = $file =~ /([^\\\/]+)$/;
+	    $tempdest .= "/$filename";
+	}
+	if (!-e $file) {
+	    print STDERR "util::mv $file does not exist\n";
+	} else {
+	    rename ($file, $tempdest);
+	}
+    }
+}
+
+
+# copies a file or a group of files
+sub cp {
+    my $dest = pop (@_);
+    my (@srcfiles) = @_;
+
+    # remove trailing slashes from source and destination files
+    $dest =~ s/[\\\/]+$//;
+    map {$_ =~ s/[\\\/]+$//;} @srcfiles;
+
+    # a few sanity checks
+    if (scalar (@srcfiles) == 0) {
+	print STDERR "util::cp no destination directory given\n";
+	return;
+    } elsif ((scalar (@srcfiles) > 1) && (!-d $dest)) {
+	print STDERR "util::cp if multiple source files are given the ".
+	    "destination must be a directory\n";
+	return;
+    }
+
+    # copy the files
+    foreach my $file (@srcfiles) {
+	my $tempdest = $dest;
+	if (-d $tempdest) {
+	    my ($filename) = $file =~ /([^\\\/]+)$/;
+	    $tempdest .= "/$filename";
+	}
+	if (!-e $file) {
+	    print STDERR "util::cp $file does not exist\n";
+	} elsif (!-f $file) {
+	    print STDERR "util::cp $file is not a plain file\n";
+	} else {
+	    &File::Copy::copy ($file, $tempdest);
+	}
+    }
+}
+
+
+
+# recursively copies a file or group of files
+# syntax: cp_r (sourcefiles, destination directory)
+# destination must be a directory - to copy one file to
+# another use cp instead
+sub cp_r {
+    my $dest = pop (@_);
+    my (@srcfiles) = @_;
+
+    # a few sanity checks
+    if (scalar (@srcfiles) == 0) {
+	print STDERR "util::cp_r no destination directory given\n";
+	return;
+    } elsif (-f $dest) {
+	print STDERR "util::cp_r destination must be a directory\n";
+	return;
+    }
+    
+    # create destination directory if it doesn't exist already
+    if (! -d $dest) {
+	my $store_umask = umask(0002);
+	mkdir ($dest, 0777);
+	umask($store_umask);
+    } 
+
+    # copy the files
+    foreach my $file (@srcfiles) {
+
+	if (!-e $file) {
+	    print STDERR "util::cp_r $file does not exist\n";
+
+	} elsif (-d $file) {
+	    # make the new directory
+	    my ($filename) = $file =~ /([^\\\/]*)$/;
+	    $dest = &util::filename_cat ($dest, $filename);
+	    my $store_umask = umask(0002);
+	    mkdir ($dest, 0777);
+	    umask($store_umask);
+
+	    # get the contents of this directory
+	    if (!opendir (INDIR, $file)) {
+		print STDERR "util::cp_r could not open directory $file\n";
+	    } else {
+		my @filedir = readdir (INDIR);
+		closedir (INDIR);
+		foreach my $f (@filedir) {
+		    next if $f =~ /^\.\.?$/;
+		    # copy all the files in this directory
+		    my $ff = &util::filename_cat ($file, $f); 
+		    &cp_r ($ff, $dest);
+		}
+	    }
+
+	} else {
+	    &cp($file, $dest);
+	}
+    }
+}
+# recursively copies a file or group of files
+# syntax: cp_r (sourcefiles, destination directory)
+# destination must be a directory - to copy one file to
+# another use cp instead
+sub cp_r_nosvn {
+    my $dest = pop (@_);
+    my (@srcfiles) = @_;
+
+    # a few sanity checks
+    if (scalar (@srcfiles) == 0) {
+	print STDERR "util::cp_r no destination directory given\n";
+	return;
+    } elsif (-f $dest) {
+	print STDERR "util::cp_r destination must be a directory\n";
+	return;
+    }
+    
+    # create destination directory if it doesn't exist already
+    if (! -d $dest) {
+	my $store_umask = umask(0002);
+	mkdir ($dest, 0777);
+	umask($store_umask);
+    } 
+
+    # copy the files
+    foreach my $file (@srcfiles) {
+
+	if (!-e $file) {
+	    print STDERR "util::cp_r $file does not exist\n";
+
+	} elsif (-d $file) {
+	    # make the new directory
+	    my ($filename) = $file =~ /([^\\\/]*)$/;
+	    $dest = &util::filename_cat ($dest, $filename);
+	    my $store_umask = umask(0002);
+	    mkdir ($dest, 0777);
+	    umask($store_umask);
+
+	    # get the contents of this directory
+	    if (!opendir (INDIR, $file)) {
+		print STDERR "util::cp_r could not open directory $file\n";
+	    } else {
+		my @filedir = readdir (INDIR);
+		closedir (INDIR);
+		foreach my $f (@filedir) {
+		    next if $f =~ /^\.\.?$/;
+		    next if $f =~ /^\.svn$/;
+		    # copy all the files in this directory
+		    my $ff = &util::filename_cat ($file, $f); 
+		    &cp_r ($ff, $dest);
+		}
+	    }
+
+	} else {
+	    &cp($file, $dest);
+	}
+    }
+}
+
+# copies a directory and its contents, excluding subdirectories, into a new directory
+sub cp_r_toplevel {
+    my $dest = pop (@_);
+    my (@srcfiles) = @_;
+
+    # a few sanity checks
+    if (scalar (@srcfiles) == 0) {
+	print STDERR "util::cp_r no destination directory given\n";
+	return;
+    } elsif (-f $dest) {
+	print STDERR "util::cp_r destination must be a directory\n";
+	return;
+    }
+    
+    # create destination directory if it doesn't exist already
+    if (! -d $dest) {
+	my $store_umask = umask(0002);
+	mkdir ($dest, 0777);
+	umask($store_umask);
+    } 
+
+    # copy the files
+    foreach my $file (@srcfiles) {
+
+	if (!-e $file) {
+	    print STDERR "util::cp_r $file does not exist\n";
+
+	} elsif (-d $file) {
+	    # make the new directory
+	    my ($filename) = $file =~ /([^\\\/]*)$/;
+	    $dest = &util::filename_cat ($dest, $filename);
+	    my $store_umask = umask(0002);
+	    mkdir ($dest, 0777);
+	    umask($store_umask);
+
+	    # get the contents of this directory
+	    if (!opendir (INDIR, $file)) {
+		print STDERR "util::cp_r could not open directory $file\n";
+	    } else {
+		my @filedir = readdir (INDIR);
+		closedir (INDIR);
+		foreach my $f (@filedir) {
+		    next if $f =~ /^\.\.?$/;
+		    
+		    # copy all the files in this directory, but not directories
+		    my $ff = &util::filename_cat ($file, $f); 
+		    if (-f $ff) {
+			&cp($ff, $dest);
+			#&cp_r ($ff, $dest);
+		    }
+		}
+	    }
+
+	} else {
+	    &cp($file, $dest);
+	}
+    }
+}
+
+sub mk_dir {
+    my ($dir) = @_;
+
+    my $store_umask = umask(0002);
+    my $mkdir_ok = mkdir ($dir, 0777);
+    umask($store_umask);
+    
+    if (!$mkdir_ok) 
+    {
+	print STDERR "util::mk_dir could not create directory $dir\n";
+	return;
+    }
+}
+
+# in case anyone cares - I did some testing (using perls Benchmark module)
+# on this subroutine against File::Path::mkpath (). mk_all_dir() is apparently
+# slightly faster (surprisingly) - Stefan.
+sub mk_all_dir {
+    my ($dir) = @_;
+
+    # use / for the directory separator, remove duplicate and
+    # trailing slashes
+    $dir=~s/[\\\/]+/\//g; 
+    $dir=~s/[\\\/]+$//;
+
+    # make sure the cache directory exists
+    my $dirsofar = "";
+    my $first = 1;
+    foreach my $dirname (split ("/", $dir)) {
+	$dirsofar .= "/" unless $first;
+	$first = 0;
+
+	$dirsofar .= $dirname;
+
+	next if $dirname =~ /^(|[a-z]:)$/i;
+	if (!-e $dirsofar)
+	    {
+		my $store_umask = umask(0002);
+		my $mkdir_ok = mkdir ($dirsofar, 0777);
+		umask($store_umask);
+		if (!$mkdir_ok)
+		{
+		    print STDERR "util::mk_all_dir could not create directory $dirsofar\n";
+		    return;
+		}
+	    }
+    }
+}
+
+# make hard link to file if supported by OS, otherwise copy the file
+sub hard_link {
+    my ($src, $dest, $verbosity) = @_;
+
+    # remove trailing slashes from source and destination files
+    $src =~ s/[\\\/]+$//;
+    $dest =~ s/[\\\/]+$//;
+
+##    print STDERR "**** src = ", unicode::debug_unicode_string($src),"\n";
+    # a few sanity checks
+    if (-e $dest) {
+	# destination file already exists
+	return;
+    }
+    elsif (!-e $src) {
+	print STDERR "util::hard_link source file \"$src\" does not exist\n";
+	return 1;
+    }
+    elsif (-d $src) {
+	print STDERR "util::hard_link source \"$src\" is a directory\n";
+	return 1;
+    }
+
+    my $dest_dir = &File::Basename::dirname($dest);
+    mk_all_dir($dest_dir) if (!-e $dest_dir);
+
+
+	if (!link($src, $dest)) {
+	if ((!defined $verbosity) || ($verbosity>2)) {
+	    print STDERR "util::hard_link: unable to create hard link. ";
+	    print STDERR " Copying file: $src -> $dest\n";
+	}
+	&File::Copy::copy ($src, $dest);
+    }
+    return 0;
+}
+
+# make soft link to file if supported by OS, otherwise copy file
+sub soft_link {
+    my ($src, $dest, $ensure_paths_absolute) = @_;
+
+    # remove trailing slashes from source and destination files
+    $src =~ s/[\\\/]+$//;
+    $dest =~ s/[\\\/]+$//;
+
+    # Ensure file paths are absolute IF requested to do so 
+    # Soft_linking didn't work for relative paths
+    if(defined $ensure_paths_absolute && $ensure_paths_absolute) {
+	# We need to ensure that the src file is the absolute path 
+	# See http://perldoc.perl.org/File/Spec.html
+	if(!File::Spec->file_name_is_absolute( $src ))  { # it's relative
+	    $src = File::Spec->rel2abs($src); # make absolute
+	}
+	# Might as well ensure that the destination file's absolute path is used
+	if(!File::Spec->file_name_is_absolute( $dest )) {
+	    $dest = File::Spec->rel2abs($dest); # make absolute
+	}
+    }
+
+    # a few sanity checks
+    if (!-e $src) {
+	print STDERR "util::soft_link source file $src does not exist\n";
+	return 0;
+    }
+
+    my $dest_dir = &File::Basename::dirname($dest);
+    mk_all_dir($dest_dir) if (!-e $dest_dir);
+
+    if ($ENV{'GSDLOS'} =~ /^windows$/i) {
+		
+	# symlink not supported on windows
+	&File::Copy::copy ($src, $dest);
+
+    } elsif (!eval {symlink($src, $dest)}) {
+	print STDERR "util::soft_link: unable to create soft link.\n";
+	return 0;
+    }
+
+    return 1;
+}
+
+# Primarily for filenames generated by processing
+# content of HTML files (which are mapped to UTF-8 internally)
+#
+# To turn this into an octet string that really exists on the file
+# system:
+# 1. don't need to do anything special for Unix-based systems
+#   (as underlying file system is byte-code)
+# 2. need to map to short DOS filenames for Windows
+
+sub utf8_to_real_filename
+{
+    my ($utf8_filename) = @_;
+
+    my $real_filename;
+
+    if ($ENV{'GSDLOS'} =~ m/^windows$/i) {
+	require Win32;
+
+	print STDERR "***** utf8 filename = $utf8_filename\n\n\n";
+
+	my $unicode_filename = decode("utf8",$utf8_filename);
+	$real_filename = Win32::GetShortPathName($unicode_filename);
+    }
+    else {
+	$real_filename = $utf8_filename;
+    }
+
+    return $real_filename;
+}
+
+
+sub fd_exists
+{
+    my $filename_full_path = shift @_;
+    my $test_op = shift @_ || "-e";
+
+    # By default tests for existance of file or directory (-e)
+    # Can be made more specific by providing second parameter (e.g. -f or -d)
+
+    my $exists = 0;
+
+    if ($ENV{'GSDLOS'} =~ m/^windows$/i) {
+	require Win32;
+	my $filename_short_path = Win32::GetShortPathName($filename_full_path);	
+	if (!defined $filename_short_path) {
+	    # Was probably still in UTF8 form (not what is needed on Windows)
+	    my $unicode_filename_full_path = eval "decode(\"utf8\",\$filename_full_path)";
+	    if (defined $unicode_filename_full_path) {
+		$filename_short_path = Win32::GetShortPathName($unicode_filename_full_path);
+	    }
+	}
+	$filename_full_path = $filename_short_path;
+    }
+
+    if (defined $filename_full_path) {
+	$exists = eval "($test_op \$filename_full_path)";
+    }
+
+    return $exists;
+}
+
+sub file_exists
+{
+    my ($filename_full_path) = @_;
+
+    return fd_exists($filename_full_path,"-f");
+}
+
+sub dir_exists
+{
+    my ($filename_full_path) = @_;
+
+    return fd_exists($filename_full_path,"-d");
+}
+
+
+
+# updates a copy of a directory in some other part of the filesystem
+# verbosity settings are: 0=low, 1=normal, 2=high
+# both $fromdir and $todir should be absolute paths
+sub cachedir {
+    my ($fromdir, $todir, $verbosity) = @_;
+    $verbosity = 1 unless defined $verbosity;
+
+    # use / for the directory separator, remove duplicate and
+    # trailing slashes
+    $fromdir=~s/[\\\/]+/\//g; 
+    $fromdir=~s/[\\\/]+$//;
+    $todir=~s/[\\\/]+/\//g; 
+    $todir=~s/[\\\/]+$//;
+
+    &mk_all_dir ($todir);
+
+    # get the directories in ascending order
+    if (!opendir (FROMDIR, $fromdir)) {
+	print STDERR "util::cachedir could not read directory $fromdir\n";
+	return;
+    }
+    my @fromdir = grep (!/^\.\.?$/, sort(readdir (FROMDIR)));
+    closedir (FROMDIR);
+
+    if (!opendir (TODIR, $todir)) {
+	print STDERR "util::cacedir could not read directory $todir\n";
+	return;
+    }
+    my @todir = grep (!/^\.\.?$/, sort(readdir (TODIR)));
+    closedir (TODIR);
+
+    my $fromi = 0;
+    my $toi = 0;
+		    
+    while ($fromi < scalar(@fromdir) || $toi < scalar(@todir)) {
+#	print "fromi: $fromi toi: $toi\n";
+
+	# see if we should delete a file/directory
+	# this should happen if the file/directory
+	# is not in the from list or if its a different
+	# size, or has an older timestamp
+	if ($toi < scalar(@todir)) {
+	    if (($fromi >= scalar(@fromdir)) ||
+		($todir[$toi] lt $fromdir[$fromi] || 
+		 ($todir[$toi] eq $fromdir[$fromi] && 
+		  &differentfiles("$fromdir/$fromdir[$fromi]","$todir/$todir[$toi]",
+				  $verbosity)))) {
+
+		# the files are different
+		&rm_r("$todir/$todir[$toi]");
+		splice(@todir, $toi, 1); # $toi stays the same
+
+	    } elsif ($todir[$toi] eq $fromdir[$fromi]) {
+		# the files are the same
+		# if it is a directory, check its contents
+		if (-d "$todir/$todir[$toi]") {
+		    &cachedir ("$fromdir/$fromdir[$fromi]",
+			       "$todir/$todir[$toi]", $verbosity);
+		}
+
+		$toi++;
+		$fromi++;
+		next;
+	    }
+	}
+  
+	# see if we should insert a file/directory
+	# we should insert a file/directory if there
+	# is no tofiles left or if the tofile does not exist
+	if ($fromi < scalar(@fromdir) && ($toi >= scalar(@todir) || 
+					  $todir[$toi] gt $fromdir[$fromi])) {
+	    &cp_r ("$fromdir/$fromdir[$fromi]", "$todir/$fromdir[$fromi]");
+	    splice (@todir, $toi, 0, $fromdir[$fromi]);
+
+	    $toi++;
+	    $fromi++;
+	}
+    }
+}
+
+# this function returns -1 if either file is not found
+# assumes that $file1 and $file2 are absolute file names or
+# in the current directory
+# $file2 is allowed to be newer than $file1
+sub differentfiles {
+    my ($file1, $file2, $verbosity) = @_;
+    $verbosity = 1 unless defined $verbosity;
+
+    $file1 =~ s/\/+$//;
+    $file2 =~ s/\/+$//;
+    
+    my ($file1name) = $file1 =~ /\/([^\/]*)$/;
+    my ($file2name) = $file2 =~ /\/([^\/]*)$/;
+
+    return -1 unless (-e $file1 && -e $file2);
+    if ($file1name ne $file2name) {
+	print STDERR "filenames are not the same\n" if ($verbosity >= 2);
+	return 1;
+    }
+
+    my @file1stat = stat ($file1);
+    my @file2stat = stat ($file2);
+
+    if (-d $file1) {
+	if (! -d $file2) {
+	    print STDERR "one file is a directory\n" if ($verbosity >= 2);
+	    return 1;
+	}
+	return 0;
+    }
+
+    # both must be regular files
+    unless (-f $file1 && -f $file2) {
+	print STDERR "one file is not a regular file\n" if ($verbosity >= 2);
+	return 1;
+    }
+
+    # the size of the files must be the same
+    if ($file1stat[7] != $file2stat[7]) {
+	print STDERR "different sized files\n" if ($verbosity >= 2);
+	return 1;
+    }
+
+    # the second file cannot be older than the first
+    if ($file1stat[9] > $file2stat[9]) {
+	print STDERR "file is older\n" if ($verbosity >= 2);
+	return 1;
+    }
+
+    return 0;
+}
+
+
+sub get_tmp_filename 
+{
+    my $file_ext = shift(@_) || undef;
+
+    my $opt_dot_file_ext = "";
+    if (defined $file_ext) {
+	if ($file_ext !~ m/\./) {
+	    # no dot, so needs one added in at start
+	    $opt_dot_file_ext = ".$file_ext"
+	}
+	else {
+	    # allow for "extensions" such as _metadata.txt to be handled
+	    # gracefully
+	    $opt_dot_file_ext = $file_ext;
+	}
+    }
+
+    my $tmpdir = filename_cat($ENV{'GSDLHOME'}, "tmp");
+    &mk_all_dir ($tmpdir) unless -e $tmpdir;
+
+    my $count = 1000;
+    my $rand = int(rand $count);
+    my $full_tmp_filename = &filename_cat($tmpdir, "F$rand$opt_dot_file_ext");
+
+    while (-e $full_tmp_filename) {
+	$rand = int(rand $count);
+	$full_tmp_filename = &filename_cat($tmpdir, "F$rand$opt_dot_file_ext");
+	$count++;
+    }
+    
+    return $full_tmp_filename;
+}
+
+sub get_timestamped_tmp_folder
+{
+
+    my $tmp_dirname;
+    if(defined $ENV{'GSDLCOLLECTDIR'}) {
+	$tmp_dirname = $ENV{'GSDLCOLLECTDIR'};
+    } elsif(defined $ENV{'GSDLHOME'}) {
+	$tmp_dirname = $ENV{'GSDLHOME'};
+    } else {
+	return undef;
+    }
+
+    $tmp_dirname = &util::filename_cat($tmp_dirname, "tmp");
+    &util::mk_dir($tmp_dirname) if (!-e $tmp_dirname);
+
+    # add the timestamp into the path otherwise we can run into problems 
+    # if documents have the same name
+    my $timestamp = time;
+    my $time_tmp_dirname = &util::filename_cat($tmp_dirname, $timestamp);
+    $tmp_dirname = $time_tmp_dirname;
+    my $i = 1;
+    while (-e $tmp_dirname) {
+	$tmp_dirname = "$time_tmp_dirname$i";
+	$i++;
+    }
+    &util::mk_dir($tmp_dirname);
+ 
+    return $tmp_dirname;
+}
+
+sub get_timestamped_tmp_filename_in_collection
+{
+
+    my ($input_filename, $output_ext) = @_;
+    # derive tmp filename from input filename
+    my ($tailname, $dirname, $suffix)
+	= &File::Basename::fileparse($input_filename, "\\.[^\\.]+\$");
+
+    # softlink to collection tmp dir
+    my $tmp_dirname = &util::get_timestamped_tmp_folder();
+    $tmp_dirname = $dirname unless defined $tmp_dirname;
+
+    # following two steps copied from ConvertBinaryFile
+    # do we need them?? can't use them as is, as they use plugin methods.
+
+    #$tailname = $self->SUPER::filepath_to_utf8($tailname) unless &unicode::check_is_utf8($tailname);
+
+    # URLEncode this since htmls with images where the html filename is utf8 don't seem
+    # to work on Windows (IE or Firefox), as browsers are looking for filesystem-encoded
+    # files on the filesystem.
+    #$tailname = &util::rename_file($tailname, $self->{'file_rename_method'}, "without_suffix");
+    if (defined $output_ext) {
+	$output_ext = ".$output_ext"; # add the dot
+    } else {
+	$output_ext = $suffix;
+    }
+    $output_ext= lc($output_ext);
+    my $tmp_filename = &util::filename_cat($tmp_dirname, "$tailname$output_ext");
+    
+    return $tmp_filename;
+}
+
+sub get_toplevel_tmp_dir
+{
+    return filename_cat($ENV{'GSDLHOME'}, "tmp");
+}
+
+
+sub filename_to_regex {
+    my $filename = shift (@_);
+
+    # need to put single backslash back to double so that regex works
+    if ($ENV{'GSDLOS'} =~ /^windows$/i) {
+	$filename =~ s/\\/\\\\/g;
+    }
+    return $filename;
+}
+
+sub filename_cat {
+    my $first_file = shift(@_);
+    my (@filenames) = @_;
+
+#   Useful for debugging 
+#     -- might make sense to call caller(0) rather than (1)??
+#   my ($cpackage,$cfilename,$cline,$csubr,$chas_args,$cwantarray) = caller(1);
+#   print STDERR "Calling method: $cfilename:$cline $cpackage->$csubr\n";
+   
+    # If first_file is not null or empty, then add it back into the list
+    if (defined $first_file && $first_file =~ /\S/) {
+	unshift(@filenames, $first_file);
+    }
+
+    my $filename = join("/", @filenames);
+
+    # remove duplicate slashes and remove the last slash
+    if ($ENV{'GSDLOS'} =~ /^windows$/i) {
+	$filename =~ s/[\\\/]+/\\/g;
+    } else {
+	$filename =~ s/[\/]+/\//g; 
+	# DB: want a filename abc\de.html to remain like this
+    }
+    $filename =~ s/[\\\/]$//;
+
+    return $filename;
+}
+
+
+sub pathname_cat {
+    my $first_path = shift(@_);
+    my (@pathnames) = @_;
+
+    # If first_path is not null or empty, then add it back into the list
+    if (defined $first_path && $first_path =~ /\S/) {
+	unshift(@pathnames, $first_path);
+    }
+
+    my $join_char;
+    if ($ENV{'GSDLOS'} =~ /^windows$/i) {
+	$join_char = ";";
+    } else {
+	$join_char = ":";
+    }
+
+    my $pathname = join($join_char, @pathnames);
+
+    # remove duplicate slashes
+    if ($ENV{'GSDLOS'} =~ /^windows$/i) {
+	$pathname =~ s/[\\\/]+/\\/g;
+    } else {
+	$pathname =~ s/[\/]+/\//g; 
+	# DB: want a pathname abc\de.html to remain like this
+    }
+
+    return $pathname;
+}
+
+my $oid_warned_about_periods = 0;
+
+sub tidy_up_oid {
+    my ($OID, $verbosity) = @_;
+    if (!defined $verbosity)
+    {
+      $verbosity = 2;
+    }
+    if ($OID =~ /\./) {
+      if (!$oid_warned_about_periods)
+      {
+        print STDERR "Warning, identifier $OID contains periods (.), removing them for this and future documents\n";
+        $oid_warned_about_periods = 1;
+      }
+	$OID =~ s/\.//g; #remove any periods
+    }
+    if ($OID =~ /^\s.*\s$/) {
+	print STDERR "Warning, identifier $OID starts or ends with whitespace. Removing it\n";
+	# remove starting and trailing whitespace
+	$OID =~ s/^\s+//;
+	$OID =~ s/\s+$//;
+    }
+    if ($OID =~ /^[\d]*$/) {
+	print STDERR "Warning, identifier $OID contains only digits. Prepending 'D'.\n";
+	$OID = "D" . $OID;
+    }		
+    
+    return $OID;
+}
+sub envvar_prepend {
+    my ($var,$val) = @_;
+
+    # do not prepend any value/path that's already in the environment variable
+    if ($ENV{'GSDLOS'} =~ /^windows$/i) 
+    {
+	my $escaped_val = $val;
+	$escaped_val =~ s/\\/\\\\/g; # escape any Windows backslashes for upcoming regex
+	if (!defined($ENV{$var})) {
+	    $ENV{$var} = "$val";
+	}
+	elsif($ENV{$var} !~ m/$escaped_val/) { 
+	    $ENV{$var} = "$val;".$ENV{$var};
+	}
+    }
+    else {
+	if (!defined($ENV{$var})) {
+	    $ENV{$var} = "$val";
+	}
+	elsif($ENV{$var} !~ m/$val/) { 
+	    $ENV{$var} = "$val:".$ENV{$var};
+	}
+    }
+}
+
+sub envvar_append {
+    my ($var,$val) = @_;
+
+    # do not append any value/path that's already in the environment variable
+    if ($ENV{'GSDLOS'} =~ /^windows$/i) 
+    {
+	my $escaped_val = $val;
+	$escaped_val =~ s/\\/\\\\/g; # escape any Windows backslashes for upcoming regex
+	if (!defined($ENV{$var})) {
+	    $ENV{$var} = "$val";
+	}
+	elsif($ENV{$var} !~ m/$escaped_val/) { 
+	    $ENV{$var} .= ";$val";
+	}
+    }
+    else {
+	if (!defined($ENV{$var})) {
+	    $ENV{$var} = "$val";
+	}
+	elsif($ENV{$var} !~ m/$val/) { 
+	    $ENV{$var} .= ":$val";
+	}
+    }    
+}
+
+
+# splits a filename into a prefix and a tail extension using the tail_re, or 
+# if that fails, splits on the file_extension . (dot) 
+sub get_prefix_and_tail_by_regex {
+
+    my ($filename,$tail_re) = @_;
+    
+    my ($file_prefix,$file_ext) = ($filename =~ m/^(.*?)($tail_re)$/);
+    if ((!defined $file_prefix) || (!defined $file_ext)) {
+	($file_prefix,$file_ext) = ($filename =~ m/^(.*)(\..*?)$/);
+    }
+
+    return ($file_prefix,$file_ext);
+}
+
+# get full path and file only path from a base_dir (which may be empty) and 
+# file (which may contain directories)
+sub get_full_filenames {
+    my ($base_dir, $file) = @_;
+    
+    my $filename_full_path = $file;
+    # add on directory if present
+    $filename_full_path = &util::filename_cat ($base_dir, $file) if $base_dir =~ /\S/;
+    
+    my $filename_no_path = $file;
+
+    # remove directory if present
+    $filename_no_path =~ s/^.*[\/\\]//;
+    return ($filename_full_path, $filename_no_path);
+}
+
+# returns the path of a file without the filename -- ie. the directory the file is in
+sub filename_head {
+    my $filename = shift(@_);
+
+    if ($ENV{'GSDLOS'} =~ /^windows$/i) {
+	$filename =~ s/[^\\\\]*$//;
+    }
+    else {
+	$filename =~ s/[^\\\/]*$//;
+    }
+
+    return $filename;
+}
+
+
+
+# returns 1 if filename1 and filename2 point to the same
+# file or directory
+sub filenames_equal {
+    my ($filename1, $filename2) = @_;
+
+    # use filename_cat to clean up trailing slashes and 
+    # multiple slashes
+    $filename1 = filename_cat ($filename1);
+    $filename2 = filename_cat ($filename2);
+
+    # filenames not case sensitive on windows
+    if ($ENV{'GSDLOS'} =~ /^windows$/i) {
+	$filename1 =~ tr/[A-Z]/[a-z]/;
+	$filename2 =~ tr/[A-Z]/[a-z]/;
+    }
+    return 1 if $filename1 eq $filename2;
+    return 0;
+}
+
+
+sub filename_within_directory
+{
+    my ($filename,$within_dir) = @_;
+    
+    if ($within_dir !~ m/[\/\\]$/) {
+	my $dirsep = &util::get_dirsep();
+	$within_dir .= $dirsep;
+    }
+	
+    $within_dir =~ s/\\/\\\\/g; # escape DOS style file separator
+
+    if ($filename =~ m/^$within_dir(.*)$/) {
+	$filename = $1;
+    }
+    
+    return $filename;
+}
+
+sub filename_within_collection
+{
+    my ($filename) = @_;
+
+    my $collect_dir = $ENV{'GSDLCOLLECTDIR'};
+    
+    if (defined $collect_dir) {
+
+	# if from within GSDLCOLLECTDIR, then remove directory prefix
+	# so source_filename is realative to it.  This is done to aid
+	# portability, i.e. the collection can be moved to somewhere
+	# else on the file system and the archives directory will still
+	# work.  This is needed, for example in the applet version of
+	# GLI where GSDLHOME/collect on the server will be different to
+	# the collect directory of the remove user.  Of course,
+	# GSDLCOLLECTDIR subsequently needs to be put back on to turn
+	# it back into a full pathname.
+
+	$filename = filename_within_directory($filename,$collect_dir);
+    }
+    
+    return $filename;
+}
+
+sub prettyprint_file
+{
+    my ($base_dir,$file,$gli) = @_;
+
+    my $filename_full_path = &util::filename_cat($base_dir,$file);
+
+    if ($ENV{'GSDLOS'} =~ m/^windows$/i) {
+	require Win32;
+
+	# For some reason base_dir in the form c:/a/b/c
+	# This leads to confusion later on, so turn it back into
+	# the more usual Windows form
+	$base_dir =~ s/\//\\/g; 
+	my $long_base_dir = Win32::GetLongPathName($base_dir);
+	my $long_full_path = Win32::GetLongPathName($filename_full_path);
+
+	$file = filename_within_directory($long_full_path,$long_base_dir);
+	$file = encode("utf8",$file) if ($gli);
+    }
+
+    return $file;
+}
+
+
+sub upgrade_if_dos_filename
+{
+    my ($filename_full_path,$and_encode) = @_;
+
+    if ($ENV{'GSDLOS'} =~ m/^windows$/i) {
+	# Ensure any DOS-like filename, such as test~1.txt, has been upgraded
+	# to its long (Windows) version
+	my $long_filename = Win32::GetLongPathName($filename_full_path);
+	if (defined $long_filename) {
+	    $filename_full_path = $long_filename;
+	}
+	# Make sure initial drive letter is lower-case (to fit in with rest of Greenstone)
+	$filename_full_path =~ s/^(.):/\u$1:/;
+	if ((defined $and_encode) && ($and_encode)) {
+	    $filename_full_path = encode("utf8",$filename_full_path);
+	}
+    }
+
+    return $filename_full_path;
+}
+
+
+sub downgrade_if_dos_filename
+{
+    my ($filename_full_path) = @_;
+
+    if ($ENV{'GSDLOS'} =~ m/^windows$/i) {
+	require Win32;
+
+	# Ensure the given long Windows filename is in a form that can
+	# be opened by Perl => convert it to a short DOS-like filename
+
+	my $short_filename = Win32::GetShortPathName($filename_full_path);
+	if (defined $short_filename) {
+	    $filename_full_path = $short_filename;
+	}
+	# Make sure initial drive letter is lower-case (to fit in
+	# with rest of Greenstone)
+	$filename_full_path =~ s/^(.):/\u$1:/;
+    }
+
+    return $filename_full_path;
+}
+
+sub block_filename
+{
+    my ($block_hash,$filename) = @_;
+    
+    if ($ENV{'GSDLOS'} =~ m/^windows$/) {
+	
+	# lower case the entire thing, eg for cover.jpg when its actually cover.JPG
+	my $lower_filename = lc($filename);
+	$block_hash->{'file_blocks'}->{$lower_filename} = 1;
+#	my $lower_drive = $filename;
+#	$lower_drive =~ s/^([A-Z]):/\l$1:/i;
+	
+#	my $upper_drive = $filename;
+#	$upper_drive =~ s/^([A-Z]):/\u$1:/i;
+#	
+#	$block_hash->{'file_blocks'}->{$lower_drive} = 1;
+#	$block_hash->{'file_blocks'}->{$upper_drive} = 1;		
+    }
+    else {
+	$block_hash->{'file_blocks'}->{$filename} = 1;
+    }
+}
+
+
+sub filename_is_absolute
+{
+    my ($filename) = @_;
+
+    if ($ENV{'GSDLOS'} =~ /^windows$/i) {
+	return ($filename =~ m/^(\w:)?\\/);
+    }
+    else {
+	return ($filename =~ m/^\//);
+    }
+}
+
+
+## @method make_absolute()
+#
+#  Ensure the given file path is absolute in respect to the given base path.
+#
+#  @param  $base_dir A string denoting the base path the given dir must be
+#                    absolute to.
+#  @param  $dir The directory to be made absolute as a string. Note that the
+#               dir may already be absolute, in which case it will remain
+#               unchanged.
+#  @return The now absolute form of the directory as a string.
+#
+#  @author John Thompson, DL Consulting Ltd.
+#  @copy 2006 DL Consulting Ltd.
+#
+#used in buildcol.pl, doesn't work for all cases --kjdon
+sub make_absolute {
+    
+    my ($base_dir, $dir) = @_;
+###    print STDERR "dir = $dir\n";
+    $dir =~ s/[\\\/]+/\//g;
+    $dir = $base_dir . "/$dir" unless ($dir =~ m|^(\w:)?/|); 
+    $dir =~ s|^/tmp_mnt||;
+    1 while($dir =~ s|/[^/]*/\.\./|/|g);
+    $dir =~ s|/[.][.]?/|/|g;
+    $dir =~ tr|/|/|s;
+###    print STDERR "dir = $dir\n";
+    
+    return $dir;
+}
+## make_absolute() ##
+
+sub get_dirsep {
+
+    if ($ENV{'GSDLOS'} =~ /^windows$/i) {
+	return "\\";
+    } else {
+	return "\/";
+    }
+}
+
+sub get_os_dirsep {
+
+    if ($ENV{'GSDLOS'} =~ /^windows$/i) {
+	return "\\\\";
+    } else {
+	return "\\\/";
+    }
+}
+
+sub get_re_dirsep {
+
+    return "\\\\|\\\/";
+}
+
+
+sub get_dirsep_tail {
+    my ($filename) = @_;
+    
+    # returns last part of directory or filename
+    # On unix e.g. a/b.d => b.d
+    #              a/b/c => c
+
+    my $dirsep = get_re_dirsep();
+    my @dirs = split (/$dirsep/, $filename);
+    my $tail = pop @dirs;
+
+    # - caused problems under windows
+    #my ($tail) = ($filename =~ m/^(?:.*?$dirsep)?(.*?)$/); 
+
+    return $tail;
+}
+
+
+# if this is running on windows we want binaries to end in
+# .exe, otherwise they don't have to end in any extension
+sub get_os_exe {
+    return ".exe" if $ENV{'GSDLOS'} =~ /^windows$/i;
+    return "";
+}
+
+
+# test to see whether this is a big or little endian machine
+sub is_little_endian
+{
+    # To determine the name of the operating system, the variable $^O is a cheap alternative to pulling it out of the Config module;
+    # If it is a Macintosh machine (i.e. the Darwin operating system), regardless if it's running on the IBM power-pc cpu or the x86 Intel-based chip with a power-pc emulator running on top of it, it's big-endian
+    # Otherwise, it's little endian
+
+    #return 0 if $^O =~ /^darwin$/i;
+    #return 0 if $ENV{'GSDLOS'} =~ /^darwin$/i;
+    
+    # Going back to stating exactly whether the machine is little endian
+    # or big endian, without any special case for Macs. Since for rata it comes
+    # back with little endian and for shuttle with bigendian.
+    return (ord(substr(pack("s",1), 0, 1)) == 1);
+}
+
+
+# will return the collection name if successful, "" otherwise
+sub use_collection {
+    my ($collection, $collectdir) = @_;
+
+    if (!defined $collectdir || $collectdir eq "") {
+	$collectdir = &filename_cat ($ENV{'GSDLHOME'}, "collect");
+    }
+
+    # get and check the collection
+    if (!defined($collection) || $collection eq "") {
+	if (defined $ENV{'GSDLCOLLECTION'}) {
+	    $collection = $ENV{'GSDLCOLLECTION'};
+	} else {
+	    print STDOUT "No collection specified\n";
+	    return "";
+	}
+    }
+    
+    if ($collection eq "modelcol") {
+	print STDOUT "You can't use modelcol.\n";
+	return "";
+    }
+
+    # make sure the environment variables GSDLCOLLECTION and GSDLCOLLECTDIR
+    # are defined
+    $ENV{'GSDLCOLLECTION'} = $collection;
+    $ENV{'GSDLCOLLECTDIR'} = &filename_cat ($collectdir, $collection);
+
+    # make sure this collection exists
+    if (!-e $ENV{'GSDLCOLLECTDIR'}) {
+	print STDOUT "Invalid collection ($collection).\n";
+	return "";
+    }
+
+    # everything is ready to go
+    return $collection;
+}
+
+sub get_current_collection_name {
+    return $ENV{'GSDLCOLLECTION'};
+}
+
+
+# will return the collection name if successful, "" otherwise.  
+# Like use_collection (above) but for greenstone 3 (taking account of site level)
+
+sub use_site_collection {
+    my ($site, $collection, $collectdir) = @_;
+
+    if (!defined $collectdir || $collectdir eq "") {
+	die "GSDL3HOME not set.\n" unless defined $ENV{'GSDL3HOME'};
+	$collectdir = &filename_cat ($ENV{'GSDL3HOME'}, "sites", $site, "collect");
+    }
+
+    # collectdir explicitly set by this point (using $site variable if required).
+    # Can call "old" gsdl2 use_collection now.
+
+    return use_collection($collection,$collectdir);
+}
+
+
+
+sub locate_config_file
+{
+    my ($file) = @_;
+
+    my $locations = locate_config_files($file);
+
+    return shift @$locations; # returns undef if 'locations' is empty
+}
+
+
+sub locate_config_files
+{
+    my ($file) = @_;
+
+    my @locations = ();
+
+    if (-e $file) {
+	# Clearly specified (most likely full filename)
+	# No need to hunt in 'etc' directories, return value unchanged
+	push(@locations,$file);
+    }
+    else {
+	# Check for collection specific one before looking in global GSDL 'etc'
+	if (defined $ENV{'GSDLCOLLECTDIR'} && $ENV{'GSDLCOLLECTDIR'} ne "") {
+	    my $test_collect_etc_filename 
+		= &util::filename_cat($ENV{'GSDLCOLLECTDIR'},"etc", $file);
+	    
+	    if (-e $test_collect_etc_filename) {
+		push(@locations,$test_collect_etc_filename);
+	    }
+	}
+	my $test_main_etc_filename 
+	    = &util::filename_cat($ENV{'GSDLHOME'},"etc", $file);
+	if (-e $test_main_etc_filename) {
+	    push(@locations,$test_main_etc_filename);
+	}
+    }
+
+    return \@locations;
+}
+
+
+sub hyperlink_text
+{
+    my ($text) = @_;
+    
+    $text =~ s/(http:\/\/[^\s]+)/<a href=\"$1\">$1<\/a>/mg;
+    $text =~ s/(^|\s+)(www\.(\w|\.)+)/<a href=\"http:\/\/$2\">$2<\/a>/mg;
+
+    return $text;
+}
+
+
+# A method to check if a directory is empty (note that an empty directory still has non-zero size!!!) 
+# Code is from http://episteme.arstechnica.com/eve/forums/a/tpc/f/6330927813/m/436007700831
+sub is_dir_empty
+{
+    my ($path) = @_;
+    opendir DIR, $path;
+    while(my $entry = readdir DIR) {
+        next if($entry =~ /^\.\.?$/);
+        closedir DIR;
+        return 0;
+    }
+    closedir DIR;
+    return 1;
+}
+
+# Returns the given filename converted using either URL encoding or base64
+# encoding, as specified by $rename_method. If the given filename has no suffix
+# (if it is just the tailname), then $no_suffix should be some defined value.
+# rename_method can be url, none, base64 
+sub rename_file {
+    my ($filename, $rename_method, $no_suffix)  = @_;
+
+    if(!$filename) { # undefined or empty string
+	return $filename;
+    }
+
+    if (!$rename_method) {
+	print STDERR "WARNING: no file renaming method specified. Defaulting to using URL encoding...\n";
+	# Debugging information
+	# my ($cpackage,$cfilename,$cline,$csubr,$chas_args,$cwantarray) = caller(1);
+	# print STDERR "Called from method: $cfilename:$cline $cpackage->$csubr\n";
+	$rename_method = "url";
+    } elsif($rename_method eq "none") {
+	return $filename; # would have already been renamed
+    }
+
+    # No longer replace spaces with underscores, since underscores mess with incremental rebuild
+    ### Replace spaces with underscore. Do this first else it can go wrong below when getting tailname
+    ###$filename =~ s/ /_/g;
+
+    my ($tailname,$dirname,$suffix); 
+    if($no_suffix) { # given a tailname, no suffix
+	($tailname,$dirname) = File::Basename::fileparse($filename);
+    } 
+    else {
+	($tailname,$dirname,$suffix) = File::Basename::fileparse($filename, "\\.(?:[^\\.]+?)\$");
+    }
+    if (!$suffix) {
+	$suffix = "";
+    }
+    else {
+	$suffix = lc($suffix);
+    }
+
+    if ($rename_method eq "url") {
+	$tailname = &unicode::url_encode($tailname);
+    }
+    elsif ($rename_method eq "base64") {
+	$tailname = &unicode::base64_encode($tailname);
+	$tailname =~ s/\s*//sg;      # for some reason it adds spaces not just at end but also in middle
+    }
+
+    $filename = "$tailname$suffix";
+    $filename = "$dirname$filename" if ($dirname ne "./" && $dirname ne ".\\");
+
+    return $filename;
+}
+
+
+# BACKWARDS COMPATIBILITY: Just in case there are old .ldb/.bdb files
+sub rename_ldb_or_bdb_file {
+    my ($filename_no_ext) = @_;
+
+    my $new_filename = "$filename_no_ext.gdb";
+    return if (-f $new_filename); # if the file has the right extension, don't need to do anything
+    # try ldb
+    my $old_filename = "$filename_no_ext.ldb";
+    
+    if (-f $old_filename) {
+	print STDERR "Renaming $old_filename to $new_filename\n";
+	rename ($old_filename, $new_filename)
+	    || print STDERR "Rename failed: $!\n";
+	return;
+    }
+    # try bdb
+    $old_filename = "$filename_no_ext.bdb";
+    if (-f $old_filename) {
+	print STDERR "Renaming $old_filename to $new_filename\n";	
+	rename ($old_filename, $new_filename)
+	    || print STDERR "Rename failed: $!\n";
+	return;
+    }
+}
+
+
+# Returns the greenstone URL prefix extracted from the appropriate GS2/GS3 config file. 
+# By default, /greenstone3 for GS3 or /greenstone for GS2.
+sub get_greenstone_url_prefix() {
+    # if already set on a previous occasion, just return that
+    # (Don't want to keep repeating this: cost of re-opening and scanning files.)
+    return $ENV{'GREENSTONE_URL_PREFIX'} if($ENV{'GREENSTONE_URL_PREFIX'});
+
+    my ($configfile, $urlprefix, $defaultUrlprefix); 
+    my @propertynames = ();
+
+    if($ENV{'GSDL3SRCHOME'}) {
+	$defaultUrlprefix = "/greenstone3";
+	$configfile = &util::filename_cat($ENV{'GSDL3SRCHOME'}, "packages", "tomcat", "conf", "Catalina", "localhost", "greenstone3.xml");
+	push(@propertynames, qw/path\s*\=/);
+    } else {
+	$defaultUrlprefix = "/greenstone";
+	$configfile = &util::filename_cat($ENV{'GSDLHOME'}, "cgi-bin", "gsdlsite.cfg");
+	push(@propertynames, (qw/\nhttpprefix/, qw/\ngwcgi/)); # inspect one property then the other 
+    }
+
+    $urlprefix = &extract_propvalue_from_file($configfile, \@propertynames);
+
+    if(!$urlprefix) { # no values found for URL prefix, use default values
+	$urlprefix = $defaultUrlprefix;
+    } else {
+	#gwcgi can contain more than the wanted prefix, we split on / to get the first "directory" level
+	$urlprefix =~ s/^\///; # remove the starting slash
+	my @dirs = split(/(\\|\/)/, $urlprefix); 
+	$urlprefix = shift(@dirs);
+
+	if($urlprefix !~ m/^\//) { # in all cases: ensure the required forward slash is at the front
+	    $urlprefix = "/$urlprefix";
+	}
+    }
+
+    # set for the future
+    $ENV{'GREENSTONE_URL_PREFIX'} = $urlprefix;
+#    print STDERR "*** in get_greenstone_url_prefix(): $urlprefix\n\n";
+    return $urlprefix;
+}
+
+
+# Given a config file (xml or java properties file) and a list/array of regular expressions
+# that represent property names to match on, this function will return the value for the 1st
+# matching property name. If the return value is undefined, no matching property was found.
+sub extract_propvalue_from_file() {
+    my ($configfile, $propertynames) = @_;
+
+    my $value;
+    unless(open(FIN, "<$configfile")) { 
+	print STDERR "extract_propvalue_from_file(): Unable to open $configfile. $!\n";
+	return $value; # not initialised
+    }
+
+    # Read the entire file at once, as one single line, then close it
+    my $filecontents;
+    {
+	local $/ = undef;        
+	$filecontents = <FIN>;
+    }
+    close(FIN);
+
+    foreach my $regex (@$propertynames) {
+        ($value) = $filecontents=~ m/$regex\s*(\S*)/s; # read value of the property given by regex up to the 1st space
+	if($value) { 
+            $value =~ s/^\"//;     # remove any startquotes
+	    $value =~ s/\".*$//;   # remove the 1st endquotes (if any) followed by any xml
+	    last;		       # found value for a matching property, break from loop
+	}
+    }
+
+    return $value;
+}
+
+# Subroutine that sources setup.bash, given GSDLHOME and GSDLOS and
+# given that perllib is in @INC in order to invoke this subroutine.
+# Call as follows -- after setting up INC to include perllib and 
+# after setting up GSDLHOME and GSDLOS:
+#
+# require util;
+# &util::setup_greenstone_env($ENV{'GSDLHOME'}, $ENV{'GSDLOS'});
+#
+sub setup_greenstone_env() {
+	my ($GSDLHOME, $GSDLOS) = @_;
+
+	#my %env_map = ();
+	# Get the localised ENV settings of running a localised source setup.bash 
+	# and put it into the ENV here. Need to clear GSDLHOME before running setup
+	#my $perl_command = "(cd $GSDLHOME; export GSDLHOME=; . ./setup.bash > /dev/null; env)";
+	my $perl_command = "(cd $GSDLHOME; /bin/bash -c \"export GSDLHOME=; source setup.bash > /dev/null; env\")";		
+	if($GSDLOS =~ m/windows/i) {
+		#$perl_command = "cmd /C \"cd $GSDLHOME&& set GSDLHOME=&& setup.bat > nul&& set\"";
+		$perl_command = "(cd $GSDLHOME&& set GSDLHOME=&& setup.bat > nul&& set)";
+	}
+	if (!open(PIN, "$perl_command |")) {
+		print STDERR ("Unable to execute command: $perl_command. $!\n");
+	}
+
+	while (defined (my $perl_output_line = <PIN>)) {
+		my($key,$value) = ($perl_output_line =~ m/^([^=]*)[=](.*)$/);
+		#$env_map{$key}=$value;		
+		$ENV{$key}=$value;
+	}
+	close (PIN);
+
+	# If any keys in $ENV don't occur in Greenstone's localised env 
+	# (stored in $env_map), delete those entries from $ENV
+	#foreach $key (keys %ENV) {	
+	#	if(!defined $env_map{$key}) { 
+	#		print STDOUT "**** DELETING ENV KEY: $key\tVALUE: $ENV{'$key'}\n";
+	#		delete $ENV{$key}; # del $ENV(key, value) pair
+	#	}
+	#}
+	#undef %env_map;
+}
+
+sub get_perl_exec() {	
+	my $perl_exec = $^X; # may return just "perl"
+	
+	if($ENV{'PERLPATH'}) {
+		# OR: # $perl_exec = &util::filename_cat($ENV{'PERLPATH'},"perl");
+		if($ENV{'GSDLOS'} =~ m/windows/) {
+			$perl_exec = "$ENV{'PERLPATH'}\\Perl.exe";
+		} else {
+			$perl_exec = "$ENV{'PERLPATH'}/perl";
+		}
+	} else { # no PERLPATH, use Config{perlpath} else $^X: special variables
+		# containing the full path to the current perl executable we're using
+		$perl_exec = $Config{perlpath}; # configured path for perl
+		if (!-e $perl_exec) { # may not point to location on this machine
+			$perl_exec = $^X; # may return just "perl"
+			if($perl_exec =~ m/^perl/i) { # warn if just perl or Perl.exe
+				print STDERR "**** WARNING: Perl exec found contains no path: $perl_exec";				
+			}
+		}
+    }
+	
+	return $perl_exec;
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/webpageutil.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/webpageutil.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/perllib/webpageutil.pm	(revision 24799)
@@ -0,0 +1,25 @@
+package webpageutil;
+
+use ghtml;
+use strict;
+
+sub error_location
+{
+    my ($args,$text) = @_;
+
+    &ghtml::urlsafe($text);
+    my $mess_url = "$args->{'httpbuild'}&bca=mess&head=_headerror_";
+    print "Location: $mess_url&mess=$text\n\n";
+}
+
+sub status_location
+{
+    my ($args,$text,$tmpname,$bc1finished) = @_;
+
+    &ghtml::urlsafe($text);    
+    my $mess_url = "$args->{'httpbuild'}&bca=buildstatus";
+    $mess_url .= "&bc1tmpfilename=$tmpname&bc1finished=$bc1finished";
+    print "Location: $mess_url&mess=$text\n\n";
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/setup.bash
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/setup.bash	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/setup.bash	(revision 24799)
@@ -0,0 +1,58 @@
+# GEXTPARALLELBUILDING
+extdesc="parallel processor enabled collection building"
+
+full_setup=`pwd`/${BASH_SOURCE}
+fulldir=${full_setup%/*}
+fulldir=${fulldir%/.}
+
+if [ "x$GSDLHOME" = "x" ] ; then
+  if [ -e ../../setup.bash ] ; then
+    export gsopt_noexts=1 && pushd ../.. && source setup.bash && popd
+    export gsopt_noexts=
+  elif [ -e ../../gs3-setup.sh ] ; then
+    export gsopt_noexts=1 && pushd ../.. && source gs3-setup.sh && popd
+    export gsopt_noexts=
+  fi
+
+fi
+
+if [ "x$GEXTPARALLELBUILDING" = "x" ] ; then
+
+  export PARALLELBUILDINGOS=`uname -s | tr '[A-Z]' '[a-z]' | sed 's/\([0-9]\+\)\?_.*$//'`
+  export GEXTPARALLELBUILDING=$fulldir
+  export GEXTPARALLELBUILDING_INSTALLED=$GEXTPARALLELBUILDING/$GSDLOS
+
+  export PATH=$GEXTPARALLELBUILDING_INSTALLED/bin:$fulldir/bin/script:$PATH
+
+  if [ "x$CXXFLAGS" = "x" ] ; then
+    export CXXFLAGS="-I$GEXTPARALLELBUILDING_INSTALLED/include"
+  else
+    export CXXFLAGS="-I$GEXTPARALLELBUILDING_INSTALLED/include $CXXFLAGS"
+  fi
+
+  if [ "x$LD_LIBRARY_PATH" = "x" ] ; then
+    export LD_LIBRARY_PATH=$GEXTPARALLELBUILDING_INSTALLED/lib
+  else
+    export LD_LIBRARY_PATH=$GEXTPARALLELBUILDING_INSTALLED/lib:$LD_LIBRARY_PATH
+  fi
+
+  if [ "x$LDFLAGS" = "x" ] ; then
+    export LDFLAGS="-L$GEXTPARALLELBUILDING_INSTALLED/lib"
+  else
+    export LDFLAGS="-L$GEXTPARALLELBUILDING_INSTALLED/lib $LDFLAGS"
+  fi
+
+  extdir=${GEXTPARALLELBUILDING##*/}
+
+  if [ "x$GSDLEXTS" = "x" ] ; then
+    export GSDLEXTS=$extdir
+  else 
+    export GSDLEXTS=$GSDLEXTS:$extdir
+  fi
+
+  echo "+Your environment is now setup for $extdesc in Greenstone"
+else
+  echo "+Your environment is already setup for $extdesc in Greenstone"
+fi
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+list="MPIIMPORT MPIBUILDCOL TXT2DBL DB2TXTL GDBMCLI"
+
+for d in $list ; do
+  echo "    Running CASCADE-MAKE/$d.sh $*"
+
+  ./CASCADE-MAKE/$d.sh $*
+
+  if [ $? != 0 ] ; then
+    echo "  Error encountered running CASCADE-MAKE/$d.sh"
+    exit 1
+  fi
+done
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/CASCADE-MAKE/DB2TXTL.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/CASCADE-MAKE/DB2TXTL.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/CASCADE-MAKE/DB2TXTL.sh	(revision 24799)
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+package=db2txtl
+version=-src
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTPARALLELBUILDING ../.. $*
+
+prefix=$GEXTPARALLELBUILDING_INSTALLED
+
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/CASCADE-MAKE/GDBMCLI.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/CASCADE-MAKE/GDBMCLI.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/CASCADE-MAKE/GDBMCLI.sh	(revision 24799)
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+package=gdbmcli
+version=-src
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTPARALLELBUILDING ../.. $*
+
+prefix=$GEXTPARALLELBUILDING_INSTALLED
+
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/CASCADE-MAKE/MPIBUILDCOL.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/CASCADE-MAKE/MPIBUILDCOL.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/CASCADE-MAKE/MPIBUILDCOL.sh	(revision 24799)
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+package=mpibuildcol
+version=-src
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTPARALLELBUILDING ../.. $*
+
+prefix=$GEXTPARALLELBUILDING_INSTALLED
+
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/CASCADE-MAKE/MPIIMPORT.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/CASCADE-MAKE/MPIIMPORT.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/CASCADE-MAKE/MPIIMPORT.sh	(revision 24799)
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+package=mpiimport
+version=-src
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTPARALLELBUILDING ../.. $*
+
+prefix=$GEXTPARALLELBUILDING_INSTALLED
+
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/CASCADE-MAKE/TXT2DBL.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/CASCADE-MAKE/TXT2DBL.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/CASCADE-MAKE/TXT2DBL.sh	(revision 24799)
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+package=txt2dbl
+version=-src
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTPARALLELBUILDING ../.. $*
+
+prefix=$GEXTPARALLELBUILDING_INSTALLED
+
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/db2txtl-src/.svnignore
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/db2txtl-src/.svnignore	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/db2txtl-src/.svnignore	(revision 24799)
@@ -0,0 +1,6 @@
+Makefile
+autom4te.cache
+config.log
+config.status
+db2txtl
+.deps
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/db2txtl-src/Makefile.in
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/db2txtl-src/Makefile.in	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/db2txtl-src/Makefile.in	(revision 24799)
@@ -0,0 +1,84 @@
+###########################################################################
+#
+# Makefile -- parallel-building/src/db2txtl-src
+#
+# Standard db2txt (GDBM) executable but augmented with file locking so as
+# to support parallel reads/writes
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999-2008  The New Zealand Digital Library Project
+#
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+GSDL_DIR = ../../../..
+COMMON_DIR = $(GSDL_DIR)/common-src
+
+COMMON_PACKAGES_DIR = $(COMMON_DIR)/packages
+
+CXX = @CXX@
+CXXFLAGS = @CXXFLAGS@
+DEFS = @DEFS@ $(GDBM_DEFINES) $(JDBM_DEFINES) $(SQLITE_DEFINES)
+INCLUDES = . @GDBM_CFLAGS@ -I$(COMMON_DIR)/src/lib -I${GEXTPARALLELBUILDING_INSTALLED}/include
+INSTALL = @INSTALL@
+LDFLAGS = @LDFLAGS@ -L${GEXTPARALLELBUILDING_INSTALLED}/lib
+LIBS = -lm -lg @LIBS@ @GDBM_LIBS@ $(COMMON_DIR)/src/lib/gsdllib.a
+
+
+CXXCOMPILE = $(CXX) -c $(CXXFLAGS) $(DEFS) $(INCLUDES)
+CXXLINK = $(CXX) $(LDFLAGS) -o $@
+
+
+.SUFFIXES:
+.SUFFIXES: .cpp .o
+.cpp.o:
+	$(CXXCOMPILE) $<
+
+
+SOURCES = \
+	db2txtl.cpp
+
+OBJECTS = \
+	db2txtl.o
+
+EXECUTABLE_OBJECTS = \
+	$(OBJECTS)
+
+EXECUTABLE = db2txtl
+
+
+# Default target: make the db2txt executable
+all: $(EXECUTABLE)
+
+db2txtl: $(EXECUTABLE_OBJECTS)
+	$(CXXLINK) $(EXECUTABLE_OBJECTS) $(LIBS)
+
+install: $(EXECUTABLE)
+	$(INSTALL) -d ${GEXTPARALLELBUILDING_INSTALLED}/bin
+	$(INSTALL) -m 755 -s $(EXECUTABLE) ${GEXTPARALLELBUILDING_INSTALLED}/bin
+
+clean:
+	rm -f $(OBJECTS) $(EXECUTABLE)
+
+distclean:
+	rm -f $(OBJECTS) $(EXECUTABLE) Makefile
+
+depend:
+	makedepend -Y -- $(DEFS) $(INCLUDES) $(CXXFLAGS) -- $(SOURCES)
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/db2txtl-src/aclocal.m4
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/db2txtl-src/aclocal.m4	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/db2txtl-src/aclocal.m4	(revision 24799)
@@ -0,0 +1,951 @@
+# generated automatically by aclocal 1.11 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2007, 2008, 2009  Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],,
+[m4_warning([this file was generated for autoconf 2.68.
+You have another version of autoconf.  It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically `autoreconf'.])])
+
+# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.11'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version.  Point them to the right macro.
+m4_if([$1], [1.11], [],
+      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too.  Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.11])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 9
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 10
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
+       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
+       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+       [$1], UPC,  [depcc="$UPC"  am_compiler_list=],
+       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                   [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  am__universal=false
+  m4_case([$1], [CC],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac],
+    [CXX],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac])
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 5
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named `Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`AS_DIRNAME("$mf")`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running `make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`AS_DIRNAME(["$file"])`
+      AS_MKDIR_P([$dirpart/$fdir])
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled.  FIXME.  This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 16
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.62])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
+  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+	      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+			     [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+		  [_AM_DEPENDENCIES(CC)],
+		  [define([AC_PROG_CC],
+			  defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+		  [_AM_DEPENDENCIES(CXX)],
+		  [define([AC_PROG_CXX],
+			  defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+		  [_AM_DEPENDENCIES(OBJC)],
+		  [define([AC_PROG_OBJC],
+			  defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
+])
+_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
+dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
+dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
+dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+])
+
+dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Check to see how 'make' treats includes.	            -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2009  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 6
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check for `mkdir -p'.
+AC_DEFUN([AM_PROG_MKDIR_P],
+[AC_PREREQ([2.60])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
+dnl while keeping a definition of mkdir_p for backward compatibility.
+dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
+dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
+dnl Makefile.ins that do not define MKDIR_P, so we do our own
+dnl adjustment using top_builddir (which is defined more often than
+dnl MKDIR_P).
+AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
+case $mkdir_p in
+  [[\\/$]]* | ?:[[\\/]]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[[\\\"\#\$\&\'\`$am_lf]]*)
+    AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+  *[[\\\"\#\$\&\'\`$am_lf\ \	]]*)
+    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
+esac
+
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+   if test "$[*]" = "X"; then
+      # -L didn't work.
+      set X `ls -t "$srcdir/configure" conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$[*]" != "X $srcdir/configure conftest.file" \
+      && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+     [m4_case([$1], [ustar],, [pax],,
+              [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+  case $_am_tool in
+  gnutar)
+    for _am_tar in tar gnutar gtar;
+    do
+      AM_RUN_LOG([$_am_tar --version]) && break
+    done
+    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+    am__untar="$_am_tar -xf -"
+    ;;
+  plaintar)
+    # Must skip GNU tar: if it does not support --format= it doesn't create
+    # ustar tarball either.
+    (tar --version) >/dev/null 2>&1 && continue
+    am__tar='tar chf - "$$tardir"'
+    am__tar_='tar chf - "$tardir"'
+    am__untar='tar xf -'
+    ;;
+  pax)
+    am__tar='pax -L -x $1 -w "$$tardir"'
+    am__tar_='pax -L -x $1 -w "$tardir"'
+    am__untar='pax -r'
+    ;;
+  cpio)
+    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+    am__untar='cpio -i -H $1 -d'
+    ;;
+  none)
+    am__tar=false
+    am__tar_=false
+    am__untar=false
+    ;;
+  esac
+
+  # If the value was cached, stop now.  We just wanted to have am__tar
+  # and am__untar set.
+  test -n "${am_cv_prog_tar_$1}" && break
+
+  # tar/untar a dummy directory, and stop if the command works
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  echo GrepMe > conftest.dir/file
+  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+  rm -rf conftest.dir
+  if test -s conftest.tar; then
+    AM_RUN_LOG([$am__untar <conftest.tar])
+    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+  fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/db2txtl-src/config.guess
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/db2txtl-src/config.guess	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/db2txtl-src/config.guess	(revision 24799)
@@ -0,0 +1,1561 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+#   Free Software Foundation, Inc.
+
+timestamp='2009-04-27'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Originally written by Per Bothner <per@bothner.com>.
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int x;" > $dummy.c ;
+	for c in cc gcc c89 c99 ; do
+	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+	     CC_FOR_BUILD="$c"; break ;
+	  fi ;
+	done ;
+	if test x"$CC_FOR_BUILD" = x ; then
+	  CC_FOR_BUILD=no_compiler_found ;
+	fi
+	;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+	# NetBSD (nbsd) targets should (where applicable) match one or
+	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	#
+	# Note: NetBSD doesn't particularly care about the vendor
+	# portion of the name.  We always set it to "unknown".
+	sysctl="sysctl -n hw.machine_arch"
+	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+	case "${UNAME_MACHINE_ARCH}" in
+	    armeb) machine=armeb-unknown ;;
+	    arm*) machine=arm-unknown ;;
+	    sh3el) machine=shl-unknown ;;
+	    sh3eb) machine=sh-unknown ;;
+	    sh5el) machine=sh5le-unknown ;;
+	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+	esac
+	# The Operating System including object format, if it has switched
+	# to ELF recently, or will in the future.
+	case "${UNAME_MACHINE_ARCH}" in
+	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+		eval $set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep __ELF__ >/dev/null
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+	        os=netbsd
+		;;
+	esac
+	# The OS release
+	# Debian GNU/NetBSD machines have a different userland, and
+	# thus, need a distinct triplet. However, they do not need
+	# kernel version information, so it can be replaced with a
+	# suitable tag, in the style of linux-gnu.
+	case "${UNAME_VERSION}" in
+	    Debian*)
+		release='-gnu'
+		;;
+	    *)
+		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+		;;
+	esac
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	echo "${machine}-${os}${release}"
+	exit ;;
+    *:OpenBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+	exit ;;
+    *:ekkoBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+	exit ;;
+    *:SolidBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+	exit ;;
+    macppc:MirBSD:*:*)
+	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    *:MirBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    alpha:OSF1:*:*)
+	case $UNAME_RELEASE in
+	*4.0)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+		;;
+	*5.*)
+	        UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+		;;
+	esac
+	# According to Compaq, /usr/sbin/psrinfo has been available on
+	# OSF/1 and Tru64 systems produced since 1995.  I hope that
+	# covers most systems running today.  This code pipes the CPU
+	# types through head -n 1, so we only detect the type of CPU 0.
+	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+	case "$ALPHA_CPU_TYPE" in
+	    "EV4 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV4.5 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "LCA4 (21066/21068)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV5 (21164)")
+		UNAME_MACHINE="alphaev5" ;;
+	    "EV5.6 (21164A)")
+		UNAME_MACHINE="alphaev56" ;;
+	    "EV5.6 (21164PC)")
+		UNAME_MACHINE="alphapca56" ;;
+	    "EV5.7 (21164PC)")
+		UNAME_MACHINE="alphapca57" ;;
+	    "EV6 (21264)")
+		UNAME_MACHINE="alphaev6" ;;
+	    "EV6.7 (21264A)")
+		UNAME_MACHINE="alphaev67" ;;
+	    "EV6.8CB (21264C)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8AL (21264B)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8CX (21264D)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.9A (21264/EV69A)")
+		UNAME_MACHINE="alphaev69" ;;
+	    "EV7 (21364)")
+		UNAME_MACHINE="alphaev7" ;;
+	    "EV7.9 (21364A)")
+		UNAME_MACHINE="alphaev79" ;;
+	esac
+	# A Pn.n version is a patched version.
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	exit ;;
+    Alpha\ *:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# Should we change UNAME_MACHINE based on the output of uname instead
+	# of the specific Alpha model?
+	echo alpha-pc-interix
+	exit ;;
+    21064:Windows_NT:50:3)
+	echo alpha-dec-winnt3.5
+	exit ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-unknown-sysv4
+	exit ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-amigaos
+	exit ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-morphos
+	exit ;;
+    *:OS/390:*:*)
+	echo i370-ibm-openedition
+	exit ;;
+    *:z/VM:*:*)
+	echo s390-ibm-zvmoe
+	exit ;;
+    *:OS400:*:*)
+        echo powerpc-ibm-os400
+	exit ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit ;;
+    arm:riscos:*:*|arm:RISCOS:*:*)
+	echo arm-unknown-riscos
+	exit ;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit ;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit ;;
+    NILE*:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit ;;
+    DRS?6000:unix:4.0:6*)
+	echo sparc-icl-nx6
+	exit ;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+	case `/usr/bin/uname -p` in
+	    sparc) echo sparc-icl-nx7; exit ;;
+	esac ;;
+    s390x:SunOS:*:*)
+	echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4H:SunOS:5.*:*)
+	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+	eval $set_cc_for_build
+	SUN_ARCH="i386"
+	# If there is a compiler, see if it is configured for 64-bit objects.
+	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+	# This test works for both compilers.
+	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		grep IS_64BIT_ARCH >/dev/null
+	    then
+		SUN_ARCH="x86_64"
+	    fi
+	fi
+	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:*:*)
+	case "`/usr/bin/arch -k`" in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+	exit ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos${UNAME_RELEASE}
+	exit ;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+	case "`/bin/arch`" in
+	    sun3)
+		echo m68k-sun-sunos${UNAME_RELEASE}
+		;;
+	    sun4)
+		echo sparc-sun-sunos${UNAME_RELEASE}
+		;;
+	esac
+	exit ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos${UNAME_RELEASE}
+	exit ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+        exit ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+        echo m68k-milan-mint${UNAME_RELEASE}
+        exit ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+        echo m68k-hades-mint${UNAME_RELEASE}
+        exit ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+        echo m68k-unknown-mint${UNAME_RELEASE}
+        exit ;;
+    m68k:machten:*:*)
+	echo m68k-apple-machten${UNAME_RELEASE}
+	exit ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten${UNAME_RELEASE}
+	exit ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	echo clipper-intergraph-clix${UNAME_RELEASE}
+	exit ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c &&
+	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+	  SYSTEM_NAME=`$dummy $dummyarg` &&
+	    { echo "$SYSTEM_NAME"; exit; }
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit ;;
+    Motorola:PowerMAX_OS:*:*)
+	echo powerpc-motorola-powermax
+	exit ;;
+    Motorola:*:4.3:PL8-*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+	then
+	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+	       [ ${TARGET_BINARY_INTERFACE}x = x ]
+	    then
+		echo m88k-dg-dgux${UNAME_RELEASE}
+	    else
+		echo m88k-dg-dguxbcs${UNAME_RELEASE}
+	    fi
+	else
+	    echo i586-dg-dgux${UNAME_RELEASE}
+	fi
+ 	exit ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+	exit ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
+	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+	echo i386-ibm-aix
+	exit ;;
+    ia64:AIX:*:*)
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		eval $set_cc_for_build
+		sed 's/^		//' << EOF >$dummy.c
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+		then
+			echo "$SYSTEM_NAME"
+		else
+			echo rs6000-ibm-aix3.2.5
+		fi
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		echo rs6000-ibm-aix3.2.4
+	else
+		echo rs6000-ibm-aix3.2
+	fi
+	exit ;;
+    *:AIX:*:[456])
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+	echo romp-ibm-bsd4.4
+	exit ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+	exit ;;                             # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit ;;
+    9000/[34678]??:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+		if [ -x /usr/bin/getconf ]; then
+		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+                    case "${sc_cpu_version}" in
+                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+                      532)                      # CPU_PA_RISC2_0
+                        case "${sc_kernel_bits}" in
+                          32) HP_ARCH="hppa2.0n" ;;
+                          64) HP_ARCH="hppa2.0w" ;;
+			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+                        esac ;;
+                    esac
+		fi
+		if [ "${HP_ARCH}" = "" ]; then
+		    eval $set_cc_for_build
+		    sed 's/^              //' << EOF >$dummy.c
+
+              #define _HPUX_SOURCE
+              #include <stdlib.h>
+              #include <unistd.h>
+
+              int main ()
+              {
+              #if defined(_SC_KERNEL_BITS)
+                  long bits = sysconf(_SC_KERNEL_BITS);
+              #endif
+                  long cpu  = sysconf (_SC_CPU_VERSION);
+
+                  switch (cpu)
+              	{
+              	case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+              	case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+              	case CPU_PA_RISC2_0:
+              #if defined(_SC_KERNEL_BITS)
+              	    switch (bits)
+              		{
+              		case 64: puts ("hppa2.0w"); break;
+              		case 32: puts ("hppa2.0n"); break;
+              		default: puts ("hppa2.0"); break;
+              		} break;
+              #else  /* !defined(_SC_KERNEL_BITS) */
+              	    puts ("hppa2.0"); break;
+              #endif
+              	default: puts ("hppa1.0"); break;
+              	}
+                  exit (0);
+              }
+EOF
+		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+		    test -z "$HP_ARCH" && HP_ARCH=hppa
+		fi ;;
+	esac
+	if [ ${HP_ARCH} = "hppa2.0w" ]
+	then
+	    eval $set_cc_for_build
+
+	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+	    # generating 64-bit code.  GNU and HP use different nomenclature:
+	    #
+	    # $ CC_FOR_BUILD=cc ./config.guess
+	    # => hppa2.0w-hp-hpux11.23
+	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+	    # => hppa64-hp-hpux11.23
+
+	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+		grep __LP64__ >/dev/null
+	    then
+		HP_ARCH="hppa2.0w"
+	    else
+		HP_ARCH="hppa64"
+	    fi
+	fi
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit ;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ia64-hp-hpux${HPUX_REV}
+	exit ;;
+    3050*:HI-UX:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+		{ echo "$SYSTEM_NAME"; exit; }
+	echo unknown-hitachi-hiuxwe2
+	exit ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+	echo hppa1.0-hp-mpeix
+	exit ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit ;;
+    i*86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo ${UNAME_MACHINE}-unknown-osf1mk
+	else
+	    echo ${UNAME_MACHINE}-unknown-osf1
+	fi
+	exit ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+        exit ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+        exit ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+        exit ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+        exit ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+        exit ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*[A-Z]90:*:*:*)
+	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+	      -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*T3E:*:*:*)
+	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*SV1:*:*:*)
+	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    *:UNICOS/mp:*:*)
+	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit ;;
+    5000:UNIX_System_V:4.*:*)
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+	exit ;;
+    sparc*:BSD/OS:*:*)
+	echo sparc-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:FreeBSD:*:*)
+	case ${UNAME_MACHINE} in
+	    pc98)
+		echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    amd64)
+		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    *)
+		echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	esac
+	exit ;;
+    i*:CYGWIN*:*)
+	echo ${UNAME_MACHINE}-pc-cygwin
+	exit ;;
+    *:MINGW*:*)
+	echo ${UNAME_MACHINE}-pc-mingw32
+	exit ;;
+    i*:windows32*:*)
+    	# uname -m includes "-pc" on this system.
+    	echo ${UNAME_MACHINE}-mingw32
+	exit ;;
+    i*:PW*:*)
+	echo ${UNAME_MACHINE}-pc-pw32
+	exit ;;
+    *:Interix*:[3456]*)
+    	case ${UNAME_MACHINE} in
+	    x86)
+		echo i586-pc-interix${UNAME_RELEASE}
+		exit ;;
+	    EM64T | authenticamd | genuineintel)
+		echo x86_64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	    IA64)
+		echo ia64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	esac ;;
+    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+	echo i${UNAME_MACHINE}-pc-mks
+	exit ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+	# UNAME_MACHINE based on the output of uname instead of i386?
+	echo i586-pc-interix
+	exit ;;
+    i*:UWIN*:*)
+	echo ${UNAME_MACHINE}-pc-uwin
+	exit ;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+	echo x86_64-unknown-cygwin
+	exit ;;
+    p*:CYGWIN*:*)
+	echo powerpcle-unknown-cygwin
+	exit ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    *:GNU:*:*)
+	# the GNU system
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit ;;
+    *:GNU/*:*:*)
+	# other systems with GNU libc and userland
+	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+	exit ;;
+    i*86:Minix:*:*)
+	echo ${UNAME_MACHINE}-pc-minix
+	exit ;;
+    arm*:Linux:*:*)
+	eval $set_cc_for_build
+	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+	    | grep -q __ARM_EABI__
+	then
+	    echo ${UNAME_MACHINE}-unknown-linux-gnu
+	else
+	    echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+	fi
+	exit ;;
+    avr32*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    cris:Linux:*:*)
+	echo cris-axis-linux-gnu
+	exit ;;
+    crisv32:Linux:*:*)
+	echo crisv32-axis-linux-gnu
+	exit ;;
+    frv:Linux:*:*)
+    	echo frv-unknown-linux-gnu
+	exit ;;
+    ia64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m32r*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m68*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    mips:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef mips
+	#undef mipsel
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=mipsel
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=mips
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+	    /^CPU/{
+		s: ::g
+		p
+	    }'`"
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+	;;
+    mips64:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef mips64
+	#undef mips64el
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=mips64el
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=mips64
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+	    /^CPU/{
+		s: ::g
+		p
+	    }'`"
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+	;;
+    or32:Linux:*:*)
+	echo or32-unknown-linux-gnu
+	exit ;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-gnu
+	exit ;;
+    ppc64:Linux:*:*)
+	echo powerpc64-unknown-linux-gnu
+	exit ;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev68 ;;
+        esac
+	objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+	exit ;;
+    padre:Linux:*:*)
+	echo sparc-unknown-linux-gnu
+	exit ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
+	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
+	  *)    echo hppa-unknown-linux-gnu ;;
+	esac
+	exit ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-gnu
+	exit ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	echo ${UNAME_MACHINE}-ibm-linux
+	exit ;;
+    sh64*:Linux:*:*)
+    	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    sh*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    vax:Linux:*:*)
+	echo ${UNAME_MACHINE}-dec-linux-gnu
+	exit ;;
+    x86_64:Linux:*:*)
+	echo x86_64-unknown-linux-gnu
+	exit ;;
+    xtensa*:Linux:*:*)
+    	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    i*86:Linux:*:*)
+	# The BFD linker knows what the default object file format is, so
+	# first see if it will tell us. cd to the root directory to prevent
+	# problems with other programs or directories called `ld' in the path.
+	# Set LC_ALL=C to ensure ld outputs messages in English.
+	ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+			 | sed -ne '/supported targets:/!d
+				    s/[ 	][ 	]*/ /g
+				    s/.*supported targets: *//
+				    s/ .*//
+				    p'`
+        case "$ld_supported_targets" in
+	  elf32-i386)
+		TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+		;;
+	  a.out-i386-linux)
+		echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+		exit ;;
+	  "")
+		# Either a pre-BFD a.out linker (linux-gnuoldld) or
+		# one that does not give us useful --help.
+		echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+		exit ;;
+	esac
+	# Determine whether the default compiler is a.out or elf
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <features.h>
+	#ifdef __ELF__
+	# ifdef __GLIBC__
+	#  if __GLIBC__ >= 2
+	LIBC=gnu
+	#  else
+	LIBC=gnulibc1
+	#  endif
+	# else
+	LIBC=gnulibc1
+	# endif
+	#else
+	#if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+	LIBC=gnu
+	#else
+	LIBC=gnuaout
+	#endif
+	#endif
+	#ifdef __dietlibc__
+	LIBC=dietlibc
+	#endif
+EOF
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+	    /^LIBC/{
+		s: ::g
+		p
+	    }'`"
+	test x"${LIBC}" != x && {
+		echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+		exit
+	}
+	test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
+	;;
+    i*86:DYNIX/ptx:4*:*)
+	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+	# earlier versions are messed up and put the nodename in both
+	# sysname and nodename.
+	echo i386-sequent-sysv4
+	exit ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+        # Unixware is an offshoot of SVR4, but it has its own version
+        # number series starting with 2...
+        # I am not positive that other SVR4 systems won't match this,
+	# I just have to hope.  -- rms.
+        # Use sysv4.2uw... so that sysv4* matches it.
+	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+	exit ;;
+    i*86:OS/2:*:*)
+	# If we were able to find `uname', then EMX Unix compatibility
+	# is probably installed.
+	echo ${UNAME_MACHINE}-pc-os2-emx
+	exit ;;
+    i*86:XTS-300:*:STOP)
+	echo ${UNAME_MACHINE}-unknown-stop
+	exit ;;
+    i*86:atheos:*:*)
+	echo ${UNAME_MACHINE}-unknown-atheos
+	exit ;;
+    i*86:syllable:*:*)
+	echo ${UNAME_MACHINE}-pc-syllable
+	exit ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+	echo i386-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    i*86:*DOS:*:*)
+	echo ${UNAME_MACHINE}-pc-msdosdjgpp
+	exit ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+	else
+		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+	fi
+	exit ;;
+    i*86:*:5:[678]*)
+    	# UnixWare 7.x, OpenUNIX and OpenServer 6.
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	exit ;;
+    i*86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-pc-sysv32
+	fi
+	exit ;;
+    pc:*:*:*)
+	# Left here for compatibility:
+        # uname -m prints for DJGPP always 'pc', but it prints nothing about
+        # the processor, so we play safe by assuming i586.
+	# Note: whatever this is, it MUST be the same as what config.sub
+	# prints for the "djgpp" host, or else GDB configury will decide that
+	# this is a cross-build.
+	echo i586-pc-msdosdjgpp
+        exit ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit ;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	fi
+	exit ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+	echo m68k-convergent-sysv
+	exit ;;
+    M680?0:D-NIX:5.3:*)
+	echo m68k-diab-dnix
+	exit ;;
+    M68*:*:R3V[5678]*:*)
+	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && { echo i486-ncr-sysv4; exit; } ;;
+    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+	OS_REL='.3'
+	test -r /etc/.relid \
+	    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+	echo m68k-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    rs6000:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+	echo powerpc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv${UNAME_RELEASE}
+	exit ;;
+    RM*:ReliantUNIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		echo ${UNAME_MACHINE}-sni-sysv4
+	else
+		echo ns32k-sni-sysv
+	fi
+	exit ;;
+    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                      # says <Richard.M.Bartel@ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes@openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit ;;
+    *:*:*:FTX*)
+	# From seanf@swdc.stratus.com.
+	echo i860-stratus-sysv4
+	exit ;;
+    i*86:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo ${UNAME_MACHINE}-stratus-vos
+	exit ;;
+    *:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo hppa1.1-stratus-vos
+	exit ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux${UNAME_RELEASE}
+	exit ;;
+    news*:NEWS-OS:6*:*)
+	echo mips-sony-newsos6
+	exit ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+	if [ -d /usr/nec ]; then
+	        echo mips-nec-sysv${UNAME_RELEASE}
+	else
+	        echo mips-unknown-sysv${UNAME_RELEASE}
+	fi
+        exit ;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	echo powerpc-be-beos
+	exit ;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	echo powerpc-apple-beos
+	exit ;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	echo i586-pc-beos
+	exit ;;
+    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
+	echo i586-pc-haiku
+	exit ;;
+    SX-4:SUPER-UX:*:*)
+	echo sx4-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-5:SUPER-UX:*:*)
+	echo sx5-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-6:SUPER-UX:*:*)
+	echo sx6-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-7:SUPER-UX:*:*)
+	echo sx7-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8:SUPER-UX:*:*)
+	echo sx8-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8R:SUPER-UX:*:*)
+	echo sx8r-nec-superux${UNAME_RELEASE}
+	exit ;;
+    Power*:Rhapsody:*:*)
+	echo powerpc-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Rhapsody:*:*)
+	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Darwin:*:*)
+	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+	case $UNAME_PROCESSOR in
+	    unknown) UNAME_PROCESSOR=powerpc ;;
+	esac
+	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+	exit ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	UNAME_PROCESSOR=`uname -p`
+	if test "$UNAME_PROCESSOR" = "x86"; then
+		UNAME_PROCESSOR=i386
+		UNAME_MACHINE=pc
+	fi
+	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+	exit ;;
+    *:QNX:*:4*)
+	echo i386-pc-qnx
+	exit ;;
+    NSE-?:NONSTOP_KERNEL:*:*)
+	echo nse-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSR-?:NONSTOP_KERNEL:*:*)
+	echo nsr-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    *:NonStop-UX:*:*)
+	echo mips-compaq-nonstopux
+	exit ;;
+    BS2000:POSIX*:*:*)
+	echo bs2000-siemens-sysv
+	exit ;;
+    DS/*:UNIX_System_V:*:*)
+	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+	exit ;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	if test "$cputype" = "386"; then
+	    UNAME_MACHINE=i386
+	else
+	    UNAME_MACHINE="$cputype"
+	fi
+	echo ${UNAME_MACHINE}-unknown-plan9
+	exit ;;
+    *:TOPS-10:*:*)
+	echo pdp10-unknown-tops10
+	exit ;;
+    *:TENEX:*:*)
+	echo pdp10-unknown-tenex
+	exit ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	echo pdp10-dec-tops20
+	exit ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	echo pdp10-xkl-tops20
+	exit ;;
+    *:TOPS-20:*:*)
+	echo pdp10-unknown-tops20
+	exit ;;
+    *:ITS:*:*)
+	echo pdp10-unknown-its
+	exit ;;
+    SEI:*:*:SEIUX)
+        echo mips-sei-seiux${UNAME_RELEASE}
+	exit ;;
+    *:DragonFly:*:*)
+	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit ;;
+    *:*VMS:*:*)
+    	UNAME_MACHINE=`(uname -p) 2>/dev/null`
+	case "${UNAME_MACHINE}" in
+	    A*) echo alpha-dec-vms ; exit ;;
+	    I*) echo ia64-dec-vms ; exit ;;
+	    V*) echo vax-dec-vms ; exit ;;
+	esac ;;
+    *:XENIX:*:SysV)
+	echo i386-pc-xenix
+	exit ;;
+    i*86:skyos:*:*)
+	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+	exit ;;
+    i*86:rdos:*:*)
+	echo ${UNAME_MACHINE}-pc-rdos
+	exit ;;
+    i*86:AROS:*:*)
+	echo ${UNAME_MACHINE}-pc-aros
+	exit ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+          "4"
+#else
+	  ""
+#endif
+         ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+	printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+	printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# else
+    printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+	{ echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+	echo c1-convex-bsd
+	exit ;;
+    c2*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit ;;
+    c34*)
+	echo c34-convex-bsd
+	exit ;;
+    c38*)
+	echo c38-convex-bsd
+	exit ;;
+    c4*)
+	echo c4-convex-bsd
+	exit ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+and
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/db2txtl-src/config.sub
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/db2txtl-src/config.sub	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/db2txtl-src/config.sub	(revision 24799)
@@ -0,0 +1,1686 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+#   Free Software Foundation, Inc.
+
+timestamp='2009-04-17'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
+  uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
+  kopensolaris*-gnu* | \
+  storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+	-sun*os*)
+		# Prevent following clause from handling this invalid input.
+		;;
+	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+	-apple | -axis | -knuth | -cray)
+		os=
+		basic_machine=$1
+		;;
+	-sim | -cisco | -oki | -wec | -winbond)
+		os=
+		basic_machine=$1
+		;;
+	-scout)
+		;;
+	-wrs)
+		os=-vxworks
+		basic_machine=$1
+		;;
+	-chorusos*)
+		os=-chorusos
+		basic_machine=$1
+		;;
+ 	-chorusrdb)
+ 		os=-chorusrdb
+		basic_machine=$1
+ 		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco6)
+		os=-sco5v6
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5)
+		os=-sco3.2v5
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5v6*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-udk*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-lynx*)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-windowsnt*)
+		os=`echo $os | sed -e 's/windowsnt/winnt/'`
+		;;
+	-psos*)
+		os=-psos
+		;;
+	-mint | -mint[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+	# Recognize the basic CPU types without company name.
+	# Some are omitted here because they have special meanings below.
+	1750a | 580 \
+	| a29k \
+	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+	| am33_2.0 \
+	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+	| bfin \
+	| c4x | clipper \
+	| d10v | d30v | dlx | dsp16xx \
+	| fido | fr30 | frv \
+	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| i370 | i860 | i960 | ia64 \
+	| ip2k | iq2000 \
+	| lm32 \
+	| m32c | m32r | m32rle | m68000 | m68k | m88k \
+	| maxq | mb | microblaze | mcore | mep | metag \
+	| mips | mipsbe | mipseb | mipsel | mipsle \
+	| mips16 \
+	| mips64 | mips64el \
+	| mips64octeon | mips64octeonel \
+	| mips64orion | mips64orionel \
+	| mips64r5900 | mips64r5900el \
+	| mips64vr | mips64vrel \
+	| mips64vr4100 | mips64vr4100el \
+	| mips64vr4300 | mips64vr4300el \
+	| mips64vr5000 | mips64vr5000el \
+	| mips64vr5900 | mips64vr5900el \
+	| mipsisa32 | mipsisa32el \
+	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa64 | mipsisa64el \
+	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64sb1 | mipsisa64sb1el \
+	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipstx39 | mipstx39el \
+	| mn10200 | mn10300 \
+	| moxie \
+	| mt \
+	| msp430 \
+	| nios | nios2 \
+	| ns16k | ns32k \
+	| or32 \
+	| pdp10 | pdp11 | pj | pjl \
+	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+	| pyramid \
+	| score \
+	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+	| sh64 | sh64le \
+	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+	| spu | strongarm \
+	| tahoe | thumb | tic4x | tic80 | tron \
+	| v850 | v850e \
+	| we32k \
+	| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
+	| z8k | z80)
+		basic_machine=$basic_machine-unknown
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12)
+		# Motorola 68HC11/12.
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+		;;
+	ms1)
+		basic_machine=mt-unknown
+		;;
+
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i*86 | x86_64)
+	  basic_machine=$basic_machine-pc
+	  ;;
+	# Object if more than one company name word.
+	*-*-*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+	# Recognize the basic CPU types with company name.
+	580-* \
+	| a29k-* \
+	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+	| avr-* | avr32-* \
+	| bfin-* | bs2000-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+	| clipper-* | craynv-* | cydra-* \
+	| d10v-* | d30v-* | dlx-* \
+	| elxsi-* \
+	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+	| h8300-* | h8500-* \
+	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| i*86-* | i860-* | i960-* | ia64-* \
+	| ip2k-* | iq2000-* \
+	| lm32-* \
+	| m32c-* | m32r-* | m32rle-* \
+	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
+	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+	| mips16-* \
+	| mips64-* | mips64el-* \
+	| mips64octeon-* | mips64octeonel-* \
+	| mips64orion-* | mips64orionel-* \
+	| mips64r5900-* | mips64r5900el-* \
+	| mips64vr-* | mips64vrel-* \
+	| mips64vr4100-* | mips64vr4100el-* \
+	| mips64vr4300-* | mips64vr4300el-* \
+	| mips64vr5000-* | mips64vr5000el-* \
+	| mips64vr5900-* | mips64vr5900el-* \
+	| mipsisa32-* | mipsisa32el-* \
+	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa64-* | mipsisa64el-* \
+	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64sb1-* | mipsisa64sb1el-* \
+	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipstx39-* | mipstx39el-* \
+	| mmix-* \
+	| mt-* \
+	| msp430-* \
+	| nios-* | nios2-* \
+	| none-* | np1-* | ns16k-* | ns32k-* \
+	| orion-* \
+	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+	| pyramid-* \
+	| romp-* | rs6000-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+	| sparclite-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
+	| tahoe-* | thumb-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \
+	| tron-* \
+	| v850-* | v850e-* | vax-* \
+	| we32k-* \
+	| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
+	| xstormy16-* | xtensa*-* \
+	| ymp-* \
+	| z8k-* | z80-*)
+		;;
+	# Recognize the basic CPU types without company name, with glob match.
+	xtensa*)
+		basic_machine=$basic_machine-unknown
+		;;
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	386bsd)
+		basic_machine=i386-unknown
+		os=-bsd
+		;;
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		basic_machine=m68000-att
+		;;
+	3b*)
+		basic_machine=we32k-att
+		;;
+	a29khif)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+    	abacus)
+		basic_machine=abacus-unknown
+		;;
+	adobe68k)
+		basic_machine=m68010-adobe
+		os=-scout
+		;;
+	alliant | fx80)
+		basic_machine=fx80-alliant
+		;;
+	altos | altos3068)
+		basic_machine=m68k-altos
+		;;
+	am29k)
+		basic_machine=a29k-none
+		os=-bsd
+		;;
+	amd64)
+		basic_machine=x86_64-pc
+		;;
+	amd64-*)
+		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	amdahl)
+		basic_machine=580-amdahl
+		os=-sysv
+		;;
+	amiga | amiga-*)
+		basic_machine=m68k-unknown
+		;;
+	amigaos | amigados)
+		basic_machine=m68k-unknown
+		os=-amigaos
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-unknown
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	apollo68bsd)
+		basic_machine=m68k-apollo
+		os=-bsd
+		;;
+	aros)
+		basic_machine=i386-pc
+		os=-aros
+		;;
+	aux)
+		basic_machine=m68k-apple
+		os=-aux
+		;;
+	balance)
+		basic_machine=ns32k-sequent
+		os=-dynix
+		;;
+	blackfin)
+		basic_machine=bfin-unknown
+		os=-linux
+		;;
+	blackfin-*)
+		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	c90)
+		basic_machine=c90-cray
+		os=-unicos
+		;;
+        cegcc)
+		basic_machine=arm-unknown
+		os=-cegcc
+		;;
+	convex-c1)
+		basic_machine=c1-convex
+		os=-bsd
+		;;
+	convex-c2)
+		basic_machine=c2-convex
+		os=-bsd
+		;;
+	convex-c32)
+		basic_machine=c32-convex
+		os=-bsd
+		;;
+	convex-c34)
+		basic_machine=c34-convex
+		os=-bsd
+		;;
+	convex-c38)
+		basic_machine=c38-convex
+		os=-bsd
+		;;
+	cray | j90)
+		basic_machine=j90-cray
+		os=-unicos
+		;;
+	craynv)
+		basic_machine=craynv-cray
+		os=-unicosmp
+		;;
+	cr16)
+		basic_machine=cr16-unknown
+		os=-elf
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	crisv32 | crisv32-* | etraxfs*)
+		basic_machine=crisv32-axis
+		;;
+	cris | cris-* | etrax*)
+		basic_machine=cris-axis
+		;;
+	crx)
+		basic_machine=crx-unknown
+		os=-elf
+		;;
+	da30 | da30-*)
+		basic_machine=m68k-da30
+		;;
+	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+		basic_machine=mips-dec
+		;;
+	decsystem10* | dec10*)
+		basic_machine=pdp10-dec
+		os=-tops10
+		;;
+	decsystem20* | dec20*)
+		basic_machine=pdp10-dec
+		os=-tops20
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		basic_machine=m68k-motorola
+		;;
+	delta88)
+		basic_machine=m88k-motorola
+		os=-sysv3
+		;;
+	dicos)
+		basic_machine=i686-pc
+		os=-dicos
+		;;
+	djgpp)
+		basic_machine=i586-pc
+		os=-msdosdjgpp
+		;;
+	dpx20 | dpx20-*)
+		basic_machine=rs6000-bull
+		os=-bosx
+		;;
+	dpx2* | dpx2*-bull)
+		basic_machine=m68k-bull
+		os=-sysv3
+		;;
+	ebmon29k)
+		basic_machine=a29k-amd
+		os=-ebmon
+		;;
+	elxsi)
+		basic_machine=elxsi-elxsi
+		os=-bsd
+		;;
+	encore | umax | mmax)
+		basic_machine=ns32k-encore
+		;;
+	es1800 | OSE68k | ose68k | ose | OSE)
+		basic_machine=m68k-ericsson
+		os=-ose
+		;;
+	fx2800)
+		basic_machine=i860-alliant
+		;;
+	genix)
+		basic_machine=ns32k-ns
+		;;
+	gmicro)
+		basic_machine=tron-gmicro
+		os=-sysv
+		;;
+	go32)
+		basic_machine=i386-pc
+		os=-go32
+		;;
+	h3050r* | hiux*)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	h8300hms)
+		basic_machine=h8300-hitachi
+		os=-hms
+		;;
+	h8300xray)
+		basic_machine=h8300-hitachi
+		os=-xray
+		;;
+	h8500hms)
+		basic_machine=h8500-hitachi
+		os=-hms
+		;;
+	harris)
+		basic_machine=m88k-harris
+		os=-sysv3
+		;;
+	hp300-*)
+		basic_machine=m68k-hp
+		;;
+	hp300bsd)
+		basic_machine=m68k-hp
+		os=-bsd
+		;;
+	hp300hpux)
+		basic_machine=m68k-hp
+		os=-hpux
+		;;
+	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		basic_machine=m68000-hp
+		;;
+	hp9k3[2-9][0-9])
+		basic_machine=m68k-hp
+		;;
+	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k78[0-9] | hp78[0-9])
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][13679] | hp8[0-9][13679])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hppa-next)
+		os=-nextstep3
+		;;
+	hppaosf)
+		basic_machine=hppa1.1-hp
+		os=-osf
+		;;
+	hppro)
+		basic_machine=hppa1.1-hp
+		os=-proelf
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+	i*86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv32
+		;;
+	i*86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv4
+		;;
+	i*86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv
+		;;
+	i*86sol2)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-solaris2
+		;;
+	i386mach)
+		basic_machine=i386-mach
+		os=-mach
+		;;
+	i386-vsta | vsta)
+		basic_machine=i386-unknown
+		os=-vsta
+		;;
+	iris | iris4d)
+		basic_machine=mips-sgi
+		case $os in
+		    -irix*)
+			;;
+		    *)
+			os=-irix4
+			;;
+		esac
+		;;
+	isi68 | isi)
+		basic_machine=m68k-isi
+		os=-sysv
+		;;
+	m68knommu)
+		basic_machine=m68k-unknown
+		os=-linux
+		;;
+	m68knommu-*)
+		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	m88k-omron*)
+		basic_machine=m88k-omron
+		;;
+	magnum | m3230)
+		basic_machine=mips-mips
+		os=-sysv
+		;;
+	merlin)
+		basic_machine=ns32k-utek
+		os=-sysv
+		;;
+	mingw32)
+		basic_machine=i386-pc
+		os=-mingw32
+		;;
+	mingw32ce)
+		basic_machine=arm-unknown
+		os=-mingw32ce
+		;;
+	miniframe)
+		basic_machine=m68000-convergent
+		;;
+	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+	mips3*-*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	monitor)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	morphos)
+		basic_machine=powerpc-unknown
+		os=-morphos
+		;;
+	msdos)
+		basic_machine=i386-pc
+		os=-msdos
+		;;
+	ms1-*)
+		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+		;;
+	mvs)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	netbsd386)
+		basic_machine=i386-unknown
+		os=-netbsd
+		;;
+	netwinder)
+		basic_machine=armv4l-rebel
+		os=-linux
+		;;
+	news | news700 | news800 | news900)
+		basic_machine=m68k-sony
+		os=-newsos
+		;;
+	news1000)
+		basic_machine=m68030-sony
+		os=-newsos
+		;;
+	news-3600 | risc-news)
+		basic_machine=mips-sony
+		os=-newsos
+		;;
+	necv70)
+		basic_machine=v70-nec
+		os=-sysv
+		;;
+	next | m*-next )
+		basic_machine=m68k-next
+		case $os in
+		    -nextstep* )
+			;;
+		    -ns2*)
+		      os=-nextstep2
+			;;
+		    *)
+		      os=-nextstep3
+			;;
+		esac
+		;;
+	nh3000)
+		basic_machine=m68k-harris
+		os=-cxux
+		;;
+	nh[45]000)
+		basic_machine=m88k-harris
+		os=-cxux
+		;;
+	nindy960)
+		basic_machine=i960-intel
+		os=-nindy
+		;;
+	mon960)
+		basic_machine=i960-intel
+		os=-mon960
+		;;
+	nonstopux)
+		basic_machine=mips-compaq
+		os=-nonstopux
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	nsr-tandem)
+		basic_machine=nsr-tandem
+		;;
+	op50n-* | op60c-*)
+		basic_machine=hppa1.1-oki
+		os=-proelf
+		;;
+	openrisc | openrisc-*)
+		basic_machine=or32-unknown
+		;;
+	os400)
+		basic_machine=powerpc-ibm
+		os=-os400
+		;;
+	OSE68000 | ose68000)
+		basic_machine=m68000-ericsson
+		os=-ose
+		;;
+	os68k)
+		basic_machine=m68k-none
+		os=-os68k
+		;;
+	pa-hitachi)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	paragon)
+		basic_machine=i860-intel
+		os=-osf
+		;;
+	parisc)
+		basic_machine=hppa-unknown
+		os=-linux
+		;;
+	parisc-*)
+		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	pbd)
+		basic_machine=sparc-tti
+		;;
+	pbb)
+		basic_machine=m68k-tti
+		;;
+	pc532 | pc532-*)
+		basic_machine=ns32k-pc532
+		;;
+	pc98)
+		basic_machine=i386-pc
+		;;
+	pc98-*)
+		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium | p5 | k5 | k6 | nexgen | viac3)
+		basic_machine=i586-pc
+		;;
+	pentiumpro | p6 | 6x86 | athlon | athlon_*)
+		basic_machine=i686-pc
+		;;
+	pentiumii | pentium2 | pentiumiii | pentium3)
+		basic_machine=i686-pc
+		;;
+	pentium4)
+		basic_machine=i786-pc
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium4-*)
+		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=power-ibm
+		;;
+	ppc)	basic_machine=powerpc-unknown
+		;;
+	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppcle | powerpclittle | ppc-le | powerpc-little)
+		basic_machine=powerpcle-unknown
+		;;
+	ppcle-* | powerpclittle-*)
+		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64)	basic_machine=powerpc64-unknown
+		;;
+	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+		basic_machine=powerpc64le-unknown
+		;;
+	ppc64le-* | powerpc64little-*)
+		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	pw32)
+		basic_machine=i586-unknown
+		os=-pw32
+		;;
+	rdos)
+		basic_machine=i386-pc
+		os=-rdos
+		;;
+	rom68k)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	rm[46]00)
+		basic_machine=mips-siemens
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	s390 | s390-*)
+		basic_machine=s390-ibm
+		;;
+	s390x | s390x-*)
+		basic_machine=s390x-ibm
+		;;
+	sa29200)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	sb1)
+		basic_machine=mipsisa64sb1-unknown
+		;;
+	sb1el)
+		basic_machine=mipsisa64sb1el-unknown
+		;;
+	sde)
+		basic_machine=mipsisa32-sde
+		os=-elf
+		;;
+	sei)
+		basic_machine=mips-sei
+		os=-seiux
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sh5el)
+		basic_machine=sh5le-unknown
+		;;
+	sh64)
+		basic_machine=sh64-unknown
+		;;
+	sparclite-wrs | simso-wrs)
+		basic_machine=sparclite-wrs
+		os=-vxworks
+		;;
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
+		;;
+	spur)
+		basic_machine=spur-unknown
+		;;
+	st2000)
+		basic_machine=m68k-tandem
+		;;
+	stratus)
+		basic_machine=i860-stratus
+		os=-sysv4
+		;;
+	sun2)
+		basic_machine=m68000-sun
+		;;
+	sun2os3)
+		basic_machine=m68000-sun
+		os=-sunos3
+		;;
+	sun2os4)
+		basic_machine=m68000-sun
+		os=-sunos4
+		;;
+	sun3os3)
+		basic_machine=m68k-sun
+		os=-sunos3
+		;;
+	sun3os4)
+		basic_machine=m68k-sun
+		os=-sunos4
+		;;
+	sun4os3)
+		basic_machine=sparc-sun
+		os=-sunos3
+		;;
+	sun4os4)
+		basic_machine=sparc-sun
+		os=-sunos4
+		;;
+	sun4sol2)
+		basic_machine=sparc-sun
+		os=-solaris2
+		;;
+	sun3 | sun3-*)
+		basic_machine=m68k-sun
+		;;
+	sun4)
+		basic_machine=sparc-sun
+		;;
+	sun386 | sun386i | roadrunner)
+		basic_machine=i386-sun
+		;;
+	sv1)
+		basic_machine=sv1-cray
+		os=-unicos
+		;;
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
+		;;
+	t3e)
+		basic_machine=alphaev5-cray
+		os=-unicos
+		;;
+	t90)
+		basic_machine=t90-cray
+		os=-unicos
+		;;
+	tic54x | c54x*)
+		basic_machine=tic54x-unknown
+		os=-coff
+		;;
+	tic55x | c55x*)
+		basic_machine=tic55x-unknown
+		os=-coff
+		;;
+	tic6x | c6x*)
+		basic_machine=tic6x-unknown
+		os=-coff
+		;;
+	tile*)
+		basic_machine=tile-unknown
+		os=-linux-gnu
+		;;
+	tx39)
+		basic_machine=mipstx39-unknown
+		;;
+	tx39el)
+		basic_machine=mipstx39el-unknown
+		;;
+	toad1)
+		basic_machine=pdp10-xkl
+		os=-tops20
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	tpf)
+		basic_machine=s390x-ibm
+		os=-tpf
+		;;
+	udi29k)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
+		;;
+	v810 | necv810)
+		basic_machine=v810-nec
+		os=-none
+		;;
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
+		;;
+	vms)
+		basic_machine=vax-dec
+		os=-vms
+		;;
+	vpp*|vx|vx-*)
+		basic_machine=f301-fujitsu
+		;;
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
+		;;
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
+		;;
+	vxworks29k)
+		basic_machine=a29k-wrs
+		os=-vxworks
+		;;
+	w65*)
+		basic_machine=w65-wdc
+		os=-none
+		;;
+	w89k-*)
+		basic_machine=hppa1.1-winbond
+		os=-proelf
+		;;
+	xbox)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	z8k-*-coff)
+		basic_machine=z8k-unknown
+		os=-sim
+		;;
+	z80-*-coff)
+		basic_machine=z80-unknown
+		os=-sim
+		;;
+	none)
+		basic_machine=none-none
+		os=-none
+		;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		basic_machine=hppa1.1-winbond
+		;;
+	op50n)
+		basic_machine=hppa1.1-oki
+		;;
+	op60c)
+		basic_machine=hppa1.1-oki
+		;;
+	romp)
+		basic_machine=romp-ibm
+		;;
+	mmix)
+		basic_machine=mmix-knuth
+		;;
+	rs6000)
+		basic_machine=rs6000-ibm
+		;;
+	vax)
+		basic_machine=vax-dec
+		;;
+	pdp10)
+		# there are many clones, so DEC is not a safe bet
+		basic_machine=pdp10-unknown
+		;;
+	pdp11)
+		basic_machine=pdp11-dec
+		;;
+	we32k)
+		basic_machine=we32k-att
+		;;
+	sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
+		basic_machine=sh-unknown
+		;;
+	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+		basic_machine=sparc-sun
+		;;
+	cydra)
+		basic_machine=cydra-cydrome
+		;;
+	orion)
+		basic_machine=orion-highlevel
+		;;
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	mac | mpw | mac-mpw)
+		basic_machine=m68k-apple
+		;;
+	pmac | pmac-mpw)
+		basic_machine=powerpc-apple
+		;;
+	*-unknown)
+		# Make sure to match an already-canonicalized machine name.
+		;;
+	*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+	*-digital*)
+		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+		;;
+	*-commodore*)
+		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+        # First match some system type aliases
+        # that might get confused with valid system types.
+	# -solaris* is a basic system type, with this one exception.
+	-solaris1 | -solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	-solaris)
+		os=-solaris2
+		;;
+	-svr4*)
+		os=-sysv4
+		;;
+	-unixware*)
+		os=-sysv4.2uw
+		;;
+	-gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+		;;
+	# First accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST END IN A *, to match a version number.
+	# -sysv* is not here because it comes later, after sysvr4.
+	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+	      | -kopensolaris* \
+	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+	      | -aos* | -aros* \
+	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+	      | -openbsd* | -solidbsd* \
+	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+	      | -chorusos* | -chorusrdb* | -cegcc* \
+	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	-qnx*)
+		case $basic_machine in
+		    x86-* | i*86-*)
+			;;
+		    *)
+			os=-nto$os
+			;;
+		esac
+		;;
+	-nto-qnx*)
+		;;
+	-nto*)
+		os=`echo $os | sed -e 's|nto|nto-qnx|'`
+		;;
+	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+		;;
+	-mac*)
+		os=`echo $os | sed -e 's|mac|macos|'`
+		;;
+	-linux-dietlibc)
+		os=-linux-dietlibc
+		;;
+	-linux*)
+		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+		;;
+	-sunos5*)
+		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+		;;
+	-sunos6*)
+		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+		;;
+	-opened*)
+		os=-openedition
+		;;
+        -os400*)
+		os=-os400
+		;;
+	-wince*)
+		os=-wince
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-atheos*)
+		os=-atheos
+		;;
+	-syllable*)
+		os=-syllable
+		;;
+	-386bsd)
+		os=-bsd
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	-nova*)
+		os=-rtmk-nova
+		;;
+	-ns2 )
+		os=-nextstep2
+		;;
+	-nsk*)
+		os=-nsk
+		;;
+	# Preserve the version number of sinix5.
+	-sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	-sinix*)
+		os=-sysv4
+		;;
+        -tpf*)
+		os=-tpf
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-svr4)
+		os=-sysv4
+		;;
+	-svr3)
+		os=-sysv3
+		;;
+	-sysvr4)
+		os=-sysv4
+		;;
+	# This must come after -sysvr4.
+	-sysv*)
+		;;
+	-ose*)
+		os=-ose
+		;;
+	-es1800*)
+		os=-ose
+		;;
+	-xenix)
+		os=-xenix
+		;;
+	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+		os=-mint
+		;;
+	-aros*)
+		os=-aros
+		;;
+	-kaos*)
+		os=-kaos
+		;;
+	-zvmoe)
+		os=-zvmoe
+		;;
+	-dicos*)
+		os=-dicos
+		;;
+	-none)
+		;;
+	*)
+		# Get rid of the `-' at the beginning of $os.
+		os=`echo $os | sed 's/[^-]*-//'`
+		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+		exit 1
+		;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+        score-*)
+		os=-elf
+		;;
+        spu-*)
+		os=-elf
+		;;
+	*-acorn)
+		os=-riscix1.2
+		;;
+	arm*-rebel)
+		os=-linux
+		;;
+	arm*-semi)
+		os=-aout
+		;;
+        c4x-* | tic4x-*)
+        	os=-coff
+		;;
+	# This must come before the *-dec entry.
+	pdp10-*)
+		os=-tops20
+		;;
+	pdp11-*)
+		os=-none
+		;;
+	*-dec | vax-*)
+		os=-ultrix4.2
+		;;
+	m68*-apollo)
+		os=-domain
+		;;
+	i386-sun)
+		os=-sunos4.0.2
+		;;
+	m68000-sun)
+		os=-sunos3
+		# This also exists in the configure program, but was not the
+		# default.
+		# os=-sunos4
+		;;
+	m68*-cisco)
+		os=-aout
+		;;
+        mep-*)
+		os=-elf
+		;;
+	mips*-cisco)
+		os=-elf
+		;;
+	mips*-*)
+		os=-elf
+		;;
+	or32-*)
+		os=-coff
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	*-be)
+		os=-beos
+		;;
+	*-haiku)
+		os=-haiku
+		;;
+	*-ibm)
+		os=-aix
+		;;
+    	*-knuth)
+		os=-mmixware
+		;;
+	*-wec)
+		os=-proelf
+		;;
+	*-winbond)
+		os=-proelf
+		;;
+	*-oki)
+		os=-proelf
+		;;
+	*-hp)
+		os=-hpux
+		;;
+	*-hitachi)
+		os=-hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=-sysv
+		;;
+	*-cbm)
+		os=-amigaos
+		;;
+	*-dg)
+		os=-dgux
+		;;
+	*-dolphin)
+		os=-sysv3
+		;;
+	m68k-ccur)
+		os=-rtu
+		;;
+	m88k-omron*)
+		os=-luna
+		;;
+	*-next )
+		os=-nextstep
+		;;
+	*-sequent)
+		os=-ptx
+		;;
+	*-crds)
+		os=-unos
+		;;
+	*-ns)
+		os=-genix
+		;;
+	i370-*)
+		os=-mvs
+		;;
+	*-next)
+		os=-nextstep3
+		;;
+	*-gould)
+		os=-sysv
+		;;
+	*-highlevel)
+		os=-bsd
+		;;
+	*-encore)
+		os=-bsd
+		;;
+	*-sgi)
+		os=-irix
+		;;
+	*-siemens)
+		os=-sysv4
+		;;
+	*-masscomp)
+		os=-rtu
+		;;
+	f30[01]-fujitsu | f700-fujitsu)
+		os=-uxpv
+		;;
+	*-rom68k)
+		os=-coff
+		;;
+	*-*bug)
+		os=-coff
+		;;
+	*-apple)
+		os=-macos
+		;;
+	*-atari*)
+		os=-mint
+		;;
+	*)
+		os=-none
+		;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+	*-unknown)
+		case $os in
+			-riscix*)
+				vendor=acorn
+				;;
+			-sunos*)
+				vendor=sun
+				;;
+			-aix*)
+				vendor=ibm
+				;;
+			-beos*)
+				vendor=be
+				;;
+			-hpux*)
+				vendor=hp
+				;;
+			-mpeix*)
+				vendor=hp
+				;;
+			-hiux*)
+				vendor=hitachi
+				;;
+			-unos*)
+				vendor=crds
+				;;
+			-dgux*)
+				vendor=dg
+				;;
+			-luna*)
+				vendor=omron
+				;;
+			-genix*)
+				vendor=ns
+				;;
+			-mvs* | -opened*)
+				vendor=ibm
+				;;
+			-os400*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+			-tpf*)
+				vendor=ibm
+				;;
+			-vxsim* | -vxworks* | -windiss*)
+				vendor=wrs
+				;;
+			-aux*)
+				vendor=apple
+				;;
+			-hms*)
+				vendor=hitachi
+				;;
+			-mpw* | -macos*)
+				vendor=apple
+				;;
+			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+				vendor=atari
+				;;
+			-vos*)
+				vendor=stratus
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/db2txtl-src/configure
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/db2txtl-src/configure	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/db2txtl-src/configure	(revision 24799)
@@ -0,0 +1,5208 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.68 for txt2dbl 1.0.
+#
+# Report bugs to <jmt12@students.waikato.ac.nz>.
+#
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
+# Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test "x$CONFIG_SHELL" = x; then
+  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+"
+  as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+  exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1"
+  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1"
+  if (eval "$as_required") 2>/dev/null; then :
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  as_found=:
+  case $as_dir in #(
+	 /*)
+	   for as_base in sh bash ksh sh5; do
+	     # Try only shells that exist, to save several forks.
+	     as_shell=$as_dir/$as_base
+	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  CONFIG_SHELL=$as_shell as_have_required=yes
+		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  break 2
+fi
+fi
+	   done;;
+       esac
+  as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+  CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+      if test "x$CONFIG_SHELL" != x; then :
+  # We cannot yet assume a decent shell, so we have to provide a
+	# neutralization value for shells without unset; and this also
+	# works around shells that cannot unset nonexistent variables.
+	# Preserve -v and -x to the replacement shell.
+	BASH_ENV=/dev/null
+	ENV=/dev/null
+	(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+	export CONFIG_SHELL
+	case $- in # ((((
+	  *v*x* | *x*v* ) as_opts=-vx ;;
+	  *v* ) as_opts=-v ;;
+	  *x* ) as_opts=-x ;;
+	  * ) as_opts= ;;
+	esac
+	exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
+fi
+
+    if test x$as_have_required = xno; then :
+  $as_echo "$0: This script requires a shell more modern than all"
+  $as_echo "$0: the shells that I found on your system."
+  if test x${ZSH_VERSION+set} = xset ; then
+    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+  else
+    $as_echo "$0: Please tell bug-autoconf@gnu.org and
+$0: jmt12@students.waikato.ac.nz about your system,
+$0: including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do have one."
+  fi
+  exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+  as_lineno_1=$LINENO as_lineno_1a=$LINENO
+  as_lineno_2=$LINENO as_lineno_2a=$LINENO
+  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+	test -d "$1/.";
+      else
+	case $1 in #(
+	-*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='txt2dbl'
+PACKAGE_TARNAME='txt2dbl'
+PACKAGE_VERSION='1.0'
+PACKAGE_STRING='txt2dbl 1.0'
+PACKAGE_BUGREPORT='jmt12@students.waikato.ac.nz'
+PACKAGE_URL=''
+
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIBOBJS
+GDBM_LIBS
+GDBM_CFLAGS
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+ac_ct_CC
+CFLAGS
+CC
+am__fastdepCXX_FALSE
+am__fastdepCXX_TRUE
+CXXDEPMODE
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__quote
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CXX
+CPPFLAGS
+LDFLAGS
+CXXFLAGS
+CXX
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_dependency_tracking
+with_gdbm_include_path
+with_gdbm_lib_path
+'
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CXX
+CXXFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CCC
+CC
+CFLAGS'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *=)   ac_optarg= ;;
+  *)    ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    case $ac_envvar in #(
+      '' | [0-9]* | *[!_$as_cr_alnum]* )
+      as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+    esac
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+  case $enable_option_checking in
+    no) ;;
+    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+  esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
+		datadir sysconfdir sharedstatedir localstatedir includedir \
+		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+		libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  # Remove trailing slashes.
+  case $ac_val in
+    */ )
+      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+      eval $ac_var=\$ac_val;;
+  esac
+  # Be sure to have absolute directory names.
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used" >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_myself" : 'X\(//\)[^/]' \| \
+	 X"$as_myself" : 'X\(//\)$' \| \
+	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+	pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures txt2dbl 1.0 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking ...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR            user executables [EPREFIX/bin]
+  --sbindir=DIR           system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR        program executables [EPREFIX/libexec]
+  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --libdir=DIR            object code libraries [EPREFIX/lib]
+  --includedir=DIR        C header files [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
+  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR           info documentation [DATAROOTDIR/info]
+  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR            man documentation [DATAROOTDIR/man]
+  --docdir=DIR            documentation root [DATAROOTDIR/doc/txt2dbl]
+  --htmldir=DIR           html documentation [DOCDIR]
+  --dvidir=DIR            dvi documentation [DOCDIR]
+  --pdfdir=DIR            pdf documentation [DOCDIR]
+  --psdir=DIR             ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of txt2dbl 1.0:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-option-checking  ignore unrecognized --enable/--with options
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-gdbm-include-path
+                          location of the GDBM headers
+  --with-gdbm-lib-path    location of the GDBM libraries
+
+Some influential environment variables:
+  CXX         C++ compiler command
+  CXXFLAGS    C++ compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  CC          C compiler command
+  CFLAGS      C compiler flags
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <jmt12@students.waikato.ac.nz>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" ||
+      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+      continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+txt2dbl configure 1.0
+generated by GNU Autoconf 2.68
+
+Copyright (C) 2010 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_cxx_try_compile LINENO
+# ----------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_compile
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by txt2dbl $as_me 1.0, which was
+generated by GNU Autoconf 2.68.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    $as_echo "PATH: $as_dir"
+  done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+    2)
+      as_fn_append ac_configure_args1 " '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+	ac_must_keep_next=false # Got value, back to normal.
+      else
+	case $ac_arg in
+	  *=* | --config-cache | -C | -disable-* | --disable-* \
+	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+	  | -with-* | --with-* | -without-* | --without-* | --x)
+	    case "$ac_configure_args0 " in
+	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+	    esac
+	    ;;
+	  -* ) ac_must_keep_next=true ;;
+	esac
+      fi
+      as_fn_append ac_configure_args " '$ac_arg'"
+      ;;
+    esac
+  done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+	"s/'\''/'\''\\\\'\'''\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      $as_echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=\$$ac_var
+	case $ac_val in
+	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+	esac
+	$as_echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      $as_echo "$as_me: caught signal $ac_signal"
+    $as_echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+  # We do not want a PATH search for config.site.
+  case $CONFIG_SITE in #((
+    -*)  ac_site_file1=./$CONFIG_SITE;;
+    */*) ac_site_file1=$CONFIG_SITE;;
+    *)   ac_site_file1=./$CONFIG_SITE;;
+  esac
+elif test "x$prefix" != xNONE; then
+  ac_site_file1=$prefix/share/config.site
+  ac_site_file2=$prefix/etc/config.site
+else
+  ac_site_file1=$ac_default_prefix/share/config.site
+  ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+  test "x$ac_site_file" = xNONE && continue
+  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file" \
+      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special files
+  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
+  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+	# differences in whitespace do not lead to failure.
+	ac_old_val_w=`echo x $ac_old_val`
+	ac_new_val_w=`echo x $ac_new_val`
+	if test "$ac_old_val_w" != "$ac_new_val_w"; then
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	  ac_cache_corrupted=:
+	else
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+	  eval $ac_var=\$ac_old_val
+	fi
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
+$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
+$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+am__api_version='1.11'
+
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+  if test -f "$ac_dir/install-sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f "$ac_dir/install.sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if ${ac_cv_path_install+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+  ./ | .// | /[cC]/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    rm -rf conftest.one conftest.two conftest.dir
+	    echo one > conftest.one
+	    echo two > conftest.two
+	    mkdir conftest.dir
+	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+	      test -s conftest.one && test -s conftest.two &&
+	      test -s conftest.dir/conftest.one &&
+	      test -s conftest.dir/conftest.two
+	    then
+	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	      break 3
+	    fi
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+
+  done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+$as_echo_n "checking whether build environment is sane... " >&6; }
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[\\\"\#\$\&\'\`$am_lf]*)
+    as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+  *[\\\"\#\$\&\'\`$am_lf\ \	]*)
+    as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
+esac
+
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t "$srcdir/configure" conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$*" != "X $srcdir/configure conftest.file" \
+      && test "$*" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" "$LINENO" 5
+   fi
+
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   as_fn_error $? "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+test "$program_prefix" != NONE &&
+  program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+  if ${ac_cv_path_mkdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in mkdir gmkdir; do
+	 for ac_exec_ext in '' $ac_executable_extensions; do
+	   { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
+	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+	     'mkdir (GNU coreutils) '* | \
+	     'mkdir (coreutils) '* | \
+	     'mkdir (fileutils) '4.1*)
+	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+	       break 3;;
+	   esac
+	 done
+       done
+  done
+IFS=$as_save_IFS
+
+fi
+
+  test -d ./--version && rmdir ./--version
+  if test "${ac_cv_path_mkdir+set}" = set; then
+    MKDIR_P="$ac_cv_path_mkdir -p"
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for MKDIR_P within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    MKDIR_P="$ac_install_sh -d"
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+mkdir_p="$MKDIR_P"
+case $mkdir_p in
+  [\\/$]* | ?:[\\/]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AWK+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_AWK="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$AWK" && break
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  SET_MAKE=
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  am__isrc=' -I$(srcdir)'
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='txt2dbl'
+ VERSION='1.0'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+
+# Checks for programs.
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+  if test -n "$CCC"; then
+    CXX=$CCC
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in g++
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
+$as_echo "$CXX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CXX" && break
+  done
+fi
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in g++
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CXX="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
+$as_echo "$ac_ct_CXX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CXX" && break
+done
+
+  if test "x$ac_ct_CXX" = x; then
+    CXX="g++"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CXX=$ac_ct_CXX
+  fi
+fi
+
+  fi
+fi
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5
+$as_echo_n "checking whether the C++ compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+	;;
+    [ab].out )
+	# We found the default executable, but exeext='' is most
+	# certainly right.
+	break;;
+    *.* )
+	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+	then :; else
+	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	fi
+	# We set ac_cv_exeext here because the later test for it is not
+	# safe: cross compilers may not add the suffix if given an `-o'
+	# argument, so we may need to know it at that point already.
+	# Even if this section looks crufty: it has the advantage of
+	# actually working.
+	break;;
+    * )
+	break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+if test -z "$ac_file"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C++ compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5
+$as_echo_n "checking for C++ compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	  break;;
+    * ) break;;
+  esac
+done
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+  { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+  if { ac_try='./conftest$ac_cv_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C++ compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+    fi
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
+$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
+if ${ac_cv_cxx_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
+$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GXX=yes
+else
+  GXX=
+fi
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
+$as_echo_n "checking whether $CXX accepts -g... " >&6; }
+if ${ac_cv_prog_cxx_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+   ac_cxx_werror_flag=yes
+   ac_cv_prog_cxx_g=no
+   CXXFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_cv_prog_cxx_g=yes
+else
+  CXXFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+else
+  ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+	 CXXFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_cv_prog_cxx_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
+$as_echo "$ac_cv_prog_cxx_g" >&6; }
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
+  else
+    CXXFLAGS="-g"
+  fi
+else
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
+  else
+    CXXFLAGS=
+  fi
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
+$as_echo_n "checking for style of include used by $am_make... " >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
+$as_echo "$_am_result" >&6; }
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then :
+  enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+
+depcc="$CXX"  am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CXX_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CXX_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CXX_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+  am__fastdepCXX_TRUE=
+  am__fastdepCXX_FALSE='#'
+else
+  am__fastdepCXX_TRUE='#'
+  am__fastdepCXX_FALSE=
+fi
+
+
+
+# Checks for libraries.
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+else
+  CFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CC"   am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for encrypt in -lcrypt" >&5
+$as_echo_n "checking for encrypt in -lcrypt... " >&6; }
+if ${ac_cv_lib_crypt_encrypt+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcrypt  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char encrypt ();
+int
+main ()
+{
+return encrypt ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_crypt_encrypt=yes
+else
+  ac_cv_lib_crypt_encrypt=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypt_encrypt" >&5
+$as_echo "$ac_cv_lib_crypt_encrypt" >&6; }
+if test "x$ac_cv_lib_crypt_encrypt" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBCRYPT 1
+_ACEOF
+
+  LIBS="-lcrypt $LIBS"
+
+fi
+
+
+
+# Check whether --with-gdbm-include-path was given.
+if test "${with_gdbm_include_path+set}" = set; then :
+  withval=$with_gdbm_include_path; GDBM_CFLAGS="-I$withval"
+else
+  GDBM_CFLAGS='-I../../../../common-src/packages/gdbm/include'
+fi
+
+
+
+
+# Check whether --with-gdbm-lib-path was given.
+if test "${with_gdbm_lib_path+set}" = set; then :
+  withval=$with_gdbm_lib_path; GDBM_LIBS="-L$withval -lmysqlclient"
+else
+  GDBM_LIBS='-L../../../../common-src/packages/gdbm/lib -lgdbm'
+fi
+
+
+
+# Checks for header files.
+
+# Checks for typedefs, structures, and compiler characteristics.
+
+# Checks for library functions.
+
+# Completion
+ac_config_files="$ac_config_files Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes: double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \.
+      sed -n \
+	"s/'/'\\\\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    if test "x$cache_file" != "x/dev/null"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+      if test ! -f "$cache_file" || test -h "$cache_file"; then
+	cat confcache >"$cache_file"
+      else
+        case $cache_file in #(
+        */* | ?:*)
+	  mv -f confcache "$cache_file"$$ &&
+	  mv -f "$cache_file"$$ "$cache_file" ;; #(
+        *)
+	  mv -f confcache "$cache_file" ;;
+	esac
+      fi
+    fi
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+#
+# If the first sed substitution is executed (which looks for macros that
+# take arguments), then branch to the quote section.  Otherwise,
+# look for a macro that doesn't take arguments.
+ac_script='
+:mline
+/\\$/{
+ N
+ s,\\\n,,
+ b mline
+}
+t clear
+:clear
+s/^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 (][^	 (]*([^)]*)\)[	 ]*\(.*\)/-D\1=\2/g
+t quote
+s/^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 ][^	 ]*\)[	 ]*\(.*\)/-D\1=\2/g
+t quote
+b any
+:quote
+s/[	 `~#$^&*(){}\\|;'\''"<>?]/\\&/g
+s/\[/\\&/g
+s/\]/\\&/g
+s/\$/$$/g
+H
+:any
+${
+	g
+	s/^\n//
+	s/\n/ /g
+	p
+}
+'
+DEFS=`sed -n "$ac_script" confdefs.h`
+
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+ if test -n "$EXEEXT"; then
+  am__EXEEXT_TRUE=
+  am__EXEEXT_FALSE='#'
+else
+  am__EXEEXT_TRUE='#'
+  am__EXEEXT_FALSE=
+fi
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+	test -d "$1/.";
+      else
+	case $1 in #(
+	-*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by txt2dbl $as_me 1.0, which was
+generated by GNU Autoconf 2.68.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration.  Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+      --config     print configuration, then exit
+  -q, --quiet, --silent
+                   do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+      --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+
+Configuration files:
+$config_files
+
+Configuration commands:
+$config_commands
+
+Report bugs to <jmt12@students.waikato.ac.nz>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+txt2dbl config.status 1.0
+configured by $0, generated by GNU Autoconf 2.68,
+  with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2010 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=?*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  --*=)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    $as_echo "$ac_cs_version"; exit ;;
+  --config | --confi | --conf | --con | --co | --c )
+    $as_echo "$ac_cs_config"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    '') as_fn_error $? "missing file argument" ;;
+    esac
+    as_fn_append CONFIG_FILES " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --he | --h |  --help | --hel | -h )
+    $as_echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+  *) as_fn_append ac_config_targets " $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  shift
+  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+  CONFIG_SHELL='$SHELL'
+  export CONFIG_SHELL
+  exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+
+  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp= ac_tmp=
+  trap 'exit_status=$?
+  : "${ac_tmp:=$tmp}"
+  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+  trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+  eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+  ac_cs_awk_cr='\\r'
+else
+  ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+  echo "cat >conf$$subs.awk <<_ACEOF" &&
+  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+  echo "_ACEOF"
+} >conf$$subs.sh ||
+  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  . ./conf$$subs.sh ||
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+  if test $ac_delim_n = $ac_delim_num; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+  N
+  s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+  for (key in S) S_is_set[key] = 1
+  FS = ""
+
+}
+{
+  line = $ 0
+  nfields = split(line, field, "@")
+  substed = 0
+  len = length(field[1])
+  for (i = 2; i < nfields; i++) {
+    key = field[i]
+    keylen = length(key)
+    if (S_is_set[key]) {
+      value = S[key]
+      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+      len += length(value) + length(field[++i])
+      substed = 1
+    } else
+      len += 1 + keylen
+  }
+
+  print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+  cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=[	 ]*/{
+h
+s///
+s/^/:/
+s/[	 ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[	 ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[	 ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+
+eval set X "  :F $CONFIG_FILES      :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$ac_tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
+	 # because $ac_f cannot contain `:'.
+	 test -f "$ac_f" ||
+	   case $ac_f in
+	   [\\/$]*) false;;
+	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+	   esac ||
+	   as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+      esac
+      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+      as_fn_append ac_file_inputs " '$ac_f'"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input='Generated from '`
+	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+	`' by configure.'
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+    fi
+    # Neutralize special characters interpreted by sed in replacement strings.
+    case $configure_input in #(
+    *\&* | *\|* | *\\* )
+       ac_sed_conf_input=`$as_echo "$configure_input" |
+       sed 's/[\\\\&|]/\\\\&/g'`;; #(
+    *) ac_sed_conf_input=$configure_input;;
+    esac
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$ac_tmp/stdin" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  as_dir="$ac_dir"; as_fn_mkdir_p
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+  ac_MKDIR_P=$MKDIR_P
+  case $MKDIR_P in
+  [\\/$]* | ?:[\\/]* ) ;;
+  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+  esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+  s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+  >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' \
+      "$ac_tmp/out"`; test -z "$ac_out"; } &&
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&2;}
+
+  rm -f "$ac_tmp/stdin"
+  case $ac_file in
+  -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+  *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+  esac \
+  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+
+
+  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+  esac
+
+
+  case $ac_file$ac_mode in
+    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named `Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`$as_dirname -- "$mf" ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$mf" : 'X\(//\)[^/]' \| \
+	 X"$mf" : 'X\(//\)$' \| \
+	 X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running `make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`$as_dirname -- "$file" ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$file" : 'X\(//\)[^/]' \| \
+	 X"$file" : 'X\(//\)$' \| \
+	 X"$file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      as_dir=$dirpart/$fdir; as_fn_mkdir_p
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+ ;;
+
+  esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/db2txtl-src/configure.ac
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/db2txtl-src/configure.ac	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/db2txtl-src/configure.ac	(revision 24799)
@@ -0,0 +1,34 @@
+#                                               -*- Autoconf -*-
+# Process this file with autoconf to produce a configure script.
+AC_PREREQ(2.59)
+AC_INIT([txt2dbl], [1.0], [jmt12@students.waikato.ac.nz])
+AM_INIT_AUTOMAKE
+AC_CANONICAL_HOST
+
+# Checks for programs.
+AC_PROG_CXX([g++])
+
+# Checks for libraries.
+AC_CHECK_LIB([crypt],[encrypt])
+
+AC_ARG_WITH([gdbm-include-path],
+  [AS_HELP_STRING([--with-gdbm-include-path],[location of the GDBM headers])],
+  [GDBM_CFLAGS="-I$withval"],
+  [GDBM_CFLAGS='-I../../../../common-src/packages/gdbm/include'])
+AC_SUBST([GDBM_CFLAGS])
+
+AC_ARG_WITH([gdbm-lib-path],
+  [AS_HELP_STRING([--with-gdbm-lib-path], [location of the GDBM libraries])],
+  [GDBM_LIBS="-L$withval -lmysqlclient"],
+  [GDBM_LIBS='-L../../../../common-src/packages/gdbm/lib -lgdbm'])
+AC_SUBST([GDBM_LIBS])
+
+# Checks for header files.
+
+# Checks for typedefs, structures, and compiler characteristics.
+
+# Checks for library functions.
+
+# Completion
+AC_CONFIG_FILES([Makefile])
+AC_OUTPUT
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/db2txtl-src/db2txtl.cpp
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/db2txtl-src/db2txtl.cpp	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/db2txtl-src/db2txtl.cpp	(revision 24799)
@@ -0,0 +1,134 @@
+/**********************************************************************
+ *
+ * db2txt.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *********************************************************************/
+
+#ifdef __WIN32__
+#include "autoconf.h"
+#include "systems.h"
+#include "gdbmconst.h"
+#include "gdbm.h"
+
+#else
+#include <gdbm.h>
+#endif
+
+#include "gsdlconf.h"
+#include <stdlib.h>
+#include <fcntl.h>
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#include <ospace\std\iostream>
+#elif defined(GSDL_USE_IOS_H)
+#include <iostream.h>
+#else
+#include <iostream>
+#endif
+
+// use the standard namespace
+#if !defined (GSDL_NAMESPACE_BROKEN)
+#if defined(GSDL_USE_OBJECTSPACE)
+using namespace ospace::std;
+#else
+using namespace std;
+#endif
+#endif
+
+void print_usage (char *program_name) {
+  cerr << "usage: " << program_name << " database-name" << endl << endl;
+}
+
+// lock a file on linux
+// [hs, 2 july 2010]
+int lock ( char *filename )
+{
+  int fd2 = open (filename, O_CREAT|O_RDWR, 00644);
+  close (fd2);
+  int fd = open (filename, O_RDWR);
+  flock lock = {F_RDLCK, SEEK_SET, 0, 0, 0};
+  fcntl (fd, F_SETLKW, &lock);
+  return fd;
+}
+
+// unlock a file on linux
+// [hs, 2 july 2010]
+int unlock ( int fd )
+{
+  flock lock1 = {F_UNLCK, SEEK_SET, 0, 0, 0};
+  fcntl (fd, F_SETLKW, &lock1);
+  return 0;
+}
+
+int main (int argc, char *argv[]) {
+  int block_size = 0, i;
+  GDBM_FILE dbf;
+  datum key, value, nextkey;
+      
+  // sanity check
+  if (argc != 2) {
+    print_usage (argv[0]);
+    exit (0);
+  }
+  
+  // open the database
+  // - acquire a lock over the database so we can read from it.
+  int thelock = lock ("gdb.lock");
+#ifdef __WIN32__
+  dbf = gdbm_open (argv[1], block_size, GDBM_READER, 00664, NULL, 0);
+#else
+  dbf = gdbm_open  (argv[1], block_size, GDBM_READER, 00664, NULL);
+#endif
+  if (dbf == NULL) {
+    cerr << argv[0] << ": couldn't open " << argv[1] << endl;
+    exit (0);
+  }
+
+  key = gdbm_firstkey (dbf);
+  while (key.dptr != NULL) {
+    cout << "[";
+    for (i = 0; i < key.dsize; ++i)
+      cout << key.dptr[i];
+    cout << "]" << endl;
+    value = gdbm_fetch (dbf, key);
+    for (i = 0; i < value.dsize; ++i)
+      cout << value.dptr[i];
+    cout << endl << "----------------------------------------------------------------------" << endl;
+    free(value.dptr);
+
+    /* get next key */
+    nextkey = gdbm_nextkey (dbf, key);
+
+    /* free old key's dptr, otherwise causes memory leak */
+    free(key.dptr); 
+    
+    /* can now safely copy content of nextkey into key */
+    key = nextkey;
+  }
+  
+  gdbm_close (dbf);
+
+  // Unlock now that we've written the entire database
+  unlock (thelock);
+
+  return 0;
+}
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/db2txtl-src/install-sh
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/db2txtl-src/install-sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/db2txtl-src/install-sh	(revision 24799)
@@ -0,0 +1,520 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2009-04-28.21; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+nl='
+'
+IFS=" ""	$nl"
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit=${DOITPROG-}
+if test -z "$doit"; then
+  doit_exec=exec
+else
+  doit_exec=$doit
+fi
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_glob='?'
+initialize_posix_glob='
+  test "$posix_glob" != "?" || {
+    if (set -f) 2>/dev/null; then
+      posix_glob=
+    else
+      posix_glob=:
+    fi
+  }
+'
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+no_target_directory=
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+     --help     display this help and exit.
+     --version  display version info and exit.
+
+  -c            (ignored)
+  -C            install only if different (preserve the last data modification time)
+  -d            create directories instead of installing files.
+  -g GROUP      $chgrpprog installed files to GROUP.
+  -m MODE       $chmodprog installed files to MODE.
+  -o USER       $chownprog installed files to USER.
+  -s            $stripprog installed files.
+  -t DIRECTORY  install into DIRECTORY.
+  -T            report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+  RMPROG STRIPPROG
+"
+
+while test $# -ne 0; do
+  case $1 in
+    -c) ;;
+
+    -C) copy_on_change=true;;
+
+    -d) dir_arg=true;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+	shift;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) mode=$2
+	case $mode in
+	  *' '* | *'	'* | *'
+'*	  | *'*'* | *'?'* | *'['*)
+	    echo "$0: invalid mode: $mode" >&2
+	    exit 1;;
+	esac
+	shift;;
+
+    -o) chowncmd="$chownprog $2"
+	shift;;
+
+    -s) stripcmd=$stripprog;;
+
+    -t) dst_arg=$2
+	shift;;
+
+    -T) no_target_directory=true;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    --)	shift
+	break;;
+
+    -*)	echo "$0: invalid option: $1" >&2
+	exit 1;;
+
+    *)  break;;
+  esac
+  shift
+done
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+  # When -d is used, all remaining arguments are directories to create.
+  # When -t is used, the destination is already specified.
+  # Otherwise, the last argument is the destination.  Remove it from $@.
+  for arg
+  do
+    if test -n "$dst_arg"; then
+      # $@ is not empty: it contains at least $arg.
+      set fnord "$@" "$dst_arg"
+      shift # fnord
+    fi
+    shift # arg
+    dst_arg=$arg
+  done
+fi
+
+if test $# -eq 0; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call `install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+if test -z "$dir_arg"; then
+  trap '(exit $?); exit' 1 2 13 15
+
+  # Set umask so as not to create temps with too-generous modes.
+  # However, 'strip' requires both read and write access to temps.
+  case $mode in
+    # Optimize common cases.
+    *644) cp_umask=133;;
+    *755) cp_umask=22;;
+
+    *[0-7])
+      if test -z "$stripcmd"; then
+	u_plus_rw=
+      else
+	u_plus_rw='% 200'
+      fi
+      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+    *)
+      if test -z "$stripcmd"; then
+	u_plus_rw=
+      else
+	u_plus_rw=,u+rw
+      fi
+      cp_umask=$mode$u_plus_rw;;
+  esac
+fi
+
+for src
+do
+  # Protect names starting with `-'.
+  case $src in
+    -*) src=./$src;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    dstdir=$dst
+    test -d "$dstdir"
+    dstdir_status=$?
+  else
+
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dst_arg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+
+    dst=$dst_arg
+    # Protect names starting with `-'.
+    case $dst in
+      -*) dst=./$dst;;
+    esac
+
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
+    if test -d "$dst"; then
+      if test -n "$no_target_directory"; then
+	echo "$0: $dst_arg: Is a directory" >&2
+	exit 1
+      fi
+      dstdir=$dst
+      dst=$dstdir/`basename "$src"`
+      dstdir_status=0
+    else
+      # Prefer dirname, but fall back on a substitute if dirname fails.
+      dstdir=`
+	(dirname "$dst") 2>/dev/null ||
+	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	     X"$dst" : 'X\(//\)[^/]' \| \
+	     X"$dst" : 'X\(//\)$' \| \
+	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
+	echo X"$dst" |
+	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)[^/].*/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\).*/{
+		   s//\1/
+		   q
+		 }
+		 s/.*/./; q'
+      `
+
+      test -d "$dstdir"
+      dstdir_status=$?
+    fi
+  fi
+
+  obsolete_mkdir_used=false
+
+  if test $dstdir_status != 0; then
+    case $posix_mkdir in
+      '')
+	# Create intermediate dirs using mode 755 as modified by the umask.
+	# This is like FreeBSD 'install' as of 1997-10-28.
+	umask=`umask`
+	case $stripcmd.$umask in
+	  # Optimize common cases.
+	  *[2367][2367]) mkdir_umask=$umask;;
+	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+	  *[0-7])
+	    mkdir_umask=`expr $umask + 22 \
+	      - $umask % 100 % 40 + $umask % 20 \
+	      - $umask % 10 % 4 + $umask % 2
+	    `;;
+	  *) mkdir_umask=$umask,go-w;;
+	esac
+
+	# With -d, create the new directory with the user-specified mode.
+	# Otherwise, rely on $mkdir_umask.
+	if test -n "$dir_arg"; then
+	  mkdir_mode=-m$mode
+	else
+	  mkdir_mode=
+	fi
+
+	posix_mkdir=false
+	case $umask in
+	  *[123567][0-7][0-7])
+	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
+	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+	    ;;
+	  *)
+	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+	    if (umask $mkdir_umask &&
+		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+	    then
+	      if test -z "$dir_arg" || {
+		   # Check for POSIX incompatibilities with -m.
+		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+		   # other-writeable bit of parent directory when it shouldn't.
+		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
+		   case $ls_ld_tmpdir in
+		     d????-?r-*) different_mode=700;;
+		     d????-?--*) different_mode=755;;
+		     *) false;;
+		   esac &&
+		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+		   }
+		 }
+	      then posix_mkdir=:
+	      fi
+	      rmdir "$tmpdir/d" "$tmpdir"
+	    else
+	      # Remove any dirs left behind by ancient mkdir implementations.
+	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+	    fi
+	    trap '' 0;;
+	esac;;
+    esac
+
+    if
+      $posix_mkdir && (
+	umask $mkdir_umask &&
+	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+      )
+    then :
+    else
+
+      # The umask is ridiculous, or mkdir does not conform to POSIX,
+      # or it failed possibly due to a race condition.  Create the
+      # directory the slow way, step by step, checking for races as we go.
+
+      case $dstdir in
+	/*) prefix='/';;
+	-*) prefix='./';;
+	*)  prefix='';;
+      esac
+
+      eval "$initialize_posix_glob"
+
+      oIFS=$IFS
+      IFS=/
+      $posix_glob set -f
+      set fnord $dstdir
+      shift
+      $posix_glob set +f
+      IFS=$oIFS
+
+      prefixes=
+
+      for d
+      do
+	test -z "$d" && continue
+
+	prefix=$prefix$d
+	if test -d "$prefix"; then
+	  prefixes=
+	else
+	  if $posix_mkdir; then
+	    (umask=$mkdir_umask &&
+	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+	    # Don't fail if two instances are running concurrently.
+	    test -d "$prefix" || exit 1
+	  else
+	    case $prefix in
+	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+	      *) qprefix=$prefix;;
+	    esac
+	    prefixes="$prefixes '$qprefix'"
+	  fi
+	fi
+	prefix=$prefix/
+      done
+
+      if test -n "$prefixes"; then
+	# Don't fail if two instances are running concurrently.
+	(umask $mkdir_umask &&
+	 eval "\$doit_exec \$mkdirprog $prefixes") ||
+	  test -d "$dstdir" || exit 1
+	obsolete_mkdir_used=true
+      fi
+    fi
+  fi
+
+  if test -n "$dir_arg"; then
+    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+  else
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+    # Copy the file name to the temp name.
+    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+    # If -C, don't bother to copy if it wouldn't change the file.
+    if $copy_on_change &&
+       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
+
+       eval "$initialize_posix_glob" &&
+       $posix_glob set -f &&
+       set X $old && old=:$2:$4:$5:$6 &&
+       set X $new && new=:$2:$4:$5:$6 &&
+       $posix_glob set +f &&
+
+       test "$old" = "$new" &&
+       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+    then
+      rm -f "$dsttmp"
+    else
+      # Rename the file to the real destination.
+      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+      # The rename failed, perhaps because mv can't rename something else
+      # to itself, or perhaps because mv is so ancient that it does not
+      # support -f.
+      {
+	# Now remove or move aside any old file at destination location.
+	# We try this two ways since rm can't unlink itself on some
+	# systems and the destination file might be busy for other
+	# reasons.  In this case, the final cleanup might fail but the new
+	# file should still install successfully.
+	{
+	  test ! -f "$dst" ||
+	  $doit $rmcmd -f "$dst" 2>/dev/null ||
+	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+	  } ||
+	  { echo "$0: cannot unlink or rename $dst" >&2
+	    (exit 1); exit 1
+	  }
+	} &&
+
+	# Now rename the file to the real destination.
+	$doit $mvcmd "$dsttmp" "$dst"
+      }
+    fi || exit 1
+
+    trap '' 0
+  fi
+done
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/db2txtl-src/missing
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/db2txtl-src/missing	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/db2txtl-src/missing	(revision 24799)
@@ -0,0 +1,376 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2009-04-28.21; # UTC
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
+# 2008, 2009 Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try \`$0 --help' for more information"
+  exit 1
+fi
+
+run=:
+sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
+sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+  configure_ac=configure.ac
+else
+  configure_ac=configure.in
+fi
+
+msg="missing on your system"
+
+case $1 in
+--run)
+  # Try to run requested program, and just exit if it succeeds.
+  run=
+  shift
+  "$@" && exit 0
+  # Exit code 63 means version mismatch.  This often happens
+  # when the user try to use an ancient version of a tool on
+  # a file that requires a minimum version.  In this case we
+  # we should proceed has if the program had been absent, or
+  # if --run hadn't been passed.
+  if test $? = 63; then
+    run=:
+    msg="probably too old"
+  fi
+  ;;
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+  --run           try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+  aclocal      touch file \`aclocal.m4'
+  autoconf     touch file \`configure'
+  autoheader   touch file \`config.h.in'
+  autom4te     touch the output file, or create a stub one
+  automake     touch all \`Makefile.in' files
+  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
+  flex         create \`lex.yy.c', if possible, from existing .c
+  help2man     touch the output file
+  lex          create \`lex.yy.c', if possible, from existing .c
+  makeinfo     touch the output file
+  tar          try tar, gnutar, gtar, then tar without non-portable flags
+  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
+
+Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
+\`g' are ignored when checking the name.
+
+Send bug reports to <bug-automake@gnu.org>."
+    exit $?
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing $scriptversion (GNU Automake)"
+    exit $?
+    ;;
+
+  -*)
+    echo 1>&2 "$0: Unknown \`$1' option"
+    echo 1>&2 "Try \`$0 --help' for more information"
+    exit 1
+    ;;
+
+esac
+
+# normalize program name to check for.
+program=`echo "$1" | sed '
+  s/^gnu-//; t
+  s/^gnu//; t
+  s/^g//; t'`
+
+# Now exit if we have it, but it failed.  Also exit now if we
+# don't have it and --version was passed (most likely to detect
+# the program).  This is about non-GNU programs, so use $1 not
+# $program.
+case $1 in
+  lex*|yacc*)
+    # Not GNU programs, they don't have --version.
+    ;;
+
+  tar*)
+    if test -n "$run"; then
+       echo 1>&2 "ERROR: \`tar' requires --run"
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       exit 1
+    fi
+    ;;
+
+  *)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       # Could not run --version or --help.  This is probably someone
+       # running `$TOOL --version' or `$TOOL --help' to check whether
+       # $TOOL exists and not knowing $TOOL uses missing.
+       exit 1
+    fi
+    ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case $program in
+  aclocal*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
+         to install the \`Automake' and \`Perl' packages.  Grab them from
+         any GNU archive site."
+    touch aclocal.m4
+    ;;
+
+  autoconf*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`${configure_ac}'.  You might want to install the
+         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
+         archive site."
+    touch configure
+    ;;
+
+  autoheader*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
+         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
+         from any GNU archive site."
+    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+    test -z "$files" && files="config.h"
+    touch_files=
+    for f in $files; do
+      case $f in
+      *:*) touch_files="$touch_files "`echo "$f" |
+				       sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+      *) touch_files="$touch_files $f.in";;
+      esac
+    done
+    touch $touch_files
+    ;;
+
+  automake*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+         You might want to install the \`Automake' and \`Perl' packages.
+         Grab them from any GNU archive site."
+    find . -type f -name Makefile.am -print |
+	   sed 's/\.am$/.in/' |
+	   while read f; do touch "$f"; done
+    ;;
+
+  autom4te*)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.
+         You can get \`$1' as part of \`Autoconf' from any GNU
+         archive site."
+
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
+	touch $file
+    else
+	test -z "$file" || exec >$file
+	echo "#! /bin/sh"
+	echo "# Created by GNU Automake missing as a replacement of"
+	echo "#  $ $@"
+	echo "exit 0"
+	chmod +x $file
+	exit 1
+    fi
+    ;;
+
+  bison*|yacc*)
+    echo 1>&2 "\
+WARNING: \`$1' $msg.  You should only need it if
+         you modified a \`.y' file.  You may need the \`Bison' package
+         in order for those modifications to take effect.  You can get
+         \`Bison' from any GNU archive site."
+    rm -f y.tab.c y.tab.h
+    if test $# -ne 1; then
+        eval LASTARG="\${$#}"
+	case $LASTARG in
+	*.y)
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" y.tab.c
+	    fi
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" y.tab.h
+	    fi
+	  ;;
+	esac
+    fi
+    if test ! -f y.tab.h; then
+	echo >y.tab.h
+    fi
+    if test ! -f y.tab.c; then
+	echo 'main() { return 0; }' >y.tab.c
+    fi
+    ;;
+
+  lex*|flex*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.l' file.  You may need the \`Flex' package
+         in order for those modifications to take effect.  You can get
+         \`Flex' from any GNU archive site."
+    rm -f lex.yy.c
+    if test $# -ne 1; then
+        eval LASTARG="\${$#}"
+	case $LASTARG in
+	*.l)
+	    SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" lex.yy.c
+	    fi
+	  ;;
+	esac
+    fi
+    if test ! -f lex.yy.c; then
+	echo 'main() { return 0; }' >lex.yy.c
+    fi
+    ;;
+
+  help2man*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+	 you modified a dependency of a manual page.  You may need the
+	 \`Help2man' package in order for those modifications to take
+	 effect.  You can get \`Help2man' from any GNU archive site."
+
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
+	touch $file
+    else
+	test -z "$file" || exec >$file
+	echo ".ab help2man is required to generate this page"
+	exit $?
+    fi
+    ;;
+
+  makeinfo*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.texi' or \`.texinfo' file, or any other file
+         indirectly affecting the aspect of the manual.  The spurious
+         call might also be the consequence of using a buggy \`make' (AIX,
+         DU, IRIX).  You might want to install the \`Texinfo' package or
+         the \`GNU make' package.  Grab either from any GNU archive site."
+    # The file to touch is that specified with -o ...
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -z "$file"; then
+      # ... or it is the one specified with @setfilename ...
+      infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+      file=`sed -n '
+	/^@setfilename/{
+	  s/.* \([^ ]*\) *$/\1/
+	  p
+	  q
+	}' $infile`
+      # ... or it is derived from the source name (dir/f.texi becomes f.info)
+      test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
+    fi
+    # If the file does not exist, the user really needs makeinfo;
+    # let's fail without touching anything.
+    test -f $file || exit 1
+    touch $file
+    ;;
+
+  tar*)
+    shift
+
+    # We have already tried tar in the generic part.
+    # Look for gnutar/gtar before invocation to avoid ugly error
+    # messages.
+    if (gnutar --version > /dev/null 2>&1); then
+       gnutar "$@" && exit 0
+    fi
+    if (gtar --version > /dev/null 2>&1); then
+       gtar "$@" && exit 0
+    fi
+    firstarg="$1"
+    if shift; then
+	case $firstarg in
+	*o*)
+	    firstarg=`echo "$firstarg" | sed s/o//`
+	    tar "$firstarg" "$@" && exit 0
+	    ;;
+	esac
+	case $firstarg in
+	*h*)
+	    firstarg=`echo "$firstarg" | sed s/h//`
+	    tar "$firstarg" "$@" && exit 0
+	    ;;
+	esac
+    fi
+
+    echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+         You may want to install GNU tar or Free paxutils, or check the
+         command line arguments."
+    exit 1
+    ;;
+
+  *)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.  Check the \`README' file,
+         it often tells you about the needed prerequisites for installing
+         this package.  You may also peek at any GNU archive site, in case
+         some other package would contain this missing \`$1' program."
+    exit 1
+    ;;
+esac
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/gdbmcli-src/.svnignore
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/gdbmcli-src/.svnignore	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/gdbmcli-src/.svnignore	(revision 24799)
@@ -0,0 +1,7 @@
+Makefile
+autom4te.cache
+config.h
+config.log
+config.status
+gdbmcli
+.deps
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/gdbmcli-src/Makefile.in
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/gdbmcli-src/Makefile.in	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/gdbmcli-src/Makefile.in	(revision 24799)
@@ -0,0 +1,100 @@
+###########################################################################
+#
+# Makefile -- parallel-building/src/gdbmcli-src
+#
+# Similar to txt2db (GDBM) executable in that you open a pipe to it and
+# write commands to be applied to a GDBM database. However, unlike txt2db,
+# this executable allows bidirectional streams (so you need to open the
+# pipe for both reading and writing). It then supports commands of this
+# form:
+#
+# \[<key>\][+\-\?]
+# (<value>)?
+# -{70}
+#
+# where: + is for add or update
+#        - is for delete
+#        ? is for lookup
+#
+# The aim of this executable is to allow a single, persistent, connection
+# to a GDBM database, accessed through some kind of queued daemon, so as
+# to support multiple readers and writers and thus parallel collection
+# building.
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2011-2020  The New Zealand Digital Library Project
+#
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+GSDL_DIR = ../../../..
+COMMON_DIR = $(GSDL_DIR)/common-src
+
+COMMON_PACKAGES_DIR = $(COMMON_DIR)/packages
+
+CXX = @CXX@
+CXXFLAGS = @CXXFLAGS@
+DEFS = @DEFS@ $(GDBM_DEFINES) $(JDBM_DEFINES) $(SQLITE_DEFINES)
+INCLUDES = -I. @GDBM_CFLAGS@ -I$(COMMON_DIR)/src/lib -I${GEXTPARALLELBUILDING_INSTALLED}/include
+INSTALL = @INSTALL@
+LDFLAGS = @LDFLAGS@ -L${GEXTPARALLELBUILDING_INSTALLED}/lib
+LIBS = -lm -lg @LIBS@ @GDBM_LIBS@ $(COMMON_DIR)/src/lib/gsdllib.a
+
+
+CXXCOMPILE = $(CXX) -c $(CXXFLAGS) $(DEFS) $(INCLUDES)
+CXXLINK = $(CXX) $(LDFLAGS) -o $@
+
+
+.SUFFIXES:
+.SUFFIXES: .cpp .o
+.cpp.o:
+	$(CXXCOMPILE) $<
+
+
+SOURCES = \
+	gdbmcli.cpp
+
+OBJECTS = \
+	gdbmcli.o
+
+EXECUTABLE_OBJECTS = \
+	$(OBJECTS)
+
+EXECUTABLE = gdbmcli
+
+
+# Default target: make the executable
+all: $(EXECUTABLE)
+
+gdbmcli: $(EXECUTABLE_OBJECTS)
+	$(CXXLINK) $(EXECUTABLE_OBJECTS) $(LIBS)
+
+install: $(EXECUTABLE)
+	$(INSTALL) -d ${GEXTPARALLELBUILDING_INSTALLED}/bin
+	$(INSTALL) -m 755 -s $(EXECUTABLE) ${GEXTPARALLELBUILDING_INSTALLED}/bin
+
+clean:
+	rm -f $(OBJECTS) $(EXECUTABLE)
+
+distclean:
+	rm -f $(OBJECTS) $(EXECUTABLE) Makefile
+
+depend:
+	makedepend -Y -- $(DEFS) $(INCLUDES) $(CXXFLAGS) -- $(SOURCES)
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/gdbmcli-src/aclocal.m4
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/gdbmcli-src/aclocal.m4	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/gdbmcli-src/aclocal.m4	(revision 24799)
@@ -0,0 +1,951 @@
+# generated automatically by aclocal 1.11 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2007, 2008, 2009  Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],,
+[m4_warning([this file was generated for autoconf 2.68.
+You have another version of autoconf.  It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically `autoreconf'.])])
+
+# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.11'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version.  Point them to the right macro.
+m4_if([$1], [1.11], [],
+      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too.  Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.11])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 9
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 10
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
+       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
+       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+       [$1], UPC,  [depcc="$UPC"  am_compiler_list=],
+       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                   [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  am__universal=false
+  m4_case([$1], [CC],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac],
+    [CXX],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac])
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 5
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named `Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`AS_DIRNAME("$mf")`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running `make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`AS_DIRNAME(["$file"])`
+      AS_MKDIR_P([$dirpart/$fdir])
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled.  FIXME.  This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 16
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.62])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
+  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+	      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+			     [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+		  [_AM_DEPENDENCIES(CC)],
+		  [define([AC_PROG_CC],
+			  defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+		  [_AM_DEPENDENCIES(CXX)],
+		  [define([AC_PROG_CXX],
+			  defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+		  [_AM_DEPENDENCIES(OBJC)],
+		  [define([AC_PROG_OBJC],
+			  defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
+])
+_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
+dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
+dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
+dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+])
+
+dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Check to see how 'make' treats includes.	            -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2009  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 6
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check for `mkdir -p'.
+AC_DEFUN([AM_PROG_MKDIR_P],
+[AC_PREREQ([2.60])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
+dnl while keeping a definition of mkdir_p for backward compatibility.
+dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
+dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
+dnl Makefile.ins that do not define MKDIR_P, so we do our own
+dnl adjustment using top_builddir (which is defined more often than
+dnl MKDIR_P).
+AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
+case $mkdir_p in
+  [[\\/$]]* | ?:[[\\/]]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[[\\\"\#\$\&\'\`$am_lf]]*)
+    AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+  *[[\\\"\#\$\&\'\`$am_lf\ \	]]*)
+    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
+esac
+
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+   if test "$[*]" = "X"; then
+      # -L didn't work.
+      set X `ls -t "$srcdir/configure" conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$[*]" != "X $srcdir/configure conftest.file" \
+      && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+     [m4_case([$1], [ustar],, [pax],,
+              [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+  case $_am_tool in
+  gnutar)
+    for _am_tar in tar gnutar gtar;
+    do
+      AM_RUN_LOG([$_am_tar --version]) && break
+    done
+    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+    am__untar="$_am_tar -xf -"
+    ;;
+  plaintar)
+    # Must skip GNU tar: if it does not support --format= it doesn't create
+    # ustar tarball either.
+    (tar --version) >/dev/null 2>&1 && continue
+    am__tar='tar chf - "$$tardir"'
+    am__tar_='tar chf - "$tardir"'
+    am__untar='tar xf -'
+    ;;
+  pax)
+    am__tar='pax -L -x $1 -w "$$tardir"'
+    am__tar_='pax -L -x $1 -w "$tardir"'
+    am__untar='pax -r'
+    ;;
+  cpio)
+    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+    am__untar='cpio -i -H $1 -d'
+    ;;
+  none)
+    am__tar=false
+    am__tar_=false
+    am__untar=false
+    ;;
+  esac
+
+  # If the value was cached, stop now.  We just wanted to have am__tar
+  # and am__untar set.
+  test -n "${am_cv_prog_tar_$1}" && break
+
+  # tar/untar a dummy directory, and stop if the command works
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  echo GrepMe > conftest.dir/file
+  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+  rm -rf conftest.dir
+  if test -s conftest.tar; then
+    AM_RUN_LOG([$am__untar <conftest.tar])
+    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+  fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/gdbmcli-src/config.guess
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/gdbmcli-src/config.guess	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/gdbmcli-src/config.guess	(revision 24799)
@@ -0,0 +1,1561 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+#   Free Software Foundation, Inc.
+
+timestamp='2009-04-27'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Originally written by Per Bothner <per@bothner.com>.
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int x;" > $dummy.c ;
+	for c in cc gcc c89 c99 ; do
+	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+	     CC_FOR_BUILD="$c"; break ;
+	  fi ;
+	done ;
+	if test x"$CC_FOR_BUILD" = x ; then
+	  CC_FOR_BUILD=no_compiler_found ;
+	fi
+	;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+	# NetBSD (nbsd) targets should (where applicable) match one or
+	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	#
+	# Note: NetBSD doesn't particularly care about the vendor
+	# portion of the name.  We always set it to "unknown".
+	sysctl="sysctl -n hw.machine_arch"
+	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+	case "${UNAME_MACHINE_ARCH}" in
+	    armeb) machine=armeb-unknown ;;
+	    arm*) machine=arm-unknown ;;
+	    sh3el) machine=shl-unknown ;;
+	    sh3eb) machine=sh-unknown ;;
+	    sh5el) machine=sh5le-unknown ;;
+	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+	esac
+	# The Operating System including object format, if it has switched
+	# to ELF recently, or will in the future.
+	case "${UNAME_MACHINE_ARCH}" in
+	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+		eval $set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep __ELF__ >/dev/null
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+	        os=netbsd
+		;;
+	esac
+	# The OS release
+	# Debian GNU/NetBSD machines have a different userland, and
+	# thus, need a distinct triplet. However, they do not need
+	# kernel version information, so it can be replaced with a
+	# suitable tag, in the style of linux-gnu.
+	case "${UNAME_VERSION}" in
+	    Debian*)
+		release='-gnu'
+		;;
+	    *)
+		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+		;;
+	esac
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	echo "${machine}-${os}${release}"
+	exit ;;
+    *:OpenBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+	exit ;;
+    *:ekkoBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+	exit ;;
+    *:SolidBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+	exit ;;
+    macppc:MirBSD:*:*)
+	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    *:MirBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    alpha:OSF1:*:*)
+	case $UNAME_RELEASE in
+	*4.0)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+		;;
+	*5.*)
+	        UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+		;;
+	esac
+	# According to Compaq, /usr/sbin/psrinfo has been available on
+	# OSF/1 and Tru64 systems produced since 1995.  I hope that
+	# covers most systems running today.  This code pipes the CPU
+	# types through head -n 1, so we only detect the type of CPU 0.
+	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+	case "$ALPHA_CPU_TYPE" in
+	    "EV4 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV4.5 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "LCA4 (21066/21068)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV5 (21164)")
+		UNAME_MACHINE="alphaev5" ;;
+	    "EV5.6 (21164A)")
+		UNAME_MACHINE="alphaev56" ;;
+	    "EV5.6 (21164PC)")
+		UNAME_MACHINE="alphapca56" ;;
+	    "EV5.7 (21164PC)")
+		UNAME_MACHINE="alphapca57" ;;
+	    "EV6 (21264)")
+		UNAME_MACHINE="alphaev6" ;;
+	    "EV6.7 (21264A)")
+		UNAME_MACHINE="alphaev67" ;;
+	    "EV6.8CB (21264C)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8AL (21264B)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8CX (21264D)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.9A (21264/EV69A)")
+		UNAME_MACHINE="alphaev69" ;;
+	    "EV7 (21364)")
+		UNAME_MACHINE="alphaev7" ;;
+	    "EV7.9 (21364A)")
+		UNAME_MACHINE="alphaev79" ;;
+	esac
+	# A Pn.n version is a patched version.
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	exit ;;
+    Alpha\ *:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# Should we change UNAME_MACHINE based on the output of uname instead
+	# of the specific Alpha model?
+	echo alpha-pc-interix
+	exit ;;
+    21064:Windows_NT:50:3)
+	echo alpha-dec-winnt3.5
+	exit ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-unknown-sysv4
+	exit ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-amigaos
+	exit ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-morphos
+	exit ;;
+    *:OS/390:*:*)
+	echo i370-ibm-openedition
+	exit ;;
+    *:z/VM:*:*)
+	echo s390-ibm-zvmoe
+	exit ;;
+    *:OS400:*:*)
+        echo powerpc-ibm-os400
+	exit ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit ;;
+    arm:riscos:*:*|arm:RISCOS:*:*)
+	echo arm-unknown-riscos
+	exit ;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit ;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit ;;
+    NILE*:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit ;;
+    DRS?6000:unix:4.0:6*)
+	echo sparc-icl-nx6
+	exit ;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+	case `/usr/bin/uname -p` in
+	    sparc) echo sparc-icl-nx7; exit ;;
+	esac ;;
+    s390x:SunOS:*:*)
+	echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4H:SunOS:5.*:*)
+	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+	eval $set_cc_for_build
+	SUN_ARCH="i386"
+	# If there is a compiler, see if it is configured for 64-bit objects.
+	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+	# This test works for both compilers.
+	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		grep IS_64BIT_ARCH >/dev/null
+	    then
+		SUN_ARCH="x86_64"
+	    fi
+	fi
+	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:*:*)
+	case "`/usr/bin/arch -k`" in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+	exit ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos${UNAME_RELEASE}
+	exit ;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+	case "`/bin/arch`" in
+	    sun3)
+		echo m68k-sun-sunos${UNAME_RELEASE}
+		;;
+	    sun4)
+		echo sparc-sun-sunos${UNAME_RELEASE}
+		;;
+	esac
+	exit ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos${UNAME_RELEASE}
+	exit ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+        exit ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+        echo m68k-milan-mint${UNAME_RELEASE}
+        exit ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+        echo m68k-hades-mint${UNAME_RELEASE}
+        exit ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+        echo m68k-unknown-mint${UNAME_RELEASE}
+        exit ;;
+    m68k:machten:*:*)
+	echo m68k-apple-machten${UNAME_RELEASE}
+	exit ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten${UNAME_RELEASE}
+	exit ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	echo clipper-intergraph-clix${UNAME_RELEASE}
+	exit ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c &&
+	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+	  SYSTEM_NAME=`$dummy $dummyarg` &&
+	    { echo "$SYSTEM_NAME"; exit; }
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit ;;
+    Motorola:PowerMAX_OS:*:*)
+	echo powerpc-motorola-powermax
+	exit ;;
+    Motorola:*:4.3:PL8-*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+	then
+	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+	       [ ${TARGET_BINARY_INTERFACE}x = x ]
+	    then
+		echo m88k-dg-dgux${UNAME_RELEASE}
+	    else
+		echo m88k-dg-dguxbcs${UNAME_RELEASE}
+	    fi
+	else
+	    echo i586-dg-dgux${UNAME_RELEASE}
+	fi
+ 	exit ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+	exit ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
+	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+	echo i386-ibm-aix
+	exit ;;
+    ia64:AIX:*:*)
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		eval $set_cc_for_build
+		sed 's/^		//' << EOF >$dummy.c
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+		then
+			echo "$SYSTEM_NAME"
+		else
+			echo rs6000-ibm-aix3.2.5
+		fi
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		echo rs6000-ibm-aix3.2.4
+	else
+		echo rs6000-ibm-aix3.2
+	fi
+	exit ;;
+    *:AIX:*:[456])
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+	echo romp-ibm-bsd4.4
+	exit ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+	exit ;;                             # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit ;;
+    9000/[34678]??:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+		if [ -x /usr/bin/getconf ]; then
+		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+                    case "${sc_cpu_version}" in
+                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+                      532)                      # CPU_PA_RISC2_0
+                        case "${sc_kernel_bits}" in
+                          32) HP_ARCH="hppa2.0n" ;;
+                          64) HP_ARCH="hppa2.0w" ;;
+			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+                        esac ;;
+                    esac
+		fi
+		if [ "${HP_ARCH}" = "" ]; then
+		    eval $set_cc_for_build
+		    sed 's/^              //' << EOF >$dummy.c
+
+              #define _HPUX_SOURCE
+              #include <stdlib.h>
+              #include <unistd.h>
+
+              int main ()
+              {
+              #if defined(_SC_KERNEL_BITS)
+                  long bits = sysconf(_SC_KERNEL_BITS);
+              #endif
+                  long cpu  = sysconf (_SC_CPU_VERSION);
+
+                  switch (cpu)
+              	{
+              	case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+              	case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+              	case CPU_PA_RISC2_0:
+              #if defined(_SC_KERNEL_BITS)
+              	    switch (bits)
+              		{
+              		case 64: puts ("hppa2.0w"); break;
+              		case 32: puts ("hppa2.0n"); break;
+              		default: puts ("hppa2.0"); break;
+              		} break;
+              #else  /* !defined(_SC_KERNEL_BITS) */
+              	    puts ("hppa2.0"); break;
+              #endif
+              	default: puts ("hppa1.0"); break;
+              	}
+                  exit (0);
+              }
+EOF
+		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+		    test -z "$HP_ARCH" && HP_ARCH=hppa
+		fi ;;
+	esac
+	if [ ${HP_ARCH} = "hppa2.0w" ]
+	then
+	    eval $set_cc_for_build
+
+	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+	    # generating 64-bit code.  GNU and HP use different nomenclature:
+	    #
+	    # $ CC_FOR_BUILD=cc ./config.guess
+	    # => hppa2.0w-hp-hpux11.23
+	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+	    # => hppa64-hp-hpux11.23
+
+	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+		grep __LP64__ >/dev/null
+	    then
+		HP_ARCH="hppa2.0w"
+	    else
+		HP_ARCH="hppa64"
+	    fi
+	fi
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit ;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ia64-hp-hpux${HPUX_REV}
+	exit ;;
+    3050*:HI-UX:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+		{ echo "$SYSTEM_NAME"; exit; }
+	echo unknown-hitachi-hiuxwe2
+	exit ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+	echo hppa1.0-hp-mpeix
+	exit ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit ;;
+    i*86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo ${UNAME_MACHINE}-unknown-osf1mk
+	else
+	    echo ${UNAME_MACHINE}-unknown-osf1
+	fi
+	exit ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+        exit ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+        exit ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+        exit ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+        exit ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+        exit ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*[A-Z]90:*:*:*)
+	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+	      -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*T3E:*:*:*)
+	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*SV1:*:*:*)
+	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    *:UNICOS/mp:*:*)
+	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit ;;
+    5000:UNIX_System_V:4.*:*)
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+	exit ;;
+    sparc*:BSD/OS:*:*)
+	echo sparc-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:FreeBSD:*:*)
+	case ${UNAME_MACHINE} in
+	    pc98)
+		echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    amd64)
+		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    *)
+		echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	esac
+	exit ;;
+    i*:CYGWIN*:*)
+	echo ${UNAME_MACHINE}-pc-cygwin
+	exit ;;
+    *:MINGW*:*)
+	echo ${UNAME_MACHINE}-pc-mingw32
+	exit ;;
+    i*:windows32*:*)
+    	# uname -m includes "-pc" on this system.
+    	echo ${UNAME_MACHINE}-mingw32
+	exit ;;
+    i*:PW*:*)
+	echo ${UNAME_MACHINE}-pc-pw32
+	exit ;;
+    *:Interix*:[3456]*)
+    	case ${UNAME_MACHINE} in
+	    x86)
+		echo i586-pc-interix${UNAME_RELEASE}
+		exit ;;
+	    EM64T | authenticamd | genuineintel)
+		echo x86_64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	    IA64)
+		echo ia64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	esac ;;
+    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+	echo i${UNAME_MACHINE}-pc-mks
+	exit ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+	# UNAME_MACHINE based on the output of uname instead of i386?
+	echo i586-pc-interix
+	exit ;;
+    i*:UWIN*:*)
+	echo ${UNAME_MACHINE}-pc-uwin
+	exit ;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+	echo x86_64-unknown-cygwin
+	exit ;;
+    p*:CYGWIN*:*)
+	echo powerpcle-unknown-cygwin
+	exit ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    *:GNU:*:*)
+	# the GNU system
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit ;;
+    *:GNU/*:*:*)
+	# other systems with GNU libc and userland
+	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+	exit ;;
+    i*86:Minix:*:*)
+	echo ${UNAME_MACHINE}-pc-minix
+	exit ;;
+    arm*:Linux:*:*)
+	eval $set_cc_for_build
+	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+	    | grep -q __ARM_EABI__
+	then
+	    echo ${UNAME_MACHINE}-unknown-linux-gnu
+	else
+	    echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+	fi
+	exit ;;
+    avr32*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    cris:Linux:*:*)
+	echo cris-axis-linux-gnu
+	exit ;;
+    crisv32:Linux:*:*)
+	echo crisv32-axis-linux-gnu
+	exit ;;
+    frv:Linux:*:*)
+    	echo frv-unknown-linux-gnu
+	exit ;;
+    ia64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m32r*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m68*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    mips:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef mips
+	#undef mipsel
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=mipsel
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=mips
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+	    /^CPU/{
+		s: ::g
+		p
+	    }'`"
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+	;;
+    mips64:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef mips64
+	#undef mips64el
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=mips64el
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=mips64
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+	    /^CPU/{
+		s: ::g
+		p
+	    }'`"
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+	;;
+    or32:Linux:*:*)
+	echo or32-unknown-linux-gnu
+	exit ;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-gnu
+	exit ;;
+    ppc64:Linux:*:*)
+	echo powerpc64-unknown-linux-gnu
+	exit ;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev68 ;;
+        esac
+	objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+	exit ;;
+    padre:Linux:*:*)
+	echo sparc-unknown-linux-gnu
+	exit ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
+	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
+	  *)    echo hppa-unknown-linux-gnu ;;
+	esac
+	exit ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-gnu
+	exit ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	echo ${UNAME_MACHINE}-ibm-linux
+	exit ;;
+    sh64*:Linux:*:*)
+    	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    sh*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    vax:Linux:*:*)
+	echo ${UNAME_MACHINE}-dec-linux-gnu
+	exit ;;
+    x86_64:Linux:*:*)
+	echo x86_64-unknown-linux-gnu
+	exit ;;
+    xtensa*:Linux:*:*)
+    	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    i*86:Linux:*:*)
+	# The BFD linker knows what the default object file format is, so
+	# first see if it will tell us. cd to the root directory to prevent
+	# problems with other programs or directories called `ld' in the path.
+	# Set LC_ALL=C to ensure ld outputs messages in English.
+	ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+			 | sed -ne '/supported targets:/!d
+				    s/[ 	][ 	]*/ /g
+				    s/.*supported targets: *//
+				    s/ .*//
+				    p'`
+        case "$ld_supported_targets" in
+	  elf32-i386)
+		TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+		;;
+	  a.out-i386-linux)
+		echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+		exit ;;
+	  "")
+		# Either a pre-BFD a.out linker (linux-gnuoldld) or
+		# one that does not give us useful --help.
+		echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+		exit ;;
+	esac
+	# Determine whether the default compiler is a.out or elf
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <features.h>
+	#ifdef __ELF__
+	# ifdef __GLIBC__
+	#  if __GLIBC__ >= 2
+	LIBC=gnu
+	#  else
+	LIBC=gnulibc1
+	#  endif
+	# else
+	LIBC=gnulibc1
+	# endif
+	#else
+	#if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+	LIBC=gnu
+	#else
+	LIBC=gnuaout
+	#endif
+	#endif
+	#ifdef __dietlibc__
+	LIBC=dietlibc
+	#endif
+EOF
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+	    /^LIBC/{
+		s: ::g
+		p
+	    }'`"
+	test x"${LIBC}" != x && {
+		echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+		exit
+	}
+	test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
+	;;
+    i*86:DYNIX/ptx:4*:*)
+	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+	# earlier versions are messed up and put the nodename in both
+	# sysname and nodename.
+	echo i386-sequent-sysv4
+	exit ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+        # Unixware is an offshoot of SVR4, but it has its own version
+        # number series starting with 2...
+        # I am not positive that other SVR4 systems won't match this,
+	# I just have to hope.  -- rms.
+        # Use sysv4.2uw... so that sysv4* matches it.
+	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+	exit ;;
+    i*86:OS/2:*:*)
+	# If we were able to find `uname', then EMX Unix compatibility
+	# is probably installed.
+	echo ${UNAME_MACHINE}-pc-os2-emx
+	exit ;;
+    i*86:XTS-300:*:STOP)
+	echo ${UNAME_MACHINE}-unknown-stop
+	exit ;;
+    i*86:atheos:*:*)
+	echo ${UNAME_MACHINE}-unknown-atheos
+	exit ;;
+    i*86:syllable:*:*)
+	echo ${UNAME_MACHINE}-pc-syllable
+	exit ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+	echo i386-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    i*86:*DOS:*:*)
+	echo ${UNAME_MACHINE}-pc-msdosdjgpp
+	exit ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+	else
+		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+	fi
+	exit ;;
+    i*86:*:5:[678]*)
+    	# UnixWare 7.x, OpenUNIX and OpenServer 6.
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	exit ;;
+    i*86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-pc-sysv32
+	fi
+	exit ;;
+    pc:*:*:*)
+	# Left here for compatibility:
+        # uname -m prints for DJGPP always 'pc', but it prints nothing about
+        # the processor, so we play safe by assuming i586.
+	# Note: whatever this is, it MUST be the same as what config.sub
+	# prints for the "djgpp" host, or else GDB configury will decide that
+	# this is a cross-build.
+	echo i586-pc-msdosdjgpp
+        exit ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit ;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	fi
+	exit ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+	echo m68k-convergent-sysv
+	exit ;;
+    M680?0:D-NIX:5.3:*)
+	echo m68k-diab-dnix
+	exit ;;
+    M68*:*:R3V[5678]*:*)
+	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && { echo i486-ncr-sysv4; exit; } ;;
+    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+	OS_REL='.3'
+	test -r /etc/.relid \
+	    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+	echo m68k-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    rs6000:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+	echo powerpc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv${UNAME_RELEASE}
+	exit ;;
+    RM*:ReliantUNIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		echo ${UNAME_MACHINE}-sni-sysv4
+	else
+		echo ns32k-sni-sysv
+	fi
+	exit ;;
+    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                      # says <Richard.M.Bartel@ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes@openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit ;;
+    *:*:*:FTX*)
+	# From seanf@swdc.stratus.com.
+	echo i860-stratus-sysv4
+	exit ;;
+    i*86:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo ${UNAME_MACHINE}-stratus-vos
+	exit ;;
+    *:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo hppa1.1-stratus-vos
+	exit ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux${UNAME_RELEASE}
+	exit ;;
+    news*:NEWS-OS:6*:*)
+	echo mips-sony-newsos6
+	exit ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+	if [ -d /usr/nec ]; then
+	        echo mips-nec-sysv${UNAME_RELEASE}
+	else
+	        echo mips-unknown-sysv${UNAME_RELEASE}
+	fi
+        exit ;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	echo powerpc-be-beos
+	exit ;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	echo powerpc-apple-beos
+	exit ;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	echo i586-pc-beos
+	exit ;;
+    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
+	echo i586-pc-haiku
+	exit ;;
+    SX-4:SUPER-UX:*:*)
+	echo sx4-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-5:SUPER-UX:*:*)
+	echo sx5-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-6:SUPER-UX:*:*)
+	echo sx6-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-7:SUPER-UX:*:*)
+	echo sx7-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8:SUPER-UX:*:*)
+	echo sx8-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8R:SUPER-UX:*:*)
+	echo sx8r-nec-superux${UNAME_RELEASE}
+	exit ;;
+    Power*:Rhapsody:*:*)
+	echo powerpc-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Rhapsody:*:*)
+	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Darwin:*:*)
+	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+	case $UNAME_PROCESSOR in
+	    unknown) UNAME_PROCESSOR=powerpc ;;
+	esac
+	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+	exit ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	UNAME_PROCESSOR=`uname -p`
+	if test "$UNAME_PROCESSOR" = "x86"; then
+		UNAME_PROCESSOR=i386
+		UNAME_MACHINE=pc
+	fi
+	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+	exit ;;
+    *:QNX:*:4*)
+	echo i386-pc-qnx
+	exit ;;
+    NSE-?:NONSTOP_KERNEL:*:*)
+	echo nse-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSR-?:NONSTOP_KERNEL:*:*)
+	echo nsr-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    *:NonStop-UX:*:*)
+	echo mips-compaq-nonstopux
+	exit ;;
+    BS2000:POSIX*:*:*)
+	echo bs2000-siemens-sysv
+	exit ;;
+    DS/*:UNIX_System_V:*:*)
+	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+	exit ;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	if test "$cputype" = "386"; then
+	    UNAME_MACHINE=i386
+	else
+	    UNAME_MACHINE="$cputype"
+	fi
+	echo ${UNAME_MACHINE}-unknown-plan9
+	exit ;;
+    *:TOPS-10:*:*)
+	echo pdp10-unknown-tops10
+	exit ;;
+    *:TENEX:*:*)
+	echo pdp10-unknown-tenex
+	exit ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	echo pdp10-dec-tops20
+	exit ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	echo pdp10-xkl-tops20
+	exit ;;
+    *:TOPS-20:*:*)
+	echo pdp10-unknown-tops20
+	exit ;;
+    *:ITS:*:*)
+	echo pdp10-unknown-its
+	exit ;;
+    SEI:*:*:SEIUX)
+        echo mips-sei-seiux${UNAME_RELEASE}
+	exit ;;
+    *:DragonFly:*:*)
+	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit ;;
+    *:*VMS:*:*)
+    	UNAME_MACHINE=`(uname -p) 2>/dev/null`
+	case "${UNAME_MACHINE}" in
+	    A*) echo alpha-dec-vms ; exit ;;
+	    I*) echo ia64-dec-vms ; exit ;;
+	    V*) echo vax-dec-vms ; exit ;;
+	esac ;;
+    *:XENIX:*:SysV)
+	echo i386-pc-xenix
+	exit ;;
+    i*86:skyos:*:*)
+	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+	exit ;;
+    i*86:rdos:*:*)
+	echo ${UNAME_MACHINE}-pc-rdos
+	exit ;;
+    i*86:AROS:*:*)
+	echo ${UNAME_MACHINE}-pc-aros
+	exit ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+          "4"
+#else
+	  ""
+#endif
+         ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+	printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+	printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# else
+    printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+	{ echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+	echo c1-convex-bsd
+	exit ;;
+    c2*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit ;;
+    c34*)
+	echo c34-convex-bsd
+	exit ;;
+    c38*)
+	echo c38-convex-bsd
+	exit ;;
+    c4*)
+	echo c4-convex-bsd
+	exit ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+and
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/gdbmcli-src/config.sub
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/gdbmcli-src/config.sub	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/gdbmcli-src/config.sub	(revision 24799)
@@ -0,0 +1,1686 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+#   Free Software Foundation, Inc.
+
+timestamp='2009-04-17'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
+  uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
+  kopensolaris*-gnu* | \
+  storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+	-sun*os*)
+		# Prevent following clause from handling this invalid input.
+		;;
+	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+	-apple | -axis | -knuth | -cray)
+		os=
+		basic_machine=$1
+		;;
+	-sim | -cisco | -oki | -wec | -winbond)
+		os=
+		basic_machine=$1
+		;;
+	-scout)
+		;;
+	-wrs)
+		os=-vxworks
+		basic_machine=$1
+		;;
+	-chorusos*)
+		os=-chorusos
+		basic_machine=$1
+		;;
+ 	-chorusrdb)
+ 		os=-chorusrdb
+		basic_machine=$1
+ 		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco6)
+		os=-sco5v6
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5)
+		os=-sco3.2v5
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5v6*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-udk*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-lynx*)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-windowsnt*)
+		os=`echo $os | sed -e 's/windowsnt/winnt/'`
+		;;
+	-psos*)
+		os=-psos
+		;;
+	-mint | -mint[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+	# Recognize the basic CPU types without company name.
+	# Some are omitted here because they have special meanings below.
+	1750a | 580 \
+	| a29k \
+	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+	| am33_2.0 \
+	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+	| bfin \
+	| c4x | clipper \
+	| d10v | d30v | dlx | dsp16xx \
+	| fido | fr30 | frv \
+	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| i370 | i860 | i960 | ia64 \
+	| ip2k | iq2000 \
+	| lm32 \
+	| m32c | m32r | m32rle | m68000 | m68k | m88k \
+	| maxq | mb | microblaze | mcore | mep | metag \
+	| mips | mipsbe | mipseb | mipsel | mipsle \
+	| mips16 \
+	| mips64 | mips64el \
+	| mips64octeon | mips64octeonel \
+	| mips64orion | mips64orionel \
+	| mips64r5900 | mips64r5900el \
+	| mips64vr | mips64vrel \
+	| mips64vr4100 | mips64vr4100el \
+	| mips64vr4300 | mips64vr4300el \
+	| mips64vr5000 | mips64vr5000el \
+	| mips64vr5900 | mips64vr5900el \
+	| mipsisa32 | mipsisa32el \
+	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa64 | mipsisa64el \
+	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64sb1 | mipsisa64sb1el \
+	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipstx39 | mipstx39el \
+	| mn10200 | mn10300 \
+	| moxie \
+	| mt \
+	| msp430 \
+	| nios | nios2 \
+	| ns16k | ns32k \
+	| or32 \
+	| pdp10 | pdp11 | pj | pjl \
+	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+	| pyramid \
+	| score \
+	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+	| sh64 | sh64le \
+	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+	| spu | strongarm \
+	| tahoe | thumb | tic4x | tic80 | tron \
+	| v850 | v850e \
+	| we32k \
+	| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
+	| z8k | z80)
+		basic_machine=$basic_machine-unknown
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12)
+		# Motorola 68HC11/12.
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+		;;
+	ms1)
+		basic_machine=mt-unknown
+		;;
+
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i*86 | x86_64)
+	  basic_machine=$basic_machine-pc
+	  ;;
+	# Object if more than one company name word.
+	*-*-*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+	# Recognize the basic CPU types with company name.
+	580-* \
+	| a29k-* \
+	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+	| avr-* | avr32-* \
+	| bfin-* | bs2000-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+	| clipper-* | craynv-* | cydra-* \
+	| d10v-* | d30v-* | dlx-* \
+	| elxsi-* \
+	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+	| h8300-* | h8500-* \
+	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| i*86-* | i860-* | i960-* | ia64-* \
+	| ip2k-* | iq2000-* \
+	| lm32-* \
+	| m32c-* | m32r-* | m32rle-* \
+	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
+	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+	| mips16-* \
+	| mips64-* | mips64el-* \
+	| mips64octeon-* | mips64octeonel-* \
+	| mips64orion-* | mips64orionel-* \
+	| mips64r5900-* | mips64r5900el-* \
+	| mips64vr-* | mips64vrel-* \
+	| mips64vr4100-* | mips64vr4100el-* \
+	| mips64vr4300-* | mips64vr4300el-* \
+	| mips64vr5000-* | mips64vr5000el-* \
+	| mips64vr5900-* | mips64vr5900el-* \
+	| mipsisa32-* | mipsisa32el-* \
+	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa64-* | mipsisa64el-* \
+	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64sb1-* | mipsisa64sb1el-* \
+	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipstx39-* | mipstx39el-* \
+	| mmix-* \
+	| mt-* \
+	| msp430-* \
+	| nios-* | nios2-* \
+	| none-* | np1-* | ns16k-* | ns32k-* \
+	| orion-* \
+	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+	| pyramid-* \
+	| romp-* | rs6000-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+	| sparclite-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
+	| tahoe-* | thumb-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \
+	| tron-* \
+	| v850-* | v850e-* | vax-* \
+	| we32k-* \
+	| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
+	| xstormy16-* | xtensa*-* \
+	| ymp-* \
+	| z8k-* | z80-*)
+		;;
+	# Recognize the basic CPU types without company name, with glob match.
+	xtensa*)
+		basic_machine=$basic_machine-unknown
+		;;
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	386bsd)
+		basic_machine=i386-unknown
+		os=-bsd
+		;;
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		basic_machine=m68000-att
+		;;
+	3b*)
+		basic_machine=we32k-att
+		;;
+	a29khif)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+    	abacus)
+		basic_machine=abacus-unknown
+		;;
+	adobe68k)
+		basic_machine=m68010-adobe
+		os=-scout
+		;;
+	alliant | fx80)
+		basic_machine=fx80-alliant
+		;;
+	altos | altos3068)
+		basic_machine=m68k-altos
+		;;
+	am29k)
+		basic_machine=a29k-none
+		os=-bsd
+		;;
+	amd64)
+		basic_machine=x86_64-pc
+		;;
+	amd64-*)
+		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	amdahl)
+		basic_machine=580-amdahl
+		os=-sysv
+		;;
+	amiga | amiga-*)
+		basic_machine=m68k-unknown
+		;;
+	amigaos | amigados)
+		basic_machine=m68k-unknown
+		os=-amigaos
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-unknown
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	apollo68bsd)
+		basic_machine=m68k-apollo
+		os=-bsd
+		;;
+	aros)
+		basic_machine=i386-pc
+		os=-aros
+		;;
+	aux)
+		basic_machine=m68k-apple
+		os=-aux
+		;;
+	balance)
+		basic_machine=ns32k-sequent
+		os=-dynix
+		;;
+	blackfin)
+		basic_machine=bfin-unknown
+		os=-linux
+		;;
+	blackfin-*)
+		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	c90)
+		basic_machine=c90-cray
+		os=-unicos
+		;;
+        cegcc)
+		basic_machine=arm-unknown
+		os=-cegcc
+		;;
+	convex-c1)
+		basic_machine=c1-convex
+		os=-bsd
+		;;
+	convex-c2)
+		basic_machine=c2-convex
+		os=-bsd
+		;;
+	convex-c32)
+		basic_machine=c32-convex
+		os=-bsd
+		;;
+	convex-c34)
+		basic_machine=c34-convex
+		os=-bsd
+		;;
+	convex-c38)
+		basic_machine=c38-convex
+		os=-bsd
+		;;
+	cray | j90)
+		basic_machine=j90-cray
+		os=-unicos
+		;;
+	craynv)
+		basic_machine=craynv-cray
+		os=-unicosmp
+		;;
+	cr16)
+		basic_machine=cr16-unknown
+		os=-elf
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	crisv32 | crisv32-* | etraxfs*)
+		basic_machine=crisv32-axis
+		;;
+	cris | cris-* | etrax*)
+		basic_machine=cris-axis
+		;;
+	crx)
+		basic_machine=crx-unknown
+		os=-elf
+		;;
+	da30 | da30-*)
+		basic_machine=m68k-da30
+		;;
+	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+		basic_machine=mips-dec
+		;;
+	decsystem10* | dec10*)
+		basic_machine=pdp10-dec
+		os=-tops10
+		;;
+	decsystem20* | dec20*)
+		basic_machine=pdp10-dec
+		os=-tops20
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		basic_machine=m68k-motorola
+		;;
+	delta88)
+		basic_machine=m88k-motorola
+		os=-sysv3
+		;;
+	dicos)
+		basic_machine=i686-pc
+		os=-dicos
+		;;
+	djgpp)
+		basic_machine=i586-pc
+		os=-msdosdjgpp
+		;;
+	dpx20 | dpx20-*)
+		basic_machine=rs6000-bull
+		os=-bosx
+		;;
+	dpx2* | dpx2*-bull)
+		basic_machine=m68k-bull
+		os=-sysv3
+		;;
+	ebmon29k)
+		basic_machine=a29k-amd
+		os=-ebmon
+		;;
+	elxsi)
+		basic_machine=elxsi-elxsi
+		os=-bsd
+		;;
+	encore | umax | mmax)
+		basic_machine=ns32k-encore
+		;;
+	es1800 | OSE68k | ose68k | ose | OSE)
+		basic_machine=m68k-ericsson
+		os=-ose
+		;;
+	fx2800)
+		basic_machine=i860-alliant
+		;;
+	genix)
+		basic_machine=ns32k-ns
+		;;
+	gmicro)
+		basic_machine=tron-gmicro
+		os=-sysv
+		;;
+	go32)
+		basic_machine=i386-pc
+		os=-go32
+		;;
+	h3050r* | hiux*)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	h8300hms)
+		basic_machine=h8300-hitachi
+		os=-hms
+		;;
+	h8300xray)
+		basic_machine=h8300-hitachi
+		os=-xray
+		;;
+	h8500hms)
+		basic_machine=h8500-hitachi
+		os=-hms
+		;;
+	harris)
+		basic_machine=m88k-harris
+		os=-sysv3
+		;;
+	hp300-*)
+		basic_machine=m68k-hp
+		;;
+	hp300bsd)
+		basic_machine=m68k-hp
+		os=-bsd
+		;;
+	hp300hpux)
+		basic_machine=m68k-hp
+		os=-hpux
+		;;
+	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		basic_machine=m68000-hp
+		;;
+	hp9k3[2-9][0-9])
+		basic_machine=m68k-hp
+		;;
+	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k78[0-9] | hp78[0-9])
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][13679] | hp8[0-9][13679])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hppa-next)
+		os=-nextstep3
+		;;
+	hppaosf)
+		basic_machine=hppa1.1-hp
+		os=-osf
+		;;
+	hppro)
+		basic_machine=hppa1.1-hp
+		os=-proelf
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+	i*86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv32
+		;;
+	i*86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv4
+		;;
+	i*86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv
+		;;
+	i*86sol2)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-solaris2
+		;;
+	i386mach)
+		basic_machine=i386-mach
+		os=-mach
+		;;
+	i386-vsta | vsta)
+		basic_machine=i386-unknown
+		os=-vsta
+		;;
+	iris | iris4d)
+		basic_machine=mips-sgi
+		case $os in
+		    -irix*)
+			;;
+		    *)
+			os=-irix4
+			;;
+		esac
+		;;
+	isi68 | isi)
+		basic_machine=m68k-isi
+		os=-sysv
+		;;
+	m68knommu)
+		basic_machine=m68k-unknown
+		os=-linux
+		;;
+	m68knommu-*)
+		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	m88k-omron*)
+		basic_machine=m88k-omron
+		;;
+	magnum | m3230)
+		basic_machine=mips-mips
+		os=-sysv
+		;;
+	merlin)
+		basic_machine=ns32k-utek
+		os=-sysv
+		;;
+	mingw32)
+		basic_machine=i386-pc
+		os=-mingw32
+		;;
+	mingw32ce)
+		basic_machine=arm-unknown
+		os=-mingw32ce
+		;;
+	miniframe)
+		basic_machine=m68000-convergent
+		;;
+	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+	mips3*-*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	monitor)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	morphos)
+		basic_machine=powerpc-unknown
+		os=-morphos
+		;;
+	msdos)
+		basic_machine=i386-pc
+		os=-msdos
+		;;
+	ms1-*)
+		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+		;;
+	mvs)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	netbsd386)
+		basic_machine=i386-unknown
+		os=-netbsd
+		;;
+	netwinder)
+		basic_machine=armv4l-rebel
+		os=-linux
+		;;
+	news | news700 | news800 | news900)
+		basic_machine=m68k-sony
+		os=-newsos
+		;;
+	news1000)
+		basic_machine=m68030-sony
+		os=-newsos
+		;;
+	news-3600 | risc-news)
+		basic_machine=mips-sony
+		os=-newsos
+		;;
+	necv70)
+		basic_machine=v70-nec
+		os=-sysv
+		;;
+	next | m*-next )
+		basic_machine=m68k-next
+		case $os in
+		    -nextstep* )
+			;;
+		    -ns2*)
+		      os=-nextstep2
+			;;
+		    *)
+		      os=-nextstep3
+			;;
+		esac
+		;;
+	nh3000)
+		basic_machine=m68k-harris
+		os=-cxux
+		;;
+	nh[45]000)
+		basic_machine=m88k-harris
+		os=-cxux
+		;;
+	nindy960)
+		basic_machine=i960-intel
+		os=-nindy
+		;;
+	mon960)
+		basic_machine=i960-intel
+		os=-mon960
+		;;
+	nonstopux)
+		basic_machine=mips-compaq
+		os=-nonstopux
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	nsr-tandem)
+		basic_machine=nsr-tandem
+		;;
+	op50n-* | op60c-*)
+		basic_machine=hppa1.1-oki
+		os=-proelf
+		;;
+	openrisc | openrisc-*)
+		basic_machine=or32-unknown
+		;;
+	os400)
+		basic_machine=powerpc-ibm
+		os=-os400
+		;;
+	OSE68000 | ose68000)
+		basic_machine=m68000-ericsson
+		os=-ose
+		;;
+	os68k)
+		basic_machine=m68k-none
+		os=-os68k
+		;;
+	pa-hitachi)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	paragon)
+		basic_machine=i860-intel
+		os=-osf
+		;;
+	parisc)
+		basic_machine=hppa-unknown
+		os=-linux
+		;;
+	parisc-*)
+		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	pbd)
+		basic_machine=sparc-tti
+		;;
+	pbb)
+		basic_machine=m68k-tti
+		;;
+	pc532 | pc532-*)
+		basic_machine=ns32k-pc532
+		;;
+	pc98)
+		basic_machine=i386-pc
+		;;
+	pc98-*)
+		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium | p5 | k5 | k6 | nexgen | viac3)
+		basic_machine=i586-pc
+		;;
+	pentiumpro | p6 | 6x86 | athlon | athlon_*)
+		basic_machine=i686-pc
+		;;
+	pentiumii | pentium2 | pentiumiii | pentium3)
+		basic_machine=i686-pc
+		;;
+	pentium4)
+		basic_machine=i786-pc
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium4-*)
+		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=power-ibm
+		;;
+	ppc)	basic_machine=powerpc-unknown
+		;;
+	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppcle | powerpclittle | ppc-le | powerpc-little)
+		basic_machine=powerpcle-unknown
+		;;
+	ppcle-* | powerpclittle-*)
+		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64)	basic_machine=powerpc64-unknown
+		;;
+	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+		basic_machine=powerpc64le-unknown
+		;;
+	ppc64le-* | powerpc64little-*)
+		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	pw32)
+		basic_machine=i586-unknown
+		os=-pw32
+		;;
+	rdos)
+		basic_machine=i386-pc
+		os=-rdos
+		;;
+	rom68k)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	rm[46]00)
+		basic_machine=mips-siemens
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	s390 | s390-*)
+		basic_machine=s390-ibm
+		;;
+	s390x | s390x-*)
+		basic_machine=s390x-ibm
+		;;
+	sa29200)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	sb1)
+		basic_machine=mipsisa64sb1-unknown
+		;;
+	sb1el)
+		basic_machine=mipsisa64sb1el-unknown
+		;;
+	sde)
+		basic_machine=mipsisa32-sde
+		os=-elf
+		;;
+	sei)
+		basic_machine=mips-sei
+		os=-seiux
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sh5el)
+		basic_machine=sh5le-unknown
+		;;
+	sh64)
+		basic_machine=sh64-unknown
+		;;
+	sparclite-wrs | simso-wrs)
+		basic_machine=sparclite-wrs
+		os=-vxworks
+		;;
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
+		;;
+	spur)
+		basic_machine=spur-unknown
+		;;
+	st2000)
+		basic_machine=m68k-tandem
+		;;
+	stratus)
+		basic_machine=i860-stratus
+		os=-sysv4
+		;;
+	sun2)
+		basic_machine=m68000-sun
+		;;
+	sun2os3)
+		basic_machine=m68000-sun
+		os=-sunos3
+		;;
+	sun2os4)
+		basic_machine=m68000-sun
+		os=-sunos4
+		;;
+	sun3os3)
+		basic_machine=m68k-sun
+		os=-sunos3
+		;;
+	sun3os4)
+		basic_machine=m68k-sun
+		os=-sunos4
+		;;
+	sun4os3)
+		basic_machine=sparc-sun
+		os=-sunos3
+		;;
+	sun4os4)
+		basic_machine=sparc-sun
+		os=-sunos4
+		;;
+	sun4sol2)
+		basic_machine=sparc-sun
+		os=-solaris2
+		;;
+	sun3 | sun3-*)
+		basic_machine=m68k-sun
+		;;
+	sun4)
+		basic_machine=sparc-sun
+		;;
+	sun386 | sun386i | roadrunner)
+		basic_machine=i386-sun
+		;;
+	sv1)
+		basic_machine=sv1-cray
+		os=-unicos
+		;;
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
+		;;
+	t3e)
+		basic_machine=alphaev5-cray
+		os=-unicos
+		;;
+	t90)
+		basic_machine=t90-cray
+		os=-unicos
+		;;
+	tic54x | c54x*)
+		basic_machine=tic54x-unknown
+		os=-coff
+		;;
+	tic55x | c55x*)
+		basic_machine=tic55x-unknown
+		os=-coff
+		;;
+	tic6x | c6x*)
+		basic_machine=tic6x-unknown
+		os=-coff
+		;;
+	tile*)
+		basic_machine=tile-unknown
+		os=-linux-gnu
+		;;
+	tx39)
+		basic_machine=mipstx39-unknown
+		;;
+	tx39el)
+		basic_machine=mipstx39el-unknown
+		;;
+	toad1)
+		basic_machine=pdp10-xkl
+		os=-tops20
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	tpf)
+		basic_machine=s390x-ibm
+		os=-tpf
+		;;
+	udi29k)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
+		;;
+	v810 | necv810)
+		basic_machine=v810-nec
+		os=-none
+		;;
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
+		;;
+	vms)
+		basic_machine=vax-dec
+		os=-vms
+		;;
+	vpp*|vx|vx-*)
+		basic_machine=f301-fujitsu
+		;;
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
+		;;
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
+		;;
+	vxworks29k)
+		basic_machine=a29k-wrs
+		os=-vxworks
+		;;
+	w65*)
+		basic_machine=w65-wdc
+		os=-none
+		;;
+	w89k-*)
+		basic_machine=hppa1.1-winbond
+		os=-proelf
+		;;
+	xbox)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	z8k-*-coff)
+		basic_machine=z8k-unknown
+		os=-sim
+		;;
+	z80-*-coff)
+		basic_machine=z80-unknown
+		os=-sim
+		;;
+	none)
+		basic_machine=none-none
+		os=-none
+		;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		basic_machine=hppa1.1-winbond
+		;;
+	op50n)
+		basic_machine=hppa1.1-oki
+		;;
+	op60c)
+		basic_machine=hppa1.1-oki
+		;;
+	romp)
+		basic_machine=romp-ibm
+		;;
+	mmix)
+		basic_machine=mmix-knuth
+		;;
+	rs6000)
+		basic_machine=rs6000-ibm
+		;;
+	vax)
+		basic_machine=vax-dec
+		;;
+	pdp10)
+		# there are many clones, so DEC is not a safe bet
+		basic_machine=pdp10-unknown
+		;;
+	pdp11)
+		basic_machine=pdp11-dec
+		;;
+	we32k)
+		basic_machine=we32k-att
+		;;
+	sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
+		basic_machine=sh-unknown
+		;;
+	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+		basic_machine=sparc-sun
+		;;
+	cydra)
+		basic_machine=cydra-cydrome
+		;;
+	orion)
+		basic_machine=orion-highlevel
+		;;
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	mac | mpw | mac-mpw)
+		basic_machine=m68k-apple
+		;;
+	pmac | pmac-mpw)
+		basic_machine=powerpc-apple
+		;;
+	*-unknown)
+		# Make sure to match an already-canonicalized machine name.
+		;;
+	*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+	*-digital*)
+		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+		;;
+	*-commodore*)
+		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+        # First match some system type aliases
+        # that might get confused with valid system types.
+	# -solaris* is a basic system type, with this one exception.
+	-solaris1 | -solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	-solaris)
+		os=-solaris2
+		;;
+	-svr4*)
+		os=-sysv4
+		;;
+	-unixware*)
+		os=-sysv4.2uw
+		;;
+	-gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+		;;
+	# First accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST END IN A *, to match a version number.
+	# -sysv* is not here because it comes later, after sysvr4.
+	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+	      | -kopensolaris* \
+	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+	      | -aos* | -aros* \
+	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+	      | -openbsd* | -solidbsd* \
+	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+	      | -chorusos* | -chorusrdb* | -cegcc* \
+	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	-qnx*)
+		case $basic_machine in
+		    x86-* | i*86-*)
+			;;
+		    *)
+			os=-nto$os
+			;;
+		esac
+		;;
+	-nto-qnx*)
+		;;
+	-nto*)
+		os=`echo $os | sed -e 's|nto|nto-qnx|'`
+		;;
+	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+		;;
+	-mac*)
+		os=`echo $os | sed -e 's|mac|macos|'`
+		;;
+	-linux-dietlibc)
+		os=-linux-dietlibc
+		;;
+	-linux*)
+		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+		;;
+	-sunos5*)
+		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+		;;
+	-sunos6*)
+		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+		;;
+	-opened*)
+		os=-openedition
+		;;
+        -os400*)
+		os=-os400
+		;;
+	-wince*)
+		os=-wince
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-atheos*)
+		os=-atheos
+		;;
+	-syllable*)
+		os=-syllable
+		;;
+	-386bsd)
+		os=-bsd
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	-nova*)
+		os=-rtmk-nova
+		;;
+	-ns2 )
+		os=-nextstep2
+		;;
+	-nsk*)
+		os=-nsk
+		;;
+	# Preserve the version number of sinix5.
+	-sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	-sinix*)
+		os=-sysv4
+		;;
+        -tpf*)
+		os=-tpf
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-svr4)
+		os=-sysv4
+		;;
+	-svr3)
+		os=-sysv3
+		;;
+	-sysvr4)
+		os=-sysv4
+		;;
+	# This must come after -sysvr4.
+	-sysv*)
+		;;
+	-ose*)
+		os=-ose
+		;;
+	-es1800*)
+		os=-ose
+		;;
+	-xenix)
+		os=-xenix
+		;;
+	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+		os=-mint
+		;;
+	-aros*)
+		os=-aros
+		;;
+	-kaos*)
+		os=-kaos
+		;;
+	-zvmoe)
+		os=-zvmoe
+		;;
+	-dicos*)
+		os=-dicos
+		;;
+	-none)
+		;;
+	*)
+		# Get rid of the `-' at the beginning of $os.
+		os=`echo $os | sed 's/[^-]*-//'`
+		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+		exit 1
+		;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+        score-*)
+		os=-elf
+		;;
+        spu-*)
+		os=-elf
+		;;
+	*-acorn)
+		os=-riscix1.2
+		;;
+	arm*-rebel)
+		os=-linux
+		;;
+	arm*-semi)
+		os=-aout
+		;;
+        c4x-* | tic4x-*)
+        	os=-coff
+		;;
+	# This must come before the *-dec entry.
+	pdp10-*)
+		os=-tops20
+		;;
+	pdp11-*)
+		os=-none
+		;;
+	*-dec | vax-*)
+		os=-ultrix4.2
+		;;
+	m68*-apollo)
+		os=-domain
+		;;
+	i386-sun)
+		os=-sunos4.0.2
+		;;
+	m68000-sun)
+		os=-sunos3
+		# This also exists in the configure program, but was not the
+		# default.
+		# os=-sunos4
+		;;
+	m68*-cisco)
+		os=-aout
+		;;
+        mep-*)
+		os=-elf
+		;;
+	mips*-cisco)
+		os=-elf
+		;;
+	mips*-*)
+		os=-elf
+		;;
+	or32-*)
+		os=-coff
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	*-be)
+		os=-beos
+		;;
+	*-haiku)
+		os=-haiku
+		;;
+	*-ibm)
+		os=-aix
+		;;
+    	*-knuth)
+		os=-mmixware
+		;;
+	*-wec)
+		os=-proelf
+		;;
+	*-winbond)
+		os=-proelf
+		;;
+	*-oki)
+		os=-proelf
+		;;
+	*-hp)
+		os=-hpux
+		;;
+	*-hitachi)
+		os=-hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=-sysv
+		;;
+	*-cbm)
+		os=-amigaos
+		;;
+	*-dg)
+		os=-dgux
+		;;
+	*-dolphin)
+		os=-sysv3
+		;;
+	m68k-ccur)
+		os=-rtu
+		;;
+	m88k-omron*)
+		os=-luna
+		;;
+	*-next )
+		os=-nextstep
+		;;
+	*-sequent)
+		os=-ptx
+		;;
+	*-crds)
+		os=-unos
+		;;
+	*-ns)
+		os=-genix
+		;;
+	i370-*)
+		os=-mvs
+		;;
+	*-next)
+		os=-nextstep3
+		;;
+	*-gould)
+		os=-sysv
+		;;
+	*-highlevel)
+		os=-bsd
+		;;
+	*-encore)
+		os=-bsd
+		;;
+	*-sgi)
+		os=-irix
+		;;
+	*-siemens)
+		os=-sysv4
+		;;
+	*-masscomp)
+		os=-rtu
+		;;
+	f30[01]-fujitsu | f700-fujitsu)
+		os=-uxpv
+		;;
+	*-rom68k)
+		os=-coff
+		;;
+	*-*bug)
+		os=-coff
+		;;
+	*-apple)
+		os=-macos
+		;;
+	*-atari*)
+		os=-mint
+		;;
+	*)
+		os=-none
+		;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+	*-unknown)
+		case $os in
+			-riscix*)
+				vendor=acorn
+				;;
+			-sunos*)
+				vendor=sun
+				;;
+			-aix*)
+				vendor=ibm
+				;;
+			-beos*)
+				vendor=be
+				;;
+			-hpux*)
+				vendor=hp
+				;;
+			-mpeix*)
+				vendor=hp
+				;;
+			-hiux*)
+				vendor=hitachi
+				;;
+			-unos*)
+				vendor=crds
+				;;
+			-dgux*)
+				vendor=dg
+				;;
+			-luna*)
+				vendor=omron
+				;;
+			-genix*)
+				vendor=ns
+				;;
+			-mvs* | -opened*)
+				vendor=ibm
+				;;
+			-os400*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+			-tpf*)
+				vendor=ibm
+				;;
+			-vxsim* | -vxworks* | -windiss*)
+				vendor=wrs
+				;;
+			-aux*)
+				vendor=apple
+				;;
+			-hms*)
+				vendor=hitachi
+				;;
+			-mpw* | -macos*)
+				vendor=apple
+				;;
+			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+				vendor=atari
+				;;
+			-vos*)
+				vendor=stratus
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/gdbmcli-src/configure
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/gdbmcli-src/configure	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/gdbmcli-src/configure	(revision 24799)
@@ -0,0 +1,5208 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.68 for gdbmcli 1.0.
+#
+# Report bugs to <jmt12@students.waikato.ac.nz>.
+#
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
+# Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test "x$CONFIG_SHELL" = x; then
+  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+"
+  as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+  exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1"
+  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1"
+  if (eval "$as_required") 2>/dev/null; then :
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  as_found=:
+  case $as_dir in #(
+	 /*)
+	   for as_base in sh bash ksh sh5; do
+	     # Try only shells that exist, to save several forks.
+	     as_shell=$as_dir/$as_base
+	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  CONFIG_SHELL=$as_shell as_have_required=yes
+		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  break 2
+fi
+fi
+	   done;;
+       esac
+  as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+  CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+      if test "x$CONFIG_SHELL" != x; then :
+  # We cannot yet assume a decent shell, so we have to provide a
+	# neutralization value for shells without unset; and this also
+	# works around shells that cannot unset nonexistent variables.
+	# Preserve -v and -x to the replacement shell.
+	BASH_ENV=/dev/null
+	ENV=/dev/null
+	(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+	export CONFIG_SHELL
+	case $- in # ((((
+	  *v*x* | *x*v* ) as_opts=-vx ;;
+	  *v* ) as_opts=-v ;;
+	  *x* ) as_opts=-x ;;
+	  * ) as_opts= ;;
+	esac
+	exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
+fi
+
+    if test x$as_have_required = xno; then :
+  $as_echo "$0: This script requires a shell more modern than all"
+  $as_echo "$0: the shells that I found on your system."
+  if test x${ZSH_VERSION+set} = xset ; then
+    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+  else
+    $as_echo "$0: Please tell bug-autoconf@gnu.org and
+$0: jmt12@students.waikato.ac.nz about your system,
+$0: including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do have one."
+  fi
+  exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+  as_lineno_1=$LINENO as_lineno_1a=$LINENO
+  as_lineno_2=$LINENO as_lineno_2a=$LINENO
+  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+	test -d "$1/.";
+      else
+	case $1 in #(
+	-*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='gdbmcli'
+PACKAGE_TARNAME='gdbmcli'
+PACKAGE_VERSION='1.0'
+PACKAGE_STRING='gdbmcli 1.0'
+PACKAGE_BUGREPORT='jmt12@students.waikato.ac.nz'
+PACKAGE_URL=''
+
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIBOBJS
+GDBM_LIBS
+GDBM_CFLAGS
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+ac_ct_CC
+CFLAGS
+CC
+am__fastdepCXX_FALSE
+am__fastdepCXX_TRUE
+CXXDEPMODE
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__quote
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CXX
+CPPFLAGS
+LDFLAGS
+CXXFLAGS
+CXX
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_dependency_tracking
+with_gdbm_include_path
+with_gdbm_lib_path
+'
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CXX
+CXXFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CCC
+CC
+CFLAGS'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *=)   ac_optarg= ;;
+  *)    ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    case $ac_envvar in #(
+      '' | [0-9]* | *[!_$as_cr_alnum]* )
+      as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+    esac
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+  case $enable_option_checking in
+    no) ;;
+    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+  esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
+		datadir sysconfdir sharedstatedir localstatedir includedir \
+		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+		libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  # Remove trailing slashes.
+  case $ac_val in
+    */ )
+      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+      eval $ac_var=\$ac_val;;
+  esac
+  # Be sure to have absolute directory names.
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used" >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_myself" : 'X\(//\)[^/]' \| \
+	 X"$as_myself" : 'X\(//\)$' \| \
+	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+	pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures gdbmcli 1.0 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking ...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR            user executables [EPREFIX/bin]
+  --sbindir=DIR           system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR        program executables [EPREFIX/libexec]
+  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --libdir=DIR            object code libraries [EPREFIX/lib]
+  --includedir=DIR        C header files [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
+  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR           info documentation [DATAROOTDIR/info]
+  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR            man documentation [DATAROOTDIR/man]
+  --docdir=DIR            documentation root [DATAROOTDIR/doc/gdbmcli]
+  --htmldir=DIR           html documentation [DOCDIR]
+  --dvidir=DIR            dvi documentation [DOCDIR]
+  --pdfdir=DIR            pdf documentation [DOCDIR]
+  --psdir=DIR             ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of gdbmcli 1.0:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-option-checking  ignore unrecognized --enable/--with options
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-gdbm-include-path
+                          location of the GDBM headers
+  --with-gdbm-lib-path    location of the GDBM libraries
+
+Some influential environment variables:
+  CXX         C++ compiler command
+  CXXFLAGS    C++ compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  CC          C compiler command
+  CFLAGS      C compiler flags
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <jmt12@students.waikato.ac.nz>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" ||
+      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+      continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+gdbmcli configure 1.0
+generated by GNU Autoconf 2.68
+
+Copyright (C) 2010 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_cxx_try_compile LINENO
+# ----------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_compile
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by gdbmcli $as_me 1.0, which was
+generated by GNU Autoconf 2.68.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    $as_echo "PATH: $as_dir"
+  done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+    2)
+      as_fn_append ac_configure_args1 " '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+	ac_must_keep_next=false # Got value, back to normal.
+      else
+	case $ac_arg in
+	  *=* | --config-cache | -C | -disable-* | --disable-* \
+	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+	  | -with-* | --with-* | -without-* | --without-* | --x)
+	    case "$ac_configure_args0 " in
+	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+	    esac
+	    ;;
+	  -* ) ac_must_keep_next=true ;;
+	esac
+      fi
+      as_fn_append ac_configure_args " '$ac_arg'"
+      ;;
+    esac
+  done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+	"s/'\''/'\''\\\\'\'''\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      $as_echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=\$$ac_var
+	case $ac_val in
+	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+	esac
+	$as_echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      $as_echo "$as_me: caught signal $ac_signal"
+    $as_echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+  # We do not want a PATH search for config.site.
+  case $CONFIG_SITE in #((
+    -*)  ac_site_file1=./$CONFIG_SITE;;
+    */*) ac_site_file1=$CONFIG_SITE;;
+    *)   ac_site_file1=./$CONFIG_SITE;;
+  esac
+elif test "x$prefix" != xNONE; then
+  ac_site_file1=$prefix/share/config.site
+  ac_site_file2=$prefix/etc/config.site
+else
+  ac_site_file1=$ac_default_prefix/share/config.site
+  ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+  test "x$ac_site_file" = xNONE && continue
+  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file" \
+      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special files
+  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
+  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+	# differences in whitespace do not lead to failure.
+	ac_old_val_w=`echo x $ac_old_val`
+	ac_new_val_w=`echo x $ac_new_val`
+	if test "$ac_old_val_w" != "$ac_new_val_w"; then
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	  ac_cache_corrupted=:
+	else
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+	  eval $ac_var=\$ac_old_val
+	fi
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
+$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
+$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+am__api_version='1.11'
+
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+  if test -f "$ac_dir/install-sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f "$ac_dir/install.sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if ${ac_cv_path_install+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+  ./ | .// | /[cC]/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    rm -rf conftest.one conftest.two conftest.dir
+	    echo one > conftest.one
+	    echo two > conftest.two
+	    mkdir conftest.dir
+	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+	      test -s conftest.one && test -s conftest.two &&
+	      test -s conftest.dir/conftest.one &&
+	      test -s conftest.dir/conftest.two
+	    then
+	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	      break 3
+	    fi
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+
+  done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+$as_echo_n "checking whether build environment is sane... " >&6; }
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[\\\"\#\$\&\'\`$am_lf]*)
+    as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+  *[\\\"\#\$\&\'\`$am_lf\ \	]*)
+    as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
+esac
+
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t "$srcdir/configure" conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$*" != "X $srcdir/configure conftest.file" \
+      && test "$*" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" "$LINENO" 5
+   fi
+
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   as_fn_error $? "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+test "$program_prefix" != NONE &&
+  program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+  if ${ac_cv_path_mkdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in mkdir gmkdir; do
+	 for ac_exec_ext in '' $ac_executable_extensions; do
+	   { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
+	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+	     'mkdir (GNU coreutils) '* | \
+	     'mkdir (coreutils) '* | \
+	     'mkdir (fileutils) '4.1*)
+	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+	       break 3;;
+	   esac
+	 done
+       done
+  done
+IFS=$as_save_IFS
+
+fi
+
+  test -d ./--version && rmdir ./--version
+  if test "${ac_cv_path_mkdir+set}" = set; then
+    MKDIR_P="$ac_cv_path_mkdir -p"
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for MKDIR_P within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    MKDIR_P="$ac_install_sh -d"
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+mkdir_p="$MKDIR_P"
+case $mkdir_p in
+  [\\/$]* | ?:[\\/]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AWK+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_AWK="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$AWK" && break
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  SET_MAKE=
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  am__isrc=' -I$(srcdir)'
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='gdbmcli'
+ VERSION='1.0'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+
+# Checks for programs.
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+  if test -n "$CCC"; then
+    CXX=$CCC
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in g++
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
+$as_echo "$CXX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CXX" && break
+  done
+fi
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in g++
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CXX="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
+$as_echo "$ac_ct_CXX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CXX" && break
+done
+
+  if test "x$ac_ct_CXX" = x; then
+    CXX="g++"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CXX=$ac_ct_CXX
+  fi
+fi
+
+  fi
+fi
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5
+$as_echo_n "checking whether the C++ compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+	;;
+    [ab].out )
+	# We found the default executable, but exeext='' is most
+	# certainly right.
+	break;;
+    *.* )
+	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+	then :; else
+	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	fi
+	# We set ac_cv_exeext here because the later test for it is not
+	# safe: cross compilers may not add the suffix if given an `-o'
+	# argument, so we may need to know it at that point already.
+	# Even if this section looks crufty: it has the advantage of
+	# actually working.
+	break;;
+    * )
+	break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+if test -z "$ac_file"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C++ compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5
+$as_echo_n "checking for C++ compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	  break;;
+    * ) break;;
+  esac
+done
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+  { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+  if { ac_try='./conftest$ac_cv_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C++ compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+    fi
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
+$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
+if ${ac_cv_cxx_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
+$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GXX=yes
+else
+  GXX=
+fi
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
+$as_echo_n "checking whether $CXX accepts -g... " >&6; }
+if ${ac_cv_prog_cxx_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+   ac_cxx_werror_flag=yes
+   ac_cv_prog_cxx_g=no
+   CXXFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_cv_prog_cxx_g=yes
+else
+  CXXFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+else
+  ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+	 CXXFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_cv_prog_cxx_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
+$as_echo "$ac_cv_prog_cxx_g" >&6; }
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
+  else
+    CXXFLAGS="-g"
+  fi
+else
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
+  else
+    CXXFLAGS=
+  fi
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
+$as_echo_n "checking for style of include used by $am_make... " >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
+$as_echo "$_am_result" >&6; }
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then :
+  enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+
+depcc="$CXX"  am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CXX_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CXX_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CXX_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+  am__fastdepCXX_TRUE=
+  am__fastdepCXX_FALSE='#'
+else
+  am__fastdepCXX_TRUE='#'
+  am__fastdepCXX_FALSE=
+fi
+
+
+
+# Checks for libraries.
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+else
+  CFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CC"   am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for encrypt in -lcrypt" >&5
+$as_echo_n "checking for encrypt in -lcrypt... " >&6; }
+if ${ac_cv_lib_crypt_encrypt+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcrypt  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char encrypt ();
+int
+main ()
+{
+return encrypt ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_crypt_encrypt=yes
+else
+  ac_cv_lib_crypt_encrypt=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypt_encrypt" >&5
+$as_echo "$ac_cv_lib_crypt_encrypt" >&6; }
+if test "x$ac_cv_lib_crypt_encrypt" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBCRYPT 1
+_ACEOF
+
+  LIBS="-lcrypt $LIBS"
+
+fi
+
+
+
+# Check whether --with-gdbm-include-path was given.
+if test "${with_gdbm_include_path+set}" = set; then :
+  withval=$with_gdbm_include_path; GDBM_CFLAGS="-I$withval"
+else
+  GDBM_CFLAGS='-I../../../../common-src/packages/gdbm/include'
+fi
+
+
+
+
+# Check whether --with-gdbm-lib-path was given.
+if test "${with_gdbm_lib_path+set}" = set; then :
+  withval=$with_gdbm_lib_path; GDBM_LIBS="-L$withval -lmysqlclient"
+else
+  GDBM_LIBS='-L../../../../common-src/packages/gdbm/lib -lgdbm'
+fi
+
+
+
+# Checks for header files.
+
+# Checks for typedefs, structures, and compiler characteristics.
+
+# Checks for library functions.
+
+# Completion
+ac_config_files="$ac_config_files Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes: double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \.
+      sed -n \
+	"s/'/'\\\\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    if test "x$cache_file" != "x/dev/null"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+      if test ! -f "$cache_file" || test -h "$cache_file"; then
+	cat confcache >"$cache_file"
+      else
+        case $cache_file in #(
+        */* | ?:*)
+	  mv -f confcache "$cache_file"$$ &&
+	  mv -f "$cache_file"$$ "$cache_file" ;; #(
+        *)
+	  mv -f confcache "$cache_file" ;;
+	esac
+      fi
+    fi
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+#
+# If the first sed substitution is executed (which looks for macros that
+# take arguments), then branch to the quote section.  Otherwise,
+# look for a macro that doesn't take arguments.
+ac_script='
+:mline
+/\\$/{
+ N
+ s,\\\n,,
+ b mline
+}
+t clear
+:clear
+s/^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 (][^	 (]*([^)]*)\)[	 ]*\(.*\)/-D\1=\2/g
+t quote
+s/^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 ][^	 ]*\)[	 ]*\(.*\)/-D\1=\2/g
+t quote
+b any
+:quote
+s/[	 `~#$^&*(){}\\|;'\''"<>?]/\\&/g
+s/\[/\\&/g
+s/\]/\\&/g
+s/\$/$$/g
+H
+:any
+${
+	g
+	s/^\n//
+	s/\n/ /g
+	p
+}
+'
+DEFS=`sed -n "$ac_script" confdefs.h`
+
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+ if test -n "$EXEEXT"; then
+  am__EXEEXT_TRUE=
+  am__EXEEXT_FALSE='#'
+else
+  am__EXEEXT_TRUE='#'
+  am__EXEEXT_FALSE=
+fi
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+	test -d "$1/.";
+      else
+	case $1 in #(
+	-*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by gdbmcli $as_me 1.0, which was
+generated by GNU Autoconf 2.68.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration.  Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+      --config     print configuration, then exit
+  -q, --quiet, --silent
+                   do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+      --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+
+Configuration files:
+$config_files
+
+Configuration commands:
+$config_commands
+
+Report bugs to <jmt12@students.waikato.ac.nz>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+gdbmcli config.status 1.0
+configured by $0, generated by GNU Autoconf 2.68,
+  with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2010 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=?*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  --*=)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    $as_echo "$ac_cs_version"; exit ;;
+  --config | --confi | --conf | --con | --co | --c )
+    $as_echo "$ac_cs_config"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    '') as_fn_error $? "missing file argument" ;;
+    esac
+    as_fn_append CONFIG_FILES " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --he | --h |  --help | --hel | -h )
+    $as_echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+  *) as_fn_append ac_config_targets " $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  shift
+  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+  CONFIG_SHELL='$SHELL'
+  export CONFIG_SHELL
+  exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+
+  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp= ac_tmp=
+  trap 'exit_status=$?
+  : "${ac_tmp:=$tmp}"
+  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+  trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+  eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+  ac_cs_awk_cr='\\r'
+else
+  ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+  echo "cat >conf$$subs.awk <<_ACEOF" &&
+  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+  echo "_ACEOF"
+} >conf$$subs.sh ||
+  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  . ./conf$$subs.sh ||
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+  if test $ac_delim_n = $ac_delim_num; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+  N
+  s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+  for (key in S) S_is_set[key] = 1
+  FS = ""
+
+}
+{
+  line = $ 0
+  nfields = split(line, field, "@")
+  substed = 0
+  len = length(field[1])
+  for (i = 2; i < nfields; i++) {
+    key = field[i]
+    keylen = length(key)
+    if (S_is_set[key]) {
+      value = S[key]
+      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+      len += length(value) + length(field[++i])
+      substed = 1
+    } else
+      len += 1 + keylen
+  }
+
+  print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+  cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=[	 ]*/{
+h
+s///
+s/^/:/
+s/[	 ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[	 ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[	 ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+
+eval set X "  :F $CONFIG_FILES      :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$ac_tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
+	 # because $ac_f cannot contain `:'.
+	 test -f "$ac_f" ||
+	   case $ac_f in
+	   [\\/$]*) false;;
+	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+	   esac ||
+	   as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+      esac
+      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+      as_fn_append ac_file_inputs " '$ac_f'"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input='Generated from '`
+	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+	`' by configure.'
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+    fi
+    # Neutralize special characters interpreted by sed in replacement strings.
+    case $configure_input in #(
+    *\&* | *\|* | *\\* )
+       ac_sed_conf_input=`$as_echo "$configure_input" |
+       sed 's/[\\\\&|]/\\\\&/g'`;; #(
+    *) ac_sed_conf_input=$configure_input;;
+    esac
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$ac_tmp/stdin" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  as_dir="$ac_dir"; as_fn_mkdir_p
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+  ac_MKDIR_P=$MKDIR_P
+  case $MKDIR_P in
+  [\\/$]* | ?:[\\/]* ) ;;
+  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+  esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+  s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+  >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' \
+      "$ac_tmp/out"`; test -z "$ac_out"; } &&
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&2;}
+
+  rm -f "$ac_tmp/stdin"
+  case $ac_file in
+  -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+  *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+  esac \
+  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+
+
+  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+  esac
+
+
+  case $ac_file$ac_mode in
+    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named `Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`$as_dirname -- "$mf" ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$mf" : 'X\(//\)[^/]' \| \
+	 X"$mf" : 'X\(//\)$' \| \
+	 X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running `make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`$as_dirname -- "$file" ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$file" : 'X\(//\)[^/]' \| \
+	 X"$file" : 'X\(//\)$' \| \
+	 X"$file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      as_dir=$dirpart/$fdir; as_fn_mkdir_p
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+ ;;
+
+  esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/gdbmcli-src/configure.ac
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/gdbmcli-src/configure.ac	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/gdbmcli-src/configure.ac	(revision 24799)
@@ -0,0 +1,34 @@
+#                                               -*- Autoconf -*-
+# Process this file with autoconf to produce a configure script.
+AC_PREREQ(2.59)
+AC_INIT([gdbmcli], [1.0], [jmt12@students.waikato.ac.nz])
+AM_INIT_AUTOMAKE
+AC_CANONICAL_HOST
+
+# Checks for programs.
+AC_PROG_CXX([g++])
+
+# Checks for libraries.
+AC_CHECK_LIB([crypt],[encrypt])
+
+AC_ARG_WITH([gdbm-include-path],
+  [AS_HELP_STRING([--with-gdbm-include-path],[location of the GDBM headers])],
+  [GDBM_CFLAGS="-I$withval"],
+  [GDBM_CFLAGS='-I../../../../common-src/packages/gdbm/include'])
+AC_SUBST([GDBM_CFLAGS])
+
+AC_ARG_WITH([gdbm-lib-path],
+  [AS_HELP_STRING([--with-gdbm-lib-path], [location of the GDBM libraries])],
+  [GDBM_LIBS="-L$withval -lmysqlclient"],
+  [GDBM_LIBS='-L../../../../common-src/packages/gdbm/lib -lgdbm'])
+AC_SUBST([GDBM_LIBS])
+
+# Checks for header files.
+
+# Checks for typedefs, structures, and compiler characteristics.
+
+# Checks for library functions.
+
+# Completion
+AC_CONFIG_FILES([Makefile])
+AC_OUTPUT
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/gdbmcli-src/gdbmcli.cpp
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/gdbmcli-src/gdbmcli.cpp	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/gdbmcli-src/gdbmcli.cpp	(revision 24799)
@@ -0,0 +1,342 @@
+/**********************************************************************
+ *
+ * gdbmcli.cpp --
+ *
+ * Similar to txt2db (GDBM) executable in that you open a pipe to it and
+ * write commands to be applied to a GDBM database. However, unlike txt2db,
+ * this executable allows bidirectional streams (so you need to open the
+ * pipe for both reading and writing). It then supports commands of this
+ * form:
+ *
+ * \[<key>\][+\-\?]
+ * (<value>)?
+ * -{70}
+ *
+ * where: + is for add or update
+ *        - is for delete
+ *        ? is for lookup
+ *
+ * The aim of this executable is to allow a single, persistent, connection
+ * to a GDBM database, accessed through some kind of queued daemon, so as
+ * to support multiple readers and writers and thus parallel collection
+ * building.
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * Copyright (C) 2011-2020 The New Zealand Digital Library Project
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ **********************************************************************/
+
+
+#ifdef __WIN32__
+#include "autoconf.h"
+#include "systems.h"
+#include "gdbmconst.h"
+
+extern "C" {
+#include "gdbm.h"
+}
+
+#else
+#include <gdbm.h>
+#endif
+
+#include "gsdlconf.h"
+#include "text_t.h"
+#include <stdlib.h>
+#include <cstring>
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\iostream>
+#elif defined(GSDL_USE_IOS_H)
+#  include <iostream.h>
+#else
+#  include <iostream>
+#endif
+
+
+void
+printUsage ()
+{
+  cerr << "===== GDBM Command Line Interface v1.0 =====" << endl << endl;
+  cerr << "usage: gdbmcli <db path>" << endl << endl;
+  cerr << "Once the program is running, the first thing it expects is the" << endl;
+  cerr << "path to the GDBM database to open, after which you can use the" << endl;
+  cerr << "commands below:" << endl;
+  cerr << "  [key]+<newline>value <= adds the pair key:value" << endl;
+  cerr << "  [key]<newline>value  <= also adds the pair" << endl;
+  cerr << "  [key]-               <= deleted the pair identified by key" << endl;
+  cerr << "  [key]?               <= lookup the value for key" << endl;
+  cerr << "  [*]                  <= retrieve a list of keys" << endl;
+  cerr << "  []                   <= exit " << endl << endl;
+}
+
+int
+main (int argc, char *argv[])
+{
+  if (argc != 2)
+  {
+    printUsage();
+    exit(0);
+  }
+
+  char *dbname = argv[1];
+
+  // open the database
+  // note that GDBM_FAST is obsolete on newer versions of gdbm
+  int read_write = GDBM_WRCREAT | GDBM_FAST;
+  int block_size = 0;
+#ifdef __WIN32__
+  GDBM_FILE dbf = gdbm_open(dbname, block_size, read_write, 00664, NULL, 1);
+#else
+  GDBM_FILE dbf = gdbm_open(dbname, block_size, read_write, 00664, NULL);
+#endif
+  if (dbf == NULL)
+  {
+    cerr << "couldn't create " << dbname << endl;
+    exit(0);
+  }
+
+  // Start reading commands from STDIN
+  bool quit = false;
+  char c;
+  cin.get(c);
+  while (!cin.eof() && !quit)
+  {
+    text_t key = "";
+    bool action_delete = false;
+    bool action_lookup = false;
+    bool action_keys = false;
+    text_t value = "";
+    int num_dashes = 0;
+
+    // Parse out 'key' from [key]\n
+    // scan for first occurrence of [
+    while (!cin.eof() && c != '[')
+    {
+      cin.get(c);
+    }
+    if (!cin.eof())
+    {
+      cin.get(c); // skip [
+    }
+
+    // now look for closing ], building up 'key' as we go
+    while (!cin.eof() && c != ']')
+    {
+      key.push_back ((unsigned char)c);
+      cin.get(c);
+    }
+
+    // Empty key means exit
+    if (key.empty())
+    {
+      quit = true;
+    }
+    else
+    {
+      // * as a key means return a list of keys
+      if (key == "*")
+      {
+        action_keys = true;
+      }
+
+      if (key == "?")
+      {
+        cout << "0.1" << endl;
+        gdbm_close (dbf);
+        return 0;
+      }
+
+      // retrieve the command token
+      if (!cin.eof())
+      {
+        cin.get(c);
+        if (c == '+')
+        {
+          // defaults to action_add anyway
+          cin.get(c);
+        }
+        else if (c == '?')
+        {
+          action_lookup = true;
+          cin.get(c);
+        }
+        else if (c == '-')
+        {
+          action_delete = true;
+          cin.get(c);
+        }
+      }
+
+      // Returning the list of all keys (one per line) is of highest priority
+      if (action_keys)
+      {
+        datum key_data = gdbm_firstkey (dbf);
+        bool first_key = true;
+        while (key_data.dptr != NULL)
+        {
+          if (first_key)
+          {
+            first_key = false;
+          }
+          else
+          {
+            cout << endl;
+          }
+          for (int i = 0; i < key_data.dsize; ++i)
+          {
+            cout << key_data.dptr[i];
+          }
+          /* get next key */
+          datum nextkey_data = gdbm_nextkey (dbf, key_data);
+          /* free old key's dptr, otherwise causes memory leak */
+          free(key_data.dptr);
+          /* can now safely copy content of nextkey into key */
+          key_data = nextkey_data;
+        }
+      }
+      // if we've been asked for a lookup, retrieve the information for this
+      // key, write to STDOUT, and then continue processing STDIN for further
+      // commands
+      else if (action_lookup)
+      {
+        // convert key to a datum datatype
+        datum key_data;
+        key_data.dptr = key.getcstr();
+        if (key_data.dptr == NULL)
+        {
+          cerr << "NULL key_data.dptr" << endl;
+          exit (0);
+        }
+        key_data.dsize = strlen(key_data.dptr);
+
+        datum value_data;
+        value_data = gdbm_fetch (dbf, key_data);
+        for (int i = 0; i < value_data.dsize; ++i)
+        {
+          cout << value_data.dptr[i];
+        }
+        free(value_data.dptr);
+        free(key_data.dptr);
+      }
+      // if we've been asked to delete a key/value pair, do so and then
+      // continue processing STDIN for further commands
+      else if (action_delete)
+      {
+        // convert key to a datum datatype
+        datum key_data;
+        key_data.dptr = key.getcstr();
+        if (key_data.dptr == NULL)
+        {
+          cerr << "NULL key_data.dptr" << endl;
+          exit (0);
+        }
+        key_data.dsize = strlen(key_data.dptr);
+	// delete the given key
+	if (gdbm_delete(dbf, key_data) < 0)
+        {
+	  cerr << "gdbm_delete returned an error trying to delete key " << key << ": " << gdbm_strerror (gdbm_errno) <<endl;
+	}
+        free(key_data.dptr);
+      }
+      // Everything else is an add/update. Read in value, action and then
+      // continue processing STDIN for further commands
+      else
+      {
+        // convert key to a datum datatype
+        datum key_data;
+        key_data.dptr = key.getcstr();
+        if (key_data.dptr == NULL)
+        {
+          cerr << "NULL key_data.dptr" << endl;
+          exit (0);
+        }
+        key_data.dsize = strlen(key_data.dptr);
+
+        // eat up whitespace
+        while (!cin.eof() && (c == '\t' || c == ' ' || c == '\n' || c == '\r'))
+        {
+          cin.get(c);
+        }
+        // parse in value (if any), watching for the 70 dashes that mark the end
+        text_t tmp = "";
+        while (!cin.eof() && (num_dashes < 70))
+        {
+          // - reset number of dashes on newline
+          if (c == '\n')
+          {
+            tmp.push_back ((unsigned char)c);
+            num_dashes = 0;
+          }
+          // Here we are able to process both Windows-specific text files
+          // (containing carriage-return, newline) and Linux text files
+          // (containing only newline characters) by ignoring the Windows'
+          // carriage-return altogether so that we produce a uniform database
+          // file from either system's type of text file.
+          // If we don't ignore the carriage return here, txt.gz files
+          // produced on Windows cause a GS library running on Linux to break.
+          // - reset number of dashes on carriage return
+          else if (c == '\r')
+          {
+            num_dashes = 0;
+          }
+          else if (c == '-')
+          {
+            tmp.push_back ((unsigned char)c);
+            ++num_dashes;
+          }
+          else
+          {
+            value += tmp;
+            value.push_back ((unsigned char)c);
+            tmp = "";
+            num_dashes = 0;
+          }
+          cin.get(c);
+        }
+
+	// convert value to a datum datatype
+	datum value_data;
+	value_data.dptr = value.getcstr();
+	if (value_data.dptr == NULL)
+        {
+	  cerr << "NULL value_data.dptr" << endl;
+	  exit (0);
+	}
+	value_data.dsize = strlen(value_data.dptr);
+	// store the value
+	if (gdbm_store (dbf, key_data, value_data, GDBM_REPLACE) < 0)
+        {
+	  cerr << "gdbm_store returned an error" << endl;
+	  exit (0);
+	}
+        // done with value
+	free(value_data.dptr);
+        free(key_data.dptr);
+      }
+      // - always output 70 hyphens when finished
+      cout << endl << "----------------------------------------------------------------------" << endl;
+      // done with key too
+    }
+  }
+  gdbm_close (dbf);
+  cout << "Database updated. Goodbye." << endl;
+  return 0;
+}
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/gdbmcli-src/install-sh
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/gdbmcli-src/install-sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/gdbmcli-src/install-sh	(revision 24799)
@@ -0,0 +1,520 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2009-04-28.21; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+nl='
+'
+IFS=" ""	$nl"
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit=${DOITPROG-}
+if test -z "$doit"; then
+  doit_exec=exec
+else
+  doit_exec=$doit
+fi
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_glob='?'
+initialize_posix_glob='
+  test "$posix_glob" != "?" || {
+    if (set -f) 2>/dev/null; then
+      posix_glob=
+    else
+      posix_glob=:
+    fi
+  }
+'
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+no_target_directory=
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+     --help     display this help and exit.
+     --version  display version info and exit.
+
+  -c            (ignored)
+  -C            install only if different (preserve the last data modification time)
+  -d            create directories instead of installing files.
+  -g GROUP      $chgrpprog installed files to GROUP.
+  -m MODE       $chmodprog installed files to MODE.
+  -o USER       $chownprog installed files to USER.
+  -s            $stripprog installed files.
+  -t DIRECTORY  install into DIRECTORY.
+  -T            report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+  RMPROG STRIPPROG
+"
+
+while test $# -ne 0; do
+  case $1 in
+    -c) ;;
+
+    -C) copy_on_change=true;;
+
+    -d) dir_arg=true;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+	shift;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) mode=$2
+	case $mode in
+	  *' '* | *'	'* | *'
+'*	  | *'*'* | *'?'* | *'['*)
+	    echo "$0: invalid mode: $mode" >&2
+	    exit 1;;
+	esac
+	shift;;
+
+    -o) chowncmd="$chownprog $2"
+	shift;;
+
+    -s) stripcmd=$stripprog;;
+
+    -t) dst_arg=$2
+	shift;;
+
+    -T) no_target_directory=true;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    --)	shift
+	break;;
+
+    -*)	echo "$0: invalid option: $1" >&2
+	exit 1;;
+
+    *)  break;;
+  esac
+  shift
+done
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+  # When -d is used, all remaining arguments are directories to create.
+  # When -t is used, the destination is already specified.
+  # Otherwise, the last argument is the destination.  Remove it from $@.
+  for arg
+  do
+    if test -n "$dst_arg"; then
+      # $@ is not empty: it contains at least $arg.
+      set fnord "$@" "$dst_arg"
+      shift # fnord
+    fi
+    shift # arg
+    dst_arg=$arg
+  done
+fi
+
+if test $# -eq 0; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call `install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+if test -z "$dir_arg"; then
+  trap '(exit $?); exit' 1 2 13 15
+
+  # Set umask so as not to create temps with too-generous modes.
+  # However, 'strip' requires both read and write access to temps.
+  case $mode in
+    # Optimize common cases.
+    *644) cp_umask=133;;
+    *755) cp_umask=22;;
+
+    *[0-7])
+      if test -z "$stripcmd"; then
+	u_plus_rw=
+      else
+	u_plus_rw='% 200'
+      fi
+      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+    *)
+      if test -z "$stripcmd"; then
+	u_plus_rw=
+      else
+	u_plus_rw=,u+rw
+      fi
+      cp_umask=$mode$u_plus_rw;;
+  esac
+fi
+
+for src
+do
+  # Protect names starting with `-'.
+  case $src in
+    -*) src=./$src;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    dstdir=$dst
+    test -d "$dstdir"
+    dstdir_status=$?
+  else
+
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dst_arg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+
+    dst=$dst_arg
+    # Protect names starting with `-'.
+    case $dst in
+      -*) dst=./$dst;;
+    esac
+
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
+    if test -d "$dst"; then
+      if test -n "$no_target_directory"; then
+	echo "$0: $dst_arg: Is a directory" >&2
+	exit 1
+      fi
+      dstdir=$dst
+      dst=$dstdir/`basename "$src"`
+      dstdir_status=0
+    else
+      # Prefer dirname, but fall back on a substitute if dirname fails.
+      dstdir=`
+	(dirname "$dst") 2>/dev/null ||
+	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	     X"$dst" : 'X\(//\)[^/]' \| \
+	     X"$dst" : 'X\(//\)$' \| \
+	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
+	echo X"$dst" |
+	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)[^/].*/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\).*/{
+		   s//\1/
+		   q
+		 }
+		 s/.*/./; q'
+      `
+
+      test -d "$dstdir"
+      dstdir_status=$?
+    fi
+  fi
+
+  obsolete_mkdir_used=false
+
+  if test $dstdir_status != 0; then
+    case $posix_mkdir in
+      '')
+	# Create intermediate dirs using mode 755 as modified by the umask.
+	# This is like FreeBSD 'install' as of 1997-10-28.
+	umask=`umask`
+	case $stripcmd.$umask in
+	  # Optimize common cases.
+	  *[2367][2367]) mkdir_umask=$umask;;
+	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+	  *[0-7])
+	    mkdir_umask=`expr $umask + 22 \
+	      - $umask % 100 % 40 + $umask % 20 \
+	      - $umask % 10 % 4 + $umask % 2
+	    `;;
+	  *) mkdir_umask=$umask,go-w;;
+	esac
+
+	# With -d, create the new directory with the user-specified mode.
+	# Otherwise, rely on $mkdir_umask.
+	if test -n "$dir_arg"; then
+	  mkdir_mode=-m$mode
+	else
+	  mkdir_mode=
+	fi
+
+	posix_mkdir=false
+	case $umask in
+	  *[123567][0-7][0-7])
+	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
+	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+	    ;;
+	  *)
+	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+	    if (umask $mkdir_umask &&
+		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+	    then
+	      if test -z "$dir_arg" || {
+		   # Check for POSIX incompatibilities with -m.
+		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+		   # other-writeable bit of parent directory when it shouldn't.
+		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
+		   case $ls_ld_tmpdir in
+		     d????-?r-*) different_mode=700;;
+		     d????-?--*) different_mode=755;;
+		     *) false;;
+		   esac &&
+		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+		   }
+		 }
+	      then posix_mkdir=:
+	      fi
+	      rmdir "$tmpdir/d" "$tmpdir"
+	    else
+	      # Remove any dirs left behind by ancient mkdir implementations.
+	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+	    fi
+	    trap '' 0;;
+	esac;;
+    esac
+
+    if
+      $posix_mkdir && (
+	umask $mkdir_umask &&
+	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+      )
+    then :
+    else
+
+      # The umask is ridiculous, or mkdir does not conform to POSIX,
+      # or it failed possibly due to a race condition.  Create the
+      # directory the slow way, step by step, checking for races as we go.
+
+      case $dstdir in
+	/*) prefix='/';;
+	-*) prefix='./';;
+	*)  prefix='';;
+      esac
+
+      eval "$initialize_posix_glob"
+
+      oIFS=$IFS
+      IFS=/
+      $posix_glob set -f
+      set fnord $dstdir
+      shift
+      $posix_glob set +f
+      IFS=$oIFS
+
+      prefixes=
+
+      for d
+      do
+	test -z "$d" && continue
+
+	prefix=$prefix$d
+	if test -d "$prefix"; then
+	  prefixes=
+	else
+	  if $posix_mkdir; then
+	    (umask=$mkdir_umask &&
+	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+	    # Don't fail if two instances are running concurrently.
+	    test -d "$prefix" || exit 1
+	  else
+	    case $prefix in
+	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+	      *) qprefix=$prefix;;
+	    esac
+	    prefixes="$prefixes '$qprefix'"
+	  fi
+	fi
+	prefix=$prefix/
+      done
+
+      if test -n "$prefixes"; then
+	# Don't fail if two instances are running concurrently.
+	(umask $mkdir_umask &&
+	 eval "\$doit_exec \$mkdirprog $prefixes") ||
+	  test -d "$dstdir" || exit 1
+	obsolete_mkdir_used=true
+      fi
+    fi
+  fi
+
+  if test -n "$dir_arg"; then
+    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+  else
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+    # Copy the file name to the temp name.
+    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+    # If -C, don't bother to copy if it wouldn't change the file.
+    if $copy_on_change &&
+       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
+
+       eval "$initialize_posix_glob" &&
+       $posix_glob set -f &&
+       set X $old && old=:$2:$4:$5:$6 &&
+       set X $new && new=:$2:$4:$5:$6 &&
+       $posix_glob set +f &&
+
+       test "$old" = "$new" &&
+       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+    then
+      rm -f "$dsttmp"
+    else
+      # Rename the file to the real destination.
+      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+      # The rename failed, perhaps because mv can't rename something else
+      # to itself, or perhaps because mv is so ancient that it does not
+      # support -f.
+      {
+	# Now remove or move aside any old file at destination location.
+	# We try this two ways since rm can't unlink itself on some
+	# systems and the destination file might be busy for other
+	# reasons.  In this case, the final cleanup might fail but the new
+	# file should still install successfully.
+	{
+	  test ! -f "$dst" ||
+	  $doit $rmcmd -f "$dst" 2>/dev/null ||
+	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+	  } ||
+	  { echo "$0: cannot unlink or rename $dst" >&2
+	    (exit 1); exit 1
+	  }
+	} &&
+
+	# Now rename the file to the real destination.
+	$doit $mvcmd "$dsttmp" "$dst"
+      }
+    fi || exit 1
+
+    trap '' 0
+  fi
+done
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/gdbmcli-src/missing
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/gdbmcli-src/missing	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/gdbmcli-src/missing	(revision 24799)
@@ -0,0 +1,376 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2009-04-28.21; # UTC
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
+# 2008, 2009 Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try \`$0 --help' for more information"
+  exit 1
+fi
+
+run=:
+sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
+sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+  configure_ac=configure.ac
+else
+  configure_ac=configure.in
+fi
+
+msg="missing on your system"
+
+case $1 in
+--run)
+  # Try to run requested program, and just exit if it succeeds.
+  run=
+  shift
+  "$@" && exit 0
+  # Exit code 63 means version mismatch.  This often happens
+  # when the user try to use an ancient version of a tool on
+  # a file that requires a minimum version.  In this case we
+  # we should proceed has if the program had been absent, or
+  # if --run hadn't been passed.
+  if test $? = 63; then
+    run=:
+    msg="probably too old"
+  fi
+  ;;
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+  --run           try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+  aclocal      touch file \`aclocal.m4'
+  autoconf     touch file \`configure'
+  autoheader   touch file \`config.h.in'
+  autom4te     touch the output file, or create a stub one
+  automake     touch all \`Makefile.in' files
+  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
+  flex         create \`lex.yy.c', if possible, from existing .c
+  help2man     touch the output file
+  lex          create \`lex.yy.c', if possible, from existing .c
+  makeinfo     touch the output file
+  tar          try tar, gnutar, gtar, then tar without non-portable flags
+  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
+
+Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
+\`g' are ignored when checking the name.
+
+Send bug reports to <bug-automake@gnu.org>."
+    exit $?
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing $scriptversion (GNU Automake)"
+    exit $?
+    ;;
+
+  -*)
+    echo 1>&2 "$0: Unknown \`$1' option"
+    echo 1>&2 "Try \`$0 --help' for more information"
+    exit 1
+    ;;
+
+esac
+
+# normalize program name to check for.
+program=`echo "$1" | sed '
+  s/^gnu-//; t
+  s/^gnu//; t
+  s/^g//; t'`
+
+# Now exit if we have it, but it failed.  Also exit now if we
+# don't have it and --version was passed (most likely to detect
+# the program).  This is about non-GNU programs, so use $1 not
+# $program.
+case $1 in
+  lex*|yacc*)
+    # Not GNU programs, they don't have --version.
+    ;;
+
+  tar*)
+    if test -n "$run"; then
+       echo 1>&2 "ERROR: \`tar' requires --run"
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       exit 1
+    fi
+    ;;
+
+  *)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       # Could not run --version or --help.  This is probably someone
+       # running `$TOOL --version' or `$TOOL --help' to check whether
+       # $TOOL exists and not knowing $TOOL uses missing.
+       exit 1
+    fi
+    ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case $program in
+  aclocal*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
+         to install the \`Automake' and \`Perl' packages.  Grab them from
+         any GNU archive site."
+    touch aclocal.m4
+    ;;
+
+  autoconf*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`${configure_ac}'.  You might want to install the
+         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
+         archive site."
+    touch configure
+    ;;
+
+  autoheader*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
+         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
+         from any GNU archive site."
+    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+    test -z "$files" && files="config.h"
+    touch_files=
+    for f in $files; do
+      case $f in
+      *:*) touch_files="$touch_files "`echo "$f" |
+				       sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+      *) touch_files="$touch_files $f.in";;
+      esac
+    done
+    touch $touch_files
+    ;;
+
+  automake*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+         You might want to install the \`Automake' and \`Perl' packages.
+         Grab them from any GNU archive site."
+    find . -type f -name Makefile.am -print |
+	   sed 's/\.am$/.in/' |
+	   while read f; do touch "$f"; done
+    ;;
+
+  autom4te*)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.
+         You can get \`$1' as part of \`Autoconf' from any GNU
+         archive site."
+
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
+	touch $file
+    else
+	test -z "$file" || exec >$file
+	echo "#! /bin/sh"
+	echo "# Created by GNU Automake missing as a replacement of"
+	echo "#  $ $@"
+	echo "exit 0"
+	chmod +x $file
+	exit 1
+    fi
+    ;;
+
+  bison*|yacc*)
+    echo 1>&2 "\
+WARNING: \`$1' $msg.  You should only need it if
+         you modified a \`.y' file.  You may need the \`Bison' package
+         in order for those modifications to take effect.  You can get
+         \`Bison' from any GNU archive site."
+    rm -f y.tab.c y.tab.h
+    if test $# -ne 1; then
+        eval LASTARG="\${$#}"
+	case $LASTARG in
+	*.y)
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" y.tab.c
+	    fi
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" y.tab.h
+	    fi
+	  ;;
+	esac
+    fi
+    if test ! -f y.tab.h; then
+	echo >y.tab.h
+    fi
+    if test ! -f y.tab.c; then
+	echo 'main() { return 0; }' >y.tab.c
+    fi
+    ;;
+
+  lex*|flex*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.l' file.  You may need the \`Flex' package
+         in order for those modifications to take effect.  You can get
+         \`Flex' from any GNU archive site."
+    rm -f lex.yy.c
+    if test $# -ne 1; then
+        eval LASTARG="\${$#}"
+	case $LASTARG in
+	*.l)
+	    SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" lex.yy.c
+	    fi
+	  ;;
+	esac
+    fi
+    if test ! -f lex.yy.c; then
+	echo 'main() { return 0; }' >lex.yy.c
+    fi
+    ;;
+
+  help2man*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+	 you modified a dependency of a manual page.  You may need the
+	 \`Help2man' package in order for those modifications to take
+	 effect.  You can get \`Help2man' from any GNU archive site."
+
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
+	touch $file
+    else
+	test -z "$file" || exec >$file
+	echo ".ab help2man is required to generate this page"
+	exit $?
+    fi
+    ;;
+
+  makeinfo*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.texi' or \`.texinfo' file, or any other file
+         indirectly affecting the aspect of the manual.  The spurious
+         call might also be the consequence of using a buggy \`make' (AIX,
+         DU, IRIX).  You might want to install the \`Texinfo' package or
+         the \`GNU make' package.  Grab either from any GNU archive site."
+    # The file to touch is that specified with -o ...
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -z "$file"; then
+      # ... or it is the one specified with @setfilename ...
+      infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+      file=`sed -n '
+	/^@setfilename/{
+	  s/.* \([^ ]*\) *$/\1/
+	  p
+	  q
+	}' $infile`
+      # ... or it is derived from the source name (dir/f.texi becomes f.info)
+      test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
+    fi
+    # If the file does not exist, the user really needs makeinfo;
+    # let's fail without touching anything.
+    test -f $file || exit 1
+    touch $file
+    ;;
+
+  tar*)
+    shift
+
+    # We have already tried tar in the generic part.
+    # Look for gnutar/gtar before invocation to avoid ugly error
+    # messages.
+    if (gnutar --version > /dev/null 2>&1); then
+       gnutar "$@" && exit 0
+    fi
+    if (gtar --version > /dev/null 2>&1); then
+       gtar "$@" && exit 0
+    fi
+    firstarg="$1"
+    if shift; then
+	case $firstarg in
+	*o*)
+	    firstarg=`echo "$firstarg" | sed s/o//`
+	    tar "$firstarg" "$@" && exit 0
+	    ;;
+	esac
+	case $firstarg in
+	*h*)
+	    firstarg=`echo "$firstarg" | sed s/h//`
+	    tar "$firstarg" "$@" && exit 0
+	    ;;
+	esac
+    fi
+
+    echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+         You may want to install GNU tar or Free paxutils, or check the
+         command line arguments."
+    exit 1
+    ;;
+
+  *)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.  Check the \`README' file,
+         it often tells you about the needed prerequisites for installing
+         this package.  You may also peek at any GNU archive site, in case
+         some other package would contain this missing \`$1' program."
+    exit 1
+    ;;
+esac
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/.svnignore
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/.svnignore	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/.svnignore	(revision 24799)
@@ -0,0 +1,7 @@
+Makefile
+autom4te.cache
+config.h
+config.log
+config.status
+mpibuildcol
+.deps
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/AUTHORS
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/AUTHORS	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/AUTHORS	(revision 24799)
@@ -0,0 +1,1 @@
+"John Thompson" <jmt12@students.waikato.ac.nz>
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/COPYING
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/COPYING	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/COPYING	(revision 24799)
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/INSTALL
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/INSTALL	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/INSTALL	(revision 24799)
@@ -0,0 +1,302 @@
+Installation Instructions
+*************************
+
+Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
+2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+
+   This file is free documentation; the Free Software Foundation gives
+unlimited permission to copy, distribute and modify it.
+
+Basic Installation
+==================
+
+   Briefly, the shell commands `./configure; make; make install' should
+configure, build, and install this package.  The following
+more-detailed instructions are generic; see the `README' file for
+instructions specific to this package.
+
+   The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation.  It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions.  Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, and a
+file `config.log' containing compiler output (useful mainly for
+debugging `configure').
+
+   It can also use an optional file (typically called `config.cache'
+and enabled with `--cache-file=config.cache' or simply `-C') that saves
+the results of its tests to speed up reconfiguring.  Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.
+
+   If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release.  If you are using the cache, and at
+some point `config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+   The file `configure.ac' (or `configure.in') is used to create
+`configure' by a program called `autoconf'.  You need `configure.ac' if
+you want to change it or regenerate `configure' using a newer version
+of `autoconf'.
+
+The simplest way to compile this package is:
+
+  1. `cd' to the directory containing the package's source code and type
+     `./configure' to configure the package for your system.
+
+     Running `configure' might take a while.  While running, it prints
+     some messages telling which features it is checking for.
+
+  2. Type `make' to compile the package.
+
+  3. Optionally, type `make check' to run any self-tests that come with
+     the package.
+
+  4. Type `make install' to install the programs and any data files and
+     documentation.
+
+  5. You can remove the program binaries and object files from the
+     source code directory by typing `make clean'.  To also remove the
+     files that `configure' created (so you can compile the package for
+     a different kind of computer), type `make distclean'.  There is
+     also a `make maintainer-clean' target, but that is intended mainly
+     for the package's developers.  If you use it, you may have to get
+     all sorts of other programs in order to regenerate files that came
+     with the distribution.
+
+  6. Often, you can also type `make uninstall' to remove the installed
+     files again.
+
+Compilers and Options
+=====================
+
+   Some systems require unusual options for compilation or linking that
+the `configure' script does not know about.  Run `./configure --help'
+for details on some of the pertinent environment variables.
+
+   You can give `configure' initial values for configuration parameters
+by setting variables in the command line or in the environment.  Here
+is an example:
+
+     ./configure CC=c99 CFLAGS=-g LIBS=-lposix
+
+   *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+   You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory.  To do this, you can use GNU `make'.  `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script.  `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+   With a non-GNU `make', it is safer to compile the package for one
+architecture at a time in the source code directory.  After you have
+installed the package for one architecture, use `make distclean' before
+reconfiguring for another architecture.
+
+   On MacOS X 10.5 and later systems, you can create libraries and
+executables that work on multiple system types--known as "fat" or
+"universal" binaries--by specifying multiple `-arch' options to the
+compiler but only a single `-arch' option to the preprocessor.  Like
+this:
+
+     ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+                 CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+                 CPP="gcc -E" CXXCPP="g++ -E"
+
+   This is not guaranteed to produce working output in all cases, you
+may have to build one architecture at a time and combine the results
+using the `lipo' tool if you have problems.
+
+Installation Names
+==================
+
+   By default, `make install' installs the package's commands under
+`/usr/local/bin', include files under `/usr/local/include', etc.  You
+can specify an installation prefix other than `/usr/local' by giving
+`configure' the option `--prefix=PREFIX'.
+
+   You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files.  If you
+pass the option `--exec-prefix=PREFIX' to `configure', the package uses
+PREFIX as the prefix for installing programs and libraries.
+Documentation and other data files still use the regular prefix.
+
+   In addition, if you use an unusual directory layout you can give
+options like `--bindir=DIR' to specify different values for particular
+kinds of files.  Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+   If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+   Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System).  The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+   For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Particular systems
+==================
+
+   On HP-UX, the default C compiler is not ANSI C compatible.  If GNU
+CC is not installed, it is recommended to use the following options in
+order to use an ANSI C compiler:
+
+     ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
+
+and if that doesn't work, install pre-built binaries of GCC for HP-UX.
+
+   On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
+parse its `<wchar.h>' header file.  The option `-nodtk' can be used as
+a workaround.  If GNU CC is not installed, it is therefore recommended
+to try
+
+     ./configure CC="cc"
+
+and if that doesn't work, try
+
+     ./configure CC="cc -nodtk"
+
+   On Solaris, don't put `/usr/ucb' early in your `PATH'.  This
+directory contains several dysfunctional programs; working variants of
+these programs are available in `/usr/bin'.  So, if you need `/usr/ucb'
+in your `PATH', put it _after_ `/usr/bin'.
+
+   On Haiku, software installed for all users goes in `/boot/common',
+not `/usr/local'.  It is recommended to use the following options:
+
+     ./configure --prefix=/boot/common
+
+Specifying the System Type
+==========================
+
+   There may be some features `configure' cannot figure out
+automatically, but needs to determine by the type of machine the package
+will run on.  Usually, assuming the package is built to be run on the
+_same_ architectures, `configure' can figure that out, but if it prints
+a message saying it cannot guess the machine type, give it the
+`--build=TYPE' option.  TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name which has the form:
+
+     CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+     OS
+     KERNEL-OS
+
+   See the file `config.sub' for the possible values of each field.  If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+   If you are _building_ compiler tools for cross-compiling, you should
+use the option `--target=TYPE' to select the type of system they will
+produce code for.
+
+   If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with `--host=TYPE'.
+
+Sharing Defaults
+================
+
+   If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists.  Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+   Variables not defined in a site shell script can be set in the
+environment passed to `configure'.  However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost.  In order to avoid this problem, you should set
+them in the `configure' command line, using `VAR=value'.  For example:
+
+     ./configure CC=/usr/local2/bin/gcc
+
+causes the specified `gcc' to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+Unfortunately, this technique does not work for `CONFIG_SHELL' due to
+an Autoconf bug.  Until the bug is fixed you can use this workaround:
+
+     CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
+
+`configure' Invocation
+======================
+
+   `configure' recognizes the following options to control how it
+operates.
+
+`--help'
+`-h'
+     Print a summary of all of the options to `configure', and exit.
+
+`--help=short'
+`--help=recursive'
+     Print a summary of the options unique to this package's
+     `configure', and exit.  The `short' variant lists options used
+     only in the top level, while the `recursive' variant lists options
+     also present in any nested packages.
+
+`--version'
+`-V'
+     Print the version of Autoconf used to generate the `configure'
+     script, and exit.
+
+`--cache-file=FILE'
+     Enable the cache: use and save the results of the tests in FILE,
+     traditionally `config.cache'.  FILE defaults to `/dev/null' to
+     disable caching.
+
+`--config-cache'
+`-C'
+     Alias for `--cache-file=config.cache'.
+
+`--quiet'
+`--silent'
+`-q'
+     Do not print messages saying which checks are being made.  To
+     suppress all normal output, redirect it to `/dev/null' (any error
+     messages will still be shown).
+
+`--srcdir=DIR'
+     Look for the package's source code in directory DIR.  Usually
+     `configure' can determine that directory automatically.
+
+`--prefix=DIR'
+     Use DIR as the installation prefix.  *Note Installation Names::
+     for more details, including other options available for fine-tuning
+     the installation locations.
+
+`--no-create'
+`-n'
+     Run the configure checks, but stop before creating any output
+     files.
+
+`configure' also accepts some other, not widely useful, options.  Run
+`configure --help' for more details.
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/Makefile.am
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/Makefile.am	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/Makefile.am	(revision 24799)
@@ -0,0 +1,2 @@
+bin_PROGRAMS = mpibuildcol
+mpibuildcol_SOURCES = mpibuildcol.cpp
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/Makefile.in
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/Makefile.in	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/Makefile.in	(revision 24799)
@@ -0,0 +1,600 @@
+# Makefile.in generated by automake 1.11 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = mpibuildcol$(EXEEXT)
+subdir = .
+DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
+	$(srcdir)/Makefile.in $(top_srcdir)/configure AUTHORS COPYING \
+	ChangeLog INSTALL NEWS config.guess config.sub depcomp \
+	install-sh missing
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_mpibuildcol_OBJECTS = mpibuildcol.$(OBJEXT)
+mpibuildcol_OBJECTS = $(am_mpibuildcol_OBJECTS)
+mpibuildcol_LDADD = $(LDADD)
+DEFAULT_INCLUDES = -I.@am__isrc@
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+	-o $@
+SOURCES = $(mpibuildcol_SOURCES)
+DIST_SOURCES = $(mpibuildcol_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+  { test ! -d "$(distdir)" \
+    || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+         && rm -fr "$(distdir)"; }; }
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EXEEXT = @EXEEXT@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+mpibuildcol_SOURCES = mpibuildcol.cpp
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cpp .o .obj
+am--refresh:
+	@:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \
+	      $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    echo ' $(SHELL) ./config.status'; \
+	    $(SHELL) ./config.status;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	$(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	$(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	for p in $$list; do echo "$$p $$p"; done | \
+	sed 's/$(EXEEXT)$$//' | \
+	while read p p1; do if test -f $$p; \
+	  then echo "$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
+	    -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+	sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) files[d] = files[d] " " $$1; \
+	    else { print "f", $$3 "/" $$4, $$1; } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	    if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	    test -z "$$files" || { \
+	      echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+	      $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+	    } \
+	; done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	  sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+	      -e 's/$$/$(EXEEXT)/' `; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+	-test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+mpibuildcol$(EXEEXT): $(mpibuildcol_OBJECTS) $(mpibuildcol_DEPENDENCIES) 
+	@rm -f mpibuildcol$(EXEEXT)
+	$(CXXLINK) $(mpibuildcol_OBJECTS) $(mpibuildcol_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpibuildcol.Po@am__quote@
+
+.cpp.o:
+@am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
+
+.cpp.obj:
+@am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	set x; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	$(am__remove_distdir)
+	test -d "$(distdir)" || mkdir "$(distdir)"
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	-test -n "$(am__skip_mode_fix)" \
+	|| find "$(distdir)" -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
+	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+	|| chmod -R a+r "$(distdir)"
+dist-gzip: distdir
+	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	$(am__remove_distdir)
+
+dist-bzip2: distdir
+	tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+	$(am__remove_distdir)
+
+dist-lzma: distdir
+	tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
+	$(am__remove_distdir)
+
+dist-xz: distdir
+	tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz
+	$(am__remove_distdir)
+
+dist-tarZ: distdir
+	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+	$(am__remove_distdir)
+
+dist-shar: distdir
+	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+	$(am__remove_distdir)
+
+dist-zip: distdir
+	-rm -f $(distdir).zip
+	zip -rq $(distdir).zip $(distdir)
+	$(am__remove_distdir)
+
+dist dist-all: distdir
+	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	$(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+	case '$(DIST_ARCHIVES)' in \
+	*.tar.gz*) \
+	  GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
+	*.tar.bz2*) \
+	  bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
+	*.tar.lzma*) \
+	  unlzma -c $(distdir).tar.lzma | $(am__untar) ;;\
+	*.tar.xz*) \
+	  xz -dc $(distdir).tar.xz | $(am__untar) ;;\
+	*.tar.Z*) \
+	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+	*.shar.gz*) \
+	  GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
+	*.zip*) \
+	  unzip $(distdir).zip ;;\
+	esac
+	chmod -R a-w $(distdir); chmod a+w $(distdir)
+	mkdir $(distdir)/_build
+	mkdir $(distdir)/_inst
+	chmod a-w $(distdir)
+	test -d $(distdir)/_build || exit 0; \
+	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+	  && am__cwd=`pwd` \
+	  && $(am__cd) $(distdir)/_build \
+	  && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+	    $(DISTCHECK_CONFIGURE_FLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
+	  && $(MAKE) $(AM_MAKEFLAGS) check \
+	  && $(MAKE) $(AM_MAKEFLAGS) install \
+	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+	        distuninstallcheck \
+	  && chmod -R a-w "$$dc_install_base" \
+	  && ({ \
+	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
+	  && rm -rf "$$dc_destdir" \
+	  && $(MAKE) $(AM_MAKEFLAGS) dist \
+	  && rm -rf $(DIST_ARCHIVES) \
+	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+	  && cd "$$am__cwd" \
+	  || exit 1
+	$(am__remove_distdir)
+	@(echo "$(distdir) archives ready for distribution: "; \
+	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+	@$(am__cd) '$(distuninstallcheck_dir)' \
+	&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+	   || { echo "ERROR: files left after uninstall:" ; \
+	        if test -n "$(DESTDIR)"; then \
+	          echo "  (check DESTDIR support)"; \
+	        fi ; \
+	        $(distuninstallcheck_listfiles) ; \
+	        exit 1; } >&2
+distcleancheck: distclean
+	@if test '$(srcdir)' = . ; then \
+	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+	  exit 1 ; \
+	fi
+	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+	  || { echo "ERROR: files left in build directory after distclean:" ; \
+	       $(distcleancheck_listfiles) ; \
+	       exit 1; } >&2
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS)
+installdirs:
+	for dir in "$(DESTDIR)$(bindir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -rf $(top_srcdir)/autom4te.cache
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am am--refresh check check-am clean \
+	clean-binPROGRAMS clean-generic ctags dist dist-all dist-bzip2 \
+	dist-gzip dist-lzma dist-shar dist-tarZ dist-xz dist-zip \
+	distcheck distclean distclean-compile distclean-generic \
+	distclean-tags distcleancheck distdir distuninstallcheck dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-binPROGRAMS install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
+	tags uninstall uninstall-am uninstall-binPROGRAMS
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/README
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/README	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/README	(revision 24799)
@@ -0,0 +1,25 @@
+###########################################################################
+#
+# Makefile -- build-src/src/mpi/
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2011  The New Zealand Digital Library Project
+#
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/aclocal.m4
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/aclocal.m4	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/aclocal.m4	(revision 24799)
@@ -0,0 +1,951 @@
+# generated automatically by aclocal 1.11 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2007, 2008, 2009  Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],,
+[m4_warning([this file was generated for autoconf 2.68.
+You have another version of autoconf.  It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically `autoreconf'.])])
+
+# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.11'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version.  Point them to the right macro.
+m4_if([$1], [1.11], [],
+      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too.  Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.11])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 9
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 10
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
+       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
+       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+       [$1], UPC,  [depcc="$UPC"  am_compiler_list=],
+       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                   [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  am__universal=false
+  m4_case([$1], [CC],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac],
+    [CXX],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac])
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 5
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named `Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`AS_DIRNAME("$mf")`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running `make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`AS_DIRNAME(["$file"])`
+      AS_MKDIR_P([$dirpart/$fdir])
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled.  FIXME.  This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 16
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.62])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
+  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+	      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+			     [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+		  [_AM_DEPENDENCIES(CC)],
+		  [define([AC_PROG_CC],
+			  defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+		  [_AM_DEPENDENCIES(CXX)],
+		  [define([AC_PROG_CXX],
+			  defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+		  [_AM_DEPENDENCIES(OBJC)],
+		  [define([AC_PROG_OBJC],
+			  defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
+])
+_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
+dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
+dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
+dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+])
+
+dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Check to see how 'make' treats includes.	            -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2009  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 6
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check for `mkdir -p'.
+AC_DEFUN([AM_PROG_MKDIR_P],
+[AC_PREREQ([2.60])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
+dnl while keeping a definition of mkdir_p for backward compatibility.
+dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
+dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
+dnl Makefile.ins that do not define MKDIR_P, so we do our own
+dnl adjustment using top_builddir (which is defined more often than
+dnl MKDIR_P).
+AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
+case $mkdir_p in
+  [[\\/$]]* | ?:[[\\/]]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[[\\\"\#\$\&\'\`$am_lf]]*)
+    AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+  *[[\\\"\#\$\&\'\`$am_lf\ \	]]*)
+    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
+esac
+
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+   if test "$[*]" = "X"; then
+      # -L didn't work.
+      set X `ls -t "$srcdir/configure" conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$[*]" != "X $srcdir/configure conftest.file" \
+      && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+     [m4_case([$1], [ustar],, [pax],,
+              [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+  case $_am_tool in
+  gnutar)
+    for _am_tar in tar gnutar gtar;
+    do
+      AM_RUN_LOG([$_am_tar --version]) && break
+    done
+    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+    am__untar="$_am_tar -xf -"
+    ;;
+  plaintar)
+    # Must skip GNU tar: if it does not support --format= it doesn't create
+    # ustar tarball either.
+    (tar --version) >/dev/null 2>&1 && continue
+    am__tar='tar chf - "$$tardir"'
+    am__tar_='tar chf - "$tardir"'
+    am__untar='tar xf -'
+    ;;
+  pax)
+    am__tar='pax -L -x $1 -w "$$tardir"'
+    am__tar_='pax -L -x $1 -w "$tardir"'
+    am__untar='pax -r'
+    ;;
+  cpio)
+    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+    am__untar='cpio -i -H $1 -d'
+    ;;
+  none)
+    am__tar=false
+    am__tar_=false
+    am__untar=false
+    ;;
+  esac
+
+  # If the value was cached, stop now.  We just wanted to have am__tar
+  # and am__untar set.
+  test -n "${am_cv_prog_tar_$1}" && break
+
+  # tar/untar a dummy directory, and stop if the command works
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  echo GrepMe > conftest.dir/file
+  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+  rm -rf conftest.dir
+  if test -s conftest.tar; then
+    AM_RUN_LOG([$am__untar <conftest.tar])
+    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+  fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/config.guess
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/config.guess	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/config.guess	(revision 24799)
@@ -0,0 +1,1561 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+#   Free Software Foundation, Inc.
+
+timestamp='2009-04-27'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Originally written by Per Bothner <per@bothner.com>.
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int x;" > $dummy.c ;
+	for c in cc gcc c89 c99 ; do
+	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+	     CC_FOR_BUILD="$c"; break ;
+	  fi ;
+	done ;
+	if test x"$CC_FOR_BUILD" = x ; then
+	  CC_FOR_BUILD=no_compiler_found ;
+	fi
+	;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+	# NetBSD (nbsd) targets should (where applicable) match one or
+	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	#
+	# Note: NetBSD doesn't particularly care about the vendor
+	# portion of the name.  We always set it to "unknown".
+	sysctl="sysctl -n hw.machine_arch"
+	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+	case "${UNAME_MACHINE_ARCH}" in
+	    armeb) machine=armeb-unknown ;;
+	    arm*) machine=arm-unknown ;;
+	    sh3el) machine=shl-unknown ;;
+	    sh3eb) machine=sh-unknown ;;
+	    sh5el) machine=sh5le-unknown ;;
+	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+	esac
+	# The Operating System including object format, if it has switched
+	# to ELF recently, or will in the future.
+	case "${UNAME_MACHINE_ARCH}" in
+	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+		eval $set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep __ELF__ >/dev/null
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+	        os=netbsd
+		;;
+	esac
+	# The OS release
+	# Debian GNU/NetBSD machines have a different userland, and
+	# thus, need a distinct triplet. However, they do not need
+	# kernel version information, so it can be replaced with a
+	# suitable tag, in the style of linux-gnu.
+	case "${UNAME_VERSION}" in
+	    Debian*)
+		release='-gnu'
+		;;
+	    *)
+		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+		;;
+	esac
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	echo "${machine}-${os}${release}"
+	exit ;;
+    *:OpenBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+	exit ;;
+    *:ekkoBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+	exit ;;
+    *:SolidBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+	exit ;;
+    macppc:MirBSD:*:*)
+	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    *:MirBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    alpha:OSF1:*:*)
+	case $UNAME_RELEASE in
+	*4.0)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+		;;
+	*5.*)
+	        UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+		;;
+	esac
+	# According to Compaq, /usr/sbin/psrinfo has been available on
+	# OSF/1 and Tru64 systems produced since 1995.  I hope that
+	# covers most systems running today.  This code pipes the CPU
+	# types through head -n 1, so we only detect the type of CPU 0.
+	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+	case "$ALPHA_CPU_TYPE" in
+	    "EV4 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV4.5 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "LCA4 (21066/21068)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV5 (21164)")
+		UNAME_MACHINE="alphaev5" ;;
+	    "EV5.6 (21164A)")
+		UNAME_MACHINE="alphaev56" ;;
+	    "EV5.6 (21164PC)")
+		UNAME_MACHINE="alphapca56" ;;
+	    "EV5.7 (21164PC)")
+		UNAME_MACHINE="alphapca57" ;;
+	    "EV6 (21264)")
+		UNAME_MACHINE="alphaev6" ;;
+	    "EV6.7 (21264A)")
+		UNAME_MACHINE="alphaev67" ;;
+	    "EV6.8CB (21264C)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8AL (21264B)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8CX (21264D)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.9A (21264/EV69A)")
+		UNAME_MACHINE="alphaev69" ;;
+	    "EV7 (21364)")
+		UNAME_MACHINE="alphaev7" ;;
+	    "EV7.9 (21364A)")
+		UNAME_MACHINE="alphaev79" ;;
+	esac
+	# A Pn.n version is a patched version.
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	exit ;;
+    Alpha\ *:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# Should we change UNAME_MACHINE based on the output of uname instead
+	# of the specific Alpha model?
+	echo alpha-pc-interix
+	exit ;;
+    21064:Windows_NT:50:3)
+	echo alpha-dec-winnt3.5
+	exit ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-unknown-sysv4
+	exit ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-amigaos
+	exit ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-morphos
+	exit ;;
+    *:OS/390:*:*)
+	echo i370-ibm-openedition
+	exit ;;
+    *:z/VM:*:*)
+	echo s390-ibm-zvmoe
+	exit ;;
+    *:OS400:*:*)
+        echo powerpc-ibm-os400
+	exit ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit ;;
+    arm:riscos:*:*|arm:RISCOS:*:*)
+	echo arm-unknown-riscos
+	exit ;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit ;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit ;;
+    NILE*:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit ;;
+    DRS?6000:unix:4.0:6*)
+	echo sparc-icl-nx6
+	exit ;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+	case `/usr/bin/uname -p` in
+	    sparc) echo sparc-icl-nx7; exit ;;
+	esac ;;
+    s390x:SunOS:*:*)
+	echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4H:SunOS:5.*:*)
+	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+	eval $set_cc_for_build
+	SUN_ARCH="i386"
+	# If there is a compiler, see if it is configured for 64-bit objects.
+	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+	# This test works for both compilers.
+	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		grep IS_64BIT_ARCH >/dev/null
+	    then
+		SUN_ARCH="x86_64"
+	    fi
+	fi
+	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:*:*)
+	case "`/usr/bin/arch -k`" in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+	exit ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos${UNAME_RELEASE}
+	exit ;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+	case "`/bin/arch`" in
+	    sun3)
+		echo m68k-sun-sunos${UNAME_RELEASE}
+		;;
+	    sun4)
+		echo sparc-sun-sunos${UNAME_RELEASE}
+		;;
+	esac
+	exit ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos${UNAME_RELEASE}
+	exit ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+        exit ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+        echo m68k-milan-mint${UNAME_RELEASE}
+        exit ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+        echo m68k-hades-mint${UNAME_RELEASE}
+        exit ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+        echo m68k-unknown-mint${UNAME_RELEASE}
+        exit ;;
+    m68k:machten:*:*)
+	echo m68k-apple-machten${UNAME_RELEASE}
+	exit ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten${UNAME_RELEASE}
+	exit ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	echo clipper-intergraph-clix${UNAME_RELEASE}
+	exit ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c &&
+	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+	  SYSTEM_NAME=`$dummy $dummyarg` &&
+	    { echo "$SYSTEM_NAME"; exit; }
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit ;;
+    Motorola:PowerMAX_OS:*:*)
+	echo powerpc-motorola-powermax
+	exit ;;
+    Motorola:*:4.3:PL8-*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+	then
+	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+	       [ ${TARGET_BINARY_INTERFACE}x = x ]
+	    then
+		echo m88k-dg-dgux${UNAME_RELEASE}
+	    else
+		echo m88k-dg-dguxbcs${UNAME_RELEASE}
+	    fi
+	else
+	    echo i586-dg-dgux${UNAME_RELEASE}
+	fi
+ 	exit ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+	exit ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
+	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+	echo i386-ibm-aix
+	exit ;;
+    ia64:AIX:*:*)
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		eval $set_cc_for_build
+		sed 's/^		//' << EOF >$dummy.c
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+		then
+			echo "$SYSTEM_NAME"
+		else
+			echo rs6000-ibm-aix3.2.5
+		fi
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		echo rs6000-ibm-aix3.2.4
+	else
+		echo rs6000-ibm-aix3.2
+	fi
+	exit ;;
+    *:AIX:*:[456])
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+	echo romp-ibm-bsd4.4
+	exit ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+	exit ;;                             # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit ;;
+    9000/[34678]??:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+		if [ -x /usr/bin/getconf ]; then
+		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+                    case "${sc_cpu_version}" in
+                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+                      532)                      # CPU_PA_RISC2_0
+                        case "${sc_kernel_bits}" in
+                          32) HP_ARCH="hppa2.0n" ;;
+                          64) HP_ARCH="hppa2.0w" ;;
+			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+                        esac ;;
+                    esac
+		fi
+		if [ "${HP_ARCH}" = "" ]; then
+		    eval $set_cc_for_build
+		    sed 's/^              //' << EOF >$dummy.c
+
+              #define _HPUX_SOURCE
+              #include <stdlib.h>
+              #include <unistd.h>
+
+              int main ()
+              {
+              #if defined(_SC_KERNEL_BITS)
+                  long bits = sysconf(_SC_KERNEL_BITS);
+              #endif
+                  long cpu  = sysconf (_SC_CPU_VERSION);
+
+                  switch (cpu)
+              	{
+              	case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+              	case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+              	case CPU_PA_RISC2_0:
+              #if defined(_SC_KERNEL_BITS)
+              	    switch (bits)
+              		{
+              		case 64: puts ("hppa2.0w"); break;
+              		case 32: puts ("hppa2.0n"); break;
+              		default: puts ("hppa2.0"); break;
+              		} break;
+              #else  /* !defined(_SC_KERNEL_BITS) */
+              	    puts ("hppa2.0"); break;
+              #endif
+              	default: puts ("hppa1.0"); break;
+              	}
+                  exit (0);
+              }
+EOF
+		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+		    test -z "$HP_ARCH" && HP_ARCH=hppa
+		fi ;;
+	esac
+	if [ ${HP_ARCH} = "hppa2.0w" ]
+	then
+	    eval $set_cc_for_build
+
+	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+	    # generating 64-bit code.  GNU and HP use different nomenclature:
+	    #
+	    # $ CC_FOR_BUILD=cc ./config.guess
+	    # => hppa2.0w-hp-hpux11.23
+	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+	    # => hppa64-hp-hpux11.23
+
+	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+		grep __LP64__ >/dev/null
+	    then
+		HP_ARCH="hppa2.0w"
+	    else
+		HP_ARCH="hppa64"
+	    fi
+	fi
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit ;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ia64-hp-hpux${HPUX_REV}
+	exit ;;
+    3050*:HI-UX:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+		{ echo "$SYSTEM_NAME"; exit; }
+	echo unknown-hitachi-hiuxwe2
+	exit ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+	echo hppa1.0-hp-mpeix
+	exit ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit ;;
+    i*86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo ${UNAME_MACHINE}-unknown-osf1mk
+	else
+	    echo ${UNAME_MACHINE}-unknown-osf1
+	fi
+	exit ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+        exit ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+        exit ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+        exit ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+        exit ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+        exit ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*[A-Z]90:*:*:*)
+	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+	      -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*T3E:*:*:*)
+	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*SV1:*:*:*)
+	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    *:UNICOS/mp:*:*)
+	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit ;;
+    5000:UNIX_System_V:4.*:*)
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+	exit ;;
+    sparc*:BSD/OS:*:*)
+	echo sparc-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:FreeBSD:*:*)
+	case ${UNAME_MACHINE} in
+	    pc98)
+		echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    amd64)
+		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    *)
+		echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	esac
+	exit ;;
+    i*:CYGWIN*:*)
+	echo ${UNAME_MACHINE}-pc-cygwin
+	exit ;;
+    *:MINGW*:*)
+	echo ${UNAME_MACHINE}-pc-mingw32
+	exit ;;
+    i*:windows32*:*)
+    	# uname -m includes "-pc" on this system.
+    	echo ${UNAME_MACHINE}-mingw32
+	exit ;;
+    i*:PW*:*)
+	echo ${UNAME_MACHINE}-pc-pw32
+	exit ;;
+    *:Interix*:[3456]*)
+    	case ${UNAME_MACHINE} in
+	    x86)
+		echo i586-pc-interix${UNAME_RELEASE}
+		exit ;;
+	    EM64T | authenticamd | genuineintel)
+		echo x86_64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	    IA64)
+		echo ia64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	esac ;;
+    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+	echo i${UNAME_MACHINE}-pc-mks
+	exit ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+	# UNAME_MACHINE based on the output of uname instead of i386?
+	echo i586-pc-interix
+	exit ;;
+    i*:UWIN*:*)
+	echo ${UNAME_MACHINE}-pc-uwin
+	exit ;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+	echo x86_64-unknown-cygwin
+	exit ;;
+    p*:CYGWIN*:*)
+	echo powerpcle-unknown-cygwin
+	exit ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    *:GNU:*:*)
+	# the GNU system
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit ;;
+    *:GNU/*:*:*)
+	# other systems with GNU libc and userland
+	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+	exit ;;
+    i*86:Minix:*:*)
+	echo ${UNAME_MACHINE}-pc-minix
+	exit ;;
+    arm*:Linux:*:*)
+	eval $set_cc_for_build
+	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+	    | grep -q __ARM_EABI__
+	then
+	    echo ${UNAME_MACHINE}-unknown-linux-gnu
+	else
+	    echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+	fi
+	exit ;;
+    avr32*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    cris:Linux:*:*)
+	echo cris-axis-linux-gnu
+	exit ;;
+    crisv32:Linux:*:*)
+	echo crisv32-axis-linux-gnu
+	exit ;;
+    frv:Linux:*:*)
+    	echo frv-unknown-linux-gnu
+	exit ;;
+    ia64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m32r*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m68*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    mips:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef mips
+	#undef mipsel
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=mipsel
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=mips
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+	    /^CPU/{
+		s: ::g
+		p
+	    }'`"
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+	;;
+    mips64:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef mips64
+	#undef mips64el
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=mips64el
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=mips64
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+	    /^CPU/{
+		s: ::g
+		p
+	    }'`"
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+	;;
+    or32:Linux:*:*)
+	echo or32-unknown-linux-gnu
+	exit ;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-gnu
+	exit ;;
+    ppc64:Linux:*:*)
+	echo powerpc64-unknown-linux-gnu
+	exit ;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev68 ;;
+        esac
+	objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+	exit ;;
+    padre:Linux:*:*)
+	echo sparc-unknown-linux-gnu
+	exit ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
+	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
+	  *)    echo hppa-unknown-linux-gnu ;;
+	esac
+	exit ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-gnu
+	exit ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	echo ${UNAME_MACHINE}-ibm-linux
+	exit ;;
+    sh64*:Linux:*:*)
+    	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    sh*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    vax:Linux:*:*)
+	echo ${UNAME_MACHINE}-dec-linux-gnu
+	exit ;;
+    x86_64:Linux:*:*)
+	echo x86_64-unknown-linux-gnu
+	exit ;;
+    xtensa*:Linux:*:*)
+    	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    i*86:Linux:*:*)
+	# The BFD linker knows what the default object file format is, so
+	# first see if it will tell us. cd to the root directory to prevent
+	# problems with other programs or directories called `ld' in the path.
+	# Set LC_ALL=C to ensure ld outputs messages in English.
+	ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+			 | sed -ne '/supported targets:/!d
+				    s/[ 	][ 	]*/ /g
+				    s/.*supported targets: *//
+				    s/ .*//
+				    p'`
+        case "$ld_supported_targets" in
+	  elf32-i386)
+		TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+		;;
+	  a.out-i386-linux)
+		echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+		exit ;;
+	  "")
+		# Either a pre-BFD a.out linker (linux-gnuoldld) or
+		# one that does not give us useful --help.
+		echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+		exit ;;
+	esac
+	# Determine whether the default compiler is a.out or elf
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <features.h>
+	#ifdef __ELF__
+	# ifdef __GLIBC__
+	#  if __GLIBC__ >= 2
+	LIBC=gnu
+	#  else
+	LIBC=gnulibc1
+	#  endif
+	# else
+	LIBC=gnulibc1
+	# endif
+	#else
+	#if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+	LIBC=gnu
+	#else
+	LIBC=gnuaout
+	#endif
+	#endif
+	#ifdef __dietlibc__
+	LIBC=dietlibc
+	#endif
+EOF
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+	    /^LIBC/{
+		s: ::g
+		p
+	    }'`"
+	test x"${LIBC}" != x && {
+		echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+		exit
+	}
+	test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
+	;;
+    i*86:DYNIX/ptx:4*:*)
+	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+	# earlier versions are messed up and put the nodename in both
+	# sysname and nodename.
+	echo i386-sequent-sysv4
+	exit ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+        # Unixware is an offshoot of SVR4, but it has its own version
+        # number series starting with 2...
+        # I am not positive that other SVR4 systems won't match this,
+	# I just have to hope.  -- rms.
+        # Use sysv4.2uw... so that sysv4* matches it.
+	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+	exit ;;
+    i*86:OS/2:*:*)
+	# If we were able to find `uname', then EMX Unix compatibility
+	# is probably installed.
+	echo ${UNAME_MACHINE}-pc-os2-emx
+	exit ;;
+    i*86:XTS-300:*:STOP)
+	echo ${UNAME_MACHINE}-unknown-stop
+	exit ;;
+    i*86:atheos:*:*)
+	echo ${UNAME_MACHINE}-unknown-atheos
+	exit ;;
+    i*86:syllable:*:*)
+	echo ${UNAME_MACHINE}-pc-syllable
+	exit ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+	echo i386-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    i*86:*DOS:*:*)
+	echo ${UNAME_MACHINE}-pc-msdosdjgpp
+	exit ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+	else
+		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+	fi
+	exit ;;
+    i*86:*:5:[678]*)
+    	# UnixWare 7.x, OpenUNIX and OpenServer 6.
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	exit ;;
+    i*86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-pc-sysv32
+	fi
+	exit ;;
+    pc:*:*:*)
+	# Left here for compatibility:
+        # uname -m prints for DJGPP always 'pc', but it prints nothing about
+        # the processor, so we play safe by assuming i586.
+	# Note: whatever this is, it MUST be the same as what config.sub
+	# prints for the "djgpp" host, or else GDB configury will decide that
+	# this is a cross-build.
+	echo i586-pc-msdosdjgpp
+        exit ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit ;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	fi
+	exit ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+	echo m68k-convergent-sysv
+	exit ;;
+    M680?0:D-NIX:5.3:*)
+	echo m68k-diab-dnix
+	exit ;;
+    M68*:*:R3V[5678]*:*)
+	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && { echo i486-ncr-sysv4; exit; } ;;
+    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+	OS_REL='.3'
+	test -r /etc/.relid \
+	    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+	echo m68k-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    rs6000:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+	echo powerpc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv${UNAME_RELEASE}
+	exit ;;
+    RM*:ReliantUNIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		echo ${UNAME_MACHINE}-sni-sysv4
+	else
+		echo ns32k-sni-sysv
+	fi
+	exit ;;
+    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                      # says <Richard.M.Bartel@ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes@openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit ;;
+    *:*:*:FTX*)
+	# From seanf@swdc.stratus.com.
+	echo i860-stratus-sysv4
+	exit ;;
+    i*86:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo ${UNAME_MACHINE}-stratus-vos
+	exit ;;
+    *:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo hppa1.1-stratus-vos
+	exit ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux${UNAME_RELEASE}
+	exit ;;
+    news*:NEWS-OS:6*:*)
+	echo mips-sony-newsos6
+	exit ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+	if [ -d /usr/nec ]; then
+	        echo mips-nec-sysv${UNAME_RELEASE}
+	else
+	        echo mips-unknown-sysv${UNAME_RELEASE}
+	fi
+        exit ;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	echo powerpc-be-beos
+	exit ;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	echo powerpc-apple-beos
+	exit ;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	echo i586-pc-beos
+	exit ;;
+    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
+	echo i586-pc-haiku
+	exit ;;
+    SX-4:SUPER-UX:*:*)
+	echo sx4-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-5:SUPER-UX:*:*)
+	echo sx5-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-6:SUPER-UX:*:*)
+	echo sx6-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-7:SUPER-UX:*:*)
+	echo sx7-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8:SUPER-UX:*:*)
+	echo sx8-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8R:SUPER-UX:*:*)
+	echo sx8r-nec-superux${UNAME_RELEASE}
+	exit ;;
+    Power*:Rhapsody:*:*)
+	echo powerpc-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Rhapsody:*:*)
+	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Darwin:*:*)
+	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+	case $UNAME_PROCESSOR in
+	    unknown) UNAME_PROCESSOR=powerpc ;;
+	esac
+	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+	exit ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	UNAME_PROCESSOR=`uname -p`
+	if test "$UNAME_PROCESSOR" = "x86"; then
+		UNAME_PROCESSOR=i386
+		UNAME_MACHINE=pc
+	fi
+	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+	exit ;;
+    *:QNX:*:4*)
+	echo i386-pc-qnx
+	exit ;;
+    NSE-?:NONSTOP_KERNEL:*:*)
+	echo nse-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSR-?:NONSTOP_KERNEL:*:*)
+	echo nsr-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    *:NonStop-UX:*:*)
+	echo mips-compaq-nonstopux
+	exit ;;
+    BS2000:POSIX*:*:*)
+	echo bs2000-siemens-sysv
+	exit ;;
+    DS/*:UNIX_System_V:*:*)
+	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+	exit ;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	if test "$cputype" = "386"; then
+	    UNAME_MACHINE=i386
+	else
+	    UNAME_MACHINE="$cputype"
+	fi
+	echo ${UNAME_MACHINE}-unknown-plan9
+	exit ;;
+    *:TOPS-10:*:*)
+	echo pdp10-unknown-tops10
+	exit ;;
+    *:TENEX:*:*)
+	echo pdp10-unknown-tenex
+	exit ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	echo pdp10-dec-tops20
+	exit ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	echo pdp10-xkl-tops20
+	exit ;;
+    *:TOPS-20:*:*)
+	echo pdp10-unknown-tops20
+	exit ;;
+    *:ITS:*:*)
+	echo pdp10-unknown-its
+	exit ;;
+    SEI:*:*:SEIUX)
+        echo mips-sei-seiux${UNAME_RELEASE}
+	exit ;;
+    *:DragonFly:*:*)
+	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit ;;
+    *:*VMS:*:*)
+    	UNAME_MACHINE=`(uname -p) 2>/dev/null`
+	case "${UNAME_MACHINE}" in
+	    A*) echo alpha-dec-vms ; exit ;;
+	    I*) echo ia64-dec-vms ; exit ;;
+	    V*) echo vax-dec-vms ; exit ;;
+	esac ;;
+    *:XENIX:*:SysV)
+	echo i386-pc-xenix
+	exit ;;
+    i*86:skyos:*:*)
+	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+	exit ;;
+    i*86:rdos:*:*)
+	echo ${UNAME_MACHINE}-pc-rdos
+	exit ;;
+    i*86:AROS:*:*)
+	echo ${UNAME_MACHINE}-pc-aros
+	exit ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+          "4"
+#else
+	  ""
+#endif
+         ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+	printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+	printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# else
+    printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+	{ echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+	echo c1-convex-bsd
+	exit ;;
+    c2*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit ;;
+    c34*)
+	echo c34-convex-bsd
+	exit ;;
+    c38*)
+	echo c38-convex-bsd
+	exit ;;
+    c4*)
+	echo c4-convex-bsd
+	exit ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+and
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/config.sub
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/config.sub	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/config.sub	(revision 24799)
@@ -0,0 +1,1686 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+#   Free Software Foundation, Inc.
+
+timestamp='2009-04-17'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
+  uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
+  kopensolaris*-gnu* | \
+  storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+	-sun*os*)
+		# Prevent following clause from handling this invalid input.
+		;;
+	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+	-apple | -axis | -knuth | -cray)
+		os=
+		basic_machine=$1
+		;;
+	-sim | -cisco | -oki | -wec | -winbond)
+		os=
+		basic_machine=$1
+		;;
+	-scout)
+		;;
+	-wrs)
+		os=-vxworks
+		basic_machine=$1
+		;;
+	-chorusos*)
+		os=-chorusos
+		basic_machine=$1
+		;;
+ 	-chorusrdb)
+ 		os=-chorusrdb
+		basic_machine=$1
+ 		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco6)
+		os=-sco5v6
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5)
+		os=-sco3.2v5
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5v6*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-udk*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-lynx*)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-windowsnt*)
+		os=`echo $os | sed -e 's/windowsnt/winnt/'`
+		;;
+	-psos*)
+		os=-psos
+		;;
+	-mint | -mint[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+	# Recognize the basic CPU types without company name.
+	# Some are omitted here because they have special meanings below.
+	1750a | 580 \
+	| a29k \
+	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+	| am33_2.0 \
+	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+	| bfin \
+	| c4x | clipper \
+	| d10v | d30v | dlx | dsp16xx \
+	| fido | fr30 | frv \
+	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| i370 | i860 | i960 | ia64 \
+	| ip2k | iq2000 \
+	| lm32 \
+	| m32c | m32r | m32rle | m68000 | m68k | m88k \
+	| maxq | mb | microblaze | mcore | mep | metag \
+	| mips | mipsbe | mipseb | mipsel | mipsle \
+	| mips16 \
+	| mips64 | mips64el \
+	| mips64octeon | mips64octeonel \
+	| mips64orion | mips64orionel \
+	| mips64r5900 | mips64r5900el \
+	| mips64vr | mips64vrel \
+	| mips64vr4100 | mips64vr4100el \
+	| mips64vr4300 | mips64vr4300el \
+	| mips64vr5000 | mips64vr5000el \
+	| mips64vr5900 | mips64vr5900el \
+	| mipsisa32 | mipsisa32el \
+	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa64 | mipsisa64el \
+	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64sb1 | mipsisa64sb1el \
+	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipstx39 | mipstx39el \
+	| mn10200 | mn10300 \
+	| moxie \
+	| mt \
+	| msp430 \
+	| nios | nios2 \
+	| ns16k | ns32k \
+	| or32 \
+	| pdp10 | pdp11 | pj | pjl \
+	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+	| pyramid \
+	| score \
+	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+	| sh64 | sh64le \
+	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+	| spu | strongarm \
+	| tahoe | thumb | tic4x | tic80 | tron \
+	| v850 | v850e \
+	| we32k \
+	| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
+	| z8k | z80)
+		basic_machine=$basic_machine-unknown
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12)
+		# Motorola 68HC11/12.
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+		;;
+	ms1)
+		basic_machine=mt-unknown
+		;;
+
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i*86 | x86_64)
+	  basic_machine=$basic_machine-pc
+	  ;;
+	# Object if more than one company name word.
+	*-*-*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+	# Recognize the basic CPU types with company name.
+	580-* \
+	| a29k-* \
+	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+	| avr-* | avr32-* \
+	| bfin-* | bs2000-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+	| clipper-* | craynv-* | cydra-* \
+	| d10v-* | d30v-* | dlx-* \
+	| elxsi-* \
+	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+	| h8300-* | h8500-* \
+	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| i*86-* | i860-* | i960-* | ia64-* \
+	| ip2k-* | iq2000-* \
+	| lm32-* \
+	| m32c-* | m32r-* | m32rle-* \
+	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
+	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+	| mips16-* \
+	| mips64-* | mips64el-* \
+	| mips64octeon-* | mips64octeonel-* \
+	| mips64orion-* | mips64orionel-* \
+	| mips64r5900-* | mips64r5900el-* \
+	| mips64vr-* | mips64vrel-* \
+	| mips64vr4100-* | mips64vr4100el-* \
+	| mips64vr4300-* | mips64vr4300el-* \
+	| mips64vr5000-* | mips64vr5000el-* \
+	| mips64vr5900-* | mips64vr5900el-* \
+	| mipsisa32-* | mipsisa32el-* \
+	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa64-* | mipsisa64el-* \
+	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64sb1-* | mipsisa64sb1el-* \
+	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipstx39-* | mipstx39el-* \
+	| mmix-* \
+	| mt-* \
+	| msp430-* \
+	| nios-* | nios2-* \
+	| none-* | np1-* | ns16k-* | ns32k-* \
+	| orion-* \
+	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+	| pyramid-* \
+	| romp-* | rs6000-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+	| sparclite-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
+	| tahoe-* | thumb-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \
+	| tron-* \
+	| v850-* | v850e-* | vax-* \
+	| we32k-* \
+	| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
+	| xstormy16-* | xtensa*-* \
+	| ymp-* \
+	| z8k-* | z80-*)
+		;;
+	# Recognize the basic CPU types without company name, with glob match.
+	xtensa*)
+		basic_machine=$basic_machine-unknown
+		;;
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	386bsd)
+		basic_machine=i386-unknown
+		os=-bsd
+		;;
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		basic_machine=m68000-att
+		;;
+	3b*)
+		basic_machine=we32k-att
+		;;
+	a29khif)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+    	abacus)
+		basic_machine=abacus-unknown
+		;;
+	adobe68k)
+		basic_machine=m68010-adobe
+		os=-scout
+		;;
+	alliant | fx80)
+		basic_machine=fx80-alliant
+		;;
+	altos | altos3068)
+		basic_machine=m68k-altos
+		;;
+	am29k)
+		basic_machine=a29k-none
+		os=-bsd
+		;;
+	amd64)
+		basic_machine=x86_64-pc
+		;;
+	amd64-*)
+		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	amdahl)
+		basic_machine=580-amdahl
+		os=-sysv
+		;;
+	amiga | amiga-*)
+		basic_machine=m68k-unknown
+		;;
+	amigaos | amigados)
+		basic_machine=m68k-unknown
+		os=-amigaos
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-unknown
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	apollo68bsd)
+		basic_machine=m68k-apollo
+		os=-bsd
+		;;
+	aros)
+		basic_machine=i386-pc
+		os=-aros
+		;;
+	aux)
+		basic_machine=m68k-apple
+		os=-aux
+		;;
+	balance)
+		basic_machine=ns32k-sequent
+		os=-dynix
+		;;
+	blackfin)
+		basic_machine=bfin-unknown
+		os=-linux
+		;;
+	blackfin-*)
+		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	c90)
+		basic_machine=c90-cray
+		os=-unicos
+		;;
+        cegcc)
+		basic_machine=arm-unknown
+		os=-cegcc
+		;;
+	convex-c1)
+		basic_machine=c1-convex
+		os=-bsd
+		;;
+	convex-c2)
+		basic_machine=c2-convex
+		os=-bsd
+		;;
+	convex-c32)
+		basic_machine=c32-convex
+		os=-bsd
+		;;
+	convex-c34)
+		basic_machine=c34-convex
+		os=-bsd
+		;;
+	convex-c38)
+		basic_machine=c38-convex
+		os=-bsd
+		;;
+	cray | j90)
+		basic_machine=j90-cray
+		os=-unicos
+		;;
+	craynv)
+		basic_machine=craynv-cray
+		os=-unicosmp
+		;;
+	cr16)
+		basic_machine=cr16-unknown
+		os=-elf
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	crisv32 | crisv32-* | etraxfs*)
+		basic_machine=crisv32-axis
+		;;
+	cris | cris-* | etrax*)
+		basic_machine=cris-axis
+		;;
+	crx)
+		basic_machine=crx-unknown
+		os=-elf
+		;;
+	da30 | da30-*)
+		basic_machine=m68k-da30
+		;;
+	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+		basic_machine=mips-dec
+		;;
+	decsystem10* | dec10*)
+		basic_machine=pdp10-dec
+		os=-tops10
+		;;
+	decsystem20* | dec20*)
+		basic_machine=pdp10-dec
+		os=-tops20
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		basic_machine=m68k-motorola
+		;;
+	delta88)
+		basic_machine=m88k-motorola
+		os=-sysv3
+		;;
+	dicos)
+		basic_machine=i686-pc
+		os=-dicos
+		;;
+	djgpp)
+		basic_machine=i586-pc
+		os=-msdosdjgpp
+		;;
+	dpx20 | dpx20-*)
+		basic_machine=rs6000-bull
+		os=-bosx
+		;;
+	dpx2* | dpx2*-bull)
+		basic_machine=m68k-bull
+		os=-sysv3
+		;;
+	ebmon29k)
+		basic_machine=a29k-amd
+		os=-ebmon
+		;;
+	elxsi)
+		basic_machine=elxsi-elxsi
+		os=-bsd
+		;;
+	encore | umax | mmax)
+		basic_machine=ns32k-encore
+		;;
+	es1800 | OSE68k | ose68k | ose | OSE)
+		basic_machine=m68k-ericsson
+		os=-ose
+		;;
+	fx2800)
+		basic_machine=i860-alliant
+		;;
+	genix)
+		basic_machine=ns32k-ns
+		;;
+	gmicro)
+		basic_machine=tron-gmicro
+		os=-sysv
+		;;
+	go32)
+		basic_machine=i386-pc
+		os=-go32
+		;;
+	h3050r* | hiux*)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	h8300hms)
+		basic_machine=h8300-hitachi
+		os=-hms
+		;;
+	h8300xray)
+		basic_machine=h8300-hitachi
+		os=-xray
+		;;
+	h8500hms)
+		basic_machine=h8500-hitachi
+		os=-hms
+		;;
+	harris)
+		basic_machine=m88k-harris
+		os=-sysv3
+		;;
+	hp300-*)
+		basic_machine=m68k-hp
+		;;
+	hp300bsd)
+		basic_machine=m68k-hp
+		os=-bsd
+		;;
+	hp300hpux)
+		basic_machine=m68k-hp
+		os=-hpux
+		;;
+	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		basic_machine=m68000-hp
+		;;
+	hp9k3[2-9][0-9])
+		basic_machine=m68k-hp
+		;;
+	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k78[0-9] | hp78[0-9])
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][13679] | hp8[0-9][13679])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hppa-next)
+		os=-nextstep3
+		;;
+	hppaosf)
+		basic_machine=hppa1.1-hp
+		os=-osf
+		;;
+	hppro)
+		basic_machine=hppa1.1-hp
+		os=-proelf
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+	i*86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv32
+		;;
+	i*86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv4
+		;;
+	i*86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv
+		;;
+	i*86sol2)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-solaris2
+		;;
+	i386mach)
+		basic_machine=i386-mach
+		os=-mach
+		;;
+	i386-vsta | vsta)
+		basic_machine=i386-unknown
+		os=-vsta
+		;;
+	iris | iris4d)
+		basic_machine=mips-sgi
+		case $os in
+		    -irix*)
+			;;
+		    *)
+			os=-irix4
+			;;
+		esac
+		;;
+	isi68 | isi)
+		basic_machine=m68k-isi
+		os=-sysv
+		;;
+	m68knommu)
+		basic_machine=m68k-unknown
+		os=-linux
+		;;
+	m68knommu-*)
+		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	m88k-omron*)
+		basic_machine=m88k-omron
+		;;
+	magnum | m3230)
+		basic_machine=mips-mips
+		os=-sysv
+		;;
+	merlin)
+		basic_machine=ns32k-utek
+		os=-sysv
+		;;
+	mingw32)
+		basic_machine=i386-pc
+		os=-mingw32
+		;;
+	mingw32ce)
+		basic_machine=arm-unknown
+		os=-mingw32ce
+		;;
+	miniframe)
+		basic_machine=m68000-convergent
+		;;
+	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+	mips3*-*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	monitor)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	morphos)
+		basic_machine=powerpc-unknown
+		os=-morphos
+		;;
+	msdos)
+		basic_machine=i386-pc
+		os=-msdos
+		;;
+	ms1-*)
+		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+		;;
+	mvs)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	netbsd386)
+		basic_machine=i386-unknown
+		os=-netbsd
+		;;
+	netwinder)
+		basic_machine=armv4l-rebel
+		os=-linux
+		;;
+	news | news700 | news800 | news900)
+		basic_machine=m68k-sony
+		os=-newsos
+		;;
+	news1000)
+		basic_machine=m68030-sony
+		os=-newsos
+		;;
+	news-3600 | risc-news)
+		basic_machine=mips-sony
+		os=-newsos
+		;;
+	necv70)
+		basic_machine=v70-nec
+		os=-sysv
+		;;
+	next | m*-next )
+		basic_machine=m68k-next
+		case $os in
+		    -nextstep* )
+			;;
+		    -ns2*)
+		      os=-nextstep2
+			;;
+		    *)
+		      os=-nextstep3
+			;;
+		esac
+		;;
+	nh3000)
+		basic_machine=m68k-harris
+		os=-cxux
+		;;
+	nh[45]000)
+		basic_machine=m88k-harris
+		os=-cxux
+		;;
+	nindy960)
+		basic_machine=i960-intel
+		os=-nindy
+		;;
+	mon960)
+		basic_machine=i960-intel
+		os=-mon960
+		;;
+	nonstopux)
+		basic_machine=mips-compaq
+		os=-nonstopux
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	nsr-tandem)
+		basic_machine=nsr-tandem
+		;;
+	op50n-* | op60c-*)
+		basic_machine=hppa1.1-oki
+		os=-proelf
+		;;
+	openrisc | openrisc-*)
+		basic_machine=or32-unknown
+		;;
+	os400)
+		basic_machine=powerpc-ibm
+		os=-os400
+		;;
+	OSE68000 | ose68000)
+		basic_machine=m68000-ericsson
+		os=-ose
+		;;
+	os68k)
+		basic_machine=m68k-none
+		os=-os68k
+		;;
+	pa-hitachi)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	paragon)
+		basic_machine=i860-intel
+		os=-osf
+		;;
+	parisc)
+		basic_machine=hppa-unknown
+		os=-linux
+		;;
+	parisc-*)
+		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	pbd)
+		basic_machine=sparc-tti
+		;;
+	pbb)
+		basic_machine=m68k-tti
+		;;
+	pc532 | pc532-*)
+		basic_machine=ns32k-pc532
+		;;
+	pc98)
+		basic_machine=i386-pc
+		;;
+	pc98-*)
+		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium | p5 | k5 | k6 | nexgen | viac3)
+		basic_machine=i586-pc
+		;;
+	pentiumpro | p6 | 6x86 | athlon | athlon_*)
+		basic_machine=i686-pc
+		;;
+	pentiumii | pentium2 | pentiumiii | pentium3)
+		basic_machine=i686-pc
+		;;
+	pentium4)
+		basic_machine=i786-pc
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium4-*)
+		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=power-ibm
+		;;
+	ppc)	basic_machine=powerpc-unknown
+		;;
+	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppcle | powerpclittle | ppc-le | powerpc-little)
+		basic_machine=powerpcle-unknown
+		;;
+	ppcle-* | powerpclittle-*)
+		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64)	basic_machine=powerpc64-unknown
+		;;
+	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+		basic_machine=powerpc64le-unknown
+		;;
+	ppc64le-* | powerpc64little-*)
+		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	pw32)
+		basic_machine=i586-unknown
+		os=-pw32
+		;;
+	rdos)
+		basic_machine=i386-pc
+		os=-rdos
+		;;
+	rom68k)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	rm[46]00)
+		basic_machine=mips-siemens
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	s390 | s390-*)
+		basic_machine=s390-ibm
+		;;
+	s390x | s390x-*)
+		basic_machine=s390x-ibm
+		;;
+	sa29200)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	sb1)
+		basic_machine=mipsisa64sb1-unknown
+		;;
+	sb1el)
+		basic_machine=mipsisa64sb1el-unknown
+		;;
+	sde)
+		basic_machine=mipsisa32-sde
+		os=-elf
+		;;
+	sei)
+		basic_machine=mips-sei
+		os=-seiux
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sh5el)
+		basic_machine=sh5le-unknown
+		;;
+	sh64)
+		basic_machine=sh64-unknown
+		;;
+	sparclite-wrs | simso-wrs)
+		basic_machine=sparclite-wrs
+		os=-vxworks
+		;;
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
+		;;
+	spur)
+		basic_machine=spur-unknown
+		;;
+	st2000)
+		basic_machine=m68k-tandem
+		;;
+	stratus)
+		basic_machine=i860-stratus
+		os=-sysv4
+		;;
+	sun2)
+		basic_machine=m68000-sun
+		;;
+	sun2os3)
+		basic_machine=m68000-sun
+		os=-sunos3
+		;;
+	sun2os4)
+		basic_machine=m68000-sun
+		os=-sunos4
+		;;
+	sun3os3)
+		basic_machine=m68k-sun
+		os=-sunos3
+		;;
+	sun3os4)
+		basic_machine=m68k-sun
+		os=-sunos4
+		;;
+	sun4os3)
+		basic_machine=sparc-sun
+		os=-sunos3
+		;;
+	sun4os4)
+		basic_machine=sparc-sun
+		os=-sunos4
+		;;
+	sun4sol2)
+		basic_machine=sparc-sun
+		os=-solaris2
+		;;
+	sun3 | sun3-*)
+		basic_machine=m68k-sun
+		;;
+	sun4)
+		basic_machine=sparc-sun
+		;;
+	sun386 | sun386i | roadrunner)
+		basic_machine=i386-sun
+		;;
+	sv1)
+		basic_machine=sv1-cray
+		os=-unicos
+		;;
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
+		;;
+	t3e)
+		basic_machine=alphaev5-cray
+		os=-unicos
+		;;
+	t90)
+		basic_machine=t90-cray
+		os=-unicos
+		;;
+	tic54x | c54x*)
+		basic_machine=tic54x-unknown
+		os=-coff
+		;;
+	tic55x | c55x*)
+		basic_machine=tic55x-unknown
+		os=-coff
+		;;
+	tic6x | c6x*)
+		basic_machine=tic6x-unknown
+		os=-coff
+		;;
+	tile*)
+		basic_machine=tile-unknown
+		os=-linux-gnu
+		;;
+	tx39)
+		basic_machine=mipstx39-unknown
+		;;
+	tx39el)
+		basic_machine=mipstx39el-unknown
+		;;
+	toad1)
+		basic_machine=pdp10-xkl
+		os=-tops20
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	tpf)
+		basic_machine=s390x-ibm
+		os=-tpf
+		;;
+	udi29k)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
+		;;
+	v810 | necv810)
+		basic_machine=v810-nec
+		os=-none
+		;;
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
+		;;
+	vms)
+		basic_machine=vax-dec
+		os=-vms
+		;;
+	vpp*|vx|vx-*)
+		basic_machine=f301-fujitsu
+		;;
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
+		;;
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
+		;;
+	vxworks29k)
+		basic_machine=a29k-wrs
+		os=-vxworks
+		;;
+	w65*)
+		basic_machine=w65-wdc
+		os=-none
+		;;
+	w89k-*)
+		basic_machine=hppa1.1-winbond
+		os=-proelf
+		;;
+	xbox)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	z8k-*-coff)
+		basic_machine=z8k-unknown
+		os=-sim
+		;;
+	z80-*-coff)
+		basic_machine=z80-unknown
+		os=-sim
+		;;
+	none)
+		basic_machine=none-none
+		os=-none
+		;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		basic_machine=hppa1.1-winbond
+		;;
+	op50n)
+		basic_machine=hppa1.1-oki
+		;;
+	op60c)
+		basic_machine=hppa1.1-oki
+		;;
+	romp)
+		basic_machine=romp-ibm
+		;;
+	mmix)
+		basic_machine=mmix-knuth
+		;;
+	rs6000)
+		basic_machine=rs6000-ibm
+		;;
+	vax)
+		basic_machine=vax-dec
+		;;
+	pdp10)
+		# there are many clones, so DEC is not a safe bet
+		basic_machine=pdp10-unknown
+		;;
+	pdp11)
+		basic_machine=pdp11-dec
+		;;
+	we32k)
+		basic_machine=we32k-att
+		;;
+	sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
+		basic_machine=sh-unknown
+		;;
+	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+		basic_machine=sparc-sun
+		;;
+	cydra)
+		basic_machine=cydra-cydrome
+		;;
+	orion)
+		basic_machine=orion-highlevel
+		;;
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	mac | mpw | mac-mpw)
+		basic_machine=m68k-apple
+		;;
+	pmac | pmac-mpw)
+		basic_machine=powerpc-apple
+		;;
+	*-unknown)
+		# Make sure to match an already-canonicalized machine name.
+		;;
+	*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+	*-digital*)
+		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+		;;
+	*-commodore*)
+		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+        # First match some system type aliases
+        # that might get confused with valid system types.
+	# -solaris* is a basic system type, with this one exception.
+	-solaris1 | -solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	-solaris)
+		os=-solaris2
+		;;
+	-svr4*)
+		os=-sysv4
+		;;
+	-unixware*)
+		os=-sysv4.2uw
+		;;
+	-gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+		;;
+	# First accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST END IN A *, to match a version number.
+	# -sysv* is not here because it comes later, after sysvr4.
+	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+	      | -kopensolaris* \
+	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+	      | -aos* | -aros* \
+	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+	      | -openbsd* | -solidbsd* \
+	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+	      | -chorusos* | -chorusrdb* | -cegcc* \
+	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	-qnx*)
+		case $basic_machine in
+		    x86-* | i*86-*)
+			;;
+		    *)
+			os=-nto$os
+			;;
+		esac
+		;;
+	-nto-qnx*)
+		;;
+	-nto*)
+		os=`echo $os | sed -e 's|nto|nto-qnx|'`
+		;;
+	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+		;;
+	-mac*)
+		os=`echo $os | sed -e 's|mac|macos|'`
+		;;
+	-linux-dietlibc)
+		os=-linux-dietlibc
+		;;
+	-linux*)
+		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+		;;
+	-sunos5*)
+		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+		;;
+	-sunos6*)
+		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+		;;
+	-opened*)
+		os=-openedition
+		;;
+        -os400*)
+		os=-os400
+		;;
+	-wince*)
+		os=-wince
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-atheos*)
+		os=-atheos
+		;;
+	-syllable*)
+		os=-syllable
+		;;
+	-386bsd)
+		os=-bsd
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	-nova*)
+		os=-rtmk-nova
+		;;
+	-ns2 )
+		os=-nextstep2
+		;;
+	-nsk*)
+		os=-nsk
+		;;
+	# Preserve the version number of sinix5.
+	-sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	-sinix*)
+		os=-sysv4
+		;;
+        -tpf*)
+		os=-tpf
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-svr4)
+		os=-sysv4
+		;;
+	-svr3)
+		os=-sysv3
+		;;
+	-sysvr4)
+		os=-sysv4
+		;;
+	# This must come after -sysvr4.
+	-sysv*)
+		;;
+	-ose*)
+		os=-ose
+		;;
+	-es1800*)
+		os=-ose
+		;;
+	-xenix)
+		os=-xenix
+		;;
+	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+		os=-mint
+		;;
+	-aros*)
+		os=-aros
+		;;
+	-kaos*)
+		os=-kaos
+		;;
+	-zvmoe)
+		os=-zvmoe
+		;;
+	-dicos*)
+		os=-dicos
+		;;
+	-none)
+		;;
+	*)
+		# Get rid of the `-' at the beginning of $os.
+		os=`echo $os | sed 's/[^-]*-//'`
+		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+		exit 1
+		;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+        score-*)
+		os=-elf
+		;;
+        spu-*)
+		os=-elf
+		;;
+	*-acorn)
+		os=-riscix1.2
+		;;
+	arm*-rebel)
+		os=-linux
+		;;
+	arm*-semi)
+		os=-aout
+		;;
+        c4x-* | tic4x-*)
+        	os=-coff
+		;;
+	# This must come before the *-dec entry.
+	pdp10-*)
+		os=-tops20
+		;;
+	pdp11-*)
+		os=-none
+		;;
+	*-dec | vax-*)
+		os=-ultrix4.2
+		;;
+	m68*-apollo)
+		os=-domain
+		;;
+	i386-sun)
+		os=-sunos4.0.2
+		;;
+	m68000-sun)
+		os=-sunos3
+		# This also exists in the configure program, but was not the
+		# default.
+		# os=-sunos4
+		;;
+	m68*-cisco)
+		os=-aout
+		;;
+        mep-*)
+		os=-elf
+		;;
+	mips*-cisco)
+		os=-elf
+		;;
+	mips*-*)
+		os=-elf
+		;;
+	or32-*)
+		os=-coff
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	*-be)
+		os=-beos
+		;;
+	*-haiku)
+		os=-haiku
+		;;
+	*-ibm)
+		os=-aix
+		;;
+    	*-knuth)
+		os=-mmixware
+		;;
+	*-wec)
+		os=-proelf
+		;;
+	*-winbond)
+		os=-proelf
+		;;
+	*-oki)
+		os=-proelf
+		;;
+	*-hp)
+		os=-hpux
+		;;
+	*-hitachi)
+		os=-hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=-sysv
+		;;
+	*-cbm)
+		os=-amigaos
+		;;
+	*-dg)
+		os=-dgux
+		;;
+	*-dolphin)
+		os=-sysv3
+		;;
+	m68k-ccur)
+		os=-rtu
+		;;
+	m88k-omron*)
+		os=-luna
+		;;
+	*-next )
+		os=-nextstep
+		;;
+	*-sequent)
+		os=-ptx
+		;;
+	*-crds)
+		os=-unos
+		;;
+	*-ns)
+		os=-genix
+		;;
+	i370-*)
+		os=-mvs
+		;;
+	*-next)
+		os=-nextstep3
+		;;
+	*-gould)
+		os=-sysv
+		;;
+	*-highlevel)
+		os=-bsd
+		;;
+	*-encore)
+		os=-bsd
+		;;
+	*-sgi)
+		os=-irix
+		;;
+	*-siemens)
+		os=-sysv4
+		;;
+	*-masscomp)
+		os=-rtu
+		;;
+	f30[01]-fujitsu | f700-fujitsu)
+		os=-uxpv
+		;;
+	*-rom68k)
+		os=-coff
+		;;
+	*-*bug)
+		os=-coff
+		;;
+	*-apple)
+		os=-macos
+		;;
+	*-atari*)
+		os=-mint
+		;;
+	*)
+		os=-none
+		;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+	*-unknown)
+		case $os in
+			-riscix*)
+				vendor=acorn
+				;;
+			-sunos*)
+				vendor=sun
+				;;
+			-aix*)
+				vendor=ibm
+				;;
+			-beos*)
+				vendor=be
+				;;
+			-hpux*)
+				vendor=hp
+				;;
+			-mpeix*)
+				vendor=hp
+				;;
+			-hiux*)
+				vendor=hitachi
+				;;
+			-unos*)
+				vendor=crds
+				;;
+			-dgux*)
+				vendor=dg
+				;;
+			-luna*)
+				vendor=omron
+				;;
+			-genix*)
+				vendor=ns
+				;;
+			-mvs* | -opened*)
+				vendor=ibm
+				;;
+			-os400*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+			-tpf*)
+				vendor=ibm
+				;;
+			-vxsim* | -vxworks* | -windiss*)
+				vendor=wrs
+				;;
+			-aux*)
+				vendor=apple
+				;;
+			-hms*)
+				vendor=hitachi
+				;;
+			-mpw* | -macos*)
+				vendor=apple
+				;;
+			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+				vendor=atari
+				;;
+			-vos*)
+				vendor=stratus
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/configure
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/configure	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/configure	(revision 24799)
@@ -0,0 +1,5256 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.68 for mpibuildcol 1.0.
+#
+# Report bugs to <jmt12@students.waikato.ac.nz>.
+#
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
+# Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test "x$CONFIG_SHELL" = x; then
+  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+"
+  as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+  exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1"
+  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1"
+  if (eval "$as_required") 2>/dev/null; then :
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  as_found=:
+  case $as_dir in #(
+	 /*)
+	   for as_base in sh bash ksh sh5; do
+	     # Try only shells that exist, to save several forks.
+	     as_shell=$as_dir/$as_base
+	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  CONFIG_SHELL=$as_shell as_have_required=yes
+		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  break 2
+fi
+fi
+	   done;;
+       esac
+  as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+  CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+      if test "x$CONFIG_SHELL" != x; then :
+  # We cannot yet assume a decent shell, so we have to provide a
+	# neutralization value for shells without unset; and this also
+	# works around shells that cannot unset nonexistent variables.
+	# Preserve -v and -x to the replacement shell.
+	BASH_ENV=/dev/null
+	ENV=/dev/null
+	(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+	export CONFIG_SHELL
+	case $- in # ((((
+	  *v*x* | *x*v* ) as_opts=-vx ;;
+	  *v* ) as_opts=-v ;;
+	  *x* ) as_opts=-x ;;
+	  * ) as_opts= ;;
+	esac
+	exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
+fi
+
+    if test x$as_have_required = xno; then :
+  $as_echo "$0: This script requires a shell more modern than all"
+  $as_echo "$0: the shells that I found on your system."
+  if test x${ZSH_VERSION+set} = xset ; then
+    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+  else
+    $as_echo "$0: Please tell bug-autoconf@gnu.org and
+$0: jmt12@students.waikato.ac.nz about your system,
+$0: including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do have one."
+  fi
+  exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+  as_lineno_1=$LINENO as_lineno_1a=$LINENO
+  as_lineno_2=$LINENO as_lineno_2a=$LINENO
+  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+	test -d "$1/.";
+      else
+	case $1 in #(
+	-*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='mpibuildcol'
+PACKAGE_TARNAME='mpibuildcol'
+PACKAGE_VERSION='1.0'
+PACKAGE_STRING='mpibuildcol 1.0'
+PACKAGE_BUGREPORT='jmt12@students.waikato.ac.nz'
+PACKAGE_URL=''
+
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIBOBJS
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+ac_ct_CC
+CFLAGS
+CC
+am__fastdepCXX_FALSE
+am__fastdepCXX_TRUE
+CXXDEPMODE
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__quote
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CXX
+CPPFLAGS
+LDFLAGS
+CXXFLAGS
+CXX
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_dependency_tracking
+'
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CXX
+CXXFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CCC
+CC
+CFLAGS'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *=)   ac_optarg= ;;
+  *)    ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    case $ac_envvar in #(
+      '' | [0-9]* | *[!_$as_cr_alnum]* )
+      as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+    esac
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+  case $enable_option_checking in
+    no) ;;
+    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+  esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
+		datadir sysconfdir sharedstatedir localstatedir includedir \
+		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+		libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  # Remove trailing slashes.
+  case $ac_val in
+    */ )
+      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+      eval $ac_var=\$ac_val;;
+  esac
+  # Be sure to have absolute directory names.
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used" >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_myself" : 'X\(//\)[^/]' \| \
+	 X"$as_myself" : 'X\(//\)$' \| \
+	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+	pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures mpibuildcol 1.0 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking ...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR            user executables [EPREFIX/bin]
+  --sbindir=DIR           system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR        program executables [EPREFIX/libexec]
+  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --libdir=DIR            object code libraries [EPREFIX/lib]
+  --includedir=DIR        C header files [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
+  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR           info documentation [DATAROOTDIR/info]
+  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR            man documentation [DATAROOTDIR/man]
+  --docdir=DIR            documentation root [DATAROOTDIR/doc/mpibuildcol]
+  --htmldir=DIR           html documentation [DOCDIR]
+  --dvidir=DIR            dvi documentation [DOCDIR]
+  --pdfdir=DIR            pdf documentation [DOCDIR]
+  --psdir=DIR             ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of mpibuildcol 1.0:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-option-checking  ignore unrecognized --enable/--with options
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors
+
+Some influential environment variables:
+  CXX         C++ compiler command
+  CXXFLAGS    C++ compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  CC          C compiler command
+  CFLAGS      C compiler flags
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <jmt12@students.waikato.ac.nz>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" ||
+      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+      continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+mpibuildcol configure 1.0
+generated by GNU Autoconf 2.68
+
+Copyright (C) 2010 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_cxx_try_compile LINENO
+# ----------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_compile
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_cxx_try_link LINENO
+# -------------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_link
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by mpibuildcol $as_me 1.0, which was
+generated by GNU Autoconf 2.68.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    $as_echo "PATH: $as_dir"
+  done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+    2)
+      as_fn_append ac_configure_args1 " '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+	ac_must_keep_next=false # Got value, back to normal.
+      else
+	case $ac_arg in
+	  *=* | --config-cache | -C | -disable-* | --disable-* \
+	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+	  | -with-* | --with-* | -without-* | --without-* | --x)
+	    case "$ac_configure_args0 " in
+	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+	    esac
+	    ;;
+	  -* ) ac_must_keep_next=true ;;
+	esac
+      fi
+      as_fn_append ac_configure_args " '$ac_arg'"
+      ;;
+    esac
+  done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+	"s/'\''/'\''\\\\'\'''\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      $as_echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=\$$ac_var
+	case $ac_val in
+	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+	esac
+	$as_echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      $as_echo "$as_me: caught signal $ac_signal"
+    $as_echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+  # We do not want a PATH search for config.site.
+  case $CONFIG_SITE in #((
+    -*)  ac_site_file1=./$CONFIG_SITE;;
+    */*) ac_site_file1=$CONFIG_SITE;;
+    *)   ac_site_file1=./$CONFIG_SITE;;
+  esac
+elif test "x$prefix" != xNONE; then
+  ac_site_file1=$prefix/share/config.site
+  ac_site_file2=$prefix/etc/config.site
+else
+  ac_site_file1=$ac_default_prefix/share/config.site
+  ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+  test "x$ac_site_file" = xNONE && continue
+  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file" \
+      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special files
+  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
+  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+	# differences in whitespace do not lead to failure.
+	ac_old_val_w=`echo x $ac_old_val`
+	ac_new_val_w=`echo x $ac_new_val`
+	if test "$ac_old_val_w" != "$ac_new_val_w"; then
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	  ac_cache_corrupted=:
+	else
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+	  eval $ac_var=\$ac_old_val
+	fi
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
+$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
+$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+am__api_version='1.11'
+
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+  if test -f "$ac_dir/install-sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f "$ac_dir/install.sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if ${ac_cv_path_install+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+  ./ | .// | /[cC]/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    rm -rf conftest.one conftest.two conftest.dir
+	    echo one > conftest.one
+	    echo two > conftest.two
+	    mkdir conftest.dir
+	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+	      test -s conftest.one && test -s conftest.two &&
+	      test -s conftest.dir/conftest.one &&
+	      test -s conftest.dir/conftest.two
+	    then
+	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	      break 3
+	    fi
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+
+  done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+$as_echo_n "checking whether build environment is sane... " >&6; }
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[\\\"\#\$\&\'\`$am_lf]*)
+    as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+  *[\\\"\#\$\&\'\`$am_lf\ \	]*)
+    as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
+esac
+
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t "$srcdir/configure" conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$*" != "X $srcdir/configure conftest.file" \
+      && test "$*" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" "$LINENO" 5
+   fi
+
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   as_fn_error $? "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+test "$program_prefix" != NONE &&
+  program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+  if ${ac_cv_path_mkdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in mkdir gmkdir; do
+	 for ac_exec_ext in '' $ac_executable_extensions; do
+	   { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
+	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+	     'mkdir (GNU coreutils) '* | \
+	     'mkdir (coreutils) '* | \
+	     'mkdir (fileutils) '4.1*)
+	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+	       break 3;;
+	   esac
+	 done
+       done
+  done
+IFS=$as_save_IFS
+
+fi
+
+  test -d ./--version && rmdir ./--version
+  if test "${ac_cv_path_mkdir+set}" = set; then
+    MKDIR_P="$ac_cv_path_mkdir -p"
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for MKDIR_P within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    MKDIR_P="$ac_install_sh -d"
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+mkdir_p="$MKDIR_P"
+case $mkdir_p in
+  [\\/$]* | ?:[\\/]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AWK+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_AWK="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$AWK" && break
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  SET_MAKE=
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  am__isrc=' -I$(srcdir)'
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='mpibuildcol'
+ VERSION='1.0'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+
+# Checks for programs.
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+  if test -n "$CCC"; then
+    CXX=$CCC
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in mpic++
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
+$as_echo "$CXX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CXX" && break
+  done
+fi
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in mpic++
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CXX="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
+$as_echo "$ac_ct_CXX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CXX" && break
+done
+
+  if test "x$ac_ct_CXX" = x; then
+    CXX="g++"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CXX=$ac_ct_CXX
+  fi
+fi
+
+  fi
+fi
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5
+$as_echo_n "checking whether the C++ compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+	;;
+    [ab].out )
+	# We found the default executable, but exeext='' is most
+	# certainly right.
+	break;;
+    *.* )
+	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+	then :; else
+	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	fi
+	# We set ac_cv_exeext here because the later test for it is not
+	# safe: cross compilers may not add the suffix if given an `-o'
+	# argument, so we may need to know it at that point already.
+	# Even if this section looks crufty: it has the advantage of
+	# actually working.
+	break;;
+    * )
+	break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+if test -z "$ac_file"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C++ compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5
+$as_echo_n "checking for C++ compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	  break;;
+    * ) break;;
+  esac
+done
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+  { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+  if { ac_try='./conftest$ac_cv_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C++ compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+    fi
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
+$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
+if ${ac_cv_cxx_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
+$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GXX=yes
+else
+  GXX=
+fi
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
+$as_echo_n "checking whether $CXX accepts -g... " >&6; }
+if ${ac_cv_prog_cxx_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+   ac_cxx_werror_flag=yes
+   ac_cv_prog_cxx_g=no
+   CXXFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_cv_prog_cxx_g=yes
+else
+  CXXFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+else
+  ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+	 CXXFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_cv_prog_cxx_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
+$as_echo "$ac_cv_prog_cxx_g" >&6; }
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
+  else
+    CXXFLAGS="-g"
+  fi
+else
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
+  else
+    CXXFLAGS=
+  fi
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
+$as_echo_n "checking for style of include used by $am_make... " >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
+$as_echo "$_am_result" >&6; }
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then :
+  enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+
+depcc="$CXX"  am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CXX_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CXX_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CXX_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+  am__fastdepCXX_TRUE=
+  am__fastdepCXX_FALSE='#'
+else
+  am__fastdepCXX_TRUE='#'
+  am__fastdepCXX_FALSE=
+fi
+
+
+
+# Checks for libraries.
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+else
+  CFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CC"   am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for MPI_Init in -lmpi" >&5
+$as_echo_n "checking for MPI_Init in -lmpi... " >&6; }
+if ${ac_cv_lib_mpi_MPI_Init+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lmpi  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char MPI_Init ();
+int
+main ()
+{
+return MPI_Init ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_mpi_MPI_Init=yes
+else
+  ac_cv_lib_mpi_MPI_Init=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mpi_MPI_Init" >&5
+$as_echo "$ac_cv_lib_mpi_MPI_Init" >&6; }
+if test "x$ac_cv_lib_mpi_MPI_Init" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBMPI 1
+_ACEOF
+
+  LIBS="-lmpi $LIBS"
+
+fi
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+SAVED_LIBS=$LIBS
+LIBS="$LIBS -ltinyxml"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for TiXmlDocument in -ltinyxml" >&5
+$as_echo_n "checking for TiXmlDocument in -ltinyxml... " >&6; }
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <tinyxml.h>
+int
+main ()
+{
+TiXmlDocument dummy
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+  SAVED_LIBS="$SAVED_LIBS -ltinyxml" HAVE_TINYXML=1 TINYXML_RESULT="yes"
+else
+  as_fn_error $? "tinyxml is not installed." "$LINENO" 5
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $TINYXML_RESULT" >&5
+$as_echo "$TINYXML_RESULT" >&6; }
+LIBS=$SAVED_LIBS
+
+# Checks for header files.
+
+# Checks for typedefs, structures, and compiler characteristics.
+
+# Checks for library functions.
+
+# Completion
+ac_config_files="$ac_config_files Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes: double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \.
+      sed -n \
+	"s/'/'\\\\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    if test "x$cache_file" != "x/dev/null"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+      if test ! -f "$cache_file" || test -h "$cache_file"; then
+	cat confcache >"$cache_file"
+      else
+        case $cache_file in #(
+        */* | ?:*)
+	  mv -f confcache "$cache_file"$$ &&
+	  mv -f "$cache_file"$$ "$cache_file" ;; #(
+        *)
+	  mv -f confcache "$cache_file" ;;
+	esac
+      fi
+    fi
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+#
+# If the first sed substitution is executed (which looks for macros that
+# take arguments), then branch to the quote section.  Otherwise,
+# look for a macro that doesn't take arguments.
+ac_script='
+:mline
+/\\$/{
+ N
+ s,\\\n,,
+ b mline
+}
+t clear
+:clear
+s/^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 (][^	 (]*([^)]*)\)[	 ]*\(.*\)/-D\1=\2/g
+t quote
+s/^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 ][^	 ]*\)[	 ]*\(.*\)/-D\1=\2/g
+t quote
+b any
+:quote
+s/[	 `~#$^&*(){}\\|;'\''"<>?]/\\&/g
+s/\[/\\&/g
+s/\]/\\&/g
+s/\$/$$/g
+H
+:any
+${
+	g
+	s/^\n//
+	s/\n/ /g
+	p
+}
+'
+DEFS=`sed -n "$ac_script" confdefs.h`
+
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+ if test -n "$EXEEXT"; then
+  am__EXEEXT_TRUE=
+  am__EXEEXT_FALSE='#'
+else
+  am__EXEEXT_TRUE='#'
+  am__EXEEXT_FALSE=
+fi
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+	test -d "$1/.";
+      else
+	case $1 in #(
+	-*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by mpibuildcol $as_me 1.0, which was
+generated by GNU Autoconf 2.68.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration.  Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+      --config     print configuration, then exit
+  -q, --quiet, --silent
+                   do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+      --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+
+Configuration files:
+$config_files
+
+Configuration commands:
+$config_commands
+
+Report bugs to <jmt12@students.waikato.ac.nz>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+mpibuildcol config.status 1.0
+configured by $0, generated by GNU Autoconf 2.68,
+  with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2010 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=?*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  --*=)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    $as_echo "$ac_cs_version"; exit ;;
+  --config | --confi | --conf | --con | --co | --c )
+    $as_echo "$ac_cs_config"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    '') as_fn_error $? "missing file argument" ;;
+    esac
+    as_fn_append CONFIG_FILES " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --he | --h |  --help | --hel | -h )
+    $as_echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+  *) as_fn_append ac_config_targets " $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  shift
+  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+  CONFIG_SHELL='$SHELL'
+  export CONFIG_SHELL
+  exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+
+  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp= ac_tmp=
+  trap 'exit_status=$?
+  : "${ac_tmp:=$tmp}"
+  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+  trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+  eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+  ac_cs_awk_cr='\\r'
+else
+  ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+  echo "cat >conf$$subs.awk <<_ACEOF" &&
+  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+  echo "_ACEOF"
+} >conf$$subs.sh ||
+  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  . ./conf$$subs.sh ||
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+  if test $ac_delim_n = $ac_delim_num; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+  N
+  s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+  for (key in S) S_is_set[key] = 1
+  FS = ""
+
+}
+{
+  line = $ 0
+  nfields = split(line, field, "@")
+  substed = 0
+  len = length(field[1])
+  for (i = 2; i < nfields; i++) {
+    key = field[i]
+    keylen = length(key)
+    if (S_is_set[key]) {
+      value = S[key]
+      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+      len += length(value) + length(field[++i])
+      substed = 1
+    } else
+      len += 1 + keylen
+  }
+
+  print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+  cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=[	 ]*/{
+h
+s///
+s/^/:/
+s/[	 ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[	 ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[	 ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+
+eval set X "  :F $CONFIG_FILES      :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$ac_tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
+	 # because $ac_f cannot contain `:'.
+	 test -f "$ac_f" ||
+	   case $ac_f in
+	   [\\/$]*) false;;
+	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+	   esac ||
+	   as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+      esac
+      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+      as_fn_append ac_file_inputs " '$ac_f'"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input='Generated from '`
+	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+	`' by configure.'
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+    fi
+    # Neutralize special characters interpreted by sed in replacement strings.
+    case $configure_input in #(
+    *\&* | *\|* | *\\* )
+       ac_sed_conf_input=`$as_echo "$configure_input" |
+       sed 's/[\\\\&|]/\\\\&/g'`;; #(
+    *) ac_sed_conf_input=$configure_input;;
+    esac
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$ac_tmp/stdin" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  as_dir="$ac_dir"; as_fn_mkdir_p
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+  ac_MKDIR_P=$MKDIR_P
+  case $MKDIR_P in
+  [\\/$]* | ?:[\\/]* ) ;;
+  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+  esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+  s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+  >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' \
+      "$ac_tmp/out"`; test -z "$ac_out"; } &&
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&2;}
+
+  rm -f "$ac_tmp/stdin"
+  case $ac_file in
+  -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+  *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+  esac \
+  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+
+
+  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+  esac
+
+
+  case $ac_file$ac_mode in
+    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named `Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`$as_dirname -- "$mf" ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$mf" : 'X\(//\)[^/]' \| \
+	 X"$mf" : 'X\(//\)$' \| \
+	 X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running `make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`$as_dirname -- "$file" ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$file" : 'X\(//\)[^/]' \| \
+	 X"$file" : 'X\(//\)$' \| \
+	 X"$file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      as_dir=$dirpart/$fdir; as_fn_mkdir_p
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+ ;;
+
+  esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/configure.ac
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/configure.ac	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/configure.ac	(revision 24799)
@@ -0,0 +1,34 @@
+#                                               -*- Autoconf -*-
+# Process this file with autoconf to produce a configure script.
+AC_PREREQ(2.59)
+AC_INIT([mpibuildcol], [1.0], [jmt12@students.waikato.ac.nz])
+AM_INIT_AUTOMAKE
+AC_CANONICAL_HOST
+
+# Checks for programs.
+AC_PROG_CXX([mpic++])
+
+# Checks for libraries.
+AC_CHECK_LIB([mpi],[MPI_Init])
+
+AC_LANG(C++)
+SAVED_LIBS=$LIBS
+LIBS="$LIBS -ltinyxml"
+AC_MSG_CHECKING([for TiXmlDocument in -ltinyxml])
+AC_LINK_IFELSE(
+        [AC_LANG_PROGRAM([#include <tinyxml.h>],
+        [TiXmlDocument dummy])],
+        [SAVED_LIBS="$SAVED_LIBS -ltinyxml"] [HAVE_TINYXML=1] [TINYXML_RESULT="yes"],
+        [AC_MSG_ERROR([tinyxml is not installed.])])
+AC_MSG_RESULT([$TINYXML_RESULT])
+LIBS=$SAVED_LIBS
+
+# Checks for header files.
+
+# Checks for typedefs, structures, and compiler characteristics.
+
+# Checks for library functions.
+
+# Completion
+AC_CONFIG_FILES([Makefile])
+AC_OUTPUT
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/depcomp
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/depcomp	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/depcomp	(revision 24799)
@@ -0,0 +1,630 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2009-04-28.21; # UTC
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free
+# Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+case $1 in
+  '')
+     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+  depmode     Dependency tracking mode.
+  source      Source file read by `PROGRAMS ARGS'.
+  object      Object file output by `PROGRAMS ARGS'.
+  DEPDIR      directory where to store dependencies.
+  depfile     Dependency file to output.
+  tmpdepfile  Temporary file to use when outputing dependencies.
+  libtool     Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "depcomp $scriptversion"
+    exit $?
+    ;;
+esac
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+  echo "depcomp: Variables source, object and depmode must be set" 1>&2
+  exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Some modes work just like other modes, but use different flags.  We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write.  Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+  # HP compiler uses -M and no extra arg.
+  gccflag=-M
+  depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+   # This is just like dashmstdout with a different argument.
+   dashmflag=-xM
+   depmode=dashmstdout
+fi
+
+cygpath_u="cygpath -u -f -"
+if test "$depmode" = msvcmsys; then
+   # This is just like msvisualcpp but w/o cygpath translation.
+   # Just convert the backslash-escaped backslashes to single forward
+   # slashes to satisfy depend.m4
+   cygpath_u="sed s,\\\\\\\\,/,g"
+   depmode=msvisualcpp
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff.  Hmm.
+## Unfortunately, FreeBSD c89 acceptance of flags depends upon
+## the command line argument order; so add the flags where they
+## appear in depend2.am.  Note that the slowdown incurred here
+## affects only configure: in makefiles, %FASTDEP% shortcuts this.
+  for arg
+  do
+    case $arg in
+    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
+    *)  set fnord "$@" "$arg" ;;
+    esac
+    shift # fnord
+    shift # $arg
+  done
+  "$@"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  mv "$tmpdepfile" "$depfile"
+  ;;
+
+gcc)
+## There are various ways to get dependency output from gcc.  Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+##   up in a subdir.  Having to rename by hand is ugly.
+##   (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+##   -MM, not -M (despite what the docs say).
+## - Using -M directly means running the compiler twice (even worse
+##   than renaming).
+  if test -z "$gccflag"; then
+    gccflag=-MD,
+  fi
+  "$@" -Wp,"$gccflag$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+## The second -e expression handles DOS-style file names with drive letters.
+  sed -e 's/^[^:]*: / /' \
+      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the `deleted header file' problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header).  We avoid this by adding
+## dummy dependencies for each header file.  Too bad gcc doesn't do
+## this for us directly.
+  tr ' ' '
+' < "$tmpdepfile" |
+## Some versions of gcc put a space before the `:'.  On the theory
+## that the space means something, we add a space to the output as
+## well.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+sgi)
+  if test "$libtool" = yes; then
+    "$@" "-Wp,-MDupdate,$tmpdepfile"
+  else
+    "$@" -MDupdate "$tmpdepfile"
+  fi
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+
+  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
+    echo "$object : \\" > "$depfile"
+
+    # Clip off the initial element (the dependent).  Don't try to be
+    # clever and replace this with sed code, as IRIX sed won't handle
+    # lines with more than a fixed number of characters (4096 in
+    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
+    # the IRIX cc adds comments like `#:fec' to the end of the
+    # dependency line.
+    tr ' ' '
+' < "$tmpdepfile" \
+    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
+    tr '
+' ' ' >> "$depfile"
+    echo >> "$depfile"
+
+    # The second pass generates a dummy entry for each header file.
+    tr ' ' '
+' < "$tmpdepfile" \
+   | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+   >> "$depfile"
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+aix)
+  # The C for AIX Compiler uses -M and outputs the dependencies
+  # in a .u file.  In older versions, this file always lives in the
+  # current directory.  Also, the AIX compiler puts `$object:' at the
+  # start of each line; $object doesn't have directory information.
+  # Version 6 uses the directory in both cases.
+  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+  test "x$dir" = "x$object" && dir=
+  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$base.u
+    tmpdepfile3=$dir.libs/$base.u
+    "$@" -Wc,-M
+  else
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$dir$base.u
+    tmpdepfile3=$dir$base.u
+    "$@" -M
+  fi
+  stat=$?
+
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    # Each line is of the form `foo.o: dependent.h'.
+    # Do two passes, one to just change these to
+    # `$object: dependent.h' and one to simply `dependent.h:'.
+    sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+    # That's a tab and a space in the [].
+    sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+icc)
+  # Intel's C compiler understands `-MD -MF file'.  However on
+  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
+  # ICC 7.0 will fill foo.d with something like
+  #    foo.o: sub/foo.c
+  #    foo.o: sub/foo.h
+  # which is wrong.  We want:
+  #    sub/foo.o: sub/foo.c
+  #    sub/foo.o: sub/foo.h
+  #    sub/foo.c:
+  #    sub/foo.h:
+  # ICC 7.1 will output
+  #    foo.o: sub/foo.c sub/foo.h
+  # and will wrap long lines using \ :
+  #    foo.o: sub/foo.c ... \
+  #     sub/foo.h ... \
+  #     ...
+
+  "$@" -MD -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each line is of the form `foo.o: dependent.h',
+  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+  # Do two passes, one to just change these to
+  # `$object: dependent.h' and one to simply `dependent.h:'.
+  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
+    sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp2)
+  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
+  # compilers, which have integrated preprocessors.  The correct option
+  # to use with these is +Maked; it writes dependencies to a file named
+  # 'foo.d', which lands next to the object file, wherever that
+  # happens to be.
+  # Much of this is similar to the tru64 case; see comments there.
+  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+  test "x$dir" = "x$object" && dir=
+  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir.libs/$base.d
+    "$@" -Wc,+Maked
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    "$@" +Maked
+  fi
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+     rm -f "$tmpdepfile1" "$tmpdepfile2"
+     exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
+    # Add `dependent.h:' lines.
+    sed -ne '2,${
+	       s/^ *//
+	       s/ \\*$//
+	       s/$/:/
+	       p
+	     }' "$tmpdepfile" >> "$depfile"
+  else
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile" "$tmpdepfile2"
+  ;;
+
+tru64)
+   # The Tru64 compiler uses -MD to generate dependencies as a side
+   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
+   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+   # dependencies in `foo.d' instead, so we check for that too.
+   # Subdirectories are respected.
+   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+   test "x$dir" = "x$object" && dir=
+   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+
+   if test "$libtool" = yes; then
+      # With Tru64 cc, shared objects can also be used to make a
+      # static library.  This mechanism is used in libtool 1.4 series to
+      # handle both shared and static libraries in a single compilation.
+      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
+      #
+      # With libtool 1.5 this exception was removed, and libtool now
+      # generates 2 separate objects for the 2 libraries.  These two
+      # compilations output dependencies in $dir.libs/$base.o.d and
+      # in $dir$base.o.d.  We have to check for both files, because
+      # one of the two compilations can be disabled.  We should prefer
+      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+      # automatically cleaned when .libs/ is deleted, while ignoring
+      # the former would cause a distcleancheck panic.
+      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
+      tmpdepfile2=$dir$base.o.d          # libtool 1.5
+      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
+      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
+      "$@" -Wc,-MD
+   else
+      tmpdepfile1=$dir$base.o.d
+      tmpdepfile2=$dir$base.d
+      tmpdepfile3=$dir$base.d
+      tmpdepfile4=$dir$base.d
+      "$@" -MD
+   fi
+
+   stat=$?
+   if test $stat -eq 0; then :
+   else
+      rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+      exit $stat
+   fi
+
+   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+   do
+     test -f "$tmpdepfile" && break
+   done
+   if test -f "$tmpdepfile"; then
+      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+      # That's a tab and a space in the [].
+      sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+   else
+      echo "#dummy" > "$depfile"
+   fi
+   rm -f "$tmpdepfile"
+   ;;
+
+#nosideeffect)
+  # This comment above is used by automake to tell side-effect
+  # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout, regardless of -o.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove `-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  test -z "$dashmflag" && dashmflag=-M
+  # Require at least two characters before searching for `:'
+  # in the target name.  This is to cope with DOS-style filenames:
+  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
+  "$@" $dashmflag |
+    sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  tr ' ' '
+' < "$tmpdepfile" | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+dashXmstdout)
+  # This case only exists to satisfy depend.m4.  It is never actually
+  # run, as this mode is specially recognized in the preamble.
+  exit 1
+  ;;
+
+makedepend)
+  "$@" || exit $?
+  # Remove any Libtool call
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+  # X makedepend
+  shift
+  cleared=no eat=no
+  for arg
+  do
+    case $cleared in
+    no)
+      set ""; shift
+      cleared=yes ;;
+    esac
+    if test $eat = yes; then
+      eat=no
+      continue
+    fi
+    case "$arg" in
+    -D*|-I*)
+      set fnord "$@" "$arg"; shift ;;
+    # Strip any option that makedepend may not understand.  Remove
+    # the object too, otherwise makedepend will parse it as a source file.
+    -arch)
+      eat=yes ;;
+    -*|$object)
+      ;;
+    *)
+      set fnord "$@" "$arg"; shift ;;
+    esac
+  done
+  obj_suffix=`echo "$object" | sed 's/^.*\././'`
+  touch "$tmpdepfile"
+  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  sed '1,2d' "$tmpdepfile" | tr ' ' '
+' | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile" "$tmpdepfile".bak
+  ;;
+
+cpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove `-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  "$@" -E |
+    sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+       -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
+    sed '$ s: \\$::' > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  cat < "$tmpdepfile" >> "$depfile"
+  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvisualcpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  IFS=" "
+  for arg
+  do
+    case "$arg" in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+	set fnord "$@"
+	shift
+	shift
+	;;
+    *)
+	set fnord "$@" "$arg"
+	shift
+	shift
+	;;
+    esac
+  done
+  "$@" -E 2>/dev/null |
+  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::	\1 \\:p' >> "$depfile"
+  echo "	" >> "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvcmsys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+none)
+  exec "$@"
+  ;;
+
+*)
+  echo "Unknown depmode $depmode" 1>&2
+  exit 1
+  ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/install-sh
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/install-sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/install-sh	(revision 24799)
@@ -0,0 +1,520 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2009-04-28.21; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+nl='
+'
+IFS=" ""	$nl"
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit=${DOITPROG-}
+if test -z "$doit"; then
+  doit_exec=exec
+else
+  doit_exec=$doit
+fi
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_glob='?'
+initialize_posix_glob='
+  test "$posix_glob" != "?" || {
+    if (set -f) 2>/dev/null; then
+      posix_glob=
+    else
+      posix_glob=:
+    fi
+  }
+'
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+no_target_directory=
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+     --help     display this help and exit.
+     --version  display version info and exit.
+
+  -c            (ignored)
+  -C            install only if different (preserve the last data modification time)
+  -d            create directories instead of installing files.
+  -g GROUP      $chgrpprog installed files to GROUP.
+  -m MODE       $chmodprog installed files to MODE.
+  -o USER       $chownprog installed files to USER.
+  -s            $stripprog installed files.
+  -t DIRECTORY  install into DIRECTORY.
+  -T            report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+  RMPROG STRIPPROG
+"
+
+while test $# -ne 0; do
+  case $1 in
+    -c) ;;
+
+    -C) copy_on_change=true;;
+
+    -d) dir_arg=true;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+	shift;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) mode=$2
+	case $mode in
+	  *' '* | *'	'* | *'
+'*	  | *'*'* | *'?'* | *'['*)
+	    echo "$0: invalid mode: $mode" >&2
+	    exit 1;;
+	esac
+	shift;;
+
+    -o) chowncmd="$chownprog $2"
+	shift;;
+
+    -s) stripcmd=$stripprog;;
+
+    -t) dst_arg=$2
+	shift;;
+
+    -T) no_target_directory=true;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    --)	shift
+	break;;
+
+    -*)	echo "$0: invalid option: $1" >&2
+	exit 1;;
+
+    *)  break;;
+  esac
+  shift
+done
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+  # When -d is used, all remaining arguments are directories to create.
+  # When -t is used, the destination is already specified.
+  # Otherwise, the last argument is the destination.  Remove it from $@.
+  for arg
+  do
+    if test -n "$dst_arg"; then
+      # $@ is not empty: it contains at least $arg.
+      set fnord "$@" "$dst_arg"
+      shift # fnord
+    fi
+    shift # arg
+    dst_arg=$arg
+  done
+fi
+
+if test $# -eq 0; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call `install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+if test -z "$dir_arg"; then
+  trap '(exit $?); exit' 1 2 13 15
+
+  # Set umask so as not to create temps with too-generous modes.
+  # However, 'strip' requires both read and write access to temps.
+  case $mode in
+    # Optimize common cases.
+    *644) cp_umask=133;;
+    *755) cp_umask=22;;
+
+    *[0-7])
+      if test -z "$stripcmd"; then
+	u_plus_rw=
+      else
+	u_plus_rw='% 200'
+      fi
+      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+    *)
+      if test -z "$stripcmd"; then
+	u_plus_rw=
+      else
+	u_plus_rw=,u+rw
+      fi
+      cp_umask=$mode$u_plus_rw;;
+  esac
+fi
+
+for src
+do
+  # Protect names starting with `-'.
+  case $src in
+    -*) src=./$src;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    dstdir=$dst
+    test -d "$dstdir"
+    dstdir_status=$?
+  else
+
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dst_arg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+
+    dst=$dst_arg
+    # Protect names starting with `-'.
+    case $dst in
+      -*) dst=./$dst;;
+    esac
+
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
+    if test -d "$dst"; then
+      if test -n "$no_target_directory"; then
+	echo "$0: $dst_arg: Is a directory" >&2
+	exit 1
+      fi
+      dstdir=$dst
+      dst=$dstdir/`basename "$src"`
+      dstdir_status=0
+    else
+      # Prefer dirname, but fall back on a substitute if dirname fails.
+      dstdir=`
+	(dirname "$dst") 2>/dev/null ||
+	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	     X"$dst" : 'X\(//\)[^/]' \| \
+	     X"$dst" : 'X\(//\)$' \| \
+	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
+	echo X"$dst" |
+	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)[^/].*/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\).*/{
+		   s//\1/
+		   q
+		 }
+		 s/.*/./; q'
+      `
+
+      test -d "$dstdir"
+      dstdir_status=$?
+    fi
+  fi
+
+  obsolete_mkdir_used=false
+
+  if test $dstdir_status != 0; then
+    case $posix_mkdir in
+      '')
+	# Create intermediate dirs using mode 755 as modified by the umask.
+	# This is like FreeBSD 'install' as of 1997-10-28.
+	umask=`umask`
+	case $stripcmd.$umask in
+	  # Optimize common cases.
+	  *[2367][2367]) mkdir_umask=$umask;;
+	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+	  *[0-7])
+	    mkdir_umask=`expr $umask + 22 \
+	      - $umask % 100 % 40 + $umask % 20 \
+	      - $umask % 10 % 4 + $umask % 2
+	    `;;
+	  *) mkdir_umask=$umask,go-w;;
+	esac
+
+	# With -d, create the new directory with the user-specified mode.
+	# Otherwise, rely on $mkdir_umask.
+	if test -n "$dir_arg"; then
+	  mkdir_mode=-m$mode
+	else
+	  mkdir_mode=
+	fi
+
+	posix_mkdir=false
+	case $umask in
+	  *[123567][0-7][0-7])
+	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
+	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+	    ;;
+	  *)
+	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+	    if (umask $mkdir_umask &&
+		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+	    then
+	      if test -z "$dir_arg" || {
+		   # Check for POSIX incompatibilities with -m.
+		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+		   # other-writeable bit of parent directory when it shouldn't.
+		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
+		   case $ls_ld_tmpdir in
+		     d????-?r-*) different_mode=700;;
+		     d????-?--*) different_mode=755;;
+		     *) false;;
+		   esac &&
+		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+		   }
+		 }
+	      then posix_mkdir=:
+	      fi
+	      rmdir "$tmpdir/d" "$tmpdir"
+	    else
+	      # Remove any dirs left behind by ancient mkdir implementations.
+	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+	    fi
+	    trap '' 0;;
+	esac;;
+    esac
+
+    if
+      $posix_mkdir && (
+	umask $mkdir_umask &&
+	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+      )
+    then :
+    else
+
+      # The umask is ridiculous, or mkdir does not conform to POSIX,
+      # or it failed possibly due to a race condition.  Create the
+      # directory the slow way, step by step, checking for races as we go.
+
+      case $dstdir in
+	/*) prefix='/';;
+	-*) prefix='./';;
+	*)  prefix='';;
+      esac
+
+      eval "$initialize_posix_glob"
+
+      oIFS=$IFS
+      IFS=/
+      $posix_glob set -f
+      set fnord $dstdir
+      shift
+      $posix_glob set +f
+      IFS=$oIFS
+
+      prefixes=
+
+      for d
+      do
+	test -z "$d" && continue
+
+	prefix=$prefix$d
+	if test -d "$prefix"; then
+	  prefixes=
+	else
+	  if $posix_mkdir; then
+	    (umask=$mkdir_umask &&
+	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+	    # Don't fail if two instances are running concurrently.
+	    test -d "$prefix" || exit 1
+	  else
+	    case $prefix in
+	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+	      *) qprefix=$prefix;;
+	    esac
+	    prefixes="$prefixes '$qprefix'"
+	  fi
+	fi
+	prefix=$prefix/
+      done
+
+      if test -n "$prefixes"; then
+	# Don't fail if two instances are running concurrently.
+	(umask $mkdir_umask &&
+	 eval "\$doit_exec \$mkdirprog $prefixes") ||
+	  test -d "$dstdir" || exit 1
+	obsolete_mkdir_used=true
+      fi
+    fi
+  fi
+
+  if test -n "$dir_arg"; then
+    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+  else
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+    # Copy the file name to the temp name.
+    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+    # If -C, don't bother to copy if it wouldn't change the file.
+    if $copy_on_change &&
+       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
+
+       eval "$initialize_posix_glob" &&
+       $posix_glob set -f &&
+       set X $old && old=:$2:$4:$5:$6 &&
+       set X $new && new=:$2:$4:$5:$6 &&
+       $posix_glob set +f &&
+
+       test "$old" = "$new" &&
+       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+    then
+      rm -f "$dsttmp"
+    else
+      # Rename the file to the real destination.
+      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+      # The rename failed, perhaps because mv can't rename something else
+      # to itself, or perhaps because mv is so ancient that it does not
+      # support -f.
+      {
+	# Now remove or move aside any old file at destination location.
+	# We try this two ways since rm can't unlink itself on some
+	# systems and the destination file might be busy for other
+	# reasons.  In this case, the final cleanup might fail but the new
+	# file should still install successfully.
+	{
+	  test ! -f "$dst" ||
+	  $doit $rmcmd -f "$dst" 2>/dev/null ||
+	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+	  } ||
+	  { echo "$0: cannot unlink or rename $dst" >&2
+	    (exit 1); exit 1
+	  }
+	} &&
+
+	# Now rename the file to the real destination.
+	$doit $mvcmd "$dsttmp" "$dst"
+      }
+    fi || exit 1
+
+    trap '' 0
+  fi
+done
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/missing
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/missing	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/missing	(revision 24799)
@@ -0,0 +1,376 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2009-04-28.21; # UTC
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
+# 2008, 2009 Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try \`$0 --help' for more information"
+  exit 1
+fi
+
+run=:
+sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
+sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+  configure_ac=configure.ac
+else
+  configure_ac=configure.in
+fi
+
+msg="missing on your system"
+
+case $1 in
+--run)
+  # Try to run requested program, and just exit if it succeeds.
+  run=
+  shift
+  "$@" && exit 0
+  # Exit code 63 means version mismatch.  This often happens
+  # when the user try to use an ancient version of a tool on
+  # a file that requires a minimum version.  In this case we
+  # we should proceed has if the program had been absent, or
+  # if --run hadn't been passed.
+  if test $? = 63; then
+    run=:
+    msg="probably too old"
+  fi
+  ;;
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+  --run           try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+  aclocal      touch file \`aclocal.m4'
+  autoconf     touch file \`configure'
+  autoheader   touch file \`config.h.in'
+  autom4te     touch the output file, or create a stub one
+  automake     touch all \`Makefile.in' files
+  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
+  flex         create \`lex.yy.c', if possible, from existing .c
+  help2man     touch the output file
+  lex          create \`lex.yy.c', if possible, from existing .c
+  makeinfo     touch the output file
+  tar          try tar, gnutar, gtar, then tar without non-portable flags
+  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
+
+Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
+\`g' are ignored when checking the name.
+
+Send bug reports to <bug-automake@gnu.org>."
+    exit $?
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing $scriptversion (GNU Automake)"
+    exit $?
+    ;;
+
+  -*)
+    echo 1>&2 "$0: Unknown \`$1' option"
+    echo 1>&2 "Try \`$0 --help' for more information"
+    exit 1
+    ;;
+
+esac
+
+# normalize program name to check for.
+program=`echo "$1" | sed '
+  s/^gnu-//; t
+  s/^gnu//; t
+  s/^g//; t'`
+
+# Now exit if we have it, but it failed.  Also exit now if we
+# don't have it and --version was passed (most likely to detect
+# the program).  This is about non-GNU programs, so use $1 not
+# $program.
+case $1 in
+  lex*|yacc*)
+    # Not GNU programs, they don't have --version.
+    ;;
+
+  tar*)
+    if test -n "$run"; then
+       echo 1>&2 "ERROR: \`tar' requires --run"
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       exit 1
+    fi
+    ;;
+
+  *)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       # Could not run --version or --help.  This is probably someone
+       # running `$TOOL --version' or `$TOOL --help' to check whether
+       # $TOOL exists and not knowing $TOOL uses missing.
+       exit 1
+    fi
+    ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case $program in
+  aclocal*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
+         to install the \`Automake' and \`Perl' packages.  Grab them from
+         any GNU archive site."
+    touch aclocal.m4
+    ;;
+
+  autoconf*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`${configure_ac}'.  You might want to install the
+         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
+         archive site."
+    touch configure
+    ;;
+
+  autoheader*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
+         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
+         from any GNU archive site."
+    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+    test -z "$files" && files="config.h"
+    touch_files=
+    for f in $files; do
+      case $f in
+      *:*) touch_files="$touch_files "`echo "$f" |
+				       sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+      *) touch_files="$touch_files $f.in";;
+      esac
+    done
+    touch $touch_files
+    ;;
+
+  automake*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+         You might want to install the \`Automake' and \`Perl' packages.
+         Grab them from any GNU archive site."
+    find . -type f -name Makefile.am -print |
+	   sed 's/\.am$/.in/' |
+	   while read f; do touch "$f"; done
+    ;;
+
+  autom4te*)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.
+         You can get \`$1' as part of \`Autoconf' from any GNU
+         archive site."
+
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
+	touch $file
+    else
+	test -z "$file" || exec >$file
+	echo "#! /bin/sh"
+	echo "# Created by GNU Automake missing as a replacement of"
+	echo "#  $ $@"
+	echo "exit 0"
+	chmod +x $file
+	exit 1
+    fi
+    ;;
+
+  bison*|yacc*)
+    echo 1>&2 "\
+WARNING: \`$1' $msg.  You should only need it if
+         you modified a \`.y' file.  You may need the \`Bison' package
+         in order for those modifications to take effect.  You can get
+         \`Bison' from any GNU archive site."
+    rm -f y.tab.c y.tab.h
+    if test $# -ne 1; then
+        eval LASTARG="\${$#}"
+	case $LASTARG in
+	*.y)
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" y.tab.c
+	    fi
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" y.tab.h
+	    fi
+	  ;;
+	esac
+    fi
+    if test ! -f y.tab.h; then
+	echo >y.tab.h
+    fi
+    if test ! -f y.tab.c; then
+	echo 'main() { return 0; }' >y.tab.c
+    fi
+    ;;
+
+  lex*|flex*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.l' file.  You may need the \`Flex' package
+         in order for those modifications to take effect.  You can get
+         \`Flex' from any GNU archive site."
+    rm -f lex.yy.c
+    if test $# -ne 1; then
+        eval LASTARG="\${$#}"
+	case $LASTARG in
+	*.l)
+	    SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" lex.yy.c
+	    fi
+	  ;;
+	esac
+    fi
+    if test ! -f lex.yy.c; then
+	echo 'main() { return 0; }' >lex.yy.c
+    fi
+    ;;
+
+  help2man*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+	 you modified a dependency of a manual page.  You may need the
+	 \`Help2man' package in order for those modifications to take
+	 effect.  You can get \`Help2man' from any GNU archive site."
+
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
+	touch $file
+    else
+	test -z "$file" || exec >$file
+	echo ".ab help2man is required to generate this page"
+	exit $?
+    fi
+    ;;
+
+  makeinfo*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.texi' or \`.texinfo' file, or any other file
+         indirectly affecting the aspect of the manual.  The spurious
+         call might also be the consequence of using a buggy \`make' (AIX,
+         DU, IRIX).  You might want to install the \`Texinfo' package or
+         the \`GNU make' package.  Grab either from any GNU archive site."
+    # The file to touch is that specified with -o ...
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -z "$file"; then
+      # ... or it is the one specified with @setfilename ...
+      infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+      file=`sed -n '
+	/^@setfilename/{
+	  s/.* \([^ ]*\) *$/\1/
+	  p
+	  q
+	}' $infile`
+      # ... or it is derived from the source name (dir/f.texi becomes f.info)
+      test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
+    fi
+    # If the file does not exist, the user really needs makeinfo;
+    # let's fail without touching anything.
+    test -f $file || exit 1
+    touch $file
+    ;;
+
+  tar*)
+    shift
+
+    # We have already tried tar in the generic part.
+    # Look for gnutar/gtar before invocation to avoid ugly error
+    # messages.
+    if (gnutar --version > /dev/null 2>&1); then
+       gnutar "$@" && exit 0
+    fi
+    if (gtar --version > /dev/null 2>&1); then
+       gtar "$@" && exit 0
+    fi
+    firstarg="$1"
+    if shift; then
+	case $firstarg in
+	*o*)
+	    firstarg=`echo "$firstarg" | sed s/o//`
+	    tar "$firstarg" "$@" && exit 0
+	    ;;
+	esac
+	case $firstarg in
+	*h*)
+	    firstarg=`echo "$firstarg" | sed s/h//`
+	    tar "$firstarg" "$@" && exit 0
+	    ;;
+	esac
+    fi
+
+    echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+         You may want to install GNU tar or Free paxutils, or check the
+         command line arguments."
+    exit 1
+    ;;
+
+  *)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.  Check the \`README' file,
+         it often tells you about the needed prerequisites for installing
+         this package.  You may also peek at any GNU archive site, in case
+         some other package would contain this missing \`$1' program."
+    exit 1
+    ;;
+esac
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/mpibuildcol.cpp
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/mpibuildcol.cpp	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpibuildcol-src/mpibuildcol.cpp	(revision 24799)
@@ -0,0 +1,715 @@
+// Uses OpenMPI to allow several Greenstone build passes to be run in parallel.
+// Author: John Thompson, 2010NOV18
+// Adapted from code by: Hussein Suleman, 2010JUL01
+
+// 0. Initialization
+// Uncomment to display debug information
+#define DEBUG 1
+// Comment out to disable XML reading
+#define TINYXML 1
+// Fixed buffer size - needs to be fixed size to pass between processes
+#define BUFFERSIZE 256
+// Special message tags
+#define EXITTAG     0
+#define SUCCESSTAG  1
+
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+#include <iostream>
+#include <queue>
+#include <sstream>
+#include <stack>
+#include <string>
+#include <vector>
+
+#include <mpi.h>
+
+#ifdef TINYXML
+#include "tinyxml.h"
+#endif
+
+using namespace std;
+
+struct task_t
+{
+  int id;
+  int prerequisite; /* -1 for no prerequisite */
+  string command;
+};
+// Lets call an order group of tasks a recipe, shall we?
+typedef vector<task_t> recipe_t;
+
+/* Function Prototypes */
+static void debugPrint(int,string);
+static void masterProcess(const char*);
+static void parseRecipe(const char*, recipe_t*);
+static void workerProcess(int);
+#ifdef TINYXML
+static int recurseRecipeXML(recipe_t*, TiXmlNode*, int, int);
+#endif
+/**
+ */
+int
+main(int argc, char **argv)
+{
+  if (argc != 2)
+  {
+    cerr << "usage: mpibuild.cpp <recipe xml>" << endl;
+    return 0;
+  }
+  // 1. Initialize MPI
+  MPI_Init(&argc, &argv);
+  // 2. Find out my identity in the 'world'
+  int myrank;
+  MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
+  if (myrank == 0)
+  {
+    debugPrint(-1,"===== MPIBuild  =====");
+  }
+  // - and dispatch to the appropriate chunk of code
+  if (myrank == 0)
+  {
+    masterProcess(argv[1]);
+  }
+  else
+  {
+    workerProcess(myrank);
+  }
+  // Shut down MPI
+  MPI_Finalize();
+  if (myrank == 0)
+  {
+    debugPrint(-1,"===== Complete! =====");
+  }
+  return 0;
+}
+/** main(int argc, char **argv) **/
+
+/**
+ */
+static void
+debugPrint(int source, string message)
+{
+#ifdef DEBUG
+  time_t seconds = time (NULL);
+  cout << "[" << seconds << "]";
+  if (source == 0)
+  {
+    cout << "[Master] ";
+  }
+  else if (source > 0)
+  {
+    cout << "[Worker" << source << "] ";
+  }
+  cout << message << endl;
+#endif
+}
+/** debugPrint(int,string) **/
+
+/** The activity undertaken by the master 'thread'
+ */
+static void
+masterProcess(const char* recipe_xml_path)
+{
+  debugPrint(0, "starting");
+  // 0. Initialize
+  debugPrint(0, "initializing");
+  // - find out how many processes there are in the default communicator
+  int number_of_processes;
+  MPI_Comm_size(MPI_COMM_WORLD, &number_of_processes);
+  // - sanity check
+  if (number_of_processes < 2)
+  {
+    cerr << "Error! Minimum number of processes is 2" << endl;
+  }
+  // - remember that '0' is the master processor
+  int number_of_workers = number_of_processes - 1;
+  // - initialize the pool of idle worker processes...
+  stack<int> idle_workers;
+  for (int i = 1; i <= number_of_workers; i++)
+  {
+    idle_workers.push(i);
+  }
+  // - we also need a queue of tasks ready to be undertaken. We use a queue as
+  //   the recipe should be if preferred order of execution - and so might be
+  //   slightly more efficient if run in that order
+  queue<task_t> ready_tasks;
+
+  // 1. Parse in the 'recipe' that controls what configurations of Greenstone
+  //    build can be called and when. We end up with a 'queue' of tasks, each
+  //    with a unique id (int), a prequisite (int) if required, and a shell
+  //    command (string).
+  debugPrint(0, "parsing recipe");
+  recipe_t recipe;
+  parseRecipe(recipe_xml_path, &recipe);
+  // - go ahead and define some iterators
+  recipe_t::iterator recipe_begin_itr = recipe.begin();
+  recipe_t::iterator recipe_end_itr = recipe.end();
+  recipe_t::iterator recipe_current_itr;
+
+  // - now look through recipe for tasks that are ready to go immediate (i.e.
+  //   have no prerequisite tasks) and add them to the queue of ready tasks
+  debugPrint(0, "queueing ready tasks");
+  recipe_current_itr = recipe_begin_itr;
+  while (recipe_current_itr != recipe_end_itr)
+  {
+    task_t a_task = *recipe_current_itr;
+    if (a_task.prerequisite == -1)
+    {
+      ready_tasks.push(a_task);
+    }
+    ++recipe_current_itr;
+  }
+
+  // 2. We have a 'pool' of idle workers and a list of ready tasks. Start by
+  //    iterating through the tasks assigning them to workers until we have
+  //    either run out of actionable tasks (although some tasks may become
+  //    actionable once others finish) or have exhausted the pool of workers.
+  debugPrint(0, "initial task assignment");
+  while (ready_tasks.size() > 0 && idle_workers.size() > 0)
+  {
+    task_t a_task = ready_tasks.front();
+    ready_tasks.pop();
+    // - grab an idle worker
+    int worker_id = idle_workers.top();
+    idle_workers.pop();
+    // - create a fixed size buffer to store the command string in
+    char buffer[BUFFERSIZE];
+    sprintf(buffer, "%s", a_task.command.c_str());
+    // - seed the slaves; send one unit of work to each slave.
+    stringstream strstr;
+    strstr << " - assigning task " << a_task.id << " to worker " << worker_id;
+    debugPrint(0, strstr.str());
+    MPI_Send(&buffer,           // message buffer containing command
+             strlen(buffer)+1,  // command string length
+             MPI_CHAR,          // data item is a character array
+             worker_id,         // destination process rank
+             a_task.id,         // we use the task id as the worktag!
+             MPI_COMM_WORLD);   // default communicator
+  }
+  // - by now we have either a) assigned all the ready jobs to workers
+  //   or, b) we've run out of idle workers.
+  stringstream str1;
+  str1 << ready_tasks.size();
+  debugPrint(0, str1.str() + " ready tasks remaining");
+  stringstream str2;
+  str2 << idle_workers.size();
+  debugPrint(0, str2.str() + " idle workers remaining");
+
+  // 3. Assuming we have at least one worker that is busy (so the not all the
+  //    workers are sitting in the idle pool), we wait/block until we receive
+  //    feedback from a worker process (feedback that includes the identifier
+  //    of the task just completed). We go through the recipe and queue any
+  //    dependant tasks as ready to go, while returning the worker to the idle
+  //    pool. We then essentially repeat the process of matching task to
+  //    working trying to exhaust either the queue of ready tasks or of will
+  //    slaves. (note: maybe optimize this later)
+  while (idle_workers.size() < number_of_workers)
+  {
+    // - wait until a worker completes and replies
+    debugPrint(0, "waiting until some worker process responds");
+    int task_id;
+    MPI_Status status;
+    MPI_Recv(&task_id,          // the identifier of the task completed
+             1,                 // a single interger expected
+             MPI_INT,           // data item is an int
+             MPI_ANY_SOURCE,    // receive from any sender
+             MPI_ANY_TAG,       // any type of message tag
+             MPI_COMM_WORLD,    // default communicator
+             &status);          // info about the received message
+    // - loop through the tasks, looking for any that were waiting for
+    //   this task to be completed, and add them to the ready queue.
+    debugPrint(0, "queuing any tasks that are now ready");
+    recipe_current_itr = recipe_begin_itr;
+    while (recipe_current_itr < recipe_end_itr)
+    {
+      task_t a_task = *recipe_current_itr;
+      if (a_task.prerequisite == task_id)
+      {
+        ready_tasks.push(a_task);
+      }
+      ++recipe_current_itr;
+    }
+    // - status contains the identifier of the worker process...
+    int worker_id = status.MPI_SOURCE;
+    // - ...which we add to the pool of idle workers
+    idle_workers.push(worker_id);
+    // - now we try, once again, to match tasks to workers until we run out of
+    //   one or the other
+    debugPrint(0, "task assignment");
+    while (ready_tasks.size() > 0 && idle_workers.size() > 0)
+    {
+      task_t a_task = ready_tasks.front();
+      ready_tasks.pop();
+      // - grab an idle worker
+      int worker_id = idle_workers.top();
+      idle_workers.pop();
+      // - create a fixed size buffer to store the command string in
+      char buffer[BUFFERSIZE];
+      if (sprintf(buffer, "%s", a_task.command.c_str()) < 0)
+      {
+        cerr << "Error! Failed to write command string into transport buffer." << endl;
+      }
+      // - send the task to the worker
+      stringstream strstr;
+      strstr << " - assigning task " << a_task.id << " to worker " << worker_id;
+      debugPrint(0, strstr.str());
+      MPI_Send(&buffer,           // message buffer containing command
+               strlen(buffer)+1,  // command string length
+               MPI_CHAR,          // data item is a character array
+               worker_id,         // destination process rank
+               a_task.id,         // we use the task id as the worktag!
+               MPI_COMM_WORLD);   // default communicator
+    }
+    stringstream str3;
+    str3 << ready_tasks.size();
+    debugPrint(0, str3.str() + " ready tasks remaining");
+    stringstream str4;
+    str4 << idle_workers.size();
+    debugPrint(0, str4.str() + " idle workers remaining");
+  }
+  // - we can do some sanity checking here. For instance, there should be no
+  //   tasks left in the ready queue at this point and all workers should be
+  //   sitting in the idle pool
+  if (ready_tasks.size() > 0)
+  {
+    cerr << "Error! Processing supposedly complete but tasks are still pending!" << endl;
+  }
+  if (idle_workers.size() != number_of_workers)
+  {
+    cerr << "Error! Processing supposedly complete but workers are still busy!" << endl;
+  }
+
+  // 4. By now all workers have returned, and should we waiting idle in the
+  //    pool. Iterate over all workers telling them to exit by using the
+  //    special EXITTAG.
+  for (int worker_id = 1; worker_id <= number_of_workers; worker_id++)
+  {
+    MPI_Send(0,               // we don't intend to do any processing
+             0,               // zero data items
+             MPI_INT,         // data item is an integer
+             worker_id,       // destination process identifier
+             EXITTAG,         // message flag indicating workers must exit
+             MPI_COMM_WORLD); // default communicator
+  }
+
+  // 5. At this point all the slaves have expired and the master process is
+  //    complete
+  debugPrint(0, "exiting");
+}
+/** masterProcess(const char *) **/
+
+/** Reads in an XML file, and builds an (ordered) list of tasks which I've
+ *  termed a recipe.
+ *  - note: when parsing, code should verify that no command exceeds BUFFERSIZE
+ *          characters in length
+ */
+static void
+parseRecipe(const char* recipe_xml_path, recipe_t* recipe)
+{
+#ifdef TINYXML
+  TiXmlDocument recipe_xml_doc(recipe_xml_path);
+  bool is_loaded = recipe_xml_doc.LoadFile();
+  if (is_loaded)
+  {
+    // - top node is always the document (in this case <Recipe>) so we loop
+    //   through it's child elements (which should be the no-prequisite tasks)
+    TiXmlElement *root = recipe_xml_doc.RootElement();
+    int task_count = 0;
+    TiXmlNode* element;
+    for ( element = root->FirstChild(); element != 0; element = element->NextSibling())
+    {
+      task_count++;
+      task_count = recurseRecipeXML(recipe, element, -1, task_count);
+    }
+  }
+  else
+  {
+    cerr << "Error! Failed to open/parse XML file: " << recipe_xml_path << endl;
+  }
+
+#else
+  // - dummy data for a start. We'll emulate a (complex) MG build with four
+  //   indexes
+  task_t task1;
+  task1.id = 1;
+  task1.prerequisite = -1;
+  task1.command = "buildcol.pl -keepold -verbosity 3 -mode compress_text tdb0005000 >> build.log 2>&1";
+  recipe->push_back(task1);
+  task_t task2;
+  task2.id = 2;
+  task2.prerequisite = -1;
+  task2.command = "buildcol.pl -keepold -verbosity 3 -mode infodb tdb0005000 >> build.log 2>&1";
+  recipe->push_back(task2);
+  task_t task3;
+  task3.id = 3;
+  task3.prerequisite = 1;
+  task3.command = "buildcol.pl -keepold -verbosity 3 -mode build_index -indexname document:text tdb0005000 >> build.log 2>&1";
+  recipe->push_back(task3);
+  task_t task4;
+  task4.id = 4;
+  task4.prerequisite = 1;
+  task4.command = "buildcol.pl -keepold -verbosity 3 -mode build_index -indexname document:Title tdb0005000 >> build.log 2>&1";
+  recipe->push_back(task4);
+  task_t task5;
+  task5.id = 5;
+  task5.prerequisite = 1;
+  task5.command = "buildcol.pl -keepold -verbosity 3 -mode build_index -indexname document:Source tdb0005000 >> build.log 2>&1";
+  recipe->push_back(task5);
+  task_t task6;
+  task6.id = 6;
+  task6.prerequisite = 1;
+  task6.command = "buildcol.pl -keepold -verbosity 3 -mode build_index -indexname document:Title,Source tdb0005000 >> build.log 2>&1";
+  recipe->push_back(task6);
+  task_t task7;
+  task7.id = 7;
+  task7.prerequisite = 1;
+  task7.command = "buildcol.pl -keepold -verbosity 3 -mode build_index -indexname document:text,Title,Source tdb0005000 >> build.log 2>&1";
+  recipe->push_back(task7);
+#endif
+
+#ifdef DEBUG
+  debugPrint(0, " * The Recipe!");
+  // If we are debugging, lets print out the recipe
+  recipe_t::iterator recipe_begin_itr = (*recipe).begin();
+  recipe_t::iterator recipe_end_itr = (*recipe).end();
+  recipe_t::iterator recipe_current_itr;
+  for(recipe_current_itr = recipe_begin_itr; recipe_current_itr < recipe_end_itr; ++recipe_current_itr)
+  {
+    task_t a_task = (task_t)(*recipe_current_itr);
+    stringstream recipestrstr;
+    recipestrstr << " Task " << a_task.id << ": " << a_task.command << " [Prequisite: " << a_task.prerequisite << "]";
+    debugPrint(0, recipestrstr.str());
+  }
+#endif
+}
+/** parseRecipe(const char*, recipe_t*) **/
+
+/**
+ */
+#ifdef TINYXML
+static int recurseRecipeXML(recipe_t* recipe, TiXmlNode* element, int parent_id, int task_count)
+{
+  // A. Loop through this task elements children. At least one subelement
+  //    should be the command, while all other subelements should be
+  //    tasks that need to be further recursed.
+  TiXmlNode* child;
+  int task_id = task_count;
+  bool found_command = false; // We can only have one command per task id
+  for (child = element->FirstChild(); child != 0; child = child->NextSibling())
+  {
+    // - we are only interested in element nodes
+    if (child->Type() == TiXmlNode::TINYXML_ELEMENT)
+    {
+      stringstream element_name_stream;
+      element_name_stream << child->Value();
+      string element_name = element_name_stream.str();
+      if (element_name == "Command" && !found_command)
+      {
+        // - retrieve the text child node
+        for ( TiXmlNode *text_grandchild = child->FirstChild(); text_grandchild != 0; text_grandchild = text_grandchild->NextSibling())
+	{
+          if (text_grandchild->Type() == TiXmlNode::TINYXML_TEXT)
+          {
+            TiXmlText* text_command = text_grandchild->ToText();
+            stringstream commandstrstr;
+            commandstrstr << text_command->Value() << " 2>&1";
+            // - and create the new task given the command string and
+            //   accounting for any preqrequisites via the the parent task id
+            //   (begin non-zero)
+            task_t a_task;
+            a_task.id = task_id;
+            a_task.prerequisite = parent_id;
+            a_task.command = commandstrstr.str();
+            recipe->push_back(a_task);
+            // - and prevent any further commands being associated with this
+            //   task id
+            found_command = true;
+          }
+	}
+      }
+      else if (element_name == "Task")
+      {
+        task_count++;
+        recurseRecipeXML(recipe, child, task_id, task_count);
+      }
+    }
+  }
+  return task_count;
+}
+#endif
+/** recurseRecipeXML(recipe_t*, TiXmlNode*, int, int) **/
+
+/** Each worker is responsible for executing a particular command in a shell,
+ *  waiting until the command is complete, and then relaying to the master that
+ *  work is complete.
+ *  @param worker_id  An integer containing the unique identifier (rank) of the
+ *                    worker process.
+ *  @return void
+ */
+static void
+workerProcess(int worker_id)
+{
+  debugPrint(worker_id, "starting");
+  // 0. Worker loops tirelessly until asked to exit (note that the mpi_recv
+  //    command below is blocking - so no tight-loop thrashing)
+  while (1)
+  {
+    // 1. Receive a message from the master process
+    char command[BUFFERSIZE];
+    MPI_Status status;
+    MPI_Recv(&command,       // buffer in which to store the command string
+             BUFFERSIZE,     // we expect (at most) BUFFERSIZE characters
+             MPI_CHAR,       // we expect a char array
+             0,              // recieve from the master process only
+             MPI_ANY_TAG,    // accept any incoming tag
+             MPI_COMM_WORLD, // default communicator
+             &status);
+    // - watch for the special exit tag, and end the worker process if detected
+    if (status.MPI_TAG == EXITTAG)
+    {
+      debugPrint(worker_id, "exiting");
+      return;
+    }
+    // - otherwise the tag actually tells us the task id - which we need to
+    //   reply back with later
+    int task_id = status.MPI_TAG;
+    // - action the command in the buffer
+    string message = "processing: ";
+    message += command;
+    debugPrint(worker_id, message);
+    // asynchronous
+    //system(command);
+    FILE *pipe = popen(command, "r");
+    if (!pipe)
+    {
+      cerr << "Warning! Failed to open pipe to command: " << command << endl;
+    }
+    else
+    {
+      char buffer[1024];
+      while(fgets(buffer, sizeof(buffer), pipe) != NULL)
+      {
+        cout << buffer;
+      }
+      pclose(pipe);
+    }
+    // 2. Send a reply back containing the id of the task just completed
+    debugPrint(worker_id, "complete");
+    MPI_Send(&task_id,
+             1,
+             MPI_INT,
+             0,
+             SUCCESSTAG,
+             MPI_COMM_WORLD);
+  }
+}
+/** workerProcess(int) **/
+
+
+
+/*
+#include "mpi.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <fstream>
+#include <iostream>
+#include <string>
+#include <vector>
+
+using namespace std;
+
+#define KILOBUF 512
+#define MEGABUF 10240
+
+int
+main( int argc, char *argv [] )
+{
+  // MPI variables
+  int num_tasks;
+  int rank;
+
+  if (argc != 3 )
+  {
+    cerr << "Usage: " << argv[0] << " gsdlhome collection" << endl;
+    exit(-1);
+  }
+
+  // Greenstone home directory
+  char *gsdl_home_dir = argv[1];
+  // Short collection name
+  char *collection = argv[2];
+                
+  // start MPI environment
+  int mpi_status = MPI_Init(&argc, &argv);
+  if (mpi_status != MPI_SUCCESS)
+  {
+    printf ("Error starting MPI program. Terminating.\n");
+    MPI_Abort(MPI_COMM_WORLD, mpi_status);
+  }
+  
+  // get MPI variables: number of processors and processor number
+  MPI_Status stat;
+  MPI_Comm_size(MPI_COMM_WORLD, &num_tasks);
+  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+
+  // The Master node (dispatcher) has a rank of zero. All child processes have
+  // higher ranks.
+  if (rank == 0)
+  {
+    cout << "===== MPI Build =====" << endl;
+    cout << "Uses OpenMPI to allow several Greenstone build passes to be run in parallel." << endl;
+    cout << endl;
+    cout << "Number of Processors: " << num_tasks << endl;
+    cout << "Rank of current process: " << rank << endl;
+    cout << endl;
+
+    cout << "[0] Dispatcher" << endl;
+    // buffer for acknowledgments
+    // - Is there some reason this buffer isn't actually set to be numtasks in
+    //   size?
+    char incoming[KILOBUF];
+    // Buffer to send tasks
+    char buffer[KILOBUF];
+    // Request monitor for all tasks
+    MPI_Request request[KILOBUF];
+    // Status monitor for all tasks
+    MPI_Status status[KILOBUF];
+    // Number of processors running
+    int actual_tasks = 0;
+
+    // Set initial status of all processors to idle
+    cout << " - initializing child tasks to idle" << endl;
+    for ( int i = 0;  i < KILOBUF; i++ )
+    {
+      incoming[i] = ' ';
+    }
+
+    // In the future this would be where the process reads in settings from the
+    // collect.cfg to determine how many passes are needed and thus what tasks
+    // there are available for children to process. For the moment I'll just
+    // hardcode the short three task list that essentially invokes each of the
+    // three standard Greenstone build modes - compress_text, build_indexes and
+    // make_infodb.
+    cout << " - populating task list... ";
+    // List of pending tasks to undertake
+    vector<string> tasks;
+    tasks.push_back("infodb");
+    tasks.push_back("compress_text");
+    tasks.push_back("build_index");
+    cout << "found " << tasks.size() << " tasks" << endl;
+
+    // For each pending task
+    for(int j = 0; j < tasks.size(); j++)
+    {
+      // Search for idle processor
+      cout << " - searching for idle processor" << endl;
+      int dest=0;
+      int found = 0;
+      while ( (dest < ( num_tasks - 1 ) ) && ( found == 0 ) )
+      {
+        if (incoming[dest] == ' ')
+        {
+          found = 1;
+        }
+        else
+        {
+          dest++;
+        }
+      }
+
+      // If no idle processor, wait for one to become idle
+      if (found == 0)
+      {
+        MPI_Waitany(num_tasks-1, request, &dest, status);
+      }
+
+      // Write the tasks mode flag as the instruction to the child
+      sprintf(buffer, "%s", tasks[j].c_str());
+
+      // Mark processors as busy
+      incoming[dest] = 'B';
+
+      cout << " - asking child process to execute: " << tasks[j] << endl;
+
+      // Send out the job to the processor
+      MPI_Send(&buffer, strlen (buffer)+1, MPI_CHAR, dest+1, 1, MPI_COMM_WORLD);
+
+      // I'm guess there is some kind of 'fork' either here or above. Somehow
+      // this command 'waits' for a response from the child thread. In the
+      // usual case the response is a single space (' ') that overwrites the
+      // 'B' in the incoming string at the position that matches the child
+      // thread number. (Presumably you could count the B's in the incoming
+      // string to determine running threads... but we don't).
+      MPI_Irecv(&incoming[dest], 1, MPI_CHAR, dest+1, 1, MPI_COMM_WORLD, &request[dest]);
+      cout << "[DEBUG] When does this code actually execute? [cmd: " << buffer << "]" << endl;
+
+      // Update counter of actual tasks
+      if (dest > actual_tasks)
+      {
+        actual_tasks = dest;
+      }
+    }
+
+    // Wait until all outstanding tasks are completed
+    cout << " - waiting for outstanding tasks" << endl;
+    int dest;
+    for ( int k = 0; k < actual_tasks; k++ )
+    {
+      MPI_Waitany(actual_tasks, request, &dest, status);
+    }
+
+    // Send message to end all processing engines
+    cout << " - ask all child processes to terminate" << endl;
+    char endstr[5] = "end";
+    for ( int l = 1; l < num_tasks; l++ )
+    {
+      MPI_Send(endstr, 4, MPI_CHAR, l, 1, MPI_COMM_WORLD);
+    }
+  }
+  // Slave node processing
+  else
+  {
+    cout << "[" << rank << "] Child Process" << endl;
+    char incoming[KILOBUF];
+
+    do
+    {   
+      // wait for instruction from master
+      MPI_Recv(&incoming, KILOBUF, MPI_CHAR, 0, 1, MPI_COMM_WORLD, &stat);
+      if (strcmp(incoming, "end") != 0)
+      {
+        // Process a received job
+        cout << " + processing command: " << incoming << endl;
+	      
+        // Create Greenstone import command
+        char command[2048];
+        sprintf(command, "%s/bin/script/buildcol.pl -keepold -verbosity 3 -mode %s %s", gsdl_home_dir, incoming, collection);
+        cout << " + Greenstone buildcol command: " << command << endl;
+
+        // Invoke Greenstone import with manifest file
+        system (command);
+	      
+        char line = ' ';
+        // send completed message
+        MPI_Send(&line, 1, MPI_CHAR, 0, 1, MPI_COMM_WORLD);
+        cout << " + done [cmd: " << command << "]" << endl;
+      }
+    }
+    // stop when "end" instruction is received
+    while (strcmp(incoming, "end") != 0);
+
+    cout << " + child process terminating" << endl;
+  }
+
+  // clean up MPI environment
+  MPI_Finalize();
+  if (0 == rank)
+  {
+    cout << "Complete!" << endl << endl;
+  }
+}
+*/
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/.svnignore
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/.svnignore	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/.svnignore	(revision 24799)
@@ -0,0 +1,7 @@
+Makefile
+autom4te.cache
+config.h
+config.log
+config.status
+mpiimport
+.deps
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/AUTHORS
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/AUTHORS	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/AUTHORS	(revision 24799)
@@ -0,0 +1,2 @@
+"Hussein Suleman"
+"John Thompson" <jmt12@students.waikato.ac.nz>
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/COPYING
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/COPYING	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/COPYING	(revision 24799)
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/INSTALL
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/INSTALL	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/INSTALL	(revision 24799)
@@ -0,0 +1,302 @@
+Installation Instructions
+*************************
+
+Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
+2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+
+   This file is free documentation; the Free Software Foundation gives
+unlimited permission to copy, distribute and modify it.
+
+Basic Installation
+==================
+
+   Briefly, the shell commands `./configure; make; make install' should
+configure, build, and install this package.  The following
+more-detailed instructions are generic; see the `README' file for
+instructions specific to this package.
+
+   The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation.  It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions.  Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, and a
+file `config.log' containing compiler output (useful mainly for
+debugging `configure').
+
+   It can also use an optional file (typically called `config.cache'
+and enabled with `--cache-file=config.cache' or simply `-C') that saves
+the results of its tests to speed up reconfiguring.  Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.
+
+   If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release.  If you are using the cache, and at
+some point `config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+   The file `configure.ac' (or `configure.in') is used to create
+`configure' by a program called `autoconf'.  You need `configure.ac' if
+you want to change it or regenerate `configure' using a newer version
+of `autoconf'.
+
+The simplest way to compile this package is:
+
+  1. `cd' to the directory containing the package's source code and type
+     `./configure' to configure the package for your system.
+
+     Running `configure' might take a while.  While running, it prints
+     some messages telling which features it is checking for.
+
+  2. Type `make' to compile the package.
+
+  3. Optionally, type `make check' to run any self-tests that come with
+     the package.
+
+  4. Type `make install' to install the programs and any data files and
+     documentation.
+
+  5. You can remove the program binaries and object files from the
+     source code directory by typing `make clean'.  To also remove the
+     files that `configure' created (so you can compile the package for
+     a different kind of computer), type `make distclean'.  There is
+     also a `make maintainer-clean' target, but that is intended mainly
+     for the package's developers.  If you use it, you may have to get
+     all sorts of other programs in order to regenerate files that came
+     with the distribution.
+
+  6. Often, you can also type `make uninstall' to remove the installed
+     files again.
+
+Compilers and Options
+=====================
+
+   Some systems require unusual options for compilation or linking that
+the `configure' script does not know about.  Run `./configure --help'
+for details on some of the pertinent environment variables.
+
+   You can give `configure' initial values for configuration parameters
+by setting variables in the command line or in the environment.  Here
+is an example:
+
+     ./configure CC=c99 CFLAGS=-g LIBS=-lposix
+
+   *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+   You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory.  To do this, you can use GNU `make'.  `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script.  `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+   With a non-GNU `make', it is safer to compile the package for one
+architecture at a time in the source code directory.  After you have
+installed the package for one architecture, use `make distclean' before
+reconfiguring for another architecture.
+
+   On MacOS X 10.5 and later systems, you can create libraries and
+executables that work on multiple system types--known as "fat" or
+"universal" binaries--by specifying multiple `-arch' options to the
+compiler but only a single `-arch' option to the preprocessor.  Like
+this:
+
+     ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+                 CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+                 CPP="gcc -E" CXXCPP="g++ -E"
+
+   This is not guaranteed to produce working output in all cases, you
+may have to build one architecture at a time and combine the results
+using the `lipo' tool if you have problems.
+
+Installation Names
+==================
+
+   By default, `make install' installs the package's commands under
+`/usr/local/bin', include files under `/usr/local/include', etc.  You
+can specify an installation prefix other than `/usr/local' by giving
+`configure' the option `--prefix=PREFIX'.
+
+   You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files.  If you
+pass the option `--exec-prefix=PREFIX' to `configure', the package uses
+PREFIX as the prefix for installing programs and libraries.
+Documentation and other data files still use the regular prefix.
+
+   In addition, if you use an unusual directory layout you can give
+options like `--bindir=DIR' to specify different values for particular
+kinds of files.  Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+   If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+   Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System).  The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+   For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Particular systems
+==================
+
+   On HP-UX, the default C compiler is not ANSI C compatible.  If GNU
+CC is not installed, it is recommended to use the following options in
+order to use an ANSI C compiler:
+
+     ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
+
+and if that doesn't work, install pre-built binaries of GCC for HP-UX.
+
+   On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
+parse its `<wchar.h>' header file.  The option `-nodtk' can be used as
+a workaround.  If GNU CC is not installed, it is therefore recommended
+to try
+
+     ./configure CC="cc"
+
+and if that doesn't work, try
+
+     ./configure CC="cc -nodtk"
+
+   On Solaris, don't put `/usr/ucb' early in your `PATH'.  This
+directory contains several dysfunctional programs; working variants of
+these programs are available in `/usr/bin'.  So, if you need `/usr/ucb'
+in your `PATH', put it _after_ `/usr/bin'.
+
+   On Haiku, software installed for all users goes in `/boot/common',
+not `/usr/local'.  It is recommended to use the following options:
+
+     ./configure --prefix=/boot/common
+
+Specifying the System Type
+==========================
+
+   There may be some features `configure' cannot figure out
+automatically, but needs to determine by the type of machine the package
+will run on.  Usually, assuming the package is built to be run on the
+_same_ architectures, `configure' can figure that out, but if it prints
+a message saying it cannot guess the machine type, give it the
+`--build=TYPE' option.  TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name which has the form:
+
+     CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+     OS
+     KERNEL-OS
+
+   See the file `config.sub' for the possible values of each field.  If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+   If you are _building_ compiler tools for cross-compiling, you should
+use the option `--target=TYPE' to select the type of system they will
+produce code for.
+
+   If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with `--host=TYPE'.
+
+Sharing Defaults
+================
+
+   If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists.  Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+   Variables not defined in a site shell script can be set in the
+environment passed to `configure'.  However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost.  In order to avoid this problem, you should set
+them in the `configure' command line, using `VAR=value'.  For example:
+
+     ./configure CC=/usr/local2/bin/gcc
+
+causes the specified `gcc' to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+Unfortunately, this technique does not work for `CONFIG_SHELL' due to
+an Autoconf bug.  Until the bug is fixed you can use this workaround:
+
+     CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
+
+`configure' Invocation
+======================
+
+   `configure' recognizes the following options to control how it
+operates.
+
+`--help'
+`-h'
+     Print a summary of all of the options to `configure', and exit.
+
+`--help=short'
+`--help=recursive'
+     Print a summary of the options unique to this package's
+     `configure', and exit.  The `short' variant lists options used
+     only in the top level, while the `recursive' variant lists options
+     also present in any nested packages.
+
+`--version'
+`-V'
+     Print the version of Autoconf used to generate the `configure'
+     script, and exit.
+
+`--cache-file=FILE'
+     Enable the cache: use and save the results of the tests in FILE,
+     traditionally `config.cache'.  FILE defaults to `/dev/null' to
+     disable caching.
+
+`--config-cache'
+`-C'
+     Alias for `--cache-file=config.cache'.
+
+`--quiet'
+`--silent'
+`-q'
+     Do not print messages saying which checks are being made.  To
+     suppress all normal output, redirect it to `/dev/null' (any error
+     messages will still be shown).
+
+`--srcdir=DIR'
+     Look for the package's source code in directory DIR.  Usually
+     `configure' can determine that directory automatically.
+
+`--prefix=DIR'
+     Use DIR as the installation prefix.  *Note Installation Names::
+     for more details, including other options available for fine-tuning
+     the installation locations.
+
+`--no-create'
+`-n'
+     Run the configure checks, but stop before creating any output
+     files.
+
+`configure' also accepts some other, not widely useful, options.  Run
+`configure --help' for more details.
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/Makefile.am
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/Makefile.am	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/Makefile.am	(revision 24799)
@@ -0,0 +1,2 @@
+bin_PROGRAMS = mpiimport
+mpiimport_SOURCES = mpiimport.cpp
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/Makefile.in
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/Makefile.in	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/Makefile.in	(revision 24799)
@@ -0,0 +1,600 @@
+# Makefile.in generated by automake 1.11 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = mpiimport$(EXEEXT)
+subdir = .
+DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
+	$(srcdir)/Makefile.in $(top_srcdir)/configure AUTHORS COPYING \
+	ChangeLog INSTALL NEWS config.guess config.sub depcomp \
+	install-sh missing
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_mpiimport_OBJECTS = mpiimport.$(OBJEXT)
+mpiimport_OBJECTS = $(am_mpiimport_OBJECTS)
+mpiimport_LDADD = $(LDADD)
+DEFAULT_INCLUDES = -I.@am__isrc@
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+	-o $@
+SOURCES = $(mpiimport_SOURCES)
+DIST_SOURCES = $(mpiimport_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+  { test ! -d "$(distdir)" \
+    || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+         && rm -fr "$(distdir)"; }; }
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EXEEXT = @EXEEXT@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+mpiimport_SOURCES = mpiimport.cpp
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cpp .o .obj
+am--refresh:
+	@:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \
+	      $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    echo ' $(SHELL) ./config.status'; \
+	    $(SHELL) ./config.status;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	$(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	$(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	for p in $$list; do echo "$$p $$p"; done | \
+	sed 's/$(EXEEXT)$$//' | \
+	while read p p1; do if test -f $$p; \
+	  then echo "$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
+	    -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+	sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) files[d] = files[d] " " $$1; \
+	    else { print "f", $$3 "/" $$4, $$1; } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	    if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	    test -z "$$files" || { \
+	      echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+	      $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+	    } \
+	; done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	  sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+	      -e 's/$$/$(EXEEXT)/' `; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+	-test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+mpiimport$(EXEEXT): $(mpiimport_OBJECTS) $(mpiimport_DEPENDENCIES) 
+	@rm -f mpiimport$(EXEEXT)
+	$(CXXLINK) $(mpiimport_OBJECTS) $(mpiimport_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpiimport.Po@am__quote@
+
+.cpp.o:
+@am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
+
+.cpp.obj:
+@am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	set x; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	$(am__remove_distdir)
+	test -d "$(distdir)" || mkdir "$(distdir)"
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	-test -n "$(am__skip_mode_fix)" \
+	|| find "$(distdir)" -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
+	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+	|| chmod -R a+r "$(distdir)"
+dist-gzip: distdir
+	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	$(am__remove_distdir)
+
+dist-bzip2: distdir
+	tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+	$(am__remove_distdir)
+
+dist-lzma: distdir
+	tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
+	$(am__remove_distdir)
+
+dist-xz: distdir
+	tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz
+	$(am__remove_distdir)
+
+dist-tarZ: distdir
+	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+	$(am__remove_distdir)
+
+dist-shar: distdir
+	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+	$(am__remove_distdir)
+
+dist-zip: distdir
+	-rm -f $(distdir).zip
+	zip -rq $(distdir).zip $(distdir)
+	$(am__remove_distdir)
+
+dist dist-all: distdir
+	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	$(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+	case '$(DIST_ARCHIVES)' in \
+	*.tar.gz*) \
+	  GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
+	*.tar.bz2*) \
+	  bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
+	*.tar.lzma*) \
+	  unlzma -c $(distdir).tar.lzma | $(am__untar) ;;\
+	*.tar.xz*) \
+	  xz -dc $(distdir).tar.xz | $(am__untar) ;;\
+	*.tar.Z*) \
+	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+	*.shar.gz*) \
+	  GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
+	*.zip*) \
+	  unzip $(distdir).zip ;;\
+	esac
+	chmod -R a-w $(distdir); chmod a+w $(distdir)
+	mkdir $(distdir)/_build
+	mkdir $(distdir)/_inst
+	chmod a-w $(distdir)
+	test -d $(distdir)/_build || exit 0; \
+	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+	  && am__cwd=`pwd` \
+	  && $(am__cd) $(distdir)/_build \
+	  && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+	    $(DISTCHECK_CONFIGURE_FLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
+	  && $(MAKE) $(AM_MAKEFLAGS) check \
+	  && $(MAKE) $(AM_MAKEFLAGS) install \
+	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+	        distuninstallcheck \
+	  && chmod -R a-w "$$dc_install_base" \
+	  && ({ \
+	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
+	  && rm -rf "$$dc_destdir" \
+	  && $(MAKE) $(AM_MAKEFLAGS) dist \
+	  && rm -rf $(DIST_ARCHIVES) \
+	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+	  && cd "$$am__cwd" \
+	  || exit 1
+	$(am__remove_distdir)
+	@(echo "$(distdir) archives ready for distribution: "; \
+	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+	@$(am__cd) '$(distuninstallcheck_dir)' \
+	&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+	   || { echo "ERROR: files left after uninstall:" ; \
+	        if test -n "$(DESTDIR)"; then \
+	          echo "  (check DESTDIR support)"; \
+	        fi ; \
+	        $(distuninstallcheck_listfiles) ; \
+	        exit 1; } >&2
+distcleancheck: distclean
+	@if test '$(srcdir)' = . ; then \
+	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+	  exit 1 ; \
+	fi
+	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+	  || { echo "ERROR: files left in build directory after distclean:" ; \
+	       $(distcleancheck_listfiles) ; \
+	       exit 1; } >&2
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS)
+installdirs:
+	for dir in "$(DESTDIR)$(bindir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -rf $(top_srcdir)/autom4te.cache
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am am--refresh check check-am clean \
+	clean-binPROGRAMS clean-generic ctags dist dist-all dist-bzip2 \
+	dist-gzip dist-lzma dist-shar dist-tarZ dist-xz dist-zip \
+	distcheck distclean distclean-compile distclean-generic \
+	distclean-tags distcleancheck distdir distuninstallcheck dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-binPROGRAMS install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
+	tags uninstall uninstall-am uninstall-binPROGRAMS
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/README
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/README	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/README	(revision 24799)
@@ -0,0 +1,25 @@
+###########################################################################
+#
+# Makefile -- build-src/src/mpi/
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2011  The New Zealand Digital Library Project
+#
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/aclocal.m4
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/aclocal.m4	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/aclocal.m4	(revision 24799)
@@ -0,0 +1,951 @@
+# generated automatically by aclocal 1.11 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2007, 2008, 2009  Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],,
+[m4_warning([this file was generated for autoconf 2.68.
+You have another version of autoconf.  It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically `autoreconf'.])])
+
+# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.11'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version.  Point them to the right macro.
+m4_if([$1], [1.11], [],
+      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too.  Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.11])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 9
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 10
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
+       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
+       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+       [$1], UPC,  [depcc="$UPC"  am_compiler_list=],
+       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                   [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  am__universal=false
+  m4_case([$1], [CC],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac],
+    [CXX],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac])
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 5
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named `Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`AS_DIRNAME("$mf")`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running `make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`AS_DIRNAME(["$file"])`
+      AS_MKDIR_P([$dirpart/$fdir])
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled.  FIXME.  This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 16
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.62])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
+  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+	      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+			     [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+		  [_AM_DEPENDENCIES(CC)],
+		  [define([AC_PROG_CC],
+			  defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+		  [_AM_DEPENDENCIES(CXX)],
+		  [define([AC_PROG_CXX],
+			  defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+		  [_AM_DEPENDENCIES(OBJC)],
+		  [define([AC_PROG_OBJC],
+			  defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
+])
+_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
+dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
+dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
+dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+])
+
+dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Check to see how 'make' treats includes.	            -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2009  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 6
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check for `mkdir -p'.
+AC_DEFUN([AM_PROG_MKDIR_P],
+[AC_PREREQ([2.60])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
+dnl while keeping a definition of mkdir_p for backward compatibility.
+dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
+dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
+dnl Makefile.ins that do not define MKDIR_P, so we do our own
+dnl adjustment using top_builddir (which is defined more often than
+dnl MKDIR_P).
+AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
+case $mkdir_p in
+  [[\\/$]]* | ?:[[\\/]]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[[\\\"\#\$\&\'\`$am_lf]]*)
+    AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+  *[[\\\"\#\$\&\'\`$am_lf\ \	]]*)
+    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
+esac
+
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+   if test "$[*]" = "X"; then
+      # -L didn't work.
+      set X `ls -t "$srcdir/configure" conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$[*]" != "X $srcdir/configure conftest.file" \
+      && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+     [m4_case([$1], [ustar],, [pax],,
+              [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+  case $_am_tool in
+  gnutar)
+    for _am_tar in tar gnutar gtar;
+    do
+      AM_RUN_LOG([$_am_tar --version]) && break
+    done
+    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+    am__untar="$_am_tar -xf -"
+    ;;
+  plaintar)
+    # Must skip GNU tar: if it does not support --format= it doesn't create
+    # ustar tarball either.
+    (tar --version) >/dev/null 2>&1 && continue
+    am__tar='tar chf - "$$tardir"'
+    am__tar_='tar chf - "$tardir"'
+    am__untar='tar xf -'
+    ;;
+  pax)
+    am__tar='pax -L -x $1 -w "$$tardir"'
+    am__tar_='pax -L -x $1 -w "$tardir"'
+    am__untar='pax -r'
+    ;;
+  cpio)
+    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+    am__untar='cpio -i -H $1 -d'
+    ;;
+  none)
+    am__tar=false
+    am__tar_=false
+    am__untar=false
+    ;;
+  esac
+
+  # If the value was cached, stop now.  We just wanted to have am__tar
+  # and am__untar set.
+  test -n "${am_cv_prog_tar_$1}" && break
+
+  # tar/untar a dummy directory, and stop if the command works
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  echo GrepMe > conftest.dir/file
+  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+  rm -rf conftest.dir
+  if test -s conftest.tar; then
+    AM_RUN_LOG([$am__untar <conftest.tar])
+    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+  fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/config.guess
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/config.guess	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/config.guess	(revision 24799)
@@ -0,0 +1,1561 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+#   Free Software Foundation, Inc.
+
+timestamp='2009-04-27'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Originally written by Per Bothner <per@bothner.com>.
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int x;" > $dummy.c ;
+	for c in cc gcc c89 c99 ; do
+	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+	     CC_FOR_BUILD="$c"; break ;
+	  fi ;
+	done ;
+	if test x"$CC_FOR_BUILD" = x ; then
+	  CC_FOR_BUILD=no_compiler_found ;
+	fi
+	;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+	# NetBSD (nbsd) targets should (where applicable) match one or
+	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	#
+	# Note: NetBSD doesn't particularly care about the vendor
+	# portion of the name.  We always set it to "unknown".
+	sysctl="sysctl -n hw.machine_arch"
+	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+	case "${UNAME_MACHINE_ARCH}" in
+	    armeb) machine=armeb-unknown ;;
+	    arm*) machine=arm-unknown ;;
+	    sh3el) machine=shl-unknown ;;
+	    sh3eb) machine=sh-unknown ;;
+	    sh5el) machine=sh5le-unknown ;;
+	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+	esac
+	# The Operating System including object format, if it has switched
+	# to ELF recently, or will in the future.
+	case "${UNAME_MACHINE_ARCH}" in
+	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+		eval $set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep __ELF__ >/dev/null
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+	        os=netbsd
+		;;
+	esac
+	# The OS release
+	# Debian GNU/NetBSD machines have a different userland, and
+	# thus, need a distinct triplet. However, they do not need
+	# kernel version information, so it can be replaced with a
+	# suitable tag, in the style of linux-gnu.
+	case "${UNAME_VERSION}" in
+	    Debian*)
+		release='-gnu'
+		;;
+	    *)
+		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+		;;
+	esac
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	echo "${machine}-${os}${release}"
+	exit ;;
+    *:OpenBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+	exit ;;
+    *:ekkoBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+	exit ;;
+    *:SolidBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+	exit ;;
+    macppc:MirBSD:*:*)
+	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    *:MirBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    alpha:OSF1:*:*)
+	case $UNAME_RELEASE in
+	*4.0)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+		;;
+	*5.*)
+	        UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+		;;
+	esac
+	# According to Compaq, /usr/sbin/psrinfo has been available on
+	# OSF/1 and Tru64 systems produced since 1995.  I hope that
+	# covers most systems running today.  This code pipes the CPU
+	# types through head -n 1, so we only detect the type of CPU 0.
+	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+	case "$ALPHA_CPU_TYPE" in
+	    "EV4 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV4.5 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "LCA4 (21066/21068)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV5 (21164)")
+		UNAME_MACHINE="alphaev5" ;;
+	    "EV5.6 (21164A)")
+		UNAME_MACHINE="alphaev56" ;;
+	    "EV5.6 (21164PC)")
+		UNAME_MACHINE="alphapca56" ;;
+	    "EV5.7 (21164PC)")
+		UNAME_MACHINE="alphapca57" ;;
+	    "EV6 (21264)")
+		UNAME_MACHINE="alphaev6" ;;
+	    "EV6.7 (21264A)")
+		UNAME_MACHINE="alphaev67" ;;
+	    "EV6.8CB (21264C)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8AL (21264B)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8CX (21264D)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.9A (21264/EV69A)")
+		UNAME_MACHINE="alphaev69" ;;
+	    "EV7 (21364)")
+		UNAME_MACHINE="alphaev7" ;;
+	    "EV7.9 (21364A)")
+		UNAME_MACHINE="alphaev79" ;;
+	esac
+	# A Pn.n version is a patched version.
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	exit ;;
+    Alpha\ *:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# Should we change UNAME_MACHINE based on the output of uname instead
+	# of the specific Alpha model?
+	echo alpha-pc-interix
+	exit ;;
+    21064:Windows_NT:50:3)
+	echo alpha-dec-winnt3.5
+	exit ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-unknown-sysv4
+	exit ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-amigaos
+	exit ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-morphos
+	exit ;;
+    *:OS/390:*:*)
+	echo i370-ibm-openedition
+	exit ;;
+    *:z/VM:*:*)
+	echo s390-ibm-zvmoe
+	exit ;;
+    *:OS400:*:*)
+        echo powerpc-ibm-os400
+	exit ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit ;;
+    arm:riscos:*:*|arm:RISCOS:*:*)
+	echo arm-unknown-riscos
+	exit ;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit ;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit ;;
+    NILE*:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit ;;
+    DRS?6000:unix:4.0:6*)
+	echo sparc-icl-nx6
+	exit ;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+	case `/usr/bin/uname -p` in
+	    sparc) echo sparc-icl-nx7; exit ;;
+	esac ;;
+    s390x:SunOS:*:*)
+	echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4H:SunOS:5.*:*)
+	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+	eval $set_cc_for_build
+	SUN_ARCH="i386"
+	# If there is a compiler, see if it is configured for 64-bit objects.
+	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+	# This test works for both compilers.
+	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		grep IS_64BIT_ARCH >/dev/null
+	    then
+		SUN_ARCH="x86_64"
+	    fi
+	fi
+	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:*:*)
+	case "`/usr/bin/arch -k`" in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+	exit ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos${UNAME_RELEASE}
+	exit ;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+	case "`/bin/arch`" in
+	    sun3)
+		echo m68k-sun-sunos${UNAME_RELEASE}
+		;;
+	    sun4)
+		echo sparc-sun-sunos${UNAME_RELEASE}
+		;;
+	esac
+	exit ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos${UNAME_RELEASE}
+	exit ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+        exit ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+        echo m68k-milan-mint${UNAME_RELEASE}
+        exit ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+        echo m68k-hades-mint${UNAME_RELEASE}
+        exit ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+        echo m68k-unknown-mint${UNAME_RELEASE}
+        exit ;;
+    m68k:machten:*:*)
+	echo m68k-apple-machten${UNAME_RELEASE}
+	exit ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten${UNAME_RELEASE}
+	exit ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	echo clipper-intergraph-clix${UNAME_RELEASE}
+	exit ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c &&
+	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+	  SYSTEM_NAME=`$dummy $dummyarg` &&
+	    { echo "$SYSTEM_NAME"; exit; }
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit ;;
+    Motorola:PowerMAX_OS:*:*)
+	echo powerpc-motorola-powermax
+	exit ;;
+    Motorola:*:4.3:PL8-*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+	then
+	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+	       [ ${TARGET_BINARY_INTERFACE}x = x ]
+	    then
+		echo m88k-dg-dgux${UNAME_RELEASE}
+	    else
+		echo m88k-dg-dguxbcs${UNAME_RELEASE}
+	    fi
+	else
+	    echo i586-dg-dgux${UNAME_RELEASE}
+	fi
+ 	exit ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+	exit ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
+	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+	echo i386-ibm-aix
+	exit ;;
+    ia64:AIX:*:*)
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		eval $set_cc_for_build
+		sed 's/^		//' << EOF >$dummy.c
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+		then
+			echo "$SYSTEM_NAME"
+		else
+			echo rs6000-ibm-aix3.2.5
+		fi
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		echo rs6000-ibm-aix3.2.4
+	else
+		echo rs6000-ibm-aix3.2
+	fi
+	exit ;;
+    *:AIX:*:[456])
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+	echo romp-ibm-bsd4.4
+	exit ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+	exit ;;                             # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit ;;
+    9000/[34678]??:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+		if [ -x /usr/bin/getconf ]; then
+		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+                    case "${sc_cpu_version}" in
+                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+                      532)                      # CPU_PA_RISC2_0
+                        case "${sc_kernel_bits}" in
+                          32) HP_ARCH="hppa2.0n" ;;
+                          64) HP_ARCH="hppa2.0w" ;;
+			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+                        esac ;;
+                    esac
+		fi
+		if [ "${HP_ARCH}" = "" ]; then
+		    eval $set_cc_for_build
+		    sed 's/^              //' << EOF >$dummy.c
+
+              #define _HPUX_SOURCE
+              #include <stdlib.h>
+              #include <unistd.h>
+
+              int main ()
+              {
+              #if defined(_SC_KERNEL_BITS)
+                  long bits = sysconf(_SC_KERNEL_BITS);
+              #endif
+                  long cpu  = sysconf (_SC_CPU_VERSION);
+
+                  switch (cpu)
+              	{
+              	case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+              	case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+              	case CPU_PA_RISC2_0:
+              #if defined(_SC_KERNEL_BITS)
+              	    switch (bits)
+              		{
+              		case 64: puts ("hppa2.0w"); break;
+              		case 32: puts ("hppa2.0n"); break;
+              		default: puts ("hppa2.0"); break;
+              		} break;
+              #else  /* !defined(_SC_KERNEL_BITS) */
+              	    puts ("hppa2.0"); break;
+              #endif
+              	default: puts ("hppa1.0"); break;
+              	}
+                  exit (0);
+              }
+EOF
+		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+		    test -z "$HP_ARCH" && HP_ARCH=hppa
+		fi ;;
+	esac
+	if [ ${HP_ARCH} = "hppa2.0w" ]
+	then
+	    eval $set_cc_for_build
+
+	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+	    # generating 64-bit code.  GNU and HP use different nomenclature:
+	    #
+	    # $ CC_FOR_BUILD=cc ./config.guess
+	    # => hppa2.0w-hp-hpux11.23
+	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+	    # => hppa64-hp-hpux11.23
+
+	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+		grep __LP64__ >/dev/null
+	    then
+		HP_ARCH="hppa2.0w"
+	    else
+		HP_ARCH="hppa64"
+	    fi
+	fi
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit ;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ia64-hp-hpux${HPUX_REV}
+	exit ;;
+    3050*:HI-UX:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+		{ echo "$SYSTEM_NAME"; exit; }
+	echo unknown-hitachi-hiuxwe2
+	exit ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+	echo hppa1.0-hp-mpeix
+	exit ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit ;;
+    i*86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo ${UNAME_MACHINE}-unknown-osf1mk
+	else
+	    echo ${UNAME_MACHINE}-unknown-osf1
+	fi
+	exit ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+        exit ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+        exit ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+        exit ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+        exit ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+        exit ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*[A-Z]90:*:*:*)
+	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+	      -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*T3E:*:*:*)
+	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*SV1:*:*:*)
+	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    *:UNICOS/mp:*:*)
+	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit ;;
+    5000:UNIX_System_V:4.*:*)
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+	exit ;;
+    sparc*:BSD/OS:*:*)
+	echo sparc-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:FreeBSD:*:*)
+	case ${UNAME_MACHINE} in
+	    pc98)
+		echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    amd64)
+		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    *)
+		echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	esac
+	exit ;;
+    i*:CYGWIN*:*)
+	echo ${UNAME_MACHINE}-pc-cygwin
+	exit ;;
+    *:MINGW*:*)
+	echo ${UNAME_MACHINE}-pc-mingw32
+	exit ;;
+    i*:windows32*:*)
+    	# uname -m includes "-pc" on this system.
+    	echo ${UNAME_MACHINE}-mingw32
+	exit ;;
+    i*:PW*:*)
+	echo ${UNAME_MACHINE}-pc-pw32
+	exit ;;
+    *:Interix*:[3456]*)
+    	case ${UNAME_MACHINE} in
+	    x86)
+		echo i586-pc-interix${UNAME_RELEASE}
+		exit ;;
+	    EM64T | authenticamd | genuineintel)
+		echo x86_64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	    IA64)
+		echo ia64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	esac ;;
+    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+	echo i${UNAME_MACHINE}-pc-mks
+	exit ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+	# UNAME_MACHINE based on the output of uname instead of i386?
+	echo i586-pc-interix
+	exit ;;
+    i*:UWIN*:*)
+	echo ${UNAME_MACHINE}-pc-uwin
+	exit ;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+	echo x86_64-unknown-cygwin
+	exit ;;
+    p*:CYGWIN*:*)
+	echo powerpcle-unknown-cygwin
+	exit ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    *:GNU:*:*)
+	# the GNU system
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit ;;
+    *:GNU/*:*:*)
+	# other systems with GNU libc and userland
+	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+	exit ;;
+    i*86:Minix:*:*)
+	echo ${UNAME_MACHINE}-pc-minix
+	exit ;;
+    arm*:Linux:*:*)
+	eval $set_cc_for_build
+	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+	    | grep -q __ARM_EABI__
+	then
+	    echo ${UNAME_MACHINE}-unknown-linux-gnu
+	else
+	    echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+	fi
+	exit ;;
+    avr32*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    cris:Linux:*:*)
+	echo cris-axis-linux-gnu
+	exit ;;
+    crisv32:Linux:*:*)
+	echo crisv32-axis-linux-gnu
+	exit ;;
+    frv:Linux:*:*)
+    	echo frv-unknown-linux-gnu
+	exit ;;
+    ia64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m32r*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m68*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    mips:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef mips
+	#undef mipsel
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=mipsel
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=mips
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+	    /^CPU/{
+		s: ::g
+		p
+	    }'`"
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+	;;
+    mips64:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef mips64
+	#undef mips64el
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=mips64el
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=mips64
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+	    /^CPU/{
+		s: ::g
+		p
+	    }'`"
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+	;;
+    or32:Linux:*:*)
+	echo or32-unknown-linux-gnu
+	exit ;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-gnu
+	exit ;;
+    ppc64:Linux:*:*)
+	echo powerpc64-unknown-linux-gnu
+	exit ;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev68 ;;
+        esac
+	objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+	exit ;;
+    padre:Linux:*:*)
+	echo sparc-unknown-linux-gnu
+	exit ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
+	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
+	  *)    echo hppa-unknown-linux-gnu ;;
+	esac
+	exit ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-gnu
+	exit ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	echo ${UNAME_MACHINE}-ibm-linux
+	exit ;;
+    sh64*:Linux:*:*)
+    	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    sh*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    vax:Linux:*:*)
+	echo ${UNAME_MACHINE}-dec-linux-gnu
+	exit ;;
+    x86_64:Linux:*:*)
+	echo x86_64-unknown-linux-gnu
+	exit ;;
+    xtensa*:Linux:*:*)
+    	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    i*86:Linux:*:*)
+	# The BFD linker knows what the default object file format is, so
+	# first see if it will tell us. cd to the root directory to prevent
+	# problems with other programs or directories called `ld' in the path.
+	# Set LC_ALL=C to ensure ld outputs messages in English.
+	ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+			 | sed -ne '/supported targets:/!d
+				    s/[ 	][ 	]*/ /g
+				    s/.*supported targets: *//
+				    s/ .*//
+				    p'`
+        case "$ld_supported_targets" in
+	  elf32-i386)
+		TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+		;;
+	  a.out-i386-linux)
+		echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+		exit ;;
+	  "")
+		# Either a pre-BFD a.out linker (linux-gnuoldld) or
+		# one that does not give us useful --help.
+		echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+		exit ;;
+	esac
+	# Determine whether the default compiler is a.out or elf
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <features.h>
+	#ifdef __ELF__
+	# ifdef __GLIBC__
+	#  if __GLIBC__ >= 2
+	LIBC=gnu
+	#  else
+	LIBC=gnulibc1
+	#  endif
+	# else
+	LIBC=gnulibc1
+	# endif
+	#else
+	#if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+	LIBC=gnu
+	#else
+	LIBC=gnuaout
+	#endif
+	#endif
+	#ifdef __dietlibc__
+	LIBC=dietlibc
+	#endif
+EOF
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+	    /^LIBC/{
+		s: ::g
+		p
+	    }'`"
+	test x"${LIBC}" != x && {
+		echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+		exit
+	}
+	test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
+	;;
+    i*86:DYNIX/ptx:4*:*)
+	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+	# earlier versions are messed up and put the nodename in both
+	# sysname and nodename.
+	echo i386-sequent-sysv4
+	exit ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+        # Unixware is an offshoot of SVR4, but it has its own version
+        # number series starting with 2...
+        # I am not positive that other SVR4 systems won't match this,
+	# I just have to hope.  -- rms.
+        # Use sysv4.2uw... so that sysv4* matches it.
+	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+	exit ;;
+    i*86:OS/2:*:*)
+	# If we were able to find `uname', then EMX Unix compatibility
+	# is probably installed.
+	echo ${UNAME_MACHINE}-pc-os2-emx
+	exit ;;
+    i*86:XTS-300:*:STOP)
+	echo ${UNAME_MACHINE}-unknown-stop
+	exit ;;
+    i*86:atheos:*:*)
+	echo ${UNAME_MACHINE}-unknown-atheos
+	exit ;;
+    i*86:syllable:*:*)
+	echo ${UNAME_MACHINE}-pc-syllable
+	exit ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+	echo i386-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    i*86:*DOS:*:*)
+	echo ${UNAME_MACHINE}-pc-msdosdjgpp
+	exit ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+	else
+		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+	fi
+	exit ;;
+    i*86:*:5:[678]*)
+    	# UnixWare 7.x, OpenUNIX and OpenServer 6.
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	exit ;;
+    i*86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-pc-sysv32
+	fi
+	exit ;;
+    pc:*:*:*)
+	# Left here for compatibility:
+        # uname -m prints for DJGPP always 'pc', but it prints nothing about
+        # the processor, so we play safe by assuming i586.
+	# Note: whatever this is, it MUST be the same as what config.sub
+	# prints for the "djgpp" host, or else GDB configury will decide that
+	# this is a cross-build.
+	echo i586-pc-msdosdjgpp
+        exit ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit ;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	fi
+	exit ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+	echo m68k-convergent-sysv
+	exit ;;
+    M680?0:D-NIX:5.3:*)
+	echo m68k-diab-dnix
+	exit ;;
+    M68*:*:R3V[5678]*:*)
+	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && { echo i486-ncr-sysv4; exit; } ;;
+    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+	OS_REL='.3'
+	test -r /etc/.relid \
+	    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+	echo m68k-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    rs6000:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+	echo powerpc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv${UNAME_RELEASE}
+	exit ;;
+    RM*:ReliantUNIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		echo ${UNAME_MACHINE}-sni-sysv4
+	else
+		echo ns32k-sni-sysv
+	fi
+	exit ;;
+    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                      # says <Richard.M.Bartel@ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes@openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit ;;
+    *:*:*:FTX*)
+	# From seanf@swdc.stratus.com.
+	echo i860-stratus-sysv4
+	exit ;;
+    i*86:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo ${UNAME_MACHINE}-stratus-vos
+	exit ;;
+    *:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo hppa1.1-stratus-vos
+	exit ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux${UNAME_RELEASE}
+	exit ;;
+    news*:NEWS-OS:6*:*)
+	echo mips-sony-newsos6
+	exit ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+	if [ -d /usr/nec ]; then
+	        echo mips-nec-sysv${UNAME_RELEASE}
+	else
+	        echo mips-unknown-sysv${UNAME_RELEASE}
+	fi
+        exit ;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	echo powerpc-be-beos
+	exit ;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	echo powerpc-apple-beos
+	exit ;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	echo i586-pc-beos
+	exit ;;
+    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
+	echo i586-pc-haiku
+	exit ;;
+    SX-4:SUPER-UX:*:*)
+	echo sx4-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-5:SUPER-UX:*:*)
+	echo sx5-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-6:SUPER-UX:*:*)
+	echo sx6-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-7:SUPER-UX:*:*)
+	echo sx7-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8:SUPER-UX:*:*)
+	echo sx8-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8R:SUPER-UX:*:*)
+	echo sx8r-nec-superux${UNAME_RELEASE}
+	exit ;;
+    Power*:Rhapsody:*:*)
+	echo powerpc-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Rhapsody:*:*)
+	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Darwin:*:*)
+	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+	case $UNAME_PROCESSOR in
+	    unknown) UNAME_PROCESSOR=powerpc ;;
+	esac
+	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+	exit ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	UNAME_PROCESSOR=`uname -p`
+	if test "$UNAME_PROCESSOR" = "x86"; then
+		UNAME_PROCESSOR=i386
+		UNAME_MACHINE=pc
+	fi
+	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+	exit ;;
+    *:QNX:*:4*)
+	echo i386-pc-qnx
+	exit ;;
+    NSE-?:NONSTOP_KERNEL:*:*)
+	echo nse-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSR-?:NONSTOP_KERNEL:*:*)
+	echo nsr-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    *:NonStop-UX:*:*)
+	echo mips-compaq-nonstopux
+	exit ;;
+    BS2000:POSIX*:*:*)
+	echo bs2000-siemens-sysv
+	exit ;;
+    DS/*:UNIX_System_V:*:*)
+	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+	exit ;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	if test "$cputype" = "386"; then
+	    UNAME_MACHINE=i386
+	else
+	    UNAME_MACHINE="$cputype"
+	fi
+	echo ${UNAME_MACHINE}-unknown-plan9
+	exit ;;
+    *:TOPS-10:*:*)
+	echo pdp10-unknown-tops10
+	exit ;;
+    *:TENEX:*:*)
+	echo pdp10-unknown-tenex
+	exit ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	echo pdp10-dec-tops20
+	exit ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	echo pdp10-xkl-tops20
+	exit ;;
+    *:TOPS-20:*:*)
+	echo pdp10-unknown-tops20
+	exit ;;
+    *:ITS:*:*)
+	echo pdp10-unknown-its
+	exit ;;
+    SEI:*:*:SEIUX)
+        echo mips-sei-seiux${UNAME_RELEASE}
+	exit ;;
+    *:DragonFly:*:*)
+	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit ;;
+    *:*VMS:*:*)
+    	UNAME_MACHINE=`(uname -p) 2>/dev/null`
+	case "${UNAME_MACHINE}" in
+	    A*) echo alpha-dec-vms ; exit ;;
+	    I*) echo ia64-dec-vms ; exit ;;
+	    V*) echo vax-dec-vms ; exit ;;
+	esac ;;
+    *:XENIX:*:SysV)
+	echo i386-pc-xenix
+	exit ;;
+    i*86:skyos:*:*)
+	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+	exit ;;
+    i*86:rdos:*:*)
+	echo ${UNAME_MACHINE}-pc-rdos
+	exit ;;
+    i*86:AROS:*:*)
+	echo ${UNAME_MACHINE}-pc-aros
+	exit ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+          "4"
+#else
+	  ""
+#endif
+         ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+	printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+	printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# else
+    printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+	{ echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+	echo c1-convex-bsd
+	exit ;;
+    c2*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit ;;
+    c34*)
+	echo c34-convex-bsd
+	exit ;;
+    c38*)
+	echo c38-convex-bsd
+	exit ;;
+    c4*)
+	echo c4-convex-bsd
+	exit ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+and
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/config.sub
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/config.sub	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/config.sub	(revision 24799)
@@ -0,0 +1,1686 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+#   Free Software Foundation, Inc.
+
+timestamp='2009-04-17'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
+  uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
+  kopensolaris*-gnu* | \
+  storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+	-sun*os*)
+		# Prevent following clause from handling this invalid input.
+		;;
+	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+	-apple | -axis | -knuth | -cray)
+		os=
+		basic_machine=$1
+		;;
+	-sim | -cisco | -oki | -wec | -winbond)
+		os=
+		basic_machine=$1
+		;;
+	-scout)
+		;;
+	-wrs)
+		os=-vxworks
+		basic_machine=$1
+		;;
+	-chorusos*)
+		os=-chorusos
+		basic_machine=$1
+		;;
+ 	-chorusrdb)
+ 		os=-chorusrdb
+		basic_machine=$1
+ 		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco6)
+		os=-sco5v6
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5)
+		os=-sco3.2v5
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5v6*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-udk*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-lynx*)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-windowsnt*)
+		os=`echo $os | sed -e 's/windowsnt/winnt/'`
+		;;
+	-psos*)
+		os=-psos
+		;;
+	-mint | -mint[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+	# Recognize the basic CPU types without company name.
+	# Some are omitted here because they have special meanings below.
+	1750a | 580 \
+	| a29k \
+	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+	| am33_2.0 \
+	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+	| bfin \
+	| c4x | clipper \
+	| d10v | d30v | dlx | dsp16xx \
+	| fido | fr30 | frv \
+	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| i370 | i860 | i960 | ia64 \
+	| ip2k | iq2000 \
+	| lm32 \
+	| m32c | m32r | m32rle | m68000 | m68k | m88k \
+	| maxq | mb | microblaze | mcore | mep | metag \
+	| mips | mipsbe | mipseb | mipsel | mipsle \
+	| mips16 \
+	| mips64 | mips64el \
+	| mips64octeon | mips64octeonel \
+	| mips64orion | mips64orionel \
+	| mips64r5900 | mips64r5900el \
+	| mips64vr | mips64vrel \
+	| mips64vr4100 | mips64vr4100el \
+	| mips64vr4300 | mips64vr4300el \
+	| mips64vr5000 | mips64vr5000el \
+	| mips64vr5900 | mips64vr5900el \
+	| mipsisa32 | mipsisa32el \
+	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa64 | mipsisa64el \
+	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64sb1 | mipsisa64sb1el \
+	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipstx39 | mipstx39el \
+	| mn10200 | mn10300 \
+	| moxie \
+	| mt \
+	| msp430 \
+	| nios | nios2 \
+	| ns16k | ns32k \
+	| or32 \
+	| pdp10 | pdp11 | pj | pjl \
+	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+	| pyramid \
+	| score \
+	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+	| sh64 | sh64le \
+	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+	| spu | strongarm \
+	| tahoe | thumb | tic4x | tic80 | tron \
+	| v850 | v850e \
+	| we32k \
+	| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
+	| z8k | z80)
+		basic_machine=$basic_machine-unknown
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12)
+		# Motorola 68HC11/12.
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+		;;
+	ms1)
+		basic_machine=mt-unknown
+		;;
+
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i*86 | x86_64)
+	  basic_machine=$basic_machine-pc
+	  ;;
+	# Object if more than one company name word.
+	*-*-*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+	# Recognize the basic CPU types with company name.
+	580-* \
+	| a29k-* \
+	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+	| avr-* | avr32-* \
+	| bfin-* | bs2000-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+	| clipper-* | craynv-* | cydra-* \
+	| d10v-* | d30v-* | dlx-* \
+	| elxsi-* \
+	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+	| h8300-* | h8500-* \
+	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| i*86-* | i860-* | i960-* | ia64-* \
+	| ip2k-* | iq2000-* \
+	| lm32-* \
+	| m32c-* | m32r-* | m32rle-* \
+	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
+	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+	| mips16-* \
+	| mips64-* | mips64el-* \
+	| mips64octeon-* | mips64octeonel-* \
+	| mips64orion-* | mips64orionel-* \
+	| mips64r5900-* | mips64r5900el-* \
+	| mips64vr-* | mips64vrel-* \
+	| mips64vr4100-* | mips64vr4100el-* \
+	| mips64vr4300-* | mips64vr4300el-* \
+	| mips64vr5000-* | mips64vr5000el-* \
+	| mips64vr5900-* | mips64vr5900el-* \
+	| mipsisa32-* | mipsisa32el-* \
+	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa64-* | mipsisa64el-* \
+	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64sb1-* | mipsisa64sb1el-* \
+	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipstx39-* | mipstx39el-* \
+	| mmix-* \
+	| mt-* \
+	| msp430-* \
+	| nios-* | nios2-* \
+	| none-* | np1-* | ns16k-* | ns32k-* \
+	| orion-* \
+	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+	| pyramid-* \
+	| romp-* | rs6000-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+	| sparclite-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
+	| tahoe-* | thumb-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \
+	| tron-* \
+	| v850-* | v850e-* | vax-* \
+	| we32k-* \
+	| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
+	| xstormy16-* | xtensa*-* \
+	| ymp-* \
+	| z8k-* | z80-*)
+		;;
+	# Recognize the basic CPU types without company name, with glob match.
+	xtensa*)
+		basic_machine=$basic_machine-unknown
+		;;
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	386bsd)
+		basic_machine=i386-unknown
+		os=-bsd
+		;;
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		basic_machine=m68000-att
+		;;
+	3b*)
+		basic_machine=we32k-att
+		;;
+	a29khif)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+    	abacus)
+		basic_machine=abacus-unknown
+		;;
+	adobe68k)
+		basic_machine=m68010-adobe
+		os=-scout
+		;;
+	alliant | fx80)
+		basic_machine=fx80-alliant
+		;;
+	altos | altos3068)
+		basic_machine=m68k-altos
+		;;
+	am29k)
+		basic_machine=a29k-none
+		os=-bsd
+		;;
+	amd64)
+		basic_machine=x86_64-pc
+		;;
+	amd64-*)
+		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	amdahl)
+		basic_machine=580-amdahl
+		os=-sysv
+		;;
+	amiga | amiga-*)
+		basic_machine=m68k-unknown
+		;;
+	amigaos | amigados)
+		basic_machine=m68k-unknown
+		os=-amigaos
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-unknown
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	apollo68bsd)
+		basic_machine=m68k-apollo
+		os=-bsd
+		;;
+	aros)
+		basic_machine=i386-pc
+		os=-aros
+		;;
+	aux)
+		basic_machine=m68k-apple
+		os=-aux
+		;;
+	balance)
+		basic_machine=ns32k-sequent
+		os=-dynix
+		;;
+	blackfin)
+		basic_machine=bfin-unknown
+		os=-linux
+		;;
+	blackfin-*)
+		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	c90)
+		basic_machine=c90-cray
+		os=-unicos
+		;;
+        cegcc)
+		basic_machine=arm-unknown
+		os=-cegcc
+		;;
+	convex-c1)
+		basic_machine=c1-convex
+		os=-bsd
+		;;
+	convex-c2)
+		basic_machine=c2-convex
+		os=-bsd
+		;;
+	convex-c32)
+		basic_machine=c32-convex
+		os=-bsd
+		;;
+	convex-c34)
+		basic_machine=c34-convex
+		os=-bsd
+		;;
+	convex-c38)
+		basic_machine=c38-convex
+		os=-bsd
+		;;
+	cray | j90)
+		basic_machine=j90-cray
+		os=-unicos
+		;;
+	craynv)
+		basic_machine=craynv-cray
+		os=-unicosmp
+		;;
+	cr16)
+		basic_machine=cr16-unknown
+		os=-elf
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	crisv32 | crisv32-* | etraxfs*)
+		basic_machine=crisv32-axis
+		;;
+	cris | cris-* | etrax*)
+		basic_machine=cris-axis
+		;;
+	crx)
+		basic_machine=crx-unknown
+		os=-elf
+		;;
+	da30 | da30-*)
+		basic_machine=m68k-da30
+		;;
+	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+		basic_machine=mips-dec
+		;;
+	decsystem10* | dec10*)
+		basic_machine=pdp10-dec
+		os=-tops10
+		;;
+	decsystem20* | dec20*)
+		basic_machine=pdp10-dec
+		os=-tops20
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		basic_machine=m68k-motorola
+		;;
+	delta88)
+		basic_machine=m88k-motorola
+		os=-sysv3
+		;;
+	dicos)
+		basic_machine=i686-pc
+		os=-dicos
+		;;
+	djgpp)
+		basic_machine=i586-pc
+		os=-msdosdjgpp
+		;;
+	dpx20 | dpx20-*)
+		basic_machine=rs6000-bull
+		os=-bosx
+		;;
+	dpx2* | dpx2*-bull)
+		basic_machine=m68k-bull
+		os=-sysv3
+		;;
+	ebmon29k)
+		basic_machine=a29k-amd
+		os=-ebmon
+		;;
+	elxsi)
+		basic_machine=elxsi-elxsi
+		os=-bsd
+		;;
+	encore | umax | mmax)
+		basic_machine=ns32k-encore
+		;;
+	es1800 | OSE68k | ose68k | ose | OSE)
+		basic_machine=m68k-ericsson
+		os=-ose
+		;;
+	fx2800)
+		basic_machine=i860-alliant
+		;;
+	genix)
+		basic_machine=ns32k-ns
+		;;
+	gmicro)
+		basic_machine=tron-gmicro
+		os=-sysv
+		;;
+	go32)
+		basic_machine=i386-pc
+		os=-go32
+		;;
+	h3050r* | hiux*)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	h8300hms)
+		basic_machine=h8300-hitachi
+		os=-hms
+		;;
+	h8300xray)
+		basic_machine=h8300-hitachi
+		os=-xray
+		;;
+	h8500hms)
+		basic_machine=h8500-hitachi
+		os=-hms
+		;;
+	harris)
+		basic_machine=m88k-harris
+		os=-sysv3
+		;;
+	hp300-*)
+		basic_machine=m68k-hp
+		;;
+	hp300bsd)
+		basic_machine=m68k-hp
+		os=-bsd
+		;;
+	hp300hpux)
+		basic_machine=m68k-hp
+		os=-hpux
+		;;
+	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		basic_machine=m68000-hp
+		;;
+	hp9k3[2-9][0-9])
+		basic_machine=m68k-hp
+		;;
+	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k78[0-9] | hp78[0-9])
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][13679] | hp8[0-9][13679])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hppa-next)
+		os=-nextstep3
+		;;
+	hppaosf)
+		basic_machine=hppa1.1-hp
+		os=-osf
+		;;
+	hppro)
+		basic_machine=hppa1.1-hp
+		os=-proelf
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+	i*86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv32
+		;;
+	i*86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv4
+		;;
+	i*86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv
+		;;
+	i*86sol2)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-solaris2
+		;;
+	i386mach)
+		basic_machine=i386-mach
+		os=-mach
+		;;
+	i386-vsta | vsta)
+		basic_machine=i386-unknown
+		os=-vsta
+		;;
+	iris | iris4d)
+		basic_machine=mips-sgi
+		case $os in
+		    -irix*)
+			;;
+		    *)
+			os=-irix4
+			;;
+		esac
+		;;
+	isi68 | isi)
+		basic_machine=m68k-isi
+		os=-sysv
+		;;
+	m68knommu)
+		basic_machine=m68k-unknown
+		os=-linux
+		;;
+	m68knommu-*)
+		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	m88k-omron*)
+		basic_machine=m88k-omron
+		;;
+	magnum | m3230)
+		basic_machine=mips-mips
+		os=-sysv
+		;;
+	merlin)
+		basic_machine=ns32k-utek
+		os=-sysv
+		;;
+	mingw32)
+		basic_machine=i386-pc
+		os=-mingw32
+		;;
+	mingw32ce)
+		basic_machine=arm-unknown
+		os=-mingw32ce
+		;;
+	miniframe)
+		basic_machine=m68000-convergent
+		;;
+	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+	mips3*-*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	monitor)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	morphos)
+		basic_machine=powerpc-unknown
+		os=-morphos
+		;;
+	msdos)
+		basic_machine=i386-pc
+		os=-msdos
+		;;
+	ms1-*)
+		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+		;;
+	mvs)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	netbsd386)
+		basic_machine=i386-unknown
+		os=-netbsd
+		;;
+	netwinder)
+		basic_machine=armv4l-rebel
+		os=-linux
+		;;
+	news | news700 | news800 | news900)
+		basic_machine=m68k-sony
+		os=-newsos
+		;;
+	news1000)
+		basic_machine=m68030-sony
+		os=-newsos
+		;;
+	news-3600 | risc-news)
+		basic_machine=mips-sony
+		os=-newsos
+		;;
+	necv70)
+		basic_machine=v70-nec
+		os=-sysv
+		;;
+	next | m*-next )
+		basic_machine=m68k-next
+		case $os in
+		    -nextstep* )
+			;;
+		    -ns2*)
+		      os=-nextstep2
+			;;
+		    *)
+		      os=-nextstep3
+			;;
+		esac
+		;;
+	nh3000)
+		basic_machine=m68k-harris
+		os=-cxux
+		;;
+	nh[45]000)
+		basic_machine=m88k-harris
+		os=-cxux
+		;;
+	nindy960)
+		basic_machine=i960-intel
+		os=-nindy
+		;;
+	mon960)
+		basic_machine=i960-intel
+		os=-mon960
+		;;
+	nonstopux)
+		basic_machine=mips-compaq
+		os=-nonstopux
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	nsr-tandem)
+		basic_machine=nsr-tandem
+		;;
+	op50n-* | op60c-*)
+		basic_machine=hppa1.1-oki
+		os=-proelf
+		;;
+	openrisc | openrisc-*)
+		basic_machine=or32-unknown
+		;;
+	os400)
+		basic_machine=powerpc-ibm
+		os=-os400
+		;;
+	OSE68000 | ose68000)
+		basic_machine=m68000-ericsson
+		os=-ose
+		;;
+	os68k)
+		basic_machine=m68k-none
+		os=-os68k
+		;;
+	pa-hitachi)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	paragon)
+		basic_machine=i860-intel
+		os=-osf
+		;;
+	parisc)
+		basic_machine=hppa-unknown
+		os=-linux
+		;;
+	parisc-*)
+		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	pbd)
+		basic_machine=sparc-tti
+		;;
+	pbb)
+		basic_machine=m68k-tti
+		;;
+	pc532 | pc532-*)
+		basic_machine=ns32k-pc532
+		;;
+	pc98)
+		basic_machine=i386-pc
+		;;
+	pc98-*)
+		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium | p5 | k5 | k6 | nexgen | viac3)
+		basic_machine=i586-pc
+		;;
+	pentiumpro | p6 | 6x86 | athlon | athlon_*)
+		basic_machine=i686-pc
+		;;
+	pentiumii | pentium2 | pentiumiii | pentium3)
+		basic_machine=i686-pc
+		;;
+	pentium4)
+		basic_machine=i786-pc
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium4-*)
+		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=power-ibm
+		;;
+	ppc)	basic_machine=powerpc-unknown
+		;;
+	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppcle | powerpclittle | ppc-le | powerpc-little)
+		basic_machine=powerpcle-unknown
+		;;
+	ppcle-* | powerpclittle-*)
+		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64)	basic_machine=powerpc64-unknown
+		;;
+	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+		basic_machine=powerpc64le-unknown
+		;;
+	ppc64le-* | powerpc64little-*)
+		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	pw32)
+		basic_machine=i586-unknown
+		os=-pw32
+		;;
+	rdos)
+		basic_machine=i386-pc
+		os=-rdos
+		;;
+	rom68k)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	rm[46]00)
+		basic_machine=mips-siemens
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	s390 | s390-*)
+		basic_machine=s390-ibm
+		;;
+	s390x | s390x-*)
+		basic_machine=s390x-ibm
+		;;
+	sa29200)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	sb1)
+		basic_machine=mipsisa64sb1-unknown
+		;;
+	sb1el)
+		basic_machine=mipsisa64sb1el-unknown
+		;;
+	sde)
+		basic_machine=mipsisa32-sde
+		os=-elf
+		;;
+	sei)
+		basic_machine=mips-sei
+		os=-seiux
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sh5el)
+		basic_machine=sh5le-unknown
+		;;
+	sh64)
+		basic_machine=sh64-unknown
+		;;
+	sparclite-wrs | simso-wrs)
+		basic_machine=sparclite-wrs
+		os=-vxworks
+		;;
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
+		;;
+	spur)
+		basic_machine=spur-unknown
+		;;
+	st2000)
+		basic_machine=m68k-tandem
+		;;
+	stratus)
+		basic_machine=i860-stratus
+		os=-sysv4
+		;;
+	sun2)
+		basic_machine=m68000-sun
+		;;
+	sun2os3)
+		basic_machine=m68000-sun
+		os=-sunos3
+		;;
+	sun2os4)
+		basic_machine=m68000-sun
+		os=-sunos4
+		;;
+	sun3os3)
+		basic_machine=m68k-sun
+		os=-sunos3
+		;;
+	sun3os4)
+		basic_machine=m68k-sun
+		os=-sunos4
+		;;
+	sun4os3)
+		basic_machine=sparc-sun
+		os=-sunos3
+		;;
+	sun4os4)
+		basic_machine=sparc-sun
+		os=-sunos4
+		;;
+	sun4sol2)
+		basic_machine=sparc-sun
+		os=-solaris2
+		;;
+	sun3 | sun3-*)
+		basic_machine=m68k-sun
+		;;
+	sun4)
+		basic_machine=sparc-sun
+		;;
+	sun386 | sun386i | roadrunner)
+		basic_machine=i386-sun
+		;;
+	sv1)
+		basic_machine=sv1-cray
+		os=-unicos
+		;;
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
+		;;
+	t3e)
+		basic_machine=alphaev5-cray
+		os=-unicos
+		;;
+	t90)
+		basic_machine=t90-cray
+		os=-unicos
+		;;
+	tic54x | c54x*)
+		basic_machine=tic54x-unknown
+		os=-coff
+		;;
+	tic55x | c55x*)
+		basic_machine=tic55x-unknown
+		os=-coff
+		;;
+	tic6x | c6x*)
+		basic_machine=tic6x-unknown
+		os=-coff
+		;;
+	tile*)
+		basic_machine=tile-unknown
+		os=-linux-gnu
+		;;
+	tx39)
+		basic_machine=mipstx39-unknown
+		;;
+	tx39el)
+		basic_machine=mipstx39el-unknown
+		;;
+	toad1)
+		basic_machine=pdp10-xkl
+		os=-tops20
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	tpf)
+		basic_machine=s390x-ibm
+		os=-tpf
+		;;
+	udi29k)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
+		;;
+	v810 | necv810)
+		basic_machine=v810-nec
+		os=-none
+		;;
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
+		;;
+	vms)
+		basic_machine=vax-dec
+		os=-vms
+		;;
+	vpp*|vx|vx-*)
+		basic_machine=f301-fujitsu
+		;;
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
+		;;
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
+		;;
+	vxworks29k)
+		basic_machine=a29k-wrs
+		os=-vxworks
+		;;
+	w65*)
+		basic_machine=w65-wdc
+		os=-none
+		;;
+	w89k-*)
+		basic_machine=hppa1.1-winbond
+		os=-proelf
+		;;
+	xbox)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	z8k-*-coff)
+		basic_machine=z8k-unknown
+		os=-sim
+		;;
+	z80-*-coff)
+		basic_machine=z80-unknown
+		os=-sim
+		;;
+	none)
+		basic_machine=none-none
+		os=-none
+		;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		basic_machine=hppa1.1-winbond
+		;;
+	op50n)
+		basic_machine=hppa1.1-oki
+		;;
+	op60c)
+		basic_machine=hppa1.1-oki
+		;;
+	romp)
+		basic_machine=romp-ibm
+		;;
+	mmix)
+		basic_machine=mmix-knuth
+		;;
+	rs6000)
+		basic_machine=rs6000-ibm
+		;;
+	vax)
+		basic_machine=vax-dec
+		;;
+	pdp10)
+		# there are many clones, so DEC is not a safe bet
+		basic_machine=pdp10-unknown
+		;;
+	pdp11)
+		basic_machine=pdp11-dec
+		;;
+	we32k)
+		basic_machine=we32k-att
+		;;
+	sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
+		basic_machine=sh-unknown
+		;;
+	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+		basic_machine=sparc-sun
+		;;
+	cydra)
+		basic_machine=cydra-cydrome
+		;;
+	orion)
+		basic_machine=orion-highlevel
+		;;
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	mac | mpw | mac-mpw)
+		basic_machine=m68k-apple
+		;;
+	pmac | pmac-mpw)
+		basic_machine=powerpc-apple
+		;;
+	*-unknown)
+		# Make sure to match an already-canonicalized machine name.
+		;;
+	*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+	*-digital*)
+		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+		;;
+	*-commodore*)
+		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+        # First match some system type aliases
+        # that might get confused with valid system types.
+	# -solaris* is a basic system type, with this one exception.
+	-solaris1 | -solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	-solaris)
+		os=-solaris2
+		;;
+	-svr4*)
+		os=-sysv4
+		;;
+	-unixware*)
+		os=-sysv4.2uw
+		;;
+	-gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+		;;
+	# First accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST END IN A *, to match a version number.
+	# -sysv* is not here because it comes later, after sysvr4.
+	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+	      | -kopensolaris* \
+	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+	      | -aos* | -aros* \
+	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+	      | -openbsd* | -solidbsd* \
+	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+	      | -chorusos* | -chorusrdb* | -cegcc* \
+	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	-qnx*)
+		case $basic_machine in
+		    x86-* | i*86-*)
+			;;
+		    *)
+			os=-nto$os
+			;;
+		esac
+		;;
+	-nto-qnx*)
+		;;
+	-nto*)
+		os=`echo $os | sed -e 's|nto|nto-qnx|'`
+		;;
+	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+		;;
+	-mac*)
+		os=`echo $os | sed -e 's|mac|macos|'`
+		;;
+	-linux-dietlibc)
+		os=-linux-dietlibc
+		;;
+	-linux*)
+		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+		;;
+	-sunos5*)
+		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+		;;
+	-sunos6*)
+		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+		;;
+	-opened*)
+		os=-openedition
+		;;
+        -os400*)
+		os=-os400
+		;;
+	-wince*)
+		os=-wince
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-atheos*)
+		os=-atheos
+		;;
+	-syllable*)
+		os=-syllable
+		;;
+	-386bsd)
+		os=-bsd
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	-nova*)
+		os=-rtmk-nova
+		;;
+	-ns2 )
+		os=-nextstep2
+		;;
+	-nsk*)
+		os=-nsk
+		;;
+	# Preserve the version number of sinix5.
+	-sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	-sinix*)
+		os=-sysv4
+		;;
+        -tpf*)
+		os=-tpf
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-svr4)
+		os=-sysv4
+		;;
+	-svr3)
+		os=-sysv3
+		;;
+	-sysvr4)
+		os=-sysv4
+		;;
+	# This must come after -sysvr4.
+	-sysv*)
+		;;
+	-ose*)
+		os=-ose
+		;;
+	-es1800*)
+		os=-ose
+		;;
+	-xenix)
+		os=-xenix
+		;;
+	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+		os=-mint
+		;;
+	-aros*)
+		os=-aros
+		;;
+	-kaos*)
+		os=-kaos
+		;;
+	-zvmoe)
+		os=-zvmoe
+		;;
+	-dicos*)
+		os=-dicos
+		;;
+	-none)
+		;;
+	*)
+		# Get rid of the `-' at the beginning of $os.
+		os=`echo $os | sed 's/[^-]*-//'`
+		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+		exit 1
+		;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+        score-*)
+		os=-elf
+		;;
+        spu-*)
+		os=-elf
+		;;
+	*-acorn)
+		os=-riscix1.2
+		;;
+	arm*-rebel)
+		os=-linux
+		;;
+	arm*-semi)
+		os=-aout
+		;;
+        c4x-* | tic4x-*)
+        	os=-coff
+		;;
+	# This must come before the *-dec entry.
+	pdp10-*)
+		os=-tops20
+		;;
+	pdp11-*)
+		os=-none
+		;;
+	*-dec | vax-*)
+		os=-ultrix4.2
+		;;
+	m68*-apollo)
+		os=-domain
+		;;
+	i386-sun)
+		os=-sunos4.0.2
+		;;
+	m68000-sun)
+		os=-sunos3
+		# This also exists in the configure program, but was not the
+		# default.
+		# os=-sunos4
+		;;
+	m68*-cisco)
+		os=-aout
+		;;
+        mep-*)
+		os=-elf
+		;;
+	mips*-cisco)
+		os=-elf
+		;;
+	mips*-*)
+		os=-elf
+		;;
+	or32-*)
+		os=-coff
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	*-be)
+		os=-beos
+		;;
+	*-haiku)
+		os=-haiku
+		;;
+	*-ibm)
+		os=-aix
+		;;
+    	*-knuth)
+		os=-mmixware
+		;;
+	*-wec)
+		os=-proelf
+		;;
+	*-winbond)
+		os=-proelf
+		;;
+	*-oki)
+		os=-proelf
+		;;
+	*-hp)
+		os=-hpux
+		;;
+	*-hitachi)
+		os=-hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=-sysv
+		;;
+	*-cbm)
+		os=-amigaos
+		;;
+	*-dg)
+		os=-dgux
+		;;
+	*-dolphin)
+		os=-sysv3
+		;;
+	m68k-ccur)
+		os=-rtu
+		;;
+	m88k-omron*)
+		os=-luna
+		;;
+	*-next )
+		os=-nextstep
+		;;
+	*-sequent)
+		os=-ptx
+		;;
+	*-crds)
+		os=-unos
+		;;
+	*-ns)
+		os=-genix
+		;;
+	i370-*)
+		os=-mvs
+		;;
+	*-next)
+		os=-nextstep3
+		;;
+	*-gould)
+		os=-sysv
+		;;
+	*-highlevel)
+		os=-bsd
+		;;
+	*-encore)
+		os=-bsd
+		;;
+	*-sgi)
+		os=-irix
+		;;
+	*-siemens)
+		os=-sysv4
+		;;
+	*-masscomp)
+		os=-rtu
+		;;
+	f30[01]-fujitsu | f700-fujitsu)
+		os=-uxpv
+		;;
+	*-rom68k)
+		os=-coff
+		;;
+	*-*bug)
+		os=-coff
+		;;
+	*-apple)
+		os=-macos
+		;;
+	*-atari*)
+		os=-mint
+		;;
+	*)
+		os=-none
+		;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+	*-unknown)
+		case $os in
+			-riscix*)
+				vendor=acorn
+				;;
+			-sunos*)
+				vendor=sun
+				;;
+			-aix*)
+				vendor=ibm
+				;;
+			-beos*)
+				vendor=be
+				;;
+			-hpux*)
+				vendor=hp
+				;;
+			-mpeix*)
+				vendor=hp
+				;;
+			-hiux*)
+				vendor=hitachi
+				;;
+			-unos*)
+				vendor=crds
+				;;
+			-dgux*)
+				vendor=dg
+				;;
+			-luna*)
+				vendor=omron
+				;;
+			-genix*)
+				vendor=ns
+				;;
+			-mvs* | -opened*)
+				vendor=ibm
+				;;
+			-os400*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+			-tpf*)
+				vendor=ibm
+				;;
+			-vxsim* | -vxworks* | -windiss*)
+				vendor=wrs
+				;;
+			-aux*)
+				vendor=apple
+				;;
+			-hms*)
+				vendor=hitachi
+				;;
+			-mpw* | -macos*)
+				vendor=apple
+				;;
+			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+				vendor=atari
+				;;
+			-vos*)
+				vendor=stratus
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/configure
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/configure	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/configure	(revision 24799)
@@ -0,0 +1,5177 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.68 for mpiimport 1.0.
+#
+# Report bugs to <jmt12@students.waikato.ac.nz>.
+#
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
+# Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test "x$CONFIG_SHELL" = x; then
+  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+"
+  as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+  exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1"
+  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1"
+  if (eval "$as_required") 2>/dev/null; then :
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  as_found=:
+  case $as_dir in #(
+	 /*)
+	   for as_base in sh bash ksh sh5; do
+	     # Try only shells that exist, to save several forks.
+	     as_shell=$as_dir/$as_base
+	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  CONFIG_SHELL=$as_shell as_have_required=yes
+		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  break 2
+fi
+fi
+	   done;;
+       esac
+  as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+  CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+      if test "x$CONFIG_SHELL" != x; then :
+  # We cannot yet assume a decent shell, so we have to provide a
+	# neutralization value for shells without unset; and this also
+	# works around shells that cannot unset nonexistent variables.
+	# Preserve -v and -x to the replacement shell.
+	BASH_ENV=/dev/null
+	ENV=/dev/null
+	(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+	export CONFIG_SHELL
+	case $- in # ((((
+	  *v*x* | *x*v* ) as_opts=-vx ;;
+	  *v* ) as_opts=-v ;;
+	  *x* ) as_opts=-x ;;
+	  * ) as_opts= ;;
+	esac
+	exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
+fi
+
+    if test x$as_have_required = xno; then :
+  $as_echo "$0: This script requires a shell more modern than all"
+  $as_echo "$0: the shells that I found on your system."
+  if test x${ZSH_VERSION+set} = xset ; then
+    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+  else
+    $as_echo "$0: Please tell bug-autoconf@gnu.org and
+$0: jmt12@students.waikato.ac.nz about your system,
+$0: including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do have one."
+  fi
+  exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+  as_lineno_1=$LINENO as_lineno_1a=$LINENO
+  as_lineno_2=$LINENO as_lineno_2a=$LINENO
+  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+	test -d "$1/.";
+      else
+	case $1 in #(
+	-*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='mpiimport'
+PACKAGE_TARNAME='mpiimport'
+PACKAGE_VERSION='1.0'
+PACKAGE_STRING='mpiimport 1.0'
+PACKAGE_BUGREPORT='jmt12@students.waikato.ac.nz'
+PACKAGE_URL=''
+
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIBOBJS
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+ac_ct_CC
+CFLAGS
+CC
+am__fastdepCXX_FALSE
+am__fastdepCXX_TRUE
+CXXDEPMODE
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__quote
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CXX
+CPPFLAGS
+LDFLAGS
+CXXFLAGS
+CXX
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_dependency_tracking
+'
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CXX
+CXXFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CCC
+CC
+CFLAGS'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *=)   ac_optarg= ;;
+  *)    ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    case $ac_envvar in #(
+      '' | [0-9]* | *[!_$as_cr_alnum]* )
+      as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+    esac
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+  case $enable_option_checking in
+    no) ;;
+    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+  esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
+		datadir sysconfdir sharedstatedir localstatedir includedir \
+		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+		libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  # Remove trailing slashes.
+  case $ac_val in
+    */ )
+      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+      eval $ac_var=\$ac_val;;
+  esac
+  # Be sure to have absolute directory names.
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used" >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_myself" : 'X\(//\)[^/]' \| \
+	 X"$as_myself" : 'X\(//\)$' \| \
+	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+	pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures mpiimport 1.0 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking ...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR            user executables [EPREFIX/bin]
+  --sbindir=DIR           system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR        program executables [EPREFIX/libexec]
+  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --libdir=DIR            object code libraries [EPREFIX/lib]
+  --includedir=DIR        C header files [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
+  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR           info documentation [DATAROOTDIR/info]
+  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR            man documentation [DATAROOTDIR/man]
+  --docdir=DIR            documentation root [DATAROOTDIR/doc/mpiimport]
+  --htmldir=DIR           html documentation [DOCDIR]
+  --dvidir=DIR            dvi documentation [DOCDIR]
+  --pdfdir=DIR            pdf documentation [DOCDIR]
+  --psdir=DIR             ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of mpiimport 1.0:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-option-checking  ignore unrecognized --enable/--with options
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors
+
+Some influential environment variables:
+  CXX         C++ compiler command
+  CXXFLAGS    C++ compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  CC          C compiler command
+  CFLAGS      C compiler flags
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <jmt12@students.waikato.ac.nz>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" ||
+      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+      continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+mpiimport configure 1.0
+generated by GNU Autoconf 2.68
+
+Copyright (C) 2010 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_cxx_try_compile LINENO
+# ----------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_compile
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by mpiimport $as_me 1.0, which was
+generated by GNU Autoconf 2.68.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    $as_echo "PATH: $as_dir"
+  done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+    2)
+      as_fn_append ac_configure_args1 " '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+	ac_must_keep_next=false # Got value, back to normal.
+      else
+	case $ac_arg in
+	  *=* | --config-cache | -C | -disable-* | --disable-* \
+	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+	  | -with-* | --with-* | -without-* | --without-* | --x)
+	    case "$ac_configure_args0 " in
+	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+	    esac
+	    ;;
+	  -* ) ac_must_keep_next=true ;;
+	esac
+      fi
+      as_fn_append ac_configure_args " '$ac_arg'"
+      ;;
+    esac
+  done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+	"s/'\''/'\''\\\\'\'''\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      $as_echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=\$$ac_var
+	case $ac_val in
+	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+	esac
+	$as_echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      $as_echo "$as_me: caught signal $ac_signal"
+    $as_echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+  # We do not want a PATH search for config.site.
+  case $CONFIG_SITE in #((
+    -*)  ac_site_file1=./$CONFIG_SITE;;
+    */*) ac_site_file1=$CONFIG_SITE;;
+    *)   ac_site_file1=./$CONFIG_SITE;;
+  esac
+elif test "x$prefix" != xNONE; then
+  ac_site_file1=$prefix/share/config.site
+  ac_site_file2=$prefix/etc/config.site
+else
+  ac_site_file1=$ac_default_prefix/share/config.site
+  ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+  test "x$ac_site_file" = xNONE && continue
+  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file" \
+      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special files
+  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
+  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+	# differences in whitespace do not lead to failure.
+	ac_old_val_w=`echo x $ac_old_val`
+	ac_new_val_w=`echo x $ac_new_val`
+	if test "$ac_old_val_w" != "$ac_new_val_w"; then
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	  ac_cache_corrupted=:
+	else
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+	  eval $ac_var=\$ac_old_val
+	fi
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
+$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
+$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+am__api_version='1.11'
+
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+  if test -f "$ac_dir/install-sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f "$ac_dir/install.sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if ${ac_cv_path_install+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+  ./ | .// | /[cC]/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    rm -rf conftest.one conftest.two conftest.dir
+	    echo one > conftest.one
+	    echo two > conftest.two
+	    mkdir conftest.dir
+	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+	      test -s conftest.one && test -s conftest.two &&
+	      test -s conftest.dir/conftest.one &&
+	      test -s conftest.dir/conftest.two
+	    then
+	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	      break 3
+	    fi
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+
+  done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+$as_echo_n "checking whether build environment is sane... " >&6; }
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[\\\"\#\$\&\'\`$am_lf]*)
+    as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+  *[\\\"\#\$\&\'\`$am_lf\ \	]*)
+    as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
+esac
+
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t "$srcdir/configure" conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$*" != "X $srcdir/configure conftest.file" \
+      && test "$*" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" "$LINENO" 5
+   fi
+
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   as_fn_error $? "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+test "$program_prefix" != NONE &&
+  program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+  if ${ac_cv_path_mkdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in mkdir gmkdir; do
+	 for ac_exec_ext in '' $ac_executable_extensions; do
+	   { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
+	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+	     'mkdir (GNU coreutils) '* | \
+	     'mkdir (coreutils) '* | \
+	     'mkdir (fileutils) '4.1*)
+	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+	       break 3;;
+	   esac
+	 done
+       done
+  done
+IFS=$as_save_IFS
+
+fi
+
+  test -d ./--version && rmdir ./--version
+  if test "${ac_cv_path_mkdir+set}" = set; then
+    MKDIR_P="$ac_cv_path_mkdir -p"
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for MKDIR_P within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    MKDIR_P="$ac_install_sh -d"
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+mkdir_p="$MKDIR_P"
+case $mkdir_p in
+  [\\/$]* | ?:[\\/]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AWK+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_AWK="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$AWK" && break
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  SET_MAKE=
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  am__isrc=' -I$(srcdir)'
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='mpiimport'
+ VERSION='1.0'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+
+# Checks for programs.
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+  if test -n "$CCC"; then
+    CXX=$CCC
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in mpic++
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
+$as_echo "$CXX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CXX" && break
+  done
+fi
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in mpic++
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CXX="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
+$as_echo "$ac_ct_CXX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CXX" && break
+done
+
+  if test "x$ac_ct_CXX" = x; then
+    CXX="g++"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CXX=$ac_ct_CXX
+  fi
+fi
+
+  fi
+fi
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5
+$as_echo_n "checking whether the C++ compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+	;;
+    [ab].out )
+	# We found the default executable, but exeext='' is most
+	# certainly right.
+	break;;
+    *.* )
+	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+	then :; else
+	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	fi
+	# We set ac_cv_exeext here because the later test for it is not
+	# safe: cross compilers may not add the suffix if given an `-o'
+	# argument, so we may need to know it at that point already.
+	# Even if this section looks crufty: it has the advantage of
+	# actually working.
+	break;;
+    * )
+	break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+if test -z "$ac_file"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C++ compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5
+$as_echo_n "checking for C++ compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	  break;;
+    * ) break;;
+  esac
+done
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+  { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+  if { ac_try='./conftest$ac_cv_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C++ compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+    fi
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
+$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
+if ${ac_cv_cxx_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
+$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GXX=yes
+else
+  GXX=
+fi
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
+$as_echo_n "checking whether $CXX accepts -g... " >&6; }
+if ${ac_cv_prog_cxx_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+   ac_cxx_werror_flag=yes
+   ac_cv_prog_cxx_g=no
+   CXXFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_cv_prog_cxx_g=yes
+else
+  CXXFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+else
+  ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+	 CXXFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_cv_prog_cxx_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
+$as_echo "$ac_cv_prog_cxx_g" >&6; }
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
+  else
+    CXXFLAGS="-g"
+  fi
+else
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
+  else
+    CXXFLAGS=
+  fi
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
+$as_echo_n "checking for style of include used by $am_make... " >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
+$as_echo "$_am_result" >&6; }
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then :
+  enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+
+depcc="$CXX"  am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CXX_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CXX_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CXX_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+  am__fastdepCXX_TRUE=
+  am__fastdepCXX_FALSE='#'
+else
+  am__fastdepCXX_TRUE='#'
+  am__fastdepCXX_FALSE=
+fi
+
+
+
+# Checks for libraries.
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+else
+  CFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CC"   am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for MPI_Init in -lmpi" >&5
+$as_echo_n "checking for MPI_Init in -lmpi... " >&6; }
+if ${ac_cv_lib_mpi_MPI_Init+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lmpi  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char MPI_Init ();
+int
+main ()
+{
+return MPI_Init ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_mpi_MPI_Init=yes
+else
+  ac_cv_lib_mpi_MPI_Init=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mpi_MPI_Init" >&5
+$as_echo "$ac_cv_lib_mpi_MPI_Init" >&6; }
+if test "x$ac_cv_lib_mpi_MPI_Init" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBMPI 1
+_ACEOF
+
+  LIBS="-lmpi $LIBS"
+
+fi
+
+
+# Checks for header files.
+
+# Checks for typedefs, structures, and compiler characteristics.
+
+# Checks for library functions.
+
+# Completion
+ac_config_files="$ac_config_files Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes: double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \.
+      sed -n \
+	"s/'/'\\\\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    if test "x$cache_file" != "x/dev/null"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+      if test ! -f "$cache_file" || test -h "$cache_file"; then
+	cat confcache >"$cache_file"
+      else
+        case $cache_file in #(
+        */* | ?:*)
+	  mv -f confcache "$cache_file"$$ &&
+	  mv -f "$cache_file"$$ "$cache_file" ;; #(
+        *)
+	  mv -f confcache "$cache_file" ;;
+	esac
+      fi
+    fi
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+#
+# If the first sed substitution is executed (which looks for macros that
+# take arguments), then branch to the quote section.  Otherwise,
+# look for a macro that doesn't take arguments.
+ac_script='
+:mline
+/\\$/{
+ N
+ s,\\\n,,
+ b mline
+}
+t clear
+:clear
+s/^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 (][^	 (]*([^)]*)\)[	 ]*\(.*\)/-D\1=\2/g
+t quote
+s/^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 ][^	 ]*\)[	 ]*\(.*\)/-D\1=\2/g
+t quote
+b any
+:quote
+s/[	 `~#$^&*(){}\\|;'\''"<>?]/\\&/g
+s/\[/\\&/g
+s/\]/\\&/g
+s/\$/$$/g
+H
+:any
+${
+	g
+	s/^\n//
+	s/\n/ /g
+	p
+}
+'
+DEFS=`sed -n "$ac_script" confdefs.h`
+
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+ if test -n "$EXEEXT"; then
+  am__EXEEXT_TRUE=
+  am__EXEEXT_FALSE='#'
+else
+  am__EXEEXT_TRUE='#'
+  am__EXEEXT_FALSE=
+fi
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+	test -d "$1/.";
+      else
+	case $1 in #(
+	-*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by mpiimport $as_me 1.0, which was
+generated by GNU Autoconf 2.68.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration.  Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+      --config     print configuration, then exit
+  -q, --quiet, --silent
+                   do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+      --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+
+Configuration files:
+$config_files
+
+Configuration commands:
+$config_commands
+
+Report bugs to <jmt12@students.waikato.ac.nz>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+mpiimport config.status 1.0
+configured by $0, generated by GNU Autoconf 2.68,
+  with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2010 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=?*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  --*=)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    $as_echo "$ac_cs_version"; exit ;;
+  --config | --confi | --conf | --con | --co | --c )
+    $as_echo "$ac_cs_config"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    '') as_fn_error $? "missing file argument" ;;
+    esac
+    as_fn_append CONFIG_FILES " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --he | --h |  --help | --hel | -h )
+    $as_echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+  *) as_fn_append ac_config_targets " $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  shift
+  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+  CONFIG_SHELL='$SHELL'
+  export CONFIG_SHELL
+  exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+
+  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp= ac_tmp=
+  trap 'exit_status=$?
+  : "${ac_tmp:=$tmp}"
+  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+  trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+  eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+  ac_cs_awk_cr='\\r'
+else
+  ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+  echo "cat >conf$$subs.awk <<_ACEOF" &&
+  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+  echo "_ACEOF"
+} >conf$$subs.sh ||
+  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  . ./conf$$subs.sh ||
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+  if test $ac_delim_n = $ac_delim_num; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+  N
+  s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+  for (key in S) S_is_set[key] = 1
+  FS = ""
+
+}
+{
+  line = $ 0
+  nfields = split(line, field, "@")
+  substed = 0
+  len = length(field[1])
+  for (i = 2; i < nfields; i++) {
+    key = field[i]
+    keylen = length(key)
+    if (S_is_set[key]) {
+      value = S[key]
+      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+      len += length(value) + length(field[++i])
+      substed = 1
+    } else
+      len += 1 + keylen
+  }
+
+  print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+  cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=[	 ]*/{
+h
+s///
+s/^/:/
+s/[	 ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[	 ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[	 ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+
+eval set X "  :F $CONFIG_FILES      :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$ac_tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
+	 # because $ac_f cannot contain `:'.
+	 test -f "$ac_f" ||
+	   case $ac_f in
+	   [\\/$]*) false;;
+	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+	   esac ||
+	   as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+      esac
+      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+      as_fn_append ac_file_inputs " '$ac_f'"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input='Generated from '`
+	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+	`' by configure.'
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+    fi
+    # Neutralize special characters interpreted by sed in replacement strings.
+    case $configure_input in #(
+    *\&* | *\|* | *\\* )
+       ac_sed_conf_input=`$as_echo "$configure_input" |
+       sed 's/[\\\\&|]/\\\\&/g'`;; #(
+    *) ac_sed_conf_input=$configure_input;;
+    esac
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$ac_tmp/stdin" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  as_dir="$ac_dir"; as_fn_mkdir_p
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+  ac_MKDIR_P=$MKDIR_P
+  case $MKDIR_P in
+  [\\/$]* | ?:[\\/]* ) ;;
+  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+  esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+  s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+  >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' \
+      "$ac_tmp/out"`; test -z "$ac_out"; } &&
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&2;}
+
+  rm -f "$ac_tmp/stdin"
+  case $ac_file in
+  -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+  *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+  esac \
+  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+
+
+  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+  esac
+
+
+  case $ac_file$ac_mode in
+    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named `Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`$as_dirname -- "$mf" ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$mf" : 'X\(//\)[^/]' \| \
+	 X"$mf" : 'X\(//\)$' \| \
+	 X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running `make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`$as_dirname -- "$file" ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$file" : 'X\(//\)[^/]' \| \
+	 X"$file" : 'X\(//\)$' \| \
+	 X"$file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      as_dir=$dirpart/$fdir; as_fn_mkdir_p
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+ ;;
+
+  esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/configure.ac
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/configure.ac	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/configure.ac	(revision 24799)
@@ -0,0 +1,22 @@
+#                                               -*- Autoconf -*-
+# Process this file with autoconf to produce a configure script.
+AC_PREREQ(2.59)
+AC_INIT([mpiimport], [1.0], [jmt12@students.waikato.ac.nz])
+AM_INIT_AUTOMAKE
+AC_CANONICAL_HOST
+
+# Checks for programs.
+AC_PROG_CXX([mpic++])
+
+# Checks for libraries.
+AC_CHECK_LIB([mpi],[MPI_Init])
+
+# Checks for header files.
+
+# Checks for typedefs, structures, and compiler characteristics.
+
+# Checks for library functions.
+
+# Completion
+AC_CONFIG_FILES([Makefile])
+AC_OUTPUT
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/depcomp
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/depcomp	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/depcomp	(revision 24799)
@@ -0,0 +1,630 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2009-04-28.21; # UTC
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free
+# Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+case $1 in
+  '')
+     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+  depmode     Dependency tracking mode.
+  source      Source file read by `PROGRAMS ARGS'.
+  object      Object file output by `PROGRAMS ARGS'.
+  DEPDIR      directory where to store dependencies.
+  depfile     Dependency file to output.
+  tmpdepfile  Temporary file to use when outputing dependencies.
+  libtool     Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "depcomp $scriptversion"
+    exit $?
+    ;;
+esac
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+  echo "depcomp: Variables source, object and depmode must be set" 1>&2
+  exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Some modes work just like other modes, but use different flags.  We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write.  Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+  # HP compiler uses -M and no extra arg.
+  gccflag=-M
+  depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+   # This is just like dashmstdout with a different argument.
+   dashmflag=-xM
+   depmode=dashmstdout
+fi
+
+cygpath_u="cygpath -u -f -"
+if test "$depmode" = msvcmsys; then
+   # This is just like msvisualcpp but w/o cygpath translation.
+   # Just convert the backslash-escaped backslashes to single forward
+   # slashes to satisfy depend.m4
+   cygpath_u="sed s,\\\\\\\\,/,g"
+   depmode=msvisualcpp
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff.  Hmm.
+## Unfortunately, FreeBSD c89 acceptance of flags depends upon
+## the command line argument order; so add the flags where they
+## appear in depend2.am.  Note that the slowdown incurred here
+## affects only configure: in makefiles, %FASTDEP% shortcuts this.
+  for arg
+  do
+    case $arg in
+    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
+    *)  set fnord "$@" "$arg" ;;
+    esac
+    shift # fnord
+    shift # $arg
+  done
+  "$@"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  mv "$tmpdepfile" "$depfile"
+  ;;
+
+gcc)
+## There are various ways to get dependency output from gcc.  Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+##   up in a subdir.  Having to rename by hand is ugly.
+##   (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+##   -MM, not -M (despite what the docs say).
+## - Using -M directly means running the compiler twice (even worse
+##   than renaming).
+  if test -z "$gccflag"; then
+    gccflag=-MD,
+  fi
+  "$@" -Wp,"$gccflag$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+## The second -e expression handles DOS-style file names with drive letters.
+  sed -e 's/^[^:]*: / /' \
+      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the `deleted header file' problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header).  We avoid this by adding
+## dummy dependencies for each header file.  Too bad gcc doesn't do
+## this for us directly.
+  tr ' ' '
+' < "$tmpdepfile" |
+## Some versions of gcc put a space before the `:'.  On the theory
+## that the space means something, we add a space to the output as
+## well.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+sgi)
+  if test "$libtool" = yes; then
+    "$@" "-Wp,-MDupdate,$tmpdepfile"
+  else
+    "$@" -MDupdate "$tmpdepfile"
+  fi
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+
+  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
+    echo "$object : \\" > "$depfile"
+
+    # Clip off the initial element (the dependent).  Don't try to be
+    # clever and replace this with sed code, as IRIX sed won't handle
+    # lines with more than a fixed number of characters (4096 in
+    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
+    # the IRIX cc adds comments like `#:fec' to the end of the
+    # dependency line.
+    tr ' ' '
+' < "$tmpdepfile" \
+    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
+    tr '
+' ' ' >> "$depfile"
+    echo >> "$depfile"
+
+    # The second pass generates a dummy entry for each header file.
+    tr ' ' '
+' < "$tmpdepfile" \
+   | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+   >> "$depfile"
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+aix)
+  # The C for AIX Compiler uses -M and outputs the dependencies
+  # in a .u file.  In older versions, this file always lives in the
+  # current directory.  Also, the AIX compiler puts `$object:' at the
+  # start of each line; $object doesn't have directory information.
+  # Version 6 uses the directory in both cases.
+  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+  test "x$dir" = "x$object" && dir=
+  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$base.u
+    tmpdepfile3=$dir.libs/$base.u
+    "$@" -Wc,-M
+  else
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$dir$base.u
+    tmpdepfile3=$dir$base.u
+    "$@" -M
+  fi
+  stat=$?
+
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    # Each line is of the form `foo.o: dependent.h'.
+    # Do two passes, one to just change these to
+    # `$object: dependent.h' and one to simply `dependent.h:'.
+    sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+    # That's a tab and a space in the [].
+    sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+icc)
+  # Intel's C compiler understands `-MD -MF file'.  However on
+  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
+  # ICC 7.0 will fill foo.d with something like
+  #    foo.o: sub/foo.c
+  #    foo.o: sub/foo.h
+  # which is wrong.  We want:
+  #    sub/foo.o: sub/foo.c
+  #    sub/foo.o: sub/foo.h
+  #    sub/foo.c:
+  #    sub/foo.h:
+  # ICC 7.1 will output
+  #    foo.o: sub/foo.c sub/foo.h
+  # and will wrap long lines using \ :
+  #    foo.o: sub/foo.c ... \
+  #     sub/foo.h ... \
+  #     ...
+
+  "$@" -MD -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each line is of the form `foo.o: dependent.h',
+  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+  # Do two passes, one to just change these to
+  # `$object: dependent.h' and one to simply `dependent.h:'.
+  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
+    sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp2)
+  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
+  # compilers, which have integrated preprocessors.  The correct option
+  # to use with these is +Maked; it writes dependencies to a file named
+  # 'foo.d', which lands next to the object file, wherever that
+  # happens to be.
+  # Much of this is similar to the tru64 case; see comments there.
+  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+  test "x$dir" = "x$object" && dir=
+  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir.libs/$base.d
+    "$@" -Wc,+Maked
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    "$@" +Maked
+  fi
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+     rm -f "$tmpdepfile1" "$tmpdepfile2"
+     exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
+    # Add `dependent.h:' lines.
+    sed -ne '2,${
+	       s/^ *//
+	       s/ \\*$//
+	       s/$/:/
+	       p
+	     }' "$tmpdepfile" >> "$depfile"
+  else
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile" "$tmpdepfile2"
+  ;;
+
+tru64)
+   # The Tru64 compiler uses -MD to generate dependencies as a side
+   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
+   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+   # dependencies in `foo.d' instead, so we check for that too.
+   # Subdirectories are respected.
+   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+   test "x$dir" = "x$object" && dir=
+   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+
+   if test "$libtool" = yes; then
+      # With Tru64 cc, shared objects can also be used to make a
+      # static library.  This mechanism is used in libtool 1.4 series to
+      # handle both shared and static libraries in a single compilation.
+      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
+      #
+      # With libtool 1.5 this exception was removed, and libtool now
+      # generates 2 separate objects for the 2 libraries.  These two
+      # compilations output dependencies in $dir.libs/$base.o.d and
+      # in $dir$base.o.d.  We have to check for both files, because
+      # one of the two compilations can be disabled.  We should prefer
+      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+      # automatically cleaned when .libs/ is deleted, while ignoring
+      # the former would cause a distcleancheck panic.
+      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
+      tmpdepfile2=$dir$base.o.d          # libtool 1.5
+      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
+      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
+      "$@" -Wc,-MD
+   else
+      tmpdepfile1=$dir$base.o.d
+      tmpdepfile2=$dir$base.d
+      tmpdepfile3=$dir$base.d
+      tmpdepfile4=$dir$base.d
+      "$@" -MD
+   fi
+
+   stat=$?
+   if test $stat -eq 0; then :
+   else
+      rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+      exit $stat
+   fi
+
+   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+   do
+     test -f "$tmpdepfile" && break
+   done
+   if test -f "$tmpdepfile"; then
+      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+      # That's a tab and a space in the [].
+      sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+   else
+      echo "#dummy" > "$depfile"
+   fi
+   rm -f "$tmpdepfile"
+   ;;
+
+#nosideeffect)
+  # This comment above is used by automake to tell side-effect
+  # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout, regardless of -o.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove `-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  test -z "$dashmflag" && dashmflag=-M
+  # Require at least two characters before searching for `:'
+  # in the target name.  This is to cope with DOS-style filenames:
+  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
+  "$@" $dashmflag |
+    sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  tr ' ' '
+' < "$tmpdepfile" | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+dashXmstdout)
+  # This case only exists to satisfy depend.m4.  It is never actually
+  # run, as this mode is specially recognized in the preamble.
+  exit 1
+  ;;
+
+makedepend)
+  "$@" || exit $?
+  # Remove any Libtool call
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+  # X makedepend
+  shift
+  cleared=no eat=no
+  for arg
+  do
+    case $cleared in
+    no)
+      set ""; shift
+      cleared=yes ;;
+    esac
+    if test $eat = yes; then
+      eat=no
+      continue
+    fi
+    case "$arg" in
+    -D*|-I*)
+      set fnord "$@" "$arg"; shift ;;
+    # Strip any option that makedepend may not understand.  Remove
+    # the object too, otherwise makedepend will parse it as a source file.
+    -arch)
+      eat=yes ;;
+    -*|$object)
+      ;;
+    *)
+      set fnord "$@" "$arg"; shift ;;
+    esac
+  done
+  obj_suffix=`echo "$object" | sed 's/^.*\././'`
+  touch "$tmpdepfile"
+  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  sed '1,2d' "$tmpdepfile" | tr ' ' '
+' | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile" "$tmpdepfile".bak
+  ;;
+
+cpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove `-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  "$@" -E |
+    sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+       -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
+    sed '$ s: \\$::' > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  cat < "$tmpdepfile" >> "$depfile"
+  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvisualcpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  IFS=" "
+  for arg
+  do
+    case "$arg" in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+	set fnord "$@"
+	shift
+	shift
+	;;
+    *)
+	set fnord "$@" "$arg"
+	shift
+	shift
+	;;
+    esac
+  done
+  "$@" -E 2>/dev/null |
+  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::	\1 \\:p' >> "$depfile"
+  echo "	" >> "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvcmsys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+none)
+  exec "$@"
+  ;;
+
+*)
+  echo "Unknown depmode $depmode" 1>&2
+  exit 1
+  ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/install-sh
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/install-sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/install-sh	(revision 24799)
@@ -0,0 +1,520 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2009-04-28.21; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+nl='
+'
+IFS=" ""	$nl"
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit=${DOITPROG-}
+if test -z "$doit"; then
+  doit_exec=exec
+else
+  doit_exec=$doit
+fi
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_glob='?'
+initialize_posix_glob='
+  test "$posix_glob" != "?" || {
+    if (set -f) 2>/dev/null; then
+      posix_glob=
+    else
+      posix_glob=:
+    fi
+  }
+'
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+no_target_directory=
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+     --help     display this help and exit.
+     --version  display version info and exit.
+
+  -c            (ignored)
+  -C            install only if different (preserve the last data modification time)
+  -d            create directories instead of installing files.
+  -g GROUP      $chgrpprog installed files to GROUP.
+  -m MODE       $chmodprog installed files to MODE.
+  -o USER       $chownprog installed files to USER.
+  -s            $stripprog installed files.
+  -t DIRECTORY  install into DIRECTORY.
+  -T            report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+  RMPROG STRIPPROG
+"
+
+while test $# -ne 0; do
+  case $1 in
+    -c) ;;
+
+    -C) copy_on_change=true;;
+
+    -d) dir_arg=true;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+	shift;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) mode=$2
+	case $mode in
+	  *' '* | *'	'* | *'
+'*	  | *'*'* | *'?'* | *'['*)
+	    echo "$0: invalid mode: $mode" >&2
+	    exit 1;;
+	esac
+	shift;;
+
+    -o) chowncmd="$chownprog $2"
+	shift;;
+
+    -s) stripcmd=$stripprog;;
+
+    -t) dst_arg=$2
+	shift;;
+
+    -T) no_target_directory=true;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    --)	shift
+	break;;
+
+    -*)	echo "$0: invalid option: $1" >&2
+	exit 1;;
+
+    *)  break;;
+  esac
+  shift
+done
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+  # When -d is used, all remaining arguments are directories to create.
+  # When -t is used, the destination is already specified.
+  # Otherwise, the last argument is the destination.  Remove it from $@.
+  for arg
+  do
+    if test -n "$dst_arg"; then
+      # $@ is not empty: it contains at least $arg.
+      set fnord "$@" "$dst_arg"
+      shift # fnord
+    fi
+    shift # arg
+    dst_arg=$arg
+  done
+fi
+
+if test $# -eq 0; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call `install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+if test -z "$dir_arg"; then
+  trap '(exit $?); exit' 1 2 13 15
+
+  # Set umask so as not to create temps with too-generous modes.
+  # However, 'strip' requires both read and write access to temps.
+  case $mode in
+    # Optimize common cases.
+    *644) cp_umask=133;;
+    *755) cp_umask=22;;
+
+    *[0-7])
+      if test -z "$stripcmd"; then
+	u_plus_rw=
+      else
+	u_plus_rw='% 200'
+      fi
+      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+    *)
+      if test -z "$stripcmd"; then
+	u_plus_rw=
+      else
+	u_plus_rw=,u+rw
+      fi
+      cp_umask=$mode$u_plus_rw;;
+  esac
+fi
+
+for src
+do
+  # Protect names starting with `-'.
+  case $src in
+    -*) src=./$src;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    dstdir=$dst
+    test -d "$dstdir"
+    dstdir_status=$?
+  else
+
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dst_arg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+
+    dst=$dst_arg
+    # Protect names starting with `-'.
+    case $dst in
+      -*) dst=./$dst;;
+    esac
+
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
+    if test -d "$dst"; then
+      if test -n "$no_target_directory"; then
+	echo "$0: $dst_arg: Is a directory" >&2
+	exit 1
+      fi
+      dstdir=$dst
+      dst=$dstdir/`basename "$src"`
+      dstdir_status=0
+    else
+      # Prefer dirname, but fall back on a substitute if dirname fails.
+      dstdir=`
+	(dirname "$dst") 2>/dev/null ||
+	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	     X"$dst" : 'X\(//\)[^/]' \| \
+	     X"$dst" : 'X\(//\)$' \| \
+	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
+	echo X"$dst" |
+	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)[^/].*/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\).*/{
+		   s//\1/
+		   q
+		 }
+		 s/.*/./; q'
+      `
+
+      test -d "$dstdir"
+      dstdir_status=$?
+    fi
+  fi
+
+  obsolete_mkdir_used=false
+
+  if test $dstdir_status != 0; then
+    case $posix_mkdir in
+      '')
+	# Create intermediate dirs using mode 755 as modified by the umask.
+	# This is like FreeBSD 'install' as of 1997-10-28.
+	umask=`umask`
+	case $stripcmd.$umask in
+	  # Optimize common cases.
+	  *[2367][2367]) mkdir_umask=$umask;;
+	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+	  *[0-7])
+	    mkdir_umask=`expr $umask + 22 \
+	      - $umask % 100 % 40 + $umask % 20 \
+	      - $umask % 10 % 4 + $umask % 2
+	    `;;
+	  *) mkdir_umask=$umask,go-w;;
+	esac
+
+	# With -d, create the new directory with the user-specified mode.
+	# Otherwise, rely on $mkdir_umask.
+	if test -n "$dir_arg"; then
+	  mkdir_mode=-m$mode
+	else
+	  mkdir_mode=
+	fi
+
+	posix_mkdir=false
+	case $umask in
+	  *[123567][0-7][0-7])
+	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
+	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+	    ;;
+	  *)
+	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+	    if (umask $mkdir_umask &&
+		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+	    then
+	      if test -z "$dir_arg" || {
+		   # Check for POSIX incompatibilities with -m.
+		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+		   # other-writeable bit of parent directory when it shouldn't.
+		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
+		   case $ls_ld_tmpdir in
+		     d????-?r-*) different_mode=700;;
+		     d????-?--*) different_mode=755;;
+		     *) false;;
+		   esac &&
+		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+		   }
+		 }
+	      then posix_mkdir=:
+	      fi
+	      rmdir "$tmpdir/d" "$tmpdir"
+	    else
+	      # Remove any dirs left behind by ancient mkdir implementations.
+	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+	    fi
+	    trap '' 0;;
+	esac;;
+    esac
+
+    if
+      $posix_mkdir && (
+	umask $mkdir_umask &&
+	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+      )
+    then :
+    else
+
+      # The umask is ridiculous, or mkdir does not conform to POSIX,
+      # or it failed possibly due to a race condition.  Create the
+      # directory the slow way, step by step, checking for races as we go.
+
+      case $dstdir in
+	/*) prefix='/';;
+	-*) prefix='./';;
+	*)  prefix='';;
+      esac
+
+      eval "$initialize_posix_glob"
+
+      oIFS=$IFS
+      IFS=/
+      $posix_glob set -f
+      set fnord $dstdir
+      shift
+      $posix_glob set +f
+      IFS=$oIFS
+
+      prefixes=
+
+      for d
+      do
+	test -z "$d" && continue
+
+	prefix=$prefix$d
+	if test -d "$prefix"; then
+	  prefixes=
+	else
+	  if $posix_mkdir; then
+	    (umask=$mkdir_umask &&
+	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+	    # Don't fail if two instances are running concurrently.
+	    test -d "$prefix" || exit 1
+	  else
+	    case $prefix in
+	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+	      *) qprefix=$prefix;;
+	    esac
+	    prefixes="$prefixes '$qprefix'"
+	  fi
+	fi
+	prefix=$prefix/
+      done
+
+      if test -n "$prefixes"; then
+	# Don't fail if two instances are running concurrently.
+	(umask $mkdir_umask &&
+	 eval "\$doit_exec \$mkdirprog $prefixes") ||
+	  test -d "$dstdir" || exit 1
+	obsolete_mkdir_used=true
+      fi
+    fi
+  fi
+
+  if test -n "$dir_arg"; then
+    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+  else
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+    # Copy the file name to the temp name.
+    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+    # If -C, don't bother to copy if it wouldn't change the file.
+    if $copy_on_change &&
+       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
+
+       eval "$initialize_posix_glob" &&
+       $posix_glob set -f &&
+       set X $old && old=:$2:$4:$5:$6 &&
+       set X $new && new=:$2:$4:$5:$6 &&
+       $posix_glob set +f &&
+
+       test "$old" = "$new" &&
+       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+    then
+      rm -f "$dsttmp"
+    else
+      # Rename the file to the real destination.
+      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+      # The rename failed, perhaps because mv can't rename something else
+      # to itself, or perhaps because mv is so ancient that it does not
+      # support -f.
+      {
+	# Now remove or move aside any old file at destination location.
+	# We try this two ways since rm can't unlink itself on some
+	# systems and the destination file might be busy for other
+	# reasons.  In this case, the final cleanup might fail but the new
+	# file should still install successfully.
+	{
+	  test ! -f "$dst" ||
+	  $doit $rmcmd -f "$dst" 2>/dev/null ||
+	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+	  } ||
+	  { echo "$0: cannot unlink or rename $dst" >&2
+	    (exit 1); exit 1
+	  }
+	} &&
+
+	# Now rename the file to the real destination.
+	$doit $mvcmd "$dsttmp" "$dst"
+      }
+    fi || exit 1
+
+    trap '' 0
+  fi
+done
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/missing
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/missing	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/missing	(revision 24799)
@@ -0,0 +1,376 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2009-04-28.21; # UTC
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
+# 2008, 2009 Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try \`$0 --help' for more information"
+  exit 1
+fi
+
+run=:
+sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
+sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+  configure_ac=configure.ac
+else
+  configure_ac=configure.in
+fi
+
+msg="missing on your system"
+
+case $1 in
+--run)
+  # Try to run requested program, and just exit if it succeeds.
+  run=
+  shift
+  "$@" && exit 0
+  # Exit code 63 means version mismatch.  This often happens
+  # when the user try to use an ancient version of a tool on
+  # a file that requires a minimum version.  In this case we
+  # we should proceed has if the program had been absent, or
+  # if --run hadn't been passed.
+  if test $? = 63; then
+    run=:
+    msg="probably too old"
+  fi
+  ;;
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+  --run           try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+  aclocal      touch file \`aclocal.m4'
+  autoconf     touch file \`configure'
+  autoheader   touch file \`config.h.in'
+  autom4te     touch the output file, or create a stub one
+  automake     touch all \`Makefile.in' files
+  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
+  flex         create \`lex.yy.c', if possible, from existing .c
+  help2man     touch the output file
+  lex          create \`lex.yy.c', if possible, from existing .c
+  makeinfo     touch the output file
+  tar          try tar, gnutar, gtar, then tar without non-portable flags
+  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
+
+Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
+\`g' are ignored when checking the name.
+
+Send bug reports to <bug-automake@gnu.org>."
+    exit $?
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing $scriptversion (GNU Automake)"
+    exit $?
+    ;;
+
+  -*)
+    echo 1>&2 "$0: Unknown \`$1' option"
+    echo 1>&2 "Try \`$0 --help' for more information"
+    exit 1
+    ;;
+
+esac
+
+# normalize program name to check for.
+program=`echo "$1" | sed '
+  s/^gnu-//; t
+  s/^gnu//; t
+  s/^g//; t'`
+
+# Now exit if we have it, but it failed.  Also exit now if we
+# don't have it and --version was passed (most likely to detect
+# the program).  This is about non-GNU programs, so use $1 not
+# $program.
+case $1 in
+  lex*|yacc*)
+    # Not GNU programs, they don't have --version.
+    ;;
+
+  tar*)
+    if test -n "$run"; then
+       echo 1>&2 "ERROR: \`tar' requires --run"
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       exit 1
+    fi
+    ;;
+
+  *)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       # Could not run --version or --help.  This is probably someone
+       # running `$TOOL --version' or `$TOOL --help' to check whether
+       # $TOOL exists and not knowing $TOOL uses missing.
+       exit 1
+    fi
+    ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case $program in
+  aclocal*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
+         to install the \`Automake' and \`Perl' packages.  Grab them from
+         any GNU archive site."
+    touch aclocal.m4
+    ;;
+
+  autoconf*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`${configure_ac}'.  You might want to install the
+         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
+         archive site."
+    touch configure
+    ;;
+
+  autoheader*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
+         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
+         from any GNU archive site."
+    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+    test -z "$files" && files="config.h"
+    touch_files=
+    for f in $files; do
+      case $f in
+      *:*) touch_files="$touch_files "`echo "$f" |
+				       sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+      *) touch_files="$touch_files $f.in";;
+      esac
+    done
+    touch $touch_files
+    ;;
+
+  automake*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+         You might want to install the \`Automake' and \`Perl' packages.
+         Grab them from any GNU archive site."
+    find . -type f -name Makefile.am -print |
+	   sed 's/\.am$/.in/' |
+	   while read f; do touch "$f"; done
+    ;;
+
+  autom4te*)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.
+         You can get \`$1' as part of \`Autoconf' from any GNU
+         archive site."
+
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
+	touch $file
+    else
+	test -z "$file" || exec >$file
+	echo "#! /bin/sh"
+	echo "# Created by GNU Automake missing as a replacement of"
+	echo "#  $ $@"
+	echo "exit 0"
+	chmod +x $file
+	exit 1
+    fi
+    ;;
+
+  bison*|yacc*)
+    echo 1>&2 "\
+WARNING: \`$1' $msg.  You should only need it if
+         you modified a \`.y' file.  You may need the \`Bison' package
+         in order for those modifications to take effect.  You can get
+         \`Bison' from any GNU archive site."
+    rm -f y.tab.c y.tab.h
+    if test $# -ne 1; then
+        eval LASTARG="\${$#}"
+	case $LASTARG in
+	*.y)
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" y.tab.c
+	    fi
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" y.tab.h
+	    fi
+	  ;;
+	esac
+    fi
+    if test ! -f y.tab.h; then
+	echo >y.tab.h
+    fi
+    if test ! -f y.tab.c; then
+	echo 'main() { return 0; }' >y.tab.c
+    fi
+    ;;
+
+  lex*|flex*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.l' file.  You may need the \`Flex' package
+         in order for those modifications to take effect.  You can get
+         \`Flex' from any GNU archive site."
+    rm -f lex.yy.c
+    if test $# -ne 1; then
+        eval LASTARG="\${$#}"
+	case $LASTARG in
+	*.l)
+	    SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" lex.yy.c
+	    fi
+	  ;;
+	esac
+    fi
+    if test ! -f lex.yy.c; then
+	echo 'main() { return 0; }' >lex.yy.c
+    fi
+    ;;
+
+  help2man*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+	 you modified a dependency of a manual page.  You may need the
+	 \`Help2man' package in order for those modifications to take
+	 effect.  You can get \`Help2man' from any GNU archive site."
+
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
+	touch $file
+    else
+	test -z "$file" || exec >$file
+	echo ".ab help2man is required to generate this page"
+	exit $?
+    fi
+    ;;
+
+  makeinfo*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.texi' or \`.texinfo' file, or any other file
+         indirectly affecting the aspect of the manual.  The spurious
+         call might also be the consequence of using a buggy \`make' (AIX,
+         DU, IRIX).  You might want to install the \`Texinfo' package or
+         the \`GNU make' package.  Grab either from any GNU archive site."
+    # The file to touch is that specified with -o ...
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -z "$file"; then
+      # ... or it is the one specified with @setfilename ...
+      infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+      file=`sed -n '
+	/^@setfilename/{
+	  s/.* \([^ ]*\) *$/\1/
+	  p
+	  q
+	}' $infile`
+      # ... or it is derived from the source name (dir/f.texi becomes f.info)
+      test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
+    fi
+    # If the file does not exist, the user really needs makeinfo;
+    # let's fail without touching anything.
+    test -f $file || exit 1
+    touch $file
+    ;;
+
+  tar*)
+    shift
+
+    # We have already tried tar in the generic part.
+    # Look for gnutar/gtar before invocation to avoid ugly error
+    # messages.
+    if (gnutar --version > /dev/null 2>&1); then
+       gnutar "$@" && exit 0
+    fi
+    if (gtar --version > /dev/null 2>&1); then
+       gtar "$@" && exit 0
+    fi
+    firstarg="$1"
+    if shift; then
+	case $firstarg in
+	*o*)
+	    firstarg=`echo "$firstarg" | sed s/o//`
+	    tar "$firstarg" "$@" && exit 0
+	    ;;
+	esac
+	case $firstarg in
+	*h*)
+	    firstarg=`echo "$firstarg" | sed s/h//`
+	    tar "$firstarg" "$@" && exit 0
+	    ;;
+	esac
+    fi
+
+    echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+         You may want to install GNU tar or Free paxutils, or check the
+         command line arguments."
+    exit 1
+    ;;
+
+  *)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.  Check the \`README' file,
+         it often tells you about the needed prerequisites for installing
+         this package.  You may also peek at any GNU archive site, in case
+         some other package would contain this missing \`$1' program."
+    exit 1
+    ;;
+esac
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/mpiimport.cpp
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/mpiimport.cpp	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/mpiimport-src/mpiimport.cpp	(revision 24799)
@@ -0,0 +1,251 @@
+// Master-worker program to read in a list of files and invoke
+// import on each separately using manifest files in Greenstone 3,
+// with synchronisation using OpenMPI
+//
+// Hussein Suleman
+// 1 July 2010
+
+// 2011MAR - added a bunch of commands to aid (my) understanding.
+//         - made site argument optional to support GS2.
+//         - moving manifest writing code into the rank=0 thread. This will
+//           remove the artificial limit on epoc size caused by size of
+//           message buffer between controller and child threads. [jmt12]
+// 2011SEP - changing where the manifest files are written so I have the
+//           ability to set up the location as a RAMDisk. [jmt12]
+
+#include "mpi.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <fstream>
+#include <iostream>
+#include <sstream>
+#include <string>
+#include <vector>
+
+using namespace std;
+
+#define BUFFERSIZE 512
+
+int
+main ( int argc, char *argv [] )
+{
+  int numtasks, rank, rc;            // MPI variables
+
+  if (5 != argc && argc != 6 )
+  {
+    cerr << "Usage: " << argv[0] << " filelist epoch gsdlhome collection [site]" << endl;
+    exit(-1);
+  }
+
+  char *filelist = argv[1];          // list of filenames
+  char *epochStr = argv[2];          // number of files per task
+  int epoch = atoi (epochStr);
+  char *gsdlhomedir = argv[3];      // location of import script
+  char *collection = argv[4];        // Greenstone collection
+  char *site = "";
+  if (argc == 6)
+  {
+    site = argv[5];              // Greenstone site
+  }
+
+  // start MPI environment
+  rc = MPI_Init(&argc,&argv);
+  if (rc != MPI_SUCCESS)
+  {
+    printf ("Error starting MPI program. Terminating.\n");
+    MPI_Abort(MPI_COMM_WORLD, rc);
+  }
+
+  // We'll handle errors ourselves
+  MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_RETURN);
+
+  // get MPI variables: number of processors and processor number
+  MPI_Status stat;
+  MPI_Comm_size(MPI_COMM_WORLD, &numtasks);
+  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+
+  // master node processing
+  if (rank == 0)
+  {
+    char incoming[BUFFERSIZE];          // buffer for acknowledgments
+    char buffer[BUFFERSIZE];         // buffer to send tasks
+    MPI_Request request[BUFFERSIZE];    // request monitor for all tasks
+    MPI_Status status[BUFFERSIZE];      // status monitor for all tasks
+    int actualTasks = 0;         // number of processors running
+
+    vector<char *> manifest_files; // Keep track of temp manifest filenames
+
+    // open file listing filenames to process
+    ifstream infile;
+    infile.open (filelist);
+    string line;
+
+    // set initial status of all processors to idle
+    for ( int j=0; j<BUFFERSIZE; j++ )
+    {
+      incoming[j] = ' ';
+    }
+
+    // scan through contents of file listing
+    int manifest_file_count = 1;
+    while (!infile.eof ())
+    {
+      // get a filename
+      getline (infile, line);
+      if (line.length() > 0)
+      {
+        // search for idle processor
+        int dest=0;
+        int found = 0;
+        while ((dest<(numtasks-1)) && (found == 0))
+        {
+          if (incoming[dest] == ' ')
+          {
+            found = 1;
+          }
+          else
+          {
+            dest++;
+          }
+        }
+
+        // if no idle processor, wait for one to become idle
+        if (found == 0)
+        {
+          MPI_Waitany (numtasks-1, request, &dest, status);
+        }
+
+        // construct manifest filename
+	stringstream manifestfilename_strstr;
+	manifestfilename_strstr << gsdlhomedir << "/collect/" << collection << "/tmp/manifest." << manifest_file_count << ".xml";
+	string manifestfilename_str = manifestfilename_strstr.str();
+	char *manifestfilename = new char [manifestfilename_str.size() + 1];
+	strcpy(manifestfilename, manifestfilename_str.c_str());
+        ofstream manifestfile;
+        if (manifestfilename != NULL)
+        {
+          // create manifest file
+          manifestfile.open (manifestfilename);
+          if (manifestfile.fail())
+          {
+            cerr << "Fatal Error! Failed to open temporary manifest file for writing: " << manifestfile << endl;
+          }
+        }
+        else
+        {
+          cerr << "Fatal Error! Failed to open temporary manifest file for writing: " << manifestfile << endl;
+        }
+        manifestfile << "<Manifest><Index>" << endl;
+
+        // add the first filename to the instruction
+        manifestfile << "<Filename>" << line << "</Filename>" << endl;
+        int epochCounter = epoch;
+
+        // if epoch>1 and more filenames, add more filenames
+        while ((epochCounter > 1) && (!infile.eof ()))
+        {
+          getline (infile, line);
+          if (line.length () > 0)
+          {
+            manifestfile << "<Filename>" << line << "</Filename>" << endl;
+            epochCounter--;
+          }
+        }
+
+        manifestfile << "</Index></Manifest>" << endl;
+        manifestfile.close ();
+
+        // Store manifest filepath so we can remove it later
+        manifest_files.push_back(manifestfilename);
+
+        // Send the manifest filename as the instruction
+        sprintf(buffer, "%s", manifestfilename);
+
+        // mark processors as busy
+        incoming[dest] = 'B';
+        // send out the job to the processor
+        MPI_Send (&buffer, strlen (buffer)+1, MPI_CHAR, dest+1, 1, MPI_COMM_WORLD);
+        // wait for a done acknowledgement
+        MPI_Irecv (&incoming[dest], 1, MPI_CHAR, dest+1, 1, MPI_COMM_WORLD, &request[dest]);
+        // update counter of actual tasks
+        if (dest > actualTasks)
+        {
+          actualTasks = dest;
+        }
+	// increase number of manifest files processed
+	manifest_file_count++;
+      }
+    }
+
+    infile.close();
+
+    // wait until all outstanding tasks are completed
+    int dest;
+    for ( int k=0; k<actualTasks; k++ )
+    {
+      MPI_Waitany (actualTasks, request, &dest, status);
+    }
+
+    // send message to end all processing engines
+    char endstr[5] = "end";
+    for ( int i=1; i<numtasks; i++ )
+    {
+      MPI_Send (endstr, 4, MPI_CHAR, i, 1, MPI_COMM_WORLD);
+    }
+
+    // Free up manifest files
+    for ( int i = 0; i < manifest_files.size(); i++)
+    {
+      free(manifest_files[i]);
+    }
+
+  }
+  // slave node processing
+  else
+  {
+    char incoming[BUFFERSIZE];
+
+    do
+    {
+      // wait for instruction from master
+      int resval = MPI_Recv (&incoming, BUFFERSIZE, MPI_CHAR, 0, 1, MPI_COMM_WORLD, &stat);
+      if (resval != MPI_SUCCESS)
+      {
+        printf ("Error when recieving message from master [%d]... Terminating.\n", resval);
+        MPI_Abort(MPI_COMM_WORLD, rc);
+      }
+      if (strcmp (incoming, "end") != 0)
+      {
+        // process a received job
+        cout << "Processing [" << rank << ":" << incoming << "]" << endl;
+
+        // create Greenstone import command
+        // - incoming now contains the name of the manifest file to process
+        char command[2048];
+        if (site != "")
+        {
+          sprintf (command, "%s/bin/script/import.pl -keepold -manifest %s -site %s %s", gsdlhomedir, incoming, site, collection);
+        }
+        else
+        {
+          sprintf (command, "%s/bin/script/import.pl -keepold -manifest %s %s", gsdlhomedir, incoming, collection);
+        }
+        cout << "**** cmd = " << command << endl;
+
+        // invoke Greenstone import with manifest file
+        system (command);
+
+        char line = ' ';
+        // send completed message
+        MPI_Send (&line, 1, MPI_CHAR, 0, 1, MPI_COMM_WORLD);
+      }
+    }
+    while (strcmp (incoming, "end") != 0);
+    // stop when "end" instruction is received
+  }
+
+  // clean up MPI environment
+  MPI_Finalize();
+}
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/txt2dbl-src/.svnignore
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/txt2dbl-src/.svnignore	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/txt2dbl-src/.svnignore	(revision 24799)
@@ -0,0 +1,6 @@
+Makefile
+autom4te.cache
+config.log
+config.status
+txt2dbl
+.deps
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/txt2dbl-src/Makefile.in
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/txt2dbl-src/Makefile.in	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/txt2dbl-src/Makefile.in	(revision 24799)
@@ -0,0 +1,84 @@
+###########################################################################
+#
+# Makefile -- parallel-building/src/txt2dbl-src
+#
+# Standard txt2db (GDBM) executable but augmented with file locking so as
+# to support parallel reads/writes
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999-2008  The New Zealand Digital Library Project
+#
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+GSDL_DIR = ../../../..
+COMMON_DIR = $(GSDL_DIR)/common-src
+
+COMMON_PACKAGES_DIR = $(COMMON_DIR)/packages
+
+CXX = @CXX@
+CXXFLAGS = @CXXFLAGS@
+DEFS = @DEFS@ $(GDBM_DEFINES) $(JDBM_DEFINES) $(SQLITE_DEFINES)
+INCLUDES = -I. @GDBM_CFLAGS@ -I$(COMMON_DIR)/src/lib -I${GEXTPARALLELBUILDING_INSTALLED}/include
+INSTALL = @INSTALL@
+LDFLAGS = @LDFLAGS@ -L${GEXTPARALLELBUILDING_INSTALLED}/lib
+LIBS = -lm -lg @LIBS@ @GDBM_LIBS@ $(COMMON_DIR)/src/lib/gsdllib.a
+
+
+CXXCOMPILE = $(CXX) -c $(CXXFLAGS) $(DEFS) $(INCLUDES)
+CXXLINK = $(CXX) $(LDFLAGS) -o $@
+
+
+.SUFFIXES:
+.SUFFIXES: .cpp .o
+.cpp.o:
+	$(CXXCOMPILE) $<
+
+
+SOURCES = \
+	txt2dbl.cpp
+
+OBJECTS = \
+	txt2dbl.o
+
+EXECUTABLE_OBJECTS = \
+	$(OBJECTS)
+
+EXECUTABLE = txt2dbl
+
+
+# Default target: make the txt2tdb executable
+all: $(EXECUTABLE)
+
+txt2dbl: $(EXECUTABLE_OBJECTS)
+	$(CXXLINK) $(EXECUTABLE_OBJECTS) $(LIBS)
+
+install: $(EXECUTABLE)
+	$(INSTALL) -d ${GEXTPARALLELBUILDING_INSTALLED}/bin
+	$(INSTALL) -m 755 -s $(EXECUTABLE) ${GEXTPARALLELBUILDING_INSTALLED}/bin
+
+clean:
+	rm -f $(OBJECTS) $(EXECUTABLE)
+
+distclean:
+	rm -f $(OBJECTS) $(EXECUTABLE) Makefile
+
+depend:
+	makedepend -Y -- $(DEFS) $(INCLUDES) $(CXXFLAGS) -- $(SOURCES)
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/txt2dbl-src/aclocal.m4
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/txt2dbl-src/aclocal.m4	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/txt2dbl-src/aclocal.m4	(revision 24799)
@@ -0,0 +1,951 @@
+# generated automatically by aclocal 1.11 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2007, 2008, 2009  Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],,
+[m4_warning([this file was generated for autoconf 2.68.
+You have another version of autoconf.  It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically `autoreconf'.])])
+
+# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.11'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version.  Point them to the right macro.
+m4_if([$1], [1.11], [],
+      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too.  Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.11])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 9
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 10
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
+       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
+       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+       [$1], UPC,  [depcc="$UPC"  am_compiler_list=],
+       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                   [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  am__universal=false
+  m4_case([$1], [CC],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac],
+    [CXX],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac])
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 5
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named `Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`AS_DIRNAME("$mf")`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running `make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`AS_DIRNAME(["$file"])`
+      AS_MKDIR_P([$dirpart/$fdir])
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled.  FIXME.  This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 16
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.62])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
+  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+	      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+			     [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+		  [_AM_DEPENDENCIES(CC)],
+		  [define([AC_PROG_CC],
+			  defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+		  [_AM_DEPENDENCIES(CXX)],
+		  [define([AC_PROG_CXX],
+			  defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+		  [_AM_DEPENDENCIES(OBJC)],
+		  [define([AC_PROG_OBJC],
+			  defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
+])
+_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
+dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
+dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
+dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+])
+
+dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Check to see how 'make' treats includes.	            -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2009  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 6
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check for `mkdir -p'.
+AC_DEFUN([AM_PROG_MKDIR_P],
+[AC_PREREQ([2.60])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
+dnl while keeping a definition of mkdir_p for backward compatibility.
+dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
+dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
+dnl Makefile.ins that do not define MKDIR_P, so we do our own
+dnl adjustment using top_builddir (which is defined more often than
+dnl MKDIR_P).
+AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
+case $mkdir_p in
+  [[\\/$]]* | ?:[[\\/]]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[[\\\"\#\$\&\'\`$am_lf]]*)
+    AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+  *[[\\\"\#\$\&\'\`$am_lf\ \	]]*)
+    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
+esac
+
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+   if test "$[*]" = "X"; then
+      # -L didn't work.
+      set X `ls -t "$srcdir/configure" conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$[*]" != "X $srcdir/configure conftest.file" \
+      && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+     [m4_case([$1], [ustar],, [pax],,
+              [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+  case $_am_tool in
+  gnutar)
+    for _am_tar in tar gnutar gtar;
+    do
+      AM_RUN_LOG([$_am_tar --version]) && break
+    done
+    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+    am__untar="$_am_tar -xf -"
+    ;;
+  plaintar)
+    # Must skip GNU tar: if it does not support --format= it doesn't create
+    # ustar tarball either.
+    (tar --version) >/dev/null 2>&1 && continue
+    am__tar='tar chf - "$$tardir"'
+    am__tar_='tar chf - "$tardir"'
+    am__untar='tar xf -'
+    ;;
+  pax)
+    am__tar='pax -L -x $1 -w "$$tardir"'
+    am__tar_='pax -L -x $1 -w "$tardir"'
+    am__untar='pax -r'
+    ;;
+  cpio)
+    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+    am__untar='cpio -i -H $1 -d'
+    ;;
+  none)
+    am__tar=false
+    am__tar_=false
+    am__untar=false
+    ;;
+  esac
+
+  # If the value was cached, stop now.  We just wanted to have am__tar
+  # and am__untar set.
+  test -n "${am_cv_prog_tar_$1}" && break
+
+  # tar/untar a dummy directory, and stop if the command works
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  echo GrepMe > conftest.dir/file
+  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+  rm -rf conftest.dir
+  if test -s conftest.tar; then
+    AM_RUN_LOG([$am__untar <conftest.tar])
+    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+  fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/txt2dbl-src/config.guess
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/txt2dbl-src/config.guess	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/txt2dbl-src/config.guess	(revision 24799)
@@ -0,0 +1,1561 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+#   Free Software Foundation, Inc.
+
+timestamp='2009-04-27'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Originally written by Per Bothner <per@bothner.com>.
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int x;" > $dummy.c ;
+	for c in cc gcc c89 c99 ; do
+	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+	     CC_FOR_BUILD="$c"; break ;
+	  fi ;
+	done ;
+	if test x"$CC_FOR_BUILD" = x ; then
+	  CC_FOR_BUILD=no_compiler_found ;
+	fi
+	;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+	# NetBSD (nbsd) targets should (where applicable) match one or
+	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	#
+	# Note: NetBSD doesn't particularly care about the vendor
+	# portion of the name.  We always set it to "unknown".
+	sysctl="sysctl -n hw.machine_arch"
+	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+	case "${UNAME_MACHINE_ARCH}" in
+	    armeb) machine=armeb-unknown ;;
+	    arm*) machine=arm-unknown ;;
+	    sh3el) machine=shl-unknown ;;
+	    sh3eb) machine=sh-unknown ;;
+	    sh5el) machine=sh5le-unknown ;;
+	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+	esac
+	# The Operating System including object format, if it has switched
+	# to ELF recently, or will in the future.
+	case "${UNAME_MACHINE_ARCH}" in
+	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+		eval $set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep __ELF__ >/dev/null
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+	        os=netbsd
+		;;
+	esac
+	# The OS release
+	# Debian GNU/NetBSD machines have a different userland, and
+	# thus, need a distinct triplet. However, they do not need
+	# kernel version information, so it can be replaced with a
+	# suitable tag, in the style of linux-gnu.
+	case "${UNAME_VERSION}" in
+	    Debian*)
+		release='-gnu'
+		;;
+	    *)
+		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+		;;
+	esac
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	echo "${machine}-${os}${release}"
+	exit ;;
+    *:OpenBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+	exit ;;
+    *:ekkoBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+	exit ;;
+    *:SolidBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+	exit ;;
+    macppc:MirBSD:*:*)
+	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    *:MirBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    alpha:OSF1:*:*)
+	case $UNAME_RELEASE in
+	*4.0)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+		;;
+	*5.*)
+	        UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+		;;
+	esac
+	# According to Compaq, /usr/sbin/psrinfo has been available on
+	# OSF/1 and Tru64 systems produced since 1995.  I hope that
+	# covers most systems running today.  This code pipes the CPU
+	# types through head -n 1, so we only detect the type of CPU 0.
+	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+	case "$ALPHA_CPU_TYPE" in
+	    "EV4 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV4.5 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "LCA4 (21066/21068)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV5 (21164)")
+		UNAME_MACHINE="alphaev5" ;;
+	    "EV5.6 (21164A)")
+		UNAME_MACHINE="alphaev56" ;;
+	    "EV5.6 (21164PC)")
+		UNAME_MACHINE="alphapca56" ;;
+	    "EV5.7 (21164PC)")
+		UNAME_MACHINE="alphapca57" ;;
+	    "EV6 (21264)")
+		UNAME_MACHINE="alphaev6" ;;
+	    "EV6.7 (21264A)")
+		UNAME_MACHINE="alphaev67" ;;
+	    "EV6.8CB (21264C)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8AL (21264B)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8CX (21264D)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.9A (21264/EV69A)")
+		UNAME_MACHINE="alphaev69" ;;
+	    "EV7 (21364)")
+		UNAME_MACHINE="alphaev7" ;;
+	    "EV7.9 (21364A)")
+		UNAME_MACHINE="alphaev79" ;;
+	esac
+	# A Pn.n version is a patched version.
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	exit ;;
+    Alpha\ *:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# Should we change UNAME_MACHINE based on the output of uname instead
+	# of the specific Alpha model?
+	echo alpha-pc-interix
+	exit ;;
+    21064:Windows_NT:50:3)
+	echo alpha-dec-winnt3.5
+	exit ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-unknown-sysv4
+	exit ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-amigaos
+	exit ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-morphos
+	exit ;;
+    *:OS/390:*:*)
+	echo i370-ibm-openedition
+	exit ;;
+    *:z/VM:*:*)
+	echo s390-ibm-zvmoe
+	exit ;;
+    *:OS400:*:*)
+        echo powerpc-ibm-os400
+	exit ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit ;;
+    arm:riscos:*:*|arm:RISCOS:*:*)
+	echo arm-unknown-riscos
+	exit ;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit ;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit ;;
+    NILE*:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit ;;
+    DRS?6000:unix:4.0:6*)
+	echo sparc-icl-nx6
+	exit ;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+	case `/usr/bin/uname -p` in
+	    sparc) echo sparc-icl-nx7; exit ;;
+	esac ;;
+    s390x:SunOS:*:*)
+	echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4H:SunOS:5.*:*)
+	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+	eval $set_cc_for_build
+	SUN_ARCH="i386"
+	# If there is a compiler, see if it is configured for 64-bit objects.
+	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+	# This test works for both compilers.
+	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		grep IS_64BIT_ARCH >/dev/null
+	    then
+		SUN_ARCH="x86_64"
+	    fi
+	fi
+	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:*:*)
+	case "`/usr/bin/arch -k`" in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+	exit ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos${UNAME_RELEASE}
+	exit ;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+	case "`/bin/arch`" in
+	    sun3)
+		echo m68k-sun-sunos${UNAME_RELEASE}
+		;;
+	    sun4)
+		echo sparc-sun-sunos${UNAME_RELEASE}
+		;;
+	esac
+	exit ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos${UNAME_RELEASE}
+	exit ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+        exit ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+        echo m68k-milan-mint${UNAME_RELEASE}
+        exit ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+        echo m68k-hades-mint${UNAME_RELEASE}
+        exit ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+        echo m68k-unknown-mint${UNAME_RELEASE}
+        exit ;;
+    m68k:machten:*:*)
+	echo m68k-apple-machten${UNAME_RELEASE}
+	exit ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten${UNAME_RELEASE}
+	exit ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	echo clipper-intergraph-clix${UNAME_RELEASE}
+	exit ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c &&
+	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+	  SYSTEM_NAME=`$dummy $dummyarg` &&
+	    { echo "$SYSTEM_NAME"; exit; }
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit ;;
+    Motorola:PowerMAX_OS:*:*)
+	echo powerpc-motorola-powermax
+	exit ;;
+    Motorola:*:4.3:PL8-*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+	then
+	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+	       [ ${TARGET_BINARY_INTERFACE}x = x ]
+	    then
+		echo m88k-dg-dgux${UNAME_RELEASE}
+	    else
+		echo m88k-dg-dguxbcs${UNAME_RELEASE}
+	    fi
+	else
+	    echo i586-dg-dgux${UNAME_RELEASE}
+	fi
+ 	exit ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+	exit ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
+	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+	echo i386-ibm-aix
+	exit ;;
+    ia64:AIX:*:*)
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		eval $set_cc_for_build
+		sed 's/^		//' << EOF >$dummy.c
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+		then
+			echo "$SYSTEM_NAME"
+		else
+			echo rs6000-ibm-aix3.2.5
+		fi
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		echo rs6000-ibm-aix3.2.4
+	else
+		echo rs6000-ibm-aix3.2
+	fi
+	exit ;;
+    *:AIX:*:[456])
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+	echo romp-ibm-bsd4.4
+	exit ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+	exit ;;                             # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit ;;
+    9000/[34678]??:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+		if [ -x /usr/bin/getconf ]; then
+		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+                    case "${sc_cpu_version}" in
+                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+                      532)                      # CPU_PA_RISC2_0
+                        case "${sc_kernel_bits}" in
+                          32) HP_ARCH="hppa2.0n" ;;
+                          64) HP_ARCH="hppa2.0w" ;;
+			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+                        esac ;;
+                    esac
+		fi
+		if [ "${HP_ARCH}" = "" ]; then
+		    eval $set_cc_for_build
+		    sed 's/^              //' << EOF >$dummy.c
+
+              #define _HPUX_SOURCE
+              #include <stdlib.h>
+              #include <unistd.h>
+
+              int main ()
+              {
+              #if defined(_SC_KERNEL_BITS)
+                  long bits = sysconf(_SC_KERNEL_BITS);
+              #endif
+                  long cpu  = sysconf (_SC_CPU_VERSION);
+
+                  switch (cpu)
+              	{
+              	case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+              	case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+              	case CPU_PA_RISC2_0:
+              #if defined(_SC_KERNEL_BITS)
+              	    switch (bits)
+              		{
+              		case 64: puts ("hppa2.0w"); break;
+              		case 32: puts ("hppa2.0n"); break;
+              		default: puts ("hppa2.0"); break;
+              		} break;
+              #else  /* !defined(_SC_KERNEL_BITS) */
+              	    puts ("hppa2.0"); break;
+              #endif
+              	default: puts ("hppa1.0"); break;
+              	}
+                  exit (0);
+              }
+EOF
+		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+		    test -z "$HP_ARCH" && HP_ARCH=hppa
+		fi ;;
+	esac
+	if [ ${HP_ARCH} = "hppa2.0w" ]
+	then
+	    eval $set_cc_for_build
+
+	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+	    # generating 64-bit code.  GNU and HP use different nomenclature:
+	    #
+	    # $ CC_FOR_BUILD=cc ./config.guess
+	    # => hppa2.0w-hp-hpux11.23
+	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+	    # => hppa64-hp-hpux11.23
+
+	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+		grep __LP64__ >/dev/null
+	    then
+		HP_ARCH="hppa2.0w"
+	    else
+		HP_ARCH="hppa64"
+	    fi
+	fi
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit ;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ia64-hp-hpux${HPUX_REV}
+	exit ;;
+    3050*:HI-UX:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+		{ echo "$SYSTEM_NAME"; exit; }
+	echo unknown-hitachi-hiuxwe2
+	exit ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+	echo hppa1.0-hp-mpeix
+	exit ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit ;;
+    i*86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo ${UNAME_MACHINE}-unknown-osf1mk
+	else
+	    echo ${UNAME_MACHINE}-unknown-osf1
+	fi
+	exit ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+        exit ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+        exit ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+        exit ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+        exit ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+        exit ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*[A-Z]90:*:*:*)
+	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+	      -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*T3E:*:*:*)
+	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*SV1:*:*:*)
+	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    *:UNICOS/mp:*:*)
+	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit ;;
+    5000:UNIX_System_V:4.*:*)
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+	exit ;;
+    sparc*:BSD/OS:*:*)
+	echo sparc-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:FreeBSD:*:*)
+	case ${UNAME_MACHINE} in
+	    pc98)
+		echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    amd64)
+		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    *)
+		echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	esac
+	exit ;;
+    i*:CYGWIN*:*)
+	echo ${UNAME_MACHINE}-pc-cygwin
+	exit ;;
+    *:MINGW*:*)
+	echo ${UNAME_MACHINE}-pc-mingw32
+	exit ;;
+    i*:windows32*:*)
+    	# uname -m includes "-pc" on this system.
+    	echo ${UNAME_MACHINE}-mingw32
+	exit ;;
+    i*:PW*:*)
+	echo ${UNAME_MACHINE}-pc-pw32
+	exit ;;
+    *:Interix*:[3456]*)
+    	case ${UNAME_MACHINE} in
+	    x86)
+		echo i586-pc-interix${UNAME_RELEASE}
+		exit ;;
+	    EM64T | authenticamd | genuineintel)
+		echo x86_64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	    IA64)
+		echo ia64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	esac ;;
+    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+	echo i${UNAME_MACHINE}-pc-mks
+	exit ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+	# UNAME_MACHINE based on the output of uname instead of i386?
+	echo i586-pc-interix
+	exit ;;
+    i*:UWIN*:*)
+	echo ${UNAME_MACHINE}-pc-uwin
+	exit ;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+	echo x86_64-unknown-cygwin
+	exit ;;
+    p*:CYGWIN*:*)
+	echo powerpcle-unknown-cygwin
+	exit ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    *:GNU:*:*)
+	# the GNU system
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit ;;
+    *:GNU/*:*:*)
+	# other systems with GNU libc and userland
+	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+	exit ;;
+    i*86:Minix:*:*)
+	echo ${UNAME_MACHINE}-pc-minix
+	exit ;;
+    arm*:Linux:*:*)
+	eval $set_cc_for_build
+	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+	    | grep -q __ARM_EABI__
+	then
+	    echo ${UNAME_MACHINE}-unknown-linux-gnu
+	else
+	    echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+	fi
+	exit ;;
+    avr32*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    cris:Linux:*:*)
+	echo cris-axis-linux-gnu
+	exit ;;
+    crisv32:Linux:*:*)
+	echo crisv32-axis-linux-gnu
+	exit ;;
+    frv:Linux:*:*)
+    	echo frv-unknown-linux-gnu
+	exit ;;
+    ia64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m32r*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m68*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    mips:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef mips
+	#undef mipsel
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=mipsel
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=mips
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+	    /^CPU/{
+		s: ::g
+		p
+	    }'`"
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+	;;
+    mips64:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef mips64
+	#undef mips64el
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=mips64el
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=mips64
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+	    /^CPU/{
+		s: ::g
+		p
+	    }'`"
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+	;;
+    or32:Linux:*:*)
+	echo or32-unknown-linux-gnu
+	exit ;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-gnu
+	exit ;;
+    ppc64:Linux:*:*)
+	echo powerpc64-unknown-linux-gnu
+	exit ;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev68 ;;
+        esac
+	objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+	exit ;;
+    padre:Linux:*:*)
+	echo sparc-unknown-linux-gnu
+	exit ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
+	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
+	  *)    echo hppa-unknown-linux-gnu ;;
+	esac
+	exit ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-gnu
+	exit ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	echo ${UNAME_MACHINE}-ibm-linux
+	exit ;;
+    sh64*:Linux:*:*)
+    	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    sh*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    vax:Linux:*:*)
+	echo ${UNAME_MACHINE}-dec-linux-gnu
+	exit ;;
+    x86_64:Linux:*:*)
+	echo x86_64-unknown-linux-gnu
+	exit ;;
+    xtensa*:Linux:*:*)
+    	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    i*86:Linux:*:*)
+	# The BFD linker knows what the default object file format is, so
+	# first see if it will tell us. cd to the root directory to prevent
+	# problems with other programs or directories called `ld' in the path.
+	# Set LC_ALL=C to ensure ld outputs messages in English.
+	ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+			 | sed -ne '/supported targets:/!d
+				    s/[ 	][ 	]*/ /g
+				    s/.*supported targets: *//
+				    s/ .*//
+				    p'`
+        case "$ld_supported_targets" in
+	  elf32-i386)
+		TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+		;;
+	  a.out-i386-linux)
+		echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+		exit ;;
+	  "")
+		# Either a pre-BFD a.out linker (linux-gnuoldld) or
+		# one that does not give us useful --help.
+		echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+		exit ;;
+	esac
+	# Determine whether the default compiler is a.out or elf
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <features.h>
+	#ifdef __ELF__
+	# ifdef __GLIBC__
+	#  if __GLIBC__ >= 2
+	LIBC=gnu
+	#  else
+	LIBC=gnulibc1
+	#  endif
+	# else
+	LIBC=gnulibc1
+	# endif
+	#else
+	#if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+	LIBC=gnu
+	#else
+	LIBC=gnuaout
+	#endif
+	#endif
+	#ifdef __dietlibc__
+	LIBC=dietlibc
+	#endif
+EOF
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+	    /^LIBC/{
+		s: ::g
+		p
+	    }'`"
+	test x"${LIBC}" != x && {
+		echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+		exit
+	}
+	test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
+	;;
+    i*86:DYNIX/ptx:4*:*)
+	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+	# earlier versions are messed up and put the nodename in both
+	# sysname and nodename.
+	echo i386-sequent-sysv4
+	exit ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+        # Unixware is an offshoot of SVR4, but it has its own version
+        # number series starting with 2...
+        # I am not positive that other SVR4 systems won't match this,
+	# I just have to hope.  -- rms.
+        # Use sysv4.2uw... so that sysv4* matches it.
+	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+	exit ;;
+    i*86:OS/2:*:*)
+	# If we were able to find `uname', then EMX Unix compatibility
+	# is probably installed.
+	echo ${UNAME_MACHINE}-pc-os2-emx
+	exit ;;
+    i*86:XTS-300:*:STOP)
+	echo ${UNAME_MACHINE}-unknown-stop
+	exit ;;
+    i*86:atheos:*:*)
+	echo ${UNAME_MACHINE}-unknown-atheos
+	exit ;;
+    i*86:syllable:*:*)
+	echo ${UNAME_MACHINE}-pc-syllable
+	exit ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+	echo i386-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    i*86:*DOS:*:*)
+	echo ${UNAME_MACHINE}-pc-msdosdjgpp
+	exit ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+	else
+		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+	fi
+	exit ;;
+    i*86:*:5:[678]*)
+    	# UnixWare 7.x, OpenUNIX and OpenServer 6.
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	exit ;;
+    i*86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-pc-sysv32
+	fi
+	exit ;;
+    pc:*:*:*)
+	# Left here for compatibility:
+        # uname -m prints for DJGPP always 'pc', but it prints nothing about
+        # the processor, so we play safe by assuming i586.
+	# Note: whatever this is, it MUST be the same as what config.sub
+	# prints for the "djgpp" host, or else GDB configury will decide that
+	# this is a cross-build.
+	echo i586-pc-msdosdjgpp
+        exit ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit ;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	fi
+	exit ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+	echo m68k-convergent-sysv
+	exit ;;
+    M680?0:D-NIX:5.3:*)
+	echo m68k-diab-dnix
+	exit ;;
+    M68*:*:R3V[5678]*:*)
+	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && { echo i486-ncr-sysv4; exit; } ;;
+    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+	OS_REL='.3'
+	test -r /etc/.relid \
+	    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+	echo m68k-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    rs6000:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+	echo powerpc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv${UNAME_RELEASE}
+	exit ;;
+    RM*:ReliantUNIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		echo ${UNAME_MACHINE}-sni-sysv4
+	else
+		echo ns32k-sni-sysv
+	fi
+	exit ;;
+    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                      # says <Richard.M.Bartel@ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes@openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit ;;
+    *:*:*:FTX*)
+	# From seanf@swdc.stratus.com.
+	echo i860-stratus-sysv4
+	exit ;;
+    i*86:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo ${UNAME_MACHINE}-stratus-vos
+	exit ;;
+    *:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo hppa1.1-stratus-vos
+	exit ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux${UNAME_RELEASE}
+	exit ;;
+    news*:NEWS-OS:6*:*)
+	echo mips-sony-newsos6
+	exit ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+	if [ -d /usr/nec ]; then
+	        echo mips-nec-sysv${UNAME_RELEASE}
+	else
+	        echo mips-unknown-sysv${UNAME_RELEASE}
+	fi
+        exit ;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	echo powerpc-be-beos
+	exit ;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	echo powerpc-apple-beos
+	exit ;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	echo i586-pc-beos
+	exit ;;
+    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
+	echo i586-pc-haiku
+	exit ;;
+    SX-4:SUPER-UX:*:*)
+	echo sx4-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-5:SUPER-UX:*:*)
+	echo sx5-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-6:SUPER-UX:*:*)
+	echo sx6-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-7:SUPER-UX:*:*)
+	echo sx7-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8:SUPER-UX:*:*)
+	echo sx8-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8R:SUPER-UX:*:*)
+	echo sx8r-nec-superux${UNAME_RELEASE}
+	exit ;;
+    Power*:Rhapsody:*:*)
+	echo powerpc-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Rhapsody:*:*)
+	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Darwin:*:*)
+	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+	case $UNAME_PROCESSOR in
+	    unknown) UNAME_PROCESSOR=powerpc ;;
+	esac
+	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+	exit ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	UNAME_PROCESSOR=`uname -p`
+	if test "$UNAME_PROCESSOR" = "x86"; then
+		UNAME_PROCESSOR=i386
+		UNAME_MACHINE=pc
+	fi
+	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+	exit ;;
+    *:QNX:*:4*)
+	echo i386-pc-qnx
+	exit ;;
+    NSE-?:NONSTOP_KERNEL:*:*)
+	echo nse-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSR-?:NONSTOP_KERNEL:*:*)
+	echo nsr-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    *:NonStop-UX:*:*)
+	echo mips-compaq-nonstopux
+	exit ;;
+    BS2000:POSIX*:*:*)
+	echo bs2000-siemens-sysv
+	exit ;;
+    DS/*:UNIX_System_V:*:*)
+	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+	exit ;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	if test "$cputype" = "386"; then
+	    UNAME_MACHINE=i386
+	else
+	    UNAME_MACHINE="$cputype"
+	fi
+	echo ${UNAME_MACHINE}-unknown-plan9
+	exit ;;
+    *:TOPS-10:*:*)
+	echo pdp10-unknown-tops10
+	exit ;;
+    *:TENEX:*:*)
+	echo pdp10-unknown-tenex
+	exit ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	echo pdp10-dec-tops20
+	exit ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	echo pdp10-xkl-tops20
+	exit ;;
+    *:TOPS-20:*:*)
+	echo pdp10-unknown-tops20
+	exit ;;
+    *:ITS:*:*)
+	echo pdp10-unknown-its
+	exit ;;
+    SEI:*:*:SEIUX)
+        echo mips-sei-seiux${UNAME_RELEASE}
+	exit ;;
+    *:DragonFly:*:*)
+	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit ;;
+    *:*VMS:*:*)
+    	UNAME_MACHINE=`(uname -p) 2>/dev/null`
+	case "${UNAME_MACHINE}" in
+	    A*) echo alpha-dec-vms ; exit ;;
+	    I*) echo ia64-dec-vms ; exit ;;
+	    V*) echo vax-dec-vms ; exit ;;
+	esac ;;
+    *:XENIX:*:SysV)
+	echo i386-pc-xenix
+	exit ;;
+    i*86:skyos:*:*)
+	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+	exit ;;
+    i*86:rdos:*:*)
+	echo ${UNAME_MACHINE}-pc-rdos
+	exit ;;
+    i*86:AROS:*:*)
+	echo ${UNAME_MACHINE}-pc-aros
+	exit ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+          "4"
+#else
+	  ""
+#endif
+         ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+	printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+	printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# else
+    printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+	{ echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+	echo c1-convex-bsd
+	exit ;;
+    c2*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit ;;
+    c34*)
+	echo c34-convex-bsd
+	exit ;;
+    c38*)
+	echo c38-convex-bsd
+	exit ;;
+    c4*)
+	echo c4-convex-bsd
+	exit ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+and
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/txt2dbl-src/config.sub
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/txt2dbl-src/config.sub	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/txt2dbl-src/config.sub	(revision 24799)
@@ -0,0 +1,1686 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+#   Free Software Foundation, Inc.
+
+timestamp='2009-04-17'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
+  uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
+  kopensolaris*-gnu* | \
+  storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+	-sun*os*)
+		# Prevent following clause from handling this invalid input.
+		;;
+	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+	-apple | -axis | -knuth | -cray)
+		os=
+		basic_machine=$1
+		;;
+	-sim | -cisco | -oki | -wec | -winbond)
+		os=
+		basic_machine=$1
+		;;
+	-scout)
+		;;
+	-wrs)
+		os=-vxworks
+		basic_machine=$1
+		;;
+	-chorusos*)
+		os=-chorusos
+		basic_machine=$1
+		;;
+ 	-chorusrdb)
+ 		os=-chorusrdb
+		basic_machine=$1
+ 		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco6)
+		os=-sco5v6
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5)
+		os=-sco3.2v5
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5v6*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-udk*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-lynx*)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-windowsnt*)
+		os=`echo $os | sed -e 's/windowsnt/winnt/'`
+		;;
+	-psos*)
+		os=-psos
+		;;
+	-mint | -mint[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+	# Recognize the basic CPU types without company name.
+	# Some are omitted here because they have special meanings below.
+	1750a | 580 \
+	| a29k \
+	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+	| am33_2.0 \
+	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+	| bfin \
+	| c4x | clipper \
+	| d10v | d30v | dlx | dsp16xx \
+	| fido | fr30 | frv \
+	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| i370 | i860 | i960 | ia64 \
+	| ip2k | iq2000 \
+	| lm32 \
+	| m32c | m32r | m32rle | m68000 | m68k | m88k \
+	| maxq | mb | microblaze | mcore | mep | metag \
+	| mips | mipsbe | mipseb | mipsel | mipsle \
+	| mips16 \
+	| mips64 | mips64el \
+	| mips64octeon | mips64octeonel \
+	| mips64orion | mips64orionel \
+	| mips64r5900 | mips64r5900el \
+	| mips64vr | mips64vrel \
+	| mips64vr4100 | mips64vr4100el \
+	| mips64vr4300 | mips64vr4300el \
+	| mips64vr5000 | mips64vr5000el \
+	| mips64vr5900 | mips64vr5900el \
+	| mipsisa32 | mipsisa32el \
+	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa64 | mipsisa64el \
+	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64sb1 | mipsisa64sb1el \
+	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipstx39 | mipstx39el \
+	| mn10200 | mn10300 \
+	| moxie \
+	| mt \
+	| msp430 \
+	| nios | nios2 \
+	| ns16k | ns32k \
+	| or32 \
+	| pdp10 | pdp11 | pj | pjl \
+	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+	| pyramid \
+	| score \
+	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+	| sh64 | sh64le \
+	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+	| spu | strongarm \
+	| tahoe | thumb | tic4x | tic80 | tron \
+	| v850 | v850e \
+	| we32k \
+	| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
+	| z8k | z80)
+		basic_machine=$basic_machine-unknown
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12)
+		# Motorola 68HC11/12.
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+		;;
+	ms1)
+		basic_machine=mt-unknown
+		;;
+
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i*86 | x86_64)
+	  basic_machine=$basic_machine-pc
+	  ;;
+	# Object if more than one company name word.
+	*-*-*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+	# Recognize the basic CPU types with company name.
+	580-* \
+	| a29k-* \
+	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+	| avr-* | avr32-* \
+	| bfin-* | bs2000-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+	| clipper-* | craynv-* | cydra-* \
+	| d10v-* | d30v-* | dlx-* \
+	| elxsi-* \
+	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+	| h8300-* | h8500-* \
+	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| i*86-* | i860-* | i960-* | ia64-* \
+	| ip2k-* | iq2000-* \
+	| lm32-* \
+	| m32c-* | m32r-* | m32rle-* \
+	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
+	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+	| mips16-* \
+	| mips64-* | mips64el-* \
+	| mips64octeon-* | mips64octeonel-* \
+	| mips64orion-* | mips64orionel-* \
+	| mips64r5900-* | mips64r5900el-* \
+	| mips64vr-* | mips64vrel-* \
+	| mips64vr4100-* | mips64vr4100el-* \
+	| mips64vr4300-* | mips64vr4300el-* \
+	| mips64vr5000-* | mips64vr5000el-* \
+	| mips64vr5900-* | mips64vr5900el-* \
+	| mipsisa32-* | mipsisa32el-* \
+	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa64-* | mipsisa64el-* \
+	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64sb1-* | mipsisa64sb1el-* \
+	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipstx39-* | mipstx39el-* \
+	| mmix-* \
+	| mt-* \
+	| msp430-* \
+	| nios-* | nios2-* \
+	| none-* | np1-* | ns16k-* | ns32k-* \
+	| orion-* \
+	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+	| pyramid-* \
+	| romp-* | rs6000-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+	| sparclite-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
+	| tahoe-* | thumb-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \
+	| tron-* \
+	| v850-* | v850e-* | vax-* \
+	| we32k-* \
+	| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
+	| xstormy16-* | xtensa*-* \
+	| ymp-* \
+	| z8k-* | z80-*)
+		;;
+	# Recognize the basic CPU types without company name, with glob match.
+	xtensa*)
+		basic_machine=$basic_machine-unknown
+		;;
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	386bsd)
+		basic_machine=i386-unknown
+		os=-bsd
+		;;
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		basic_machine=m68000-att
+		;;
+	3b*)
+		basic_machine=we32k-att
+		;;
+	a29khif)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+    	abacus)
+		basic_machine=abacus-unknown
+		;;
+	adobe68k)
+		basic_machine=m68010-adobe
+		os=-scout
+		;;
+	alliant | fx80)
+		basic_machine=fx80-alliant
+		;;
+	altos | altos3068)
+		basic_machine=m68k-altos
+		;;
+	am29k)
+		basic_machine=a29k-none
+		os=-bsd
+		;;
+	amd64)
+		basic_machine=x86_64-pc
+		;;
+	amd64-*)
+		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	amdahl)
+		basic_machine=580-amdahl
+		os=-sysv
+		;;
+	amiga | amiga-*)
+		basic_machine=m68k-unknown
+		;;
+	amigaos | amigados)
+		basic_machine=m68k-unknown
+		os=-amigaos
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-unknown
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	apollo68bsd)
+		basic_machine=m68k-apollo
+		os=-bsd
+		;;
+	aros)
+		basic_machine=i386-pc
+		os=-aros
+		;;
+	aux)
+		basic_machine=m68k-apple
+		os=-aux
+		;;
+	balance)
+		basic_machine=ns32k-sequent
+		os=-dynix
+		;;
+	blackfin)
+		basic_machine=bfin-unknown
+		os=-linux
+		;;
+	blackfin-*)
+		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	c90)
+		basic_machine=c90-cray
+		os=-unicos
+		;;
+        cegcc)
+		basic_machine=arm-unknown
+		os=-cegcc
+		;;
+	convex-c1)
+		basic_machine=c1-convex
+		os=-bsd
+		;;
+	convex-c2)
+		basic_machine=c2-convex
+		os=-bsd
+		;;
+	convex-c32)
+		basic_machine=c32-convex
+		os=-bsd
+		;;
+	convex-c34)
+		basic_machine=c34-convex
+		os=-bsd
+		;;
+	convex-c38)
+		basic_machine=c38-convex
+		os=-bsd
+		;;
+	cray | j90)
+		basic_machine=j90-cray
+		os=-unicos
+		;;
+	craynv)
+		basic_machine=craynv-cray
+		os=-unicosmp
+		;;
+	cr16)
+		basic_machine=cr16-unknown
+		os=-elf
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	crisv32 | crisv32-* | etraxfs*)
+		basic_machine=crisv32-axis
+		;;
+	cris | cris-* | etrax*)
+		basic_machine=cris-axis
+		;;
+	crx)
+		basic_machine=crx-unknown
+		os=-elf
+		;;
+	da30 | da30-*)
+		basic_machine=m68k-da30
+		;;
+	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+		basic_machine=mips-dec
+		;;
+	decsystem10* | dec10*)
+		basic_machine=pdp10-dec
+		os=-tops10
+		;;
+	decsystem20* | dec20*)
+		basic_machine=pdp10-dec
+		os=-tops20
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		basic_machine=m68k-motorola
+		;;
+	delta88)
+		basic_machine=m88k-motorola
+		os=-sysv3
+		;;
+	dicos)
+		basic_machine=i686-pc
+		os=-dicos
+		;;
+	djgpp)
+		basic_machine=i586-pc
+		os=-msdosdjgpp
+		;;
+	dpx20 | dpx20-*)
+		basic_machine=rs6000-bull
+		os=-bosx
+		;;
+	dpx2* | dpx2*-bull)
+		basic_machine=m68k-bull
+		os=-sysv3
+		;;
+	ebmon29k)
+		basic_machine=a29k-amd
+		os=-ebmon
+		;;
+	elxsi)
+		basic_machine=elxsi-elxsi
+		os=-bsd
+		;;
+	encore | umax | mmax)
+		basic_machine=ns32k-encore
+		;;
+	es1800 | OSE68k | ose68k | ose | OSE)
+		basic_machine=m68k-ericsson
+		os=-ose
+		;;
+	fx2800)
+		basic_machine=i860-alliant
+		;;
+	genix)
+		basic_machine=ns32k-ns
+		;;
+	gmicro)
+		basic_machine=tron-gmicro
+		os=-sysv
+		;;
+	go32)
+		basic_machine=i386-pc
+		os=-go32
+		;;
+	h3050r* | hiux*)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	h8300hms)
+		basic_machine=h8300-hitachi
+		os=-hms
+		;;
+	h8300xray)
+		basic_machine=h8300-hitachi
+		os=-xray
+		;;
+	h8500hms)
+		basic_machine=h8500-hitachi
+		os=-hms
+		;;
+	harris)
+		basic_machine=m88k-harris
+		os=-sysv3
+		;;
+	hp300-*)
+		basic_machine=m68k-hp
+		;;
+	hp300bsd)
+		basic_machine=m68k-hp
+		os=-bsd
+		;;
+	hp300hpux)
+		basic_machine=m68k-hp
+		os=-hpux
+		;;
+	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		basic_machine=m68000-hp
+		;;
+	hp9k3[2-9][0-9])
+		basic_machine=m68k-hp
+		;;
+	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k78[0-9] | hp78[0-9])
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][13679] | hp8[0-9][13679])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hppa-next)
+		os=-nextstep3
+		;;
+	hppaosf)
+		basic_machine=hppa1.1-hp
+		os=-osf
+		;;
+	hppro)
+		basic_machine=hppa1.1-hp
+		os=-proelf
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+	i*86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv32
+		;;
+	i*86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv4
+		;;
+	i*86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv
+		;;
+	i*86sol2)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-solaris2
+		;;
+	i386mach)
+		basic_machine=i386-mach
+		os=-mach
+		;;
+	i386-vsta | vsta)
+		basic_machine=i386-unknown
+		os=-vsta
+		;;
+	iris | iris4d)
+		basic_machine=mips-sgi
+		case $os in
+		    -irix*)
+			;;
+		    *)
+			os=-irix4
+			;;
+		esac
+		;;
+	isi68 | isi)
+		basic_machine=m68k-isi
+		os=-sysv
+		;;
+	m68knommu)
+		basic_machine=m68k-unknown
+		os=-linux
+		;;
+	m68knommu-*)
+		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	m88k-omron*)
+		basic_machine=m88k-omron
+		;;
+	magnum | m3230)
+		basic_machine=mips-mips
+		os=-sysv
+		;;
+	merlin)
+		basic_machine=ns32k-utek
+		os=-sysv
+		;;
+	mingw32)
+		basic_machine=i386-pc
+		os=-mingw32
+		;;
+	mingw32ce)
+		basic_machine=arm-unknown
+		os=-mingw32ce
+		;;
+	miniframe)
+		basic_machine=m68000-convergent
+		;;
+	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+	mips3*-*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	monitor)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	morphos)
+		basic_machine=powerpc-unknown
+		os=-morphos
+		;;
+	msdos)
+		basic_machine=i386-pc
+		os=-msdos
+		;;
+	ms1-*)
+		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+		;;
+	mvs)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	netbsd386)
+		basic_machine=i386-unknown
+		os=-netbsd
+		;;
+	netwinder)
+		basic_machine=armv4l-rebel
+		os=-linux
+		;;
+	news | news700 | news800 | news900)
+		basic_machine=m68k-sony
+		os=-newsos
+		;;
+	news1000)
+		basic_machine=m68030-sony
+		os=-newsos
+		;;
+	news-3600 | risc-news)
+		basic_machine=mips-sony
+		os=-newsos
+		;;
+	necv70)
+		basic_machine=v70-nec
+		os=-sysv
+		;;
+	next | m*-next )
+		basic_machine=m68k-next
+		case $os in
+		    -nextstep* )
+			;;
+		    -ns2*)
+		      os=-nextstep2
+			;;
+		    *)
+		      os=-nextstep3
+			;;
+		esac
+		;;
+	nh3000)
+		basic_machine=m68k-harris
+		os=-cxux
+		;;
+	nh[45]000)
+		basic_machine=m88k-harris
+		os=-cxux
+		;;
+	nindy960)
+		basic_machine=i960-intel
+		os=-nindy
+		;;
+	mon960)
+		basic_machine=i960-intel
+		os=-mon960
+		;;
+	nonstopux)
+		basic_machine=mips-compaq
+		os=-nonstopux
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	nsr-tandem)
+		basic_machine=nsr-tandem
+		;;
+	op50n-* | op60c-*)
+		basic_machine=hppa1.1-oki
+		os=-proelf
+		;;
+	openrisc | openrisc-*)
+		basic_machine=or32-unknown
+		;;
+	os400)
+		basic_machine=powerpc-ibm
+		os=-os400
+		;;
+	OSE68000 | ose68000)
+		basic_machine=m68000-ericsson
+		os=-ose
+		;;
+	os68k)
+		basic_machine=m68k-none
+		os=-os68k
+		;;
+	pa-hitachi)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	paragon)
+		basic_machine=i860-intel
+		os=-osf
+		;;
+	parisc)
+		basic_machine=hppa-unknown
+		os=-linux
+		;;
+	parisc-*)
+		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	pbd)
+		basic_machine=sparc-tti
+		;;
+	pbb)
+		basic_machine=m68k-tti
+		;;
+	pc532 | pc532-*)
+		basic_machine=ns32k-pc532
+		;;
+	pc98)
+		basic_machine=i386-pc
+		;;
+	pc98-*)
+		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium | p5 | k5 | k6 | nexgen | viac3)
+		basic_machine=i586-pc
+		;;
+	pentiumpro | p6 | 6x86 | athlon | athlon_*)
+		basic_machine=i686-pc
+		;;
+	pentiumii | pentium2 | pentiumiii | pentium3)
+		basic_machine=i686-pc
+		;;
+	pentium4)
+		basic_machine=i786-pc
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium4-*)
+		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=power-ibm
+		;;
+	ppc)	basic_machine=powerpc-unknown
+		;;
+	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppcle | powerpclittle | ppc-le | powerpc-little)
+		basic_machine=powerpcle-unknown
+		;;
+	ppcle-* | powerpclittle-*)
+		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64)	basic_machine=powerpc64-unknown
+		;;
+	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+		basic_machine=powerpc64le-unknown
+		;;
+	ppc64le-* | powerpc64little-*)
+		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	pw32)
+		basic_machine=i586-unknown
+		os=-pw32
+		;;
+	rdos)
+		basic_machine=i386-pc
+		os=-rdos
+		;;
+	rom68k)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	rm[46]00)
+		basic_machine=mips-siemens
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	s390 | s390-*)
+		basic_machine=s390-ibm
+		;;
+	s390x | s390x-*)
+		basic_machine=s390x-ibm
+		;;
+	sa29200)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	sb1)
+		basic_machine=mipsisa64sb1-unknown
+		;;
+	sb1el)
+		basic_machine=mipsisa64sb1el-unknown
+		;;
+	sde)
+		basic_machine=mipsisa32-sde
+		os=-elf
+		;;
+	sei)
+		basic_machine=mips-sei
+		os=-seiux
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sh5el)
+		basic_machine=sh5le-unknown
+		;;
+	sh64)
+		basic_machine=sh64-unknown
+		;;
+	sparclite-wrs | simso-wrs)
+		basic_machine=sparclite-wrs
+		os=-vxworks
+		;;
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
+		;;
+	spur)
+		basic_machine=spur-unknown
+		;;
+	st2000)
+		basic_machine=m68k-tandem
+		;;
+	stratus)
+		basic_machine=i860-stratus
+		os=-sysv4
+		;;
+	sun2)
+		basic_machine=m68000-sun
+		;;
+	sun2os3)
+		basic_machine=m68000-sun
+		os=-sunos3
+		;;
+	sun2os4)
+		basic_machine=m68000-sun
+		os=-sunos4
+		;;
+	sun3os3)
+		basic_machine=m68k-sun
+		os=-sunos3
+		;;
+	sun3os4)
+		basic_machine=m68k-sun
+		os=-sunos4
+		;;
+	sun4os3)
+		basic_machine=sparc-sun
+		os=-sunos3
+		;;
+	sun4os4)
+		basic_machine=sparc-sun
+		os=-sunos4
+		;;
+	sun4sol2)
+		basic_machine=sparc-sun
+		os=-solaris2
+		;;
+	sun3 | sun3-*)
+		basic_machine=m68k-sun
+		;;
+	sun4)
+		basic_machine=sparc-sun
+		;;
+	sun386 | sun386i | roadrunner)
+		basic_machine=i386-sun
+		;;
+	sv1)
+		basic_machine=sv1-cray
+		os=-unicos
+		;;
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
+		;;
+	t3e)
+		basic_machine=alphaev5-cray
+		os=-unicos
+		;;
+	t90)
+		basic_machine=t90-cray
+		os=-unicos
+		;;
+	tic54x | c54x*)
+		basic_machine=tic54x-unknown
+		os=-coff
+		;;
+	tic55x | c55x*)
+		basic_machine=tic55x-unknown
+		os=-coff
+		;;
+	tic6x | c6x*)
+		basic_machine=tic6x-unknown
+		os=-coff
+		;;
+	tile*)
+		basic_machine=tile-unknown
+		os=-linux-gnu
+		;;
+	tx39)
+		basic_machine=mipstx39-unknown
+		;;
+	tx39el)
+		basic_machine=mipstx39el-unknown
+		;;
+	toad1)
+		basic_machine=pdp10-xkl
+		os=-tops20
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	tpf)
+		basic_machine=s390x-ibm
+		os=-tpf
+		;;
+	udi29k)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
+		;;
+	v810 | necv810)
+		basic_machine=v810-nec
+		os=-none
+		;;
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
+		;;
+	vms)
+		basic_machine=vax-dec
+		os=-vms
+		;;
+	vpp*|vx|vx-*)
+		basic_machine=f301-fujitsu
+		;;
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
+		;;
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
+		;;
+	vxworks29k)
+		basic_machine=a29k-wrs
+		os=-vxworks
+		;;
+	w65*)
+		basic_machine=w65-wdc
+		os=-none
+		;;
+	w89k-*)
+		basic_machine=hppa1.1-winbond
+		os=-proelf
+		;;
+	xbox)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	z8k-*-coff)
+		basic_machine=z8k-unknown
+		os=-sim
+		;;
+	z80-*-coff)
+		basic_machine=z80-unknown
+		os=-sim
+		;;
+	none)
+		basic_machine=none-none
+		os=-none
+		;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		basic_machine=hppa1.1-winbond
+		;;
+	op50n)
+		basic_machine=hppa1.1-oki
+		;;
+	op60c)
+		basic_machine=hppa1.1-oki
+		;;
+	romp)
+		basic_machine=romp-ibm
+		;;
+	mmix)
+		basic_machine=mmix-knuth
+		;;
+	rs6000)
+		basic_machine=rs6000-ibm
+		;;
+	vax)
+		basic_machine=vax-dec
+		;;
+	pdp10)
+		# there are many clones, so DEC is not a safe bet
+		basic_machine=pdp10-unknown
+		;;
+	pdp11)
+		basic_machine=pdp11-dec
+		;;
+	we32k)
+		basic_machine=we32k-att
+		;;
+	sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
+		basic_machine=sh-unknown
+		;;
+	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+		basic_machine=sparc-sun
+		;;
+	cydra)
+		basic_machine=cydra-cydrome
+		;;
+	orion)
+		basic_machine=orion-highlevel
+		;;
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	mac | mpw | mac-mpw)
+		basic_machine=m68k-apple
+		;;
+	pmac | pmac-mpw)
+		basic_machine=powerpc-apple
+		;;
+	*-unknown)
+		# Make sure to match an already-canonicalized machine name.
+		;;
+	*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+	*-digital*)
+		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+		;;
+	*-commodore*)
+		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+        # First match some system type aliases
+        # that might get confused with valid system types.
+	# -solaris* is a basic system type, with this one exception.
+	-solaris1 | -solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	-solaris)
+		os=-solaris2
+		;;
+	-svr4*)
+		os=-sysv4
+		;;
+	-unixware*)
+		os=-sysv4.2uw
+		;;
+	-gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+		;;
+	# First accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST END IN A *, to match a version number.
+	# -sysv* is not here because it comes later, after sysvr4.
+	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+	      | -kopensolaris* \
+	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+	      | -aos* | -aros* \
+	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+	      | -openbsd* | -solidbsd* \
+	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+	      | -chorusos* | -chorusrdb* | -cegcc* \
+	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	-qnx*)
+		case $basic_machine in
+		    x86-* | i*86-*)
+			;;
+		    *)
+			os=-nto$os
+			;;
+		esac
+		;;
+	-nto-qnx*)
+		;;
+	-nto*)
+		os=`echo $os | sed -e 's|nto|nto-qnx|'`
+		;;
+	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+		;;
+	-mac*)
+		os=`echo $os | sed -e 's|mac|macos|'`
+		;;
+	-linux-dietlibc)
+		os=-linux-dietlibc
+		;;
+	-linux*)
+		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+		;;
+	-sunos5*)
+		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+		;;
+	-sunos6*)
+		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+		;;
+	-opened*)
+		os=-openedition
+		;;
+        -os400*)
+		os=-os400
+		;;
+	-wince*)
+		os=-wince
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-atheos*)
+		os=-atheos
+		;;
+	-syllable*)
+		os=-syllable
+		;;
+	-386bsd)
+		os=-bsd
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	-nova*)
+		os=-rtmk-nova
+		;;
+	-ns2 )
+		os=-nextstep2
+		;;
+	-nsk*)
+		os=-nsk
+		;;
+	# Preserve the version number of sinix5.
+	-sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	-sinix*)
+		os=-sysv4
+		;;
+        -tpf*)
+		os=-tpf
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-svr4)
+		os=-sysv4
+		;;
+	-svr3)
+		os=-sysv3
+		;;
+	-sysvr4)
+		os=-sysv4
+		;;
+	# This must come after -sysvr4.
+	-sysv*)
+		;;
+	-ose*)
+		os=-ose
+		;;
+	-es1800*)
+		os=-ose
+		;;
+	-xenix)
+		os=-xenix
+		;;
+	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+		os=-mint
+		;;
+	-aros*)
+		os=-aros
+		;;
+	-kaos*)
+		os=-kaos
+		;;
+	-zvmoe)
+		os=-zvmoe
+		;;
+	-dicos*)
+		os=-dicos
+		;;
+	-none)
+		;;
+	*)
+		# Get rid of the `-' at the beginning of $os.
+		os=`echo $os | sed 's/[^-]*-//'`
+		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+		exit 1
+		;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+        score-*)
+		os=-elf
+		;;
+        spu-*)
+		os=-elf
+		;;
+	*-acorn)
+		os=-riscix1.2
+		;;
+	arm*-rebel)
+		os=-linux
+		;;
+	arm*-semi)
+		os=-aout
+		;;
+        c4x-* | tic4x-*)
+        	os=-coff
+		;;
+	# This must come before the *-dec entry.
+	pdp10-*)
+		os=-tops20
+		;;
+	pdp11-*)
+		os=-none
+		;;
+	*-dec | vax-*)
+		os=-ultrix4.2
+		;;
+	m68*-apollo)
+		os=-domain
+		;;
+	i386-sun)
+		os=-sunos4.0.2
+		;;
+	m68000-sun)
+		os=-sunos3
+		# This also exists in the configure program, but was not the
+		# default.
+		# os=-sunos4
+		;;
+	m68*-cisco)
+		os=-aout
+		;;
+        mep-*)
+		os=-elf
+		;;
+	mips*-cisco)
+		os=-elf
+		;;
+	mips*-*)
+		os=-elf
+		;;
+	or32-*)
+		os=-coff
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	*-be)
+		os=-beos
+		;;
+	*-haiku)
+		os=-haiku
+		;;
+	*-ibm)
+		os=-aix
+		;;
+    	*-knuth)
+		os=-mmixware
+		;;
+	*-wec)
+		os=-proelf
+		;;
+	*-winbond)
+		os=-proelf
+		;;
+	*-oki)
+		os=-proelf
+		;;
+	*-hp)
+		os=-hpux
+		;;
+	*-hitachi)
+		os=-hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=-sysv
+		;;
+	*-cbm)
+		os=-amigaos
+		;;
+	*-dg)
+		os=-dgux
+		;;
+	*-dolphin)
+		os=-sysv3
+		;;
+	m68k-ccur)
+		os=-rtu
+		;;
+	m88k-omron*)
+		os=-luna
+		;;
+	*-next )
+		os=-nextstep
+		;;
+	*-sequent)
+		os=-ptx
+		;;
+	*-crds)
+		os=-unos
+		;;
+	*-ns)
+		os=-genix
+		;;
+	i370-*)
+		os=-mvs
+		;;
+	*-next)
+		os=-nextstep3
+		;;
+	*-gould)
+		os=-sysv
+		;;
+	*-highlevel)
+		os=-bsd
+		;;
+	*-encore)
+		os=-bsd
+		;;
+	*-sgi)
+		os=-irix
+		;;
+	*-siemens)
+		os=-sysv4
+		;;
+	*-masscomp)
+		os=-rtu
+		;;
+	f30[01]-fujitsu | f700-fujitsu)
+		os=-uxpv
+		;;
+	*-rom68k)
+		os=-coff
+		;;
+	*-*bug)
+		os=-coff
+		;;
+	*-apple)
+		os=-macos
+		;;
+	*-atari*)
+		os=-mint
+		;;
+	*)
+		os=-none
+		;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+	*-unknown)
+		case $os in
+			-riscix*)
+				vendor=acorn
+				;;
+			-sunos*)
+				vendor=sun
+				;;
+			-aix*)
+				vendor=ibm
+				;;
+			-beos*)
+				vendor=be
+				;;
+			-hpux*)
+				vendor=hp
+				;;
+			-mpeix*)
+				vendor=hp
+				;;
+			-hiux*)
+				vendor=hitachi
+				;;
+			-unos*)
+				vendor=crds
+				;;
+			-dgux*)
+				vendor=dg
+				;;
+			-luna*)
+				vendor=omron
+				;;
+			-genix*)
+				vendor=ns
+				;;
+			-mvs* | -opened*)
+				vendor=ibm
+				;;
+			-os400*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+			-tpf*)
+				vendor=ibm
+				;;
+			-vxsim* | -vxworks* | -windiss*)
+				vendor=wrs
+				;;
+			-aux*)
+				vendor=apple
+				;;
+			-hms*)
+				vendor=hitachi
+				;;
+			-mpw* | -macos*)
+				vendor=apple
+				;;
+			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+				vendor=atari
+				;;
+			-vos*)
+				vendor=stratus
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/txt2dbl-src/configure
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/txt2dbl-src/configure	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/txt2dbl-src/configure	(revision 24799)
@@ -0,0 +1,5208 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.68 for txt2dbl 1.0.
+#
+# Report bugs to <jmt12@students.waikato.ac.nz>.
+#
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
+# Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test "x$CONFIG_SHELL" = x; then
+  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+"
+  as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+  exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1"
+  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1"
+  if (eval "$as_required") 2>/dev/null; then :
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  as_found=:
+  case $as_dir in #(
+	 /*)
+	   for as_base in sh bash ksh sh5; do
+	     # Try only shells that exist, to save several forks.
+	     as_shell=$as_dir/$as_base
+	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  CONFIG_SHELL=$as_shell as_have_required=yes
+		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  break 2
+fi
+fi
+	   done;;
+       esac
+  as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+  CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+      if test "x$CONFIG_SHELL" != x; then :
+  # We cannot yet assume a decent shell, so we have to provide a
+	# neutralization value for shells without unset; and this also
+	# works around shells that cannot unset nonexistent variables.
+	# Preserve -v and -x to the replacement shell.
+	BASH_ENV=/dev/null
+	ENV=/dev/null
+	(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+	export CONFIG_SHELL
+	case $- in # ((((
+	  *v*x* | *x*v* ) as_opts=-vx ;;
+	  *v* ) as_opts=-v ;;
+	  *x* ) as_opts=-x ;;
+	  * ) as_opts= ;;
+	esac
+	exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
+fi
+
+    if test x$as_have_required = xno; then :
+  $as_echo "$0: This script requires a shell more modern than all"
+  $as_echo "$0: the shells that I found on your system."
+  if test x${ZSH_VERSION+set} = xset ; then
+    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+  else
+    $as_echo "$0: Please tell bug-autoconf@gnu.org and
+$0: jmt12@students.waikato.ac.nz about your system,
+$0: including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do have one."
+  fi
+  exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+  as_lineno_1=$LINENO as_lineno_1a=$LINENO
+  as_lineno_2=$LINENO as_lineno_2a=$LINENO
+  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+	test -d "$1/.";
+      else
+	case $1 in #(
+	-*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='txt2dbl'
+PACKAGE_TARNAME='txt2dbl'
+PACKAGE_VERSION='1.0'
+PACKAGE_STRING='txt2dbl 1.0'
+PACKAGE_BUGREPORT='jmt12@students.waikato.ac.nz'
+PACKAGE_URL=''
+
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIBOBJS
+GDBM_LIBS
+GDBM_CFLAGS
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+ac_ct_CC
+CFLAGS
+CC
+am__fastdepCXX_FALSE
+am__fastdepCXX_TRUE
+CXXDEPMODE
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__quote
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CXX
+CPPFLAGS
+LDFLAGS
+CXXFLAGS
+CXX
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_dependency_tracking
+with_gdbm_include_path
+with_gdbm_lib_path
+'
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CXX
+CXXFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CCC
+CC
+CFLAGS'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *=)   ac_optarg= ;;
+  *)    ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    case $ac_envvar in #(
+      '' | [0-9]* | *[!_$as_cr_alnum]* )
+      as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+    esac
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+  case $enable_option_checking in
+    no) ;;
+    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+  esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
+		datadir sysconfdir sharedstatedir localstatedir includedir \
+		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+		libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  # Remove trailing slashes.
+  case $ac_val in
+    */ )
+      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+      eval $ac_var=\$ac_val;;
+  esac
+  # Be sure to have absolute directory names.
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used" >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_myself" : 'X\(//\)[^/]' \| \
+	 X"$as_myself" : 'X\(//\)$' \| \
+	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+	pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures txt2dbl 1.0 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking ...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR            user executables [EPREFIX/bin]
+  --sbindir=DIR           system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR        program executables [EPREFIX/libexec]
+  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --libdir=DIR            object code libraries [EPREFIX/lib]
+  --includedir=DIR        C header files [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
+  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR           info documentation [DATAROOTDIR/info]
+  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR            man documentation [DATAROOTDIR/man]
+  --docdir=DIR            documentation root [DATAROOTDIR/doc/txt2dbl]
+  --htmldir=DIR           html documentation [DOCDIR]
+  --dvidir=DIR            dvi documentation [DOCDIR]
+  --pdfdir=DIR            pdf documentation [DOCDIR]
+  --psdir=DIR             ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of txt2dbl 1.0:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-option-checking  ignore unrecognized --enable/--with options
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-gdbm-include-path
+                          location of the GDBM headers
+  --with-gdbm-lib-path    location of the GDBM libraries
+
+Some influential environment variables:
+  CXX         C++ compiler command
+  CXXFLAGS    C++ compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  CC          C compiler command
+  CFLAGS      C compiler flags
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <jmt12@students.waikato.ac.nz>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" ||
+      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+      continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+txt2dbl configure 1.0
+generated by GNU Autoconf 2.68
+
+Copyright (C) 2010 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_cxx_try_compile LINENO
+# ----------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_compile
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by txt2dbl $as_me 1.0, which was
+generated by GNU Autoconf 2.68.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    $as_echo "PATH: $as_dir"
+  done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+    2)
+      as_fn_append ac_configure_args1 " '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+	ac_must_keep_next=false # Got value, back to normal.
+      else
+	case $ac_arg in
+	  *=* | --config-cache | -C | -disable-* | --disable-* \
+	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+	  | -with-* | --with-* | -without-* | --without-* | --x)
+	    case "$ac_configure_args0 " in
+	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+	    esac
+	    ;;
+	  -* ) ac_must_keep_next=true ;;
+	esac
+      fi
+      as_fn_append ac_configure_args " '$ac_arg'"
+      ;;
+    esac
+  done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+	"s/'\''/'\''\\\\'\'''\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      $as_echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=\$$ac_var
+	case $ac_val in
+	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+	esac
+	$as_echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      $as_echo "$as_me: caught signal $ac_signal"
+    $as_echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+  # We do not want a PATH search for config.site.
+  case $CONFIG_SITE in #((
+    -*)  ac_site_file1=./$CONFIG_SITE;;
+    */*) ac_site_file1=$CONFIG_SITE;;
+    *)   ac_site_file1=./$CONFIG_SITE;;
+  esac
+elif test "x$prefix" != xNONE; then
+  ac_site_file1=$prefix/share/config.site
+  ac_site_file2=$prefix/etc/config.site
+else
+  ac_site_file1=$ac_default_prefix/share/config.site
+  ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+  test "x$ac_site_file" = xNONE && continue
+  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file" \
+      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special files
+  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
+  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+	# differences in whitespace do not lead to failure.
+	ac_old_val_w=`echo x $ac_old_val`
+	ac_new_val_w=`echo x $ac_new_val`
+	if test "$ac_old_val_w" != "$ac_new_val_w"; then
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	  ac_cache_corrupted=:
+	else
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+	  eval $ac_var=\$ac_old_val
+	fi
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
+$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
+$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+am__api_version='1.11'
+
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+  if test -f "$ac_dir/install-sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f "$ac_dir/install.sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if ${ac_cv_path_install+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+  ./ | .// | /[cC]/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    rm -rf conftest.one conftest.two conftest.dir
+	    echo one > conftest.one
+	    echo two > conftest.two
+	    mkdir conftest.dir
+	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+	      test -s conftest.one && test -s conftest.two &&
+	      test -s conftest.dir/conftest.one &&
+	      test -s conftest.dir/conftest.two
+	    then
+	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	      break 3
+	    fi
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+
+  done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+$as_echo_n "checking whether build environment is sane... " >&6; }
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[\\\"\#\$\&\'\`$am_lf]*)
+    as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+  *[\\\"\#\$\&\'\`$am_lf\ \	]*)
+    as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
+esac
+
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t "$srcdir/configure" conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$*" != "X $srcdir/configure conftest.file" \
+      && test "$*" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" "$LINENO" 5
+   fi
+
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   as_fn_error $? "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+test "$program_prefix" != NONE &&
+  program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+  if ${ac_cv_path_mkdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in mkdir gmkdir; do
+	 for ac_exec_ext in '' $ac_executable_extensions; do
+	   { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
+	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+	     'mkdir (GNU coreutils) '* | \
+	     'mkdir (coreutils) '* | \
+	     'mkdir (fileutils) '4.1*)
+	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+	       break 3;;
+	   esac
+	 done
+       done
+  done
+IFS=$as_save_IFS
+
+fi
+
+  test -d ./--version && rmdir ./--version
+  if test "${ac_cv_path_mkdir+set}" = set; then
+    MKDIR_P="$ac_cv_path_mkdir -p"
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for MKDIR_P within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    MKDIR_P="$ac_install_sh -d"
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+mkdir_p="$MKDIR_P"
+case $mkdir_p in
+  [\\/$]* | ?:[\\/]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AWK+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_AWK="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$AWK" && break
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  SET_MAKE=
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  am__isrc=' -I$(srcdir)'
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='txt2dbl'
+ VERSION='1.0'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+
+# Checks for programs.
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+  if test -n "$CCC"; then
+    CXX=$CCC
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in g++
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
+$as_echo "$CXX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CXX" && break
+  done
+fi
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in g++
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CXX="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
+$as_echo "$ac_ct_CXX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CXX" && break
+done
+
+  if test "x$ac_ct_CXX" = x; then
+    CXX="g++"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CXX=$ac_ct_CXX
+  fi
+fi
+
+  fi
+fi
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5
+$as_echo_n "checking whether the C++ compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+	;;
+    [ab].out )
+	# We found the default executable, but exeext='' is most
+	# certainly right.
+	break;;
+    *.* )
+	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+	then :; else
+	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	fi
+	# We set ac_cv_exeext here because the later test for it is not
+	# safe: cross compilers may not add the suffix if given an `-o'
+	# argument, so we may need to know it at that point already.
+	# Even if this section looks crufty: it has the advantage of
+	# actually working.
+	break;;
+    * )
+	break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+if test -z "$ac_file"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C++ compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5
+$as_echo_n "checking for C++ compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	  break;;
+    * ) break;;
+  esac
+done
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+  { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+  if { ac_try='./conftest$ac_cv_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C++ compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+    fi
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
+$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
+if ${ac_cv_cxx_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
+$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GXX=yes
+else
+  GXX=
+fi
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
+$as_echo_n "checking whether $CXX accepts -g... " >&6; }
+if ${ac_cv_prog_cxx_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+   ac_cxx_werror_flag=yes
+   ac_cv_prog_cxx_g=no
+   CXXFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_cv_prog_cxx_g=yes
+else
+  CXXFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+else
+  ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+	 CXXFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_cv_prog_cxx_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
+$as_echo "$ac_cv_prog_cxx_g" >&6; }
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
+  else
+    CXXFLAGS="-g"
+  fi
+else
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
+  else
+    CXXFLAGS=
+  fi
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
+$as_echo_n "checking for style of include used by $am_make... " >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
+$as_echo "$_am_result" >&6; }
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then :
+  enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+
+depcc="$CXX"  am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CXX_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CXX_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CXX_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+  am__fastdepCXX_TRUE=
+  am__fastdepCXX_FALSE='#'
+else
+  am__fastdepCXX_TRUE='#'
+  am__fastdepCXX_FALSE=
+fi
+
+
+
+# Checks for libraries.
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+else
+  CFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CC"   am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for encrypt in -lcrypt" >&5
+$as_echo_n "checking for encrypt in -lcrypt... " >&6; }
+if ${ac_cv_lib_crypt_encrypt+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcrypt  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char encrypt ();
+int
+main ()
+{
+return encrypt ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_crypt_encrypt=yes
+else
+  ac_cv_lib_crypt_encrypt=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypt_encrypt" >&5
+$as_echo "$ac_cv_lib_crypt_encrypt" >&6; }
+if test "x$ac_cv_lib_crypt_encrypt" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBCRYPT 1
+_ACEOF
+
+  LIBS="-lcrypt $LIBS"
+
+fi
+
+
+
+# Check whether --with-gdbm-include-path was given.
+if test "${with_gdbm_include_path+set}" = set; then :
+  withval=$with_gdbm_include_path; GDBM_CFLAGS="-I$withval"
+else
+  GDBM_CFLAGS='-I../../../../common-src/packages/gdbm/include'
+fi
+
+
+
+
+# Check whether --with-gdbm-lib-path was given.
+if test "${with_gdbm_lib_path+set}" = set; then :
+  withval=$with_gdbm_lib_path; GDBM_LIBS="-L$withval -lmysqlclient"
+else
+  GDBM_LIBS='-L../../../../common-src/packages/gdbm/lib -lgdbm'
+fi
+
+
+
+# Checks for header files.
+
+# Checks for typedefs, structures, and compiler characteristics.
+
+# Checks for library functions.
+
+# Completion
+ac_config_files="$ac_config_files Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes: double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \.
+      sed -n \
+	"s/'/'\\\\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    if test "x$cache_file" != "x/dev/null"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+      if test ! -f "$cache_file" || test -h "$cache_file"; then
+	cat confcache >"$cache_file"
+      else
+        case $cache_file in #(
+        */* | ?:*)
+	  mv -f confcache "$cache_file"$$ &&
+	  mv -f "$cache_file"$$ "$cache_file" ;; #(
+        *)
+	  mv -f confcache "$cache_file" ;;
+	esac
+      fi
+    fi
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+#
+# If the first sed substitution is executed (which looks for macros that
+# take arguments), then branch to the quote section.  Otherwise,
+# look for a macro that doesn't take arguments.
+ac_script='
+:mline
+/\\$/{
+ N
+ s,\\\n,,
+ b mline
+}
+t clear
+:clear
+s/^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 (][^	 (]*([^)]*)\)[	 ]*\(.*\)/-D\1=\2/g
+t quote
+s/^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 ][^	 ]*\)[	 ]*\(.*\)/-D\1=\2/g
+t quote
+b any
+:quote
+s/[	 `~#$^&*(){}\\|;'\''"<>?]/\\&/g
+s/\[/\\&/g
+s/\]/\\&/g
+s/\$/$$/g
+H
+:any
+${
+	g
+	s/^\n//
+	s/\n/ /g
+	p
+}
+'
+DEFS=`sed -n "$ac_script" confdefs.h`
+
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+ if test -n "$EXEEXT"; then
+  am__EXEEXT_TRUE=
+  am__EXEEXT_FALSE='#'
+else
+  am__EXEEXT_TRUE='#'
+  am__EXEEXT_FALSE=
+fi
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+	test -d "$1/.";
+      else
+	case $1 in #(
+	-*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by txt2dbl $as_me 1.0, which was
+generated by GNU Autoconf 2.68.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration.  Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+      --config     print configuration, then exit
+  -q, --quiet, --silent
+                   do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+      --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+
+Configuration files:
+$config_files
+
+Configuration commands:
+$config_commands
+
+Report bugs to <jmt12@students.waikato.ac.nz>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+txt2dbl config.status 1.0
+configured by $0, generated by GNU Autoconf 2.68,
+  with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2010 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=?*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  --*=)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    $as_echo "$ac_cs_version"; exit ;;
+  --config | --confi | --conf | --con | --co | --c )
+    $as_echo "$ac_cs_config"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    '') as_fn_error $? "missing file argument" ;;
+    esac
+    as_fn_append CONFIG_FILES " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --he | --h |  --help | --hel | -h )
+    $as_echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+  *) as_fn_append ac_config_targets " $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  shift
+  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+  CONFIG_SHELL='$SHELL'
+  export CONFIG_SHELL
+  exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+
+  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp= ac_tmp=
+  trap 'exit_status=$?
+  : "${ac_tmp:=$tmp}"
+  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+  trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+  eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+  ac_cs_awk_cr='\\r'
+else
+  ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+  echo "cat >conf$$subs.awk <<_ACEOF" &&
+  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+  echo "_ACEOF"
+} >conf$$subs.sh ||
+  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  . ./conf$$subs.sh ||
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+  if test $ac_delim_n = $ac_delim_num; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+  N
+  s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+  for (key in S) S_is_set[key] = 1
+  FS = ""
+
+}
+{
+  line = $ 0
+  nfields = split(line, field, "@")
+  substed = 0
+  len = length(field[1])
+  for (i = 2; i < nfields; i++) {
+    key = field[i]
+    keylen = length(key)
+    if (S_is_set[key]) {
+      value = S[key]
+      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+      len += length(value) + length(field[++i])
+      substed = 1
+    } else
+      len += 1 + keylen
+  }
+
+  print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+  cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=[	 ]*/{
+h
+s///
+s/^/:/
+s/[	 ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[	 ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[	 ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+
+eval set X "  :F $CONFIG_FILES      :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$ac_tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
+	 # because $ac_f cannot contain `:'.
+	 test -f "$ac_f" ||
+	   case $ac_f in
+	   [\\/$]*) false;;
+	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+	   esac ||
+	   as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+      esac
+      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+      as_fn_append ac_file_inputs " '$ac_f'"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input='Generated from '`
+	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+	`' by configure.'
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+    fi
+    # Neutralize special characters interpreted by sed in replacement strings.
+    case $configure_input in #(
+    *\&* | *\|* | *\\* )
+       ac_sed_conf_input=`$as_echo "$configure_input" |
+       sed 's/[\\\\&|]/\\\\&/g'`;; #(
+    *) ac_sed_conf_input=$configure_input;;
+    esac
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$ac_tmp/stdin" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  as_dir="$ac_dir"; as_fn_mkdir_p
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+  ac_MKDIR_P=$MKDIR_P
+  case $MKDIR_P in
+  [\\/$]* | ?:[\\/]* ) ;;
+  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+  esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+  s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+  >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' \
+      "$ac_tmp/out"`; test -z "$ac_out"; } &&
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&2;}
+
+  rm -f "$ac_tmp/stdin"
+  case $ac_file in
+  -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+  *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+  esac \
+  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+
+
+  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+  esac
+
+
+  case $ac_file$ac_mode in
+    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named `Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`$as_dirname -- "$mf" ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$mf" : 'X\(//\)[^/]' \| \
+	 X"$mf" : 'X\(//\)$' \| \
+	 X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running `make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`$as_dirname -- "$file" ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$file" : 'X\(//\)[^/]' \| \
+	 X"$file" : 'X\(//\)$' \| \
+	 X"$file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      as_dir=$dirpart/$fdir; as_fn_mkdir_p
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+ ;;
+
+  esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/txt2dbl-src/configure.ac
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/txt2dbl-src/configure.ac	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/txt2dbl-src/configure.ac	(revision 24799)
@@ -0,0 +1,34 @@
+#                                               -*- Autoconf -*-
+# Process this file with autoconf to produce a configure script.
+AC_PREREQ(2.59)
+AC_INIT([txt2dbl], [1.0], [jmt12@students.waikato.ac.nz])
+AM_INIT_AUTOMAKE
+AC_CANONICAL_HOST
+
+# Checks for programs.
+AC_PROG_CXX([g++])
+
+# Checks for libraries.
+AC_CHECK_LIB([crypt],[encrypt])
+
+AC_ARG_WITH([gdbm-include-path],
+  [AS_HELP_STRING([--with-gdbm-include-path],[location of the GDBM headers])],
+  [GDBM_CFLAGS="-I$withval"],
+  [GDBM_CFLAGS='-I../../../../common-src/packages/gdbm/include'])
+AC_SUBST([GDBM_CFLAGS])
+
+AC_ARG_WITH([gdbm-lib-path],
+  [AS_HELP_STRING([--with-gdbm-lib-path], [location of the GDBM libraries])],
+  [GDBM_LIBS="-L$withval -lmysqlclient"],
+  [GDBM_LIBS='-L../../../../common-src/packages/gdbm/lib -lgdbm'])
+AC_SUBST([GDBM_LIBS])
+
+# Checks for header files.
+
+# Checks for typedefs, structures, and compiler characteristics.
+
+# Checks for library functions.
+
+# Completion
+AC_CONFIG_FILES([Makefile])
+AC_OUTPUT
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/txt2dbl-src/install-sh
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/txt2dbl-src/install-sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/txt2dbl-src/install-sh	(revision 24799)
@@ -0,0 +1,520 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2009-04-28.21; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+nl='
+'
+IFS=" ""	$nl"
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit=${DOITPROG-}
+if test -z "$doit"; then
+  doit_exec=exec
+else
+  doit_exec=$doit
+fi
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_glob='?'
+initialize_posix_glob='
+  test "$posix_glob" != "?" || {
+    if (set -f) 2>/dev/null; then
+      posix_glob=
+    else
+      posix_glob=:
+    fi
+  }
+'
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+no_target_directory=
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+     --help     display this help and exit.
+     --version  display version info and exit.
+
+  -c            (ignored)
+  -C            install only if different (preserve the last data modification time)
+  -d            create directories instead of installing files.
+  -g GROUP      $chgrpprog installed files to GROUP.
+  -m MODE       $chmodprog installed files to MODE.
+  -o USER       $chownprog installed files to USER.
+  -s            $stripprog installed files.
+  -t DIRECTORY  install into DIRECTORY.
+  -T            report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+  RMPROG STRIPPROG
+"
+
+while test $# -ne 0; do
+  case $1 in
+    -c) ;;
+
+    -C) copy_on_change=true;;
+
+    -d) dir_arg=true;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+	shift;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) mode=$2
+	case $mode in
+	  *' '* | *'	'* | *'
+'*	  | *'*'* | *'?'* | *'['*)
+	    echo "$0: invalid mode: $mode" >&2
+	    exit 1;;
+	esac
+	shift;;
+
+    -o) chowncmd="$chownprog $2"
+	shift;;
+
+    -s) stripcmd=$stripprog;;
+
+    -t) dst_arg=$2
+	shift;;
+
+    -T) no_target_directory=true;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    --)	shift
+	break;;
+
+    -*)	echo "$0: invalid option: $1" >&2
+	exit 1;;
+
+    *)  break;;
+  esac
+  shift
+done
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+  # When -d is used, all remaining arguments are directories to create.
+  # When -t is used, the destination is already specified.
+  # Otherwise, the last argument is the destination.  Remove it from $@.
+  for arg
+  do
+    if test -n "$dst_arg"; then
+      # $@ is not empty: it contains at least $arg.
+      set fnord "$@" "$dst_arg"
+      shift # fnord
+    fi
+    shift # arg
+    dst_arg=$arg
+  done
+fi
+
+if test $# -eq 0; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call `install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+if test -z "$dir_arg"; then
+  trap '(exit $?); exit' 1 2 13 15
+
+  # Set umask so as not to create temps with too-generous modes.
+  # However, 'strip' requires both read and write access to temps.
+  case $mode in
+    # Optimize common cases.
+    *644) cp_umask=133;;
+    *755) cp_umask=22;;
+
+    *[0-7])
+      if test -z "$stripcmd"; then
+	u_plus_rw=
+      else
+	u_plus_rw='% 200'
+      fi
+      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+    *)
+      if test -z "$stripcmd"; then
+	u_plus_rw=
+      else
+	u_plus_rw=,u+rw
+      fi
+      cp_umask=$mode$u_plus_rw;;
+  esac
+fi
+
+for src
+do
+  # Protect names starting with `-'.
+  case $src in
+    -*) src=./$src;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    dstdir=$dst
+    test -d "$dstdir"
+    dstdir_status=$?
+  else
+
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dst_arg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+
+    dst=$dst_arg
+    # Protect names starting with `-'.
+    case $dst in
+      -*) dst=./$dst;;
+    esac
+
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
+    if test -d "$dst"; then
+      if test -n "$no_target_directory"; then
+	echo "$0: $dst_arg: Is a directory" >&2
+	exit 1
+      fi
+      dstdir=$dst
+      dst=$dstdir/`basename "$src"`
+      dstdir_status=0
+    else
+      # Prefer dirname, but fall back on a substitute if dirname fails.
+      dstdir=`
+	(dirname "$dst") 2>/dev/null ||
+	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	     X"$dst" : 'X\(//\)[^/]' \| \
+	     X"$dst" : 'X\(//\)$' \| \
+	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
+	echo X"$dst" |
+	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)[^/].*/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\).*/{
+		   s//\1/
+		   q
+		 }
+		 s/.*/./; q'
+      `
+
+      test -d "$dstdir"
+      dstdir_status=$?
+    fi
+  fi
+
+  obsolete_mkdir_used=false
+
+  if test $dstdir_status != 0; then
+    case $posix_mkdir in
+      '')
+	# Create intermediate dirs using mode 755 as modified by the umask.
+	# This is like FreeBSD 'install' as of 1997-10-28.
+	umask=`umask`
+	case $stripcmd.$umask in
+	  # Optimize common cases.
+	  *[2367][2367]) mkdir_umask=$umask;;
+	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+	  *[0-7])
+	    mkdir_umask=`expr $umask + 22 \
+	      - $umask % 100 % 40 + $umask % 20 \
+	      - $umask % 10 % 4 + $umask % 2
+	    `;;
+	  *) mkdir_umask=$umask,go-w;;
+	esac
+
+	# With -d, create the new directory with the user-specified mode.
+	# Otherwise, rely on $mkdir_umask.
+	if test -n "$dir_arg"; then
+	  mkdir_mode=-m$mode
+	else
+	  mkdir_mode=
+	fi
+
+	posix_mkdir=false
+	case $umask in
+	  *[123567][0-7][0-7])
+	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
+	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+	    ;;
+	  *)
+	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+	    if (umask $mkdir_umask &&
+		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+	    then
+	      if test -z "$dir_arg" || {
+		   # Check for POSIX incompatibilities with -m.
+		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+		   # other-writeable bit of parent directory when it shouldn't.
+		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
+		   case $ls_ld_tmpdir in
+		     d????-?r-*) different_mode=700;;
+		     d????-?--*) different_mode=755;;
+		     *) false;;
+		   esac &&
+		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+		   }
+		 }
+	      then posix_mkdir=:
+	      fi
+	      rmdir "$tmpdir/d" "$tmpdir"
+	    else
+	      # Remove any dirs left behind by ancient mkdir implementations.
+	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+	    fi
+	    trap '' 0;;
+	esac;;
+    esac
+
+    if
+      $posix_mkdir && (
+	umask $mkdir_umask &&
+	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+      )
+    then :
+    else
+
+      # The umask is ridiculous, or mkdir does not conform to POSIX,
+      # or it failed possibly due to a race condition.  Create the
+      # directory the slow way, step by step, checking for races as we go.
+
+      case $dstdir in
+	/*) prefix='/';;
+	-*) prefix='./';;
+	*)  prefix='';;
+      esac
+
+      eval "$initialize_posix_glob"
+
+      oIFS=$IFS
+      IFS=/
+      $posix_glob set -f
+      set fnord $dstdir
+      shift
+      $posix_glob set +f
+      IFS=$oIFS
+
+      prefixes=
+
+      for d
+      do
+	test -z "$d" && continue
+
+	prefix=$prefix$d
+	if test -d "$prefix"; then
+	  prefixes=
+	else
+	  if $posix_mkdir; then
+	    (umask=$mkdir_umask &&
+	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+	    # Don't fail if two instances are running concurrently.
+	    test -d "$prefix" || exit 1
+	  else
+	    case $prefix in
+	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+	      *) qprefix=$prefix;;
+	    esac
+	    prefixes="$prefixes '$qprefix'"
+	  fi
+	fi
+	prefix=$prefix/
+      done
+
+      if test -n "$prefixes"; then
+	# Don't fail if two instances are running concurrently.
+	(umask $mkdir_umask &&
+	 eval "\$doit_exec \$mkdirprog $prefixes") ||
+	  test -d "$dstdir" || exit 1
+	obsolete_mkdir_used=true
+      fi
+    fi
+  fi
+
+  if test -n "$dir_arg"; then
+    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+  else
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+    # Copy the file name to the temp name.
+    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+    # If -C, don't bother to copy if it wouldn't change the file.
+    if $copy_on_change &&
+       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
+
+       eval "$initialize_posix_glob" &&
+       $posix_glob set -f &&
+       set X $old && old=:$2:$4:$5:$6 &&
+       set X $new && new=:$2:$4:$5:$6 &&
+       $posix_glob set +f &&
+
+       test "$old" = "$new" &&
+       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+    then
+      rm -f "$dsttmp"
+    else
+      # Rename the file to the real destination.
+      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+      # The rename failed, perhaps because mv can't rename something else
+      # to itself, or perhaps because mv is so ancient that it does not
+      # support -f.
+      {
+	# Now remove or move aside any old file at destination location.
+	# We try this two ways since rm can't unlink itself on some
+	# systems and the destination file might be busy for other
+	# reasons.  In this case, the final cleanup might fail but the new
+	# file should still install successfully.
+	{
+	  test ! -f "$dst" ||
+	  $doit $rmcmd -f "$dst" 2>/dev/null ||
+	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+	  } ||
+	  { echo "$0: cannot unlink or rename $dst" >&2
+	    (exit 1); exit 1
+	  }
+	} &&
+
+	# Now rename the file to the real destination.
+	$doit $mvcmd "$dsttmp" "$dst"
+      }
+    fi || exit 1
+
+    trap '' 0
+  fi
+done
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
Index: /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/txt2dbl-src/txt2dbl.cpp
===================================================================
--- /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/txt2dbl-src/txt2dbl.cpp	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/parallel-building/trunk/src/src/txt2dbl-src/txt2dbl.cpp	(revision 24799)
@@ -0,0 +1,277 @@
+/**********************************************************************
+ *
+ * txt2db.cpp -- 
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the 
+ * University of Waikato, New Zealand.
+ *
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ **********************************************************************/
+
+
+#ifdef __WIN32__
+#include "autoconf.h"
+#include "systems.h"
+#include "gdbmconst.h"
+#include "gdbm.h"
+
+#else
+#include <gdbm.h>
+#endif
+
+//#include "gsdlconf.h"
+#include "text_t.h"
+#include <stdlib.h>
+#include <cstring>
+#include <fcntl.h>
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\iostream>
+#elif defined(GSDL_USE_IOS_H)
+#  include <iostream.h>
+#else
+#  include <iostream>
+#endif
+
+using namespace std;
+
+void print_usage (char *program_name) {
+  cerr << "usage: " << program_name << " database-name" << endl;
+  cerr << "usage: " << program_name << " -update database-name" << endl;
+  cerr << "usage: " << program_name << " -append database-name" << endl << endl;
+  cerr << "options:" << endl;
+  cerr << " -update        update existing database" << endl;
+  cerr << " -append        legacy alias for -update" << endl << endl;
+}
+
+// lock a file on linux
+// [hs, 2 july 2010]
+int lock ( char *filename )
+{
+  ///out << "txt2dbl::lock(" << filename << ") => ";
+  int fd2 = open (filename, O_CREAT|O_RDWR, 00644);
+  close (fd2);
+  int fd = open (filename, O_RDWR);
+  flock lock = {F_WRLCK, SEEK_SET, 0, 0, 0};
+  fcntl (fd, F_SETLKW, &lock);
+  ///out << "locked!" << endl;
+  return fd;
+}
+
+// unlock a file on linux
+// [hs, 2 july 2010]
+int unlock ( int fd )
+{
+  ///out << "txt2dbl::unlock() => ";
+  flock lock1 = {F_UNLCK, SEEK_SET, 0, 0, 0};
+  fcntl (fd, F_SETLKW, &lock1);
+  ///out << "unlocked!" << endl;
+  return 0;
+}
+
+int main (int argc, char *argv[]) {
+
+  ///out << "===== TXT2DB+Locking=====" << endl;
+
+  int block_size = 0;
+  GDBM_FILE dbf;
+  char c;
+  text_t key;
+  text_t value;
+  text_t tmp;
+  int num_dashes = 0;
+
+  // sanity check
+  if (argc != 2 && argc != 3) {
+    print_usage (argv[0]);
+    exit (0);
+  }
+  
+  char *dbname;
+  int update = 0;
+  int delkey = 0;
+  int switched_flags = 0;
+
+  if (argc == 3) {
+    // legacy support
+    if (strcmp (argv[1], "-append") == 0) {
+      update = 1;
+      dbname = argv[2];
+    } else if (strcmp (argv[1], "-update") == 0) {
+      update = 1;
+      dbname = argv[2];
+    } else {
+      cerr << argv[1] << " is not a valid option." << endl << endl;
+      print_usage (argv[0]);
+      exit (0);
+    }
+  } else dbname = argv[1];
+
+  
+  // open the database
+  // note that GDBM_FAST is obsolete on newer versions of gdbm
+  int read_write = GDBM_NEWDB | GDBM_FAST;
+  if (update) read_write = GDBM_WRCREAT | GDBM_FAST;
+  
+/*
+#ifdef __WIN32__
+  dbf = gdbm_open (dbname, block_size, read_write, 00664, NULL, 1);
+#else
+  dbf = gdbm_open  (dbname, block_size, read_write, 00664, NULL);
+#endif
+  if (dbf == NULL) {
+    cerr << "couldn't create " << dbname << endl;
+    exit (0);
+  }
+*/
+  
+  cin.get(c);
+  while (!cin.eof()) {
+    num_dashes = 0;
+    key = "";
+    value = "";
+    
+    // Parse out 'key' from [key]\n
+
+    // scan for first occurrence of [
+    while (!cin.eof() && c != '[') cin.get(c);
+
+    if (!cin.eof()) cin.get(c); // skip [
+
+    // now look for closing ], building up 'key' as we go
+    while (!cin.eof() && c != ']') {
+      key.push_back ((unsigned char)c);
+      cin.get(c);
+    }
+
+    if (!cin.eof()) {
+      // most likely an eol char, but if '-', then signifies record
+      // is to be deleted, not added
+      cin.get(c);
+      if (c == '-') {   
+        delkey = 1;
+      }
+      else {
+        delkey = 0;
+      }
+    }
+    while (!cin.eof() && (c == '\n' || c == '\r')) cin.get(c);
+    
+    // look for 70 dashes
+    tmp = "";
+    while (!cin.eof() && (num_dashes < 70)) {
+      if (c == '\n') {
+        tmp.push_back ((unsigned char)c);
+        num_dashes = 0; 
+        
+      } else if (c == '\r') { 
+        // Here we are able to process both Windows-specific text files 
+        // (containing carriage-return, newline) and Linux text files 
+        // (containing only newline characters) by ignoring the Windows' 
+        // carriage-return altogether so that we produce a uniform database
+        // file from either system's type of text file. 
+        // If we don't ignore the carriage return here, txt.gz files
+        // produced on Windows cause a GS library running on Linux to break.
+        num_dashes = 0;
+
+      } else if (c == '-') {
+        tmp.push_back ((unsigned char)c);
+        ++num_dashes;
+        
+      } else {
+        value += tmp;
+        value.push_back ((unsigned char)c);
+        tmp = "";
+        num_dashes = 0;
+      }
+      cin.get(c);
+    }
+    
+    // if the key is not an empty string store this key-value pair
+    if (!key.empty()) {
+      // convert key to a datum datatype
+      datum key_data;
+      key_data.dptr = key.getcstr();
+      if (key_data.dptr == NULL) {
+        cerr << "NULL key_data.dptr" << endl;
+        exit (0);
+      }
+      key_data.dsize = strlen(key_data.dptr);
+      // moved for better localisation at the expense of some speed
+      // and lock before the operation
+      // [hs, 2 july 2010]
+      int thelock = lock ("gdb.lock");
+#ifdef __WIN32__
+      dbf = gdbm_open (dbname, block_size, read_write, 00664, NULL, 1);
+#else
+      dbf = gdbm_open  (dbname, block_size, read_write, 00664, NULL);
+#endif
+      if (dbf == NULL) {
+        cerr << "couldn't create " << dbname << endl;
+        exit (0);
+      }
+      // If opening was successful the first time, and regardless of what flags
+      // we may have been given, we must make future opens '-update' (rather
+      // than erase the file over and over!)
+      if (!update && !switched_flags)
+      {
+        read_write = GDBM_WRCREAT | GDBM_FAST;
+        switched_flags = 1;
+      }
+
+      if (delkey) {
+        // delete the given key
+        if (gdbm_delete(dbf, key_data) < 0) {
+          cerr << "gdbm_delete returned an error" << endl;
+        }
+      }
+      else {
+
+        // add/update
+
+        // convert value to a datum datatype
+        datum value_data;
+        value_data.dptr = value.getcstr();
+        if (value_data.dptr == NULL) {
+          cerr << "NULL value_data.dptr" << endl;
+          exit (0);
+        }
+        value_data.dsize = strlen(value_data.dptr);
+      
+        // store the value
+        if (gdbm_store (dbf, key_data, value_data, GDBM_REPLACE) < 0) {
+          cerr << "gdbm_store returned an error" << endl;
+          exit (0);
+        }
+
+        free(value_data.dptr);
+      }
+      
+      // moved for better localisation at the expense of some speed
+      // and unlock after the operation
+      // [hs, 2 july 2010]
+      gdbm_close (dbf);
+      unlock (thelock);
+
+      free(key_data.dptr);
+    }
+  }
+/*  gdbm_close (dbf); */
+  
+  return 0;
+}
Index: /main/tags/2.85/gs2-extensions/pdf-box/trunk/java/pdf-box-setup.pl
===================================================================
--- /main/tags/2.85/gs2-extensions/pdf-box/trunk/java/pdf-box-setup.pl	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/pdf-box/trunk/java/pdf-box-setup.pl	(revision 24799)
@@ -0,0 +1,70 @@
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    die "GSDLOS not set\n" unless defined $ENV{'GSDLOS'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib/cpan");
+}
+
+use Cwd;
+require util;    
+
+my $env_ext  = "GEXT_PDFBOX";
+my $ext_desc = "the PDFBox Extension";
+
+if (!defined $ENV{$env_ext}) {
+    
+    my $ext_home = cwd();
+    $ENV{$env_ext} = $ext_home;
+
+    my $ext_bin_script = &util::filename_cat($ENV{$env_ext},"bin","script");
+    my $ext_lib = &util::filename_cat($ENV{$env_ext},"lib");
+
+    if (-d $ext_bin_script) {
+	&util::envvar_prepend("PATH",$ext_bin_script);
+    }
+   
+    if (-d $ext_lib) {
+	if ($ENV{'GSDLOS'} =~ m/windows/i) {
+	    &util::envvar_prepend("PATH",$ext_lib);
+	} 
+	elsif ($ENV{'GSDLOS'} =~ m/darwin/i) {
+	    &util::envvar_prepend("DYLD_LIBRARY_PATH",$ext_lib);
+	}
+	else { # linux
+	    &util::envvar_prepend("LD_LIBRARY_PATH",$ext_lib);
+	}
+    }
+
+    if ($ENV{'GSDLOS'} =~ m/windows/i) {
+	$ENV{'GS_CP_SET'} = "yes";
+    }
+
+    my ($ext_dir,$_prefix_dir) = File::Basename::fileparse($ext_home);
+    # GSDLEXTS always uses : as a separator
+    if (defined $ENV{'GSDLEXTS'}) {
+	$ENV{'GSDLEXTS'} .= ":$ext_dir";
+    }
+    else {
+	$ENV{'GSDLEXTS'} = $ext_dir;
+    }
+    
+    print STDERR "+Your environment is now setup for $ext_desc\n";
+}
+else {    
+    print STDERR "+Your environment is already setup for $ext_desc\n";
+}
+
+if (scalar(@ARGV>0)) {
+
+    print STDERR "\n";
+
+    my $cmd = join(" ",map {$_ = "\"$_\""} @ARGV);
+
+    if (system($cmd)!=0) {
+	print STDERR "\nError: Failed to run '$cmd'\n";
+	print STDERR "$!\n";
+    }
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/pdf-box/trunk/java/perllib/plugins/PDFBoxConverter.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/pdf-box/trunk/java/perllib/plugins/PDFBoxConverter.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/pdf-box/trunk/java/perllib/plugins/PDFBoxConverter.pm	(revision 24799)
@@ -0,0 +1,230 @@
+###########################################################################
+#
+# PDFBoxConverter - helper plugin that does pdf document conversion with PDFBox
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2010 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+package PDFBoxConverter;
+
+use BaseMediaConverter;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+use gsprintf 'gsprintf';
+
+# these two variables mustn't be initialised here or they will get stuck 
+# at those values.
+our $pdfbox_conversion_available; 
+our $no_pdfbox_conversion_reason; 
+
+BEGIN {
+    @PDFBoxConverter::ISA = ('BaseMediaConverter');
+
+    # Check that PDFBox is installed and available on the path 
+    $pdfbox_conversion_available = 1;
+    $no_pdfbox_conversion_reason = "";
+    
+    if (!defined $ENV{'GEXT_PDFBOX'}) {
+	$pdfbox_conversion_available = 0;
+	$no_pdfbox_conversion_reason = "gextpdfboxnotinstalled";
+    }
+    else {
+	my $gextpb_home = $ENV{'GEXT_PDFBOX'};
+	my $pbajar = &util::filename_cat($gextpb_home,"lib","java","pdfbox-app.jar");
+
+	if (!-e $pbajar) {
+	    print STDERR "Failed to find $pbajar\n";
+	    $pdfbox_conversion_available = 0;
+	    $no_pdfbox_conversion_reason = "gextpdfboxjarnotinstalled";
+	}
+	else {
+	    # test to see if java is in path	 
+	    my $cmd = "java";
+	    if ($ENV{'GSDLOS'} =~ /^windows/i) {
+		$cmd .= " >nul 2>&1"; # java 2>&1 >null or java >null 2>&1 both work (%ERRORLEVEL% is 0)
+	    }
+	    else {
+		# On Ubuntu, java >/dev/null 2>&1 works, 
+		# but java 2>&1 >/dev/null doesn't work: output goes to screen anyway
+		$cmd .= " >/dev/null 2>&1 &"; # Need the & at the end for Linux Centos (Ubuntu is fine without it), else parsing plugins list fails
+	    }
+
+	    my $status = system($cmd);
+
+	    if ($status != 0) {
+		print STDERR "Testing for java\n";
+		print STDERR "Failed to run: $cmd\n";
+		print STDERR "$!\n";
+		$pdfbox_conversion_available = 0;
+		$no_pdfbox_conversion_reason = "couldnotrunjava";
+	    } 
+	}
+    }
+
+}
+
+my $arguments = [ ];
+
+my $options = { 'name' => "PDFBoxConverter",
+		'desc' => "{PDFBoxConverter.desc}",
+		'abstract' => "yes",
+		'inherits' => "yes",
+		'args' => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists,$auxilary) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+
+    my $self = new BaseMediaConverter($pluginlist, $inputargs, 
+				      $hashArgOptLists, $auxilary);
+
+    if ($self->{'info_only'}) {
+	# don't worry about any options etc
+	return bless $self, $class;
+    }
+    if ($pdfbox_conversion_available) {
+	my $gextpb_home = $ENV{'GEXT_PDFBOX'};
+	my $pbajar = &util::filename_cat($gextpb_home,"lib","java","pdfbox-app.jar");	
+	my $launch_cmd = "java -cp \"$pbajar\" -Dline.separator=\"<br />\" org.apache.pdfbox.ExtractText";
+	
+	$self->{'pdfbox_launch_cmd'} = $launch_cmd;
+    }
+    else {       
+	$self->{'no_pdfbox_conversion_reason'} = $no_pdfbox_conversion_reason;
+
+	my $outhandle = $self->{'outhandle'};
+	&gsprintf($outhandle, "PDFBoxConverter: {PDFBoxConverter.noconversionavailable} ({PDFBoxConverter.$no_pdfbox_conversion_reason})\n");
+    }  
+
+    $self->{'pdfbox_conversion_available'} = $pdfbox_conversion_available;
+    
+    return bless $self, $class;
+
+}
+
+sub init {
+    my $self = shift(@_);
+    my ($verbosity, $outhandle, $failhandle) = @_;
+
+    $self->{'pbtmp_file_paths'} = ();
+}
+
+sub deinit {
+    my $self = shift(@_);
+
+    $self->clean_up_temporary_files();
+}
+
+
+sub convert {
+    my $self = shift(@_);
+    my ($source_file_full_path, $target_file_type) = @_;
+
+    return 0 unless $pdfbox_conversion_available;
+    # check the filename
+    return 0 if ( !-f $source_file_full_path);
+
+    # the following line is necessary to avoid 'uninitialised variable' error
+    # messages concerning the converted_to member variable when PDFPlugin's 
+    # use_sections option is checked.
+    # PDFBox plugin now processes use_sections option, when working with v1.5.0
+    # of the PDFBox jar file (which embeds each page in special <div> tags).
+    if ($target_file_type eq "html") {
+	$self->{'converted_to'} = "HTML";
+    } else {
+	$self->{'converted_to'} = "text";
+    }
+
+    my $outhandle = $self->{'outhandle'};
+    my $verbosity = $self->{'verbosity'};
+
+    my $source_file_no_path = &File::Basename::basename($source_file_full_path);
+    # Determine the full name and path of the output file
+    my $target_file_path;
+    if ($self->{'enable_cache'}) {
+	$self->init_cache_for_file($source_file_full_path);
+	my $cache_dir = $self->{'cached_dir'};
+	my $file_root = $self->{'cached_file_root'};
+	#$file_root .= "_$convert_id" if ($convert_id ne "");
+	my $target_file = "$file_root.$target_file_type";
+	$target_file_path = &util::filename_cat($cache_dir,$target_file);
+    }
+    else {
+	# this is in gsdl/tmp. get a tmp filename in collection instead???
+	$target_file_path = &util::get_tmp_filename($target_file_type);
+	push(@{$self->{'pbtmp_file_paths'}}, $target_file_path);
+    }
+
+    # Generate and run the convert command
+    my $convert_cmd = $self->{'pdfbox_launch_cmd'};
+    $convert_cmd .= " -html" if ($target_file_type eq "html");
+    $convert_cmd .= " \"$source_file_full_path\" \"$target_file_path\"";
+
+    if ($verbosity>2) {
+	print $outhandle "Convert command: $convert_cmd\n";
+    }
+
+    my $print_info = { 'message_prefix' => "PDFBox Conversion",
+		       'message' => "Converting $source_file_no_path to: $target_file_type" };
+    # $print_info->{'cache_mode'} = $cache_mode if ($cache_mode ne "");
+
+    my ($regenerated,$result,$had_error) 
+	= $self->autorun_general_cmd($convert_cmd,$source_file_full_path, $target_file_path,$print_info);
+    if ($had_error) {
+	return (0, $result,$target_file_path);
+    }
+    return (1, $result,$target_file_path);
+}
+
+sub convert_without_result {
+    my $self = shift(@_);
+
+    my $source_file_path = shift(@_);
+    my $target_file_type = shift(@_);
+    my $convert_options  = shift(@_) || "";
+    my $convert_id       = shift(@_) || "";
+
+    return $self->convert($source_file_path,$target_file_type,
+			  $convert_options,$convert_id,"without_result");
+}
+
+sub clean_up_temporary_files {
+    my $self = shift(@_);
+
+    foreach my $pbtmp_file_path (@{$self->{'pbtmp_file_paths'}}) {
+	if (-e $pbtmp_file_path) {
+	    &util::rm($pbtmp_file_path);
+	}
+    }
+
+    $self->{'pbtmp_file_paths'} = ();
+}
+
+
+
+1;	
Index: /main/tags/2.85/gs2-extensions/pdf-box/trunk/java/perllib/strings.properties
===================================================================
--- /main/tags/2.85/gs2-extensions/pdf-box/trunk/java/perllib/strings.properties	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/pdf-box/trunk/java/perllib/strings.properties	(revision 24799)
@@ -0,0 +1,17 @@
+#
+# Resource bundle description
+#
+
+Language.code:en
+Language.name:English
+
+OutputEncoding.unix:iso_8859_1
+OutputEncoding.windows:iso_8859_1
+
+PDFBoxConverter.desc:Converter plugin that runs PDFBox to convert PDF files.
+PDFBoxConverter.noconversionavailable:PDFBox Conversion is not available: 
+
+PDFBoxConverter.gextpdfboxnotinstalled:Greenstone's PDFBox extension not installed.
+PDFBoxConverter.gextpdfboxjarnotinstalled:pdfbox-app jar file (part of Greenstone's PDFBox extension) not installed.
+PDFBoxConverter.couldnotrunjava:Couldn't run Java.
+PDFBoxConverter.pdfbox_conversion:Use PDFBox to convert the PDf files.
Index: /main/tags/2.85/gs2-extensions/pdf-box/trunk/java/setup.bash
===================================================================
--- /main/tags/2.85/gs2-extensions/pdf-box/trunk/java/setup.bash	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/pdf-box/trunk/java/setup.bash	(revision 24799)
@@ -0,0 +1,35 @@
+
+extdesc="the PDFBox Extension"
+
+full_setup=`pwd`/${BASH_SOURCE}
+fulldir=${full_setup%/*}
+fulldir=${fulldir%/.}
+
+if [ "x$GEXT_PDFBOX" = "x" ] ; then
+  export GEXT_PDFBOX=`pwd`
+
+  if [ -d "$GEXT_PDFBOX/bin/script" ] ; then
+    export PATH=$GEXT_PDFBOX/bin/script:$PATH
+  fi
+
+  if [ -d "$GEXT_PDFBOX/lib" ] ; then
+    if [ "$GSDLOS" = "linux" ] ; then
+      export LD_LIBRARY_PATH=$GEXT_PDFBOX/lib:$LD_LIBRARY_PATH
+    elif [ "$GSDLOS" = "darwin" ] ; then
+      export DYLD_LIBRARY_PATH=$GEXT_PDFBOX/lib:$DYLD_LIBRARY_PATH
+    fi
+  fi
+
+  extdir=${GEXT_PDFBOX##*/}
+
+  if [ "x$GSDLEXTS" = "x" ] ; then
+    export GSDLEXTS=$extdir
+  else 
+    export GSDLEXTS=$GSDLEXTS:$extdir
+  fi
+
+
+  echo "+Your environment is now setup for $extdesc"
+else
+  echo "+Your environment is already setup for $extdesc"
+fi
Index: /main/tags/2.85/gs2-extensions/pdf-box/trunk/java/setup.bat
===================================================================
--- /main/tags/2.85/gs2-extensions/pdf-box/trunk/java/setup.bat	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/pdf-box/trunk/java/setup.bat	(revision 24799)
@@ -0,0 +1,62 @@
+@echo off
+pushd "%CD%"
+CD /D "%~dp0"
+
+set extdesc=the PDFBox Extension
+
+if "%OS%" == "Windows_NT" goto WinNT
+if "%OS%" == "" goto Win95
+if "%GSDLLANG%" == "en" echo Setup failed - your PATH has not been set
+if "%GSDLLANG%" == "es" echo No se pudo realizar la configuraci¢n - no se ha establecido la RUTA.
+if "%GSDLLANG%" == "fr" echo Echc de l'installation - votre variable PATH n'a pas t ajuste
+if "%GSDLLANG%" == "ru" echo áâ ­®¢ª  ­¥ ã€ « áì -  ­¥ ¡ë« ãáâ ­®¢«¥­
+goto End
+
+:WinNT
+set GEXT_PDFBOX=%CD%
+set PATH=%GEXT_PDFBOX%\bin\script;%PATH%
+set PATH=%GEXT_PDFBOX%\lib;%PATH%
+set GS_CP_SET=yes
+goto Success
+
+:Win95
+if "%1" == "SetEnv" goto Win95Env
+REM We'll invoke a second copy of the command processor to make
+REM sure there's enough environment space
+COMMAND /E:2048 /K %0 SetEnv
+goto End
+
+:Win95Env
+set GEXT_PDFBOX=%CD%
+set PATH="%GEXT_PDFBOX%\bin\script";"%PATH%"
+set PATH="%GEXT_PDFBOX%\lib";"%PATH%"
+set GS_CP_SET=yes
+goto Success
+
+:Success
+
+set fulldir=%~dp0
+
+:: strip off everything up to (and including) ext dir
+set extdir=%fulldir:*ext\=%
+
+:: remove trailing slash
+set extdir=%extdir:\=%
+
+setlocal enabledelayedexpansion
+if "x%GSDLEXTS%" == "x" (
+  set GSDLEXTS=!extdir!
+) else (
+  set GSDLEXTS=!GSDLEXTS!:!extdir!
+)
+endlocal & set GSDLEXTS=%GSDLEXTS%
+
+echo +Your environment is now setup for %extdesc%
+
+:: Back to delayed expansion to avoid problems with environment
+:: variables with brackets in them, such as "Program Files (x86)"
+
+
+:End
+
+popd
Index: /main/tags/2.85/gs2-extensions/pharos-annotate/trunk/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/pharos-annotate/trunk/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/pharos-annotate/trunk/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+source bin/script/test-setup.bash
+source lib/cascade-lib.bash
+
+
+for d in packages src ; do
+  echo "Running $d/CASCADE-MAKE.sh $*"
+
+  (cd $d ; ./CASCADE-MAKE.sh $*)
+
+  if [ $? != 0 ] ; then
+    echo "Error encountered running $d/CASCADE-COMPILE.sh"
+    exit 1
+  fi
+done
+
+
Index: /main/tags/2.85/gs2-extensions/pharos-annotate/trunk/bin/script/test-setup.bash
===================================================================
--- /main/tags/2.85/gs2-extensions/pharos-annotate/trunk/bin/script/test-setup.bash	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/pharos-annotate/trunk/bin/script/test-setup.bash	(revision 24799)
@@ -0,0 +1,8 @@
+
+
+if [ "x$GEXTIMAGE" = "x" ] ; then
+  echo "Image extension environment variable GEXTIMAGE not set."
+  echo "Have you sourced the extension's setup file, e.g. setup.bash?"
+  exit -1
+fi
+
Index: /main/tags/2.85/gs2-extensions/pharos-annotate/trunk/lib/cascade-lib.bash
===================================================================
--- /main/tags/2.85/gs2-extensions/pharos-annotate/trunk/lib/cascade-lib.bash	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/pharos-annotate/trunk/lib/cascade-lib.bash	(revision 24799)
@@ -0,0 +1,181 @@
+
+run_untar()
+{
+  local package=$1
+  local version=$2
+  local ext=$3
+
+  tar_args="";
+
+  if [ $ext = ".tar.gz" ] ; then
+    tar_args="xvzf"
+  elif [ $ext = ".tgz" ] ; then
+    tar_args="xvzf"
+  elif [ $ext = ".tar.bz2" ] ; then
+    tar_args="xvjf"
+  elif [ $ext = ".tar.bz" ] ; then
+    tar_args="xvjf"
+  elif [ $ext = ".tar" ] ; then
+    tar_args="xvf"
+  else 
+    echo "Warning: Unrecognized extension: $ext"
+    echo "Assuming tarred, gzipped file"
+    tar_args="xvjf"
+  fi
+
+
+  echo tar $tar_args $package$version$ext 
+  tar $tar_args $package$version$ext
+
+  if [ $? != 0 ] ; then
+    echo "      Error encountered running *untar* stage of $progname"
+    exit 1
+  fi
+}
+
+opt_run_tarclean()
+{
+  local type=$1
+  local package=$2
+  local version=$3
+
+  if [ $type = "1" ] ; then
+
+    local dir=$package$version
+    if [ -d $dir ] ; then
+      echo /bin/rm -rf $dir
+      /bin/rm -rf $dir
+
+      if [ $? != 0 ] ; then
+        echo "      Error encountered running *tarclean* stage of $progname"
+        exit 1
+      fi
+    else 
+      echo "Unable to find directory $dir"
+    fi
+  fi
+}
+
+opt_run_untar()
+{
+  local force_untar=$1
+  local auto_untar=$2
+  local package=$3
+  local version=$4
+
+  local ext="";
+
+  if [ ! -z "$5" ] ; then
+    ext=$5
+  else 
+    ext=".tar.gz"
+  fi
+
+  if [ $force_untar = "1" ] ; then
+    run_untar $package $version $ext
+  elif [ $auto_config = "1" ] ; then
+    if [ -d $package$version ] ; then
+      echo "Found untarred version of $package$version$ext => no need to untar"
+    else
+      run_untar $package $version $ext
+    fi
+  fi
+}
+
+
+opt_run_configure()
+{
+  local force_config=$1
+  local auto_config=$2
+  local package=$3
+  local version=$4
+  local prefix=$5
+  local opt_args="";
+
+  if [ ! -z "$6" ] ; then
+    opt_args=$6
+  fi
+
+  if [ $force_config = "1" ] ; then
+    ( echo "[pushd $package$version]"
+      cd $package$version ; \
+      echo ./configure --prefix="$prefix" $opt_args ; \
+      ./configure --prefix="$prefix" $opt_args )
+      echo "[popd]"
+    if [ $? != 0 ] ; then
+        echo "      Error encountered running *configure* stage of $progname"
+        exit 1
+    fi
+  else
+    if [ $auto_config = "1" ] ; then
+      echo "Found top-level for ${progname%.*} => no need to run ./configure"
+    fi
+  fi
+}
+
+
+opt_run_make()
+{
+  local type=$1
+  local package=$2
+  local version=$3
+  local opt_target=""
+
+  if [ ! -z "$4" ] ; then
+    opt_target=$4
+  fi
+
+  if [ $type = "1" ] ; then
+    ( cd $package$version ; \
+      make $opt_target)
+
+    if [ $? != 0 ] ; then
+        echo "      Error encountered running *make $target* stage of $progname"
+        exit 1
+    fi
+  fi
+}
+
+
+
+force_untar=0
+auto_untar=0
+
+force_config=0
+auto_config=0
+
+compile=0
+install=0
+clean=0
+distclean=0
+tarclean=0
+
+if [ $# -gt 0 ] ; then
+  for cmd in $* ; do
+    echo $cmd
+    if   [ $cmd = "untar" ] ;     then force_untar=1
+    elif [ $cmd = "configure" ] ; then force_config=1
+    elif [ $cmd = "compile" ]   ; then compile=1
+    elif [ $cmd = "install" ]   ; then install=1  
+    elif [ $cmd = "clean" ]     ; then clean=1  
+    elif [ $cmd = "distclean" ] ; then distclean=1
+    elif [ $cmd = "tarclean" ] ;  then tarclean=1
+    fi
+  done
+else
+  # defaults
+  auto_untar=1
+  auto_config=1
+  compile=1
+  install=1
+  clean=0
+  distclean=0
+  tarclean=0
+fi
+
+if [ $auto_config = "1" ] ; then
+  if [ ! -e $package$version/Makefile ] ; then
+    force_config=1
+  fi
+fi
+
Index: /main/tags/2.85/gs2-extensions/pharos-annotate/trunk/packages/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/pharos-annotate/trunk/packages/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/pharos-annotate/trunk/packages/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+
+for d in FFTW ; do
+  echo "    Running CASCADE-MAKE/$d.sh $*"
+
+  ./CASCADE-MAKE/$d.sh $*
+
+  if [ $? != 0 ] ; then
+    echo "  Error encountered running CASCADE-COMPILE/$d.sh"
+    exit 1
+  fi
+done
Index: /main/tags/2.85/gs2-extensions/pharos-annotate/trunk/packages/CASCADE-MAKE/FFTW.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/pharos-annotate/trunk/packages/CASCADE-MAKE/FFTW.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/pharos-annotate/trunk/packages/CASCADE-MAKE/FFTW.sh	(revision 24799)
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+package=fftw
+version=-2.1.5
+
+progname=$0
+
+source ../bin/script/test-setup.bash
+source ../lib/cascade-lib.bash
+
+prefix=$GEXTIMAGE_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version "$prefix"
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
+
Index: /main/tags/2.85/gs2-extensions/pharos-annotate/trunk/setup.bash
===================================================================
--- /main/tags/2.85/gs2-extensions/pharos-annotate/trunk/setup.bash	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/pharos-annotate/trunk/setup.bash	(revision 24799)
@@ -0,0 +1,28 @@
+
+extdesc="the Image Analysis Extension"
+
+if [ "x$GEXTIMAGE" = "x" ] ; then
+  export GEXTIMAGE=`pwd`
+  export GEXTIMAGE_INSTALLED=$GEXTIMAGE/installed
+
+  export PATH=$GEXTIMAGE_INSTALLED/bin:$PATH
+
+  if [ "x$LD_LIBRARY_PATH" = "x" ] ; then
+    export LD_LIBRARY_PATH=$GEXTIMAGE_INSTALLED/lib
+  else
+    export LD_LIBRARY_PATH=$GEXTIMAGE_INSTALLED/lib:$LD_LIBRARY_PATH
+  fi
+
+  if [ "x$GSDLEXTS" = "x" ] ; then
+    export GSDLEXTS=image
+  else 
+    export GSDLEXTS=$GSDLEXTS:image
+  fi
+
+
+  echo "+Your environment is now setup for $extdesc to Greenstone"
+else
+  echo "+Your environment is already setup for $extdesc to Greenstone"
+fi
+
+
Index: /main/tags/2.85/gs2-extensions/pharos-annotate/trunk/src/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/pharos-annotate/trunk/src/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/pharos-annotate/trunk/src/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+
+for d in ANNOTATE ; do
+  echo "    Running CASCADE-MAKE/$d.sh $*"
+
+  ./CASCADE-MAKE/$d.sh $*
+
+  if [ $? != 0 ] ; then
+    echo "  Error encountered running CASCADE-COMPILE/$d.sh"
+    exit 1
+  fi
+done
Index: /main/tags/2.85/gs2-extensions/pharos-annotate/trunk/src/CASCADE-MAKE/ANNOTATE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/pharos-annotate/trunk/src/CASCADE-MAKE/ANNOTATE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/pharos-annotate/trunk/src/CASCADE-MAKE/ANNOTATE.sh	(revision 24799)
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+package=annotate
+version=-1.1
+
+progname=$0
+
+source ../bin/script/test-setup.bash
+source ../lib/cascade-lib.bash
+
+prefix=$GEXTIMAGE_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version "$prefix" \
+      "CFLAGS=-I$prefix/include \
+       LDFLAGS=-L$prefix/lib"
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
+
Index: /main/tags/2.85/gs2-extensions/postgres-gis/trunk/src/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/postgres-gis/trunk/src/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/postgres-gis/trunk/src/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+source devel.bash
+
+for d in packages ; do
+	echo "Running $d/CASCADE-MAKE.sh"
+
+	(cd $d ; ./CASCADE-MAKE.sh $*)
+
+	if [ $? != 0 ] ; then
+		echo "Error encountered running $d/CASCADE-MAKE.sh"
+		exit 1
+	fi
+done
+
+if [ $makedist = "1" ] ; then
+  default_toplevel_make_dist $GSDLOS
+fi
Index: /main/tags/2.85/gs2-extensions/postgres-gis/trunk/src/devel.bash
===================================================================
--- /main/tags/2.85/gs2-extensions/postgres-gis/trunk/src/devel.bash	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/postgres-gis/trunk/src/devel.bash	(revision 24799)
@@ -0,0 +1,1 @@
+source cascade-make/lib/cascade-lib.bash GEXTPOSTGRES . $*
Index: /main/tags/2.85/gs2-extensions/postgres-gis/trunk/src/packages/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/postgres-gis/trunk/src/packages/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/postgres-gis/trunk/src/packages/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+for d in BISON FLEX GEOS PROJ POSTGRES POSTGIS ; do
+	echo "    Running CASCADE-MAKE/$d.sh"
+
+	./CASCADE-MAKE/$d.sh $*
+
+	if [ $? != 0 ] ; then
+		echo "Error encountered running CASCADE-MAKE/$d.sh"
+		exit 1
+	fi
+done
Index: /main/tags/2.85/gs2-extensions/postgres-gis/trunk/src/packages/CASCADE-MAKE/BISON.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/postgres-gis/trunk/src/packages/CASCADE-MAKE/BISON.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/postgres-gis/trunk/src/packages/CASCADE-MAKE/BISON.sh	(revision 24799)
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+package=bison
+version=-2.4.3
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTPOSTGRES ../.. $*
+
+prefix=$GEXTPOSTGRES_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile $package $version
+opt_run_make $install $package $version "install"
+opt_run_make $clean $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
Index: /main/tags/2.85/gs2-extensions/postgres-gis/trunk/src/packages/CASCADE-MAKE/FLEX.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/postgres-gis/trunk/src/packages/CASCADE-MAKE/FLEX.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/postgres-gis/trunk/src/packages/CASCADE-MAKE/FLEX.sh	(revision 24799)
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+package=flex
+version=-2.5.35
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTPOSTGRES ../.. $*
+
+prefix=$GEXTPOSTGRES_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile $package $version
+opt_run_make $install $package $version "install"
+opt_run_make $clean $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
Index: /main/tags/2.85/gs2-extensions/postgres-gis/trunk/src/packages/CASCADE-MAKE/GEOS.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/postgres-gis/trunk/src/packages/CASCADE-MAKE/GEOS.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/postgres-gis/trunk/src/packages/CASCADE-MAKE/GEOS.sh	(revision 24799)
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+package=geos
+version=-3.2.2
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTPOSTGRES ../.. $*
+
+prefix=$GEXTPOSTGRES_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile $package $version
+opt_run_make $install $package $version "install"
+opt_run_make $clean $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
Index: /main/tags/2.85/gs2-extensions/postgres-gis/trunk/src/packages/CASCADE-MAKE/POSTGIS.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/postgres-gis/trunk/src/packages/CASCADE-MAKE/POSTGIS.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/postgres-gis/trunk/src/packages/CASCADE-MAKE/POSTGIS.sh	(revision 24799)
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+package=postgis
+version=-1.5.1
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTPOSTGRES ../.. $*
+
+prefix=$GEXTPOSTGRES_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version $prefix --with-projdir="$GEXTPOSTGRES_INSTALLED"
+
+opt_run_make $compile $package $version
+opt_run_make $install $package $version "install"
+opt_run_make $clean $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
Index: /main/tags/2.85/gs2-extensions/postgres-gis/trunk/src/packages/CASCADE-MAKE/POSTGRES.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/postgres-gis/trunk/src/packages/CASCADE-MAKE/POSTGRES.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/postgres-gis/trunk/src/packages/CASCADE-MAKE/POSTGRES.sh	(revision 24799)
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+package=postgresql
+version=-8.4.4
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTPOSTGRES ../.. $*
+
+prefix=$GEXTPOSTGRES_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version $prefix 
+
+opt_run_make $compile $package $version
+opt_run_make $install $package $version "install"
+opt_run_make $clean $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
Index: /main/tags/2.85/gs2-extensions/postgres-gis/trunk/src/packages/CASCADE-MAKE/PROJ.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/postgres-gis/trunk/src/packages/CASCADE-MAKE/PROJ.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/postgres-gis/trunk/src/packages/CASCADE-MAKE/PROJ.sh	(revision 24799)
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+package=proj
+version=-4.7.0
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTPOSTGRES ../.. $*
+
+prefix=$GEXTPOSTGRES_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile $package $version
+opt_run_make $install $package $version "install"
+opt_run_make $clean $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
Index: /main/tags/2.85/gs2-extensions/postgres-gis/trunk/src/setup.bash
===================================================================
--- /main/tags/2.85/gs2-extensions/postgres-gis/trunk/src/setup.bash	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/postgres-gis/trunk/src/setup.bash	(revision 24799)
@@ -0,0 +1,49 @@
+extdesc="the PostgreSQL and PostGIS extension"
+
+full_setup=`pwd`/${BASH_SOURCE}
+fulldir=${full_setup%/*}
+fulldir=${fulldir%/.}
+
+if [ "x$GSDLHOME" = "x" ] ; then
+  if [ -e ../../setup.bash ] ; then
+    export gsopt_noexts=1 && pushd ../.. && source setup.bash && popd 
+    export gsopt_noexts=
+  fi
+fi
+
+if [ "x$GEXTPOSTGRES" = "x" ] ; then
+  export GEXTPOSTGRES=$fulldir
+  export GEXTPOSTGRES_INSTALLED=$GEXTPOSTGRES/$GSDLOS
+
+  export PATH=$GEXTPOSTGRES_INSTALLED/bin:$PATH
+
+  if [ "x$LD_LIBRARY_PATH" = "x" ] ; then
+    export LD_LIBRARY_PATH=$GEXTPOSTGRES_INSTALLED/lib
+  else
+    export LD_LIBRARY_PATH=$GEXTPOSTGRES_INSTALLED/lib:$LD_LIBRARY_PATH
+  fi
+  if [ "x$DYLD_LIBRARY_PATH" = "x" ] ; then
+    export DYLD_LIBRARY_PATH=$GEXTPOSTGRES_INSTALLED/lib
+  else
+    export DYLD_LIBRARY_PATH=$GEXTPOSTGRES_INSTALLED/lib:$DYLD_LIBRARY_PATH
+  fi
+
+  if [ -e "devel-srcpack" ] ; then
+    export LD_LIBRARY_PATH=$GEXTPOSTGRES_INSTALLED/devel/lib:$LD_LIBRARY_PATH
+    export DYLD_LIBRARY_PATH=$GEXTPOSTGRES_INSTALLED/devel/lib:$DYLD_LIBRARY_PATH
+  fi
+
+  
+  extdir=${GEXTPOSTGRES##*/}
+
+  if [ "x$GSDLEXTS" = "x" ] ; then
+    export GSDLEXTS=$extdir
+  else 
+    export GSDLEXTS=$GSDLEXTS:$extdir
+  fi
+
+
+  echo "+Your environment is now setup for $extdesc"
+else
+  echo "+Your environment is already setup for $extdesc"
+fi
Index: /main/tags/2.85/gs2-extensions/rsync/trunk/src/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/rsync/trunk/src/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/rsync/trunk/src/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+source devel.bash
+
+for d in packages ; do
+  echo "Running $d/CASCADE-MAKE.sh"
+
+  (cd $d ; ./CASCADE-MAKE.sh $*)
+
+  if [ $? != 0 ] ; then
+    echo "Error encountered running $d/CASCADE-MAKE.sh"
+    exit 1
+  fi
+done
+
+if [ $makedist = "1" ] ; then
+  default_toplevel_make_dist $GSDLOS
+fi
Index: /main/tags/2.85/gs2-extensions/rsync/trunk/src/build.xml
===================================================================
--- /main/tags/2.85/gs2-extensions/rsync/trunk/src/build.xml	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/rsync/trunk/src/build.xml	(revision 24799)
@@ -0,0 +1,19 @@
+<project name="rsync" basedir="." default="install">
+  <property environment="env"/>
+  <property name="installdir" value="${basedir}/installed/linux"/>
+  
+  <target name="install">
+    <exec executable="/bin/bash">
+      <arg value="-c"/>
+      <arg value="source setup.bash ; ./CASCADE-MAKE.sh"/>
+    </exec>
+  </target>
+
+  <target name="uninstall">
+    <exec executable="/bin/bash">
+      <arg value="-c"/>
+      <arg value="./CASCADE-MAKE.sh distclean"/>
+    </exec>
+    <delete dir="${installdir}"/>
+  </target>
+</project>
Index: /main/tags/2.85/gs2-extensions/rsync/trunk/src/devel.bash
===================================================================
--- /main/tags/2.85/gs2-extensions/rsync/trunk/src/devel.bash	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/rsync/trunk/src/devel.bash	(revision 24799)
@@ -0,0 +1,1 @@
+source cascade-make/lib/cascade-lib.bash GEXTRSYNC . $*
Index: /main/tags/2.85/gs2-extensions/rsync/trunk/src/packages/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/rsync/trunk/src/packages/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/rsync/trunk/src/packages/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+list=RSYNC
+
+for d in $list ; do
+  echo "    Running CASCADE-MAKE/$d.sh $*"
+
+  ./CASCADE-MAKE/$d.sh $*
+
+  if [ $? != 0 ] ; then
+    echo "  Error encountered running CASCADE-MAKE/$d.sh"
+    exit 1
+  fi
+done
Index: /main/tags/2.85/gs2-extensions/rsync/trunk/src/packages/CASCADE-MAKE/RSYNC.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/rsync/trunk/src/packages/CASCADE-MAKE/RSYNC.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/rsync/trunk/src/packages/CASCADE-MAKE/RSYNC.sh	(revision 24799)
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+package=rsync
+version=-3.0.8-gs
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTRSYNC ../.. $*
+
+prefix=$GEXTRSYNC_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/rsync/trunk/src/setup.bash
===================================================================
--- /main/tags/2.85/gs2-extensions/rsync/trunk/src/setup.bash	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/rsync/trunk/src/setup.bash	(revision 24799)
@@ -0,0 +1,58 @@
+
+extdesc="the Rsync Extension"
+
+full_setup=`pwd`/${BASH_SOURCE}
+fulldir=${full_setup%/*}
+fulldir=${fulldir%/.}
+
+if [ "x$GSDLHOME" = "x" ] ; then
+  if [ -e ../../setup.bash ] ; then
+    export gsopt_noexts=1 && pushd ../.. && source setup.bash && popd
+    export gsopt_noexts=
+  elif [ -e ../../gs3-setup.sh ] ; then
+    export gsopt_noexts=1 && pushd ../.. && source gs3-setup.sh && popd
+    export gsopt_noexts=
+  fi
+
+fi
+
+if [ "x$GEXTRSYNC" = "x" ] ; then
+
+  export RSYNCOS=`uname -s | tr '[A-Z]' '[a-z]' | sed 's/\([0-9]\+\)\?_.*$//'`
+
+  if [ $RSYNCOS = "mingw" ] ; then
+    MINGW_CFLAGS="-Duint16_t=u_int16_t -Duint32_t=u_int32_t -Duint64_t=u_int64_t -Doff64_t=u_int64_t"
+
+    if [ "x$CFLAGS" = "x" ] ; then
+      export CFLAGS="$MINGW_CFLAGS"
+    else 
+      export CFLAGS="$CFLAGS $MINGW_CFLAGS"
+    fi
+  fi
+
+
+  export GEXTRSYNC=$fulldir
+  export GEXTRSYNC_INSTALLED=$GEXTRSYNC/$GSDLOS
+
+  export PATH=$GEXTRSYNC_INSTALLED/bin:$PATH
+
+  if [ "x$LD_LIBRARY_PATH" = "x" ] ; then
+    export LD_LIBRARY_PATH=$GEXTRSYNC_INSTALLED/lib
+  else
+    export LD_LIBRARY_PATH=$GEXTRSYNC_INSTALLED/lib:$LD_LIBRARY_PATH
+  fi
+
+  extdir=${GEXTRSYNC##*/}
+
+  if [ "x$GSDLEXTS" = "x" ] ; then
+    export GSDLEXTS=$extdir
+  else 
+    export GSDLEXTS=$GSDLEXTS:$extdir
+  fi
+
+  echo "+Your environment is now setup for $extdesc to Greenstone"
+else
+  echo "+Your environment is already setup for $extdesc to Greenstone"
+fi
+
+
Index: /main/tags/2.85/gs2-extensions/subversion/trunk/src/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/subversion/trunk/src/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/subversion/trunk/src/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+source devel.bash
+
+for d in packages ; do
+  echo "Running $d/CASCADE-MAKE.sh"
+
+  (cd $d ; ./CASCADE-MAKE.sh $*)
+
+  if [ $? != 0 ] ; then
+    echo "Error encountered running $d/CASCADE-MAKE.sh"
+    exit 1
+  fi
+done
+
+if [ $makedist = "1" ] ; then
+  default_toplevel_make_dist $GSDLOS
+fi
Index: /main/tags/2.85/gs2-extensions/subversion/trunk/src/devel.bash
===================================================================
--- /main/tags/2.85/gs2-extensions/subversion/trunk/src/devel.bash	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/subversion/trunk/src/devel.bash	(revision 24799)
@@ -0,0 +1,2 @@
+source cascade-make/lib/cascade-lib.bash GEXTSVN . $*
+
Index: /main/tags/2.85/gs2-extensions/subversion/trunk/src/packages/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/subversion/trunk/src/packages/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/subversion/trunk/src/packages/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+
+for d in APR SQLITE APRUTIL OPENSSL SERF NEON ZLIB SUBVERSION ; do
+  echo "    Running CASCADE-MAKE/$d.sh $*"
+
+  ./CASCADE-MAKE/$d.sh $*
+
+  if [ $? != 0 ] ; then
+    echo "  Error encountered running CASCADE-MAKE/$d.sh"
+    exit 1
+  fi
+done
Index: /main/tags/2.85/gs2-extensions/subversion/trunk/src/packages/CASCADE-MAKE/APR.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/subversion/trunk/src/packages/CASCADE-MAKE/APR.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/subversion/trunk/src/packages/CASCADE-MAKE/APR.sh	(revision 24799)
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+package=apr
+version=-1.3.8
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTSVN ../.. $*
+
+prefix=$GEXTSVN_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/subversion/trunk/src/packages/CASCADE-MAKE/APRUTIL.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/subversion/trunk/src/packages/CASCADE-MAKE/APRUTIL.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/subversion/trunk/src/packages/CASCADE-MAKE/APRUTIL.sh	(revision 24799)
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+package=apr-util
+version=-1.3.9
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTSVN ../.. $*
+
+prefix=$GEXTSVN_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version $prefix --with-apr=$prefix
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/subversion/trunk/src/packages/CASCADE-MAKE/NEON.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/subversion/trunk/src/packages/CASCADE-MAKE/NEON.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/subversion/trunk/src/packages/CASCADE-MAKE/NEON.sh	(revision 24799)
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+package=neon
+version=-0.28.6
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTSVN ../.. $*
+
+prefix=$GEXTSVN_INSTALLED
+
+export CFLAGS="-fPIC $CFLAGS"
+export CPPFLAGS="-fPIC $CPPFLAGS"
+export CXXFLAGS="-fPIC $CXXFLAGS"
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version $prefix --disable-static --enable-shared
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/subversion/trunk/src/packages/CASCADE-MAKE/OPENSSL.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/subversion/trunk/src/packages/CASCADE-MAKE/OPENSSL.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/subversion/trunk/src/packages/CASCADE-MAKE/OPENSSL.sh	(revision 24799)
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+package=openssl
+version=-1.0.0b
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTSVN ../.. $*
+
+prefix=$GEXTSVN_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+
+#opt_run_configure $force_config $auto_config $package $version $prefix
+if [ $force_config = 1 ] ; then
+  (cd $package$version ; ./config --prefix=$prefix shared)
+fi
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/subversion/trunk/src/packages/CASCADE-MAKE/SERF.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/subversion/trunk/src/packages/CASCADE-MAKE/SERF.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/subversion/trunk/src/packages/CASCADE-MAKE/SERF.sh	(revision 24799)
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+package=serf
+version=-0.3.0
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTSVN ../.. $*
+
+prefix=$GEXTSVN_INSTALLED
+
+export CFLAGS="-fPIC -I$prefix/include $CFLAGS"
+export CXXFLAGS="-fPIC -I$prefix/include $CXXFLAGS"
+export CPPFLAGS="-fPIC -I$prefix/include $CPPFLAGS"
+export LDFLAGS="-L$prefix/lib $LDFLAGS"
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/subversion/trunk/src/packages/CASCADE-MAKE/SQLITE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/subversion/trunk/src/packages/CASCADE-MAKE/SQLITE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/subversion/trunk/src/packages/CASCADE-MAKE/SQLITE.sh	(revision 24799)
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+package=sqlite
+version=-3.7.2
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTSVN ../.. $*
+
+prefix=$GEXTSVN_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/subversion/trunk/src/packages/CASCADE-MAKE/SUBVERSION.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/subversion/trunk/src/packages/CASCADE-MAKE/SUBVERSION.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/subversion/trunk/src/packages/CASCADE-MAKE/SUBVERSION.sh	(revision 24799)
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+package=subversion
+version=-1.6.13
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTSVN ../.. $*
+
+prefix=$GEXTSVN_INSTALLED
+
+export CFLAGS="-I$prefix/include $CFLAGS"
+export CXXFLAGS="-I$prefix/include $CXXFLAGS"
+export CPPFLAGS="-I$prefix/include $CPPFLAGS"
+export LDFLAGS="-L$prefix/lib $LDFLAGS"
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version $prefix --with-sqlite=$prefix
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/subversion/trunk/src/packages/CASCADE-MAKE/ZLIB.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/subversion/trunk/src/packages/CASCADE-MAKE/ZLIB.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/subversion/trunk/src/packages/CASCADE-MAKE/ZLIB.sh	(revision 24799)
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+package=zlib
+version=-1.2.4
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTSVN ../.. $*
+
+prefix=$GEXTSVN_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/subversion/trunk/src/setup.bash
===================================================================
--- /main/tags/2.85/gs2-extensions/subversion/trunk/src/setup.bash	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/subversion/trunk/src/setup.bash	(revision 24799)
@@ -0,0 +1,43 @@
+extdesc="the Subversion extension"
+
+full_setup=`pwd`/${BASH_SOURCE}
+fulldir=${full_setup%/*}
+fulldir=${fulldir%/.}
+
+if [ "x$GSDLHOME" = "x" ] ; then
+  if [ -e ../../setup.bash ] ; then
+    export gsopt_noexts=1 && pushd ../.. && source setup.bash && popd
+    export gsopt_noexts=
+  fi
+fi
+
+if [ "x$GEXTSVN" = "x" ] ; then
+  export GEXTSVN=$fulldir
+  export GEXTSVN_INSTALLED=$GEXTSVN/$GSDLOS
+
+  export PATH=$GEXTSVN_INSTALLED/bin:$PATH
+
+  if [ "x$LD_LIBRARY_PATH" = "x" ] ; then
+    export LD_LIBRARY_PATH=$GEXTSVN_INSTALLED/lib
+  else
+    export LD_LIBRARY_PATH=$GEXTSVN_INSTALLED/lib:$LD_LIBRARY_PATH
+  fi
+  if [ "x$DYLD_LIBRARY_PATH" = "x" ] ; then
+    export DYLD_LIBRARY_PATH=$GEXTSVN_INSTALLED/lib
+  else
+    export DYLD_LIBRARY_PATH=$GEXTSVN_INSTALLED/lib:$DYLD_LIBRARY_PATH
+  fi
+
+  extdir=${GEXTSVN##*/}
+
+  if [ "x$GSDLEXTS" = "x" ] ; then
+    export GSDLEXTS=$extdir
+  else 
+    export GSDLEXTS=$GSDLEXTS:$extdir
+  fi
+
+
+  echo "+Your environment is now setup for $extdesc"
+else
+  echo "+Your environment is already setup for $extdesc"
+fi
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/.svnignore
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/.svnignore	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/.svnignore	(revision 24799)
@@ -0,0 +1,3 @@
+darwin
+linux
+windows
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+source devel.bash
+
+for d in packages src ; do
+  echo "Running $d/CASCADE-MAKE.sh"
+
+  (cd $d ; ./CASCADE-MAKE.sh $*)
+
+  if [ $? != 0 ] ; then
+    echo "Error encountered running $d/CASCADE-MAKE.sh"
+    exit 1
+  fi
+done
+
+if [ $makedist = "1" ] ; then
+  default_toplevel_make_dist $GSDLOS
+fi
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/README.txt
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/README.txt	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/README.txt	(revision 24799)
@@ -0,0 +1,1 @@
+GS tools that provide similar functionality to the GDBM Edit tools but based on the TDB project (from SAMBA Project). TDB has the same API as GDBM and is designed to support parallel processor.
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/build.xml
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/build.xml	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/build.xml	(revision 24799)
@@ -0,0 +1,19 @@
+<project name="tdb-edit" basedir="." default="install">
+  <property environment="env"/>
+  <property name="installdir" value="${basedir}/installed/linux"/>
+  
+  <target name="install">
+    <exec executable="/bin/bash">
+      <arg value="-c"/>
+      <arg value="source setup.bash ; ./CASCADE-MAKE.sh"/>
+    </exec>
+  </target>
+
+  <target name="uninstall">
+    <exec executable="/bin/bash">
+      <arg value="-c"/>
+      <arg value="./CASCADE-MAKE.sh distclean"/>
+    </exec>
+    <delete dir="${installdir}"/>
+  </target>
+</project>
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/devel.bash
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/devel.bash	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/devel.bash	(revision 24799)
@@ -0,0 +1,1 @@
+source cascade-make/lib/cascade-lib.bash GEXTTDBEDIT . $*
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/disable_tdb.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/disable_tdb.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/disable_tdb.sh	(revision 24799)
@@ -0,0 +1,80 @@
+#!/bin/bash
+# Used to merge in the code needed to add TDB support to Greenstone. The script
+# is responsible for updating both Makefile.in and source code files. You can
+# later run 'disable_tdb.sh' to undo these changes.
+# @author John Thompson, University of Waikato, NZ
+
+echo
+echo '===== Removing TDB support code from Greenstone ====='
+echo
+
+# Test that GSDLHOME is set otherwise we won't be able to find the required files
+if [ "$GSDLHOME" == "" ] ; then echo 'Error! GSDLHOME not set. Please source setup.bash before running.' ; echo ; exit 0 ; fi
+
+
+echo ' - removing TDB support from common function library'
+# - Makefile.in
+sed -i 's:\(EXT_DEFINES\s*=.*\)\s-DUSE_TDB\(.*\):\1\2:' $GSDLHOME/common-src/src/lib/Makefile.in
+sed -i 's:\(EXT_INCLUDES\s*=.*\)\s-I$(GSDL_DIR)/ext/tdb-edit/linux/include\s*-I$(GSDL_DIR)/ext/tdb-edit/darwin/include\s*-I$(GSDL_DIR)/ext/tdb-edit/src/lib\(.*\):\1\2:' $GSDLHOME/common-src/src/lib/Makefile.in
+sed -i 's:\(EXT_SOURCES\s*=.*\)\stdbclass.cpp\(.*\):\1\2:' $GSDLHOME/common-src/src/lib/Makefile.in
+sed -i 's:\(EXT_OBJECTS\s*=.*\)\stdbclass.o\(.*\):\1\2:' $GSDLHOME/common-src/src/lib/Makefile.in
+rm -f $GSDLHOME/common-src/src/lib/Makefile
+# - Remove symlink
+rm -f $GSDLHOME/common-src/src/lib/tdbclass.cpp
+# - Remove compiled files
+rm -f $GSDLHOME/common-src/src/lib/tdbclass.o
+rm -f $GSDLHOME/common-src/src/lib/gsdllib.a
+
+
+echo ' - removing TDB support from collection server'
+# - Makefile.in
+sed -i 's:\(EXT_DEFINES\s*=.*\)\s-DUSE_TDB\(.*\):\1\2:' $GSDLHOME/runtime-src/src/colservr/Makefile.in
+sed -i 's:\(EXT_INCLUDES\s*=.*\)\s-I$(GSDL_DIR)/ext/tdb-edit/linux/include\s*-I$(GSDL_DIR)/ext/tdb-edit/darwin/include\s*-I$(GSDL_DIR)/ext/tdb-edit/src/lib\(.*\):\1\2:' $GSDLHOME/runtime-src/src/colservr/Makefile.in
+rm -f $GSDLHOME/runtime-src/src/colservr/Makefile
+# - collectset.cpp
+# BUG: leaves behind the newlines... weird, shouldn't the $ capture them
+sed -i '/^#include "tdbclass.h" \/\/TDB$/ d' $GSDLHOME/runtime-src/src/colservr/collectset.cpp
+sed -i '/^if (infodbtype == "tdb") {db_ptr = new tdbclass(gsdlhome);} \/\/TDB/ d' $GSDLHOME/runtime-src/src/colservr/collectset.cpp
+# - Remove compiled files
+rm -f $GSDLHOME/runtime-src/src/colservr/gsdlcolservr.a
+
+
+echo ' - removing TDB support from Greenstone receptionist'
+# - Makefile.in
+sed -i 's:\(EXT_DEFINES\s*=.*\)\s-DUSE_TDB\(.*\):\1\2:' $GSDLHOME/runtime-src/src/recpt/Makefile.in
+sed -i 's:\(EXT_INCLUDES\s*=.*\)\s-I$(GSDL_DIR)/ext/tdb-edit/linux/include\s*-I$(GSDL_DIR)/ext/tdb-edit/darwin/include\s*-I$(GSDL_DIR)/ext/tdb-edit/src/lib\(.*\):\1\2:' $GSDLHOME/runtime-src/src/recpt/Makefile.in
+sed -i 's:\(EXT_LDFLAGS\s*=.*\)\s-L$(GSDL_DIR)/ext/tdb-edit/linux/lib -L$(GSDL_DIR)/ext/tdb-edit/darwin/lib\(.*\):\1\2:' $GSDLHOME/runtime-src/src/recpt/Makefile.in
+sed -i 's:\(EXT_LIBS\s*=.*\)\s-ltdb\(.*\):\1\2:' $GSDLHOME/runtime-src/src/recpt/Makefile.in
+rm -f $GSDLHOME/runtime-src/src/recpt/Makefile
+# - Remove compiled files
+rm -f $GSDLHOME/runtime-src/src/recpt/gsdlrecpt.a
+rm -f $GSDLHOME/runtime-src/src/recpt/library.cgi
+rm -f $GSDLHOME/cgi-bin/library.cgi
+
+
+echo ' - removing TDB support from OAI Server receptionist'
+# - Makefile.in
+sed -i 's:\(EXT_LDFLAGS\s*=.*\)\s-L$(GSDL_DIR)/ext/tdb-edit/linux/lib -L$(GSDL_DIR)/ext/tdb-edit/darwin/lib\(.*\):\1\2:' $GSDLHOME/runtime-src/src/oaiservr/Makefile.in
+sed -i 's:\(EXT_LIBS\s*=.*\)\s-ltdb\(.*\):\1\2:' $GSDLHOME/runtime-src/src/oaiservr/Makefile.in
+rm -f $GSDLHOME/runtime-src/src/oaiservr/Makefile
+# - Remove compiled files
+rm -f $GSDLHOME/runtime-src/src/oaiservr/oaiserver.cgi
+rm -f $GSDLHOME/cgi-bin/oaiserver.cgi
+
+echo
+echo '====================================================='
+echo
+echo 'TDB support has now been removed from Greenstone.'
+echo 'Please return to the main Greenstone directory and'
+echo 'rerun:'
+echo
+echo ' ./configure <any required arguments>'
+echo ' make'
+echo ' make install'
+echo
+echo 'to complete TDB removal.'
+echo
+echo '====================================================='
+echo
+
+exit 0
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/enable_tdb.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/enable_tdb.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/enable_tdb.sh	(revision 24799)
@@ -0,0 +1,79 @@
+#!/bin/bash
+# Used to merge in the code needed to add TDB support to Greenstone. The script
+# is responsible for updating both Makefile.in and source code files. You can
+# later run 'disable_tdb.sh' to undo these changes.
+# @author John Thompson, University of Waikato, NZ
+
+echo
+echo '===== Merging TDB support code into Greenstone ====='
+echo
+
+# Test that GSDLHOME is set otherwise we won't be able to find the required files
+if [ "$GSDLHOME" == "" ] ; then echo 'Error! GSDLHOME not set. Please source setup.bash before running.' ; echo ; exit 0 ; fi
+
+echo ' - enabling TDB support in common function library'
+# - Symlink the source file into place
+ln -f -s $GSDLHOME/ext/tdb-edit/src/lib/tdbclass.cpp $GSDLHOME/common-src/src/lib/tdbclass.cpp
+# - Makefile.in
+grep -q 'DUSE_TDB' $GSDLHOME/common-src/src/lib/Makefile.in
+if [ $? -eq 1 ]
+then
+  sed -i 's:EXT_DEFINES =.*:& -DUSE_TDB:' $GSDLHOME/common-src/src/lib/Makefile.in
+  sed -i 's:EXT_INCLUDES =.*:& -I$(GSDL_DIR)/ext/tdb-edit/linux/include -I$(GSDL_DIR)/ext/tdb-edit/darwin/include -I$(GSDL_DIR)/ext/tdb-edit/src/lib:' $GSDLHOME/common-src/src/lib/Makefile.in
+  sed -i 's:EXT_SOURCES =.*:& tdbclass.cpp:' $GSDLHOME/common-src/src/lib/Makefile.in
+  sed -i 's:EXT_OBJECTS =.*:& tdbclass.o:' $GSDLHOME/common-src/src/lib/Makefile.in
+fi
+
+echo ' - enabling TDB support in collection server'
+# - Makefile.in
+grep -q 'DUSE_TDB' $GSDLHOME/runtime-src/src/colservr/Makefile.in
+if [ $? -eq 1 ]
+then
+  sed -i 's:EXT_DEFINES =.*:& -DUSE_TDB:' $GSDLHOME/runtime-src/src/colservr/Makefile.in
+  sed -i 's:EXT_INCLUDES =.*:& -I$(GSDL_DIR)/ext/tdb-edit/linux/include -I$(GSDL_DIR)/ext/tdb-edit/darwin/include -I$(GSDL_DIR)/ext/tdb-edit/src/lib:' $GSDLHOME/runtime-src/src/colservr/Makefile.in
+fi
+# - collectset.cpp
+grep -q 'tdbclass.h' $GSDLHOME/runtime-src/src/colservr/collectset.cpp
+if [ $? -eq 1 ]
+then
+  sed -i 's:// @EXTENSION HEADERS@:&\n#include "tdbclass.h" //TDB:' $GSDLHOME/runtime-src/src/colservr/collectset.cpp
+  sed -i 's:// @EXTENSION DATASOURCES@:&\nif (infodbtype == "tdb") {db_ptr = new tdbclass(gsdlhome);} //TDB:' $GSDLHOME/runtime-src/src/colservr/collectset.cpp
+fi
+
+echo ' - enabling TDB support in Greenstone receptionist'
+# - Makefile.in
+grep -q 'DUSE_TDB' $GSDLHOME/runtime-src/src/recpt/Makefile.in
+if [ $? -eq 1 ]
+then
+  sed -i 's:EXT_DEFINES =.*:& -DUSE_TDB:' $GSDLHOME/runtime-src/src/recpt/Makefile.in
+  sed -i 's:EXT_INCLUDES =.*:& -I$(GSDL_DIR)/ext/tdb-edit/linux/include -I$(GSDL_DIR)/ext/tdb-edit/darwin/include -I$(GSDL_DIR)/ext/tdb-edit/src/lib:' $GSDLHOME/runtime-src/src/recpt/Makefile.in
+  sed -i 's:EXT_LDFLAGS =.*:& -L$(GSDL_DIR)/ext/tdb-edit/linux/lib -L$(GSDL_DIR)/ext/tdb-edit/darwin/lib:' $GSDLHOME/runtime-src/src/recpt/Makefile.in
+  sed -i 's:EXT_LIBS =.*:& -ltdb:' $GSDLHOME/runtime-src/src/recpt/Makefile.in
+fi
+
+echo ' - enabling TDB support in OAI Server receptionist'
+# - Makefile.in
+grep -q 'DUSE_TDB' $GSDLHOME/runtime-src/src/oaiservr/Makefile.in
+if [ $? -eq 1 ]
+then
+  sed -i 's:EXT_LDFLAGS =.*:& -L$(GSDL_DIR)/ext/tdb-edit/linux/lib -L$(GSDL_DIR)/ext/tdb-edit/darwin/lib:' $GSDLHOME/runtime-src/src/oaiservr/Makefile.in
+  sed -i 's:EXT_LIBS =.*:& -ltdb:' $GSDLHOME/runtime-src/src/oaiservr/Makefile.in
+fi
+
+echo
+echo '===================================================='
+echo
+echo 'TDB support has now been merged into Greenstone.'
+echo 'Please return to the main Greenstone directory and '
+echo 'rerun:'
+echo
+echo ' ./configure <any required arguments>'
+echo ' make'
+echo ' make install'
+echo
+echo 'to complete TDB installation.'
+echo
+echo '===================================================='
+echo
+
+exit 0
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/packages/.svnignore
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/packages/.svnignore	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/packages/.svnignore	(revision 24799)
@@ -0,0 +1,1 @@
+tdb-1.2.9
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/packages/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/packages/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/packages/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+list=TDB
+
+for d in $list ; do
+  echo "    Running CASCADE-MAKE/$d.sh $*"
+
+  ./CASCADE-MAKE/$d.sh $*
+
+  if [ $? != 0 ] ; then
+    echo "  Error encountered running CASCADE-MAKE/$d.sh"
+    exit 1
+  fi
+done
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/packages/CASCADE-MAKE/TDB.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/packages/CASCADE-MAKE/TDB.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/packages/CASCADE-MAKE/TDB.sh	(revision 24799)
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+package=tdb
+version=-1.2.9
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTTDBEDIT ../.. $*
+
+prefix=$GEXTTDBEDIT_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/perllib/dbutil.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/perllib/dbutil.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/perllib/dbutil.pm	(revision 24799)
@@ -0,0 +1,313 @@
+###########################################################################
+#
+# dbutil.pm -- gateway to utilities for reading/writing to different databases
+#
+# Copyright (C) 2008  DL Consulting Ltd
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package dbutil;
+
+use strict;
+
+use Symbol qw<qualify>;
+use util;
+
+# /** Dynamic class loading - for use in DBUtils to load various database
+#  *  drivers, configured in the collect.cfg, at runtime.
+#  *  @param $class - The class name (including any path) to load
+#  *  @param rest - any function aliases you want exported
+#  */
+sub load_db_driver
+{
+  my $class = shift(@_);
+  (my $file = "$class.pm") =~ s|::|/|g;
+  # - ensure we haven't already loaded this class
+  unless( $INC{$file} )
+  {
+    # - require is fine being assigned at runtime - no need for evil eval
+    eval
+    {
+      require $file;
+    };
+  }
+  # - this is the magic that actually instantiates the class (rubberstamp?)
+  # - we pass @_ to action any function aliases exports requested
+  eval
+  {
+    $class->import(@_);
+  };
+  # - by now the driver file should have been loaded
+  return (defined $INC{$file});
+}
+# /** load_db_driver() **/
+
+# /** Make a function call to a dynamically loaded database driver.
+#  *  @param $function_name
+#  *  @param $driver_name
+#  *  @param <rest> The parameters to be passed to the function called
+#  */
+sub call_dynamic_driver_function
+{
+  my $function_name = shift(@_);
+  my $driver_name = shift(@_);
+  my $package_name = 'dbutil::' . $driver_name;
+  # - try to load the requested infodb type
+  if (!&load_db_driver($package_name))
+  {
+    # - try loading the default GDBM driver
+    print STDERR 'Warning! Using default database driver (GDBM) as failed to load configured database driver: ' . $driver_name . "\n";
+    $package_name = 'dbutil::gdbm';
+    if (!&load_db_driver($package_name))
+    {
+      die("Fatal Error! Failed to load default database driver: dbutil::gdbm\n");
+    }
+  }
+  # - make call to the newly created package
+  no strict;
+  # - lets check that the function we are about to call
+  my $symbol = qualify($function_name, $package_name);
+  unless ( defined &{$symbol} )
+  {
+    die ('Error! Function not found: ' . $package_name . '::' . $function_name . "()\n");
+  }
+  return &{$symbol}(@_);
+}
+# /** call_dynamic_driver_function() **/
+
+
+sub open_infodb_write_handle
+{
+  my $infodb_type = shift(@_);
+  my $infodb_file_path = shift(@_);
+  # Make a call to the dynamically loaded driver to open the connection.
+  return &dbutil::call_dynamic_driver_function('open_infodb_write_handle', $infodb_type, $infodb_file_path, @_);
+}
+
+
+sub close_infodb_write_handle
+{
+  my $infodb_type = shift(@_);
+  my $infodb_handle = shift(@_);
+  # Dynamic database driver call
+  return &dbutil::call_dynamic_driver_function('close_infodb_write_handle', $infodb_type, $infodb_handle, @_);
+}
+
+
+sub get_default_infodb_type
+{
+  # The default is GDBM so everything works the same for existing collections
+  # To use something else, specify the "infodbtype" in the collection's collect.cfg file
+  return "gdbm";
+}
+
+
+sub get_infodb_file_path
+{
+  my $infodb_type = shift(@_);
+  my $collection_name = shift(@_);
+  my $infodb_directory_path = shift(@_);
+
+  #=======================================MSSQL SUPPORT==============================================#
+  # Updated by Jeffrey (2008/08/25 Monday)
+  # After look into the run-time code, it seems we should still create a database file.
+  # Since the run-time code is always try to read a database file, the easiest way here is not
+  # to change the whole structure, but to give whatever the system is looking for.
+  #==================================================================================================#
+  # Added by Jeffrey (2008/08/15 Friday)
+  # No file path required for MS SQL, it is a server-client connection.
+  # At the moment the information is hard coded in dbutil::mssql::open_infodb_write_handle
+  # the this might need some tidy up sometime.
+  #==================================================================================================#
+
+  return &dbutil::call_dynamic_driver_function('get_infodb_file_path', $infodb_type, $collection_name, $infodb_directory_path, @_);
+}
+
+# This function, conceptually, would be better structured if it didn't
+# use return statements, as the database methods it calls do not
+# themselves return anything.
+# Note: if doing this, then the GDBM lines of code should be moved into
+# an 'else' clause
+sub read_infodb_file
+{
+  my $infodb_type = shift(@_);
+  my $infodb_file_path = shift(@_);
+  my $infodb_map = shift(@_);
+
+  return &dbutil::call_dynamic_driver_function('read_infodb_file', $infodb_type, $infodb_file_path, $infodb_map, @_);
+}
+
+sub read_infodb_keys
+{
+    my $infodb_type = shift(@_);
+    my $infodb_file_path = shift(@_);
+    my $infodb_map = shift(@_);
+
+    return &dbutil::call_dynamic_driver_function('read_infodb_keys', $infodb_type, $infodb_file_path, $infodb_map, @_);
+}
+
+sub write_infodb_entry
+{
+  my $infodb_type = shift(@_);
+  my $infodb_handle = shift(@_);
+  my $infodb_key = shift(@_);
+  my $infodb_map = shift(@_);
+
+  return &dbutil::call_dynamic_driver_function('write_infodb_entry', $infodb_type, $infodb_handle, $infodb_key, $infodb_map, @_);
+}
+
+
+sub write_infodb_rawentry
+{
+  my $infodb_type = shift(@_);
+  my $infodb_handle = shift(@_);
+  my $infodb_key = shift(@_);
+  my $infodb_val = shift(@_);
+
+  return &dbutil::call_dynamic_driver_function('write_infodb_rawentry', $infodb_type, $infodb_handle, $infodb_key, $infodb_val, @_);
+}
+
+
+sub set_infodb_entry
+{
+  my $infodb_type = shift(@_);
+  my $infodb_file_path = shift(@_);
+  my $infodb_key = shift(@_);
+  my $infodb_map = shift(@_);
+
+  return &dbutil::call_dynamic_driver_function('set_infodb_entry', $infodb_type, $infodb_file_path, $infodb_key, $infodb_map, @_);
+}
+
+
+
+sub delete_infodb_entry
+{
+  my $infodb_type = shift(@_);
+  my $infodb_handle = shift(@_);
+  my $infodb_key = shift(@_);
+
+  return &dbutil::call_dynamic_driver_function('delete_infodb_entry', $infodb_type, $infodb_handle, $infodb_key, @_);
+}
+
+sub read_infodb_rawentry
+{
+  my $infodb_type = shift(@_);
+  my $infodb_file_path = shift(@_);
+  my $infodb_key = shift(@_);
+
+  # !! TEMPORARY: Slow and naive implementation that just reads the entire file and picks out the one value
+  # !! This will one day be replaced with database-specific versions that will use dbget etc.
+  my $infodb_map = {};
+  &read_infodb_file($infodb_type, $infodb_file_path, $infodb_map);
+
+  return $infodb_map->{$infodb_key};
+}
+
+
+sub read_infodb_entry
+{
+  my $infodb_type = shift(@_);
+  my $infodb_file_path = shift(@_);
+  my $infodb_key = shift(@_);
+
+  if ($infodb_type eq "sqlite")
+  {
+    require dbutil::sqlite;
+    return &dbutil::sqlite::read_infodb_entry($infodb_file_path, $infodb_key, @_);
+  }
+#  elsif ($infodb_type eq "gdbm-txtgz")
+#  {
+#    require dbutil::gdbmtxtgz;
+#    return &dbutil::gdbmtxtgz::read_infodb_entry($infodb_file_path, $infodb_key, @_);
+#  }
+#  elsif ($infodb_type eq "jdbm")
+#  {
+#    require dbutil::jdbm;
+#    return &dbutil::jdbm::read_infodb_entry($infodb_file_path, $infodb_key, @_);
+#  }
+#  elsif ($infodb_type eq "mssql")
+#  {
+#    require dbutil::mssql;
+#    return &dbutil::mssql::read_infodb_entry($infodb_file_path, $infodb_key, @_);
+#  }
+  
+#  # Use GDBM if the infodb type is empty or not one of the values above
+#  require dbutil::gdbm;
+#  return &dbutil::gdbm::read_infodb_entry($infodb_file_path, $infodb_key, @_);
+  
+  
+  # rawentry above is currently naive implementation
+  my $raw_string = read_infodb_rawentry($infodb_type, $infodb_file_path, $infodb_key);
+  my $infodb_rec = &dbutil::convert_infodb_string_to_hash($raw_string); 
+  
+  return $infodb_rec;
+}
+
+
+# ---- GENERAL FUNCTIONS --------
+
+sub convert_infodb_hash_to_string
+{
+  my $infodb_map = shift(@_);
+
+  my $infodb_entry_value = "";
+  foreach my $infodb_value_key (keys(%$infodb_map))
+  {
+    foreach my $infodb_value (@{$infodb_map->{$infodb_value_key}})
+    {
+      $infodb_entry_value .= "<$infodb_value_key>" . $infodb_value . "\n";
+    }
+  }
+
+  return $infodb_entry_value;
+}
+
+
+sub convert_infodb_string_to_hash
+{
+  my $infodb_entry_value = shift(@_);
+  my $infodb_map = ();
+  
+  if (!defined $infodb_entry_value) {
+	print STDERR "Warning: No value to convert into a infodb hashtable\n";
+  }
+  else {
+    while ($infodb_entry_value =~ /^<(.*?)>(.*)$/mg)
+    {
+        my $infodb_value_key = $1;
+		my $infodb_value = $2;
+
+		if (!defined($infodb_map->{$infodb_value_key}))
+		{
+		  $infodb_map->{$infodb_value_key} = [ $infodb_value ];
+		}
+		else
+		{
+		  push(@{$infodb_map->{$infodb_value_key}}, $infodb_value);
+		}
+	}
+  }
+
+  return $infodb_map;
+}
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/perllib/dbutil/tdb.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/perllib/dbutil/tdb.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/perllib/dbutil/tdb.pm	(revision 24799)
@@ -0,0 +1,286 @@
+###########################################################################
+#
+# dbutil::tdb -- utility functions for writing to tdb databases. Should be
+#                hauntingly similar to GDBM utility functions.
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2011
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package dbutil::tdb;
+
+# Pragma
+use strict;
+
+# Libraries/Modules
+use Cwd;
+use dbutil::gdbmtxtgz;
+
+# -----------------------------------------------------------------------------
+#   TDB IMPLEMENTATION
+# -----------------------------------------------------------------------------
+
+our %handle_pool;
+
+END {
+  # Close any handles left open in the pool
+  foreach my $pool_key (keys %handle_pool)
+  {
+    my $infodb_file_handle = $handle_pool{$pool_key};
+    close_infodb_write_handle($infodb_file_handle, 1);
+  }
+}
+
+# /**
+#  */
+sub get_tdb_executable
+{
+  my $program = shift(@_);
+  my $program_exe = &util::filename_cat($program . &util::get_os_exe());
+  #if (!-x $program_exe)
+  #{
+  #  die('Fatal Error! File doesn\'t exist or isn\'t executable: ' . $program_exe);
+  #}
+  return $program_exe;
+}
+# /** get_tdb_executable() **/
+
+
+
+# /**
+#  */
+sub open_infodb_write_handle
+{
+  my $infodb_file_path = shift(@_);
+  my $opt_append = shift(@_);
+
+  my $txt2tdb_exe = &dbutil::tdb::get_tdb_executable('txt2tdb');
+
+  my $pool_key = $infodb_file_path;
+  #my $cmd = "taskset -c 5 \"$txt2tdb_exe\"";
+  my $cmd = "\"$txt2tdb_exe\"";
+  if ((defined $opt_append) && ($opt_append eq "append"))
+  {
+    $cmd .= " -append";
+    $pool_key .= '-append';
+  }
+  $cmd .= " \"$infodb_file_path\"";
+  #$cmd .= " -debug"; # Uncomment to enable debug timing
+
+  # we're going to pipe the key value pairs, in the appropriate format, from
+  # within the buildproc, so we create a piped handle here
+  my $infodb_file_handle = undef;
+  if (defined $handle_pool{$pool_key})
+  {
+    $infodb_file_handle = $handle_pool{$pool_key};
+  }
+  else
+  {
+    print STDERR "tdb::open_infodb_write_handle()\n";
+    if(!open($infodb_file_handle, "| $cmd"))
+    {
+      print STDERR "Error: Failed to open pipe to $cmd\n";
+      print STDERR "       $!\n";
+      return undef;
+    }
+    binmode($infodb_file_handle,":utf8");
+    $handle_pool{$pool_key} = $infodb_file_handle;
+  }
+  return $infodb_file_handle;
+}
+# /** open_infodb_write_handle() **/
+
+# /**
+#  */
+sub close_infodb_write_handle
+{
+  my $infodb_handle = shift(@_);
+  my ($empty_pool) = @_;
+  if (defined $empty_pool && $empty_pool == 1)
+  {
+    print STDERR "tdb::close_infodb_write_handle()\n";
+    close($infodb_handle);
+  }
+}
+# /** close_infodb_write_handle() **/
+
+# /**
+#  */
+sub get_infodb_file_path
+{
+  my $collection_name = shift(@_);
+  my $infodb_directory_path = shift(@_);
+
+  my $infodb_file_extension = ".tdb";
+  my $infodb_file_name = &util::get_dirsep_tail($collection_name) . $infodb_file_extension;
+
+  return &util::filename_cat($infodb_directory_path, $infodb_file_name);
+}
+# /** get_infodb_file_path() **/
+
+# /**
+#  */
+sub read_infodb_file
+{
+  my $infodb_file_path = shift(@_);
+  my $infodb_map = shift(@_);
+
+  my $tdb2txt_exe = &dbutil::tdb::get_tdb_executable('tdb2txt');
+
+  if (!open (PIPEIN, "\"$tdb2txt_exe\" \"$infodb_file_path\" |"))
+  {
+    print STDERR 'Error: Failed to open pipe to ' . $tdb2txt_exe . "\n";
+    print STDERR "       $!\n";
+    return undef;
+  }
+
+  binmode(PIPEIN,":utf8");
+
+  my $infodb_line = "";
+  my $infodb_key = "";
+  my $infodb_value = "";
+  while (defined ($infodb_line = <PIPEIN>))
+  {
+    if ($infodb_line =~ /^\[([^\]]+)\]$/)
+    {
+      $infodb_key = $1;
+    }
+    elsif ($infodb_line =~ /^-{70}$/)
+    {
+      $infodb_map->{$infodb_key} = $infodb_value;
+      $infodb_key = "";
+      $infodb_value = "";
+    }
+    else
+    {
+      $infodb_value .= $infodb_line;
+    }
+  }
+
+  close (PIPEIN);
+}
+# /** read_infodb_file() **/
+
+# /**
+#  */
+sub read_infodb_keys
+{
+  my $infodb_file_path = shift(@_);
+  my $infodb_map = shift(@_);
+
+  my $tdbkeys_exe = &dbutil::tdb::get_tdb_executable('tdbkeys');
+
+  if (!open (PIPEIN, "\"tdbkeys_exe\" \"$infodb_file_path\" |"))
+  {
+    die "couldn't open pipe from gdbmkeys \$infodb_file_path\"\n$!\n";
+  }
+
+  binmode(PIPEIN,":utf8");
+
+  my $infodb_line = "";
+  my $infodb_key = "";
+  my $infodb_value = "";
+  while (defined ($infodb_line = <PIPEIN>))
+  {
+    # remove end of line
+    chomp $infodb_line;
+
+    $infodb_map->{$infodb_line} = 1;
+  }
+
+  close (PIPEIN);
+}
+# /** read_infodb_keys() **/
+
+# /**
+#  */
+sub write_infodb_entry
+{
+  # With infodb_handle already set up, works the same as gdbm and gdbm_txtgz
+  # versions
+  &dbutil::gdbmtxtgz::write_infodb_entry(@_);
+}
+# /** write_infodb_entry() **/
+
+# /**
+#  */
+sub write_infodb_rawentry
+{
+  # With infodb_handle already set up, works the same as gdbm and gdbm_txtgz
+  # versions
+  &dbutil::gdbmtxtgz::write_infodb_rawentry(@_);
+}
+# /** write_infodb_rawentry() **/
+
+# /**
+#  */
+sub set_infodb_entry
+{
+  my $infodb_file_path = shift(@_);
+  my $infodb_key = shift(@_);
+  my $infodb_map = shift(@_);
+
+  # Protect metadata values that go inside quotes for tdbset
+  foreach my $k (keys %$infodb_map)
+  {
+    my @escaped_v = ();
+    foreach my $v (@{$infodb_map->{$k}})
+    {
+      if ($k eq "contains")
+      {
+        # protect quotes in ".2;".3 etc
+        $v =~ s/\"/\\\"/g;
+        push(@escaped_v, $v);
+      }
+      else
+      {
+        my $ev = &ghtml::unescape_html($v);
+        $ev =~ s/\"/\\\"/g;
+        push(@escaped_v, $ev);
+      }
+    }
+    $infodb_map->{$k} = \@escaped_v;
+  }
+
+  # Generate the record string
+  my $serialized_infodb_map = &dbutil::convert_infodb_hash_to_string($infodb_map);
+  ## print STDERR "**** ser dr\n$serialized_infodb_map\n\n\n";
+
+  # Store it into GDBM
+  my $tdbset_exe = &dbutil::tdb::get_tdb_executable('tdbset');
+  my $cmd = "\"tdbset_exe\" \"$infodb_file_path\" \"$infodb_key\" \"$serialized_infodb_map\"";
+  my $status = system($cmd);
+
+  return $status;
+}
+# /** set_infodb_entry() **/
+
+# /**
+#  */
+sub delete_infodb_entry
+{
+  # With infodb_handle already set up, works the same as gdbm and gdbm_txtgz
+  # versions
+  &dbutil::gdbmtxtgz::delete_infodb_entry(@_);
+}
+# /** delete_infodb_entry() **/
+
+1;
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/setup.bash
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/setup.bash	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/setup.bash	(revision 24799)
@@ -0,0 +1,46 @@
+
+extdesc="TDB flavoured editing"
+
+full_setup=`pwd`/${BASH_SOURCE}
+fulldir=${full_setup%/*}
+fulldir=${fulldir%/.}
+
+if [ "x$GSDLHOME" = "x" ] ; then
+  if [ -e ../../setup.bash ] ; then
+    export gsopt_noexts=1 && pushd ../.. && source setup.bash && popd
+    export gsopt_noexts=
+  elif [ -e ../../gs3-setup.sh ] ; then
+    export gsopt_noexts=1 && pushd ../.. && source gs3-setup.sh && popd
+    export gsopt_noexts=
+  fi
+
+fi
+
+if [ "x$GEXTTDBEDIT" = "x" ] ; then
+
+  export TDBEDITOS=`uname -s | tr '[A-Z]' '[a-z]' | sed 's/\([0-9]\+\)\?_.*$//'`
+  export GEXTTDBEDIT=$fulldir
+  export GEXTTDBEDIT_INSTALLED=$GEXTTDBEDIT/$GSDLOS
+
+  export PATH=$GEXTTDBEDIT_INSTALLED/bin:$PATH
+
+  if [ "x$LD_LIBRARY_PATH" = "x" ] ; then
+    export LD_LIBRARY_PATH=$GEXTTDBEDIT_INSTALLED/lib
+  else
+    export LD_LIBRARY_PATH=$GEXTTDBEDIT_INSTALLED/lib:$LD_LIBRARY_PATH
+  fi
+
+  extdir=${GEXTTDBEDIT##*/}
+
+  if [ "x$GSDLEXTS" = "x" ] ; then
+    export GSDLEXTS=$extdir
+  else 
+    export GSDLEXTS=$GSDLEXTS:$extdir
+  fi
+
+  echo "+Your environment is now setup for $extdesc to Greenstone"
+else
+  echo "+Your environment is already setup for $extdesc to Greenstone"
+fi
+
+
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+list="TDB2TXT TDBDEL TDBGET TDBKEYS TDBSET TXT2TDB"
+
+for d in $list ; do
+  echo "    Running CASCADE-MAKE/$d.sh $*"
+
+  ./CASCADE-MAKE/$d.sh $*
+
+  if [ $? != 0 ] ; then
+    echo "  Error encountered running CASCADE-MAKE/$d.sh"
+    exit 1
+  fi
+done
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/CASCADE-MAKE/TDB2TXT.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/CASCADE-MAKE/TDB2TXT.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/CASCADE-MAKE/TDB2TXT.sh	(revision 24799)
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+package=tdb2txt
+version=-src
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTTDBEDIT ../.. $*
+
+prefix=$GEXTTDBEDIT_INSTALLED
+
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/CASCADE-MAKE/TDBDEL.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/CASCADE-MAKE/TDBDEL.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/CASCADE-MAKE/TDBDEL.sh	(revision 24799)
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+package=tdbdel
+version=-src
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTTDBEDIT ../.. $*
+
+prefix=$GEXTTDBEDIT_INSTALLED
+
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/CASCADE-MAKE/TDBGET.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/CASCADE-MAKE/TDBGET.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/CASCADE-MAKE/TDBGET.sh	(revision 24799)
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+package=tdbget
+version=-src
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTTDBEDIT ../.. $*
+
+prefix=$GEXTTDBEDIT_INSTALLED
+
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/CASCADE-MAKE/TDBKEYS.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/CASCADE-MAKE/TDBKEYS.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/CASCADE-MAKE/TDBKEYS.sh	(revision 24799)
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+package=tdbkeys
+version=-src
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTTDBEDIT ../.. $*
+
+prefix=$GEXTTDBEDIT_INSTALLED
+
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/CASCADE-MAKE/TDBSET.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/CASCADE-MAKE/TDBSET.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/CASCADE-MAKE/TDBSET.sh	(revision 24799)
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+package=tdbset
+version=-src
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTTDBEDIT ../.. $*
+
+prefix=$GEXTTDBEDIT_INSTALLED
+
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/CASCADE-MAKE/TXT2TDB.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/CASCADE-MAKE/TXT2TDB.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/CASCADE-MAKE/TXT2TDB.sh	(revision 24799)
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+package=txt2tdb
+version=-src
+
+progname=$0
+
+source ../cascade-make/lib/cascade-lib.bash GEXTTDBEDIT ../.. $*
+
+prefix=$GEXTTDBEDIT_INSTALLED
+
+opt_run_configure $force_config $auto_config $package $version $prefix
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/lib/tdbclass.cpp
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/lib/tdbclass.cpp	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/lib/tdbclass.cpp	(revision 24799)
@@ -0,0 +1,311 @@
+/**********************************************************************
+ *
+ * tdbclass.cpp --
+ *
+ * Copyright (C) 2011  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *********************************************************************/
+
+#include "tdbclass.h"
+
+#include "gsdltools.h"
+#include "gsdlunicode.h"
+#include "fileutil.h"
+#include "stdlib.h"
+#include <cstring>
+
+
+tdbclass::tdbclass(const text_t& gsdlhome)
+  : dbclass(gsdlhome)
+{
+  tdb = NULL;
+}
+
+tdbclass::~tdbclass()
+{
+  closedatabase();
+}
+
+
+// returns true if opened
+bool
+tdbclass::opendatabase (const text_t &filename, int mode, int num_retrys, bool need_filelock)
+{
+
+  if (tdb != NULL)
+  {
+    if (openfile == filename)
+    {
+      return true;
+    }
+    else
+    {
+      closedatabase();
+    }
+  }
+
+  // Map the DB mode values into TDB mode values
+  int file_mode = O_RDONLY;
+  if (mode == DB_WRITER)
+  {
+    file_mode = O_RDWR;
+  }
+  else if (mode == DB_WRITER_CREATE)
+  {
+    file_mode = O_RDWR | O_CREAT;
+  }
+
+  char *namebuffer = filename.getcstr();
+  int hash_size = 0;
+  do
+  {
+    tdb = tdb_open(namebuffer, hash_size, TDB_DEFAULT, file_mode, 0664);
+    --num_retrys;
+  } while (num_retrys > 0 && tdb==NULL);
+
+  delete []namebuffer;
+
+  if (tdb == NULL && logout != NULL)
+  {
+    outconvertclass text_t2ascii;
+    (*logout) << text_t2ascii << "database open failed on: " << filename << "\n";
+  }
+
+  openfile = filename;
+
+  return (tdb != NULL);
+}
+/** opendatabase() **/
+
+
+/**
+ */
+void
+tdbclass::closedatabase ()
+{
+  if (tdb == NULL)
+  {
+    return;
+  }
+  tdb_close (tdb);
+  tdb = NULL;
+  openfile.clear();
+}
+/** closedatabase() **/
+
+
+/**
+ */
+void
+tdbclass::deletekey (const text_t &key)
+{
+  if (tdb == NULL)
+  {
+    return;
+  }
+  // get a utf-8 encoded c string of the unicode key
+  TDB_DATA key_data;
+  key_data.dptr = (unsigned char*)(to_utf8(key)).getcstr();
+  if (key_data.dptr == NULL)
+  {
+    return;
+  }
+  key_data.dsize = strlen((const char *)key_data.dptr);
+  // delete the key
+  tdb_delete(tdb, key_data);
+  // free up the key memory
+  delete []key_data.dptr;
+}
+/** deletekey() **/
+
+// returns file extension string
+text_t
+tdbclass::getfileextension ()
+{
+  return ".tdb";
+}
+/** getfileextension() **/
+
+// returns true on success
+bool
+tdbclass::getkeydata (const text_t& key, text_t &data)
+{
+  if (tdb == NULL)
+  {
+    return false;
+  }
+
+  // get a utf-8 encoded c string of the unicode key
+  TDB_DATA key_data;
+  key_data.dptr = (unsigned char *)(to_utf8(key)).getcstr();
+  if (key_data.dptr == NULL)
+  {
+    if (logout != NULL)
+    {
+      (*logout) << "tdbclass: out of memory" << endl;
+    }
+    return false;
+  }
+  key_data.dsize = strlen((const char *)key_data.dptr);
+
+  // fetch the result
+  TDB_DATA return_data = tdb_fetch(tdb, key_data);
+  delete []key_data.dptr;
+
+  if (return_data.dptr == NULL)
+  {
+    return false;
+  }
+  data.setcarr((char *)return_data.dptr, return_data.dsize);
+  free(return_data.dptr);
+  data = to_uni(data);  // convert to unicode
+
+  return true;
+}
+/** getkeydata() **/
+
+
+// returns array of keys
+text_tarray
+tdbclass::getkeys ()
+{
+  text_tarray keys;
+
+  text_t key = getfirstkey();
+  while (!key.empty())
+  {
+    keys.push_back(key);
+    key = getnextkey(key);
+  }
+
+  return keys;
+}
+/** getkeys() **/
+
+
+// returns true on success
+bool
+tdbclass::setkeydata (const text_t &key, const text_t &data)
+{
+  if (tdb == NULL)
+  {
+    return false;
+  }
+
+  // get a utf-8 encoded c string of the unicode key
+  TDB_DATA key_data;
+  key_data.dptr = (unsigned char *)(to_utf8(key)).getcstr();
+  if (key_data.dptr == NULL)
+  {
+    if (logout != NULL)
+    {
+      (*logout) << "tdbclass: out of memory" << endl;
+    }
+    return false;
+  }
+  key_data.dsize = strlen((const char *)key_data.dptr);
+
+  TDB_DATA data_data;
+  data_data.dptr = (unsigned char *)(to_utf8(data)).getcstr();
+  if (data_data.dptr == NULL)
+  {
+    if (logout != NULL)
+    {
+      (*logout) << "tdbclass: out of memory" << endl;
+    }
+    delete []key_data.dptr;
+    return false;
+  }
+  data_data.dsize = strlen((const char *)data_data.dptr);
+
+  int ret = tdb_store (tdb, key_data, data_data, TDB_DEFAULT);
+  delete []key_data.dptr;
+  delete []data_data.dptr;
+
+  return (ret == 0);
+}
+/** setkeydata() **/
+
+// ----------------------------------------------------------------------------------------
+//   TDB-ONLY FUNCTIONS
+// ----------------------------------------------------------------------------------------
+
+// getfirstkey and getnextkey are used for traversing the database
+// no insertions or deletions should be carried out while traversing
+// the database. when there are no keys left to visit in the database
+// an empty string is returned.
+text_t
+tdbclass::getfirstkey ()
+{
+  if (tdb == NULL)
+  {
+    return g_EmptyText;
+  }
+  // get the first key
+  TDB_DATA firstkey_data = tdb_firstkey(tdb);
+  if (firstkey_data.dptr == NULL)
+  {
+    return g_EmptyText;
+  }
+  // convert it to text_t
+  text_t firstkey;
+  firstkey.setcarr((char *)firstkey_data.dptr, firstkey_data.dsize);
+  free(firstkey_data.dptr);
+
+  return to_uni(firstkey);  // convert to unicode
+}
+/** getfirstkey() **/
+
+/**
+ */
+text_t
+tdbclass::getnextkey (const text_t &key)
+{
+  if (tdb == NULL || key.empty())
+  {
+    return g_EmptyText;
+  }
+  // get a utf-8 encoded c string of the unicode key
+  TDB_DATA key_data;
+  key_data.dptr = (unsigned char *)(to_utf8(key)).getcstr();
+  if (key_data.dptr == NULL)
+  {
+    return g_EmptyText;
+  }
+  key_data.dsize = strlen((const char *)key_data.dptr);
+
+  // get the next key
+  TDB_DATA nextkey_data = tdb_nextkey(tdb, key_data);
+  if (nextkey_data.dptr == NULL)
+  {
+    delete []key_data.dptr;
+    return g_EmptyText;
+  }
+
+  // convert it to text_t
+  text_t nextkey;
+  nextkey.setcarr((char *)nextkey_data.dptr, nextkey_data.dsize);
+  free(nextkey_data.dptr);
+  delete []key_data.dptr;
+  return to_uni(nextkey);  // convert to unicode
+}
+/** getnextkey() **/
+
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/lib/tdbclass.h
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/lib/tdbclass.h	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/lib/tdbclass.h	(revision 24799)
@@ -0,0 +1,69 @@
+/**********************************************************************
+ *
+ * tdbclass.h --
+ *
+ * Copyright (C) 2011  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *********************************************************************/
+
+#ifndef TDBCLASS_H
+#define TDBCLASS_H
+
+#include "gsdlconf.h"
+#include "dbclass.h"
+#include "tdb.h"
+
+class tdbclass : public dbclass
+{
+
+public:
+  tdbclass(const text_t& gsdlhome);
+  ~tdbclass();
+
+  // returns true if opened
+  bool opendatabase (const text_t &filename, int mode, int num_retrys, bool need_filelock);
+
+  void closedatabase ();
+
+  void deletekey (const text_t &key);
+
+  // returns file extension string
+  text_t getfileextension ();
+
+  // returns true on success
+  bool getkeydata (const text_t& key, text_t &data);
+
+  // returns array of keys
+  text_tarray getkeys ();
+
+  // returns true on success
+  bool setkeydata (const text_t &key, const text_t &data);
+
+protected:
+  text_t openfile;
+  TDB_CONTEXT *tdb;
+
+  text_t getfirstkey ();
+  text_t getnextkey (const text_t &key);
+
+};
+
+#endif
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdb2txt-src/.svnignore
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdb2txt-src/.svnignore	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdb2txt-src/.svnignore	(revision 24799)
@@ -0,0 +1,6 @@
+Makefile
+config.h
+config.log
+config.status
+stamp-h1
+tdb2txt
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdb2txt-src/Makefile.in
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdb2txt-src/Makefile.in	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdb2txt-src/Makefile.in	(revision 24799)
@@ -0,0 +1,80 @@
+###########################################################################
+#
+# Makefile -- tdb_edit/tdb2txt
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999-2011  The New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+GSDL_DIR = ../../../..
+COMMON_DIR = $(GSDL_DIR)/common-src
+
+COMMON_PACKAGES_DIR = $(COMMON_DIR)/packages
+
+CXX = @CXX@
+CXXFLAGS = @CXXFLAGS@
+DEFS = @DEFS@
+INCLUDES = -I${GEXTTDBEDIT_INSTALLED}/include
+INSTALL = @INSTALL@
+LDFLAGS = @LDFLAGS@ -L${GEXTTDBEDIT_INSTALLED}/lib
+LIBS = @LIBS@ -ltdb 
+
+
+CXXCOMPILE = $(CXX) -c $(CXXFLAGS) $(DEFS) $(INCLUDES)
+CXXLINK = $(CXX) $(LDFLAGS) -o $@
+
+
+.SUFFIXES:
+.SUFFIXES: .cpp .o
+.cpp.o:
+	$(CXXCOMPILE) $< 
+
+
+SOURCES = \
+	tdb2txt.cpp
+
+OBJECTS = \
+	tdb2txt.o
+
+EXECUTABLE_OBJECTS = \
+	$(OBJECTS)
+
+EXECUTABLE = tdb2txt
+
+
+# Default target: make the executable
+all: $(EXECUTABLE)
+
+tdb2txt: $(EXECUTABLE_OBJECTS)
+	 $(CXXLINK) $(EXECUTABLE_OBJECTS) $(LIBS)
+
+install: $(EXECUTABLE)
+	$(INSTALL) -d ${GEXTTDBEDIT_INSTALLED}/bin
+	$(INSTALL) -m 755 -s $(EXECUTABLE) ${GEXTTDBEDIT_INSTALLED}/bin
+
+clean:
+	rm -f $(OBJECTS) $(EXECUTABLE)
+
+distclean:
+	rm -f $(OBJECTS) $(EXECUTABLE) Makefile
+
+depend:
+	makedepend -Y -- $(DEFS) $(INCLUDES) $(CXXFLAGS) -- $(SOURCES)
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdb2txt-src/aclocal.m4
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdb2txt-src/aclocal.m4	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdb2txt-src/aclocal.m4	(revision 24799)
@@ -0,0 +1,850 @@
+# generated automatically by aclocal 1.9.6 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005  Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# Copyright (C) 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION so it can be traced.
+# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+	 [AM_AUTOMAKE_VERSION([1.9.6])])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 7
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])
+AC_SUBST([$1_FALSE])
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 8
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
+       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
+       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                   [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 3
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[for mf in $CONFIG_FILES; do
+  # Strip MF so we end up with the name of the file.
+  mf=`echo "$mf" | sed -e 's/:.*$//'`
+  # Check whether this is an Automake generated Makefile or not.
+  # We used to match only the files named `Makefile.in', but
+  # some people rename them; so instead we look at the file content.
+  # Grep'ing the first line is not enough: some people post-process
+  # each Makefile.in and add a new line on top of each file to say so.
+  # So let's grep whole file.
+  if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+    dirpart=`AS_DIRNAME("$mf")`
+  else
+    continue
+  fi
+  # Extract the definition of DEPDIR, am__include, and am__quote
+  # from the Makefile without running `make'.
+  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+  test -z "$DEPDIR" && continue
+  am__include=`sed -n 's/^am__include = //p' < "$mf"`
+  test -z "am__include" && continue
+  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+  # When using ansi2knr, U may be empty or an underscore; expand it
+  U=`sed -n 's/^U = //p' < "$mf"`
+  # Find all dependency output files, they are included files with
+  # $(DEPDIR) in their names.  We invoke sed twice because it is the
+  # simplest approach to changing $(DEPDIR) to its actual value in the
+  # expansion.
+  for file in `sed -n "
+    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+    # Make sure the directory exists.
+    test -f "$dirpart/$file" && continue
+    fdir=`AS_DIRNAME(["$file"])`
+    AS_MKDIR_P([$dirpart/$fdir])
+    # echo "creating $dirpart/$file"
+    echo '# dummy' > "$dirpart/$file"
+  done
+done
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled.  FIXME.  This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 12
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.58])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+   test -f $srcdir/config.status; then
+  AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AM_PROG_INSTALL_SH
+AM_PROG_INSTALL_STRIP
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+              [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+	      		     [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+                  [_AM_DEPENDENCIES(CC)],
+                  [define([AC_PROG_CC],
+                          defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+                  [_AM_DEPENDENCIES(CXX)],
+                  [define([AC_PROG_CXX],
+                          defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+])
+])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $1 | $1:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Check to see how 'make' treats includes.	            -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+   am__include=include
+   am__quote=
+   _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+      am__include=.include
+      am__quote="\""
+      _am_result=BSD
+   fi
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise.
+#
+# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories
+# created by `make install' are always world readable, even if the
+# installer happens to have an overly restrictive umask (e.g. 077).
+# This was a mistake.  There are at least two reasons why we must not
+# use `-m 0755':
+#   - it causes special bits like SGID to be ignored,
+#   - it may be too restrictive (some setups expect 775 directories).
+#
+# Do not use -m 0755 and let people choose whatever they expect by
+# setting umask.
+#
+# We cannot accept any implementation of `mkdir' that recognizes `-p'.
+# Some implementations (such as Solaris 8's) are not thread-safe: if a
+# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c'
+# concurrently, both version can detect that a/ is missing, but only
+# one can create it and the other will error out.  Consequently we
+# restrict ourselves to GNU make (using the --version option ensures
+# this.)
+AC_DEFUN([AM_PROG_MKDIR_P],
+[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+  # We used to keeping the `.' as first argument, in order to
+  # allow $(mkdir_p) to be used without argument.  As in
+  #   $(mkdir_p) $(somedir)
+  # where $(somedir) is conditionally defined.  However this is wrong
+  # for two reasons:
+  #  1. if the package is installed by a user who cannot write `.'
+  #     make install will fail,
+  #  2. the above comment should most certainly read
+  #     $(mkdir_p) $(DESTDIR)$(somedir)
+  #     so it does not work when $(somedir) is undefined and
+  #     $(DESTDIR) is not.
+  #  To support the latter case, we have to write
+  #     test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+  #  so the `.' trick is pointless.
+  mkdir_p='mkdir -p --'
+else
+  # On NextStep and OpenStep, the `mkdir' command does not
+  # recognize any option.  It will interpret all options as
+  # directories to create, and then abort because `.' already
+  # exists.
+  for d in ./-p ./--version;
+  do
+    test -d $d && rmdir $d
+  done
+  # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+  if test -f "$ac_aux_dir/mkinstalldirs"; then
+    mkdir_p='$(mkinstalldirs)'
+  else
+    mkdir_p='$(install_sh) -d'
+  fi
+fi
+AC_SUBST([mkdir_p])])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+   if test "$[*]" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$[*]" != "X $srcdir/configure conftest.file" \
+      && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+     [m4_case([$1], [ustar],, [pax],,
+              [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+  case $_am_tool in
+  gnutar)
+    for _am_tar in tar gnutar gtar;
+    do
+      AM_RUN_LOG([$_am_tar --version]) && break
+    done
+    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+    am__untar="$_am_tar -xf -"
+    ;;
+  plaintar)
+    # Must skip GNU tar: if it does not support --format= it doesn't create
+    # ustar tarball either.
+    (tar --version) >/dev/null 2>&1 && continue
+    am__tar='tar chf - "$$tardir"'
+    am__tar_='tar chf - "$tardir"'
+    am__untar='tar xf -'
+    ;;
+  pax)
+    am__tar='pax -L -x $1 -w "$$tardir"'
+    am__tar_='pax -L -x $1 -w "$tardir"'
+    am__untar='pax -r'
+    ;;
+  cpio)
+    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+    am__untar='cpio -i -H $1 -d'
+    ;;
+  none)
+    am__tar=false
+    am__tar_=false
+    am__untar=false
+    ;;
+  esac
+
+  # If the value was cached, stop now.  We just wanted to have am__tar
+  # and am__untar set.
+  test -n "${am_cv_prog_tar_$1}" && break
+
+  # tar/untar a dummy directory, and stop if the command works
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  echo GrepMe > conftest.dir/file
+  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+  rm -rf conftest.dir
+  if test -s conftest.tar; then
+    AM_RUN_LOG([$am__untar <conftest.tar])
+    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+  fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdb2txt-src/config.guess
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdb2txt-src/config.guess	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdb2txt-src/config.guess	(revision 24799)
@@ -0,0 +1,1298 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+#   Free Software Foundation, Inc.
+
+timestamp='2001-07-12'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Written by Per Bothner <bothner@cygnus.com>.
+# Please send patches to <config-patches@gnu.org>.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit 0 ;;
+    --version | -v )
+       echo "$version" ; exit 0 ;;
+    --help | --h* | -h )
+       echo "$usage"; exit 0 ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+
+dummy=dummy-$$
+trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script.
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int dummy(){}" > $dummy.c ;
+	for c in cc gcc c89 ; do
+	  ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ;
+	  if test $? = 0 ; then
+	     CC_FOR_BUILD="$c"; break ;
+	  fi ;
+	done ;
+	rm -f $dummy.c $dummy.o $dummy.rel ;
+	if test x"$CC_FOR_BUILD" = x ; then
+	  CC_FOR_BUILD=no_compiler_found ;
+	fi
+	;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+	# Netbsd (nbsd) targets should (where applicable) match one or
+	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	# Determine the machine/vendor (is the vendor relevant).
+	case "${UNAME_MACHINE}" in
+	    amiga) machine=m68k-unknown ;;
+	    arm32) machine=arm-unknown ;;
+	    atari*) machine=m68k-atari ;;
+	    sun3*) machine=m68k-sun ;;
+	    mac68k) machine=m68k-apple ;;
+	    macppc) machine=powerpc-apple ;;
+	    hp3[0-9][05]) machine=m68k-hp ;;
+	    ibmrt|romp-ibm) machine=romp-ibm ;;
+	    *) machine=${UNAME_MACHINE}-unknown ;;
+	esac
+	# The Operating System including object format, if it has switched
+	# to ELF recently, or will in the future.
+	case "${UNAME_MACHINE}" in
+	    i386|sparc|amiga|arm*|hp300|mvme68k|vax|atari|luna68k|mac68k|news68k|next68k|pc532|sun3*|x68k)
+		eval $set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep __ELF__ >/dev/null
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+	        os=netbsd
+		;;
+	esac
+	# The OS release
+	release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	echo "${machine}-${os}${release}"
+	exit 0 ;;
+    alpha:OSF1:*:*)
+	if test $UNAME_RELEASE = "V4.0"; then
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+	fi
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	cat <<EOF >$dummy.s
+	.data
+\$Lformat:
+	.byte 37,100,45,37,120,10,0	# "%d-%x\n"
+
+	.text
+	.globl main
+	.align 4
+	.ent main
+main:
+	.frame \$30,16,\$26,0
+	ldgp \$29,0(\$27)
+	.prologue 1
+	.long 0x47e03d80 # implver \$0
+	lda \$2,-1
+	.long 0x47e20c21 # amask \$2,\$1
+	lda \$16,\$Lformat
+	mov \$0,\$17
+	not \$1,\$18
+	jsr \$26,printf
+	ldgp \$29,0(\$26)
+	mov 0,\$16
+	jsr \$26,exit
+	.end main
+EOF
+	eval $set_cc_for_build
+	$CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
+	if test "$?" = 0 ; then
+		case `./$dummy` in
+			0-0)
+				UNAME_MACHINE="alpha"
+				;;
+			1-0)
+				UNAME_MACHINE="alphaev5"
+				;;
+			1-1)
+				UNAME_MACHINE="alphaev56"
+				;;
+			1-101)
+				UNAME_MACHINE="alphapca56"
+				;;
+			2-303)
+				UNAME_MACHINE="alphaev6"
+				;;
+			2-307)
+				UNAME_MACHINE="alphaev67"
+				;;
+		esac
+	fi
+	rm -f $dummy.s $dummy
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	exit 0 ;;
+    Alpha\ *:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# Should we change UNAME_MACHINE based on the output of uname instead
+	# of the specific Alpha model?
+	echo alpha-pc-interix
+	exit 0 ;;
+    21064:Windows_NT:50:3)
+	echo alpha-dec-winnt3.5
+	exit 0 ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-unknown-sysv4
+	exit 0;;
+    amiga:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-amigaos
+	exit 0 ;;
+    arc64:OpenBSD:*:*)
+	echo mips64el-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    arc:OpenBSD:*:*)
+	echo mipsel-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    hkmips:OpenBSD:*:*)
+	echo mips-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    pmax:OpenBSD:*:*)
+	echo mipsel-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    sgi:OpenBSD:*:*)
+	echo mips-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    wgrisc:OpenBSD:*:*)
+	echo mipsel-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    *:OS/390:*:*)
+	echo i370-ibm-openedition
+	exit 0 ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit 0;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit 0;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit 0 ;;
+    NILE*:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit 0 ;;
+    sun4H:SunOS:5.*:*)
+	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    i86pc:SunOS:5.*:*)
+	echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    sun4*:SunOS:*:*)
+	case "`/usr/bin/arch -k`" in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+	exit 0 ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos${UNAME_RELEASE}
+	exit 0 ;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+	case "`/bin/arch`" in
+	    sun3)
+		echo m68k-sun-sunos${UNAME_RELEASE}
+		;;
+	    sun4)
+		echo sparc-sun-sunos${UNAME_RELEASE}
+		;;
+	esac
+	exit 0 ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos${UNAME_RELEASE}
+	exit 0 ;;
+    atari*:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit 0 ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+        exit 0 ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit 0 ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+        echo m68k-milan-mint${UNAME_RELEASE}
+        exit 0 ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+        echo m68k-hades-mint${UNAME_RELEASE}
+        exit 0 ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+        echo m68k-unknown-mint${UNAME_RELEASE}
+        exit 0 ;;
+    sun3*:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    mac68k:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    mvme68k:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    mvme88k:OpenBSD:*:*)
+	echo m88k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten${UNAME_RELEASE}
+	exit 0 ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit 0 ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit 0 ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit 0 ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	echo clipper-intergraph-clix${UNAME_RELEASE}
+	exit 0 ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	sed 's/^	//' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	eval $set_cc_for_build
+	$CC_FOR_BUILD $dummy.c -o $dummy \
+	  && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+	  && rm -f $dummy.c $dummy && exit 0
+	rm -f $dummy.c $dummy
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit 0 ;;
+    Motorola:PowerMAX_OS:*:*)
+	echo powerpc-motorola-powermax
+	exit 0 ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit 0 ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit 0 ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit 0 ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit 0 ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+	then
+	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+	       [ ${TARGET_BINARY_INTERFACE}x = x ]
+	    then
+		echo m88k-dg-dgux${UNAME_RELEASE}
+	    else
+		echo m88k-dg-dguxbcs${UNAME_RELEASE}
+	    fi
+	else
+	    echo i586-dg-dgux${UNAME_RELEASE}
+	fi
+ 	exit 0 ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit 0 ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit 0 ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit 0 ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit 0 ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+	exit 0 ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	echo romp-ibm-aix      # uname -m gives an 8 hex-code CPU id
+	exit 0 ;;              # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+	echo i386-ibm-aix
+	exit 0 ;;
+    ia64:AIX:*:*)
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+	exit 0 ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		sed 's/^		//' << EOF >$dummy.c
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		eval $set_cc_for_build
+		$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
+		rm -f $dummy.c $dummy
+		echo rs6000-ibm-aix3.2.5
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		echo rs6000-ibm-aix3.2.4
+	else
+		echo rs6000-ibm-aix3.2
+	fi
+	exit 0 ;;
+    *:AIX:*:[45])
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit 0 ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit 0 ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+	echo romp-ibm-bsd4.4
+	exit 0 ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+	exit 0 ;;                           # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit 0 ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit 0 ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit 0 ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit 0 ;;
+    9000/[34678]??:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+              case "${HPUX_REV}" in
+                11.[0-9][0-9])
+                  if [ -x /usr/bin/getconf ]; then
+                    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+                    case "${sc_cpu_version}" in
+                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+                      532)                      # CPU_PA_RISC2_0
+                        case "${sc_kernel_bits}" in
+                          32) HP_ARCH="hppa2.0n" ;;
+                          64) HP_ARCH="hppa2.0w" ;;
+                        esac ;;
+                    esac
+                  fi ;;
+              esac
+              if [ "${HP_ARCH}" = "" ]; then
+              sed 's/^              //' << EOF >$dummy.c
+
+              #define _HPUX_SOURCE
+              #include <stdlib.h>
+              #include <unistd.h>
+
+              int main ()
+              {
+              #if defined(_SC_KERNEL_BITS)
+                  long bits = sysconf(_SC_KERNEL_BITS);
+              #endif
+                  long cpu  = sysconf (_SC_CPU_VERSION);
+
+                  switch (cpu)
+              	{
+              	case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+              	case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+              	case CPU_PA_RISC2_0:
+              #if defined(_SC_KERNEL_BITS)
+              	    switch (bits)
+              		{
+              		case 64: puts ("hppa2.0w"); break;
+              		case 32: puts ("hppa2.0n"); break;
+              		default: puts ("hppa2.0"); break;
+              		} break;
+              #else  /* !defined(_SC_KERNEL_BITS) */
+              	    puts ("hppa2.0"); break;
+              #endif
+              	default: puts ("hppa1.0"); break;
+              	}
+                  exit (0);
+              }
+EOF
+	eval $set_cc_for_build
+	(CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy`
+	if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi
+	rm -f $dummy.c $dummy
+	fi ;;
+	esac
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit 0 ;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ia64-hp-hpux${HPUX_REV}
+	exit 0 ;;
+    3050*:HI-UX:*:*)
+	sed 's/^	//' << EOF >$dummy.c
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	eval $set_cc_for_build
+	$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
+	rm -f $dummy.c $dummy
+	echo unknown-hitachi-hiuxwe2
+	exit 0 ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit 0 ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit 0 ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+	echo hppa1.0-hp-mpeix
+	exit 0 ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit 0 ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit 0 ;;
+    i*86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo ${UNAME_MACHINE}-unknown-osf1mk
+	else
+	    echo ${UNAME_MACHINE}-unknown-osf1
+	fi
+	exit 0 ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit 0 ;;
+    hppa*:OpenBSD:*:*)
+	echo hppa-unknown-openbsd
+	exit 0 ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+        exit 0 ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+        exit 0 ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+        exit 0 ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+        exit 0 ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+        exit 0 ;;
+    CRAY*X-MP:*:*:*)
+	echo xmp-cray-unicos
+        exit 0 ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*[A-Z]90:*:*:*)
+	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+	      -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*T3D:*:*:*)
+	echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*T3E:*:*:*)
+	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*SV1:*:*:*)
+	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY-2:*:*:*)
+	echo cray2-cray-unicos
+        exit 0 ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit 0 ;;
+    hp300:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+	exit 0 ;;
+    sparc*:BSD/OS:*:*)
+	echo sparc-unknown-bsdi${UNAME_RELEASE}
+	exit 0 ;;
+    *:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit 0 ;;
+    *:FreeBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit 0 ;;
+    *:OpenBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+	exit 0 ;;
+    i*:CYGWIN*:*)
+	echo ${UNAME_MACHINE}-pc-cygwin
+	exit 0 ;;
+    i*:MINGW*:*)
+	echo ${UNAME_MACHINE}-pc-mingw32
+	exit 0 ;;
+    i*:PW*:*)
+	echo ${UNAME_MACHINE}-pc-pw32
+	exit 0 ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+	# UNAME_MACHINE based on the output of uname instead of i386?
+	echo i386-pc-interix
+	exit 0 ;;
+    i*:UWIN*:*)
+	echo ${UNAME_MACHINE}-pc-uwin
+	exit 0 ;;
+    p*:CYGWIN*:*)
+	echo powerpcle-unknown-cygwin
+	exit 0 ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    *:GNU:*:*)
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit 0 ;;
+    i*86:Minix:*:*)
+	echo ${UNAME_MACHINE}-pc-minix
+	exit 0 ;;
+    arm*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    ia64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux
+	exit 0 ;;
+    m68*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    mips:Linux:*:*)
+	case `sed -n '/^byte/s/^.*: \(.*\) endian/\1/p' < /proc/cpuinfo` in
+	  big)    echo mips-unknown-linux-gnu && exit 0 ;;
+	  little) echo mipsel-unknown-linux-gnu && exit 0 ;;
+	esac
+	;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-gnu
+	exit 0 ;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev67 ;;
+        esac
+	objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+	exit 0 ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
+	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
+	  *)    echo hppa-unknown-linux-gnu ;;
+	esac
+	exit 0 ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-gnu
+	exit 0 ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	echo ${UNAME_MACHINE}-ibm-linux
+	exit 0 ;;
+    sh*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    x86_64:Linux:*:*)
+	echo x86_64-unknown-linux-gnu
+	exit 0 ;;
+    i*86:Linux:*:*)
+	# The BFD linker knows what the default object file format is, so
+	# first see if it will tell us. cd to the root directory to prevent
+	# problems with other programs or directories called `ld' in the path.
+	ld_supported_targets=`cd /; ld --help 2>&1 \
+			 | sed -ne '/supported targets:/!d
+				    s/[ 	][ 	]*/ /g
+				    s/.*supported targets: *//
+				    s/ .*//
+				    p'`
+        case "$ld_supported_targets" in
+	  elf32-i386)
+		TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+		;;
+	  a.out-i386-linux)
+		echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+		exit 0 ;;		
+	  coff-i386)
+		echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+		exit 0 ;;
+	  "")
+		# Either a pre-BFD a.out linker (linux-gnuoldld) or
+		# one that does not give us useful --help.
+		echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+		exit 0 ;;
+	esac
+	# Determine whether the default compiler is a.out or elf
+	cat >$dummy.c <<EOF
+#include <features.h>
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+#ifdef __ELF__
+# ifdef __GLIBC__
+#  if __GLIBC__ >= 2
+    printf ("%s-pc-linux-gnu\n", argv[1]);
+#  else
+    printf ("%s-pc-linux-gnulibc1\n", argv[1]);
+#  endif
+# else
+   printf ("%s-pc-linux-gnulibc1\n", argv[1]);
+# endif
+#else
+  printf ("%s-pc-linux-gnuaout\n", argv[1]);
+#endif
+  return 0;
+}
+EOF
+	eval $set_cc_for_build
+	$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0
+	rm -f $dummy.c $dummy
+	test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
+	;;
+    i*86:DYNIX/ptx:4*:*)
+	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+	# earlier versions are messed up and put the nodename in both
+	# sysname and nodename.
+	echo i386-sequent-sysv4
+	exit 0 ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+        # Unixware is an offshoot of SVR4, but it has its own version
+        # number series starting with 2...
+        # I am not positive that other SVR4 systems won't match this,
+	# I just have to hope.  -- rms.
+        # Use sysv4.2uw... so that sysv4* matches it.
+	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+	exit 0 ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+	else
+		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+	fi
+	exit 0 ;;
+    i*86:*:5:[78]*)
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	exit 0 ;;
+    i*86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-pc-sysv32
+	fi
+	exit 0 ;;
+    i*86:*DOS:*:*)
+	echo ${UNAME_MACHINE}-pc-msdosdjgpp
+	exit 0 ;;
+    pc:*:*:*)
+	# Left here for compatibility:
+        # uname -m prints for DJGPP always 'pc', but it prints nothing about
+        # the processor, so we play safe by assuming i386.
+	echo i386-pc-msdosdjgpp
+        exit 0 ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit 0 ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit 0 ;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	fi
+	exit 0 ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit 0 ;;
+    M68*:*:R3V[567]*:*)
+	test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+    3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && echo i486-ncr-sysv4.3${OS_REL} && exit 0
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && echo i486-ncr-sysv4 && exit 0 ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+	echo m68k-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit 0 ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+	echo i386-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    rs6000:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+	echo powerpc-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv${UNAME_RELEASE}
+	exit 0 ;;
+    RM*:ReliantUNIX-*:*:*)
+	echo mips-sni-sysv4
+	exit 0 ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit 0 ;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		echo ${UNAME_MACHINE}-sni-sysv4
+	else
+		echo ns32k-sni-sysv
+	fi
+	exit 0 ;;
+    PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                           # says <Richard.M.Bartel@ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit 0 ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes@openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit 0 ;;
+    *:*:*:FTX*)
+	# From seanf@swdc.stratus.com.
+	echo i860-stratus-sysv4
+	exit 0 ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux${UNAME_RELEASE}
+	exit 0 ;;
+    news*:NEWS-OS:6*:*)
+	echo mips-sony-newsos6
+	exit 0 ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+	if [ -d /usr/nec ]; then
+	        echo mips-nec-sysv${UNAME_RELEASE}
+	else
+	        echo mips-unknown-sysv${UNAME_RELEASE}
+	fi
+        exit 0 ;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	echo powerpc-be-beos
+	exit 0 ;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	echo powerpc-apple-beos
+	exit 0 ;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	echo i586-pc-beos
+	exit 0 ;;
+    SX-4:SUPER-UX:*:*)
+	echo sx4-nec-superux${UNAME_RELEASE}
+	exit 0 ;;
+    SX-5:SUPER-UX:*:*)
+	echo sx5-nec-superux${UNAME_RELEASE}
+	exit 0 ;;
+    Power*:Rhapsody:*:*)
+	echo powerpc-apple-rhapsody${UNAME_RELEASE}
+	exit 0 ;;
+    *:Rhapsody:*:*)
+	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+	exit 0 ;;
+    *:Darwin:*:*)
+	echo `uname -p`-apple-darwin${UNAME_RELEASE}
+	exit 0 ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	if test "${UNAME_MACHINE}" = "x86pc"; then
+		UNAME_MACHINE=pc
+	fi
+	echo `uname -p`-${UNAME_MACHINE}-nto-qnx
+	exit 0 ;;
+    *:QNX:*:4*)
+	echo i386-pc-qnx
+	exit 0 ;;
+    NSR-[KW]:NONSTOP_KERNEL:*:*)
+	echo nsr-tandem-nsk${UNAME_RELEASE}
+	exit 0 ;;
+    *:NonStop-UX:*:*)
+	echo mips-compaq-nonstopux
+	exit 0 ;;
+    BS2000:POSIX*:*:*)
+	echo bs2000-siemens-sysv
+	exit 0 ;;
+    DS/*:UNIX_System_V:*:*)
+	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+	exit 0 ;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	if test "$cputype" = "386"; then
+	    UNAME_MACHINE=i386
+	else
+	    UNAME_MACHINE="$cputype"
+	fi
+	echo ${UNAME_MACHINE}-unknown-plan9
+	exit 0 ;;
+    i*86:OS/2:*:*)
+	# If we were able to find `uname', then EMX Unix compatibility
+	# is probably installed.
+	echo ${UNAME_MACHINE}-pc-os2-emx
+	exit 0 ;;
+    *:TOPS-10:*:*)
+	echo pdp10-unknown-tops10
+	exit 0 ;;
+    *:TENEX:*:*)
+	echo pdp10-unknown-tenex
+	exit 0 ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	echo pdp10-dec-tops20
+	exit 0 ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	echo pdp10-xkl-tops20
+	exit 0 ;;
+    *:TOPS-20:*:*)
+	echo pdp10-unknown-tops20
+	exit 0 ;;
+    *:ITS:*:*)
+	echo pdp10-unknown-its
+	exit 0 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+          "4"
+#else
+	  ""
+#endif
+         ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+	printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+	printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# else
+    printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+eval $set_cc_for_build
+$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0
+rm -f $dummy.c $dummy
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+	echo c1-convex-bsd
+	exit 0 ;;
+    c2*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit 0 ;;
+    c34*)
+	echo c34-convex-bsd
+	exit 0 ;;
+    c38*)
+	echo c38-convex-bsd
+	exit 0 ;;
+    c4*)
+	echo c4-convex-bsd
+	exit 0 ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+    ftp://ftp.gnu.org/pub/gnu/config/
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdb2txt-src/config.h.in
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdb2txt-src/config.h.in	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdb2txt-src/config.h.in	(revision 24799)
@@ -0,0 +1,22 @@
+/* config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Version number of package */
+#undef VERSION
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdb2txt-src/config.sub
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdb2txt-src/config.sub	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdb2txt-src/config.sub	(revision 24799)
@@ -0,0 +1,1579 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+
+timestamp='2005-07-08'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \
+  kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+	-sun*os*)
+		# Prevent following clause from handling this invalid input.
+		;;
+	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+	-apple | -axis | -knuth | -cray)
+		os=
+		basic_machine=$1
+		;;
+	-sim | -cisco | -oki | -wec | -winbond)
+		os=
+		basic_machine=$1
+		;;
+	-scout)
+		;;
+	-wrs)
+		os=-vxworks
+		basic_machine=$1
+		;;
+	-chorusos*)
+		os=-chorusos
+		basic_machine=$1
+		;;
+ 	-chorusrdb)
+ 		os=-chorusrdb
+		basic_machine=$1
+ 		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco5)
+		os=-sco3.2v5
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-udk*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-lynx*)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-windowsnt*)
+		os=`echo $os | sed -e 's/windowsnt/winnt/'`
+		;;
+	-psos*)
+		os=-psos
+		;;
+	-mint | -mint[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+	# Recognize the basic CPU types without company name.
+	# Some are omitted here because they have special meanings below.
+	1750a | 580 \
+	| a29k \
+	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+	| am33_2.0 \
+	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+	| bfin \
+	| c4x | clipper \
+	| d10v | d30v | dlx | dsp16xx \
+	| fr30 | frv \
+	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| i370 | i860 | i960 | ia64 \
+	| ip2k | iq2000 \
+	| m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \
+	| mips | mipsbe | mipseb | mipsel | mipsle \
+	| mips16 \
+	| mips64 | mips64el \
+	| mips64vr | mips64vrel \
+	| mips64orion | mips64orionel \
+	| mips64vr4100 | mips64vr4100el \
+	| mips64vr4300 | mips64vr4300el \
+	| mips64vr5000 | mips64vr5000el \
+	| mips64vr5900 | mips64vr5900el \
+	| mipsisa32 | mipsisa32el \
+	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa64 | mipsisa64el \
+	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64sb1 | mipsisa64sb1el \
+	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipstx39 | mipstx39el \
+	| mn10200 | mn10300 \
+	| ms1 \
+	| msp430 \
+	| ns16k | ns32k \
+	| or32 \
+	| pdp10 | pdp11 | pj | pjl \
+	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+	| pyramid \
+	| sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
+	| sh64 | sh64le \
+	| sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \
+	| sparcv8 | sparcv9 | sparcv9b \
+	| strongarm \
+	| tahoe | thumb | tic4x | tic80 | tron \
+	| v850 | v850e \
+	| we32k \
+	| x86 | xscale | xscalee[bl] | xstormy16 | xtensa \
+	| z8k)
+		basic_machine=$basic_machine-unknown
+		;;
+	m32c)
+		basic_machine=$basic_machine-unknown
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12)
+		# Motorola 68HC11/12.
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+		;;
+
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i*86 | x86_64)
+	  basic_machine=$basic_machine-pc
+	  ;;
+	# Object if more than one company name word.
+	*-*-*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+	# Recognize the basic CPU types with company name.
+	580-* \
+	| a29k-* \
+	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+	| avr-* \
+	| bfin-* | bs2000-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+	| clipper-* | craynv-* | cydra-* \
+	| d10v-* | d30v-* | dlx-* \
+	| elxsi-* \
+	| f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
+	| h8300-* | h8500-* \
+	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| i*86-* | i860-* | i960-* | ia64-* \
+	| ip2k-* | iq2000-* \
+	| m32r-* | m32rle-* \
+	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* \
+	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+	| mips16-* \
+	| mips64-* | mips64el-* \
+	| mips64vr-* | mips64vrel-* \
+	| mips64orion-* | mips64orionel-* \
+	| mips64vr4100-* | mips64vr4100el-* \
+	| mips64vr4300-* | mips64vr4300el-* \
+	| mips64vr5000-* | mips64vr5000el-* \
+	| mips64vr5900-* | mips64vr5900el-* \
+	| mipsisa32-* | mipsisa32el-* \
+	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa64-* | mipsisa64el-* \
+	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64sb1-* | mipsisa64sb1el-* \
+	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipstx39-* | mipstx39el-* \
+	| mmix-* \
+	| ms1-* \
+	| msp430-* \
+	| none-* | np1-* | ns16k-* | ns32k-* \
+	| orion-* \
+	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+	| pyramid-* \
+	| romp-* | rs6000-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \
+	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+	| sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \
+	| sparclite-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
+	| tahoe-* | thumb-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+	| tron-* \
+	| v850-* | v850e-* | vax-* \
+	| we32k-* \
+	| x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \
+	| xstormy16-* | xtensa-* \
+	| ymp-* \
+	| z8k-*)
+		;;
+	m32c-*)
+		;;
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	386bsd)
+		basic_machine=i386-unknown
+		os=-bsd
+		;;
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		basic_machine=m68000-att
+		;;
+	3b*)
+		basic_machine=we32k-att
+		;;
+	a29khif)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+    	abacus)
+		basic_machine=abacus-unknown
+		;;
+	adobe68k)
+		basic_machine=m68010-adobe
+		os=-scout
+		;;
+	alliant | fx80)
+		basic_machine=fx80-alliant
+		;;
+	altos | altos3068)
+		basic_machine=m68k-altos
+		;;
+	am29k)
+		basic_machine=a29k-none
+		os=-bsd
+		;;
+	amd64)
+		basic_machine=x86_64-pc
+		;;
+	amd64-*)
+		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	amdahl)
+		basic_machine=580-amdahl
+		os=-sysv
+		;;
+	amiga | amiga-*)
+		basic_machine=m68k-unknown
+		;;
+	amigaos | amigados)
+		basic_machine=m68k-unknown
+		os=-amigaos
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-unknown
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	apollo68bsd)
+		basic_machine=m68k-apollo
+		os=-bsd
+		;;
+	aux)
+		basic_machine=m68k-apple
+		os=-aux
+		;;
+	balance)
+		basic_machine=ns32k-sequent
+		os=-dynix
+		;;
+	c90)
+		basic_machine=c90-cray
+		os=-unicos
+		;;
+	convex-c1)
+		basic_machine=c1-convex
+		os=-bsd
+		;;
+	convex-c2)
+		basic_machine=c2-convex
+		os=-bsd
+		;;
+	convex-c32)
+		basic_machine=c32-convex
+		os=-bsd
+		;;
+	convex-c34)
+		basic_machine=c34-convex
+		os=-bsd
+		;;
+	convex-c38)
+		basic_machine=c38-convex
+		os=-bsd
+		;;
+	cray | j90)
+		basic_machine=j90-cray
+		os=-unicos
+		;;
+	craynv)
+		basic_machine=craynv-cray
+		os=-unicosmp
+		;;
+	cr16c)
+		basic_machine=cr16c-unknown
+		os=-elf
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	crisv32 | crisv32-* | etraxfs*)
+		basic_machine=crisv32-axis
+		;;
+	cris | cris-* | etrax*)
+		basic_machine=cris-axis
+		;;
+	crx)
+		basic_machine=crx-unknown
+		os=-elf
+		;;
+	da30 | da30-*)
+		basic_machine=m68k-da30
+		;;
+	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+		basic_machine=mips-dec
+		;;
+	decsystem10* | dec10*)
+		basic_machine=pdp10-dec
+		os=-tops10
+		;;
+	decsystem20* | dec20*)
+		basic_machine=pdp10-dec
+		os=-tops20
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		basic_machine=m68k-motorola
+		;;
+	delta88)
+		basic_machine=m88k-motorola
+		os=-sysv3
+		;;
+	djgpp)
+		basic_machine=i586-pc
+		os=-msdosdjgpp
+		;;
+	dpx20 | dpx20-*)
+		basic_machine=rs6000-bull
+		os=-bosx
+		;;
+	dpx2* | dpx2*-bull)
+		basic_machine=m68k-bull
+		os=-sysv3
+		;;
+	ebmon29k)
+		basic_machine=a29k-amd
+		os=-ebmon
+		;;
+	elxsi)
+		basic_machine=elxsi-elxsi
+		os=-bsd
+		;;
+	encore | umax | mmax)
+		basic_machine=ns32k-encore
+		;;
+	es1800 | OSE68k | ose68k | ose | OSE)
+		basic_machine=m68k-ericsson
+		os=-ose
+		;;
+	fx2800)
+		basic_machine=i860-alliant
+		;;
+	genix)
+		basic_machine=ns32k-ns
+		;;
+	gmicro)
+		basic_machine=tron-gmicro
+		os=-sysv
+		;;
+	go32)
+		basic_machine=i386-pc
+		os=-go32
+		;;
+	h3050r* | hiux*)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	h8300hms)
+		basic_machine=h8300-hitachi
+		os=-hms
+		;;
+	h8300xray)
+		basic_machine=h8300-hitachi
+		os=-xray
+		;;
+	h8500hms)
+		basic_machine=h8500-hitachi
+		os=-hms
+		;;
+	harris)
+		basic_machine=m88k-harris
+		os=-sysv3
+		;;
+	hp300-*)
+		basic_machine=m68k-hp
+		;;
+	hp300bsd)
+		basic_machine=m68k-hp
+		os=-bsd
+		;;
+	hp300hpux)
+		basic_machine=m68k-hp
+		os=-hpux
+		;;
+	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		basic_machine=m68000-hp
+		;;
+	hp9k3[2-9][0-9])
+		basic_machine=m68k-hp
+		;;
+	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k78[0-9] | hp78[0-9])
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][13679] | hp8[0-9][13679])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hppa-next)
+		os=-nextstep3
+		;;
+	hppaosf)
+		basic_machine=hppa1.1-hp
+		os=-osf
+		;;
+	hppro)
+		basic_machine=hppa1.1-hp
+		os=-proelf
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+	i*86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv32
+		;;
+	i*86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv4
+		;;
+	i*86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv
+		;;
+	i*86sol2)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-solaris2
+		;;
+	i386mach)
+		basic_machine=i386-mach
+		os=-mach
+		;;
+	i386-vsta | vsta)
+		basic_machine=i386-unknown
+		os=-vsta
+		;;
+	iris | iris4d)
+		basic_machine=mips-sgi
+		case $os in
+		    -irix*)
+			;;
+		    *)
+			os=-irix4
+			;;
+		esac
+		;;
+	isi68 | isi)
+		basic_machine=m68k-isi
+		os=-sysv
+		;;
+	m88k-omron*)
+		basic_machine=m88k-omron
+		;;
+	magnum | m3230)
+		basic_machine=mips-mips
+		os=-sysv
+		;;
+	merlin)
+		basic_machine=ns32k-utek
+		os=-sysv
+		;;
+	mingw32)
+		basic_machine=i386-pc
+		os=-mingw32
+		;;
+	miniframe)
+		basic_machine=m68000-convergent
+		;;
+	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+	mips3*-*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	monitor)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	morphos)
+		basic_machine=powerpc-unknown
+		os=-morphos
+		;;
+	msdos)
+		basic_machine=i386-pc
+		os=-msdos
+		;;
+	mvs)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	netbsd386)
+		basic_machine=i386-unknown
+		os=-netbsd
+		;;
+	netwinder)
+		basic_machine=armv4l-rebel
+		os=-linux
+		;;
+	news | news700 | news800 | news900)
+		basic_machine=m68k-sony
+		os=-newsos
+		;;
+	news1000)
+		basic_machine=m68030-sony
+		os=-newsos
+		;;
+	news-3600 | risc-news)
+		basic_machine=mips-sony
+		os=-newsos
+		;;
+	necv70)
+		basic_machine=v70-nec
+		os=-sysv
+		;;
+	next | m*-next )
+		basic_machine=m68k-next
+		case $os in
+		    -nextstep* )
+			;;
+		    -ns2*)
+		      os=-nextstep2
+			;;
+		    *)
+		      os=-nextstep3
+			;;
+		esac
+		;;
+	nh3000)
+		basic_machine=m68k-harris
+		os=-cxux
+		;;
+	nh[45]000)
+		basic_machine=m88k-harris
+		os=-cxux
+		;;
+	nindy960)
+		basic_machine=i960-intel
+		os=-nindy
+		;;
+	mon960)
+		basic_machine=i960-intel
+		os=-mon960
+		;;
+	nonstopux)
+		basic_machine=mips-compaq
+		os=-nonstopux
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	nsr-tandem)
+		basic_machine=nsr-tandem
+		;;
+	op50n-* | op60c-*)
+		basic_machine=hppa1.1-oki
+		os=-proelf
+		;;
+	openrisc | openrisc-*)
+		basic_machine=or32-unknown
+		;;
+	os400)
+		basic_machine=powerpc-ibm
+		os=-os400
+		;;
+	OSE68000 | ose68000)
+		basic_machine=m68000-ericsson
+		os=-ose
+		;;
+	os68k)
+		basic_machine=m68k-none
+		os=-os68k
+		;;
+	pa-hitachi)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	paragon)
+		basic_machine=i860-intel
+		os=-osf
+		;;
+	pbd)
+		basic_machine=sparc-tti
+		;;
+	pbb)
+		basic_machine=m68k-tti
+		;;
+	pc532 | pc532-*)
+		basic_machine=ns32k-pc532
+		;;
+	pentium | p5 | k5 | k6 | nexgen | viac3)
+		basic_machine=i586-pc
+		;;
+	pentiumpro | p6 | 6x86 | athlon | athlon_*)
+		basic_machine=i686-pc
+		;;
+	pentiumii | pentium2 | pentiumiii | pentium3)
+		basic_machine=i686-pc
+		;;
+	pentium4)
+		basic_machine=i786-pc
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium4-*)
+		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=power-ibm
+		;;
+	ppc)	basic_machine=powerpc-unknown
+		;;
+	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppcle | powerpclittle | ppc-le | powerpc-little)
+		basic_machine=powerpcle-unknown
+		;;
+	ppcle-* | powerpclittle-*)
+		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64)	basic_machine=powerpc64-unknown
+		;;
+	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+		basic_machine=powerpc64le-unknown
+		;;
+	ppc64le-* | powerpc64little-*)
+		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	pw32)
+		basic_machine=i586-unknown
+		os=-pw32
+		;;
+	rom68k)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	rm[46]00)
+		basic_machine=mips-siemens
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	s390 | s390-*)
+		basic_machine=s390-ibm
+		;;
+	s390x | s390x-*)
+		basic_machine=s390x-ibm
+		;;
+	sa29200)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	sb1)
+		basic_machine=mipsisa64sb1-unknown
+		;;
+	sb1el)
+		basic_machine=mipsisa64sb1el-unknown
+		;;
+	sei)
+		basic_machine=mips-sei
+		os=-seiux
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sh64)
+		basic_machine=sh64-unknown
+		;;
+	sparclite-wrs | simso-wrs)
+		basic_machine=sparclite-wrs
+		os=-vxworks
+		;;
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
+		;;
+	spur)
+		basic_machine=spur-unknown
+		;;
+	st2000)
+		basic_machine=m68k-tandem
+		;;
+	stratus)
+		basic_machine=i860-stratus
+		os=-sysv4
+		;;
+	sun2)
+		basic_machine=m68000-sun
+		;;
+	sun2os3)
+		basic_machine=m68000-sun
+		os=-sunos3
+		;;
+	sun2os4)
+		basic_machine=m68000-sun
+		os=-sunos4
+		;;
+	sun3os3)
+		basic_machine=m68k-sun
+		os=-sunos3
+		;;
+	sun3os4)
+		basic_machine=m68k-sun
+		os=-sunos4
+		;;
+	sun4os3)
+		basic_machine=sparc-sun
+		os=-sunos3
+		;;
+	sun4os4)
+		basic_machine=sparc-sun
+		os=-sunos4
+		;;
+	sun4sol2)
+		basic_machine=sparc-sun
+		os=-solaris2
+		;;
+	sun3 | sun3-*)
+		basic_machine=m68k-sun
+		;;
+	sun4)
+		basic_machine=sparc-sun
+		;;
+	sun386 | sun386i | roadrunner)
+		basic_machine=i386-sun
+		;;
+	sv1)
+		basic_machine=sv1-cray
+		os=-unicos
+		;;
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
+		;;
+	t3e)
+		basic_machine=alphaev5-cray
+		os=-unicos
+		;;
+	t90)
+		basic_machine=t90-cray
+		os=-unicos
+		;;
+	tic54x | c54x*)
+		basic_machine=tic54x-unknown
+		os=-coff
+		;;
+	tic55x | c55x*)
+		basic_machine=tic55x-unknown
+		os=-coff
+		;;
+	tic6x | c6x*)
+		basic_machine=tic6x-unknown
+		os=-coff
+		;;
+	tx39)
+		basic_machine=mipstx39-unknown
+		;;
+	tx39el)
+		basic_machine=mipstx39el-unknown
+		;;
+	toad1)
+		basic_machine=pdp10-xkl
+		os=-tops20
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	tpf)
+		basic_machine=s390x-ibm
+		os=-tpf
+		;;
+	udi29k)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
+		;;
+	v810 | necv810)
+		basic_machine=v810-nec
+		os=-none
+		;;
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
+		;;
+	vms)
+		basic_machine=vax-dec
+		os=-vms
+		;;
+	vpp*|vx|vx-*)
+		basic_machine=f301-fujitsu
+		;;
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
+		;;
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
+		;;
+	vxworks29k)
+		basic_machine=a29k-wrs
+		os=-vxworks
+		;;
+	w65*)
+		basic_machine=w65-wdc
+		os=-none
+		;;
+	w89k-*)
+		basic_machine=hppa1.1-winbond
+		os=-proelf
+		;;
+	xbox)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	z8k-*-coff)
+		basic_machine=z8k-unknown
+		os=-sim
+		;;
+	none)
+		basic_machine=none-none
+		os=-none
+		;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		basic_machine=hppa1.1-winbond
+		;;
+	op50n)
+		basic_machine=hppa1.1-oki
+		;;
+	op60c)
+		basic_machine=hppa1.1-oki
+		;;
+	romp)
+		basic_machine=romp-ibm
+		;;
+	mmix)
+		basic_machine=mmix-knuth
+		;;
+	rs6000)
+		basic_machine=rs6000-ibm
+		;;
+	vax)
+		basic_machine=vax-dec
+		;;
+	pdp10)
+		# there are many clones, so DEC is not a safe bet
+		basic_machine=pdp10-unknown
+		;;
+	pdp11)
+		basic_machine=pdp11-dec
+		;;
+	we32k)
+		basic_machine=we32k-att
+		;;
+	sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
+		basic_machine=sh-unknown
+		;;
+	sparc | sparcv8 | sparcv9 | sparcv9b)
+		basic_machine=sparc-sun
+		;;
+	cydra)
+		basic_machine=cydra-cydrome
+		;;
+	orion)
+		basic_machine=orion-highlevel
+		;;
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	mac | mpw | mac-mpw)
+		basic_machine=m68k-apple
+		;;
+	pmac | pmac-mpw)
+		basic_machine=powerpc-apple
+		;;
+	*-unknown)
+		# Make sure to match an already-canonicalized machine name.
+		;;
+	*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+	*-digital*)
+		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+		;;
+	*-commodore*)
+		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+        # First match some system type aliases
+        # that might get confused with valid system types.
+	# -solaris* is a basic system type, with this one exception.
+	-solaris1 | -solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	-solaris)
+		os=-solaris2
+		;;
+	-svr4*)
+		os=-sysv4
+		;;
+	-unixware*)
+		os=-sysv4.2uw
+		;;
+	-gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+		;;
+	# First accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST END IN A *, to match a version number.
+	# -sysv* is not here because it comes later, after sysvr4.
+	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+	      | -aos* \
+	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \
+	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+	      | -chorusos* | -chorusrdb* \
+	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+	      | -skyos* | -haiku*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	-qnx*)
+		case $basic_machine in
+		    x86-* | i*86-*)
+			;;
+		    *)
+			os=-nto$os
+			;;
+		esac
+		;;
+	-nto-qnx*)
+		;;
+	-nto*)
+		os=`echo $os | sed -e 's|nto|nto-qnx|'`
+		;;
+	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+		;;
+	-mac*)
+		os=`echo $os | sed -e 's|mac|macos|'`
+		;;
+	-linux-dietlibc)
+		os=-linux-dietlibc
+		;;
+	-linux*)
+		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+		;;
+	-sunos5*)
+		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+		;;
+	-sunos6*)
+		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+		;;
+	-opened*)
+		os=-openedition
+		;;
+        -os400*)
+		os=-os400
+		;;
+	-wince*)
+		os=-wince
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-atheos*)
+		os=-atheos
+		;;
+	-syllable*)
+		os=-syllable
+		;;
+	-386bsd)
+		os=-bsd
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	-nova*)
+		os=-rtmk-nova
+		;;
+	-ns2 )
+		os=-nextstep2
+		;;
+	-nsk*)
+		os=-nsk
+		;;
+	# Preserve the version number of sinix5.
+	-sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	-sinix*)
+		os=-sysv4
+		;;
+        -tpf*)
+		os=-tpf
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-svr4)
+		os=-sysv4
+		;;
+	-svr3)
+		os=-sysv3
+		;;
+	-sysvr4)
+		os=-sysv4
+		;;
+	# This must come after -sysvr4.
+	-sysv*)
+		;;
+	-ose*)
+		os=-ose
+		;;
+	-es1800*)
+		os=-ose
+		;;
+	-xenix)
+		os=-xenix
+		;;
+	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+		os=-mint
+		;;
+	-aros*)
+		os=-aros
+		;;
+	-kaos*)
+		os=-kaos
+		;;
+	-zvmoe)
+		os=-zvmoe
+		;;
+	-none)
+		;;
+	*)
+		# Get rid of the `-' at the beginning of $os.
+		os=`echo $os | sed 's/[^-]*-//'`
+		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+		exit 1
+		;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+	*-acorn)
+		os=-riscix1.2
+		;;
+	arm*-rebel)
+		os=-linux
+		;;
+	arm*-semi)
+		os=-aout
+		;;
+    c4x-* | tic4x-*)
+        os=-coff
+        ;;
+	# This must come before the *-dec entry.
+	pdp10-*)
+		os=-tops20
+		;;
+	pdp11-*)
+		os=-none
+		;;
+	*-dec | vax-*)
+		os=-ultrix4.2
+		;;
+	m68*-apollo)
+		os=-domain
+		;;
+	i386-sun)
+		os=-sunos4.0.2
+		;;
+	m68000-sun)
+		os=-sunos3
+		# This also exists in the configure program, but was not the
+		# default.
+		# os=-sunos4
+		;;
+	m68*-cisco)
+		os=-aout
+		;;
+	mips*-cisco)
+		os=-elf
+		;;
+	mips*-*)
+		os=-elf
+		;;
+	or32-*)
+		os=-coff
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	*-be)
+		os=-beos
+		;;
+	*-haiku)
+		os=-haiku
+		;;
+	*-ibm)
+		os=-aix
+		;;
+    	*-knuth)
+		os=-mmixware
+		;;
+	*-wec)
+		os=-proelf
+		;;
+	*-winbond)
+		os=-proelf
+		;;
+	*-oki)
+		os=-proelf
+		;;
+	*-hp)
+		os=-hpux
+		;;
+	*-hitachi)
+		os=-hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=-sysv
+		;;
+	*-cbm)
+		os=-amigaos
+		;;
+	*-dg)
+		os=-dgux
+		;;
+	*-dolphin)
+		os=-sysv3
+		;;
+	m68k-ccur)
+		os=-rtu
+		;;
+	m88k-omron*)
+		os=-luna
+		;;
+	*-next )
+		os=-nextstep
+		;;
+	*-sequent)
+		os=-ptx
+		;;
+	*-crds)
+		os=-unos
+		;;
+	*-ns)
+		os=-genix
+		;;
+	i370-*)
+		os=-mvs
+		;;
+	*-next)
+		os=-nextstep3
+		;;
+	*-gould)
+		os=-sysv
+		;;
+	*-highlevel)
+		os=-bsd
+		;;
+	*-encore)
+		os=-bsd
+		;;
+	*-sgi)
+		os=-irix
+		;;
+	*-siemens)
+		os=-sysv4
+		;;
+	*-masscomp)
+		os=-rtu
+		;;
+	f30[01]-fujitsu | f700-fujitsu)
+		os=-uxpv
+		;;
+	*-rom68k)
+		os=-coff
+		;;
+	*-*bug)
+		os=-coff
+		;;
+	*-apple)
+		os=-macos
+		;;
+	*-atari*)
+		os=-mint
+		;;
+	*)
+		os=-none
+		;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+	*-unknown)
+		case $os in
+			-riscix*)
+				vendor=acorn
+				;;
+			-sunos*)
+				vendor=sun
+				;;
+			-aix*)
+				vendor=ibm
+				;;
+			-beos*)
+				vendor=be
+				;;
+			-hpux*)
+				vendor=hp
+				;;
+			-mpeix*)
+				vendor=hp
+				;;
+			-hiux*)
+				vendor=hitachi
+				;;
+			-unos*)
+				vendor=crds
+				;;
+			-dgux*)
+				vendor=dg
+				;;
+			-luna*)
+				vendor=omron
+				;;
+			-genix*)
+				vendor=ns
+				;;
+			-mvs* | -opened*)
+				vendor=ibm
+				;;
+			-os400*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+			-tpf*)
+				vendor=ibm
+				;;
+			-vxsim* | -vxworks* | -windiss*)
+				vendor=wrs
+				;;
+			-aux*)
+				vendor=apple
+				;;
+			-hms*)
+				vendor=hitachi
+				;;
+			-mpw* | -macos*)
+				vendor=apple
+				;;
+			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+				vendor=atari
+				;;
+			-vos*)
+				vendor=stratus
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdb2txt-src/configure
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdb2txt-src/configure	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdb2txt-src/configure	(revision 24799)
@@ -0,0 +1,5003 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.59 for tdb2txt 1.0.
+#
+# Report bugs to <jmt12@cs.waikato.ac.nz>.
+#
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)$' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\/\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  case $0 in
+    *[\\/]* ) as_myself=$0 ;;
+    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+       ;;
+  esac
+  # We did not find ourselves, most probably we were run as `sh COMMAND'
+  # in which case we are not to be found in the path.
+  if test "x$as_myself" = x; then
+    as_myself=$0
+  fi
+  if test ! -f "$as_myself"; then
+    { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+	 case $as_dir in
+	 /*)
+	   if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+	     CONFIG_SHELL=$as_dir/$as_base
+	     export CONFIG_SHELL
+	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+	   fi;;
+	 esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='	' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" 	$as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_config_libobj_dir=.
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete.  It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: ${ac_max_here_lines=38}
+
+# Identity of this package.
+PACKAGE_NAME='tdb2txt'
+PACKAGE_TARNAME='tdb2txt'
+PACKAGE_VERSION='1.0'
+PACKAGE_STRING='tdb2txt 1.0'
+PACKAGE_BUGREPORT='jmt12@cs.waikato.ac.nz'
+
+ac_unique_file="tdb2txt.cpp"
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar build build_cpu build_vendor build_os host host_cpu host_vendor host_os CXX CXXFLAGS LDFLAGS CPPFLAGS ac_ct_CXX EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CC CFLAGS ac_ct_CC CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CPP LIBOBJS LTLIBOBJS'
+ac_subst_files=''
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+ac_prev=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval "$ac_prev=\$ac_option"
+    ac_prev=
+    continue
+  fi
+
+  ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_option in
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+  | --da=*)
+    datadir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    eval "enable_$ac_feature=no" ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    case $ac_option in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "enable_$ac_feature='$ac_optarg'" ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst \
+  | --locals | --local | --loca | --loc | --lo)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    case $ac_option in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "with_$ac_package='$ac_optarg'" ;;
+
+  -without-* | --without-*)
+    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/-/_/g'`
+    eval "with_$ac_package=no" ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+    eval "$ac_envvar='$ac_optarg'"
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  { echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+  eval ac_val=$`echo $ac_var`
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
+	      localstatedir libdir includedir oldincludedir infodir mandir
+do
+  eval ac_val=$`echo $ac_var`
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* ) ;;
+    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then its parent.
+  ac_confdir=`(dirname "$0") 2>/dev/null ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$0" : 'X\(//\)[^/]' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$0" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r $srcdir/$ac_unique_file; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+  if test "$ac_srcdir_defaulted" = yes; then
+    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+   { (exit 1); exit 1; }; }
+  else
+    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+   { (exit 1); exit 1; }; }
+  fi
+fi
+(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
+  { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
+   { (exit 1); exit 1; }; }
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_CXX_set=${CXX+set}
+ac_env_CXX_value=$CXX
+ac_cv_env_CXX_set=${CXX+set}
+ac_cv_env_CXX_value=$CXX
+ac_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_env_CXXFLAGS_value=$CXXFLAGS
+ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_cv_env_CXXFLAGS_value=$CXXFLAGS
+ac_env_LDFLAGS_set=${LDFLAGS+set}
+ac_env_LDFLAGS_value=$LDFLAGS
+ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
+ac_cv_env_LDFLAGS_value=$LDFLAGS
+ac_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_env_CPPFLAGS_value=$CPPFLAGS
+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_cv_env_CPPFLAGS_value=$CPPFLAGS
+ac_env_CC_set=${CC+set}
+ac_env_CC_value=$CC
+ac_cv_env_CC_set=${CC+set}
+ac_cv_env_CC_value=$CC
+ac_env_CFLAGS_set=${CFLAGS+set}
+ac_env_CFLAGS_value=$CFLAGS
+ac_cv_env_CFLAGS_set=${CFLAGS+set}
+ac_cv_env_CFLAGS_value=$CFLAGS
+ac_env_CPP_set=${CPP+set}
+ac_env_CPP_value=$CPP
+ac_cv_env_CPP_set=${CPP+set}
+ac_cv_env_CPP_value=$CPP
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures tdb2txt 1.0 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+_ACEOF
+
+  cat <<_ACEOF
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+			  [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+			  [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR           user executables [EPREFIX/bin]
+  --sbindir=DIR          system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR       program executables [EPREFIX/libexec]
+  --datadir=DIR          read-only architecture-independent data [PREFIX/share]
+  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
+  --libdir=DIR           object code libraries [EPREFIX/lib]
+  --includedir=DIR       C header files [PREFIX/include]
+  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
+  --infodir=DIR          info documentation [PREFIX/info]
+  --mandir=DIR           man documentation [PREFIX/man]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of tdb2txt 1.0:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors
+
+Some influential environment variables:
+  CXX         C++ compiler command
+  CXXFLAGS    C++ compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have
+              headers in a nonstandard directory <include dir>
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  CPP         C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <jmt12@cs.waikato.ac.nz>.
+_ACEOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  ac_popdir=`pwd`
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d $ac_dir || continue
+    ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
+
+    cd $ac_dir
+    # Check for guested configure; otherwise get Cygnus style configure.
+    if test -f $ac_srcdir/configure.gnu; then
+      echo
+      $SHELL $ac_srcdir/configure.gnu  --help=recursive
+    elif test -f $ac_srcdir/configure; then
+      echo
+      $SHELL $ac_srcdir/configure  --help=recursive
+    elif test -f $ac_srcdir/configure.ac ||
+	   test -f $ac_srcdir/configure.in; then
+      echo
+      $ac_configure --help
+    else
+      echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi
+    cd $ac_popdir
+  done
+fi
+
+test -n "$ac_init_help" && exit 0
+if $ac_init_version; then
+  cat <<\_ACEOF
+tdb2txt configure 1.0
+generated by GNU Autoconf 2.59
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit 0
+fi
+exec 5>config.log
+cat >&5 <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by tdb2txt $as_me 1.0, which was
+generated by GNU Autoconf 2.59.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo               = `(hostinfo) 2>/dev/null               || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  echo "PATH: $as_dir"
+done
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_sep=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+      ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+    2)
+      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+	ac_must_keep_next=false # Got value, back to normal.
+      else
+	case $ac_arg in
+	  *=* | --config-cache | -C | -disable-* | --disable-* \
+	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+	  | -with-* | --with-* | -without-* | --without-* | --x)
+	    case "$ac_configure_args0 " in
+	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+	    esac
+	    ;;
+	  -* ) ac_must_keep_next=true ;;
+	esac
+      fi
+      ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+      # Get rid of the leading space.
+      ac_sep=" "
+      ;;
+    esac
+  done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Be sure not to use single quotes in there, as some shells,
+# such as our DU 5.0 friend, will then `close' the trap.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+{
+  (set) 2>&1 |
+    case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      sed -n \
+	"s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+      ;;
+    *)
+      sed -n \
+	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+}
+    echo
+
+    cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=$`echo $ac_var`
+      echo "$ac_var='"'"'$ac_val'"'"'"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      cat <<\_ASBOX
+## ------------- ##
+## Output files. ##
+## ------------- ##
+_ASBOX
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=$`echo $ac_var`
+	echo "$ac_var='"'"'$ac_val'"'"'"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+      echo
+      sed "/^$/d" confdefs.h | sort
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      echo "$as_me: caught signal $ac_signal"
+    echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core &&
+  rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+     ' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+  if test "x$prefix" != xNONE; then
+    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+  else
+    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+  fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+  if test -r "$ac_site_file"; then
+    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . $cache_file;;
+      *)                      . ./$cache_file;;
+    esac
+  fi
+else
+  { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+	       sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+  eval ac_new_val="\$ac_env_${ac_var}_value"
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+	{ echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	{ echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
+echo "$as_me:   former value:  $ac_old_val" >&2;}
+	{ echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
+echo "$as_me:   current value: $ac_new_val" >&2;}
+	ac_cache_corrupted=:
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+      ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+am__api_version="1.9"
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+  if test -f $ac_dir/install-sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f $ac_dir/install.sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f $ac_dir/shtool; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
+echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"
+ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+  ./ | .// | /cC/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+	if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	    break 3
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+done
+
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  We don't cache a
+    # path for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the path is relative.
+    INSTALL=$ac_install_sh
+  fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$*" != "X $srcdir/configure conftest.file" \
+      && test "$*" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      { { echo "$as_me:$LINENO: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" >&5
+echo "$as_me: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" >&2;}
+   { (exit 1); exit 1; }; }
+   fi
+
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   { { echo "$as_me:$LINENO: error: newly created file is older than distributed files!
+Check your system clock" >&5
+echo "$as_me: error: newly created file is older than distributed files!
+Check your system clock" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+test "$program_prefix" != NONE &&
+  program_transform_name="s,^,$program_prefix,;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s,\$,$program_suffix,;$program_transform_name"
+# Double any \ or $.  echo might interpret backslashes.
+# By default was `s,x,x', remove it if useless.
+cat <<\_ACEOF >conftest.sed
+s/[\\$]/&&/g;s/;s,x,x,$//
+_ACEOF
+program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
+rm conftest.sed
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+  # We used to keeping the `.' as first argument, in order to
+  # allow $(mkdir_p) to be used without argument.  As in
+  #   $(mkdir_p) $(somedir)
+  # where $(somedir) is conditionally defined.  However this is wrong
+  # for two reasons:
+  #  1. if the package is installed by a user who cannot write `.'
+  #     make install will fail,
+  #  2. the above comment should most certainly read
+  #     $(mkdir_p) $(DESTDIR)$(somedir)
+  #     so it does not work when $(somedir) is undefined and
+  #     $(DESTDIR) is not.
+  #  To support the latter case, we have to write
+  #     test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+  #  so the `.' trick is pointless.
+  mkdir_p='mkdir -p --'
+else
+  # On NextStep and OpenStep, the `mkdir' command does not
+  # recognize any option.  It will interpret all options as
+  # directories to create, and then abort because `.' already
+  # exists.
+  for d in ./-p ./--version;
+  do
+    test -d $d && rmdir $d
+  done
+  # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+  if test -f "$ac_aux_dir/mkinstalldirs"; then
+    mkdir_p='$(mkinstalldirs)'
+  else
+    mkdir_p='$(install_sh) -d'
+  fi
+fi
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AWK+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AWK="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  echo "$as_me:$LINENO: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$AWK" && break
+done
+
+echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.make <<\_ACEOF
+all:
+	@echo 'ac_maketemp="$(MAKE)"'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+  eval ac_cv_prog_make_${ac_make}_set=yes
+else
+  eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftest.make
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+  SET_MAKE=
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+   test -f $srcdir/config.status; then
+  { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
+echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='tdb2txt'
+ VERSION='1.0'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_STRIP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  STRIP=$ac_ct_STRIP
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+# Make sure we can run config.sub.
+$ac_config_sub sun4 >/dev/null 2>&1 ||
+  { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5
+echo "$as_me: error: cannot run $ac_config_sub" >&2;}
+   { (exit 1); exit 1; }; }
+
+echo "$as_me:$LINENO: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6
+if test "${ac_cv_build+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_build_alias=$build_alias
+test -z "$ac_cv_build_alias" &&
+  ac_cv_build_alias=`$ac_config_guess`
+test -z "$ac_cv_build_alias" &&
+  { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
+echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+   { (exit 1); exit 1; }; }
+ac_cv_build=`$ac_config_sub $ac_cv_build_alias` ||
+  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6
+build=$ac_cv_build
+build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+echo "$as_me:$LINENO: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6
+if test "${ac_cv_host+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_host_alias=$host_alias
+test -z "$ac_cv_host_alias" &&
+  ac_cv_host_alias=$ac_cv_build_alias
+ac_cv_host=`$ac_config_sub $ac_cv_host_alias` ||
+  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6
+host=$ac_cv_host
+host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+
+          ac_config_headers="$ac_config_headers config.h"
+
+
+# Checks for programs.
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  echo "$as_me:$LINENO: result: $CXX" >&5
+echo "${ECHO_T}$CXX" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$CXX" && break
+  done
+fi
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CXX="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5
+echo "${ECHO_T}$ac_ct_CXX" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_CXX" && break
+done
+test -n "$ac_ct_CXX" || ac_ct_CXX="g++"
+
+  CXX=$ac_ct_CXX
+fi
+
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+     "checking for C++ compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+  (eval $ac_compiler --version </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+  (eval $ac_compiler -v </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+  (eval $ac_compiler -V </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+echo "$as_me:$LINENO: checking for C++ compiler default output file name" >&5
+echo $ECHO_N "checking for C++ compiler default output file name... $ECHO_C" >&6
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
+  (eval $ac_link_default) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # Find the output, starting from the most likely.  This scheme is
+# not robust to junk in `.', hence go to wildcards (a.*) only as a last
+# resort.
+
+# Be careful to initialize this variable, since it used to be cached.
+# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
+ac_cv_exeext=
+# b.out is created by i960 compilers.
+for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
+	;;
+    conftest.$ac_ext )
+	# This is the source file.
+	;;
+    [ab].out )
+	# We found the default executable, but exeext='' is most
+	# certainly right.
+	break;;
+    *.* )
+	ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	# FIXME: I believe we export ac_cv_exeext for Libtool,
+	# but it would be cool to find out if it's true.  Does anybody
+	# maintain Libtool? --akim.
+	export ac_cv_exeext
+	break;;
+    * )
+	break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C++ compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C++ compiler cannot create executables
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6
+
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether the C++ compiler works" >&5
+echo $ECHO_N "checking whether the C++ compiler works... $ECHO_C" >&6
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+  if { ac_try='./$ac_file'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { echo "$as_me:$LINENO: error: cannot run C++ compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C++ compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+  fi
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6
+
+echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	  export ac_cv_exeext
+	  break;;
+    * ) break;;
+  esac
+done
+else
+  { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
+if test "${ac_cv_objext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6
+if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6
+GXX=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+CXXFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5
+echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cxx_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cxx_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cxx_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
+  else
+    CXXFLAGS="-g"
+  fi
+else
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
+  else
+    CXXFLAGS=
+  fi
+fi
+for ac_declaration in \
+   '' \
+   'extern "C" void std::exit (int) throw (); using std::exit;' \
+   'extern "C" void std::exit (int); using std::exit;' \
+   'extern "C" void exit (int) throw ();' \
+   'extern "C" void exit (int);' \
+   'void exit (int);'
+do
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+  echo '#ifdef __cplusplus' >>confdefs.h
+  echo $ac_declaration      >>confdefs.h
+  echo '#endif'             >>confdefs.h
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+DEPDIR="${am__leading_dot}deps"
+
+          ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
+echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+   am__include=include
+   am__quote=
+   _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+      am__include=.include
+      am__quote="\""
+      _am_result=BSD
+   fi
+fi
+
+
+echo "$as_me:$LINENO: result: $_am_result" >&5
+echo "${ECHO_T}$_am_result" >&6
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then
+  enableval="$enable_dependency_tracking"
+
+fi;
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+
+
+if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+
+
+depcc="$CXX"  am_compiler_list=
+
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CXX_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CXX_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+
+
+if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+  am__fastdepCXX_TRUE=
+  am__fastdepCXX_FALSE='#'
+else
+  am__fastdepCXX_TRUE='#'
+  am__fastdepCXX_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_CC" && break
+done
+
+  CC=$ac_ct_CC
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+     "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+  (eval $ac_compiler --version </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+  (eval $ac_compiler -v </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+  (eval $ac_compiler -V </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cc_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std1 is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std1.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX			-qlanglvl=ansi
+# Ultrix and OSF/1	-std1
+# HP-UX 10.20 and later	-Ae
+# HP-UX older versions	-Aa -D_HPUX_SOURCE
+# SVR4			-Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext
+done
+rm -f conftest.$ac_ext conftest.$ac_objext
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+  x|xno)
+    echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+  *)
+    echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+    CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+# Some people use a C++ compiler to compile C.  Since we use `exit',
+# in C++ we need to declare it.  In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >conftest.$ac_ext <<_ACEOF
+#ifndef __cplusplus
+  choke me
+#endif
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  for ac_declaration in \
+   '' \
+   'extern "C" void std::exit (int) throw (); using std::exit;' \
+   'extern "C" void std::exit (int); using std::exit;' \
+   'extern "C" void exit (int) throw ();' \
+   'extern "C" void exit (int);' \
+   'void exit (int);'
+do
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+  echo '#ifdef __cplusplus' >>confdefs.h
+  echo $ac_declaration      >>confdefs.h
+  echo '#endif'             >>confdefs.h
+fi
+
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CC"   am_compiler_list=
+
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+
+
+if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if test "${ac_cv_prog_CPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
+else
+  { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Checks for libraries.
+
+# Checks for header files.
+
+# Checks for typedefs, structures, and compiler characteristics.
+
+# Checks for library functions.
+
+# Completion
+          ac_config_files="$ac_config_files Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+{
+  (set) 2>&1 |
+    case `(ac_space=' '; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+	"s/'/'\\\\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;;
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n \
+	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+} |
+  sed '
+     t clear
+     : clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     : end' >>confcache
+if diff $cache_file confcache >/dev/null 2>&1; then :; else
+  if test -w $cache_file; then
+    test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+    cat confcache >$cache_file
+  else
+    echo "not updating unwritable cache $cache_file"
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[	 ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[	 ]*$//;
+}'
+fi
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_i=`echo "$ac_i" |
+	 sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
+  # 2. Add them.
+  ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)$' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\/\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  case $0 in
+    *[\\/]* ) as_myself=$0 ;;
+    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+       ;;
+  esac
+  # We did not find ourselves, most probably we were run as `sh COMMAND'
+  # in which case we are not to be found in the path.
+  if test "x$as_myself" = x; then
+    as_myself=$0
+  fi
+  if test ! -f "$as_myself"; then
+    { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+	 case $as_dir in
+	 /*)
+	   if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+	     CONFIG_SHELL=$as_dir/$as_base
+	     export CONFIG_SHELL
+	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+	   fi;;
+	 esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='	' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" 	$as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.  Logging --version etc. is OK.
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by tdb2txt $as_me 1.0, which was
+generated by GNU Autoconf 2.59.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+  echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_headers"; then
+  echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_links"; then
+  echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_commands"; then
+  echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number, then exit
+  -q, --quiet      do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+		   instantiate the configuration file FILE
+  --header=FILE[:TEMPLATE]
+		   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <bug-autoconf@gnu.org>."
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+tdb2txt config.status 1.0
+configured by $0, generated by GNU Autoconf 2.59,
+  with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=$srcdir
+INSTALL="$INSTALL"
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "x$1" : 'x\([^=]*\)='`
+    ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  -*)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  *) # This is not an option, so the user has probably given explicit
+     # arguments.
+     ac_option=$1
+     ac_need_defaults=false;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --vers* | -V )
+    echo "$ac_cs_version"; exit 0 ;;
+  --he | --h)
+    # Conflict between --help and --header
+    { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; };;
+  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit 0 ;;
+  --debug | --d* | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+    ac_need_defaults=false;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1" ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+  echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+  exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+#
+# INIT-COMMANDS section.
+#
+
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+_ACEOF
+
+
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_config_target in $ac_config_targets
+do
+  case "$ac_config_target" in
+  # Handling of arguments.
+  "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+  "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+  "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason to put it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./confstat$$-$RANDOM
+  (umask 077 && mkdir $tmp)
+} ||
+{
+   echo "$me: cannot create a temporary directory in ." >&2
+   { (exit 1); exit 1; }
+}
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+  # Protect against being on the right side of a sed subst in config.status.
+  sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+   s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
+s,@SHELL@,$SHELL,;t t
+s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s,@exec_prefix@,$exec_prefix,;t t
+s,@prefix@,$prefix,;t t
+s,@program_transform_name@,$program_transform_name,;t t
+s,@bindir@,$bindir,;t t
+s,@sbindir@,$sbindir,;t t
+s,@libexecdir@,$libexecdir,;t t
+s,@datadir@,$datadir,;t t
+s,@sysconfdir@,$sysconfdir,;t t
+s,@sharedstatedir@,$sharedstatedir,;t t
+s,@localstatedir@,$localstatedir,;t t
+s,@libdir@,$libdir,;t t
+s,@includedir@,$includedir,;t t
+s,@oldincludedir@,$oldincludedir,;t t
+s,@infodir@,$infodir,;t t
+s,@mandir@,$mandir,;t t
+s,@build_alias@,$build_alias,;t t
+s,@host_alias@,$host_alias,;t t
+s,@target_alias@,$target_alias,;t t
+s,@DEFS@,$DEFS,;t t
+s,@ECHO_C@,$ECHO_C,;t t
+s,@ECHO_N@,$ECHO_N,;t t
+s,@ECHO_T@,$ECHO_T,;t t
+s,@LIBS@,$LIBS,;t t
+s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
+s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
+s,@INSTALL_DATA@,$INSTALL_DATA,;t t
+s,@CYGPATH_W@,$CYGPATH_W,;t t
+s,@PACKAGE@,$PACKAGE,;t t
+s,@VERSION@,$VERSION,;t t
+s,@ACLOCAL@,$ACLOCAL,;t t
+s,@AUTOCONF@,$AUTOCONF,;t t
+s,@AUTOMAKE@,$AUTOMAKE,;t t
+s,@AUTOHEADER@,$AUTOHEADER,;t t
+s,@MAKEINFO@,$MAKEINFO,;t t
+s,@install_sh@,$install_sh,;t t
+s,@STRIP@,$STRIP,;t t
+s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t
+s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t
+s,@mkdir_p@,$mkdir_p,;t t
+s,@AWK@,$AWK,;t t
+s,@SET_MAKE@,$SET_MAKE,;t t
+s,@am__leading_dot@,$am__leading_dot,;t t
+s,@AMTAR@,$AMTAR,;t t
+s,@am__tar@,$am__tar,;t t
+s,@am__untar@,$am__untar,;t t
+s,@build@,$build,;t t
+s,@build_cpu@,$build_cpu,;t t
+s,@build_vendor@,$build_vendor,;t t
+s,@build_os@,$build_os,;t t
+s,@host@,$host,;t t
+s,@host_cpu@,$host_cpu,;t t
+s,@host_vendor@,$host_vendor,;t t
+s,@host_os@,$host_os,;t t
+s,@CXX@,$CXX,;t t
+s,@CXXFLAGS@,$CXXFLAGS,;t t
+s,@LDFLAGS@,$LDFLAGS,;t t
+s,@CPPFLAGS@,$CPPFLAGS,;t t
+s,@ac_ct_CXX@,$ac_ct_CXX,;t t
+s,@EXEEXT@,$EXEEXT,;t t
+s,@OBJEXT@,$OBJEXT,;t t
+s,@DEPDIR@,$DEPDIR,;t t
+s,@am__include@,$am__include,;t t
+s,@am__quote@,$am__quote,;t t
+s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t
+s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t
+s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t
+s,@CXXDEPMODE@,$CXXDEPMODE,;t t
+s,@am__fastdepCXX_TRUE@,$am__fastdepCXX_TRUE,;t t
+s,@am__fastdepCXX_FALSE@,$am__fastdepCXX_FALSE,;t t
+s,@CC@,$CC,;t t
+s,@CFLAGS@,$CFLAGS,;t t
+s,@ac_ct_CC@,$ac_ct_CC,;t t
+s,@CCDEPMODE@,$CCDEPMODE,;t t
+s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t
+s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t
+s,@CPP@,$CPP,;t t
+s,@LIBOBJS@,$LIBOBJS,;t t
+s,@LTLIBOBJS@,$LTLIBOBJS,;t t
+CEOF
+
+_ACEOF
+
+  cat >>$CONFIG_STATUS <<\_ACEOF
+  # Split the substitutions into bite-sized pieces for seds with
+  # small command number limits, like on Digital OSF/1 and HP-UX.
+  ac_max_sed_lines=48
+  ac_sed_frag=1 # Number of current file.
+  ac_beg=1 # First line for current file.
+  ac_end=$ac_max_sed_lines # Line after last line for current file.
+  ac_more_lines=:
+  ac_sed_cmds=
+  while $ac_more_lines; do
+    if test $ac_beg -gt 1; then
+      sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    else
+      sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    fi
+    if test ! -s $tmp/subs.frag; then
+      ac_more_lines=false
+    else
+      # The purpose of the label and of the branching condition is to
+      # speed up the sed processing (if there are no `@' at all, there
+      # is no need to browse any of the substitutions).
+      # These are the two extra sed commands mentioned above.
+      (echo ':t
+  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+      if test -z "$ac_sed_cmds"; then
+	ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+      else
+	ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+      fi
+      ac_sed_frag=`expr $ac_sed_frag + 1`
+      ac_beg=$ac_end
+      ac_end=`expr $ac_end + $ac_max_sed_lines`
+    fi
+  done
+  if test -z "$ac_sed_cmds"; then
+    ac_sed_cmds=cat
+  fi
+fi # test -n "$CONFIG_FILES"
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case $ac_file in
+  - | *:- | *:-:* ) # input from stdin
+	cat >$tmp/stdin
+	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
+  esac
+
+  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+  ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+  ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
+
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
+  esac
+
+  if test x"$ac_file" != x-; then
+    { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    rm -f "$ac_file"
+  fi
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated by config.status.  */
+  if test x"$ac_file" = x-; then
+    configure_input=
+  else
+    configure_input="$ac_file.  "
+  fi
+  configure_input=$configure_input"Generated from `echo $ac_file_in |
+				     sed 's,.*/,,'` by configure."
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo $tmp/stdin ;;
+      [\\/$]*)
+	 # Absolute (can't be DOS-style, as IFS=:)
+	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+	 echo "$f";;
+      *) # Relative
+	 if test -f "$f"; then
+	   # Build tree
+	   echo "$f"
+	 elif test -f "$srcdir/$f"; then
+	   # Source tree
+	   echo "$srcdir/$f"
+	 else
+	   # /dev/null tree
+	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+	 fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@abs_srcdir@,$ac_abs_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s,@builddir@,$ac_builddir,;t t
+s,@abs_builddir@,$ac_abs_builddir,;t t
+s,@top_builddir@,$ac_top_builddir,;t t
+s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
+s,@INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+  rm -f $tmp/stdin
+  if test x"$ac_file" != x-; then
+    mv $tmp/out $ac_file
+  else
+    cat $tmp/out
+    rm -f $tmp/out
+  fi
+
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_HEADER section.
+#
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s,^\([	 ]*\)#\([	 ]*define[	 ][	 ]*\)'
+ac_dB='[	 ].*$,\1#\2'
+ac_dC=' '
+ac_dD=',;t'
+# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_uA='s,^\([	 ]*\)#\([	 ]*\)undef\([	 ][	 ]*\)'
+ac_uB='$,\1#\2define\3'
+ac_uC=' '
+ac_uD=',;t'
+
+for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case $ac_file in
+  - | *:- | *:-:* ) # input from stdin
+	cat >$tmp/stdin
+	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
+  esac
+
+  test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo $tmp/stdin ;;
+      [\\/$]*)
+	 # Absolute (can't be DOS-style, as IFS=:)
+	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+	 # Do quote $f, to prevent DOS paths from being IFS'd.
+	 echo "$f";;
+      *) # Relative
+	 if test -f "$f"; then
+	   # Build tree
+	   echo "$f"
+	 elif test -f "$srcdir/$f"; then
+	   # Source tree
+	   echo "$srcdir/$f"
+	 else
+	   # /dev/null tree
+	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+	 fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+  # Remove the trailing spaces.
+  sed 's/[	 ]*$//' $ac_file_inputs >$tmp/in
+
+_ACEOF
+
+# Transform confdefs.h into two sed scripts, `conftest.defines' and
+# `conftest.undefs', that substitutes the proper values into
+# config.h.in to produce config.h.  The first handles `#define'
+# templates, and the second `#undef' templates.
+# And first: Protect against being on the right side of a sed subst in
+# config.status.  Protect against being in an unquoted here document
+# in config.status.
+rm -f conftest.defines conftest.undefs
+# Using a here document instead of a string reduces the quoting nightmare.
+# Putting comments in sed scripts is not portable.
+#
+# `end' is used to avoid that the second main sed command (meant for
+# 0-ary CPP macros) applies to n-ary macro definitions.
+# See the Autoconf documentation for `clear'.
+cat >confdef2sed.sed <<\_ACEOF
+s/[\\&,]/\\&/g
+s,[\\$`],\\&,g
+t clear
+: clear
+s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 (][^	 (]*\)\(([^)]*)\)[	 ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
+t end
+s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 ][^	 ]*\)[	 ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
+: end
+_ACEOF
+# If some macros were called several times there might be several times
+# the same #defines, which is useless.  Nevertheless, we may not want to
+# sort them, since we want the *last* AC-DEFINE to be honored.
+uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
+sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
+rm -f confdef2sed.sed
+
+# This sed command replaces #undef with comments.  This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >>conftest.undefs <<\_ACEOF
+s,^[	 ]*#[	 ]*undef[	 ][	 ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
+_ACEOF
+
+# Break up conftest.defines because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo '  # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
+echo '  if grep "^[	 ]*#[	 ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
+echo '  # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
+echo '  :' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.defines >/dev/null
+do
+  # Write a limited-size here document to $tmp/defines.sed.
+  echo '  cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
+  # Speed up: don't consider the non `#define' lines.
+  echo '/^[	 ]*#[	 ]*define/!b' >>$CONFIG_STATUS
+  # Work around the forget-to-reset-the-flag bug.
+  echo 't clr' >>$CONFIG_STATUS
+  echo ': clr' >>$CONFIG_STATUS
+  sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
+  echo 'CEOF
+  sed -f $tmp/defines.sed $tmp/in >$tmp/out
+  rm -f $tmp/in
+  mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+  sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
+  rm -f conftest.defines
+  mv conftest.tail conftest.defines
+done
+rm -f conftest.defines
+echo '  fi # grep' >>$CONFIG_STATUS
+echo >>$CONFIG_STATUS
+
+# Break up conftest.undefs because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo '  # Handle all the #undef templates' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.undefs >/dev/null
+do
+  # Write a limited-size here document to $tmp/undefs.sed.
+  echo '  cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
+  # Speed up: don't consider the non `#undef'
+  echo '/^[	 ]*#[	 ]*undef/!b' >>$CONFIG_STATUS
+  # Work around the forget-to-reset-the-flag bug.
+  echo 't clr' >>$CONFIG_STATUS
+  echo ': clr' >>$CONFIG_STATUS
+  sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
+  echo 'CEOF
+  sed -f $tmp/undefs.sed $tmp/in >$tmp/out
+  rm -f $tmp/in
+  mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+  sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
+  rm -f conftest.undefs
+  mv conftest.tail conftest.undefs
+done
+rm -f conftest.undefs
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated by config.status.  */
+  if test x"$ac_file" = x-; then
+    echo "/* Generated by configure.  */" >$tmp/config.h
+  else
+    echo "/* $ac_file.  Generated by configure.  */" >$tmp/config.h
+  fi
+  cat $tmp/in >>$tmp/config.h
+  rm -f $tmp/in
+  if test x"$ac_file" != x-; then
+    if diff $ac_file $tmp/config.h >/dev/null 2>&1; then
+      { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+      { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+      rm -f $ac_file
+      mv $tmp/config.h $ac_file
+    fi
+  else
+    cat $tmp/config.h
+    rm -f $tmp/config.h
+  fi
+# Compute $ac_file's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $ac_file | $ac_file:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null ||
+$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X$ac_file : 'X\(//\)[^/]' \| \
+	 X$ac_file : 'X\(//\)$' \| \
+	 X$ac_file : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X$ac_file |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`/stamp-h$_am_stamp_count
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_COMMANDS section.
+#
+for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
+  ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
+  ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
+  ac_dir=`(dirname "$ac_dest") 2>/dev/null ||
+$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_dest" : 'X\(//\)[^/]' \| \
+	 X"$ac_dest" : 'X\(//\)$' \| \
+	 X"$ac_dest" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_dest" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+  ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
+
+
+  { echo "$as_me:$LINENO: executing $ac_dest commands" >&5
+echo "$as_me: executing $ac_dest commands" >&6;}
+  case $ac_dest in
+    depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
+  # Strip MF so we end up with the name of the file.
+  mf=`echo "$mf" | sed -e 's/:.*$//'`
+  # Check whether this is an Automake generated Makefile or not.
+  # We used to match only the files named `Makefile.in', but
+  # some people rename them; so instead we look at the file content.
+  # Grep'ing the first line is not enough: some people post-process
+  # each Makefile.in and add a new line on top of each file to say so.
+  # So let's grep whole file.
+  if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+    dirpart=`(dirname "$mf") 2>/dev/null ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$mf" : 'X\(//\)[^/]' \| \
+	 X"$mf" : 'X\(//\)$' \| \
+	 X"$mf" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  else
+    continue
+  fi
+  # Extract the definition of DEPDIR, am__include, and am__quote
+  # from the Makefile without running `make'.
+  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+  test -z "$DEPDIR" && continue
+  am__include=`sed -n 's/^am__include = //p' < "$mf"`
+  test -z "am__include" && continue
+  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+  # When using ansi2knr, U may be empty or an underscore; expand it
+  U=`sed -n 's/^U = //p' < "$mf"`
+  # Find all dependency output files, they are included files with
+  # $(DEPDIR) in their names.  We invoke sed twice because it is the
+  # simplest approach to changing $(DEPDIR) to its actual value in the
+  # expansion.
+  for file in `sed -n "
+    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+    # Make sure the directory exists.
+    test -f "$dirpart/$file" && continue
+    fdir=`(dirname "$file") 2>/dev/null ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$file" : 'X\(//\)[^/]' \| \
+	 X"$file" : 'X\(//\)$' \| \
+	 X"$file" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    { if $as_mkdir_p; then
+    mkdir -p $dirpart/$fdir
+  else
+    as_dir=$dirpart/$fdir
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5
+echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+    # echo "creating $dirpart/$file"
+    echo '# dummy' > "$dirpart/$file"
+  done
+done
+ ;;
+  esac
+done
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || { (exit 1); exit 1; }
+fi
+
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdb2txt-src/configure.ac
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdb2txt-src/configure.ac	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdb2txt-src/configure.ac	(revision 24799)
@@ -0,0 +1,25 @@
+#                                               -*- Autoconf -*-
+# Process this file with autoconf to produce a configure script.
+
+AC_PREREQ(2.59)
+AC_INIT([tdb2txt], [1.0], [jmt12@cs.waikato.ac.nz])
+AM_INIT_AUTOMAKE
+AC_CANONICAL_HOST
+AC_CONFIG_SRCDIR([tdb2txt.cpp])
+AC_CONFIG_HEADER([config.h])
+
+# Checks for programs.
+AC_PROG_CXX
+AC_PROG_CPP
+
+# Checks for libraries.
+
+# Checks for header files.
+
+# Checks for typedefs, structures, and compiler characteristics.
+
+# Checks for library functions.
+
+# Completion
+AC_CONFIG_FILES([Makefile])
+AC_OUTPUT
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdb2txt-src/install-sh
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdb2txt-src/install-sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdb2txt-src/install-sh	(revision 24799)
@@ -0,0 +1,323 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2005-05-14.22
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.  It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+chmodcmd="$chmodprog 0755"
+chowncmd=
+chgrpcmd=
+stripcmd=
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=
+dst=
+dir_arg=
+dstarg=
+no_target_directory=
+
+usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+-c         (ignored)
+-d         create directories instead of installing files.
+-g GROUP   $chgrpprog installed files to GROUP.
+-m MODE    $chmodprog installed files to MODE.
+-o USER    $chownprog installed files to USER.
+-s         $stripprog installed files.
+-t DIRECTORY  install into DIRECTORY.
+-T         report an error if DSTFILE is a directory.
+--help     display this help and exit.
+--version  display version info and exit.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
+"
+
+while test -n "$1"; do
+  case $1 in
+    -c) shift
+        continue;;
+
+    -d) dir_arg=true
+        shift
+        continue;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+        shift
+        shift
+        continue;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) chmodcmd="$chmodprog $2"
+        shift
+        shift
+        continue;;
+
+    -o) chowncmd="$chownprog $2"
+        shift
+        shift
+        continue;;
+
+    -s) stripcmd=$stripprog
+        shift
+        continue;;
+
+    -t) dstarg=$2
+	shift
+	shift
+	continue;;
+
+    -T) no_target_directory=true
+	shift
+	continue;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    *)  # When -d is used, all remaining arguments are directories to create.
+	# When -t is used, the destination is already specified.
+	test -n "$dir_arg$dstarg" && break
+        # Otherwise, the last argument is the destination.  Remove it from $@.
+	for arg
+	do
+          if test -n "$dstarg"; then
+	    # $@ is not empty: it contains at least $arg.
+	    set fnord "$@" "$dstarg"
+	    shift # fnord
+	  fi
+	  shift # arg
+	  dstarg=$arg
+	done
+	break;;
+  esac
+done
+
+if test -z "$1"; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call `install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+for src
+do
+  # Protect names starting with `-'.
+  case $src in
+    -*) src=./$src ;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    src=
+
+    if test -d "$dst"; then
+      mkdircmd=:
+      chmodcmd=
+    else
+      mkdircmd=$mkdirprog
+    fi
+  else
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dstarg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+
+    dst=$dstarg
+    # Protect names starting with `-'.
+    case $dst in
+      -*) dst=./$dst ;;
+    esac
+
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
+    if test -d "$dst"; then
+      if test -n "$no_target_directory"; then
+	echo "$0: $dstarg: Is a directory" >&2
+	exit 1
+      fi
+      dst=$dst/`basename "$src"`
+    fi
+  fi
+
+  # This sed command emulates the dirname command.
+  dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'`
+
+  # Make sure that the destination directory exists.
+
+  # Skip lots of stat calls in the usual case.
+  if test ! -d "$dstdir"; then
+    defaultIFS='
+	 '
+    IFS="${IFS-$defaultIFS}"
+
+    oIFS=$IFS
+    # Some sh's can't handle IFS=/ for some reason.
+    IFS='%'
+    set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
+    shift
+    IFS=$oIFS
+
+    pathcomp=
+
+    while test $# -ne 0 ; do
+      pathcomp=$pathcomp$1
+      shift
+      if test ! -d "$pathcomp"; then
+        $mkdirprog "$pathcomp"
+	# mkdir can fail with a `File exist' error in case several
+	# install-sh are creating the directory concurrently.  This
+	# is OK.
+	test -d "$pathcomp" || exit
+      fi
+      pathcomp=$pathcomp/
+    done
+  fi
+
+  if test -n "$dir_arg"; then
+    $doit $mkdircmd "$dst" \
+      && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
+      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
+      && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
+      && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
+
+  else
+    dstfile=`basename "$dst"`
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+    trap '(exit $?); exit' 1 2 13 15
+
+    # Copy the file name to the temp name.
+    $doit $cpprog "$src" "$dsttmp" &&
+
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
+      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
+      && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
+      && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
+
+    # Now rename the file to the real destination.
+    { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
+      || {
+	   # The rename failed, perhaps because mv can't rename something else
+	   # to itself, or perhaps because mv is so ancient that it does not
+	   # support -f.
+
+	   # Now remove or move aside any old file at destination location.
+	   # We try this two ways since rm can't unlink itself on some
+	   # systems and the destination file might be busy for other
+	   # reasons.  In this case, the final cleanup might fail but the new
+	   # file should still install successfully.
+	   {
+	     if test -f "$dstdir/$dstfile"; then
+	       $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
+	       || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
+	       || {
+		 echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
+		 (exit 1); exit 1
+	       }
+	     else
+	       :
+	     fi
+	   } &&
+
+	   # Now rename the file to the real destination.
+	   $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
+	 }
+    }
+  fi || { (exit 1); exit 1; }
+done
+
+# The final little trick to "correctly" pass the exit status to the exit trap.
+{
+  (exit 0); exit 0
+}
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdb2txt-src/tdb2txt.cpp
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdb2txt-src/tdb2txt.cpp	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdb2txt-src/tdb2txt.cpp	(revision 24799)
@@ -0,0 +1,117 @@
+/**********************************************************************
+ *
+ * tdb2txt.cpp -- A utility to retrieve the entire contents of a TDB
+ *                file as text ala buildproc encoded output.
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * Copyright (C) 2011  The New Zealand Digital Library Project
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *********************************************************************/
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#include <ospace\std\iostream>
+#elif defined(GSDL_USE_IOS_H)
+#include <iostream.h>
+#else
+#include <iostream>
+#endif
+
+#include <cstdlib>
+
+#include <fcntl.h>
+#include "tdb.h"
+
+// use the standard namespace
+#if !defined (GSDL_NAMESPACE_BROKEN)
+#if defined(GSDL_USE_OBJECTSPACE)
+using namespace ospace::std;
+#else
+using namespace std;
+#endif
+#endif
+
+/**
+ */
+void
+printUsage (char *program_name)
+{
+  cerr << "usage: " << program_name << " database-name" << endl << endl;
+}
+/** printUsage() **/
+
+/**
+ */
+int
+main (int argc, char *argv[])
+{
+  // sanity check
+  if (argc != 2)
+  {
+    printUsage(argv[0]);
+    exit (0);
+  }
+
+  char *dbname = argv[1];
+
+  // open the database
+  int hash_size = 0;
+  int tdb_flags = TDB_DEFAULT;
+  int open_flags = O_RDONLY; 
+  TDB_CONTEXT *tdb = tdb_open(dbname, hash_size, tdb_flags, open_flags, 0664);
+  if (!tdb)
+  {
+    cerr << "couldn't create " << dbname << endl;
+    exit (0);
+  }
+
+  TDB_DATA key = tdb_firstkey(tdb);
+  while (key.dptr != NULL)
+  {
+    cout << "[";
+    for (int i = 0; i < key.dsize; ++i)
+    {
+      cout << key.dptr[i];
+    }
+    cout << "]" << endl;
+    TDB_DATA value = tdb_fetch (tdb, key);
+    for (int i = 0; i < value.dsize; ++i)
+    {
+      cout << value.dptr[i];
+    }
+    cout << endl << "----------------------------------------------------------------------" << endl;
+
+    // caller responsible for freeing this memory
+    free(value.dptr);
+
+    /* get next key */
+    TDB_DATA nextkey = tdb_nextkey (tdb, key);
+
+    /* free old key's dptr, otherwise causes memory leak */
+    free(key.dptr);
+
+    /* can now safely copy content of nextkey into key */
+    key = nextkey;
+  }
+
+  tdb_close(tdb);
+
+  return 0;
+}
+/** main() **/
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbdel-src/.svnignore
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbdel-src/.svnignore	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbdel-src/.svnignore	(revision 24799)
@@ -0,0 +1,6 @@
+Makefile
+config.h
+config.log
+config.status
+stamp-h1
+tdbdel
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbdel-src/Makefile.in
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbdel-src/Makefile.in	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbdel-src/Makefile.in	(revision 24799)
@@ -0,0 +1,80 @@
+###########################################################################
+#
+# Makefile -- tdbdel
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999-2011  The New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+GSDL_DIR = ../../../..
+COMMON_DIR = $(GSDL_DIR)/common-src
+
+COMMON_PACKAGES_DIR = $(COMMON_DIR)/packages
+
+CXX = @CXX@
+CXXFLAGS = @CXXFLAGS@
+DEFS = @DEFS@
+INCLUDES = -I${GEXTTDBEDIT_INSTALLED}/include
+INSTALL = @INSTALL@
+LDFLAGS = @LDFLAGS@ -L${GEXTTDBEDIT_INSTALLED}/lib
+LIBS = @LIBS@ -ltdb
+
+
+CXXCOMPILE = $(CXX) -c $(CXXFLAGS) $(DEFS) $(INCLUDES)
+CXXLINK = $(CXX) $(LDFLAGS) -o $@
+
+
+.SUFFIXES:
+.SUFFIXES: .cpp .o
+.cpp.o:
+	$(CXXCOMPILE) $< 
+
+
+SOURCES = \
+	tdbdel.cpp
+
+OBJECTS = \
+	tdbdel.o
+
+EXECUTABLE_OBJECTS = \
+	$(OBJECTS)
+
+EXECUTABLE = tdbdel
+
+
+# Default target: make the tdbdel executable
+all: $(EXECUTABLE)
+
+tdbdel: $(EXECUTABLE_OBJECTS)
+	$(CXXLINK) $(EXECUTABLE_OBJECTS) $(LIBS)
+
+install: $(EXECUTABLE)
+	$(INSTALL) -d ${GEXTTDBEDIT_INSTALLED}/bin
+	$(INSTALL) -m 755 -s $(EXECUTABLE) ${GEXTTDBEDIT_INSTALLED}/bin
+
+clean:
+	rm -f $(OBJECTS) $(EXECUTABLE)
+
+distclean:
+	rm -f $(OBJECTS) $(EXECUTABLE) Makefile
+
+depend:
+	makedepend -Y -- $(DEFS) $(INCLUDES) $(CXXFLAGS) -- $(SOURCES)
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbdel-src/aclocal.m4
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbdel-src/aclocal.m4	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbdel-src/aclocal.m4	(revision 24799)
@@ -0,0 +1,850 @@
+# generated automatically by aclocal 1.9.6 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005  Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# Copyright (C) 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION so it can be traced.
+# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+	 [AM_AUTOMAKE_VERSION([1.9.6])])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 7
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])
+AC_SUBST([$1_FALSE])
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 8
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
+       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
+       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                   [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 3
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[for mf in $CONFIG_FILES; do
+  # Strip MF so we end up with the name of the file.
+  mf=`echo "$mf" | sed -e 's/:.*$//'`
+  # Check whether this is an Automake generated Makefile or not.
+  # We used to match only the files named `Makefile.in', but
+  # some people rename them; so instead we look at the file content.
+  # Grep'ing the first line is not enough: some people post-process
+  # each Makefile.in and add a new line on top of each file to say so.
+  # So let's grep whole file.
+  if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+    dirpart=`AS_DIRNAME("$mf")`
+  else
+    continue
+  fi
+  # Extract the definition of DEPDIR, am__include, and am__quote
+  # from the Makefile without running `make'.
+  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+  test -z "$DEPDIR" && continue
+  am__include=`sed -n 's/^am__include = //p' < "$mf"`
+  test -z "am__include" && continue
+  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+  # When using ansi2knr, U may be empty or an underscore; expand it
+  U=`sed -n 's/^U = //p' < "$mf"`
+  # Find all dependency output files, they are included files with
+  # $(DEPDIR) in their names.  We invoke sed twice because it is the
+  # simplest approach to changing $(DEPDIR) to its actual value in the
+  # expansion.
+  for file in `sed -n "
+    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+    # Make sure the directory exists.
+    test -f "$dirpart/$file" && continue
+    fdir=`AS_DIRNAME(["$file"])`
+    AS_MKDIR_P([$dirpart/$fdir])
+    # echo "creating $dirpart/$file"
+    echo '# dummy' > "$dirpart/$file"
+  done
+done
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled.  FIXME.  This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 12
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.58])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+   test -f $srcdir/config.status; then
+  AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AM_PROG_INSTALL_SH
+AM_PROG_INSTALL_STRIP
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+              [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+	      		     [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+                  [_AM_DEPENDENCIES(CC)],
+                  [define([AC_PROG_CC],
+                          defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+                  [_AM_DEPENDENCIES(CXX)],
+                  [define([AC_PROG_CXX],
+                          defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+])
+])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $1 | $1:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Check to see how 'make' treats includes.	            -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+   am__include=include
+   am__quote=
+   _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+      am__include=.include
+      am__quote="\""
+      _am_result=BSD
+   fi
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise.
+#
+# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories
+# created by `make install' are always world readable, even if the
+# installer happens to have an overly restrictive umask (e.g. 077).
+# This was a mistake.  There are at least two reasons why we must not
+# use `-m 0755':
+#   - it causes special bits like SGID to be ignored,
+#   - it may be too restrictive (some setups expect 775 directories).
+#
+# Do not use -m 0755 and let people choose whatever they expect by
+# setting umask.
+#
+# We cannot accept any implementation of `mkdir' that recognizes `-p'.
+# Some implementations (such as Solaris 8's) are not thread-safe: if a
+# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c'
+# concurrently, both version can detect that a/ is missing, but only
+# one can create it and the other will error out.  Consequently we
+# restrict ourselves to GNU make (using the --version option ensures
+# this.)
+AC_DEFUN([AM_PROG_MKDIR_P],
+[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+  # We used to keeping the `.' as first argument, in order to
+  # allow $(mkdir_p) to be used without argument.  As in
+  #   $(mkdir_p) $(somedir)
+  # where $(somedir) is conditionally defined.  However this is wrong
+  # for two reasons:
+  #  1. if the package is installed by a user who cannot write `.'
+  #     make install will fail,
+  #  2. the above comment should most certainly read
+  #     $(mkdir_p) $(DESTDIR)$(somedir)
+  #     so it does not work when $(somedir) is undefined and
+  #     $(DESTDIR) is not.
+  #  To support the latter case, we have to write
+  #     test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+  #  so the `.' trick is pointless.
+  mkdir_p='mkdir -p --'
+else
+  # On NextStep and OpenStep, the `mkdir' command does not
+  # recognize any option.  It will interpret all options as
+  # directories to create, and then abort because `.' already
+  # exists.
+  for d in ./-p ./--version;
+  do
+    test -d $d && rmdir $d
+  done
+  # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+  if test -f "$ac_aux_dir/mkinstalldirs"; then
+    mkdir_p='$(mkinstalldirs)'
+  else
+    mkdir_p='$(install_sh) -d'
+  fi
+fi
+AC_SUBST([mkdir_p])])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+   if test "$[*]" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$[*]" != "X $srcdir/configure conftest.file" \
+      && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+     [m4_case([$1], [ustar],, [pax],,
+              [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+  case $_am_tool in
+  gnutar)
+    for _am_tar in tar gnutar gtar;
+    do
+      AM_RUN_LOG([$_am_tar --version]) && break
+    done
+    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+    am__untar="$_am_tar -xf -"
+    ;;
+  plaintar)
+    # Must skip GNU tar: if it does not support --format= it doesn't create
+    # ustar tarball either.
+    (tar --version) >/dev/null 2>&1 && continue
+    am__tar='tar chf - "$$tardir"'
+    am__tar_='tar chf - "$tardir"'
+    am__untar='tar xf -'
+    ;;
+  pax)
+    am__tar='pax -L -x $1 -w "$$tardir"'
+    am__tar_='pax -L -x $1 -w "$tardir"'
+    am__untar='pax -r'
+    ;;
+  cpio)
+    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+    am__untar='cpio -i -H $1 -d'
+    ;;
+  none)
+    am__tar=false
+    am__tar_=false
+    am__untar=false
+    ;;
+  esac
+
+  # If the value was cached, stop now.  We just wanted to have am__tar
+  # and am__untar set.
+  test -n "${am_cv_prog_tar_$1}" && break
+
+  # tar/untar a dummy directory, and stop if the command works
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  echo GrepMe > conftest.dir/file
+  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+  rm -rf conftest.dir
+  if test -s conftest.tar; then
+    AM_RUN_LOG([$am__untar <conftest.tar])
+    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+  fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbdel-src/config.guess
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbdel-src/config.guess	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbdel-src/config.guess	(revision 24799)
@@ -0,0 +1,1298 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+#   Free Software Foundation, Inc.
+
+timestamp='2001-07-12'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Written by Per Bothner <bothner@cygnus.com>.
+# Please send patches to <config-patches@gnu.org>.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit 0 ;;
+    --version | -v )
+       echo "$version" ; exit 0 ;;
+    --help | --h* | -h )
+       echo "$usage"; exit 0 ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+
+dummy=dummy-$$
+trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script.
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int dummy(){}" > $dummy.c ;
+	for c in cc gcc c89 ; do
+	  ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ;
+	  if test $? = 0 ; then
+	     CC_FOR_BUILD="$c"; break ;
+	  fi ;
+	done ;
+	rm -f $dummy.c $dummy.o $dummy.rel ;
+	if test x"$CC_FOR_BUILD" = x ; then
+	  CC_FOR_BUILD=no_compiler_found ;
+	fi
+	;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+	# Netbsd (nbsd) targets should (where applicable) match one or
+	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	# Determine the machine/vendor (is the vendor relevant).
+	case "${UNAME_MACHINE}" in
+	    amiga) machine=m68k-unknown ;;
+	    arm32) machine=arm-unknown ;;
+	    atari*) machine=m68k-atari ;;
+	    sun3*) machine=m68k-sun ;;
+	    mac68k) machine=m68k-apple ;;
+	    macppc) machine=powerpc-apple ;;
+	    hp3[0-9][05]) machine=m68k-hp ;;
+	    ibmrt|romp-ibm) machine=romp-ibm ;;
+	    *) machine=${UNAME_MACHINE}-unknown ;;
+	esac
+	# The Operating System including object format, if it has switched
+	# to ELF recently, or will in the future.
+	case "${UNAME_MACHINE}" in
+	    i386|sparc|amiga|arm*|hp300|mvme68k|vax|atari|luna68k|mac68k|news68k|next68k|pc532|sun3*|x68k)
+		eval $set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep __ELF__ >/dev/null
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+	        os=netbsd
+		;;
+	esac
+	# The OS release
+	release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	echo "${machine}-${os}${release}"
+	exit 0 ;;
+    alpha:OSF1:*:*)
+	if test $UNAME_RELEASE = "V4.0"; then
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+	fi
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	cat <<EOF >$dummy.s
+	.data
+\$Lformat:
+	.byte 37,100,45,37,120,10,0	# "%d-%x\n"
+
+	.text
+	.globl main
+	.align 4
+	.ent main
+main:
+	.frame \$30,16,\$26,0
+	ldgp \$29,0(\$27)
+	.prologue 1
+	.long 0x47e03d80 # implver \$0
+	lda \$2,-1
+	.long 0x47e20c21 # amask \$2,\$1
+	lda \$16,\$Lformat
+	mov \$0,\$17
+	not \$1,\$18
+	jsr \$26,printf
+	ldgp \$29,0(\$26)
+	mov 0,\$16
+	jsr \$26,exit
+	.end main
+EOF
+	eval $set_cc_for_build
+	$CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
+	if test "$?" = 0 ; then
+		case `./$dummy` in
+			0-0)
+				UNAME_MACHINE="alpha"
+				;;
+			1-0)
+				UNAME_MACHINE="alphaev5"
+				;;
+			1-1)
+				UNAME_MACHINE="alphaev56"
+				;;
+			1-101)
+				UNAME_MACHINE="alphapca56"
+				;;
+			2-303)
+				UNAME_MACHINE="alphaev6"
+				;;
+			2-307)
+				UNAME_MACHINE="alphaev67"
+				;;
+		esac
+	fi
+	rm -f $dummy.s $dummy
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	exit 0 ;;
+    Alpha\ *:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# Should we change UNAME_MACHINE based on the output of uname instead
+	# of the specific Alpha model?
+	echo alpha-pc-interix
+	exit 0 ;;
+    21064:Windows_NT:50:3)
+	echo alpha-dec-winnt3.5
+	exit 0 ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-unknown-sysv4
+	exit 0;;
+    amiga:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-amigaos
+	exit 0 ;;
+    arc64:OpenBSD:*:*)
+	echo mips64el-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    arc:OpenBSD:*:*)
+	echo mipsel-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    hkmips:OpenBSD:*:*)
+	echo mips-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    pmax:OpenBSD:*:*)
+	echo mipsel-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    sgi:OpenBSD:*:*)
+	echo mips-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    wgrisc:OpenBSD:*:*)
+	echo mipsel-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    *:OS/390:*:*)
+	echo i370-ibm-openedition
+	exit 0 ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit 0;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit 0;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit 0 ;;
+    NILE*:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit 0 ;;
+    sun4H:SunOS:5.*:*)
+	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    i86pc:SunOS:5.*:*)
+	echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    sun4*:SunOS:*:*)
+	case "`/usr/bin/arch -k`" in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+	exit 0 ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos${UNAME_RELEASE}
+	exit 0 ;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+	case "`/bin/arch`" in
+	    sun3)
+		echo m68k-sun-sunos${UNAME_RELEASE}
+		;;
+	    sun4)
+		echo sparc-sun-sunos${UNAME_RELEASE}
+		;;
+	esac
+	exit 0 ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos${UNAME_RELEASE}
+	exit 0 ;;
+    atari*:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit 0 ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+        exit 0 ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit 0 ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+        echo m68k-milan-mint${UNAME_RELEASE}
+        exit 0 ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+        echo m68k-hades-mint${UNAME_RELEASE}
+        exit 0 ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+        echo m68k-unknown-mint${UNAME_RELEASE}
+        exit 0 ;;
+    sun3*:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    mac68k:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    mvme68k:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    mvme88k:OpenBSD:*:*)
+	echo m88k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten${UNAME_RELEASE}
+	exit 0 ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit 0 ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit 0 ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit 0 ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	echo clipper-intergraph-clix${UNAME_RELEASE}
+	exit 0 ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	sed 's/^	//' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	eval $set_cc_for_build
+	$CC_FOR_BUILD $dummy.c -o $dummy \
+	  && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+	  && rm -f $dummy.c $dummy && exit 0
+	rm -f $dummy.c $dummy
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit 0 ;;
+    Motorola:PowerMAX_OS:*:*)
+	echo powerpc-motorola-powermax
+	exit 0 ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit 0 ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit 0 ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit 0 ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit 0 ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+	then
+	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+	       [ ${TARGET_BINARY_INTERFACE}x = x ]
+	    then
+		echo m88k-dg-dgux${UNAME_RELEASE}
+	    else
+		echo m88k-dg-dguxbcs${UNAME_RELEASE}
+	    fi
+	else
+	    echo i586-dg-dgux${UNAME_RELEASE}
+	fi
+ 	exit 0 ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit 0 ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit 0 ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit 0 ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit 0 ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+	exit 0 ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	echo romp-ibm-aix      # uname -m gives an 8 hex-code CPU id
+	exit 0 ;;              # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+	echo i386-ibm-aix
+	exit 0 ;;
+    ia64:AIX:*:*)
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+	exit 0 ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		sed 's/^		//' << EOF >$dummy.c
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		eval $set_cc_for_build
+		$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
+		rm -f $dummy.c $dummy
+		echo rs6000-ibm-aix3.2.5
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		echo rs6000-ibm-aix3.2.4
+	else
+		echo rs6000-ibm-aix3.2
+	fi
+	exit 0 ;;
+    *:AIX:*:[45])
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit 0 ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit 0 ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+	echo romp-ibm-bsd4.4
+	exit 0 ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+	exit 0 ;;                           # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit 0 ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit 0 ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit 0 ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit 0 ;;
+    9000/[34678]??:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+              case "${HPUX_REV}" in
+                11.[0-9][0-9])
+                  if [ -x /usr/bin/getconf ]; then
+                    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+                    case "${sc_cpu_version}" in
+                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+                      532)                      # CPU_PA_RISC2_0
+                        case "${sc_kernel_bits}" in
+                          32) HP_ARCH="hppa2.0n" ;;
+                          64) HP_ARCH="hppa2.0w" ;;
+                        esac ;;
+                    esac
+                  fi ;;
+              esac
+              if [ "${HP_ARCH}" = "" ]; then
+              sed 's/^              //' << EOF >$dummy.c
+
+              #define _HPUX_SOURCE
+              #include <stdlib.h>
+              #include <unistd.h>
+
+              int main ()
+              {
+              #if defined(_SC_KERNEL_BITS)
+                  long bits = sysconf(_SC_KERNEL_BITS);
+              #endif
+                  long cpu  = sysconf (_SC_CPU_VERSION);
+
+                  switch (cpu)
+              	{
+              	case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+              	case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+              	case CPU_PA_RISC2_0:
+              #if defined(_SC_KERNEL_BITS)
+              	    switch (bits)
+              		{
+              		case 64: puts ("hppa2.0w"); break;
+              		case 32: puts ("hppa2.0n"); break;
+              		default: puts ("hppa2.0"); break;
+              		} break;
+              #else  /* !defined(_SC_KERNEL_BITS) */
+              	    puts ("hppa2.0"); break;
+              #endif
+              	default: puts ("hppa1.0"); break;
+              	}
+                  exit (0);
+              }
+EOF
+	eval $set_cc_for_build
+	(CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy`
+	if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi
+	rm -f $dummy.c $dummy
+	fi ;;
+	esac
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit 0 ;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ia64-hp-hpux${HPUX_REV}
+	exit 0 ;;
+    3050*:HI-UX:*:*)
+	sed 's/^	//' << EOF >$dummy.c
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	eval $set_cc_for_build
+	$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
+	rm -f $dummy.c $dummy
+	echo unknown-hitachi-hiuxwe2
+	exit 0 ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit 0 ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit 0 ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+	echo hppa1.0-hp-mpeix
+	exit 0 ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit 0 ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit 0 ;;
+    i*86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo ${UNAME_MACHINE}-unknown-osf1mk
+	else
+	    echo ${UNAME_MACHINE}-unknown-osf1
+	fi
+	exit 0 ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit 0 ;;
+    hppa*:OpenBSD:*:*)
+	echo hppa-unknown-openbsd
+	exit 0 ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+        exit 0 ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+        exit 0 ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+        exit 0 ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+        exit 0 ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+        exit 0 ;;
+    CRAY*X-MP:*:*:*)
+	echo xmp-cray-unicos
+        exit 0 ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*[A-Z]90:*:*:*)
+	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+	      -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*T3D:*:*:*)
+	echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*T3E:*:*:*)
+	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*SV1:*:*:*)
+	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY-2:*:*:*)
+	echo cray2-cray-unicos
+        exit 0 ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit 0 ;;
+    hp300:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+	exit 0 ;;
+    sparc*:BSD/OS:*:*)
+	echo sparc-unknown-bsdi${UNAME_RELEASE}
+	exit 0 ;;
+    *:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit 0 ;;
+    *:FreeBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit 0 ;;
+    *:OpenBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+	exit 0 ;;
+    i*:CYGWIN*:*)
+	echo ${UNAME_MACHINE}-pc-cygwin
+	exit 0 ;;
+    i*:MINGW*:*)
+	echo ${UNAME_MACHINE}-pc-mingw32
+	exit 0 ;;
+    i*:PW*:*)
+	echo ${UNAME_MACHINE}-pc-pw32
+	exit 0 ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+	# UNAME_MACHINE based on the output of uname instead of i386?
+	echo i386-pc-interix
+	exit 0 ;;
+    i*:UWIN*:*)
+	echo ${UNAME_MACHINE}-pc-uwin
+	exit 0 ;;
+    p*:CYGWIN*:*)
+	echo powerpcle-unknown-cygwin
+	exit 0 ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    *:GNU:*:*)
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit 0 ;;
+    i*86:Minix:*:*)
+	echo ${UNAME_MACHINE}-pc-minix
+	exit 0 ;;
+    arm*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    ia64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux
+	exit 0 ;;
+    m68*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    mips:Linux:*:*)
+	case `sed -n '/^byte/s/^.*: \(.*\) endian/\1/p' < /proc/cpuinfo` in
+	  big)    echo mips-unknown-linux-gnu && exit 0 ;;
+	  little) echo mipsel-unknown-linux-gnu && exit 0 ;;
+	esac
+	;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-gnu
+	exit 0 ;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev67 ;;
+        esac
+	objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+	exit 0 ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
+	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
+	  *)    echo hppa-unknown-linux-gnu ;;
+	esac
+	exit 0 ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-gnu
+	exit 0 ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	echo ${UNAME_MACHINE}-ibm-linux
+	exit 0 ;;
+    sh*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    x86_64:Linux:*:*)
+	echo x86_64-unknown-linux-gnu
+	exit 0 ;;
+    i*86:Linux:*:*)
+	# The BFD linker knows what the default object file format is, so
+	# first see if it will tell us. cd to the root directory to prevent
+	# problems with other programs or directories called `ld' in the path.
+	ld_supported_targets=`cd /; ld --help 2>&1 \
+			 | sed -ne '/supported targets:/!d
+				    s/[ 	][ 	]*/ /g
+				    s/.*supported targets: *//
+				    s/ .*//
+				    p'`
+        case "$ld_supported_targets" in
+	  elf32-i386)
+		TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+		;;
+	  a.out-i386-linux)
+		echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+		exit 0 ;;		
+	  coff-i386)
+		echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+		exit 0 ;;
+	  "")
+		# Either a pre-BFD a.out linker (linux-gnuoldld) or
+		# one that does not give us useful --help.
+		echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+		exit 0 ;;
+	esac
+	# Determine whether the default compiler is a.out or elf
+	cat >$dummy.c <<EOF
+#include <features.h>
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+#ifdef __ELF__
+# ifdef __GLIBC__
+#  if __GLIBC__ >= 2
+    printf ("%s-pc-linux-gnu\n", argv[1]);
+#  else
+    printf ("%s-pc-linux-gnulibc1\n", argv[1]);
+#  endif
+# else
+   printf ("%s-pc-linux-gnulibc1\n", argv[1]);
+# endif
+#else
+  printf ("%s-pc-linux-gnuaout\n", argv[1]);
+#endif
+  return 0;
+}
+EOF
+	eval $set_cc_for_build
+	$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0
+	rm -f $dummy.c $dummy
+	test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
+	;;
+    i*86:DYNIX/ptx:4*:*)
+	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+	# earlier versions are messed up and put the nodename in both
+	# sysname and nodename.
+	echo i386-sequent-sysv4
+	exit 0 ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+        # Unixware is an offshoot of SVR4, but it has its own version
+        # number series starting with 2...
+        # I am not positive that other SVR4 systems won't match this,
+	# I just have to hope.  -- rms.
+        # Use sysv4.2uw... so that sysv4* matches it.
+	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+	exit 0 ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+	else
+		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+	fi
+	exit 0 ;;
+    i*86:*:5:[78]*)
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	exit 0 ;;
+    i*86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-pc-sysv32
+	fi
+	exit 0 ;;
+    i*86:*DOS:*:*)
+	echo ${UNAME_MACHINE}-pc-msdosdjgpp
+	exit 0 ;;
+    pc:*:*:*)
+	# Left here for compatibility:
+        # uname -m prints for DJGPP always 'pc', but it prints nothing about
+        # the processor, so we play safe by assuming i386.
+	echo i386-pc-msdosdjgpp
+        exit 0 ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit 0 ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit 0 ;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	fi
+	exit 0 ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit 0 ;;
+    M68*:*:R3V[567]*:*)
+	test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+    3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && echo i486-ncr-sysv4.3${OS_REL} && exit 0
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && echo i486-ncr-sysv4 && exit 0 ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+	echo m68k-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit 0 ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+	echo i386-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    rs6000:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+	echo powerpc-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv${UNAME_RELEASE}
+	exit 0 ;;
+    RM*:ReliantUNIX-*:*:*)
+	echo mips-sni-sysv4
+	exit 0 ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit 0 ;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		echo ${UNAME_MACHINE}-sni-sysv4
+	else
+		echo ns32k-sni-sysv
+	fi
+	exit 0 ;;
+    PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                           # says <Richard.M.Bartel@ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit 0 ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes@openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit 0 ;;
+    *:*:*:FTX*)
+	# From seanf@swdc.stratus.com.
+	echo i860-stratus-sysv4
+	exit 0 ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux${UNAME_RELEASE}
+	exit 0 ;;
+    news*:NEWS-OS:6*:*)
+	echo mips-sony-newsos6
+	exit 0 ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+	if [ -d /usr/nec ]; then
+	        echo mips-nec-sysv${UNAME_RELEASE}
+	else
+	        echo mips-unknown-sysv${UNAME_RELEASE}
+	fi
+        exit 0 ;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	echo powerpc-be-beos
+	exit 0 ;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	echo powerpc-apple-beos
+	exit 0 ;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	echo i586-pc-beos
+	exit 0 ;;
+    SX-4:SUPER-UX:*:*)
+	echo sx4-nec-superux${UNAME_RELEASE}
+	exit 0 ;;
+    SX-5:SUPER-UX:*:*)
+	echo sx5-nec-superux${UNAME_RELEASE}
+	exit 0 ;;
+    Power*:Rhapsody:*:*)
+	echo powerpc-apple-rhapsody${UNAME_RELEASE}
+	exit 0 ;;
+    *:Rhapsody:*:*)
+	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+	exit 0 ;;
+    *:Darwin:*:*)
+	echo `uname -p`-apple-darwin${UNAME_RELEASE}
+	exit 0 ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	if test "${UNAME_MACHINE}" = "x86pc"; then
+		UNAME_MACHINE=pc
+	fi
+	echo `uname -p`-${UNAME_MACHINE}-nto-qnx
+	exit 0 ;;
+    *:QNX:*:4*)
+	echo i386-pc-qnx
+	exit 0 ;;
+    NSR-[KW]:NONSTOP_KERNEL:*:*)
+	echo nsr-tandem-nsk${UNAME_RELEASE}
+	exit 0 ;;
+    *:NonStop-UX:*:*)
+	echo mips-compaq-nonstopux
+	exit 0 ;;
+    BS2000:POSIX*:*:*)
+	echo bs2000-siemens-sysv
+	exit 0 ;;
+    DS/*:UNIX_System_V:*:*)
+	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+	exit 0 ;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	if test "$cputype" = "386"; then
+	    UNAME_MACHINE=i386
+	else
+	    UNAME_MACHINE="$cputype"
+	fi
+	echo ${UNAME_MACHINE}-unknown-plan9
+	exit 0 ;;
+    i*86:OS/2:*:*)
+	# If we were able to find `uname', then EMX Unix compatibility
+	# is probably installed.
+	echo ${UNAME_MACHINE}-pc-os2-emx
+	exit 0 ;;
+    *:TOPS-10:*:*)
+	echo pdp10-unknown-tops10
+	exit 0 ;;
+    *:TENEX:*:*)
+	echo pdp10-unknown-tenex
+	exit 0 ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	echo pdp10-dec-tops20
+	exit 0 ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	echo pdp10-xkl-tops20
+	exit 0 ;;
+    *:TOPS-20:*:*)
+	echo pdp10-unknown-tops20
+	exit 0 ;;
+    *:ITS:*:*)
+	echo pdp10-unknown-its
+	exit 0 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+          "4"
+#else
+	  ""
+#endif
+         ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+	printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+	printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# else
+    printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+eval $set_cc_for_build
+$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0
+rm -f $dummy.c $dummy
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+	echo c1-convex-bsd
+	exit 0 ;;
+    c2*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit 0 ;;
+    c34*)
+	echo c34-convex-bsd
+	exit 0 ;;
+    c38*)
+	echo c38-convex-bsd
+	exit 0 ;;
+    c4*)
+	echo c4-convex-bsd
+	exit 0 ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+    ftp://ftp.gnu.org/pub/gnu/config/
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbdel-src/config.h.in
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbdel-src/config.h.in	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbdel-src/config.h.in	(revision 24799)
@@ -0,0 +1,22 @@
+/* config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Version number of package */
+#undef VERSION
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbdel-src/config.sub
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbdel-src/config.sub	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbdel-src/config.sub	(revision 24799)
@@ -0,0 +1,1579 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+
+timestamp='2005-07-08'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \
+  kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+	-sun*os*)
+		# Prevent following clause from handling this invalid input.
+		;;
+	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+	-apple | -axis | -knuth | -cray)
+		os=
+		basic_machine=$1
+		;;
+	-sim | -cisco | -oki | -wec | -winbond)
+		os=
+		basic_machine=$1
+		;;
+	-scout)
+		;;
+	-wrs)
+		os=-vxworks
+		basic_machine=$1
+		;;
+	-chorusos*)
+		os=-chorusos
+		basic_machine=$1
+		;;
+ 	-chorusrdb)
+ 		os=-chorusrdb
+		basic_machine=$1
+ 		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco5)
+		os=-sco3.2v5
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-udk*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-lynx*)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-windowsnt*)
+		os=`echo $os | sed -e 's/windowsnt/winnt/'`
+		;;
+	-psos*)
+		os=-psos
+		;;
+	-mint | -mint[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+	# Recognize the basic CPU types without company name.
+	# Some are omitted here because they have special meanings below.
+	1750a | 580 \
+	| a29k \
+	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+	| am33_2.0 \
+	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+	| bfin \
+	| c4x | clipper \
+	| d10v | d30v | dlx | dsp16xx \
+	| fr30 | frv \
+	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| i370 | i860 | i960 | ia64 \
+	| ip2k | iq2000 \
+	| m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \
+	| mips | mipsbe | mipseb | mipsel | mipsle \
+	| mips16 \
+	| mips64 | mips64el \
+	| mips64vr | mips64vrel \
+	| mips64orion | mips64orionel \
+	| mips64vr4100 | mips64vr4100el \
+	| mips64vr4300 | mips64vr4300el \
+	| mips64vr5000 | mips64vr5000el \
+	| mips64vr5900 | mips64vr5900el \
+	| mipsisa32 | mipsisa32el \
+	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa64 | mipsisa64el \
+	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64sb1 | mipsisa64sb1el \
+	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipstx39 | mipstx39el \
+	| mn10200 | mn10300 \
+	| ms1 \
+	| msp430 \
+	| ns16k | ns32k \
+	| or32 \
+	| pdp10 | pdp11 | pj | pjl \
+	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+	| pyramid \
+	| sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
+	| sh64 | sh64le \
+	| sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \
+	| sparcv8 | sparcv9 | sparcv9b \
+	| strongarm \
+	| tahoe | thumb | tic4x | tic80 | tron \
+	| v850 | v850e \
+	| we32k \
+	| x86 | xscale | xscalee[bl] | xstormy16 | xtensa \
+	| z8k)
+		basic_machine=$basic_machine-unknown
+		;;
+	m32c)
+		basic_machine=$basic_machine-unknown
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12)
+		# Motorola 68HC11/12.
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+		;;
+
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i*86 | x86_64)
+	  basic_machine=$basic_machine-pc
+	  ;;
+	# Object if more than one company name word.
+	*-*-*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+	# Recognize the basic CPU types with company name.
+	580-* \
+	| a29k-* \
+	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+	| avr-* \
+	| bfin-* | bs2000-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+	| clipper-* | craynv-* | cydra-* \
+	| d10v-* | d30v-* | dlx-* \
+	| elxsi-* \
+	| f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
+	| h8300-* | h8500-* \
+	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| i*86-* | i860-* | i960-* | ia64-* \
+	| ip2k-* | iq2000-* \
+	| m32r-* | m32rle-* \
+	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* \
+	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+	| mips16-* \
+	| mips64-* | mips64el-* \
+	| mips64vr-* | mips64vrel-* \
+	| mips64orion-* | mips64orionel-* \
+	| mips64vr4100-* | mips64vr4100el-* \
+	| mips64vr4300-* | mips64vr4300el-* \
+	| mips64vr5000-* | mips64vr5000el-* \
+	| mips64vr5900-* | mips64vr5900el-* \
+	| mipsisa32-* | mipsisa32el-* \
+	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa64-* | mipsisa64el-* \
+	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64sb1-* | mipsisa64sb1el-* \
+	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipstx39-* | mipstx39el-* \
+	| mmix-* \
+	| ms1-* \
+	| msp430-* \
+	| none-* | np1-* | ns16k-* | ns32k-* \
+	| orion-* \
+	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+	| pyramid-* \
+	| romp-* | rs6000-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \
+	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+	| sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \
+	| sparclite-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
+	| tahoe-* | thumb-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+	| tron-* \
+	| v850-* | v850e-* | vax-* \
+	| we32k-* \
+	| x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \
+	| xstormy16-* | xtensa-* \
+	| ymp-* \
+	| z8k-*)
+		;;
+	m32c-*)
+		;;
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	386bsd)
+		basic_machine=i386-unknown
+		os=-bsd
+		;;
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		basic_machine=m68000-att
+		;;
+	3b*)
+		basic_machine=we32k-att
+		;;
+	a29khif)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+    	abacus)
+		basic_machine=abacus-unknown
+		;;
+	adobe68k)
+		basic_machine=m68010-adobe
+		os=-scout
+		;;
+	alliant | fx80)
+		basic_machine=fx80-alliant
+		;;
+	altos | altos3068)
+		basic_machine=m68k-altos
+		;;
+	am29k)
+		basic_machine=a29k-none
+		os=-bsd
+		;;
+	amd64)
+		basic_machine=x86_64-pc
+		;;
+	amd64-*)
+		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	amdahl)
+		basic_machine=580-amdahl
+		os=-sysv
+		;;
+	amiga | amiga-*)
+		basic_machine=m68k-unknown
+		;;
+	amigaos | amigados)
+		basic_machine=m68k-unknown
+		os=-amigaos
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-unknown
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	apollo68bsd)
+		basic_machine=m68k-apollo
+		os=-bsd
+		;;
+	aux)
+		basic_machine=m68k-apple
+		os=-aux
+		;;
+	balance)
+		basic_machine=ns32k-sequent
+		os=-dynix
+		;;
+	c90)
+		basic_machine=c90-cray
+		os=-unicos
+		;;
+	convex-c1)
+		basic_machine=c1-convex
+		os=-bsd
+		;;
+	convex-c2)
+		basic_machine=c2-convex
+		os=-bsd
+		;;
+	convex-c32)
+		basic_machine=c32-convex
+		os=-bsd
+		;;
+	convex-c34)
+		basic_machine=c34-convex
+		os=-bsd
+		;;
+	convex-c38)
+		basic_machine=c38-convex
+		os=-bsd
+		;;
+	cray | j90)
+		basic_machine=j90-cray
+		os=-unicos
+		;;
+	craynv)
+		basic_machine=craynv-cray
+		os=-unicosmp
+		;;
+	cr16c)
+		basic_machine=cr16c-unknown
+		os=-elf
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	crisv32 | crisv32-* | etraxfs*)
+		basic_machine=crisv32-axis
+		;;
+	cris | cris-* | etrax*)
+		basic_machine=cris-axis
+		;;
+	crx)
+		basic_machine=crx-unknown
+		os=-elf
+		;;
+	da30 | da30-*)
+		basic_machine=m68k-da30
+		;;
+	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+		basic_machine=mips-dec
+		;;
+	decsystem10* | dec10*)
+		basic_machine=pdp10-dec
+		os=-tops10
+		;;
+	decsystem20* | dec20*)
+		basic_machine=pdp10-dec
+		os=-tops20
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		basic_machine=m68k-motorola
+		;;
+	delta88)
+		basic_machine=m88k-motorola
+		os=-sysv3
+		;;
+	djgpp)
+		basic_machine=i586-pc
+		os=-msdosdjgpp
+		;;
+	dpx20 | dpx20-*)
+		basic_machine=rs6000-bull
+		os=-bosx
+		;;
+	dpx2* | dpx2*-bull)
+		basic_machine=m68k-bull
+		os=-sysv3
+		;;
+	ebmon29k)
+		basic_machine=a29k-amd
+		os=-ebmon
+		;;
+	elxsi)
+		basic_machine=elxsi-elxsi
+		os=-bsd
+		;;
+	encore | umax | mmax)
+		basic_machine=ns32k-encore
+		;;
+	es1800 | OSE68k | ose68k | ose | OSE)
+		basic_machine=m68k-ericsson
+		os=-ose
+		;;
+	fx2800)
+		basic_machine=i860-alliant
+		;;
+	genix)
+		basic_machine=ns32k-ns
+		;;
+	gmicro)
+		basic_machine=tron-gmicro
+		os=-sysv
+		;;
+	go32)
+		basic_machine=i386-pc
+		os=-go32
+		;;
+	h3050r* | hiux*)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	h8300hms)
+		basic_machine=h8300-hitachi
+		os=-hms
+		;;
+	h8300xray)
+		basic_machine=h8300-hitachi
+		os=-xray
+		;;
+	h8500hms)
+		basic_machine=h8500-hitachi
+		os=-hms
+		;;
+	harris)
+		basic_machine=m88k-harris
+		os=-sysv3
+		;;
+	hp300-*)
+		basic_machine=m68k-hp
+		;;
+	hp300bsd)
+		basic_machine=m68k-hp
+		os=-bsd
+		;;
+	hp300hpux)
+		basic_machine=m68k-hp
+		os=-hpux
+		;;
+	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		basic_machine=m68000-hp
+		;;
+	hp9k3[2-9][0-9])
+		basic_machine=m68k-hp
+		;;
+	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k78[0-9] | hp78[0-9])
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][13679] | hp8[0-9][13679])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hppa-next)
+		os=-nextstep3
+		;;
+	hppaosf)
+		basic_machine=hppa1.1-hp
+		os=-osf
+		;;
+	hppro)
+		basic_machine=hppa1.1-hp
+		os=-proelf
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+	i*86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv32
+		;;
+	i*86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv4
+		;;
+	i*86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv
+		;;
+	i*86sol2)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-solaris2
+		;;
+	i386mach)
+		basic_machine=i386-mach
+		os=-mach
+		;;
+	i386-vsta | vsta)
+		basic_machine=i386-unknown
+		os=-vsta
+		;;
+	iris | iris4d)
+		basic_machine=mips-sgi
+		case $os in
+		    -irix*)
+			;;
+		    *)
+			os=-irix4
+			;;
+		esac
+		;;
+	isi68 | isi)
+		basic_machine=m68k-isi
+		os=-sysv
+		;;
+	m88k-omron*)
+		basic_machine=m88k-omron
+		;;
+	magnum | m3230)
+		basic_machine=mips-mips
+		os=-sysv
+		;;
+	merlin)
+		basic_machine=ns32k-utek
+		os=-sysv
+		;;
+	mingw32)
+		basic_machine=i386-pc
+		os=-mingw32
+		;;
+	miniframe)
+		basic_machine=m68000-convergent
+		;;
+	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+	mips3*-*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	monitor)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	morphos)
+		basic_machine=powerpc-unknown
+		os=-morphos
+		;;
+	msdos)
+		basic_machine=i386-pc
+		os=-msdos
+		;;
+	mvs)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	netbsd386)
+		basic_machine=i386-unknown
+		os=-netbsd
+		;;
+	netwinder)
+		basic_machine=armv4l-rebel
+		os=-linux
+		;;
+	news | news700 | news800 | news900)
+		basic_machine=m68k-sony
+		os=-newsos
+		;;
+	news1000)
+		basic_machine=m68030-sony
+		os=-newsos
+		;;
+	news-3600 | risc-news)
+		basic_machine=mips-sony
+		os=-newsos
+		;;
+	necv70)
+		basic_machine=v70-nec
+		os=-sysv
+		;;
+	next | m*-next )
+		basic_machine=m68k-next
+		case $os in
+		    -nextstep* )
+			;;
+		    -ns2*)
+		      os=-nextstep2
+			;;
+		    *)
+		      os=-nextstep3
+			;;
+		esac
+		;;
+	nh3000)
+		basic_machine=m68k-harris
+		os=-cxux
+		;;
+	nh[45]000)
+		basic_machine=m88k-harris
+		os=-cxux
+		;;
+	nindy960)
+		basic_machine=i960-intel
+		os=-nindy
+		;;
+	mon960)
+		basic_machine=i960-intel
+		os=-mon960
+		;;
+	nonstopux)
+		basic_machine=mips-compaq
+		os=-nonstopux
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	nsr-tandem)
+		basic_machine=nsr-tandem
+		;;
+	op50n-* | op60c-*)
+		basic_machine=hppa1.1-oki
+		os=-proelf
+		;;
+	openrisc | openrisc-*)
+		basic_machine=or32-unknown
+		;;
+	os400)
+		basic_machine=powerpc-ibm
+		os=-os400
+		;;
+	OSE68000 | ose68000)
+		basic_machine=m68000-ericsson
+		os=-ose
+		;;
+	os68k)
+		basic_machine=m68k-none
+		os=-os68k
+		;;
+	pa-hitachi)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	paragon)
+		basic_machine=i860-intel
+		os=-osf
+		;;
+	pbd)
+		basic_machine=sparc-tti
+		;;
+	pbb)
+		basic_machine=m68k-tti
+		;;
+	pc532 | pc532-*)
+		basic_machine=ns32k-pc532
+		;;
+	pentium | p5 | k5 | k6 | nexgen | viac3)
+		basic_machine=i586-pc
+		;;
+	pentiumpro | p6 | 6x86 | athlon | athlon_*)
+		basic_machine=i686-pc
+		;;
+	pentiumii | pentium2 | pentiumiii | pentium3)
+		basic_machine=i686-pc
+		;;
+	pentium4)
+		basic_machine=i786-pc
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium4-*)
+		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=power-ibm
+		;;
+	ppc)	basic_machine=powerpc-unknown
+		;;
+	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppcle | powerpclittle | ppc-le | powerpc-little)
+		basic_machine=powerpcle-unknown
+		;;
+	ppcle-* | powerpclittle-*)
+		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64)	basic_machine=powerpc64-unknown
+		;;
+	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+		basic_machine=powerpc64le-unknown
+		;;
+	ppc64le-* | powerpc64little-*)
+		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	pw32)
+		basic_machine=i586-unknown
+		os=-pw32
+		;;
+	rom68k)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	rm[46]00)
+		basic_machine=mips-siemens
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	s390 | s390-*)
+		basic_machine=s390-ibm
+		;;
+	s390x | s390x-*)
+		basic_machine=s390x-ibm
+		;;
+	sa29200)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	sb1)
+		basic_machine=mipsisa64sb1-unknown
+		;;
+	sb1el)
+		basic_machine=mipsisa64sb1el-unknown
+		;;
+	sei)
+		basic_machine=mips-sei
+		os=-seiux
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sh64)
+		basic_machine=sh64-unknown
+		;;
+	sparclite-wrs | simso-wrs)
+		basic_machine=sparclite-wrs
+		os=-vxworks
+		;;
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
+		;;
+	spur)
+		basic_machine=spur-unknown
+		;;
+	st2000)
+		basic_machine=m68k-tandem
+		;;
+	stratus)
+		basic_machine=i860-stratus
+		os=-sysv4
+		;;
+	sun2)
+		basic_machine=m68000-sun
+		;;
+	sun2os3)
+		basic_machine=m68000-sun
+		os=-sunos3
+		;;
+	sun2os4)
+		basic_machine=m68000-sun
+		os=-sunos4
+		;;
+	sun3os3)
+		basic_machine=m68k-sun
+		os=-sunos3
+		;;
+	sun3os4)
+		basic_machine=m68k-sun
+		os=-sunos4
+		;;
+	sun4os3)
+		basic_machine=sparc-sun
+		os=-sunos3
+		;;
+	sun4os4)
+		basic_machine=sparc-sun
+		os=-sunos4
+		;;
+	sun4sol2)
+		basic_machine=sparc-sun
+		os=-solaris2
+		;;
+	sun3 | sun3-*)
+		basic_machine=m68k-sun
+		;;
+	sun4)
+		basic_machine=sparc-sun
+		;;
+	sun386 | sun386i | roadrunner)
+		basic_machine=i386-sun
+		;;
+	sv1)
+		basic_machine=sv1-cray
+		os=-unicos
+		;;
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
+		;;
+	t3e)
+		basic_machine=alphaev5-cray
+		os=-unicos
+		;;
+	t90)
+		basic_machine=t90-cray
+		os=-unicos
+		;;
+	tic54x | c54x*)
+		basic_machine=tic54x-unknown
+		os=-coff
+		;;
+	tic55x | c55x*)
+		basic_machine=tic55x-unknown
+		os=-coff
+		;;
+	tic6x | c6x*)
+		basic_machine=tic6x-unknown
+		os=-coff
+		;;
+	tx39)
+		basic_machine=mipstx39-unknown
+		;;
+	tx39el)
+		basic_machine=mipstx39el-unknown
+		;;
+	toad1)
+		basic_machine=pdp10-xkl
+		os=-tops20
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	tpf)
+		basic_machine=s390x-ibm
+		os=-tpf
+		;;
+	udi29k)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
+		;;
+	v810 | necv810)
+		basic_machine=v810-nec
+		os=-none
+		;;
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
+		;;
+	vms)
+		basic_machine=vax-dec
+		os=-vms
+		;;
+	vpp*|vx|vx-*)
+		basic_machine=f301-fujitsu
+		;;
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
+		;;
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
+		;;
+	vxworks29k)
+		basic_machine=a29k-wrs
+		os=-vxworks
+		;;
+	w65*)
+		basic_machine=w65-wdc
+		os=-none
+		;;
+	w89k-*)
+		basic_machine=hppa1.1-winbond
+		os=-proelf
+		;;
+	xbox)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	z8k-*-coff)
+		basic_machine=z8k-unknown
+		os=-sim
+		;;
+	none)
+		basic_machine=none-none
+		os=-none
+		;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		basic_machine=hppa1.1-winbond
+		;;
+	op50n)
+		basic_machine=hppa1.1-oki
+		;;
+	op60c)
+		basic_machine=hppa1.1-oki
+		;;
+	romp)
+		basic_machine=romp-ibm
+		;;
+	mmix)
+		basic_machine=mmix-knuth
+		;;
+	rs6000)
+		basic_machine=rs6000-ibm
+		;;
+	vax)
+		basic_machine=vax-dec
+		;;
+	pdp10)
+		# there are many clones, so DEC is not a safe bet
+		basic_machine=pdp10-unknown
+		;;
+	pdp11)
+		basic_machine=pdp11-dec
+		;;
+	we32k)
+		basic_machine=we32k-att
+		;;
+	sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
+		basic_machine=sh-unknown
+		;;
+	sparc | sparcv8 | sparcv9 | sparcv9b)
+		basic_machine=sparc-sun
+		;;
+	cydra)
+		basic_machine=cydra-cydrome
+		;;
+	orion)
+		basic_machine=orion-highlevel
+		;;
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	mac | mpw | mac-mpw)
+		basic_machine=m68k-apple
+		;;
+	pmac | pmac-mpw)
+		basic_machine=powerpc-apple
+		;;
+	*-unknown)
+		# Make sure to match an already-canonicalized machine name.
+		;;
+	*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+	*-digital*)
+		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+		;;
+	*-commodore*)
+		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+        # First match some system type aliases
+        # that might get confused with valid system types.
+	# -solaris* is a basic system type, with this one exception.
+	-solaris1 | -solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	-solaris)
+		os=-solaris2
+		;;
+	-svr4*)
+		os=-sysv4
+		;;
+	-unixware*)
+		os=-sysv4.2uw
+		;;
+	-gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+		;;
+	# First accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST END IN A *, to match a version number.
+	# -sysv* is not here because it comes later, after sysvr4.
+	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+	      | -aos* \
+	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \
+	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+	      | -chorusos* | -chorusrdb* \
+	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+	      | -skyos* | -haiku*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	-qnx*)
+		case $basic_machine in
+		    x86-* | i*86-*)
+			;;
+		    *)
+			os=-nto$os
+			;;
+		esac
+		;;
+	-nto-qnx*)
+		;;
+	-nto*)
+		os=`echo $os | sed -e 's|nto|nto-qnx|'`
+		;;
+	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+		;;
+	-mac*)
+		os=`echo $os | sed -e 's|mac|macos|'`
+		;;
+	-linux-dietlibc)
+		os=-linux-dietlibc
+		;;
+	-linux*)
+		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+		;;
+	-sunos5*)
+		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+		;;
+	-sunos6*)
+		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+		;;
+	-opened*)
+		os=-openedition
+		;;
+        -os400*)
+		os=-os400
+		;;
+	-wince*)
+		os=-wince
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-atheos*)
+		os=-atheos
+		;;
+	-syllable*)
+		os=-syllable
+		;;
+	-386bsd)
+		os=-bsd
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	-nova*)
+		os=-rtmk-nova
+		;;
+	-ns2 )
+		os=-nextstep2
+		;;
+	-nsk*)
+		os=-nsk
+		;;
+	# Preserve the version number of sinix5.
+	-sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	-sinix*)
+		os=-sysv4
+		;;
+        -tpf*)
+		os=-tpf
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-svr4)
+		os=-sysv4
+		;;
+	-svr3)
+		os=-sysv3
+		;;
+	-sysvr4)
+		os=-sysv4
+		;;
+	# This must come after -sysvr4.
+	-sysv*)
+		;;
+	-ose*)
+		os=-ose
+		;;
+	-es1800*)
+		os=-ose
+		;;
+	-xenix)
+		os=-xenix
+		;;
+	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+		os=-mint
+		;;
+	-aros*)
+		os=-aros
+		;;
+	-kaos*)
+		os=-kaos
+		;;
+	-zvmoe)
+		os=-zvmoe
+		;;
+	-none)
+		;;
+	*)
+		# Get rid of the `-' at the beginning of $os.
+		os=`echo $os | sed 's/[^-]*-//'`
+		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+		exit 1
+		;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+	*-acorn)
+		os=-riscix1.2
+		;;
+	arm*-rebel)
+		os=-linux
+		;;
+	arm*-semi)
+		os=-aout
+		;;
+    c4x-* | tic4x-*)
+        os=-coff
+        ;;
+	# This must come before the *-dec entry.
+	pdp10-*)
+		os=-tops20
+		;;
+	pdp11-*)
+		os=-none
+		;;
+	*-dec | vax-*)
+		os=-ultrix4.2
+		;;
+	m68*-apollo)
+		os=-domain
+		;;
+	i386-sun)
+		os=-sunos4.0.2
+		;;
+	m68000-sun)
+		os=-sunos3
+		# This also exists in the configure program, but was not the
+		# default.
+		# os=-sunos4
+		;;
+	m68*-cisco)
+		os=-aout
+		;;
+	mips*-cisco)
+		os=-elf
+		;;
+	mips*-*)
+		os=-elf
+		;;
+	or32-*)
+		os=-coff
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	*-be)
+		os=-beos
+		;;
+	*-haiku)
+		os=-haiku
+		;;
+	*-ibm)
+		os=-aix
+		;;
+    	*-knuth)
+		os=-mmixware
+		;;
+	*-wec)
+		os=-proelf
+		;;
+	*-winbond)
+		os=-proelf
+		;;
+	*-oki)
+		os=-proelf
+		;;
+	*-hp)
+		os=-hpux
+		;;
+	*-hitachi)
+		os=-hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=-sysv
+		;;
+	*-cbm)
+		os=-amigaos
+		;;
+	*-dg)
+		os=-dgux
+		;;
+	*-dolphin)
+		os=-sysv3
+		;;
+	m68k-ccur)
+		os=-rtu
+		;;
+	m88k-omron*)
+		os=-luna
+		;;
+	*-next )
+		os=-nextstep
+		;;
+	*-sequent)
+		os=-ptx
+		;;
+	*-crds)
+		os=-unos
+		;;
+	*-ns)
+		os=-genix
+		;;
+	i370-*)
+		os=-mvs
+		;;
+	*-next)
+		os=-nextstep3
+		;;
+	*-gould)
+		os=-sysv
+		;;
+	*-highlevel)
+		os=-bsd
+		;;
+	*-encore)
+		os=-bsd
+		;;
+	*-sgi)
+		os=-irix
+		;;
+	*-siemens)
+		os=-sysv4
+		;;
+	*-masscomp)
+		os=-rtu
+		;;
+	f30[01]-fujitsu | f700-fujitsu)
+		os=-uxpv
+		;;
+	*-rom68k)
+		os=-coff
+		;;
+	*-*bug)
+		os=-coff
+		;;
+	*-apple)
+		os=-macos
+		;;
+	*-atari*)
+		os=-mint
+		;;
+	*)
+		os=-none
+		;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+	*-unknown)
+		case $os in
+			-riscix*)
+				vendor=acorn
+				;;
+			-sunos*)
+				vendor=sun
+				;;
+			-aix*)
+				vendor=ibm
+				;;
+			-beos*)
+				vendor=be
+				;;
+			-hpux*)
+				vendor=hp
+				;;
+			-mpeix*)
+				vendor=hp
+				;;
+			-hiux*)
+				vendor=hitachi
+				;;
+			-unos*)
+				vendor=crds
+				;;
+			-dgux*)
+				vendor=dg
+				;;
+			-luna*)
+				vendor=omron
+				;;
+			-genix*)
+				vendor=ns
+				;;
+			-mvs* | -opened*)
+				vendor=ibm
+				;;
+			-os400*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+			-tpf*)
+				vendor=ibm
+				;;
+			-vxsim* | -vxworks* | -windiss*)
+				vendor=wrs
+				;;
+			-aux*)
+				vendor=apple
+				;;
+			-hms*)
+				vendor=hitachi
+				;;
+			-mpw* | -macos*)
+				vendor=apple
+				;;
+			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+				vendor=atari
+				;;
+			-vos*)
+				vendor=stratus
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbdel-src/configure
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbdel-src/configure	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbdel-src/configure	(revision 24799)
@@ -0,0 +1,5003 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.59 for tdbdel 1.0.
+#
+# Report bugs to <jmt12@cs.waikato.ac.nz>.
+#
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)$' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\/\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  case $0 in
+    *[\\/]* ) as_myself=$0 ;;
+    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+       ;;
+  esac
+  # We did not find ourselves, most probably we were run as `sh COMMAND'
+  # in which case we are not to be found in the path.
+  if test "x$as_myself" = x; then
+    as_myself=$0
+  fi
+  if test ! -f "$as_myself"; then
+    { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+	 case $as_dir in
+	 /*)
+	   if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+	     CONFIG_SHELL=$as_dir/$as_base
+	     export CONFIG_SHELL
+	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+	   fi;;
+	 esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='	' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" 	$as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_config_libobj_dir=.
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete.  It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: ${ac_max_here_lines=38}
+
+# Identity of this package.
+PACKAGE_NAME='tdbdel'
+PACKAGE_TARNAME='tdbdel'
+PACKAGE_VERSION='1.0'
+PACKAGE_STRING='tdbdel 1.0'
+PACKAGE_BUGREPORT='jmt12@cs.waikato.ac.nz'
+
+ac_unique_file="tdbdel.cpp"
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar build build_cpu build_vendor build_os host host_cpu host_vendor host_os CXX CXXFLAGS LDFLAGS CPPFLAGS ac_ct_CXX EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CC CFLAGS ac_ct_CC CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CPP LIBOBJS LTLIBOBJS'
+ac_subst_files=''
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+ac_prev=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval "$ac_prev=\$ac_option"
+    ac_prev=
+    continue
+  fi
+
+  ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_option in
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+  | --da=*)
+    datadir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    eval "enable_$ac_feature=no" ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    case $ac_option in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "enable_$ac_feature='$ac_optarg'" ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst \
+  | --locals | --local | --loca | --loc | --lo)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    case $ac_option in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "with_$ac_package='$ac_optarg'" ;;
+
+  -without-* | --without-*)
+    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/-/_/g'`
+    eval "with_$ac_package=no" ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+    eval "$ac_envvar='$ac_optarg'"
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  { echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+  eval ac_val=$`echo $ac_var`
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
+	      localstatedir libdir includedir oldincludedir infodir mandir
+do
+  eval ac_val=$`echo $ac_var`
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* ) ;;
+    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then its parent.
+  ac_confdir=`(dirname "$0") 2>/dev/null ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$0" : 'X\(//\)[^/]' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$0" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r $srcdir/$ac_unique_file; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+  if test "$ac_srcdir_defaulted" = yes; then
+    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+   { (exit 1); exit 1; }; }
+  else
+    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+   { (exit 1); exit 1; }; }
+  fi
+fi
+(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
+  { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
+   { (exit 1); exit 1; }; }
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_CXX_set=${CXX+set}
+ac_env_CXX_value=$CXX
+ac_cv_env_CXX_set=${CXX+set}
+ac_cv_env_CXX_value=$CXX
+ac_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_env_CXXFLAGS_value=$CXXFLAGS
+ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_cv_env_CXXFLAGS_value=$CXXFLAGS
+ac_env_LDFLAGS_set=${LDFLAGS+set}
+ac_env_LDFLAGS_value=$LDFLAGS
+ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
+ac_cv_env_LDFLAGS_value=$LDFLAGS
+ac_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_env_CPPFLAGS_value=$CPPFLAGS
+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_cv_env_CPPFLAGS_value=$CPPFLAGS
+ac_env_CC_set=${CC+set}
+ac_env_CC_value=$CC
+ac_cv_env_CC_set=${CC+set}
+ac_cv_env_CC_value=$CC
+ac_env_CFLAGS_set=${CFLAGS+set}
+ac_env_CFLAGS_value=$CFLAGS
+ac_cv_env_CFLAGS_set=${CFLAGS+set}
+ac_cv_env_CFLAGS_value=$CFLAGS
+ac_env_CPP_set=${CPP+set}
+ac_env_CPP_value=$CPP
+ac_cv_env_CPP_set=${CPP+set}
+ac_cv_env_CPP_value=$CPP
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures tdbdel 1.0 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+_ACEOF
+
+  cat <<_ACEOF
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+			  [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+			  [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR           user executables [EPREFIX/bin]
+  --sbindir=DIR          system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR       program executables [EPREFIX/libexec]
+  --datadir=DIR          read-only architecture-independent data [PREFIX/share]
+  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
+  --libdir=DIR           object code libraries [EPREFIX/lib]
+  --includedir=DIR       C header files [PREFIX/include]
+  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
+  --infodir=DIR          info documentation [PREFIX/info]
+  --mandir=DIR           man documentation [PREFIX/man]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of tdbdel 1.0:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors
+
+Some influential environment variables:
+  CXX         C++ compiler command
+  CXXFLAGS    C++ compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have
+              headers in a nonstandard directory <include dir>
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  CPP         C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <jmt12@cs.waikato.ac.nz>.
+_ACEOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  ac_popdir=`pwd`
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d $ac_dir || continue
+    ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
+
+    cd $ac_dir
+    # Check for guested configure; otherwise get Cygnus style configure.
+    if test -f $ac_srcdir/configure.gnu; then
+      echo
+      $SHELL $ac_srcdir/configure.gnu  --help=recursive
+    elif test -f $ac_srcdir/configure; then
+      echo
+      $SHELL $ac_srcdir/configure  --help=recursive
+    elif test -f $ac_srcdir/configure.ac ||
+	   test -f $ac_srcdir/configure.in; then
+      echo
+      $ac_configure --help
+    else
+      echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi
+    cd $ac_popdir
+  done
+fi
+
+test -n "$ac_init_help" && exit 0
+if $ac_init_version; then
+  cat <<\_ACEOF
+tdbdel configure 1.0
+generated by GNU Autoconf 2.59
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit 0
+fi
+exec 5>config.log
+cat >&5 <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by tdbdel $as_me 1.0, which was
+generated by GNU Autoconf 2.59.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo               = `(hostinfo) 2>/dev/null               || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  echo "PATH: $as_dir"
+done
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_sep=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+      ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+    2)
+      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+	ac_must_keep_next=false # Got value, back to normal.
+      else
+	case $ac_arg in
+	  *=* | --config-cache | -C | -disable-* | --disable-* \
+	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+	  | -with-* | --with-* | -without-* | --without-* | --x)
+	    case "$ac_configure_args0 " in
+	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+	    esac
+	    ;;
+	  -* ) ac_must_keep_next=true ;;
+	esac
+      fi
+      ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+      # Get rid of the leading space.
+      ac_sep=" "
+      ;;
+    esac
+  done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Be sure not to use single quotes in there, as some shells,
+# such as our DU 5.0 friend, will then `close' the trap.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+{
+  (set) 2>&1 |
+    case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      sed -n \
+	"s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+      ;;
+    *)
+      sed -n \
+	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+}
+    echo
+
+    cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=$`echo $ac_var`
+      echo "$ac_var='"'"'$ac_val'"'"'"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      cat <<\_ASBOX
+## ------------- ##
+## Output files. ##
+## ------------- ##
+_ASBOX
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=$`echo $ac_var`
+	echo "$ac_var='"'"'$ac_val'"'"'"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+      echo
+      sed "/^$/d" confdefs.h | sort
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      echo "$as_me: caught signal $ac_signal"
+    echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core &&
+  rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+     ' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+  if test "x$prefix" != xNONE; then
+    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+  else
+    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+  fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+  if test -r "$ac_site_file"; then
+    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . $cache_file;;
+      *)                      . ./$cache_file;;
+    esac
+  fi
+else
+  { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+	       sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+  eval ac_new_val="\$ac_env_${ac_var}_value"
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+	{ echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	{ echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
+echo "$as_me:   former value:  $ac_old_val" >&2;}
+	{ echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
+echo "$as_me:   current value: $ac_new_val" >&2;}
+	ac_cache_corrupted=:
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+      ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+am__api_version="1.9"
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+  if test -f $ac_dir/install-sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f $ac_dir/install.sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f $ac_dir/shtool; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
+echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"
+ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+  ./ | .// | /cC/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+	if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	    break 3
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+done
+
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  We don't cache a
+    # path for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the path is relative.
+    INSTALL=$ac_install_sh
+  fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$*" != "X $srcdir/configure conftest.file" \
+      && test "$*" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      { { echo "$as_me:$LINENO: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" >&5
+echo "$as_me: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" >&2;}
+   { (exit 1); exit 1; }; }
+   fi
+
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   { { echo "$as_me:$LINENO: error: newly created file is older than distributed files!
+Check your system clock" >&5
+echo "$as_me: error: newly created file is older than distributed files!
+Check your system clock" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+test "$program_prefix" != NONE &&
+  program_transform_name="s,^,$program_prefix,;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s,\$,$program_suffix,;$program_transform_name"
+# Double any \ or $.  echo might interpret backslashes.
+# By default was `s,x,x', remove it if useless.
+cat <<\_ACEOF >conftest.sed
+s/[\\$]/&&/g;s/;s,x,x,$//
+_ACEOF
+program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
+rm conftest.sed
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+  # We used to keeping the `.' as first argument, in order to
+  # allow $(mkdir_p) to be used without argument.  As in
+  #   $(mkdir_p) $(somedir)
+  # where $(somedir) is conditionally defined.  However this is wrong
+  # for two reasons:
+  #  1. if the package is installed by a user who cannot write `.'
+  #     make install will fail,
+  #  2. the above comment should most certainly read
+  #     $(mkdir_p) $(DESTDIR)$(somedir)
+  #     so it does not work when $(somedir) is undefined and
+  #     $(DESTDIR) is not.
+  #  To support the latter case, we have to write
+  #     test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+  #  so the `.' trick is pointless.
+  mkdir_p='mkdir -p --'
+else
+  # On NextStep and OpenStep, the `mkdir' command does not
+  # recognize any option.  It will interpret all options as
+  # directories to create, and then abort because `.' already
+  # exists.
+  for d in ./-p ./--version;
+  do
+    test -d $d && rmdir $d
+  done
+  # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+  if test -f "$ac_aux_dir/mkinstalldirs"; then
+    mkdir_p='$(mkinstalldirs)'
+  else
+    mkdir_p='$(install_sh) -d'
+  fi
+fi
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AWK+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AWK="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  echo "$as_me:$LINENO: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$AWK" && break
+done
+
+echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.make <<\_ACEOF
+all:
+	@echo 'ac_maketemp="$(MAKE)"'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+  eval ac_cv_prog_make_${ac_make}_set=yes
+else
+  eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftest.make
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+  SET_MAKE=
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+   test -f $srcdir/config.status; then
+  { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
+echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='tdbdel'
+ VERSION='1.0'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_STRIP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  STRIP=$ac_ct_STRIP
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+# Make sure we can run config.sub.
+$ac_config_sub sun4 >/dev/null 2>&1 ||
+  { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5
+echo "$as_me: error: cannot run $ac_config_sub" >&2;}
+   { (exit 1); exit 1; }; }
+
+echo "$as_me:$LINENO: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6
+if test "${ac_cv_build+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_build_alias=$build_alias
+test -z "$ac_cv_build_alias" &&
+  ac_cv_build_alias=`$ac_config_guess`
+test -z "$ac_cv_build_alias" &&
+  { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
+echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+   { (exit 1); exit 1; }; }
+ac_cv_build=`$ac_config_sub $ac_cv_build_alias` ||
+  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6
+build=$ac_cv_build
+build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+echo "$as_me:$LINENO: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6
+if test "${ac_cv_host+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_host_alias=$host_alias
+test -z "$ac_cv_host_alias" &&
+  ac_cv_host_alias=$ac_cv_build_alias
+ac_cv_host=`$ac_config_sub $ac_cv_host_alias` ||
+  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6
+host=$ac_cv_host
+host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+
+          ac_config_headers="$ac_config_headers config.h"
+
+
+# Checks for programs.
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  echo "$as_me:$LINENO: result: $CXX" >&5
+echo "${ECHO_T}$CXX" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$CXX" && break
+  done
+fi
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CXX="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5
+echo "${ECHO_T}$ac_ct_CXX" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_CXX" && break
+done
+test -n "$ac_ct_CXX" || ac_ct_CXX="g++"
+
+  CXX=$ac_ct_CXX
+fi
+
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+     "checking for C++ compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+  (eval $ac_compiler --version </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+  (eval $ac_compiler -v </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+  (eval $ac_compiler -V </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+echo "$as_me:$LINENO: checking for C++ compiler default output file name" >&5
+echo $ECHO_N "checking for C++ compiler default output file name... $ECHO_C" >&6
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
+  (eval $ac_link_default) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # Find the output, starting from the most likely.  This scheme is
+# not robust to junk in `.', hence go to wildcards (a.*) only as a last
+# resort.
+
+# Be careful to initialize this variable, since it used to be cached.
+# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
+ac_cv_exeext=
+# b.out is created by i960 compilers.
+for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
+	;;
+    conftest.$ac_ext )
+	# This is the source file.
+	;;
+    [ab].out )
+	# We found the default executable, but exeext='' is most
+	# certainly right.
+	break;;
+    *.* )
+	ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	# FIXME: I believe we export ac_cv_exeext for Libtool,
+	# but it would be cool to find out if it's true.  Does anybody
+	# maintain Libtool? --akim.
+	export ac_cv_exeext
+	break;;
+    * )
+	break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C++ compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C++ compiler cannot create executables
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6
+
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether the C++ compiler works" >&5
+echo $ECHO_N "checking whether the C++ compiler works... $ECHO_C" >&6
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+  if { ac_try='./$ac_file'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { echo "$as_me:$LINENO: error: cannot run C++ compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C++ compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+  fi
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6
+
+echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	  export ac_cv_exeext
+	  break;;
+    * ) break;;
+  esac
+done
+else
+  { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
+if test "${ac_cv_objext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6
+if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6
+GXX=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+CXXFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5
+echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cxx_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cxx_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cxx_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
+  else
+    CXXFLAGS="-g"
+  fi
+else
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
+  else
+    CXXFLAGS=
+  fi
+fi
+for ac_declaration in \
+   '' \
+   'extern "C" void std::exit (int) throw (); using std::exit;' \
+   'extern "C" void std::exit (int); using std::exit;' \
+   'extern "C" void exit (int) throw ();' \
+   'extern "C" void exit (int);' \
+   'void exit (int);'
+do
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+  echo '#ifdef __cplusplus' >>confdefs.h
+  echo $ac_declaration      >>confdefs.h
+  echo '#endif'             >>confdefs.h
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+DEPDIR="${am__leading_dot}deps"
+
+          ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
+echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+   am__include=include
+   am__quote=
+   _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+      am__include=.include
+      am__quote="\""
+      _am_result=BSD
+   fi
+fi
+
+
+echo "$as_me:$LINENO: result: $_am_result" >&5
+echo "${ECHO_T}$_am_result" >&6
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then
+  enableval="$enable_dependency_tracking"
+
+fi;
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+
+
+if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+
+
+depcc="$CXX"  am_compiler_list=
+
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CXX_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CXX_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+
+
+if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+  am__fastdepCXX_TRUE=
+  am__fastdepCXX_FALSE='#'
+else
+  am__fastdepCXX_TRUE='#'
+  am__fastdepCXX_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_CC" && break
+done
+
+  CC=$ac_ct_CC
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+     "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+  (eval $ac_compiler --version </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+  (eval $ac_compiler -v </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+  (eval $ac_compiler -V </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cc_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std1 is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std1.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX			-qlanglvl=ansi
+# Ultrix and OSF/1	-std1
+# HP-UX 10.20 and later	-Ae
+# HP-UX older versions	-Aa -D_HPUX_SOURCE
+# SVR4			-Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext
+done
+rm -f conftest.$ac_ext conftest.$ac_objext
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+  x|xno)
+    echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+  *)
+    echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+    CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+# Some people use a C++ compiler to compile C.  Since we use `exit',
+# in C++ we need to declare it.  In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >conftest.$ac_ext <<_ACEOF
+#ifndef __cplusplus
+  choke me
+#endif
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  for ac_declaration in \
+   '' \
+   'extern "C" void std::exit (int) throw (); using std::exit;' \
+   'extern "C" void std::exit (int); using std::exit;' \
+   'extern "C" void exit (int) throw ();' \
+   'extern "C" void exit (int);' \
+   'void exit (int);'
+do
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+  echo '#ifdef __cplusplus' >>confdefs.h
+  echo $ac_declaration      >>confdefs.h
+  echo '#endif'             >>confdefs.h
+fi
+
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CC"   am_compiler_list=
+
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+
+
+if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if test "${ac_cv_prog_CPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
+else
+  { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Checks for libraries.
+
+# Checks for header files.
+
+# Checks for typedefs, structures, and compiler characteristics.
+
+# Checks for library functions.
+
+# Completion
+          ac_config_files="$ac_config_files Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+{
+  (set) 2>&1 |
+    case `(ac_space=' '; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+	"s/'/'\\\\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;;
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n \
+	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+} |
+  sed '
+     t clear
+     : clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     : end' >>confcache
+if diff $cache_file confcache >/dev/null 2>&1; then :; else
+  if test -w $cache_file; then
+    test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+    cat confcache >$cache_file
+  else
+    echo "not updating unwritable cache $cache_file"
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[	 ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[	 ]*$//;
+}'
+fi
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_i=`echo "$ac_i" |
+	 sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
+  # 2. Add them.
+  ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)$' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\/\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  case $0 in
+    *[\\/]* ) as_myself=$0 ;;
+    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+       ;;
+  esac
+  # We did not find ourselves, most probably we were run as `sh COMMAND'
+  # in which case we are not to be found in the path.
+  if test "x$as_myself" = x; then
+    as_myself=$0
+  fi
+  if test ! -f "$as_myself"; then
+    { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+	 case $as_dir in
+	 /*)
+	   if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+	     CONFIG_SHELL=$as_dir/$as_base
+	     export CONFIG_SHELL
+	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+	   fi;;
+	 esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='	' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" 	$as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.  Logging --version etc. is OK.
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by tdbdel $as_me 1.0, which was
+generated by GNU Autoconf 2.59.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+  echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_headers"; then
+  echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_links"; then
+  echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_commands"; then
+  echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number, then exit
+  -q, --quiet      do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+		   instantiate the configuration file FILE
+  --header=FILE[:TEMPLATE]
+		   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <bug-autoconf@gnu.org>."
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+tdbdel config.status 1.0
+configured by $0, generated by GNU Autoconf 2.59,
+  with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=$srcdir
+INSTALL="$INSTALL"
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "x$1" : 'x\([^=]*\)='`
+    ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  -*)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  *) # This is not an option, so the user has probably given explicit
+     # arguments.
+     ac_option=$1
+     ac_need_defaults=false;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --vers* | -V )
+    echo "$ac_cs_version"; exit 0 ;;
+  --he | --h)
+    # Conflict between --help and --header
+    { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; };;
+  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit 0 ;;
+  --debug | --d* | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+    ac_need_defaults=false;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1" ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+  echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+  exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+#
+# INIT-COMMANDS section.
+#
+
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+_ACEOF
+
+
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_config_target in $ac_config_targets
+do
+  case "$ac_config_target" in
+  # Handling of arguments.
+  "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+  "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+  "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason to put it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./confstat$$-$RANDOM
+  (umask 077 && mkdir $tmp)
+} ||
+{
+   echo "$me: cannot create a temporary directory in ." >&2
+   { (exit 1); exit 1; }
+}
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+  # Protect against being on the right side of a sed subst in config.status.
+  sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+   s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
+s,@SHELL@,$SHELL,;t t
+s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s,@exec_prefix@,$exec_prefix,;t t
+s,@prefix@,$prefix,;t t
+s,@program_transform_name@,$program_transform_name,;t t
+s,@bindir@,$bindir,;t t
+s,@sbindir@,$sbindir,;t t
+s,@libexecdir@,$libexecdir,;t t
+s,@datadir@,$datadir,;t t
+s,@sysconfdir@,$sysconfdir,;t t
+s,@sharedstatedir@,$sharedstatedir,;t t
+s,@localstatedir@,$localstatedir,;t t
+s,@libdir@,$libdir,;t t
+s,@includedir@,$includedir,;t t
+s,@oldincludedir@,$oldincludedir,;t t
+s,@infodir@,$infodir,;t t
+s,@mandir@,$mandir,;t t
+s,@build_alias@,$build_alias,;t t
+s,@host_alias@,$host_alias,;t t
+s,@target_alias@,$target_alias,;t t
+s,@DEFS@,$DEFS,;t t
+s,@ECHO_C@,$ECHO_C,;t t
+s,@ECHO_N@,$ECHO_N,;t t
+s,@ECHO_T@,$ECHO_T,;t t
+s,@LIBS@,$LIBS,;t t
+s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
+s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
+s,@INSTALL_DATA@,$INSTALL_DATA,;t t
+s,@CYGPATH_W@,$CYGPATH_W,;t t
+s,@PACKAGE@,$PACKAGE,;t t
+s,@VERSION@,$VERSION,;t t
+s,@ACLOCAL@,$ACLOCAL,;t t
+s,@AUTOCONF@,$AUTOCONF,;t t
+s,@AUTOMAKE@,$AUTOMAKE,;t t
+s,@AUTOHEADER@,$AUTOHEADER,;t t
+s,@MAKEINFO@,$MAKEINFO,;t t
+s,@install_sh@,$install_sh,;t t
+s,@STRIP@,$STRIP,;t t
+s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t
+s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t
+s,@mkdir_p@,$mkdir_p,;t t
+s,@AWK@,$AWK,;t t
+s,@SET_MAKE@,$SET_MAKE,;t t
+s,@am__leading_dot@,$am__leading_dot,;t t
+s,@AMTAR@,$AMTAR,;t t
+s,@am__tar@,$am__tar,;t t
+s,@am__untar@,$am__untar,;t t
+s,@build@,$build,;t t
+s,@build_cpu@,$build_cpu,;t t
+s,@build_vendor@,$build_vendor,;t t
+s,@build_os@,$build_os,;t t
+s,@host@,$host,;t t
+s,@host_cpu@,$host_cpu,;t t
+s,@host_vendor@,$host_vendor,;t t
+s,@host_os@,$host_os,;t t
+s,@CXX@,$CXX,;t t
+s,@CXXFLAGS@,$CXXFLAGS,;t t
+s,@LDFLAGS@,$LDFLAGS,;t t
+s,@CPPFLAGS@,$CPPFLAGS,;t t
+s,@ac_ct_CXX@,$ac_ct_CXX,;t t
+s,@EXEEXT@,$EXEEXT,;t t
+s,@OBJEXT@,$OBJEXT,;t t
+s,@DEPDIR@,$DEPDIR,;t t
+s,@am__include@,$am__include,;t t
+s,@am__quote@,$am__quote,;t t
+s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t
+s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t
+s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t
+s,@CXXDEPMODE@,$CXXDEPMODE,;t t
+s,@am__fastdepCXX_TRUE@,$am__fastdepCXX_TRUE,;t t
+s,@am__fastdepCXX_FALSE@,$am__fastdepCXX_FALSE,;t t
+s,@CC@,$CC,;t t
+s,@CFLAGS@,$CFLAGS,;t t
+s,@ac_ct_CC@,$ac_ct_CC,;t t
+s,@CCDEPMODE@,$CCDEPMODE,;t t
+s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t
+s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t
+s,@CPP@,$CPP,;t t
+s,@LIBOBJS@,$LIBOBJS,;t t
+s,@LTLIBOBJS@,$LTLIBOBJS,;t t
+CEOF
+
+_ACEOF
+
+  cat >>$CONFIG_STATUS <<\_ACEOF
+  # Split the substitutions into bite-sized pieces for seds with
+  # small command number limits, like on Digital OSF/1 and HP-UX.
+  ac_max_sed_lines=48
+  ac_sed_frag=1 # Number of current file.
+  ac_beg=1 # First line for current file.
+  ac_end=$ac_max_sed_lines # Line after last line for current file.
+  ac_more_lines=:
+  ac_sed_cmds=
+  while $ac_more_lines; do
+    if test $ac_beg -gt 1; then
+      sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    else
+      sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    fi
+    if test ! -s $tmp/subs.frag; then
+      ac_more_lines=false
+    else
+      # The purpose of the label and of the branching condition is to
+      # speed up the sed processing (if there are no `@' at all, there
+      # is no need to browse any of the substitutions).
+      # These are the two extra sed commands mentioned above.
+      (echo ':t
+  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+      if test -z "$ac_sed_cmds"; then
+	ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+      else
+	ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+      fi
+      ac_sed_frag=`expr $ac_sed_frag + 1`
+      ac_beg=$ac_end
+      ac_end=`expr $ac_end + $ac_max_sed_lines`
+    fi
+  done
+  if test -z "$ac_sed_cmds"; then
+    ac_sed_cmds=cat
+  fi
+fi # test -n "$CONFIG_FILES"
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case $ac_file in
+  - | *:- | *:-:* ) # input from stdin
+	cat >$tmp/stdin
+	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
+  esac
+
+  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+  ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+  ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
+
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
+  esac
+
+  if test x"$ac_file" != x-; then
+    { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    rm -f "$ac_file"
+  fi
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated by config.status.  */
+  if test x"$ac_file" = x-; then
+    configure_input=
+  else
+    configure_input="$ac_file.  "
+  fi
+  configure_input=$configure_input"Generated from `echo $ac_file_in |
+				     sed 's,.*/,,'` by configure."
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo $tmp/stdin ;;
+      [\\/$]*)
+	 # Absolute (can't be DOS-style, as IFS=:)
+	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+	 echo "$f";;
+      *) # Relative
+	 if test -f "$f"; then
+	   # Build tree
+	   echo "$f"
+	 elif test -f "$srcdir/$f"; then
+	   # Source tree
+	   echo "$srcdir/$f"
+	 else
+	   # /dev/null tree
+	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+	 fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@abs_srcdir@,$ac_abs_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s,@builddir@,$ac_builddir,;t t
+s,@abs_builddir@,$ac_abs_builddir,;t t
+s,@top_builddir@,$ac_top_builddir,;t t
+s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
+s,@INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+  rm -f $tmp/stdin
+  if test x"$ac_file" != x-; then
+    mv $tmp/out $ac_file
+  else
+    cat $tmp/out
+    rm -f $tmp/out
+  fi
+
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_HEADER section.
+#
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s,^\([	 ]*\)#\([	 ]*define[	 ][	 ]*\)'
+ac_dB='[	 ].*$,\1#\2'
+ac_dC=' '
+ac_dD=',;t'
+# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_uA='s,^\([	 ]*\)#\([	 ]*\)undef\([	 ][	 ]*\)'
+ac_uB='$,\1#\2define\3'
+ac_uC=' '
+ac_uD=',;t'
+
+for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case $ac_file in
+  - | *:- | *:-:* ) # input from stdin
+	cat >$tmp/stdin
+	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
+  esac
+
+  test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo $tmp/stdin ;;
+      [\\/$]*)
+	 # Absolute (can't be DOS-style, as IFS=:)
+	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+	 # Do quote $f, to prevent DOS paths from being IFS'd.
+	 echo "$f";;
+      *) # Relative
+	 if test -f "$f"; then
+	   # Build tree
+	   echo "$f"
+	 elif test -f "$srcdir/$f"; then
+	   # Source tree
+	   echo "$srcdir/$f"
+	 else
+	   # /dev/null tree
+	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+	 fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+  # Remove the trailing spaces.
+  sed 's/[	 ]*$//' $ac_file_inputs >$tmp/in
+
+_ACEOF
+
+# Transform confdefs.h into two sed scripts, `conftest.defines' and
+# `conftest.undefs', that substitutes the proper values into
+# config.h.in to produce config.h.  The first handles `#define'
+# templates, and the second `#undef' templates.
+# And first: Protect against being on the right side of a sed subst in
+# config.status.  Protect against being in an unquoted here document
+# in config.status.
+rm -f conftest.defines conftest.undefs
+# Using a here document instead of a string reduces the quoting nightmare.
+# Putting comments in sed scripts is not portable.
+#
+# `end' is used to avoid that the second main sed command (meant for
+# 0-ary CPP macros) applies to n-ary macro definitions.
+# See the Autoconf documentation for `clear'.
+cat >confdef2sed.sed <<\_ACEOF
+s/[\\&,]/\\&/g
+s,[\\$`],\\&,g
+t clear
+: clear
+s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 (][^	 (]*\)\(([^)]*)\)[	 ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
+t end
+s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 ][^	 ]*\)[	 ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
+: end
+_ACEOF
+# If some macros were called several times there might be several times
+# the same #defines, which is useless.  Nevertheless, we may not want to
+# sort them, since we want the *last* AC-DEFINE to be honored.
+uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
+sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
+rm -f confdef2sed.sed
+
+# This sed command replaces #undef with comments.  This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >>conftest.undefs <<\_ACEOF
+s,^[	 ]*#[	 ]*undef[	 ][	 ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
+_ACEOF
+
+# Break up conftest.defines because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo '  # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
+echo '  if grep "^[	 ]*#[	 ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
+echo '  # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
+echo '  :' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.defines >/dev/null
+do
+  # Write a limited-size here document to $tmp/defines.sed.
+  echo '  cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
+  # Speed up: don't consider the non `#define' lines.
+  echo '/^[	 ]*#[	 ]*define/!b' >>$CONFIG_STATUS
+  # Work around the forget-to-reset-the-flag bug.
+  echo 't clr' >>$CONFIG_STATUS
+  echo ': clr' >>$CONFIG_STATUS
+  sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
+  echo 'CEOF
+  sed -f $tmp/defines.sed $tmp/in >$tmp/out
+  rm -f $tmp/in
+  mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+  sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
+  rm -f conftest.defines
+  mv conftest.tail conftest.defines
+done
+rm -f conftest.defines
+echo '  fi # grep' >>$CONFIG_STATUS
+echo >>$CONFIG_STATUS
+
+# Break up conftest.undefs because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo '  # Handle all the #undef templates' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.undefs >/dev/null
+do
+  # Write a limited-size here document to $tmp/undefs.sed.
+  echo '  cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
+  # Speed up: don't consider the non `#undef'
+  echo '/^[	 ]*#[	 ]*undef/!b' >>$CONFIG_STATUS
+  # Work around the forget-to-reset-the-flag bug.
+  echo 't clr' >>$CONFIG_STATUS
+  echo ': clr' >>$CONFIG_STATUS
+  sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
+  echo 'CEOF
+  sed -f $tmp/undefs.sed $tmp/in >$tmp/out
+  rm -f $tmp/in
+  mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+  sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
+  rm -f conftest.undefs
+  mv conftest.tail conftest.undefs
+done
+rm -f conftest.undefs
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated by config.status.  */
+  if test x"$ac_file" = x-; then
+    echo "/* Generated by configure.  */" >$tmp/config.h
+  else
+    echo "/* $ac_file.  Generated by configure.  */" >$tmp/config.h
+  fi
+  cat $tmp/in >>$tmp/config.h
+  rm -f $tmp/in
+  if test x"$ac_file" != x-; then
+    if diff $ac_file $tmp/config.h >/dev/null 2>&1; then
+      { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+      { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+      rm -f $ac_file
+      mv $tmp/config.h $ac_file
+    fi
+  else
+    cat $tmp/config.h
+    rm -f $tmp/config.h
+  fi
+# Compute $ac_file's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $ac_file | $ac_file:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null ||
+$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X$ac_file : 'X\(//\)[^/]' \| \
+	 X$ac_file : 'X\(//\)$' \| \
+	 X$ac_file : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X$ac_file |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`/stamp-h$_am_stamp_count
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_COMMANDS section.
+#
+for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
+  ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
+  ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
+  ac_dir=`(dirname "$ac_dest") 2>/dev/null ||
+$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_dest" : 'X\(//\)[^/]' \| \
+	 X"$ac_dest" : 'X\(//\)$' \| \
+	 X"$ac_dest" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_dest" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+  ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
+
+
+  { echo "$as_me:$LINENO: executing $ac_dest commands" >&5
+echo "$as_me: executing $ac_dest commands" >&6;}
+  case $ac_dest in
+    depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
+  # Strip MF so we end up with the name of the file.
+  mf=`echo "$mf" | sed -e 's/:.*$//'`
+  # Check whether this is an Automake generated Makefile or not.
+  # We used to match only the files named `Makefile.in', but
+  # some people rename them; so instead we look at the file content.
+  # Grep'ing the first line is not enough: some people post-process
+  # each Makefile.in and add a new line on top of each file to say so.
+  # So let's grep whole file.
+  if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+    dirpart=`(dirname "$mf") 2>/dev/null ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$mf" : 'X\(//\)[^/]' \| \
+	 X"$mf" : 'X\(//\)$' \| \
+	 X"$mf" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  else
+    continue
+  fi
+  # Extract the definition of DEPDIR, am__include, and am__quote
+  # from the Makefile without running `make'.
+  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+  test -z "$DEPDIR" && continue
+  am__include=`sed -n 's/^am__include = //p' < "$mf"`
+  test -z "am__include" && continue
+  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+  # When using ansi2knr, U may be empty or an underscore; expand it
+  U=`sed -n 's/^U = //p' < "$mf"`
+  # Find all dependency output files, they are included files with
+  # $(DEPDIR) in their names.  We invoke sed twice because it is the
+  # simplest approach to changing $(DEPDIR) to its actual value in the
+  # expansion.
+  for file in `sed -n "
+    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+    # Make sure the directory exists.
+    test -f "$dirpart/$file" && continue
+    fdir=`(dirname "$file") 2>/dev/null ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$file" : 'X\(//\)[^/]' \| \
+	 X"$file" : 'X\(//\)$' \| \
+	 X"$file" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    { if $as_mkdir_p; then
+    mkdir -p $dirpart/$fdir
+  else
+    as_dir=$dirpart/$fdir
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5
+echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+    # echo "creating $dirpart/$file"
+    echo '# dummy' > "$dirpart/$file"
+  done
+done
+ ;;
+  esac
+done
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || { (exit 1); exit 1; }
+fi
+
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbdel-src/configure.ac
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbdel-src/configure.ac	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbdel-src/configure.ac	(revision 24799)
@@ -0,0 +1,25 @@
+#                                               -*- Autoconf -*-
+# Process this file with autoconf to produce a configure script.
+
+AC_PREREQ(2.59)
+AC_INIT([tdbdel], [1.0], [jmt12@cs.waikato.ac.nz])
+AM_INIT_AUTOMAKE
+AC_CANONICAL_HOST
+AC_CONFIG_SRCDIR([tdbdel.cpp])
+AC_CONFIG_HEADER([config.h])
+
+# Checks for programs.
+AC_PROG_CXX
+AC_PROG_CPP
+
+# Checks for libraries.
+
+# Checks for header files.
+
+# Checks for typedefs, structures, and compiler characteristics.
+
+# Checks for library functions.
+
+# Completion
+AC_CONFIG_FILES([Makefile])
+AC_OUTPUT
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbdel-src/install-sh
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbdel-src/install-sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbdel-src/install-sh	(revision 24799)
@@ -0,0 +1,323 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2005-05-14.22
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.  It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+chmodcmd="$chmodprog 0755"
+chowncmd=
+chgrpcmd=
+stripcmd=
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=
+dst=
+dir_arg=
+dstarg=
+no_target_directory=
+
+usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+-c         (ignored)
+-d         create directories instead of installing files.
+-g GROUP   $chgrpprog installed files to GROUP.
+-m MODE    $chmodprog installed files to MODE.
+-o USER    $chownprog installed files to USER.
+-s         $stripprog installed files.
+-t DIRECTORY  install into DIRECTORY.
+-T         report an error if DSTFILE is a directory.
+--help     display this help and exit.
+--version  display version info and exit.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
+"
+
+while test -n "$1"; do
+  case $1 in
+    -c) shift
+        continue;;
+
+    -d) dir_arg=true
+        shift
+        continue;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+        shift
+        shift
+        continue;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) chmodcmd="$chmodprog $2"
+        shift
+        shift
+        continue;;
+
+    -o) chowncmd="$chownprog $2"
+        shift
+        shift
+        continue;;
+
+    -s) stripcmd=$stripprog
+        shift
+        continue;;
+
+    -t) dstarg=$2
+	shift
+	shift
+	continue;;
+
+    -T) no_target_directory=true
+	shift
+	continue;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    *)  # When -d is used, all remaining arguments are directories to create.
+	# When -t is used, the destination is already specified.
+	test -n "$dir_arg$dstarg" && break
+        # Otherwise, the last argument is the destination.  Remove it from $@.
+	for arg
+	do
+          if test -n "$dstarg"; then
+	    # $@ is not empty: it contains at least $arg.
+	    set fnord "$@" "$dstarg"
+	    shift # fnord
+	  fi
+	  shift # arg
+	  dstarg=$arg
+	done
+	break;;
+  esac
+done
+
+if test -z "$1"; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call `install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+for src
+do
+  # Protect names starting with `-'.
+  case $src in
+    -*) src=./$src ;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    src=
+
+    if test -d "$dst"; then
+      mkdircmd=:
+      chmodcmd=
+    else
+      mkdircmd=$mkdirprog
+    fi
+  else
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dstarg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+
+    dst=$dstarg
+    # Protect names starting with `-'.
+    case $dst in
+      -*) dst=./$dst ;;
+    esac
+
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
+    if test -d "$dst"; then
+      if test -n "$no_target_directory"; then
+	echo "$0: $dstarg: Is a directory" >&2
+	exit 1
+      fi
+      dst=$dst/`basename "$src"`
+    fi
+  fi
+
+  # This sed command emulates the dirname command.
+  dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'`
+
+  # Make sure that the destination directory exists.
+
+  # Skip lots of stat calls in the usual case.
+  if test ! -d "$dstdir"; then
+    defaultIFS='
+	 '
+    IFS="${IFS-$defaultIFS}"
+
+    oIFS=$IFS
+    # Some sh's can't handle IFS=/ for some reason.
+    IFS='%'
+    set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
+    shift
+    IFS=$oIFS
+
+    pathcomp=
+
+    while test $# -ne 0 ; do
+      pathcomp=$pathcomp$1
+      shift
+      if test ! -d "$pathcomp"; then
+        $mkdirprog "$pathcomp"
+	# mkdir can fail with a `File exist' error in case several
+	# install-sh are creating the directory concurrently.  This
+	# is OK.
+	test -d "$pathcomp" || exit
+      fi
+      pathcomp=$pathcomp/
+    done
+  fi
+
+  if test -n "$dir_arg"; then
+    $doit $mkdircmd "$dst" \
+      && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
+      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
+      && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
+      && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
+
+  else
+    dstfile=`basename "$dst"`
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+    trap '(exit $?); exit' 1 2 13 15
+
+    # Copy the file name to the temp name.
+    $doit $cpprog "$src" "$dsttmp" &&
+
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
+      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
+      && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
+      && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
+
+    # Now rename the file to the real destination.
+    { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
+      || {
+	   # The rename failed, perhaps because mv can't rename something else
+	   # to itself, or perhaps because mv is so ancient that it does not
+	   # support -f.
+
+	   # Now remove or move aside any old file at destination location.
+	   # We try this two ways since rm can't unlink itself on some
+	   # systems and the destination file might be busy for other
+	   # reasons.  In this case, the final cleanup might fail but the new
+	   # file should still install successfully.
+	   {
+	     if test -f "$dstdir/$dstfile"; then
+	       $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
+	       || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
+	       || {
+		 echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
+		 (exit 1); exit 1
+	       }
+	     else
+	       :
+	     fi
+	   } &&
+
+	   # Now rename the file to the real destination.
+	   $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
+	 }
+    }
+  fi || { (exit 1); exit 1; }
+done
+
+# The final little trick to "correctly" pass the exit status to the exit trap.
+{
+  (exit 0); exit 0
+}
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbdel-src/tdbdel.cpp
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbdel-src/tdbdel.cpp	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbdel-src/tdbdel.cpp	(revision 24799)
@@ -0,0 +1,105 @@
+/**********************************************************************
+ *
+ * tdbdel -- remove a single value from the TDB database
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * Copyright (C) 2011  The New Zealand Digital Library Project
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *********************************************************************/
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#include <ospace\std\iostream>
+#elif defined(GSDL_USE_IOS_H)
+#include <iostream.h>
+#else
+#include <iostream>
+#endif
+
+#include <cstdlib>
+#include <cstring>
+
+#include <fcntl.h>
+#include "tdb.h"
+
+// use the standard namespace
+#if !defined (GSDL_NAMESPACE_BROKEN)
+#if defined(GSDL_USE_OBJECTSPACE)
+using namespace ospace::std;
+#else
+using namespace std;
+#endif
+#endif
+
+/**
+ */
+void
+printUsage (char *program_name)
+{
+  cerr << "usage: " << program_name << " <database_path> <key>" << endl;
+  cerr << endl;
+}
+/** printUsage() **/
+
+/**
+ */
+int
+main (int argc, char *argv[])
+{
+  // sanity check
+  if (argc != 3)
+  {
+    printUsage(argv[0]);
+    exit (-1);
+  }
+
+  char *dbname = argv[1];
+
+  int hash_size = 0;
+  int tdb_flags = TDB_DEFAULT; // Default = 0
+  int open_flags = O_RDWR;
+  TDB_CONTEXT *tdb = tdb_open(dbname, hash_size, tdb_flags, open_flags, 0664);
+  if (!tdb)
+  {
+    cerr << "couldn't create " << dbname << endl;
+    exit (0);
+  }
+
+  TDB_DATA key;
+  key.dsize = strlen(argv[2]);
+  key.dptr = (unsigned char*)argv[2];
+
+  int status = tdb_delete (tdb, key);
+
+  // status:
+  //   0 == delete OK
+  //  -1 == key does not exist or there was an error
+
+  if (status < 0)
+  {
+    cerr << "Opened database " << argv[1] << endl;
+    cerr << "  but couldn't delete: " << argv[2] << endl;
+  }
+
+  tdb_close (tdb);
+
+  return status;
+}
+/** main() **/
+
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbget-src/.svnignore
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbget-src/.svnignore	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbget-src/.svnignore	(revision 24799)
@@ -0,0 +1,6 @@
+Makefile
+config.h
+config.log
+config.status
+stamp-h1
+tdbget
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbget-src/Makefile.in
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbget-src/Makefile.in	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbget-src/Makefile.in	(revision 24799)
@@ -0,0 +1,80 @@
+###########################################################################
+#
+# Makefile -- tdbget
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999-2011  The New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+GSDL_DIR = ../../../..
+COMMON_DIR = $(GSDL_DIR)/common-src
+
+COMMON_PACKAGES_DIR = $(COMMON_DIR)/packages
+
+CXX = @CXX@
+CXXFLAGS = @CXXFLAGS@
+DEFS = @DEFS@
+INCLUDES = -I${GEXTTDBEDIT_INSTALLED}/include
+INSTALL = @INSTALL@
+LDFLAGS = @LDFLAGS@ -L${GEXTTDBEDIT_INSTALLED}/lib
+LIBS = @LIBS@ -ltdb
+
+
+CXXCOMPILE = $(CXX) -c $(CXXFLAGS) $(DEFS) $(INCLUDES)
+CXXLINK = $(CXX) $(LDFLAGS) -o $@
+
+
+.SUFFIXES:
+.SUFFIXES: .cpp .o
+.cpp.o:
+	$(CXXCOMPILE) $< 
+
+
+SOURCES = \
+	tdbget.cpp
+
+OBJECTS = \
+	tdbget.o
+
+EXECUTABLE_OBJECTS = \
+	$(OBJECTS)
+
+EXECUTABLE = tdbget
+
+
+# Default target: make the tdbget executable
+all: $(EXECUTABLE)
+
+tdbget: $(EXECUTABLE_OBJECTS)
+	$(CXXLINK) $(EXECUTABLE_OBJECTS) $(LIBS)
+
+install: $(EXECUTABLE)
+	$(INSTALL) -d ${GEXTTDBEDIT_INSTALLED}/bin
+	$(INSTALL) -m 755 -s $(EXECUTABLE) ${GEXTTDBEDIT_INSTALLED}/bin
+
+clean:
+	rm -f $(OBJECTS) $(EXECUTABLE)
+
+distclean:
+	rm -f $(OBJECTS) $(EXECUTABLE) Makefile
+
+depend:
+	makedepend -Y -- $(DEFS) $(INCLUDES) $(CXXFLAGS) -- $(SOURCES)
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbget-src/aclocal.m4
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbget-src/aclocal.m4	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbget-src/aclocal.m4	(revision 24799)
@@ -0,0 +1,850 @@
+# generated automatically by aclocal 1.9.6 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005  Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# Copyright (C) 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION so it can be traced.
+# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+	 [AM_AUTOMAKE_VERSION([1.9.6])])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 7
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])
+AC_SUBST([$1_FALSE])
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 8
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
+       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
+       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                   [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 3
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[for mf in $CONFIG_FILES; do
+  # Strip MF so we end up with the name of the file.
+  mf=`echo "$mf" | sed -e 's/:.*$//'`
+  # Check whether this is an Automake generated Makefile or not.
+  # We used to match only the files named `Makefile.in', but
+  # some people rename them; so instead we look at the file content.
+  # Grep'ing the first line is not enough: some people post-process
+  # each Makefile.in and add a new line on top of each file to say so.
+  # So let's grep whole file.
+  if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+    dirpart=`AS_DIRNAME("$mf")`
+  else
+    continue
+  fi
+  # Extract the definition of DEPDIR, am__include, and am__quote
+  # from the Makefile without running `make'.
+  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+  test -z "$DEPDIR" && continue
+  am__include=`sed -n 's/^am__include = //p' < "$mf"`
+  test -z "am__include" && continue
+  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+  # When using ansi2knr, U may be empty or an underscore; expand it
+  U=`sed -n 's/^U = //p' < "$mf"`
+  # Find all dependency output files, they are included files with
+  # $(DEPDIR) in their names.  We invoke sed twice because it is the
+  # simplest approach to changing $(DEPDIR) to its actual value in the
+  # expansion.
+  for file in `sed -n "
+    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+    # Make sure the directory exists.
+    test -f "$dirpart/$file" && continue
+    fdir=`AS_DIRNAME(["$file"])`
+    AS_MKDIR_P([$dirpart/$fdir])
+    # echo "creating $dirpart/$file"
+    echo '# dummy' > "$dirpart/$file"
+  done
+done
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled.  FIXME.  This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 12
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.58])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+   test -f $srcdir/config.status; then
+  AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AM_PROG_INSTALL_SH
+AM_PROG_INSTALL_STRIP
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+              [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+	      		     [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+                  [_AM_DEPENDENCIES(CC)],
+                  [define([AC_PROG_CC],
+                          defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+                  [_AM_DEPENDENCIES(CXX)],
+                  [define([AC_PROG_CXX],
+                          defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+])
+])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $1 | $1:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Check to see how 'make' treats includes.	            -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+   am__include=include
+   am__quote=
+   _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+      am__include=.include
+      am__quote="\""
+      _am_result=BSD
+   fi
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise.
+#
+# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories
+# created by `make install' are always world readable, even if the
+# installer happens to have an overly restrictive umask (e.g. 077).
+# This was a mistake.  There are at least two reasons why we must not
+# use `-m 0755':
+#   - it causes special bits like SGID to be ignored,
+#   - it may be too restrictive (some setups expect 775 directories).
+#
+# Do not use -m 0755 and let people choose whatever they expect by
+# setting umask.
+#
+# We cannot accept any implementation of `mkdir' that recognizes `-p'.
+# Some implementations (such as Solaris 8's) are not thread-safe: if a
+# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c'
+# concurrently, both version can detect that a/ is missing, but only
+# one can create it and the other will error out.  Consequently we
+# restrict ourselves to GNU make (using the --version option ensures
+# this.)
+AC_DEFUN([AM_PROG_MKDIR_P],
+[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+  # We used to keeping the `.' as first argument, in order to
+  # allow $(mkdir_p) to be used without argument.  As in
+  #   $(mkdir_p) $(somedir)
+  # where $(somedir) is conditionally defined.  However this is wrong
+  # for two reasons:
+  #  1. if the package is installed by a user who cannot write `.'
+  #     make install will fail,
+  #  2. the above comment should most certainly read
+  #     $(mkdir_p) $(DESTDIR)$(somedir)
+  #     so it does not work when $(somedir) is undefined and
+  #     $(DESTDIR) is not.
+  #  To support the latter case, we have to write
+  #     test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+  #  so the `.' trick is pointless.
+  mkdir_p='mkdir -p --'
+else
+  # On NextStep and OpenStep, the `mkdir' command does not
+  # recognize any option.  It will interpret all options as
+  # directories to create, and then abort because `.' already
+  # exists.
+  for d in ./-p ./--version;
+  do
+    test -d $d && rmdir $d
+  done
+  # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+  if test -f "$ac_aux_dir/mkinstalldirs"; then
+    mkdir_p='$(mkinstalldirs)'
+  else
+    mkdir_p='$(install_sh) -d'
+  fi
+fi
+AC_SUBST([mkdir_p])])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+   if test "$[*]" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$[*]" != "X $srcdir/configure conftest.file" \
+      && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+     [m4_case([$1], [ustar],, [pax],,
+              [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+  case $_am_tool in
+  gnutar)
+    for _am_tar in tar gnutar gtar;
+    do
+      AM_RUN_LOG([$_am_tar --version]) && break
+    done
+    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+    am__untar="$_am_tar -xf -"
+    ;;
+  plaintar)
+    # Must skip GNU tar: if it does not support --format= it doesn't create
+    # ustar tarball either.
+    (tar --version) >/dev/null 2>&1 && continue
+    am__tar='tar chf - "$$tardir"'
+    am__tar_='tar chf - "$tardir"'
+    am__untar='tar xf -'
+    ;;
+  pax)
+    am__tar='pax -L -x $1 -w "$$tardir"'
+    am__tar_='pax -L -x $1 -w "$tardir"'
+    am__untar='pax -r'
+    ;;
+  cpio)
+    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+    am__untar='cpio -i -H $1 -d'
+    ;;
+  none)
+    am__tar=false
+    am__tar_=false
+    am__untar=false
+    ;;
+  esac
+
+  # If the value was cached, stop now.  We just wanted to have am__tar
+  # and am__untar set.
+  test -n "${am_cv_prog_tar_$1}" && break
+
+  # tar/untar a dummy directory, and stop if the command works
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  echo GrepMe > conftest.dir/file
+  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+  rm -rf conftest.dir
+  if test -s conftest.tar; then
+    AM_RUN_LOG([$am__untar <conftest.tar])
+    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+  fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbget-src/config.guess
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbget-src/config.guess	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbget-src/config.guess	(revision 24799)
@@ -0,0 +1,1298 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+#   Free Software Foundation, Inc.
+
+timestamp='2001-07-12'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Written by Per Bothner <bothner@cygnus.com>.
+# Please send patches to <config-patches@gnu.org>.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit 0 ;;
+    --version | -v )
+       echo "$version" ; exit 0 ;;
+    --help | --h* | -h )
+       echo "$usage"; exit 0 ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+
+dummy=dummy-$$
+trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script.
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int dummy(){}" > $dummy.c ;
+	for c in cc gcc c89 ; do
+	  ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ;
+	  if test $? = 0 ; then
+	     CC_FOR_BUILD="$c"; break ;
+	  fi ;
+	done ;
+	rm -f $dummy.c $dummy.o $dummy.rel ;
+	if test x"$CC_FOR_BUILD" = x ; then
+	  CC_FOR_BUILD=no_compiler_found ;
+	fi
+	;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+	# Netbsd (nbsd) targets should (where applicable) match one or
+	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	# Determine the machine/vendor (is the vendor relevant).
+	case "${UNAME_MACHINE}" in
+	    amiga) machine=m68k-unknown ;;
+	    arm32) machine=arm-unknown ;;
+	    atari*) machine=m68k-atari ;;
+	    sun3*) machine=m68k-sun ;;
+	    mac68k) machine=m68k-apple ;;
+	    macppc) machine=powerpc-apple ;;
+	    hp3[0-9][05]) machine=m68k-hp ;;
+	    ibmrt|romp-ibm) machine=romp-ibm ;;
+	    *) machine=${UNAME_MACHINE}-unknown ;;
+	esac
+	# The Operating System including object format, if it has switched
+	# to ELF recently, or will in the future.
+	case "${UNAME_MACHINE}" in
+	    i386|sparc|amiga|arm*|hp300|mvme68k|vax|atari|luna68k|mac68k|news68k|next68k|pc532|sun3*|x68k)
+		eval $set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep __ELF__ >/dev/null
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+	        os=netbsd
+		;;
+	esac
+	# The OS release
+	release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	echo "${machine}-${os}${release}"
+	exit 0 ;;
+    alpha:OSF1:*:*)
+	if test $UNAME_RELEASE = "V4.0"; then
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+	fi
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	cat <<EOF >$dummy.s
+	.data
+\$Lformat:
+	.byte 37,100,45,37,120,10,0	# "%d-%x\n"
+
+	.text
+	.globl main
+	.align 4
+	.ent main
+main:
+	.frame \$30,16,\$26,0
+	ldgp \$29,0(\$27)
+	.prologue 1
+	.long 0x47e03d80 # implver \$0
+	lda \$2,-1
+	.long 0x47e20c21 # amask \$2,\$1
+	lda \$16,\$Lformat
+	mov \$0,\$17
+	not \$1,\$18
+	jsr \$26,printf
+	ldgp \$29,0(\$26)
+	mov 0,\$16
+	jsr \$26,exit
+	.end main
+EOF
+	eval $set_cc_for_build
+	$CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
+	if test "$?" = 0 ; then
+		case `./$dummy` in
+			0-0)
+				UNAME_MACHINE="alpha"
+				;;
+			1-0)
+				UNAME_MACHINE="alphaev5"
+				;;
+			1-1)
+				UNAME_MACHINE="alphaev56"
+				;;
+			1-101)
+				UNAME_MACHINE="alphapca56"
+				;;
+			2-303)
+				UNAME_MACHINE="alphaev6"
+				;;
+			2-307)
+				UNAME_MACHINE="alphaev67"
+				;;
+		esac
+	fi
+	rm -f $dummy.s $dummy
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	exit 0 ;;
+    Alpha\ *:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# Should we change UNAME_MACHINE based on the output of uname instead
+	# of the specific Alpha model?
+	echo alpha-pc-interix
+	exit 0 ;;
+    21064:Windows_NT:50:3)
+	echo alpha-dec-winnt3.5
+	exit 0 ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-unknown-sysv4
+	exit 0;;
+    amiga:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-amigaos
+	exit 0 ;;
+    arc64:OpenBSD:*:*)
+	echo mips64el-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    arc:OpenBSD:*:*)
+	echo mipsel-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    hkmips:OpenBSD:*:*)
+	echo mips-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    pmax:OpenBSD:*:*)
+	echo mipsel-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    sgi:OpenBSD:*:*)
+	echo mips-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    wgrisc:OpenBSD:*:*)
+	echo mipsel-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    *:OS/390:*:*)
+	echo i370-ibm-openedition
+	exit 0 ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit 0;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit 0;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit 0 ;;
+    NILE*:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit 0 ;;
+    sun4H:SunOS:5.*:*)
+	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    i86pc:SunOS:5.*:*)
+	echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    sun4*:SunOS:*:*)
+	case "`/usr/bin/arch -k`" in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+	exit 0 ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos${UNAME_RELEASE}
+	exit 0 ;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+	case "`/bin/arch`" in
+	    sun3)
+		echo m68k-sun-sunos${UNAME_RELEASE}
+		;;
+	    sun4)
+		echo sparc-sun-sunos${UNAME_RELEASE}
+		;;
+	esac
+	exit 0 ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos${UNAME_RELEASE}
+	exit 0 ;;
+    atari*:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit 0 ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+        exit 0 ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit 0 ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+        echo m68k-milan-mint${UNAME_RELEASE}
+        exit 0 ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+        echo m68k-hades-mint${UNAME_RELEASE}
+        exit 0 ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+        echo m68k-unknown-mint${UNAME_RELEASE}
+        exit 0 ;;
+    sun3*:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    mac68k:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    mvme68k:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    mvme88k:OpenBSD:*:*)
+	echo m88k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten${UNAME_RELEASE}
+	exit 0 ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit 0 ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit 0 ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit 0 ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	echo clipper-intergraph-clix${UNAME_RELEASE}
+	exit 0 ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	sed 's/^	//' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	eval $set_cc_for_build
+	$CC_FOR_BUILD $dummy.c -o $dummy \
+	  && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+	  && rm -f $dummy.c $dummy && exit 0
+	rm -f $dummy.c $dummy
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit 0 ;;
+    Motorola:PowerMAX_OS:*:*)
+	echo powerpc-motorola-powermax
+	exit 0 ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit 0 ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit 0 ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit 0 ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit 0 ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+	then
+	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+	       [ ${TARGET_BINARY_INTERFACE}x = x ]
+	    then
+		echo m88k-dg-dgux${UNAME_RELEASE}
+	    else
+		echo m88k-dg-dguxbcs${UNAME_RELEASE}
+	    fi
+	else
+	    echo i586-dg-dgux${UNAME_RELEASE}
+	fi
+ 	exit 0 ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit 0 ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit 0 ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit 0 ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit 0 ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+	exit 0 ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	echo romp-ibm-aix      # uname -m gives an 8 hex-code CPU id
+	exit 0 ;;              # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+	echo i386-ibm-aix
+	exit 0 ;;
+    ia64:AIX:*:*)
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+	exit 0 ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		sed 's/^		//' << EOF >$dummy.c
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		eval $set_cc_for_build
+		$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
+		rm -f $dummy.c $dummy
+		echo rs6000-ibm-aix3.2.5
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		echo rs6000-ibm-aix3.2.4
+	else
+		echo rs6000-ibm-aix3.2
+	fi
+	exit 0 ;;
+    *:AIX:*:[45])
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit 0 ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit 0 ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+	echo romp-ibm-bsd4.4
+	exit 0 ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+	exit 0 ;;                           # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit 0 ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit 0 ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit 0 ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit 0 ;;
+    9000/[34678]??:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+              case "${HPUX_REV}" in
+                11.[0-9][0-9])
+                  if [ -x /usr/bin/getconf ]; then
+                    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+                    case "${sc_cpu_version}" in
+                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+                      532)                      # CPU_PA_RISC2_0
+                        case "${sc_kernel_bits}" in
+                          32) HP_ARCH="hppa2.0n" ;;
+                          64) HP_ARCH="hppa2.0w" ;;
+                        esac ;;
+                    esac
+                  fi ;;
+              esac
+              if [ "${HP_ARCH}" = "" ]; then
+              sed 's/^              //' << EOF >$dummy.c
+
+              #define _HPUX_SOURCE
+              #include <stdlib.h>
+              #include <unistd.h>
+
+              int main ()
+              {
+              #if defined(_SC_KERNEL_BITS)
+                  long bits = sysconf(_SC_KERNEL_BITS);
+              #endif
+                  long cpu  = sysconf (_SC_CPU_VERSION);
+
+                  switch (cpu)
+              	{
+              	case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+              	case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+              	case CPU_PA_RISC2_0:
+              #if defined(_SC_KERNEL_BITS)
+              	    switch (bits)
+              		{
+              		case 64: puts ("hppa2.0w"); break;
+              		case 32: puts ("hppa2.0n"); break;
+              		default: puts ("hppa2.0"); break;
+              		} break;
+              #else  /* !defined(_SC_KERNEL_BITS) */
+              	    puts ("hppa2.0"); break;
+              #endif
+              	default: puts ("hppa1.0"); break;
+              	}
+                  exit (0);
+              }
+EOF
+	eval $set_cc_for_build
+	(CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy`
+	if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi
+	rm -f $dummy.c $dummy
+	fi ;;
+	esac
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit 0 ;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ia64-hp-hpux${HPUX_REV}
+	exit 0 ;;
+    3050*:HI-UX:*:*)
+	sed 's/^	//' << EOF >$dummy.c
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	eval $set_cc_for_build
+	$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
+	rm -f $dummy.c $dummy
+	echo unknown-hitachi-hiuxwe2
+	exit 0 ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit 0 ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit 0 ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+	echo hppa1.0-hp-mpeix
+	exit 0 ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit 0 ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit 0 ;;
+    i*86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo ${UNAME_MACHINE}-unknown-osf1mk
+	else
+	    echo ${UNAME_MACHINE}-unknown-osf1
+	fi
+	exit 0 ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit 0 ;;
+    hppa*:OpenBSD:*:*)
+	echo hppa-unknown-openbsd
+	exit 0 ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+        exit 0 ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+        exit 0 ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+        exit 0 ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+        exit 0 ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+        exit 0 ;;
+    CRAY*X-MP:*:*:*)
+	echo xmp-cray-unicos
+        exit 0 ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*[A-Z]90:*:*:*)
+	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+	      -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*T3D:*:*:*)
+	echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*T3E:*:*:*)
+	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*SV1:*:*:*)
+	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY-2:*:*:*)
+	echo cray2-cray-unicos
+        exit 0 ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit 0 ;;
+    hp300:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+	exit 0 ;;
+    sparc*:BSD/OS:*:*)
+	echo sparc-unknown-bsdi${UNAME_RELEASE}
+	exit 0 ;;
+    *:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit 0 ;;
+    *:FreeBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit 0 ;;
+    *:OpenBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+	exit 0 ;;
+    i*:CYGWIN*:*)
+	echo ${UNAME_MACHINE}-pc-cygwin
+	exit 0 ;;
+    i*:MINGW*:*)
+	echo ${UNAME_MACHINE}-pc-mingw32
+	exit 0 ;;
+    i*:PW*:*)
+	echo ${UNAME_MACHINE}-pc-pw32
+	exit 0 ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+	# UNAME_MACHINE based on the output of uname instead of i386?
+	echo i386-pc-interix
+	exit 0 ;;
+    i*:UWIN*:*)
+	echo ${UNAME_MACHINE}-pc-uwin
+	exit 0 ;;
+    p*:CYGWIN*:*)
+	echo powerpcle-unknown-cygwin
+	exit 0 ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    *:GNU:*:*)
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit 0 ;;
+    i*86:Minix:*:*)
+	echo ${UNAME_MACHINE}-pc-minix
+	exit 0 ;;
+    arm*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    ia64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux
+	exit 0 ;;
+    m68*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    mips:Linux:*:*)
+	case `sed -n '/^byte/s/^.*: \(.*\) endian/\1/p' < /proc/cpuinfo` in
+	  big)    echo mips-unknown-linux-gnu && exit 0 ;;
+	  little) echo mipsel-unknown-linux-gnu && exit 0 ;;
+	esac
+	;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-gnu
+	exit 0 ;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev67 ;;
+        esac
+	objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+	exit 0 ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
+	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
+	  *)    echo hppa-unknown-linux-gnu ;;
+	esac
+	exit 0 ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-gnu
+	exit 0 ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	echo ${UNAME_MACHINE}-ibm-linux
+	exit 0 ;;
+    sh*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    x86_64:Linux:*:*)
+	echo x86_64-unknown-linux-gnu
+	exit 0 ;;
+    i*86:Linux:*:*)
+	# The BFD linker knows what the default object file format is, so
+	# first see if it will tell us. cd to the root directory to prevent
+	# problems with other programs or directories called `ld' in the path.
+	ld_supported_targets=`cd /; ld --help 2>&1 \
+			 | sed -ne '/supported targets:/!d
+				    s/[ 	][ 	]*/ /g
+				    s/.*supported targets: *//
+				    s/ .*//
+				    p'`
+        case "$ld_supported_targets" in
+	  elf32-i386)
+		TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+		;;
+	  a.out-i386-linux)
+		echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+		exit 0 ;;		
+	  coff-i386)
+		echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+		exit 0 ;;
+	  "")
+		# Either a pre-BFD a.out linker (linux-gnuoldld) or
+		# one that does not give us useful --help.
+		echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+		exit 0 ;;
+	esac
+	# Determine whether the default compiler is a.out or elf
+	cat >$dummy.c <<EOF
+#include <features.h>
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+#ifdef __ELF__
+# ifdef __GLIBC__
+#  if __GLIBC__ >= 2
+    printf ("%s-pc-linux-gnu\n", argv[1]);
+#  else
+    printf ("%s-pc-linux-gnulibc1\n", argv[1]);
+#  endif
+# else
+   printf ("%s-pc-linux-gnulibc1\n", argv[1]);
+# endif
+#else
+  printf ("%s-pc-linux-gnuaout\n", argv[1]);
+#endif
+  return 0;
+}
+EOF
+	eval $set_cc_for_build
+	$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0
+	rm -f $dummy.c $dummy
+	test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
+	;;
+    i*86:DYNIX/ptx:4*:*)
+	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+	# earlier versions are messed up and put the nodename in both
+	# sysname and nodename.
+	echo i386-sequent-sysv4
+	exit 0 ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+        # Unixware is an offshoot of SVR4, but it has its own version
+        # number series starting with 2...
+        # I am not positive that other SVR4 systems won't match this,
+	# I just have to hope.  -- rms.
+        # Use sysv4.2uw... so that sysv4* matches it.
+	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+	exit 0 ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+	else
+		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+	fi
+	exit 0 ;;
+    i*86:*:5:[78]*)
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	exit 0 ;;
+    i*86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-pc-sysv32
+	fi
+	exit 0 ;;
+    i*86:*DOS:*:*)
+	echo ${UNAME_MACHINE}-pc-msdosdjgpp
+	exit 0 ;;
+    pc:*:*:*)
+	# Left here for compatibility:
+        # uname -m prints for DJGPP always 'pc', but it prints nothing about
+        # the processor, so we play safe by assuming i386.
+	echo i386-pc-msdosdjgpp
+        exit 0 ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit 0 ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit 0 ;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	fi
+	exit 0 ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit 0 ;;
+    M68*:*:R3V[567]*:*)
+	test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+    3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && echo i486-ncr-sysv4.3${OS_REL} && exit 0
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && echo i486-ncr-sysv4 && exit 0 ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+	echo m68k-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit 0 ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+	echo i386-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    rs6000:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+	echo powerpc-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv${UNAME_RELEASE}
+	exit 0 ;;
+    RM*:ReliantUNIX-*:*:*)
+	echo mips-sni-sysv4
+	exit 0 ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit 0 ;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		echo ${UNAME_MACHINE}-sni-sysv4
+	else
+		echo ns32k-sni-sysv
+	fi
+	exit 0 ;;
+    PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                           # says <Richard.M.Bartel@ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit 0 ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes@openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit 0 ;;
+    *:*:*:FTX*)
+	# From seanf@swdc.stratus.com.
+	echo i860-stratus-sysv4
+	exit 0 ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux${UNAME_RELEASE}
+	exit 0 ;;
+    news*:NEWS-OS:6*:*)
+	echo mips-sony-newsos6
+	exit 0 ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+	if [ -d /usr/nec ]; then
+	        echo mips-nec-sysv${UNAME_RELEASE}
+	else
+	        echo mips-unknown-sysv${UNAME_RELEASE}
+	fi
+        exit 0 ;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	echo powerpc-be-beos
+	exit 0 ;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	echo powerpc-apple-beos
+	exit 0 ;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	echo i586-pc-beos
+	exit 0 ;;
+    SX-4:SUPER-UX:*:*)
+	echo sx4-nec-superux${UNAME_RELEASE}
+	exit 0 ;;
+    SX-5:SUPER-UX:*:*)
+	echo sx5-nec-superux${UNAME_RELEASE}
+	exit 0 ;;
+    Power*:Rhapsody:*:*)
+	echo powerpc-apple-rhapsody${UNAME_RELEASE}
+	exit 0 ;;
+    *:Rhapsody:*:*)
+	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+	exit 0 ;;
+    *:Darwin:*:*)
+	echo `uname -p`-apple-darwin${UNAME_RELEASE}
+	exit 0 ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	if test "${UNAME_MACHINE}" = "x86pc"; then
+		UNAME_MACHINE=pc
+	fi
+	echo `uname -p`-${UNAME_MACHINE}-nto-qnx
+	exit 0 ;;
+    *:QNX:*:4*)
+	echo i386-pc-qnx
+	exit 0 ;;
+    NSR-[KW]:NONSTOP_KERNEL:*:*)
+	echo nsr-tandem-nsk${UNAME_RELEASE}
+	exit 0 ;;
+    *:NonStop-UX:*:*)
+	echo mips-compaq-nonstopux
+	exit 0 ;;
+    BS2000:POSIX*:*:*)
+	echo bs2000-siemens-sysv
+	exit 0 ;;
+    DS/*:UNIX_System_V:*:*)
+	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+	exit 0 ;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	if test "$cputype" = "386"; then
+	    UNAME_MACHINE=i386
+	else
+	    UNAME_MACHINE="$cputype"
+	fi
+	echo ${UNAME_MACHINE}-unknown-plan9
+	exit 0 ;;
+    i*86:OS/2:*:*)
+	# If we were able to find `uname', then EMX Unix compatibility
+	# is probably installed.
+	echo ${UNAME_MACHINE}-pc-os2-emx
+	exit 0 ;;
+    *:TOPS-10:*:*)
+	echo pdp10-unknown-tops10
+	exit 0 ;;
+    *:TENEX:*:*)
+	echo pdp10-unknown-tenex
+	exit 0 ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	echo pdp10-dec-tops20
+	exit 0 ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	echo pdp10-xkl-tops20
+	exit 0 ;;
+    *:TOPS-20:*:*)
+	echo pdp10-unknown-tops20
+	exit 0 ;;
+    *:ITS:*:*)
+	echo pdp10-unknown-its
+	exit 0 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+          "4"
+#else
+	  ""
+#endif
+         ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+	printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+	printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# else
+    printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+eval $set_cc_for_build
+$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0
+rm -f $dummy.c $dummy
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+	echo c1-convex-bsd
+	exit 0 ;;
+    c2*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit 0 ;;
+    c34*)
+	echo c34-convex-bsd
+	exit 0 ;;
+    c38*)
+	echo c38-convex-bsd
+	exit 0 ;;
+    c4*)
+	echo c4-convex-bsd
+	exit 0 ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+    ftp://ftp.gnu.org/pub/gnu/config/
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbget-src/config.h.in
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbget-src/config.h.in	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbget-src/config.h.in	(revision 24799)
@@ -0,0 +1,22 @@
+/* config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Version number of package */
+#undef VERSION
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbget-src/config.sub
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbget-src/config.sub	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbget-src/config.sub	(revision 24799)
@@ -0,0 +1,1579 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+
+timestamp='2005-07-08'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \
+  kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+	-sun*os*)
+		# Prevent following clause from handling this invalid input.
+		;;
+	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+	-apple | -axis | -knuth | -cray)
+		os=
+		basic_machine=$1
+		;;
+	-sim | -cisco | -oki | -wec | -winbond)
+		os=
+		basic_machine=$1
+		;;
+	-scout)
+		;;
+	-wrs)
+		os=-vxworks
+		basic_machine=$1
+		;;
+	-chorusos*)
+		os=-chorusos
+		basic_machine=$1
+		;;
+ 	-chorusrdb)
+ 		os=-chorusrdb
+		basic_machine=$1
+ 		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco5)
+		os=-sco3.2v5
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-udk*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-lynx*)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-windowsnt*)
+		os=`echo $os | sed -e 's/windowsnt/winnt/'`
+		;;
+	-psos*)
+		os=-psos
+		;;
+	-mint | -mint[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+	# Recognize the basic CPU types without company name.
+	# Some are omitted here because they have special meanings below.
+	1750a | 580 \
+	| a29k \
+	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+	| am33_2.0 \
+	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+	| bfin \
+	| c4x | clipper \
+	| d10v | d30v | dlx | dsp16xx \
+	| fr30 | frv \
+	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| i370 | i860 | i960 | ia64 \
+	| ip2k | iq2000 \
+	| m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \
+	| mips | mipsbe | mipseb | mipsel | mipsle \
+	| mips16 \
+	| mips64 | mips64el \
+	| mips64vr | mips64vrel \
+	| mips64orion | mips64orionel \
+	| mips64vr4100 | mips64vr4100el \
+	| mips64vr4300 | mips64vr4300el \
+	| mips64vr5000 | mips64vr5000el \
+	| mips64vr5900 | mips64vr5900el \
+	| mipsisa32 | mipsisa32el \
+	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa64 | mipsisa64el \
+	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64sb1 | mipsisa64sb1el \
+	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipstx39 | mipstx39el \
+	| mn10200 | mn10300 \
+	| ms1 \
+	| msp430 \
+	| ns16k | ns32k \
+	| or32 \
+	| pdp10 | pdp11 | pj | pjl \
+	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+	| pyramid \
+	| sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
+	| sh64 | sh64le \
+	| sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \
+	| sparcv8 | sparcv9 | sparcv9b \
+	| strongarm \
+	| tahoe | thumb | tic4x | tic80 | tron \
+	| v850 | v850e \
+	| we32k \
+	| x86 | xscale | xscalee[bl] | xstormy16 | xtensa \
+	| z8k)
+		basic_machine=$basic_machine-unknown
+		;;
+	m32c)
+		basic_machine=$basic_machine-unknown
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12)
+		# Motorola 68HC11/12.
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+		;;
+
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i*86 | x86_64)
+	  basic_machine=$basic_machine-pc
+	  ;;
+	# Object if more than one company name word.
+	*-*-*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+	# Recognize the basic CPU types with company name.
+	580-* \
+	| a29k-* \
+	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+	| avr-* \
+	| bfin-* | bs2000-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+	| clipper-* | craynv-* | cydra-* \
+	| d10v-* | d30v-* | dlx-* \
+	| elxsi-* \
+	| f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
+	| h8300-* | h8500-* \
+	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| i*86-* | i860-* | i960-* | ia64-* \
+	| ip2k-* | iq2000-* \
+	| m32r-* | m32rle-* \
+	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* \
+	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+	| mips16-* \
+	| mips64-* | mips64el-* \
+	| mips64vr-* | mips64vrel-* \
+	| mips64orion-* | mips64orionel-* \
+	| mips64vr4100-* | mips64vr4100el-* \
+	| mips64vr4300-* | mips64vr4300el-* \
+	| mips64vr5000-* | mips64vr5000el-* \
+	| mips64vr5900-* | mips64vr5900el-* \
+	| mipsisa32-* | mipsisa32el-* \
+	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa64-* | mipsisa64el-* \
+	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64sb1-* | mipsisa64sb1el-* \
+	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipstx39-* | mipstx39el-* \
+	| mmix-* \
+	| ms1-* \
+	| msp430-* \
+	| none-* | np1-* | ns16k-* | ns32k-* \
+	| orion-* \
+	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+	| pyramid-* \
+	| romp-* | rs6000-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \
+	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+	| sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \
+	| sparclite-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
+	| tahoe-* | thumb-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+	| tron-* \
+	| v850-* | v850e-* | vax-* \
+	| we32k-* \
+	| x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \
+	| xstormy16-* | xtensa-* \
+	| ymp-* \
+	| z8k-*)
+		;;
+	m32c-*)
+		;;
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	386bsd)
+		basic_machine=i386-unknown
+		os=-bsd
+		;;
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		basic_machine=m68000-att
+		;;
+	3b*)
+		basic_machine=we32k-att
+		;;
+	a29khif)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+    	abacus)
+		basic_machine=abacus-unknown
+		;;
+	adobe68k)
+		basic_machine=m68010-adobe
+		os=-scout
+		;;
+	alliant | fx80)
+		basic_machine=fx80-alliant
+		;;
+	altos | altos3068)
+		basic_machine=m68k-altos
+		;;
+	am29k)
+		basic_machine=a29k-none
+		os=-bsd
+		;;
+	amd64)
+		basic_machine=x86_64-pc
+		;;
+	amd64-*)
+		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	amdahl)
+		basic_machine=580-amdahl
+		os=-sysv
+		;;
+	amiga | amiga-*)
+		basic_machine=m68k-unknown
+		;;
+	amigaos | amigados)
+		basic_machine=m68k-unknown
+		os=-amigaos
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-unknown
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	apollo68bsd)
+		basic_machine=m68k-apollo
+		os=-bsd
+		;;
+	aux)
+		basic_machine=m68k-apple
+		os=-aux
+		;;
+	balance)
+		basic_machine=ns32k-sequent
+		os=-dynix
+		;;
+	c90)
+		basic_machine=c90-cray
+		os=-unicos
+		;;
+	convex-c1)
+		basic_machine=c1-convex
+		os=-bsd
+		;;
+	convex-c2)
+		basic_machine=c2-convex
+		os=-bsd
+		;;
+	convex-c32)
+		basic_machine=c32-convex
+		os=-bsd
+		;;
+	convex-c34)
+		basic_machine=c34-convex
+		os=-bsd
+		;;
+	convex-c38)
+		basic_machine=c38-convex
+		os=-bsd
+		;;
+	cray | j90)
+		basic_machine=j90-cray
+		os=-unicos
+		;;
+	craynv)
+		basic_machine=craynv-cray
+		os=-unicosmp
+		;;
+	cr16c)
+		basic_machine=cr16c-unknown
+		os=-elf
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	crisv32 | crisv32-* | etraxfs*)
+		basic_machine=crisv32-axis
+		;;
+	cris | cris-* | etrax*)
+		basic_machine=cris-axis
+		;;
+	crx)
+		basic_machine=crx-unknown
+		os=-elf
+		;;
+	da30 | da30-*)
+		basic_machine=m68k-da30
+		;;
+	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+		basic_machine=mips-dec
+		;;
+	decsystem10* | dec10*)
+		basic_machine=pdp10-dec
+		os=-tops10
+		;;
+	decsystem20* | dec20*)
+		basic_machine=pdp10-dec
+		os=-tops20
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		basic_machine=m68k-motorola
+		;;
+	delta88)
+		basic_machine=m88k-motorola
+		os=-sysv3
+		;;
+	djgpp)
+		basic_machine=i586-pc
+		os=-msdosdjgpp
+		;;
+	dpx20 | dpx20-*)
+		basic_machine=rs6000-bull
+		os=-bosx
+		;;
+	dpx2* | dpx2*-bull)
+		basic_machine=m68k-bull
+		os=-sysv3
+		;;
+	ebmon29k)
+		basic_machine=a29k-amd
+		os=-ebmon
+		;;
+	elxsi)
+		basic_machine=elxsi-elxsi
+		os=-bsd
+		;;
+	encore | umax | mmax)
+		basic_machine=ns32k-encore
+		;;
+	es1800 | OSE68k | ose68k | ose | OSE)
+		basic_machine=m68k-ericsson
+		os=-ose
+		;;
+	fx2800)
+		basic_machine=i860-alliant
+		;;
+	genix)
+		basic_machine=ns32k-ns
+		;;
+	gmicro)
+		basic_machine=tron-gmicro
+		os=-sysv
+		;;
+	go32)
+		basic_machine=i386-pc
+		os=-go32
+		;;
+	h3050r* | hiux*)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	h8300hms)
+		basic_machine=h8300-hitachi
+		os=-hms
+		;;
+	h8300xray)
+		basic_machine=h8300-hitachi
+		os=-xray
+		;;
+	h8500hms)
+		basic_machine=h8500-hitachi
+		os=-hms
+		;;
+	harris)
+		basic_machine=m88k-harris
+		os=-sysv3
+		;;
+	hp300-*)
+		basic_machine=m68k-hp
+		;;
+	hp300bsd)
+		basic_machine=m68k-hp
+		os=-bsd
+		;;
+	hp300hpux)
+		basic_machine=m68k-hp
+		os=-hpux
+		;;
+	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		basic_machine=m68000-hp
+		;;
+	hp9k3[2-9][0-9])
+		basic_machine=m68k-hp
+		;;
+	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k78[0-9] | hp78[0-9])
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][13679] | hp8[0-9][13679])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hppa-next)
+		os=-nextstep3
+		;;
+	hppaosf)
+		basic_machine=hppa1.1-hp
+		os=-osf
+		;;
+	hppro)
+		basic_machine=hppa1.1-hp
+		os=-proelf
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+	i*86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv32
+		;;
+	i*86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv4
+		;;
+	i*86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv
+		;;
+	i*86sol2)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-solaris2
+		;;
+	i386mach)
+		basic_machine=i386-mach
+		os=-mach
+		;;
+	i386-vsta | vsta)
+		basic_machine=i386-unknown
+		os=-vsta
+		;;
+	iris | iris4d)
+		basic_machine=mips-sgi
+		case $os in
+		    -irix*)
+			;;
+		    *)
+			os=-irix4
+			;;
+		esac
+		;;
+	isi68 | isi)
+		basic_machine=m68k-isi
+		os=-sysv
+		;;
+	m88k-omron*)
+		basic_machine=m88k-omron
+		;;
+	magnum | m3230)
+		basic_machine=mips-mips
+		os=-sysv
+		;;
+	merlin)
+		basic_machine=ns32k-utek
+		os=-sysv
+		;;
+	mingw32)
+		basic_machine=i386-pc
+		os=-mingw32
+		;;
+	miniframe)
+		basic_machine=m68000-convergent
+		;;
+	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+	mips3*-*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	monitor)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	morphos)
+		basic_machine=powerpc-unknown
+		os=-morphos
+		;;
+	msdos)
+		basic_machine=i386-pc
+		os=-msdos
+		;;
+	mvs)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	netbsd386)
+		basic_machine=i386-unknown
+		os=-netbsd
+		;;
+	netwinder)
+		basic_machine=armv4l-rebel
+		os=-linux
+		;;
+	news | news700 | news800 | news900)
+		basic_machine=m68k-sony
+		os=-newsos
+		;;
+	news1000)
+		basic_machine=m68030-sony
+		os=-newsos
+		;;
+	news-3600 | risc-news)
+		basic_machine=mips-sony
+		os=-newsos
+		;;
+	necv70)
+		basic_machine=v70-nec
+		os=-sysv
+		;;
+	next | m*-next )
+		basic_machine=m68k-next
+		case $os in
+		    -nextstep* )
+			;;
+		    -ns2*)
+		      os=-nextstep2
+			;;
+		    *)
+		      os=-nextstep3
+			;;
+		esac
+		;;
+	nh3000)
+		basic_machine=m68k-harris
+		os=-cxux
+		;;
+	nh[45]000)
+		basic_machine=m88k-harris
+		os=-cxux
+		;;
+	nindy960)
+		basic_machine=i960-intel
+		os=-nindy
+		;;
+	mon960)
+		basic_machine=i960-intel
+		os=-mon960
+		;;
+	nonstopux)
+		basic_machine=mips-compaq
+		os=-nonstopux
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	nsr-tandem)
+		basic_machine=nsr-tandem
+		;;
+	op50n-* | op60c-*)
+		basic_machine=hppa1.1-oki
+		os=-proelf
+		;;
+	openrisc | openrisc-*)
+		basic_machine=or32-unknown
+		;;
+	os400)
+		basic_machine=powerpc-ibm
+		os=-os400
+		;;
+	OSE68000 | ose68000)
+		basic_machine=m68000-ericsson
+		os=-ose
+		;;
+	os68k)
+		basic_machine=m68k-none
+		os=-os68k
+		;;
+	pa-hitachi)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	paragon)
+		basic_machine=i860-intel
+		os=-osf
+		;;
+	pbd)
+		basic_machine=sparc-tti
+		;;
+	pbb)
+		basic_machine=m68k-tti
+		;;
+	pc532 | pc532-*)
+		basic_machine=ns32k-pc532
+		;;
+	pentium | p5 | k5 | k6 | nexgen | viac3)
+		basic_machine=i586-pc
+		;;
+	pentiumpro | p6 | 6x86 | athlon | athlon_*)
+		basic_machine=i686-pc
+		;;
+	pentiumii | pentium2 | pentiumiii | pentium3)
+		basic_machine=i686-pc
+		;;
+	pentium4)
+		basic_machine=i786-pc
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium4-*)
+		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=power-ibm
+		;;
+	ppc)	basic_machine=powerpc-unknown
+		;;
+	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppcle | powerpclittle | ppc-le | powerpc-little)
+		basic_machine=powerpcle-unknown
+		;;
+	ppcle-* | powerpclittle-*)
+		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64)	basic_machine=powerpc64-unknown
+		;;
+	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+		basic_machine=powerpc64le-unknown
+		;;
+	ppc64le-* | powerpc64little-*)
+		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	pw32)
+		basic_machine=i586-unknown
+		os=-pw32
+		;;
+	rom68k)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	rm[46]00)
+		basic_machine=mips-siemens
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	s390 | s390-*)
+		basic_machine=s390-ibm
+		;;
+	s390x | s390x-*)
+		basic_machine=s390x-ibm
+		;;
+	sa29200)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	sb1)
+		basic_machine=mipsisa64sb1-unknown
+		;;
+	sb1el)
+		basic_machine=mipsisa64sb1el-unknown
+		;;
+	sei)
+		basic_machine=mips-sei
+		os=-seiux
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sh64)
+		basic_machine=sh64-unknown
+		;;
+	sparclite-wrs | simso-wrs)
+		basic_machine=sparclite-wrs
+		os=-vxworks
+		;;
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
+		;;
+	spur)
+		basic_machine=spur-unknown
+		;;
+	st2000)
+		basic_machine=m68k-tandem
+		;;
+	stratus)
+		basic_machine=i860-stratus
+		os=-sysv4
+		;;
+	sun2)
+		basic_machine=m68000-sun
+		;;
+	sun2os3)
+		basic_machine=m68000-sun
+		os=-sunos3
+		;;
+	sun2os4)
+		basic_machine=m68000-sun
+		os=-sunos4
+		;;
+	sun3os3)
+		basic_machine=m68k-sun
+		os=-sunos3
+		;;
+	sun3os4)
+		basic_machine=m68k-sun
+		os=-sunos4
+		;;
+	sun4os3)
+		basic_machine=sparc-sun
+		os=-sunos3
+		;;
+	sun4os4)
+		basic_machine=sparc-sun
+		os=-sunos4
+		;;
+	sun4sol2)
+		basic_machine=sparc-sun
+		os=-solaris2
+		;;
+	sun3 | sun3-*)
+		basic_machine=m68k-sun
+		;;
+	sun4)
+		basic_machine=sparc-sun
+		;;
+	sun386 | sun386i | roadrunner)
+		basic_machine=i386-sun
+		;;
+	sv1)
+		basic_machine=sv1-cray
+		os=-unicos
+		;;
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
+		;;
+	t3e)
+		basic_machine=alphaev5-cray
+		os=-unicos
+		;;
+	t90)
+		basic_machine=t90-cray
+		os=-unicos
+		;;
+	tic54x | c54x*)
+		basic_machine=tic54x-unknown
+		os=-coff
+		;;
+	tic55x | c55x*)
+		basic_machine=tic55x-unknown
+		os=-coff
+		;;
+	tic6x | c6x*)
+		basic_machine=tic6x-unknown
+		os=-coff
+		;;
+	tx39)
+		basic_machine=mipstx39-unknown
+		;;
+	tx39el)
+		basic_machine=mipstx39el-unknown
+		;;
+	toad1)
+		basic_machine=pdp10-xkl
+		os=-tops20
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	tpf)
+		basic_machine=s390x-ibm
+		os=-tpf
+		;;
+	udi29k)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
+		;;
+	v810 | necv810)
+		basic_machine=v810-nec
+		os=-none
+		;;
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
+		;;
+	vms)
+		basic_machine=vax-dec
+		os=-vms
+		;;
+	vpp*|vx|vx-*)
+		basic_machine=f301-fujitsu
+		;;
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
+		;;
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
+		;;
+	vxworks29k)
+		basic_machine=a29k-wrs
+		os=-vxworks
+		;;
+	w65*)
+		basic_machine=w65-wdc
+		os=-none
+		;;
+	w89k-*)
+		basic_machine=hppa1.1-winbond
+		os=-proelf
+		;;
+	xbox)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	z8k-*-coff)
+		basic_machine=z8k-unknown
+		os=-sim
+		;;
+	none)
+		basic_machine=none-none
+		os=-none
+		;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		basic_machine=hppa1.1-winbond
+		;;
+	op50n)
+		basic_machine=hppa1.1-oki
+		;;
+	op60c)
+		basic_machine=hppa1.1-oki
+		;;
+	romp)
+		basic_machine=romp-ibm
+		;;
+	mmix)
+		basic_machine=mmix-knuth
+		;;
+	rs6000)
+		basic_machine=rs6000-ibm
+		;;
+	vax)
+		basic_machine=vax-dec
+		;;
+	pdp10)
+		# there are many clones, so DEC is not a safe bet
+		basic_machine=pdp10-unknown
+		;;
+	pdp11)
+		basic_machine=pdp11-dec
+		;;
+	we32k)
+		basic_machine=we32k-att
+		;;
+	sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
+		basic_machine=sh-unknown
+		;;
+	sparc | sparcv8 | sparcv9 | sparcv9b)
+		basic_machine=sparc-sun
+		;;
+	cydra)
+		basic_machine=cydra-cydrome
+		;;
+	orion)
+		basic_machine=orion-highlevel
+		;;
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	mac | mpw | mac-mpw)
+		basic_machine=m68k-apple
+		;;
+	pmac | pmac-mpw)
+		basic_machine=powerpc-apple
+		;;
+	*-unknown)
+		# Make sure to match an already-canonicalized machine name.
+		;;
+	*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+	*-digital*)
+		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+		;;
+	*-commodore*)
+		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+        # First match some system type aliases
+        # that might get confused with valid system types.
+	# -solaris* is a basic system type, with this one exception.
+	-solaris1 | -solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	-solaris)
+		os=-solaris2
+		;;
+	-svr4*)
+		os=-sysv4
+		;;
+	-unixware*)
+		os=-sysv4.2uw
+		;;
+	-gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+		;;
+	# First accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST END IN A *, to match a version number.
+	# -sysv* is not here because it comes later, after sysvr4.
+	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+	      | -aos* \
+	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \
+	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+	      | -chorusos* | -chorusrdb* \
+	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+	      | -skyos* | -haiku*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	-qnx*)
+		case $basic_machine in
+		    x86-* | i*86-*)
+			;;
+		    *)
+			os=-nto$os
+			;;
+		esac
+		;;
+	-nto-qnx*)
+		;;
+	-nto*)
+		os=`echo $os | sed -e 's|nto|nto-qnx|'`
+		;;
+	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+		;;
+	-mac*)
+		os=`echo $os | sed -e 's|mac|macos|'`
+		;;
+	-linux-dietlibc)
+		os=-linux-dietlibc
+		;;
+	-linux*)
+		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+		;;
+	-sunos5*)
+		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+		;;
+	-sunos6*)
+		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+		;;
+	-opened*)
+		os=-openedition
+		;;
+        -os400*)
+		os=-os400
+		;;
+	-wince*)
+		os=-wince
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-atheos*)
+		os=-atheos
+		;;
+	-syllable*)
+		os=-syllable
+		;;
+	-386bsd)
+		os=-bsd
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	-nova*)
+		os=-rtmk-nova
+		;;
+	-ns2 )
+		os=-nextstep2
+		;;
+	-nsk*)
+		os=-nsk
+		;;
+	# Preserve the version number of sinix5.
+	-sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	-sinix*)
+		os=-sysv4
+		;;
+        -tpf*)
+		os=-tpf
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-svr4)
+		os=-sysv4
+		;;
+	-svr3)
+		os=-sysv3
+		;;
+	-sysvr4)
+		os=-sysv4
+		;;
+	# This must come after -sysvr4.
+	-sysv*)
+		;;
+	-ose*)
+		os=-ose
+		;;
+	-es1800*)
+		os=-ose
+		;;
+	-xenix)
+		os=-xenix
+		;;
+	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+		os=-mint
+		;;
+	-aros*)
+		os=-aros
+		;;
+	-kaos*)
+		os=-kaos
+		;;
+	-zvmoe)
+		os=-zvmoe
+		;;
+	-none)
+		;;
+	*)
+		# Get rid of the `-' at the beginning of $os.
+		os=`echo $os | sed 's/[^-]*-//'`
+		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+		exit 1
+		;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+	*-acorn)
+		os=-riscix1.2
+		;;
+	arm*-rebel)
+		os=-linux
+		;;
+	arm*-semi)
+		os=-aout
+		;;
+    c4x-* | tic4x-*)
+        os=-coff
+        ;;
+	# This must come before the *-dec entry.
+	pdp10-*)
+		os=-tops20
+		;;
+	pdp11-*)
+		os=-none
+		;;
+	*-dec | vax-*)
+		os=-ultrix4.2
+		;;
+	m68*-apollo)
+		os=-domain
+		;;
+	i386-sun)
+		os=-sunos4.0.2
+		;;
+	m68000-sun)
+		os=-sunos3
+		# This also exists in the configure program, but was not the
+		# default.
+		# os=-sunos4
+		;;
+	m68*-cisco)
+		os=-aout
+		;;
+	mips*-cisco)
+		os=-elf
+		;;
+	mips*-*)
+		os=-elf
+		;;
+	or32-*)
+		os=-coff
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	*-be)
+		os=-beos
+		;;
+	*-haiku)
+		os=-haiku
+		;;
+	*-ibm)
+		os=-aix
+		;;
+    	*-knuth)
+		os=-mmixware
+		;;
+	*-wec)
+		os=-proelf
+		;;
+	*-winbond)
+		os=-proelf
+		;;
+	*-oki)
+		os=-proelf
+		;;
+	*-hp)
+		os=-hpux
+		;;
+	*-hitachi)
+		os=-hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=-sysv
+		;;
+	*-cbm)
+		os=-amigaos
+		;;
+	*-dg)
+		os=-dgux
+		;;
+	*-dolphin)
+		os=-sysv3
+		;;
+	m68k-ccur)
+		os=-rtu
+		;;
+	m88k-omron*)
+		os=-luna
+		;;
+	*-next )
+		os=-nextstep
+		;;
+	*-sequent)
+		os=-ptx
+		;;
+	*-crds)
+		os=-unos
+		;;
+	*-ns)
+		os=-genix
+		;;
+	i370-*)
+		os=-mvs
+		;;
+	*-next)
+		os=-nextstep3
+		;;
+	*-gould)
+		os=-sysv
+		;;
+	*-highlevel)
+		os=-bsd
+		;;
+	*-encore)
+		os=-bsd
+		;;
+	*-sgi)
+		os=-irix
+		;;
+	*-siemens)
+		os=-sysv4
+		;;
+	*-masscomp)
+		os=-rtu
+		;;
+	f30[01]-fujitsu | f700-fujitsu)
+		os=-uxpv
+		;;
+	*-rom68k)
+		os=-coff
+		;;
+	*-*bug)
+		os=-coff
+		;;
+	*-apple)
+		os=-macos
+		;;
+	*-atari*)
+		os=-mint
+		;;
+	*)
+		os=-none
+		;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+	*-unknown)
+		case $os in
+			-riscix*)
+				vendor=acorn
+				;;
+			-sunos*)
+				vendor=sun
+				;;
+			-aix*)
+				vendor=ibm
+				;;
+			-beos*)
+				vendor=be
+				;;
+			-hpux*)
+				vendor=hp
+				;;
+			-mpeix*)
+				vendor=hp
+				;;
+			-hiux*)
+				vendor=hitachi
+				;;
+			-unos*)
+				vendor=crds
+				;;
+			-dgux*)
+				vendor=dg
+				;;
+			-luna*)
+				vendor=omron
+				;;
+			-genix*)
+				vendor=ns
+				;;
+			-mvs* | -opened*)
+				vendor=ibm
+				;;
+			-os400*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+			-tpf*)
+				vendor=ibm
+				;;
+			-vxsim* | -vxworks* | -windiss*)
+				vendor=wrs
+				;;
+			-aux*)
+				vendor=apple
+				;;
+			-hms*)
+				vendor=hitachi
+				;;
+			-mpw* | -macos*)
+				vendor=apple
+				;;
+			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+				vendor=atari
+				;;
+			-vos*)
+				vendor=stratus
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbget-src/configure
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbget-src/configure	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbget-src/configure	(revision 24799)
@@ -0,0 +1,5003 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.59 for tdbget 1.0.
+#
+# Report bugs to <jmt12@cs.waikato.ac.nz>.
+#
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)$' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\/\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  case $0 in
+    *[\\/]* ) as_myself=$0 ;;
+    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+       ;;
+  esac
+  # We did not find ourselves, most probably we were run as `sh COMMAND'
+  # in which case we are not to be found in the path.
+  if test "x$as_myself" = x; then
+    as_myself=$0
+  fi
+  if test ! -f "$as_myself"; then
+    { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+	 case $as_dir in
+	 /*)
+	   if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+	     CONFIG_SHELL=$as_dir/$as_base
+	     export CONFIG_SHELL
+	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+	   fi;;
+	 esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='	' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" 	$as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_config_libobj_dir=.
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete.  It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: ${ac_max_here_lines=38}
+
+# Identity of this package.
+PACKAGE_NAME='tdbget'
+PACKAGE_TARNAME='tdbget'
+PACKAGE_VERSION='1.0'
+PACKAGE_STRING='tdbget 1.0'
+PACKAGE_BUGREPORT='jmt12@cs.waikato.ac.nz'
+
+ac_unique_file="tdbget.cpp"
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar build build_cpu build_vendor build_os host host_cpu host_vendor host_os CXX CXXFLAGS LDFLAGS CPPFLAGS ac_ct_CXX EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CC CFLAGS ac_ct_CC CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CPP LIBOBJS LTLIBOBJS'
+ac_subst_files=''
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+ac_prev=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval "$ac_prev=\$ac_option"
+    ac_prev=
+    continue
+  fi
+
+  ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_option in
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+  | --da=*)
+    datadir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    eval "enable_$ac_feature=no" ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    case $ac_option in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "enable_$ac_feature='$ac_optarg'" ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst \
+  | --locals | --local | --loca | --loc | --lo)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    case $ac_option in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "with_$ac_package='$ac_optarg'" ;;
+
+  -without-* | --without-*)
+    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/-/_/g'`
+    eval "with_$ac_package=no" ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+    eval "$ac_envvar='$ac_optarg'"
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  { echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+  eval ac_val=$`echo $ac_var`
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
+	      localstatedir libdir includedir oldincludedir infodir mandir
+do
+  eval ac_val=$`echo $ac_var`
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* ) ;;
+    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then its parent.
+  ac_confdir=`(dirname "$0") 2>/dev/null ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$0" : 'X\(//\)[^/]' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$0" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r $srcdir/$ac_unique_file; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+  if test "$ac_srcdir_defaulted" = yes; then
+    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+   { (exit 1); exit 1; }; }
+  else
+    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+   { (exit 1); exit 1; }; }
+  fi
+fi
+(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
+  { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
+   { (exit 1); exit 1; }; }
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_CXX_set=${CXX+set}
+ac_env_CXX_value=$CXX
+ac_cv_env_CXX_set=${CXX+set}
+ac_cv_env_CXX_value=$CXX
+ac_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_env_CXXFLAGS_value=$CXXFLAGS
+ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_cv_env_CXXFLAGS_value=$CXXFLAGS
+ac_env_LDFLAGS_set=${LDFLAGS+set}
+ac_env_LDFLAGS_value=$LDFLAGS
+ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
+ac_cv_env_LDFLAGS_value=$LDFLAGS
+ac_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_env_CPPFLAGS_value=$CPPFLAGS
+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_cv_env_CPPFLAGS_value=$CPPFLAGS
+ac_env_CC_set=${CC+set}
+ac_env_CC_value=$CC
+ac_cv_env_CC_set=${CC+set}
+ac_cv_env_CC_value=$CC
+ac_env_CFLAGS_set=${CFLAGS+set}
+ac_env_CFLAGS_value=$CFLAGS
+ac_cv_env_CFLAGS_set=${CFLAGS+set}
+ac_cv_env_CFLAGS_value=$CFLAGS
+ac_env_CPP_set=${CPP+set}
+ac_env_CPP_value=$CPP
+ac_cv_env_CPP_set=${CPP+set}
+ac_cv_env_CPP_value=$CPP
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures tdbget 1.0 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+_ACEOF
+
+  cat <<_ACEOF
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+			  [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+			  [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR           user executables [EPREFIX/bin]
+  --sbindir=DIR          system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR       program executables [EPREFIX/libexec]
+  --datadir=DIR          read-only architecture-independent data [PREFIX/share]
+  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
+  --libdir=DIR           object code libraries [EPREFIX/lib]
+  --includedir=DIR       C header files [PREFIX/include]
+  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
+  --infodir=DIR          info documentation [PREFIX/info]
+  --mandir=DIR           man documentation [PREFIX/man]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of tdbget 1.0:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors
+
+Some influential environment variables:
+  CXX         C++ compiler command
+  CXXFLAGS    C++ compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have
+              headers in a nonstandard directory <include dir>
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  CPP         C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <jmt12@cs.waikato.ac.nz>.
+_ACEOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  ac_popdir=`pwd`
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d $ac_dir || continue
+    ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
+
+    cd $ac_dir
+    # Check for guested configure; otherwise get Cygnus style configure.
+    if test -f $ac_srcdir/configure.gnu; then
+      echo
+      $SHELL $ac_srcdir/configure.gnu  --help=recursive
+    elif test -f $ac_srcdir/configure; then
+      echo
+      $SHELL $ac_srcdir/configure  --help=recursive
+    elif test -f $ac_srcdir/configure.ac ||
+	   test -f $ac_srcdir/configure.in; then
+      echo
+      $ac_configure --help
+    else
+      echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi
+    cd $ac_popdir
+  done
+fi
+
+test -n "$ac_init_help" && exit 0
+if $ac_init_version; then
+  cat <<\_ACEOF
+tdbget configure 1.0
+generated by GNU Autoconf 2.59
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit 0
+fi
+exec 5>config.log
+cat >&5 <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by tdbget $as_me 1.0, which was
+generated by GNU Autoconf 2.59.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo               = `(hostinfo) 2>/dev/null               || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  echo "PATH: $as_dir"
+done
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_sep=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+      ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+    2)
+      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+	ac_must_keep_next=false # Got value, back to normal.
+      else
+	case $ac_arg in
+	  *=* | --config-cache | -C | -disable-* | --disable-* \
+	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+	  | -with-* | --with-* | -without-* | --without-* | --x)
+	    case "$ac_configure_args0 " in
+	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+	    esac
+	    ;;
+	  -* ) ac_must_keep_next=true ;;
+	esac
+      fi
+      ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+      # Get rid of the leading space.
+      ac_sep=" "
+      ;;
+    esac
+  done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Be sure not to use single quotes in there, as some shells,
+# such as our DU 5.0 friend, will then `close' the trap.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+{
+  (set) 2>&1 |
+    case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      sed -n \
+	"s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+      ;;
+    *)
+      sed -n \
+	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+}
+    echo
+
+    cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=$`echo $ac_var`
+      echo "$ac_var='"'"'$ac_val'"'"'"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      cat <<\_ASBOX
+## ------------- ##
+## Output files. ##
+## ------------- ##
+_ASBOX
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=$`echo $ac_var`
+	echo "$ac_var='"'"'$ac_val'"'"'"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+      echo
+      sed "/^$/d" confdefs.h | sort
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      echo "$as_me: caught signal $ac_signal"
+    echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core &&
+  rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+     ' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+  if test "x$prefix" != xNONE; then
+    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+  else
+    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+  fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+  if test -r "$ac_site_file"; then
+    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . $cache_file;;
+      *)                      . ./$cache_file;;
+    esac
+  fi
+else
+  { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+	       sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+  eval ac_new_val="\$ac_env_${ac_var}_value"
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+	{ echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	{ echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
+echo "$as_me:   former value:  $ac_old_val" >&2;}
+	{ echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
+echo "$as_me:   current value: $ac_new_val" >&2;}
+	ac_cache_corrupted=:
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+      ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+am__api_version="1.9"
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+  if test -f $ac_dir/install-sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f $ac_dir/install.sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f $ac_dir/shtool; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
+echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"
+ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+  ./ | .// | /cC/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+	if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	    break 3
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+done
+
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  We don't cache a
+    # path for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the path is relative.
+    INSTALL=$ac_install_sh
+  fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$*" != "X $srcdir/configure conftest.file" \
+      && test "$*" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      { { echo "$as_me:$LINENO: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" >&5
+echo "$as_me: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" >&2;}
+   { (exit 1); exit 1; }; }
+   fi
+
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   { { echo "$as_me:$LINENO: error: newly created file is older than distributed files!
+Check your system clock" >&5
+echo "$as_me: error: newly created file is older than distributed files!
+Check your system clock" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+test "$program_prefix" != NONE &&
+  program_transform_name="s,^,$program_prefix,;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s,\$,$program_suffix,;$program_transform_name"
+# Double any \ or $.  echo might interpret backslashes.
+# By default was `s,x,x', remove it if useless.
+cat <<\_ACEOF >conftest.sed
+s/[\\$]/&&/g;s/;s,x,x,$//
+_ACEOF
+program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
+rm conftest.sed
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+  # We used to keeping the `.' as first argument, in order to
+  # allow $(mkdir_p) to be used without argument.  As in
+  #   $(mkdir_p) $(somedir)
+  # where $(somedir) is conditionally defined.  However this is wrong
+  # for two reasons:
+  #  1. if the package is installed by a user who cannot write `.'
+  #     make install will fail,
+  #  2. the above comment should most certainly read
+  #     $(mkdir_p) $(DESTDIR)$(somedir)
+  #     so it does not work when $(somedir) is undefined and
+  #     $(DESTDIR) is not.
+  #  To support the latter case, we have to write
+  #     test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+  #  so the `.' trick is pointless.
+  mkdir_p='mkdir -p --'
+else
+  # On NextStep and OpenStep, the `mkdir' command does not
+  # recognize any option.  It will interpret all options as
+  # directories to create, and then abort because `.' already
+  # exists.
+  for d in ./-p ./--version;
+  do
+    test -d $d && rmdir $d
+  done
+  # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+  if test -f "$ac_aux_dir/mkinstalldirs"; then
+    mkdir_p='$(mkinstalldirs)'
+  else
+    mkdir_p='$(install_sh) -d'
+  fi
+fi
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AWK+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AWK="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  echo "$as_me:$LINENO: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$AWK" && break
+done
+
+echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.make <<\_ACEOF
+all:
+	@echo 'ac_maketemp="$(MAKE)"'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+  eval ac_cv_prog_make_${ac_make}_set=yes
+else
+  eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftest.make
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+  SET_MAKE=
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+   test -f $srcdir/config.status; then
+  { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
+echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='tdbget'
+ VERSION='1.0'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_STRIP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  STRIP=$ac_ct_STRIP
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+# Make sure we can run config.sub.
+$ac_config_sub sun4 >/dev/null 2>&1 ||
+  { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5
+echo "$as_me: error: cannot run $ac_config_sub" >&2;}
+   { (exit 1); exit 1; }; }
+
+echo "$as_me:$LINENO: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6
+if test "${ac_cv_build+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_build_alias=$build_alias
+test -z "$ac_cv_build_alias" &&
+  ac_cv_build_alias=`$ac_config_guess`
+test -z "$ac_cv_build_alias" &&
+  { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
+echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+   { (exit 1); exit 1; }; }
+ac_cv_build=`$ac_config_sub $ac_cv_build_alias` ||
+  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6
+build=$ac_cv_build
+build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+echo "$as_me:$LINENO: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6
+if test "${ac_cv_host+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_host_alias=$host_alias
+test -z "$ac_cv_host_alias" &&
+  ac_cv_host_alias=$ac_cv_build_alias
+ac_cv_host=`$ac_config_sub $ac_cv_host_alias` ||
+  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6
+host=$ac_cv_host
+host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+
+          ac_config_headers="$ac_config_headers config.h"
+
+
+# Checks for programs.
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  echo "$as_me:$LINENO: result: $CXX" >&5
+echo "${ECHO_T}$CXX" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$CXX" && break
+  done
+fi
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CXX="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5
+echo "${ECHO_T}$ac_ct_CXX" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_CXX" && break
+done
+test -n "$ac_ct_CXX" || ac_ct_CXX="g++"
+
+  CXX=$ac_ct_CXX
+fi
+
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+     "checking for C++ compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+  (eval $ac_compiler --version </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+  (eval $ac_compiler -v </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+  (eval $ac_compiler -V </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+echo "$as_me:$LINENO: checking for C++ compiler default output file name" >&5
+echo $ECHO_N "checking for C++ compiler default output file name... $ECHO_C" >&6
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
+  (eval $ac_link_default) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # Find the output, starting from the most likely.  This scheme is
+# not robust to junk in `.', hence go to wildcards (a.*) only as a last
+# resort.
+
+# Be careful to initialize this variable, since it used to be cached.
+# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
+ac_cv_exeext=
+# b.out is created by i960 compilers.
+for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
+	;;
+    conftest.$ac_ext )
+	# This is the source file.
+	;;
+    [ab].out )
+	# We found the default executable, but exeext='' is most
+	# certainly right.
+	break;;
+    *.* )
+	ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	# FIXME: I believe we export ac_cv_exeext for Libtool,
+	# but it would be cool to find out if it's true.  Does anybody
+	# maintain Libtool? --akim.
+	export ac_cv_exeext
+	break;;
+    * )
+	break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C++ compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C++ compiler cannot create executables
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6
+
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether the C++ compiler works" >&5
+echo $ECHO_N "checking whether the C++ compiler works... $ECHO_C" >&6
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+  if { ac_try='./$ac_file'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { echo "$as_me:$LINENO: error: cannot run C++ compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C++ compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+  fi
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6
+
+echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	  export ac_cv_exeext
+	  break;;
+    * ) break;;
+  esac
+done
+else
+  { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
+if test "${ac_cv_objext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6
+if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6
+GXX=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+CXXFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5
+echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cxx_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cxx_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cxx_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
+  else
+    CXXFLAGS="-g"
+  fi
+else
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
+  else
+    CXXFLAGS=
+  fi
+fi
+for ac_declaration in \
+   '' \
+   'extern "C" void std::exit (int) throw (); using std::exit;' \
+   'extern "C" void std::exit (int); using std::exit;' \
+   'extern "C" void exit (int) throw ();' \
+   'extern "C" void exit (int);' \
+   'void exit (int);'
+do
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+  echo '#ifdef __cplusplus' >>confdefs.h
+  echo $ac_declaration      >>confdefs.h
+  echo '#endif'             >>confdefs.h
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+DEPDIR="${am__leading_dot}deps"
+
+          ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
+echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+   am__include=include
+   am__quote=
+   _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+      am__include=.include
+      am__quote="\""
+      _am_result=BSD
+   fi
+fi
+
+
+echo "$as_me:$LINENO: result: $_am_result" >&5
+echo "${ECHO_T}$_am_result" >&6
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then
+  enableval="$enable_dependency_tracking"
+
+fi;
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+
+
+if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+
+
+depcc="$CXX"  am_compiler_list=
+
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CXX_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CXX_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+
+
+if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+  am__fastdepCXX_TRUE=
+  am__fastdepCXX_FALSE='#'
+else
+  am__fastdepCXX_TRUE='#'
+  am__fastdepCXX_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_CC" && break
+done
+
+  CC=$ac_ct_CC
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+     "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+  (eval $ac_compiler --version </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+  (eval $ac_compiler -v </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+  (eval $ac_compiler -V </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cc_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std1 is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std1.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX			-qlanglvl=ansi
+# Ultrix and OSF/1	-std1
+# HP-UX 10.20 and later	-Ae
+# HP-UX older versions	-Aa -D_HPUX_SOURCE
+# SVR4			-Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext
+done
+rm -f conftest.$ac_ext conftest.$ac_objext
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+  x|xno)
+    echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+  *)
+    echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+    CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+# Some people use a C++ compiler to compile C.  Since we use `exit',
+# in C++ we need to declare it.  In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >conftest.$ac_ext <<_ACEOF
+#ifndef __cplusplus
+  choke me
+#endif
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  for ac_declaration in \
+   '' \
+   'extern "C" void std::exit (int) throw (); using std::exit;' \
+   'extern "C" void std::exit (int); using std::exit;' \
+   'extern "C" void exit (int) throw ();' \
+   'extern "C" void exit (int);' \
+   'void exit (int);'
+do
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+  echo '#ifdef __cplusplus' >>confdefs.h
+  echo $ac_declaration      >>confdefs.h
+  echo '#endif'             >>confdefs.h
+fi
+
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CC"   am_compiler_list=
+
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+
+
+if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if test "${ac_cv_prog_CPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
+else
+  { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Checks for libraries.
+
+# Checks for header files.
+
+# Checks for typedefs, structures, and compiler characteristics.
+
+# Checks for library functions.
+
+# Completion
+          ac_config_files="$ac_config_files Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+{
+  (set) 2>&1 |
+    case `(ac_space=' '; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+	"s/'/'\\\\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;;
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n \
+	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+} |
+  sed '
+     t clear
+     : clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     : end' >>confcache
+if diff $cache_file confcache >/dev/null 2>&1; then :; else
+  if test -w $cache_file; then
+    test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+    cat confcache >$cache_file
+  else
+    echo "not updating unwritable cache $cache_file"
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[	 ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[	 ]*$//;
+}'
+fi
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_i=`echo "$ac_i" |
+	 sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
+  # 2. Add them.
+  ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)$' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\/\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  case $0 in
+    *[\\/]* ) as_myself=$0 ;;
+    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+       ;;
+  esac
+  # We did not find ourselves, most probably we were run as `sh COMMAND'
+  # in which case we are not to be found in the path.
+  if test "x$as_myself" = x; then
+    as_myself=$0
+  fi
+  if test ! -f "$as_myself"; then
+    { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+	 case $as_dir in
+	 /*)
+	   if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+	     CONFIG_SHELL=$as_dir/$as_base
+	     export CONFIG_SHELL
+	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+	   fi;;
+	 esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='	' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" 	$as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.  Logging --version etc. is OK.
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by tdbget $as_me 1.0, which was
+generated by GNU Autoconf 2.59.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+  echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_headers"; then
+  echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_links"; then
+  echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_commands"; then
+  echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number, then exit
+  -q, --quiet      do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+		   instantiate the configuration file FILE
+  --header=FILE[:TEMPLATE]
+		   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <bug-autoconf@gnu.org>."
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+tdbget config.status 1.0
+configured by $0, generated by GNU Autoconf 2.59,
+  with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=$srcdir
+INSTALL="$INSTALL"
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "x$1" : 'x\([^=]*\)='`
+    ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  -*)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  *) # This is not an option, so the user has probably given explicit
+     # arguments.
+     ac_option=$1
+     ac_need_defaults=false;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --vers* | -V )
+    echo "$ac_cs_version"; exit 0 ;;
+  --he | --h)
+    # Conflict between --help and --header
+    { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; };;
+  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit 0 ;;
+  --debug | --d* | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+    ac_need_defaults=false;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1" ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+  echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+  exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+#
+# INIT-COMMANDS section.
+#
+
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+_ACEOF
+
+
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_config_target in $ac_config_targets
+do
+  case "$ac_config_target" in
+  # Handling of arguments.
+  "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+  "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+  "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason to put it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./confstat$$-$RANDOM
+  (umask 077 && mkdir $tmp)
+} ||
+{
+   echo "$me: cannot create a temporary directory in ." >&2
+   { (exit 1); exit 1; }
+}
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+  # Protect against being on the right side of a sed subst in config.status.
+  sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+   s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
+s,@SHELL@,$SHELL,;t t
+s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s,@exec_prefix@,$exec_prefix,;t t
+s,@prefix@,$prefix,;t t
+s,@program_transform_name@,$program_transform_name,;t t
+s,@bindir@,$bindir,;t t
+s,@sbindir@,$sbindir,;t t
+s,@libexecdir@,$libexecdir,;t t
+s,@datadir@,$datadir,;t t
+s,@sysconfdir@,$sysconfdir,;t t
+s,@sharedstatedir@,$sharedstatedir,;t t
+s,@localstatedir@,$localstatedir,;t t
+s,@libdir@,$libdir,;t t
+s,@includedir@,$includedir,;t t
+s,@oldincludedir@,$oldincludedir,;t t
+s,@infodir@,$infodir,;t t
+s,@mandir@,$mandir,;t t
+s,@build_alias@,$build_alias,;t t
+s,@host_alias@,$host_alias,;t t
+s,@target_alias@,$target_alias,;t t
+s,@DEFS@,$DEFS,;t t
+s,@ECHO_C@,$ECHO_C,;t t
+s,@ECHO_N@,$ECHO_N,;t t
+s,@ECHO_T@,$ECHO_T,;t t
+s,@LIBS@,$LIBS,;t t
+s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
+s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
+s,@INSTALL_DATA@,$INSTALL_DATA,;t t
+s,@CYGPATH_W@,$CYGPATH_W,;t t
+s,@PACKAGE@,$PACKAGE,;t t
+s,@VERSION@,$VERSION,;t t
+s,@ACLOCAL@,$ACLOCAL,;t t
+s,@AUTOCONF@,$AUTOCONF,;t t
+s,@AUTOMAKE@,$AUTOMAKE,;t t
+s,@AUTOHEADER@,$AUTOHEADER,;t t
+s,@MAKEINFO@,$MAKEINFO,;t t
+s,@install_sh@,$install_sh,;t t
+s,@STRIP@,$STRIP,;t t
+s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t
+s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t
+s,@mkdir_p@,$mkdir_p,;t t
+s,@AWK@,$AWK,;t t
+s,@SET_MAKE@,$SET_MAKE,;t t
+s,@am__leading_dot@,$am__leading_dot,;t t
+s,@AMTAR@,$AMTAR,;t t
+s,@am__tar@,$am__tar,;t t
+s,@am__untar@,$am__untar,;t t
+s,@build@,$build,;t t
+s,@build_cpu@,$build_cpu,;t t
+s,@build_vendor@,$build_vendor,;t t
+s,@build_os@,$build_os,;t t
+s,@host@,$host,;t t
+s,@host_cpu@,$host_cpu,;t t
+s,@host_vendor@,$host_vendor,;t t
+s,@host_os@,$host_os,;t t
+s,@CXX@,$CXX,;t t
+s,@CXXFLAGS@,$CXXFLAGS,;t t
+s,@LDFLAGS@,$LDFLAGS,;t t
+s,@CPPFLAGS@,$CPPFLAGS,;t t
+s,@ac_ct_CXX@,$ac_ct_CXX,;t t
+s,@EXEEXT@,$EXEEXT,;t t
+s,@OBJEXT@,$OBJEXT,;t t
+s,@DEPDIR@,$DEPDIR,;t t
+s,@am__include@,$am__include,;t t
+s,@am__quote@,$am__quote,;t t
+s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t
+s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t
+s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t
+s,@CXXDEPMODE@,$CXXDEPMODE,;t t
+s,@am__fastdepCXX_TRUE@,$am__fastdepCXX_TRUE,;t t
+s,@am__fastdepCXX_FALSE@,$am__fastdepCXX_FALSE,;t t
+s,@CC@,$CC,;t t
+s,@CFLAGS@,$CFLAGS,;t t
+s,@ac_ct_CC@,$ac_ct_CC,;t t
+s,@CCDEPMODE@,$CCDEPMODE,;t t
+s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t
+s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t
+s,@CPP@,$CPP,;t t
+s,@LIBOBJS@,$LIBOBJS,;t t
+s,@LTLIBOBJS@,$LTLIBOBJS,;t t
+CEOF
+
+_ACEOF
+
+  cat >>$CONFIG_STATUS <<\_ACEOF
+  # Split the substitutions into bite-sized pieces for seds with
+  # small command number limits, like on Digital OSF/1 and HP-UX.
+  ac_max_sed_lines=48
+  ac_sed_frag=1 # Number of current file.
+  ac_beg=1 # First line for current file.
+  ac_end=$ac_max_sed_lines # Line after last line for current file.
+  ac_more_lines=:
+  ac_sed_cmds=
+  while $ac_more_lines; do
+    if test $ac_beg -gt 1; then
+      sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    else
+      sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    fi
+    if test ! -s $tmp/subs.frag; then
+      ac_more_lines=false
+    else
+      # The purpose of the label and of the branching condition is to
+      # speed up the sed processing (if there are no `@' at all, there
+      # is no need to browse any of the substitutions).
+      # These are the two extra sed commands mentioned above.
+      (echo ':t
+  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+      if test -z "$ac_sed_cmds"; then
+	ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+      else
+	ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+      fi
+      ac_sed_frag=`expr $ac_sed_frag + 1`
+      ac_beg=$ac_end
+      ac_end=`expr $ac_end + $ac_max_sed_lines`
+    fi
+  done
+  if test -z "$ac_sed_cmds"; then
+    ac_sed_cmds=cat
+  fi
+fi # test -n "$CONFIG_FILES"
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case $ac_file in
+  - | *:- | *:-:* ) # input from stdin
+	cat >$tmp/stdin
+	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
+  esac
+
+  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+  ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+  ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
+
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
+  esac
+
+  if test x"$ac_file" != x-; then
+    { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    rm -f "$ac_file"
+  fi
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated by config.status.  */
+  if test x"$ac_file" = x-; then
+    configure_input=
+  else
+    configure_input="$ac_file.  "
+  fi
+  configure_input=$configure_input"Generated from `echo $ac_file_in |
+				     sed 's,.*/,,'` by configure."
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo $tmp/stdin ;;
+      [\\/$]*)
+	 # Absolute (can't be DOS-style, as IFS=:)
+	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+	 echo "$f";;
+      *) # Relative
+	 if test -f "$f"; then
+	   # Build tree
+	   echo "$f"
+	 elif test -f "$srcdir/$f"; then
+	   # Source tree
+	   echo "$srcdir/$f"
+	 else
+	   # /dev/null tree
+	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+	 fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@abs_srcdir@,$ac_abs_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s,@builddir@,$ac_builddir,;t t
+s,@abs_builddir@,$ac_abs_builddir,;t t
+s,@top_builddir@,$ac_top_builddir,;t t
+s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
+s,@INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+  rm -f $tmp/stdin
+  if test x"$ac_file" != x-; then
+    mv $tmp/out $ac_file
+  else
+    cat $tmp/out
+    rm -f $tmp/out
+  fi
+
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_HEADER section.
+#
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s,^\([	 ]*\)#\([	 ]*define[	 ][	 ]*\)'
+ac_dB='[	 ].*$,\1#\2'
+ac_dC=' '
+ac_dD=',;t'
+# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_uA='s,^\([	 ]*\)#\([	 ]*\)undef\([	 ][	 ]*\)'
+ac_uB='$,\1#\2define\3'
+ac_uC=' '
+ac_uD=',;t'
+
+for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case $ac_file in
+  - | *:- | *:-:* ) # input from stdin
+	cat >$tmp/stdin
+	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
+  esac
+
+  test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo $tmp/stdin ;;
+      [\\/$]*)
+	 # Absolute (can't be DOS-style, as IFS=:)
+	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+	 # Do quote $f, to prevent DOS paths from being IFS'd.
+	 echo "$f";;
+      *) # Relative
+	 if test -f "$f"; then
+	   # Build tree
+	   echo "$f"
+	 elif test -f "$srcdir/$f"; then
+	   # Source tree
+	   echo "$srcdir/$f"
+	 else
+	   # /dev/null tree
+	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+	 fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+  # Remove the trailing spaces.
+  sed 's/[	 ]*$//' $ac_file_inputs >$tmp/in
+
+_ACEOF
+
+# Transform confdefs.h into two sed scripts, `conftest.defines' and
+# `conftest.undefs', that substitutes the proper values into
+# config.h.in to produce config.h.  The first handles `#define'
+# templates, and the second `#undef' templates.
+# And first: Protect against being on the right side of a sed subst in
+# config.status.  Protect against being in an unquoted here document
+# in config.status.
+rm -f conftest.defines conftest.undefs
+# Using a here document instead of a string reduces the quoting nightmare.
+# Putting comments in sed scripts is not portable.
+#
+# `end' is used to avoid that the second main sed command (meant for
+# 0-ary CPP macros) applies to n-ary macro definitions.
+# See the Autoconf documentation for `clear'.
+cat >confdef2sed.sed <<\_ACEOF
+s/[\\&,]/\\&/g
+s,[\\$`],\\&,g
+t clear
+: clear
+s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 (][^	 (]*\)\(([^)]*)\)[	 ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
+t end
+s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 ][^	 ]*\)[	 ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
+: end
+_ACEOF
+# If some macros were called several times there might be several times
+# the same #defines, which is useless.  Nevertheless, we may not want to
+# sort them, since we want the *last* AC-DEFINE to be honored.
+uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
+sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
+rm -f confdef2sed.sed
+
+# This sed command replaces #undef with comments.  This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >>conftest.undefs <<\_ACEOF
+s,^[	 ]*#[	 ]*undef[	 ][	 ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
+_ACEOF
+
+# Break up conftest.defines because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo '  # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
+echo '  if grep "^[	 ]*#[	 ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
+echo '  # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
+echo '  :' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.defines >/dev/null
+do
+  # Write a limited-size here document to $tmp/defines.sed.
+  echo '  cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
+  # Speed up: don't consider the non `#define' lines.
+  echo '/^[	 ]*#[	 ]*define/!b' >>$CONFIG_STATUS
+  # Work around the forget-to-reset-the-flag bug.
+  echo 't clr' >>$CONFIG_STATUS
+  echo ': clr' >>$CONFIG_STATUS
+  sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
+  echo 'CEOF
+  sed -f $tmp/defines.sed $tmp/in >$tmp/out
+  rm -f $tmp/in
+  mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+  sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
+  rm -f conftest.defines
+  mv conftest.tail conftest.defines
+done
+rm -f conftest.defines
+echo '  fi # grep' >>$CONFIG_STATUS
+echo >>$CONFIG_STATUS
+
+# Break up conftest.undefs because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo '  # Handle all the #undef templates' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.undefs >/dev/null
+do
+  # Write a limited-size here document to $tmp/undefs.sed.
+  echo '  cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
+  # Speed up: don't consider the non `#undef'
+  echo '/^[	 ]*#[	 ]*undef/!b' >>$CONFIG_STATUS
+  # Work around the forget-to-reset-the-flag bug.
+  echo 't clr' >>$CONFIG_STATUS
+  echo ': clr' >>$CONFIG_STATUS
+  sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
+  echo 'CEOF
+  sed -f $tmp/undefs.sed $tmp/in >$tmp/out
+  rm -f $tmp/in
+  mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+  sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
+  rm -f conftest.undefs
+  mv conftest.tail conftest.undefs
+done
+rm -f conftest.undefs
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated by config.status.  */
+  if test x"$ac_file" = x-; then
+    echo "/* Generated by configure.  */" >$tmp/config.h
+  else
+    echo "/* $ac_file.  Generated by configure.  */" >$tmp/config.h
+  fi
+  cat $tmp/in >>$tmp/config.h
+  rm -f $tmp/in
+  if test x"$ac_file" != x-; then
+    if diff $ac_file $tmp/config.h >/dev/null 2>&1; then
+      { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+      { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+      rm -f $ac_file
+      mv $tmp/config.h $ac_file
+    fi
+  else
+    cat $tmp/config.h
+    rm -f $tmp/config.h
+  fi
+# Compute $ac_file's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $ac_file | $ac_file:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null ||
+$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X$ac_file : 'X\(//\)[^/]' \| \
+	 X$ac_file : 'X\(//\)$' \| \
+	 X$ac_file : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X$ac_file |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`/stamp-h$_am_stamp_count
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_COMMANDS section.
+#
+for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
+  ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
+  ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
+  ac_dir=`(dirname "$ac_dest") 2>/dev/null ||
+$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_dest" : 'X\(//\)[^/]' \| \
+	 X"$ac_dest" : 'X\(//\)$' \| \
+	 X"$ac_dest" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_dest" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+  ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
+
+
+  { echo "$as_me:$LINENO: executing $ac_dest commands" >&5
+echo "$as_me: executing $ac_dest commands" >&6;}
+  case $ac_dest in
+    depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
+  # Strip MF so we end up with the name of the file.
+  mf=`echo "$mf" | sed -e 's/:.*$//'`
+  # Check whether this is an Automake generated Makefile or not.
+  # We used to match only the files named `Makefile.in', but
+  # some people rename them; so instead we look at the file content.
+  # Grep'ing the first line is not enough: some people post-process
+  # each Makefile.in and add a new line on top of each file to say so.
+  # So let's grep whole file.
+  if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+    dirpart=`(dirname "$mf") 2>/dev/null ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$mf" : 'X\(//\)[^/]' \| \
+	 X"$mf" : 'X\(//\)$' \| \
+	 X"$mf" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  else
+    continue
+  fi
+  # Extract the definition of DEPDIR, am__include, and am__quote
+  # from the Makefile without running `make'.
+  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+  test -z "$DEPDIR" && continue
+  am__include=`sed -n 's/^am__include = //p' < "$mf"`
+  test -z "am__include" && continue
+  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+  # When using ansi2knr, U may be empty or an underscore; expand it
+  U=`sed -n 's/^U = //p' < "$mf"`
+  # Find all dependency output files, they are included files with
+  # $(DEPDIR) in their names.  We invoke sed twice because it is the
+  # simplest approach to changing $(DEPDIR) to its actual value in the
+  # expansion.
+  for file in `sed -n "
+    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+    # Make sure the directory exists.
+    test -f "$dirpart/$file" && continue
+    fdir=`(dirname "$file") 2>/dev/null ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$file" : 'X\(//\)[^/]' \| \
+	 X"$file" : 'X\(//\)$' \| \
+	 X"$file" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    { if $as_mkdir_p; then
+    mkdir -p $dirpart/$fdir
+  else
+    as_dir=$dirpart/$fdir
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5
+echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+    # echo "creating $dirpart/$file"
+    echo '# dummy' > "$dirpart/$file"
+  done
+done
+ ;;
+  esac
+done
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || { (exit 1); exit 1; }
+fi
+
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbget-src/configure.ac
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbget-src/configure.ac	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbget-src/configure.ac	(revision 24799)
@@ -0,0 +1,25 @@
+#                                               -*- Autoconf -*-
+# Process this file with autoconf to produce a configure script.
+
+AC_PREREQ(2.59)
+AC_INIT([tdbget], [1.0], [jmt12@cs.waikato.ac.nz])
+AM_INIT_AUTOMAKE
+AC_CANONICAL_HOST
+AC_CONFIG_SRCDIR([tdbget.cpp])
+AC_CONFIG_HEADER([config.h])
+
+# Checks for programs.
+AC_PROG_CXX
+AC_PROG_CPP
+
+# Checks for libraries.
+
+# Checks for header files.
+
+# Checks for typedefs, structures, and compiler characteristics.
+
+# Checks for library functions.
+
+# Completion
+AC_CONFIG_FILES([Makefile])
+AC_OUTPUT
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbget-src/install-sh
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbget-src/install-sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbget-src/install-sh	(revision 24799)
@@ -0,0 +1,323 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2005-05-14.22
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.  It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+chmodcmd="$chmodprog 0755"
+chowncmd=
+chgrpcmd=
+stripcmd=
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=
+dst=
+dir_arg=
+dstarg=
+no_target_directory=
+
+usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+-c         (ignored)
+-d         create directories instead of installing files.
+-g GROUP   $chgrpprog installed files to GROUP.
+-m MODE    $chmodprog installed files to MODE.
+-o USER    $chownprog installed files to USER.
+-s         $stripprog installed files.
+-t DIRECTORY  install into DIRECTORY.
+-T         report an error if DSTFILE is a directory.
+--help     display this help and exit.
+--version  display version info and exit.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
+"
+
+while test -n "$1"; do
+  case $1 in
+    -c) shift
+        continue;;
+
+    -d) dir_arg=true
+        shift
+        continue;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+        shift
+        shift
+        continue;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) chmodcmd="$chmodprog $2"
+        shift
+        shift
+        continue;;
+
+    -o) chowncmd="$chownprog $2"
+        shift
+        shift
+        continue;;
+
+    -s) stripcmd=$stripprog
+        shift
+        continue;;
+
+    -t) dstarg=$2
+	shift
+	shift
+	continue;;
+
+    -T) no_target_directory=true
+	shift
+	continue;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    *)  # When -d is used, all remaining arguments are directories to create.
+	# When -t is used, the destination is already specified.
+	test -n "$dir_arg$dstarg" && break
+        # Otherwise, the last argument is the destination.  Remove it from $@.
+	for arg
+	do
+          if test -n "$dstarg"; then
+	    # $@ is not empty: it contains at least $arg.
+	    set fnord "$@" "$dstarg"
+	    shift # fnord
+	  fi
+	  shift # arg
+	  dstarg=$arg
+	done
+	break;;
+  esac
+done
+
+if test -z "$1"; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call `install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+for src
+do
+  # Protect names starting with `-'.
+  case $src in
+    -*) src=./$src ;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    src=
+
+    if test -d "$dst"; then
+      mkdircmd=:
+      chmodcmd=
+    else
+      mkdircmd=$mkdirprog
+    fi
+  else
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dstarg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+
+    dst=$dstarg
+    # Protect names starting with `-'.
+    case $dst in
+      -*) dst=./$dst ;;
+    esac
+
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
+    if test -d "$dst"; then
+      if test -n "$no_target_directory"; then
+	echo "$0: $dstarg: Is a directory" >&2
+	exit 1
+      fi
+      dst=$dst/`basename "$src"`
+    fi
+  fi
+
+  # This sed command emulates the dirname command.
+  dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'`
+
+  # Make sure that the destination directory exists.
+
+  # Skip lots of stat calls in the usual case.
+  if test ! -d "$dstdir"; then
+    defaultIFS='
+	 '
+    IFS="${IFS-$defaultIFS}"
+
+    oIFS=$IFS
+    # Some sh's can't handle IFS=/ for some reason.
+    IFS='%'
+    set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
+    shift
+    IFS=$oIFS
+
+    pathcomp=
+
+    while test $# -ne 0 ; do
+      pathcomp=$pathcomp$1
+      shift
+      if test ! -d "$pathcomp"; then
+        $mkdirprog "$pathcomp"
+	# mkdir can fail with a `File exist' error in case several
+	# install-sh are creating the directory concurrently.  This
+	# is OK.
+	test -d "$pathcomp" || exit
+      fi
+      pathcomp=$pathcomp/
+    done
+  fi
+
+  if test -n "$dir_arg"; then
+    $doit $mkdircmd "$dst" \
+      && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
+      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
+      && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
+      && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
+
+  else
+    dstfile=`basename "$dst"`
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+    trap '(exit $?); exit' 1 2 13 15
+
+    # Copy the file name to the temp name.
+    $doit $cpprog "$src" "$dsttmp" &&
+
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
+      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
+      && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
+      && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
+
+    # Now rename the file to the real destination.
+    { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
+      || {
+	   # The rename failed, perhaps because mv can't rename something else
+	   # to itself, or perhaps because mv is so ancient that it does not
+	   # support -f.
+
+	   # Now remove or move aside any old file at destination location.
+	   # We try this two ways since rm can't unlink itself on some
+	   # systems and the destination file might be busy for other
+	   # reasons.  In this case, the final cleanup might fail but the new
+	   # file should still install successfully.
+	   {
+	     if test -f "$dstdir/$dstfile"; then
+	       $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
+	       || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
+	       || {
+		 echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
+		 (exit 1); exit 1
+	       }
+	     else
+	       :
+	     fi
+	   } &&
+
+	   # Now rename the file to the real destination.
+	   $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
+	 }
+    }
+  fi || { (exit 1); exit 1; }
+done
+
+# The final little trick to "correctly" pass the exit status to the exit trap.
+{
+  (exit 0); exit 0
+}
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbget-src/tdbget.cpp
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbget-src/tdbget.cpp	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbget-src/tdbget.cpp	(revision 24799)
@@ -0,0 +1,108 @@
+/**********************************************************************
+ *
+ * tdbget -- retrieve a single value from the TDB database
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * Copyright (C) 2011  The New Zealand Digital Library Project
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *********************************************************************/
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#include <ospace\std\iostream>
+#elif defined(GSDL_USE_IOS_H)
+#include <iostream.h>
+#else
+#include <iostream>
+#endif
+
+#include <cstdlib>
+#include <cstring>
+
+#include <fcntl.h>
+#include "tdb.h"
+
+// use the standard namespace
+#if !defined (GSDL_NAMESPACE_BROKEN)
+#if defined(GSDL_USE_OBJECTSPACE)
+using namespace ospace::std;
+#else
+using namespace std;
+#endif
+#endif
+
+/**
+ */
+void
+printUsage (char *program_name)
+{
+  cerr << "usage: " << program_name << " <database_path> <key>" << endl << endl;
+}
+/** printUsage() **/
+
+/**
+ */
+int
+main (int argc, char *argv[])
+{
+  // sanity check
+  if (argc != 3)
+  {
+    printUsage(argv[0]);
+    exit (-1);
+  }
+
+  char *dbname = argv[1];
+
+  int hash_size = 0;
+  int tdb_flags = TDB_DEFAULT; // Default = 0
+  int open_flags = O_RDONLY;
+  TDB_CONTEXT *tdb = tdb_open(dbname, hash_size, tdb_flags, open_flags, 0664);
+  if (!tdb)
+  {
+    cerr << "couldn't create " << dbname << endl;
+    exit (0);
+  }
+
+  TDB_DATA key;
+  key.dsize = strlen(argv[2]);
+  key.dptr = (unsigned char*)argv[2];
+
+  TDB_DATA value = tdb_fetch (tdb, key);
+
+  if (value.dsize > 0)
+  {
+    for (int i = 0; i < value.dsize; i++)
+    {
+      cout << value.dptr[i];
+    }
+    cout << endl; // used to be printf("\n");
+    // caller responsible for freeing this memory
+    free(value.dptr);
+  }
+  else
+  {
+    cout << endl; // used to be printf("\n");
+  }
+
+  tdb_close (tdb);
+  return 0;
+}
+/** main() **/
+
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbkeys-src/.svnignore
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbkeys-src/.svnignore	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbkeys-src/.svnignore	(revision 24799)
@@ -0,0 +1,6 @@
+Makefile
+config.h
+config.log
+config.status
+stamp-h1
+tdbkeys
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbkeys-src/Makefile.in
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbkeys-src/Makefile.in	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbkeys-src/Makefile.in	(revision 24799)
@@ -0,0 +1,80 @@
+###########################################################################
+#
+# Makefile -- tdbdel
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999-2011  The New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+GSDL_DIR = ../../../..
+COMMON_DIR = $(GSDL_DIR)/common-src
+
+COMMON_PACKAGES_DIR = $(COMMON_DIR)/packages
+
+CXX = @CXX@
+CXXFLAGS = @CXXFLAGS@
+DEFS = @DEFS@
+INCLUDES = -I${GEXTTDBEDIT_INSTALLED}/include
+INSTALL = @INSTALL@
+LDFLAGS = @LDFLAGS@ -L${GEXTTDBEDIT_INSTALLED}/lib
+LIBS = @LIBS@ -ltdb
+
+
+CXXCOMPILE = $(CXX) -c $(CXXFLAGS) $(DEFS) $(INCLUDES)
+CXXLINK = $(CXX) $(LDFLAGS) -o $@
+
+
+.SUFFIXES:
+.SUFFIXES: .cpp .o
+.cpp.o:
+	$(CXXCOMPILE) $< 
+
+
+SOURCES = \
+	tdbkeys.cpp
+
+OBJECTS = \
+	tdbkeys.o
+
+EXECUTABLE_OBJECTS = \
+	$(OBJECTS)
+
+EXECUTABLE = tdbkeys
+
+
+# Default target: make the tdbkeys executable
+all: $(EXECUTABLE)
+
+tdbkeys: $(EXECUTABLE_OBJECTS)
+	$(CXXLINK) $(EXECUTABLE_OBJECTS) $(LIBS)
+
+install: $(EXECUTABLE)
+	$(INSTALL) -d ${GEXTTDBEDIT_INSTALLED}/bin
+	$(INSTALL) -m 755 -s $(EXECUTABLE) ${GEXTTDBEDIT_INSTALLED}/bin
+
+clean:
+	rm -f $(OBJECTS) $(EXECUTABLE)
+
+distclean:
+	rm -f $(OBJECTS) $(EXECUTABLE) Makefile
+
+depend:
+	makedepend -Y -- $(DEFS) $(INCLUDES) $(CXXFLAGS) -- $(SOURCES)
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbkeys-src/aclocal.m4
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbkeys-src/aclocal.m4	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbkeys-src/aclocal.m4	(revision 24799)
@@ -0,0 +1,850 @@
+# generated automatically by aclocal 1.9.6 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005  Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# Copyright (C) 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION so it can be traced.
+# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+	 [AM_AUTOMAKE_VERSION([1.9.6])])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 7
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])
+AC_SUBST([$1_FALSE])
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 8
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
+       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
+       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                   [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 3
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[for mf in $CONFIG_FILES; do
+  # Strip MF so we end up with the name of the file.
+  mf=`echo "$mf" | sed -e 's/:.*$//'`
+  # Check whether this is an Automake generated Makefile or not.
+  # We used to match only the files named `Makefile.in', but
+  # some people rename them; so instead we look at the file content.
+  # Grep'ing the first line is not enough: some people post-process
+  # each Makefile.in and add a new line on top of each file to say so.
+  # So let's grep whole file.
+  if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+    dirpart=`AS_DIRNAME("$mf")`
+  else
+    continue
+  fi
+  # Extract the definition of DEPDIR, am__include, and am__quote
+  # from the Makefile without running `make'.
+  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+  test -z "$DEPDIR" && continue
+  am__include=`sed -n 's/^am__include = //p' < "$mf"`
+  test -z "am__include" && continue
+  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+  # When using ansi2knr, U may be empty or an underscore; expand it
+  U=`sed -n 's/^U = //p' < "$mf"`
+  # Find all dependency output files, they are included files with
+  # $(DEPDIR) in their names.  We invoke sed twice because it is the
+  # simplest approach to changing $(DEPDIR) to its actual value in the
+  # expansion.
+  for file in `sed -n "
+    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+    # Make sure the directory exists.
+    test -f "$dirpart/$file" && continue
+    fdir=`AS_DIRNAME(["$file"])`
+    AS_MKDIR_P([$dirpart/$fdir])
+    # echo "creating $dirpart/$file"
+    echo '# dummy' > "$dirpart/$file"
+  done
+done
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled.  FIXME.  This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 12
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.58])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+   test -f $srcdir/config.status; then
+  AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AM_PROG_INSTALL_SH
+AM_PROG_INSTALL_STRIP
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+              [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+	      		     [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+                  [_AM_DEPENDENCIES(CC)],
+                  [define([AC_PROG_CC],
+                          defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+                  [_AM_DEPENDENCIES(CXX)],
+                  [define([AC_PROG_CXX],
+                          defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+])
+])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $1 | $1:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Check to see how 'make' treats includes.	            -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+   am__include=include
+   am__quote=
+   _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+      am__include=.include
+      am__quote="\""
+      _am_result=BSD
+   fi
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise.
+#
+# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories
+# created by `make install' are always world readable, even if the
+# installer happens to have an overly restrictive umask (e.g. 077).
+# This was a mistake.  There are at least two reasons why we must not
+# use `-m 0755':
+#   - it causes special bits like SGID to be ignored,
+#   - it may be too restrictive (some setups expect 775 directories).
+#
+# Do not use -m 0755 and let people choose whatever they expect by
+# setting umask.
+#
+# We cannot accept any implementation of `mkdir' that recognizes `-p'.
+# Some implementations (such as Solaris 8's) are not thread-safe: if a
+# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c'
+# concurrently, both version can detect that a/ is missing, but only
+# one can create it and the other will error out.  Consequently we
+# restrict ourselves to GNU make (using the --version option ensures
+# this.)
+AC_DEFUN([AM_PROG_MKDIR_P],
+[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+  # We used to keeping the `.' as first argument, in order to
+  # allow $(mkdir_p) to be used without argument.  As in
+  #   $(mkdir_p) $(somedir)
+  # where $(somedir) is conditionally defined.  However this is wrong
+  # for two reasons:
+  #  1. if the package is installed by a user who cannot write `.'
+  #     make install will fail,
+  #  2. the above comment should most certainly read
+  #     $(mkdir_p) $(DESTDIR)$(somedir)
+  #     so it does not work when $(somedir) is undefined and
+  #     $(DESTDIR) is not.
+  #  To support the latter case, we have to write
+  #     test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+  #  so the `.' trick is pointless.
+  mkdir_p='mkdir -p --'
+else
+  # On NextStep and OpenStep, the `mkdir' command does not
+  # recognize any option.  It will interpret all options as
+  # directories to create, and then abort because `.' already
+  # exists.
+  for d in ./-p ./--version;
+  do
+    test -d $d && rmdir $d
+  done
+  # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+  if test -f "$ac_aux_dir/mkinstalldirs"; then
+    mkdir_p='$(mkinstalldirs)'
+  else
+    mkdir_p='$(install_sh) -d'
+  fi
+fi
+AC_SUBST([mkdir_p])])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+   if test "$[*]" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$[*]" != "X $srcdir/configure conftest.file" \
+      && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+     [m4_case([$1], [ustar],, [pax],,
+              [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+  case $_am_tool in
+  gnutar)
+    for _am_tar in tar gnutar gtar;
+    do
+      AM_RUN_LOG([$_am_tar --version]) && break
+    done
+    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+    am__untar="$_am_tar -xf -"
+    ;;
+  plaintar)
+    # Must skip GNU tar: if it does not support --format= it doesn't create
+    # ustar tarball either.
+    (tar --version) >/dev/null 2>&1 && continue
+    am__tar='tar chf - "$$tardir"'
+    am__tar_='tar chf - "$tardir"'
+    am__untar='tar xf -'
+    ;;
+  pax)
+    am__tar='pax -L -x $1 -w "$$tardir"'
+    am__tar_='pax -L -x $1 -w "$tardir"'
+    am__untar='pax -r'
+    ;;
+  cpio)
+    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+    am__untar='cpio -i -H $1 -d'
+    ;;
+  none)
+    am__tar=false
+    am__tar_=false
+    am__untar=false
+    ;;
+  esac
+
+  # If the value was cached, stop now.  We just wanted to have am__tar
+  # and am__untar set.
+  test -n "${am_cv_prog_tar_$1}" && break
+
+  # tar/untar a dummy directory, and stop if the command works
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  echo GrepMe > conftest.dir/file
+  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+  rm -rf conftest.dir
+  if test -s conftest.tar; then
+    AM_RUN_LOG([$am__untar <conftest.tar])
+    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+  fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbkeys-src/config.guess
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbkeys-src/config.guess	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbkeys-src/config.guess	(revision 24799)
@@ -0,0 +1,1298 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+#   Free Software Foundation, Inc.
+
+timestamp='2001-07-12'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Written by Per Bothner <bothner@cygnus.com>.
+# Please send patches to <config-patches@gnu.org>.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit 0 ;;
+    --version | -v )
+       echo "$version" ; exit 0 ;;
+    --help | --h* | -h )
+       echo "$usage"; exit 0 ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+
+dummy=dummy-$$
+trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script.
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int dummy(){}" > $dummy.c ;
+	for c in cc gcc c89 ; do
+	  ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ;
+	  if test $? = 0 ; then
+	     CC_FOR_BUILD="$c"; break ;
+	  fi ;
+	done ;
+	rm -f $dummy.c $dummy.o $dummy.rel ;
+	if test x"$CC_FOR_BUILD" = x ; then
+	  CC_FOR_BUILD=no_compiler_found ;
+	fi
+	;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+	# Netbsd (nbsd) targets should (where applicable) match one or
+	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	# Determine the machine/vendor (is the vendor relevant).
+	case "${UNAME_MACHINE}" in
+	    amiga) machine=m68k-unknown ;;
+	    arm32) machine=arm-unknown ;;
+	    atari*) machine=m68k-atari ;;
+	    sun3*) machine=m68k-sun ;;
+	    mac68k) machine=m68k-apple ;;
+	    macppc) machine=powerpc-apple ;;
+	    hp3[0-9][05]) machine=m68k-hp ;;
+	    ibmrt|romp-ibm) machine=romp-ibm ;;
+	    *) machine=${UNAME_MACHINE}-unknown ;;
+	esac
+	# The Operating System including object format, if it has switched
+	# to ELF recently, or will in the future.
+	case "${UNAME_MACHINE}" in
+	    i386|sparc|amiga|arm*|hp300|mvme68k|vax|atari|luna68k|mac68k|news68k|next68k|pc532|sun3*|x68k)
+		eval $set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep __ELF__ >/dev/null
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+	        os=netbsd
+		;;
+	esac
+	# The OS release
+	release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	echo "${machine}-${os}${release}"
+	exit 0 ;;
+    alpha:OSF1:*:*)
+	if test $UNAME_RELEASE = "V4.0"; then
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+	fi
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	cat <<EOF >$dummy.s
+	.data
+\$Lformat:
+	.byte 37,100,45,37,120,10,0	# "%d-%x\n"
+
+	.text
+	.globl main
+	.align 4
+	.ent main
+main:
+	.frame \$30,16,\$26,0
+	ldgp \$29,0(\$27)
+	.prologue 1
+	.long 0x47e03d80 # implver \$0
+	lda \$2,-1
+	.long 0x47e20c21 # amask \$2,\$1
+	lda \$16,\$Lformat
+	mov \$0,\$17
+	not \$1,\$18
+	jsr \$26,printf
+	ldgp \$29,0(\$26)
+	mov 0,\$16
+	jsr \$26,exit
+	.end main
+EOF
+	eval $set_cc_for_build
+	$CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
+	if test "$?" = 0 ; then
+		case `./$dummy` in
+			0-0)
+				UNAME_MACHINE="alpha"
+				;;
+			1-0)
+				UNAME_MACHINE="alphaev5"
+				;;
+			1-1)
+				UNAME_MACHINE="alphaev56"
+				;;
+			1-101)
+				UNAME_MACHINE="alphapca56"
+				;;
+			2-303)
+				UNAME_MACHINE="alphaev6"
+				;;
+			2-307)
+				UNAME_MACHINE="alphaev67"
+				;;
+		esac
+	fi
+	rm -f $dummy.s $dummy
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	exit 0 ;;
+    Alpha\ *:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# Should we change UNAME_MACHINE based on the output of uname instead
+	# of the specific Alpha model?
+	echo alpha-pc-interix
+	exit 0 ;;
+    21064:Windows_NT:50:3)
+	echo alpha-dec-winnt3.5
+	exit 0 ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-unknown-sysv4
+	exit 0;;
+    amiga:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-amigaos
+	exit 0 ;;
+    arc64:OpenBSD:*:*)
+	echo mips64el-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    arc:OpenBSD:*:*)
+	echo mipsel-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    hkmips:OpenBSD:*:*)
+	echo mips-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    pmax:OpenBSD:*:*)
+	echo mipsel-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    sgi:OpenBSD:*:*)
+	echo mips-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    wgrisc:OpenBSD:*:*)
+	echo mipsel-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    *:OS/390:*:*)
+	echo i370-ibm-openedition
+	exit 0 ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit 0;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit 0;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit 0 ;;
+    NILE*:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit 0 ;;
+    sun4H:SunOS:5.*:*)
+	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    i86pc:SunOS:5.*:*)
+	echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    sun4*:SunOS:*:*)
+	case "`/usr/bin/arch -k`" in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+	exit 0 ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos${UNAME_RELEASE}
+	exit 0 ;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+	case "`/bin/arch`" in
+	    sun3)
+		echo m68k-sun-sunos${UNAME_RELEASE}
+		;;
+	    sun4)
+		echo sparc-sun-sunos${UNAME_RELEASE}
+		;;
+	esac
+	exit 0 ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos${UNAME_RELEASE}
+	exit 0 ;;
+    atari*:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit 0 ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+        exit 0 ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit 0 ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+        echo m68k-milan-mint${UNAME_RELEASE}
+        exit 0 ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+        echo m68k-hades-mint${UNAME_RELEASE}
+        exit 0 ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+        echo m68k-unknown-mint${UNAME_RELEASE}
+        exit 0 ;;
+    sun3*:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    mac68k:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    mvme68k:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    mvme88k:OpenBSD:*:*)
+	echo m88k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten${UNAME_RELEASE}
+	exit 0 ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit 0 ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit 0 ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit 0 ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	echo clipper-intergraph-clix${UNAME_RELEASE}
+	exit 0 ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	sed 's/^	//' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	eval $set_cc_for_build
+	$CC_FOR_BUILD $dummy.c -o $dummy \
+	  && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+	  && rm -f $dummy.c $dummy && exit 0
+	rm -f $dummy.c $dummy
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit 0 ;;
+    Motorola:PowerMAX_OS:*:*)
+	echo powerpc-motorola-powermax
+	exit 0 ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit 0 ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit 0 ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit 0 ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit 0 ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+	then
+	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+	       [ ${TARGET_BINARY_INTERFACE}x = x ]
+	    then
+		echo m88k-dg-dgux${UNAME_RELEASE}
+	    else
+		echo m88k-dg-dguxbcs${UNAME_RELEASE}
+	    fi
+	else
+	    echo i586-dg-dgux${UNAME_RELEASE}
+	fi
+ 	exit 0 ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit 0 ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit 0 ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit 0 ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit 0 ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+	exit 0 ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	echo romp-ibm-aix      # uname -m gives an 8 hex-code CPU id
+	exit 0 ;;              # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+	echo i386-ibm-aix
+	exit 0 ;;
+    ia64:AIX:*:*)
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+	exit 0 ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		sed 's/^		//' << EOF >$dummy.c
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		eval $set_cc_for_build
+		$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
+		rm -f $dummy.c $dummy
+		echo rs6000-ibm-aix3.2.5
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		echo rs6000-ibm-aix3.2.4
+	else
+		echo rs6000-ibm-aix3.2
+	fi
+	exit 0 ;;
+    *:AIX:*:[45])
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit 0 ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit 0 ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+	echo romp-ibm-bsd4.4
+	exit 0 ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+	exit 0 ;;                           # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit 0 ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit 0 ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit 0 ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit 0 ;;
+    9000/[34678]??:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+              case "${HPUX_REV}" in
+                11.[0-9][0-9])
+                  if [ -x /usr/bin/getconf ]; then
+                    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+                    case "${sc_cpu_version}" in
+                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+                      532)                      # CPU_PA_RISC2_0
+                        case "${sc_kernel_bits}" in
+                          32) HP_ARCH="hppa2.0n" ;;
+                          64) HP_ARCH="hppa2.0w" ;;
+                        esac ;;
+                    esac
+                  fi ;;
+              esac
+              if [ "${HP_ARCH}" = "" ]; then
+              sed 's/^              //' << EOF >$dummy.c
+
+              #define _HPUX_SOURCE
+              #include <stdlib.h>
+              #include <unistd.h>
+
+              int main ()
+              {
+              #if defined(_SC_KERNEL_BITS)
+                  long bits = sysconf(_SC_KERNEL_BITS);
+              #endif
+                  long cpu  = sysconf (_SC_CPU_VERSION);
+
+                  switch (cpu)
+              	{
+              	case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+              	case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+              	case CPU_PA_RISC2_0:
+              #if defined(_SC_KERNEL_BITS)
+              	    switch (bits)
+              		{
+              		case 64: puts ("hppa2.0w"); break;
+              		case 32: puts ("hppa2.0n"); break;
+              		default: puts ("hppa2.0"); break;
+              		} break;
+              #else  /* !defined(_SC_KERNEL_BITS) */
+              	    puts ("hppa2.0"); break;
+              #endif
+              	default: puts ("hppa1.0"); break;
+              	}
+                  exit (0);
+              }
+EOF
+	eval $set_cc_for_build
+	(CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy`
+	if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi
+	rm -f $dummy.c $dummy
+	fi ;;
+	esac
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit 0 ;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ia64-hp-hpux${HPUX_REV}
+	exit 0 ;;
+    3050*:HI-UX:*:*)
+	sed 's/^	//' << EOF >$dummy.c
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	eval $set_cc_for_build
+	$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
+	rm -f $dummy.c $dummy
+	echo unknown-hitachi-hiuxwe2
+	exit 0 ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit 0 ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit 0 ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+	echo hppa1.0-hp-mpeix
+	exit 0 ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit 0 ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit 0 ;;
+    i*86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo ${UNAME_MACHINE}-unknown-osf1mk
+	else
+	    echo ${UNAME_MACHINE}-unknown-osf1
+	fi
+	exit 0 ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit 0 ;;
+    hppa*:OpenBSD:*:*)
+	echo hppa-unknown-openbsd
+	exit 0 ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+        exit 0 ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+        exit 0 ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+        exit 0 ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+        exit 0 ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+        exit 0 ;;
+    CRAY*X-MP:*:*:*)
+	echo xmp-cray-unicos
+        exit 0 ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*[A-Z]90:*:*:*)
+	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+	      -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*T3D:*:*:*)
+	echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*T3E:*:*:*)
+	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*SV1:*:*:*)
+	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY-2:*:*:*)
+	echo cray2-cray-unicos
+        exit 0 ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit 0 ;;
+    hp300:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+	exit 0 ;;
+    sparc*:BSD/OS:*:*)
+	echo sparc-unknown-bsdi${UNAME_RELEASE}
+	exit 0 ;;
+    *:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit 0 ;;
+    *:FreeBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit 0 ;;
+    *:OpenBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+	exit 0 ;;
+    i*:CYGWIN*:*)
+	echo ${UNAME_MACHINE}-pc-cygwin
+	exit 0 ;;
+    i*:MINGW*:*)
+	echo ${UNAME_MACHINE}-pc-mingw32
+	exit 0 ;;
+    i*:PW*:*)
+	echo ${UNAME_MACHINE}-pc-pw32
+	exit 0 ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+	# UNAME_MACHINE based on the output of uname instead of i386?
+	echo i386-pc-interix
+	exit 0 ;;
+    i*:UWIN*:*)
+	echo ${UNAME_MACHINE}-pc-uwin
+	exit 0 ;;
+    p*:CYGWIN*:*)
+	echo powerpcle-unknown-cygwin
+	exit 0 ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    *:GNU:*:*)
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit 0 ;;
+    i*86:Minix:*:*)
+	echo ${UNAME_MACHINE}-pc-minix
+	exit 0 ;;
+    arm*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    ia64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux
+	exit 0 ;;
+    m68*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    mips:Linux:*:*)
+	case `sed -n '/^byte/s/^.*: \(.*\) endian/\1/p' < /proc/cpuinfo` in
+	  big)    echo mips-unknown-linux-gnu && exit 0 ;;
+	  little) echo mipsel-unknown-linux-gnu && exit 0 ;;
+	esac
+	;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-gnu
+	exit 0 ;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev67 ;;
+        esac
+	objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+	exit 0 ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
+	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
+	  *)    echo hppa-unknown-linux-gnu ;;
+	esac
+	exit 0 ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-gnu
+	exit 0 ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	echo ${UNAME_MACHINE}-ibm-linux
+	exit 0 ;;
+    sh*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    x86_64:Linux:*:*)
+	echo x86_64-unknown-linux-gnu
+	exit 0 ;;
+    i*86:Linux:*:*)
+	# The BFD linker knows what the default object file format is, so
+	# first see if it will tell us. cd to the root directory to prevent
+	# problems with other programs or directories called `ld' in the path.
+	ld_supported_targets=`cd /; ld --help 2>&1 \
+			 | sed -ne '/supported targets:/!d
+				    s/[ 	][ 	]*/ /g
+				    s/.*supported targets: *//
+				    s/ .*//
+				    p'`
+        case "$ld_supported_targets" in
+	  elf32-i386)
+		TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+		;;
+	  a.out-i386-linux)
+		echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+		exit 0 ;;		
+	  coff-i386)
+		echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+		exit 0 ;;
+	  "")
+		# Either a pre-BFD a.out linker (linux-gnuoldld) or
+		# one that does not give us useful --help.
+		echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+		exit 0 ;;
+	esac
+	# Determine whether the default compiler is a.out or elf
+	cat >$dummy.c <<EOF
+#include <features.h>
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+#ifdef __ELF__
+# ifdef __GLIBC__
+#  if __GLIBC__ >= 2
+    printf ("%s-pc-linux-gnu\n", argv[1]);
+#  else
+    printf ("%s-pc-linux-gnulibc1\n", argv[1]);
+#  endif
+# else
+   printf ("%s-pc-linux-gnulibc1\n", argv[1]);
+# endif
+#else
+  printf ("%s-pc-linux-gnuaout\n", argv[1]);
+#endif
+  return 0;
+}
+EOF
+	eval $set_cc_for_build
+	$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0
+	rm -f $dummy.c $dummy
+	test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
+	;;
+    i*86:DYNIX/ptx:4*:*)
+	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+	# earlier versions are messed up and put the nodename in both
+	# sysname and nodename.
+	echo i386-sequent-sysv4
+	exit 0 ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+        # Unixware is an offshoot of SVR4, but it has its own version
+        # number series starting with 2...
+        # I am not positive that other SVR4 systems won't match this,
+	# I just have to hope.  -- rms.
+        # Use sysv4.2uw... so that sysv4* matches it.
+	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+	exit 0 ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+	else
+		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+	fi
+	exit 0 ;;
+    i*86:*:5:[78]*)
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	exit 0 ;;
+    i*86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-pc-sysv32
+	fi
+	exit 0 ;;
+    i*86:*DOS:*:*)
+	echo ${UNAME_MACHINE}-pc-msdosdjgpp
+	exit 0 ;;
+    pc:*:*:*)
+	# Left here for compatibility:
+        # uname -m prints for DJGPP always 'pc', but it prints nothing about
+        # the processor, so we play safe by assuming i386.
+	echo i386-pc-msdosdjgpp
+        exit 0 ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit 0 ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit 0 ;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	fi
+	exit 0 ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit 0 ;;
+    M68*:*:R3V[567]*:*)
+	test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+    3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && echo i486-ncr-sysv4.3${OS_REL} && exit 0
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && echo i486-ncr-sysv4 && exit 0 ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+	echo m68k-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit 0 ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+	echo i386-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    rs6000:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+	echo powerpc-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv${UNAME_RELEASE}
+	exit 0 ;;
+    RM*:ReliantUNIX-*:*:*)
+	echo mips-sni-sysv4
+	exit 0 ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit 0 ;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		echo ${UNAME_MACHINE}-sni-sysv4
+	else
+		echo ns32k-sni-sysv
+	fi
+	exit 0 ;;
+    PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                           # says <Richard.M.Bartel@ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit 0 ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes@openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit 0 ;;
+    *:*:*:FTX*)
+	# From seanf@swdc.stratus.com.
+	echo i860-stratus-sysv4
+	exit 0 ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux${UNAME_RELEASE}
+	exit 0 ;;
+    news*:NEWS-OS:6*:*)
+	echo mips-sony-newsos6
+	exit 0 ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+	if [ -d /usr/nec ]; then
+	        echo mips-nec-sysv${UNAME_RELEASE}
+	else
+	        echo mips-unknown-sysv${UNAME_RELEASE}
+	fi
+        exit 0 ;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	echo powerpc-be-beos
+	exit 0 ;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	echo powerpc-apple-beos
+	exit 0 ;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	echo i586-pc-beos
+	exit 0 ;;
+    SX-4:SUPER-UX:*:*)
+	echo sx4-nec-superux${UNAME_RELEASE}
+	exit 0 ;;
+    SX-5:SUPER-UX:*:*)
+	echo sx5-nec-superux${UNAME_RELEASE}
+	exit 0 ;;
+    Power*:Rhapsody:*:*)
+	echo powerpc-apple-rhapsody${UNAME_RELEASE}
+	exit 0 ;;
+    *:Rhapsody:*:*)
+	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+	exit 0 ;;
+    *:Darwin:*:*)
+	echo `uname -p`-apple-darwin${UNAME_RELEASE}
+	exit 0 ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	if test "${UNAME_MACHINE}" = "x86pc"; then
+		UNAME_MACHINE=pc
+	fi
+	echo `uname -p`-${UNAME_MACHINE}-nto-qnx
+	exit 0 ;;
+    *:QNX:*:4*)
+	echo i386-pc-qnx
+	exit 0 ;;
+    NSR-[KW]:NONSTOP_KERNEL:*:*)
+	echo nsr-tandem-nsk${UNAME_RELEASE}
+	exit 0 ;;
+    *:NonStop-UX:*:*)
+	echo mips-compaq-nonstopux
+	exit 0 ;;
+    BS2000:POSIX*:*:*)
+	echo bs2000-siemens-sysv
+	exit 0 ;;
+    DS/*:UNIX_System_V:*:*)
+	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+	exit 0 ;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	if test "$cputype" = "386"; then
+	    UNAME_MACHINE=i386
+	else
+	    UNAME_MACHINE="$cputype"
+	fi
+	echo ${UNAME_MACHINE}-unknown-plan9
+	exit 0 ;;
+    i*86:OS/2:*:*)
+	# If we were able to find `uname', then EMX Unix compatibility
+	# is probably installed.
+	echo ${UNAME_MACHINE}-pc-os2-emx
+	exit 0 ;;
+    *:TOPS-10:*:*)
+	echo pdp10-unknown-tops10
+	exit 0 ;;
+    *:TENEX:*:*)
+	echo pdp10-unknown-tenex
+	exit 0 ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	echo pdp10-dec-tops20
+	exit 0 ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	echo pdp10-xkl-tops20
+	exit 0 ;;
+    *:TOPS-20:*:*)
+	echo pdp10-unknown-tops20
+	exit 0 ;;
+    *:ITS:*:*)
+	echo pdp10-unknown-its
+	exit 0 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+          "4"
+#else
+	  ""
+#endif
+         ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+	printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+	printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# else
+    printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+eval $set_cc_for_build
+$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0
+rm -f $dummy.c $dummy
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+	echo c1-convex-bsd
+	exit 0 ;;
+    c2*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit 0 ;;
+    c34*)
+	echo c34-convex-bsd
+	exit 0 ;;
+    c38*)
+	echo c38-convex-bsd
+	exit 0 ;;
+    c4*)
+	echo c4-convex-bsd
+	exit 0 ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+    ftp://ftp.gnu.org/pub/gnu/config/
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbkeys-src/config.h.in
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbkeys-src/config.h.in	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbkeys-src/config.h.in	(revision 24799)
@@ -0,0 +1,22 @@
+/* config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Version number of package */
+#undef VERSION
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbkeys-src/config.sub
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbkeys-src/config.sub	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbkeys-src/config.sub	(revision 24799)
@@ -0,0 +1,1579 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+
+timestamp='2005-07-08'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \
+  kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+	-sun*os*)
+		# Prevent following clause from handling this invalid input.
+		;;
+	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+	-apple | -axis | -knuth | -cray)
+		os=
+		basic_machine=$1
+		;;
+	-sim | -cisco | -oki | -wec | -winbond)
+		os=
+		basic_machine=$1
+		;;
+	-scout)
+		;;
+	-wrs)
+		os=-vxworks
+		basic_machine=$1
+		;;
+	-chorusos*)
+		os=-chorusos
+		basic_machine=$1
+		;;
+ 	-chorusrdb)
+ 		os=-chorusrdb
+		basic_machine=$1
+ 		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco5)
+		os=-sco3.2v5
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-udk*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-lynx*)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-windowsnt*)
+		os=`echo $os | sed -e 's/windowsnt/winnt/'`
+		;;
+	-psos*)
+		os=-psos
+		;;
+	-mint | -mint[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+	# Recognize the basic CPU types without company name.
+	# Some are omitted here because they have special meanings below.
+	1750a | 580 \
+	| a29k \
+	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+	| am33_2.0 \
+	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+	| bfin \
+	| c4x | clipper \
+	| d10v | d30v | dlx | dsp16xx \
+	| fr30 | frv \
+	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| i370 | i860 | i960 | ia64 \
+	| ip2k | iq2000 \
+	| m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \
+	| mips | mipsbe | mipseb | mipsel | mipsle \
+	| mips16 \
+	| mips64 | mips64el \
+	| mips64vr | mips64vrel \
+	| mips64orion | mips64orionel \
+	| mips64vr4100 | mips64vr4100el \
+	| mips64vr4300 | mips64vr4300el \
+	| mips64vr5000 | mips64vr5000el \
+	| mips64vr5900 | mips64vr5900el \
+	| mipsisa32 | mipsisa32el \
+	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa64 | mipsisa64el \
+	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64sb1 | mipsisa64sb1el \
+	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipstx39 | mipstx39el \
+	| mn10200 | mn10300 \
+	| ms1 \
+	| msp430 \
+	| ns16k | ns32k \
+	| or32 \
+	| pdp10 | pdp11 | pj | pjl \
+	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+	| pyramid \
+	| sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
+	| sh64 | sh64le \
+	| sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \
+	| sparcv8 | sparcv9 | sparcv9b \
+	| strongarm \
+	| tahoe | thumb | tic4x | tic80 | tron \
+	| v850 | v850e \
+	| we32k \
+	| x86 | xscale | xscalee[bl] | xstormy16 | xtensa \
+	| z8k)
+		basic_machine=$basic_machine-unknown
+		;;
+	m32c)
+		basic_machine=$basic_machine-unknown
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12)
+		# Motorola 68HC11/12.
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+		;;
+
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i*86 | x86_64)
+	  basic_machine=$basic_machine-pc
+	  ;;
+	# Object if more than one company name word.
+	*-*-*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+	# Recognize the basic CPU types with company name.
+	580-* \
+	| a29k-* \
+	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+	| avr-* \
+	| bfin-* | bs2000-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+	| clipper-* | craynv-* | cydra-* \
+	| d10v-* | d30v-* | dlx-* \
+	| elxsi-* \
+	| f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
+	| h8300-* | h8500-* \
+	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| i*86-* | i860-* | i960-* | ia64-* \
+	| ip2k-* | iq2000-* \
+	| m32r-* | m32rle-* \
+	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* \
+	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+	| mips16-* \
+	| mips64-* | mips64el-* \
+	| mips64vr-* | mips64vrel-* \
+	| mips64orion-* | mips64orionel-* \
+	| mips64vr4100-* | mips64vr4100el-* \
+	| mips64vr4300-* | mips64vr4300el-* \
+	| mips64vr5000-* | mips64vr5000el-* \
+	| mips64vr5900-* | mips64vr5900el-* \
+	| mipsisa32-* | mipsisa32el-* \
+	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa64-* | mipsisa64el-* \
+	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64sb1-* | mipsisa64sb1el-* \
+	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipstx39-* | mipstx39el-* \
+	| mmix-* \
+	| ms1-* \
+	| msp430-* \
+	| none-* | np1-* | ns16k-* | ns32k-* \
+	| orion-* \
+	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+	| pyramid-* \
+	| romp-* | rs6000-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \
+	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+	| sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \
+	| sparclite-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
+	| tahoe-* | thumb-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+	| tron-* \
+	| v850-* | v850e-* | vax-* \
+	| we32k-* \
+	| x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \
+	| xstormy16-* | xtensa-* \
+	| ymp-* \
+	| z8k-*)
+		;;
+	m32c-*)
+		;;
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	386bsd)
+		basic_machine=i386-unknown
+		os=-bsd
+		;;
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		basic_machine=m68000-att
+		;;
+	3b*)
+		basic_machine=we32k-att
+		;;
+	a29khif)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+    	abacus)
+		basic_machine=abacus-unknown
+		;;
+	adobe68k)
+		basic_machine=m68010-adobe
+		os=-scout
+		;;
+	alliant | fx80)
+		basic_machine=fx80-alliant
+		;;
+	altos | altos3068)
+		basic_machine=m68k-altos
+		;;
+	am29k)
+		basic_machine=a29k-none
+		os=-bsd
+		;;
+	amd64)
+		basic_machine=x86_64-pc
+		;;
+	amd64-*)
+		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	amdahl)
+		basic_machine=580-amdahl
+		os=-sysv
+		;;
+	amiga | amiga-*)
+		basic_machine=m68k-unknown
+		;;
+	amigaos | amigados)
+		basic_machine=m68k-unknown
+		os=-amigaos
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-unknown
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	apollo68bsd)
+		basic_machine=m68k-apollo
+		os=-bsd
+		;;
+	aux)
+		basic_machine=m68k-apple
+		os=-aux
+		;;
+	balance)
+		basic_machine=ns32k-sequent
+		os=-dynix
+		;;
+	c90)
+		basic_machine=c90-cray
+		os=-unicos
+		;;
+	convex-c1)
+		basic_machine=c1-convex
+		os=-bsd
+		;;
+	convex-c2)
+		basic_machine=c2-convex
+		os=-bsd
+		;;
+	convex-c32)
+		basic_machine=c32-convex
+		os=-bsd
+		;;
+	convex-c34)
+		basic_machine=c34-convex
+		os=-bsd
+		;;
+	convex-c38)
+		basic_machine=c38-convex
+		os=-bsd
+		;;
+	cray | j90)
+		basic_machine=j90-cray
+		os=-unicos
+		;;
+	craynv)
+		basic_machine=craynv-cray
+		os=-unicosmp
+		;;
+	cr16c)
+		basic_machine=cr16c-unknown
+		os=-elf
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	crisv32 | crisv32-* | etraxfs*)
+		basic_machine=crisv32-axis
+		;;
+	cris | cris-* | etrax*)
+		basic_machine=cris-axis
+		;;
+	crx)
+		basic_machine=crx-unknown
+		os=-elf
+		;;
+	da30 | da30-*)
+		basic_machine=m68k-da30
+		;;
+	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+		basic_machine=mips-dec
+		;;
+	decsystem10* | dec10*)
+		basic_machine=pdp10-dec
+		os=-tops10
+		;;
+	decsystem20* | dec20*)
+		basic_machine=pdp10-dec
+		os=-tops20
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		basic_machine=m68k-motorola
+		;;
+	delta88)
+		basic_machine=m88k-motorola
+		os=-sysv3
+		;;
+	djgpp)
+		basic_machine=i586-pc
+		os=-msdosdjgpp
+		;;
+	dpx20 | dpx20-*)
+		basic_machine=rs6000-bull
+		os=-bosx
+		;;
+	dpx2* | dpx2*-bull)
+		basic_machine=m68k-bull
+		os=-sysv3
+		;;
+	ebmon29k)
+		basic_machine=a29k-amd
+		os=-ebmon
+		;;
+	elxsi)
+		basic_machine=elxsi-elxsi
+		os=-bsd
+		;;
+	encore | umax | mmax)
+		basic_machine=ns32k-encore
+		;;
+	es1800 | OSE68k | ose68k | ose | OSE)
+		basic_machine=m68k-ericsson
+		os=-ose
+		;;
+	fx2800)
+		basic_machine=i860-alliant
+		;;
+	genix)
+		basic_machine=ns32k-ns
+		;;
+	gmicro)
+		basic_machine=tron-gmicro
+		os=-sysv
+		;;
+	go32)
+		basic_machine=i386-pc
+		os=-go32
+		;;
+	h3050r* | hiux*)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	h8300hms)
+		basic_machine=h8300-hitachi
+		os=-hms
+		;;
+	h8300xray)
+		basic_machine=h8300-hitachi
+		os=-xray
+		;;
+	h8500hms)
+		basic_machine=h8500-hitachi
+		os=-hms
+		;;
+	harris)
+		basic_machine=m88k-harris
+		os=-sysv3
+		;;
+	hp300-*)
+		basic_machine=m68k-hp
+		;;
+	hp300bsd)
+		basic_machine=m68k-hp
+		os=-bsd
+		;;
+	hp300hpux)
+		basic_machine=m68k-hp
+		os=-hpux
+		;;
+	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		basic_machine=m68000-hp
+		;;
+	hp9k3[2-9][0-9])
+		basic_machine=m68k-hp
+		;;
+	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k78[0-9] | hp78[0-9])
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][13679] | hp8[0-9][13679])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hppa-next)
+		os=-nextstep3
+		;;
+	hppaosf)
+		basic_machine=hppa1.1-hp
+		os=-osf
+		;;
+	hppro)
+		basic_machine=hppa1.1-hp
+		os=-proelf
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+	i*86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv32
+		;;
+	i*86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv4
+		;;
+	i*86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv
+		;;
+	i*86sol2)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-solaris2
+		;;
+	i386mach)
+		basic_machine=i386-mach
+		os=-mach
+		;;
+	i386-vsta | vsta)
+		basic_machine=i386-unknown
+		os=-vsta
+		;;
+	iris | iris4d)
+		basic_machine=mips-sgi
+		case $os in
+		    -irix*)
+			;;
+		    *)
+			os=-irix4
+			;;
+		esac
+		;;
+	isi68 | isi)
+		basic_machine=m68k-isi
+		os=-sysv
+		;;
+	m88k-omron*)
+		basic_machine=m88k-omron
+		;;
+	magnum | m3230)
+		basic_machine=mips-mips
+		os=-sysv
+		;;
+	merlin)
+		basic_machine=ns32k-utek
+		os=-sysv
+		;;
+	mingw32)
+		basic_machine=i386-pc
+		os=-mingw32
+		;;
+	miniframe)
+		basic_machine=m68000-convergent
+		;;
+	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+	mips3*-*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	monitor)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	morphos)
+		basic_machine=powerpc-unknown
+		os=-morphos
+		;;
+	msdos)
+		basic_machine=i386-pc
+		os=-msdos
+		;;
+	mvs)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	netbsd386)
+		basic_machine=i386-unknown
+		os=-netbsd
+		;;
+	netwinder)
+		basic_machine=armv4l-rebel
+		os=-linux
+		;;
+	news | news700 | news800 | news900)
+		basic_machine=m68k-sony
+		os=-newsos
+		;;
+	news1000)
+		basic_machine=m68030-sony
+		os=-newsos
+		;;
+	news-3600 | risc-news)
+		basic_machine=mips-sony
+		os=-newsos
+		;;
+	necv70)
+		basic_machine=v70-nec
+		os=-sysv
+		;;
+	next | m*-next )
+		basic_machine=m68k-next
+		case $os in
+		    -nextstep* )
+			;;
+		    -ns2*)
+		      os=-nextstep2
+			;;
+		    *)
+		      os=-nextstep3
+			;;
+		esac
+		;;
+	nh3000)
+		basic_machine=m68k-harris
+		os=-cxux
+		;;
+	nh[45]000)
+		basic_machine=m88k-harris
+		os=-cxux
+		;;
+	nindy960)
+		basic_machine=i960-intel
+		os=-nindy
+		;;
+	mon960)
+		basic_machine=i960-intel
+		os=-mon960
+		;;
+	nonstopux)
+		basic_machine=mips-compaq
+		os=-nonstopux
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	nsr-tandem)
+		basic_machine=nsr-tandem
+		;;
+	op50n-* | op60c-*)
+		basic_machine=hppa1.1-oki
+		os=-proelf
+		;;
+	openrisc | openrisc-*)
+		basic_machine=or32-unknown
+		;;
+	os400)
+		basic_machine=powerpc-ibm
+		os=-os400
+		;;
+	OSE68000 | ose68000)
+		basic_machine=m68000-ericsson
+		os=-ose
+		;;
+	os68k)
+		basic_machine=m68k-none
+		os=-os68k
+		;;
+	pa-hitachi)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	paragon)
+		basic_machine=i860-intel
+		os=-osf
+		;;
+	pbd)
+		basic_machine=sparc-tti
+		;;
+	pbb)
+		basic_machine=m68k-tti
+		;;
+	pc532 | pc532-*)
+		basic_machine=ns32k-pc532
+		;;
+	pentium | p5 | k5 | k6 | nexgen | viac3)
+		basic_machine=i586-pc
+		;;
+	pentiumpro | p6 | 6x86 | athlon | athlon_*)
+		basic_machine=i686-pc
+		;;
+	pentiumii | pentium2 | pentiumiii | pentium3)
+		basic_machine=i686-pc
+		;;
+	pentium4)
+		basic_machine=i786-pc
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium4-*)
+		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=power-ibm
+		;;
+	ppc)	basic_machine=powerpc-unknown
+		;;
+	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppcle | powerpclittle | ppc-le | powerpc-little)
+		basic_machine=powerpcle-unknown
+		;;
+	ppcle-* | powerpclittle-*)
+		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64)	basic_machine=powerpc64-unknown
+		;;
+	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+		basic_machine=powerpc64le-unknown
+		;;
+	ppc64le-* | powerpc64little-*)
+		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	pw32)
+		basic_machine=i586-unknown
+		os=-pw32
+		;;
+	rom68k)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	rm[46]00)
+		basic_machine=mips-siemens
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	s390 | s390-*)
+		basic_machine=s390-ibm
+		;;
+	s390x | s390x-*)
+		basic_machine=s390x-ibm
+		;;
+	sa29200)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	sb1)
+		basic_machine=mipsisa64sb1-unknown
+		;;
+	sb1el)
+		basic_machine=mipsisa64sb1el-unknown
+		;;
+	sei)
+		basic_machine=mips-sei
+		os=-seiux
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sh64)
+		basic_machine=sh64-unknown
+		;;
+	sparclite-wrs | simso-wrs)
+		basic_machine=sparclite-wrs
+		os=-vxworks
+		;;
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
+		;;
+	spur)
+		basic_machine=spur-unknown
+		;;
+	st2000)
+		basic_machine=m68k-tandem
+		;;
+	stratus)
+		basic_machine=i860-stratus
+		os=-sysv4
+		;;
+	sun2)
+		basic_machine=m68000-sun
+		;;
+	sun2os3)
+		basic_machine=m68000-sun
+		os=-sunos3
+		;;
+	sun2os4)
+		basic_machine=m68000-sun
+		os=-sunos4
+		;;
+	sun3os3)
+		basic_machine=m68k-sun
+		os=-sunos3
+		;;
+	sun3os4)
+		basic_machine=m68k-sun
+		os=-sunos4
+		;;
+	sun4os3)
+		basic_machine=sparc-sun
+		os=-sunos3
+		;;
+	sun4os4)
+		basic_machine=sparc-sun
+		os=-sunos4
+		;;
+	sun4sol2)
+		basic_machine=sparc-sun
+		os=-solaris2
+		;;
+	sun3 | sun3-*)
+		basic_machine=m68k-sun
+		;;
+	sun4)
+		basic_machine=sparc-sun
+		;;
+	sun386 | sun386i | roadrunner)
+		basic_machine=i386-sun
+		;;
+	sv1)
+		basic_machine=sv1-cray
+		os=-unicos
+		;;
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
+		;;
+	t3e)
+		basic_machine=alphaev5-cray
+		os=-unicos
+		;;
+	t90)
+		basic_machine=t90-cray
+		os=-unicos
+		;;
+	tic54x | c54x*)
+		basic_machine=tic54x-unknown
+		os=-coff
+		;;
+	tic55x | c55x*)
+		basic_machine=tic55x-unknown
+		os=-coff
+		;;
+	tic6x | c6x*)
+		basic_machine=tic6x-unknown
+		os=-coff
+		;;
+	tx39)
+		basic_machine=mipstx39-unknown
+		;;
+	tx39el)
+		basic_machine=mipstx39el-unknown
+		;;
+	toad1)
+		basic_machine=pdp10-xkl
+		os=-tops20
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	tpf)
+		basic_machine=s390x-ibm
+		os=-tpf
+		;;
+	udi29k)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
+		;;
+	v810 | necv810)
+		basic_machine=v810-nec
+		os=-none
+		;;
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
+		;;
+	vms)
+		basic_machine=vax-dec
+		os=-vms
+		;;
+	vpp*|vx|vx-*)
+		basic_machine=f301-fujitsu
+		;;
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
+		;;
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
+		;;
+	vxworks29k)
+		basic_machine=a29k-wrs
+		os=-vxworks
+		;;
+	w65*)
+		basic_machine=w65-wdc
+		os=-none
+		;;
+	w89k-*)
+		basic_machine=hppa1.1-winbond
+		os=-proelf
+		;;
+	xbox)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	z8k-*-coff)
+		basic_machine=z8k-unknown
+		os=-sim
+		;;
+	none)
+		basic_machine=none-none
+		os=-none
+		;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		basic_machine=hppa1.1-winbond
+		;;
+	op50n)
+		basic_machine=hppa1.1-oki
+		;;
+	op60c)
+		basic_machine=hppa1.1-oki
+		;;
+	romp)
+		basic_machine=romp-ibm
+		;;
+	mmix)
+		basic_machine=mmix-knuth
+		;;
+	rs6000)
+		basic_machine=rs6000-ibm
+		;;
+	vax)
+		basic_machine=vax-dec
+		;;
+	pdp10)
+		# there are many clones, so DEC is not a safe bet
+		basic_machine=pdp10-unknown
+		;;
+	pdp11)
+		basic_machine=pdp11-dec
+		;;
+	we32k)
+		basic_machine=we32k-att
+		;;
+	sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
+		basic_machine=sh-unknown
+		;;
+	sparc | sparcv8 | sparcv9 | sparcv9b)
+		basic_machine=sparc-sun
+		;;
+	cydra)
+		basic_machine=cydra-cydrome
+		;;
+	orion)
+		basic_machine=orion-highlevel
+		;;
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	mac | mpw | mac-mpw)
+		basic_machine=m68k-apple
+		;;
+	pmac | pmac-mpw)
+		basic_machine=powerpc-apple
+		;;
+	*-unknown)
+		# Make sure to match an already-canonicalized machine name.
+		;;
+	*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+	*-digital*)
+		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+		;;
+	*-commodore*)
+		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+        # First match some system type aliases
+        # that might get confused with valid system types.
+	# -solaris* is a basic system type, with this one exception.
+	-solaris1 | -solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	-solaris)
+		os=-solaris2
+		;;
+	-svr4*)
+		os=-sysv4
+		;;
+	-unixware*)
+		os=-sysv4.2uw
+		;;
+	-gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+		;;
+	# First accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST END IN A *, to match a version number.
+	# -sysv* is not here because it comes later, after sysvr4.
+	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+	      | -aos* \
+	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \
+	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+	      | -chorusos* | -chorusrdb* \
+	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+	      | -skyos* | -haiku*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	-qnx*)
+		case $basic_machine in
+		    x86-* | i*86-*)
+			;;
+		    *)
+			os=-nto$os
+			;;
+		esac
+		;;
+	-nto-qnx*)
+		;;
+	-nto*)
+		os=`echo $os | sed -e 's|nto|nto-qnx|'`
+		;;
+	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+		;;
+	-mac*)
+		os=`echo $os | sed -e 's|mac|macos|'`
+		;;
+	-linux-dietlibc)
+		os=-linux-dietlibc
+		;;
+	-linux*)
+		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+		;;
+	-sunos5*)
+		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+		;;
+	-sunos6*)
+		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+		;;
+	-opened*)
+		os=-openedition
+		;;
+        -os400*)
+		os=-os400
+		;;
+	-wince*)
+		os=-wince
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-atheos*)
+		os=-atheos
+		;;
+	-syllable*)
+		os=-syllable
+		;;
+	-386bsd)
+		os=-bsd
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	-nova*)
+		os=-rtmk-nova
+		;;
+	-ns2 )
+		os=-nextstep2
+		;;
+	-nsk*)
+		os=-nsk
+		;;
+	# Preserve the version number of sinix5.
+	-sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	-sinix*)
+		os=-sysv4
+		;;
+        -tpf*)
+		os=-tpf
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-svr4)
+		os=-sysv4
+		;;
+	-svr3)
+		os=-sysv3
+		;;
+	-sysvr4)
+		os=-sysv4
+		;;
+	# This must come after -sysvr4.
+	-sysv*)
+		;;
+	-ose*)
+		os=-ose
+		;;
+	-es1800*)
+		os=-ose
+		;;
+	-xenix)
+		os=-xenix
+		;;
+	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+		os=-mint
+		;;
+	-aros*)
+		os=-aros
+		;;
+	-kaos*)
+		os=-kaos
+		;;
+	-zvmoe)
+		os=-zvmoe
+		;;
+	-none)
+		;;
+	*)
+		# Get rid of the `-' at the beginning of $os.
+		os=`echo $os | sed 's/[^-]*-//'`
+		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+		exit 1
+		;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+	*-acorn)
+		os=-riscix1.2
+		;;
+	arm*-rebel)
+		os=-linux
+		;;
+	arm*-semi)
+		os=-aout
+		;;
+    c4x-* | tic4x-*)
+        os=-coff
+        ;;
+	# This must come before the *-dec entry.
+	pdp10-*)
+		os=-tops20
+		;;
+	pdp11-*)
+		os=-none
+		;;
+	*-dec | vax-*)
+		os=-ultrix4.2
+		;;
+	m68*-apollo)
+		os=-domain
+		;;
+	i386-sun)
+		os=-sunos4.0.2
+		;;
+	m68000-sun)
+		os=-sunos3
+		# This also exists in the configure program, but was not the
+		# default.
+		# os=-sunos4
+		;;
+	m68*-cisco)
+		os=-aout
+		;;
+	mips*-cisco)
+		os=-elf
+		;;
+	mips*-*)
+		os=-elf
+		;;
+	or32-*)
+		os=-coff
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	*-be)
+		os=-beos
+		;;
+	*-haiku)
+		os=-haiku
+		;;
+	*-ibm)
+		os=-aix
+		;;
+    	*-knuth)
+		os=-mmixware
+		;;
+	*-wec)
+		os=-proelf
+		;;
+	*-winbond)
+		os=-proelf
+		;;
+	*-oki)
+		os=-proelf
+		;;
+	*-hp)
+		os=-hpux
+		;;
+	*-hitachi)
+		os=-hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=-sysv
+		;;
+	*-cbm)
+		os=-amigaos
+		;;
+	*-dg)
+		os=-dgux
+		;;
+	*-dolphin)
+		os=-sysv3
+		;;
+	m68k-ccur)
+		os=-rtu
+		;;
+	m88k-omron*)
+		os=-luna
+		;;
+	*-next )
+		os=-nextstep
+		;;
+	*-sequent)
+		os=-ptx
+		;;
+	*-crds)
+		os=-unos
+		;;
+	*-ns)
+		os=-genix
+		;;
+	i370-*)
+		os=-mvs
+		;;
+	*-next)
+		os=-nextstep3
+		;;
+	*-gould)
+		os=-sysv
+		;;
+	*-highlevel)
+		os=-bsd
+		;;
+	*-encore)
+		os=-bsd
+		;;
+	*-sgi)
+		os=-irix
+		;;
+	*-siemens)
+		os=-sysv4
+		;;
+	*-masscomp)
+		os=-rtu
+		;;
+	f30[01]-fujitsu | f700-fujitsu)
+		os=-uxpv
+		;;
+	*-rom68k)
+		os=-coff
+		;;
+	*-*bug)
+		os=-coff
+		;;
+	*-apple)
+		os=-macos
+		;;
+	*-atari*)
+		os=-mint
+		;;
+	*)
+		os=-none
+		;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+	*-unknown)
+		case $os in
+			-riscix*)
+				vendor=acorn
+				;;
+			-sunos*)
+				vendor=sun
+				;;
+			-aix*)
+				vendor=ibm
+				;;
+			-beos*)
+				vendor=be
+				;;
+			-hpux*)
+				vendor=hp
+				;;
+			-mpeix*)
+				vendor=hp
+				;;
+			-hiux*)
+				vendor=hitachi
+				;;
+			-unos*)
+				vendor=crds
+				;;
+			-dgux*)
+				vendor=dg
+				;;
+			-luna*)
+				vendor=omron
+				;;
+			-genix*)
+				vendor=ns
+				;;
+			-mvs* | -opened*)
+				vendor=ibm
+				;;
+			-os400*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+			-tpf*)
+				vendor=ibm
+				;;
+			-vxsim* | -vxworks* | -windiss*)
+				vendor=wrs
+				;;
+			-aux*)
+				vendor=apple
+				;;
+			-hms*)
+				vendor=hitachi
+				;;
+			-mpw* | -macos*)
+				vendor=apple
+				;;
+			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+				vendor=atari
+				;;
+			-vos*)
+				vendor=stratus
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbkeys-src/configure
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbkeys-src/configure	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbkeys-src/configure	(revision 24799)
@@ -0,0 +1,5003 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.59 for tdbkeys 1.0.
+#
+# Report bugs to <jmt12@cs.waikato.ac.nz>.
+#
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)$' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\/\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  case $0 in
+    *[\\/]* ) as_myself=$0 ;;
+    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+       ;;
+  esac
+  # We did not find ourselves, most probably we were run as `sh COMMAND'
+  # in which case we are not to be found in the path.
+  if test "x$as_myself" = x; then
+    as_myself=$0
+  fi
+  if test ! -f "$as_myself"; then
+    { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+	 case $as_dir in
+	 /*)
+	   if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+	     CONFIG_SHELL=$as_dir/$as_base
+	     export CONFIG_SHELL
+	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+	   fi;;
+	 esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='	' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" 	$as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_config_libobj_dir=.
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete.  It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: ${ac_max_here_lines=38}
+
+# Identity of this package.
+PACKAGE_NAME='tdbkeys'
+PACKAGE_TARNAME='tdbkeys'
+PACKAGE_VERSION='1.0'
+PACKAGE_STRING='tdbkeys 1.0'
+PACKAGE_BUGREPORT='jmt12@cs.waikato.ac.nz'
+
+ac_unique_file="tdbkeys.cpp"
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar build build_cpu build_vendor build_os host host_cpu host_vendor host_os CXX CXXFLAGS LDFLAGS CPPFLAGS ac_ct_CXX EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CC CFLAGS ac_ct_CC CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CPP LIBOBJS LTLIBOBJS'
+ac_subst_files=''
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+ac_prev=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval "$ac_prev=\$ac_option"
+    ac_prev=
+    continue
+  fi
+
+  ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_option in
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+  | --da=*)
+    datadir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    eval "enable_$ac_feature=no" ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    case $ac_option in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "enable_$ac_feature='$ac_optarg'" ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst \
+  | --locals | --local | --loca | --loc | --lo)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    case $ac_option in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "with_$ac_package='$ac_optarg'" ;;
+
+  -without-* | --without-*)
+    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/-/_/g'`
+    eval "with_$ac_package=no" ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+    eval "$ac_envvar='$ac_optarg'"
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  { echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+  eval ac_val=$`echo $ac_var`
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
+	      localstatedir libdir includedir oldincludedir infodir mandir
+do
+  eval ac_val=$`echo $ac_var`
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* ) ;;
+    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then its parent.
+  ac_confdir=`(dirname "$0") 2>/dev/null ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$0" : 'X\(//\)[^/]' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$0" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r $srcdir/$ac_unique_file; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+  if test "$ac_srcdir_defaulted" = yes; then
+    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+   { (exit 1); exit 1; }; }
+  else
+    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+   { (exit 1); exit 1; }; }
+  fi
+fi
+(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
+  { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
+   { (exit 1); exit 1; }; }
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_CXX_set=${CXX+set}
+ac_env_CXX_value=$CXX
+ac_cv_env_CXX_set=${CXX+set}
+ac_cv_env_CXX_value=$CXX
+ac_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_env_CXXFLAGS_value=$CXXFLAGS
+ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_cv_env_CXXFLAGS_value=$CXXFLAGS
+ac_env_LDFLAGS_set=${LDFLAGS+set}
+ac_env_LDFLAGS_value=$LDFLAGS
+ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
+ac_cv_env_LDFLAGS_value=$LDFLAGS
+ac_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_env_CPPFLAGS_value=$CPPFLAGS
+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_cv_env_CPPFLAGS_value=$CPPFLAGS
+ac_env_CC_set=${CC+set}
+ac_env_CC_value=$CC
+ac_cv_env_CC_set=${CC+set}
+ac_cv_env_CC_value=$CC
+ac_env_CFLAGS_set=${CFLAGS+set}
+ac_env_CFLAGS_value=$CFLAGS
+ac_cv_env_CFLAGS_set=${CFLAGS+set}
+ac_cv_env_CFLAGS_value=$CFLAGS
+ac_env_CPP_set=${CPP+set}
+ac_env_CPP_value=$CPP
+ac_cv_env_CPP_set=${CPP+set}
+ac_cv_env_CPP_value=$CPP
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures tdbkeys 1.0 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+_ACEOF
+
+  cat <<_ACEOF
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+			  [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+			  [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR           user executables [EPREFIX/bin]
+  --sbindir=DIR          system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR       program executables [EPREFIX/libexec]
+  --datadir=DIR          read-only architecture-independent data [PREFIX/share]
+  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
+  --libdir=DIR           object code libraries [EPREFIX/lib]
+  --includedir=DIR       C header files [PREFIX/include]
+  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
+  --infodir=DIR          info documentation [PREFIX/info]
+  --mandir=DIR           man documentation [PREFIX/man]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of tdbkeys 1.0:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors
+
+Some influential environment variables:
+  CXX         C++ compiler command
+  CXXFLAGS    C++ compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have
+              headers in a nonstandard directory <include dir>
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  CPP         C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <jmt12@cs.waikato.ac.nz>.
+_ACEOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  ac_popdir=`pwd`
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d $ac_dir || continue
+    ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
+
+    cd $ac_dir
+    # Check for guested configure; otherwise get Cygnus style configure.
+    if test -f $ac_srcdir/configure.gnu; then
+      echo
+      $SHELL $ac_srcdir/configure.gnu  --help=recursive
+    elif test -f $ac_srcdir/configure; then
+      echo
+      $SHELL $ac_srcdir/configure  --help=recursive
+    elif test -f $ac_srcdir/configure.ac ||
+	   test -f $ac_srcdir/configure.in; then
+      echo
+      $ac_configure --help
+    else
+      echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi
+    cd $ac_popdir
+  done
+fi
+
+test -n "$ac_init_help" && exit 0
+if $ac_init_version; then
+  cat <<\_ACEOF
+tdbkeys configure 1.0
+generated by GNU Autoconf 2.59
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit 0
+fi
+exec 5>config.log
+cat >&5 <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by tdbkeys $as_me 1.0, which was
+generated by GNU Autoconf 2.59.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo               = `(hostinfo) 2>/dev/null               || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  echo "PATH: $as_dir"
+done
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_sep=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+      ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+    2)
+      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+	ac_must_keep_next=false # Got value, back to normal.
+      else
+	case $ac_arg in
+	  *=* | --config-cache | -C | -disable-* | --disable-* \
+	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+	  | -with-* | --with-* | -without-* | --without-* | --x)
+	    case "$ac_configure_args0 " in
+	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+	    esac
+	    ;;
+	  -* ) ac_must_keep_next=true ;;
+	esac
+      fi
+      ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+      # Get rid of the leading space.
+      ac_sep=" "
+      ;;
+    esac
+  done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Be sure not to use single quotes in there, as some shells,
+# such as our DU 5.0 friend, will then `close' the trap.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+{
+  (set) 2>&1 |
+    case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      sed -n \
+	"s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+      ;;
+    *)
+      sed -n \
+	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+}
+    echo
+
+    cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=$`echo $ac_var`
+      echo "$ac_var='"'"'$ac_val'"'"'"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      cat <<\_ASBOX
+## ------------- ##
+## Output files. ##
+## ------------- ##
+_ASBOX
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=$`echo $ac_var`
+	echo "$ac_var='"'"'$ac_val'"'"'"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+      echo
+      sed "/^$/d" confdefs.h | sort
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      echo "$as_me: caught signal $ac_signal"
+    echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core &&
+  rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+     ' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+  if test "x$prefix" != xNONE; then
+    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+  else
+    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+  fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+  if test -r "$ac_site_file"; then
+    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . $cache_file;;
+      *)                      . ./$cache_file;;
+    esac
+  fi
+else
+  { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+	       sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+  eval ac_new_val="\$ac_env_${ac_var}_value"
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+	{ echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	{ echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
+echo "$as_me:   former value:  $ac_old_val" >&2;}
+	{ echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
+echo "$as_me:   current value: $ac_new_val" >&2;}
+	ac_cache_corrupted=:
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+      ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+am__api_version="1.9"
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+  if test -f $ac_dir/install-sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f $ac_dir/install.sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f $ac_dir/shtool; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
+echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"
+ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+  ./ | .// | /cC/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+	if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	    break 3
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+done
+
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  We don't cache a
+    # path for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the path is relative.
+    INSTALL=$ac_install_sh
+  fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$*" != "X $srcdir/configure conftest.file" \
+      && test "$*" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      { { echo "$as_me:$LINENO: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" >&5
+echo "$as_me: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" >&2;}
+   { (exit 1); exit 1; }; }
+   fi
+
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   { { echo "$as_me:$LINENO: error: newly created file is older than distributed files!
+Check your system clock" >&5
+echo "$as_me: error: newly created file is older than distributed files!
+Check your system clock" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+test "$program_prefix" != NONE &&
+  program_transform_name="s,^,$program_prefix,;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s,\$,$program_suffix,;$program_transform_name"
+# Double any \ or $.  echo might interpret backslashes.
+# By default was `s,x,x', remove it if useless.
+cat <<\_ACEOF >conftest.sed
+s/[\\$]/&&/g;s/;s,x,x,$//
+_ACEOF
+program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
+rm conftest.sed
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+  # We used to keeping the `.' as first argument, in order to
+  # allow $(mkdir_p) to be used without argument.  As in
+  #   $(mkdir_p) $(somedir)
+  # where $(somedir) is conditionally defined.  However this is wrong
+  # for two reasons:
+  #  1. if the package is installed by a user who cannot write `.'
+  #     make install will fail,
+  #  2. the above comment should most certainly read
+  #     $(mkdir_p) $(DESTDIR)$(somedir)
+  #     so it does not work when $(somedir) is undefined and
+  #     $(DESTDIR) is not.
+  #  To support the latter case, we have to write
+  #     test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+  #  so the `.' trick is pointless.
+  mkdir_p='mkdir -p --'
+else
+  # On NextStep and OpenStep, the `mkdir' command does not
+  # recognize any option.  It will interpret all options as
+  # directories to create, and then abort because `.' already
+  # exists.
+  for d in ./-p ./--version;
+  do
+    test -d $d && rmdir $d
+  done
+  # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+  if test -f "$ac_aux_dir/mkinstalldirs"; then
+    mkdir_p='$(mkinstalldirs)'
+  else
+    mkdir_p='$(install_sh) -d'
+  fi
+fi
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AWK+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AWK="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  echo "$as_me:$LINENO: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$AWK" && break
+done
+
+echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.make <<\_ACEOF
+all:
+	@echo 'ac_maketemp="$(MAKE)"'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+  eval ac_cv_prog_make_${ac_make}_set=yes
+else
+  eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftest.make
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+  SET_MAKE=
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+   test -f $srcdir/config.status; then
+  { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
+echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='tdbkeys'
+ VERSION='1.0'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_STRIP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  STRIP=$ac_ct_STRIP
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+# Make sure we can run config.sub.
+$ac_config_sub sun4 >/dev/null 2>&1 ||
+  { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5
+echo "$as_me: error: cannot run $ac_config_sub" >&2;}
+   { (exit 1); exit 1; }; }
+
+echo "$as_me:$LINENO: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6
+if test "${ac_cv_build+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_build_alias=$build_alias
+test -z "$ac_cv_build_alias" &&
+  ac_cv_build_alias=`$ac_config_guess`
+test -z "$ac_cv_build_alias" &&
+  { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
+echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+   { (exit 1); exit 1; }; }
+ac_cv_build=`$ac_config_sub $ac_cv_build_alias` ||
+  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6
+build=$ac_cv_build
+build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+echo "$as_me:$LINENO: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6
+if test "${ac_cv_host+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_host_alias=$host_alias
+test -z "$ac_cv_host_alias" &&
+  ac_cv_host_alias=$ac_cv_build_alias
+ac_cv_host=`$ac_config_sub $ac_cv_host_alias` ||
+  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6
+host=$ac_cv_host
+host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+
+          ac_config_headers="$ac_config_headers config.h"
+
+
+# Checks for programs.
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  echo "$as_me:$LINENO: result: $CXX" >&5
+echo "${ECHO_T}$CXX" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$CXX" && break
+  done
+fi
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CXX="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5
+echo "${ECHO_T}$ac_ct_CXX" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_CXX" && break
+done
+test -n "$ac_ct_CXX" || ac_ct_CXX="g++"
+
+  CXX=$ac_ct_CXX
+fi
+
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+     "checking for C++ compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+  (eval $ac_compiler --version </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+  (eval $ac_compiler -v </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+  (eval $ac_compiler -V </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+echo "$as_me:$LINENO: checking for C++ compiler default output file name" >&5
+echo $ECHO_N "checking for C++ compiler default output file name... $ECHO_C" >&6
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
+  (eval $ac_link_default) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # Find the output, starting from the most likely.  This scheme is
+# not robust to junk in `.', hence go to wildcards (a.*) only as a last
+# resort.
+
+# Be careful to initialize this variable, since it used to be cached.
+# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
+ac_cv_exeext=
+# b.out is created by i960 compilers.
+for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
+	;;
+    conftest.$ac_ext )
+	# This is the source file.
+	;;
+    [ab].out )
+	# We found the default executable, but exeext='' is most
+	# certainly right.
+	break;;
+    *.* )
+	ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	# FIXME: I believe we export ac_cv_exeext for Libtool,
+	# but it would be cool to find out if it's true.  Does anybody
+	# maintain Libtool? --akim.
+	export ac_cv_exeext
+	break;;
+    * )
+	break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C++ compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C++ compiler cannot create executables
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6
+
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether the C++ compiler works" >&5
+echo $ECHO_N "checking whether the C++ compiler works... $ECHO_C" >&6
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+  if { ac_try='./$ac_file'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { echo "$as_me:$LINENO: error: cannot run C++ compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C++ compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+  fi
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6
+
+echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	  export ac_cv_exeext
+	  break;;
+    * ) break;;
+  esac
+done
+else
+  { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
+if test "${ac_cv_objext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6
+if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6
+GXX=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+CXXFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5
+echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cxx_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cxx_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cxx_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
+  else
+    CXXFLAGS="-g"
+  fi
+else
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
+  else
+    CXXFLAGS=
+  fi
+fi
+for ac_declaration in \
+   '' \
+   'extern "C" void std::exit (int) throw (); using std::exit;' \
+   'extern "C" void std::exit (int); using std::exit;' \
+   'extern "C" void exit (int) throw ();' \
+   'extern "C" void exit (int);' \
+   'void exit (int);'
+do
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+  echo '#ifdef __cplusplus' >>confdefs.h
+  echo $ac_declaration      >>confdefs.h
+  echo '#endif'             >>confdefs.h
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+DEPDIR="${am__leading_dot}deps"
+
+          ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
+echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+   am__include=include
+   am__quote=
+   _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+      am__include=.include
+      am__quote="\""
+      _am_result=BSD
+   fi
+fi
+
+
+echo "$as_me:$LINENO: result: $_am_result" >&5
+echo "${ECHO_T}$_am_result" >&6
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then
+  enableval="$enable_dependency_tracking"
+
+fi;
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+
+
+if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+
+
+depcc="$CXX"  am_compiler_list=
+
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CXX_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CXX_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+
+
+if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+  am__fastdepCXX_TRUE=
+  am__fastdepCXX_FALSE='#'
+else
+  am__fastdepCXX_TRUE='#'
+  am__fastdepCXX_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_CC" && break
+done
+
+  CC=$ac_ct_CC
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+     "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+  (eval $ac_compiler --version </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+  (eval $ac_compiler -v </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+  (eval $ac_compiler -V </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cc_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std1 is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std1.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX			-qlanglvl=ansi
+# Ultrix and OSF/1	-std1
+# HP-UX 10.20 and later	-Ae
+# HP-UX older versions	-Aa -D_HPUX_SOURCE
+# SVR4			-Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext
+done
+rm -f conftest.$ac_ext conftest.$ac_objext
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+  x|xno)
+    echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+  *)
+    echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+    CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+# Some people use a C++ compiler to compile C.  Since we use `exit',
+# in C++ we need to declare it.  In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >conftest.$ac_ext <<_ACEOF
+#ifndef __cplusplus
+  choke me
+#endif
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  for ac_declaration in \
+   '' \
+   'extern "C" void std::exit (int) throw (); using std::exit;' \
+   'extern "C" void std::exit (int); using std::exit;' \
+   'extern "C" void exit (int) throw ();' \
+   'extern "C" void exit (int);' \
+   'void exit (int);'
+do
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+  echo '#ifdef __cplusplus' >>confdefs.h
+  echo $ac_declaration      >>confdefs.h
+  echo '#endif'             >>confdefs.h
+fi
+
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CC"   am_compiler_list=
+
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+
+
+if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if test "${ac_cv_prog_CPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
+else
+  { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Checks for libraries.
+
+# Checks for header files.
+
+# Checks for typedefs, structures, and compiler characteristics.
+
+# Checks for library functions.
+
+# Completion
+          ac_config_files="$ac_config_files Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+{
+  (set) 2>&1 |
+    case `(ac_space=' '; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+	"s/'/'\\\\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;;
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n \
+	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+} |
+  sed '
+     t clear
+     : clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     : end' >>confcache
+if diff $cache_file confcache >/dev/null 2>&1; then :; else
+  if test -w $cache_file; then
+    test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+    cat confcache >$cache_file
+  else
+    echo "not updating unwritable cache $cache_file"
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[	 ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[	 ]*$//;
+}'
+fi
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_i=`echo "$ac_i" |
+	 sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
+  # 2. Add them.
+  ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)$' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\/\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  case $0 in
+    *[\\/]* ) as_myself=$0 ;;
+    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+       ;;
+  esac
+  # We did not find ourselves, most probably we were run as `sh COMMAND'
+  # in which case we are not to be found in the path.
+  if test "x$as_myself" = x; then
+    as_myself=$0
+  fi
+  if test ! -f "$as_myself"; then
+    { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+	 case $as_dir in
+	 /*)
+	   if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+	     CONFIG_SHELL=$as_dir/$as_base
+	     export CONFIG_SHELL
+	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+	   fi;;
+	 esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='	' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" 	$as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.  Logging --version etc. is OK.
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by tdbkeys $as_me 1.0, which was
+generated by GNU Autoconf 2.59.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+  echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_headers"; then
+  echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_links"; then
+  echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_commands"; then
+  echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number, then exit
+  -q, --quiet      do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+		   instantiate the configuration file FILE
+  --header=FILE[:TEMPLATE]
+		   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <bug-autoconf@gnu.org>."
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+tdbkeys config.status 1.0
+configured by $0, generated by GNU Autoconf 2.59,
+  with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=$srcdir
+INSTALL="$INSTALL"
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "x$1" : 'x\([^=]*\)='`
+    ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  -*)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  *) # This is not an option, so the user has probably given explicit
+     # arguments.
+     ac_option=$1
+     ac_need_defaults=false;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --vers* | -V )
+    echo "$ac_cs_version"; exit 0 ;;
+  --he | --h)
+    # Conflict between --help and --header
+    { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; };;
+  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit 0 ;;
+  --debug | --d* | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+    ac_need_defaults=false;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1" ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+  echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+  exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+#
+# INIT-COMMANDS section.
+#
+
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+_ACEOF
+
+
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_config_target in $ac_config_targets
+do
+  case "$ac_config_target" in
+  # Handling of arguments.
+  "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+  "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+  "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason to put it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./confstat$$-$RANDOM
+  (umask 077 && mkdir $tmp)
+} ||
+{
+   echo "$me: cannot create a temporary directory in ." >&2
+   { (exit 1); exit 1; }
+}
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+  # Protect against being on the right side of a sed subst in config.status.
+  sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+   s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
+s,@SHELL@,$SHELL,;t t
+s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s,@exec_prefix@,$exec_prefix,;t t
+s,@prefix@,$prefix,;t t
+s,@program_transform_name@,$program_transform_name,;t t
+s,@bindir@,$bindir,;t t
+s,@sbindir@,$sbindir,;t t
+s,@libexecdir@,$libexecdir,;t t
+s,@datadir@,$datadir,;t t
+s,@sysconfdir@,$sysconfdir,;t t
+s,@sharedstatedir@,$sharedstatedir,;t t
+s,@localstatedir@,$localstatedir,;t t
+s,@libdir@,$libdir,;t t
+s,@includedir@,$includedir,;t t
+s,@oldincludedir@,$oldincludedir,;t t
+s,@infodir@,$infodir,;t t
+s,@mandir@,$mandir,;t t
+s,@build_alias@,$build_alias,;t t
+s,@host_alias@,$host_alias,;t t
+s,@target_alias@,$target_alias,;t t
+s,@DEFS@,$DEFS,;t t
+s,@ECHO_C@,$ECHO_C,;t t
+s,@ECHO_N@,$ECHO_N,;t t
+s,@ECHO_T@,$ECHO_T,;t t
+s,@LIBS@,$LIBS,;t t
+s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
+s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
+s,@INSTALL_DATA@,$INSTALL_DATA,;t t
+s,@CYGPATH_W@,$CYGPATH_W,;t t
+s,@PACKAGE@,$PACKAGE,;t t
+s,@VERSION@,$VERSION,;t t
+s,@ACLOCAL@,$ACLOCAL,;t t
+s,@AUTOCONF@,$AUTOCONF,;t t
+s,@AUTOMAKE@,$AUTOMAKE,;t t
+s,@AUTOHEADER@,$AUTOHEADER,;t t
+s,@MAKEINFO@,$MAKEINFO,;t t
+s,@install_sh@,$install_sh,;t t
+s,@STRIP@,$STRIP,;t t
+s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t
+s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t
+s,@mkdir_p@,$mkdir_p,;t t
+s,@AWK@,$AWK,;t t
+s,@SET_MAKE@,$SET_MAKE,;t t
+s,@am__leading_dot@,$am__leading_dot,;t t
+s,@AMTAR@,$AMTAR,;t t
+s,@am__tar@,$am__tar,;t t
+s,@am__untar@,$am__untar,;t t
+s,@build@,$build,;t t
+s,@build_cpu@,$build_cpu,;t t
+s,@build_vendor@,$build_vendor,;t t
+s,@build_os@,$build_os,;t t
+s,@host@,$host,;t t
+s,@host_cpu@,$host_cpu,;t t
+s,@host_vendor@,$host_vendor,;t t
+s,@host_os@,$host_os,;t t
+s,@CXX@,$CXX,;t t
+s,@CXXFLAGS@,$CXXFLAGS,;t t
+s,@LDFLAGS@,$LDFLAGS,;t t
+s,@CPPFLAGS@,$CPPFLAGS,;t t
+s,@ac_ct_CXX@,$ac_ct_CXX,;t t
+s,@EXEEXT@,$EXEEXT,;t t
+s,@OBJEXT@,$OBJEXT,;t t
+s,@DEPDIR@,$DEPDIR,;t t
+s,@am__include@,$am__include,;t t
+s,@am__quote@,$am__quote,;t t
+s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t
+s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t
+s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t
+s,@CXXDEPMODE@,$CXXDEPMODE,;t t
+s,@am__fastdepCXX_TRUE@,$am__fastdepCXX_TRUE,;t t
+s,@am__fastdepCXX_FALSE@,$am__fastdepCXX_FALSE,;t t
+s,@CC@,$CC,;t t
+s,@CFLAGS@,$CFLAGS,;t t
+s,@ac_ct_CC@,$ac_ct_CC,;t t
+s,@CCDEPMODE@,$CCDEPMODE,;t t
+s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t
+s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t
+s,@CPP@,$CPP,;t t
+s,@LIBOBJS@,$LIBOBJS,;t t
+s,@LTLIBOBJS@,$LTLIBOBJS,;t t
+CEOF
+
+_ACEOF
+
+  cat >>$CONFIG_STATUS <<\_ACEOF
+  # Split the substitutions into bite-sized pieces for seds with
+  # small command number limits, like on Digital OSF/1 and HP-UX.
+  ac_max_sed_lines=48
+  ac_sed_frag=1 # Number of current file.
+  ac_beg=1 # First line for current file.
+  ac_end=$ac_max_sed_lines # Line after last line for current file.
+  ac_more_lines=:
+  ac_sed_cmds=
+  while $ac_more_lines; do
+    if test $ac_beg -gt 1; then
+      sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    else
+      sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    fi
+    if test ! -s $tmp/subs.frag; then
+      ac_more_lines=false
+    else
+      # The purpose of the label and of the branching condition is to
+      # speed up the sed processing (if there are no `@' at all, there
+      # is no need to browse any of the substitutions).
+      # These are the two extra sed commands mentioned above.
+      (echo ':t
+  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+      if test -z "$ac_sed_cmds"; then
+	ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+      else
+	ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+      fi
+      ac_sed_frag=`expr $ac_sed_frag + 1`
+      ac_beg=$ac_end
+      ac_end=`expr $ac_end + $ac_max_sed_lines`
+    fi
+  done
+  if test -z "$ac_sed_cmds"; then
+    ac_sed_cmds=cat
+  fi
+fi # test -n "$CONFIG_FILES"
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case $ac_file in
+  - | *:- | *:-:* ) # input from stdin
+	cat >$tmp/stdin
+	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
+  esac
+
+  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+  ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+  ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
+
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
+  esac
+
+  if test x"$ac_file" != x-; then
+    { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    rm -f "$ac_file"
+  fi
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated by config.status.  */
+  if test x"$ac_file" = x-; then
+    configure_input=
+  else
+    configure_input="$ac_file.  "
+  fi
+  configure_input=$configure_input"Generated from `echo $ac_file_in |
+				     sed 's,.*/,,'` by configure."
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo $tmp/stdin ;;
+      [\\/$]*)
+	 # Absolute (can't be DOS-style, as IFS=:)
+	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+	 echo "$f";;
+      *) # Relative
+	 if test -f "$f"; then
+	   # Build tree
+	   echo "$f"
+	 elif test -f "$srcdir/$f"; then
+	   # Source tree
+	   echo "$srcdir/$f"
+	 else
+	   # /dev/null tree
+	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+	 fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@abs_srcdir@,$ac_abs_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s,@builddir@,$ac_builddir,;t t
+s,@abs_builddir@,$ac_abs_builddir,;t t
+s,@top_builddir@,$ac_top_builddir,;t t
+s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
+s,@INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+  rm -f $tmp/stdin
+  if test x"$ac_file" != x-; then
+    mv $tmp/out $ac_file
+  else
+    cat $tmp/out
+    rm -f $tmp/out
+  fi
+
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_HEADER section.
+#
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s,^\([	 ]*\)#\([	 ]*define[	 ][	 ]*\)'
+ac_dB='[	 ].*$,\1#\2'
+ac_dC=' '
+ac_dD=',;t'
+# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_uA='s,^\([	 ]*\)#\([	 ]*\)undef\([	 ][	 ]*\)'
+ac_uB='$,\1#\2define\3'
+ac_uC=' '
+ac_uD=',;t'
+
+for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case $ac_file in
+  - | *:- | *:-:* ) # input from stdin
+	cat >$tmp/stdin
+	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
+  esac
+
+  test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo $tmp/stdin ;;
+      [\\/$]*)
+	 # Absolute (can't be DOS-style, as IFS=:)
+	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+	 # Do quote $f, to prevent DOS paths from being IFS'd.
+	 echo "$f";;
+      *) # Relative
+	 if test -f "$f"; then
+	   # Build tree
+	   echo "$f"
+	 elif test -f "$srcdir/$f"; then
+	   # Source tree
+	   echo "$srcdir/$f"
+	 else
+	   # /dev/null tree
+	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+	 fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+  # Remove the trailing spaces.
+  sed 's/[	 ]*$//' $ac_file_inputs >$tmp/in
+
+_ACEOF
+
+# Transform confdefs.h into two sed scripts, `conftest.defines' and
+# `conftest.undefs', that substitutes the proper values into
+# config.h.in to produce config.h.  The first handles `#define'
+# templates, and the second `#undef' templates.
+# And first: Protect against being on the right side of a sed subst in
+# config.status.  Protect against being in an unquoted here document
+# in config.status.
+rm -f conftest.defines conftest.undefs
+# Using a here document instead of a string reduces the quoting nightmare.
+# Putting comments in sed scripts is not portable.
+#
+# `end' is used to avoid that the second main sed command (meant for
+# 0-ary CPP macros) applies to n-ary macro definitions.
+# See the Autoconf documentation for `clear'.
+cat >confdef2sed.sed <<\_ACEOF
+s/[\\&,]/\\&/g
+s,[\\$`],\\&,g
+t clear
+: clear
+s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 (][^	 (]*\)\(([^)]*)\)[	 ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
+t end
+s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 ][^	 ]*\)[	 ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
+: end
+_ACEOF
+# If some macros were called several times there might be several times
+# the same #defines, which is useless.  Nevertheless, we may not want to
+# sort them, since we want the *last* AC-DEFINE to be honored.
+uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
+sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
+rm -f confdef2sed.sed
+
+# This sed command replaces #undef with comments.  This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >>conftest.undefs <<\_ACEOF
+s,^[	 ]*#[	 ]*undef[	 ][	 ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
+_ACEOF
+
+# Break up conftest.defines because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo '  # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
+echo '  if grep "^[	 ]*#[	 ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
+echo '  # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
+echo '  :' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.defines >/dev/null
+do
+  # Write a limited-size here document to $tmp/defines.sed.
+  echo '  cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
+  # Speed up: don't consider the non `#define' lines.
+  echo '/^[	 ]*#[	 ]*define/!b' >>$CONFIG_STATUS
+  # Work around the forget-to-reset-the-flag bug.
+  echo 't clr' >>$CONFIG_STATUS
+  echo ': clr' >>$CONFIG_STATUS
+  sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
+  echo 'CEOF
+  sed -f $tmp/defines.sed $tmp/in >$tmp/out
+  rm -f $tmp/in
+  mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+  sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
+  rm -f conftest.defines
+  mv conftest.tail conftest.defines
+done
+rm -f conftest.defines
+echo '  fi # grep' >>$CONFIG_STATUS
+echo >>$CONFIG_STATUS
+
+# Break up conftest.undefs because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo '  # Handle all the #undef templates' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.undefs >/dev/null
+do
+  # Write a limited-size here document to $tmp/undefs.sed.
+  echo '  cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
+  # Speed up: don't consider the non `#undef'
+  echo '/^[	 ]*#[	 ]*undef/!b' >>$CONFIG_STATUS
+  # Work around the forget-to-reset-the-flag bug.
+  echo 't clr' >>$CONFIG_STATUS
+  echo ': clr' >>$CONFIG_STATUS
+  sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
+  echo 'CEOF
+  sed -f $tmp/undefs.sed $tmp/in >$tmp/out
+  rm -f $tmp/in
+  mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+  sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
+  rm -f conftest.undefs
+  mv conftest.tail conftest.undefs
+done
+rm -f conftest.undefs
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated by config.status.  */
+  if test x"$ac_file" = x-; then
+    echo "/* Generated by configure.  */" >$tmp/config.h
+  else
+    echo "/* $ac_file.  Generated by configure.  */" >$tmp/config.h
+  fi
+  cat $tmp/in >>$tmp/config.h
+  rm -f $tmp/in
+  if test x"$ac_file" != x-; then
+    if diff $ac_file $tmp/config.h >/dev/null 2>&1; then
+      { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+      { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+      rm -f $ac_file
+      mv $tmp/config.h $ac_file
+    fi
+  else
+    cat $tmp/config.h
+    rm -f $tmp/config.h
+  fi
+# Compute $ac_file's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $ac_file | $ac_file:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null ||
+$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X$ac_file : 'X\(//\)[^/]' \| \
+	 X$ac_file : 'X\(//\)$' \| \
+	 X$ac_file : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X$ac_file |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`/stamp-h$_am_stamp_count
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_COMMANDS section.
+#
+for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
+  ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
+  ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
+  ac_dir=`(dirname "$ac_dest") 2>/dev/null ||
+$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_dest" : 'X\(//\)[^/]' \| \
+	 X"$ac_dest" : 'X\(//\)$' \| \
+	 X"$ac_dest" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_dest" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+  ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
+
+
+  { echo "$as_me:$LINENO: executing $ac_dest commands" >&5
+echo "$as_me: executing $ac_dest commands" >&6;}
+  case $ac_dest in
+    depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
+  # Strip MF so we end up with the name of the file.
+  mf=`echo "$mf" | sed -e 's/:.*$//'`
+  # Check whether this is an Automake generated Makefile or not.
+  # We used to match only the files named `Makefile.in', but
+  # some people rename them; so instead we look at the file content.
+  # Grep'ing the first line is not enough: some people post-process
+  # each Makefile.in and add a new line on top of each file to say so.
+  # So let's grep whole file.
+  if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+    dirpart=`(dirname "$mf") 2>/dev/null ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$mf" : 'X\(//\)[^/]' \| \
+	 X"$mf" : 'X\(//\)$' \| \
+	 X"$mf" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  else
+    continue
+  fi
+  # Extract the definition of DEPDIR, am__include, and am__quote
+  # from the Makefile without running `make'.
+  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+  test -z "$DEPDIR" && continue
+  am__include=`sed -n 's/^am__include = //p' < "$mf"`
+  test -z "am__include" && continue
+  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+  # When using ansi2knr, U may be empty or an underscore; expand it
+  U=`sed -n 's/^U = //p' < "$mf"`
+  # Find all dependency output files, they are included files with
+  # $(DEPDIR) in their names.  We invoke sed twice because it is the
+  # simplest approach to changing $(DEPDIR) to its actual value in the
+  # expansion.
+  for file in `sed -n "
+    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+    # Make sure the directory exists.
+    test -f "$dirpart/$file" && continue
+    fdir=`(dirname "$file") 2>/dev/null ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$file" : 'X\(//\)[^/]' \| \
+	 X"$file" : 'X\(//\)$' \| \
+	 X"$file" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    { if $as_mkdir_p; then
+    mkdir -p $dirpart/$fdir
+  else
+    as_dir=$dirpart/$fdir
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5
+echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+    # echo "creating $dirpart/$file"
+    echo '# dummy' > "$dirpart/$file"
+  done
+done
+ ;;
+  esac
+done
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || { (exit 1); exit 1; }
+fi
+
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbkeys-src/configure.ac
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbkeys-src/configure.ac	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbkeys-src/configure.ac	(revision 24799)
@@ -0,0 +1,25 @@
+#                                               -*- Autoconf -*-
+# Process this file with autoconf to produce a configure script.
+
+AC_PREREQ(2.59)
+AC_INIT([tdbkeys], [1.0], [jmt12@cs.waikato.ac.nz])
+AM_INIT_AUTOMAKE
+AC_CANONICAL_HOST
+AC_CONFIG_SRCDIR([tdbkeys.cpp])
+AC_CONFIG_HEADER([config.h])
+
+# Checks for programs.
+AC_PROG_CXX
+AC_PROG_CPP
+
+# Checks for libraries.
+
+# Checks for header files.
+
+# Checks for typedefs, structures, and compiler characteristics.
+
+# Checks for library functions.
+
+# Completion
+AC_CONFIG_FILES([Makefile])
+AC_OUTPUT
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbkeys-src/install-sh
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbkeys-src/install-sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbkeys-src/install-sh	(revision 24799)
@@ -0,0 +1,323 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2005-05-14.22
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.  It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+chmodcmd="$chmodprog 0755"
+chowncmd=
+chgrpcmd=
+stripcmd=
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=
+dst=
+dir_arg=
+dstarg=
+no_target_directory=
+
+usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+-c         (ignored)
+-d         create directories instead of installing files.
+-g GROUP   $chgrpprog installed files to GROUP.
+-m MODE    $chmodprog installed files to MODE.
+-o USER    $chownprog installed files to USER.
+-s         $stripprog installed files.
+-t DIRECTORY  install into DIRECTORY.
+-T         report an error if DSTFILE is a directory.
+--help     display this help and exit.
+--version  display version info and exit.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
+"
+
+while test -n "$1"; do
+  case $1 in
+    -c) shift
+        continue;;
+
+    -d) dir_arg=true
+        shift
+        continue;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+        shift
+        shift
+        continue;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) chmodcmd="$chmodprog $2"
+        shift
+        shift
+        continue;;
+
+    -o) chowncmd="$chownprog $2"
+        shift
+        shift
+        continue;;
+
+    -s) stripcmd=$stripprog
+        shift
+        continue;;
+
+    -t) dstarg=$2
+	shift
+	shift
+	continue;;
+
+    -T) no_target_directory=true
+	shift
+	continue;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    *)  # When -d is used, all remaining arguments are directories to create.
+	# When -t is used, the destination is already specified.
+	test -n "$dir_arg$dstarg" && break
+        # Otherwise, the last argument is the destination.  Remove it from $@.
+	for arg
+	do
+          if test -n "$dstarg"; then
+	    # $@ is not empty: it contains at least $arg.
+	    set fnord "$@" "$dstarg"
+	    shift # fnord
+	  fi
+	  shift # arg
+	  dstarg=$arg
+	done
+	break;;
+  esac
+done
+
+if test -z "$1"; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call `install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+for src
+do
+  # Protect names starting with `-'.
+  case $src in
+    -*) src=./$src ;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    src=
+
+    if test -d "$dst"; then
+      mkdircmd=:
+      chmodcmd=
+    else
+      mkdircmd=$mkdirprog
+    fi
+  else
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dstarg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+
+    dst=$dstarg
+    # Protect names starting with `-'.
+    case $dst in
+      -*) dst=./$dst ;;
+    esac
+
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
+    if test -d "$dst"; then
+      if test -n "$no_target_directory"; then
+	echo "$0: $dstarg: Is a directory" >&2
+	exit 1
+      fi
+      dst=$dst/`basename "$src"`
+    fi
+  fi
+
+  # This sed command emulates the dirname command.
+  dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'`
+
+  # Make sure that the destination directory exists.
+
+  # Skip lots of stat calls in the usual case.
+  if test ! -d "$dstdir"; then
+    defaultIFS='
+	 '
+    IFS="${IFS-$defaultIFS}"
+
+    oIFS=$IFS
+    # Some sh's can't handle IFS=/ for some reason.
+    IFS='%'
+    set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
+    shift
+    IFS=$oIFS
+
+    pathcomp=
+
+    while test $# -ne 0 ; do
+      pathcomp=$pathcomp$1
+      shift
+      if test ! -d "$pathcomp"; then
+        $mkdirprog "$pathcomp"
+	# mkdir can fail with a `File exist' error in case several
+	# install-sh are creating the directory concurrently.  This
+	# is OK.
+	test -d "$pathcomp" || exit
+      fi
+      pathcomp=$pathcomp/
+    done
+  fi
+
+  if test -n "$dir_arg"; then
+    $doit $mkdircmd "$dst" \
+      && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
+      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
+      && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
+      && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
+
+  else
+    dstfile=`basename "$dst"`
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+    trap '(exit $?); exit' 1 2 13 15
+
+    # Copy the file name to the temp name.
+    $doit $cpprog "$src" "$dsttmp" &&
+
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
+      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
+      && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
+      && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
+
+    # Now rename the file to the real destination.
+    { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
+      || {
+	   # The rename failed, perhaps because mv can't rename something else
+	   # to itself, or perhaps because mv is so ancient that it does not
+	   # support -f.
+
+	   # Now remove or move aside any old file at destination location.
+	   # We try this two ways since rm can't unlink itself on some
+	   # systems and the destination file might be busy for other
+	   # reasons.  In this case, the final cleanup might fail but the new
+	   # file should still install successfully.
+	   {
+	     if test -f "$dstdir/$dstfile"; then
+	       $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
+	       || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
+	       || {
+		 echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
+		 (exit 1); exit 1
+	       }
+	     else
+	       :
+	     fi
+	   } &&
+
+	   # Now rename the file to the real destination.
+	   $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
+	 }
+    }
+  fi || { (exit 1); exit 1; }
+done
+
+# The final little trick to "correctly" pass the exit status to the exit trap.
+{
+  (exit 0); exit 0
+}
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbkeys-src/tdbkeys.cpp
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbkeys-src/tdbkeys.cpp	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbkeys-src/tdbkeys.cpp	(revision 24799)
@@ -0,0 +1,112 @@
+/**********************************************************************
+ *
+ * tdbkeys -- retrieve a single value from the TDB database
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * Copyright (C) 2011  The New Zealand Digital Library Project
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *********************************************************************/
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#include <ospace\std\iostream>
+#elif defined(GSDL_USE_IOS_H)
+#include <iostream.h>
+#else
+#include <iostream>
+#endif
+
+#include <cstdlib>
+
+#include <fcntl.h>
+#include "tdb.h"
+
+// use the standard namespace
+#if !defined (GSDL_NAMESPACE_BROKEN)
+#if defined(GSDL_USE_OBJECTSPACE)
+using namespace ospace::std;
+#else
+using namespace std;
+#endif
+#endif
+
+/**
+ */
+void
+printUsage(char *program_name)
+{
+  cerr << "usage: " << program_name << " <database_path>" << endl << endl;
+}
+/** printUsage() **/
+
+/** Open a connection to the TDB database then return a listing of all of the
+ *  keys, one per line, to STDOUT.
+ *  @param argc - must be 2
+ *  @param argv - and char * array containing first the executable name, then
+ *                the name of/path to the database
+ *  @return 0
+ */
+int
+main (int argc, char *argv[])
+{
+  // sanity check
+  if (argc != 2)
+  {
+    printUsage(argv[0]);
+    exit (0);
+  }
+
+  char *dbname = argv[1];
+
+  // open the database
+  int hash_size = 0;
+  int tdb_flags = TDB_DEFAULT;
+  int open_flags = O_RDONLY;
+  TDB_CONTEXT *tdb = tdb_open(dbname, hash_size, tdb_flags, open_flags, 0664);
+  if (!tdb)
+  {
+    cerr << "couldn't create " << dbname << endl;
+    exit (0);
+  }
+
+  TDB_DATA key = tdb_firstkey(tdb);
+  while (key.dptr != NULL)
+  {
+    for (int i = 0; i < key.dsize; ++i)
+    {
+      cout << key.dptr[i];
+    }
+    cout << endl;
+
+    /* get next key */
+    TDB_DATA nextkey = tdb_nextkey(tdb, key);
+
+    /* free old key's dptr, otherwise causes memory leak */
+    free(key.dptr);
+
+    /* can now safely copy content of nextkey into key */
+    key = nextkey;
+  }
+
+  tdb_close(tdb);
+
+  return 0;
+}
+/** main() **/
+
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbset-src/.svnignore
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbset-src/.svnignore	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbset-src/.svnignore	(revision 24799)
@@ -0,0 +1,6 @@
+Makefile
+config.h
+config.log
+config.status
+stamp-h1
+tdbset
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbset-src/Makefile.in
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbset-src/Makefile.in	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbset-src/Makefile.in	(revision 24799)
@@ -0,0 +1,80 @@
+###########################################################################
+#
+# Makefile -- tdbset
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999-2011  The New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+GSDL_DIR = ../../../..
+COMMON_DIR = $(GSDL_DIR)/common-src
+
+COMMON_PACKAGES_DIR = $(COMMON_DIR)/packages
+
+CXX = @CXX@
+CXXFLAGS = @CXXFLAGS@
+DEFS = @DEFS@
+INCLUDES = -I${GEXTTDBEDIT_INSTALLED}/include
+INSTALL = @INSTALL@
+LDFLAGS = @LDFLAGS@ -L${GEXTTDBEDIT_INSTALLED}/lib
+LIBS = @LIBS@ -ltdb
+
+
+CXXCOMPILE = $(CXX) -c $(CXXFLAGS) $(DEFS) $(INCLUDES)
+CXXLINK = $(CXX) $(LDFLAGS) -o $@
+
+
+.SUFFIXES:
+.SUFFIXES: .cpp .o
+.cpp.o:
+	$(CXXCOMPILE) $< 
+
+
+SOURCES = \
+	tdbset.cpp
+
+OBJECTS = \
+	tdbset.o
+
+EXECUTABLE_OBJECTS = \
+	$(OBJECTS)
+
+EXECUTABLE = tdbset
+
+
+# Default target: make the tdbset executable
+all: $(EXECUTABLE)
+
+tdbset: $(EXECUTABLE_OBJECTS)
+	$(CXXLINK) $(EXECUTABLE_OBJECTS) $(LIBS)
+
+install: $(EXECUTABLE)
+	$(INSTALL) -d ${GEXTTDBEDIT_INSTALLED}/bin
+	$(INSTALL) -m 755 -s $(EXECUTABLE) ${GEXTTDBEDIT_INSTALLED}/bin
+
+clean:
+	rm -f $(OBJECTS) $(EXECUTABLE)
+
+distclean:
+	rm -f $(OBJECTS) $(EXECUTABLE) Makefile
+
+depend:
+	makedepend -Y -- $(DEFS) $(INCLUDES) $(CXXFLAGS) -- $(SOURCES)
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbset-src/aclocal.m4
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbset-src/aclocal.m4	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbset-src/aclocal.m4	(revision 24799)
@@ -0,0 +1,850 @@
+# generated automatically by aclocal 1.9.6 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005  Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# Copyright (C) 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION so it can be traced.
+# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+	 [AM_AUTOMAKE_VERSION([1.9.6])])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 7
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])
+AC_SUBST([$1_FALSE])
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 8
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
+       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
+       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                   [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 3
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[for mf in $CONFIG_FILES; do
+  # Strip MF so we end up with the name of the file.
+  mf=`echo "$mf" | sed -e 's/:.*$//'`
+  # Check whether this is an Automake generated Makefile or not.
+  # We used to match only the files named `Makefile.in', but
+  # some people rename them; so instead we look at the file content.
+  # Grep'ing the first line is not enough: some people post-process
+  # each Makefile.in and add a new line on top of each file to say so.
+  # So let's grep whole file.
+  if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+    dirpart=`AS_DIRNAME("$mf")`
+  else
+    continue
+  fi
+  # Extract the definition of DEPDIR, am__include, and am__quote
+  # from the Makefile without running `make'.
+  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+  test -z "$DEPDIR" && continue
+  am__include=`sed -n 's/^am__include = //p' < "$mf"`
+  test -z "am__include" && continue
+  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+  # When using ansi2knr, U may be empty or an underscore; expand it
+  U=`sed -n 's/^U = //p' < "$mf"`
+  # Find all dependency output files, they are included files with
+  # $(DEPDIR) in their names.  We invoke sed twice because it is the
+  # simplest approach to changing $(DEPDIR) to its actual value in the
+  # expansion.
+  for file in `sed -n "
+    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+    # Make sure the directory exists.
+    test -f "$dirpart/$file" && continue
+    fdir=`AS_DIRNAME(["$file"])`
+    AS_MKDIR_P([$dirpart/$fdir])
+    # echo "creating $dirpart/$file"
+    echo '# dummy' > "$dirpart/$file"
+  done
+done
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled.  FIXME.  This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 12
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.58])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+   test -f $srcdir/config.status; then
+  AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AM_PROG_INSTALL_SH
+AM_PROG_INSTALL_STRIP
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+              [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+	      		     [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+                  [_AM_DEPENDENCIES(CC)],
+                  [define([AC_PROG_CC],
+                          defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+                  [_AM_DEPENDENCIES(CXX)],
+                  [define([AC_PROG_CXX],
+                          defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+])
+])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $1 | $1:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Check to see how 'make' treats includes.	            -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+   am__include=include
+   am__quote=
+   _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+      am__include=.include
+      am__quote="\""
+      _am_result=BSD
+   fi
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise.
+#
+# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories
+# created by `make install' are always world readable, even if the
+# installer happens to have an overly restrictive umask (e.g. 077).
+# This was a mistake.  There are at least two reasons why we must not
+# use `-m 0755':
+#   - it causes special bits like SGID to be ignored,
+#   - it may be too restrictive (some setups expect 775 directories).
+#
+# Do not use -m 0755 and let people choose whatever they expect by
+# setting umask.
+#
+# We cannot accept any implementation of `mkdir' that recognizes `-p'.
+# Some implementations (such as Solaris 8's) are not thread-safe: if a
+# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c'
+# concurrently, both version can detect that a/ is missing, but only
+# one can create it and the other will error out.  Consequently we
+# restrict ourselves to GNU make (using the --version option ensures
+# this.)
+AC_DEFUN([AM_PROG_MKDIR_P],
+[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+  # We used to keeping the `.' as first argument, in order to
+  # allow $(mkdir_p) to be used without argument.  As in
+  #   $(mkdir_p) $(somedir)
+  # where $(somedir) is conditionally defined.  However this is wrong
+  # for two reasons:
+  #  1. if the package is installed by a user who cannot write `.'
+  #     make install will fail,
+  #  2. the above comment should most certainly read
+  #     $(mkdir_p) $(DESTDIR)$(somedir)
+  #     so it does not work when $(somedir) is undefined and
+  #     $(DESTDIR) is not.
+  #  To support the latter case, we have to write
+  #     test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+  #  so the `.' trick is pointless.
+  mkdir_p='mkdir -p --'
+else
+  # On NextStep and OpenStep, the `mkdir' command does not
+  # recognize any option.  It will interpret all options as
+  # directories to create, and then abort because `.' already
+  # exists.
+  for d in ./-p ./--version;
+  do
+    test -d $d && rmdir $d
+  done
+  # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+  if test -f "$ac_aux_dir/mkinstalldirs"; then
+    mkdir_p='$(mkinstalldirs)'
+  else
+    mkdir_p='$(install_sh) -d'
+  fi
+fi
+AC_SUBST([mkdir_p])])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+   if test "$[*]" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$[*]" != "X $srcdir/configure conftest.file" \
+      && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+     [m4_case([$1], [ustar],, [pax],,
+              [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+  case $_am_tool in
+  gnutar)
+    for _am_tar in tar gnutar gtar;
+    do
+      AM_RUN_LOG([$_am_tar --version]) && break
+    done
+    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+    am__untar="$_am_tar -xf -"
+    ;;
+  plaintar)
+    # Must skip GNU tar: if it does not support --format= it doesn't create
+    # ustar tarball either.
+    (tar --version) >/dev/null 2>&1 && continue
+    am__tar='tar chf - "$$tardir"'
+    am__tar_='tar chf - "$tardir"'
+    am__untar='tar xf -'
+    ;;
+  pax)
+    am__tar='pax -L -x $1 -w "$$tardir"'
+    am__tar_='pax -L -x $1 -w "$tardir"'
+    am__untar='pax -r'
+    ;;
+  cpio)
+    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+    am__untar='cpio -i -H $1 -d'
+    ;;
+  none)
+    am__tar=false
+    am__tar_=false
+    am__untar=false
+    ;;
+  esac
+
+  # If the value was cached, stop now.  We just wanted to have am__tar
+  # and am__untar set.
+  test -n "${am_cv_prog_tar_$1}" && break
+
+  # tar/untar a dummy directory, and stop if the command works
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  echo GrepMe > conftest.dir/file
+  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+  rm -rf conftest.dir
+  if test -s conftest.tar; then
+    AM_RUN_LOG([$am__untar <conftest.tar])
+    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+  fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbset-src/config.guess
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbset-src/config.guess	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbset-src/config.guess	(revision 24799)
@@ -0,0 +1,1298 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+#   Free Software Foundation, Inc.
+
+timestamp='2001-07-12'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Written by Per Bothner <bothner@cygnus.com>.
+# Please send patches to <config-patches@gnu.org>.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit 0 ;;
+    --version | -v )
+       echo "$version" ; exit 0 ;;
+    --help | --h* | -h )
+       echo "$usage"; exit 0 ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+
+dummy=dummy-$$
+trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script.
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int dummy(){}" > $dummy.c ;
+	for c in cc gcc c89 ; do
+	  ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ;
+	  if test $? = 0 ; then
+	     CC_FOR_BUILD="$c"; break ;
+	  fi ;
+	done ;
+	rm -f $dummy.c $dummy.o $dummy.rel ;
+	if test x"$CC_FOR_BUILD" = x ; then
+	  CC_FOR_BUILD=no_compiler_found ;
+	fi
+	;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+	# Netbsd (nbsd) targets should (where applicable) match one or
+	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	# Determine the machine/vendor (is the vendor relevant).
+	case "${UNAME_MACHINE}" in
+	    amiga) machine=m68k-unknown ;;
+	    arm32) machine=arm-unknown ;;
+	    atari*) machine=m68k-atari ;;
+	    sun3*) machine=m68k-sun ;;
+	    mac68k) machine=m68k-apple ;;
+	    macppc) machine=powerpc-apple ;;
+	    hp3[0-9][05]) machine=m68k-hp ;;
+	    ibmrt|romp-ibm) machine=romp-ibm ;;
+	    *) machine=${UNAME_MACHINE}-unknown ;;
+	esac
+	# The Operating System including object format, if it has switched
+	# to ELF recently, or will in the future.
+	case "${UNAME_MACHINE}" in
+	    i386|sparc|amiga|arm*|hp300|mvme68k|vax|atari|luna68k|mac68k|news68k|next68k|pc532|sun3*|x68k)
+		eval $set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep __ELF__ >/dev/null
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+	        os=netbsd
+		;;
+	esac
+	# The OS release
+	release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	echo "${machine}-${os}${release}"
+	exit 0 ;;
+    alpha:OSF1:*:*)
+	if test $UNAME_RELEASE = "V4.0"; then
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+	fi
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	cat <<EOF >$dummy.s
+	.data
+\$Lformat:
+	.byte 37,100,45,37,120,10,0	# "%d-%x\n"
+
+	.text
+	.globl main
+	.align 4
+	.ent main
+main:
+	.frame \$30,16,\$26,0
+	ldgp \$29,0(\$27)
+	.prologue 1
+	.long 0x47e03d80 # implver \$0
+	lda \$2,-1
+	.long 0x47e20c21 # amask \$2,\$1
+	lda \$16,\$Lformat
+	mov \$0,\$17
+	not \$1,\$18
+	jsr \$26,printf
+	ldgp \$29,0(\$26)
+	mov 0,\$16
+	jsr \$26,exit
+	.end main
+EOF
+	eval $set_cc_for_build
+	$CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
+	if test "$?" = 0 ; then
+		case `./$dummy` in
+			0-0)
+				UNAME_MACHINE="alpha"
+				;;
+			1-0)
+				UNAME_MACHINE="alphaev5"
+				;;
+			1-1)
+				UNAME_MACHINE="alphaev56"
+				;;
+			1-101)
+				UNAME_MACHINE="alphapca56"
+				;;
+			2-303)
+				UNAME_MACHINE="alphaev6"
+				;;
+			2-307)
+				UNAME_MACHINE="alphaev67"
+				;;
+		esac
+	fi
+	rm -f $dummy.s $dummy
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	exit 0 ;;
+    Alpha\ *:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# Should we change UNAME_MACHINE based on the output of uname instead
+	# of the specific Alpha model?
+	echo alpha-pc-interix
+	exit 0 ;;
+    21064:Windows_NT:50:3)
+	echo alpha-dec-winnt3.5
+	exit 0 ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-unknown-sysv4
+	exit 0;;
+    amiga:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-amigaos
+	exit 0 ;;
+    arc64:OpenBSD:*:*)
+	echo mips64el-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    arc:OpenBSD:*:*)
+	echo mipsel-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    hkmips:OpenBSD:*:*)
+	echo mips-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    pmax:OpenBSD:*:*)
+	echo mipsel-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    sgi:OpenBSD:*:*)
+	echo mips-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    wgrisc:OpenBSD:*:*)
+	echo mipsel-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    *:OS/390:*:*)
+	echo i370-ibm-openedition
+	exit 0 ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit 0;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit 0;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit 0 ;;
+    NILE*:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit 0 ;;
+    sun4H:SunOS:5.*:*)
+	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    i86pc:SunOS:5.*:*)
+	echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    sun4*:SunOS:*:*)
+	case "`/usr/bin/arch -k`" in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+	exit 0 ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos${UNAME_RELEASE}
+	exit 0 ;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+	case "`/bin/arch`" in
+	    sun3)
+		echo m68k-sun-sunos${UNAME_RELEASE}
+		;;
+	    sun4)
+		echo sparc-sun-sunos${UNAME_RELEASE}
+		;;
+	esac
+	exit 0 ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos${UNAME_RELEASE}
+	exit 0 ;;
+    atari*:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit 0 ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+        exit 0 ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit 0 ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+        echo m68k-milan-mint${UNAME_RELEASE}
+        exit 0 ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+        echo m68k-hades-mint${UNAME_RELEASE}
+        exit 0 ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+        echo m68k-unknown-mint${UNAME_RELEASE}
+        exit 0 ;;
+    sun3*:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    mac68k:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    mvme68k:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    mvme88k:OpenBSD:*:*)
+	echo m88k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten${UNAME_RELEASE}
+	exit 0 ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit 0 ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit 0 ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit 0 ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	echo clipper-intergraph-clix${UNAME_RELEASE}
+	exit 0 ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	sed 's/^	//' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	eval $set_cc_for_build
+	$CC_FOR_BUILD $dummy.c -o $dummy \
+	  && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+	  && rm -f $dummy.c $dummy && exit 0
+	rm -f $dummy.c $dummy
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit 0 ;;
+    Motorola:PowerMAX_OS:*:*)
+	echo powerpc-motorola-powermax
+	exit 0 ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit 0 ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit 0 ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit 0 ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit 0 ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+	then
+	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+	       [ ${TARGET_BINARY_INTERFACE}x = x ]
+	    then
+		echo m88k-dg-dgux${UNAME_RELEASE}
+	    else
+		echo m88k-dg-dguxbcs${UNAME_RELEASE}
+	    fi
+	else
+	    echo i586-dg-dgux${UNAME_RELEASE}
+	fi
+ 	exit 0 ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit 0 ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit 0 ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit 0 ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit 0 ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+	exit 0 ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	echo romp-ibm-aix      # uname -m gives an 8 hex-code CPU id
+	exit 0 ;;              # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+	echo i386-ibm-aix
+	exit 0 ;;
+    ia64:AIX:*:*)
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+	exit 0 ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		sed 's/^		//' << EOF >$dummy.c
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		eval $set_cc_for_build
+		$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
+		rm -f $dummy.c $dummy
+		echo rs6000-ibm-aix3.2.5
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		echo rs6000-ibm-aix3.2.4
+	else
+		echo rs6000-ibm-aix3.2
+	fi
+	exit 0 ;;
+    *:AIX:*:[45])
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit 0 ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit 0 ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+	echo romp-ibm-bsd4.4
+	exit 0 ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+	exit 0 ;;                           # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit 0 ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit 0 ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit 0 ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit 0 ;;
+    9000/[34678]??:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+              case "${HPUX_REV}" in
+                11.[0-9][0-9])
+                  if [ -x /usr/bin/getconf ]; then
+                    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+                    case "${sc_cpu_version}" in
+                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+                      532)                      # CPU_PA_RISC2_0
+                        case "${sc_kernel_bits}" in
+                          32) HP_ARCH="hppa2.0n" ;;
+                          64) HP_ARCH="hppa2.0w" ;;
+                        esac ;;
+                    esac
+                  fi ;;
+              esac
+              if [ "${HP_ARCH}" = "" ]; then
+              sed 's/^              //' << EOF >$dummy.c
+
+              #define _HPUX_SOURCE
+              #include <stdlib.h>
+              #include <unistd.h>
+
+              int main ()
+              {
+              #if defined(_SC_KERNEL_BITS)
+                  long bits = sysconf(_SC_KERNEL_BITS);
+              #endif
+                  long cpu  = sysconf (_SC_CPU_VERSION);
+
+                  switch (cpu)
+              	{
+              	case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+              	case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+              	case CPU_PA_RISC2_0:
+              #if defined(_SC_KERNEL_BITS)
+              	    switch (bits)
+              		{
+              		case 64: puts ("hppa2.0w"); break;
+              		case 32: puts ("hppa2.0n"); break;
+              		default: puts ("hppa2.0"); break;
+              		} break;
+              #else  /* !defined(_SC_KERNEL_BITS) */
+              	    puts ("hppa2.0"); break;
+              #endif
+              	default: puts ("hppa1.0"); break;
+              	}
+                  exit (0);
+              }
+EOF
+	eval $set_cc_for_build
+	(CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy`
+	if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi
+	rm -f $dummy.c $dummy
+	fi ;;
+	esac
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit 0 ;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ia64-hp-hpux${HPUX_REV}
+	exit 0 ;;
+    3050*:HI-UX:*:*)
+	sed 's/^	//' << EOF >$dummy.c
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	eval $set_cc_for_build
+	$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
+	rm -f $dummy.c $dummy
+	echo unknown-hitachi-hiuxwe2
+	exit 0 ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit 0 ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit 0 ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+	echo hppa1.0-hp-mpeix
+	exit 0 ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit 0 ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit 0 ;;
+    i*86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo ${UNAME_MACHINE}-unknown-osf1mk
+	else
+	    echo ${UNAME_MACHINE}-unknown-osf1
+	fi
+	exit 0 ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit 0 ;;
+    hppa*:OpenBSD:*:*)
+	echo hppa-unknown-openbsd
+	exit 0 ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+        exit 0 ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+        exit 0 ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+        exit 0 ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+        exit 0 ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+        exit 0 ;;
+    CRAY*X-MP:*:*:*)
+	echo xmp-cray-unicos
+        exit 0 ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*[A-Z]90:*:*:*)
+	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+	      -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*T3D:*:*:*)
+	echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*T3E:*:*:*)
+	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*SV1:*:*:*)
+	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY-2:*:*:*)
+	echo cray2-cray-unicos
+        exit 0 ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit 0 ;;
+    hp300:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+	exit 0 ;;
+    sparc*:BSD/OS:*:*)
+	echo sparc-unknown-bsdi${UNAME_RELEASE}
+	exit 0 ;;
+    *:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit 0 ;;
+    *:FreeBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit 0 ;;
+    *:OpenBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+	exit 0 ;;
+    i*:CYGWIN*:*)
+	echo ${UNAME_MACHINE}-pc-cygwin
+	exit 0 ;;
+    i*:MINGW*:*)
+	echo ${UNAME_MACHINE}-pc-mingw32
+	exit 0 ;;
+    i*:PW*:*)
+	echo ${UNAME_MACHINE}-pc-pw32
+	exit 0 ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+	# UNAME_MACHINE based on the output of uname instead of i386?
+	echo i386-pc-interix
+	exit 0 ;;
+    i*:UWIN*:*)
+	echo ${UNAME_MACHINE}-pc-uwin
+	exit 0 ;;
+    p*:CYGWIN*:*)
+	echo powerpcle-unknown-cygwin
+	exit 0 ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    *:GNU:*:*)
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit 0 ;;
+    i*86:Minix:*:*)
+	echo ${UNAME_MACHINE}-pc-minix
+	exit 0 ;;
+    arm*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    ia64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux
+	exit 0 ;;
+    m68*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    mips:Linux:*:*)
+	case `sed -n '/^byte/s/^.*: \(.*\) endian/\1/p' < /proc/cpuinfo` in
+	  big)    echo mips-unknown-linux-gnu && exit 0 ;;
+	  little) echo mipsel-unknown-linux-gnu && exit 0 ;;
+	esac
+	;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-gnu
+	exit 0 ;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev67 ;;
+        esac
+	objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+	exit 0 ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
+	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
+	  *)    echo hppa-unknown-linux-gnu ;;
+	esac
+	exit 0 ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-gnu
+	exit 0 ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	echo ${UNAME_MACHINE}-ibm-linux
+	exit 0 ;;
+    sh*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    x86_64:Linux:*:*)
+	echo x86_64-unknown-linux-gnu
+	exit 0 ;;
+    i*86:Linux:*:*)
+	# The BFD linker knows what the default object file format is, so
+	# first see if it will tell us. cd to the root directory to prevent
+	# problems with other programs or directories called `ld' in the path.
+	ld_supported_targets=`cd /; ld --help 2>&1 \
+			 | sed -ne '/supported targets:/!d
+				    s/[ 	][ 	]*/ /g
+				    s/.*supported targets: *//
+				    s/ .*//
+				    p'`
+        case "$ld_supported_targets" in
+	  elf32-i386)
+		TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+		;;
+	  a.out-i386-linux)
+		echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+		exit 0 ;;		
+	  coff-i386)
+		echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+		exit 0 ;;
+	  "")
+		# Either a pre-BFD a.out linker (linux-gnuoldld) or
+		# one that does not give us useful --help.
+		echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+		exit 0 ;;
+	esac
+	# Determine whether the default compiler is a.out or elf
+	cat >$dummy.c <<EOF
+#include <features.h>
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+#ifdef __ELF__
+# ifdef __GLIBC__
+#  if __GLIBC__ >= 2
+    printf ("%s-pc-linux-gnu\n", argv[1]);
+#  else
+    printf ("%s-pc-linux-gnulibc1\n", argv[1]);
+#  endif
+# else
+   printf ("%s-pc-linux-gnulibc1\n", argv[1]);
+# endif
+#else
+  printf ("%s-pc-linux-gnuaout\n", argv[1]);
+#endif
+  return 0;
+}
+EOF
+	eval $set_cc_for_build
+	$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0
+	rm -f $dummy.c $dummy
+	test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
+	;;
+    i*86:DYNIX/ptx:4*:*)
+	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+	# earlier versions are messed up and put the nodename in both
+	# sysname and nodename.
+	echo i386-sequent-sysv4
+	exit 0 ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+        # Unixware is an offshoot of SVR4, but it has its own version
+        # number series starting with 2...
+        # I am not positive that other SVR4 systems won't match this,
+	# I just have to hope.  -- rms.
+        # Use sysv4.2uw... so that sysv4* matches it.
+	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+	exit 0 ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+	else
+		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+	fi
+	exit 0 ;;
+    i*86:*:5:[78]*)
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	exit 0 ;;
+    i*86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-pc-sysv32
+	fi
+	exit 0 ;;
+    i*86:*DOS:*:*)
+	echo ${UNAME_MACHINE}-pc-msdosdjgpp
+	exit 0 ;;
+    pc:*:*:*)
+	# Left here for compatibility:
+        # uname -m prints for DJGPP always 'pc', but it prints nothing about
+        # the processor, so we play safe by assuming i386.
+	echo i386-pc-msdosdjgpp
+        exit 0 ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit 0 ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit 0 ;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	fi
+	exit 0 ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit 0 ;;
+    M68*:*:R3V[567]*:*)
+	test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+    3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && echo i486-ncr-sysv4.3${OS_REL} && exit 0
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && echo i486-ncr-sysv4 && exit 0 ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+	echo m68k-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit 0 ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+	echo i386-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    rs6000:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+	echo powerpc-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv${UNAME_RELEASE}
+	exit 0 ;;
+    RM*:ReliantUNIX-*:*:*)
+	echo mips-sni-sysv4
+	exit 0 ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit 0 ;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		echo ${UNAME_MACHINE}-sni-sysv4
+	else
+		echo ns32k-sni-sysv
+	fi
+	exit 0 ;;
+    PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                           # says <Richard.M.Bartel@ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit 0 ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes@openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit 0 ;;
+    *:*:*:FTX*)
+	# From seanf@swdc.stratus.com.
+	echo i860-stratus-sysv4
+	exit 0 ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux${UNAME_RELEASE}
+	exit 0 ;;
+    news*:NEWS-OS:6*:*)
+	echo mips-sony-newsos6
+	exit 0 ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+	if [ -d /usr/nec ]; then
+	        echo mips-nec-sysv${UNAME_RELEASE}
+	else
+	        echo mips-unknown-sysv${UNAME_RELEASE}
+	fi
+        exit 0 ;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	echo powerpc-be-beos
+	exit 0 ;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	echo powerpc-apple-beos
+	exit 0 ;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	echo i586-pc-beos
+	exit 0 ;;
+    SX-4:SUPER-UX:*:*)
+	echo sx4-nec-superux${UNAME_RELEASE}
+	exit 0 ;;
+    SX-5:SUPER-UX:*:*)
+	echo sx5-nec-superux${UNAME_RELEASE}
+	exit 0 ;;
+    Power*:Rhapsody:*:*)
+	echo powerpc-apple-rhapsody${UNAME_RELEASE}
+	exit 0 ;;
+    *:Rhapsody:*:*)
+	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+	exit 0 ;;
+    *:Darwin:*:*)
+	echo `uname -p`-apple-darwin${UNAME_RELEASE}
+	exit 0 ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	if test "${UNAME_MACHINE}" = "x86pc"; then
+		UNAME_MACHINE=pc
+	fi
+	echo `uname -p`-${UNAME_MACHINE}-nto-qnx
+	exit 0 ;;
+    *:QNX:*:4*)
+	echo i386-pc-qnx
+	exit 0 ;;
+    NSR-[KW]:NONSTOP_KERNEL:*:*)
+	echo nsr-tandem-nsk${UNAME_RELEASE}
+	exit 0 ;;
+    *:NonStop-UX:*:*)
+	echo mips-compaq-nonstopux
+	exit 0 ;;
+    BS2000:POSIX*:*:*)
+	echo bs2000-siemens-sysv
+	exit 0 ;;
+    DS/*:UNIX_System_V:*:*)
+	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+	exit 0 ;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	if test "$cputype" = "386"; then
+	    UNAME_MACHINE=i386
+	else
+	    UNAME_MACHINE="$cputype"
+	fi
+	echo ${UNAME_MACHINE}-unknown-plan9
+	exit 0 ;;
+    i*86:OS/2:*:*)
+	# If we were able to find `uname', then EMX Unix compatibility
+	# is probably installed.
+	echo ${UNAME_MACHINE}-pc-os2-emx
+	exit 0 ;;
+    *:TOPS-10:*:*)
+	echo pdp10-unknown-tops10
+	exit 0 ;;
+    *:TENEX:*:*)
+	echo pdp10-unknown-tenex
+	exit 0 ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	echo pdp10-dec-tops20
+	exit 0 ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	echo pdp10-xkl-tops20
+	exit 0 ;;
+    *:TOPS-20:*:*)
+	echo pdp10-unknown-tops20
+	exit 0 ;;
+    *:ITS:*:*)
+	echo pdp10-unknown-its
+	exit 0 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+          "4"
+#else
+	  ""
+#endif
+         ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+	printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+	printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# else
+    printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+eval $set_cc_for_build
+$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0
+rm -f $dummy.c $dummy
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+	echo c1-convex-bsd
+	exit 0 ;;
+    c2*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit 0 ;;
+    c34*)
+	echo c34-convex-bsd
+	exit 0 ;;
+    c38*)
+	echo c38-convex-bsd
+	exit 0 ;;
+    c4*)
+	echo c4-convex-bsd
+	exit 0 ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+    ftp://ftp.gnu.org/pub/gnu/config/
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbset-src/config.h.in
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbset-src/config.h.in	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbset-src/config.h.in	(revision 24799)
@@ -0,0 +1,22 @@
+/* config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Version number of package */
+#undef VERSION
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbset-src/config.sub
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbset-src/config.sub	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbset-src/config.sub	(revision 24799)
@@ -0,0 +1,1579 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+
+timestamp='2005-07-08'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \
+  kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+	-sun*os*)
+		# Prevent following clause from handling this invalid input.
+		;;
+	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+	-apple | -axis | -knuth | -cray)
+		os=
+		basic_machine=$1
+		;;
+	-sim | -cisco | -oki | -wec | -winbond)
+		os=
+		basic_machine=$1
+		;;
+	-scout)
+		;;
+	-wrs)
+		os=-vxworks
+		basic_machine=$1
+		;;
+	-chorusos*)
+		os=-chorusos
+		basic_machine=$1
+		;;
+ 	-chorusrdb)
+ 		os=-chorusrdb
+		basic_machine=$1
+ 		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco5)
+		os=-sco3.2v5
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-udk*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-lynx*)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-windowsnt*)
+		os=`echo $os | sed -e 's/windowsnt/winnt/'`
+		;;
+	-psos*)
+		os=-psos
+		;;
+	-mint | -mint[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+	# Recognize the basic CPU types without company name.
+	# Some are omitted here because they have special meanings below.
+	1750a | 580 \
+	| a29k \
+	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+	| am33_2.0 \
+	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+	| bfin \
+	| c4x | clipper \
+	| d10v | d30v | dlx | dsp16xx \
+	| fr30 | frv \
+	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| i370 | i860 | i960 | ia64 \
+	| ip2k | iq2000 \
+	| m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \
+	| mips | mipsbe | mipseb | mipsel | mipsle \
+	| mips16 \
+	| mips64 | mips64el \
+	| mips64vr | mips64vrel \
+	| mips64orion | mips64orionel \
+	| mips64vr4100 | mips64vr4100el \
+	| mips64vr4300 | mips64vr4300el \
+	| mips64vr5000 | mips64vr5000el \
+	| mips64vr5900 | mips64vr5900el \
+	| mipsisa32 | mipsisa32el \
+	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa64 | mipsisa64el \
+	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64sb1 | mipsisa64sb1el \
+	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipstx39 | mipstx39el \
+	| mn10200 | mn10300 \
+	| ms1 \
+	| msp430 \
+	| ns16k | ns32k \
+	| or32 \
+	| pdp10 | pdp11 | pj | pjl \
+	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+	| pyramid \
+	| sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
+	| sh64 | sh64le \
+	| sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \
+	| sparcv8 | sparcv9 | sparcv9b \
+	| strongarm \
+	| tahoe | thumb | tic4x | tic80 | tron \
+	| v850 | v850e \
+	| we32k \
+	| x86 | xscale | xscalee[bl] | xstormy16 | xtensa \
+	| z8k)
+		basic_machine=$basic_machine-unknown
+		;;
+	m32c)
+		basic_machine=$basic_machine-unknown
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12)
+		# Motorola 68HC11/12.
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+		;;
+
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i*86 | x86_64)
+	  basic_machine=$basic_machine-pc
+	  ;;
+	# Object if more than one company name word.
+	*-*-*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+	# Recognize the basic CPU types with company name.
+	580-* \
+	| a29k-* \
+	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+	| avr-* \
+	| bfin-* | bs2000-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+	| clipper-* | craynv-* | cydra-* \
+	| d10v-* | d30v-* | dlx-* \
+	| elxsi-* \
+	| f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
+	| h8300-* | h8500-* \
+	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| i*86-* | i860-* | i960-* | ia64-* \
+	| ip2k-* | iq2000-* \
+	| m32r-* | m32rle-* \
+	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* \
+	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+	| mips16-* \
+	| mips64-* | mips64el-* \
+	| mips64vr-* | mips64vrel-* \
+	| mips64orion-* | mips64orionel-* \
+	| mips64vr4100-* | mips64vr4100el-* \
+	| mips64vr4300-* | mips64vr4300el-* \
+	| mips64vr5000-* | mips64vr5000el-* \
+	| mips64vr5900-* | mips64vr5900el-* \
+	| mipsisa32-* | mipsisa32el-* \
+	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa64-* | mipsisa64el-* \
+	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64sb1-* | mipsisa64sb1el-* \
+	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipstx39-* | mipstx39el-* \
+	| mmix-* \
+	| ms1-* \
+	| msp430-* \
+	| none-* | np1-* | ns16k-* | ns32k-* \
+	| orion-* \
+	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+	| pyramid-* \
+	| romp-* | rs6000-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \
+	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+	| sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \
+	| sparclite-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
+	| tahoe-* | thumb-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+	| tron-* \
+	| v850-* | v850e-* | vax-* \
+	| we32k-* \
+	| x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \
+	| xstormy16-* | xtensa-* \
+	| ymp-* \
+	| z8k-*)
+		;;
+	m32c-*)
+		;;
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	386bsd)
+		basic_machine=i386-unknown
+		os=-bsd
+		;;
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		basic_machine=m68000-att
+		;;
+	3b*)
+		basic_machine=we32k-att
+		;;
+	a29khif)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+    	abacus)
+		basic_machine=abacus-unknown
+		;;
+	adobe68k)
+		basic_machine=m68010-adobe
+		os=-scout
+		;;
+	alliant | fx80)
+		basic_machine=fx80-alliant
+		;;
+	altos | altos3068)
+		basic_machine=m68k-altos
+		;;
+	am29k)
+		basic_machine=a29k-none
+		os=-bsd
+		;;
+	amd64)
+		basic_machine=x86_64-pc
+		;;
+	amd64-*)
+		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	amdahl)
+		basic_machine=580-amdahl
+		os=-sysv
+		;;
+	amiga | amiga-*)
+		basic_machine=m68k-unknown
+		;;
+	amigaos | amigados)
+		basic_machine=m68k-unknown
+		os=-amigaos
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-unknown
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	apollo68bsd)
+		basic_machine=m68k-apollo
+		os=-bsd
+		;;
+	aux)
+		basic_machine=m68k-apple
+		os=-aux
+		;;
+	balance)
+		basic_machine=ns32k-sequent
+		os=-dynix
+		;;
+	c90)
+		basic_machine=c90-cray
+		os=-unicos
+		;;
+	convex-c1)
+		basic_machine=c1-convex
+		os=-bsd
+		;;
+	convex-c2)
+		basic_machine=c2-convex
+		os=-bsd
+		;;
+	convex-c32)
+		basic_machine=c32-convex
+		os=-bsd
+		;;
+	convex-c34)
+		basic_machine=c34-convex
+		os=-bsd
+		;;
+	convex-c38)
+		basic_machine=c38-convex
+		os=-bsd
+		;;
+	cray | j90)
+		basic_machine=j90-cray
+		os=-unicos
+		;;
+	craynv)
+		basic_machine=craynv-cray
+		os=-unicosmp
+		;;
+	cr16c)
+		basic_machine=cr16c-unknown
+		os=-elf
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	crisv32 | crisv32-* | etraxfs*)
+		basic_machine=crisv32-axis
+		;;
+	cris | cris-* | etrax*)
+		basic_machine=cris-axis
+		;;
+	crx)
+		basic_machine=crx-unknown
+		os=-elf
+		;;
+	da30 | da30-*)
+		basic_machine=m68k-da30
+		;;
+	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+		basic_machine=mips-dec
+		;;
+	decsystem10* | dec10*)
+		basic_machine=pdp10-dec
+		os=-tops10
+		;;
+	decsystem20* | dec20*)
+		basic_machine=pdp10-dec
+		os=-tops20
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		basic_machine=m68k-motorola
+		;;
+	delta88)
+		basic_machine=m88k-motorola
+		os=-sysv3
+		;;
+	djgpp)
+		basic_machine=i586-pc
+		os=-msdosdjgpp
+		;;
+	dpx20 | dpx20-*)
+		basic_machine=rs6000-bull
+		os=-bosx
+		;;
+	dpx2* | dpx2*-bull)
+		basic_machine=m68k-bull
+		os=-sysv3
+		;;
+	ebmon29k)
+		basic_machine=a29k-amd
+		os=-ebmon
+		;;
+	elxsi)
+		basic_machine=elxsi-elxsi
+		os=-bsd
+		;;
+	encore | umax | mmax)
+		basic_machine=ns32k-encore
+		;;
+	es1800 | OSE68k | ose68k | ose | OSE)
+		basic_machine=m68k-ericsson
+		os=-ose
+		;;
+	fx2800)
+		basic_machine=i860-alliant
+		;;
+	genix)
+		basic_machine=ns32k-ns
+		;;
+	gmicro)
+		basic_machine=tron-gmicro
+		os=-sysv
+		;;
+	go32)
+		basic_machine=i386-pc
+		os=-go32
+		;;
+	h3050r* | hiux*)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	h8300hms)
+		basic_machine=h8300-hitachi
+		os=-hms
+		;;
+	h8300xray)
+		basic_machine=h8300-hitachi
+		os=-xray
+		;;
+	h8500hms)
+		basic_machine=h8500-hitachi
+		os=-hms
+		;;
+	harris)
+		basic_machine=m88k-harris
+		os=-sysv3
+		;;
+	hp300-*)
+		basic_machine=m68k-hp
+		;;
+	hp300bsd)
+		basic_machine=m68k-hp
+		os=-bsd
+		;;
+	hp300hpux)
+		basic_machine=m68k-hp
+		os=-hpux
+		;;
+	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		basic_machine=m68000-hp
+		;;
+	hp9k3[2-9][0-9])
+		basic_machine=m68k-hp
+		;;
+	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k78[0-9] | hp78[0-9])
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][13679] | hp8[0-9][13679])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hppa-next)
+		os=-nextstep3
+		;;
+	hppaosf)
+		basic_machine=hppa1.1-hp
+		os=-osf
+		;;
+	hppro)
+		basic_machine=hppa1.1-hp
+		os=-proelf
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+	i*86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv32
+		;;
+	i*86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv4
+		;;
+	i*86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv
+		;;
+	i*86sol2)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-solaris2
+		;;
+	i386mach)
+		basic_machine=i386-mach
+		os=-mach
+		;;
+	i386-vsta | vsta)
+		basic_machine=i386-unknown
+		os=-vsta
+		;;
+	iris | iris4d)
+		basic_machine=mips-sgi
+		case $os in
+		    -irix*)
+			;;
+		    *)
+			os=-irix4
+			;;
+		esac
+		;;
+	isi68 | isi)
+		basic_machine=m68k-isi
+		os=-sysv
+		;;
+	m88k-omron*)
+		basic_machine=m88k-omron
+		;;
+	magnum | m3230)
+		basic_machine=mips-mips
+		os=-sysv
+		;;
+	merlin)
+		basic_machine=ns32k-utek
+		os=-sysv
+		;;
+	mingw32)
+		basic_machine=i386-pc
+		os=-mingw32
+		;;
+	miniframe)
+		basic_machine=m68000-convergent
+		;;
+	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+	mips3*-*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	monitor)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	morphos)
+		basic_machine=powerpc-unknown
+		os=-morphos
+		;;
+	msdos)
+		basic_machine=i386-pc
+		os=-msdos
+		;;
+	mvs)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	netbsd386)
+		basic_machine=i386-unknown
+		os=-netbsd
+		;;
+	netwinder)
+		basic_machine=armv4l-rebel
+		os=-linux
+		;;
+	news | news700 | news800 | news900)
+		basic_machine=m68k-sony
+		os=-newsos
+		;;
+	news1000)
+		basic_machine=m68030-sony
+		os=-newsos
+		;;
+	news-3600 | risc-news)
+		basic_machine=mips-sony
+		os=-newsos
+		;;
+	necv70)
+		basic_machine=v70-nec
+		os=-sysv
+		;;
+	next | m*-next )
+		basic_machine=m68k-next
+		case $os in
+		    -nextstep* )
+			;;
+		    -ns2*)
+		      os=-nextstep2
+			;;
+		    *)
+		      os=-nextstep3
+			;;
+		esac
+		;;
+	nh3000)
+		basic_machine=m68k-harris
+		os=-cxux
+		;;
+	nh[45]000)
+		basic_machine=m88k-harris
+		os=-cxux
+		;;
+	nindy960)
+		basic_machine=i960-intel
+		os=-nindy
+		;;
+	mon960)
+		basic_machine=i960-intel
+		os=-mon960
+		;;
+	nonstopux)
+		basic_machine=mips-compaq
+		os=-nonstopux
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	nsr-tandem)
+		basic_machine=nsr-tandem
+		;;
+	op50n-* | op60c-*)
+		basic_machine=hppa1.1-oki
+		os=-proelf
+		;;
+	openrisc | openrisc-*)
+		basic_machine=or32-unknown
+		;;
+	os400)
+		basic_machine=powerpc-ibm
+		os=-os400
+		;;
+	OSE68000 | ose68000)
+		basic_machine=m68000-ericsson
+		os=-ose
+		;;
+	os68k)
+		basic_machine=m68k-none
+		os=-os68k
+		;;
+	pa-hitachi)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	paragon)
+		basic_machine=i860-intel
+		os=-osf
+		;;
+	pbd)
+		basic_machine=sparc-tti
+		;;
+	pbb)
+		basic_machine=m68k-tti
+		;;
+	pc532 | pc532-*)
+		basic_machine=ns32k-pc532
+		;;
+	pentium | p5 | k5 | k6 | nexgen | viac3)
+		basic_machine=i586-pc
+		;;
+	pentiumpro | p6 | 6x86 | athlon | athlon_*)
+		basic_machine=i686-pc
+		;;
+	pentiumii | pentium2 | pentiumiii | pentium3)
+		basic_machine=i686-pc
+		;;
+	pentium4)
+		basic_machine=i786-pc
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium4-*)
+		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=power-ibm
+		;;
+	ppc)	basic_machine=powerpc-unknown
+		;;
+	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppcle | powerpclittle | ppc-le | powerpc-little)
+		basic_machine=powerpcle-unknown
+		;;
+	ppcle-* | powerpclittle-*)
+		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64)	basic_machine=powerpc64-unknown
+		;;
+	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+		basic_machine=powerpc64le-unknown
+		;;
+	ppc64le-* | powerpc64little-*)
+		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	pw32)
+		basic_machine=i586-unknown
+		os=-pw32
+		;;
+	rom68k)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	rm[46]00)
+		basic_machine=mips-siemens
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	s390 | s390-*)
+		basic_machine=s390-ibm
+		;;
+	s390x | s390x-*)
+		basic_machine=s390x-ibm
+		;;
+	sa29200)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	sb1)
+		basic_machine=mipsisa64sb1-unknown
+		;;
+	sb1el)
+		basic_machine=mipsisa64sb1el-unknown
+		;;
+	sei)
+		basic_machine=mips-sei
+		os=-seiux
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sh64)
+		basic_machine=sh64-unknown
+		;;
+	sparclite-wrs | simso-wrs)
+		basic_machine=sparclite-wrs
+		os=-vxworks
+		;;
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
+		;;
+	spur)
+		basic_machine=spur-unknown
+		;;
+	st2000)
+		basic_machine=m68k-tandem
+		;;
+	stratus)
+		basic_machine=i860-stratus
+		os=-sysv4
+		;;
+	sun2)
+		basic_machine=m68000-sun
+		;;
+	sun2os3)
+		basic_machine=m68000-sun
+		os=-sunos3
+		;;
+	sun2os4)
+		basic_machine=m68000-sun
+		os=-sunos4
+		;;
+	sun3os3)
+		basic_machine=m68k-sun
+		os=-sunos3
+		;;
+	sun3os4)
+		basic_machine=m68k-sun
+		os=-sunos4
+		;;
+	sun4os3)
+		basic_machine=sparc-sun
+		os=-sunos3
+		;;
+	sun4os4)
+		basic_machine=sparc-sun
+		os=-sunos4
+		;;
+	sun4sol2)
+		basic_machine=sparc-sun
+		os=-solaris2
+		;;
+	sun3 | sun3-*)
+		basic_machine=m68k-sun
+		;;
+	sun4)
+		basic_machine=sparc-sun
+		;;
+	sun386 | sun386i | roadrunner)
+		basic_machine=i386-sun
+		;;
+	sv1)
+		basic_machine=sv1-cray
+		os=-unicos
+		;;
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
+		;;
+	t3e)
+		basic_machine=alphaev5-cray
+		os=-unicos
+		;;
+	t90)
+		basic_machine=t90-cray
+		os=-unicos
+		;;
+	tic54x | c54x*)
+		basic_machine=tic54x-unknown
+		os=-coff
+		;;
+	tic55x | c55x*)
+		basic_machine=tic55x-unknown
+		os=-coff
+		;;
+	tic6x | c6x*)
+		basic_machine=tic6x-unknown
+		os=-coff
+		;;
+	tx39)
+		basic_machine=mipstx39-unknown
+		;;
+	tx39el)
+		basic_machine=mipstx39el-unknown
+		;;
+	toad1)
+		basic_machine=pdp10-xkl
+		os=-tops20
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	tpf)
+		basic_machine=s390x-ibm
+		os=-tpf
+		;;
+	udi29k)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
+		;;
+	v810 | necv810)
+		basic_machine=v810-nec
+		os=-none
+		;;
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
+		;;
+	vms)
+		basic_machine=vax-dec
+		os=-vms
+		;;
+	vpp*|vx|vx-*)
+		basic_machine=f301-fujitsu
+		;;
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
+		;;
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
+		;;
+	vxworks29k)
+		basic_machine=a29k-wrs
+		os=-vxworks
+		;;
+	w65*)
+		basic_machine=w65-wdc
+		os=-none
+		;;
+	w89k-*)
+		basic_machine=hppa1.1-winbond
+		os=-proelf
+		;;
+	xbox)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	z8k-*-coff)
+		basic_machine=z8k-unknown
+		os=-sim
+		;;
+	none)
+		basic_machine=none-none
+		os=-none
+		;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		basic_machine=hppa1.1-winbond
+		;;
+	op50n)
+		basic_machine=hppa1.1-oki
+		;;
+	op60c)
+		basic_machine=hppa1.1-oki
+		;;
+	romp)
+		basic_machine=romp-ibm
+		;;
+	mmix)
+		basic_machine=mmix-knuth
+		;;
+	rs6000)
+		basic_machine=rs6000-ibm
+		;;
+	vax)
+		basic_machine=vax-dec
+		;;
+	pdp10)
+		# there are many clones, so DEC is not a safe bet
+		basic_machine=pdp10-unknown
+		;;
+	pdp11)
+		basic_machine=pdp11-dec
+		;;
+	we32k)
+		basic_machine=we32k-att
+		;;
+	sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
+		basic_machine=sh-unknown
+		;;
+	sparc | sparcv8 | sparcv9 | sparcv9b)
+		basic_machine=sparc-sun
+		;;
+	cydra)
+		basic_machine=cydra-cydrome
+		;;
+	orion)
+		basic_machine=orion-highlevel
+		;;
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	mac | mpw | mac-mpw)
+		basic_machine=m68k-apple
+		;;
+	pmac | pmac-mpw)
+		basic_machine=powerpc-apple
+		;;
+	*-unknown)
+		# Make sure to match an already-canonicalized machine name.
+		;;
+	*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+	*-digital*)
+		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+		;;
+	*-commodore*)
+		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+        # First match some system type aliases
+        # that might get confused with valid system types.
+	# -solaris* is a basic system type, with this one exception.
+	-solaris1 | -solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	-solaris)
+		os=-solaris2
+		;;
+	-svr4*)
+		os=-sysv4
+		;;
+	-unixware*)
+		os=-sysv4.2uw
+		;;
+	-gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+		;;
+	# First accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST END IN A *, to match a version number.
+	# -sysv* is not here because it comes later, after sysvr4.
+	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+	      | -aos* \
+	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \
+	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+	      | -chorusos* | -chorusrdb* \
+	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+	      | -skyos* | -haiku*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	-qnx*)
+		case $basic_machine in
+		    x86-* | i*86-*)
+			;;
+		    *)
+			os=-nto$os
+			;;
+		esac
+		;;
+	-nto-qnx*)
+		;;
+	-nto*)
+		os=`echo $os | sed -e 's|nto|nto-qnx|'`
+		;;
+	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+		;;
+	-mac*)
+		os=`echo $os | sed -e 's|mac|macos|'`
+		;;
+	-linux-dietlibc)
+		os=-linux-dietlibc
+		;;
+	-linux*)
+		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+		;;
+	-sunos5*)
+		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+		;;
+	-sunos6*)
+		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+		;;
+	-opened*)
+		os=-openedition
+		;;
+        -os400*)
+		os=-os400
+		;;
+	-wince*)
+		os=-wince
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-atheos*)
+		os=-atheos
+		;;
+	-syllable*)
+		os=-syllable
+		;;
+	-386bsd)
+		os=-bsd
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	-nova*)
+		os=-rtmk-nova
+		;;
+	-ns2 )
+		os=-nextstep2
+		;;
+	-nsk*)
+		os=-nsk
+		;;
+	# Preserve the version number of sinix5.
+	-sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	-sinix*)
+		os=-sysv4
+		;;
+        -tpf*)
+		os=-tpf
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-svr4)
+		os=-sysv4
+		;;
+	-svr3)
+		os=-sysv3
+		;;
+	-sysvr4)
+		os=-sysv4
+		;;
+	# This must come after -sysvr4.
+	-sysv*)
+		;;
+	-ose*)
+		os=-ose
+		;;
+	-es1800*)
+		os=-ose
+		;;
+	-xenix)
+		os=-xenix
+		;;
+	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+		os=-mint
+		;;
+	-aros*)
+		os=-aros
+		;;
+	-kaos*)
+		os=-kaos
+		;;
+	-zvmoe)
+		os=-zvmoe
+		;;
+	-none)
+		;;
+	*)
+		# Get rid of the `-' at the beginning of $os.
+		os=`echo $os | sed 's/[^-]*-//'`
+		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+		exit 1
+		;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+	*-acorn)
+		os=-riscix1.2
+		;;
+	arm*-rebel)
+		os=-linux
+		;;
+	arm*-semi)
+		os=-aout
+		;;
+    c4x-* | tic4x-*)
+        os=-coff
+        ;;
+	# This must come before the *-dec entry.
+	pdp10-*)
+		os=-tops20
+		;;
+	pdp11-*)
+		os=-none
+		;;
+	*-dec | vax-*)
+		os=-ultrix4.2
+		;;
+	m68*-apollo)
+		os=-domain
+		;;
+	i386-sun)
+		os=-sunos4.0.2
+		;;
+	m68000-sun)
+		os=-sunos3
+		# This also exists in the configure program, but was not the
+		# default.
+		# os=-sunos4
+		;;
+	m68*-cisco)
+		os=-aout
+		;;
+	mips*-cisco)
+		os=-elf
+		;;
+	mips*-*)
+		os=-elf
+		;;
+	or32-*)
+		os=-coff
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	*-be)
+		os=-beos
+		;;
+	*-haiku)
+		os=-haiku
+		;;
+	*-ibm)
+		os=-aix
+		;;
+    	*-knuth)
+		os=-mmixware
+		;;
+	*-wec)
+		os=-proelf
+		;;
+	*-winbond)
+		os=-proelf
+		;;
+	*-oki)
+		os=-proelf
+		;;
+	*-hp)
+		os=-hpux
+		;;
+	*-hitachi)
+		os=-hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=-sysv
+		;;
+	*-cbm)
+		os=-amigaos
+		;;
+	*-dg)
+		os=-dgux
+		;;
+	*-dolphin)
+		os=-sysv3
+		;;
+	m68k-ccur)
+		os=-rtu
+		;;
+	m88k-omron*)
+		os=-luna
+		;;
+	*-next )
+		os=-nextstep
+		;;
+	*-sequent)
+		os=-ptx
+		;;
+	*-crds)
+		os=-unos
+		;;
+	*-ns)
+		os=-genix
+		;;
+	i370-*)
+		os=-mvs
+		;;
+	*-next)
+		os=-nextstep3
+		;;
+	*-gould)
+		os=-sysv
+		;;
+	*-highlevel)
+		os=-bsd
+		;;
+	*-encore)
+		os=-bsd
+		;;
+	*-sgi)
+		os=-irix
+		;;
+	*-siemens)
+		os=-sysv4
+		;;
+	*-masscomp)
+		os=-rtu
+		;;
+	f30[01]-fujitsu | f700-fujitsu)
+		os=-uxpv
+		;;
+	*-rom68k)
+		os=-coff
+		;;
+	*-*bug)
+		os=-coff
+		;;
+	*-apple)
+		os=-macos
+		;;
+	*-atari*)
+		os=-mint
+		;;
+	*)
+		os=-none
+		;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+	*-unknown)
+		case $os in
+			-riscix*)
+				vendor=acorn
+				;;
+			-sunos*)
+				vendor=sun
+				;;
+			-aix*)
+				vendor=ibm
+				;;
+			-beos*)
+				vendor=be
+				;;
+			-hpux*)
+				vendor=hp
+				;;
+			-mpeix*)
+				vendor=hp
+				;;
+			-hiux*)
+				vendor=hitachi
+				;;
+			-unos*)
+				vendor=crds
+				;;
+			-dgux*)
+				vendor=dg
+				;;
+			-luna*)
+				vendor=omron
+				;;
+			-genix*)
+				vendor=ns
+				;;
+			-mvs* | -opened*)
+				vendor=ibm
+				;;
+			-os400*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+			-tpf*)
+				vendor=ibm
+				;;
+			-vxsim* | -vxworks* | -windiss*)
+				vendor=wrs
+				;;
+			-aux*)
+				vendor=apple
+				;;
+			-hms*)
+				vendor=hitachi
+				;;
+			-mpw* | -macos*)
+				vendor=apple
+				;;
+			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+				vendor=atari
+				;;
+			-vos*)
+				vendor=stratus
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbset-src/configure
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbset-src/configure	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbset-src/configure	(revision 24799)
@@ -0,0 +1,5003 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.59 for tdbset 1.0.
+#
+# Report bugs to <jmt12@cs.waikato.ac.nz>.
+#
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)$' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\/\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  case $0 in
+    *[\\/]* ) as_myself=$0 ;;
+    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+       ;;
+  esac
+  # We did not find ourselves, most probably we were run as `sh COMMAND'
+  # in which case we are not to be found in the path.
+  if test "x$as_myself" = x; then
+    as_myself=$0
+  fi
+  if test ! -f "$as_myself"; then
+    { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+	 case $as_dir in
+	 /*)
+	   if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+	     CONFIG_SHELL=$as_dir/$as_base
+	     export CONFIG_SHELL
+	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+	   fi;;
+	 esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='	' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" 	$as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_config_libobj_dir=.
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete.  It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: ${ac_max_here_lines=38}
+
+# Identity of this package.
+PACKAGE_NAME='tdbset'
+PACKAGE_TARNAME='tdbset'
+PACKAGE_VERSION='1.0'
+PACKAGE_STRING='tdbset 1.0'
+PACKAGE_BUGREPORT='jmt12@cs.waikato.ac.nz'
+
+ac_unique_file="tdbset.cpp"
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar build build_cpu build_vendor build_os host host_cpu host_vendor host_os CXX CXXFLAGS LDFLAGS CPPFLAGS ac_ct_CXX EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CC CFLAGS ac_ct_CC CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CPP LIBOBJS LTLIBOBJS'
+ac_subst_files=''
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+ac_prev=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval "$ac_prev=\$ac_option"
+    ac_prev=
+    continue
+  fi
+
+  ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_option in
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+  | --da=*)
+    datadir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    eval "enable_$ac_feature=no" ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    case $ac_option in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "enable_$ac_feature='$ac_optarg'" ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst \
+  | --locals | --local | --loca | --loc | --lo)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    case $ac_option in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "with_$ac_package='$ac_optarg'" ;;
+
+  -without-* | --without-*)
+    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/-/_/g'`
+    eval "with_$ac_package=no" ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+    eval "$ac_envvar='$ac_optarg'"
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  { echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+  eval ac_val=$`echo $ac_var`
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
+	      localstatedir libdir includedir oldincludedir infodir mandir
+do
+  eval ac_val=$`echo $ac_var`
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* ) ;;
+    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then its parent.
+  ac_confdir=`(dirname "$0") 2>/dev/null ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$0" : 'X\(//\)[^/]' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$0" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r $srcdir/$ac_unique_file; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+  if test "$ac_srcdir_defaulted" = yes; then
+    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+   { (exit 1); exit 1; }; }
+  else
+    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+   { (exit 1); exit 1; }; }
+  fi
+fi
+(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
+  { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
+   { (exit 1); exit 1; }; }
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_CXX_set=${CXX+set}
+ac_env_CXX_value=$CXX
+ac_cv_env_CXX_set=${CXX+set}
+ac_cv_env_CXX_value=$CXX
+ac_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_env_CXXFLAGS_value=$CXXFLAGS
+ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_cv_env_CXXFLAGS_value=$CXXFLAGS
+ac_env_LDFLAGS_set=${LDFLAGS+set}
+ac_env_LDFLAGS_value=$LDFLAGS
+ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
+ac_cv_env_LDFLAGS_value=$LDFLAGS
+ac_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_env_CPPFLAGS_value=$CPPFLAGS
+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_cv_env_CPPFLAGS_value=$CPPFLAGS
+ac_env_CC_set=${CC+set}
+ac_env_CC_value=$CC
+ac_cv_env_CC_set=${CC+set}
+ac_cv_env_CC_value=$CC
+ac_env_CFLAGS_set=${CFLAGS+set}
+ac_env_CFLAGS_value=$CFLAGS
+ac_cv_env_CFLAGS_set=${CFLAGS+set}
+ac_cv_env_CFLAGS_value=$CFLAGS
+ac_env_CPP_set=${CPP+set}
+ac_env_CPP_value=$CPP
+ac_cv_env_CPP_set=${CPP+set}
+ac_cv_env_CPP_value=$CPP
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures tdbset 1.0 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+_ACEOF
+
+  cat <<_ACEOF
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+			  [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+			  [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR           user executables [EPREFIX/bin]
+  --sbindir=DIR          system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR       program executables [EPREFIX/libexec]
+  --datadir=DIR          read-only architecture-independent data [PREFIX/share]
+  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
+  --libdir=DIR           object code libraries [EPREFIX/lib]
+  --includedir=DIR       C header files [PREFIX/include]
+  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
+  --infodir=DIR          info documentation [PREFIX/info]
+  --mandir=DIR           man documentation [PREFIX/man]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of tdbset 1.0:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors
+
+Some influential environment variables:
+  CXX         C++ compiler command
+  CXXFLAGS    C++ compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have
+              headers in a nonstandard directory <include dir>
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  CPP         C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <jmt12@cs.waikato.ac.nz>.
+_ACEOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  ac_popdir=`pwd`
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d $ac_dir || continue
+    ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
+
+    cd $ac_dir
+    # Check for guested configure; otherwise get Cygnus style configure.
+    if test -f $ac_srcdir/configure.gnu; then
+      echo
+      $SHELL $ac_srcdir/configure.gnu  --help=recursive
+    elif test -f $ac_srcdir/configure; then
+      echo
+      $SHELL $ac_srcdir/configure  --help=recursive
+    elif test -f $ac_srcdir/configure.ac ||
+	   test -f $ac_srcdir/configure.in; then
+      echo
+      $ac_configure --help
+    else
+      echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi
+    cd $ac_popdir
+  done
+fi
+
+test -n "$ac_init_help" && exit 0
+if $ac_init_version; then
+  cat <<\_ACEOF
+tdbset configure 1.0
+generated by GNU Autoconf 2.59
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit 0
+fi
+exec 5>config.log
+cat >&5 <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by tdbset $as_me 1.0, which was
+generated by GNU Autoconf 2.59.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo               = `(hostinfo) 2>/dev/null               || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  echo "PATH: $as_dir"
+done
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_sep=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+      ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+    2)
+      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+	ac_must_keep_next=false # Got value, back to normal.
+      else
+	case $ac_arg in
+	  *=* | --config-cache | -C | -disable-* | --disable-* \
+	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+	  | -with-* | --with-* | -without-* | --without-* | --x)
+	    case "$ac_configure_args0 " in
+	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+	    esac
+	    ;;
+	  -* ) ac_must_keep_next=true ;;
+	esac
+      fi
+      ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+      # Get rid of the leading space.
+      ac_sep=" "
+      ;;
+    esac
+  done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Be sure not to use single quotes in there, as some shells,
+# such as our DU 5.0 friend, will then `close' the trap.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+{
+  (set) 2>&1 |
+    case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      sed -n \
+	"s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+      ;;
+    *)
+      sed -n \
+	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+}
+    echo
+
+    cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=$`echo $ac_var`
+      echo "$ac_var='"'"'$ac_val'"'"'"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      cat <<\_ASBOX
+## ------------- ##
+## Output files. ##
+## ------------- ##
+_ASBOX
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=$`echo $ac_var`
+	echo "$ac_var='"'"'$ac_val'"'"'"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+      echo
+      sed "/^$/d" confdefs.h | sort
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      echo "$as_me: caught signal $ac_signal"
+    echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core &&
+  rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+     ' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+  if test "x$prefix" != xNONE; then
+    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+  else
+    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+  fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+  if test -r "$ac_site_file"; then
+    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . $cache_file;;
+      *)                      . ./$cache_file;;
+    esac
+  fi
+else
+  { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+	       sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+  eval ac_new_val="\$ac_env_${ac_var}_value"
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+	{ echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	{ echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
+echo "$as_me:   former value:  $ac_old_val" >&2;}
+	{ echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
+echo "$as_me:   current value: $ac_new_val" >&2;}
+	ac_cache_corrupted=:
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+      ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+am__api_version="1.9"
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+  if test -f $ac_dir/install-sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f $ac_dir/install.sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f $ac_dir/shtool; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
+echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"
+ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+  ./ | .// | /cC/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+	if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	    break 3
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+done
+
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  We don't cache a
+    # path for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the path is relative.
+    INSTALL=$ac_install_sh
+  fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$*" != "X $srcdir/configure conftest.file" \
+      && test "$*" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      { { echo "$as_me:$LINENO: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" >&5
+echo "$as_me: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" >&2;}
+   { (exit 1); exit 1; }; }
+   fi
+
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   { { echo "$as_me:$LINENO: error: newly created file is older than distributed files!
+Check your system clock" >&5
+echo "$as_me: error: newly created file is older than distributed files!
+Check your system clock" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+test "$program_prefix" != NONE &&
+  program_transform_name="s,^,$program_prefix,;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s,\$,$program_suffix,;$program_transform_name"
+# Double any \ or $.  echo might interpret backslashes.
+# By default was `s,x,x', remove it if useless.
+cat <<\_ACEOF >conftest.sed
+s/[\\$]/&&/g;s/;s,x,x,$//
+_ACEOF
+program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
+rm conftest.sed
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+  # We used to keeping the `.' as first argument, in order to
+  # allow $(mkdir_p) to be used without argument.  As in
+  #   $(mkdir_p) $(somedir)
+  # where $(somedir) is conditionally defined.  However this is wrong
+  # for two reasons:
+  #  1. if the package is installed by a user who cannot write `.'
+  #     make install will fail,
+  #  2. the above comment should most certainly read
+  #     $(mkdir_p) $(DESTDIR)$(somedir)
+  #     so it does not work when $(somedir) is undefined and
+  #     $(DESTDIR) is not.
+  #  To support the latter case, we have to write
+  #     test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+  #  so the `.' trick is pointless.
+  mkdir_p='mkdir -p --'
+else
+  # On NextStep and OpenStep, the `mkdir' command does not
+  # recognize any option.  It will interpret all options as
+  # directories to create, and then abort because `.' already
+  # exists.
+  for d in ./-p ./--version;
+  do
+    test -d $d && rmdir $d
+  done
+  # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+  if test -f "$ac_aux_dir/mkinstalldirs"; then
+    mkdir_p='$(mkinstalldirs)'
+  else
+    mkdir_p='$(install_sh) -d'
+  fi
+fi
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AWK+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AWK="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  echo "$as_me:$LINENO: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$AWK" && break
+done
+
+echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.make <<\_ACEOF
+all:
+	@echo 'ac_maketemp="$(MAKE)"'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+  eval ac_cv_prog_make_${ac_make}_set=yes
+else
+  eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftest.make
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+  SET_MAKE=
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+   test -f $srcdir/config.status; then
+  { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
+echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='tdbset'
+ VERSION='1.0'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_STRIP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  STRIP=$ac_ct_STRIP
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+# Make sure we can run config.sub.
+$ac_config_sub sun4 >/dev/null 2>&1 ||
+  { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5
+echo "$as_me: error: cannot run $ac_config_sub" >&2;}
+   { (exit 1); exit 1; }; }
+
+echo "$as_me:$LINENO: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6
+if test "${ac_cv_build+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_build_alias=$build_alias
+test -z "$ac_cv_build_alias" &&
+  ac_cv_build_alias=`$ac_config_guess`
+test -z "$ac_cv_build_alias" &&
+  { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
+echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+   { (exit 1); exit 1; }; }
+ac_cv_build=`$ac_config_sub $ac_cv_build_alias` ||
+  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6
+build=$ac_cv_build
+build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+echo "$as_me:$LINENO: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6
+if test "${ac_cv_host+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_host_alias=$host_alias
+test -z "$ac_cv_host_alias" &&
+  ac_cv_host_alias=$ac_cv_build_alias
+ac_cv_host=`$ac_config_sub $ac_cv_host_alias` ||
+  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6
+host=$ac_cv_host
+host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+
+          ac_config_headers="$ac_config_headers config.h"
+
+
+# Checks for programs.
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  echo "$as_me:$LINENO: result: $CXX" >&5
+echo "${ECHO_T}$CXX" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$CXX" && break
+  done
+fi
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CXX="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5
+echo "${ECHO_T}$ac_ct_CXX" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_CXX" && break
+done
+test -n "$ac_ct_CXX" || ac_ct_CXX="g++"
+
+  CXX=$ac_ct_CXX
+fi
+
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+     "checking for C++ compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+  (eval $ac_compiler --version </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+  (eval $ac_compiler -v </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+  (eval $ac_compiler -V </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+echo "$as_me:$LINENO: checking for C++ compiler default output file name" >&5
+echo $ECHO_N "checking for C++ compiler default output file name... $ECHO_C" >&6
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
+  (eval $ac_link_default) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # Find the output, starting from the most likely.  This scheme is
+# not robust to junk in `.', hence go to wildcards (a.*) only as a last
+# resort.
+
+# Be careful to initialize this variable, since it used to be cached.
+# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
+ac_cv_exeext=
+# b.out is created by i960 compilers.
+for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
+	;;
+    conftest.$ac_ext )
+	# This is the source file.
+	;;
+    [ab].out )
+	# We found the default executable, but exeext='' is most
+	# certainly right.
+	break;;
+    *.* )
+	ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	# FIXME: I believe we export ac_cv_exeext for Libtool,
+	# but it would be cool to find out if it's true.  Does anybody
+	# maintain Libtool? --akim.
+	export ac_cv_exeext
+	break;;
+    * )
+	break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C++ compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C++ compiler cannot create executables
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6
+
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether the C++ compiler works" >&5
+echo $ECHO_N "checking whether the C++ compiler works... $ECHO_C" >&6
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+  if { ac_try='./$ac_file'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { echo "$as_me:$LINENO: error: cannot run C++ compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C++ compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+  fi
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6
+
+echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	  export ac_cv_exeext
+	  break;;
+    * ) break;;
+  esac
+done
+else
+  { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
+if test "${ac_cv_objext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6
+if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6
+GXX=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+CXXFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5
+echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cxx_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cxx_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cxx_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
+  else
+    CXXFLAGS="-g"
+  fi
+else
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
+  else
+    CXXFLAGS=
+  fi
+fi
+for ac_declaration in \
+   '' \
+   'extern "C" void std::exit (int) throw (); using std::exit;' \
+   'extern "C" void std::exit (int); using std::exit;' \
+   'extern "C" void exit (int) throw ();' \
+   'extern "C" void exit (int);' \
+   'void exit (int);'
+do
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+  echo '#ifdef __cplusplus' >>confdefs.h
+  echo $ac_declaration      >>confdefs.h
+  echo '#endif'             >>confdefs.h
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+DEPDIR="${am__leading_dot}deps"
+
+          ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
+echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+   am__include=include
+   am__quote=
+   _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+      am__include=.include
+      am__quote="\""
+      _am_result=BSD
+   fi
+fi
+
+
+echo "$as_me:$LINENO: result: $_am_result" >&5
+echo "${ECHO_T}$_am_result" >&6
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then
+  enableval="$enable_dependency_tracking"
+
+fi;
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+
+
+if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+
+
+depcc="$CXX"  am_compiler_list=
+
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CXX_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CXX_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+
+
+if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+  am__fastdepCXX_TRUE=
+  am__fastdepCXX_FALSE='#'
+else
+  am__fastdepCXX_TRUE='#'
+  am__fastdepCXX_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_CC" && break
+done
+
+  CC=$ac_ct_CC
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+     "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+  (eval $ac_compiler --version </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+  (eval $ac_compiler -v </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+  (eval $ac_compiler -V </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cc_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std1 is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std1.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX			-qlanglvl=ansi
+# Ultrix and OSF/1	-std1
+# HP-UX 10.20 and later	-Ae
+# HP-UX older versions	-Aa -D_HPUX_SOURCE
+# SVR4			-Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext
+done
+rm -f conftest.$ac_ext conftest.$ac_objext
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+  x|xno)
+    echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+  *)
+    echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+    CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+# Some people use a C++ compiler to compile C.  Since we use `exit',
+# in C++ we need to declare it.  In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >conftest.$ac_ext <<_ACEOF
+#ifndef __cplusplus
+  choke me
+#endif
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  for ac_declaration in \
+   '' \
+   'extern "C" void std::exit (int) throw (); using std::exit;' \
+   'extern "C" void std::exit (int); using std::exit;' \
+   'extern "C" void exit (int) throw ();' \
+   'extern "C" void exit (int);' \
+   'void exit (int);'
+do
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+  echo '#ifdef __cplusplus' >>confdefs.h
+  echo $ac_declaration      >>confdefs.h
+  echo '#endif'             >>confdefs.h
+fi
+
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CC"   am_compiler_list=
+
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+
+
+if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if test "${ac_cv_prog_CPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
+else
+  { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Checks for libraries.
+
+# Checks for header files.
+
+# Checks for typedefs, structures, and compiler characteristics.
+
+# Checks for library functions.
+
+# Completion
+          ac_config_files="$ac_config_files Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+{
+  (set) 2>&1 |
+    case `(ac_space=' '; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+	"s/'/'\\\\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;;
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n \
+	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+} |
+  sed '
+     t clear
+     : clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     : end' >>confcache
+if diff $cache_file confcache >/dev/null 2>&1; then :; else
+  if test -w $cache_file; then
+    test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+    cat confcache >$cache_file
+  else
+    echo "not updating unwritable cache $cache_file"
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[	 ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[	 ]*$//;
+}'
+fi
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_i=`echo "$ac_i" |
+	 sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
+  # 2. Add them.
+  ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)$' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\/\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  case $0 in
+    *[\\/]* ) as_myself=$0 ;;
+    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+       ;;
+  esac
+  # We did not find ourselves, most probably we were run as `sh COMMAND'
+  # in which case we are not to be found in the path.
+  if test "x$as_myself" = x; then
+    as_myself=$0
+  fi
+  if test ! -f "$as_myself"; then
+    { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+	 case $as_dir in
+	 /*)
+	   if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+	     CONFIG_SHELL=$as_dir/$as_base
+	     export CONFIG_SHELL
+	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+	   fi;;
+	 esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='	' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" 	$as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.  Logging --version etc. is OK.
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by tdbset $as_me 1.0, which was
+generated by GNU Autoconf 2.59.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+  echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_headers"; then
+  echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_links"; then
+  echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_commands"; then
+  echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number, then exit
+  -q, --quiet      do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+		   instantiate the configuration file FILE
+  --header=FILE[:TEMPLATE]
+		   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <bug-autoconf@gnu.org>."
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+tdbset config.status 1.0
+configured by $0, generated by GNU Autoconf 2.59,
+  with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=$srcdir
+INSTALL="$INSTALL"
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "x$1" : 'x\([^=]*\)='`
+    ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  -*)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  *) # This is not an option, so the user has probably given explicit
+     # arguments.
+     ac_option=$1
+     ac_need_defaults=false;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --vers* | -V )
+    echo "$ac_cs_version"; exit 0 ;;
+  --he | --h)
+    # Conflict between --help and --header
+    { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; };;
+  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit 0 ;;
+  --debug | --d* | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+    ac_need_defaults=false;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1" ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+  echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+  exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+#
+# INIT-COMMANDS section.
+#
+
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+_ACEOF
+
+
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_config_target in $ac_config_targets
+do
+  case "$ac_config_target" in
+  # Handling of arguments.
+  "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+  "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+  "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason to put it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./confstat$$-$RANDOM
+  (umask 077 && mkdir $tmp)
+} ||
+{
+   echo "$me: cannot create a temporary directory in ." >&2
+   { (exit 1); exit 1; }
+}
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+  # Protect against being on the right side of a sed subst in config.status.
+  sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+   s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
+s,@SHELL@,$SHELL,;t t
+s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s,@exec_prefix@,$exec_prefix,;t t
+s,@prefix@,$prefix,;t t
+s,@program_transform_name@,$program_transform_name,;t t
+s,@bindir@,$bindir,;t t
+s,@sbindir@,$sbindir,;t t
+s,@libexecdir@,$libexecdir,;t t
+s,@datadir@,$datadir,;t t
+s,@sysconfdir@,$sysconfdir,;t t
+s,@sharedstatedir@,$sharedstatedir,;t t
+s,@localstatedir@,$localstatedir,;t t
+s,@libdir@,$libdir,;t t
+s,@includedir@,$includedir,;t t
+s,@oldincludedir@,$oldincludedir,;t t
+s,@infodir@,$infodir,;t t
+s,@mandir@,$mandir,;t t
+s,@build_alias@,$build_alias,;t t
+s,@host_alias@,$host_alias,;t t
+s,@target_alias@,$target_alias,;t t
+s,@DEFS@,$DEFS,;t t
+s,@ECHO_C@,$ECHO_C,;t t
+s,@ECHO_N@,$ECHO_N,;t t
+s,@ECHO_T@,$ECHO_T,;t t
+s,@LIBS@,$LIBS,;t t
+s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
+s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
+s,@INSTALL_DATA@,$INSTALL_DATA,;t t
+s,@CYGPATH_W@,$CYGPATH_W,;t t
+s,@PACKAGE@,$PACKAGE,;t t
+s,@VERSION@,$VERSION,;t t
+s,@ACLOCAL@,$ACLOCAL,;t t
+s,@AUTOCONF@,$AUTOCONF,;t t
+s,@AUTOMAKE@,$AUTOMAKE,;t t
+s,@AUTOHEADER@,$AUTOHEADER,;t t
+s,@MAKEINFO@,$MAKEINFO,;t t
+s,@install_sh@,$install_sh,;t t
+s,@STRIP@,$STRIP,;t t
+s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t
+s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t
+s,@mkdir_p@,$mkdir_p,;t t
+s,@AWK@,$AWK,;t t
+s,@SET_MAKE@,$SET_MAKE,;t t
+s,@am__leading_dot@,$am__leading_dot,;t t
+s,@AMTAR@,$AMTAR,;t t
+s,@am__tar@,$am__tar,;t t
+s,@am__untar@,$am__untar,;t t
+s,@build@,$build,;t t
+s,@build_cpu@,$build_cpu,;t t
+s,@build_vendor@,$build_vendor,;t t
+s,@build_os@,$build_os,;t t
+s,@host@,$host,;t t
+s,@host_cpu@,$host_cpu,;t t
+s,@host_vendor@,$host_vendor,;t t
+s,@host_os@,$host_os,;t t
+s,@CXX@,$CXX,;t t
+s,@CXXFLAGS@,$CXXFLAGS,;t t
+s,@LDFLAGS@,$LDFLAGS,;t t
+s,@CPPFLAGS@,$CPPFLAGS,;t t
+s,@ac_ct_CXX@,$ac_ct_CXX,;t t
+s,@EXEEXT@,$EXEEXT,;t t
+s,@OBJEXT@,$OBJEXT,;t t
+s,@DEPDIR@,$DEPDIR,;t t
+s,@am__include@,$am__include,;t t
+s,@am__quote@,$am__quote,;t t
+s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t
+s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t
+s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t
+s,@CXXDEPMODE@,$CXXDEPMODE,;t t
+s,@am__fastdepCXX_TRUE@,$am__fastdepCXX_TRUE,;t t
+s,@am__fastdepCXX_FALSE@,$am__fastdepCXX_FALSE,;t t
+s,@CC@,$CC,;t t
+s,@CFLAGS@,$CFLAGS,;t t
+s,@ac_ct_CC@,$ac_ct_CC,;t t
+s,@CCDEPMODE@,$CCDEPMODE,;t t
+s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t
+s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t
+s,@CPP@,$CPP,;t t
+s,@LIBOBJS@,$LIBOBJS,;t t
+s,@LTLIBOBJS@,$LTLIBOBJS,;t t
+CEOF
+
+_ACEOF
+
+  cat >>$CONFIG_STATUS <<\_ACEOF
+  # Split the substitutions into bite-sized pieces for seds with
+  # small command number limits, like on Digital OSF/1 and HP-UX.
+  ac_max_sed_lines=48
+  ac_sed_frag=1 # Number of current file.
+  ac_beg=1 # First line for current file.
+  ac_end=$ac_max_sed_lines # Line after last line for current file.
+  ac_more_lines=:
+  ac_sed_cmds=
+  while $ac_more_lines; do
+    if test $ac_beg -gt 1; then
+      sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    else
+      sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    fi
+    if test ! -s $tmp/subs.frag; then
+      ac_more_lines=false
+    else
+      # The purpose of the label and of the branching condition is to
+      # speed up the sed processing (if there are no `@' at all, there
+      # is no need to browse any of the substitutions).
+      # These are the two extra sed commands mentioned above.
+      (echo ':t
+  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+      if test -z "$ac_sed_cmds"; then
+	ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+      else
+	ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+      fi
+      ac_sed_frag=`expr $ac_sed_frag + 1`
+      ac_beg=$ac_end
+      ac_end=`expr $ac_end + $ac_max_sed_lines`
+    fi
+  done
+  if test -z "$ac_sed_cmds"; then
+    ac_sed_cmds=cat
+  fi
+fi # test -n "$CONFIG_FILES"
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case $ac_file in
+  - | *:- | *:-:* ) # input from stdin
+	cat >$tmp/stdin
+	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
+  esac
+
+  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+  ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+  ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
+
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
+  esac
+
+  if test x"$ac_file" != x-; then
+    { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    rm -f "$ac_file"
+  fi
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated by config.status.  */
+  if test x"$ac_file" = x-; then
+    configure_input=
+  else
+    configure_input="$ac_file.  "
+  fi
+  configure_input=$configure_input"Generated from `echo $ac_file_in |
+				     sed 's,.*/,,'` by configure."
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo $tmp/stdin ;;
+      [\\/$]*)
+	 # Absolute (can't be DOS-style, as IFS=:)
+	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+	 echo "$f";;
+      *) # Relative
+	 if test -f "$f"; then
+	   # Build tree
+	   echo "$f"
+	 elif test -f "$srcdir/$f"; then
+	   # Source tree
+	   echo "$srcdir/$f"
+	 else
+	   # /dev/null tree
+	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+	 fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@abs_srcdir@,$ac_abs_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s,@builddir@,$ac_builddir,;t t
+s,@abs_builddir@,$ac_abs_builddir,;t t
+s,@top_builddir@,$ac_top_builddir,;t t
+s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
+s,@INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+  rm -f $tmp/stdin
+  if test x"$ac_file" != x-; then
+    mv $tmp/out $ac_file
+  else
+    cat $tmp/out
+    rm -f $tmp/out
+  fi
+
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_HEADER section.
+#
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s,^\([	 ]*\)#\([	 ]*define[	 ][	 ]*\)'
+ac_dB='[	 ].*$,\1#\2'
+ac_dC=' '
+ac_dD=',;t'
+# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_uA='s,^\([	 ]*\)#\([	 ]*\)undef\([	 ][	 ]*\)'
+ac_uB='$,\1#\2define\3'
+ac_uC=' '
+ac_uD=',;t'
+
+for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case $ac_file in
+  - | *:- | *:-:* ) # input from stdin
+	cat >$tmp/stdin
+	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
+  esac
+
+  test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo $tmp/stdin ;;
+      [\\/$]*)
+	 # Absolute (can't be DOS-style, as IFS=:)
+	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+	 # Do quote $f, to prevent DOS paths from being IFS'd.
+	 echo "$f";;
+      *) # Relative
+	 if test -f "$f"; then
+	   # Build tree
+	   echo "$f"
+	 elif test -f "$srcdir/$f"; then
+	   # Source tree
+	   echo "$srcdir/$f"
+	 else
+	   # /dev/null tree
+	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+	 fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+  # Remove the trailing spaces.
+  sed 's/[	 ]*$//' $ac_file_inputs >$tmp/in
+
+_ACEOF
+
+# Transform confdefs.h into two sed scripts, `conftest.defines' and
+# `conftest.undefs', that substitutes the proper values into
+# config.h.in to produce config.h.  The first handles `#define'
+# templates, and the second `#undef' templates.
+# And first: Protect against being on the right side of a sed subst in
+# config.status.  Protect against being in an unquoted here document
+# in config.status.
+rm -f conftest.defines conftest.undefs
+# Using a here document instead of a string reduces the quoting nightmare.
+# Putting comments in sed scripts is not portable.
+#
+# `end' is used to avoid that the second main sed command (meant for
+# 0-ary CPP macros) applies to n-ary macro definitions.
+# See the Autoconf documentation for `clear'.
+cat >confdef2sed.sed <<\_ACEOF
+s/[\\&,]/\\&/g
+s,[\\$`],\\&,g
+t clear
+: clear
+s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 (][^	 (]*\)\(([^)]*)\)[	 ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
+t end
+s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 ][^	 ]*\)[	 ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
+: end
+_ACEOF
+# If some macros were called several times there might be several times
+# the same #defines, which is useless.  Nevertheless, we may not want to
+# sort them, since we want the *last* AC-DEFINE to be honored.
+uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
+sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
+rm -f confdef2sed.sed
+
+# This sed command replaces #undef with comments.  This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >>conftest.undefs <<\_ACEOF
+s,^[	 ]*#[	 ]*undef[	 ][	 ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
+_ACEOF
+
+# Break up conftest.defines because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo '  # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
+echo '  if grep "^[	 ]*#[	 ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
+echo '  # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
+echo '  :' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.defines >/dev/null
+do
+  # Write a limited-size here document to $tmp/defines.sed.
+  echo '  cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
+  # Speed up: don't consider the non `#define' lines.
+  echo '/^[	 ]*#[	 ]*define/!b' >>$CONFIG_STATUS
+  # Work around the forget-to-reset-the-flag bug.
+  echo 't clr' >>$CONFIG_STATUS
+  echo ': clr' >>$CONFIG_STATUS
+  sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
+  echo 'CEOF
+  sed -f $tmp/defines.sed $tmp/in >$tmp/out
+  rm -f $tmp/in
+  mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+  sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
+  rm -f conftest.defines
+  mv conftest.tail conftest.defines
+done
+rm -f conftest.defines
+echo '  fi # grep' >>$CONFIG_STATUS
+echo >>$CONFIG_STATUS
+
+# Break up conftest.undefs because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo '  # Handle all the #undef templates' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.undefs >/dev/null
+do
+  # Write a limited-size here document to $tmp/undefs.sed.
+  echo '  cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
+  # Speed up: don't consider the non `#undef'
+  echo '/^[	 ]*#[	 ]*undef/!b' >>$CONFIG_STATUS
+  # Work around the forget-to-reset-the-flag bug.
+  echo 't clr' >>$CONFIG_STATUS
+  echo ': clr' >>$CONFIG_STATUS
+  sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
+  echo 'CEOF
+  sed -f $tmp/undefs.sed $tmp/in >$tmp/out
+  rm -f $tmp/in
+  mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+  sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
+  rm -f conftest.undefs
+  mv conftest.tail conftest.undefs
+done
+rm -f conftest.undefs
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated by config.status.  */
+  if test x"$ac_file" = x-; then
+    echo "/* Generated by configure.  */" >$tmp/config.h
+  else
+    echo "/* $ac_file.  Generated by configure.  */" >$tmp/config.h
+  fi
+  cat $tmp/in >>$tmp/config.h
+  rm -f $tmp/in
+  if test x"$ac_file" != x-; then
+    if diff $ac_file $tmp/config.h >/dev/null 2>&1; then
+      { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+      { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+      rm -f $ac_file
+      mv $tmp/config.h $ac_file
+    fi
+  else
+    cat $tmp/config.h
+    rm -f $tmp/config.h
+  fi
+# Compute $ac_file's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $ac_file | $ac_file:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null ||
+$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X$ac_file : 'X\(//\)[^/]' \| \
+	 X$ac_file : 'X\(//\)$' \| \
+	 X$ac_file : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X$ac_file |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`/stamp-h$_am_stamp_count
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_COMMANDS section.
+#
+for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
+  ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
+  ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
+  ac_dir=`(dirname "$ac_dest") 2>/dev/null ||
+$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_dest" : 'X\(//\)[^/]' \| \
+	 X"$ac_dest" : 'X\(//\)$' \| \
+	 X"$ac_dest" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_dest" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+  ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
+
+
+  { echo "$as_me:$LINENO: executing $ac_dest commands" >&5
+echo "$as_me: executing $ac_dest commands" >&6;}
+  case $ac_dest in
+    depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
+  # Strip MF so we end up with the name of the file.
+  mf=`echo "$mf" | sed -e 's/:.*$//'`
+  # Check whether this is an Automake generated Makefile or not.
+  # We used to match only the files named `Makefile.in', but
+  # some people rename them; so instead we look at the file content.
+  # Grep'ing the first line is not enough: some people post-process
+  # each Makefile.in and add a new line on top of each file to say so.
+  # So let's grep whole file.
+  if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+    dirpart=`(dirname "$mf") 2>/dev/null ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$mf" : 'X\(//\)[^/]' \| \
+	 X"$mf" : 'X\(//\)$' \| \
+	 X"$mf" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  else
+    continue
+  fi
+  # Extract the definition of DEPDIR, am__include, and am__quote
+  # from the Makefile without running `make'.
+  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+  test -z "$DEPDIR" && continue
+  am__include=`sed -n 's/^am__include = //p' < "$mf"`
+  test -z "am__include" && continue
+  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+  # When using ansi2knr, U may be empty or an underscore; expand it
+  U=`sed -n 's/^U = //p' < "$mf"`
+  # Find all dependency output files, they are included files with
+  # $(DEPDIR) in their names.  We invoke sed twice because it is the
+  # simplest approach to changing $(DEPDIR) to its actual value in the
+  # expansion.
+  for file in `sed -n "
+    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+    # Make sure the directory exists.
+    test -f "$dirpart/$file" && continue
+    fdir=`(dirname "$file") 2>/dev/null ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$file" : 'X\(//\)[^/]' \| \
+	 X"$file" : 'X\(//\)$' \| \
+	 X"$file" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    { if $as_mkdir_p; then
+    mkdir -p $dirpart/$fdir
+  else
+    as_dir=$dirpart/$fdir
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5
+echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+    # echo "creating $dirpart/$file"
+    echo '# dummy' > "$dirpart/$file"
+  done
+done
+ ;;
+  esac
+done
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || { (exit 1); exit 1; }
+fi
+
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbset-src/configure.ac
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbset-src/configure.ac	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbset-src/configure.ac	(revision 24799)
@@ -0,0 +1,25 @@
+#                                               -*- Autoconf -*-
+# Process this file with autoconf to produce a configure script.
+
+AC_PREREQ(2.59)
+AC_INIT([tdbset], [1.0], [jmt12@cs.waikato.ac.nz])
+AM_INIT_AUTOMAKE
+AC_CANONICAL_HOST
+AC_CONFIG_SRCDIR([tdbset.cpp])
+AC_CONFIG_HEADER([config.h])
+
+# Checks for programs.
+AC_PROG_CXX
+AC_PROG_CPP
+
+# Checks for libraries.
+
+# Checks for header files.
+
+# Checks for typedefs, structures, and compiler characteristics.
+
+# Checks for library functions.
+
+# Completion
+AC_CONFIG_FILES([Makefile])
+AC_OUTPUT
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbset-src/install-sh
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbset-src/install-sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbset-src/install-sh	(revision 24799)
@@ -0,0 +1,323 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2005-05-14.22
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.  It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+chmodcmd="$chmodprog 0755"
+chowncmd=
+chgrpcmd=
+stripcmd=
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=
+dst=
+dir_arg=
+dstarg=
+no_target_directory=
+
+usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+-c         (ignored)
+-d         create directories instead of installing files.
+-g GROUP   $chgrpprog installed files to GROUP.
+-m MODE    $chmodprog installed files to MODE.
+-o USER    $chownprog installed files to USER.
+-s         $stripprog installed files.
+-t DIRECTORY  install into DIRECTORY.
+-T         report an error if DSTFILE is a directory.
+--help     display this help and exit.
+--version  display version info and exit.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
+"
+
+while test -n "$1"; do
+  case $1 in
+    -c) shift
+        continue;;
+
+    -d) dir_arg=true
+        shift
+        continue;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+        shift
+        shift
+        continue;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) chmodcmd="$chmodprog $2"
+        shift
+        shift
+        continue;;
+
+    -o) chowncmd="$chownprog $2"
+        shift
+        shift
+        continue;;
+
+    -s) stripcmd=$stripprog
+        shift
+        continue;;
+
+    -t) dstarg=$2
+	shift
+	shift
+	continue;;
+
+    -T) no_target_directory=true
+	shift
+	continue;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    *)  # When -d is used, all remaining arguments are directories to create.
+	# When -t is used, the destination is already specified.
+	test -n "$dir_arg$dstarg" && break
+        # Otherwise, the last argument is the destination.  Remove it from $@.
+	for arg
+	do
+          if test -n "$dstarg"; then
+	    # $@ is not empty: it contains at least $arg.
+	    set fnord "$@" "$dstarg"
+	    shift # fnord
+	  fi
+	  shift # arg
+	  dstarg=$arg
+	done
+	break;;
+  esac
+done
+
+if test -z "$1"; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call `install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+for src
+do
+  # Protect names starting with `-'.
+  case $src in
+    -*) src=./$src ;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    src=
+
+    if test -d "$dst"; then
+      mkdircmd=:
+      chmodcmd=
+    else
+      mkdircmd=$mkdirprog
+    fi
+  else
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dstarg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+
+    dst=$dstarg
+    # Protect names starting with `-'.
+    case $dst in
+      -*) dst=./$dst ;;
+    esac
+
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
+    if test -d "$dst"; then
+      if test -n "$no_target_directory"; then
+	echo "$0: $dstarg: Is a directory" >&2
+	exit 1
+      fi
+      dst=$dst/`basename "$src"`
+    fi
+  fi
+
+  # This sed command emulates the dirname command.
+  dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'`
+
+  # Make sure that the destination directory exists.
+
+  # Skip lots of stat calls in the usual case.
+  if test ! -d "$dstdir"; then
+    defaultIFS='
+	 '
+    IFS="${IFS-$defaultIFS}"
+
+    oIFS=$IFS
+    # Some sh's can't handle IFS=/ for some reason.
+    IFS='%'
+    set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
+    shift
+    IFS=$oIFS
+
+    pathcomp=
+
+    while test $# -ne 0 ; do
+      pathcomp=$pathcomp$1
+      shift
+      if test ! -d "$pathcomp"; then
+        $mkdirprog "$pathcomp"
+	# mkdir can fail with a `File exist' error in case several
+	# install-sh are creating the directory concurrently.  This
+	# is OK.
+	test -d "$pathcomp" || exit
+      fi
+      pathcomp=$pathcomp/
+    done
+  fi
+
+  if test -n "$dir_arg"; then
+    $doit $mkdircmd "$dst" \
+      && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
+      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
+      && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
+      && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
+
+  else
+    dstfile=`basename "$dst"`
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+    trap '(exit $?); exit' 1 2 13 15
+
+    # Copy the file name to the temp name.
+    $doit $cpprog "$src" "$dsttmp" &&
+
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
+      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
+      && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
+      && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
+
+    # Now rename the file to the real destination.
+    { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
+      || {
+	   # The rename failed, perhaps because mv can't rename something else
+	   # to itself, or perhaps because mv is so ancient that it does not
+	   # support -f.
+
+	   # Now remove or move aside any old file at destination location.
+	   # We try this two ways since rm can't unlink itself on some
+	   # systems and the destination file might be busy for other
+	   # reasons.  In this case, the final cleanup might fail but the new
+	   # file should still install successfully.
+	   {
+	     if test -f "$dstdir/$dstfile"; then
+	       $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
+	       || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
+	       || {
+		 echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
+		 (exit 1); exit 1
+	       }
+	     else
+	       :
+	     fi
+	   } &&
+
+	   # Now rename the file to the real destination.
+	   $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
+	 }
+    }
+  fi || { (exit 1); exit 1; }
+done
+
+# The final little trick to "correctly" pass the exit status to the exit trap.
+{
+  (exit 0); exit 0
+}
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbset-src/stamp-h1
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbset-src/stamp-h1	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbset-src/stamp-h1	(revision 24799)
@@ -0,0 +1,1 @@
+timestamp for config.h
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbset-src/tdbset.cpp
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbset-src/tdbset.cpp	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/tdbset-src/tdbset.cpp	(revision 24799)
@@ -0,0 +1,162 @@
+/**********************************************************************
+ *
+ * tdbset -- add or replace a single value from the TDB database
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *********************************************************************/
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#include <ospace\std\iostream>
+#elif defined(GSDL_USE_IOS_H)
+#include <iostream.h>
+#else
+#include <iostream>
+#endif
+
+#include <cstdlib>
+#include <cstring>
+
+#include <fcntl.h>
+#include "tdb.h"
+
+// use the standard namespace
+#if !defined (GSDL_NAMESPACE_BROKEN)
+#if defined(GSDL_USE_OBJECTSPACE)
+using namespace ospace::std;
+#else
+using namespace std;
+#endif
+#endif
+
+/**
+ */
+void
+printUsage (char *program_name)
+{
+  cerr << "usage: " << program_name << " <database_path> <key> [<value>] [append]" << endl;
+  cerr << "\t- if no value is given then the pair indicated by the key is removed" << endl;
+  cerr << "\t- if a value is given followed by 'append' then the value is " << endl;
+  cerr << "\t  added to the existing entry rather than overwriting it" << endl << endl;
+}
+/** printUsage() **/
+
+/**
+ */
+int
+main (int argc, char *argv[])
+{
+  // sanity check
+  if ((argc < 3) || (argc>5))
+  {
+    printUsage(argv[0]);
+    exit (-1);
+  }
+
+  // open the collection to the database - read write this time.
+  char *dbname = argv[1];
+  int hash_size = 0;
+  int tdb_flags = TDB_DEFAULT; // Default = 0
+  int tdb_store_flags = TDB_DEFAULT; // used later when storing
+  int open_flags = O_RDWR | O_CREAT;
+  TDB_CONTEXT *tdb = tdb_open(dbname, hash_size, tdb_flags, open_flags, 0664);
+  if (!tdb)
+  {
+    cerr << "couldn't create " << dbname << endl;
+    exit (0);
+  }
+
+  // create the object to represent the key we are altering
+  TDB_DATA key_data;
+  key_data.dsize = strlen(argv[2]);
+  key_data.dptr = (unsigned char*)argv[2];
+
+  // if there are a fistfull of arguments we may be doing a mystical append
+  if(argc > 4)
+  {
+    // if there are five arguments and the last one is append, then we
+    // concatenate the value onto whatever is already in this key
+    // value pair
+    if (strcmp(argv[4], "append") == 0)
+    {
+      // get old value, then top up
+      TDB_DATA original_value_data = tdb_fetch(tdb, key_data);
+
+      // append orig_content with argv[3]
+      TDB_DATA concat_value_data;
+      concat_value_data.dsize = original_value_data.dsize + strlen(argv[3]);
+      //  remember to leave room for \0 at end
+      char* concat_data = new char[concat_value_data.dsize + 1];
+      // if the value already has content, append to the end of it
+      if (original_value_data.dsize > 0)
+      {
+	strncpy(concat_data, (const char*)original_value_data.dptr, original_value_data.dsize);
+        // ensures \0 at end
+	strcpy(&concat_data[original_value_data.dsize], argv[3]);
+      }
+      // otherwise this is the first time key has been used
+      else
+      {
+        // ensures \0 at end
+	strcpy(concat_data, argv[3]);
+      }
+      concat_value_data.dptr = (unsigned char*)concat_data;
+
+      if(tdb_store(tdb, key_data, concat_value_data, tdb_store_flags) != 0)
+      {
+        cerr << "failed to set [" << argv[2] << "] to '" << concat_data << "'" << endl;
+      }
+
+      // I'm responsible for freeing some memory
+      delete [] concat_data;
+      free(original_value_data.dptr);
+    }
+    // five arguments but the last isn't append. No sir, I don't like it
+    else
+    {
+      printUsage(argv[0]);
+    }
+  }
+  // normal case - we've been given a key and a value to update it with
+  else if (argc == 4)
+  {
+    TDB_DATA value_data;
+    value_data.dsize = strlen(argv[3]);
+    value_data.dptr = (unsigned char*)argv[3];
+
+    if(tdb_store(tdb, key_data, value_data, tdb_store_flags) != 0)
+    {
+      cerr << "failed to set [" << argv[2] << "] to '" << argv[3] << "'" << endl;
+    }
+  }
+  // only given a key? that's a deleting
+  else
+  {
+    if(tdb_delete(tdb, key_data) != 0)
+    {
+      cerr << "failed to remove [" << argv[2] << "]" << endl;
+    }
+  }
+
+  tdb_close(tdb);
+
+  return 0;
+}
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/txt2tdb-src/.svnignore
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/txt2tdb-src/.svnignore	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/txt2tdb-src/.svnignore	(revision 24799)
@@ -0,0 +1,6 @@
+Makefile
+config.h
+config.log
+config.status
+stamp-h1
+txt2tdb
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/txt2tdb-src/Makefile.in
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/txt2tdb-src/Makefile.in	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/txt2tdb-src/Makefile.in	(revision 24799)
@@ -0,0 +1,80 @@
+###########################################################################
+#
+# Makefile -- common-src/src/gdbmedit/txt2db
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999-2008  The New Zealand Digital Library Project
+#
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+GSDL_DIR = ../../../..
+COMMON_DIR = $(GSDL_DIR)/common-src
+
+COMMON_PACKAGES_DIR = $(COMMON_DIR)/packages
+
+CXX = @CXX@
+CXXFLAGS = @CXXFLAGS@
+DEFS = @DEFS@ $(GDBM_DEFINES) $(JDBM_DEFINES) $(SQLITE_DEFINES)
+INCLUDES = -I$(COMMON_DIR)/src/lib -I${GEXTTDBEDIT_INSTALLED}/include
+INSTALL = @INSTALL@
+LDFLAGS = @LDFLAGS@ -L${GEXTTDBEDIT_INSTALLED}/lib
+LIBS = @LIBS@ -ltdb ${GSDLHOME}/common-src/src/lib/gsdllib.a
+
+
+CXXCOMPILE = $(CXX) -c $(CXXFLAGS) $(DEFS) $(INCLUDES)
+CXXLINK = $(CXX) $(LDFLAGS) -o $@
+
+
+.SUFFIXES:
+.SUFFIXES: .cpp .o
+.cpp.o:
+	$(CXXCOMPILE) $< 
+
+
+SOURCES = \
+	txt2tdb.cpp
+
+OBJECTS = \
+	txt2tdb.o
+
+EXECUTABLE_OBJECTS = \
+	$(OBJECTS)
+
+EXECUTABLE = txt2tdb
+
+
+# Default target: make the txt2tdb executable
+all: $(EXECUTABLE)
+
+txt2tdb: $(EXECUTABLE_OBJECTS)
+	$(CXXLINK) $(EXECUTABLE_OBJECTS) $(LIBS)
+
+install: $(EXECUTABLE)
+	$(INSTALL) -d ${GEXTTDBEDIT_INSTALLED}/bin
+	$(INSTALL) -m 755 -s $(EXECUTABLE) ${GEXTTDBEDIT_INSTALLED}/bin
+
+clean:
+	rm -f $(OBJECTS) $(EXECUTABLE)
+
+distclean:
+	rm -f $(OBJECTS) $(EXECUTABLE) Makefile
+
+depend:
+	makedepend -Y -- $(DEFS) $(INCLUDES) $(CXXFLAGS) -- $(SOURCES)
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/txt2tdb-src/aclocal.m4
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/txt2tdb-src/aclocal.m4	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/txt2tdb-src/aclocal.m4	(revision 24799)
@@ -0,0 +1,850 @@
+# generated automatically by aclocal 1.9.6 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005  Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# Copyright (C) 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION so it can be traced.
+# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+	 [AM_AUTOMAKE_VERSION([1.9.6])])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 7
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])
+AC_SUBST([$1_FALSE])
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 8
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
+       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
+       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                   [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 3
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[for mf in $CONFIG_FILES; do
+  # Strip MF so we end up with the name of the file.
+  mf=`echo "$mf" | sed -e 's/:.*$//'`
+  # Check whether this is an Automake generated Makefile or not.
+  # We used to match only the files named `Makefile.in', but
+  # some people rename them; so instead we look at the file content.
+  # Grep'ing the first line is not enough: some people post-process
+  # each Makefile.in and add a new line on top of each file to say so.
+  # So let's grep whole file.
+  if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+    dirpart=`AS_DIRNAME("$mf")`
+  else
+    continue
+  fi
+  # Extract the definition of DEPDIR, am__include, and am__quote
+  # from the Makefile without running `make'.
+  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+  test -z "$DEPDIR" && continue
+  am__include=`sed -n 's/^am__include = //p' < "$mf"`
+  test -z "am__include" && continue
+  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+  # When using ansi2knr, U may be empty or an underscore; expand it
+  U=`sed -n 's/^U = //p' < "$mf"`
+  # Find all dependency output files, they are included files with
+  # $(DEPDIR) in their names.  We invoke sed twice because it is the
+  # simplest approach to changing $(DEPDIR) to its actual value in the
+  # expansion.
+  for file in `sed -n "
+    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+    # Make sure the directory exists.
+    test -f "$dirpart/$file" && continue
+    fdir=`AS_DIRNAME(["$file"])`
+    AS_MKDIR_P([$dirpart/$fdir])
+    # echo "creating $dirpart/$file"
+    echo '# dummy' > "$dirpart/$file"
+  done
+done
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled.  FIXME.  This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 12
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.58])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+   test -f $srcdir/config.status; then
+  AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AM_PROG_INSTALL_SH
+AM_PROG_INSTALL_STRIP
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+              [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+	      		     [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+                  [_AM_DEPENDENCIES(CC)],
+                  [define([AC_PROG_CC],
+                          defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+                  [_AM_DEPENDENCIES(CXX)],
+                  [define([AC_PROG_CXX],
+                          defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+])
+])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $1 | $1:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Check to see how 'make' treats includes.	            -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+   am__include=include
+   am__quote=
+   _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+      am__include=.include
+      am__quote="\""
+      _am_result=BSD
+   fi
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise.
+#
+# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories
+# created by `make install' are always world readable, even if the
+# installer happens to have an overly restrictive umask (e.g. 077).
+# This was a mistake.  There are at least two reasons why we must not
+# use `-m 0755':
+#   - it causes special bits like SGID to be ignored,
+#   - it may be too restrictive (some setups expect 775 directories).
+#
+# Do not use -m 0755 and let people choose whatever they expect by
+# setting umask.
+#
+# We cannot accept any implementation of `mkdir' that recognizes `-p'.
+# Some implementations (such as Solaris 8's) are not thread-safe: if a
+# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c'
+# concurrently, both version can detect that a/ is missing, but only
+# one can create it and the other will error out.  Consequently we
+# restrict ourselves to GNU make (using the --version option ensures
+# this.)
+AC_DEFUN([AM_PROG_MKDIR_P],
+[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+  # We used to keeping the `.' as first argument, in order to
+  # allow $(mkdir_p) to be used without argument.  As in
+  #   $(mkdir_p) $(somedir)
+  # where $(somedir) is conditionally defined.  However this is wrong
+  # for two reasons:
+  #  1. if the package is installed by a user who cannot write `.'
+  #     make install will fail,
+  #  2. the above comment should most certainly read
+  #     $(mkdir_p) $(DESTDIR)$(somedir)
+  #     so it does not work when $(somedir) is undefined and
+  #     $(DESTDIR) is not.
+  #  To support the latter case, we have to write
+  #     test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+  #  so the `.' trick is pointless.
+  mkdir_p='mkdir -p --'
+else
+  # On NextStep and OpenStep, the `mkdir' command does not
+  # recognize any option.  It will interpret all options as
+  # directories to create, and then abort because `.' already
+  # exists.
+  for d in ./-p ./--version;
+  do
+    test -d $d && rmdir $d
+  done
+  # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+  if test -f "$ac_aux_dir/mkinstalldirs"; then
+    mkdir_p='$(mkinstalldirs)'
+  else
+    mkdir_p='$(install_sh) -d'
+  fi
+fi
+AC_SUBST([mkdir_p])])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+   if test "$[*]" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$[*]" != "X $srcdir/configure conftest.file" \
+      && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+     [m4_case([$1], [ustar],, [pax],,
+              [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+  case $_am_tool in
+  gnutar)
+    for _am_tar in tar gnutar gtar;
+    do
+      AM_RUN_LOG([$_am_tar --version]) && break
+    done
+    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+    am__untar="$_am_tar -xf -"
+    ;;
+  plaintar)
+    # Must skip GNU tar: if it does not support --format= it doesn't create
+    # ustar tarball either.
+    (tar --version) >/dev/null 2>&1 && continue
+    am__tar='tar chf - "$$tardir"'
+    am__tar_='tar chf - "$tardir"'
+    am__untar='tar xf -'
+    ;;
+  pax)
+    am__tar='pax -L -x $1 -w "$$tardir"'
+    am__tar_='pax -L -x $1 -w "$tardir"'
+    am__untar='pax -r'
+    ;;
+  cpio)
+    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+    am__untar='cpio -i -H $1 -d'
+    ;;
+  none)
+    am__tar=false
+    am__tar_=false
+    am__untar=false
+    ;;
+  esac
+
+  # If the value was cached, stop now.  We just wanted to have am__tar
+  # and am__untar set.
+  test -n "${am_cv_prog_tar_$1}" && break
+
+  # tar/untar a dummy directory, and stop if the command works
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  echo GrepMe > conftest.dir/file
+  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+  rm -rf conftest.dir
+  if test -s conftest.tar; then
+    AM_RUN_LOG([$am__untar <conftest.tar])
+    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+  fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/txt2tdb-src/config.guess
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/txt2tdb-src/config.guess	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/txt2tdb-src/config.guess	(revision 24799)
@@ -0,0 +1,1298 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+#   Free Software Foundation, Inc.
+
+timestamp='2001-07-12'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Written by Per Bothner <bothner@cygnus.com>.
+# Please send patches to <config-patches@gnu.org>.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit 0 ;;
+    --version | -v )
+       echo "$version" ; exit 0 ;;
+    --help | --h* | -h )
+       echo "$usage"; exit 0 ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+
+dummy=dummy-$$
+trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script.
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int dummy(){}" > $dummy.c ;
+	for c in cc gcc c89 ; do
+	  ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ;
+	  if test $? = 0 ; then
+	     CC_FOR_BUILD="$c"; break ;
+	  fi ;
+	done ;
+	rm -f $dummy.c $dummy.o $dummy.rel ;
+	if test x"$CC_FOR_BUILD" = x ; then
+	  CC_FOR_BUILD=no_compiler_found ;
+	fi
+	;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+	# Netbsd (nbsd) targets should (where applicable) match one or
+	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	# Determine the machine/vendor (is the vendor relevant).
+	case "${UNAME_MACHINE}" in
+	    amiga) machine=m68k-unknown ;;
+	    arm32) machine=arm-unknown ;;
+	    atari*) machine=m68k-atari ;;
+	    sun3*) machine=m68k-sun ;;
+	    mac68k) machine=m68k-apple ;;
+	    macppc) machine=powerpc-apple ;;
+	    hp3[0-9][05]) machine=m68k-hp ;;
+	    ibmrt|romp-ibm) machine=romp-ibm ;;
+	    *) machine=${UNAME_MACHINE}-unknown ;;
+	esac
+	# The Operating System including object format, if it has switched
+	# to ELF recently, or will in the future.
+	case "${UNAME_MACHINE}" in
+	    i386|sparc|amiga|arm*|hp300|mvme68k|vax|atari|luna68k|mac68k|news68k|next68k|pc532|sun3*|x68k)
+		eval $set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep __ELF__ >/dev/null
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+	        os=netbsd
+		;;
+	esac
+	# The OS release
+	release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	echo "${machine}-${os}${release}"
+	exit 0 ;;
+    alpha:OSF1:*:*)
+	if test $UNAME_RELEASE = "V4.0"; then
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+	fi
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	cat <<EOF >$dummy.s
+	.data
+\$Lformat:
+	.byte 37,100,45,37,120,10,0	# "%d-%x\n"
+
+	.text
+	.globl main
+	.align 4
+	.ent main
+main:
+	.frame \$30,16,\$26,0
+	ldgp \$29,0(\$27)
+	.prologue 1
+	.long 0x47e03d80 # implver \$0
+	lda \$2,-1
+	.long 0x47e20c21 # amask \$2,\$1
+	lda \$16,\$Lformat
+	mov \$0,\$17
+	not \$1,\$18
+	jsr \$26,printf
+	ldgp \$29,0(\$26)
+	mov 0,\$16
+	jsr \$26,exit
+	.end main
+EOF
+	eval $set_cc_for_build
+	$CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
+	if test "$?" = 0 ; then
+		case `./$dummy` in
+			0-0)
+				UNAME_MACHINE="alpha"
+				;;
+			1-0)
+				UNAME_MACHINE="alphaev5"
+				;;
+			1-1)
+				UNAME_MACHINE="alphaev56"
+				;;
+			1-101)
+				UNAME_MACHINE="alphapca56"
+				;;
+			2-303)
+				UNAME_MACHINE="alphaev6"
+				;;
+			2-307)
+				UNAME_MACHINE="alphaev67"
+				;;
+		esac
+	fi
+	rm -f $dummy.s $dummy
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	exit 0 ;;
+    Alpha\ *:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# Should we change UNAME_MACHINE based on the output of uname instead
+	# of the specific Alpha model?
+	echo alpha-pc-interix
+	exit 0 ;;
+    21064:Windows_NT:50:3)
+	echo alpha-dec-winnt3.5
+	exit 0 ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-unknown-sysv4
+	exit 0;;
+    amiga:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-amigaos
+	exit 0 ;;
+    arc64:OpenBSD:*:*)
+	echo mips64el-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    arc:OpenBSD:*:*)
+	echo mipsel-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    hkmips:OpenBSD:*:*)
+	echo mips-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    pmax:OpenBSD:*:*)
+	echo mipsel-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    sgi:OpenBSD:*:*)
+	echo mips-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    wgrisc:OpenBSD:*:*)
+	echo mipsel-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    *:OS/390:*:*)
+	echo i370-ibm-openedition
+	exit 0 ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit 0;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit 0;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit 0 ;;
+    NILE*:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit 0 ;;
+    sun4H:SunOS:5.*:*)
+	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    i86pc:SunOS:5.*:*)
+	echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    sun4*:SunOS:*:*)
+	case "`/usr/bin/arch -k`" in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+	exit 0 ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos${UNAME_RELEASE}
+	exit 0 ;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+	case "`/bin/arch`" in
+	    sun3)
+		echo m68k-sun-sunos${UNAME_RELEASE}
+		;;
+	    sun4)
+		echo sparc-sun-sunos${UNAME_RELEASE}
+		;;
+	esac
+	exit 0 ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos${UNAME_RELEASE}
+	exit 0 ;;
+    atari*:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit 0 ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+        exit 0 ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit 0 ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+        echo m68k-milan-mint${UNAME_RELEASE}
+        exit 0 ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+        echo m68k-hades-mint${UNAME_RELEASE}
+        exit 0 ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+        echo m68k-unknown-mint${UNAME_RELEASE}
+        exit 0 ;;
+    sun3*:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    mac68k:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    mvme68k:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    mvme88k:OpenBSD:*:*)
+	echo m88k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten${UNAME_RELEASE}
+	exit 0 ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit 0 ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit 0 ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit 0 ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	echo clipper-intergraph-clix${UNAME_RELEASE}
+	exit 0 ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	sed 's/^	//' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	eval $set_cc_for_build
+	$CC_FOR_BUILD $dummy.c -o $dummy \
+	  && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+	  && rm -f $dummy.c $dummy && exit 0
+	rm -f $dummy.c $dummy
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit 0 ;;
+    Motorola:PowerMAX_OS:*:*)
+	echo powerpc-motorola-powermax
+	exit 0 ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit 0 ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit 0 ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit 0 ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit 0 ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+	then
+	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+	       [ ${TARGET_BINARY_INTERFACE}x = x ]
+	    then
+		echo m88k-dg-dgux${UNAME_RELEASE}
+	    else
+		echo m88k-dg-dguxbcs${UNAME_RELEASE}
+	    fi
+	else
+	    echo i586-dg-dgux${UNAME_RELEASE}
+	fi
+ 	exit 0 ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit 0 ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit 0 ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit 0 ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit 0 ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+	exit 0 ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	echo romp-ibm-aix      # uname -m gives an 8 hex-code CPU id
+	exit 0 ;;              # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+	echo i386-ibm-aix
+	exit 0 ;;
+    ia64:AIX:*:*)
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+	exit 0 ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		sed 's/^		//' << EOF >$dummy.c
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		eval $set_cc_for_build
+		$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
+		rm -f $dummy.c $dummy
+		echo rs6000-ibm-aix3.2.5
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		echo rs6000-ibm-aix3.2.4
+	else
+		echo rs6000-ibm-aix3.2
+	fi
+	exit 0 ;;
+    *:AIX:*:[45])
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit 0 ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit 0 ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+	echo romp-ibm-bsd4.4
+	exit 0 ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+	exit 0 ;;                           # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit 0 ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit 0 ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit 0 ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit 0 ;;
+    9000/[34678]??:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+              case "${HPUX_REV}" in
+                11.[0-9][0-9])
+                  if [ -x /usr/bin/getconf ]; then
+                    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+                    case "${sc_cpu_version}" in
+                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+                      532)                      # CPU_PA_RISC2_0
+                        case "${sc_kernel_bits}" in
+                          32) HP_ARCH="hppa2.0n" ;;
+                          64) HP_ARCH="hppa2.0w" ;;
+                        esac ;;
+                    esac
+                  fi ;;
+              esac
+              if [ "${HP_ARCH}" = "" ]; then
+              sed 's/^              //' << EOF >$dummy.c
+
+              #define _HPUX_SOURCE
+              #include <stdlib.h>
+              #include <unistd.h>
+
+              int main ()
+              {
+              #if defined(_SC_KERNEL_BITS)
+                  long bits = sysconf(_SC_KERNEL_BITS);
+              #endif
+                  long cpu  = sysconf (_SC_CPU_VERSION);
+
+                  switch (cpu)
+              	{
+              	case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+              	case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+              	case CPU_PA_RISC2_0:
+              #if defined(_SC_KERNEL_BITS)
+              	    switch (bits)
+              		{
+              		case 64: puts ("hppa2.0w"); break;
+              		case 32: puts ("hppa2.0n"); break;
+              		default: puts ("hppa2.0"); break;
+              		} break;
+              #else  /* !defined(_SC_KERNEL_BITS) */
+              	    puts ("hppa2.0"); break;
+              #endif
+              	default: puts ("hppa1.0"); break;
+              	}
+                  exit (0);
+              }
+EOF
+	eval $set_cc_for_build
+	(CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy`
+	if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi
+	rm -f $dummy.c $dummy
+	fi ;;
+	esac
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit 0 ;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ia64-hp-hpux${HPUX_REV}
+	exit 0 ;;
+    3050*:HI-UX:*:*)
+	sed 's/^	//' << EOF >$dummy.c
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	eval $set_cc_for_build
+	$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
+	rm -f $dummy.c $dummy
+	echo unknown-hitachi-hiuxwe2
+	exit 0 ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit 0 ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit 0 ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+	echo hppa1.0-hp-mpeix
+	exit 0 ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit 0 ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit 0 ;;
+    i*86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo ${UNAME_MACHINE}-unknown-osf1mk
+	else
+	    echo ${UNAME_MACHINE}-unknown-osf1
+	fi
+	exit 0 ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit 0 ;;
+    hppa*:OpenBSD:*:*)
+	echo hppa-unknown-openbsd
+	exit 0 ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+        exit 0 ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+        exit 0 ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+        exit 0 ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+        exit 0 ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+        exit 0 ;;
+    CRAY*X-MP:*:*:*)
+	echo xmp-cray-unicos
+        exit 0 ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*[A-Z]90:*:*:*)
+	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+	      -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*T3D:*:*:*)
+	echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*T3E:*:*:*)
+	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*SV1:*:*:*)
+	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY-2:*:*:*)
+	echo cray2-cray-unicos
+        exit 0 ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit 0 ;;
+    hp300:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+	exit 0 ;;
+    sparc*:BSD/OS:*:*)
+	echo sparc-unknown-bsdi${UNAME_RELEASE}
+	exit 0 ;;
+    *:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit 0 ;;
+    *:FreeBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit 0 ;;
+    *:OpenBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+	exit 0 ;;
+    i*:CYGWIN*:*)
+	echo ${UNAME_MACHINE}-pc-cygwin
+	exit 0 ;;
+    i*:MINGW*:*)
+	echo ${UNAME_MACHINE}-pc-mingw32
+	exit 0 ;;
+    i*:PW*:*)
+	echo ${UNAME_MACHINE}-pc-pw32
+	exit 0 ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+	# UNAME_MACHINE based on the output of uname instead of i386?
+	echo i386-pc-interix
+	exit 0 ;;
+    i*:UWIN*:*)
+	echo ${UNAME_MACHINE}-pc-uwin
+	exit 0 ;;
+    p*:CYGWIN*:*)
+	echo powerpcle-unknown-cygwin
+	exit 0 ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    *:GNU:*:*)
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit 0 ;;
+    i*86:Minix:*:*)
+	echo ${UNAME_MACHINE}-pc-minix
+	exit 0 ;;
+    arm*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    ia64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux
+	exit 0 ;;
+    m68*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    mips:Linux:*:*)
+	case `sed -n '/^byte/s/^.*: \(.*\) endian/\1/p' < /proc/cpuinfo` in
+	  big)    echo mips-unknown-linux-gnu && exit 0 ;;
+	  little) echo mipsel-unknown-linux-gnu && exit 0 ;;
+	esac
+	;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-gnu
+	exit 0 ;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev67 ;;
+        esac
+	objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+	exit 0 ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
+	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
+	  *)    echo hppa-unknown-linux-gnu ;;
+	esac
+	exit 0 ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-gnu
+	exit 0 ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	echo ${UNAME_MACHINE}-ibm-linux
+	exit 0 ;;
+    sh*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    x86_64:Linux:*:*)
+	echo x86_64-unknown-linux-gnu
+	exit 0 ;;
+    i*86:Linux:*:*)
+	# The BFD linker knows what the default object file format is, so
+	# first see if it will tell us. cd to the root directory to prevent
+	# problems with other programs or directories called `ld' in the path.
+	ld_supported_targets=`cd /; ld --help 2>&1 \
+			 | sed -ne '/supported targets:/!d
+				    s/[ 	][ 	]*/ /g
+				    s/.*supported targets: *//
+				    s/ .*//
+				    p'`
+        case "$ld_supported_targets" in
+	  elf32-i386)
+		TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+		;;
+	  a.out-i386-linux)
+		echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+		exit 0 ;;		
+	  coff-i386)
+		echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+		exit 0 ;;
+	  "")
+		# Either a pre-BFD a.out linker (linux-gnuoldld) or
+		# one that does not give us useful --help.
+		echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+		exit 0 ;;
+	esac
+	# Determine whether the default compiler is a.out or elf
+	cat >$dummy.c <<EOF
+#include <features.h>
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+#ifdef __ELF__
+# ifdef __GLIBC__
+#  if __GLIBC__ >= 2
+    printf ("%s-pc-linux-gnu\n", argv[1]);
+#  else
+    printf ("%s-pc-linux-gnulibc1\n", argv[1]);
+#  endif
+# else
+   printf ("%s-pc-linux-gnulibc1\n", argv[1]);
+# endif
+#else
+  printf ("%s-pc-linux-gnuaout\n", argv[1]);
+#endif
+  return 0;
+}
+EOF
+	eval $set_cc_for_build
+	$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0
+	rm -f $dummy.c $dummy
+	test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
+	;;
+    i*86:DYNIX/ptx:4*:*)
+	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+	# earlier versions are messed up and put the nodename in both
+	# sysname and nodename.
+	echo i386-sequent-sysv4
+	exit 0 ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+        # Unixware is an offshoot of SVR4, but it has its own version
+        # number series starting with 2...
+        # I am not positive that other SVR4 systems won't match this,
+	# I just have to hope.  -- rms.
+        # Use sysv4.2uw... so that sysv4* matches it.
+	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+	exit 0 ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+	else
+		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+	fi
+	exit 0 ;;
+    i*86:*:5:[78]*)
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	exit 0 ;;
+    i*86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-pc-sysv32
+	fi
+	exit 0 ;;
+    i*86:*DOS:*:*)
+	echo ${UNAME_MACHINE}-pc-msdosdjgpp
+	exit 0 ;;
+    pc:*:*:*)
+	# Left here for compatibility:
+        # uname -m prints for DJGPP always 'pc', but it prints nothing about
+        # the processor, so we play safe by assuming i386.
+	echo i386-pc-msdosdjgpp
+        exit 0 ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit 0 ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit 0 ;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	fi
+	exit 0 ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit 0 ;;
+    M68*:*:R3V[567]*:*)
+	test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+    3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && echo i486-ncr-sysv4.3${OS_REL} && exit 0
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && echo i486-ncr-sysv4 && exit 0 ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+	echo m68k-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit 0 ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+	echo i386-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    rs6000:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+	echo powerpc-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv${UNAME_RELEASE}
+	exit 0 ;;
+    RM*:ReliantUNIX-*:*:*)
+	echo mips-sni-sysv4
+	exit 0 ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit 0 ;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		echo ${UNAME_MACHINE}-sni-sysv4
+	else
+		echo ns32k-sni-sysv
+	fi
+	exit 0 ;;
+    PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                           # says <Richard.M.Bartel@ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit 0 ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes@openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit 0 ;;
+    *:*:*:FTX*)
+	# From seanf@swdc.stratus.com.
+	echo i860-stratus-sysv4
+	exit 0 ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux${UNAME_RELEASE}
+	exit 0 ;;
+    news*:NEWS-OS:6*:*)
+	echo mips-sony-newsos6
+	exit 0 ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+	if [ -d /usr/nec ]; then
+	        echo mips-nec-sysv${UNAME_RELEASE}
+	else
+	        echo mips-unknown-sysv${UNAME_RELEASE}
+	fi
+        exit 0 ;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	echo powerpc-be-beos
+	exit 0 ;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	echo powerpc-apple-beos
+	exit 0 ;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	echo i586-pc-beos
+	exit 0 ;;
+    SX-4:SUPER-UX:*:*)
+	echo sx4-nec-superux${UNAME_RELEASE}
+	exit 0 ;;
+    SX-5:SUPER-UX:*:*)
+	echo sx5-nec-superux${UNAME_RELEASE}
+	exit 0 ;;
+    Power*:Rhapsody:*:*)
+	echo powerpc-apple-rhapsody${UNAME_RELEASE}
+	exit 0 ;;
+    *:Rhapsody:*:*)
+	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+	exit 0 ;;
+    *:Darwin:*:*)
+	echo `uname -p`-apple-darwin${UNAME_RELEASE}
+	exit 0 ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	if test "${UNAME_MACHINE}" = "x86pc"; then
+		UNAME_MACHINE=pc
+	fi
+	echo `uname -p`-${UNAME_MACHINE}-nto-qnx
+	exit 0 ;;
+    *:QNX:*:4*)
+	echo i386-pc-qnx
+	exit 0 ;;
+    NSR-[KW]:NONSTOP_KERNEL:*:*)
+	echo nsr-tandem-nsk${UNAME_RELEASE}
+	exit 0 ;;
+    *:NonStop-UX:*:*)
+	echo mips-compaq-nonstopux
+	exit 0 ;;
+    BS2000:POSIX*:*:*)
+	echo bs2000-siemens-sysv
+	exit 0 ;;
+    DS/*:UNIX_System_V:*:*)
+	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+	exit 0 ;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	if test "$cputype" = "386"; then
+	    UNAME_MACHINE=i386
+	else
+	    UNAME_MACHINE="$cputype"
+	fi
+	echo ${UNAME_MACHINE}-unknown-plan9
+	exit 0 ;;
+    i*86:OS/2:*:*)
+	# If we were able to find `uname', then EMX Unix compatibility
+	# is probably installed.
+	echo ${UNAME_MACHINE}-pc-os2-emx
+	exit 0 ;;
+    *:TOPS-10:*:*)
+	echo pdp10-unknown-tops10
+	exit 0 ;;
+    *:TENEX:*:*)
+	echo pdp10-unknown-tenex
+	exit 0 ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	echo pdp10-dec-tops20
+	exit 0 ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	echo pdp10-xkl-tops20
+	exit 0 ;;
+    *:TOPS-20:*:*)
+	echo pdp10-unknown-tops20
+	exit 0 ;;
+    *:ITS:*:*)
+	echo pdp10-unknown-its
+	exit 0 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+          "4"
+#else
+	  ""
+#endif
+         ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+	printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+	printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# else
+    printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+eval $set_cc_for_build
+$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0
+rm -f $dummy.c $dummy
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+	echo c1-convex-bsd
+	exit 0 ;;
+    c2*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit 0 ;;
+    c34*)
+	echo c34-convex-bsd
+	exit 0 ;;
+    c38*)
+	echo c38-convex-bsd
+	exit 0 ;;
+    c4*)
+	echo c4-convex-bsd
+	exit 0 ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+    ftp://ftp.gnu.org/pub/gnu/config/
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/txt2tdb-src/config.h.in
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/txt2tdb-src/config.h.in	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/txt2tdb-src/config.h.in	(revision 24799)
@@ -0,0 +1,22 @@
+/* config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Version number of package */
+#undef VERSION
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/txt2tdb-src/config.sub
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/txt2tdb-src/config.sub	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/txt2tdb-src/config.sub	(revision 24799)
@@ -0,0 +1,1579 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+
+timestamp='2005-07-08'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \
+  kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+	-sun*os*)
+		# Prevent following clause from handling this invalid input.
+		;;
+	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+	-apple | -axis | -knuth | -cray)
+		os=
+		basic_machine=$1
+		;;
+	-sim | -cisco | -oki | -wec | -winbond)
+		os=
+		basic_machine=$1
+		;;
+	-scout)
+		;;
+	-wrs)
+		os=-vxworks
+		basic_machine=$1
+		;;
+	-chorusos*)
+		os=-chorusos
+		basic_machine=$1
+		;;
+ 	-chorusrdb)
+ 		os=-chorusrdb
+		basic_machine=$1
+ 		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco5)
+		os=-sco3.2v5
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-udk*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-lynx*)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-windowsnt*)
+		os=`echo $os | sed -e 's/windowsnt/winnt/'`
+		;;
+	-psos*)
+		os=-psos
+		;;
+	-mint | -mint[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+	# Recognize the basic CPU types without company name.
+	# Some are omitted here because they have special meanings below.
+	1750a | 580 \
+	| a29k \
+	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+	| am33_2.0 \
+	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+	| bfin \
+	| c4x | clipper \
+	| d10v | d30v | dlx | dsp16xx \
+	| fr30 | frv \
+	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| i370 | i860 | i960 | ia64 \
+	| ip2k | iq2000 \
+	| m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \
+	| mips | mipsbe | mipseb | mipsel | mipsle \
+	| mips16 \
+	| mips64 | mips64el \
+	| mips64vr | mips64vrel \
+	| mips64orion | mips64orionel \
+	| mips64vr4100 | mips64vr4100el \
+	| mips64vr4300 | mips64vr4300el \
+	| mips64vr5000 | mips64vr5000el \
+	| mips64vr5900 | mips64vr5900el \
+	| mipsisa32 | mipsisa32el \
+	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa64 | mipsisa64el \
+	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64sb1 | mipsisa64sb1el \
+	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipstx39 | mipstx39el \
+	| mn10200 | mn10300 \
+	| ms1 \
+	| msp430 \
+	| ns16k | ns32k \
+	| or32 \
+	| pdp10 | pdp11 | pj | pjl \
+	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+	| pyramid \
+	| sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
+	| sh64 | sh64le \
+	| sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \
+	| sparcv8 | sparcv9 | sparcv9b \
+	| strongarm \
+	| tahoe | thumb | tic4x | tic80 | tron \
+	| v850 | v850e \
+	| we32k \
+	| x86 | xscale | xscalee[bl] | xstormy16 | xtensa \
+	| z8k)
+		basic_machine=$basic_machine-unknown
+		;;
+	m32c)
+		basic_machine=$basic_machine-unknown
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12)
+		# Motorola 68HC11/12.
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+		;;
+
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i*86 | x86_64)
+	  basic_machine=$basic_machine-pc
+	  ;;
+	# Object if more than one company name word.
+	*-*-*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+	# Recognize the basic CPU types with company name.
+	580-* \
+	| a29k-* \
+	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+	| avr-* \
+	| bfin-* | bs2000-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+	| clipper-* | craynv-* | cydra-* \
+	| d10v-* | d30v-* | dlx-* \
+	| elxsi-* \
+	| f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
+	| h8300-* | h8500-* \
+	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| i*86-* | i860-* | i960-* | ia64-* \
+	| ip2k-* | iq2000-* \
+	| m32r-* | m32rle-* \
+	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* \
+	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+	| mips16-* \
+	| mips64-* | mips64el-* \
+	| mips64vr-* | mips64vrel-* \
+	| mips64orion-* | mips64orionel-* \
+	| mips64vr4100-* | mips64vr4100el-* \
+	| mips64vr4300-* | mips64vr4300el-* \
+	| mips64vr5000-* | mips64vr5000el-* \
+	| mips64vr5900-* | mips64vr5900el-* \
+	| mipsisa32-* | mipsisa32el-* \
+	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa64-* | mipsisa64el-* \
+	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64sb1-* | mipsisa64sb1el-* \
+	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipstx39-* | mipstx39el-* \
+	| mmix-* \
+	| ms1-* \
+	| msp430-* \
+	| none-* | np1-* | ns16k-* | ns32k-* \
+	| orion-* \
+	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+	| pyramid-* \
+	| romp-* | rs6000-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \
+	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+	| sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \
+	| sparclite-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
+	| tahoe-* | thumb-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+	| tron-* \
+	| v850-* | v850e-* | vax-* \
+	| we32k-* \
+	| x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \
+	| xstormy16-* | xtensa-* \
+	| ymp-* \
+	| z8k-*)
+		;;
+	m32c-*)
+		;;
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	386bsd)
+		basic_machine=i386-unknown
+		os=-bsd
+		;;
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		basic_machine=m68000-att
+		;;
+	3b*)
+		basic_machine=we32k-att
+		;;
+	a29khif)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+    	abacus)
+		basic_machine=abacus-unknown
+		;;
+	adobe68k)
+		basic_machine=m68010-adobe
+		os=-scout
+		;;
+	alliant | fx80)
+		basic_machine=fx80-alliant
+		;;
+	altos | altos3068)
+		basic_machine=m68k-altos
+		;;
+	am29k)
+		basic_machine=a29k-none
+		os=-bsd
+		;;
+	amd64)
+		basic_machine=x86_64-pc
+		;;
+	amd64-*)
+		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	amdahl)
+		basic_machine=580-amdahl
+		os=-sysv
+		;;
+	amiga | amiga-*)
+		basic_machine=m68k-unknown
+		;;
+	amigaos | amigados)
+		basic_machine=m68k-unknown
+		os=-amigaos
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-unknown
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	apollo68bsd)
+		basic_machine=m68k-apollo
+		os=-bsd
+		;;
+	aux)
+		basic_machine=m68k-apple
+		os=-aux
+		;;
+	balance)
+		basic_machine=ns32k-sequent
+		os=-dynix
+		;;
+	c90)
+		basic_machine=c90-cray
+		os=-unicos
+		;;
+	convex-c1)
+		basic_machine=c1-convex
+		os=-bsd
+		;;
+	convex-c2)
+		basic_machine=c2-convex
+		os=-bsd
+		;;
+	convex-c32)
+		basic_machine=c32-convex
+		os=-bsd
+		;;
+	convex-c34)
+		basic_machine=c34-convex
+		os=-bsd
+		;;
+	convex-c38)
+		basic_machine=c38-convex
+		os=-bsd
+		;;
+	cray | j90)
+		basic_machine=j90-cray
+		os=-unicos
+		;;
+	craynv)
+		basic_machine=craynv-cray
+		os=-unicosmp
+		;;
+	cr16c)
+		basic_machine=cr16c-unknown
+		os=-elf
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	crisv32 | crisv32-* | etraxfs*)
+		basic_machine=crisv32-axis
+		;;
+	cris | cris-* | etrax*)
+		basic_machine=cris-axis
+		;;
+	crx)
+		basic_machine=crx-unknown
+		os=-elf
+		;;
+	da30 | da30-*)
+		basic_machine=m68k-da30
+		;;
+	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+		basic_machine=mips-dec
+		;;
+	decsystem10* | dec10*)
+		basic_machine=pdp10-dec
+		os=-tops10
+		;;
+	decsystem20* | dec20*)
+		basic_machine=pdp10-dec
+		os=-tops20
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		basic_machine=m68k-motorola
+		;;
+	delta88)
+		basic_machine=m88k-motorola
+		os=-sysv3
+		;;
+	djgpp)
+		basic_machine=i586-pc
+		os=-msdosdjgpp
+		;;
+	dpx20 | dpx20-*)
+		basic_machine=rs6000-bull
+		os=-bosx
+		;;
+	dpx2* | dpx2*-bull)
+		basic_machine=m68k-bull
+		os=-sysv3
+		;;
+	ebmon29k)
+		basic_machine=a29k-amd
+		os=-ebmon
+		;;
+	elxsi)
+		basic_machine=elxsi-elxsi
+		os=-bsd
+		;;
+	encore | umax | mmax)
+		basic_machine=ns32k-encore
+		;;
+	es1800 | OSE68k | ose68k | ose | OSE)
+		basic_machine=m68k-ericsson
+		os=-ose
+		;;
+	fx2800)
+		basic_machine=i860-alliant
+		;;
+	genix)
+		basic_machine=ns32k-ns
+		;;
+	gmicro)
+		basic_machine=tron-gmicro
+		os=-sysv
+		;;
+	go32)
+		basic_machine=i386-pc
+		os=-go32
+		;;
+	h3050r* | hiux*)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	h8300hms)
+		basic_machine=h8300-hitachi
+		os=-hms
+		;;
+	h8300xray)
+		basic_machine=h8300-hitachi
+		os=-xray
+		;;
+	h8500hms)
+		basic_machine=h8500-hitachi
+		os=-hms
+		;;
+	harris)
+		basic_machine=m88k-harris
+		os=-sysv3
+		;;
+	hp300-*)
+		basic_machine=m68k-hp
+		;;
+	hp300bsd)
+		basic_machine=m68k-hp
+		os=-bsd
+		;;
+	hp300hpux)
+		basic_machine=m68k-hp
+		os=-hpux
+		;;
+	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		basic_machine=m68000-hp
+		;;
+	hp9k3[2-9][0-9])
+		basic_machine=m68k-hp
+		;;
+	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k78[0-9] | hp78[0-9])
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][13679] | hp8[0-9][13679])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hppa-next)
+		os=-nextstep3
+		;;
+	hppaosf)
+		basic_machine=hppa1.1-hp
+		os=-osf
+		;;
+	hppro)
+		basic_machine=hppa1.1-hp
+		os=-proelf
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+	i*86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv32
+		;;
+	i*86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv4
+		;;
+	i*86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv
+		;;
+	i*86sol2)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-solaris2
+		;;
+	i386mach)
+		basic_machine=i386-mach
+		os=-mach
+		;;
+	i386-vsta | vsta)
+		basic_machine=i386-unknown
+		os=-vsta
+		;;
+	iris | iris4d)
+		basic_machine=mips-sgi
+		case $os in
+		    -irix*)
+			;;
+		    *)
+			os=-irix4
+			;;
+		esac
+		;;
+	isi68 | isi)
+		basic_machine=m68k-isi
+		os=-sysv
+		;;
+	m88k-omron*)
+		basic_machine=m88k-omron
+		;;
+	magnum | m3230)
+		basic_machine=mips-mips
+		os=-sysv
+		;;
+	merlin)
+		basic_machine=ns32k-utek
+		os=-sysv
+		;;
+	mingw32)
+		basic_machine=i386-pc
+		os=-mingw32
+		;;
+	miniframe)
+		basic_machine=m68000-convergent
+		;;
+	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+	mips3*-*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	monitor)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	morphos)
+		basic_machine=powerpc-unknown
+		os=-morphos
+		;;
+	msdos)
+		basic_machine=i386-pc
+		os=-msdos
+		;;
+	mvs)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	netbsd386)
+		basic_machine=i386-unknown
+		os=-netbsd
+		;;
+	netwinder)
+		basic_machine=armv4l-rebel
+		os=-linux
+		;;
+	news | news700 | news800 | news900)
+		basic_machine=m68k-sony
+		os=-newsos
+		;;
+	news1000)
+		basic_machine=m68030-sony
+		os=-newsos
+		;;
+	news-3600 | risc-news)
+		basic_machine=mips-sony
+		os=-newsos
+		;;
+	necv70)
+		basic_machine=v70-nec
+		os=-sysv
+		;;
+	next | m*-next )
+		basic_machine=m68k-next
+		case $os in
+		    -nextstep* )
+			;;
+		    -ns2*)
+		      os=-nextstep2
+			;;
+		    *)
+		      os=-nextstep3
+			;;
+		esac
+		;;
+	nh3000)
+		basic_machine=m68k-harris
+		os=-cxux
+		;;
+	nh[45]000)
+		basic_machine=m88k-harris
+		os=-cxux
+		;;
+	nindy960)
+		basic_machine=i960-intel
+		os=-nindy
+		;;
+	mon960)
+		basic_machine=i960-intel
+		os=-mon960
+		;;
+	nonstopux)
+		basic_machine=mips-compaq
+		os=-nonstopux
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	nsr-tandem)
+		basic_machine=nsr-tandem
+		;;
+	op50n-* | op60c-*)
+		basic_machine=hppa1.1-oki
+		os=-proelf
+		;;
+	openrisc | openrisc-*)
+		basic_machine=or32-unknown
+		;;
+	os400)
+		basic_machine=powerpc-ibm
+		os=-os400
+		;;
+	OSE68000 | ose68000)
+		basic_machine=m68000-ericsson
+		os=-ose
+		;;
+	os68k)
+		basic_machine=m68k-none
+		os=-os68k
+		;;
+	pa-hitachi)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	paragon)
+		basic_machine=i860-intel
+		os=-osf
+		;;
+	pbd)
+		basic_machine=sparc-tti
+		;;
+	pbb)
+		basic_machine=m68k-tti
+		;;
+	pc532 | pc532-*)
+		basic_machine=ns32k-pc532
+		;;
+	pentium | p5 | k5 | k6 | nexgen | viac3)
+		basic_machine=i586-pc
+		;;
+	pentiumpro | p6 | 6x86 | athlon | athlon_*)
+		basic_machine=i686-pc
+		;;
+	pentiumii | pentium2 | pentiumiii | pentium3)
+		basic_machine=i686-pc
+		;;
+	pentium4)
+		basic_machine=i786-pc
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium4-*)
+		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=power-ibm
+		;;
+	ppc)	basic_machine=powerpc-unknown
+		;;
+	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppcle | powerpclittle | ppc-le | powerpc-little)
+		basic_machine=powerpcle-unknown
+		;;
+	ppcle-* | powerpclittle-*)
+		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64)	basic_machine=powerpc64-unknown
+		;;
+	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+		basic_machine=powerpc64le-unknown
+		;;
+	ppc64le-* | powerpc64little-*)
+		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	pw32)
+		basic_machine=i586-unknown
+		os=-pw32
+		;;
+	rom68k)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	rm[46]00)
+		basic_machine=mips-siemens
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	s390 | s390-*)
+		basic_machine=s390-ibm
+		;;
+	s390x | s390x-*)
+		basic_machine=s390x-ibm
+		;;
+	sa29200)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	sb1)
+		basic_machine=mipsisa64sb1-unknown
+		;;
+	sb1el)
+		basic_machine=mipsisa64sb1el-unknown
+		;;
+	sei)
+		basic_machine=mips-sei
+		os=-seiux
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sh64)
+		basic_machine=sh64-unknown
+		;;
+	sparclite-wrs | simso-wrs)
+		basic_machine=sparclite-wrs
+		os=-vxworks
+		;;
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
+		;;
+	spur)
+		basic_machine=spur-unknown
+		;;
+	st2000)
+		basic_machine=m68k-tandem
+		;;
+	stratus)
+		basic_machine=i860-stratus
+		os=-sysv4
+		;;
+	sun2)
+		basic_machine=m68000-sun
+		;;
+	sun2os3)
+		basic_machine=m68000-sun
+		os=-sunos3
+		;;
+	sun2os4)
+		basic_machine=m68000-sun
+		os=-sunos4
+		;;
+	sun3os3)
+		basic_machine=m68k-sun
+		os=-sunos3
+		;;
+	sun3os4)
+		basic_machine=m68k-sun
+		os=-sunos4
+		;;
+	sun4os3)
+		basic_machine=sparc-sun
+		os=-sunos3
+		;;
+	sun4os4)
+		basic_machine=sparc-sun
+		os=-sunos4
+		;;
+	sun4sol2)
+		basic_machine=sparc-sun
+		os=-solaris2
+		;;
+	sun3 | sun3-*)
+		basic_machine=m68k-sun
+		;;
+	sun4)
+		basic_machine=sparc-sun
+		;;
+	sun386 | sun386i | roadrunner)
+		basic_machine=i386-sun
+		;;
+	sv1)
+		basic_machine=sv1-cray
+		os=-unicos
+		;;
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
+		;;
+	t3e)
+		basic_machine=alphaev5-cray
+		os=-unicos
+		;;
+	t90)
+		basic_machine=t90-cray
+		os=-unicos
+		;;
+	tic54x | c54x*)
+		basic_machine=tic54x-unknown
+		os=-coff
+		;;
+	tic55x | c55x*)
+		basic_machine=tic55x-unknown
+		os=-coff
+		;;
+	tic6x | c6x*)
+		basic_machine=tic6x-unknown
+		os=-coff
+		;;
+	tx39)
+		basic_machine=mipstx39-unknown
+		;;
+	tx39el)
+		basic_machine=mipstx39el-unknown
+		;;
+	toad1)
+		basic_machine=pdp10-xkl
+		os=-tops20
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	tpf)
+		basic_machine=s390x-ibm
+		os=-tpf
+		;;
+	udi29k)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
+		;;
+	v810 | necv810)
+		basic_machine=v810-nec
+		os=-none
+		;;
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
+		;;
+	vms)
+		basic_machine=vax-dec
+		os=-vms
+		;;
+	vpp*|vx|vx-*)
+		basic_machine=f301-fujitsu
+		;;
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
+		;;
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
+		;;
+	vxworks29k)
+		basic_machine=a29k-wrs
+		os=-vxworks
+		;;
+	w65*)
+		basic_machine=w65-wdc
+		os=-none
+		;;
+	w89k-*)
+		basic_machine=hppa1.1-winbond
+		os=-proelf
+		;;
+	xbox)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	z8k-*-coff)
+		basic_machine=z8k-unknown
+		os=-sim
+		;;
+	none)
+		basic_machine=none-none
+		os=-none
+		;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		basic_machine=hppa1.1-winbond
+		;;
+	op50n)
+		basic_machine=hppa1.1-oki
+		;;
+	op60c)
+		basic_machine=hppa1.1-oki
+		;;
+	romp)
+		basic_machine=romp-ibm
+		;;
+	mmix)
+		basic_machine=mmix-knuth
+		;;
+	rs6000)
+		basic_machine=rs6000-ibm
+		;;
+	vax)
+		basic_machine=vax-dec
+		;;
+	pdp10)
+		# there are many clones, so DEC is not a safe bet
+		basic_machine=pdp10-unknown
+		;;
+	pdp11)
+		basic_machine=pdp11-dec
+		;;
+	we32k)
+		basic_machine=we32k-att
+		;;
+	sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
+		basic_machine=sh-unknown
+		;;
+	sparc | sparcv8 | sparcv9 | sparcv9b)
+		basic_machine=sparc-sun
+		;;
+	cydra)
+		basic_machine=cydra-cydrome
+		;;
+	orion)
+		basic_machine=orion-highlevel
+		;;
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	mac | mpw | mac-mpw)
+		basic_machine=m68k-apple
+		;;
+	pmac | pmac-mpw)
+		basic_machine=powerpc-apple
+		;;
+	*-unknown)
+		# Make sure to match an already-canonicalized machine name.
+		;;
+	*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+	*-digital*)
+		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+		;;
+	*-commodore*)
+		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+        # First match some system type aliases
+        # that might get confused with valid system types.
+	# -solaris* is a basic system type, with this one exception.
+	-solaris1 | -solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	-solaris)
+		os=-solaris2
+		;;
+	-svr4*)
+		os=-sysv4
+		;;
+	-unixware*)
+		os=-sysv4.2uw
+		;;
+	-gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+		;;
+	# First accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST END IN A *, to match a version number.
+	# -sysv* is not here because it comes later, after sysvr4.
+	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+	      | -aos* \
+	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \
+	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+	      | -chorusos* | -chorusrdb* \
+	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+	      | -skyos* | -haiku*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	-qnx*)
+		case $basic_machine in
+		    x86-* | i*86-*)
+			;;
+		    *)
+			os=-nto$os
+			;;
+		esac
+		;;
+	-nto-qnx*)
+		;;
+	-nto*)
+		os=`echo $os | sed -e 's|nto|nto-qnx|'`
+		;;
+	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+		;;
+	-mac*)
+		os=`echo $os | sed -e 's|mac|macos|'`
+		;;
+	-linux-dietlibc)
+		os=-linux-dietlibc
+		;;
+	-linux*)
+		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+		;;
+	-sunos5*)
+		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+		;;
+	-sunos6*)
+		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+		;;
+	-opened*)
+		os=-openedition
+		;;
+        -os400*)
+		os=-os400
+		;;
+	-wince*)
+		os=-wince
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-atheos*)
+		os=-atheos
+		;;
+	-syllable*)
+		os=-syllable
+		;;
+	-386bsd)
+		os=-bsd
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	-nova*)
+		os=-rtmk-nova
+		;;
+	-ns2 )
+		os=-nextstep2
+		;;
+	-nsk*)
+		os=-nsk
+		;;
+	# Preserve the version number of sinix5.
+	-sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	-sinix*)
+		os=-sysv4
+		;;
+        -tpf*)
+		os=-tpf
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-svr4)
+		os=-sysv4
+		;;
+	-svr3)
+		os=-sysv3
+		;;
+	-sysvr4)
+		os=-sysv4
+		;;
+	# This must come after -sysvr4.
+	-sysv*)
+		;;
+	-ose*)
+		os=-ose
+		;;
+	-es1800*)
+		os=-ose
+		;;
+	-xenix)
+		os=-xenix
+		;;
+	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+		os=-mint
+		;;
+	-aros*)
+		os=-aros
+		;;
+	-kaos*)
+		os=-kaos
+		;;
+	-zvmoe)
+		os=-zvmoe
+		;;
+	-none)
+		;;
+	*)
+		# Get rid of the `-' at the beginning of $os.
+		os=`echo $os | sed 's/[^-]*-//'`
+		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+		exit 1
+		;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+	*-acorn)
+		os=-riscix1.2
+		;;
+	arm*-rebel)
+		os=-linux
+		;;
+	arm*-semi)
+		os=-aout
+		;;
+    c4x-* | tic4x-*)
+        os=-coff
+        ;;
+	# This must come before the *-dec entry.
+	pdp10-*)
+		os=-tops20
+		;;
+	pdp11-*)
+		os=-none
+		;;
+	*-dec | vax-*)
+		os=-ultrix4.2
+		;;
+	m68*-apollo)
+		os=-domain
+		;;
+	i386-sun)
+		os=-sunos4.0.2
+		;;
+	m68000-sun)
+		os=-sunos3
+		# This also exists in the configure program, but was not the
+		# default.
+		# os=-sunos4
+		;;
+	m68*-cisco)
+		os=-aout
+		;;
+	mips*-cisco)
+		os=-elf
+		;;
+	mips*-*)
+		os=-elf
+		;;
+	or32-*)
+		os=-coff
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	*-be)
+		os=-beos
+		;;
+	*-haiku)
+		os=-haiku
+		;;
+	*-ibm)
+		os=-aix
+		;;
+    	*-knuth)
+		os=-mmixware
+		;;
+	*-wec)
+		os=-proelf
+		;;
+	*-winbond)
+		os=-proelf
+		;;
+	*-oki)
+		os=-proelf
+		;;
+	*-hp)
+		os=-hpux
+		;;
+	*-hitachi)
+		os=-hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=-sysv
+		;;
+	*-cbm)
+		os=-amigaos
+		;;
+	*-dg)
+		os=-dgux
+		;;
+	*-dolphin)
+		os=-sysv3
+		;;
+	m68k-ccur)
+		os=-rtu
+		;;
+	m88k-omron*)
+		os=-luna
+		;;
+	*-next )
+		os=-nextstep
+		;;
+	*-sequent)
+		os=-ptx
+		;;
+	*-crds)
+		os=-unos
+		;;
+	*-ns)
+		os=-genix
+		;;
+	i370-*)
+		os=-mvs
+		;;
+	*-next)
+		os=-nextstep3
+		;;
+	*-gould)
+		os=-sysv
+		;;
+	*-highlevel)
+		os=-bsd
+		;;
+	*-encore)
+		os=-bsd
+		;;
+	*-sgi)
+		os=-irix
+		;;
+	*-siemens)
+		os=-sysv4
+		;;
+	*-masscomp)
+		os=-rtu
+		;;
+	f30[01]-fujitsu | f700-fujitsu)
+		os=-uxpv
+		;;
+	*-rom68k)
+		os=-coff
+		;;
+	*-*bug)
+		os=-coff
+		;;
+	*-apple)
+		os=-macos
+		;;
+	*-atari*)
+		os=-mint
+		;;
+	*)
+		os=-none
+		;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+	*-unknown)
+		case $os in
+			-riscix*)
+				vendor=acorn
+				;;
+			-sunos*)
+				vendor=sun
+				;;
+			-aix*)
+				vendor=ibm
+				;;
+			-beos*)
+				vendor=be
+				;;
+			-hpux*)
+				vendor=hp
+				;;
+			-mpeix*)
+				vendor=hp
+				;;
+			-hiux*)
+				vendor=hitachi
+				;;
+			-unos*)
+				vendor=crds
+				;;
+			-dgux*)
+				vendor=dg
+				;;
+			-luna*)
+				vendor=omron
+				;;
+			-genix*)
+				vendor=ns
+				;;
+			-mvs* | -opened*)
+				vendor=ibm
+				;;
+			-os400*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+			-tpf*)
+				vendor=ibm
+				;;
+			-vxsim* | -vxworks* | -windiss*)
+				vendor=wrs
+				;;
+			-aux*)
+				vendor=apple
+				;;
+			-hms*)
+				vendor=hitachi
+				;;
+			-mpw* | -macos*)
+				vendor=apple
+				;;
+			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+				vendor=atari
+				;;
+			-vos*)
+				vendor=stratus
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/txt2tdb-src/configure
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/txt2tdb-src/configure	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/txt2tdb-src/configure	(revision 24799)
@@ -0,0 +1,5003 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.59 for txt2tdb 1.0.
+#
+# Report bugs to <jmt12@cs.waikato.ac.nz>.
+#
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)$' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\/\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  case $0 in
+    *[\\/]* ) as_myself=$0 ;;
+    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+       ;;
+  esac
+  # We did not find ourselves, most probably we were run as `sh COMMAND'
+  # in which case we are not to be found in the path.
+  if test "x$as_myself" = x; then
+    as_myself=$0
+  fi
+  if test ! -f "$as_myself"; then
+    { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+	 case $as_dir in
+	 /*)
+	   if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+	     CONFIG_SHELL=$as_dir/$as_base
+	     export CONFIG_SHELL
+	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+	   fi;;
+	 esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='	' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" 	$as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_config_libobj_dir=.
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete.  It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: ${ac_max_here_lines=38}
+
+# Identity of this package.
+PACKAGE_NAME='txt2tdb'
+PACKAGE_TARNAME='txt2tdb'
+PACKAGE_VERSION='1.0'
+PACKAGE_STRING='txt2tdb 1.0'
+PACKAGE_BUGREPORT='jmt12@cs.waikato.ac.nz'
+
+ac_unique_file="txt2tdb.cpp"
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar build build_cpu build_vendor build_os host host_cpu host_vendor host_os CXX CXXFLAGS LDFLAGS CPPFLAGS ac_ct_CXX EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CC CFLAGS ac_ct_CC CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CPP LIBOBJS LTLIBOBJS'
+ac_subst_files=''
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+ac_prev=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval "$ac_prev=\$ac_option"
+    ac_prev=
+    continue
+  fi
+
+  ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_option in
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+  | --da=*)
+    datadir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    eval "enable_$ac_feature=no" ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    case $ac_option in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "enable_$ac_feature='$ac_optarg'" ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst \
+  | --locals | --local | --loca | --loc | --lo)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    case $ac_option in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "with_$ac_package='$ac_optarg'" ;;
+
+  -without-* | --without-*)
+    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/-/_/g'`
+    eval "with_$ac_package=no" ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+    eval "$ac_envvar='$ac_optarg'"
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  { echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+  eval ac_val=$`echo $ac_var`
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
+	      localstatedir libdir includedir oldincludedir infodir mandir
+do
+  eval ac_val=$`echo $ac_var`
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* ) ;;
+    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then its parent.
+  ac_confdir=`(dirname "$0") 2>/dev/null ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$0" : 'X\(//\)[^/]' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$0" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r $srcdir/$ac_unique_file; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+  if test "$ac_srcdir_defaulted" = yes; then
+    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+   { (exit 1); exit 1; }; }
+  else
+    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+   { (exit 1); exit 1; }; }
+  fi
+fi
+(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
+  { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
+   { (exit 1); exit 1; }; }
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_CXX_set=${CXX+set}
+ac_env_CXX_value=$CXX
+ac_cv_env_CXX_set=${CXX+set}
+ac_cv_env_CXX_value=$CXX
+ac_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_env_CXXFLAGS_value=$CXXFLAGS
+ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_cv_env_CXXFLAGS_value=$CXXFLAGS
+ac_env_LDFLAGS_set=${LDFLAGS+set}
+ac_env_LDFLAGS_value=$LDFLAGS
+ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
+ac_cv_env_LDFLAGS_value=$LDFLAGS
+ac_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_env_CPPFLAGS_value=$CPPFLAGS
+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_cv_env_CPPFLAGS_value=$CPPFLAGS
+ac_env_CC_set=${CC+set}
+ac_env_CC_value=$CC
+ac_cv_env_CC_set=${CC+set}
+ac_cv_env_CC_value=$CC
+ac_env_CFLAGS_set=${CFLAGS+set}
+ac_env_CFLAGS_value=$CFLAGS
+ac_cv_env_CFLAGS_set=${CFLAGS+set}
+ac_cv_env_CFLAGS_value=$CFLAGS
+ac_env_CPP_set=${CPP+set}
+ac_env_CPP_value=$CPP
+ac_cv_env_CPP_set=${CPP+set}
+ac_cv_env_CPP_value=$CPP
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures txt2tdb 1.0 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+_ACEOF
+
+  cat <<_ACEOF
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+			  [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+			  [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR           user executables [EPREFIX/bin]
+  --sbindir=DIR          system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR       program executables [EPREFIX/libexec]
+  --datadir=DIR          read-only architecture-independent data [PREFIX/share]
+  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
+  --libdir=DIR           object code libraries [EPREFIX/lib]
+  --includedir=DIR       C header files [PREFIX/include]
+  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
+  --infodir=DIR          info documentation [PREFIX/info]
+  --mandir=DIR           man documentation [PREFIX/man]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of txt2tdb 1.0:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors
+
+Some influential environment variables:
+  CXX         C++ compiler command
+  CXXFLAGS    C++ compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have
+              headers in a nonstandard directory <include dir>
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  CPP         C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <jmt12@cs.waikato.ac.nz>.
+_ACEOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  ac_popdir=`pwd`
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d $ac_dir || continue
+    ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
+
+    cd $ac_dir
+    # Check for guested configure; otherwise get Cygnus style configure.
+    if test -f $ac_srcdir/configure.gnu; then
+      echo
+      $SHELL $ac_srcdir/configure.gnu  --help=recursive
+    elif test -f $ac_srcdir/configure; then
+      echo
+      $SHELL $ac_srcdir/configure  --help=recursive
+    elif test -f $ac_srcdir/configure.ac ||
+	   test -f $ac_srcdir/configure.in; then
+      echo
+      $ac_configure --help
+    else
+      echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi
+    cd $ac_popdir
+  done
+fi
+
+test -n "$ac_init_help" && exit 0
+if $ac_init_version; then
+  cat <<\_ACEOF
+txt2tdb configure 1.0
+generated by GNU Autoconf 2.59
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit 0
+fi
+exec 5>config.log
+cat >&5 <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by txt2tdb $as_me 1.0, which was
+generated by GNU Autoconf 2.59.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo               = `(hostinfo) 2>/dev/null               || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  echo "PATH: $as_dir"
+done
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_sep=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+      ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+    2)
+      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+	ac_must_keep_next=false # Got value, back to normal.
+      else
+	case $ac_arg in
+	  *=* | --config-cache | -C | -disable-* | --disable-* \
+	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+	  | -with-* | --with-* | -without-* | --without-* | --x)
+	    case "$ac_configure_args0 " in
+	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+	    esac
+	    ;;
+	  -* ) ac_must_keep_next=true ;;
+	esac
+      fi
+      ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+      # Get rid of the leading space.
+      ac_sep=" "
+      ;;
+    esac
+  done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Be sure not to use single quotes in there, as some shells,
+# such as our DU 5.0 friend, will then `close' the trap.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+{
+  (set) 2>&1 |
+    case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      sed -n \
+	"s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+      ;;
+    *)
+      sed -n \
+	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+}
+    echo
+
+    cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=$`echo $ac_var`
+      echo "$ac_var='"'"'$ac_val'"'"'"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      cat <<\_ASBOX
+## ------------- ##
+## Output files. ##
+## ------------- ##
+_ASBOX
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=$`echo $ac_var`
+	echo "$ac_var='"'"'$ac_val'"'"'"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+      echo
+      sed "/^$/d" confdefs.h | sort
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      echo "$as_me: caught signal $ac_signal"
+    echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core &&
+  rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+     ' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+  if test "x$prefix" != xNONE; then
+    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+  else
+    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+  fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+  if test -r "$ac_site_file"; then
+    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . $cache_file;;
+      *)                      . ./$cache_file;;
+    esac
+  fi
+else
+  { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+	       sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+  eval ac_new_val="\$ac_env_${ac_var}_value"
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+	{ echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	{ echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
+echo "$as_me:   former value:  $ac_old_val" >&2;}
+	{ echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
+echo "$as_me:   current value: $ac_new_val" >&2;}
+	ac_cache_corrupted=:
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+      ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+am__api_version="1.9"
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+  if test -f $ac_dir/install-sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f $ac_dir/install.sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f $ac_dir/shtool; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
+echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"
+ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+  ./ | .// | /cC/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+	if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	    break 3
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+done
+
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  We don't cache a
+    # path for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the path is relative.
+    INSTALL=$ac_install_sh
+  fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$*" != "X $srcdir/configure conftest.file" \
+      && test "$*" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      { { echo "$as_me:$LINENO: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" >&5
+echo "$as_me: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" >&2;}
+   { (exit 1); exit 1; }; }
+   fi
+
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   { { echo "$as_me:$LINENO: error: newly created file is older than distributed files!
+Check your system clock" >&5
+echo "$as_me: error: newly created file is older than distributed files!
+Check your system clock" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+test "$program_prefix" != NONE &&
+  program_transform_name="s,^,$program_prefix,;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s,\$,$program_suffix,;$program_transform_name"
+# Double any \ or $.  echo might interpret backslashes.
+# By default was `s,x,x', remove it if useless.
+cat <<\_ACEOF >conftest.sed
+s/[\\$]/&&/g;s/;s,x,x,$//
+_ACEOF
+program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
+rm conftest.sed
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+  # We used to keeping the `.' as first argument, in order to
+  # allow $(mkdir_p) to be used without argument.  As in
+  #   $(mkdir_p) $(somedir)
+  # where $(somedir) is conditionally defined.  However this is wrong
+  # for two reasons:
+  #  1. if the package is installed by a user who cannot write `.'
+  #     make install will fail,
+  #  2. the above comment should most certainly read
+  #     $(mkdir_p) $(DESTDIR)$(somedir)
+  #     so it does not work when $(somedir) is undefined and
+  #     $(DESTDIR) is not.
+  #  To support the latter case, we have to write
+  #     test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+  #  so the `.' trick is pointless.
+  mkdir_p='mkdir -p --'
+else
+  # On NextStep and OpenStep, the `mkdir' command does not
+  # recognize any option.  It will interpret all options as
+  # directories to create, and then abort because `.' already
+  # exists.
+  for d in ./-p ./--version;
+  do
+    test -d $d && rmdir $d
+  done
+  # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+  if test -f "$ac_aux_dir/mkinstalldirs"; then
+    mkdir_p='$(mkinstalldirs)'
+  else
+    mkdir_p='$(install_sh) -d'
+  fi
+fi
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AWK+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AWK="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  echo "$as_me:$LINENO: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$AWK" && break
+done
+
+echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.make <<\_ACEOF
+all:
+	@echo 'ac_maketemp="$(MAKE)"'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+  eval ac_cv_prog_make_${ac_make}_set=yes
+else
+  eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftest.make
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+  SET_MAKE=
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+   test -f $srcdir/config.status; then
+  { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
+echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='txt2tdb'
+ VERSION='1.0'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_STRIP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  STRIP=$ac_ct_STRIP
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+# Make sure we can run config.sub.
+$ac_config_sub sun4 >/dev/null 2>&1 ||
+  { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5
+echo "$as_me: error: cannot run $ac_config_sub" >&2;}
+   { (exit 1); exit 1; }; }
+
+echo "$as_me:$LINENO: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6
+if test "${ac_cv_build+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_build_alias=$build_alias
+test -z "$ac_cv_build_alias" &&
+  ac_cv_build_alias=`$ac_config_guess`
+test -z "$ac_cv_build_alias" &&
+  { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
+echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+   { (exit 1); exit 1; }; }
+ac_cv_build=`$ac_config_sub $ac_cv_build_alias` ||
+  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6
+build=$ac_cv_build
+build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+echo "$as_me:$LINENO: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6
+if test "${ac_cv_host+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_host_alias=$host_alias
+test -z "$ac_cv_host_alias" &&
+  ac_cv_host_alias=$ac_cv_build_alias
+ac_cv_host=`$ac_config_sub $ac_cv_host_alias` ||
+  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6
+host=$ac_cv_host
+host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+
+          ac_config_headers="$ac_config_headers config.h"
+
+
+# Checks for programs.
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  echo "$as_me:$LINENO: result: $CXX" >&5
+echo "${ECHO_T}$CXX" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$CXX" && break
+  done
+fi
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CXX="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5
+echo "${ECHO_T}$ac_ct_CXX" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_CXX" && break
+done
+test -n "$ac_ct_CXX" || ac_ct_CXX="g++"
+
+  CXX=$ac_ct_CXX
+fi
+
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+     "checking for C++ compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+  (eval $ac_compiler --version </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+  (eval $ac_compiler -v </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+  (eval $ac_compiler -V </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+echo "$as_me:$LINENO: checking for C++ compiler default output file name" >&5
+echo $ECHO_N "checking for C++ compiler default output file name... $ECHO_C" >&6
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
+  (eval $ac_link_default) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # Find the output, starting from the most likely.  This scheme is
+# not robust to junk in `.', hence go to wildcards (a.*) only as a last
+# resort.
+
+# Be careful to initialize this variable, since it used to be cached.
+# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
+ac_cv_exeext=
+# b.out is created by i960 compilers.
+for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
+	;;
+    conftest.$ac_ext )
+	# This is the source file.
+	;;
+    [ab].out )
+	# We found the default executable, but exeext='' is most
+	# certainly right.
+	break;;
+    *.* )
+	ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	# FIXME: I believe we export ac_cv_exeext for Libtool,
+	# but it would be cool to find out if it's true.  Does anybody
+	# maintain Libtool? --akim.
+	export ac_cv_exeext
+	break;;
+    * )
+	break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C++ compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C++ compiler cannot create executables
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6
+
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether the C++ compiler works" >&5
+echo $ECHO_N "checking whether the C++ compiler works... $ECHO_C" >&6
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+  if { ac_try='./$ac_file'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { echo "$as_me:$LINENO: error: cannot run C++ compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C++ compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+  fi
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6
+
+echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	  export ac_cv_exeext
+	  break;;
+    * ) break;;
+  esac
+done
+else
+  { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
+if test "${ac_cv_objext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6
+if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6
+GXX=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+CXXFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5
+echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cxx_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cxx_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cxx_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
+  else
+    CXXFLAGS="-g"
+  fi
+else
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
+  else
+    CXXFLAGS=
+  fi
+fi
+for ac_declaration in \
+   '' \
+   'extern "C" void std::exit (int) throw (); using std::exit;' \
+   'extern "C" void std::exit (int); using std::exit;' \
+   'extern "C" void exit (int) throw ();' \
+   'extern "C" void exit (int);' \
+   'void exit (int);'
+do
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_cxx_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+  echo '#ifdef __cplusplus' >>confdefs.h
+  echo $ac_declaration      >>confdefs.h
+  echo '#endif'             >>confdefs.h
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+DEPDIR="${am__leading_dot}deps"
+
+          ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
+echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+   am__include=include
+   am__quote=
+   _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+      am__include=.include
+      am__quote="\""
+      _am_result=BSD
+   fi
+fi
+
+
+echo "$as_me:$LINENO: result: $_am_result" >&5
+echo "${ECHO_T}$_am_result" >&6
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then
+  enableval="$enable_dependency_tracking"
+
+fi;
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+
+
+if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+
+
+depcc="$CXX"  am_compiler_list=
+
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CXX_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CXX_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+
+
+if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+  am__fastdepCXX_TRUE=
+  am__fastdepCXX_FALSE='#'
+else
+  am__fastdepCXX_TRUE='#'
+  am__fastdepCXX_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_CC" && break
+done
+
+  CC=$ac_ct_CC
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+     "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+  (eval $ac_compiler --version </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+  (eval $ac_compiler -v </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+  (eval $ac_compiler -V </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cc_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std1 is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std1.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX			-qlanglvl=ansi
+# Ultrix and OSF/1	-std1
+# HP-UX 10.20 and later	-Ae
+# HP-UX older versions	-Aa -D_HPUX_SOURCE
+# SVR4			-Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext
+done
+rm -f conftest.$ac_ext conftest.$ac_objext
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+  x|xno)
+    echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+  *)
+    echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+    CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+# Some people use a C++ compiler to compile C.  Since we use `exit',
+# in C++ we need to declare it.  In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >conftest.$ac_ext <<_ACEOF
+#ifndef __cplusplus
+  choke me
+#endif
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  for ac_declaration in \
+   '' \
+   'extern "C" void std::exit (int) throw (); using std::exit;' \
+   'extern "C" void std::exit (int); using std::exit;' \
+   'extern "C" void exit (int) throw ();' \
+   'extern "C" void exit (int);' \
+   'void exit (int);'
+do
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+  echo '#ifdef __cplusplus' >>confdefs.h
+  echo $ac_declaration      >>confdefs.h
+  echo '#endif'             >>confdefs.h
+fi
+
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CC"   am_compiler_list=
+
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+
+
+if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if test "${ac_cv_prog_CPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
+else
+  { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Checks for libraries.
+
+# Checks for header files.
+
+# Checks for typedefs, structures, and compiler characteristics.
+
+# Checks for library functions.
+
+# Completion
+          ac_config_files="$ac_config_files Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+{
+  (set) 2>&1 |
+    case `(ac_space=' '; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+	"s/'/'\\\\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;;
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n \
+	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+} |
+  sed '
+     t clear
+     : clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     : end' >>confcache
+if diff $cache_file confcache >/dev/null 2>&1; then :; else
+  if test -w $cache_file; then
+    test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+    cat confcache >$cache_file
+  else
+    echo "not updating unwritable cache $cache_file"
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[	 ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[	 ]*$//;
+}'
+fi
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_i=`echo "$ac_i" |
+	 sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
+  # 2. Add them.
+  ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)$' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\/\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  case $0 in
+    *[\\/]* ) as_myself=$0 ;;
+    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+       ;;
+  esac
+  # We did not find ourselves, most probably we were run as `sh COMMAND'
+  # in which case we are not to be found in the path.
+  if test "x$as_myself" = x; then
+    as_myself=$0
+  fi
+  if test ! -f "$as_myself"; then
+    { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+	 case $as_dir in
+	 /*)
+	   if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+	     CONFIG_SHELL=$as_dir/$as_base
+	     export CONFIG_SHELL
+	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+	   fi;;
+	 esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='	' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" 	$as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.  Logging --version etc. is OK.
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by txt2tdb $as_me 1.0, which was
+generated by GNU Autoconf 2.59.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+  echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_headers"; then
+  echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_links"; then
+  echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_commands"; then
+  echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number, then exit
+  -q, --quiet      do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+		   instantiate the configuration file FILE
+  --header=FILE[:TEMPLATE]
+		   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <bug-autoconf@gnu.org>."
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+txt2tdb config.status 1.0
+configured by $0, generated by GNU Autoconf 2.59,
+  with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=$srcdir
+INSTALL="$INSTALL"
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "x$1" : 'x\([^=]*\)='`
+    ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  -*)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  *) # This is not an option, so the user has probably given explicit
+     # arguments.
+     ac_option=$1
+     ac_need_defaults=false;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --vers* | -V )
+    echo "$ac_cs_version"; exit 0 ;;
+  --he | --h)
+    # Conflict between --help and --header
+    { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; };;
+  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit 0 ;;
+  --debug | --d* | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+    ac_need_defaults=false;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1" ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+  echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+  exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+#
+# INIT-COMMANDS section.
+#
+
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+_ACEOF
+
+
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_config_target in $ac_config_targets
+do
+  case "$ac_config_target" in
+  # Handling of arguments.
+  "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+  "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+  "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason to put it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./confstat$$-$RANDOM
+  (umask 077 && mkdir $tmp)
+} ||
+{
+   echo "$me: cannot create a temporary directory in ." >&2
+   { (exit 1); exit 1; }
+}
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+  # Protect against being on the right side of a sed subst in config.status.
+  sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+   s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
+s,@SHELL@,$SHELL,;t t
+s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s,@exec_prefix@,$exec_prefix,;t t
+s,@prefix@,$prefix,;t t
+s,@program_transform_name@,$program_transform_name,;t t
+s,@bindir@,$bindir,;t t
+s,@sbindir@,$sbindir,;t t
+s,@libexecdir@,$libexecdir,;t t
+s,@datadir@,$datadir,;t t
+s,@sysconfdir@,$sysconfdir,;t t
+s,@sharedstatedir@,$sharedstatedir,;t t
+s,@localstatedir@,$localstatedir,;t t
+s,@libdir@,$libdir,;t t
+s,@includedir@,$includedir,;t t
+s,@oldincludedir@,$oldincludedir,;t t
+s,@infodir@,$infodir,;t t
+s,@mandir@,$mandir,;t t
+s,@build_alias@,$build_alias,;t t
+s,@host_alias@,$host_alias,;t t
+s,@target_alias@,$target_alias,;t t
+s,@DEFS@,$DEFS,;t t
+s,@ECHO_C@,$ECHO_C,;t t
+s,@ECHO_N@,$ECHO_N,;t t
+s,@ECHO_T@,$ECHO_T,;t t
+s,@LIBS@,$LIBS,;t t
+s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
+s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
+s,@INSTALL_DATA@,$INSTALL_DATA,;t t
+s,@CYGPATH_W@,$CYGPATH_W,;t t
+s,@PACKAGE@,$PACKAGE,;t t
+s,@VERSION@,$VERSION,;t t
+s,@ACLOCAL@,$ACLOCAL,;t t
+s,@AUTOCONF@,$AUTOCONF,;t t
+s,@AUTOMAKE@,$AUTOMAKE,;t t
+s,@AUTOHEADER@,$AUTOHEADER,;t t
+s,@MAKEINFO@,$MAKEINFO,;t t
+s,@install_sh@,$install_sh,;t t
+s,@STRIP@,$STRIP,;t t
+s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t
+s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t
+s,@mkdir_p@,$mkdir_p,;t t
+s,@AWK@,$AWK,;t t
+s,@SET_MAKE@,$SET_MAKE,;t t
+s,@am__leading_dot@,$am__leading_dot,;t t
+s,@AMTAR@,$AMTAR,;t t
+s,@am__tar@,$am__tar,;t t
+s,@am__untar@,$am__untar,;t t
+s,@build@,$build,;t t
+s,@build_cpu@,$build_cpu,;t t
+s,@build_vendor@,$build_vendor,;t t
+s,@build_os@,$build_os,;t t
+s,@host@,$host,;t t
+s,@host_cpu@,$host_cpu,;t t
+s,@host_vendor@,$host_vendor,;t t
+s,@host_os@,$host_os,;t t
+s,@CXX@,$CXX,;t t
+s,@CXXFLAGS@,$CXXFLAGS,;t t
+s,@LDFLAGS@,$LDFLAGS,;t t
+s,@CPPFLAGS@,$CPPFLAGS,;t t
+s,@ac_ct_CXX@,$ac_ct_CXX,;t t
+s,@EXEEXT@,$EXEEXT,;t t
+s,@OBJEXT@,$OBJEXT,;t t
+s,@DEPDIR@,$DEPDIR,;t t
+s,@am__include@,$am__include,;t t
+s,@am__quote@,$am__quote,;t t
+s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t
+s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t
+s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t
+s,@CXXDEPMODE@,$CXXDEPMODE,;t t
+s,@am__fastdepCXX_TRUE@,$am__fastdepCXX_TRUE,;t t
+s,@am__fastdepCXX_FALSE@,$am__fastdepCXX_FALSE,;t t
+s,@CC@,$CC,;t t
+s,@CFLAGS@,$CFLAGS,;t t
+s,@ac_ct_CC@,$ac_ct_CC,;t t
+s,@CCDEPMODE@,$CCDEPMODE,;t t
+s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t
+s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t
+s,@CPP@,$CPP,;t t
+s,@LIBOBJS@,$LIBOBJS,;t t
+s,@LTLIBOBJS@,$LTLIBOBJS,;t t
+CEOF
+
+_ACEOF
+
+  cat >>$CONFIG_STATUS <<\_ACEOF
+  # Split the substitutions into bite-sized pieces for seds with
+  # small command number limits, like on Digital OSF/1 and HP-UX.
+  ac_max_sed_lines=48
+  ac_sed_frag=1 # Number of current file.
+  ac_beg=1 # First line for current file.
+  ac_end=$ac_max_sed_lines # Line after last line for current file.
+  ac_more_lines=:
+  ac_sed_cmds=
+  while $ac_more_lines; do
+    if test $ac_beg -gt 1; then
+      sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    else
+      sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    fi
+    if test ! -s $tmp/subs.frag; then
+      ac_more_lines=false
+    else
+      # The purpose of the label and of the branching condition is to
+      # speed up the sed processing (if there are no `@' at all, there
+      # is no need to browse any of the substitutions).
+      # These are the two extra sed commands mentioned above.
+      (echo ':t
+  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+      if test -z "$ac_sed_cmds"; then
+	ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+      else
+	ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+      fi
+      ac_sed_frag=`expr $ac_sed_frag + 1`
+      ac_beg=$ac_end
+      ac_end=`expr $ac_end + $ac_max_sed_lines`
+    fi
+  done
+  if test -z "$ac_sed_cmds"; then
+    ac_sed_cmds=cat
+  fi
+fi # test -n "$CONFIG_FILES"
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case $ac_file in
+  - | *:- | *:-:* ) # input from stdin
+	cat >$tmp/stdin
+	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
+  esac
+
+  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+  ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+  ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
+
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
+  esac
+
+  if test x"$ac_file" != x-; then
+    { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    rm -f "$ac_file"
+  fi
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated by config.status.  */
+  if test x"$ac_file" = x-; then
+    configure_input=
+  else
+    configure_input="$ac_file.  "
+  fi
+  configure_input=$configure_input"Generated from `echo $ac_file_in |
+				     sed 's,.*/,,'` by configure."
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo $tmp/stdin ;;
+      [\\/$]*)
+	 # Absolute (can't be DOS-style, as IFS=:)
+	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+	 echo "$f";;
+      *) # Relative
+	 if test -f "$f"; then
+	   # Build tree
+	   echo "$f"
+	 elif test -f "$srcdir/$f"; then
+	   # Source tree
+	   echo "$srcdir/$f"
+	 else
+	   # /dev/null tree
+	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+	 fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@abs_srcdir@,$ac_abs_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s,@builddir@,$ac_builddir,;t t
+s,@abs_builddir@,$ac_abs_builddir,;t t
+s,@top_builddir@,$ac_top_builddir,;t t
+s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
+s,@INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+  rm -f $tmp/stdin
+  if test x"$ac_file" != x-; then
+    mv $tmp/out $ac_file
+  else
+    cat $tmp/out
+    rm -f $tmp/out
+  fi
+
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_HEADER section.
+#
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s,^\([	 ]*\)#\([	 ]*define[	 ][	 ]*\)'
+ac_dB='[	 ].*$,\1#\2'
+ac_dC=' '
+ac_dD=',;t'
+# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_uA='s,^\([	 ]*\)#\([	 ]*\)undef\([	 ][	 ]*\)'
+ac_uB='$,\1#\2define\3'
+ac_uC=' '
+ac_uD=',;t'
+
+for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case $ac_file in
+  - | *:- | *:-:* ) # input from stdin
+	cat >$tmp/stdin
+	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
+  esac
+
+  test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo $tmp/stdin ;;
+      [\\/$]*)
+	 # Absolute (can't be DOS-style, as IFS=:)
+	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+	 # Do quote $f, to prevent DOS paths from being IFS'd.
+	 echo "$f";;
+      *) # Relative
+	 if test -f "$f"; then
+	   # Build tree
+	   echo "$f"
+	 elif test -f "$srcdir/$f"; then
+	   # Source tree
+	   echo "$srcdir/$f"
+	 else
+	   # /dev/null tree
+	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+	 fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+  # Remove the trailing spaces.
+  sed 's/[	 ]*$//' $ac_file_inputs >$tmp/in
+
+_ACEOF
+
+# Transform confdefs.h into two sed scripts, `conftest.defines' and
+# `conftest.undefs', that substitutes the proper values into
+# config.h.in to produce config.h.  The first handles `#define'
+# templates, and the second `#undef' templates.
+# And first: Protect against being on the right side of a sed subst in
+# config.status.  Protect against being in an unquoted here document
+# in config.status.
+rm -f conftest.defines conftest.undefs
+# Using a here document instead of a string reduces the quoting nightmare.
+# Putting comments in sed scripts is not portable.
+#
+# `end' is used to avoid that the second main sed command (meant for
+# 0-ary CPP macros) applies to n-ary macro definitions.
+# See the Autoconf documentation for `clear'.
+cat >confdef2sed.sed <<\_ACEOF
+s/[\\&,]/\\&/g
+s,[\\$`],\\&,g
+t clear
+: clear
+s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 (][^	 (]*\)\(([^)]*)\)[	 ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
+t end
+s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 ][^	 ]*\)[	 ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
+: end
+_ACEOF
+# If some macros were called several times there might be several times
+# the same #defines, which is useless.  Nevertheless, we may not want to
+# sort them, since we want the *last* AC-DEFINE to be honored.
+uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
+sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
+rm -f confdef2sed.sed
+
+# This sed command replaces #undef with comments.  This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >>conftest.undefs <<\_ACEOF
+s,^[	 ]*#[	 ]*undef[	 ][	 ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
+_ACEOF
+
+# Break up conftest.defines because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo '  # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
+echo '  if grep "^[	 ]*#[	 ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
+echo '  # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
+echo '  :' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.defines >/dev/null
+do
+  # Write a limited-size here document to $tmp/defines.sed.
+  echo '  cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
+  # Speed up: don't consider the non `#define' lines.
+  echo '/^[	 ]*#[	 ]*define/!b' >>$CONFIG_STATUS
+  # Work around the forget-to-reset-the-flag bug.
+  echo 't clr' >>$CONFIG_STATUS
+  echo ': clr' >>$CONFIG_STATUS
+  sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
+  echo 'CEOF
+  sed -f $tmp/defines.sed $tmp/in >$tmp/out
+  rm -f $tmp/in
+  mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+  sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
+  rm -f conftest.defines
+  mv conftest.tail conftest.defines
+done
+rm -f conftest.defines
+echo '  fi # grep' >>$CONFIG_STATUS
+echo >>$CONFIG_STATUS
+
+# Break up conftest.undefs because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo '  # Handle all the #undef templates' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.undefs >/dev/null
+do
+  # Write a limited-size here document to $tmp/undefs.sed.
+  echo '  cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
+  # Speed up: don't consider the non `#undef'
+  echo '/^[	 ]*#[	 ]*undef/!b' >>$CONFIG_STATUS
+  # Work around the forget-to-reset-the-flag bug.
+  echo 't clr' >>$CONFIG_STATUS
+  echo ': clr' >>$CONFIG_STATUS
+  sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
+  echo 'CEOF
+  sed -f $tmp/undefs.sed $tmp/in >$tmp/out
+  rm -f $tmp/in
+  mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+  sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
+  rm -f conftest.undefs
+  mv conftest.tail conftest.undefs
+done
+rm -f conftest.undefs
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated by config.status.  */
+  if test x"$ac_file" = x-; then
+    echo "/* Generated by configure.  */" >$tmp/config.h
+  else
+    echo "/* $ac_file.  Generated by configure.  */" >$tmp/config.h
+  fi
+  cat $tmp/in >>$tmp/config.h
+  rm -f $tmp/in
+  if test x"$ac_file" != x-; then
+    if diff $ac_file $tmp/config.h >/dev/null 2>&1; then
+      { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+      { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+      rm -f $ac_file
+      mv $tmp/config.h $ac_file
+    fi
+  else
+    cat $tmp/config.h
+    rm -f $tmp/config.h
+  fi
+# Compute $ac_file's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $ac_file | $ac_file:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null ||
+$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X$ac_file : 'X\(//\)[^/]' \| \
+	 X$ac_file : 'X\(//\)$' \| \
+	 X$ac_file : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X$ac_file |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`/stamp-h$_am_stamp_count
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_COMMANDS section.
+#
+for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
+  ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
+  ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
+  ac_dir=`(dirname "$ac_dest") 2>/dev/null ||
+$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_dest" : 'X\(//\)[^/]' \| \
+	 X"$ac_dest" : 'X\(//\)$' \| \
+	 X"$ac_dest" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_dest" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+  ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
+
+
+  { echo "$as_me:$LINENO: executing $ac_dest commands" >&5
+echo "$as_me: executing $ac_dest commands" >&6;}
+  case $ac_dest in
+    depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
+  # Strip MF so we end up with the name of the file.
+  mf=`echo "$mf" | sed -e 's/:.*$//'`
+  # Check whether this is an Automake generated Makefile or not.
+  # We used to match only the files named `Makefile.in', but
+  # some people rename them; so instead we look at the file content.
+  # Grep'ing the first line is not enough: some people post-process
+  # each Makefile.in and add a new line on top of each file to say so.
+  # So let's grep whole file.
+  if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+    dirpart=`(dirname "$mf") 2>/dev/null ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$mf" : 'X\(//\)[^/]' \| \
+	 X"$mf" : 'X\(//\)$' \| \
+	 X"$mf" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  else
+    continue
+  fi
+  # Extract the definition of DEPDIR, am__include, and am__quote
+  # from the Makefile without running `make'.
+  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+  test -z "$DEPDIR" && continue
+  am__include=`sed -n 's/^am__include = //p' < "$mf"`
+  test -z "am__include" && continue
+  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+  # When using ansi2knr, U may be empty or an underscore; expand it
+  U=`sed -n 's/^U = //p' < "$mf"`
+  # Find all dependency output files, they are included files with
+  # $(DEPDIR) in their names.  We invoke sed twice because it is the
+  # simplest approach to changing $(DEPDIR) to its actual value in the
+  # expansion.
+  for file in `sed -n "
+    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+    # Make sure the directory exists.
+    test -f "$dirpart/$file" && continue
+    fdir=`(dirname "$file") 2>/dev/null ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$file" : 'X\(//\)[^/]' \| \
+	 X"$file" : 'X\(//\)$' \| \
+	 X"$file" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    { if $as_mkdir_p; then
+    mkdir -p $dirpart/$fdir
+  else
+    as_dir=$dirpart/$fdir
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5
+echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+    # echo "creating $dirpart/$file"
+    echo '# dummy' > "$dirpart/$file"
+  done
+done
+ ;;
+  esac
+done
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || { (exit 1); exit 1; }
+fi
+
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/txt2tdb-src/configure.ac
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/txt2tdb-src/configure.ac	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/txt2tdb-src/configure.ac	(revision 24799)
@@ -0,0 +1,25 @@
+#                                               -*- Autoconf -*-
+# Process this file with autoconf to produce a configure script.
+
+AC_PREREQ(2.59)
+AC_INIT([txt2tdb], [1.0], [jmt12@cs.waikato.ac.nz])
+AM_INIT_AUTOMAKE
+AC_CANONICAL_HOST
+AC_CONFIG_SRCDIR([txt2tdb.cpp])
+AC_CONFIG_HEADER([config.h])
+
+# Checks for programs.
+AC_PROG_CXX
+AC_PROG_CPP
+
+# Checks for libraries.
+
+# Checks for header files.
+
+# Checks for typedefs, structures, and compiler characteristics.
+
+# Checks for library functions.
+
+# Completion
+AC_CONFIG_FILES([Makefile])
+AC_OUTPUT
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/txt2tdb-src/install-sh
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/txt2tdb-src/install-sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/txt2tdb-src/install-sh	(revision 24799)
@@ -0,0 +1,323 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2005-05-14.22
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.  It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+chmodcmd="$chmodprog 0755"
+chowncmd=
+chgrpcmd=
+stripcmd=
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=
+dst=
+dir_arg=
+dstarg=
+no_target_directory=
+
+usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+-c         (ignored)
+-d         create directories instead of installing files.
+-g GROUP   $chgrpprog installed files to GROUP.
+-m MODE    $chmodprog installed files to MODE.
+-o USER    $chownprog installed files to USER.
+-s         $stripprog installed files.
+-t DIRECTORY  install into DIRECTORY.
+-T         report an error if DSTFILE is a directory.
+--help     display this help and exit.
+--version  display version info and exit.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
+"
+
+while test -n "$1"; do
+  case $1 in
+    -c) shift
+        continue;;
+
+    -d) dir_arg=true
+        shift
+        continue;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+        shift
+        shift
+        continue;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) chmodcmd="$chmodprog $2"
+        shift
+        shift
+        continue;;
+
+    -o) chowncmd="$chownprog $2"
+        shift
+        shift
+        continue;;
+
+    -s) stripcmd=$stripprog
+        shift
+        continue;;
+
+    -t) dstarg=$2
+	shift
+	shift
+	continue;;
+
+    -T) no_target_directory=true
+	shift
+	continue;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    *)  # When -d is used, all remaining arguments are directories to create.
+	# When -t is used, the destination is already specified.
+	test -n "$dir_arg$dstarg" && break
+        # Otherwise, the last argument is the destination.  Remove it from $@.
+	for arg
+	do
+          if test -n "$dstarg"; then
+	    # $@ is not empty: it contains at least $arg.
+	    set fnord "$@" "$dstarg"
+	    shift # fnord
+	  fi
+	  shift # arg
+	  dstarg=$arg
+	done
+	break;;
+  esac
+done
+
+if test -z "$1"; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call `install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+for src
+do
+  # Protect names starting with `-'.
+  case $src in
+    -*) src=./$src ;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    src=
+
+    if test -d "$dst"; then
+      mkdircmd=:
+      chmodcmd=
+    else
+      mkdircmd=$mkdirprog
+    fi
+  else
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dstarg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+
+    dst=$dstarg
+    # Protect names starting with `-'.
+    case $dst in
+      -*) dst=./$dst ;;
+    esac
+
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
+    if test -d "$dst"; then
+      if test -n "$no_target_directory"; then
+	echo "$0: $dstarg: Is a directory" >&2
+	exit 1
+      fi
+      dst=$dst/`basename "$src"`
+    fi
+  fi
+
+  # This sed command emulates the dirname command.
+  dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'`
+
+  # Make sure that the destination directory exists.
+
+  # Skip lots of stat calls in the usual case.
+  if test ! -d "$dstdir"; then
+    defaultIFS='
+	 '
+    IFS="${IFS-$defaultIFS}"
+
+    oIFS=$IFS
+    # Some sh's can't handle IFS=/ for some reason.
+    IFS='%'
+    set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
+    shift
+    IFS=$oIFS
+
+    pathcomp=
+
+    while test $# -ne 0 ; do
+      pathcomp=$pathcomp$1
+      shift
+      if test ! -d "$pathcomp"; then
+        $mkdirprog "$pathcomp"
+	# mkdir can fail with a `File exist' error in case several
+	# install-sh are creating the directory concurrently.  This
+	# is OK.
+	test -d "$pathcomp" || exit
+      fi
+      pathcomp=$pathcomp/
+    done
+  fi
+
+  if test -n "$dir_arg"; then
+    $doit $mkdircmd "$dst" \
+      && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
+      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
+      && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
+      && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
+
+  else
+    dstfile=`basename "$dst"`
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+    trap '(exit $?); exit' 1 2 13 15
+
+    # Copy the file name to the temp name.
+    $doit $cpprog "$src" "$dsttmp" &&
+
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
+      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
+      && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
+      && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
+
+    # Now rename the file to the real destination.
+    { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
+      || {
+	   # The rename failed, perhaps because mv can't rename something else
+	   # to itself, or perhaps because mv is so ancient that it does not
+	   # support -f.
+
+	   # Now remove or move aside any old file at destination location.
+	   # We try this two ways since rm can't unlink itself on some
+	   # systems and the destination file might be busy for other
+	   # reasons.  In this case, the final cleanup might fail but the new
+	   # file should still install successfully.
+	   {
+	     if test -f "$dstdir/$dstfile"; then
+	       $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
+	       || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
+	       || {
+		 echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
+		 (exit 1); exit 1
+	       }
+	     else
+	       :
+	     fi
+	   } &&
+
+	   # Now rename the file to the real destination.
+	   $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
+	 }
+    }
+  fi || { (exit 1); exit 1; }
+done
+
+# The final little trick to "correctly" pass the exit status to the exit trap.
+{
+  (exit 0); exit 0
+}
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
Index: /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/txt2tdb-src/txt2tdb.cpp
===================================================================
--- /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/txt2tdb-src/txt2tdb.cpp	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tdb-edit/trunk/src/src/txt2tdb-src/txt2tdb.cpp	(revision 24799)
@@ -0,0 +1,312 @@
+/**********************************************************************
+ *
+ * txt2tdb.cpp -- A utility to convert a stream of text, ala buildproc
+ *                encoded output, into a TDB file.
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * Copyright (C) 2011  The New Zealand Digital Library Project
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ **********************************************************************/
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#include <ospace\std\iostream>
+#elif defined(GSDL_USE_IOS_H)
+#include <iostream.h>
+#else
+#include <iostream>
+#endif
+
+#include <cstdlib>
+#include <cstring>
+
+#include <time.h>
+
+#include "tdb.h"
+#include "text_t.h"
+
+// use the standard namespace
+#if !defined (GSDL_NAMESPACE_BROKEN)
+#if defined(GSDL_USE_OBJECTSPACE)
+using namespace ospace::std;
+#else
+using namespace std;
+#endif
+#endif
+
+/**
+ */
+void
+printUsage (char *program_name)
+{
+  cerr << "usage: " << program_name << " [-append] database-name [-debug]" << endl << endl;
+  cerr << "options:" << endl;
+  cerr << " -append        append to existing database" << endl;
+  cerr << " -debug         add timing information to database" << endl << endl; 
+}
+/** printUsage() **/
+
+/*
+void
+debugLog(TDB_CONTEXT * tdb, char * msg_content)
+{
+  // Since this log will be used to track order of events, we need an indicator
+  // of time
+  time_t seconds = time(NULL);
+  // We also need some idea of what thread this is - let's try and use the PID
+  pid_t process_id = getpid();
+  // Append the message to the entry in the db (fixed key "debuglog")
+  TDB_DATA key_datum;
+  key_datum.dptr = (unsigned char *)"debuglog";
+  key_datum.dsize = 8;
+  text_t message = "[" + text_t(seconds) + "][" + text_t(process_id) + "] " + msg_content + "\n"; 
+  TDB_DATA msg_datum;
+  msg_datum.dptr = (unsigned char *) message.getcstr();
+  msg_datum.dsize = message.size();
+  if (tdb_append(tdb, key_datum, msg_datum) != 0)
+  {
+    cerr << "txt2tdb::debugLog() - tdb_append returned an error" << endl;
+    exit (0);
+  }
+}
+*/
+/** debugLog() **/
+
+/**
+ */
+int
+main (int argc, char *argv[])
+{
+  // sanity check
+  if (2 > argc || argc > 4)
+  {
+    printUsage (argv[0]);
+    exit (0);
+  }
+
+  char *dbname;
+  int append = 0;
+  int delkey = 0;
+  int debug = 0;
+  if (argc == 3)
+  {
+    if (strcmp (argv[1], "-append") == 0)
+    {
+      append = 1;
+      dbname = argv[2];
+    }
+    else if (strcmp(argv[2], "-debug") == 0)
+    {
+      dbname = argv[1];
+      debug = 1;
+    }
+    else
+    {
+      cerr << argv[1] << " is not a valid option." << endl << endl;
+      printUsage(argv[0]);
+      exit (0);
+    }
+  }
+  else if (argc == 4)
+  {
+    if (strcmp (argv[1], "-append") == 0 && strcmp (argv[3], "-debug") == 0)
+    {
+      append = 1;
+      dbname = argv[2];
+      debug = 1;
+    }
+    else
+    {
+      cerr << argv[1] << " is not a valid option." << endl << endl;
+      printUsage(argv[0]);
+      exit (0);
+    }
+  }
+  else
+  {
+    dbname = argv[1];
+  }
+
+  // open the database
+  int hash_size = 0;
+  int tdb_flags = TDB_DEFAULT; // Default = 0
+  if (append == 0)
+  {
+    tdb_flags = TDB_CLEAR_IF_FIRST;
+  }
+  // Disable file IO for testing purposes
+  /*tdb_flags = tdb_flags | TDB_INTERNAL;*/
+
+  int tdb_store_flags = TDB_DEFAULT; // used later when storing
+  int open_flags = O_RDWR | O_CREAT;
+  TDB_CONTEXT *tdb = tdb_open(dbname, hash_size, tdb_flags, open_flags, 0664);
+  if (!tdb)
+  {
+    cerr << "txt2tdb::main() - couldn't create " << dbname << endl;
+    exit (0);
+  }
+
+  // If we are debugging, we'll write that we just opened the connection
+  /*
+  if (debug)
+  {
+    debugLog(tdb, "opened connection to database for read/write");
+  }
+  */
+
+  char c;
+  cin.get(c);
+  while (!cin.eof())
+  {
+    int num_dashes = 0;
+    text_t key = "";
+    text_t value = "";
+
+    // Parse out 'key' from [key]\n
+    //  - scan for first occurrence of [
+    while (!cin.eof() && c != '[')
+    {
+      cin.get(c);
+    }
+    // - skip [
+    if (!cin.eof())
+    {
+      cin.get(c);
+    }
+    // - now look for closing ], building up 'key' as we go
+    while (!cin.eof() && c != ']')
+    {
+      key.push_back ((unsigned char)c);
+      cin.get(c);
+    }
+    if (!cin.eof())
+    {
+      // most likely an eol char, but if '-', then signifies record
+      // is to be deleted, not added
+      cin.get(c);
+      if (c == '-')
+      {
+        delkey = 1;
+      }
+      else
+      {
+        delkey = 0;
+      }
+    }
+    while (!cin.eof() && (c == '\n' || c == '\r'))
+    {
+      cin.get(c);
+    }
+    // - read in the value, watching for 70 dashes (the end)
+    text_t tmp = "";
+    while (!cin.eof() && (num_dashes < 70))
+    {
+      if (c == '\n')
+      {
+        tmp.push_back ((unsigned char)c);
+        num_dashes = 0;
+      }
+      else if (c == '\r')
+      {
+        // Here we are able to process both Windows-specific text files
+        // (containing carriage-return, newline) and Linux text files
+        // (containing only newline characters) by ignoring the Windows'
+        // carriage-return altogether so that we produce a uniform database
+        // file from either system's type of text file.
+        // If we don't ignore the carriage return here, txt.gz files
+        // produced on Windows cause a GS library running on Linux to break.
+        num_dashes = 0;
+      }
+      else if (c == '-')
+      {
+        tmp.push_back ((unsigned char)c);
+        ++num_dashes;
+      }
+      else
+      {
+        value += tmp;
+        value.push_back ((unsigned char)c);
+        tmp = "";
+        num_dashes = 0;
+      }
+      cin.get(c);
+    }
+
+    // We should now have a key/value pair. If the key is not an empty string
+    // store this key-value pair
+    if (!key.empty())
+    {
+      // convert key to a datum datatype
+      TDB_DATA key_data;
+      // [why are cstrings from text_t not unsigned? from what I can see we
+      //  explicitly cast to char * when we return]
+      key_data.dptr = (unsigned char*)key.getcstr();
+      if (key_data.dptr == NULL)
+      {
+        cerr << "NULL key_data.dptr" << endl;
+        exit (0);
+      }
+      key_data.dsize = key.size();
+      // - delete the given key if we've been asked to
+      if (delkey)
+      {
+        if (tdb_delete(tdb, key_data) < 0)
+        {
+          cerr << "tdb_delete returned an error" << endl;
+        }
+      }
+      // - otherwise add
+      else
+      {
+        // - convert value to a datum datatype
+        TDB_DATA value_data;
+        value_data.dptr = (unsigned char*)value.getcstr();
+        if (value_data.dptr == NULL)
+        {
+          cerr << "NULL value_data.dptr" << endl;
+          exit (0);
+        }
+        value_data.dsize = value.size();
+        // - store the value
+        if (tdb_store(tdb, key_data, value_data, tdb_store_flags) < 0)
+        {
+          cerr << "tdb_store returned an error" << endl;
+          exit (0);
+        }
+      }
+    }
+  }
+
+  // If we are debugging, we'll write that we are about to close the connection
+  /*
+  if (debug)
+  {
+    debugLog(tdb, "closing connection to database");
+  }
+  */
+
+  // Close the database connection
+  if (tdb_close(tdb) < 0)
+  {
+    cerr << "tdb_close returned an error" << endl;
+    exit (0);
+  }
+
+  return 0;
+}
Index: /main/tags/2.85/gs2-extensions/tika/trunk/java/perllib/plugins/TikaConverter.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/tika/trunk/java/perllib/plugins/TikaConverter.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tika/trunk/java/perllib/plugins/TikaConverter.pm	(revision 24799)
@@ -0,0 +1,208 @@
+###########################################################################
+#
+# TikaConverter - helper plugin that does various types of document
+#                 conversion with Apache Tika
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2010 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+package TikaConverter;
+
+use BaseMediaConverter;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+use gsprintf 'gsprintf';
+
+# these two variables mustn't be initialised here or they will get stuck 
+# at those values.
+our $tika_conversion_available; 
+our $no_tika_conversion_reason; 
+
+BEGIN {
+    @TikaConverter::ISA = ('BaseMediaConverter');
+
+    # Check that Tika is installed and available on the path 
+    $tika_conversion_available = 1;
+    $no_tika_conversion_reason = "";
+    
+    if (!defined $ENV{'GEXT_TIKA'}) {
+	$tika_conversion_available = 0;
+	$no_tika_conversion_reason = "gexttikanotinstalled";
+    }
+    else {
+	my $gextpb_home = $ENV{'GEXT_TIKA'};
+	my $pbajar = &util::filename_cat($gextpb_home,"lib","java","tika-app.jar");
+
+	if (!-e $pbajar) {
+	    print STDERR "Failed to find $pbajar\n";
+	    $tika_conversion_available = 0;
+	    $no_tika_conversion_reason = "gexttikajarnotinstalled";
+	}
+	else {
+	    # test to see if java is in path	 
+	    my $cmd = "java 2>&1";
+	    if ($ENV{'GSDLOS'} =~ /^windows/i) {
+		$cmd .= " >nul";
+	    }
+	    else {
+		$cmd .= " >/dev/null";
+	    }
+
+	    my $status = system($cmd);
+	    if ($status != 0) {
+		print STDERR "Testing for java\n";
+		print STDERR "Failed to run: $cmd\n";
+		print STDERR "$!\n";
+		$tika_conversion_available = 0;
+		$no_tika_conversion_reason = "tikanotinstalled";
+	    } 
+	}
+    }
+
+}
+
+my $arguments = [ ];
+
+my $options = { 'name' => "TikaConverter",
+		'desc' => "{TikaConverter.desc}",
+		'abstract' => "yes",
+		'inherits' => "yes",
+		'args' => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new BaseMediaConverter($pluginlist, $inputargs, $hashArgOptLists);
+
+    if ($self->{'info_only'}) {
+	# don't worry about any options etc
+	return bless $self, $class;
+    }
+    if ($tika_conversion_available) {
+	my $gextpb_home = $ENV{'GEXT_TIKA'};
+	my $pbajar = &util::filename_cat($gextpb_home,"lib","java","tika-app.jar");
+	my $launch_cmd = "";
+	
+	$self->{'tika_launch_cmd'} = $launch_cmd;
+    }
+    else {       
+	$self->{'no_tika_conversion_reason'} = $no_tika_conversion_reason;
+
+	my $outhandle = $self->{'outhandle'};
+	&gsprintf($outhandle, "TikaConverter: {TikaConverter.noconversionavailable} ({TikaConverter.$no_tika_conversion_reason})\n");
+    }  
+
+    $self->{'tika_conversion_available'} = $tika_conversion_available;
+    
+    return bless $self, $class;
+
+}
+
+sub init {
+    my $self = shift(@_);
+    my ($verbosity, $outhandle, $failhandle) = @_;
+
+    $self->{'ttmp_file_paths'} = ();
+}
+
+sub deinit {
+    my $self = shift(@_);
+
+    $self->clean_up_temporary_files();
+}
+
+
+sub convert {
+    my $self = shift(@_);
+    my ($source_file_full_path, $target_file_type) = @_;
+
+    return 0 unless $tika_conversion_available;
+    # check the filename
+    return 0 if ( !-f $source_file_full_path);
+
+    my $source_file_no_path = &File::Basename::basename($source_file_full_path);
+    # Determine the full name and path of the output file
+    my $target_file_path;
+    if ($self->{'enable_cache'}) {
+	$self->init_cache_for_file($source_file_full_path);
+	my $cache_dir = $self->{'cached_dir'};
+	my $file_root = $self->{'cached_file_root'};
+	#$file_root .= "_$convert_id" if ($convert_id ne "");
+	my $target_file = "$file_root.$target_file_type";
+	$target_file_path = &util::filename_cat($cache_dir,$target_file);
+    }
+    else {
+	# this is in gsdl/tmp. get a tmp filename in collection instead???
+	$target_file_path = &util::get_tmp_filename($target_file_type);
+	push(@{$self->{'ttmp_file_paths'}}, $target_file_path);
+    }
+
+    # Generate and run the convert command
+    my $convert_cmd = $self->{'launch_cmd'};
+    $convert_cmd .= " -html" if ($target_file_type eq "html");
+    my $convert_command .= " \"$source_file_full_path\" \"$target_file_path\"";
+
+    my $print_info = { 'message_prefix' => "Tika Conversion",
+		       'message' => "Converting $source_file_no_path to: $target_file_type" };
+    # $print_info->{'cache_mode'} = $cache_mode if ($cache_mode ne "");
+
+    my ($regenerated,$result,$had_error) 
+	= $self->autorun_general_cmd($convert_command,$source_file_full_path, $target_file_path,$print_info);
+    if ($had_error) {
+	return (0, $result,$target_file_path);
+    }
+    return (1, $result,$target_file_path);
+}
+
+sub convert_without_result {
+    my $self = shift(@_);
+
+    my $source_file_path = shift(@_);
+    my $target_file_type = shift(@_);
+    my $convert_options  = shift(@_) || "";
+    my $convert_id       = shift(@_) || "";
+
+    return $self->convert($source_file_path,$target_file_type,
+			  $convert_options,$convert_id,"without_result");
+}
+
+sub clean_up_temporary_files {
+    my $self = shift(@_);
+
+    foreach my $ttmp_file_path (@{$self->{'ttmp_file_paths'}}) {
+	if (-e $ttmp_file_path) {
+	    &util::rm($ttmp_file_path);
+	}
+    }
+
+    $self->{'ttmp_file_paths'} = ();
+}
+
+
+
+1;	
Index: /main/tags/2.85/gs2-extensions/tika/trunk/java/setup.bash
===================================================================
--- /main/tags/2.85/gs2-extensions/tika/trunk/java/setup.bash	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tika/trunk/java/setup.bash	(revision 24799)
@@ -0,0 +1,35 @@
+
+extdesc="the Tika Extension"
+
+full_setup=`pwd`/${BASH_SOURCE}
+fulldir=${full_setup%/*}
+fulldir=${fulldir%/.}
+
+if [ "x$GEXT_TIKA" = "x" ] ; then
+  export GEXT_TIKA=`pwd`
+
+  if [ -d "$GEXT_TIKA/bin/script" ] ; then
+    export PATH=$GEXT_TIKA/bin/script:$PATH
+  fi
+
+  if [ -d "$GEXT_TIKA/lib" ] ; then
+    if [ "$GSDLOS" = "linux" ] ; then
+      export LD_LIBRARY_PATH=$GEXT_TIKA/lib:$LD_LIBRARY_PATH
+    elif [ "$GSDLOS" = "darwin" ] ; then
+      export DYLD_LIBRARY_PATH=$GEXT_TIKA/lib:$DYLD_LIBRARY_PATH
+    fi
+  fi
+
+  extdir=${GEXT_TIKA##*/}
+
+  if [ "x$GSDLEXTS" = "x" ] ; then
+    export GSDLEXTS=$extdir
+  else 
+    export GSDLEXTS=$GSDLEXTS:$extdir
+  fi
+
+
+  echo "+Your environment is now setup for $extdesc"
+else
+  echo "+Your environment is already setup for $extdesc"
+fi
Index: /main/tags/2.85/gs2-extensions/tika/trunk/java/setup.bat
===================================================================
--- /main/tags/2.85/gs2-extensions/tika/trunk/java/setup.bat	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/tika/trunk/java/setup.bat	(revision 24799)
@@ -0,0 +1,60 @@
+@echo off
+pushd "%CD%"
+CD /D "%~dp0"
+
+set extdesc=the Tika Extension
+
+if "%OS%" == "Windows_NT" goto WinNT
+if "%OS%" == "" goto Win95
+if "%GSDLLANG%" == "en" echo Setup failed - your PATH has not been set
+if "%GSDLLANG%" == "es" echo No se pudo realizar la configuraci¢n - no se ha establecido la RUTA.
+if "%GSDLLANG%" == "fr" echo Echc de l'installation - votre variable PATH n'a pas t ajuste
+if "%GSDLLANG%" == "ru" echo áâ ­®¢ª  ­¥ ã€ « áì -  ­¥ ¡ë« ãáâ ­®¢«¥­
+goto End
+
+:WinNT
+set GEXT_TIKA=%CD%
+set PATH=%GEXT_TIKA%\bin\script;%PATH%
+set PATH=%GEXT_TIKA%\lib;%PATH%
+set GS_CP_SET=yes
+goto Success
+
+:Win95
+if "%1" == "SetEnv" goto Win95Env
+REM We'll invoke a second copy of the command processor to make
+REM sure there's enough environment space
+COMMAND /E:2048 /K %0 SetEnv
+goto End
+
+:Win95Env
+set GEXT_TIKA=%CD%
+set PATH="%GEXT_TIKA%\bin\script";"%PATH%"
+set PATH="%GEXT_TIKA%\lib";"%PATH%"
+set GS_CP_SET=yes
+goto Success
+
+:Success
+
+set fulldir=%~dp0
+
+:: strip off everything up to (and including) ext dir
+set extdir=%fulldir:*ext\=%
+
+:: remove trailing slash
+set extdir=%extdir:\=%
+
+if "x%GSDLEXTS%" == "x" (
+  set GSDLEXTS=%extdir%
+) else (
+  set GSDLEXTS=%GSDLEXTS%:%extdir%
+)
+
+echo +Your environment is now setup for %extdesc%
+
+:: Back to delayed expansion to avoid problems with environment
+:: variables with brackets in them, such as "Program Files (x86)"
+
+
+:End
+
+popd
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/CASCADE-MAKE.bat
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/CASCADE-MAKE.bat	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/CASCADE-MAKE.bat	(revision 24799)
@@ -0,0 +1,79 @@
+@echo off
+pushd "%CD%"
+CD /D "%~dp0"
+
+if "x%GSDLHOME%" == "x" (
+  REM This extension needs to have the main GSDL setup.bat sourced
+
+  echo Greenstone environment variable GSDLHOME not set.
+  echo Have you sourced the main installation\'s setup file, e.g. setup.bat?
+  goto ErrorExitNeg1 
+)
+
+if "x%$APACHE_HTTPD_HOME%" == "x" (
+  set APACHE_HTTPD_HOME=%GSDLHOME%\apache-httpd\windows
+)
+
+if not exist "%GSDLHOME%\apache-httpd" (
+  REM ... and it also needs to have been configured with --enable-apache-httpd
+  REM This is because the entension needs to add mod_flvx to the web server
+
+  echo Warning: Could not find the directory "%GSDLHOME%\apache-httpd"
+  echo          Has the main Greenstone been configure for this? 
+  echo          e.g. nmake /f win32.mak APACHE_HTTPD=1 [... other options]
+  echo.
+  echo => Only the build-time code for the extension will be compiled
+  set APACHE_HTTPD_HOME=
+)
+
+
+REM call cascade-make/bin/script/test-setup.bat
+call cascade-make/lib/cascade-lib.bat
+
+:: Guaranteed that GSDLOS has now been set
+
+
+echo "Test for directory in Windows might not be correct syntax!!"
+if not exist "%GEXTVIDEO_INSTALLED%" (
+  echo Creating %GEXTVIDEO_INSTALLED%
+  mkdir "%GEXTVIDEO_INSTALLED%"
+)
+
+set dirlist=build-srcpack
+
+if "x%APACHE_HTTPD_HOME%" != "x" (
+  set dirlist=%dirlist% runtime-srcpack
+)
+
+if exist "devel-srcpack" (
+  set dirlist=%dirlist% devel-srcpack
+)
+
+for /D %%d IN (%dirlist%) do (
+  echo Running %%d\CASCADE-MAKE.bat %*
+
+  (cd %%d && call CASCADE-MAKE.bat %* && cd ..)
+  
+  if not ERRORLEVEL 0 (
+    echo Error encountered running %%d\CASCADE-MAKE.bat
+    goto ErrorExitPos1
+  )
+)
+
+
+if  "%install%" == "1" (
+  type NOTES.txt
+)
+goto End
+
+:ErrorExitNeg1
+set ERRORLEVEL=-1
+goto End
+
+:ErrorExitPos1
+set ERRORLEVEL=1
+goto End
+
+:End
+
+popd
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,69 @@
+#!/bin/bash
+
+if [ "x$GSDLHOME" = "x" ] ; then
+  # This extension needs to have the main GSDL setup.bash sourced
+
+  echo "Greenstone environment variable GSDLHOME not set."
+  echo "Have you sourced the main installation's setup file, e.g. setup.bash?"
+  exit -1
+fi
+
+if [ -z $APACHE_HTTPD_HOME ] ; then
+  export APACHE_HTTPD_HOME=$GSDLHOME/apache-httpd/$GSDLOS
+fi
+
+if [ ! -d "$APACHE_HTTPD_HOME" ] ; then
+  # ... and it also needs to have been configured with --enable-apache-httpd
+  # This is because the entension needs to add mod_flvx to the web server
+
+  if [ -z $GSDL3SRCHOME  ] ; then
+    # Greenstone 2
+    echo "Warning: Did not find the directory \"$APACHE_HTTPD_HOME\""
+    echo "         Has the main Greenstone been configured for this? "
+    echo "         e.g. ./configure --enable-apache-httpd [... other options]"
+    echo ""
+    echo "=> Only the build-time code for the extension will be compiled"
+  else 
+    # Greenstone 3
+    echo "  Compiling build-time video extension for Greenstone3 use"
+  fi
+  export APACHE_HTTPD_HOME=
+fi
+
+
+source cascade-make/bin/script/test-setup.bash
+source cascade-make/lib/cascade-lib.bash
+
+# Guaranteed that GSDLOS has now been set
+
+if [ ! -e $GEXTVIDEO_INSTALLED ] ; then
+  echo "Creating $GEXTVIDEO_INSTALLED"
+  mkdir $GEXTVIDEO_INSTALLED
+fi
+
+dirlist="build-srcpack"
+
+if [ ! -z $APACHE_HTTPD_HOME ] ; then
+  dirlist="$dirlist runtime-srcpack"
+fi
+
+if [ -e devel-srcpack ] ; then
+  dirlist="$dirlist devel-srcpack"
+fi
+
+for d in $dirlist ; do
+  echo "Running $d/CASCADE-MAKE.sh $*"
+
+  (cd $d ; ./CASCADE-MAKE.sh $*)
+
+  if [ $? != 0 ] ; then
+    echo "Error encountered running $d/CASCADE-MAKE.sh"
+    exit 1
+  fi
+done
+
+
+
+if [ $install = "1" ] ; then
+  cat NOTES.txt
+fi
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/NOTES.txt
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/NOTES.txt	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/NOTES.txt	(revision 24799)
@@ -0,0 +1,12 @@
+
+Now add:
+
+  AddHandler flv-stream .flv 
+
+to the appropriate section of 
+
+  $GSDLHOME/apache-httpd/$GSDLOS/conf/httpd.conf
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/START-VIDEO-SERVER.sh.OBSOLETE
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/START-VIDEO-SERVER.sh.OBSOLETE	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/START-VIDEO-SERVER.sh.OBSOLETE	(revision 24799)
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+if [ "x$GEXTVIDEO" = "x" ] ; then
+  echo "Video extension environment variable GEXTVIDEO not set."
+  echo "Have you sourced the extension's setup file, e.g. setup.bash?"
+  exit
+fi
+
+echo "Starting Lighttpd: $GEXT_VIDEO_SERVER$GEXT_VIDEO_PREFIX"
+
+$GEXTVIDEO_INSTALLED/server/sbin/lighttpd -f $GEXTVIDEO_INSTALLED/server/conf/lighttpd.conf
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/CASCADE-MAKE.bat
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/CASCADE-MAKE.bat	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/CASCADE-MAKE.bat	(revision 24799)
@@ -0,0 +1,19 @@
+@echo off
+
+for /D %%d IN (packages) do (
+  echo   Running %%d\CASCADE-MAKE.bat %*
+
+  (cd %%d && call CASCADE-MAKE.bat %* && cd ..)
+
+  if not ERRORLEVEL 0 (
+    echo   Error encountered running %%d\CASCADE-MAKE.bat
+    goto ErrorExitPos1
+  )
+)
+goto End
+
+:ErrorExitPos1
+set ERRORLEVEL=1
+
+:End
+
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+for d in packages ; do
+  echo "  Running $d/CASCADE-MAKE.sh $*"
+
+  (cd $d; ./CASCADE-MAKE.sh $*)
+
+  if [ $? != 0 ] ; then
+    echo "  Error encountered running $d/CASCADE-MAKE.sh"
+    exit 1
+  fi
+done
+
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE.bat
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE.bat	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE.bat	(revision 24799)
@@ -0,0 +1,20 @@
+@echo off
+
+for /D %%d IN (A52DEC LAME FAAC FAAD2 LIBOGG LIBVORBIS LIBTHEORA LIBJPEG FFMPEG RUBY FLVTOOL2) do (
+  echo     Skipping CASCADE-MAKE\%%d.sh %* [compile script not written]
+
+REM  call CASCADE-MAKE\%%d.bat %*
+
+  if not ERRORLEVEL 0 (
+    echo   Error encountered running CASCADE-MAKE\%%d.bat
+    goto ErrorExitPos1
+  )
+)
+
+goto End
+
+:ErrorExitPos1
+set ERRORLEVEL=1
+goto End
+
+:End
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+
+for d in A52DEC LAME FAAC FAAD2 LIBOGG LIBVORBIS LIBTHEORA LIBJPEG FFMPEG LIBHIVE2 FFKEYFRAME RUBY FLVTOOL2 YAMDI MEDIAINFO ; do
+  echo "    Running CASCADE-MAKE/$d.sh $*"
+
+  ./CASCADE-MAKE/$d.sh $*
+
+  if [ $? != 0 ] ; then
+    echo "  Error encountered running CASCADE-MAKE/$d.sh"
+    exit 1
+  fi
+done
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/A52DEC.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/A52DEC.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/A52DEC.sh	(revision 24799)
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+package=a52dec
+version=-0.7.4
+
+progname=$0
+
+source ../../cascade-make/lib/cascade-lib.bash
+
+prefix=$GEXTVIDEO_INSTALLED
+
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version "$prefix"
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
+
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/FAAC.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/FAAC.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/FAAC.sh	(revision 24799)
@@ -0,0 +1,57 @@
+#!/bin/bash
+
+package=faac
+version=-1.26-mingw
+
+progname=$0
+
+source ../../cascade-make/lib/cascade-lib.bash
+
+prefix=$GEXTVIDEO_INSTALLED
+
+
+if [ $force_configure ] ; then
+  echo "*****"
+  echo "Assuming you have untarred faac-1.25.tar.gz and run 'dos2unix' on *.in"
+  echo "*****"
+  sleep 3
+fi
+
+opt_run_untar $force_untar $auto_untar $package $version
+if [ -d $package ] ; then
+  echo "Moving $package -> $package$version"
+  /bin/mv $package $package$version
+fi
+
+
+# Need own customized configure
+if [ $force_config = "1" ] ; then
+  echo "[pushd $package$version]"
+  ( cd $package$version ; 
+#    ./bootstrap
+    echo ./configure --prefix=$prefix --with-mp4v2 ; 
+    ./configure --prefix=$prefix --with-mp4v2 )
+  if [ $? != 0 ] ; then
+      echo "      Error encountered running *configure* stage of $progname"
+      exit 1
+  fi
+  echo "[popd]"
+else
+  if [ $auto_config = "1" ] ; then
+    echo "Found top-level for ${progname%.*} => no need to run ./configure"
+  fi
+fi
+
+
+#opt_run_configure $force_config $auto_config $package $version "$prefix" \
+#        --with-mp4v2
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
+
+
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/FAAD2.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/FAAD2.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/FAAD2.sh	(revision 24799)
@@ -0,0 +1,46 @@
+#!/bin/bash
+
+package=faad2
+version=-2.6.1-mingw
+
+progname=$0
+
+source ../../cascade-make/lib/cascade-lib.bash
+
+prefix=$GEXTVIDEO_INSTALLED
+
+
+opt_run_untar $force_untar $auto_untar $package $version
+if [ -d $package ] ; then
+  echo "Moving $package -> $package$version"
+  /bin/mv $package $package$version
+fi
+
+
+# Need own customized configure
+if [ $force_config = "1" ] ; then
+  echo "[pushd $package$version]"
+  ( cd $package$version ; 
+#    autoreconf -vif
+    echo ./configure --prefix=$prefix ; 
+    ./configure --prefix=$prefix )
+  if [ $? != 0 ] ; then
+      echo "      Error encountered running *configure* stage of $progname"
+      exit 1
+  fi
+  echo "[popd]"
+else
+  if [ $auto_config = "1" ] ; then
+    echo "Found top-level for ${progname%.*} => no need to run ./configure"
+  fi
+fi
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
+
+
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/FFKEYFRAME.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/FFKEYFRAME.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/FFKEYFRAME.sh	(revision 24799)
@@ -0,0 +1,57 @@
+#!/bin/bash
+
+package=ffkeyframe
+version=-0.1
+
+progname=$0
+
+source ../../cascade-make/bin/script/test-setup.bash
+source ../../cascade-make/lib/cascade-lib.bash
+
+prefix=$GEXTVIDEO_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+
+### opt_run_configure $force_config $auto_config $package $version "$prefix"
+
+### opt_run_make $compile   $package $version
+### opt_run_make $install   $package $version "install"
+
+
+
+
+
+#( cd ffkeyframe ; \
+#  ./configure --prefix=$GEXTVIDEO_INSTALLED/cmdline --enable-shared --enable-static --enable-swscaler --enable-libmp3lame --enable-liba52 --enable-gpl --enable-libogg --enable-libvorbis --enable-libfaac --enable-libfaad --extra-ldflags=-L$GEXTVIDEO_INSTALLED/cmdline/lib/ --extra-cflags=-I$GEXTVIDEO_INSTALLED/cmdline/include )
+#
+#if [ $? != 0 ] ; then
+#    echo "      Error encountered running *configure* stage of $progname"
+#    exit 1
+#fi
+
+if [ $compile = "1" ] ; then
+  ( cd $package$version ; \
+    make -I ../ffmpeg-jul21-2007 allhive)
+
+  if [ $? != 0 ] ; then
+      echo "      Error encountered running *make* stage of $progname"
+      exit 1
+  fi
+fi
+
+
+if [ $install = "1" ] ; then
+  ( cd $package$version ; \
+    make -I ../ffmpeg-jul21-2007 install-hive )
+
+  if [ $? != 0 ] ; then
+      echo "      Error encountered running *install* stage of $progname"
+      exit 1
+  fi
+fi
+
+
+opt_run_make $clean     $package $version "hiveclean"
+opt_run_make $distclean $package $version "hivedistclean"
+
+opt_run_tarclean $tarclean $package $version
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/FFMPEG.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/FFMPEG.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/FFMPEG.sh	(revision 24799)
@@ -0,0 +1,39 @@
+#!/bin/bash
+
+package=ffmpeg
+
+# If changing this version number, don't forget to update FFKEYFRAME.sh
+version=-jul21-2007
+
+
+
+progname=$0
+
+source ../../cascade-make/bin/script/test-setup.bash
+source ../../cascade-make/lib/cascade-lib.bash
+
+prefix=$GEXTVIDEO_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+if [ -d $package ] ; then
+  echo "Moving $package -> $package$version"
+  /bin/mv $package $package$version
+fi
+
+opt_run_configure $force_config $auto_config $package $version "$prefix" \
+     "--enable-shared --enable-static --enable-swscaler \
+      --enable-libmp3lame --enable-liba52 --enable-gpl \
+      --enable-libogg --enable-libvorbis \
+      --enable-libfaac --enable-libfaad \
+      --extra-ldflags=-L$prefix/lib/ \
+      --extra-cflags=-I$prefix/include"
+
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
+
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/FLVTOOL2.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/FLVTOOL2.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/FLVTOOL2.sh	(revision 24799)
@@ -0,0 +1,95 @@
+#!/bin/bash
+
+package=flvtool2
+version=-1.0.6
+
+progname=$0
+
+source ../../cascade-make/lib/cascade-lib.bash
+
+prefix=$GEXTVIDEO_INSTALLED
+
+
+opt_run_untar $force_untar $auto_untar $package $version ".tgz"
+
+
+
+if [ -d $package$version ] ; then
+  echo "****"
+  echo "* Always (for now) have it run configure stage for ruby"
+  echo "****"
+
+
+  ( echo "[pushd $package$version]"a ; \
+    cd $package$version ; \
+    ruby setup.rb config --prefix=$prefix )
+
+    if [ $? != 0 ] ; then
+        echo "      Error encountered running *config* stage of $progname"
+        exit 1
+    fi
+    echo "[popd]"
+fi
+
+
+if [ $compile = "1" ] ; then
+  ( echo "[pushd $package$version]" ; \
+    cd $package$version ; \
+    ruby setup.rb setup )
+
+  if [ $? != 0 ] ; then
+      echo "      Error encountered running *setup/compile* stage of $progname"
+      exit 1
+  fi
+  echo "[popd]"
+
+fi
+
+
+if [ $install = "1" ] ; then
+  ( echo "[pushd $package$version]" ; \
+    cd $package$version ; \
+    ruby setup.rb install )
+
+  if [ $? != 0 ] ; then
+      echo "      Error encountered running *install* stage of $progname"
+      exit 1
+  fi
+  echo "[popd]"
+fi
+
+# What are the equivalent calls for clean and distclean ???
+
+#opt_run_make $clean     $package $version "clean"
+
+# Does this make any sense?
+if [ $clean = "XXX" ] ; then
+  ( echo "[pushd $package$version]" ; \
+    cd $package$version ; \
+    ruby setup.rb clean )
+
+  if [ $? != 0 ] ; then
+      echo "      Error encountered running *install* stage of $progname"
+      exit 1
+  fi
+  echo "[popd]"
+fi
+
+
+#opt_run_make $distclean $package $version "distclean"
+
+# Does this make any sense???
+
+if [ $distclean = "XXX" ] ; then
+  ( echo "[pushd $package$version]" ; \
+    cd $package$version ; \
+    ruby setup.rb distclean )
+
+  if [ $? != 0 ] ; then
+      echo "      Error encountered running *install* stage of $progname"
+      exit 1
+  fi
+  echo "[popd]"
+fi
+
+opt_run_tarclean $tarclean $package $version
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/LAME.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/LAME.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/LAME.sh	(revision 24799)
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+package=lame
+version=-3.97
+
+progname=$0
+
+source ../../cascade-make/lib/cascade-lib.bash
+
+prefix=$GEXTVIDEO_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version "$prefix"
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
+
+
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/LIBHIVE2.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/LIBHIVE2.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/LIBHIVE2.sh	(revision 24799)
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+package=hive2-ffmpeg
+version=-apr20-2009
+
+progname=$0
+
+source ../../cascade-make/bin/script/test-setup.bash
+source ../../cascade-make/lib/cascade-lib.bash
+
+prefix=$GEXTVIDEO_INSTALLED
+
+
+opt_run_untar $force_untar $auto_untar $package $version
+# opt_run_configure $force_config $auto_config $package $version "$prefix"
+
+opt_run_make $compile   $package $version
+#opt_run_make $install   $package $version 
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/LIBJPEG.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/LIBJPEG.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/LIBJPEG.sh	(revision 24799)
@@ -0,0 +1,27 @@
+#!/bin/bash
+
+package=jpeg
+version=-6b
+
+progname=$0
+
+source ../../cascade-make/lib/cascade-lib.bash
+
+prefix=$GEXTVIDEO_INSTALLED
+
+
+opt_run_untar $force_untar $auto_untar $package $version
+if [ -d "$package" ] ; then
+  mv "${package}src" "$package$version"
+fi
+
+opt_run_configure $force_config $auto_config $package $version "$prefix" \
+        --enable-static
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install-lib"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/LIBOGG.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/LIBOGG.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/LIBOGG.sh	(revision 24799)
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+package=libogg
+version=-1.1.3
+
+progname=$0
+
+source ../../cascade-make/lib/cascade-lib.bash
+
+prefix=$GEXTVIDEO_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version "$prefix"
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
+
+
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/LIBTHEORA.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/LIBTHEORA.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/LIBTHEORA.sh	(revision 24799)
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+package=libtheora
+version=-1.0
+
+progname=$0
+
+source ../../cascade-make/lib/cascade-lib.bash
+
+prefix=$GEXTVIDEO_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version .tar.bz2
+opt_run_configure $force_config $auto_config $package $version "$prefix" \
+         "--with-ogg=$prefix --with-vorbis=$prefix"
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
+
+
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/LIBVORBIS.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/LIBVORBIS.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/LIBVORBIS.sh	(revision 24799)
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+package=libvorbis
+version=-1.2.0
+
+progname=$0
+
+source ../../cascade-make/lib/cascade-lib.bash
+
+prefix=$GEXTVIDEO_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version "$prefix" \
+         "--with-ogg=$prefix"
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
+
+
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/MEDIAINFO.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/MEDIAINFO.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/MEDIAINFO.sh	(revision 24799)
@@ -0,0 +1,53 @@
+#!/bin/bash
+
+package=MediaInfo-CLI
+version=-0.7
+
+progname=$0
+
+source ../../cascade-make/lib/cascade-lib.bash
+
+prefix=$GEXTVIDEO_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version ".tar.bz2"
+
+#opt_run_configure $force_config $auto_config $package $version "$prefix" \
+#         "--with-ogg=$prefix"
+#opt_run_make $compile   $package $version
+#opt_run_make $install   $package $version "install"
+#opt_run_make $clean     $package $version "clean"
+#opt_run_make $distclean $package $version "distclean"
+
+
+if [ -d $package$version ] ; then
+  echo "****"
+  echo "* Always (for now) have it run the automatic script for MediaInfo"
+  echo "****"
+
+# Run an automatic script that will configure and compile MediaInfo with the dependencies
+  ( echo "[pushd $package$version]"a ; \
+    cd $package$version ; \
+    ./CLI_Compile.sh )
+
+    if [ $? != 0 ] ; then
+        echo "      Error encountered running the automatic script of $progname"
+        exit 1
+    fi
+    echo "[popd]"
+fi
+
+
+if [ $install = "1" ] ; then
+  ( echo "[pushd $package$version]" ; \
+    cd $package$version/MediaInfo/Project/GNU/CLI ; \
+    cp -p mediainfo $GEXTVIDEO_INSTALLED/bin )
+
+  if [ $? != 0 ] ; then
+      echo "      Error encountered running *install* stage of $progname"
+      exit 1
+  fi
+  echo "[popd]"
+fi
+
+
+opt_run_tarclean $tarclean $package $version
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/RUBY.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/RUBY.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/RUBY.sh	(revision 24799)
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+package=ruby
+#version=-1.8.6
+version=-1.8.7-p174
+
+progname=$0
+
+source ../../cascade-make/lib/cascade-lib.bash
+
+prefix=$GEXTVIDEO_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version "$prefix"
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
+
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/YAMDI.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/YAMDI.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/CASCADE-MAKE/YAMDI.sh	(revision 24799)
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+package=yamdi
+version=-1.4-gs
+
+progname=$0
+
+source ../../cascade-make/lib/cascade-lib.bash
+
+export PREFIX=$GEXTVIDEO_INSTALLED
+
+opt_run_untar $force_untar $auto_untar $package $version
+
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+
+opt_run_tarclean $tarclean $package $version
+
+
+
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/jpegsrc.v6b.tar.gz
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/jpegsrc.v6b.tar.gz	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/build-srcpack/packages/jpegsrc.v6b.tar.gz	(revision 24799)
@@ -0,0 +1,1 @@
+link jpeg-6b.tar.gz
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/cascade-make.old/bin/script/test-setup.bash
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/cascade-make.old/bin/script/test-setup.bash	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/cascade-make.old/bin/script/test-setup.bash	(revision 24799)
@@ -0,0 +1,8 @@
+
+
+if [ "x$GEXTVIDEO" = "x" ] ; then
+  echo "Video extension environment variable GEXTVIDEO not set."
+  echo "Have you sourced the extension's setup file, e.g. setup.bash?"
+  exit -1
+fi
+
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/cascade-make.old/lib/cascade-lib.bash
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/cascade-make.old/lib/cascade-lib.bash	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/cascade-make.old/lib/cascade-lib.bash	(revision 24799)
@@ -0,0 +1,193 @@
+
+if test -z $GSDLOS ; then
+  GSDLOS=`uname -s | tr '[A-Z]' '[a-z]'`
+  # check for running bash under cygwin
+  if test "`echo $GSDLOS | sed 's/cygwin//'`" != "$GSDLOS" ;
+  then
+    GSDLOS=windows
+  fi
+  export GSDLOS
+fi
+
+
+run_untar()
+{
+  local package=$1
+  local version=$2
+  local ext=$3
+
+  tar_args="";
+
+  if [ $ext = ".tar.gz" ] ; then
+    tar_args="xvzf"
+  elif [ $ext = ".tgz" ] ; then
+    tar_args="xvzf"
+  elif [ $ext = ".tar.bz2" ] ; then
+    tar_args="xvjf"
+  elif [ $ext = ".tar.bz" ] ; then
+    tar_args="xvjf"
+  elif [ $ext = ".tar" ] ; then
+    tar_args="xvf"
+  else 
+    echo "Warning: Unrecognized extension: $ext"
+    echo "Assuming tarred, gzipped file"
+    tar_args="xvjf"
+  fi
+
+
+  echo tar $tar_args $package$version$ext 
+  tar $tar_args $package$version$ext
+
+  if [ $? != 0 ] ; then
+    echo "      Error encountered running *untar* stage of $progname"
+    exit 1
+  fi
+}
+
+opt_run_tarclean()
+{
+  local type=$1
+  local package=$2
+  local version=$3
+
+  if [ $type = "1" ] ; then
+
+    local dir=$package$version
+    if [ -d $dir ] ; then
+      echo /bin/rm -rf $dir
+      /bin/rm -rf $dir
+
+      if [ $? != 0 ] ; then
+        echo "      Error encountered running *tarclean* stage of $progname"
+        exit 1
+      fi
+    else 
+      echo "Unable to find directory $dir"
+    fi
+  fi
+}
+
+opt_run_untar()
+{
+  local force_untar=$1
+  local auto_untar=$2
+  local package=$3
+  local version=$4
+
+  local ext="";
+
+  if [ ! -z "$5" ] ; then
+    ext=$5
+  else 
+    ext=".tar.gz"
+  fi
+
+  if [ $force_untar = "1" ] ; then
+    run_untar $package $version $ext
+  elif [ $auto_config = "1" ] ; then
+    if [ -d $package$version ] ; then
+      echo "Found untarred version of $package$version$ext => no need to untar"
+    else
+      run_untar $package $version $ext
+    fi
+  fi
+}
+
+
+opt_run_configure()
+{
+  local force_config=$1
+  local auto_config=$2
+  local package=$3
+  local version=$4
+  local prefix=$5
+  local opt_args="";
+
+  if [ ! -z "$6" ] ; then
+    opt_args=$6
+  fi
+
+  if [ $force_config = "1" ] ; then
+    echo "[pushd $package$version]"
+    ( cd $package$version ; \
+      echo ./configure --prefix="$prefix" $opt_args ; \
+      ./configure --prefix="$prefix" $opt_args )
+    if [ $? != 0 ] ; then
+        echo "      Error encountered running *configure* stage of $progname"
+        exit 1
+    fi
+    echo "[popd]"
+  else
+    if [ $auto_config = "1" ] ; then
+      echo "Found top-level for ${progname%.*} => no need to run ./configure"
+    fi
+  fi
+}
+
+
+opt_run_make()
+{
+  local type=$1
+  local package=$2
+  local version=$3
+  local opt_target=""
+
+  if [ ! -z "$4" ] ; then
+    opt_target=$4
+  fi
+
+  if [ $type = "1" ] ; then
+    ( cd $package$version ; \
+      make $opt_target)
+
+    if [ $? != 0 ] ; then
+        echo "      Error encountered running *make $target* stage of $progname"
+        exit 1
+    fi
+  fi
+}
+
+
+
+force_untar=0
+auto_untar=0
+
+force_config=0
+auto_config=0
+
+compile=0
+install=0
+clean=0
+distclean=0
+tarclean=0
+
+if [ $# -gt 0 ] ; then
+  for cmd in $* ; do
+    echo $cmd
+    if   [ $cmd = "untar" ] ;     then force_untar=1
+    elif [ $cmd = "configure" ] ; then force_config=1
+    elif [ $cmd = "compile" ]   ; then compile=1
+    elif [ $cmd = "install" ]   ; then install=1  
+    elif [ $cmd = "clean" ]     ; then clean=1  
+    elif [ $cmd = "distclean" ] ; then distclean=1
+    elif [ $cmd = "tarclean" ] ;  then tarclean=1
+    fi
+  done
+else
+  # defaults
+  auto_untar=1
+  auto_config=1
+  compile=1
+  install=1
+  clean=0
+  distclean=0
+  tarclean=0
+fi
+
+if [ $auto_config = "1" ] ; then
+  if [ ! -e $package$version/Makefile ] &&  [ ! -e $package$version/config.h ] ; then
+    force_config=1
+  fi
+
+fi
+
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/cascade-make.old/lib/cascade-lib.bat
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/cascade-make.old/lib/cascade-lib.bat	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/cascade-make.old/lib/cascade-lib.bat	(revision 24799)
@@ -0,0 +1,38 @@
+@echo off
+
+if "x%GSDLOS%" == "x" (
+  set GSDLOS=windows
+)
+
+set force_untar=0
+set auto_untar=0
+
+set compile=0
+set install=0
+set clean=0
+set distclean=0
+set tarclean=0
+set installclean=0
+
+if "%*" NEQ "" (
+  for /D %%c IN (%*) do (
+    echo %%c
+    if "%%c" == "untar"        set force_untar=1
+    if "%%c" == "compile"      set compile=1
+    if "%%c" == "install"      set install=1  
+    if "%%c" == "clean"        set clean=1  
+    if "%%c" == "distclean"    set distclean=1
+    if "%%c" == "tarclean"     set tarclean=1
+    if "%%c" == "installclean" set installclean=1
+  )
+) else (
+  :: defaults
+  set auto_untar=1
+  set compile=1
+  set install=1
+  set clean=0
+  set distclean=0
+  set tarclean=0
+  set installclean=0
+)
+
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/macros/document.dm
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/macros/document.dm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/macros/document.dm	(revision 24799)
@@ -0,0 +1,128 @@
+package document
+
+_baseurl_{_httpassocdir_/_1_}
+
+
+_videoplayer_{
+
+<div class="player" id="FlowPlayerDiv" style="width: 352px; height: 290px">
+  <object type="application/x-shockwave-flash"
+    data="_httpprefix_/ext/video/web/flash/FlowPlayerLP.swf"
+    width="352" height="290" id="FlowPlayer">
+      <param name="allowScriptAccess" value="always" />
+      <param name="movie" value="_httpprefix_/ext/video/web/flash/FlowPlayerLP.swf" />
+      <param name="quality" value="high" />
+      <param name="scaleMode" value="showAll" />
+      <param name="allowfullscreen" value="true" />
+      <param name="allowNetworking" value="all" />
+      <param name="flashvars" value="config=\{
+         autoPlay: _If_(_3_,_3_,false),
+         autoBuffering: true,
+         loop: false,
+         initialScale: 'orig',
+         showLoopButton: false,
+         showPlayListButtons: false,
+         allowFullScreen: true,
+         useNativeFullScreen: true,
+         progressBarColor2: '0x308030',
+         progressBarColor1: '0x60d060',
+         videoFile: '_baseurl_(_1_)/_2_',
+         streamingServer: 'apache'
+       \}" />
+  </object>
+</div>
+}
+
+_audioplayer_{
+
+<div class="player" id="FlowPlayerDiv">
+  <object type="application/x-shockwave-flash"
+    data="_httpprefix_/ext/video/web/flash/FlowPlayerLP.swf"
+    width="352" height="22" id="FlowPlayer">
+      <param name="allowScriptAccess" value="always" />
+      <param name="movie" value="_httpprefix_/ext/video/web/flash/FlowPlayerLP.swf" />
+      <param name="quality" value="high" />
+      <param name="scaleMode" value="showAll" />
+      <param name="allowfullscreen" value="false" />
+      <param name="allowNetworking" value="all" />
+      <param name="flashvars" value="config=\{
+         autoPlay: _If_(_3_,_3_,false),
+         autoBuffering: true,
+         loop: false,
+         initialScale: 'orig',
+         showLoopButton: false,
+         showPlayListButtons: false,
+         showFullScreenButton: false,
+         showMenu: false,
+         allowFullScreen: false,
+         progressBarColor2: '0x308030',
+         progressBarColor1: '0x60d060',
+         videoFile: '_baseurl_(_1_)/_2_',
+         streamingServer: 'apache'
+       \}" />
+  </object>
+</div>
+}
+
+
+_pagescriptfileextra_ {
+
+<script type="text/javascript" src="_httpvideoscript_/document.js"></script>
+
+}
+
+
+# Don't bother going through the "document could be large, continue?"
+# => go directly there
+
+_imageexpandtext_ {_docbutton_(_httpcurrentdocument_&amp;gt=2,_textEXPANDTEXT_,_texticonexpandtext_)}
+
+_optnavigationbar_ {
+
+_If_("_cgiargonlytext_" eq "1" ,, 
+
+_:optnavigationbar_
+)
+}
+
+
+_blankheader_ {}
+
+# header overridden for text pages
+_textheader_ {
+_cgihead_
+_htmlhead_
+_blankheader_
+_startspacer_
+
+_If_("_cgiargonlytext_" eq "1" ,, 
+
+<!-- document:textheader -->
+<div id="banner">
+<div class="pageinfo"><p class="bannerlinks">_globallinks_</p></div>
+<br>
+</div> <!-- banner -->
+)
+}
+
+_textheader_ [v=1] {_cgihead_
+_htmlhead_
+_globallinks_
+}
+
+
+
+_footer_ {
+
+_If_("_cgiargonlytext_" eq "1" ,, 
+
+</div> <!-- document:footer -->
+
+<div class="navarrowsbottom">
+_navarrowsbottom_
+</div>
+}
+
+_endspacer__htmlfooter_
+}
+
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/macros/extra.dm
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/macros/extra.dm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/macros/extra.dm	(revision 24799)
@@ -0,0 +1,44 @@
+package Global
+
+_httpvideoweb_    {_httpprefix_/ext/video-and-audio/web}
+_httpvideoimages_ {_httpvideoweb_/images}
+_httpvideoscript_ {_httpvideoweb_/script}
+_httpvideostyle_  {_httpvideoweb_/style}
+_httpvideoflash_  {_httpvideoweb_/flash}
+_httpvideojava_   {_httpvideoweb_/java}
+
+
+_httpcurrentdocumentwithvplayer_ {_httpcurrentdocument_&showvplayer=1}
+_httpcurrentdocumentnovplayer_   {_httpcurrentdocument_&showvplayer=}
+
+_notranscript_ {No transcript available}
+
+package document
+
+_pagescriptextra_ {
+
+  function extraFlowplayerShow() \{
+      var dandp = document.getElementById("DandPPlayer");
+      dandp.style.display = "none";
+      var pandh = document.getElementById("PandHPlayer");
+      pandh.style.display = "block";
+      flowplayershow();
+  \}
+
+  function extraFlowplayerHide() \{
+      var pandh = document.getElementById("PandHPlayer");
+      pandh.style.display = "none";
+      var dandp = document.getElementById("DandPPlayer");
+      dandp.style.display = "block";
+      flowplayerhide();
+  \}
+}
+
+
+_displayandhideflowplayer_ {
+
+  <a id="DandPPlayer" style="display: block;"
+     href="javascript:extraFlowplayerShow()">Display and Play _1_</a>
+  <a id="PandHPlayer" style="display: none;"
+     href="javascript:extraFlowplayerHide()">Pause and Hide _1_</a>
+}
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/perllib/plugins/AudioConverter.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/perllib/plugins/AudioConverter.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/perllib/plugins/AudioConverter.pm	(revision 24799)
@@ -0,0 +1,200 @@
+###########################################################################
+#
+# AudioConverter - helper plugin that does audio conversion
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2008 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+package AudioConverter;
+
+use MultimediaConverter;
+
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+use gsprintf 'gsprintf';
+
+BEGIN {
+    @AudioConverter::ISA = ('MultimediaConverter');
+}
+
+
+my $arguments = [
+		 ];
+
+my $options = { 'name' => "ImageConverter",
+		'desc' => "{ImageConverter.desc}",
+		'abstract' => "yes",
+		'inherits' => "yes",
+		'args' => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new MultimediaConverter($pluginlist, $inputargs, $hashArgOptLists, 1);
+
+
+    return bless $self, $class;
+
+}
+
+# Discover the characteristics of a audio file.
+
+#  Equivalent step to that in ImagePlugin that uses ImageMagicks's
+#  'indentify' utility
+
+#  Here we use 'ffmpeg' for audio but for consistency keep the Perl
+#  method name the same as before
+
+
+sub identify { 
+    my ($audio, $outhandle, $verbosity) = @_;
+
+    # Use the ffmpeg command to get the file specs
+    my $command = "ffmpeg -i \"$audio\"";
+
+    print $outhandle "  $command\n" if ($verbosity > 2);
+    my $result = '';
+    $result = `$command 2>&1`;
+    print $outhandle "  $result\n" if ($verbosity > 4);
+
+    # Read the type, width, and height etc.
+    my $vtype =  'unknown';
+    my $vcodec = 'unknown';
+    my $width =  'unknown';
+    my $height = 'unknown';
+    my $fps    = 'unknown';
+
+    my $atype =  'unknown';
+    my $afreq =  'unknown';
+    my $achan =  'unknown';
+    my $arate =  'unknown';
+
+    my $audio_safe = quotemeta $audio;
+
+    # strip off everything up to filename
+    $result =~ s/^.*\'$audio_safe\'://s;
+
+    if ($result =~ m/Audio: (\w+), (\d+) Hz, (\w+)(?:, (\d+.*))?/m) {
+	$atype = $1;
+	$afreq = $2;
+	$achan = $3;
+	$arate = $4 if (defined $4);
+    }
+
+    # Read the duration
+    my $duration = "unknown";
+    if ($result =~ m/Duration: (\d+:\d+:\d+\.\d+)/m) {
+	$duration = $1;
+    }
+    print $outhandle "  file: $audio:\t $atype, $duration\n" 
+	if ($verbosity > 2);
+
+    if ($verbosity >3) {
+	print $outhandle "\t freq = $afreq Hz, $achan, $arate\n";
+    }
+
+    # Return the specs
+    return ($duration, -s $audio, $atype,$afreq,$achan,$arate);
+}
+
+
+
+sub audio_converto_cmd
+{
+    my $self = shift (@_);
+    my ($originalfilename,$converttotype) = @_;
+
+    my $output_dir = $self->{'cached_dir'};
+    my $iaudio_root = $self->{'cached_file_root'};
+
+    
+    my $file = "$iaudio_root.$converttotype";
+    my $filename = &util::filename_cat($output_dir,$file);
+    
+    my $exp_duration = $self->{'exp_duration'};
+    my $t_opt = (defined $exp_duration) ? "-t $exp_duration" : "";
+    
+    my $main_opts = "-y $t_opt";
+    
+
+    my $originalfilename_gsdlenv = $self->gsdlhome_independent($originalfilename);
+    my $filename_gsdlenv = $self->gsdlhome_independent($filename);
+    
+    
+    my $convertto_cmd = "ffmpeg $main_opts -i \"$originalfilename_gsdlenv\"";
+    $convertto_cmd .= " -y \"$filename_gsdlenv\"";
+    
+    return $convertto_cmd;
+}
+
+
+
+sub audio_stream_cmd
+{
+    my $self = shift (@_);
+    my ($iaudio_filename,
+	$streaming_bitrate,$streaming_size, 
+	$opt_streaming_achan, $opt_streaming_arate) = @_;
+
+    my $streaming_achan 
+	= (defined $opt_streaming_achan) ? $opt_streaming_achan : 2;
+
+    my $streaming_arate 
+	= (defined $opt_streaming_arate) ? $opt_streaming_arate : 22050;
+
+    my $output_dir = $self->{'cached_dir'};
+    my $iaudio_root = $self->{'cached_file_root'};
+
+    my $mp3_file = "${iaudio_root}_stream.mp3";
+    my $mp3_filename = &util::filename_cat($output_dir,$mp3_file);
+
+    my $exp_duration = $self->{'exp_duration'};
+    my $t_opt = (defined $exp_duration) ? "-t $exp_duration" : "";
+
+    my $main_opts = "-y $t_opt";
+
+    my $bitrate_opt = "-b $streaming_bitrate";
+    my $stream_opts .= " -ac $streaming_achan -ar $streaming_arate";
+
+
+    my $all_opts = "$main_opts $stream_opts"; 
+
+    my $ffmpeg_cmd;
+
+    my $iaudio_filename_gsdlenv = $self->gsdlhome_independent($iaudio_filename);
+    my $mp3_filename_gsdlenv = $self->gsdlhome_independent($mp3_filename);
+
+    
+    $ffmpeg_cmd = "ffmpeg -i \"$iaudio_filename_gsdlenv\" $all_opts -y \"$mp3_filename_gsdlenv\"";
+
+    return ($ffmpeg_cmd,$mp3_filename,$mp3_file);
+}
+
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/perllib/plugins/AudioPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/perllib/plugins/AudioPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/perllib/plugins/AudioPlugin.pm	(revision 24799)
@@ -0,0 +1,365 @@
+######################################################################
+#
+# AudioPlugin.pm -- plugin for processing video largely based on ImagePlug
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+package AudioPlugin;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+no strict 'subs';
+
+use gsprintf;
+
+use MultimediaPlugin;
+use AudioConverter;
+
+sub BEGIN {
+    @AudioPlugin::ISA = ('MultimediaPlugin', 'AudioConverter');
+}
+
+
+my $arguments =
+    [ { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'deft' => &get_default_process_exp(),
+	'reqd' => "no" },
+      { 'name' => "converttotype",
+	'desc' => "{AudioPlugin.converttotype}",
+	'type' => "string",
+	'deft' => "",
+	'reqd' => "no" },
+      { 'name' => "converttobitrate",
+	'desc' => "{AudioPlugin.converttobitrate}",
+	'type' => "string",
+	'deft' => "128k",
+	'reqd' => "no" },
+      { 'name' => "streamingbitrate",
+	'desc' => "{AudioPlugin.streamingbitrate}",
+	'type' => "string",
+	'deft' => "200k",
+	'reqd' => "no" } ];
+
+my $options = { 'name'     => "AudioPlugin",
+		'desc'     => "{AudioPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    new AudioConverter($pluginlist, $inputargs, $hashArgOptLists);
+    my $self = new MultimediaPlugin($pluginlist, $inputargs, $hashArgOptLists);
+
+
+    return bless $self, $class;
+}
+
+
+sub begin {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $processor, $maxdocs) = @_;
+
+    $self->SUPER::begin(@_);
+    $self->AudioConverter::begin(@_); 
+}
+
+
+sub init {
+    my $self = shift (@_);
+    my ($verbosity, $outhandle, $failhandle) = @_;
+
+    $self->SUPER::init(@_);
+    $self->AudioConverter::init(@_); 
+}
+
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+    return q^(?i)\.(mp3|au|aiff?|aifc|wav|ogg|flac|shn)$^; 
+}
+
+
+
+# Create the keyframes, thumbnail and screenview images, and discover
+# the Video's size, width, and height using the ffmpeg utility.
+
+sub run_convert {
+    my $self = shift (@_);
+    my $base_dir = shift (@_);
+    my $filename = shift (@_);   # filename with full path
+    my $file = shift (@_);       # filename without path
+    my $doc_obj = shift (@_);
+
+    my $section = $doc_obj->get_top_section();
+    
+    my $verbosity = $self->{'verbosity'};
+    my $outhandle = $self->{'outhandle'};
+
+    # check the filename is okay
+    return 0 if ($file eq "" || $filename eq "");
+
+    my $minimumsize = $self->{'minimumsize'};
+    if (defined $minimumsize && (-s $filename < $minimumsize)) {
+        print $outhandle "AudioPlugin: \"$filename\" too small, skipping\n"
+	    if ($verbosity > 1);
+    }
+
+    my ($aduration,$asize,$atype,$afreq,$achan,$arate) 
+	= &AudioConverter::identify($filename, $outhandle, $verbosity);
+
+    if ($aduration eq "N/A") {
+	print $outhandle "Unable to determine duration of $file\n";
+	$aduration = undef;
+    }
+
+    my ($dur_hour,$dur_min,$dur_sec) 
+	= ($aduration =~ m/(\d+):(\d+):(\d+\.\d+)/);
+
+    my $total_dur_secs = undef;
+
+    if (defined $dur_hour && defined $dur_min && defined *dur_sec) {
+	$total_dur_secs = $dur_hour*3600 + $dur_min*60 + $dur_sec;
+    }
+
+
+    # Convert the audio to a new type (if required).
+    my $converttotype = $self->{'converttotype'};
+    my $converttosize = $self->{'converttosize'};
+
+    # shorten duration prcessed for experimentation purposes
+    my $exp_duration = undef;
+    
+    my $excerpt_duration = $self->{'excerpt_duration'};
+
+    if ((defined $excerpt_duration) && ($excerpt_duration ne "")) {
+	$exp_duration = $excerpt_duration;
+	my ($hh,$mm,$ss,$ms) = ($exp_duration =~ m/^(\d\d):(\d\d):(\d\d)\.?(\d\d)?/);
+	my $excerpt_dur_in_secs = $hh * 3600 + $mm * 60 + $ss;
+
+	if (defined $total_dur_secs) {
+	    if ($excerpt_dur_in_secs > $total_dur_secs) {
+		# clip is already shorter than requested video excerpt duration
+		# set exp_duration back to undefined
+		$exp_duration = undef;
+	    }
+	}
+	else {
+	    $exp_duration = undef;
+	}
+    }
+
+
+    if (defined $exp_duration)
+    {
+	print $outhandle "Only encoding first $exp_duration of video.\n";
+	$self->{'exp_duration'} = $exp_duration;
+    }
+
+    my $ascii_only_filenames = $self->{'use_ascii_only_filenames'};
+
+    $self->init_cache_for_file($filename);
+
+
+    my $originalfilename = undef;
+    my $type = "unknown";
+
+    my $output_dir = $self->{'cached_dir'};
+    my $iaudio_root = $self->{'cached_file_root'};
+
+    my $convertto_regenerated = 0;
+    if (($converttotype ne "" && $filename !~ m/$converttotype$/i)) {
+
+	$originalfilename = $filename;
+
+	my $convertto_command = $self->audio_convertto_cmd($filename,$converttotype);
+
+	my $convertto_result;
+	my $convertto_error;
+	
+	my $convertto_options = { @{$self->{'ffmpeg_monitor'}},
+				  'message_prefix' => "Convert to",
+				  'message' => "Converting audio to $converttotype" }; 
+
+	($convertto_regenerated,$convertto_result,$convertto_error)
+	    = $self->run_cached_general_cmd($convertto_command,$filename,$convertto_options);
+						    
+	$type = $converttotype;
+    }
+    
+
+    # Add the audio metadata
+
+    my $file_unicode = pack("U0C*", map { ord($_) } split(//,$file)); # force explicitly to unicode
+
+    $file_unicode =~ s/\x{2018}|\x{2019}|\x{201C}|\x{201D}//g; # remove smart quotes as cause problem in URL for video server
+    $file_unicode =~ s/\x{2013}/\-/g; # change en-dash to '-' as again causes problems for video server
+
+##    print STDERR "**** file metadata = ", &gsprintf::debug_unicode_string($file_unicode), "\n";
+
+    
+    # split filename on char if specified
+    if ($file_unicode =~ m/\-/) {
+
+	my @file_split = split(/\s*\-\s*/,$file_unicode);
+	my $creator = shift @file_split;
+	my $title = shift @file_split;
+
+	$title =~ s/\..*?$//;
+	$title =~ s/^(.)/\u$1/;
+
+	$doc_obj->add_utf8_metadata($section,"Title",$title);
+
+	my @creator_split = split(/\s+and\s+/,$creator);
+	foreach my $c (@creator_split) {
+	    $doc_obj->add_utf8_metadata($section,"Creator",$c);
+	}
+    }
+
+    $file = $file_unicode;
+    my $filemeta = $self->filename_to_utf8_metadata($file);
+    my $filemeta_url_safe = $self->url_safe($filemeta);
+
+    $doc_obj->add_utf8_metadata ($section, "Audio", $filemeta_url_safe);
+
+    # Also want to set filename as 'Source' metadata to be
+    # consistent with other plugins
+    $doc_obj->add_utf8_metadata ($section, "Source", $filemeta_url_safe);
+
+
+    if ($atype ne " ") {
+	$type = $atype;
+    }
+    
+    $doc_obj->add_metadata ($section, "FileFormat", $type);
+    $doc_obj->add_metadata ($section, "FileSize",   $asize);
+
+    $doc_obj->add_metadata ($section, "AudioType",     $atype);
+    $doc_obj->add_metadata ($section, "AudioDuration", $aduration);
+
+    $doc_obj->add_metadata ($section, "AudioFreq",     $afreq);
+    $doc_obj->add_metadata ($section, "AudioChannels", $achan);
+    $doc_obj->add_metadata ($section, "AudioRate",     $arate);
+
+    $doc_obj->add_utf8_metadata ($section, "srclink", 
+			    "<a href=\"_httpprefix_/collect/[collection]/index/assoc/[assocfilepath]/[Audio]\">");
+    $doc_obj->add_utf8_metadata ($section, "/srclink", "</a>");
+    $doc_obj->add_metadata ($section, "srcicon", "[AudioType]");
+
+    # Add the image as an associated file
+    $doc_obj->associate_file($filename,$file,"audio/$type",$section);
+
+
+
+
+    my $streamable_regenerated = 0;
+    my $optionally_run_general_cmd 
+	= ($convertto_regenerated) ? "regenerate_general_cmd" : "run_cached_general_cmd";
+
+    if ($self->{'enable_streaming'}) {
+
+	# Even if the original file or 'converttotype' is set to MP3
+	# we'll still go ahead and generate this MP3 as it might very
+	# well have different settings (such as a lower sample rate)
+
+	my $streaming_bitrate = $self->{'streamingbitrate'};
+	my $streaming_size    = $self->{'streamingsize'};
+	
+	
+	my ($stream_cmd,$mp3_filename,$mp3_file) 
+	    = $self->audio_stream_cmd($originalfilename || $filename,
+				      $streaming_bitrate, $streaming_size);
+	
+	
+	my $streamable_options = { @{$self->{'ffmpeg_monitor'}},
+				   'message_prefix' => "Stream",
+				   'message' => "Generating streamable audio: $mp3_file" }; 
+	
+	my $streamable_result;
+	my $streamable_had_error;
+	($streamable_regenerated,$streamable_result,$streamable_had_error)
+	    = $self->$optionally_run_general_cmd($stream_cmd,$mp3_filename,$streamable_options);
+	
+	if (!$streamable_had_error) {
+	    
+	    my $streamable_url = $mp3_file;
+	    my $streamable_url_safe = $self->url_safe($streamable_url);
+	    
+	    $doc_obj->add_utf8_metadata ($section, "streamableaudio", $streamable_url_safe);
+	    $doc_obj->associate_file($mp3_filename,$mp3_file,"audio/mpeg",
+				     $section);
+	}
+	
+	# The following aren't currently used
+	
+	$self->{'mp3_file'} = $mp3_file;
+	$self->{'mp3_filename'} = $mp3_filename;
+    }
+
+
+    return $type;
+}
+
+
+
+
+sub read_into_doc_obj {
+    my $self = shift (@_);  
+    my ($pluginfo, $base_dir, $file, $block_hash, $metadata, $processor, $maxdocs, $total_count, $gli) = @_;
+
+    $self->{'media_type'} = "audio";
+
+    my ($rv,$doc_obj) = $self->SUPER::read_into_doc_obj(@_);
+
+    if ($rv != 1) {
+	return ($rv,$doc_obj);
+    }
+    
+    $self->{'media_type'} = undef;
+
+    return ($rv,$doc_obj);
+}
+
+
+
+1;
+
+
+
+
+
+
+
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/perllib/plugins/MultimediaConverter.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/perllib/plugins/MultimediaConverter.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/perllib/plugins/MultimediaConverter.pm	(revision 24799)
@@ -0,0 +1,308 @@
+###########################################################################
+#
+# MultimediaConverter - helper plugin that does audio and video conversion using ffmpeg
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2008 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+package MultimediaConverter;
+
+use BaseMediaConverter;
+
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+use gsprintf 'gsprintf';
+
+BEGIN {
+    @MultimediaConverter::ISA = ('BaseMediaConverter');
+}
+
+my $arguments = [
+      { 'name' => "converttotype",
+	'desc' => "{ImageConverter.converttotype}",
+	'type' => "string",
+	'deft' => "",
+	'reqd' => "no" },
+      { 'name' => "minimumsize",
+	'desc' => "{ImageConverter.minimumsize}",
+	'type' => "int",
+	'deft' => "100",
+	'range' => "1,",
+	'reqd' => "no" },
+		 ];
+
+my $options = { 'name' => "MultimediaConverter",
+		'desc' => "{MultimediaConverter.desc}",
+		'abstract' => "yes",
+		'inherits' => "yes",
+		'args' => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new BaseMediaConverter($pluginlist, $inputargs, $hashArgOptLists, 1);
+
+
+    return bless $self, $class;
+
+}
+
+
+
+# needs to be called after BasePlugin init, so that outhandle is set up.
+sub init {
+    my $self = shift(@_);
+
+    my $outhandle = $self->{'outhandle'};
+
+    $self->{'tmp_file_paths'} = ();
+
+    # Check that ffmpeg is installed and available on the path 
+    my $multimedia_conversion_available = 1;
+    my $no_multimedia_conversion_reason = "";
+
+    # None of this works very well on Windows 95/98...
+    if ($ENV{'GSDLOS'} eq "windows" && !Win32::IsWinNT()) {
+	$multimedia_conversion_available = 0;
+	$no_multimedia_conversion_reason = "win95notsupported";
+    } else {
+
+	my $result = `ffmpeg -h 2>&1`;
+
+	if (!defined $result || $result !~ m/^FFmpeg version/m) {
+	    $self->{'ffmpeg_installed'} = 0;
+	    print $outhandle $result;
+	    $multimedia_conversion_available = 0;
+	    $no_multimedia_conversion_reason = "ffmpegnotinstalled";
+	}
+	else {
+	    $self->{'ffmpeg_installed'} = 1;
+	}
+    }
+
+    $self->{'multimedia_conversion_available'} = $multimedia_conversion_available;
+    $self->{'no_multimedia_conversion_reason'} = $no_multimedia_conversion_reason;
+
+    if ($self->{'multimedia_conversion_available'} == 0) {
+	&gsprintf($outhandle, "MultimediaConverter: {MultimediaConverter.noconversionavailable} ({MultimediaConverter.".$self->{'no_multimedia_conversion_reason'}."})\n");
+    }
+       
+}
+	
+
+
+
+sub identify { 
+    my ($filename, $outhandle, $verbosity) = @_;
+
+    die "MultimediaConvert::identify() needs to be defined by inheriting plugin";
+}
+
+
+
+sub init_cache_for_file {
+    my $self = shift(@_);
+
+    my ($media_filename) = @_;
+
+    $self->SUPER::init_cache_for_file($media_filename);
+
+
+    # This should probably be replaced with Anu's work that replaced
+    # non-ASCII chars with URL encodings
+
+    my $ascii_only_filenames = $self->{'use_ascii_only_filenams'};
+
+    if (defined $ascii_only_filenames && ($ascii_only_filenames)) {
+	my $file_root = $self->{'cached_file_root'};
+	$self->{'cached_file_root'} = ascii_only_filename($file_root);
+    }
+				  
+    my @ffmpeg_monitor   = ( 'monitor_init'   , "MultimediaConverter::unbuffered_monitor_init",
+			     'monitor_line'   , "MultimediaConverter::ffmpeg_monitor_line",
+			     'monitor_deinit' , "MultimediaConverter::unbuffered_monitor_deinit" );
+					
+					
+    $self->{'ffmpeg_monitor'} = \@ffmpeg_monitor;
+
+  my @handbrake_monitor   = ( 'monitor_init'   , "MultimediaConverter::unbuffered_monitor_init",
+			     'monitor_line'   , "MultimediaConverter::handbrake_monitor_line",
+			     'monitor_deinit' , "MultimediaConverter::unbuffered_monitor_deinit" );
+					
+					
+    $self->{'handbrake_monitor'} = \@handbrake_monitor;
+
+}
+
+
+
+
+sub ascii_only_filename
+{
+    my ($file) = @_;
+
+    my $file_unicode = pack("U0C*", map { ord($_) } split(//,$file)); # force explicitly to unicode
+
+    my @ascii_only_chars 
+	= map { $_ >= 128 # if non-ascii
+		    ? "" 
+		    :  chr($_) } unpack("U*", $file_unicode); # unpack Unicode characters
+
+    my $ascii_file = join("",@ascii_only_chars);
+
+    if ($ascii_file eq "") {
+	print STDERR "Warning: filename includes no ASCII characters\n";
+	print STDERR "         Keeping as original filename\n";
+	$ascii_file = $file;
+    }
+
+    return $ascii_file;
+}
+
+
+sub remove_difficult_chars
+{
+    my $self = shift @_;
+
+    my ($file) = @_;
+
+    # remove problematic characters from filename that make using it in a URL difficult
+
+    my $file_unicode = pack("U0C*", map { ord($_) } split(//,$file)); # force explicitly to unicode
+
+    my $url = $file_unicode;
+    $url =~ s/\x{2018}|\x{2019}|\x{201C}|\x{201D}//g; # remove smart quotes as cause problem in URL for streaming web server
+    $url =~ s/\x{2013}/\-/g; # change en-dash to '-' as again causes problems for streaming web server
+    
+    return $url;
+}
+
+
+sub url_safe
+{
+    my $self = shift @_;
+
+    my ($file) = @_;
+    
+    my @url_utf8_chars 
+	= map { $_ >= 128 # if non-ascii
+		    ? "%" . sprintf("%02X", $_) 
+		    :  chr($_) } unpack("U*", $file); # unpack Unicode characters
+
+    my $url = join("",@url_utf8_chars);
+
+
+    return $url;
+}
+
+
+
+sub gsdlhome_independent
+{
+    my $self = shift @_;
+    my ($filename) = @_;
+
+    my $gsdlhome = $ENV{'GSDLHOME'};
+    $gsdlhome = &util::filename_to_regex($gsdlhome);
+
+    my $filename_gsdlenv = $filename;
+
+    if ($ENV{'GSDLOS'} =~ /^windows$/i) {
+	$filename_gsdlenv =~ s@^$gsdlhome@%GSDLHOME%@;
+    }
+    else {
+	$filename_gsdlenv =~ s@^$gsdlhome@\$GSDLHOME@;
+    }
+
+    return $filename_gsdlenv;
+}
+
+
+sub unbuffered_monitor_init
+{
+    my $saved_record_sep = $/;
+    $/ = "\r";
+
+    my $saved_buffer_len = $|;
+    $| = 1;
+
+    my $saved_rec = { 'saved_record_sep' => $saved_record_sep,
+		      'saved_buffer_len' => $saved_buffer_len };
+
+    return $saved_rec;
+}
+
+
+
+sub unbuffered_monitor_deinit
+{
+    my ($saved_rec) = @_;
+
+    my $saved_record_sep = $saved_rec->{'saved_record_sep'};
+    my $saved_buffer_len = $saved_rec->{'saved_buffer_len'};
+
+    $/ = $saved_record_sep;
+    $| = $saved_buffer_len;
+}
+
+
+sub ffmpeg_monitor_line
+{
+    my ($line) = @_;
+    
+    my $had_error = 0;
+    my $generate_dot = 0;
+	
+    if ($line =~ m/^frame=/) 
+    {
+	$generate_dot = 1;
+    }
+
+    return ($had_error,$generate_dot);
+}
+
+
+sub handbrake_monitor_line
+{
+    my ($line) = @_;
+    
+    my $had_error = 0;
+    my $generate_dot = 0;
+	
+    if ($line =~ m/^Encoding:/) 
+    {
+	    print STDERR $line;
+    }
+	else {
+		$generate_dot = 1;
+	}
+
+    return ($had_error,$generate_dot);
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/perllib/plugins/MultimediaPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/perllib/plugins/MultimediaPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/perllib/plugins/MultimediaPlugin.pm	(revision 24799)
@@ -0,0 +1,291 @@
+######################################################################
+#
+# MultimediaPlugin.pm -- internal plugin to support processing audio and video
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# -- Largely modeled on how ImagePlugin works 
+
+package MultimediaPlugin;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+no strict 'subs';
+
+use gsprintf;
+
+use BasePlugin;
+
+sub BEGIN {
+    @MultimediaPlugin::ISA = ('BasePlugin');
+
+    if (!defined $ENV{'GEXTVIDEO'}) {
+	print STDERR "Warning: Greenstone Video extension not detected.\n";
+    }
+
+}
+
+
+
+ # do later the description
+my $arguments =
+    [ { 'name' => "use_ascii_only_filenames",
+	'desc' => "{VideoPlug.use_ascii_only_filenames}",
+	'type' => "flag",
+	'reqd' => "no" },
+      { 'name' => "excerpt_duration",
+	'desc' => "{MultimediaPlug.excerpt_duration}",
+	'type' => "string",
+	'deft' => "",
+	'reqd' => "no" },
+      { 'name' => "converttotype",
+	'desc' => "{MultimediaPlug.converttotype}",
+	'type' => "string",
+	'deft' => "",
+	'reqd' => "no" },
+	  { 'name' => "enable_streaming",
+	'desc' => "{MultimediaPlug.enable_streaming}",
+	'type' => "enum",
+	'list' => [{'name' => "disabled", 'desc' => "Do not create any video file optimised for streaming over the Internet."},
+		       {'name' => "flv", 'desc' => "Uses the FLV format for streaming media. Better to target old computers."},
+		       {'name' => "mp4", 'desc' => "Uses the MP4 container with H264 and AAC codecs. Better quality at very low bitrates but more ressources intensive."},
+			   {'name' => "direct", 'desc' => "Uses the original video file for direct streaming. The video player should be compatible with the format used!"}],
+	'deft' => "disabled",
+	'reqd' => "no" }];
+
+my $options = { 'name'     => "MultimediaPlugin",
+		'desc'     => "{MultimediaPlug.desc}",
+		'abstract' => "yes",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new BasePlugin($pluginlist, $inputargs, $hashArgOptLists);
+
+    # Check that ffmpeg is installed and available on the path (except for Windows 95/98)
+    # This test is "inherited" from ImagePlugin where ImageMagick support
+    # for building cannot be used on these two versions of Windows as they
+    # do not have enough flexablity in the use of stdout and stderr to
+    # support how our code works.  It seems reasonable to assume the
+    # same is true for MultimediaPlugin work using ffmpeg.
+
+    if (($ENV{'GSDLOS'} ne "windows" || Win32::IsWinNT())) {
+
+	my $result = `ffmpeg -h 2>&1`;
+
+	if (!defined $result || $result !~ m/^FFmpeg version/m) {
+	    $self->{'ffmpeg_installed'} = 0;
+	    if (defined $result) {
+		print STDERR $result;
+	    }
+	    else {
+		print STDERR "Unable to find ffmpeg\n";
+	    }
+	}
+	else {
+	    $self->{'ffmpeg_installed'} = 1;
+	}
+
+    }
+
+    return bless $self, $class;
+}
+
+
+
+sub begin {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $processor, $maxdocs) = @_;
+
+    $self->SUPER::begin(@_);
+
+    $self->{'base_dir'} = $base_dir;
+}
+
+
+sub init {
+    my $self = shift (@_);
+    my ($verbosity, $outhandle, $failhandle) = @_;
+
+    $self->SUPER::init(@_);
+}
+
+# Want to hash on doc.xml rather than original file which in the case of 
+# audio and video can be HUGE
+
+sub get_oid_hash_type {
+
+    my $self = shift (@_);
+
+    return "hash_on_ga_xml";
+}
+
+
+
+# Create the keyframes, thumbnail and screenview images, and discover
+# the Video's size, width, and height using the ffmpeg utility.
+
+sub run_convert {
+    my $self = shift (@_);
+
+    die "$self The inheriting class must implement run_convert method";
+}
+
+
+sub read_into_doc_obj {
+    my $self = shift (@_);  
+    my ($pluginfo, $base_dir, $file, $block_hash, $metadata, $processor, $maxdocs, $total_count, $gli) = @_;
+
+    my $outhandle = $self->{'outhandle'};
+
+    # should we move this to read? What about secondary plugins?
+    print STDERR "<Processing n='$file' p='$self->{'plugin_type'}'>\n" if ($gli);
+    print $outhandle "$self->{'plugin_type'} processing $file\n"
+	    if $self->{'verbosity'} > 1;
+
+    my ($filename_full_path, $filename_no_path) = &util::get_full_filenames($base_dir, $file);
+
+    # create a new document
+    my $doc_obj = new doc ($filename_full_path, "indexed_doc", $self->{'file_rename_method'});
+
+
+    my $top_section = $doc_obj->get_top_section();
+
+
+    $doc_obj->add_utf8_metadata($top_section, "Plugin", "$self->{'plugin_type'}");
+    $doc_obj->add_utf8_metadata($top_section, "FileSize", (-s $filename_full_path));
+ 
+    # sets the UTF8 filename (Source) for display and sets the url ref to URL encoded version
+    # of the UTF8 filename (SourceFile) for generated files
+    $self->set_Source_metadata($doc_obj, $filename_no_path);
+
+
+    # plugin specific stuff - what args do we need here??
+    unless (defined ($self->process($pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli))) {
+	print STDERR "<ProcessingError n='$file'>\n" if ($gli);
+	return (-1,undef);
+    }
+    
+    # include any metadata passed in from previous plugins 
+    # note that this metadata is associated with the top level section
+    my $section = $doc_obj->get_top_section();
+    # can we merge these two methods??
+    $self->add_associated_files($doc_obj, $filename_full_path);
+    $self->extra_metadata ($doc_obj, $section, $metadata);
+    $self->auto_extract_metadata($doc_obj);
+
+    # if we haven't found any Title so far, assign one
+    # this was shifted to here from inside read()
+    $self->title_fallback($doc_obj,$section,$filename_no_path);
+    
+    $self->add_OID($doc_obj);
+
+    $self->post_process_doc_obj($pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli);
+
+    return (1,$doc_obj);
+}
+
+sub add_dummy_text {
+    my $self = shift(@_);
+    my ($doc_obj, $section) = @_;
+
+    # add NoText metadata so we can hide this dummy text in format statements
+    $doc_obj->add_metadata($section, "NoText", "1");
+    $doc_obj->add_text($section, &gsprintf::lookup_string("{BasePlugin.dummy_text}",1));
+    
+}
+
+
+
+
+# do plugin specific processing of doc_obj
+sub process {
+    my $self = shift (@_);
+    # options??
+    my ($pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+
+    my $outhandle = $self->{'outhandle'};
+
+    my ($filename_full_path, $filename_no_path) = &util::get_full_filenames($base_dir, $file);
+
+
+    if ($self->{'ffmpeg_installed'}) {
+	my $utf8_filename_no_path = $self->filepath_to_utf8($filename_no_path);
+	my $url_encoded_filename = &util::rename_file($utf8_filename_no_path, $self->{'file_rename_method'});
+
+
+	#run convert to get the thumbnail and extract size and type info
+	my $result = $self->run_convert($base_dir, $filename_full_path, 
+					$url_encoded_filename, $doc_obj);
+	
+	if (!defined $result) {
+	    if ($gli) {
+		print STDERR "<ProcessingError n='$file'>\n";
+	    }
+	    print $outhandle "MultimediaPlugin: couldn't process \"$filename_full_path\"\n";
+	    return (-1,undef); # error during processing
+	}
+    } 
+    else {
+	if ($gli) {
+	    &gsprintf(STDERR, "<Warning p='MultimediaPlugin' r='{MultimediaConverter.noconversionavailable}: {MultimediaConverter.".$self->{'no_multimedia_conversion_reason'}."}'>");
+	}
+	# all we do is add the original video file as an associated file, and set up srclink etc
+	my $assoc_file = $doc_obj->get_assocfile_from_sourcefile();
+	my $section = $doc_obj->get_top_section();
+
+	$doc_obj->associate_file($filename_full_path, $assoc_file, "", $section);
+
+	$doc_obj->add_metadata ($section, "srclink", "<a href=\"_httpprefix_/collect/[collection]/index/assoc/[assocfilepath]/[SourceFile]\">");
+	$doc_obj->add_metadata ($section, "/srclink", "</a>");
+	$doc_obj->add_metadata ($section, "srcicon", "<img src=\"_httpprefix_/collect/[collection]/index/assoc/[assocfilepath]/[SourceFile]\" width=\"100\">");
+
+    }
+    #we have no text - adds dummy text and NoText metadata
+    $self->add_dummy_text($doc_obj, $doc_obj->get_top_section());
+
+    return 1;
+
+}
+
+
+
+1;
+
+
+
+
+
+
+
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/perllib/plugins/TimedHTMLPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/perllib/plugins/TimedHTMLPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/perllib/plugins/TimedHTMLPlugin.pm	(revision 24799)
@@ -0,0 +1,927 @@
+###########################################################################
+#
+# TimedHTMLPlug.pm -- 
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+
+package TimedHTMLPlugin;
+
+use HTMLPlugin;
+use VideoConverter;
+
+sub BEGIN {
+    @TimedHTMLPlugin::ISA = ('HTMLPlugin', 'VideoConverter');
+}
+
+
+use strict; # every perl program should have this!
+no strict 'refs'; # make an exception so we can use variables as filehandles
+
+my $arguments =
+    [ 
+      { 'name' => "video_excerpt_duration",
+	'desc' => "{VideoPlug.video_excerpt_duration}",
+	'type' => "string",
+	'reqd' => "no" }
+      ];
+
+
+
+
+my $options = { 'name'     => "TimedHTMLPlugin",
+		'desc'     => "{TimedHTMLPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+	        'args'     => $arguments };
+
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+    
+    if(defined $arguments){ push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});}
+    if(defined $options) { push(@{$hashArgOptLists->{"OptList"}},$options)};
+   
+    new VideoConverter($pluginlist, $inputargs, $hashArgOptLists);
+    
+    my $self = (defined $hashArgOptLists) 
+	? new HTMLPlugin($pluginlist,$inputargs,$hashArgOptLists)
+	: new HTMLPlugin($pluginlist,$inputargs);
+ 
+    my $collect_dir = $ENV{'GSDLCOLLECTDIR'};
+
+    my $collect_bin = &util::filename_cat($collect_dir,"bin");
+    my $collect_script = &util::filename_cat($collect_bin,"script");
+    
+    $ENV{'PATH'} .= ":" if (defined $ENV{'PATH'});
+    $ENV{'PATH'} .= "$collect_bin:$collect_script";
+
+    return bless $self, $class;
+}
+
+sub begin {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $processor, $maxdocs) = @_;
+
+    $self->SUPER::begin(@_);
+    $self->VideoConverter::begin(@_); 
+}
+
+
+sub init {
+    my $self = shift (@_);
+    my ($verbosity, $outhandle, $failhandle) = @_;
+
+    $self->SUPER::init(@_);
+    $self->VideoConverter::init(@_);
+}
+
+
+sub html_to_text
+{
+    my ($self, $text) = @_;
+
+    $text =~ s/<\/?[^>]*>//g;
+
+    $text =~ s/&nbsp;/ /g;
+
+    $text =~ s/\s+/ /gs;
+    $text =~ s/^\s+//;
+    $text =~ s/\s+$//;
+
+    return $text;
+}
+
+
+sub extract_metadata_table
+{
+    my ($self, $textref) = @_;
+
+    my $metatable_store = {};
+
+    my $metatable_re = "<table([^>]*)>(.*?<p[^>]+class=\"?Metadata\"?[^>]*>.*?)<\\/table>";
+
+    if ($$textref =~ m/$metatable_re/gsi) {
+	my $metatable_attr = $1;
+	my $metatable_body = $2;
+
+	my @tr_list = ($metatable_body =~ m/(<tr[^>]*>.*?<\/tr>)/gsi);
+
+	my @filtered_tr_list = ();
+
+	foreach my $tr (@tr_list) {
+
+	    my $in_filtered_tr = 1;
+
+	    my @td_list = ($tr =~ m/<td[^>]*>(.*?)<\/td>/gsi);
+	    my $td_list_num = scalar(@td_list);
+	    
+	    if ($td_list_num == 2) {
+		my $meta_name  = $self->html_to_text($td_list[0]);
+		my $meta_value = $self->html_to_text($td_list[1]);
+		
+		$meta_name =~ s/\s*//g;
+		
+
+		if ($meta_value =~ m/^(\s*|\?+)$/) {
+		    $in_filtered_tr = 0;
+		}
+		else {
+		    my $meta_name_label = $meta_name;
+		    $meta_name_label =~ s/\s+//g;
+
+		    $metatable_store->{$meta_name_label} = $meta_value;
+
+		    if ($meta_name_label =~ m/^GS\./) {
+			# even though we want to store this as metadata, we
+			# don't want this going into table presented at top of document
+			$in_filtered_tr = 0; 
+		    }
+
+		}
+	    }
+	    else {
+		print STDERR "Warning: Metadata table does not consist of two cells (metadata name : metadata value)\n";
+		print STDERR "         Skipping\n";
+	    }
+
+
+	    if ($in_filtered_tr) {
+		push(@filtered_tr_list,$tr);
+	    }
+	}
+
+	my $filtered_tr_block = join("\n",@filtered_tr_list);
+	my $filtered_table = "<table$metatable_attr>$filtered_tr_block</table>";
+
+
+	### my $metatable_re = "<table[^>]*>.*?<p class=\"?Metadata\"?>.*?<\\/table>";
+
+###	print STDERR "*** filtered table = $filtered_table\n";
+
+	$$textref =~ s/$metatable_re/$filtered_table/si;
+	
+    }
+
+    return $metatable_store;
+
+}
+
+
+
+
+
+my $only_num = 0;
+my $only_limit = 100;
+
+sub hms_to_secs
+{
+    my $self = shift @_;
+    my ($hh,$mm,$ss) = @_;
+
+    return $hh*3600 + $mm*60 + $ss;
+}
+
+
+
+sub timed_event
+{
+    my $self = shift (@_);
+
+    my ($front, $tape, $hh, $mm, $ss, $back) = @_;
+
+    my $time_encoded = "$hh:$mm:$ss";
+    my $time_encoded_file = "$hh$mm$ss";
+
+    print STDERR "***** time endocde = $time_encoded\n";
+
+    my $time_pos = $self->{'time_pos'};
+    my $time_num = scalar(@{$self->{'time_seq'}});
+
+####    my $videoconvert = $self->{'videoconvert'};
+
+    # excerpt from tim_pos -> time_pos + 2;
+    my $adv_time_pos = $time_pos+2;
+    $adv_time_pos = $time_num-1 if ($adv_time_pos>=$time_num);
+
+    my $adv_time_elem = $self->{'time_seq'}->[$adv_time_pos];
+
+#    print STDERR "*** ", substr($adv_time_elem,0,800), "\n";
+
+    my ($atape,$ah,$am,$as) = ($adv_time_elem =~ m/(T\d+:) ?(\d\d):(\d\d):(\d\d)(?:\:\d\d)?/);
+
+    my $excerpt_len = undef;
+    my $time_in_secs     = $self->hms_to_secs($hh,$mm,$ss);
+
+    if (!defined $tape) {
+	if (defined $self->{'ptape'}) {
+	    $tape = $self->{'ptape'};
+	}
+	else {
+	    print STDERR "Warning: First time offset does not define tape side\n";
+	    print STDERR "         Defaulting to 1\n";
+	    $tape = "T1:";
+	}
+    }
+
+    if (!defined $atape) {
+	$atape = "T1";
+    }
+
+#    print STDERR "**** atape = $atape\n";
+#    print STDERR "*** tape = $tape\n";
+
+    if ($atape eq $tape) {
+	my $adv_time_in_secs = $self->hms_to_secs($ah,$am,$as);
+
+	$excerpt_len = $adv_time_in_secs - $time_in_secs;
+    }
+
+    my $collect_dir = $ENV{'GSDLCOLLECTDIR'};
+
+    my $media_type = $self->{'media_type'};
+    my $media_dir  = $self->{'media_dir'};
+    my $media_root = $self->{'media_root'};
+
+    my $media_base_dir = $self->{'media_base_dir'};
+
+    my $mp3_html;    
+    my $avi_html;
+
+    my $tape_num = "1";
+
+    if (defined $media_type) {
+
+	my $src_file;
+	my $src_filename;
+
+	if ($media_type eq "video") {
+	    $src_file = "$media_root\_01_$tape_num.VOB";
+	    $src_filename 
+		= &util::filename_cat($media_base_dir, $src_file);
+	}
+	elsif ($media_type =~ m/^audio$/) {
+	    $src_file = "$media_root\_Tape$tape_num.mp3";
+	    $src_filename 
+		= &util::filename_cat($media_base_dir, $src_file);
+	}
+	else {
+	    print STDERR "Warning: Unrecognised media type: $media_type\n";
+	}
+
+
+	# Embed link to allow video to stream from marked time event
+	if ($media_type eq "video") {
+
+	    # video excerpt
+		    
+	    $avi_html .= "<a class=\"mm\" href=\"javascript:videoplayerseek($hh,$mm,$ss)\"><img border=1 src=\"_httpvideoimages_/ivideo.gif\"></a>";
+
+	    # save 'time-stamp' as metadata???	       
+
+	}
+	
+	# Do similar for audio.
+	#   Obviously, pure audio needs to be handled here, but also
+	#   video (and link in to its audio track)
+
+	if ($media_type =~ m/^(video|audio)$/) {
+
+		
+		my ($voa_root) = ($src_file =~ m/^(.*)\..*?$/);
+	
+		my $mp3_url = "javascript:audioplayerseek($hh,$mm,$ss)";
+		$mp3_html = "<a class=\"mm\" href=\"$mp3_url\"><img border=1 src=\"_httpvideoimages_/iaudio.gif\"></a>";
+
+#		my $baseexcerpt_url = "_httpcollection_/index/assoc/{If}{[assocfilepath],[assocfilepath],[parent(Top):assocfilepath]}";
+		
+	    }
+    }
+    else {
+	print STDERR "Warning: no media type defined.\n";
+    }
+
+
+    $only_num++;
+
+    $self->{'time_pos'}++;
+
+    my $table = "<table width=\"100%\" cellspacing=\"1\" cellpadding=\"0\"><tr valign=\"middle\">";
+    $table .= "<td>$avi_html</td>" if (defined $avi_html);
+    $table .= "<td>$mp3_html</td>";
+    $table .= "<td>$time_encoded</td>";
+    $table .= "</tr></table>";
+
+    # my $line = "$front$avi_html&nbsp;$mp3_html&nbsp;$time_encoded$back";
+
+    my $line = "$front$table$back";
+
+    # Remember tape prefix for next call
+    $self->{'ptape'} = $tape;
+
+    return $line;
+}
+
+
+sub hyperlink_timing_info
+{
+    my ($self, $textref) = @_;
+
+    my $media_type = $self->{'media_type'};
+    my $media_dir  = $self->{'media_dir'};
+    my $media_root = $self->{'media_root'};
+
+
+
+    ##my $front_re = "<p class=Timing>(?:<span\\s+.*?>)?";
+    my $front_re = "<p[^>]+class=\"?Timing(?:-.*?)?\"?[^>]*>(?:<span\\s+.*?>)?";
+    my $tape_re  = "T\\d+:";
+    my $tt_re = "\\d\\d";
+    my $back_re = ".*?(?:<\\/span>\\s*)?(?:<\\/p>)";
+
+    my $time_match_re = "$front_re$tt_re:$tt_re:$tt_re$back_re(?:\:$tt_re)?";
+    # my $time_sub_re   = "($front_re)($tape_re)? ?($tt_re):($tt_re):($tt_re)(?:\:$tt_re)?($back_re)";
+
+    my $tape_match_re   = "$front_re($tape_re)? ?$tt_re:$tt_re:$tt_re(?:\:$tt_re)?$back_re";
+    my $tape_sub_re   = "($front_re)($tt_re):($tt_re):($tt_re)(?:\:$tt_re)?($back_re)";
+
+
+
+    my @time_seq = ($$textref =~ m/$time_match_re/sgi);
+
+    print STDERR "***** got ", scalar(@time_seq), " matches\n";
+
+    # artifically add tape information into all time indexes
+    my $extrapolate_tape = "";
+    my $num_seq = scalar(@time_seq);
+    for (my $i=0; $i<$num_seq; $i++) {
+	my ($curr_tape) = ($time_seq[$i] =~ m/$tape_match_re/sgi);
+	if (!defined $curr_tape) {
+	    $time_seq[$i] =~ s/$tape_sub_re/$1$extrapolate_tape$2:$3:$4$5/sgi;
+	}
+	else {
+	    if ($curr_tape ne $extrapolate_tape) {
+		$extrapolate_tape = $curr_tape;
+	    }
+	}
+    }
+
+
+    $self->{'time_seq'} = \@time_seq;
+    $self->{'time_pos'} = 0;
+
+    # my $front_re = "<p[^>]+class=\"?Timing(?:-.*?)?\"?[^>]*>(?:<span\\s+.*?>)?";
+
+    $$textref =~ s/($front_re)(T\d+:)? ?(\d\d):(\d\d):(\d\d)(?:\:\d\d)?.*?((?:<\/span>)?\s*<\/p>)/$self->timed_event($1,$2,$3,$4,$5,$6)/sgie;
+
+    ##$$textref =~ s/(<p class=Timing><span\s+.*?>)(T\d+:)? ?(\d\d):(\d\d):(\d\d)(?:\:\d\d)?.*?(<\/span>)/$self->timed_event($1,$2,$3,$4,$5,$6)/sgie;
+
+
+    # knock out any div tags as they interfere with document broken up into sections
+    $$textref =~ s/<\/?div.*?>//gi;
+
+    # Embedded word style infomation is lost by HTMLPlug => make Question
+    # style use HTML italics
+
+    $$textref =~ s/<p class=\"Question\">(.*?)<\/p>/<p><i>$1<\/i><\/p>/gsi;
+
+}
+
+
+
+sub store_block_files
+{
+    my $self =shift (@_);
+    my ($filename_full_path, $block_hash) = @_;
+
+    # Would be better if this were tied to particular HTML docs that
+    # this plugin has processed.
+
+    # For now block all files native to DVD format
+
+    if (($filename_full_path =~ m/\.(IFO|BUP)$/)        # block info and backup-info data
+	|| ($filename_full_path =~ m/VIDEO_TS\..*?$/)   # block top-level files
+	|| ($filename_full_path =~ m/VTS_\d\d_\d\.VOB$/) # 
+	) {
+	
+	$block_hash->{'file_blocks'}->{$filename_full_path} = 1;
+    }
+}
+
+sub read_block {
+    my $self = shift (@_);  
+  
+    my ($pluginfo, $base_dir, $file, $metadata, $processor, $maxdocs, $total_count, $gli) = @_;
+
+    print STDERR "***** TimedHTMLPlugin read_block\n";
+
+    my $filename = $file;
+    $filename = &util::filename_cat ($base_dir, $file) if $base_dir =~ /\w/;
+
+    if (($filename =~ m/\.(IFO|BUP)$/)        # block info and backup-info data
+	|| ($filename =~ m/VIDEO_TS\..*?$/)   # block top-level files
+	|| ($filename =~ m/VTS_\d\d_\d\.VOB$/) # 
+	) {
+	$self->{'num_blocked'} ++;
+	return (0,undef); # blocked
+    }
+
+
+#####	|| ($filename =~ m/VTS_\d\d_0\.VOB$/) # block menu item for this track
+
+
+    if (defined $self->{'file_blocks'}->{$filename} && $self->{'file_blocks'}->{$filename} == 1){
+	$self->{'num_blocked'} ++;
+	return (0,undef); # blocked
+    }
+
+
+    if (defined $self->{'re_file_block'}) {
+	my $re_file_blocks = $self->{'re_file_block'};
+	foreach my $re_file_block (@$re_file_blocks) {
+###	    print STDERR "**** re file block: $filename =~ m $re_file_block\n";
+	    if ($filename =~ m/$re_file_block/) {
+###		print STDERR "*** blocking $filename\n";
+
+		$self->{'num_blocked'} ++;
+		return (0,undef); # blocked
+	    }
+	}
+    }
+
+
+    return $self->SUPER::read_block(@_);
+
+}
+
+
+sub read_file {
+    my $self = shift @_;
+    my ($filename, $encoding, $language, $textref) = @_;
+
+    $only_num = 0;
+
+    $self->SUPER::read_file(@_);
+
+    my $metatable_store = $self->extract_metadata_table($textref);
+    $self->{'metatable_store'} = $metatable_store;
+
+    my ($root, $dirname, $suffix)
+        = &File::Basename::fileparse($filename, "\\.[^\\.]+\$");
+    
+    # media defaults
+    my $media_type = undef;
+    my $media_dir  = $root;
+    ## my $media_root = "VTS_%02d_%02d";
+    my $media_root = "VTS";
+
+    if (defined $metatable_store->{'GS.Media'}) {
+	$media_type = $metatable_store->{'GS.Media'};
+	$media_type = lc($media_type);
+    }
+    if (defined $metatable_store->{'GS.MediaDirectory'}) {
+	$media_dir = $metatable_store->{'GS.MediaDirectory'};
+    }
+    if (defined $metatable_store->{'GS.MediaRoot'}) {
+	$media_root = $metatable_store->{'GS.MediaRoot'};
+    }
+
+    $self->{'media_type'} = $media_type;
+    $self->{'media_dir'}  = $media_dir;
+    $self->{'media_root'} = $media_root;
+
+    my $media_base_dir = &util::filename_cat($dirname,$media_dir);
+    $self->{'media_base_dir'} = $media_base_dir;
+
+    $self->{'vob_duration_info'} = &VideoConverter::vob_durations($media_base_dir,"1",$self->{'outhandle'});
+
+##    $self->hyperlink_timing_info($textref);
+
+    # Convert entities to their UTF8 equivalents
+    $$textref =~ s/&(lt|gt|amp|quot|nbsp);/&z$1;/go;
+    $$textref =~ s/&([^;]+);/&ghtml::getcharequiv($1,1)/gseo;
+    $$textref =~ s/&z(lt|gt|amp|quot|nbsp);/&$1;/go;
+}
+
+
+sub streamable_video
+{
+    my $self = shift (@_);
+
+    my ($base_dir,$filename,$doc_obj,$section) = @_;
+
+    my $outhandle = $self->{'outhandle'};
+    my $verbosity = $self->{'verbosity'};
+
+    my $media_base_dir = $self->{'media_base_dir'};
+
+    #---
+    # Determine size of input video
+
+    my $collect_dir = $ENV{'GSDLCOLLECTDIR'};
+
+    my $media_type = $self->{'media_type'};
+    my $media_dir  = $self->{'media_dir'};
+    my $media_root = $self->{'media_root'};
+
+    my $tape_num = "1";
+
+    my $src_file;
+    my $src_filename;
+
+    if ($media_type eq "video") {
+	# $src_file = "$media_root\_01_$tape_num.VOB";
+	$src_file = "$media_root\_01.VOB";
+	$src_filename 
+	    = &util::filename_cat($media_base_dir, $src_file);
+    }
+    elsif ($media_type =~ m/^audio$/) {
+	# $src_file = "$media_root\_Tape$tape_num.mp3";
+	$src_file = "$media_root.mp3";
+	$src_filename 
+	    = &util::filename_cat($media_base_dir, $src_file);
+    }
+    else {
+	print STDERR "Warning: Unrecognised media type: $media_type\n";
+    }
+
+    if (-e $src_filename) {
+	$self->{'file_blocks'}->{$src_filename} = 1;
+
+#	my $re_file_block = $src_filename;
+#	$re_file_block =~ s/_01_$tape_num.VOB$/_\\d+_\\d+.VOB\$/;
+		
+#	push(@{$self->{'re_file_block'}},$re_file_block);
+    }
+
+    my ($video_type, $video_width, $video_height, $video_duration, $video_size,
+	$vcodec,$vfps,$atype,$afreq,$achan,$arate) 
+	= &VideoConverter::identify($src_filename, $outhandle, $verbosity);
+
+    if ($vfps eq "unknown") {
+	print $outhandle "Unknown framerate, defaulting to 25 frames per second.\n";
+	$vfps = 25;
+    }
+
+###    print STDERR "*** video duration = $video_duration\n";
+    my ($dur_hour,$dur_min,$dur_sec) 
+	= ($video_duration =~ m/(\d+):(\d+):(\d+\.\d+)/);
+    my $total_dur_secs = $dur_hour*3600 + $dur_min*60 + $dur_sec;
+
+    $self->{'video-fps'} = $vfps;
+    $self->{'num-total-frames'} = $total_dur_secs * $vfps;
+
+
+    # shorten duration prcessed for experimentation purposes
+    my $exp_duration = undef;
+
+    my $video_excerpt_duration = $self->{'video_excerpt_duration'};
+
+    print STDERR "**** video/audio duration (secs) = $total_dur_secs\n";
+
+
+    if ((defined $video_excerpt_duration) && ($video_excerpt_duration ne "")) {
+	$exp_duration = $video_excerpt_duration;
+	my ($hh,$mm,$ss,$ms) = ($exp_duration =~ m/^(\d\d):(\d\d):(\d\d)\.?(\d\d)?/);
+	my $excerpt_dur_in_secs = $hh * 3600 + $mm * 60 + $ss;
+
+	if ($excerpt_dur_in_secs < $total_dur_secs) {
+	    $self->{'num-total-frames'} = $excerpt_dur_in_secs * $vfps; # override calculation for full length duration
+	}
+	else {
+	    # clip is already shorter than requested video excerpt duration
+	    # set exp_duration back to undefined
+	    $exp_duration = undef;
+	}
+    }
+
+    print $outhandle "TimedHTMLPlug: Preparing video files associated with $filename for HTMLPlug\n";
+
+    if (defined $exp_duration)
+    {
+	print $outhandle "Only encoding first $exp_duration of video.\n";
+	$self->{'exp_duration'} = $exp_duration;
+    }
+
+    
+    $self->init_cache_for_file($src_filename);
+
+    # TimedHTML streaming isn't as complicated as VideoPlugin or AudioPlugin
+    # => src file is never converted beforehand to another type
+
+    my $convertto_regenerated = 0;
+    my $originalfilename = $src_filename;
+
+    my $streamable_regenerated = 0;
+
+    if ($media_type eq "audio") {
+	$streamable_regenerated = 
+	    $self->enable_audio_streaming($doc_obj,
+					  $originalfilename,$src_filename,
+					  $convertto_regenerated);
+    }
+    else {
+	# generate streamable video and audio
+	$streamable_regenerated = 
+	    $self->enable_full_streaming($doc_obj,
+					 $originalfilename,$src_filename,
+					 $convertto_regenerated,
+					 $video_width,$video_height);
+    }
+
+    $self->{'streamable_regenerated'} = $streamable_regenerated;
+
+    my $base_url = "_httpstreamserverprefix_/collect/[collection]/index/assoc/{If}{[assocfilepath],[assocfilepath],[parent(Top):assocfilepath]}/";
+
+    $doc_obj->add_metadata ($section, "baseurl",$base_url);
+
+    return;
+
+#*********************
+    #---
+    # Generate the Flash FLV format for streaming purposes
+
+    my $streaming_bitrate = "256k"; # used to be 192k
+    my $streaming_size    = "360"; # used to be 352 (CIF?)
+    my $streaming_achan   = "1";
+    my $streaming_arate   = "44100";
+    my $streaming_quality = "high";
+
+    #---
+    # Convert video to flash
+    #---
+    my ($stream_cmd,$oflash_filename,$oflash_file) 
+	= $self->stream_cmd($src_filename,
+			    $video_width,$video_height,
+			    $streaming_quality, $streaming_bitrate, $streaming_size,
+			    $streaming_achan, $streaming_arate);
+
+    my $streamable_options = { @{$self->{'ffmpeg_monitor'}},
+			       'message_prefix' => "Stream",
+			       'message' => "Generating streamable video: $oflash_file" }; 
+
+    my ($streamable_regenerated2,$streamable_result,$streamable_had_error)
+	= $self->run_cached_general_cmd($stream_cmd,$oflash_filename,$streamable_options);
+
+    $self->{'streamable_regenerated2'} = $streamable_regenerated2;
+
+    if (!$streamable_had_error) {
+	#---
+	# Make video seekable
+	#---
+	my ($streamseekable_cmd,$ostreamseekable_filename) = $self->streamseekable_cmd($oflash_filename);
+	
+	my $streamseekable_options = { @{$self->{'flvtool2_monitor'}},
+				       'message_prefix' => "Stream Seekable",
+				       'message' => "Reprocessing video stream to be seekable by timeline: $oflash_file" }; 
+
+	if ($streamable_regenerated2) {
+	    $self->run_general_cmd($streamseekable_cmd,$streamseekable_options);
+	}
+
+	my $streamable_url = $oflash_file;
+##	$streamable_url =~ s/ /%20/g;
+
+	$doc_obj->add_metadata ($section, "streamablevideo", $streamable_url);
+	$doc_obj->associate_file($oflash_filename,$oflash_file,"video/flash",
+				 $section);
+    }
+
+    #
+    # FlowPlayer.swf       height+22 pixels
+    # FlowPlayerBlack.swf  height+16 pixels
+    # FlowPlayerThermo.swf height+16 pixels
+    # FlowPlayerWhite.swf  height+26 pixels
+    if ($media_type eq "audio") {
+	$doc_obj->add_metadata ($section, "audioflashwidth",    $video_width);
+	$doc_obj->add_metadata ($section, "audioflashheight",   22 + 100);
+    }
+    else {
+	$doc_obj->add_metadata ($section, "flashwidth",    $video_width);
+	$doc_obj->add_metadata ($section, "flashheight",   $video_height + 22 + 100);
+    }
+
+    
+    my $base_url2 = "_httpstreamserverprefix_/collect/[collection]/index/assoc/{If}{[assocfilepath],[assocfilepath],[parent(Top):assocfilepath]}/";
+
+    $doc_obj->add_metadata ($section, "baseurl",$base_url2);
+    
+    $self->{'oflash_file'} = $oflash_file;
+    $self->{'oflash_filename'} = $oflash_filename;
+
+}
+
+
+
+sub add_cuepoints
+{
+    my ($self) = shift @_;
+    my ($doc_obj) = @_;
+
+    my $section = $doc_obj->get_top_section();
+    my $chapters = $doc_obj->get_children($section);
+
+
+    # open file
+    my $output_dir = $self->{'cached_dir'};
+    my $cue_filename = &util::filename_cat($output_dir,"on_cue.xml");
+
+    open(CUEOUT,">$cue_filename")
+	|| die "Unable to open $cue_filename: $!\n";
+    print CUEOUT "<tags>\n";
+
+
+    my $cc = 0;
+
+    foreach my $chap (@$chapters)
+    {
+	$cc++;
+
+	my $chap_text = $doc_obj->get_text($chap);
+
+	my @cuepoints 
+	    = ($chap_text =~ m/<p class=Timing><span\s+.*?>(?:T\d+:)? ?(\d\d:\d\d:\d\d)(?:\:\d\d)?/gsi);
+
+	my $count = 0;
+
+	foreach my $cuepoint (@cuepoints)
+	{	    
+	    my ($hh,$mm,$ss) = ($cuepoint =~ m/(\d\d):(\d\d):(\d\d)/);
+
+	    my $cuept_insecs = $self->hms_to_secs($hh,$mm,$ss);
+
+	    if ($cuept_insecs < 2) {
+		$cuept_insecs += 2;
+	    }
+	    my $cuept_inmsecs = 1000 * $cuept_insecs;
+	    
+	    $doc_obj->add_metadata($section,"cuepoint",$cuept_inmsecs);
+	    my $chap_title = $doc_obj->get_metadata_element($chap,"Title");
+
+	    # Navigation point (used in seeking)
+#	    print CUEOUT "  <metatag event=\"onCuePoint\" overwrite=\"true\">\n";
+#	    print CUEOUT "    <name>$chap_title</name>\n";
+#	    print CUEOUT "    <timestamp>$cuept_inmsecs</timestamp>\n";
+#	    print CUEOUT "    <parameters>\n";
+#	    print CUEOUT "      <thumb>dummy</thumb>\n";
+#	    print CUEOUT "      <sectionnum>$chap</sectionnum>\n";
+#	    print CUEOUT "      <subsectionnum>$count</subsectionnum>\n";
+#	    print CUEOUT "      <cuept>$cuept_inmsecs</cuept>\n";
+#	    print CUEOUT "    </parameters>\n";
+#	    print CUEOUT "    <type>navigation</type>\n";
+#	    print CUEOUT "  </metatag>\n";
+
+
+#	    print CUEOUT "  <metatag event=\"onCuePoint\" overwrite=\"true\">\n";
+#	    print CUEOUT "    <name>$chap_title</name>\n";
+#	    print CUEOUT "    <timestamp>$cuept_inmsecs</timestamp>\n";
+#	    print CUEOUT "    <parameters>\n";
+#	    print CUEOUT "      <thumb>foo.jpg</thumb>\n";
+#	    print CUEOUT "    </parameters>\n";
+#	    print CUEOUT "    <type>navigation</type>\n";
+#	    print CUEOUT "  </metatag>\n";
+
+	    if ($count==0)
+	    {
+		# Event (used to hook in to javascipt callback)
+		# Only do for the first in each chapter
+
+		print CUEOUT "  <metatag event=\"onCuePoint\" overwrite=\"true\">\n";
+##		print CUEOUT "    <name>Test $cc</name>\n";
+		print CUEOUT "    <name>$chap_title</name>\n";
+		print CUEOUT "    <timestamp>$cuept_inmsecs</timestamp>\n";
+		print CUEOUT "    <parameters>\n";
+		print CUEOUT "      <cuept>$cuept_inmsecs</cuept>\n";
+		print CUEOUT "      <sectionnum>$chap</sectionnum>\n";
+		print CUEOUT "    </parameters>\n";
+		print CUEOUT "    <type>event</type>\n";
+##		print CUEOUT "    <type>actionscript</type>\n";
+		print CUEOUT "  </metatag>\n";
+	    }
+
+	    $count++;
+	}
+    }
+
+
+    print CUEOUT "</tags>\n";
+    close(CUEOUT);
+
+####    my $videoconvert = $self->{'videoconvert'};
+    my $oflash_filename = $self->{'oflash_filename'};
+    my $oflash_file = $self->{'oflash_file'};
+
+    my ($streamcuepts_cmd,$ostreamcuepts_filename) = $self->streamcuepts_cmd($oflash_filename);
+
+    my $verbosity = $self->{'verbosity'};
+    my $outhandle = $self->{'outhandle'};
+
+    my $streamcuepts_options = { @{$self->{'flvtool2_monitor'}},
+				 'message_prefix' => "Stream Cue Points",
+				 'message' => "Reprocessing video stream to add cuepoints on timeline: $oflash_file" }; 
+
+    my $streamable_regenerated2 = $self->{'streamable_regenerated'};
+
+    if ($streamable_regenerated2) {
+	$self->run_general_cmd($streamcuepts_cmd,$streamcuepts_options);
+    }
+
+    
+
+}
+
+
+
+sub process {
+    my $self = shift (@_);
+    my ($textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj, $gli) = @_;
+
+    my $filename = $file;
+    $filename = &util::filename_cat ($base_dir, $file) if $base_dir =~ /\w/;
+
+    my $top_section = $doc_obj->get_top_section();
+
+    $self->streamable_video($base_dir,$filename,$doc_obj,$top_section);
+
+    $self->hyperlink_timing_info($textref);
+
+    foreach my $mp3_excerpt (@{$self->{'mp3_excerpts'}}) {
+	my $omp3_file = $mp3_excerpt->{'omp3_file'};
+	my $omp3_filename = $mp3_excerpt->{'omp3_filename'};
+
+	$doc_obj->associate_file($omp3_filename,$omp3_file,"audio/mp3",
+				 $top_section);
+    }
+    $self->{'mp3_excerpts'} = undef;
+
+    my $metatable_store = $self->{'metatable_store'};
+    foreach my $metaname (keys %$metatable_store) {
+	my $metadata = $metatable_store->{$metaname};
+	$doc_obj->add_metadata($top_section,$metaname,$metadata);
+    }
+    $self->{'metatable_store'} = undef;
+
+    my $ret_val = $self->SUPER::process(@_);
+
+    $self->add_cuepoints($doc_obj);
+
+
+    return $ret_val;
+
+}
+
+
+
+sub replace_images {
+    my $self = shift (@_);
+    my ($front, $link, $back, $base_dir, 
+	$file, $doc_obj, $section) = @_;
+
+    if ($link =~ m/^"?_.*?_"?\//) {
+	# variety of greenstone macro, so let through unchanged
+	return $front . $link . $back ;
+    }
+
+    return $self->SUPER::replace_images(@_);
+}
+
+
+
+
+
+sub replace_href_links {
+    my $self = shift (@_);
+    my ($front, $link, $back, $base_dir, $file, $doc_obj, $section) = @_;
+
+
+    if ($link =~ m/^"?_.*?_"?/) {
+	# variety of greenstone macro, so let through unchanged
+	return $front . $link . $back ;
+    }
+
+    return $self->SUPER::replace_href_links(@_);
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/perllib/plugins/VideoConverter.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/perllib/plugins/VideoConverter.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/perllib/plugins/VideoConverter.pm	(revision 24799)
@@ -0,0 +1,1562 @@
+###########################################################################
+#
+# VideoConverter - helper plugin that does video (and audio) conversion using ffmpeg
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2008 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+package VideoConverter;
+
+use MultimediaConverter;
+
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+
+use gsprintf 'gsprintf';
+
+BEGIN {
+    @VideoConverter::ISA = ('MultimediaConverter');
+}
+
+
+my @thumb_arguments = (       
+      { 'name' => "create_thumbnail",
+	'desc' => "{ImageConverter.create_thumbnail}",
+	'type' => "enum",
+	'list' => [{'name' => "true", 'desc' => "{common.true}"},
+		   {'name' => "false", 'desc' => "{common.false}"}],
+	'deft' => "true",
+	'reqd' => "no" },
+	      { 'name' => "keep_original_video",
+	'desc' => "Copy the original video file in the collection as an associated file.",
+	'type' => "enum",
+	'list' => [{'name' => "true", 'desc' => "Include the original video file in the collection"},
+		   {'name' => "false", 'desc' => "Do not copy the original video file in the collection"}],
+	'deft' => "false",
+	'reqd' => "no" },
+      { 'name' => "thumbnailsize",
+	'desc' => "{ImageConverter.thumbnailsize}",
+	'type' => "int",
+	'deft' => "100",
+	'range' => "1,",
+	'reqd' => "no" },
+      { 'name' => "thumbnailtype",
+	'desc' => "{ImageConverter.thumbnailtype}",
+	'type' => "string",
+	'deft' => "jpg",
+	'reqd' => "no" },
+      { 'name' => "noscaleup",
+	'desc' => "{ImageConverter.noscaleup}",
+	'type' => "flag",
+	'reqd' => "no" } );
+
+
+my @screenview_arguments = (
+      { 'name' => "create_screenview",
+	'desc' => "{ImageConverter.create_screenview}",
+	'type' => "enum",
+	'list' => [{'name' => "true", 'desc' => "{common.true}"},
+		   {'name' => "false", 'desc' => "{common.false}"}],
+	'deft' => "true",
+	'reqd' => "no" },
+      { 'name' => "screenviewsize",
+	'desc' => "{ImageConverter.screenviewsize}",
+	'type' => "int",
+	'deft' => "720",
+	'range' => "1,",
+	'reqd' => "no" },
+      { 'name' => "screenviewtype",
+	'desc' => "{ImageConverter.screenviewtype}",
+	'type' => "string",
+	'deft' => "jpg",
+	'reqd' => "no" } );
+
+my $arguments = [
+      @thumb_arguments,
+      @screenview_arguments,
+
+      { 'name' => "converttotype",
+	'desc' => "{ImageConverter.converttotype}",
+	'type' => "string",
+	'deft' => "",
+	'reqd' => "no" },
+
+
+      { 'name' => "converttosize",
+	'desc' => "{VideoPlugin.converttosize}",
+	'type' => "int",
+	'deft' => "",
+##	'deft' => "352",
+	'reqd' => "no" },
+      { 'name' => "converttobitrate",
+	'desc' => "{VideoPlugin.converttobitrate}",
+	'type' => "string",
+	'deft' => "200k",
+	'reqd' => "no" },
+	
+      { 'name' => "create_keyframes",
+	'desc' => "{VideoPlugin.extractkeyframes}",
+	'type' => "enum",
+	'list' => [{'name' => "true", 'desc' => "{common.true}"},
+			{'name' => "false", 'desc' => "{common.false}"}],
+	'deft' => "false",
+	'reqd' => "no" },
+	   { 'name' => "keyframes_algorithm",
+	'desc' => "{VideoPlugin.keyframesAlgorithm}",
+	'type' => "enum",
+	'list' => [{'name' => "mtn", 'desc' => "{keyframesAlgorithm.mtn}"},
+		{'name' => "ffkeyframe", 'desc' => "{keyframesAlgorithm.ffkeyframe}"}],
+	'deft' => "mtn",
+	'reqd' => "no" },
+	
+      { 'name' => "ffkeyframe_num_shots",
+	'desc' => "{VideoPlugin.keep_keyframes}",
+	'type' => "string",
+	'deft' => "all",
+	'reqd' => "no" },
+	
+	 { 'name' => "mtn_skip_intro",
+	'desc' => "{VideoPlugin.mtnSkipIntro}",
+	'type' => "int",
+	'deft' => "0",
+	'reqd' => "no" },
+	 { 'name' => "mtn_skip_end",
+	'desc' => "{VideoPlugin.mtnSkipEnd}",
+	'type' => "int",
+	'deft' => "0",
+	'reqd' => "no" },
+	 { 'name' => "mtn_timestep",
+	'desc' => "{VideoPlugin.mtnTimestep}",
+	'type' => "int",
+	'deft' => "120",
+	'reqd' => "no" },
+	 { 'name' => "mtn_detect_blanks",
+	'desc' => "{VideoPlugin.mtnDetectBlanks}",
+	'type' => "int",
+	'deft' => "80",
+	'range' => "0,100",
+	'reqd' => "no" },
+#	{ 'name' => "mtn_detect_sharpness",
+#	'desc' => "{VideoPlugin.mtnDetectSharpness}",
+#	'type' => "enum",
+#	[{'name' => "off", 'desc' => "{mtnDetectSharpness.off}"},
+#	{'name' => "low", 'desc' => "{mtnDetectSharpness.low}"},
+#	{'name' => "medium", 'desc' => "{mtnDetectSharpness.medium}"},
+#	{'name' => "high", 'desc' => "{mtnDetectSharpness.high}"},
+#	{'name' => "highest", 'desc' => "{mtnDetectSharpness.highest}"}],
+#	'deft' => "highest",
+#	'reqd' => "no" },	
+	
+	{ 'name' => "create_montage",
+	'desc' => "{VideoPlugin.createMontage}",
+	'type' => "enum",
+	'list' => [{'name' => "true", 'desc' => "{common.true}"},
+			{'name' => "false", 'desc' => "{common.false}"}],
+	'deft' => "false",
+	'reqd' => "no" },
+	
+      { 'name' => "streamingsize",
+	'desc' => "{VideoPlugin.streamingsize}",
+	'type' => "int",
+	'deft' => "352",
+	'reqd' => "no" },
+      { 'name' => "streamingbitrate",
+	'desc' => "{VideoPlugin.streamingbitrate}",
+	'type' => "string",
+	'deft' => "200k",
+	'reqd' => "no" },
+	{ 'name' => "streamingHQsize",
+	'desc' => "{VideoPlugin.streamingsize}",
+	'type' => "int",
+	'deft' => "720",
+	'reqd' => "no" },
+	{ 'name' => "streamingHQVideoBitrate",
+	'desc' => "{VideoPlugin.streamingbitrate}",
+	'type' => "int",
+	'deft' => "496",
+	'reqd' => "no" },
+	{ 'name' => "streamingHQAudioBitrate",
+	'desc' => "{VideoPlugin.streamingbitrate}",
+	'type' => "int",
+	'deft' => "80",
+	'reqd' => "no" },
+	{ 'name' => "videoDeinterlacingFilter",
+	'desc' => "Activate a deinterlacing filter to increase the quality of TV footage",
+	'type' => "enum",
+	'list' => [{'name' => "true", 'desc' => "{common.true}"},
+		   {'name' => "false", 'desc' => "{common.false}"}],
+	'deft' => "false",
+	'reqd' => "no" },
+	{ 'name' => "getMaximumMetadata",
+	'desc' => "Extract the maximum technical information of each video",
+	'type' => "enum",
+	'list' => [{'name' => "true", 'desc' => "{common.true}"},
+		   {'name' => "false", 'desc' => "{common.false}"}],
+	'deft' => "false",
+	'reqd' => "no" },
+
+      { 'name' => "minimumsize",
+	'desc' => "{ImageConverter.minimumsize}",
+	'type' => "int",
+	'deft' => "100",
+	'range' => "1,",
+	'reqd' => "no" },
+
+		 ];
+
+my $options = { 'name' => "VideoConverter",
+		'desc' => "{VideoConverter.desc}",
+		'abstract' => "yes",
+		'inherits' => "yes",
+		'args' => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    my $self = new MultimediaConverter($pluginlist, $inputargs, $hashArgOptLists, 1);
+
+
+    return bless $self, $class;
+
+}
+
+
+#  Here we use 'MediaInfo' for video and ask for a specific specification
+sub mediaInfo_Inform_Cmd {
+	my ($video, $parameter, $outhandle, $verbosity) = @_;
+	
+	# Use MediaInfo CLI to get the file spec according to the requested parameter
+    my $command = "mediainfo --Inform=\"$parameter\" \"$video\"";
+
+    print $outhandle "  $command\n" if ($verbosity > 2);
+    my $result = '';
+    $result = `$command 2>&1`;
+	chomp $result;
+    print $outhandle "  $result\n" if ($verbosity > 4);
+	
+	# Return the asked spec
+    return ($result);
+}
+
+# Here we use mediaInfo to get all the possible metadata in XML form that could then be parsed
+# the result will vary depending on the file type and how it was encoded
+sub mediaInfo_XML_Cmd {
+    my ($video, $outhandle, $verbosity) = @_;
+	
+    # Use MediaInfo CLI to get the file spec according to the requested parameter
+    my $command = "mediainfo --Output=XML \"$video\"";
+    
+    print $outhandle "  $command\n" if ($verbosity > 2);
+    my $result = '';
+    $result = `$command 2>&1`;
+    print $outhandle "  $result\n" if ($verbosity > 4);
+    
+	# Return the asked spec
+    return ($result);
+}
+
+# Here we parse the video specs contained in the XML text in order to create a metadata entry for each field
+# that mediainfo is giving back, this can vary from media file to media file.
+sub mediaInfo_parse_XML {
+    my ($xmlTxt, $outhandle, $verbosity) = @_;
+    
+    my @parts = split(/<track\s+type=\"(.*?)\">/is,$xmlTxt);
+    
+    shift @parts; # Skip preamble
+    my $metadata_table = {};
+    
+    while (@parts) {
+	my $type = shift(@parts);
+	my $vals = shift(@parts);
+	my @fieldlist=();
+	while ($vals =~ s/<(.*?)>(.*?)<\/\1>//) {
+	    my $metaname = $1;
+	    my $metaval  = $2;
+	    my $fullmetaname = "mi.$type\^$metaname";
+	    $metadata_table->{$fullmetaname}= $metaval;
+	    push(@fieldlist,$fullmetaname);
+	}
+	
+	$metadata_table->{"mi.${type}Fields"}= join(",",@fieldlist);
+    }
+    
+    return $metadata_table;
+
+	while (@parts) {
+		my $type = shift(@parts);
+		my $vals = shift(@parts);
+		my @fieldlist=();
+		while ($vals =~ s/<(.*?)>(.*?)<\/\1>//) {
+		  my $metaname = $1;
+		  my $metaval  = $2;
+		  my $fullmetaname = "mi.$type\^$metaname";
+		  if($metaname ne "Complete_name") #ignore this field as it is pointing to the cache directory
+			  {
+			  $metadata_table->{$fullmetaname}= $metaval;
+			  push(@fieldlist,$fullmetaname);
+			  }
+		}
+		$metadata_table->{"mi.${type}Fields"}= join(",",@fieldlist);
+	}
+	return $metadata_table;
+
+}
+
+sub identifyMI { 
+    my ($video, $outhandle, $verbosity) = @_;
+
+    # Use the MediaInfo command to get the file specs
+    my $command = "MediaInfo \"$video\"";
+
+    print $outhandle "  $command\n" if ($verbosity > 2);
+    my $result = '';
+    $result = `$command 2>&1`;
+    print $outhandle "  $result\n" if ($verbosity > 4);
+
+    # Read the type, width, and height etc. from media file
+	# This could be done in a more efficient way by only calling the application MediaInfo once and
+	# giving all the parameters inside a special macro file then parsing the results, however
+	# on most operating system when the application is called once it is then cached for subsequent calls.
+	# General info
+    my $vtype			= mediaInfo_Inform_Cmd($video,"General;%Format%",$outhandle,0); #Container of the video e.g. MPEG-TS
+	my $duration		= mediaInfo_Inform_Cmd($video,"General;%Duration%",$outhandle,0); #Duration of the video in ms e.g. 5545841
+	my $durationDisplay	= mediaInfo_Inform_Cmd($video,"General;%Duration/String%",$outhandle,0); #Duration of the video in minutes and secs or hours and minutes e.g. 25m 12s or 2h 26m
+	my $filesize		= mediaInfo_Inform_Cmd($video,"General;%FileSize%",$outhandle,0); #File size in bytes e.g. 1024
+	my $filesizeDisplay	= mediaInfo_Inform_Cmd($video,"General;%FileSize/String%",$outhandle,0); #File size with measure e.g. 25.6 MiB
+	my $orateDisplay	= mediaInfo_Inform_Cmd($video,"General;%OverallBitRate/String%",$outhandle,0); #General file bitrate with measure e.g. 7 538 Kbps
+	# Video info
+    my $vcodec			= mediaInfo_Inform_Cmd($video,"Video;%Format%",$outhandle,0); #Codec used for the video compression e.g. AVC
+	my $vrate			= mediaInfo_Inform_Cmd($video,"Video;%BitRate%",$outhandle,0); #Bitrate used for the video stream in bps e.g. 546165
+    my $width			= mediaInfo_Inform_Cmd($video,"Video;%Width%",$outhandle,0); #Width of the video in pixels e.g. 1920
+    my $height			= mediaInfo_Inform_Cmd($video,"Video;%Height%",$outhandle,0); #Height of the video in pixels e.g. 1080
+    my $fps				= mediaInfo_Inform_Cmd($video,"Video;%FrameRate%",$outhandle,0); #Video frames per second e.g. 30
+	# Audio info
+    my $acodec			= mediaInfo_Inform_Cmd($video,"Audio;%Format%",$outhandle,0); # Audio codec used for the compression e.g. AAC
+    my $afreq			= mediaInfo_Inform_Cmd($video,"Audio;%SamplingRate/String%",$outhandle,0); #Sampling rate used for audio encoding e.g. 48000
+    my $achan			= mediaInfo_Inform_Cmd($video,"Audio;%Channel(s)%",$outhandle,0); #Number of channels e.g. 2
+    my $arate			= mediaInfo_Inform_Cmd($video,"Audio;%BitRate%",$outhandle,0); #Audio bitrate for the audio stream in bps e.g. 65436
+	my $atracks			= mediaInfo_Inform_Cmd($video,"Audio;%StreamCount%",$outhandle,0); #number of audio tracks in this video file e.g. 1
+	# Subtitles info
+	my $stype			= mediaInfo_Inform_Cmd($video,"Text;%Format%",$outhandle,0); # Format used for the subtitles e.g. DVB Subtitle
+	my $slang			= mediaInfo_Inform_Cmd($video,"Text;%Language/String%",$outhandle,0); # Language used for the subtitles e.g. English
+		
+
+	my $xmlTxt =  mediaInfo_XML_Cmd ($video,$outhandle,0);
+	my $metadata_table = mediaInfo_parse_XML($xmlTxt,$outhandle,0);
+	
+    # Return the specs
+	my $identify_vals = { "vtype" => $vtype, "width" => $width, "height" => $height, "duration" => $duration, "filesize" => $filesize, "vcodec" => $vcodec,
+	"fps" => $fps, "acodec" => $acodec, "afreq" => $afreq, "achan" => $achan, "arate" => $arate, "metadata_table" => $metadata_table, "durationDisplay" => $durationDisplay,
+	"filesizeDisplay" => $filesizeDisplay, "orateDisplay" => $orateDisplay, "vrate" => $vrate, "stype" => $stype, "slang" => $slang, "atracks" => $atracks	};
+
+	return $identify_vals;
+}
+
+# Here we use 'ffmpeg' for video and ask for a specific specification
+# This is now deprecated this will be replaced by identifyMI in the future
+sub identify { 
+    my ($video, $outhandle, $verbosity) = @_;
+
+    # Use the ffmpeg command to get the file specs
+    my $command = "ffmpeg -i \"$video\"";
+
+    print $outhandle "  $command\n" if ($verbosity > 2);
+    my $result = '';
+    $result = `$command 2>&1`;
+    print $outhandle "  $result\n" if ($verbosity > 4);
+
+    # Read the type, width, and height etc.
+    my $vtype =  'unknown';
+    my $vcodec = 'unknown';
+    my $width =  'unknown';
+    my $height = 'unknown';
+    my $fps    = 'unknown';
+
+    my $atype =  'unknown';
+    my $afreq =  'unknown';
+    my $achan =  'unknown';
+    my $arate =  'unknown';
+
+    my $video_safe = quotemeta $video;
+
+    # strip off everything up to filename
+    $result =~ s/^.*\'$video_safe\'://s;
+
+##    if ($result =~ m/Video: (.*?) fps/m) {
+    if ($result =~ m/^\s+Stream.*?Video: (.*?)$/m) {
+	my $video_info = $1;
+	$video_info =~ s/\s*\[.*?\]//g;
+
+	my @video_fields = split(/,\s*/,$video_info);
+	
+	$vtype = shift @video_fields;
+
+	if ($video_fields[0] !~ m/(\d+)x(\d+)/) {
+	    $vcodec = shift @video_fields;
+	}
+	my $video_dim = shift @video_fields;
+
+	($width,$height) = ($video_dim =~ m/(\d+)x(\d+)/);
+	
+	if ($video_fields[0] =~ m/(\d+)\s+tbr$/) {
+	    $fps = $1;
+	}
+
+#	if ($video_info =~ m/([^,]+),(?: ([^,]+),)? (\d+)x(\d+),.*?(\d+\.\d+)/)
+#	{
+#	    $vtype = $1;
+#	    $vcodec = $2 if defined $2;
+#	    $width = $3;
+#	    $height = $4;
+#	    $fps = $5;
+#	}
+    }
+
+    if ($result =~ m/Audio: (\w+), (\d+) Hz, (\w+)(?:, (\d+.*))?/m) {
+	$atype = $1;
+	$afreq = $2;
+	$achan = $3;
+	$arate = $4 if (defined $4);
+    }
+
+    # Read the duration
+    my $duration = "unknown";
+    if ($result =~ m/Duration: (\d+:\d+:\d+\.\d+)/m) {
+	$duration = $1;
+    }
+    print $outhandle "  file: $video:\t $vtype, $width, $height, $duration\n" 
+	if ($verbosity > 2);
+
+    if ($verbosity >3) {
+	print $outhandle "\t video codec=$vcodec, fps = $fps\n";
+	print $outhandle "\t audio codec=$atype, freq = $afreq Hz, $achan, $arate\n";
+    }
+
+	
+	my $identify_vals = { "vtype" => $vtype, "width" => $width, "height" => $height, "duration" => $duration, "filesize" => -s $video, "vcodec" => $vcodec,
+	"fps" => $fps, "acodec" => $atype, "afreq" => $afreq, "achan" => $achan, "arate" => $arate };
+
+	return $identify_vals;
+	
+    # Return the specs
+    return ($vtype, $width, $height, $duration, -s $video,
+	    $vcodec,$fps,$atype,$afreq,$achan,$arate);
+}
+
+
+sub vob_durations
+{
+    my ($media_base_dir,$title_num,$outhandle) = @_;
+
+    my $filter_re = sprintf("^VTS_%02d_[1-9]\\.VOB\$",$title_num);
+
+    my $duration_info = {};
+
+    if (opendir(VTSIN,$media_base_dir)) {
+	my @vts_title_vobs = grep { $_ =~ m/$filter_re/ } readdir(VTSIN);
+	closedir(VTSIN);
+
+	foreach my $v (@vts_title_vobs) {
+	    my $full_v = &util::filename_cat($media_base_dir,$v);
+
+	    my $identify_hash = identifyMI($full_v,$outhandle,0);
+		
+		my $duration = $identify_hash->{'duration'};
+
+	    my ($vob_num) = ($v =~ m/^VTS_\d\d_(\d)\.VOB$/);
+
+	    $duration_info->{$vob_num} = $duration;
+	    print STDERR "**** $title_num: $title_num, storing {$vob_num} => $duration\n";
+
+	}
+
+    }
+    else {
+	print $outhandle "Warning: unable to read files in directory $media_base_dir\n";
+    }
+    
+    return $duration_info;
+
+}
+
+
+
+sub init_cache_for_file {
+    my $self = shift(@_);
+
+    my ($video_filename) = @_;
+
+    $self->SUPER::init_cache_for_file($video_filename);
+
+					
+    my @flvtool2_monitor = ( 'monitor_init'   ,"convertutil::monitor_init_unbuffered",
+			     'monitor_line'   , "VideoConverter::flvtool2_monitor_line",
+			     'monitor_deinit' , "convertutil::monitor_deinit_unbuffered" );
+					
+    $self->{'flvtool2_monitor'} = \@flvtool2_monitor;
+
+
+}
+
+
+
+sub optional_frame_scale
+{
+    my $self = shift (@_);
+    my ($orig_size,$video_width,$video_height) = @_;
+
+    my $s_opt = "";
+
+    if ($video_width > $video_height) {
+	if ($video_width > $orig_size) {
+	    my $scale_factor = $orig_size/$video_width;
+	    my $scaled_width = int($video_width * $scale_factor);
+	    my $scaled_height = int($video_height * $scale_factor);
+
+	    # round to be ensure multiple of 2 (needed by some codecs)
+	    $scaled_width  = int($scaled_width/2)*2;
+	    $scaled_height = int($scaled_height/2)*2;
+
+	    $s_opt = "-s ${scaled_width}x${scaled_height}";
+	}
+	# else, video is smaller than requested size, don't scale up
+    }
+    else {
+	if ($video_height > $orig_size) {
+	    my $scale_factor = $orig_size/$video_height;
+	    my $scaled_width = int($video_width * $scale_factor);
+	    my $scaled_height = int($video_height * $scale_factor);
+
+	    # round to be ensure multiple of 2 (needed by some codecs)
+	    $scaled_width  = int($scaled_width/2)*2;
+	    $scaled_height = int($scaled_height/2)*2;
+
+	    $s_opt = "-s ${scaled_width}x${scaled_height}";
+	}
+	# else, video is smaller than requested size, don't scale up
+	
+    }
+    
+    return $s_opt;
+}
+
+
+sub ffKeyframe_cmd
+{
+    my $self = shift (@_);
+    my ($ivideo_filename) = @_;
+
+    my $video_ext_dir = &util::filename_cat($ENV{'GSDLHOME'},"ext","video");
+
+    my $output_dir = $self->{'cached_dir'};
+    my $ivideo_root = $self->{'cached_file_root'};
+
+    my $oshot_filename = &util::filename_cat($output_dir,"shots.xml");
+
+    my $exp_duration = $self->{'exp_duration'};
+    my $t_opt = (defined $exp_duration) ? "-t $exp_duration" : "";
+
+    my $main_opts = "-y $t_opt";
+
+    my $hive = &util::filename_cat($video_ext_dir,"lib","vhook","hive.so");
+
+    my $oflash_filename = &util::filename_cat($output_dir,"$ivideo_root\_keyframe.flv");
+
+    my $vhook_opts = "$hive  -o $oshot_filename -k $output_dir $ivideo_filename";
+
+    my $ivideo_filename_gsdlenv = $self->gsdlhome_independent($ivideo_filename);
+    my $oflash_filename_gsdlenv = $self->gsdlhome_independent($oflash_filename);
+
+    my $ffmpeg_cmd = "ffkeyframe  $main_opts -vhook \"$vhook_opts\"   -i \"$ivideo_filename_gsdlenv\" -an -y \"$oflash_filename_gsdlenv\"";
+
+
+    return ($ffmpeg_cmd,$oflash_filename);
+}
+
+
+sub mtnKeyframe_cmd
+{
+    my $self = shift (@_);
+    my ($ivideo_filename) = @_;
+
+    my $video_ext_dir = &util::filename_cat($ENV{'GSDLHOME'},"ext","video");
+
+    my $output_dir = $self->{'cached_dir'};
+    my $ivideo_root = $self->{'cached_file_root'};
+
+    my $frames_output_dir = &util::filename_cat($output_dir,"frames");
+
+	my $main_opts = "-z -P -I -O \"$frames_output_dir\"";
+	 
+	my $mtn_skip_intro_secs   = $self->{'mtn_skip_intro'};
+	my $mtn_skip_end_secs     = $self->{'mtn_skip_end'};
+	my $mtn_timestep_secs     = $self->{'mtn_timestep'};
+	my $mtn_detect_blank_perc = $self->{'mtn_detect_blanks'};
+	
+	my $mtn_detect_blank = $mtn_detect_blank_perc/100.0;
+	
+	my $keyframe_height;
+	if ($self->{'create_screenview'} eq "true") {
+		$keyframe_height = $self->{'screenviewsize'};
+	}
+	else {
+		# assume thumbnail size
+		$keyframe_height = $self->{'thumbnailsize'};
+	}
+		
+	$main_opts .= " -B $mtn_skip_intro_secs";
+	$main_opts .= " -E $mtn_skip_end_secs";
+	$main_opts .= " -s $mtn_timestep_secs";
+	$main_opts .= " -b $mtn_detect_blank";
+	$main_opts .= " -h $keyframe_height";
+	
+    my $ivideo_filename_gsdlenv = $self->gsdlhome_independent($ivideo_filename);
+ 
+    my $mtn_cmd = "mtn  $main_opts \"$ivideo_filename_gsdlenv\"";
+
+    my $output_s_filename = &util::filename_cat($frames_output_dir,$ivideo_root."_s.jpg");
+
+    return ($mtn_cmd,$output_s_filename);
+}
+
+
+sub get_ovideo_file
+{
+	my $self = shift (@_);
+	my ($stream_type) = @_;
+	
+    my $ivideo_root = $self->{'cached_file_root'};
+	my $ofile;
+	
+	if ($stream_type eq "flv")
+	{
+		$ofile = "${ivideo_root}_vstream.flv";
+	}
+	else
+	{
+		$ofile = "${ivideo_root}_vHQstream.mp4";
+	}
+	
+	return $ofile;
+}
+
+sub get_ovideo_filename
+{
+	my $self = shift (@_);
+	my ($stream_type) = @_;
+	
+	my $output_dir = $self->{'cached_dir'};
+
+	my $ofile = $self->get_ovideo_file($stream_type);
+		
+	my $ofilename = &util::filename_cat($output_dir,$ofile);
+	
+	return $ofilename;
+}
+
+# Generate the command to use with Handbrake to recompress a video using h264/aac compatible with Flash Player 10
+sub stream_mp4_video_cmd
+{
+    my $self = shift (@_);
+    my ($ivideo_filename,$streaming_HQ_size, $streaming_HQ_VideoBitrate,
+	 $streaming_HQ_AudioBitrate) = @_;
+
+    my $output_dir = $self->{'cached_dir'};
+    my $ivideo_root = $self->{'cached_file_root'};
+
+    my $omp4_file = "${ivideo_root}_vHQstream.mp4";
+    my $omp4_filename = &util::filename_cat($output_dir,$omp4_file);
+
+
+    #my $exp_duration = $self->{'exp_duration'};
+    #my $t_opt = (defined $exp_duration) ? "-t $exp_duration" : "";
+
+	my $deinterlace = $self->{'videoDeinterlacingFilter'};
+	my $video_processing_parameters;	
+	# Use specific resizing algorythms depending if we need to downsize the video resolution or not
+	if(!$streaming_HQ_size || $streaming_HQ_size eq "fullsize") { 
+		$video_processing_parameters = "--strict-anamorphic";
+	} else {
+		$video_processing_parameters = "-w $streaming_HQ_size --loose-anamorphic";
+	}
+	# Use the deinterlace video filter if enabled in the plugin
+	if ($deinterlace eq "true")
+	{
+		$video_processing_parameters .= " --decomb";
+	}
+
+    my $ivideo_filename_gsdlenv = $self->gsdlhome_independent($ivideo_filename);
+    my $omp4_filename_gsdlenv = $self->gsdlhome_independent($omp4_filename);
+	
+	# Generate the pre and post video parameters for Handbrake v0.9.4
+	my $pre_opts = "-t 1 -c 1";
+	my $post_opts = "-f mp4 -O $video_processing_parameters -e x264 -b $streaming_HQ_VideoBitrate -a 1 -E faac -6 dpl2 -R Auto -B $streaming_HQ_AudioBitrate -D 0.0 -x ref=2:bframes=2:subq=6:mixed-refs=0:weightb=0:8x8dct=0:trellis=0";
+
+	my $handbrake_cmd = "HandbrakeCLI.exe -i \"$ivideo_filename_gsdlenv\" $pre_opts -o \"$omp4_filename_gsdlenv\" $post_opts";
+
+    #print STDERR "****\nHandbrake command: $handbrake_cmd\n****\n";
+	
+    return ($handbrake_cmd,$omp4_filename,$omp4_file);
+}
+
+
+
+sub stream_flv_video_cmd
+{
+    my $self = shift (@_);
+    my ($ivideo_filename,$video_width,$video_height,
+	$streaming_quality,
+	$streaming_bitrate,$streaming_size, 
+	$opt_streaming_achan, $opt_streaming_arate) = @_;
+
+    my $streaming_achan 
+	= (defined $opt_streaming_achan) ? $opt_streaming_achan : 2;
+
+    my $streaming_arate 
+	= (defined $opt_streaming_arate) ? $opt_streaming_arate : 22050;
+
+    my $output_dir = $self->{'cached_dir'};
+    my $ivideo_root = $self->{'cached_file_root'};
+
+    my $oflash_file = "${ivideo_root}_vstream.flv";
+    my $oflash_filename = &util::filename_cat($output_dir,$oflash_file);
+
+    my $s_opt = "";
+    my $media_type = $self->{'media_type'};
+    if ($media_type ne "audio") {
+	$s_opt = $self->optional_frame_scale($streaming_size,$video_width,$video_height);
+    }
+
+
+    my $exp_duration = $self->{'exp_duration'};
+    my $t_opt = (defined $exp_duration) ? "-t $exp_duration" : "";
+
+    my $main_opts = "-y $t_opt";
+
+    my $bitrate_opt = "-b $streaming_bitrate";
+    ### my $stream_opts = "-r 25 $s_opt";
+    my $stream_opts .= " $s_opt -ac $streaming_achan -ar $streaming_arate";
+
+    # -flags +ilme+ildct' and maybe '-flags +alt' for interlaced material, and try '-top 0/1'
+
+    my $all_opts = "$main_opts $stream_opts"; 
+
+    my $ffmpeg_cmd;
+
+    my $ivideo_filename_gsdlenv = $self->gsdlhome_independent($ivideo_filename);
+    my $oflash_filename_gsdlenv = $self->gsdlhome_independent($oflash_filename);
+
+    if ($streaming_quality eq "high") {
+
+	my $pass_log_file = &util::filename_cat($output_dir,"$ivideo_root-logpass.txt");
+	if (-e $pass_log_file) {
+	    &util::rm($pass_log_file);
+	}
+
+	my $pass_log_file_gsdlenv = $self->gsdlhome_independent($pass_log_file);
+
+	$all_opts .= " -passlogfile \"$pass_log_file_gsdlenv\"";
+
+	my $ffmpeg_cmd_pass1 = "ffmpeg -pass 1 -i \"$ivideo_filename_gsdlenv\" $all_opts -y \"$oflash_filename_gsdlenv\"";
+
+	my $ffmpeg_cmd_pass2 = "ffmpeg -pass 2 -i \"$ivideo_filename_gsdlenv\" $all_opts $bitrate_opt -y \"$oflash_filename_gsdlenv\"";
+	$ffmpeg_cmd = "( $ffmpeg_cmd_pass1 && $ffmpeg_cmd_pass2 )";
+    }
+    else {
+	# single pass
+
+	$ffmpeg_cmd = "ffmpeg -i \"$ivideo_filename_gsdlenv\" $all_opts -y \"$oflash_filename_gsdlenv\"";
+    }
+
+    return ($ffmpeg_cmd,$oflash_filename,$oflash_file);
+}
+
+
+
+
+sub stream_flv_audio_cmd
+{
+    # AudioConverter also has a routine for doing this
+    # => merge into one!
+    # **************
+
+    my $self = shift (@_);
+    my ($ivideo_filename, $opt_streaming_achan, $opt_streaming_arate) = @_;
+
+    # Convert either audio or video to streamable audio format
+
+    my $streaming_achan 
+	= (defined $opt_streaming_achan) ? $opt_streaming_achan : 2;
+
+    my $streaming_arate 
+	= (defined $opt_streaming_arate) ? $opt_streaming_arate : 22050;
+
+    my $output_dir = $self->{'cached_dir'};
+    my $ivideo_root = $self->{'cached_file_root'};
+
+    my $ofla_file = "${ivideo_root}_astream.flv";
+    my $ofla_filename = &util::filename_cat($output_dir,$ofla_file);
+
+    my $exp_duration = $self->{'exp_duration'};
+    my $t_opt = (defined $exp_duration) ? "-t $exp_duration" : "";
+
+    my $main_opts = "-vn -y $t_opt";
+
+    my $stream_opts .= " -ac $streaming_achan -ar $streaming_arate";
+
+    my $all_opts = "$main_opts $stream_opts"; 
+
+    my $ffmpeg_cmd;
+
+    my $ivideo_filename_gsdlenv = $self->gsdlhome_independent($ivideo_filename);
+    my $ofla_filename_gsdlenv = $self->gsdlhome_independent($ofla_filename);
+    $ffmpeg_cmd = "ffmpeg -i \"$ivideo_filename_gsdlenv\" $all_opts -y \"$ofla_filename_gsdlenv\"";
+
+    return ($ffmpeg_cmd,$ofla_filename,$ofla_file);
+}
+
+
+
+
+sub audio_excerpt_cmd
+{
+    my $self = shift (@_);
+    my ($ivoa_filename,$hh,$mm,$ss,$opt_excerpt_len) = @_;
+
+    # ivoa = input video or audio
+
+    my $time_encoded = "$hh:$mm:$ss";
+    my $time_encoded_file = "$hh$mm$ss";
+    
+    
+    my $output_dir = $self->{'cached_dir'};
+    my $ivoa_root = $self->{'cached_file_root'};
+
+    my $omp3_file = "${ivoa_root}_$time_encoded_file.mp3";
+    my $omp3_filename = &util::filename_cat($output_dir,$omp3_file);
+
+    my $all_opts = "-y -acodec mp3 -ss $time_encoded ";
+
+    if (defined $opt_excerpt_len) {
+	$all_opts .= "-t $opt_excerpt_len ";
+    }
+
+
+    my $ivoa_filename_gsdlenv = $self->gsdlhome_independent($ivoa_filename);
+    my $omp3_filename_gsdlenv = $self->gsdlhome_independent($omp3_filename);
+
+
+    my $ffmpeg_cmd = "ffmpeg -i \"$ivoa_filename_gsdlenv\" $all_opts  \"$omp3_filename_gsdlenv\"";
+
+    return ($ffmpeg_cmd,$omp3_filename,$omp3_file);
+}
+
+
+
+sub streamseekable_cmd
+{
+    my $self = shift (@_);
+    my ($oflash_filename) = @_;
+
+    my $output_dir = $self->{'cached_dir'};
+    my $ivideo_root = $self->{'cached_file_root'};
+
+    ## my $cue_filename = &util::filename_cat($output_dir,"on_cue.xml");
+
+    my $flvtool_cmd = "flvtool2 -vUP \"$oflash_filename\"";
+
+    return ($flvtool_cmd,$oflash_filename);
+}
+
+
+sub streamkeyframes_cmd
+{
+    my $self = shift (@_);
+    my ($oflash_filename,$doc_obj,$section) = @_;
+
+    my $assocfilepath 
+	= $doc_obj->get_metadata_element($section,"assocfilepath");
+
+    my $output_dir = $self->{'cached_dir'};
+
+    my $cue_filename = &util::filename_cat($output_dir,"on_cue.xml");
+ 
+    my $flvtool_cmd = "flvtool2 -vAUtP \"$cue_filename\"  \"$oflash_filename\"";
+
+    return ($flvtool_cmd,$oflash_filename);
+}
+
+
+sub streamkeyframes_cmd_old
+{
+    my $self = shift (@_);
+    my ($oflash_filename,$doc_obj,$section) = @_;
+
+    my $assocfilepath 
+	= $doc_obj->get_metadata_element($section,"assocfilepath");
+
+    my $output_dir = $self->{'cached_dir'};
+
+    my $cue_filename = &util::filename_cat($output_dir,"on_cue.xml");
+
+    my $video_server = $ENV{'GEXT_VIDEO_SERVER'}; 
+    my $video_prefix = $ENV{'GEXT_VIDEO_PREFIX'};
+
+    my $collect = $ENV{'GSDLCOLLECTION'};
+ 
+    print STDERR "**** Warning: need to remove dependency of GEXT_VIDEO_SERVER and _PREFIX\n";
+
+    my $flvtool_cmd = "flvtool2 -vAUtP \"$cue_filename\" -thumbLocation:$video_server$video_prefix/collect/$collect/index/assoc/$assocfilepath \"$oflash_filename\"";
+
+
+    return ($flvtool_cmd,$oflash_filename);
+}
+
+
+sub streamcuepts_cmd
+{
+    my $self = shift (@_);
+    my ($oflash_filename) = @_;
+
+    my $output_dir = $self->{'cached_dir'};
+
+    my $cue_filename = &util::filename_cat($output_dir,"on_cue.xml");
+
+    ##my $video_server = $ENV{'GEXT_VIDEO_SERVER'}; 
+    ##my $video_prefix = $ENV{'GEXT_VIDEO_PREFIX'};
+
+    ## my $collect = $ENV{'GSDLCOLLECTION'};
+
+    ## my $thumbloc = "$video_server$video_prefix/collect/$collect";
+
+
+#    my $flvtool_cmd = "flvtool2 -vUAtP \"$cue_filename\" -thumbLocation:$thumbloc \"$oflash_filename\"";
+
+#    my $flvtool_cmd = "flvtool2 -vUAt \"$cue_filename\" \"$oflash_filename\"";
+
+
+
+#    my $flvtool_cmd = "flvtool2 -vUAt \"$cue_filename\" \"$oflash_filename\"";
+
+
+##    my $flvtool_cmd = "flvtool2 -vAt \"$cue_filename\" -UP \"$oflash_filename\" \"$output_dir/updated.flv\"";
+
+##    my $flvtool_cmd = "flvtool2 -vAtU \"$cue_filename\" \"$oflash_filename\" \"$output_dir/updated.flv\"";
+
+    my $flvtool_cmd = "flvtool2 -vAtUP \"$cue_filename\" \"$oflash_filename\"";
+
+    return ($flvtool_cmd,$oflash_filename);
+}
+
+
+sub keyframe_thumbnail_cmd
+{
+    my $self = shift (@_);
+    my ($ivideo_filename,$thumbnailfile,$thumbnailwidth,$thumbnailheight,$video_duration) = @_;
+
+    my $output_dir = $self->{'cached_dir'};
+    my $ivideo_root = $self->{'cached_file_root'};
+
+    my $key_filename_prefix = &util::filename_cat($output_dir,$ivideo_root);
+
+
+    # Try for 4th keyframe, but fall back to 1st if doesn't exist
+    my $key_filename = "${key_filename_prefix}_0003.jpg";
+    $key_filename = "${key_filename_prefix}_0000.jpg" if (!-e $key_filename);
+
+    my $key_filename_gsdlenv = $self->gsdlhome_independent($key_filename);
+    my $thumbnailfile_gsdlenv = $self->gsdlhome_independent($thumbnailfile);
+
+    my $command;
+
+    if (-e $key_filename) {
+	$command = "convert -interlace plane -verbose -geometry $thumbnailwidth" 
+	    . "x$thumbnailheight \"$key_filename_gsdlenv\" \"$thumbnailfile_gsdlenv\"";
+    }
+    else {
+	# create_keyframe is either false, or else had a problem when running
+	# => extract a from 
+	# my $frame_rate = 1.0 / 60.0;
+	
+	my $ivideo_filename_gsdlenv = $self->gsdlhome_independent($ivideo_filename);
+
+	 # If ever reused, then needs to change to newer hashmap method
+	 #my ($vtype, $width, $height, $duration, $vsize,
+		#	$vcodec ,$fps ,$atype ,$afreq ,$achan ,$arate) = identify($ivideo_filename_gsdlenv,$outhandle,0);
+	
+	#print STDERR "***** grabbing keyframe as 50% of $video_duration\n";
+	my $ss_opt = ($video_duration / 1000.0) * 0.35;
+	#print STDERR "*** ssopt = $ss_opt\n";
+	
+	$command = "ffmpeg  -ss $ss_opt -i \"$ivideo_filename_gsdlenv\" -ss 4.5 -an -vframes 1 -f image2 -s ${thumbnailwidth}x${thumbnailheight} -deinterlace -y \"$thumbnailfile_gsdlenv\"";
+	#$command = "ffmpeg -ss 4.5 -i \"$ivideo_filename_gsdlenv\" -ss 4.5 -an -vframes 1 -f image2 -s ${thumbnailwidth}x${thumbnailheight} -deinterlace -y \"$thumbnailfile_gsdlenv\"";
+
+	# fmpeg -i input.dv -r 1 -f image2 -s 120x96 images%05d.png
+    }
+
+    return ($command,$thumbnailfile);
+}
+
+
+
+
+sub keyframe_montage_cmd
+{
+    my $self = shift (@_);
+    my ($ivideo_filename,$montagefile) = @_;
+
+    my $output_dir = $self->{'cached_dir'};
+    my $ivideo_root = $self->{'cached_file_root'};
+
+    my $key_filename_prefix = &util::filename_cat($output_dir,$ivideo_root);
+
+    my $options = "-tile 10  -geometry 75x62+2+2";
+
+    my $command = "montage $options ${key_filename_prefix}_*.jpg \"$montagefile\"";
+
+    return ($command,$montagefile);
+}
+
+
+
+sub parse_shot_xml
+{
+    my ($self) = shift(@_);
+
+    my $outhandle = $self->{'outhandle'};
+    my $output_dir = $self->{'cached_dir'};
+
+    my $shots_filename = &util::filename_cat($output_dir,"shots.xml");
+
+    eval {
+	$self->{'parser'}->parsefile($shots_filename);
+    };
+    
+    if ($@) {
+	print $outhandle "VideoConverter: skipping $shots_filename as not conformant to Hive shot syntax\n" if ($self->{'verbosity'} > 1);
+	print $outhandle "\n Perl Error:\n $@\n" if ($self->{'verbosity'}>2);
+	return 0;
+    }
+
+}
+
+
+sub parse_shot_dir
+{
+    my ($self) = shift(@_);
+    
+    my $outhandle = $self->{'outhandle'};
+    my $output_dir = $self->{'cached_dir'};
+    
+    my $ivideo_root  = $self->{'cached_file_root'};
+    
+    my $frames_output_dir = &util::filename_cat($output_dir,"frames");
+    
+    my @jpeg_frames = ();
+    
+    if (opendir(FDIRIN, $frames_output_dir)) {
+	@jpeg_frames = grep { $_ =~ /_\d+\.jpg$/ } readdir(FDIRIN);
+	closedir(FDIRIN);
+    }
+    else {
+	print STDERR "VideoConverter:: Failed to open directory $frames_output_dir:\n$!\n";
+	return 0;
+    }
+    
+    $self->{'keyframe_timeline'} = {};
+    
+    my $vfps = $self->{'video-fps'};
+    
+    my $keyframe_index = 1;
+    
+    foreach my $f (@jpeg_frames) {
+	my ($hh,$mm,$ss) = ($f =~ m/_(\d{2})_(\d{2})_(\d{2})_\d+\.jpg$/);
+	my $frame_num = (3600*$hh + 60*$mm + $ss) * $vfps;
+	
+	my $time_msec = (3600*$hh + 60*$mm + $ss) * 1000;
+	
+	my $timeline_rec = { 'name'=> "Keyframe $keyframe_index",
+			     'keyframeindex' => $keyframe_index,
+			     'timestamp' => $time_msec,
+			     'thumb' => $f,
+			     'keyframenum' => $keyframe_index };
+	
+	$self->{'keyframe_timeline'}->{$keyframe_index}=$timeline_rec;
+	
+	$keyframe_index++;
+    }
+	
+    my $cue_filename = &util::filename_cat($output_dir,"on_cue.xml");
+    
+    $self->open_on_cue($cue_filename);
+
+    $self->output_distributed_keyframes($self->{'keyframe_timeline'},$self->{'ffkeyframe_num_shots'});
+
+    $self->close_on_cue();
+	
+    return 1;
+}
+
+sub associate_keyframes_old
+{
+    my ($self) = shift(@_);
+
+    my ($doc_obj,$section) = @_;
+
+    my $output_dir = $self->{'cached_dir'};
+
+    my $count = 1;
+    foreach my $kframe_file (@{$self->{'keyframe_fnames'}}) {
+
+	my $kframe_filename = &util::filename_cat($output_dir,$kframe_file);
+	$doc_obj->associate_file($kframe_filename,"keyframe$count.jpg","image/jpeg",
+				 $section);
+	$count++;
+    }
+
+    $doc_obj->add_utf8_metadata($section,"NumKeyframes",scalar(@{$self->{'keyframe_fnames'}}));
+
+
+    # *****
+    # $doc_obj->add_metadata ($section, "thumblist", $self->{'flowplayer_thumblist'});
+
+}
+
+sub associate_keyframes
+{
+    my ($self) = shift(@_);
+
+    my ($doc_obj,$topsection,$timeline) = @_;
+
+    my $output_dir = $self->{'cached_dir'};
+    
+    my $count = 1;
+
+    foreach my $t (sort { $timeline->{$a}->{'keyframeindex'} <=> $timeline->{$b}->{'keyframeindex'} } keys %$timeline)
+    {
+	my $kframe_file = $timeline->{$t}->{'thumb'};
+	my $timestamp = $timeline->{$t}->{'timestamp'};
+
+	# create next sub-section to video "document"
+	my $endchild = $doc_obj->insert_section($doc_obj->get_end_child($topsection));
+	$doc_obj->add_utf8_metadata($endchild,"Title","Timestamp $timestamp");
+	$doc_obj->add_utf8_metadata($endchild,"FrameNum",$t);
+
+	my $kframe_filename = &util::filename_cat($output_dir,$kframe_file);
+	$doc_obj->associate_file($kframe_filename,"keyframe$count.jpg",
+				 "image/jpeg",
+				 $endchild);
+
+	$doc_obj->add_utf8_metadata($endchild,"assockeyframe","keyframe$count.jpg");
+
+	$doc_obj->add_utf8_metadata($topsection,"KeyframeTimestamp",$timestamp);
+	$doc_obj->add_utf8_metadata($topsection,"KeyframeFrameNum",$t);
+
+
+
+	$count++;
+    }
+
+    #### $doc_obj->add_utf8_metadata($topsection,"NumKeyframes",scalar(@{$self->{'keyframe_fnames'}}));
+
+    $doc_obj->add_utf8_metadata($topsection,"NumKeyframes",scalar(keys %$timeline));
+
+
+    # *****
+    # $doc_obj->add_metadata ($topsection, "thumblist", $self->{'flowplayer_thumblist'});
+}
+
+
+
+sub enable_audio_streaming
+{
+    my $self = shift (@_);
+    my ($doc_obj,$originalfilename,$filename,$convertto_regenerated) = @_;
+
+    my $section = $doc_obj->get_top_section();
+
+    my $output_dir   = $self->{'cached_dir'};
+    my $ivideo_root  = $self->{'cached_file_root'};
+    
+    # Generate FLV audio-only format for streaming purposes
+
+    my $optionally_run_general_cmd = "run_uncached_general_cmd";
+    if ($self->{'enable_cache'}) {
+	$optionally_run_general_cmd
+	    = ($convertto_regenerated) ? "regenerate_general_cmd" : "run_cached_general_cmd";
+    }
+
+    
+    my $ifilename = $originalfilename || $filename;
+
+    my ($stream_cmd,$ofla_filename,$ofla_file) 
+	= $self->stream_flv_audio_cmd($ifilename);
+    
+    
+    my $streamable_options = { @{$self->{'ffmpeg_monitor'}},
+			       'message_prefix' => "Stream",
+			       'message' => "Generating streamable audio: $ofla_file" }; 
+    
+
+    my ($streamable_regenerated,$streamable_result,$streamable_had_error)
+	= $self->$optionally_run_general_cmd($stream_cmd,
+					     $ifilename,$ofla_filename,
+					     $streamable_options);
+
+
+    if (!$streamable_had_error) {
+	my ($streamseekable_cmd,$ostreamseekable_filename) = $self->streamseekable_cmd($ofla_filename);
+	
+	my $streamseekable_options = { @{$self->{'flvtool2_monitor'}},
+				       'message_prefix' => "Stream Seekable",
+				       'message' => "Reprocessing audio stream to be seekable by timeline: $ofla_file" }; 
+	
+	if ($streamable_regenerated) {
+	    $self->run_general_cmd($streamseekable_cmd,$streamseekable_options);
+	}
+    
+	my $streamable_url = $ofla_file;
+	my $streamable_url_safe = $self->url_safe($streamable_url);
+
+	$doc_obj->add_utf8_metadata ($section, "streamableaudio", $streamable_url_safe);
+	$doc_obj->associate_file($ofla_filename,$ofla_file,"audio/flash",
+			     $section);
+    }
+
+    $doc_obj->add_metadata ($section, "audioflashwidth",    400);
+    $doc_obj->add_metadata ($section, "audioflashheight",   22 + 100);
+
+    $self->{'ofla_file'} = $ofla_file;
+    $self->{'ofla_filename'} = $ofla_filename;
+
+    return $streamable_regenerated;
+}
+
+
+
+
+
+sub enable_video_streaming
+{
+    my $self = shift (@_);
+    my ($doc_obj,$originalfilename,$filename,$convertto_regenerated,
+	$video_width,$video_height) = @_;
+
+    my $section = $doc_obj->get_top_section();
+
+    my $output_dir   = $self->{'cached_dir'};
+    my $ivideo_root  = $self->{'cached_file_root'};
+    
+    # Generate the Flash FLV format for streaming purposes
+
+    my $optionally_run_general_cmd = "run_uncached_general_cmd";
+    if ($self->{'enable_cache'}) {
+	$optionally_run_general_cmd
+	    = ($convertto_regenerated) ? "regenerate_general_cmd" : "run_cached_general_cmd";
+    }
+
+
+    my $streaming_bitrate = $self->{'streamingbitrate'};
+    my $streaming_size    = $self->{'streamingsize'};
+    
+    my $streaming_quality = "high";
+    
+    my $ifilename = $originalfilename || $filename;
+
+    my ($stream_cmd,$oflash_filename,$oflash_file) 
+	= $self->stream_flv_video_cmd($ifilename,
+				     $video_width,$video_height,
+				     $streaming_quality,
+				     $streaming_bitrate, $streaming_size);
+    
+    
+    my $streamable_options = { @{$self->{'ffmpeg_monitor'}},
+			       'message_prefix' => "Stream",
+			       'message' => "Generating streamable video: $oflash_file" }; 
+    
+
+    my ($streamable_regenerated,$streamable_result,$streamable_had_error)
+	= $self->$optionally_run_general_cmd($stream_cmd,
+					     $ifilename,$oflash_filename,
+					     $streamable_options);
+    
+    if (!$streamable_had_error) {
+	my ($streamseekable_cmd,$ostreamseekable_filename) = $self->streamseekable_cmd($oflash_filename);
+	
+	my $streamseekable_options = { @{$self->{'flvtool2_monitor'}},
+				       'message_prefix' => "Stream Seekable",
+				       'message' => "Reprocessing video stream to be seekable by timeline: $oflash_file" }; 
+	
+	if ($streamable_regenerated) {
+	    $self->run_general_cmd($streamseekable_cmd,$streamseekable_options);
+	}
+	
+	my $streamable_url = $oflash_file;
+	my $streamable_url_safe = $self->url_safe($streamable_url);
+	
+	$doc_obj->add_utf8_metadata ($section, "streamablevideo", $streamable_url_safe);
+	$doc_obj->associate_file($oflash_filename,$oflash_file,"video/flash",
+				 $section);
+    }
+
+
+    #
+    # FlowPlayer.swf       height+22 pixels
+    # FlowPlayerBlack.swf  height+16 pixels
+    # FlowPlayerThermo.swf height+16 pixels
+    # FlowPlayerWhite.swf  height+26 pixels
+
+    my $flashwidth = $video_width;
+    my $flashheight = $video_height + 22;
+
+    if ($self->{'create_keyframes'} eq "true") {
+	$flashheight += 100;
+    }
+
+    $doc_obj->add_metadata ($section, "flashwidth",    $flashwidth);
+    $doc_obj->add_metadata ($section, "flashheight",   $flashheight);
+     
+    $self->{'oflash_file'} = $oflash_file;
+    $self->{'oflash_filename'} = $oflash_filename;
+
+    return $streamable_regenerated;
+}
+
+sub enable_direct_streaming
+{
+    my $self = shift (@_);
+    my ($doc_obj,$originalfilename,$filename,$file,
+	$video_width,$video_height) = @_;
+
+    my $section = $doc_obj->get_top_section();
+    
+    my $ifilename = $originalfilename || $filename;
+	#my $ifile = $self->gsdlhome_independent($ifilename);
+	my $ifile = $file;
+
+	print STDERR "Using the original video file for direct streaming: $ifile\n";
+
+	my $streamable_url = $ifile;
+	my $streamable_url_safe = $self->url_safe($streamable_url);
+	
+	my $outhandle = $self->{'outhandle'};
+
+	my $identify_vals = identifyMI($ifilename,$outhandle,0);
+
+	#Add the most common metadata extracted by MediaInfo from the streamable video file
+	$doc_obj->add_utf8_metadata ($section, "tv.HQStreamingVideoFormat", $identify_vals->{'vtype'});
+	$doc_obj->add_utf8_metadata ($section, "tv.HQStreamingVideoFileSize", $identify_vals->{'filesizeDisplay'});
+	$doc_obj->add_utf8_metadata ($section, "tv.HQStreamingVideoFileSizeBytes", $identify_vals->{'filesize'});
+	$doc_obj->add_utf8_metadata ($section, "tv.HQStreamingWidth", $identify_vals->{'width'});
+	$doc_obj->add_utf8_metadata ($section, "tv.HQStreamingHeight", $identify_vals->{'height'});
+	$doc_obj->add_utf8_metadata ($section, "tv.HQStreamingDuration", $identify_vals->{'durationDisplay'});
+	$doc_obj->add_utf8_metadata ($section, "tv.HQStreamingDurationMs", $identify_vals->{'duration'});
+	$doc_obj->add_utf8_metadata ($section, "tv.HQStreamingFPS", $identify_vals->{'fps'});
+	$doc_obj->add_utf8_metadata ($section, "tv.HQStreamingVideoCodec", $identify_vals->{'vcodec'});
+	$doc_obj->add_utf8_metadata ($section, "tv.HQStreamingVideoBitrate", $identify_vals->{'vrate'});
+	$doc_obj->add_utf8_metadata ($section, "tv.HQStreamingAudioCodec", $identify_vals->{'acodec'});
+	$doc_obj->add_utf8_metadata ($section, "tv.HQStreamingAudioBitrate", $identify_vals->{'arate'});
+	$doc_obj->add_utf8_metadata ($section, "tv.HQStreamingAudioTracks", $identify_vals->{'atracks'});
+	$doc_obj->add_utf8_metadata ($section, "tv.HQStreamingOverallBitrate", $identify_vals->{'orateDisplay'});
+	$doc_obj->add_utf8_metadata ($section, "tv.HQStreamingSubtitleType", $identify_vals->{'stype'});
+	$doc_obj->add_utf8_metadata ($section, "tv.HQStreamingSubtitleLanguage", $identify_vals->{'slang'});
+	
+	my $get_max_metadata = $self->{'getMaximumMetadata'};
+	if ($get_max_metadata eq "true"){
+		my $metadata_table = $identify_vals->{'metadata_table'};
+		foreach my $metaname(keys %$metadata_table)
+		{
+			my $metaval = $identify_vals->{'metadata_table'}->{$metaname};
+			$doc_obj->add_utf8_metadata ($section, $metaname, $metaval);
+		}
+	}
+	
+	#add the metadata for the resulting file that should be open inside the replayme video player
+	$doc_obj->add_utf8_metadata ($section, "streamablevideo", $streamable_url_safe);
+	$doc_obj->associate_file($ifilename,$ifile,"application/octet-stream",$section);
+
+    my $flashwidth = $video_width;
+    my $flashheight = $video_height + 22;
+
+    if ($self->{'create_keyframes'} eq "true") {
+	$flashheight += 100;
+    }
+
+    $doc_obj->add_metadata ($section, "flashwidth",    $flashwidth);
+    $doc_obj->add_metadata ($section, "flashheight",   $flashheight);
+     
+    $self->{'oflash_file'} = $ifile;
+    $self->{'oflash_filename'} = $ifilename;
+
+}
+
+
+sub enable_h264_streaming
+{
+    my $self = shift (@_);
+    my ($doc_obj,$originalfilename,$filename,$convertto_regenerated,
+	$video_width,$video_height) = @_;
+    
+
+    my $section = $doc_obj->get_top_section();
+
+    my $output_dir   = $self->{'cached_dir'};
+    my $ivideo_root  = $self->{'cached_file_root'};
+    
+    # Generate the H264 video file format for streaming purposes using the cache feature if used
+
+    my $optionally_run_general_cmd = "run_uncached_general_cmd";
+    if ($self->{'enable_cache'}) {
+	$optionally_run_general_cmd
+	    = ($convertto_regenerated) ? "regenerate_general_cmd" : "run_cached_general_cmd";
+    }
+
+	my $streaming_HQ_size    = $self->{'streamingHQsize'};
+	my $streaming_HQ_VideoBitrate    = $self->{'streamingHQVideoBitrate'};
+	my $streaming_HQ_AudioBitrate    = $self->{'streamingHQAudioBitrate'};
+
+    my $ifilename = $originalfilename || $filename;
+    my ($stream_cmd,$oflash_filename,$oflash_file) 
+	= $self->stream_mp4_video_cmd($ifilename,
+				     $streaming_HQ_size,
+				     $streaming_HQ_VideoBitrate,
+				     $streaming_HQ_AudioBitrate);
+    
+    
+    my $streamable_options = { @{$self->{'handbrake_monitor'}},
+			       'message_prefix' => "MP4 Stream",
+			       'message' => "Generating streamable MP4 video: $oflash_file" }; 
+    
+
+    my ($streamable_regenerated,$streamable_result,$streamable_had_error)
+	= $self->$optionally_run_general_cmd($stream_cmd,
+					     $ifilename,$oflash_filename,
+					     $streamable_options);
+    
+    if (!$streamable_had_error) {
+
+	
+	my $streamable_url = $oflash_file;
+	my $streamable_url_safe = $self->url_safe($streamable_url);
+	
+	my $outhandle = $self->{'outhandle'};
+
+	my $identify_vals = identifyMI($oflash_filename,$outhandle,0);
+	
+	#Add the most common metadata extracted by MediaInfo from the streamable video file
+	$doc_obj->add_utf8_metadata ($section, "tv.HQStreamingVideoFormat", $identify_vals->{'vtype'});
+	$doc_obj->add_utf8_metadata ($section, "tv.HQStreamingVideoFileSize", $identify_vals->{'filesizeDisplay'});
+	$doc_obj->add_utf8_metadata ($section, "tv.HQStreamingWidth", $identify_vals->{'width'});
+	$doc_obj->add_utf8_metadata ($section, "tv.HQStreamingHeight", $identify_vals->{'height'});
+	$doc_obj->add_utf8_metadata ($section, "tv.HQStreamingDuration", $identify_vals->{'durationDisplay'});
+	$doc_obj->add_utf8_metadata ($section, "tv.HQStreamingFPS", $identify_vals->{'fps'});
+	$doc_obj->add_utf8_metadata ($section, "tv.HQStreamingVideoCodec", $identify_vals->{'vcodec'});
+	$doc_obj->add_utf8_metadata ($section, "tv.HQStreamingVideoBitrate", $identify_vals->{'vrate'});
+	$doc_obj->add_utf8_metadata ($section, "tv.HQStreamingAudioCodec", $identify_vals->{'acodec'});
+	$doc_obj->add_utf8_metadata ($section, "tv.HQStreamingAudioBitrate", $identify_vals->{'arate'});
+	$doc_obj->add_utf8_metadata ($section, "tv.HQStreamingOverallBitrate", $identify_vals->{'orateDisplay'});
+	$doc_obj->add_utf8_metadata ($section, "tv.HQStreamingSubtitleType", $identify_vals->{'stype'});
+	$doc_obj->add_utf8_metadata ($section, "tv.HQStreamingSubtitleLangue", $identify_vals->{'slang'});
+	
+	my $get_max_metadata = $self->{'getMaximumMetadata'};
+	if ($get_max_metadata eq "true"){
+		my $metadata_table = $identify_vals->{'metadata_table'};
+		foreach my $metaname(keys %$metadata_table)
+		{
+			my $metaval = $identify_vals->{'metadata_table'}->{$metaname};
+			$doc_obj->add_utf8_metadata ($section, $metaname, $metaval);
+		}
+	}
+	
+	#add the metadata for the resulting file that should be open inside the flash video player
+	$doc_obj->add_utf8_metadata ($section, "streamablevideo", $streamable_url_safe);
+	$doc_obj->associate_file($oflash_filename,$oflash_file,"video/mp4",
+				 $section);
+    }
+
+    my $flashwidth = $video_width;
+    my $flashheight = $video_height + 22;
+
+    if ($self->{'create_keyframes'} eq "true") {
+	$flashheight += 100;
+    }
+
+    $doc_obj->add_metadata ($section, "flashwidth",    $flashwidth);
+    $doc_obj->add_metadata ($section, "flashheight",   $flashheight);
+     
+    $self->{'oflash_file'} = $oflash_file;
+    $self->{'oflash_filename'} = $oflash_filename;
+
+    return $streamable_regenerated;
+	
+	
+}
+
+sub enable_full_streaming
+{
+    my $self = shift (@_);
+    my ($doc_obj,$originalfilename,$filename,$convertto_regenerated,
+	$video_width,$video_height) = @_;
+
+    my $video_streamable_regenerated
+	= $self->enable_video_streaming($doc_obj,$originalfilename,$filename,
+					$convertto_regenerated,
+					$video_width,$video_height);
+
+    my $audio_streamable_regenerated
+	= $self->enable_audio_streaming($doc_obj,$originalfilename,$filename,
+					$convertto_regenerated);
+
+    return ($video_streamable_regenerated || $audio_streamable_regenerated);
+}
+
+
+
+sub flvtool2_monitor_line
+{
+    my ($line) = @_;
+
+    my $had_error = 0;
+    my $generate_dot = 1;
+
+    if ($line =~ m/\s+\- /) {
+	# ignore tabulated output printed at end of command
+	$generate_dot = 0;
+    }
+    
+    if ($line =~ m/^Error:/i) {
+	$had_error = 1;
+    }
+
+    return ($had_error,$generate_dot);
+}
+
+
+
+
+
+1;
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/perllib/plugins/VideoPlugin.pm
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/perllib/plugins/VideoPlugin.pm	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/perllib/plugins/VideoPlugin.pm	(revision 24799)
@@ -0,0 +1,1000 @@
+######################################################################
+#
+# VideoPlugin.pm -- plugin for processing video files 
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+###########################################################################
+
+# -- Largely modeled on how ImagePlugin works 
+# -- Can convert to audio as well as video
+
+package VideoPlugin;
+
+use strict;
+no strict 'refs'; # allow filehandles to be variables and viceversa
+no strict 'subs';
+
+use XMLParser;
+use gsprintf;
+
+use MultimediaPlugin;
+use VideoConverter;
+use ReadXMLFile;
+
+sub BEGIN {
+    @VideoPlugin::ISA = ('MultimediaPlugin', 'VideoConverter', 'ReadXMLFile');
+}
+
+
+my $arguments =
+    [ { 'name' => "process_exp",
+	'desc' => "{BasePlugin.process_exp}",
+	'type' => "regexp",
+	'deft' => &get_default_process_exp(),
+	'reqd' => "no" } ];
+
+
+my $options = { 'name'     => "VideoPlugin",
+		'desc'     => "{VideoPlugin.desc}",
+		'abstract' => "no",
+		'inherits' => "yes",
+		'args'     => $arguments };
+
+sub new {
+    my ($class) = shift (@_);
+    my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
+    push(@$pluginlist, $class);
+
+    push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});
+    push(@{$hashArgOptLists->{"OptList"}},$options);
+
+    new VideoConverter($pluginlist, $inputargs, $hashArgOptLists);
+    my $self = new MultimediaPlugin($pluginlist, $inputargs, $hashArgOptLists);
+
+    if ($self->{'info_only'}) {
+	# don't worry about creating the XML parser as all we want is the 
+	# list of plugin options
+	return bless $self, $class;
+    }
+
+
+    # create XML::Parser object for parsing keyframe files (produced by hive)
+    my $parser = new XML::Parser('Style' => 'Stream',
+                                 'Pkg' => 'VideoPlugin',
+                                 'PluginObj' => $self,
+				 'Namespaces' => 1, # strip out namespaces
+				 'Handlers' => {'Char' => \&Char,
+						'XMLDecl' => \&XMLDecl,
+						'Entity'  => \&Entity,
+						'Doctype' => \&Doctype,
+						'Default' => \&Default
+                                 });
+
+    $self->{'parser'} = $parser;
+
+
+    return bless $self, $class;
+}
+
+
+
+sub begin {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $processor, $maxdocs) = @_;
+
+    $self->SUPER::begin(@_);
+    $self->VideoConverter::begin(@_); 
+}
+
+
+sub init {
+    my $self = shift (@_);
+    my ($verbosity, $outhandle, $failhandle) = @_;
+
+    $self->SUPER::init(@_);
+    $self->VideoConverter::init(@_);
+}
+
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+    return q^(?i)\.(mpe?g|flv|mov|qt|wmv|vob|avi|mp4|m4v|ts)$^; 
+}
+
+
+sub extract_keyframes
+{
+    my $self = shift (@_);
+    my ($doc_obj,$originalfilename,$filename) = @_;
+
+    my $section = $doc_obj->get_top_section();
+
+    my $output_dir   = $self->{'cached_dir'};
+    my $ivideo_root  = $self->{'cached_file_root'};
+
+    # Generate the keyframes with ffmpeg and hive
+    my $ifilename = $originalfilename || $filename;
+    my ($keyframe_cmd,$okeyframe_filename) = $self->keyframe_cmd($ifilename);
+    
+    my $keyframe_options = { @{$self->{'ffmpeg_monitor'}},
+			     'message_prefix' => "Keyframe",
+			     'message' => "Extracting keyframes" }; 
+    
+    $self->run_cached_general_cmd($keyframe_cmd,
+				  $ifilename,$okeyframe_filename,
+				  $keyframe_options);
+    $self->parse_shot_xml();
+
+    my $keep_keyframe_timeline = $self->{'keep_keyframe_timeline'};
+    $self->associate_keyframes($doc_obj,$section,$keep_keyframe_timeline);
+
+}
+
+
+
+sub extract_thumbnail
+{
+    my $self = shift (@_);
+    my ($doc_obj,$filename,$convertto_regenerated,$thumbnailtype,
+	$thumbnail_width, $thumbnail_height) = @_;
+
+    my $section = $doc_obj->get_top_section();
+
+    my $output_dir   = $self->{'cached_dir'};
+    my $ivideo_root  = $self->{'cached_file_root'};
+
+    my $verbosity = $self->{'verbosity'};
+    my $outhandle = $self->{'outhandle'};
+
+
+    # Generate the thumbnail with convert, a la ImagePlugin
+
+    my $thumbnailfile = &util::filename_cat($output_dir,"$ivideo_root-thumbnail.$thumbnailtype");
+    
+    my $optionally_run_general_cmd = "run_uncached_general_cmd";
+    if ($self->{'enable_cache'}) {	
+	$optionally_run_general_cmd 
+	= ($convertto_regenerated) ? "regenerate_general_cmd" : "run_cached_general_cmd";
+    }
+    
+###    print STDERR "**** creating thumbnail: $thumbnail_width x $thumbnail_height\n";
+    # my $ofilename = $self->get_ovideo_filename($self->{'enable_streaming'});
+    my ($thumb_cmd ,$othumb_filename)
+	= $self->keyframe_thumbnail_cmd($filename,$thumbnailfile,$thumbnail_width,$thumbnail_height);
+    
+    my $thumb_options = { 'verbosity' => $verbosity,
+			  'outhandle' => $outhandle,
+			  'message_prefix' => "Thumbnail",
+			  'message' => "Generating thumbnail" }; 
+    
+    my ($thumb_regenerated,$thumb_result,$thumb_had_error)
+	= $self->$optionally_run_general_cmd($thumb_cmd,$filename,$thumbnailfile,$thumb_options);
+    
+    # Add the thumbnail as an associated file ...
+    if (-e "$thumbnailfile") { 
+	$doc_obj->associate_file("$thumbnailfile", "thumbnail.$thumbnailtype", 
+				 "image/$thumbnailtype",$section);
+	$doc_obj->add_metadata ($section, "ThumbType", $thumbnailtype);
+	$doc_obj->add_metadata ($section, "Thumb", "thumbnail.$thumbnailtype");
+	
+	$doc_obj->add_utf8_metadata ($section, "thumbicon", "<img src=\"_httpprefix_/collect/[collection]/index/assoc/[assocfilepath]/[Thumb]\" width=[ThumbWidth] height=[ThumbHeight]>");
+###	    $doc_obj->add_utf8_metadata ($section, "thumbicon", "<img src=\"_httpprefix_/collect/[collection]/index/assoc/[assocfilepath]/[Thumb]\">");
+    }
+    
+    # Extract Thumnail metadata from convert output
+    if ($thumb_result =~ m/[0-9]+x[0-9]+=>([0-9]+)x([0-9]+)/) {
+	$doc_obj->add_metadata ($section, "ThumbWidth", $1);
+	$doc_obj->add_metadata ($section, "ThumbHeight", $2);
+    }
+    else {
+	# Two reasons for getting to here:
+	#   1.thumbnail was generated by ffmpeg, not imagemagick convert
+	#   2.thumbnail was cached, so imagemagick convert was not run
+	# Either way, the solution is the same:
+	# => run "identify $thumbnailfile" and parse result	
+	$thumb_result = `identify \"$thumbnailfile\" 2>&1`;
+	
+	if ($thumb_result =~ m/([0-9]+)x([0-9]+)/) {
+	    $doc_obj->add_metadata ($section, "ThumbWidth", $1);
+	    $doc_obj->add_metadata ($section, "ThumbHeight", $2);
+	}
+    }
+}
+
+
+sub extract_keyframes_montage
+{
+    my $self = shift (@_);
+    my ($doc_obj,$filename,$thumbnailtype) = @_;
+
+    my $section = $doc_obj->get_top_section();
+
+    my $output_dir   = $self->{'cached_dir'};
+    my $ivideo_root  = $self->{'cached_file_root'};
+
+    
+    # Generate the mosaic with 'montage'
+    my $montagefile = &util::filename_cat($output_dir,"$ivideo_root\_montage.$thumbnailtype");
+    
+    my ($montage_cmd,$omontage_filename)
+	= $self->keyframe_montage_cmd($filename,$montagefile);
+    
+    my $montage_options = { 'message_prefix' => "Montage",
+			    'message' => "Generating montage" }; 
+    
+    my ($montage_result,$montage_had_error)
+	= $self->run_general_cmd($montage_cmd,$montage_options);
+    
+    # Add the montage as an associated file ...
+    if (-e "$montagefile") { 
+	$doc_obj->associate_file("$montagefile", "montage.$thumbnailtype", 
+				 "image/$thumbnailtype",$section);
+	$doc_obj->add_metadata ($section, "MontageType", $thumbnailtype);
+	$doc_obj->add_metadata ($section, "Montage", "montage.$thumbnailtype");
+	
+	$doc_obj->add_utf8_metadata ($section, "montageicon", "<img src=\"_httpprefix_/collect/[collection]/index/assoc/[assocfilepath]/[Montage]\" >");
+    }
+}
+
+
+
+sub extract_screenview
+{
+    my $self = shift (@_);
+    my ($doc_obj,$filename,$convertto_regenerated, $screenviewtype, $screenview_width,$screenview_height) = @_;
+
+    my $section = $doc_obj->get_top_section();
+
+    my $output_dir   = $self->{'cached_dir'};
+    my $ivideo_root  = $self->{'cached_file_root'};
+    
+    my $optionally_run_general_cmd = "run_uncached_general_cmd";
+    if ($self->{'enable_cache'}) {	
+	$optionally_run_general_cmd 
+	= ($convertto_regenerated) ? "regenerate_general_cmd" : "run_cached_general_cmd";
+    }
+    # make the screenview image
+
+    my $screenviewfilename = &util::filename_cat($output_dir,"$ivideo_root-screenview.$screenviewtype");
+
+    
+    my ($screenview_cmd,$oscreenview_filename)
+	= $self->keyframe_thumbnail_cmd($filename,$screenviewfilename,$screenview_width,$screenview_height);
+
+    my $screenview_options = { 'message_prefix' => "Screenview",
+			       'message' => "Generating screenview image" }; 
+
+				   
+	my ($screenview_regenerated,$screenview_result,$screenview_had_error)
+	= $self->$optionally_run_general_cmd($screenview_cmd,
+					     $filename,$screenviewfilename,
+					     $screenview_options);
+    
+
+    # get screenview dimensions, size and type
+    if ($screenview_result =~ m/[0-9]+x[0-9]+=>([0-9]+)x([0-9]+)/) {
+	$doc_obj->add_metadata ($section, "ScreenWidth", $1);
+	$doc_obj->add_metadata ($section, "ScreenHeight", $2);
+    }
+    else {
+	$doc_obj->add_metadata ($section, "ScreenWidth", $screenview_width);
+	$doc_obj->add_metadata ($section, "ScreenHeight", $screenview_height);
+    }
+    
+    #add the screenview as an associated file ...
+    if (-e "$screenviewfilename") { 
+	$doc_obj->associate_file("$screenviewfilename", "screenview.$screenviewtype",
+				 "image/$screenviewtype",$section);
+	$doc_obj->add_metadata ($section, "ScreenType", $screenviewtype);
+	$doc_obj->add_metadata ($section, "Screen", "screenview.$screenviewtype");
+	
+	$doc_obj->add_utf8_metadata ($section, "screenicon", "<img src=\"_httpprefix_/collect/[collection]/index/assoc/[assocfilepath]/[Screen]\" width=[ScreenWidth] height=[ScreenHeight]>");
+    } else {
+	my $outhandle = $self->{'outhandle'};
+	print $outhandle "VideoPlugin: couldn't find \"$screenviewfilename\"\n";
+    }
+}
+
+
+# Create the keyframes, thumbnail and screenview images, and discover
+# the Video's size, width, and height using the ffmpeg utility.
+
+sub run_convert {
+    my $self = shift (@_);
+    my $base_dir = shift (@_);
+    my $filename = shift (@_);   # filename with full path
+    my $file = shift (@_);       # filename without path
+    my $doc_obj = shift (@_);
+
+    my $section = $doc_obj->get_top_section();
+    
+    my $verbosity = $self->{'verbosity'};
+    my $outhandle = $self->{'outhandle'};
+
+    # check the filename is okay
+    return 0 if ($file eq "" || $filename eq "");
+
+    my $minimumsize = $self->{'minimumsize'};
+    if (defined $minimumsize && (-s $filename < $minimumsize)) {
+        print $outhandle "VideoPlugin: \"$filename\" too small, skipping\n"
+	    if ($verbosity > 1);
+    }
+
+    my ($video_type, $video_width, $video_height, $video_duration, $durationDisplay, $video_size,
+	$vcodec,$vrate,$vfps,$atype,$afreq,$achan,$arate) 
+	= &VideoConverter::identify($filename, $outhandle, $verbosity);
+
+    if ($video_duration =~ m/^(\d\d):(\d\d):(\d\d)\.(\d+)$/) {
+	$video_duration = $1*3600 + $2*60 + $3 + ($4/10.0);
+    }
+
+    if ($vfps eq "unknown") {
+	print $outhandle "Unknown framerate, defaulting to 25 frames per second.\n";
+	$vfps = 25;
+    }
+
+    #my ($dur_hour,$dur_min,$dur_sec) 
+	#= ($video_duration =~ m/(\d+):(\d+):(\d+\.\d+)/);
+    #my $total_dur_secs = $dur_hour*3600 + $dur_min*60 + $dur_sec;
+	
+    my $total_dur_secs = $video_duration / 1000;
+
+    $self->{'video-fps'} = $vfps;
+    $self->{'num-total-frames'} = $total_dur_secs * $vfps;
+    #print STDERR "****\nTotal_dur_secs= $total_dur_secs vfps= $vfps\n****\n";
+
+    # Convert the video to a new type (if required).
+    my $converttotype = $self->{'converttotype'};
+    my $converttosize = $self->{'converttosize'};
+
+    # shorten duration prcessed for experimentation purposes
+   my $exp_duration = undef;
+##    my $exp_duration = "00:00:30";
+    
+    my $excerpt_duration = $self->{'excerpt_duration'};
+
+    if ((defined $excerpt_duration) && ($excerpt_duration ne "")) {
+	$exp_duration = $excerpt_duration;
+	my ($hh,$mm,$ss,$ms);
+
+	if ($exp_duration =~ m/^(\d\d):(\d\d):(\d\d)\.?(\d)$/) {
+	    $hh = $1;
+	    $mm = $2;
+	    $ss = $3;
+	    $ms = $4;
+	}
+	else {
+	    # assume value is in seconds
+	    $hh = 0;
+	    $mm = 0;
+	    $ss = $exp_duration;
+	    $ms = 0;
+	}
+
+	my $excerpt_dur_in_secs = $hh * 3600 + $mm * 60 + $ss;
+
+	if ($excerpt_dur_in_secs < $total_dur_secs) {
+	    $self->{'num-total-frames'} = $excerpt_dur_in_secs * $vfps; # override calculation for full length duration
+	}
+	else {
+	    # clip is already shorter than requested video excerpt duration
+	    # set exp_duration back to undefined
+	    $exp_duration = undef;
+	}
+    }
+
+
+    if (defined $exp_duration)
+    {
+	print $outhandle "Only encoding first $exp_duration of video.\n";
+	$self->{'exp_duration'} = $exp_duration;
+    }
+
+    my $ascii_only_filenames = $self->{'use_ascii_only_filenames'};
+    $self->init_cache_for_file($filename);
+
+    my $originalfilename = undef;
+    my $type = "unknown";
+
+    my $output_dir = $self->{'cached_dir'};
+    my $ivideo_root = $self->{'cached_file_root'};
+
+    my $convertto_regenerated = 0;
+    if (($converttotype ne "" && $filename =~ m/$converttotype$/i) ||
+	(($converttosize ne "" && $converttosize ne $video_width) || ($converttosize ne "" && $converttosize ne $video_height))) {
+	if ($converttotype eq "") {
+	    # in this block because the video width x height different to original
+	    # => set (for this call to run_convert only) converttotype
+	    #    to input file extension
+	    ($converttotype) = ($filename =~ m/\.(.*?)$/);
+	}
+
+	$originalfilename = $filename;
+
+	$file = "$ivideo_root.$converttotype";
+	$filename = &util::filename_cat($output_dir,$file);
+ 
+	my $s_opt = $self->optional_frame_scale($converttosize,$video_width,$video_height);
+	my $exp_duration = $self->{'exp_duration'};
+	my $t_opt = (defined $exp_duration) ? "-t $exp_duration" : "";
+	    
+	my $main_opts = "-y $t_opt $s_opt";
+
+
+	my $originalfilename_gsdlenv = $self->gsdlhome_independent($originalfilename);
+	my $filename_gsdlenv = $self->gsdlhome_independent($filename);
+
+
+	my $convertto_command = "ffmpeg $main_opts -i \"$originalfilename_gsdlenv\"";
+	$convertto_command .= " -ar 22050" if ($converttotype eq "flv");
+	$convertto_command .= " -y \"$filename_gsdlenv\"";
+
+	my $convertto_result;
+	my $convertto_error;
+	
+	my $convertto_options = { @{$self->{'ffmpeg_monitor'}},
+				  'message_prefix' => "Convert to",
+				  'message' => "Converting video to $converttotype" }; 
+
+	($convertto_regenerated,$convertto_result,$convertto_error)
+	    = $self->run_cached_general_cmd($convertto_command,
+					    $originalfilename,$filename,
+					    $convertto_options);
+						    
+	$type = $converttotype;
+    }
+    
+
+    # Add the video metadata
+
+    my $file_unicode = pack("U0C*", map { ord($_) } split(//,$file)); # force explicitly to unicode
+
+    $file_unicode =~ s/\x{2018}|\x{2019}|\x{201C}|\x{201D}//g; # remove smart quotes as cause problem in URL for video server
+    $file_unicode =~ s/\x{2013}/\-/g; # change en-dash to '-' as again causes problems for video server
+
+##    print STDERR "**** file metadata = ", &gsprintf::debug_unicode_string($file_unicode), "\n";
+
+    
+    # split filename on char if specified
+    if (0) {
+# don't do any more	
+#    if ($file_unicode =~ m/\-/) {
+
+	my @file_split = split(/\s*\-\s*/,$file_unicode);
+	my $creator = shift @file_split;
+	my $title = shift @file_split;
+
+	$title =~ s/\..*?$//;
+	$title =~ s/^(.)/\u$1/;
+
+	$doc_obj->add_utf8_metadata($section,"Title",$title);
+
+	my @creator_split = split(/\s+and\s+/,$creator);
+	foreach my $c (@creator_split) {
+	    $doc_obj->add_utf8_metadata($section,"Creator",$c);
+	}
+    }
+
+    $file = $file_unicode;
+    my $filemeta = $self->filename_to_utf8_metadata($file);
+    my $filemeta_url_safe = $self->url_safe($filemeta);
+
+    $doc_obj->add_utf8_metadata ($section, "Video", $filemeta_url_safe);
+
+    # Also want to set filename as 'Source' metadata to be
+    # consistent with other plugins
+    # $doc_obj->add_utf8_metadata ($section, "Source", $filemeta_url_safe);
+
+
+    if ($video_type ne " ") {
+	$type = $video_type;
+    }
+    
+    $doc_obj->add_metadata ($section, "FileFormat", $type);
+    $doc_obj->add_metadata ($section, "FileSize",   $video_size);
+
+    $doc_obj->add_metadata ($section, "VideoType",     $video_type);
+    $doc_obj->add_metadata ($section, "VideoWidth",    $video_width);
+    $doc_obj->add_metadata ($section, "VideoHeight",   $video_height);
+    $doc_obj->add_metadata ($section, "VideoDuration", $video_duration);
+    $doc_obj->add_metadata ($section, "VideoSize",     $video_size);
+
+    $doc_obj->add_metadata ($section, "VideoCodec",    $vcodec);
+    $doc_obj->add_metadata ($section, "VideoFPS",      $vfps);
+
+    $doc_obj->add_metadata ($section, "AudioType",     $atype);
+    $doc_obj->add_metadata ($section, "AudioFreq",     $afreq);
+    $doc_obj->add_metadata ($section, "AudioChannels", $achan);
+    $doc_obj->add_metadata ($section, "AudioRate",     $arate);
+
+    $doc_obj->add_utf8_metadata ($section, "srclink", 
+			    "<a href=\"_httpprefix_/collect/[collection]/index/assoc/[assocfilepath]/[Video]\">");
+    $doc_obj->add_utf8_metadata ($section, "/srclink", "</a>");
+    $doc_obj->add_metadata ($section, "srcicon", "[VideoType]");
+
+	
+    # Add the original file as an associated file
+	if ($self->{'keep_original_video'} eq "true") {
+		$doc_obj->associate_file($filename,$file,"video/$type",$section);
+	}
+
+
+    if ($self->{'extract_keyframes'}) {
+		$self->extract_keyframes($doc_obj,$originalfilename,$filename);
+    }
+
+    my $streamable_regenerated = 0;
+	
+	# Create a VP6+MP3 streaming ready video file with FFMpeg
+    if ($self->{'enable_streaming'} eq "flv") {	
+		$streamable_regenerated 
+			= $self->enable_full_streaming($doc_obj,
+					   $originalfilename,$filename,
+					   $convertto_regenerated,
+					   $video_width,$video_height);
+    }
+
+	# Create an H264+ACC streaming ready video file with Handbrake
+	if ($self->{'enable_streaming'} eq "mp4") {
+		$streamable_regenerated 
+			= $self->enable_h264_streaming($doc_obj,
+					   $originalfilename,$filename,
+					   $convertto_regenerated,
+					   $video_width,$video_height);
+    }
+	
+	# Use the original video file for streaming
+	if ($self->{'enable_streaming'} eq "direct") {
+		$self->enable_direct_streaming($doc_obj,
+					   $originalfilename,$filename,
+					   $file,$video_width,$video_height);
+    }	
+
+    my $thumbnailsize = $self->{'thumbnailsize'} || 100;
+    my $thumbnailtype = $self->{'thumbnailtype'} || 'jpg';
+
+
+    if ($self->{'create_thumbnail'} eq "true") {
+
+	my $thumbnail_width; 
+	my $thumbnail_height;
+	
+	if ($video_width<$video_height) {
+	    my $scale_ratio = $video_height / $video_width;
+	    $thumbnail_width = $thumbnailsize;
+	    $thumbnail_height = int($thumbnailsize * $scale_ratio);
+	}
+	else {
+	    my $scale_ratio = $video_width / $video_height;
+	    $thumbnail_width = int($thumbnailsize * $scale_ratio);
+	    $thumbnail_height = $thumbnailsize;
+	}
+	
+	# for some video formats, extracted size needs to be multiple of 2
+	$thumbnail_width  = int($thumbnail_width/2) * 2;
+	$thumbnail_height = int($thumbnail_height/2) * 2;
+
+	$self->extract_thumbnail($doc_obj,$filename,$convertto_regenerated,
+				 $thumbnailtype, 
+				 $thumbnail_width,$thumbnail_height);
+    }
+
+    if ($self->{'extract_keyframes'}) {
+	$self->extract_keyframes_montage($doc_obj,$filename,$thumbnailtype);
+    }
+
+    my $screenviewsize = $self->{'screenviewsize'};
+    my $screenviewtype = $self->{'screenviewtype'} || 'jpeg';
+
+    # Make a screen-sized version of the picture if requested
+    if ($self->{'create_screenview'} eq "true") {
+
+	# To do: if the actual image smaller than the screenview size,
+	# we should use the original !
+
+	my $screenview_width; 
+	my $screenview_height;
+	
+	if ($video_width>$video_height) {
+	    my $scale_ratio = $video_height / $video_width;
+	    $screenview_width = $screenviewsize;
+	    $screenview_height = int($screenviewsize * $scale_ratio);
+	}
+	else {
+	    my $scale_ratio = $video_width / $video_height;
+	    $screenview_width = int($screenviewsize * $scale_ratio);
+	    $screenview_height = $screenviewsize;
+	}
+
+
+	# for some video formats, extracted size needs to be multiple of 2
+	$screenview_width  = int($screenview_width/2) * 2;
+	$screenview_height = int($screenview_height/2) * 2;
+	
+	$self->extract_screenview($doc_obj,$filename, $convertto_regenerated, 
+				  $screenviewtype,
+				  $screenview_width,$screenview_height);
+    }
+
+    return $type;
+}
+
+
+
+
+sub read_into_doc_obj {
+    my $self = shift (@_);  
+    my ($pluginfo, $base_dir, $file, $block_hash, $metadata, $processor, $maxdocs, $total_count, $gli) = @_;
+
+    $self->{'media_type'} = "video";
+
+    my ($rv,$doc_obj) = $self->SUPER::read_into_doc_obj(@_);
+
+    if ($rv != 1) {
+	return ($rv,$doc_obj);
+    }
+
+    my $enable_streaming 
+	= ($self->{'enable_flv_streaming'} || $self->{'enable_mp4_streaming'})
+	? 1 : 0;
+
+    if (($enable_streaming) && ($self->{'extract_keyframes'})) {
+	my $section = $doc_obj->get_top_section();
+	my $oflash_filename = $self->{'oflash_filename'};
+	my ($streamkeyframes_cmd,$ostreamkeyframes_filename) 
+	    = $self->streamkeyframes_cmd($oflash_filename,$doc_obj,$section);
+
+	my $verbosity = $self->{'verbosity'};
+
+	my $streamkeyframes_options = { @{$self->{'flvtool2_monitor'}},
+					'message_prefix' => "Stream Keyframes",
+					'message' => "Reprocessing video stream to add keyframes on timeline" }; 
+
+	$self->run_general_cmd($streamkeyframes_cmd,$streamkeyframes_options);
+    }
+
+    my ($filename_full_path, $filename_no_path) = &util::get_full_filenames($base_dir, $file);
+    my $section = $doc_obj->get_top_section();
+
+    $self->title_fallback($doc_obj,$section,$filename_no_path);
+    
+    $self->{'media_type'} = undef;
+
+    return ($rv,$doc_obj);
+}
+
+
+
+
+sub output_distributed_keyframes
+{
+    my ($self) = shift @_;
+    my ($timeline,$num_dist_frames) = @_;
+
+    my $num_total_frames = $self->{'num-total-frames'};
+
+    my $keep_timeline = {};
+
+    my $frame_delta;
+    if ($num_dist_frames eq "all") {
+	$frame_delta = undef;
+    }
+    else {
+	$frame_delta = $num_total_frames/$num_dist_frames;
+    }
+
+    my $closest_to = $frame_delta;
+    my $prev_t = 0;
+
+#    print STDERR "*** num total frames  = $num_total_frames\n";
+#    print STDERR "*** frame delta = $frame_delta\n";
+
+    my $keep_keyframe_num = 1;
+
+    foreach my $curr_t (sort { $a <=> $b } keys %$timeline)
+    {
+#	print STDERR "*** curr_t = $curr_t\n";
+	
+	my $timeline_rec = undef;
+
+	if (!defined $closest_to) {
+	    $timeline_rec = $timeline->{$curr_t};
+	    $keep_timeline->{$curr_t} = $timeline_rec;
+	}
+	elsif ($curr_t>$closest_to) {
+	    # decide if previous t (prev_t_ or current t (curr_t) is closest
+
+	    my $prev_t_dist = $closest_to - $prev_t;
+	    my $curr_t_dist = $curr_t - $closest_to;
+
+	    if ($curr_t_dist <= $prev_t_dist)
+	    {
+		$timeline_rec = $timeline->{$curr_t};
+		$keep_timeline->{$curr_t} = $timeline_rec;
+
+	    }
+	    else
+	    {
+		$timeline_rec = $timeline->{$prev_t};
+		$keep_timeline->{$prev_t} = $timeline_rec;
+	    }
+
+	    $closest_to += $frame_delta;
+	}
+
+	if (defined $timeline_rec) {
+
+	    my $name      = $timeline_rec->{'name'};
+	    my $timestamp = $timeline_rec->{'timestamp'};
+	    my $thumb     = $timeline_rec->{'thumb'};
+	    my $keyframe_num = $timeline_rec->{'keyframenum'};
+
+
+	    print CUEOUT "  <metatag event=\"onCuePoint\" overwrite=\"true\">\n";
+	    print CUEOUT "    <name>$name</name>\n";
+	    print CUEOUT "    <timestamp>$timestamp</timestamp>\n";
+	    print CUEOUT "    <parameters>\n";
+	    print CUEOUT "      <thumb>$thumb</thumb>\n";
+	    print CUEOUT "      <keyframeNum>$keyframe_num</keyframeNum>\n";
+	    print CUEOUT "      <keepKeyframeNum>$keep_keyframe_num</keepKeyframeNum>\n";
+	    print CUEOUT "    </parameters>\n";
+	    print CUEOUT "    <type>navigation</type>\n";
+	    print CUEOUT "  </metatag>\n";
+
+#	    my $testtime = $timestamp+1000;
+#	    print CUEOUT "  <metatag event=\"onCuePoint\" overwrite=\"true\">\n";
+#	    print CUEOUT "    <name>Test $name</name>\n";
+#	    print CUEOUT "    <timestamp>$testtime</timestamp>\n";
+#	    print CUEOUT "    <parameters>\n";
+#	    print CUEOUT "      <thumb>$thumb</thumb>\n";
+#	    print CUEOUT "      <secnum>1</secnum>\n";
+#	    print CUEOUT "      <subsecnum>0</subsecnum>\n";
+#	    print CUEOUT "    </parameters>\n";
+#	    print CUEOUT "    <type>event</type>\n";
+#	    print CUEOUT "  </metatag>\n";
+
+	    $keep_keyframe_num++;
+
+	}
+	$prev_t = $curr_t;
+    }
+
+    $self->{'keep_keyframe_timeline'} = $keep_timeline;
+}
+
+
+sub StartDocument {$_[0]->{'PluginObj'}->xml_start_document(@_);}
+sub XMLDecl {$_[0]->{'PluginObj'}->xml_xmldecl(@_);}
+sub Entity {$_[0]->{'PluginObj'}->xml_entity(@_);}
+sub Doctype {$_[0]->{'PluginObj'}->xml_doctype(@_);}
+sub StartTag {$_[0]->{'PluginObj'}->xml_start_tag(@_);}
+sub EndTag {$_[0]->{'PluginObj'}->xml_end_tag(@_);}
+sub Text {$_[0]->{'PluginObj'}->xml_text(@_);}
+sub PI {$_[0]->{'PluginObj'}->xml_pi(@_);}
+sub EndDocument {$_[0]->{'PluginObj'}->xml_end_document(@_);}
+sub Default {$_[0]->{'PluginObj'}->xml_default(@_);}
+
+
+# This Char function overrides the one in XML::Parser::Stream to overcome a
+# problem where $expat->{Text} is treated as the return value, slowing
+# things down significantly in some cases.
+sub Char {
+    use bytes;  # Necessary to prevent encoding issues with XML::Parser 2.31+
+    $_[0]->{'Text'} .= $_[1];
+    return undef;
+}
+
+sub xml_start_document {
+    my $self = shift(@_);
+    my ($expat, $name, $sysid, $pubid, $internal) = @_;
+
+}
+
+# Called for XML declarations
+sub xml_xmldecl {
+    my $self = shift(@_);
+    my ($expat, $version, $encoding, $standalone) = @_;
+}
+
+# Called for XML entities
+sub xml_entity {
+  my $self = shift(@_);
+  my ($expat, $name, $val, $sysid, $pubid, $ndata) = @_;
+}
+
+
+# Called for DOCTYPE declarations - use die to bail out if this doctype
+# is not meant for this plugin
+sub xml_doctype {
+    my $self = shift(@_);
+    my ($expat, $name, $sysid, $pubid, $internal) = @_;
+
+    # This test used to be done in xml_start_document
+    # Moved to here as seems more logical
+
+    if ($name !~ "seg") {	
+	die "VideoPlugin: Root tag $name does not match expected <seg>";
+    }
+}
+
+
+sub xml_start_tag {
+    my $self = shift(@_);
+    my ($expat, $element) = @_;
+
+    my %attr = %_;
+    
+    if ($element eq "seg") {
+	$self->{'keyframe_index'} = 0;
+	$self->{'keyframe_fnames'} = [];
+	$self->{'keyframe_timeline'} = {};
+
+	#$self->{'flowplayer_thumblist'} = "thumbs: \\[";
+
+	my $output_dir = $self->{'cached_dir'};
+	my $cue_filename = &util::filename_cat($output_dir,"on_cue.xml");
+
+	open(CUEOUT,">$cue_filename")
+	    || die "Unable to open $cue_filename: $!\n";
+	print CUEOUT "<tags>\n";
+    }
+    elsif ($element eq "trans") {
+	my $trans_type = $attr{'type'};
+	my $pre_frame_num = $attr{'preFNum'};
+	my $post_frame_num = $attr{'postFNum'};
+
+	my $avg_frame_num = int(($pre_frame_num+$post_frame_num)/2.0)+1;
+
+	my $output_dir = $self->{'cached_dir'};
+	my $ivideo_root = $self->{'cached_file_root'};
+
+	my $keyframe_index = $self->{'keyframe_index'};
+
+	my $fps = $self->{'video-fps'};
+
+	if ($keyframe_index==0)
+	{
+	    # hive actually generates one extra keyframe at the start,
+	    # which is half way between frame 0 and the frist pre_frame
+
+	    my $thumb_file = sprintf("%s_%04d.jpg",$ivideo_root,$keyframe_index);
+	    my $thumb_filename = &util::filename_cat($output_dir,$thumb_file);
+	    push(@{$self->{'keyframe_fnames'}},$thumb_file);
+
+	    my $half_frame_num = $pre_frame_num/2.0;
+	    my $time_msec = ($half_frame_num / $fps) * 1000;
+
+#	    print CUEOUT "  <metatag event=\"onCuePoint\" overwrite=\"true\">\n";
+#	    print CUEOUT "    <name>Keyframe $keyframe_index</name>\n";
+#	    print CUEOUT "    <timestamp>$time_msec</timestamp>\n";
+#	    print CUEOUT "    <parameters>\n";
+#	    print CUEOUT "      <thumb>$thumb_file</thumb>\n";
+#	    print CUEOUT "    </parameters>\n";
+#	    print CUEOUT "    <type>navigation</type>\n";
+#	    print CUEOUT "  </metatag>\n";
+
+
+	    my $timeline_rec = { 'name'=> "Keyframe $keyframe_index",
+				 'keyframeindex' => $keyframe_index,
+				 'timestamp' => $time_msec,
+				 'thumb' => $thumb_file,
+				 'keyframenum' => $keyframe_index};
+
+	    $self->{'keyframe_timeline'}->{$half_frame_num}=$timeline_rec;
+	}
+
+	$keyframe_index++;
+
+	my $thumb_file = sprintf("%s_%04d.jpg",$ivideo_root,$keyframe_index);
+	my $thumb_filename = &util::filename_cat($output_dir,$thumb_file);
+	push(@{$self->{'keyframe_fnames'}},$thumb_file);
+
+	my $time_msec = (($avg_frame_num) / $fps) * 1000;
+	my $time_sec = (($avg_frame_num)/ $fps);
+
+#	print CUEOUT "  <metatag event=\"onCuePoint\" overwrite=\"true\">\n";
+#	print CUEOUT "    <name>Keyframe $keyframe_index</name>\n";
+#	print CUEOUT "    <timestamp>$time_msec</timestamp>\n";
+#	print CUEOUT "    <parameters>\n";
+#	print CUEOUT "      <thumb>$thumb_file</thumb>\n";
+#	print CUEOUT "    </parameters>\n";
+#	print CUEOUT "    <type>navigation</type>\n";
+#	print CUEOUT "  </metatag>\n";
+
+
+	my $timeline_rec = { 'name'=> "Keyframe $keyframe_index",
+			     'keyframeindex' => $keyframe_index,
+			     'timestamp' => $time_msec,
+			     'thumb' => $thumb_file,
+			     'keyframenum' => $keyframe_index};
+
+	$self->{'keyframe_timeline'}->{$avg_frame_num}=$timeline_rec;
+
+	# $self->{'flowplayer_thumblist'} .= "\\{ thumbNail: '$thumb_file', time: $time_sec \\},"; 
+
+	$self->{'keyframe_index'}  = $keyframe_index;
+    }
+}
+
+sub xml_end_tag {
+    my $self = shift(@_);
+    my ($expat, $element) = @_;
+
+    if ($element eq "seg") {
+
+	$self->output_distributed_keyframes($self->{'keyframe_timeline'},$self->{'keep_keyframes'});
+
+
+	print CUEOUT "</tags>\n";
+	close(CUEOUT);
+
+	#$self->{'flowplayer_thumblist'} .= "\\]";
+    }
+}
+
+
+
+
+
+# Called just before start or end tags with accumulated non-markup text in
+# the $_ variable.
+sub xml_text {
+    my $self = shift(@_);
+    my ($expat) = @_;
+}
+
+# Called for processing instructions. The $_ variable will contain a copy
+# of the pi.
+sub xml_pi {
+    my $self = shift(@_);
+    my ($expat, $target, $data) = @_;
+}
+
+# Called at the end of the XML document.
+sub xml_end_document {
+    my $self = shift(@_);
+    my ($expat) = @_;
+
+    # ****
+    # $self->close_document();
+}
+
+
+# Called for any characters not handled by the above functions.
+sub xml_default {
+    my $self = shift(@_);
+    my ($expat, $text) = @_;
+}
+
+
+1;
+
+
+
+
+
+
+
+
+
+
+
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/perllib/strings.properties
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/perllib/strings.properties	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/perllib/strings.properties	(revision 24799)
@@ -0,0 +1,6 @@
+
+VideoPlugin.desc:This plugin processes video files, adding basic metadata
+
+MultimediaConverter.ffmpegnotinstalled:FFmpeg not installed
+
+MultimediaConverter.noconversionavailable:Video conversion not available
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/runtime-srcpack/CASCADE-MAKE.bat
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/runtime-srcpack/CASCADE-MAKE.bat	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/runtime-srcpack/CASCADE-MAKE.bat	(revision 24799)
@@ -0,0 +1,19 @@
+@echo off
+
+for /D %%d IN (packages) do (
+  echo   Running %%d\CASCADE-MAKE.bat %*
+
+  (cd %%d && call CASCADE-MAKE.bat %* && cd ..)
+
+  if not ERRORLEVEL 0 (
+    echo   Error encountered running %%d\CASCADE-MAKE.bat
+    goto ErrorExitPos1
+  )
+)
+goto End
+
+:ErrorExitPos1
+set ERRORLEVEL=1
+
+:End
+
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/runtime-srcpack/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/runtime-srcpack/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/runtime-srcpack/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+
+for d in packages ; do
+  echo "  Running $d/CASCADE-MAKE.sh $*"
+
+  (cd $d; ./CASCADE-MAKE.sh $*)
+
+  if [ $? != 0 ] ; then
+    echo "  Error encountered running $d/CASCADE-MAKE.sh"
+    exit 1
+  fi
+done
+
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/runtime-srcpack/packages/CASCADE-MAKE.bat
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/runtime-srcpack/packages/CASCADE-MAKE.bat	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/runtime-srcpack/packages/CASCADE-MAKE.bat	(revision 24799)
@@ -0,0 +1,20 @@
+@echo off
+
+for /D %%d IN (MOD_FLVX FLOWPLAYER) do (
+  echo     Running CASCADE-MAKE\%%d.bat %*
+
+  call CASCADE-MAKE\%%d.bat %*
+
+  if not ERRORLEVEL 0 (
+    echo   Error encountered running CASCADE-MAKE\%%d.bat
+    goto ErrorExitPos1
+  )
+)
+
+goto End
+
+:ErrorExitPos1
+set ERRORLEVEL=1
+goto End
+
+:End
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/runtime-srcpack/packages/CASCADE-MAKE.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/runtime-srcpack/packages/CASCADE-MAKE.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/runtime-srcpack/packages/CASCADE-MAKE.sh	(revision 24799)
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+
+for d in MOD_FLVX FLOWPLAYER ; do
+  echo "    Running CASCADE-MAKE/$d.sh $*"
+
+  ./CASCADE-MAKE/$d.sh $*
+
+  if [ $? != 0 ] ; then
+    echo "  Error encountered running CASCADE-MAKE/$d.sh"
+    exit 1
+  fi
+done
+
+
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/runtime-srcpack/packages/CASCADE-MAKE/FLOWPLAYER.bat
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/runtime-srcpack/packages/CASCADE-MAKE/FLOWPLAYER.bat	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/runtime-srcpack/packages/CASCADE-MAKE/FLOWPLAYER.bat	(revision 24799)
@@ -0,0 +1,40 @@
+@echo off
+
+set package=flowplayer
+set version=-gs
+
+set progname=%0
+
+REM call ../../cascade-make/bin/script/test-setup.bash
+REM call ../../cascade-make/lib/cascade-lib.bash
+
+set prefix=%GEXTVIDEO_INSTALLED%/%GSDLOS%
+set webprefix=..\..\web
+
+REM opt_run_untar $force_untar $auto_untar $package $version
+
+REM no make configure, or compile needed
+
+REM install
+if "%install%" == "1" (
+  if not exist "%webprefix%\flash" (
+    if not exist "%package%version%" (
+      echo Warning: %package%%version% does not appear to be unpacked
+    ) else (
+      echo Installing Flowplayer into %webprefix% folder
+      mkdir %webprefix%\flash
+      xcopy /Y %package%%version%\* %webprefix%\flash
+    )
+  )
+)
+
+REM installclean
+if "%installclean%" == "1" (
+  del /F %webprefix%\flash 
+)
+
+
+REM opt_run_tarclean $tarclean $package $version
+
+
+
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/runtime-srcpack/packages/CASCADE-MAKE/FLOWPLAYER.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/runtime-srcpack/packages/CASCADE-MAKE/FLOWPLAYER.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/runtime-srcpack/packages/CASCADE-MAKE/FLOWPLAYER.sh	(revision 24799)
@@ -0,0 +1,36 @@
+#!/bin/bash
+
+package=flowplayer
+version=-gs
+
+progname=$0
+
+source ../../cascade-make/bin/script/test-setup.bash
+source ../../cascade-make/lib/cascade-lib.bash
+
+prefix=$GEXTVIDEO_INSTALLED/$GSDLOS
+webprefix=../../web
+
+opt_run_untar $force_untar $auto_untar $package $version
+
+# no make configure, or compile needed
+
+#install
+if [ $install = "1" ] ; then
+  if [ ! -d $webprefix/flash ] ; then
+    echo "Installing Flowplayer into $webprefix folder"
+    /bin/cp -rf $package$version $webprefix/flash
+  fi
+fi
+
+#installclean
+if [ $installclean = "1" ] ; then
+  /bin/rm -rf $webprefix/flash 
+fi
+
+
+
+opt_run_tarclean $tarclean $package $version
+
+
+
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/runtime-srcpack/packages/CASCADE-MAKE/GSLIGHTTPD.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/runtime-srcpack/packages/CASCADE-MAKE/GSLIGHTTPD.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/runtime-srcpack/packages/CASCADE-MAKE/GSLIGHTTPD.sh	(revision 24799)
@@ -0,0 +1,43 @@
+#!/bin/bash
+
+progname=$0
+
+source ../../bin/script/test-setup.bash
+source ../../lib/cascade-lib.bash
+
+prefix=$GEXTVIDEO_INSTALLED/server
+
+
+# Ensure that the necessary directories exist within the 'installed' area
+
+
+for d in logs htdocs conf ; do
+  if [ ! -e $prefix/$d ] ; then
+    echo "Creating $prefix/$d"
+    mkdir $prefix/$d
+  fi
+done
+
+# Install necessary config files to work with Greenstone
+
+gsvidinstalled=$prefix
+
+( cd gslighttpd ; \
+  cat lighttpd.conf.in \
+  | sed "s%@GSVIDINSTALLED@%$gsvidinstalled%g" \
+  > $prefix/conf/lighttpd.conf )
+
+if [ $? != 0 ] ; then
+    echo "      Error encountered running *customise install* stage of GSLIGHTTPD.sh"
+    exit 1
+fi
+
+
+( cd gslighttpd ; \
+  /bin/cp index.html $prefix/htdocs/. )
+
+if [ $? != 0 ] ; then
+    echo "      Error encountered running *customise install* stage of GSLIGHTTPD.sh"
+    exit 1
+fi
+
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/runtime-srcpack/packages/CASCADE-MAKE/LIGHTTPD.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/runtime-srcpack/packages/CASCADE-MAKE/LIGHTTPD.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/runtime-srcpack/packages/CASCADE-MAKE/LIGHTTPD.sh	(revision 24799)
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+package=lighttpd
+version=-1.4.15
+
+progname=$0
+
+source ../../bin/script/test-setup.bash
+source ../../lib/cascade-lib.bash
+
+prefix=$GEXTVIDEO_INSTALLED/server
+
+
+opt_run_untar $force_untar $auto_untar $package $version
+opt_run_configure $force_config $auto_config $package $version "$prefix"
+
+opt_run_make $compile   $package $version
+opt_run_make $install   $package $version "install"
+opt_run_make $clean     $package $version "clean"
+opt_run_make $distclean $package $version "distclean"
+
+opt_run_tarclean $tarclean $package $version
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/runtime-srcpack/packages/CASCADE-MAKE/MOD_FLVX.bat
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/runtime-srcpack/packages/CASCADE-MAKE/MOD_FLVX.bat	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/runtime-srcpack/packages/CASCADE-MAKE/MOD_FLVX.bat	(revision 24799)
@@ -0,0 +1,23 @@
+@echo off
+
+set package=mod_flvx
+set version=-14-apr-2009
+
+set progname=%0
+
+REM call ../../cascade-make/bin/script/test-setup.bash
+REM call ../../cascade-make/lib/cascade-lib.bash
+
+set prefix=%GEXTVIDEO_INSTALLED%\%GSDLOS%
+
+REM opt_run_untar $force_untar $auto_untar $package $version
+
+REM opt_run_make $compile   $package "$version"
+REM opt_run_make $install   $package "$version" "install"
+REM opt_run_make $clean     $package "$version" "clean"
+
+REM opt_run_tarclean $tarclean $package $version
+
+echo *****
+echo ***** Need to add compile instructions for mod_flvx
+echo *****
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/runtime-srcpack/packages/CASCADE-MAKE/MOD_FLVX.sh
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/runtime-srcpack/packages/CASCADE-MAKE/MOD_FLVX.sh	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/runtime-srcpack/packages/CASCADE-MAKE/MOD_FLVX.sh	(revision 24799)
@@ -0,0 +1,19 @@
+#!/bin/bash
+
+package=mod_flvx
+version=-14-apr-2009
+
+progname=$0
+
+source ../../cascade-make/bin/script/test-setup.bash
+source ../../cascade-make/lib/cascade-lib.bash
+
+prefix=$GEXTVIDEO_INSTALLED/$GSDLOS
+
+opt_run_untar $force_untar $auto_untar $package $version
+
+opt_run_make $compile   $package "$version"
+opt_run_make $install   $package "$version" "install"
+opt_run_make $clean     $package "$version" "clean"
+
+opt_run_tarclean $tarclean $package $version
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/runtime-srcpack/packages/gslighttpd/index.html
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/runtime-srcpack/packages/gslighttpd/index.html	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/runtime-srcpack/packages/gslighttpd/index.html	(revision 24799)
@@ -0,0 +1,13 @@
+<html>
+  <head>
+    <title>Greenstone Video Streaming Server</title>
+  </head>
+
+  <body>
+    <h3>Greenstone Video Streaming Server</h3>
+
+    <p>You are running the lighthtppd server with flash streaming enabled.</p>
+
+  </body>
+
+</html>
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/runtime-srcpack/packages/gslighttpd/lighttpd.conf.in
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/runtime-srcpack/packages/gslighttpd/lighttpd.conf.in	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/runtime-srcpack/packages/gslighttpd/lighttpd.conf.in	(revision 24799)
@@ -0,0 +1,327 @@
+# lighttpd configuration file
+#
+# use it as a base for lighttpd 1.0.0 and above
+#
+# $Id: lighttpd.conf,v 1.7 2004/11/03 22:26:05 weigon Exp $
+
+############ Options you really have to take care of ####################
+
+## modules to load
+# at least mod_access and mod_accesslog should be loaded
+# all other module should only be loaded if really neccesary
+# - saves some time
+# - saves memory
+server.modules              = (
+#                               "mod_rewrite",
+#                               "mod_redirect",
+#                               "mod_alias",
+                                "mod_access",
+				"mod_flv_streaming",
+#                               "mod_cml",
+#                               "mod_trigger_b4_dl",
+#                               "mod_auth",
+#                               "mod_status",
+#                               "mod_setenv",
+#                               "mod_fastcgi",
+#                               "mod_proxy",
+#                               "mod_simple_vhost",
+#                               "mod_evhost",
+#                               "mod_userdir",
+                                "mod_cgi",
+#                               "mod_compress",
+#                               "mod_ssi",
+#                               "mod_usertrack",
+#                               "mod_expire",
+#                               "mod_secdownload",
+#                               "mod_rrdtool",
+                                "mod_accesslog" )
+
+
+## a static document-root, for virtual-hosting take look at the
+## server.virtual-* options
+server.document-root        = "@GSVIDINSTALLED@/htdocs/"
+
+## where to send error-messages to
+server.errorlog             = "@GSVIDINSTALLED@/logs/error.log"
+
+# files to check for if .../ is requested
+index-file.names            = ( "index.php", "index.html",
+                                "index.htm", "default.htm" )
+
+## set the event-handler (read the performance section in the manual)
+# server.event-handler = "freebsd-kqueue" # needed on OS X
+
+# mimetype mapping
+mimetype.assign             = (
+  ".pdf"          =>      "application/pdf",
+  ".sig"          =>      "application/pgp-signature",
+  ".spl"          =>      "application/futuresplash",
+  ".class"        =>      "application/octet-stream",
+  ".ps"           =>      "application/postscript",
+  ".torrent"      =>      "application/x-bittorrent",
+  ".dvi"          =>      "application/x-dvi",
+  ".gz"           =>      "application/x-gzip",
+  ".pac"          =>      "application/x-ns-proxy-autoconfig",
+  ".swf"          =>      "application/x-shockwave-flash",
+  ".tar.gz"       =>      "application/x-tgz",
+  ".tgz"          =>      "application/x-tgz",
+  ".tar"          =>      "application/x-tar",
+  ".zip"          =>      "application/zip",
+  ".mp3"          =>      "audio/mpeg",
+  ".m3u"          =>      "audio/x-mpegurl",
+  ".wma"          =>      "audio/x-ms-wma",
+  ".wax"          =>      "audio/x-ms-wax",
+  ".ogg"          =>      "application/ogg",
+  ".wav"          =>      "audio/x-wav",
+  ".gif"          =>      "image/gif",
+  ".jpg"          =>      "image/jpeg",
+  ".jpeg"         =>      "image/jpeg",
+  ".png"          =>      "image/png",
+  ".xbm"          =>      "image/x-xbitmap",
+  ".xpm"          =>      "image/x-xpixmap",
+  ".xwd"          =>      "image/x-xwindowdump",
+  ".css"          =>      "text/css",
+  ".html"         =>      "text/html",
+  ".htm"          =>      "text/html",
+  ".js"           =>      "text/javascript",
+  ".asc"          =>      "text/plain",
+  ".c"            =>      "text/plain",
+  ".cpp"          =>      "text/plain",
+  ".log"          =>      "text/plain",
+  ".conf"         =>      "text/plain",
+  ".text"         =>      "text/plain",
+  ".txt"          =>      "text/plain",
+  ".dtd"          =>      "text/xml",
+  ".xml"          =>      "text/xml",
+  ".mpeg"         =>      "video/mpeg",
+  ".mpg"          =>      "video/mpeg",
+  ".mov"          =>      "video/quicktime",
+  ".qt"           =>      "video/quicktime",
+  ".avi"          =>      "video/x-msvideo",
+  ".asf"          =>      "video/x-ms-asf",
+  ".asx"          =>      "video/x-ms-asf",
+  ".wmv"          =>      "video/x-ms-wmv",
+  ".bz2"          =>      "application/x-bzip",
+  ".tbz"          =>      "application/x-bzip-compressed-tar",
+  ".tar.bz2"      =>      "application/x-bzip-compressed-tar"
+ )
+
+# Use the "Content-Type" extended attribute to obtain mime type if possible
+#mimetype.use-xattr        = "enable"
+
+
+## send a different Server: header
+## be nice and keep it at lighttpd
+# server.tag                 = "lighttpd"
+
+#### accesslog module
+accesslog.filename          = "@GSVIDINSTALLED@/logs/access.log"
+
+## deny access the file-extensions
+#
+# ~    is for backupfiles from vi, emacs, joe, ...
+# .inc is often used for code includes which should in general not be part
+#      of the document-root
+url.access-deny             = ( "~", ".inc" )
+
+#!!!!!
+#$HTTP["url"] =~ "\.pdf$" {
+#  server.range-requests = "disable"
+#}
+
+##
+# which extensions should not be handle via static-file transfer
+#
+# .php, .pl, .fcgi are most often handled by mod_fastcgi or mod_cgi
+static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )
+
+######### Options that are good to be but not neccesary to be changed #######
+
+## bind to port (default: 80)
+server.port                = 8081
+
+## bind to localhost (default: all interfaces)
+#server.bind                = "grisu.home.kneschke.de"
+
+## error-handler for status 404
+#server.error-handler-404   = "/error-handler.html"
+#server.error-handler-404   = "/error-handler.php"
+
+## to help the rc.scripts
+#server.pid-file            = "/var/run/lighttpd.pid"
+
+
+flv-streaming.extensions = ( ".flv" )
+
+###### virtual hosts
+##
+##  If you want name-based virtual hosting add the next three settings and load
+##  mod_simple_vhost
+##
+## document-root =
+##   virtual-server-root + virtual-server-default-host + virtual-server-docroot
+## or
+##   virtual-server-root + http-host + virtual-server-docroot
+##
+#simple-vhost.server-root   = "/home/weigon/wwwroot/servers/"
+#simple-vhost.default-host  = "grisu.home.kneschke.de"
+#simple-vhost.document-root = "/pages/"
+
+
+##
+## Format: <errorfile-prefix><status-code>.html
+## -> ..../status-404.html for 'File not found'
+#server.errorfile-prefix    = "/home/weigon/projects/lighttpd/doc/status-"
+
+## virtual directory listings
+dir-listing.activate       = "enable"
+
+## enable debugging
+#debug.log-request-header   = "enable"
+#debug.log-response-header  = "enable"
+#debug.log-request-handling = "enable"
+#debug.log-file-not-found   = "enable"
+
+### only root can use these options
+#
+# chroot() to directory (default: no chroot() )
+#server.chroot              = "/"
+
+## change uid to <uid> (default: don't care)
+#server.username            = "wwwrun"
+
+## change uid to <uid> (default: don't care)
+#server.groupname           = "wwwrun"
+
+#### compress module
+#compress.cache-dir         = "@GSVIDINSTALLED@/cache/compress/"
+#compress.filetype          = ("text/plain", "text/html")
+
+#### proxy module
+## read proxy.txt for more info
+#proxy.server               = ( ".php" =>
+#                               ( "localhost" =>
+#                                 (
+#                                   "host" => "192.168.0.101",
+#                                   "port" => 80
+#                                 )
+#                               )
+#                             )
+
+#### fastcgi module
+## read fastcgi.txt for more info
+## for PHP don't forget to set cgi.fix_pathinfo = 1 in the php.ini
+#fastcgi.server             = ( ".php" =>
+#                               ( "localhost" =>
+#                                 (
+#                                   "socket" => "/tmp/php-fastcgi.socket",
+#                                   "bin-path" => "/usr/local/bin/php"
+#                                 )
+#                               )
+#                            )
+
+#### CGI module
+cgi.assign                 = ( ".pl"  => "/usr/bin/perl",
+                               ".cgi" => "/usr/bin/perl" )
+
+
+#### SSL engine
+#ssl.engine                 = "enable"
+#ssl.pemfile                = "server.pem"
+
+#### status module
+#status.status-url          = "/server-status"
+#status.config-url          = "/server-config"
+
+#### auth module
+## read authentication.txt for more info
+#auth.backend               = "plain"
+#auth.backend.plain.userfile = "lighttpd.user"
+#auth.backend.plain.groupfile = "lighttpd.group"
+
+#auth.backend.ldap.hostname = "localhost"
+#auth.backend.ldap.base-dn  = "dc=my-domain,dc=com"
+#auth.backend.ldap.filter   = "(uid=$)"
+
+#auth.require               = ( "/server-status" =>
+#                               (
+#                                 "method"  => "digest",
+#                                 "realm"   => "download archiv",
+#                                 "require" => "user=jan"
+#                               ),
+#                               "/server-config" =>
+#                               (
+#                                 "method"  => "digest",
+#                                 "realm"   => "download archiv",
+#                                 "require" => "valid-user"
+#                               )
+#                             )
+
+#### url handling modules (rewrite, redirect, access)
+#url.rewrite                = ( "^/$"             => "/server-status" )
+#url.redirect               = ( "^/wishlist/(.+)" => "http://www.123.org/$1" )
+#### both rewrite/redirect support back reference to regex conditional using %n
+#$HTTP["host"] =~ "^www\.(.*)" {
+#  url.redirect            = ( "^/(.*)" => "http://%1/$1" )
+#}
+
+#
+# define a pattern for the host url finding
+# %% => % sign
+# %0 => domain name + tld
+# %1 => tld
+# %2 => domain name without tld
+# %3 => subdomain 1 name
+# %4 => subdomain 2 name
+#
+#evhost.path-pattern        = "/home/storage/dev/www/%3/htdocs/"
+
+#### expire module
+#expire.url                 = ( "/buggy/" => "access 2 hours", "/asdhas/" => "access plus 1 seconds 2 minutes")
+
+#### ssi
+#ssi.extension              = ( ".shtml" )
+
+#### rrdtool
+#rrdtool.binary             = "/usr/bin/rrdtool"
+#rrdtool.db-name            = "/var/www/lighttpd.rrd"
+
+#### setenv
+#setenv.add-request-header  = ( "TRAV_ENV" => "mysql://user@host/db" )
+#setenv.add-response-header = ( "X-Secret-Message" => "42" )
+
+## for mod_trigger_b4_dl
+# trigger-before-download.gdbm-filename = "/home/weigon/testbase/trigger.db"
+# trigger-before-download.memcache-hosts = ( "127.0.0.1:11211" )
+# trigger-before-download.trigger-url = "^/trigger/"
+# trigger-before-download.download-url = "^/download/"
+# trigger-before-download.deny-url = "http://127.0.0.1/index.html"
+# trigger-before-download.trigger-timeout = 10
+
+## for mod_cml
+## don't forget to add index.cml to server.indexfiles
+# cml.extension               = ".cml"
+# cml.memcache-hosts          = ( "127.0.0.1:11211" )
+
+#### variable usage:
+## variable name without "." is auto prefixed by "var." and becomes "var.bar"
+#bar = 1
+#var.mystring = "foo"
+
+## integer add
+#bar += 1
+## string concat, with integer cast as string, result: "www.foo1.com"
+#server.name = "www." + mystring + var.bar + ".com"
+## array merge
+#index-file.names = (foo + ".php") + index-file.names
+#index-file.names += (foo + ".php")
+
+#### include
+#include /etc/lighttpd/lighttpd-inc.conf
+## same as above if you run: "lighttpd -f /etc/lighttpd/lighttpd.conf"
+#include "lighttpd-inc.conf"
+
+#### include_shell
+#include_shell "echo var.a=1"
+## the above is same as:
+#var.a=1
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/setup.bash
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/setup.bash	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/setup.bash	(revision 24799)
@@ -0,0 +1,45 @@
+
+extdesc="the Video and Audio Extension"
+
+full_setup=`pwd`/${BASH_SOURCE}
+fulldir=${full_setup%/*}
+fulldir=${fulldir%/.}
+
+source cascade-make/lib/cascade-lib.bash
+
+if [ "x$GEXTVIDEO" = "x" ] ; then
+  export GEXTVIDEO=$fulldir
+  export GEXTVIDEO_INSTALLED=$GEXTVIDEO/$GSDLOS
+
+  export PATH=$GEXTVIDEO_INSTALLED/bin:$PATH
+
+  if [ "x$LD_LIBRARY_PATH" = "x" ] ; then
+    export LD_LIBRARY_PATH=$GEXTVIDEO_INSTALLED/lib
+  else
+    export LD_LIBRARY_PATH=$GEXTVIDEO_INSTALLED/lib:$LD_LIBRARY_PATH
+  fi
+  if [ "x$DYLD_LIBRARY_PATH" = "x" ] ; then
+    export DYLD_LIBRARY_PATH=$GEXTVIDEO_INSTALLED/lib
+  else
+    export DYLD_LIBRARY_PATH=$GEXTVIDEO_INSTALLED/lib:$DYLD_LIBRARY_PATH
+  fi
+
+  if [ -e "devel-srcpack" ] ; then
+    export LD_LIBRARY_PATH=$GEXTVIDEO_INSTALLED/devel/lib:$LD_LIBRARY_PATH
+    export DYLD_LIBRARY_PATH=$GEXTVIDEO_INSTALLED/devel/lib:$DYLD_LIBRARY_PATH
+  fi
+
+  
+  extdir=${GEXTVIDEO##*/}
+
+  if [ "x$GSDLEXTS" = "x" ] ; then
+    export GSDLEXTS=$extdir
+  else 
+    export GSDLEXTS=$GSDLEXTS:$extdir
+  fi
+
+
+  echo "+Your environment is now setup for $extdesc"
+else
+  echo "+Your environment is already setup for $extdesc"
+fi
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/setup.bat
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/setup.bat	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/setup.bat	(revision 24799)
@@ -0,0 +1,59 @@
+@echo off
+pushd "%CD%"
+CD /D "%~dp0"
+set GSDLLANG=en
+set extdesc="the Video and Audio Extension"
+
+if "%OS%" == "Windows_NT" goto WinNT
+if "%OS%" == "" goto Win95
+if "%GSDLLANG%" == "en" echo Setup failed - your PATH has not been set
+if "%GSDLLANG%" == "es" echo No se pudo realizar la configuraci¢n - no se ha establecido la RUTA.
+if "%GSDLLANG%" == "fr" echo Echc de l'installation - votre variable PATH n'a pas t ajuste
+if "%GSDLLANG%" == "ru" echo áâ ­®¢ª  ­¥ ã€ « áì -  ­¥ ¡ë« ãáâ ­®¢«¥­
+goto End
+
+:WinNT
+set GEXTVIDEO=%CD%
+set GEXTVIDEO_INSTALLED=%GEXTVIDEO%\windows
+
+set PATH=%GEXTVIDEO_INSTALLED%\bin;%PATH%
+set GS_CP_SET=yes
+goto Success
+
+:Win95
+if "%1" == "SetEnv" goto Win95Env
+REM We'll invoke a second copy of the command processor to make
+REM sure there's enough environment space
+COMMAND /E:2048 /K %0 SetEnv
+goto End
+
+:Win95Env
+set GEXTVIDEO=%CD%
+set PATH="%GEXTVIDEO_INSTALLED%\bin";"%PATH%"
+set GS_CP_SET=yes
+goto Success
+
+:Success
+
+set fulldir=%~dp0
+
+:: strip off everything up to (and including) ext dir
+set extdir=%fulldir:*ext\=%
+
+:: remove trailing slash
+set extdir=%extdir:\=%
+
+
+setlocal enabledelayedexpansion
+if "x%GSDLEXTS%" == "x" (
+  set GSDLEXTS=!extdir!
+) else (
+  set GSDLEXTS=!GSDLEXTS!:!extdir!
+)
+endlocal & set GSDLEXTS=%GSDLEXTS%
+
+echo +Your environment is now setup for %extdesc%
+
+:End
+
+popd
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/video-and-audio-setup.pl
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/video-and-audio-setup.pl	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/video-and-audio-setup.pl	(revision 24799)
@@ -0,0 +1,66 @@
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    die "GSDLOS not set\n" unless defined $ENV{'GSDLOS'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib/cpan");
+}
+
+use Cwd;
+require util;    
+
+my $env_ext  = "GEXTVIDEO";
+my $ext_desc = "the Video and Audio Extension";
+
+if (!defined $ENV{$env_ext}) {
+    
+    my $ext_home = cwd();
+    my $ext_os = $ENV{'GSDLOS'};
+
+    my ($ext_dir,$_prefix_dir) = File::Basename::fileparse($ext_home);
+
+    my $ext_installed = $env_ext."_INSTALLED";
+
+    $ENV{$env_ext} = $ext_home;
+    
+    $ENV{$ext_installed} = &util::filename_cat($ext_home,$ext_os);
+
+    my $ext_bin = &util::filename_cat($ENV{$ext_installed},"bin");
+    my $ext_lib = &util::filename_cat($ENV{$ext_installed},"lib");
+
+    &util::envvar_append("PATH",$ext_bin);
+
+    if ($ext_os =~ m/darwin/i) {
+	&util::envvar_append("DYLD_LIBRARY_PATH",$ext_lib);
+    }
+    else {
+	&util::envvar_append("LD_LIBRARY_PATH",$ext_lib);
+    }
+
+    # GSDLEXTS always uses : as a separator
+    if (defined $ENV{'GSDLEXTS'}) {
+	$ENV{'GSDLEXTS'} .= ":$ext_dir";
+    }
+    else {
+	$ENV{'GSDLEXTS'} = $ext_dir;
+    }
+    
+    print STDERR "+Your environment is now setup for $ext_desc\n";
+}
+else {    
+    print STDERR "+Your environment is already setup for $ext_desc\n";
+}
+
+if (scalar(@ARGV>0)) {
+
+    print STDERR "\n";
+
+    my $cmd = join(" ",map {$_ = "\"$_\""} @ARGV);
+
+    if (system($cmd)!=0) {
+	print STDERR "\nError: Failed to run '$cmd'\n";
+	print STDERR "$!\n";
+    }
+}
+
+1;
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/web/flash/flowPlayer.js
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/web/flash/flowPlayer.js	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/web/flash/flowPlayer.js	(revision 24799)
@@ -0,0 +1,450 @@
+/*
+ * FlowPlayer external configuration file.
+ * Copyright 2005-2006 Anssi Piirainen
+ *
+ * All settings defined in this file can be alternatively defined in the 
+ * embedding HTML object tag (as flashvars variables). Values defined in the
+ * object tag override values defined in this file. You could use this 
+ * config file to provide defaults for multiple player instances that 
+ * are used in a Web site. Individual instances can be then customized 
+ * with their embedding HTML.
+ *
+ * Note that you should probably remove all the comments from this file
+ * before using it. That way the file will be smaller and will load faster.
+ */
+{
+	/*
+	 * Instructs the player to load the configuration from an external config file.
+	 * This can be a abosulte URL or a relative url (relative to the HTML page
+	 * where the player is embedded).
+	 */
+//	configFileName: 'flowPlayer.js',
+
+	/*
+	 * Instructs the player to load the configuration from a RTMP server.
+	 * The player connects to the server listening in the address specified
+	 * by this URL and calls a method 'getStreamPlayerConfig' that should return a
+	 * valid FP configuration object.
+	 */
+//	rtmpConfigUrl: 'rtmp://localhost/myapp',
+
+	/*
+	 * A param value to be passed to getStreamPlayerConfig(). A value 'foobar'
+	 * will make the player to call getStreamPlayerConfig('foobsr')
+	 */
+//	rtmpConfigParam: 'anssi',
+	
+	/*
+	 * Name of the video file. Used if only one video is shown.
+	 *
+	 * Note for testing locally: Specify an empty baseURL '', if you want to load
+	 * the video from your local disk from the directory that contains
+	 * FlowPlayer.swf. In this case the videoFile parameter value should start
+	 * with a slash, for example '/video.flv'.
+	 *
+	 * See also: 'baseURL' that affects this variable
+	 */
+//	 videoFile: 'honda_accord.flv',
+
+	/*
+	 * Clip to be used if the file specified with 'videoFile' or any of the clips in the playlist
+	 * was not found.  The missing video clips are replaced by this clip. This can be
+	 * an image or a FLV clip. Typically this will contain an image/video saying
+	 * "the video you requested cannot be found.....".
+	 *
+	 * The syntax for the value is the same is with the clips in a playlist
+	 * including the possibility to have start/end and duration properties.
+	 *
+	 * See also: 'baseURL' that affects this variable
+	 */
+	 noVideoClip: { url: 'main_clickToPlay.jpg', duration: 10 },
+	 //noVideoClip: { url: 'MiltonFriedmanonLimi.flv' },
+
+	/*
+	 * Playlist is used to publish several videos using one player instance.
+	 * You can also have images in the playlist. The playback pauses in the
+	 * image unless a 'duration' property is given for the image:
+
+ * 	 * The clips in the playlist may have following properties:
+	 *
+	 * name: Name for the clip to be shown in the playlist view. If this is
+	 *       not given, the clip will be hidden from the view.
+	 *
+	 * url: The URL used to load the clip.
+	 * 
+	 * type: One of 'video', 'flv', 'swf', 'jpg'. Optional, determined from the URL's filename extension
+	 *       if that is present. 'video' means a video file in any format supported by Flash.
+	 *       'flv' is present here for backward compatibility, use 'video' in new FlowPlayer installations
+	 *       now. Defaults to 'video' if the extension is not present in the URL.
+	 *
+	 * start: The start time (seconds) from where to start the playback. A nonzero
+	 *        value can only be used when using a streaming server!!
+	 * end: The end time (seconds) where to stop the playback.
+	 *
+	 * duration: The duration the image is to be shown. If not given the playback
+	 *           pauses when the image is reached in the list.
+	 * 
+	 * protected: (true/false) Apply inlinine linking protection for this clip?
+	 *            Optional, defaults to false.
+	 * 
+	 * linkUrl: Associates a hyperlink pointing to the specified URL. The linked
+	 *          document will be opened to the browser when the clip area is clicked.
+	 * 			Specifying this parameter will replace the normal pause/resume behavior
+	 * 			that is associated to clicking the display area. If you specify an empty
+	 * 			linkUrl '' the pause/resume behavior is disabled but no hyperlink
+	 * 			is created.
+	 * linkWindow: Specifies the name of the browser window or frame into which to load
+	 *   the linked document. Can be a custom name or one of presets: '_blank', 
+	 *   '_parent', '_self', '_top'. (optional, defaults to '_blank')
+	 * 
+	 * controlEnabled: (true/false) Enable transport control buttons for this clip?
+	 *                 Optional, defaults to true.
+	 *
+	 * allowResize: (true/false) Allow resizing this clip according to the menu selection.
+	 *              Optional, defaults to true.
+	 *              
+	 * overlay: A filename pointing to an image that will be placed on top of this image clip. This
+	 *          is only applicable to image clips (jpg or png files). Essentially this layers two images
+	 *          on top of each other. Typically the image on top is a big play button that is used on
+	 *          top of an image taken from the main movie.
+	 * 
+	 * overlayId: ID that specifies a built-in overlay to be used. Currently the player supports
+	 * 			  one built-in overlay with ID 'play'. It renders a large play button with mouse hover color change.
+	 * 			  You can use this on top of image clips (one clip with both the 'url' property and
+	 * 			  'overlayId' property). 
+	 * 			  You can also specify a clip that only has this ID. In that
+	 * 			  case you should place it immediately before or after a FLV clip. This overlay-only
+	 * 			  clip is then rendered on top of the first or the last frame of the FLV video.
+	 * 
+	 * live: (true/false) Is this a live stream (played from a media server)?
+	 * 
+	 * showOnLoadBegin: (true/false) If true, make this clip visible when the fist bits have been loaded.
+	 * If false, do not show this clip (show the background instead) before the buffer is filled
+	 * and the playback starts. Optional, defaults to true.
+	 * 
+	 * maxPlayCount: The maximum play count for this clip. The clip is removed from the playlist when
+	 * the playcount reaches this amount.
+	 * 
+	 * suggestedClipsInfoUrl:  URL used to fetch suggestions (related videos) information from the server
+	 * 
+	 * See also: 'baseURL' is prefixed with each URL
+	 */
+	playList: [
+	{ url: 'main_clickToPlay.jpg' },
+	{ name: 'Honda Accord', url: '!honda_accord.flv' },
+	{ name: 'River', url: 'river.flv' },
+	{ name: 'Ounasvaara', url: 'ounasvaara.flv' }
+	],
+	
+	/*
+	 * Specifies wether the playlist control buttons should be shown in the player SWF component or not.
+	 * Optional, defaults to the value of showPlayList. 
+	 */
+	showPlayListButtons: true,
+
+	/*
+	 * Streaming server connection URL. 
+	 * You don't need this with lighttpd, just use the streamingServer setting (see below) with it.
+	 */
+//	 streamingServerURL: 'rtmp://localahost:oflaDemo',
+	
+	/*
+	 * Is this a live stream? Only makes sense when using a streaming server.
+	 * Optional, defaults to false.
+	 */
+//	liveStream: true,
+	
+	/* 
+	 * baseURL specifies the URL that is appended in front of different file names
+	 * given in this file.
+	 * 
+	 * You don't need to specify this at all if you place the video next to
+	 * the player SWF file on the Web server (to be available under the same URL path).
+	 */
+//	 baseURL: 'http://flowplayer.sourceforge.net/video',
+	
+	
+	/*
+	 * What kind of streaming server? Available options: 'fms', 'red5', 'lighttpd'
+	 */
+//	streamingServer: 'fms',
+	
+	/*
+	 * Specifies whether thumbnail information is contained in the FLV's cue point 
+	 * metadata. Cue points can be injected into the FLV file using 
+	 * for example Flvtool2. See the FlowPlayer web site for more info.
+	 * (optional, defaults to false)
+	 * 
+	 * See also: cuePoints below for an alternative way of specifying thumb metadata
+	 */
+//	thumbsOnFLV: true,
+	
+	/*
+	 * Thumbnails specific to cue points. Use this if you don't want to
+	 * embed thumbnail metadata into the FLV's cue points. 
+	 * If you have thumbNails defined here you should have thumbsOnFLV: false !
+	 * thumb times are given in seconds
+	 */
+// 	thumbs: [
+// 	{ thumbNail:  'Thumb1.jpg', time: 10 },
+// 	{ thumbNail:  'Thumb2.jpg', time: 24 },
+// 	{ thumbNail:  'Thumb3.jpg', time: 54 },
+// 	{ thumbNail:  'Thumb4.jpg', time: 74 },
+// 	{ thumbNail:  'Thumb5.jpg', time: 94 },
+// 	{ thumbNail:  'Thumb6.jpg', time: 110 }
+// 	],
+	// Location of the thumbnail files
+// 	thumbLocation: 'http://www.kolumbus.fi/apiirain/video',
+	
+	/* 
+	 * 'autoPlay' variable defines whether playback begins immediately or not.
+	 * 
+	 * Note that currently with red5 you should not have false in autoPlay 
+	 * when you specify a nonzero starting position for the video clip. This is because red5
+	 * does not send FLV metadata when the playback starts from a nonzero value.
+	 * 
+	 * (optional, defaults to true)
+	 */
+	autoPlay: true,
+
+	/*
+	 * 'autoBuffering' specifies wheter to start loading the video stream into
+	 *  buffer memory  immediately. Only meaningful if 'autoPlay' is set to
+	 * false. (optional, defaults to true)
+	 */
+	autoBuffering: true,
+
+	/*
+	 * 'startingBufferLength' specifies the video buffer length to be used to kick
+	 * off the playback. This is used in the beginning of the playback and every time
+	 * after the player has ran out of buffer memory. 
+	 * More info at: http://www.progettosinergia.com/flashvideo/flashvideoblog.htm#031205
+	 * (optional, defaults to the value of 'bufferLength' setting)
+	 * 
+	 * see also: bufferLength
+	 */
+//	startingBufferLength: 5,
+
+	/*
+	 * 'bufferLength' specifies the video buffer length in seconds. This is used
+	 * after the playback has started with the initial buffer length. You should
+	 * use an arbitrary large value here to ensure stable playback.
+	 * (optional, defaults to 10 seconds)
+	 * 
+	 * see also: startingBufferLength
+	 */
+	bufferLength: 20,
+
+	/*
+	 * 'loop' defines whether the playback should loop to the first clip after
+	 * all clips in the playlist have been shown. It is used as the
+	 * default state of the toggle button that controls looping. (optional,
+	 * defaults to true)
+	 */
+	loop: true,
+
+	/*
+	 * Rewind back to the fist clip in the playlist when end of the list has been reached?
+	 * This option only has effect if loop is false (please see loop variable above).
+	 * (optional, defaults to false)
+	 */
+	autoRewind: true,
+	
+	/*
+	 * Specifies wether the loop toggle button should be shown in the player SWF component or not.
+	 * Optional, defaults to false. 
+	 */
+//	showLoopButton: true,
+	
+	/*
+	 * Specifies the height to be allocated for the video display. This is the
+	 * maximum height available for the different resizing options.
+	 */
+	videoHeight: 320,
+	
+	/*
+	 * Specifies the width for the control buttons area. Optiona, defaults to the
+	 * width setting used in the embedding code. 
+	 */
+//	controlsWidth: 480,
+	
+	/*
+	 * Specifies how the video is scaled initially. This can be then changed by
+	 * the user through the menu. (optional, defaults to 'fit')
+	 * Possible values:
+	 * 'fit'   Fit to window by preserving the aspect ratios encoded in the FLV metadata.
+	 *         This is the default behavior.
+	 * 'half'  Half size (preserves aspect ratios)
+	 * 'orig'  Use the dimensions encoded in FLV. If the video is too big for the 
+	 *         available space the video is scaled as if using the 'fit' option.
+	 * 'scale' Scale the video to fill all available space for the video. Ignores
+	 *         the dimensions in metadata.
+	 * 
+	 */
+	initialScale: 'fit',
+	
+	/*
+	 * Specifies if the menu containing the size options should be shown or not.
+	 * (optional, defaults to true)
+//	showMenu: false,
+	
+	/*
+	 * 'hideControls' if set to true, hides all buttons and the progress bar
+	 * leaving only the video showing (optional, defaults to false)
+	 */
+	hideControls: false,
+
+	/*
+	 * URL that specifies a base URL that points to a folder containing
+	 * images used to skin the player. You must specify this if you intend
+	 * to load external button images (see 'loadButtonImages' below).
+	 */
+	skinImagesBaseURL: 'http://flowplayer.sourceforge.net/resources'
+
+	/*
+	 * Will button images be loaded from external files, or will images embedded
+	 * in the player SWF component be used? Set this to false if you want to "skin"
+	 * the buttons. Optional, defaults to true.
+	 * 
+	 * NOTE: If you set this to false, you need to have the skin images available
+	 * on the server! Otherwise the player will not show up at all or will show
+	 * up corrupted.
+	 *
+	 * See also: 'skinImagesBaseURL' that affects this variable
+	 */
+//	useEmbeddedButtonImages: false,
+	
+	/*
+	 * 'splashImageFile' specifies an image file to be used as a splash image.
+	 * This is useful if 'autoPlay' is set to false and you want to show a
+	 * welcome image before the video is played. Should be in JPG format. The
+	 * value of 'baseURL' is used similarily as with the video file name and
+	 * therefore the video and the image files should be placed in the Web
+	 * server next to each other.
+	 * 
+	 * NOTE: If you set a value for this, you need to have the splash image available
+	 * on the server! Otherwise the player will not show up at all or will show
+	 * up corrupted.
+	 *
+	 * NOTE2: You can also specify the splash in a playlist. This is just
+	 * an alternative way of doing it. It was preserved for backward compatibility.
+	 *
+	 * See also: 'baseURL' that affects this variable
+	 */
+//	splashImageFile: 'main_clickToPlay.jpg',
+	
+	/*
+	 * Should the splash image be scaled to fit the entire video area? If false,
+	 * the image will be centered. Optional, defaults to false.
+	 */
+//	scaleSplash: false,
+
+	/*
+	 * 'progressBarColor1' defines the color of the progress bar at the bottom
+	 * and top edges. Specified in hexadecimal triplet form indicating the RGB
+	 * color component values. (optional)
+	 */
+//	progressBarColor1: 0xFFFFFF,
+
+
+	/*
+	 * 'progressBarColor2' defines the color in the middle of the progress bar.
+	 * The value of this and 'progressBarColor1' variables define the gradient
+	 * color fill of the progress bar. (optional)
+	 */
+//	progressBarColor2: 0xDDFFDD,
+
+	/*
+	 * 'bufferBarColor1' defines the color of the buffer size indicator bar at the bottom
+	 * and top edges. (optional)
+	 */
+//	bufferBarColor1: 0xFFFFFF,
+
+
+	/*
+	 * 'bufferBarColor2' defines the color of the buffer size indicator bar in the middle
+	 * of the bar. (optional)
+	 */
+//	bufferBarColor2: 0xDDFFDD,
+
+	/*
+	 * 'progressBarBorderColor1' defines the color of the progress bar's border at the bottom
+	 * and top edges. (optional)
+	 */
+//	progressBarBorderColor1: 0xDDDDDD,
+
+
+	/*
+	 * 'progressBarBorderColor2' defines the color of the progress bar's border in the middle
+	 * of the bar. (optional)
+	 */
+//	progressBarBorderColor2: 0xEEEEEE,
+
+	/*
+	 * 'bufferingAnimationColor' defines the color of the moving bars used in the buffering 
+	 * animation. (optional)
+	 */
+//	bufferingAnimationColor: 0x0000FF,
+
+	/*
+	 * 'controlsAreaBorderColor' defines the color of the border behind buttons and progress bar 
+	 * (optional)
+	 */
+//	controlsAreaBorderColor: 0x1234,
+
+	/*
+	 * 'timeDisplayFontColor' defines the color of the progress/duration time display 
+	 * (optional)
+	 */
+//	timeDisplayFontColor: 0xAABBCC,
+
+	/*
+	 * Height of the progress bar. (optional)
+	 */
+//	progressBarHeight: 10,
+
+	/*
+	 * Height of the progress bar area. (optional)
+	 */
+//	progressBarAreaHeight: 10,
+
+	/*
+	 * Name of the authentication code file name that is used to prevent inline linking
+	 * of video and image files. This can be a complete URL or just a file name relative
+	 * to the location from where the player is loaded. (optional, defaults to flowplayer_auth.txt)
+	 */
+//	authFileName: 'http://www.mytube.org/authCode.txt',
+
+	/*
+	 * The URL pointing to a sctipt that opens the player full screen. 
+	 * If this is not configured explicitly, the default script, 
+	 * http://flowplayer.sourceforge.net/fullscreen.js, is used.
+	 */
+//	fullScreenScriptURL: 'http://mysite.org/fullscreen.js'
+
+	/**
+	 * Specifies which menu items will be show. This is an array that contains a boolean
+	 * value for each of the items. By default shows them all except "full screen".
+	 */
+//	menuItems[
+//		true, // show 'Fit to window'
+//		true, // show 'Half size'
+//		true, // show 'Original size'
+//		true, // show 'Fill window'
+//		true, // show 'Full screen'
+//		false // hide 'Embed...'
+//	],
+
+
+	/*
+	 * Specifies wether the full screen button should be shown in the player SWF component or not.
+	 * Optional, defaults to true. 
+	 */
+//	showFullScreenButton: false,
+
+	/*
+	 * Use the Flash 9 native full screen mode.
+	 */
+//	useNativeFullScreen: true,
+}
+
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/web/flash/fullscreen.js
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/web/flash/fullscreen.js	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/web/flash/fullscreen.js	(revision 24799)
@@ -0,0 +1,15 @@
+/*
+ * Default FlowPlayer fullscreen opener.
+ * http://flowplayer.sourceforge.net
+ */
+
+function flowPlayerOpenFullScreen(config) {
+  var winWidth = window.screen.availWidth;
+  var winHeight = window.screen.availHeight;
+  var fullScreenWindow = window.open('http://flowplayer.org/video/1_20/fullscreen.html?config='+config, 'FlowPlayer', 'left=0,top=0,width='+winWidth+',height='+winHeight+',status=no,resizable=yes');
+}
+
+function flowPlayerExitFullScreen(config) {
+  self.close();
+}
+
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/web/flash/jwplayer/readme.html
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/web/flash/jwplayer/readme.html	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/web/flash/jwplayer/readme.html	(revision 24799)
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+
+	<title>JW Player for Flash</title>
+
+	<style type="text/css">
+		body { background-color: #fff; padding: 0 20px; color:#000; font: 13px/18px Arial, sans-serif; }
+		a { color: #360; }
+		h3 { padding-top: 20px; }
+		ol { margin:5px 0 15px 16px; padding:0; list-style-type:square; }
+	</style>
+
+</head>
+<body>
+
+	<h1>Welcome to the World of LongTail Video</h1>
+	<p>Thanks for downloading the JW FLV Player, just one of many products created by Jeroen "JW" Wijering and his company, <a href="http://www.longtailvideo.com">LongTail Video</a>.  Before you get started, let us tell you about a few other products that might interest you:</p>
+
+<ul>
+<li><a href="http://www.longtailvideo.com/players/jw-desktop-player/">Desktop Player</a> - Our sleek new desktop player is the best way to watch all your music and video files.  Plus, you can even search the web for videos without ever opening your browser.  <a href="http://www.longtailvideo.com/players/jw-desktop-player/">Download it now</a>.</li>
+<li><a href="http://www.longtailvideo.com/referral.aspx?page=pubreferral&ref=oryixfvlxlptwph">AdSolution</a> - Monetize your videos with LongTail's AdSolution.  Integrate pre-roll, overlay mid-roll and post-roll ads into your site and starting making money today.  <a href="http://www.longtailvideo.com/referral.aspx?page=pubreferral&ref=oryixfvlxlptwph">Sign up now</a>.</li>
+<li><a href="http://www.bitsontherun.com/via/longtailvideo">Bits on the Run</a> - Upload, encode, store, manage and stream your videos with Bits on the Run, LongTail's end-to-end video content management system.  <a href="http://www.bitsontherun.com/via/longtailvideo">Sign up now</a>.</li>
+<li><a href="http://www.longtailvideo.com/addons/plugins">Plugins</a> - Add functionality to your player, like analytics tracking, embed links, sharing and more.  <a href="http://www.longtailvideo.com/addons/plugins">Find one for you</a>.</li>
+<li><a href="http://www.longtailvideo.com/addons/skins">Skins</a> - Change the look of your player to match your site.  <a href="http://www.longtailvideo.com/addons/skins">View our library</a>.</li>
+</ul>
+
+
+	<h3>Licensing</h3>
+	<p>The player is licensed under a <a href="http://creativecommons.org/licenses/by-nc-sa/2.0/">Creative Commons License</a>. It allows you to use, modify and redistribute the script, but only for <b>noncommercial</b> purposes. Examples of <b>commercial use</b> include: 
+	
+	<ul>
+	<li>websites with any advertisements; </li>
+	<li>websites owned or operated by corporations; </li>
+	<li>websites designed to promote other products, such as a band or artist;</li>
+	<li>products (e.g. a CMS) that bundle LongTail products into its offering. </li>
+	</ul>
+	
+	If any of the above conditions apply to you, <a href="http://www.longtailvideo.com/players/order" title="Order commercial licenses">please apply for a commercial license</a> now.  If you are still unsure whether you need to purchase a license, please <a href="http://www.longtailvideo.com/forum/">post your question</a> in the forum. </p>
+
+	<h3>Player Example</h3>
+	<p>Below you see a simple embedded example of the JW Player.  Copy and paste the source code and put the SWF, JS and FLV file on your site to get started.</p>
+
+	<!-- START OF THE PLAYER EMBEDDING TO COPY-PASTE -->
+
+	<script type="text/javascript" src="swfobject.js"></script>
+	<script type="text/javascript">
+		swfobject.registerObject("player","9.0.98","expressInstall.swf");
+	</script>
+
+	<object id="player" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" name="player" width="328" height="200">
+		<param name="movie" value="player.swf" />
+		<param name="allowfullscreen" value="true" />
+		<param name="allowscriptaccess" value="always" />
+		<param name="flashvars" value="file=video.flv&image=preview.jpg" />
+		<object type="application/x-shockwave-flash" data="player.swf" width="328" height="200">
+			<param name="movie" value="player.swf" />
+			<param name="allowfullscreen" value="true" />
+			<param name="allowscriptaccess" value="always" />
+			<param name="flashvars" value="file=video.flv&image=preview.jpg" />
+			<p><a href="http://get.adobe.com/flashplayer">Get Flash</a> to see this player.</p>
+		</object>
+	</object>
+
+	<!-- END OF THE PLAYER EMBEDDING -->
+
+
+	<h3>Quickstart</h3>
+	<p>The easiest way to get to know the player is by using our <a href="http://www.longtailvideo.com/support/jw-player-setup-wizard">setup wizard</a>. Select an example, set the file or playlist you want to play and copy-paste the embed code to your site. If you want to play Youtube content in the player, you also have to copy the <b>yt.swf</b> file along with the player.swf or player-viral.swf.</p>
+
+	<p>If you need any help, please visit our extensive support section, including <a href="http://www.longtailvideo.com/support/faq">FAQs</a>, a string of <a href="http://www.longtailvideo.com/support/tutorials">tutorials</a> and a very active <a href="http://www.longtailvideo.com/support/forum">support forum</a>.</p>
+
+	<h3>Wiki and Source Code</h3>
+	<p>The <a href="http://developer.longtailvideo.com">Developer Wiki</a> contains a wealth of info about the player, including:</p>
+	<ol>
+		<li><a href="http://developer.longtailvideo.com/trac/wiki/FlashFormats">Supported file formats</a> (and playlists).</li>
+		<li><a href="http://developer.longtailvideo.com/trac/wiki/FlashVars">Supported flashvars</a> (for customizing the player).</li>
+		<li><a href="http://developer.longtailvideo.com/trac/wiki/FlashAPI">Supported API calls</a> (for actionscript / javascript interaction).</li>
+		<li><a href="http://developer.longtailvideo.com/trac/wiki/FlashSkinning">Supported skinning elements</a> (for creating your own graphics).</li>
+		<li><a href="http://developer.longtailvideo.com/trac/roadmap/">Roadmap with full changelogs</a> for each version.</li>
+	</ol>
+	<p>The source code of all different versions of the player can <a href="http://developer.longtailvideo.com/trac/browser/tags">be found here</a>. You can click a version and download the ZIP files (the links are at the bottom).</p>
+
+</body>
+</html>
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/web/flash/jwplayer/swfobject.js
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/web/flash/jwplayer/swfobject.js	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/web/flash/jwplayer/swfobject.js	(revision 24799)
@@ -0,0 +1,8 @@
+/**
+ * SWFObject v1.5: Flash Player detection and embed - http://blog.deconcept.com/swfobject/
+ *
+ * SWFObject is (c) 2007 Geoff Stearns and is released under the MIT License:
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ */
+if(typeof deconcept=="undefined"){var deconcept=new Object();}if(typeof deconcept.util=="undefined"){deconcept.util=new Object();}if(typeof deconcept.SWFObjectUtil=="undefined"){deconcept.SWFObjectUtil=new Object();}deconcept.SWFObject=function(_1,id,w,h,_5,c,_7,_8,_9,_a){if(!document.getElementById){return;}this.DETECT_KEY=_a?_a:"detectflash";this.skipDetect=deconcept.util.getRequestParameter(this.DETECT_KEY);this.params=new Object();this.variables=new Object();this.attributes=new Array();if(_1){this.setAttribute("swf",_1);}if(id){this.setAttribute("id",id);}if(w){this.setAttribute("width",w);}if(h){this.setAttribute("height",h);}if(_5){this.setAttribute("version",new deconcept.PlayerVersion(_5.toString().split(".")));}this.installedVer=deconcept.SWFObjectUtil.getPlayerVersion();if(!window.opera&&document.all&&this.installedVer.major>7){deconcept.SWFObject.doPrepUnload=true;}if(c){this.addParam("bgcolor",c);}var q=_7?_7:"high";this.addParam("quality",q);this.setAttribute("useExpressInstall",false);this.setAttribute("doExpressInstall",false);var _c=(_8)?_8:window.location;this.setAttribute("xiRedirectUrl",_c);this.setAttribute("redirectUrl","");if(_9){this.setAttribute("redirectUrl",_9);}};deconcept.SWFObject.prototype={useExpressInstall:function(_d){this.xiSWFPath=!_d?"expressinstall.swf":_d;this.setAttribute("useExpressInstall",true);},setAttribute:function(_e,_f){this.attributes[_e]=_f;},getAttribute:function(_10){return this.attributes[_10];},addParam:function(_11,_12){this.params[_11]=_12;},getParams:function(){return this.params;},addVariable:function(_13,_14){this.variables[_13]=_14;},getVariable:function(_15){return this.variables[_15];},getVariables:function(){return this.variables;},getVariablePairs:function(){var _16=new Array();var key;var _18=this.getVariables();for(key in _18){_16[_16.length]=key+"="+_18[key];}return _16;},getSWFHTML:function(){var _19="";if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","PlugIn");this.setAttribute("swf",this.xiSWFPath);}_19="<embed type=\"application/x-shockwave-flash\" src=\""+this.getAttribute("swf")+"\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+this.getAttribute("style")+"\"";_19+=" id=\""+this.getAttribute("id")+"\" name=\""+this.getAttribute("id")+"\" ";var _1a=this.getParams();for(var key in _1a){_19+=[key]+"=\""+_1a[key]+"\" ";}var _1c=this.getVariablePairs().join("&");if(_1c.length>0){_19+="flashvars=\""+_1c+"\"";}_19+="/>";}else{if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");this.setAttribute("swf",this.xiSWFPath);}_19="<object id=\""+this.getAttribute("id")+"\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+this.getAttribute("style")+"\">";_19+="<param name=\"movie\" value=\""+this.getAttribute("swf")+"\" />";var _1d=this.getParams();for(var key in _1d){_19+="<param name=\""+key+"\" value=\""+_1d[key]+"\" />";}var _1f=this.getVariablePairs().join("&");if(_1f.length>0){_19+="<param name=\"flashvars\" value=\""+_1f+"\" />";}_19+="</object>";}return _19;},write:function(_20){if(this.getAttribute("useExpressInstall")){var _21=new deconcept.PlayerVersion([6,0,65]);if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute("version"))){this.setAttribute("doExpressInstall",true);this.addVariable("MMredirectURL",escape(this.getAttribute("xiRedirectUrl")));document.title=document.title.slice(0,47)+" - Flash Player Installation";this.addVariable("MMdoctitle",document.title);}}if(this.skipDetect||this.getAttribute("doExpressInstall")||this.installedVer.versionIsValid(this.getAttribute("version"))){var n=(typeof _20=="string")?document.getElementById(_20):_20;n.innerHTML=this.getSWFHTML();return true;}else{if(this.getAttribute("redirectUrl")!=""){document.location.replace(this.getAttribute("redirectUrl"));}}return false;}};deconcept.SWFObjectUtil.getPlayerVersion=function(){var _23=new deconcept.PlayerVersion([0,0,0]);if(navigator.plugins&&navigator.mimeTypes.length){var x=navigator.plugins["Shockwave Flash"];if(x&&x.description){_23=new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));}}else{if(navigator.userAgent&&navigator.userAgent.indexOf("Windows CE")>=0){var axo=1;var _26=3;while(axo){try{_26++;axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+_26);_23=new deconcept.PlayerVersion([_26,0,0]);}catch(e){axo=null;}}}else{try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");}catch(e){try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");_23=new deconcept.PlayerVersion([6,0,21]);axo.AllowScriptAccess="always";}catch(e){if(_23.major==6){return _23;}}try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");}catch(e){}}if(axo!=null){_23=new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));}}}return _23;};deconcept.PlayerVersion=function(_29){this.major=_29[0]!=null?parseInt(_29[0]):0;this.minor=_29[1]!=null?parseInt(_29[1]):0;this.rev=_29[2]!=null?parseInt(_29[2]):0;};deconcept.PlayerVersion.prototype.versionIsValid=function(fv){if(this.major<fv.major){return false;}if(this.major>fv.major){return true;}if(this.minor<fv.minor){return false;}if(this.minor>fv.minor){return true;}if(this.rev<fv.rev){return false;}return true;};deconcept.util={getRequestParameter:function(_2b){var q=document.location.search||document.location.hash;if(_2b==null){return q;}if(q){var _2d=q.substring(1).split("&");for(var i=0;i<_2d.length;i++){if(_2d[i].substring(0,_2d[i].indexOf("="))==_2b){return _2d[i].substring((_2d[i].indexOf("=")+1));}}}return "";}};deconcept.SWFObjectUtil.cleanupSWFs=function(){var _2f=document.getElementsByTagName("OBJECT");for(var i=_2f.length-1;i>=0;i--){_2f[i].style.display="none";for(var x in _2f[i]){if(typeof _2f[i][x]=="function"){_2f[i][x]=function(){};}}}};if(deconcept.SWFObject.doPrepUnload){if(!deconcept.unloadSet){deconcept.SWFObjectUtil.prepUnload=function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){};window.attachEvent("onunload",deconcept.SWFObjectUtil.cleanupSWFs);};window.attachEvent("onbeforeunload",deconcept.SWFObjectUtil.prepUnload);deconcept.unloadSet=true;}}if(!document.getElementById&&document.all){document.getElementById=function(id){return document.all[id];};}var getQueryParamValue=deconcept.util.getRequestParameter;var FlashObject=deconcept.SWFObject;var SWFObject=deconcept.SWFObject;
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/web/flash/suggestions.js
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/web/flash/suggestions.js	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/web/flash/suggestions.js	(revision 24799)
@@ -0,0 +1,10 @@
+{
+	clips: [
+		{ url: 'honda_accord.flv', name: 'Honda commercial', suggestedClipsInfoUrl: 'suggestions.js',
+					duration: 180, thumbnailUrl: 'Thumb1.jpg', 
+					info: { viewed: 631, category: 'ads' } },
+		{ url: 'river.flv', name: 'Skiing in Rovaniemi', suggestedClipsInfoUrl: 'suggestions.js',
+					duration: 180, thumbnailUrl: 'Thumb2.jpg',
+					info: { viewed: 2, category: 'sports' } }
+	]
+}
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/web/flash/swfobject.js
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/web/flash/swfobject.js	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/web/flash/swfobject.js	(revision 24799)
@@ -0,0 +1,138 @@
+/**
+ * SWFObject v1.4.4: Flash Player detection and embed - http://blog.deconcept.com/swfobject/
+ *
+ * SWFObject is (c) 2006 Geoff Stearns and is released under the MIT License:
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * **SWFObject is the SWF embed script formerly known as FlashObject. The name was changed for
+ *   legal reasons.
+ */
+if(typeof deconcept=="undefined"){var deconcept=new Object();}
+if(typeof deconcept.util=="undefined"){deconcept.util=new Object();}
+if(typeof deconcept.SWFObjectUtil=="undefined"){deconcept.SWFObjectUtil=new Object();}
+deconcept.SWFObject=function(_1,id,w,h,_5,c,_7,_8,_9,_a,_b){if(!document.getElementById){return;}
+this.DETECT_KEY=_b?_b:"detectflash";
+this.skipDetect=deconcept.util.getRequestParameter(this.DETECT_KEY);
+this.params=new Object();
+this.variables=new Object();
+this.attributes=new Array();
+if(_1){this.setAttribute("swf",_1);}
+if(id){this.setAttribute("id",id);}
+if(w){this.setAttribute("width",w);}
+if(h){this.setAttribute("height",h);}
+if(_5){this.setAttribute("version",new deconcept.PlayerVersion(_5.toString().split(".")));}
+this.installedVer=deconcept.SWFObjectUtil.getPlayerVersion();
+if(c){this.addParam("bgcolor",c);}
+var q=_8?_8:"high";
+this.addParam("quality",q);
+this.setAttribute("useExpressInstall",_7);
+this.setAttribute("doExpressInstall",false);
+var _d=(_9)?_9:window.location;
+this.setAttribute("xiRedirectUrl",_d);
+this.setAttribute("redirectUrl","");
+if(_a){this.setAttribute("redirectUrl",_a);}};
+deconcept.SWFObject.prototype={setAttribute:function(_e,_f){
+this.attributes[_e]=_f;
+},getAttribute:function(_10){
+return this.attributes[_10];
+},addParam:function(_11,_12){
+this.params[_11]=_12;
+},getParams:function(){
+return this.params;
+},addVariable:function(_13,_14){
+this.variables[_13]=_14;
+},getVariable:function(_15){
+return this.variables[_15];
+},getVariables:function(){
+return this.variables;
+},getVariablePairs:function(){
+var _16=new Array();
+var key;
+var _18=this.getVariables();
+for(key in _18){_16.push(key+"="+_18[key]);}
+return _16;},getSWFHTML:function(){var _19="";
+if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){
+if(this.getAttribute("doExpressInstall")){
+this.addVariable("MMplayerType","PlugIn");}
+_19="<embed type=\"application/x-shockwave-flash\" src=\""+this.getAttribute("swf")+"\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\"";
+_19+=" id=\""+this.getAttribute("id")+"\" name=\""+this.getAttribute("id")+"\" ";
+var _1a=this.getParams();
+for(var key in _1a){_19+=[key]+"=\""+_1a[key]+"\" ";}
+var _1c=this.getVariablePairs().join("&");
+if(_1c.length>0){_19+="flashvars=\""+_1c+"\"";}_19+="/>";
+}else{if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");}
+_19="<object id=\""+this.getAttribute("id")+"\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\">";
+_19+="<param name=\"movie\" value=\""+this.getAttribute("swf")+"\" />";
+var _1d=this.getParams();
+for(var key in _1d){_19+="<param name=\""+key+"\" value=\""+_1d[key]+"\" />";}
+var _1f=this.getVariablePairs().join("&");
+if(_1f.length>0){_19+="<param name=\"flashvars\" value=\""+_1f+"\" />";}_19+="</object>";}
+return _19;
+},write:function(_20){
+if(this.getAttribute("useExpressInstall")){
+var _21=new deconcept.PlayerVersion([6,0,65]);
+if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute("version"))){
+this.setAttribute("doExpressInstall",true);
+this.addVariable("MMredirectURL",escape(this.getAttribute("xiRedirectUrl")));
+document.title=document.title.slice(0,47)+" - Flash Player Installation";
+this.addVariable("MMdoctitle",document.title);}}
+if(this.skipDetect||this.getAttribute("doExpressInstall")||this.installedVer.versionIsValid(this.getAttribute("version"))){
+var n=(typeof _20=="string")?document.getElementById(_20):_20;
+n.innerHTML=this.getSWFHTML();return true;
+}else{if(this.getAttribute("redirectUrl")!=""){document.location.replace(this.getAttribute("redirectUrl"));}}
+return false;}};
+deconcept.SWFObjectUtil.getPlayerVersion=function(){
+var _23=new deconcept.PlayerVersion([0,0,0]);
+if(navigator.plugins&&navigator.mimeTypes.length){
+var x=navigator.plugins["Shockwave Flash"];
+if(x&&x.description){_23=new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));}
+}else{try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");}
+catch(e){try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
+_23=new deconcept.PlayerVersion([6,0,21]);axo.AllowScriptAccess="always";}
+catch(e){if(_23.major==6){return _23;}}try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");}
+catch(e){}}if(axo!=null){_23=new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));}}
+return _23;};
+deconcept.PlayerVersion=function(_27){
+this.major=_27[0]!=null?parseInt(_27[0]):0;
+this.minor=_27[1]!=null?parseInt(_27[1]):0;
+this.rev=_27[2]!=null?parseInt(_27[2]):0;
+};
+deconcept.PlayerVersion.prototype.versionIsValid=function(fv){
+if(this.major<fv.major){return false;}
+if(this.major>fv.major){return true;}
+if(this.minor<fv.minor){return false;}
+if(this.minor>fv.minor){return true;}
+if(this.rev<fv.rev){
+return false;
+}return true;};
+deconcept.util={getRequestParameter:function(_29){
+var q=document.location.search||document.location.hash;
+if(q){var _2b=q.substring(1).split("&");
+for(var i=0;i<_2b.length;i++){
+if(_2b[i].substring(0,_2b[i].indexOf("="))==_29){
+return _2b[i].substring((_2b[i].indexOf("=")+1));}}}
+return "";}};
+deconcept.SWFObjectUtil.cleanupSWFs=function(){if(window.opera||!document.all){return;}
+var _2d=document.getElementsByTagName("OBJECT");
+for(var i=0;i<_2d.length;i++){_2d[i].style.display="none";for(var x in _2d[i]){
+if(typeof _2d[i][x]=="function"){_2d[i][x]=function(){};}}}};
+deconcept.SWFObjectUtil.prepUnload=function(){__flash_unloadHandler=function(){};
+__flash_savedUnloadHandler=function(){};
+if(typeof window.onunload=="function"){
+var _30=window.onunload;
+window.onunload=function(){
+deconcept.SWFObjectUtil.cleanupSWFs();_30();};
+}else{window.onunload=deconcept.SWFObjectUtil.cleanupSWFs;}};
+if(typeof window.onbeforeunload=="function"){
+var oldBeforeUnload=window.onbeforeunload;
+window.onbeforeunload=function(){
+deconcept.SWFObjectUtil.prepUnload();
+oldBeforeUnload();};
+}else{window.onbeforeunload=deconcept.SWFObjectUtil.prepUnload;}
+if(Array.prototype.push==null){
+Array.prototype.push=function(_31){
+this[this.length]=_31;
+return this.length;};}
+var getQueryParamValue=deconcept.util.getRequestParameter;
+var FlashObject=deconcept.SWFObject;
+var SWFObject=deconcept.SWFObject;
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/web/script/document.js
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/web/script/document.js	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/web/script/document.js	(revision 24799)
@@ -0,0 +1,451 @@
+
+  function format_date (gsdate,mode) 
+  {
+       var year_num  = gsdate.substr(0,4);
+       var month_num = gsdate.substr(4,2);
+       var date_num  = gsdate.substr(6,2);
+
+       var date = new Date(year_num,month_num-1,date_num)
+
+       var date_str = date.toLocaleDateString();
+
+       if ((mode != undefined) && (mode == "alphanum"))
+       {
+           var dayname   = new Array("Sunday","Monday","Tuesday","Wednesday",
+                                     "Thursday","Friday","Saturday");
+           var monthname = new Array("Jan","Feb","Mar","Apr","May","Jun","Jul",
+                                     "Aug","Sep","Oct","Nov","Dec");
+
+           var day_alpha   = dayname[date.getDay()];
+           var month_alpha = monthname[date.getMonth()];
+
+           date_str = day_alpha +", "
+                       + date_num +" "+ month_alpha +" "+ year_num;
+        }
+
+       document.write(date_str);
+  }
+
+  function format_filesize (gsfilesize) 
+  {
+      var filesize = gsfilesize + " bytes";
+
+      if (gsfilesize > 1048576) {
+        filesize = Math.round(gsfilesize / 1048576.0) + " Mb"
+      }
+      else if (gsfilesize > 1024) {
+        filesize = Math.round(gsfilesize / 1024.0) + " Kb"
+      }
+
+      document.write(filesize);
+  }
+
+
+
+function getOpenBookTable() {
+
+        var tabTocA = document.getElementById("toc");
+
+        // book icon and toc wrapper
+        var tablesOuter = tabTocA.parentNode.getElementsByTagName("table")
+
+        return tablesOuter.item(0);
+
+}
+
+function getTocTable() {
+
+        var tabTocA = document.getElementById("toc");
+
+        // book icon and toc wrapper
+        var tablesOuter = tabTocA.parentNode.getElementsByTagName("table")
+        
+        var tabWrap = tablesOuter.item(1);
+
+        var tables = tabWrap.getElementsByTagName("table")
+
+        return tables.item(0);
+
+}
+
+
+
+
+function manipulateTocTable() {
+
+	var tabOB= getOpenBookTable();
+
+	if (tabOB != null) {
+	  var expandText = document.getElementById("db-expand-text");
+	  var highlight  = document.getElementById("db-highlight");
+	  var parentDB = expandText.parentNode;
+
+	  parentDB.removeChild(expandText);
+	  parentDB.removeChild(highlight);
+
+	  var tbodyOB = tabOB.firstChild;
+	  var trOB = tbodyOB.firstChild;
+	  trOB.appendChild(expandText);
+	  trOB.appendChild(highlight);
+
+	  tabOB.setAttribute("width","100%");
+	  
+  	  // tabOB.setAttribute("bgcolor","red");
+	}
+
+
+	var tabToc= getTocTable();
+
+	if (tabToc != null) {
+
+	    var tablePack = document.createElement("table");
+	    var tbodyPack = document.createElement("tbody");
+	    tablePack.appendChild(tbodyPack);
+
+	    var trPack = document.createElement("tr");
+	    trPack.setAttribute("bgColor","#e0f0ff");
+
+
+  	    var trList = tabToc.getElementsByTagName("tr")
+
+	    // repack into 3-col table
+	    var i;
+	    for (i=0; i<trList.length; i++) {
+	      if ((i>0) && (i % 3 == 0)) {
+	        tbodyPack.appendChild(trPack);
+	        trPack = document.createElement("tr");
+		trPack.setAttribute("bgColor","#e0f0ff");
+	      }
+	      var tr = trList.item(i);
+	      var tdList = tr.getElementsByTagName("td");
+
+	      //console.log("tdList = " + tdList.length);
+
+	      var tdLink = tdList.item(0);
+	      var href = tdLink.firstChild.href;
+
+	      href = "javascript:htmlLoad(\""+href+"&onlytext=1\",\"ajaxtext\")";
+
+	      var tdText = tdList.item(2);
+
+	      var aPack = document.createElement("a");
+	      aPack.setAttribute("href",href);
+	      aPack.setAttribute("class","toc");
+	      aPack.innerHTML = tdText.innerHTML;
+
+	      var iPack = document.createElement("i");
+	      iPack.appendChild(aPack);
+
+	      //var tdPack = tdText.cloneNode(true);
+	      var tdPack = document.createElement("td");
+	      tdPack.appendChild(iPack);
+
+	      // var textText = document.createTextNode(tdText.innerHTML);
+
+	      // tdPack.appendChild(textText);
+
+	      // tdPack.setAttribute("bgcolor","blue");
+	      trPack.appendChild(tdPack);
+
+	    }
+
+	    tbodyPack.appendChild(trPack);
+
+	    // find outer table element, and replace with new compact TOC
+	    var newTocLoc = tabToc.parentNode;
+	    while (!newTocLoc.nodeName.match(/^table$/i)) {
+	        newTocLoc = newTocLoc.parentNode;
+	    }
+
+	    
+	    // set up list of TOC chapter headings (used when video player is shown)
+
+	    //var tocList = document.createElement("div");
+	    //tocList.setAttribute("style","display: block");
+
+	    var tocList  = document.getElementById("toclist");
+
+	    for (i=0; i<trList.length; i++) {
+	      var tr = trList.item(i);
+	      var tdList = tr.getElementsByTagName("td");
+	      var tdText = tdList.item(1);
+
+	      // alert("tdText = " + tdText.innerHTML);
+
+	      var tocEntry = document.createElement("div");
+	      tocEntry.style.display = "none";
+
+	      tocEntry.innerHTML = tdText.innerHTML;
+
+	      //tocEntry.appendChild(tdText);
+
+	      tocList.appendChild(tocEntry);
+	    }
+	
+
+	    // delay replace until here so toclist can access trList
+	    // in IE, doing replace earlier means trList becomes empty
+	    newTocLoc.parentNode.replaceChild(tablePack,newTocLoc);    
+
+	}
+	else {
+	  var mess = "Warning: Didn't find TOC table where expected in DOM";
+	  mess += "\n Found <" + tabToc.nodeName + ">instead of <table>";
+	  mess += "\n Unable to manipulate: " + tabToc.nodeValue;
+ 
+	  alert(mess);
+	}
+
+}
+
+
+    var flowplayervisible = 1;
+    var storedFlowplayerHeight = null;
+
+    function flowplayershow() 
+     {
+        if (flowplayervisible) return; // already visible
+
+        divTOCtableElem = document.getElementById("toctable");
+	divTOCtableElem.style.display = "none";
+
+        divTOCnextprevElem = document.getElementById("tocnextprev");
+	divTOCnextprevElem.style.display = "block";
+
+        var divFlowplayerElem = document.getElementById("FlowPlayerDiv");
+	divFlowplayerElem.style.visibility = "visible";
+
+	if (storedFlowplayerHeight != null) {
+	    divFlowplayerElem.style.height = storedFlowplayerHeight;
+        }
+
+	var flowPlayer = document.getElementById("FlowPlayer");
+
+	if (flowPlayer.DoPlay) {
+	    flowPlayer.DoPlay();
+	}
+
+        flowplayervisible = 1;
+      }
+
+    function flowplayerhide() 
+     {
+        if (!flowplayervisible) return; // already hidden
+
+
+        divTOCnextprevElem = document.getElementById("tocnextprev");
+	divTOCnextprevElem.style.display = "none";
+
+        var divFlowplayerElem = document.getElementById("FlowPlayerDiv");
+
+	if (parseInt(divFlowplayerElem.style.height) != "0") {
+	    storedFlowplayerHeight = divFlowplayerElem.style.height;
+	}
+	divFlowplayerElem.style.height = "0px";
+	divFlowplayerElem.style.visibility = "hidden";
+
+        divTOCtableElem = document.getElementById("toctable");
+	divTOCtableElem.style.display = "block";
+
+        var flowPlayer = document.getElementById("FlowPlayer");
+
+	if (flowPlayer.Pause) {
+	    flowPlayer.Pause();
+	}
+
+        flowplayervisible = 0;
+      }
+
+    var storedseek;
+    var delayedSafetyLimit = 0;
+
+    function videoplayerseekDelayed() 
+     {
+          var flowPlayer = document.getElementById("FlowPlayer");
+
+          if (flowPlayer.Seek) {
+	     flowPlayer.Pause();
+	     flowPlayer.Seek(storedseek);
+	     flowPlayer.DoPlay()
+          }
+	  else {
+	     if (delayedSafetyLimit<10) {
+	       delayedSafetyLimit++;
+	       setTimeout("videoplayerseekDelayed()",2000);
+             }
+	     else {
+	       alert("Failed to start at seeked position " + storedseek);
+	     }
+	  }
+
+      }
+
+
+    function videoplayerseek(hh,mm,ss) 
+     {
+	  flowplayershow();
+
+          storedseek = hh*3600 + mm*60 + ss -2;
+
+          var flowPlayer = document.getElementById("FlowPlayer");
+
+          if (flowPlayer.Seek) {
+	      videoplayerseekDelayed();
+          }
+	  else {
+	     delayedSafetyLimit = 0;
+	     setTimeout("videoplayerseekDelayed()",7000);
+	  }
+
+      }
+
+    function audioplayerseek(hh,mm,ss) 
+     {
+          storedseek = hh*3600 + mm*60 + ss -2;
+
+          var flowPlayer = document.getElementById("FlowPlayer");
+
+          if (flowPlayer.Seek) {
+	      videoplayerseekDelayed();
+          }
+	  else {
+	     delayedSafetyLimit = 0;
+	     setTimeout("videoplayerseekDelayed()",7000);
+	  }
+
+      }
+
+
+      function onCuePoint(cuePoint) 
+      {
+           if (cuePoint.type != "event") { return; }
+
+	  var tocList = document.getElementById("toclist");
+
+	  var tocEntries = tocList.getElementsByTagName("div");
+	  var parameters = cuePoint.parameters;
+	  var secNum = cuePoint.parameters.sectionnum;
+
+	  var tocNum = secNum-1;
+
+	  tocLen = tocEntries.length;
+
+	  var i;
+	  for (i=0; i<tocLen; i++)
+	  {
+	        var tocItem = tocEntries.item(i);
+
+	        if (i==tocNum-1) {
+		  var prevImg = document.getElementById("tocless");
+		  prevImg.setAttribute("title",tocItem.innerHTML);
+		}
+
+
+		if (i!=tocNum) {
+	          tocItem.style.display = "none";
+		}
+		else {
+	          tocItem.style.display = "block";
+
+		  // load in matching document-section text
+		  var url = document.location.toString();
+
+		  var nexturl = url;
+		  var nextSecNum = tocNum + 1;
+
+		  var doccutoff = url.lastIndexOf("&d=");
+		  var dotcutoff = url.lastIndexOf(".");
+
+		  if (dotcutoff>doccutoff) {
+		    nexturl = url.substring(0,dotcutoff);
+		  }
+
+		  nexturl = nexturl + "." + nextSecNum + "&onlytext=1";
+		  //alert("nexturl = " + nexturl);
+
+		  htmlLoad(nexturl,"ajaxtext");
+
+		}
+
+	        if (i==tocNum+1) {
+		  var moreImg = document.getElementById("tocmore");
+		  moreImg.setAttribute("title",tocItem.innerHTML);
+		}
+
+	  }
+
+
+      }
+
+
+
+
+  function htmlLoad(url,locid)
+  {
+    var xmlHttp;
+    try {
+      // Firefox, Opera 8.0+, Safari
+      xmlHttp=new XMLHttpRequest();
+    }
+    catch (e) {
+      // Internet Explorer
+      try {
+        xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
+      }
+      catch (e) {
+        try {
+          xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
+        }
+        catch (e) {
+          alert("Your browser does not support AJAX!");
+          return false;
+        }
+      }
+    }
+
+    xmlHttp.onreadystatechange=function() {
+      if(xmlHttp.readyState==4) {
+        var locelem = document.getElementById(locid);
+        
+        locelem.innerHTML = xmlHttp.responseText;
+      }
+    }
+
+    xmlHttp.open("GET",url,true);
+    xmlHttp.send(null);
+  }
+
+  
+  
+  
+  function displayDateTimeLocale(datetimebroadcasted) 
+	{
+	 var year = datetimebroadcasted.substr(0,4);
+	 var month = datetimebroadcasted.substr(4,2);
+	 var day = datetimebroadcasted.substr(6,2);
+	 var hours = datetimebroadcasted.substr(8,2);
+	 var minutes = datetimebroadcasted.substr(10,2);
+	 var seconds = datetimebroadcasted.substr(12,2);
+	 var date = new Date(year, month*1-1, day, hours, minutes, seconds)
+	 document.write(date.toLocaleString());
+	}
+	
+	function displayRemainingDaysToKeep(datetimebroadcasted,daysToKeep)
+	{
+	 var oneDayInMs = 1000*60*60*24;
+	 var year = datetimebroadcasted.substr(0,4);
+	 var month = datetimebroadcasted.substr(4,2);
+	 var day = datetimebroadcasted.substr(6,2);
+	 var displayString = "";
+	 var importedDate = new Date(year, month*1-1, day);
+	 var nowDate = new Date();
+	 var endDate = new Date(year, month*1-1, day*1+daysToKeep);
+	 var daysLeft = Math.ceil((endDate.getTime()-nowDate.getTime())/(oneDayInMs));
+	 
+	 if (daysLeft >= 1)
+		{ displayString = "This video has " + daysLeft + " day(s) remaining before expiration."; }
+	 else
+		{ displayString = "This video has expired, it will be deleted very soon."; }
+	 
+	 document.write(displayString);
+	}
Index: /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/web/script/replayer.js
===================================================================
--- /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/web/script/replayer.js	(revision 24799)
+++ /main/tags/2.85/gs2-extensions/video-and-audio/trunk/src/web/script/replayer.js	(revision 24799)
@@ -0,0 +1,1309 @@
+/*!
+ * Replayme Player v1.5.0
+ * Based on JQuery UI v1.8.4
+ * 
+ *
+ * Copyright 2010, Maxime Roüast
+ * Released under the GPL 2 License.
+ *
+ */
+
+
+var relPosTimer_is_on=0;
+var relpos;
+var user_is_dragging=0;
+var checkStatusTimer;
+var checkStatusTimer_is_on=0;
+var checkVideoSizeTimer;
+var previousHeight=0;
+var previousWidth=0;
+var vlc;
+
+
+//Used for the look and feel of the player
+function checkStatus()
+{
+	if (!checkStatusTimer_is_on)
+		{
+			checkStatusTimer_is_on=1;
+		
+			if(vlc.subtitle.count < 1)
+			{
+				$( "#subtitles" ).button( "option", "disabled", true );
+			}
+			else if (vlc.subtitle.count > 0)
+			{
+				$( "#subtitles" ).button( "option", "disabled", false );
+				$( "#subtitles" ).button( "option", "label", "Subtitles: " + vlc.subtitle.description(vlc.subtitle.track));
+			}
+			
+			
+			//For the audio tracks we only enable the button if there is more than two tracks (in vlc world disabled count for one track)
+			if(vlc.audio.count < 3)
+			{
+				$( "#audiotracks" ).button( "option", "disabled", true );
+				$( "#audiotracks" ).button( "option", "label", vlc.audio.description(vlc.audio.track));
+			}
+			else if (vlc.audio.count > 2)
+			{
+				$( "#audiotracks" ).button( "option", "disabled", false );
+				$( "#audiotracks" ).button( "option", "label", vlc.audio.description(vlc.audio.track));
+			}
+			
+			
+			if (vlc.input.state == 0) {
+				// current media has stopped
+				//onStop();
+				}
+			else if (vlc.input.state == 1) {
+				// current media is connecting
+				onOpening();
+				}
+			else if (vlc.input.state == 2) {
+				// current media is buffering data
+				onBuffering();
+				}
+			else if (vlc.input.state == 3) {
+				// current media is now playing
+				onPlaying();
+				}
+			else if (vlc.input.state == 4) {
+				// current media is now paused
+				//onPaused();
+				}
+			else if (vlc.input.state == 5) {
+				// current media is stopping
+				//onStopping();
+				}
+			else if (vlc.input.state == 6) {
+				// current media has finished playback
+				onEnd();
+				}
+
+			checkStatusTimer=setTimeout(function(){checkStatus()},5000);
+		}
+};
+
+function onOpening()
+{
+	$('#play').button('option', {
+		label: 'pause',
+		icons: {
+			primary: 'ui-icon-pause'
+		}
+	});
+	document.getElementById("status").innerHTML = "&nbsp;&nbsp;<img src='" + bufferImgURL + "'>&nbsp;Connecting...";
+}
+
+function onBuffering()
+{
+	$('#play').button('option', {
+		label: 'pause',
+		icons: {
+			primary: 'ui-icon-pause'
+		}
+	});
+	document.getElementById("status").innerHTML = "&nbsp;&nbsp;<img src='" + bufferImgURL + "'>&nbsp;Buffering...";
+}
+
+function onPlaying()
+{
+	$('#play').button('option', {
+		label: 'pause',
+		icons: {
+			primary: 'ui-icon-pause'
+		}
+	});
+	document.getElementById("status").innerHTML = "";
+}
+
+function onEnd()
+{
+	stop();
+	$('#play').button('option', {
+		label: 'play',
+		icons: {
+			primary: 'ui-icon-play'
+		}
+	});
+	$( "#subtitles" ).button( "option", "disabled", true );
+	$( "#audiotracks" ).button( "option", "disabled", true);
+}
+
+function prepare(mrl)
+{
+//Wait for the player to be initialized before doing anything
+vlc = document.getElementById("vlc");
+var safeMRL = encodeURI(mrl);
+setTimeout(function(){vlc.playlist.add(safeMRL)},350);
+setTimeout(function(){play()},500);
+setTimeout(function(){checkStatus()},1000);
+};
+
+function play()
+{
+	vlc.playlist.play();
+	vlc.video.deinterlace.enable("yadif");
+	relPosTimer_is_on=1;
+	showRelPos();
+
+	if (!checkStatusTimer_is_on)
+	{
+		setTimeout(function(){checkStatus()},1000);
+	}
+};
+
+function showRelPos()
+{
+	if (relPosTimer_is_on=1)
+	{
+		if (vlc.input.position>=0 && vlc.input.position<=1 && user_is_dragging==0)
+		{
+			$('#slider').slider( "option", "value", vlc.input.position );
+		}
+		relpos=setTimeout(function(){showRelPos()},250);
+	}
+};
+
+function stop()
+{
+	clearTimeout(relpos);
+	clearTimeout(checkStatusTimer);
+	checkStatusTimer_is_on=0;
+	relPosTimer_is_on=0;
+	vlc.playlist.stop();
+	vlc.subtitle.track = 0;
+	$('#slider').slider( "option", "value", 0 );
+	$( "#subtitles" ).button( "option", "label", "Subtitles");
+	$( "#subtitles" ).button( "option", "disabled", true );
+	$( "#audiotracks" ).button( "option", "label", "Audio Track(s)");
+	$( "#audiotracks" ).button( "option", "disabled", true);
+};
+
+function togglePause()
+{
+	vlc.playlist.togglePause();
+};
+
+function toggleMute()
+{
+    vlc.audio.toggleMute();
+};
+ 
+function getBrowserWidth()
+{
+    xWidth = null;
+    if(window.screen != null)
+      xWidth = window.screen.availWidth;
+ 
+    if(window.innerWidth != null)
+      xWidth = window.innerWidth;
+ 
+    if(document.body != null) {
+		if ((typeof document.compatMode != "undefined")
+		  && (document.compatMode == "CSS1Compat")) {
+			// in Strict mode
+			xWidth =  document.documentElement.clientWidth;
+		}
+		else {
+			// in Quirks mode
+			xWidth = document.body.clientWidth;
+		}
+	}
+	
+    return xWidth;
+ };
+ 
+function getBrowserHeight() {
+  xHeight = null;
+  if(window.screen != null)
+    xHeight = window.screen.availHeight;
+ 
+  if(window.innerHeight != null)
+    xHeight =   window.innerHeight;
+ 
+  if(document.body != null){
+		if ((typeof document.compatMode != "undefined")
+		  && (document.compatMode == "CSS1Compat")) {
+			// in Strict mode
+			xHeight =  document.documentElement.clientHeight;
+		}
+		else {
+			// in Quirks mode
+			xHeight = document.body.clientHeight;
+		}
+	}
+  return xHeight;
+};
+
+function setFullscreenSize()
+{
+	var height = getBrowserHeight() - 8;
+	var width = getBrowserWidth() - 8;
+	$( "#replaymePlayer" ).dialog( "option", "position", ['left','top'] );
+	$( "#replaymePlayer" ).dialog( "option", "height", height );
+	$( "#replaymePlayer" ).dialog( "option", "width", width );
+	setPlayerSize();
+	checkVideoSizeTimer=setTimeout(function(){setFullscreenSize()},1000);
+}
+
+function toggleFullscreen()
+{
+	if (vlc.input.state == 3)
+	{
+		vlc.video.toggleFullscreen();
+		
+		if (vlc.video.fullscreen == true)
+		{
+			previousHeight = $( "#replaymePlayer" ).dialog( "option", "height" );
+			previousWidth = $( "#replaymePlayer" ).dialog( "option", "width" );
+			setFullscreenSize();
+		}
+		else if (vlc.video.fullscreen == false)
+		{
+			clearTimeout(checkVideoSizeTimer);
+			$( "#replaymePlayer" ).dialog( "option", "height", previousHeight );
+			$( "#replaymePlayer" ).dialog( "option", "width", previousWidth );
+			setPlayerSize();
+			$( "#replaymePlayer" ).dialog( "option", "position", 'center' );
+		}
+	}
+	else
+	{
+		alert("You can switch between fullscreen and windowed mode only when playing the video.");
+	}
+};
+
+function changeSubtitles()
+{
+   if (vlc.subtitle.track == vlc.subtitle.count - 1)
+   {
+		vlc.subtitle.track = 0;
+   }
+   else
+   {
+		vlc.subtitle.track += 1;
+   }
+	$( "#subtitles" ).button( "option", "label", "Subtitles: " + vlc.subtitle.description(vlc.subtitle.track));
+};
+
+function changeAudioTrack()
+{
+   if (vlc.audio.track == vlc.audio.count - 1)
+   {
+		vlc.audio.track = 1;
+   }
+   else
+   {
+		vlc.audio.track += 1;
+   }
+	$( "#audiotracks" ).button( "option", "label", vlc.audio.description(vlc.audio.track));
+};
+
+function seek()
+{
+	vlc.input.position = $('#slider').slider( "option", "value" );
+	user_is_dragging=0;
+};
+
+function setPlayerSize()
+{
+	var width = 0, height = 0;
+	
+	width = $( "#replaymePlayer" ).dialog( "option", "width" );
+	height = $( "#replaymePlayer" ).dialog( "option", "height" );
+	width = width - 25;
+	height = height - 150;
+
+	if (document.getElementById("vlc") != null)
+	{
+	document.getElementById("vlc").style.height = height + "px";
+	document.getElementById("vlc").style.width = width + "px";
+	}
+};
+
+//JQuery Stuff
+$(function() {
+
+//Section taken from JQuery UI 1.8.4 and adapted to properly show dialog over VLC plugin in Firefox
+//it actually disable the rounded corners for that window, to use it use "mydialog" instead of "dialog"
+var uiMyDialogClasses =
+	'ui-dialog ' +
+	'ui-widget ' +
+	'ui-widget-content ';
+
+$.widget("ui.mydialog", {
+	options: {
+		autoOpen: true,
+		buttons: {},
+		closeOnEscape: true,
+		closeText: 'close',
+		dialogClass: '',
+		draggable: true,
+		hide: null,
+		height: 'auto',
+		maxHeight: false,
+		maxWidth: false,
+		minHeight: 150,
+		minWidth: 150,
+		modal: false,
+		position: {
+			my: 'center',
+			at: 'center',
+			of: window,
+			collision: 'fit',
+			// ensure that the titlebar is never outside the document
+			using: function(pos) {
+				var topOffset = $(this).css(pos).offset().top;
+				if (topOffset < 0) {
+					$(this).css('top', pos.top - topOffset);
+				}
+			}
+		},
+		resizable: true,
+		show: null,
+		stack: true,
+		title: '',
+		width: 300,
+		zIndex: 1000
+	},
+
+	_create: function() {
+		this.originalTitle = this.element.attr('title');
+		// #5742 - .attr() might return a DOMElement
+		if ( typeof this.originalTitle !== "string" ) {
+			this.originalTitle = "";
+		}
+
+		var self = this,
+			options = self.options,
+
+			title = options.title || self.originalTitle || '&#160;',
+			titleId = $.ui.mydialog.getTitleId(self.element),
+
+			uiMyDialog = (self.uiMyDialog = $('<div></div>'))
+				.appendTo(document.body)
+				.hide()
+				.addClass(uiMyDialogClasses + options.dialogClass)
+				.css({
+					zIndex: options.zIndex
+				})
+				// setting tabIndex makes the div focusable
+				// setting outline to 0 prevents a border on focus in Mozilla
+				.attr('tabIndex', -1).css('outline', 0).keydown(function(event) {
+					if (options.closeOnEscape && event.keyCode &&
+						event.keyCode === $.ui.keyCode.ESCAPE) {
+						
+						self.close(event);
+						event.preventDefault();
+					}
+				})
+				.attr({
+					role: 'dialog',
+					'aria-labelledby': titleId
+				})
+				.mousedown(function(event) {
+					self.moveToTop(false, event);
+				}),
+
+			uiMyDialogContent = self.element
+				.show()
+				.removeAttr('title')
+				.addClass(
+					'ui-dialog-content ' +
+					'ui-widget-content')
+				.appendTo(uiMyDialog),
+
+			uiMyDialogTitlebar = (self.uiMyDialogTitlebar = $('<div></div>'))
+				.addClass(
+					'ui-dialog-titlebar ' +
+					'ui-widget-header ' +
+					'ui-helper-clearfix'
+				)
+				.prependTo(uiMyDialog),
+
+			uiMyDialogTitlebarClose = $('<a href="#"></a>')
+				.addClass(
+					'ui-dialog-titlebar-close '
+				)
+				.attr('role', 'button')
+				.hover(
+					function() {
+						uiMyDialogTitlebarClose.addClass('ui-state-hover');
+					},
+					function() {
+						uiMyDialogTitlebarClose.removeClass('ui-state-hover');
+					}
+				)
+				.focus(function() {
+					uiMyDialogTitlebarClose.addClass('ui-state-focus');
+				})
+				.blur(function() {
+					uiMyDialogTitlebarClose.removeClass('ui-state-focus');
+				})
+				.click(function(event) {
+					self.close(event);
+					return false;
+				})
+				.appendTo(uiMyDialogTitlebar),
+
+			uiMyDialogTitlebarCloseText = (self.uiMyDialogTitlebarCloseText = $('<span></span>'))
+				.addClass(
+					'ui-icon ' +
+					'ui-icon-closethick'
+				)
+				.text(options.closeText)
+				.appendTo(uiMyDialogTitlebarClose),
+
+			uiMyDialogTitle = $('<span></span>')
+				.addClass('ui-dialog-title')
+				.attr('id', titleId)
+				.html(title)
+				.prependTo(uiMyDialogTitlebar);
+
+		//handling of deprecated beforeclose (vs beforeClose) option
+		//Ticket #4669 http://dev.jqueryui.com/ticket/4669
+		//TODO: remove in 1.9pre
+		if ($.isFunction(options.beforeclose) && !$.isFunction(options.beforeClose)) {
+			options.beforeClose = options.beforeclose;
+		}
+
+		uiMyDialogTitlebar.find("*").add(uiMyDialogTitlebar).disableSelection();
+
+		if (options.draggable && $.fn.draggable) {
+			self._makeDraggable();
+		}
+		if (options.resizable && $.fn.resizable) {
+			self._makeResizable();
+		}
+
+		self._createButtons(options.buttons);
+		self._isOpen = false;
+
+		if ($.fn.bgiframe) {
+			uiMyDialog.bgiframe();
+		}
+	},
+
+	_init: function() {
+		if ( this.options.autoOpen ) {
+			this.open();
+		}
+	},
+
+	destroy: function() {
+		var self = this;
+		
+		if (self.overlay) {
+			self.overlay.destroy();
+		}
+		self.uiMyDialog.hide();
+		self.element
+			.unbind('.dialog')
+			.removeData('dialog')
+			.removeClass('ui-dialog-content ui-widget-content')
+			.hide().appendTo('body');
+		self.uiMyDialog.remove();
+
+		if (self.originalTitle) {
+			self.element.attr('title', self.originalTitle);
+		}
+
+		return self;
+	},
+
+	widget: function() {
+		return this.uiMyDialog;
+	},
+
+	close: function(event) {
+		var self = this,
+			maxZ;
+		
+		if (false === self._trigger('beforeClose', event)) {
+			return;
+		}
+
+		if (self.overlay) {
+			self.overlay.destroy();
+		}
+		self.uiMyDialog.unbind('keypress.ui-dialog');
+
+		self._isOpen = false;
+
+		if (self.options.hide) {
+			self.uiMyDialog.hide(self.options.hide, function() {
+				self._trigger('close', event);
+			});
+		} else {
+			self.uiMyDialog.hide();
+			self._trigger('close', event);
+		}
+
+		$.ui.mydialog.overlay.resize();
+
+		// adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
+		if (self.options.modal) {
+			maxZ = 0;
+			$('.ui-dialog').each(function() {
+				if (this !== self.uiMyDialog[0]) {
+					maxZ = Math.max(maxZ, $(this).css('z-index'));
+				}
+			});
+			$.ui.mydialog.maxZ = maxZ;
+		}
+
+		return self;
+	},
+
+	isOpen: function() {
+		return this._isOpen;
+	},
+
+	// the force parameter allows us to move modal dialogs to their correct
+	// position on open
+	moveToTop: function(force, event) {
+		var self = this,
+			options = self.options,
+			saveScroll;
+
+		if ((options.modal && !force) ||
+			(!options.stack && !options.modal)) {
+			return self._trigger('focus', event);
+		}
+
+		if (options.zIndex > $.ui.mydialog.maxZ) {
+			$.ui.mydialog.maxZ = options.zIndex;
+		}
+		if (self.overlay) {
+			$.ui.mydialog.maxZ += 1;
+			self.overlay.$el.css('z-index', $.ui.mydialog.overlay.maxZ = $.ui.mydialog.maxZ);
+		}
+
+		//Save and then restore scroll since Opera 9.5+ resets when parent z-Index is changed.
+		//  http://ui.jquery.com/bugs/ticket/3193
+		saveScroll = { scrollTop: self.element.attr('scrollTop'), scrollLeft: self.element.attr('scrollLeft') };
+		$.ui.mydialog.maxZ += 1;
+		self.uiMyDialog.css('z-index', $.ui.mydialog.maxZ);
+		self.element.attr(saveScroll);
+		self._trigger('focus', event);
+
+		return self;
+	},
+
+	open: function() {
+		if (this._isOpen) { return; }
+
+		var self = this,
+			options = self.options,
+			uiMyDialog = self.uiMyDialog;
+
+		self.overlay = options.modal ? new $.ui.mydialog.overlay(self) : null;
+		if (uiMyDialog.next().length) {
+			uiMyDialog.appendTo('body');
+		}
+		self._size();
+		self._position(options.position);
+		uiMyDialog.show(options.show);
+		self.moveToTop(true);
+
+		// prevent tabbing out of modal dialogs
+		if (options.modal) {
+			uiMyDialog.bind('keypress.ui-dialog', function(event) {
+				if (event.keyCode !== $.ui.keyCode.TAB) {
+					return;
+				}
+
+				var tabbables = $(':tabbable', this),
+					first = tabbables.filter(':first'),
+					last  = tabbables.filter(':last');
+
+				if (event.target === last[0] && !event.shiftKey) {
+					first.focus(1);
+					return false;
+				} else if (event.target === first[0] && event.shiftKey) {
+					last.focus(1);
+					return false;
+				}
+			});
+		}
+
+		// set focus to the first tabbable element in the content area or the first button
+		// if there are no tabbable elements, set focus on the dialog itself
+		$(self.element.find(':tabbable').get().concat(
+			uiMyDialog.find('.ui-dialog-buttonpane :tabbable').get().concat(
+				uiMyDialog.get()))).eq(0).focus();
+
+		self._trigger('open');
+		self._isOpen = true;
+
+		return self;
+	},
+
+	_createButtons: function(buttons) {
+		var self = this,
+			hasButtons = false,
+			uiMyDialogButtonPane = $('<div></div>')
+				.addClass(
+					'ui-dialog-buttonpane ' +
+					'ui-widget-content ' +
+					'ui-helper-clearfix'
+				),
+			uiButtonSet = $( "<div></div>" )
+				.addClass( "ui-dialog-buttonset" )
+				.appendTo( uiMyDialogButtonPane );
+
+		// if we already have a button pane, remove it
+		self.uiMyDialog.find('.ui-dialog-buttonpane').remove();
+
+		if (typeof buttons === 'object' && buttons !== null) {
+			$.each(buttons, function() {
+				return !(hasButtons = true);
+			});
+		}
+		if (hasButtons) {
+			$.each(buttons, function(name, fn) {
+				var button = $('<button type="button"></button>')
+					.text(name)
+					.click(function() { fn.apply(self.element[0], arguments); })
+					.appendTo(uiButtonSet);
+				if ($.fn.button) {
+					button.button();
+				}
+			});
+			uiMyDialogButtonPane.appendTo(self.uiMyDialog);
+		}
+	},
+
+	_makeDraggable: function() {
+		var self = this,
+			options = self.options,
+			doc = $(document),
+			heightBeforeDrag;
+
+		function filteredUi(ui) {
+			return {
+				position: ui.position,
+				offset: ui.offset
+			};
+		}
+
+		self.uiMyDialog.draggable({
+			cancel: '.ui-dialog-content, .ui-dialog-titlebar-close',
+			handle: '.ui-dialog-titlebar',
+			containment: 'document',
+			start: function(event, ui) {
+				heightBeforeDrag = options.height === "auto" ? "auto" : $(this).height();
+				$(this).height($(this).height()).addClass("ui-dialog-dragging");
+				self._trigger('dragStart', event, filteredUi(ui));
+			},
+			drag: function(event, ui) {
+				self._trigger('drag', event, filteredUi(ui));
+			},
+			stop: function(event, ui) {
+				options.position = [ui.position.left - doc.scrollLeft(),
+					ui.position.top - doc.scrollTop()];
+				$(this).removeClass("ui-dialog-dragging").height(heightBeforeDrag);
+				self._trigger('dragStop', event, filteredUi(ui));
+				$.ui.mydialog.overlay.resize();
+			}
+		});
+	},
+
+	_makeResizable: function(handles) {
+		handles = (handles === undefined ? this.options.resizable : handles);
+		var self = this,
+			options = self.options,
+			// .ui-resizable has position: relative defined in the stylesheet
+			// but dialogs have to use absolute or fixed positioning
+			position = self.uiMyDialog.css('position'),
+			resizeHandles = (typeof handles === 'string' ?
+				handles	:
+				'n,e,s,w,se,sw,ne,nw'
+			);
+
+		function filteredUi(ui) {
+			return {
+				originalPosition: ui.originalPosition,
+				originalSize: ui.originalSize,
+				position: ui.position,
+				size: ui.size
+			};
+		}
+
+		self.uiMyDialog.resizable({
+			cancel: '.ui-dialog-content',
+			containment: 'document',
+			alsoResize: self.element,
+			maxWidth: options.maxWidth,
+			maxHeight: options.maxHeight,
+			minWidth: options.minWidth,
+			minHeight: self._minHeight(),
+			handles: resizeHandles,
+			start: function(event, ui) {
+				$(this).addClass("ui-dialog-resizing");
+				self._trigger('resizeStart', event, filteredUi(ui));
+			},
+			resize: function(event, ui) {
+				self._trigger('resize', event, filteredUi(ui));
+			},
+			stop: function(event, ui) {
+				$(this).removeClass("ui-dialog-resizing");
+				options.height = $(this).height();
+				options.width = $(this).width();
+				self._trigger('resizeStop', event, filteredUi(ui));
+				$.ui.mydialog.overlay.resize();
+			}
+		})
+		.css('position', position)
+		.find('.ui-resizable-se').addClass('ui-icon ui-icon-grip-diagonal-se');
+	},
+
+	_minHeight: function() {
+		var options = this.options;
+
+		if (options.height === 'auto') {
+			return options.minHeight;
+		} else {
+			return Math.min(options.minHeight, options.height);
+		}
+	},
+
+	_position: function(position) {
+		var myAt = [],
+			offset = [0, 0],
+			isVisible;
+
+		if (position) {
+			// deep extending converts arrays to objects in jQuery <= 1.3.2 :-(
+	//		if (typeof position == 'string' || $.isArray(position)) {
+	//			myAt = $.isArray(position) ? position : position.split(' ');
+
+			if (typeof position === 'string' || (typeof position === 'object' && '0' in position)) {
+				myAt = position.split ? position.split(' ') : [position[0], position[1]];
+				if (myAt.length === 1) {
+					myAt[1] = myAt[0];
+				}
+
+				$.each(['left', 'top'], function(i, offsetPosition) {
+					if (+myAt[i] === myAt[i]) {
+						offset[i] = myAt[i];
+						myAt[i] = offsetPosition;
+					}
+				});
+
+				position = {
+					my: myAt.join(" "),
+					at: myAt.join(" "),
+					offset: offset.join(" ")
+				};
+			} 
+
+			position = $.extend({}, $.ui.mydialog.prototype.options.position, position);
+		} else {
+			position = $.ui.mydialog.prototype.options.position;
+		}
+
+		// need to show the dialog to get the actual offset in the position plugin
+		isVisible = this.uiMyDialog.is(':visible');
+		if (!isVisible) {
+			this.uiMyDialog.show();
+		}
+		this.uiMyDialog
+			// workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781
+			.css({ top: 0, left: 0 })
+			.position(position);
+		if (!isVisible) {
+			this.uiMyDialog.hide();
+		}
+	},
+
+	_setOption: function(key, value){
+		var self = this,
+			uiMyDialog = self.uiMyDialog,
+			isResizable = uiMyDialog.is(':data(resizable)'),
+			resize = false;
+
+		switch (key) {
+			//handling of deprecated beforeclose (vs beforeClose) option
+			//Ticket #4669 http://dev.jqueryui.com/ticket/4669
+			//TODO: remove in 1.9pre
+			case "beforeclose":
+				key = "beforeClose";
+				break;
+			case "buttons":
+				self._createButtons(value);
+				resize = true;
+				break;
+			case "closeText":
+				// convert whatever was passed in to a string, for text() to not throw up
+				self.uiMyDialogTitlebarCloseText.text("" + value);
+				break;
+			case "dialogClass":
+				uiMyDialog
+					.removeClass(self.options.dialogClass)
+					.addClass(uiMyDialogClasses + value);
+				break;
+			case "disabled":
+				if (value) {
+					uiMyDialog.addClass('ui-dialog-disabled');
+				} else {
+					uiMyDialog.removeClass('ui-dialog-disabled');
+				}
+				break;
+			case "draggable":
+				if (value) {
+					self._makeDraggable();
+				} else {
+					uiMyDialog.draggable('destroy');
+				}
+				break;
+			case "height":
+				resize = true;
+				break;
+			case "maxHeight":
+				if (isResizable) {
+					uiMyDialog.resizable('option', 'maxHeight', value);
+				}
+				resize = true;
+				break;
+			case "maxWidth":
+				if (isResizable) {
+					uiMyDialog.resizable('option', 'maxWidth', value);
+				}
+				resize = true;
+				break;
+			case "minHeight":
+				if (isResizable) {
+					uiMyDialog.resizable('option', 'minHeight', value);
+				}
+				resize = true;
+				break;
+			case "minWidth":
+				if (isResizable) {
+					uiMyDialog.resizable('option', 'minWidth', value);
+				}
+				resize = true;
+				break;
+			case "position":
+				self._position(value);
+				break;
+			case "resizable":
+				// currently resizable, becoming non-resizable
+				if (isResizable && !value) {
+					uiMyDialog.resizable('destroy');
+				}
+
+				// currently resizable, changing handles
+				if (isResizable && typeof value === 'string') {
+					uiMyDialog.resizable('option', 'handles', value);
+				}
+
+				// currently non-resizable, becoming resizable
+				if (!isResizable && value !== false) {
+					self._makeResizable(value);
+				}
+				break;
+			case "title":
+				// convert whatever was passed in o a string, for html() to not throw up
+				$(".ui-dialog-title", self.uiMyDialogTitlebar).html("" + (value || '&#160;'));
+				break;
+			case "width":
+				resize = true;
+				break;
+		}
+
+		$.Widget.prototype._setOption.apply(self, arguments);
+		if (resize) {
+			self._size();
+		}
+	},
+
+	_size: function() {
+		/* If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
+		 * divs will both have width and height set, so we need to reset them
+		 */
+		var options = this.options,
+			nonContentHeight;
+
+		// reset content sizing
+		// hide for non content measurement because height: 0 doesn't work in IE quirks mode (see #4350)
+		this.element.css({
+			width: 'auto',
+			minHeight: 0,
+			height: 0
+		});
+
+		if (options.minWidth > options.width) {
+			options.width = options.minWidth;
+		}
+
+		// reset wrapper sizing
+		// determine the height of all the non-content elements
+		nonContentHeight = this.uiMyDialog.css({
+				height: 'auto',
+				width: options.width
+			})
+			.height();
+
+		this.element
+			.css(options.height === 'auto' ? {
+					minHeight: Math.max(options.minHeight - nonContentHeight, 0),
+					height: 'auto'
+				} : {
+					minHeight: 0,
+					height: Math.max(options.height - nonContentHeight, 0)				
+			})
+			.show();
+
+		if (this.uiMyDialog.is(':data(resizable)')) {
+			this.uiMyDialog.resizable('option', 'minHeight', this._minHeight());
+		}
+	}
+});
+
+
+$.extend($.ui.mydialog, {
+	version: "1.8.4",
+
+	uuid: 0,
+	maxZ: 0,
+
+	getTitleId: function($el) {
+		var id = $el.attr('id');
+		if (!id) {
+			this.uuid += 1;
+			id = this.uuid;
+		}
+		return 'ui-dialog-title-' + id;
+	},
+
+	overlay: function(dialog) {
+		this.$el = $.ui.mydialog.overlay.create(dialog);
+	}
+});
+
+
+$.extend($.ui.mydialog.overlay, {
+	instances: [],
+	// reuse old instances due to IE memory leak with alpha transparency (see #5185)
+	oldInstances: [],
+	maxZ: 0,
+	events: $.map('focus,mousedown,mouseup,keydown,keypress,click'.split(','),
+		function(event) { return event + '.dialog-overlay'; }).join(' '),
+	create: function(dialog) {
+		if (this.instances.length === 0) {
+			// prevent use of anchors and inputs
+			// we use a setTimeout in case the overlay is created from an
+			// event that we're going to be cancelling (see #2804)
+			setTimeout(function() {
+				// handle $(el).dialog().dialog('close') (see #4065)
+				if ($.ui.mydialog.overlay.instances.length) {
+					$(document).bind($.ui.mydialog.overlay.events, function(event) {
+						// stop events if the z-index of the target is < the z-index of the overlay
+						return ($(event.target).zIndex() >= $.ui.mydialog.overlay.maxZ);
+					});
+				}
+			}, 1);
+
+			// allow closing by pressing the escape key
+			$(document).bind('keydown.dialog-overlay', function(event) {
+				if (dialog.options.closeOnEscape && event.keyCode &&
+					event.keyCode === $.ui.keyCode.ESCAPE) {
+					
+					dialog.close(event);
+					event.preventDefault();
+				}
+			});
+
+			// handle window resize
+			$(window).bind('resize.dialog-overlay', $.ui.mydialog.overlay.resize);
+		}
+
+		var $el = (this.oldInstances.pop() || $('<div></div>').addClass('ui-widget-overlay'))
+			.appendTo(document.body)
+			.css({
+				width: this.width(),
+				height: this.height()
+			});
+
+		if ($.fn.bgiframe) {
+			$el.bgiframe();
+		}
+
+		this.instances.push($el);
+		return $el;
+	},
+
+	destroy: function($el) {
+		this.oldInstances.push(this.instances.splice($.inArray($el, this.instances), 1)[0]);
+
+		if (this.instances.length === 0) {
+			$([document, window]).unbind('.dialog-overlay');
+		}
+
+		$el.remove();
+		
+		// adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
+		var maxZ = 0;
+		$.each(this.instances, function() {
+			maxZ = Math.max(maxZ, this.css('z-index'));
+		});
+		this.maxZ = maxZ;
+	},
+
+	height: function() {
+		var scrollHeight,
+			offsetHeight;
+		// handle IE 6
+		if ($.browser.msie && $.browser.version < 7) {
+			scrollHeight = Math.max(
+				document.documentElement.scrollHeight,
+				document.body.scrollHeight
+			);
+			offsetHeight = Math.max(
+				document.documentElement.offsetHeight,
+				document.body.offsetHeight
+			);
+
+			if (scrollHeight < offsetHeight) {
+				return $(window).height() + 'px';
+			} else {
+				return scrollHeight + 'px';
+			}
+		// handle "good" browsers
+		} else {
+			return $(document).height() + 'px';
+		}
+	},
+
+	width: function() {
+		var scrollWidth,
+			offsetWidth;
+		// handle IE 6
+		if ($.browser.msie && $.browser.version < 7) {
+			scrollWidth = Math.max(
+				document.documentElement.scrollWidth,
+				document.body.scrollWidth
+			);
+			offsetWidth = Math.max(
+				document.documentElement.offsetWidth,
+				document.body.offsetWidth
+			);
+
+			if (scrollWidth < offsetWidth) {
+				return $(window).width() + 'px';
+			} else {
+				return scrollWidth + 'px';
+			}
+		// handle "good" browsers
+		} else {
+			return $(document).width() + 'px';
+		}
+	},
+
+	resize: function() {
+		/* If the dialog is draggable and the user drags it past the
+		 * right edge of the window, the document becomes wider so we
+		 * need to stretch the overlay. If the user then drags the
+		 * dialog back to the left, the document will become narrower,
+		 * so we need to shrink the overlay to the appropriate size.
+		 * This is handled by shrinking the overlay before setting it
+		 * to the full document size.
+		 */
+		var $overlays = $([]);
+		$.each($.ui.mydialog.overlay.instances, function() {
+			$overlays = $overlays.add(this);
+		});
+
+		$overlays.css({
+			width: 0,
+			height: 0
+		}).css({
+			width: $.ui.mydialog.overlay.width(),
+			height: $.ui.mydialog.overlay.height()
+		});
+	}
+});
+
+$.extend($.ui.mydialog.overlay.prototype, {
+	destroy: function() {
+		$.ui.mydialog.overlay.destroy(this.$el);
+	}
+});
+
+						
+// Open Video Player link
+				$('#open_player_link').click(function(){
+					$('#replaymePlayer').dialog('open');
+					return false;
+				});
+
+						
+//Video Player window					
+	$("#replaymePlayer").dialog({
+			autoOpen: false,
+			height: 620,
+			width: 785,
+			modal: true,
+			beforeclose: function(event, ui) {
+												onEnd();
+												$('#mute').button({
+													label: 'mute',
+													icons: {
+													primary: 'ui-icon-volume-on'
+													}
+												});
+												$( "#subtitles" ).button( "option", "label", "Subtitles");
+												$( "#audiotracks" ).button( "option", "label", "Audio Track(s)");
+											},
+			resizeStart: function(event, ui) { 
+												document.getElementById("vlc").style.height = "70%";
+												document.getElementById("vlc").style.width = "100%";},
+			resizeStop: function(event, ui) { setPlayerSize(); }
+		});
+
+
+//Video Player info sub-window		
+	$( "#infodialog" ).mydialog({
+			autoOpen: false,
+			zIndex: 100000,
+			show: "clip",
+			hide: "clip",
+			position: 'top',
+			width: 460,
+			buttons: {
+				Ok: function() {
+					$( this ).mydialog( "close" );
+				}
+			}
+		});
+
+		
+//Hover states on the Video Player link
+	$('#open_player_link, ul#icons li').hover(
+				function() { $(this).addClass('ui-state-hover'); }, 
+				function() { $(this).removeClass('ui-state-hover'); }
+		);
+
+		
+//Player toolbar:
+		$('#play').button({
+			text: false,
+			icons: {
+				primary: 'ui-icon-play'
+			}
+		})
+		.click(function() {
+			var options;
+			if ($(this).text() == 'play') {
+			play();
+				options = {
+					label: 'pause',
+					icons: {
+						primary: 'ui-icon-pause'
+					}
+				};
+			} else {
+			togglePause();
+				options = {
+					label: 'play',
+					icons: {
+						primary: 'ui-icon-play'
+					}
+				};
+			}
+			$(this).button('option', options);
+		});
+		
+		$('#stop').button({
+			text: false,
+			icons: {
+				primary: 'ui-icon-stop'
+			}
+		})
+		.click(function() {
+			stop();
+			$('#play').button('option', {
+				label: 'play',
+				icons: {
+					primary: 'ui-icon-play'
+				}
+			});
+		});
+		
+		$('#mute').button({
+			text: false,
+			icons: {
+				primary: 'ui-icon-volume-on'
+			}
+		})
+		.click(function() {
+			var options;
+			if ($(this).text() == 'mute on') {
+			toggleMute();
+				options = {
+					label: 'mute off',
+					icons: {
+						primary: 'ui-icon-volume-on'
+					}
+				};
+			} else {
+			toggleMute();
+				options = {
+					label: 'mute on',
+					icons: {
+						primary: 'ui-icon-volume-off'
+					}
+				};
+			}
+			$(this).button('option', options);
+		});
+		
+		$('#fullscreen').button({
+			text: false,
+			icons: {
+				primary: 'ui-icon-arrow-4-diag'
+			}
+		})
+		.click(function() {
+		toggleFullscreen();
+		});
+		
+		$('#subtitles').button({
+			icons: {primary: 'ui-icon-grip-dotted-horizontal'},
+			disabled: true
+		})
+		.click(function() {
+		changeSubtitles();
+		});
+		
+		$('#audiotracks').button({
+			icons: {primary: 'ui-icon-comment'},
+			disabled: true
+		})
+		.click(function() {
+		changeAudioTrack();
+		});
+		
+		$('#info').button({
+			text: false,
+			icons: {
+				primary: 'ui-icon-info'
+			}
+		})
+		.click(function() {
+			$('#infodialog').mydialog('open');
+		});
+		
+//Seeking bar
+		$('#slider').slider({
+						start: function(event, ui) {user_is_dragging=1;},
+						stop: function(event, ui) {seek();},
+						animate: true,
+						min: 0,
+						max: 1,
+						step: 0.000125
+						});
+
+});
